ZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvLmFudGxyLWVjbGlwc2UgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4Ly5hbnRsci1lY2xpcHNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMzFiZTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4Ly5hbnRsci1lY2xpcHNlCkBAIC0wLDAgKzEsNiBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyA/PiAKKzxzZXR0aW5ncz4KKyAgPHJlc291cmNlIG5hbWU9JyoqQU5UTFItRUNMSVBTRS1QTFVHSU4qKic+CisgICAgPHByb3BlcnR5IG5hbWU9J3BsdWdpblZlcnNpb24nIHZhbHVlPScyLjcuNicgLz4KKyAgPC9yZXNvdXJjZT4KKzwvc2V0dGluZ3M+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4Ly5jcHJvamVjdCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvLmNwcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZjRhNDMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4Ly5jcHJvamVjdApAQCAtMCwwICsxLDEwMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPD9maWxlVmVyc2lvbiA0LjAuMD8+PGNwcm9qZWN0PgorCTxzdG9yYWdlTW9kdWxlIG1vZHVsZUlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5zZXR0aW5ncyI+CisJCTxjY29uZmlndXJhdGlvbiBpZD0iY2R0Lm1hbmFnZWRidWlsZC5jb25maWcuZ251LmN5Z3dpbi5leGUucmVsZWFzZS4xNzUxMTkxMDQ5Ij4KKwkJCTxzdG9yYWdlTW9kdWxlIGJ1aWxkU3lzdGVtSWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLmNvbmZpZ3VyYXRpb25EYXRhUHJvdmlkZXIiIGlkPSJjZHQubWFuYWdlZGJ1aWxkLmNvbmZpZy5nbnUuY3lnd2luLmV4ZS5yZWxlYXNlLjE3NTExOTEwNDkiIG1vZHVsZUlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5zZXR0aW5ncyIgbmFtZT0iUmVsZWFzZSI+CisJCQkJPGV4dGVybmFsU2V0dGluZ3MvPgorCQkJCTxleHRlbnNpb25zPgorCQkJCQk8ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5FTEYiIHBvaW50PSJvcmcuZWNsaXBzZS5jZHQuY29yZS5CaW5hcnlQYXJzZXIiLz4KKwkJCQkJPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuR0NDRXJyb3JQYXJzZXIiIHBvaW50PSJvcmcuZWNsaXBzZS5jZHQuY29yZS5FcnJvclBhcnNlciIvPgorCQkJCQk8ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5HQVNFcnJvclBhcnNlciIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkVycm9yUGFyc2VyIi8+CisJCQkJCTxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkdMREVycm9yUGFyc2VyIiBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuRXJyb3JQYXJzZXIiLz4KKwkJCQkJPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuR21ha2VFcnJvclBhcnNlciIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkVycm9yUGFyc2VyIi8+CisJCQkJCTxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkNXRExvY2F0b3IiIHBvaW50PSJvcmcuZWNsaXBzZS5jZHQuY29yZS5FcnJvclBhcnNlciIvPgorCQkJCTwvZXh0ZW5zaW9ucz4KKwkJCTwvc3RvcmFnZU1vZHVsZT4KKwkJCTxzdG9yYWdlTW9kdWxlIG1vZHVsZUlkPSJjZHRCdWlsZFN5c3RlbSIgdmVyc2lvbj0iNC4wLjAiPgorCQkJCTxjb25maWd1cmF0aW9uIGFydGlmYWN0TmFtZT0iYXZtIiBidWlsZEFydGVmYWN0VHlwZT0ib3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuYnVpbGRBcnRlZmFjdFR5cGUuZXhlIiBidWlsZFByb3BlcnRpZXM9Im9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLmJ1aWxkQXJ0ZWZhY3RUeXBlPW9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLmJ1aWxkQXJ0ZWZhY3RUeXBlLmV4ZSxvcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5idWlsZFR5cGU9b3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuYnVpbGRUeXBlLnJlbGVhc2UiIGNsZWFuQ29tbWFuZD0icm0gLXJmIiBkZXNjcmlwdGlvbj0iIiBlcnJvclBhcnNlcnM9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkdtYWtlRXJyb3JQYXJzZXI7b3JnLmVjbGlwc2UuY2R0LmNvcmUuQ1dETG9jYXRvcjtvcmcuZWNsaXBzZS5jZHQuY29yZS5HQ0NFcnJvclBhcnNlcjtvcmcuZWNsaXBzZS5jZHQuY29yZS5HQVNFcnJvclBhcnNlcjtvcmcuZWNsaXBzZS5jZHQuY29yZS5HTERFcnJvclBhcnNlciIgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQuY29uZmlnLmdudS5jeWd3aW4uZXhlLnJlbGVhc2UuMTc1MTE5MTA0OSIgbmFtZT0iUmVsZWFzZSIgcGFyZW50PSJjZHQubWFuYWdlZGJ1aWxkLmNvbmZpZy5nbnUuY3lnd2luLmV4ZS5yZWxlYXNlIiBwb3N0YW5ub3VuY2VidWlsZFN0ZXA9IiIgcG9zdGJ1aWxkU3RlcD0iIiBwcmVhbm5vdW5jZWJ1aWxkU3RlcD0iIiBwcmVidWlsZFN0ZXA9IiI+CisJCQkJCTxmb2xkZXJJbmZvIGlkPSJjZHQubWFuYWdlZGJ1aWxkLmNvbmZpZy5nbnUuY3lnd2luLmV4ZS5yZWxlYXNlLjE3NTExOTEwNDkuIiBuYW1lPSIvIiByZXNvdXJjZVBhdGg9IiI+CisJCQkJCQk8dG9vbENoYWluIGVycm9yUGFyc2Vycz0iIiBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sY2hhaW4uZ251LmJhc2UuODQxMTA5MTI1IiBuYW1lPSJMaW51eCBHQ0MiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbGNoYWluLmdudS5iYXNlIj4KKwkJCQkJCQk8dGFyZ2V0UGxhdGZvcm0gYXJjaExpc3Q9ImFsbCIgYmluYXJ5UGFyc2VyPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5FTEYiIGlkPSJjZHQubWFuYWdlZGJ1aWxkLnRhcmdldC5nbnUucGxhdGZvcm0uYmFzZS4xMjI4NDExODA4IiBuYW1lPSJEZWJ1ZyBQbGF0Zm9ybSIgb3NMaXN0PSJsaW51eCxocHV4LGFpeCxxbngiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudGFyZ2V0LmdudS5wbGF0Zm9ybS5iYXNlIi8+CisJCQkJCQkJPGJ1aWxkZXIgYnVpbGRQYXRoPSIke3dvcmtzcGFjZV9sb2M6L2NvbS5jZWEuYXZtfS9SZWxlYXNlIiBlcnJvclBhcnNlcnM9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkdtYWtlRXJyb3JQYXJzZXI7b3JnLmVjbGlwc2UuY2R0LmNvcmUuQ1dETG9jYXRvciIgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudGFyZ2V0LmdudS5idWlsZGVyLmJhc2UuNDUyMDQ0NTUyIiBrZWVwRW52aXJvbm1lbnRJbkJ1aWxkZmlsZT0iZmFsc2UiIG5hbWU9IkdudSBNYWtlIEJ1aWxkZXIiIHBhcmFsbGVsQnVpbGRPbj0idHJ1ZSIgcGFyYWxsZWxpemF0aW9uTnVtYmVyPSIyOCIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50YXJnZXQuZ251LmJ1aWxkZXIuYmFzZSIvPgorCQkJCQkJCTx0b29sIGlkPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmFyY2hpdmVyLmJhc2UuMjA2MjIwNzM5MiIgbmFtZT0iR0NDIEFyY2hpdmVyIiBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmFyY2hpdmVyLmJhc2UiLz4KKwkJCQkJCQk8dG9vbCBjb21tYW5kPSJnKysgLXBpcGUiIGNvbW1hbmRMaW5lUGF0dGVybj0iJHtDT01NQU5EfSAke0ZMQUdTfSAke09VVFBVVF9GTEFHfSAke09VVFBVVF9QUkVGSVh9JHtPVVRQVVR9ICR7SU5QVVRTfSIgZXJyb3JQYXJzZXJzPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5HQ0NFcnJvclBhcnNlciIgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3BwLmNvbXBpbGVyLmJhc2UuMTQ2MjQ2OTQyMiIgbmFtZT0iR0NDIEMrKyBDb21waWxlciIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcHAuY29tcGlsZXIuYmFzZSI+CisJCQkJCQkJCTxvcHRpb24gaWQ9ImdudS5jcHAuY29tcGlsZXIub3B0aW9uLm9wdGltaXphdGlvbi5sZXZlbC4xMDgxNTA5NzIzIiBuYW1lPSJPcHRpbWl6YXRpb24gTGV2ZWwiIHN1cGVyQ2xhc3M9ImdudS5jcHAuY29tcGlsZXIub3B0aW9uLm9wdGltaXphdGlvbi5sZXZlbCIgdXNlQnlTY2FubmVyRGlzY292ZXJ5PSJmYWxzZSIgdmFsdWU9ImdudS5jcHAuY29tcGlsZXIub3B0aW1pemF0aW9uLmxldmVsLm5vbmUiIHZhbHVlVHlwZT0iZW51bWVyYXRlZCIvPgorCQkJCQkJCQk8b3B0aW9uIGlkPSJnbnUuY3BwLmNvbXBpbGVyLm9wdGlvbi5kZWJ1Z2dpbmcubGV2ZWwuMTk0MTk4ODk4NyIgbmFtZT0iRGVidWcgTGV2ZWwiIHN1cGVyQ2xhc3M9ImdudS5jcHAuY29tcGlsZXIub3B0aW9uLmRlYnVnZ2luZy5sZXZlbCIgdXNlQnlTY2FubmVyRGlzY292ZXJ5PSJmYWxzZSIgdmFsdWU9ImdudS5jcHAuY29tcGlsZXIuZGVidWdnaW5nLmxldmVsLm5vbmUiIHZhbHVlVHlwZT0iZW51bWVyYXRlZCIvPgorCQkJCQkJCQk8b3B0aW9uIGlkPSJnbnUuY3BwLmNvbXBpbGVyLm9wdGlvbi5wcmVwcm9jZXNzb3IuZGVmLjExMTM4MzMxOTIiIG5hbWU9IkRlZmluZWQgc3ltYm9scyAoLUQpIiBzdXBlckNsYXNzPSJnbnUuY3BwLmNvbXBpbGVyLm9wdGlvbi5wcmVwcm9jZXNzb3IuZGVmIiB1c2VCeVNjYW5uZXJEaXNjb3Zlcnk9ImZhbHNlIiB2YWx1ZVR5cGU9ImRlZmluZWRTeW1ib2xzIj4KKwkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSJfX0FWTV9VTklYX18iLz4KKwkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSJfX0FWTV9MSU5VWF9fIi8+CisJCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iX0dJVF9WRVJTSU9OXz1cJnF1b3Q7JChzaGVsbCBnaXQgZGVzY3JpYmUgLS1hbHdheXMgLS10YWdzKVwmcXVvdDsiLz4KKwkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSJfQVZNX0JVSUxUSU5fTlVNRVJJQ19HTVBfIi8+CisJCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iX0FWTV9TT0xWRVJfT01FR0FfIi8+CisJCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iX0FWTV9TT0xWRVJfQ1ZDNF8iLz4KKwkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSJfQVZNX1NPTFZFUl9aM18iLz4KKwkJCQkJCQkJPC9vcHRpb24+CisJCQkJCQkJCTxvcHRpb24gaWQ9ImdudS5jcHAuY29tcGlsZXIub3B0aW9uLnByZXByb2Nlc3Nvci51bmRlZi42MDMzNjMwNzciIG5hbWU9IlVuZGVmaW5lZCBzeW1ib2xzICgtVSkiIHN1cGVyQ2xhc3M9ImdudS5jcHAuY29tcGlsZXIub3B0aW9uLnByZXByb2Nlc3Nvci51bmRlZiIgdXNlQnlTY2FubmVyRGlzY292ZXJ5PSJmYWxzZSIgdmFsdWVUeXBlPSJ1bmRlZkRlZmluZWRTeW1ib2xzIj4KKwkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSJfQVZNX0VYUFJFU1NJT05fR0lOQUNfIi8+CisJCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iX0FWTV9TT0xWRVJfQ1ZDM18iLz4KKwkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSJfQVZNX1NPTFZFUl9ZSUNFU19WMV8iLz4KKwkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSJfQVZNX1NPTFZFUl9ZSUNFU19WMl8iLz4KKwkJCQkJCQkJPC9vcHRpb24+CisJCQkJCQkJCTxvcHRpb24gaWQ9ImdudS5jcHAuY29tcGlsZXIub3B0aW9uLmluY2x1ZGUucGF0aHMuMTgwODY5MTY1MyIgbmFtZT0iSW5jbHVkZSBwYXRocyAoLUkpIiBzdXBlckNsYXNzPSJnbnUuY3BwLmNvbXBpbGVyLm9wdGlvbi5pbmNsdWRlLnBhdGhzIiB1c2VCeVNjYW5uZXJEaXNjb3Zlcnk9ImZhbHNlIiB2YWx1ZVR5cGU9ImluY2x1ZGVQYXRoIj4KKwkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSImcXVvdDske3dvcmtzcGFjZV9sb2M6LyR7UHJvak5hbWV9L3NyY30mcXVvdDsiLz4KKwkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSImcXVvdDske3dvcmtzcGFjZV9sb2M6LyR7UHJvak5hbWV9L2luY2x1ZGUvbGludXg2NH0mcXVvdDsiLz4KKwkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSImcXVvdDske3dvcmtzcGFjZV9sb2M6LyR7UHJvak5hbWV9L2luY2x1ZGUvbGludXg2NC9hbnRscjNjfSZxdW90OyIvPgorCQkJCQkJCQkJPGxpc3RPcHRpb25WYWx1ZSBidWlsdEluPSJmYWxzZSIgdmFsdWU9IiZxdW90OyR7d29ya3NwYWNlX2xvYzovJHtQcm9qTmFtZX0vaW5jbHVkZS9saW51eDY0L29tZWdhfSZxdW90OyIvPgorCQkJCQkJCQkJPGxpc3RPcHRpb25WYWx1ZSBidWlsdEluPSJmYWxzZSIgdmFsdWU9IiZxdW90OyR7d29ya3NwYWNlX2xvYzovJHtQcm9qTmFtZX0vaW5jbHVkZS9saW51eDY0L3ozfSZxdW90OyIvPgorCQkJCQkJCQk8L29wdGlvbj4KKwkJCQkJCQkJPG9wdGlvbiBpZD0iZ251LmNwcC5jb21waWxlci5vcHRpb24uZGlhbGVjdC5zdGQuMTUzNjU5NTIxNyIgbmFtZT0iTGFuZ3VhZ2Ugc3RhbmRhcmQiIHN1cGVyQ2xhc3M9ImdudS5jcHAuY29tcGlsZXIub3B0aW9uLmRpYWxlY3Quc3RkIiB1c2VCeVNjYW5uZXJEaXNjb3Zlcnk9InRydWUiIHZhbHVlPSJnbnUuY3BwLmNvbXBpbGVyLmRpYWxlY3QuZGVmYXVsdCIgdmFsdWVUeXBlPSJlbnVtZXJhdGVkIi8+CisJCQkJCQkJCTxpbnB1dFR5cGUgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3BwLmNvbXBpbGVyLmlucHV0LjIxMjQ0MzEzMjMiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3BwLmNvbXBpbGVyLmlucHV0Ii8+CisJCQkJCQkJPC90b29sPgorCQkJCQkJCTx0b29sIGNvbW1hbmQ9ImcrKyAtcGlwZSIgY29tbWFuZExpbmVQYXR0ZXJuPSIke0NPTU1BTkR9ICR7RkxBR1N9ICR7T1VUUFVUX0ZMQUd9ICR7T1VUUFVUX1BSRUZJWH0ke09VVFBVVH0gJHtJTlBVVFN9IiBlcnJvclBhcnNlcnM9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkdDQ0Vycm9yUGFyc2VyIiBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jLmNvbXBpbGVyLmJhc2UuMTg3NDk4OTk4MiIgbmFtZT0iR0NDIEMgQ29tcGlsZXIiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYy5jb21waWxlci5iYXNlIj4KKwkJCQkJCQkJPG9wdGlvbiBkZWZhdWx0VmFsdWU9ImdudS5jLm9wdGltaXphdGlvbi5sZXZlbC5tb3N0IiBpZD0iZ251LmMuY29tcGlsZXIub3B0aW9uLm9wdGltaXphdGlvbi5sZXZlbC4xMjQxNjc3OTE0IiBuYW1lPSJPcHRpbWl6YXRpb24gTGV2ZWwiIHN1cGVyQ2xhc3M9ImdudS5jLmNvbXBpbGVyLm9wdGlvbi5vcHRpbWl6YXRpb24ubGV2ZWwiIHVzZUJ5U2Nhbm5lckRpc2NvdmVyeT0iZmFsc2UiIHZhbHVlPSJnbnUuYy5vcHRpbWl6YXRpb24ubGV2ZWwubm9uZSIgdmFsdWVUeXBlPSJlbnVtZXJhdGVkIi8+CisJCQkJCQkJCTxvcHRpb24gaWQ9ImdudS5jLmNvbXBpbGVyLm9wdGlvbi5kZWJ1Z2dpbmcubGV2ZWwuMTY4NzE2NzI0NyIgbmFtZT0iRGVidWcgTGV2ZWwiIHN1cGVyQ2xhc3M9ImdudS5jLmNvbXBpbGVyLm9wdGlvbi5kZWJ1Z2dpbmcubGV2ZWwiIHVzZUJ5U2Nhbm5lckRpc2NvdmVyeT0iZmFsc2UiIHZhbHVlPSJnbnUuYy5kZWJ1Z2dpbmcubGV2ZWwubm9uZSIgdmFsdWVUeXBlPSJlbnVtZXJhdGVkIi8+CisJCQkJCQkJCTxvcHRpb24gaWQ9ImdudS5jLmNvbXBpbGVyLm9wdGlvbi5pbmNsdWRlLnBhdGhzLjEyNTY1NTk3MDEiIG5hbWU9IkluY2x1ZGUgcGF0aHMgKC1JKSIgc3VwZXJDbGFzcz0iZ251LmMuY29tcGlsZXIub3B0aW9uLmluY2x1ZGUucGF0aHMiIHVzZUJ5U2Nhbm5lckRpc2NvdmVyeT0iZmFsc2UiIHZhbHVlVHlwZT0iaW5jbHVkZVBhdGgiPgorCQkJCQkJCQkJPGxpc3RPcHRpb25WYWx1ZSBidWlsdEluPSJmYWxzZSIgdmFsdWU9IiZxdW90OyR7d29ya3NwYWNlX2xvYzovJHtQcm9qTmFtZX0vc3JjfSZxdW90OyIvPgorCQkJCQkJCQkJPGxpc3RPcHRpb25WYWx1ZSBidWlsdEluPSJmYWxzZSIgdmFsdWU9IiZxdW90OyR7d29ya3NwYWNlX2xvYzovJHtQcm9qTmFtZX0vaW5jbHVkZS9saW51eDY0fSZxdW90OyIvPgorCQkJCQkJCQkJPGxpc3RPcHRpb25WYWx1ZSBidWlsdEluPSJmYWxzZSIgdmFsdWU9IiZxdW90OyR7d29ya3NwYWNlX2xvYzovJHtQcm9qTmFtZX0vaW5jbHVkZS9saW51eDY0L2FudGxyM2N9JnF1b3Q7Ii8+CisJCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iJnF1b3Q7JHt3b3Jrc3BhY2VfbG9jOi8ke1Byb2pOYW1lfS9pbmNsdWRlL2xpbnV4NjQvb21lZ2F9JnF1b3Q7Ii8+CisJCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iJnF1b3Q7JHt3b3Jrc3BhY2VfbG9jOi8ke1Byb2pOYW1lfS9pbmNsdWRlL2xpbnV4NjQvejN9JnF1b3Q7Ii8+CisJCQkJCQkJCTwvb3B0aW9uPgorCQkJCQkJCQk8b3B0aW9uIGlkPSJnbnUuYy5jb21waWxlci5vcHRpb24ucHJlcHJvY2Vzc29yLmRlZi5zeW1ib2xzLjc2ODk5OTU5NyIgbmFtZT0iRGVmaW5lZCBzeW1ib2xzICgtRCkiIHN1cGVyQ2xhc3M9ImdudS5jLmNvbXBpbGVyLm9wdGlvbi5wcmVwcm9jZXNzb3IuZGVmLnN5bWJvbHMiIHVzZUJ5U2Nhbm5lckRpc2NvdmVyeT0iZmFsc2UiIHZhbHVlVHlwZT0iZGVmaW5lZFN5bWJvbHMiPgorCQkJCQkJCQkJPGxpc3RPcHRpb25WYWx1ZSBidWlsdEluPSJmYWxzZSIgdmFsdWU9Il9fQVZNX1VOSVhfXyIvPgorCQkJCQkJCQkJPGxpc3RPcHRpb25WYWx1ZSBidWlsdEluPSJmYWxzZSIgdmFsdWU9Il9fQVZNX0xJTlVYX18iLz4KKwkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSJfQVZNX0JVSUxUSU5fTlVNRVJJQ19HTVBfIi8+CisJCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iX0FWTV9TT0xWRVJfT01FR0FfIi8+CisJCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iX0FWTV9TT0xWRVJfQ1ZDNF8iLz4KKwkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSJfQVZNX1NPTFZFUl9aM18iLz4KKwkJCQkJCQkJPC9vcHRpb24+CisJCQkJCQkJCTxvcHRpb24gaWQ9ImdudS5jLmNvbXBpbGVyLm9wdGlvbi5kaWFsZWN0LnN0ZC4xMDUyMzM1MjUiIG5hbWU9Ikxhbmd1YWdlIHN0YW5kYXJkIiBzdXBlckNsYXNzPSJnbnUuYy5jb21waWxlci5vcHRpb24uZGlhbGVjdC5zdGQiIHVzZUJ5U2Nhbm5lckRpc2NvdmVyeT0idHJ1ZSIgdmFsdWU9ImdudS5jLmNvbXBpbGVyLmRpYWxlY3QuZGVmYXVsdCIgdmFsdWVUeXBlPSJlbnVtZXJhdGVkIi8+CisJCQkJCQkJCTxvcHRpb24gaWQ9ImdudS5jLmNvbXBpbGVyLm9wdGlvbi5taXNjLm90aGVyLjE5MDAwMTgyOTUiIG5hbWU9Ik90aGVyIGZsYWdzIiBzdXBlckNsYXNzPSJnbnUuYy5jb21waWxlci5vcHRpb24ubWlzYy5vdGhlciIgdXNlQnlTY2FubmVyRGlzY292ZXJ5PSJmYWxzZSIgdmFsdWU9Ii1jIC1mbWVzc2FnZS1sZW5ndGg9MCAgLVd1bmluaXRpYWxpemVkIC1XdW51c2VkLWZ1bmN0aW9uIC1XdW51c2VkLXZhcmlhYmxlIC1XdW51c2VkLWJ1dC1zZXQtdmFyaWFibGUgIiB2YWx1ZVR5cGU9InN0cmluZyIvPgorCQkJCQkJCQk8b3B0aW9uIGlkPSJnbnUuYy5jb21waWxlci5vcHRpb24ud2FybmluZ3MuYWxsd2Fybi4xMzg3ODY0MjIxIiBuYW1lPSJBbGwgd2FybmluZ3MgKC1XYWxsKSIgc3VwZXJDbGFzcz0iZ251LmMuY29tcGlsZXIub3B0aW9uLndhcm5pbmdzLmFsbHdhcm4iIHVzZUJ5U2Nhbm5lckRpc2NvdmVyeT0iZmFsc2UiIHZhbHVlPSJmYWxzZSIgdmFsdWVUeXBlPSJib29sZWFuIi8+CisJCQkJCQkJCTxvcHRpb24gaWQ9ImdudS5jLmNvbXBpbGVyLm9wdGlvbi53YXJuaW5ncy5ub3dhcm4uNzQ3NTk1NjI3IiBuYW1lPSJJbmhpYml0IGFsbCB3YXJuaW5ncyAoLXcpIiBzdXBlckNsYXNzPSJnbnUuYy5jb21waWxlci5vcHRpb24ud2FybmluZ3Mubm93YXJuIiB1c2VCeVNjYW5uZXJEaXNjb3Zlcnk9ImZhbHNlIiB2YWx1ZT0idHJ1ZSIgdmFsdWVUeXBlPSJib29sZWFuIi8+CisJCQkJCQkJCTxpbnB1dFR5cGUgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYy5jb21waWxlci5pbnB1dC43OTcxMjg3NzYiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYy5jb21waWxlci5pbnB1dCIvPgorCQkJCQkJCTwvdG9vbD4KKwkJCQkJCQk8dG9vbCBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jLmxpbmtlci5iYXNlLjE0NjEzNDQ3NDUiIG5hbWU9IkdDQyBDIExpbmtlciIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jLmxpbmtlci5iYXNlIi8+CisJCQkJCQkJPHRvb2wgY29tbWFuZD0iZysrIC1waXBlIC1zdGF0aWMgLWZvcGVubXAiIGNvbW1hbmRMaW5lUGF0dGVybj0iJHtDT01NQU5EfSAke0ZMQUdTfSAke09VVFBVVF9GTEFHfSAke09VVFBVVF9QUkVGSVh9JHtPVVRQVVR9ICR7SU5QVVRTfSIgZXJyb3JQYXJzZXJzPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5HTERFcnJvclBhcnNlciIgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3BwLmxpbmtlci5iYXNlLjE5MjY4Nzk4NDEiIG5hbWU9IkdDQyBDKysgTGlua2VyIiBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNwcC5saW5rZXIuYmFzZSI+CisJCQkJCQkJCTxvcHRpb24gaWQ9ImdudS5jcHAubGluay5vcHRpb24uc3RyaXAuOTY4NTYyNTUxIiBuYW1lPSJPbWl0IGFsbCBzeW1ib2wgaW5mb3JtYXRpb24gKC1zKSIgc3VwZXJDbGFzcz0iZ251LmNwcC5saW5rLm9wdGlvbi5zdHJpcCIgdXNlQnlTY2FubmVyRGlzY292ZXJ5PSJmYWxzZSIgdmFsdWU9InRydWUiIHZhbHVlVHlwZT0iYm9vbGVhbiIvPgorCQkJCQkJCQk8b3B0aW9uIGlkPSJnbnUuY3BwLmxpbmsub3B0aW9uLmxpYnMuMTI5NTcwNTgzMSIgbmFtZT0iTGlicmFyaWVzICgtbCkiIHN1cGVyQ2xhc3M9ImdudS5jcHAubGluay5vcHRpb24ubGlicyIgdXNlQnlTY2FubmVyRGlzY292ZXJ5PSJmYWxzZSIgdmFsdWVUeXBlPSJsaWJzIj4KKwkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSJhbnRsciIvPgorCQkJCQkJCQkJPGxpc3RPcHRpb25WYWx1ZSBidWlsdEluPSJmYWxzZSIgdmFsdWU9ImFudGxyM2MiLz4KKwkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSJvbWVnYSIvPgorCQkJCQkJCQkJPGxpc3RPcHRpb25WYWx1ZSBidWlsdEluPSJmYWxzZSIgdmFsdWU9ImJvb3N0X3N5c3RlbSIvPgorCQkJCQkJCQkJPGxpc3RPcHRpb25WYWx1ZSBidWlsdEluPSJmYWxzZSIgdmFsdWU9ImJvb3N0X2ZpbGVzeXN0ZW0iLz4KKwkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSJib29zdF9yZWdleCIvPgorCQkJCQkJCQkJPGxpc3RPcHRpb25WYWx1ZSBidWlsdEluPSJmYWxzZSIgdmFsdWU9ImJvb3N0X3VuaXRfdGVzdF9mcmFtZXdvcmsiLz4KKwkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSJjdmM0Ii8+CisJCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iejMiLz4KKwkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSJydCIvPgorCQkJCQkJCQkJPGxpc3RPcHRpb25WYWx1ZSBidWlsdEluPSJmYWxzZSIgdmFsdWU9ImdpbmFjIi8+CisJCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iY2xuIi8+CisJCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iZ21weHgiLz4KKwkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSJnbXAiLz4KKwkJCQkJCQkJPC9vcHRpb24+CisJCQkJCQkJCTxvcHRpb24gaWQ9ImdudS5jcHAubGluay5vcHRpb24ucGF0aHMuMTg5NzIxNTMyNSIgbmFtZT0iTGlicmFyeSBzZWFyY2ggcGF0aCAoLUwpIiBzdXBlckNsYXNzPSJnbnUuY3BwLmxpbmsub3B0aW9uLnBhdGhzIiB1c2VCeVNjYW5uZXJEaXNjb3Zlcnk9ImZhbHNlIiB2YWx1ZVR5cGU9ImxpYlBhdGhzIj4KKwkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSImcXVvdDske3dvcmtzcGFjZV9sb2M6LyR7UHJvak5hbWV9L2xpYi9saW51eDY0fSZxdW90OyIvPgorCQkJCQkJCQkJPGxpc3RPcHRpb25WYWx1ZSBidWlsdEluPSJmYWxzZSIgdmFsdWU9IiZxdW90OyR7d29ya3NwYWNlX2xvYzovJHtQcm9qTmFtZX0vbGliL2xpbnV4NjQveWljZXMxfSZxdW90OyIvPgorCQkJCQkJCQkJPGxpc3RPcHRpb25WYWx1ZSBidWlsdEluPSJmYWxzZSIgdmFsdWU9IiZxdW90OyR7d29ya3NwYWNlX2xvYzovJHtQcm9qTmFtZX0vbGliL2xpbnV4NjQveWljZXMyfSZxdW90OyIvPgorCQkJCQkJCQk8L29wdGlvbj4KKwkJCQkJCQkJPG9wdGlvbiBpZD0iZ251LmNwcC5saW5rLm9wdGlvbi51c2Vyb2Jqcy4zNTA0NTY4MTkiIG5hbWU9Ik90aGVyIG9iamVjdHMiIHN1cGVyQ2xhc3M9ImdudS5jcHAubGluay5vcHRpb24udXNlcm9ianMiIHVzZUJ5U2Nhbm5lckRpc2NvdmVyeT0iZmFsc2UiIHZhbHVlVHlwZT0idXNlck9ianMiPgorCQkJCQkJCQkJPGxpc3RPcHRpb25WYWx1ZSBidWlsdEluPSJmYWxzZSIgdmFsdWU9IiIvPgorCQkJCQkJCQkJPGxpc3RPcHRpb25WYWx1ZSBidWlsdEluPSJmYWxzZSIgdmFsdWU9IiIvPgorCQkJCQkJCQk8L29wdGlvbj4KKwkJCQkJCQkJPGlucHV0VHlwZSBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcHAubGlua2VyLmlucHV0LjIwNzEzOTc5ODYiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3BwLmxpbmtlci5pbnB1dCI+CisJCQkJCQkJCQk8YWRkaXRpb25hbElucHV0IGtpbmQ9ImFkZGl0aW9uYWxpbnB1dGRlcGVuZGVuY3kiIHBhdGhzPSIkKFVTRVJfT0JKUykiLz4KKwkJCQkJCQkJCTxhZGRpdGlvbmFsSW5wdXQga2luZD0iYWRkaXRpb25hbGlucHV0IiBwYXRocz0iJChMSUJTKSIvPgorCQkJCQkJCQk8L2lucHV0VHlwZT4KKwkJCQkJCQk8L3Rvb2w+CisJCQkJCQkJPHRvb2wgY29tbWFuZD0iYXMiIGNvbW1hbmRMaW5lUGF0dGVybj0iJHtDT01NQU5EfSAke0ZMQUdTfSAke09VVFBVVF9GTEFHfSAke09VVFBVVF9QUkVGSVh9JHtPVVRQVVR9ICR7SU5QVVRTfSIgZXJyb3JQYXJzZXJzPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5HQVNFcnJvclBhcnNlciIgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYXNzZW1ibGVyLmJhc2UuMTc3NTM2NzY1NiIgbmFtZT0iR0NDIEFzc2VtYmxlciIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5hc3NlbWJsZXIuYmFzZSI+CisJCQkJCQkJCTxpbnB1dFR5cGUgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYXNzZW1ibGVyLmlucHV0LjUzNDI4NTQyOCIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5hc3NlbWJsZXIuaW5wdXQiLz4KKwkJCQkJCQk8L3Rvb2w+CisJCQkJCQk8L3Rvb2xDaGFpbj4KKwkJCQkJPC9mb2xkZXJJbmZvPgorCQkJCQk8c291cmNlRW50cmllcz4KKwkJCQkJCTxlbnRyeSBleGNsdWRpbmc9ImNtYWtlfHNyYy1oZWFkfHV0ZXN0c3xpbmNsdWRlfHNyYzMwY3xiYWt1cHxvdXR8c3JjfFJlbGVhc2UiIGZsYWdzPSJWQUxVRV9XT1JLU1BBQ0VfUEFUSHxSRVNPTFZFRCIga2luZD0ic291cmNlUGF0aCIgbmFtZT0iIi8+CisJCQkJCQk8ZW50cnkgZXhjbHVkaW5nPSJjbWFrZSIgZmxhZ3M9IlZBTFVFX1dPUktTUEFDRV9QQVRIfFJFU09MVkVEIiBraW5kPSJzb3VyY2VQYXRoIiBuYW1lPSJzcmMiLz4KKwkJCQkJPC9zb3VyY2VFbnRyaWVzPgorCQkJCTwvY29uZmlndXJhdGlvbj4KKwkJCTwvc3RvcmFnZU1vZHVsZT4KKwkJCTxzdG9yYWdlTW9kdWxlIG1vZHVsZUlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5leHRlcm5hbFNldHRpbmdzIi8+CisJCQk8c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0ib3JnLmVjbGlwc2UuY2R0LmludGVybmFsLnVpLnRleHQuY29tbWVudE93bmVyUHJvamVjdE1hcHBpbmdzIi8+CisJCQk8c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUubGFuZ3VhZ2UubWFwcGluZyIvPgorCQk8L2Njb25maWd1cmF0aW9uPgorCQk8Y2NvbmZpZ3VyYXRpb24gaWQ9ImNkdC5tYW5hZ2VkYnVpbGQuY29uZmlnLmdudS5jeWd3aW4uZXhlLmRlYnVnLjg5NDkxNTkyMC45OTUxMzUxNTkuMzExODc0NjU3LjQ1NDI3NzA0OCI+CisJCQk8c3RvcmFnZU1vZHVsZSBidWlsZFN5c3RlbUlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5jb25maWd1cmF0aW9uRGF0YVByb3ZpZGVyIiBpZD0iY2R0Lm1hbmFnZWRidWlsZC5jb25maWcuZ251LmN5Z3dpbi5leGUuZGVidWcuODk0OTE1OTIwLjk5NTEzNTE1OS4zMTE4NzQ2NTcuNDU0Mjc3MDQ4IiBtb2R1bGVJZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuc2V0dGluZ3MiIG5hbWU9IkRlYnVnIj4KKwkJCQk8ZXh0ZXJuYWxTZXR0aW5ncz4KKwkJCQkJPGV4dGVybmFsU2V0dGluZz4KKwkJCQkJCTxlbnRyeSBmbGFncz0iVkFMVUVfV09SS1NQQUNFX1BBVEgiIGtpbmQ9ImluY2x1ZGVQYXRoIiBuYW1lPSIvY29tLmNlYS5hdm0iLz4KKwkJCQkJCTxlbnRyeSBmbGFncz0iVkFMVUVfV09SS1NQQUNFX1BBVEgiIGtpbmQ9ImxpYnJhcnlQYXRoIiBuYW1lPSIvY29tLmNlYS5hdm0vRGVidWciLz4KKwkJCQkJCTxlbnRyeSBmbGFncz0iUkVTT0xWRUQiIGtpbmQ9ImxpYnJhcnlGaWxlIiBuYW1lPSJhdm0iIHNyY1ByZWZpeE1hcHBpbmc9IiIgc3JjUm9vdFBhdGg9IiIvPgorCQkJCQk8L2V4dGVybmFsU2V0dGluZz4KKwkJCQk8L2V4dGVybmFsU2V0dGluZ3M+CisJCQkJPGV4dGVuc2lvbnM+CisJCQkJCTxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkVMRiIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkJpbmFyeVBhcnNlciIvPgorCQkJCQk8ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5HQ0NFcnJvclBhcnNlciIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkVycm9yUGFyc2VyIi8+CisJCQkJCTxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkdBU0Vycm9yUGFyc2VyIiBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuRXJyb3JQYXJzZXIiLz4KKwkJCQkJPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuR21ha2VFcnJvclBhcnNlciIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkVycm9yUGFyc2VyIi8+CisJCQkJCTxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkNXRExvY2F0b3IiIHBvaW50PSJvcmcuZWNsaXBzZS5jZHQuY29yZS5FcnJvclBhcnNlciIvPgorCQkJCQk8ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5HTERFcnJvclBhcnNlciIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkVycm9yUGFyc2VyIi8+CisJCQkJPC9leHRlbnNpb25zPgorCQkJPC9zdG9yYWdlTW9kdWxlPgorCQkJPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9ImNkdEJ1aWxkU3lzdGVtIiB2ZXJzaW9uPSI0LjAuMCI+CisJCQkJPGNvbmZpZ3VyYXRpb24gYXJ0aWZhY3ROYW1lPSJhdm0iIGJ1aWxkQXJ0ZWZhY3RUeXBlPSJvcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5idWlsZEFydGVmYWN0VHlwZS5leGUiIGJ1aWxkUHJvcGVydGllcz0ib3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuYnVpbGRBcnRlZmFjdFR5cGU9b3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuYnVpbGRBcnRlZmFjdFR5cGUuZXhlLG9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLmJ1aWxkVHlwZT1vcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5idWlsZFR5cGUuZGVidWciIGNsZWFuQ29tbWFuZD0icm0gLXJmIiBkZXNjcmlwdGlvbj0iIiBlcnJvclBhcnNlcnM9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkdBU0Vycm9yUGFyc2VyO29yZy5lY2xpcHNlLmNkdC5jb3JlLkdtYWtlRXJyb3JQYXJzZXI7b3JnLmVjbGlwc2UuY2R0LmNvcmUuR0xERXJyb3JQYXJzZXI7b3JnLmVjbGlwc2UuY2R0LmNvcmUuQ1dETG9jYXRvcjtvcmcuZWNsaXBzZS5jZHQuY29yZS5HQ0NFcnJvclBhcnNlciIgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQuY29uZmlnLmdudS5jeWd3aW4uZXhlLmRlYnVnLjg5NDkxNTkyMC45OTUxMzUxNTkuMzExODc0NjU3LjQ1NDI3NzA0OCIgbmFtZT0iRGVidWciIHBhcmVudD0iY2R0Lm1hbmFnZWRidWlsZC5jb25maWcuZ251LmN5Z3dpbi5leGUuZGVidWciIHBvc3Rhbm5vdW5jZWJ1aWxkU3RlcD0iIiBwb3N0YnVpbGRTdGVwPSJjcCAtZiBhdm0uZXhlIGRpdmVyc2l0eS5leGUiIHByZWFubm91bmNlYnVpbGRTdGVwPSIiIHByZWJ1aWxkU3RlcD0iIj4KKwkJCQkJPGZvbGRlckluZm8gaWQ9ImNkdC5tYW5hZ2VkYnVpbGQuY29uZmlnLmdudS5jeWd3aW4uZXhlLmRlYnVnLjg5NDkxNTkyMC45OTUxMzUxNTkuMzExODc0NjU3LjQ1NDI3NzA0OC4iIG5hbWU9Ii8iIHJlc291cmNlUGF0aD0iIj4KKwkJCQkJCTx0b29sQ2hhaW4gZXJyb3JQYXJzZXJzPSIiIGlkPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2xjaGFpbi5nbnUuYmFzZS42NDQyNzY4OCIgbmFtZT0iTGludXggR0NDIiBub25JbnRlcm5hbEJ1aWxkZXJJZD0iY2R0Lm1hbmFnZWRidWlsZC50YXJnZXQuZ251LmJ1aWxkZXIuYmFzZSIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sY2hhaW4uZ251LmJhc2UiPgorCQkJCQkJCTx0YXJnZXRQbGF0Zm9ybSBhcmNoTGlzdD0iYWxsIiBiaW5hcnlQYXJzZXI9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkVMRiIgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudGFyZ2V0LmdudS5wbGF0Zm9ybS5iYXNlLjEwNzYyMDgwMTAiIG5hbWU9IkRlYnVnIFBsYXRmb3JtIiBvc0xpc3Q9ImxpbnV4LGhwdXgsYWl4LHFueCIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50YXJnZXQuZ251LnBsYXRmb3JtLmJhc2UiLz4KKwkJCQkJCQk8YnVpbGRlciBhcmd1bWVudHM9IiIgYnVpbGRQYXRoPSIke3dvcmtzcGFjZV9sb2M6L2NvbS5jZWEuYXZtL0RlYnVnfSIgY29tbWFuZD0ibWFrZSIgZXJyb3JQYXJzZXJzPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5HbWFrZUVycm9yUGFyc2VyO29yZy5lY2xpcHNlLmNkdC5jb3JlLkNXRExvY2F0b3IiIGlkPSJjZHQubWFuYWdlZGJ1aWxkLnRhcmdldC5nbnUuYnVpbGRlci5iYXNlLjQ1NjY1MzA5OCIga2VlcEVudmlyb25tZW50SW5CdWlsZGZpbGU9ImZhbHNlIiBuYW1lPSJHbnUgTWFrZSBCdWlsZGVyIiBwYXJhbGxlbEJ1aWxkT249InRydWUiIHBhcmFsbGVsaXphdGlvbk51bWJlcj0iMjgiIHN0b3BPbkVycj0iZmFsc2UiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudGFyZ2V0LmdudS5idWlsZGVyLmJhc2UiLz4KKwkJCQkJCQk8dG9vbCBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5hcmNoaXZlci5iYXNlLjE4Mzc3MDU1NDIiIG5hbWU9IkdDQyBBcmNoaXZlciIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5hcmNoaXZlci5iYXNlIj4KKwkJCQkJCQkJPG9wdGlvbiBpZD0iZ251LmJvdGgubGliLm9wdGlvbi5mbGFncy40MDI5MjgzMCIgbmFtZT0iQXJjaGl2ZXIgZmxhZ3MiIHN1cGVyQ2xhc3M9ImdudS5ib3RoLmxpYi5vcHRpb24uZmxhZ3MiIHZhbHVlPSItciAiIHZhbHVlVHlwZT0ic3RyaW5nIi8+CisJCQkJCQkJPC90b29sPgorCQkJCQkJCTx0b29sIGNvbW1hbmQ9ImcrKyAtcGlwZSIgY29tbWFuZExpbmVQYXR0ZXJuPSIke0NPTU1BTkR9ICR7RkxBR1N9ICR7T1VUUFVUX0ZMQUd9ICR7T1VUUFVUX1BSRUZJWH0ke09VVFBVVH0gJHtJTlBVVFN9IiBlcnJvclBhcnNlcnM9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkdDQ0Vycm9yUGFyc2VyIiBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcHAuY29tcGlsZXIuYmFzZS4xNjE2NDQzMjY5IiBuYW1lPSJHQ0MgQysrIENvbXBpbGVyIiBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNwcC5jb21waWxlci5iYXNlIj4KKwkJCQkJCQkJPG9wdGlvbiBpZD0iZ251LmNwcC5jb21waWxlci5vcHRpb24uaW5jbHVkZS5wYXRocy40OTQ1NTYzNjEiIG5hbWU9IkluY2x1ZGUgcGF0aHMgKC1JKSIgc3VwZXJDbGFzcz0iZ251LmNwcC5jb21waWxlci5vcHRpb24uaW5jbHVkZS5wYXRocyIgdXNlQnlTY2FubmVyRGlzY292ZXJ5PSJmYWxzZSIgdmFsdWVUeXBlPSJpbmNsdWRlUGF0aCI+CisJCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iJnF1b3Q7JHt3b3Jrc3BhY2VfbG9jOi8ke1Byb2pOYW1lfS9zcmN9JnF1b3Q7Ii8+CisJCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iJnF1b3Q7JHt3b3Jrc3BhY2VfbG9jOi8ke1Byb2pOYW1lfS9pbmNsdWRlL2xpbnV4NjR9JnF1b3Q7Ii8+CisJCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iJnF1b3Q7JHt3b3Jrc3BhY2VfbG9jOi8ke1Byb2pOYW1lfS9pbmNsdWRlL2xpbnV4NjQvYW50bHIzY30mcXVvdDsiLz4KKwkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSImcXVvdDske3dvcmtzcGFjZV9sb2M6LyR7UHJvak5hbWV9L2luY2x1ZGUvbGludXg2NC9vbWVnYX0mcXVvdDsiLz4KKwkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSImcXVvdDske3dvcmtzcGFjZV9sb2M6LyR7UHJvak5hbWV9L2luY2x1ZGUvbGludXg2NC96M30mcXVvdDsiLz4KKwkJCQkJCQkJPC9vcHRpb24+CisJCQkJCQkJCTxvcHRpb24gaWQ9ImdudS5jcHAuY29tcGlsZXIub3B0aW9uLm9wdGltaXphdGlvbi5sZXZlbC43ODQ5NjE1NjQiIG5hbWU9Ik9wdGltaXphdGlvbiBMZXZlbCIgc3VwZXJDbGFzcz0iZ251LmNwcC5jb21waWxlci5vcHRpb24ub3B0aW1pemF0aW9uLmxldmVsIiB1c2VCeVNjYW5uZXJEaXNjb3Zlcnk9ImZhbHNlIiB2YWx1ZT0iZ251LmNwcC5jb21waWxlci5vcHRpbWl6YXRpb24ubGV2ZWwubm9uZSIgdmFsdWVUeXBlPSJlbnVtZXJhdGVkIi8+CisJCQkJCQkJCTxvcHRpb24gaWQ9ImdudS5jcHAuY29tcGlsZXIub3B0aW9uLmRlYnVnZ2luZy5sZXZlbC4xMTg0OTMyMDQiIG5hbWU9IkRlYnVnIExldmVsIiBzdXBlckNsYXNzPSJnbnUuY3BwLmNvbXBpbGVyLm9wdGlvbi5kZWJ1Z2dpbmcubGV2ZWwiIHVzZUJ5U2Nhbm5lckRpc2NvdmVyeT0iZmFsc2UiIHZhbHVlPSJnbnUuY3BwLmNvbXBpbGVyLmRlYnVnZ2luZy5sZXZlbC5tYXgiIHZhbHVlVHlwZT0iZW51bWVyYXRlZCIvPgorCQkJCQkJCQk8b3B0aW9uIGlkPSJnbnUuY3BwLmNvbXBpbGVyLm9wdGlvbi5wcmVwcm9jZXNzb3IuZGVmLjE2OTQ1Nzc2OTAiIG5hbWU9IkRlZmluZWQgc3ltYm9scyAoLUQpIiBzdXBlckNsYXNzPSJnbnUuY3BwLmNvbXBpbGVyLm9wdGlvbi5wcmVwcm9jZXNzb3IuZGVmIiB1c2VCeVNjYW5uZXJEaXNjb3Zlcnk9ImZhbHNlIiB2YWx1ZVR5cGU9ImRlZmluZWRTeW1ib2xzIj4KKwkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSJfX0FWTV9VTklYX18iLz4KKwkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSJfX0FWTV9MSU5VWF9fIi8+CisJCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iX0dJVF9WRVJTSU9OXz1cJnF1b3Q7JChzaGVsbCBnaXQgZGVzY3JpYmUgLS1hbHdheXMgLS10YWdzKVwmcXVvdDsiLz4KKwkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSJfQVZNX0JVSUxUSU5fTlVNRVJJQ19HTVBfIi8+CisJCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iX0FWTV9TT0xWRVJfT01FR0FfIi8+CisJCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iX0FWTV9TT0xWRVJfQ1ZDNF8iLz4KKwkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSJfQVZNX1NPTFZFUl9aM18iLz4KKwkJCQkJCQkJPC9vcHRpb24+CisJCQkJCQkJCTxvcHRpb24gaWQ9ImdudS5jcHAuY29tcGlsZXIub3B0aW9uLnByZXByb2Nlc3Nvci51bmRlZi4xMDU3MDMyNTAiIG5hbWU9IlVuZGVmaW5lZCBzeW1ib2xzICgtVSkiIHN1cGVyQ2xhc3M9ImdudS5jcHAuY29tcGlsZXIub3B0aW9uLnByZXByb2Nlc3Nvci51bmRlZiIgdXNlQnlTY2FubmVyRGlzY292ZXJ5PSJmYWxzZSIgdmFsdWVUeXBlPSJ1bmRlZkRlZmluZWRTeW1ib2xzIj4KKwkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSJfQVZNX0JVSUxUSU5fTlVNRVJJQ19CT09TVF8iLz4KKwkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSJfQVZNX0VYUFJFU1NJT05fR0lOQUNfIi8+CisJCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iX0FWTV9TT0xWRVJfWUlDRVNfVjFfIi8+CisJCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iX0FWTV9TT0xWRVJfWUlDRVNfVjJfIi8+CisJCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iX0FWTV9TT0xWRVJfQ1ZDM18iLz4KKwkJCQkJCQkJPC9vcHRpb24+CisJCQkJCQkJCTxvcHRpb24gaWQ9ImdudS5jcHAuY29tcGlsZXIub3B0aW9uLmRpYWxlY3Quc3RkLjE5MDgwNDE3NDYiIG5hbWU9Ikxhbmd1YWdlIHN0YW5kYXJkIiBzdXBlckNsYXNzPSJnbnUuY3BwLmNvbXBpbGVyLm9wdGlvbi5kaWFsZWN0LnN0ZCIgdXNlQnlTY2FubmVyRGlzY292ZXJ5PSJ0cnVlIiB2YWx1ZT0iZ251LmNwcC5jb21waWxlci5kaWFsZWN0LmRlZmF1bHQiIHZhbHVlVHlwZT0iZW51bWVyYXRlZCIvPgorCQkJCQkJCQk8aW5wdXRUeXBlIGlkPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNwcC5jb21waWxlci5pbnB1dC43OTAyNDk3NjgiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3BwLmNvbXBpbGVyLmlucHV0Ii8+CisJCQkJCQkJPC90b29sPgorCQkJCQkJCTx0b29sIGNvbW1hbmQ9ImcrKyAtcGlwZSIgY29tbWFuZExpbmVQYXR0ZXJuPSIke0NPTU1BTkR9ICR7RkxBR1N9ICR7T1VUUFVUX0ZMQUd9ICR7T1VUUFVUX1BSRUZJWH0ke09VVFBVVH0gJHtJTlBVVFN9IiBlcnJvclBhcnNlcnM9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkdDQ0Vycm9yUGFyc2VyIiBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jLmNvbXBpbGVyLmJhc2UuNTAxNzEwODg5IiBuYW1lPSJHQ0MgQyBDb21waWxlciIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jLmNvbXBpbGVyLmJhc2UiPgorCQkJCQkJCQk8b3B0aW9uIGRlZmF1bHRWYWx1ZT0iZ251LmMub3B0aW1pemF0aW9uLmxldmVsLm5vbmUiIGlkPSJnbnUuYy5jb21waWxlci5vcHRpb24ub3B0aW1pemF0aW9uLmxldmVsLjIwMDQzODAxNDMiIG5hbWU9Ik9wdGltaXphdGlvbiBMZXZlbCIgc3VwZXJDbGFzcz0iZ251LmMuY29tcGlsZXIub3B0aW9uLm9wdGltaXphdGlvbi5sZXZlbCIgdXNlQnlTY2FubmVyRGlzY292ZXJ5PSJmYWxzZSIgdmFsdWU9ImdudS5jLm9wdGltaXphdGlvbi5sZXZlbC5ub25lIiB2YWx1ZVR5cGU9ImVudW1lcmF0ZWQiLz4KKwkJCQkJCQkJPG9wdGlvbiBpZD0iZ251LmMuY29tcGlsZXIub3B0aW9uLmRlYnVnZ2luZy5sZXZlbC4xNjkwMjk2ODg4IiBuYW1lPSJEZWJ1ZyBMZXZlbCIgc3VwZXJDbGFzcz0iZ251LmMuY29tcGlsZXIub3B0aW9uLmRlYnVnZ2luZy5sZXZlbCIgdXNlQnlTY2FubmVyRGlzY292ZXJ5PSJmYWxzZSIgdmFsdWU9ImdudS5jLmRlYnVnZ2luZy5sZXZlbC5tYXgiIHZhbHVlVHlwZT0iZW51bWVyYXRlZCIvPgorCQkJCQkJCQk8b3B0aW9uIGlkPSJnbnUuYy5jb21waWxlci5vcHRpb24ucHJlcHJvY2Vzc29yLmRlZi5zeW1ib2xzLjE1OTA5Mzc1MCIgbmFtZT0iRGVmaW5lZCBzeW1ib2xzICgtRCkiIHN1cGVyQ2xhc3M9ImdudS5jLmNvbXBpbGVyLm9wdGlvbi5wcmVwcm9jZXNzb3IuZGVmLnN5bWJvbHMiIHVzZUJ5U2Nhbm5lckRpc2NvdmVyeT0iZmFsc2UiIHZhbHVlVHlwZT0iZGVmaW5lZFN5bWJvbHMiPgorCQkJCQkJCQkJPGxpc3RPcHRpb25WYWx1ZSBidWlsdEluPSJmYWxzZSIgdmFsdWU9Il9fQVZNX1VOSVhfXyIvPgorCQkJCQkJCQkJPGxpc3RPcHRpb25WYWx1ZSBidWlsdEluPSJmYWxzZSIgdmFsdWU9Il9fQVZNX0xJTlVYX18iLz4KKwkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSJfQVZNX0JVSUxUSU5fTlVNRVJJQ19HTVBfIi8+CisJCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iX0FWTV9TT0xWRVJfT01FR0FfIi8+CisJCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iX0FWTV9TT0xWRVJfQ1ZDNF8iLz4KKwkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSJfQVZNX1NPTFZFUl9aM18iLz4KKwkJCQkJCQkJPC9vcHRpb24+CisJCQkJCQkJCTxvcHRpb24gaWQ9ImdudS5jLmNvbXBpbGVyLm9wdGlvbi5pbmNsdWRlLnBhdGhzLjE2NTM1MTg4MDQiIG5hbWU9IkluY2x1ZGUgcGF0aHMgKC1JKSIgc3VwZXJDbGFzcz0iZ251LmMuY29tcGlsZXIub3B0aW9uLmluY2x1ZGUucGF0aHMiIHVzZUJ5U2Nhbm5lckRpc2NvdmVyeT0iZmFsc2UiIHZhbHVlVHlwZT0iaW5jbHVkZVBhdGgiPgorCQkJCQkJCQkJPGxpc3RPcHRpb25WYWx1ZSBidWlsdEluPSJmYWxzZSIgdmFsdWU9IiZxdW90OyR7d29ya3NwYWNlX2xvYzovJHtQcm9qTmFtZX0vc3JjfSZxdW90OyIvPgorCQkJCQkJCQkJPGxpc3RPcHRpb25WYWx1ZSBidWlsdEluPSJmYWxzZSIgdmFsdWU9IiZxdW90OyR7d29ya3NwYWNlX2xvYzovJHtQcm9qTmFtZX0vaW5jbHVkZS9saW51eDY0fSZxdW90OyIvPgorCQkJCQkJCQkJPGxpc3RPcHRpb25WYWx1ZSBidWlsdEluPSJmYWxzZSIgdmFsdWU9IiZxdW90OyR7d29ya3NwYWNlX2xvYzovJHtQcm9qTmFtZX0vaW5jbHVkZS9saW51eDY0L2FudGxyM2N9JnF1b3Q7Ii8+CisJCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iJnF1b3Q7JHt3b3Jrc3BhY2VfbG9jOi8ke1Byb2pOYW1lfS9pbmNsdWRlL2xpbnV4NjQvb21lZ2F9JnF1b3Q7Ii8+CisJCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iJnF1b3Q7JHt3b3Jrc3BhY2VfbG9jOi8ke1Byb2pOYW1lfS9pbmNsdWRlL2xpbnV4NjQvejN9JnF1b3Q7Ii8+CisJCQkJCQkJCTwvb3B0aW9uPgorCQkJCQkJCQk8b3B0aW9uIGlkPSJnbnUuYy5jb21waWxlci5vcHRpb24ubWlzYy5vdGhlci4xMjgyMzY0NzQ0IiBuYW1lPSJPdGhlciBmbGFncyIgc3VwZXJDbGFzcz0iZ251LmMuY29tcGlsZXIub3B0aW9uLm1pc2Mub3RoZXIiIHVzZUJ5U2Nhbm5lckRpc2NvdmVyeT0iZmFsc2UiIHZhbHVlPSItYyAtZm1lc3NhZ2UtbGVuZ3RoPTAgIC1XdW5pbml0aWFsaXplZCAtV3VudXNlZC1mdW5jdGlvbiAtV3VudXNlZC12YXJpYWJsZSAtV3VudXNlZC1idXQtc2V0LXZhcmlhYmxlICIgdmFsdWVUeXBlPSJzdHJpbmciLz4KKwkJCQkJCQkJPG9wdGlvbiBpZD0iZ251LmMuY29tcGlsZXIub3B0aW9uLndhcm5pbmdzLmFsbHdhcm4uMTY4MjU2NjMwNCIgbmFtZT0iQWxsIHdhcm5pbmdzICgtV2FsbCkiIHN1cGVyQ2xhc3M9ImdudS5jLmNvbXBpbGVyLm9wdGlvbi53YXJuaW5ncy5hbGx3YXJuIiB1c2VCeVNjYW5uZXJEaXNjb3Zlcnk9ImZhbHNlIiB2YWx1ZT0iZmFsc2UiIHZhbHVlVHlwZT0iYm9vbGVhbiIvPgorCQkJCQkJCQk8b3B0aW9uIGlkPSJnbnUuYy5jb21waWxlci5vcHRpb24uZGlhbGVjdC5zdGQuNzc2Njg4ODY3IiBuYW1lPSJMYW5ndWFnZSBzdGFuZGFyZCIgc3VwZXJDbGFzcz0iZ251LmMuY29tcGlsZXIub3B0aW9uLmRpYWxlY3Quc3RkIiB1c2VCeVNjYW5uZXJEaXNjb3Zlcnk9InRydWUiIHZhbHVlPSJnbnUuYy5jb21waWxlci5kaWFsZWN0LmRlZmF1bHQiIHZhbHVlVHlwZT0iZW51bWVyYXRlZCIvPgorCQkJCQkJCQk8b3B0aW9uIGlkPSJnbnUuYy5jb21waWxlci5vcHRpb24ud2FybmluZ3Mubm93YXJuLjEzNDg4MDIyMTIiIG5hbWU9IkluaGliaXQgYWxsIHdhcm5pbmdzICgtdykiIHN1cGVyQ2xhc3M9ImdudS5jLmNvbXBpbGVyLm9wdGlvbi53YXJuaW5ncy5ub3dhcm4iIHVzZUJ5U2Nhbm5lckRpc2NvdmVyeT0iZmFsc2UiIHZhbHVlPSJ0cnVlIiB2YWx1ZVR5cGU9ImJvb2xlYW4iLz4KKwkJCQkJCQkJPG9wdGlvbiBpZD0iZ251LmMuY29tcGlsZXIub3B0aW9uLnByZXByb2Nlc3Nvci51bmRlZi5zeW1ib2wuMjEyMDE4NTkxNyIgbmFtZT0iVW5kZWZpbmVkIHN5bWJvbHMgKC1VKSIgc3VwZXJDbGFzcz0iZ251LmMuY29tcGlsZXIub3B0aW9uLnByZXByb2Nlc3Nvci51bmRlZi5zeW1ib2wiIHVzZUJ5U2Nhbm5lckRpc2NvdmVyeT0iZmFsc2UiLz4KKwkJCQkJCQkJPGlucHV0VHlwZSBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jLmNvbXBpbGVyLmlucHV0LjE2NzU2MTM4OCIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jLmNvbXBpbGVyLmlucHV0Ii8+CisJCQkJCQkJPC90b29sPgorCQkJCQkJCTx0b29sIGlkPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmMubGlua2VyLmJhc2UuNDcyNjM1ODQxIiBuYW1lPSJHQ0MgQyBMaW5rZXIiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYy5saW5rZXIuYmFzZSI+CisJCQkJCQkJCTxvcHRpb24gZGVmYXVsdFZhbHVlPSJ0cnVlIiBpZD0iZ251LmMubGluay5vcHRpb24uc2hhcmVkLjkzODUzNzI2MiIgbmFtZT0iU2hhcmVkICgtc2hhcmVkKSIgc3VwZXJDbGFzcz0iZ251LmMubGluay5vcHRpb24uc2hhcmVkIiB2YWx1ZVR5cGU9ImJvb2xlYW4iLz4KKwkJCQkJCQk8L3Rvb2w+CisJCQkJCQkJPHRvb2wgY29tbWFuZD0iZysrIC1waXBlIC1zdGF0aWMgLWZvcGVubXAiIGNvbW1hbmRMaW5lUGF0dGVybj0iJHtDT01NQU5EfSAke0ZMQUdTfSAke09VVFBVVF9GTEFHfSAke09VVFBVVF9QUkVGSVh9JHtPVVRQVVR9ICR7SU5QVVRTfSIgZXJyb3JQYXJzZXJzPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5HTERFcnJvclBhcnNlciIgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3BwLmxpbmtlci5iYXNlLjE2MjgwMjA1MzgiIG5hbWU9IkdDQyBDKysgTGlua2VyIiBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNwcC5saW5rZXIuYmFzZSI+CisJCQkJCQkJCTxvcHRpb24gaWQ9ImdudS5jcHAubGluay5vcHRpb24ubGlicy44MDA1Mjc0OTgiIG5hbWU9IkxpYnJhcmllcyAoLWwpIiBzdXBlckNsYXNzPSJnbnUuY3BwLmxpbmsub3B0aW9uLmxpYnMiIHVzZUJ5U2Nhbm5lckRpc2NvdmVyeT0iZmFsc2UiIHZhbHVlVHlwZT0ibGlicyI+CisJCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iYW50bHIiLz4KKwkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSJhbnRscjNjIi8+CisJCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0ib21lZ2EiLz4KKwkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSJib29zdF9zeXN0ZW0iLz4KKwkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSJib29zdF9maWxlc3lzdGVtIi8+CisJCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iYm9vc3RfcmVnZXgiLz4KKwkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSJjdmM0Ii8+CisJCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iejMiLz4KKwkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSJydCIvPgorCQkJCQkJCQkJPGxpc3RPcHRpb25WYWx1ZSBidWlsdEluPSJmYWxzZSIgdmFsdWU9ImdtcHh4Ii8+CisJCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iZ21wIi8+CisJCQkJCQkJCTwvb3B0aW9uPgorCQkJCQkJCQk8b3B0aW9uIGlkPSJnbnUuY3BwLmxpbmsub3B0aW9uLnBhdGhzLjg2NDg4NzQ4NSIgbmFtZT0iTGlicmFyeSBzZWFyY2ggcGF0aCAoLUwpIiBzdXBlckNsYXNzPSJnbnUuY3BwLmxpbmsub3B0aW9uLnBhdGhzIiB1c2VCeVNjYW5uZXJEaXNjb3Zlcnk9ImZhbHNlIiB2YWx1ZVR5cGU9ImxpYlBhdGhzIj4KKwkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSImcXVvdDske3dvcmtzcGFjZV9sb2M6LyR7UHJvak5hbWV9L2xpYi9saW51eDY0fSZxdW90OyIvPgorCQkJCQkJCQk8L29wdGlvbj4KKwkJCQkJCQkJPG9wdGlvbiBpZD0iZ251LmNwcC5saW5rLm9wdGlvbi51c2Vyb2Jqcy4yMzE1MjgwMjgiIG5hbWU9Ik90aGVyIG9iamVjdHMiIHN1cGVyQ2xhc3M9ImdudS5jcHAubGluay5vcHRpb24udXNlcm9ianMiIHVzZUJ5U2Nhbm5lckRpc2NvdmVyeT0iZmFsc2UiLz4KKwkJCQkJCQkJPG9wdGlvbiBpZD0iZ251LmNwcC5saW5rLm9wdGlvbi5zdHJpcC4xNTQwNjUyODI2IiBuYW1lPSJPbWl0IGFsbCBzeW1ib2wgaW5mb3JtYXRpb24gKC1zKSIgc3VwZXJDbGFzcz0iZ251LmNwcC5saW5rLm9wdGlvbi5zdHJpcCIgdXNlQnlTY2FubmVyRGlzY292ZXJ5PSJmYWxzZSIgdmFsdWU9ImZhbHNlIiB2YWx1ZVR5cGU9ImJvb2xlYW4iLz4KKwkJCQkJCQkJPG9wdGlvbiBkZWZhdWx0VmFsdWU9InRydWUiIGlkPSJnbnUuY3BwLmxpbmsub3B0aW9uLnNoYXJlZC4xODgzNzIzNzU0IiBuYW1lPSJTaGFyZWQgKC1zaGFyZWQpIiBzdXBlckNsYXNzPSJnbnUuY3BwLmxpbmsub3B0aW9uLnNoYXJlZCIgdXNlQnlTY2FubmVyRGlzY292ZXJ5PSJmYWxzZSIgdmFsdWU9ImZhbHNlIiB2YWx1ZVR5cGU9ImJvb2xlYW4iLz4KKwkJCQkJCQkJPGlucHV0VHlwZSBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcHAubGlua2VyLmlucHV0LjQyNjUyMjgwMSIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcHAubGlua2VyLmlucHV0Ij4KKwkJCQkJCQkJCTxhZGRpdGlvbmFsSW5wdXQga2luZD0iYWRkaXRpb25hbGlucHV0ZGVwZW5kZW5jeSIgcGF0aHM9IiQoVVNFUl9PQkpTKSIvPgorCQkJCQkJCQkJPGFkZGl0aW9uYWxJbnB1dCBraW5kPSJhZGRpdGlvbmFsaW5wdXQiIHBhdGhzPSIkKExJQlMpIi8+CisJCQkJCQkJCTwvaW5wdXRUeXBlPgorCQkJCQkJCQk8b3V0cHV0VHlwZSBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcHAubGlua2VyLm91dHB1dC5zby41Mzg0OTMyNjIiIG91dHB1dFByZWZpeD0iIiBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNwcC5saW5rZXIub3V0cHV0LnNvIi8+CisJCQkJCQkJPC90b29sPgorCQkJCQkJCTx0b29sIGNvbW1hbmQ9ImFzIiBjb21tYW5kTGluZVBhdHRlcm49IiR7Q09NTUFORH0gJHtGTEFHU30gJHtPVVRQVVRfRkxBR30gJHtPVVRQVVRfUFJFRklYfSR7T1VUUFVUfSAke0lOUFVUU30iIGVycm9yUGFyc2Vycz0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuR0FTRXJyb3JQYXJzZXIiIGlkPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmFzc2VtYmxlci5iYXNlLjE5NzcwNDU2NTUiIG5hbWU9IkdDQyBBc3NlbWJsZXIiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYXNzZW1ibGVyLmJhc2UiPgorCQkJCQkJCQk8aW5wdXRUeXBlIGlkPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmFzc2VtYmxlci5pbnB1dC4xMTY5NjE0MzA1IiBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmFzc2VtYmxlci5pbnB1dCIvPgorCQkJCQkJCTwvdG9vbD4KKwkJCQkJCTwvdG9vbENoYWluPgorCQkJCQk8L2ZvbGRlckluZm8+CisJCQkJCTxzb3VyY2VFbnRyaWVzPgorCQkJCQkJPGVudHJ5IGV4Y2x1ZGluZz0iY21ha2V8c3JjLWhlYWR8dXRlc3RzfGluY2x1ZGV8c3JjMzBjfGJha3VwfG91dHxzcmN8UmVsZWFzZSIgZmxhZ3M9IlZBTFVFX1dPUktTUEFDRV9QQVRIfFJFU09MVkVEIiBraW5kPSJzb3VyY2VQYXRoIiBuYW1lPSIiLz4KKwkJCQkJCTxlbnRyeSBleGNsdWRpbmc9ImNtYWtlIiBmbGFncz0iVkFMVUVfV09SS1NQQUNFX1BBVEh8UkVTT0xWRUQiIGtpbmQ9InNvdXJjZVBhdGgiIG5hbWU9InNyYyIvPgorCQkJCQk8L3NvdXJjZUVudHJpZXM+CisJCQkJPC9jb25maWd1cmF0aW9uPgorCQkJPC9zdG9yYWdlTW9kdWxlPgorCQkJPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLmV4dGVybmFsU2V0dGluZ3MiLz4KKwkJCTxzdG9yYWdlTW9kdWxlIG1vZHVsZUlkPSJvcmcuZWNsaXBzZS5jZHQuaW50ZXJuYWwudWkudGV4dC5jb21tZW50T3duZXJQcm9qZWN0TWFwcGluZ3MiLz4KKwkJCTxzdG9yYWdlTW9kdWxlIG1vZHVsZUlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5sYW5ndWFnZS5tYXBwaW5nIi8+CisJCTwvY2NvbmZpZ3VyYXRpb24+CisJPC9zdG9yYWdlTW9kdWxlPgorCTxzdG9yYWdlTW9kdWxlIG1vZHVsZUlkPSJjZHRCdWlsZFN5c3RlbSIgdmVyc2lvbj0iNC4wLjAiPgorCQk8cHJvamVjdCBpZD0iY29tLmNlYS5hdm0uY2R0Lm1hbmFnZWRidWlsZC50YXJnZXQuZ251LmN5Z3dpbi5leGUuNTk3Mjc0NjM0IiBuYW1lPSJFeGVjdXRhYmxlIiBwcm9qZWN0VHlwZT0iY2R0Lm1hbmFnZWRidWlsZC50YXJnZXQuZ251LmN5Z3dpbi5leGUiLz4KKwk8L3N0b3JhZ2VNb2R1bGU+CisJPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9InJlZnJlc2hTY29wZSIgdmVyc2lvbk51bWJlcj0iMiI+CisJCTxjb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb25OYW1lPSJEZWJ1Zy1TT0xWRVJTLUdNUCIvPgorCQk8Y29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uTmFtZT0iUmVsZWFzZSBQcmFnbWFEZXYgRXhlY3V0YWJsZSIvPgorCQk8Y29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uTmFtZT0iUmVsZWFzZVdpbjY0Ii8+CisJCTxjb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb25OYW1lPSJEZWJ1ZyBnKystNi54Ii8+CisJCTxjb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb25OYW1lPSJEZWJ1ZyBHaW5hQyI+CisJCQk8cmVzb3VyY2UgcmVzb3VyY2VUeXBlPSJQUk9KRUNUIiB3b3Jrc3BhY2VQYXRoPSIvY29tLmNlYS5hdm0iLz4KKwkJPC9jb25maWd1cmF0aW9uPgorCQk8Y29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uTmFtZT0iUmVsZWFzZSBQcmFnbWFEZXYgTGlicmFyeSIvPgorCQk8Y29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uTmFtZT0iRGVidWdTb2x2ZXIiLz4KKwkJPGNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbk5hbWU9IkRlYnVnU29sdmVycyIvPgorCQk8Y29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uTmFtZT0iRGVidWcgTlVNRVJJQytCT09TVCIvPgorCQk8Y29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uTmFtZT0iRGVidWcgU29sdmVycyIvPgorCQk8Y29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uTmFtZT0iUmVsZWFzZSB3aW5kb3dzIHg2NGJpdHMiLz4KKwkJPGNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbk5hbWU9IkRlYnVnLVNPTFZFUlMtTlVNRVJJQ1MiLz4KKwkJPGNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbk5hbWU9IlJlbGVhc2VQcmFnbWFMaXN0TGlicmFyeSIvPgorCQk8Y29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uTmFtZT0iRGVidWcrU09MVkVSK05VTUVSSUMrQk9PU1QiLz4KKwkJPGNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbk5hbWU9IkRlYnVnK05VTUVSSUMrQk9PU1QiPgorCQkJPHJlc291cmNlIHJlc291cmNlVHlwZT0iUFJPSkVDVCIgd29ya3NwYWNlUGF0aD0iL2NvbS5jZWEuYXZtIi8+CisJCTwvY29uZmlndXJhdGlvbj4KKwkJPGNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbk5hbWU9IlJlbGVhc2UiPgorCQkJPHJlc291cmNlIHJlc291cmNlVHlwZT0iUFJPSkVDVCIgd29ya3NwYWNlUGF0aD0iL2NvbS5jZWEuYXZtIi8+CisJCTwvY29uZmlndXJhdGlvbj4KKwkJPGNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbk5hbWU9IkRlYnVnIj4KKwkJCTxyZXNvdXJjZSByZXNvdXJjZVR5cGU9IlBST0pFQ1QiIHdvcmtzcGFjZVBhdGg9Ii9jb20uY2VhLmF2bSIvPgorCQk8L2NvbmZpZ3VyYXRpb24+CisJCTxjb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb25OYW1lPSJSZWxlYXNlUHJhZ21hTGlzdEV4ZWN1dGFibGUiLz4KKwk8L3N0b3JhZ2VNb2R1bGU+CisJPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkxhbmd1YWdlU2V0dGluZ3NQcm92aWRlcnMiLz4KKwk8c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0ib3JnLmVjbGlwc2UuY2R0LmludGVybmFsLnVpLnRleHQuY29tbWVudE93bmVyUHJvamVjdE1hcHBpbmdzIi8+CisJPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuYnVpbGR0YXJnZXRzIi8+CisJPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9InNjYW5uZXJDb25maWd1cmF0aW9uIj4KKwkJPGF1dG9kaXNjb3ZlcnkgZW5hYmxlZD0idHJ1ZSIgcHJvYmxlbVJlcG9ydGluZ0VuYWJsZWQ9InRydWUiIHNlbGVjdGVkUHJvZmlsZUlkPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLkdDQ1N0YW5kYXJkTWFrZVBlclByb2plY3RQcm9maWxlIi8+CisJCTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLkdDQ1N0YW5kYXJkTWFrZVBlclByb2plY3RQcm9maWxlIj4KKwkJCTxidWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KKwkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgorCQkJCTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgorCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJPC9zY2FubmVySW5mb1Byb3ZpZGVyPgorCQk8L3Byb2ZpbGU+CisJCTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLkdDQ1N0YW5kYXJkTWFrZVBlckZpbGVQcm9maWxlIj4KKwkJCTxidWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KKwkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJtYWtlZmlsZUdlbmVyYXRvciI+CisJCQkJPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1mICR7cHJvamVjdF9uYW1lfV9zY2QubWsiIGNvbW1hbmQ9Im1ha2UiIHVzZURlZmF1bHQ9InRydWUiLz4KKwkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KKwkJPC9wcm9maWxlPgorCQk8cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZSI+CisJCQk8YnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQk8b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+CisJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQk8L2J1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQk8c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KKwkJCQk8cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS8ke3NwZWNzX2ZpbGV9IiBjb21tYW5kPSJnY2MiIHVzZURlZmF1bHQ9InRydWUiLz4KKwkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KKwkJPC9wcm9maWxlPgorCQk8cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZUNQUCI+CisJCQk8YnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQk8b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+CisJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQk8L2J1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQk8c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KKwkJCQk8cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS9zcGVjcy5jcHAiIGNvbW1hbmQ9ImcrKyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgorCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJPC9zY2FubmVySW5mb1Byb3ZpZGVyPgorCQk8L3Byb2ZpbGU+CisJCTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NNYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlQyI+CisJCQk8YnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQk8b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+CisJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQk8L2J1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQk8c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KKwkJCQk8cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS9zcGVjcy5jIiBjb21tYW5kPSJnY2MiIHVzZURlZmF1bHQ9InRydWUiLz4KKwkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KKwkJPC9wcm9maWxlPgorCQk8cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDV2luTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZSI+CisJCQk8YnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQk8b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+CisJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQk8L2J1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQk8c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KKwkJCQk8cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS8ke3NwZWNzX2ZpbGV9IiBjb21tYW5kPSJnY2MiIHVzZURlZmF1bHQ9InRydWUiLz4KKwkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KKwkJPC9wcm9maWxlPgorCQk8cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDV2luTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZUNQUCI+CisJCQk8YnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQk8b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+CisJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQk8L2J1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQk8c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KKwkJCQk8cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS9zcGVjcy5jcHAiIGNvbW1hbmQ9ImcrKyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgorCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJPC9zY2FubmVySW5mb1Byb3ZpZGVyPgorCQk8L3Byb2ZpbGU+CisJCTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NXaW5NYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlQyI+CisJCQk8YnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQk8b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+CisJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQk8L2J1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQk8c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KKwkJCQk8cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS9zcGVjcy5jIiBjb21tYW5kPSJnY2MiIHVzZURlZmF1bHQ9InRydWUiLz4KKwkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KKwkJPC9wcm9maWxlPgorCQk8c2Nhbm5lckNvbmZpZ0J1aWxkSW5mbyBpbnN0YW5jZUlkPSJjZHQubWFuYWdlZGJ1aWxkLmNvbmZpZy5nbnUuY3lnd2luLmV4ZS5kZWJ1Zy44OTQ5MTU5MjA7Y2R0Lm1hbmFnZWRidWlsZC5jb25maWcuZ251LmN5Z3dpbi5leGUuZGVidWcuODk0OTE1OTIwLjtjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNwcC5jb21waWxlci5taW5ndy5iYXNlLjE5ODk4NjE1MzQ7Y2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcHAuY29tcGlsZXIuaW5wdXQuMTgyODAyNTU3MiI+CisJCQk8YXV0b2Rpc2NvdmVyeSBlbmFibGVkPSJ0cnVlIiBwcm9ibGVtUmVwb3J0aW5nRW5hYmxlZD0idHJ1ZSIgc2VsZWN0ZWRQcm9maWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLkdDQ01hbmFnZWRNYWtlUGVyUHJvamVjdFByb2ZpbGVDUFAiLz4KKwkJCTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLkdDQ1N0YW5kYXJkTWFrZVBlclByb2plY3RQcm9maWxlIj4KKwkJCQk8YnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQkJPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L2J1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+CisJCQkJCTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L3NjYW5uZXJJbmZvUHJvdmlkZXI+CisJCQk8L3Byb2ZpbGU+CisJCQk8cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5HQ0NTdGFuZGFyZE1ha2VQZXJGaWxlUHJvZmlsZSI+CisJCQkJPGJ1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJCTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9idWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJtYWtlZmlsZUdlbmVyYXRvciI+CisJCQkJCTxydW5BY3Rpb24gYXJndW1lbnRzPSItZiAke3Byb2plY3RfbmFtZX1fc2NkLm1rIiBjb21tYW5kPSJtYWtlIiB1c2VEZWZhdWx0PSJ0cnVlIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KKwkJCTwvcHJvZmlsZT4KKwkJCTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NNYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlIj4KKwkJCQk8YnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQkJPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L2J1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+CisJCQkJCTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L3NjYW5uZXJJbmZvUHJvdmlkZXI+CisJCQk8L3Byb2ZpbGU+CisJCQk8cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZUNQUCI+CisJCQkJPGJ1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJCTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9idWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgorCQkJCQk8cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS9zcGVjcy5jcHAiIGNvbW1hbmQ9ImcrKyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L3NjYW5uZXJJbmZvUHJvdmlkZXI+CisJCQk8L3Byb2ZpbGU+CisJCQk8cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZUMiPgorCQkJCTxidWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCQk8b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQk8c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KKwkJCQkJPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vc3BlY3MuYyIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KKwkJCTwvcHJvZmlsZT4KKwkJCTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NXaW5NYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlIj4KKwkJCQk8YnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQkJPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L2J1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+CisJCQkJCTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L3NjYW5uZXJJbmZvUHJvdmlkZXI+CisJCQk8L3Byb2ZpbGU+CisJCQk8cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDV2luTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZUNQUCI+CisJCQkJPGJ1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJCTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9idWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgorCQkJCQk8cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS9zcGVjcy5jcHAiIGNvbW1hbmQ9ImcrKyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L3NjYW5uZXJJbmZvUHJvdmlkZXI+CisJCQk8L3Byb2ZpbGU+CisJCQk8cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDV2luTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZUMiPgorCQkJCTxidWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCQk8b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQk8c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KKwkJCQkJPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vc3BlY3MuYyIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KKwkJCTwvcHJvZmlsZT4KKwkJPC9zY2FubmVyQ29uZmlnQnVpbGRJbmZvPgorCQk8c2Nhbm5lckNvbmZpZ0J1aWxkSW5mbyBpbnN0YW5jZUlkPSJjZHQubWFuYWdlZGJ1aWxkLmNvbmZpZy5nbnUuY3lnd2luLmV4ZS5kZWJ1Zy44OTQ5MTU5MjA7Y2R0Lm1hbmFnZWRidWlsZC5jb25maWcuZ251LmN5Z3dpbi5leGUuZGVidWcuODk0OTE1OTIwLjtjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmMuY29tcGlsZXIubWluZ3cuYmFzZS4yMDUxODQxNTIzO2NkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYy5jb21waWxlci5pbnB1dC4xMTgyNTE2NzI2Ij4KKwkJCTxhdXRvZGlzY292ZXJ5IGVuYWJsZWQ9InRydWUiIHByb2JsZW1SZXBvcnRpbmdFbmFibGVkPSJ0cnVlIiBzZWxlY3RlZFByb2ZpbGVJZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZUMiLz4KKwkJCTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLkdDQ1N0YW5kYXJkTWFrZVBlclByb2plY3RQcm9maWxlIj4KKwkJCQk8YnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQkJPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L2J1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+CisJCQkJCTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L3NjYW5uZXJJbmZvUHJvdmlkZXI+CisJCQk8L3Byb2ZpbGU+CisJCQk8cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5HQ0NTdGFuZGFyZE1ha2VQZXJGaWxlUHJvZmlsZSI+CisJCQkJPGJ1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJCTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9idWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJtYWtlZmlsZUdlbmVyYXRvciI+CisJCQkJCTxydW5BY3Rpb24gYXJndW1lbnRzPSItZiAke3Byb2plY3RfbmFtZX1fc2NkLm1rIiBjb21tYW5kPSJtYWtlIiB1c2VEZWZhdWx0PSJ0cnVlIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KKwkJCTwvcHJvZmlsZT4KKwkJCTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NNYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlIj4KKwkJCQk8YnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQkJPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L2J1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+CisJCQkJCTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L3NjYW5uZXJJbmZvUHJvdmlkZXI+CisJCQk8L3Byb2ZpbGU+CisJCQk8cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZUNQUCI+CisJCQkJPGJ1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJCTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9idWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgorCQkJCQk8cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS9zcGVjcy5jcHAiIGNvbW1hbmQ9ImcrKyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L3NjYW5uZXJJbmZvUHJvdmlkZXI+CisJCQk8L3Byb2ZpbGU+CisJCQk8cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZUMiPgorCQkJCTxidWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCQk8b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQk8c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KKwkJCQkJPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vc3BlY3MuYyIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KKwkJCTwvcHJvZmlsZT4KKwkJCTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NXaW5NYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlIj4KKwkJCQk8YnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQkJPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L2J1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+CisJCQkJCTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L3NjYW5uZXJJbmZvUHJvdmlkZXI+CisJCQk8L3Byb2ZpbGU+CisJCQk8cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDV2luTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZUNQUCI+CisJCQkJPGJ1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJCTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9idWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgorCQkJCQk8cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS9zcGVjcy5jcHAiIGNvbW1hbmQ9ImcrKyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L3NjYW5uZXJJbmZvUHJvdmlkZXI+CisJCQk8L3Byb2ZpbGU+CisJCQk8cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDV2luTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZUMiPgorCQkJCTxidWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCQk8b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQk8c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KKwkJCQkJPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vc3BlY3MuYyIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KKwkJCTwvcHJvZmlsZT4KKwkJPC9zY2FubmVyQ29uZmlnQnVpbGRJbmZvPgorCQk8c2Nhbm5lckNvbmZpZ0J1aWxkSW5mbyBpbnN0YW5jZUlkPSJjZHQubWFuYWdlZGJ1aWxkLmNvbmZpZy5nbnUuY3lnd2luLmV4ZS5kZWJ1Zy44OTQ5MTU5MjA7Y2R0Lm1hbmFnZWRidWlsZC5jb25maWcuZ251LmN5Z3dpbi5leGUuZGVidWcuODk0OTE1OTIwLjtjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmMuY29tcGlsZXIuY3lnd2luLmV4ZS5kZWJ1Zy43OTM1MTk2NTk7Y2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jLmNvbXBpbGVyLmlucHV0LmN5Z3dpbi4xODU5NDA1MjIxIj4KKwkJCTxhdXRvZGlzY292ZXJ5IGVuYWJsZWQ9InRydWUiIHByb2JsZW1SZXBvcnRpbmdFbmFibGVkPSJ0cnVlIiBzZWxlY3RlZFByb2ZpbGVJZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDV2luTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZUMiLz4KKwkJCTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLkdDQ1N0YW5kYXJkTWFrZVBlclByb2plY3RQcm9maWxlIj4KKwkJCQk8YnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQkJPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L2J1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+CisJCQkJCTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L3NjYW5uZXJJbmZvUHJvdmlkZXI+CisJCQk8L3Byb2ZpbGU+CisJCQk8cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5HQ0NTdGFuZGFyZE1ha2VQZXJGaWxlUHJvZmlsZSI+CisJCQkJPGJ1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJCTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9idWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJtYWtlZmlsZUdlbmVyYXRvciI+CisJCQkJCTxydW5BY3Rpb24gYXJndW1lbnRzPSItZiAke3Byb2plY3RfbmFtZX1fc2NkLm1rIiBjb21tYW5kPSJtYWtlIiB1c2VEZWZhdWx0PSJ0cnVlIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KKwkJCTwvcHJvZmlsZT4KKwkJCTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NNYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlIj4KKwkJCQk8YnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQkJPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L2J1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+CisJCQkJCTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L3NjYW5uZXJJbmZvUHJvdmlkZXI+CisJCQk8L3Byb2ZpbGU+CisJCQk8cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZUNQUCI+CisJCQkJPGJ1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJCTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9idWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgorCQkJCQk8cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS9zcGVjcy5jcHAiIGNvbW1hbmQ9ImcrKyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L3NjYW5uZXJJbmZvUHJvdmlkZXI+CisJCQk8L3Byb2ZpbGU+CisJCQk8cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZUMiPgorCQkJCTxidWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCQk8b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQk8c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KKwkJCQkJPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vc3BlY3MuYyIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KKwkJCTwvcHJvZmlsZT4KKwkJCTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NXaW5NYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlIj4KKwkJCQk8YnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQkJPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L2J1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+CisJCQkJCTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L3NjYW5uZXJJbmZvUHJvdmlkZXI+CisJCQk8L3Byb2ZpbGU+CisJCQk8cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDV2luTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZUNQUCI+CisJCQkJPGJ1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJCTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9idWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgorCQkJCQk8cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS9zcGVjcy5jcHAiIGNvbW1hbmQ9ImcrKyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L3NjYW5uZXJJbmZvUHJvdmlkZXI+CisJCQk8L3Byb2ZpbGU+CisJCQk8cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDV2luTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZUMiPgorCQkJCTxidWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCQk8b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQk8c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KKwkJCQkJPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vc3BlY3MuYyIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KKwkJCTwvcHJvZmlsZT4KKwkJPC9zY2FubmVyQ29uZmlnQnVpbGRJbmZvPgorCQk8c2Nhbm5lckNvbmZpZ0J1aWxkSW5mbyBpbnN0YW5jZUlkPSJjZHQubWFuYWdlZGJ1aWxkLmNvbmZpZy5nbnUuY3lnd2luLmV4ZS5kZWJ1Zy44OTQ5MTU5MjAuNjY4MzI5NTI5LjE3NTIzMjc3NTQ7Y2R0Lm1hbmFnZWRidWlsZC5jb25maWcuZ251LmN5Z3dpbi5leGUuZGVidWcuODk0OTE1OTIwLjY2ODMyOTUyOS4xNzUyMzI3NzU0LjtjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNwcC5jb21waWxlci5taW5ndy5iYXNlLjk3NjQ0OTMxNDtjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNwcC5jb21waWxlci5pbnB1dC4xNzYxNzMxNDc4Ij4KKwkJCTxhdXRvZGlzY292ZXJ5IGVuYWJsZWQ9InRydWUiIHByb2JsZW1SZXBvcnRpbmdFbmFibGVkPSJ0cnVlIiBzZWxlY3RlZFByb2ZpbGVJZD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5HQ0NTdGFuZGFyZE1ha2VQZXJQcm9qZWN0UHJvZmlsZSIvPgorCQkJPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuR0NDU3RhbmRhcmRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgorCQkJCTxidWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCQk8b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQk8c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KKwkJCQkJPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vJHtzcGVjc19maWxlfSIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KKwkJCTwvcHJvZmlsZT4KKwkJCTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLkdDQ1N0YW5kYXJkTWFrZVBlckZpbGVQcm9maWxlIj4KKwkJCQk8YnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQkJPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L2J1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9Im1ha2VmaWxlR2VuZXJhdG9yIj4KKwkJCQkJPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1mICR7cHJvamVjdF9uYW1lfV9zY2QubWsiIGNvbW1hbmQ9Im1ha2UiIHVzZURlZmF1bHQ9InRydWUiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9zY2FubmVySW5mb1Byb3ZpZGVyPgorCQkJPC9wcm9maWxlPgorCQkJPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLkdDQ01hbmFnZWRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgorCQkJCTxidWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCQk8b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQk8c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KKwkJCQkJPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vJHtzcGVjc19maWxlfSIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KKwkJCTwvcHJvZmlsZT4KKwkJCTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NNYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlQ1BQIj4KKwkJCQk8YnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQkJPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L2J1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+CisJCQkJCTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259L3NwZWNzLmNwcCIgY29tbWFuZD0iZysrIiB1c2VEZWZhdWx0PSJ0cnVlIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KKwkJCTwvcHJvZmlsZT4KKwkJCTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NNYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlQyI+CisJCQkJPGJ1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJCTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9idWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgorCQkJCQk8cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS9zcGVjcy5jIiBjb21tYW5kPSJnY2MiIHVzZURlZmF1bHQ9InRydWUiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9zY2FubmVySW5mb1Byb3ZpZGVyPgorCQkJPC9wcm9maWxlPgorCQkJPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLkdDQ1dpbk1hbmFnZWRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgorCQkJCTxidWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCQk8b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQk8c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KKwkJCQkJPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vJHtzcGVjc19maWxlfSIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KKwkJCTwvcHJvZmlsZT4KKwkJCTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NXaW5NYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlQ1BQIj4KKwkJCQk8YnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQkJPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L2J1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+CisJCQkJCTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259L3NwZWNzLmNwcCIgY29tbWFuZD0iZysrIiB1c2VEZWZhdWx0PSJ0cnVlIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KKwkJCTwvcHJvZmlsZT4KKwkJCTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NXaW5NYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlQyI+CisJCQkJPGJ1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJCTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9idWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgorCQkJCQk8cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS9zcGVjcy5jIiBjb21tYW5kPSJnY2MiIHVzZURlZmF1bHQ9InRydWUiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9zY2FubmVySW5mb1Byb3ZpZGVyPgorCQkJPC9wcm9maWxlPgorCQk8L3NjYW5uZXJDb25maWdCdWlsZEluZm8+CisJCTxzY2FubmVyQ29uZmlnQnVpbGRJbmZvIGluc3RhbmNlSWQ9ImNkdC5tYW5hZ2VkYnVpbGQuY29uZmlnLmdudS5jeWd3aW4uZXhlLmRlYnVnLjg5NDkxNTkyMC42NjgzMjk1MjkuMTc1MjMyNzc1NDtjZHQubWFuYWdlZGJ1aWxkLmNvbmZpZy5nbnUuY3lnd2luLmV4ZS5kZWJ1Zy44OTQ5MTU5MjAuNjY4MzI5NTI5LjE3NTIzMjc3NTQuO2NkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYy5jb21waWxlci5taW5ndy5iYXNlLjQ5NTE0MTk5NTtjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmMuY29tcGlsZXIuaW5wdXQuMjExNzU4Nzk3NyI+CisJCQk8YXV0b2Rpc2NvdmVyeSBlbmFibGVkPSJ0cnVlIiBwcm9ibGVtUmVwb3J0aW5nRW5hYmxlZD0idHJ1ZSIgc2VsZWN0ZWRQcm9maWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuR0NDU3RhbmRhcmRNYWtlUGVyUHJvamVjdFByb2ZpbGUiLz4KKwkJCTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLkdDQ1N0YW5kYXJkTWFrZVBlclByb2plY3RQcm9maWxlIj4KKwkJCQk8YnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQkJPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L2J1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+CisJCQkJCTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L3NjYW5uZXJJbmZvUHJvdmlkZXI+CisJCQk8L3Byb2ZpbGU+CisJCQk8cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5HQ0NTdGFuZGFyZE1ha2VQZXJGaWxlUHJvZmlsZSI+CisJCQkJPGJ1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJCTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9idWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJtYWtlZmlsZUdlbmVyYXRvciI+CisJCQkJCTxydW5BY3Rpb24gYXJndW1lbnRzPSItZiAke3Byb2plY3RfbmFtZX1fc2NkLm1rIiBjb21tYW5kPSJtYWtlIiB1c2VEZWZhdWx0PSJ0cnVlIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KKwkJCTwvcHJvZmlsZT4KKwkJCTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NNYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlIj4KKwkJCQk8YnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQkJPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L2J1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+CisJCQkJCTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L3NjYW5uZXJJbmZvUHJvdmlkZXI+CisJCQk8L3Byb2ZpbGU+CisJCQk8cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZUNQUCI+CisJCQkJPGJ1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJCTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9idWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgorCQkJCQk8cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS9zcGVjcy5jcHAiIGNvbW1hbmQ9ImcrKyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L3NjYW5uZXJJbmZvUHJvdmlkZXI+CisJCQk8L3Byb2ZpbGU+CisJCQk8cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZUMiPgorCQkJCTxidWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCQk8b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQk8c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KKwkJCQkJPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vc3BlY3MuYyIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KKwkJCTwvcHJvZmlsZT4KKwkJCTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NXaW5NYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlIj4KKwkJCQk8YnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQkJPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L2J1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+CisJCQkJCTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L3NjYW5uZXJJbmZvUHJvdmlkZXI+CisJCQk8L3Byb2ZpbGU+CisJCQk8cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDV2luTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZUNQUCI+CisJCQkJPGJ1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJCTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9idWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgorCQkJCQk8cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS9zcGVjcy5jcHAiIGNvbW1hbmQ9ImcrKyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L3NjYW5uZXJJbmZvUHJvdmlkZXI+CisJCQk8L3Byb2ZpbGU+CisJCQk8cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDV2luTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZUMiPgorCQkJCTxidWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCQk8b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQk8c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KKwkJCQkJPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vc3BlY3MuYyIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KKwkJCTwvcHJvZmlsZT4KKwkJPC9zY2FubmVyQ29uZmlnQnVpbGRJbmZvPgorCQk8c2Nhbm5lckNvbmZpZ0J1aWxkSW5mbyBpbnN0YW5jZUlkPSJjZHQubWFuYWdlZGJ1aWxkLmNvbmZpZy5nbnUuY3lnd2luLmV4ZS5kZWJ1Zy44OTQ5MTU5MjA7Y2R0Lm1hbmFnZWRidWlsZC5jb25maWcuZ251LmN5Z3dpbi5leGUuZGVidWcuODk0OTE1OTIwLjtjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNwcC5jb21waWxlci5jeWd3aW4uZXhlLmRlYnVnLjE3Nzc2OTE7Y2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcHAuY29tcGlsZXIuaW5wdXQuY3lnd2luLjEyNDQ5MjAzNzYiPgorCQkJPGF1dG9kaXNjb3ZlcnkgZW5hYmxlZD0idHJ1ZSIgcHJvYmxlbVJlcG9ydGluZ0VuYWJsZWQ9InRydWUiIHNlbGVjdGVkUHJvZmlsZUlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NXaW5NYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlQ1BQIi8+CisJCQk8cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5HQ0NTdGFuZGFyZE1ha2VQZXJQcm9qZWN0UHJvZmlsZSI+CisJCQkJPGJ1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJCTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9idWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgorCQkJCQk8cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS8ke3NwZWNzX2ZpbGV9IiBjb21tYW5kPSJnY2MiIHVzZURlZmF1bHQ9InRydWUiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9zY2FubmVySW5mb1Byb3ZpZGVyPgorCQkJPC9wcm9maWxlPgorCQkJPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuR0NDU3RhbmRhcmRNYWtlUGVyRmlsZVByb2ZpbGUiPgorCQkJCTxidWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCQk8b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQk8c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ibWFrZWZpbGVHZW5lcmF0b3IiPgorCQkJCQk8cnVuQWN0aW9uIGFyZ3VtZW50cz0iLWYgJHtwcm9qZWN0X25hbWV9X3NjZC5tayIgY29tbWFuZD0ibWFrZSIgdXNlRGVmYXVsdD0idHJ1ZSIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L3NjYW5uZXJJbmZvUHJvdmlkZXI+CisJCQk8L3Byb2ZpbGU+CisJCQk8cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZSI+CisJCQkJPGJ1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJCTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9idWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgorCQkJCQk8cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS8ke3NwZWNzX2ZpbGV9IiBjb21tYW5kPSJnY2MiIHVzZURlZmF1bHQ9InRydWUiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9zY2FubmVySW5mb1Byb3ZpZGVyPgorCQkJPC9wcm9maWxlPgorCQkJPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLkdDQ01hbmFnZWRNYWtlUGVyUHJvamVjdFByb2ZpbGVDUFAiPgorCQkJCTxidWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCQk8b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQk8c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KKwkJCQkJPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vc3BlY3MuY3BwIiBjb21tYW5kPSJnKysiIHVzZURlZmF1bHQ9InRydWUiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9zY2FubmVySW5mb1Byb3ZpZGVyPgorCQkJPC9wcm9maWxlPgorCQkJPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLkdDQ01hbmFnZWRNYWtlUGVyUHJvamVjdFByb2ZpbGVDIj4KKwkJCQk8YnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQkJPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L2J1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+CisJCQkJCTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259L3NwZWNzLmMiIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L3NjYW5uZXJJbmZvUHJvdmlkZXI+CisJCQk8L3Byb2ZpbGU+CisJCQk8cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDV2luTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZSI+CisJCQkJPGJ1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJCTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9idWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgorCQkJCQk8cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS8ke3NwZWNzX2ZpbGV9IiBjb21tYW5kPSJnY2MiIHVzZURlZmF1bHQ9InRydWUiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9zY2FubmVySW5mb1Byb3ZpZGVyPgorCQkJPC9wcm9maWxlPgorCQkJPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLkdDQ1dpbk1hbmFnZWRNYWtlUGVyUHJvamVjdFByb2ZpbGVDUFAiPgorCQkJCTxidWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCQk8b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQk8c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KKwkJCQkJPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vc3BlY3MuY3BwIiBjb21tYW5kPSJnKysiIHVzZURlZmF1bHQ9InRydWUiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9zY2FubmVySW5mb1Byb3ZpZGVyPgorCQkJPC9wcm9maWxlPgorCQkJPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLkdDQ1dpbk1hbmFnZWRNYWtlUGVyUHJvamVjdFByb2ZpbGVDIj4KKwkJCQk8YnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQkJPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L2J1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+CisJCQkJCTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259L3NwZWNzLmMiIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L3NjYW5uZXJJbmZvUHJvdmlkZXI+CisJCQk8L3Byb2ZpbGU+CisJCTwvc2Nhbm5lckNvbmZpZ0J1aWxkSW5mbz4KKwkJPHNjYW5uZXJDb25maWdCdWlsZEluZm8gaW5zdGFuY2VJZD0iY2R0Lm1hbmFnZWRidWlsZC5jb25maWcuZ251LmN5Z3dpbi5leGUucmVsZWFzZS4xNzUxMTkxMDQ5O2NkdC5tYW5hZ2VkYnVpbGQuY29uZmlnLmdudS5jeWd3aW4uZXhlLnJlbGVhc2UuMTc1MTE5MTA0OS47Y2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jLmNvbXBpbGVyLmN5Z3dpbi5leGUucmVsZWFzZS44MjE5MDAwMjM7Y2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jLmNvbXBpbGVyLmlucHV0LmN5Z3dpbi4xMDM3MjE3NzQ1Ij4KKwkJCTxhdXRvZGlzY292ZXJ5IGVuYWJsZWQ9InRydWUiIHByb2JsZW1SZXBvcnRpbmdFbmFibGVkPSJ0cnVlIiBzZWxlY3RlZFByb2ZpbGVJZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDV2luTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZUMiLz4KKwkJCTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLkdDQ1N0YW5kYXJkTWFrZVBlclByb2plY3RQcm9maWxlIj4KKwkJCQk8YnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQkJPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L2J1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+CisJCQkJCTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L3NjYW5uZXJJbmZvUHJvdmlkZXI+CisJCQk8L3Byb2ZpbGU+CisJCQk8cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5HQ0NTdGFuZGFyZE1ha2VQZXJGaWxlUHJvZmlsZSI+CisJCQkJPGJ1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJCTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9idWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJtYWtlZmlsZUdlbmVyYXRvciI+CisJCQkJCTxydW5BY3Rpb24gYXJndW1lbnRzPSItZiAke3Byb2plY3RfbmFtZX1fc2NkLm1rIiBjb21tYW5kPSJtYWtlIiB1c2VEZWZhdWx0PSJ0cnVlIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KKwkJCTwvcHJvZmlsZT4KKwkJCTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NNYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlIj4KKwkJCQk8YnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQkJPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L2J1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+CisJCQkJCTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L3NjYW5uZXJJbmZvUHJvdmlkZXI+CisJCQk8L3Byb2ZpbGU+CisJCQk8cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZUNQUCI+CisJCQkJPGJ1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJCTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9idWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgorCQkJCQk8cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS9zcGVjcy5jcHAiIGNvbW1hbmQ9ImcrKyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L3NjYW5uZXJJbmZvUHJvdmlkZXI+CisJCQk8L3Byb2ZpbGU+CisJCQk8cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZUMiPgorCQkJCTxidWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCQk8b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQk8c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KKwkJCQkJPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vc3BlY3MuYyIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KKwkJCTwvcHJvZmlsZT4KKwkJCTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NXaW5NYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlIj4KKwkJCQk8YnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQkJPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L2J1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+CisJCQkJCTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L3NjYW5uZXJJbmZvUHJvdmlkZXI+CisJCQk8L3Byb2ZpbGU+CisJCQk8cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDV2luTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZUNQUCI+CisJCQkJPGJ1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJCTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9idWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgorCQkJCQk8cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS9zcGVjcy5jcHAiIGNvbW1hbmQ9ImcrKyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L3NjYW5uZXJJbmZvUHJvdmlkZXI+CisJCQk8L3Byb2ZpbGU+CisJCQk8cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDV2luTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZUMiPgorCQkJCTxidWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCQk8b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQk8c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KKwkJCQkJPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vc3BlY3MuYyIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KKwkJCTwvcHJvZmlsZT4KKwkJPC9zY2FubmVyQ29uZmlnQnVpbGRJbmZvPgorCQk8c2Nhbm5lckNvbmZpZ0J1aWxkSW5mbyBpbnN0YW5jZUlkPSJjZHQubWFuYWdlZGJ1aWxkLmNvbmZpZy5nbnUuY3lnd2luLmV4ZS5yZWxlYXNlLjE3NTExOTEwNDk7Y2R0Lm1hbmFnZWRidWlsZC5jb25maWcuZ251LmN5Z3dpbi5leGUucmVsZWFzZS4xNzUxMTkxMDQ5LjtjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNwcC5jb21waWxlci5jeWd3aW4uZXhlLnJlbGVhc2UuNTk5MTI3MzA3O2NkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3BwLmNvbXBpbGVyLmlucHV0LmN5Z3dpbi4xNDExMDgzMDc2Ij4KKwkJCTxhdXRvZGlzY292ZXJ5IGVuYWJsZWQ9InRydWUiIHByb2JsZW1SZXBvcnRpbmdFbmFibGVkPSJ0cnVlIiBzZWxlY3RlZFByb2ZpbGVJZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDV2luTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZUNQUCIvPgorCQkJPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuR0NDU3RhbmRhcmRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgorCQkJCTxidWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCQk8b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQk8c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KKwkJCQkJPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vJHtzcGVjc19maWxlfSIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KKwkJCTwvcHJvZmlsZT4KKwkJCTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLkdDQ1N0YW5kYXJkTWFrZVBlckZpbGVQcm9maWxlIj4KKwkJCQk8YnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQkJPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L2J1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9Im1ha2VmaWxlR2VuZXJhdG9yIj4KKwkJCQkJPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1mICR7cHJvamVjdF9uYW1lfV9zY2QubWsiIGNvbW1hbmQ9Im1ha2UiIHVzZURlZmF1bHQ9InRydWUiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9zY2FubmVySW5mb1Byb3ZpZGVyPgorCQkJPC9wcm9maWxlPgorCQkJPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLkdDQ01hbmFnZWRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgorCQkJCTxidWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCQk8b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQk8c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KKwkJCQkJPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vJHtzcGVjc19maWxlfSIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KKwkJCTwvcHJvZmlsZT4KKwkJCTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NNYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlQ1BQIj4KKwkJCQk8YnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQkJPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L2J1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+CisJCQkJCTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259L3NwZWNzLmNwcCIgY29tbWFuZD0iZysrIiB1c2VEZWZhdWx0PSJ0cnVlIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KKwkJCTwvcHJvZmlsZT4KKwkJCTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NNYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlQyI+CisJCQkJPGJ1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJCTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9idWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgorCQkJCQk8cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS9zcGVjcy5jIiBjb21tYW5kPSJnY2MiIHVzZURlZmF1bHQ9InRydWUiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9zY2FubmVySW5mb1Byb3ZpZGVyPgorCQkJPC9wcm9maWxlPgorCQkJPHByb2ZpbGUgaWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLkdDQ1dpbk1hbmFnZWRNYWtlUGVyUHJvamVjdFByb2ZpbGUiPgorCQkJCTxidWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCQk8b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQk8c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KKwkJCQkJPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vJHtzcGVjc19maWxlfSIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KKwkJCTwvcHJvZmlsZT4KKwkJCTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NXaW5NYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlQ1BQIj4KKwkJCQk8YnVpbGRPdXRwdXRQcm92aWRlcj4KKwkJCQkJPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgorCQkJCQk8cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KKwkJCQk8L2J1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+CisJCQkJCTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259L3NwZWNzLmNwcCIgY29tbWFuZD0iZysrIiB1c2VEZWZhdWx0PSJ0cnVlIi8+CisJCQkJCTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgorCQkJCTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KKwkJCTwvcHJvZmlsZT4KKwkJCTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NXaW5NYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlQyI+CisJCQkJPGJ1aWxkT3V0cHV0UHJvdmlkZXI+CisJCQkJCTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9idWlsZE91dHB1dFByb3ZpZGVyPgorCQkJCTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgorCQkJCQk8cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS9zcGVjcy5jIiBjb21tYW5kPSJnY2MiIHVzZURlZmF1bHQ9InRydWUiLz4KKwkJCQkJPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+CisJCQkJPC9zY2FubmVySW5mb1Byb3ZpZGVyPgorCQkJPC9wcm9maWxlPgorCQk8L3NjYW5uZXJDb25maWdCdWlsZEluZm8+CisJPC9zdG9yYWdlTW9kdWxlPgorPC9jcHJvamVjdD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvLmdpdGlnbm9yZSBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2U1OWE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNCBAQAorL0RlYnVnKgorL1JlbGVhc2UqCisqLm1kLmh0bWwKKy9idWlsZHMvCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4Ly5wcm9qZWN0IGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTlmYjRmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC8ucHJvamVjdApAQCAtMCwwICsxLDgyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS5lZm0uc3ltYmV4PC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuZ2VubWFrZWJ1aWxkZXI8L25hbWU+CisJCQk8dHJpZ2dlcnM+Y2xlYW4sZnVsbCxpbmNyZW1lbnRhbCw8L3RyaWdnZXJzPgorCQkJPGFyZ3VtZW50cz4KKwkJCQk8ZGljdGlvbmFyeT4KKwkJCQkJPGtleT4/bmFtZT88L2tleT4KKwkJCQkJPHZhbHVlPjwvdmFsdWU+CisJCQkJPC9kaWN0aW9uYXJ5PgorCQkJCTxkaWN0aW9uYXJ5PgorCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuYXBwZW5kX2Vudmlyb25tZW50PC9rZXk+CisJCQkJCTx2YWx1ZT50cnVlPC92YWx1ZT4KKwkJCQk8L2RpY3Rpb25hcnk+CisJCQkJPGRpY3Rpb25hcnk+CisJCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5hdXRvQnVpbGRUYXJnZXQ8L2tleT4KKwkJCQkJPHZhbHVlPmFsbDwvdmFsdWU+CisJCQkJPC9kaWN0aW9uYXJ5PgorCQkJCTxkaWN0aW9uYXJ5PgorCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuYnVpbGRBcmd1bWVudHM8L2tleT4KKwkJCQkJPHZhbHVlPi1rIC1qNDwvdmFsdWU+CisJCQkJPC9kaWN0aW9uYXJ5PgorCQkJCTxkaWN0aW9uYXJ5PgorCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuYnVpbGRDb21tYW5kPC9rZXk+CisJCQkJCTx2YWx1ZT5tYWtlPC92YWx1ZT4KKwkJCQk8L2RpY3Rpb25hcnk+CisJCQkJPGRpY3Rpb25hcnk+CisJCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5idWlsZExvY2F0aW9uPC9rZXk+CisJCQkJCTx2YWx1ZT4ke3dvcmtzcGFjZV9sb2M6L2NvbS5jZWEuYXZtL0RlYnVnfTwvdmFsdWU+CisJCQkJPC9kaWN0aW9uYXJ5PgorCQkJCTxkaWN0aW9uYXJ5PgorCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuY2xlYW5CdWlsZFRhcmdldDwva2V5PgorCQkJCQk8dmFsdWU+Y2xlYW48L3ZhbHVlPgorCQkJCTwvZGljdGlvbmFyeT4KKwkJCQk8ZGljdGlvbmFyeT4KKwkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmNvbnRlbnRzPC9rZXk+CisJCQkJCTx2YWx1ZT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmFjdGl2ZUNvbmZpZ1NldHRpbmdzPC92YWx1ZT4KKwkJCQk8L2RpY3Rpb25hcnk+CisJCQkJPGRpY3Rpb25hcnk+CisJCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5lbmFibGVBdXRvQnVpbGQ8L2tleT4KKwkJCQkJPHZhbHVlPmZhbHNlPC92YWx1ZT4KKwkJCQk8L2RpY3Rpb25hcnk+CisJCQkJPGRpY3Rpb25hcnk+CisJCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5lbmFibGVDbGVhbkJ1aWxkPC9rZXk+CisJCQkJCTx2YWx1ZT50cnVlPC92YWx1ZT4KKwkJCQk8L2RpY3Rpb25hcnk+CisJCQkJPGRpY3Rpb25hcnk+CisJCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5lbmFibGVGdWxsQnVpbGQ8L2tleT4KKwkJCQkJPHZhbHVlPnRydWU8L3ZhbHVlPgorCQkJCTwvZGljdGlvbmFyeT4KKwkJCQk8ZGljdGlvbmFyeT4KKwkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmZ1bGxCdWlsZFRhcmdldDwva2V5PgorCQkJCQk8dmFsdWU+YWxsPC92YWx1ZT4KKwkJCQk8L2RpY3Rpb25hcnk+CisJCQkJPGRpY3Rpb25hcnk+CisJCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5zdG9wT25FcnJvcjwva2V5PgorCQkJCQk8dmFsdWU+ZmFsc2U8L3ZhbHVlPgorCQkJCTwvZGljdGlvbmFyeT4KKwkJCQk8ZGljdGlvbmFyeT4KKwkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLnVzZURlZmF1bHRCdWlsZENtZDwva2V5PgorCQkJCQk8dmFsdWU+dHJ1ZTwvdmFsdWU+CisJCQkJPC9kaWN0aW9uYXJ5PgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuU2Nhbm5lckNvbmZpZ0J1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmNkdC5jb3JlLmNjbmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuU2Nhbm5lckNvbmZpZ05hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLm1hbmFnZWRCdWlsZE5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmNkdC5jb3JlLmNuYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvQ0hBTkdFTE9HLm1kIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9DSEFOR0VMT0cubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM4OWU3ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvQ0hBTkdFTE9HLm1kCkBAIC0wLDAgKzEgQEAKKyMgRUZNLVNZTUJFWCA6IEVjbGlwc2UgRm9ybWFsIE1vZGVsaW5nIC0gU3ltYm9saWMgRXhlY3V0aW9uIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L0NNYWtlTGlzdHMudHh0IGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTc3ZjlmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDg5IEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorIyAgICAgICAgICAgICAgICAgICAgQ01ha2UgTWFzdGVyIEZpbGUgZm9yIFN5bWJleCBBbGwNCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorIw0KKyMgTm90ZSA6IFRoaXMgZmlsZSBkZWZpbmVzIHRoZSB3aG9sZSBwcm9jZXNzIA0KKyMNCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorDQorIyBNaW5pbXVtIHJlcXVpcmVkIENNYWtlIHZlcnNpb24NCitjbWFrZV9taW5pbXVtX3JlcXVpcmVkIChWRVJTSU9OIDIuOCBGQVRBTF9FUlJPUikNCisNCitwcm9qZWN0IChTeW1iZXhfYWxsIENYWCBDKQ0KKw0KKyMgVGVsbCBjbWFrZSB3aGVyZSB0byBmaW5kIGl0cyBvd24gbW9kdWxlcw0KK2xpc3QgKEFQUEVORCBDTUFLRV9NT0RVTEVfUEFUSCAke0NNQUtFX1NPVVJDRV9ESVJ9L2NtYWtlKSAjIENvbW1vbiBtb2R1bGVzDQorDQorIyBTeXN0ZW0gZGV0ZWN0aW9uDQoraW5jbHVkZSAoRGV0ZWN0U3lzdGVtKQ0KKw0KKyMgVG9vbGNoYWluIGRldGVjdGlvbg0KK2luY2x1ZGUgKERldGVjdFRvb2xDaGFpbikNCisNCisjIFNlYXJjaGluZyBmb3IgY29uZmlndXJhdGlvbiBtYW5hZ2VtZW50IHRvb2xzIA0KK2luY2x1ZGUgKExvb2tGb3JTQ00pDQorDQorIyBTb3VyY2VzIHJldmlzaW9uDQoraW5jbHVkZSAoRGV0ZWN0UmV2aXNpb24pDQorDQorI8KgR2VuZXJpYyBvcHRpb25zIHRoYXQgc2hvdWxkIHByb3BhZ2F0ZSB0byBhbGwgc3VidGFyZ2V0cw0KKyMgKGhlbmNlIHRoZXkgbXVzdCBiZSBsb2FkZWQgYmVmb3JlIHRoZSBwcm9qZWN0IHN0cnVjdHVyZSBpcyBkZWZpbmVkKQ0KK2luY2x1ZGUgKEdlbmVyaWNPcHRpb25zKQ0KKw0KKyMgT1Mtc3BlY2lmaWMgb3B0aW9ucyB0aGF0IHNob3VsZCBwcm9wYWdhdGUgdG8gYWxsIHN1YnRhcmdldHMgDQorIyAoaGVuY2UgdGhleSBtdXN0IGJlIGxvYWRlZCBiZWZvcmUgdGhlIHByb2plY3Qgc3RydWN0dXJlIGlzIGRlZmluZWQpDQoraW5jbHVkZSAoU2VsZWN0U3BlY2lmaWNPcHRpb25zKQ0KKw0KKyMgU2VhcmNoaW5nIGZvciBtYW5kYXRvcnkgcHJlcmVxdWlzaXRlcw0KKyNzZXQgKEJPT1NUX0NPTVBPTkVOVFMgc3lzdGVtIGZpbGVzeXN0ZW0gcmVnZXggdW5pdF90ZXN0X2ZyYW1ld29yaykNCitzZXQgKEJPT1NUX0NPTVBPTkVOVFMgc3lzdGVtIGZpbGVzeXN0ZW0gcmVnZXgpDQoraW5jbHVkZSAoTG9va0Zvck1hbmRhdG9yeVByZXJlcSkgDQorDQorDQorDQorDQorDQorIyA9PT09PT09PSBCVUlMRCBDT05GSUdVUkFUSU9OID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorbWVzc2FnZSgiIikNCittZXNzYWdlKCIiKQ0KK21lc3NhZ2UoIiogKiAqICogKiAqICogKiAqICogQnVpbGQgdHlwZSBjb25maWd1cmF0aW9uIGZvciBTeW1iZXggYWxsICogKiAqICogKiAqICogKiAqICoiKQ0KKw0KK2lmKERFRklORUQgRU5We0RJVkVSU0lUWV9DTUFLRV9CVUlMRF9UWVBFfSkNCisJaWYoJEVOVntESVZFUlNJVFlfQ01BS0VfQlVJTERfVFlQRX0gU1RSRVFVQUwgIlRFU1RfQU5EX0NPVkVSQUdFX1VURVNUUyIpDQorCQltZXNzYWdlKCIgICAgICAgICAgICAgICAgICAgIFVzaW5nIHVuaXRhcnkgdGVzdCBidWlsZCBjb25maWd1cmF0aW9uIDogJEVOVntESVZFUlNJVFlfQ01BS0VfQlVJTERfVFlQRX0iKQ0KKwllbHNlaWYoJEVOVntESVZFUlNJVFlfQ01BS0VfQlVJTERfVFlQRX0gU1RSRVFVQUwgIlBST0RVQ1RJT04iKQ0KKwkJbWVzc2FnZSgiICAgICAgICAgICAgICAgICAgICBVc2luZyBwcm9kdWN0aW9uIGJ1aWxkIGNvbmZpZ3VyYXRpb24gOiAkRU5We0RJVkVSU0lUWV9DTUFLRV9CVUlMRF9UWVBFfSIpDQorCWVsc2UoKQ0KKwkJbWVzc2FnZSggV0FSTklORyAiICAgICAgICAgICAgICAgICAgICBOb3QgdXNpbmcgdGhlIG9yZy5lY2xpcHNlLmVmbS5jZGFzaC5jdGVzdCBidWlsZCBjb25maWd1cmF0aW9uIGZyYW1ld29yayA6IGRlZmF1bHQgc3ltYmV4LmV4ZSBjb25maWd1cmF0aW9uIHVzZWQiKQ0KKwkJbWVzc2FnZSgiICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlciA6ICRFTlZ7RElWRVJTSVRZX0NNQUtFX0JVSUxEX1RZUEV9IikNCisJZW5kaWYoKQ0KK2VuZGlmKCkNCisNCittZXNzYWdlKCIiKQ0KK21lc3NhZ2UoIiIpDQorDQorDQorDQorIyBhZGRpbmcgdGhlIG1haW4gZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGNvZGUgZm9yIHRoZSBtYWluIGV4ZWN1dGFibGUgKHN5bWJleC5leGUpDQorYWRkX3N1YmRpcmVjdG9yeSAoc3JjKQ0KKw0KKyMgZm9yIHNwZWNpZmljIGJ1aWxkcw0KK2lmKERFRklORUQgRU5We0RJVkVSU0lUWV9DTUFLRV9CVUlMRF9UWVBFfSkNCisJaWYoJEVOVntESVZFUlNJVFlfQ01BS0VfQlVJTERfVFlQRX0gU1RSRVFVQUwgIlRFU1RfQU5EX0NPVkVSQUdFX1VURVNUUyIpDQorCQkjIExvYWQgdGVzdGluZyBmYWNpbGl0aWVzDQorCQkjIGl0IG11c3QgYmUgZG9uZSBvbiB0aGUgaGlnaGVzdCBsZXZlbCBjbWFrZWxpc3RzLnR4dCBvdGhlcndpc2UgY3Rlc3QgZG9lcyBub3QgZmluZCB0aGUgdGVzdHMgOg0KKwkJIyBzZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMzU1MDE1My9uby10ZXN0cy1mb3VuZC13aGVuLXVzaW5nLWd0ZXN0LXdpdGgtY21ha2UtY3Rlc3QNCisJCWluY2x1ZGUgKENUZXN0KQ0KKwkJIyBjb3ZlcmFnZQ0KKwkJaW5jbHVkZShJbml0Q292ZXJhZ2UpDQorCQlhZGRfc3ViZGlyZWN0b3J5ICh1dGVzdHMpDQorCWVuZGlmKCkNCitlbmRpZigpDQorDQorDQorDQorbWVzc2FnZSgiIikNCittZXNzYWdlKCIiKQ0KK21lc3NhZ2UoIiIpDQorbWVzc2FnZSgiIikNCisNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L0NPTlRSSUJVVElORy5tZCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvQ09OVFJJQlVUSU5HLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZmJlOWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L0NPTlRSSUJVVElORy5tZApAQCAtMCwwICsxLDMgQEAKKyMgRUZNLVNZTUJFWCA6IEVjbGlwc2UgRm9ybWFsIE1vZGVsaW5nIC0gU3ltYm9saWMgRXhlY3V0aW9uIFBsYXRmb3JtCisKK1RoYW5rcyBmb3IgeW91ciBpbnRlcmVzdCBpbiB0aGlzIHByb2plY3QuCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L1JFQURNRS5tZCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MjhmNmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L1JFQURNRS5tZApAQCAtMCwwICsxLDUgQEAKKyMgRUZNLVNZTUJFWCA6IEVjbGlwc2UgRm9ybWFsIE1vZGVsaW5nIC0gU3ltYm9saWMgRXhlY3V0aW9uIFBsYXRmb3JtCisKKyMjIFNvdXJjZSBjb2RlIHN0cnVjdHVyZQorW1NvdXJjZSBGb2xkZXJdKHNyYy9SRUFETUUubWQpCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvVE9ETy5tZCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvVE9ETy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzg5ZTdmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9UT0RPLm1kCkBAIC0wLDAgKzEgQEAKKyMgRUZNLVNZTUJFWCA6IEVjbGlwc2UgRm9ybWFsIE1vZGVsaW5nIC0gU3ltYm9saWMgRXhlY3V0aW9uIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2Fib3V0Lmh0bWwgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2Fib3V0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM1ZDVhZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvYWJvdXQuaHRtbApAQCAtMCwwICsxLDI4IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgorICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgorPHRpdGxlPkFib3V0PC90aXRsZT4KKzwvaGVhZD4KKzxib2R5IGxhbmc9IkVOLVVTIj4KKzxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgorIAorPHA+SnVuZSA1LCAyMDA3PC9wPgkKKzxoMz5MaWNlbnNlPC9oMz4KKworPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCitpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAorYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KK0ZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCitiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5CithcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCitwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKK2luZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50CithbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS5zaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDUyMzBjMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2Uuc2gKQEAgLTAsMCArMSwxNiBAQAorZWNobyBjbWFrZSAtRyBcIlVuaXggTWFrZWZpbGVzXCIgLi9idWlsZAorCisjIFNldHRpbmcgYnVpbGQgZGlyZWN0b3J5IHN0ZXAKKworcm0gLWQgLXIgLWYgYnVpbGQKKworbWtkaXIgYnVpbGQgOyBjZCBidWlsZAorCisjIENtYWtlIENvbmZpZ3VyYXRpb24gc3RlcAorCitjbWFrZSAtRyAiVW5peCBNYWtlZmlsZXMiIC4uL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvCisKKyMgQ29tcGlsYXRpb24gc3RlcAorCittYWtlIC1qMjgKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9CdWlsZEFOVExSMi5jbWFrZSBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvQnVpbGRBTlRMUjIuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlhZjQ2MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvQnVpbGRBTlRMUjIuY21ha2UKQEAgLTAsMCArMSw1MCBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKyMgICAgICAgICAgICAgICBDTWFrZSBtb2R1bGUgYnVpbGRpbmcgQU5UTFIyIGZyb20gc291cmNlcw0KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisNCisNCitpbmNsdWRlIChFeHRlcm5hbFByb2plY3QpDQorDQorc2V0IChBTlRMUjI3N19ESVIgYW50bHItMi43LjcpDQorc2V0IChBTlRMUjI3N19BUkMgJHtBTlRMUjI3N19ESVJ9LnRhci5neikNCitzZXQgKEFOVExSMjc3X1VSTCBodHRwOi8vd3d3LmFudGxyMi5vcmcvZG93bmxvYWQvJHtBTlRMUjI3N19BUkN9KQ0KKw0KKw0KK2lmIChOT1QgKERFRklORUQgQU5UTFIyX0lOU1RBTExfRElSKSkNCisjICAgIHNldCAoQU5UTFIyX0lOU1RBTExfRElSIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZWZtL3N5bWJleF9oaXBwL29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9idWlsZF9ndWkvY29udHJpYikNCisgICAgc2V0IChBTlRMUjJfSU5TVEFMTF9ESVIgJHtDTUFLRV9CSU5BUllfRElSfS9jb250cmliKQ0KKyAgICBzZXQgKEFOVExSMl9JTlNUQUxMX0xJQl9ESVIgJHtBTlRMUjJfSU5TVEFMTF9ESVJ9L2xpYikNCisgICAgc2V0IChBTlRMUjJfSU5TVEFMTF9JTkNMVURFX0RJUiAke0FOVExSMl9JTlNUQUxMX0RJUn0vaW5jbHVkZSkNCitlbmRpZigpDQorDQorc2V0IChBTlRMUjJfQ09ORklHVVJFICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlKQ0KK3NldCAoQU5UTFIyX0NPTkZJR1VSRSAke0FOVExSMl9DT05GSUdVUkV9IC0tcHJlZml4PSR7QU5UTFIyX0lOU1RBTExfRElSfSkNCisjIEZpbmUgdHVubmluZyBvZiBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMNCisjc2V0IChBTlRMUjJfQ09ORklHVVJFICR7QU5UTFIyX0NPTkZJR1VSRX0gLS1saWJkaXI9JHtBTlRMUjJfSU5TVEFMTF9MSUJfRElSfSAtLWluY2x1ZGVkaXI9JHtBTlRMUjJfSU5TVEFMTF9JTkNMVURFX0RJUn0pDQorDQorDQorZXh0ZXJuYWxwcm9qZWN0X2FkZCAoYW50bHIyDQorICAgIA0KKyAgICAjIERvd25sb2FkIHN0ZXANCisgICAgRE9XTkxPQURfRElSICAgICAgJHtDTUFLRV9CSU5BUllfRElSfQ0KKyAgICBVUkwgICAgICAgICAgICAgICAke0FOVExSMjc3X1VSTH0NCisgICAgUFJFRklYICAgICAgICAgICAgYW50bHIyDQorICAgIA0KKyAgICAjIFBhdGNoIHN0ZXANCisgICAgUEFUQ0hfQ09NTUFORCAgICAgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5ICR7Q01BS0VfU09VUkNFX0RJUn0vY21ha2UvYW50bHIyLXBhdGNoL2xpYi9jcHAvYW50bHIvQ2hhclNjYW5uZXIuaHBwICR7Q01BS0VfQklOQVJZX0RJUn0vYW50bHIyL3NyYy9hbnRscjIvbGliL2NwcC9hbnRscg0KKyAgICAgICAgICBDT01NQU5EICAgICAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHkgJHtDTUFLRV9TT1VSQ0VfRElSfS9jbWFrZS9hbnRscjItcGF0Y2gvc2NyaXB0cy9jb25maWcuZ3Vlc3MgJHtDTUFLRV9CSU5BUllfRElSfS9hbnRscjIvc3JjL2FudGxyMi9zY3JpcHRzDQorICAgICAgICAgIENPTU1BTkQgICAgICR7Q01BS0VfQ09NTUFORH0gLUUgY29weSAke0NNQUtFX1NPVVJDRV9ESVJ9L2NtYWtlL2FudGxyMi1wYXRjaC9zY3JpcHRzL2NvbmZpZy5zdWIgJHtDTUFLRV9CSU5BUllfRElSfS9hbnRscjIvc3JjL2FudGxyMi9zY3JpcHRzDQorICAgIA0KKyAgICAjIENvbmZpZ3VyZSBzdGVwDQorICAgIENPTkZJR1VSRV9DT01NQU5EICR7Q01BS0VfQklOQVJZX0RJUn0vYW50bHIyL3NyYy9hbnRscjIvJHtBTlRMUjJfQ09ORklHVVJFfQ0KKw0KKyAgICAjIEJ1aWxkIHN0ZXANCisgICAgQlVJTERfQ09NTUFORCAgICAgbWFrZQ0KKyAgICANCisgICAgIyBJbnN0YWxsIHN0ZXANCisgICAgSU5TVEFMTF9DT01NQU5EICAgbWFrZSBpbnN0YWxsDQorICAgICkNCisNCisjIFRoZXNlIHZhcmlhYmxlcyBjYSBiZSB1c2VkIGJ5IHRoZSBjbGllbnQgY29kZSBvZiB0aGlzIG1vZHVsZSAoZXg6IEZpbmRNb2R1bGUpDQorc2V0IChBTlRMUjJfSU5DTFVERV9ESVIgJHtBTlRMUjJfSU5TVEFMTF9JTkNMVURFX0RJUn0pDQorc2V0IChBTlRMUjJfTElCUkFSSUVTICAgbGliYW50bHIuYSkgDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9CdWlsZENWQzQuY21ha2UgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL0J1aWxkQ1ZDNC5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmIwNzU1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9CdWlsZENWQzQuY21ha2UKQEAgLTAsMCArMSwxMTQgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgICAgICAgICAgICAgICBDTWFrZSBtb2R1bGUgYnVpbGRpbmcgQ1ZDNCBmcm9tIHNvdXJjZXMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgTm90ZSA6IEFOVExSMyBpcyBkb3dubG9hZGVkIGFuZCBidWlsdCBkdXJpbmcgdGhlIENWQzQgYnVpbGQKKyMgTm90ZSA6IFNvbWUgc291cmNlIGZpbGVzIGFyZSBwYXRjaGVkICAoc2VlIFBBVENIX0NPTU1BTkQpCisjCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2luY2x1ZGUgKEV4dGVybmFsUHJvamVjdCkKKworIyB1cmwgYW5kIGVudiB2YXJzIGZvciBwYWNrYWdlZCB2ZXJzaW9uIHNvdXJjZQorc2V0IChDVkM0MTRfRElSICAgICAgY3ZjNC0xLjQpCitzZXQgKENWQzQxNF9BUkMgICAgICAke0NWQzQxNF9ESVJ9LnRhci5neikKKyNzZXQgKENWQzQxNF9VUkwgICAgICBodHRwOi8vY3ZjNC5jcy5ueXUuZWR1L2J1aWxkcy9zcmMvJHtDVkM0MTRfQVJDfSkKK3NldCAoQ1ZDNDE0X1VSTCAgICAgIGh0dHA6Ly9jdmM0LmNzLnN0YW5mb3JkLmVkdS9idWlsZHMvc3JjLyR7Q1ZDNDE0X0FSQ30pCisKKyNzZXQgKENNQUtFX1NPVVJDRV9QQVRDSF9ESVIgICAgICR7Q01BS0VfU09VUkNFX0RJUn0vY21ha2UvY3ZjNC0xLjQtcGF0Y2gpCisKKworIyB1cmwgYW5kIGVudiB2YXJzIGZvciBnaXQgcmVwb3NpdG9yeSBzb3VyY2UKK3NldChDVkM0X0dJVF9SRVBPU0lUT1JZX1VSTCAgIGh0dHBzOi8vZ2l0aHViLmNvbS9DVkM0L0NWQzQuZ2l0KQorCitzZXQgKENNQUtFX1NPVVJDRV9QQVRDSF9ESVIgICAgICR7Q01BS0VfU09VUkNFX0RJUn0vY21ha2UvY3ZjNC1tYXN0ZXItcGF0Y2gpCisKKworc2V0IChDVkM0X0NPTkZJR1VSRSAgICAgICAgICAgICAgICAgICBjb25maWd1cmUpCisjIHNldCAoQ1ZDNF9DT05GSUdVUkUgJHtDVkM0X0NPTkZJR1VSRX0gLS1kaXNhYmxlLXNpbGVudC1ydWxlcykgdW5jb21tZW50IHRvIGZvcmNlIENWQzQgbWFrZWZpbGUgdG8gZGlzcGxheSBjb21waWxhdGlvbi9saW5rIGNvbW1hbmRzCitzZXQgKENWQzRfQ09ORklHVVJFICR7Q1ZDNF9DT05GSUdVUkV9IC0td2l0aC1nbXApCitzZXQgKENWQzRfQ09ORklHVVJFICR7Q1ZDNF9DT05GSUdVUkV9IC0tZW5hYmxlLXN0YXRpYy1ib29zdCAtLXdpdGgtYm9vc3Q9JHtCb29zdF9JTkNMVURFX0RJUlN9IC0td2l0aC1ib29zdC1saWJkaXI9JHtCb29zdF9MSUJSQVJJRVNfRElSU30pCisKKyMgREVCVUcKKyNzZXQgKENWQzRfQ09ORklHVVJFICR7Q1ZDNF9DT05GSUdVUkV9IC0tZW5hYmxlLXN0YXRpYy1ib29zdCAtLXdpdGgtYm9vc3Q9L2hvbWUvc3MyMTkzMjYvdXNyIC0td2l0aC1ib29zdC1saWJkaXI9L2hvbWUvc3MyMTkzMjYvdXNyL2xpYikgIyBNQVJDSEUgIQorI3NldCAoQ1ZDNF9DT05GSUdVUkUgJHtDVkM0X0NPTkZJR1VSRX0gLS1lbmFibGUtc3RhdGljLWJvb3N0IC0td2l0aC1ib29zdD0vaG9tZS9zczIxOTMyNi9Cb29zdCAtLXdpdGgtYm9vc3QtbGliZGlyPS9ob21lL3NzMjE5MzI2L0Jvb3N0L2xpYikgIyBNQVJDSEUgICEKKyNzZXQgKENWQzRfQ09ORklHVVJFICR7Q1ZDNF9DT05GSUdVUkV9IC0tZW5hYmxlLXN0YXRpYy1ib29zdCAtLXdpdGgtYm9vc3Q9L2hvbWUvc3MyMTkzMjYvQm9vc3QvaW5jbHVkZSAtLXdpdGgtYm9vc3QtbGliZGlyPS9ob21lL3NzMjE5MzI2L0Jvb3N0L2xpYikgIyBNQVJDSEUgICEKKyNzZXQgKENWQzRfQ09ORklHVVJFICR7Q1ZDNF9DT05GSUdVUkV9IC0tZW5hYmxlLXN0YXRpYy1ib29zdCAtLXdpdGgtYm9vc3Q9L2hvbWUvc3MyMTkzMjYvbWluZ3c2NCAtLXdpdGgtYm9vc3QtbGliZGlyPS9ob21lL3NzMjE5MzI2L21pbmd3NjQvbGliKSAjIE1BUkNIRSAgIQorI3NldCAoQ1ZDNF9DT05GSUdVUkUgJHtDVkM0X0NPTkZJR1VSRX0gLS1lbmFibGUtc3RhdGljLWJvb3N0IC0td2l0aC1ib29zdD0vb3B0L21pbmd3NjQgLS13aXRoLWJvb3N0LWxpYmRpcj0vb3B0L21pbmd3NjQvbGliKSAjIE1BUkNIRSAgIQorI3NldCAoQ1ZDNF9DT05GSUdVUkUgJHtDVkM0X0NPTkZJR1VSRX0gLS1lbmFibGUtc3RhdGljLWJvb3N0IC0td2l0aC1ib29zdD0vbWluZ3c2NDIgLS13aXRoLWJvb3N0LWxpYmRpcj0vbWluZ3c2NDIvbGliKSAjIE1BUkNIRSAhIQorI3NldCAoQ1ZDNF9DT05GSUdVUkUgJHtDVkM0X0NPTkZJR1VSRX0gLS1lbmFibGUtc3RhdGljLWJvb3N0IC0td2l0aC1ib29zdD0vbWluZ3c2NCAtLXdpdGgtYm9vc3QtbGliZGlyPS9taW5ndzY0L2xpYikgIyBNQVJDSEUgUEFTICEhCisjc2V0IChDVkM0X0NPTkZJR1VSRSAke0NWQzRfQ09ORklHVVJFfSAtLWVuYWJsZS1zdGF0aWMtYm9vc3QgLS13aXRoLWJvb3N0PS9taW5ndzY0L2luY2x1ZGUgLS13aXRoLWJvb3N0LWxpYmRpcj0vbWluZ3c2NC9saWIpICMgTUFSQ0hFIFBBUworIyBFTkQgREVCVUcKKworaWYgKE5PVCAoREVGSU5FRCBDVkM0X0lOU1RBTExfRElSKSkKKyAgICBzZXQgKENWQzRfSU5TVEFMTF9ESVIgICAgICAgICAke0NNQUtFX0JJTkFSWV9ESVJ9L2NvbnRyaWIpCisgICAgCisgICAgc2V0IChDVkM0X0lOU1RBTExfSU5DTFVERV9ESVIgJHtDVkM0X0lOU1RBTExfRElSfS9pbmNsdWRlKQorICAgIHNldCAoQ1ZDNF9JTlNUQUxMX0xJQl9ESVIgICAgICR7Q1ZDNF9JTlNUQUxMX0RJUn0vbGliKQorICAgIAorICAgIHNldCAoQU5UTFIzX0lOU1RBTExfSU5DTFVERV9ESVIgJHtDVkM0X0lOU1RBTExfSU5DTFVERV9ESVJ9L2FudGxyM2MpCisgICAgc2V0IChBTlRMUjNfSU5TVEFMTF9MSUJfRElSICAgICAke0NWQzRfSU5TVEFMTF9MSUJfRElSfSkKK2VuZGlmKCkKKworc2V0IChDVkM0X0NPTkZJR1VSRSAke0NWQzRfQ09ORklHVVJFfSAtLXdpdGgtYW50bHItZGlyPSR7Q01BS0VfQklOQVJZX0RJUn0vY3ZjNC9zcmMvY3ZjNC9hbnRsci0zLjQgQU5UTFI9JHtDTUFLRV9CSU5BUllfRElSfS9jdmM0L3NyYy9jdmM0L2FudGxyLTMuNC9iaW4vYW50bHIzKQorc2V0IChDVkM0X0NPTkZJR1VSRSAke0NWQzRfQ09ORklHVVJFfSAtLWVuYWJsZS1zdGF0aWM9dHJ1ZSAtLWVuYWJsZS1zaGFyZWQ9ZmFsc2UgLS1lbmFibGUtc3RhdGljLWJpbmFyeSAtLWVuYWJsZS1vcHRpbWl6ZWQpCitzZXQgKENWQzRfQ09ORklHVVJFICR7Q1ZDNF9DT05GSUdVUkV9IC0tcHJlZml4PSR7Q1ZDNF9JTlNUQUxMX0RJUn0pCisjIEZpbmUgdHVubmluZyBvZiBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMKKyNzZXQgKENWQzRfQ09ORklHVVJFICR7Q1ZDNF9DT05GSUdVUkV9IC0tbGliZGlyPSR7Q1ZDNF9JTlNUQUxMX0xJQl9ESVJ9IC0taW5jbHVkZWRpcj0ke0NWQzRfSU5TVEFMTF9JTkNMVURFX0RJUn0pCisKKyMgRW52aXJvbm1lbnQgdmFyaWFibGUgbmVlZGVkIGJ5IENWQzQKK3NldCAoRU5We0NQUEZMQUdTfSAiLUkke0Jvb3N0X0lOQ0xVREVfRElSU30gLUkke0dNUF9JTkNMVURFX0RJUn0gLUkke0dNUFhYX0lOQ0xVREVfRElSfSIpIAorI3NldCAoRU5We0xERkxBR1N9ICAiJHtMSUJHTVB9ICR7TElCR01QWFh9ICR7Qm9vc3RfTElCUkFSSUVTfSIpCitzZXQgKEVOVntMSUJTfSAgICAgLWxnbXApICMgTmVlZGVkIHRvIGJ1aWxkIHRoZSBDVkM0IGV4ZWN1dGFibGUgKGFuZCB0aHVzIGFjaGlldmVkIHRoZSBidWlsZCBwcm9jZXNzIHN1Y2Nlc3NmdWxseSkKKworbWVzc2FnZSAoQ1BQRkxBR1MgJEVOVntDUFBGTEFHU30pCisKK2V4dGVybmFscHJvamVjdF9hZGQgKGN2YzQKKworICAgICMgRG93bmxvYWQgb3IgZ2l0LWNsb25lIHN0ZXAgYW5kIGluaXQKKyAgICBET1dOTE9BRF9ESVIgICAgICR7Q01BS0VfQklOQVJZX0RJUn0KKyAgICAjVVJMICAgICAgICAgICAgICAke0NWQzQxNF9VUkx9CisgICAgR0lUX1JFUE9TSVRPUlkgICAke0NWQzRfR0lUX1JFUE9TSVRPUllfVVJMfQorICAgIFBSRUZJWCAgICAgICAgICAgY3ZjNAorCisgICAgIyBQYXRjaCBzdGVwCisgICAgUEFUQ0hfQ09NTUFORCAgICAgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5ICR7Q01BS0VfU09VUkNFX1BBVENIX0RJUn0vdXRpbC9pbnRlZ2VyX2dtcF9pbXAuaCAgICAgICAke0NNQUtFX0JJTkFSWV9ESVJ9L2N2YzQvc3JjL2N2YzQvc3JjL3V0aWwKKyAgICAgICAgICBDT01NQU5EICAgICAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHkgJHtDTUFLRV9TT1VSQ0VfUEFUQ0hfRElSfS91dGlsL3JhdGlvbmFsX2dtcF9pbXAuaCAgICAgICR7Q01BS0VfQklOQVJZX0RJUn0vY3ZjNC9zcmMvY3ZjNC9zcmMvdXRpbAorICAgIyAgICAgIENPTU1BTkQgICAgICR7Q01BS0VfQ09NTUFORH0gLUUgY29weSAke0NNQUtFX1NPVVJDRV9QQVRDSF9ESVJ9L29wdGlvbnMvb3B0aW9uc190ZW1wbGF0ZS5jcHAgJHtDTUFLRV9CSU5BUllfRElSfS9jdmM0L3NyYy9jdmM0L3NyYy9vcHRpb25zCisKKyAgICAjIENvbmZpZ3VyZSBzdGVwCisgICAgU09VUkNFX0RJUiAgICAgICAgJHtDTUFLRV9CSU5BUllfRElSfS9jdmM0L3NyYy9jdmM0CisgICAgCisJIyBHaXQgY29tbWFuZAorICAgIENPTkZJR1VSRV9DT01NQU5EIGNkICR7Q01BS0VfQklOQVJZX0RJUn0vY3ZjNC9zcmMvY3ZjNCAmJiAke0NNQUtFX0JJTkFSWV9ESVJ9L2N2YzQvc3JjL2N2YzQvYXV0b2dlbi5zaAorICAgICAgICAgICAgICBDT01NQU5EICR7Q01BS0VfQklOQVJZX0RJUn0vY3ZjNC9zcmMvY3ZjNC9jb250cmliL2dldC1hbnRsci0zLjQKKworCSMgRG93bmxvYWQgY29tbWFuZAorICAgICNDT05GSUdVUkVfQ09NTUFORCAke0NNQUtFX0JJTkFSWV9ESVJ9L2N2YzQvc3JjL2N2YzQvY29udHJpYi9nZXQtYW50bHItMy40CisgICAgIyAgICAgICAgICBDT01NQU5EIGVjaG8gInNob3dfY3ZjNF9jb25maWd1cmUiCisgICAgICAgICAgICAgIENPTU1BTkQgZWNobyAke0NNQUtFX0JJTkFSWV9ESVJ9L2N2YzQvc3JjL2N2YzQvJHtDVkM0X0NPTkZJR1VSRX0KKyAgICAgICAgICAgICAgQ09NTUFORCAke0NNQUtFX0JJTkFSWV9ESVJ9L2N2YzQvc3JjL2N2YzQvJHtDVkM0X0NPTkZJR1VSRX0KKworICAgICMgQnVpbGQgc3RlcAorICAgIEJVSUxEX0NPTU1BTkQgICAgIG1ha2UgLWoyOAorCisgICAgIyBJbnN0YWxsIGNvbW1hbmQKKyAgICBJTlNUQUxMX0NPTU1BTkQgICBtYWtlIGluc3RhbGwKKyAgICAgICAgICAgICNDT01NQU5EICAgaW5zdGFsbCAtbSA2NDQgJHtDTUFLRV9CSU5BUllfRElSfS9jdmM0L3NyYy9jdmM0L2FudGxyLTMuNC9saWIvbGliYW50bHIzYy5hICR7QU5UTFIzX0lOU1RBTExfTElCX0RJUn0KKyAgICAgICAgICAgICNDT01NQU5EICAgaW5zdGFsbCAtbSA2NDQgLXQgJHtBTlRMUjNfSU5TVEFMTF9JTkNMVURFX0RJUn0gJHtDTUFLRV9CSU5BUllfRElSfS9jdmM0L3NyYy9jdmM0L2FudGxyLTMuNC9pbmNsdWRlLyoKKyAgICAgICAgICAgIENPTU1BTkQgICAgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5ICR7Q01BS0VfQklOQVJZX0RJUn0vY3ZjNC9zcmMvY3ZjNC9hbnRsci0zLjQvbGliL2xpYmFudGxyM2MuYSAke0FOVExSM19JTlNUQUxMX0xJQl9ESVJ9CisgICAgICAgICAgICBDT01NQU5EICAgICR7Q01BS0VfQ09NTUFORH0gLUUgY29weV9kaXJlY3RvcnkgJHtDTUFLRV9CSU5BUllfRElSfS9jdmM0L3NyYy9jdmM0L2FudGxyLTMuNC9pbmNsdWRlICR7QU5UTFIzX0lOU1RBTExfSU5DTFVERV9ESVJ9CisgICAgKQorICAgIAorIyBCYWNrIHRvIHByZXZpb3VzIHN0YXRlIAorc2V0IChFTlZ7Q1BQRkxBR1N9ICIiKSAKKyNzZXQgKEVOVntMREZMQUdTfSAgIiIpCitzZXQgKEVOVntMSUJTfSAgICAgIiIpCisKKyMgVGhlc2UgdmFyaWFibGVzIGNhbiBiZSB1c2VkIGJ5IHRoZSBjbGllbnQgY29kZSBvZiB0aGlzIG1vZHVsZSAoZXg6IEZpbmRNb2R1bGUpCitzZXQgKENWQzRfSU5DTFVERV9ESVIgICAke0NWQzRfSU5TVEFMTF9JTkNMVURFX0RJUn0pCitzZXQgKENWQzRfTElCUkFSSUVTICAgICBsaWJjdmM0LmEpCisKK3NldCAoQU5UTFIzX0lOQ0xVREVfRElSICR7Q1ZDNF9JTlNUQUxMX0lOQ0xVREVfRElSfS9pbmNsdWRlfSkgICMgVE9ETyA6IENoZWNrIGlmIHRoaXMgd29ya3MgIQorc2V0IChBTlRMUjNfTElCUkFSSUVTICAgbGliYW50bHIzYy5hKSAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUT0RPIDogQ2hlY2sgaWYgdGhpcyB3b3JrcyAhCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvQnVpbGRDVkM0LmNtYWtlLmJhayBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvQnVpbGRDVkM0LmNtYWtlLmJhawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDljOTg3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9CdWlsZENWQzQuY21ha2UuYmFrCkBAIC0wLDAgKzEsMTA2IEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICAgICAgICAgICAgICAgQ01ha2UgbW9kdWxlIGJ1aWxkaW5nIENWQzQgZnJvbSBzb3VyY2VzCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIE5vdGUgOiBBTlRMUjMgaXMgZG93bmxvYWRlZCBhbmQgYnVpbHQgZHVyaW5nIHRoZSBDVkM0IGJ1aWxkCisjIE5vdGUgOiBTb21lIHNvdXJjZSBmaWxlcyBhcmUgcGF0Y2hlZCAgKHNlZSBQQVRDSF9DT01NQU5EKQorIworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitpbmNsdWRlIChFeHRlcm5hbFByb2plY3QpCisKKyMgdXJsIGZvciBwYWNrYWdlZCB2ZXJzaW9uIHNvdXJjZQorc2V0IChDVkM0MTRfRElSICAgICAgY3ZjNC0xLjQpCitzZXQgKENWQzQxNF9BUkMgICAgICAke0NWQzQxNF9ESVJ9LnRhci5neikKK3NldCAoQ1ZDNDE0X1VSTCAgICAgIGh0dHA6Ly9jdmM0LmNzLm55dS5lZHUvYnVpbGRzL3NyYy8ke0NWQzQxNF9BUkN9KQorCisjIHVybCBmb3IgZ2l0IHJlcG9zaXRvcnkgc291cmNlCitzZXQoQ1ZDNF9HSVRfUkVQT1NJVE9SWV9VUkwgICBodHRwczovL2dpdGh1Yi5jb20vQ1ZDNC9DVkM0LmdpdCkKKworCitzZXQgKENWQzRfQ09ORklHVVJFICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZSkKKyMgc2V0IChDVkM0X0NPTkZJR1VSRSAke0NWQzRfQ09ORklHVVJFfSAtLWRpc2FibGUtc2lsZW50LXJ1bGVzKSB1bmNvbW1lbnQgdG8gZm9yY2UgQ1ZDNCBtYWtlZmlsZSB0byBkaXNwbGF5IGNvbXBpbGF0aW9uL2xpbmsgY29tbWFuZHMKK3NldCAoQ1ZDNF9DT05GSUdVUkUgJHtDVkM0X0NPTkZJR1VSRX0gLS13aXRoLWdtcCkKK3NldCAoQ1ZDNF9DT05GSUdVUkUgJHtDVkM0X0NPTkZJR1VSRX0gLS1lbmFibGUtc3RhdGljLWJvb3N0IC0td2l0aC1ib29zdD0ke0Jvb3N0X0lOQ0xVREVfRElSU30gLS13aXRoLWJvb3N0LWxpYmRpcj0ke0Jvb3N0X0xJQlJBUklFU19ESVJTfSkKKworIyBERUJVRworI3NldCAoQ1ZDNF9DT05GSUdVUkUgJHtDVkM0X0NPTkZJR1VSRX0gLS1lbmFibGUtc3RhdGljLWJvb3N0IC0td2l0aC1ib29zdD0vaG9tZS9zczIxOTMyNi91c3IgLS13aXRoLWJvb3N0LWxpYmRpcj0vaG9tZS9zczIxOTMyNi91c3IvbGliKSAjIE1BUkNIRSAhCisjc2V0IChDVkM0X0NPTkZJR1VSRSAke0NWQzRfQ09ORklHVVJFfSAtLWVuYWJsZS1zdGF0aWMtYm9vc3QgLS13aXRoLWJvb3N0PS9ob21lL3NzMjE5MzI2L0Jvb3N0IC0td2l0aC1ib29zdC1saWJkaXI9L2hvbWUvc3MyMTkzMjYvQm9vc3QvbGliKSAjIE1BUkNIRSAgIQorI3NldCAoQ1ZDNF9DT05GSUdVUkUgJHtDVkM0X0NPTkZJR1VSRX0gLS1lbmFibGUtc3RhdGljLWJvb3N0IC0td2l0aC1ib29zdD0vaG9tZS9zczIxOTMyNi9Cb29zdC9pbmNsdWRlIC0td2l0aC1ib29zdC1saWJkaXI9L2hvbWUvc3MyMTkzMjYvQm9vc3QvbGliKSAjIE1BUkNIRSAgIQorI3NldCAoQ1ZDNF9DT05GSUdVUkUgJHtDVkM0X0NPTkZJR1VSRX0gLS1lbmFibGUtc3RhdGljLWJvb3N0IC0td2l0aC1ib29zdD0vaG9tZS9zczIxOTMyNi9taW5ndzY0IC0td2l0aC1ib29zdC1saWJkaXI9L2hvbWUvc3MyMTkzMjYvbWluZ3c2NC9saWIpICMgTUFSQ0hFICAhCisjc2V0IChDVkM0X0NPTkZJR1VSRSAke0NWQzRfQ09ORklHVVJFfSAtLWVuYWJsZS1zdGF0aWMtYm9vc3QgLS13aXRoLWJvb3N0PS9vcHQvbWluZ3c2NCAtLXdpdGgtYm9vc3QtbGliZGlyPS9vcHQvbWluZ3c2NC9saWIpICMgTUFSQ0hFICAhCisjc2V0IChDVkM0X0NPTkZJR1VSRSAke0NWQzRfQ09ORklHVVJFfSAtLWVuYWJsZS1zdGF0aWMtYm9vc3QgLS13aXRoLWJvb3N0PS9taW5ndzY0MiAtLXdpdGgtYm9vc3QtbGliZGlyPS9taW5ndzY0Mi9saWIpICMgTUFSQ0hFICEhCisjc2V0IChDVkM0X0NPTkZJR1VSRSAke0NWQzRfQ09ORklHVVJFfSAtLWVuYWJsZS1zdGF0aWMtYm9vc3QgLS13aXRoLWJvb3N0PS9taW5ndzY0IC0td2l0aC1ib29zdC1saWJkaXI9L21pbmd3NjQvbGliKSAjIE1BUkNIRSBQQVMgISEKKyNzZXQgKENWQzRfQ09ORklHVVJFICR7Q1ZDNF9DT05GSUdVUkV9IC0tZW5hYmxlLXN0YXRpYy1ib29zdCAtLXdpdGgtYm9vc3Q9L21pbmd3NjQvaW5jbHVkZSAtLXdpdGgtYm9vc3QtbGliZGlyPS9taW5ndzY0L2xpYikgIyBNQVJDSEUgUEFTCisjIEVORCBERUJVRworCitpZiAoTk9UIChERUZJTkVEIENWQzRfSU5TVEFMTF9ESVIpKQorICAgIHNldCAoQ1ZDNF9JTlNUQUxMX0RJUiAgICAgICAgICR7Q01BS0VfQklOQVJZX0RJUn0vY29udHJpYikKKyAgICAKKyAgICBzZXQgKENWQzRfSU5TVEFMTF9JTkNMVURFX0RJUiAke0NWQzRfSU5TVEFMTF9ESVJ9L2luY2x1ZGUpCisgICAgc2V0IChDVkM0X0lOU1RBTExfTElCX0RJUiAgICAgJHtDVkM0X0lOU1RBTExfRElSfS9saWIpCisgICAgCisgICAgc2V0IChBTlRMUjNfSU5TVEFMTF9JTkNMVURFX0RJUiAke0NWQzRfSU5TVEFMTF9JTkNMVURFX0RJUn0vYW50bHIzYykKKyAgICBzZXQgKEFOVExSM19JTlNUQUxMX0xJQl9ESVIgICAgICR7Q1ZDNF9JTlNUQUxMX0xJQl9ESVJ9KQorZW5kaWYoKQorCitzZXQgKENWQzRfQ09ORklHVVJFICR7Q1ZDNF9DT05GSUdVUkV9IC0td2l0aC1hbnRsci1kaXI9JHtDTUFLRV9CSU5BUllfRElSfS9jdmM0L3NyYy9jdmM0L2FudGxyLTMuNCBBTlRMUj0ke0NNQUtFX0JJTkFSWV9ESVJ9L2N2YzQvc3JjL2N2YzQvYW50bHItMy40L2Jpbi9hbnRscjMpCitzZXQgKENWQzRfQ09ORklHVVJFICR7Q1ZDNF9DT05GSUdVUkV9IC0tZW5hYmxlLXN0YXRpYz10cnVlIC0tZW5hYmxlLXNoYXJlZD1mYWxzZSAtLWVuYWJsZS1zdGF0aWMtYmluYXJ5IC0tZW5hYmxlLW9wdGltaXplZCkKK3NldCAoQ1ZDNF9DT05GSUdVUkUgJHtDVkM0X0NPTkZJR1VSRX0gLS1wcmVmaXg9JHtDVkM0X0lOU1RBTExfRElSfSkKKyMgRmluZSB0dW5uaW5nIG9mIGluc3RhbGxhdGlvbiBkaXJlY3RvcmllcworI3NldCAoQ1ZDNF9DT05GSUdVUkUgJHtDVkM0X0NPTkZJR1VSRX0gLS1saWJkaXI9JHtDVkM0X0lOU1RBTExfTElCX0RJUn0gLS1pbmNsdWRlZGlyPSR7Q1ZDNF9JTlNUQUxMX0lOQ0xVREVfRElSfSkKKworIyBFbnZpcm9ubWVudCB2YXJpYWJsZSBuZWVkZWQgYnkgQ1ZDNAorc2V0IChFTlZ7Q1BQRkxBR1N9ICItSSR7Qm9vc3RfSU5DTFVERV9ESVJTfSAtSSR7R01QX0lOQ0xVREVfRElSfSAtSSR7R01QWFhfSU5DTFVERV9ESVJ9IikgCisjc2V0IChFTlZ7TERGTEFHU30gICIke0xJQkdNUH0gJHtMSUJHTVBYWH0gJHtCb29zdF9MSUJSQVJJRVN9IikKK3NldCAoRU5We0xJQlN9ICAgICAtbGdtcCkgIyBOZWVkZWQgdG8gYnVpbGQgdGhlIENWQzQgZXhlY3V0YWJsZSAoYW5kIHRodXMgYWNoaWV2ZWQgdGhlIGJ1aWxkIHByb2Nlc3Mgc3VjY2Vzc2Z1bGx5KQorCittZXNzYWdlIChDUFBGTEFHUyAkRU5We0NQUEZMQUdTfSkKKworZXh0ZXJuYWxwcm9qZWN0X2FkZCAoY3ZjNAorCisgICAgIyBEb3dubG9hZCBvciBnaXQtY2xvbmUgc3RlcCBhbmQgaW5pdAorICAgIERPV05MT0FEX0RJUiAgICAgJHtDTUFLRV9CSU5BUllfRElSfQorICAgIFVSTCAgICAgICAgICAgICAgJHtDVkM0MTRfVVJMfQorICAgICNHSVRfUkVQT1NJVE9SWSAgICR7Q1ZDNF9HSVRfUkVQT1NJVE9SWV9VUkx9CisgICAgUFJFRklYICAgICAgICAgICBjdmM0CisKKyAgICAjIFBhdGNoIHN0ZXAKKyAgICBQQVRDSF9DT01NQU5EICAgICAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHkgJHtDTUFLRV9TT1VSQ0VfRElSfS9jbWFrZS9jdmM0LXBhdGNoL3V0aWwvaW50ZWdlcl9nbXBfaW1wLmggICAgICAgJHtDTUFLRV9CSU5BUllfRElSfS9jdmM0L3NyYy9jdmM0L3NyYy91dGlsCisgICAgICAgICAgQ09NTUFORCAgICAgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5ICR7Q01BS0VfU09VUkNFX0RJUn0vY21ha2UvY3ZjNC1wYXRjaC91dGlsL3JhdGlvbmFsX2dtcF9pbXAuaCAgICAgICR7Q01BS0VfQklOQVJZX0RJUn0vY3ZjNC9zcmMvY3ZjNC9zcmMvdXRpbAorICAgICAgICAgIENPTU1BTkQgICAgICR7Q01BS0VfQ09NTUFORH0gLUUgY29weSAke0NNQUtFX1NPVVJDRV9ESVJ9L2NtYWtlL2N2YzQtcGF0Y2gvb3B0aW9ucy9vcHRpb25zX3RlbXBsYXRlLmNwcCAke0NNQUtFX0JJTkFSWV9ESVJ9L2N2YzQvc3JjL2N2YzQvc3JjL29wdGlvbnMKKworICAgICMgQ29uZmlndXJlIHN0ZXAKKyAgICBTT1VSQ0VfRElSICAgICAgICAke0NNQUtFX0JJTkFSWV9ESVJ9L2N2YzQvc3JjL2N2YzQKKworIyBDYXNlIG9mIEdJVF9SRVBPU0lUT1JZIGNvbW1hbmQKKyMgICAgQ09ORklHVVJFX0NPTU1BTkQgY2QgJHtDTUFLRV9CSU5BUllfRElSfS9jdmM0L3NyYy9jdmM0ICYmICR7Q01BS0VfQklOQVJZX0RJUn0vY3ZjNC9zcmMvY3ZjNC9hdXRvZ2VuLnNoCisjICAgICAgICAgICAgICBDT01NQU5EICR7Q01BS0VfQklOQVJZX0RJUn0vY3ZjNC9zcmMvY3ZjNC9jb250cmliL2dldC1hbnRsci0zLjQKKyMKKyMgQ2FzZSBvZiBVUkwgY29tbWFuZAorICAgIENPTkZJR1VSRV9DT01NQU5EICR7Q01BS0VfQklOQVJZX0RJUn0vY3ZjNC9zcmMvY3ZjNC9jb250cmliL2dldC1hbnRsci0zLjQKKyAgICAgICAgICAgICAgQ09NTUFORCAke0NNQUtFX0JJTkFSWV9ESVJ9L2N2YzQvc3JjL2N2YzQvJHtDVkM0X0NPTkZJR1VSRX0KKworICAgICMgQnVpbGQgc3RlcAorICAgIEJVSUxEX0NPTU1BTkQgICAgIG1ha2UgLWo0CisKKyAgICAjIEluc3RhbGwgY29tbWFuZAorICAgIElOU1RBTExfQ09NTUFORCAgIG1ha2UgaW5zdGFsbAorICAgICAgICAgICAgI0NPTU1BTkQgICBpbnN0YWxsIC1tIDY0NCAke0NNQUtFX0JJTkFSWV9ESVJ9L2N2YzQvc3JjL2N2YzQvYW50bHItMy40L2xpYi9saWJhbnRscjNjLmEgJHtBTlRMUjNfSU5TVEFMTF9MSUJfRElSfQorICAgICAgICAgICAgI0NPTU1BTkQgICBpbnN0YWxsIC1tIDY0NCAtdCAke0FOVExSM19JTlNUQUxMX0lOQ0xVREVfRElSfSAke0NNQUtFX0JJTkFSWV9ESVJ9L2N2YzQvc3JjL2N2YzQvYW50bHItMy40L2luY2x1ZGUvKgorICAgICAgICAgICAgQ09NTUFORCAgICAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHkgJHtDTUFLRV9CSU5BUllfRElSfS9jdmM0L3NyYy9jdmM0L2FudGxyLTMuNC9saWIvbGliYW50bHIzYy5hICR7QU5UTFIzX0lOU1RBTExfTElCX0RJUn0KKyAgICAgICAgICAgIENPTU1BTkQgICAgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5X2RpcmVjdG9yeSAke0NNQUtFX0JJTkFSWV9ESVJ9L2N2YzQvc3JjL2N2YzQvYW50bHItMy40L2luY2x1ZGUgJHtBTlRMUjNfSU5TVEFMTF9JTkNMVURFX0RJUn0KKyAgICApCisgICAgCisjIEJhY2sgdG8gcHJldmlvdXMgc3RhdGUgCitzZXQgKEVOVntDUFBGTEFHU30gIiIpIAorI3NldCAoRU5We0xERkxBR1N9ICAiIikKK3NldCAoRU5We0xJQlN9ICAgICAiIikKKworIyBUaGVzZSB2YXJpYWJsZXMgY2FuIGJlIHVzZWQgYnkgdGhlIGNsaWVudCBjb2RlIG9mIHRoaXMgbW9kdWxlIChleDogRmluZE1vZHVsZSkKK3NldCAoQ1ZDNF9JTkNMVURFX0RJUiAgICR7Q1ZDNF9JTlNUQUxMX0lOQ0xVREVfRElSfSkKK3NldCAoQ1ZDNF9MSUJSQVJJRVMgICAgIGxpYmN2YzQuYSkKKworc2V0IChBTlRMUjNfSU5DTFVERV9ESVIgJHtDVkM0X0lOU1RBTExfSU5DTFVERV9ESVJ9L2luY2x1ZGV9KSAgIyBUT0RPIDogQ2hlY2sgaWYgdGhpcyB3b3JrcyAhCitzZXQgKEFOVExSM19MSUJSQVJJRVMgICBsaWJhbnRscjNjLmEpICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRPRE8gOiBDaGVjayBpZiB0aGlzIHdvcmtzICEKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9CdWlsZEdNUC5jbWFrZSBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvQnVpbGRHTVAuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQwZDdiNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvQnVpbGRHTVAuY21ha2UKQEAgLTAsMCArMSwxNiBAQAorIyBQRU5ESU5HIDogVE8gQkUgQ09OVElOVUVEDQorDQorbWVzc2FnZSAoIkJ1aWxkIEdNUCBmcm9tIHNvdXJjZXMgLi4uIikNCitzZXQgKEdNUF9VUkwgaHR0cHM6Ly9nbXBsaWIub3JnL3JlcG8vZ21wLTYuMSkNCitzZXQgKEdNUF9ET1MyVU5JWCBzaCAtYyAiZG9zMnVuaXguZXhlICoiKQ0KK3NldCAoR01QX0NPTkZJR1VSRSBzaCBjb25maWd1cmUpDQorc2V0IChHTVBfQ09ORklHVVJFICR7R01QX0NPTkZJR1VSRX0gLS1lbmFibGUtY3h4IC0tZGlzYWJsZS1zaGFyZWQpDQorc2V0IChHTVBfQ09ORklHVVJFICR7R01QX0NPTkZJR1VSRX0gQ0M9JHtDTUFLRV9DX0NPTVBJTEVSfSBDWFg9JHtDTUFLRV9DWFhfQ09NUElMRVJ9KQ0KKyMgY29uZmlndXJlIC0tZW5hYmxlLWN4eCAtLWRpc2FibGUtc2hhcmVkIENDPUM6L01pbkdXL2Jpbi9nY2MuZXhlIENYWD1DOi9NaW5HVy9iaW4vZysrLmV4ZQ0KKw0KK2V4dGVybmFscHJvamVjdF9hZGQgKGdtcA0KKyAgICAgICAgICAgICAgICAgICAgICBTT1VSQ0VfRElSICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9nbXANCisgICAgICAgICAgICAgICAgICAgICAgSEdfUkVQT1NJVE9SWSAke0dNUF9VUkx9DQorICAgICAgICAgICAgICAgICAgICAgIENPTkZJR1VSRV9DT01NQU5EICAke0dNUF9ET1MyVU5JWH0gQ09NTUFORCBzaCAuLy5ib290c3RyYXAgQ09NTUFORCAke0dNUF9DT05GSUdVUkV9DQorICAgICAgICAgICAgICAgICAgICAgIEJVSUxEX0NPTU1BTkQgbWFrZQ0KKyAgICAgICAgICAgICAgICAgICAgICBCVUlMRF9JTl9TT1VSQ0UgMSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL0NvZGVDb3ZlcmFnZS5jbWFrZSBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvQ29kZUNvdmVyYWdlLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYTA2YTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL0NvZGVDb3ZlcmFnZS5jbWFrZQpAQCAtMCwwICsxLDIwMCBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTIgLSAyMDE1LCBMYXJzIEJpbGtlDQorIyBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKyMNCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sDQorIyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6DQorIw0KKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzDQorIyAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisjDQorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsDQorIyAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uDQorIyAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4NCisjDQorIyAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycw0KKyMgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQNCisjICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisjDQorIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EDQorIyBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRA0KKyMgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQ0KKyMgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1INCisjIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUw0KKyMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOw0KKyMgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9ODQorIyBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMNCisjIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKyMNCisjDQorIw0KKyMgMjAxMi0wMS0zMSwgTGFycyBCaWxrZQ0KKyMgLSBFbmFibGUgQ29kZSBDb3ZlcmFnZQ0KKyMNCisjIDIwMTMtMDktMTcsIEpvYWtpbSBT9mRlcmJlcmcNCisjIC0gQWRkZWQgc3VwcG9ydCBmb3IgQ2xhbmcuDQorIyAtIFNvbWUgYWRkaXRpb25hbCB1c2FnZSBpbnN0cnVjdGlvbnMuDQorIw0KKyMgVVNBR0U6DQorDQorIyAwLiAoTWFjIG9ubHkpIElmIHlvdSB1c2UgWGNvZGUgNS4xIG1ha2Ugc3VyZSB0byBwYXRjaCBnZW5pbmZvIGFzIGRlc2NyaWJlZCBoZXJlOg0KKyMgICAgICBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMjQwNDU0NC84MDQ4MA0KKyMNCisjIDEuIENvcHkgdGhpcyBmaWxlIGludG8geW91ciBjbWFrZSBtb2R1bGVzIHBhdGguDQorIw0KKyMgMi4gQWRkIHRoZSBmb2xsb3dpbmcgbGluZSB0byB5b3VyIENNYWtlTGlzdHMudHh0Og0KKyMgICAgICBJTkNMVURFKENvZGVDb3ZlcmFnZSkNCisjDQorIyAzLiBTZXQgY29tcGlsZXIgZmxhZ3MgdG8gdHVybiBvZmYgb3B0aW1pemF0aW9uIGFuZCBlbmFibGUgY292ZXJhZ2U6DQorIyAgICBTRVQoQ01BS0VfQ1hYX0ZMQUdTICItZyAtTzAgLWZwcm9maWxlLWFyY3MgLWZ0ZXN0LWNvdmVyYWdlIikNCisjCSBTRVQoQ01BS0VfQ19GTEFHUyAiLWcgLU8wIC1mcHJvZmlsZS1hcmNzIC1mdGVzdC1jb3ZlcmFnZSIpDQorIw0KKyMgMy4gVXNlIHRoZSBmdW5jdGlvbiBTRVRVUF9UQVJHRVRfRk9SX0NPVkVSQUdFIHRvIGNyZWF0ZSBhIGN1c3RvbSBtYWtlIHRhcmdldA0KKyMgICAgd2hpY2ggcnVucyB5b3VyIHRlc3QgZXhlY3V0YWJsZSBhbmQgcHJvZHVjZXMgYSBsY292IGNvZGUgY292ZXJhZ2UgcmVwb3J0Og0KKyMgICAgRXhhbXBsZToNCisjCSBTRVRVUF9UQVJHRVRfRk9SX0NPVkVSQUdFKA0KKyMJCQkJbXlfY292ZXJhZ2VfdGFyZ2V0ICAjIE5hbWUgZm9yIGN1c3RvbSB0YXJnZXQuDQorIwkJCQl0ZXN0X2RyaXZlciAgICAgICAgICMgTmFtZSBvZiB0aGUgdGVzdCBkcml2ZXIgZXhlY3V0YWJsZSB0aGF0IHJ1bnMgdGhlIHRlc3RzLg0KKyMJCQkJCQkJCQkjIE5PVEUhIFRoaXMgc2hvdWxkIGFsd2F5cyBoYXZlIGEgWkVSTyBhcyBleGl0IGNvZGUNCisjCQkJCQkJCQkJIyBvdGhlcndpc2UgdGhlIGNvdmVyYWdlIGdlbmVyYXRpb24gd2lsbCBub3QgY29tcGxldGUuDQorIwkJCQljb3ZlcmFnZSAgICAgICAgICAgICMgTmFtZSBvZiBvdXRwdXQgZGlyZWN0b3J5Lg0KKyMJCQkJKQ0KKyMNCisjIDQuIEJ1aWxkIGEgRGVidWcgYnVpbGQ6DQorIwkgY21ha2UgLURDTUFLRV9CVUlMRF9UWVBFPURlYnVnIC4uDQorIwkgbWFrZQ0KKyMJIG1ha2UgbXlfY292ZXJhZ2VfdGFyZ2V0DQorIw0KKyMNCisNCisjIENoZWNrIHByZXJlcXMNCitGSU5EX1BST0dSQU0oIEdDT1ZfUEFUSCBnY292ICkNCittZXNzYWdlKCIke0xDT1ZfSU5TVEFMTF9JTkNMVURFX0RJUn0iKQ0KK0ZJTkRfTElCUkFSWSggTENPVl9QQVRIIGxjb3YgSElOVFMgJHtMQ09WX0lOU1RBTExfSU5DTFVERV9ESVJ9KQ0KK21lc3NhZ2UoIiR7TENPVl9QQVRIfSIpDQorRklORF9QUk9HUkFNKCBHRU5IVE1MX1BBVEggZ2VuaHRtbCApDQorRklORF9QUk9HUkFNKCBHQ09WUl9QQVRIIGdjb3ZyIFBBVEhTICR7Q01BS0VfU09VUkNFX0RJUn0vdGVzdHMpDQorDQorSUYoTk9UIEdDT1ZfUEFUSCkNCisJTUVTU0FHRShGQVRBTF9FUlJPUiAiZ2NvdiBub3QgZm91bmQhIEFib3J0aW5nLi4uIikNCitFTkRJRigpICMgTk9UIEdDT1ZfUEFUSA0KKw0KK0lGKE5PVCBDTUFLRV9DT01QSUxFUl9JU19HTlVDWFgpDQorCSMgQ2xhbmcgdmVyc2lvbiAzLjAuMCBhbmQgZ3JlYXRlciBub3cgc3VwcG9ydHMgZ2NvdiBhcyB3ZWxsLg0KKwlNRVNTQUdFKFdBUk5JTkcgIkNvbXBpbGVyIGlzIG5vdCBHTlUgZ2NjISBDbGFuZyBWZXJzaW9uIDMuMC4wIGFuZCBncmVhdGVyIHN1cHBvcnRzIGdjb3YgYXMgd2VsbCwgYnV0IG9sZGVyIHZlcnNpb25zIGRvbid0LiIpDQorDQorCUlGKE5PVCAiJHtDTUFLRV9DWFhfQ09NUElMRVJfSUR9IiBTVFJFUVVBTCAiQ2xhbmciKQ0KKwkJTUVTU0FHRShGQVRBTF9FUlJPUiAiQ29tcGlsZXIgaXMgbm90IEdOVSBnY2MhIEFib3J0aW5nLi4uIikNCisJRU5ESUYoKQ0KK0VORElGKCkgIyBOT1QgQ01BS0VfQ09NUElMRVJfSVNfR05VQ1hYDQorDQorU0VUKENNQUtFX0NYWF9GTEFHU19DT1ZFUkFHRQ0KKyAgICAiLWcgLU8wIC0tY292ZXJhZ2UgLWZwcm9maWxlLWFyY3MgLWZ0ZXN0LWNvdmVyYWdlIg0KKyAgICBDQUNIRSBTVFJJTkcgIkZsYWdzIHVzZWQgYnkgdGhlIEMrKyBjb21waWxlciBkdXJpbmcgY292ZXJhZ2UgYnVpbGRzLiINCisgICAgRk9SQ0UgKQ0KK1NFVChDTUFLRV9DX0ZMQUdTX0NPVkVSQUdFDQorICAgICItZyAtTzAgLS1jb3ZlcmFnZSAtZnByb2ZpbGUtYXJjcyAtZnRlc3QtY292ZXJhZ2UiDQorICAgIENBQ0hFIFNUUklORyAiRmxhZ3MgdXNlZCBieSB0aGUgQyBjb21waWxlciBkdXJpbmcgY292ZXJhZ2UgYnVpbGRzLiINCisgICAgRk9SQ0UgKQ0KK1NFVChDTUFLRV9FWEVfTElOS0VSX0ZMQUdTX0NPVkVSQUdFDQorICAgICIiDQorICAgIENBQ0hFIFNUUklORyAiRmxhZ3MgdXNlZCBmb3IgbGlua2luZyBiaW5hcmllcyBkdXJpbmcgY292ZXJhZ2UgYnVpbGRzLiINCisgICAgRk9SQ0UgKQ0KK1NFVChDTUFLRV9TSEFSRURfTElOS0VSX0ZMQUdTX0NPVkVSQUdFDQorICAgICIiDQorICAgIENBQ0hFIFNUUklORyAiRmxhZ3MgdXNlZCBieSB0aGUgc2hhcmVkIGxpYnJhcmllcyBsaW5rZXIgZHVyaW5nIGNvdmVyYWdlIGJ1aWxkcy4iDQorICAgIEZPUkNFICkNCitNQVJLX0FTX0FEVkFOQ0VEKA0KKyAgICBDTUFLRV9DWFhfRkxBR1NfQ09WRVJBR0UNCisgICAgQ01BS0VfQ19GTEFHU19DT1ZFUkFHRQ0KKyAgICBDTUFLRV9FWEVfTElOS0VSX0ZMQUdTX0NPVkVSQUdFDQorICAgIENNQUtFX1NIQVJFRF9MSU5LRVJfRkxBR1NfQ09WRVJBR0UgKQ0KKw0KK0lGICggTk9UIChDTUFLRV9CVUlMRF9UWVBFIFNUUkVRVUFMICJEZWJ1ZyIgT1IgQ01BS0VfQlVJTERfVFlQRSBTVFJFUVVBTCAiQ292ZXJhZ2UiKSkNCisgIE1FU1NBR0UoIFdBUk5JTkcgIkNvZGUgY292ZXJhZ2UgcmVzdWx0cyB3aXRoIGFuIG9wdGltaXplZCAobm9uLURlYnVnKSBidWlsZCBtYXkgYmUgbWlzbGVhZGluZyIgKQ0KK0VORElGKCkgIyBOT1QgQ01BS0VfQlVJTERfVFlQRSBTVFJFUVVBTCAiRGVidWciDQorDQorDQorIyBQYXJhbSBfdGFyZ2V0bmFtZSAgICAgVGhlIG5hbWUgb2YgbmV3IHRoZSBjdXN0b20gbWFrZSB0YXJnZXQNCisjIFBhcmFtIF90ZXN0cnVubmVyICAgICBUaGUgbmFtZSBvZiB0aGUgdGFyZ2V0IHdoaWNoIHJ1bnMgdGhlIHRlc3RzLg0KKyMJCQkJCQlNVVNUIHJldHVybiBaRVJPIGFsd2F5cywgZXZlbiBvbiBlcnJvcnMuDQorIwkJCQkJCUlmIG5vdCwgbm8gY292ZXJhZ2UgcmVwb3J0IHdpbGwgYmUgY3JlYXRlZCENCisjIFBhcmFtIF9vdXRwdXRuYW1lICAgICBsY292IG91dHB1dCBpcyBnZW5lcmF0ZWQgYXMgX291dHB1dG5hbWUuaW5mbw0KKyMgICAgICAgICAgICAgICAgICAgICAgIEhUTUwgcmVwb3J0IGlzIGdlbmVyYXRlZCBpbiBfb3V0cHV0bmFtZS9pbmRleC5odG1sDQorIyBPcHRpb25hbCBmb3VydGggcGFyYW1ldGVyIGlzIHBhc3NlZCBhcyBhcmd1bWVudHMgdG8gX3Rlc3RydW5uZXINCisjICAgUGFzcyB0aGVtIGluIGxpc3QgZm9ybSwgZS5nLjogIi1qOzIiIGZvciAtaiAyDQorRlVOQ1RJT04oU0VUVVBfVEFSR0VUX0ZPUl9DT1ZFUkFHRSBfdGFyZ2V0bmFtZSBfdGVzdHJ1bm5lciBfb3V0cHV0bmFtZSkNCisNCisJSUYoTk9UIExDT1ZfUEFUSCkNCisJCU1FU1NBR0UoRkFUQUxfRVJST1IgImxjb3Ygbm90IGZvdW5kISBBYm9ydGluZy4uLiIpDQorCUVORElGKCkgIyBOT1QgTENPVl9QQVRIDQorDQorCUlGKE5PVCBHRU5IVE1MX1BBVEgpDQorCQlNRVNTQUdFKEZBVEFMX0VSUk9SICJnZW5odG1sIG5vdCBmb3VuZCEgQWJvcnRpbmcuLi4iKQ0KKwlFTkRJRigpICMgTk9UIEdFTkhUTUxfUEFUSA0KKw0KKwlTRVQoY292ZXJhZ2VfaW5mbyAiJHtDTUFLRV9CSU5BUllfRElSfS8ke19vdXRwdXRuYW1lfS5pbmZvIikNCisJU0VUKGNvdmVyYWdlX2NsZWFuZWQgIiR7Y292ZXJhZ2VfaW5mb30uY2xlYW5lZCIpDQorICANCisJU0VQQVJBVEVfQVJHVU1FTlRTKHRlc3RfY29tbWFuZCBVTklYX0NPTU1BTkQgIiR7X3Rlc3RydW5uZXJ9IikNCisNCisJIyBTZXR1cCB0YXJnZXQNCisJQUREX0NVU1RPTV9UQVJHRVQoJHtfdGFyZ2V0bmFtZX0NCisNCisJCSMgQ2xlYW51cCBsY292DQorCQkke0xDT1ZfUEFUSH0gLS1kaXJlY3RvcnkgLiAtLXplcm9jb3VudGVycw0KKw0KKwkJIyBSdW4gdGVzdHMNCisJCUNPTU1BTkQgJHt0ZXN0X2NvbW1hbmR9ICR7QVJHVjN9DQorDQorCQkjIENhcHR1cmluZyBsY292IGNvdW50ZXJzIGFuZCBnZW5lcmF0aW5nIHJlcG9ydA0KKwkJQ09NTUFORCAke0xDT1ZfUEFUSH0gLS1kaXJlY3RvcnkgLiAtLWNhcHR1cmUgLS1vdXRwdXQtZmlsZSAke2NvdmVyYWdlX2luZm99DQorCQlDT01NQU5EICR7TENPVl9QQVRIfSAtLXJlbW92ZSAke2NvdmVyYWdlX2luZm99ICd0ZXN0cy8qJyAnL3Vzci8qJyAtLW91dHB1dC1maWxlICR7Y292ZXJhZ2VfY2xlYW5lZH0NCisJCUNPTU1BTkQgJHtHRU5IVE1MX1BBVEh9IC1vICR7X291dHB1dG5hbWV9ICR7Y292ZXJhZ2VfY2xlYW5lZH0NCisJCUNPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSByZW1vdmUgJHtjb3ZlcmFnZV9pbmZvfSAke2NvdmVyYWdlX2NsZWFuZWR9DQorDQorCQlXT1JLSU5HX0RJUkVDVE9SWSAke0NNQUtFX0JJTkFSWV9ESVJ9DQorCQlDT01NRU5UICJSZXNldHRpbmcgY29kZSBjb3ZlcmFnZSBjb3VudGVycyB0byB6ZXJvLlxuUHJvY2Vzc2luZyBjb2RlIGNvdmVyYWdlIGNvdW50ZXJzIGFuZCBnZW5lcmF0aW5nIHJlcG9ydC4iDQorCSkNCisNCisJIyBTaG93IGluZm8gd2hlcmUgdG8gZmluZCB0aGUgcmVwb3J0DQorCUFERF9DVVNUT01fQ09NTUFORChUQVJHRVQgJHtfdGFyZ2V0bmFtZX0gUE9TVF9CVUlMRA0KKwkJQ09NTUFORCA7DQorCQlDT01NRU5UICJPcGVuIC4vJHtfb3V0cHV0bmFtZX0vaW5kZXguaHRtbCBpbiB5b3VyIGJyb3dzZXIgdG8gdmlldyB0aGUgY292ZXJhZ2UgcmVwb3J0LiINCisJKQ0KKw0KK0VOREZVTkNUSU9OKCkgIyBTRVRVUF9UQVJHRVRfRk9SX0NPVkVSQUdFDQorDQorIyBQYXJhbSBfdGFyZ2V0bmFtZSAgICAgVGhlIG5hbWUgb2YgbmV3IHRoZSBjdXN0b20gbWFrZSB0YXJnZXQNCisjIFBhcmFtIF90ZXN0cnVubmVyICAgICBUaGUgbmFtZSBvZiB0aGUgdGFyZ2V0IHdoaWNoIHJ1bnMgdGhlIHRlc3RzDQorIyBQYXJhbSBfb3V0cHV0bmFtZSAgICAgY29iZXJ0dXJhIG91dHB1dCBpcyBnZW5lcmF0ZWQgYXMgX291dHB1dG5hbWUueG1sDQorIyBPcHRpb25hbCBmb3VydGggcGFyYW1ldGVyIGlzIHBhc3NlZCBhcyBhcmd1bWVudHMgdG8gX3Rlc3RydW5uZXINCisjICAgUGFzcyB0aGVtIGluIGxpc3QgZm9ybSwgZS5nLjogIi1qOzIiIGZvciAtaiAyDQorRlVOQ1RJT04oU0VUVVBfVEFSR0VUX0ZPUl9DT1ZFUkFHRV9DT0JFUlRVUkEgX3RhcmdldG5hbWUgX3Rlc3RydW5uZXIgX291dHB1dG5hbWUpDQorDQorCUlGKE5PVCBQWVRIT05fRVhFQ1VUQUJMRSkNCisJCU1FU1NBR0UoRkFUQUxfRVJST1IgIlB5dGhvbiBub3QgZm91bmQhIEFib3J0aW5nLi4uIikNCisJRU5ESUYoKSAjIE5PVCBQWVRIT05fRVhFQ1VUQUJMRQ0KKw0KKwlJRihOT1QgR0NPVlJfUEFUSCkNCisJCU1FU1NBR0UoRkFUQUxfRVJST1IgImdjb3ZyIG5vdCBmb3VuZCEgQWJvcnRpbmcuLi4iKQ0KKwlFTkRJRigpICMgTk9UIEdDT1ZSX1BBVEgNCisNCisJQUREX0NVU1RPTV9UQVJHRVQoJHtfdGFyZ2V0bmFtZX0NCisNCisJCSMgUnVuIHRlc3RzDQorCQkke190ZXN0cnVubmVyfSAke0FSR1YzfQ0KKw0KKwkJIyBSdW5uaW5nIGdjb3ZyDQorCQlDT01NQU5EICR7R0NPVlJfUEFUSH0gLXggLXIgJHtDTUFLRV9TT1VSQ0VfRElSfSAtZSAnJHtDTUFLRV9TT1VSQ0VfRElSfS90ZXN0cy8nICAtbyAke19vdXRwdXRuYW1lfS54bWwNCisJCVdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfQklOQVJZX0RJUn0NCisJCUNPTU1FTlQgIlJ1bm5pbmcgZ2NvdnIgdG8gcHJvZHVjZSBDb2JlcnR1cmEgY29kZSBjb3ZlcmFnZSByZXBvcnQuIg0KKwkpDQorDQorCSMgU2hvdyBpbmZvIHdoZXJlIHRvIGZpbmQgdGhlIHJlcG9ydA0KKwlBRERfQ1VTVE9NX0NPTU1BTkQoVEFSR0VUICR7X3RhcmdldG5hbWV9IFBPU1RfQlVJTEQNCisJCUNPTU1BTkQgOw0KKwkJQ09NTUVOVCAiQ29iZXJ0dXJhIGNvZGUgY292ZXJhZ2UgcmVwb3J0IHNhdmVkIGluICR7X291dHB1dG5hbWV9LnhtbC4iDQorCSkNCisNCitFTkRGVU5DVElPTigpICMgU0VUVVBfVEFSR0VUX0ZPUl9DT1ZFUkFHRV9DT0JFUlRVUkEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL0RldGVjdFJldmlzaW9uLmNtYWtlIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9EZXRlY3RSZXZpc2lvbi5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmQyZjZlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9EZXRlY3RSZXZpc2lvbi5jbWFrZQpAQCAtMCwwICsxLDE1IEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorIyAgICAgICBDTWFrZSBtb2R1bGUgZ2V0dGluZyB0aGUgZ2l0IGRlc2NyaXB0aW9uIG9mIHRoZSBjdXJyZW50IGNvbW1pdCAgDQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKw0KKw0KK21lc3NhZ2UgKFNUQVRVUyAiKioqKioqIExvb2tpbmcgZm9yIGdpdCBjb21taXQgaWQgKioqKioqIikNCisNCisNCitleGVjdXRlX3Byb2Nlc3MgKENPTU1BTkQgICAgICAgICAgICAgICAgICAgICAgICAgJHtHSVRfRVhFQ1VUQUJMRX0gZGVzY3JpYmUgLS1sb25nIC0tdGFncyAtLWRpcnR5IC0tYWx3YXlzDQorICAgICAgICAgICAgICAgIFdPUktJTkdfRElSRUNUT1JZICAgICAgICAgICAgICAgICR7Q01BS0VfU09VUkNFX0RJUn0NCisgICAgICAgICAgICAgICAgT1VUUFVUX1ZBUklBQkxFICAgICAgICAgICAgICAgICAgR0lUX0NPTU1JVF9JRA0KKyAgICAgICAgICAgICAgICBPVVRQVVRfU1RSSVBfVFJBSUxJTkdfV0hJVEVTUEFDRQ0KKyAgICAgICAgICAgICAgICApDQorICAgICAgICAgICAgICAgIA0KK21lc3NhZ2UgKFNUQVRVUyAiQ29tbWl0IGlkIDogJHtHSVRfQ09NTUlUX0lEfSIpDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9EZXRlY3RTeXN0ZW0uY21ha2UgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL0RldGVjdFN5c3RlbS5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzI1MDdhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9EZXRlY3RTeXN0ZW0uY21ha2UKQEAgLTAsMCArMSwzNCBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKyMgICAgICAgQ01ha2UgbW9kdWxlIGdldHRpbmcgc29tZSBwcm9wZXJ0aWVzIGZyb20gdGhlIGN1cnJlbnQgcGxhdGZvcm0NCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorDQorDQorbWVzc2FnZSAoU1RBVFVTICIqKioqKiogTG9va2luZyBmb3Igc3lzdGVtIGluZm9ybWF0aW9uICoqKioqKiIpDQorDQorIyBFbmRpYW5uZXNzIHRlc3RpbmcgKGFuc3dlciBpbiB2YXJpYWJsZSBTWVNURU1fSVNfQklHX0VORElBTikNCitpbmNsdWRlIChUZXN0QmlnRW5kaWFuKQ0KK3Rlc3RfYmlnX2VuZGlhbiAoU1lTVEVNX0lTX0JJR19FTkRJQU4pDQoraWYgKFNZU1RFTV9JU19CSUdfRU5ESUFOKQ0KKwlzZXQgKFNZU1RFTV9JU19CSUdfRU5ESUFOX1NUUiBZZXMpDQorZWxzZSAoKQ0KKwlzZXQgKFNZU1RFTV9JU19CSUdfRU5ESUFOX1NUUiBObykNCitlbmRpZiAoKQ0KKw0KKyMgUHJvY2Vzc29ycyB0ZXN0aW5nIChhbnN3ZXIgaW4gdmFyaWFibGUgU1lTVEVNX05CX09GX1BST0MpDQoraW5jbHVkZSAoUHJvY2Vzc29yQ291bnQpDQorUHJvY2Vzc29yQ291bnQgKFNZU1RFTV9OQl9PRl9QUk9DKQ0KKw0KKyMgQ2hlY2tpbmcgdHlwZSBzaXplIChyZXN1bHQgaW4gYnl0ZXMpDQoraW5jbHVkZSAoQ2hlY2tUeXBlU2l6ZSkNCitjaGVja190eXBlX3NpemUgKGludCBJTlRfU0laRSBMQU5HVUFHRSBDWFgpDQorY2hlY2tfdHlwZV9zaXplIChzaG9ydCBTSE9SVF9JTlRfU0laRSBMQU5HVUFHRSBDWFgpDQorY2hlY2tfdHlwZV9zaXplIChsb25nIExPTkdfSU5UX1NJWkUgTEFOR1VBR0UgQ1hYKQ0KK2NoZWNrX3R5cGVfc2l6ZSAoY2hhciBDSEFSX1NJWkUgTEFOR1VBR0UgQ1hYKQ0KKw0KKyMgUmVwb3J0DQorbWVzc2FnZSAoU1RBVFVTICJTeXN0ZW0gICAgICAgICAgICA6ICR7Q01BS0VfU1lTVEVNfS0ke0NNQUtFX1NZU1RFTV9QUk9DRVNTT1J9IikNCittZXNzYWdlIChTVEFUVVMgIlN5c3RlbSAoQ01ha2UgdmFyKTogV0lOMzI9JHtXSU4zMn0gIE1JTkdXPSR7TUlOR1d9IFVOSVg9JHtVTklYfSBNU1lTPSR7TVNZU30gQ1lHV0lOPSR7Q1lHV0lOfSIpDQorbWVzc2FnZSAoU1RBVFVTICJCaWctZW5kaWFuICAgICAgICA6ICR7U1lTVEVNX0lTX0JJR19FTkRJQU5fU1RSfSIpDQorbWVzc2FnZSAoU1RBVFVTICJUeXBlcyBzaXplIChieXRlcyk6IGludD0ke0lOVF9TSVpFfSAgc2hvcnRpbnQ9JHtTSE9SVF9JTlRfU0laRX0gIGxvbmdpbnQ9JHtMT05HX0lOVF9TSVpFfSBjaGFyPSR7Q0hBUl9TSVpFfSIpDQorbWVzc2FnZSAoU1RBVFVTICJOYiBvZiBwcm9jZXNzb3JzICA6ICR7U1lTVEVNX05CX09GX1BST0N9IikNCisNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL0RldGVjdFRvb2xDaGFpbi5jbWFrZSBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvRGV0ZWN0VG9vbENoYWluLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMGE5MDMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL0RldGVjdFRvb2xDaGFpbi5jbWFrZQpAQCAtMCwwICsxLDEwIEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorIyAgICAgICAgICAgICAgICBDTWFrZSBtb2R1bGUgZGlzcGxheWluZyBjdXJyZW50IHRvb2xjaGFpbiANCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorDQorbWVzc2FnZSAoU1RBVFVTICIqKioqKiogTG9va2luZyBmb3IgdG9vbGNoYWluIGluZm9ybWF0aW9uICoqKioqKiIpDQorDQorIyBObyByZWFsIGRldGVjdGlvbiBoZXJlLCBvbmx5IHByaW50aW5nIHdoYXQgQ01ha2Uga25vd3MgYWxyZWFkeQ0KK21lc3NhZ2UgKFNUQVRVUyAiQysrIGNvbXBpbGVyOiAiICR7Q01BS0VfQ1hYX0NPTVBJTEVSfSAiLCB2ZXJzaW9uICIgJHtDTUFLRV9DWFhfQ09NUElMRVJfVkVSU0lPTn0pDQorbWVzc2FnZSAoU1RBVFVTICJDIGNvbXBpbGVyOiAiICR7Q01BS0VfQ19DT01QSUxFUn0gIiwgdmVyc2lvbiAiICR7Q01BS0VfQ19DT01QSUxFUl9WRVJTSU9OfSkNCittZXNzYWdlIChTVEFUVVMgIkxpbmtlcjogIiAke0NNQUtFX0xJTktFUn0pDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9GaW5kQU5UTFIyLmNtYWtlIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9GaW5kQU5UTFIyLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MjJlOGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL0ZpbmRBTlRMUjIuY21ha2UKQEAgLTAsMCArMSwyOCBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKyMgICAgICAgICAgICAgICAgQ01ha2UgcGFja2FnZSBsb29raW5nIGZvciBBTlRMUjIgbGlicmFpcmllcyANCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorIw0KKyMgQU5UTFIyX0ZPVU5EICAgICAgICAgOiBTeXN0ZW0gaGFzIEFOVExSMiBsaWIgYW5kIGFzc29jaWF0ZWQgaGVhZGVycw0KKyMgQU5UTFIyX0xJQlJBUklFUyAgICAgOiBsaWJhbnRsci5hIGxvY2F0aW9uDQorIyBBTlRMUjJfSU5DTFVERV9ESVIgICA6IGluY2x1ZGUgZGlyZWN0b3J5DQorIw0KKyMgTm90ZSA6IHRoaXMgcGFja2FnZSBpcyBub3QgZGVzaWduZWQgdG8gYmUgZ2VuZXJhbCBub3IgY29tcHJlaGVuc2l2ZSA6IA0KKyMgICAgICAgIGl0IG9ubHkgZml0cyB0aGUgU3ltYmV4IHByb2plY3QgbmVlZHMNCisjDQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKw0KKw0KK2lmIChBTlRMUjJfSU5DTFVERV9ESVIgQU5EIEFOVExSMl9MSUJSQVJJRVMpICMgQWxyZWFkeSBpbiBjYWNoZSwgYmUgc2lsZW50DQorICAgIHNldCAoQU5UTFIyX0ZJTkRfUVVJRVRMWSBUUlVFKQ0KK2VuZGlmICgpDQorDQorI2ZpbmRfcGF0aCAoQU5UTFIyX0lOQ0xVREVfRElSIE5BTUVTIEFOVExSRXhjZXB0aW9uLmhwcCBQQVRIX1NVRkZJWEVTIGFudGxyIEhJTlRTICR7QU5UTFIyX0lOU1RBTExfSU5DTFVERV9ESVJ9KQ0KK2ZpbmRfcGF0aCAoQU5UTFIyX0lOQ0xVREVfRElSIE5BTUVTIGFudGxyL0FOVExSRXhjZXB0aW9uLmhwcCBISU5UUyAke0FOVExSMl9JTlNUQUxMX0lOQ0xVREVfRElSfSkNCitmaW5kX2xpYnJhcnkgKEFOVExSMl9MSUJSQVJJRVMgTkFNRVMgYW50bHIgbGliYW50bHIuYSBISU5UUyAke0FOVExSMl9JTlNUQUxMX0xJQl9ESVJ9KQ0KKw0KK21lc3NhZ2UgKFNUQVRVUyAiQU5UTFIyIDogIiAke0FOVExSMl9MSUJSQVJJRVN9ICIgIiAke0FOVExSMl9JTkNMVURFX0RJUn0pDQorDQoraW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykNCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MgKEFOVExSMiBERUZBVUxUX01TRyBBTlRMUjJfTElCUkFSSUVTIEFOVExSMl9JTkNMVURFX0RJUikNCisNCisNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL0ZpbmRBTlRMUjMuY21ha2UgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL0ZpbmRBTlRMUjMuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U0MTA2NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvRmluZEFOVExSMy5jbWFrZQpAQCAtMCwwICsxLDI0IEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorIyAgICAgICAgICAgQ01ha2UgcGFja2FnZSBsb29raW5nIGZvciBBTlRMUjMgQyBydW50aW1lIGxpYnJhaXJpZXMgDQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKyMNCisjIEFOVExSM19GT1VORCAgICAgICAgOiBTeXN0ZW0gaGFzIEFOVExSMyBDIFJ1bnRpbWUgbGliIGFuZCBhc3NvY2lhdGVkIGhlYWRlcnMNCisjIEFOVExSM19MSUJSQVJJRVMgICAgOiBBTlRMUjMgbGlicmFyeSBsb2NhdGlvbiANCisjIEFOVExSM19JTkNMVURFX0RJUiAgOiBBTlRMUjMgaW5jbHVkZSBkaXJlY3RvcnkNCisjDQorIyBOb3RlIDogdGhpcyBwYWNrYWdlIGlzIG5vdCBkZXNpZ25lZCB0byBiZSBnZW5lcmFsIG5vciBjb21wcmVoZW5zaXZlIDogDQorIyAgICAgICAgaXQgb25seSBmaXRzIHRoZSBTeW1iZXggcHJvamVjdCBuZWVkcw0KKyMNCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorDQoraWYgKEFOVExSM19JTkNMVURFX0RJUiBBTkQgQU5UTFIzX0xJQlJBUklFUykgIyBBbHJlYWR5IGluIGNhY2hlLCBiZSBzaWxlbnQNCisJc2V0IChBTlRMUjNfRklORF9RVUlFVExZIFRSVUUpDQorZW5kaWYgKCkNCisNCitmaW5kX3BhdGggKEFOVExSM19JTkNMVURFX0RJUiBOQU1FUyBhbnRscjMuaCBISU5UUyAke0FOVExSM19JTlNUQUxMX0lOQ0xVREVfRElSfSkNCitmaW5kX2xpYnJhcnkgKEFOVExSM19MSUJSQVJJRVMgTkFNRVMgbGliYW50bHIzYyBsaWJhbnRscjNjLmEgSElOVFMgJHtBTlRMUjNfSU5TVEFMTF9MSUJfRElSfSAke0NWQzRfSU5TVEFMTF9MSUJfRElSfSkNCittZXNzYWdlIChTVEFUVVMgIkFOVExSMyA6ICIgJHtBTlRMUjNfTElCUkFSSUVTfSAiICIgJHtBTlRMUjNfSU5DTFVERV9ESVJ9KQ0KKw0KK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpDQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzIChBTlRMUjMgREVGQVVMVF9NU0cgQU5UTFIzX0xJQlJBUklFUyBBTlRMUjNfSU5DTFVERV9ESVIpDQorDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9GaW5kQ1ZDNC5jbWFrZSBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvRmluZENWQzQuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYyOTBkZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvRmluZENWQzQuY21ha2UKQEAgLTAsMCArMSwzMCBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKyMgICAgICAgICAgICAgICAgICAgICBDTWFrZSBwYWNrYWdlIGxvb2tpbmcgZm9yIENWQzQNCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorIw0KKyMgQ1ZDNF9GT1VORCAgICAgICAgOiBTeXN0ZW0gaGFzIENWQzQgbGliIGFuZCBhc3NvY2lhdGVkIGhlYWRlcnMNCisjIENWQzRfSU5DTFVERV9ESVIgIDogQ1ZDNCBpbmNsdWRlIGRpcmVjdG9yeQ0KKyMgQ1ZDNF9MSUJSQVJJRVMgICAgICA6IENWQzQgbGliIGxvY2F0aW9uDQorIw0KKyMgTm90ZSA6IHRoaXMgcGFja2FnZSBpcyBub3QgZGVzaWduZWQgdG8gYmUgZ2VuZXJhbCBub3IgY29tcHJlaGVuc2l2ZSA6IA0KKyMgICAgICAgIGl0IG9ubHkgZml0cyB0aGUgU3ltYmV4IHByb2plY3QgbmVlZHMNCisjDQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKw0KKyMgSWYgYWxyZWFkeSBpbiBjYWNoZSwgYmUgc2lsZW50DQoraWYgKENWQzRfSU5DTFVERV9ESVIgQU5EIENWQzRfTElCUkFSSUVTKSAjIEFscmVhZHkgaW4gY2FjaGUsIGJlIHNpbGVudA0KKwkJc2V0IChDVkM0X0ZJTkRfUVVJRVRMWSBUUlVFKQ0KK2VuZGlmICgpDQorDQorI21lc3NhZ2UgKCJDVkM0X0lOU1RBTExfSU5DTFVERV9ESVI9JHtDVkM0X0lOU1RBTExfSU5DTFVERV9ESVJ9IikNCisjbWVzc2FnZSAoIkNWQzRfSU5TVEFMTF9MSUJfRElSPSR7Q1ZDNF9JTlNUQUxMX0xJQl9ESVJ9IikNCisNCitmaW5kX3BhdGggKENWQzRfSU5DTFVERV9ESVIgTkFNRVMgY3ZjNC9jdmM0LmggIEhJTlRTICR7Q1ZDNF9JTlNUQUxMX0lOQ0xVREVfRElSfSkNCitmaW5kX2xpYnJhcnkoQ1ZDNF9MSUJSQVJJRVMgTkFNRVMgbGliY3ZjNC5hIEhJTlRTICR7Q1ZDNF9JTlNUQUxMX0xJQl9ESVJ9KQ0KKyNmaW5kX2xpYnJhcnkoQ1ZDNF9MSUJSQVJJRVMgTkFNRVMgY3ZjNCBISU5UUyAvYy9tc3lzNjQvbWluZ3c2NC91c3IvbGliKQ0KKw0KK21lc3NhZ2UgKFNUQVRVUyAiQ1ZDNCA6ICIgJHtDVkM0X0xJQlJBUklFU30gIiAiICR7Q1ZDNF9JTkNMVURFX0RJUn0pDQorDQoraW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykNCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MgKENWQzQgREVGQVVMVF9NU0cgQ1ZDNF9MSUJSQVJJRVMgQ1ZDNF9JTkNMVURFX0RJUikNCisNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL0ZpbmRHTVAuY21ha2UgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL0ZpbmRHTVAuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAyNjBmOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvRmluZEdNUC5jbWFrZQpAQCAtMCwwICsxLDQ0IEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorIyAgICAgICAgICAgICAgIENNYWtlIHBhY2thZ2UgbG9va2luZyBmb3IgR01QIGxpYnJhcmllcw0KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisjDQorIyBHTVBfRk9VTkQgICAgICAgIDogU3lzdGVtIGhhcyBib3RoIEdNUCBsaWIgYW5kIGFzc29jaWF0ZWQgaGVhZGVycw0KKyMNCisjIE5vdGUgOiB0aGlzIHBhY2thZ2UgaXMgbm90IGRlc2lnbmVkIHRvIGJlIGdlbmVyYWwgbm9yIGNvbXByZWhlbnNpdmUgOiANCisjICAgICAgICBpdCBvbmx5IGZpdHMgdGhlIFN5bWJleCBwcm9qZWN0IG5lZWRzDQorIw0KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisNCisjIElmIGFscmVhZHkgaW4gY2FjaGUsIGJlIHNpbGVudA0KK2lmIChnbXBfaW5jbHVkZWRpciBBTkQgZ21weHhfaW5jbHVkZWRpciBBTkQgbGliX2dtcF9jIEFORCBsaWJfZ21wX2N4eCkNCisJCXNldCAoR01QX0ZJTkRfUVVJRVRMWSBUUlVFKQ0KK2VuZGlmICgpDQorDQorDQorDQorZmluZF9wYXRoIChnbXBfaW5jbHVkZWRpciBOQU1FUyBnbXAuaCBQQVRIUyAke0dNUF9JTkNMVURFRElSfSkNCitmaW5kX3BhdGggKGdtcHh4X2luY2x1ZGVkaXIgTkFNRVMgZ21weHguaCBQQVRIUyAke0dNUF9JTkNMVURFRElSfSkNCisNCitmaW5kX2xpYnJhcnkobGliX2dtcF9jIE5BTUVTIGdtcCBsaWJnbXAuYSBQQVRIUyAke0dNUF9MSUJSQVJZRElSfSkNCitmaW5kX2xpYnJhcnkobGliX2dtcF9jeHggTkFNRVMgZ21weHggbGliZ21weHguYSBQQVRIUyAke0dNUF9MSUJSQVJZRElSfSkNCisNCisNCisNCitpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQ0KK2ZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncyAoR01QIERFRkFVTFRfTVNHIGxpYl9nbXBfYyBsaWJfZ21wX2N4eCBnbXBfaW5jbHVkZWRpciBnbXB4eF9pbmNsdWRlZGlyKQ0KKw0KKw0KKw0KKw0KKw0KKw0KKw0KKw0KKw0KKw0KKw0KKw0KKw0KKw0KKw0KKw0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvR2VuZXJpY09wdGlvbnMuY21ha2UgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL0dlbmVyaWNPcHRpb25zLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNWE1OTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL0dlbmVyaWNPcHRpb25zLmNtYWtlCkBAIC0wLDAgKzEsMTkgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgICAgICAgICAgICAgICBDTWFrZSBmaWxlIGZvciBnZW5lcmljIGJ1aWx0IG9wdGlvbnMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgTm90ZSA6IFRoZXNlIGNvbXBpbGUgZGlyZWN0aXZlcyBwcm9wYWdhdGUgdG8gYWxsIHRhcmdldHMgb24gYWxsIHN5c3RlbXMKKyMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisjIFdoYXQgaXMgZGVmaW5lZCAKKyNhZGRfZGVmaW5pdGlvbnMgKC1EX0FWTV9CVUlMVF9XSVRIX0NNQUtFXyAtRF9BVk1fU09MVkVSX0NWQzRfIC1EX0FWTV9CVUlMVElOX05VTUVSSUNfQk9PU1RfKQorYWRkX2RlZmluaXRpb25zICgtRF9BVk1fQlVJTFRfV0lUSF9DTUFLRV8gLURfQVZNX1NPTFZFUl9DVkM0XyAtRF9BVk1fQlVJTFRJTl9OVU1FUklDX0dNUF8pCisKKworIyBXaGF0IGlzIHVuZGVmaW5lZAorYWRkX2RlZmluaXRpb25zICgtVV9BVk1fU09MVkVSX1lJQ0VTX1YxXyAtVV9BVk1fU09MVkVSX1lJQ0VTX1YyXyAtVV9BVk1fU09MVkVSX0NWQzNfIC1VIF9BVk1fRVhQUkVTU0lPTl9HSU5BQ18gLVVfQVZNX1NPTFZFUl9PTUVHQV8pCithZGRfZGVmaW5pdGlvbnMoLVVfQVZNX0JVSUxUSU5fTlVNRVJJQ19CT09TVF8pCisKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9Jbml0Q292ZXJhZ2UuY21ha2UgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL0luaXRDb3ZlcmFnZS5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTAyNDJlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9Jbml0Q292ZXJhZ2UuY21ha2UKQEAgLTAsMCArMSw5IEBACisNCisNCisNCitTRVQoQ01BS0VfQ1hYX0ZMQUdTICItZyAtTzAgLWZwcm9maWxlLWFyY3MgLWZ0ZXN0LWNvdmVyYWdlIikNCitTRVQoQ01BS0VfQ19GTEFHUyAiLWcgLU8wIC1mcHJvZmlsZS1hcmNzIC1mdGVzdC1jb3ZlcmFnZSIpDQorDQorDQorDQorbGlua19saWJyYXJpZXMgKGdjb3YpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9Mb29rRm9yTWFuZGF0b3J5UHJlcmVxLmNtYWtlIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9Mb29rRm9yTWFuZGF0b3J5UHJlcmVxLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ODRiZDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL0xvb2tGb3JNYW5kYXRvcnlQcmVyZXEuY21ha2UKQEAgLTAsMCArMSw4MyBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorIyAgICAgICAgICAgQ01ha2UgbW9kdWxlIDogU2VhcmNoIGZvciBtYW5kYXRvcnkgcHJlcmVxdWlzaXRlcyANCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisjIA0KKyMgVGhpcyBtb2R1bGUgbG9va3MgZm9yIG1hbmRhdG9yeSBsaWJyYXJpZXMgYW5kIHNldHMgdmFyaWFibGUgDQorIyBsaWtlIDxYWFg+X0xJQlJBUklFUyBhbmQgPFhYWD5fSU5DTFVERV9ESVINCisjIFZhcmlhYmxlcyBvZiB0aGUgZm9ybSA8WFhYPl9ST09UIGFyZSBwYXNzZWQgdG8gdGhlIEZpbmQgbW9kdWxlcyB3aGljaCB1c2UgdGhlbSBhcyBoaW50cw0KKyMNCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisNCisNCittZXNzYWdlIChTVEFUVVMgIioqKioqKiBMb29raW5nIGZvciBtYW5kYXRvcnkgcHJlcmVxdWlzaXRlcyAqKioqKioiKQ0KKw0KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMb29raW5nIGZvciBCb29zdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjDQorIyBWYXJpYWJsZSBCT09TVF9ST09UIGlzIHVzZWQgYXMgYSBzZWFyY2ggaGludCBieSBmaW5kX3BhY2thZ2UNCisjDQorbWVzc2FnZSAoU1RBVFVTICIqKioqIExvb2tpbmcgZm9yIEJPT1NUICoqKioiKQ0KKw0KK3NldCAoQm9vc3RfREVCVUcgT04pICMgRW5hYmxlIGJvb3N0IERFQlVHDQorDQorDQorIyBCT09TVF9DT01QT05FTlRTIHNob3VsZCBjb250YWlucyB0aGUgcmVxdWlyZWQgYm9vc3QgY29tcG9uZW50cyAgDQorc2V0IChCb29zdF9VU0VfU1RBVElDX0xJQlMgT04pICMgRm9yY2UgdG8gbG9va2cgZm9yIHN0YXRpYyBsaWJyYXJpZXMNCitmaW5kX3BhY2thZ2UgKEJvb3N0IDEuNDAgUkVRVUlSRUQgQ09NUE9ORU5UUyAke0JPT1NUX0NPTVBPTkVOVFN9KQ0KK2lmIChOT1QgKEJvb3N0X0ZPVU5EKSkgDQorICAgIG1lc3NhZ2UgKEZBVEFMX0VSUk9SICJCb29zdCBub3QgZm91bmQgOiBwbGVhc2UgaW5zdGFsbCBCb29zdCA+PSAxLjUzIG1hbnVhbGx5IikNCitlbHNlICgpDQorICAgIG1lc3NhZ2UgKFNUQVRVUyAiQm9vc3QgOiAiICR7Qm9vc3RfTElCUkFSSUVTfSAiLSIgJHtCb29zdF9JTkNMVURFX0RJUlN9ICItIiAke0Jvb3N0X0xJQlJBUllfRElSU30pDQorZW5kaWYoKQ0KK21lc3NhZ2UgKFNUQVRVUyAiKioqKiAgICAgICAgICAgICAgICAgICAqKioqIikNCisNCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMb29raW5nIGZvciBHUE0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyANCisjIFRoZSBHTVBfUk9PVCB2YXJpYWJsZSBpcyB1c2VkIGFzIGEgc2VhcmNoIGhpbnQNCisjIA0KK21lc3NhZ2UgKFNUQVRVUyAiKioqKiAgTG9va2luZyBmb3IgR01QICAqKioqIikNCitmaW5kX3BhY2thZ2UoR01QIDYuMS4wIFJFUVVJUkVEKQ0KK2lmIChOT1QgKEdNUF9GT1VORCkpDQorICAgIG1lc3NhZ2UgKEZBVEFMX0VSUk9SICJHTVAgbm90IGZvdW5kIDogcGxlYXNlIGluc3RhbGwgR01QICA+PSA2LjEuMCBtYW51YWxseSIpDQorZWxzZSAoKQ0KKyAgICBtZXNzYWdlIChTVEFUVVMgIkdNUCA6ICIgJHtsaWJfZ21wX2N9ICItIiAke2xpYl9nbXBfY3h4fSAiLSIgJHtnbXBfaW5jbHVkZWRpcn0gIi0iICR7Z21weHhfaW5jbHVkZWRpcn0pDQorZW5kaWYoKQ0KK21lc3NhZ2UgKFNUQVRVUyAiKioqKiAgICAgICAgICAgICAgICAgICAqKioqIikNCisNCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMb29raW5nIGZvciBDVkM0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIw0KKyMgQ1ZDNF9JTlNUQUxMX0lOQ0xVREVfRElSIDogaGludCB0byBmaW5kIGluY2x1ZGVzDQorIyBDVkM0X0lOU1RBTExfTElCX0RJUiAgICAgOiBoaW50IHRvIGZpbmQgbGlicmFyaWVzIA0KKyMNCitmaW5kX3BhY2thZ2UoQ1ZDNCkNCitpZiAoTk9UIChDVkM0X0ZPVU5EKSkgIA0KKyAgICBtZXNzYWdlKCJDVkM0IG5vdCBmb3VuZCA6IGxhdGVyLCBJIHdpbGwgdHJ5IHRvIGJ1aWxkIENWQzQgZnJvbSBzb3VyY2VzIChpbmNsdWRpbmcgYW4gQU5UTFIzIGJ1aWxkKSIpDQorICAgIGluY2x1ZGUgKEJ1aWxkQ1ZDNCkNCisgICAgYWRkX2N1c3RvbV90YXJnZXQgKHJlc2Nhbl9jdmM0ICR7Q01BS0VfQ09NTUFORH0gJHtDTUFLRV9TT1VSQ0VfRElSfSBERVBFTkRTIGN2YzQpDQorZWxzZSAoKQ0KKyAgICBhZGRfY3VzdG9tX3RhcmdldCAocmVzY2FuX2N2YzQpDQorZW5kaWYoKQ0KKw0KKw0KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTG9va2luZyBmb3IgQU5UTFIyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjDQorIyBBTlRMUjJfSU5TVEFMTF9JTkNMVURFX0RJUiA6IGhpbnQgdG8gZmluZCBpbmNsdWRlcw0KKyMgQU5UTFIyX0lOU1RBTExfTElCX0RJUiAgICAgOiBoaW50IHRvIGZpbmQgbGlicmFyaWVzDQorIw0KK2ZpbmRfcGFja2FnZShBTlRMUjIpDQoraWYgKE5PVCAoQU5UTFIyX0ZPVU5EKSkNCisgICAgbWVzc2FnZSAoIkFOVExSMiBub3QgZm91bmQgOiBsYXRlciwgSSB3aWxsIHRyeSB0byBidWlsZCBBTlRMUjIgZnJvbSBzb3VyY2VzIikNCisgICAgaW5jbHVkZSAoQnVpbGRBTlRMUjIpDQorICAgIGFkZF9jdXN0b21fdGFyZ2V0IChyZXNjYW5fYW50bHIyICR7Q01BS0VfQ09NTUFORH0gJHtDTUFLRV9TT1VSQ0VfRElSfSBERVBFTkRTIGFudGxyMiApDQorZWxzZSAoKQ0KKyAgICBhZGRfY3VzdG9tX3RhcmdldCAocmVzY2FuX2FudGxyMikNCitlbmRpZigpDQorDQorDQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSBMb29raW5nIGZvciBBTlRMUjMgQyBydW50aW1lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgVGhlIEFOVExSM19JTlNUQUxMX0lOQ0xVREVfRElSIGFuZCBBTlRMUjNfSU5TVEFMTF9MSUJfRElSIHZhcmlhYmxlcyBhcmUgdXNlZCBhcyBzZWFyY2ggaGludHMNCitmaW5kX3BhY2thZ2UoQU5UTFIzKQ0KK2lmIChOT1QgKEFOVExSM19GT1VORCkpDQorICAgIG1lc3NhZ2UgKCJBTlRMUjMgbm90IGZvdW5kIDogcGxlYXNlIGluc3RhbGwgQU5UTFIzIHBhY2thZ2UgbWFudWFsbHkgb3IgKHJlKWluc3RhbGwgQ1ZDNCAod2hpY2ggY29tZXMgd2l0aCBhbiBhdXRvbWF0aWMgQU5UTFIzIGluc3RhbGxhdGlvbikiKQ0KK2VuZGlmKCkNCisNCisNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL0xvb2tGb3JTQ00uY21ha2UgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL0xvb2tGb3JTQ00uY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU0YTc0MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvTG9va0ZvclNDTS5jbWFrZQpAQCAtMCwwICsxLDI3IEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICAgICBDTWFrZSBNb2R1bGUgbG9va2luZyBmb3IgU29mdHdhcmUgQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50IHRvb2xzCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIE5vdGUgOiBUb29scyBjdXJyZW50bHkgbG9va2VkIGZvciBhcmUgOiAgR2l0IFNWTgorIworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKworIyBMb29raW5nIGZvaXIgR2l0CitmaW5kX3BhY2thZ2UoR2l0KQoraWYgKEdJVF9GT1VORCkKKyAgICBtZXNzYWdlIChTVEFUVVMgIkdpdCAke0dJVF9WRVJTSU9OX1NUUklOR30gZm91bmQgOiAke0dJVF9FWEVDVVRBQkxFfSIgKQorZWxzZSAoKQorICAgIG1lc3NhZ2UgKEZBVEFMX0VSUk9SICJHaXQgbm90IGZvdW5kIikKK2VuZGlmKCkKKworCisKKyMgTG9va2luZyBmb3IgTWVyY3VyaWFsCitmaW5kX3BhY2thZ2UoSGcpCitpZiAoSEdfRk9VTkQpCisgICAgbWVzc2FnZSAoU1RBVFVTICJNZXJjdXJpYWwgJHtIR19WRVJTSU9OX1NUUklOR30gZm91bmQgOiAke0hHX0VYRUNVVEFCTEV9IiApCitlbHNlICgpCisgICAgbWVzc2FnZSAoU1RBVFVTICJNZXJjdXJpYWwgbm90IGZvdW5kIikKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvUHJpbnRCYW5uZXIuY21ha2UgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL1ByaW50QmFubmVyLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5Zjc5MDMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL1ByaW50QmFubmVyLmNtYWtlCkBAIC0wLDAgKzEsMzQgQEAKKyMgQmFubmVyIA0KKw0KK2Z1bmN0aW9uIChiYW5uZXJfcm93IFdJRFRIIFJFUEVBVElOR19DSEFSIExFRlRDT1JORVJfQ0hBUiBSSUdIVENPUk5FUl9DSEFSIFRFWFQpDQorICAgIGlmIChURVhUKQ0KKyAgICAgICAgc3RyaW5nIChMRU5HVEggJHtURVhUfSBURVhUX0xFTkdUSCkNCisgICAgICAgIG1hdGggKEVYUFIgVEVYVF9MRU5HVEhfTU9EVUxPMiAgIiR7VEVYVF9MRU5HVEh9ICUgMiIpDQorICAgICAgICBpZiAoVEVYVF9MRU5HVEhfTU9EVUxPMikNCisgICAgICAgICAgICBzZXQgKFRFWFQgIiR7VEVYVH0gIikNCisgICAgICAgICAgICBzdHJpbmcgKExFTkdUSCAke1RFWFR9IFRFWFRfTEVOR1RIKQ0KKyAgICAgICAgZW5kaWYoKQ0KKyAgICBlbHNlICgpDQorICAgICAgICBzZXQgKFRFWFRfTEVOR1RIIDApDQorICAgIGVuZGlmKCkgICANCisgICAgbWF0aCAoRVhQUiBIQUxGTElORV9MRU5HVEggIigke1dJRFRIfSAtICR7VEVYVF9MRU5HVEh9KSAvIDIgLSAyIikNCisgICAgc2V0IChSRVNVTFQgJHtURVhUfSkNCisgICAgZm9yZWFjaCAoRFVNTVkgUkFOR0UgJHtIQUxGTElORV9MRU5HVEh9KQ0KKyAgICAgICAgc2V0IChSRVNVTFQgIiR7UkVQRUFUSU5HX0NIQVJ9JHtSRVNVTFR9JHtSRVBFQVRJTkdfQ0hBUn0iKQ0KKyAgICBlbmRmb3JlYWNoKCkNCisgICAgc2V0IChSRVNVTFQgIiR7TEVGVENPUk5FUl9DSEFSfSR7UkVTVUxUfSR7UklHSFRDT1JORVJfQ0hBUn0iKQ0KKyAgICBtZXNzYWdlIChTVEFUVVMgJHtSRVNVTFR9KQ0KKyAgICB1bnNldCAoVEVYVF9MRU5HVEgpDQorZW5kZnVuY3Rpb24gKGJhbm5lcl9yb3cpDQorDQorYmFubmVyX3JvdyAoNDAgIi0iICIgIiAiICIgIiIpDQorYmFubmVyX3JvdyAoNDAgIiAiICIvIiAiXFwiICIiKQ0KK2Jhbm5lcl9yb3cgKDQwICIgIiAifCIgInwiICR7QkFOTkVSX01FU1NBR0V9KQ0KK2Jhbm5lcl9yb3cgKDQwICIgIiAiXFwiICIvIiAiIikNCitiYW5uZXJfcm93ICg0MCAiLSIgIiAiICIgIiAiIikNCisNCisNCisNCisNCisNCisNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL1NlbGVjdFNwZWNpZmljT3B0aW9ucy5jbWFrZSBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvU2VsZWN0U3BlY2lmaWNPcHRpb25zLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNjNhZDMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL1NlbGVjdFNwZWNpZmljT3B0aW9ucy5jbWFrZQpAQCAtMCwwICsxLDEwIEBACisjIC0tLSBTZWxlY3Qgc3lzdGVtIHNwZWNpZmljIGRpcmVjdGl2ZXMgIC0tLQ0KKw0KKyMgV2luZG93cy9NaW5HVyBzcGVjaWZpYyBvcHRpbm9zDQoraWYgKChXSU4zMikgQU5EIChNSU5HVykgQU5EIChNU1lTKSBBTkQgTk9UKENZR1dJTikgQU5EIE5PVCAoVU5JWCkpICAjIE1TWVMyIGlkZW50aWZpY2F0aW9uIGJ5IENNYWtlIGlzIG5vdCByZWFsbHkgcmVsaWFibGUgDQorICAgIGluY2x1ZGUgKFNwZWNpZmljT3B0aW9ucy1XaW5NU1lTMikgDQorZWxzZWlmICgoVU5JWCkgQU5EIE5PVCAoTVNZUykgQU5EIE5PVCAoQ1lHV0lOKSkgIyAgTGludXggTmF0aXZlDQorICAgIGluY2x1ZGUgKFNwZWNpZmljT3B0aW9ucy1MaW51eCkJICAgIA0KK2Vsc2UgKCkNCisgICAgbWVzc2FnZSAoV0FSTklORyAiTm8gc3BlY2lmaWMgb3B0aW9ucyBmb3IgdGhlIGN1cnJlbnQgc3lzdGVtIikNCitlbmRpZiAoKQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvU3BlY2lmaWNPcHRpb25zLUxpbnV4LmNtYWtlIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9TcGVjaWZpY09wdGlvbnMtTGludXguY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEwYzk4ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvU3BlY2lmaWNPcHRpb25zLUxpbnV4LmNtYWtlCkBAIC0wLDAgKzEsODEgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgICAgICAgICAgICAgICAgIFNldHVwIG9mIE5hdGl2ZSBMaW51eCBzcGVjaWZpYyBvcHRpb25zCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworbWVzc2FnZSAoU1RBVFVTICIqKioqKiogU2V0dGluZyBvcHRpb25zIGZvciBMaW51eC9HQ0MgKioqKioqIikKKworIyBDb21waWxhdGlvbiBkaXJlY3RpdmVzCithZGRfZGVmaW5pdGlvbnMgICAgICgtRF9fQVZNX1VOSVhfXyAtRF9fQVZNX0xJTlVYX18pCithZGRfY29tcGlsZV9vcHRpb25zICgtZm1lc3NhZ2UtbGVuZ3RoPTAgLXBpcGUpCisKKworU0VUKCBDTUFLRV9FWEVfTElOS0VSX0ZMQUdTICAiJHtDTUFLRV9FWEVfTElOS0VSX0ZMQUdTfSAtbHJ0IiApCittZXNzYWdlKCIgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIENNQUtFX0VYRV9MSU5LRVJfRkxBR1MgJHtDTUFLRV9FWEVfTElOS0VSX0ZMQUdTfSIpCisKKworI3NldChCb29zdF9VU0VfTVVMVElUSFJFQURFRCBPRkYpCisjbWVzc2FnZSgiIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiBCb29zdF9VU0VfTVVMVElUSFJFQURFRCAke0Jvb3N0X1VTRV9NVUxUSVRIUkVBREVEfSIpCisKKworCisKKworCisjIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGFyZSBmaXJzdCB1c2VkIGFzIHNlYXJjaCBoaW50cyBieSBmaW5kIG1vZHVsZXMuIAorIyBJZiBzZWFyY2ggZmFpbGVkLCB0aGV5IGFyZSB1c2VkIGJ5IHRoZSBidWlsZCBtb2R1bGVzIAorCisjIExvY2FsIGNvbmZpZ3VyYXRpb24KKyNzZXQgKFNZTUJFWF9JTlNUQUxMX0RJUiAgICAgICAgL3Vzci9sb2NhbCkKKworIyBISVBQIChIdWRzb24pIGNvbmZpZ3VyYXRpb24KK3NldCAoU1lNQkVYX0lOU1RBTExfRElSICAgICAgICAgJHtDTUFLRV9CSU5BUllfRElSfS93b3Jrc3dpdGgpCisKKworc2V0IChTWU1CRVhfSU5TVEFMTF9JTkNMVURFX0RJUiAke1NZTUJFWF9JTlNUQUxMX0RJUn0vaW5jbHVkZSkKK3NldCAoU1lNQkVYX0lOU1RBTExfTElCX0RJUiAgICAgJHtTWU1CRVhfSU5TVEFMTF9ESVJ9L2xpYikKKworCitzZXQgKENWQzRfSU5TVEFMTF9ESVIgICAgICAgICAgICR7U1lNQkVYX0lOU1RBTExfRElSfSkKK3NldCAoQ1ZDNF9JTlNUQUxMX0lOQ0xVREVfRElSICAgJHtTWU1CRVhfSU5TVEFMTF9JTkNMVURFX0RJUn0pCitzZXQgKENWQzRfSU5TVEFMTF9MSUJfRElSICAgICAgICR7U1lNQkVYX0lOU1RBTExfTElCX0RJUn0pCisKKyMgTk9URTogJ2FudGxyMicgc3VmZml4IGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgYnkgdGhlIGNvbmZpZ3VyZSBzY3JpcHQKK3NldCAoQU5UTFIyX0lOU1RBTExfRElSICAgICAgICAgJHtTWU1CRVhfSU5TVEFMTF9ESVJ9KQorc2V0IChBTlRMUjJfSU5TVEFMTF9JTkNMVURFX0RJUiAke1NZTUJFWF9JTlNUQUxMX0lOQ0xVREVfRElSfSkKK3NldCAoQU5UTFIyX0lOU1RBTExfTElCX0RJUiAgICAgJHtTWU1CRVhfSU5TVEFMTF9MSUJfRElSfSkKKworIyBOT1RFOiAnYW50bHIzYycgc3VmZml4IGlzIG5vdCBhdXRvbWF0aWNhbGx5IGFkZGVkIGJ5IHRoZSBjb25maWd1cmUgc2NyaXB0CitzZXQgKEFOVExSM19JTlNUQUxMX0RJUiAgICAgICAgICR7U1lNQkVYX0lOU1RBTExfRElSfSkKK3NldCAoQU5UTFIzX0lOU1RBTExfSU5DTFVERV9ESVIgJHtTWU1CRVhfSU5TVEFMTF9JTkNMVURFX0RJUn0vYW50bHIzYykKK3NldCAoQU5UTFIzX0lOU1RBTExfTElCX0RJUiAgICAgJHtTWU1CRVhfSU5TVEFMTF9MSUJfRElSfSkKKworCitzZXQgKEJPT1NUX1JPT1QgL3VzcikgIyBpbnN0ZWFkIG9mIC91c3IvbG9jYWwKKworc2V0IChCT09TVF9JTkNMVURFRElSICAgICAgICAgICAke0JPT1NUX1JPT1R9L2luY2x1ZGUvYm9vc3QpCisjc2V0IChCT09TVF9JTkNMVURFX0RJUlMgICAgICAgICR7Qk9PU1RfUk9PVH0vaW5jbHVkZSkKKyNzZXQgKEJPT1NUX0xJQlJBUllESVIgICAgICAgICAgJHtCT09TVF9ST09UfS9saWIpCitzZXQgKEJPT1NUX0xJQlJBUllESVIgICAgICAgICAgIC91c3IvbGliL3g4Nl82NC1saW51eC1nbnUvKQorCisjc2V0IChCT09TVF9ST09UICAgICAgICAgICAgICAgICAvaG9tZS9kaXZlcnNpdHl0ZXN0L2Jvb3N0XzFfNjFfMCkKKyNzZXQgKEJPT1NUX0lOQ0xVREVESVIgICAgICAgICAgIC9ob21lL2RpdmVyc2l0eXRlc3QvYm9vc3RfMV82MV8wL2Jvb3N0KQorI3NldCAoQk9PU1RfTElCUkFSWURJUiAgICAgICAgICAgL2hvbWUvZGl2ZXJzaXR5dGVzdC9ib29zdF8xXzYxXzAvbGlicykKKworCisKK3NldCAoR01QX1JPT1QgL3VzcikgICMgaW5zdGVhZCBvZiAvdXNyL2xvY2FsCisKK3NldCAoR01QX0lOQ0xVREVESVIgJHtHTVBfUk9PVH0vaW5jbHVkZSkKK3NldCAoR01QX0xJQlJBUllESVIgJHtHTVBfUk9PVH0vbGliKQorCitpbmNsdWRlX2RpcmVjdG9yaWVzICgke0NWQzRfSU5TVEFMTF9JTkNMVURFX0RJUn0gJHtBTlRMUjJfSU5TVEFMTF9JTkNMVURFX0RJUn0gJHtBTlRMUjNfSU5TVEFMTF9JTkNMVURFX0RJUn0gJHtCT09TVF9JTkNMVURFRElSfSkKKworCisKKworCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvU3BlY2lmaWNPcHRpb25zLVdpbk1TWVMyLmNtYWtlIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9TcGVjaWZpY09wdGlvbnMtV2luTVNZUzIuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE1NzY2MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvU3BlY2lmaWNPcHRpb25zLVdpbk1TWVMyLmNtYWtlCkBAIC0wLDAgKzEsNTAgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgICAgICAgICAgICAgICAgICAgU2V0dXAgb2YgV2luZG93cy9NU1lTMiBzcGVjaWZpYyBvcHRpb25zCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIE5vdGUgOiBXZSBhc3N1bWUgYSA2NCBiaXRzIGJ1aWx0LCB3aGljaCBpbXBsaWVzIHRoZSB1c2Ugb2YgCisjICAgICAgICAvbXN5czY0L21pbmd3NjQgZGlyZWN0b3J5IGZvciBpbnN0YWxsLgorIworIyBXYXJuaW5nIDogVXNlIFdpbmRvd3Mgc3R5bGUgcGF0aHMgbm90IE1TWVMyIHBhdGggIQorIworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKK21lc3NhZ2UgKFNUQVRVUyAiKioqKioqIFNldHRpbmcgb3B0aW9ucyBmb3IgV2luZG93cy9NU1lTMiAqKioqKioiKQorCisjIENvbXBpbGF0aW9uIGRpcmVjdGl2ZXMKK2FkZF9kZWZpbml0aW9ucyAgICAgKC1EX19BVk1fTUlOR1dfXyAtRF9fQVZNX1dJTkRPV1NfXykKK2FkZF9jb21waWxlX29wdGlvbnMgKC1mbWVzc2FnZS1sZW5ndGg9MCAtcGlwZSkKKworIyBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBhcmUgZmlyc3QgdXNlZCBhcyBzZWFyY2ggaGludHMgYnkgZmluZCBtb2R1bGVzLiAKKyMgSWYgc2VhcmNoIGZhaWxlZCwgdGhleSBhcmUgdXNlZCBieSB0aGUgYnVpbGQgbW9kdWxlcyAoYXMgY29uZmlndXJlIHNjcmlwdHMKKyMgb2YgdGhlIHByZXJlcXVpc2l0ZXMga25vdyBub3RoaW5nIGFib3V0IE1TWVMyLCB3ZSBuZWVkIHRvIGZvcmNlIHRoZW0gdG8gdXNlCisjIHRoZSBNU1lTMiBpbnN0YWxsIGRpcmVjdG9yaWVzKQorCitzZXQgKENWQzRfSU5TVEFMTF9JTkNMVURFX0RJUiAgIEM6L21zeXM2NC9taW5ndzY0L3Vzci9pbmNsdWRlKQorc2V0IChDVkM0X0lOU1RBTExfTElCX0RJUiAgICAgICBDOi9tc3lzNjQvbWluZ3c2NC91c3IvbGliKQorCisjIE5PVEU6ICdhbnRscicgc3VmZml4IGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgYnkgdGhlIGNvbmZpZ3VyZSBzY3JpcHQKK3NldCAoQU5UTFIyX0lOU1RBTExfSU5DTFVERV9ESVIgQzovbXN5czY0L21pbmd3NjQvdXNyL2luY2x1ZGUpCitzZXQgKEFOVExSMl9JTlNUQUxMX0xJQl9ESVIgICAgIEM6L21zeXM2NC9taW5ndzY0L3Vzci9saWIpCisKK3NldCAoQU5UTFIzX0lOU1RBTExfSU5DTFVERV9ESVIgQzovbXN5czY0L21pbmd3NjQvdXNyL2luY2x1ZGUpCitzZXQgKEFOVExSM19JTlNUQUxMX0xJQl9ESVIgICAgIEM6L21zeXM2NC9taW5ndzY0L3Vzci9saWIpCisKKyMgRklYTUUgOiB1c2Ugb2YgLi4uL21pbmd3NjQyIGluc3RlYWQgb2YgLi4uL21pbmd3NjQgaXMgY29tcHVsc29yeSBkdWUgdG8gYSBDVkM0IGNvbmZpZ3VyZSBidWcKK3NldCAoQk9PU1RfUk9PVCAgICAgICAgICAgICAgICAgQzovbXN5czY0L21pbmd3NjQyKSAKK3NldCAoQk9PU1RfSU5DTFVERURJUiAgICAgICAgICAgQzovbXN5czY0L21pbmd3NjQyL2luY2x1ZGUpICMgRklYTUUgCitzZXQgKEJPT1NUX0xJQlJBUllESVIgICAgICAgICAgIEM6L21zeXM2NC9taW5ndzY0Mi9pbmNsdWRlL2xpYikgIyBGSVhNRSAKKworc2V0IChHTVBfUk9PVCBDOi9tc3lzNjQvbWluZ3c2NCkKK3NldCAoR01QX0lOQ0xVREVESVIgQzovbXN5czY0L21pbmd3NjQvaW5jbHVkZSkKK3NldCAoR01QX0xJQlJBUllESVIgQzovbXN5czY0L21pbmd3NjQvbGliKQorCisKKworaW5jbHVkZV9kaXJlY3RvcmllcyAoJHtDVkM0X0lOU1RBTExfSU5DTFVERV9ESVJ9ICR7QU5UTFIyX0lOU1RBTExfSU5DTFVERV9ESVJ9ICR7QU5UTFIzX0lOU1RBTExfSU5DTFVERV9ESVJ9KQorCisjIEZJWE1FIDogVGVtcG9yYXJ5IGJ5cGFzcyBmb3IgdGhlICdDVkM0L2NvbmZpZ3VyZS9ib29zdC9taW5ndzY0JyBidWcgb24gTVNZUzIKK3NldCAoQm9vc3RfSU5DTFVERV9ESVJTIC9taW5ndzY0Mi9pbmNsdWRlKQorc2V0IChCb29zdF9MSUJSQVJZX0RJUlMgL21pbmd3NjQyL2xpYikKKyMgRW5kIEZJWE1FCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL1NwZWNpZmljT3B0aW9ucy1XaW5NaW5HVy5jbWFrZSBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvU3BlY2lmaWNPcHRpb25zLVdpbk1pbkdXLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMzAxYzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL1NwZWNpZmljT3B0aW9ucy1XaW5NaW5HVy5jbWFrZQpAQCAtMCwwICsxLDI4IEBACisjIC0tLSBTZXR1cCBvZiBXaW5kb3dzL01pbkdXIHNwZWNpZmljIG9wdGlvbnMgLS0tCisKK21lc3NhZ2UgKCJTZXR0aW5nIHNwZWNpZmljIG9wdGlvbnMgZm9yIFdpbmRvd3MvTWluR1cuLi4iKQorCisjIENvbXBpbGF0aW9uIGRpcmVjdGl2ZXMKK2FkZF9kZWZpbml0aW9ucyAoLURfX0FWTV9NSU5HV19fIC1EX19BVk1fV0lORE9XU19fKQorYWRkX2NvbXBpbGVfb3B0aW9ucyAoLWZtZXNzYWdlLWxlbmd0aD0wIC1waXBlKQorCisjIFByZXJlcXVpc2l0ZXMgZGVmYXVsdCBsb2NhbGl6YXRpb24KK2lmIChOT1QgQk9PU1RfUk9PVCkKKyAgICBzZXQgKEJPT1NUX1JPT1QgQzovYm9vc3QtMS41MykKK2VuZGlmICgpCisKK2lmIChOT1QgR01QX1JPT1QpCisgIHNldCAoR01QX1JPT1QgQzovR01QKQorZW5kaWYgKCkKKworaWYgKE5PVCBBTlRMUl9ST09UKQorICBzZXQgKEFOVExSX1JPT1QgQzovQU5UTFIpCitlbmRpZiAoKQorCitpZiAoTk9UIENWQzRfUk9PVCkKKyAgc2V0IChDVkM0X1JPT1QgQzovQ1ZDNCkKK2VuZGlmICgpCisKK2lmIChOT1QgT01FR0FfUk9PVCkKKyAgc2V0IChPTUVHQV9ST09UIEM6L09tZWdhKQorZW5kaWYgKCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvYW50bHIyLXBhdGNoL2xpYi9jcHAvYW50bHIvQ2hhclNjYW5uZXIuaHBwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9hbnRscjItcGF0Y2gvbGliL2NwcC9hbnRsci9DaGFyU2Nhbm5lci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIxYWY0MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvYW50bHIyLXBhdGNoL2xpYi9jcHAvYW50bHIvQ2hhclNjYW5uZXIuaHBwCkBAIC0wLDAgKzEsNTg4IEBACisjaWZuZGVmIElOQ19DaGFyU2Nhbm5lcl9ocHBfXworI2RlZmluZSBJTkNfQ2hhclNjYW5uZXJfaHBwX18KKworLyogQU5UTFIgVHJhbnNsYXRvciBHZW5lcmF0b3IKKyAqIFByb2plY3QgbGVkIGJ5IFRlcmVuY2UgUGFyciBhdCBodHRwOi8vd3d3LmpHdXJ1LmNvbQorICogU29mdHdhcmUgcmlnaHRzOiBodHRwOi8vd3d3LmFudGxyLm9yZy9saWNlbnNlLmh0bWwKKyAqCisgKiAkSWQ6IC8vZGVwb3QvY29kZS9vcmcuYW50bHIvcmVsZWFzZS9hbnRsci0yLjcuNy9saWIvY3BwL2FudGxyL0NoYXJTY2FubmVyLmhwcCMyICQKKyAqLworCisKKy8qCitIT1RGSVg6IDIwMTYuMDcuMjgKK1RoaXMgZmlsZSBwcm9kdWNlcyBhIGJ1aWxkIGVycm9yIG9uIGEgbGludXggdWJ1bnR1IHBsYXRmb3JtIHdoZXJlIGFudGxyIGlzIG5vdCBpbnN0YWxsZWQgYnkgZGVmYXVsdAorKGl0IGRvZXMgdGhlIGRvd25sb2FkIGFuZCBpbnN0YWxsIHByb2Nlc3MpCit0aGUgZXJyb3Igc2F5cyBzb21ldGhpbmcgYWJvdXQgIkVPRiIgYmVpbmcgbm90IGRlZmluZWQ7IGEgcG9zc2libGUgc29sdXRpb24gaXMgdG8gaW5jbHVkZSB0aGUgZm9sbG93aW5nIGxpYiA6CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKworCisjaW5jbHVkZSA8YW50bHIvY29uZmlnLmhwcD4KKyNpbmNsdWRlIDxjc3RyaW5nPiAvLyBQYXRjaCBuZWVkZWQgdG8gY29tcGlsZQorI2luY2x1ZGUgPG1hcD4KKworI2lmZGVmIEhBU19OT1RfQ0NUWVBFX0gKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2Vsc2UKKyNpbmNsdWRlIDxjY3R5cGU+CisjZW5kaWYKKworI2lmICggX01TQ19WRVIgPT0gMTIwMCApCisvLyBWQzYgc2VlbXMgdG8gbmVlZCB0aGlzCisvLyBub3RlIHRoYXQgdGhpcyBpcyBub3QgYSBzdGFuZGFyZCBDKysgaW5jbHVkZSBmaWxlLgorIyBpbmNsdWRlIDxzdGRpby5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhbnRsci9Ub2tlblN0cmVhbS5ocHA+CisjaW5jbHVkZSA8YW50bHIvUmVjb2duaXRpb25FeGNlcHRpb24uaHBwPgorI2luY2x1ZGUgPGFudGxyL1NlbWFudGljRXhjZXB0aW9uLmhwcD4KKyNpbmNsdWRlIDxhbnRsci9NaXNtYXRjaGVkQ2hhckV4Y2VwdGlvbi5ocHA+CisjaW5jbHVkZSA8YW50bHIvSW5wdXRCdWZmZXIuaHBwPgorI2luY2x1ZGUgPGFudGxyL0JpdFNldC5ocHA+CisjaW5jbHVkZSA8YW50bHIvTGV4ZXJTaGFyZWRJbnB1dFN0YXRlLmhwcD4KKworI2lmZGVmIEFOVExSX0NYWF9TVVBQT1JUU19OQU1FU1BBQ0UKK25hbWVzcGFjZSBhbnRsciB7CisjZW5kaWYKKworY2xhc3MgQU5UTFJfQVBJIENoYXJTY2FubmVyOworCitBTlRMUl9DX1VTSU5HKHRvbG93ZXIpCisKKyNpZmRlZiBBTlRMUl9SRUFMTFlfTk9fU1RSQ0FTRUNNUAorLy8gQXBwYXJlbnRseSwgbmVpdGhlciBzdHJjYXNlY21wIG5vciBzdHJpY21wIGlzIHN0YW5kYXJkLCBhbmQgQ29kZXdhcnJpb3IKKy8vIG9uIHRoZSBtYWMgaGFzIG5laXRoZXIuLi4KK2lubGluZSBpbnQgc3RyY2FzZWNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpCit7CisJd2hpbGUgKHRydWUpCisJeworCQljaGFyICBjMSA9IHRvbG93ZXIoKnMxKyspLAorCQkJCWMyID0gdG9sb3dlcigqczIrKyk7CisJCWlmIChjMSA8IGMyKSByZXR1cm4gLTE7CisJCWlmIChjMSA+IGMyKSByZXR1cm4gMTsKKwkJaWYgKGMxID09IDApIHJldHVybiAwOworCX0KK30KKyNlbHNlCisjaWZkZWYgTk9fU1RSQ0FTRUNNUAorQU5UTFJfQ19VU0lORyhzdHJpY21wKQorI2Vsc2UKK0FOVExSX0NfVVNJTkcoc3RyY2FzZWNtcCkKKyNlbmRpZgorI2VuZGlmCisKKy8qKiBGdW5jdG9yIGZvciB0aGUgbGl0ZXJhbHMgbWFwCisgKi8KK2NsYXNzIEFOVExSX0FQSSBDaGFyU2Nhbm5lckxpdGVyYWxzTGVzcyA6IHB1YmxpYyBBTlRMUl9VU0VfTkFNRVNQQUNFKHN0ZCliaW5hcnlfZnVuY3Rpb248QU5UTFJfVVNFX05BTUVTUEFDRShzdGQpc3RyaW5nLEFOVExSX1VTRV9OQU1FU1BBQ0Uoc3RkKXN0cmluZyxib29sPiB7Citwcml2YXRlOgorCWNvbnN0IENoYXJTY2FubmVyKiBzY2FubmVyOworcHVibGljOgorI2lmZGVmIE5PX1RFTVBMQVRFX1BBUlRTCisJQ2hhclNjYW5uZXJMaXRlcmFsc0xlc3MoKSB7fSAvLyBub3QgcmVhbGx5IHVzZWQsIGRlZmluaXRpb24gdG8gYXBwZWFzZSBNU1ZDCisjZW5kaWYKKwlDaGFyU2Nhbm5lckxpdGVyYWxzTGVzcyhjb25zdCBDaGFyU2Nhbm5lciogdGhlU2Nhbm5lcikKKwk6IHNjYW5uZXIodGhlU2Nhbm5lcikKKwl7CisJfQorCWJvb2wgb3BlcmF0b3IoKSAoY29uc3QgQU5UTFJfVVNFX05BTUVTUEFDRShzdGQpc3RyaW5nJiB4LGNvbnN0IEFOVExSX1VTRV9OQU1FU1BBQ0Uoc3RkKXN0cmluZyYgeSkgY29uc3Q7CisvLyBkZWZhdWx0cyBhcmUgZ29vZCBlbm91Z2guLgorCS8vCUNoYXJTY2FubmVyTGl0ZXJhbHNMZXNzKGNvbnN0IENoYXJTY2FubmVyTGl0ZXJhbHNMZXNzJik7CisJLy8JQ2hhclNjYW5uZXJMaXRlcmFsc0xlc3MmIG9wZXJhdG9yPShjb25zdCBDaGFyU2Nhbm5lckxpdGVyYWxzTGVzcyYpOworfTsKKworLyoqIFN1cGVyY2xhc3Mgb2YgZ2VuZXJhdGVkIGxleGVycworICovCitjbGFzcyBBTlRMUl9BUEkgQ2hhclNjYW5uZXIgOiBwdWJsaWMgVG9rZW5TdHJlYW0geworcHJvdGVjdGVkOgorCXR5cGVkZWYgUmVmVG9rZW4gKCpmYWN0b3J5X3R5cGUpKCk7CitwdWJsaWM6CisJQ2hhclNjYW5uZXIoSW5wdXRCdWZmZXImIGNiLCBib29sIGNhc2Vfc2Vuc2l0aXZlICk7CisJQ2hhclNjYW5uZXIoSW5wdXRCdWZmZXIqIGNiLCBib29sIGNhc2Vfc2Vuc2l0aXZlICk7CisJQ2hhclNjYW5uZXIoY29uc3QgTGV4ZXJTaGFyZWRJbnB1dFN0YXRlJiBzdGF0ZSwgYm9vbCBjYXNlX3NlbnNpdGl2ZSApOworCisJdmlydHVhbCB+Q2hhclNjYW5uZXIoKQorCXsKKwl9CisKKwl2aXJ0dWFsIGludCBMQSh1bnNpZ25lZCBpbnQgaSk7CisKKwl2aXJ0dWFsIHZvaWQgYXBwZW5kKGNoYXIgYykKKwl7CisJCWlmIChzYXZlQ29uc3VtZWRJbnB1dCkKKwkJeworCQkJc2l6ZV90IGwgPSB0ZXh0Lmxlbmd0aCgpOworCisJCQlpZiAoKGwlMjU2KSA9PSAwKQorCQkJCXRleHQucmVzZXJ2ZShsKzI1Nik7CisKKwkJCXRleHQucmVwbGFjZShsLDAsJmMsMSk7CisJCX0KKwl9CisKKwl2aXJ0dWFsIHZvaWQgYXBwZW5kKGNvbnN0IEFOVExSX1VTRV9OQU1FU1BBQ0Uoc3RkKXN0cmluZyYgcykKKwl7CisJCWlmKCBzYXZlQ29uc3VtZWRJbnB1dCApCisJCQl0ZXh0ICs9IHM7CisJfQorCisJdmlydHVhbCB2b2lkIGNvbW1pdCgpCisJeworCQlpbnB1dFN0YXRlLT5nZXRJbnB1dCgpLmNvbW1pdCgpOworCX0KKworCS8qKiBjYWxsZWQgYnkgdGhlIGdlbmVyYXRlZCBsZXhlciB0byBkbyBlcnJvciByZWNvdmVyeSwgb3ZlcnJpZGUgdG8KKwkgKiBjdXN0b21pemUgdGhlIGJlaGF2aW91ci4KKwkgKi8KKwl2aXJ0dWFsIHZvaWQgcmVjb3Zlcihjb25zdCBSZWNvZ25pdGlvbkV4Y2VwdGlvbiYgZXgsIGNvbnN0IEJpdFNldCYgdG9rZW5TZXQpCisJeworCQljb25zdW1lKCk7CisJCWNvbnN1bWVVbnRpbCh0b2tlblNldCk7CisJfQorCisJdmlydHVhbCB2b2lkIGNvbnN1bWUoKQorCXsKKwkJaWYgKGlucHV0U3RhdGUtPmd1ZXNzaW5nID09IDApCisJCXsKKwkJCWludCBjID0gTEEoMSk7CisJCQlpZiAoY2FzZVNlbnNpdGl2ZSkKKwkJCXsKKwkJCQlhcHBlbmQoYyk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gdXNlIGlucHV0LkxBKCksIG5vdCBMQSgpLCB0byBnZXQgb3JpZ2luYWwgY2FzZQorCQkJCS8vIENoYXJTY2FubmVyLkxBKCkgd291bGQgdG9Mb3dlciBpdC4KKwkJCQlhcHBlbmQoaW5wdXRTdGF0ZS0+Z2V0SW5wdXQoKS5MQSgxKSk7CisJCQl9CisKKwkJCS8vIFJLOiBpbiBhIHNlbnNlIEkgZG9uJ3QgbGlrZSB0aGlzIGF1dG9tYXRpYyBoYW5kbGluZy4KKwkJCWlmIChjID09ICdcdCcpCisJCQkJdGFiKCk7CisJCQllbHNlCisJCQkJaW5wdXRTdGF0ZS0+Y29sdW1uKys7CisJCX0KKwkJaW5wdXRTdGF0ZS0+Z2V0SW5wdXQoKS5jb25zdW1lKCk7CisJfQorCisJLyoqIENvbnN1bWUgY2hhcnMgdW50aWwgb25lIG1hdGNoZXMgdGhlIGdpdmVuIGNoYXIgKi8KKwl2aXJ0dWFsIHZvaWQgY29uc3VtZVVudGlsKGludCBjKQorCXsKKwkJZm9yKDs7KQorCQl7CisJCQlpbnQgbGFfMSA9IExBKDEpOworCQkJaWYoIGxhXzEgPT0gRU9GX0NIQVIgfHwgbGFfMSA9PSBjICkKKwkJCQlicmVhazsKKwkJCWNvbnN1bWUoKTsKKwkJfQorCX0KKworCS8qKiBDb25zdW1lIGNoYXJzIHVudGlsIG9uZSBtYXRjaGVzIHRoZSBnaXZlbiBzZXQgKi8KKwl2aXJ0dWFsIHZvaWQgY29uc3VtZVVudGlsKGNvbnN0IEJpdFNldCYgc2V0KQorCXsKKwkJZm9yKDs7KQorCQl7CisJCQlpbnQgbGFfMSA9IExBKDEpOworCQkJaWYoIGxhXzEgPT0gRU9GX0NIQVIgfHwgc2V0Lm1lbWJlcihsYV8xKSApCisJCQkJYnJlYWs7CisJCQljb25zdW1lKCk7CisJCX0KKwl9CisKKwkvLy8gTWFyayB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgcmV0dXJuIGEgaWQgZm9yIGl0CisJdmlydHVhbCB1bnNpZ25lZCBpbnQgbWFyaygpCisJeworCQlyZXR1cm4gaW5wdXRTdGF0ZS0+Z2V0SW5wdXQoKS5tYXJrKCk7CisJfQorCS8vLyBSZXdpbmQgdGhlIHNjYW5uZXIgdG8gYSBwcmV2aW91c2x5IG1hcmtlZCBwb3NpdGlvbgorCXZpcnR1YWwgdm9pZCByZXdpbmQodW5zaWduZWQgaW50IHBvcykKKwl7CisJCWlucHV0U3RhdGUtPmdldElucHV0KCkucmV3aW5kKHBvcyk7CisJfQorCisJLy8vIFNlZSBpZiBpbnB1dCBjb250YWlucyBjaGFyYWN0ZXIgJ2MnIHRocm93IE1pc21hdGNoZWRDaGFyRXhjZXB0aW9uIGlmIG5vdAorCXZpcnR1YWwgdm9pZCBtYXRjaChpbnQgYykKKwl7CisJCWludCBsYV8xID0gTEEoMSk7CisJCWlmICggbGFfMSAhPSBjICkKKwkJCXRocm93IE1pc21hdGNoZWRDaGFyRXhjZXB0aW9uKGxhXzEsIGMsIGZhbHNlLCB0aGlzKTsKKwkJY29uc3VtZSgpOworCX0KKworCS8qKiBTZWUgaWYgaW5wdXQgY29udGFpbnMgZWxlbWVudCBmcm9tIGJpdHNldCBiCisJICogdGhyb3cgTWlzbWF0Y2hlZENoYXJFeGNlcHRpb24gaWYgbm90CisJICovCisJdmlydHVhbCB2b2lkIG1hdGNoKGNvbnN0IEJpdFNldCYgYikKKwl7CisJCWludCBsYV8xID0gTEEoMSk7CisKKwkJaWYgKCAhYi5tZW1iZXIobGFfMSkgKQorCQkJdGhyb3cgTWlzbWF0Y2hlZENoYXJFeGNlcHRpb24oIGxhXzEsIGIsIGZhbHNlLCB0aGlzICk7CisJCWNvbnN1bWUoKTsKKwl9CisKKwkvKiogU2VlIGlmIGlucHV0IGNvbnRhaW5zIHN0cmluZyAncycgdGhyb3cgTWlzbWF0Y2hlZENoYXJFeGNlcHRpb24gaWYgbm90CisJICogQG5vdGUgdGhlIHN0cmluZyBjYW5ub3QgbWF0Y2ggRU9GCisJICovCisJdmlydHVhbCB2b2lkIG1hdGNoKCBjb25zdCBjaGFyKiBzICkKKwl7CisJCXdoaWxlKCAqcyAhPSAnXDAnICkKKwkJeworCQkJLy8gdGhlICYgMHhGRiBpcyBoZXJlIHRvIHByZXZlbnQgc2lnbiBleHRlbnNpb24gbGF0ZXJvbgorCQkJaW50IGxhXzEgPSBMQSgxKSwgYyA9ICgqcysrICYgMHhGRik7CisKKwkJCWlmICggbGFfMSAhPSBjICkKKwkJCQl0aHJvdyBNaXNtYXRjaGVkQ2hhckV4Y2VwdGlvbihsYV8xLCBjLCBmYWxzZSwgdGhpcyk7CisKKwkJCWNvbnN1bWUoKTsKKwkJfQorCX0KKwkvKiogU2VlIGlmIGlucHV0IGNvbnRhaW5zIHN0cmluZyAncycgdGhyb3cgTWlzbWF0Y2hlZENoYXJFeGNlcHRpb24gaWYgbm90CisJICogQG5vdGUgdGhlIHN0cmluZyBjYW5ub3QgbWF0Y2ggRU9GCisJICovCisJdmlydHVhbCB2b2lkIG1hdGNoKGNvbnN0IEFOVExSX1VTRV9OQU1FU1BBQ0Uoc3RkKXN0cmluZyYgcykKKwl7CisJCXNpemVfdCBsZW4gPSBzLmxlbmd0aCgpOworCisJCWZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCXsKKwkJCS8vIHRoZSAmIDB4RkYgaXMgaGVyZSB0byBwcmV2ZW50IHNpZ24gZXh0ZW5zaW9uIGxhdGVyb24KKwkJCWludCBsYV8xID0gTEEoMSksIGMgPSAoc1tpXSAmIDB4RkYpOworCisJCQlpZiAoIGxhXzEgIT0gYyApCisJCQkJdGhyb3cgTWlzbWF0Y2hlZENoYXJFeGNlcHRpb24obGFfMSwgYywgZmFsc2UsIHRoaXMpOworCisJCQljb25zdW1lKCk7CisJCX0KKwl9CisJLyoqIFNlZSBpZiBpbnB1dCBkb2VzIG5vdCBjb250YWluIGNoYXJhY3RlciAnYycKKwkgKiB0aHJvdyBNaXNtYXRjaGVkQ2hhckV4Y2VwdGlvbiBpZiBub3QKKwkgKi8KKwl2aXJ0dWFsIHZvaWQgbWF0Y2hOb3QoaW50IGMpCisJeworCQlpbnQgbGFfMSA9IExBKDEpOworCisJCWlmICggbGFfMSA9PSBjICkKKwkJCXRocm93IE1pc21hdGNoZWRDaGFyRXhjZXB0aW9uKGxhXzEsIGMsIHRydWUsIHRoaXMpOworCisJCWNvbnN1bWUoKTsKKwl9CisJLyoqIFNlZSBpZiBpbnB1dCBjb250YWlucyBjaGFyYWN0ZXIgaW4gcmFuZ2UgYzEtYzIKKwkgKiB0aHJvdyBNaXNtYXRjaGVkQ2hhckV4Y2VwdGlvbiBpZiBub3QKKwkgKi8KKwl2aXJ0dWFsIHZvaWQgbWF0Y2hSYW5nZShpbnQgYzEsIGludCBjMikKKwl7CisJCWludCBsYV8xID0gTEEoMSk7CisKKwkJaWYgKCBsYV8xIDwgYzEgfHwgbGFfMSA+IGMyICkKKwkJCXRocm93IE1pc21hdGNoZWRDaGFyRXhjZXB0aW9uKGxhXzEsIGMxLCBjMiwgZmFsc2UsIHRoaXMpOworCisJCWNvbnN1bWUoKTsKKwl9CisKKwl2aXJ0dWFsIGJvb2wgZ2V0Q2FzZVNlbnNpdGl2ZSgpIGNvbnN0CisJeworCQlyZXR1cm4gY2FzZVNlbnNpdGl2ZTsKKwl9CisKKwl2aXJ0dWFsIHZvaWQgc2V0Q2FzZVNlbnNpdGl2ZShib29sIHQpCisJeworCQljYXNlU2Vuc2l0aXZlID0gdDsKKwl9CisKKwl2aXJ0dWFsIGJvb2wgZ2V0Q2FzZVNlbnNpdGl2ZUxpdGVyYWxzKCkgY29uc3Q9MDsKKworCS8vLyBHZXQgdGhlIGxpbmUgdGhlIHNjYW5uZXIgY3VycmVudGx5IGlzIGluIChzdGFydHMgYXQgMSkKKwl2aXJ0dWFsIGludCBnZXRMaW5lKCkgY29uc3QKKwl7CisJCXJldHVybiBpbnB1dFN0YXRlLT5saW5lOworCX0KKworCS8vLyBzZXQgdGhlIGxpbmUgbnVtYmVyCisJdmlydHVhbCB2b2lkIHNldExpbmUoaW50IGwpCisJeworCQlpbnB1dFN0YXRlLT5saW5lID0gbDsKKwl9CisKKwkvLy8gR2V0IHRoZSBjb2x1bW4gdGhlIHNjYW5uZXIgY3VycmVudGx5IGlzIGluIChzdGFydHMgYXQgMSkKKwl2aXJ0dWFsIGludCBnZXRDb2x1bW4oKSBjb25zdAorCXsKKwkJcmV0dXJuIGlucHV0U3RhdGUtPmNvbHVtbjsKKwl9CisJLy8vIHNldCB0aGUgY29sdW1uIG51bWJlcgorCXZpcnR1YWwgdm9pZCBzZXRDb2x1bW4oaW50IGMpCisJeworCQlpbnB1dFN0YXRlLT5jb2x1bW4gPSBjOworCX0KKworCS8vLyBnZXQgdGhlIGZpbGVuYW1lIGZvciB0aGUgZmlsZSBjdXJyZW50bHkgdXNlZAorCXZpcnR1YWwgY29uc3QgQU5UTFJfVVNFX05BTUVTUEFDRShzdGQpc3RyaW5nJiBnZXRGaWxlbmFtZSgpIGNvbnN0CisJeworCQlyZXR1cm4gaW5wdXRTdGF0ZS0+ZmlsZW5hbWU7CisJfQorCS8vLyBTZXQgdGhlIGZpbGVuYW1lIHRoZSBzY2FubmVyIGlzIHVzaW5nICh1c2VkIGluIGVycm9yIG1lc3NhZ2VzKQorCXZpcnR1YWwgdm9pZCBzZXRGaWxlbmFtZShjb25zdCBBTlRMUl9VU0VfTkFNRVNQQUNFKHN0ZClzdHJpbmcmIGYpCisJeworCQlpbnB1dFN0YXRlLT5maWxlbmFtZSA9IGY7CisJfQorCisJdmlydHVhbCBib29sIGdldENvbW1pdFRvUGF0aCgpIGNvbnN0CisJeworCQlyZXR1cm4gY29tbWl0VG9QYXRoOworCX0KKworCXZpcnR1YWwgdm9pZCBzZXRDb21taXRUb1BhdGgoYm9vbCBjb21taXQpCisJeworCQljb21taXRUb1BhdGggPSBjb21taXQ7CisJfQorCisJLyoqIHJldHVybiBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgdGV4dCBidWZmZXIgKi8KKwl2aXJ0dWFsIGNvbnN0IEFOVExSX1VTRV9OQU1FU1BBQ0Uoc3RkKXN0cmluZyYgZ2V0VGV4dCgpIGNvbnN0CisJeworCQlyZXR1cm4gdGV4dDsKKwl9CisKKwl2aXJ0dWFsIHZvaWQgc2V0VGV4dChjb25zdCBBTlRMUl9VU0VfTkFNRVNQQUNFKHN0ZClzdHJpbmcmIHMpCisJeworCQl0ZXh0ID0gczsKKwl9CisKKwl2aXJ0dWFsIHZvaWQgcmVzZXRUZXh0KCkKKwl7CisJCXRleHQgPSAiIjsKKwkJaW5wdXRTdGF0ZS0+dG9rZW5TdGFydENvbHVtbiA9IGlucHV0U3RhdGUtPmNvbHVtbjsKKwkJaW5wdXRTdGF0ZS0+dG9rZW5TdGFydExpbmUgPSBpbnB1dFN0YXRlLT5saW5lOworCX0KKworCXZpcnR1YWwgUmVmVG9rZW4gZ2V0VG9rZW5PYmplY3QoKSBjb25zdAorCXsKKwkJcmV0dXJuIF9yZXR1cm5Ub2tlbjsKKwl9CisKKwkvKiogVXNlZCB0byBrZWVwIHRyYWNrIG9mIGxpbmUgYnJlYWtzLCBuZWVkcyB0byBiZSBjYWxsZWQgZnJvbQorCSAqIHdpdGhpbiBnZW5lcmF0ZWQgbGV4ZXJzIHdoZW4gYSBcbiBcciBpcyBlbmNvdW50ZXJlZC4KKwkgKi8KKwl2aXJ0dWFsIHZvaWQgbmV3bGluZSgpCisJeworCQkrK2lucHV0U3RhdGUtPmxpbmU7CisJCWlucHV0U3RhdGUtPmNvbHVtbiA9IDE7CisJfQorCisJLyoqIEFkdmFuY2UgdGhlIGN1cnJlbnQgY29sdW1uIG51bWJlciBieSBhbiBhcHByb3ByaWF0ZSBhbW91bnQgYWNjb3JkaW5nCisJICogdG8gdGhlIHRhYnNpemUuIFRoaXMgbWV0aG9kIG5lZWRzIHRvIGJlIGV4cGxpY2l0bHkgY2FsbGVkIGZyb20gdGhlCisJICogbGV4ZXIgcnVsZXMgZW5jb3VudGVyaW5nIHRhYnMuCisJICovCisJdmlydHVhbCB2b2lkIHRhYigpCisJeworCQlpbnQgYyA9IGdldENvbHVtbigpOworCQlpbnQgbmMgPSAoICgoYy0xKS90YWJzaXplKSArIDEpICogdGFic2l6ZSArIDE7ICAgICAgLy8gY2FsY3VsYXRlIHRhYiBzdG9wCisJCXNldENvbHVtbiggbmMgKTsKKwl9CisJLy8vIHNldCB0aGUgdGFic2l6ZS4gUmV0dXJucyB0aGUgb2xkIHRhYnNpemUKKwlpbnQgc2V0VGFic2l6ZSggaW50IHNpemUgKQorCXsKKwkJaW50IG9sZHNpemUgPSB0YWJzaXplOworCQl0YWJzaXplID0gc2l6ZTsKKwkJcmV0dXJuIG9sZHNpemU7CisJfQorCS8vLyBSZXR1cm4gdGhlIHRhYnNpemUgdXNlZCBieSB0aGUgc2Nhbm5lcgorCWludCBnZXRUYWJTaXplKCkgY29uc3QKKwl7CisJCXJldHVybiB0YWJzaXplOworCX0KKworCS8qKiBSZXBvcnQgZXhjZXB0aW9uIGVycm9ycyBjYXVnaHQgaW4gbmV4dFRva2VuKCkgKi8KKwl2aXJ0dWFsIHZvaWQgcmVwb3J0RXJyb3IoY29uc3QgUmVjb2duaXRpb25FeGNlcHRpb24mIGUpOworCisJLyoqIFBhcnNlciBlcnJvci1yZXBvcnRpbmcgZnVuY3Rpb24gY2FuIGJlIG92ZXJyaWRkZW4gaW4gc3ViY2xhc3MgKi8KKwl2aXJ0dWFsIHZvaWQgcmVwb3J0RXJyb3IoY29uc3QgQU5UTFJfVVNFX05BTUVTUEFDRShzdGQpc3RyaW5nJiBzKTsKKworCS8qKiBQYXJzZXIgd2FybmluZy1yZXBvcnRpbmcgZnVuY3Rpb24gY2FuIGJlIG92ZXJyaWRkZW4gaW4gc3ViY2xhc3MgKi8KKwl2aXJ0dWFsIHZvaWQgcmVwb3J0V2FybmluZyhjb25zdCBBTlRMUl9VU0VfTkFNRVNQQUNFKHN0ZClzdHJpbmcmIHMpOworCisJdmlydHVhbCBJbnB1dEJ1ZmZlciYgZ2V0SW5wdXRCdWZmZXIoKQorCXsKKwkJcmV0dXJuIGlucHV0U3RhdGUtPmdldElucHV0KCk7CisJfQorCisJdmlydHVhbCBMZXhlclNoYXJlZElucHV0U3RhdGUgZ2V0SW5wdXRTdGF0ZSgpCisJeworCQlyZXR1cm4gaW5wdXRTdGF0ZTsKKwl9CisKKwkvKiogc2V0IHRoZSBpbnB1dCBzdGF0ZSBmb3IgdGhlIGxleGVyLgorCSAqIEBub3RlIHN0YXRlIGlzIGEgcmVmZXJlbmNlIGNvdW50ZWQgb2JqZWN0LCBoZW5jZSBubyByZWZlcmVuY2UgKi8KKwl2aXJ0dWFsIHZvaWQgc2V0SW5wdXRTdGF0ZShMZXhlclNoYXJlZElucHV0U3RhdGUgc3RhdGUpCisJeworCQlpbnB1dFN0YXRlID0gc3RhdGU7CisJfQorCisJLy8vIFNldCB0aGUgZmFjdG9yeSBmb3IgY3JlYXRlZCB0b2tlbnMKKwl2aXJ0dWFsIHZvaWQgc2V0VG9rZW5PYmplY3RGYWN0b3J5KGZhY3RvcnlfdHlwZSBmYWN0b3J5KQorCXsKKwkJdG9rZW5GYWN0b3J5ID0gZmFjdG9yeTsKKwl9CisKKwkvKiogVGVzdCB0aGUgdG9rZW4gdGV4dCBhZ2FpbnN0IHRoZSBsaXRlcmFscyB0YWJsZQorCSAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHBlcmZvcm0gYSBkaWZmZXJlbnQgbGl0ZXJhbHMgdGVzdAorCSAqLworCXZpcnR1YWwgaW50IHRlc3RMaXRlcmFsc1RhYmxlKGludCB0dHlwZSkgY29uc3QKKwl7CisJCUFOVExSX1VTRV9OQU1FU1BBQ0Uoc3RkKW1hcDxBTlRMUl9VU0VfTkFNRVNQQUNFKHN0ZClzdHJpbmcsaW50LENoYXJTY2FubmVyTGl0ZXJhbHNMZXNzPjo6Y29uc3RfaXRlcmF0b3IgaSA9IGxpdGVyYWxzLmZpbmQodGV4dCk7CisJCWlmIChpICE9IGxpdGVyYWxzLmVuZCgpKQorCQkJdHR5cGUgPSAoKmkpLnNlY29uZDsKKwkJcmV0dXJuIHR0eXBlOworCX0KKworCS8qKiBUZXN0IHRoZSB0ZXh0IHBhc3NlZCBpbiBhZ2FpbnN0IHRoZSBsaXRlcmFscyB0YWJsZQorCSAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHBlcmZvcm0gYSBkaWZmZXJlbnQgbGl0ZXJhbHMgdGVzdAorCSAqIFRoaXMgaXMgdXNlZCBwcmltYXJpbHkgd2hlbiB5b3Ugd2FudCB0byB0ZXN0IGEgcG9ydGlvbiBvZgorCSAqIGEgdG9rZW4KKwkgKi8KKwl2aXJ0dWFsIGludCB0ZXN0TGl0ZXJhbHNUYWJsZShjb25zdCBBTlRMUl9VU0VfTkFNRVNQQUNFKHN0ZClzdHJpbmcmIHR4dCxpbnQgdHR5cGUpIGNvbnN0CisJeworCQlBTlRMUl9VU0VfTkFNRVNQQUNFKHN0ZCltYXA8QU5UTFJfVVNFX05BTUVTUEFDRShzdGQpc3RyaW5nLGludCxDaGFyU2Nhbm5lckxpdGVyYWxzTGVzcz46OmNvbnN0X2l0ZXJhdG9yIGkgPSBsaXRlcmFscy5maW5kKHR4dCk7CisJCWlmIChpICE9IGxpdGVyYWxzLmVuZCgpKQorCQkJdHR5cGUgPSAoKmkpLnNlY29uZDsKKwkJcmV0dXJuIHR0eXBlOworCX0KKworCS8vLyBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBnZXQgbW9yZSBzcGVjaWZpYyBjYXNlIGhhbmRsaW5nCisJdmlydHVhbCBpbnQgdG9Mb3dlcihpbnQgYykgY29uc3QKKwl7CisJCS8vIHRlc3Qgb24gRU9GX0NIQVIgZm9yIGJ1Z2d5ICg/KSBTVExQb3J0IHRvbG93ZXIgKG9yIEhQVVggdG9sb3dlcj8pCisJCS8vIGFsc28gVkMrKyA2LjAgZG9lcyB0aGlzLiAoc2VlIGZpeCA0MjIgKGlzIHJldmVydGVkIGJ5IHRoaXMgZml4KQorCQkvLyB0aGlzIG9uZSBpcyBtb3JlIHN0cnVjdHVyYWwuIE1heWJlIG1ha2UgdGhpcyBjb25maWd1cmFibGUuCisJCXJldHVybiAoYyA9PSBFT0ZfQ0hBUiA/IEVPRl9DSEFSIDogdG9sb3dlcihjKSk7CisJfQorCisJLyoqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBZb3VyTGV4ZXI6Om5leHRUb2tlbigpIHdoZW4gdGhlIGxleGVyIGhhcworCSAqICBoaXQgRU9GIGNvbmRpdGlvbi4gIEVPRiBpcyBOT1QgYSBjaGFyYWN0ZXIuCisJICogIFRoaXMgbWV0aG9kIGlzIG5vdCBjYWxsZWQgaWYgRU9GIGlzIHJlYWNoZWQgZHVyaW5nCisJICogIHN5bnRhY3RpYyBwcmVkaWNhdGUgZXZhbHVhdGlvbiBvciBkdXJpbmcgZXZhbHVhdGlvbgorCSAqICBvZiBub3JtYWwgbGV4aWNhbCBydWxlcywgd2hpY2ggcHJlc3VtYWJseSB3b3VsZCBiZQorCSAqICBhbiBJT0V4Y2VwdGlvbi4gIFRoaXMgdHJhcHMgdGhlICJub3JtYWwiIEVPRiBjb25kaXRpb24uCisJICoKKwkgKiAgdXBvbkVPRigpIGlzIGNhbGxlZCBhZnRlciB0aGUgY29tcGxldGUgZXZhbHVhdGlvbiBvZgorCSAqICB0aGUgcHJldmlvdXMgdG9rZW4gYW5kIG9ubHkgaWYgeW91ciBwYXJzZXIgYXNrcworCSAqICBmb3IgYW5vdGhlciB0b2tlbiBiZXlvbmQgdGhhdCBsYXN0IG5vbi1FT0YgdG9rZW4uCisJICoKKwkgKiAgWW91IG1pZ2h0IHdhbnQgdG8gdGhyb3cgdG9rZW4gb3IgY2hhciBzdHJlYW0gZXhjZXB0aW9ucworCSAqICBsaWtlOiAiSGVoLCBwcmVtYXR1cmUgZW9mIiBvciBhIHJldHJ5IHN0cmVhbSBleGNlcHRpb24KKwkgKiAgKCJJIGZvdW5kIHRoZSBlbmQgb2YgdGhpcyBmaWxlLCBnbyBiYWNrIHRvIHJlZmVyZW5jaW5nIGZpbGUiKS4KKwkgKi8KKwl2aXJ0dWFsIHZvaWQgdXBvbkVPRigpCisJeworCX0KKworCS8vLyBNZXRob2RzIHVzZWQgdG8gY2hhbmdlIHRyYWNpbmcgYmVoYXZpb3IKKwl2aXJ0dWFsIHZvaWQgdHJhY2VJbmRlbnQoKTsKKwl2aXJ0dWFsIHZvaWQgdHJhY2VJbihjb25zdCBjaGFyKiBybmFtZSk7CisJdmlydHVhbCB2b2lkIHRyYWNlT3V0KGNvbnN0IGNoYXIqIHJuYW1lKTsKKworI2lmbmRlZiBOT19TVEFUSUNfQ09OU1RTCisJc3RhdGljIGNvbnN0IGludCBFT0ZfQ0hBUiA9IEVPRjsKKyNlbHNlCisJZW51bSB7CisJCUVPRl9DSEFSID0gRU9GCisJfTsKKyNlbmRpZgorcHJvdGVjdGVkOgorCUFOVExSX1VTRV9OQU1FU1BBQ0Uoc3RkKXN0cmluZyB0ZXh0OyAvLy88IFRleHQgb2YgY3VycmVudCB0b2tlbgorIAkvLy8gZmxhZyBpbmRpY2F0aW5nIHdldGhlciBjb25zdW1lIHNhdmVzIGNoYXJhY3RlcnMKKwlib29sIHNhdmVDb25zdW1lZElucHV0OworCWZhY3RvcnlfdHlwZSB0b2tlbkZhY3Rvcnk7CQkJCS8vLzwgRmFjdG9yeSBmb3IgdG9rZW5zCisJYm9vbCBjYXNlU2Vuc2l0aXZlOyAJCQkJCQkvLy88IElzIHRoaXMgbGV4ZXIgY2FzZSBzZW5zaXRpdmUKKwlBTlRMUl9VU0VfTkFNRVNQQUNFKHN0ZCltYXA8QU5UTFJfVVNFX05BTUVTUEFDRShzdGQpc3RyaW5nLGludCxDaGFyU2Nhbm5lckxpdGVyYWxzTGVzcz4gbGl0ZXJhbHM7IC8vIHNldCBieSBzdWJjbGFzcworCisJUmVmVG9rZW4gX3JldHVyblRva2VuOwkJLy8vPCB1c2VkIHRvIHJldHVybiB0b2tlbnMgdy9vIHVzaW5nIHJldHVybiB2YWwKKworCS8vLyBJbnB1dCBzdGF0ZSwgZ2l2ZXMgYWNjZXNzIHRvIGlucHV0IHN0cmVhbSwgc2hhcmVkIGFtb25nIGRpZmZlcmVudCBsZXhlcnMKKwlMZXhlclNoYXJlZElucHV0U3RhdGUgaW5wdXRTdGF0ZTsKKworCS8qKiBVc2VkIGR1cmluZyBmaWx0ZXIgbW9kZSB0byBpbmRpY2F0ZSB0aGF0IHBhdGggaXMgZGVzaXJlZC4KKwkgKiBBIHN1YnNlcXVlbnQgc2NhbiBlcnJvciB3aWxsIHJlcG9ydCBhbiBlcnJvciBhcyB1c3VhbAorCSAqIGlmIGFjY2VwdFBhdGg9dHJ1ZTsKKwkgKi8KKwlib29sIGNvbW1pdFRvUGF0aDsKKworCWludCB0YWJzaXplOyAJLy8vPCB0YWIgc2l6ZSB0aGUgc2Nhbm5lciB1c2VzLgorCisJLy8vIENyZWF0ZSBhIG5ldyBSZWZUb2tlbiBvZiB0eXBlIHQKKwl2aXJ0dWFsIFJlZlRva2VuIG1ha2VUb2tlbihpbnQgdCkKKwl7CisJCVJlZlRva2VuIHRvayA9IHRva2VuRmFjdG9yeSgpOworCQl0b2stPnNldFR5cGUodCk7CisJCXRvay0+c2V0Q29sdW1uKGlucHV0U3RhdGUtPnRva2VuU3RhcnRDb2x1bW4pOworCQl0b2stPnNldExpbmUoaW5wdXRTdGF0ZS0+dG9rZW5TdGFydExpbmUpOworCQlyZXR1cm4gdG9rOworCX0KKworCS8qKiBUcmFjZXIgY2xhc3MsIHVzZWQgd2hlbiAtdHJhY2VMZXhlciBpcyBwYXNzZWQgdG8gYW50bHIKKwkgKi8KKwljbGFzcyBUcmFjZXIgeworCXByaXZhdGU6CisJCUNoYXJTY2FubmVyKiBwYXJzZXI7CisJCWNvbnN0IGNoYXIqIHRleHQ7CisKKwkJVHJhY2VyKGNvbnN0IFRyYWNlciYgb3RoZXIpOyAJCQkJCS8vIHVuZGVmaW5lZAorCQlUcmFjZXImIG9wZXJhdG9yPShjb25zdCBUcmFjZXImIG90aGVyKTsgCS8vIHVuZGVmaW5lZAorCXB1YmxpYzoKKwkJVHJhY2VyKCBDaGFyU2Nhbm5lciogcCxjb25zdCBjaGFyKiB0ICkKKwkJOiBwYXJzZXIocCksIHRleHQodCkKKwkJeworCQkJcGFyc2VyLT50cmFjZUluKHRleHQpOworCQl9CisJCX5UcmFjZXIoKQorCQl7CisJCQlwYXJzZXItPnRyYWNlT3V0KHRleHQpOworCQl9CisJfTsKKworCWludCB0cmFjZURlcHRoOworcHJpdmF0ZToKKwlDaGFyU2Nhbm5lciggY29uc3QgQ2hhclNjYW5uZXImIG90aGVyICk7IAkJCSAgCQkvLyB1bmRlZmluZWQKKwlDaGFyU2Nhbm5lciYgb3BlcmF0b3I9KCBjb25zdCBDaGFyU2Nhbm5lciYgb3RoZXIgKTsJLy8gdW5kZWZpbmVkCisKKyNpZm5kZWYgTk9fU1RBVElDX0NPTlNUUworCXN0YXRpYyBjb25zdCBpbnQgTk9fQ0hBUiA9IDA7CisjZWxzZQorCWVudW0geworCQlOT19DSEFSID0gMAorCX07CisjZW5kaWYKK307CisKK2lubGluZSBpbnQgQ2hhclNjYW5uZXI6OkxBKHVuc2lnbmVkIGludCBpKQoreworCWludCBjID0gaW5wdXRTdGF0ZS0+Z2V0SW5wdXQoKS5MQShpKTsKKworCWlmICggY2FzZVNlbnNpdGl2ZSApCisJCXJldHVybiBjOworCWVsc2UKKwkJcmV0dXJuIHRvTG93ZXIoYyk7CS8vIFZDIDYgdG9sb3dlciBidWcgY2F1Z2h0IGluIHRvTG93ZXIuCit9CisKK2lubGluZSBib29sIENoYXJTY2FubmVyTGl0ZXJhbHNMZXNzOjpvcGVyYXRvcigpIChjb25zdCBBTlRMUl9VU0VfTkFNRVNQQUNFKHN0ZClzdHJpbmcmIHgsY29uc3QgQU5UTFJfVVNFX05BTUVTUEFDRShzdGQpc3RyaW5nJiB5KSBjb25zdAoreworCWlmIChzY2FubmVyLT5nZXRDYXNlU2Vuc2l0aXZlTGl0ZXJhbHMoKSkKKwkJcmV0dXJuIEFOVExSX1VTRV9OQU1FU1BBQ0Uoc3RkKWxlc3M8QU5UTFJfVVNFX05BTUVTUEFDRShzdGQpc3RyaW5nPigpKHgseSk7CisJZWxzZQorCXsKKyNpZmRlZiBOT19TVFJDQVNFQ01QCisJCXJldHVybiAoc3RyaWNtcCh4LmNfc3RyKCkseS5jX3N0cigpKTwwKTsKKyNlbHNlCisJCXJldHVybiAoc3RyY2FzZWNtcCh4LmNfc3RyKCkseS5jX3N0cigpKTwwKTsKKyNlbmRpZgorCX0KK30KKworI2lmZGVmIEFOVExSX0NYWF9TVVBQT1JUU19OQU1FU1BBQ0UKK30KKyNlbmRpZgorCisjZW5kaWYgLy9JTkNfQ2hhclNjYW5uZXJfaHBwX18KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvYW50bHIyLXBhdGNoL3NjcmlwdHMvY29uZmlnLmd1ZXNzIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9hbnRscjItcGF0Y2gvc2NyaXB0cy9jb25maWcuZ3Vlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc5MjUyZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvYW50bHIyLXBhdGNoL3NjcmlwdHMvY29uZmlnLmd1ZXNzCkBAIC0wLDAgKzEsMTU1OCBAQAorIyEgL2Jpbi9zaAorIyBBdHRlbXB0IHRvIGd1ZXNzIGEgY2Fub25pY2FsIHN5c3RlbSBuYW1lLgorIyAgIENvcHlyaWdodCAxOTkyLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK3RpbWVzdGFtcD0nMjAxMy0wNi0xMCcKKworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorIworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0CisjIHByb2dyYW0uICBUaGlzIEV4Y2VwdGlvbiBpcyBhbiBhZGRpdGlvbmFsIHBlcm1pc3Npb24gdW5kZXIgc2VjdGlvbiA3CisjIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAzICgiR1BMdjMiKS4KKyMKKyMgT3JpZ2luYWxseSB3cml0dGVuIGJ5IFBlciBCb3RobmVyLgorIworIyBZb3UgY2FuIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBzY3JpcHQgZnJvbToKKyMgaHR0cDovL2dpdC5zYXZhbm5haC5nbnUub3JnL2dpdHdlYi8/cD1jb25maWcuZ2l0O2E9YmxvYl9wbGFpbjtmPWNvbmZpZy5ndWVzcztoYj1IRUFECisjCisjIFBsZWFzZSBzZW5kIHBhdGNoZXMgd2l0aCBhIENoYW5nZUxvZyBlbnRyeSB0byBjb25maWctcGF0Y2hlc0BnbnUub3JnLgorCisKK21lPWBlY2hvICIkMCIgfCBzZWQgLWUgJ3MsLiovLCwnYAorCit1c2FnZT0iXAorVXNhZ2U6ICQwIFtPUFRJT05dCisKK091dHB1dCB0aGUgY29uZmlndXJhdGlvbiBuYW1lIG9mIHRoZSBzeXN0ZW0gXGAkbWUnIGlzIHJ1biBvbi4KKworT3BlcmF0aW9uIG1vZGVzOgorICAtaCwgLS1oZWxwICAgICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKKyAgLXQsIC0tdGltZS1zdGFtcCAgIHByaW50IGRhdGUgb2YgbGFzdCBtb2RpZmljYXRpb24sIHRoZW4gZXhpdAorICAtdiwgLS12ZXJzaW9uICAgICAgcHJpbnQgdmVyc2lvbiBudW1iZXIsIHRoZW4gZXhpdAorCitSZXBvcnQgYnVncyBhbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uIgorCit2ZXJzaW9uPSJcCitHTlUgY29uZmlnLmd1ZXNzICgkdGltZXN0YW1wKQorCitPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgUGVyIEJvdGhuZXIuCitDb3B5cmlnaHQgMTk5Mi0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOTword2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIgorCitoZWxwPSIKK1RyeSBcYCRtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKKworIyBQYXJzZSBjb21tYW5kIGxpbmUKK3doaWxlIHRlc3QgJCMgLWd0IDAgOyBkbworICBjYXNlICQxIGluCisgICAgLS10aW1lLXN0YW1wIHwgLS10aW1lKiB8IC10ICkKKyAgICAgICBlY2hvICIkdGltZXN0YW1wIiA7IGV4aXQgOzsKKyAgICAtLXZlcnNpb24gfCAtdiApCisgICAgICAgZWNobyAiJHZlcnNpb24iIDsgZXhpdCA7OworICAgIC0taGVscCB8IC0taCogfCAtaCApCisgICAgICAgZWNobyAiJHVzYWdlIjsgZXhpdCA7OworICAgIC0tICkgICAgICMgU3RvcCBvcHRpb24gcHJvY2Vzc2luZworICAgICAgIHNoaWZ0OyBicmVhayA7OworICAgIC0gKQkjIFVzZSBzdGRpbiBhcyBpbnB1dC4KKyAgICAgICBicmVhayA7OworICAgIC0qICkKKyAgICAgICBlY2hvICIkbWU6IGludmFsaWQgb3B0aW9uICQxJGhlbHAiID4mMgorICAgICAgIGV4aXQgMSA7OworICAgICogKQorICAgICAgIGJyZWFrIDs7CisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAkIyAhPSAwOyB0aGVuCisgIGVjaG8gIiRtZTogdG9vIG1hbnkgYXJndW1lbnRzJGhlbHAiID4mMgorICBleGl0IDEKK2ZpCisKK3RyYXAgJ2V4aXQgMScgMSAyIDE1CisKKyMgQ0NfRk9SX0JVSUxEIC0tIGNvbXBpbGVyIHVzZWQgYnkgdGhpcyBzY3JpcHQuIE5vdGUgdGhhdCB0aGUgdXNlIG9mIGEKKyMgY29tcGlsZXIgdG8gYWlkIGluIHN5c3RlbSBkZXRlY3Rpb24gaXMgZGlzY291cmFnZWQgYXMgaXQgcmVxdWlyZXMKKyMgdGVtcG9yYXJ5IGZpbGVzIHRvIGJlIGNyZWF0ZWQgYW5kLCBhcyB5b3UgY2FuIHNlZSBiZWxvdywgaXQgaXMgYQorIyBoZWFkYWNoZSB0byBkZWFsIHdpdGggaW4gYSBwb3J0YWJsZSBmYXNoaW9uLgorCisjIEhpc3RvcmljYWxseSwgYENDX0ZPUl9CVUlMRCcgdXNlZCB0byBiZSBuYW1lZCBgSE9TVF9DQycuIFdlIHN0aWxsCisjIHVzZSBgSE9TVF9DQycgaWYgZGVmaW5lZCwgYnV0IGl0IGlzIGRlcHJlY2F0ZWQuCisKKyMgUG9ydGFibGUgdG1wIGRpcmVjdG9yeSBjcmVhdGlvbiBpbnNwaXJlZCBieSB0aGUgQXV0b2NvbmYgdGVhbS4KKworc2V0X2NjX2Zvcl9idWlsZD0nCit0cmFwICJleGl0Y29kZT1cJD87IChybSAtZiBcJHRtcGZpbGVzIDI+L2Rldi9udWxsOyBybWRpciBcJHRtcCAyPi9kZXYvbnVsbCkgJiYgZXhpdCBcJGV4aXRjb2RlIiAwIDsKK3RyYXAgInJtIC1mIFwkdG1wZmlsZXMgMj4vZGV2L251bGw7IHJtZGlyIFwkdG1wIDI+L2Rldi9udWxsOyBleGl0IDEiIDEgMiAxMyAxNSA7Cis6ICR7VE1QRElSPS90bXB9IDsKKyB7IHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgIiRUTVBESVIvY2dYWFhYWFgiKSAyPi9kZXYvbnVsbGAgJiYgdGVzdCAtbiAiJHRtcCIgJiYgdGVzdCAtZCAiJHRtcCIgOyB9IHx8CisgeyB0ZXN0IC1uICIkUkFORE9NIiAmJiB0bXA9JFRNUERJUi9jZyQkLSRSQU5ET00gJiYgKHVtYXNrIDA3NyAmJiBta2RpciAkdG1wKSA7IH0gfHwKKyB7IHRtcD0kVE1QRElSL2NnLSQkICYmICh1bWFzayAwNzcgJiYgbWtkaXIgJHRtcCkgJiYgZWNobyAiV2FybmluZzogY3JlYXRpbmcgaW5zZWN1cmUgdGVtcCBkaXJlY3RvcnkiID4mMiA7IH0gfHwKKyB7IGVjaG8gIiRtZTogY2Fubm90IGNyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gJFRNUERJUiIgPiYyIDsgZXhpdCAxIDsgfSA7CitkdW1teT0kdG1wL2R1bW15IDsKK3RtcGZpbGVzPSIkZHVtbXkuYyAkZHVtbXkubyAkZHVtbXkucmVsICRkdW1teSIgOworY2FzZSAkQ0NfRk9SX0JVSUxELCRIT1NUX0NDLCRDQyBpbgorICwsKSAgICBlY2hvICJpbnQgeDsiID4gJGR1bW15LmMgOworCWZvciBjIGluIGNjIGdjYyBjODkgYzk5IDsgZG8KKwkgIGlmICgkYyAtYyAtbyAkZHVtbXkubyAkZHVtbXkuYykgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgorCSAgICAgQ0NfRk9SX0JVSUxEPSIkYyI7IGJyZWFrIDsKKwkgIGZpIDsKKwlkb25lIDsKKwlpZiB0ZXN0IHgiJENDX0ZPUl9CVUlMRCIgPSB4IDsgdGhlbgorCSAgQ0NfRk9SX0JVSUxEPW5vX2NvbXBpbGVyX2ZvdW5kIDsKKwlmaQorCTs7CisgLCwqKSAgIENDX0ZPUl9CVUlMRD0kQ0MgOzsKKyAsKiwqKSAgQ0NfRk9SX0JVSUxEPSRIT1NUX0NDIDs7Citlc2FjIDsgc2V0X2NjX2Zvcl9idWlsZD0gOycKKworIyBUaGlzIGlzIG5lZWRlZCB0byBmaW5kIHVuYW1lIG9uIGEgUHlyYW1pZCBPU3ggd2hlbiBydW4gaW4gdGhlIEJTRCB1bml2ZXJzZS4KKyMgKGdoYXppQG5vYy5ydXRnZXJzLmVkdSAxOTk0LTA4LTI0KQoraWYgKHRlc3QgLWYgLy5hdHRiaW4vdW5hbWUpID4vZGV2L251bGwgMj4mMSA7IHRoZW4KKwlQQVRIPSRQQVRIOi8uYXR0YmluIDsgZXhwb3J0IFBBVEgKK2ZpCisKK1VOQU1FX01BQ0hJTkU9YCh1bmFtZSAtbSkgMj4vZGV2L251bGxgIHx8IFVOQU1FX01BQ0hJTkU9dW5rbm93bgorVU5BTUVfUkVMRUFTRT1gKHVuYW1lIC1yKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfUkVMRUFTRT11bmtub3duCitVTkFNRV9TWVNURU09YCh1bmFtZSAtcykgMj4vZGV2L251bGxgICB8fCBVTkFNRV9TWVNURU09dW5rbm93bgorVU5BTUVfVkVSU0lPTj1gKHVuYW1lIC12KSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfVkVSU0lPTj11bmtub3duCisKK2Nhc2UgIiR7VU5BTUVfU1lTVEVNfSIgaW4KK0xpbnV4fEdOVXxHTlUvKikKKwkjIElmIHRoZSBzeXN0ZW0gbGFja3MgYSBjb21waWxlciwgdGhlbiBqdXN0IHBpY2sgZ2xpYmMuCisJIyBXZSBjb3VsZCBwcm9iYWJseSB0cnkgaGFyZGVyLgorCUxJQkM9Z251CisKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJY2F0IDw8LUVPRiA+ICRkdW1teS5jCisJI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisJI2lmIGRlZmluZWQoX19VQ0xJQkNfXykKKwlMSUJDPXVjbGliYworCSNlbGlmIGRlZmluZWQoX19kaWV0bGliY19fKQorCUxJQkM9ZGlldGxpYmMKKwkjZWxzZQorCUxJQkM9Z251CisJI2VuZGlmCisJRU9GCisJZXZhbCBgJENDX0ZPUl9CVUlMRCAtRSAkZHVtbXkuYyAyPi9kZXYvbnVsbCB8IGdyZXAgJ15MSUJDJ2AKKwk7OworZXNhYworCisjIE5vdGU6IG9yZGVyIGlzIHNpZ25pZmljYW50IC0gdGhlIGNhc2UgYnJhbmNoZXMgYXJlIG5vdCBleGNsdXNpdmUuCisKK2Nhc2UgIiR7VU5BTUVfTUFDSElORX06JHtVTkFNRV9TWVNURU19OiR7VU5BTUVfUkVMRUFTRX06JHtVTkFNRV9WRVJTSU9OfSIgaW4KKyAgICAqOk5ldEJTRDoqOiopCisJIyBOZXRCU0QgKG5ic2QpIHRhcmdldHMgc2hvdWxkICh3aGVyZSBhcHBsaWNhYmxlKSBtYXRjaCBvbmUgb3IKKwkjIG1vcmUgb2YgdGhlIHR1cGxlczogKi0qLW5ldGJzZGVsZiosICotKi1uZXRic2Rhb3V0KiwKKwkjICotKi1uZXRic2RlY29mZiogYW5kICotKi1uZXRic2QqLiAgRm9yIHRhcmdldHMgdGhhdCByZWNlbnRseQorCSMgc3dpdGNoZWQgdG8gRUxGLCAqLSotbmV0YnNkKiB3b3VsZCBzZWxlY3QgdGhlIG9sZAorCSMgb2JqZWN0IGZpbGUgZm9ybWF0LiAgVGhpcyBwcm92aWRlcyBib3RoIGZvcndhcmQKKwkjIGNvbXBhdGliaWxpdHkgYW5kIGEgY29uc2lzdGVudCBtZWNoYW5pc20gZm9yIHNlbGVjdGluZyB0aGUKKwkjIG9iamVjdCBmaWxlIGZvcm1hdC4KKwkjCisJIyBOb3RlOiBOZXRCU0QgZG9lc24ndCBwYXJ0aWN1bGFybHkgY2FyZSBhYm91dCB0aGUgdmVuZG9yCisJIyBwb3J0aW9uIG9mIHRoZSBuYW1lLiAgV2UgYWx3YXlzIHNldCBpdCB0byAidW5rbm93biIuCisJc3lzY3RsPSJzeXNjdGwgLW4gaHcubWFjaGluZV9hcmNoIgorCVVOQU1FX01BQ0hJTkVfQVJDSD1gKC9zYmluLyRzeXNjdGwgMj4vZGV2L251bGwgfHwgXAorCSAgICAvdXNyL3NiaW4vJHN5c2N0bCAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd24pYAorCWNhc2UgIiR7VU5BTUVfTUFDSElORV9BUkNIfSIgaW4KKwkgICAgYXJtZWIpIG1hY2hpbmU9YXJtZWItdW5rbm93biA7OworCSAgICBhcm0qKSBtYWNoaW5lPWFybS11bmtub3duIDs7CisJICAgIHNoM2VsKSBtYWNoaW5lPXNobC11bmtub3duIDs7CisJICAgIHNoM2ViKSBtYWNoaW5lPXNoLXVua25vd24gOzsKKwkgICAgc2g1ZWwpIG1hY2hpbmU9c2g1bGUtdW5rbm93biA7OworCSAgICAqKSBtYWNoaW5lPSR7VU5BTUVfTUFDSElORV9BUkNIfS11bmtub3duIDs7CisJZXNhYworCSMgVGhlIE9wZXJhdGluZyBTeXN0ZW0gaW5jbHVkaW5nIG9iamVjdCBmb3JtYXQsIGlmIGl0IGhhcyBzd2l0Y2hlZAorCSMgdG8gRUxGIHJlY2VudGx5LCBvciB3aWxsIGluIHRoZSBmdXR1cmUuCisJY2FzZSAiJHtVTkFNRV9NQUNISU5FX0FSQ0h9IiBpbgorCSAgICBhcm0qfGkzODZ8bTY4a3xuczMya3xzaDMqfHNwYXJjfHZheCkKKwkJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCQlpZiBlY2hvIF9fRUxGX18gfCAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwgXAorCQkJfCBncmVwIC1xIF9fRUxGX18KKwkJdGhlbgorCQkgICAgIyBPbmNlIGFsbCB1dGlsaXRpZXMgY2FuIGJlIEVDT0ZGIChuZXRic2RlY29mZikgb3IgYS5vdXQgKG5ldGJzZGFvdXQpLgorCQkgICAgIyBSZXR1cm4gbmV0YnNkIGZvciBlaXRoZXIuICBGSVg/CisJCSAgICBvcz1uZXRic2QKKwkJZWxzZQorCQkgICAgb3M9bmV0YnNkZWxmCisJCWZpCisJCTs7CisJICAgICopCisJCW9zPW5ldGJzZAorCQk7OworCWVzYWMKKwkjIFRoZSBPUyByZWxlYXNlCisJIyBEZWJpYW4gR05VL05ldEJTRCBtYWNoaW5lcyBoYXZlIGEgZGlmZmVyZW50IHVzZXJsYW5kLCBhbmQKKwkjIHRodXMsIG5lZWQgYSBkaXN0aW5jdCB0cmlwbGV0LiBIb3dldmVyLCB0aGV5IGRvIG5vdCBuZWVkCisJIyBrZXJuZWwgdmVyc2lvbiBpbmZvcm1hdGlvbiwgc28gaXQgY2FuIGJlIHJlcGxhY2VkIHdpdGggYQorCSMgc3VpdGFibGUgdGFnLCBpbiB0aGUgc3R5bGUgb2YgbGludXgtZ251LgorCWNhc2UgIiR7VU5BTUVfVkVSU0lPTn0iIGluCisJICAgIERlYmlhbiopCisJCXJlbGVhc2U9Jy1nbnUnCisJCTs7CisJICAgICopCisJCXJlbGVhc2U9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy1fXS4qL1wuLydgCisJCTs7CisJZXNhYworCSMgU2luY2UgQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNOgorCSMgY29udGFpbnMgcmVkdW5kYW50IGluZm9ybWF0aW9uLCB0aGUgc2hvcnRlciBmb3JtOgorCSMgQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLU9QRVJBVElOR19TWVNURU0gaXMgdXNlZC4KKwllY2hvICIke21hY2hpbmV9LSR7b3N9JHtyZWxlYXNlfSIKKwlleGl0IDs7CisgICAgKjpCaXRyaWc6KjoqKQorCVVOQU1FX01BQ0hJTkVfQVJDSD1gYXJjaCB8IHNlZCAncy9CaXRyaWcuLy8nYAorCWVjaG8gJHtVTkFNRV9NQUNISU5FX0FSQ0h9LXVua25vd24tYml0cmlnJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOk9wZW5CU0Q6KjoqKQorCVVOQU1FX01BQ0hJTkVfQVJDSD1gYXJjaCB8IHNlZCAncy9PcGVuQlNELi8vJ2AKKwllY2hvICR7VU5BTUVfTUFDSElORV9BUkNIfS11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6ZWtrb0JTRDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZWtrb2JzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpTb2xpZEJTRDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tc29saWRic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIG1hY3BwYzpNaXJCU0Q6KjoqKQorCWVjaG8gcG93ZXJwYy11bmtub3duLW1pcmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpNaXJCU0Q6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW1pcmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgYWxwaGE6T1NGMToqOiopCisJY2FzZSAkVU5BTUVfUkVMRUFTRSBpbgorCSo0LjApCisJCVVOQU1FX1JFTEVBU0U9YC91c3Ivc2Jpbi9zaXplciAtdiB8IGF3ayAne3ByaW50ICQzfSdgCisJCTs7CisJKjUuKikKKwkJVU5BTUVfUkVMRUFTRT1gL3Vzci9zYmluL3NpemVyIC12IHwgYXdrICd7cHJpbnQgJDR9J2AKKwkJOzsKKwllc2FjCisJIyBBY2NvcmRpbmcgdG8gQ29tcGFxLCAvdXNyL3NiaW4vcHNyaW5mbyBoYXMgYmVlbiBhdmFpbGFibGUgb24KKwkjIE9TRi8xIGFuZCBUcnU2NCBzeXN0ZW1zIHByb2R1Y2VkIHNpbmNlIDE5OTUuICBJIGhvcGUgdGhhdAorCSMgY292ZXJzIG1vc3Qgc3lzdGVtcyBydW5uaW5nIHRvZGF5LiAgVGhpcyBjb2RlIHBpcGVzIHRoZSBDUFUKKwkjIHR5cGVzIHRocm91Z2ggaGVhZCAtbiAxLCBzbyB3ZSBvbmx5IGRldGVjdCB0aGUgdHlwZSBvZiBDUFUgMC4KKwlBTFBIQV9DUFVfVFlQRT1gL3Vzci9zYmluL3BzcmluZm8gLXYgfCBzZWQgLW4gLWUgJ3MvXiAgVGhlIGFscGhhIFwoLipcKSBwcm9jZXNzb3IuKiQvXDEvcCcgfCBoZWFkIC1uIDFgCisJY2FzZSAiJEFMUEhBX0NQVV9UWVBFIiBpbgorCSAgICAiRVY0ICgyMTA2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIgOzsKKwkgICAgIkVWNC41ICgyMTA2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIgOzsKKwkgICAgIkxDQTQgKDIxMDY2LzIxMDY4KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhIiA7OworCSAgICAiRVY1ICgyMTE2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NSIgOzsKKwkgICAgIkVWNS42ICgyMTE2NEEpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjU2IiA7OworCSAgICAiRVY1LjYgKDIxMTY0UEMpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFwY2E1NiIgOzsKKwkgICAgIkVWNS43ICgyMTE2NFBDKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhcGNhNTciIDs7CisJICAgICJFVjYgKDIxMjY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2IiA7OworCSAgICAiRVY2LjcgKDIxMjY0QSkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjciIDs7CisJICAgICJFVjYuOENCICgyMTI2NEMpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY4IiA7OworCSAgICAiRVY2LjhBTCAoMjEyNjRCKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OCIgOzsKKwkgICAgIkVWNi44Q1ggKDIxMjY0RCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiIDs7CisJICAgICJFVjYuOUEgKDIxMjY0L0VWNjlBKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OSIgOzsKKwkgICAgIkVWNyAoMjEzNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjciIDs7CisJICAgICJFVjcuOSAoMjEzNjRBKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY3OSIgOzsKKwllc2FjCisJIyBBIFBuLm4gdmVyc2lvbiBpcyBhIHBhdGNoZWQgdmVyc2lvbi4KKwkjIEEgVm4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgdmVyc2lvbi4KKwkjIEEgVG4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgZmllbGQgdGVzdCB2ZXJzaW9uLgorCSMgQSBYbi5uIHZlcnNpb24gaXMgYW4gdW5yZWxlYXNlZCBleHBlcmltZW50YWwgYmFzZWxldmVsLgorCSMgMS4yIHVzZXMgIjEuMiIgZm9yIHVuYW1lIC1yLgorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1kZWMtb3NmYGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9eW1BWVFhdLy8nIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorCSMgUmVzZXQgRVhJVCB0cmFwIGJlZm9yZSBleGl0aW5nIHRvIGF2b2lkIHNwdXJpb3VzIG5vbi16ZXJvIGV4aXQgY29kZS4KKwlleGl0Y29kZT0kPworCXRyYXAgJycgMAorCWV4aXQgJGV4aXRjb2RlIDs7CisgICAgQWxwaGFcICo6V2luZG93c19OVCo6KikKKwkjIEhvdyBkbyB3ZSBrbm93IGl0J3MgSW50ZXJpeCByYXRoZXIgdGhhbiB0aGUgZ2VuZXJpYyBQT1NJWCBzdWJzeXN0ZW0/CisJIyBTaG91bGQgd2UgY2hhbmdlIFVOQU1FX01BQ0hJTkUgYmFzZWQgb24gdGhlIG91dHB1dCBvZiB1bmFtZSBpbnN0ZWFkCisJIyBvZiB0aGUgc3BlY2lmaWMgQWxwaGEgbW9kZWw/CisJZWNobyBhbHBoYS1wYy1pbnRlcml4CisJZXhpdCA7OworICAgIDIxMDY0OldpbmRvd3NfTlQ6NTA6MykKKwllY2hvIGFscGhhLWRlYy13aW5udDMuNQorCWV4aXQgOzsKKyAgICBBbWlnYSo6VU5JWF9TeXN0ZW1fVjo0LjA6KikKKwllY2hvIG02OGstdW5rbm93bi1zeXN2NAorCWV4aXQgOzsKKyAgICAqOltBYV1taWdhW09vXVtTc106KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWFtaWdhb3MKKwlleGl0IDs7CisgICAgKjpbTW1db3JwaFtPb11bU3NdOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1tb3JwaG9zCisJZXhpdCA7OworICAgICo6T1MvMzkwOio6KikKKwllY2hvIGkzNzAtaWJtLW9wZW5lZGl0aW9uCisJZXhpdCA7OworICAgICo6ei9WTToqOiopCisJZWNobyBzMzkwLWlibS16dm1vZQorCWV4aXQgOzsKKyAgICAqOk9TNDAwOio6KikKKwllY2hvIHBvd2VycGMtaWJtLW9zNDAwCisJZXhpdCA7OworICAgIGFybTpSSVNDKjoxLlswMTJdKjoqfGFybTpyaXNjaXg6MS5bMDEyXSo6KikKKwllY2hvIGFybS1hY29ybi1yaXNjaXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIGFybSo6cmlzY29zOio6Knxhcm0qOlJJU0NPUzoqOiopCisJZWNobyBhcm0tdW5rbm93bi1yaXNjb3MKKwlleGl0IDs7CisgICAgU1IyPzAxOkhJLVVYL01QUDoqOiogfCBTUjgwMDA6SEktVVgvTVBQOio6KikKKwllY2hvIGhwcGExLjEtaGl0YWNoaS1oaXV4bXBwCisJZXhpdCA7OworICAgIFB5cmFtaWQqOk9TeCo6KjoqIHwgTUlTKjpPU3gqOio6KiB8IE1JUyo6U01QX0RDLU9TeCo6KjoqKQorCSMgYWtlZUB3cGRpczAzLndwYWZiLmFmLm1pbCAoRWFybGUgRi4gQWtlKSBjb250cmlidXRlZCBNSVMgYW5kIE5JTEUuCisJaWYgdGVzdCAiYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbGAiID0gYXR0IDsgdGhlbgorCQllY2hvIHB5cmFtaWQtcHlyYW1pZC1zeXN2MworCWVsc2UKKwkJZWNobyBweXJhbWlkLXB5cmFtaWQtYnNkCisJZmkKKwlleGl0IDs7CisgICAgTklMRSo6KjoqOmRjb3N4KQorCWVjaG8gcHlyYW1pZC1weXJhbWlkLXN2cjQKKwlleGl0IDs7CisgICAgRFJTPzYwMDA6dW5peDo0LjA6NiopCisJZWNobyBzcGFyYy1pY2wtbng2CisJZXhpdCA7OworICAgIERSUz82MDAwOlVOSVhfU1Y6NC4yKjo3KiB8IERSUz82MDAwOmlzaXM6NC4yKjo3KikKKwljYXNlIGAvdXNyL2Jpbi91bmFtZSAtcGAgaW4KKwkgICAgc3BhcmMpIGVjaG8gc3BhcmMtaWNsLW54NzsgZXhpdCA7OworCWVzYWMgOzsKKyAgICBzMzkweDpTdW5PUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWlibS1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKKyAgICBzdW40SDpTdW5PUzo1Lio6KikKKwllY2hvIHNwYXJjLWhhbC1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKKyAgICBzdW40KjpTdW5PUzo1Lio6KiB8IHRhZHBvbGUqOlN1bk9TOjUuKjoqKQorCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCA7OworICAgIGk4NnBjOkF1cm9yYVVYOjUuKjoqIHwgaTg2eGVuOkF1cm9yYVVYOjUuKjoqKQorCWVjaG8gaTM4Ni1wYy1hdXJvcmF1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgaTg2cGM6U3VuT1M6NS4qOiogfCBpODZ4ZW46U3VuT1M6NS4qOiopCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCVNVTl9BUkNIPSJpMzg2IgorCSMgSWYgdGhlcmUgaXMgYSBjb21waWxlciwgc2VlIGlmIGl0IGlzIGNvbmZpZ3VyZWQgZm9yIDY0LWJpdCBvYmplY3RzLgorCSMgTm90ZSB0aGF0IHRoZSBTdW4gY2MgZG9lcyBub3QgdHVybiBfX0xQNjRfXyBpbnRvIDEgbGlrZSBnY2MgZG9lcy4KKwkjIFRoaXMgdGVzdCB3b3JrcyBmb3IgYm90aCBjb21waWxlcnMuCisJaWYgWyAiJENDX0ZPUl9CVUlMRCIgIT0gJ25vX2NvbXBpbGVyX2ZvdW5kJyBdOyB0aGVuCisJICAgIGlmIChlY2hvICcjaWZkZWYgX19hbWQ2NCc7IGVjaG8gSVNfNjRCSVRfQVJDSDsgZWNobyAnI2VuZGlmJykgfCBcCisJCShDQ09QVFM9ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCkgfCBcCisJCWdyZXAgSVNfNjRCSVRfQVJDSCA+L2Rldi9udWxsCisJICAgIHRoZW4KKwkJU1VOX0FSQ0g9Ing4Nl82NCIKKwkgICAgZmkKKwlmaQorCWVjaG8gJHtTVU5fQVJDSH0tcGMtc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDs7CisgICAgc3VuNCo6U3VuT1M6Nio6KikKKwkjIEFjY29yZGluZyB0byBjb25maWcuc3ViLCB0aGlzIGlzIHRoZSBwcm9wZXIgd2F5IHRvIGNhbm9uaWNhbGl6ZQorCSMgU3VuT1M2LiAgSGFyZCB0byBndWVzcyBleGFjdGx5IHdoYXQgU3VuT1M2IHdpbGwgYmUgbGlrZSwgYnV0CisJIyBpdCdzIGxpa2VseSB0byBiZSBtb3JlIGxpa2UgU29sYXJpcyB0aGFuIFN1bk9TNC4KKwllY2hvIHNwYXJjLXN1bi1zb2xhcmlzM2BlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKKyAgICBzdW40KjpTdW5PUzoqOiopCisJY2FzZSAiYC91c3IvYmluL2FyY2ggLWtgIiBpbgorCSAgICBTZXJpZXMqfFM0KikKKwkJVU5BTUVfUkVMRUFTRT1gdW5hbWUgLXZgCisJCTs7CisJZXNhYworCSMgSmFwYW5lc2UgTGFuZ3VhZ2UgdmVyc2lvbnMgaGF2ZSBhIHZlcnNpb24gbnVtYmVyIGxpa2UgYDQuMS4zLUpMJy4KKwllY2hvIHNwYXJjLXN1bi1zdW5vc2BlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLy0vXy8nYAorCWV4aXQgOzsKKyAgICBzdW4zKjpTdW5PUzoqOiopCisJZWNobyBtNjhrLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgc3VuKjoqOjQuMkJTRDoqKQorCVVOQU1FX1JFTEVBU0U9YChzZWQgMXEgL2V0Yy9tb3RkIHwgYXdrICd7cHJpbnQgc3Vic3RyKCQ1LDEsMyl9JykgMj4vZGV2L251bGxgCisJdGVzdCAieCR7VU5BTUVfUkVMRUFTRX0iID0gIngiICYmIFVOQU1FX1JFTEVBU0U9MworCWNhc2UgImAvYmluL2FyY2hgIiBpbgorCSAgICBzdW4zKQorCQllY2hvIG02OGstc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCQk7OworCSAgICBzdW40KQorCQllY2hvIHNwYXJjLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KKwkJOzsKKwllc2FjCisJZXhpdCA7OworICAgIGF1c2hwOlN1bk9TOio6KikKKwllY2hvIHNwYXJjLWF1c3BleC1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgIyBUaGUgc2l0dWF0aW9uIGZvciBNaU5UIGlzIGEgbGl0dGxlIGNvbmZ1c2luZy4gIFRoZSBtYWNoaW5lIG5hbWUKKyAgICAjIGNhbiBiZSB2aXJ0dWFsbHkgZXZlcnl0aGluZyAoZXZlcnl0aGluZyB3aGljaCBpcyBub3QKKyAgICAjICJhdGFyaXN0IiBvciAiYXRhcmlzdGUiIGF0IGxlYXN0IHNob3VsZCBoYXZlIGEgcHJvY2Vzc29yCisgICAgIyA+IG02ODAwMCkuICBUaGUgc3lzdGVtIG5hbWUgcmFuZ2VzIGZyb20gIk1pTlQiIG92ZXIgIkZyZWVNaU5UIgorICAgICMgdG8gdGhlIGxvd2VyY2FzZSB2ZXJzaW9uICJtaW50IiAob3IgImZyZWVtaW50IikuICBGaW5hbGx5CisgICAgIyB0aGUgc3lzdGVtIG5hbWUgIlRPUyIgZGVub3RlcyBhIHN5c3RlbSB3aGljaCBpcyBhY3R1YWxseSBub3QKKyAgICAjIE1pTlQuICBCdXQgTWlOVCBpcyBkb3dud2FyZCBjb21wYXRpYmxlIHRvIFRPUywgc28gdGhpcyBzaG91bGQKKyAgICAjIGJlIG5vIHByb2JsZW0uCisgICAgYXRhcmlzdFtlXToqTWlOVDoqOiogfCBhdGFyaXN0W2VdOiptaW50Oio6KiB8IGF0YXJpc3RbZV06KlRPUzoqOiopCisJZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIGF0YXJpKjoqTWlOVDoqOiogfCBhdGFyaSo6Km1pbnQ6KjoqIHwgYXRhcmlzdFtlXToqVE9TOio6KikKKwllY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKmZhbGNvbio6Kk1pTlQ6KjoqIHwgKmZhbGNvbio6Km1pbnQ6KjoqIHwgKmZhbGNvbio6KlRPUzoqOiopCisJZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIG1pbGFuKjoqTWlOVDoqOiogfCBtaWxhbio6Km1pbnQ6KjoqIHwgKm1pbGFuKjoqVE9TOio6KikKKwllY2hvIG02OGstbWlsYW4tbWludCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgaGFkZXMqOipNaU5UOio6KiB8IGhhZGVzKjoqbWludDoqOiogfCAqaGFkZXMqOipUT1M6KjoqKQorCWVjaG8gbTY4ay1oYWRlcy1taW50JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOipNaU5UOio6KiB8ICo6Km1pbnQ6KjoqIHwgKjoqVE9TOio6KikKKwllY2hvIG02OGstdW5rbm93bi1taW50JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBtNjhrOm1hY2h0ZW46KjoqKQorCWVjaG8gbTY4ay1hcHBsZS1tYWNodGVuJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBwb3dlcnBjOm1hY2h0ZW46KjoqKQorCWVjaG8gcG93ZXJwYy1hcHBsZS1tYWNodGVuJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBSSVNDKjpNYWNoOio6KikKKwllY2hvIG1pcHMtZGVjLW1hY2hfYnNkNC4zCisJZXhpdCA7OworICAgIFJJU0MqOlVMVFJJWDoqOiopCisJZWNobyBtaXBzLWRlYy11bHRyaXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFZBWCo6VUxUUklYKjoqOiopCisJZWNobyB2YXgtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgMjAyMDpDTElYOio6KiB8IDI0MzA6Q0xJWDoqOiopCisJZWNobyBjbGlwcGVyLWludGVyZ3JhcGgtY2xpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgbWlwczoqOio6VU1JUFMgfCBtaXBzOio6KjpSSVNDb3MpCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpbmNsdWRlIDxzdGRpby5oPiAgLyogZm9yIHByaW50ZigpIHByb3RvdHlwZSAqLworCWludCBtYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CisjZWxzZQorCWludCBtYWluIChhcmdjLCBhcmd2KSBpbnQgYXJnYzsgY2hhciAqYXJndltdOyB7CisjZW5kaWYKKwkjaWYgZGVmaW5lZCAoaG9zdF9taXBzKSAmJiBkZWZpbmVkIChNSVBTRUIpCisJI2lmIGRlZmluZWQgKFNZU1RZUEVfU1lTVikKKwkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc3N5c3ZcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKKwkjZW5kaWYKKwkjaWYgZGVmaW5lZCAoU1lTVFlQRV9TVlI0KQorCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzc3ZyNFxuIiwgYXJndlsxXSk7IGV4aXQgKDApOworCSNlbmRpZgorCSNpZiBkZWZpbmVkIChTWVNUWVBFX0JTRDQzKSB8fCBkZWZpbmVkKFNZU1RZUEVfQlNEKQorCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzYnNkXG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7CisJI2VuZGlmCisJI2VuZGlmCisJICBleGl0ICgtMSk7CisJfQorRU9GCisJJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgJiYKKwkgIGR1bW15YXJnPWBlY2hvICIke1VOQU1FX1JFTEVBU0V9IiB8IHNlZCAtbiAncy9cKFswLTldKlwpLiovXDEvcCdgICYmCisJICBTWVNURU1fTkFNRT1gJGR1bW15ICRkdW1teWFyZ2AgJiYKKwkgICAgeyBlY2hvICIkU1lTVEVNX05BTUUiOyBleGl0OyB9CisJZWNobyBtaXBzLW1pcHMtcmlzY29zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBNb3Rvcm9sYTpQb3dlck1BWF9PUzoqOiopCisJZWNobyBwb3dlcnBjLW1vdG9yb2xhLXBvd2VybWF4CisJZXhpdCA7OworICAgIE1vdG9yb2xhOio6NC4zOlBMOC0qKQorCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJtYXgKKwlleGl0IDs7CisgICAgTmlnaHRfSGF3azoqOio6UG93ZXJNQVhfT1MgfCBTeW5lcmd5OlBvd2VyTUFYX09TOio6KikKKwllY2hvIHBvd2VycGMtaGFycmlzLXBvd2VybWF4CisJZXhpdCA7OworICAgIE5pZ2h0X0hhd2s6UG93ZXJfVU5JWDoqOiopCisJZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcnVuaXgKKwlleGl0IDs7CisgICAgbTg4azpDWC9VWDo3KjoqKQorCWVjaG8gbTg4ay1oYXJyaXMtY3h1eDcKKwlleGl0IDs7CisgICAgbTg4azoqOjQqOlI0KikKKwllY2hvIG04OGstbW90b3JvbGEtc3lzdjQKKwlleGl0IDs7CisgICAgbTg4azoqOjMqOlIzKikKKwllY2hvIG04OGstbW90b3JvbGEtc3lzdjMKKwlleGl0IDs7CisgICAgQVZpaU9OOmRndXg6KjoqKQorCSMgREcvVVggcmV0dXJucyBBVmlpT04gZm9yIGFsbCBhcmNoaXRlY3R1cmVzCisJVU5BTUVfUFJPQ0VTU09SPWAvdXNyL2Jpbi91bmFtZSAtcGAKKwlpZiBbICRVTkFNRV9QUk9DRVNTT1IgPSBtYzg4MTAwIF0gfHwgWyAkVU5BTUVfUFJPQ0VTU09SID0gbWM4ODExMCBdCisJdGhlbgorCSAgICBpZiBbICR7VEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0V9eCA9IG04OGtkZ3V4ZWxmeCBdIHx8IFwKKwkgICAgICAgWyAke1RBUkdFVF9CSU5BUllfSU5URVJGQUNFfXggPSB4IF0KKwkgICAgdGhlbgorCQllY2hvIG04OGstZGctZGd1eCR7VU5BTUVfUkVMRUFTRX0KKwkgICAgZWxzZQorCQllY2hvIG04OGstZGctZGd1eGJjcyR7VU5BTUVfUkVMRUFTRX0KKwkgICAgZmkKKwllbHNlCisJICAgIGVjaG8gaTU4Ni1kZy1kZ3V4JHtVTkFNRV9SRUxFQVNFfQorCWZpCisJZXhpdCA7OworICAgIE04OCo6RG9scGhpbk9TOio6KikJIyBEb2xwaGluT1MgKFNWUjMpCisJZWNobyBtODhrLWRvbHBoaW4tc3lzdjMKKwlleGl0IDs7CisgICAgTTg4KjoqOlIzKjoqKQorCSMgRGVsdGEgODhrIHN5c3RlbSBydW5uaW5nIFNWUjMKKwllY2hvIG04OGstbW90b3JvbGEtc3lzdjMKKwlleGl0IDs7CisgICAgWEQ4OCo6KjoqOiopICMgVGVrdHJvbml4IFhEODggc3lzdGVtIHJ1bm5pbmcgVVRla1YgKFNWUjMpCisJZWNobyBtODhrLXRla3Ryb25peC1zeXN2MworCWV4aXQgOzsKKyAgICBUZWs0M1swLTldWzAtOV06VVRlazoqOiopICMgVGVrdHJvbml4IDQzMDAgc3lzdGVtIHJ1bm5pbmcgVVRlayAoQlNEKQorCWVjaG8gbTY4ay10ZWt0cm9uaXgtYnNkCisJZXhpdCA7OworICAgICo6SVJJWCo6KjoqKQorCWVjaG8gbWlwcy1zZ2ktaXJpeGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLy0vXy9nJ2AKKwlleGl0IDs7CisgICAgPz8/Pz8/Pz86QUlYPzpbMTJdLjE6MikgICAjIEFJWCAyLjIuMSBvciBBSVggMi4xLjEgaXMgUlQvUEMgQUlYLgorCWVjaG8gcm9tcC1pYm0tYWl4ICAgICAjIHVuYW1lIC1tIGdpdmVzIGFuIDggaGV4LWNvZGUgQ1BVIGlkCisJZXhpdCA7OyAgICAgICAgICAgICAgICMgTm90ZSB0aGF0OiBlY2hvICInYHVuYW1lIC1zYCciIGdpdmVzICdBSVggJworICAgIGkqODY6QUlYOio6KikKKwllY2hvIGkzODYtaWJtLWFpeAorCWV4aXQgOzsKKyAgICBpYTY0OkFJWDoqOiopCisJaWYgWyAteCAvdXNyL2Jpbi9vc2xldmVsIF0gOyB0aGVuCisJCUlCTV9SRVY9YC91c3IvYmluL29zbGV2ZWxgCisJZWxzZQorCQlJQk1fUkVWPSR7VU5BTUVfVkVSU0lPTn0uJHtVTkFNRV9SRUxFQVNFfQorCWZpCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWlibS1haXgke0lCTV9SRVZ9CisJZXhpdCA7OworICAgICo6QUlYOjI6MykKKwlpZiBncmVwIGJvczMyNSAvdXNyL2luY2x1ZGUvc3RkaW8uaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCQlzZWQgJ3MvXgkJLy8nIDw8IEVPRiA+JGR1bW15LmMKKwkJI2luY2x1ZGUgPHN5cy9zeXN0ZW1jZmcuaD4KKworCQltYWluKCkKKwkJCXsKKwkJCWlmICghX19wb3dlcl9wYygpKQorCQkJCWV4aXQoMSk7CisJCQlwdXRzKCJwb3dlcnBjLWlibS1haXgzLjIuNSIpOworCQkJZXhpdCgwKTsKKwkJCX0KK0VPRgorCQlpZiAkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAmJiBTWVNURU1fTkFNRT1gJGR1bW15YAorCQl0aGVuCisJCQllY2hvICIkU1lTVEVNX05BTUUiCisJCWVsc2UKKwkJCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNQorCQlmaQorCWVsaWYgZ3JlcCBib3MzMjQgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNAorCWVsc2UKKwkJZWNobyByczYwMDAtaWJtLWFpeDMuMgorCWZpCisJZXhpdCA7OworICAgICo6QUlYOio6WzQ1NjddKQorCUlCTV9DUFVfSUQ9YC91c3Ivc2Jpbi9sc2RldiAtQyAtYyBwcm9jZXNzb3IgLVMgYXZhaWxhYmxlIHwgc2VkIDFxIHwgYXdrICd7IHByaW50ICQxIH0nYAorCWlmIC91c3Ivc2Jpbi9sc2F0dHIgLUVsICR7SUJNX0NQVV9JRH0gfCBncmVwICcgUE9XRVInID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQlJQk1fQVJDSD1yczYwMDAKKwllbHNlCisJCUlCTV9BUkNIPXBvd2VycGMKKwlmaQorCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgorCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAorCWVsc2UKKwkJSUJNX1JFVj0ke1VOQU1FX1ZFUlNJT059LiR7VU5BTUVfUkVMRUFTRX0KKwlmaQorCWVjaG8gJHtJQk1fQVJDSH0taWJtLWFpeCR7SUJNX1JFVn0KKwlleGl0IDs7CisgICAgKjpBSVg6KjoqKQorCWVjaG8gcnM2MDAwLWlibS1haXgKKwlleGl0IDs7CisgICAgaWJtcnQ6NC40QlNEOip8cm9tcC1pYm06QlNEOiopCisJZWNobyByb21wLWlibS1ic2Q0LjQKKwlleGl0IDs7CisgICAgaWJtcnQ6KkJTRDoqfHJvbXAtaWJtOkJTRDoqKSAgICAgICAgICAgICMgY292ZXJzIFJUL1BDIEJTRCBhbmQKKwllY2hvIHJvbXAtaWJtLWJzZCR7VU5BTUVfUkVMRUFTRX0gICAjIDQuMyB3aXRoIHVuYW1lIGFkZGVkIHRvCisJZXhpdCA7OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXBvcnQ6IHJvbXAtaWJtIEJTRCA0LjMKKyAgICAqOkJPU1g6KjoqKQorCWVjaG8gcnM2MDAwLWJ1bGwtYm9zeAorCWV4aXQgOzsKKyAgICBEUFgvMj8wMDpCLk8uUy46KjoqKQorCWVjaG8gbTY4ay1idWxsLXN5c3YzCisJZXhpdCA7OworICAgIDkwMDAvWzM0XT8/OjQuM2JzZDoxLio6KikKKwllY2hvIG02OGstaHAtYnNkCisJZXhpdCA7OworICAgIGhwMzAwOjQuNEJTRDoqOiogfCA5MDAwL1szNF0/Pzo0LjNic2Q6Mi4qOiopCisJZWNobyBtNjhrLWhwLWJzZDQuNAorCWV4aXQgOzsKKyAgICA5MDAwL1szNDY3OF0/PzpIUC1VWDoqOiopCisJSFBVWF9SRVY9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSouWzBCXSovLydgCisJY2FzZSAiJHtVTkFNRV9NQUNISU5FfSIgaW4KKwkgICAgOTAwMC8zMT8gKSAgICAgICAgICAgIEhQX0FSQ0g9bTY4MDAwIDs7CisJICAgIDkwMDAvWzM0XT8/ICkgICAgICAgICBIUF9BUkNIPW02OGsgOzsKKwkgICAgOTAwMC9bNjc4XVswLTldWzAtOV0pCisJCWlmIFsgLXggL3Vzci9iaW4vZ2V0Y29uZiBdOyB0aGVuCisJCSAgICBzY19jcHVfdmVyc2lvbj1gL3Vzci9iaW4vZ2V0Y29uZiBTQ19DUFVfVkVSU0lPTiAyPi9kZXYvbnVsbGAKKwkJICAgIHNjX2tlcm5lbF9iaXRzPWAvdXNyL2Jpbi9nZXRjb25mIFNDX0tFUk5FTF9CSVRTIDI+L2Rldi9udWxsYAorCQkgICAgY2FzZSAiJHtzY19jcHVfdmVyc2lvbn0iIGluCisJCSAgICAgIDUyMykgSFBfQVJDSD0iaHBwYTEuMCIgOzsgIyBDUFVfUEFfUklTQzFfMAorCQkgICAgICA1MjgpIEhQX0FSQ0g9ImhwcGExLjEiIDs7ICMgQ1BVX1BBX1JJU0MxXzEKKwkJICAgICAgNTMyKSAgICAgICAgICAgICAgICAgICAgICAjIENQVV9QQV9SSVNDMl8wCisJCQljYXNlICIke3NjX2tlcm5lbF9iaXRzfSIgaW4KKwkJCSAgMzIpIEhQX0FSQ0g9ImhwcGEyLjBuIiA7OworCQkJICA2NCkgSFBfQVJDSD0iaHBwYTIuMHciIDs7CisJCQkgICcnKSBIUF9BUkNIPSJocHBhMi4wIiA7OyAgICMgSFAtVVggMTAuMjAKKwkJCWVzYWMgOzsKKwkJICAgIGVzYWMKKwkJZmkKKwkJaWYgWyAiJHtIUF9BUkNIfSIgPSAiIiBdOyB0aGVuCisJCSAgICBldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJCSAgICBzZWQgJ3MvXgkJLy8nIDw8IEVPRiA+JGR1bW15LmMKKworCQkjZGVmaW5lIF9IUFVYX1NPVVJDRQorCQkjaW5jbHVkZSA8c3RkbGliLmg+CisJCSNpbmNsdWRlIDx1bmlzdGQuaD4KKworCQlpbnQgbWFpbiAoKQorCQl7CisJCSNpZiBkZWZpbmVkKF9TQ19LRVJORUxfQklUUykKKwkJICAgIGxvbmcgYml0cyA9IHN5c2NvbmYoX1NDX0tFUk5FTF9CSVRTKTsKKwkJI2VuZGlmCisJCSAgICBsb25nIGNwdSAgPSBzeXNjb25mIChfU0NfQ1BVX1ZFUlNJT04pOworCisJCSAgICBzd2l0Y2ggKGNwdSkKKwkJCXsKKwkJCWNhc2UgQ1BVX1BBX1JJU0MxXzA6IHB1dHMgKCJocHBhMS4wIik7IGJyZWFrOworCQkJY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEiKTsgYnJlYWs7CisJCQljYXNlIENQVV9QQV9SSVNDMl8wOgorCQkjaWYgZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpCisJCQkgICAgc3dpdGNoIChiaXRzKQorCQkJCXsKKwkJCQljYXNlIDY0OiBwdXRzICgiaHBwYTIuMHciKTsgYnJlYWs7CisJCQkJY2FzZSAzMjogcHV0cyAoImhwcGEyLjBuIik7IGJyZWFrOworCQkJCWRlZmF1bHQ6IHB1dHMgKCJocHBhMi4wIik7IGJyZWFrOworCQkJCX0gYnJlYWs7CisJCSNlbHNlICAvKiAhZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpICovCisJCQkgICAgcHV0cyAoImhwcGEyLjAiKTsgYnJlYWs7CisJCSNlbmRpZgorCQkJZGVmYXVsdDogcHV0cyAoImhwcGExLjAiKTsgYnJlYWs7CisJCQl9CisJCSAgICBleGl0ICgwKTsKKwkJfQorRU9GCisJCSAgICAoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAyPi9kZXYvbnVsbCkgJiYgSFBfQVJDSD1gJGR1bW15YAorCQkgICAgdGVzdCAteiAiJEhQX0FSQ0giICYmIEhQX0FSQ0g9aHBwYQorCQlmaSA7OworCWVzYWMKKwlpZiBbICR7SFBfQVJDSH0gPSAiaHBwYTIuMHciIF0KKwl0aGVuCisJICAgIGV2YWwgJHNldF9jY19mb3JfYnVpbGQKKworCSAgICAjIGhwcGEyLjB3LWhwLWhwdXgqIGhhcyBhIDY0LWJpdCBrZXJuZWwgYW5kIGEgY29tcGlsZXIgZ2VuZXJhdGluZworCSAgICAjIDMyLWJpdCBjb2RlLiAgaHBwYTY0LWhwLWhwdXgqIGhhcyB0aGUgc2FtZSBrZXJuZWwgYW5kIGEgY29tcGlsZXIKKwkgICAgIyBnZW5lcmF0aW5nIDY0LWJpdCBjb2RlLiAgR05VIGFuZCBIUCB1c2UgZGlmZmVyZW50IG5vbWVuY2xhdHVyZToKKwkgICAgIworCSAgICAjICQgQ0NfRk9SX0JVSUxEPWNjIC4vY29uZmlnLmd1ZXNzCisJICAgICMgPT4gaHBwYTIuMHctaHAtaHB1eDExLjIzCisJICAgICMgJCBDQ19GT1JfQlVJTEQ9ImNjICtEQTIuMHciIC4vY29uZmlnLmd1ZXNzCisJICAgICMgPT4gaHBwYTY0LWhwLWhwdXgxMS4yMworCisJICAgIGlmIGVjaG8gX19MUDY0X18gfCAoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwpIHwKKwkJZ3JlcCAtcSBfX0xQNjRfXworCSAgICB0aGVuCisJCUhQX0FSQ0g9ImhwcGEyLjB3IgorCSAgICBlbHNlCisJCUhQX0FSQ0g9ImhwcGE2NCIKKwkgICAgZmkKKwlmaQorCWVjaG8gJHtIUF9BUkNIfS1ocC1ocHV4JHtIUFVYX1JFVn0KKwlleGl0IDs7CisgICAgaWE2NDpIUC1VWDoqOiopCisJSFBVWF9SRVY9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSouWzBCXSovLydgCisJZWNobyBpYTY0LWhwLWhwdXgke0hQVVhfUkVWfQorCWV4aXQgOzsKKyAgICAzMDUwKjpISS1VWDoqOiopCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisJI2luY2x1ZGUgPHVuaXN0ZC5oPgorCWludAorCW1haW4gKCkKKwl7CisJICBsb25nIGNwdSA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7CisJICAvKiBUaGUgb3JkZXIgbWF0dGVycywgYmVjYXVzZSBDUFVfSVNfSFBfTUM2OEsgZXJyb25lb3VzbHkgcmV0dXJucworCSAgICAgdHJ1ZSBmb3IgQ1BVX1BBX1JJU0MxXzAuICBDUFVfSVNfUEFfUklTQyByZXR1cm5zIGNvcnJlY3QKKwkgICAgIHJlc3VsdHMsIGhvd2V2ZXIuICAqLworCSAgaWYgKENQVV9JU19QQV9SSVNDIChjcHUpKQorCSAgICB7CisJICAgICAgc3dpdGNoIChjcHUpCisJCXsKKwkJICBjYXNlIENQVV9QQV9SSVNDMV8wOiBwdXRzICgiaHBwYTEuMC1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCSAgY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOworCQkgIGNhc2UgQ1BVX1BBX1JJU0MyXzA6IHB1dHMgKCJocHBhMi4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJICBkZWZhdWx0OiBwdXRzICgiaHBwYS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCX0KKwkgICAgfQorCSAgZWxzZSBpZiAoQ1BVX0lTX0hQX01DNjhLIChjcHUpKQorCSAgICBwdXRzICgibTY4ay1oaXRhY2hpLWhpdXh3ZTIiKTsKKwkgIGVsc2UgcHV0cyAoInVua25vd24taGl0YWNoaS1oaXV4d2UyIik7CisJICBleGl0ICgwKTsKKwl9CitFT0YKKwkkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAmJiBTWVNURU1fTkFNRT1gJGR1bW15YCAmJgorCQl7IGVjaG8gIiRTWVNURU1fTkFNRSI7IGV4aXQ7IH0KKwllY2hvIHVua25vd24taGl0YWNoaS1oaXV4d2UyCisJZXhpdCA7OworICAgIDkwMDAvNz8/OjQuM2JzZDoqOiogfCA5MDAwLzg/Wzc5XTo0LjNic2Q6KjoqICkKKwllY2hvIGhwcGExLjEtaHAtYnNkCisJZXhpdCA7OworICAgIDkwMDAvOD8/OjQuM2JzZDoqOiopCisJZWNobyBocHBhMS4wLWhwLWJzZAorCWV4aXQgOzsKKyAgICAqOT8/KjpNUEUvaVg6KjoqIHwgKjMwMDAqOk1QRS9pWDoqOiopCisJZWNobyBocHBhMS4wLWhwLW1wZWl4CisJZXhpdCA7OworICAgIGhwNz8/Ok9TRjE6KjoqIHwgaHA4P1s3OV06T1NGMToqOiogKQorCWVjaG8gaHBwYTEuMS1ocC1vc2YKKwlleGl0IDs7CisgICAgaHA4Pz86T1NGMToqOiopCisJZWNobyBocHBhMS4wLWhwLW9zZgorCWV4aXQgOzsKKyAgICBpKjg2Ok9TRjE6KjoqKQorCWlmIFsgLXggL3Vzci9zYmluL3N5c3ZlcnNpb24gXSA7IHRoZW4KKwkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMW1rCisJZWxzZQorCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vc2YxCisJZmkKKwlleGl0IDs7CisgICAgcGFyaXNjKjpMaXRlcyo6KjoqKQorCWVjaG8gaHBwYTEuMS1ocC1saXRlcworCWV4aXQgOzsKKyAgICBDMSo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMxKjoqKQorCWVjaG8gYzEtY29udmV4LWJzZAorCWV4aXQgOzsKKyAgICBDMio6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMyKjoqKQorCWlmIGdldHN5c2luZm8gLWYgc2NhbGFyX2FjYworCXRoZW4gZWNobyBjMzItY29udmV4LWJzZAorCWVsc2UgZWNobyBjMi1jb252ZXgtYnNkCisJZmkKKwlleGl0IDs7CisgICAgQzM0KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM0KjoqKQorCWVjaG8gYzM0LWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgQzM4KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM4KjoqKQorCWVjaG8gYzM4LWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgQzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDNCo6KikKKwllY2hvIGM0LWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgQ1JBWSpZLU1QOio6KjoqKQorCWVjaG8geW1wLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCA7OworICAgIENSQVkqW0EtWl05MDoqOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IFwKKwl8IHNlZCAtZSAncy9DUkFZLipcKFtBLVpdOTBcKS9cMS8nIFwKKwkgICAgICAtZSB5L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaL2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6LyBcCisJICAgICAgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICBDUkFZKlRTOio6KjoqKQorCWVjaG8gdDkwLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCA7OworICAgIENSQVkqVDNFOio6KjoqKQorCWVjaG8gYWxwaGFldjUtY3JheS11bmljb3NtayR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICBDUkFZKlNWMToqOio6KikKKwllY2hvIHN2MS1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICAqOlVOSUNPUy9tcDoqOiopCisJZWNobyBjcmF5bnYtY3JheS11bmljb3NtcCR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICBGMzBbMDFdOlVOSVhfU3lzdGVtX1Y6KjoqIHwgRjcwMDpVTklYX1N5c3RlbV9WOio6KikKKwlGVUpJVFNVX1BST0M9YHVuYW1lIC1tIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorCUZVSklUU1VfU1lTPWB1bmFtZSAtcCB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy9cLy8vJ2AKKwlGVUpJVFNVX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzLyAvXy8nYAorCWVjaG8gIiR7RlVKSVRTVV9QUk9DfS1mdWppdHN1LSR7RlVKSVRTVV9TWVN9JHtGVUpJVFNVX1JFTH0iCisJZXhpdCA7OworICAgIDUwMDA6VU5JWF9TeXN0ZW1fVjo0Lio6KikKKwlGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvXC8vLydgCisJRlVKSVRTVV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy8gL18vJ2AKKwllY2hvICJzcGFyYy1mdWppdHN1LSR7RlVKSVRTVV9TWVN9JHtGVUpJVFNVX1JFTH0iCisJZXhpdCA7OworICAgIGkqODY6QlNELzM4NjoqOiogfCBpKjg2OkJTRC9PUzoqOiogfCAqOkFzY2VuZFwgRW1iZWRkZWQvT1M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1ic2RpJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBzcGFyYyo6QlNEL09TOio6KikKKwllY2hvIHNwYXJjLXVua25vd24tYnNkaSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpCU0QvT1M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWJzZGkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6RnJlZUJTRDoqOiopCisJVU5BTUVfUFJPQ0VTU09SPWAvdXNyL2Jpbi91bmFtZSAtcGAKKwljYXNlICR7VU5BTUVfUFJPQ0VTU09SfSBpbgorCSAgICBhbWQ2NCkKKwkJZWNobyB4ODZfNjQtdW5rbm93bi1mcmVlYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYCA7OworCSAgICAqKQorCQllY2hvICR7VU5BTUVfUFJPQ0VTU09SfS11bmtub3duLWZyZWVic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgIDs7CisJZXNhYworCWV4aXQgOzsKKyAgICBpKjpDWUdXSU4qOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWN5Z3dpbgorCWV4aXQgOzsKKyAgICAqOk1JTkdXNjQqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1pbmd3NjQKKwlleGl0IDs7CisgICAgKjpNSU5HVyo6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbWluZ3czMgorCWV4aXQgOzsKKyAgICBpKjpNU1lTKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1tc3lzCisJZXhpdCA7OworICAgIGkqOndpbmRvd3MzMio6KikKKwkjIHVuYW1lIC1tIGluY2x1ZGVzICItcGMiIG9uIHRoaXMgc3lzdGVtLgorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1taW5ndzMyCisJZXhpdCA7OworICAgIGkqOlBXKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1wdzMyCisJZXhpdCA7OworICAgICo6SW50ZXJpeCo6KikKKwljYXNlICR7VU5BTUVfTUFDSElORX0gaW4KKwkgICAgeDg2KQorCQllY2hvIGk1ODYtcGMtaW50ZXJpeCR7VU5BTUVfUkVMRUFTRX0KKwkJZXhpdCA7OworCSAgICBhdXRoZW50aWNhbWQgfCBnZW51aW5laW50ZWwgfCBFTTY0VCkKKwkJZWNobyB4ODZfNjQtdW5rbm93bi1pbnRlcml4JHtVTkFNRV9SRUxFQVNFfQorCQlleGl0IDs7CisJICAgIElBNjQpCisJCWVjaG8gaWE2NC11bmtub3duLWludGVyaXgke1VOQU1FX1JFTEVBU0V9CisJCWV4aXQgOzsKKwllc2FjIDs7CisgICAgWzM0NV04NjpXaW5kb3dzXzk1OiogfCBbMzQ1XTg2OldpbmRvd3NfOTg6KiB8IFszNDVdODY6V2luZG93c19OVDoqKQorCWVjaG8gaSR7VU5BTUVfTUFDSElORX0tcGMtbWtzCisJZXhpdCA7OworICAgIDg2NjQ6V2luZG93c19OVDoqKQorCWVjaG8geDg2XzY0LXBjLW1rcworCWV4aXQgOzsKKyAgICBpKjpXaW5kb3dzX05UKjoqIHwgUGVudGl1bSo6V2luZG93c19OVCo6KikKKwkjIEhvdyBkbyB3ZSBrbm93IGl0J3MgSW50ZXJpeCByYXRoZXIgdGhhbiB0aGUgZ2VuZXJpYyBQT1NJWCBzdWJzeXN0ZW0/CisJIyBJdCBhbHNvIGNvbmZsaWN0cyB3aXRoIHByZS0yLjAgdmVyc2lvbnMgb2YgQVQmVCBVV0lOLiBTaG91bGQgd2UKKwkjIFVOQU1FX01BQ0hJTkUgYmFzZWQgb24gdGhlIG91dHB1dCBvZiB1bmFtZSBpbnN0ZWFkIG9mIGkzODY/CisJZWNobyBpNTg2LXBjLWludGVyaXgKKwlleGl0IDs7CisgICAgaSo6VVdJTio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtdXdpbgorCWV4aXQgOzsKKyAgICBhbWQ2NDpDWUdXSU4qOio6KiB8IHg4Nl82NDpDWUdXSU4qOio6KikKKwllY2hvIHg4Nl82NC11bmtub3duLWN5Z3dpbgorCWV4aXQgOzsKKyAgICBwKjpDWUdXSU4qOiopCisJZWNobyBwb3dlcnBjbGUtdW5rbm93bi1jeWd3aW4KKwlleGl0IDs7CisgICAgcHJlcCo6U3VuT1M6NS4qOiopCisJZWNobyBwb3dlcnBjbGUtdW5rbm93bi1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKKyAgICAqOkdOVToqOiopCisJIyB0aGUgR05VIHN5c3RlbQorCWVjaG8gYGVjaG8gJHtVTkFNRV9NQUNISU5FfXxzZWQgLWUgJ3MsWy0vXS4qJCwsJ2AtdW5rbm93bi0ke0xJQkN9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MsLy4qJCwsJ2AKKwlleGl0IDs7CisgICAgKjpHTlUvKjoqOiopCisJIyBvdGhlciBzeXN0ZW1zIHdpdGggR05VIGxpYmMgYW5kIHVzZXJsYW5kCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYGVjaG8gJHtVTkFNRV9TWVNURU19IHwgc2VkICdzLF5bXi9dKi8sLCcgfCB0ciAnW0EtWl0nICdbYS16XSdgYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYC0ke0xJQkN9CisJZXhpdCA7OworICAgIGkqODY6TWluaXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1taW5peAorCWV4aXQgOzsKKyAgICBhYXJjaDY0OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC0ke0xJQkN9CisJZXhpdCA7OworICAgIGFhcmNoNjRfYmU6TGludXg6KjoqKQorCVVOQU1FX01BQ0hJTkU9YWFyY2g2NF9iZQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LSR7TElCQ30KKwlleGl0IDs7CisgICAgYWxwaGE6TGludXg6KjoqKQorCWNhc2UgYHNlZCAtbiAnL15jcHUgbW9kZWwvcy9eLio6IFwoLipcKS9cMS9wJyA8IC9wcm9jL2NwdWluZm9gIGluCisJICBFVjUpICAgVU5BTUVfTUFDSElORT1hbHBoYWV2NSA7OworCSAgRVY1NikgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjU2IDs7CisJICBQQ0E1NikgVU5BTUVfTUFDSElORT1hbHBoYXBjYTU2IDs7CisJICBQQ0E1NykgVU5BTUVfTUFDSElORT1hbHBoYXBjYTU2IDs7CisJICBFVjYpICAgVU5BTUVfTUFDSElORT1hbHBoYWV2NiA7OworCSAgRVY2NykgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjY3IDs7CisJICBFVjY4KikgVU5BTUVfTUFDSElORT1hbHBoYWV2NjggOzsKKwllc2FjCisJb2JqZHVtcCAtLXByaXZhdGUtaGVhZGVycyAvYmluL3NoIHwgZ3JlcCAtcSBsZC5zby4xCisJaWYgdGVzdCAiJD8iID0gMCA7IHRoZW4gTElCQz0iZ251bGliYzEiIDsgZmkKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC0ke0xJQkN9CisJZXhpdCA7OworICAgIGFyYzpMaW51eDoqOiogfCBhcmNlYjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBhcm0qOkxpbnV4Oio6KikKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJaWYgZWNobyBfX0FSTV9FQUJJX18gfCAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwgXAorCSAgICB8IGdyZXAgLXEgX19BUk1fRUFCSV9fCisJdGhlbgorCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC0ke0xJQkN9CisJZWxzZQorCSAgICBpZiBlY2hvIF9fQVJNX1BDU19WRlAgfCAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwgXAorCQl8IGdyZXAgLXEgX19BUk1fUENTX1ZGUAorCSAgICB0aGVuCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LSR7TElCQ31lYWJpCisJICAgIGVsc2UKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtJHtMSUJDfWVhYmloZgorCSAgICBmaQorCWZpCisJZXhpdCA7OworICAgIGF2cjMyKjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBjcmlzOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tYXhpcy1saW51eC0ke0xJQkN9CisJZXhpdCA7OworICAgIGNyaXN2MzI6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1heGlzLWxpbnV4LSR7TElCQ30KKwlleGl0IDs7CisgICAgZnJ2OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC0ke0xJQkN9CisJZXhpdCA7OworICAgIGhleGFnb246TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LSR7TElCQ30KKwlleGl0IDs7CisgICAgaSo4NjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LSR7TElCQ30KKwlleGl0IDs7CisgICAgaWE2NDpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBtMzJyKjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBtNjgqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC0ke0xJQkN9CisJZXhpdCA7OworICAgIG1pcHM6TGludXg6KjoqIHwgbWlwczY0OkxpbnV4Oio6KikKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKKwkjdW5kZWYgQ1BVCisJI3VuZGVmICR7VU5BTUVfTUFDSElORX0KKwkjdW5kZWYgJHtVTkFNRV9NQUNISU5FfWVsCisJI2lmIGRlZmluZWQoX19NSVBTRUxfXykgfHwgZGVmaW5lZChfX01JUFNFTCkgfHwgZGVmaW5lZChfTUlQU0VMKSB8fCBkZWZpbmVkKE1JUFNFTCkKKwlDUFU9JHtVTkFNRV9NQUNISU5FfWVsCisJI2Vsc2UKKwkjaWYgZGVmaW5lZChfX01JUFNFQl9fKSB8fCBkZWZpbmVkKF9fTUlQU0VCKSB8fCBkZWZpbmVkKF9NSVBTRUIpIHx8IGRlZmluZWQoTUlQU0VCKQorCUNQVT0ke1VOQU1FX01BQ0hJTkV9CisJI2Vsc2UKKwlDUFU9CisJI2VuZGlmCisJI2VuZGlmCitFT0YKKwlldmFsIGAkQ0NfRk9SX0JVSUxEIC1FICRkdW1teS5jIDI+L2Rldi9udWxsIHwgZ3JlcCAnXkNQVSdgCisJdGVzdCB4IiR7Q1BVfSIgIT0geCAmJiB7IGVjaG8gIiR7Q1BVfS11bmtub3duLWxpbnV4LSR7TElCQ30iOyBleGl0OyB9CisJOzsKKyAgICBvcjFrOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC0ke0xJQkN9CisJZXhpdCA7OworICAgIG9yMzI6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LSR7TElCQ30KKwlleGl0IDs7CisgICAgcGFkcmU6TGludXg6KjoqKQorCWVjaG8gc3BhcmMtdW5rbm93bi1saW51eC0ke0xJQkN9CisJZXhpdCA7OworICAgIHBhcmlzYzY0OkxpbnV4Oio6KiB8IGhwcGE2NDpMaW51eDoqOiopCisJZWNobyBocHBhNjQtdW5rbm93bi1saW51eC0ke0xJQkN9CisJZXhpdCA7OworICAgIHBhcmlzYzpMaW51eDoqOiogfCBocHBhOkxpbnV4Oio6KikKKwkjIExvb2sgZm9yIENQVSBsZXZlbAorCWNhc2UgYGdyZXAgJ15jcHVbXmEtel0qOicgL3Byb2MvY3B1aW5mbyAyPi9kZXYvbnVsbCB8IGN1dCAtZCcgJyAtZjJgIGluCisJICBQQTcqKSBlY2hvIGhwcGExLjEtdW5rbm93bi1saW51eC0ke0xJQkN9IDs7CisJICBQQTgqKSBlY2hvIGhwcGEyLjAtdW5rbm93bi1saW51eC0ke0xJQkN9IDs7CisJICAqKSAgICBlY2hvIGhwcGEtdW5rbm93bi1saW51eC0ke0xJQkN9IDs7CisJZXNhYworCWV4aXQgOzsKKyAgICBwcGM2NDpMaW51eDoqOiopCisJZWNobyBwb3dlcnBjNjQtdW5rbm93bi1saW51eC0ke0xJQkN9CisJZXhpdCA7OworICAgIHBwYzpMaW51eDoqOiopCisJZWNobyBwb3dlcnBjLXVua25vd24tbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBwcGM2NGxlOkxpbnV4Oio6KikKKwllY2hvIHBvd2VycGM2NGxlLXVua25vd24tbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBwcGNsZTpMaW51eDoqOiopCisJZWNobyBwb3dlcnBjbGUtdW5rbm93bi1saW51eC0ke0xJQkN9CisJZXhpdCA7OworICAgIHMzOTA6TGludXg6KjoqIHwgczM5MHg6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1pYm0tbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBzaDY0KjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBzaCo6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LSR7TElCQ30KKwlleGl0IDs7CisgICAgc3BhcmM6TGludXg6KjoqIHwgc3BhcmM2NDpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICB0aWxlKjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICB2YXg6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1kZWMtbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICB4ODZfNjQ6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LSR7TElCQ30KKwlleGl0IDs7CisgICAgeHRlbnNhKjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtJHtMSUJDfQorCWV4aXQgOzsKKyAgICBpKjg2OkRZTklYL3B0eDo0KjoqKQorCSMgcHR4IDQuMCBkb2VzIHVuYW1lIC1zIGNvcnJlY3RseSwgd2l0aCBEWU5JWC9wdHggaW4gdGhlcmUuCisJIyBlYXJsaWVyIHZlcnNpb25zIGFyZSBtZXNzZWQgdXAgYW5kIHB1dCB0aGUgbm9kZW5hbWUgaW4gYm90aAorCSMgc3lzbmFtZSBhbmQgbm9kZW5hbWUuCisJZWNobyBpMzg2LXNlcXVlbnQtc3lzdjQKKwlleGl0IDs7CisgICAgaSo4NjpVTklYX1NWOjQuMk1QOjIuKikKKwkjIFVuaXh3YXJlIGlzIGFuIG9mZnNob290IG9mIFNWUjQsIGJ1dCBpdCBoYXMgaXRzIG93biB2ZXJzaW9uCisJIyBudW1iZXIgc2VyaWVzIHN0YXJ0aW5nIHdpdGggMi4uLgorCSMgSSBhbSBub3QgcG9zaXRpdmUgdGhhdCBvdGhlciBTVlI0IHN5c3RlbXMgd29uJ3QgbWF0Y2ggdGhpcywKKwkjIEkganVzdCBoYXZlIHRvIGhvcGUuICAtLSBybXMuCisJIyBVc2Ugc3lzdjQuMnV3Li4uIHNvIHRoYXQgc3lzdjQqIG1hdGNoZXMgaXQuCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Y0LjJ1dyR7VU5BTUVfVkVSU0lPTn0KKwlleGl0IDs7CisgICAgaSo4NjpPUy8yOio6KikKKwkjIElmIHdlIHdlcmUgYWJsZSB0byBmaW5kIGB1bmFtZScsIHRoZW4gRU1YIFVuaXggY29tcGF0aWJpbGl0eQorCSMgaXMgcHJvYmFibHkgaW5zdGFsbGVkLgorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1vczItZW14CisJZXhpdCA7OworICAgIGkqODY6WFRTLTMwMDoqOlNUT1ApCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tc3RvcAorCWV4aXQgOzsKKyAgICBpKjg2OmF0aGVvczoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYXRoZW9zCisJZXhpdCA7OworICAgIGkqODY6c3lsbGFibGU6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeWxsYWJsZQorCWV4aXQgOzsKKyAgICBpKjg2Okx5bnhPUzoyLio6KiB8IGkqODY6THlueE9TOjMuWzAxXSo6KiB8IGkqODY6THlueE9TOjQuWzAyXSo6KikKKwllY2hvIGkzODYtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIGkqODY6KkRPUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1zZG9zZGpncHAKKwlleGl0IDs7CisgICAgaSo4NjoqOjQuKjoqIHwgaSo4NjpTWVNURU1fVjo0Lio6KikKKwlVTkFNRV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAncy9cL01QJC8vJ2AKKwlpZiBncmVwIE5vdmVsbCAvdXNyL2luY2x1ZGUvbGluay5oID4vZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVuaXZlbC1zeXN2JHtVTkFNRV9SRUx9CisJZWxzZQorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdiR7VU5BTUVfUkVMfQorCWZpCisJZXhpdCA7OworICAgIGkqODY6Kjo1Ols2NzhdKikKKwkjIFVuaXhXYXJlIDcueCwgT3BlblVOSVggYW5kIE9wZW5TZXJ2ZXIgNi4KKwljYXNlIGAvYmluL3VuYW1lIC1YIHwgZ3JlcCAiXk1hY2hpbmUiYCBpbgorCSAgICAqNDg2KikJICAgICBVTkFNRV9NQUNISU5FPWk0ODYgOzsKKwkgICAgKlBlbnRpdW0pCSAgICAgVU5BTUVfTUFDSElORT1pNTg2IDs7CisJICAgICpQZW50KnwqQ2VsZXJvbikgVU5BTUVfTUFDSElORT1pNjg2IDs7CisJZXNhYworCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9JHtVTkFNRV9TWVNURU19JHtVTkFNRV9WRVJTSU9OfQorCWV4aXQgOzsKKyAgICBpKjg2Oio6My4yOiopCisJaWYgdGVzdCAtZiAvdXNyL29wdGlvbnMvY2IubmFtZTsgdGhlbgorCQlVTkFNRV9SRUw9YHNlZCAtbiAncy8uKlZlcnNpb24gLy9wJyA8L3Vzci9vcHRpb25zL2NiLm5hbWVgCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1pc2MkVU5BTUVfUkVMCisJZWxpZiAvYmluL3VuYW1lIC1YIDI+L2Rldi9udWxsID4vZGV2L251bGwgOyB0aGVuCisJCVVOQU1FX1JFTD1gKC9iaW4vdW5hbWUgLVh8Z3JlcCBSZWxlYXNlfHNlZCAtZSAncy8uKj0gLy8nKWAKKwkJKC9iaW4vdW5hbWUgLVh8Z3JlcCBpODA0ODYgPi9kZXYvbnVsbCkgJiYgVU5BTUVfTUFDSElORT1pNDg2CisJCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50aXVtJyA+L2Rldi9udWxsKSBcCisJCQkmJiBVTkFNRV9NQUNISU5FPWk1ODYKKwkJKC9iaW4vdW5hbWUgLVh8Z3JlcCAnXk1hY2hpbmUuKlBlbnQgKklJJyA+L2Rldi9udWxsKSBcCisJCQkmJiBVTkFNRV9NQUNISU5FPWk2ODYKKwkJKC9iaW4vdW5hbWUgLVh8Z3JlcCAnXk1hY2hpbmUuKlBlbnRpdW0gUHJvJyA+L2Rldi9udWxsKSBcCisJCQkmJiBVTkFNRV9NQUNISU5FPWk2ODYKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXNjbyRVTkFNRV9SRUwKKwllbHNlCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2MzIKKwlmaQorCWV4aXQgOzsKKyAgICBwYzoqOio6KikKKwkjIExlZnQgaGVyZSBmb3IgY29tcGF0aWJpbGl0eToKKwkjIHVuYW1lIC1tIHByaW50cyBmb3IgREpHUFAgYWx3YXlzICdwYycsIGJ1dCBpdCBwcmludHMgbm90aGluZyBhYm91dAorCSMgdGhlIHByb2Nlc3Nvciwgc28gd2UgcGxheSBzYWZlIGJ5IGFzc3VtaW5nIGk1ODYuCisJIyBOb3RlOiB3aGF0ZXZlciB0aGlzIGlzLCBpdCBNVVNUIGJlIHRoZSBzYW1lIGFzIHdoYXQgY29uZmlnLnN1YgorCSMgcHJpbnRzIGZvciB0aGUgImRqZ3BwIiBob3N0LCBvciBlbHNlIEdEQiBjb25maWd1cnkgd2lsbCBkZWNpZGUgdGhhdAorCSMgdGhpcyBpcyBhIGNyb3NzLWJ1aWxkLgorCWVjaG8gaTU4Ni1wYy1tc2Rvc2RqZ3BwCisJZXhpdCA7OworICAgIEludGVsOk1hY2g6Myo6KikKKwllY2hvIGkzODYtcGMtbWFjaDMKKwlleGl0IDs7CisgICAgcGFyYWdvbjoqOio6KikKKwllY2hvIGk4NjAtaW50ZWwtb3NmMQorCWV4aXQgOzsKKyAgICBpODYwOio6NC4qOiopICMgaTg2MC1TVlI0CisJaWYgZ3JlcCBTdGFyZGVudCAvdXNyL2luY2x1ZGUvc3lzL3VhZG1pbi5oID4vZGV2L251bGwgMj4mMSA7IHRoZW4KKwkgIGVjaG8gaTg2MC1zdGFyZGVudC1zeXN2JHtVTkFNRV9SRUxFQVNFfSAjIFN0YXJkZW50IFZpc3RyYSBpODYwLVNWUjQKKwllbHNlICMgQWRkIG90aGVyIGk4NjAtU1ZSNCB2ZW5kb3JzIGJlbG93IGFzIHRoZXkgYXJlIGRpc2NvdmVyZWQuCisJICBlY2hvIGk4NjAtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfSAgIyBVbmtub3duIGk4NjAtU1ZSNAorCWZpCisJZXhpdCA7OworICAgIG1pbmkqOkNUSVg6U1lTKjU6KikKKwkjICJtaW5pZnJhbWUiCisJZWNobyBtNjgwMTAtY29udmVyZ2VudC1zeXN2CisJZXhpdCA7OworICAgIG1jNjhrOlVOSVg6U1lTVEVNNTozLjUxbSkKKwllY2hvIG02OGstY29udmVyZ2VudC1zeXN2CisJZXhpdCA7OworICAgIE02ODA/MDpELU5JWDo1LjM6KikKKwllY2hvIG02OGstZGlhYi1kbml4CisJZXhpdCA7OworICAgIE02OCo6KjpSM1ZbNTY3OF0qOiopCisJdGVzdCAtciAvc3lzVjY4ICYmIHsgZWNobyAnbTY4ay1tb3Rvcm9sYS1zeXN2JzsgZXhpdDsgfSA7OworICAgIDNbMzQ1XT8/Oio6NC4wOjMuMCB8IDNbMzRdPz9BOio6NC4wOjMuMCB8IDNbMzRdPz8sKjoqOjQuMDozLjAgfCAzWzM0XT8/Lyo6Kjo0LjA6My4wIHwgNDQwMDoqOjQuMDozLjAgfCA0ODUwOio6NC4wOjMuMCB8IFNLQTQwOio6NC4wOjMuMCB8IFNEUzI6Kjo0LjA6My4wIHwgU0hHMjoqOjQuMDozLjAgfCBTNzUwMSo6Kjo0LjA6My4wKQorCU9TX1JFTD0nJworCXRlc3QgLXIgL2V0Yy8ucmVsaWQgXAorCSYmIE9TX1JFTD0uYHNlZCAtbiAncy9bXiBdKiBbXiBdKiBcKFswLTldWzAtOV1cKS4qL1wxL3AnIDwgL2V0Yy8ucmVsaWRgCisJL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCisJICAmJiB7IGVjaG8gaTQ4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfQorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgZW50aXVtID4vZGV2L251bGwgXAorCSAgJiYgeyBlY2hvIGk1ODYtbmNyLXN5c3Y0LjMke09TX1JFTH07IGV4aXQ7IH0gOzsKKyAgICAzWzM0XT8/Oio6NC4wOiogfCAzWzM0XT8/LCo6Kjo0LjA6KikKKwkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKKwkgICYmIHsgZWNobyBpNDg2LW5jci1zeXN2NDsgZXhpdDsgfSA7OworICAgIE5DUio6Kjo0LjI6KiB8IE1QUkFTKjoqOjQuMjoqKQorCU9TX1JFTD0nLjMnCisJdGVzdCAtciAvZXRjLy5yZWxpZCBcCisJICAgICYmIE9TX1JFTD0uYHNlZCAtbiAncy9bXiBdKiBbXiBdKiBcKFswLTldWzAtOV1cKS4qL1wxL3AnIDwgL2V0Yy8ucmVsaWRgCisJL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCisJICAgICYmIHsgZWNobyBpNDg2LW5jci1zeXN2NC4zJHtPU19SRUx9OyBleGl0OyB9CisJL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IC9iaW4vZ3JlcCBlbnRpdW0gPi9kZXYvbnVsbCBcCisJICAgICYmIHsgZWNobyBpNTg2LW5jci1zeXN2NC4zJHtPU19SRUx9OyBleGl0OyB9CisJL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IC9iaW4vZ3JlcCBwdGVyb24gPi9kZXYvbnVsbCBcCisJICAgICYmIHsgZWNobyBpNTg2LW5jci1zeXN2NC4zJHtPU19SRUx9OyBleGl0OyB9IDs7CisgICAgbTY4KjpMeW54T1M6Mi4qOiogfCBtNjgqOkx5bnhPUzozLjAqOiopCisJZWNobyBtNjhrLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBtYzY4MDMwOlVOSVhfU3lzdGVtX1Y6NC4qOiopCisJZWNobyBtNjhrLWF0YXJpLXN5c3Y0CisJZXhpdCA7OworICAgIFRTVU5BTUk6THlueE9TOjIuKjoqKQorCWVjaG8gc3BhcmMtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIHJzNjAwMDpMeW54T1M6Mi4qOiopCisJZWNobyByczYwMDAtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFBvd2VyUEM6THlueE9TOjIuKjoqIHwgUG93ZXJQQzpMeW54T1M6My5bMDFdKjoqIHwgUG93ZXJQQzpMeW54T1M6NC5bMDJdKjoqKQorCWVjaG8gcG93ZXJwYy11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU01bQkVdUzpVTklYX1NWOio6KikKKwllY2hvIG1pcHMtZGRlLXN5c3Yke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFJNKjpSZWxpYW50VU5JWC0qOio6KikKKwllY2hvIG1pcHMtc25pLXN5c3Y0CisJZXhpdCA7OworICAgIFJNKjpTSU5JWC0qOio6KikKKwllY2hvIG1pcHMtc25pLXN5c3Y0CisJZXhpdCA7OworICAgICo6U0lOSVgtKjoqOiopCisJaWYgdW5hbWUgLXAgMj4vZGV2L251bGwgPi9kZXYvbnVsbCA7IHRoZW4KKwkJVU5BTUVfTUFDSElORT1gKHVuYW1lIC1wKSAyPi9kZXYvbnVsbGAKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXNuaS1zeXN2NAorCWVsc2UKKwkJZWNobyBuczMyay1zbmktc3lzdgorCWZpCisJZXhpdCA7OworICAgIFBFTlRJVU06Kjo0LjAqOiopCSMgVW5pc3lzIGBDbGVhclBhdGggSE1QIElYIDQwMDAnIFNWUjQvTVAgZWZmb3J0CisJCQkjIHNheXMgPFJpY2hhcmQuTS5CYXJ0ZWxAY2NNYWlsLkNlbnN1cy5HT1Y+CisJZWNobyBpNTg2LXVuaXN5cy1zeXN2NAorCWV4aXQgOzsKKyAgICAqOlVOSVhfU3lzdGVtX1Y6NCo6RlRYKikKKwkjIEZyb20gR2VyYWxkIEhld2VzIDxoZXdlc0BvcGVubWFya2V0LmNvbT4uCisJIyBIb3cgYWJvdXQgZGlmZmVyZW50aWF0aW5nIGJldHdlZW4gc3RyYXR1cyBhcmNoaXRlY3R1cmVzPyAtZGptCisJZWNobyBocHBhMS4xLXN0cmF0dXMtc3lzdjQKKwlleGl0IDs7CisgICAgKjoqOio6RlRYKikKKwkjIEZyb20gc2VhbmZAc3dkYy5zdHJhdHVzLmNvbS4KKwllY2hvIGk4NjAtc3RyYXR1cy1zeXN2NAorCWV4aXQgOzsKKyAgICBpKjg2OlZPUzoqOiopCisJIyBGcm9tIFBhdWwuR3JlZW5Ac3RyYXR1cy5jb20uCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXN0cmF0dXMtdm9zCisJZXhpdCA7OworICAgICo6Vk9TOio6KikKKwkjIEZyb20gUGF1bC5HcmVlbkBzdHJhdHVzLmNvbS4KKwllY2hvIGhwcGExLjEtc3RyYXR1cy12b3MKKwlleGl0IDs7CisgICAgbWM2OCo6QS9VWDoqOiopCisJZWNobyBtNjhrLWFwcGxlLWF1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgbmV3cyo6TkVXUy1PUzo2KjoqKQorCWVjaG8gbWlwcy1zb255LW5ld3NvczYKKwlleGl0IDs7CisgICAgUlszNF0wMDA6KlN5c3RlbV9WKjoqOiogfCBSNDAwMDpVTklYX1NZU1Y6KjoqIHwgUiowMDA6VU5JWF9TVjoqOiopCisJaWYgWyAtZCAvdXNyL25lYyBdOyB0aGVuCisJCWVjaG8gbWlwcy1uZWMtc3lzdiR7VU5BTUVfUkVMRUFTRX0KKwllbHNlCisJCWVjaG8gbWlwcy11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9CisJZmkKKwlleGl0IDs7CisgICAgQmVCb3g6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIGhhcmR3YXJlIG1hZGUgYnkgQmUsIFBQQyBvbmx5LgorCWVjaG8gcG93ZXJwYy1iZS1iZW9zCisJZXhpdCA7OworICAgIEJlTWFjOkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBNYWMgb3IgTWFjIGNsb25lLCBQUEMgb25seS4KKwllY2hvIHBvd2VycGMtYXBwbGUtYmVvcworCWV4aXQgOzsKKyAgICBCZVBDOkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBJbnRlbCBQQyBjb21wYXRpYmxlLgorCWVjaG8gaTU4Ni1wYy1iZW9zCisJZXhpdCA7OworICAgIEJlUEM6SGFpa3U6KjoqKQkjIEhhaWt1IHJ1bm5pbmcgb24gSW50ZWwgUEMgY29tcGF0aWJsZS4KKwllY2hvIGk1ODYtcGMtaGFpa3UKKwlleGl0IDs7CisgICAgeDg2XzY0OkhhaWt1Oio6KikKKwllY2hvIHg4Nl82NC11bmtub3duLWhhaWt1CisJZXhpdCA7OworICAgIFNYLTQ6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g0LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTWC01OlNVUEVSLVVYOio6KikKKwllY2hvIHN4NS1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU1gtNjpTVVBFUi1VWDoqOiopCisJZWNobyBzeDYtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFNYLTc6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g3LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTWC04OlNVUEVSLVVYOio6KikKKwllY2hvIHN4OC1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU1gtOFI6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g4ci1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgUG93ZXIqOlJoYXBzb2R5Oio6KikKKwllY2hvIHBvd2VycGMtYXBwbGUtcmhhcHNvZHkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6UmhhcHNvZHk6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1hcHBsZS1yaGFwc29keSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpEYXJ3aW46KjoqKQorCVVOQU1FX1BST0NFU1NPUj1gdW5hbWUgLXBgIHx8IFVOQU1FX1BST0NFU1NPUj11bmtub3duCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCWlmIHRlc3QgIiRVTkFNRV9QUk9DRVNTT1IiID0gdW5rbm93biA7IHRoZW4KKwkgICAgVU5BTUVfUFJPQ0VTU09SPXBvd2VycGMKKwlmaQorCWlmIFsgIiRDQ19GT1JfQlVJTEQiICE9ICdub19jb21waWxlcl9mb3VuZCcgXTsgdGhlbgorCSAgICBpZiAoZWNobyAnI2lmZGVmIF9fTFA2NF9fJzsgZWNobyBJU182NEJJVF9BUkNIOyBlY2hvICcjZW5kaWYnKSB8IFwKKwkJKENDT1BUUz0gJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsKSB8IFwKKwkJZ3JlcCBJU182NEJJVF9BUkNIID4vZGV2L251bGwKKwkgICAgdGhlbgorCQljYXNlICRVTkFNRV9QUk9DRVNTT1IgaW4KKwkJICAgIGkzODYpIFVOQU1FX1BST0NFU1NPUj14ODZfNjQgOzsKKwkJICAgIHBvd2VycGMpIFVOQU1FX1BST0NFU1NPUj1wb3dlcnBjNjQgOzsKKwkJZXNhYworCSAgICBmaQorCWZpCisJZWNobyAke1VOQU1FX1BST0NFU1NPUn0tYXBwbGUtZGFyd2luJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOnByb2NudG8qOio6KiB8ICo6UU5YOlswMTIzNDU2Nzg5XSo6KikKKwlVTkFNRV9QUk9DRVNTT1I9YHVuYW1lIC1wYAorCWlmIHRlc3QgIiRVTkFNRV9QUk9DRVNTT1IiID0gIng4NiI7IHRoZW4KKwkJVU5BTUVfUFJPQ0VTU09SPWkzODYKKwkJVU5BTUVfTUFDSElORT1wYworCWZpCisJZWNobyAke1VOQU1FX1BST0NFU1NPUn0tJHtVTkFNRV9NQUNISU5FfS1udG8tcW54JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOlFOWDoqOjQqKQorCWVjaG8gaTM4Ni1wYy1xbngKKwlleGl0IDs7CisgICAgTkVPLT86Tk9OU1RPUF9LRVJORUw6KjoqKQorCWVjaG8gbmVvLXRhbmRlbS1uc2ske1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIE5TRS0qOk5PTlNUT1BfS0VSTkVMOio6KikKKwllY2hvIG5zZS10YW5kZW0tbnNrJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBOU1ItPzpOT05TVE9QX0tFUk5FTDoqOiopCisJZWNobyBuc3ItdGFuZGVtLW5zayR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpOb25TdG9wLVVYOio6KikKKwllY2hvIG1pcHMtY29tcGFxLW5vbnN0b3B1eAorCWV4aXQgOzsKKyAgICBCUzIwMDA6UE9TSVgqOio6KikKKwllY2hvIGJzMjAwMC1zaWVtZW5zLXN5c3YKKwlleGl0IDs7CisgICAgRFMvKjpVTklYX1N5c3RlbV9WOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tJHtVTkFNRV9TWVNURU19LSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpQbGFuOToqOiopCisJIyAidW5hbWUgLW0iIGlzIG5vdCBjb25zaXN0ZW50LCBzbyB1c2UgJGNwdXR5cGUgaW5zdGVhZC4gMzg2CisJIyBpcyBjb252ZXJ0ZWQgdG8gaTM4NiBmb3IgY29uc2lzdGVuY3kgd2l0aCBvdGhlciB4ODYKKwkjIG9wZXJhdGluZyBzeXN0ZW1zLgorCWlmIHRlc3QgIiRjcHV0eXBlIiA9ICIzODYiOyB0aGVuCisJICAgIFVOQU1FX01BQ0hJTkU9aTM4NgorCWVsc2UKKwkgICAgVU5BTUVfTUFDSElORT0iJGNwdXR5cGUiCisJZmkKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1wbGFuOQorCWV4aXQgOzsKKyAgICAqOlRPUFMtMTA6KjoqKQorCWVjaG8gcGRwMTAtdW5rbm93bi10b3BzMTAKKwlleGl0IDs7CisgICAgKjpURU5FWDoqOiopCisJZWNobyBwZHAxMC11bmtub3duLXRlbmV4CisJZXhpdCA7OworICAgIEtTMTA6VE9QUy0yMDoqOiogfCBLTDEwOlRPUFMtMjA6KjoqIHwgVFlQRTQ6VE9QUy0yMDoqOiopCisJZWNobyBwZHAxMC1kZWMtdG9wczIwCisJZXhpdCA7OworICAgIFhLTC0xOlRPUFMtMjA6KjoqIHwgVFlQRTU6VE9QUy0yMDoqOiopCisJZWNobyBwZHAxMC14a2wtdG9wczIwCisJZXhpdCA7OworICAgICo6VE9QUy0yMDoqOiopCisJZWNobyBwZHAxMC11bmtub3duLXRvcHMyMAorCWV4aXQgOzsKKyAgICAqOklUUzoqOiopCisJZWNobyBwZHAxMC11bmtub3duLWl0cworCWV4aXQgOzsKKyAgICBTRUk6KjoqOlNFSVVYKQorCWVjaG8gbWlwcy1zZWktc2VpdXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6RHJhZ29uRmx5Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1kcmFnb25mbHlgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgCisJZXhpdCA7OworICAgICo6KlZNUzoqOiopCisJVU5BTUVfTUFDSElORT1gKHVuYW1lIC1wKSAyPi9kZXYvbnVsbGAKKwljYXNlICIke1VOQU1FX01BQ0hJTkV9IiBpbgorCSAgICBBKikgZWNobyBhbHBoYS1kZWMtdm1zIDsgZXhpdCA7OworCSAgICBJKikgZWNobyBpYTY0LWRlYy12bXMgOyBleGl0IDs7CisJICAgIFYqKSBlY2hvIHZheC1kZWMtdm1zIDsgZXhpdCA7OworCWVzYWMgOzsKKyAgICAqOlhFTklYOio6U3lzVikKKwllY2hvIGkzODYtcGMteGVuaXgKKwlleGl0IDs7CisgICAgaSo4Njpza3lvczoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXNreW9zYGVjaG8gJHtVTkFNRV9SRUxFQVNFfWAgfCBzZWQgLWUgJ3MvIC4qJC8vJworCWV4aXQgOzsKKyAgICBpKjg2OnJkb3M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1yZG9zCisJZXhpdCA7OworICAgIGkqODY6QVJPUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWFyb3MKKwlleGl0IDs7CisgICAgeDg2XzY0OlZNa2VybmVsOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1lc3gKKwlleGl0IDs7Citlc2FjCisKK2V2YWwgJHNldF9jY19mb3JfYnVpbGQKK2NhdCA+JGR1bW15LmMgPDxFT0YKKyNpZmRlZiBfU0VRVUVOVF8KKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjIGluY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisjZW5kaWYKK21haW4gKCkKK3sKKyNpZiBkZWZpbmVkIChzb255KQorI2lmIGRlZmluZWQgKE1JUFNFQikKKyAgLyogQkZEIHdhbnRzICJic2QiIGluc3RlYWQgb2YgIm5ld3NvcyIuICBQZXJoYXBzIEJGRCBzaG91bGQgYmUgY2hhbmdlZCwKKyAgICAgSSBkb24ndCBrbm93Li4uLiAgKi8KKyAgcHJpbnRmICgibWlwcy1zb255LWJzZFxuIik7IGV4aXQgKDApOworI2Vsc2UKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyAgcHJpbnRmICgibTY4ay1zb255LW5ld3NvcyVzXG4iLAorI2lmZGVmIE5FV1NPUzQKKwkiNCIKKyNlbHNlCisJIiIKKyNlbmRpZgorCSk7IGV4aXQgKDApOworI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fYXJtKSAmJiBkZWZpbmVkIChfX2Fjb3JuKSAmJiBkZWZpbmVkIChfX3VuaXgpCisgIHByaW50ZiAoImFybS1hY29ybi1yaXNjaXhcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoaHAzMDApICYmICFkZWZpbmVkIChocHV4KQorICBwcmludGYgKCJtNjhrLWhwLWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChOZVhUKQorI2lmICFkZWZpbmVkIChfX0FSQ0hJVEVDVFVSRV9fKQorI2RlZmluZSBfX0FSQ0hJVEVDVFVSRV9fICJtNjhrIgorI2VuZGlmCisgIGludCB2ZXJzaW9uOworICB2ZXJzaW9uPWAoaG9zdGluZm8gfCBzZWQgLW4gJ3MvLipOZVhUIE1hY2ggXChbMC05XSpcKS4qL1wxL3AnKSAyPi9kZXYvbnVsbGA7CisgIGlmICh2ZXJzaW9uIDwgNCkKKyAgICBwcmludGYgKCIlcy1uZXh0LW5leHRzdGVwJWRcbiIsIF9fQVJDSElURUNUVVJFX18sIHZlcnNpb24pOworICBlbHNlCisgICAgcHJpbnRmICgiJXMtbmV4dC1vcGVuc3RlcCVkXG4iLCBfX0FSQ0hJVEVDVFVSRV9fLCB2ZXJzaW9uKTsKKyAgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKE1VTFRJTUFYKSB8fCBkZWZpbmVkIChuMTYpCisjaWYgZGVmaW5lZCAoVU1BWFYpCisgIHByaW50ZiAoIm5zMzJrLWVuY29yZS1zeXN2XG4iKTsgZXhpdCAoMCk7CisjZWxzZQorI2lmIGRlZmluZWQgKENNVSkKKyAgcHJpbnRmICgibnMzMmstZW5jb3JlLW1hY2hcbiIpOyBleGl0ICgwKTsKKyNlbHNlCisgIHByaW50ZiAoIm5zMzJrLWVuY29yZS1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fMzg2QlNEX18pCisgIHByaW50ZiAoImkzODYtcGMtYnNkXG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKHNlcXVlbnQpCisjaWYgZGVmaW5lZCAoaTM4NikKKyAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChuczMyMDAwKQorICBwcmludGYgKCJuczMyay1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NFUVVFTlRfKQorICAgIHN0cnVjdCB1dHNuYW1lIHVuOworCisgICAgdW5hbWUoJnVuKTsKKworICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMiIsIDIpID09IDApIHsKKwlwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4MlxuIik7IGV4aXQgKDApOworICAgIH0KKyAgICBpZiAoc3RybmNtcCh1bi52ZXJzaW9uLCAiVjEiLCAyKSA9PSAwKSB7IC8qIFhYWCBpcyBWMSBjb3JyZWN0PyAqLworCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgxXG4iKTsgZXhpdCAoMCk7CisgICAgfQorICAgIHByaW50ZiAoImkzODYtc2VxdWVudC1wdHhcbiIpOyBleGl0ICgwKTsKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkICh2YXgpCisjIGlmICFkZWZpbmVkICh1bHRyaXgpCisjICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyMgIGlmIGRlZmluZWQgKEJTRCkKKyMgICBpZiBCU0QgPT0gNDMKKyAgICAgIHByaW50ZiAoInZheC1kZWMtYnNkNC4zXG4iKTsgZXhpdCAoMCk7CisjICAgZWxzZQorIyAgICBpZiBCU0QgPT0gMTk5MDA2CisgICAgICBwcmludGYgKCJ2YXgtZGVjLWJzZDQuM3Jlbm9cbiIpOyBleGl0ICgwKTsKKyMgICAgZWxzZQorICAgICAgcHJpbnRmICgidmF4LWRlYy1ic2RcbiIpOyBleGl0ICgwKTsKKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgZWxzZQorICAgIHByaW50ZiAoInZheC1kZWMtYnNkXG4iKTsgZXhpdCAoMCk7CisjICBlbmRpZgorIyBlbHNlCisgICAgcHJpbnRmICgidmF4LWRlYy11bHRyaXhcbiIpOyBleGl0ICgwKTsKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoYWxsaWFudCkgJiYgZGVmaW5lZCAoaTg2MCkKKyAgcHJpbnRmICgiaTg2MC1hbGxpYW50LWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyAgZXhpdCAoMSk7Cit9CitFT0YKKworJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgMj4vZGV2L251bGwgJiYgU1lTVEVNX05BTUU9YCRkdW1teWAgJiYKKwl7IGVjaG8gIiRTWVNURU1fTkFNRSI7IGV4aXQ7IH0KKworIyBBcG9sbG9zIHB1dCB0aGUgc3lzdGVtIHR5cGUgaW4gdGhlIGVudmlyb25tZW50LgorCit0ZXN0IC1kIC91c3IvYXBvbGxvICYmIHsgZWNobyAke0lTUH0tYXBvbGxvLSR7U1lTVFlQRX07IGV4aXQ7IH0KKworIyBDb252ZXggdmVyc2lvbnMgdGhhdCBwcmVkYXRlIHVuYW1lIGNhbiB1c2UgZ2V0c3lzaW5mbygxKQorCitpZiBbIC14IC91c3IvY29udmV4L2dldHN5c2luZm8gXQordGhlbgorICAgIGNhc2UgYGdldHN5c2luZm8gLWYgY3B1X3R5cGVgIGluCisgICAgYzEqKQorCWVjaG8gYzEtY29udmV4LWJzZAorCWV4aXQgOzsKKyAgICBjMiopCisJaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCisJdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCisJZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKKwlmaQorCWV4aXQgOzsKKyAgICBjMzQqKQorCWVjaG8gYzM0LWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgYzM4KikKKwllY2hvIGMzOC1jb252ZXgtYnNkCisJZXhpdCA7OworICAgIGM0KikKKwllY2hvIGM0LWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgZXNhYworZmkKKworY2F0ID4mMiA8PEVPRgorJDA6IHVuYWJsZSB0byBndWVzcyBzeXN0ZW0gdHlwZQorCitUaGlzIHNjcmlwdCwgbGFzdCBtb2RpZmllZCAkdGltZXN0YW1wLCBoYXMgZmFpbGVkIHRvIHJlY29nbml6ZQordGhlIG9wZXJhdGluZyBzeXN0ZW0geW91IGFyZSB1c2luZy4gSXQgaXMgYWR2aXNlZCB0aGF0IHlvdQorZG93bmxvYWQgdGhlIG1vc3QgdXAgdG8gZGF0ZSB2ZXJzaW9uIG9mIHRoZSBjb25maWcgc2NyaXB0cyBmcm9tCisKKyAgaHR0cDovL2dpdC5zYXZhbm5haC5nbnUub3JnL2dpdHdlYi8/cD1jb25maWcuZ2l0O2E9YmxvYl9wbGFpbjtmPWNvbmZpZy5ndWVzcztoYj1IRUFECithbmQKKyAgaHR0cDovL2dpdC5zYXZhbm5haC5nbnUub3JnL2dpdHdlYi8/cD1jb25maWcuZ2l0O2E9YmxvYl9wbGFpbjtmPWNvbmZpZy5zdWI7aGI9SEVBRAorCitJZiB0aGUgdmVyc2lvbiB5b3UgcnVuICgkMCkgaXMgYWxyZWFkeSB1cCB0byBkYXRlLCBwbGVhc2UKK3NlbmQgdGhlIGZvbGxvd2luZyBkYXRhIGFuZCBhbnkgaW5mb3JtYXRpb24geW91IHRoaW5rIG1pZ2h0IGJlCitwZXJ0aW5lbnQgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+IGluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIG5lZWRlZAoraW5mb3JtYXRpb24gdG8gaGFuZGxlIHlvdXIgc3lzdGVtLgorCitjb25maWcuZ3Vlc3MgdGltZXN0YW1wID0gJHRpbWVzdGFtcAorCit1bmFtZSAtbSA9IGAodW5hbWUgLW0pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1yID0gYCh1bmFtZSAtcikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXMgPSBgKHVuYW1lIC1zKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtdiA9IGAodW5hbWUgLXYpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKworL3Vzci9iaW4vdW5hbWUgLXAgPSBgKC91c3IvYmluL3VuYW1lIC1wKSAyPi9kZXYvbnVsbGAKKy9iaW4vdW5hbWUgLVggICAgID0gYCgvYmluL3VuYW1lIC1YKSAyPi9kZXYvbnVsbGAKKworaG9zdGluZm8gICAgICAgICAgICAgICA9IGAoaG9zdGluZm8pIDI+L2Rldi9udWxsYAorL2Jpbi91bml2ZXJzZSAgICAgICAgICA9IGAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGxgCisvdXNyL2Jpbi9hcmNoIC1rICAgICAgID0gYCgvdXNyL2Jpbi9hcmNoIC1rKSAyPi9kZXYvbnVsbGAKKy9iaW4vYXJjaCAgICAgICAgICAgICAgPSBgKC9iaW4vYXJjaCkgMj4vZGV2L251bGxgCisvdXNyL2Jpbi9vc2xldmVsICAgICAgID0gYCgvdXNyL2Jpbi9vc2xldmVsKSAyPi9kZXYvbnVsbGAKKy91c3IvY29udmV4L2dldHN5c2luZm8gPSBgKC91c3IvY29udmV4L2dldHN5c2luZm8pIDI+L2Rldi9udWxsYAorCitVTkFNRV9NQUNISU5FID0gJHtVTkFNRV9NQUNISU5FfQorVU5BTUVfUkVMRUFTRSA9ICR7VU5BTUVfUkVMRUFTRX0KK1VOQU1FX1NZU1RFTSAgPSAke1VOQU1FX1NZU1RFTX0KK1VOQU1FX1ZFUlNJT04gPSAke1VOQU1FX1ZFUlNJT059CitFT0YKKworZXhpdCAxCisKKyMgTG9jYWwgdmFyaWFibGVzOgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJ0aW1lc3RhbXA9JyIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkIgorIyB0aW1lLXN0YW1wLWVuZDogIiciCisjIEVuZDoKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvYW50bHIyLXBhdGNoL3NjcmlwdHMvY29uZmlnLnN1YiBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvYW50bHIyLXBhdGNoL3NjcmlwdHMvY29uZmlnLnN1YgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjMzZGI3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9hbnRscjItcGF0Y2gvc2NyaXB0cy9jb25maWcuc3ViCkBAIC0wLDAgKzEsMTc5MSBAQAorIyEgL2Jpbi9zaAorIyBDb25maWd1cmF0aW9uIHZhbGlkYXRpb24gc3Vicm91dGluZSBzY3JpcHQuCisjICAgQ29weXJpZ2h0IDE5OTItMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKwordGltZXN0YW1wPScyMDEzLTA4LTEwJworCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQKKyMgcHJvZ3JhbS4gIFRoaXMgRXhjZXB0aW9uIGlzIGFuIGFkZGl0aW9uYWwgcGVybWlzc2lvbiB1bmRlciBzZWN0aW9uIDcKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDMgKCJHUEx2MyIpLgorCisKKyMgUGxlYXNlIHNlbmQgcGF0Y2hlcyB3aXRoIGEgQ2hhbmdlTG9nIGVudHJ5IHRvIGNvbmZpZy1wYXRjaGVzQGdudS5vcmcuCisjCisjIENvbmZpZ3VyYXRpb24gc3Vicm91dGluZSB0byB2YWxpZGF0ZSBhbmQgY2Fub25pY2FsaXplIGEgY29uZmlndXJhdGlvbiB0eXBlLgorIyBTdXBwbHkgdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uIHR5cGUgYXMgYW4gYXJndW1lbnQuCisjIElmIGl0IGlzIGludmFsaWQsIHdlIHByaW50IGFuIGVycm9yIG1lc3NhZ2Ugb24gc3RkZXJyIGFuZCBleGl0IHdpdGggY29kZSAxLgorIyBPdGhlcndpc2UsIHdlIHByaW50IHRoZSBjYW5vbmljYWwgY29uZmlnIHR5cGUgb24gc3Rkb3V0IGFuZCBzdWNjZWVkLgorCisjIFlvdSBjYW4gZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIHNjcmlwdCBmcm9tOgorIyBodHRwOi8vZ2l0LnNhdmFubmFoLmdudS5vcmcvZ2l0d2ViLz9wPWNvbmZpZy5naXQ7YT1ibG9iX3BsYWluO2Y9Y29uZmlnLnN1YjtoYj1IRUFECisKKyMgVGhpcyBmaWxlIGlzIHN1cHBvc2VkIHRvIGJlIHRoZSBzYW1lIGZvciBhbGwgR05VIHBhY2thZ2VzCisjIGFuZCByZWNvZ25pemUgYWxsIHRoZSBDUFUgdHlwZXMsIHN5c3RlbSB0eXBlcyBhbmQgYWxpYXNlcworIyB0aGF0IGFyZSBtZWFuaW5nZnVsIHdpdGggKmFueSogR05VIHNvZnR3YXJlLgorIyBFYWNoIHBhY2thZ2UgaXMgcmVzcG9uc2libGUgZm9yIHJlcG9ydGluZyB3aGljaCB2YWxpZCBjb25maWd1cmF0aW9ucworIyBpdCBkb2VzIG5vdCBzdXBwb3J0LiAgVGhlIHVzZXIgc2hvdWxkIGJlIGFibGUgdG8gZGlzdGluZ3Vpc2gKKyMgYSBmYWlsdXJlIHRvIHN1cHBvcnQgYSB2YWxpZCBjb25maWd1cmF0aW9uIGZyb20gYSBtZWFuaW5nbGVzcworIyBjb25maWd1cmF0aW9uLgorCisjIFRoZSBnb2FsIG9mIHRoaXMgZmlsZSBpcyB0byBtYXAgYWxsIHRoZSB2YXJpb3VzIHZhcmlhdGlvbnMgb2YgYSBnaXZlbgorIyBtYWNoaW5lIHNwZWNpZmljYXRpb24gaW50byBhIHNpbmdsZSBzcGVjaWZpY2F0aW9uIGluIHRoZSBmb3JtOgorIwlDUFVfVFlQRS1NQU5VRkFDVFVSRVItT1BFUkFUSU5HX1NZU1RFTQorIyBvciBpbiBzb21lIGNhc2VzLCB0aGUgbmV3ZXIgZm91ci1wYXJ0IGZvcm06CisjCUNQVV9UWVBFLU1BTlVGQUNUVVJFUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTQorIyBJdCBpcyB3cm9uZyB0byBlY2hvIGFueSBvdGhlciB0eXBlIG9mIHNwZWNpZmljYXRpb24uCisKK21lPWBlY2hvICIkMCIgfCBzZWQgLWUgJ3MsLiovLCwnYAorCit1c2FnZT0iXAorVXNhZ2U6ICQwIFtPUFRJT05dIENQVS1NRlItT1BTWVMKKyAgICAgICAkMCBbT1BUSU9OXSBBTElBUworCitDYW5vbmljYWxpemUgYSBjb25maWd1cmF0aW9uIG5hbWUuCisKK09wZXJhdGlvbiBtb2RlczoKKyAgLWgsIC0taGVscCAgICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0CisgIC10LCAtLXRpbWUtc3RhbXAgICBwcmludCBkYXRlIG9mIGxhc3QgbW9kaWZpY2F0aW9uLCB0aGVuIGV4aXQKKyAgLXYsIC0tdmVyc2lvbiAgICAgIHByaW50IHZlcnNpb24gbnVtYmVyLCB0aGVuIGV4aXQKKworUmVwb3J0IGJ1Z3MgYW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiIKKwordmVyc2lvbj0iXAorR05VIGNvbmZpZy5zdWIgKCR0aW1lc3RhbXApCisKK0NvcHlyaWdodCAxOTkyLTIwMTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PCit3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4iCisKK2hlbHA9IgorVHJ5IFxgJG1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorCisjIFBhcnNlIGNvbW1hbmQgbGluZQord2hpbGUgdGVzdCAkIyAtZ3QgMCA7IGRvCisgIGNhc2UgJDEgaW4KKyAgICAtLXRpbWUtc3RhbXAgfCAtLXRpbWUqIHwgLXQgKQorICAgICAgIGVjaG8gIiR0aW1lc3RhbXAiIDsgZXhpdCA7OworICAgIC0tdmVyc2lvbiB8IC12ICkKKyAgICAgICBlY2hvICIkdmVyc2lvbiIgOyBleGl0IDs7CisgICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKKyAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDs7CisgICAgLS0gKSAgICAgIyBTdG9wIG9wdGlvbiBwcm9jZXNzaW5nCisgICAgICAgc2hpZnQ7IGJyZWFrIDs7CisgICAgLSApCSMgVXNlIHN0ZGluIGFzIGlucHV0LgorICAgICAgIGJyZWFrIDs7CisgICAgLSogKQorICAgICAgIGVjaG8gIiRtZTogaW52YWxpZCBvcHRpb24gJDEkaGVscCIKKyAgICAgICBleGl0IDEgOzsKKworICAgICpsb2NhbCopCisgICAgICAgIyBGaXJzdCBwYXNzIHRocm91Z2ggYW55IGxvY2FsIG1hY2hpbmUgdHlwZXMuCisgICAgICAgZWNobyAkMQorICAgICAgIGV4aXQgOzsKKworICAgICogKQorICAgICAgIGJyZWFrIDs7CisgIGVzYWMKK2RvbmUKKworY2FzZSAkIyBpbgorIDApIGVjaG8gIiRtZTogbWlzc2luZyBhcmd1bWVudCRoZWxwIiA+JjIKKyAgICBleGl0IDE7OworIDEpIDs7CisgKikgZWNobyAiJG1lOiB0b28gbWFueSBhcmd1bWVudHMkaGVscCIgPiYyCisgICAgZXhpdCAxOzsKK2VzYWMKKworIyBTZXBhcmF0ZSB3aGF0IHRoZSB1c2VyIGdhdmUgaW50byBDUFUtQ09NUEFOWSBhbmQgT1Mgb3IgS0VSTkVMLU9TIChpZiBhbnkpLgorIyBIZXJlIHdlIG11c3QgcmVjb2duaXplIGFsbCB0aGUgdmFsaWQgS0VSTkVMLU9TIGNvbWJpbmF0aW9ucy4KK21heWJlX29zPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMi8nYAorY2FzZSAkbWF5YmVfb3MgaW4KKyAgbnRvLXFueCogfCBsaW51eC1nbnUqIHwgbGludXgtYW5kcm9pZCogfCBsaW51eC1kaWV0bGliYyB8IGxpbnV4LW5ld2xpYiogfCBcCisgIGxpbnV4LW11c2wqIHwgbGludXgtdWNsaWJjKiB8IHVjbGludXgtdWNsaWJjKiB8IHVjbGludXgtZ251KiB8IGtmcmVlYnNkKi1nbnUqIHwgXAorICBrbmV0YnNkKi1nbnUqIHwgbmV0YnNkKi1nbnUqIHwgXAorICBrb3BlbnNvbGFyaXMqLWdudSogfCBcCisgIHN0b3JtLWNoYW9zKiB8IG9zMi1lbXgqIHwgcnRtay1ub3ZhKikKKyAgICBvcz0tJG1heWJlX29zCisgICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy9eXCguKlwpLVwoW14tXSotW14tXSpcKSQvXDEvJ2AKKyAgICA7OworICBhbmRyb2lkLWxpbnV4KQorICAgIG9zPS1saW51eC1hbmRyb2lkCisgICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy9eXCguKlwpLVwoW14tXSotW14tXSpcKSQvXDEvJ2AtdW5rbm93bgorICAgIDs7CisgICopCisgICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy8tW14tXSokLy8nYAorICAgIGlmIFsgJGJhc2ljX21hY2hpbmUgIT0gJDEgXQorICAgIHRoZW4gb3M9YGVjaG8gJDEgfCBzZWQgJ3MvLiotLy0vJ2AKKyAgICBlbHNlIG9zPTsgZmkKKyAgICA7OworZXNhYworCisjIyMgTGV0J3MgcmVjb2duaXplIGNvbW1vbiBtYWNoaW5lcyBhcyBub3QgYmVpbmcgb3BlcmF0aW5nIHN5c3RlbXMgc28KKyMjIyB0aGF0IHRoaW5ncyBsaWtlIGNvbmZpZy5zdWIgZGVjc3RhdGlvbi0zMTAwIHdvcmsuICBXZSBhbHNvCisjIyMgcmVjb2duaXplIHNvbWUgbWFudWZhY3R1cmVycyBhcyBub3QgYmVpbmcgb3BlcmF0aW5nIHN5c3RlbXMsIHNvIHdlCisjIyMgY2FuIHByb3ZpZGUgZGVmYXVsdCBvcGVyYXRpbmcgc3lzdGVtcyBiZWxvdy4KK2Nhc2UgJG9zIGluCisJLXN1bipvcyopCisJCSMgUHJldmVudCBmb2xsb3dpbmcgY2xhdXNlIGZyb20gaGFuZGxpbmcgdGhpcyBpbnZhbGlkIGlucHV0LgorCQk7OworCS1kZWMqIHwgLW1pcHMqIHwgLXNlcXVlbnQqIHwgLWVuY29yZSogfCAtcGM1MzIqIHwgLXNnaSogfCAtc29ueSogfCBcCisJLWF0dCogfCAtNzMwMCogfCAtMzMwMCogfCAtZGVsdGEqIHwgLW1vdG9yb2xhKiB8IC1zdW5bMjM0XSogfCBcCisJLXVuaWNvbSogfCAtaWJtKiB8IC1uZXh0IHwgLWhwIHwgLWlzaSogfCAtYXBvbGxvIHwgLWFsdG9zKiB8IFwKKwktY29udmVyZ2VudCogfCAtbmNyKiB8IC1uZXdzIHwgLTMyKiB8IC0zNjAwKiB8IC0zMTAwKiB8IC1oaXRhY2hpKiB8XAorCS1jWzEyM10qIHwgLWNvbnZleCogfCAtc3VuIHwgLWNyZHMgfCAtb21yb24qIHwgLWRnIHwgLXVsdHJhIHwgLXR0aSogfCBcCisJLWhhcnJpcyB8IC1kb2xwaGluIHwgLWhpZ2hsZXZlbCB8IC1nb3VsZCB8IC1jYm0gfCAtbnMgfCAtbWFzc2NvbXAgfCBcCisJLWFwcGxlIHwgLWF4aXMgfCAta251dGggfCAtY3JheSB8IC1taWNyb2JsYXplKikKKwkJb3M9CisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKwktYmx1ZWdlbmUqKQorCQlvcz0tY25rCisJCTs7CisJLXNpbSB8IC1jaXNjbyB8IC1va2kgfCAtd2VjIHwgLXdpbmJvbmQpCisJCW9zPQorCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisJLXNjb3V0KQorCQk7OworCS13cnMpCisJCW9zPS12eHdvcmtzCisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKwktY2hvcnVzb3MqKQorCQlvcz0tY2hvcnVzb3MKKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworCS1jaG9ydXNyZGIpCisJCW9zPS1jaG9ydXNyZGIKKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworCS1oaXV4KikKKwkJb3M9LWhpdXh3ZTIKKwkJOzsKKwktc2NvNikKKwkJb3M9LXNjbzV2NgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzUpCisJCW9zPS1zY28zLjJ2NQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzQpCisJCW9zPS1zY28zLjJ2NAorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzMuMi5bNC05XSopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAncy9zY28zLjIuL3NjbzMuMnYvJ2AKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY28zLjJ2WzQtOV0qKQorCQkjIERvbid0IGZvcmdldCB2ZXJzaW9uIGlmIGl0IGlzIDMuMnY0IG9yIG5ld2VyLgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzV2NiopCisJCSMgRG9uJ3QgZm9yZ2V0IHZlcnNpb24gaWYgaXQgaXMgMy4ydjQgb3IgbmV3ZXIuCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvKikKKwkJb3M9LXNjbzMuMnYyCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktdWRrKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1pc2MpCisJCW9zPS1pc2MyLjIKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1jbGl4KikKKwkJYmFzaWNfbWFjaGluZT1jbGlwcGVyLWludGVyZ3JhcGgKKwkJOzsKKwktaXNjKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1seW54KjE3OCkKKwkJb3M9LWx5bnhvczE3OAorCQk7OworCS1seW54KjUpCisJCW9zPS1seW54b3M1CisJCTs7CisJLWx5bngqKQorCQlvcz0tbHlueG9zCisJCTs7CisJLXB0eCopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtc2VxdWVudC8nYAorCQk7OworCS13aW5kb3dzbnQqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvd2luZG93c250L3dpbm50LydgCisJCTs7CisJLXBzb3MqKQorCQlvcz0tcHNvcworCQk7OworCS1taW50IHwgLW1pbnRbMC05XSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hdGFyaQorCQlvcz0tbWludAorCQk7OworZXNhYworCisjIERlY29kZSBhbGlhc2VzIGZvciBjZXJ0YWluIENQVS1DT01QQU5ZIGNvbWJpbmF0aW9ucy4KK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGhvdXQgY29tcGFueSBuYW1lLgorCSMgU29tZSBhcmUgb21pdHRlZCBoZXJlIGJlY2F1c2UgdGhleSBoYXZlIHNwZWNpYWwgbWVhbmluZ3MgYmVsb3cuCisJMTc1MGEgfCA1ODAgXAorCXwgYTI5ayBcCisJfCBhYXJjaDY0IHwgYWFyY2g2NF9iZSBcCisJfCBhbHBoYSB8IGFscGhhZXZbNC04XSB8IGFscGhhZXY1NiB8IGFscGhhZXY2Wzc4XSB8IGFscGhhcGNhNVs2N10gXAorCXwgYWxwaGE2NCB8IGFscGhhNjRldls0LThdIHwgYWxwaGE2NGV2NTYgfCBhbHBoYTY0ZXY2Wzc4XSB8IGFscGhhNjRwY2E1WzY3XSBcCisJfCBhbTMzXzIuMCBcCisJfCBhcmMgfCBhcmNlYiBcCisJfCBhcm0gfCBhcm1bYmxdZSB8IGFybWVbbGJdIHwgYXJtdlsyLThdIHwgYXJtdlszLThdW2xiXSB8IGFybXY3W2FybV0gXAorCXwgYXZyIHwgYXZyMzIgXAorCXwgYmUzMiB8IGJlNjQgXAorCXwgYmZpbiBcCisJfCBjNHggfCBjODA1MSB8IGNsaXBwZXIgXAorCXwgZDEwdiB8IGQzMHYgfCBkbHggfCBkc3AxNnh4IFwKKwl8IGVwaXBoYW55IFwKKwl8IGZpZG8gfCBmcjMwIHwgZnJ2IFwKKwl8IGg4MzAwIHwgaDg1MDAgfCBocHBhIHwgaHBwYTEuWzAxXSB8IGhwcGEyLjAgfCBocHBhMi4wW253XSB8IGhwcGE2NCBcCisJfCBoZXhhZ29uIFwKKwl8IGkzNzAgfCBpODYwIHwgaTk2MCB8IGlhNjQgXAorCXwgaXAyayB8IGlxMjAwMCBcCisJfCBsZTMyIHwgbGU2NCBcCisJfCBsbTMyIFwKKwl8IG0zMmMgfCBtMzJyIHwgbTMycmxlIHwgbTY4MDAwIHwgbTY4ayB8IG04OGsgXAorCXwgbWF4cSB8IG1iIHwgbWljcm9ibGF6ZSB8IG1pY3JvYmxhemVlbCB8IG1jb3JlIHwgbWVwIHwgbWV0YWcgXAorCXwgbWlwcyB8IG1pcHNiZSB8IG1pcHNlYiB8IG1pcHNlbCB8IG1pcHNsZSBcCisJfCBtaXBzMTYgXAorCXwgbWlwczY0IHwgbWlwczY0ZWwgXAorCXwgbWlwczY0b2N0ZW9uIHwgbWlwczY0b2N0ZW9uZWwgXAorCXwgbWlwczY0b3Jpb24gfCBtaXBzNjRvcmlvbmVsIFwKKwl8IG1pcHM2NHI1OTAwIHwgbWlwczY0cjU5MDBlbCBcCisJfCBtaXBzNjR2ciB8IG1pcHM2NHZyZWwgXAorCXwgbWlwczY0dnI0MTAwIHwgbWlwczY0dnI0MTAwZWwgXAorCXwgbWlwczY0dnI0MzAwIHwgbWlwczY0dnI0MzAwZWwgXAorCXwgbWlwczY0dnI1MDAwIHwgbWlwczY0dnI1MDAwZWwgXAorCXwgbWlwczY0dnI1OTAwIHwgbWlwczY0dnI1OTAwZWwgXAorCXwgbWlwc2lzYTMyIHwgbWlwc2lzYTMyZWwgXAorCXwgbWlwc2lzYTMycjIgfCBtaXBzaXNhMzJyMmVsIFwKKwl8IG1pcHNpc2E2NCB8IG1pcHNpc2E2NGVsIFwKKwl8IG1pcHNpc2E2NHIyIHwgbWlwc2lzYTY0cjJlbCBcCisJfCBtaXBzaXNhNjRzYjEgfCBtaXBzaXNhNjRzYjFlbCBcCisJfCBtaXBzaXNhNjRzcjcxayB8IG1pcHNpc2E2NHNyNzFrZWwgXAorCXwgbWlwc3I1OTAwIHwgbWlwc3I1OTAwZWwgXAorCXwgbWlwc3R4MzkgfCBtaXBzdHgzOWVsIFwKKwl8IG1uMTAyMDAgfCBtbjEwMzAwIFwKKwl8IG1veGllIFwKKwl8IG10IFwKKwl8IG1zcDQzMCBcCisJfCBuZHMzMiB8IG5kczMybGUgfCBuZHMzMmJlIFwKKwl8IG5pb3MgfCBuaW9zMiB8IG5pb3MyZWIgfCBuaW9zMmVsIFwKKwl8IG5zMTZrIHwgbnMzMmsgXAorCXwgb3BlbjggXAorCXwgb3IxayB8IG9yMzIgXAorCXwgcGRwMTAgfCBwZHAxMSB8IHBqIHwgcGpsIFwKKwl8IHBvd2VycGMgfCBwb3dlcnBjNjQgfCBwb3dlcnBjNjRsZSB8IHBvd2VycGNsZSBcCisJfCBweXJhbWlkIFwKKwl8IHJsNzggfCByeCBcCisJfCBzY29yZSBcCisJfCBzaCB8IHNoWzEyMzRdIHwgc2hbMjRdYSB8IHNoWzI0XWFlYiB8IHNoWzIzXWUgfCBzaFszNF1lYiB8IHNoZWIgfCBzaGJlIHwgc2hsZSB8IHNoWzEyMzRdbGUgfCBzaDNlbGUgXAorCXwgc2g2NCB8IHNoNjRsZSBcCisJfCBzcGFyYyB8IHNwYXJjNjQgfCBzcGFyYzY0YiB8IHNwYXJjNjR2IHwgc3BhcmM4NnggfCBzcGFyY2xldCB8IHNwYXJjbGl0ZSBcCisJfCBzcGFyY3Y4IHwgc3BhcmN2OSB8IHNwYXJjdjliIHwgc3BhcmN2OXYgXAorCXwgc3B1IFwKKwl8IHRhaG9lIHwgdGljNHggfCB0aWM1NHggfCB0aWM1NXggfCB0aWM2eCB8IHRpYzgwIHwgdHJvbiBcCisJfCB1Ymljb20zMiBcCisJfCB2ODUwIHwgdjg1MGUgfCB2ODUwZTEgfCB2ODUwZTIgfCB2ODUwZXMgfCB2ODUwZTJ2MyBcCisJfCB3ZTMyayBcCisJfCB4ODYgfCB4YzE2eCB8IHhzdG9ybXkxNiB8IHh0ZW5zYSBcCisJfCB6OGsgfCB6ODApCisJCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgorCQk7OworCWM1NHgpCisJCWJhc2ljX21hY2hpbmU9dGljNTR4LXVua25vd24KKwkJOzsKKwljNTV4KQorCQliYXNpY19tYWNoaW5lPXRpYzU1eC11bmtub3duCisJCTs7CisJYzZ4KQorCQliYXNpY19tYWNoaW5lPXRpYzZ4LXVua25vd24KKwkJOzsKKwltNjgxMSB8IG02OGhjMTEgfCBtNjgxMiB8IG02OGhjMTIgfCBtNjhoY3MxMnggfCBwaWNvY2hpcCkKKwkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCisJCW9zPS1ub25lCisJCTs7CisJbTg4MTEwIHwgbTY4MFsxMjM0Nl0wIHwgbTY4Mz8yIHwgbTY4MzYwIHwgbTUyMDAgfCB2NzAgfCB3NjUgfCB6OGspCisJCTs7CisJbXMxKQorCQliYXNpY19tYWNoaW5lPW10LXVua25vd24KKwkJOzsKKworCXN0cm9uZ2FybSB8IHRodW1iIHwgeHNjYWxlKQorCQliYXNpY19tYWNoaW5lPWFybS11bmtub3duCisJCTs7CisJeGdhdGUpCisJCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgorCQlvcz0tbm9uZQorCQk7OworCXhzY2FsZWViKQorCQliYXNpY19tYWNoaW5lPWFybWViLXVua25vd24KKwkJOzsKKworCXhzY2FsZWVsKQorCQliYXNpY19tYWNoaW5lPWFybWVsLXVua25vd24KKwkJOzsKKworCSMgV2UgdXNlIGBwYycgcmF0aGVyIHRoYW4gYHVua25vd24nCisJIyBiZWNhdXNlICgxKSB0aGF0J3Mgd2hhdCB0aGV5IG5vcm1hbGx5IGFyZSwgYW5kCisJIyAoMikgdGhlIHdvcmQgInVua25vd24iIHRlbmRzIHRvIGNvbmZ1c2UgYmVnaW5uaW5nIHVzZXJzLgorCWkqODYgfCB4ODZfNjQpCisJICBiYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXBjCisJICA7OworCSMgT2JqZWN0IGlmIG1vcmUgdGhhbiBvbmUgY29tcGFueSBuYW1lIHdvcmQuCisJKi0qLSopCisJCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogbWFjaGluZSBcYCRiYXNpY19tYWNoaW5lXCcgbm90IHJlY29nbml6ZWQgMT4mMgorCQlleGl0IDEKKwkJOzsKKwkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGggY29tcGFueSBuYW1lLgorCTU4MC0qIFwKKwl8IGEyOWstKiBcCisJfCBhYXJjaDY0LSogfCBhYXJjaDY0X2JlLSogXAorCXwgYWxwaGEtKiB8IGFscGhhZXZbNC04XS0qIHwgYWxwaGFldjU2LSogfCBhbHBoYWV2Nls3OF0tKiBcCisJfCBhbHBoYTY0LSogfCBhbHBoYTY0ZXZbNC04XS0qIHwgYWxwaGE2NGV2NTYtKiB8IGFscGhhNjRldjZbNzhdLSogXAorCXwgYWxwaGFwY2E1WzY3XS0qIHwgYWxwaGE2NHBjYTVbNjddLSogfCBhcmMtKiB8IGFyY2ViLSogXAorCXwgYXJtLSogIHwgYXJtYmUtKiB8IGFybWxlLSogfCBhcm1lYi0qIHwgYXJtdiotKiBcCisJfCBhdnItKiB8IGF2cjMyLSogXAorCXwgYmUzMi0qIHwgYmU2NC0qIFwKKwl8IGJmaW4tKiB8IGJzMjAwMC0qIFwKKwl8IGNbMTIzXSogfCBjMzAtKiB8IFtjanRdOTAtKiB8IGM0eC0qIFwKKwl8IGM4MDUxLSogfCBjbGlwcGVyLSogfCBjcmF5bnYtKiB8IGN5ZHJhLSogXAorCXwgZDEwdi0qIHwgZDMwdi0qIHwgZGx4LSogXAorCXwgZWx4c2ktKiBcCisJfCBmMzBbMDFdLSogfCBmNzAwLSogfCBmaWRvLSogfCBmcjMwLSogfCBmcnYtKiB8IGZ4ODAtKiBcCisJfCBoODMwMC0qIHwgaDg1MDAtKiBcCisJfCBocHBhLSogfCBocHBhMS5bMDFdLSogfCBocHBhMi4wLSogfCBocHBhMi4wW253XS0qIHwgaHBwYTY0LSogXAorCXwgaGV4YWdvbi0qIFwKKwl8IGkqODYtKiB8IGk4NjAtKiB8IGk5NjAtKiB8IGlhNjQtKiBcCisJfCBpcDJrLSogfCBpcTIwMDAtKiBcCisJfCBsZTMyLSogfCBsZTY0LSogXAorCXwgbG0zMi0qIFwKKwl8IG0zMmMtKiB8IG0zMnItKiB8IG0zMnJsZS0qIFwKKwl8IG02ODAwMC0qIHwgbTY4MFswMTIzNDZdMC0qIHwgbTY4MzYwLSogfCBtNjgzPzItKiB8IG02OGstKiBcCisJfCBtODgxMTAtKiB8IG04OGstKiB8IG1heHEtKiB8IG1jb3JlLSogfCBtZXRhZy0qIFwKKwl8IG1pY3JvYmxhemUtKiB8IG1pY3JvYmxhemVlbC0qIFwKKwl8IG1pcHMtKiB8IG1pcHNiZS0qIHwgbWlwc2ViLSogfCBtaXBzZWwtKiB8IG1pcHNsZS0qIFwKKwl8IG1pcHMxNi0qIFwKKwl8IG1pcHM2NC0qIHwgbWlwczY0ZWwtKiBcCisJfCBtaXBzNjRvY3Rlb24tKiB8IG1pcHM2NG9jdGVvbmVsLSogXAorCXwgbWlwczY0b3Jpb24tKiB8IG1pcHM2NG9yaW9uZWwtKiBcCisJfCBtaXBzNjRyNTkwMC0qIHwgbWlwczY0cjU5MDBlbC0qIFwKKwl8IG1pcHM2NHZyLSogfCBtaXBzNjR2cmVsLSogXAorCXwgbWlwczY0dnI0MTAwLSogfCBtaXBzNjR2cjQxMDBlbC0qIFwKKwl8IG1pcHM2NHZyNDMwMC0qIHwgbWlwczY0dnI0MzAwZWwtKiBcCisJfCBtaXBzNjR2cjUwMDAtKiB8IG1pcHM2NHZyNTAwMGVsLSogXAorCXwgbWlwczY0dnI1OTAwLSogfCBtaXBzNjR2cjU5MDBlbC0qIFwKKwl8IG1pcHNpc2EzMi0qIHwgbWlwc2lzYTMyZWwtKiBcCisJfCBtaXBzaXNhMzJyMi0qIHwgbWlwc2lzYTMycjJlbC0qIFwKKwl8IG1pcHNpc2E2NC0qIHwgbWlwc2lzYTY0ZWwtKiBcCisJfCBtaXBzaXNhNjRyMi0qIHwgbWlwc2lzYTY0cjJlbC0qIFwKKwl8IG1pcHNpc2E2NHNiMS0qIHwgbWlwc2lzYTY0c2IxZWwtKiBcCisJfCBtaXBzaXNhNjRzcjcxay0qIHwgbWlwc2lzYTY0c3I3MWtlbC0qIFwKKwl8IG1pcHNyNTkwMC0qIHwgbWlwc3I1OTAwZWwtKiBcCisJfCBtaXBzdHgzOS0qIHwgbWlwc3R4MzllbC0qIFwKKwl8IG1taXgtKiBcCisJfCBtdC0qIFwKKwl8IG1zcDQzMC0qIFwKKwl8IG5kczMyLSogfCBuZHMzMmxlLSogfCBuZHMzMmJlLSogXAorCXwgbmlvcy0qIHwgbmlvczItKiB8IG5pb3MyZWItKiB8IG5pb3MyZWwtKiBcCisJfCBub25lLSogfCBucDEtKiB8IG5zMTZrLSogfCBuczMyay0qIFwKKwl8IG9wZW44LSogXAorCXwgb3Jpb24tKiBcCisJfCBwZHAxMC0qIHwgcGRwMTEtKiB8IHBqLSogfCBwamwtKiB8IHBuLSogfCBwb3dlci0qIFwKKwl8IHBvd2VycGMtKiB8IHBvd2VycGM2NC0qIHwgcG93ZXJwYzY0bGUtKiB8IHBvd2VycGNsZS0qIFwKKwl8IHB5cmFtaWQtKiBcCisJfCBybDc4LSogfCByb21wLSogfCByczYwMDAtKiB8IHJ4LSogXAorCXwgc2gtKiB8IHNoWzEyMzRdLSogfCBzaFsyNF1hLSogfCBzaFsyNF1hZWItKiB8IHNoWzIzXWUtKiB8IHNoWzM0XWViLSogfCBzaGViLSogfCBzaGJlLSogXAorCXwgc2hsZS0qIHwgc2hbMTIzNF1sZS0qIHwgc2gzZWxlLSogfCBzaDY0LSogfCBzaDY0bGUtKiBcCisJfCBzcGFyYy0qIHwgc3BhcmM2NC0qIHwgc3BhcmM2NGItKiB8IHNwYXJjNjR2LSogfCBzcGFyYzg2eC0qIHwgc3BhcmNsZXQtKiBcCisJfCBzcGFyY2xpdGUtKiBcCisJfCBzcGFyY3Y4LSogfCBzcGFyY3Y5LSogfCBzcGFyY3Y5Yi0qIHwgc3BhcmN2OXYtKiB8IHN2MS0qIHwgc3g/LSogXAorCXwgdGFob2UtKiBcCisJfCB0aWMzMC0qIHwgdGljNHgtKiB8IHRpYzU0eC0qIHwgdGljNTV4LSogfCB0aWM2eC0qIHwgdGljODAtKiBcCisJfCB0aWxlKi0qIFwKKwl8IHRyb24tKiBcCisJfCB1Ymljb20zMi0qIFwKKwl8IHY4NTAtKiB8IHY4NTBlLSogfCB2ODUwZTEtKiB8IHY4NTBlcy0qIHwgdjg1MGUyLSogfCB2ODUwZTJ2My0qIFwKKwl8IHZheC0qIFwKKwl8IHdlMzJrLSogXAorCXwgeDg2LSogfCB4ODZfNjQtKiB8IHhjMTZ4LSogfCB4cHMxMDAtKiBcCisJfCB4c3Rvcm15MTYtKiB8IHh0ZW5zYSotKiBcCisJfCB5bXAtKiBcCisJfCB6OGstKiB8IHo4MC0qKQorCQk7OworCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aG91dCBjb21wYW55IG5hbWUsIHdpdGggZ2xvYiBtYXRjaC4KKwl4dGVuc2EqKQorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KKwkJOzsKKwkjIFJlY29nbml6ZSB0aGUgdmFyaW91cyBtYWNoaW5lIG5hbWVzIGFuZCBhbGlhc2VzIHdoaWNoIHN0YW5kCisJIyBmb3IgYSBDUFUgdHlwZSBhbmQgYSBjb21wYW55IGFuZCBzb21ldGltZXMgZXZlbiBhbiBPUy4KKwkzODZic2QpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCisJCW9zPS1ic2QKKwkJOzsKKwkzYjEgfCA3MzAwIHwgNzMwMC1hdHQgfCBhdHQtNzMwMCB8IHBjNzMwMCB8IHNhZmFyaSB8IHVuaXhwYykKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtYXR0CisJCTs7CisJM2IqKQorCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAorCQk7OworCWEyOWtoaWYpCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LXVkaQorCQk7OworCWFiYWN1cykKKwkJYmFzaWNfbWFjaGluZT1hYmFjdXMtdW5rbm93bgorCQk7OworCWFkb2JlNjhrKQorCQliYXNpY19tYWNoaW5lPW02ODAxMC1hZG9iZQorCQlvcz0tc2NvdXQKKwkJOzsKKwlhbGxpYW50IHwgZng4MCkKKwkJYmFzaWNfbWFjaGluZT1meDgwLWFsbGlhbnQKKwkJOzsKKwlhbHRvcyB8IGFsdG9zMzA2OCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFsdG9zCisJCTs7CisJYW0yOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay1ub25lCisJCW9zPS1ic2QKKwkJOzsKKwlhbWQ2NCkKKwkJYmFzaWNfbWFjaGluZT14ODZfNjQtcGMKKwkJOzsKKwlhbWQ2NC0qKQorCQliYXNpY19tYWNoaW5lPXg4Nl82NC1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCWFtZGFobCkKKwkJYmFzaWNfbWFjaGluZT01ODAtYW1kYWhsCisJCW9zPS1zeXN2CisJCTs7CisJYW1pZ2EgfCBhbWlnYS0qKQorCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgorCQk7OworCWFtaWdhb3MgfCBhbWlnYWRvcykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KKwkJb3M9LWFtaWdhb3MKKwkJOzsKKwlhbWlnYXVuaXggfCBhbWl4KQorCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgorCQlvcz0tc3lzdjQKKwkJOzsKKwlhcG9sbG82OCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFwb2xsbworCQlvcz0tc3lzdgorCQk7OworCWFwb2xsbzY4YnNkKQorCQliYXNpY19tYWNoaW5lPW02OGstYXBvbGxvCisJCW9zPS1ic2QKKwkJOzsKKwlhcm9zKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LWFyb3MKKwkJOzsKKwlhdXgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hcHBsZQorCQlvcz0tYXV4CisJCTs7CisJYmFsYW5jZSkKKwkJYmFzaWNfbWFjaGluZT1uczMyay1zZXF1ZW50CisJCW9zPS1keW5peAorCQk7OworCWJsYWNrZmluKQorCQliYXNpY19tYWNoaW5lPWJmaW4tdW5rbm93bgorCQlvcz0tbGludXgKKwkJOzsKKwlibGFja2Zpbi0qKQorCQliYXNpY19tYWNoaW5lPWJmaW4tYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJb3M9LWxpbnV4CisJCTs7CisJYmx1ZWdlbmUqKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGMtaWJtCisJCW9zPS1jbmsKKwkJOzsKKwljNTR4LSopCisJCWJhc2ljX21hY2hpbmU9dGljNTR4LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJYzU1eC0qKQorCQliYXNpY19tYWNoaW5lPXRpYzU1eC1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCWM2eC0qKQorCQliYXNpY19tYWNoaW5lPXRpYzZ4LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJYzkwKQorCQliYXNpY19tYWNoaW5lPWM5MC1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwljZWdjYykKKwkJYmFzaWNfbWFjaGluZT1hcm0tdW5rbm93bgorCQlvcz0tY2VnY2MKKwkJOzsKKwljb252ZXgtYzEpCisJCWJhc2ljX21hY2hpbmU9YzEtY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzIpCisJCWJhc2ljX21hY2hpbmU9YzItY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzMyKQorCQliYXNpY19tYWNoaW5lPWMzMi1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMzQpCisJCWJhc2ljX21hY2hpbmU9YzM0LWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMzOCkKKwkJYmFzaWNfbWFjaGluZT1jMzgtY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljcmF5IHwgajkwKQorCQliYXNpY19tYWNoaW5lPWo5MC1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwljcmF5bnYpCisJCWJhc2ljX21hY2hpbmU9Y3JheW52LWNyYXkKKwkJb3M9LXVuaWNvc21wCisJCTs7CisJY3IxNiB8IGNyMTYtKikKKwkJYmFzaWNfbWFjaGluZT1jcjE2LXVua25vd24KKwkJb3M9LWVsZgorCQk7OworCWNyZHMgfCB1bm9zKQorCQliYXNpY19tYWNoaW5lPW02OGstY3JkcworCQk7OworCWNyaXN2MzIgfCBjcmlzdjMyLSogfCBldHJheGZzKikKKwkJYmFzaWNfbWFjaGluZT1jcmlzdjMyLWF4aXMKKwkJOzsKKwljcmlzIHwgY3Jpcy0qIHwgZXRyYXgqKQorCQliYXNpY19tYWNoaW5lPWNyaXMtYXhpcworCQk7OworCWNyeCkKKwkJYmFzaWNfbWFjaGluZT1jcngtdW5rbm93bgorCQlvcz0tZWxmCisJCTs7CisJZGEzMCB8IGRhMzAtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWRhMzAKKwkJOzsKKwlkZWNzdGF0aW9uIHwgZGVjc3RhdGlvbi0zMTAwIHwgcG1heCB8IHBtYXgtKiB8IHBtaW4gfCBkZWMzMTAwIHwgZGVjc3RhdG4pCisJCWJhc2ljX21hY2hpbmU9bWlwcy1kZWMKKwkJOzsKKwlkZWNzeXN0ZW0xMCogfCBkZWMxMCopCisJCWJhc2ljX21hY2hpbmU9cGRwMTAtZGVjCisJCW9zPS10b3BzMTAKKwkJOzsKKwlkZWNzeXN0ZW0yMCogfCBkZWMyMCopCisJCWJhc2ljX21hY2hpbmU9cGRwMTAtZGVjCisJCW9zPS10b3BzMjAKKwkJOzsKKwlkZWx0YSB8IDMzMDAgfCBtb3Rvcm9sYS0zMzAwIHwgbW90b3JvbGEtZGVsdGEgXAorCSAgICAgIHwgMzMwMC1tb3Rvcm9sYSB8IGRlbHRhLW1vdG9yb2xhKQorCQliYXNpY19tYWNoaW5lPW02OGstbW90b3JvbGEKKwkJOzsKKwlkZWx0YTg4KQorCQliYXNpY19tYWNoaW5lPW04OGstbW90b3JvbGEKKwkJb3M9LXN5c3YzCisJCTs7CisJZGljb3MpCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1wYworCQlvcz0tZGljb3MKKwkJOzsKKwlkamdwcCkKKwkJYmFzaWNfbWFjaGluZT1pNTg2LXBjCisJCW9zPS1tc2Rvc2RqZ3BwCisJCTs7CisJZHB4MjAgfCBkcHgyMC0qKQorCQliYXNpY19tYWNoaW5lPXJzNjAwMC1idWxsCisJCW9zPS1ib3N4CisJCTs7CisJZHB4MiogfCBkcHgyKi1idWxsKQorCQliYXNpY19tYWNoaW5lPW02OGstYnVsbAorCQlvcz0tc3lzdjMKKwkJOzsKKwllYm1vbjI5aykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAorCQlvcz0tZWJtb24KKwkJOzsKKwllbHhzaSkKKwkJYmFzaWNfbWFjaGluZT1lbHhzaS1lbHhzaQorCQlvcz0tYnNkCisJCTs7CisJZW5jb3JlIHwgdW1heCB8IG1tYXgpCisJCWJhc2ljX21hY2hpbmU9bnMzMmstZW5jb3JlCisJCTs7CisJZXMxODAwIHwgT1NFNjhrIHwgb3NlNjhrIHwgb3NlIHwgT1NFKQorCQliYXNpY19tYWNoaW5lPW02OGstZXJpY3Nzb24KKwkJb3M9LW9zZQorCQk7OworCWZ4MjgwMCkKKwkJYmFzaWNfbWFjaGluZT1pODYwLWFsbGlhbnQKKwkJOzsKKwlnZW5peCkKKwkJYmFzaWNfbWFjaGluZT1uczMyay1ucworCQk7OworCWdtaWNybykKKwkJYmFzaWNfbWFjaGluZT10cm9uLWdtaWNybworCQlvcz0tc3lzdgorCQk7OworCWdvMzIpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQlvcz0tZ28zMgorCQk7OworCWgzMDUwciogfCBoaXV4KikKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKKwkJb3M9LWhpdXh3ZTIKKwkJOzsKKwloODMwMGhtcykKKwkJYmFzaWNfbWFjaGluZT1oODMwMC1oaXRhY2hpCisJCW9zPS1obXMKKwkJOzsKKwloODMwMHhyYXkpCisJCWJhc2ljX21hY2hpbmU9aDgzMDAtaGl0YWNoaQorCQlvcz0teHJheQorCQk7OworCWg4NTAwaG1zKQorCQliYXNpY19tYWNoaW5lPWg4NTAwLWhpdGFjaGkKKwkJb3M9LWhtcworCQk7OworCWhhcnJpcykKKwkJYmFzaWNfbWFjaGluZT1tODhrLWhhcnJpcworCQlvcz0tc3lzdjMKKwkJOzsKKwlocDMwMC0qKQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJOzsKKwlocDMwMGJzZCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCisJCW9zPS1ic2QKKwkJOzsKKwlocDMwMGhwdXgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQlvcz0taHB1eAorCQk7OworCWhwM2s5WzAtOV1bMC05XSB8IGhwOVswLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAorCQk7OworCWhwOWsyWzAtOV1bMC05XSB8IGhwOWszMVswLTldKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1ocAorCQk7OworCWhwOWszWzItOV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCisJCTs7CisJaHA5azZbMC05XVswLTldIHwgaHA2WzAtOV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCisJCTs7CisJaHA5azdbMC03OV1bMC05XSB8IGhwN1swLTc5XVswLTldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJOzsKKwlocDlrNzhbMC05XSB8IGhwNzhbMC05XSkKKwkJIyBGSVhNRTogcmVhbGx5IGhwcGEyLjAtaHAKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azhbNjddMSB8IGhwOFs2N10xIHwgaHA5azgwWzI0XSB8IGhwODBbMjRdIHwgaHA5azhbNzhdOSB8IGhwOFs3OF05IHwgaHA5azg5MyB8IGhwODkzKQorCQkjIEZJWE1FOiByZWFsbHkgaHBwYTIuMC1ocAorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJOzsKKwlocDlrOFswLTldWzEzNjc5XSB8IGhwOFswLTldWzEzNjc5XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azhbMC05XVswLTldIHwgaHA4WzAtOV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCisJCTs7CisJaHBwYS1uZXh0KQorCQlvcz0tbmV4dHN0ZXAzCisJCTs7CisJaHBwYW9zZikKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCW9zPS1vc2YKKwkJOzsKKwlocHBybykKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCW9zPS1wcm9lbGYKKwkJOzsKKwlpMzcwLWlibSogfCBpYm0qKQorCQliYXNpY19tYWNoaW5lPWkzNzAtaWJtCisJCTs7CisJaSo4NnYzMikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zeXN2MzIKKwkJOzsKKwlpKjg2djQqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXN5c3Y0CisJCTs7CisJaSo4NnYpCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAorCQlvcz0tc3lzdgorCQk7OworCWkqODZzb2wyKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJaTM4Nm1hY2gpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1tYWNoCisJCW9zPS1tYWNoCisJCTs7CisJaTM4Ni12c3RhIHwgdnN0YSkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KKwkJb3M9LXZzdGEKKwkJOzsKKwlpcmlzIHwgaXJpczRkKQorCQliYXNpY19tYWNoaW5lPW1pcHMtc2dpCisJCWNhc2UgJG9zIGluCisJCSAgICAtaXJpeCopCisJCQk7OworCQkgICAgKikKKwkJCW9zPS1pcml4NAorCQkJOzsKKwkJZXNhYworCQk7OworCWlzaTY4IHwgaXNpKQorCQliYXNpY19tYWNoaW5lPW02OGstaXNpCisJCW9zPS1zeXN2CisJCTs7CisJbTY4a25vbW11KQorCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgorCQlvcz0tbGludXgKKwkJOzsKKwltNjhrbm9tbXUtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCW9zPS1saW51eAorCQk7OworCW04OGstb21yb24qKQorCQliYXNpY19tYWNoaW5lPW04OGstb21yb24KKwkJOzsKKwltYWdudW0gfCBtMzIzMCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLW1pcHMKKwkJb3M9LXN5c3YKKwkJOzsKKwltZXJsaW4pCisJCWJhc2ljX21hY2hpbmU9bnMzMmstdXRlaworCQlvcz0tc3lzdgorCQk7OworCW1pY3JvYmxhemUqKQorCQliYXNpY19tYWNoaW5lPW1pY3JvYmxhemUteGlsaW54CisJCTs7CisJbWluZ3c2NCkKKwkJYmFzaWNfbWFjaGluZT14ODZfNjQtcGMKKwkJb3M9LW1pbmd3NjQKKwkJOzsKKwltaW5ndzMyKQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJb3M9LW1pbmd3MzIKKwkJOzsKKwltaW5ndzMyY2UpCisJCWJhc2ljX21hY2hpbmU9YXJtLXVua25vd24KKwkJb3M9LW1pbmd3MzJjZQorCQk7OworCW1pbmlmcmFtZSkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtY29udmVyZ2VudAorCQk7OworCSptaW50IHwgLW1pbnRbMC05XSogfCAqTWlOVCB8ICpNaU5UWzAtOV0qKQorCQliYXNpY19tYWNoaW5lPW02OGstYXRhcmkKKwkJb3M9LW1pbnQKKwkJOzsKKwltaXBzMyotKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9taXBzMy9taXBzNjQvJ2AKKwkJOzsKKwltaXBzMyopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbWlwczMvbWlwczY0LydgLXVua25vd24KKwkJOzsKKwltb25pdG9yKQorCQliYXNpY19tYWNoaW5lPW02OGstcm9tNjhrCisJCW9zPS1jb2ZmCisJCTs7CisJbW9ycGhvcykKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLXVua25vd24KKwkJb3M9LW1vcnBob3MKKwkJOzsKKwltc2RvcykKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1tc2RvcworCQk7OworCW1zMS0qKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21zMS0vbXQtLydgCisJCTs7CisJbXN5cykKKwkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCisJCW9zPS1tc3lzCisJCTs7CisJbXZzKQorCQliYXNpY19tYWNoaW5lPWkzNzAtaWJtCisJCW9zPS1tdnMKKwkJOzsKKwluYWNsKQorCQliYXNpY19tYWNoaW5lPWxlMzItdW5rbm93bgorCQlvcz0tbmFjbAorCQk7OworCW5jcjMwMDApCisJCWJhc2ljX21hY2hpbmU9aTQ4Ni1uY3IKKwkJb3M9LXN5c3Y0CisJCTs7CisJbmV0YnNkMzg2KQorCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgorCQlvcz0tbmV0YnNkCisJCTs7CisJbmV0d2luZGVyKQorCQliYXNpY19tYWNoaW5lPWFybXY0bC1yZWJlbAorCQlvcz0tbGludXgKKwkJOzsKKwluZXdzIHwgbmV3czcwMCB8IG5ld3M4MDAgfCBuZXdzOTAwKQorCQliYXNpY19tYWNoaW5lPW02OGstc29ueQorCQlvcz0tbmV3c29zCisJCTs7CisJbmV3czEwMDApCisJCWJhc2ljX21hY2hpbmU9bTY4MDMwLXNvbnkKKwkJb3M9LW5ld3NvcworCQk7OworCW5ld3MtMzYwMCB8IHJpc2MtbmV3cykKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNvbnkKKwkJb3M9LW5ld3NvcworCQk7OworCW5lY3Y3MCkKKwkJYmFzaWNfbWFjaGluZT12NzAtbmVjCisJCW9zPS1zeXN2CisJCTs7CisJbmV4dCB8IG0qLW5leHQgKQorCQliYXNpY19tYWNoaW5lPW02OGstbmV4dAorCQljYXNlICRvcyBpbgorCQkgICAgLW5leHRzdGVwKiApCisJCQk7OworCQkgICAgLW5zMiopCisJCSAgICAgIG9zPS1uZXh0c3RlcDIKKwkJCTs7CisJCSAgICAqKQorCQkgICAgICBvcz0tbmV4dHN0ZXAzCisJCQk7OworCQllc2FjCisJCTs7CisJbmgzMDAwKQorCQliYXNpY19tYWNoaW5lPW02OGstaGFycmlzCisJCW9zPS1jeHV4CisJCTs7CisJbmhbNDVdMDAwKQorCQliYXNpY19tYWNoaW5lPW04OGstaGFycmlzCisJCW9zPS1jeHV4CisJCTs7CisJbmluZHk5NjApCisJCWJhc2ljX21hY2hpbmU9aTk2MC1pbnRlbAorCQlvcz0tbmluZHkKKwkJOzsKKwltb245NjApCisJCWJhc2ljX21hY2hpbmU9aTk2MC1pbnRlbAorCQlvcz0tbW9uOTYwCisJCTs7CisJbm9uc3RvcHV4KQorCQliYXNpY19tYWNoaW5lPW1pcHMtY29tcGFxCisJCW9zPS1ub25zdG9wdXgKKwkJOzsKKwlucDEpCisJCWJhc2ljX21hY2hpbmU9bnAxLWdvdWxkCisJCTs7CisJbmVvLXRhbmRlbSkKKwkJYmFzaWNfbWFjaGluZT1uZW8tdGFuZGVtCisJCTs7CisJbnNlLXRhbmRlbSkKKwkJYmFzaWNfbWFjaGluZT1uc2UtdGFuZGVtCisJCTs7CisJbnNyLXRhbmRlbSkKKwkJYmFzaWNfbWFjaGluZT1uc3ItdGFuZGVtCisJCTs7CisJb3A1MG4tKiB8IG9wNjBjLSopCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKKwkJb3M9LXByb2VsZgorCQk7OworCW9wZW5yaXNjIHwgb3BlbnJpc2MtKikKKwkJYmFzaWNfbWFjaGluZT1vcjMyLXVua25vd24KKwkJOzsKKwlvczQwMCkKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWlibQorCQlvcz0tb3M0MDAKKwkJOzsKKwlPU0U2ODAwMCB8IG9zZTY4MDAwKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1lcmljc3NvbgorCQlvcz0tb3NlCisJCTs7CisJb3M2OGspCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ub25lCisJCW9zPS1vczY4aworCQk7OworCXBhLWhpdGFjaGkpCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1oaXRhY2hpCisJCW9zPS1oaXV4d2UyCisJCTs7CisJcGFyYWdvbikKKwkJYmFzaWNfbWFjaGluZT1pODYwLWludGVsCisJCW9zPS1vc2YKKwkJOzsKKwlwYXJpc2MpCisJCWJhc2ljX21hY2hpbmU9aHBwYS11bmtub3duCisJCW9zPS1saW51eAorCQk7OworCXBhcmlzYy0qKQorCQliYXNpY19tYWNoaW5lPWhwcGEtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJb3M9LWxpbnV4CisJCTs7CisJcGJkKQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXR0aQorCQk7OworCXBiYikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXR0aQorCQk7OworCXBjNTMyIHwgcGM1MzItKikKKwkJYmFzaWNfbWFjaGluZT1uczMyay1wYzUzMgorCQk7OworCXBjOTgpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQk7OworCXBjOTgtKikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcGVudGl1bSB8IHA1IHwgazUgfCBrNiB8IG5leGdlbiB8IHZpYWMzKQorCQliYXNpY19tYWNoaW5lPWk1ODYtcGMKKwkJOzsKKwlwZW50aXVtcHJvIHwgcDYgfCA2eDg2IHwgYXRobG9uIHwgYXRobG9uXyopCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1wYworCQk7OworCXBlbnRpdW1paSB8IHBlbnRpdW0yIHwgcGVudGl1bWlpaSB8IHBlbnRpdW0zKQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJOzsKKwlwZW50aXVtNCkKKwkJYmFzaWNfbWFjaGluZT1pNzg2LXBjCisJCTs7CisJcGVudGl1bS0qIHwgcDUtKiB8IGs1LSogfCBrNi0qIHwgbmV4Z2VuLSogfCB2aWFjMy0qKQorCQliYXNpY19tYWNoaW5lPWk1ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwZW50aXVtcHJvLSogfCBwNi0qIHwgNng4Ni0qIHwgYXRobG9uLSopCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBlbnRpdW1paS0qIHwgcGVudGl1bTItKiB8IHBlbnRpdW1paWktKiB8IHBlbnRpdW0zLSopCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBlbnRpdW00LSopCisJCWJhc2ljX21hY2hpbmU9aTc4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBuKQorCQliYXNpY19tYWNoaW5lPXBuLWdvdWxkCisJCTs7CisJcG93ZXIpCWJhc2ljX21hY2hpbmU9cG93ZXItaWJtCisJCTs7CisJcHBjIHwgcHBjYmUpCWJhc2ljX21hY2hpbmU9cG93ZXJwYy11bmtub3duCisJCTs7CisJcHBjLSogfCBwcGNiZS0qKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGMtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwcGNsZSB8IHBvd2VycGNsaXR0bGUgfCBwcGMtbGUgfCBwb3dlcnBjLWxpdHRsZSkKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtdW5rbm93bgorCQk7OworCXBwY2xlLSogfCBwb3dlcnBjbGl0dGxlLSopCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwY2xlLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcHBjNjQpCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0LXVua25vd24KKwkJOzsKKwlwcGM2NC0qKSBiYXNpY19tYWNoaW5lPXBvd2VycGM2NC1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBwYzY0bGUgfCBwb3dlcnBjNjRsaXR0bGUgfCBwcGM2NC1sZSB8IHBvd2VycGM2NC1saXR0bGUpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0bGUtdW5rbm93bgorCQk7OworCXBwYzY0bGUtKiB8IHBvd2VycGM2NGxpdHRsZS0qKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGM2NGxlLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcHMyKQorCQliYXNpY19tYWNoaW5lPWkzODYtaWJtCisJCTs7CisJcHczMikKKwkJYmFzaWNfbWFjaGluZT1pNTg2LXVua25vd24KKwkJb3M9LXB3MzIKKwkJOzsKKwlyZG9zIHwgcmRvczY0KQorCQliYXNpY19tYWNoaW5lPXg4Nl82NC1wYworCQlvcz0tcmRvcworCQk7OworCXJkb3MzMikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1yZG9zCisJCTs7CisJcm9tNjhrKQorCQliYXNpY19tYWNoaW5lPW02OGstcm9tNjhrCisJCW9zPS1jb2ZmCisJCTs7CisJcm1bNDZdMDApCisJCWJhc2ljX21hY2hpbmU9bWlwcy1zaWVtZW5zCisJCTs7CisJcnRwYyB8IHJ0cGMtKikKKwkJYmFzaWNfbWFjaGluZT1yb21wLWlibQorCQk7OworCXMzOTAgfCBzMzkwLSopCisJCWJhc2ljX21hY2hpbmU9czM5MC1pYm0KKwkJOzsKKwlzMzkweCB8IHMzOTB4LSopCisJCWJhc2ljX21hY2hpbmU9czM5MHgtaWJtCisJCTs7CisJc2EyOTIwMCkKKwkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAorCQlvcz0tdWRpCisJCTs7CisJc2IxKQorCQliYXNpY19tYWNoaW5lPW1pcHNpc2E2NHNiMS11bmtub3duCisJCTs7CisJc2IxZWwpCisJCWJhc2ljX21hY2hpbmU9bWlwc2lzYTY0c2IxZWwtdW5rbm93bgorCQk7OworCXNkZSkKKwkJYmFzaWNfbWFjaGluZT1taXBzaXNhMzItc2RlCisJCW9zPS1lbGYKKwkJOzsKKwlzZWkpCisJCWJhc2ljX21hY2hpbmU9bWlwcy1zZWkKKwkJb3M9LXNlaXV4CisJCTs7CisJc2VxdWVudCkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXNlcXVlbnQKKwkJOzsKKwlzaCkKKwkJYmFzaWNfbWFjaGluZT1zaC1oaXRhY2hpCisJCW9zPS1obXMKKwkJOzsKKwlzaDVlbCkKKwkJYmFzaWNfbWFjaGluZT1zaDVsZS11bmtub3duCisJCTs7CisJc2g2NCkKKwkJYmFzaWNfbWFjaGluZT1zaDY0LXVua25vd24KKwkJOzsKKwlzcGFyY2xpdGUtd3JzIHwgc2ltc28td3JzKQorCQliYXNpY19tYWNoaW5lPXNwYXJjbGl0ZS13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwlzcHM3KQorCQliYXNpY19tYWNoaW5lPW02OGstYnVsbAorCQlvcz0tc3lzdjIKKwkJOzsKKwlzcHVyKQorCQliYXNpY19tYWNoaW5lPXNwdXItdW5rbm93bgorCQk7OworCXN0MjAwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXRhbmRlbQorCQk7OworCXN0cmF0dXMpCisJCWJhc2ljX21hY2hpbmU9aTg2MC1zdHJhdHVzCisJCW9zPS1zeXN2NAorCQk7OworCXN0cm9uZ2FybS0qIHwgdGh1bWItKikKKwkJYmFzaWNfbWFjaGluZT1hcm0tYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlzdW4yKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KKwkJOzsKKwlzdW4yb3MzKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KKwkJb3M9LXN1bm9zMworCQk7OworCXN1bjJvczQpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgorCQlvcz0tc3Vub3M0CisJCTs7CisJc3VuM29zMykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQlvcz0tc3Vub3MzCisJCTs7CisJc3VuM29zNCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQlvcz0tc3Vub3M0CisJCTs7CisJc3VuNG9zMykKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJb3M9LXN1bm9zMworCQk7OworCXN1bjRvczQpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCW9zPS1zdW5vczQKKwkJOzsKKwlzdW40c29sMikKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJc3VuMyB8IHN1bjMtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQk7OworCXN1bjQpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCTs7CisJc3VuMzg2IHwgc3VuMzg2aSB8IHJvYWRydW5uZXIpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1zdW4KKwkJOzsKKwlzdjEpCisJCWJhc2ljX21hY2hpbmU9c3YxLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCXN5bW1ldHJ5KQorCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAorCQlvcz0tZHluaXgKKwkJOzsKKwl0M2UpCisJCWJhc2ljX21hY2hpbmU9YWxwaGFldjUtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJdDkwKQorCQliYXNpY19tYWNoaW5lPXQ5MC1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwl0aWxlKikKKwkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCisJCW9zPS1saW51eC1nbnUKKwkJOzsKKwl0eDM5KQorCQliYXNpY19tYWNoaW5lPW1pcHN0eDM5LXVua25vd24KKwkJOzsKKwl0eDM5ZWwpCisJCWJhc2ljX21hY2hpbmU9bWlwc3R4MzllbC11bmtub3duCisJCTs7CisJdG9hZDEpCisJCWJhc2ljX21hY2hpbmU9cGRwMTAteGtsCisJCW9zPS10b3BzMjAKKwkJOzsKKwl0b3dlciB8IHRvd2VyLTMyKQorCQliYXNpY19tYWNoaW5lPW02OGstbmNyCisJCTs7CisJdHBmKQorCQliYXNpY19tYWNoaW5lPXMzOTB4LWlibQorCQlvcz0tdHBmCisJCTs7CisJdWRpMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS11ZGkKKwkJOzsKKwl1bHRyYTMpCisJCWJhc2ljX21hY2hpbmU9YTI5ay1ueXUKKwkJb3M9LXN5bTEKKwkJOzsKKwl2ODEwIHwgbmVjdjgxMCkKKwkJYmFzaWNfbWFjaGluZT12ODEwLW5lYworCQlvcz0tbm9uZQorCQk7OworCXZheHYpCisJCWJhc2ljX21hY2hpbmU9dmF4LWRlYworCQlvcz0tc3lzdgorCQk7OworCXZtcykKKwkJYmFzaWNfbWFjaGluZT12YXgtZGVjCisJCW9zPS12bXMKKwkJOzsKKwl2cHAqfHZ4fHZ4LSopCisJCWJhc2ljX21hY2hpbmU9ZjMwMS1mdWppdHN1CisJCTs7CisJdnh3b3Jrczk2MCkKKwkJYmFzaWNfbWFjaGluZT1pOTYwLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXZ4d29ya3M2OCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXZ4d29ya3MyOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwl3NjUqKQorCQliYXNpY19tYWNoaW5lPXc2NS13ZGMKKwkJb3M9LW5vbmUKKwkJOzsKKwl3ODlrLSopCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS13aW5ib25kCisJCW9zPS1wcm9lbGYKKwkJOzsKKwl4Ym94KQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJb3M9LW1pbmd3MzIKKwkJOzsKKwl4cHMgfCB4cHMxMDApCisJCWJhc2ljX21hY2hpbmU9eHBzMTAwLWhvbmV5d2VsbAorCQk7OworCXhzY2FsZS0qIHwgeHNjYWxlZVtibF0tKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eeHNjYWxlL2FybS8nYAorCQk7OworCXltcCkKKwkJYmFzaWNfbWFjaGluZT15bXAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJejhrLSotY29mZikKKwkJYmFzaWNfbWFjaGluZT16OGstdW5rbm93bgorCQlvcz0tc2ltCisJCTs7CisJejgwLSotY29mZikKKwkJYmFzaWNfbWFjaGluZT16ODAtdW5rbm93bgorCQlvcz0tc2ltCisJCTs7CisJbm9uZSkKKwkJYmFzaWNfbWFjaGluZT1ub25lLW5vbmUKKwkJb3M9LW5vbmUKKwkJOzsKKworIyBIZXJlIHdlIGhhbmRsZSB0aGUgZGVmYXVsdCBtYW51ZmFjdHVyZXIgb2YgY2VydGFpbiBDUFUgdHlwZXMuICBJdCBpcyBpbgorIyBzb21lIGNhc2VzIHRoZSBvbmx5IG1hbnVmYWN0dXJlciwgaW4gb3RoZXJzLCBpdCBpcyB0aGUgbW9zdCBwb3B1bGFyLgorCXc4OWspCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS13aW5ib25kCisJCTs7CisJb3A1MG4pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKKwkJOzsKKwlvcDYwYykKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQorCQk7OworCXJvbXApCisJCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KKwkJOzsKKwltbWl4KQorCQliYXNpY19tYWNoaW5lPW1taXgta251dGgKKwkJOzsKKwlyczYwMDApCisJCWJhc2ljX21hY2hpbmU9cnM2MDAwLWlibQorCQk7OworCXZheCkKKwkJYmFzaWNfbWFjaGluZT12YXgtZGVjCisJCTs7CisJcGRwMTApCisJCSMgdGhlcmUgYXJlIG1hbnkgY2xvbmVzLCBzbyBERUMgaXMgbm90IGEgc2FmZSBiZXQKKwkJYmFzaWNfbWFjaGluZT1wZHAxMC11bmtub3duCisJCTs7CisJcGRwMTEpCisJCWJhc2ljX21hY2hpbmU9cGRwMTEtZGVjCisJCTs7CisJd2UzMmspCisJCWJhc2ljX21hY2hpbmU9d2UzMmstYXR0CisJCTs7CisJc2hbMTIzNF0gfCBzaFsyNF1hIHwgc2hbMjRdYWViIHwgc2hbMzRdZWIgfCBzaFsxMjM0XWxlIHwgc2hbMjNdZWxlKQorCQliYXNpY19tYWNoaW5lPXNoLXVua25vd24KKwkJOzsKKwlzcGFyYyB8IHNwYXJjdjggfCBzcGFyY3Y5IHwgc3BhcmN2OWIgfCBzcGFyY3Y5dikKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJOzsKKwljeWRyYSkKKwkJYmFzaWNfbWFjaGluZT1jeWRyYS1jeWRyb21lCisJCTs7CisJb3Jpb24pCisJCWJhc2ljX21hY2hpbmU9b3Jpb24taGlnaGxldmVsCisJCTs7CisJb3Jpb24xMDUpCisJCWJhc2ljX21hY2hpbmU9Y2xpcHBlci1oaWdobGV2ZWwKKwkJOzsKKwltYWMgfCBtcHcgfCBtYWMtbXB3KQorCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKKwkJOzsKKwlwbWFjIHwgcG1hYy1tcHcpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1hcHBsZQorCQk7OworCSotdW5rbm93bikKKwkJIyBNYWtlIHN1cmUgdG8gbWF0Y2ggYW4gYWxyZWFkeS1jYW5vbmljYWxpemVkIG1hY2hpbmUgbmFtZS4KKwkJOzsKKwkqKQorCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKKwkJZXhpdCAxCisJCTs7Citlc2FjCisKKyMgSGVyZSB3ZSBjYW5vbmljYWxpemUgY2VydGFpbiBhbGlhc2VzIGZvciBtYW51ZmFjdHVyZXJzLgorY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCSotZGlnaXRhbCopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvZGlnaXRhbC4qL2RlYy8nYAorCQk7OworCSotY29tbW9kb3JlKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9jb21tb2RvcmUuKi9jYm0vJ2AKKwkJOzsKKwkqKQorCQk7OworZXNhYworCisjIERlY29kZSBtYW51ZmFjdHVyZXItc3BlY2lmaWMgYWxpYXNlcyBmb3IgY2VydGFpbiBvcGVyYXRpbmcgc3lzdGVtcy4KKworaWYgWyB4IiRvcyIgIT0geCIiIF0KK3RoZW4KK2Nhc2UgJG9zIGluCisJIyBGaXJzdCBtYXRjaCBzb21lIHN5c3RlbSB0eXBlIGFsaWFzZXMKKwkjIHRoYXQgbWlnaHQgZ2V0IGNvbmZ1c2VkIHdpdGggdmFsaWQgc3lzdGVtIHR5cGVzLgorCSMgLXNvbGFyaXMqIGlzIGEgYmFzaWMgc3lzdGVtIHR5cGUsIHdpdGggdGhpcyBvbmUgZXhjZXB0aW9uLgorCS1hdXJvcmF1eCkKKwkJb3M9LWF1cm9yYXV4CisJCTs7CisJLXNvbGFyaXMxIHwgLXNvbGFyaXMxLiopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzb2xhcmlzMXxzdW5vczR8J2AKKwkJOzsKKwktc29sYXJpcykKKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJLXN2cjQqKQorCQlvcz0tc3lzdjQKKwkJOzsKKwktdW5peHdhcmUqKQorCQlvcz0tc3lzdjQuMnV3CisJCTs7CisJLWdudS9saW51eCopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xnbnUvbGludXh8bGludXgtZ251fCdgCisJCTs7CisJIyBGaXJzdCBhY2NlcHQgdGhlIGJhc2ljIHN5c3RlbSB0eXBlcy4KKwkjIFRoZSBwb3J0YWJsZSBzeXN0ZW1zIGNvbWVzIGZpcnN0LgorCSMgRWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiBBICosIHRvIG1hdGNoIGEgdmVyc2lvbiBudW1iZXIuCisJIyAtc3lzdiogaXMgbm90IGhlcmUgYmVjYXVzZSBpdCBjb21lcyBsYXRlciwgYWZ0ZXIgc3lzdnI0LgorCS1nbnUqIHwgLWJzZCogfCAtbWFjaCogfCAtbWluaXgqIHwgLWdlbml4KiB8IC11bHRyaXgqIHwgLWlyaXgqIFwKKwkgICAgICB8IC0qdm1zKiB8IC1zY28qIHwgLWVzaXgqIHwgLWlzYyogfCAtYWl4KiB8IC1jbmsqIHwgLXN1bm9zIHwgLXN1bm9zWzM0XSpcCisJICAgICAgfCAtaHB1eCogfCAtdW5vcyogfCAtb3NmKiB8IC1sdW5hKiB8IC1kZ3V4KiB8IC1hdXJvcmF1eCogfCAtc29sYXJpcyogXAorCSAgICAgIHwgLXN5bSogfCAta29wZW5zb2xhcmlzKiB8IC1wbGFuOSogXAorCSAgICAgIHwgLWFtaWdhb3MqIHwgLWFtaWdhZG9zKiB8IC1tc2RvcyogfCAtbmV3c29zKiB8IC11bmljb3MqIHwgLWFvZiogXAorCSAgICAgIHwgLWFvcyogfCAtYXJvcyogXAorCSAgICAgIHwgLW5pbmR5KiB8IC12eHNpbSogfCAtdnh3b3JrcyogfCAtZWJtb24qIHwgLWhtcyogfCAtbXZzKiBcCisJICAgICAgfCAtY2xpeCogfCAtcmlzY29zKiB8IC11bmlwbHVzKiB8IC1pcmlzKiB8IC1ydHUqIHwgLXhlbml4KiBcCisJICAgICAgfCAtaGl1eCogfCAtMzg2YnNkKiB8IC1rbmV0YnNkKiB8IC1taXJic2QqIHwgLW5ldGJzZCogXAorCSAgICAgIHwgLWJpdHJpZyogfCAtb3BlbmJzZCogfCAtc29saWRic2QqIFwKKwkgICAgICB8IC1la2tvYnNkKiB8IC1rZnJlZWJzZCogfCAtZnJlZWJzZCogfCAtcmlzY2l4KiB8IC1seW54b3MqIFwKKwkgICAgICB8IC1ib3N4KiB8IC1uZXh0c3RlcCogfCAtY3h1eCogfCAtYW91dCogfCAtZWxmKiB8IC1vYWJpKiBcCisJICAgICAgfCAtcHR4KiB8IC1jb2ZmKiB8IC1lY29mZiogfCAtd2lubnQqIHwgLWRvbWFpbiogfCAtdnN0YSogXAorCSAgICAgIHwgLXVkaSogfCAtZWFiaSogfCAtbGl0ZXMqIHwgLWllZWUqIHwgLWdvMzIqIHwgLWF1eCogXAorCSAgICAgIHwgLWNob3J1c29zKiB8IC1jaG9ydXNyZGIqIHwgLWNlZ2NjKiBcCisJICAgICAgfCAtY3lnd2luKiB8IC1tc3lzKiB8IC1wZSogfCAtcHNvcyogfCAtbW9zcyogfCAtcHJvZWxmKiB8IC1ydGVtcyogXAorCSAgICAgIHwgLW1pbmd3MzIqIHwgLW1pbmd3NjQqIHwgLWxpbnV4LWdudSogfCAtbGludXgtYW5kcm9pZCogXAorCSAgICAgIHwgLWxpbnV4LW5ld2xpYiogfCAtbGludXgtbXVzbCogfCAtbGludXgtdWNsaWJjKiBcCisJICAgICAgfCAtdXhwdiogfCAtYmVvcyogfCAtbXBlaXgqIHwgLXVkayogXAorCSAgICAgIHwgLWludGVyaXgqIHwgLXV3aW4qIHwgLW1rcyogfCAtcmhhcHNvZHkqIHwgLWRhcndpbiogfCAtb3BlbmVkKiBcCisJICAgICAgfCAtb3BlbnN0ZXAqIHwgLW9za2l0KiB8IC1jb25peCogfCAtcHczMiogfCAtbm9uc3RvcHV4KiBcCisJICAgICAgfCAtc3Rvcm0tY2hhb3MqIHwgLXRvcHMxMCogfCAtdGVuZXgqIHwgLXRvcHMyMCogfCAtaXRzKiBcCisJICAgICAgfCAtb3MyKiB8IC12b3MqIHwgLXBhbG1vcyogfCAtdWNsaW51eCogfCAtbnVjbGV1cyogXAorCSAgICAgIHwgLW1vcnBob3MqIHwgLXN1cGVydXgqIHwgLXJ0bWsqIHwgLXJ0bWstbm92YSogfCAtd2luZGlzcyogXAorCSAgICAgIHwgLXBvd2VybWF4KiB8IC1kbml4KiB8IC1ueDYgfCAtbng3IHwgLXNlaSogfCAtZHJhZ29uZmx5KiBcCisJICAgICAgfCAtc2t5b3MqIHwgLWhhaWt1KiB8IC1yZG9zKiB8IC10b3BwZXJzKiB8IC1kcm9wcyogfCAtZXMqKQorCSMgUmVtZW1iZXIsIGVhY2ggYWx0ZXJuYXRpdmUgTVVTVCBFTkQgSU4gKiwgdG8gbWF0Y2ggYSB2ZXJzaW9uIG51bWJlci4KKwkJOzsKKwktcW54KikKKwkJY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCQkgICAgeDg2LSogfCBpKjg2LSopCisJCQk7OworCQkgICAgKikKKwkJCW9zPS1udG8kb3MKKwkJCTs7CisJCWVzYWMKKwkJOzsKKwktbnRvLXFueCopCisJCTs7CisJLW50byopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xudG98bnRvLXFueHwnYAorCQk7OworCS1zaW0gfCAtZXMxODAwKiB8IC1obXMqIHwgLXhyYXkgfCAtb3M2OGsqIHwgLW5vbmUqIHwgLXY4OHIqIFwKKwkgICAgICB8IC13aW5kb3dzKiB8IC1vc3ggfCAtYWJ1ZyB8IC1uZXR3YXJlKiB8IC1vczkqIHwgLWJlb3MqIHwgLWhhaWt1KiBcCisJICAgICAgfCAtbWFjb3MqIHwgLW1wdyogfCAtbWFnaWMqIHwgLW1taXh3YXJlKiB8IC1tb245NjAqIHwgLWxuZXdzKikKKwkJOzsKKwktbWFjKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfG1hY3xtYWNvc3wnYAorCQk7OworCS1saW51eC1kaWV0bGliYykKKwkJb3M9LWxpbnV4LWRpZXRsaWJjCisJCTs7CisJLWxpbnV4KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGxpbnV4fGxpbnV4LWdudXwnYAorCQk7OworCS1zdW5vczUqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c3Vub3M1fHNvbGFyaXMyfCdgCisJCTs7CisJLXN1bm9zNiopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczZ8c29sYXJpczN8J2AKKwkJOzsKKwktb3BlbmVkKikKKwkJb3M9LW9wZW5lZGl0aW9uCisJCTs7CisJLW9zNDAwKikKKwkJb3M9LW9zNDAwCisJCTs7CisJLXdpbmNlKikKKwkJb3M9LXdpbmNlCisJCTs7CisJLW9zZnJvc2UqKQorCQlvcz0tb3Nmcm9zZQorCQk7OworCS1vc2YqKQorCQlvcz0tb3NmCisJCTs7CisJLXV0ZWsqKQorCQlvcz0tYnNkCisJCTs7CisJLWR5bml4KikKKwkJb3M9LWJzZAorCQk7OworCS1hY2lzKikKKwkJb3M9LWFvcworCQk7OworCS1hdGhlb3MqKQorCQlvcz0tYXRoZW9zCisJCTs7CisJLXN5bGxhYmxlKikKKwkJb3M9LXN5bGxhYmxlCisJCTs7CisJLTM4NmJzZCkKKwkJb3M9LWJzZAorCQk7OworCS1jdGl4KiB8IC11dHMqKQorCQlvcz0tc3lzdgorCQk7OworCS1ub3ZhKikKKwkJb3M9LXJ0bWstbm92YQorCQk7OworCS1uczIgKQorCQlvcz0tbmV4dHN0ZXAyCisJCTs7CisJLW5zayopCisJCW9zPS1uc2sKKwkJOzsKKwkjIFByZXNlcnZlIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBzaW5peDUuCisJLXNpbml4NS4qKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c2luaXh8c3lzdnwnYAorCQk7OworCS1zaW5peCopCisJCW9zPS1zeXN2NAorCQk7OworCS10cGYqKQorCQlvcz0tdHBmCisJCTs7CisJLXRyaXRvbiopCisJCW9zPS1zeXN2MworCQk7OworCS1vc3MqKQorCQlvcz0tc3lzdjMKKwkJOzsKKwktc3ZyNCkKKwkJb3M9LXN5c3Y0CisJCTs7CisJLXN2cjMpCisJCW9zPS1zeXN2MworCQk7OworCS1zeXN2cjQpCisJCW9zPS1zeXN2NAorCQk7OworCSMgVGhpcyBtdXN0IGNvbWUgYWZ0ZXIgLXN5c3ZyNC4KKwktc3lzdiopCisJCTs7CisJLW9zZSopCisJCW9zPS1vc2UKKwkJOzsKKwktZXMxODAwKikKKwkJb3M9LW9zZQorCQk7OworCS14ZW5peCkKKwkJb3M9LXhlbml4CisJCTs7CisJLSptaW50IHwgLW1pbnRbMC05XSogfCAtKk1pTlQgfCAtTWlOVFswLTldKikKKwkJb3M9LW1pbnQKKwkJOzsKKwktYXJvcyopCisJCW9zPS1hcm9zCisJCTs7CisJLXp2bW9lKQorCQlvcz0tenZtb2UKKwkJOzsKKwktZGljb3MqKQorCQlvcz0tZGljb3MKKwkJOzsKKwktbmFjbCopCisJCTs7CisJLW5vbmUpCisJCTs7CisJKikKKwkJIyBHZXQgcmlkIG9mIHRoZSBgLScgYXQgdGhlIGJlZ2lubmluZyBvZiAkb3MuCisJCW9zPWBlY2hvICRvcyB8IHNlZCAncy9bXi1dKi0vLydgCisJCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogc3lzdGVtIFxgJG9zXCcgbm90IHJlY29nbml6ZWQgMT4mMgorCQlleGl0IDEKKwkJOzsKK2VzYWMKK2Vsc2UKKworIyBIZXJlIHdlIGhhbmRsZSB0aGUgZGVmYXVsdCBvcGVyYXRpbmcgc3lzdGVtcyB0aGF0IGNvbWUgd2l0aCB2YXJpb3VzIG1hY2hpbmVzLgorIyBUaGUgdmFsdWUgc2hvdWxkIGJlIHdoYXQgdGhlIHZlbmRvciBjdXJyZW50bHkgc2hpcHMgb3V0IHRoZSBkb29yIHdpdGggdGhlaXIKKyMgbWFjaGluZSBvciBwdXQgYW5vdGhlciB3YXksIHRoZSBtb3N0IHBvcHVsYXIgb3MgcHJvdmlkZWQgd2l0aCB0aGUgbWFjaGluZS4KKworIyBOb3RlIHRoYXQgaWYgeW91J3JlIGdvaW5nIHRvIHRyeSB0byBtYXRjaCAiLU1BTlVGQUNUVVJFUiIgaGVyZSAoc2F5LAorIyAiLXN1biIpLCB0aGVuIHlvdSBoYXZlIHRvIHRlbGwgdGhlIGNhc2Ugc3RhdGVtZW50IHVwIHRvd2FyZHMgdGhlIHRvcAorIyB0aGF0IE1BTlVGQUNUVVJFUiBpc24ndCBhbiBvcGVyYXRpbmcgc3lzdGVtLiAgT3RoZXJ3aXNlLCBjb2RlIGFib3ZlCisjIHdpbGwgc2lnbmFsIGFuIGVycm9yIHNheWluZyB0aGF0IE1BTlVGQUNUVVJFUiBpc24ndCBhbiBvcGVyYXRpbmcKKyMgc3lzdGVtLCBhbmQgd2UnbGwgbmV2ZXIgZ2V0IHRvIHRoaXMgcG9pbnQuCisKK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwlzY29yZS0qKQorCQlvcz0tZWxmCisJCTs7CisJc3B1LSopCisJCW9zPS1lbGYKKwkJOzsKKwkqLWFjb3JuKQorCQlvcz0tcmlzY2l4MS4yCisJCTs7CisJYXJtKi1yZWJlbCkKKwkJb3M9LWxpbnV4CisJCTs7CisJYXJtKi1zZW1pKQorCQlvcz0tYW91dAorCQk7OworCWM0eC0qIHwgdGljNHgtKikKKwkJb3M9LWNvZmYKKwkJOzsKKwljODA1MS0qKQorCQlvcz0tZWxmCisJCTs7CisJaGV4YWdvbi0qKQorCQlvcz0tZWxmCisJCTs7CisJdGljNTR4LSopCisJCW9zPS1jb2ZmCisJCTs7CisJdGljNTV4LSopCisJCW9zPS1jb2ZmCisJCTs7CisJdGljNngtKikKKwkJb3M9LWNvZmYKKwkJOzsKKwkjIFRoaXMgbXVzdCBjb21lIGJlZm9yZSB0aGUgKi1kZWMgZW50cnkuCisJcGRwMTAtKikKKwkJb3M9LXRvcHMyMAorCQk7OworCXBkcDExLSopCisJCW9zPS1ub25lCisJCTs7CisJKi1kZWMgfCB2YXgtKikKKwkJb3M9LXVsdHJpeDQuMgorCQk7OworCW02OCotYXBvbGxvKQorCQlvcz0tZG9tYWluCisJCTs7CisJaTM4Ni1zdW4pCisJCW9zPS1zdW5vczQuMC4yCisJCTs7CisJbTY4MDAwLXN1bikKKwkJb3M9LXN1bm9zMworCQk7OworCW02OCotY2lzY28pCisJCW9zPS1hb3V0CisJCTs7CisJbWVwLSopCisJCW9zPS1lbGYKKwkJOzsKKwltaXBzKi1jaXNjbykKKwkJb3M9LWVsZgorCQk7OworCW1pcHMqLSopCisJCW9zPS1lbGYKKwkJOzsKKwlvcjFrLSopCisJCW9zPS1lbGYKKwkJOzsKKwlvcjMyLSopCisJCW9zPS1jb2ZmCisJCTs7CisJKi10dGkpCSMgbXVzdCBiZSBiZWZvcmUgc3BhcmMgZW50cnkgb3Igd2UgZ2V0IHRoZSB3cm9uZyBvcy4KKwkJb3M9LXN5c3YzCisJCTs7CisJc3BhcmMtKiB8ICotc3VuKQorCQlvcz0tc3Vub3M0LjEuMQorCQk7OworCSotYmUpCisJCW9zPS1iZW9zCisJCTs7CisJKi1oYWlrdSkKKwkJb3M9LWhhaWt1CisJCTs7CisJKi1pYm0pCisJCW9zPS1haXgKKwkJOzsKKwkqLWtudXRoKQorCQlvcz0tbW1peHdhcmUKKwkJOzsKKwkqLXdlYykKKwkJb3M9LXByb2VsZgorCQk7OworCSotd2luYm9uZCkKKwkJb3M9LXByb2VsZgorCQk7OworCSotb2tpKQorCQlvcz0tcHJvZWxmCisJCTs7CisJKi1ocCkKKwkJb3M9LWhwdXgKKwkJOzsKKwkqLWhpdGFjaGkpCisJCW9zPS1oaXV4CisJCTs7CisJaTg2MC0qIHwgKi1hdHQgfCAqLW5jciB8ICotYWx0b3MgfCAqLW1vdG9yb2xhIHwgKi1jb252ZXJnZW50KQorCQlvcz0tc3lzdgorCQk7OworCSotY2JtKQorCQlvcz0tYW1pZ2FvcworCQk7OworCSotZGcpCisJCW9zPS1kZ3V4CisJCTs7CisJKi1kb2xwaGluKQorCQlvcz0tc3lzdjMKKwkJOzsKKwltNjhrLWNjdXIpCisJCW9zPS1ydHUKKwkJOzsKKwltODhrLW9tcm9uKikKKwkJb3M9LWx1bmEKKwkJOzsKKwkqLW5leHQgKQorCQlvcz0tbmV4dHN0ZXAKKwkJOzsKKwkqLXNlcXVlbnQpCisJCW9zPS1wdHgKKwkJOzsKKwkqLWNyZHMpCisJCW9zPS11bm9zCisJCTs7CisJKi1ucykKKwkJb3M9LWdlbml4CisJCTs7CisJaTM3MC0qKQorCQlvcz0tbXZzCisJCTs7CisJKi1uZXh0KQorCQlvcz0tbmV4dHN0ZXAzCisJCTs7CisJKi1nb3VsZCkKKwkJb3M9LXN5c3YKKwkJOzsKKwkqLWhpZ2hsZXZlbCkKKwkJb3M9LWJzZAorCQk7OworCSotZW5jb3JlKQorCQlvcz0tYnNkCisJCTs7CisJKi1zZ2kpCisJCW9zPS1pcml4CisJCTs7CisJKi1zaWVtZW5zKQorCQlvcz0tc3lzdjQKKwkJOzsKKwkqLW1hc3Njb21wKQorCQlvcz0tcnR1CisJCTs7CisJZjMwWzAxXS1mdWppdHN1IHwgZjcwMC1mdWppdHN1KQorCQlvcz0tdXhwdgorCQk7OworCSotcm9tNjhrKQorCQlvcz0tY29mZgorCQk7OworCSotKmJ1ZykKKwkJb3M9LWNvZmYKKwkJOzsKKwkqLWFwcGxlKQorCQlvcz0tbWFjb3MKKwkJOzsKKwkqLWF0YXJpKikKKwkJb3M9LW1pbnQKKwkJOzsKKwkqKQorCQlvcz0tbm9uZQorCQk7OworZXNhYworZmkKKworIyBIZXJlIHdlIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBrbm93IHRoZSBvcywgYW5kIHRoZSBDUFUgdHlwZSwgYnV0IG5vdCB0aGUKKyMgbWFudWZhY3R1cmVyLiAgV2UgcGljayB0aGUgbG9naWNhbCBtYW51ZmFjdHVyZXIuCit2ZW5kb3I9dW5rbm93bgorY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCSotdW5rbm93bikKKwkJY2FzZSAkb3MgaW4KKwkJCS1yaXNjaXgqKQorCQkJCXZlbmRvcj1hY29ybgorCQkJCTs7CisJCQktc3Vub3MqKQorCQkJCXZlbmRvcj1zdW4KKwkJCQk7OworCQkJLWNuayp8LWFpeCopCisJCQkJdmVuZG9yPWlibQorCQkJCTs7CisJCQktYmVvcyopCisJCQkJdmVuZG9yPWJlCisJCQkJOzsKKwkJCS1ocHV4KikKKwkJCQl2ZW5kb3I9aHAKKwkJCQk7OworCQkJLW1wZWl4KikKKwkJCQl2ZW5kb3I9aHAKKwkJCQk7OworCQkJLWhpdXgqKQorCQkJCXZlbmRvcj1oaXRhY2hpCisJCQkJOzsKKwkJCS11bm9zKikKKwkJCQl2ZW5kb3I9Y3JkcworCQkJCTs7CisJCQktZGd1eCopCisJCQkJdmVuZG9yPWRnCisJCQkJOzsKKwkJCS1sdW5hKikKKwkJCQl2ZW5kb3I9b21yb24KKwkJCQk7OworCQkJLWdlbml4KikKKwkJCQl2ZW5kb3I9bnMKKwkJCQk7OworCQkJLW12cyogfCAtb3BlbmVkKikKKwkJCQl2ZW5kb3I9aWJtCisJCQkJOzsKKwkJCS1vczQwMCopCisJCQkJdmVuZG9yPWlibQorCQkJCTs7CisJCQktcHR4KikKKwkJCQl2ZW5kb3I9c2VxdWVudAorCQkJCTs7CisJCQktdHBmKikKKwkJCQl2ZW5kb3I9aWJtCisJCQkJOzsKKwkJCS12eHNpbSogfCAtdnh3b3JrcyogfCAtd2luZGlzcyopCisJCQkJdmVuZG9yPXdycworCQkJCTs7CisJCQktYXV4KikKKwkJCQl2ZW5kb3I9YXBwbGUKKwkJCQk7OworCQkJLWhtcyopCisJCQkJdmVuZG9yPWhpdGFjaGkKKwkJCQk7OworCQkJLW1wdyogfCAtbWFjb3MqKQorCQkJCXZlbmRvcj1hcHBsZQorCQkJCTs7CisJCQktKm1pbnQgfCAtbWludFswLTldKiB8IC0qTWlOVCB8IC1NaU5UWzAtOV0qKQorCQkJCXZlbmRvcj1hdGFyaQorCQkJCTs7CisJCQktdm9zKikKKwkJCQl2ZW5kb3I9c3RyYXR1cworCQkJCTs7CisJCWVzYWMKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAicy91bmtub3duLyR2ZW5kb3IvImAKKwkJOzsKK2VzYWMKKworZWNobyAkYmFzaWNfbWFjaGluZSRvcworZXhpdAorCisjIExvY2FsIHZhcmlhYmxlczoKKyMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQorIyB0aW1lLXN0YW1wLXN0YXJ0OiAidGltZXN0YW1wPSciCisjIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZCIKKyMgdGltZS1zdGFtcC1lbmQ6ICInIgorIyBFbmQ6CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL2N2YzQtMS40LXBhdGNoL2NvbmZpZy9ib29zdC12Mi5tNCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvY3ZjNC0xLjQtcGF0Y2gvY29uZmlnL2Jvb3N0LXYyLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZDA2M2YKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL2N2YzQtMS40LXBhdGNoL2NvbmZpZy9ib29zdC12Mi5tNApAQCAtMCwwICsxLDE1NjAgQEAKKyMgYm9vc3QubTQ6IExvY2F0ZSBCb29zdCBoZWFkZXJzIGFuZCBsaWJyYXJpZXMgZm9yIGF1dG9jb25mLWJhc2VkIHByb2plY3RzLgorIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMSwgMjAxNCAgQmVub2l0IFNpZ291cmUgPHRzdW5hQGxyZGUuZXBpdGEuZnI+CisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIEFkZGl0aW9uYWwgcGVybWlzc2lvbiB1bmRlciBzZWN0aW9uIDcgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworIyBMaWNlbnNlLCB2ZXJzaW9uIDMgKCJHUEx2MyIpOgorIworIyBJZiB5b3UgY29udmV5IHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgd29yayB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGRvIHNvIHVuZGVyCisjIHRlcm1zIG9mIHlvdXIgY2hvaWNlLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworbTRfZGVmaW5lKFtfQk9PU1RfU0VSSUFMXSwgW200X3RyYW5zbGl0KFsKKyMgc2VyaWFsIDI1CitdLCBbIworXSwgW10pXSkKKworIyBPcmlnaW5hbCBzb3VyY2VzIGNhbiBiZSBmb3VuZCBhdCBodHRwOi8vZ2l0aHViLmNvbS90c3VuYS9ib29zdC5tNAorIyBZb3UgY2FuIGZldGNoIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgc2NyaXB0IGJ5IGRvaW5nOgorIyAgIHdnZXQgaHR0cDovL2dpdGh1Yi5jb20vdHN1bmEvYm9vc3QubTQvcmF3L21hc3Rlci9idWlsZC1hdXgvYm9vc3QubTQKKworIyAtLS0tLS0gIworIyBSRUFETUUgIworIyAtLS0tLS0gIworCisjIFRoaXMgZmlsZSBwcm92aWRlcyBzZXZlcmFsIG1hY3JvcyB0byB1c2UgdGhlIHZhcmlvdXMgQm9vc3QgbGlicmFyaWVzLgorIyBUaGUgZmlyc3QgbWFjcm8gaXMgQk9PU1RfUkVRVUlSRS4gIEl0IHdpbGwgc2ltcGx5IGNoZWNrIGlmIGl0J3MgcG9zc2libGUgdG8KKyMgZmluZCB0aGUgQm9vc3QgaGVhZGVycyBvZiBhIGdpdmVuIChvcHRpb25hbCkgbWluaW11bSB2ZXJzaW9uIGFuZCBpdCB3aWxsCisjIGRlZmluZSBCT09TVF9DUFBGTEFHUyBhY2NvcmRpbmdseS4gIEl0IHdpbGwgYWRkIGFuIG9wdGlvbiAtLXdpdGgtYm9vc3QgdG8KKyMgeW91ciBjb25maWd1cmUgc28gdGhhdCB1c2VycyBjYW4gc3BlY2lmeSBub24gc3RhbmRhcmQgbG9jYXRpb25zLgorIyBJZiB0aGUgdXNlcidzIGVudmlyb25tZW50IGNvbnRhaW5zIEJPT1NUX1JPT1QgYW5kIC0td2l0aC1ib29zdCB3YXMgbm90CisjIHNwZWNpZmllZCwgLS13aXRoLWJvb3N0PSRCT09TVF9ST09UIGlzIGltcGxpY2l0bHkgdXNlZC4KKyMgRm9yIG1vcmUgUkVBRE1FIGFuZCBkb2N1bWVudGF0aW9uLCBnbyB0byBodHRwOi8vZ2l0aHViLmNvbS90c3VuYS9ib29zdC5tNAorIyBOb3RlOiBUSEVTRSBNQUNST1MgQVNTVU1FIFRIQVQgWU9VIFVTRSBMSUJUT09MLiAgSWYgeW91IGRvbid0LCBkb24ndCB3b3JyeSwKKyMgc2ltcGx5IHJlYWQgdGhlIFJFQURNRSwgaXQgd2lsbCBzaG93IHlvdSB3aGF0IHRvIGRvIHN0ZXAgYnkgc3RlcC4KKworbTRfcGF0dGVybl9mb3JiaWQoW15fPyhCT09TVHxCb29zdClfXSkKKworCisjIF9CT09TVF9TRURfQ1BQKFNFRC1QUk9HUkFNLCBQUk9HUkFNLAorIyAgICAgICAgICAgICAgICBbQUNUSU9OLUlGLUZPVU5EXSwgW0FDVElPTi1JRi1OT1QtRk9VTkRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTYW1lIGFzIEFDX0VHUkVQX0NQUCwgYnV0IGxlYXZlIHRoZSByZXN1bHQgaW4gY29uZnRlc3QuaS4KKyMKKyMgU0VELVBST0dSQU0gaXMgKm5vdCogb3ZlcnF1b3RlZCwgYXMgaW4gQUNfRUdSRVBfQ1BQLiAgSXQgaXMgZXhwYW5kZWQKKyMgaW4gZG91YmxlLXF1b3Rlcywgc28gZXNjYXBlIHlvdXIgZG91YmxlIHF1b3Rlcy4KKyMKKyMgSXQgY291bGQgYmUgdXNlZnVsIHRvIHR1cm4gdGhpcyBpbnRvIGEgbWFjcm8gd2hpY2ggZXh0cmFjdHMgdGhlCisjIHZhbHVlIG9mIGFueSBtYWNyby4KK200X2RlZmluZShbX0JPT1NUX1NFRF9DUFBdLAorW0FDX0xBTkdfUFVTSChbQysrXSlkbmwKK0FDX0xBTkdfUFJFUFJPQ19SRVFVSVJFKClkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfU0VEXSlkbmwKK0FDX0xBTkdfQ09ORlRFU1QoW0FDX0xBTkdfU09VUkNFKFtbJDJdXSldKQorQVNfSUYoW2RubCBldmFsIGlzIG5lY2Vzc2FyeSB0byBleHBhbmQgYWNfY3BwLgorZG5sIFVsdHJpeCBhbmQgUHlyYW1pZCBzaCByZWZ1c2UgdG8gcmVkaXJlY3Qgb3V0cHV0IG9mIGV2YWwsIHNvIHVzZSBzdWJzaGVsbC4KK2RubCBCZXdhcmUgb2YgV2luZG93cyBlbmQtb2YtbGluZXMsIGZvciBpbnN0YW5jZSBpZiB3ZSBhcmUgcnVubmluZworZG5sIHNvbWUgV2luZG93cyBwcm9ncmFtcyB1bmRlciBXaW5lLiAgSW4gdGhhdCBjYXNlLCBib29zdC92ZXJzaW9uLmhwcAorZG5sIGlzIGNlcnRhaW5seSB1c2luZyAiXHJcbiIsIGJ1dCB0aGUgcmVndWxhciBVbml4IHNoZWxsIHdpbGwgb25seQorZG5sIHN0cmlwIGBcbicgd2l0aCBiYWNrcXVvdGVzLCBub3QgdGhlIGBccicuICBUaGlzIHJlc3VsdHMgaW4KK2RubCBib29zdF9jdl9saWJfdmVyc2lvbj0nMV8zN1xyJyBmb3IgaW5zdGFuY2UsIHdoaWNoIGJyZWFrcworZG5sIGV2ZXJ5dGhpbmcgZWxzZS4KK2RubCBDYW5ub3QgdXNlICdkbmwnIGFmdGVyIFskNF0gYmVjYXVzZSBhIHRyYWlsaW5nIGRubCBtYXkgYnJlYWsgQUNfQ0FDSEVfQ0hFQ0sKK2RubAorZG5sIEJld2FyZSB0aGF0IEdDQyA1LCB3aGVuIGV4cGFuZGluZyBtYWNyb3MsIG1heSBlbWJlZCAjIGxpbmUgZGlyZWN0aXZlcworZG5sIGEgd2l0aGluIHNpbmdsZSBsaW5lOgorZG5sCitkbmwgIyAxICJjb25mdGVzdC5jYyIKK2RubCAjIDEgIjxidWlsdC1pbj4iCitkbmwgIyAxICI8Y29tbWFuZC1saW5lPiIKK2RubCAjIDEgImNvbmZ0ZXN0LmNjIgorZG5sICMgMSAiL29wdC9sb2NhbC9pbmNsdWRlL2Jvb3N0L3ZlcnNpb24uaHBwIiAxIDMKK2RubCAjIDIgImNvbmZ0ZXN0LmNjIiAyCitkbmwgYm9vc3QtbGliLXZlcnNpb24gPQorZG5sICMgMiAiY29uZnRlc3QuY2MiIDMKK2RubCAgICAgICAgICAgICAgICAgICAgIjFfNTYiCitkbmwKK2RubCBTbyBnZXQgcmlkIG9mIHRoZSAjIGxpbmVzLCBhbmQgZ2x1ZSB0aGUgcmVtYWluaW5nIG9uZXMgdG9nZXRoZXIuCisoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mQVNfTUVTU0FHRV9MT0dfRkQgfAorICBncmVwIC12ICcjJyB8CisgIHRyIC1kICdccicgfAorICB0ciAtcyAnXG4nICcgJyB8CisgICRTRUQgLW4gLWUgIiQxIiA+Y29uZnRlc3QuaSAyPiYxXSwKKyAgWyQzXSwKKyAgWyQ0XSkKK3JtIC1yZiBjb25mdGVzdCoKK0FDX0xBTkdfUE9QKFtDKytdKWRubAorXSkjIF9CT09TVF9TRURfQ1BQCisKKworCisjIEJPT1NUX1JFUVVJUkUoW1ZFUlNJT05dLCBbQUNUSU9OLUlGLU5PVC1GT1VORF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LiAgSWYgdmVyc2lvbiBpcyBnaXZlbiwgaXQgbXVzdCBlaXRoZXIgYmUgYSBsaXRlcmFsIG9mIHRoZSBmb3JtCisjICJYLlkuWiIgd2hlcmUgWCwgWSBhbmQgWiBhcmUgaW50ZWdlcnMgKHRoZSAiLloiIHBhcnQgYmVpbmcgb3B0aW9uYWwpIG9yIGEKKyMgdmFyaWFibGUgIiR2YXIiLgorIyBEZWZpbmVzIHRoZSB2YWx1ZSBCT09TVF9DUFBGTEFHUy4gIFRoaXMgbWFjcm8gb25seSBjaGVja3MgZm9yIGhlYWRlcnMgd2l0aAorIyB0aGUgcmVxdWlyZWQgdmVyc2lvbiwgaXQgZG9lcyBub3QgY2hlY2sgZm9yIGFueSBvZiB0aGUgQm9vc3QgbGlicmFyaWVzLgorIyBPbiAjIHN1Y2Nlc3MsIGRlZmluZXMgSEFWRV9CT09TVC4gIE9uIGZhaWx1cmUsIGNhbGxzIHRoZSBvcHRpb25hbAorIyBBQ1RJT04tSUYtTk9ULUZPVU5EIGFjdGlvbiBpZiBvbmUgd2FzIHN1cHBsaWVkLgorIyBPdGhlcndpc2UgYWJvcnRzIHdpdGggYW4gZXJyb3IgbWVzc2FnZS4KK0FDX0RFRlVOX09OQ0UoW0JPT1NUX1JFUVVJUkVdLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfQ1hYXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfR1JFUF0pZG5sCitlY2hvICIkYXNfbWU6IHRoaXMgaXMgYm9vc3QubTRbXV9CT09TVF9TRVJJQUwiID4mQVNfTUVTU0FHRV9MT0dfRkQKK2Jvb3N0X3NhdmVfSUZTPSRJRlMKK2Jvb3N0X3ZlcnNpb25fcmVxPSQxCitJRlM9Lgorc2V0IHggJGJvb3N0X3ZlcnNpb25fcmVxIDAgMCAwCitJRlM9JGJvb3N0X3NhdmVfSUZTCitzaGlmdAorYm9vc3RfdmVyc2lvbl9yZXE9YGV4cHIgIiRbMV0iICcqJyAxMDAwMDAgKyAiJFsyXSIgJyonIDEwMCArICIkWzNdImAKK2Jvb3N0X3ZlcnNpb25fcmVxX3N0cmluZz0kWzFdLiRbMl0uJFszXQorQUNfQVJHX1dJVEgoW2Jvb3N0XSwKKyAgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLWJvb3N0PURJUl0sCisgICAgICAgICAgICAgICAgICAgW3ByZWZpeCBvZiBCb29zdCAkMSBAPDpAZ3Vlc3NAOj5AXSldKWRubAorQUNfQVJHX1ZBUihbQk9PU1RfUk9PVF0sW0xvY2F0aW9uIG9mIEJvb3N0IGluc3RhbGxhdGlvbl0pZG5sCisjIElmIEJPT1NUX1JPT1QgaXMgc2V0IGFuZCB0aGUgdXNlciBoYXMgbm90IHByb3ZpZGVkIGEgdmFsdWUgdG8KKyMgLS13aXRoLWJvb3N0LCB0aGVuIHRyZWF0IEJPT1NUX1JPT1QgYXMgaWYgaXQgdGhlIHVzZXIgc3VwcGxpZWQgaXQuCitpZiB0ZXN0IHgiJEJPT1NUX1JPT1QiICE9IHg7IHRoZW4KKyAgaWYgdGVzdCB4IiR3aXRoX2Jvb3N0IiA9IHg7IHRoZW4KKyAgICBBQ19NU0dfTk9USUNFKFtEZXRlY3RlZCBCT09TVF9ST09UOyBjb250aW51aW5nIHdpdGggLS13aXRoLWJvb3N0PSRCT09TVF9ST09UXSkKKyAgICB3aXRoX2Jvb3N0PSRCT09TVF9ST09UCisgIGVsc2UKKyAgICBBQ19NU0dfTk9USUNFKFtEZXRlY3RlZCBCT09TVF9ST09UPSRCT09TVF9ST09ULCBidXQgb3ZlcnJpZGRlbiBieSAtLXdpdGgtYm9vc3Q9JHdpdGhfYm9vc3RdKQorICBmaQorZmkKK0FDX1NVQlNUKFtESVNUQ0hFQ0tfQ09ORklHVVJFX0ZMQUdTXSwKKyAgICAgICAgIFsiJERJU1RDSEVDS19DT05GSUdVUkVfRkxBR1MgJy0td2l0aC1ib29zdD0kd2l0aF9ib29zdCciXSlkbmwKK2Jvb3N0X3NhdmVfQ1BQRkxBR1M9JENQUEZMQUdTCisgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgQm9vc3QgaGVhZGVycyB2ZXJzaW9uID49ICRib29zdF92ZXJzaW9uX3JlcV9zdHJpbmddLAorICAgIFtib29zdF9jdl9pbmNfcGF0aF0sCisgICAgW2Jvb3N0X2N2X2luY19wYXRoPW5vCitBQ19MQU5HX1BVU0goW0MrK10pZG5sCittNF9wYXR0ZXJuX2FsbG93KFteQk9PU1RfVkVSU0lPTiRdKWRubAorICAgIEFDX0xBTkdfQ09ORlRFU1QoW0FDX0xBTkdfUFJPR1JBTShbWyNpbmNsdWRlIDxib29zdC92ZXJzaW9uLmhwcD4KKyNpZiAhZGVmaW5lZCBCT09TVF9WRVJTSU9OCisjIGVycm9yIEJPT1NUX1ZFUlNJT04gaXMgbm90IGRlZmluZWQKKyNlbGlmIEJPT1NUX1ZFUlNJT04gPCAkYm9vc3RfdmVyc2lvbl9yZXEKKyMgZXJyb3IgQm9vc3QgaGVhZGVycyB2ZXJzaW9uIDwgJGJvb3N0X3ZlcnNpb25fcmVxCisjZW5kaWYKK11dKV0pCisgICAgIyBJZiB0aGUgdXNlciBwcm92aWRlZCBhIHZhbHVlIHRvIC0td2l0aC1ib29zdCwgdXNlIGl0IGFuZCBvbmx5IGl0LgorICAgIGNhc2UgJHdpdGhfYm9vc3QgaW4gIygKKyAgICAgICcnfHllcykgc2V0IHggJycgL29wdC9sb2NhbC9pbmNsdWRlIC91c3IvbG9jYWwvaW5jbHVkZSAvb3B0L2luY2x1ZGUgXAorICAgICAgICAgICAgICAgICAvdXNyL2luY2x1ZGUgQzovQm9vc3QvaW5jbHVkZTs7ICMoCisgICAgICAqKSAgICAgIHNldCB4ICIkd2l0aF9ib29zdC9pbmNsdWRlIiAiJHdpdGhfYm9vc3QiOzsKKyAgICBlc2FjCisgICAgc2hpZnQKKyAgICBmb3IgYm9vc3RfZGlyCisgICAgZG8KKyAgICAjIFdpdGhvdXQgLS1sYXlvdXQ9c3lzdGVtLCBCb29zdCAob3IgYXQgbGVhc3Qgc29tZSB2ZXJzaW9ucykgaW5zdGFsbHMKKyAgICAjIGl0c2VsZiBpbiA8cHJlZml4Pi9pbmNsdWRlL2Jvb3N0LTx2ZXJzaW9uPi4gIFRoaXMgaW5uZXIgbG9vcCBoZWxwcyB0bworICAgICMgZmluZCBoZWFkZXJzIGluIHN1Y2ggZGlyZWN0b3JpZXMuCisgICAgIworICAgICMgQW55ICR7Ym9vc3RfZGlyfS9ib29zdC14X3h4IGRpcmVjdG9yaWVzIGFyZSBzZWFyY2hlZCBpbiByZXZlcnNlIHZlcnNpb24KKyAgICAjIG9yZGVyIGZvbGxvd2VkIGJ5ICR7Ym9vc3RfZGlyfS4gIFRoZSBmaW5hbCAnLicgaXMgYSBzZW50aW5lbCBmb3IKKyAgICAjIHNlYXJjaGluZyAkYm9vc3RfZGlyIiBpdHNlbGYuICBFbnRyaWVzIGFyZSB3aGl0ZXNwYWNlIHNlcGFyYXRlZC4KKyAgICAjCisgICAgIyBJIGRpZG4ndCBpbmRlbnQgdGhpcyBsb29wIG9uIHB1cnBvc2UgKHRvIGF2b2lkIG92ZXItaW5kZW50ZWQgY29kZSkKKyAgICBib29zdF9sYXlvdXRfc3lzdGVtX3NlYXJjaF9saXN0PWBjZCAiJGJvb3N0X2RpciIgMj4vZGV2L251bGwgXAorICAgICAgICAmJiBscyAtMSB8ICIke0dSRVB9IiAnXmJvb3N0LScgfCBzb3J0IC1ybiAtdC0gLWsyIFwKKyAgICAgICAgJiYgZWNobyAuYAorICAgIGZvciBib29zdF9pbmMgaW4gJGJvb3N0X2xheW91dF9zeXN0ZW1fc2VhcmNoX2xpc3QKKyAgICBkbworICAgICAgaWYgdGVzdCB4IiRib29zdF9pbmMiICE9IHguOyB0aGVuCisgICAgICAgIGJvb3N0X2luYz0iJGJvb3N0X2Rpci8kYm9vc3RfaW5jIgorICAgICAgZWxzZQorICAgICAgICBib29zdF9pbmM9IiRib29zdF9kaXIiICMgVXNlcyBzZW50aW5lbCBpbiBib29zdF9sYXlvdXRfc3lzdGVtX3NlYXJjaF9saXN0CisgICAgICBmaQorICAgICAgaWYgdGVzdCB4IiRib29zdF9pbmMiICE9IHg7IHRoZW4KKyAgICAgICAgIyBXZSBhcmUgZ29pbmcgdG8gY2hlY2sgd2hldGhlciB0aGUgdmVyc2lvbiBvZiBCb29zdCBpbnN0YWxsZWQKKyAgICAgICAgIyBpbiAkYm9vc3RfaW5jIGlzIHVzYWJsZSBieSBydW5uaW5nIGEgY29tcGlsYXRpb24gdGhhdAorICAgICAgICAjICNpbmNsdWRlcyBpdC4gIEJ1dCBpZiB3ZSBwYXNzIGEgLUkvc29tZS9wYXRoIGluIHdoaWNoIEJvb3N0CisgICAgICAgICMgaXMgbm90IGluc3RhbGxlZCwgdGhlIGNvbXBpbGVyIHdpbGwganVzdCBza2lwIHRoaXMgLUkgYW5kCisgICAgICAgICMgdXNlIG90aGVyIGxvY2F0aW9ucyAoZWl0aGVyIGZyb20gQ1BQRkxBR1MsIG9yIGZyb20gaXRzIGxpc3QKKyAgICAgICAgIyBvZiBzeXN0ZW0gaW5jbHVkZSBkaXJlY3RvcmllcykuICBBcyBhIHJlc3VsdCB3ZSB3b3VsZCB1c2UKKyAgICAgICAgIyBoZWFkZXIgaW5zdGFsbGVkIG9uIHRoZSBtYWNoaW5lIGluc3RlYWQgb2YgdGhlIC9zb21lL3BhdGgKKyAgICAgICAgIyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuICBTbyBpbiB0aGF0IHByZWNpc2UgY2FzZSAodHJ5aW5nCisgICAgICAgICMgJGJvb3N0X2luYyksIG1ha2Ugc3VyZSB0aGUgdmVyc2lvbi5ocHAgZXhpc3RzLgorICAgICAgICAjCisgICAgICAgICMgVXNlIHRlc3QgLWUgYXMgdGhlcmUgY2FuIGJlIHN5bWxpbmtzLgorICAgICAgICB0ZXN0IC1lICIkYm9vc3RfaW5jL2Jvb3N0L3ZlcnNpb24uaHBwIiB8fCBjb250aW51ZQorICAgICAgICBDUFBGTEFHUz0iJENQUEZMQUdTIC1JJGJvb3N0X2luYyIKKyAgICAgIGZpCisgICAgICBBQ19DT01QSUxFX0lGRUxTRShbXSwgW2Jvb3N0X2N2X2luY19wYXRoPXllc10sIFtib29zdF9jdl92ZXJzaW9uPW5vXSkKKyAgICAgIGlmIHRlc3QgeCIkYm9vc3RfY3ZfaW5jX3BhdGgiID0geHllczsgdGhlbgorICAgICAgICBpZiB0ZXN0IHgiJGJvb3N0X2luYyIgIT0geDsgdGhlbgorICAgICAgICAgIGJvb3N0X2N2X2luY19wYXRoPSRib29zdF9pbmMKKyAgICAgICAgZmkKKyAgICAgICAgYnJlYWsgMgorICAgICAgZmkKKyAgICBkb25lCisgICAgZG9uZQorQUNfTEFOR19QT1AoW0MrK10pZG5sCisgICAgXSkKKyAgICBjYXNlICRib29zdF9jdl9pbmNfcGF0aCBpbiAjKAorICAgICAgbm8pCisgICAgICAgIGJvb3N0X2Vycm1zZz0iY2Fubm90IGZpbmQgQm9vc3QgaGVhZGVycyB2ZXJzaW9uID49ICRib29zdF92ZXJzaW9uX3JlcV9zdHJpbmciCisgICAgICAgIG00X2lmKFskMl0sIFtdLCAgW0FDX01TR19FUlJPUihbJGJvb3N0X2Vycm1zZ10pXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtBQ19NU0dfTk9USUNFKFskYm9vc3RfZXJybXNnXSldKQorICAgICAgICAkMgorICAgICAgICA7OyMoCisgICAgICB5ZXMpCisgICAgICAgIEJPT1NUX0NQUEZMQUdTPQorICAgICAgICA7OyMoCisgICAgICAqKQorICAgICAgICBBQ19TVUJTVChbQk9PU1RfQ1BQRkxBR1NdLCBbIi1JJGJvb3N0X2N2X2luY19wYXRoIl0pZG5sCisgICAgICAgIDs7CisgICAgZXNhYworICBpZiB0ZXN0IHgiJGJvb3N0X2N2X2luY19wYXRoIiAhPSB4bm87IHRoZW4KKyAgQUNfREVGSU5FKFtIQVZFX0JPT1NUXSwgWzFdLAorICAgICAgICAgICAgW0RlZmluZWQgaWYgdGhlIHJlcXVlc3RlZCBtaW5pbXVtIEJPT1NUIHZlcnNpb24gaXMgc2F0aXNmaWVkXSkKKyAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBCb29zdCdzIGhlYWRlciB2ZXJzaW9uXSwKKyAgICBbYm9vc3RfY3ZfbGliX3ZlcnNpb25dLAorICAgIFttNF9wYXR0ZXJuX2FsbG93KFteQk9PU1RfTElCX1ZFUlNJT04kXSlkbmwKKyAgICAgX0JPT1NUX1NFRF9DUFAoW1svXmJvb3N0LWxpYi12ZXJzaW9uID0gL3tzLy8vO3MvW1wiIF0vL2c7cDtxO31dXSwKKyAgICAgICAgICAgICAgICAgICAgWyNpbmNsdWRlIDxib29zdC92ZXJzaW9uLmhwcD4KK2Jvb3N0LWxpYi12ZXJzaW9uID0gQk9PU1RfTElCX1ZFUlNJT05dLAorICAgIFtib29zdF9jdl9saWJfdmVyc2lvbj1gY2F0IGNvbmZ0ZXN0LmlgXSldKQorICAgICMgZS5nLiAiMTM0IiBmb3IgMV8zNF8xIG9yICIxMzUiIGZvciAxXzM1CisgICAgYm9vc3RfbWFqb3JfdmVyc2lvbj1gZWNobyAiJGJvb3N0X2N2X2xpYl92ZXJzaW9uIiB8IHNlZCAncy9fLy87cy9fLiovLydgCisgICAgY2FzZSAkYm9vc3RfbWFqb3JfdmVyc2lvbiBpbiAjKAorICAgICAgJycgfCAqW1shMC05XV0qKQorICAgICAgICBBQ19NU0dfRVJST1IoW2ludmFsaWQgdmFsdWU6IGJvb3N0X21ham9yX3ZlcnNpb249JyRib29zdF9tYWpvcl92ZXJzaW9uJ10pCisgICAgICAgIDs7CisgICAgZXNhYworZmkKK0NQUEZMQUdTPSRib29zdF9zYXZlX0NQUEZMQUdTCitdKSMgQk9PU1RfUkVRVUlSRQorCisKKyMgQk9PU1RfU1RBVElDKCkKKyMgLS0tLS0tLS0tLS0tLS0KKyMgQWRkIHRoZSAiLS1lbmFibGUtc3RhdGljLWJvb3N0IiBjb25maWd1cmUgYXJndW1lbnQuIElmIHRoaXMgYXJndW1lbnQgaXMgZ2l2ZW4KKyMgb24gdGhlIGNvbW1hbmQgbGluZSwgc3RhdGljIHZlcnNpb25zIG9mIHRoZSBsaWJyYXJpZXMgd2lsbCBiZSBsb29rZWQgdXAuCitBQ19ERUZVTihbQk9PU1RfU1RBVElDXSwKKyAgW0FDX0FSR19FTkFCTEUoW3N0YXRpYy1ib29zdF0sCisgICAgIFtBU19IRUxQX1NUUklORyhbLS1lbmFibGUtc3RhdGljLWJvb3N0XSwKKyAgICAgICAgICAgICAgIFtQcmVmZXIgdGhlIHN0YXRpYyBib29zdCBsaWJyYXJpZXMgb3ZlciB0aGUgc2hhcmVkIG9uZXMgW25vXV0pXSwKKyAgICAgW2VuYWJsZV9zdGF0aWNfYm9vc3Q9eWVzXSwKKyAgICAgW2VuYWJsZV9zdGF0aWNfYm9vc3Q9bm9dKV0pIyBCT09TVF9TVEFUSUMKKworCisjIEJPT1NUX0ZJTkRfSEVBREVSKFtIRUFERVItTkFNRV0sIFtBQ1RJT04tSUYtTk9ULUZPVU5EXSwgW0FDVElPTi1JRi1GT1VORF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFdyYXBwZXIgYXJvdW5kIEFDX0NIRUNLX0hFQURFUiBmb3IgQm9vc3QgaGVhZGVycy4gIFVzZWZ1bCB0byBjaGVjayBmb3IKKyMgc29tZSBwYXJ0cyBvZiB0aGUgQm9vc3QgbGlicmFyeSB3aGljaCBhcmUgb25seSBtYWRlIG9mIGhlYWRlcnMgYW5kIGRvbid0CisjIHJlcXVpcmUgbGlua2luZyAoc3VjaCBhcyBCb29zdC5Gb3JlYWNoKS4KKyMKKyMgRGVmYXVsdCBBQ1RJT04tSUYtTk9ULUZPVU5EOiBGYWlsIHdpdGggYSBmYXRhbCBlcnJvciB1bmxlc3MgQm9vc3QgY291bGRuJ3QgYmUKKyMgZm91bmQgaW4gdGhlIGZpcnN0IHBsYWNlLCBpbiB3aGljaCBjYXNlIGJ5IGRlZmF1bHQgYSBub3RpY2UgaXMgaXNzdWVkIHRvIHRoZQorIyB1c2VyLiAgUHJlc3VtYWJseSBpZiB3ZSBoYXZlbid0IGRpZWQgYWxyZWFkeSBpdCdzIGJlY2F1c2UgaXQncyBPSyB0byBub3QgaGF2ZQorIyBCb29zdCwgd2hpY2ggaXMgd2h5IG9ubHkgYSBub3RpY2UgaXMgaXNzdWVkIGluc3RlYWQgb2YgYSBoYXJkIGVycm9yLgorIworIyBEZWZhdWx0IEFDVElPTi1JRi1GT1VORDogZGVmaW5lIHRoZSBwcmVwcm9jZXNzb3Igc3ltYm9sIEhBVkVfPEhFQURFUi1OQU1FPiBpbgorIyBjYXNlIG9mIHN1Y2Nlc3MgIyAod2hlcmUgSEVBREVSLU5BTUUgaXMgd3JpdHRlbiBMSUtFX1RISVMsIGUuZy4sCisjIEhBVkVfQk9PU1RfRk9SRUFDSF9IUFApLgorQUNfREVGVU4oW0JPT1NUX0ZJTkRfSEVBREVSXSwKK1tBQ19SRVFVSVJFKFtCT09TVF9SRVFVSVJFXSlkbmwKK2lmIHRlc3QgeCIkYm9vc3RfY3ZfaW5jX3BhdGgiID0geG5vOyB0aGVuCisgIG00X2RlZmF1bHQoWyQyXSwgW0FDX01TR19OT1RJQ0UoW0Jvb3N0IG5vdCBhdmFpbGFibGUsIG5vdCBzZWFyY2hpbmcgZm9yICQxXSldKQorZWxzZQorQUNfTEFOR19QVVNIKFtDKytdKWRubAorYm9vc3Rfc2F2ZV9DUFBGTEFHUz0kQ1BQRkxBR1MKK0NQUEZMQUdTPSIkQ1BQRkxBR1MgJEJPT1NUX0NQUEZMQUdTIgorQUNfQ0hFQ0tfSEVBREVSKFskMV0sCisgIFttNF9kZWZhdWx0KFskM10sIFtBQ19ERUZJTkUoQVNfVFJfQ1BQKFtIQVZFXyQxXSksIFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgPCQxPl0pXSldLAorICBbbTRfZGVmYXVsdChbJDJdLCBbQUNfTVNHX0VSUk9SKFtjYW5ub3QgZmluZCAkMV0pXSldKQorQ1BQRkxBR1M9JGJvb3N0X3NhdmVfQ1BQRkxBR1MKK0FDX0xBTkdfUE9QKFtDKytdKWRubAorZmkKK10pIyBCT09TVF9GSU5EX0hFQURFUgorCisKKyMgQk9PU1RfRklORF9MSUJTKFtDT01QT05FTlQtTkFNRV0sIFtDQU5ESURBVEUtTElCLU5BTUVTXSwKKyMgICAgICAgICAgICAgICAgIFtQUkVGRVJSRUQtUlQtT1BUXSwgW0hFQURFUi1OQU1FXSwgW0NYWC1URVNUXSwKKyMgICAgICAgICAgICAgICAgIFtDWFgtUFJPTE9HVUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciB0aGUgQm9vc3QgbGlicmFyeSBDT01QT05FTlQtTkFNRSAoZS5nLiwgYHRocmVhZCcsIGZvcgorIyBsaWJib29zdF90aHJlYWQpIHVuZGVyIHRoZSBwb3NzaWJsZSBDQU5ESURBVEUtTElCLU5BTUVTIChlLmcuLAorIyAidGhyZWFkX3dpbjMyIHRocmVhZCIpLiAgQ2hlY2sgdGhhdCBIRUFERVItTkFNRSB3b3JrcyBhbmQgY2hlY2sgdGhhdAorIyBsaWJib29zdF9MSUItTkFNRSBjYW4gbGluayB3aXRoIHRoZSBjb2RlIENYWC1URVNULiAgVGhlIG9wdGlvbmFsCisjIGFyZ3VtZW50IENYWC1QUk9MT0dVRSBjYW4gYmUgdXNlZCB0byBpbmNsdWRlIHNvbWUgQysrIGNvZGUgYmVmb3JlCisjIHRoZSBgbWFpbicgZnVuY3Rpb24uCisjCisjIEludm9rZXMgQk9PU1RfRklORF9IRUFERVIoW0hFQURFUi1OQU1FXSkgKHNlZSBhYm92ZSkuCisjCisjIEJvb3N0IGxpYnJhcmllcyB0eXBpY2FsbHkgY29tZSBjb21waWxlZCB3aXRoIHNldmVyYWwgZmxhdm9ycyAod2l0aCBkaWZmZXJlbnQKKyMgcnVudGltZSBvcHRpb25zKSBzbyBQUkVGRVJSRUQtUlQtT1BUIGlzIHRoZSBwcmVmZXJyZWQgc3VmZml4LiAgQSBzdWZmaXggaXMgb25lCisjIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBsZXR0ZXJzOiBzZ2RwbiAoaW4gdGhhdCBvcmRlcikuICBzID0gc3RhdGljCisjIHJ1bnRpbWUsIGQgPSBkZWJ1ZyBidWlsZCwgZyA9IGRlYnVnL2RpYWdub3N0aWMgcnVudGltZSwgcCA9IFNUTFBvcnQgYnVpbGQsCisjIG4gPSAodW5zdXJlKSBTVExQb3J0IGJ1aWxkIHdpdGhvdXQgaW9zdHJlYW1zIGZyb20gU1RMUG9ydCAoaXQgbG9va3MgbGlrZSBgbicKKyMgbXVzdCBhbHdheXMgYmUgdXNlZCBhbG9uZyB3aXRoIGBwJykuICBBZGRpdGlvbmFsbHksIFBSRUZFUlJFRC1SVC1PUFQgY2FuCisjIHN0YXJ0IHdpdGggYG10LScgdG8gaW5kaWNhdGUgdGhhdCB0aGVyZSBpcyBhIHByZWZlcmVuY2UgZm9yIG11bHRpLXRocmVhZAorIyBidWlsZHMuICBTb21lIHNhbXBsZSB2YWx1ZXMgZm9yIFBSRUZFUlJFRC1SVC1PUFQ6IChub3RoaW5nKSwgbXQsIGQsIG10LWQsIGdkcAorIyAuLi4gIElmIHlvdSB3YW50IHRvIG1ha2Ugc3VyZSB5b3UgaGF2ZSBhIHNwZWNpZmljIHZlcnNpb24gb2YgQm9vc3QKKyMgKGVnLCA+PSAxLjMzKSB5b3UgKm11c3QqIGludm9rZSBCT09TVF9SRVFVSVJFIGJlZm9yZSB0aGlzIG1hY3JvLgorQUNfREVGVU4oW0JPT1NUX0ZJTkRfTElCU10sCitbQUNfUkVRVUlSRShbQk9PU1RfUkVRVUlSRV0pZG5sCitBQ19SRVFVSVJFKFtfQk9PU1RfRklORF9DT01QSUxFUl9UQUddKWRubAorQUNfUkVRVUlSRShbQk9PU1RfU1RBVElDXSlkbmwKK0FDX1JFUVVJUkUoW19CT09TVF9HVUVTU19XSEVUSEVSX1RPX1VTRV9NVF0pZG5sCitpZiB0ZXN0IHgiJGJvb3N0X2N2X2luY19wYXRoIiA9IHhubzsgdGhlbgorICBBQ19NU0dfTk9USUNFKFtCb29zdCBub3QgYXZhaWxhYmxlLCBub3Qgc2VhcmNoaW5nIGZvciB0aGUgQm9vc3QgJDEgbGlicmFyeV0pCitlbHNlCitkbmwgVGhlIGVsc2UgYnJhbmNoIGlzIGh1Z2UgYW5kIHdhc24ndCBpbnRlbmRlZCBvbiBwdXJwb3NlLgorQUNfTEFOR19QVVNIKFtDKytdKWRubAorQVNfVkFSX1BVU0hERUYoW0Jvb3N0X2xpYl0sIFtib29zdF9jdl9saWJfJDFdKWRubAorQVNfVkFSX1BVU0hERUYoW0Jvb3N0X2xpYl9MREZMQUdTXSwgW2Jvb3N0X2N2X2xpYl8kMV9MREZMQUdTXSlkbmwKK0FTX1ZBUl9QVVNIREVGKFtCb29zdF9saWJfTERQQVRIXSwgW2Jvb3N0X2N2X2xpYl8kMV9MRFBBVEhdKWRubAorQVNfVkFSX1BVU0hERUYoW0Jvb3N0X2xpYl9MSUJTXSwgW2Jvb3N0X2N2X2xpYl8kMV9MSUJTXSlkbmwKK0JPT1NUX0ZJTkRfSEVBREVSKFskNF0pCitib29zdF9zYXZlX0NQUEZMQUdTPSRDUFBGTEFHUworQ1BQRkxBR1M9IiRDUFBGTEFHUyAkQk9PU1RfQ1BQRkxBR1MiCitBQ19DQUNIRV9DSEVDSyhbZm9yIHRoZSBCb29zdCAkMSBsaWJyYXJ5XSwgW0Jvb3N0X2xpYl0sCisgICAgICAgICAgICAgICBbX0JPT1NUX0ZJTkRfTElCUygkQCldKQorY2FzZSAkQm9vc3RfbGliIGluICMoCisgIChubykgX0FDX01TR19MT0dfQ09ORlRFU1QKKyAgICBBQ19NU0dfRVJST1IoW2Nhbm5vdCBmaW5kIHRoZSBmbGFncyB0byBsaW5rIHdpdGggQm9vc3QgJDFdKQorICAgIDs7Citlc2FjCitBQ19TVUJTVChBU19UUl9DUFAoW0JPT1NUXyQxX0xERkxBR1NdKSwgWyRCb29zdF9saWJfTERGTEFHU10pZG5sCitBQ19TVUJTVChBU19UUl9DUFAoW0JPT1NUXyQxX0xEUEFUSF0pLCBbJEJvb3N0X2xpYl9MRFBBVEhdKWRubAorQUNfU1VCU1QoW0JPT1NUX0xEUEFUSF0sIFskQm9vc3RfbGliX0xEUEFUSF0pZG5sCitBQ19TVUJTVChBU19UUl9DUFAoW0JPT1NUXyQxX0xJQlNdKSwgWyRCb29zdF9saWJfTElCU10pZG5sCitDUFBGTEFHUz0kYm9vc3Rfc2F2ZV9DUFBGTEFHUworQVNfVkFSX1BPUERFRihbQm9vc3RfbGliXSlkbmwKK0FTX1ZBUl9QT1BERUYoW0Jvb3N0X2xpYl9MREZMQUdTXSlkbmwKK0FTX1ZBUl9QT1BERUYoW0Jvb3N0X2xpYl9MRFBBVEhdKWRubAorQVNfVkFSX1BPUERFRihbQm9vc3RfbGliX0xJQlNdKWRubAorQUNfTEFOR19QT1AoW0MrK10pZG5sCitmaQorXSkKKworCisjIEJPT1NUX0ZJTkRfTElCKFtMSUItTkFNRV0sCisjICAgICAgICAgICAgICAgIFtQUkVGRVJSRUQtUlQtT1BUXSwgW0hFQURFUi1OQU1FXSwgW0NYWC1URVNUXSwKKyMgICAgICAgICAgICAgICAgW0NYWC1QUk9MT0dVRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd3JhcHBlciBmb3IgQk9PU1RfRklORF9MSUJTLgorQUNfREVGVU4oW0JPT1NUX0ZJTkRfTElCXSwKK1tCT09TVF9GSU5EX0xJQlMoWyQxXSwgJEApXSkKKworCisjIF9CT09TVF9GSU5EX0xJQlMoW0xJQi1OQU1FXSwgW0NBTkRJREFURS1MSUItTkFNRVNdLAorIyAgICAgICAgICAgICAgICAgW1BSRUZFUlJFRC1SVC1PUFRdLCBbSEVBREVSLU5BTUVdLCBbQ1hYLVRFU1RdLAorIyAgICAgICAgICAgICAgICAgW0NYWC1QUk9MT0dVRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFJlYWwgaW1wbGVtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUJTOiByZWx5IG9uIHRoZXNlIGxvY2FsIG1hY3JvczoKKyMgQm9vc3RfbGliLCBCb29zdF9saWJfTERGTEFHUywgQm9vc3RfbGliX0xEUEFUSCwgQm9vc3RfbGliX0xJQlMKKyMKKyMgVGhlIGFsZ29yaXRobSBpcyBhcyBmb2xsb3dzOiBmaXJzdCBsb29rIGZvciBhIGdpdmVuIGxpYnJhcnkgbmFtZQorIyBhY2NvcmRpbmcgdG8gdGhlIHVzZXIncyBQUkVGRVJSRUQtUlQtT1BULiAgRm9yIGVhY2ggbGlicmFyeSBuYW1lLCB3ZQorIyBwcmVmZXIgdG8gdXNlIHRoZSBvbmVzIHRoYXQgY2FycnkgdGhlIHRhZyAodG9vbHNldCBuYW1lKS4gIEVhY2gKKyMgbGlicmFyeSBpcyBzZWFyY2hlZCB0aHJvdWdoIHRoZSB2YXJpb3VzIHN0YW5kYXJkIHBhdGhzIHdlcmUgQm9vc3QgaXMKKyMgdXN1YWxseSBpbnN0YWxsZWQuICBJZiB3ZSBjYW4ndCBmaW5kIHRoZSBzdGFuZGFyZCB2YXJpYW50cywgd2UgdHJ5CisjIHRvIGVuZm9yY2UgLW10IChmb3IgaW5zdGFuY2Ugb24gTWFjT1NYLCBsaWJib29zdF90aHJlYWQuZHlsaWIKKyMgZG9lc24ndCBleGlzdCBidXQgdGhlcmUncyAtb2J2aW91c2x5LSBsaWJib29zdF90aHJlYWQtbXQuZHlsaWIpLgorQUNfREVGVU4oW19CT09TVF9GSU5EX0xJQlNdLAorW0Jvb3N0X2xpYj1ubworICBjYXNlICIkMyIgaW4gIygKKyAgICAobXQgfCBtdC0pIGJvb3N0X210PS1tdDsgYm9vc3RfcnRvcHQ9OzsgIygKKyAgICAobXQqIHwgbXQtKikgYm9vc3RfbXQ9LW10OyBib29zdF9ydG9wdD1gZXhwciAiWCQzIiA6ICdYbXQtKlwoLipcKSdgOzsgIygKKyAgICAoKikgYm9vc3RfbXQ9OyBib29zdF9ydG9wdD0kMzs7CisgIGVzYWMKKyAgaWYgdGVzdCAkZW5hYmxlX3N0YXRpY19ib29zdCA9IHllczsgdGhlbgorICAgIGJvb3N0X3J0b3B0PSJzJGJvb3N0X3J0b3B0IgorICBmaQorICAjIEZpbmQgdGhlIHByb3BlciBkZWJ1ZyB2YXJpYW50IGRlcGVuZGluZyBvbiB3aGF0IHdlJ3ZlIGJlZW4gYXNrZWQgdG8gZmluZC4KKyAgY2FzZSAkYm9vc3RfcnRvcHQgaW4gIygKKyAgICAoKmQqKSBib29zdF9ydF9kPSRib29zdF9ydG9wdDs7ICMoCisgICAgKCpbW3NncG5dXSopICMgSW5zZXJ0IHRoZSBgZCcgYXQgdGhlIHJpZ2h0IHBsYWNlIChpbiBiZXR3ZWVuIGBzZycgYW5kIGBwbicpCisgICAgICBib29zdF9ydF9kPWBlY2hvICIkYm9vc3RfcnRvcHQiIHwgc2VkICdzL1wocypnKlwpXChwKm4qXCkvXDFcMi8nYDs7ICMoCisgICAgKCopIGJvb3N0X3J0X2Q9Jy1kJzs7CisgIGVzYWMKKyAgIyBJZiB0aGUgUFJFRkVSUkVELVJULU9QVCBhcmUgbm90IGVtcHR5LCBwcmVwZW5kIGEgYC0nLgorICB0ZXN0IC1uICIkYm9vc3RfcnRvcHQiICYmIGJvb3N0X3J0b3B0PSItJGJvb3N0X3J0b3B0IgorICAkYm9vc3RfZ3Vlc3NfdXNlX210ICYmIGJvb3N0X210PS1tdAorICAjIExvb2sgZm9yIHRoZSBhYnMgcGF0aCB0aGUgc3RhdGljIGFyY2hpdmUuCisgICMgJGxpYmV4dCBpcyBjb21wdXRlZCBieSBMaWJ0b29sIGJ1dCBsZXQncyBtYWtlIHN1cmUgaXQncyBub24gZW1wdHkuCisgIHRlc3QgLXogIiRsaWJleHQiICYmCisgICAgQUNfTVNHX0VSUk9SKFt0aGUgbGliZXh0IHZhcmlhYmxlIGlzIGVtcHR5LCBkaWQgeW91IGludm9rZSBMaWJ0b29sP10pCisgIGJvb3N0X3NhdmVfYWNfb2JqZXh0PSRhY19vYmpleHQKKyAgIyBHZW5lcmF0ZSB0aGUgdGVzdCBmaWxlLgorICBBQ19MQU5HX0NPTkZURVNUKFtBQ19MQU5HX1BST0dSQU0oWyNpbmNsdWRlIDwkND4KKyQ2XSwgWyQ1XSldKQorZG5sIE9wdGltaXphdGlvbiBoYWNrczogY29tcGlsaW5nIEMrKyBpcyBzbG93LCBlc3BlY2lhbGx5IHdpdGggQm9vc3QuICBXaGF0Citkbmwgd2UncmUgdHJ5aW5nIHRvIGRvIGhlcmUgaXMgZ3Vlc3MgdGhlIHJpZ2h0IGNvbWJpbmF0aW9uIG9mIGxpbmsgZmxhZ3MKK2RubCAoTElCUyAvIExERkxBR1MpIHRvIHVzZSBhIGdpdmVuIGxpYnJhcnkuICBUaGlzIGNhbiB0YWtlIHNldmVyYWwKK2RubCBpdGVyYXRpb25zIGJlZm9yZSBpdCBzdWNjZWVkcyBhbmQgaXMgdGh1cyAqdmVyeSogc2xvdy4gIFNvIHdoYXQgd2UgZG8KK2RubCBpbnN0ZWFkIGlzIHRoYXQgd2UgY29tcGlsZSB0aGUgY29kZSBmaXJzdCAoYW5kIHRodXMgZ2V0IGFuIG9iamVjdCBmaWxlLAorZG5sIHR5cGljYWxseSBjb25mdGVzdC5vKS4gIFRoZW4gd2UgdHJ5IHZhcmlvdXMgY29tYmluYXRpb25zIG9mIGxpbmsgZmxhZ3MKK2RubCB1bnRpbCB3ZSBzdWNjZWVkIHRvIGxpbmsgY29uZnRlc3QubyBpbiBhbiBleGVjdXRhYmxlLiAgVGhlIHByb2JsZW0gaXMKK2RubCB0aGF0IHRoZSB2YXJpb3VzIFRSWV9MSU5LIC8gQ09NUElMRV9JRkVMU0UgbWFjcm9zIG9mIEF1dG9jb25mIGFsd2F5cworZG5sIHJlbW92ZSBhbGwgdGhlIHRlbXBvcmFyeSBmaWxlcyBpbmNsdWRpbmcgY29uZnRlc3Quby4gIFNvIHRoZSB0cmljayBoZXJlCitkbmwgaXMgdG8gdGVtcG9yYXJpbHkgY2hhbmdlIHRoZSB2YWx1ZSBvZiBhY19vYmpleHQgc28gdGhhdCBjb25mdGVzdC5vIGlzCitkbmwgcHJlc2VydmVkIGFjY3Jvc3MgdGVzdHMuICBUaGlzIGlzIG9idmlvdXNseSBmcmFnaWxlIGFuZCBJIHdpbGwgYnVybiBpbgorZG5sIGhlbGwgZm9yIG5vdCByZXNwZWN0aW5nIEF1dG9jb25mJ3MgZG9jdW1lbnRlZCBpbnRlcmZhY2VzLCBidXQgaW4gdGhlCitkbmwgbWVhbiB0aW1lLCBpdCBvcHRpbWl6ZXMgdGhlIG1hY3JvIGJ5IGEgZmFjdG9yIG9mIDUgdG8gMzAuCitkbmwgQW5vdGhlciBzbWFsbCBvcHRpbWl6YXRpb246IHRoZSBmaXJzdCBhcmd1bWVudCBvZiBBQ19DT01QSUxFX0lGRUxTRSBsZWZ0CitkbmwgZW1wdHkgYmVjYXVzZSB0aGUgdGVzdCBmaWxlIGlzIGdlbmVyYXRlZCBvbmx5IG9uY2UgYWJvdmUgKGJlZm9yZSB3ZQorZG5sIHN0YXJ0IHRoZSBmb3IgbG9vcHMpLgorICBBQ19DT01QSUxFX0lGRUxTRShbXSwKKyAgICBbYWNfb2JqZXh0PWRvX25vdF9ybV9tZV9wbHpdLAorICAgIFtBQ19NU0dfRVJST1IoW2Nhbm5vdCBjb21waWxlIGEgdGVzdCB0aGF0IHVzZXMgQm9vc3QgJDFdKV0pCisgIGFjX29iamV4dD0kYm9vc3Rfc2F2ZV9hY19vYmpleHQKKyAgYm9vc3RfZmFpbGVkX2xpYnM9CisjIERvbid0IGJvdGhlciB0byBpZGVudCB0aGUgZm9sbG93aW5nIG5lc3RlZCBmb3IgbG9vcHMsIG9ubHkgdGhlIDIKKyMgaW5uZXJtb3N0IG9uZXMgbWF0dGVyLgorZm9yIGJvb3N0X2xpYl8gaW4gJDI7IGRvCitmb3IgYm9vc3RfdGFnXyBpbiAtJGJvb3N0X2N2X2xpYl90YWcgJyc7IGRvCitmb3IgYm9vc3RfdmVyXyBpbiAtJGJvb3N0X2N2X2xpYl92ZXJzaW9uICcnOyBkbworZm9yIGJvb3N0X210XyBpbiAkYm9vc3RfbXQgLW10ICcnOyBkbworZm9yIGJvb3N0X3J0b3B0XyBpbiAkYm9vc3RfcnRvcHQgJycgLWQ7IGRvCisgIGZvciBib29zdF9saWIgaW4gXAorICAgIGJvb3N0XyRib29zdF9saWJfJGJvb3N0X3RhZ18kYm9vc3RfbXRfJGJvb3N0X3J0b3B0XyRib29zdF92ZXJfIFwKKyAgICBib29zdF8kYm9vc3RfbGliXyRib29zdF90YWdfJGJvb3N0X3J0b3B0XyRib29zdF92ZXJfIFwKKyAgICBib29zdF8kYm9vc3RfbGliXyRib29zdF90YWdfJGJvb3N0X210XyRib29zdF92ZXJfIFwKKyAgICBib29zdF8kYm9vc3RfbGliXyRib29zdF90YWdfJGJvb3N0X3Zlcl8KKyAgZG8KKyAgICAjIEF2b2lkIHRlc3RpbmcgdHdpY2UgdGhlIHNhbWUgbGliCisgICAgY2FzZSAkYm9vc3RfZmFpbGVkX2xpYnMgaW4gIygKKyAgICAgICgqQCRib29zdF9saWJAKikgY29udGludWU7OworICAgIGVzYWMKKyAgICAjIElmIHdpdGhfYm9vc3QgaXMgZW1wdHksIHdlJ2xsIHNlYXJjaCBpbiAvbGliIGZpcnN0LCB3aGljaCBpcyBub3QgcXVpdGUKKyAgICAjIHJpZ2h0IHNvIGluc3RlYWQgd2UnbGwgdHJ5IHRvIGEgbG9jYXRpb24gYmFzZWQgb24gd2hlcmUgdGhlIGhlYWRlcnMgYXJlLgorICAgIGJvb3N0X3RtcF9saWI9JHdpdGhfYm9vc3QKKyAgICB0ZXN0IHgiJHdpdGhfYm9vc3QiID0geCAmJiBib29zdF90bXBfbGliPSR7Ym9vc3RfY3ZfaW5jX3BhdGglL2luY2x1ZGV9CisgICAgZm9yIGJvb3N0X2xkcGF0aCBpbiAiJGJvb3N0X3RtcF9saWIvbGliIiAnJyBcCisgICAgICAgICAgICAgL29wdC9sb2NhbC9saWIqIC91c3IvbG9jYWwvbGliKiAvb3B0L2xpYiogL3Vzci9saWIqIFwKKyAgICAgICAgICAgICAiJHdpdGhfYm9vc3QiIEM6L0Jvb3N0L2xpYiAvbGliKgorICAgIGRvCisgICAgICAjIERvbid0IHdhc3RlIHRpbWUgd2l0aCBkaXJlY3RvcmllcyB0aGF0IGRvbid0IGV4aXN0LgorICAgICAgaWYgdGVzdCB4IiRib29zdF9sZHBhdGgiICE9IHggJiYgdGVzdCAhIC1lICIkYm9vc3RfbGRwYXRoIjsgdGhlbgorICAgICAgICBjb250aW51ZQorICAgICAgZmkKKyAgICAgIGJvb3N0X3NhdmVfTERGTEFHUz0kTERGTEFHUworICAgICAgIyBBcmUgd2UgbG9va2luZyBmb3IgYSBzdGF0aWMgbGlicmFyeT8KKyAgICAgIGNhc2UgJGJvb3N0X2xkcGF0aDokYm9vc3RfcnRvcHRfIGluICMoCisgICAgICAgICgqPyo6KnMqKSAjIFllcyAoTm9uIGVtcHR5IGJvb3N0X2xkcGF0aCArIHMgaW4gcnQgb3B0KQorICAgICAgICAgIEJvb3N0X2xpYl9MSUJTPSIkYm9vc3RfbGRwYXRoL2xpYiRib29zdF9saWIuJGxpYmV4dCIKKyAgICAgICAgICB0ZXN0IC1lICIkQm9vc3RfbGliX0xJQlMiIHx8IGNvbnRpbnVlOzsgIygKKyAgICAgICAgKCopICMgTm86IHVzZSAtbGJvb3N0X2ZvbyB0byBmaW5kIHRoZSBzaGFyZWQgbGlicmFyeS4KKyAgICAgICAgICBCb29zdF9saWJfTElCUz0iLWwkYm9vc3RfbGliIjs7CisgICAgICBlc2FjCisgICAgICBib29zdF9zYXZlX0xJQlM9JExJQlMKKyAgICAgIExJQlM9IiRCb29zdF9saWJfTElCUyAkTElCUyIKKyAgICAgIHRlc3QgeCIkYm9vc3RfbGRwYXRoIiAhPSB4ICYmIExERkxBR1M9IiRMREZMQUdTIC1MJGJvb3N0X2xkcGF0aCIKK2RubCBGaXJzdCBhcmd1bWVudCBvZiBBQ19MSU5LX0lGRUxTRSBsZWZ0IGVtcHR5IGJlY2F1c2UgdGhlIHRlc3QgZmlsZSBpcworZG5sIGdlbmVyYXRlZCBvbmx5IG9uY2UgYWJvdmUgKGJlZm9yZSB3ZSBzdGFydCB0aGUgZm9yIGxvb3BzKS4KKyAgICAgIF9CT09TVF9BQ19MSU5LX0lGRUxTRShbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbQm9vc3RfbGliPXllc10sIFtCb29zdF9saWI9bm9dKQorICAgICAgYWNfb2JqZXh0PSRib29zdF9zYXZlX2FjX29iamV4dAorICAgICAgTERGTEFHUz0kYm9vc3Rfc2F2ZV9MREZMQUdTCisgICAgICBMSUJTPSRib29zdF9zYXZlX0xJQlMKKyAgICAgIGlmIHRlc3QgeCIkQm9vc3RfbGliIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgIyBDaGVjayBvciB1c2VkIGNhY2hlZCByZXN1bHQgb2Ygd2hldGhlciBvciBub3QgdXNpbmcgLVIgb3IKKyAgICAgICAgIyAtcnBhdGggbWFrZXMgc2Vuc2UuICBTb21lIGltcGxlbWVudGF0aW9ucyBvZiBsZCwgc3VjaCBhcyBmb3IKKyAgICAgICAgIyBNYWMgT1NYLCByZXF1aXJlIC1ycGF0aCBidXQgLVIgaXMgdGhlIGZsYWcga25vd24gdG8gd29yayBvbgorICAgICAgICAjIG90aGVyIHN5c3RlbXMuICBodHRwczovL2dpdGh1Yi5jb20vdHN1bmEvYm9vc3QubTQvaXNzdWVzLzE5CisgICAgICAgIEFDX0NBQ0hFX1ZBTChbYm9vc3RfY3ZfcnBhdGhfbGlua19sZGZsYWddLAorICAgICAgICAgIFtjYXNlICRib29zdF9sZHBhdGggaW4KKyAgICAgICAgICAgJycpICMgTm90aGluZyB0byBkby4KKyAgICAgICAgICAgICBib29zdF9jdl9ycGF0aF9saW5rX2xkZmxhZz0KKyAgICAgICAgICAgICBib29zdF9ycGF0aF9saW5rX2xkZmxhZ19mb3VuZD15ZXM7OworICAgICAgICAgICAqKQorICAgICAgICAgICAgZm9yIGJvb3N0X2N2X3JwYXRoX2xpbmtfbGRmbGFnIGluIC1XbCwtUiwgLVdsLC1ycGF0aCw7IGRvCisgICAgICAgICAgICAgIExERkxBR1M9IiRib29zdF9zYXZlX0xERkxBR1MgLUwkYm9vc3RfbGRwYXRoICRib29zdF9jdl9ycGF0aF9saW5rX2xkZmxhZyRib29zdF9sZHBhdGgiCisgICAgICAgICAgICAgIExJQlM9IiRib29zdF9zYXZlX0xJQlMgJEJvb3N0X2xpYl9MSUJTIgorICAgICAgICAgICAgICBfQk9PU1RfQUNfTElOS19JRkVMU0UoW10sCisgICAgICAgICAgICAgICAgW2Jvb3N0X3JwYXRoX2xpbmtfbGRmbGFnX2ZvdW5kPXllcworICAgICAgICAgICAgICAgIGJyZWFrXSwKKyAgICAgICAgICAgICAgICBbYm9vc3RfcnBhdGhfbGlua19sZGZsYWdfZm91bmQ9bm9dKQorICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgOzsKKyAgICAgICAgICBlc2FjCisgICAgICAgICAgQVNfSUYoW3Rlc3QgIngkYm9vc3RfcnBhdGhfbGlua19sZGZsYWdfZm91bmQiICE9ICJ4eWVzIl0sCisgICAgICAgICAgICBbQUNfTVNHX0VSUk9SKFtVbmFibGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gdXNlIC1SIG9yIC1ycGF0aF0pXSkKKyAgICAgICAgICBMREZMQUdTPSRib29zdF9zYXZlX0xERkxBR1MKKyAgICAgICAgICBMSUJTPSRib29zdF9zYXZlX0xJQlMKKyAgICAgICAgICBdKQorICAgICAgICB0ZXN0IHgiJGJvb3N0X2xkcGF0aCIgIT0geCAmJgorICAgICAgICAgIEJvb3N0X2xpYl9MREZMQUdTPSItTCRib29zdF9sZHBhdGggJGJvb3N0X2N2X3JwYXRoX2xpbmtfbGRmbGFnJGJvb3N0X2xkcGF0aCIKKyAgICAgICAgQm9vc3RfbGliX0xEUEFUSD0iJGJvb3N0X2xkcGF0aCIKKyAgICAgICAgYnJlYWsgNworICAgICAgZWxzZQorICAgICAgICBib29zdF9mYWlsZWRfbGlicz0iJGJvb3N0X2ZhaWxlZF9saWJzQCRib29zdF9saWJAIgorICAgICAgZmkKKyAgICBkb25lCisgIGRvbmUKK2RvbmUKK2RvbmUKK2RvbmUKK2RvbmUKK2RvbmUgIyBib29zdF9saWJfCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitdKQorCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIworIyBDaGVja3MgZm9yIHRoZSB2YXJpb3VzIEJvb3N0IGxpYnJhcmllcy4gIworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIworCisjIExpc3Qgb2YgYm9vc3QgbGlicmFyaWVzOiBodHRwOi8vd3d3LmJvb3N0Lm9yZy9saWJzL2xpYnJhcmllcy5odG0KKyMgVGhlIHBhZ2UgaHR0cDovL2JldGEuYm9vc3Qub3JnL2RvYy9saWJzIGlzIHVzZWZ1bDogaXQgZ2l2ZXMgdGhlIGZpcnN0IHJlbGVhc2UKKyMgdmVyc2lvbiBvZiBlYWNoIGxpYnJhcnkgKGFtb25nIG90aGVyIHRoaW5ncykuCisKKyMgQk9PU1RfREVGVU4oTElCUkFSWSwgQ09ERSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRGVmaW5lIEJPT1NUXzxMSUJSQVJZLVVQUEVSQ0FTRT4gYXMgYSBtYWNybyB0aGF0IHJ1bnMgQ09ERS4KKyMKKyMgVXNlIGluZGlyIHRvIGF2b2lkIHRoZSB3YXJuaW5nIG9uIHVuZGVycXVvdGVkIG1hY3JvIG5hbWUgZ2l2ZW4gdG8gQUNfREVGVU4uCittNF9kZWZpbmUoW0JPT1NUX0RFRlVOXSwKK1ttNF9pbmRpcihbQUNfREVGVU5dLAorICAgICAgICAgIG00X3RvdXBwZXIoW0JPT1NUXyQxXSksCitbbTRfcHVzaGRlZihbQk9PU1RfTGlicmFyeV0sIFskMV0pZG5sCiskMgorbTRfcG9wZGVmKFtCT09TVF9MaWJyYXJ5XSlkbmwKK10pCitdKQorCisjIEJPT1NUX0FSUkFZKCkKKyMgLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5BcnJheQorQk9PU1RfREVGVU4oW0FycmF5XSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvYXJyYXkuaHBwXSldKQorCisKKyMgQk9PU1RfQVNJTygpCisjIC0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5Bc2lvIChuZXcgaW4gQm9vc3QgMS4zNSkuCitCT09TVF9ERUZVTihbQXNpb10sCitbQUNfUkVRVUlSRShbQk9PU1RfU1lTVEVNXSlkbmwKK0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9hc2lvLmhwcF0pXSkKKworCisjIEJPT1NUX0JJTkQoKQorIyAtLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuQmluZC4KK0JPT1NUX0RFRlVOKFtCaW5kXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvYmluZC5ocHBdKV0pCisKKworIyBCT09TVF9DSFJPTk8oKQorIyAtLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5DaHJvbm8uCitCT09TVF9ERUZVTihbQ2hyb25vXSwKK1sjIERvIHdlIGhhdmUgdG8gY2hlY2sgZm9yIEJvb3N0LlN5c3RlbT8gIFRoaXMgbGluay10aW1lIGRlcGVuZGVuY3kgd2FzCisjIGFkZGVkIGFzIG9mIDEuMzUuMC4gIElmIHdlIGhhdmUgYSB2ZXJzaW9uIDwxLjM1LCB3ZSBtdXN0IG5vdCBhdHRlbXB0IHRvCisjIGZpbmQgQm9vc3QuU3lzdGVtIGFzIGl0IGRpZG4ndCBleGlzdCBieSB0aGVuLgoraWYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtZ2UgMTM1OyB0aGVuCisgIEJPT1NUX1NZU1RFTShbJDFdKQorZmkgIyBlbmQgb2YgdGhlIEJvb3N0LlN5c3RlbSBjaGVjay4KK2Jvb3N0X2ZpbGVzeXN0ZW1fc2F2ZV9MSUJTPSRMSUJTCitib29zdF9maWxlc3lzdGVtX3NhdmVfTERGTEFHUz0kTERGTEFHUworbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX1NZU1RFTV8oTElCU3xMREZMQUdTKSRdKWRubAorTElCUz0iJExJQlMgJEJPT1NUX1NZU1RFTV9MSUJTIgorTERGTEFHUz0iJExERkxBR1MgJEJPT1NUX1NZU1RFTV9MREZMQUdTIgorQk9PU1RfRklORF9MSUIoW2Nocm9ub10sIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L2Nocm9uby5ocHBdLAorICAgICAgICAgICAgICAgIFtib29zdDo6Y2hyb25vOjp0aHJlYWRfY2xvY2sgZDtdKQoraWYgdGVzdCAkZW5hYmxlX3N0YXRpY19ib29zdCA9IHllcyAmJiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxMzU7IHRoZW4KKyAgQk9PU1RfQ0hST05PX0xJQlM9IiRCT09TVF9DSFJPTk9fTElCUyAkQk9PU1RfU1lTVEVNX0xJQlMiCitmaQorTElCUz0kYm9vc3RfZmlsZXN5c3RlbV9zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X2ZpbGVzeXN0ZW1fc2F2ZV9MREZMQUdTCitdKSMgQk9PU1RfQ0hST05PCisKKworIyBCT09TVF9DT05URVhUKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuQ29udGV4dC4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCisjCisjICogVGhpcyBsaWJyYXJ5IHdhcyBpbnRyb2R1Y2VkIGluIEJvb3N0IDEuNTEuMAorIyAqIFRoZSBzaWduYXR1cmVzIG9mIG1ha2VfZmNvbnRleHQoKSBhbmQganVtcF9mY29udGV4dCB3ZXJlIGNoYW5nZWQgaW4gMS41Ni4wCisjICogQSBkZXBlbmRlbmN5IG9uIGJvb3N0X3RocmVhZCBhcHBlYXJzIGluIDEuNTcuMAorQk9PU1RfREVGVU4oW0NvbnRleHRdLAorW2Jvb3N0X2NvbnRleHRfc2F2ZV9MSUJTPSRMSUJTCisgYm9vc3RfY29udGV4dF9zYXZlX0xERkxBR1M9JExERkxBR1MKK2lmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWdlIDE1NzsgdGhlbgorICBCT09TVF9USFJFQUQoWyQxXSkKKyAgbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX1RIUkVBRF8oTElCU3xMREZMQUdTKSRdKWRubAorICBMSUJTPSIkTElCUyAkQk9PU1RfVEhSRUFEX0xJQlMiCisgIExERkxBR1M9IiRMREZMQUdTICRCT09TVF9USFJFQURfTERGTEFHUyIKK2ZpCitCT09TVF9GSU5EX0xJQihbY29udGV4dF0sIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L2NvbnRleHQvYWxsLmhwcF0sW1sKKworLy8gY3JlYXRlcyBhIHN0YWNrCit2b2lkICogc3RhY2tfcG9pbnRlciA9IG5ldyB2b2lkKls0MDk2XTsKK3N0ZDo6c2l6ZV90IGNvbnN0IHNpemUgPSBzaXplb2Yodm9pZCpbNDA5Nl0pOworCisjaWYgQk9PU1RfVkVSU0lPTiA8PSAxMDUxMDAKK2N0eDo6bWFrZV9mY29udGV4dCgmZmMsIGYpOworcmV0dXJuIGN0eDo6anVtcF9mY29udGV4dCgmZmNtLCAmZmMsIDMpID09IDY7CisKKyNlbHNlCisKK2ZjID0gY3R4OjptYWtlX2Zjb250ZXh0KHN0YWNrX3BvaW50ZXIsIHNpemUsIGYpOworcmV0dXJuIGN0eDo6anVtcF9mY29udGV4dCgmZmNtLCBmYywgMykgPT0gNjsKKworI2VuZGlmCisKKworXV0sW2RubAorCisjaW5jbHVkZSA8Ym9vc3QvdmVyc2lvbi5ocHA+CisjaWYgQk9PU1RfVkVSU0lPTiA8PSAxMDUxMDAKKworbmFtZXNwYWNlIGN0eCA9IGJvb3N0OjpjdHg7CisKK3N0YXRpYyBjdHg6OmZjb250ZXh0X3QgZmNtLCBmYzsKKworc3RhdGljIHZvaWQgZihpbnRwdHJfdCBpKSB7CisgICAgY3R4OjpqdW1wX2Zjb250ZXh0KCZmYywgJmZjbSwgaSAqIDIpOworfQorCisjZWxpZiBCT09TVF9WRVJTSU9OIDw9IDEwNTUwMAorCituYW1lc3BhY2UgY3R4ID0gYm9vc3Q6OmNvbnRleHQ7CisKKy8vIGNvbnRleHQKK3N0YXRpYyBjdHg6OmZjb250ZXh0X3QgZmNtLCAqZmM7CisKKy8vIGNvbnRleHQtZnVuY3Rpb24KK3N0YXRpYyB2b2lkIGYoaW50cHRyX3QgaSkgeworICAgIGN0eDo6anVtcF9mY29udGV4dChmYywgJmZjbSwgaSAqIDIpOworfQorCisjZWxzZQorCituYW1lc3BhY2UgY3R4ID0gYm9vc3Q6OmNvbnRleHQ7CisKKy8vIGNvbnRleHQKK3N0YXRpYyBjdHg6OmZjb250ZXh0X3QgZmNtLCBmYzsKKworLy8gY29udGV4dC1mdW5jdGlvbgorc3RhdGljIHZvaWQgZihpbnRwdHJfdCBpKSB7CisgICAgY3R4OjpqdW1wX2Zjb250ZXh0KCZmYywgZmNtLCBpICogMik7Cit9CisjZW5kaWYKK10pCitMSUJTPSRib29zdF9jb250ZXh0X3NhdmVfTElCUworTERGTEFHUz0kYm9vc3RfY29udGV4dF9zYXZlX0xERkxBR1MKK10pIyBCT09TVF9DT05URVhUCisKKworIyBCT09TVF9DT05WRVJTSU9OKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkNvbnZlcnNpb24gKGNhc3QgLyBsZXhpY2FsX2Nhc3QpCitCT09TVF9ERUZVTihbQ29udmVyc2lvbl0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L2Nhc3QuaHBwXSkKK0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9sZXhpY2FsX2Nhc3QuaHBwXSkKK10pIyBCT09TVF9DT05WRVJTSU9OCisKKworIyBCT09TVF9DT1JPVVRJTkUoW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5Db3JvdXRpbmUuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLiAgVGhpcyBsaWJyYXJ5IHdhcyBpbnRyb2R1Y2VkIGluIEJvb3N0CisjIDEuNTMuMAorQk9PU1RfREVGVU4oW0Nvcm91dGluZV0sCitbCitib29zdF9jb3JvdXRpbmVfc2F2ZV9MSUJTPSRMSUJTCitib29zdF9jb3JvdXRpbmVfc2F2ZV9MREZMQUdTPSRMREZMQUdTCisjIExpbmstdGltZSBkZXBlbmRlbmN5IGZyb20gY29yb3V0aW5lIHRvIGNvbnRleHQKK0JPT1NUX0NPTlRFWFQoWyQxXSkKKyMgU3RhcnRpbmcgZnJvbSBCb29zdCAxLjU1IGEgZGVwZW5kZW5jeSBvbiBCb29zdC5TeXN0ZW0gaXMgYWRkZWQKK2lmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWdlIDE1NTsgdGhlbgorICBCT09TVF9TWVNURU0oWyQxXSkKK2ZpCittNF9wYXR0ZXJuX2FsbG93KFteQk9PU1RfKENPTlRFWFR8U1lTVEVNKV8oTElCU3xMREZMQUdTKV0pCitMSUJTPSIkTElCUyAkQk9PU1RfQ09OVEVYVF9MSUJTICRCT09TVF9TWVNURU1fTElCUyIKK0xERkxBR1M9IiRMREZMQUdTICRCT09TVF9DT05URVhUX0xERkxBR1MiCisKKyMgaW4gMS41MyBjb3JvdXRpbmUgd2FzIGEgaGVhZGVyIG9ubHkgbGlicmFyeQoraWYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtZXEgMTUzOyB0aGVuCisgIEJPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9jb3JvdXRpbmUvY29yb3V0aW5lLmhwcF0pCitlbHNlCisgIEJPT1NUX0ZJTkRfTElCKFtjb3JvdXRpbmVdLCBbJDFdLAorCQkgIFtib29zdC9jb3JvdXRpbmUvY29yb3V0aW5lLmhwcF0sCisJCSAgWworICAjaW5jbHVkZSA8Ym9vc3QvdmVyc2lvbi5ocHA+CisgICNpZiAgIEJPT1NUX1ZFUlNJT04gPD0gMTA1NTAwCisgIGJvb3N0Ojpjb3JvdXRpbmVzOjpjb3JvdXRpbmU8aW50KGludCk+IGNvcm87IGNvcm8uZ2V0KCk7CisgICNlbHNlCisgIGJvb3N0Ojpjb3JvdXRpbmVzOjphc3ltbWV0cmljX2Nvcm91dGluZTxpbnQ+OjpwdWxsX3R5cGUgY29ybzsgY29yby5nZXQoKTsKKyAgI2VuZGlmCisgIF0pCitmaQorIyBMaW5rLXRpbWUgZGVwZW5kZW5jeSBmcm9tIGNvcm91dGluZSB0byBjb250ZXh0LCBleGlzdGVkIG9ubHkgaW4gMS41MywgaW4gMS41NAorIyBjb3JvdXRpbmUgZG9lc24ndCB1c2UgY29udGV4dCBmcm9tIGl0cyBoZWFkZXJzIGJ1dCBmcm9tIGl0cyBsaWJyYXJ5LgoraWYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtZXEgMTUzIHx8IHRlc3QgJGVuYWJsZV9zdGF0aWNfYm9vc3QgPSB5ZXMgJiYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtZ2UgMTU0OyB0aGVuCisgIEJPT1NUX0NPUk9VVElORV9MSUJTPSIkQk9PU1RfQ09ST1VUSU5FX0xJQlMgJEJPT1NUX0NPTlRFWFRfTElCUyIKKyAgQk9PU1RfQ09ST1VUSU5FX0xERkxBR1M9IiRCT09TVF9DT1JPVVRJTkVfTERGTEFHUyAkQk9PU1RfQ09OVEVYVF9MREZMQUdTIgorZmkKK2lmIHRlc3QgJGVuYWJsZV9zdGF0aWNfYm9vc3QgPSB5ZXMgJiYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtZ2UgMTU1OyB0aGVuCisgIEJPT1NUX0NPUk9VVElORV9MSUJTPSIkQk9PU1RfQ09ST1VUSU5FX0xJQlMgJEJPT1NUX1NZU1RFTV9MSUJTIgorICBCT09TVF9DT1JPVVRJTkVfTERGTEFHUz0iJEJPT1NUX0NPUk9VVElORV9MREZMQUdTICRCT09TVF9TWVNURU1fTERGTEFHUyIKK2ZpCitMSUJTPSRib29zdF9jb3JvdXRpbmVfc2F2ZV9MSUJTCitMREZMQUdTPSRib29zdF9jb3JvdXRpbmVfc2F2ZV9MREZMQUdTCitdKSMgQk9PU1RfQ09ST1VUSU5FCisKKworIyBCT09TVF9DUkMoKQorIyAtLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5DUkMKK0JPT1NUX0RFRlVOKFtDUkNdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9jcmMuaHBwXSkKK10pIyBCT09TVF9DUkMKKworCisjIEJPT1NUX0RBVEVfVElNRShbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkRhdGVfVGltZS4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbRGF0ZV9UaW1lXSwKK1tCT09TVF9GSU5EX0xJQihbZGF0ZV90aW1lXSwgWyQxXSwKKyAgICAgICAgICAgICAgICBbYm9vc3QvZGF0ZV90aW1lL3Bvc2l4X3RpbWUvcG9zaXhfdGltZS5ocHBdLAorICAgICAgICAgICAgICAgIFtib29zdDo6cG9zaXhfdGltZTo6cHRpbWUgdDtdKQorXSkjIEJPT1NUX0RBVEVfVElNRQorCisKKyMgQk9PU1RfRklMRVNZU1RFTShbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5GaWxlc3lzdGVtLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsIHNlZQorIyB0aGUgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4KKyMgRG8gbm90IGNoZWNrIGZvciBib29zdC9maWxlc3lzdGVtLmhwcCBiZWNhdXNlIHRoaXMgZmlsZSB3YXMgaW50cm9kdWNlZCBpbgorIyAxLjM0LgorQk9PU1RfREVGVU4oW0ZpbGVzeXN0ZW1dLAorWyMgRG8gd2UgaGF2ZSB0byBjaGVjayBmb3IgQm9vc3QuU3lzdGVtPyAgVGhpcyBsaW5rLXRpbWUgZGVwZW5kZW5jeSB3YXMKKyMgYWRkZWQgYXMgb2YgMS4zNS4wLiAgSWYgd2UgaGF2ZSBhIHZlcnNpb24gPDEuMzUsIHdlIG11c3Qgbm90IGF0dGVtcHQgdG8KKyMgZmluZCBCb29zdC5TeXN0ZW0gYXMgaXQgZGlkbid0IGV4aXN0IGJ5IHRoZW4uCitpZiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxMzU7IHRoZW4KKyAgQk9PU1RfU1lTVEVNKFskMV0pCitmaSAjIGVuZCBvZiB0aGUgQm9vc3QuU3lzdGVtIGNoZWNrLgorYm9vc3RfZmlsZXN5c3RlbV9zYXZlX0xJQlM9JExJQlMKK2Jvb3N0X2ZpbGVzeXN0ZW1fc2F2ZV9MREZMQUdTPSRMREZMQUdTCittNF9wYXR0ZXJuX2FsbG93KFteQk9PU1RfU1lTVEVNXyhMSUJTfExERkxBR1MpJF0pZG5sCitMSUJTPSIkTElCUyAkQk9PU1RfU1lTVEVNX0xJQlMiCitMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfU1lTVEVNX0xERkxBR1MiCitCT09TVF9GSU5EX0xJQihbZmlsZXN5c3RlbV0sIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L2ZpbGVzeXN0ZW0vcGF0aC5ocHBdLCBbYm9vc3Q6OmZpbGVzeXN0ZW06OnBhdGggcDtdKQoraWYgdGVzdCAkZW5hYmxlX3N0YXRpY19ib29zdCA9IHllcyAmJiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxMzU7IHRoZW4KKyAgQk9PU1RfRklMRVNZU1RFTV9MSUJTPSIkQk9PU1RfRklMRVNZU1RFTV9MSUJTICRCT09TVF9TWVNURU1fTElCUyIKK2ZpCitMSUJTPSRib29zdF9maWxlc3lzdGVtX3NhdmVfTElCUworTERGTEFHUz0kYm9vc3RfZmlsZXN5c3RlbV9zYXZlX0xERkxBR1MKK10pIyBCT09TVF9GSUxFU1lTVEVNCisKKworIyBCT09TVF9GTFlXRUlHSFQoKQorIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5GbHl3ZWlnaHQuCitCT09TVF9ERUZVTihbRmx5d2VpZ2h0XSwKK1tkbmwgVGhlcmUncyBhIGhpZGRlbiBkZXBlbmRlbmN5IG9uIHB0aHJlYWRzLgorQUNfUkVRVUlSRShbX0JPT1NUX1BUSFJFQURfRkxBR10pZG5sCitCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvZmx5d2VpZ2h0LmhwcF0pCitBQ19TVUJTVChbQk9PU1RfRkxZV0VJR0hUX0xJQlNdLCBbJGJvb3N0X2N2X3B0aHJlYWRfZmxhZ10pCitdKQorCisKKyMgQk9PU1RfRk9SRUFDSCgpCisjIC0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5Gb3JlYWNoLgorQk9PU1RfREVGVU4oW0ZvcmVhY2hdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9mb3JlYWNoLmhwcF0pXSkKKworCisjIEJPT1NUX0ZPUk1BVCgpCisjIC0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkZvcm1hdC4KKyMgTm90ZTogd2UgY2FuJ3QgY2hlY2sgZm9yIGJvb3N0L2Zvcm1hdC9mb3JtYXRfZndkLmhwcCBiZWNhdXNlIHRoZSBoZWFkZXIgaXNuJ3QKKyMgc3RhbmRhbG9uZS4gIEl0IGNhbid0IGJlIGNvbXBpbGVkIGJlY2F1c2UgaXQgdHJpZ2dlcnMgdGhlIGZvbGxvd2luZyBlcnJvcjoKKyMgYm9vc3QvZm9ybWF0L2RldGFpbC9jb25maWdfbWFjcm9zLmhwcDo4ODogZXJyb3I6ICdsb2NhbGUnIGluIG5hbWVzcGFjZSAnc3RkJworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9lcyBub3QgbmFtZSBhIHR5cGUKK0JPT1NUX0RFRlVOKFtGb3JtYXRdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9mb3JtYXQuaHBwXSldKQorCisKKyMgQk9PU1RfRlVOQ1RJT04oKQorIyAtLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkZ1bmN0aW9uCitCT09TVF9ERUZVTihbRnVuY3Rpb25dLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9mdW5jdGlvbi5ocHBdKV0pCisKKworIyBCT09TVF9HRU9NRVRSWSgpCisjIC0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuR2VvbWV0cnkgKG5ldyBzaW5jZSAxLjQ3LjApLgorQk9PU1RfREVGVU4oW0dlb21ldHJ5XSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvZ2VvbWV0cnkuaHBwXSkKK10pIyBCT09TVF9HRU9NRVRSWQorCisKKyMgQk9PU1RfR1JBUEgoW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkdyYXBocy4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbR3JhcGhdLAorW2Jvb3N0X2dyYXBoX3NhdmVfTElCUz0kTElCUworYm9vc3RfZ3JhcGhfc2F2ZV9MREZMQUdTPSRMREZMQUdTCisjIExpbmstdGltZSBkZXBlbmRlbmN5IGZyb20gZ3JhcGggdG8gcmVnZXggd2FzIGFkZGVkIGFzIG9mIDEuNDAuMC4KK2lmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWdlIDE0MDsgdGhlbgorICBCT09TVF9SRUdFWChbJDFdKQorICBtNF9wYXR0ZXJuX2FsbG93KFteQk9PU1RfUkVHRVhfKExJQlN8TERGTEFHUykkXSlkbmwKKyAgTElCUz0iJExJQlMgJEJPT1NUX1JFR0VYX0xJQlMiCisgIExERkxBR1M9IiRMREZMQUdTICRCT09TVF9SRUdFWF9MREZMQUdTIgorZmkKK0JPT1NUX0ZJTkRfTElCKFtncmFwaF0sIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L2dyYXBoL2FkamFjZW5jeV9saXN0LmhwcF0sIFtib29zdDo6YWRqYWNlbmN5X2xpc3Q8PiBnO10pCitMSUJTPSRib29zdF9ncmFwaF9zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X2dyYXBoX3NhdmVfTERGTEFHUworXSkjIEJPT1NUX0dSQVBICisKKworIyBCT09TVF9JT1NUUkVBTVMoW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5JT1N0cmVhbXMuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW0lPU3RyZWFtc10sCitbQk9PU1RfRklORF9MSUIoW2lvc3RyZWFtc10sIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L2lvc3RyZWFtcy9kZXZpY2UvZmlsZV9kZXNjcmlwdG9yLmhwcF0sCisgICAgICAgICAgICAgICAgW2Jvb3N0Ojppb3N0cmVhbXM6OmZpbGVfZGVzY3JpcHRvciBmZDsgZmQuY2xvc2UoKTtdKQorXSkjIEJPT1NUX0lPU1RSRUFNUworCisKKyMgQk9PU1RfSEFTSCgpCisjIC0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5GdW5jdGlvbmFsL0hhc2gKK0JPT1NUX0RFRlVOKFtIYXNoXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvZnVuY3Rpb25hbC9oYXNoLmhwcF0pXSkKKworCisjIEJPT1NUX0xBTUJEQSgpCisjIC0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkxhbWJkYQorQk9PU1RfREVGVU4oW0xhbWJkYV0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L2xhbWJkYS9sYW1iZGEuaHBwXSldKQorCisKKyMgQk9PU1RfTE9DQUxFKCkKKyMgLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuTG9jYWxlCitCT09TVF9ERUZVTihbTG9jYWxlXSwKK1sKK2Jvb3N0X2xvY2FsZV9zYXZlX0xJQlM9JExJQlMKK2Jvb3N0X2xvY2FsZV9zYXZlX0xERkxBR1M9JExERkxBR1MKKyMgcmVxdWlyZSBTWVNURU0gZm9yIGJvb3N0LTEuNTAuMCBhbmQgdXAKK2lmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWdlIDE1MDsgdGhlbgorICBCT09TVF9TWVNURU0oWyQxXSkKKyAgbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX1NZU1RFTV8oTElCU3xMREZMQUdTKSRdKWRubAorICBMSUJTPSIkTElCUyAkQk9PU1RfU1lTVEVNX0xJQlMiCisgIExERkxBR1M9IiRMREZMQUdTICRCT09TVF9TWVNURU1fTERGTEFHUyIKK2ZpICMgZW5kIG9mIHRoZSBCb29zdC5TeXN0ZW0gY2hlY2suCitCT09TVF9GSU5EX0xJQihbbG9jYWxlXSwgWyQxXSwKKyAgICBbYm9vc3QvbG9jYWxlLmhwcF0sCisgICAgW1tib29zdDo6bG9jYWxlOjpnZW5lcmF0b3IgZ2VuOyBzdGQ6OmxvY2FsZTo6Z2xvYmFsKGdlbigiIikpO11dKQorTElCUz0kYm9vc3RfbG9jYWxlX3NhdmVfTElCUworTERGTEFHUz0kYm9vc3RfbG9jYWxlX3NhdmVfTERGTEFHUworXSkjIEJPT1NUX0xPQ0FMRQorCisjIEJPT1NUX0xPRyhbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkxvZy4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbTG9nXSwKK1tib29zdF9sb2dfc2F2ZV9MSUJTPSRMSUJTCitib29zdF9sb2dfc2F2ZV9MREZMQUdTPSRMREZMQUdTCitCT09TVF9TWVNURU0oWyQxXSkKK0JPT1NUX0ZJTEVTWVNURU0oWyQxXSkKK0JPT1NUX0RBVEVfVElNRShbJDFdKQorbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUXyhTWVNURU18RklMRVNZU1RFTXxEQVRFX1RJTUUpXyhMSUJTfExERkxBR1MpJF0pZG5sCitMSUJTPSIkTElCUyAkQk9PU1RfREFURV9USU1FX0xJQlMgJEJPT1NUX0ZJTEVTWVNURU1fTElCUyAkQk9PU1RfU1lTVEVNX0xJQlMiCitMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfREFURV9USU1FX0xERkxBR1MgJEJPT1NUX0ZJTEVTWVNURU1fTERGTEFHUyAkQk9PU1RfU1lTVEVNX0xERkxBR1MiCitCT09TVF9GSU5EX0xJQihbbG9nXSwgWyQxXSwKKyAgICBbYm9vc3QvbG9nL2NvcmUvY29yZS5ocHBdLAorICAgIFtib29zdDo6bG9nOjphdHRyaWJ1dGUgYTsgYS5nZXRfdmFsdWUoKTtdKQorTElCUz0kYm9vc3RfbG9nX3NhdmVfTElCUworTERGTEFHUz0kYm9vc3RfbG9nX3NhdmVfTERGTEFHUworXSkjIEJPT1NUX0xPRworCisKKyMgQk9PU1RfTE9HX1NFVFVQKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuTG9nLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsIHNlZSB0aGUKKyMgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4KK0JPT1NUX0RFRlVOKFtMb2dfU2V0dXBdLAorW2Jvb3N0X2xvZ19zZXR1cF9zYXZlX0xJQlM9JExJQlMKK2Jvb3N0X2xvZ19zZXR1cF9zYXZlX0xERkxBR1M9JExERkxBR1MKK0JPT1NUX0xPRyhbJDFdKQorbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX0xPR18oTElCU3xMREZMQUdTKSRdKWRubAorTElCUz0iJExJQlMgJEJPT1NUX0xPR19MSUJTIgorTERGTEFHUz0iJExERkxBR1MgJEJPT1NUX0xPR19MREZMQUdTIgorQk9PU1RfRklORF9MSUIoW2xvZ19zZXR1cF0sIFskMV0sCisgICAgW2Jvb3N0L2xvZy91dGlsaXR5L3NldHVwL2Zyb21fc2V0dGluZ3MuaHBwXSwKKyAgICBbYm9vc3Q6OmxvZzo6YmFzaWNfc2V0dGluZ3M8Y2hhcj4gYnM7IGJzLmVtcHR5KCk7XSkKK0xJQlM9JGJvb3N0X2xvZ19zZXR1cF9zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X2xvZ19zZXR1cF9zYXZlX0xERkxBR1MKK10pIyBCT09TVF9MT0dfU0VUVVAKKworCisjIEJPT1NUX01BVEgoKQorIyAtLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuTWF0aAorIyBUT0RPOiBUaGlzIGxpYnJhcnkgaXNuJ3QgaGVhZGVyLW9ubHkgYnV0IGl0IGNvbWVzIGluIG11bHRpcGxlIGRpZmZlcmVudAorIyBmbGF2b3JzIHRoYXQgZG9uJ3QgcGxheSB3ZWxsIHdpdGggQk9PU1RfRklORF9MSUIgKGUuZywgbGliYm9vc3RfbWF0aF9jOTksCisjIGxpYmJvb3N0X21hdGhfYzk5ZiwgbGliYm9vc3RfbWF0aF9jOTlsLCBsaWJib29zdF9tYXRoX3RyMSwKKyMgbGliYm9vc3RfbWF0aF90cjFmLCBsaWJib29zdF9tYXRoX3RyMWwpLiAgVGhpcyBtYWNybyBtdXN0IGJlIGZpeGVkIHRvIGRvIHRoZQorIyByaWdodCB0aGluZyBhbnl3YXkuCitCT09TVF9ERUZVTihbTWF0aF0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L21hdGgvc3BlY2lhbF9mdW5jdGlvbnMuaHBwXSldKQorCisKKyMgQk9PU1RfTVBJKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdCBNUEkuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLiAgVXNlcyBNUElDWFggdmFyaWFibGUgaWYgaXQgaXMKKyMgc2V0LCBvdGhlcndpc2UgdHJpZXMgQ1hYCisjCitCT09TVF9ERUZVTihbTVBJXSwKK1tib29zdF9zYXZlX0NYWD0ke0NYWH0KK2Jvb3N0X3NhdmVfQ1hYQ1BQPSR7Q1hYQ1BQfQoraWYgdGVzdCB4IiR7TVBJQ1hYfSIgIT0geDsgdGhlbgorICBDWFg9JHtNUElDWFh9CisgIENYWENQUD0iJHtNUElDWFh9IC1FIgorZmkKK0JPT1NUX0ZJTkRfTElCKFttcGldLCBbJDFdLAorICAgICAgICAgICAgICAgW2Jvb3N0L21waS5ocHBdLAorICAgICAgICAgICAgICAgW2ludCBhcmdjID0gMDsKKyAgICAgICAgICAgICAgICBjaGFyICoqYXJndiA9IDA7CisgICAgICAgICAgICAgICAgYm9vc3Q6Om1waTo6ZW52aXJvbm1lbnQgZW52KGFyZ2MsYXJndik7XSkKK0NYWD0ke2Jvb3N0X3NhdmVfQ1hYfQorQ1hYQ1BQPSR7Ym9vc3Rfc2F2ZV9DWFhDUFB9CitdKSMgQk9PU1RfTVBJCisKKworIyBCT09TVF9NVUxUSUFSUkFZKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0Lk11bHRpQXJyYXkKK0JPT1NUX0RFRlVOKFtNdWx0aUFycmF5XSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvbXVsdGlfYXJyYXkuaHBwXSldKQorCisKKyMgQk9PU1RfTlVNRVJJQ19VQkxBUygpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0Lk51bWVyaWNVYmxhcyAoQmFzaWMgTGluZWFyIEFsZ2VicmEpCitCT09TVF9ERUZVTihbTnVtZXJpY19VYmxhc10sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L251bWVyaWMvdWJsYXMvdmVjdG9yLmhwcF0pCitdKSMgQk9PU1RfTlVNRVJJQ19VQkxBUworCisKKyMgQk9PU1RfTlVNRVJJQ19DT05WRVJTSU9OKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuTnVtZXJpY0NvbnZlcnNpb24gKHBvbGljeS1iYXNlZCBudW1lcmljIGNvbnZlcnNpb24pCitCT09TVF9ERUZVTihbTnVtZXJpY19Db252ZXJzaW9uXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvbnVtZXJpYy9jb252ZXJzaW9uL2NvbnZlcnRlci5ocHBdKQorXSkjIEJPT1NUX05VTUVSSUNfQ09OVkVSU0lPTgorCisKKyMgQk9PU1RfT1BUSU9OQUwoKQorIyAtLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0Lk9wdGlvbmFsCitCT09TVF9ERUZVTihbT3B0aW9uYWxdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9vcHRpb25hbC5ocHBdKV0pCisKKworIyBCT09TVF9QUkVQUk9DRVNTT1IoKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5QcmVwcm9jZXNzb3IKK0JPT1NUX0RFRlVOKFtQcmVwcm9jZXNzb3JdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9wcmVwcm9jZXNzb3IvcmVwZWF0LmhwcF0pXSkKKworCisjIEJPT1NUX1JBTkdFKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuUmFuZ2UKK0JPT1NUX0RFRlVOKFtSYW5nZV0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3JhbmdlL2FkYXB0b3JzLmhwcF0pXSkKKworIyBCT09TVF9VTk9SREVSRUQoKQorIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5Vbm9yZGVyZWQKK0JPT1NUX0RFRlVOKFtVbm9yZGVyZWRdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC91bm9yZGVyZWRfbWFwLmhwcF0pXSkKKworCisjIEJPT1NUX1VVSUQoKQorIyAtLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuVXVpZAorQk9PU1RfREVGVU4oW1V1aWRdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC91dWlkL3V1aWQuaHBwXSldKQorCisKKyMgQk9PU1RfUFJPR1JBTV9PUFRJT05TKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuUHJvZ3JhbV9vcHRpb25zLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsCisjIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4KK0JPT1NUX0RFRlVOKFtQcm9ncmFtX09wdGlvbnNdLAorW0JPT1NUX0ZJTkRfTElCKFtwcm9ncmFtX29wdGlvbnNdLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9wcm9ncmFtX29wdGlvbnMuaHBwXSwKKyAgICAgICAgICAgICAgICBbYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6b3B0aW9uc19kZXNjcmlwdGlvbiBkKCJ0ZXN0Iik7XSkKK10pIyBCT09TVF9QUk9HUkFNX09QVElPTlMKKworCisKKyMgX0JPT1NUX1BZVEhPTl9DT05GSUcoVkFSSUFCTEUsIEZMQUcpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTYXZlIFZBUklBQkxFLCBhbmQgZGVmaW5lIGl0IHZpYSBgcHl0aG9uLWNvbmZpZyAtLUZMQUdgLgorIyBTdWJzdGl0dXRlIEJPT1NUX1BZVEhPTl9WQVJJQUJMRS4KK200X2RlZmluZShbX0JPT1NUX1BZVEhPTl9DT05GSUddLAorW0FDX1NVQlNUKFtCT09TVF9QWVRIT05fJDFdLAorICAgICAgICAgIFtgcHl0aG9uLWNvbmZpZyAtLSQyIDI+L2Rldi9udWxsYF0pZG5sCitib29zdF9weXRob25fc2F2ZV8kMT0kJDEKKyQxPSIkJDEgJEJPT1NUX1BZVEhPTl8kMSJdKQorCisKKyMgQk9PU1RfUFlUSE9OKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuUHl0aG9uLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsCisjIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4KK0JPT1NUX0RFRlVOKFtQeXRob25dLAorW19CT09TVF9QWVRIT05fQ09ORklHKFtDUFBGTEFHU10sIFtpbmNsdWRlc10pCitfQk9PU1RfUFlUSE9OX0NPTkZJRyhbTERGTEFHU10sICAgW2xkZmxhZ3NdKQorX0JPT1NUX1BZVEhPTl9DT05GSUcoW0xJQlNdLCAgICAgIFtsaWJzXSkKK200X3BhdHRlcm5fYWxsb3coW15CT09TVF9QWVRIT05fTU9EVUxFJF0pZG5sCitCT09TVF9GSU5EX0xJQlMoW3B5dGhvbl0sIFtweXRob24gcHl0aG9uM10sIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L3B5dGhvbi5ocHBdLAorICAgICAgICAgICAgICAgIFtdLCBbQk9PU1RfUFlUSE9OX01PRFVMRShlbXB0eSkge31dKQorQ1BQRkxBR1M9JGJvb3N0X3B5dGhvbl9zYXZlX0NQUEZMQUdTCitMREZMQUdTPSRib29zdF9weXRob25fc2F2ZV9MREZMQUdTCitMSUJTPSRib29zdF9weXRob25fc2F2ZV9MSUJTCitdKSMgQk9PU1RfUFlUSE9OCisKKworIyBCT09TVF9SRUYoKQorIyAtLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5SZWYKK0JPT1NUX0RFRlVOKFtSZWZdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9yZWYuaHBwXSldKQorCisKKyMgQk9PU1RfUkVHRVgoW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlJlZ2V4LiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsIHNlZSB0aGUKKyMgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4KK0JPT1NUX0RFRlVOKFtSZWdleF0sCitbQk9PU1RfRklORF9MSUIoW3JlZ2V4XSwgWyQxXSwKKyAgICAgICAgICAgICAgICBbYm9vc3QvcmVnZXguaHBwXSwKKyAgICAgICAgICAgICAgICBbYm9vc3Q6OnJlZ2V4IGV4cCgiKiIpOyBib29zdDo6cmVnZXhfbWF0Y2goImZvbyIsIGV4cCk7XSkKK10pIyBCT09TVF9SRUdFWAorCisKKyMgQk9PU1RfU0VSSUFMSVpBVElPTihbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5TZXJpYWxpemF0aW9uLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsIHNlZQorIyB0aGUgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4KK0JPT1NUX0RFRlVOKFtTZXJpYWxpemF0aW9uXSwKK1tCT09TVF9GSU5EX0xJQihbc2VyaWFsaXphdGlvbl0sIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L2FyY2hpdmUvdGV4dF9vYXJjaGl2ZS5ocHBdLAorICAgICAgICAgICAgICAgIFtzdGQ6Om9zdHJlYW0qIG8gPSAwOyAvLyBDaGVhcCB3YXkgdG8gZ2V0IGFuIG9zdHJlYW0uLi4KKyAgICAgICAgICAgICAgICBib29zdDo6YXJjaGl2ZTo6dGV4dF9vYXJjaGl2ZSB0KCpvKTtdKQorXSkjIEJPT1NUX1NFUklBTElaQVRJT04KKworCisjIEJPT1NUX1NJR05BTFMoW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuU2lnbmFscy4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbU2lnbmFsc10sCitbQk9PU1RfRklORF9MSUIoW3NpZ25hbHNdLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9zaWduYWwuaHBwXSwKKyAgICAgICAgICAgICAgICBbYm9vc3Q6OnNpZ25hbDx2b2lkICgpPiBzO10pCitdKSMgQk9PU1RfU0lHTkFMUworCisKKyMgQk9PU1RfU0lHTkFMUzIoKQorIyAtLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlNpZ25hbHMyIChuZXcgc2luY2UgMS4zOS4wKS4KK0JPT1NUX0RFRlVOKFtTaWduYWxzMl0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3NpZ25hbHMyLmhwcF0pCitdKSMgQk9PU1RfU0lHTkFMUzIKKworCisjIEJPT1NUX1NNQVJUX1BUUigpCisjIC0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlNtYXJ0UHRyCitCT09TVF9ERUZVTihbU21hcnRfUHRyXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3Qvc2NvcGVkX3B0ci5ocHBdKQorQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3NoYXJlZF9wdHIuaHBwXSkKK10pCisKKworIyBCT09TVF9TVEFUSUNBU1NFUlQoKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5TdGF0aWNBc3NlcnQKK0JPT1NUX0RFRlVOKFtTdGF0aWNBc3NlcnRdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9zdGF0aWNfYXNzZXJ0LmhwcF0pXSkKKworCisjIEJPT1NUX1NUUklOR19BTEdPKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5TdHJpbmdBbGdvCitCT09TVF9ERUZVTihbU3RyaW5nX0FsZ29dLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9hbGdvcml0aG0vc3RyaW5nLmhwcF0pCitdKQorCisKKyMgQk9PU1RfU1lTVEVNKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuU3lzdGVtLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsIHNlZSB0aGUKKyMgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4gIFRoaXMgbGlicmFyeSB3YXMgaW50cm9kdWNlZCBpbiBCb29zdAorIyAxLjM1LjAuCitCT09TVF9ERUZVTihbU3lzdGVtXSwKK1tCT09TVF9GSU5EX0xJQihbc3lzdGVtXSwgWyQxXSwKKyAgICAgICAgICAgICAgICBbYm9vc3Qvc3lzdGVtL2Vycm9yX2NvZGUuaHBwXSwKKyAgICAgICAgICAgICAgICBbYm9vc3Q6OnN5c3RlbTo6ZXJyb3JfY29kZSBlOyBlLmNsZWFyKCk7XSkKK10pIyBCT09TVF9TWVNURU0KKworCisjIEJPT1NUX1RFU1QoW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuVGVzdC4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbVGVzdF0sCitbbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX0NIRUNLJF0pZG5sCitCT09TVF9GSU5EX0xJQihbdW5pdF90ZXN0X2ZyYW1ld29ya10sIFskMV0sCisgICAgICAgICAgICAgICBbYm9vc3QvdGVzdC91bml0X3Rlc3QuaHBwXSwgW0JPT1NUX0NIRUNLKDIgPT0gMik7XSwKKyAgICAgICAgICAgICAgIFt1c2luZyBib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlOworICAgICAgICAgICAgICAgdGVzdF9zdWl0ZSogaW5pdF91bml0X3Rlc3Rfc3VpdGUoaW50IGFyZ2MsIGNoYXIgKiogYXJndikKKyAgICAgICAgICAgICAgIHsgcmV0dXJuIE5VTEw7IH1dKQorXSkjIEJPT1NUX1RFU1QKKworCisjIEJPT1NUX1RIUkVBRChbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5UaHJlYWQuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW1RocmVhZF0sCitbZG5sIEhhdmluZyB0aGUgcHRocmVhZCBmbGFnIGlzIHJlcXVpcmVkIGF0IGxlYXN0IG9uIEdDQzMgd2hlcmUKK2RubCBib29zdC90aHJlYWQuaHBwIHdvdWxkIGNvbXBsYWluIGlmIHdlIHRyeSB0byBjb21waWxlIHdpdGhvdXQKK2RubCAtcHRocmVhZCBvbiBHTlUvTGludXguCitBQ19SRVFVSVJFKFtfQk9PU1RfUFRIUkVBRF9GTEFHXSlkbmwKK2Jvb3N0X3RocmVhZF9zYXZlX0xJQlM9JExJQlMKK2Jvb3N0X3RocmVhZF9zYXZlX0xERkxBR1M9JExERkxBR1MKK2Jvb3N0X3RocmVhZF9zYXZlX0NQUEZMQUdTPSRDUFBGTEFHUworIyBMaW5rLXRpbWUgZGVwZW5kZW5jeSBmcm9tIHRocmVhZCB0byBzeXN0ZW0gd2FzIGFkZGVkIGFzIG9mIDEuNDkuMC4KK2lmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWdlIDE0OTsgdGhlbgorQk9PU1RfU1lTVEVNKFskMV0pCitmaSAjIGVuZCBvZiB0aGUgQm9vc3QuU3lzdGVtIGNoZWNrLgorbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX1NZU1RFTV8oTElCU3xMREZMQUdTKSRdKWRubAorTElCUz0iJExJQlMgJEJPT1NUX1NZU1RFTV9MSUJTICRib29zdF9jdl9wdGhyZWFkX2ZsYWciCitMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfU1lTVEVNX0xERkxBR1MiCitDUFBGTEFHUz0iJENQUEZMQUdTICRib29zdF9jdl9wdGhyZWFkX2ZsYWciCisKKyMgV2hlbiBjb21waWxpbmcgZm9yIHRoZSBXaW5kb3dzIHBsYXRmb3JtLCB0aGUgdGhyZWFkcyBsaWJyYXJ5IGlzIG5hbWVkCisjIGRpZmZlcmVudGx5LiAgVGhpcyBzdWZmaXggZG9lc24ndCBleGlzdCBpbiBuZXcgdmVyc2lvbnMgb2YgQm9vc3QsIG9yCisjIHBvc3NpYmx5IG5ldyB2ZXJzaW9ucyBvZiBHQ0Mgb24gbWluZ3cgSSBhbSBhc3N1bWluZyBpdCdzIEJvb3N0J3MgY2hhbmdlIGZvcgorIyBub3cgYW5kIEkgYW0gc2V0dGluZyB2ZXJzaW9uIHRvIDEuNDgsIGZvciBsYWNrIG9mIGtub3dsZWRnZSBhcyB0byB3aGVuIHRoaXMKKyMgY2hhbmdlIG9jY3VycmVkLgoraWYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtbHQgMTQ4OyB0aGVuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAoKm1pbmd3KikgYm9vc3RfdGhyZWFkX2xpYl9leHQ9X3dpbjMyOzsKKyAgZXNhYworZmkKK0JPT1NUX0ZJTkRfTElCUyhbdGhyZWFkXSwgW3RocmVhZCRib29zdF90aHJlYWRfbGliX2V4dF0sCisgICAgICAgICAgICAgICAgWyQxXSwKKyAgICAgICAgICAgICAgICBbYm9vc3QvdGhyZWFkLmhwcF0sIFtib29zdDo6dGhyZWFkIHQ7IGJvb3N0OjptdXRleCBtO10pCisKK2Nhc2UgJGhvc3Rfb3MgaW4KKyAgKCptaW5ndyopIGJvb3N0X3RocmVhZF93MzJfc29ja2V0X2xpbms9LWx3czJfMzI7OworZXNhYworCitCT09TVF9USFJFQURfTElCUz0iJEJPT1NUX1RIUkVBRF9MSUJTICRCT09TVF9TWVNURU1fTElCUyAkYm9vc3RfY3ZfcHRocmVhZF9mbGFnICRib29zdF90aHJlYWRfdzMyX3NvY2tldF9saW5rIgorQk9PU1RfVEhSRUFEX0xERkxBR1M9IiRCT09TVF9TWVNURU1fTERGTEFHUyIKK0JPT1NUX0NQUEZMQUdTPSIkQk9PU1RfQ1BQRkxBR1MgJGJvb3N0X2N2X3B0aHJlYWRfZmxhZyIKK0xJQlM9JGJvb3N0X3RocmVhZF9zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X3RocmVhZF9zYXZlX0xERkxBR1MKK0NQUEZMQUdTPSRib29zdF90aHJlYWRfc2F2ZV9DUFBGTEFHUworXSkjIEJPT1NUX1RIUkVBRAorCitBVV9BTElBUyhbQk9PU1RfVEhSRUFEU10sIFtCT09TVF9USFJFQURdKQorCisKKyMgQk9PU1RfVE9LRU5JWkVSKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuVG9rZW5pemVyCitCT09TVF9ERUZVTihbVG9rZW5pemVyXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvdG9rZW5pemVyLmhwcF0pXSkKKworCisjIEJPT1NUX1RSSUJPT0woKQorIyAtLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuVHJpYm9vbAorQk9PU1RfREVGVU4oW1RyaWJvb2xdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9sb2dpYy90cmlib29sX2Z3ZC5ocHBdKQorQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L2xvZ2ljL3RyaWJvb2wuaHBwXSkKK10pCisKKworIyBCT09TVF9UVVBMRSgpCisjIC0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuVHVwbGUKK0JPT1NUX0RFRlVOKFtUdXBsZV0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3R1cGxlL3R1cGxlLmhwcF0pXSkKKworCisjIEJPT1NUX1RZUEVUUkFJVFMoKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5UeXBlVHJhaXRzCitCT09TVF9ERUZVTihbVHlwZVRyYWl0c10sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3R5cGVfdHJhaXRzLmhwcF0pXSkKKworCisjIEJPT1NUX1VUSUxJVFkoKQorIyAtLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuVXRpbGl0eSAobm9uY29weWFibGUsIHJlc3VsdF9vZiwgYmFzZS1mcm9tLW1lbWJlciBpZGlvbSwKKyMgZXRjLikKK0JPT1NUX0RFRlVOKFtVdGlsaXR5XSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvdXRpbGl0eS5ocHBdKV0pCisKKworIyBCT09TVF9WQVJJQU5UKCkKKyMgLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlZhcmlhbnQuCitCT09TVF9ERUZVTihbVmFyaWFudF0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3ZhcmlhbnQvdmFyaWFudF9md2QuaHBwXSkKK0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC92YXJpYW50LmhwcF0pXSkKKworCisjIEJPT1NUX1BPSU5URVJfQ09OVEFJTkVSKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlBvaW50ZXJDb250YWluZXIKK0JPT1NUX0RFRlVOKFtQb2ludGVyX0NvbnRhaW5lcl0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3B0cl9jb250YWluZXIvcHRyX2RlcXVlLmhwcF0pCitCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvcHRyX2NvbnRhaW5lci9wdHJfbGlzdC5ocHBdKQorQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3B0cl9jb250YWluZXIvcHRyX3ZlY3Rvci5ocHBdKQorQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3B0cl9jb250YWluZXIvcHRyX2FycmF5LmhwcF0pCitCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvcHRyX2NvbnRhaW5lci9wdHJfc2V0LmhwcF0pCitCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvcHRyX2NvbnRhaW5lci9wdHJfbWFwLmhwcF0pCitdKSMgQk9PU1RfUE9JTlRFUl9DT05UQUlORVIKKworCisjIEJPT1NUX1dBVkUoW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTk9URTogSWYgeW91IGludGVuZCB0byB1c2UgV2F2ZS9TcGlyaXQgd2l0aCB0aHJlYWQgc3VwcG9ydCwgbWFrZSBzdXJlIHlvdQorIyBjYWxsIEJPT1NUX1RIUkVBRCBmaXJzdC4KKyMgTG9vayBmb3IgQm9vc3QuV2F2ZS4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbV2F2ZV0sCitbQUNfUkVRVUlSRShbQk9PU1RfRklMRVNZU1RFTV0pZG5sCitBQ19SRVFVSVJFKFtCT09TVF9EQVRFX1RJTUVdKWRubAorYm9vc3Rfd2F2ZV9zYXZlX0xJQlM9JExJQlMKK2Jvb3N0X3dhdmVfc2F2ZV9MREZMQUdTPSRMREZMQUdTCittNF9wYXR0ZXJuX2FsbG93KFteQk9PU1RfKChGSUxFKT9TWVNURU18REFURV9USU1FfFRIUkVBRClfKExJQlN8TERGTEFHUykkXSlkbmwKK0xJQlM9IiRMSUJTICRCT09TVF9TWVNURU1fTElCUyAkQk9PU1RfRklMRVNZU1RFTV9MSUJTICRCT09TVF9EQVRFX1RJTUVfTElCUyBcCiskQk9PU1RfVEhSRUFEX0xJQlMiCitMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfU1lTVEVNX0xERkxBR1MgJEJPT1NUX0ZJTEVTWVNURU1fTERGTEFHUyBcCiskQk9PU1RfREFURV9USU1FX0xERkxBR1MgJEJPT1NUX1RIUkVBRF9MREZMQUdTIgorQk9PU1RfRklORF9MSUIoW3dhdmVdLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC93YXZlLmhwcF0sCisgICAgICAgICAgICAgICAgW2Jvb3N0Ojp3YXZlOjp0b2tlbl9pZCBpZDsgZ2V0X3Rva2VuX25hbWUoaWQpO10pCitMSUJTPSRib29zdF93YXZlX3NhdmVfTElCUworTERGTEFHUz0kYm9vc3Rfd2F2ZV9zYXZlX0xERkxBR1MKK10pIyBCT09TVF9XQVZFCisKKworIyBCT09TVF9YUFJFU1NJVkUoKQorIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5YcHJlc3NpdmUgKG5ldyBzaW5jZSAxLjM2LjApLgorQk9PU1RfREVGVU4oW1hwcmVzc2l2ZV0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3hwcmVzc2l2ZS94cHJlc3NpdmUuaHBwXSldKQorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0gIworIyBJbnRlcm5hbCBoZWxwZXJzLiAjCisjIC0tLS0tLS0tLS0tLS0tLS0tICMKKworCisjIF9CT09TVF9QVEhSRUFEX0ZMQUcoKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSW50ZXJuYWwgaGVscGVyIGZvciBCT09TVF9USFJFQUQuICBDb21wdXRlcyBib29zdF9jdl9wdGhyZWFkX2ZsYWcKKyMgd2hpY2ggbXVzdCBiZSB1c2VkIGluIENQUEZMQUdTIGFuZCBMSUJTLgorIworIyBZZXMsIHdlICpuZWVkKiB0byBwdXQgdGhlIC1wdGhyZWFkIHRoaW5nIGluIENQUEZMQUdTIGJlY2F1c2Ugd2l0aCBHQ0MzLAorIyBib29zdC90aHJlYWQuaHBwIHdpbGwgdHJpZ2dlciBhICNlcnJvciBpZiAtcHRocmVhZCBpc24ndCB1c2VkOgorIyAgIGJvb3N0L2NvbmZpZy9yZXF1aXJlc190aHJlYWRzLmhwcDo0Nzo1OiAjZXJyb3IgIkNvbXBpbGVyIHRocmVhZGluZyBzdXBwb3J0CisjICAgaXMgbm90IHR1cm5lZCBvbi4gUGxlYXNlIHNldCB0aGUgY29ycmVjdCBjb21tYW5kIGxpbmUgb3B0aW9ucyBmb3IKKyMgICB0aHJlYWRpbmc6IC1wdGhyZWFkIChMaW51eCksIC1wdGhyZWFkcyAoU29sYXJpcykgb3IgLW10aHJlYWRzIChNaW5ndzMyKSIKKyMKKyMgQmFzZWQgb24gQUNYX1BUSFJFQUQ6IGh0dHA6Ly9hdXRvY29uZi1hcmNoaXZlLmNyeXAudG8vYWN4X3B0aHJlYWQuaHRtbAorQUNfREVGVU4oW19CT09TVF9QVEhSRUFEX0ZMQUddLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfQ1hYXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK0FDX0xBTkdfUFVTSChbQysrXSlkbmwKK0FDX0NBQ0hFX0NIRUNLKFtmb3IgdGhlIGZsYWdzIG5lZWRlZCB0byB1c2UgcHRocmVhZHNdLCBbYm9vc3RfY3ZfcHRocmVhZF9mbGFnXSwKK1sgYm9vc3RfY3ZfcHRocmVhZF9mbGFnPQorICAjIFRoZSBvcmRlcmluZyAqaXMqIChzb21ldGltZXMpIGltcG9ydGFudC4gIFNvbWUgbm90ZXMgb24gdGhlCisgICMgaW5kaXZpZHVhbCBpdGVtcyBmb2xsb3c6CisgICMgKG5vbmUpOiBpbiBjYXNlIHRocmVhZHMgYXJlIGluIGxpYmM7IHNob3VsZCBiZSB0cmllZCBiZWZvcmUgLUt0aHJlYWQgYW5kCisgICMgICAgICAgb3RoZXIgY29tcGlsZXIgZmxhZ3MgdG8gcHJldmVudCBjb250aW51YWwgY29tcGlsZXIgd2FybmluZ3MKKyAgIyAtbHB0aHJlYWRzOiBBSVggKG11c3QgY2hlY2sgdGhpcyBiZWZvcmUgLWxwdGhyZWFkKQorICAjIC1LdGhyZWFkOiBTZXF1ZW50ICh0aHJlYWRzIGluIGxpYmMsIGJ1dCAtS3RocmVhZCBuZWVkZWQgZm9yIHB0aHJlYWQuaCkKKyAgIyAta3RocmVhZDogRnJlZUJTRCBrZXJuZWwgdGhyZWFkcyAocHJlZmVycmVkIHRvIC1wdGhyZWFkIHNpbmNlIFNNUC1hYmxlKQorICAjIC1sbHRocmVhZDogTGludXhUaHJlYWRzIHBvcnQgb24gRnJlZUJTRCAoYWxzbyBwcmVmZXJyZWQgdG8gLXB0aHJlYWQpCisgICMgLXB0aHJlYWQ6IEdOVSBMaW51eC9HQ0MgKGtlcm5lbCB0aHJlYWRzKSwgQlNEL0dDQyAodXNlcmxhbmQgdGhyZWFkcykKKyAgIyAtcHRocmVhZHM6IFNvbGFyaXMvR0NDCisgICMgLW10aHJlYWRzOiBNaW5HVzMyL0dDQywgTHlueC9HQ0MKKyAgIyAtbXQ6IFN1biBXb3Jrc2hvcCBDIChtYXkgb25seSBsaW5rIFN1bk9TIHRocmVhZHMgWy1sdGhyZWFkXSwgYnV0IGl0CisgICMgICAgICBkb2Vzbid0IGh1cnQgdG8gY2hlY2sgc2luY2UgdGhpcyBzb21ldGltZXMgZGVmaW5lcyBwdGhyZWFkcyB0b287CisgICMgICAgICBhbHNvIGRlZmluZXMgLURfUkVFTlRSQU5UKQorICAjICAgICAgLi4uIC1tdCBpcyBhbHNvIHRoZSBwdGhyZWFkcyBmbGFnIGZvciBIUC9hQ0MKKyAgIyAtbHB0aHJlYWQ6IEdOVSBMaW51eCwgZXRjLgorICAjIC0tdGhyZWFkLXNhZmU6IEtBSSBDKysKKyAgY2FzZSAkaG9zdF9vcyBpbiAjKAorICAgICpzb2xhcmlzKikKKyAgICAgICMgT24gU29sYXJpcyAoYXQgbGVhc3QsIGZvciBzb21lIHZlcnNpb25zKSwgbGliYyBjb250YWlucyBzdHViYmVkCisgICAgICAjIChub24tZnVuY3Rpb25hbCkgdmVyc2lvbnMgb2YgdGhlIHB0aHJlYWRzIHJvdXRpbmVzLCBzbyBsaW5rLWJhc2VkCisgICAgICAjIHRlc3RzIHdpbGwgZXJyb25lb3VzbHkgc3VjY2VlZC4gIChXZSBuZWVkIHRvIGxpbmsgd2l0aCAtcHRocmVhZHMvLW10LworICAgICAgIyAtbHB0aHJlYWQuKSAgKFRoZSBzdHVicyBhcmUgbWlzc2luZyBwdGhyZWFkX2NsZWFudXBfcHVzaCwgb3IgcmF0aGVyCisgICAgICAjIGEgZnVuY3Rpb24gY2FsbGVkIGJ5IHRoaXMgbWFjcm8sIHNvIHdlIGNvdWxkIGNoZWNrIGZvciB0aGF0LCBidXQKKyAgICAgICMgd2hvIGtub3dzIHdoZXRoZXIgdGhleSdsbCBzdHViIHRoYXQgdG9vIGluIGEgZnV0dXJlIGxpYmMuKSAgU28sCisgICAgICAjIHdlJ2xsIGp1c3QgbG9vayBmb3IgLXB0aHJlYWRzIGFuZCAtbHB0aHJlYWQgZmlyc3Q6CisgICAgICBib29zdF9wdGhyZWFkX2ZsYWdzPSItcHRocmVhZHMgLWxwdGhyZWFkIC1tdCAtcHRocmVhZCI7OyAjKAorICAgICopCisgICAgICBib29zdF9wdGhyZWFkX2ZsYWdzPSItbHB0aHJlYWRzIC1LdGhyZWFkIC1rdGhyZWFkIC1sbHRocmVhZCAtcHRocmVhZCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAtcHRocmVhZHMgLW10aHJlYWRzIC1scHRocmVhZCAtLXRocmVhZC1zYWZlIC1tdCI7OworICBlc2FjCisgICMgR2VuZXJhdGUgdGhlIHRlc3QgZmlsZS4KKyAgQUNfTEFOR19DT05GVEVTVChbQUNfTEFOR19QUk9HUkFNKFsjaW5jbHVkZSA8cHRocmVhZC5oPl0sCisgICAgW3B0aHJlYWRfdCB0aDsgcHRocmVhZF9qb2luKHRoLCAwKTsKKyAgICBwdGhyZWFkX2F0dHJfaW5pdCgwKTsgcHRocmVhZF9jbGVhbnVwX3B1c2goMCwgMCk7CisgICAgcHRocmVhZF9jcmVhdGUoMCwwLDAsMCk7IHB0aHJlYWRfY2xlYW51cF9wb3AoMCk7XSldKQorICBmb3IgYm9vc3RfcHRocmVhZF9mbGFnIGluICcnICRib29zdF9wdGhyZWFkX2ZsYWdzOyBkbworICAgIGJvb3N0X3B0aHJlYWRfb2s9ZmFsc2UKK2RubCBSZS11c2UgdGhlIHRlc3QgZmlsZSBhbHJlYWR5IGdlbmVyYXRlZC4KKyAgICBib29zdF9wdGhyZWFkc19fc2F2ZV9MSUJTPSRMSUJTCisgICAgTElCUz0iJExJQlMgJGJvb3N0X3B0aHJlYWRfZmxhZyIKKyAgICBBQ19MSU5LX0lGRUxTRShbXSwKKyAgICAgIFtpZiBncmVwICIuKiRib29zdF9wdGhyZWFkX2ZsYWciIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgICAgICAgZWNobyAiVGhpcyBmbGFnIHNlZW1zIHRvIGhhdmUgdHJpZ2dlcmVkIHdhcm5pbmdzIiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgICAgZWxzZQorICAgICAgICAgYm9vc3RfcHRocmVhZF9vaz06OyBib29zdF9jdl9wdGhyZWFkX2ZsYWc9JGJvb3N0X3B0aHJlYWRfZmxhZworICAgICAgIGZpXSkKKyAgICBMSUJTPSRib29zdF9wdGhyZWFkc19fc2F2ZV9MSUJTCisgICAgJGJvb3N0X3B0aHJlYWRfb2sgJiYgYnJlYWsKKyAgZG9uZQorXSkKK0FDX0xBTkdfUE9QKFtDKytdKWRubAorXSkjIF9CT09TVF9QVEhSRUFEX0ZMQUcKKworCisjIF9CT09TVF9nY2NfdGVzdChNQUpPUiwgTUlOT1IpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEludGVybmFsIGhlbHBlciBmb3IgX0JPT1NUX0ZJTkRfQ09NUElMRVJfVEFHLgorbTRfZGVmaW5lKFtfQk9PU1RfZ2NjX3Rlc3RdLAorWyJkZWZpbmVkIF9fR05VQ19fICYmIF9fR05VQ19fID09ICQxICYmIF9fR05VQ19NSU5PUl9fID09ICQyICYmICFkZWZpbmVkIF9fSUNDIEAgZ2NjJDEkMiJdKWRubAorCisjIF9CT09TVF9taW5nd190ZXN0KE1BSk9SLCBNSU5PUikKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSW50ZXJuYWwgaGVscGVyIGZvciBfQk9PU1RfRklORF9DT01QSUxFUl9UQUcuCittNF9kZWZpbmUoW19CT09TVF9taW5nd190ZXN0XSwKK1siZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA9PSAkMSAmJiBfX0dOVUNfTUlOT1JfXyA9PSAkMiAmJiAhZGVmaW5lZCBfX0lDQyAmJiBcCisgIChkZWZpbmVkIFdJTjMyIHx8IGRlZmluZWQgV0lOTlQgfHwgZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX1dJTjMyIFwKKyAgICAgICAgIHx8IGRlZmluZWQgX19XSU4zMl9fIHx8IGRlZmluZWQgX19XSU5OVCB8fCBkZWZpbmVkIF9fV0lOTlRfXykgQCBtZ3ckMSQyIl0pZG5sCisKKworIyBfQk9PU1RfRklORF9DT01QSUxFUl9UQUcoKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBJbnRlcm5hbC4gIFdoZW4gQm9vc3QgaXMgaW5zdGFsbGVkIHdpdGhvdXQgLS1sYXlvdXQ9c3lzdGVtLCBlYWNoIGxpYnJhcnkKKyMgZmlsZW5hbWUgd2lsbCBob2xkIGEgc3VmZml4IHRoYXQgZW5jb2RlcyB0aGUgY29tcGlsZXIgdXNlZCBkdXJpbmcgdGhlCisjIGJ1aWxkLiAgVGhlIEJvb3N0IGJ1aWxkIHN5c3RlbSBzZWVtcyB0byBjYWxsIHRoaXMgYSBgdGFnJy4KK0FDX0RFRlVOKFtfQk9PU1RfRklORF9DT01QSUxFUl9UQUddLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfQ1hYXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK0FDX0NBQ0hFX0NIRUNLKFtmb3IgdGhlIHRvb2xzZXQgbmFtZSB1c2VkIGJ5IEJvb3N0IGZvciAkQ1hYXSwKKyAgICAgICAgICAgICAgIFtib29zdF9jdl9saWJfdGFnXSwKK1tib29zdF9jdl9saWJfdGFnPXVua25vd24KK2lmIHRlc3QgeCRib29zdF9jdl9pbmNfcGF0aCAhPSB4bm87IHRoZW4KKyAgQUNfTEFOR19QVVNIKFtDKytdKWRubAorICAjIFRoZSBmb2xsb3dpbmcgdGVzdHMgYXJlIG1vc3RseSBpbnNwaXJlZCBieSBib29zdC9jb25maWcvYXV0b19saW5rLmhwcAorICAjIFRoZSBsaXN0IGlzIHNvcnRlZCB0byBtb3N0IHJlY2VudC9jb21tb24gdG8gb2xkZXN0IGNvbXBpbGVyIChpbiBvcmRlcgorICAjIHRvIGluY3JlYXNlIHRoZSBsaWtlbGlob29kIG9mIGZpbmRpbmcgdGhlIHJpZ2h0IGNvbXBpbGVyIHdpdGggdGhlCisgICMgbGVhc3QgbnVtYmVyIG9mIGNvbXBpbGF0aW9uIGF0dGVtcHQpLgorICAjIEJld2FyZSB0aGF0IHNvbWUgdGVzdHMgYXJlIHNlbnNpYmxlIHRvIHRoZSBvcmRlciAoZm9yIGluc3RhbmNlLCB3ZSBtdXN0CisgICMgbG9vayBmb3IgTWluR1cgYmVmb3JlIGxvb2tpbmcgZm9yIEdDQzMpLgorICAjIEkgdXNlZCBvbmUgY29tcGlsYXRpb24gdGVzdCBwZXIgY29tcGlsZXIgd2l0aCBhICNlcnJvciB0byByZWNvZ25pemUKKyAgIyBlYWNoIGNvbXBpbGVyIHNvIHRoYXQgaXQgd29ya3MgZXZlbiB3aGVuIGNyb3NzLWNvbXBpbGluZyAobGV0IG1lIGtub3cKKyAgIyBpZiB5b3Uga25vdyBhIGJldHRlciBhcHByb2FjaCkuCisgICMgS25vd24gbWlzc2luZyB0YWdzIChrbm93biBmcm9tIEJvb3N0J3MgdG9vbHMvYnVpbGQvdjIvdG9vbHMvY29tbW9uLmphbSk6CisgICMgICBjb21vLCBlZGcsIGtjYywgYmNrLCBtcCwgc3csIHRydSwgeGxjCisgICMgSSdtIG5vdCBzdXJlIGFib3V0IG15IHRlc3QgZm9yIGBpbCcgKGJlIGNhcmVmdWw6IEludGVsJ3MgSUNDIHByZS1kZWZpbmVzCisgICMgdGhlIHNhbWUgZGVmaW5lcyBhcyBHQ0MncykuCisgIGZvciBpIGluIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg1LCAzKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDUsIDMpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg1LCAyKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDUsIDIpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg1LCAxKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDUsIDEpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg1LCAwKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDUsIDApIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCAxMCkgXAorICAgIF9CT09TVF9nY2NfdGVzdCg0LCAxMCkgXAorICAgIF9CT09TVF9taW5nd190ZXN0KDQsIDkpIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoNCwgOSkgXAorICAgIF9CT09TVF9taW5nd190ZXN0KDQsIDgpIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoNCwgOCkgXAorICAgIF9CT09TVF9taW5nd190ZXN0KDQsIDcpIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoNCwgNykgXAorICAgIF9CT09TVF9taW5nd190ZXN0KDQsIDYpIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoNCwgNikgXAorICAgIF9CT09TVF9taW5nd190ZXN0KDQsIDUpIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoNCwgNSkgXAorICAgIF9CT09TVF9taW5nd190ZXN0KDQsIDQpIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoNCwgNCkgXAorICAgIF9CT09TVF9taW5nd190ZXN0KDQsIDMpIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoNCwgMykgXAorICAgIF9CT09TVF9taW5nd190ZXN0KDQsIDIpIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoNCwgMikgXAorICAgIF9CT09TVF9taW5nd190ZXN0KDQsIDEpIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoNCwgMSkgXAorICAgIF9CT09TVF9taW5nd190ZXN0KDQsIDApIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoNCwgMCkgXAorICAgICJkZWZpbmVkIF9fR05VQ19fICYmIF9fR05VQ19fID09IDMgJiYgIWRlZmluZWQgX19JQ0MgXAorICAgICAmJiAoZGVmaW5lZCBXSU4zMiB8fCBkZWZpbmVkIFdJTk5UIHx8IGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMiBcCisgICAgICAgICB8fCBkZWZpbmVkIF9fV0lOMzJfXyB8fCBkZWZpbmVkIF9fV0lOTlQgfHwgZGVmaW5lZCBfX1dJTk5UX18pIEAgbWd3IiBcCisgICAgX0JPT1NUX2djY190ZXN0KDMsIDQpIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoMywgMykgXAorICAgICJkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSID49IDE1MDAgQCB2YzkwIiBcCisgICAgImRlZmluZWQgX01TQ19WRVIgJiYgX01TQ19WRVIgPT0gMTQwMCBAIHZjODAiIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoMywgMikgXAorICAgICJkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSID09IDEzMTAgQCB2YzcxIiBcCisgICAgX0JPT1NUX2djY190ZXN0KDMsIDEpIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoMywgMCkgXAorICAgICJkZWZpbmVkIF9fQk9STEFORENfXyBAIGJjYiIgXAorICAgICJkZWZpbmVkIF9fSUNDICYmIChkZWZpbmVkIF9fdW5peCB8fCBkZWZpbmVkIF9fdW5peF9fKSBAIGlsIiBcCisgICAgImRlZmluZWQgX19JQ0wgQCBpdyIgXAorICAgICJkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSID09IDEzMDAgQCB2YzciIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoMiwgOTUpIFwKKyAgICAiZGVmaW5lZCBfX01XRVJLU19fICYmIF9fTVdFUktTX18gPD0gMHgzMkZGIEAgY3c5IiBcCisgICAgImRlZmluZWQgX01TQ19WRVIgJiYgX01TQ19WRVIgPCAxMzAwICYmICFkZWZpbmVkIFVOREVSX0NFIEAgdmM2IiBcCisgICAgImRlZmluZWQgX01TQ19WRVIgJiYgX01TQ19WRVIgPCAxMzAwICYmIGRlZmluZWQgVU5ERVJfQ0UgQCBldmM0IiBcCisgICAgImRlZmluZWQgX19NV0VSS1NfXyAmJiBfX01XRVJLU19fIDw9IDB4MzFGRiBAIGN3OCIKKyAgZG8KKyAgICBib29zdF90YWdfdGVzdD1gZXhwciAiWCRpIiA6ICdYXChbW15AXV0qXCkgQCAnYAorICAgIGJvb3N0X3RhZz1gZXhwciAiWCRpIiA6ICdYW1teQF1dKiBAIFwoLipcKSdgCisgICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWworI2lmICRib29zdF90YWdfdGVzdAorLyogT0sgKi8KKyNlbHNlCisjIGVycm9yICRib29zdF90YWdfdGVzdAorI2VuZGlmCitdXSldLCBbYm9vc3RfY3ZfbGliX3RhZz0kYm9vc3RfdGFnOyBicmVha10sIFtdKQorICBkb25lCitBQ19MQU5HX1BPUChbQysrXSlkbmwKKyAgY2FzZSAkYm9vc3RfY3ZfbGliX3RhZyBpbiAjKAorICAgICMgU29tZSBuZXdlciAoPj0gMS4zNT8pIHZlcnNpb25zIG9mIEJvb3N0IHNlZW0gdG8gb25seSB1c2UgImdjYyIgYXMgb3Bwb3NlZAorICAgICMgdG8gImdjYzQxIiBmb3IgaW5zdGFuY2UuCisgICAgKi1nY2MgfCAqJy1nY2MgJykgOjs7ICMoICBEb24ndCByZS1hZGQgLWdjYzogaXQncyBhbHJlYWR5IGluIHRoZXJlLgorICAgIGdjYyopCisgICAgICBib29zdF90YWdfeD0KKyAgICAgIGNhc2UgJGhvc3Rfb3MgaW4gIygKKyAgICAgICAgZGFyd2luKikKKyAgICAgICAgICBpZiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxMzY7IHRoZW4KKyAgICAgICAgICAgICMgVGhlIGB4JyBhZGRlZCBpbiByNDY3OTMgb2YgQm9vc3QuCisgICAgICAgICAgICBib29zdF90YWdfeD14CisgICAgICAgICAgZmk7OworICAgICAgZXNhYworICAgICAgIyBXZSBjYW4gc3BlY2lmeSBtdWx0aXBsZSB0YWdzIGluIHRoaXMgdmFyaWFibGUgYmVjYXVzZSBpdCdzIHVzZWQgYnkKKyAgICAgICMgQk9PU1RfRklORF9MSUIgdGhhdCBkb2VzIGEgYGZvciB0YWcgaW4gLSRib29zdF9jdl9saWJfdGFnJyAuLi4KKyAgICAgIGJvb3N0X2N2X2xpYl90YWc9IiRib29zdF90YWdfeCRib29zdF9jdl9saWJfdGFnIC0ke2Jvb3N0X3RhZ194fWdjYyIKKyAgICAgIDs7ICMoCisgICAgdW5rbm93bikKKyAgICAgIEFDX01TR19XQVJOKFtbY291bGQgbm90IGZpZ3VyZSBvdXQgd2hpY2ggdG9vbHNldCBuYW1lIHRvIHVzZSBmb3IgJENYWF1dKQorICAgICAgYm9vc3RfY3ZfbGliX3RhZz0KKyAgICAgIDs7CisgIGVzYWMKK2ZpXSlkbmwgZW5kIG9mIEFDX0NBQ0hFX0NIRUNLCitdKSMgX0JPT1NUX0ZJTkRfQ09NUElMRVJfVEFHCisKKworIyBfQk9PU1RfR1VFU1NfV0hFVEhFUl9UT19VU0VfTVQoKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb21waWxlIGEgc21hbGwgdGVzdCB0byB0cnkgdG8gZ3Vlc3Mgd2hldGhlciB3ZSBzaG91bGQgZmF2b3IgTVQgKE11bHRpCisjIFRocmVhZCkgZmxhdm9ycyBvZiBCb29zdC4gIFNldHMgYm9vc3RfZ3Vlc3NfdXNlX210IGFjY29yZGluZ2x5LgorQUNfREVGVU4oW19CT09TVF9HVUVTU19XSEVUSEVSX1RPX1VTRV9NVF0sCitbIyBDaGVjayB3aGV0aGVyIHdlIGRvIGJldHRlciB1c2UgYG10JyBldmVuIHRob3VnaCB3ZSB3ZXJlbid0IGFzayB0by4KK0FDX0xBTkdfUFVTSChbQysrXSlkbmwKK0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKKyNpZiBkZWZpbmVkIF9SRUVOVFJBTlQgfHwgZGVmaW5lZCBfTVQgfHwgZGVmaW5lZCBfX01UX18KKy8qIHVzZSAtbXQgKi8KKyNlbHNlCisjIGVycm9yIE1UIG5vdCBuZWVkZWQKKyNlbmRpZgorXV0pXSwgW2Jvb3N0X2d1ZXNzX3VzZV9tdD06XSwgW2Jvb3N0X2d1ZXNzX3VzZV9tdD1mYWxzZV0pCitBQ19MQU5HX1BPUChbQysrXSlkbmwKK10pCisKKyMgX0JPT1NUX0FDX0xJTktfSUZFTFNFKFBST0dSQU0sIFtBQ1RJT04tSUYtVFJVRV0sIFtBQ1RJT04tSUYtRkFMU0VdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZvcmsgb2YgX0FDX0xJTktfSUZFTFNFIHRoYXQgcHJlc2VydmVzIGNvbmZ0ZXN0Lm8gYWNyb3NzIGNhbGxzLiAgRnJhZ2lsZSwKKyMgd2lsbCBicmVhayB3aGVuIEF1dG9jb25mIGNoYW5nZXMgaXRzIGludGVybmFscy4gIFJlcXVpcmVzIHRoYXQgeW91IG1hbnVhbGx5CisjIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgaW4gYmV0d2VlbiB0byByZWFsbHkgZGlmZmVyZW50IHRlc3RzLCBvdGhlcndpc2UKKyMgeW91IHdpbGwgdHJ5IHRvIGxpbmsgYSBjb25mdGVzdC5vIGxlZnQgYmVoaW5kIGJ5IGEgcHJldmlvdXMgdGVzdC4KKyMgVXNlZCB0byBhZ2dyZXNzaXZlbHkgb3B0aW1pemUgQk9PU1RfRklORF9MSUIgKHNlZSB0aGUgYmlnIGNvbW1lbnQgaW4gdGhpcworIyBtYWNybykuCisjCisjIERvbid0IHVzZSAiYnJlYWsiIGluIHRoZSBhY3Rpb25zLCBhcyBpdCB3b3VsZCBzaG9ydC1jaXJjdWl0IHNvbWUgY29kZQorIyB0aGlzIG1hY3JvIHJ1bnMgYWZ0ZXIgdGhlIGFjdGlvbnMuCittNF9kZWZpbmUoW19CT09TVF9BQ19MSU5LX0lGRUxTRV0sCitbbTRfaWZ2YWxuKFskMV0sIFtBQ19MQU5HX0NPTkZURVNUKFskMV0pXSlkbmwKK3JtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAorYm9vc3Rfc2F2ZV9hY19leHQ9JGFjX2V4dAorYm9vc3RfdXNlX3NvdXJjZT06CisjIElmIHdlIGFscmVhZHkgaGF2ZSBhIC5vLCByZS11c2UgaXQuICBXZSBjaGFuZ2UgJGFjX2V4dCBzbyB0aGF0ICRhY19saW5rCisjIHRyaWVzIHRvIGxpbmsgdGhlIGV4aXN0aW5nIG9iamVjdCBmaWxlIGluc3RlYWQgb2YgY29tcGlsaW5nIGZyb20gc291cmNlLgordGVzdCAtZiBjb25mdGVzdC4kYWNfb2JqZXh0ICYmIGFjX2V4dD0kYWNfb2JqZXh0ICYmIGJvb3N0X3VzZV9zb3VyY2U9ZmFsc2UgJiYKKyAgX0FTX0VDSE9fTE9HKFtyZS11c2luZyB0aGUgZXhpc3RpbmcgY29uZnRlc3QuJGFjX29iamV4dF0pCitBU19JRihbX0FDX0RPX1NUREVSUigkYWNfbGluaykgJiYgeworICAgICAgICAgdGVzdCAteiAiJGFjX1tdX0FDX0xBTkdfQUJCUkVWW11fd2Vycm9yX2ZsYWciIHx8CisgICAgICAgICB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7CisgICAgICAgICB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAorICAgICAgICAgJGFzX2V4ZWN1dGFibGVfcCBjb25mdGVzdCRhY19leGVleHQKK2RubCBGSVhNRTogdXNlIEFTX1RFU1RfWCBpbnN0ZWFkIHdoZW4gMi42MSBpcyB3aWRlc3ByZWFkIGVub3VnaC4KKyAgICAgICB9XSwKKyAgICAgIFskMl0sCisgICAgICBbaWYgJGJvb3N0X3VzZV9zb3VyY2U7IHRoZW4KKyAgICAgICAgIF9BQ19NU0dfTE9HX0NPTkZURVNUCisgICAgICAgZmkKKyAgICAgICAkM10pCithY19vYmpleHQ9JGJvb3N0X3NhdmVfYWNfb2JqZXh0CithY19leHQ9JGJvb3N0X3NhdmVfYWNfZXh0CitkbmwgRGVsZXRlIGFsc28gdGhlIElQQS9JUE8gKEludGVyIFByb2NlZHVyYWwgQW5hbHlzaXMvT3B0aW1pemF0aW9uKQorZG5sIGluZm9ybWF0aW9uIGNyZWF0ZWQgYnkgdGhlIFBHSSBjb21waWxlciAoY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyksCitkbmwgYXMgaXQgd291bGQgaW50ZXJmZXJlIHdpdGggdGhlIG5leHQgbGluayBjb21tYW5kLgorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgbTRfaWZ2YWwoWyQxXSwgW2NvbmZ0ZXN0LiRhY19leHRdKVtdZG5sCitdKSMgX0JPT1NUX0FDX0xJTktfSUZFTFNFCisKKyMgTG9jYWwgVmFyaWFibGVzOgorIyBtb2RlOiBhdXRvY29uZgorIyBFbmQ6CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL2N2YzQtMS40LXBhdGNoL2NvbmZpZy9ib29zdC5tNCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvY3ZjNC0xLjQtcGF0Y2gvY29uZmlnL2Jvb3N0Lm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NGNmZDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL2N2YzQtMS40LXBhdGNoL2NvbmZpZy9ib29zdC5tNApAQCAtMCwwICsxLDE1NjUgQEAKKyMgYm9vc3QubTQ6IExvY2F0ZSBCb29zdCBoZWFkZXJzIGFuZCBsaWJyYXJpZXMgZm9yIGF1dG9jb25mLWJhc2VkIHByb2plY3RzLgorIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMSwgMjAxNCAgQmVub2l0IFNpZ291cmUgPHRzdW5hQGxyZGUuZXBpdGEuZnI+CisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIEFkZGl0aW9uYWwgcGVybWlzc2lvbiB1bmRlciBzZWN0aW9uIDcgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworIyBMaWNlbnNlLCB2ZXJzaW9uIDMgKCJHUEx2MyIpOgorIworIyBJZiB5b3UgY29udmV5IHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgd29yayB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGRvIHNvIHVuZGVyCisjIHRlcm1zIG9mIHlvdXIgY2hvaWNlLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworbTRfZGVmaW5lKFtfQk9PU1RfU0VSSUFMXSwgW200X3RyYW5zbGl0KFsKKyMgc2VyaWFsIDI1CitdLCBbIworXSwgW10pXSkKKworIyBPcmlnaW5hbCBzb3VyY2VzIGNhbiBiZSBmb3VuZCBhdCBodHRwOi8vZ2l0aHViLmNvbS90c3VuYS9ib29zdC5tNAorIyBZb3UgY2FuIGZldGNoIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgc2NyaXB0IGJ5IGRvaW5nOgorIyAgIHdnZXQgaHR0cDovL2dpdGh1Yi5jb20vdHN1bmEvYm9vc3QubTQvcmF3L21hc3Rlci9idWlsZC1hdXgvYm9vc3QubTQKKworIyAtLS0tLS0gIworIyBSRUFETUUgIworIyAtLS0tLS0gIworCisjIFRoaXMgZmlsZSBwcm92aWRlcyBzZXZlcmFsIG1hY3JvcyB0byB1c2UgdGhlIHZhcmlvdXMgQm9vc3QgbGlicmFyaWVzLgorIyBUaGUgZmlyc3QgbWFjcm8gaXMgQk9PU1RfUkVRVUlSRS4gIEl0IHdpbGwgc2ltcGx5IGNoZWNrIGlmIGl0J3MgcG9zc2libGUgdG8KKyMgZmluZCB0aGUgQm9vc3QgaGVhZGVycyBvZiBhIGdpdmVuIChvcHRpb25hbCkgbWluaW11bSB2ZXJzaW9uIGFuZCBpdCB3aWxsCisjIGRlZmluZSBCT09TVF9DUFBGTEFHUyBhY2NvcmRpbmdseS4gIEl0IHdpbGwgYWRkIGFuIG9wdGlvbiAtLXdpdGgtYm9vc3QgdG8KKyMgeW91ciBjb25maWd1cmUgc28gdGhhdCB1c2VycyBjYW4gc3BlY2lmeSBub24gc3RhbmRhcmQgbG9jYXRpb25zLgorIyBJZiB0aGUgdXNlcidzIGVudmlyb25tZW50IGNvbnRhaW5zIEJPT1NUX1JPT1QgYW5kIC0td2l0aC1ib29zdCB3YXMgbm90CisjIHNwZWNpZmllZCwgLS13aXRoLWJvb3N0PSRCT09TVF9ST09UIGlzIGltcGxpY2l0bHkgdXNlZC4KKyMgRm9yIG1vcmUgUkVBRE1FIGFuZCBkb2N1bWVudGF0aW9uLCBnbyB0byBodHRwOi8vZ2l0aHViLmNvbS90c3VuYS9ib29zdC5tNAorIyBOb3RlOiBUSEVTRSBNQUNST1MgQVNTVU1FIFRIQVQgWU9VIFVTRSBMSUJUT09MLiAgSWYgeW91IGRvbid0LCBkb24ndCB3b3JyeSwKKyMgc2ltcGx5IHJlYWQgdGhlIFJFQURNRSwgaXQgd2lsbCBzaG93IHlvdSB3aGF0IHRvIGRvIHN0ZXAgYnkgc3RlcC4KKworbTRfcGF0dGVybl9mb3JiaWQoW15fPyhCT09TVHxCb29zdClfXSkKKworCisjIF9CT09TVF9TRURfQ1BQKFNFRC1QUk9HUkFNLCBQUk9HUkFNLAorIyAgICAgICAgICAgICAgICBbQUNUSU9OLUlGLUZPVU5EXSwgW0FDVElPTi1JRi1OT1QtRk9VTkRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTYW1lIGFzIEFDX0VHUkVQX0NQUCwgYnV0IGxlYXZlIHRoZSByZXN1bHQgaW4gY29uZnRlc3QuaS4KKyMKKyMgU0VELVBST0dSQU0gaXMgKm5vdCogb3ZlcnF1b3RlZCwgYXMgaW4gQUNfRUdSRVBfQ1BQLiAgSXQgaXMgZXhwYW5kZWQKKyMgaW4gZG91YmxlLXF1b3Rlcywgc28gZXNjYXBlIHlvdXIgZG91YmxlIHF1b3Rlcy4KKyMKKyMgSXQgY291bGQgYmUgdXNlZnVsIHRvIHR1cm4gdGhpcyBpbnRvIGEgbWFjcm8gd2hpY2ggZXh0cmFjdHMgdGhlCisjIHZhbHVlIG9mIGFueSBtYWNyby4KK200X2RlZmluZShbX0JPT1NUX1NFRF9DUFBdLAorW0FDX0xBTkdfUFVTSChbQysrXSlkbmwKK0FDX0xBTkdfUFJFUFJPQ19SRVFVSVJFKClkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfU0VEXSlkbmwKK0FDX0xBTkdfQ09ORlRFU1QoW0FDX0xBTkdfU09VUkNFKFtbJDJdXSldKQorQVNfSUYoW2RubCBldmFsIGlzIG5lY2Vzc2FyeSB0byBleHBhbmQgYWNfY3BwLgorZG5sIFVsdHJpeCBhbmQgUHlyYW1pZCBzaCByZWZ1c2UgdG8gcmVkaXJlY3Qgb3V0cHV0IG9mIGV2YWwsIHNvIHVzZSBzdWJzaGVsbC4KK2RubCBCZXdhcmUgb2YgV2luZG93cyBlbmQtb2YtbGluZXMsIGZvciBpbnN0YW5jZSBpZiB3ZSBhcmUgcnVubmluZworZG5sIHNvbWUgV2luZG93cyBwcm9ncmFtcyB1bmRlciBXaW5lLiAgSW4gdGhhdCBjYXNlLCBib29zdC92ZXJzaW9uLmhwcAorZG5sIGlzIGNlcnRhaW5seSB1c2luZyAiXHJcbiIsIGJ1dCB0aGUgcmVndWxhciBVbml4IHNoZWxsIHdpbGwgb25seQorZG5sIHN0cmlwIGBcbicgd2l0aCBiYWNrcXVvdGVzLCBub3QgdGhlIGBccicuICBUaGlzIHJlc3VsdHMgaW4KK2RubCBib29zdF9jdl9saWJfdmVyc2lvbj0nMV8zN1xyJyBmb3IgaW5zdGFuY2UsIHdoaWNoIGJyZWFrcworZG5sIGV2ZXJ5dGhpbmcgZWxzZS4KK2RubCBDYW5ub3QgdXNlICdkbmwnIGFmdGVyIFskNF0gYmVjYXVzZSBhIHRyYWlsaW5nIGRubCBtYXkgYnJlYWsgQUNfQ0FDSEVfQ0hFQ0sKK2RubAorZG5sIEJld2FyZSB0aGF0IEdDQyA1LCB3aGVuIGV4cGFuZGluZyBtYWNyb3MsIG1heSBlbWJlZCAjIGxpbmUgZGlyZWN0aXZlcworZG5sIGEgd2l0aGluIHNpbmdsZSBsaW5lOgorZG5sCitkbmwgIyAxICJjb25mdGVzdC5jYyIKK2RubCAjIDEgIjxidWlsdC1pbj4iCitkbmwgIyAxICI8Y29tbWFuZC1saW5lPiIKK2RubCAjIDEgImNvbmZ0ZXN0LmNjIgorZG5sICMgMSAiL29wdC9sb2NhbC9pbmNsdWRlL2Jvb3N0L3ZlcnNpb24uaHBwIiAxIDMKK2RubCAjIDIgImNvbmZ0ZXN0LmNjIiAyCitkbmwgYm9vc3QtbGliLXZlcnNpb24gPQorZG5sICMgMiAiY29uZnRlc3QuY2MiIDMKK2RubCAgICAgICAgICAgICAgICAgICAgIjFfNTYiCitkbmwKK2RubCBTbyBnZXQgcmlkIG9mIHRoZSAjIGxpbmVzLCBhbmQgZ2x1ZSB0aGUgcmVtYWluaW5nIG9uZXMgdG9nZXRoZXIuCisoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mQVNfTUVTU0FHRV9MT0dfRkQgfAorICBncmVwIC12ICcjJyB8CisgIHRyIC1kICdccicgfAorICB0ciAtcyAnXG4nICcgJyB8CisgICRTRUQgLW4gLWUgIiQxIiA+Y29uZnRlc3QuaSAyPiYxXSwKKyAgWyQzXSwKKyAgWyQ0XSkKK3JtIC1yZiBjb25mdGVzdCoKK0FDX0xBTkdfUE9QKFtDKytdKWRubAorXSkjIF9CT09TVF9TRURfQ1BQCisKKworCisjIEJPT1NUX1JFUVVJUkUoW1ZFUlNJT05dLCBbQUNUSU9OLUlGLU5PVC1GT1VORF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LiAgSWYgdmVyc2lvbiBpcyBnaXZlbiwgaXQgbXVzdCBlaXRoZXIgYmUgYSBsaXRlcmFsIG9mIHRoZSBmb3JtCisjICJYLlkuWiIgd2hlcmUgWCwgWSBhbmQgWiBhcmUgaW50ZWdlcnMgKHRoZSAiLloiIHBhcnQgYmVpbmcgb3B0aW9uYWwpIG9yIGEKKyMgdmFyaWFibGUgIiR2YXIiLgorIyBEZWZpbmVzIHRoZSB2YWx1ZSBCT09TVF9DUFBGTEFHUy4gIFRoaXMgbWFjcm8gb25seSBjaGVja3MgZm9yIGhlYWRlcnMgd2l0aAorIyB0aGUgcmVxdWlyZWQgdmVyc2lvbiwgaXQgZG9lcyBub3QgY2hlY2sgZm9yIGFueSBvZiB0aGUgQm9vc3QgbGlicmFyaWVzLgorIyBPbiAjIHN1Y2Nlc3MsIGRlZmluZXMgSEFWRV9CT09TVC4gIE9uIGZhaWx1cmUsIGNhbGxzIHRoZSBvcHRpb25hbAorIyBBQ1RJT04tSUYtTk9ULUZPVU5EIGFjdGlvbiBpZiBvbmUgd2FzIHN1cHBsaWVkLgorIyBPdGhlcndpc2UgYWJvcnRzIHdpdGggYW4gZXJyb3IgbWVzc2FnZS4KK0FDX0RFRlVOX09OQ0UoW0JPT1NUX1JFUVVJUkVdLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfQ1hYXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfR1JFUF0pZG5sCitlY2hvICIkYXNfbWU6IHRoaXMgaXMgYm9vc3QubTRbXV9CT09TVF9TRVJJQUwiID4mQVNfTUVTU0FHRV9MT0dfRkQKK2Jvb3N0X3NhdmVfSUZTPSRJRlMKK2Jvb3N0X3ZlcnNpb25fcmVxPSQxCitJRlM9Lgorc2V0IHggJGJvb3N0X3ZlcnNpb25fcmVxIDAgMCAwCitJRlM9JGJvb3N0X3NhdmVfSUZTCitzaGlmdAorYm9vc3RfdmVyc2lvbl9yZXE9YGV4cHIgIiRbMV0iICcqJyAxMDAwMDAgKyAiJFsyXSIgJyonIDEwMCArICIkWzNdImAKK2Jvb3N0X3ZlcnNpb25fcmVxX3N0cmluZz0kWzFdLiRbMl0uJFszXQorQUNfQVJHX1dJVEgoW2Jvb3N0XSwKKyAgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLWJvb3N0PURJUl0sCisgICAgICAgICAgICAgICAgICAgW3ByZWZpeCBvZiBCb29zdCAkMSBAPDpAZ3Vlc3NAOj5AXSldKWRubAorQUNfQVJHX1ZBUihbQk9PU1RfUk9PVF0sW0xvY2F0aW9uIG9mIEJvb3N0IGluc3RhbGxhdGlvbl0pZG5sCisjIElmIEJPT1NUX1JPT1QgaXMgc2V0IGFuZCB0aGUgdXNlciBoYXMgbm90IHByb3ZpZGVkIGEgdmFsdWUgdG8KKyMgLS13aXRoLWJvb3N0LCB0aGVuIHRyZWF0IEJPT1NUX1JPT1QgYXMgaWYgaXQgdGhlIHVzZXIgc3VwcGxpZWQgaXQuCitpZiB0ZXN0IHgiJEJPT1NUX1JPT1QiICE9IHg7IHRoZW4KKyAgaWYgdGVzdCB4IiR3aXRoX2Jvb3N0IiA9IHg7IHRoZW4KKyAgICBBQ19NU0dfTk9USUNFKFtEZXRlY3RlZCBCT09TVF9ST09UOyBjb250aW51aW5nIHdpdGggLS13aXRoLWJvb3N0PSRCT09TVF9ST09UXSkKKyAgICB3aXRoX2Jvb3N0PSRCT09TVF9ST09UCisgIGVsc2UKKyAgICBBQ19NU0dfTk9USUNFKFtEZXRlY3RlZCBCT09TVF9ST09UPSRCT09TVF9ST09ULCBidXQgb3ZlcnJpZGRlbiBieSAtLXdpdGgtYm9vc3Q9JHdpdGhfYm9vc3RdKQorICBmaQorZmkKK0FDX1NVQlNUKFtESVNUQ0hFQ0tfQ09ORklHVVJFX0ZMQUdTXSwKKyAgICAgICAgIFsiJERJU1RDSEVDS19DT05GSUdVUkVfRkxBR1MgJy0td2l0aC1ib29zdD0kd2l0aF9ib29zdCciXSlkbmwKK2Jvb3N0X3NhdmVfQ1BQRkxBR1M9JENQUEZMQUdTCisgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgQm9vc3QgaGVhZGVycyB2ZXJzaW9uID49ICRib29zdF92ZXJzaW9uX3JlcV9zdHJpbmddLAorICAgIFtib29zdF9jdl9pbmNfcGF0aF0sCisgICAgW2Jvb3N0X2N2X2luY19wYXRoPW5vCitBQ19MQU5HX1BVU0goW0MrK10pZG5sCittNF9wYXR0ZXJuX2FsbG93KFteQk9PU1RfVkVSU0lPTiRdKWRubAorICAgIEFDX0xBTkdfQ09ORlRFU1QoW0FDX0xBTkdfUFJPR1JBTShbWyNpbmNsdWRlIDxib29zdC92ZXJzaW9uLmhwcD4KKyNpZiAhZGVmaW5lZCBCT09TVF9WRVJTSU9OCisjIGVycm9yIEJPT1NUX1ZFUlNJT04gaXMgbm90IGRlZmluZWQKKyNlbGlmIEJPT1NUX1ZFUlNJT04gPCAkYm9vc3RfdmVyc2lvbl9yZXEKKyMgZXJyb3IgQm9vc3QgaGVhZGVycyB2ZXJzaW9uIDwgJGJvb3N0X3ZlcnNpb25fcmVxCisjZW5kaWYKK11dKV0pCisgICAgIyBJZiB0aGUgdXNlciBwcm92aWRlZCBhIHZhbHVlIHRvIC0td2l0aC1ib29zdCwgdXNlIGl0IGFuZCBvbmx5IGl0LgorICAgIGNhc2UgJHdpdGhfYm9vc3QgaW4gIygKKyAgICAgICcnfHllcykgc2V0IHggJycgL29wdC9sb2NhbC9pbmNsdWRlIC91c3IvbG9jYWwvaW5jbHVkZSAvb3B0L2luY2x1ZGUgXAorICAgICAgICAgICAgICAgICAvdXNyL2luY2x1ZGUgQzovQm9vc3QvaW5jbHVkZTs7ICMoCisgICAgICAqKSAgICAgIHNldCB4ICIkd2l0aF9ib29zdC9pbmNsdWRlIiAiJHdpdGhfYm9vc3QiOzsKKyAgICBlc2FjCisgICAgc2hpZnQKKyAgICBmb3IgYm9vc3RfZGlyCisgICAgZG8KKyAgICAjIFdpdGhvdXQgLS1sYXlvdXQ9c3lzdGVtLCBCb29zdCAob3IgYXQgbGVhc3Qgc29tZSB2ZXJzaW9ucykgaW5zdGFsbHMKKyAgICAjIGl0c2VsZiBpbiA8cHJlZml4Pi9pbmNsdWRlL2Jvb3N0LTx2ZXJzaW9uPi4gIFRoaXMgaW5uZXIgbG9vcCBoZWxwcyB0bworICAgICMgZmluZCBoZWFkZXJzIGluIHN1Y2ggZGlyZWN0b3JpZXMuCisgICAgIworICAgICMgQW55ICR7Ym9vc3RfZGlyfS9ib29zdC14X3h4IGRpcmVjdG9yaWVzIGFyZSBzZWFyY2hlZCBpbiByZXZlcnNlIHZlcnNpb24KKyAgICAjIG9yZGVyIGZvbGxvd2VkIGJ5ICR7Ym9vc3RfZGlyfS4gIFRoZSBmaW5hbCAnLicgaXMgYSBzZW50aW5lbCBmb3IKKyAgICAjIHNlYXJjaGluZyAkYm9vc3RfZGlyIiBpdHNlbGYuICBFbnRyaWVzIGFyZSB3aGl0ZXNwYWNlIHNlcGFyYXRlZC4KKyAgICAjCisgICAgIyBJIGRpZG4ndCBpbmRlbnQgdGhpcyBsb29wIG9uIHB1cnBvc2UgKHRvIGF2b2lkIG92ZXItaW5kZW50ZWQgY29kZSkKKyAgICBib29zdF9sYXlvdXRfc3lzdGVtX3NlYXJjaF9saXN0PWBjZCAiJGJvb3N0X2RpciIgMj4vZGV2L251bGwgXAorICAgICAgICAmJiBscyAtMSB8ICIke0dSRVB9IiAnXmJvb3N0LScgfCBzb3J0IC1ybiAtdC0gLWsyIFwKKyAgICAgICAgJiYgZWNobyAuYAorICAgIGZvciBib29zdF9pbmMgaW4gJGJvb3N0X2xheW91dF9zeXN0ZW1fc2VhcmNoX2xpc3QKKyAgICBkbworICAgICAgaWYgdGVzdCB4IiRib29zdF9pbmMiICE9IHguOyB0aGVuCisgICAgICAgIGJvb3N0X2luYz0iJGJvb3N0X2Rpci8kYm9vc3RfaW5jIgorICAgICAgZWxzZQorICAgICAgICBib29zdF9pbmM9IiRib29zdF9kaXIiICMgVXNlcyBzZW50aW5lbCBpbiBib29zdF9sYXlvdXRfc3lzdGVtX3NlYXJjaF9saXN0CisgICAgICBmaQorICAgICAgaWYgdGVzdCB4IiRib29zdF9pbmMiICE9IHg7IHRoZW4KKyAgICAgICAgIyBXZSBhcmUgZ29pbmcgdG8gY2hlY2sgd2hldGhlciB0aGUgdmVyc2lvbiBvZiBCb29zdCBpbnN0YWxsZWQKKyAgICAgICAgIyBpbiAkYm9vc3RfaW5jIGlzIHVzYWJsZSBieSBydW5uaW5nIGEgY29tcGlsYXRpb24gdGhhdAorICAgICAgICAjICNpbmNsdWRlcyBpdC4gIEJ1dCBpZiB3ZSBwYXNzIGEgLUkvc29tZS9wYXRoIGluIHdoaWNoIEJvb3N0CisgICAgICAgICMgaXMgbm90IGluc3RhbGxlZCwgdGhlIGNvbXBpbGVyIHdpbGwganVzdCBza2lwIHRoaXMgLUkgYW5kCisgICAgICAgICMgdXNlIG90aGVyIGxvY2F0aW9ucyAoZWl0aGVyIGZyb20gQ1BQRkxBR1MsIG9yIGZyb20gaXRzIGxpc3QKKyAgICAgICAgIyBvZiBzeXN0ZW0gaW5jbHVkZSBkaXJlY3RvcmllcykuICBBcyBhIHJlc3VsdCB3ZSB3b3VsZCB1c2UKKyAgICAgICAgIyBoZWFkZXIgaW5zdGFsbGVkIG9uIHRoZSBtYWNoaW5lIGluc3RlYWQgb2YgdGhlIC9zb21lL3BhdGgKKyAgICAgICAgIyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuICBTbyBpbiB0aGF0IHByZWNpc2UgY2FzZSAodHJ5aW5nCisgICAgICAgICMgJGJvb3N0X2luYyksIG1ha2Ugc3VyZSB0aGUgdmVyc2lvbi5ocHAgZXhpc3RzLgorICAgICAgICAjCisgICAgICAgICMgVXNlIHRlc3QgLWUgYXMgdGhlcmUgY2FuIGJlIHN5bWxpbmtzLgorICAgICAgICB0ZXN0IC1lICIkYm9vc3RfaW5jL2Jvb3N0L3ZlcnNpb24uaHBwIiB8fCBjb250aW51ZQorICAgICAgICBDUFBGTEFHUz0iJENQUEZMQUdTIC1JJGJvb3N0X2luYyIKKyAgICAgIGZpCisgICAgICBBQ19DT01QSUxFX0lGRUxTRShbXSwgW2Jvb3N0X2N2X2luY19wYXRoPXllc10sIFtib29zdF9jdl92ZXJzaW9uPW5vXSkKKyAgICAgIGlmIHRlc3QgeCIkYm9vc3RfY3ZfaW5jX3BhdGgiID0geHllczsgdGhlbgorICAgICAgICBpZiB0ZXN0IHgiJGJvb3N0X2luYyIgIT0geDsgdGhlbgorICAgICAgICAgIGJvb3N0X2N2X2luY19wYXRoPSRib29zdF9pbmMKKyAgICAgICAgZmkKKyAgICAgICAgYnJlYWsgMgorICAgICAgZmkKKyAgICBkb25lCisgICAgZG9uZQorQUNfTEFOR19QT1AoW0MrK10pZG5sCisgICAgXSkKKyAgICBjYXNlICRib29zdF9jdl9pbmNfcGF0aCBpbiAjKAorICAgICAgbm8pCisgICAgICAgIGJvb3N0X2Vycm1zZz0iY2Fubm90IGZpbmQgQm9vc3QgaGVhZGVycyB2ZXJzaW9uID49ICRib29zdF92ZXJzaW9uX3JlcV9zdHJpbmciCisgICAgICAgIG00X2lmKFskMl0sIFtdLCAgW0FDX01TR19FUlJPUihbJGJvb3N0X2Vycm1zZ10pXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtBQ19NU0dfTk9USUNFKFskYm9vc3RfZXJybXNnXSldKQorICAgICAgICAkMgorICAgICAgICA7OyMoCisgICAgICB5ZXMpCisgICAgICAgIEJPT1NUX0NQUEZMQUdTPQorICAgICAgICA7OyMoCisgICAgICAqKQorICAgICAgICBBQ19TVUJTVChbQk9PU1RfQ1BQRkxBR1NdLCBbIi1JJGJvb3N0X2N2X2luY19wYXRoIl0pZG5sCisgICAgICAgIDs7CisgICAgZXNhYworICBpZiB0ZXN0IHgiJGJvb3N0X2N2X2luY19wYXRoIiAhPSB4bm87IHRoZW4KKyAgQUNfREVGSU5FKFtIQVZFX0JPT1NUXSwgWzFdLAorICAgICAgICAgICAgW0RlZmluZWQgaWYgdGhlIHJlcXVlc3RlZCBtaW5pbXVtIEJPT1NUIHZlcnNpb24gaXMgc2F0aXNmaWVkXSkKKyAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBCb29zdCdzIGhlYWRlciB2ZXJzaW9uXSwKKyAgICBbYm9vc3RfY3ZfbGliX3ZlcnNpb25dLAorICAgIFttNF9wYXR0ZXJuX2FsbG93KFteQk9PU1RfTElCX1ZFUlNJT04kXSlkbmwKKyAgICAgX0JPT1NUX1NFRF9DUFAoW1svXmJvb3N0LWxpYi12ZXJzaW9uID0gL3tzLy8vO3MvW1wiIF0vL2c7cDtxO31dXSwKKyAgICAgICAgICAgICAgICAgICAgWyNpbmNsdWRlIDxib29zdC92ZXJzaW9uLmhwcD4KK2Jvb3N0LWxpYi12ZXJzaW9uID0gQk9PU1RfTElCX1ZFUlNJT05dLAorICAgIFtib29zdF9jdl9saWJfdmVyc2lvbj1gY2F0IGNvbmZ0ZXN0LmlgXSldKQorICAgICMgZS5nLiAiMTM0IiBmb3IgMV8zNF8xIG9yICIxMzUiIGZvciAxXzM1CisgICAgCisgICAgI2Jvb3N0X2N2X2xpYl92ZXJzaW9uPSIxNjEiCisgICAgI2Jvb3N0X21ham9yX3ZlcnNpb249YGVjaG8gIiRib29zdF9jdl9saWJfdmVyc2lvbiIgfCBzZWQgJ3MvXy8vO3MvXy4qLy8nYAorICAgICNib29zdF9tYWpvcl92ZXJzaW9uPWBlY2hvICIkQk9PU1RfTElCX1ZFUlNJT04iIHwgc2VkICdzL18vLztzL18uKi8vJ2AKKyAgICBib29zdF9tYWpvcl92ZXJzaW9uPSIxNjEiCisgICAgIAorICAgICNjYXNlICRib29zdF9tYWpvcl92ZXJzaW9uIGluICMoCisgICAgIyAgJycgfCAqW1shMC05XV0qKQorICAgICMgICAgQUNfTVNHX0VSUk9SKFtpbnZhbGlkIHZhbHVlOiBib29zdF9tYWpvcl92ZXJzaW9uPSckYm9vc3RfbWFqb3JfdmVyc2lvbiddKQorICAgICMgICAgOzsKKyAgICAjZXNhYworZmkKK0NQUEZMQUdTPSRib29zdF9zYXZlX0NQUEZMQUdTCitdKSMgQk9PU1RfUkVRVUlSRQorCisKKyMgQk9PU1RfU1RBVElDKCkKKyMgLS0tLS0tLS0tLS0tLS0KKyMgQWRkIHRoZSAiLS1lbmFibGUtc3RhdGljLWJvb3N0IiBjb25maWd1cmUgYXJndW1lbnQuIElmIHRoaXMgYXJndW1lbnQgaXMgZ2l2ZW4KKyMgb24gdGhlIGNvbW1hbmQgbGluZSwgc3RhdGljIHZlcnNpb25zIG9mIHRoZSBsaWJyYXJpZXMgd2lsbCBiZSBsb29rZWQgdXAuCitBQ19ERUZVTihbQk9PU1RfU1RBVElDXSwKKyAgW0FDX0FSR19FTkFCTEUoW3N0YXRpYy1ib29zdF0sCisgICAgIFtBU19IRUxQX1NUUklORyhbLS1lbmFibGUtc3RhdGljLWJvb3N0XSwKKyAgICAgICAgICAgICAgIFtQcmVmZXIgdGhlIHN0YXRpYyBib29zdCBsaWJyYXJpZXMgb3ZlciB0aGUgc2hhcmVkIG9uZXMgW25vXV0pXSwKKyAgICAgW2VuYWJsZV9zdGF0aWNfYm9vc3Q9eWVzXSwKKyAgICAgW2VuYWJsZV9zdGF0aWNfYm9vc3Q9bm9dKV0pIyBCT09TVF9TVEFUSUMKKworCisjIEJPT1NUX0ZJTkRfSEVBREVSKFtIRUFERVItTkFNRV0sIFtBQ1RJT04tSUYtTk9ULUZPVU5EXSwgW0FDVElPTi1JRi1GT1VORF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFdyYXBwZXIgYXJvdW5kIEFDX0NIRUNLX0hFQURFUiBmb3IgQm9vc3QgaGVhZGVycy4gIFVzZWZ1bCB0byBjaGVjayBmb3IKKyMgc29tZSBwYXJ0cyBvZiB0aGUgQm9vc3QgbGlicmFyeSB3aGljaCBhcmUgb25seSBtYWRlIG9mIGhlYWRlcnMgYW5kIGRvbid0CisjIHJlcXVpcmUgbGlua2luZyAoc3VjaCBhcyBCb29zdC5Gb3JlYWNoKS4KKyMKKyMgRGVmYXVsdCBBQ1RJT04tSUYtTk9ULUZPVU5EOiBGYWlsIHdpdGggYSBmYXRhbCBlcnJvciB1bmxlc3MgQm9vc3QgY291bGRuJ3QgYmUKKyMgZm91bmQgaW4gdGhlIGZpcnN0IHBsYWNlLCBpbiB3aGljaCBjYXNlIGJ5IGRlZmF1bHQgYSBub3RpY2UgaXMgaXNzdWVkIHRvIHRoZQorIyB1c2VyLiAgUHJlc3VtYWJseSBpZiB3ZSBoYXZlbid0IGRpZWQgYWxyZWFkeSBpdCdzIGJlY2F1c2UgaXQncyBPSyB0byBub3QgaGF2ZQorIyBCb29zdCwgd2hpY2ggaXMgd2h5IG9ubHkgYSBub3RpY2UgaXMgaXNzdWVkIGluc3RlYWQgb2YgYSBoYXJkIGVycm9yLgorIworIyBEZWZhdWx0IEFDVElPTi1JRi1GT1VORDogZGVmaW5lIHRoZSBwcmVwcm9jZXNzb3Igc3ltYm9sIEhBVkVfPEhFQURFUi1OQU1FPiBpbgorIyBjYXNlIG9mIHN1Y2Nlc3MgIyAod2hlcmUgSEVBREVSLU5BTUUgaXMgd3JpdHRlbiBMSUtFX1RISVMsIGUuZy4sCisjIEhBVkVfQk9PU1RfRk9SRUFDSF9IUFApLgorQUNfREVGVU4oW0JPT1NUX0ZJTkRfSEVBREVSXSwKK1tBQ19SRVFVSVJFKFtCT09TVF9SRVFVSVJFXSlkbmwKK2lmIHRlc3QgeCIkYm9vc3RfY3ZfaW5jX3BhdGgiID0geG5vOyB0aGVuCisgIG00X2RlZmF1bHQoWyQyXSwgW0FDX01TR19OT1RJQ0UoW0Jvb3N0IG5vdCBhdmFpbGFibGUsIG5vdCBzZWFyY2hpbmcgZm9yICQxXSldKQorZWxzZQorQUNfTEFOR19QVVNIKFtDKytdKWRubAorYm9vc3Rfc2F2ZV9DUFBGTEFHUz0kQ1BQRkxBR1MKK0NQUEZMQUdTPSIkQ1BQRkxBR1MgJEJPT1NUX0NQUEZMQUdTIgorQUNfQ0hFQ0tfSEVBREVSKFskMV0sCisgIFttNF9kZWZhdWx0KFskM10sIFtBQ19ERUZJTkUoQVNfVFJfQ1BQKFtIQVZFXyQxXSksIFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgPCQxPl0pXSldLAorICBbbTRfZGVmYXVsdChbJDJdLCBbQUNfTVNHX0VSUk9SKFtjYW5ub3QgZmluZCAkMV0pXSldKQorQ1BQRkxBR1M9JGJvb3N0X3NhdmVfQ1BQRkxBR1MKK0FDX0xBTkdfUE9QKFtDKytdKWRubAorZmkKK10pIyBCT09TVF9GSU5EX0hFQURFUgorCisKKyMgQk9PU1RfRklORF9MSUJTKFtDT01QT05FTlQtTkFNRV0sIFtDQU5ESURBVEUtTElCLU5BTUVTXSwKKyMgICAgICAgICAgICAgICAgIFtQUkVGRVJSRUQtUlQtT1BUXSwgW0hFQURFUi1OQU1FXSwgW0NYWC1URVNUXSwKKyMgICAgICAgICAgICAgICAgIFtDWFgtUFJPTE9HVUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciB0aGUgQm9vc3QgbGlicmFyeSBDT01QT05FTlQtTkFNRSAoZS5nLiwgYHRocmVhZCcsIGZvcgorIyBsaWJib29zdF90aHJlYWQpIHVuZGVyIHRoZSBwb3NzaWJsZSBDQU5ESURBVEUtTElCLU5BTUVTIChlLmcuLAorIyAidGhyZWFkX3dpbjMyIHRocmVhZCIpLiAgQ2hlY2sgdGhhdCBIRUFERVItTkFNRSB3b3JrcyBhbmQgY2hlY2sgdGhhdAorIyBsaWJib29zdF9MSUItTkFNRSBjYW4gbGluayB3aXRoIHRoZSBjb2RlIENYWC1URVNULiAgVGhlIG9wdGlvbmFsCisjIGFyZ3VtZW50IENYWC1QUk9MT0dVRSBjYW4gYmUgdXNlZCB0byBpbmNsdWRlIHNvbWUgQysrIGNvZGUgYmVmb3JlCisjIHRoZSBgbWFpbicgZnVuY3Rpb24uCisjCisjIEludm9rZXMgQk9PU1RfRklORF9IRUFERVIoW0hFQURFUi1OQU1FXSkgKHNlZSBhYm92ZSkuCisjCisjIEJvb3N0IGxpYnJhcmllcyB0eXBpY2FsbHkgY29tZSBjb21waWxlZCB3aXRoIHNldmVyYWwgZmxhdm9ycyAod2l0aCBkaWZmZXJlbnQKKyMgcnVudGltZSBvcHRpb25zKSBzbyBQUkVGRVJSRUQtUlQtT1BUIGlzIHRoZSBwcmVmZXJyZWQgc3VmZml4LiAgQSBzdWZmaXggaXMgb25lCisjIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBsZXR0ZXJzOiBzZ2RwbiAoaW4gdGhhdCBvcmRlcikuICBzID0gc3RhdGljCisjIHJ1bnRpbWUsIGQgPSBkZWJ1ZyBidWlsZCwgZyA9IGRlYnVnL2RpYWdub3N0aWMgcnVudGltZSwgcCA9IFNUTFBvcnQgYnVpbGQsCisjIG4gPSAodW5zdXJlKSBTVExQb3J0IGJ1aWxkIHdpdGhvdXQgaW9zdHJlYW1zIGZyb20gU1RMUG9ydCAoaXQgbG9va3MgbGlrZSBgbicKKyMgbXVzdCBhbHdheXMgYmUgdXNlZCBhbG9uZyB3aXRoIGBwJykuICBBZGRpdGlvbmFsbHksIFBSRUZFUlJFRC1SVC1PUFQgY2FuCisjIHN0YXJ0IHdpdGggYG10LScgdG8gaW5kaWNhdGUgdGhhdCB0aGVyZSBpcyBhIHByZWZlcmVuY2UgZm9yIG11bHRpLXRocmVhZAorIyBidWlsZHMuICBTb21lIHNhbXBsZSB2YWx1ZXMgZm9yIFBSRUZFUlJFRC1SVC1PUFQ6IChub3RoaW5nKSwgbXQsIGQsIG10LWQsIGdkcAorIyAuLi4gIElmIHlvdSB3YW50IHRvIG1ha2Ugc3VyZSB5b3UgaGF2ZSBhIHNwZWNpZmljIHZlcnNpb24gb2YgQm9vc3QKKyMgKGVnLCA+PSAxLjMzKSB5b3UgKm11c3QqIGludm9rZSBCT09TVF9SRVFVSVJFIGJlZm9yZSB0aGlzIG1hY3JvLgorQUNfREVGVU4oW0JPT1NUX0ZJTkRfTElCU10sCitbQUNfUkVRVUlSRShbQk9PU1RfUkVRVUlSRV0pZG5sCitBQ19SRVFVSVJFKFtfQk9PU1RfRklORF9DT01QSUxFUl9UQUddKWRubAorQUNfUkVRVUlSRShbQk9PU1RfU1RBVElDXSlkbmwKK0FDX1JFUVVJUkUoW19CT09TVF9HVUVTU19XSEVUSEVSX1RPX1VTRV9NVF0pZG5sCitpZiB0ZXN0IHgiJGJvb3N0X2N2X2luY19wYXRoIiA9IHhubzsgdGhlbgorICBBQ19NU0dfTk9USUNFKFtCb29zdCBub3QgYXZhaWxhYmxlLCBub3Qgc2VhcmNoaW5nIGZvciB0aGUgQm9vc3QgJDEgbGlicmFyeV0pCitlbHNlCitkbmwgVGhlIGVsc2UgYnJhbmNoIGlzIGh1Z2UgYW5kIHdhc24ndCBpbnRlbmRlZCBvbiBwdXJwb3NlLgorQUNfTEFOR19QVVNIKFtDKytdKWRubAorQVNfVkFSX1BVU0hERUYoW0Jvb3N0X2xpYl0sIFtib29zdF9jdl9saWJfJDFdKWRubAorQVNfVkFSX1BVU0hERUYoW0Jvb3N0X2xpYl9MREZMQUdTXSwgW2Jvb3N0X2N2X2xpYl8kMV9MREZMQUdTXSlkbmwKK0FTX1ZBUl9QVVNIREVGKFtCb29zdF9saWJfTERQQVRIXSwgW2Jvb3N0X2N2X2xpYl8kMV9MRFBBVEhdKWRubAorQVNfVkFSX1BVU0hERUYoW0Jvb3N0X2xpYl9MSUJTXSwgW2Jvb3N0X2N2X2xpYl8kMV9MSUJTXSlkbmwKK0JPT1NUX0ZJTkRfSEVBREVSKFskNF0pCitib29zdF9zYXZlX0NQUEZMQUdTPSRDUFBGTEFHUworQ1BQRkxBR1M9IiRDUFBGTEFHUyAkQk9PU1RfQ1BQRkxBR1MiCitBQ19DQUNIRV9DSEVDSyhbZm9yIHRoZSBCb29zdCAkMSBsaWJyYXJ5XSwgW0Jvb3N0X2xpYl0sCisgICAgICAgICAgICAgICBbX0JPT1NUX0ZJTkRfTElCUygkQCldKQorY2FzZSAkQm9vc3RfbGliIGluICMoCisgIChubykgX0FDX01TR19MT0dfQ09ORlRFU1QKKyAgICBBQ19NU0dfRVJST1IoW2Nhbm5vdCBmaW5kIHRoZSBmbGFncyB0byBsaW5rIHdpdGggQm9vc3QgJDFdKQorICAgIDs7Citlc2FjCitBQ19TVUJTVChBU19UUl9DUFAoW0JPT1NUXyQxX0xERkxBR1NdKSwgWyRCb29zdF9saWJfTERGTEFHU10pZG5sCitBQ19TVUJTVChBU19UUl9DUFAoW0JPT1NUXyQxX0xEUEFUSF0pLCBbJEJvb3N0X2xpYl9MRFBBVEhdKWRubAorQUNfU1VCU1QoW0JPT1NUX0xEUEFUSF0sIFskQm9vc3RfbGliX0xEUEFUSF0pZG5sCitBQ19TVUJTVChBU19UUl9DUFAoW0JPT1NUXyQxX0xJQlNdKSwgWyRCb29zdF9saWJfTElCU10pZG5sCitDUFBGTEFHUz0kYm9vc3Rfc2F2ZV9DUFBGTEFHUworQVNfVkFSX1BPUERFRihbQm9vc3RfbGliXSlkbmwKK0FTX1ZBUl9QT1BERUYoW0Jvb3N0X2xpYl9MREZMQUdTXSlkbmwKK0FTX1ZBUl9QT1BERUYoW0Jvb3N0X2xpYl9MRFBBVEhdKWRubAorQVNfVkFSX1BPUERFRihbQm9vc3RfbGliX0xJQlNdKWRubAorQUNfTEFOR19QT1AoW0MrK10pZG5sCitmaQorXSkKKworCisjIEJPT1NUX0ZJTkRfTElCKFtMSUItTkFNRV0sCisjICAgICAgICAgICAgICAgIFtQUkVGRVJSRUQtUlQtT1BUXSwgW0hFQURFUi1OQU1FXSwgW0NYWC1URVNUXSwKKyMgICAgICAgICAgICAgICAgW0NYWC1QUk9MT0dVRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd3JhcHBlciBmb3IgQk9PU1RfRklORF9MSUJTLgorQUNfREVGVU4oW0JPT1NUX0ZJTkRfTElCXSwKK1tCT09TVF9GSU5EX0xJQlMoWyQxXSwgJEApXSkKKworCisjIF9CT09TVF9GSU5EX0xJQlMoW0xJQi1OQU1FXSwgW0NBTkRJREFURS1MSUItTkFNRVNdLAorIyAgICAgICAgICAgICAgICAgW1BSRUZFUlJFRC1SVC1PUFRdLCBbSEVBREVSLU5BTUVdLCBbQ1hYLVRFU1RdLAorIyAgICAgICAgICAgICAgICAgW0NYWC1QUk9MT0dVRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFJlYWwgaW1wbGVtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUJTOiByZWx5IG9uIHRoZXNlIGxvY2FsIG1hY3JvczoKKyMgQm9vc3RfbGliLCBCb29zdF9saWJfTERGTEFHUywgQm9vc3RfbGliX0xEUEFUSCwgQm9vc3RfbGliX0xJQlMKKyMKKyMgVGhlIGFsZ29yaXRobSBpcyBhcyBmb2xsb3dzOiBmaXJzdCBsb29rIGZvciBhIGdpdmVuIGxpYnJhcnkgbmFtZQorIyBhY2NvcmRpbmcgdG8gdGhlIHVzZXIncyBQUkVGRVJSRUQtUlQtT1BULiAgRm9yIGVhY2ggbGlicmFyeSBuYW1lLCB3ZQorIyBwcmVmZXIgdG8gdXNlIHRoZSBvbmVzIHRoYXQgY2FycnkgdGhlIHRhZyAodG9vbHNldCBuYW1lKS4gIEVhY2gKKyMgbGlicmFyeSBpcyBzZWFyY2hlZCB0aHJvdWdoIHRoZSB2YXJpb3VzIHN0YW5kYXJkIHBhdGhzIHdlcmUgQm9vc3QgaXMKKyMgdXN1YWxseSBpbnN0YWxsZWQuICBJZiB3ZSBjYW4ndCBmaW5kIHRoZSBzdGFuZGFyZCB2YXJpYW50cywgd2UgdHJ5CisjIHRvIGVuZm9yY2UgLW10IChmb3IgaW5zdGFuY2Ugb24gTWFjT1NYLCBsaWJib29zdF90aHJlYWQuZHlsaWIKKyMgZG9lc24ndCBleGlzdCBidXQgdGhlcmUncyAtb2J2aW91c2x5LSBsaWJib29zdF90aHJlYWQtbXQuZHlsaWIpLgorQUNfREVGVU4oW19CT09TVF9GSU5EX0xJQlNdLAorW0Jvb3N0X2xpYj1ubworICBjYXNlICIkMyIgaW4gIygKKyAgICAobXQgfCBtdC0pIGJvb3N0X210PS1tdDsgYm9vc3RfcnRvcHQ9OzsgIygKKyAgICAobXQqIHwgbXQtKikgYm9vc3RfbXQ9LW10OyBib29zdF9ydG9wdD1gZXhwciAiWCQzIiA6ICdYbXQtKlwoLipcKSdgOzsgIygKKyAgICAoKikgYm9vc3RfbXQ9OyBib29zdF9ydG9wdD0kMzs7CisgIGVzYWMKKyAgaWYgdGVzdCAkZW5hYmxlX3N0YXRpY19ib29zdCA9IHllczsgdGhlbgorICAgIGJvb3N0X3J0b3B0PSJzJGJvb3N0X3J0b3B0IgorICBmaQorICAjIEZpbmQgdGhlIHByb3BlciBkZWJ1ZyB2YXJpYW50IGRlcGVuZGluZyBvbiB3aGF0IHdlJ3ZlIGJlZW4gYXNrZWQgdG8gZmluZC4KKyAgY2FzZSAkYm9vc3RfcnRvcHQgaW4gIygKKyAgICAoKmQqKSBib29zdF9ydF9kPSRib29zdF9ydG9wdDs7ICMoCisgICAgKCpbW3NncG5dXSopICMgSW5zZXJ0IHRoZSBgZCcgYXQgdGhlIHJpZ2h0IHBsYWNlIChpbiBiZXR3ZWVuIGBzZycgYW5kIGBwbicpCisgICAgICBib29zdF9ydF9kPWBlY2hvICIkYm9vc3RfcnRvcHQiIHwgc2VkICdzL1wocypnKlwpXChwKm4qXCkvXDFcMi8nYDs7ICMoCisgICAgKCopIGJvb3N0X3J0X2Q9Jy1kJzs7CisgIGVzYWMKKyAgIyBJZiB0aGUgUFJFRkVSUkVELVJULU9QVCBhcmUgbm90IGVtcHR5LCBwcmVwZW5kIGEgYC0nLgorICB0ZXN0IC1uICIkYm9vc3RfcnRvcHQiICYmIGJvb3N0X3J0b3B0PSItJGJvb3N0X3J0b3B0IgorICAkYm9vc3RfZ3Vlc3NfdXNlX210ICYmIGJvb3N0X210PS1tdAorICAjIExvb2sgZm9yIHRoZSBhYnMgcGF0aCB0aGUgc3RhdGljIGFyY2hpdmUuCisgICMgJGxpYmV4dCBpcyBjb21wdXRlZCBieSBMaWJ0b29sIGJ1dCBsZXQncyBtYWtlIHN1cmUgaXQncyBub24gZW1wdHkuCisgIHRlc3QgLXogIiRsaWJleHQiICYmCisgICAgQUNfTVNHX0VSUk9SKFt0aGUgbGliZXh0IHZhcmlhYmxlIGlzIGVtcHR5LCBkaWQgeW91IGludm9rZSBMaWJ0b29sP10pCisgIGJvb3N0X3NhdmVfYWNfb2JqZXh0PSRhY19vYmpleHQKKyAgIyBHZW5lcmF0ZSB0aGUgdGVzdCBmaWxlLgorICBBQ19MQU5HX0NPTkZURVNUKFtBQ19MQU5HX1BST0dSQU0oWyNpbmNsdWRlIDwkND4KKyQ2XSwgWyQ1XSldKQorZG5sIE9wdGltaXphdGlvbiBoYWNrczogY29tcGlsaW5nIEMrKyBpcyBzbG93LCBlc3BlY2lhbGx5IHdpdGggQm9vc3QuICBXaGF0Citkbmwgd2UncmUgdHJ5aW5nIHRvIGRvIGhlcmUgaXMgZ3Vlc3MgdGhlIHJpZ2h0IGNvbWJpbmF0aW9uIG9mIGxpbmsgZmxhZ3MKK2RubCAoTElCUyAvIExERkxBR1MpIHRvIHVzZSBhIGdpdmVuIGxpYnJhcnkuICBUaGlzIGNhbiB0YWtlIHNldmVyYWwKK2RubCBpdGVyYXRpb25zIGJlZm9yZSBpdCBzdWNjZWVkcyBhbmQgaXMgdGh1cyAqdmVyeSogc2xvdy4gIFNvIHdoYXQgd2UgZG8KK2RubCBpbnN0ZWFkIGlzIHRoYXQgd2UgY29tcGlsZSB0aGUgY29kZSBmaXJzdCAoYW5kIHRodXMgZ2V0IGFuIG9iamVjdCBmaWxlLAorZG5sIHR5cGljYWxseSBjb25mdGVzdC5vKS4gIFRoZW4gd2UgdHJ5IHZhcmlvdXMgY29tYmluYXRpb25zIG9mIGxpbmsgZmxhZ3MKK2RubCB1bnRpbCB3ZSBzdWNjZWVkIHRvIGxpbmsgY29uZnRlc3QubyBpbiBhbiBleGVjdXRhYmxlLiAgVGhlIHByb2JsZW0gaXMKK2RubCB0aGF0IHRoZSB2YXJpb3VzIFRSWV9MSU5LIC8gQ09NUElMRV9JRkVMU0UgbWFjcm9zIG9mIEF1dG9jb25mIGFsd2F5cworZG5sIHJlbW92ZSBhbGwgdGhlIHRlbXBvcmFyeSBmaWxlcyBpbmNsdWRpbmcgY29uZnRlc3Quby4gIFNvIHRoZSB0cmljayBoZXJlCitkbmwgaXMgdG8gdGVtcG9yYXJpbHkgY2hhbmdlIHRoZSB2YWx1ZSBvZiBhY19vYmpleHQgc28gdGhhdCBjb25mdGVzdC5vIGlzCitkbmwgcHJlc2VydmVkIGFjY3Jvc3MgdGVzdHMuICBUaGlzIGlzIG9idmlvdXNseSBmcmFnaWxlIGFuZCBJIHdpbGwgYnVybiBpbgorZG5sIGhlbGwgZm9yIG5vdCByZXNwZWN0aW5nIEF1dG9jb25mJ3MgZG9jdW1lbnRlZCBpbnRlcmZhY2VzLCBidXQgaW4gdGhlCitkbmwgbWVhbiB0aW1lLCBpdCBvcHRpbWl6ZXMgdGhlIG1hY3JvIGJ5IGEgZmFjdG9yIG9mIDUgdG8gMzAuCitkbmwgQW5vdGhlciBzbWFsbCBvcHRpbWl6YXRpb246IHRoZSBmaXJzdCBhcmd1bWVudCBvZiBBQ19DT01QSUxFX0lGRUxTRSBsZWZ0CitkbmwgZW1wdHkgYmVjYXVzZSB0aGUgdGVzdCBmaWxlIGlzIGdlbmVyYXRlZCBvbmx5IG9uY2UgYWJvdmUgKGJlZm9yZSB3ZQorZG5sIHN0YXJ0IHRoZSBmb3IgbG9vcHMpLgorICBBQ19DT01QSUxFX0lGRUxTRShbXSwKKyAgICBbYWNfb2JqZXh0PWRvX25vdF9ybV9tZV9wbHpdLAorICAgIFtBQ19NU0dfRVJST1IoW2Nhbm5vdCBjb21waWxlIGEgdGVzdCB0aGF0IHVzZXMgQm9vc3QgJDFdKV0pCisgIGFjX29iamV4dD0kYm9vc3Rfc2F2ZV9hY19vYmpleHQKKyAgYm9vc3RfZmFpbGVkX2xpYnM9CisjIERvbid0IGJvdGhlciB0byBpZGVudCB0aGUgZm9sbG93aW5nIG5lc3RlZCBmb3IgbG9vcHMsIG9ubHkgdGhlIDIKKyMgaW5uZXJtb3N0IG9uZXMgbWF0dGVyLgorZm9yIGJvb3N0X2xpYl8gaW4gJDI7IGRvCitmb3IgYm9vc3RfdGFnXyBpbiAtJGJvb3N0X2N2X2xpYl90YWcgJyc7IGRvCitmb3IgYm9vc3RfdmVyXyBpbiAtJGJvb3N0X2N2X2xpYl92ZXJzaW9uICcnOyBkbworZm9yIGJvb3N0X210XyBpbiAkYm9vc3RfbXQgLW10ICcnOyBkbworZm9yIGJvb3N0X3J0b3B0XyBpbiAkYm9vc3RfcnRvcHQgJycgLWQ7IGRvCisgIGZvciBib29zdF9saWIgaW4gXAorICAgIGJvb3N0XyRib29zdF9saWJfJGJvb3N0X3RhZ18kYm9vc3RfbXRfJGJvb3N0X3J0b3B0XyRib29zdF92ZXJfIFwKKyAgICBib29zdF8kYm9vc3RfbGliXyRib29zdF90YWdfJGJvb3N0X3J0b3B0XyRib29zdF92ZXJfIFwKKyAgICBib29zdF8kYm9vc3RfbGliXyRib29zdF90YWdfJGJvb3N0X210XyRib29zdF92ZXJfIFwKKyAgICBib29zdF8kYm9vc3RfbGliXyRib29zdF90YWdfJGJvb3N0X3Zlcl8KKyAgZG8KKyAgICAjIEF2b2lkIHRlc3RpbmcgdHdpY2UgdGhlIHNhbWUgbGliCisgICAgY2FzZSAkYm9vc3RfZmFpbGVkX2xpYnMgaW4gIygKKyAgICAgICgqQCRib29zdF9saWJAKikgY29udGludWU7OworICAgIGVzYWMKKyAgICAjIElmIHdpdGhfYm9vc3QgaXMgZW1wdHksIHdlJ2xsIHNlYXJjaCBpbiAvbGliIGZpcnN0LCB3aGljaCBpcyBub3QgcXVpdGUKKyAgICAjIHJpZ2h0IHNvIGluc3RlYWQgd2UnbGwgdHJ5IHRvIGEgbG9jYXRpb24gYmFzZWQgb24gd2hlcmUgdGhlIGhlYWRlcnMgYXJlLgorICAgIGJvb3N0X3RtcF9saWI9JHdpdGhfYm9vc3QKKyAgICB0ZXN0IHgiJHdpdGhfYm9vc3QiID0geCAmJiBib29zdF90bXBfbGliPSR7Ym9vc3RfY3ZfaW5jX3BhdGglL2luY2x1ZGV9CisgICAgZm9yIGJvb3N0X2xkcGF0aCBpbiAiJGJvb3N0X3RtcF9saWIvbGliIiAnJyBcCisgICAgICAgICAgICAgL29wdC9sb2NhbC9saWIqIC91c3IvbG9jYWwvbGliKiAvb3B0L2xpYiogL3Vzci9saWIqIFwKKyAgICAgICAgICAgICAiJHdpdGhfYm9vc3QiIEM6L0Jvb3N0L2xpYiAvbGliKgorICAgIGRvCisgICAgICAjIERvbid0IHdhc3RlIHRpbWUgd2l0aCBkaXJlY3RvcmllcyB0aGF0IGRvbid0IGV4aXN0LgorICAgICAgaWYgdGVzdCB4IiRib29zdF9sZHBhdGgiICE9IHggJiYgdGVzdCAhIC1lICIkYm9vc3RfbGRwYXRoIjsgdGhlbgorICAgICAgICBjb250aW51ZQorICAgICAgZmkKKyAgICAgIGJvb3N0X3NhdmVfTERGTEFHUz0kTERGTEFHUworICAgICAgIyBBcmUgd2UgbG9va2luZyBmb3IgYSBzdGF0aWMgbGlicmFyeT8KKyAgICAgIGNhc2UgJGJvb3N0X2xkcGF0aDokYm9vc3RfcnRvcHRfIGluICMoCisgICAgICAgICgqPyo6KnMqKSAjIFllcyAoTm9uIGVtcHR5IGJvb3N0X2xkcGF0aCArIHMgaW4gcnQgb3B0KQorICAgICAgICAgIEJvb3N0X2xpYl9MSUJTPSIkYm9vc3RfbGRwYXRoL2xpYiRib29zdF9saWIuJGxpYmV4dCIKKyAgICAgICAgICB0ZXN0IC1lICIkQm9vc3RfbGliX0xJQlMiIHx8IGNvbnRpbnVlOzsgIygKKyAgICAgICAgKCopICMgTm86IHVzZSAtbGJvb3N0X2ZvbyB0byBmaW5kIHRoZSBzaGFyZWQgbGlicmFyeS4KKyAgICAgICAgICBCb29zdF9saWJfTElCUz0iLWwkYm9vc3RfbGliIjs7CisgICAgICBlc2FjCisgICAgICBib29zdF9zYXZlX0xJQlM9JExJQlMKKyAgICAgIExJQlM9IiRCb29zdF9saWJfTElCUyAkTElCUyIKKyAgICAgIHRlc3QgeCIkYm9vc3RfbGRwYXRoIiAhPSB4ICYmIExERkxBR1M9IiRMREZMQUdTIC1MJGJvb3N0X2xkcGF0aCIKK2RubCBGaXJzdCBhcmd1bWVudCBvZiBBQ19MSU5LX0lGRUxTRSBsZWZ0IGVtcHR5IGJlY2F1c2UgdGhlIHRlc3QgZmlsZSBpcworZG5sIGdlbmVyYXRlZCBvbmx5IG9uY2UgYWJvdmUgKGJlZm9yZSB3ZSBzdGFydCB0aGUgZm9yIGxvb3BzKS4KKyAgICAgIF9CT09TVF9BQ19MSU5LX0lGRUxTRShbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbQm9vc3RfbGliPXllc10sIFtCb29zdF9saWI9bm9dKQorICAgICAgYWNfb2JqZXh0PSRib29zdF9zYXZlX2FjX29iamV4dAorICAgICAgTERGTEFHUz0kYm9vc3Rfc2F2ZV9MREZMQUdTCisgICAgICBMSUJTPSRib29zdF9zYXZlX0xJQlMKKyAgICAgIGlmIHRlc3QgeCIkQm9vc3RfbGliIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgIyBDaGVjayBvciB1c2VkIGNhY2hlZCByZXN1bHQgb2Ygd2hldGhlciBvciBub3QgdXNpbmcgLVIgb3IKKyAgICAgICAgIyAtcnBhdGggbWFrZXMgc2Vuc2UuICBTb21lIGltcGxlbWVudGF0aW9ucyBvZiBsZCwgc3VjaCBhcyBmb3IKKyAgICAgICAgIyBNYWMgT1NYLCByZXF1aXJlIC1ycGF0aCBidXQgLVIgaXMgdGhlIGZsYWcga25vd24gdG8gd29yayBvbgorICAgICAgICAjIG90aGVyIHN5c3RlbXMuICBodHRwczovL2dpdGh1Yi5jb20vdHN1bmEvYm9vc3QubTQvaXNzdWVzLzE5CisgICAgICAgIEFDX0NBQ0hFX1ZBTChbYm9vc3RfY3ZfcnBhdGhfbGlua19sZGZsYWddLAorICAgICAgICAgIFtjYXNlICRib29zdF9sZHBhdGggaW4KKyAgICAgICAgICAgJycpICMgTm90aGluZyB0byBkby4KKyAgICAgICAgICAgICBib29zdF9jdl9ycGF0aF9saW5rX2xkZmxhZz0KKyAgICAgICAgICAgICBib29zdF9ycGF0aF9saW5rX2xkZmxhZ19mb3VuZD15ZXM7OworICAgICAgICAgICAqKQorICAgICAgICAgICAgZm9yIGJvb3N0X2N2X3JwYXRoX2xpbmtfbGRmbGFnIGluIC1XbCwtUiwgLVdsLC1ycGF0aCw7IGRvCisgICAgICAgICAgICAgIExERkxBR1M9IiRib29zdF9zYXZlX0xERkxBR1MgLUwkYm9vc3RfbGRwYXRoICRib29zdF9jdl9ycGF0aF9saW5rX2xkZmxhZyRib29zdF9sZHBhdGgiCisgICAgICAgICAgICAgIExJQlM9IiRib29zdF9zYXZlX0xJQlMgJEJvb3N0X2xpYl9MSUJTIgorICAgICAgICAgICAgICBfQk9PU1RfQUNfTElOS19JRkVMU0UoW10sCisgICAgICAgICAgICAgICAgW2Jvb3N0X3JwYXRoX2xpbmtfbGRmbGFnX2ZvdW5kPXllcworICAgICAgICAgICAgICAgIGJyZWFrXSwKKyAgICAgICAgICAgICAgICBbYm9vc3RfcnBhdGhfbGlua19sZGZsYWdfZm91bmQ9bm9dKQorICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgOzsKKyAgICAgICAgICBlc2FjCisgICAgICAgICAgQVNfSUYoW3Rlc3QgIngkYm9vc3RfcnBhdGhfbGlua19sZGZsYWdfZm91bmQiICE9ICJ4eWVzIl0sCisgICAgICAgICAgICBbQUNfTVNHX0VSUk9SKFtVbmFibGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gdXNlIC1SIG9yIC1ycGF0aF0pXSkKKyAgICAgICAgICBMREZMQUdTPSRib29zdF9zYXZlX0xERkxBR1MKKyAgICAgICAgICBMSUJTPSRib29zdF9zYXZlX0xJQlMKKyAgICAgICAgICBdKQorICAgICAgICB0ZXN0IHgiJGJvb3N0X2xkcGF0aCIgIT0geCAmJgorICAgICAgICAgIEJvb3N0X2xpYl9MREZMQUdTPSItTCRib29zdF9sZHBhdGggJGJvb3N0X2N2X3JwYXRoX2xpbmtfbGRmbGFnJGJvb3N0X2xkcGF0aCIKKyAgICAgICAgQm9vc3RfbGliX0xEUEFUSD0iJGJvb3N0X2xkcGF0aCIKKyAgICAgICAgYnJlYWsgNworICAgICAgZWxzZQorICAgICAgICBib29zdF9mYWlsZWRfbGlicz0iJGJvb3N0X2ZhaWxlZF9saWJzQCRib29zdF9saWJAIgorICAgICAgZmkKKyAgICBkb25lCisgIGRvbmUKK2RvbmUKK2RvbmUKK2RvbmUKK2RvbmUKK2RvbmUgIyBib29zdF9saWJfCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitdKQorCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIworIyBDaGVja3MgZm9yIHRoZSB2YXJpb3VzIEJvb3N0IGxpYnJhcmllcy4gIworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIworCisjIExpc3Qgb2YgYm9vc3QgbGlicmFyaWVzOiBodHRwOi8vd3d3LmJvb3N0Lm9yZy9saWJzL2xpYnJhcmllcy5odG0KKyMgVGhlIHBhZ2UgaHR0cDovL2JldGEuYm9vc3Qub3JnL2RvYy9saWJzIGlzIHVzZWZ1bDogaXQgZ2l2ZXMgdGhlIGZpcnN0IHJlbGVhc2UKKyMgdmVyc2lvbiBvZiBlYWNoIGxpYnJhcnkgKGFtb25nIG90aGVyIHRoaW5ncykuCisKKyMgQk9PU1RfREVGVU4oTElCUkFSWSwgQ09ERSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRGVmaW5lIEJPT1NUXzxMSUJSQVJZLVVQUEVSQ0FTRT4gYXMgYSBtYWNybyB0aGF0IHJ1bnMgQ09ERS4KKyMKKyMgVXNlIGluZGlyIHRvIGF2b2lkIHRoZSB3YXJuaW5nIG9uIHVuZGVycXVvdGVkIG1hY3JvIG5hbWUgZ2l2ZW4gdG8gQUNfREVGVU4uCittNF9kZWZpbmUoW0JPT1NUX0RFRlVOXSwKK1ttNF9pbmRpcihbQUNfREVGVU5dLAorICAgICAgICAgIG00X3RvdXBwZXIoW0JPT1NUXyQxXSksCitbbTRfcHVzaGRlZihbQk9PU1RfTGlicmFyeV0sIFskMV0pZG5sCiskMgorbTRfcG9wZGVmKFtCT09TVF9MaWJyYXJ5XSlkbmwKK10pCitdKQorCisjIEJPT1NUX0FSUkFZKCkKKyMgLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5BcnJheQorQk9PU1RfREVGVU4oW0FycmF5XSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvYXJyYXkuaHBwXSldKQorCisKKyMgQk9PU1RfQVNJTygpCisjIC0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5Bc2lvIChuZXcgaW4gQm9vc3QgMS4zNSkuCitCT09TVF9ERUZVTihbQXNpb10sCitbQUNfUkVRVUlSRShbQk9PU1RfU1lTVEVNXSlkbmwKK0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9hc2lvLmhwcF0pXSkKKworCisjIEJPT1NUX0JJTkQoKQorIyAtLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuQmluZC4KK0JPT1NUX0RFRlVOKFtCaW5kXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvYmluZC5ocHBdKV0pCisKKworIyBCT09TVF9DSFJPTk8oKQorIyAtLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5DaHJvbm8uCitCT09TVF9ERUZVTihbQ2hyb25vXSwKK1sjIERvIHdlIGhhdmUgdG8gY2hlY2sgZm9yIEJvb3N0LlN5c3RlbT8gIFRoaXMgbGluay10aW1lIGRlcGVuZGVuY3kgd2FzCisjIGFkZGVkIGFzIG9mIDEuMzUuMC4gIElmIHdlIGhhdmUgYSB2ZXJzaW9uIDwxLjM1LCB3ZSBtdXN0IG5vdCBhdHRlbXB0IHRvCisjIGZpbmQgQm9vc3QuU3lzdGVtIGFzIGl0IGRpZG4ndCBleGlzdCBieSB0aGVuLgoraWYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtZ2UgMTM1OyB0aGVuCisgIEJPT1NUX1NZU1RFTShbJDFdKQorZmkgIyBlbmQgb2YgdGhlIEJvb3N0LlN5c3RlbSBjaGVjay4KK2Jvb3N0X2ZpbGVzeXN0ZW1fc2F2ZV9MSUJTPSRMSUJTCitib29zdF9maWxlc3lzdGVtX3NhdmVfTERGTEFHUz0kTERGTEFHUworbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX1NZU1RFTV8oTElCU3xMREZMQUdTKSRdKWRubAorTElCUz0iJExJQlMgJEJPT1NUX1NZU1RFTV9MSUJTIgorTERGTEFHUz0iJExERkxBR1MgJEJPT1NUX1NZU1RFTV9MREZMQUdTIgorQk9PU1RfRklORF9MSUIoW2Nocm9ub10sIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L2Nocm9uby5ocHBdLAorICAgICAgICAgICAgICAgIFtib29zdDo6Y2hyb25vOjp0aHJlYWRfY2xvY2sgZDtdKQoraWYgdGVzdCAkZW5hYmxlX3N0YXRpY19ib29zdCA9IHllcyAmJiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxMzU7IHRoZW4KKyAgQk9PU1RfQ0hST05PX0xJQlM9IiRCT09TVF9DSFJPTk9fTElCUyAkQk9PU1RfU1lTVEVNX0xJQlMiCitmaQorTElCUz0kYm9vc3RfZmlsZXN5c3RlbV9zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X2ZpbGVzeXN0ZW1fc2F2ZV9MREZMQUdTCitdKSMgQk9PU1RfQ0hST05PCisKKworIyBCT09TVF9DT05URVhUKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuQ29udGV4dC4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCisjCisjICogVGhpcyBsaWJyYXJ5IHdhcyBpbnRyb2R1Y2VkIGluIEJvb3N0IDEuNTEuMAorIyAqIFRoZSBzaWduYXR1cmVzIG9mIG1ha2VfZmNvbnRleHQoKSBhbmQganVtcF9mY29udGV4dCB3ZXJlIGNoYW5nZWQgaW4gMS41Ni4wCisjICogQSBkZXBlbmRlbmN5IG9uIGJvb3N0X3RocmVhZCBhcHBlYXJzIGluIDEuNTcuMAorQk9PU1RfREVGVU4oW0NvbnRleHRdLAorW2Jvb3N0X2NvbnRleHRfc2F2ZV9MSUJTPSRMSUJTCisgYm9vc3RfY29udGV4dF9zYXZlX0xERkxBR1M9JExERkxBR1MKK2lmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWdlIDE1NzsgdGhlbgorICBCT09TVF9USFJFQUQoWyQxXSkKKyAgbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX1RIUkVBRF8oTElCU3xMREZMQUdTKSRdKWRubAorICBMSUJTPSIkTElCUyAkQk9PU1RfVEhSRUFEX0xJQlMiCisgIExERkxBR1M9IiRMREZMQUdTICRCT09TVF9USFJFQURfTERGTEFHUyIKK2ZpCitCT09TVF9GSU5EX0xJQihbY29udGV4dF0sIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L2NvbnRleHQvYWxsLmhwcF0sW1sKKworLy8gY3JlYXRlcyBhIHN0YWNrCit2b2lkICogc3RhY2tfcG9pbnRlciA9IG5ldyB2b2lkKls0MDk2XTsKK3N0ZDo6c2l6ZV90IGNvbnN0IHNpemUgPSBzaXplb2Yodm9pZCpbNDA5Nl0pOworCisjaWYgQk9PU1RfVkVSU0lPTiA8PSAxMDUxMDAKK2N0eDo6bWFrZV9mY29udGV4dCgmZmMsIGYpOworcmV0dXJuIGN0eDo6anVtcF9mY29udGV4dCgmZmNtLCAmZmMsIDMpID09IDY7CisKKyNlbHNlCisKK2ZjID0gY3R4OjptYWtlX2Zjb250ZXh0KHN0YWNrX3BvaW50ZXIsIHNpemUsIGYpOworcmV0dXJuIGN0eDo6anVtcF9mY29udGV4dCgmZmNtLCBmYywgMykgPT0gNjsKKworI2VuZGlmCisKKworXV0sW2RubAorCisjaW5jbHVkZSA8Ym9vc3QvdmVyc2lvbi5ocHA+CisjaWYgQk9PU1RfVkVSU0lPTiA8PSAxMDUxMDAKKworbmFtZXNwYWNlIGN0eCA9IGJvb3N0OjpjdHg7CisKK3N0YXRpYyBjdHg6OmZjb250ZXh0X3QgZmNtLCBmYzsKKworc3RhdGljIHZvaWQgZihpbnRwdHJfdCBpKSB7CisgICAgY3R4OjpqdW1wX2Zjb250ZXh0KCZmYywgJmZjbSwgaSAqIDIpOworfQorCisjZWxpZiBCT09TVF9WRVJTSU9OIDw9IDEwNTUwMAorCituYW1lc3BhY2UgY3R4ID0gYm9vc3Q6OmNvbnRleHQ7CisKKy8vIGNvbnRleHQKK3N0YXRpYyBjdHg6OmZjb250ZXh0X3QgZmNtLCAqZmM7CisKKy8vIGNvbnRleHQtZnVuY3Rpb24KK3N0YXRpYyB2b2lkIGYoaW50cHRyX3QgaSkgeworICAgIGN0eDo6anVtcF9mY29udGV4dChmYywgJmZjbSwgaSAqIDIpOworfQorCisjZWxzZQorCituYW1lc3BhY2UgY3R4ID0gYm9vc3Q6OmNvbnRleHQ7CisKKy8vIGNvbnRleHQKK3N0YXRpYyBjdHg6OmZjb250ZXh0X3QgZmNtLCBmYzsKKworLy8gY29udGV4dC1mdW5jdGlvbgorc3RhdGljIHZvaWQgZihpbnRwdHJfdCBpKSB7CisgICAgY3R4OjpqdW1wX2Zjb250ZXh0KCZmYywgZmNtLCBpICogMik7Cit9CisjZW5kaWYKK10pCitMSUJTPSRib29zdF9jb250ZXh0X3NhdmVfTElCUworTERGTEFHUz0kYm9vc3RfY29udGV4dF9zYXZlX0xERkxBR1MKK10pIyBCT09TVF9DT05URVhUCisKKworIyBCT09TVF9DT05WRVJTSU9OKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkNvbnZlcnNpb24gKGNhc3QgLyBsZXhpY2FsX2Nhc3QpCitCT09TVF9ERUZVTihbQ29udmVyc2lvbl0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L2Nhc3QuaHBwXSkKK0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9sZXhpY2FsX2Nhc3QuaHBwXSkKK10pIyBCT09TVF9DT05WRVJTSU9OCisKKworIyBCT09TVF9DT1JPVVRJTkUoW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5Db3JvdXRpbmUuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLiAgVGhpcyBsaWJyYXJ5IHdhcyBpbnRyb2R1Y2VkIGluIEJvb3N0CisjIDEuNTMuMAorQk9PU1RfREVGVU4oW0Nvcm91dGluZV0sCitbCitib29zdF9jb3JvdXRpbmVfc2F2ZV9MSUJTPSRMSUJTCitib29zdF9jb3JvdXRpbmVfc2F2ZV9MREZMQUdTPSRMREZMQUdTCisjIExpbmstdGltZSBkZXBlbmRlbmN5IGZyb20gY29yb3V0aW5lIHRvIGNvbnRleHQKK0JPT1NUX0NPTlRFWFQoWyQxXSkKKyMgU3RhcnRpbmcgZnJvbSBCb29zdCAxLjU1IGEgZGVwZW5kZW5jeSBvbiBCb29zdC5TeXN0ZW0gaXMgYWRkZWQKK2lmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWdlIDE1NTsgdGhlbgorICBCT09TVF9TWVNURU0oWyQxXSkKK2ZpCittNF9wYXR0ZXJuX2FsbG93KFteQk9PU1RfKENPTlRFWFR8U1lTVEVNKV8oTElCU3xMREZMQUdTKV0pCitMSUJTPSIkTElCUyAkQk9PU1RfQ09OVEVYVF9MSUJTICRCT09TVF9TWVNURU1fTElCUyIKK0xERkxBR1M9IiRMREZMQUdTICRCT09TVF9DT05URVhUX0xERkxBR1MiCisKKyMgaW4gMS41MyBjb3JvdXRpbmUgd2FzIGEgaGVhZGVyIG9ubHkgbGlicmFyeQoraWYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtZXEgMTUzOyB0aGVuCisgIEJPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9jb3JvdXRpbmUvY29yb3V0aW5lLmhwcF0pCitlbHNlCisgIEJPT1NUX0ZJTkRfTElCKFtjb3JvdXRpbmVdLCBbJDFdLAorCQkgIFtib29zdC9jb3JvdXRpbmUvY29yb3V0aW5lLmhwcF0sCisJCSAgWworICAjaW5jbHVkZSA8Ym9vc3QvdmVyc2lvbi5ocHA+CisgICNpZiAgIEJPT1NUX1ZFUlNJT04gPD0gMTA1NTAwCisgIGJvb3N0Ojpjb3JvdXRpbmVzOjpjb3JvdXRpbmU8aW50KGludCk+IGNvcm87IGNvcm8uZ2V0KCk7CisgICNlbHNlCisgIGJvb3N0Ojpjb3JvdXRpbmVzOjphc3ltbWV0cmljX2Nvcm91dGluZTxpbnQ+OjpwdWxsX3R5cGUgY29ybzsgY29yby5nZXQoKTsKKyAgI2VuZGlmCisgIF0pCitmaQorIyBMaW5rLXRpbWUgZGVwZW5kZW5jeSBmcm9tIGNvcm91dGluZSB0byBjb250ZXh0LCBleGlzdGVkIG9ubHkgaW4gMS41MywgaW4gMS41NAorIyBjb3JvdXRpbmUgZG9lc24ndCB1c2UgY29udGV4dCBmcm9tIGl0cyBoZWFkZXJzIGJ1dCBmcm9tIGl0cyBsaWJyYXJ5LgoraWYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtZXEgMTUzIHx8IHRlc3QgJGVuYWJsZV9zdGF0aWNfYm9vc3QgPSB5ZXMgJiYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtZ2UgMTU0OyB0aGVuCisgIEJPT1NUX0NPUk9VVElORV9MSUJTPSIkQk9PU1RfQ09ST1VUSU5FX0xJQlMgJEJPT1NUX0NPTlRFWFRfTElCUyIKKyAgQk9PU1RfQ09ST1VUSU5FX0xERkxBR1M9IiRCT09TVF9DT1JPVVRJTkVfTERGTEFHUyAkQk9PU1RfQ09OVEVYVF9MREZMQUdTIgorZmkKK2lmIHRlc3QgJGVuYWJsZV9zdGF0aWNfYm9vc3QgPSB5ZXMgJiYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtZ2UgMTU1OyB0aGVuCisgIEJPT1NUX0NPUk9VVElORV9MSUJTPSIkQk9PU1RfQ09ST1VUSU5FX0xJQlMgJEJPT1NUX1NZU1RFTV9MSUJTIgorICBCT09TVF9DT1JPVVRJTkVfTERGTEFHUz0iJEJPT1NUX0NPUk9VVElORV9MREZMQUdTICRCT09TVF9TWVNURU1fTERGTEFHUyIKK2ZpCitMSUJTPSRib29zdF9jb3JvdXRpbmVfc2F2ZV9MSUJTCitMREZMQUdTPSRib29zdF9jb3JvdXRpbmVfc2F2ZV9MREZMQUdTCitdKSMgQk9PU1RfQ09ST1VUSU5FCisKKworIyBCT09TVF9DUkMoKQorIyAtLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5DUkMKK0JPT1NUX0RFRlVOKFtDUkNdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9jcmMuaHBwXSkKK10pIyBCT09TVF9DUkMKKworCisjIEJPT1NUX0RBVEVfVElNRShbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkRhdGVfVGltZS4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbRGF0ZV9UaW1lXSwKK1tCT09TVF9GSU5EX0xJQihbZGF0ZV90aW1lXSwgWyQxXSwKKyAgICAgICAgICAgICAgICBbYm9vc3QvZGF0ZV90aW1lL3Bvc2l4X3RpbWUvcG9zaXhfdGltZS5ocHBdLAorICAgICAgICAgICAgICAgIFtib29zdDo6cG9zaXhfdGltZTo6cHRpbWUgdDtdKQorXSkjIEJPT1NUX0RBVEVfVElNRQorCisKKyMgQk9PU1RfRklMRVNZU1RFTShbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5GaWxlc3lzdGVtLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsIHNlZQorIyB0aGUgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4KKyMgRG8gbm90IGNoZWNrIGZvciBib29zdC9maWxlc3lzdGVtLmhwcCBiZWNhdXNlIHRoaXMgZmlsZSB3YXMgaW50cm9kdWNlZCBpbgorIyAxLjM0LgorQk9PU1RfREVGVU4oW0ZpbGVzeXN0ZW1dLAorWyMgRG8gd2UgaGF2ZSB0byBjaGVjayBmb3IgQm9vc3QuU3lzdGVtPyAgVGhpcyBsaW5rLXRpbWUgZGVwZW5kZW5jeSB3YXMKKyMgYWRkZWQgYXMgb2YgMS4zNS4wLiAgSWYgd2UgaGF2ZSBhIHZlcnNpb24gPDEuMzUsIHdlIG11c3Qgbm90IGF0dGVtcHQgdG8KKyMgZmluZCBCb29zdC5TeXN0ZW0gYXMgaXQgZGlkbid0IGV4aXN0IGJ5IHRoZW4uCitpZiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxMzU7IHRoZW4KKyAgQk9PU1RfU1lTVEVNKFskMV0pCitmaSAjIGVuZCBvZiB0aGUgQm9vc3QuU3lzdGVtIGNoZWNrLgorYm9vc3RfZmlsZXN5c3RlbV9zYXZlX0xJQlM9JExJQlMKK2Jvb3N0X2ZpbGVzeXN0ZW1fc2F2ZV9MREZMQUdTPSRMREZMQUdTCittNF9wYXR0ZXJuX2FsbG93KFteQk9PU1RfU1lTVEVNXyhMSUJTfExERkxBR1MpJF0pZG5sCitMSUJTPSIkTElCUyAkQk9PU1RfU1lTVEVNX0xJQlMiCitMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfU1lTVEVNX0xERkxBR1MiCitCT09TVF9GSU5EX0xJQihbZmlsZXN5c3RlbV0sIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L2ZpbGVzeXN0ZW0vcGF0aC5ocHBdLCBbYm9vc3Q6OmZpbGVzeXN0ZW06OnBhdGggcDtdKQoraWYgdGVzdCAkZW5hYmxlX3N0YXRpY19ib29zdCA9IHllcyAmJiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxMzU7IHRoZW4KKyAgQk9PU1RfRklMRVNZU1RFTV9MSUJTPSIkQk9PU1RfRklMRVNZU1RFTV9MSUJTICRCT09TVF9TWVNURU1fTElCUyIKK2ZpCitMSUJTPSRib29zdF9maWxlc3lzdGVtX3NhdmVfTElCUworTERGTEFHUz0kYm9vc3RfZmlsZXN5c3RlbV9zYXZlX0xERkxBR1MKK10pIyBCT09TVF9GSUxFU1lTVEVNCisKKworIyBCT09TVF9GTFlXRUlHSFQoKQorIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5GbHl3ZWlnaHQuCitCT09TVF9ERUZVTihbRmx5d2VpZ2h0XSwKK1tkbmwgVGhlcmUncyBhIGhpZGRlbiBkZXBlbmRlbmN5IG9uIHB0aHJlYWRzLgorQUNfUkVRVUlSRShbX0JPT1NUX1BUSFJFQURfRkxBR10pZG5sCitCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvZmx5d2VpZ2h0LmhwcF0pCitBQ19TVUJTVChbQk9PU1RfRkxZV0VJR0hUX0xJQlNdLCBbJGJvb3N0X2N2X3B0aHJlYWRfZmxhZ10pCitdKQorCisKKyMgQk9PU1RfRk9SRUFDSCgpCisjIC0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5Gb3JlYWNoLgorQk9PU1RfREVGVU4oW0ZvcmVhY2hdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9mb3JlYWNoLmhwcF0pXSkKKworCisjIEJPT1NUX0ZPUk1BVCgpCisjIC0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkZvcm1hdC4KKyMgTm90ZTogd2UgY2FuJ3QgY2hlY2sgZm9yIGJvb3N0L2Zvcm1hdC9mb3JtYXRfZndkLmhwcCBiZWNhdXNlIHRoZSBoZWFkZXIgaXNuJ3QKKyMgc3RhbmRhbG9uZS4gIEl0IGNhbid0IGJlIGNvbXBpbGVkIGJlY2F1c2UgaXQgdHJpZ2dlcnMgdGhlIGZvbGxvd2luZyBlcnJvcjoKKyMgYm9vc3QvZm9ybWF0L2RldGFpbC9jb25maWdfbWFjcm9zLmhwcDo4ODogZXJyb3I6ICdsb2NhbGUnIGluIG5hbWVzcGFjZSAnc3RkJworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9lcyBub3QgbmFtZSBhIHR5cGUKK0JPT1NUX0RFRlVOKFtGb3JtYXRdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9mb3JtYXQuaHBwXSldKQorCisKKyMgQk9PU1RfRlVOQ1RJT04oKQorIyAtLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkZ1bmN0aW9uCitCT09TVF9ERUZVTihbRnVuY3Rpb25dLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9mdW5jdGlvbi5ocHBdKV0pCisKKworIyBCT09TVF9HRU9NRVRSWSgpCisjIC0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuR2VvbWV0cnkgKG5ldyBzaW5jZSAxLjQ3LjApLgorQk9PU1RfREVGVU4oW0dlb21ldHJ5XSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvZ2VvbWV0cnkuaHBwXSkKK10pIyBCT09TVF9HRU9NRVRSWQorCisKKyMgQk9PU1RfR1JBUEgoW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkdyYXBocy4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbR3JhcGhdLAorW2Jvb3N0X2dyYXBoX3NhdmVfTElCUz0kTElCUworYm9vc3RfZ3JhcGhfc2F2ZV9MREZMQUdTPSRMREZMQUdTCisjIExpbmstdGltZSBkZXBlbmRlbmN5IGZyb20gZ3JhcGggdG8gcmVnZXggd2FzIGFkZGVkIGFzIG9mIDEuNDAuMC4KK2lmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWdlIDE0MDsgdGhlbgorICBCT09TVF9SRUdFWChbJDFdKQorICBtNF9wYXR0ZXJuX2FsbG93KFteQk9PU1RfUkVHRVhfKExJQlN8TERGTEFHUykkXSlkbmwKKyAgTElCUz0iJExJQlMgJEJPT1NUX1JFR0VYX0xJQlMiCisgIExERkxBR1M9IiRMREZMQUdTICRCT09TVF9SRUdFWF9MREZMQUdTIgorZmkKK0JPT1NUX0ZJTkRfTElCKFtncmFwaF0sIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L2dyYXBoL2FkamFjZW5jeV9saXN0LmhwcF0sIFtib29zdDo6YWRqYWNlbmN5X2xpc3Q8PiBnO10pCitMSUJTPSRib29zdF9ncmFwaF9zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X2dyYXBoX3NhdmVfTERGTEFHUworXSkjIEJPT1NUX0dSQVBICisKKworIyBCT09TVF9JT1NUUkVBTVMoW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5JT1N0cmVhbXMuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW0lPU3RyZWFtc10sCitbQk9PU1RfRklORF9MSUIoW2lvc3RyZWFtc10sIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L2lvc3RyZWFtcy9kZXZpY2UvZmlsZV9kZXNjcmlwdG9yLmhwcF0sCisgICAgICAgICAgICAgICAgW2Jvb3N0Ojppb3N0cmVhbXM6OmZpbGVfZGVzY3JpcHRvciBmZDsgZmQuY2xvc2UoKTtdKQorXSkjIEJPT1NUX0lPU1RSRUFNUworCisKKyMgQk9PU1RfSEFTSCgpCisjIC0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5GdW5jdGlvbmFsL0hhc2gKK0JPT1NUX0RFRlVOKFtIYXNoXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvZnVuY3Rpb25hbC9oYXNoLmhwcF0pXSkKKworCisjIEJPT1NUX0xBTUJEQSgpCisjIC0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkxhbWJkYQorQk9PU1RfREVGVU4oW0xhbWJkYV0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L2xhbWJkYS9sYW1iZGEuaHBwXSldKQorCisKKyMgQk9PU1RfTE9DQUxFKCkKKyMgLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuTG9jYWxlCitCT09TVF9ERUZVTihbTG9jYWxlXSwKK1sKK2Jvb3N0X2xvY2FsZV9zYXZlX0xJQlM9JExJQlMKK2Jvb3N0X2xvY2FsZV9zYXZlX0xERkxBR1M9JExERkxBR1MKKyMgcmVxdWlyZSBTWVNURU0gZm9yIGJvb3N0LTEuNTAuMCBhbmQgdXAKK2lmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWdlIDE1MDsgdGhlbgorICBCT09TVF9TWVNURU0oWyQxXSkKKyAgbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX1NZU1RFTV8oTElCU3xMREZMQUdTKSRdKWRubAorICBMSUJTPSIkTElCUyAkQk9PU1RfU1lTVEVNX0xJQlMiCisgIExERkxBR1M9IiRMREZMQUdTICRCT09TVF9TWVNURU1fTERGTEFHUyIKK2ZpICMgZW5kIG9mIHRoZSBCb29zdC5TeXN0ZW0gY2hlY2suCitCT09TVF9GSU5EX0xJQihbbG9jYWxlXSwgWyQxXSwKKyAgICBbYm9vc3QvbG9jYWxlLmhwcF0sCisgICAgW1tib29zdDo6bG9jYWxlOjpnZW5lcmF0b3IgZ2VuOyBzdGQ6OmxvY2FsZTo6Z2xvYmFsKGdlbigiIikpO11dKQorTElCUz0kYm9vc3RfbG9jYWxlX3NhdmVfTElCUworTERGTEFHUz0kYm9vc3RfbG9jYWxlX3NhdmVfTERGTEFHUworXSkjIEJPT1NUX0xPQ0FMRQorCisjIEJPT1NUX0xPRyhbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkxvZy4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbTG9nXSwKK1tib29zdF9sb2dfc2F2ZV9MSUJTPSRMSUJTCitib29zdF9sb2dfc2F2ZV9MREZMQUdTPSRMREZMQUdTCitCT09TVF9TWVNURU0oWyQxXSkKK0JPT1NUX0ZJTEVTWVNURU0oWyQxXSkKK0JPT1NUX0RBVEVfVElNRShbJDFdKQorbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUXyhTWVNURU18RklMRVNZU1RFTXxEQVRFX1RJTUUpXyhMSUJTfExERkxBR1MpJF0pZG5sCitMSUJTPSIkTElCUyAkQk9PU1RfREFURV9USU1FX0xJQlMgJEJPT1NUX0ZJTEVTWVNURU1fTElCUyAkQk9PU1RfU1lTVEVNX0xJQlMiCitMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfREFURV9USU1FX0xERkxBR1MgJEJPT1NUX0ZJTEVTWVNURU1fTERGTEFHUyAkQk9PU1RfU1lTVEVNX0xERkxBR1MiCitCT09TVF9GSU5EX0xJQihbbG9nXSwgWyQxXSwKKyAgICBbYm9vc3QvbG9nL2NvcmUvY29yZS5ocHBdLAorICAgIFtib29zdDo6bG9nOjphdHRyaWJ1dGUgYTsgYS5nZXRfdmFsdWUoKTtdKQorTElCUz0kYm9vc3RfbG9nX3NhdmVfTElCUworTERGTEFHUz0kYm9vc3RfbG9nX3NhdmVfTERGTEFHUworXSkjIEJPT1NUX0xPRworCisKKyMgQk9PU1RfTE9HX1NFVFVQKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuTG9nLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsIHNlZSB0aGUKKyMgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4KK0JPT1NUX0RFRlVOKFtMb2dfU2V0dXBdLAorW2Jvb3N0X2xvZ19zZXR1cF9zYXZlX0xJQlM9JExJQlMKK2Jvb3N0X2xvZ19zZXR1cF9zYXZlX0xERkxBR1M9JExERkxBR1MKK0JPT1NUX0xPRyhbJDFdKQorbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX0xPR18oTElCU3xMREZMQUdTKSRdKWRubAorTElCUz0iJExJQlMgJEJPT1NUX0xPR19MSUJTIgorTERGTEFHUz0iJExERkxBR1MgJEJPT1NUX0xPR19MREZMQUdTIgorQk9PU1RfRklORF9MSUIoW2xvZ19zZXR1cF0sIFskMV0sCisgICAgW2Jvb3N0L2xvZy91dGlsaXR5L3NldHVwL2Zyb21fc2V0dGluZ3MuaHBwXSwKKyAgICBbYm9vc3Q6OmxvZzo6YmFzaWNfc2V0dGluZ3M8Y2hhcj4gYnM7IGJzLmVtcHR5KCk7XSkKK0xJQlM9JGJvb3N0X2xvZ19zZXR1cF9zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X2xvZ19zZXR1cF9zYXZlX0xERkxBR1MKK10pIyBCT09TVF9MT0dfU0VUVVAKKworCisjIEJPT1NUX01BVEgoKQorIyAtLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuTWF0aAorIyBUT0RPOiBUaGlzIGxpYnJhcnkgaXNuJ3QgaGVhZGVyLW9ubHkgYnV0IGl0IGNvbWVzIGluIG11bHRpcGxlIGRpZmZlcmVudAorIyBmbGF2b3JzIHRoYXQgZG9uJ3QgcGxheSB3ZWxsIHdpdGggQk9PU1RfRklORF9MSUIgKGUuZywgbGliYm9vc3RfbWF0aF9jOTksCisjIGxpYmJvb3N0X21hdGhfYzk5ZiwgbGliYm9vc3RfbWF0aF9jOTlsLCBsaWJib29zdF9tYXRoX3RyMSwKKyMgbGliYm9vc3RfbWF0aF90cjFmLCBsaWJib29zdF9tYXRoX3RyMWwpLiAgVGhpcyBtYWNybyBtdXN0IGJlIGZpeGVkIHRvIGRvIHRoZQorIyByaWdodCB0aGluZyBhbnl3YXkuCitCT09TVF9ERUZVTihbTWF0aF0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L21hdGgvc3BlY2lhbF9mdW5jdGlvbnMuaHBwXSldKQorCisKKyMgQk9PU1RfTVBJKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdCBNUEkuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLiAgVXNlcyBNUElDWFggdmFyaWFibGUgaWYgaXQgaXMKKyMgc2V0LCBvdGhlcndpc2UgdHJpZXMgQ1hYCisjCitCT09TVF9ERUZVTihbTVBJXSwKK1tib29zdF9zYXZlX0NYWD0ke0NYWH0KK2Jvb3N0X3NhdmVfQ1hYQ1BQPSR7Q1hYQ1BQfQoraWYgdGVzdCB4IiR7TVBJQ1hYfSIgIT0geDsgdGhlbgorICBDWFg9JHtNUElDWFh9CisgIENYWENQUD0iJHtNUElDWFh9IC1FIgorZmkKK0JPT1NUX0ZJTkRfTElCKFttcGldLCBbJDFdLAorICAgICAgICAgICAgICAgW2Jvb3N0L21waS5ocHBdLAorICAgICAgICAgICAgICAgW2ludCBhcmdjID0gMDsKKyAgICAgICAgICAgICAgICBjaGFyICoqYXJndiA9IDA7CisgICAgICAgICAgICAgICAgYm9vc3Q6Om1waTo6ZW52aXJvbm1lbnQgZW52KGFyZ2MsYXJndik7XSkKK0NYWD0ke2Jvb3N0X3NhdmVfQ1hYfQorQ1hYQ1BQPSR7Ym9vc3Rfc2F2ZV9DWFhDUFB9CitdKSMgQk9PU1RfTVBJCisKKworIyBCT09TVF9NVUxUSUFSUkFZKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0Lk11bHRpQXJyYXkKK0JPT1NUX0RFRlVOKFtNdWx0aUFycmF5XSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvbXVsdGlfYXJyYXkuaHBwXSldKQorCisKKyMgQk9PU1RfTlVNRVJJQ19VQkxBUygpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0Lk51bWVyaWNVYmxhcyAoQmFzaWMgTGluZWFyIEFsZ2VicmEpCitCT09TVF9ERUZVTihbTnVtZXJpY19VYmxhc10sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L251bWVyaWMvdWJsYXMvdmVjdG9yLmhwcF0pCitdKSMgQk9PU1RfTlVNRVJJQ19VQkxBUworCisKKyMgQk9PU1RfTlVNRVJJQ19DT05WRVJTSU9OKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuTnVtZXJpY0NvbnZlcnNpb24gKHBvbGljeS1iYXNlZCBudW1lcmljIGNvbnZlcnNpb24pCitCT09TVF9ERUZVTihbTnVtZXJpY19Db252ZXJzaW9uXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvbnVtZXJpYy9jb252ZXJzaW9uL2NvbnZlcnRlci5ocHBdKQorXSkjIEJPT1NUX05VTUVSSUNfQ09OVkVSU0lPTgorCisKKyMgQk9PU1RfT1BUSU9OQUwoKQorIyAtLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0Lk9wdGlvbmFsCitCT09TVF9ERUZVTihbT3B0aW9uYWxdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9vcHRpb25hbC5ocHBdKV0pCisKKworIyBCT09TVF9QUkVQUk9DRVNTT1IoKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5QcmVwcm9jZXNzb3IKK0JPT1NUX0RFRlVOKFtQcmVwcm9jZXNzb3JdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9wcmVwcm9jZXNzb3IvcmVwZWF0LmhwcF0pXSkKKworCisjIEJPT1NUX1JBTkdFKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuUmFuZ2UKK0JPT1NUX0RFRlVOKFtSYW5nZV0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3JhbmdlL2FkYXB0b3JzLmhwcF0pXSkKKworIyBCT09TVF9VTk9SREVSRUQoKQorIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5Vbm9yZGVyZWQKK0JPT1NUX0RFRlVOKFtVbm9yZGVyZWRdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC91bm9yZGVyZWRfbWFwLmhwcF0pXSkKKworCisjIEJPT1NUX1VVSUQoKQorIyAtLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuVXVpZAorQk9PU1RfREVGVU4oW1V1aWRdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC91dWlkL3V1aWQuaHBwXSldKQorCisKKyMgQk9PU1RfUFJPR1JBTV9PUFRJT05TKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuUHJvZ3JhbV9vcHRpb25zLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsCisjIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4KK0JPT1NUX0RFRlVOKFtQcm9ncmFtX09wdGlvbnNdLAorW0JPT1NUX0ZJTkRfTElCKFtwcm9ncmFtX29wdGlvbnNdLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9wcm9ncmFtX29wdGlvbnMuaHBwXSwKKyAgICAgICAgICAgICAgICBbYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6b3B0aW9uc19kZXNjcmlwdGlvbiBkKCJ0ZXN0Iik7XSkKK10pIyBCT09TVF9QUk9HUkFNX09QVElPTlMKKworCisKKyMgX0JPT1NUX1BZVEhPTl9DT05GSUcoVkFSSUFCTEUsIEZMQUcpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTYXZlIFZBUklBQkxFLCBhbmQgZGVmaW5lIGl0IHZpYSBgcHl0aG9uLWNvbmZpZyAtLUZMQUdgLgorIyBTdWJzdGl0dXRlIEJPT1NUX1BZVEhPTl9WQVJJQUJMRS4KK200X2RlZmluZShbX0JPT1NUX1BZVEhPTl9DT05GSUddLAorW0FDX1NVQlNUKFtCT09TVF9QWVRIT05fJDFdLAorICAgICAgICAgIFtgcHl0aG9uLWNvbmZpZyAtLSQyIDI+L2Rldi9udWxsYF0pZG5sCitib29zdF9weXRob25fc2F2ZV8kMT0kJDEKKyQxPSIkJDEgJEJPT1NUX1BZVEhPTl8kMSJdKQorCisKKyMgQk9PU1RfUFlUSE9OKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuUHl0aG9uLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsCisjIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4KK0JPT1NUX0RFRlVOKFtQeXRob25dLAorW19CT09TVF9QWVRIT05fQ09ORklHKFtDUFBGTEFHU10sIFtpbmNsdWRlc10pCitfQk9PU1RfUFlUSE9OX0NPTkZJRyhbTERGTEFHU10sICAgW2xkZmxhZ3NdKQorX0JPT1NUX1BZVEhPTl9DT05GSUcoW0xJQlNdLCAgICAgIFtsaWJzXSkKK200X3BhdHRlcm5fYWxsb3coW15CT09TVF9QWVRIT05fTU9EVUxFJF0pZG5sCitCT09TVF9GSU5EX0xJQlMoW3B5dGhvbl0sIFtweXRob24gcHl0aG9uM10sIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L3B5dGhvbi5ocHBdLAorICAgICAgICAgICAgICAgIFtdLCBbQk9PU1RfUFlUSE9OX01PRFVMRShlbXB0eSkge31dKQorQ1BQRkxBR1M9JGJvb3N0X3B5dGhvbl9zYXZlX0NQUEZMQUdTCitMREZMQUdTPSRib29zdF9weXRob25fc2F2ZV9MREZMQUdTCitMSUJTPSRib29zdF9weXRob25fc2F2ZV9MSUJTCitdKSMgQk9PU1RfUFlUSE9OCisKKworIyBCT09TVF9SRUYoKQorIyAtLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5SZWYKK0JPT1NUX0RFRlVOKFtSZWZdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9yZWYuaHBwXSldKQorCisKKyMgQk9PU1RfUkVHRVgoW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlJlZ2V4LiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsIHNlZSB0aGUKKyMgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4KK0JPT1NUX0RFRlVOKFtSZWdleF0sCitbQk9PU1RfRklORF9MSUIoW3JlZ2V4XSwgWyQxXSwKKyAgICAgICAgICAgICAgICBbYm9vc3QvcmVnZXguaHBwXSwKKyAgICAgICAgICAgICAgICBbYm9vc3Q6OnJlZ2V4IGV4cCgiKiIpOyBib29zdDo6cmVnZXhfbWF0Y2goImZvbyIsIGV4cCk7XSkKK10pIyBCT09TVF9SRUdFWAorCisKKyMgQk9PU1RfU0VSSUFMSVpBVElPTihbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5TZXJpYWxpemF0aW9uLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsIHNlZQorIyB0aGUgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4KK0JPT1NUX0RFRlVOKFtTZXJpYWxpemF0aW9uXSwKK1tCT09TVF9GSU5EX0xJQihbc2VyaWFsaXphdGlvbl0sIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L2FyY2hpdmUvdGV4dF9vYXJjaGl2ZS5ocHBdLAorICAgICAgICAgICAgICAgIFtzdGQ6Om9zdHJlYW0qIG8gPSAwOyAvLyBDaGVhcCB3YXkgdG8gZ2V0IGFuIG9zdHJlYW0uLi4KKyAgICAgICAgICAgICAgICBib29zdDo6YXJjaGl2ZTo6dGV4dF9vYXJjaGl2ZSB0KCpvKTtdKQorXSkjIEJPT1NUX1NFUklBTElaQVRJT04KKworCisjIEJPT1NUX1NJR05BTFMoW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuU2lnbmFscy4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbU2lnbmFsc10sCitbQk9PU1RfRklORF9MSUIoW3NpZ25hbHNdLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9zaWduYWwuaHBwXSwKKyAgICAgICAgICAgICAgICBbYm9vc3Q6OnNpZ25hbDx2b2lkICgpPiBzO10pCitdKSMgQk9PU1RfU0lHTkFMUworCisKKyMgQk9PU1RfU0lHTkFMUzIoKQorIyAtLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlNpZ25hbHMyIChuZXcgc2luY2UgMS4zOS4wKS4KK0JPT1NUX0RFRlVOKFtTaWduYWxzMl0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3NpZ25hbHMyLmhwcF0pCitdKSMgQk9PU1RfU0lHTkFMUzIKKworCisjIEJPT1NUX1NNQVJUX1BUUigpCisjIC0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlNtYXJ0UHRyCitCT09TVF9ERUZVTihbU21hcnRfUHRyXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3Qvc2NvcGVkX3B0ci5ocHBdKQorQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3NoYXJlZF9wdHIuaHBwXSkKK10pCisKKworIyBCT09TVF9TVEFUSUNBU1NFUlQoKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5TdGF0aWNBc3NlcnQKK0JPT1NUX0RFRlVOKFtTdGF0aWNBc3NlcnRdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9zdGF0aWNfYXNzZXJ0LmhwcF0pXSkKKworCisjIEJPT1NUX1NUUklOR19BTEdPKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5TdHJpbmdBbGdvCitCT09TVF9ERUZVTihbU3RyaW5nX0FsZ29dLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9hbGdvcml0aG0vc3RyaW5nLmhwcF0pCitdKQorCisKKyMgQk9PU1RfU1lTVEVNKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuU3lzdGVtLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsIHNlZSB0aGUKKyMgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4gIFRoaXMgbGlicmFyeSB3YXMgaW50cm9kdWNlZCBpbiBCb29zdAorIyAxLjM1LjAuCitCT09TVF9ERUZVTihbU3lzdGVtXSwKK1tCT09TVF9GSU5EX0xJQihbc3lzdGVtXSwgWyQxXSwKKyAgICAgICAgICAgICAgICBbYm9vc3Qvc3lzdGVtL2Vycm9yX2NvZGUuaHBwXSwKKyAgICAgICAgICAgICAgICBbYm9vc3Q6OnN5c3RlbTo6ZXJyb3JfY29kZSBlOyBlLmNsZWFyKCk7XSkKK10pIyBCT09TVF9TWVNURU0KKworCisjIEJPT1NUX1RFU1QoW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuVGVzdC4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbVGVzdF0sCitbbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX0NIRUNLJF0pZG5sCitCT09TVF9GSU5EX0xJQihbdW5pdF90ZXN0X2ZyYW1ld29ya10sIFskMV0sCisgICAgICAgICAgICAgICBbYm9vc3QvdGVzdC91bml0X3Rlc3QuaHBwXSwgW0JPT1NUX0NIRUNLKDIgPT0gMik7XSwKKyAgICAgICAgICAgICAgIFt1c2luZyBib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlOworICAgICAgICAgICAgICAgdGVzdF9zdWl0ZSogaW5pdF91bml0X3Rlc3Rfc3VpdGUoaW50IGFyZ2MsIGNoYXIgKiogYXJndikKKyAgICAgICAgICAgICAgIHsgcmV0dXJuIE5VTEw7IH1dKQorXSkjIEJPT1NUX1RFU1QKKworCisjIEJPT1NUX1RIUkVBRChbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5UaHJlYWQuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW1RocmVhZF0sCitbZG5sIEhhdmluZyB0aGUgcHRocmVhZCBmbGFnIGlzIHJlcXVpcmVkIGF0IGxlYXN0IG9uIEdDQzMgd2hlcmUKK2RubCBib29zdC90aHJlYWQuaHBwIHdvdWxkIGNvbXBsYWluIGlmIHdlIHRyeSB0byBjb21waWxlIHdpdGhvdXQKK2RubCAtcHRocmVhZCBvbiBHTlUvTGludXguCitBQ19SRVFVSVJFKFtfQk9PU1RfUFRIUkVBRF9GTEFHXSlkbmwKK2Jvb3N0X3RocmVhZF9zYXZlX0xJQlM9JExJQlMKK2Jvb3N0X3RocmVhZF9zYXZlX0xERkxBR1M9JExERkxBR1MKK2Jvb3N0X3RocmVhZF9zYXZlX0NQUEZMQUdTPSRDUFBGTEFHUworIyBMaW5rLXRpbWUgZGVwZW5kZW5jeSBmcm9tIHRocmVhZCB0byBzeXN0ZW0gd2FzIGFkZGVkIGFzIG9mIDEuNDkuMC4KK2lmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWdlIDE0OTsgdGhlbgorQk9PU1RfU1lTVEVNKFskMV0pCitmaSAjIGVuZCBvZiB0aGUgQm9vc3QuU3lzdGVtIGNoZWNrLgorbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX1NZU1RFTV8oTElCU3xMREZMQUdTKSRdKWRubAorTElCUz0iJExJQlMgJEJPT1NUX1NZU1RFTV9MSUJTICRib29zdF9jdl9wdGhyZWFkX2ZsYWciCitMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfU1lTVEVNX0xERkxBR1MiCitDUFBGTEFHUz0iJENQUEZMQUdTICRib29zdF9jdl9wdGhyZWFkX2ZsYWciCisKKyMgV2hlbiBjb21waWxpbmcgZm9yIHRoZSBXaW5kb3dzIHBsYXRmb3JtLCB0aGUgdGhyZWFkcyBsaWJyYXJ5IGlzIG5hbWVkCisjIGRpZmZlcmVudGx5LiAgVGhpcyBzdWZmaXggZG9lc24ndCBleGlzdCBpbiBuZXcgdmVyc2lvbnMgb2YgQm9vc3QsIG9yCisjIHBvc3NpYmx5IG5ldyB2ZXJzaW9ucyBvZiBHQ0Mgb24gbWluZ3cgSSBhbSBhc3N1bWluZyBpdCdzIEJvb3N0J3MgY2hhbmdlIGZvcgorIyBub3cgYW5kIEkgYW0gc2V0dGluZyB2ZXJzaW9uIHRvIDEuNDgsIGZvciBsYWNrIG9mIGtub3dsZWRnZSBhcyB0byB3aGVuIHRoaXMKKyMgY2hhbmdlIG9jY3VycmVkLgoraWYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtbHQgMTQ4OyB0aGVuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAoKm1pbmd3KikgYm9vc3RfdGhyZWFkX2xpYl9leHQ9X3dpbjMyOzsKKyAgZXNhYworZmkKK0JPT1NUX0ZJTkRfTElCUyhbdGhyZWFkXSwgW3RocmVhZCRib29zdF90aHJlYWRfbGliX2V4dF0sCisgICAgICAgICAgICAgICAgWyQxXSwKKyAgICAgICAgICAgICAgICBbYm9vc3QvdGhyZWFkLmhwcF0sIFtib29zdDo6dGhyZWFkIHQ7IGJvb3N0OjptdXRleCBtO10pCisKK2Nhc2UgJGhvc3Rfb3MgaW4KKyAgKCptaW5ndyopIGJvb3N0X3RocmVhZF93MzJfc29ja2V0X2xpbms9LWx3czJfMzI7OworZXNhYworCitCT09TVF9USFJFQURfTElCUz0iJEJPT1NUX1RIUkVBRF9MSUJTICRCT09TVF9TWVNURU1fTElCUyAkYm9vc3RfY3ZfcHRocmVhZF9mbGFnICRib29zdF90aHJlYWRfdzMyX3NvY2tldF9saW5rIgorQk9PU1RfVEhSRUFEX0xERkxBR1M9IiRCT09TVF9TWVNURU1fTERGTEFHUyIKK0JPT1NUX0NQUEZMQUdTPSIkQk9PU1RfQ1BQRkxBR1MgJGJvb3N0X2N2X3B0aHJlYWRfZmxhZyIKK0xJQlM9JGJvb3N0X3RocmVhZF9zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X3RocmVhZF9zYXZlX0xERkxBR1MKK0NQUEZMQUdTPSRib29zdF90aHJlYWRfc2F2ZV9DUFBGTEFHUworXSkjIEJPT1NUX1RIUkVBRAorCitBVV9BTElBUyhbQk9PU1RfVEhSRUFEU10sIFtCT09TVF9USFJFQURdKQorCisKKyMgQk9PU1RfVE9LRU5JWkVSKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuVG9rZW5pemVyCitCT09TVF9ERUZVTihbVG9rZW5pemVyXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvdG9rZW5pemVyLmhwcF0pXSkKKworCisjIEJPT1NUX1RSSUJPT0woKQorIyAtLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuVHJpYm9vbAorQk9PU1RfREVGVU4oW1RyaWJvb2xdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9sb2dpYy90cmlib29sX2Z3ZC5ocHBdKQorQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L2xvZ2ljL3RyaWJvb2wuaHBwXSkKK10pCisKKworIyBCT09TVF9UVVBMRSgpCisjIC0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuVHVwbGUKK0JPT1NUX0RFRlVOKFtUdXBsZV0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3R1cGxlL3R1cGxlLmhwcF0pXSkKKworCisjIEJPT1NUX1RZUEVUUkFJVFMoKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5UeXBlVHJhaXRzCitCT09TVF9ERUZVTihbVHlwZVRyYWl0c10sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3R5cGVfdHJhaXRzLmhwcF0pXSkKKworCisjIEJPT1NUX1VUSUxJVFkoKQorIyAtLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuVXRpbGl0eSAobm9uY29weWFibGUsIHJlc3VsdF9vZiwgYmFzZS1mcm9tLW1lbWJlciBpZGlvbSwKKyMgZXRjLikKK0JPT1NUX0RFRlVOKFtVdGlsaXR5XSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvdXRpbGl0eS5ocHBdKV0pCisKKworIyBCT09TVF9WQVJJQU5UKCkKKyMgLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlZhcmlhbnQuCitCT09TVF9ERUZVTihbVmFyaWFudF0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3ZhcmlhbnQvdmFyaWFudF9md2QuaHBwXSkKK0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC92YXJpYW50LmhwcF0pXSkKKworCisjIEJPT1NUX1BPSU5URVJfQ09OVEFJTkVSKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlBvaW50ZXJDb250YWluZXIKK0JPT1NUX0RFRlVOKFtQb2ludGVyX0NvbnRhaW5lcl0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3B0cl9jb250YWluZXIvcHRyX2RlcXVlLmhwcF0pCitCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvcHRyX2NvbnRhaW5lci9wdHJfbGlzdC5ocHBdKQorQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3B0cl9jb250YWluZXIvcHRyX3ZlY3Rvci5ocHBdKQorQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3B0cl9jb250YWluZXIvcHRyX2FycmF5LmhwcF0pCitCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvcHRyX2NvbnRhaW5lci9wdHJfc2V0LmhwcF0pCitCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvcHRyX2NvbnRhaW5lci9wdHJfbWFwLmhwcF0pCitdKSMgQk9PU1RfUE9JTlRFUl9DT05UQUlORVIKKworCisjIEJPT1NUX1dBVkUoW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTk9URTogSWYgeW91IGludGVuZCB0byB1c2UgV2F2ZS9TcGlyaXQgd2l0aCB0aHJlYWQgc3VwcG9ydCwgbWFrZSBzdXJlIHlvdQorIyBjYWxsIEJPT1NUX1RIUkVBRCBmaXJzdC4KKyMgTG9vayBmb3IgQm9vc3QuV2F2ZS4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbV2F2ZV0sCitbQUNfUkVRVUlSRShbQk9PU1RfRklMRVNZU1RFTV0pZG5sCitBQ19SRVFVSVJFKFtCT09TVF9EQVRFX1RJTUVdKWRubAorYm9vc3Rfd2F2ZV9zYXZlX0xJQlM9JExJQlMKK2Jvb3N0X3dhdmVfc2F2ZV9MREZMQUdTPSRMREZMQUdTCittNF9wYXR0ZXJuX2FsbG93KFteQk9PU1RfKChGSUxFKT9TWVNURU18REFURV9USU1FfFRIUkVBRClfKExJQlN8TERGTEFHUykkXSlkbmwKK0xJQlM9IiRMSUJTICRCT09TVF9TWVNURU1fTElCUyAkQk9PU1RfRklMRVNZU1RFTV9MSUJTICRCT09TVF9EQVRFX1RJTUVfTElCUyBcCiskQk9PU1RfVEhSRUFEX0xJQlMiCitMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfU1lTVEVNX0xERkxBR1MgJEJPT1NUX0ZJTEVTWVNURU1fTERGTEFHUyBcCiskQk9PU1RfREFURV9USU1FX0xERkxBR1MgJEJPT1NUX1RIUkVBRF9MREZMQUdTIgorQk9PU1RfRklORF9MSUIoW3dhdmVdLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC93YXZlLmhwcF0sCisgICAgICAgICAgICAgICAgW2Jvb3N0Ojp3YXZlOjp0b2tlbl9pZCBpZDsgZ2V0X3Rva2VuX25hbWUoaWQpO10pCitMSUJTPSRib29zdF93YXZlX3NhdmVfTElCUworTERGTEFHUz0kYm9vc3Rfd2F2ZV9zYXZlX0xERkxBR1MKK10pIyBCT09TVF9XQVZFCisKKworIyBCT09TVF9YUFJFU1NJVkUoKQorIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5YcHJlc3NpdmUgKG5ldyBzaW5jZSAxLjM2LjApLgorQk9PU1RfREVGVU4oW1hwcmVzc2l2ZV0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3hwcmVzc2l2ZS94cHJlc3NpdmUuaHBwXSldKQorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0gIworIyBJbnRlcm5hbCBoZWxwZXJzLiAjCisjIC0tLS0tLS0tLS0tLS0tLS0tICMKKworCisjIF9CT09TVF9QVEhSRUFEX0ZMQUcoKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSW50ZXJuYWwgaGVscGVyIGZvciBCT09TVF9USFJFQUQuICBDb21wdXRlcyBib29zdF9jdl9wdGhyZWFkX2ZsYWcKKyMgd2hpY2ggbXVzdCBiZSB1c2VkIGluIENQUEZMQUdTIGFuZCBMSUJTLgorIworIyBZZXMsIHdlICpuZWVkKiB0byBwdXQgdGhlIC1wdGhyZWFkIHRoaW5nIGluIENQUEZMQUdTIGJlY2F1c2Ugd2l0aCBHQ0MzLAorIyBib29zdC90aHJlYWQuaHBwIHdpbGwgdHJpZ2dlciBhICNlcnJvciBpZiAtcHRocmVhZCBpc24ndCB1c2VkOgorIyAgIGJvb3N0L2NvbmZpZy9yZXF1aXJlc190aHJlYWRzLmhwcDo0Nzo1OiAjZXJyb3IgIkNvbXBpbGVyIHRocmVhZGluZyBzdXBwb3J0CisjICAgaXMgbm90IHR1cm5lZCBvbi4gUGxlYXNlIHNldCB0aGUgY29ycmVjdCBjb21tYW5kIGxpbmUgb3B0aW9ucyBmb3IKKyMgICB0aHJlYWRpbmc6IC1wdGhyZWFkIChMaW51eCksIC1wdGhyZWFkcyAoU29sYXJpcykgb3IgLW10aHJlYWRzIChNaW5ndzMyKSIKKyMKKyMgQmFzZWQgb24gQUNYX1BUSFJFQUQ6IGh0dHA6Ly9hdXRvY29uZi1hcmNoaXZlLmNyeXAudG8vYWN4X3B0aHJlYWQuaHRtbAorQUNfREVGVU4oW19CT09TVF9QVEhSRUFEX0ZMQUddLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfQ1hYXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK0FDX0xBTkdfUFVTSChbQysrXSlkbmwKK0FDX0NBQ0hFX0NIRUNLKFtmb3IgdGhlIGZsYWdzIG5lZWRlZCB0byB1c2UgcHRocmVhZHNdLCBbYm9vc3RfY3ZfcHRocmVhZF9mbGFnXSwKK1sgYm9vc3RfY3ZfcHRocmVhZF9mbGFnPQorICAjIFRoZSBvcmRlcmluZyAqaXMqIChzb21ldGltZXMpIGltcG9ydGFudC4gIFNvbWUgbm90ZXMgb24gdGhlCisgICMgaW5kaXZpZHVhbCBpdGVtcyBmb2xsb3c6CisgICMgKG5vbmUpOiBpbiBjYXNlIHRocmVhZHMgYXJlIGluIGxpYmM7IHNob3VsZCBiZSB0cmllZCBiZWZvcmUgLUt0aHJlYWQgYW5kCisgICMgICAgICAgb3RoZXIgY29tcGlsZXIgZmxhZ3MgdG8gcHJldmVudCBjb250aW51YWwgY29tcGlsZXIgd2FybmluZ3MKKyAgIyAtbHB0aHJlYWRzOiBBSVggKG11c3QgY2hlY2sgdGhpcyBiZWZvcmUgLWxwdGhyZWFkKQorICAjIC1LdGhyZWFkOiBTZXF1ZW50ICh0aHJlYWRzIGluIGxpYmMsIGJ1dCAtS3RocmVhZCBuZWVkZWQgZm9yIHB0aHJlYWQuaCkKKyAgIyAta3RocmVhZDogRnJlZUJTRCBrZXJuZWwgdGhyZWFkcyAocHJlZmVycmVkIHRvIC1wdGhyZWFkIHNpbmNlIFNNUC1hYmxlKQorICAjIC1sbHRocmVhZDogTGludXhUaHJlYWRzIHBvcnQgb24gRnJlZUJTRCAoYWxzbyBwcmVmZXJyZWQgdG8gLXB0aHJlYWQpCisgICMgLXB0aHJlYWQ6IEdOVSBMaW51eC9HQ0MgKGtlcm5lbCB0aHJlYWRzKSwgQlNEL0dDQyAodXNlcmxhbmQgdGhyZWFkcykKKyAgIyAtcHRocmVhZHM6IFNvbGFyaXMvR0NDCisgICMgLW10aHJlYWRzOiBNaW5HVzMyL0dDQywgTHlueC9HQ0MKKyAgIyAtbXQ6IFN1biBXb3Jrc2hvcCBDIChtYXkgb25seSBsaW5rIFN1bk9TIHRocmVhZHMgWy1sdGhyZWFkXSwgYnV0IGl0CisgICMgICAgICBkb2Vzbid0IGh1cnQgdG8gY2hlY2sgc2luY2UgdGhpcyBzb21ldGltZXMgZGVmaW5lcyBwdGhyZWFkcyB0b287CisgICMgICAgICBhbHNvIGRlZmluZXMgLURfUkVFTlRSQU5UKQorICAjICAgICAgLi4uIC1tdCBpcyBhbHNvIHRoZSBwdGhyZWFkcyBmbGFnIGZvciBIUC9hQ0MKKyAgIyAtbHB0aHJlYWQ6IEdOVSBMaW51eCwgZXRjLgorICAjIC0tdGhyZWFkLXNhZmU6IEtBSSBDKysKKyAgY2FzZSAkaG9zdF9vcyBpbiAjKAorICAgICpzb2xhcmlzKikKKyAgICAgICMgT24gU29sYXJpcyAoYXQgbGVhc3QsIGZvciBzb21lIHZlcnNpb25zKSwgbGliYyBjb250YWlucyBzdHViYmVkCisgICAgICAjIChub24tZnVuY3Rpb25hbCkgdmVyc2lvbnMgb2YgdGhlIHB0aHJlYWRzIHJvdXRpbmVzLCBzbyBsaW5rLWJhc2VkCisgICAgICAjIHRlc3RzIHdpbGwgZXJyb25lb3VzbHkgc3VjY2VlZC4gIChXZSBuZWVkIHRvIGxpbmsgd2l0aCAtcHRocmVhZHMvLW10LworICAgICAgIyAtbHB0aHJlYWQuKSAgKFRoZSBzdHVicyBhcmUgbWlzc2luZyBwdGhyZWFkX2NsZWFudXBfcHVzaCwgb3IgcmF0aGVyCisgICAgICAjIGEgZnVuY3Rpb24gY2FsbGVkIGJ5IHRoaXMgbWFjcm8sIHNvIHdlIGNvdWxkIGNoZWNrIGZvciB0aGF0LCBidXQKKyAgICAgICMgd2hvIGtub3dzIHdoZXRoZXIgdGhleSdsbCBzdHViIHRoYXQgdG9vIGluIGEgZnV0dXJlIGxpYmMuKSAgU28sCisgICAgICAjIHdlJ2xsIGp1c3QgbG9vayBmb3IgLXB0aHJlYWRzIGFuZCAtbHB0aHJlYWQgZmlyc3Q6CisgICAgICBib29zdF9wdGhyZWFkX2ZsYWdzPSItcHRocmVhZHMgLWxwdGhyZWFkIC1tdCAtcHRocmVhZCI7OyAjKAorICAgICopCisgICAgICBib29zdF9wdGhyZWFkX2ZsYWdzPSItbHB0aHJlYWRzIC1LdGhyZWFkIC1rdGhyZWFkIC1sbHRocmVhZCAtcHRocmVhZCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAtcHRocmVhZHMgLW10aHJlYWRzIC1scHRocmVhZCAtLXRocmVhZC1zYWZlIC1tdCI7OworICBlc2FjCisgICMgR2VuZXJhdGUgdGhlIHRlc3QgZmlsZS4KKyAgQUNfTEFOR19DT05GVEVTVChbQUNfTEFOR19QUk9HUkFNKFsjaW5jbHVkZSA8cHRocmVhZC5oPl0sCisgICAgW3B0aHJlYWRfdCB0aDsgcHRocmVhZF9qb2luKHRoLCAwKTsKKyAgICBwdGhyZWFkX2F0dHJfaW5pdCgwKTsgcHRocmVhZF9jbGVhbnVwX3B1c2goMCwgMCk7CisgICAgcHRocmVhZF9jcmVhdGUoMCwwLDAsMCk7IHB0aHJlYWRfY2xlYW51cF9wb3AoMCk7XSldKQorICBmb3IgYm9vc3RfcHRocmVhZF9mbGFnIGluICcnICRib29zdF9wdGhyZWFkX2ZsYWdzOyBkbworICAgIGJvb3N0X3B0aHJlYWRfb2s9ZmFsc2UKK2RubCBSZS11c2UgdGhlIHRlc3QgZmlsZSBhbHJlYWR5IGdlbmVyYXRlZC4KKyAgICBib29zdF9wdGhyZWFkc19fc2F2ZV9MSUJTPSRMSUJTCisgICAgTElCUz0iJExJQlMgJGJvb3N0X3B0aHJlYWRfZmxhZyIKKyAgICBBQ19MSU5LX0lGRUxTRShbXSwKKyAgICAgIFtpZiBncmVwICIuKiRib29zdF9wdGhyZWFkX2ZsYWciIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgICAgICAgZWNobyAiVGhpcyBmbGFnIHNlZW1zIHRvIGhhdmUgdHJpZ2dlcmVkIHdhcm5pbmdzIiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgICAgZWxzZQorICAgICAgICAgYm9vc3RfcHRocmVhZF9vaz06OyBib29zdF9jdl9wdGhyZWFkX2ZsYWc9JGJvb3N0X3B0aHJlYWRfZmxhZworICAgICAgIGZpXSkKKyAgICBMSUJTPSRib29zdF9wdGhyZWFkc19fc2F2ZV9MSUJTCisgICAgJGJvb3N0X3B0aHJlYWRfb2sgJiYgYnJlYWsKKyAgZG9uZQorXSkKK0FDX0xBTkdfUE9QKFtDKytdKWRubAorXSkjIF9CT09TVF9QVEhSRUFEX0ZMQUcKKworCisjIF9CT09TVF9nY2NfdGVzdChNQUpPUiwgTUlOT1IpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEludGVybmFsIGhlbHBlciBmb3IgX0JPT1NUX0ZJTkRfQ09NUElMRVJfVEFHLgorbTRfZGVmaW5lKFtfQk9PU1RfZ2NjX3Rlc3RdLAorWyJkZWZpbmVkIF9fR05VQ19fICYmIF9fR05VQ19fID09ICQxICYmIF9fR05VQ19NSU5PUl9fID09ICQyICYmICFkZWZpbmVkIF9fSUNDIEAgZ2NjJDEkMiJdKWRubAorCisjIF9CT09TVF9taW5nd190ZXN0KE1BSk9SLCBNSU5PUikKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSW50ZXJuYWwgaGVscGVyIGZvciBfQk9PU1RfRklORF9DT01QSUxFUl9UQUcuCittNF9kZWZpbmUoW19CT09TVF9taW5nd190ZXN0XSwKK1siZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA9PSAkMSAmJiBfX0dOVUNfTUlOT1JfXyA9PSAkMiAmJiAhZGVmaW5lZCBfX0lDQyAmJiBcCisgIChkZWZpbmVkIFdJTjMyIHx8IGRlZmluZWQgV0lOTlQgfHwgZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX1dJTjMyIFwKKyAgICAgICAgIHx8IGRlZmluZWQgX19XSU4zMl9fIHx8IGRlZmluZWQgX19XSU5OVCB8fCBkZWZpbmVkIF9fV0lOTlRfXykgQCBtZ3ckMSQyIl0pZG5sCisKKworIyBfQk9PU1RfRklORF9DT01QSUxFUl9UQUcoKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBJbnRlcm5hbC4gIFdoZW4gQm9vc3QgaXMgaW5zdGFsbGVkIHdpdGhvdXQgLS1sYXlvdXQ9c3lzdGVtLCBlYWNoIGxpYnJhcnkKKyMgZmlsZW5hbWUgd2lsbCBob2xkIGEgc3VmZml4IHRoYXQgZW5jb2RlcyB0aGUgY29tcGlsZXIgdXNlZCBkdXJpbmcgdGhlCisjIGJ1aWxkLiAgVGhlIEJvb3N0IGJ1aWxkIHN5c3RlbSBzZWVtcyB0byBjYWxsIHRoaXMgYSBgdGFnJy4KK0FDX0RFRlVOKFtfQk9PU1RfRklORF9DT01QSUxFUl9UQUddLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfQ1hYXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK0FDX0NBQ0hFX0NIRUNLKFtmb3IgdGhlIHRvb2xzZXQgbmFtZSB1c2VkIGJ5IEJvb3N0IGZvciAkQ1hYXSwKKyAgICAgICAgICAgICAgIFtib29zdF9jdl9saWJfdGFnXSwKK1tib29zdF9jdl9saWJfdGFnPXVua25vd24KK2lmIHRlc3QgeCRib29zdF9jdl9pbmNfcGF0aCAhPSB4bm87IHRoZW4KKyAgQUNfTEFOR19QVVNIKFtDKytdKWRubAorICAjIFRoZSBmb2xsb3dpbmcgdGVzdHMgYXJlIG1vc3RseSBpbnNwaXJlZCBieSBib29zdC9jb25maWcvYXV0b19saW5rLmhwcAorICAjIFRoZSBsaXN0IGlzIHNvcnRlZCB0byBtb3N0IHJlY2VudC9jb21tb24gdG8gb2xkZXN0IGNvbXBpbGVyIChpbiBvcmRlcgorICAjIHRvIGluY3JlYXNlIHRoZSBsaWtlbGlob29kIG9mIGZpbmRpbmcgdGhlIHJpZ2h0IGNvbXBpbGVyIHdpdGggdGhlCisgICMgbGVhc3QgbnVtYmVyIG9mIGNvbXBpbGF0aW9uIGF0dGVtcHQpLgorICAjIEJld2FyZSB0aGF0IHNvbWUgdGVzdHMgYXJlIHNlbnNpYmxlIHRvIHRoZSBvcmRlciAoZm9yIGluc3RhbmNlLCB3ZSBtdXN0CisgICMgbG9vayBmb3IgTWluR1cgYmVmb3JlIGxvb2tpbmcgZm9yIEdDQzMpLgorICAjIEkgdXNlZCBvbmUgY29tcGlsYXRpb24gdGVzdCBwZXIgY29tcGlsZXIgd2l0aCBhICNlcnJvciB0byByZWNvZ25pemUKKyAgIyBlYWNoIGNvbXBpbGVyIHNvIHRoYXQgaXQgd29ya3MgZXZlbiB3aGVuIGNyb3NzLWNvbXBpbGluZyAobGV0IG1lIGtub3cKKyAgIyBpZiB5b3Uga25vdyBhIGJldHRlciBhcHByb2FjaCkuCisgICMgS25vd24gbWlzc2luZyB0YWdzIChrbm93biBmcm9tIEJvb3N0J3MgdG9vbHMvYnVpbGQvdjIvdG9vbHMvY29tbW9uLmphbSk6CisgICMgICBjb21vLCBlZGcsIGtjYywgYmNrLCBtcCwgc3csIHRydSwgeGxjCisgICMgSSdtIG5vdCBzdXJlIGFib3V0IG15IHRlc3QgZm9yIGBpbCcgKGJlIGNhcmVmdWw6IEludGVsJ3MgSUNDIHByZS1kZWZpbmVzCisgICMgdGhlIHNhbWUgZGVmaW5lcyBhcyBHQ0MncykuCisgIGZvciBpIGluIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg1LCAzKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDUsIDMpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg1LCAyKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDUsIDIpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg1LCAxKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDUsIDEpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg1LCAwKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDUsIDApIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCAxMCkgXAorICAgIF9CT09TVF9nY2NfdGVzdCg0LCAxMCkgXAorICAgIF9CT09TVF9taW5nd190ZXN0KDQsIDkpIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoNCwgOSkgXAorICAgIF9CT09TVF9taW5nd190ZXN0KDQsIDgpIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoNCwgOCkgXAorICAgIF9CT09TVF9taW5nd190ZXN0KDQsIDcpIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoNCwgNykgXAorICAgIF9CT09TVF9taW5nd190ZXN0KDQsIDYpIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoNCwgNikgXAorICAgIF9CT09TVF9taW5nd190ZXN0KDQsIDUpIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoNCwgNSkgXAorICAgIF9CT09TVF9taW5nd190ZXN0KDQsIDQpIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoNCwgNCkgXAorICAgIF9CT09TVF9taW5nd190ZXN0KDQsIDMpIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoNCwgMykgXAorICAgIF9CT09TVF9taW5nd190ZXN0KDQsIDIpIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoNCwgMikgXAorICAgIF9CT09TVF9taW5nd190ZXN0KDQsIDEpIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoNCwgMSkgXAorICAgIF9CT09TVF9taW5nd190ZXN0KDQsIDApIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoNCwgMCkgXAorICAgICJkZWZpbmVkIF9fR05VQ19fICYmIF9fR05VQ19fID09IDMgJiYgIWRlZmluZWQgX19JQ0MgXAorICAgICAmJiAoZGVmaW5lZCBXSU4zMiB8fCBkZWZpbmVkIFdJTk5UIHx8IGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMiBcCisgICAgICAgICB8fCBkZWZpbmVkIF9fV0lOMzJfXyB8fCBkZWZpbmVkIF9fV0lOTlQgfHwgZGVmaW5lZCBfX1dJTk5UX18pIEAgbWd3IiBcCisgICAgX0JPT1NUX2djY190ZXN0KDMsIDQpIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoMywgMykgXAorICAgICJkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSID49IDE1MDAgQCB2YzkwIiBcCisgICAgImRlZmluZWQgX01TQ19WRVIgJiYgX01TQ19WRVIgPT0gMTQwMCBAIHZjODAiIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoMywgMikgXAorICAgICJkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSID09IDEzMTAgQCB2YzcxIiBcCisgICAgX0JPT1NUX2djY190ZXN0KDMsIDEpIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoMywgMCkgXAorICAgICJkZWZpbmVkIF9fQk9STEFORENfXyBAIGJjYiIgXAorICAgICJkZWZpbmVkIF9fSUNDICYmIChkZWZpbmVkIF9fdW5peCB8fCBkZWZpbmVkIF9fdW5peF9fKSBAIGlsIiBcCisgICAgImRlZmluZWQgX19JQ0wgQCBpdyIgXAorICAgICJkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSID09IDEzMDAgQCB2YzciIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoMiwgOTUpIFwKKyAgICAiZGVmaW5lZCBfX01XRVJLU19fICYmIF9fTVdFUktTX18gPD0gMHgzMkZGIEAgY3c5IiBcCisgICAgImRlZmluZWQgX01TQ19WRVIgJiYgX01TQ19WRVIgPCAxMzAwICYmICFkZWZpbmVkIFVOREVSX0NFIEAgdmM2IiBcCisgICAgImRlZmluZWQgX01TQ19WRVIgJiYgX01TQ19WRVIgPCAxMzAwICYmIGRlZmluZWQgVU5ERVJfQ0UgQCBldmM0IiBcCisgICAgImRlZmluZWQgX19NV0VSS1NfXyAmJiBfX01XRVJLU19fIDw9IDB4MzFGRiBAIGN3OCIKKyAgZG8KKyAgICBib29zdF90YWdfdGVzdD1gZXhwciAiWCRpIiA6ICdYXChbW15AXV0qXCkgQCAnYAorICAgIGJvb3N0X3RhZz1gZXhwciAiWCRpIiA6ICdYW1teQF1dKiBAIFwoLipcKSdgCisgICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWworI2lmICRib29zdF90YWdfdGVzdAorLyogT0sgKi8KKyNlbHNlCisjIGVycm9yICRib29zdF90YWdfdGVzdAorI2VuZGlmCitdXSldLCBbYm9vc3RfY3ZfbGliX3RhZz0kYm9vc3RfdGFnOyBicmVha10sIFtdKQorICBkb25lCitBQ19MQU5HX1BPUChbQysrXSlkbmwKKyAgY2FzZSAkYm9vc3RfY3ZfbGliX3RhZyBpbiAjKAorICAgICMgU29tZSBuZXdlciAoPj0gMS4zNT8pIHZlcnNpb25zIG9mIEJvb3N0IHNlZW0gdG8gb25seSB1c2UgImdjYyIgYXMgb3Bwb3NlZAorICAgICMgdG8gImdjYzQxIiBmb3IgaW5zdGFuY2UuCisgICAgKi1nY2MgfCAqJy1nY2MgJykgOjs7ICMoICBEb24ndCByZS1hZGQgLWdjYzogaXQncyBhbHJlYWR5IGluIHRoZXJlLgorICAgIGdjYyopCisgICAgICBib29zdF90YWdfeD0KKyAgICAgIGNhc2UgJGhvc3Rfb3MgaW4gIygKKyAgICAgICAgZGFyd2luKikKKyAgICAgICAgICBpZiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxMzY7IHRoZW4KKyAgICAgICAgICAgICMgVGhlIGB4JyBhZGRlZCBpbiByNDY3OTMgb2YgQm9vc3QuCisgICAgICAgICAgICBib29zdF90YWdfeD14CisgICAgICAgICAgZmk7OworICAgICAgZXNhYworICAgICAgIyBXZSBjYW4gc3BlY2lmeSBtdWx0aXBsZSB0YWdzIGluIHRoaXMgdmFyaWFibGUgYmVjYXVzZSBpdCdzIHVzZWQgYnkKKyAgICAgICMgQk9PU1RfRklORF9MSUIgdGhhdCBkb2VzIGEgYGZvciB0YWcgaW4gLSRib29zdF9jdl9saWJfdGFnJyAuLi4KKyAgICAgIGJvb3N0X2N2X2xpYl90YWc9IiRib29zdF90YWdfeCRib29zdF9jdl9saWJfdGFnIC0ke2Jvb3N0X3RhZ194fWdjYyIKKyAgICAgIDs7ICMoCisgICAgdW5rbm93bikKKyAgICAgIEFDX01TR19XQVJOKFtbY291bGQgbm90IGZpZ3VyZSBvdXQgd2hpY2ggdG9vbHNldCBuYW1lIHRvIHVzZSBmb3IgJENYWF1dKQorICAgICAgYm9vc3RfY3ZfbGliX3RhZz0KKyAgICAgIDs7CisgIGVzYWMKK2ZpXSlkbmwgZW5kIG9mIEFDX0NBQ0hFX0NIRUNLCitdKSMgX0JPT1NUX0ZJTkRfQ09NUElMRVJfVEFHCisKKworIyBfQk9PU1RfR1VFU1NfV0hFVEhFUl9UT19VU0VfTVQoKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb21waWxlIGEgc21hbGwgdGVzdCB0byB0cnkgdG8gZ3Vlc3Mgd2hldGhlciB3ZSBzaG91bGQgZmF2b3IgTVQgKE11bHRpCisjIFRocmVhZCkgZmxhdm9ycyBvZiBCb29zdC4gIFNldHMgYm9vc3RfZ3Vlc3NfdXNlX210IGFjY29yZGluZ2x5LgorQUNfREVGVU4oW19CT09TVF9HVUVTU19XSEVUSEVSX1RPX1VTRV9NVF0sCitbIyBDaGVjayB3aGV0aGVyIHdlIGRvIGJldHRlciB1c2UgYG10JyBldmVuIHRob3VnaCB3ZSB3ZXJlbid0IGFzayB0by4KK0FDX0xBTkdfUFVTSChbQysrXSlkbmwKK0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKKyNpZiBkZWZpbmVkIF9SRUVOVFJBTlQgfHwgZGVmaW5lZCBfTVQgfHwgZGVmaW5lZCBfX01UX18KKy8qIHVzZSAtbXQgKi8KKyNlbHNlCisjIGVycm9yIE1UIG5vdCBuZWVkZWQKKyNlbmRpZgorXV0pXSwgW2Jvb3N0X2d1ZXNzX3VzZV9tdD06XSwgW2Jvb3N0X2d1ZXNzX3VzZV9tdD1mYWxzZV0pCitBQ19MQU5HX1BPUChbQysrXSlkbmwKK10pCisKKyMgX0JPT1NUX0FDX0xJTktfSUZFTFNFKFBST0dSQU0sIFtBQ1RJT04tSUYtVFJVRV0sIFtBQ1RJT04tSUYtRkFMU0VdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZvcmsgb2YgX0FDX0xJTktfSUZFTFNFIHRoYXQgcHJlc2VydmVzIGNvbmZ0ZXN0Lm8gYWNyb3NzIGNhbGxzLiAgRnJhZ2lsZSwKKyMgd2lsbCBicmVhayB3aGVuIEF1dG9jb25mIGNoYW5nZXMgaXRzIGludGVybmFscy4gIFJlcXVpcmVzIHRoYXQgeW91IG1hbnVhbGx5CisjIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgaW4gYmV0d2VlbiB0byByZWFsbHkgZGlmZmVyZW50IHRlc3RzLCBvdGhlcndpc2UKKyMgeW91IHdpbGwgdHJ5IHRvIGxpbmsgYSBjb25mdGVzdC5vIGxlZnQgYmVoaW5kIGJ5IGEgcHJldmlvdXMgdGVzdC4KKyMgVXNlZCB0byBhZ2dyZXNzaXZlbHkgb3B0aW1pemUgQk9PU1RfRklORF9MSUIgKHNlZSB0aGUgYmlnIGNvbW1lbnQgaW4gdGhpcworIyBtYWNybykuCisjCisjIERvbid0IHVzZSAiYnJlYWsiIGluIHRoZSBhY3Rpb25zLCBhcyBpdCB3b3VsZCBzaG9ydC1jaXJjdWl0IHNvbWUgY29kZQorIyB0aGlzIG1hY3JvIHJ1bnMgYWZ0ZXIgdGhlIGFjdGlvbnMuCittNF9kZWZpbmUoW19CT09TVF9BQ19MSU5LX0lGRUxTRV0sCitbbTRfaWZ2YWxuKFskMV0sIFtBQ19MQU5HX0NPTkZURVNUKFskMV0pXSlkbmwKK3JtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAorYm9vc3Rfc2F2ZV9hY19leHQ9JGFjX2V4dAorYm9vc3RfdXNlX3NvdXJjZT06CisjIElmIHdlIGFscmVhZHkgaGF2ZSBhIC5vLCByZS11c2UgaXQuICBXZSBjaGFuZ2UgJGFjX2V4dCBzbyB0aGF0ICRhY19saW5rCisjIHRyaWVzIHRvIGxpbmsgdGhlIGV4aXN0aW5nIG9iamVjdCBmaWxlIGluc3RlYWQgb2YgY29tcGlsaW5nIGZyb20gc291cmNlLgordGVzdCAtZiBjb25mdGVzdC4kYWNfb2JqZXh0ICYmIGFjX2V4dD0kYWNfb2JqZXh0ICYmIGJvb3N0X3VzZV9zb3VyY2U9ZmFsc2UgJiYKKyAgX0FTX0VDSE9fTE9HKFtyZS11c2luZyB0aGUgZXhpc3RpbmcgY29uZnRlc3QuJGFjX29iamV4dF0pCitBU19JRihbX0FDX0RPX1NUREVSUigkYWNfbGluaykgJiYgeworICAgICAgICAgdGVzdCAteiAiJGFjX1tdX0FDX0xBTkdfQUJCUkVWW11fd2Vycm9yX2ZsYWciIHx8CisgICAgICAgICB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7CisgICAgICAgICB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAorICAgICAgICAgJGFzX2V4ZWN1dGFibGVfcCBjb25mdGVzdCRhY19leGVleHQKK2RubCBGSVhNRTogdXNlIEFTX1RFU1RfWCBpbnN0ZWFkIHdoZW4gMi42MSBpcyB3aWRlc3ByZWFkIGVub3VnaC4KKyAgICAgICB9XSwKKyAgICAgIFskMl0sCisgICAgICBbaWYgJGJvb3N0X3VzZV9zb3VyY2U7IHRoZW4KKyAgICAgICAgIF9BQ19NU0dfTE9HX0NPTkZURVNUCisgICAgICAgZmkKKyAgICAgICAkM10pCithY19vYmpleHQ9JGJvb3N0X3NhdmVfYWNfb2JqZXh0CithY19leHQ9JGJvb3N0X3NhdmVfYWNfZXh0CitkbmwgRGVsZXRlIGFsc28gdGhlIElQQS9JUE8gKEludGVyIFByb2NlZHVyYWwgQW5hbHlzaXMvT3B0aW1pemF0aW9uKQorZG5sIGluZm9ybWF0aW9uIGNyZWF0ZWQgYnkgdGhlIFBHSSBjb21waWxlciAoY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyksCitkbmwgYXMgaXQgd291bGQgaW50ZXJmZXJlIHdpdGggdGhlIG5leHQgbGluayBjb21tYW5kLgorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgbTRfaWZ2YWwoWyQxXSwgW2NvbmZ0ZXN0LiRhY19leHRdKVtdZG5sCitdKSMgX0JPT1NUX0FDX0xJTktfSUZFTFNFCisKKyMgTG9jYWwgVmFyaWFibGVzOgorIyBtb2RlOiBhdXRvY29uZgorIyBFbmQ6CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL2N2YzQtMS40LXBhdGNoL2NvbmZpZy9ib29zdC5tNC50eHQgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL2N2YzQtMS40LXBhdGNoL2NvbmZpZy9ib29zdC5tNC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdkMDYzZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvY3ZjNC0xLjQtcGF0Y2gvY29uZmlnL2Jvb3N0Lm00LnR4dApAQCAtMCwwICsxLDE1NjAgQEAKKyMgYm9vc3QubTQ6IExvY2F0ZSBCb29zdCBoZWFkZXJzIGFuZCBsaWJyYXJpZXMgZm9yIGF1dG9jb25mLWJhc2VkIHByb2plY3RzLgorIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMSwgMjAxNCAgQmVub2l0IFNpZ291cmUgPHRzdW5hQGxyZGUuZXBpdGEuZnI+CisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIEFkZGl0aW9uYWwgcGVybWlzc2lvbiB1bmRlciBzZWN0aW9uIDcgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworIyBMaWNlbnNlLCB2ZXJzaW9uIDMgKCJHUEx2MyIpOgorIworIyBJZiB5b3UgY29udmV5IHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgd29yayB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGRvIHNvIHVuZGVyCisjIHRlcm1zIG9mIHlvdXIgY2hvaWNlLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworbTRfZGVmaW5lKFtfQk9PU1RfU0VSSUFMXSwgW200X3RyYW5zbGl0KFsKKyMgc2VyaWFsIDI1CitdLCBbIworXSwgW10pXSkKKworIyBPcmlnaW5hbCBzb3VyY2VzIGNhbiBiZSBmb3VuZCBhdCBodHRwOi8vZ2l0aHViLmNvbS90c3VuYS9ib29zdC5tNAorIyBZb3UgY2FuIGZldGNoIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgc2NyaXB0IGJ5IGRvaW5nOgorIyAgIHdnZXQgaHR0cDovL2dpdGh1Yi5jb20vdHN1bmEvYm9vc3QubTQvcmF3L21hc3Rlci9idWlsZC1hdXgvYm9vc3QubTQKKworIyAtLS0tLS0gIworIyBSRUFETUUgIworIyAtLS0tLS0gIworCisjIFRoaXMgZmlsZSBwcm92aWRlcyBzZXZlcmFsIG1hY3JvcyB0byB1c2UgdGhlIHZhcmlvdXMgQm9vc3QgbGlicmFyaWVzLgorIyBUaGUgZmlyc3QgbWFjcm8gaXMgQk9PU1RfUkVRVUlSRS4gIEl0IHdpbGwgc2ltcGx5IGNoZWNrIGlmIGl0J3MgcG9zc2libGUgdG8KKyMgZmluZCB0aGUgQm9vc3QgaGVhZGVycyBvZiBhIGdpdmVuIChvcHRpb25hbCkgbWluaW11bSB2ZXJzaW9uIGFuZCBpdCB3aWxsCisjIGRlZmluZSBCT09TVF9DUFBGTEFHUyBhY2NvcmRpbmdseS4gIEl0IHdpbGwgYWRkIGFuIG9wdGlvbiAtLXdpdGgtYm9vc3QgdG8KKyMgeW91ciBjb25maWd1cmUgc28gdGhhdCB1c2VycyBjYW4gc3BlY2lmeSBub24gc3RhbmRhcmQgbG9jYXRpb25zLgorIyBJZiB0aGUgdXNlcidzIGVudmlyb25tZW50IGNvbnRhaW5zIEJPT1NUX1JPT1QgYW5kIC0td2l0aC1ib29zdCB3YXMgbm90CisjIHNwZWNpZmllZCwgLS13aXRoLWJvb3N0PSRCT09TVF9ST09UIGlzIGltcGxpY2l0bHkgdXNlZC4KKyMgRm9yIG1vcmUgUkVBRE1FIGFuZCBkb2N1bWVudGF0aW9uLCBnbyB0byBodHRwOi8vZ2l0aHViLmNvbS90c3VuYS9ib29zdC5tNAorIyBOb3RlOiBUSEVTRSBNQUNST1MgQVNTVU1FIFRIQVQgWU9VIFVTRSBMSUJUT09MLiAgSWYgeW91IGRvbid0LCBkb24ndCB3b3JyeSwKKyMgc2ltcGx5IHJlYWQgdGhlIFJFQURNRSwgaXQgd2lsbCBzaG93IHlvdSB3aGF0IHRvIGRvIHN0ZXAgYnkgc3RlcC4KKworbTRfcGF0dGVybl9mb3JiaWQoW15fPyhCT09TVHxCb29zdClfXSkKKworCisjIF9CT09TVF9TRURfQ1BQKFNFRC1QUk9HUkFNLCBQUk9HUkFNLAorIyAgICAgICAgICAgICAgICBbQUNUSU9OLUlGLUZPVU5EXSwgW0FDVElPTi1JRi1OT1QtRk9VTkRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTYW1lIGFzIEFDX0VHUkVQX0NQUCwgYnV0IGxlYXZlIHRoZSByZXN1bHQgaW4gY29uZnRlc3QuaS4KKyMKKyMgU0VELVBST0dSQU0gaXMgKm5vdCogb3ZlcnF1b3RlZCwgYXMgaW4gQUNfRUdSRVBfQ1BQLiAgSXQgaXMgZXhwYW5kZWQKKyMgaW4gZG91YmxlLXF1b3Rlcywgc28gZXNjYXBlIHlvdXIgZG91YmxlIHF1b3Rlcy4KKyMKKyMgSXQgY291bGQgYmUgdXNlZnVsIHRvIHR1cm4gdGhpcyBpbnRvIGEgbWFjcm8gd2hpY2ggZXh0cmFjdHMgdGhlCisjIHZhbHVlIG9mIGFueSBtYWNyby4KK200X2RlZmluZShbX0JPT1NUX1NFRF9DUFBdLAorW0FDX0xBTkdfUFVTSChbQysrXSlkbmwKK0FDX0xBTkdfUFJFUFJPQ19SRVFVSVJFKClkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfU0VEXSlkbmwKK0FDX0xBTkdfQ09ORlRFU1QoW0FDX0xBTkdfU09VUkNFKFtbJDJdXSldKQorQVNfSUYoW2RubCBldmFsIGlzIG5lY2Vzc2FyeSB0byBleHBhbmQgYWNfY3BwLgorZG5sIFVsdHJpeCBhbmQgUHlyYW1pZCBzaCByZWZ1c2UgdG8gcmVkaXJlY3Qgb3V0cHV0IG9mIGV2YWwsIHNvIHVzZSBzdWJzaGVsbC4KK2RubCBCZXdhcmUgb2YgV2luZG93cyBlbmQtb2YtbGluZXMsIGZvciBpbnN0YW5jZSBpZiB3ZSBhcmUgcnVubmluZworZG5sIHNvbWUgV2luZG93cyBwcm9ncmFtcyB1bmRlciBXaW5lLiAgSW4gdGhhdCBjYXNlLCBib29zdC92ZXJzaW9uLmhwcAorZG5sIGlzIGNlcnRhaW5seSB1c2luZyAiXHJcbiIsIGJ1dCB0aGUgcmVndWxhciBVbml4IHNoZWxsIHdpbGwgb25seQorZG5sIHN0cmlwIGBcbicgd2l0aCBiYWNrcXVvdGVzLCBub3QgdGhlIGBccicuICBUaGlzIHJlc3VsdHMgaW4KK2RubCBib29zdF9jdl9saWJfdmVyc2lvbj0nMV8zN1xyJyBmb3IgaW5zdGFuY2UsIHdoaWNoIGJyZWFrcworZG5sIGV2ZXJ5dGhpbmcgZWxzZS4KK2RubCBDYW5ub3QgdXNlICdkbmwnIGFmdGVyIFskNF0gYmVjYXVzZSBhIHRyYWlsaW5nIGRubCBtYXkgYnJlYWsgQUNfQ0FDSEVfQ0hFQ0sKK2RubAorZG5sIEJld2FyZSB0aGF0IEdDQyA1LCB3aGVuIGV4cGFuZGluZyBtYWNyb3MsIG1heSBlbWJlZCAjIGxpbmUgZGlyZWN0aXZlcworZG5sIGEgd2l0aGluIHNpbmdsZSBsaW5lOgorZG5sCitkbmwgIyAxICJjb25mdGVzdC5jYyIKK2RubCAjIDEgIjxidWlsdC1pbj4iCitkbmwgIyAxICI8Y29tbWFuZC1saW5lPiIKK2RubCAjIDEgImNvbmZ0ZXN0LmNjIgorZG5sICMgMSAiL29wdC9sb2NhbC9pbmNsdWRlL2Jvb3N0L3ZlcnNpb24uaHBwIiAxIDMKK2RubCAjIDIgImNvbmZ0ZXN0LmNjIiAyCitkbmwgYm9vc3QtbGliLXZlcnNpb24gPQorZG5sICMgMiAiY29uZnRlc3QuY2MiIDMKK2RubCAgICAgICAgICAgICAgICAgICAgIjFfNTYiCitkbmwKK2RubCBTbyBnZXQgcmlkIG9mIHRoZSAjIGxpbmVzLCBhbmQgZ2x1ZSB0aGUgcmVtYWluaW5nIG9uZXMgdG9nZXRoZXIuCisoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mQVNfTUVTU0FHRV9MT0dfRkQgfAorICBncmVwIC12ICcjJyB8CisgIHRyIC1kICdccicgfAorICB0ciAtcyAnXG4nICcgJyB8CisgICRTRUQgLW4gLWUgIiQxIiA+Y29uZnRlc3QuaSAyPiYxXSwKKyAgWyQzXSwKKyAgWyQ0XSkKK3JtIC1yZiBjb25mdGVzdCoKK0FDX0xBTkdfUE9QKFtDKytdKWRubAorXSkjIF9CT09TVF9TRURfQ1BQCisKKworCisjIEJPT1NUX1JFUVVJUkUoW1ZFUlNJT05dLCBbQUNUSU9OLUlGLU5PVC1GT1VORF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LiAgSWYgdmVyc2lvbiBpcyBnaXZlbiwgaXQgbXVzdCBlaXRoZXIgYmUgYSBsaXRlcmFsIG9mIHRoZSBmb3JtCisjICJYLlkuWiIgd2hlcmUgWCwgWSBhbmQgWiBhcmUgaW50ZWdlcnMgKHRoZSAiLloiIHBhcnQgYmVpbmcgb3B0aW9uYWwpIG9yIGEKKyMgdmFyaWFibGUgIiR2YXIiLgorIyBEZWZpbmVzIHRoZSB2YWx1ZSBCT09TVF9DUFBGTEFHUy4gIFRoaXMgbWFjcm8gb25seSBjaGVja3MgZm9yIGhlYWRlcnMgd2l0aAorIyB0aGUgcmVxdWlyZWQgdmVyc2lvbiwgaXQgZG9lcyBub3QgY2hlY2sgZm9yIGFueSBvZiB0aGUgQm9vc3QgbGlicmFyaWVzLgorIyBPbiAjIHN1Y2Nlc3MsIGRlZmluZXMgSEFWRV9CT09TVC4gIE9uIGZhaWx1cmUsIGNhbGxzIHRoZSBvcHRpb25hbAorIyBBQ1RJT04tSUYtTk9ULUZPVU5EIGFjdGlvbiBpZiBvbmUgd2FzIHN1cHBsaWVkLgorIyBPdGhlcndpc2UgYWJvcnRzIHdpdGggYW4gZXJyb3IgbWVzc2FnZS4KK0FDX0RFRlVOX09OQ0UoW0JPT1NUX1JFUVVJUkVdLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfQ1hYXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfR1JFUF0pZG5sCitlY2hvICIkYXNfbWU6IHRoaXMgaXMgYm9vc3QubTRbXV9CT09TVF9TRVJJQUwiID4mQVNfTUVTU0FHRV9MT0dfRkQKK2Jvb3N0X3NhdmVfSUZTPSRJRlMKK2Jvb3N0X3ZlcnNpb25fcmVxPSQxCitJRlM9Lgorc2V0IHggJGJvb3N0X3ZlcnNpb25fcmVxIDAgMCAwCitJRlM9JGJvb3N0X3NhdmVfSUZTCitzaGlmdAorYm9vc3RfdmVyc2lvbl9yZXE9YGV4cHIgIiRbMV0iICcqJyAxMDAwMDAgKyAiJFsyXSIgJyonIDEwMCArICIkWzNdImAKK2Jvb3N0X3ZlcnNpb25fcmVxX3N0cmluZz0kWzFdLiRbMl0uJFszXQorQUNfQVJHX1dJVEgoW2Jvb3N0XSwKKyAgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLWJvb3N0PURJUl0sCisgICAgICAgICAgICAgICAgICAgW3ByZWZpeCBvZiBCb29zdCAkMSBAPDpAZ3Vlc3NAOj5AXSldKWRubAorQUNfQVJHX1ZBUihbQk9PU1RfUk9PVF0sW0xvY2F0aW9uIG9mIEJvb3N0IGluc3RhbGxhdGlvbl0pZG5sCisjIElmIEJPT1NUX1JPT1QgaXMgc2V0IGFuZCB0aGUgdXNlciBoYXMgbm90IHByb3ZpZGVkIGEgdmFsdWUgdG8KKyMgLS13aXRoLWJvb3N0LCB0aGVuIHRyZWF0IEJPT1NUX1JPT1QgYXMgaWYgaXQgdGhlIHVzZXIgc3VwcGxpZWQgaXQuCitpZiB0ZXN0IHgiJEJPT1NUX1JPT1QiICE9IHg7IHRoZW4KKyAgaWYgdGVzdCB4IiR3aXRoX2Jvb3N0IiA9IHg7IHRoZW4KKyAgICBBQ19NU0dfTk9USUNFKFtEZXRlY3RlZCBCT09TVF9ST09UOyBjb250aW51aW5nIHdpdGggLS13aXRoLWJvb3N0PSRCT09TVF9ST09UXSkKKyAgICB3aXRoX2Jvb3N0PSRCT09TVF9ST09UCisgIGVsc2UKKyAgICBBQ19NU0dfTk9USUNFKFtEZXRlY3RlZCBCT09TVF9ST09UPSRCT09TVF9ST09ULCBidXQgb3ZlcnJpZGRlbiBieSAtLXdpdGgtYm9vc3Q9JHdpdGhfYm9vc3RdKQorICBmaQorZmkKK0FDX1NVQlNUKFtESVNUQ0hFQ0tfQ09ORklHVVJFX0ZMQUdTXSwKKyAgICAgICAgIFsiJERJU1RDSEVDS19DT05GSUdVUkVfRkxBR1MgJy0td2l0aC1ib29zdD0kd2l0aF9ib29zdCciXSlkbmwKK2Jvb3N0X3NhdmVfQ1BQRkxBR1M9JENQUEZMQUdTCisgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgQm9vc3QgaGVhZGVycyB2ZXJzaW9uID49ICRib29zdF92ZXJzaW9uX3JlcV9zdHJpbmddLAorICAgIFtib29zdF9jdl9pbmNfcGF0aF0sCisgICAgW2Jvb3N0X2N2X2luY19wYXRoPW5vCitBQ19MQU5HX1BVU0goW0MrK10pZG5sCittNF9wYXR0ZXJuX2FsbG93KFteQk9PU1RfVkVSU0lPTiRdKWRubAorICAgIEFDX0xBTkdfQ09ORlRFU1QoW0FDX0xBTkdfUFJPR1JBTShbWyNpbmNsdWRlIDxib29zdC92ZXJzaW9uLmhwcD4KKyNpZiAhZGVmaW5lZCBCT09TVF9WRVJTSU9OCisjIGVycm9yIEJPT1NUX1ZFUlNJT04gaXMgbm90IGRlZmluZWQKKyNlbGlmIEJPT1NUX1ZFUlNJT04gPCAkYm9vc3RfdmVyc2lvbl9yZXEKKyMgZXJyb3IgQm9vc3QgaGVhZGVycyB2ZXJzaW9uIDwgJGJvb3N0X3ZlcnNpb25fcmVxCisjZW5kaWYKK11dKV0pCisgICAgIyBJZiB0aGUgdXNlciBwcm92aWRlZCBhIHZhbHVlIHRvIC0td2l0aC1ib29zdCwgdXNlIGl0IGFuZCBvbmx5IGl0LgorICAgIGNhc2UgJHdpdGhfYm9vc3QgaW4gIygKKyAgICAgICcnfHllcykgc2V0IHggJycgL29wdC9sb2NhbC9pbmNsdWRlIC91c3IvbG9jYWwvaW5jbHVkZSAvb3B0L2luY2x1ZGUgXAorICAgICAgICAgICAgICAgICAvdXNyL2luY2x1ZGUgQzovQm9vc3QvaW5jbHVkZTs7ICMoCisgICAgICAqKSAgICAgIHNldCB4ICIkd2l0aF9ib29zdC9pbmNsdWRlIiAiJHdpdGhfYm9vc3QiOzsKKyAgICBlc2FjCisgICAgc2hpZnQKKyAgICBmb3IgYm9vc3RfZGlyCisgICAgZG8KKyAgICAjIFdpdGhvdXQgLS1sYXlvdXQ9c3lzdGVtLCBCb29zdCAob3IgYXQgbGVhc3Qgc29tZSB2ZXJzaW9ucykgaW5zdGFsbHMKKyAgICAjIGl0c2VsZiBpbiA8cHJlZml4Pi9pbmNsdWRlL2Jvb3N0LTx2ZXJzaW9uPi4gIFRoaXMgaW5uZXIgbG9vcCBoZWxwcyB0bworICAgICMgZmluZCBoZWFkZXJzIGluIHN1Y2ggZGlyZWN0b3JpZXMuCisgICAgIworICAgICMgQW55ICR7Ym9vc3RfZGlyfS9ib29zdC14X3h4IGRpcmVjdG9yaWVzIGFyZSBzZWFyY2hlZCBpbiByZXZlcnNlIHZlcnNpb24KKyAgICAjIG9yZGVyIGZvbGxvd2VkIGJ5ICR7Ym9vc3RfZGlyfS4gIFRoZSBmaW5hbCAnLicgaXMgYSBzZW50aW5lbCBmb3IKKyAgICAjIHNlYXJjaGluZyAkYm9vc3RfZGlyIiBpdHNlbGYuICBFbnRyaWVzIGFyZSB3aGl0ZXNwYWNlIHNlcGFyYXRlZC4KKyAgICAjCisgICAgIyBJIGRpZG4ndCBpbmRlbnQgdGhpcyBsb29wIG9uIHB1cnBvc2UgKHRvIGF2b2lkIG92ZXItaW5kZW50ZWQgY29kZSkKKyAgICBib29zdF9sYXlvdXRfc3lzdGVtX3NlYXJjaF9saXN0PWBjZCAiJGJvb3N0X2RpciIgMj4vZGV2L251bGwgXAorICAgICAgICAmJiBscyAtMSB8ICIke0dSRVB9IiAnXmJvb3N0LScgfCBzb3J0IC1ybiAtdC0gLWsyIFwKKyAgICAgICAgJiYgZWNobyAuYAorICAgIGZvciBib29zdF9pbmMgaW4gJGJvb3N0X2xheW91dF9zeXN0ZW1fc2VhcmNoX2xpc3QKKyAgICBkbworICAgICAgaWYgdGVzdCB4IiRib29zdF9pbmMiICE9IHguOyB0aGVuCisgICAgICAgIGJvb3N0X2luYz0iJGJvb3N0X2Rpci8kYm9vc3RfaW5jIgorICAgICAgZWxzZQorICAgICAgICBib29zdF9pbmM9IiRib29zdF9kaXIiICMgVXNlcyBzZW50aW5lbCBpbiBib29zdF9sYXlvdXRfc3lzdGVtX3NlYXJjaF9saXN0CisgICAgICBmaQorICAgICAgaWYgdGVzdCB4IiRib29zdF9pbmMiICE9IHg7IHRoZW4KKyAgICAgICAgIyBXZSBhcmUgZ29pbmcgdG8gY2hlY2sgd2hldGhlciB0aGUgdmVyc2lvbiBvZiBCb29zdCBpbnN0YWxsZWQKKyAgICAgICAgIyBpbiAkYm9vc3RfaW5jIGlzIHVzYWJsZSBieSBydW5uaW5nIGEgY29tcGlsYXRpb24gdGhhdAorICAgICAgICAjICNpbmNsdWRlcyBpdC4gIEJ1dCBpZiB3ZSBwYXNzIGEgLUkvc29tZS9wYXRoIGluIHdoaWNoIEJvb3N0CisgICAgICAgICMgaXMgbm90IGluc3RhbGxlZCwgdGhlIGNvbXBpbGVyIHdpbGwganVzdCBza2lwIHRoaXMgLUkgYW5kCisgICAgICAgICMgdXNlIG90aGVyIGxvY2F0aW9ucyAoZWl0aGVyIGZyb20gQ1BQRkxBR1MsIG9yIGZyb20gaXRzIGxpc3QKKyAgICAgICAgIyBvZiBzeXN0ZW0gaW5jbHVkZSBkaXJlY3RvcmllcykuICBBcyBhIHJlc3VsdCB3ZSB3b3VsZCB1c2UKKyAgICAgICAgIyBoZWFkZXIgaW5zdGFsbGVkIG9uIHRoZSBtYWNoaW5lIGluc3RlYWQgb2YgdGhlIC9zb21lL3BhdGgKKyAgICAgICAgIyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuICBTbyBpbiB0aGF0IHByZWNpc2UgY2FzZSAodHJ5aW5nCisgICAgICAgICMgJGJvb3N0X2luYyksIG1ha2Ugc3VyZSB0aGUgdmVyc2lvbi5ocHAgZXhpc3RzLgorICAgICAgICAjCisgICAgICAgICMgVXNlIHRlc3QgLWUgYXMgdGhlcmUgY2FuIGJlIHN5bWxpbmtzLgorICAgICAgICB0ZXN0IC1lICIkYm9vc3RfaW5jL2Jvb3N0L3ZlcnNpb24uaHBwIiB8fCBjb250aW51ZQorICAgICAgICBDUFBGTEFHUz0iJENQUEZMQUdTIC1JJGJvb3N0X2luYyIKKyAgICAgIGZpCisgICAgICBBQ19DT01QSUxFX0lGRUxTRShbXSwgW2Jvb3N0X2N2X2luY19wYXRoPXllc10sIFtib29zdF9jdl92ZXJzaW9uPW5vXSkKKyAgICAgIGlmIHRlc3QgeCIkYm9vc3RfY3ZfaW5jX3BhdGgiID0geHllczsgdGhlbgorICAgICAgICBpZiB0ZXN0IHgiJGJvb3N0X2luYyIgIT0geDsgdGhlbgorICAgICAgICAgIGJvb3N0X2N2X2luY19wYXRoPSRib29zdF9pbmMKKyAgICAgICAgZmkKKyAgICAgICAgYnJlYWsgMgorICAgICAgZmkKKyAgICBkb25lCisgICAgZG9uZQorQUNfTEFOR19QT1AoW0MrK10pZG5sCisgICAgXSkKKyAgICBjYXNlICRib29zdF9jdl9pbmNfcGF0aCBpbiAjKAorICAgICAgbm8pCisgICAgICAgIGJvb3N0X2Vycm1zZz0iY2Fubm90IGZpbmQgQm9vc3QgaGVhZGVycyB2ZXJzaW9uID49ICRib29zdF92ZXJzaW9uX3JlcV9zdHJpbmciCisgICAgICAgIG00X2lmKFskMl0sIFtdLCAgW0FDX01TR19FUlJPUihbJGJvb3N0X2Vycm1zZ10pXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtBQ19NU0dfTk9USUNFKFskYm9vc3RfZXJybXNnXSldKQorICAgICAgICAkMgorICAgICAgICA7OyMoCisgICAgICB5ZXMpCisgICAgICAgIEJPT1NUX0NQUEZMQUdTPQorICAgICAgICA7OyMoCisgICAgICAqKQorICAgICAgICBBQ19TVUJTVChbQk9PU1RfQ1BQRkxBR1NdLCBbIi1JJGJvb3N0X2N2X2luY19wYXRoIl0pZG5sCisgICAgICAgIDs7CisgICAgZXNhYworICBpZiB0ZXN0IHgiJGJvb3N0X2N2X2luY19wYXRoIiAhPSB4bm87IHRoZW4KKyAgQUNfREVGSU5FKFtIQVZFX0JPT1NUXSwgWzFdLAorICAgICAgICAgICAgW0RlZmluZWQgaWYgdGhlIHJlcXVlc3RlZCBtaW5pbXVtIEJPT1NUIHZlcnNpb24gaXMgc2F0aXNmaWVkXSkKKyAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBCb29zdCdzIGhlYWRlciB2ZXJzaW9uXSwKKyAgICBbYm9vc3RfY3ZfbGliX3ZlcnNpb25dLAorICAgIFttNF9wYXR0ZXJuX2FsbG93KFteQk9PU1RfTElCX1ZFUlNJT04kXSlkbmwKKyAgICAgX0JPT1NUX1NFRF9DUFAoW1svXmJvb3N0LWxpYi12ZXJzaW9uID0gL3tzLy8vO3MvW1wiIF0vL2c7cDtxO31dXSwKKyAgICAgICAgICAgICAgICAgICAgWyNpbmNsdWRlIDxib29zdC92ZXJzaW9uLmhwcD4KK2Jvb3N0LWxpYi12ZXJzaW9uID0gQk9PU1RfTElCX1ZFUlNJT05dLAorICAgIFtib29zdF9jdl9saWJfdmVyc2lvbj1gY2F0IGNvbmZ0ZXN0LmlgXSldKQorICAgICMgZS5nLiAiMTM0IiBmb3IgMV8zNF8xIG9yICIxMzUiIGZvciAxXzM1CisgICAgYm9vc3RfbWFqb3JfdmVyc2lvbj1gZWNobyAiJGJvb3N0X2N2X2xpYl92ZXJzaW9uIiB8IHNlZCAncy9fLy87cy9fLiovLydgCisgICAgY2FzZSAkYm9vc3RfbWFqb3JfdmVyc2lvbiBpbiAjKAorICAgICAgJycgfCAqW1shMC05XV0qKQorICAgICAgICBBQ19NU0dfRVJST1IoW2ludmFsaWQgdmFsdWU6IGJvb3N0X21ham9yX3ZlcnNpb249JyRib29zdF9tYWpvcl92ZXJzaW9uJ10pCisgICAgICAgIDs7CisgICAgZXNhYworZmkKK0NQUEZMQUdTPSRib29zdF9zYXZlX0NQUEZMQUdTCitdKSMgQk9PU1RfUkVRVUlSRQorCisKKyMgQk9PU1RfU1RBVElDKCkKKyMgLS0tLS0tLS0tLS0tLS0KKyMgQWRkIHRoZSAiLS1lbmFibGUtc3RhdGljLWJvb3N0IiBjb25maWd1cmUgYXJndW1lbnQuIElmIHRoaXMgYXJndW1lbnQgaXMgZ2l2ZW4KKyMgb24gdGhlIGNvbW1hbmQgbGluZSwgc3RhdGljIHZlcnNpb25zIG9mIHRoZSBsaWJyYXJpZXMgd2lsbCBiZSBsb29rZWQgdXAuCitBQ19ERUZVTihbQk9PU1RfU1RBVElDXSwKKyAgW0FDX0FSR19FTkFCTEUoW3N0YXRpYy1ib29zdF0sCisgICAgIFtBU19IRUxQX1NUUklORyhbLS1lbmFibGUtc3RhdGljLWJvb3N0XSwKKyAgICAgICAgICAgICAgIFtQcmVmZXIgdGhlIHN0YXRpYyBib29zdCBsaWJyYXJpZXMgb3ZlciB0aGUgc2hhcmVkIG9uZXMgW25vXV0pXSwKKyAgICAgW2VuYWJsZV9zdGF0aWNfYm9vc3Q9eWVzXSwKKyAgICAgW2VuYWJsZV9zdGF0aWNfYm9vc3Q9bm9dKV0pIyBCT09TVF9TVEFUSUMKKworCisjIEJPT1NUX0ZJTkRfSEVBREVSKFtIRUFERVItTkFNRV0sIFtBQ1RJT04tSUYtTk9ULUZPVU5EXSwgW0FDVElPTi1JRi1GT1VORF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFdyYXBwZXIgYXJvdW5kIEFDX0NIRUNLX0hFQURFUiBmb3IgQm9vc3QgaGVhZGVycy4gIFVzZWZ1bCB0byBjaGVjayBmb3IKKyMgc29tZSBwYXJ0cyBvZiB0aGUgQm9vc3QgbGlicmFyeSB3aGljaCBhcmUgb25seSBtYWRlIG9mIGhlYWRlcnMgYW5kIGRvbid0CisjIHJlcXVpcmUgbGlua2luZyAoc3VjaCBhcyBCb29zdC5Gb3JlYWNoKS4KKyMKKyMgRGVmYXVsdCBBQ1RJT04tSUYtTk9ULUZPVU5EOiBGYWlsIHdpdGggYSBmYXRhbCBlcnJvciB1bmxlc3MgQm9vc3QgY291bGRuJ3QgYmUKKyMgZm91bmQgaW4gdGhlIGZpcnN0IHBsYWNlLCBpbiB3aGljaCBjYXNlIGJ5IGRlZmF1bHQgYSBub3RpY2UgaXMgaXNzdWVkIHRvIHRoZQorIyB1c2VyLiAgUHJlc3VtYWJseSBpZiB3ZSBoYXZlbid0IGRpZWQgYWxyZWFkeSBpdCdzIGJlY2F1c2UgaXQncyBPSyB0byBub3QgaGF2ZQorIyBCb29zdCwgd2hpY2ggaXMgd2h5IG9ubHkgYSBub3RpY2UgaXMgaXNzdWVkIGluc3RlYWQgb2YgYSBoYXJkIGVycm9yLgorIworIyBEZWZhdWx0IEFDVElPTi1JRi1GT1VORDogZGVmaW5lIHRoZSBwcmVwcm9jZXNzb3Igc3ltYm9sIEhBVkVfPEhFQURFUi1OQU1FPiBpbgorIyBjYXNlIG9mIHN1Y2Nlc3MgIyAod2hlcmUgSEVBREVSLU5BTUUgaXMgd3JpdHRlbiBMSUtFX1RISVMsIGUuZy4sCisjIEhBVkVfQk9PU1RfRk9SRUFDSF9IUFApLgorQUNfREVGVU4oW0JPT1NUX0ZJTkRfSEVBREVSXSwKK1tBQ19SRVFVSVJFKFtCT09TVF9SRVFVSVJFXSlkbmwKK2lmIHRlc3QgeCIkYm9vc3RfY3ZfaW5jX3BhdGgiID0geG5vOyB0aGVuCisgIG00X2RlZmF1bHQoWyQyXSwgW0FDX01TR19OT1RJQ0UoW0Jvb3N0IG5vdCBhdmFpbGFibGUsIG5vdCBzZWFyY2hpbmcgZm9yICQxXSldKQorZWxzZQorQUNfTEFOR19QVVNIKFtDKytdKWRubAorYm9vc3Rfc2F2ZV9DUFBGTEFHUz0kQ1BQRkxBR1MKK0NQUEZMQUdTPSIkQ1BQRkxBR1MgJEJPT1NUX0NQUEZMQUdTIgorQUNfQ0hFQ0tfSEVBREVSKFskMV0sCisgIFttNF9kZWZhdWx0KFskM10sIFtBQ19ERUZJTkUoQVNfVFJfQ1BQKFtIQVZFXyQxXSksIFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgPCQxPl0pXSldLAorICBbbTRfZGVmYXVsdChbJDJdLCBbQUNfTVNHX0VSUk9SKFtjYW5ub3QgZmluZCAkMV0pXSldKQorQ1BQRkxBR1M9JGJvb3N0X3NhdmVfQ1BQRkxBR1MKK0FDX0xBTkdfUE9QKFtDKytdKWRubAorZmkKK10pIyBCT09TVF9GSU5EX0hFQURFUgorCisKKyMgQk9PU1RfRklORF9MSUJTKFtDT01QT05FTlQtTkFNRV0sIFtDQU5ESURBVEUtTElCLU5BTUVTXSwKKyMgICAgICAgICAgICAgICAgIFtQUkVGRVJSRUQtUlQtT1BUXSwgW0hFQURFUi1OQU1FXSwgW0NYWC1URVNUXSwKKyMgICAgICAgICAgICAgICAgIFtDWFgtUFJPTE9HVUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciB0aGUgQm9vc3QgbGlicmFyeSBDT01QT05FTlQtTkFNRSAoZS5nLiwgYHRocmVhZCcsIGZvcgorIyBsaWJib29zdF90aHJlYWQpIHVuZGVyIHRoZSBwb3NzaWJsZSBDQU5ESURBVEUtTElCLU5BTUVTIChlLmcuLAorIyAidGhyZWFkX3dpbjMyIHRocmVhZCIpLiAgQ2hlY2sgdGhhdCBIRUFERVItTkFNRSB3b3JrcyBhbmQgY2hlY2sgdGhhdAorIyBsaWJib29zdF9MSUItTkFNRSBjYW4gbGluayB3aXRoIHRoZSBjb2RlIENYWC1URVNULiAgVGhlIG9wdGlvbmFsCisjIGFyZ3VtZW50IENYWC1QUk9MT0dVRSBjYW4gYmUgdXNlZCB0byBpbmNsdWRlIHNvbWUgQysrIGNvZGUgYmVmb3JlCisjIHRoZSBgbWFpbicgZnVuY3Rpb24uCisjCisjIEludm9rZXMgQk9PU1RfRklORF9IRUFERVIoW0hFQURFUi1OQU1FXSkgKHNlZSBhYm92ZSkuCisjCisjIEJvb3N0IGxpYnJhcmllcyB0eXBpY2FsbHkgY29tZSBjb21waWxlZCB3aXRoIHNldmVyYWwgZmxhdm9ycyAod2l0aCBkaWZmZXJlbnQKKyMgcnVudGltZSBvcHRpb25zKSBzbyBQUkVGRVJSRUQtUlQtT1BUIGlzIHRoZSBwcmVmZXJyZWQgc3VmZml4LiAgQSBzdWZmaXggaXMgb25lCisjIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBsZXR0ZXJzOiBzZ2RwbiAoaW4gdGhhdCBvcmRlcikuICBzID0gc3RhdGljCisjIHJ1bnRpbWUsIGQgPSBkZWJ1ZyBidWlsZCwgZyA9IGRlYnVnL2RpYWdub3N0aWMgcnVudGltZSwgcCA9IFNUTFBvcnQgYnVpbGQsCisjIG4gPSAodW5zdXJlKSBTVExQb3J0IGJ1aWxkIHdpdGhvdXQgaW9zdHJlYW1zIGZyb20gU1RMUG9ydCAoaXQgbG9va3MgbGlrZSBgbicKKyMgbXVzdCBhbHdheXMgYmUgdXNlZCBhbG9uZyB3aXRoIGBwJykuICBBZGRpdGlvbmFsbHksIFBSRUZFUlJFRC1SVC1PUFQgY2FuCisjIHN0YXJ0IHdpdGggYG10LScgdG8gaW5kaWNhdGUgdGhhdCB0aGVyZSBpcyBhIHByZWZlcmVuY2UgZm9yIG11bHRpLXRocmVhZAorIyBidWlsZHMuICBTb21lIHNhbXBsZSB2YWx1ZXMgZm9yIFBSRUZFUlJFRC1SVC1PUFQ6IChub3RoaW5nKSwgbXQsIGQsIG10LWQsIGdkcAorIyAuLi4gIElmIHlvdSB3YW50IHRvIG1ha2Ugc3VyZSB5b3UgaGF2ZSBhIHNwZWNpZmljIHZlcnNpb24gb2YgQm9vc3QKKyMgKGVnLCA+PSAxLjMzKSB5b3UgKm11c3QqIGludm9rZSBCT09TVF9SRVFVSVJFIGJlZm9yZSB0aGlzIG1hY3JvLgorQUNfREVGVU4oW0JPT1NUX0ZJTkRfTElCU10sCitbQUNfUkVRVUlSRShbQk9PU1RfUkVRVUlSRV0pZG5sCitBQ19SRVFVSVJFKFtfQk9PU1RfRklORF9DT01QSUxFUl9UQUddKWRubAorQUNfUkVRVUlSRShbQk9PU1RfU1RBVElDXSlkbmwKK0FDX1JFUVVJUkUoW19CT09TVF9HVUVTU19XSEVUSEVSX1RPX1VTRV9NVF0pZG5sCitpZiB0ZXN0IHgiJGJvb3N0X2N2X2luY19wYXRoIiA9IHhubzsgdGhlbgorICBBQ19NU0dfTk9USUNFKFtCb29zdCBub3QgYXZhaWxhYmxlLCBub3Qgc2VhcmNoaW5nIGZvciB0aGUgQm9vc3QgJDEgbGlicmFyeV0pCitlbHNlCitkbmwgVGhlIGVsc2UgYnJhbmNoIGlzIGh1Z2UgYW5kIHdhc24ndCBpbnRlbmRlZCBvbiBwdXJwb3NlLgorQUNfTEFOR19QVVNIKFtDKytdKWRubAorQVNfVkFSX1BVU0hERUYoW0Jvb3N0X2xpYl0sIFtib29zdF9jdl9saWJfJDFdKWRubAorQVNfVkFSX1BVU0hERUYoW0Jvb3N0X2xpYl9MREZMQUdTXSwgW2Jvb3N0X2N2X2xpYl8kMV9MREZMQUdTXSlkbmwKK0FTX1ZBUl9QVVNIREVGKFtCb29zdF9saWJfTERQQVRIXSwgW2Jvb3N0X2N2X2xpYl8kMV9MRFBBVEhdKWRubAorQVNfVkFSX1BVU0hERUYoW0Jvb3N0X2xpYl9MSUJTXSwgW2Jvb3N0X2N2X2xpYl8kMV9MSUJTXSlkbmwKK0JPT1NUX0ZJTkRfSEVBREVSKFskNF0pCitib29zdF9zYXZlX0NQUEZMQUdTPSRDUFBGTEFHUworQ1BQRkxBR1M9IiRDUFBGTEFHUyAkQk9PU1RfQ1BQRkxBR1MiCitBQ19DQUNIRV9DSEVDSyhbZm9yIHRoZSBCb29zdCAkMSBsaWJyYXJ5XSwgW0Jvb3N0X2xpYl0sCisgICAgICAgICAgICAgICBbX0JPT1NUX0ZJTkRfTElCUygkQCldKQorY2FzZSAkQm9vc3RfbGliIGluICMoCisgIChubykgX0FDX01TR19MT0dfQ09ORlRFU1QKKyAgICBBQ19NU0dfRVJST1IoW2Nhbm5vdCBmaW5kIHRoZSBmbGFncyB0byBsaW5rIHdpdGggQm9vc3QgJDFdKQorICAgIDs7Citlc2FjCitBQ19TVUJTVChBU19UUl9DUFAoW0JPT1NUXyQxX0xERkxBR1NdKSwgWyRCb29zdF9saWJfTERGTEFHU10pZG5sCitBQ19TVUJTVChBU19UUl9DUFAoW0JPT1NUXyQxX0xEUEFUSF0pLCBbJEJvb3N0X2xpYl9MRFBBVEhdKWRubAorQUNfU1VCU1QoW0JPT1NUX0xEUEFUSF0sIFskQm9vc3RfbGliX0xEUEFUSF0pZG5sCitBQ19TVUJTVChBU19UUl9DUFAoW0JPT1NUXyQxX0xJQlNdKSwgWyRCb29zdF9saWJfTElCU10pZG5sCitDUFBGTEFHUz0kYm9vc3Rfc2F2ZV9DUFBGTEFHUworQVNfVkFSX1BPUERFRihbQm9vc3RfbGliXSlkbmwKK0FTX1ZBUl9QT1BERUYoW0Jvb3N0X2xpYl9MREZMQUdTXSlkbmwKK0FTX1ZBUl9QT1BERUYoW0Jvb3N0X2xpYl9MRFBBVEhdKWRubAorQVNfVkFSX1BPUERFRihbQm9vc3RfbGliX0xJQlNdKWRubAorQUNfTEFOR19QT1AoW0MrK10pZG5sCitmaQorXSkKKworCisjIEJPT1NUX0ZJTkRfTElCKFtMSUItTkFNRV0sCisjICAgICAgICAgICAgICAgIFtQUkVGRVJSRUQtUlQtT1BUXSwgW0hFQURFUi1OQU1FXSwgW0NYWC1URVNUXSwKKyMgICAgICAgICAgICAgICAgW0NYWC1QUk9MT0dVRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd3JhcHBlciBmb3IgQk9PU1RfRklORF9MSUJTLgorQUNfREVGVU4oW0JPT1NUX0ZJTkRfTElCXSwKK1tCT09TVF9GSU5EX0xJQlMoWyQxXSwgJEApXSkKKworCisjIF9CT09TVF9GSU5EX0xJQlMoW0xJQi1OQU1FXSwgW0NBTkRJREFURS1MSUItTkFNRVNdLAorIyAgICAgICAgICAgICAgICAgW1BSRUZFUlJFRC1SVC1PUFRdLCBbSEVBREVSLU5BTUVdLCBbQ1hYLVRFU1RdLAorIyAgICAgICAgICAgICAgICAgW0NYWC1QUk9MT0dVRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFJlYWwgaW1wbGVtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUJTOiByZWx5IG9uIHRoZXNlIGxvY2FsIG1hY3JvczoKKyMgQm9vc3RfbGliLCBCb29zdF9saWJfTERGTEFHUywgQm9vc3RfbGliX0xEUEFUSCwgQm9vc3RfbGliX0xJQlMKKyMKKyMgVGhlIGFsZ29yaXRobSBpcyBhcyBmb2xsb3dzOiBmaXJzdCBsb29rIGZvciBhIGdpdmVuIGxpYnJhcnkgbmFtZQorIyBhY2NvcmRpbmcgdG8gdGhlIHVzZXIncyBQUkVGRVJSRUQtUlQtT1BULiAgRm9yIGVhY2ggbGlicmFyeSBuYW1lLCB3ZQorIyBwcmVmZXIgdG8gdXNlIHRoZSBvbmVzIHRoYXQgY2FycnkgdGhlIHRhZyAodG9vbHNldCBuYW1lKS4gIEVhY2gKKyMgbGlicmFyeSBpcyBzZWFyY2hlZCB0aHJvdWdoIHRoZSB2YXJpb3VzIHN0YW5kYXJkIHBhdGhzIHdlcmUgQm9vc3QgaXMKKyMgdXN1YWxseSBpbnN0YWxsZWQuICBJZiB3ZSBjYW4ndCBmaW5kIHRoZSBzdGFuZGFyZCB2YXJpYW50cywgd2UgdHJ5CisjIHRvIGVuZm9yY2UgLW10IChmb3IgaW5zdGFuY2Ugb24gTWFjT1NYLCBsaWJib29zdF90aHJlYWQuZHlsaWIKKyMgZG9lc24ndCBleGlzdCBidXQgdGhlcmUncyAtb2J2aW91c2x5LSBsaWJib29zdF90aHJlYWQtbXQuZHlsaWIpLgorQUNfREVGVU4oW19CT09TVF9GSU5EX0xJQlNdLAorW0Jvb3N0X2xpYj1ubworICBjYXNlICIkMyIgaW4gIygKKyAgICAobXQgfCBtdC0pIGJvb3N0X210PS1tdDsgYm9vc3RfcnRvcHQ9OzsgIygKKyAgICAobXQqIHwgbXQtKikgYm9vc3RfbXQ9LW10OyBib29zdF9ydG9wdD1gZXhwciAiWCQzIiA6ICdYbXQtKlwoLipcKSdgOzsgIygKKyAgICAoKikgYm9vc3RfbXQ9OyBib29zdF9ydG9wdD0kMzs7CisgIGVzYWMKKyAgaWYgdGVzdCAkZW5hYmxlX3N0YXRpY19ib29zdCA9IHllczsgdGhlbgorICAgIGJvb3N0X3J0b3B0PSJzJGJvb3N0X3J0b3B0IgorICBmaQorICAjIEZpbmQgdGhlIHByb3BlciBkZWJ1ZyB2YXJpYW50IGRlcGVuZGluZyBvbiB3aGF0IHdlJ3ZlIGJlZW4gYXNrZWQgdG8gZmluZC4KKyAgY2FzZSAkYm9vc3RfcnRvcHQgaW4gIygKKyAgICAoKmQqKSBib29zdF9ydF9kPSRib29zdF9ydG9wdDs7ICMoCisgICAgKCpbW3NncG5dXSopICMgSW5zZXJ0IHRoZSBgZCcgYXQgdGhlIHJpZ2h0IHBsYWNlIChpbiBiZXR3ZWVuIGBzZycgYW5kIGBwbicpCisgICAgICBib29zdF9ydF9kPWBlY2hvICIkYm9vc3RfcnRvcHQiIHwgc2VkICdzL1wocypnKlwpXChwKm4qXCkvXDFcMi8nYDs7ICMoCisgICAgKCopIGJvb3N0X3J0X2Q9Jy1kJzs7CisgIGVzYWMKKyAgIyBJZiB0aGUgUFJFRkVSUkVELVJULU9QVCBhcmUgbm90IGVtcHR5LCBwcmVwZW5kIGEgYC0nLgorICB0ZXN0IC1uICIkYm9vc3RfcnRvcHQiICYmIGJvb3N0X3J0b3B0PSItJGJvb3N0X3J0b3B0IgorICAkYm9vc3RfZ3Vlc3NfdXNlX210ICYmIGJvb3N0X210PS1tdAorICAjIExvb2sgZm9yIHRoZSBhYnMgcGF0aCB0aGUgc3RhdGljIGFyY2hpdmUuCisgICMgJGxpYmV4dCBpcyBjb21wdXRlZCBieSBMaWJ0b29sIGJ1dCBsZXQncyBtYWtlIHN1cmUgaXQncyBub24gZW1wdHkuCisgIHRlc3QgLXogIiRsaWJleHQiICYmCisgICAgQUNfTVNHX0VSUk9SKFt0aGUgbGliZXh0IHZhcmlhYmxlIGlzIGVtcHR5LCBkaWQgeW91IGludm9rZSBMaWJ0b29sP10pCisgIGJvb3N0X3NhdmVfYWNfb2JqZXh0PSRhY19vYmpleHQKKyAgIyBHZW5lcmF0ZSB0aGUgdGVzdCBmaWxlLgorICBBQ19MQU5HX0NPTkZURVNUKFtBQ19MQU5HX1BST0dSQU0oWyNpbmNsdWRlIDwkND4KKyQ2XSwgWyQ1XSldKQorZG5sIE9wdGltaXphdGlvbiBoYWNrczogY29tcGlsaW5nIEMrKyBpcyBzbG93LCBlc3BlY2lhbGx5IHdpdGggQm9vc3QuICBXaGF0Citkbmwgd2UncmUgdHJ5aW5nIHRvIGRvIGhlcmUgaXMgZ3Vlc3MgdGhlIHJpZ2h0IGNvbWJpbmF0aW9uIG9mIGxpbmsgZmxhZ3MKK2RubCAoTElCUyAvIExERkxBR1MpIHRvIHVzZSBhIGdpdmVuIGxpYnJhcnkuICBUaGlzIGNhbiB0YWtlIHNldmVyYWwKK2RubCBpdGVyYXRpb25zIGJlZm9yZSBpdCBzdWNjZWVkcyBhbmQgaXMgdGh1cyAqdmVyeSogc2xvdy4gIFNvIHdoYXQgd2UgZG8KK2RubCBpbnN0ZWFkIGlzIHRoYXQgd2UgY29tcGlsZSB0aGUgY29kZSBmaXJzdCAoYW5kIHRodXMgZ2V0IGFuIG9iamVjdCBmaWxlLAorZG5sIHR5cGljYWxseSBjb25mdGVzdC5vKS4gIFRoZW4gd2UgdHJ5IHZhcmlvdXMgY29tYmluYXRpb25zIG9mIGxpbmsgZmxhZ3MKK2RubCB1bnRpbCB3ZSBzdWNjZWVkIHRvIGxpbmsgY29uZnRlc3QubyBpbiBhbiBleGVjdXRhYmxlLiAgVGhlIHByb2JsZW0gaXMKK2RubCB0aGF0IHRoZSB2YXJpb3VzIFRSWV9MSU5LIC8gQ09NUElMRV9JRkVMU0UgbWFjcm9zIG9mIEF1dG9jb25mIGFsd2F5cworZG5sIHJlbW92ZSBhbGwgdGhlIHRlbXBvcmFyeSBmaWxlcyBpbmNsdWRpbmcgY29uZnRlc3Quby4gIFNvIHRoZSB0cmljayBoZXJlCitkbmwgaXMgdG8gdGVtcG9yYXJpbHkgY2hhbmdlIHRoZSB2YWx1ZSBvZiBhY19vYmpleHQgc28gdGhhdCBjb25mdGVzdC5vIGlzCitkbmwgcHJlc2VydmVkIGFjY3Jvc3MgdGVzdHMuICBUaGlzIGlzIG9idmlvdXNseSBmcmFnaWxlIGFuZCBJIHdpbGwgYnVybiBpbgorZG5sIGhlbGwgZm9yIG5vdCByZXNwZWN0aW5nIEF1dG9jb25mJ3MgZG9jdW1lbnRlZCBpbnRlcmZhY2VzLCBidXQgaW4gdGhlCitkbmwgbWVhbiB0aW1lLCBpdCBvcHRpbWl6ZXMgdGhlIG1hY3JvIGJ5IGEgZmFjdG9yIG9mIDUgdG8gMzAuCitkbmwgQW5vdGhlciBzbWFsbCBvcHRpbWl6YXRpb246IHRoZSBmaXJzdCBhcmd1bWVudCBvZiBBQ19DT01QSUxFX0lGRUxTRSBsZWZ0CitkbmwgZW1wdHkgYmVjYXVzZSB0aGUgdGVzdCBmaWxlIGlzIGdlbmVyYXRlZCBvbmx5IG9uY2UgYWJvdmUgKGJlZm9yZSB3ZQorZG5sIHN0YXJ0IHRoZSBmb3IgbG9vcHMpLgorICBBQ19DT01QSUxFX0lGRUxTRShbXSwKKyAgICBbYWNfb2JqZXh0PWRvX25vdF9ybV9tZV9wbHpdLAorICAgIFtBQ19NU0dfRVJST1IoW2Nhbm5vdCBjb21waWxlIGEgdGVzdCB0aGF0IHVzZXMgQm9vc3QgJDFdKV0pCisgIGFjX29iamV4dD0kYm9vc3Rfc2F2ZV9hY19vYmpleHQKKyAgYm9vc3RfZmFpbGVkX2xpYnM9CisjIERvbid0IGJvdGhlciB0byBpZGVudCB0aGUgZm9sbG93aW5nIG5lc3RlZCBmb3IgbG9vcHMsIG9ubHkgdGhlIDIKKyMgaW5uZXJtb3N0IG9uZXMgbWF0dGVyLgorZm9yIGJvb3N0X2xpYl8gaW4gJDI7IGRvCitmb3IgYm9vc3RfdGFnXyBpbiAtJGJvb3N0X2N2X2xpYl90YWcgJyc7IGRvCitmb3IgYm9vc3RfdmVyXyBpbiAtJGJvb3N0X2N2X2xpYl92ZXJzaW9uICcnOyBkbworZm9yIGJvb3N0X210XyBpbiAkYm9vc3RfbXQgLW10ICcnOyBkbworZm9yIGJvb3N0X3J0b3B0XyBpbiAkYm9vc3RfcnRvcHQgJycgLWQ7IGRvCisgIGZvciBib29zdF9saWIgaW4gXAorICAgIGJvb3N0XyRib29zdF9saWJfJGJvb3N0X3RhZ18kYm9vc3RfbXRfJGJvb3N0X3J0b3B0XyRib29zdF92ZXJfIFwKKyAgICBib29zdF8kYm9vc3RfbGliXyRib29zdF90YWdfJGJvb3N0X3J0b3B0XyRib29zdF92ZXJfIFwKKyAgICBib29zdF8kYm9vc3RfbGliXyRib29zdF90YWdfJGJvb3N0X210XyRib29zdF92ZXJfIFwKKyAgICBib29zdF8kYm9vc3RfbGliXyRib29zdF90YWdfJGJvb3N0X3Zlcl8KKyAgZG8KKyAgICAjIEF2b2lkIHRlc3RpbmcgdHdpY2UgdGhlIHNhbWUgbGliCisgICAgY2FzZSAkYm9vc3RfZmFpbGVkX2xpYnMgaW4gIygKKyAgICAgICgqQCRib29zdF9saWJAKikgY29udGludWU7OworICAgIGVzYWMKKyAgICAjIElmIHdpdGhfYm9vc3QgaXMgZW1wdHksIHdlJ2xsIHNlYXJjaCBpbiAvbGliIGZpcnN0LCB3aGljaCBpcyBub3QgcXVpdGUKKyAgICAjIHJpZ2h0IHNvIGluc3RlYWQgd2UnbGwgdHJ5IHRvIGEgbG9jYXRpb24gYmFzZWQgb24gd2hlcmUgdGhlIGhlYWRlcnMgYXJlLgorICAgIGJvb3N0X3RtcF9saWI9JHdpdGhfYm9vc3QKKyAgICB0ZXN0IHgiJHdpdGhfYm9vc3QiID0geCAmJiBib29zdF90bXBfbGliPSR7Ym9vc3RfY3ZfaW5jX3BhdGglL2luY2x1ZGV9CisgICAgZm9yIGJvb3N0X2xkcGF0aCBpbiAiJGJvb3N0X3RtcF9saWIvbGliIiAnJyBcCisgICAgICAgICAgICAgL29wdC9sb2NhbC9saWIqIC91c3IvbG9jYWwvbGliKiAvb3B0L2xpYiogL3Vzci9saWIqIFwKKyAgICAgICAgICAgICAiJHdpdGhfYm9vc3QiIEM6L0Jvb3N0L2xpYiAvbGliKgorICAgIGRvCisgICAgICAjIERvbid0IHdhc3RlIHRpbWUgd2l0aCBkaXJlY3RvcmllcyB0aGF0IGRvbid0IGV4aXN0LgorICAgICAgaWYgdGVzdCB4IiRib29zdF9sZHBhdGgiICE9IHggJiYgdGVzdCAhIC1lICIkYm9vc3RfbGRwYXRoIjsgdGhlbgorICAgICAgICBjb250aW51ZQorICAgICAgZmkKKyAgICAgIGJvb3N0X3NhdmVfTERGTEFHUz0kTERGTEFHUworICAgICAgIyBBcmUgd2UgbG9va2luZyBmb3IgYSBzdGF0aWMgbGlicmFyeT8KKyAgICAgIGNhc2UgJGJvb3N0X2xkcGF0aDokYm9vc3RfcnRvcHRfIGluICMoCisgICAgICAgICgqPyo6KnMqKSAjIFllcyAoTm9uIGVtcHR5IGJvb3N0X2xkcGF0aCArIHMgaW4gcnQgb3B0KQorICAgICAgICAgIEJvb3N0X2xpYl9MSUJTPSIkYm9vc3RfbGRwYXRoL2xpYiRib29zdF9saWIuJGxpYmV4dCIKKyAgICAgICAgICB0ZXN0IC1lICIkQm9vc3RfbGliX0xJQlMiIHx8IGNvbnRpbnVlOzsgIygKKyAgICAgICAgKCopICMgTm86IHVzZSAtbGJvb3N0X2ZvbyB0byBmaW5kIHRoZSBzaGFyZWQgbGlicmFyeS4KKyAgICAgICAgICBCb29zdF9saWJfTElCUz0iLWwkYm9vc3RfbGliIjs7CisgICAgICBlc2FjCisgICAgICBib29zdF9zYXZlX0xJQlM9JExJQlMKKyAgICAgIExJQlM9IiRCb29zdF9saWJfTElCUyAkTElCUyIKKyAgICAgIHRlc3QgeCIkYm9vc3RfbGRwYXRoIiAhPSB4ICYmIExERkxBR1M9IiRMREZMQUdTIC1MJGJvb3N0X2xkcGF0aCIKK2RubCBGaXJzdCBhcmd1bWVudCBvZiBBQ19MSU5LX0lGRUxTRSBsZWZ0IGVtcHR5IGJlY2F1c2UgdGhlIHRlc3QgZmlsZSBpcworZG5sIGdlbmVyYXRlZCBvbmx5IG9uY2UgYWJvdmUgKGJlZm9yZSB3ZSBzdGFydCB0aGUgZm9yIGxvb3BzKS4KKyAgICAgIF9CT09TVF9BQ19MSU5LX0lGRUxTRShbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbQm9vc3RfbGliPXllc10sIFtCb29zdF9saWI9bm9dKQorICAgICAgYWNfb2JqZXh0PSRib29zdF9zYXZlX2FjX29iamV4dAorICAgICAgTERGTEFHUz0kYm9vc3Rfc2F2ZV9MREZMQUdTCisgICAgICBMSUJTPSRib29zdF9zYXZlX0xJQlMKKyAgICAgIGlmIHRlc3QgeCIkQm9vc3RfbGliIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgIyBDaGVjayBvciB1c2VkIGNhY2hlZCByZXN1bHQgb2Ygd2hldGhlciBvciBub3QgdXNpbmcgLVIgb3IKKyAgICAgICAgIyAtcnBhdGggbWFrZXMgc2Vuc2UuICBTb21lIGltcGxlbWVudGF0aW9ucyBvZiBsZCwgc3VjaCBhcyBmb3IKKyAgICAgICAgIyBNYWMgT1NYLCByZXF1aXJlIC1ycGF0aCBidXQgLVIgaXMgdGhlIGZsYWcga25vd24gdG8gd29yayBvbgorICAgICAgICAjIG90aGVyIHN5c3RlbXMuICBodHRwczovL2dpdGh1Yi5jb20vdHN1bmEvYm9vc3QubTQvaXNzdWVzLzE5CisgICAgICAgIEFDX0NBQ0hFX1ZBTChbYm9vc3RfY3ZfcnBhdGhfbGlua19sZGZsYWddLAorICAgICAgICAgIFtjYXNlICRib29zdF9sZHBhdGggaW4KKyAgICAgICAgICAgJycpICMgTm90aGluZyB0byBkby4KKyAgICAgICAgICAgICBib29zdF9jdl9ycGF0aF9saW5rX2xkZmxhZz0KKyAgICAgICAgICAgICBib29zdF9ycGF0aF9saW5rX2xkZmxhZ19mb3VuZD15ZXM7OworICAgICAgICAgICAqKQorICAgICAgICAgICAgZm9yIGJvb3N0X2N2X3JwYXRoX2xpbmtfbGRmbGFnIGluIC1XbCwtUiwgLVdsLC1ycGF0aCw7IGRvCisgICAgICAgICAgICAgIExERkxBR1M9IiRib29zdF9zYXZlX0xERkxBR1MgLUwkYm9vc3RfbGRwYXRoICRib29zdF9jdl9ycGF0aF9saW5rX2xkZmxhZyRib29zdF9sZHBhdGgiCisgICAgICAgICAgICAgIExJQlM9IiRib29zdF9zYXZlX0xJQlMgJEJvb3N0X2xpYl9MSUJTIgorICAgICAgICAgICAgICBfQk9PU1RfQUNfTElOS19JRkVMU0UoW10sCisgICAgICAgICAgICAgICAgW2Jvb3N0X3JwYXRoX2xpbmtfbGRmbGFnX2ZvdW5kPXllcworICAgICAgICAgICAgICAgIGJyZWFrXSwKKyAgICAgICAgICAgICAgICBbYm9vc3RfcnBhdGhfbGlua19sZGZsYWdfZm91bmQ9bm9dKQorICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgOzsKKyAgICAgICAgICBlc2FjCisgICAgICAgICAgQVNfSUYoW3Rlc3QgIngkYm9vc3RfcnBhdGhfbGlua19sZGZsYWdfZm91bmQiICE9ICJ4eWVzIl0sCisgICAgICAgICAgICBbQUNfTVNHX0VSUk9SKFtVbmFibGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gdXNlIC1SIG9yIC1ycGF0aF0pXSkKKyAgICAgICAgICBMREZMQUdTPSRib29zdF9zYXZlX0xERkxBR1MKKyAgICAgICAgICBMSUJTPSRib29zdF9zYXZlX0xJQlMKKyAgICAgICAgICBdKQorICAgICAgICB0ZXN0IHgiJGJvb3N0X2xkcGF0aCIgIT0geCAmJgorICAgICAgICAgIEJvb3N0X2xpYl9MREZMQUdTPSItTCRib29zdF9sZHBhdGggJGJvb3N0X2N2X3JwYXRoX2xpbmtfbGRmbGFnJGJvb3N0X2xkcGF0aCIKKyAgICAgICAgQm9vc3RfbGliX0xEUEFUSD0iJGJvb3N0X2xkcGF0aCIKKyAgICAgICAgYnJlYWsgNworICAgICAgZWxzZQorICAgICAgICBib29zdF9mYWlsZWRfbGlicz0iJGJvb3N0X2ZhaWxlZF9saWJzQCRib29zdF9saWJAIgorICAgICAgZmkKKyAgICBkb25lCisgIGRvbmUKK2RvbmUKK2RvbmUKK2RvbmUKK2RvbmUKK2RvbmUgIyBib29zdF9saWJfCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitdKQorCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIworIyBDaGVja3MgZm9yIHRoZSB2YXJpb3VzIEJvb3N0IGxpYnJhcmllcy4gIworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIworCisjIExpc3Qgb2YgYm9vc3QgbGlicmFyaWVzOiBodHRwOi8vd3d3LmJvb3N0Lm9yZy9saWJzL2xpYnJhcmllcy5odG0KKyMgVGhlIHBhZ2UgaHR0cDovL2JldGEuYm9vc3Qub3JnL2RvYy9saWJzIGlzIHVzZWZ1bDogaXQgZ2l2ZXMgdGhlIGZpcnN0IHJlbGVhc2UKKyMgdmVyc2lvbiBvZiBlYWNoIGxpYnJhcnkgKGFtb25nIG90aGVyIHRoaW5ncykuCisKKyMgQk9PU1RfREVGVU4oTElCUkFSWSwgQ09ERSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRGVmaW5lIEJPT1NUXzxMSUJSQVJZLVVQUEVSQ0FTRT4gYXMgYSBtYWNybyB0aGF0IHJ1bnMgQ09ERS4KKyMKKyMgVXNlIGluZGlyIHRvIGF2b2lkIHRoZSB3YXJuaW5nIG9uIHVuZGVycXVvdGVkIG1hY3JvIG5hbWUgZ2l2ZW4gdG8gQUNfREVGVU4uCittNF9kZWZpbmUoW0JPT1NUX0RFRlVOXSwKK1ttNF9pbmRpcihbQUNfREVGVU5dLAorICAgICAgICAgIG00X3RvdXBwZXIoW0JPT1NUXyQxXSksCitbbTRfcHVzaGRlZihbQk9PU1RfTGlicmFyeV0sIFskMV0pZG5sCiskMgorbTRfcG9wZGVmKFtCT09TVF9MaWJyYXJ5XSlkbmwKK10pCitdKQorCisjIEJPT1NUX0FSUkFZKCkKKyMgLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5BcnJheQorQk9PU1RfREVGVU4oW0FycmF5XSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvYXJyYXkuaHBwXSldKQorCisKKyMgQk9PU1RfQVNJTygpCisjIC0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5Bc2lvIChuZXcgaW4gQm9vc3QgMS4zNSkuCitCT09TVF9ERUZVTihbQXNpb10sCitbQUNfUkVRVUlSRShbQk9PU1RfU1lTVEVNXSlkbmwKK0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9hc2lvLmhwcF0pXSkKKworCisjIEJPT1NUX0JJTkQoKQorIyAtLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuQmluZC4KK0JPT1NUX0RFRlVOKFtCaW5kXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvYmluZC5ocHBdKV0pCisKKworIyBCT09TVF9DSFJPTk8oKQorIyAtLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5DaHJvbm8uCitCT09TVF9ERUZVTihbQ2hyb25vXSwKK1sjIERvIHdlIGhhdmUgdG8gY2hlY2sgZm9yIEJvb3N0LlN5c3RlbT8gIFRoaXMgbGluay10aW1lIGRlcGVuZGVuY3kgd2FzCisjIGFkZGVkIGFzIG9mIDEuMzUuMC4gIElmIHdlIGhhdmUgYSB2ZXJzaW9uIDwxLjM1LCB3ZSBtdXN0IG5vdCBhdHRlbXB0IHRvCisjIGZpbmQgQm9vc3QuU3lzdGVtIGFzIGl0IGRpZG4ndCBleGlzdCBieSB0aGVuLgoraWYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtZ2UgMTM1OyB0aGVuCisgIEJPT1NUX1NZU1RFTShbJDFdKQorZmkgIyBlbmQgb2YgdGhlIEJvb3N0LlN5c3RlbSBjaGVjay4KK2Jvb3N0X2ZpbGVzeXN0ZW1fc2F2ZV9MSUJTPSRMSUJTCitib29zdF9maWxlc3lzdGVtX3NhdmVfTERGTEFHUz0kTERGTEFHUworbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX1NZU1RFTV8oTElCU3xMREZMQUdTKSRdKWRubAorTElCUz0iJExJQlMgJEJPT1NUX1NZU1RFTV9MSUJTIgorTERGTEFHUz0iJExERkxBR1MgJEJPT1NUX1NZU1RFTV9MREZMQUdTIgorQk9PU1RfRklORF9MSUIoW2Nocm9ub10sIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L2Nocm9uby5ocHBdLAorICAgICAgICAgICAgICAgIFtib29zdDo6Y2hyb25vOjp0aHJlYWRfY2xvY2sgZDtdKQoraWYgdGVzdCAkZW5hYmxlX3N0YXRpY19ib29zdCA9IHllcyAmJiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxMzU7IHRoZW4KKyAgQk9PU1RfQ0hST05PX0xJQlM9IiRCT09TVF9DSFJPTk9fTElCUyAkQk9PU1RfU1lTVEVNX0xJQlMiCitmaQorTElCUz0kYm9vc3RfZmlsZXN5c3RlbV9zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X2ZpbGVzeXN0ZW1fc2F2ZV9MREZMQUdTCitdKSMgQk9PU1RfQ0hST05PCisKKworIyBCT09TVF9DT05URVhUKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuQ29udGV4dC4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCisjCisjICogVGhpcyBsaWJyYXJ5IHdhcyBpbnRyb2R1Y2VkIGluIEJvb3N0IDEuNTEuMAorIyAqIFRoZSBzaWduYXR1cmVzIG9mIG1ha2VfZmNvbnRleHQoKSBhbmQganVtcF9mY29udGV4dCB3ZXJlIGNoYW5nZWQgaW4gMS41Ni4wCisjICogQSBkZXBlbmRlbmN5IG9uIGJvb3N0X3RocmVhZCBhcHBlYXJzIGluIDEuNTcuMAorQk9PU1RfREVGVU4oW0NvbnRleHRdLAorW2Jvb3N0X2NvbnRleHRfc2F2ZV9MSUJTPSRMSUJTCisgYm9vc3RfY29udGV4dF9zYXZlX0xERkxBR1M9JExERkxBR1MKK2lmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWdlIDE1NzsgdGhlbgorICBCT09TVF9USFJFQUQoWyQxXSkKKyAgbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX1RIUkVBRF8oTElCU3xMREZMQUdTKSRdKWRubAorICBMSUJTPSIkTElCUyAkQk9PU1RfVEhSRUFEX0xJQlMiCisgIExERkxBR1M9IiRMREZMQUdTICRCT09TVF9USFJFQURfTERGTEFHUyIKK2ZpCitCT09TVF9GSU5EX0xJQihbY29udGV4dF0sIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L2NvbnRleHQvYWxsLmhwcF0sW1sKKworLy8gY3JlYXRlcyBhIHN0YWNrCit2b2lkICogc3RhY2tfcG9pbnRlciA9IG5ldyB2b2lkKls0MDk2XTsKK3N0ZDo6c2l6ZV90IGNvbnN0IHNpemUgPSBzaXplb2Yodm9pZCpbNDA5Nl0pOworCisjaWYgQk9PU1RfVkVSU0lPTiA8PSAxMDUxMDAKK2N0eDo6bWFrZV9mY29udGV4dCgmZmMsIGYpOworcmV0dXJuIGN0eDo6anVtcF9mY29udGV4dCgmZmNtLCAmZmMsIDMpID09IDY7CisKKyNlbHNlCisKK2ZjID0gY3R4OjptYWtlX2Zjb250ZXh0KHN0YWNrX3BvaW50ZXIsIHNpemUsIGYpOworcmV0dXJuIGN0eDo6anVtcF9mY29udGV4dCgmZmNtLCBmYywgMykgPT0gNjsKKworI2VuZGlmCisKKworXV0sW2RubAorCisjaW5jbHVkZSA8Ym9vc3QvdmVyc2lvbi5ocHA+CisjaWYgQk9PU1RfVkVSU0lPTiA8PSAxMDUxMDAKKworbmFtZXNwYWNlIGN0eCA9IGJvb3N0OjpjdHg7CisKK3N0YXRpYyBjdHg6OmZjb250ZXh0X3QgZmNtLCBmYzsKKworc3RhdGljIHZvaWQgZihpbnRwdHJfdCBpKSB7CisgICAgY3R4OjpqdW1wX2Zjb250ZXh0KCZmYywgJmZjbSwgaSAqIDIpOworfQorCisjZWxpZiBCT09TVF9WRVJTSU9OIDw9IDEwNTUwMAorCituYW1lc3BhY2UgY3R4ID0gYm9vc3Q6OmNvbnRleHQ7CisKKy8vIGNvbnRleHQKK3N0YXRpYyBjdHg6OmZjb250ZXh0X3QgZmNtLCAqZmM7CisKKy8vIGNvbnRleHQtZnVuY3Rpb24KK3N0YXRpYyB2b2lkIGYoaW50cHRyX3QgaSkgeworICAgIGN0eDo6anVtcF9mY29udGV4dChmYywgJmZjbSwgaSAqIDIpOworfQorCisjZWxzZQorCituYW1lc3BhY2UgY3R4ID0gYm9vc3Q6OmNvbnRleHQ7CisKKy8vIGNvbnRleHQKK3N0YXRpYyBjdHg6OmZjb250ZXh0X3QgZmNtLCBmYzsKKworLy8gY29udGV4dC1mdW5jdGlvbgorc3RhdGljIHZvaWQgZihpbnRwdHJfdCBpKSB7CisgICAgY3R4OjpqdW1wX2Zjb250ZXh0KCZmYywgZmNtLCBpICogMik7Cit9CisjZW5kaWYKK10pCitMSUJTPSRib29zdF9jb250ZXh0X3NhdmVfTElCUworTERGTEFHUz0kYm9vc3RfY29udGV4dF9zYXZlX0xERkxBR1MKK10pIyBCT09TVF9DT05URVhUCisKKworIyBCT09TVF9DT05WRVJTSU9OKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkNvbnZlcnNpb24gKGNhc3QgLyBsZXhpY2FsX2Nhc3QpCitCT09TVF9ERUZVTihbQ29udmVyc2lvbl0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L2Nhc3QuaHBwXSkKK0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9sZXhpY2FsX2Nhc3QuaHBwXSkKK10pIyBCT09TVF9DT05WRVJTSU9OCisKKworIyBCT09TVF9DT1JPVVRJTkUoW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5Db3JvdXRpbmUuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLiAgVGhpcyBsaWJyYXJ5IHdhcyBpbnRyb2R1Y2VkIGluIEJvb3N0CisjIDEuNTMuMAorQk9PU1RfREVGVU4oW0Nvcm91dGluZV0sCitbCitib29zdF9jb3JvdXRpbmVfc2F2ZV9MSUJTPSRMSUJTCitib29zdF9jb3JvdXRpbmVfc2F2ZV9MREZMQUdTPSRMREZMQUdTCisjIExpbmstdGltZSBkZXBlbmRlbmN5IGZyb20gY29yb3V0aW5lIHRvIGNvbnRleHQKK0JPT1NUX0NPTlRFWFQoWyQxXSkKKyMgU3RhcnRpbmcgZnJvbSBCb29zdCAxLjU1IGEgZGVwZW5kZW5jeSBvbiBCb29zdC5TeXN0ZW0gaXMgYWRkZWQKK2lmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWdlIDE1NTsgdGhlbgorICBCT09TVF9TWVNURU0oWyQxXSkKK2ZpCittNF9wYXR0ZXJuX2FsbG93KFteQk9PU1RfKENPTlRFWFR8U1lTVEVNKV8oTElCU3xMREZMQUdTKV0pCitMSUJTPSIkTElCUyAkQk9PU1RfQ09OVEVYVF9MSUJTICRCT09TVF9TWVNURU1fTElCUyIKK0xERkxBR1M9IiRMREZMQUdTICRCT09TVF9DT05URVhUX0xERkxBR1MiCisKKyMgaW4gMS41MyBjb3JvdXRpbmUgd2FzIGEgaGVhZGVyIG9ubHkgbGlicmFyeQoraWYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtZXEgMTUzOyB0aGVuCisgIEJPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9jb3JvdXRpbmUvY29yb3V0aW5lLmhwcF0pCitlbHNlCisgIEJPT1NUX0ZJTkRfTElCKFtjb3JvdXRpbmVdLCBbJDFdLAorCQkgIFtib29zdC9jb3JvdXRpbmUvY29yb3V0aW5lLmhwcF0sCisJCSAgWworICAjaW5jbHVkZSA8Ym9vc3QvdmVyc2lvbi5ocHA+CisgICNpZiAgIEJPT1NUX1ZFUlNJT04gPD0gMTA1NTAwCisgIGJvb3N0Ojpjb3JvdXRpbmVzOjpjb3JvdXRpbmU8aW50KGludCk+IGNvcm87IGNvcm8uZ2V0KCk7CisgICNlbHNlCisgIGJvb3N0Ojpjb3JvdXRpbmVzOjphc3ltbWV0cmljX2Nvcm91dGluZTxpbnQ+OjpwdWxsX3R5cGUgY29ybzsgY29yby5nZXQoKTsKKyAgI2VuZGlmCisgIF0pCitmaQorIyBMaW5rLXRpbWUgZGVwZW5kZW5jeSBmcm9tIGNvcm91dGluZSB0byBjb250ZXh0LCBleGlzdGVkIG9ubHkgaW4gMS41MywgaW4gMS41NAorIyBjb3JvdXRpbmUgZG9lc24ndCB1c2UgY29udGV4dCBmcm9tIGl0cyBoZWFkZXJzIGJ1dCBmcm9tIGl0cyBsaWJyYXJ5LgoraWYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtZXEgMTUzIHx8IHRlc3QgJGVuYWJsZV9zdGF0aWNfYm9vc3QgPSB5ZXMgJiYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtZ2UgMTU0OyB0aGVuCisgIEJPT1NUX0NPUk9VVElORV9MSUJTPSIkQk9PU1RfQ09ST1VUSU5FX0xJQlMgJEJPT1NUX0NPTlRFWFRfTElCUyIKKyAgQk9PU1RfQ09ST1VUSU5FX0xERkxBR1M9IiRCT09TVF9DT1JPVVRJTkVfTERGTEFHUyAkQk9PU1RfQ09OVEVYVF9MREZMQUdTIgorZmkKK2lmIHRlc3QgJGVuYWJsZV9zdGF0aWNfYm9vc3QgPSB5ZXMgJiYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtZ2UgMTU1OyB0aGVuCisgIEJPT1NUX0NPUk9VVElORV9MSUJTPSIkQk9PU1RfQ09ST1VUSU5FX0xJQlMgJEJPT1NUX1NZU1RFTV9MSUJTIgorICBCT09TVF9DT1JPVVRJTkVfTERGTEFHUz0iJEJPT1NUX0NPUk9VVElORV9MREZMQUdTICRCT09TVF9TWVNURU1fTERGTEFHUyIKK2ZpCitMSUJTPSRib29zdF9jb3JvdXRpbmVfc2F2ZV9MSUJTCitMREZMQUdTPSRib29zdF9jb3JvdXRpbmVfc2F2ZV9MREZMQUdTCitdKSMgQk9PU1RfQ09ST1VUSU5FCisKKworIyBCT09TVF9DUkMoKQorIyAtLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5DUkMKK0JPT1NUX0RFRlVOKFtDUkNdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9jcmMuaHBwXSkKK10pIyBCT09TVF9DUkMKKworCisjIEJPT1NUX0RBVEVfVElNRShbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkRhdGVfVGltZS4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbRGF0ZV9UaW1lXSwKK1tCT09TVF9GSU5EX0xJQihbZGF0ZV90aW1lXSwgWyQxXSwKKyAgICAgICAgICAgICAgICBbYm9vc3QvZGF0ZV90aW1lL3Bvc2l4X3RpbWUvcG9zaXhfdGltZS5ocHBdLAorICAgICAgICAgICAgICAgIFtib29zdDo6cG9zaXhfdGltZTo6cHRpbWUgdDtdKQorXSkjIEJPT1NUX0RBVEVfVElNRQorCisKKyMgQk9PU1RfRklMRVNZU1RFTShbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5GaWxlc3lzdGVtLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsIHNlZQorIyB0aGUgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4KKyMgRG8gbm90IGNoZWNrIGZvciBib29zdC9maWxlc3lzdGVtLmhwcCBiZWNhdXNlIHRoaXMgZmlsZSB3YXMgaW50cm9kdWNlZCBpbgorIyAxLjM0LgorQk9PU1RfREVGVU4oW0ZpbGVzeXN0ZW1dLAorWyMgRG8gd2UgaGF2ZSB0byBjaGVjayBmb3IgQm9vc3QuU3lzdGVtPyAgVGhpcyBsaW5rLXRpbWUgZGVwZW5kZW5jeSB3YXMKKyMgYWRkZWQgYXMgb2YgMS4zNS4wLiAgSWYgd2UgaGF2ZSBhIHZlcnNpb24gPDEuMzUsIHdlIG11c3Qgbm90IGF0dGVtcHQgdG8KKyMgZmluZCBCb29zdC5TeXN0ZW0gYXMgaXQgZGlkbid0IGV4aXN0IGJ5IHRoZW4uCitpZiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxMzU7IHRoZW4KKyAgQk9PU1RfU1lTVEVNKFskMV0pCitmaSAjIGVuZCBvZiB0aGUgQm9vc3QuU3lzdGVtIGNoZWNrLgorYm9vc3RfZmlsZXN5c3RlbV9zYXZlX0xJQlM9JExJQlMKK2Jvb3N0X2ZpbGVzeXN0ZW1fc2F2ZV9MREZMQUdTPSRMREZMQUdTCittNF9wYXR0ZXJuX2FsbG93KFteQk9PU1RfU1lTVEVNXyhMSUJTfExERkxBR1MpJF0pZG5sCitMSUJTPSIkTElCUyAkQk9PU1RfU1lTVEVNX0xJQlMiCitMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfU1lTVEVNX0xERkxBR1MiCitCT09TVF9GSU5EX0xJQihbZmlsZXN5c3RlbV0sIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L2ZpbGVzeXN0ZW0vcGF0aC5ocHBdLCBbYm9vc3Q6OmZpbGVzeXN0ZW06OnBhdGggcDtdKQoraWYgdGVzdCAkZW5hYmxlX3N0YXRpY19ib29zdCA9IHllcyAmJiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxMzU7IHRoZW4KKyAgQk9PU1RfRklMRVNZU1RFTV9MSUJTPSIkQk9PU1RfRklMRVNZU1RFTV9MSUJTICRCT09TVF9TWVNURU1fTElCUyIKK2ZpCitMSUJTPSRib29zdF9maWxlc3lzdGVtX3NhdmVfTElCUworTERGTEFHUz0kYm9vc3RfZmlsZXN5c3RlbV9zYXZlX0xERkxBR1MKK10pIyBCT09TVF9GSUxFU1lTVEVNCisKKworIyBCT09TVF9GTFlXRUlHSFQoKQorIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5GbHl3ZWlnaHQuCitCT09TVF9ERUZVTihbRmx5d2VpZ2h0XSwKK1tkbmwgVGhlcmUncyBhIGhpZGRlbiBkZXBlbmRlbmN5IG9uIHB0aHJlYWRzLgorQUNfUkVRVUlSRShbX0JPT1NUX1BUSFJFQURfRkxBR10pZG5sCitCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvZmx5d2VpZ2h0LmhwcF0pCitBQ19TVUJTVChbQk9PU1RfRkxZV0VJR0hUX0xJQlNdLCBbJGJvb3N0X2N2X3B0aHJlYWRfZmxhZ10pCitdKQorCisKKyMgQk9PU1RfRk9SRUFDSCgpCisjIC0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5Gb3JlYWNoLgorQk9PU1RfREVGVU4oW0ZvcmVhY2hdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9mb3JlYWNoLmhwcF0pXSkKKworCisjIEJPT1NUX0ZPUk1BVCgpCisjIC0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkZvcm1hdC4KKyMgTm90ZTogd2UgY2FuJ3QgY2hlY2sgZm9yIGJvb3N0L2Zvcm1hdC9mb3JtYXRfZndkLmhwcCBiZWNhdXNlIHRoZSBoZWFkZXIgaXNuJ3QKKyMgc3RhbmRhbG9uZS4gIEl0IGNhbid0IGJlIGNvbXBpbGVkIGJlY2F1c2UgaXQgdHJpZ2dlcnMgdGhlIGZvbGxvd2luZyBlcnJvcjoKKyMgYm9vc3QvZm9ybWF0L2RldGFpbC9jb25maWdfbWFjcm9zLmhwcDo4ODogZXJyb3I6ICdsb2NhbGUnIGluIG5hbWVzcGFjZSAnc3RkJworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9lcyBub3QgbmFtZSBhIHR5cGUKK0JPT1NUX0RFRlVOKFtGb3JtYXRdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9mb3JtYXQuaHBwXSldKQorCisKKyMgQk9PU1RfRlVOQ1RJT04oKQorIyAtLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkZ1bmN0aW9uCitCT09TVF9ERUZVTihbRnVuY3Rpb25dLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9mdW5jdGlvbi5ocHBdKV0pCisKKworIyBCT09TVF9HRU9NRVRSWSgpCisjIC0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuR2VvbWV0cnkgKG5ldyBzaW5jZSAxLjQ3LjApLgorQk9PU1RfREVGVU4oW0dlb21ldHJ5XSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvZ2VvbWV0cnkuaHBwXSkKK10pIyBCT09TVF9HRU9NRVRSWQorCisKKyMgQk9PU1RfR1JBUEgoW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkdyYXBocy4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbR3JhcGhdLAorW2Jvb3N0X2dyYXBoX3NhdmVfTElCUz0kTElCUworYm9vc3RfZ3JhcGhfc2F2ZV9MREZMQUdTPSRMREZMQUdTCisjIExpbmstdGltZSBkZXBlbmRlbmN5IGZyb20gZ3JhcGggdG8gcmVnZXggd2FzIGFkZGVkIGFzIG9mIDEuNDAuMC4KK2lmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWdlIDE0MDsgdGhlbgorICBCT09TVF9SRUdFWChbJDFdKQorICBtNF9wYXR0ZXJuX2FsbG93KFteQk9PU1RfUkVHRVhfKExJQlN8TERGTEFHUykkXSlkbmwKKyAgTElCUz0iJExJQlMgJEJPT1NUX1JFR0VYX0xJQlMiCisgIExERkxBR1M9IiRMREZMQUdTICRCT09TVF9SRUdFWF9MREZMQUdTIgorZmkKK0JPT1NUX0ZJTkRfTElCKFtncmFwaF0sIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L2dyYXBoL2FkamFjZW5jeV9saXN0LmhwcF0sIFtib29zdDo6YWRqYWNlbmN5X2xpc3Q8PiBnO10pCitMSUJTPSRib29zdF9ncmFwaF9zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X2dyYXBoX3NhdmVfTERGTEFHUworXSkjIEJPT1NUX0dSQVBICisKKworIyBCT09TVF9JT1NUUkVBTVMoW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5JT1N0cmVhbXMuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW0lPU3RyZWFtc10sCitbQk9PU1RfRklORF9MSUIoW2lvc3RyZWFtc10sIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L2lvc3RyZWFtcy9kZXZpY2UvZmlsZV9kZXNjcmlwdG9yLmhwcF0sCisgICAgICAgICAgICAgICAgW2Jvb3N0Ojppb3N0cmVhbXM6OmZpbGVfZGVzY3JpcHRvciBmZDsgZmQuY2xvc2UoKTtdKQorXSkjIEJPT1NUX0lPU1RSRUFNUworCisKKyMgQk9PU1RfSEFTSCgpCisjIC0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5GdW5jdGlvbmFsL0hhc2gKK0JPT1NUX0RFRlVOKFtIYXNoXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvZnVuY3Rpb25hbC9oYXNoLmhwcF0pXSkKKworCisjIEJPT1NUX0xBTUJEQSgpCisjIC0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkxhbWJkYQorQk9PU1RfREVGVU4oW0xhbWJkYV0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L2xhbWJkYS9sYW1iZGEuaHBwXSldKQorCisKKyMgQk9PU1RfTE9DQUxFKCkKKyMgLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuTG9jYWxlCitCT09TVF9ERUZVTihbTG9jYWxlXSwKK1sKK2Jvb3N0X2xvY2FsZV9zYXZlX0xJQlM9JExJQlMKK2Jvb3N0X2xvY2FsZV9zYXZlX0xERkxBR1M9JExERkxBR1MKKyMgcmVxdWlyZSBTWVNURU0gZm9yIGJvb3N0LTEuNTAuMCBhbmQgdXAKK2lmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWdlIDE1MDsgdGhlbgorICBCT09TVF9TWVNURU0oWyQxXSkKKyAgbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX1NZU1RFTV8oTElCU3xMREZMQUdTKSRdKWRubAorICBMSUJTPSIkTElCUyAkQk9PU1RfU1lTVEVNX0xJQlMiCisgIExERkxBR1M9IiRMREZMQUdTICRCT09TVF9TWVNURU1fTERGTEFHUyIKK2ZpICMgZW5kIG9mIHRoZSBCb29zdC5TeXN0ZW0gY2hlY2suCitCT09TVF9GSU5EX0xJQihbbG9jYWxlXSwgWyQxXSwKKyAgICBbYm9vc3QvbG9jYWxlLmhwcF0sCisgICAgW1tib29zdDo6bG9jYWxlOjpnZW5lcmF0b3IgZ2VuOyBzdGQ6OmxvY2FsZTo6Z2xvYmFsKGdlbigiIikpO11dKQorTElCUz0kYm9vc3RfbG9jYWxlX3NhdmVfTElCUworTERGTEFHUz0kYm9vc3RfbG9jYWxlX3NhdmVfTERGTEFHUworXSkjIEJPT1NUX0xPQ0FMRQorCisjIEJPT1NUX0xPRyhbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkxvZy4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbTG9nXSwKK1tib29zdF9sb2dfc2F2ZV9MSUJTPSRMSUJTCitib29zdF9sb2dfc2F2ZV9MREZMQUdTPSRMREZMQUdTCitCT09TVF9TWVNURU0oWyQxXSkKK0JPT1NUX0ZJTEVTWVNURU0oWyQxXSkKK0JPT1NUX0RBVEVfVElNRShbJDFdKQorbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUXyhTWVNURU18RklMRVNZU1RFTXxEQVRFX1RJTUUpXyhMSUJTfExERkxBR1MpJF0pZG5sCitMSUJTPSIkTElCUyAkQk9PU1RfREFURV9USU1FX0xJQlMgJEJPT1NUX0ZJTEVTWVNURU1fTElCUyAkQk9PU1RfU1lTVEVNX0xJQlMiCitMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfREFURV9USU1FX0xERkxBR1MgJEJPT1NUX0ZJTEVTWVNURU1fTERGTEFHUyAkQk9PU1RfU1lTVEVNX0xERkxBR1MiCitCT09TVF9GSU5EX0xJQihbbG9nXSwgWyQxXSwKKyAgICBbYm9vc3QvbG9nL2NvcmUvY29yZS5ocHBdLAorICAgIFtib29zdDo6bG9nOjphdHRyaWJ1dGUgYTsgYS5nZXRfdmFsdWUoKTtdKQorTElCUz0kYm9vc3RfbG9nX3NhdmVfTElCUworTERGTEFHUz0kYm9vc3RfbG9nX3NhdmVfTERGTEFHUworXSkjIEJPT1NUX0xPRworCisKKyMgQk9PU1RfTE9HX1NFVFVQKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuTG9nLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsIHNlZSB0aGUKKyMgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4KK0JPT1NUX0RFRlVOKFtMb2dfU2V0dXBdLAorW2Jvb3N0X2xvZ19zZXR1cF9zYXZlX0xJQlM9JExJQlMKK2Jvb3N0X2xvZ19zZXR1cF9zYXZlX0xERkxBR1M9JExERkxBR1MKK0JPT1NUX0xPRyhbJDFdKQorbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX0xPR18oTElCU3xMREZMQUdTKSRdKWRubAorTElCUz0iJExJQlMgJEJPT1NUX0xPR19MSUJTIgorTERGTEFHUz0iJExERkxBR1MgJEJPT1NUX0xPR19MREZMQUdTIgorQk9PU1RfRklORF9MSUIoW2xvZ19zZXR1cF0sIFskMV0sCisgICAgW2Jvb3N0L2xvZy91dGlsaXR5L3NldHVwL2Zyb21fc2V0dGluZ3MuaHBwXSwKKyAgICBbYm9vc3Q6OmxvZzo6YmFzaWNfc2V0dGluZ3M8Y2hhcj4gYnM7IGJzLmVtcHR5KCk7XSkKK0xJQlM9JGJvb3N0X2xvZ19zZXR1cF9zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X2xvZ19zZXR1cF9zYXZlX0xERkxBR1MKK10pIyBCT09TVF9MT0dfU0VUVVAKKworCisjIEJPT1NUX01BVEgoKQorIyAtLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuTWF0aAorIyBUT0RPOiBUaGlzIGxpYnJhcnkgaXNuJ3QgaGVhZGVyLW9ubHkgYnV0IGl0IGNvbWVzIGluIG11bHRpcGxlIGRpZmZlcmVudAorIyBmbGF2b3JzIHRoYXQgZG9uJ3QgcGxheSB3ZWxsIHdpdGggQk9PU1RfRklORF9MSUIgKGUuZywgbGliYm9vc3RfbWF0aF9jOTksCisjIGxpYmJvb3N0X21hdGhfYzk5ZiwgbGliYm9vc3RfbWF0aF9jOTlsLCBsaWJib29zdF9tYXRoX3RyMSwKKyMgbGliYm9vc3RfbWF0aF90cjFmLCBsaWJib29zdF9tYXRoX3RyMWwpLiAgVGhpcyBtYWNybyBtdXN0IGJlIGZpeGVkIHRvIGRvIHRoZQorIyByaWdodCB0aGluZyBhbnl3YXkuCitCT09TVF9ERUZVTihbTWF0aF0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L21hdGgvc3BlY2lhbF9mdW5jdGlvbnMuaHBwXSldKQorCisKKyMgQk9PU1RfTVBJKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdCBNUEkuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLiAgVXNlcyBNUElDWFggdmFyaWFibGUgaWYgaXQgaXMKKyMgc2V0LCBvdGhlcndpc2UgdHJpZXMgQ1hYCisjCitCT09TVF9ERUZVTihbTVBJXSwKK1tib29zdF9zYXZlX0NYWD0ke0NYWH0KK2Jvb3N0X3NhdmVfQ1hYQ1BQPSR7Q1hYQ1BQfQoraWYgdGVzdCB4IiR7TVBJQ1hYfSIgIT0geDsgdGhlbgorICBDWFg9JHtNUElDWFh9CisgIENYWENQUD0iJHtNUElDWFh9IC1FIgorZmkKK0JPT1NUX0ZJTkRfTElCKFttcGldLCBbJDFdLAorICAgICAgICAgICAgICAgW2Jvb3N0L21waS5ocHBdLAorICAgICAgICAgICAgICAgW2ludCBhcmdjID0gMDsKKyAgICAgICAgICAgICAgICBjaGFyICoqYXJndiA9IDA7CisgICAgICAgICAgICAgICAgYm9vc3Q6Om1waTo6ZW52aXJvbm1lbnQgZW52KGFyZ2MsYXJndik7XSkKK0NYWD0ke2Jvb3N0X3NhdmVfQ1hYfQorQ1hYQ1BQPSR7Ym9vc3Rfc2F2ZV9DWFhDUFB9CitdKSMgQk9PU1RfTVBJCisKKworIyBCT09TVF9NVUxUSUFSUkFZKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0Lk11bHRpQXJyYXkKK0JPT1NUX0RFRlVOKFtNdWx0aUFycmF5XSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvbXVsdGlfYXJyYXkuaHBwXSldKQorCisKKyMgQk9PU1RfTlVNRVJJQ19VQkxBUygpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0Lk51bWVyaWNVYmxhcyAoQmFzaWMgTGluZWFyIEFsZ2VicmEpCitCT09TVF9ERUZVTihbTnVtZXJpY19VYmxhc10sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L251bWVyaWMvdWJsYXMvdmVjdG9yLmhwcF0pCitdKSMgQk9PU1RfTlVNRVJJQ19VQkxBUworCisKKyMgQk9PU1RfTlVNRVJJQ19DT05WRVJTSU9OKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuTnVtZXJpY0NvbnZlcnNpb24gKHBvbGljeS1iYXNlZCBudW1lcmljIGNvbnZlcnNpb24pCitCT09TVF9ERUZVTihbTnVtZXJpY19Db252ZXJzaW9uXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvbnVtZXJpYy9jb252ZXJzaW9uL2NvbnZlcnRlci5ocHBdKQorXSkjIEJPT1NUX05VTUVSSUNfQ09OVkVSU0lPTgorCisKKyMgQk9PU1RfT1BUSU9OQUwoKQorIyAtLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0Lk9wdGlvbmFsCitCT09TVF9ERUZVTihbT3B0aW9uYWxdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9vcHRpb25hbC5ocHBdKV0pCisKKworIyBCT09TVF9QUkVQUk9DRVNTT1IoKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5QcmVwcm9jZXNzb3IKK0JPT1NUX0RFRlVOKFtQcmVwcm9jZXNzb3JdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9wcmVwcm9jZXNzb3IvcmVwZWF0LmhwcF0pXSkKKworCisjIEJPT1NUX1JBTkdFKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuUmFuZ2UKK0JPT1NUX0RFRlVOKFtSYW5nZV0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3JhbmdlL2FkYXB0b3JzLmhwcF0pXSkKKworIyBCT09TVF9VTk9SREVSRUQoKQorIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5Vbm9yZGVyZWQKK0JPT1NUX0RFRlVOKFtVbm9yZGVyZWRdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC91bm9yZGVyZWRfbWFwLmhwcF0pXSkKKworCisjIEJPT1NUX1VVSUQoKQorIyAtLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuVXVpZAorQk9PU1RfREVGVU4oW1V1aWRdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC91dWlkL3V1aWQuaHBwXSldKQorCisKKyMgQk9PU1RfUFJPR1JBTV9PUFRJT05TKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuUHJvZ3JhbV9vcHRpb25zLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsCisjIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4KK0JPT1NUX0RFRlVOKFtQcm9ncmFtX09wdGlvbnNdLAorW0JPT1NUX0ZJTkRfTElCKFtwcm9ncmFtX29wdGlvbnNdLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9wcm9ncmFtX29wdGlvbnMuaHBwXSwKKyAgICAgICAgICAgICAgICBbYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6b3B0aW9uc19kZXNjcmlwdGlvbiBkKCJ0ZXN0Iik7XSkKK10pIyBCT09TVF9QUk9HUkFNX09QVElPTlMKKworCisKKyMgX0JPT1NUX1BZVEhPTl9DT05GSUcoVkFSSUFCTEUsIEZMQUcpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTYXZlIFZBUklBQkxFLCBhbmQgZGVmaW5lIGl0IHZpYSBgcHl0aG9uLWNvbmZpZyAtLUZMQUdgLgorIyBTdWJzdGl0dXRlIEJPT1NUX1BZVEhPTl9WQVJJQUJMRS4KK200X2RlZmluZShbX0JPT1NUX1BZVEhPTl9DT05GSUddLAorW0FDX1NVQlNUKFtCT09TVF9QWVRIT05fJDFdLAorICAgICAgICAgIFtgcHl0aG9uLWNvbmZpZyAtLSQyIDI+L2Rldi9udWxsYF0pZG5sCitib29zdF9weXRob25fc2F2ZV8kMT0kJDEKKyQxPSIkJDEgJEJPT1NUX1BZVEhPTl8kMSJdKQorCisKKyMgQk9PU1RfUFlUSE9OKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuUHl0aG9uLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsCisjIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4KK0JPT1NUX0RFRlVOKFtQeXRob25dLAorW19CT09TVF9QWVRIT05fQ09ORklHKFtDUFBGTEFHU10sIFtpbmNsdWRlc10pCitfQk9PU1RfUFlUSE9OX0NPTkZJRyhbTERGTEFHU10sICAgW2xkZmxhZ3NdKQorX0JPT1NUX1BZVEhPTl9DT05GSUcoW0xJQlNdLCAgICAgIFtsaWJzXSkKK200X3BhdHRlcm5fYWxsb3coW15CT09TVF9QWVRIT05fTU9EVUxFJF0pZG5sCitCT09TVF9GSU5EX0xJQlMoW3B5dGhvbl0sIFtweXRob24gcHl0aG9uM10sIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L3B5dGhvbi5ocHBdLAorICAgICAgICAgICAgICAgIFtdLCBbQk9PU1RfUFlUSE9OX01PRFVMRShlbXB0eSkge31dKQorQ1BQRkxBR1M9JGJvb3N0X3B5dGhvbl9zYXZlX0NQUEZMQUdTCitMREZMQUdTPSRib29zdF9weXRob25fc2F2ZV9MREZMQUdTCitMSUJTPSRib29zdF9weXRob25fc2F2ZV9MSUJTCitdKSMgQk9PU1RfUFlUSE9OCisKKworIyBCT09TVF9SRUYoKQorIyAtLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5SZWYKK0JPT1NUX0RFRlVOKFtSZWZdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9yZWYuaHBwXSldKQorCisKKyMgQk9PU1RfUkVHRVgoW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlJlZ2V4LiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsIHNlZSB0aGUKKyMgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4KK0JPT1NUX0RFRlVOKFtSZWdleF0sCitbQk9PU1RfRklORF9MSUIoW3JlZ2V4XSwgWyQxXSwKKyAgICAgICAgICAgICAgICBbYm9vc3QvcmVnZXguaHBwXSwKKyAgICAgICAgICAgICAgICBbYm9vc3Q6OnJlZ2V4IGV4cCgiKiIpOyBib29zdDo6cmVnZXhfbWF0Y2goImZvbyIsIGV4cCk7XSkKK10pIyBCT09TVF9SRUdFWAorCisKKyMgQk9PU1RfU0VSSUFMSVpBVElPTihbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5TZXJpYWxpemF0aW9uLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsIHNlZQorIyB0aGUgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4KK0JPT1NUX0RFRlVOKFtTZXJpYWxpemF0aW9uXSwKK1tCT09TVF9GSU5EX0xJQihbc2VyaWFsaXphdGlvbl0sIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L2FyY2hpdmUvdGV4dF9vYXJjaGl2ZS5ocHBdLAorICAgICAgICAgICAgICAgIFtzdGQ6Om9zdHJlYW0qIG8gPSAwOyAvLyBDaGVhcCB3YXkgdG8gZ2V0IGFuIG9zdHJlYW0uLi4KKyAgICAgICAgICAgICAgICBib29zdDo6YXJjaGl2ZTo6dGV4dF9vYXJjaGl2ZSB0KCpvKTtdKQorXSkjIEJPT1NUX1NFUklBTElaQVRJT04KKworCisjIEJPT1NUX1NJR05BTFMoW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuU2lnbmFscy4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbU2lnbmFsc10sCitbQk9PU1RfRklORF9MSUIoW3NpZ25hbHNdLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9zaWduYWwuaHBwXSwKKyAgICAgICAgICAgICAgICBbYm9vc3Q6OnNpZ25hbDx2b2lkICgpPiBzO10pCitdKSMgQk9PU1RfU0lHTkFMUworCisKKyMgQk9PU1RfU0lHTkFMUzIoKQorIyAtLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlNpZ25hbHMyIChuZXcgc2luY2UgMS4zOS4wKS4KK0JPT1NUX0RFRlVOKFtTaWduYWxzMl0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3NpZ25hbHMyLmhwcF0pCitdKSMgQk9PU1RfU0lHTkFMUzIKKworCisjIEJPT1NUX1NNQVJUX1BUUigpCisjIC0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlNtYXJ0UHRyCitCT09TVF9ERUZVTihbU21hcnRfUHRyXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3Qvc2NvcGVkX3B0ci5ocHBdKQorQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3NoYXJlZF9wdHIuaHBwXSkKK10pCisKKworIyBCT09TVF9TVEFUSUNBU1NFUlQoKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5TdGF0aWNBc3NlcnQKK0JPT1NUX0RFRlVOKFtTdGF0aWNBc3NlcnRdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9zdGF0aWNfYXNzZXJ0LmhwcF0pXSkKKworCisjIEJPT1NUX1NUUklOR19BTEdPKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5TdHJpbmdBbGdvCitCT09TVF9ERUZVTihbU3RyaW5nX0FsZ29dLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9hbGdvcml0aG0vc3RyaW5nLmhwcF0pCitdKQorCisKKyMgQk9PU1RfU1lTVEVNKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuU3lzdGVtLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsIHNlZSB0aGUKKyMgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4gIFRoaXMgbGlicmFyeSB3YXMgaW50cm9kdWNlZCBpbiBCb29zdAorIyAxLjM1LjAuCitCT09TVF9ERUZVTihbU3lzdGVtXSwKK1tCT09TVF9GSU5EX0xJQihbc3lzdGVtXSwgWyQxXSwKKyAgICAgICAgICAgICAgICBbYm9vc3Qvc3lzdGVtL2Vycm9yX2NvZGUuaHBwXSwKKyAgICAgICAgICAgICAgICBbYm9vc3Q6OnN5c3RlbTo6ZXJyb3JfY29kZSBlOyBlLmNsZWFyKCk7XSkKK10pIyBCT09TVF9TWVNURU0KKworCisjIEJPT1NUX1RFU1QoW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuVGVzdC4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbVGVzdF0sCitbbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX0NIRUNLJF0pZG5sCitCT09TVF9GSU5EX0xJQihbdW5pdF90ZXN0X2ZyYW1ld29ya10sIFskMV0sCisgICAgICAgICAgICAgICBbYm9vc3QvdGVzdC91bml0X3Rlc3QuaHBwXSwgW0JPT1NUX0NIRUNLKDIgPT0gMik7XSwKKyAgICAgICAgICAgICAgIFt1c2luZyBib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlOworICAgICAgICAgICAgICAgdGVzdF9zdWl0ZSogaW5pdF91bml0X3Rlc3Rfc3VpdGUoaW50IGFyZ2MsIGNoYXIgKiogYXJndikKKyAgICAgICAgICAgICAgIHsgcmV0dXJuIE5VTEw7IH1dKQorXSkjIEJPT1NUX1RFU1QKKworCisjIEJPT1NUX1RIUkVBRChbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5UaHJlYWQuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW1RocmVhZF0sCitbZG5sIEhhdmluZyB0aGUgcHRocmVhZCBmbGFnIGlzIHJlcXVpcmVkIGF0IGxlYXN0IG9uIEdDQzMgd2hlcmUKK2RubCBib29zdC90aHJlYWQuaHBwIHdvdWxkIGNvbXBsYWluIGlmIHdlIHRyeSB0byBjb21waWxlIHdpdGhvdXQKK2RubCAtcHRocmVhZCBvbiBHTlUvTGludXguCitBQ19SRVFVSVJFKFtfQk9PU1RfUFRIUkVBRF9GTEFHXSlkbmwKK2Jvb3N0X3RocmVhZF9zYXZlX0xJQlM9JExJQlMKK2Jvb3N0X3RocmVhZF9zYXZlX0xERkxBR1M9JExERkxBR1MKK2Jvb3N0X3RocmVhZF9zYXZlX0NQUEZMQUdTPSRDUFBGTEFHUworIyBMaW5rLXRpbWUgZGVwZW5kZW5jeSBmcm9tIHRocmVhZCB0byBzeXN0ZW0gd2FzIGFkZGVkIGFzIG9mIDEuNDkuMC4KK2lmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWdlIDE0OTsgdGhlbgorQk9PU1RfU1lTVEVNKFskMV0pCitmaSAjIGVuZCBvZiB0aGUgQm9vc3QuU3lzdGVtIGNoZWNrLgorbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX1NZU1RFTV8oTElCU3xMREZMQUdTKSRdKWRubAorTElCUz0iJExJQlMgJEJPT1NUX1NZU1RFTV9MSUJTICRib29zdF9jdl9wdGhyZWFkX2ZsYWciCitMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfU1lTVEVNX0xERkxBR1MiCitDUFBGTEFHUz0iJENQUEZMQUdTICRib29zdF9jdl9wdGhyZWFkX2ZsYWciCisKKyMgV2hlbiBjb21waWxpbmcgZm9yIHRoZSBXaW5kb3dzIHBsYXRmb3JtLCB0aGUgdGhyZWFkcyBsaWJyYXJ5IGlzIG5hbWVkCisjIGRpZmZlcmVudGx5LiAgVGhpcyBzdWZmaXggZG9lc24ndCBleGlzdCBpbiBuZXcgdmVyc2lvbnMgb2YgQm9vc3QsIG9yCisjIHBvc3NpYmx5IG5ldyB2ZXJzaW9ucyBvZiBHQ0Mgb24gbWluZ3cgSSBhbSBhc3N1bWluZyBpdCdzIEJvb3N0J3MgY2hhbmdlIGZvcgorIyBub3cgYW5kIEkgYW0gc2V0dGluZyB2ZXJzaW9uIHRvIDEuNDgsIGZvciBsYWNrIG9mIGtub3dsZWRnZSBhcyB0byB3aGVuIHRoaXMKKyMgY2hhbmdlIG9jY3VycmVkLgoraWYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtbHQgMTQ4OyB0aGVuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAoKm1pbmd3KikgYm9vc3RfdGhyZWFkX2xpYl9leHQ9X3dpbjMyOzsKKyAgZXNhYworZmkKK0JPT1NUX0ZJTkRfTElCUyhbdGhyZWFkXSwgW3RocmVhZCRib29zdF90aHJlYWRfbGliX2V4dF0sCisgICAgICAgICAgICAgICAgWyQxXSwKKyAgICAgICAgICAgICAgICBbYm9vc3QvdGhyZWFkLmhwcF0sIFtib29zdDo6dGhyZWFkIHQ7IGJvb3N0OjptdXRleCBtO10pCisKK2Nhc2UgJGhvc3Rfb3MgaW4KKyAgKCptaW5ndyopIGJvb3N0X3RocmVhZF93MzJfc29ja2V0X2xpbms9LWx3czJfMzI7OworZXNhYworCitCT09TVF9USFJFQURfTElCUz0iJEJPT1NUX1RIUkVBRF9MSUJTICRCT09TVF9TWVNURU1fTElCUyAkYm9vc3RfY3ZfcHRocmVhZF9mbGFnICRib29zdF90aHJlYWRfdzMyX3NvY2tldF9saW5rIgorQk9PU1RfVEhSRUFEX0xERkxBR1M9IiRCT09TVF9TWVNURU1fTERGTEFHUyIKK0JPT1NUX0NQUEZMQUdTPSIkQk9PU1RfQ1BQRkxBR1MgJGJvb3N0X2N2X3B0aHJlYWRfZmxhZyIKK0xJQlM9JGJvb3N0X3RocmVhZF9zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X3RocmVhZF9zYXZlX0xERkxBR1MKK0NQUEZMQUdTPSRib29zdF90aHJlYWRfc2F2ZV9DUFBGTEFHUworXSkjIEJPT1NUX1RIUkVBRAorCitBVV9BTElBUyhbQk9PU1RfVEhSRUFEU10sIFtCT09TVF9USFJFQURdKQorCisKKyMgQk9PU1RfVE9LRU5JWkVSKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuVG9rZW5pemVyCitCT09TVF9ERUZVTihbVG9rZW5pemVyXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvdG9rZW5pemVyLmhwcF0pXSkKKworCisjIEJPT1NUX1RSSUJPT0woKQorIyAtLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuVHJpYm9vbAorQk9PU1RfREVGVU4oW1RyaWJvb2xdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9sb2dpYy90cmlib29sX2Z3ZC5ocHBdKQorQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L2xvZ2ljL3RyaWJvb2wuaHBwXSkKK10pCisKKworIyBCT09TVF9UVVBMRSgpCisjIC0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuVHVwbGUKK0JPT1NUX0RFRlVOKFtUdXBsZV0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3R1cGxlL3R1cGxlLmhwcF0pXSkKKworCisjIEJPT1NUX1RZUEVUUkFJVFMoKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5UeXBlVHJhaXRzCitCT09TVF9ERUZVTihbVHlwZVRyYWl0c10sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3R5cGVfdHJhaXRzLmhwcF0pXSkKKworCisjIEJPT1NUX1VUSUxJVFkoKQorIyAtLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuVXRpbGl0eSAobm9uY29weWFibGUsIHJlc3VsdF9vZiwgYmFzZS1mcm9tLW1lbWJlciBpZGlvbSwKKyMgZXRjLikKK0JPT1NUX0RFRlVOKFtVdGlsaXR5XSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvdXRpbGl0eS5ocHBdKV0pCisKKworIyBCT09TVF9WQVJJQU5UKCkKKyMgLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlZhcmlhbnQuCitCT09TVF9ERUZVTihbVmFyaWFudF0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3ZhcmlhbnQvdmFyaWFudF9md2QuaHBwXSkKK0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC92YXJpYW50LmhwcF0pXSkKKworCisjIEJPT1NUX1BPSU5URVJfQ09OVEFJTkVSKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlBvaW50ZXJDb250YWluZXIKK0JPT1NUX0RFRlVOKFtQb2ludGVyX0NvbnRhaW5lcl0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3B0cl9jb250YWluZXIvcHRyX2RlcXVlLmhwcF0pCitCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvcHRyX2NvbnRhaW5lci9wdHJfbGlzdC5ocHBdKQorQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3B0cl9jb250YWluZXIvcHRyX3ZlY3Rvci5ocHBdKQorQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3B0cl9jb250YWluZXIvcHRyX2FycmF5LmhwcF0pCitCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvcHRyX2NvbnRhaW5lci9wdHJfc2V0LmhwcF0pCitCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvcHRyX2NvbnRhaW5lci9wdHJfbWFwLmhwcF0pCitdKSMgQk9PU1RfUE9JTlRFUl9DT05UQUlORVIKKworCisjIEJPT1NUX1dBVkUoW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTk9URTogSWYgeW91IGludGVuZCB0byB1c2UgV2F2ZS9TcGlyaXQgd2l0aCB0aHJlYWQgc3VwcG9ydCwgbWFrZSBzdXJlIHlvdQorIyBjYWxsIEJPT1NUX1RIUkVBRCBmaXJzdC4KKyMgTG9vayBmb3IgQm9vc3QuV2F2ZS4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbV2F2ZV0sCitbQUNfUkVRVUlSRShbQk9PU1RfRklMRVNZU1RFTV0pZG5sCitBQ19SRVFVSVJFKFtCT09TVF9EQVRFX1RJTUVdKWRubAorYm9vc3Rfd2F2ZV9zYXZlX0xJQlM9JExJQlMKK2Jvb3N0X3dhdmVfc2F2ZV9MREZMQUdTPSRMREZMQUdTCittNF9wYXR0ZXJuX2FsbG93KFteQk9PU1RfKChGSUxFKT9TWVNURU18REFURV9USU1FfFRIUkVBRClfKExJQlN8TERGTEFHUykkXSlkbmwKK0xJQlM9IiRMSUJTICRCT09TVF9TWVNURU1fTElCUyAkQk9PU1RfRklMRVNZU1RFTV9MSUJTICRCT09TVF9EQVRFX1RJTUVfTElCUyBcCiskQk9PU1RfVEhSRUFEX0xJQlMiCitMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfU1lTVEVNX0xERkxBR1MgJEJPT1NUX0ZJTEVTWVNURU1fTERGTEFHUyBcCiskQk9PU1RfREFURV9USU1FX0xERkxBR1MgJEJPT1NUX1RIUkVBRF9MREZMQUdTIgorQk9PU1RfRklORF9MSUIoW3dhdmVdLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC93YXZlLmhwcF0sCisgICAgICAgICAgICAgICAgW2Jvb3N0Ojp3YXZlOjp0b2tlbl9pZCBpZDsgZ2V0X3Rva2VuX25hbWUoaWQpO10pCitMSUJTPSRib29zdF93YXZlX3NhdmVfTElCUworTERGTEFHUz0kYm9vc3Rfd2F2ZV9zYXZlX0xERkxBR1MKK10pIyBCT09TVF9XQVZFCisKKworIyBCT09TVF9YUFJFU1NJVkUoKQorIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5YcHJlc3NpdmUgKG5ldyBzaW5jZSAxLjM2LjApLgorQk9PU1RfREVGVU4oW1hwcmVzc2l2ZV0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3hwcmVzc2l2ZS94cHJlc3NpdmUuaHBwXSldKQorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0gIworIyBJbnRlcm5hbCBoZWxwZXJzLiAjCisjIC0tLS0tLS0tLS0tLS0tLS0tICMKKworCisjIF9CT09TVF9QVEhSRUFEX0ZMQUcoKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSW50ZXJuYWwgaGVscGVyIGZvciBCT09TVF9USFJFQUQuICBDb21wdXRlcyBib29zdF9jdl9wdGhyZWFkX2ZsYWcKKyMgd2hpY2ggbXVzdCBiZSB1c2VkIGluIENQUEZMQUdTIGFuZCBMSUJTLgorIworIyBZZXMsIHdlICpuZWVkKiB0byBwdXQgdGhlIC1wdGhyZWFkIHRoaW5nIGluIENQUEZMQUdTIGJlY2F1c2Ugd2l0aCBHQ0MzLAorIyBib29zdC90aHJlYWQuaHBwIHdpbGwgdHJpZ2dlciBhICNlcnJvciBpZiAtcHRocmVhZCBpc24ndCB1c2VkOgorIyAgIGJvb3N0L2NvbmZpZy9yZXF1aXJlc190aHJlYWRzLmhwcDo0Nzo1OiAjZXJyb3IgIkNvbXBpbGVyIHRocmVhZGluZyBzdXBwb3J0CisjICAgaXMgbm90IHR1cm5lZCBvbi4gUGxlYXNlIHNldCB0aGUgY29ycmVjdCBjb21tYW5kIGxpbmUgb3B0aW9ucyBmb3IKKyMgICB0aHJlYWRpbmc6IC1wdGhyZWFkIChMaW51eCksIC1wdGhyZWFkcyAoU29sYXJpcykgb3IgLW10aHJlYWRzIChNaW5ndzMyKSIKKyMKKyMgQmFzZWQgb24gQUNYX1BUSFJFQUQ6IGh0dHA6Ly9hdXRvY29uZi1hcmNoaXZlLmNyeXAudG8vYWN4X3B0aHJlYWQuaHRtbAorQUNfREVGVU4oW19CT09TVF9QVEhSRUFEX0ZMQUddLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfQ1hYXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK0FDX0xBTkdfUFVTSChbQysrXSlkbmwKK0FDX0NBQ0hFX0NIRUNLKFtmb3IgdGhlIGZsYWdzIG5lZWRlZCB0byB1c2UgcHRocmVhZHNdLCBbYm9vc3RfY3ZfcHRocmVhZF9mbGFnXSwKK1sgYm9vc3RfY3ZfcHRocmVhZF9mbGFnPQorICAjIFRoZSBvcmRlcmluZyAqaXMqIChzb21ldGltZXMpIGltcG9ydGFudC4gIFNvbWUgbm90ZXMgb24gdGhlCisgICMgaW5kaXZpZHVhbCBpdGVtcyBmb2xsb3c6CisgICMgKG5vbmUpOiBpbiBjYXNlIHRocmVhZHMgYXJlIGluIGxpYmM7IHNob3VsZCBiZSB0cmllZCBiZWZvcmUgLUt0aHJlYWQgYW5kCisgICMgICAgICAgb3RoZXIgY29tcGlsZXIgZmxhZ3MgdG8gcHJldmVudCBjb250aW51YWwgY29tcGlsZXIgd2FybmluZ3MKKyAgIyAtbHB0aHJlYWRzOiBBSVggKG11c3QgY2hlY2sgdGhpcyBiZWZvcmUgLWxwdGhyZWFkKQorICAjIC1LdGhyZWFkOiBTZXF1ZW50ICh0aHJlYWRzIGluIGxpYmMsIGJ1dCAtS3RocmVhZCBuZWVkZWQgZm9yIHB0aHJlYWQuaCkKKyAgIyAta3RocmVhZDogRnJlZUJTRCBrZXJuZWwgdGhyZWFkcyAocHJlZmVycmVkIHRvIC1wdGhyZWFkIHNpbmNlIFNNUC1hYmxlKQorICAjIC1sbHRocmVhZDogTGludXhUaHJlYWRzIHBvcnQgb24gRnJlZUJTRCAoYWxzbyBwcmVmZXJyZWQgdG8gLXB0aHJlYWQpCisgICMgLXB0aHJlYWQ6IEdOVSBMaW51eC9HQ0MgKGtlcm5lbCB0aHJlYWRzKSwgQlNEL0dDQyAodXNlcmxhbmQgdGhyZWFkcykKKyAgIyAtcHRocmVhZHM6IFNvbGFyaXMvR0NDCisgICMgLW10aHJlYWRzOiBNaW5HVzMyL0dDQywgTHlueC9HQ0MKKyAgIyAtbXQ6IFN1biBXb3Jrc2hvcCBDIChtYXkgb25seSBsaW5rIFN1bk9TIHRocmVhZHMgWy1sdGhyZWFkXSwgYnV0IGl0CisgICMgICAgICBkb2Vzbid0IGh1cnQgdG8gY2hlY2sgc2luY2UgdGhpcyBzb21ldGltZXMgZGVmaW5lcyBwdGhyZWFkcyB0b287CisgICMgICAgICBhbHNvIGRlZmluZXMgLURfUkVFTlRSQU5UKQorICAjICAgICAgLi4uIC1tdCBpcyBhbHNvIHRoZSBwdGhyZWFkcyBmbGFnIGZvciBIUC9hQ0MKKyAgIyAtbHB0aHJlYWQ6IEdOVSBMaW51eCwgZXRjLgorICAjIC0tdGhyZWFkLXNhZmU6IEtBSSBDKysKKyAgY2FzZSAkaG9zdF9vcyBpbiAjKAorICAgICpzb2xhcmlzKikKKyAgICAgICMgT24gU29sYXJpcyAoYXQgbGVhc3QsIGZvciBzb21lIHZlcnNpb25zKSwgbGliYyBjb250YWlucyBzdHViYmVkCisgICAgICAjIChub24tZnVuY3Rpb25hbCkgdmVyc2lvbnMgb2YgdGhlIHB0aHJlYWRzIHJvdXRpbmVzLCBzbyBsaW5rLWJhc2VkCisgICAgICAjIHRlc3RzIHdpbGwgZXJyb25lb3VzbHkgc3VjY2VlZC4gIChXZSBuZWVkIHRvIGxpbmsgd2l0aCAtcHRocmVhZHMvLW10LworICAgICAgIyAtbHB0aHJlYWQuKSAgKFRoZSBzdHVicyBhcmUgbWlzc2luZyBwdGhyZWFkX2NsZWFudXBfcHVzaCwgb3IgcmF0aGVyCisgICAgICAjIGEgZnVuY3Rpb24gY2FsbGVkIGJ5IHRoaXMgbWFjcm8sIHNvIHdlIGNvdWxkIGNoZWNrIGZvciB0aGF0LCBidXQKKyAgICAgICMgd2hvIGtub3dzIHdoZXRoZXIgdGhleSdsbCBzdHViIHRoYXQgdG9vIGluIGEgZnV0dXJlIGxpYmMuKSAgU28sCisgICAgICAjIHdlJ2xsIGp1c3QgbG9vayBmb3IgLXB0aHJlYWRzIGFuZCAtbHB0aHJlYWQgZmlyc3Q6CisgICAgICBib29zdF9wdGhyZWFkX2ZsYWdzPSItcHRocmVhZHMgLWxwdGhyZWFkIC1tdCAtcHRocmVhZCI7OyAjKAorICAgICopCisgICAgICBib29zdF9wdGhyZWFkX2ZsYWdzPSItbHB0aHJlYWRzIC1LdGhyZWFkIC1rdGhyZWFkIC1sbHRocmVhZCAtcHRocmVhZCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAtcHRocmVhZHMgLW10aHJlYWRzIC1scHRocmVhZCAtLXRocmVhZC1zYWZlIC1tdCI7OworICBlc2FjCisgICMgR2VuZXJhdGUgdGhlIHRlc3QgZmlsZS4KKyAgQUNfTEFOR19DT05GVEVTVChbQUNfTEFOR19QUk9HUkFNKFsjaW5jbHVkZSA8cHRocmVhZC5oPl0sCisgICAgW3B0aHJlYWRfdCB0aDsgcHRocmVhZF9qb2luKHRoLCAwKTsKKyAgICBwdGhyZWFkX2F0dHJfaW5pdCgwKTsgcHRocmVhZF9jbGVhbnVwX3B1c2goMCwgMCk7CisgICAgcHRocmVhZF9jcmVhdGUoMCwwLDAsMCk7IHB0aHJlYWRfY2xlYW51cF9wb3AoMCk7XSldKQorICBmb3IgYm9vc3RfcHRocmVhZF9mbGFnIGluICcnICRib29zdF9wdGhyZWFkX2ZsYWdzOyBkbworICAgIGJvb3N0X3B0aHJlYWRfb2s9ZmFsc2UKK2RubCBSZS11c2UgdGhlIHRlc3QgZmlsZSBhbHJlYWR5IGdlbmVyYXRlZC4KKyAgICBib29zdF9wdGhyZWFkc19fc2F2ZV9MSUJTPSRMSUJTCisgICAgTElCUz0iJExJQlMgJGJvb3N0X3B0aHJlYWRfZmxhZyIKKyAgICBBQ19MSU5LX0lGRUxTRShbXSwKKyAgICAgIFtpZiBncmVwICIuKiRib29zdF9wdGhyZWFkX2ZsYWciIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgICAgICAgZWNobyAiVGhpcyBmbGFnIHNlZW1zIHRvIGhhdmUgdHJpZ2dlcmVkIHdhcm5pbmdzIiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgICAgZWxzZQorICAgICAgICAgYm9vc3RfcHRocmVhZF9vaz06OyBib29zdF9jdl9wdGhyZWFkX2ZsYWc9JGJvb3N0X3B0aHJlYWRfZmxhZworICAgICAgIGZpXSkKKyAgICBMSUJTPSRib29zdF9wdGhyZWFkc19fc2F2ZV9MSUJTCisgICAgJGJvb3N0X3B0aHJlYWRfb2sgJiYgYnJlYWsKKyAgZG9uZQorXSkKK0FDX0xBTkdfUE9QKFtDKytdKWRubAorXSkjIF9CT09TVF9QVEhSRUFEX0ZMQUcKKworCisjIF9CT09TVF9nY2NfdGVzdChNQUpPUiwgTUlOT1IpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEludGVybmFsIGhlbHBlciBmb3IgX0JPT1NUX0ZJTkRfQ09NUElMRVJfVEFHLgorbTRfZGVmaW5lKFtfQk9PU1RfZ2NjX3Rlc3RdLAorWyJkZWZpbmVkIF9fR05VQ19fICYmIF9fR05VQ19fID09ICQxICYmIF9fR05VQ19NSU5PUl9fID09ICQyICYmICFkZWZpbmVkIF9fSUNDIEAgZ2NjJDEkMiJdKWRubAorCisjIF9CT09TVF9taW5nd190ZXN0KE1BSk9SLCBNSU5PUikKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSW50ZXJuYWwgaGVscGVyIGZvciBfQk9PU1RfRklORF9DT01QSUxFUl9UQUcuCittNF9kZWZpbmUoW19CT09TVF9taW5nd190ZXN0XSwKK1siZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA9PSAkMSAmJiBfX0dOVUNfTUlOT1JfXyA9PSAkMiAmJiAhZGVmaW5lZCBfX0lDQyAmJiBcCisgIChkZWZpbmVkIFdJTjMyIHx8IGRlZmluZWQgV0lOTlQgfHwgZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX1dJTjMyIFwKKyAgICAgICAgIHx8IGRlZmluZWQgX19XSU4zMl9fIHx8IGRlZmluZWQgX19XSU5OVCB8fCBkZWZpbmVkIF9fV0lOTlRfXykgQCBtZ3ckMSQyIl0pZG5sCisKKworIyBfQk9PU1RfRklORF9DT01QSUxFUl9UQUcoKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBJbnRlcm5hbC4gIFdoZW4gQm9vc3QgaXMgaW5zdGFsbGVkIHdpdGhvdXQgLS1sYXlvdXQ9c3lzdGVtLCBlYWNoIGxpYnJhcnkKKyMgZmlsZW5hbWUgd2lsbCBob2xkIGEgc3VmZml4IHRoYXQgZW5jb2RlcyB0aGUgY29tcGlsZXIgdXNlZCBkdXJpbmcgdGhlCisjIGJ1aWxkLiAgVGhlIEJvb3N0IGJ1aWxkIHN5c3RlbSBzZWVtcyB0byBjYWxsIHRoaXMgYSBgdGFnJy4KK0FDX0RFRlVOKFtfQk9PU1RfRklORF9DT01QSUxFUl9UQUddLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfQ1hYXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK0FDX0NBQ0hFX0NIRUNLKFtmb3IgdGhlIHRvb2xzZXQgbmFtZSB1c2VkIGJ5IEJvb3N0IGZvciAkQ1hYXSwKKyAgICAgICAgICAgICAgIFtib29zdF9jdl9saWJfdGFnXSwKK1tib29zdF9jdl9saWJfdGFnPXVua25vd24KK2lmIHRlc3QgeCRib29zdF9jdl9pbmNfcGF0aCAhPSB4bm87IHRoZW4KKyAgQUNfTEFOR19QVVNIKFtDKytdKWRubAorICAjIFRoZSBmb2xsb3dpbmcgdGVzdHMgYXJlIG1vc3RseSBpbnNwaXJlZCBieSBib29zdC9jb25maWcvYXV0b19saW5rLmhwcAorICAjIFRoZSBsaXN0IGlzIHNvcnRlZCB0byBtb3N0IHJlY2VudC9jb21tb24gdG8gb2xkZXN0IGNvbXBpbGVyIChpbiBvcmRlcgorICAjIHRvIGluY3JlYXNlIHRoZSBsaWtlbGlob29kIG9mIGZpbmRpbmcgdGhlIHJpZ2h0IGNvbXBpbGVyIHdpdGggdGhlCisgICMgbGVhc3QgbnVtYmVyIG9mIGNvbXBpbGF0aW9uIGF0dGVtcHQpLgorICAjIEJld2FyZSB0aGF0IHNvbWUgdGVzdHMgYXJlIHNlbnNpYmxlIHRvIHRoZSBvcmRlciAoZm9yIGluc3RhbmNlLCB3ZSBtdXN0CisgICMgbG9vayBmb3IgTWluR1cgYmVmb3JlIGxvb2tpbmcgZm9yIEdDQzMpLgorICAjIEkgdXNlZCBvbmUgY29tcGlsYXRpb24gdGVzdCBwZXIgY29tcGlsZXIgd2l0aCBhICNlcnJvciB0byByZWNvZ25pemUKKyAgIyBlYWNoIGNvbXBpbGVyIHNvIHRoYXQgaXQgd29ya3MgZXZlbiB3aGVuIGNyb3NzLWNvbXBpbGluZyAobGV0IG1lIGtub3cKKyAgIyBpZiB5b3Uga25vdyBhIGJldHRlciBhcHByb2FjaCkuCisgICMgS25vd24gbWlzc2luZyB0YWdzIChrbm93biBmcm9tIEJvb3N0J3MgdG9vbHMvYnVpbGQvdjIvdG9vbHMvY29tbW9uLmphbSk6CisgICMgICBjb21vLCBlZGcsIGtjYywgYmNrLCBtcCwgc3csIHRydSwgeGxjCisgICMgSSdtIG5vdCBzdXJlIGFib3V0IG15IHRlc3QgZm9yIGBpbCcgKGJlIGNhcmVmdWw6IEludGVsJ3MgSUNDIHByZS1kZWZpbmVzCisgICMgdGhlIHNhbWUgZGVmaW5lcyBhcyBHQ0MncykuCisgIGZvciBpIGluIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg1LCAzKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDUsIDMpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg1LCAyKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDUsIDIpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg1LCAxKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDUsIDEpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg1LCAwKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDUsIDApIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCAxMCkgXAorICAgIF9CT09TVF9nY2NfdGVzdCg0LCAxMCkgXAorICAgIF9CT09TVF9taW5nd190ZXN0KDQsIDkpIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoNCwgOSkgXAorICAgIF9CT09TVF9taW5nd190ZXN0KDQsIDgpIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoNCwgOCkgXAorICAgIF9CT09TVF9taW5nd190ZXN0KDQsIDcpIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoNCwgNykgXAorICAgIF9CT09TVF9taW5nd190ZXN0KDQsIDYpIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoNCwgNikgXAorICAgIF9CT09TVF9taW5nd190ZXN0KDQsIDUpIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoNCwgNSkgXAorICAgIF9CT09TVF9taW5nd190ZXN0KDQsIDQpIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoNCwgNCkgXAorICAgIF9CT09TVF9taW5nd190ZXN0KDQsIDMpIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoNCwgMykgXAorICAgIF9CT09TVF9taW5nd190ZXN0KDQsIDIpIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoNCwgMikgXAorICAgIF9CT09TVF9taW5nd190ZXN0KDQsIDEpIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoNCwgMSkgXAorICAgIF9CT09TVF9taW5nd190ZXN0KDQsIDApIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoNCwgMCkgXAorICAgICJkZWZpbmVkIF9fR05VQ19fICYmIF9fR05VQ19fID09IDMgJiYgIWRlZmluZWQgX19JQ0MgXAorICAgICAmJiAoZGVmaW5lZCBXSU4zMiB8fCBkZWZpbmVkIFdJTk5UIHx8IGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMiBcCisgICAgICAgICB8fCBkZWZpbmVkIF9fV0lOMzJfXyB8fCBkZWZpbmVkIF9fV0lOTlQgfHwgZGVmaW5lZCBfX1dJTk5UX18pIEAgbWd3IiBcCisgICAgX0JPT1NUX2djY190ZXN0KDMsIDQpIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoMywgMykgXAorICAgICJkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSID49IDE1MDAgQCB2YzkwIiBcCisgICAgImRlZmluZWQgX01TQ19WRVIgJiYgX01TQ19WRVIgPT0gMTQwMCBAIHZjODAiIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoMywgMikgXAorICAgICJkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSID09IDEzMTAgQCB2YzcxIiBcCisgICAgX0JPT1NUX2djY190ZXN0KDMsIDEpIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoMywgMCkgXAorICAgICJkZWZpbmVkIF9fQk9STEFORENfXyBAIGJjYiIgXAorICAgICJkZWZpbmVkIF9fSUNDICYmIChkZWZpbmVkIF9fdW5peCB8fCBkZWZpbmVkIF9fdW5peF9fKSBAIGlsIiBcCisgICAgImRlZmluZWQgX19JQ0wgQCBpdyIgXAorICAgICJkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSID09IDEzMDAgQCB2YzciIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoMiwgOTUpIFwKKyAgICAiZGVmaW5lZCBfX01XRVJLU19fICYmIF9fTVdFUktTX18gPD0gMHgzMkZGIEAgY3c5IiBcCisgICAgImRlZmluZWQgX01TQ19WRVIgJiYgX01TQ19WRVIgPCAxMzAwICYmICFkZWZpbmVkIFVOREVSX0NFIEAgdmM2IiBcCisgICAgImRlZmluZWQgX01TQ19WRVIgJiYgX01TQ19WRVIgPCAxMzAwICYmIGRlZmluZWQgVU5ERVJfQ0UgQCBldmM0IiBcCisgICAgImRlZmluZWQgX19NV0VSS1NfXyAmJiBfX01XRVJLU19fIDw9IDB4MzFGRiBAIGN3OCIKKyAgZG8KKyAgICBib29zdF90YWdfdGVzdD1gZXhwciAiWCRpIiA6ICdYXChbW15AXV0qXCkgQCAnYAorICAgIGJvb3N0X3RhZz1gZXhwciAiWCRpIiA6ICdYW1teQF1dKiBAIFwoLipcKSdgCisgICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWworI2lmICRib29zdF90YWdfdGVzdAorLyogT0sgKi8KKyNlbHNlCisjIGVycm9yICRib29zdF90YWdfdGVzdAorI2VuZGlmCitdXSldLCBbYm9vc3RfY3ZfbGliX3RhZz0kYm9vc3RfdGFnOyBicmVha10sIFtdKQorICBkb25lCitBQ19MQU5HX1BPUChbQysrXSlkbmwKKyAgY2FzZSAkYm9vc3RfY3ZfbGliX3RhZyBpbiAjKAorICAgICMgU29tZSBuZXdlciAoPj0gMS4zNT8pIHZlcnNpb25zIG9mIEJvb3N0IHNlZW0gdG8gb25seSB1c2UgImdjYyIgYXMgb3Bwb3NlZAorICAgICMgdG8gImdjYzQxIiBmb3IgaW5zdGFuY2UuCisgICAgKi1nY2MgfCAqJy1nY2MgJykgOjs7ICMoICBEb24ndCByZS1hZGQgLWdjYzogaXQncyBhbHJlYWR5IGluIHRoZXJlLgorICAgIGdjYyopCisgICAgICBib29zdF90YWdfeD0KKyAgICAgIGNhc2UgJGhvc3Rfb3MgaW4gIygKKyAgICAgICAgZGFyd2luKikKKyAgICAgICAgICBpZiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxMzY7IHRoZW4KKyAgICAgICAgICAgICMgVGhlIGB4JyBhZGRlZCBpbiByNDY3OTMgb2YgQm9vc3QuCisgICAgICAgICAgICBib29zdF90YWdfeD14CisgICAgICAgICAgZmk7OworICAgICAgZXNhYworICAgICAgIyBXZSBjYW4gc3BlY2lmeSBtdWx0aXBsZSB0YWdzIGluIHRoaXMgdmFyaWFibGUgYmVjYXVzZSBpdCdzIHVzZWQgYnkKKyAgICAgICMgQk9PU1RfRklORF9MSUIgdGhhdCBkb2VzIGEgYGZvciB0YWcgaW4gLSRib29zdF9jdl9saWJfdGFnJyAuLi4KKyAgICAgIGJvb3N0X2N2X2xpYl90YWc9IiRib29zdF90YWdfeCRib29zdF9jdl9saWJfdGFnIC0ke2Jvb3N0X3RhZ194fWdjYyIKKyAgICAgIDs7ICMoCisgICAgdW5rbm93bikKKyAgICAgIEFDX01TR19XQVJOKFtbY291bGQgbm90IGZpZ3VyZSBvdXQgd2hpY2ggdG9vbHNldCBuYW1lIHRvIHVzZSBmb3IgJENYWF1dKQorICAgICAgYm9vc3RfY3ZfbGliX3RhZz0KKyAgICAgIDs7CisgIGVzYWMKK2ZpXSlkbmwgZW5kIG9mIEFDX0NBQ0hFX0NIRUNLCitdKSMgX0JPT1NUX0ZJTkRfQ09NUElMRVJfVEFHCisKKworIyBfQk9PU1RfR1VFU1NfV0hFVEhFUl9UT19VU0VfTVQoKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb21waWxlIGEgc21hbGwgdGVzdCB0byB0cnkgdG8gZ3Vlc3Mgd2hldGhlciB3ZSBzaG91bGQgZmF2b3IgTVQgKE11bHRpCisjIFRocmVhZCkgZmxhdm9ycyBvZiBCb29zdC4gIFNldHMgYm9vc3RfZ3Vlc3NfdXNlX210IGFjY29yZGluZ2x5LgorQUNfREVGVU4oW19CT09TVF9HVUVTU19XSEVUSEVSX1RPX1VTRV9NVF0sCitbIyBDaGVjayB3aGV0aGVyIHdlIGRvIGJldHRlciB1c2UgYG10JyBldmVuIHRob3VnaCB3ZSB3ZXJlbid0IGFzayB0by4KK0FDX0xBTkdfUFVTSChbQysrXSlkbmwKK0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKKyNpZiBkZWZpbmVkIF9SRUVOVFJBTlQgfHwgZGVmaW5lZCBfTVQgfHwgZGVmaW5lZCBfX01UX18KKy8qIHVzZSAtbXQgKi8KKyNlbHNlCisjIGVycm9yIE1UIG5vdCBuZWVkZWQKKyNlbmRpZgorXV0pXSwgW2Jvb3N0X2d1ZXNzX3VzZV9tdD06XSwgW2Jvb3N0X2d1ZXNzX3VzZV9tdD1mYWxzZV0pCitBQ19MQU5HX1BPUChbQysrXSlkbmwKK10pCisKKyMgX0JPT1NUX0FDX0xJTktfSUZFTFNFKFBST0dSQU0sIFtBQ1RJT04tSUYtVFJVRV0sIFtBQ1RJT04tSUYtRkFMU0VdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZvcmsgb2YgX0FDX0xJTktfSUZFTFNFIHRoYXQgcHJlc2VydmVzIGNvbmZ0ZXN0Lm8gYWNyb3NzIGNhbGxzLiAgRnJhZ2lsZSwKKyMgd2lsbCBicmVhayB3aGVuIEF1dG9jb25mIGNoYW5nZXMgaXRzIGludGVybmFscy4gIFJlcXVpcmVzIHRoYXQgeW91IG1hbnVhbGx5CisjIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgaW4gYmV0d2VlbiB0byByZWFsbHkgZGlmZmVyZW50IHRlc3RzLCBvdGhlcndpc2UKKyMgeW91IHdpbGwgdHJ5IHRvIGxpbmsgYSBjb25mdGVzdC5vIGxlZnQgYmVoaW5kIGJ5IGEgcHJldmlvdXMgdGVzdC4KKyMgVXNlZCB0byBhZ2dyZXNzaXZlbHkgb3B0aW1pemUgQk9PU1RfRklORF9MSUIgKHNlZSB0aGUgYmlnIGNvbW1lbnQgaW4gdGhpcworIyBtYWNybykuCisjCisjIERvbid0IHVzZSAiYnJlYWsiIGluIHRoZSBhY3Rpb25zLCBhcyBpdCB3b3VsZCBzaG9ydC1jaXJjdWl0IHNvbWUgY29kZQorIyB0aGlzIG1hY3JvIHJ1bnMgYWZ0ZXIgdGhlIGFjdGlvbnMuCittNF9kZWZpbmUoW19CT09TVF9BQ19MSU5LX0lGRUxTRV0sCitbbTRfaWZ2YWxuKFskMV0sIFtBQ19MQU5HX0NPTkZURVNUKFskMV0pXSlkbmwKK3JtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAorYm9vc3Rfc2F2ZV9hY19leHQ9JGFjX2V4dAorYm9vc3RfdXNlX3NvdXJjZT06CisjIElmIHdlIGFscmVhZHkgaGF2ZSBhIC5vLCByZS11c2UgaXQuICBXZSBjaGFuZ2UgJGFjX2V4dCBzbyB0aGF0ICRhY19saW5rCisjIHRyaWVzIHRvIGxpbmsgdGhlIGV4aXN0aW5nIG9iamVjdCBmaWxlIGluc3RlYWQgb2YgY29tcGlsaW5nIGZyb20gc291cmNlLgordGVzdCAtZiBjb25mdGVzdC4kYWNfb2JqZXh0ICYmIGFjX2V4dD0kYWNfb2JqZXh0ICYmIGJvb3N0X3VzZV9zb3VyY2U9ZmFsc2UgJiYKKyAgX0FTX0VDSE9fTE9HKFtyZS11c2luZyB0aGUgZXhpc3RpbmcgY29uZnRlc3QuJGFjX29iamV4dF0pCitBU19JRihbX0FDX0RPX1NUREVSUigkYWNfbGluaykgJiYgeworICAgICAgICAgdGVzdCAteiAiJGFjX1tdX0FDX0xBTkdfQUJCUkVWW11fd2Vycm9yX2ZsYWciIHx8CisgICAgICAgICB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7CisgICAgICAgICB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAorICAgICAgICAgJGFzX2V4ZWN1dGFibGVfcCBjb25mdGVzdCRhY19leGVleHQKK2RubCBGSVhNRTogdXNlIEFTX1RFU1RfWCBpbnN0ZWFkIHdoZW4gMi42MSBpcyB3aWRlc3ByZWFkIGVub3VnaC4KKyAgICAgICB9XSwKKyAgICAgIFskMl0sCisgICAgICBbaWYgJGJvb3N0X3VzZV9zb3VyY2U7IHRoZW4KKyAgICAgICAgIF9BQ19NU0dfTE9HX0NPTkZURVNUCisgICAgICAgZmkKKyAgICAgICAkM10pCithY19vYmpleHQ9JGJvb3N0X3NhdmVfYWNfb2JqZXh0CithY19leHQ9JGJvb3N0X3NhdmVfYWNfZXh0CitkbmwgRGVsZXRlIGFsc28gdGhlIElQQS9JUE8gKEludGVyIFByb2NlZHVyYWwgQW5hbHlzaXMvT3B0aW1pemF0aW9uKQorZG5sIGluZm9ybWF0aW9uIGNyZWF0ZWQgYnkgdGhlIFBHSSBjb21waWxlciAoY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyksCitkbmwgYXMgaXQgd291bGQgaW50ZXJmZXJlIHdpdGggdGhlIG5leHQgbGluayBjb21tYW5kLgorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgbTRfaWZ2YWwoWyQxXSwgW2NvbmZ0ZXN0LiRhY19leHRdKVtdZG5sCitdKSMgX0JPT1NUX0FDX0xJTktfSUZFTFNFCisKKyMgTG9jYWwgVmFyaWFibGVzOgorIyBtb2RlOiBhdXRvY29uZgorIyBFbmQ6CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL2N2YzQtMS40LXBhdGNoL29wdGlvbnMvb3B0aW9uc190ZW1wbGF0ZS5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL2N2YzQtMS40LXBhdGNoL29wdGlvbnMvb3B0aW9uc190ZW1wbGF0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRiZjZiOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvY3ZjNC0xLjQtcGF0Y2gvb3B0aW9ucy9vcHRpb25zX3RlbXBsYXRlLmNwcApAQCAtMCwwICsxLDYxMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qISBcZmlsZSBvcHRpb25zX3RlbXBsYXRlLmNwcAorICoqIFx2ZXJiYXRpbQorICoqIE9yaWdpbmFsIGF1dGhvcjogTW9yZ2FuIERldGVycworICoqIE1ham9yIGNvbnRyaWJ1dG9yczogbm9uZQorICoqIE1pbm9yIGNvbnRyaWJ1dG9ycyAodG8gY3VycmVudCB2ZXJzaW9uKTogS3NoaXRpaiBCYW5zYWwKKyAqKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQ1ZDNCBwcm9qZWN0LgorICoqIENvcHlyaWdodCAoYykgMjAwOS0yMDE0ICBOZXcgWW9yayBVbml2ZXJzaXR5IGFuZCBUaGUgVW5pdmVyc2l0eSBvZiBJb3dhCisgKiogU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIHRvcC1sZXZlbCBzb3VyY2UgZGlyZWN0b3J5IGZvciBsaWNlbnNpbmcKKyAqKiBpbmZvcm1hdGlvbi5cZW5kdmVyYmF0aW0KKyAqKgorICoqIFxicmllZiBDb250YWlucyBjb2RlIGZvciBoYW5kbGluZyBjb21tYW5kLWxpbmUgb3B0aW9ucy4KKyAqKgorICoqIENvbnRhaW5zIGNvZGUgZm9yIGhhbmRsaW5nIGNvbW1hbmQtbGluZSBvcHRpb25zCisgKiovCisKKyNpZiAhZGVmaW5lZChfQlNEX1NPVVJDRSkgJiYgZGVmaW5lZChfX01JTkdXMzJfXykgJiYgIWRlZmluZWQoX19NSU5HVzY0X18pCisvLyBmb3JjZSB1c2Ugb2Ygb3B0cmVzZXQ7IG1pbmd3MzIgY3JvYWtzIG9uIGFyZ3Ytc3dpdGNoaW5nIG90aGVyd2lzZQorIyAgaW5jbHVkZSAiY3ZjNGF1dG9jb25maWcuaCIKKyMgIGRlZmluZSBfQlNEX1NPVVJDRQorIyAgdW5kZWYgSEFWRV9ERUNMX09QVFJFU0VUCisjICBkZWZpbmUgSEFWRV9ERUNMX09QVFJFU0VUIDEKKyMgIGRlZmluZSBDVkM0X0lTX05PVF9SRUFMTFlfQlNECisjZW5kaWYgLyogIV9CU0RfU09VUkNFICYmIF9fTUlOR1czMl9fICYmICFfX01JTkdXNjRfXyAqLworCisjaWZkZWYgX19NSU5HVzY0X18KKyNkZWZpbmUgX0JTRF9TT1VSQ0UgLy8gTmVlZGVkIHRvIGF2b2lkICdvcHRyZXNldCcgZXJyb3IgYXQgbGluaworZXh0ZXJuIGludCBvcHRyZXNldDsKKyNlbmRpZiAvKiBfX01JTkdXNjRfXyAqLworCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKKy8vIGNsZWFuIHVwCisjaWZkZWYgQ1ZDNF9JU19OT1RfUkVBTExZX0JTRAorIyAgdW5kZWYgX0JTRF9TT1VSQ0UKKyNlbmRpZiAvKiBDVkM0X0lTX05PVF9SRUFMTFlfQlNEICovCisKKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxuZXc+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgImV4cHIvZXhwci5oIgorI2luY2x1ZGUgInV0aWwvY29uZmlndXJhdGlvbi5oIgorI2luY2x1ZGUgInV0aWwvZGlkeW91bWVhbi5oIgorI2luY2x1ZGUgInV0aWwvZXhjZXB0aW9uLmgiCisjaW5jbHVkZSAidXRpbC9sYW5ndWFnZS5oIgorI2luY2x1ZGUgInV0aWwvdGxzLmgiCisKKyR7aW5jbHVkZV9hbGxfb3B0aW9uX2hlYWRlcnN9CisKKyNsaW5lIDU4ICIke3RlbXBsYXRlfSIKKworI2luY2x1ZGUgInV0aWwvb3V0cHV0LmgiCisjaW5jbHVkZSAib3B0aW9ucy9vcHRpb25zX2hvbGRlci5oIgorI2luY2x1ZGUgImN2YzRhdXRvY29uZmlnLmgiCisjaW5jbHVkZSAib3B0aW9ucy9iYXNlX29wdGlvbnNfaGFuZGxlcnMuaCIKKworJHtvcHRpb25faGFuZGxlcl9pbmNsdWRlc30KKworI2xpbmUgNjcgIiR7dGVtcGxhdGV9IgorCit1c2luZyBuYW1lc3BhY2UgQ1ZDNDsKK3VzaW5nIG5hbWVzcGFjZSBDVkM0OjpvcHRpb25zOworCituYW1lc3BhY2UgQ1ZDNCB7CisKK0NWQzRfVEhSRUFETE9DQUwoT3B0aW9ucyopIE9wdGlvbnM6OnNfY3VycmVudCA9IE5VTEw7CisKKy8qKgorICogVGhpcyBpcyBhIGRlZmF1bHQgaGFuZGxlciBmb3Igb3B0aW9ucyBvZiBidWlsdC1pbiBDKysgdHlwZS4gIFRoaXMKKyAqIHRlbXBsYXRlIGlzIHJlYWxseSBqdXN0IGEgaGVscGVyIGZvciB0aGUgaGFuZGxlT3B0aW9uKCkgdGVtcGxhdGUsCisgKiBiZWxvdy4gIFZhcmlhbnRzIG9mIHRoaXMgdGVtcGxhdGUgaGFuZGxlIG51bWVyaWMgYW5kIG5vbi1udW1lcmljLAorICogaW50ZWdyYWwgYW5kIG5vbi1pbnRlZ3JhbCwgc2lnbmVkIGFuZCB1bnNpZ25lZCBDKysgdHlwZXMuCisgKiBoYW5kbGVPcHRpb24oKSBtYWtlcyBzdXJlIHRvIGluc3RhbnRpYXRlIHRoZSByaWdodCBvbmUuCisgKgorICogVGhpcyBpbXBsZW1lbnRzIGRlZmF1bHQgYmVoYXZpb3Igd2hlbiBlLmcuIGFuIG9wdGlvbiBpcworICogdW5zaWduZWQgYnV0IHRoZSB1c2VyIHNwZWNpZmllcyBhIG5lZ2F0aXZlIGFyZ3VtZW50OyBldGMuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBULCBib29sIGlzX251bWVyaWMsIGJvb2wgaXNfaW50ZWdlcj4KK3N0cnVjdCBPcHRpb25IYW5kbGVyIHsKKyAgc3RhdGljIFQgaGFuZGxlKHN0ZDo6c3RyaW5nIG9wdGlvbiwgc3RkOjpzdHJpbmcgb3B0aW9uYXJnKTsKK307Lyogc3RydWN0IE9wdGlvbkhhbmRsZXI8PiAqLworCisvKiogVmFyaWFudCBmb3IgaW50ZWdyYWwgQysrIHR5cGVzICovCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3N0cnVjdCBPcHRpb25IYW5kbGVyPFQsIHRydWUsIHRydWU+IHsKKyAgc3RhdGljIFQgaGFuZGxlKHN0ZDo6c3RyaW5nIG9wdGlvbiwgc3RkOjpzdHJpbmcgb3B0aW9uYXJnKSB7CisgICAgdHJ5IHsKKyAgICAgIEludGVnZXIgaShvcHRpb25hcmcsIDEwKTsKKworICAgICAgaWYoISBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+Ojppc19zaWduZWQgJiYgaSA8IDApIHsKKyAgICAgICAgLy8gdW5zaWduZWQgdHlwZSBidXQgdXNlciBnYXZlIG5lZ2F0aXZlIGFyZ3VtZW50CisgICAgICAgIHRocm93IE9wdGlvbkV4Y2VwdGlvbihvcHRpb24gKyAiIHJlcXVpcmVzIGEgbm9ubmVnYXRpdmUgYXJndW1lbnQiKTsKKyAgICAgIH0gZWxzZSBpZihpIDwgc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWluKCkpIHsKKyAgICAgICAgLy8gbmVnYXRpdmUgb3ZlcmZsb3cgZm9yIHR5cGUKKyAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgICAgIHNzIDw8IG9wdGlvbiA8PCAiIHJlcXVpcmVzIGFuIGFyZ3VtZW50ID49ICIgPDwgc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWluKCk7CisgICAgICAgIHRocm93IE9wdGlvbkV4Y2VwdGlvbihzcy5zdHIoKSk7CisgICAgICB9IGVsc2UgaWYoaSA+IHN0ZDo6bnVtZXJpY19saW1pdHM8VD46Om1heCgpKSB7CisgICAgICAgIC8vIHBvc2l0aXZlIG92ZXJmbG93IGZvciB0eXBlCisgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgICBzcyA8PCBvcHRpb24gPDwgIiByZXF1aXJlcyBhbiBhcmd1bWVudCA8PSAiIDw8IHN0ZDo6bnVtZXJpY19saW1pdHM8VD46Om1heCgpOworICAgICAgICB0aHJvdyBPcHRpb25FeGNlcHRpb24oc3Muc3RyKCkpOworICAgICAgfQorCisgICAgICBpZihzdGQ6Om51bWVyaWNfbGltaXRzPFQ+Ojppc19zaWduZWQpIHsKKyAgICAgICAgcmV0dXJuIFQoaS5nZXRMb25nKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFQoaS5nZXRVbnNpZ25lZExvbmcoKSk7CisgICAgICB9CisgICAgfSBjYXRjaChzdGQ6OmludmFsaWRfYXJndW1lbnQmKSB7CisgICAgICAvLyB1c2VyIGdhdmUgc29tZXRoaW5nIG90aGVyIHRoYW4gYW4gaW50ZWdlcgorICAgICAgdGhyb3cgT3B0aW9uRXhjZXB0aW9uKG9wdGlvbiArICIgcmVxdWlyZXMgYW4gaW50ZWdlciBhcmd1bWVudCIpOworICAgIH0KKyAgfQorfTsvKiBzdHJ1Y3QgT3B0aW9uSGFuZGxlcjxULCB0cnVlLCB0cnVlPiAqLworCisvKiogVmFyaWFudCBmb3IgbnVtZXJpYyBidXQgbm9uLWludGVncmFsIEMrKyB0eXBlcyAqLwordGVtcGxhdGUgPGNsYXNzIFQ+CitzdHJ1Y3QgT3B0aW9uSGFuZGxlcjxULCB0cnVlLCBmYWxzZT4geworICBzdGF0aWMgVCBoYW5kbGUoc3RkOjpzdHJpbmcgb3B0aW9uLCBzdGQ6OnN0cmluZyBvcHRpb25hcmcpIHsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBpbihvcHRpb25hcmcpOworICAgIGxvbmcgZG91YmxlIHI7CisgICAgaW4gPj4gcjsKKyAgICBpZighIGluLmVvZigpKSB7CisgICAgICAvLyB3ZSBkaWRuJ3QgY29uc3VtZSB0aGUgd2hvbGUgc3RyaW5nIChqdW5rIGF0IGVuZCkKKyAgICAgIHRocm93IE9wdGlvbkV4Y2VwdGlvbihvcHRpb24gKyAiIHJlcXVpcmVzIGEgbnVtZXJpYyBhcmd1bWVudCIpOworICAgIH0KKworICAgIGlmKCEgc3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfc2lnbmVkICYmIHIgPCAwLjApIHsKKyAgICAgIC8vIHVuc2lnbmVkIHR5cGUgYnV0IHVzZXIgZ2F2ZSBuZWdhdGl2ZSB2YWx1ZQorICAgICAgdGhyb3cgT3B0aW9uRXhjZXB0aW9uKG9wdGlvbiArICIgcmVxdWlyZXMgYSBub25uZWdhdGl2ZSBhcmd1bWVudCIpOworICAgIH0gZWxzZSBpZihyIDwgLXN0ZDo6bnVtZXJpY19saW1pdHM8VD46Om1heCgpKSB7CisgICAgICAvLyBuZWdhdGl2ZSBvdmVyZmxvdyBmb3IgdHlwZQorICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgICBzcyA8PCBvcHRpb24gPDwgIiByZXF1aXJlcyBhbiBhcmd1bWVudCA+PSAiIDw8IC1zdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptYXgoKTsKKyAgICAgIHRocm93IE9wdGlvbkV4Y2VwdGlvbihzcy5zdHIoKSk7CisgICAgfSBlbHNlIGlmKHIgPiBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptYXgoKSkgeworICAgICAgLy8gcG9zaXRpdmUgb3ZlcmZsb3cgZm9yIHR5cGUKKyAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgc3MgPDwgb3B0aW9uIDw8ICIgcmVxdWlyZXMgYW4gYXJndW1lbnQgPD0gIiA8PCBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptYXgoKTsKKyAgICAgIHRocm93IE9wdGlvbkV4Y2VwdGlvbihzcy5zdHIoKSk7CisgICAgfQorCisgICAgcmV0dXJuIFQocik7CisgIH0KK307Lyogc3RydWN0IE9wdGlvbkhhbmRsZXI8VCwgdHJ1ZSwgZmFsc2U+ICovCisKKy8qKiBWYXJpYW50IGZvciBub24tbnVtZXJpYyBDKysgdHlwZXMgKi8KK3RlbXBsYXRlIDxjbGFzcyBUPgorc3RydWN0IE9wdGlvbkhhbmRsZXI8VCwgZmFsc2UsIGZhbHNlPiB7CisgIHN0YXRpYyBUIGhhbmRsZShzdGQ6OnN0cmluZyBvcHRpb24sIHN0ZDo6c3RyaW5nIG9wdGlvbmFyZykgeworICAgIFQ6OnVuc3VwcG9ydGVkX2hhbmRsZU9wdGlvbl9jYWxsX19fcGxlYXNlX3dyaXRlX21lOworICAgIC8vIFRoZSBhYm92ZSBsaW5lIGNhdXNlcyBhIGNvbXBpbGVyIGVycm9yIGlmIHRoaXMgdmVyc2lvbiBvZiB0aGUgdGVtcGxhdGUKKyAgICAvLyBpcyBldmVyIGluc3RhbnRpYXRlZCAobWVhbmluZyB0aGF0IGEgc3BlY2lhbGl6YXRpb24gaXMgbWlzc2luZykuICBTbworICAgIC8vIGRvbid0IHdvcnJ5IGFib3V0IHRoZSBzZWdmYXVsdCBpbiB0aGUgbmV4dCBsaW5lLCB0aGUgInJldHVybiIgaXMgb25seQorICAgIC8vIHRoZXJlIHRvIGtlZXAgdGhlIGNvbXBpbGVyIGZyb20gZ2l2aW5nIGFkZGl0aW9uYWwsIGRpc3RyYWN0aW5nIGVycm9ycworICAgIC8vIGFuZCB3YXJuaW5ncy4KKyAgICByZXR1cm4gKihUKikwOworICB9Cit9Oy8qIHN0cnVjdCBPcHRpb25IYW5kbGVyPFQsIGZhbHNlLCBmYWxzZT4gKi8KKworLyoqIEhhbmRsZSBhbiBvcHRpb24gb2YgdHlwZSBUIGluIHRoZSBkZWZhdWx0IHdheS4gKi8KK3RlbXBsYXRlIDxjbGFzcyBUPgorVCBoYW5kbGVPcHRpb24oc3RkOjpzdHJpbmcgb3B0aW9uLCBzdGQ6OnN0cmluZyBvcHRpb25hcmcpIHsKKyAgcmV0dXJuIE9wdGlvbkhhbmRsZXI8VCwgc3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfc3BlY2lhbGl6ZWQsIHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX2ludGVnZXI+OjpoYW5kbGUob3B0aW9uLCBvcHRpb25hcmcpOworfQorCisvKiogSGFuZGxlIGFuIG9wdGlvbiBvZiB0eXBlIHN0ZDo6c3RyaW5nIGluIHRoZSBkZWZhdWx0IHdheS4gKi8KK3RlbXBsYXRlIDw+CitzdGQ6OnN0cmluZyBoYW5kbGVPcHRpb248c3RkOjpzdHJpbmc+KHN0ZDo6c3RyaW5nIG9wdGlvbiwgc3RkOjpzdHJpbmcgb3B0aW9uYXJnKSB7CisgIHJldHVybiBvcHRpb25hcmc7Cit9CisKKy8qKgorICogUnVuIGhhbmRsZXIsIGFuZCBhbnkgdXNlci1naXZlbiBwcmVkaWNhdGVzLCBmb3Igb3B0aW9uIFQuCisgKiBJZiBhIHVzZXIgc3BlY2lmaWVzIGEgOmhhbmRsZXIgb3IgOnByZWRpY2F0ZXMsIGl0IG92ZXJyaWRlcyB0aGlzLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3R5cGVuYW1lIFQ6OnR5cGUgcnVuSGFuZGxlckFuZFByZWRpY2F0ZXMoVCwgc3RkOjpzdHJpbmcgb3B0aW9uLCBzdGQ6OnN0cmluZyBvcHRpb25hcmcsIFNtdEVuZ2luZSogc210KSB7CisgIC8vIEJ5IGRlZmF1bHQsIHBhcnNlIHRoZSBvcHRpb24gYXJndW1lbnQgaW4gYSB3YXkgYXBwcm9wcmlhdGUgZm9yIGl0cyB0eXBlLgorICAvLyBFLmcuLCBmb3IgInVuc2lnbmVkIGludCIgb3B0aW9ucywgZW5zdXJlIHRoYXQgdGhlIHByb3ZpZGVkIGFyZ3VtZW50IGlzCisgIC8vIGEgbm9ubmVnYXRpdmUgaW50ZWdlciB0aGF0IGZpdHMgaW4gdGhlIHVuc2lnbmVkIGludCB0eXBlLgorCisgIHJldHVybiBoYW5kbGVPcHRpb248dHlwZW5hbWUgVDo6dHlwZT4ob3B0aW9uLCBvcHRpb25hcmcpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3ZvaWQgcnVuQm9vbFByZWRpY2F0ZXMoVCwgc3RkOjpzdHJpbmcgb3B0aW9uLCBib29sIGIsIFNtdEVuZ2luZSogc210KSB7CisgIC8vIEJ5IGRlZmF1bHQsIG5vdGhpbmcgdG8gZG8gZm9yIGJvb2wuICBVc2VycyBhZGQgdGhpbmdzIHdpdGgKKyAgLy8gOnByZWRpY2F0ZSBpbiBvcHRpb25zIGZpbGVzIHRvIHByb3ZpZGUgY3VzdG9tIGNoZWNraW5nIHJvdXRpbmVzCisgIC8vIHRoYXQgY2FuIHRocm93IGV4Y2VwdGlvbnMuCit9CisKKyR7YWxsX2N1c3RvbV9oYW5kbGVyc30KKworI2xpbmUgMjA0ICIke3RlbXBsYXRlfSIKKworI2lmZGVmIENWQzRfREVCVUcKKyMgIGRlZmluZSBVU0VfRUFSTFlfVFlQRV9DSEVDS0lOR19CWV9ERUZBVUxUIHRydWUKKyNlbHNlIC8qIENWQzRfREVCVUcgKi8KKyMgIGRlZmluZSBVU0VfRUFSTFlfVFlQRV9DSEVDS0lOR19CWV9ERUZBVUxUIGZhbHNlCisjZW5kaWYgLyogQ1ZDNF9ERUJVRyAqLworCisjaWYgZGVmaW5lZChDVkM0X01VWlpMRUQpIHx8IGRlZmluZWQoQ1ZDNF9DT01QRVRJVElPTl9NT0RFKQorIyAgZGVmaW5lIERPX1NFTUFOVElDX0NIRUNLU19CWV9ERUZBVUxUIGZhbHNlCisjZWxzZSAvKiBDVkM0X01VWlpMRUQgfHwgQ1ZDNF9DT01QRVRJVElPTl9NT0RFICovCisjICBkZWZpbmUgRE9fU0VNQU5USUNfQ0hFQ0tTX0JZX0RFRkFVTFQgdHJ1ZQorI2VuZGlmIC8qIENWQzRfTVVaWkxFRCB8fCBDVkM0X0NPTVBFVElUSU9OX01PREUgKi8KKworT3B0aW9uczo6T3B0aW9ucygpIDoKKyAgZF9ob2xkZXIobmV3IG9wdGlvbnM6Ok9wdGlvbnNIb2xkZXIoKSkgeworfQorCitPcHRpb25zOjpPcHRpb25zKGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIDoKKyAgZF9ob2xkZXIobmV3IG9wdGlvbnM6Ok9wdGlvbnNIb2xkZXIoKm9wdGlvbnMuZF9ob2xkZXIpKSB7Cit9CisKK09wdGlvbnM6On5PcHRpb25zKCkgeworICBkZWxldGUgZF9ob2xkZXI7Cit9CisKK29wdGlvbnM6Ok9wdGlvbnNIb2xkZXI6Ok9wdGlvbnNIb2xkZXIoKSA6ICR7YWxsX21vZHVsZXNfZGVmYXVsdHN9Cit7Cit9CisKKyNsaW5lIDIzNCAiJHt0ZW1wbGF0ZX0iCisKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBtb3N0Q29tbW9uT3B0aW9uc0Rlc2NyaXB0aW9uID0gIlwKK01vc3QgY29tbW9ubHktdXNlZCBDVkM0IG9wdGlvbnM6JHtjb21tb25fZG9jdW1lbnRhdGlvbn0iOworCisjbGluZSAyMzkgIiR7dGVtcGxhdGV9IgorCitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgb3B0aW9uc0Rlc2NyaXB0aW9uID0gbW9zdENvbW1vbk9wdGlvbnNEZXNjcmlwdGlvbiArICJcblwKK1xuXAorQWRkaXRpb25hbCBDVkM0IG9wdGlvbnM6JHtyZW1haW5pbmdfZG9jdW1lbnRhdGlvbn0iOworCisjbGluZSAyNDUgIiR7dGVtcGxhdGV9IgorCitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgb3B0aW9uc0Zvb3Rub3RlID0gIlxuXAorWypdIEVhY2ggb2YgdGhlc2Ugb3B0aW9ucyBoYXMgYSAtLW5vLU9QVElPTk5BTUUgdmFyaWFudCwgd2hpY2ggcmV2ZXJzZXMgdGhlXG5cCisgICAgc2Vuc2Ugb2YgdGhlIG9wdGlvbi5cblwKKyI7CisKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBsYW5ndWFnZURlc2NyaXB0aW9uID0gIlwKK0xhbmd1YWdlcyBjdXJyZW50bHkgc3VwcG9ydGVkIGFzIGFyZ3VtZW50cyB0byB0aGUgLUwgLyAtLWxhbmcgb3B0aW9uOlxuXAorICBhdXRvICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdCB0byBhdXRvbWF0aWNhbGx5IGRldGVybWluZSBsYW5ndWFnZVxuXAorICBjdmM0IHwgcHJlc2VudGF0aW9uIHwgcGwgICAgICAgQ1ZDNCBwcmVzZW50YXRpb24gbGFuZ3VhZ2VcblwKKyAgc210MSB8IHNtdGxpYjEgICAgICAgICAgICAgICAgIFNNVC1MSUIgZm9ybWF0IDEuMlxuXAorICBzbXQgfCBzbXRsaWIgfCBzbXQyIHwgc210bGliMiAgU01ULUxJQiBmb3JtYXQgMi4wXG5cCisgIHRwdHAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUFRQIGZvcm1hdCAoY25mIGFuZCBmb2YpXG5cCitcblwKK0xhbmd1YWdlcyBjdXJyZW50bHkgc3VwcG9ydGVkIGFzIGFyZ3VtZW50cyB0byB0aGUgLS1vdXRwdXQtbGFuZyBvcHRpb246XG5cCisgIGF1dG8gICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCBvdXRwdXQgbGFuZ3VhZ2UgdG8gaW5wdXQgbGFuZ3VhZ2VcblwKKyAgY3ZjNCB8IHByZXNlbnRhdGlvbiB8IHBsICAgICAgIENWQzQgcHJlc2VudGF0aW9uIGxhbmd1YWdlXG5cCisgIGN2YzMgICAgICAgICAgICAgICAgICAgICAgICAgICBDVkMzIHByZXNlbnRhdGlvbiBsYW5ndWFnZVxuXAorICBzbXQxIHwgc210bGliMSAgICAgICAgICAgICAgICAgU01ULUxJQiBmb3JtYXQgMS4yXG5cCisgIHNtdCB8IHNtdGxpYiB8IHNtdDIgfCBzbXRsaWIyICBTTVQtTElCIGZvcm1hdCAyLjBcblwKKyAgejNzdHIgICAgICAgICAgICAgICAgICAgICAgICAgIFNNVC1MSUIgMi4wIHdpdGggWjMtc3RyIHN0cmluZyBjb25zdHJhaW50c1xuXAorICB0cHRwICAgICAgICAgICAgICAgICAgICAgICAgICAgVFBUUCBmb3JtYXRcblwKKyAgYXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsIGZvcm1hdCAoc2ltcGxlIHN5bnRheCB0cmVlcylcblwKKyI7CisKK3N0ZDo6c3RyaW5nIE9wdGlvbnM6OmdldERlc2NyaXB0aW9uKCkgY29uc3QgeworICByZXR1cm4gb3B0aW9uc0Rlc2NyaXB0aW9uOworfQorCit2b2lkIE9wdGlvbnM6OnByaW50VXNhZ2UoY29uc3Qgc3RkOjpzdHJpbmcgbXNnLCBzdGQ6Om9zdHJlYW0mIG91dCkgeworICBvdXQgPDwgbXNnIDw8IG9wdGlvbnNEZXNjcmlwdGlvbiA8PCBzdGQ6OmVuZGwKKyAgICAgIDw8IG9wdGlvbnNGb290bm90ZSA8PCBzdGQ6OmVuZGwgPDwgc3RkOjpmbHVzaDsKK30KKwordm9pZCBPcHRpb25zOjpwcmludFNob3J0VXNhZ2UoY29uc3Qgc3RkOjpzdHJpbmcgbXNnLCBzdGQ6Om9zdHJlYW0mIG91dCkgeworICBvdXQgPDwgbXNnIDw8IG1vc3RDb21tb25PcHRpb25zRGVzY3JpcHRpb24gPDwgc3RkOjplbmRsCisgICAgICA8PCBvcHRpb25zRm9vdG5vdGUgPDwgc3RkOjplbmRsCisgICAgICA8PCAiRm9yIGZ1bGwgdXNhZ2UsIHBsZWFzZSB1c2UgLS1oZWxwLiIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmZsdXNoOworfQorCit2b2lkIE9wdGlvbnM6OnByaW50TGFuZ3VhZ2VIZWxwKHN0ZDo6b3N0cmVhbSYgb3V0KSB7CisgIG91dCA8PCBsYW5ndWFnZURlc2NyaXB0aW9uIDw8IHN0ZDo6Zmx1c2g7Cit9CisKKy8qKgorICogVGhpcyBpcyBhIHRhYmxlIG9mIGxvbmcgb3B0aW9ucy4gIEJ5IHBvbGljeSwgZWFjaCBzaG9ydCBvcHRpb24KKyAqIHNob3VsZCBoYXZlIGFuIGVxdWl2YWxlbnQgbG9uZyBvcHRpb24gKGJ1dCB0aGUgcmV2ZXJzZSBpc24ndCB0aGUKKyAqIGNhc2UpLCBzbyB0aGlzIHRhYmxlIHNob3VsZCB0aHVzIGNvbnRhaW4gYWxsIGNvbW1hbmQtbGluZSBvcHRpb25zLgorICoKKyAqIEVhY2ggb3B0aW9uIGluIHRoaXMgYXJyYXkgaGFzIGZvdXIgZWxlbWVudHM6CisgKgorICogMS4gdGhlIGxvbmcgb3B0aW9uIHN0cmluZworICogMi4gYXJndW1lbnQgYmVoYXZpb3IgZm9yIHRoZSBvcHRpb246CisgKiAgICBub19hcmd1bWVudCAtIG5vIGFyZ3VtZW50IHBlcm1pdHRlZAorICogICAgcmVxdWlyZWRfYXJndW1lbnQgLSBhbiBhcmd1bWVudCBpcyBleHBlY3RlZAorICogICAgb3B0aW9uYWxfYXJndW1lbnQgLSBhbiBhcmd1bWVudCBpcyBwZXJtaXR0ZWQgYnV0IG5vdCByZXF1aXJlZAorICogMy4gdGhpcyBpcyBhIHBvaW50ZXIgdG8gYW4gaW50IHdoaWNoIGlzIHNldCB0byB0aGUgNHRoIGVudHJ5IG9mIHRoZQorICogICAgYXJyYXkgaWYgdGhlIG9wdGlvbiBpcyBwcmVzZW50OyBvciBOVUxMLCBpbiB3aGljaCBjYXNlCisgKiAgICBnZXRvcHRfbG9uZygpIHJldHVybnMgdGhlIDR0aCBlbnRyeQorICogNC4gdGhlIHJldHVybiB2YWx1ZSBmb3IgZ2V0b3B0X2xvbmcoKSB3aGVuIHRoaXMgbG9uZyBvcHRpb24gKG9yIHRoZQorICogICAgdmFsdWUgdG8gc2V0IHRoZSAzcmQgZW50cnkgdG87IHNlZSAjMykKKyAqCisgKiBJZiB5b3UgYWRkIHNvbWV0aGluZyBoZXJlLCB5b3Ugc2hvdWxkIGFkZCBpdCBpbiBzcmMvbWFpbi91c2FnZS5oCisgKiBhbHNvLCB0byBkb2N1bWVudCBpdC4KKyAqCisgKiBJZiB5b3UgYWRkIHNvbWV0aGluZyB0aGF0IGhhcyBhIHNob3J0IG9wdGlvbiBlcXVpdmFsZW50LCB5b3Ugc2hvdWxkCisgKiBhZGQgaXQgdG8gdGhlIGdldG9wdF9sb25nKCkgY2FsbCBpbiBwYXJzZU9wdGlvbnMoKS4KKyAqLworc3RhdGljIHN0cnVjdCBvcHRpb24gY21kbGluZU9wdGlvbnNbXSA9IHske2FsbF9tb2R1bGVzX2xvbmdfb3B0aW9uc30KKyAgeyBOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgJ1wwJyB9Cit9Oy8qIGNtZGxpbmVPcHRpb25zICovCisKKyNsaW5lIDMxOCAiJHt0ZW1wbGF0ZX0iCisKK3N0YXRpYyB2b2lkIHByZWVtcHRHZXRvcHQoaW50JiBhcmdjLCBjaGFyKiomIGFyZ3YsIGNvbnN0IGNoYXIqIG9wdCkgeworICBjb25zdCBzaXplX3QgbWF4b3B0bGVuID0gMTI4OworCisgIERlYnVnKCJwcmVlbXB0R2V0b3B0IikgPDwgInByZWVtcHRpbmcgZ2V0b3B0KCkgd2l0aCAiIDw8IG9wdCA8PCBzdGQ6OmVuZGw7CisKKyAgQWx3YXlzQXNzZXJ0KG9wdCAhPSBOVUxMICYmICpvcHQgIT0gJ1wwJyk7CisgIEFsd2F5c0Fzc2VydChzdHJsZW4ob3B0KSA8PSBtYXhvcHRsZW4pOworCisgICsrYXJnYzsKKyAgdW5zaWduZWQgaSA9IDE7CisgIHdoaWxlKGFyZ3ZbaV0gIT0gTlVMTCAmJiBhcmd2W2ldWzBdICE9ICdcMCcpIHsKKyAgICArK2k7CisgIH0KKworICBpZihhcmd2W2ldID09IE5VTEwpIHsKKyAgICBhcmd2ID0gKGNoYXIqKikgcmVhbGxvYyhhcmd2LCAoaSArIDYpICogc2l6ZW9mKGNoYXIqKSk7CisgICAgZm9yKHVuc2lnbmVkIGogPSBpOyBqIDwgaSArIDU7ICsraikgeworICAgICAgYXJndltqXSA9IChjaGFyKikgbWFsbG9jKHNpemVvZihjaGFyKSAqIG1heG9wdGxlbik7CisgICAgICBhcmd2W2pdWzBdID0gJ1wwJzsKKyAgICB9CisgICAgYXJndltpICsgNV0gPSBOVUxMOworICB9CisKKyAgc3RybmNweShhcmd2W2ldLCBvcHQsIG1heG9wdGxlbiAtIDEpOworICBhcmd2W2ldW21heG9wdGxlbiAtIDFdID0gJ1wwJzsgLy8gZW5zdXJlIE5VTC10ZXJtaW5hdGlvbiBldmVuIG9uIG92ZXJmbG93Cit9CisKK25hbWVzcGFjZSBvcHRpb25zIHsKKworLyoqIFNldCBhIGdpdmVuIE9wdGlvbnMqIGFzICJjdXJyZW50IiBqdXN0IGZvciBhIHBhcnRpY3VsYXIgc2NvcGUuICovCitjbGFzcyBPcHRpb25zR3VhcmQgeworICBDVkM0X1RIUkVBRExPQ0FMX1RZUEUoT3B0aW9ucyopKiBkX2ZpZWxkOworICBPcHRpb25zKiBkX29sZDsKK3B1YmxpYzoKKyAgT3B0aW9uc0d1YXJkKENWQzRfVEhSRUFETE9DQUxfVFlQRShPcHRpb25zKikqIGZpZWxkLCBPcHRpb25zKiBvcHRzKSA6CisgICAgZF9maWVsZChmaWVsZCksCisgICAgZF9vbGQoKmZpZWxkKSB7CisgICAgKmZpZWxkID0gb3B0czsKKyAgfQorICB+T3B0aW9uc0d1YXJkKCkgeworICAgICpkX2ZpZWxkID0gZF9vbGQ7CisgIH0KK307LyogY2xhc3MgT3B0aW9uc0d1YXJkICovCisKK30vKiBDVkM0OjpvcHRpb25zIG5hbWVzcGFjZSAqLworCisvKioKKyAqIFBhcnNlIGFyZ2MvYXJndiBhbmQgcHV0IHRoZSByZXN1bHQgaW50byBhIENWQzQ6Ok9wdGlvbnMuCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIHdoYXQncyBsZWZ0IG9mIHRoZSBjb21tYW5kIGxpbmUgKHRoYXQgaXMsIHRoZQorICogbm9uLW9wdGlvbiBhcmd1bWVudHMpLgorICovCitzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gT3B0aW9uczo6cGFyc2VPcHRpb25zKGludCBhcmdjLCBjaGFyKiBtYWluX2FyZ3ZbXSkgdGhyb3coT3B0aW9uRXhjZXB0aW9uKSB7CisgIG9wdGlvbnM6Ok9wdGlvbnNHdWFyZCBndWFyZCgmc19jdXJyZW50LCB0aGlzKTsKKworICBjb25zdCBjaGFyICpwcm9nTmFtZSA9IG1haW5fYXJndlswXTsKKyAgU210RW5naW5lKiBjb25zdCBzbXQgPSBOVUxMOworCisgIERlYnVnKCJvcHRpb25zIikgPDwgIm1haW5fYXJndiA9PSAiIDw8IG1haW5fYXJndiA8PCBzdGQ6OmVuZGw7CisKKyAgLy8gUmVzZXQgZ2V0b3B0KCksIGluIHRoZSBjYXNlIG9mIG11bHRpcGxlIGNhbGxzIHRvIHBhcnNlT3B0aW9ucygpLgorICAvLyBUaGlzIGNhbiBiZSA9IDEgaW4gbmV3ZXIgR05VIGdldG9wdCwgYnV0IG9sZGVyICg8IDIwMDcpIHJlcXVpcmUgPSAwLgorICBvcHRpbmQgPSAwOworI2lmIEhBVkVfREVDTF9PUFRSRVNFVAorICBvcHRyZXNldCA9IDE7IC8vIG9uIEJTRCBnZXRvcHQoKSAoZS5nLiBNYWMgT1MpLCBtaWdodCBuZWVkIHRoaXMKKyNlbmRpZiAvKiBIQVZFX0RFQ0xfT1BUUkVTRVQgKi8KKworICAvLyBmaW5kIHRoZSBiYXNlIG5hbWUgb2YgdGhlIHByb2dyYW0KKyAgY29uc3QgY2hhciAqeCA9IHN0cnJjaHIocHJvZ05hbWUsICcvJyk7CisgIGlmKHggIT0gTlVMTCkgeworICAgIHByb2dOYW1lID0geCArIDE7CisgIH0KKyAgZF9ob2xkZXItPmJpbmFyeV9uYW1lID0gc3RkOjpzdHJpbmcocHJvZ05hbWUpOworCisgIGludCBleHRyYV9hcmdjID0gMTsKKyAgY2hhciAqKmV4dHJhX2FyZ3YgPSAoY2hhcioqKSBtYWxsb2MoMiAqIHNpemVvZihjaGFyKikpOworICBleHRyYV9hcmd2WzBdID0gTlVMTDsKKyAgZXh0cmFfYXJndlsxXSA9IE5VTEw7CisKKyAgaW50IGV4dHJhX29wdGluZCA9IDAsIG1haW5fb3B0aW5kID0gMDsKKyAgaW50IG9sZF9vcHRpbmQ7CisgIGludCAqb3B0aW5kX3JlZiA9ICZtYWluX29wdGluZDsKKworICBjaGFyKiogYXJndiA9IG1haW5fYXJndjsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbm9uT3B0aW9uczsKKworICBmb3IoOzspIHsKKyAgICBpbnQgYyA9IC0xOworICAgIG9wdG9wdCA9IDA7CisgICAgc3RkOjpzdHJpbmcgb3B0aW9uLCBvcHRpb25hcmc7CisgICAgRGVidWcoInByZWVtcHRHZXRvcHQiKSA8PCAidG9wIG9mIGxvb3AsIGV4dHJhX29wdGluZCA9PSAiIDw8IGV4dHJhX29wdGluZCA8PCAiLCBleHRyYV9hcmdjID09ICIgPDwgZXh0cmFfYXJnYyA8PCBzdGQ6OmVuZGw7CisgICAgaWYoKGV4dHJhX29wdGluZCA9PSAwID8gMSA6IGV4dHJhX29wdGluZCkgPCBleHRyYV9hcmdjKSB7CisjaWYgSEFWRV9ERUNMX09QVFJFU0VUCisgICAgICBpZihvcHRpbmRfcmVmICE9ICZleHRyYV9vcHRpbmQpIHsKKyAgICAgICAgb3B0cmVzZXQgPSAxOyAvLyBvbiBCU0QgZ2V0b3B0KCkgKGUuZy4gTWFjIE9TKSwgbWlnaHQgbmVlZCB0aGlzCisgICAgICB9CisjZW5kaWYgLyogSEFWRV9ERUNMX09QVFJFU0VUICovCisgICAgICBvbGRfb3B0aW5kID0gb3B0aW5kID0gZXh0cmFfb3B0aW5kOworICAgICAgb3B0aW5kX3JlZiA9ICZleHRyYV9vcHRpbmQ7CisgICAgICBhcmd2ID0gZXh0cmFfYXJndjsKKyAgICAgIERlYnVnKCJwcmVlbXB0R2V0b3B0IikgPDwgImluIHByZWVtcHQgY29kZSwgbmV4dCBhcmcgaXMgIiA8PCBleHRyYV9hcmd2W29wdGluZCA9PSAwID8gMSA6IG9wdGluZF0gPDwgc3RkOjplbmRsOworICAgICAgaWYoZXh0cmFfYXJndltleHRyYV9vcHRpbmQgPT0gMCA/IDEgOiBleHRyYV9vcHRpbmRdWzBdICE9ICctJykgeworICAgICAgICBJbnRlcm5hbEVycm9yKCJwcmVlbXB0ZWQgYXJncyBjYW5ub3QgZ2l2ZSBub24tb3B0aW9ucyBjb21tYW5kLWxpbmUgYXJncyAoZm91bmQgYCVzJykiLCBleHRyYV9hcmd2W2V4dHJhX29wdGluZCA9PSAwID8gMSA6IGV4dHJhX29wdGluZF0pOworICAgICAgfQorICAgICAgYyA9IGdldG9wdF9sb25nKGV4dHJhX2FyZ2MsIGV4dHJhX2FyZ3YsCisgICAgICAgICAgICAgICAgICAgICAgIis6JHthbGxfbW9kdWxlc19zaG9ydF9vcHRpb25zfSIsCisgICAgICAgICAgICAgICAgICAgICAgY21kbGluZU9wdGlvbnMsIE5VTEwpOworICAgICAgRGVidWcoInByZWVtcHRHZXRvcHQiKSA8PCAiaW4gcHJlZW1wdCBjb2RlLCBjID09ICIgPDwgYyA8PCAiIChgIiA8PCBjaGFyKGMpIDw8ICInKSBvcHRpbmQgPT0gIiA8PCBvcHRpbmQgPDwgc3RkOjplbmRsOworICAgICAgaWYob3B0b3B0ID09IDAgfHwKKyAgICAgICAgICggb3B0b3B0ID49ICR7bG9uZ19vcHRpb25fdmFsdWVfYmVnaW59ICYmIG9wdG9wdCA8PSAke2xvbmdfb3B0aW9uX3ZhbHVlX2VuZH0gKSkgeworICAgICAgICAvLyBsb25nIG9wdGlvbgorICAgICAgICBvcHRpb24gPSBhcmd2W29sZF9vcHRpbmQgPT0gMCA/IDEgOiBvbGRfb3B0aW5kXTsKKyAgICAgICAgb3B0aW9uYXJnID0gKG9wdGFyZyA9PSBOVUxMKSA/ICIiIDogb3B0YXJnOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gc2hvcnQgb3B0aW9uCisgICAgICAgIG9wdGlvbiA9IHN0ZDo6c3RyaW5nKCItIikgKyBjaGFyKG9wdG9wdCk7CisgICAgICAgIG9wdGlvbmFyZyA9IChvcHRhcmcgPT0gTlVMTCkgPyAiIiA6IG9wdGFyZzsKKyAgICAgIH0KKyAgICAgIGlmKG9wdGluZCA+PSBleHRyYV9hcmdjKSB7CisgICAgICAgIERlYnVnKCJwcmVlbXB0R2V0b3B0IikgPDwgIi0tIG5vIG1vcmUgcHJlZW1wdCBhcmdzIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHVuc2lnbmVkIGkgPSAxOworICAgICAgICB3aGlsZShleHRyYV9hcmd2W2ldICE9IE5VTEwgJiYgZXh0cmFfYXJndltpXVswXSAhPSAnXDAnKSB7CisgICAgICAgICAgZXh0cmFfYXJndltpXVswXSA9ICdcMCc7CisgICAgICAgICAgKytpOworICAgICAgICB9CisgICAgICAgIGV4dHJhX2FyZ2MgPSAxOworICAgICAgICBleHRyYV9vcHRpbmQgPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRGVidWcoInByZWVtcHRHZXRvcHQiKSA8PCAiLS0gbW9yZSBwcmVlbXB0IGFyZ3MiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgZXh0cmFfb3B0aW5kID0gb3B0aW5kOworICAgICAgfQorICAgIH0KKyAgICBpZihjID09IC0xKSB7CisjaWYgSEFWRV9ERUNMX09QVFJFU0VUCisgICAgICBpZihvcHRpbmRfcmVmICE9ICZtYWluX29wdGluZCkgeworICAgICAgICBvcHRyZXNldCA9IDE7IC8vIG9uIEJTRCBnZXRvcHQoKSAoZS5nLiBNYWMgT1MpLCBtaWdodCBuZWVkIHRoaXMKKyAgICAgIH0KKyNlbmRpZiAvKiBIQVZFX0RFQ0xfT1BUUkVTRVQgKi8KKyAgICAgIG9sZF9vcHRpbmQgPSBvcHRpbmQgPSBtYWluX29wdGluZDsKKyAgICAgIG9wdGluZF9yZWYgPSAmbWFpbl9vcHRpbmQ7CisgICAgICBhcmd2ID0gbWFpbl9hcmd2OworICAgICAgaWYobWFpbl9vcHRpbmQgPCBhcmdjICYmIG1haW5fYXJndlttYWluX29wdGluZF1bMF0gIT0gJy0nKSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICBpZihtYWluX29wdGluZCAhPSAwKSB7CisgICAgICAgICAgICBub25PcHRpb25zLnB1c2hfYmFjayhtYWluX2FyZ3ZbbWFpbl9vcHRpbmRdKTsKKyAgICAgICAgICB9CisgICAgICAgICAgKyttYWluX29wdGluZDsKKyAgICAgICAgfSB3aGlsZShtYWluX29wdGluZCA8IGFyZ2MgJiYgbWFpbl9hcmd2W21haW5fb3B0aW5kXVswXSAhPSAnLScpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIERlYnVnKCJvcHRpb25zIikgPDwgIlsgYmVmb3JlLCBvcHRpbmQgPT0gIiA8PCBvcHRpbmQgPDwgIiBdIiA8PCBzdGQ6OmVuZGw7CisjaWYgZGVmaW5lZChfX01JTkdXMzJfXykgfHwgZGVmaW5lZChfX01JTkdXNjRfXykKKyAgICAgIGlmKG9wdHJlc2V0ID09IDEgJiYgb3B0aW5kID4gMSkgeworICAgICAgICAvLyBvbiBtaW5ndywgb3B0cmVzZXQgd2lsbCByZXNldCB0aGUgb3B0aW5kLCBzbyB3ZSBoYXZlIHRvCisgICAgICAgIC8vIG1hbnVhbGx5IGFkdmFuY2UgYXJnYywgYXJndgorICAgICAgICBtYWluX2FyZ3Zbb3B0aW5kIC0gMV0gPSBtYWluX2FyZ3ZbMF07CisgICAgICAgIGFyZ3YgPSBtYWluX2FyZ3YgKz0gb3B0aW5kIC0gMTsKKyAgICAgICAgYXJnYyAtPSBvcHRpbmQgLSAxOworICAgICAgICBvbGRfb3B0aW5kID0gb3B0aW5kID0gbWFpbl9vcHRpbmQgPSAxOworICAgICAgICBpZihhcmdjID4gMCkgeworICAgICAgICAgIERlYnVnKCJvcHRpb25zIikgPDwgImxvb2tpbmcgYXQgOiAiIDw8IGFyZ3ZbMF0gPDwgc3RkOjplbmRsOworICAgICAgICB9CisgICAgICAgIC8qYyA9IGdldG9wdF9sb25nKGFyZ2MsIG1haW5fYXJndiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIrOiR7YWxsX21vZHVsZXNfc2hvcnRfb3B0aW9uc30iLAorICAgICAgICAgICAgICAgICAgICAgICAgY21kbGluZU9wdGlvbnMsIE5VTEwpOworICAgICAgICBEZWJ1Zygib3B0aW9ucyIpIDw8ICJwcmUtZW1wdG9yeSBjIGlzICIgPDwgYyA8PCAiICgiIDw8IGNoYXIoYykgPDwgIikiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgRGVidWcoIm9wdGlvbnMiKSA8PCAib3B0aW5kIHdhcyByZXNldCB0byAiIDw8IG9wdGluZCA8PCBzdGQ6OmVuZGw7CisgICAgICAgIG9wdGluZCA9IG1haW5fb3B0aW5kOworICAgICAgICBEZWJ1Zygib3B0aW9ucyIpIDw8ICJJIHJlc3RvcmVkIG9wdGluZCB0byAiIDw8IG9wdGluZCA8PCBzdGQ6OmVuZGw7Ki8KKyAgICAgIH0KKyNlbmRpZiAvKiBfX01JTkdXMzJfXyB8fCBfX01JTkdXNjRfXyAqLworICAgICAgRGVidWcoIm9wdGlvbnMiKSA8PCAiWyBhcmdjID09ICIgPDwgYXJnYyA8PCAiLCBtYWluX2FyZ3YgPT0gIiA8PCBtYWluX2FyZ3YgPDwgIiBdIiA8PCBzdGQ6OmVuZGw7CisgICAgICBjID0gZ2V0b3B0X2xvbmcoYXJnYywgbWFpbl9hcmd2LAorICAgICAgICAgICAgICAgICAgICAgICIrOiR7YWxsX21vZHVsZXNfc2hvcnRfb3B0aW9uc30iLAorICAgICAgICAgICAgICAgICAgICAgIGNtZGxpbmVPcHRpb25zLCBOVUxMKTsKKyAgICAgIG1haW5fb3B0aW5kID0gb3B0aW5kOworICAgICAgRGVidWcoIm9wdGlvbnMiKSA8PCAiWyBnb3QgIiA8PCBpbnQoYykgPDwgIiAoIiA8PCBjaGFyKGMpIDw8ICIpIF0iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIERlYnVnKCJvcHRpb25zIikgPDwgIlsgbmV4dCBvcHRpb24gd2lsbCBiZSBhdCBwb3M6ICIgPDwgb3B0aW5kIDw8ICIgXSIgPDwgc3RkOjplbmRsOworICAgICAgaWYoYyA9PSAtMSkgeworICAgICAgICBEZWJ1Zygib3B0aW9ucyIpIDw8ICJkb25lIHdpdGggb3B0aW9uIHBhcnNpbmciIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBvcHRpb24gPSBhcmd2W29sZF9vcHRpbmQgPT0gMCA/IDEgOiBvbGRfb3B0aW5kXTsKKyAgICAgIG9wdGlvbmFyZyA9IChvcHRhcmcgPT0gTlVMTCkgPyAiIiA6IG9wdGFyZzsKKyAgICB9CisKKyAgICBEZWJ1ZygicHJlZW1wdEdldG9wdCIpIDw8ICJwcm9jZXNzaW5nIG9wdGlvbiAiIDw8IGMgPDwgIiAoYCIgPDwgY2hhcihjKSA8PCAiJyksICIgPDwgb3B0aW9uIDw8IHN0ZDo6ZW5kbDsKKworICAgIHN3aXRjaChjKSB7Ciske2FsbF9tb2R1bGVzX29wdGlvbl9oYW5kbGVyc30KKworI2xpbmUgNTExICIke3RlbXBsYXRlfSIKKworICAgIGNhc2UgJzonOgorICAgICAgLy8gVGhpcyBjYW4gYmUgYSBsb25nIG9yIHNob3J0IG9wdGlvbiwgYW5kIHRoZSB3YXkgdG8gZ2V0IGF0IHRoZQorICAgICAgLy8gbmFtZSBvZiBpdCBpcyBkaWZmZXJlbnQuCisgICAgICB0aHJvdyBPcHRpb25FeGNlcHRpb24oc3RkOjpzdHJpbmcoIm9wdGlvbiBgIikgKyBvcHRpb24gKyAiJyBtaXNzaW5nIGl0cyByZXF1aXJlZCBhcmd1bWVudCIpOworCisgICAgY2FzZSAnPyc6CisgICAgZGVmYXVsdDoKKyAgICAgIGlmKCAoIG9wdG9wdCA9PSAwIHx8ICggb3B0b3B0ID49ICR7bG9uZ19vcHRpb25fdmFsdWVfYmVnaW59ICYmIG9wdG9wdCA8PSAke2xvbmdfb3B0aW9uX3ZhbHVlX2VuZH0gKSApICYmCisgICAgICAgICAgIXN0cm5jbXAoYXJndltvcHRpbmQgLSAxXSwgIi0tdGhyZWFkIiwgOCkgJiYKKyAgICAgICAgICBzdHJsZW4oYXJndltvcHRpbmQgLSAxXSkgPiA4ICkgeworICAgICAgICBpZighIGlzZGlnaXQoYXJndltvcHRpbmQgLSAxXVs4XSkpIHsKKyAgICAgICAgICB0aHJvdyBPcHRpb25FeGNlcHRpb24oc3RkOjpzdHJpbmcoImNhbid0IHVuZGVyc3RhbmQgb3B0aW9uIGAiKSArIG9wdGlvbiArICInOiBleHBlY3RlZCBzb21ldGhpbmcgbGlrZSAtLXRocmVhZE49XCItLW9wdGlvbjEgLS1vcHRpb24yXCIsIHdoZXJlIE4gaXMgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIik7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiB0aHJlYWRBcmd2ID0gZF9ob2xkZXItPnRocmVhZEFyZ3Y7CisgICAgICAgIGNoYXIgKmVuZDsKKyAgICAgICAgbG9uZyB0bnVtID0gc3RydG9sKGFyZ3Zbb3B0aW5kIC0gMV0gKyA4LCAmZW5kLCAxMCk7CisgICAgICAgIGlmKHRudW0gPCAwIHx8ICgqZW5kICE9ICdcMCcgJiYgKmVuZCAhPSAnPScpKSB7CisgICAgICAgICAgdGhyb3cgT3B0aW9uRXhjZXB0aW9uKHN0ZDo6c3RyaW5nKCJjYW4ndCB1bmRlcnN0YW5kIG9wdGlvbiBgIikgKyBvcHRpb24gKyAiJzogZXhwZWN0ZWQgc29tZXRoaW5nIGxpa2UgLS10aHJlYWROPVwiLS1vcHRpb24xIC0tb3B0aW9uMlwiLCB3aGVyZSBOIGlzIGEgbm9ubmVnYXRpdmUgaW50ZWdlciIpOworICAgICAgICB9CisgICAgICAgIGlmKHRocmVhZEFyZ3Yuc2l6ZSgpIDw9IHNpemVfdCh0bnVtKSkgeworICAgICAgICAgIHRocmVhZEFyZ3YucmVzaXplKHRudW0gKyAxKTsKKyAgICAgICAgfQorICAgICAgICBpZih0aHJlYWRBcmd2W3RudW1dICE9ICIiKSB7CisgICAgICAgICAgdGhyZWFkQXJndlt0bnVtXSArPSAiICI7CisgICAgICAgIH0KKyAgICAgICAgaWYoKmVuZCA9PSAnXDAnKSB7IC8vIGUuZy4sIHdlIGhhdmUgLS10aHJlYWQwICJmb28iCisgICAgICAgICAgaWYoYXJnYyA8PSBvcHRpbmQpIHsKKyAgICAgICAgICAgIHRocm93IE9wdGlvbkV4Y2VwdGlvbihzdGQ6OnN0cmluZygib3B0aW9uIGAiKSArIG9wdGlvbiArICInIG1pc3NpbmcgaXRzIHJlcXVpcmVkIGFyZ3VtZW50Iik7CisgICAgICAgICAgfQorICAgICAgICAgIERlYnVnKCJvcHRpb25zIikgPDwgInRocmVhZCAiIDw8IHRudW0gPDwgIiBnZXRzIG9wdGlvbiAiIDw8IGFyZ3Zbb3B0aW5kXSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgdGhyZWFkQXJndlt0bnVtXSArPSBhcmd2Wygqb3B0aW5kX3JlZikrK107CisgICAgICAgIH0gZWxzZSB7IC8vIGUuZy4sIHdlIGhhdmUgLS10aHJlYWQwPSJmb28iCisgICAgICAgICAgaWYoZW5kWzFdID09ICdcMCcpIHsKKyAgICAgICAgICAgIHRocm93IE9wdGlvbkV4Y2VwdGlvbihzdGQ6OnN0cmluZygib3B0aW9uIGAiKSArIG9wdGlvbiArICInIG1pc3NpbmcgaXRzIHJlcXVpcmVkIGFyZ3VtZW50Iik7CisgICAgICAgICAgfQorICAgICAgICAgIERlYnVnKCJvcHRpb25zIikgPDwgInRocmVhZCAiIDw8IHRudW0gPDwgIiBnZXRzIG9wdGlvbiAiIDw8IChlbmQgKyAxKSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgdGhyZWFkQXJndlt0bnVtXSArPSBlbmQgKyAxOworICAgICAgICB9CisgICAgICAgIERlYnVnKCJvcHRpb25zIikgPDwgInRocmVhZCAiIDw8IHRudW0gPDwgIiBub3cgaGFzICIgPDwgdGhyZWFkQXJndlt0bnVtXSA8PCBzdGQ6OmVuZGw7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICB0aHJvdyBPcHRpb25FeGNlcHRpb24oc3RkOjpzdHJpbmcoImNhbid0IHVuZGVyc3RhbmQgb3B0aW9uIGAiKSArIG9wdGlvbiArICInIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3VnZ2VzdENvbW1hbmRMaW5lT3B0aW9ucyhvcHRpb24pKTsKKyAgICB9CisgIH0KKworICBEZWJ1Zygib3B0aW9ucyIpIDw8ICJyZXR1cm5pbmcgIiA8PCBub25PcHRpb25zLnNpemUoKSA8PCAiIG5vbi1vcHRpb24gYXJndW1lbnRzLiIgPDwgc3RkOjplbmRsOworCisgIGZyZWUoZXh0cmFfYXJndik7CisKKyAgcmV0dXJuIG5vbk9wdGlvbnM7Cit9CisKK3N0ZDo6c3RyaW5nIE9wdGlvbnM6OnN1Z2dlc3RDb21tYW5kTGluZU9wdGlvbnMoY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbk5hbWUpIHRocm93KCkgeworICBEaWRZb3VNZWFuIGRpZFlvdU1lYW47CisKKyAgY29uc3QgY2hhciogb3B0OworICBmb3Ioc2l6ZV90IGkgPSAwOyAob3B0ID0gY21kbGluZU9wdGlvbnNbaV0ubmFtZSkgIT0gTlVMTDsgKytpKSB7CisgICAgZGlkWW91TWVhbi5hZGRXb3JkKHN0ZDo6c3RyaW5nKCItLSIpICsgY21kbGluZU9wdGlvbnNbaV0ubmFtZSk7CisgIH0KKworICByZXR1cm4gZGlkWW91TWVhbi5nZXRNYXRjaEFzU3RyaW5nKG9wdGlvbk5hbWUuc3Vic3RyKDAsIG9wdGlvbk5hbWUuZmluZCgnPScpKSk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKiBzbXRPcHRpb25zW10gPSB7CisgICR7YWxsX21vZHVsZXNfc210X29wdGlvbnN9LAorI2xpbmUgNTgwICIke3RlbXBsYXRlfSIKKyAgTlVMTAorfTsvKiBzbXRPcHRpb25zW10gKi8KKworc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IE9wdGlvbnM6OnN1Z2dlc3RTbXRPcHRpb25zKGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25OYW1lKSB0aHJvdygpIHsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN1Z2dlc3Rpb25zOworCisgIGNvbnN0IGNoYXIqIG9wdDsKKyAgZm9yKHNpemVfdCBpID0gMDsgKG9wdCA9IHNtdE9wdGlvbnNbaV0pICE9IE5VTEw7ICsraSkgeworICAgIGlmKHN0ZDo6c3Ryc3RyKG9wdCwgb3B0aW9uTmFtZS5jX3N0cigpKSAhPSBOVUxMKSB7CisgICAgICBzdWdnZXN0aW9ucy5wdXNoX2JhY2sob3B0KTsKKyAgICB9CisgIH0KKworICByZXR1cm4gc3VnZ2VzdGlvbnM7Cit9CisKK1NFeHByIE9wdGlvbnM6OmdldE9wdGlvbnMoKSBjb25zdCB0aHJvdygpIHsKKyAgc3RkOjp2ZWN0b3I8U0V4cHI+IG9wdHM7CisKKyAgJHthbGxfbW9kdWxlc19nZXRfb3B0aW9uc30KKworI2xpbmUgNjAyICIke3RlbXBsYXRlfSIKKworICByZXR1cm4gU0V4cHIob3B0cyk7Cit9CisKKyN1bmRlZiBVU0VfRUFSTFlfVFlQRV9DSEVDS0lOR19CWV9ERUZBVUxUCisjdW5kZWYgRE9fU0VNQU5USUNfQ0hFQ0tTX0JZX0RFRkFVTFQKKworfS8qIENWQzQgbmFtZXNwYWNlICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL2N2YzQtMS40LXBhdGNoL3V0aWwvaW50ZWdlcl9nbXBfaW1wLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL2N2YzQtMS40LXBhdGNoL3V0aWwvaW50ZWdlcl9nbXBfaW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQxNmI3ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvY3ZjNC0xLjQtcGF0Y2gvdXRpbC9pbnRlZ2VyX2dtcF9pbXAuaApAQCAtMCwwICsxLDUyMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qISBcZmlsZSBpbnRlZ2VyX2dtcF9pbXAuaAorICoqIFx2ZXJiYXRpbQorICoqIE9yaWdpbmFsIGF1dGhvcjogVGltIEtpbmcKKyAqKiBNYWpvciBjb250cmlidXRvcnM6IE1vcmdhbiBEZXRlcnMsIExpYW5hIEhhZGFyZWFuCisgKiogTWlub3IgY29udHJpYnV0b3JzICh0byBjdXJyZW50IHZlcnNpb24pOiBEZWphbiBKb3Zhbm92aWMKKyAqKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQ1ZDNCBwcm9qZWN0LgorICoqIENvcHlyaWdodCAoYykgMjAwOS0yMDE0ICBOZXcgWW9yayBVbml2ZXJzaXR5IGFuZCBUaGUgVW5pdmVyc2l0eSBvZiBJb3dhCisgKiogU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIHRvcC1sZXZlbCBzb3VyY2UgZGlyZWN0b3J5IGZvciBsaWNlbnNpbmcKKyAqKiBpbmZvcm1hdGlvbi5cZW5kdmVyYmF0aW0KKyAqKgorICoqIFxicmllZiBBIG11bHRpcHJlY2lzaW9uIGludGVnZXIgY29uc3RhbnQ7IHdyYXBzIGEgR01QIG11bHRpcHJlY2lzaW9uCisgKiogaW50ZWdlci4KKyAqKgorICoqIEEgbXVsdGlwcmVjaXNpb24gaW50ZWdlciBjb25zdGFudDsgd3JhcHMgYSBHTVAgbXVsdGlwcmVjaXNpb24gaW50ZWdlci4KKyAqKi8KKworI2luY2x1ZGUgImN2YzRfcHVibGljLmgiCisKKyNpZm5kZWYgX19DVkM0X19JTlRFR0VSX0gKKyNkZWZpbmUgX19DVkM0X19JTlRFR0VSX0gKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpbmNsdWRlICJ1dGlsL2dtcF91dGlsLmgiCisjaW5jbHVkZSAidXRpbC9leGNlcHRpb24uaCIKKworbmFtZXNwYWNlIENWQzQgeworCitjbGFzcyBSYXRpb25hbDsKKworY2xhc3MgQ1ZDNF9QVUJMSUMgSW50ZWdlciB7Citwcml2YXRlOgorICAvKioKKyAgICogU3RvcmVzIHRoZSB2YWx1ZSBvZiB0aGUgcmF0aW9uYWwgaXMgc3RvcmVkIGluIGEgQysrIEdNUCBpbnRlZ2VyIGNsYXNzLgorICAgKiBVc2luZyB0aGlzIGluc3RlYWQgb2YgbXB6X3QgYWxsb3dzIGZvciBlYXNpZXIgZGVzdHJ1Y3Rpb24uCisgICAqLworICBtcHpfY2xhc3MgZF92YWx1ZTsKKworcHVibGljOgorCisgIC8qKgorICAgKiBHZXRzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbXAgZGF0YSB0aGF0IGJhY2tzIHVwIHRoZSBpbnRlZ2VyLgorICAgKiBPbmx5IGFjY2Vzc2libGUgdG8gZnJpZW5kIGNsYXNzZXMuCisgICAqLworICBjb25zdCBtcHpfY2xhc3MmIGdldF9tcHooKSBjb25zdCB7IHJldHVybiBkX3ZhbHVlOyB9CisKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYW4gSW50ZWdlciBieSBjb3B5aW5nIGEgR01QIEMrKyBwcmltaXRpdmUuCisgICAqLworICBJbnRlZ2VyKGNvbnN0IG1wel9jbGFzcyYgdmFsKSA6IGRfdmFsdWUodmFsKSB7fQorCisgIC8qKiBDb25zdHJ1Y3RzIGEgcmF0aW9uYWwgd2l0aCB0aGUgdmFsdWUgMC4gKi8KKyAgSW50ZWdlcigpIDogZF92YWx1ZSgwKXt9CisKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBJbnRlZ2VyIGZyb20gYSBDIHN0cmluZy4KKyAgICogVGhyb3dzIHN0ZDo6aW52YWxpZF9hcmd1bWVudCBpZiB0aGUgc3RyaW5nIGlzIG5vdCBhIHZhbGlkIHJhdGlvbmFsLgorICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IGlzIGEgdmFsaWQgcmF0aW9uYWwgc3RyaW5nLAorICAgKiBzZWUgR01QJ3MgZG9jdW1lbnRhdGlvbiBmb3IgbXBxX3NldF9zdHIoKS4KKyAgICovCisgIGV4cGxpY2l0IEludGVnZXIoY29uc3QgY2hhciogcywgdW5zaWduZWQgYmFzZSA9IDEwKTsKKyAgZXhwbGljaXQgSW50ZWdlcihjb25zdCBzdGQ6OnN0cmluZyYgcywgdW5zaWduZWQgYmFzZSA9IDEwKTsKKworICBJbnRlZ2VyKGNvbnN0IEludGVnZXImIHEpIDogZF92YWx1ZShxLmRfdmFsdWUpIHt9CisKKyAgSW50ZWdlciggIHNpZ25lZCBpbnQgeikgOiBkX3ZhbHVlKHopIHt9CisgIEludGVnZXIodW5zaWduZWQgaW50IHopIDogZF92YWx1ZSh6KSB7fQorICBJbnRlZ2VyKCAgc2lnbmVkIGxvbmcgaW50IHopIDogZF92YWx1ZSh6KSB7fQorICBJbnRlZ2VyKHVuc2lnbmVkIGxvbmcgaW50IHopIDogZF92YWx1ZSh6KSB7fQorCisjaWZkZWYgQ1ZDNF9ORUVEX0lOVDY0X1RfT1ZFUkxPQURTCisgIEludGVnZXIoIGludDY0X3QgeikgOiBkX3ZhbHVlKHN0YXRpY19jYXN0PGxvbmc+KHopKSB7fQorICBJbnRlZ2VyKHVpbnQ2NF90IHopIDogZF92YWx1ZShzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPih6KSkge30KKyNlbmRpZiAvKiBDVkM0X05FRURfSU5UNjRfVF9PVkVSTE9BRFMgKi8KKworICB+SW50ZWdlcigpIHt9CisKKyAgSW50ZWdlciYgb3BlcmF0b3I9KGNvbnN0IEludGVnZXImIHgpeworICAgIGlmKHRoaXMgPT0gJngpIHJldHVybiAqdGhpczsKKyAgICBkX3ZhbHVlID0geC5kX3ZhbHVlOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJbnRlZ2VyJiB5KSBjb25zdCB7CisgICAgcmV0dXJuIGRfdmFsdWUgPT0geS5kX3ZhbHVlOworICB9CisKKyAgSW50ZWdlciBvcGVyYXRvci0oKSBjb25zdCB7CisgICAgcmV0dXJuIEludGVnZXIoLShkX3ZhbHVlKSk7CisgIH0KKworCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBJbnRlZ2VyJiB5KSBjb25zdCB7CisgICAgcmV0dXJuIGRfdmFsdWUgIT0geS5kX3ZhbHVlOworICB9CisKKyAgYm9vbCBvcGVyYXRvcjwgKGNvbnN0IEludGVnZXImIHkpIGNvbnN0IHsKKyAgICByZXR1cm4gZF92YWx1ZSA8IHkuZF92YWx1ZTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I8PShjb25zdCBJbnRlZ2VyJiB5KSBjb25zdCB7CisgICAgcmV0dXJuIGRfdmFsdWUgPD0geS5kX3ZhbHVlOworICB9CisKKyAgYm9vbCBvcGVyYXRvcj4gKGNvbnN0IEludGVnZXImIHkpIGNvbnN0IHsKKyAgICByZXR1cm4gZF92YWx1ZSA+IHkuZF92YWx1ZTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I+PShjb25zdCBJbnRlZ2VyJiB5KSBjb25zdCB7CisgICAgcmV0dXJuIGRfdmFsdWUgPj0geS5kX3ZhbHVlOworICB9CisKKworICBJbnRlZ2VyIG9wZXJhdG9yKyhjb25zdCBJbnRlZ2VyJiB5KSBjb25zdCB7CisgICAgcmV0dXJuIEludGVnZXIoIGRfdmFsdWUgKyB5LmRfdmFsdWUgKTsKKyAgfQorICBJbnRlZ2VyJiBvcGVyYXRvcis9KGNvbnN0IEludGVnZXImIHkpIHsKKyAgICBkX3ZhbHVlICs9IHkuZF92YWx1ZTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBJbnRlZ2VyIG9wZXJhdG9yLShjb25zdCBJbnRlZ2VyJiB5KSBjb25zdCB7CisgICAgcmV0dXJuIEludGVnZXIoIGRfdmFsdWUgLSB5LmRfdmFsdWUgKTsKKyAgfQorICBJbnRlZ2VyJiBvcGVyYXRvci09KGNvbnN0IEludGVnZXImIHkpIHsKKyAgICBkX3ZhbHVlIC09IHkuZF92YWx1ZTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBJbnRlZ2VyIG9wZXJhdG9yKihjb25zdCBJbnRlZ2VyJiB5KSBjb25zdCB7CisgICAgcmV0dXJuIEludGVnZXIoIGRfdmFsdWUgKiB5LmRfdmFsdWUgKTsKKyAgfQorICBJbnRlZ2VyJiBvcGVyYXRvcio9KGNvbnN0IEludGVnZXImIHkpIHsKKyAgICBkX3ZhbHVlICo9IHkuZF92YWx1ZTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworCisgIEludGVnZXIgYml0d2lzZU9yKGNvbnN0IEludGVnZXImIHkpIGNvbnN0IHsKKyAgICBtcHpfY2xhc3MgcmVzdWx0OworICAgIG1wel9pb3IocmVzdWx0LmdldF9tcHpfdCgpLCBkX3ZhbHVlLmdldF9tcHpfdCgpLCB5LmRfdmFsdWUuZ2V0X21wel90KCkpOworICAgIHJldHVybiBJbnRlZ2VyKHJlc3VsdCk7CisgIH0KKworICBJbnRlZ2VyIGJpdHdpc2VBbmQoY29uc3QgSW50ZWdlciYgeSkgY29uc3QgeworICAgIG1wel9jbGFzcyByZXN1bHQ7CisgICAgbXB6X2FuZChyZXN1bHQuZ2V0X21wel90KCksIGRfdmFsdWUuZ2V0X21wel90KCksIHkuZF92YWx1ZS5nZXRfbXB6X3QoKSk7CisgICAgcmV0dXJuIEludGVnZXIocmVzdWx0KTsKKyAgfQorCisgIEludGVnZXIgYml0d2lzZVhvcihjb25zdCBJbnRlZ2VyJiB5KSBjb25zdCB7CisgICAgbXB6X2NsYXNzIHJlc3VsdDsKKyAgICBtcHpfeG9yKHJlc3VsdC5nZXRfbXB6X3QoKSwgZF92YWx1ZS5nZXRfbXB6X3QoKSwgeS5kX3ZhbHVlLmdldF9tcHpfdCgpKTsKKyAgICByZXR1cm4gSW50ZWdlcihyZXN1bHQpOworICB9CisKKyAgSW50ZWdlciBiaXR3aXNlTm90KCkgY29uc3QgeworICAgIG1wel9jbGFzcyByZXN1bHQ7CisgICAgbXB6X2NvbShyZXN1bHQuZ2V0X21wel90KCksIGRfdmFsdWUuZ2V0X21wel90KCkpOworICAgIHJldHVybiBJbnRlZ2VyKHJlc3VsdCk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJuIHRoaXMqKDJecG93KS4KKyAgICovCisgIEludGVnZXIgbXVsdGlwbHlCeVBvdzIodWludDMyX3QgcG93KSBjb25zdHsKKyAgICBtcHpfY2xhc3MgcmVzdWx0OworICAgIG1wel9tdWxfMmV4cChyZXN1bHQuZ2V0X21wel90KCksIGRfdmFsdWUuZ2V0X21wel90KCksIHBvdyk7CisgICAgcmV0dXJuIEludGVnZXIoIHJlc3VsdCApOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIEludGVnZXIgb2J0YWluZWQgYnkgc2V0dGluZyB0aGUgaXRoIGJpdCBvZiB0aGUKKyAgICogY3VycmVudCBJbnRlZ2VyIHRvIDEuCisgICAqLworICBJbnRlZ2VyIHNldEJpdCh1aW50MzJfdCBpKSBjb25zdCB7CisgICAgbXB6X2NsYXNzIHJlcyA9IGRfdmFsdWU7CisgICAgbXB6X3NldGJpdChyZXMuZ2V0X21wel90KCksIGkpOworICAgIHJldHVybiBJbnRlZ2VyKHJlcyk7CisgIH0KKworICBib29sIGlzQml0U2V0KHVpbnQzMl90IGkpIGNvbnN0IHsKKyAgICByZXR1cm4gIWV4dHJhY3RCaXRSYW5nZSgxLCBpKS5pc1plcm8oKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBpbnRlZ2VyIHdpdGggdGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiBzaXplIGJpdHMKKyAgICogZXh0ZW5kZWQgd2l0aCBhbW91bnQgMSdzCisgICAqLworICBJbnRlZ2VyIG9uZUV4dGVuZCh1aW50MzJfdCBzaXplLCB1aW50MzJfdCBhbW91bnQpIGNvbnN0IHsKKyAgICAvLyBjaGVjayB0aGF0IHRoZSBzaXplIGlzIGFjY3VyYXRlCisgICAgRGVidWdDaGVja0FyZ3VtZW50KCgqdGhpcykgPCBJbnRlZ2VyKDEpLm11bHRpcGx5QnlQb3cyKHNpemUpLCBzaXplKTsKKyAgICBtcHpfY2xhc3MgcmVzID0gZF92YWx1ZTsKKworICAgIGZvciAodW5zaWduZWQgaSA9IHNpemU7IGkgPCBzaXplICsgYW1vdW50OyArK2kpIHsKKyAgICAgIG1wel9zZXRiaXQocmVzLmdldF9tcHpfdCgpLCBpKTsKKyAgICB9CisKKyAgICByZXR1cm4gSW50ZWdlcihyZXMpOworICB9CisKKyAgdWludDMyX3QgdG9VbnNpZ25lZEludCgpIGNvbnN0IHsKKyAgICByZXR1cm4gIG1wel9nZXRfdWkoZF92YWx1ZS5nZXRfbXB6X3QoKSk7CisgIH0KKworICAvKiogU2VlIEdNUCBEb2N1bWVudGF0aW9uLiAqLworICBJbnRlZ2VyIGV4dHJhY3RCaXRSYW5nZSh1aW50MzJfdCBiaXRDb3VudCwgdWludDMyX3QgbG93KSBjb25zdCB7CisgICAgLy8gYml0Q291bnQgPSBoaWdoLWxvdysxCisgICAgdWludDMyX3QgaGlnaCA9IGxvdyArIGJpdENvdW50LTE7CisgICAgLy/igJQgRnVuY3Rpb246IHZvaWQgbXB6X2ZkaXZfcl8yZXhwIChtcHpfdCByLCBtcHpfdCBuLCBtcF9iaXRjbnRfdCBiKQorICAgIG1wel9jbGFzcyByZW0sIGRpdjsKKyAgICBtcHpfZmRpdl9yXzJleHAocmVtLmdldF9tcHpfdCgpLCBkX3ZhbHVlLmdldF9tcHpfdCgpLCBoaWdoKzEpOworICAgIG1wel9mZGl2X3FfMmV4cChkaXYuZ2V0X21wel90KCksIHJlbS5nZXRfbXB6X3QoKSwgbG93KTsKKworICAgIHJldHVybiBJbnRlZ2VyKGRpdik7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgZmxvb3IodGhpcyAvIHkpCisgICAqLworICBJbnRlZ2VyIGZsb29yRGl2aWRlUXVvdGllbnQoY29uc3QgSW50ZWdlciYgeSkgY29uc3QgeworICAgIG1wel9jbGFzcyBxOworICAgIG1wel9mZGl2X3EocS5nZXRfbXB6X3QoKSwgZF92YWx1ZS5nZXRfbXB6X3QoKSwgeS5kX3ZhbHVlLmdldF9tcHpfdCgpKTsKKyAgICByZXR1cm4gSW50ZWdlciggcSApOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgciA9PSB0aGlzIC0gZmxvb3IodGhpcy95KSp5CisgICAqLworICBJbnRlZ2VyIGZsb29yRGl2aWRlUmVtYWluZGVyKGNvbnN0IEludGVnZXImIHkpIGNvbnN0IHsKKyAgICBtcHpfY2xhc3MgcjsKKyAgICBtcHpfZmRpdl9yKHIuZ2V0X21wel90KCksIGRfdmFsdWUuZ2V0X21wel90KCksIHkuZF92YWx1ZS5nZXRfbXB6X3QoKSk7CisgICAgcmV0dXJuIEludGVnZXIoIHIgKTsKKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlcyBhIGZsb29yIHF1b3RpZW50IGFuZCByZW1haW5kZXIgZm9yIHggZGl2aWRlZCBieSB5LgorICAgKi8KKyAgc3RhdGljIHZvaWQgZmxvb3JRUihJbnRlZ2VyJiBxLCBJbnRlZ2VyJiByLCBjb25zdCBJbnRlZ2VyJiB4LCBjb25zdCBJbnRlZ2VyJiB5KSB7CisgICAgbXB6X2ZkaXZfcXIocS5kX3ZhbHVlLmdldF9tcHpfdCgpLCByLmRfdmFsdWUuZ2V0X21wel90KCksIHguZF92YWx1ZS5nZXRfbXB6X3QoKSwgeS5kX3ZhbHVlLmdldF9tcHpfdCgpKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBjZWlsKHRoaXMgLyB5KQorICAgKi8KKyAgSW50ZWdlciBjZWlsaW5nRGl2aWRlUXVvdGllbnQoY29uc3QgSW50ZWdlciYgeSkgY29uc3QgeworICAgIG1wel9jbGFzcyBxOworICAgIG1wel9jZGl2X3EocS5nZXRfbXB6X3QoKSwgZF92YWx1ZS5nZXRfbXB6X3QoKSwgeS5kX3ZhbHVlLmdldF9tcHpfdCgpKTsKKyAgICByZXR1cm4gSW50ZWdlciggcSApOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGNlaWwodGhpcyAvIHkpCisgICAqLworICBJbnRlZ2VyIGNlaWxpbmdEaXZpZGVSZW1haW5kZXIoY29uc3QgSW50ZWdlciYgeSkgY29uc3QgeworICAgIG1wel9jbGFzcyByOworICAgIG1wel9jZGl2X3Ioci5nZXRfbXB6X3QoKSwgZF92YWx1ZS5nZXRfbXB6X3QoKSwgeS5kX3ZhbHVlLmdldF9tcHpfdCgpKTsKKyAgICByZXR1cm4gSW50ZWdlciggciApOworICB9CisKKyAgLyoqCisgICAqIENvbXB1dGVzIGEgcXVvaXRlbnQgYW5kIHJlbWFpbmRlciBhY2NvcmRpbmcgdG8gQm91dGUncyBFdWNsaWRlYW4gZGVmaW5pdGlvbi4KKyAgICogZXVjbGlkaWFuRGl2aWRlUXVvdGllbnQsIGV1Y2xpZGlhbkRpdmlkZVJlbWFpbmRlci4KKyAgICoKKyAgICogQm91dGUsIFJheW1vbmQgVC4gKEFwcmlsIDE5OTIpLgorICAgKiBUaGUgRXVjbGlkZWFuIGRlZmluaXRpb24gb2YgdGhlIGZ1bmN0aW9ucyBkaXYgYW5kIG1vZC4KKyAgICogQUNNIFRyYW5zYWN0aW9ucyBvbiBQcm9ncmFtbWluZyBMYW5ndWFnZXMgYW5kIFN5c3RlbXMgKFRPUExBUykKKyAgICogQUNNIFByZXNzLiAxNCAoMik6IDEyNyAtIDE0NC4gZG9pOjEwLjExNDUvMTI4ODYxLjEyODg2Mi4KKyAgICovCisgIHN0YXRpYyB2b2lkIGV1Y2xpZGlhblFSKEludGVnZXImIHEsIEludGVnZXImIHIsIGNvbnN0IEludGVnZXImIHgsIGNvbnN0IEludGVnZXImIHkpIHsKKyAgICAvLyBjb21wdXRlIHRoZSBmbG9vciBhbmQgdGhlbiBmaXggdGhlIHZhbHVlIHVwIGlmIG5lZWRlZC4KKyAgICBmbG9vclFSKHEscix4LHkpOworCisgICAgaWYoci5zdHJpY3RseU5lZ2F0aXZlKCkpeworICAgICAgLy8gaWYgciA8IDAKKyAgICAgIC8vIGFicyhyKSA8IGFicyh5KQorICAgICAgLy8gLSBhYnMoeSkgPCByIDwgMCwgdGhlbiAwIDwgciArIGFicyh5KSA8IGFicyh5KQorICAgICAgLy8gbiA9IHkgKiBxICsgcgorICAgICAgLy8gbiA9IHkgKiBxIC0gYWJzKHkpICsgciArIGFicyh5KQorICAgICAgaWYoci5zZ24oKSA+PSAwKXsKKyAgICAgICAgLy8geSA9IGFicyh5KQorICAgICAgICAvLyBuID0geSAqIHEgLSB5ICsgciArIHkKKyAgICAgICAgLy8gbiA9IHkgKiAocS0xKSArIChyK3kpCisgICAgICAgIHEgLT0gMTsKKyAgICAgICAgciArPSB5OworICAgICAgfWVsc2V7CisgICAgICAgIC8vIHkgPSAtYWJzKHkpCisgICAgICAgIC8vIG4gPSB5ICogcSArIHkgKyByIC0geQorICAgICAgICAvLyBuID0geSAqIChxKzEpICsgKHIteSkKKyAgICAgICAgcSArPSAxOworICAgICAgICByIC09IHk7CisgICAgICB9CisgICAgfQorICB9CisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBxdW9pdGVudCBhY2NvcmRpbmcgdG8gQm91dGUncyBFdWNsaWRlYW4gZGVmaW5pdGlvbi4KKyAgICogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBldWNsaWRpYW5RUi4KKyAgICovCisgIEludGVnZXIgZXVjbGlkaWFuRGl2aWRlUXVvdGllbnQoY29uc3QgSW50ZWdlciYgeSkgY29uc3QgeworICAgIEludGVnZXIgcSxyOworICAgIGV1Y2xpZGlhblFSKHEsciwgKnRoaXMsIHkpOworICAgIHJldHVybiBxOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIHJlbWFpbmZpbmcgYWNjb3JkaW5nIHRvIEJvdXRlJ3MgRXVjbGlkZWFuIGRlZmluaXRpb24uCisgICAqIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgZXVjbGlkaWFuUVIuCisgICAqLworICBJbnRlZ2VyIGV1Y2xpZGlhbkRpdmlkZVJlbWFpbmRlcihjb25zdCBJbnRlZ2VyJiB5KSBjb25zdCB7CisgICAgSW50ZWdlciBxLHI7CisgICAgZXVjbGlkaWFuUVIocSxyLCAqdGhpcywgeSk7CisgICAgcmV0dXJuIHI7CisgIH0KKworCisgIC8qKgorICAgKiBJZiB5IGRpdmlkZXMgKnRoaXMsIHRoZW4gZXhhY3RRdW90aWVudCByZXR1cm5zICh0aGlzL3kpCisgICAqLworICBJbnRlZ2VyIGV4YWN0UXVvdGllbnQoY29uc3QgSW50ZWdlciYgeSkgY29uc3QgeworICAgIERlYnVnQ2hlY2tBcmd1bWVudCh5LmRpdmlkZXMoKnRoaXMpLCB5KTsKKyAgICBtcHpfY2xhc3MgcTsKKyAgICBtcHpfZGl2ZXhhY3QocS5nZXRfbXB6X3QoKSwgZF92YWx1ZS5nZXRfbXB6X3QoKSwgeS5kX3ZhbHVlLmdldF9tcHpfdCgpKTsKKyAgICByZXR1cm4gSW50ZWdlciggcSApOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgeSBtb2QgMl5leHAKKyAgICovCisgIEludGVnZXIgbW9kQnlQb3cyKHVpbnQzMl90IGV4cCkgY29uc3QgeworICAgIG1wel9jbGFzcyByZXM7CisgICAgbXB6X2ZkaXZfcl8yZXhwKHJlcy5nZXRfbXB6X3QoKSwgZF92YWx1ZS5nZXRfbXB6X3QoKSwgZXhwKTsKKyAgICByZXR1cm4gSW50ZWdlcihyZXMpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgeSAvIDJeZXhwCisgICAqLworICBJbnRlZ2VyIGRpdkJ5UG93Mih1aW50MzJfdCBleHApIGNvbnN0IHsKKyAgICBtcHpfY2xhc3MgcmVzOworICAgIG1wel9mZGl2X3FfMmV4cChyZXMuZ2V0X21wel90KCksIGRfdmFsdWUuZ2V0X21wel90KCksIGV4cCk7CisgICAgcmV0dXJuIEludGVnZXIocmVzKTsKKyAgfQorCisKKyAgaW50IHNnbigpIGNvbnN0IHsKKyAgICByZXR1cm4gbXB6X3NnbihkX3ZhbHVlLmdldF9tcHpfdCgpKTsKKyAgfQorCisgIGlubGluZSBib29sIHN0cmljdGx5UG9zaXRpdmUoKSBjb25zdCB7CisgICAgcmV0dXJuIHNnbigpID4gMDsKKyAgfQorCisgIGlubGluZSBib29sIHN0cmljdGx5TmVnYXRpdmUoKSBjb25zdCB7CisgICAgcmV0dXJuIHNnbigpIDwgMDsKKyAgfQorCisgIGlubGluZSBib29sIGlzWmVybygpIGNvbnN0IHsKKyAgICByZXR1cm4gc2duKCkgPT0gMDsKKyAgfQorCisgIGJvb2wgaXNPbmUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1wel9jbXBfc2koZF92YWx1ZS5nZXRfbXB6X3QoKSwgMSkgPT0gMDsKKyAgfQorCisgIGJvb2wgaXNOZWdhdGl2ZU9uZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbXB6X2NtcF9zaShkX3ZhbHVlLmdldF9tcHpfdCgpLCAtMSkgPT0gMDsKKyAgfQorCisgIC8qKgorICAgKiBSYWlzZSB0aGlzIEludGVnZXIgdG8gdGhlIHBvd2VyIDxjb2RlPmV4cDwvY29kZT4uCisgICAqCisgICAqIEBwYXJhbSBleHAgdGhlIGV4cG9uZW50CisgICAqLworICBJbnRlZ2VyIHBvdyh1bnNpZ25lZCBsb25nIGludCBleHApIGNvbnN0IHsKKyAgICBtcHpfY2xhc3MgcmVzdWx0OworICAgIG1wel9wb3dfdWkocmVzdWx0LmdldF9tcHpfdCgpLGRfdmFsdWUuZ2V0X21wel90KCksZXhwKTsKKyAgICByZXR1cm4gSW50ZWdlciggcmVzdWx0ICk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJuIHRoZSBncmVhdGVzdCBjb21tb24gZGl2aXNvciBvZiB0aGlzIGludGVnZXIgd2l0aCBhbm90aGVyLgorICAgKi8KKyAgSW50ZWdlciBnY2QoY29uc3QgSW50ZWdlciYgeSkgY29uc3QgeworICAgIG1wel9jbGFzcyByZXN1bHQ7CisgICAgbXB6X2djZChyZXN1bHQuZ2V0X21wel90KCksIGRfdmFsdWUuZ2V0X21wel90KCksIHkuZF92YWx1ZS5nZXRfbXB6X3QoKSk7CisgICAgcmV0dXJuIEludGVnZXIocmVzdWx0KTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm4gdGhlIGxlYXN0IGNvbW1vbiBtdWx0aXBsZSBvZiB0aGlzIGludGVnZXIgd2l0aCBhbm90aGVyLgorICAgKi8KKyAgSW50ZWdlciBsY20oY29uc3QgSW50ZWdlciYgeSkgY29uc3QgeworICAgIG1wel9jbGFzcyByZXN1bHQ7CisgICAgbXB6X2xjbShyZXN1bHQuZ2V0X21wel90KCksIGRfdmFsdWUuZ2V0X21wel90KCksIHkuZF92YWx1ZS5nZXRfbXB6X3QoKSk7CisgICAgcmV0dXJuIEludGVnZXIocmVzdWx0KTsKKyAgfQorCisgIC8qKgorICAgKiBBbGwgbm9uLXplcm8gaW50ZWdlcnMgeiwgei5kaXZpZGUoMCkKKyAgICogISB6ZXJvLmRpdmlkZXMoemVybykKKyAgICovCisgIGJvb2wgZGl2aWRlcyhjb25zdCBJbnRlZ2VyJiB5KSBjb25zdCB7CisgICAgaW50IHJlcyA9IG1wel9kaXZpc2libGVfcCh5LmRfdmFsdWUuZ2V0X21wel90KCksIGRfdmFsdWUuZ2V0X21wel90KCkpOworICAgIHJldHVybiByZXMgIT0gMDsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm4gdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoaXMgaW50ZWdlci4KKyAgICovCisgIEludGVnZXIgYWJzKCkgY29uc3QgeworICAgIHJldHVybiBkX3ZhbHVlID49IDAgPyAqdGhpcyA6IC0qdGhpczsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKGludCBiYXNlID0gMTApIGNvbnN0eworICAgIHJldHVybiBkX3ZhbHVlLmdldF9zdHIoYmFzZSk7CisgIH0KKworICBib29sIGZpdHNTaWduZWRJbnQoKSBjb25zdDsKKworICBib29sIGZpdHNVbnNpZ25lZEludCgpIGNvbnN0OworCisgIHNpZ25lZCBpbnQgZ2V0U2lnbmVkSW50KCkgY29uc3Q7CisKKyAgdW5zaWduZWQgaW50IGdldFVuc2lnbmVkSW50KCkgY29uc3Q7CisKKyAgbG9uZyBnZXRMb25nKCkgY29uc3QgeworICAgIGxvbmcgc2kgPSBkX3ZhbHVlLmdldF9zaSgpOworICAgIC8vIGVuc3VyZSB0aGVyZSB3YXNuJ3Qgb3ZlcmZsb3cKKyAgICBDaGVja0FyZ3VtZW50KG1wel9jbXBfc2koZF92YWx1ZS5nZXRfbXB6X3QoKSwgc2kpID09IDAsIHRoaXMsCisgICAgICAgICAgICAgICAgICJPdmVyZmxvdyBkZXRlY3RlZCBpbiBJbnRlZ2VyOjpnZXRMb25nKCkiKTsKKyAgICByZXR1cm4gc2k7CisgIH0KKyAgdW5zaWduZWQgbG9uZyBnZXRVbnNpZ25lZExvbmcoKSBjb25zdCB7CisgICAgdW5zaWduZWQgbG9uZyB1aSA9IGRfdmFsdWUuZ2V0X3VpKCk7CisgICAgLy8gZW5zdXJlIHRoZXJlIHdhc24ndCBvdmVyZmxvdworICAgIENoZWNrQXJndW1lbnQobXB6X2NtcF91aShkX3ZhbHVlLmdldF9tcHpfdCgpLCB1aSkgPT0gMCwgdGhpcywKKyAgICAgICAgICAgICAgICAgICJPdmVyZmxvdyBkZXRlY3RlZCBpbiBJbnRlZ2VyOjpnZXRVbnNpZ25lZExvbmcoKSIpOworICAgIHJldHVybiB1aTsKKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlcyB0aGUgaGFzaCBvZiB0aGUgbm9kZSBmcm9tIHRoZSBmaXJzdCB3b3JkIG9mIHRoZQorICAgKiBudW1lcmF0b3IsIHRoZSBkZW5vbWluYXRvci4KKyAgICovCisgIHNpemVfdCBoYXNoKCkgY29uc3QgeworICAgIHJldHVybiBnbXB6X2hhc2goZF92YWx1ZS5nZXRfbXB6X3QoKSk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0cnVlIGlmZiBiaXQgbiBpcyBzZXQuCisgICAqCisgICAqIEBwYXJhbSBuIHRoZSBiaXQgdG8gdGVzdCAoMCA9PSBsZWFzdCBzaWduaWZpY2FudCBiaXQpCisgICAqIEByZXR1cm4gdHJ1ZSBpZiBiaXQgbiBpcyBzZXQgaW4gdGhpcyBpbnRlZ2VyOyBmYWxzZSBvdGhlcndpc2UKKyAgICovCisgIGJvb2wgdGVzdEJpdCh1bnNpZ25lZCBuKSBjb25zdCB7CisgICAgcmV0dXJuIG1wel90c3RiaXQoZF92YWx1ZS5nZXRfbXB6X3QoKSwgbik7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyBrIGlmIHRoZSBpbnRlZ2VyIGlzIGVxdWFsIHRvIDJeKGstMSkKKyAgICogQHJldHVybiBrIGlmIHRoZSBpbnRlZ2VyIGlzIGVxdWFsIHRvIDJeKGstMSkgYW5kIDAgb3RoZXJ3aXNlCisgICAqLworICB1bnNpZ25lZCBpc1BvdzIoKSBjb25zdCB7CisgICAgaWYgKGRfdmFsdWUgPD0gMCkgcmV0dXJuIDA7CisgICAgLy8gY2hlY2sgdGhhdCB0aGUgbnVtYmVyIG9mIG9uZXMgaW4gdGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbiBpcyAxCisgICAgaWYgKG1wel9wb3Bjb3VudChkX3ZhbHVlLmdldF9tcHpfdCgpKSA9PSAxKSB7CisgICAgICAvLyByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvbmUgcGx1cyAxCisgICAgICByZXR1cm4gbXB6X3NjYW4xKGRfdmFsdWUuZ2V0X21wel90KCksIDApICsgMTsKKyAgICB9CisgICAgcmV0dXJuIDA7IAorICB9CisKKyAgCisgIC8qKgorICAgKiBJZiB4ICE9IDAsIHJldHVybnMgdGhlIHNtYWxsZXN0IG4gcy50LiAyXntuLTF9IDw9IGFicyh4KSA8IDJee259LgorICAgKiBJZiB4ID09IDAsIHJldHVybnMgMS4KKyAgICovCisgIHNpemVfdCBsZW5ndGgoKSBjb25zdCB7CisgICAgaWYoc2duKCkgPT0gMCl7CisgICAgICByZXR1cm4gMTsKKyAgICB9ZWxzZXsKKyAgICAgIHJldHVybiBtcHpfc2l6ZWluYmFzZShkX3ZhbHVlLmdldF9tcHpfdCgpLDIpOworICAgIH0KKyAgfQorCisgIHN0YXRpYyB2b2lkIGV4dGVuZGVkR2NkKEludGVnZXImIGcsIEludGVnZXImIHMsIEludGVnZXImIHQsIGNvbnN0IEludGVnZXImIGEsIGNvbnN0IEludGVnZXImIGIpeworICAgIC8vc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvcjoKKyAgICAvL21wel9nY2RleHQgKG1wel90IGcsIG1wel90IHMsIG1wel90IHQsIG1wel90IGEsIG1wel90IGIpOworICAgIG1wel9nY2RleHQgKGcuZF92YWx1ZS5nZXRfbXB6X3QoKSwgcy5kX3ZhbHVlLmdldF9tcHpfdCgpLCB0LmRfdmFsdWUuZ2V0X21wel90KCksIGEuZF92YWx1ZS5nZXRfbXB6X3QoKSwgYi5kX3ZhbHVlLmdldF9tcHpfdCgpKTsKKyAgfQorCisgIC8qKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBtaW5pbXVtIG9mIHR3byBpbnRlZ2Vycy4gKi8KKyAgc3RhdGljIGNvbnN0IEludGVnZXImIG1pbihjb25zdCBJbnRlZ2VyJiBhLCBjb25zdCBJbnRlZ2VyJiBiKXsKKyAgICByZXR1cm4gKGEgPD1iICkgPyBhIDogYjsKKyAgfQorCisgIC8qKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBtYXhpbXVtIG9mIHR3byBpbnRlZ2Vycy4gKi8KKyAgc3RhdGljIGNvbnN0IEludGVnZXImIG1heChjb25zdCBJbnRlZ2VyJiBhLCBjb25zdCBJbnRlZ2VyJiBiKXsKKyAgICByZXR1cm4gKGEgPj0gYiApID8gYSA6IGI7CisgIH0KKworICBmcmllbmQgY2xhc3MgQ1ZDNDo6UmF0aW9uYWw7Cit9Oy8qIGNsYXNzIEludGVnZXIgKi8KKworc3RydWN0IEludGVnZXJIYXNoRnVuY3Rpb24geworICBpbmxpbmUgc2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgQ1ZDNDo6SW50ZWdlciYgaSkgY29uc3QgeworICAgIHJldHVybiBpLmhhc2goKTsKKyAgfQorfTsvKiBzdHJ1Y3QgSW50ZWdlckhhc2hGdW5jdGlvbiAqLworCitpbmxpbmUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEludGVnZXImIG4pIHsKKyAgcmV0dXJuIG9zIDw8IG4udG9TdHJpbmcoKTsKK30KKworfS8qIENWQzQgbmFtZXNwYWNlICovCisKKyNlbmRpZiAvKiBfX0NWQzRfX0lOVEVHRVJfSCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9jdmM0LTEuNC1wYXRjaC91dGlsL3JhdGlvbmFsX2dtcF9pbXAuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvY3ZjNC0xLjQtcGF0Y2gvdXRpbC9yYXRpb25hbF9nbXBfaW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlkMDYzMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvY3ZjNC0xLjQtcGF0Y2gvdXRpbC9yYXRpb25hbF9nbXBfaW1wLmgKQEAgLTAsMCArMSwzNTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiEgXGZpbGUgcmF0aW9uYWxfZ21wX2ltcC5oCisgKiogXHZlcmJhdGltCisgKiogT3JpZ2luYWwgYXV0aG9yOiBUaW0gS2luZworICoqIE1ham9yIGNvbnRyaWJ1dG9yczogTW9yZ2FuIERldGVycworICoqIE1pbm9yIGNvbnRyaWJ1dG9ycyAodG8gY3VycmVudCB2ZXJzaW9uKTogRGVqYW4gSm92YW5vdmljCisgKiogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIENWQzQgcHJvamVjdC4KKyAqKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxNCAgTmV3IFlvcmsgVW5pdmVyc2l0eSBhbmQgVGhlIFVuaXZlcnNpdHkgb2YgSW93YQorICoqIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSB0b3AtbGV2ZWwgc291cmNlIGRpcmVjdG9yeSBmb3IgbGljZW5zaW5nCisgKiogaW5mb3JtYXRpb24uXGVuZHZlcmJhdGltCisgKioKKyAqKiBcYnJpZWYgTXVsdGlwcmVjaXNpb24gcmF0aW9uYWwgY29uc3RhbnRzOyB3cmFwcyBhIEdNUCBtdWx0aXByZWNpc2lvbgorICoqIHJhdGlvbmFsLgorICoqCisgKiogTXVsdGlwcmVjaXNpb24gcmF0aW9uYWwgY29uc3RhbnRzOyB3cmFwcyBhIEdNUCBtdWx0aXByZWNpc2lvbiByYXRpb25hbC4KKyAqKi8KKworI2luY2x1ZGUgImN2YzRfcHVibGljLmgiCisKKyNpZm5kZWYgX19DVkM0X19SQVRJT05BTF9ICisjZGVmaW5lIF9fQ1ZDNF9fUkFUSU9OQUxfSAorCisjaW5jbHVkZSA8Z21wLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAidXRpbC9pbnRlZ2VyLmgiCisjaW5jbHVkZSAidXRpbC9leGNlcHRpb24uaCIKKworbmFtZXNwYWNlIENWQzQgeworCitjbGFzcyBDVkM0X1BVQkxJQyBSYXRpb25hbEZyb21Eb3VibGVFeGNlcHRpb24gOiBwdWJsaWMgRXhjZXB0aW9uIHsKK3B1YmxpYzoKKyAgUmF0aW9uYWxGcm9tRG91YmxlRXhjZXB0aW9uKGRvdWJsZSBkKSB0aHJvdygpOworfTsKKworLyoqCisgKiogQSBtdWx0aS1wcmVjaXNpb24gcmF0aW9uYWwgY29uc3RhbnQuCisgKiogVGhpcyBzdG9yZXMgdGhlIHJhdGlvbmFsIGFzIGEgcGFpciBvZiBtdWx0aS1wcmVjaXNpb24gaW50ZWdlcnMsCisgKiogb25lIGZvciB0aGUgbnVtZXJhdG9yIGFuZCBvbmUgZm9yIHRoZSBkZW5vbWluYXRvci4KKyAqKiBUaGUgbnVtYmVyIGlzIGFsd2F5cyBzdG9yZWQgc28gdGhhdCB0aGUgZ2NkIG9mIHRoZSBudW1lcmF0b3IgYW5kIGRlbm9taW5hdG9yCisgKiogaXMgMS4gIChUaGlzIGlzIHJlZmVycmVkIHRvIGFzIHJlZmVycmVkIHRvIGFzIGNhbm9uaWNhbCBmb3JtIGluIEdNUCdzCisgKiogbGl0ZXJhdHVyZS4pIEEgY29uc2VxdWVuY2UgaXMgdGhhdCB0aGF0IHRoZSBudW1lcmF0b3IgYW5kIGRlbm9taW5hdG9yIG1heSBiZQorICoqIGRpZmZlcmVudCB0aGFuIHRoZSB2YWx1ZXMgdXNlZCB0byBjb25zdHJ1Y3QgdGhlIFJhdGlvbmFsLgorICoqCisgKiogTk9URTogVGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSBhIFJhdGlvbmFsIGZyb20gYW4gaW50IGlzIHRvIHVzZSBvbmUgb2YgdGhlCisgKiogaW50IG51bWVyYXRvci9pbnQgZGVub21pbmF0b3IgY29uc3RydWN0b3JzIHdpdGggdGhlIGRlbm9taW5hdG9yIDEuICBUcnlpbmcKKyAqKiB0byBjb25zdHJ1Y3QgYSBSYXRpb25hbCB3aXRoIGEgc2luZ2xlIGludCwgZS5nLiwgUmF0aW9uYWwoMCksIHdpbGwgcHV0IHlvdQorICoqIGluIGRhbmdlciBvZiBpbnZva2luZyB0aGUgY2hhciogY29uc3RydWN0b3IsIGZyb20gd2hlbmNlIHlvdSB3aWxsIHNlZ2ZhdWx0LgorICoqLworCitjbGFzcyBDVkM0X1BVQkxJQyBSYXRpb25hbCB7Citwcml2YXRlOgorICAvKioKKyAgICogU3RvcmVzIHRoZSB2YWx1ZSBvZiB0aGUgcmF0aW9uYWwgaXMgc3RvcmVkIGluIGEgQysrIEdNUCByYXRpb25hbCBjbGFzcy4KKyAgICogVXNpbmcgdGhpcyBpbnN0ZWFkIG9mIG1wcV90IGFsbG93cyBmb3IgZWFzaWVyIGRlc3RydWN0aW9uLgorICAgKi8KKyAgbXBxX2NsYXNzIGRfdmFsdWU7CisKK3B1YmxpYzoKKworICAvKioKKyAgICogQ29uc3RydWN0cyBhIFJhdGlvbmFsIGZyb20gYSBtcHFfY2xhc3Mgb2JqZWN0LgorICAgKiBEb2VzIGEgZGVlcCBjb3B5LgorICAgKiBBc3N1bWVzIHRoYXQgdGhlIHZhbHVlIGlzIGluIGNhbm9uaWNhbCBmb3JtLCBhbmQgdGh1cyBkb2VzIG5vdAorICAgKiBoYXZlIHRvIGNhbGwgY2Fub25pY2FsaXplKCkgb24gdGhlIHZhbHVlLgorICAgKi8KKyAgUmF0aW9uYWwoY29uc3QgbXBxX2NsYXNzJiB2YWwpIDogZF92YWx1ZSh2YWwpIHsgIH0KKworICAvKioKKyAgICogQ3JlYXRlcyBhIHJhdGlvbmFsIGZyb20gYSBkZWNpbWFsIHN0cmluZyAoZS5nLiwgPGNvZGU+IjEuNSI8L2NvZGU+KS4KKyAgICoKKyAgICogQHBhcmFtIGRlYyBhIHN0cmluZyBlbmNvZGluZyBhIGRlY2ltYWwgbnVtYmVyIGluIHRoZSBmb3JtYXQKKyAgICogPGNvZGU+WzAtOV0qXC5bMC05XSo8L2NvZGU+CisgICAqLworICBzdGF0aWMgUmF0aW9uYWwgZnJvbURlY2ltYWwoY29uc3Qgc3RkOjpzdHJpbmcmIGRlYyk7CisKKyAgLyoqIENvbnN0cnVjdHMgYSByYXRpb25hbCB3aXRoIHRoZSB2YWx1ZSAwLzEuICovCisgIFJhdGlvbmFsKCkgOiBkX3ZhbHVlKDApeworICAgIGRfdmFsdWUuY2Fub25pY2FsaXplKCk7CisgIH0KKworICAvKioKKyAgICogQ29uc3RydWN0cyBhIFJhdGlvbmFsIGZyb20gYSBDIHN0cmluZyBpbiBhIGdpdmVuIGJhc2UgKGRlZmF1bHRzIHRvIDEwKS4KKyAgICogVGhyb3dzIHN0ZDo6aW52YWxpZF9hcmd1bWVudCBpZiB0aGUgc3RyaW5nIGlzIG5vdCBhIHZhbGlkIHJhdGlvbmFsLgorICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IGlzIGEgdmFsaWQgcmF0aW9uYWwgc3RyaW5nLAorICAgKiBzZWUgR01QJ3MgZG9jdW1lbnRhdGlvbiBmb3IgbXBxX3NldF9zdHIoKS4KKyAgICovCisgIGV4cGxpY2l0IFJhdGlvbmFsKGNvbnN0IGNoYXIqIHMsIHVuc2lnbmVkIGJhc2UgPSAxMCk6IGRfdmFsdWUocywgYmFzZSkgeworICAgIGRfdmFsdWUuY2Fub25pY2FsaXplKCk7CisgIH0KKyAgUmF0aW9uYWwoY29uc3Qgc3RkOjpzdHJpbmcmIHMsIHVuc2lnbmVkIGJhc2UgPSAxMCkgOiBkX3ZhbHVlKHMsIGJhc2UpIHsKKyAgICBkX3ZhbHVlLmNhbm9uaWNhbGl6ZSgpOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYSBSYXRpb25hbCBmcm9tIGFub3RoZXIgUmF0aW9uYWwsIHEsIGJ5IHBlcmZvcm1pbmcgYSBkZWVwIGNvcHkuCisgICAqLworICBSYXRpb25hbChjb25zdCBSYXRpb25hbCYgcSkgOiBkX3ZhbHVlKHEuZF92YWx1ZSkgeworICAgIGRfdmFsdWUuY2Fub25pY2FsaXplKCk7CisgIH0KKworICAvKioKKyAgICogQ29uc3RydWN0cyBhIGNhbm9uaWNhbCBSYXRpb25hbCBmcm9tIGEgbnVtZXJhdG9yLgorICAgKi8KKyAgUmF0aW9uYWwoc2lnbmVkIGludCBuKSA6IGRfdmFsdWUobiwxKSB7CisgICAgZF92YWx1ZS5jYW5vbmljYWxpemUoKTsKKyAgfQorICBSYXRpb25hbCh1bnNpZ25lZCBpbnQgbikgOiBkX3ZhbHVlKG4sMSkgeworICAgIGRfdmFsdWUuY2Fub25pY2FsaXplKCk7CisgIH0KKyAgUmF0aW9uYWwoc2lnbmVkIGxvbmcgaW50IG4pIDogZF92YWx1ZShuLDEpIHsKKyAgICBkX3ZhbHVlLmNhbm9uaWNhbGl6ZSgpOworICB9CisgIFJhdGlvbmFsKHVuc2lnbmVkIGxvbmcgaW50IG4pIDogZF92YWx1ZShuLDEpIHsKKyAgICBkX3ZhbHVlLmNhbm9uaWNhbGl6ZSgpOworICB9CisKKyNpZmRlZiBDVkM0X05FRURfSU5UNjRfVF9PVkVSTE9BRFMKKyAgUmF0aW9uYWwoaW50NjRfdCBuKSA6IGRfdmFsdWUoc3RhdGljX2Nhc3Q8bG9uZz4obiksIDEpIHsKKyAgICBkX3ZhbHVlLmNhbm9uaWNhbGl6ZSgpOworICB9CisgIFJhdGlvbmFsKHVpbnQ2NF90IG4pIDogZF92YWx1ZShzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihuKSwgMSkgeworICAgIGRfdmFsdWUuY2Fub25pY2FsaXplKCk7CisgIH0KKyNlbmRpZiAvKiBDVkM0X05FRURfSU5UNjRfVF9PVkVSTE9BRFMgKi8KKworICAvKioKKyAgICogQ29uc3RydWN0cyBhIGNhbm9uaWNhbCBSYXRpb25hbCBmcm9tIGEgbnVtZXJhdG9yIGFuZCBkZW5vbWluYXRvci4KKyAgICovCisgIFJhdGlvbmFsKHNpZ25lZCBpbnQgbiwgc2lnbmVkIGludCBkKSA6IGRfdmFsdWUobixkKSB7CisgICAgZF92YWx1ZS5jYW5vbmljYWxpemUoKTsKKyAgfQorICBSYXRpb25hbCh1bnNpZ25lZCBpbnQgbiwgdW5zaWduZWQgaW50IGQpIDogZF92YWx1ZShuLGQpIHsKKyAgICBkX3ZhbHVlLmNhbm9uaWNhbGl6ZSgpOworICB9CisgIFJhdGlvbmFsKHNpZ25lZCBsb25nIGludCBuLCBzaWduZWQgbG9uZyBpbnQgZCkgOiBkX3ZhbHVlKG4sZCkgeworICAgIGRfdmFsdWUuY2Fub25pY2FsaXplKCk7CisgIH0KKyAgUmF0aW9uYWwodW5zaWduZWQgbG9uZyBpbnQgbiwgdW5zaWduZWQgbG9uZyBpbnQgZCkgOiBkX3ZhbHVlKG4sZCkgeworICAgIGRfdmFsdWUuY2Fub25pY2FsaXplKCk7CisgIH0KKworI2lmZGVmIENWQzRfTkVFRF9JTlQ2NF9UX09WRVJMT0FEUworICBSYXRpb25hbChpbnQ2NF90IG4sIGludDY0X3QgZCkgOiBkX3ZhbHVlKHN0YXRpY19jYXN0PGxvbmc+KG4pLCBzdGF0aWNfY2FzdDxsb25nPihkKSkgeworICAgIGRfdmFsdWUuY2Fub25pY2FsaXplKCk7CisgIH0KKyAgUmF0aW9uYWwodWludDY0X3QgbiwgdWludDY0X3QgZCkgOiBkX3ZhbHVlKHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KG4pLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihkKSkgeworICAgIGRfdmFsdWUuY2Fub25pY2FsaXplKCk7CisgIH0KKyNlbmRpZiAvKiBDVkM0X05FRURfSU5UNjRfVF9PVkVSTE9BRFMgKi8KKworICBSYXRpb25hbChjb25zdCBJbnRlZ2VyJiBuLCBjb25zdCBJbnRlZ2VyJiBkKSA6CisgICAgZF92YWx1ZShuLmdldF9tcHooKSwgZC5nZXRfbXB6KCkpCisgIHsKKyAgICBkX3ZhbHVlLmNhbm9uaWNhbGl6ZSgpOworICB9CisgIFJhdGlvbmFsKGNvbnN0IEludGVnZXImIG4pIDoKKyAgICBkX3ZhbHVlKG4uZ2V0X21weigpKQorICB7CisgICAgZF92YWx1ZS5jYW5vbmljYWxpemUoKTsKKyAgfQorICB+UmF0aW9uYWwoKSB7fQorCisgIC8qKgorICAgKiBHZXRzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbXAgZGF0YSB0aGF0IGJhY2tzIHVwIHRoZSByYXRpb25hbC4KKyAgICogT25seSBhY2Nlc3NpYmxlIHRvIGZyaWVuZCBjbGFzc2VzLgorICAgKi8KKyAgY29uc3QgbXBxX2NsYXNzJiBnZXRfbXBxKCkgY29uc3QgeyByZXR1cm4gZF92YWx1ZTsgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBudW1lcmF0b3Igb2YgdGhlIFJhdGlvbmFsLgorICAgKiBOb3RlIHRoYXQgdGhpcyBtYWtlcyBhIGRlZXAgY29weSBvZiB0aGUgbnVtZXJhdG9yLgorICAgKi8KKyAgSW50ZWdlciBnZXROdW1lcmF0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIEludGVnZXIoZF92YWx1ZS5nZXRfbnVtKCkpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIGRlbm9taW5hdG9yIG9mIHRoZSBSYXRpb25hbC4KKyAgICogTm90ZSB0aGF0IHRoaXMgbWFrZXMgYSBkZWVwIGNvcHkgb2YgdGhlIGRlbm9taW5hdG9yLgorICAgKi8KKyAgSW50ZWdlciBnZXREZW5vbWluYXRvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gSW50ZWdlcihkX3ZhbHVlLmdldF9kZW4oKSk7CisgIH0KKworICBzdGF0aWMgUmF0aW9uYWwgZnJvbURvdWJsZShkb3VibGUgZCkgdGhyb3coUmF0aW9uYWxGcm9tRG91YmxlRXhjZXB0aW9uKTsKKworICAvKioKKyAgICogR2V0IGEgZG91YmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgUmF0aW9uYWwsIHdoaWNoIGlzCisgICAqIGFwcHJveGltYXRlOiB0cnVuY2F0aW9uIG1heSBvY2N1ciwgb3ZlcmZsb3cgbWF5IHJlc3VsdCBpbgorICAgKiBpbmZpbml0eSwgYW5kIHVuZGVyZmxvdyBtYXkgcmVzdWx0IGluIHplcm8uCisgICAqLworICBkb3VibGUgZ2V0RG91YmxlKCkgY29uc3QgeworICAgIHJldHVybiBkX3ZhbHVlLmdldF9kKCk7CisgIH0KKworICBSYXRpb25hbCBpbnZlcnNlKCkgY29uc3QgeworICAgIHJldHVybiBSYXRpb25hbChnZXREZW5vbWluYXRvcigpLCBnZXROdW1lcmF0b3IoKSk7CisgIH0KKworICBpbnQgY21wKGNvbnN0IFJhdGlvbmFsJiB4KSBjb25zdCB7CisgICAgLy9Eb24ndCB1c2UgbXBxX2NsYXNzJ3MgY21wKCkgZnVuY3Rpb24uCisgICAgLy9UaGUgbmFtZSBlbmRzIHVwIGNvbmZsaWN0aW5nIHdpdGggdGhpcyBmdW5jdGlvbi4KKyAgICByZXR1cm4gbXBxX2NtcChkX3ZhbHVlLmdldF9tcHFfdCgpLCB4LmRfdmFsdWUuZ2V0X21wcV90KCkpOworICB9CisKKyAgaW50IHNnbigpIGNvbnN0IHsKKyAgICByZXR1cm4gbXBxX3NnbihkX3ZhbHVlLmdldF9tcHFfdCgpKTsKKyAgfQorCisgIGJvb2wgaXNaZXJvKCkgY29uc3QgeworICAgIHJldHVybiBzZ24oKSA9PSAwOworICB9CisKKyAgYm9vbCBpc09uZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbXBxX2NtcF9zaShkX3ZhbHVlLmdldF9tcHFfdCgpLCAxLCAxKSA9PSAwOworICB9CisKKyAgYm9vbCBpc05lZ2F0aXZlT25lKCkgY29uc3QgeworICAgIHJldHVybiBtcHFfY21wX3NpKGRfdmFsdWUuZ2V0X21wcV90KCksIC0xLCAxKSA9PSAwOworICB9CisKKyAgUmF0aW9uYWwgYWJzKCkgY29uc3QgeworICAgIGlmKHNnbigpIDwgMCl7CisgICAgICByZXR1cm4gLSgqdGhpcyk7CisgICAgfWVsc2V7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICB9CisKKyAgSW50ZWdlciBmbG9vcigpIGNvbnN0IHsKKyAgICBtcHpfY2xhc3MgcTsKKyAgICBtcHpfZmRpdl9xKHEuZ2V0X21wel90KCksIGRfdmFsdWUuZ2V0X251bV9tcHpfdCgpLCBkX3ZhbHVlLmdldF9kZW5fbXB6X3QoKSk7CisgICAgcmV0dXJuIEludGVnZXIocSk7CisgIH0KKworICBJbnRlZ2VyIGNlaWxpbmcoKSBjb25zdCB7CisgICAgbXB6X2NsYXNzIHE7CisgICAgbXB6X2NkaXZfcShxLmdldF9tcHpfdCgpLCBkX3ZhbHVlLmdldF9udW1fbXB6X3QoKSwgZF92YWx1ZS5nZXRfZGVuX21wel90KCkpOworICAgIHJldHVybiBJbnRlZ2VyKHEpOworICB9CisKKyAgUmF0aW9uYWwgZmxvb3JfZnJhYygpIGNvbnN0IHsKKyAgICByZXR1cm4gKCp0aGlzKSAtIFJhdGlvbmFsKGZsb29yKCkpOworICB9CisKKyAgUmF0aW9uYWwmIG9wZXJhdG9yPShjb25zdCBSYXRpb25hbCYgeCl7CisgICAgaWYodGhpcyA9PSAmeCkgcmV0dXJuICp0aGlzOworICAgIGRfdmFsdWUgPSB4LmRfdmFsdWU7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgUmF0aW9uYWwgb3BlcmF0b3ItKCkgY29uc3R7CisgICAgcmV0dXJuIFJhdGlvbmFsKC0oZF92YWx1ZSkpOworICB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFJhdGlvbmFsJiB5KSBjb25zdCB7CisgICAgcmV0dXJuIGRfdmFsdWUgPT0geS5kX3ZhbHVlOworICB9CisKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFJhdGlvbmFsJiB5KSBjb25zdCB7CisgICAgcmV0dXJuIGRfdmFsdWUgIT0geS5kX3ZhbHVlOworICB9CisKKyAgYm9vbCBvcGVyYXRvcjwgKGNvbnN0IFJhdGlvbmFsJiB5KSBjb25zdCB7CisgICAgcmV0dXJuIGRfdmFsdWUgPCB5LmRfdmFsdWU7CisgIH0KKworICBib29sIG9wZXJhdG9yPD0oY29uc3QgUmF0aW9uYWwmIHkpIGNvbnN0IHsKKyAgICByZXR1cm4gZF92YWx1ZSA8PSB5LmRfdmFsdWU7CisgIH0KKworICBib29sIG9wZXJhdG9yPiAoY29uc3QgUmF0aW9uYWwmIHkpIGNvbnN0IHsKKyAgICByZXR1cm4gZF92YWx1ZSA+IHkuZF92YWx1ZTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I+PShjb25zdCBSYXRpb25hbCYgeSkgY29uc3QgeworICAgIHJldHVybiBkX3ZhbHVlID49IHkuZF92YWx1ZTsKKyAgfQorCisgIFJhdGlvbmFsIG9wZXJhdG9yKyhjb25zdCBSYXRpb25hbCYgeSkgY29uc3R7CisgICAgcmV0dXJuIFJhdGlvbmFsKCBkX3ZhbHVlICsgeS5kX3ZhbHVlICk7CisgIH0KKyAgUmF0aW9uYWwgb3BlcmF0b3ItKGNvbnN0IFJhdGlvbmFsJiB5KSBjb25zdCB7CisgICAgcmV0dXJuIFJhdGlvbmFsKCBkX3ZhbHVlIC0geS5kX3ZhbHVlICk7CisgIH0KKworICBSYXRpb25hbCBvcGVyYXRvciooY29uc3QgUmF0aW9uYWwmIHkpIGNvbnN0IHsKKyAgICByZXR1cm4gUmF0aW9uYWwoIGRfdmFsdWUgKiB5LmRfdmFsdWUgKTsKKyAgfQorICBSYXRpb25hbCBvcGVyYXRvci8oY29uc3QgUmF0aW9uYWwmIHkpIGNvbnN0IHsKKyAgICByZXR1cm4gUmF0aW9uYWwoIGRfdmFsdWUgLyB5LmRfdmFsdWUgKTsKKyAgfQorCisgIFJhdGlvbmFsJiBvcGVyYXRvcis9KGNvbnN0IFJhdGlvbmFsJiB5KXsKKyAgICBkX3ZhbHVlICs9IHkuZF92YWx1ZTsKKyAgICByZXR1cm4gKCp0aGlzKTsKKyAgfQorICBSYXRpb25hbCYgb3BlcmF0b3ItPShjb25zdCBSYXRpb25hbCYgeSl7CisgICAgZF92YWx1ZSAtPSB5LmRfdmFsdWU7CisgICAgcmV0dXJuICgqdGhpcyk7CisgIH0KKworICBSYXRpb25hbCYgb3BlcmF0b3IqPShjb25zdCBSYXRpb25hbCYgeSl7CisgICAgZF92YWx1ZSAqPSB5LmRfdmFsdWU7CisgICAgcmV0dXJuICgqdGhpcyk7CisgIH0KKworICBSYXRpb25hbCYgb3BlcmF0b3IvPShjb25zdCBSYXRpb25hbCYgeSl7CisgICAgZF92YWx1ZSAvPSB5LmRfdmFsdWU7CisgICAgcmV0dXJuICgqdGhpcyk7CisgIH0KKworICBib29sIGlzSW50ZWdyYWwoKSBjb25zdHsKKyAgICByZXR1cm4gZ2V0RGVub21pbmF0b3IoKSA9PSAxOworICB9CisKKyAgLyoqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSByYXRpb25hbCBpbiB0aGUgZ2l2ZW4gYmFzZS4gKi8KKyAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoaW50IGJhc2UgPSAxMCkgY29uc3QgeworICAgIHJldHVybiBkX3ZhbHVlLmdldF9zdHIoYmFzZSk7CisgIH0KKworICAvKioKKyAgICogQ29tcHV0ZXMgdGhlIGhhc2ggb2YgdGhlIHJhdGlvbmFsIGZyb20gaGFzaGVzIG9mIHRoZSBudW1lcmF0b3IgYW5kIHRoZQorICAgKiBkZW5vbWluYXRvci4KKyAgICovCisgIHNpemVfdCBoYXNoKCkgY29uc3QgeworICAgIHNpemVfdCBudW1lcmF0b3JIYXNoID0gZ21wel9oYXNoKGRfdmFsdWUuZ2V0X251bV9tcHpfdCgpKTsKKyAgICBzaXplX3QgZGVub21pbmF0b3JIYXNoID0gZ21wel9oYXNoKGRfdmFsdWUuZ2V0X2Rlbl9tcHpfdCgpKTsKKworICAgIHJldHVybiBudW1lcmF0b3JIYXNoIHhvciBkZW5vbWluYXRvckhhc2g7CisgIH0KKworICB1aW50MzJfdCBjb21wbGV4aXR5KCkgY29uc3QgeworICAgIHVpbnQzMl90IG51bUxlbiA9IGdldE51bWVyYXRvcigpLmxlbmd0aCgpOworICAgIHVpbnQzMl90IGRlbkxlbiA9IGdldERlbm9taW5hdG9yKCkubGVuZ3RoKCk7CisgICAgcmV0dXJuICBudW1MZW4gKyBkZW5MZW47CisgIH0KKworICAvKiogRXF1aXZhbGVudCB0byBjYWxsaW5nICh0aGlzLT5hYnMoKSkuY21wKGIuYWJzKCkpICovCisgIGludCBhYnNDbXAoY29uc3QgUmF0aW9uYWwmIHEpIGNvbnN0OworCit9Oy8qIGNsYXNzIFJhdGlvbmFsICovCisKK3N0cnVjdCBSYXRpb25hbEhhc2hGdW5jdGlvbiB7CisgIGlubGluZSBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBDVkM0OjpSYXRpb25hbCYgcikgY29uc3QgeworICAgIHJldHVybiByLmhhc2goKTsKKyAgfQorfTsvKiBzdHJ1Y3QgUmF0aW9uYWxIYXNoRnVuY3Rpb24gKi8KKworQ1ZDNF9QVUJMSUMgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IFJhdGlvbmFsJiBuKTsKKworfS8qIENWQzQgbmFtZXNwYWNlICovCisKKyNlbmRpZiAvKiBfX0NWQzRfX1JBVElPTkFMX0ggKi8KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9jdmM0LW1hc3Rlci1wYXRjaC9jb25maWcvYm9vc3QtdjIubTQgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL2N2YzQtbWFzdGVyLXBhdGNoL2NvbmZpZy9ib29zdC12Mi5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2QwNjNmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9jdmM0LW1hc3Rlci1wYXRjaC9jb25maWcvYm9vc3QtdjIubTQKQEAgLTAsMCArMSwxNTYwIEBACisjIGJvb3N0Lm00OiBMb2NhdGUgQm9vc3QgaGVhZGVycyBhbmQgbGlicmFyaWVzIGZvciBhdXRvY29uZi1iYXNlZCBwcm9qZWN0cy4KKyMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMTEsIDIwMTQgIEJlbm9pdCBTaWdvdXJlIDx0c3VuYUBscmRlLmVwaXRhLmZyPgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBBZGRpdGlvbmFsIHBlcm1pc3Npb24gdW5kZXIgc2VjdGlvbiA3IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZSwgdmVyc2lvbiAzICgiR1BMdjMiKToKKyMKKyMgSWYgeW91IGNvbnZleSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHdvcmsgdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBkbyBzbyB1bmRlcgorIyB0ZXJtcyBvZiB5b3VyIGNob2ljZS4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKK200X2RlZmluZShbX0JPT1NUX1NFUklBTF0sIFttNF90cmFuc2xpdChbCisjIHNlcmlhbCAyNQorXSwgWyMKK10sIFtdKV0pCisKKyMgT3JpZ2luYWwgc291cmNlcyBjYW4gYmUgZm91bmQgYXQgaHR0cDovL2dpdGh1Yi5jb20vdHN1bmEvYm9vc3QubTQKKyMgWW91IGNhbiBmZXRjaCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIHNjcmlwdCBieSBkb2luZzoKKyMgICB3Z2V0IGh0dHA6Ly9naXRodWIuY29tL3RzdW5hL2Jvb3N0Lm00L3Jhdy9tYXN0ZXIvYnVpbGQtYXV4L2Jvb3N0Lm00CisKKyMgLS0tLS0tICMKKyMgUkVBRE1FICMKKyMgLS0tLS0tICMKKworIyBUaGlzIGZpbGUgcHJvdmlkZXMgc2V2ZXJhbCBtYWNyb3MgdG8gdXNlIHRoZSB2YXJpb3VzIEJvb3N0IGxpYnJhcmllcy4KKyMgVGhlIGZpcnN0IG1hY3JvIGlzIEJPT1NUX1JFUVVJUkUuICBJdCB3aWxsIHNpbXBseSBjaGVjayBpZiBpdCdzIHBvc3NpYmxlIHRvCisjIGZpbmQgdGhlIEJvb3N0IGhlYWRlcnMgb2YgYSBnaXZlbiAob3B0aW9uYWwpIG1pbmltdW0gdmVyc2lvbiBhbmQgaXQgd2lsbAorIyBkZWZpbmUgQk9PU1RfQ1BQRkxBR1MgYWNjb3JkaW5nbHkuICBJdCB3aWxsIGFkZCBhbiBvcHRpb24gLS13aXRoLWJvb3N0IHRvCisjIHlvdXIgY29uZmlndXJlIHNvIHRoYXQgdXNlcnMgY2FuIHNwZWNpZnkgbm9uIHN0YW5kYXJkIGxvY2F0aW9ucy4KKyMgSWYgdGhlIHVzZXIncyBlbnZpcm9ubWVudCBjb250YWlucyBCT09TVF9ST09UIGFuZCAtLXdpdGgtYm9vc3Qgd2FzIG5vdAorIyBzcGVjaWZpZWQsIC0td2l0aC1ib29zdD0kQk9PU1RfUk9PVCBpcyBpbXBsaWNpdGx5IHVzZWQuCisjIEZvciBtb3JlIFJFQURNRSBhbmQgZG9jdW1lbnRhdGlvbiwgZ28gdG8gaHR0cDovL2dpdGh1Yi5jb20vdHN1bmEvYm9vc3QubTQKKyMgTm90ZTogVEhFU0UgTUFDUk9TIEFTU1VNRSBUSEFUIFlPVSBVU0UgTElCVE9PTC4gIElmIHlvdSBkb24ndCwgZG9uJ3Qgd29ycnksCisjIHNpbXBseSByZWFkIHRoZSBSRUFETUUsIGl0IHdpbGwgc2hvdyB5b3Ugd2hhdCB0byBkbyBzdGVwIGJ5IHN0ZXAuCisKK200X3BhdHRlcm5fZm9yYmlkKFteXz8oQk9PU1R8Qm9vc3QpX10pCisKKworIyBfQk9PU1RfU0VEX0NQUChTRUQtUFJPR1JBTSwgUFJPR1JBTSwKKyMgICAgICAgICAgICAgICAgW0FDVElPTi1JRi1GT1VORF0sIFtBQ1RJT04tSUYtTk9ULUZPVU5EXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2FtZSBhcyBBQ19FR1JFUF9DUFAsIGJ1dCBsZWF2ZSB0aGUgcmVzdWx0IGluIGNvbmZ0ZXN0LmkuCisjCisjIFNFRC1QUk9HUkFNIGlzICpub3QqIG92ZXJxdW90ZWQsIGFzIGluIEFDX0VHUkVQX0NQUC4gIEl0IGlzIGV4cGFuZGVkCisjIGluIGRvdWJsZS1xdW90ZXMsIHNvIGVzY2FwZSB5b3VyIGRvdWJsZSBxdW90ZXMuCisjCisjIEl0IGNvdWxkIGJlIHVzZWZ1bCB0byB0dXJuIHRoaXMgaW50byBhIG1hY3JvIHdoaWNoIGV4dHJhY3RzIHRoZQorIyB2YWx1ZSBvZiBhbnkgbWFjcm8uCittNF9kZWZpbmUoW19CT09TVF9TRURfQ1BQXSwKK1tBQ19MQU5HX1BVU0goW0MrK10pZG5sCitBQ19MQU5HX1BSRVBST0NfUkVRVUlSRSgpZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX1NFRF0pZG5sCitBQ19MQU5HX0NPTkZURVNUKFtBQ19MQU5HX1NPVVJDRShbWyQyXV0pXSkKK0FTX0lGKFtkbmwgZXZhbCBpcyBuZWNlc3NhcnkgdG8gZXhwYW5kIGFjX2NwcC4KK2RubCBVbHRyaXggYW5kIFB5cmFtaWQgc2ggcmVmdXNlIHRvIHJlZGlyZWN0IG91dHB1dCBvZiBldmFsLCBzbyB1c2Ugc3Vic2hlbGwuCitkbmwgQmV3YXJlIG9mIFdpbmRvd3MgZW5kLW9mLWxpbmVzLCBmb3IgaW5zdGFuY2UgaWYgd2UgYXJlIHJ1bm5pbmcKK2RubCBzb21lIFdpbmRvd3MgcHJvZ3JhbXMgdW5kZXIgV2luZS4gIEluIHRoYXQgY2FzZSwgYm9vc3QvdmVyc2lvbi5ocHAKK2RubCBpcyBjZXJ0YWlubHkgdXNpbmcgIlxyXG4iLCBidXQgdGhlIHJlZ3VsYXIgVW5peCBzaGVsbCB3aWxsIG9ubHkKK2RubCBzdHJpcCBgXG4nIHdpdGggYmFja3F1b3Rlcywgbm90IHRoZSBgXHInLiAgVGhpcyByZXN1bHRzIGluCitkbmwgYm9vc3RfY3ZfbGliX3ZlcnNpb249JzFfMzdccicgZm9yIGluc3RhbmNlLCB3aGljaCBicmVha3MKK2RubCBldmVyeXRoaW5nIGVsc2UuCitkbmwgQ2Fubm90IHVzZSAnZG5sJyBhZnRlciBbJDRdIGJlY2F1c2UgYSB0cmFpbGluZyBkbmwgbWF5IGJyZWFrIEFDX0NBQ0hFX0NIRUNLCitkbmwKK2RubCBCZXdhcmUgdGhhdCBHQ0MgNSwgd2hlbiBleHBhbmRpbmcgbWFjcm9zLCBtYXkgZW1iZWQgIyBsaW5lIGRpcmVjdGl2ZXMKK2RubCBhIHdpdGhpbiBzaW5nbGUgbGluZToKK2RubAorZG5sICMgMSAiY29uZnRlc3QuY2MiCitkbmwgIyAxICI8YnVpbHQtaW4+IgorZG5sICMgMSAiPGNvbW1hbmQtbGluZT4iCitkbmwgIyAxICJjb25mdGVzdC5jYyIKK2RubCAjIDEgIi9vcHQvbG9jYWwvaW5jbHVkZS9ib29zdC92ZXJzaW9uLmhwcCIgMSAzCitkbmwgIyAyICJjb25mdGVzdC5jYyIgMgorZG5sIGJvb3N0LWxpYi12ZXJzaW9uID0KK2RubCAjIDIgImNvbmZ0ZXN0LmNjIiAzCitkbmwgICAgICAgICAgICAgICAgICAgICIxXzU2IgorZG5sCitkbmwgU28gZ2V0IHJpZCBvZiB0aGUgIyBsaW5lcywgYW5kIGdsdWUgdGhlIHJlbWFpbmluZyBvbmVzIHRvZ2V0aGVyLgorKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JkFTX01FU1NBR0VfTE9HX0ZEIHwKKyAgZ3JlcCAtdiAnIycgfAorICB0ciAtZCAnXHInIHwKKyAgdHIgLXMgJ1xuJyAnICcgfAorICAkU0VEIC1uIC1lICIkMSIgPmNvbmZ0ZXN0LmkgMj4mMV0sCisgIFskM10sCisgIFskNF0pCitybSAtcmYgY29uZnRlc3QqCitBQ19MQU5HX1BPUChbQysrXSlkbmwKK10pIyBfQk9PU1RfU0VEX0NQUAorCisKKworIyBCT09TVF9SRVFVSVJFKFtWRVJTSU9OXSwgW0FDVElPTi1JRi1OT1QtRk9VTkRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC4gIElmIHZlcnNpb24gaXMgZ2l2ZW4sIGl0IG11c3QgZWl0aGVyIGJlIGEgbGl0ZXJhbCBvZiB0aGUgZm9ybQorIyAiWC5ZLloiIHdoZXJlIFgsIFkgYW5kIFogYXJlIGludGVnZXJzICh0aGUgIi5aIiBwYXJ0IGJlaW5nIG9wdGlvbmFsKSBvciBhCisjIHZhcmlhYmxlICIkdmFyIi4KKyMgRGVmaW5lcyB0aGUgdmFsdWUgQk9PU1RfQ1BQRkxBR1MuICBUaGlzIG1hY3JvIG9ubHkgY2hlY2tzIGZvciBoZWFkZXJzIHdpdGgKKyMgdGhlIHJlcXVpcmVkIHZlcnNpb24sIGl0IGRvZXMgbm90IGNoZWNrIGZvciBhbnkgb2YgdGhlIEJvb3N0IGxpYnJhcmllcy4KKyMgT24gIyBzdWNjZXNzLCBkZWZpbmVzIEhBVkVfQk9PU1QuICBPbiBmYWlsdXJlLCBjYWxscyB0aGUgb3B0aW9uYWwKKyMgQUNUSU9OLUlGLU5PVC1GT1VORCBhY3Rpb24gaWYgb25lIHdhcyBzdXBwbGllZC4KKyMgT3RoZXJ3aXNlIGFib3J0cyB3aXRoIGFuIGVycm9yIG1lc3NhZ2UuCitBQ19ERUZVTl9PTkNFKFtCT09TVF9SRVFVSVJFXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0NYWF0pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX0dSRVBdKWRubAorZWNobyAiJGFzX21lOiB0aGlzIGlzIGJvb3N0Lm00W11fQk9PU1RfU0VSSUFMIiA+JkFTX01FU1NBR0VfTE9HX0ZECitib29zdF9zYXZlX0lGUz0kSUZTCitib29zdF92ZXJzaW9uX3JlcT0kMQorSUZTPS4KK3NldCB4ICRib29zdF92ZXJzaW9uX3JlcSAwIDAgMAorSUZTPSRib29zdF9zYXZlX0lGUworc2hpZnQKK2Jvb3N0X3ZlcnNpb25fcmVxPWBleHByICIkWzFdIiAnKicgMTAwMDAwICsgIiRbMl0iICcqJyAxMDAgKyAiJFszXSJgCitib29zdF92ZXJzaW9uX3JlcV9zdHJpbmc9JFsxXS4kWzJdLiRbM10KK0FDX0FSR19XSVRIKFtib29zdF0sCisgICBbQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1ib29zdD1ESVJdLAorICAgICAgICAgICAgICAgICAgIFtwcmVmaXggb2YgQm9vc3QgJDEgQDw6QGd1ZXNzQDo+QF0pXSlkbmwKK0FDX0FSR19WQVIoW0JPT1NUX1JPT1RdLFtMb2NhdGlvbiBvZiBCb29zdCBpbnN0YWxsYXRpb25dKWRubAorIyBJZiBCT09TVF9ST09UIGlzIHNldCBhbmQgdGhlIHVzZXIgaGFzIG5vdCBwcm92aWRlZCBhIHZhbHVlIHRvCisjIC0td2l0aC1ib29zdCwgdGhlbiB0cmVhdCBCT09TVF9ST09UIGFzIGlmIGl0IHRoZSB1c2VyIHN1cHBsaWVkIGl0LgoraWYgdGVzdCB4IiRCT09TVF9ST09UIiAhPSB4OyB0aGVuCisgIGlmIHRlc3QgeCIkd2l0aF9ib29zdCIgPSB4OyB0aGVuCisgICAgQUNfTVNHX05PVElDRShbRGV0ZWN0ZWQgQk9PU1RfUk9PVDsgY29udGludWluZyB3aXRoIC0td2l0aC1ib29zdD0kQk9PU1RfUk9PVF0pCisgICAgd2l0aF9ib29zdD0kQk9PU1RfUk9PVAorICBlbHNlCisgICAgQUNfTVNHX05PVElDRShbRGV0ZWN0ZWQgQk9PU1RfUk9PVD0kQk9PU1RfUk9PVCwgYnV0IG92ZXJyaWRkZW4gYnkgLS13aXRoLWJvb3N0PSR3aXRoX2Jvb3N0XSkKKyAgZmkKK2ZpCitBQ19TVUJTVChbRElTVENIRUNLX0NPTkZJR1VSRV9GTEFHU10sCisgICAgICAgICBbIiRESVNUQ0hFQ0tfQ09ORklHVVJFX0ZMQUdTICctLXdpdGgtYm9vc3Q9JHdpdGhfYm9vc3QnIl0pZG5sCitib29zdF9zYXZlX0NQUEZMQUdTPSRDUFBGTEFHUworICBBQ19DQUNIRV9DSEVDSyhbZm9yIEJvb3N0IGhlYWRlcnMgdmVyc2lvbiA+PSAkYm9vc3RfdmVyc2lvbl9yZXFfc3RyaW5nXSwKKyAgICBbYm9vc3RfY3ZfaW5jX3BhdGhdLAorICAgIFtib29zdF9jdl9pbmNfcGF0aD1ubworQUNfTEFOR19QVVNIKFtDKytdKWRubAorbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX1ZFUlNJT04kXSlkbmwKKyAgICBBQ19MQU5HX0NPTkZURVNUKFtBQ19MQU5HX1BST0dSQU0oW1sjaW5jbHVkZSA8Ym9vc3QvdmVyc2lvbi5ocHA+CisjaWYgIWRlZmluZWQgQk9PU1RfVkVSU0lPTgorIyBlcnJvciBCT09TVF9WRVJTSU9OIGlzIG5vdCBkZWZpbmVkCisjZWxpZiBCT09TVF9WRVJTSU9OIDwgJGJvb3N0X3ZlcnNpb25fcmVxCisjIGVycm9yIEJvb3N0IGhlYWRlcnMgdmVyc2lvbiA8ICRib29zdF92ZXJzaW9uX3JlcQorI2VuZGlmCitdXSldKQorICAgICMgSWYgdGhlIHVzZXIgcHJvdmlkZWQgYSB2YWx1ZSB0byAtLXdpdGgtYm9vc3QsIHVzZSBpdCBhbmQgb25seSBpdC4KKyAgICBjYXNlICR3aXRoX2Jvb3N0IGluICMoCisgICAgICAnJ3x5ZXMpIHNldCB4ICcnIC9vcHQvbG9jYWwvaW5jbHVkZSAvdXNyL2xvY2FsL2luY2x1ZGUgL29wdC9pbmNsdWRlIFwKKyAgICAgICAgICAgICAgICAgL3Vzci9pbmNsdWRlIEM6L0Jvb3N0L2luY2x1ZGU7OyAjKAorICAgICAgKikgICAgICBzZXQgeCAiJHdpdGhfYm9vc3QvaW5jbHVkZSIgIiR3aXRoX2Jvb3N0Ijs7CisgICAgZXNhYworICAgIHNoaWZ0CisgICAgZm9yIGJvb3N0X2RpcgorICAgIGRvCisgICAgIyBXaXRob3V0IC0tbGF5b3V0PXN5c3RlbSwgQm9vc3QgKG9yIGF0IGxlYXN0IHNvbWUgdmVyc2lvbnMpIGluc3RhbGxzCisgICAgIyBpdHNlbGYgaW4gPHByZWZpeD4vaW5jbHVkZS9ib29zdC08dmVyc2lvbj4uICBUaGlzIGlubmVyIGxvb3AgaGVscHMgdG8KKyAgICAjIGZpbmQgaGVhZGVycyBpbiBzdWNoIGRpcmVjdG9yaWVzLgorICAgICMKKyAgICAjIEFueSAke2Jvb3N0X2Rpcn0vYm9vc3QteF94eCBkaXJlY3RvcmllcyBhcmUgc2VhcmNoZWQgaW4gcmV2ZXJzZSB2ZXJzaW9uCisgICAgIyBvcmRlciBmb2xsb3dlZCBieSAke2Jvb3N0X2Rpcn0uICBUaGUgZmluYWwgJy4nIGlzIGEgc2VudGluZWwgZm9yCisgICAgIyBzZWFyY2hpbmcgJGJvb3N0X2RpciIgaXRzZWxmLiAgRW50cmllcyBhcmUgd2hpdGVzcGFjZSBzZXBhcmF0ZWQuCisgICAgIworICAgICMgSSBkaWRuJ3QgaW5kZW50IHRoaXMgbG9vcCBvbiBwdXJwb3NlICh0byBhdm9pZCBvdmVyLWluZGVudGVkIGNvZGUpCisgICAgYm9vc3RfbGF5b3V0X3N5c3RlbV9zZWFyY2hfbGlzdD1gY2QgIiRib29zdF9kaXIiIDI+L2Rldi9udWxsIFwKKyAgICAgICAgJiYgbHMgLTEgfCAiJHtHUkVQfSIgJ15ib29zdC0nIHwgc29ydCAtcm4gLXQtIC1rMiBcCisgICAgICAgICYmIGVjaG8gLmAKKyAgICBmb3IgYm9vc3RfaW5jIGluICRib29zdF9sYXlvdXRfc3lzdGVtX3NlYXJjaF9saXN0CisgICAgZG8KKyAgICAgIGlmIHRlc3QgeCIkYm9vc3RfaW5jIiAhPSB4LjsgdGhlbgorICAgICAgICBib29zdF9pbmM9IiRib29zdF9kaXIvJGJvb3N0X2luYyIKKyAgICAgIGVsc2UKKyAgICAgICAgYm9vc3RfaW5jPSIkYm9vc3RfZGlyIiAjIFVzZXMgc2VudGluZWwgaW4gYm9vc3RfbGF5b3V0X3N5c3RlbV9zZWFyY2hfbGlzdAorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgeCIkYm9vc3RfaW5jIiAhPSB4OyB0aGVuCisgICAgICAgICMgV2UgYXJlIGdvaW5nIHRvIGNoZWNrIHdoZXRoZXIgdGhlIHZlcnNpb24gb2YgQm9vc3QgaW5zdGFsbGVkCisgICAgICAgICMgaW4gJGJvb3N0X2luYyBpcyB1c2FibGUgYnkgcnVubmluZyBhIGNvbXBpbGF0aW9uIHRoYXQKKyAgICAgICAgIyAjaW5jbHVkZXMgaXQuICBCdXQgaWYgd2UgcGFzcyBhIC1JL3NvbWUvcGF0aCBpbiB3aGljaCBCb29zdAorICAgICAgICAjIGlzIG5vdCBpbnN0YWxsZWQsIHRoZSBjb21waWxlciB3aWxsIGp1c3Qgc2tpcCB0aGlzIC1JIGFuZAorICAgICAgICAjIHVzZSBvdGhlciBsb2NhdGlvbnMgKGVpdGhlciBmcm9tIENQUEZMQUdTLCBvciBmcm9tIGl0cyBsaXN0CisgICAgICAgICMgb2Ygc3lzdGVtIGluY2x1ZGUgZGlyZWN0b3JpZXMpLiAgQXMgYSByZXN1bHQgd2Ugd291bGQgdXNlCisgICAgICAgICMgaGVhZGVyIGluc3RhbGxlZCBvbiB0aGUgbWFjaGluZSBpbnN0ZWFkIG9mIHRoZSAvc29tZS9wYXRoCisgICAgICAgICMgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLiAgU28gaW4gdGhhdCBwcmVjaXNlIGNhc2UgKHRyeWluZworICAgICAgICAjICRib29zdF9pbmMpLCBtYWtlIHN1cmUgdGhlIHZlcnNpb24uaHBwIGV4aXN0cy4KKyAgICAgICAgIworICAgICAgICAjIFVzZSB0ZXN0IC1lIGFzIHRoZXJlIGNhbiBiZSBzeW1saW5rcy4KKyAgICAgICAgdGVzdCAtZSAiJGJvb3N0X2luYy9ib29zdC92ZXJzaW9uLmhwcCIgfHwgY29udGludWUKKyAgICAgICAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAtSSRib29zdF9pbmMiCisgICAgICBmaQorICAgICAgQUNfQ09NUElMRV9JRkVMU0UoW10sIFtib29zdF9jdl9pbmNfcGF0aD15ZXNdLCBbYm9vc3RfY3ZfdmVyc2lvbj1ub10pCisgICAgICBpZiB0ZXN0IHgiJGJvb3N0X2N2X2luY19wYXRoIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgaWYgdGVzdCB4IiRib29zdF9pbmMiICE9IHg7IHRoZW4KKyAgICAgICAgICBib29zdF9jdl9pbmNfcGF0aD0kYm9vc3RfaW5jCisgICAgICAgIGZpCisgICAgICAgIGJyZWFrIDIKKyAgICAgIGZpCisgICAgZG9uZQorICAgIGRvbmUKK0FDX0xBTkdfUE9QKFtDKytdKWRubAorICAgIF0pCisgICAgY2FzZSAkYm9vc3RfY3ZfaW5jX3BhdGggaW4gIygKKyAgICAgIG5vKQorICAgICAgICBib29zdF9lcnJtc2c9ImNhbm5vdCBmaW5kIEJvb3N0IGhlYWRlcnMgdmVyc2lvbiA+PSAkYm9vc3RfdmVyc2lvbl9yZXFfc3RyaW5nIgorICAgICAgICBtNF9pZihbJDJdLCBbXSwgIFtBQ19NU0dfRVJST1IoWyRib29zdF9lcnJtc2ddKV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbQUNfTVNHX05PVElDRShbJGJvb3N0X2Vycm1zZ10pXSkKKyAgICAgICAgJDIKKyAgICAgICAgOzsjKAorICAgICAgeWVzKQorICAgICAgICBCT09TVF9DUFBGTEFHUz0KKyAgICAgICAgOzsjKAorICAgICAgKikKKyAgICAgICAgQUNfU1VCU1QoW0JPT1NUX0NQUEZMQUdTXSwgWyItSSRib29zdF9jdl9pbmNfcGF0aCJdKWRubAorICAgICAgICA7OworICAgIGVzYWMKKyAgaWYgdGVzdCB4IiRib29zdF9jdl9pbmNfcGF0aCIgIT0geG5vOyB0aGVuCisgIEFDX0RFRklORShbSEFWRV9CT09TVF0sIFsxXSwKKyAgICAgICAgICAgIFtEZWZpbmVkIGlmIHRoZSByZXF1ZXN0ZWQgbWluaW11bSBCT09TVCB2ZXJzaW9uIGlzIHNhdGlzZmllZF0pCisgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgQm9vc3QncyBoZWFkZXIgdmVyc2lvbl0sCisgICAgW2Jvb3N0X2N2X2xpYl92ZXJzaW9uXSwKKyAgICBbbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX0xJQl9WRVJTSU9OJF0pZG5sCisgICAgIF9CT09TVF9TRURfQ1BQKFtbL15ib29zdC1saWItdmVyc2lvbiA9IC97cy8vLztzL1tcIiBdLy9nO3A7cTt9XV0sCisgICAgICAgICAgICAgICAgICAgIFsjaW5jbHVkZSA8Ym9vc3QvdmVyc2lvbi5ocHA+Citib29zdC1saWItdmVyc2lvbiA9IEJPT1NUX0xJQl9WRVJTSU9OXSwKKyAgICBbYm9vc3RfY3ZfbGliX3ZlcnNpb249YGNhdCBjb25mdGVzdC5pYF0pXSkKKyAgICAjIGUuZy4gIjEzNCIgZm9yIDFfMzRfMSBvciAiMTM1IiBmb3IgMV8zNQorICAgIGJvb3N0X21ham9yX3ZlcnNpb249YGVjaG8gIiRib29zdF9jdl9saWJfdmVyc2lvbiIgfCBzZWQgJ3MvXy8vO3MvXy4qLy8nYAorICAgIGNhc2UgJGJvb3N0X21ham9yX3ZlcnNpb24gaW4gIygKKyAgICAgICcnIHwgKltbITAtOV1dKikKKyAgICAgICAgQUNfTVNHX0VSUk9SKFtpbnZhbGlkIHZhbHVlOiBib29zdF9tYWpvcl92ZXJzaW9uPSckYm9vc3RfbWFqb3JfdmVyc2lvbiddKQorICAgICAgICA7OworICAgIGVzYWMKK2ZpCitDUFBGTEFHUz0kYm9vc3Rfc2F2ZV9DUFBGTEFHUworXSkjIEJPT1NUX1JFUVVJUkUKKworCisjIEJPT1NUX1NUQVRJQygpCisjIC0tLS0tLS0tLS0tLS0tCisjIEFkZCB0aGUgIi0tZW5hYmxlLXN0YXRpYy1ib29zdCIgY29uZmlndXJlIGFyZ3VtZW50LiBJZiB0aGlzIGFyZ3VtZW50IGlzIGdpdmVuCisjIG9uIHRoZSBjb21tYW5kIGxpbmUsIHN0YXRpYyB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyaWVzIHdpbGwgYmUgbG9va2VkIHVwLgorQUNfREVGVU4oW0JPT1NUX1NUQVRJQ10sCisgIFtBQ19BUkdfRU5BQkxFKFtzdGF0aWMtYm9vc3RdLAorICAgICBbQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXN0YXRpYy1ib29zdF0sCisgICAgICAgICAgICAgICBbUHJlZmVyIHRoZSBzdGF0aWMgYm9vc3QgbGlicmFyaWVzIG92ZXIgdGhlIHNoYXJlZCBvbmVzIFtub11dKV0sCisgICAgIFtlbmFibGVfc3RhdGljX2Jvb3N0PXllc10sCisgICAgIFtlbmFibGVfc3RhdGljX2Jvb3N0PW5vXSldKSMgQk9PU1RfU1RBVElDCisKKworIyBCT09TVF9GSU5EX0hFQURFUihbSEVBREVSLU5BTUVdLCBbQUNUSU9OLUlGLU5PVC1GT1VORF0sIFtBQ1RJT04tSUYtRk9VTkRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBXcmFwcGVyIGFyb3VuZCBBQ19DSEVDS19IRUFERVIgZm9yIEJvb3N0IGhlYWRlcnMuICBVc2VmdWwgdG8gY2hlY2sgZm9yCisjIHNvbWUgcGFydHMgb2YgdGhlIEJvb3N0IGxpYnJhcnkgd2hpY2ggYXJlIG9ubHkgbWFkZSBvZiBoZWFkZXJzIGFuZCBkb24ndAorIyByZXF1aXJlIGxpbmtpbmcgKHN1Y2ggYXMgQm9vc3QuRm9yZWFjaCkuCisjCisjIERlZmF1bHQgQUNUSU9OLUlGLU5PVC1GT1VORDogRmFpbCB3aXRoIGEgZmF0YWwgZXJyb3IgdW5sZXNzIEJvb3N0IGNvdWxkbid0IGJlCisjIGZvdW5kIGluIHRoZSBmaXJzdCBwbGFjZSwgaW4gd2hpY2ggY2FzZSBieSBkZWZhdWx0IGEgbm90aWNlIGlzIGlzc3VlZCB0byB0aGUKKyMgdXNlci4gIFByZXN1bWFibHkgaWYgd2UgaGF2ZW4ndCBkaWVkIGFscmVhZHkgaXQncyBiZWNhdXNlIGl0J3MgT0sgdG8gbm90IGhhdmUKKyMgQm9vc3QsIHdoaWNoIGlzIHdoeSBvbmx5IGEgbm90aWNlIGlzIGlzc3VlZCBpbnN0ZWFkIG9mIGEgaGFyZCBlcnJvci4KKyMKKyMgRGVmYXVsdCBBQ1RJT04tSUYtRk9VTkQ6IGRlZmluZSB0aGUgcHJlcHJvY2Vzc29yIHN5bWJvbCBIQVZFXzxIRUFERVItTkFNRT4gaW4KKyMgY2FzZSBvZiBzdWNjZXNzICMgKHdoZXJlIEhFQURFUi1OQU1FIGlzIHdyaXR0ZW4gTElLRV9USElTLCBlLmcuLAorIyBIQVZFX0JPT1NUX0ZPUkVBQ0hfSFBQKS4KK0FDX0RFRlVOKFtCT09TVF9GSU5EX0hFQURFUl0sCitbQUNfUkVRVUlSRShbQk9PU1RfUkVRVUlSRV0pZG5sCitpZiB0ZXN0IHgiJGJvb3N0X2N2X2luY19wYXRoIiA9IHhubzsgdGhlbgorICBtNF9kZWZhdWx0KFskMl0sIFtBQ19NU0dfTk9USUNFKFtCb29zdCBub3QgYXZhaWxhYmxlLCBub3Qgc2VhcmNoaW5nIGZvciAkMV0pXSkKK2Vsc2UKK0FDX0xBTkdfUFVTSChbQysrXSlkbmwKK2Jvb3N0X3NhdmVfQ1BQRkxBR1M9JENQUEZMQUdTCitDUFBGTEFHUz0iJENQUEZMQUdTICRCT09TVF9DUFBGTEFHUyIKK0FDX0NIRUNLX0hFQURFUihbJDFdLAorICBbbTRfZGVmYXVsdChbJDNdLCBbQUNfREVGSU5FKEFTX1RSX0NQUChbSEFWRV8kMV0pLCBbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0RlZmluZSB0byAxIGlmIHlvdSBoYXZlIDwkMT5dKV0pXSwKKyAgW200X2RlZmF1bHQoWyQyXSwgW0FDX01TR19FUlJPUihbY2Fubm90IGZpbmQgJDFdKV0pXSkKK0NQUEZMQUdTPSRib29zdF9zYXZlX0NQUEZMQUdTCitBQ19MQU5HX1BPUChbQysrXSlkbmwKK2ZpCitdKSMgQk9PU1RfRklORF9IRUFERVIKKworCisjIEJPT1NUX0ZJTkRfTElCUyhbQ09NUE9ORU5ULU5BTUVdLCBbQ0FORElEQVRFLUxJQi1OQU1FU10sCisjICAgICAgICAgICAgICAgICBbUFJFRkVSUkVELVJULU9QVF0sIFtIRUFERVItTkFNRV0sIFtDWFgtVEVTVF0sCisjICAgICAgICAgICAgICAgICBbQ1hYLVBST0xPR1VFXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgdGhlIEJvb3N0IGxpYnJhcnkgQ09NUE9ORU5ULU5BTUUgKGUuZy4sIGB0aHJlYWQnLCBmb3IKKyMgbGliYm9vc3RfdGhyZWFkKSB1bmRlciB0aGUgcG9zc2libGUgQ0FORElEQVRFLUxJQi1OQU1FUyAoZS5nLiwKKyMgInRocmVhZF93aW4zMiB0aHJlYWQiKS4gIENoZWNrIHRoYXQgSEVBREVSLU5BTUUgd29ya3MgYW5kIGNoZWNrIHRoYXQKKyMgbGliYm9vc3RfTElCLU5BTUUgY2FuIGxpbmsgd2l0aCB0aGUgY29kZSBDWFgtVEVTVC4gIFRoZSBvcHRpb25hbAorIyBhcmd1bWVudCBDWFgtUFJPTE9HVUUgY2FuIGJlIHVzZWQgdG8gaW5jbHVkZSBzb21lIEMrKyBjb2RlIGJlZm9yZQorIyB0aGUgYG1haW4nIGZ1bmN0aW9uLgorIworIyBJbnZva2VzIEJPT1NUX0ZJTkRfSEVBREVSKFtIRUFERVItTkFNRV0pIChzZWUgYWJvdmUpLgorIworIyBCb29zdCBsaWJyYXJpZXMgdHlwaWNhbGx5IGNvbWUgY29tcGlsZWQgd2l0aCBzZXZlcmFsIGZsYXZvcnMgKHdpdGggZGlmZmVyZW50CisjIHJ1bnRpbWUgb3B0aW9ucykgc28gUFJFRkVSUkVELVJULU9QVCBpcyB0aGUgcHJlZmVycmVkIHN1ZmZpeC4gIEEgc3VmZml4IGlzIG9uZQorIyBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgbGV0dGVyczogc2dkcG4gKGluIHRoYXQgb3JkZXIpLiAgcyA9IHN0YXRpYworIyBydW50aW1lLCBkID0gZGVidWcgYnVpbGQsIGcgPSBkZWJ1Zy9kaWFnbm9zdGljIHJ1bnRpbWUsIHAgPSBTVExQb3J0IGJ1aWxkLAorIyBuID0gKHVuc3VyZSkgU1RMUG9ydCBidWlsZCB3aXRob3V0IGlvc3RyZWFtcyBmcm9tIFNUTFBvcnQgKGl0IGxvb2tzIGxpa2UgYG4nCisjIG11c3QgYWx3YXlzIGJlIHVzZWQgYWxvbmcgd2l0aCBgcCcpLiAgQWRkaXRpb25hbGx5LCBQUkVGRVJSRUQtUlQtT1BUIGNhbgorIyBzdGFydCB3aXRoIGBtdC0nIHRvIGluZGljYXRlIHRoYXQgdGhlcmUgaXMgYSBwcmVmZXJlbmNlIGZvciBtdWx0aS10aHJlYWQKKyMgYnVpbGRzLiAgU29tZSBzYW1wbGUgdmFsdWVzIGZvciBQUkVGRVJSRUQtUlQtT1BUOiAobm90aGluZyksIG10LCBkLCBtdC1kLCBnZHAKKyMgLi4uICBJZiB5b3Ugd2FudCB0byBtYWtlIHN1cmUgeW91IGhhdmUgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIEJvb3N0CisjIChlZywgPj0gMS4zMykgeW91ICptdXN0KiBpbnZva2UgQk9PU1RfUkVRVUlSRSBiZWZvcmUgdGhpcyBtYWNyby4KK0FDX0RFRlVOKFtCT09TVF9GSU5EX0xJQlNdLAorW0FDX1JFUVVJUkUoW0JPT1NUX1JFUVVJUkVdKWRubAorQUNfUkVRVUlSRShbX0JPT1NUX0ZJTkRfQ09NUElMRVJfVEFHXSlkbmwKK0FDX1JFUVVJUkUoW0JPT1NUX1NUQVRJQ10pZG5sCitBQ19SRVFVSVJFKFtfQk9PU1RfR1VFU1NfV0hFVEhFUl9UT19VU0VfTVRdKWRubAoraWYgdGVzdCB4IiRib29zdF9jdl9pbmNfcGF0aCIgPSB4bm87IHRoZW4KKyAgQUNfTVNHX05PVElDRShbQm9vc3Qgbm90IGF2YWlsYWJsZSwgbm90IHNlYXJjaGluZyBmb3IgdGhlIEJvb3N0ICQxIGxpYnJhcnldKQorZWxzZQorZG5sIFRoZSBlbHNlIGJyYW5jaCBpcyBodWdlIGFuZCB3YXNuJ3QgaW50ZW5kZWQgb24gcHVycG9zZS4KK0FDX0xBTkdfUFVTSChbQysrXSlkbmwKK0FTX1ZBUl9QVVNIREVGKFtCb29zdF9saWJdLCBbYm9vc3RfY3ZfbGliXyQxXSlkbmwKK0FTX1ZBUl9QVVNIREVGKFtCb29zdF9saWJfTERGTEFHU10sIFtib29zdF9jdl9saWJfJDFfTERGTEFHU10pZG5sCitBU19WQVJfUFVTSERFRihbQm9vc3RfbGliX0xEUEFUSF0sIFtib29zdF9jdl9saWJfJDFfTERQQVRIXSlkbmwKK0FTX1ZBUl9QVVNIREVGKFtCb29zdF9saWJfTElCU10sIFtib29zdF9jdl9saWJfJDFfTElCU10pZG5sCitCT09TVF9GSU5EX0hFQURFUihbJDRdKQorYm9vc3Rfc2F2ZV9DUFBGTEFHUz0kQ1BQRkxBR1MKK0NQUEZMQUdTPSIkQ1BQRkxBR1MgJEJPT1NUX0NQUEZMQUdTIgorQUNfQ0FDSEVfQ0hFQ0soW2ZvciB0aGUgQm9vc3QgJDEgbGlicmFyeV0sIFtCb29zdF9saWJdLAorICAgICAgICAgICAgICAgW19CT09TVF9GSU5EX0xJQlMoJEApXSkKK2Nhc2UgJEJvb3N0X2xpYiBpbiAjKAorICAobm8pIF9BQ19NU0dfTE9HX0NPTkZURVNUCisgICAgQUNfTVNHX0VSUk9SKFtjYW5ub3QgZmluZCB0aGUgZmxhZ3MgdG8gbGluayB3aXRoIEJvb3N0ICQxXSkKKyAgICA7OworZXNhYworQUNfU1VCU1QoQVNfVFJfQ1BQKFtCT09TVF8kMV9MREZMQUdTXSksIFskQm9vc3RfbGliX0xERkxBR1NdKWRubAorQUNfU1VCU1QoQVNfVFJfQ1BQKFtCT09TVF8kMV9MRFBBVEhdKSwgWyRCb29zdF9saWJfTERQQVRIXSlkbmwKK0FDX1NVQlNUKFtCT09TVF9MRFBBVEhdLCBbJEJvb3N0X2xpYl9MRFBBVEhdKWRubAorQUNfU1VCU1QoQVNfVFJfQ1BQKFtCT09TVF8kMV9MSUJTXSksIFskQm9vc3RfbGliX0xJQlNdKWRubAorQ1BQRkxBR1M9JGJvb3N0X3NhdmVfQ1BQRkxBR1MKK0FTX1ZBUl9QT1BERUYoW0Jvb3N0X2xpYl0pZG5sCitBU19WQVJfUE9QREVGKFtCb29zdF9saWJfTERGTEFHU10pZG5sCitBU19WQVJfUE9QREVGKFtCb29zdF9saWJfTERQQVRIXSlkbmwKK0FTX1ZBUl9QT1BERUYoW0Jvb3N0X2xpYl9MSUJTXSlkbmwKK0FDX0xBTkdfUE9QKFtDKytdKWRubAorZmkKK10pCisKKworIyBCT09TVF9GSU5EX0xJQihbTElCLU5BTUVdLAorIyAgICAgICAgICAgICAgICBbUFJFRkVSUkVELVJULU9QVF0sIFtIRUFERVItTkFNRV0sIFtDWFgtVEVTVF0sCisjICAgICAgICAgICAgICAgIFtDWFgtUFJPTE9HVUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdyYXBwZXIgZm9yIEJPT1NUX0ZJTkRfTElCUy4KK0FDX0RFRlVOKFtCT09TVF9GSU5EX0xJQl0sCitbQk9PU1RfRklORF9MSUJTKFskMV0sICRAKV0pCisKKworIyBfQk9PU1RfRklORF9MSUJTKFtMSUItTkFNRV0sIFtDQU5ESURBVEUtTElCLU5BTUVTXSwKKyMgICAgICAgICAgICAgICAgIFtQUkVGRVJSRUQtUlQtT1BUXSwgW0hFQURFUi1OQU1FXSwgW0NYWC1URVNUXSwKKyMgICAgICAgICAgICAgICAgIFtDWFgtUFJPTE9HVUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBSZWFsIGltcGxlbWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCUzogcmVseSBvbiB0aGVzZSBsb2NhbCBtYWNyb3M6CisjIEJvb3N0X2xpYiwgQm9vc3RfbGliX0xERkxBR1MsIEJvb3N0X2xpYl9MRFBBVEgsIEJvb3N0X2xpYl9MSUJTCisjCisjIFRoZSBhbGdvcml0aG0gaXMgYXMgZm9sbG93czogZmlyc3QgbG9vayBmb3IgYSBnaXZlbiBsaWJyYXJ5IG5hbWUKKyMgYWNjb3JkaW5nIHRvIHRoZSB1c2VyJ3MgUFJFRkVSUkVELVJULU9QVC4gIEZvciBlYWNoIGxpYnJhcnkgbmFtZSwgd2UKKyMgcHJlZmVyIHRvIHVzZSB0aGUgb25lcyB0aGF0IGNhcnJ5IHRoZSB0YWcgKHRvb2xzZXQgbmFtZSkuICBFYWNoCisjIGxpYnJhcnkgaXMgc2VhcmNoZWQgdGhyb3VnaCB0aGUgdmFyaW91cyBzdGFuZGFyZCBwYXRocyB3ZXJlIEJvb3N0IGlzCisjIHVzdWFsbHkgaW5zdGFsbGVkLiAgSWYgd2UgY2FuJ3QgZmluZCB0aGUgc3RhbmRhcmQgdmFyaWFudHMsIHdlIHRyeQorIyB0byBlbmZvcmNlIC1tdCAoZm9yIGluc3RhbmNlIG9uIE1hY09TWCwgbGliYm9vc3RfdGhyZWFkLmR5bGliCisjIGRvZXNuJ3QgZXhpc3QgYnV0IHRoZXJlJ3MgLW9idmlvdXNseS0gbGliYm9vc3RfdGhyZWFkLW10LmR5bGliKS4KK0FDX0RFRlVOKFtfQk9PU1RfRklORF9MSUJTXSwKK1tCb29zdF9saWI9bm8KKyAgY2FzZSAiJDMiIGluICMoCisgICAgKG10IHwgbXQtKSBib29zdF9tdD0tbXQ7IGJvb3N0X3J0b3B0PTs7ICMoCisgICAgKG10KiB8IG10LSopIGJvb3N0X210PS1tdDsgYm9vc3RfcnRvcHQ9YGV4cHIgIlgkMyIgOiAnWG10LSpcKC4qXCknYDs7ICMoCisgICAgKCopIGJvb3N0X210PTsgYm9vc3RfcnRvcHQ9JDM7OworICBlc2FjCisgIGlmIHRlc3QgJGVuYWJsZV9zdGF0aWNfYm9vc3QgPSB5ZXM7IHRoZW4KKyAgICBib29zdF9ydG9wdD0icyRib29zdF9ydG9wdCIKKyAgZmkKKyAgIyBGaW5kIHRoZSBwcm9wZXIgZGVidWcgdmFyaWFudCBkZXBlbmRpbmcgb24gd2hhdCB3ZSd2ZSBiZWVuIGFza2VkIHRvIGZpbmQuCisgIGNhc2UgJGJvb3N0X3J0b3B0IGluICMoCisgICAgKCpkKikgYm9vc3RfcnRfZD0kYm9vc3RfcnRvcHQ7OyAjKAorICAgICgqW1tzZ3BuXV0qKSAjIEluc2VydCB0aGUgYGQnIGF0IHRoZSByaWdodCBwbGFjZSAoaW4gYmV0d2VlbiBgc2cnIGFuZCBgcG4nKQorICAgICAgYm9vc3RfcnRfZD1gZWNobyAiJGJvb3N0X3J0b3B0IiB8IHNlZCAncy9cKHMqZypcKVwocCpuKlwpL1wxXDIvJ2A7OyAjKAorICAgICgqKSBib29zdF9ydF9kPSctZCc7OworICBlc2FjCisgICMgSWYgdGhlIFBSRUZFUlJFRC1SVC1PUFQgYXJlIG5vdCBlbXB0eSwgcHJlcGVuZCBhIGAtJy4KKyAgdGVzdCAtbiAiJGJvb3N0X3J0b3B0IiAmJiBib29zdF9ydG9wdD0iLSRib29zdF9ydG9wdCIKKyAgJGJvb3N0X2d1ZXNzX3VzZV9tdCAmJiBib29zdF9tdD0tbXQKKyAgIyBMb29rIGZvciB0aGUgYWJzIHBhdGggdGhlIHN0YXRpYyBhcmNoaXZlLgorICAjICRsaWJleHQgaXMgY29tcHV0ZWQgYnkgTGlidG9vbCBidXQgbGV0J3MgbWFrZSBzdXJlIGl0J3Mgbm9uIGVtcHR5LgorICB0ZXN0IC16ICIkbGliZXh0IiAmJgorICAgIEFDX01TR19FUlJPUihbdGhlIGxpYmV4dCB2YXJpYWJsZSBpcyBlbXB0eSwgZGlkIHlvdSBpbnZva2UgTGlidG9vbD9dKQorICBib29zdF9zYXZlX2FjX29iamV4dD0kYWNfb2JqZXh0CisgICMgR2VuZXJhdGUgdGhlIHRlc3QgZmlsZS4KKyAgQUNfTEFOR19DT05GVEVTVChbQUNfTEFOR19QUk9HUkFNKFsjaW5jbHVkZSA8JDQ+CiskNl0sIFskNV0pXSkKK2RubCBPcHRpbWl6YXRpb24gaGFja3M6IGNvbXBpbGluZyBDKysgaXMgc2xvdywgZXNwZWNpYWxseSB3aXRoIEJvb3N0LiAgV2hhdAorZG5sIHdlJ3JlIHRyeWluZyB0byBkbyBoZXJlIGlzIGd1ZXNzIHRoZSByaWdodCBjb21iaW5hdGlvbiBvZiBsaW5rIGZsYWdzCitkbmwgKExJQlMgLyBMREZMQUdTKSB0byB1c2UgYSBnaXZlbiBsaWJyYXJ5LiAgVGhpcyBjYW4gdGFrZSBzZXZlcmFsCitkbmwgaXRlcmF0aW9ucyBiZWZvcmUgaXQgc3VjY2VlZHMgYW5kIGlzIHRodXMgKnZlcnkqIHNsb3cuICBTbyB3aGF0IHdlIGRvCitkbmwgaW5zdGVhZCBpcyB0aGF0IHdlIGNvbXBpbGUgdGhlIGNvZGUgZmlyc3QgKGFuZCB0aHVzIGdldCBhbiBvYmplY3QgZmlsZSwKK2RubCB0eXBpY2FsbHkgY29uZnRlc3QubykuICBUaGVuIHdlIHRyeSB2YXJpb3VzIGNvbWJpbmF0aW9ucyBvZiBsaW5rIGZsYWdzCitkbmwgdW50aWwgd2Ugc3VjY2VlZCB0byBsaW5rIGNvbmZ0ZXN0Lm8gaW4gYW4gZXhlY3V0YWJsZS4gIFRoZSBwcm9ibGVtIGlzCitkbmwgdGhhdCB0aGUgdmFyaW91cyBUUllfTElOSyAvIENPTVBJTEVfSUZFTFNFIG1hY3JvcyBvZiBBdXRvY29uZiBhbHdheXMKK2RubCByZW1vdmUgYWxsIHRoZSB0ZW1wb3JhcnkgZmlsZXMgaW5jbHVkaW5nIGNvbmZ0ZXN0Lm8uICBTbyB0aGUgdHJpY2sgaGVyZQorZG5sIGlzIHRvIHRlbXBvcmFyaWx5IGNoYW5nZSB0aGUgdmFsdWUgb2YgYWNfb2JqZXh0IHNvIHRoYXQgY29uZnRlc3QubyBpcworZG5sIHByZXNlcnZlZCBhY2Nyb3NzIHRlc3RzLiAgVGhpcyBpcyBvYnZpb3VzbHkgZnJhZ2lsZSBhbmQgSSB3aWxsIGJ1cm4gaW4KK2RubCBoZWxsIGZvciBub3QgcmVzcGVjdGluZyBBdXRvY29uZidzIGRvY3VtZW50ZWQgaW50ZXJmYWNlcywgYnV0IGluIHRoZQorZG5sIG1lYW4gdGltZSwgaXQgb3B0aW1pemVzIHRoZSBtYWNybyBieSBhIGZhY3RvciBvZiA1IHRvIDMwLgorZG5sIEFub3RoZXIgc21hbGwgb3B0aW1pemF0aW9uOiB0aGUgZmlyc3QgYXJndW1lbnQgb2YgQUNfQ09NUElMRV9JRkVMU0UgbGVmdAorZG5sIGVtcHR5IGJlY2F1c2UgdGhlIHRlc3QgZmlsZSBpcyBnZW5lcmF0ZWQgb25seSBvbmNlIGFib3ZlIChiZWZvcmUgd2UKK2RubCBzdGFydCB0aGUgZm9yIGxvb3BzKS4KKyAgQUNfQ09NUElMRV9JRkVMU0UoW10sCisgICAgW2FjX29iamV4dD1kb19ub3Rfcm1fbWVfcGx6XSwKKyAgICBbQUNfTVNHX0VSUk9SKFtjYW5ub3QgY29tcGlsZSBhIHRlc3QgdGhhdCB1c2VzIEJvb3N0ICQxXSldKQorICBhY19vYmpleHQ9JGJvb3N0X3NhdmVfYWNfb2JqZXh0CisgIGJvb3N0X2ZhaWxlZF9saWJzPQorIyBEb24ndCBib3RoZXIgdG8gaWRlbnQgdGhlIGZvbGxvd2luZyBuZXN0ZWQgZm9yIGxvb3BzLCBvbmx5IHRoZSAyCisjIGlubmVybW9zdCBvbmVzIG1hdHRlci4KK2ZvciBib29zdF9saWJfIGluICQyOyBkbworZm9yIGJvb3N0X3RhZ18gaW4gLSRib29zdF9jdl9saWJfdGFnICcnOyBkbworZm9yIGJvb3N0X3Zlcl8gaW4gLSRib29zdF9jdl9saWJfdmVyc2lvbiAnJzsgZG8KK2ZvciBib29zdF9tdF8gaW4gJGJvb3N0X210IC1tdCAnJzsgZG8KK2ZvciBib29zdF9ydG9wdF8gaW4gJGJvb3N0X3J0b3B0ICcnIC1kOyBkbworICBmb3IgYm9vc3RfbGliIGluIFwKKyAgICBib29zdF8kYm9vc3RfbGliXyRib29zdF90YWdfJGJvb3N0X210XyRib29zdF9ydG9wdF8kYm9vc3RfdmVyXyBcCisgICAgYm9vc3RfJGJvb3N0X2xpYl8kYm9vc3RfdGFnXyRib29zdF9ydG9wdF8kYm9vc3RfdmVyXyBcCisgICAgYm9vc3RfJGJvb3N0X2xpYl8kYm9vc3RfdGFnXyRib29zdF9tdF8kYm9vc3RfdmVyXyBcCisgICAgYm9vc3RfJGJvb3N0X2xpYl8kYm9vc3RfdGFnXyRib29zdF92ZXJfCisgIGRvCisgICAgIyBBdm9pZCB0ZXN0aW5nIHR3aWNlIHRoZSBzYW1lIGxpYgorICAgIGNhc2UgJGJvb3N0X2ZhaWxlZF9saWJzIGluICMoCisgICAgICAoKkAkYm9vc3RfbGliQCopIGNvbnRpbnVlOzsKKyAgICBlc2FjCisgICAgIyBJZiB3aXRoX2Jvb3N0IGlzIGVtcHR5LCB3ZSdsbCBzZWFyY2ggaW4gL2xpYiBmaXJzdCwgd2hpY2ggaXMgbm90IHF1aXRlCisgICAgIyByaWdodCBzbyBpbnN0ZWFkIHdlJ2xsIHRyeSB0byBhIGxvY2F0aW9uIGJhc2VkIG9uIHdoZXJlIHRoZSBoZWFkZXJzIGFyZS4KKyAgICBib29zdF90bXBfbGliPSR3aXRoX2Jvb3N0CisgICAgdGVzdCB4IiR3aXRoX2Jvb3N0IiA9IHggJiYgYm9vc3RfdG1wX2xpYj0ke2Jvb3N0X2N2X2luY19wYXRoJS9pbmNsdWRlfQorICAgIGZvciBib29zdF9sZHBhdGggaW4gIiRib29zdF90bXBfbGliL2xpYiIgJycgXAorICAgICAgICAgICAgIC9vcHQvbG9jYWwvbGliKiAvdXNyL2xvY2FsL2xpYiogL29wdC9saWIqIC91c3IvbGliKiBcCisgICAgICAgICAgICAgIiR3aXRoX2Jvb3N0IiBDOi9Cb29zdC9saWIgL2xpYioKKyAgICBkbworICAgICAgIyBEb24ndCB3YXN0ZSB0aW1lIHdpdGggZGlyZWN0b3JpZXMgdGhhdCBkb24ndCBleGlzdC4KKyAgICAgIGlmIHRlc3QgeCIkYm9vc3RfbGRwYXRoIiAhPSB4ICYmIHRlc3QgISAtZSAiJGJvb3N0X2xkcGF0aCI7IHRoZW4KKyAgICAgICAgY29udGludWUKKyAgICAgIGZpCisgICAgICBib29zdF9zYXZlX0xERkxBR1M9JExERkxBR1MKKyAgICAgICMgQXJlIHdlIGxvb2tpbmcgZm9yIGEgc3RhdGljIGxpYnJhcnk/CisgICAgICBjYXNlICRib29zdF9sZHBhdGg6JGJvb3N0X3J0b3B0XyBpbiAjKAorICAgICAgICAoKj8qOipzKikgIyBZZXMgKE5vbiBlbXB0eSBib29zdF9sZHBhdGggKyBzIGluIHJ0IG9wdCkKKyAgICAgICAgICBCb29zdF9saWJfTElCUz0iJGJvb3N0X2xkcGF0aC9saWIkYm9vc3RfbGliLiRsaWJleHQiCisgICAgICAgICAgdGVzdCAtZSAiJEJvb3N0X2xpYl9MSUJTIiB8fCBjb250aW51ZTs7ICMoCisgICAgICAgICgqKSAjIE5vOiB1c2UgLWxib29zdF9mb28gdG8gZmluZCB0aGUgc2hhcmVkIGxpYnJhcnkuCisgICAgICAgICAgQm9vc3RfbGliX0xJQlM9Ii1sJGJvb3N0X2xpYiI7OworICAgICAgZXNhYworICAgICAgYm9vc3Rfc2F2ZV9MSUJTPSRMSUJTCisgICAgICBMSUJTPSIkQm9vc3RfbGliX0xJQlMgJExJQlMiCisgICAgICB0ZXN0IHgiJGJvb3N0X2xkcGF0aCIgIT0geCAmJiBMREZMQUdTPSIkTERGTEFHUyAtTCRib29zdF9sZHBhdGgiCitkbmwgRmlyc3QgYXJndW1lbnQgb2YgQUNfTElOS19JRkVMU0UgbGVmdCBlbXB0eSBiZWNhdXNlIHRoZSB0ZXN0IGZpbGUgaXMKK2RubCBnZW5lcmF0ZWQgb25seSBvbmNlIGFib3ZlIChiZWZvcmUgd2Ugc3RhcnQgdGhlIGZvciBsb29wcykuCisgICAgICBfQk9PU1RfQUNfTElOS19JRkVMU0UoW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0Jvb3N0X2xpYj15ZXNdLCBbQm9vc3RfbGliPW5vXSkKKyAgICAgIGFjX29iamV4dD0kYm9vc3Rfc2F2ZV9hY19vYmpleHQKKyAgICAgIExERkxBR1M9JGJvb3N0X3NhdmVfTERGTEFHUworICAgICAgTElCUz0kYm9vc3Rfc2F2ZV9MSUJTCisgICAgICBpZiB0ZXN0IHgiJEJvb3N0X2xpYiIgPSB4eWVzOyB0aGVuCisgICAgICAgICMgQ2hlY2sgb3IgdXNlZCBjYWNoZWQgcmVzdWx0IG9mIHdoZXRoZXIgb3Igbm90IHVzaW5nIC1SIG9yCisgICAgICAgICMgLXJwYXRoIG1ha2VzIHNlbnNlLiAgU29tZSBpbXBsZW1lbnRhdGlvbnMgb2YgbGQsIHN1Y2ggYXMgZm9yCisgICAgICAgICMgTWFjIE9TWCwgcmVxdWlyZSAtcnBhdGggYnV0IC1SIGlzIHRoZSBmbGFnIGtub3duIHRvIHdvcmsgb24KKyAgICAgICAgIyBvdGhlciBzeXN0ZW1zLiAgaHR0cHM6Ly9naXRodWIuY29tL3RzdW5hL2Jvb3N0Lm00L2lzc3Vlcy8xOQorICAgICAgICBBQ19DQUNIRV9WQUwoW2Jvb3N0X2N2X3JwYXRoX2xpbmtfbGRmbGFnXSwKKyAgICAgICAgICBbY2FzZSAkYm9vc3RfbGRwYXRoIGluCisgICAgICAgICAgICcnKSAjIE5vdGhpbmcgdG8gZG8uCisgICAgICAgICAgICAgYm9vc3RfY3ZfcnBhdGhfbGlua19sZGZsYWc9CisgICAgICAgICAgICAgYm9vc3RfcnBhdGhfbGlua19sZGZsYWdfZm91bmQ9eWVzOzsKKyAgICAgICAgICAgKikKKyAgICAgICAgICAgIGZvciBib29zdF9jdl9ycGF0aF9saW5rX2xkZmxhZyBpbiAtV2wsLVIsIC1XbCwtcnBhdGgsOyBkbworICAgICAgICAgICAgICBMREZMQUdTPSIkYm9vc3Rfc2F2ZV9MREZMQUdTIC1MJGJvb3N0X2xkcGF0aCAkYm9vc3RfY3ZfcnBhdGhfbGlua19sZGZsYWckYm9vc3RfbGRwYXRoIgorICAgICAgICAgICAgICBMSUJTPSIkYm9vc3Rfc2F2ZV9MSUJTICRCb29zdF9saWJfTElCUyIKKyAgICAgICAgICAgICAgX0JPT1NUX0FDX0xJTktfSUZFTFNFKFtdLAorICAgICAgICAgICAgICAgIFtib29zdF9ycGF0aF9saW5rX2xkZmxhZ19mb3VuZD15ZXMKKyAgICAgICAgICAgICAgICBicmVha10sCisgICAgICAgICAgICAgICAgW2Jvb3N0X3JwYXRoX2xpbmtfbGRmbGFnX2ZvdW5kPW5vXSkKKyAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgIDs7CisgICAgICAgICAgZXNhYworICAgICAgICAgIEFTX0lGKFt0ZXN0ICJ4JGJvb3N0X3JwYXRoX2xpbmtfbGRmbGFnX2ZvdW5kIiAhPSAieHllcyJdLAorICAgICAgICAgICAgW0FDX01TR19FUlJPUihbVW5hYmxlIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHVzZSAtUiBvciAtcnBhdGhdKV0pCisgICAgICAgICAgTERGTEFHUz0kYm9vc3Rfc2F2ZV9MREZMQUdTCisgICAgICAgICAgTElCUz0kYm9vc3Rfc2F2ZV9MSUJTCisgICAgICAgICAgXSkKKyAgICAgICAgdGVzdCB4IiRib29zdF9sZHBhdGgiICE9IHggJiYKKyAgICAgICAgICBCb29zdF9saWJfTERGTEFHUz0iLUwkYm9vc3RfbGRwYXRoICRib29zdF9jdl9ycGF0aF9saW5rX2xkZmxhZyRib29zdF9sZHBhdGgiCisgICAgICAgIEJvb3N0X2xpYl9MRFBBVEg9IiRib29zdF9sZHBhdGgiCisgICAgICAgIGJyZWFrIDcKKyAgICAgIGVsc2UKKyAgICAgICAgYm9vc3RfZmFpbGVkX2xpYnM9IiRib29zdF9mYWlsZWRfbGlic0AkYm9vc3RfbGliQCIKKyAgICAgIGZpCisgICAgZG9uZQorICBkb25lCitkb25lCitkb25lCitkb25lCitkb25lCitkb25lICMgYm9vc3RfbGliXworcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorXSkKKworCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKKyMgQ2hlY2tzIGZvciB0aGUgdmFyaW91cyBCb29zdCBsaWJyYXJpZXMuICMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKKworIyBMaXN0IG9mIGJvb3N0IGxpYnJhcmllczogaHR0cDovL3d3dy5ib29zdC5vcmcvbGlicy9saWJyYXJpZXMuaHRtCisjIFRoZSBwYWdlIGh0dHA6Ly9iZXRhLmJvb3N0Lm9yZy9kb2MvbGlicyBpcyB1c2VmdWw6IGl0IGdpdmVzIHRoZSBmaXJzdCByZWxlYXNlCisjIHZlcnNpb24gb2YgZWFjaCBsaWJyYXJ5IChhbW9uZyBvdGhlciB0aGluZ3MpLgorCisjIEJPT1NUX0RFRlVOKExJQlJBUlksIENPREUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlZmluZSBCT09TVF88TElCUkFSWS1VUFBFUkNBU0U+IGFzIGEgbWFjcm8gdGhhdCBydW5zIENPREUuCisjCisjIFVzZSBpbmRpciB0byBhdm9pZCB0aGUgd2FybmluZyBvbiB1bmRlcnF1b3RlZCBtYWNybyBuYW1lIGdpdmVuIHRvIEFDX0RFRlVOLgorbTRfZGVmaW5lKFtCT09TVF9ERUZVTl0sCitbbTRfaW5kaXIoW0FDX0RFRlVOXSwKKyAgICAgICAgICBtNF90b3VwcGVyKFtCT09TVF8kMV0pLAorW200X3B1c2hkZWYoW0JPT1NUX0xpYnJhcnldLCBbJDFdKWRubAorJDIKK200X3BvcGRlZihbQk9PU1RfTGlicmFyeV0pZG5sCitdKQorXSkKKworIyBCT09TVF9BUlJBWSgpCisjIC0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuQXJyYXkKK0JPT1NUX0RFRlVOKFtBcnJheV0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L2FycmF5LmhwcF0pXSkKKworCisjIEJPT1NUX0FTSU8oKQorIyAtLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuQXNpbyAobmV3IGluIEJvb3N0IDEuMzUpLgorQk9PU1RfREVGVU4oW0FzaW9dLAorW0FDX1JFUVVJUkUoW0JPT1NUX1NZU1RFTV0pZG5sCitCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvYXNpby5ocHBdKV0pCisKKworIyBCT09TVF9CSU5EKCkKKyMgLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkJpbmQuCitCT09TVF9ERUZVTihbQmluZF0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L2JpbmQuaHBwXSldKQorCisKKyMgQk9PU1RfQ0hST05PKCkKKyMgLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuQ2hyb25vLgorQk9PU1RfREVGVU4oW0Nocm9ub10sCitbIyBEbyB3ZSBoYXZlIHRvIGNoZWNrIGZvciBCb29zdC5TeXN0ZW0/ICBUaGlzIGxpbmstdGltZSBkZXBlbmRlbmN5IHdhcworIyBhZGRlZCBhcyBvZiAxLjM1LjAuICBJZiB3ZSBoYXZlIGEgdmVyc2lvbiA8MS4zNSwgd2UgbXVzdCBub3QgYXR0ZW1wdCB0bworIyBmaW5kIEJvb3N0LlN5c3RlbSBhcyBpdCBkaWRuJ3QgZXhpc3QgYnkgdGhlbi4KK2lmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWdlIDEzNTsgdGhlbgorICBCT09TVF9TWVNURU0oWyQxXSkKK2ZpICMgZW5kIG9mIHRoZSBCb29zdC5TeXN0ZW0gY2hlY2suCitib29zdF9maWxlc3lzdGVtX3NhdmVfTElCUz0kTElCUworYm9vc3RfZmlsZXN5c3RlbV9zYXZlX0xERkxBR1M9JExERkxBR1MKK200X3BhdHRlcm5fYWxsb3coW15CT09TVF9TWVNURU1fKExJQlN8TERGTEFHUykkXSlkbmwKK0xJQlM9IiRMSUJTICRCT09TVF9TWVNURU1fTElCUyIKK0xERkxBR1M9IiRMREZMQUdTICRCT09TVF9TWVNURU1fTERGTEFHUyIKK0JPT1NUX0ZJTkRfTElCKFtjaHJvbm9dLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9jaHJvbm8uaHBwXSwKKyAgICAgICAgICAgICAgICBbYm9vc3Q6OmNocm9ubzo6dGhyZWFkX2Nsb2NrIGQ7XSkKK2lmIHRlc3QgJGVuYWJsZV9zdGF0aWNfYm9vc3QgPSB5ZXMgJiYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtZ2UgMTM1OyB0aGVuCisgIEJPT1NUX0NIUk9OT19MSUJTPSIkQk9PU1RfQ0hST05PX0xJQlMgJEJPT1NUX1NZU1RFTV9MSUJTIgorZmkKK0xJQlM9JGJvb3N0X2ZpbGVzeXN0ZW1fc2F2ZV9MSUJTCitMREZMQUdTPSRib29zdF9maWxlc3lzdGVtX3NhdmVfTERGTEFHUworXSkjIEJPT1NUX0NIUk9OTworCisKKyMgQk9PU1RfQ09OVEVYVChbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkNvbnRleHQuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorIworIyAqIFRoaXMgbGlicmFyeSB3YXMgaW50cm9kdWNlZCBpbiBCb29zdCAxLjUxLjAKKyMgKiBUaGUgc2lnbmF0dXJlcyBvZiBtYWtlX2Zjb250ZXh0KCkgYW5kIGp1bXBfZmNvbnRleHQgd2VyZSBjaGFuZ2VkIGluIDEuNTYuMAorIyAqIEEgZGVwZW5kZW5jeSBvbiBib29zdF90aHJlYWQgYXBwZWFycyBpbiAxLjU3LjAKK0JPT1NUX0RFRlVOKFtDb250ZXh0XSwKK1tib29zdF9jb250ZXh0X3NhdmVfTElCUz0kTElCUworIGJvb3N0X2NvbnRleHRfc2F2ZV9MREZMQUdTPSRMREZMQUdTCitpZiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxNTc7IHRoZW4KKyAgQk9PU1RfVEhSRUFEKFskMV0pCisgIG00X3BhdHRlcm5fYWxsb3coW15CT09TVF9USFJFQURfKExJQlN8TERGTEFHUykkXSlkbmwKKyAgTElCUz0iJExJQlMgJEJPT1NUX1RIUkVBRF9MSUJTIgorICBMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfVEhSRUFEX0xERkxBR1MiCitmaQorQk9PU1RfRklORF9MSUIoW2NvbnRleHRdLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9jb250ZXh0L2FsbC5ocHBdLFtbCisKKy8vIGNyZWF0ZXMgYSBzdGFjawordm9pZCAqIHN0YWNrX3BvaW50ZXIgPSBuZXcgdm9pZCpbNDA5Nl07CitzdGQ6OnNpemVfdCBjb25zdCBzaXplID0gc2l6ZW9mKHZvaWQqWzQwOTZdKTsKKworI2lmIEJPT1NUX1ZFUlNJT04gPD0gMTA1MTAwCitjdHg6Om1ha2VfZmNvbnRleHQoJmZjLCBmKTsKK3JldHVybiBjdHg6Omp1bXBfZmNvbnRleHQoJmZjbSwgJmZjLCAzKSA9PSA2OworCisjZWxzZQorCitmYyA9IGN0eDo6bWFrZV9mY29udGV4dChzdGFja19wb2ludGVyLCBzaXplLCBmKTsKK3JldHVybiBjdHg6Omp1bXBfZmNvbnRleHQoJmZjbSwgZmMsIDMpID09IDY7CisKKyNlbmRpZgorCisKK11dLFtkbmwKKworI2luY2x1ZGUgPGJvb3N0L3ZlcnNpb24uaHBwPgorI2lmIEJPT1NUX1ZFUlNJT04gPD0gMTA1MTAwCisKK25hbWVzcGFjZSBjdHggPSBib29zdDo6Y3R4OworCitzdGF0aWMgY3R4OjpmY29udGV4dF90IGZjbSwgZmM7CisKK3N0YXRpYyB2b2lkIGYoaW50cHRyX3QgaSkgeworICAgIGN0eDo6anVtcF9mY29udGV4dCgmZmMsICZmY20sIGkgKiAyKTsKK30KKworI2VsaWYgQk9PU1RfVkVSU0lPTiA8PSAxMDU1MDAKKworbmFtZXNwYWNlIGN0eCA9IGJvb3N0Ojpjb250ZXh0OworCisvLyBjb250ZXh0CitzdGF0aWMgY3R4OjpmY29udGV4dF90IGZjbSwgKmZjOworCisvLyBjb250ZXh0LWZ1bmN0aW9uCitzdGF0aWMgdm9pZCBmKGludHB0cl90IGkpIHsKKyAgICBjdHg6Omp1bXBfZmNvbnRleHQoZmMsICZmY20sIGkgKiAyKTsKK30KKworI2Vsc2UKKworbmFtZXNwYWNlIGN0eCA9IGJvb3N0Ojpjb250ZXh0OworCisvLyBjb250ZXh0CitzdGF0aWMgY3R4OjpmY29udGV4dF90IGZjbSwgZmM7CisKKy8vIGNvbnRleHQtZnVuY3Rpb24KK3N0YXRpYyB2b2lkIGYoaW50cHRyX3QgaSkgeworICAgIGN0eDo6anVtcF9mY29udGV4dCgmZmMsIGZjbSwgaSAqIDIpOworfQorI2VuZGlmCitdKQorTElCUz0kYm9vc3RfY29udGV4dF9zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X2NvbnRleHRfc2F2ZV9MREZMQUdTCitdKSMgQk9PU1RfQ09OVEVYVAorCisKKyMgQk9PU1RfQ09OVkVSU0lPTigpCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5Db252ZXJzaW9uIChjYXN0IC8gbGV4aWNhbF9jYXN0KQorQk9PU1RfREVGVU4oW0NvbnZlcnNpb25dLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9jYXN0LmhwcF0pCitCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvbGV4aWNhbF9jYXN0LmhwcF0pCitdKSMgQk9PU1RfQ09OVkVSU0lPTgorCisKKyMgQk9PU1RfQ09ST1VUSU5FKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuQ29yb3V0aW5lLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsIHNlZSB0aGUKKyMgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4gIFRoaXMgbGlicmFyeSB3YXMgaW50cm9kdWNlZCBpbiBCb29zdAorIyAxLjUzLjAKK0JPT1NUX0RFRlVOKFtDb3JvdXRpbmVdLAorWworYm9vc3RfY29yb3V0aW5lX3NhdmVfTElCUz0kTElCUworYm9vc3RfY29yb3V0aW5lX3NhdmVfTERGTEFHUz0kTERGTEFHUworIyBMaW5rLXRpbWUgZGVwZW5kZW5jeSBmcm9tIGNvcm91dGluZSB0byBjb250ZXh0CitCT09TVF9DT05URVhUKFskMV0pCisjIFN0YXJ0aW5nIGZyb20gQm9vc3QgMS41NSBhIGRlcGVuZGVuY3kgb24gQm9vc3QuU3lzdGVtIGlzIGFkZGVkCitpZiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxNTU7IHRoZW4KKyAgQk9PU1RfU1lTVEVNKFskMV0pCitmaQorbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUXyhDT05URVhUfFNZU1RFTSlfKExJQlN8TERGTEFHUyldKQorTElCUz0iJExJQlMgJEJPT1NUX0NPTlRFWFRfTElCUyAkQk9PU1RfU1lTVEVNX0xJQlMiCitMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfQ09OVEVYVF9MREZMQUdTIgorCisjIGluIDEuNTMgY29yb3V0aW5lIHdhcyBhIGhlYWRlciBvbmx5IGxpYnJhcnkKK2lmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWVxIDE1MzsgdGhlbgorICBCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvY29yb3V0aW5lL2Nvcm91dGluZS5ocHBdKQorZWxzZQorICBCT09TVF9GSU5EX0xJQihbY29yb3V0aW5lXSwgWyQxXSwKKwkJICBbYm9vc3QvY29yb3V0aW5lL2Nvcm91dGluZS5ocHBdLAorCQkgIFsKKyAgI2luY2x1ZGUgPGJvb3N0L3ZlcnNpb24uaHBwPgorICAjaWYgICBCT09TVF9WRVJTSU9OIDw9IDEwNTUwMAorICBib29zdDo6Y29yb3V0aW5lczo6Y29yb3V0aW5lPGludChpbnQpPiBjb3JvOyBjb3JvLmdldCgpOworICAjZWxzZQorICBib29zdDo6Y29yb3V0aW5lczo6YXN5bW1ldHJpY19jb3JvdXRpbmU8aW50Pjo6cHVsbF90eXBlIGNvcm87IGNvcm8uZ2V0KCk7CisgICNlbmRpZgorICBdKQorZmkKKyMgTGluay10aW1lIGRlcGVuZGVuY3kgZnJvbSBjb3JvdXRpbmUgdG8gY29udGV4dCwgZXhpc3RlZCBvbmx5IGluIDEuNTMsIGluIDEuNTQKKyMgY29yb3V0aW5lIGRvZXNuJ3QgdXNlIGNvbnRleHQgZnJvbSBpdHMgaGVhZGVycyBidXQgZnJvbSBpdHMgbGlicmFyeS4KK2lmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWVxIDE1MyB8fCB0ZXN0ICRlbmFibGVfc3RhdGljX2Jvb3N0ID0geWVzICYmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWdlIDE1NDsgdGhlbgorICBCT09TVF9DT1JPVVRJTkVfTElCUz0iJEJPT1NUX0NPUk9VVElORV9MSUJTICRCT09TVF9DT05URVhUX0xJQlMiCisgIEJPT1NUX0NPUk9VVElORV9MREZMQUdTPSIkQk9PU1RfQ09ST1VUSU5FX0xERkxBR1MgJEJPT1NUX0NPTlRFWFRfTERGTEFHUyIKK2ZpCitpZiB0ZXN0ICRlbmFibGVfc3RhdGljX2Jvb3N0ID0geWVzICYmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWdlIDE1NTsgdGhlbgorICBCT09TVF9DT1JPVVRJTkVfTElCUz0iJEJPT1NUX0NPUk9VVElORV9MSUJTICRCT09TVF9TWVNURU1fTElCUyIKKyAgQk9PU1RfQ09ST1VUSU5FX0xERkxBR1M9IiRCT09TVF9DT1JPVVRJTkVfTERGTEFHUyAkQk9PU1RfU1lTVEVNX0xERkxBR1MiCitmaQorTElCUz0kYm9vc3RfY29yb3V0aW5lX3NhdmVfTElCUworTERGTEFHUz0kYm9vc3RfY29yb3V0aW5lX3NhdmVfTERGTEFHUworXSkjIEJPT1NUX0NPUk9VVElORQorCisKKyMgQk9PU1RfQ1JDKCkKKyMgLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuQ1JDCitCT09TVF9ERUZVTihbQ1JDXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvY3JjLmhwcF0pCitdKSMgQk9PU1RfQ1JDCisKKworIyBCT09TVF9EQVRFX1RJTUUoW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5EYXRlX1RpbWUuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW0RhdGVfVGltZV0sCitbQk9PU1RfRklORF9MSUIoW2RhdGVfdGltZV0sIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L2RhdGVfdGltZS9wb3NpeF90aW1lL3Bvc2l4X3RpbWUuaHBwXSwKKyAgICAgICAgICAgICAgICBbYm9vc3Q6OnBvc2l4X3RpbWU6OnB0aW1lIHQ7XSkKK10pIyBCT09TVF9EQVRFX1RJTUUKKworCisjIEJPT1NUX0ZJTEVTWVNURU0oW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuRmlsZXN5c3RlbS4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUKKyMgdGhlIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCisjIERvIG5vdCBjaGVjayBmb3IgYm9vc3QvZmlsZXN5c3RlbS5ocHAgYmVjYXVzZSB0aGlzIGZpbGUgd2FzIGludHJvZHVjZWQgaW4KKyMgMS4zNC4KK0JPT1NUX0RFRlVOKFtGaWxlc3lzdGVtXSwKK1sjIERvIHdlIGhhdmUgdG8gY2hlY2sgZm9yIEJvb3N0LlN5c3RlbT8gIFRoaXMgbGluay10aW1lIGRlcGVuZGVuY3kgd2FzCisjIGFkZGVkIGFzIG9mIDEuMzUuMC4gIElmIHdlIGhhdmUgYSB2ZXJzaW9uIDwxLjM1LCB3ZSBtdXN0IG5vdCBhdHRlbXB0IHRvCisjIGZpbmQgQm9vc3QuU3lzdGVtIGFzIGl0IGRpZG4ndCBleGlzdCBieSB0aGVuLgoraWYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtZ2UgMTM1OyB0aGVuCisgIEJPT1NUX1NZU1RFTShbJDFdKQorZmkgIyBlbmQgb2YgdGhlIEJvb3N0LlN5c3RlbSBjaGVjay4KK2Jvb3N0X2ZpbGVzeXN0ZW1fc2F2ZV9MSUJTPSRMSUJTCitib29zdF9maWxlc3lzdGVtX3NhdmVfTERGTEFHUz0kTERGTEFHUworbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX1NZU1RFTV8oTElCU3xMREZMQUdTKSRdKWRubAorTElCUz0iJExJQlMgJEJPT1NUX1NZU1RFTV9MSUJTIgorTERGTEFHUz0iJExERkxBR1MgJEJPT1NUX1NZU1RFTV9MREZMQUdTIgorQk9PU1RfRklORF9MSUIoW2ZpbGVzeXN0ZW1dLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9maWxlc3lzdGVtL3BhdGguaHBwXSwgW2Jvb3N0OjpmaWxlc3lzdGVtOjpwYXRoIHA7XSkKK2lmIHRlc3QgJGVuYWJsZV9zdGF0aWNfYm9vc3QgPSB5ZXMgJiYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtZ2UgMTM1OyB0aGVuCisgIEJPT1NUX0ZJTEVTWVNURU1fTElCUz0iJEJPT1NUX0ZJTEVTWVNURU1fTElCUyAkQk9PU1RfU1lTVEVNX0xJQlMiCitmaQorTElCUz0kYm9vc3RfZmlsZXN5c3RlbV9zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X2ZpbGVzeXN0ZW1fc2F2ZV9MREZMQUdTCitdKSMgQk9PU1RfRklMRVNZU1RFTQorCisKKyMgQk9PU1RfRkxZV0VJR0hUKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuRmx5d2VpZ2h0LgorQk9PU1RfREVGVU4oW0ZseXdlaWdodF0sCitbZG5sIFRoZXJlJ3MgYSBoaWRkZW4gZGVwZW5kZW5jeSBvbiBwdGhyZWFkcy4KK0FDX1JFUVVJUkUoW19CT09TVF9QVEhSRUFEX0ZMQUddKWRubAorQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L2ZseXdlaWdodC5ocHBdKQorQUNfU1VCU1QoW0JPT1NUX0ZMWVdFSUdIVF9MSUJTXSwgWyRib29zdF9jdl9wdGhyZWFkX2ZsYWddKQorXSkKKworCisjIEJPT1NUX0ZPUkVBQ0goKQorIyAtLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuRm9yZWFjaC4KK0JPT1NUX0RFRlVOKFtGb3JlYWNoXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvZm9yZWFjaC5ocHBdKV0pCisKKworIyBCT09TVF9GT1JNQVQoKQorIyAtLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5Gb3JtYXQuCisjIE5vdGU6IHdlIGNhbid0IGNoZWNrIGZvciBib29zdC9mb3JtYXQvZm9ybWF0X2Z3ZC5ocHAgYmVjYXVzZSB0aGUgaGVhZGVyIGlzbid0CisjIHN0YW5kYWxvbmUuICBJdCBjYW4ndCBiZSBjb21waWxlZCBiZWNhdXNlIGl0IHRyaWdnZXJzIHRoZSBmb2xsb3dpbmcgZXJyb3I6CisjIGJvb3N0L2Zvcm1hdC9kZXRhaWwvY29uZmlnX21hY3Jvcy5ocHA6ODg6IGVycm9yOiAnbG9jYWxlJyBpbiBuYW1lc3BhY2UgJ3N0ZCcKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZXMgbm90IG5hbWUgYSB0eXBlCitCT09TVF9ERUZVTihbRm9ybWF0XSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvZm9ybWF0LmhwcF0pXSkKKworCisjIEJPT1NUX0ZVTkNUSU9OKCkKKyMgLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5GdW5jdGlvbgorQk9PU1RfREVGVU4oW0Z1bmN0aW9uXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvZnVuY3Rpb24uaHBwXSldKQorCisKKyMgQk9PU1RfR0VPTUVUUlkoKQorIyAtLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0Lkdlb21ldHJ5IChuZXcgc2luY2UgMS40Ny4wKS4KK0JPT1NUX0RFRlVOKFtHZW9tZXRyeV0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L2dlb21ldHJ5LmhwcF0pCitdKSMgQk9PU1RfR0VPTUVUUlkKKworCisjIEJPT1NUX0dSQVBIKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5HcmFwaHMuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW0dyYXBoXSwKK1tib29zdF9ncmFwaF9zYXZlX0xJQlM9JExJQlMKK2Jvb3N0X2dyYXBoX3NhdmVfTERGTEFHUz0kTERGTEFHUworIyBMaW5rLXRpbWUgZGVwZW5kZW5jeSBmcm9tIGdyYXBoIHRvIHJlZ2V4IHdhcyBhZGRlZCBhcyBvZiAxLjQwLjAuCitpZiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxNDA7IHRoZW4KKyAgQk9PU1RfUkVHRVgoWyQxXSkKKyAgbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX1JFR0VYXyhMSUJTfExERkxBR1MpJF0pZG5sCisgIExJQlM9IiRMSUJTICRCT09TVF9SRUdFWF9MSUJTIgorICBMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfUkVHRVhfTERGTEFHUyIKK2ZpCitCT09TVF9GSU5EX0xJQihbZ3JhcGhdLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9ncmFwaC9hZGphY2VuY3lfbGlzdC5ocHBdLCBbYm9vc3Q6OmFkamFjZW5jeV9saXN0PD4gZztdKQorTElCUz0kYm9vc3RfZ3JhcGhfc2F2ZV9MSUJTCitMREZMQUdTPSRib29zdF9ncmFwaF9zYXZlX0xERkxBR1MKK10pIyBCT09TVF9HUkFQSAorCisKKyMgQk9PU1RfSU9TVFJFQU1TKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuSU9TdHJlYW1zLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsIHNlZSB0aGUKKyMgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4KK0JPT1NUX0RFRlVOKFtJT1N0cmVhbXNdLAorW0JPT1NUX0ZJTkRfTElCKFtpb3N0cmVhbXNdLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9pb3N0cmVhbXMvZGV2aWNlL2ZpbGVfZGVzY3JpcHRvci5ocHBdLAorICAgICAgICAgICAgICAgIFtib29zdDo6aW9zdHJlYW1zOjpmaWxlX2Rlc2NyaXB0b3IgZmQ7IGZkLmNsb3NlKCk7XSkKK10pIyBCT09TVF9JT1NUUkVBTVMKKworCisjIEJPT1NUX0hBU0goKQorIyAtLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuRnVuY3Rpb25hbC9IYXNoCitCT09TVF9ERUZVTihbSGFzaF0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L2Z1bmN0aW9uYWwvaGFzaC5ocHBdKV0pCisKKworIyBCT09TVF9MQU1CREEoKQorIyAtLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5MYW1iZGEKK0JPT1NUX0RFRlVOKFtMYW1iZGFdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9sYW1iZGEvbGFtYmRhLmhwcF0pXSkKKworCisjIEJPT1NUX0xPQ0FMRSgpCisjIC0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkxvY2FsZQorQk9PU1RfREVGVU4oW0xvY2FsZV0sCitbCitib29zdF9sb2NhbGVfc2F2ZV9MSUJTPSRMSUJTCitib29zdF9sb2NhbGVfc2F2ZV9MREZMQUdTPSRMREZMQUdTCisjIHJlcXVpcmUgU1lTVEVNIGZvciBib29zdC0xLjUwLjAgYW5kIHVwCitpZiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxNTA7IHRoZW4KKyAgQk9PU1RfU1lTVEVNKFskMV0pCisgIG00X3BhdHRlcm5fYWxsb3coW15CT09TVF9TWVNURU1fKExJQlN8TERGTEFHUykkXSlkbmwKKyAgTElCUz0iJExJQlMgJEJPT1NUX1NZU1RFTV9MSUJTIgorICBMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfU1lTVEVNX0xERkxBR1MiCitmaSAjIGVuZCBvZiB0aGUgQm9vc3QuU3lzdGVtIGNoZWNrLgorQk9PU1RfRklORF9MSUIoW2xvY2FsZV0sIFskMV0sCisgICAgW2Jvb3N0L2xvY2FsZS5ocHBdLAorICAgIFtbYm9vc3Q6OmxvY2FsZTo6Z2VuZXJhdG9yIGdlbjsgc3RkOjpsb2NhbGU6Omdsb2JhbChnZW4oIiIpKTtdXSkKK0xJQlM9JGJvb3N0X2xvY2FsZV9zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X2xvY2FsZV9zYXZlX0xERkxBR1MKK10pIyBCT09TVF9MT0NBTEUKKworIyBCT09TVF9MT0coW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5Mb2cuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW0xvZ10sCitbYm9vc3RfbG9nX3NhdmVfTElCUz0kTElCUworYm9vc3RfbG9nX3NhdmVfTERGTEFHUz0kTERGTEFHUworQk9PU1RfU1lTVEVNKFskMV0pCitCT09TVF9GSUxFU1lTVEVNKFskMV0pCitCT09TVF9EQVRFX1RJTUUoWyQxXSkKK200X3BhdHRlcm5fYWxsb3coW15CT09TVF8oU1lTVEVNfEZJTEVTWVNURU18REFURV9USU1FKV8oTElCU3xMREZMQUdTKSRdKWRubAorTElCUz0iJExJQlMgJEJPT1NUX0RBVEVfVElNRV9MSUJTICRCT09TVF9GSUxFU1lTVEVNX0xJQlMgJEJPT1NUX1NZU1RFTV9MSUJTIgorTERGTEFHUz0iJExERkxBR1MgJEJPT1NUX0RBVEVfVElNRV9MREZMQUdTICRCT09TVF9GSUxFU1lTVEVNX0xERkxBR1MgJEJPT1NUX1NZU1RFTV9MREZMQUdTIgorQk9PU1RfRklORF9MSUIoW2xvZ10sIFskMV0sCisgICAgW2Jvb3N0L2xvZy9jb3JlL2NvcmUuaHBwXSwKKyAgICBbYm9vc3Q6OmxvZzo6YXR0cmlidXRlIGE7IGEuZ2V0X3ZhbHVlKCk7XSkKK0xJQlM9JGJvb3N0X2xvZ19zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X2xvZ19zYXZlX0xERkxBR1MKK10pIyBCT09TVF9MT0cKKworCisjIEJPT1NUX0xPR19TRVRVUChbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkxvZy4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbTG9nX1NldHVwXSwKK1tib29zdF9sb2dfc2V0dXBfc2F2ZV9MSUJTPSRMSUJTCitib29zdF9sb2dfc2V0dXBfc2F2ZV9MREZMQUdTPSRMREZMQUdTCitCT09TVF9MT0coWyQxXSkKK200X3BhdHRlcm5fYWxsb3coW15CT09TVF9MT0dfKExJQlN8TERGTEFHUykkXSlkbmwKK0xJQlM9IiRMSUJTICRCT09TVF9MT0dfTElCUyIKK0xERkxBR1M9IiRMREZMQUdTICRCT09TVF9MT0dfTERGTEFHUyIKK0JPT1NUX0ZJTkRfTElCKFtsb2dfc2V0dXBdLCBbJDFdLAorICAgIFtib29zdC9sb2cvdXRpbGl0eS9zZXR1cC9mcm9tX3NldHRpbmdzLmhwcF0sCisgICAgW2Jvb3N0Ojpsb2c6OmJhc2ljX3NldHRpbmdzPGNoYXI+IGJzOyBicy5lbXB0eSgpO10pCitMSUJTPSRib29zdF9sb2dfc2V0dXBfc2F2ZV9MSUJTCitMREZMQUdTPSRib29zdF9sb2dfc2V0dXBfc2F2ZV9MREZMQUdTCitdKSMgQk9PU1RfTE9HX1NFVFVQCisKKworIyBCT09TVF9NQVRIKCkKKyMgLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0Lk1hdGgKKyMgVE9ETzogVGhpcyBsaWJyYXJ5IGlzbid0IGhlYWRlci1vbmx5IGJ1dCBpdCBjb21lcyBpbiBtdWx0aXBsZSBkaWZmZXJlbnQKKyMgZmxhdm9ycyB0aGF0IGRvbid0IHBsYXkgd2VsbCB3aXRoIEJPT1NUX0ZJTkRfTElCIChlLmcsIGxpYmJvb3N0X21hdGhfYzk5LAorIyBsaWJib29zdF9tYXRoX2M5OWYsIGxpYmJvb3N0X21hdGhfYzk5bCwgbGliYm9vc3RfbWF0aF90cjEsCisjIGxpYmJvb3N0X21hdGhfdHIxZiwgbGliYm9vc3RfbWF0aF90cjFsKS4gIFRoaXMgbWFjcm8gbXVzdCBiZSBmaXhlZCB0byBkbyB0aGUKKyMgcmlnaHQgdGhpbmcgYW55d2F5LgorQk9PU1RfREVGVU4oW01hdGhdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9tYXRoL3NwZWNpYWxfZnVuY3Rpb25zLmhwcF0pXSkKKworCisjIEJPT1NUX01QSShbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QgTVBJLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsIHNlZSB0aGUKKyMgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4gIFVzZXMgTVBJQ1hYIHZhcmlhYmxlIGlmIGl0IGlzCisjIHNldCwgb3RoZXJ3aXNlIHRyaWVzIENYWAorIworQk9PU1RfREVGVU4oW01QSV0sCitbYm9vc3Rfc2F2ZV9DWFg9JHtDWFh9Citib29zdF9zYXZlX0NYWENQUD0ke0NYWENQUH0KK2lmIHRlc3QgeCIke01QSUNYWH0iICE9IHg7IHRoZW4KKyAgQ1hYPSR7TVBJQ1hYfQorICBDWFhDUFA9IiR7TVBJQ1hYfSAtRSIKK2ZpCitCT09TVF9GSU5EX0xJQihbbXBpXSwgWyQxXSwKKyAgICAgICAgICAgICAgIFtib29zdC9tcGkuaHBwXSwKKyAgICAgICAgICAgICAgIFtpbnQgYXJnYyA9IDA7CisgICAgICAgICAgICAgICAgY2hhciAqKmFyZ3YgPSAwOworICAgICAgICAgICAgICAgIGJvb3N0OjptcGk6OmVudmlyb25tZW50IGVudihhcmdjLGFyZ3YpO10pCitDWFg9JHtib29zdF9zYXZlX0NYWH0KK0NYWENQUD0ke2Jvb3N0X3NhdmVfQ1hYQ1BQfQorXSkjIEJPT1NUX01QSQorCisKKyMgQk9PU1RfTVVMVElBUlJBWSgpCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5NdWx0aUFycmF5CitCT09TVF9ERUZVTihbTXVsdGlBcnJheV0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L211bHRpX2FycmF5LmhwcF0pXSkKKworCisjIEJPT1NUX05VTUVSSUNfVUJMQVMoKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5OdW1lcmljVWJsYXMgKEJhc2ljIExpbmVhciBBbGdlYnJhKQorQk9PU1RfREVGVU4oW051bWVyaWNfVWJsYXNdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9udW1lcmljL3VibGFzL3ZlY3Rvci5ocHBdKQorXSkjIEJPT1NUX05VTUVSSUNfVUJMQVMKKworCisjIEJPT1NUX05VTUVSSUNfQ09OVkVSU0lPTigpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0Lk51bWVyaWNDb252ZXJzaW9uIChwb2xpY3ktYmFzZWQgbnVtZXJpYyBjb252ZXJzaW9uKQorQk9PU1RfREVGVU4oW051bWVyaWNfQ29udmVyc2lvbl0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L251bWVyaWMvY29udmVyc2lvbi9jb252ZXJ0ZXIuaHBwXSkKK10pIyBCT09TVF9OVU1FUklDX0NPTlZFUlNJT04KKworCisjIEJPT1NUX09QVElPTkFMKCkKKyMgLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5PcHRpb25hbAorQk9PU1RfREVGVU4oW09wdGlvbmFsXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3Qvb3B0aW9uYWwuaHBwXSldKQorCisKKyMgQk9PU1RfUFJFUFJPQ0VTU09SKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuUHJlcHJvY2Vzc29yCitCT09TVF9ERUZVTihbUHJlcHJvY2Vzc29yXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvcHJlcHJvY2Vzc29yL3JlcGVhdC5ocHBdKV0pCisKKworIyBCT09TVF9SQU5HRSgpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlJhbmdlCitCT09TVF9ERUZVTihbUmFuZ2VdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9yYW5nZS9hZGFwdG9ycy5ocHBdKV0pCisKKyMgQk9PU1RfVU5PUkRFUkVEKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuVW5vcmRlcmVkCitCT09TVF9ERUZVTihbVW5vcmRlcmVkXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvdW5vcmRlcmVkX21hcC5ocHBdKV0pCisKKworIyBCT09TVF9VVUlEKCkKKyMgLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlV1aWQKK0JPT1NUX0RFRlVOKFtVdWlkXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvdXVpZC91dWlkLmhwcF0pXSkKKworCisjIEJPT1NUX1BST0dSQU1fT1BUSU9OUyhbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlByb2dyYW1fb3B0aW9ucy4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULAorIyBzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbUHJvZ3JhbV9PcHRpb25zXSwKK1tCT09TVF9GSU5EX0xJQihbcHJvZ3JhbV9vcHRpb25zXSwgWyQxXSwKKyAgICAgICAgICAgICAgICBbYm9vc3QvcHJvZ3JhbV9vcHRpb25zLmhwcF0sCisgICAgICAgICAgICAgICAgW2Jvb3N0Ojpwcm9ncmFtX29wdGlvbnM6Om9wdGlvbnNfZGVzY3JpcHRpb24gZCgidGVzdCIpO10pCitdKSMgQk9PU1RfUFJPR1JBTV9PUFRJT05TCisKKworCisjIF9CT09TVF9QWVRIT05fQ09ORklHKFZBUklBQkxFLCBGTEFHKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2F2ZSBWQVJJQUJMRSwgYW5kIGRlZmluZSBpdCB2aWEgYHB5dGhvbi1jb25maWcgLS1GTEFHYC4KKyMgU3Vic3RpdHV0ZSBCT09TVF9QWVRIT05fVkFSSUFCTEUuCittNF9kZWZpbmUoW19CT09TVF9QWVRIT05fQ09ORklHXSwKK1tBQ19TVUJTVChbQk9PU1RfUFlUSE9OXyQxXSwKKyAgICAgICAgICBbYHB5dGhvbi1jb25maWcgLS0kMiAyPi9kZXYvbnVsbGBdKWRubAorYm9vc3RfcHl0aG9uX3NhdmVfJDE9JCQxCiskMT0iJCQxICRCT09TVF9QWVRIT05fJDEiXSkKKworCisjIEJPT1NUX1BZVEhPTihbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlB5dGhvbi4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULAorIyBzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbUHl0aG9uXSwKK1tfQk9PU1RfUFlUSE9OX0NPTkZJRyhbQ1BQRkxBR1NdLCBbaW5jbHVkZXNdKQorX0JPT1NUX1BZVEhPTl9DT05GSUcoW0xERkxBR1NdLCAgIFtsZGZsYWdzXSkKK19CT09TVF9QWVRIT05fQ09ORklHKFtMSUJTXSwgICAgICBbbGlic10pCittNF9wYXR0ZXJuX2FsbG93KFteQk9PU1RfUFlUSE9OX01PRFVMRSRdKWRubAorQk9PU1RfRklORF9MSUJTKFtweXRob25dLCBbcHl0aG9uIHB5dGhvbjNdLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9weXRob24uaHBwXSwKKyAgICAgICAgICAgICAgICBbXSwgW0JPT1NUX1BZVEhPTl9NT0RVTEUoZW1wdHkpIHt9XSkKK0NQUEZMQUdTPSRib29zdF9weXRob25fc2F2ZV9DUFBGTEFHUworTERGTEFHUz0kYm9vc3RfcHl0aG9uX3NhdmVfTERGTEFHUworTElCUz0kYm9vc3RfcHl0aG9uX3NhdmVfTElCUworXSkjIEJPT1NUX1BZVEhPTgorCisKKyMgQk9PU1RfUkVGKCkKKyMgLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuUmVmCitCT09TVF9ERUZVTihbUmVmXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvcmVmLmhwcF0pXSkKKworCisjIEJPT1NUX1JFR0VYKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5SZWdleC4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbUmVnZXhdLAorW0JPT1NUX0ZJTkRfTElCKFtyZWdleF0sIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L3JlZ2V4LmhwcF0sCisgICAgICAgICAgICAgICAgW2Jvb3N0OjpyZWdleCBleHAoIioiKTsgYm9vc3Q6OnJlZ2V4X21hdGNoKCJmb28iLCBleHApO10pCitdKSMgQk9PU1RfUkVHRVgKKworCisjIEJPT1NUX1NFUklBTElaQVRJT04oW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuU2VyaWFsaXphdGlvbi4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUKKyMgdGhlIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbU2VyaWFsaXphdGlvbl0sCitbQk9PU1RfRklORF9MSUIoW3NlcmlhbGl6YXRpb25dLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9hcmNoaXZlL3RleHRfb2FyY2hpdmUuaHBwXSwKKyAgICAgICAgICAgICAgICBbc3RkOjpvc3RyZWFtKiBvID0gMDsgLy8gQ2hlYXAgd2F5IHRvIGdldCBhbiBvc3RyZWFtLi4uCisgICAgICAgICAgICAgICAgYm9vc3Q6OmFyY2hpdmU6OnRleHRfb2FyY2hpdmUgdCgqbyk7XSkKK10pIyBCT09TVF9TRVJJQUxJWkFUSU9OCisKKworIyBCT09TVF9TSUdOQUxTKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlNpZ25hbHMuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW1NpZ25hbHNdLAorW0JPT1NUX0ZJTkRfTElCKFtzaWduYWxzXSwgWyQxXSwKKyAgICAgICAgICAgICAgICBbYm9vc3Qvc2lnbmFsLmhwcF0sCisgICAgICAgICAgICAgICAgW2Jvb3N0OjpzaWduYWw8dm9pZCAoKT4gcztdKQorXSkjIEJPT1NUX1NJR05BTFMKKworCisjIEJPT1NUX1NJR05BTFMyKCkKKyMgLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5TaWduYWxzMiAobmV3IHNpbmNlIDEuMzkuMCkuCitCT09TVF9ERUZVTihbU2lnbmFsczJdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9zaWduYWxzMi5ocHBdKQorXSkjIEJPT1NUX1NJR05BTFMyCisKKworIyBCT09TVF9TTUFSVF9QVFIoKQorIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5TbWFydFB0cgorQk9PU1RfREVGVU4oW1NtYXJ0X1B0cl0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3Njb3BlZF9wdHIuaHBwXSkKK0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9zaGFyZWRfcHRyLmhwcF0pCitdKQorCisKKyMgQk9PU1RfU1RBVElDQVNTRVJUKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuU3RhdGljQXNzZXJ0CitCT09TVF9ERUZVTihbU3RhdGljQXNzZXJ0XSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3Qvc3RhdGljX2Fzc2VydC5ocHBdKV0pCisKKworIyBCT09TVF9TVFJJTkdfQUxHTygpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuU3RyaW5nQWxnbworQk9PU1RfREVGVU4oW1N0cmluZ19BbGdvXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvYWxnb3JpdGhtL3N0cmluZy5ocHBdKQorXSkKKworCisjIEJPT1NUX1NZU1RFTShbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlN5c3RlbS4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuICBUaGlzIGxpYnJhcnkgd2FzIGludHJvZHVjZWQgaW4gQm9vc3QKKyMgMS4zNS4wLgorQk9PU1RfREVGVU4oW1N5c3RlbV0sCitbQk9PU1RfRklORF9MSUIoW3N5c3RlbV0sIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L3N5c3RlbS9lcnJvcl9jb2RlLmhwcF0sCisgICAgICAgICAgICAgICAgW2Jvb3N0OjpzeXN0ZW06OmVycm9yX2NvZGUgZTsgZS5jbGVhcigpO10pCitdKSMgQk9PU1RfU1lTVEVNCisKKworIyBCT09TVF9URVNUKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlRlc3QuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW1Rlc3RdLAorW200X3BhdHRlcm5fYWxsb3coW15CT09TVF9DSEVDSyRdKWRubAorQk9PU1RfRklORF9MSUIoW3VuaXRfdGVzdF9mcmFtZXdvcmtdLCBbJDFdLAorICAgICAgICAgICAgICAgW2Jvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcF0sIFtCT09TVF9DSEVDSygyID09IDIpO10sCisgICAgICAgICAgICAgICBbdXNpbmcgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZTsKKyAgICAgICAgICAgICAgIHRlc3Rfc3VpdGUqIGluaXRfdW5pdF90ZXN0X3N1aXRlKGludCBhcmdjLCBjaGFyICoqIGFyZ3YpCisgICAgICAgICAgICAgICB7IHJldHVybiBOVUxMOyB9XSkKK10pIyBCT09TVF9URVNUCisKKworIyBCT09TVF9USFJFQUQoW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuVGhyZWFkLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsIHNlZSB0aGUKKyMgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4KK0JPT1NUX0RFRlVOKFtUaHJlYWRdLAorW2RubCBIYXZpbmcgdGhlIHB0aHJlYWQgZmxhZyBpcyByZXF1aXJlZCBhdCBsZWFzdCBvbiBHQ0MzIHdoZXJlCitkbmwgYm9vc3QvdGhyZWFkLmhwcCB3b3VsZCBjb21wbGFpbiBpZiB3ZSB0cnkgdG8gY29tcGlsZSB3aXRob3V0CitkbmwgLXB0aHJlYWQgb24gR05VL0xpbnV4LgorQUNfUkVRVUlSRShbX0JPT1NUX1BUSFJFQURfRkxBR10pZG5sCitib29zdF90aHJlYWRfc2F2ZV9MSUJTPSRMSUJTCitib29zdF90aHJlYWRfc2F2ZV9MREZMQUdTPSRMREZMQUdTCitib29zdF90aHJlYWRfc2F2ZV9DUFBGTEFHUz0kQ1BQRkxBR1MKKyMgTGluay10aW1lIGRlcGVuZGVuY3kgZnJvbSB0aHJlYWQgdG8gc3lzdGVtIHdhcyBhZGRlZCBhcyBvZiAxLjQ5LjAuCitpZiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxNDk7IHRoZW4KK0JPT1NUX1NZU1RFTShbJDFdKQorZmkgIyBlbmQgb2YgdGhlIEJvb3N0LlN5c3RlbSBjaGVjay4KK200X3BhdHRlcm5fYWxsb3coW15CT09TVF9TWVNURU1fKExJQlN8TERGTEFHUykkXSlkbmwKK0xJQlM9IiRMSUJTICRCT09TVF9TWVNURU1fTElCUyAkYm9vc3RfY3ZfcHRocmVhZF9mbGFnIgorTERGTEFHUz0iJExERkxBR1MgJEJPT1NUX1NZU1RFTV9MREZMQUdTIgorQ1BQRkxBR1M9IiRDUFBGTEFHUyAkYm9vc3RfY3ZfcHRocmVhZF9mbGFnIgorCisjIFdoZW4gY29tcGlsaW5nIGZvciB0aGUgV2luZG93cyBwbGF0Zm9ybSwgdGhlIHRocmVhZHMgbGlicmFyeSBpcyBuYW1lZAorIyBkaWZmZXJlbnRseS4gIFRoaXMgc3VmZml4IGRvZXNuJ3QgZXhpc3QgaW4gbmV3IHZlcnNpb25zIG9mIEJvb3N0LCBvcgorIyBwb3NzaWJseSBuZXcgdmVyc2lvbnMgb2YgR0NDIG9uIG1pbmd3IEkgYW0gYXNzdW1pbmcgaXQncyBCb29zdCdzIGNoYW5nZSBmb3IKKyMgbm93IGFuZCBJIGFtIHNldHRpbmcgdmVyc2lvbiB0byAxLjQ4LCBmb3IgbGFjayBvZiBrbm93bGVkZ2UgYXMgdG8gd2hlbiB0aGlzCisjIGNoYW5nZSBvY2N1cnJlZC4KK2lmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWx0IDE0ODsgdGhlbgorICBjYXNlICRob3N0X29zIGluCisgICAgKCptaW5ndyopIGJvb3N0X3RocmVhZF9saWJfZXh0PV93aW4zMjs7CisgIGVzYWMKK2ZpCitCT09TVF9GSU5EX0xJQlMoW3RocmVhZF0sIFt0aHJlYWQkYm9vc3RfdGhyZWFkX2xpYl9leHRdLAorICAgICAgICAgICAgICAgIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L3RocmVhZC5ocHBdLCBbYm9vc3Q6OnRocmVhZCB0OyBib29zdDo6bXV0ZXggbTtdKQorCitjYXNlICRob3N0X29zIGluCisgICgqbWluZ3cqKSBib29zdF90aHJlYWRfdzMyX3NvY2tldF9saW5rPS1sd3MyXzMyOzsKK2VzYWMKKworQk9PU1RfVEhSRUFEX0xJQlM9IiRCT09TVF9USFJFQURfTElCUyAkQk9PU1RfU1lTVEVNX0xJQlMgJGJvb3N0X2N2X3B0aHJlYWRfZmxhZyAkYm9vc3RfdGhyZWFkX3czMl9zb2NrZXRfbGluayIKK0JPT1NUX1RIUkVBRF9MREZMQUdTPSIkQk9PU1RfU1lTVEVNX0xERkxBR1MiCitCT09TVF9DUFBGTEFHUz0iJEJPT1NUX0NQUEZMQUdTICRib29zdF9jdl9wdGhyZWFkX2ZsYWciCitMSUJTPSRib29zdF90aHJlYWRfc2F2ZV9MSUJTCitMREZMQUdTPSRib29zdF90aHJlYWRfc2F2ZV9MREZMQUdTCitDUFBGTEFHUz0kYm9vc3RfdGhyZWFkX3NhdmVfQ1BQRkxBR1MKK10pIyBCT09TVF9USFJFQUQKKworQVVfQUxJQVMoW0JPT1NUX1RIUkVBRFNdLCBbQk9PU1RfVEhSRUFEXSkKKworCisjIEJPT1NUX1RPS0VOSVpFUigpCisjIC0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlRva2VuaXplcgorQk9PU1RfREVGVU4oW1Rva2VuaXplcl0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3Rva2VuaXplci5ocHBdKV0pCisKKworIyBCT09TVF9UUklCT09MKCkKKyMgLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlRyaWJvb2wKK0JPT1NUX0RFRlVOKFtUcmlib29sXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvbG9naWMvdHJpYm9vbF9md2QuaHBwXSkKK0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9sb2dpYy90cmlib29sLmhwcF0pCitdKQorCisKKyMgQk9PU1RfVFVQTEUoKQorIyAtLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlR1cGxlCitCT09TVF9ERUZVTihbVHVwbGVdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC90dXBsZS90dXBsZS5ocHBdKV0pCisKKworIyBCT09TVF9UWVBFVFJBSVRTKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuVHlwZVRyYWl0cworQk9PU1RfREVGVU4oW1R5cGVUcmFpdHNdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC90eXBlX3RyYWl0cy5ocHBdKV0pCisKKworIyBCT09TVF9VVElMSVRZKCkKKyMgLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlV0aWxpdHkgKG5vbmNvcHlhYmxlLCByZXN1bHRfb2YsIGJhc2UtZnJvbS1tZW1iZXIgaWRpb20sCisjIGV0Yy4pCitCT09TVF9ERUZVTihbVXRpbGl0eV0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3V0aWxpdHkuaHBwXSldKQorCisKKyMgQk9PU1RfVkFSSUFOVCgpCisjIC0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5WYXJpYW50LgorQk9PU1RfREVGVU4oW1ZhcmlhbnRdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC92YXJpYW50L3ZhcmlhbnRfZndkLmhwcF0pCitCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvdmFyaWFudC5ocHBdKV0pCisKKworIyBCT09TVF9QT0lOVEVSX0NPTlRBSU5FUigpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5Qb2ludGVyQ29udGFpbmVyCitCT09TVF9ERUZVTihbUG9pbnRlcl9Db250YWluZXJdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9wdHJfY29udGFpbmVyL3B0cl9kZXF1ZS5ocHBdKQorQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3B0cl9jb250YWluZXIvcHRyX2xpc3QuaHBwXSkKK0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9wdHJfY29udGFpbmVyL3B0cl92ZWN0b3IuaHBwXSkKK0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9wdHJfY29udGFpbmVyL3B0cl9hcnJheS5ocHBdKQorQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3B0cl9jb250YWluZXIvcHRyX3NldC5ocHBdKQorQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3B0cl9jb250YWluZXIvcHRyX21hcC5ocHBdKQorXSkjIEJPT1NUX1BPSU5URVJfQ09OVEFJTkVSCisKKworIyBCT09TVF9XQVZFKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE5PVEU6IElmIHlvdSBpbnRlbmQgdG8gdXNlIFdhdmUvU3Bpcml0IHdpdGggdGhyZWFkIHN1cHBvcnQsIG1ha2Ugc3VyZSB5b3UKKyMgY2FsbCBCT09TVF9USFJFQUQgZmlyc3QuCisjIExvb2sgZm9yIEJvb3N0LldhdmUuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW1dhdmVdLAorW0FDX1JFUVVJUkUoW0JPT1NUX0ZJTEVTWVNURU1dKWRubAorQUNfUkVRVUlSRShbQk9PU1RfREFURV9USU1FXSlkbmwKK2Jvb3N0X3dhdmVfc2F2ZV9MSUJTPSRMSUJTCitib29zdF93YXZlX3NhdmVfTERGTEFHUz0kTERGTEFHUworbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUXygoRklMRSk/U1lTVEVNfERBVEVfVElNRXxUSFJFQUQpXyhMSUJTfExERkxBR1MpJF0pZG5sCitMSUJTPSIkTElCUyAkQk9PU1RfU1lTVEVNX0xJQlMgJEJPT1NUX0ZJTEVTWVNURU1fTElCUyAkQk9PU1RfREFURV9USU1FX0xJQlMgXAorJEJPT1NUX1RIUkVBRF9MSUJTIgorTERGTEFHUz0iJExERkxBR1MgJEJPT1NUX1NZU1RFTV9MREZMQUdTICRCT09TVF9GSUxFU1lTVEVNX0xERkxBR1MgXAorJEJPT1NUX0RBVEVfVElNRV9MREZMQUdTICRCT09TVF9USFJFQURfTERGTEFHUyIKK0JPT1NUX0ZJTkRfTElCKFt3YXZlXSwgWyQxXSwKKyAgICAgICAgICAgICAgICBbYm9vc3Qvd2F2ZS5ocHBdLAorICAgICAgICAgICAgICAgIFtib29zdDo6d2F2ZTo6dG9rZW5faWQgaWQ7IGdldF90b2tlbl9uYW1lKGlkKTtdKQorTElCUz0kYm9vc3Rfd2F2ZV9zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X3dhdmVfc2F2ZV9MREZMQUdTCitdKSMgQk9PU1RfV0FWRQorCisKKyMgQk9PU1RfWFBSRVNTSVZFKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuWHByZXNzaXZlIChuZXcgc2luY2UgMS4zNi4wKS4KK0JPT1NUX0RFRlVOKFtYcHJlc3NpdmVdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC94cHJlc3NpdmUveHByZXNzaXZlLmhwcF0pXSkKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tICMKKyMgSW50ZXJuYWwgaGVscGVycy4gIworIyAtLS0tLS0tLS0tLS0tLS0tLSAjCisKKworIyBfQk9PU1RfUFRIUkVBRF9GTEFHKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEludGVybmFsIGhlbHBlciBmb3IgQk9PU1RfVEhSRUFELiAgQ29tcHV0ZXMgYm9vc3RfY3ZfcHRocmVhZF9mbGFnCisjIHdoaWNoIG11c3QgYmUgdXNlZCBpbiBDUFBGTEFHUyBhbmQgTElCUy4KKyMKKyMgWWVzLCB3ZSAqbmVlZCogdG8gcHV0IHRoZSAtcHRocmVhZCB0aGluZyBpbiBDUFBGTEFHUyBiZWNhdXNlIHdpdGggR0NDMywKKyMgYm9vc3QvdGhyZWFkLmhwcCB3aWxsIHRyaWdnZXIgYSAjZXJyb3IgaWYgLXB0aHJlYWQgaXNuJ3QgdXNlZDoKKyMgICBib29zdC9jb25maWcvcmVxdWlyZXNfdGhyZWFkcy5ocHA6NDc6NTogI2Vycm9yICJDb21waWxlciB0aHJlYWRpbmcgc3VwcG9ydAorIyAgIGlzIG5vdCB0dXJuZWQgb24uIFBsZWFzZSBzZXQgdGhlIGNvcnJlY3QgY29tbWFuZCBsaW5lIG9wdGlvbnMgZm9yCisjICAgdGhyZWFkaW5nOiAtcHRocmVhZCAoTGludXgpLCAtcHRocmVhZHMgKFNvbGFyaXMpIG9yIC1tdGhyZWFkcyAoTWluZ3czMikiCisjCisjIEJhc2VkIG9uIEFDWF9QVEhSRUFEOiBodHRwOi8vYXV0b2NvbmYtYXJjaGl2ZS5jcnlwLnRvL2FjeF9wdGhyZWFkLmh0bWwKK0FDX0RFRlVOKFtfQk9PU1RfUFRIUkVBRF9GTEFHXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0NYWF0pZG5sCitBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCitBQ19MQU5HX1BVU0goW0MrK10pZG5sCitBQ19DQUNIRV9DSEVDSyhbZm9yIHRoZSBmbGFncyBuZWVkZWQgdG8gdXNlIHB0aHJlYWRzXSwgW2Jvb3N0X2N2X3B0aHJlYWRfZmxhZ10sCitbIGJvb3N0X2N2X3B0aHJlYWRfZmxhZz0KKyAgIyBUaGUgb3JkZXJpbmcgKmlzKiAoc29tZXRpbWVzKSBpbXBvcnRhbnQuICBTb21lIG5vdGVzIG9uIHRoZQorICAjIGluZGl2aWR1YWwgaXRlbXMgZm9sbG93OgorICAjIChub25lKTogaW4gY2FzZSB0aHJlYWRzIGFyZSBpbiBsaWJjOyBzaG91bGQgYmUgdHJpZWQgYmVmb3JlIC1LdGhyZWFkIGFuZAorICAjICAgICAgIG90aGVyIGNvbXBpbGVyIGZsYWdzIHRvIHByZXZlbnQgY29udGludWFsIGNvbXBpbGVyIHdhcm5pbmdzCisgICMgLWxwdGhyZWFkczogQUlYIChtdXN0IGNoZWNrIHRoaXMgYmVmb3JlIC1scHRocmVhZCkKKyAgIyAtS3RocmVhZDogU2VxdWVudCAodGhyZWFkcyBpbiBsaWJjLCBidXQgLUt0aHJlYWQgbmVlZGVkIGZvciBwdGhyZWFkLmgpCisgICMgLWt0aHJlYWQ6IEZyZWVCU0Qga2VybmVsIHRocmVhZHMgKHByZWZlcnJlZCB0byAtcHRocmVhZCBzaW5jZSBTTVAtYWJsZSkKKyAgIyAtbGx0aHJlYWQ6IExpbnV4VGhyZWFkcyBwb3J0IG9uIEZyZWVCU0QgKGFsc28gcHJlZmVycmVkIHRvIC1wdGhyZWFkKQorICAjIC1wdGhyZWFkOiBHTlUgTGludXgvR0NDIChrZXJuZWwgdGhyZWFkcyksIEJTRC9HQ0MgKHVzZXJsYW5kIHRocmVhZHMpCisgICMgLXB0aHJlYWRzOiBTb2xhcmlzL0dDQworICAjIC1tdGhyZWFkczogTWluR1czMi9HQ0MsIEx5bngvR0NDCisgICMgLW10OiBTdW4gV29ya3Nob3AgQyAobWF5IG9ubHkgbGluayBTdW5PUyB0aHJlYWRzIFstbHRocmVhZF0sIGJ1dCBpdAorICAjICAgICAgZG9lc24ndCBodXJ0IHRvIGNoZWNrIHNpbmNlIHRoaXMgc29tZXRpbWVzIGRlZmluZXMgcHRocmVhZHMgdG9vOworICAjICAgICAgYWxzbyBkZWZpbmVzIC1EX1JFRU5UUkFOVCkKKyAgIyAgICAgIC4uLiAtbXQgaXMgYWxzbyB0aGUgcHRocmVhZHMgZmxhZyBmb3IgSFAvYUNDCisgICMgLWxwdGhyZWFkOiBHTlUgTGludXgsIGV0Yy4KKyAgIyAtLXRocmVhZC1zYWZlOiBLQUkgQysrCisgIGNhc2UgJGhvc3Rfb3MgaW4gIygKKyAgICAqc29sYXJpcyopCisgICAgICAjIE9uIFNvbGFyaXMgKGF0IGxlYXN0LCBmb3Igc29tZSB2ZXJzaW9ucyksIGxpYmMgY29udGFpbnMgc3R1YmJlZAorICAgICAgIyAobm9uLWZ1bmN0aW9uYWwpIHZlcnNpb25zIG9mIHRoZSBwdGhyZWFkcyByb3V0aW5lcywgc28gbGluay1iYXNlZAorICAgICAgIyB0ZXN0cyB3aWxsIGVycm9uZW91c2x5IHN1Y2NlZWQuICAoV2UgbmVlZCB0byBsaW5rIHdpdGggLXB0aHJlYWRzLy1tdC8KKyAgICAgICMgLWxwdGhyZWFkLikgIChUaGUgc3R1YnMgYXJlIG1pc3NpbmcgcHRocmVhZF9jbGVhbnVwX3B1c2gsIG9yIHJhdGhlcgorICAgICAgIyBhIGZ1bmN0aW9uIGNhbGxlZCBieSB0aGlzIG1hY3JvLCBzbyB3ZSBjb3VsZCBjaGVjayBmb3IgdGhhdCwgYnV0CisgICAgICAjIHdobyBrbm93cyB3aGV0aGVyIHRoZXknbGwgc3R1YiB0aGF0IHRvbyBpbiBhIGZ1dHVyZSBsaWJjLikgIFNvLAorICAgICAgIyB3ZSdsbCBqdXN0IGxvb2sgZm9yIC1wdGhyZWFkcyBhbmQgLWxwdGhyZWFkIGZpcnN0OgorICAgICAgYm9vc3RfcHRocmVhZF9mbGFncz0iLXB0aHJlYWRzIC1scHRocmVhZCAtbXQgLXB0aHJlYWQiOzsgIygKKyAgICAqKQorICAgICAgYm9vc3RfcHRocmVhZF9mbGFncz0iLWxwdGhyZWFkcyAtS3RocmVhZCAta3RocmVhZCAtbGx0aHJlYWQgLXB0aHJlYWQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLXB0aHJlYWRzIC1tdGhyZWFkcyAtbHB0aHJlYWQgLS10aHJlYWQtc2FmZSAtbXQiOzsKKyAgZXNhYworICAjIEdlbmVyYXRlIHRoZSB0ZXN0IGZpbGUuCisgIEFDX0xBTkdfQ09ORlRFU1QoW0FDX0xBTkdfUFJPR1JBTShbI2luY2x1ZGUgPHB0aHJlYWQuaD5dLAorICAgIFtwdGhyZWFkX3QgdGg7IHB0aHJlYWRfam9pbih0aCwgMCk7CisgICAgcHRocmVhZF9hdHRyX2luaXQoMCk7IHB0aHJlYWRfY2xlYW51cF9wdXNoKDAsIDApOworICAgIHB0aHJlYWRfY3JlYXRlKDAsMCwwLDApOyBwdGhyZWFkX2NsZWFudXBfcG9wKDApO10pXSkKKyAgZm9yIGJvb3N0X3B0aHJlYWRfZmxhZyBpbiAnJyAkYm9vc3RfcHRocmVhZF9mbGFnczsgZG8KKyAgICBib29zdF9wdGhyZWFkX29rPWZhbHNlCitkbmwgUmUtdXNlIHRoZSB0ZXN0IGZpbGUgYWxyZWFkeSBnZW5lcmF0ZWQuCisgICAgYm9vc3RfcHRocmVhZHNfX3NhdmVfTElCUz0kTElCUworICAgIExJQlM9IiRMSUJTICRib29zdF9wdGhyZWFkX2ZsYWciCisgICAgQUNfTElOS19JRkVMU0UoW10sCisgICAgICBbaWYgZ3JlcCAiLiokYm9vc3RfcHRocmVhZF9mbGFnIiBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICAgICAgIGVjaG8gIlRoaXMgZmxhZyBzZWVtcyB0byBoYXZlIHRyaWdnZXJlZCB3YXJuaW5ncyIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgIGVsc2UKKyAgICAgICAgIGJvb3N0X3B0aHJlYWRfb2s9OjsgYm9vc3RfY3ZfcHRocmVhZF9mbGFnPSRib29zdF9wdGhyZWFkX2ZsYWcKKyAgICAgICBmaV0pCisgICAgTElCUz0kYm9vc3RfcHRocmVhZHNfX3NhdmVfTElCUworICAgICRib29zdF9wdGhyZWFkX29rICYmIGJyZWFrCisgIGRvbmUKK10pCitBQ19MQU5HX1BPUChbQysrXSlkbmwKK10pIyBfQk9PU1RfUFRIUkVBRF9GTEFHCisKKworIyBfQk9PU1RfZ2NjX3Rlc3QoTUFKT1IsIE1JTk9SKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBJbnRlcm5hbCBoZWxwZXIgZm9yIF9CT09TVF9GSU5EX0NPTVBJTEVSX1RBRy4KK200X2RlZmluZShbX0JPT1NUX2djY190ZXN0XSwKK1siZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA9PSAkMSAmJiBfX0dOVUNfTUlOT1JfXyA9PSAkMiAmJiAhZGVmaW5lZCBfX0lDQyBAIGdjYyQxJDIiXSlkbmwKKworIyBfQk9PU1RfbWluZ3dfdGVzdChNQUpPUiwgTUlOT1IpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEludGVybmFsIGhlbHBlciBmb3IgX0JPT1NUX0ZJTkRfQ09NUElMRVJfVEFHLgorbTRfZGVmaW5lKFtfQk9PU1RfbWluZ3dfdGVzdF0sCitbImRlZmluZWQgX19HTlVDX18gJiYgX19HTlVDX18gPT0gJDEgJiYgX19HTlVDX01JTk9SX18gPT0gJDIgJiYgIWRlZmluZWQgX19JQ0MgJiYgXAorICAoZGVmaW5lZCBXSU4zMiB8fCBkZWZpbmVkIFdJTk5UIHx8IGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMiBcCisgICAgICAgICB8fCBkZWZpbmVkIF9fV0lOMzJfXyB8fCBkZWZpbmVkIF9fV0lOTlQgfHwgZGVmaW5lZCBfX1dJTk5UX18pIEAgbWd3JDEkMiJdKWRubAorCisKKyMgX0JPT1NUX0ZJTkRfQ09NUElMRVJfVEFHKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSW50ZXJuYWwuICBXaGVuIEJvb3N0IGlzIGluc3RhbGxlZCB3aXRob3V0IC0tbGF5b3V0PXN5c3RlbSwgZWFjaCBsaWJyYXJ5CisjIGZpbGVuYW1lIHdpbGwgaG9sZCBhIHN1ZmZpeCB0aGF0IGVuY29kZXMgdGhlIGNvbXBpbGVyIHVzZWQgZHVyaW5nIHRoZQorIyBidWlsZC4gIFRoZSBCb29zdCBidWlsZCBzeXN0ZW0gc2VlbXMgdG8gY2FsbCB0aGlzIGEgYHRhZycuCitBQ19ERUZVTihbX0JPT1NUX0ZJTkRfQ09NUElMRVJfVEFHXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0NYWF0pZG5sCitBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCitBQ19DQUNIRV9DSEVDSyhbZm9yIHRoZSB0b29sc2V0IG5hbWUgdXNlZCBieSBCb29zdCBmb3IgJENYWF0sCisgICAgICAgICAgICAgICBbYm9vc3RfY3ZfbGliX3RhZ10sCitbYm9vc3RfY3ZfbGliX3RhZz11bmtub3duCitpZiB0ZXN0IHgkYm9vc3RfY3ZfaW5jX3BhdGggIT0geG5vOyB0aGVuCisgIEFDX0xBTkdfUFVTSChbQysrXSlkbmwKKyAgIyBUaGUgZm9sbG93aW5nIHRlc3RzIGFyZSBtb3N0bHkgaW5zcGlyZWQgYnkgYm9vc3QvY29uZmlnL2F1dG9fbGluay5ocHAKKyAgIyBUaGUgbGlzdCBpcyBzb3J0ZWQgdG8gbW9zdCByZWNlbnQvY29tbW9uIHRvIG9sZGVzdCBjb21waWxlciAoaW4gb3JkZXIKKyAgIyB0byBpbmNyZWFzZSB0aGUgbGlrZWxpaG9vZCBvZiBmaW5kaW5nIHRoZSByaWdodCBjb21waWxlciB3aXRoIHRoZQorICAjIGxlYXN0IG51bWJlciBvZiBjb21waWxhdGlvbiBhdHRlbXB0KS4KKyAgIyBCZXdhcmUgdGhhdCBzb21lIHRlc3RzIGFyZSBzZW5zaWJsZSB0byB0aGUgb3JkZXIgKGZvciBpbnN0YW5jZSwgd2UgbXVzdAorICAjIGxvb2sgZm9yIE1pbkdXIGJlZm9yZSBsb29raW5nIGZvciBHQ0MzKS4KKyAgIyBJIHVzZWQgb25lIGNvbXBpbGF0aW9uIHRlc3QgcGVyIGNvbXBpbGVyIHdpdGggYSAjZXJyb3IgdG8gcmVjb2duaXplCisgICMgZWFjaCBjb21waWxlciBzbyB0aGF0IGl0IHdvcmtzIGV2ZW4gd2hlbiBjcm9zcy1jb21waWxpbmcgKGxldCBtZSBrbm93CisgICMgaWYgeW91IGtub3cgYSBiZXR0ZXIgYXBwcm9hY2gpLgorICAjIEtub3duIG1pc3NpbmcgdGFncyAoa25vd24gZnJvbSBCb29zdCdzIHRvb2xzL2J1aWxkL3YyL3Rvb2xzL2NvbW1vbi5qYW0pOgorICAjICAgY29tbywgZWRnLCBrY2MsIGJjaywgbXAsIHN3LCB0cnUsIHhsYworICAjIEknbSBub3Qgc3VyZSBhYm91dCBteSB0ZXN0IGZvciBgaWwnIChiZSBjYXJlZnVsOiBJbnRlbCdzIElDQyBwcmUtZGVmaW5lcworICAjIHRoZSBzYW1lIGRlZmluZXMgYXMgR0NDJ3MpLgorICBmb3IgaSBpbiBcCisgICAgX0JPT1NUX21pbmd3X3Rlc3QoNSwgMykgXAorICAgIF9CT09TVF9nY2NfdGVzdCg1LCAzKSBcCisgICAgX0JPT1NUX21pbmd3X3Rlc3QoNSwgMikgXAorICAgIF9CT09TVF9nY2NfdGVzdCg1LCAyKSBcCisgICAgX0JPT1NUX21pbmd3X3Rlc3QoNSwgMSkgXAorICAgIF9CT09TVF9nY2NfdGVzdCg1LCAxKSBcCisgICAgX0JPT1NUX21pbmd3X3Rlc3QoNSwgMCkgXAorICAgIF9CT09TVF9nY2NfdGVzdCg1LCAwKSBcCisgICAgX0JPT1NUX21pbmd3X3Rlc3QoNCwgMTApIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoNCwgMTApIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCA5KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDkpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCA4KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDgpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCA3KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDcpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCA2KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDYpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCA1KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDUpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCA0KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDQpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCAzKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDMpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCAyKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDIpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCAxKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDEpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCAwKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDApIFwKKyAgICAiZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA9PSAzICYmICFkZWZpbmVkIF9fSUNDIFwKKyAgICAgJiYgKGRlZmluZWQgV0lOMzIgfHwgZGVmaW5lZCBXSU5OVCB8fCBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzIgXAorICAgICAgICAgfHwgZGVmaW5lZCBfX1dJTjMyX18gfHwgZGVmaW5lZCBfX1dJTk5UIHx8IGRlZmluZWQgX19XSU5OVF9fKSBAIG1ndyIgXAorICAgIF9CT09TVF9nY2NfdGVzdCgzLCA0KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDMsIDMpIFwKKyAgICAiZGVmaW5lZCBfTVNDX1ZFUiAmJiBfTVNDX1ZFUiA+PSAxNTAwIEAgdmM5MCIgXAorICAgICJkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSID09IDE0MDAgQCB2YzgwIiBcCisgICAgX0JPT1NUX2djY190ZXN0KDMsIDIpIFwKKyAgICAiZGVmaW5lZCBfTVNDX1ZFUiAmJiBfTVNDX1ZFUiA9PSAxMzEwIEAgdmM3MSIgXAorICAgIF9CT09TVF9nY2NfdGVzdCgzLCAxKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDMsIDApIFwKKyAgICAiZGVmaW5lZCBfX0JPUkxBTkRDX18gQCBiY2IiIFwKKyAgICAiZGVmaW5lZCBfX0lDQyAmJiAoZGVmaW5lZCBfX3VuaXggfHwgZGVmaW5lZCBfX3VuaXhfXykgQCBpbCIgXAorICAgICJkZWZpbmVkIF9fSUNMIEAgaXciIFwKKyAgICAiZGVmaW5lZCBfTVNDX1ZFUiAmJiBfTVNDX1ZFUiA9PSAxMzAwIEAgdmM3IiBcCisgICAgX0JPT1NUX2djY190ZXN0KDIsIDk1KSBcCisgICAgImRlZmluZWQgX19NV0VSS1NfXyAmJiBfX01XRVJLU19fIDw9IDB4MzJGRiBAIGN3OSIgXAorICAgICJkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSIDwgMTMwMCAmJiAhZGVmaW5lZCBVTkRFUl9DRSBAIHZjNiIgXAorICAgICJkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSIDwgMTMwMCAmJiBkZWZpbmVkIFVOREVSX0NFIEAgZXZjNCIgXAorICAgICJkZWZpbmVkIF9fTVdFUktTX18gJiYgX19NV0VSS1NfXyA8PSAweDMxRkYgQCBjdzgiCisgIGRvCisgICAgYm9vc3RfdGFnX3Rlc3Q9YGV4cHIgIlgkaSIgOiAnWFwoW1teQF1dKlwpIEAgJ2AKKyAgICBib29zdF90YWc9YGV4cHIgIlgkaSIgOiAnWFtbXkBdXSogQCBcKC4qXCknYAorICAgIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKKyNpZiAkYm9vc3RfdGFnX3Rlc3QKKy8qIE9LICovCisjZWxzZQorIyBlcnJvciAkYm9vc3RfdGFnX3Rlc3QKKyNlbmRpZgorXV0pXSwgW2Jvb3N0X2N2X2xpYl90YWc9JGJvb3N0X3RhZzsgYnJlYWtdLCBbXSkKKyAgZG9uZQorQUNfTEFOR19QT1AoW0MrK10pZG5sCisgIGNhc2UgJGJvb3N0X2N2X2xpYl90YWcgaW4gIygKKyAgICAjIFNvbWUgbmV3ZXIgKD49IDEuMzU/KSB2ZXJzaW9ucyBvZiBCb29zdCBzZWVtIHRvIG9ubHkgdXNlICJnY2MiIGFzIG9wcG9zZWQKKyAgICAjIHRvICJnY2M0MSIgZm9yIGluc3RhbmNlLgorICAgICotZ2NjIHwgKictZ2NjICcpIDo7OyAjKCAgRG9uJ3QgcmUtYWRkIC1nY2M6IGl0J3MgYWxyZWFkeSBpbiB0aGVyZS4KKyAgICBnY2MqKQorICAgICAgYm9vc3RfdGFnX3g9CisgICAgICBjYXNlICRob3N0X29zIGluICMoCisgICAgICAgIGRhcndpbiopCisgICAgICAgICAgaWYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtZ2UgMTM2OyB0aGVuCisgICAgICAgICAgICAjIFRoZSBgeCcgYWRkZWQgaW4gcjQ2NzkzIG9mIEJvb3N0LgorICAgICAgICAgICAgYm9vc3RfdGFnX3g9eAorICAgICAgICAgIGZpOzsKKyAgICAgIGVzYWMKKyAgICAgICMgV2UgY2FuIHNwZWNpZnkgbXVsdGlwbGUgdGFncyBpbiB0aGlzIHZhcmlhYmxlIGJlY2F1c2UgaXQncyB1c2VkIGJ5CisgICAgICAjIEJPT1NUX0ZJTkRfTElCIHRoYXQgZG9lcyBhIGBmb3IgdGFnIGluIC0kYm9vc3RfY3ZfbGliX3RhZycgLi4uCisgICAgICBib29zdF9jdl9saWJfdGFnPSIkYm9vc3RfdGFnX3gkYm9vc3RfY3ZfbGliX3RhZyAtJHtib29zdF90YWdfeH1nY2MiCisgICAgICA7OyAjKAorICAgIHVua25vd24pCisgICAgICBBQ19NU0dfV0FSTihbW2NvdWxkIG5vdCBmaWd1cmUgb3V0IHdoaWNoIHRvb2xzZXQgbmFtZSB0byB1c2UgZm9yICRDWFhdXSkKKyAgICAgIGJvb3N0X2N2X2xpYl90YWc9CisgICAgICA7OworICBlc2FjCitmaV0pZG5sIGVuZCBvZiBBQ19DQUNIRV9DSEVDSworXSkjIF9CT09TVF9GSU5EX0NPTVBJTEVSX1RBRworCisKKyMgX0JPT1NUX0dVRVNTX1dIRVRIRVJfVE9fVVNFX01UKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29tcGlsZSBhIHNtYWxsIHRlc3QgdG8gdHJ5IHRvIGd1ZXNzIHdoZXRoZXIgd2Ugc2hvdWxkIGZhdm9yIE1UIChNdWx0aQorIyBUaHJlYWQpIGZsYXZvcnMgb2YgQm9vc3QuICBTZXRzIGJvb3N0X2d1ZXNzX3VzZV9tdCBhY2NvcmRpbmdseS4KK0FDX0RFRlVOKFtfQk9PU1RfR1VFU1NfV0hFVEhFUl9UT19VU0VfTVRdLAorWyMgQ2hlY2sgd2hldGhlciB3ZSBkbyBiZXR0ZXIgdXNlIGBtdCcgZXZlbiB0aG91Z2ggd2Ugd2VyZW4ndCBhc2sgdG8uCitBQ19MQU5HX1BVU0goW0MrK10pZG5sCitBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCisjaWYgZGVmaW5lZCBfUkVFTlRSQU5UIHx8IGRlZmluZWQgX01UIHx8IGRlZmluZWQgX19NVF9fCisvKiB1c2UgLW10ICovCisjZWxzZQorIyBlcnJvciBNVCBub3QgbmVlZGVkCisjZW5kaWYKK11dKV0sIFtib29zdF9ndWVzc191c2VfbXQ9Ol0sIFtib29zdF9ndWVzc191c2VfbXQ9ZmFsc2VdKQorQUNfTEFOR19QT1AoW0MrK10pZG5sCitdKQorCisjIF9CT09TVF9BQ19MSU5LX0lGRUxTRShQUk9HUkFNLCBbQUNUSU9OLUlGLVRSVUVdLCBbQUNUSU9OLUlGLUZBTFNFXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGb3JrIG9mIF9BQ19MSU5LX0lGRUxTRSB0aGF0IHByZXNlcnZlcyBjb25mdGVzdC5vIGFjcm9zcyBjYWxscy4gIEZyYWdpbGUsCisjIHdpbGwgYnJlYWsgd2hlbiBBdXRvY29uZiBjaGFuZ2VzIGl0cyBpbnRlcm5hbHMuICBSZXF1aXJlcyB0aGF0IHlvdSBtYW51YWxseQorIyBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGluIGJldHdlZW4gdG8gcmVhbGx5IGRpZmZlcmVudCB0ZXN0cywgb3RoZXJ3aXNlCisjIHlvdSB3aWxsIHRyeSB0byBsaW5rIGEgY29uZnRlc3QubyBsZWZ0IGJlaGluZCBieSBhIHByZXZpb3VzIHRlc3QuCisjIFVzZWQgdG8gYWdncmVzc2l2ZWx5IG9wdGltaXplIEJPT1NUX0ZJTkRfTElCIChzZWUgdGhlIGJpZyBjb21tZW50IGluIHRoaXMKKyMgbWFjcm8pLgorIworIyBEb24ndCB1c2UgImJyZWFrIiBpbiB0aGUgYWN0aW9ucywgYXMgaXQgd291bGQgc2hvcnQtY2lyY3VpdCBzb21lIGNvZGUKKyMgdGhpcyBtYWNybyBydW5zIGFmdGVyIHRoZSBhY3Rpb25zLgorbTRfZGVmaW5lKFtfQk9PU1RfQUNfTElOS19JRkVMU0VdLAorW200X2lmdmFsbihbJDFdLCBbQUNfTEFOR19DT05GVEVTVChbJDFdKV0pZG5sCitybSAtZiBjb25mdGVzdCRhY19leGVleHQKK2Jvb3N0X3NhdmVfYWNfZXh0PSRhY19leHQKK2Jvb3N0X3VzZV9zb3VyY2U9OgorIyBJZiB3ZSBhbHJlYWR5IGhhdmUgYSAubywgcmUtdXNlIGl0LiAgV2UgY2hhbmdlICRhY19leHQgc28gdGhhdCAkYWNfbGluaworIyB0cmllcyB0byBsaW5rIHRoZSBleGlzdGluZyBvYmplY3QgZmlsZSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBmcm9tIHNvdXJjZS4KK3Rlc3QgLWYgY29uZnRlc3QuJGFjX29iamV4dCAmJiBhY19leHQ9JGFjX29iamV4dCAmJiBib29zdF91c2Vfc291cmNlPWZhbHNlICYmCisgIF9BU19FQ0hPX0xPRyhbcmUtdXNpbmcgdGhlIGV4aXN0aW5nIGNvbmZ0ZXN0LiRhY19vYmpleHRdKQorQVNfSUYoW19BQ19ET19TVERFUlIoJGFjX2xpbmspICYmIHsKKyAgICAgICAgIHRlc3QgLXogIiRhY19bXV9BQ19MQU5HX0FCQlJFVltdX3dlcnJvcl9mbGFnIiB8fAorICAgICAgICAgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworICAgICAgICAgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKyAgICAgICAgICRhc19leGVjdXRhYmxlX3AgY29uZnRlc3QkYWNfZXhlZXh0CitkbmwgRklYTUU6IHVzZSBBU19URVNUX1ggaW5zdGVhZCB3aGVuIDIuNjEgaXMgd2lkZXNwcmVhZCBlbm91Z2guCisgICAgICAgfV0sCisgICAgICBbJDJdLAorICAgICAgW2lmICRib29zdF91c2Vfc291cmNlOyB0aGVuCisgICAgICAgICBfQUNfTVNHX0xPR19DT05GVEVTVAorICAgICAgIGZpCisgICAgICAgJDNdKQorYWNfb2JqZXh0PSRib29zdF9zYXZlX2FjX29iamV4dAorYWNfZXh0PSRib29zdF9zYXZlX2FjX2V4dAorZG5sIERlbGV0ZSBhbHNvIHRoZSBJUEEvSVBPIChJbnRlciBQcm9jZWR1cmFsIEFuYWx5c2lzL09wdGltaXphdGlvbikKK2RubCBpbmZvcm1hdGlvbiBjcmVhdGVkIGJ5IHRoZSBQR0kgY29tcGlsZXIgKGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28pLAorZG5sIGFzIGl0IHdvdWxkIGludGVyZmVyZSB3aXRoIHRoZSBuZXh0IGxpbmsgY29tbWFuZC4KK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IG00X2lmdmFsKFskMV0sIFtjb25mdGVzdC4kYWNfZXh0XSlbXWRubAorXSkjIF9CT09TVF9BQ19MSU5LX0lGRUxTRQorCisjIExvY2FsIFZhcmlhYmxlczoKKyMgbW9kZTogYXV0b2NvbmYKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9jdmM0LW1hc3Rlci1wYXRjaC9jb25maWcvYm9vc3QubTQgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL2N2YzQtbWFzdGVyLXBhdGNoL2NvbmZpZy9ib29zdC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODRjZmQyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9jdmM0LW1hc3Rlci1wYXRjaC9jb25maWcvYm9vc3QubTQKQEAgLTAsMCArMSwxNTY1IEBACisjIGJvb3N0Lm00OiBMb2NhdGUgQm9vc3QgaGVhZGVycyBhbmQgbGlicmFyaWVzIGZvciBhdXRvY29uZi1iYXNlZCBwcm9qZWN0cy4KKyMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMTEsIDIwMTQgIEJlbm9pdCBTaWdvdXJlIDx0c3VuYUBscmRlLmVwaXRhLmZyPgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBBZGRpdGlvbmFsIHBlcm1pc3Npb24gdW5kZXIgc2VjdGlvbiA3IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZSwgdmVyc2lvbiAzICgiR1BMdjMiKToKKyMKKyMgSWYgeW91IGNvbnZleSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHdvcmsgdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBkbyBzbyB1bmRlcgorIyB0ZXJtcyBvZiB5b3VyIGNob2ljZS4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKK200X2RlZmluZShbX0JPT1NUX1NFUklBTF0sIFttNF90cmFuc2xpdChbCisjIHNlcmlhbCAyNQorXSwgWyMKK10sIFtdKV0pCisKKyMgT3JpZ2luYWwgc291cmNlcyBjYW4gYmUgZm91bmQgYXQgaHR0cDovL2dpdGh1Yi5jb20vdHN1bmEvYm9vc3QubTQKKyMgWW91IGNhbiBmZXRjaCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIHNjcmlwdCBieSBkb2luZzoKKyMgICB3Z2V0IGh0dHA6Ly9naXRodWIuY29tL3RzdW5hL2Jvb3N0Lm00L3Jhdy9tYXN0ZXIvYnVpbGQtYXV4L2Jvb3N0Lm00CisKKyMgLS0tLS0tICMKKyMgUkVBRE1FICMKKyMgLS0tLS0tICMKKworIyBUaGlzIGZpbGUgcHJvdmlkZXMgc2V2ZXJhbCBtYWNyb3MgdG8gdXNlIHRoZSB2YXJpb3VzIEJvb3N0IGxpYnJhcmllcy4KKyMgVGhlIGZpcnN0IG1hY3JvIGlzIEJPT1NUX1JFUVVJUkUuICBJdCB3aWxsIHNpbXBseSBjaGVjayBpZiBpdCdzIHBvc3NpYmxlIHRvCisjIGZpbmQgdGhlIEJvb3N0IGhlYWRlcnMgb2YgYSBnaXZlbiAob3B0aW9uYWwpIG1pbmltdW0gdmVyc2lvbiBhbmQgaXQgd2lsbAorIyBkZWZpbmUgQk9PU1RfQ1BQRkxBR1MgYWNjb3JkaW5nbHkuICBJdCB3aWxsIGFkZCBhbiBvcHRpb24gLS13aXRoLWJvb3N0IHRvCisjIHlvdXIgY29uZmlndXJlIHNvIHRoYXQgdXNlcnMgY2FuIHNwZWNpZnkgbm9uIHN0YW5kYXJkIGxvY2F0aW9ucy4KKyMgSWYgdGhlIHVzZXIncyBlbnZpcm9ubWVudCBjb250YWlucyBCT09TVF9ST09UIGFuZCAtLXdpdGgtYm9vc3Qgd2FzIG5vdAorIyBzcGVjaWZpZWQsIC0td2l0aC1ib29zdD0kQk9PU1RfUk9PVCBpcyBpbXBsaWNpdGx5IHVzZWQuCisjIEZvciBtb3JlIFJFQURNRSBhbmQgZG9jdW1lbnRhdGlvbiwgZ28gdG8gaHR0cDovL2dpdGh1Yi5jb20vdHN1bmEvYm9vc3QubTQKKyMgTm90ZTogVEhFU0UgTUFDUk9TIEFTU1VNRSBUSEFUIFlPVSBVU0UgTElCVE9PTC4gIElmIHlvdSBkb24ndCwgZG9uJ3Qgd29ycnksCisjIHNpbXBseSByZWFkIHRoZSBSRUFETUUsIGl0IHdpbGwgc2hvdyB5b3Ugd2hhdCB0byBkbyBzdGVwIGJ5IHN0ZXAuCisKK200X3BhdHRlcm5fZm9yYmlkKFteXz8oQk9PU1R8Qm9vc3QpX10pCisKKworIyBfQk9PU1RfU0VEX0NQUChTRUQtUFJPR1JBTSwgUFJPR1JBTSwKKyMgICAgICAgICAgICAgICAgW0FDVElPTi1JRi1GT1VORF0sIFtBQ1RJT04tSUYtTk9ULUZPVU5EXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2FtZSBhcyBBQ19FR1JFUF9DUFAsIGJ1dCBsZWF2ZSB0aGUgcmVzdWx0IGluIGNvbmZ0ZXN0LmkuCisjCisjIFNFRC1QUk9HUkFNIGlzICpub3QqIG92ZXJxdW90ZWQsIGFzIGluIEFDX0VHUkVQX0NQUC4gIEl0IGlzIGV4cGFuZGVkCisjIGluIGRvdWJsZS1xdW90ZXMsIHNvIGVzY2FwZSB5b3VyIGRvdWJsZSBxdW90ZXMuCisjCisjIEl0IGNvdWxkIGJlIHVzZWZ1bCB0byB0dXJuIHRoaXMgaW50byBhIG1hY3JvIHdoaWNoIGV4dHJhY3RzIHRoZQorIyB2YWx1ZSBvZiBhbnkgbWFjcm8uCittNF9kZWZpbmUoW19CT09TVF9TRURfQ1BQXSwKK1tBQ19MQU5HX1BVU0goW0MrK10pZG5sCitBQ19MQU5HX1BSRVBST0NfUkVRVUlSRSgpZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX1NFRF0pZG5sCitBQ19MQU5HX0NPTkZURVNUKFtBQ19MQU5HX1NPVVJDRShbWyQyXV0pXSkKK0FTX0lGKFtkbmwgZXZhbCBpcyBuZWNlc3NhcnkgdG8gZXhwYW5kIGFjX2NwcC4KK2RubCBVbHRyaXggYW5kIFB5cmFtaWQgc2ggcmVmdXNlIHRvIHJlZGlyZWN0IG91dHB1dCBvZiBldmFsLCBzbyB1c2Ugc3Vic2hlbGwuCitkbmwgQmV3YXJlIG9mIFdpbmRvd3MgZW5kLW9mLWxpbmVzLCBmb3IgaW5zdGFuY2UgaWYgd2UgYXJlIHJ1bm5pbmcKK2RubCBzb21lIFdpbmRvd3MgcHJvZ3JhbXMgdW5kZXIgV2luZS4gIEluIHRoYXQgY2FzZSwgYm9vc3QvdmVyc2lvbi5ocHAKK2RubCBpcyBjZXJ0YWlubHkgdXNpbmcgIlxyXG4iLCBidXQgdGhlIHJlZ3VsYXIgVW5peCBzaGVsbCB3aWxsIG9ubHkKK2RubCBzdHJpcCBgXG4nIHdpdGggYmFja3F1b3Rlcywgbm90IHRoZSBgXHInLiAgVGhpcyByZXN1bHRzIGluCitkbmwgYm9vc3RfY3ZfbGliX3ZlcnNpb249JzFfMzdccicgZm9yIGluc3RhbmNlLCB3aGljaCBicmVha3MKK2RubCBldmVyeXRoaW5nIGVsc2UuCitkbmwgQ2Fubm90IHVzZSAnZG5sJyBhZnRlciBbJDRdIGJlY2F1c2UgYSB0cmFpbGluZyBkbmwgbWF5IGJyZWFrIEFDX0NBQ0hFX0NIRUNLCitkbmwKK2RubCBCZXdhcmUgdGhhdCBHQ0MgNSwgd2hlbiBleHBhbmRpbmcgbWFjcm9zLCBtYXkgZW1iZWQgIyBsaW5lIGRpcmVjdGl2ZXMKK2RubCBhIHdpdGhpbiBzaW5nbGUgbGluZToKK2RubAorZG5sICMgMSAiY29uZnRlc3QuY2MiCitkbmwgIyAxICI8YnVpbHQtaW4+IgorZG5sICMgMSAiPGNvbW1hbmQtbGluZT4iCitkbmwgIyAxICJjb25mdGVzdC5jYyIKK2RubCAjIDEgIi9vcHQvbG9jYWwvaW5jbHVkZS9ib29zdC92ZXJzaW9uLmhwcCIgMSAzCitkbmwgIyAyICJjb25mdGVzdC5jYyIgMgorZG5sIGJvb3N0LWxpYi12ZXJzaW9uID0KK2RubCAjIDIgImNvbmZ0ZXN0LmNjIiAzCitkbmwgICAgICAgICAgICAgICAgICAgICIxXzU2IgorZG5sCitkbmwgU28gZ2V0IHJpZCBvZiB0aGUgIyBsaW5lcywgYW5kIGdsdWUgdGhlIHJlbWFpbmluZyBvbmVzIHRvZ2V0aGVyLgorKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JkFTX01FU1NBR0VfTE9HX0ZEIHwKKyAgZ3JlcCAtdiAnIycgfAorICB0ciAtZCAnXHInIHwKKyAgdHIgLXMgJ1xuJyAnICcgfAorICAkU0VEIC1uIC1lICIkMSIgPmNvbmZ0ZXN0LmkgMj4mMV0sCisgIFskM10sCisgIFskNF0pCitybSAtcmYgY29uZnRlc3QqCitBQ19MQU5HX1BPUChbQysrXSlkbmwKK10pIyBfQk9PU1RfU0VEX0NQUAorCisKKworIyBCT09TVF9SRVFVSVJFKFtWRVJTSU9OXSwgW0FDVElPTi1JRi1OT1QtRk9VTkRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC4gIElmIHZlcnNpb24gaXMgZ2l2ZW4sIGl0IG11c3QgZWl0aGVyIGJlIGEgbGl0ZXJhbCBvZiB0aGUgZm9ybQorIyAiWC5ZLloiIHdoZXJlIFgsIFkgYW5kIFogYXJlIGludGVnZXJzICh0aGUgIi5aIiBwYXJ0IGJlaW5nIG9wdGlvbmFsKSBvciBhCisjIHZhcmlhYmxlICIkdmFyIi4KKyMgRGVmaW5lcyB0aGUgdmFsdWUgQk9PU1RfQ1BQRkxBR1MuICBUaGlzIG1hY3JvIG9ubHkgY2hlY2tzIGZvciBoZWFkZXJzIHdpdGgKKyMgdGhlIHJlcXVpcmVkIHZlcnNpb24sIGl0IGRvZXMgbm90IGNoZWNrIGZvciBhbnkgb2YgdGhlIEJvb3N0IGxpYnJhcmllcy4KKyMgT24gIyBzdWNjZXNzLCBkZWZpbmVzIEhBVkVfQk9PU1QuICBPbiBmYWlsdXJlLCBjYWxscyB0aGUgb3B0aW9uYWwKKyMgQUNUSU9OLUlGLU5PVC1GT1VORCBhY3Rpb24gaWYgb25lIHdhcyBzdXBwbGllZC4KKyMgT3RoZXJ3aXNlIGFib3J0cyB3aXRoIGFuIGVycm9yIG1lc3NhZ2UuCitBQ19ERUZVTl9PTkNFKFtCT09TVF9SRVFVSVJFXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0NYWF0pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX0dSRVBdKWRubAorZWNobyAiJGFzX21lOiB0aGlzIGlzIGJvb3N0Lm00W11fQk9PU1RfU0VSSUFMIiA+JkFTX01FU1NBR0VfTE9HX0ZECitib29zdF9zYXZlX0lGUz0kSUZTCitib29zdF92ZXJzaW9uX3JlcT0kMQorSUZTPS4KK3NldCB4ICRib29zdF92ZXJzaW9uX3JlcSAwIDAgMAorSUZTPSRib29zdF9zYXZlX0lGUworc2hpZnQKK2Jvb3N0X3ZlcnNpb25fcmVxPWBleHByICIkWzFdIiAnKicgMTAwMDAwICsgIiRbMl0iICcqJyAxMDAgKyAiJFszXSJgCitib29zdF92ZXJzaW9uX3JlcV9zdHJpbmc9JFsxXS4kWzJdLiRbM10KK0FDX0FSR19XSVRIKFtib29zdF0sCisgICBbQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1ib29zdD1ESVJdLAorICAgICAgICAgICAgICAgICAgIFtwcmVmaXggb2YgQm9vc3QgJDEgQDw6QGd1ZXNzQDo+QF0pXSlkbmwKK0FDX0FSR19WQVIoW0JPT1NUX1JPT1RdLFtMb2NhdGlvbiBvZiBCb29zdCBpbnN0YWxsYXRpb25dKWRubAorIyBJZiBCT09TVF9ST09UIGlzIHNldCBhbmQgdGhlIHVzZXIgaGFzIG5vdCBwcm92aWRlZCBhIHZhbHVlIHRvCisjIC0td2l0aC1ib29zdCwgdGhlbiB0cmVhdCBCT09TVF9ST09UIGFzIGlmIGl0IHRoZSB1c2VyIHN1cHBsaWVkIGl0LgoraWYgdGVzdCB4IiRCT09TVF9ST09UIiAhPSB4OyB0aGVuCisgIGlmIHRlc3QgeCIkd2l0aF9ib29zdCIgPSB4OyB0aGVuCisgICAgQUNfTVNHX05PVElDRShbRGV0ZWN0ZWQgQk9PU1RfUk9PVDsgY29udGludWluZyB3aXRoIC0td2l0aC1ib29zdD0kQk9PU1RfUk9PVF0pCisgICAgd2l0aF9ib29zdD0kQk9PU1RfUk9PVAorICBlbHNlCisgICAgQUNfTVNHX05PVElDRShbRGV0ZWN0ZWQgQk9PU1RfUk9PVD0kQk9PU1RfUk9PVCwgYnV0IG92ZXJyaWRkZW4gYnkgLS13aXRoLWJvb3N0PSR3aXRoX2Jvb3N0XSkKKyAgZmkKK2ZpCitBQ19TVUJTVChbRElTVENIRUNLX0NPTkZJR1VSRV9GTEFHU10sCisgICAgICAgICBbIiRESVNUQ0hFQ0tfQ09ORklHVVJFX0ZMQUdTICctLXdpdGgtYm9vc3Q9JHdpdGhfYm9vc3QnIl0pZG5sCitib29zdF9zYXZlX0NQUEZMQUdTPSRDUFBGTEFHUworICBBQ19DQUNIRV9DSEVDSyhbZm9yIEJvb3N0IGhlYWRlcnMgdmVyc2lvbiA+PSAkYm9vc3RfdmVyc2lvbl9yZXFfc3RyaW5nXSwKKyAgICBbYm9vc3RfY3ZfaW5jX3BhdGhdLAorICAgIFtib29zdF9jdl9pbmNfcGF0aD1ubworQUNfTEFOR19QVVNIKFtDKytdKWRubAorbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX1ZFUlNJT04kXSlkbmwKKyAgICBBQ19MQU5HX0NPTkZURVNUKFtBQ19MQU5HX1BST0dSQU0oW1sjaW5jbHVkZSA8Ym9vc3QvdmVyc2lvbi5ocHA+CisjaWYgIWRlZmluZWQgQk9PU1RfVkVSU0lPTgorIyBlcnJvciBCT09TVF9WRVJTSU9OIGlzIG5vdCBkZWZpbmVkCisjZWxpZiBCT09TVF9WRVJTSU9OIDwgJGJvb3N0X3ZlcnNpb25fcmVxCisjIGVycm9yIEJvb3N0IGhlYWRlcnMgdmVyc2lvbiA8ICRib29zdF92ZXJzaW9uX3JlcQorI2VuZGlmCitdXSldKQorICAgICMgSWYgdGhlIHVzZXIgcHJvdmlkZWQgYSB2YWx1ZSB0byAtLXdpdGgtYm9vc3QsIHVzZSBpdCBhbmQgb25seSBpdC4KKyAgICBjYXNlICR3aXRoX2Jvb3N0IGluICMoCisgICAgICAnJ3x5ZXMpIHNldCB4ICcnIC9vcHQvbG9jYWwvaW5jbHVkZSAvdXNyL2xvY2FsL2luY2x1ZGUgL29wdC9pbmNsdWRlIFwKKyAgICAgICAgICAgICAgICAgL3Vzci9pbmNsdWRlIEM6L0Jvb3N0L2luY2x1ZGU7OyAjKAorICAgICAgKikgICAgICBzZXQgeCAiJHdpdGhfYm9vc3QvaW5jbHVkZSIgIiR3aXRoX2Jvb3N0Ijs7CisgICAgZXNhYworICAgIHNoaWZ0CisgICAgZm9yIGJvb3N0X2RpcgorICAgIGRvCisgICAgIyBXaXRob3V0IC0tbGF5b3V0PXN5c3RlbSwgQm9vc3QgKG9yIGF0IGxlYXN0IHNvbWUgdmVyc2lvbnMpIGluc3RhbGxzCisgICAgIyBpdHNlbGYgaW4gPHByZWZpeD4vaW5jbHVkZS9ib29zdC08dmVyc2lvbj4uICBUaGlzIGlubmVyIGxvb3AgaGVscHMgdG8KKyAgICAjIGZpbmQgaGVhZGVycyBpbiBzdWNoIGRpcmVjdG9yaWVzLgorICAgICMKKyAgICAjIEFueSAke2Jvb3N0X2Rpcn0vYm9vc3QteF94eCBkaXJlY3RvcmllcyBhcmUgc2VhcmNoZWQgaW4gcmV2ZXJzZSB2ZXJzaW9uCisgICAgIyBvcmRlciBmb2xsb3dlZCBieSAke2Jvb3N0X2Rpcn0uICBUaGUgZmluYWwgJy4nIGlzIGEgc2VudGluZWwgZm9yCisgICAgIyBzZWFyY2hpbmcgJGJvb3N0X2RpciIgaXRzZWxmLiAgRW50cmllcyBhcmUgd2hpdGVzcGFjZSBzZXBhcmF0ZWQuCisgICAgIworICAgICMgSSBkaWRuJ3QgaW5kZW50IHRoaXMgbG9vcCBvbiBwdXJwb3NlICh0byBhdm9pZCBvdmVyLWluZGVudGVkIGNvZGUpCisgICAgYm9vc3RfbGF5b3V0X3N5c3RlbV9zZWFyY2hfbGlzdD1gY2QgIiRib29zdF9kaXIiIDI+L2Rldi9udWxsIFwKKyAgICAgICAgJiYgbHMgLTEgfCAiJHtHUkVQfSIgJ15ib29zdC0nIHwgc29ydCAtcm4gLXQtIC1rMiBcCisgICAgICAgICYmIGVjaG8gLmAKKyAgICBmb3IgYm9vc3RfaW5jIGluICRib29zdF9sYXlvdXRfc3lzdGVtX3NlYXJjaF9saXN0CisgICAgZG8KKyAgICAgIGlmIHRlc3QgeCIkYm9vc3RfaW5jIiAhPSB4LjsgdGhlbgorICAgICAgICBib29zdF9pbmM9IiRib29zdF9kaXIvJGJvb3N0X2luYyIKKyAgICAgIGVsc2UKKyAgICAgICAgYm9vc3RfaW5jPSIkYm9vc3RfZGlyIiAjIFVzZXMgc2VudGluZWwgaW4gYm9vc3RfbGF5b3V0X3N5c3RlbV9zZWFyY2hfbGlzdAorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgeCIkYm9vc3RfaW5jIiAhPSB4OyB0aGVuCisgICAgICAgICMgV2UgYXJlIGdvaW5nIHRvIGNoZWNrIHdoZXRoZXIgdGhlIHZlcnNpb24gb2YgQm9vc3QgaW5zdGFsbGVkCisgICAgICAgICMgaW4gJGJvb3N0X2luYyBpcyB1c2FibGUgYnkgcnVubmluZyBhIGNvbXBpbGF0aW9uIHRoYXQKKyAgICAgICAgIyAjaW5jbHVkZXMgaXQuICBCdXQgaWYgd2UgcGFzcyBhIC1JL3NvbWUvcGF0aCBpbiB3aGljaCBCb29zdAorICAgICAgICAjIGlzIG5vdCBpbnN0YWxsZWQsIHRoZSBjb21waWxlciB3aWxsIGp1c3Qgc2tpcCB0aGlzIC1JIGFuZAorICAgICAgICAjIHVzZSBvdGhlciBsb2NhdGlvbnMgKGVpdGhlciBmcm9tIENQUEZMQUdTLCBvciBmcm9tIGl0cyBsaXN0CisgICAgICAgICMgb2Ygc3lzdGVtIGluY2x1ZGUgZGlyZWN0b3JpZXMpLiAgQXMgYSByZXN1bHQgd2Ugd291bGQgdXNlCisgICAgICAgICMgaGVhZGVyIGluc3RhbGxlZCBvbiB0aGUgbWFjaGluZSBpbnN0ZWFkIG9mIHRoZSAvc29tZS9wYXRoCisgICAgICAgICMgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLiAgU28gaW4gdGhhdCBwcmVjaXNlIGNhc2UgKHRyeWluZworICAgICAgICAjICRib29zdF9pbmMpLCBtYWtlIHN1cmUgdGhlIHZlcnNpb24uaHBwIGV4aXN0cy4KKyAgICAgICAgIworICAgICAgICAjIFVzZSB0ZXN0IC1lIGFzIHRoZXJlIGNhbiBiZSBzeW1saW5rcy4KKyAgICAgICAgdGVzdCAtZSAiJGJvb3N0X2luYy9ib29zdC92ZXJzaW9uLmhwcCIgfHwgY29udGludWUKKyAgICAgICAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAtSSRib29zdF9pbmMiCisgICAgICBmaQorICAgICAgQUNfQ09NUElMRV9JRkVMU0UoW10sIFtib29zdF9jdl9pbmNfcGF0aD15ZXNdLCBbYm9vc3RfY3ZfdmVyc2lvbj1ub10pCisgICAgICBpZiB0ZXN0IHgiJGJvb3N0X2N2X2luY19wYXRoIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgaWYgdGVzdCB4IiRib29zdF9pbmMiICE9IHg7IHRoZW4KKyAgICAgICAgICBib29zdF9jdl9pbmNfcGF0aD0kYm9vc3RfaW5jCisgICAgICAgIGZpCisgICAgICAgIGJyZWFrIDIKKyAgICAgIGZpCisgICAgZG9uZQorICAgIGRvbmUKK0FDX0xBTkdfUE9QKFtDKytdKWRubAorICAgIF0pCisgICAgY2FzZSAkYm9vc3RfY3ZfaW5jX3BhdGggaW4gIygKKyAgICAgIG5vKQorICAgICAgICBib29zdF9lcnJtc2c9ImNhbm5vdCBmaW5kIEJvb3N0IGhlYWRlcnMgdmVyc2lvbiA+PSAkYm9vc3RfdmVyc2lvbl9yZXFfc3RyaW5nIgorICAgICAgICBtNF9pZihbJDJdLCBbXSwgIFtBQ19NU0dfRVJST1IoWyRib29zdF9lcnJtc2ddKV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbQUNfTVNHX05PVElDRShbJGJvb3N0X2Vycm1zZ10pXSkKKyAgICAgICAgJDIKKyAgICAgICAgOzsjKAorICAgICAgeWVzKQorICAgICAgICBCT09TVF9DUFBGTEFHUz0KKyAgICAgICAgOzsjKAorICAgICAgKikKKyAgICAgICAgQUNfU1VCU1QoW0JPT1NUX0NQUEZMQUdTXSwgWyItSSRib29zdF9jdl9pbmNfcGF0aCJdKWRubAorICAgICAgICA7OworICAgIGVzYWMKKyAgaWYgdGVzdCB4IiRib29zdF9jdl9pbmNfcGF0aCIgIT0geG5vOyB0aGVuCisgIEFDX0RFRklORShbSEFWRV9CT09TVF0sIFsxXSwKKyAgICAgICAgICAgIFtEZWZpbmVkIGlmIHRoZSByZXF1ZXN0ZWQgbWluaW11bSBCT09TVCB2ZXJzaW9uIGlzIHNhdGlzZmllZF0pCisgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgQm9vc3QncyBoZWFkZXIgdmVyc2lvbl0sCisgICAgW2Jvb3N0X2N2X2xpYl92ZXJzaW9uXSwKKyAgICBbbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX0xJQl9WRVJTSU9OJF0pZG5sCisgICAgIF9CT09TVF9TRURfQ1BQKFtbL15ib29zdC1saWItdmVyc2lvbiA9IC97cy8vLztzL1tcIiBdLy9nO3A7cTt9XV0sCisgICAgICAgICAgICAgICAgICAgIFsjaW5jbHVkZSA8Ym9vc3QvdmVyc2lvbi5ocHA+Citib29zdC1saWItdmVyc2lvbiA9IEJPT1NUX0xJQl9WRVJTSU9OXSwKKyAgICBbYm9vc3RfY3ZfbGliX3ZlcnNpb249YGNhdCBjb25mdGVzdC5pYF0pXSkKKyAgICAjIGUuZy4gIjEzNCIgZm9yIDFfMzRfMSBvciAiMTM1IiBmb3IgMV8zNQorICAgIAorICAgICNib29zdF9jdl9saWJfdmVyc2lvbj0iMTYxIgorICAgICNib29zdF9tYWpvcl92ZXJzaW9uPWBlY2hvICIkYm9vc3RfY3ZfbGliX3ZlcnNpb24iIHwgc2VkICdzL18vLztzL18uKi8vJ2AKKyAgICAjYm9vc3RfbWFqb3JfdmVyc2lvbj1gZWNobyAiJEJPT1NUX0xJQl9WRVJTSU9OIiB8IHNlZCAncy9fLy87cy9fLiovLydgCisgICAgYm9vc3RfbWFqb3JfdmVyc2lvbj0iMTYxIgorICAgICAKKyAgICAjY2FzZSAkYm9vc3RfbWFqb3JfdmVyc2lvbiBpbiAjKAorICAgICMgICcnIHwgKltbITAtOV1dKikKKyAgICAjICAgIEFDX01TR19FUlJPUihbaW52YWxpZCB2YWx1ZTogYm9vc3RfbWFqb3JfdmVyc2lvbj0nJGJvb3N0X21ham9yX3ZlcnNpb24nXSkKKyAgICAjICAgIDs7CisgICAgI2VzYWMKK2ZpCitDUFBGTEFHUz0kYm9vc3Rfc2F2ZV9DUFBGTEFHUworXSkjIEJPT1NUX1JFUVVJUkUKKworCisjIEJPT1NUX1NUQVRJQygpCisjIC0tLS0tLS0tLS0tLS0tCisjIEFkZCB0aGUgIi0tZW5hYmxlLXN0YXRpYy1ib29zdCIgY29uZmlndXJlIGFyZ3VtZW50LiBJZiB0aGlzIGFyZ3VtZW50IGlzIGdpdmVuCisjIG9uIHRoZSBjb21tYW5kIGxpbmUsIHN0YXRpYyB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyaWVzIHdpbGwgYmUgbG9va2VkIHVwLgorQUNfREVGVU4oW0JPT1NUX1NUQVRJQ10sCisgIFtBQ19BUkdfRU5BQkxFKFtzdGF0aWMtYm9vc3RdLAorICAgICBbQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXN0YXRpYy1ib29zdF0sCisgICAgICAgICAgICAgICBbUHJlZmVyIHRoZSBzdGF0aWMgYm9vc3QgbGlicmFyaWVzIG92ZXIgdGhlIHNoYXJlZCBvbmVzIFtub11dKV0sCisgICAgIFtlbmFibGVfc3RhdGljX2Jvb3N0PXllc10sCisgICAgIFtlbmFibGVfc3RhdGljX2Jvb3N0PW5vXSldKSMgQk9PU1RfU1RBVElDCisKKworIyBCT09TVF9GSU5EX0hFQURFUihbSEVBREVSLU5BTUVdLCBbQUNUSU9OLUlGLU5PVC1GT1VORF0sIFtBQ1RJT04tSUYtRk9VTkRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBXcmFwcGVyIGFyb3VuZCBBQ19DSEVDS19IRUFERVIgZm9yIEJvb3N0IGhlYWRlcnMuICBVc2VmdWwgdG8gY2hlY2sgZm9yCisjIHNvbWUgcGFydHMgb2YgdGhlIEJvb3N0IGxpYnJhcnkgd2hpY2ggYXJlIG9ubHkgbWFkZSBvZiBoZWFkZXJzIGFuZCBkb24ndAorIyByZXF1aXJlIGxpbmtpbmcgKHN1Y2ggYXMgQm9vc3QuRm9yZWFjaCkuCisjCisjIERlZmF1bHQgQUNUSU9OLUlGLU5PVC1GT1VORDogRmFpbCB3aXRoIGEgZmF0YWwgZXJyb3IgdW5sZXNzIEJvb3N0IGNvdWxkbid0IGJlCisjIGZvdW5kIGluIHRoZSBmaXJzdCBwbGFjZSwgaW4gd2hpY2ggY2FzZSBieSBkZWZhdWx0IGEgbm90aWNlIGlzIGlzc3VlZCB0byB0aGUKKyMgdXNlci4gIFByZXN1bWFibHkgaWYgd2UgaGF2ZW4ndCBkaWVkIGFscmVhZHkgaXQncyBiZWNhdXNlIGl0J3MgT0sgdG8gbm90IGhhdmUKKyMgQm9vc3QsIHdoaWNoIGlzIHdoeSBvbmx5IGEgbm90aWNlIGlzIGlzc3VlZCBpbnN0ZWFkIG9mIGEgaGFyZCBlcnJvci4KKyMKKyMgRGVmYXVsdCBBQ1RJT04tSUYtRk9VTkQ6IGRlZmluZSB0aGUgcHJlcHJvY2Vzc29yIHN5bWJvbCBIQVZFXzxIRUFERVItTkFNRT4gaW4KKyMgY2FzZSBvZiBzdWNjZXNzICMgKHdoZXJlIEhFQURFUi1OQU1FIGlzIHdyaXR0ZW4gTElLRV9USElTLCBlLmcuLAorIyBIQVZFX0JPT1NUX0ZPUkVBQ0hfSFBQKS4KK0FDX0RFRlVOKFtCT09TVF9GSU5EX0hFQURFUl0sCitbQUNfUkVRVUlSRShbQk9PU1RfUkVRVUlSRV0pZG5sCitpZiB0ZXN0IHgiJGJvb3N0X2N2X2luY19wYXRoIiA9IHhubzsgdGhlbgorICBtNF9kZWZhdWx0KFskMl0sIFtBQ19NU0dfTk9USUNFKFtCb29zdCBub3QgYXZhaWxhYmxlLCBub3Qgc2VhcmNoaW5nIGZvciAkMV0pXSkKK2Vsc2UKK0FDX0xBTkdfUFVTSChbQysrXSlkbmwKK2Jvb3N0X3NhdmVfQ1BQRkxBR1M9JENQUEZMQUdTCitDUFBGTEFHUz0iJENQUEZMQUdTICRCT09TVF9DUFBGTEFHUyIKK0FDX0NIRUNLX0hFQURFUihbJDFdLAorICBbbTRfZGVmYXVsdChbJDNdLCBbQUNfREVGSU5FKEFTX1RSX0NQUChbSEFWRV8kMV0pLCBbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0RlZmluZSB0byAxIGlmIHlvdSBoYXZlIDwkMT5dKV0pXSwKKyAgW200X2RlZmF1bHQoWyQyXSwgW0FDX01TR19FUlJPUihbY2Fubm90IGZpbmQgJDFdKV0pXSkKK0NQUEZMQUdTPSRib29zdF9zYXZlX0NQUEZMQUdTCitBQ19MQU5HX1BPUChbQysrXSlkbmwKK2ZpCitdKSMgQk9PU1RfRklORF9IRUFERVIKKworCisjIEJPT1NUX0ZJTkRfTElCUyhbQ09NUE9ORU5ULU5BTUVdLCBbQ0FORElEQVRFLUxJQi1OQU1FU10sCisjICAgICAgICAgICAgICAgICBbUFJFRkVSUkVELVJULU9QVF0sIFtIRUFERVItTkFNRV0sIFtDWFgtVEVTVF0sCisjICAgICAgICAgICAgICAgICBbQ1hYLVBST0xPR1VFXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgdGhlIEJvb3N0IGxpYnJhcnkgQ09NUE9ORU5ULU5BTUUgKGUuZy4sIGB0aHJlYWQnLCBmb3IKKyMgbGliYm9vc3RfdGhyZWFkKSB1bmRlciB0aGUgcG9zc2libGUgQ0FORElEQVRFLUxJQi1OQU1FUyAoZS5nLiwKKyMgInRocmVhZF93aW4zMiB0aHJlYWQiKS4gIENoZWNrIHRoYXQgSEVBREVSLU5BTUUgd29ya3MgYW5kIGNoZWNrIHRoYXQKKyMgbGliYm9vc3RfTElCLU5BTUUgY2FuIGxpbmsgd2l0aCB0aGUgY29kZSBDWFgtVEVTVC4gIFRoZSBvcHRpb25hbAorIyBhcmd1bWVudCBDWFgtUFJPTE9HVUUgY2FuIGJlIHVzZWQgdG8gaW5jbHVkZSBzb21lIEMrKyBjb2RlIGJlZm9yZQorIyB0aGUgYG1haW4nIGZ1bmN0aW9uLgorIworIyBJbnZva2VzIEJPT1NUX0ZJTkRfSEVBREVSKFtIRUFERVItTkFNRV0pIChzZWUgYWJvdmUpLgorIworIyBCb29zdCBsaWJyYXJpZXMgdHlwaWNhbGx5IGNvbWUgY29tcGlsZWQgd2l0aCBzZXZlcmFsIGZsYXZvcnMgKHdpdGggZGlmZmVyZW50CisjIHJ1bnRpbWUgb3B0aW9ucykgc28gUFJFRkVSUkVELVJULU9QVCBpcyB0aGUgcHJlZmVycmVkIHN1ZmZpeC4gIEEgc3VmZml4IGlzIG9uZQorIyBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgbGV0dGVyczogc2dkcG4gKGluIHRoYXQgb3JkZXIpLiAgcyA9IHN0YXRpYworIyBydW50aW1lLCBkID0gZGVidWcgYnVpbGQsIGcgPSBkZWJ1Zy9kaWFnbm9zdGljIHJ1bnRpbWUsIHAgPSBTVExQb3J0IGJ1aWxkLAorIyBuID0gKHVuc3VyZSkgU1RMUG9ydCBidWlsZCB3aXRob3V0IGlvc3RyZWFtcyBmcm9tIFNUTFBvcnQgKGl0IGxvb2tzIGxpa2UgYG4nCisjIG11c3QgYWx3YXlzIGJlIHVzZWQgYWxvbmcgd2l0aCBgcCcpLiAgQWRkaXRpb25hbGx5LCBQUkVGRVJSRUQtUlQtT1BUIGNhbgorIyBzdGFydCB3aXRoIGBtdC0nIHRvIGluZGljYXRlIHRoYXQgdGhlcmUgaXMgYSBwcmVmZXJlbmNlIGZvciBtdWx0aS10aHJlYWQKKyMgYnVpbGRzLiAgU29tZSBzYW1wbGUgdmFsdWVzIGZvciBQUkVGRVJSRUQtUlQtT1BUOiAobm90aGluZyksIG10LCBkLCBtdC1kLCBnZHAKKyMgLi4uICBJZiB5b3Ugd2FudCB0byBtYWtlIHN1cmUgeW91IGhhdmUgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIEJvb3N0CisjIChlZywgPj0gMS4zMykgeW91ICptdXN0KiBpbnZva2UgQk9PU1RfUkVRVUlSRSBiZWZvcmUgdGhpcyBtYWNyby4KK0FDX0RFRlVOKFtCT09TVF9GSU5EX0xJQlNdLAorW0FDX1JFUVVJUkUoW0JPT1NUX1JFUVVJUkVdKWRubAorQUNfUkVRVUlSRShbX0JPT1NUX0ZJTkRfQ09NUElMRVJfVEFHXSlkbmwKK0FDX1JFUVVJUkUoW0JPT1NUX1NUQVRJQ10pZG5sCitBQ19SRVFVSVJFKFtfQk9PU1RfR1VFU1NfV0hFVEhFUl9UT19VU0VfTVRdKWRubAoraWYgdGVzdCB4IiRib29zdF9jdl9pbmNfcGF0aCIgPSB4bm87IHRoZW4KKyAgQUNfTVNHX05PVElDRShbQm9vc3Qgbm90IGF2YWlsYWJsZSwgbm90IHNlYXJjaGluZyBmb3IgdGhlIEJvb3N0ICQxIGxpYnJhcnldKQorZWxzZQorZG5sIFRoZSBlbHNlIGJyYW5jaCBpcyBodWdlIGFuZCB3YXNuJ3QgaW50ZW5kZWQgb24gcHVycG9zZS4KK0FDX0xBTkdfUFVTSChbQysrXSlkbmwKK0FTX1ZBUl9QVVNIREVGKFtCb29zdF9saWJdLCBbYm9vc3RfY3ZfbGliXyQxXSlkbmwKK0FTX1ZBUl9QVVNIREVGKFtCb29zdF9saWJfTERGTEFHU10sIFtib29zdF9jdl9saWJfJDFfTERGTEFHU10pZG5sCitBU19WQVJfUFVTSERFRihbQm9vc3RfbGliX0xEUEFUSF0sIFtib29zdF9jdl9saWJfJDFfTERQQVRIXSlkbmwKK0FTX1ZBUl9QVVNIREVGKFtCb29zdF9saWJfTElCU10sIFtib29zdF9jdl9saWJfJDFfTElCU10pZG5sCitCT09TVF9GSU5EX0hFQURFUihbJDRdKQorYm9vc3Rfc2F2ZV9DUFBGTEFHUz0kQ1BQRkxBR1MKK0NQUEZMQUdTPSIkQ1BQRkxBR1MgJEJPT1NUX0NQUEZMQUdTIgorQUNfQ0FDSEVfQ0hFQ0soW2ZvciB0aGUgQm9vc3QgJDEgbGlicmFyeV0sIFtCb29zdF9saWJdLAorICAgICAgICAgICAgICAgW19CT09TVF9GSU5EX0xJQlMoJEApXSkKK2Nhc2UgJEJvb3N0X2xpYiBpbiAjKAorICAobm8pIF9BQ19NU0dfTE9HX0NPTkZURVNUCisgICAgQUNfTVNHX0VSUk9SKFtjYW5ub3QgZmluZCB0aGUgZmxhZ3MgdG8gbGluayB3aXRoIEJvb3N0ICQxXSkKKyAgICA7OworZXNhYworQUNfU1VCU1QoQVNfVFJfQ1BQKFtCT09TVF8kMV9MREZMQUdTXSksIFskQm9vc3RfbGliX0xERkxBR1NdKWRubAorQUNfU1VCU1QoQVNfVFJfQ1BQKFtCT09TVF8kMV9MRFBBVEhdKSwgWyRCb29zdF9saWJfTERQQVRIXSlkbmwKK0FDX1NVQlNUKFtCT09TVF9MRFBBVEhdLCBbJEJvb3N0X2xpYl9MRFBBVEhdKWRubAorQUNfU1VCU1QoQVNfVFJfQ1BQKFtCT09TVF8kMV9MSUJTXSksIFskQm9vc3RfbGliX0xJQlNdKWRubAorQ1BQRkxBR1M9JGJvb3N0X3NhdmVfQ1BQRkxBR1MKK0FTX1ZBUl9QT1BERUYoW0Jvb3N0X2xpYl0pZG5sCitBU19WQVJfUE9QREVGKFtCb29zdF9saWJfTERGTEFHU10pZG5sCitBU19WQVJfUE9QREVGKFtCb29zdF9saWJfTERQQVRIXSlkbmwKK0FTX1ZBUl9QT1BERUYoW0Jvb3N0X2xpYl9MSUJTXSlkbmwKK0FDX0xBTkdfUE9QKFtDKytdKWRubAorZmkKK10pCisKKworIyBCT09TVF9GSU5EX0xJQihbTElCLU5BTUVdLAorIyAgICAgICAgICAgICAgICBbUFJFRkVSUkVELVJULU9QVF0sIFtIRUFERVItTkFNRV0sIFtDWFgtVEVTVF0sCisjICAgICAgICAgICAgICAgIFtDWFgtUFJPTE9HVUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdyYXBwZXIgZm9yIEJPT1NUX0ZJTkRfTElCUy4KK0FDX0RFRlVOKFtCT09TVF9GSU5EX0xJQl0sCitbQk9PU1RfRklORF9MSUJTKFskMV0sICRAKV0pCisKKworIyBfQk9PU1RfRklORF9MSUJTKFtMSUItTkFNRV0sIFtDQU5ESURBVEUtTElCLU5BTUVTXSwKKyMgICAgICAgICAgICAgICAgIFtQUkVGRVJSRUQtUlQtT1BUXSwgW0hFQURFUi1OQU1FXSwgW0NYWC1URVNUXSwKKyMgICAgICAgICAgICAgICAgIFtDWFgtUFJPTE9HVUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBSZWFsIGltcGxlbWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCUzogcmVseSBvbiB0aGVzZSBsb2NhbCBtYWNyb3M6CisjIEJvb3N0X2xpYiwgQm9vc3RfbGliX0xERkxBR1MsIEJvb3N0X2xpYl9MRFBBVEgsIEJvb3N0X2xpYl9MSUJTCisjCisjIFRoZSBhbGdvcml0aG0gaXMgYXMgZm9sbG93czogZmlyc3QgbG9vayBmb3IgYSBnaXZlbiBsaWJyYXJ5IG5hbWUKKyMgYWNjb3JkaW5nIHRvIHRoZSB1c2VyJ3MgUFJFRkVSUkVELVJULU9QVC4gIEZvciBlYWNoIGxpYnJhcnkgbmFtZSwgd2UKKyMgcHJlZmVyIHRvIHVzZSB0aGUgb25lcyB0aGF0IGNhcnJ5IHRoZSB0YWcgKHRvb2xzZXQgbmFtZSkuICBFYWNoCisjIGxpYnJhcnkgaXMgc2VhcmNoZWQgdGhyb3VnaCB0aGUgdmFyaW91cyBzdGFuZGFyZCBwYXRocyB3ZXJlIEJvb3N0IGlzCisjIHVzdWFsbHkgaW5zdGFsbGVkLiAgSWYgd2UgY2FuJ3QgZmluZCB0aGUgc3RhbmRhcmQgdmFyaWFudHMsIHdlIHRyeQorIyB0byBlbmZvcmNlIC1tdCAoZm9yIGluc3RhbmNlIG9uIE1hY09TWCwgbGliYm9vc3RfdGhyZWFkLmR5bGliCisjIGRvZXNuJ3QgZXhpc3QgYnV0IHRoZXJlJ3MgLW9idmlvdXNseS0gbGliYm9vc3RfdGhyZWFkLW10LmR5bGliKS4KK0FDX0RFRlVOKFtfQk9PU1RfRklORF9MSUJTXSwKK1tCb29zdF9saWI9bm8KKyAgY2FzZSAiJDMiIGluICMoCisgICAgKG10IHwgbXQtKSBib29zdF9tdD0tbXQ7IGJvb3N0X3J0b3B0PTs7ICMoCisgICAgKG10KiB8IG10LSopIGJvb3N0X210PS1tdDsgYm9vc3RfcnRvcHQ9YGV4cHIgIlgkMyIgOiAnWG10LSpcKC4qXCknYDs7ICMoCisgICAgKCopIGJvb3N0X210PTsgYm9vc3RfcnRvcHQ9JDM7OworICBlc2FjCisgIGlmIHRlc3QgJGVuYWJsZV9zdGF0aWNfYm9vc3QgPSB5ZXM7IHRoZW4KKyAgICBib29zdF9ydG9wdD0icyRib29zdF9ydG9wdCIKKyAgZmkKKyAgIyBGaW5kIHRoZSBwcm9wZXIgZGVidWcgdmFyaWFudCBkZXBlbmRpbmcgb24gd2hhdCB3ZSd2ZSBiZWVuIGFza2VkIHRvIGZpbmQuCisgIGNhc2UgJGJvb3N0X3J0b3B0IGluICMoCisgICAgKCpkKikgYm9vc3RfcnRfZD0kYm9vc3RfcnRvcHQ7OyAjKAorICAgICgqW1tzZ3BuXV0qKSAjIEluc2VydCB0aGUgYGQnIGF0IHRoZSByaWdodCBwbGFjZSAoaW4gYmV0d2VlbiBgc2cnIGFuZCBgcG4nKQorICAgICAgYm9vc3RfcnRfZD1gZWNobyAiJGJvb3N0X3J0b3B0IiB8IHNlZCAncy9cKHMqZypcKVwocCpuKlwpL1wxXDIvJ2A7OyAjKAorICAgICgqKSBib29zdF9ydF9kPSctZCc7OworICBlc2FjCisgICMgSWYgdGhlIFBSRUZFUlJFRC1SVC1PUFQgYXJlIG5vdCBlbXB0eSwgcHJlcGVuZCBhIGAtJy4KKyAgdGVzdCAtbiAiJGJvb3N0X3J0b3B0IiAmJiBib29zdF9ydG9wdD0iLSRib29zdF9ydG9wdCIKKyAgJGJvb3N0X2d1ZXNzX3VzZV9tdCAmJiBib29zdF9tdD0tbXQKKyAgIyBMb29rIGZvciB0aGUgYWJzIHBhdGggdGhlIHN0YXRpYyBhcmNoaXZlLgorICAjICRsaWJleHQgaXMgY29tcHV0ZWQgYnkgTGlidG9vbCBidXQgbGV0J3MgbWFrZSBzdXJlIGl0J3Mgbm9uIGVtcHR5LgorICB0ZXN0IC16ICIkbGliZXh0IiAmJgorICAgIEFDX01TR19FUlJPUihbdGhlIGxpYmV4dCB2YXJpYWJsZSBpcyBlbXB0eSwgZGlkIHlvdSBpbnZva2UgTGlidG9vbD9dKQorICBib29zdF9zYXZlX2FjX29iamV4dD0kYWNfb2JqZXh0CisgICMgR2VuZXJhdGUgdGhlIHRlc3QgZmlsZS4KKyAgQUNfTEFOR19DT05GVEVTVChbQUNfTEFOR19QUk9HUkFNKFsjaW5jbHVkZSA8JDQ+CiskNl0sIFskNV0pXSkKK2RubCBPcHRpbWl6YXRpb24gaGFja3M6IGNvbXBpbGluZyBDKysgaXMgc2xvdywgZXNwZWNpYWxseSB3aXRoIEJvb3N0LiAgV2hhdAorZG5sIHdlJ3JlIHRyeWluZyB0byBkbyBoZXJlIGlzIGd1ZXNzIHRoZSByaWdodCBjb21iaW5hdGlvbiBvZiBsaW5rIGZsYWdzCitkbmwgKExJQlMgLyBMREZMQUdTKSB0byB1c2UgYSBnaXZlbiBsaWJyYXJ5LiAgVGhpcyBjYW4gdGFrZSBzZXZlcmFsCitkbmwgaXRlcmF0aW9ucyBiZWZvcmUgaXQgc3VjY2VlZHMgYW5kIGlzIHRodXMgKnZlcnkqIHNsb3cuICBTbyB3aGF0IHdlIGRvCitkbmwgaW5zdGVhZCBpcyB0aGF0IHdlIGNvbXBpbGUgdGhlIGNvZGUgZmlyc3QgKGFuZCB0aHVzIGdldCBhbiBvYmplY3QgZmlsZSwKK2RubCB0eXBpY2FsbHkgY29uZnRlc3QubykuICBUaGVuIHdlIHRyeSB2YXJpb3VzIGNvbWJpbmF0aW9ucyBvZiBsaW5rIGZsYWdzCitkbmwgdW50aWwgd2Ugc3VjY2VlZCB0byBsaW5rIGNvbmZ0ZXN0Lm8gaW4gYW4gZXhlY3V0YWJsZS4gIFRoZSBwcm9ibGVtIGlzCitkbmwgdGhhdCB0aGUgdmFyaW91cyBUUllfTElOSyAvIENPTVBJTEVfSUZFTFNFIG1hY3JvcyBvZiBBdXRvY29uZiBhbHdheXMKK2RubCByZW1vdmUgYWxsIHRoZSB0ZW1wb3JhcnkgZmlsZXMgaW5jbHVkaW5nIGNvbmZ0ZXN0Lm8uICBTbyB0aGUgdHJpY2sgaGVyZQorZG5sIGlzIHRvIHRlbXBvcmFyaWx5IGNoYW5nZSB0aGUgdmFsdWUgb2YgYWNfb2JqZXh0IHNvIHRoYXQgY29uZnRlc3QubyBpcworZG5sIHByZXNlcnZlZCBhY2Nyb3NzIHRlc3RzLiAgVGhpcyBpcyBvYnZpb3VzbHkgZnJhZ2lsZSBhbmQgSSB3aWxsIGJ1cm4gaW4KK2RubCBoZWxsIGZvciBub3QgcmVzcGVjdGluZyBBdXRvY29uZidzIGRvY3VtZW50ZWQgaW50ZXJmYWNlcywgYnV0IGluIHRoZQorZG5sIG1lYW4gdGltZSwgaXQgb3B0aW1pemVzIHRoZSBtYWNybyBieSBhIGZhY3RvciBvZiA1IHRvIDMwLgorZG5sIEFub3RoZXIgc21hbGwgb3B0aW1pemF0aW9uOiB0aGUgZmlyc3QgYXJndW1lbnQgb2YgQUNfQ09NUElMRV9JRkVMU0UgbGVmdAorZG5sIGVtcHR5IGJlY2F1c2UgdGhlIHRlc3QgZmlsZSBpcyBnZW5lcmF0ZWQgb25seSBvbmNlIGFib3ZlIChiZWZvcmUgd2UKK2RubCBzdGFydCB0aGUgZm9yIGxvb3BzKS4KKyAgQUNfQ09NUElMRV9JRkVMU0UoW10sCisgICAgW2FjX29iamV4dD1kb19ub3Rfcm1fbWVfcGx6XSwKKyAgICBbQUNfTVNHX0VSUk9SKFtjYW5ub3QgY29tcGlsZSBhIHRlc3QgdGhhdCB1c2VzIEJvb3N0ICQxXSldKQorICBhY19vYmpleHQ9JGJvb3N0X3NhdmVfYWNfb2JqZXh0CisgIGJvb3N0X2ZhaWxlZF9saWJzPQorIyBEb24ndCBib3RoZXIgdG8gaWRlbnQgdGhlIGZvbGxvd2luZyBuZXN0ZWQgZm9yIGxvb3BzLCBvbmx5IHRoZSAyCisjIGlubmVybW9zdCBvbmVzIG1hdHRlci4KK2ZvciBib29zdF9saWJfIGluICQyOyBkbworZm9yIGJvb3N0X3RhZ18gaW4gLSRib29zdF9jdl9saWJfdGFnICcnOyBkbworZm9yIGJvb3N0X3Zlcl8gaW4gLSRib29zdF9jdl9saWJfdmVyc2lvbiAnJzsgZG8KK2ZvciBib29zdF9tdF8gaW4gJGJvb3N0X210IC1tdCAnJzsgZG8KK2ZvciBib29zdF9ydG9wdF8gaW4gJGJvb3N0X3J0b3B0ICcnIC1kOyBkbworICBmb3IgYm9vc3RfbGliIGluIFwKKyAgICBib29zdF8kYm9vc3RfbGliXyRib29zdF90YWdfJGJvb3N0X210XyRib29zdF9ydG9wdF8kYm9vc3RfdmVyXyBcCisgICAgYm9vc3RfJGJvb3N0X2xpYl8kYm9vc3RfdGFnXyRib29zdF9ydG9wdF8kYm9vc3RfdmVyXyBcCisgICAgYm9vc3RfJGJvb3N0X2xpYl8kYm9vc3RfdGFnXyRib29zdF9tdF8kYm9vc3RfdmVyXyBcCisgICAgYm9vc3RfJGJvb3N0X2xpYl8kYm9vc3RfdGFnXyRib29zdF92ZXJfCisgIGRvCisgICAgIyBBdm9pZCB0ZXN0aW5nIHR3aWNlIHRoZSBzYW1lIGxpYgorICAgIGNhc2UgJGJvb3N0X2ZhaWxlZF9saWJzIGluICMoCisgICAgICAoKkAkYm9vc3RfbGliQCopIGNvbnRpbnVlOzsKKyAgICBlc2FjCisgICAgIyBJZiB3aXRoX2Jvb3N0IGlzIGVtcHR5LCB3ZSdsbCBzZWFyY2ggaW4gL2xpYiBmaXJzdCwgd2hpY2ggaXMgbm90IHF1aXRlCisgICAgIyByaWdodCBzbyBpbnN0ZWFkIHdlJ2xsIHRyeSB0byBhIGxvY2F0aW9uIGJhc2VkIG9uIHdoZXJlIHRoZSBoZWFkZXJzIGFyZS4KKyAgICBib29zdF90bXBfbGliPSR3aXRoX2Jvb3N0CisgICAgdGVzdCB4IiR3aXRoX2Jvb3N0IiA9IHggJiYgYm9vc3RfdG1wX2xpYj0ke2Jvb3N0X2N2X2luY19wYXRoJS9pbmNsdWRlfQorICAgIGZvciBib29zdF9sZHBhdGggaW4gIiRib29zdF90bXBfbGliL2xpYiIgJycgXAorICAgICAgICAgICAgIC9vcHQvbG9jYWwvbGliKiAvdXNyL2xvY2FsL2xpYiogL29wdC9saWIqIC91c3IvbGliKiBcCisgICAgICAgICAgICAgIiR3aXRoX2Jvb3N0IiBDOi9Cb29zdC9saWIgL2xpYioKKyAgICBkbworICAgICAgIyBEb24ndCB3YXN0ZSB0aW1lIHdpdGggZGlyZWN0b3JpZXMgdGhhdCBkb24ndCBleGlzdC4KKyAgICAgIGlmIHRlc3QgeCIkYm9vc3RfbGRwYXRoIiAhPSB4ICYmIHRlc3QgISAtZSAiJGJvb3N0X2xkcGF0aCI7IHRoZW4KKyAgICAgICAgY29udGludWUKKyAgICAgIGZpCisgICAgICBib29zdF9zYXZlX0xERkxBR1M9JExERkxBR1MKKyAgICAgICMgQXJlIHdlIGxvb2tpbmcgZm9yIGEgc3RhdGljIGxpYnJhcnk/CisgICAgICBjYXNlICRib29zdF9sZHBhdGg6JGJvb3N0X3J0b3B0XyBpbiAjKAorICAgICAgICAoKj8qOipzKikgIyBZZXMgKE5vbiBlbXB0eSBib29zdF9sZHBhdGggKyBzIGluIHJ0IG9wdCkKKyAgICAgICAgICBCb29zdF9saWJfTElCUz0iJGJvb3N0X2xkcGF0aC9saWIkYm9vc3RfbGliLiRsaWJleHQiCisgICAgICAgICAgdGVzdCAtZSAiJEJvb3N0X2xpYl9MSUJTIiB8fCBjb250aW51ZTs7ICMoCisgICAgICAgICgqKSAjIE5vOiB1c2UgLWxib29zdF9mb28gdG8gZmluZCB0aGUgc2hhcmVkIGxpYnJhcnkuCisgICAgICAgICAgQm9vc3RfbGliX0xJQlM9Ii1sJGJvb3N0X2xpYiI7OworICAgICAgZXNhYworICAgICAgYm9vc3Rfc2F2ZV9MSUJTPSRMSUJTCisgICAgICBMSUJTPSIkQm9vc3RfbGliX0xJQlMgJExJQlMiCisgICAgICB0ZXN0IHgiJGJvb3N0X2xkcGF0aCIgIT0geCAmJiBMREZMQUdTPSIkTERGTEFHUyAtTCRib29zdF9sZHBhdGgiCitkbmwgRmlyc3QgYXJndW1lbnQgb2YgQUNfTElOS19JRkVMU0UgbGVmdCBlbXB0eSBiZWNhdXNlIHRoZSB0ZXN0IGZpbGUgaXMKK2RubCBnZW5lcmF0ZWQgb25seSBvbmNlIGFib3ZlIChiZWZvcmUgd2Ugc3RhcnQgdGhlIGZvciBsb29wcykuCisgICAgICBfQk9PU1RfQUNfTElOS19JRkVMU0UoW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0Jvb3N0X2xpYj15ZXNdLCBbQm9vc3RfbGliPW5vXSkKKyAgICAgIGFjX29iamV4dD0kYm9vc3Rfc2F2ZV9hY19vYmpleHQKKyAgICAgIExERkxBR1M9JGJvb3N0X3NhdmVfTERGTEFHUworICAgICAgTElCUz0kYm9vc3Rfc2F2ZV9MSUJTCisgICAgICBpZiB0ZXN0IHgiJEJvb3N0X2xpYiIgPSB4eWVzOyB0aGVuCisgICAgICAgICMgQ2hlY2sgb3IgdXNlZCBjYWNoZWQgcmVzdWx0IG9mIHdoZXRoZXIgb3Igbm90IHVzaW5nIC1SIG9yCisgICAgICAgICMgLXJwYXRoIG1ha2VzIHNlbnNlLiAgU29tZSBpbXBsZW1lbnRhdGlvbnMgb2YgbGQsIHN1Y2ggYXMgZm9yCisgICAgICAgICMgTWFjIE9TWCwgcmVxdWlyZSAtcnBhdGggYnV0IC1SIGlzIHRoZSBmbGFnIGtub3duIHRvIHdvcmsgb24KKyAgICAgICAgIyBvdGhlciBzeXN0ZW1zLiAgaHR0cHM6Ly9naXRodWIuY29tL3RzdW5hL2Jvb3N0Lm00L2lzc3Vlcy8xOQorICAgICAgICBBQ19DQUNIRV9WQUwoW2Jvb3N0X2N2X3JwYXRoX2xpbmtfbGRmbGFnXSwKKyAgICAgICAgICBbY2FzZSAkYm9vc3RfbGRwYXRoIGluCisgICAgICAgICAgICcnKSAjIE5vdGhpbmcgdG8gZG8uCisgICAgICAgICAgICAgYm9vc3RfY3ZfcnBhdGhfbGlua19sZGZsYWc9CisgICAgICAgICAgICAgYm9vc3RfcnBhdGhfbGlua19sZGZsYWdfZm91bmQ9eWVzOzsKKyAgICAgICAgICAgKikKKyAgICAgICAgICAgIGZvciBib29zdF9jdl9ycGF0aF9saW5rX2xkZmxhZyBpbiAtV2wsLVIsIC1XbCwtcnBhdGgsOyBkbworICAgICAgICAgICAgICBMREZMQUdTPSIkYm9vc3Rfc2F2ZV9MREZMQUdTIC1MJGJvb3N0X2xkcGF0aCAkYm9vc3RfY3ZfcnBhdGhfbGlua19sZGZsYWckYm9vc3RfbGRwYXRoIgorICAgICAgICAgICAgICBMSUJTPSIkYm9vc3Rfc2F2ZV9MSUJTICRCb29zdF9saWJfTElCUyIKKyAgICAgICAgICAgICAgX0JPT1NUX0FDX0xJTktfSUZFTFNFKFtdLAorICAgICAgICAgICAgICAgIFtib29zdF9ycGF0aF9saW5rX2xkZmxhZ19mb3VuZD15ZXMKKyAgICAgICAgICAgICAgICBicmVha10sCisgICAgICAgICAgICAgICAgW2Jvb3N0X3JwYXRoX2xpbmtfbGRmbGFnX2ZvdW5kPW5vXSkKKyAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgIDs7CisgICAgICAgICAgZXNhYworICAgICAgICAgIEFTX0lGKFt0ZXN0ICJ4JGJvb3N0X3JwYXRoX2xpbmtfbGRmbGFnX2ZvdW5kIiAhPSAieHllcyJdLAorICAgICAgICAgICAgW0FDX01TR19FUlJPUihbVW5hYmxlIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHVzZSAtUiBvciAtcnBhdGhdKV0pCisgICAgICAgICAgTERGTEFHUz0kYm9vc3Rfc2F2ZV9MREZMQUdTCisgICAgICAgICAgTElCUz0kYm9vc3Rfc2F2ZV9MSUJTCisgICAgICAgICAgXSkKKyAgICAgICAgdGVzdCB4IiRib29zdF9sZHBhdGgiICE9IHggJiYKKyAgICAgICAgICBCb29zdF9saWJfTERGTEFHUz0iLUwkYm9vc3RfbGRwYXRoICRib29zdF9jdl9ycGF0aF9saW5rX2xkZmxhZyRib29zdF9sZHBhdGgiCisgICAgICAgIEJvb3N0X2xpYl9MRFBBVEg9IiRib29zdF9sZHBhdGgiCisgICAgICAgIGJyZWFrIDcKKyAgICAgIGVsc2UKKyAgICAgICAgYm9vc3RfZmFpbGVkX2xpYnM9IiRib29zdF9mYWlsZWRfbGlic0AkYm9vc3RfbGliQCIKKyAgICAgIGZpCisgICAgZG9uZQorICBkb25lCitkb25lCitkb25lCitkb25lCitkb25lCitkb25lICMgYm9vc3RfbGliXworcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorXSkKKworCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKKyMgQ2hlY2tzIGZvciB0aGUgdmFyaW91cyBCb29zdCBsaWJyYXJpZXMuICMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKKworIyBMaXN0IG9mIGJvb3N0IGxpYnJhcmllczogaHR0cDovL3d3dy5ib29zdC5vcmcvbGlicy9saWJyYXJpZXMuaHRtCisjIFRoZSBwYWdlIGh0dHA6Ly9iZXRhLmJvb3N0Lm9yZy9kb2MvbGlicyBpcyB1c2VmdWw6IGl0IGdpdmVzIHRoZSBmaXJzdCByZWxlYXNlCisjIHZlcnNpb24gb2YgZWFjaCBsaWJyYXJ5IChhbW9uZyBvdGhlciB0aGluZ3MpLgorCisjIEJPT1NUX0RFRlVOKExJQlJBUlksIENPREUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlZmluZSBCT09TVF88TElCUkFSWS1VUFBFUkNBU0U+IGFzIGEgbWFjcm8gdGhhdCBydW5zIENPREUuCisjCisjIFVzZSBpbmRpciB0byBhdm9pZCB0aGUgd2FybmluZyBvbiB1bmRlcnF1b3RlZCBtYWNybyBuYW1lIGdpdmVuIHRvIEFDX0RFRlVOLgorbTRfZGVmaW5lKFtCT09TVF9ERUZVTl0sCitbbTRfaW5kaXIoW0FDX0RFRlVOXSwKKyAgICAgICAgICBtNF90b3VwcGVyKFtCT09TVF8kMV0pLAorW200X3B1c2hkZWYoW0JPT1NUX0xpYnJhcnldLCBbJDFdKWRubAorJDIKK200X3BvcGRlZihbQk9PU1RfTGlicmFyeV0pZG5sCitdKQorXSkKKworIyBCT09TVF9BUlJBWSgpCisjIC0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuQXJyYXkKK0JPT1NUX0RFRlVOKFtBcnJheV0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L2FycmF5LmhwcF0pXSkKKworCisjIEJPT1NUX0FTSU8oKQorIyAtLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuQXNpbyAobmV3IGluIEJvb3N0IDEuMzUpLgorQk9PU1RfREVGVU4oW0FzaW9dLAorW0FDX1JFUVVJUkUoW0JPT1NUX1NZU1RFTV0pZG5sCitCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvYXNpby5ocHBdKV0pCisKKworIyBCT09TVF9CSU5EKCkKKyMgLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkJpbmQuCitCT09TVF9ERUZVTihbQmluZF0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L2JpbmQuaHBwXSldKQorCisKKyMgQk9PU1RfQ0hST05PKCkKKyMgLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuQ2hyb25vLgorQk9PU1RfREVGVU4oW0Nocm9ub10sCitbIyBEbyB3ZSBoYXZlIHRvIGNoZWNrIGZvciBCb29zdC5TeXN0ZW0/ICBUaGlzIGxpbmstdGltZSBkZXBlbmRlbmN5IHdhcworIyBhZGRlZCBhcyBvZiAxLjM1LjAuICBJZiB3ZSBoYXZlIGEgdmVyc2lvbiA8MS4zNSwgd2UgbXVzdCBub3QgYXR0ZW1wdCB0bworIyBmaW5kIEJvb3N0LlN5c3RlbSBhcyBpdCBkaWRuJ3QgZXhpc3QgYnkgdGhlbi4KK2lmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWdlIDEzNTsgdGhlbgorICBCT09TVF9TWVNURU0oWyQxXSkKK2ZpICMgZW5kIG9mIHRoZSBCb29zdC5TeXN0ZW0gY2hlY2suCitib29zdF9maWxlc3lzdGVtX3NhdmVfTElCUz0kTElCUworYm9vc3RfZmlsZXN5c3RlbV9zYXZlX0xERkxBR1M9JExERkxBR1MKK200X3BhdHRlcm5fYWxsb3coW15CT09TVF9TWVNURU1fKExJQlN8TERGTEFHUykkXSlkbmwKK0xJQlM9IiRMSUJTICRCT09TVF9TWVNURU1fTElCUyIKK0xERkxBR1M9IiRMREZMQUdTICRCT09TVF9TWVNURU1fTERGTEFHUyIKK0JPT1NUX0ZJTkRfTElCKFtjaHJvbm9dLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9jaHJvbm8uaHBwXSwKKyAgICAgICAgICAgICAgICBbYm9vc3Q6OmNocm9ubzo6dGhyZWFkX2Nsb2NrIGQ7XSkKK2lmIHRlc3QgJGVuYWJsZV9zdGF0aWNfYm9vc3QgPSB5ZXMgJiYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtZ2UgMTM1OyB0aGVuCisgIEJPT1NUX0NIUk9OT19MSUJTPSIkQk9PU1RfQ0hST05PX0xJQlMgJEJPT1NUX1NZU1RFTV9MSUJTIgorZmkKK0xJQlM9JGJvb3N0X2ZpbGVzeXN0ZW1fc2F2ZV9MSUJTCitMREZMQUdTPSRib29zdF9maWxlc3lzdGVtX3NhdmVfTERGTEFHUworXSkjIEJPT1NUX0NIUk9OTworCisKKyMgQk9PU1RfQ09OVEVYVChbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkNvbnRleHQuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorIworIyAqIFRoaXMgbGlicmFyeSB3YXMgaW50cm9kdWNlZCBpbiBCb29zdCAxLjUxLjAKKyMgKiBUaGUgc2lnbmF0dXJlcyBvZiBtYWtlX2Zjb250ZXh0KCkgYW5kIGp1bXBfZmNvbnRleHQgd2VyZSBjaGFuZ2VkIGluIDEuNTYuMAorIyAqIEEgZGVwZW5kZW5jeSBvbiBib29zdF90aHJlYWQgYXBwZWFycyBpbiAxLjU3LjAKK0JPT1NUX0RFRlVOKFtDb250ZXh0XSwKK1tib29zdF9jb250ZXh0X3NhdmVfTElCUz0kTElCUworIGJvb3N0X2NvbnRleHRfc2F2ZV9MREZMQUdTPSRMREZMQUdTCitpZiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxNTc7IHRoZW4KKyAgQk9PU1RfVEhSRUFEKFskMV0pCisgIG00X3BhdHRlcm5fYWxsb3coW15CT09TVF9USFJFQURfKExJQlN8TERGTEFHUykkXSlkbmwKKyAgTElCUz0iJExJQlMgJEJPT1NUX1RIUkVBRF9MSUJTIgorICBMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfVEhSRUFEX0xERkxBR1MiCitmaQorQk9PU1RfRklORF9MSUIoW2NvbnRleHRdLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9jb250ZXh0L2FsbC5ocHBdLFtbCisKKy8vIGNyZWF0ZXMgYSBzdGFjawordm9pZCAqIHN0YWNrX3BvaW50ZXIgPSBuZXcgdm9pZCpbNDA5Nl07CitzdGQ6OnNpemVfdCBjb25zdCBzaXplID0gc2l6ZW9mKHZvaWQqWzQwOTZdKTsKKworI2lmIEJPT1NUX1ZFUlNJT04gPD0gMTA1MTAwCitjdHg6Om1ha2VfZmNvbnRleHQoJmZjLCBmKTsKK3JldHVybiBjdHg6Omp1bXBfZmNvbnRleHQoJmZjbSwgJmZjLCAzKSA9PSA2OworCisjZWxzZQorCitmYyA9IGN0eDo6bWFrZV9mY29udGV4dChzdGFja19wb2ludGVyLCBzaXplLCBmKTsKK3JldHVybiBjdHg6Omp1bXBfZmNvbnRleHQoJmZjbSwgZmMsIDMpID09IDY7CisKKyNlbmRpZgorCisKK11dLFtkbmwKKworI2luY2x1ZGUgPGJvb3N0L3ZlcnNpb24uaHBwPgorI2lmIEJPT1NUX1ZFUlNJT04gPD0gMTA1MTAwCisKK25hbWVzcGFjZSBjdHggPSBib29zdDo6Y3R4OworCitzdGF0aWMgY3R4OjpmY29udGV4dF90IGZjbSwgZmM7CisKK3N0YXRpYyB2b2lkIGYoaW50cHRyX3QgaSkgeworICAgIGN0eDo6anVtcF9mY29udGV4dCgmZmMsICZmY20sIGkgKiAyKTsKK30KKworI2VsaWYgQk9PU1RfVkVSU0lPTiA8PSAxMDU1MDAKKworbmFtZXNwYWNlIGN0eCA9IGJvb3N0Ojpjb250ZXh0OworCisvLyBjb250ZXh0CitzdGF0aWMgY3R4OjpmY29udGV4dF90IGZjbSwgKmZjOworCisvLyBjb250ZXh0LWZ1bmN0aW9uCitzdGF0aWMgdm9pZCBmKGludHB0cl90IGkpIHsKKyAgICBjdHg6Omp1bXBfZmNvbnRleHQoZmMsICZmY20sIGkgKiAyKTsKK30KKworI2Vsc2UKKworbmFtZXNwYWNlIGN0eCA9IGJvb3N0Ojpjb250ZXh0OworCisvLyBjb250ZXh0CitzdGF0aWMgY3R4OjpmY29udGV4dF90IGZjbSwgZmM7CisKKy8vIGNvbnRleHQtZnVuY3Rpb24KK3N0YXRpYyB2b2lkIGYoaW50cHRyX3QgaSkgeworICAgIGN0eDo6anVtcF9mY29udGV4dCgmZmMsIGZjbSwgaSAqIDIpOworfQorI2VuZGlmCitdKQorTElCUz0kYm9vc3RfY29udGV4dF9zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X2NvbnRleHRfc2F2ZV9MREZMQUdTCitdKSMgQk9PU1RfQ09OVEVYVAorCisKKyMgQk9PU1RfQ09OVkVSU0lPTigpCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5Db252ZXJzaW9uIChjYXN0IC8gbGV4aWNhbF9jYXN0KQorQk9PU1RfREVGVU4oW0NvbnZlcnNpb25dLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9jYXN0LmhwcF0pCitCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvbGV4aWNhbF9jYXN0LmhwcF0pCitdKSMgQk9PU1RfQ09OVkVSU0lPTgorCisKKyMgQk9PU1RfQ09ST1VUSU5FKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuQ29yb3V0aW5lLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsIHNlZSB0aGUKKyMgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4gIFRoaXMgbGlicmFyeSB3YXMgaW50cm9kdWNlZCBpbiBCb29zdAorIyAxLjUzLjAKK0JPT1NUX0RFRlVOKFtDb3JvdXRpbmVdLAorWworYm9vc3RfY29yb3V0aW5lX3NhdmVfTElCUz0kTElCUworYm9vc3RfY29yb3V0aW5lX3NhdmVfTERGTEFHUz0kTERGTEFHUworIyBMaW5rLXRpbWUgZGVwZW5kZW5jeSBmcm9tIGNvcm91dGluZSB0byBjb250ZXh0CitCT09TVF9DT05URVhUKFskMV0pCisjIFN0YXJ0aW5nIGZyb20gQm9vc3QgMS41NSBhIGRlcGVuZGVuY3kgb24gQm9vc3QuU3lzdGVtIGlzIGFkZGVkCitpZiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxNTU7IHRoZW4KKyAgQk9PU1RfU1lTVEVNKFskMV0pCitmaQorbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUXyhDT05URVhUfFNZU1RFTSlfKExJQlN8TERGTEFHUyldKQorTElCUz0iJExJQlMgJEJPT1NUX0NPTlRFWFRfTElCUyAkQk9PU1RfU1lTVEVNX0xJQlMiCitMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfQ09OVEVYVF9MREZMQUdTIgorCisjIGluIDEuNTMgY29yb3V0aW5lIHdhcyBhIGhlYWRlciBvbmx5IGxpYnJhcnkKK2lmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWVxIDE1MzsgdGhlbgorICBCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvY29yb3V0aW5lL2Nvcm91dGluZS5ocHBdKQorZWxzZQorICBCT09TVF9GSU5EX0xJQihbY29yb3V0aW5lXSwgWyQxXSwKKwkJICBbYm9vc3QvY29yb3V0aW5lL2Nvcm91dGluZS5ocHBdLAorCQkgIFsKKyAgI2luY2x1ZGUgPGJvb3N0L3ZlcnNpb24uaHBwPgorICAjaWYgICBCT09TVF9WRVJTSU9OIDw9IDEwNTUwMAorICBib29zdDo6Y29yb3V0aW5lczo6Y29yb3V0aW5lPGludChpbnQpPiBjb3JvOyBjb3JvLmdldCgpOworICAjZWxzZQorICBib29zdDo6Y29yb3V0aW5lczo6YXN5bW1ldHJpY19jb3JvdXRpbmU8aW50Pjo6cHVsbF90eXBlIGNvcm87IGNvcm8uZ2V0KCk7CisgICNlbmRpZgorICBdKQorZmkKKyMgTGluay10aW1lIGRlcGVuZGVuY3kgZnJvbSBjb3JvdXRpbmUgdG8gY29udGV4dCwgZXhpc3RlZCBvbmx5IGluIDEuNTMsIGluIDEuNTQKKyMgY29yb3V0aW5lIGRvZXNuJ3QgdXNlIGNvbnRleHQgZnJvbSBpdHMgaGVhZGVycyBidXQgZnJvbSBpdHMgbGlicmFyeS4KK2lmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWVxIDE1MyB8fCB0ZXN0ICRlbmFibGVfc3RhdGljX2Jvb3N0ID0geWVzICYmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWdlIDE1NDsgdGhlbgorICBCT09TVF9DT1JPVVRJTkVfTElCUz0iJEJPT1NUX0NPUk9VVElORV9MSUJTICRCT09TVF9DT05URVhUX0xJQlMiCisgIEJPT1NUX0NPUk9VVElORV9MREZMQUdTPSIkQk9PU1RfQ09ST1VUSU5FX0xERkxBR1MgJEJPT1NUX0NPTlRFWFRfTERGTEFHUyIKK2ZpCitpZiB0ZXN0ICRlbmFibGVfc3RhdGljX2Jvb3N0ID0geWVzICYmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWdlIDE1NTsgdGhlbgorICBCT09TVF9DT1JPVVRJTkVfTElCUz0iJEJPT1NUX0NPUk9VVElORV9MSUJTICRCT09TVF9TWVNURU1fTElCUyIKKyAgQk9PU1RfQ09ST1VUSU5FX0xERkxBR1M9IiRCT09TVF9DT1JPVVRJTkVfTERGTEFHUyAkQk9PU1RfU1lTVEVNX0xERkxBR1MiCitmaQorTElCUz0kYm9vc3RfY29yb3V0aW5lX3NhdmVfTElCUworTERGTEFHUz0kYm9vc3RfY29yb3V0aW5lX3NhdmVfTERGTEFHUworXSkjIEJPT1NUX0NPUk9VVElORQorCisKKyMgQk9PU1RfQ1JDKCkKKyMgLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuQ1JDCitCT09TVF9ERUZVTihbQ1JDXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvY3JjLmhwcF0pCitdKSMgQk9PU1RfQ1JDCisKKworIyBCT09TVF9EQVRFX1RJTUUoW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5EYXRlX1RpbWUuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW0RhdGVfVGltZV0sCitbQk9PU1RfRklORF9MSUIoW2RhdGVfdGltZV0sIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L2RhdGVfdGltZS9wb3NpeF90aW1lL3Bvc2l4X3RpbWUuaHBwXSwKKyAgICAgICAgICAgICAgICBbYm9vc3Q6OnBvc2l4X3RpbWU6OnB0aW1lIHQ7XSkKK10pIyBCT09TVF9EQVRFX1RJTUUKKworCisjIEJPT1NUX0ZJTEVTWVNURU0oW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuRmlsZXN5c3RlbS4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUKKyMgdGhlIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCisjIERvIG5vdCBjaGVjayBmb3IgYm9vc3QvZmlsZXN5c3RlbS5ocHAgYmVjYXVzZSB0aGlzIGZpbGUgd2FzIGludHJvZHVjZWQgaW4KKyMgMS4zNC4KK0JPT1NUX0RFRlVOKFtGaWxlc3lzdGVtXSwKK1sjIERvIHdlIGhhdmUgdG8gY2hlY2sgZm9yIEJvb3N0LlN5c3RlbT8gIFRoaXMgbGluay10aW1lIGRlcGVuZGVuY3kgd2FzCisjIGFkZGVkIGFzIG9mIDEuMzUuMC4gIElmIHdlIGhhdmUgYSB2ZXJzaW9uIDwxLjM1LCB3ZSBtdXN0IG5vdCBhdHRlbXB0IHRvCisjIGZpbmQgQm9vc3QuU3lzdGVtIGFzIGl0IGRpZG4ndCBleGlzdCBieSB0aGVuLgoraWYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtZ2UgMTM1OyB0aGVuCisgIEJPT1NUX1NZU1RFTShbJDFdKQorZmkgIyBlbmQgb2YgdGhlIEJvb3N0LlN5c3RlbSBjaGVjay4KK2Jvb3N0X2ZpbGVzeXN0ZW1fc2F2ZV9MSUJTPSRMSUJTCitib29zdF9maWxlc3lzdGVtX3NhdmVfTERGTEFHUz0kTERGTEFHUworbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX1NZU1RFTV8oTElCU3xMREZMQUdTKSRdKWRubAorTElCUz0iJExJQlMgJEJPT1NUX1NZU1RFTV9MSUJTIgorTERGTEFHUz0iJExERkxBR1MgJEJPT1NUX1NZU1RFTV9MREZMQUdTIgorQk9PU1RfRklORF9MSUIoW2ZpbGVzeXN0ZW1dLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9maWxlc3lzdGVtL3BhdGguaHBwXSwgW2Jvb3N0OjpmaWxlc3lzdGVtOjpwYXRoIHA7XSkKK2lmIHRlc3QgJGVuYWJsZV9zdGF0aWNfYm9vc3QgPSB5ZXMgJiYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtZ2UgMTM1OyB0aGVuCisgIEJPT1NUX0ZJTEVTWVNURU1fTElCUz0iJEJPT1NUX0ZJTEVTWVNURU1fTElCUyAkQk9PU1RfU1lTVEVNX0xJQlMiCitmaQorTElCUz0kYm9vc3RfZmlsZXN5c3RlbV9zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X2ZpbGVzeXN0ZW1fc2F2ZV9MREZMQUdTCitdKSMgQk9PU1RfRklMRVNZU1RFTQorCisKKyMgQk9PU1RfRkxZV0VJR0hUKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuRmx5d2VpZ2h0LgorQk9PU1RfREVGVU4oW0ZseXdlaWdodF0sCitbZG5sIFRoZXJlJ3MgYSBoaWRkZW4gZGVwZW5kZW5jeSBvbiBwdGhyZWFkcy4KK0FDX1JFUVVJUkUoW19CT09TVF9QVEhSRUFEX0ZMQUddKWRubAorQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L2ZseXdlaWdodC5ocHBdKQorQUNfU1VCU1QoW0JPT1NUX0ZMWVdFSUdIVF9MSUJTXSwgWyRib29zdF9jdl9wdGhyZWFkX2ZsYWddKQorXSkKKworCisjIEJPT1NUX0ZPUkVBQ0goKQorIyAtLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuRm9yZWFjaC4KK0JPT1NUX0RFRlVOKFtGb3JlYWNoXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvZm9yZWFjaC5ocHBdKV0pCisKKworIyBCT09TVF9GT1JNQVQoKQorIyAtLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5Gb3JtYXQuCisjIE5vdGU6IHdlIGNhbid0IGNoZWNrIGZvciBib29zdC9mb3JtYXQvZm9ybWF0X2Z3ZC5ocHAgYmVjYXVzZSB0aGUgaGVhZGVyIGlzbid0CisjIHN0YW5kYWxvbmUuICBJdCBjYW4ndCBiZSBjb21waWxlZCBiZWNhdXNlIGl0IHRyaWdnZXJzIHRoZSBmb2xsb3dpbmcgZXJyb3I6CisjIGJvb3N0L2Zvcm1hdC9kZXRhaWwvY29uZmlnX21hY3Jvcy5ocHA6ODg6IGVycm9yOiAnbG9jYWxlJyBpbiBuYW1lc3BhY2UgJ3N0ZCcKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZXMgbm90IG5hbWUgYSB0eXBlCitCT09TVF9ERUZVTihbRm9ybWF0XSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvZm9ybWF0LmhwcF0pXSkKKworCisjIEJPT1NUX0ZVTkNUSU9OKCkKKyMgLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5GdW5jdGlvbgorQk9PU1RfREVGVU4oW0Z1bmN0aW9uXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvZnVuY3Rpb24uaHBwXSldKQorCisKKyMgQk9PU1RfR0VPTUVUUlkoKQorIyAtLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0Lkdlb21ldHJ5IChuZXcgc2luY2UgMS40Ny4wKS4KK0JPT1NUX0RFRlVOKFtHZW9tZXRyeV0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L2dlb21ldHJ5LmhwcF0pCitdKSMgQk9PU1RfR0VPTUVUUlkKKworCisjIEJPT1NUX0dSQVBIKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5HcmFwaHMuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW0dyYXBoXSwKK1tib29zdF9ncmFwaF9zYXZlX0xJQlM9JExJQlMKK2Jvb3N0X2dyYXBoX3NhdmVfTERGTEFHUz0kTERGTEFHUworIyBMaW5rLXRpbWUgZGVwZW5kZW5jeSBmcm9tIGdyYXBoIHRvIHJlZ2V4IHdhcyBhZGRlZCBhcyBvZiAxLjQwLjAuCitpZiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxNDA7IHRoZW4KKyAgQk9PU1RfUkVHRVgoWyQxXSkKKyAgbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX1JFR0VYXyhMSUJTfExERkxBR1MpJF0pZG5sCisgIExJQlM9IiRMSUJTICRCT09TVF9SRUdFWF9MSUJTIgorICBMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfUkVHRVhfTERGTEFHUyIKK2ZpCitCT09TVF9GSU5EX0xJQihbZ3JhcGhdLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9ncmFwaC9hZGphY2VuY3lfbGlzdC5ocHBdLCBbYm9vc3Q6OmFkamFjZW5jeV9saXN0PD4gZztdKQorTElCUz0kYm9vc3RfZ3JhcGhfc2F2ZV9MSUJTCitMREZMQUdTPSRib29zdF9ncmFwaF9zYXZlX0xERkxBR1MKK10pIyBCT09TVF9HUkFQSAorCisKKyMgQk9PU1RfSU9TVFJFQU1TKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuSU9TdHJlYW1zLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsIHNlZSB0aGUKKyMgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4KK0JPT1NUX0RFRlVOKFtJT1N0cmVhbXNdLAorW0JPT1NUX0ZJTkRfTElCKFtpb3N0cmVhbXNdLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9pb3N0cmVhbXMvZGV2aWNlL2ZpbGVfZGVzY3JpcHRvci5ocHBdLAorICAgICAgICAgICAgICAgIFtib29zdDo6aW9zdHJlYW1zOjpmaWxlX2Rlc2NyaXB0b3IgZmQ7IGZkLmNsb3NlKCk7XSkKK10pIyBCT09TVF9JT1NUUkVBTVMKKworCisjIEJPT1NUX0hBU0goKQorIyAtLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuRnVuY3Rpb25hbC9IYXNoCitCT09TVF9ERUZVTihbSGFzaF0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L2Z1bmN0aW9uYWwvaGFzaC5ocHBdKV0pCisKKworIyBCT09TVF9MQU1CREEoKQorIyAtLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5MYW1iZGEKK0JPT1NUX0RFRlVOKFtMYW1iZGFdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9sYW1iZGEvbGFtYmRhLmhwcF0pXSkKKworCisjIEJPT1NUX0xPQ0FMRSgpCisjIC0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkxvY2FsZQorQk9PU1RfREVGVU4oW0xvY2FsZV0sCitbCitib29zdF9sb2NhbGVfc2F2ZV9MSUJTPSRMSUJTCitib29zdF9sb2NhbGVfc2F2ZV9MREZMQUdTPSRMREZMQUdTCisjIHJlcXVpcmUgU1lTVEVNIGZvciBib29zdC0xLjUwLjAgYW5kIHVwCitpZiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxNTA7IHRoZW4KKyAgQk9PU1RfU1lTVEVNKFskMV0pCisgIG00X3BhdHRlcm5fYWxsb3coW15CT09TVF9TWVNURU1fKExJQlN8TERGTEFHUykkXSlkbmwKKyAgTElCUz0iJExJQlMgJEJPT1NUX1NZU1RFTV9MSUJTIgorICBMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfU1lTVEVNX0xERkxBR1MiCitmaSAjIGVuZCBvZiB0aGUgQm9vc3QuU3lzdGVtIGNoZWNrLgorQk9PU1RfRklORF9MSUIoW2xvY2FsZV0sIFskMV0sCisgICAgW2Jvb3N0L2xvY2FsZS5ocHBdLAorICAgIFtbYm9vc3Q6OmxvY2FsZTo6Z2VuZXJhdG9yIGdlbjsgc3RkOjpsb2NhbGU6Omdsb2JhbChnZW4oIiIpKTtdXSkKK0xJQlM9JGJvb3N0X2xvY2FsZV9zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X2xvY2FsZV9zYXZlX0xERkxBR1MKK10pIyBCT09TVF9MT0NBTEUKKworIyBCT09TVF9MT0coW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5Mb2cuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW0xvZ10sCitbYm9vc3RfbG9nX3NhdmVfTElCUz0kTElCUworYm9vc3RfbG9nX3NhdmVfTERGTEFHUz0kTERGTEFHUworQk9PU1RfU1lTVEVNKFskMV0pCitCT09TVF9GSUxFU1lTVEVNKFskMV0pCitCT09TVF9EQVRFX1RJTUUoWyQxXSkKK200X3BhdHRlcm5fYWxsb3coW15CT09TVF8oU1lTVEVNfEZJTEVTWVNURU18REFURV9USU1FKV8oTElCU3xMREZMQUdTKSRdKWRubAorTElCUz0iJExJQlMgJEJPT1NUX0RBVEVfVElNRV9MSUJTICRCT09TVF9GSUxFU1lTVEVNX0xJQlMgJEJPT1NUX1NZU1RFTV9MSUJTIgorTERGTEFHUz0iJExERkxBR1MgJEJPT1NUX0RBVEVfVElNRV9MREZMQUdTICRCT09TVF9GSUxFU1lTVEVNX0xERkxBR1MgJEJPT1NUX1NZU1RFTV9MREZMQUdTIgorQk9PU1RfRklORF9MSUIoW2xvZ10sIFskMV0sCisgICAgW2Jvb3N0L2xvZy9jb3JlL2NvcmUuaHBwXSwKKyAgICBbYm9vc3Q6OmxvZzo6YXR0cmlidXRlIGE7IGEuZ2V0X3ZhbHVlKCk7XSkKK0xJQlM9JGJvb3N0X2xvZ19zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X2xvZ19zYXZlX0xERkxBR1MKK10pIyBCT09TVF9MT0cKKworCisjIEJPT1NUX0xPR19TRVRVUChbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkxvZy4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbTG9nX1NldHVwXSwKK1tib29zdF9sb2dfc2V0dXBfc2F2ZV9MSUJTPSRMSUJTCitib29zdF9sb2dfc2V0dXBfc2F2ZV9MREZMQUdTPSRMREZMQUdTCitCT09TVF9MT0coWyQxXSkKK200X3BhdHRlcm5fYWxsb3coW15CT09TVF9MT0dfKExJQlN8TERGTEFHUykkXSlkbmwKK0xJQlM9IiRMSUJTICRCT09TVF9MT0dfTElCUyIKK0xERkxBR1M9IiRMREZMQUdTICRCT09TVF9MT0dfTERGTEFHUyIKK0JPT1NUX0ZJTkRfTElCKFtsb2dfc2V0dXBdLCBbJDFdLAorICAgIFtib29zdC9sb2cvdXRpbGl0eS9zZXR1cC9mcm9tX3NldHRpbmdzLmhwcF0sCisgICAgW2Jvb3N0Ojpsb2c6OmJhc2ljX3NldHRpbmdzPGNoYXI+IGJzOyBicy5lbXB0eSgpO10pCitMSUJTPSRib29zdF9sb2dfc2V0dXBfc2F2ZV9MSUJTCitMREZMQUdTPSRib29zdF9sb2dfc2V0dXBfc2F2ZV9MREZMQUdTCitdKSMgQk9PU1RfTE9HX1NFVFVQCisKKworIyBCT09TVF9NQVRIKCkKKyMgLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0Lk1hdGgKKyMgVE9ETzogVGhpcyBsaWJyYXJ5IGlzbid0IGhlYWRlci1vbmx5IGJ1dCBpdCBjb21lcyBpbiBtdWx0aXBsZSBkaWZmZXJlbnQKKyMgZmxhdm9ycyB0aGF0IGRvbid0IHBsYXkgd2VsbCB3aXRoIEJPT1NUX0ZJTkRfTElCIChlLmcsIGxpYmJvb3N0X21hdGhfYzk5LAorIyBsaWJib29zdF9tYXRoX2M5OWYsIGxpYmJvb3N0X21hdGhfYzk5bCwgbGliYm9vc3RfbWF0aF90cjEsCisjIGxpYmJvb3N0X21hdGhfdHIxZiwgbGliYm9vc3RfbWF0aF90cjFsKS4gIFRoaXMgbWFjcm8gbXVzdCBiZSBmaXhlZCB0byBkbyB0aGUKKyMgcmlnaHQgdGhpbmcgYW55d2F5LgorQk9PU1RfREVGVU4oW01hdGhdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9tYXRoL3NwZWNpYWxfZnVuY3Rpb25zLmhwcF0pXSkKKworCisjIEJPT1NUX01QSShbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QgTVBJLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsIHNlZSB0aGUKKyMgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4gIFVzZXMgTVBJQ1hYIHZhcmlhYmxlIGlmIGl0IGlzCisjIHNldCwgb3RoZXJ3aXNlIHRyaWVzIENYWAorIworQk9PU1RfREVGVU4oW01QSV0sCitbYm9vc3Rfc2F2ZV9DWFg9JHtDWFh9Citib29zdF9zYXZlX0NYWENQUD0ke0NYWENQUH0KK2lmIHRlc3QgeCIke01QSUNYWH0iICE9IHg7IHRoZW4KKyAgQ1hYPSR7TVBJQ1hYfQorICBDWFhDUFA9IiR7TVBJQ1hYfSAtRSIKK2ZpCitCT09TVF9GSU5EX0xJQihbbXBpXSwgWyQxXSwKKyAgICAgICAgICAgICAgIFtib29zdC9tcGkuaHBwXSwKKyAgICAgICAgICAgICAgIFtpbnQgYXJnYyA9IDA7CisgICAgICAgICAgICAgICAgY2hhciAqKmFyZ3YgPSAwOworICAgICAgICAgICAgICAgIGJvb3N0OjptcGk6OmVudmlyb25tZW50IGVudihhcmdjLGFyZ3YpO10pCitDWFg9JHtib29zdF9zYXZlX0NYWH0KK0NYWENQUD0ke2Jvb3N0X3NhdmVfQ1hYQ1BQfQorXSkjIEJPT1NUX01QSQorCisKKyMgQk9PU1RfTVVMVElBUlJBWSgpCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5NdWx0aUFycmF5CitCT09TVF9ERUZVTihbTXVsdGlBcnJheV0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L211bHRpX2FycmF5LmhwcF0pXSkKKworCisjIEJPT1NUX05VTUVSSUNfVUJMQVMoKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5OdW1lcmljVWJsYXMgKEJhc2ljIExpbmVhciBBbGdlYnJhKQorQk9PU1RfREVGVU4oW051bWVyaWNfVWJsYXNdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9udW1lcmljL3VibGFzL3ZlY3Rvci5ocHBdKQorXSkjIEJPT1NUX05VTUVSSUNfVUJMQVMKKworCisjIEJPT1NUX05VTUVSSUNfQ09OVkVSU0lPTigpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0Lk51bWVyaWNDb252ZXJzaW9uIChwb2xpY3ktYmFzZWQgbnVtZXJpYyBjb252ZXJzaW9uKQorQk9PU1RfREVGVU4oW051bWVyaWNfQ29udmVyc2lvbl0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L251bWVyaWMvY29udmVyc2lvbi9jb252ZXJ0ZXIuaHBwXSkKK10pIyBCT09TVF9OVU1FUklDX0NPTlZFUlNJT04KKworCisjIEJPT1NUX09QVElPTkFMKCkKKyMgLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5PcHRpb25hbAorQk9PU1RfREVGVU4oW09wdGlvbmFsXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3Qvb3B0aW9uYWwuaHBwXSldKQorCisKKyMgQk9PU1RfUFJFUFJPQ0VTU09SKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuUHJlcHJvY2Vzc29yCitCT09TVF9ERUZVTihbUHJlcHJvY2Vzc29yXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvcHJlcHJvY2Vzc29yL3JlcGVhdC5ocHBdKV0pCisKKworIyBCT09TVF9SQU5HRSgpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlJhbmdlCitCT09TVF9ERUZVTihbUmFuZ2VdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9yYW5nZS9hZGFwdG9ycy5ocHBdKV0pCisKKyMgQk9PU1RfVU5PUkRFUkVEKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuVW5vcmRlcmVkCitCT09TVF9ERUZVTihbVW5vcmRlcmVkXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvdW5vcmRlcmVkX21hcC5ocHBdKV0pCisKKworIyBCT09TVF9VVUlEKCkKKyMgLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlV1aWQKK0JPT1NUX0RFRlVOKFtVdWlkXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvdXVpZC91dWlkLmhwcF0pXSkKKworCisjIEJPT1NUX1BST0dSQU1fT1BUSU9OUyhbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlByb2dyYW1fb3B0aW9ucy4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULAorIyBzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbUHJvZ3JhbV9PcHRpb25zXSwKK1tCT09TVF9GSU5EX0xJQihbcHJvZ3JhbV9vcHRpb25zXSwgWyQxXSwKKyAgICAgICAgICAgICAgICBbYm9vc3QvcHJvZ3JhbV9vcHRpb25zLmhwcF0sCisgICAgICAgICAgICAgICAgW2Jvb3N0Ojpwcm9ncmFtX29wdGlvbnM6Om9wdGlvbnNfZGVzY3JpcHRpb24gZCgidGVzdCIpO10pCitdKSMgQk9PU1RfUFJPR1JBTV9PUFRJT05TCisKKworCisjIF9CT09TVF9QWVRIT05fQ09ORklHKFZBUklBQkxFLCBGTEFHKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2F2ZSBWQVJJQUJMRSwgYW5kIGRlZmluZSBpdCB2aWEgYHB5dGhvbi1jb25maWcgLS1GTEFHYC4KKyMgU3Vic3RpdHV0ZSBCT09TVF9QWVRIT05fVkFSSUFCTEUuCittNF9kZWZpbmUoW19CT09TVF9QWVRIT05fQ09ORklHXSwKK1tBQ19TVUJTVChbQk9PU1RfUFlUSE9OXyQxXSwKKyAgICAgICAgICBbYHB5dGhvbi1jb25maWcgLS0kMiAyPi9kZXYvbnVsbGBdKWRubAorYm9vc3RfcHl0aG9uX3NhdmVfJDE9JCQxCiskMT0iJCQxICRCT09TVF9QWVRIT05fJDEiXSkKKworCisjIEJPT1NUX1BZVEhPTihbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlB5dGhvbi4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULAorIyBzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbUHl0aG9uXSwKK1tfQk9PU1RfUFlUSE9OX0NPTkZJRyhbQ1BQRkxBR1NdLCBbaW5jbHVkZXNdKQorX0JPT1NUX1BZVEhPTl9DT05GSUcoW0xERkxBR1NdLCAgIFtsZGZsYWdzXSkKK19CT09TVF9QWVRIT05fQ09ORklHKFtMSUJTXSwgICAgICBbbGlic10pCittNF9wYXR0ZXJuX2FsbG93KFteQk9PU1RfUFlUSE9OX01PRFVMRSRdKWRubAorQk9PU1RfRklORF9MSUJTKFtweXRob25dLCBbcHl0aG9uIHB5dGhvbjNdLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9weXRob24uaHBwXSwKKyAgICAgICAgICAgICAgICBbXSwgW0JPT1NUX1BZVEhPTl9NT0RVTEUoZW1wdHkpIHt9XSkKK0NQUEZMQUdTPSRib29zdF9weXRob25fc2F2ZV9DUFBGTEFHUworTERGTEFHUz0kYm9vc3RfcHl0aG9uX3NhdmVfTERGTEFHUworTElCUz0kYm9vc3RfcHl0aG9uX3NhdmVfTElCUworXSkjIEJPT1NUX1BZVEhPTgorCisKKyMgQk9PU1RfUkVGKCkKKyMgLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuUmVmCitCT09TVF9ERUZVTihbUmVmXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvcmVmLmhwcF0pXSkKKworCisjIEJPT1NUX1JFR0VYKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5SZWdleC4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbUmVnZXhdLAorW0JPT1NUX0ZJTkRfTElCKFtyZWdleF0sIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L3JlZ2V4LmhwcF0sCisgICAgICAgICAgICAgICAgW2Jvb3N0OjpyZWdleCBleHAoIioiKTsgYm9vc3Q6OnJlZ2V4X21hdGNoKCJmb28iLCBleHApO10pCitdKSMgQk9PU1RfUkVHRVgKKworCisjIEJPT1NUX1NFUklBTElaQVRJT04oW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuU2VyaWFsaXphdGlvbi4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUKKyMgdGhlIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbU2VyaWFsaXphdGlvbl0sCitbQk9PU1RfRklORF9MSUIoW3NlcmlhbGl6YXRpb25dLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9hcmNoaXZlL3RleHRfb2FyY2hpdmUuaHBwXSwKKyAgICAgICAgICAgICAgICBbc3RkOjpvc3RyZWFtKiBvID0gMDsgLy8gQ2hlYXAgd2F5IHRvIGdldCBhbiBvc3RyZWFtLi4uCisgICAgICAgICAgICAgICAgYm9vc3Q6OmFyY2hpdmU6OnRleHRfb2FyY2hpdmUgdCgqbyk7XSkKK10pIyBCT09TVF9TRVJJQUxJWkFUSU9OCisKKworIyBCT09TVF9TSUdOQUxTKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlNpZ25hbHMuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW1NpZ25hbHNdLAorW0JPT1NUX0ZJTkRfTElCKFtzaWduYWxzXSwgWyQxXSwKKyAgICAgICAgICAgICAgICBbYm9vc3Qvc2lnbmFsLmhwcF0sCisgICAgICAgICAgICAgICAgW2Jvb3N0OjpzaWduYWw8dm9pZCAoKT4gcztdKQorXSkjIEJPT1NUX1NJR05BTFMKKworCisjIEJPT1NUX1NJR05BTFMyKCkKKyMgLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5TaWduYWxzMiAobmV3IHNpbmNlIDEuMzkuMCkuCitCT09TVF9ERUZVTihbU2lnbmFsczJdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9zaWduYWxzMi5ocHBdKQorXSkjIEJPT1NUX1NJR05BTFMyCisKKworIyBCT09TVF9TTUFSVF9QVFIoKQorIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5TbWFydFB0cgorQk9PU1RfREVGVU4oW1NtYXJ0X1B0cl0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3Njb3BlZF9wdHIuaHBwXSkKK0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9zaGFyZWRfcHRyLmhwcF0pCitdKQorCisKKyMgQk9PU1RfU1RBVElDQVNTRVJUKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuU3RhdGljQXNzZXJ0CitCT09TVF9ERUZVTihbU3RhdGljQXNzZXJ0XSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3Qvc3RhdGljX2Fzc2VydC5ocHBdKV0pCisKKworIyBCT09TVF9TVFJJTkdfQUxHTygpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuU3RyaW5nQWxnbworQk9PU1RfREVGVU4oW1N0cmluZ19BbGdvXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvYWxnb3JpdGhtL3N0cmluZy5ocHBdKQorXSkKKworCisjIEJPT1NUX1NZU1RFTShbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlN5c3RlbS4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuICBUaGlzIGxpYnJhcnkgd2FzIGludHJvZHVjZWQgaW4gQm9vc3QKKyMgMS4zNS4wLgorQk9PU1RfREVGVU4oW1N5c3RlbV0sCitbQk9PU1RfRklORF9MSUIoW3N5c3RlbV0sIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L3N5c3RlbS9lcnJvcl9jb2RlLmhwcF0sCisgICAgICAgICAgICAgICAgW2Jvb3N0OjpzeXN0ZW06OmVycm9yX2NvZGUgZTsgZS5jbGVhcigpO10pCitdKSMgQk9PU1RfU1lTVEVNCisKKworIyBCT09TVF9URVNUKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlRlc3QuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW1Rlc3RdLAorW200X3BhdHRlcm5fYWxsb3coW15CT09TVF9DSEVDSyRdKWRubAorQk9PU1RfRklORF9MSUIoW3VuaXRfdGVzdF9mcmFtZXdvcmtdLCBbJDFdLAorICAgICAgICAgICAgICAgW2Jvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcF0sIFtCT09TVF9DSEVDSygyID09IDIpO10sCisgICAgICAgICAgICAgICBbdXNpbmcgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZTsKKyAgICAgICAgICAgICAgIHRlc3Rfc3VpdGUqIGluaXRfdW5pdF90ZXN0X3N1aXRlKGludCBhcmdjLCBjaGFyICoqIGFyZ3YpCisgICAgICAgICAgICAgICB7IHJldHVybiBOVUxMOyB9XSkKK10pIyBCT09TVF9URVNUCisKKworIyBCT09TVF9USFJFQUQoW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuVGhyZWFkLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsIHNlZSB0aGUKKyMgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4KK0JPT1NUX0RFRlVOKFtUaHJlYWRdLAorW2RubCBIYXZpbmcgdGhlIHB0aHJlYWQgZmxhZyBpcyByZXF1aXJlZCBhdCBsZWFzdCBvbiBHQ0MzIHdoZXJlCitkbmwgYm9vc3QvdGhyZWFkLmhwcCB3b3VsZCBjb21wbGFpbiBpZiB3ZSB0cnkgdG8gY29tcGlsZSB3aXRob3V0CitkbmwgLXB0aHJlYWQgb24gR05VL0xpbnV4LgorQUNfUkVRVUlSRShbX0JPT1NUX1BUSFJFQURfRkxBR10pZG5sCitib29zdF90aHJlYWRfc2F2ZV9MSUJTPSRMSUJTCitib29zdF90aHJlYWRfc2F2ZV9MREZMQUdTPSRMREZMQUdTCitib29zdF90aHJlYWRfc2F2ZV9DUFBGTEFHUz0kQ1BQRkxBR1MKKyMgTGluay10aW1lIGRlcGVuZGVuY3kgZnJvbSB0aHJlYWQgdG8gc3lzdGVtIHdhcyBhZGRlZCBhcyBvZiAxLjQ5LjAuCitpZiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxNDk7IHRoZW4KK0JPT1NUX1NZU1RFTShbJDFdKQorZmkgIyBlbmQgb2YgdGhlIEJvb3N0LlN5c3RlbSBjaGVjay4KK200X3BhdHRlcm5fYWxsb3coW15CT09TVF9TWVNURU1fKExJQlN8TERGTEFHUykkXSlkbmwKK0xJQlM9IiRMSUJTICRCT09TVF9TWVNURU1fTElCUyAkYm9vc3RfY3ZfcHRocmVhZF9mbGFnIgorTERGTEFHUz0iJExERkxBR1MgJEJPT1NUX1NZU1RFTV9MREZMQUdTIgorQ1BQRkxBR1M9IiRDUFBGTEFHUyAkYm9vc3RfY3ZfcHRocmVhZF9mbGFnIgorCisjIFdoZW4gY29tcGlsaW5nIGZvciB0aGUgV2luZG93cyBwbGF0Zm9ybSwgdGhlIHRocmVhZHMgbGlicmFyeSBpcyBuYW1lZAorIyBkaWZmZXJlbnRseS4gIFRoaXMgc3VmZml4IGRvZXNuJ3QgZXhpc3QgaW4gbmV3IHZlcnNpb25zIG9mIEJvb3N0LCBvcgorIyBwb3NzaWJseSBuZXcgdmVyc2lvbnMgb2YgR0NDIG9uIG1pbmd3IEkgYW0gYXNzdW1pbmcgaXQncyBCb29zdCdzIGNoYW5nZSBmb3IKKyMgbm93IGFuZCBJIGFtIHNldHRpbmcgdmVyc2lvbiB0byAxLjQ4LCBmb3IgbGFjayBvZiBrbm93bGVkZ2UgYXMgdG8gd2hlbiB0aGlzCisjIGNoYW5nZSBvY2N1cnJlZC4KK2lmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWx0IDE0ODsgdGhlbgorICBjYXNlICRob3N0X29zIGluCisgICAgKCptaW5ndyopIGJvb3N0X3RocmVhZF9saWJfZXh0PV93aW4zMjs7CisgIGVzYWMKK2ZpCitCT09TVF9GSU5EX0xJQlMoW3RocmVhZF0sIFt0aHJlYWQkYm9vc3RfdGhyZWFkX2xpYl9leHRdLAorICAgICAgICAgICAgICAgIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L3RocmVhZC5ocHBdLCBbYm9vc3Q6OnRocmVhZCB0OyBib29zdDo6bXV0ZXggbTtdKQorCitjYXNlICRob3N0X29zIGluCisgICgqbWluZ3cqKSBib29zdF90aHJlYWRfdzMyX3NvY2tldF9saW5rPS1sd3MyXzMyOzsKK2VzYWMKKworQk9PU1RfVEhSRUFEX0xJQlM9IiRCT09TVF9USFJFQURfTElCUyAkQk9PU1RfU1lTVEVNX0xJQlMgJGJvb3N0X2N2X3B0aHJlYWRfZmxhZyAkYm9vc3RfdGhyZWFkX3czMl9zb2NrZXRfbGluayIKK0JPT1NUX1RIUkVBRF9MREZMQUdTPSIkQk9PU1RfU1lTVEVNX0xERkxBR1MiCitCT09TVF9DUFBGTEFHUz0iJEJPT1NUX0NQUEZMQUdTICRib29zdF9jdl9wdGhyZWFkX2ZsYWciCitMSUJTPSRib29zdF90aHJlYWRfc2F2ZV9MSUJTCitMREZMQUdTPSRib29zdF90aHJlYWRfc2F2ZV9MREZMQUdTCitDUFBGTEFHUz0kYm9vc3RfdGhyZWFkX3NhdmVfQ1BQRkxBR1MKK10pIyBCT09TVF9USFJFQUQKKworQVVfQUxJQVMoW0JPT1NUX1RIUkVBRFNdLCBbQk9PU1RfVEhSRUFEXSkKKworCisjIEJPT1NUX1RPS0VOSVpFUigpCisjIC0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlRva2VuaXplcgorQk9PU1RfREVGVU4oW1Rva2VuaXplcl0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3Rva2VuaXplci5ocHBdKV0pCisKKworIyBCT09TVF9UUklCT09MKCkKKyMgLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlRyaWJvb2wKK0JPT1NUX0RFRlVOKFtUcmlib29sXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvbG9naWMvdHJpYm9vbF9md2QuaHBwXSkKK0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9sb2dpYy90cmlib29sLmhwcF0pCitdKQorCisKKyMgQk9PU1RfVFVQTEUoKQorIyAtLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlR1cGxlCitCT09TVF9ERUZVTihbVHVwbGVdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC90dXBsZS90dXBsZS5ocHBdKV0pCisKKworIyBCT09TVF9UWVBFVFJBSVRTKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuVHlwZVRyYWl0cworQk9PU1RfREVGVU4oW1R5cGVUcmFpdHNdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC90eXBlX3RyYWl0cy5ocHBdKV0pCisKKworIyBCT09TVF9VVElMSVRZKCkKKyMgLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlV0aWxpdHkgKG5vbmNvcHlhYmxlLCByZXN1bHRfb2YsIGJhc2UtZnJvbS1tZW1iZXIgaWRpb20sCisjIGV0Yy4pCitCT09TVF9ERUZVTihbVXRpbGl0eV0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3V0aWxpdHkuaHBwXSldKQorCisKKyMgQk9PU1RfVkFSSUFOVCgpCisjIC0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5WYXJpYW50LgorQk9PU1RfREVGVU4oW1ZhcmlhbnRdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC92YXJpYW50L3ZhcmlhbnRfZndkLmhwcF0pCitCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvdmFyaWFudC5ocHBdKV0pCisKKworIyBCT09TVF9QT0lOVEVSX0NPTlRBSU5FUigpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5Qb2ludGVyQ29udGFpbmVyCitCT09TVF9ERUZVTihbUG9pbnRlcl9Db250YWluZXJdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9wdHJfY29udGFpbmVyL3B0cl9kZXF1ZS5ocHBdKQorQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3B0cl9jb250YWluZXIvcHRyX2xpc3QuaHBwXSkKK0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9wdHJfY29udGFpbmVyL3B0cl92ZWN0b3IuaHBwXSkKK0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9wdHJfY29udGFpbmVyL3B0cl9hcnJheS5ocHBdKQorQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3B0cl9jb250YWluZXIvcHRyX3NldC5ocHBdKQorQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3B0cl9jb250YWluZXIvcHRyX21hcC5ocHBdKQorXSkjIEJPT1NUX1BPSU5URVJfQ09OVEFJTkVSCisKKworIyBCT09TVF9XQVZFKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE5PVEU6IElmIHlvdSBpbnRlbmQgdG8gdXNlIFdhdmUvU3Bpcml0IHdpdGggdGhyZWFkIHN1cHBvcnQsIG1ha2Ugc3VyZSB5b3UKKyMgY2FsbCBCT09TVF9USFJFQUQgZmlyc3QuCisjIExvb2sgZm9yIEJvb3N0LldhdmUuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW1dhdmVdLAorW0FDX1JFUVVJUkUoW0JPT1NUX0ZJTEVTWVNURU1dKWRubAorQUNfUkVRVUlSRShbQk9PU1RfREFURV9USU1FXSlkbmwKK2Jvb3N0X3dhdmVfc2F2ZV9MSUJTPSRMSUJTCitib29zdF93YXZlX3NhdmVfTERGTEFHUz0kTERGTEFHUworbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUXygoRklMRSk/U1lTVEVNfERBVEVfVElNRXxUSFJFQUQpXyhMSUJTfExERkxBR1MpJF0pZG5sCitMSUJTPSIkTElCUyAkQk9PU1RfU1lTVEVNX0xJQlMgJEJPT1NUX0ZJTEVTWVNURU1fTElCUyAkQk9PU1RfREFURV9USU1FX0xJQlMgXAorJEJPT1NUX1RIUkVBRF9MSUJTIgorTERGTEFHUz0iJExERkxBR1MgJEJPT1NUX1NZU1RFTV9MREZMQUdTICRCT09TVF9GSUxFU1lTVEVNX0xERkxBR1MgXAorJEJPT1NUX0RBVEVfVElNRV9MREZMQUdTICRCT09TVF9USFJFQURfTERGTEFHUyIKK0JPT1NUX0ZJTkRfTElCKFt3YXZlXSwgWyQxXSwKKyAgICAgICAgICAgICAgICBbYm9vc3Qvd2F2ZS5ocHBdLAorICAgICAgICAgICAgICAgIFtib29zdDo6d2F2ZTo6dG9rZW5faWQgaWQ7IGdldF90b2tlbl9uYW1lKGlkKTtdKQorTElCUz0kYm9vc3Rfd2F2ZV9zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X3dhdmVfc2F2ZV9MREZMQUdTCitdKSMgQk9PU1RfV0FWRQorCisKKyMgQk9PU1RfWFBSRVNTSVZFKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuWHByZXNzaXZlIChuZXcgc2luY2UgMS4zNi4wKS4KK0JPT1NUX0RFRlVOKFtYcHJlc3NpdmVdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC94cHJlc3NpdmUveHByZXNzaXZlLmhwcF0pXSkKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tICMKKyMgSW50ZXJuYWwgaGVscGVycy4gIworIyAtLS0tLS0tLS0tLS0tLS0tLSAjCisKKworIyBfQk9PU1RfUFRIUkVBRF9GTEFHKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEludGVybmFsIGhlbHBlciBmb3IgQk9PU1RfVEhSRUFELiAgQ29tcHV0ZXMgYm9vc3RfY3ZfcHRocmVhZF9mbGFnCisjIHdoaWNoIG11c3QgYmUgdXNlZCBpbiBDUFBGTEFHUyBhbmQgTElCUy4KKyMKKyMgWWVzLCB3ZSAqbmVlZCogdG8gcHV0IHRoZSAtcHRocmVhZCB0aGluZyBpbiBDUFBGTEFHUyBiZWNhdXNlIHdpdGggR0NDMywKKyMgYm9vc3QvdGhyZWFkLmhwcCB3aWxsIHRyaWdnZXIgYSAjZXJyb3IgaWYgLXB0aHJlYWQgaXNuJ3QgdXNlZDoKKyMgICBib29zdC9jb25maWcvcmVxdWlyZXNfdGhyZWFkcy5ocHA6NDc6NTogI2Vycm9yICJDb21waWxlciB0aHJlYWRpbmcgc3VwcG9ydAorIyAgIGlzIG5vdCB0dXJuZWQgb24uIFBsZWFzZSBzZXQgdGhlIGNvcnJlY3QgY29tbWFuZCBsaW5lIG9wdGlvbnMgZm9yCisjICAgdGhyZWFkaW5nOiAtcHRocmVhZCAoTGludXgpLCAtcHRocmVhZHMgKFNvbGFyaXMpIG9yIC1tdGhyZWFkcyAoTWluZ3czMikiCisjCisjIEJhc2VkIG9uIEFDWF9QVEhSRUFEOiBodHRwOi8vYXV0b2NvbmYtYXJjaGl2ZS5jcnlwLnRvL2FjeF9wdGhyZWFkLmh0bWwKK0FDX0RFRlVOKFtfQk9PU1RfUFRIUkVBRF9GTEFHXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0NYWF0pZG5sCitBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCitBQ19MQU5HX1BVU0goW0MrK10pZG5sCitBQ19DQUNIRV9DSEVDSyhbZm9yIHRoZSBmbGFncyBuZWVkZWQgdG8gdXNlIHB0aHJlYWRzXSwgW2Jvb3N0X2N2X3B0aHJlYWRfZmxhZ10sCitbIGJvb3N0X2N2X3B0aHJlYWRfZmxhZz0KKyAgIyBUaGUgb3JkZXJpbmcgKmlzKiAoc29tZXRpbWVzKSBpbXBvcnRhbnQuICBTb21lIG5vdGVzIG9uIHRoZQorICAjIGluZGl2aWR1YWwgaXRlbXMgZm9sbG93OgorICAjIChub25lKTogaW4gY2FzZSB0aHJlYWRzIGFyZSBpbiBsaWJjOyBzaG91bGQgYmUgdHJpZWQgYmVmb3JlIC1LdGhyZWFkIGFuZAorICAjICAgICAgIG90aGVyIGNvbXBpbGVyIGZsYWdzIHRvIHByZXZlbnQgY29udGludWFsIGNvbXBpbGVyIHdhcm5pbmdzCisgICMgLWxwdGhyZWFkczogQUlYIChtdXN0IGNoZWNrIHRoaXMgYmVmb3JlIC1scHRocmVhZCkKKyAgIyAtS3RocmVhZDogU2VxdWVudCAodGhyZWFkcyBpbiBsaWJjLCBidXQgLUt0aHJlYWQgbmVlZGVkIGZvciBwdGhyZWFkLmgpCisgICMgLWt0aHJlYWQ6IEZyZWVCU0Qga2VybmVsIHRocmVhZHMgKHByZWZlcnJlZCB0byAtcHRocmVhZCBzaW5jZSBTTVAtYWJsZSkKKyAgIyAtbGx0aHJlYWQ6IExpbnV4VGhyZWFkcyBwb3J0IG9uIEZyZWVCU0QgKGFsc28gcHJlZmVycmVkIHRvIC1wdGhyZWFkKQorICAjIC1wdGhyZWFkOiBHTlUgTGludXgvR0NDIChrZXJuZWwgdGhyZWFkcyksIEJTRC9HQ0MgKHVzZXJsYW5kIHRocmVhZHMpCisgICMgLXB0aHJlYWRzOiBTb2xhcmlzL0dDQworICAjIC1tdGhyZWFkczogTWluR1czMi9HQ0MsIEx5bngvR0NDCisgICMgLW10OiBTdW4gV29ya3Nob3AgQyAobWF5IG9ubHkgbGluayBTdW5PUyB0aHJlYWRzIFstbHRocmVhZF0sIGJ1dCBpdAorICAjICAgICAgZG9lc24ndCBodXJ0IHRvIGNoZWNrIHNpbmNlIHRoaXMgc29tZXRpbWVzIGRlZmluZXMgcHRocmVhZHMgdG9vOworICAjICAgICAgYWxzbyBkZWZpbmVzIC1EX1JFRU5UUkFOVCkKKyAgIyAgICAgIC4uLiAtbXQgaXMgYWxzbyB0aGUgcHRocmVhZHMgZmxhZyBmb3IgSFAvYUNDCisgICMgLWxwdGhyZWFkOiBHTlUgTGludXgsIGV0Yy4KKyAgIyAtLXRocmVhZC1zYWZlOiBLQUkgQysrCisgIGNhc2UgJGhvc3Rfb3MgaW4gIygKKyAgICAqc29sYXJpcyopCisgICAgICAjIE9uIFNvbGFyaXMgKGF0IGxlYXN0LCBmb3Igc29tZSB2ZXJzaW9ucyksIGxpYmMgY29udGFpbnMgc3R1YmJlZAorICAgICAgIyAobm9uLWZ1bmN0aW9uYWwpIHZlcnNpb25zIG9mIHRoZSBwdGhyZWFkcyByb3V0aW5lcywgc28gbGluay1iYXNlZAorICAgICAgIyB0ZXN0cyB3aWxsIGVycm9uZW91c2x5IHN1Y2NlZWQuICAoV2UgbmVlZCB0byBsaW5rIHdpdGggLXB0aHJlYWRzLy1tdC8KKyAgICAgICMgLWxwdGhyZWFkLikgIChUaGUgc3R1YnMgYXJlIG1pc3NpbmcgcHRocmVhZF9jbGVhbnVwX3B1c2gsIG9yIHJhdGhlcgorICAgICAgIyBhIGZ1bmN0aW9uIGNhbGxlZCBieSB0aGlzIG1hY3JvLCBzbyB3ZSBjb3VsZCBjaGVjayBmb3IgdGhhdCwgYnV0CisgICAgICAjIHdobyBrbm93cyB3aGV0aGVyIHRoZXknbGwgc3R1YiB0aGF0IHRvbyBpbiBhIGZ1dHVyZSBsaWJjLikgIFNvLAorICAgICAgIyB3ZSdsbCBqdXN0IGxvb2sgZm9yIC1wdGhyZWFkcyBhbmQgLWxwdGhyZWFkIGZpcnN0OgorICAgICAgYm9vc3RfcHRocmVhZF9mbGFncz0iLXB0aHJlYWRzIC1scHRocmVhZCAtbXQgLXB0aHJlYWQiOzsgIygKKyAgICAqKQorICAgICAgYm9vc3RfcHRocmVhZF9mbGFncz0iLWxwdGhyZWFkcyAtS3RocmVhZCAta3RocmVhZCAtbGx0aHJlYWQgLXB0aHJlYWQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLXB0aHJlYWRzIC1tdGhyZWFkcyAtbHB0aHJlYWQgLS10aHJlYWQtc2FmZSAtbXQiOzsKKyAgZXNhYworICAjIEdlbmVyYXRlIHRoZSB0ZXN0IGZpbGUuCisgIEFDX0xBTkdfQ09ORlRFU1QoW0FDX0xBTkdfUFJPR1JBTShbI2luY2x1ZGUgPHB0aHJlYWQuaD5dLAorICAgIFtwdGhyZWFkX3QgdGg7IHB0aHJlYWRfam9pbih0aCwgMCk7CisgICAgcHRocmVhZF9hdHRyX2luaXQoMCk7IHB0aHJlYWRfY2xlYW51cF9wdXNoKDAsIDApOworICAgIHB0aHJlYWRfY3JlYXRlKDAsMCwwLDApOyBwdGhyZWFkX2NsZWFudXBfcG9wKDApO10pXSkKKyAgZm9yIGJvb3N0X3B0aHJlYWRfZmxhZyBpbiAnJyAkYm9vc3RfcHRocmVhZF9mbGFnczsgZG8KKyAgICBib29zdF9wdGhyZWFkX29rPWZhbHNlCitkbmwgUmUtdXNlIHRoZSB0ZXN0IGZpbGUgYWxyZWFkeSBnZW5lcmF0ZWQuCisgICAgYm9vc3RfcHRocmVhZHNfX3NhdmVfTElCUz0kTElCUworICAgIExJQlM9IiRMSUJTICRib29zdF9wdGhyZWFkX2ZsYWciCisgICAgQUNfTElOS19JRkVMU0UoW10sCisgICAgICBbaWYgZ3JlcCAiLiokYm9vc3RfcHRocmVhZF9mbGFnIiBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICAgICAgIGVjaG8gIlRoaXMgZmxhZyBzZWVtcyB0byBoYXZlIHRyaWdnZXJlZCB3YXJuaW5ncyIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgIGVsc2UKKyAgICAgICAgIGJvb3N0X3B0aHJlYWRfb2s9OjsgYm9vc3RfY3ZfcHRocmVhZF9mbGFnPSRib29zdF9wdGhyZWFkX2ZsYWcKKyAgICAgICBmaV0pCisgICAgTElCUz0kYm9vc3RfcHRocmVhZHNfX3NhdmVfTElCUworICAgICRib29zdF9wdGhyZWFkX29rICYmIGJyZWFrCisgIGRvbmUKK10pCitBQ19MQU5HX1BPUChbQysrXSlkbmwKK10pIyBfQk9PU1RfUFRIUkVBRF9GTEFHCisKKworIyBfQk9PU1RfZ2NjX3Rlc3QoTUFKT1IsIE1JTk9SKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBJbnRlcm5hbCBoZWxwZXIgZm9yIF9CT09TVF9GSU5EX0NPTVBJTEVSX1RBRy4KK200X2RlZmluZShbX0JPT1NUX2djY190ZXN0XSwKK1siZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA9PSAkMSAmJiBfX0dOVUNfTUlOT1JfXyA9PSAkMiAmJiAhZGVmaW5lZCBfX0lDQyBAIGdjYyQxJDIiXSlkbmwKKworIyBfQk9PU1RfbWluZ3dfdGVzdChNQUpPUiwgTUlOT1IpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEludGVybmFsIGhlbHBlciBmb3IgX0JPT1NUX0ZJTkRfQ09NUElMRVJfVEFHLgorbTRfZGVmaW5lKFtfQk9PU1RfbWluZ3dfdGVzdF0sCitbImRlZmluZWQgX19HTlVDX18gJiYgX19HTlVDX18gPT0gJDEgJiYgX19HTlVDX01JTk9SX18gPT0gJDIgJiYgIWRlZmluZWQgX19JQ0MgJiYgXAorICAoZGVmaW5lZCBXSU4zMiB8fCBkZWZpbmVkIFdJTk5UIHx8IGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMiBcCisgICAgICAgICB8fCBkZWZpbmVkIF9fV0lOMzJfXyB8fCBkZWZpbmVkIF9fV0lOTlQgfHwgZGVmaW5lZCBfX1dJTk5UX18pIEAgbWd3JDEkMiJdKWRubAorCisKKyMgX0JPT1NUX0ZJTkRfQ09NUElMRVJfVEFHKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSW50ZXJuYWwuICBXaGVuIEJvb3N0IGlzIGluc3RhbGxlZCB3aXRob3V0IC0tbGF5b3V0PXN5c3RlbSwgZWFjaCBsaWJyYXJ5CisjIGZpbGVuYW1lIHdpbGwgaG9sZCBhIHN1ZmZpeCB0aGF0IGVuY29kZXMgdGhlIGNvbXBpbGVyIHVzZWQgZHVyaW5nIHRoZQorIyBidWlsZC4gIFRoZSBCb29zdCBidWlsZCBzeXN0ZW0gc2VlbXMgdG8gY2FsbCB0aGlzIGEgYHRhZycuCitBQ19ERUZVTihbX0JPT1NUX0ZJTkRfQ09NUElMRVJfVEFHXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0NYWF0pZG5sCitBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCitBQ19DQUNIRV9DSEVDSyhbZm9yIHRoZSB0b29sc2V0IG5hbWUgdXNlZCBieSBCb29zdCBmb3IgJENYWF0sCisgICAgICAgICAgICAgICBbYm9vc3RfY3ZfbGliX3RhZ10sCitbYm9vc3RfY3ZfbGliX3RhZz11bmtub3duCitpZiB0ZXN0IHgkYm9vc3RfY3ZfaW5jX3BhdGggIT0geG5vOyB0aGVuCisgIEFDX0xBTkdfUFVTSChbQysrXSlkbmwKKyAgIyBUaGUgZm9sbG93aW5nIHRlc3RzIGFyZSBtb3N0bHkgaW5zcGlyZWQgYnkgYm9vc3QvY29uZmlnL2F1dG9fbGluay5ocHAKKyAgIyBUaGUgbGlzdCBpcyBzb3J0ZWQgdG8gbW9zdCByZWNlbnQvY29tbW9uIHRvIG9sZGVzdCBjb21waWxlciAoaW4gb3JkZXIKKyAgIyB0byBpbmNyZWFzZSB0aGUgbGlrZWxpaG9vZCBvZiBmaW5kaW5nIHRoZSByaWdodCBjb21waWxlciB3aXRoIHRoZQorICAjIGxlYXN0IG51bWJlciBvZiBjb21waWxhdGlvbiBhdHRlbXB0KS4KKyAgIyBCZXdhcmUgdGhhdCBzb21lIHRlc3RzIGFyZSBzZW5zaWJsZSB0byB0aGUgb3JkZXIgKGZvciBpbnN0YW5jZSwgd2UgbXVzdAorICAjIGxvb2sgZm9yIE1pbkdXIGJlZm9yZSBsb29raW5nIGZvciBHQ0MzKS4KKyAgIyBJIHVzZWQgb25lIGNvbXBpbGF0aW9uIHRlc3QgcGVyIGNvbXBpbGVyIHdpdGggYSAjZXJyb3IgdG8gcmVjb2duaXplCisgICMgZWFjaCBjb21waWxlciBzbyB0aGF0IGl0IHdvcmtzIGV2ZW4gd2hlbiBjcm9zcy1jb21waWxpbmcgKGxldCBtZSBrbm93CisgICMgaWYgeW91IGtub3cgYSBiZXR0ZXIgYXBwcm9hY2gpLgorICAjIEtub3duIG1pc3NpbmcgdGFncyAoa25vd24gZnJvbSBCb29zdCdzIHRvb2xzL2J1aWxkL3YyL3Rvb2xzL2NvbW1vbi5qYW0pOgorICAjICAgY29tbywgZWRnLCBrY2MsIGJjaywgbXAsIHN3LCB0cnUsIHhsYworICAjIEknbSBub3Qgc3VyZSBhYm91dCBteSB0ZXN0IGZvciBgaWwnIChiZSBjYXJlZnVsOiBJbnRlbCdzIElDQyBwcmUtZGVmaW5lcworICAjIHRoZSBzYW1lIGRlZmluZXMgYXMgR0NDJ3MpLgorICBmb3IgaSBpbiBcCisgICAgX0JPT1NUX21pbmd3X3Rlc3QoNSwgMykgXAorICAgIF9CT09TVF9nY2NfdGVzdCg1LCAzKSBcCisgICAgX0JPT1NUX21pbmd3X3Rlc3QoNSwgMikgXAorICAgIF9CT09TVF9nY2NfdGVzdCg1LCAyKSBcCisgICAgX0JPT1NUX21pbmd3X3Rlc3QoNSwgMSkgXAorICAgIF9CT09TVF9nY2NfdGVzdCg1LCAxKSBcCisgICAgX0JPT1NUX21pbmd3X3Rlc3QoNSwgMCkgXAorICAgIF9CT09TVF9nY2NfdGVzdCg1LCAwKSBcCisgICAgX0JPT1NUX21pbmd3X3Rlc3QoNCwgMTApIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoNCwgMTApIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCA5KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDkpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCA4KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDgpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCA3KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDcpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCA2KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDYpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCA1KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDUpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCA0KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDQpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCAzKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDMpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCAyKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDIpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCAxKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDEpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCAwKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDApIFwKKyAgICAiZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA9PSAzICYmICFkZWZpbmVkIF9fSUNDIFwKKyAgICAgJiYgKGRlZmluZWQgV0lOMzIgfHwgZGVmaW5lZCBXSU5OVCB8fCBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzIgXAorICAgICAgICAgfHwgZGVmaW5lZCBfX1dJTjMyX18gfHwgZGVmaW5lZCBfX1dJTk5UIHx8IGRlZmluZWQgX19XSU5OVF9fKSBAIG1ndyIgXAorICAgIF9CT09TVF9nY2NfdGVzdCgzLCA0KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDMsIDMpIFwKKyAgICAiZGVmaW5lZCBfTVNDX1ZFUiAmJiBfTVNDX1ZFUiA+PSAxNTAwIEAgdmM5MCIgXAorICAgICJkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSID09IDE0MDAgQCB2YzgwIiBcCisgICAgX0JPT1NUX2djY190ZXN0KDMsIDIpIFwKKyAgICAiZGVmaW5lZCBfTVNDX1ZFUiAmJiBfTVNDX1ZFUiA9PSAxMzEwIEAgdmM3MSIgXAorICAgIF9CT09TVF9nY2NfdGVzdCgzLCAxKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDMsIDApIFwKKyAgICAiZGVmaW5lZCBfX0JPUkxBTkRDX18gQCBiY2IiIFwKKyAgICAiZGVmaW5lZCBfX0lDQyAmJiAoZGVmaW5lZCBfX3VuaXggfHwgZGVmaW5lZCBfX3VuaXhfXykgQCBpbCIgXAorICAgICJkZWZpbmVkIF9fSUNMIEAgaXciIFwKKyAgICAiZGVmaW5lZCBfTVNDX1ZFUiAmJiBfTVNDX1ZFUiA9PSAxMzAwIEAgdmM3IiBcCisgICAgX0JPT1NUX2djY190ZXN0KDIsIDk1KSBcCisgICAgImRlZmluZWQgX19NV0VSS1NfXyAmJiBfX01XRVJLU19fIDw9IDB4MzJGRiBAIGN3OSIgXAorICAgICJkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSIDwgMTMwMCAmJiAhZGVmaW5lZCBVTkRFUl9DRSBAIHZjNiIgXAorICAgICJkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSIDwgMTMwMCAmJiBkZWZpbmVkIFVOREVSX0NFIEAgZXZjNCIgXAorICAgICJkZWZpbmVkIF9fTVdFUktTX18gJiYgX19NV0VSS1NfXyA8PSAweDMxRkYgQCBjdzgiCisgIGRvCisgICAgYm9vc3RfdGFnX3Rlc3Q9YGV4cHIgIlgkaSIgOiAnWFwoW1teQF1dKlwpIEAgJ2AKKyAgICBib29zdF90YWc9YGV4cHIgIlgkaSIgOiAnWFtbXkBdXSogQCBcKC4qXCknYAorICAgIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKKyNpZiAkYm9vc3RfdGFnX3Rlc3QKKy8qIE9LICovCisjZWxzZQorIyBlcnJvciAkYm9vc3RfdGFnX3Rlc3QKKyNlbmRpZgorXV0pXSwgW2Jvb3N0X2N2X2xpYl90YWc9JGJvb3N0X3RhZzsgYnJlYWtdLCBbXSkKKyAgZG9uZQorQUNfTEFOR19QT1AoW0MrK10pZG5sCisgIGNhc2UgJGJvb3N0X2N2X2xpYl90YWcgaW4gIygKKyAgICAjIFNvbWUgbmV3ZXIgKD49IDEuMzU/KSB2ZXJzaW9ucyBvZiBCb29zdCBzZWVtIHRvIG9ubHkgdXNlICJnY2MiIGFzIG9wcG9zZWQKKyAgICAjIHRvICJnY2M0MSIgZm9yIGluc3RhbmNlLgorICAgICotZ2NjIHwgKictZ2NjICcpIDo7OyAjKCAgRG9uJ3QgcmUtYWRkIC1nY2M6IGl0J3MgYWxyZWFkeSBpbiB0aGVyZS4KKyAgICBnY2MqKQorICAgICAgYm9vc3RfdGFnX3g9CisgICAgICBjYXNlICRob3N0X29zIGluICMoCisgICAgICAgIGRhcndpbiopCisgICAgICAgICAgaWYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtZ2UgMTM2OyB0aGVuCisgICAgICAgICAgICAjIFRoZSBgeCcgYWRkZWQgaW4gcjQ2NzkzIG9mIEJvb3N0LgorICAgICAgICAgICAgYm9vc3RfdGFnX3g9eAorICAgICAgICAgIGZpOzsKKyAgICAgIGVzYWMKKyAgICAgICMgV2UgY2FuIHNwZWNpZnkgbXVsdGlwbGUgdGFncyBpbiB0aGlzIHZhcmlhYmxlIGJlY2F1c2UgaXQncyB1c2VkIGJ5CisgICAgICAjIEJPT1NUX0ZJTkRfTElCIHRoYXQgZG9lcyBhIGBmb3IgdGFnIGluIC0kYm9vc3RfY3ZfbGliX3RhZycgLi4uCisgICAgICBib29zdF9jdl9saWJfdGFnPSIkYm9vc3RfdGFnX3gkYm9vc3RfY3ZfbGliX3RhZyAtJHtib29zdF90YWdfeH1nY2MiCisgICAgICA7OyAjKAorICAgIHVua25vd24pCisgICAgICBBQ19NU0dfV0FSTihbW2NvdWxkIG5vdCBmaWd1cmUgb3V0IHdoaWNoIHRvb2xzZXQgbmFtZSB0byB1c2UgZm9yICRDWFhdXSkKKyAgICAgIGJvb3N0X2N2X2xpYl90YWc9CisgICAgICA7OworICBlc2FjCitmaV0pZG5sIGVuZCBvZiBBQ19DQUNIRV9DSEVDSworXSkjIF9CT09TVF9GSU5EX0NPTVBJTEVSX1RBRworCisKKyMgX0JPT1NUX0dVRVNTX1dIRVRIRVJfVE9fVVNFX01UKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29tcGlsZSBhIHNtYWxsIHRlc3QgdG8gdHJ5IHRvIGd1ZXNzIHdoZXRoZXIgd2Ugc2hvdWxkIGZhdm9yIE1UIChNdWx0aQorIyBUaHJlYWQpIGZsYXZvcnMgb2YgQm9vc3QuICBTZXRzIGJvb3N0X2d1ZXNzX3VzZV9tdCBhY2NvcmRpbmdseS4KK0FDX0RFRlVOKFtfQk9PU1RfR1VFU1NfV0hFVEhFUl9UT19VU0VfTVRdLAorWyMgQ2hlY2sgd2hldGhlciB3ZSBkbyBiZXR0ZXIgdXNlIGBtdCcgZXZlbiB0aG91Z2ggd2Ugd2VyZW4ndCBhc2sgdG8uCitBQ19MQU5HX1BVU0goW0MrK10pZG5sCitBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCisjaWYgZGVmaW5lZCBfUkVFTlRSQU5UIHx8IGRlZmluZWQgX01UIHx8IGRlZmluZWQgX19NVF9fCisvKiB1c2UgLW10ICovCisjZWxzZQorIyBlcnJvciBNVCBub3QgbmVlZGVkCisjZW5kaWYKK11dKV0sIFtib29zdF9ndWVzc191c2VfbXQ9Ol0sIFtib29zdF9ndWVzc191c2VfbXQ9ZmFsc2VdKQorQUNfTEFOR19QT1AoW0MrK10pZG5sCitdKQorCisjIF9CT09TVF9BQ19MSU5LX0lGRUxTRShQUk9HUkFNLCBbQUNUSU9OLUlGLVRSVUVdLCBbQUNUSU9OLUlGLUZBTFNFXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGb3JrIG9mIF9BQ19MSU5LX0lGRUxTRSB0aGF0IHByZXNlcnZlcyBjb25mdGVzdC5vIGFjcm9zcyBjYWxscy4gIEZyYWdpbGUsCisjIHdpbGwgYnJlYWsgd2hlbiBBdXRvY29uZiBjaGFuZ2VzIGl0cyBpbnRlcm5hbHMuICBSZXF1aXJlcyB0aGF0IHlvdSBtYW51YWxseQorIyBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGluIGJldHdlZW4gdG8gcmVhbGx5IGRpZmZlcmVudCB0ZXN0cywgb3RoZXJ3aXNlCisjIHlvdSB3aWxsIHRyeSB0byBsaW5rIGEgY29uZnRlc3QubyBsZWZ0IGJlaGluZCBieSBhIHByZXZpb3VzIHRlc3QuCisjIFVzZWQgdG8gYWdncmVzc2l2ZWx5IG9wdGltaXplIEJPT1NUX0ZJTkRfTElCIChzZWUgdGhlIGJpZyBjb21tZW50IGluIHRoaXMKKyMgbWFjcm8pLgorIworIyBEb24ndCB1c2UgImJyZWFrIiBpbiB0aGUgYWN0aW9ucywgYXMgaXQgd291bGQgc2hvcnQtY2lyY3VpdCBzb21lIGNvZGUKKyMgdGhpcyBtYWNybyBydW5zIGFmdGVyIHRoZSBhY3Rpb25zLgorbTRfZGVmaW5lKFtfQk9PU1RfQUNfTElOS19JRkVMU0VdLAorW200X2lmdmFsbihbJDFdLCBbQUNfTEFOR19DT05GVEVTVChbJDFdKV0pZG5sCitybSAtZiBjb25mdGVzdCRhY19leGVleHQKK2Jvb3N0X3NhdmVfYWNfZXh0PSRhY19leHQKK2Jvb3N0X3VzZV9zb3VyY2U9OgorIyBJZiB3ZSBhbHJlYWR5IGhhdmUgYSAubywgcmUtdXNlIGl0LiAgV2UgY2hhbmdlICRhY19leHQgc28gdGhhdCAkYWNfbGluaworIyB0cmllcyB0byBsaW5rIHRoZSBleGlzdGluZyBvYmplY3QgZmlsZSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBmcm9tIHNvdXJjZS4KK3Rlc3QgLWYgY29uZnRlc3QuJGFjX29iamV4dCAmJiBhY19leHQ9JGFjX29iamV4dCAmJiBib29zdF91c2Vfc291cmNlPWZhbHNlICYmCisgIF9BU19FQ0hPX0xPRyhbcmUtdXNpbmcgdGhlIGV4aXN0aW5nIGNvbmZ0ZXN0LiRhY19vYmpleHRdKQorQVNfSUYoW19BQ19ET19TVERFUlIoJGFjX2xpbmspICYmIHsKKyAgICAgICAgIHRlc3QgLXogIiRhY19bXV9BQ19MQU5HX0FCQlJFVltdX3dlcnJvcl9mbGFnIiB8fAorICAgICAgICAgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworICAgICAgICAgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKyAgICAgICAgICRhc19leGVjdXRhYmxlX3AgY29uZnRlc3QkYWNfZXhlZXh0CitkbmwgRklYTUU6IHVzZSBBU19URVNUX1ggaW5zdGVhZCB3aGVuIDIuNjEgaXMgd2lkZXNwcmVhZCBlbm91Z2guCisgICAgICAgfV0sCisgICAgICBbJDJdLAorICAgICAgW2lmICRib29zdF91c2Vfc291cmNlOyB0aGVuCisgICAgICAgICBfQUNfTVNHX0xPR19DT05GVEVTVAorICAgICAgIGZpCisgICAgICAgJDNdKQorYWNfb2JqZXh0PSRib29zdF9zYXZlX2FjX29iamV4dAorYWNfZXh0PSRib29zdF9zYXZlX2FjX2V4dAorZG5sIERlbGV0ZSBhbHNvIHRoZSBJUEEvSVBPIChJbnRlciBQcm9jZWR1cmFsIEFuYWx5c2lzL09wdGltaXphdGlvbikKK2RubCBpbmZvcm1hdGlvbiBjcmVhdGVkIGJ5IHRoZSBQR0kgY29tcGlsZXIgKGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28pLAorZG5sIGFzIGl0IHdvdWxkIGludGVyZmVyZSB3aXRoIHRoZSBuZXh0IGxpbmsgY29tbWFuZC4KK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IG00X2lmdmFsKFskMV0sIFtjb25mdGVzdC4kYWNfZXh0XSlbXWRubAorXSkjIF9CT09TVF9BQ19MSU5LX0lGRUxTRQorCisjIExvY2FsIFZhcmlhYmxlczoKKyMgbW9kZTogYXV0b2NvbmYKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9jdmM0LW1hc3Rlci1wYXRjaC9jb25maWcvYm9vc3QubTQudHh0IGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9jdmM0LW1hc3Rlci1wYXRjaC9jb25maWcvYm9vc3QubTQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZDA2M2YKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL2N2YzQtbWFzdGVyLXBhdGNoL2NvbmZpZy9ib29zdC5tNC50eHQKQEAgLTAsMCArMSwxNTYwIEBACisjIGJvb3N0Lm00OiBMb2NhdGUgQm9vc3QgaGVhZGVycyBhbmQgbGlicmFyaWVzIGZvciBhdXRvY29uZi1iYXNlZCBwcm9qZWN0cy4KKyMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMTEsIDIwMTQgIEJlbm9pdCBTaWdvdXJlIDx0c3VuYUBscmRlLmVwaXRhLmZyPgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBBZGRpdGlvbmFsIHBlcm1pc3Npb24gdW5kZXIgc2VjdGlvbiA3IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZSwgdmVyc2lvbiAzICgiR1BMdjMiKToKKyMKKyMgSWYgeW91IGNvbnZleSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHdvcmsgdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBkbyBzbyB1bmRlcgorIyB0ZXJtcyBvZiB5b3VyIGNob2ljZS4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKK200X2RlZmluZShbX0JPT1NUX1NFUklBTF0sIFttNF90cmFuc2xpdChbCisjIHNlcmlhbCAyNQorXSwgWyMKK10sIFtdKV0pCisKKyMgT3JpZ2luYWwgc291cmNlcyBjYW4gYmUgZm91bmQgYXQgaHR0cDovL2dpdGh1Yi5jb20vdHN1bmEvYm9vc3QubTQKKyMgWW91IGNhbiBmZXRjaCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIHNjcmlwdCBieSBkb2luZzoKKyMgICB3Z2V0IGh0dHA6Ly9naXRodWIuY29tL3RzdW5hL2Jvb3N0Lm00L3Jhdy9tYXN0ZXIvYnVpbGQtYXV4L2Jvb3N0Lm00CisKKyMgLS0tLS0tICMKKyMgUkVBRE1FICMKKyMgLS0tLS0tICMKKworIyBUaGlzIGZpbGUgcHJvdmlkZXMgc2V2ZXJhbCBtYWNyb3MgdG8gdXNlIHRoZSB2YXJpb3VzIEJvb3N0IGxpYnJhcmllcy4KKyMgVGhlIGZpcnN0IG1hY3JvIGlzIEJPT1NUX1JFUVVJUkUuICBJdCB3aWxsIHNpbXBseSBjaGVjayBpZiBpdCdzIHBvc3NpYmxlIHRvCisjIGZpbmQgdGhlIEJvb3N0IGhlYWRlcnMgb2YgYSBnaXZlbiAob3B0aW9uYWwpIG1pbmltdW0gdmVyc2lvbiBhbmQgaXQgd2lsbAorIyBkZWZpbmUgQk9PU1RfQ1BQRkxBR1MgYWNjb3JkaW5nbHkuICBJdCB3aWxsIGFkZCBhbiBvcHRpb24gLS13aXRoLWJvb3N0IHRvCisjIHlvdXIgY29uZmlndXJlIHNvIHRoYXQgdXNlcnMgY2FuIHNwZWNpZnkgbm9uIHN0YW5kYXJkIGxvY2F0aW9ucy4KKyMgSWYgdGhlIHVzZXIncyBlbnZpcm9ubWVudCBjb250YWlucyBCT09TVF9ST09UIGFuZCAtLXdpdGgtYm9vc3Qgd2FzIG5vdAorIyBzcGVjaWZpZWQsIC0td2l0aC1ib29zdD0kQk9PU1RfUk9PVCBpcyBpbXBsaWNpdGx5IHVzZWQuCisjIEZvciBtb3JlIFJFQURNRSBhbmQgZG9jdW1lbnRhdGlvbiwgZ28gdG8gaHR0cDovL2dpdGh1Yi5jb20vdHN1bmEvYm9vc3QubTQKKyMgTm90ZTogVEhFU0UgTUFDUk9TIEFTU1VNRSBUSEFUIFlPVSBVU0UgTElCVE9PTC4gIElmIHlvdSBkb24ndCwgZG9uJ3Qgd29ycnksCisjIHNpbXBseSByZWFkIHRoZSBSRUFETUUsIGl0IHdpbGwgc2hvdyB5b3Ugd2hhdCB0byBkbyBzdGVwIGJ5IHN0ZXAuCisKK200X3BhdHRlcm5fZm9yYmlkKFteXz8oQk9PU1R8Qm9vc3QpX10pCisKKworIyBfQk9PU1RfU0VEX0NQUChTRUQtUFJPR1JBTSwgUFJPR1JBTSwKKyMgICAgICAgICAgICAgICAgW0FDVElPTi1JRi1GT1VORF0sIFtBQ1RJT04tSUYtTk9ULUZPVU5EXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2FtZSBhcyBBQ19FR1JFUF9DUFAsIGJ1dCBsZWF2ZSB0aGUgcmVzdWx0IGluIGNvbmZ0ZXN0LmkuCisjCisjIFNFRC1QUk9HUkFNIGlzICpub3QqIG92ZXJxdW90ZWQsIGFzIGluIEFDX0VHUkVQX0NQUC4gIEl0IGlzIGV4cGFuZGVkCisjIGluIGRvdWJsZS1xdW90ZXMsIHNvIGVzY2FwZSB5b3VyIGRvdWJsZSBxdW90ZXMuCisjCisjIEl0IGNvdWxkIGJlIHVzZWZ1bCB0byB0dXJuIHRoaXMgaW50byBhIG1hY3JvIHdoaWNoIGV4dHJhY3RzIHRoZQorIyB2YWx1ZSBvZiBhbnkgbWFjcm8uCittNF9kZWZpbmUoW19CT09TVF9TRURfQ1BQXSwKK1tBQ19MQU5HX1BVU0goW0MrK10pZG5sCitBQ19MQU5HX1BSRVBST0NfUkVRVUlSRSgpZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX1NFRF0pZG5sCitBQ19MQU5HX0NPTkZURVNUKFtBQ19MQU5HX1NPVVJDRShbWyQyXV0pXSkKK0FTX0lGKFtkbmwgZXZhbCBpcyBuZWNlc3NhcnkgdG8gZXhwYW5kIGFjX2NwcC4KK2RubCBVbHRyaXggYW5kIFB5cmFtaWQgc2ggcmVmdXNlIHRvIHJlZGlyZWN0IG91dHB1dCBvZiBldmFsLCBzbyB1c2Ugc3Vic2hlbGwuCitkbmwgQmV3YXJlIG9mIFdpbmRvd3MgZW5kLW9mLWxpbmVzLCBmb3IgaW5zdGFuY2UgaWYgd2UgYXJlIHJ1bm5pbmcKK2RubCBzb21lIFdpbmRvd3MgcHJvZ3JhbXMgdW5kZXIgV2luZS4gIEluIHRoYXQgY2FzZSwgYm9vc3QvdmVyc2lvbi5ocHAKK2RubCBpcyBjZXJ0YWlubHkgdXNpbmcgIlxyXG4iLCBidXQgdGhlIHJlZ3VsYXIgVW5peCBzaGVsbCB3aWxsIG9ubHkKK2RubCBzdHJpcCBgXG4nIHdpdGggYmFja3F1b3Rlcywgbm90IHRoZSBgXHInLiAgVGhpcyByZXN1bHRzIGluCitkbmwgYm9vc3RfY3ZfbGliX3ZlcnNpb249JzFfMzdccicgZm9yIGluc3RhbmNlLCB3aGljaCBicmVha3MKK2RubCBldmVyeXRoaW5nIGVsc2UuCitkbmwgQ2Fubm90IHVzZSAnZG5sJyBhZnRlciBbJDRdIGJlY2F1c2UgYSB0cmFpbGluZyBkbmwgbWF5IGJyZWFrIEFDX0NBQ0hFX0NIRUNLCitkbmwKK2RubCBCZXdhcmUgdGhhdCBHQ0MgNSwgd2hlbiBleHBhbmRpbmcgbWFjcm9zLCBtYXkgZW1iZWQgIyBsaW5lIGRpcmVjdGl2ZXMKK2RubCBhIHdpdGhpbiBzaW5nbGUgbGluZToKK2RubAorZG5sICMgMSAiY29uZnRlc3QuY2MiCitkbmwgIyAxICI8YnVpbHQtaW4+IgorZG5sICMgMSAiPGNvbW1hbmQtbGluZT4iCitkbmwgIyAxICJjb25mdGVzdC5jYyIKK2RubCAjIDEgIi9vcHQvbG9jYWwvaW5jbHVkZS9ib29zdC92ZXJzaW9uLmhwcCIgMSAzCitkbmwgIyAyICJjb25mdGVzdC5jYyIgMgorZG5sIGJvb3N0LWxpYi12ZXJzaW9uID0KK2RubCAjIDIgImNvbmZ0ZXN0LmNjIiAzCitkbmwgICAgICAgICAgICAgICAgICAgICIxXzU2IgorZG5sCitkbmwgU28gZ2V0IHJpZCBvZiB0aGUgIyBsaW5lcywgYW5kIGdsdWUgdGhlIHJlbWFpbmluZyBvbmVzIHRvZ2V0aGVyLgorKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JkFTX01FU1NBR0VfTE9HX0ZEIHwKKyAgZ3JlcCAtdiAnIycgfAorICB0ciAtZCAnXHInIHwKKyAgdHIgLXMgJ1xuJyAnICcgfAorICAkU0VEIC1uIC1lICIkMSIgPmNvbmZ0ZXN0LmkgMj4mMV0sCisgIFskM10sCisgIFskNF0pCitybSAtcmYgY29uZnRlc3QqCitBQ19MQU5HX1BPUChbQysrXSlkbmwKK10pIyBfQk9PU1RfU0VEX0NQUAorCisKKworIyBCT09TVF9SRVFVSVJFKFtWRVJTSU9OXSwgW0FDVElPTi1JRi1OT1QtRk9VTkRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC4gIElmIHZlcnNpb24gaXMgZ2l2ZW4sIGl0IG11c3QgZWl0aGVyIGJlIGEgbGl0ZXJhbCBvZiB0aGUgZm9ybQorIyAiWC5ZLloiIHdoZXJlIFgsIFkgYW5kIFogYXJlIGludGVnZXJzICh0aGUgIi5aIiBwYXJ0IGJlaW5nIG9wdGlvbmFsKSBvciBhCisjIHZhcmlhYmxlICIkdmFyIi4KKyMgRGVmaW5lcyB0aGUgdmFsdWUgQk9PU1RfQ1BQRkxBR1MuICBUaGlzIG1hY3JvIG9ubHkgY2hlY2tzIGZvciBoZWFkZXJzIHdpdGgKKyMgdGhlIHJlcXVpcmVkIHZlcnNpb24sIGl0IGRvZXMgbm90IGNoZWNrIGZvciBhbnkgb2YgdGhlIEJvb3N0IGxpYnJhcmllcy4KKyMgT24gIyBzdWNjZXNzLCBkZWZpbmVzIEhBVkVfQk9PU1QuICBPbiBmYWlsdXJlLCBjYWxscyB0aGUgb3B0aW9uYWwKKyMgQUNUSU9OLUlGLU5PVC1GT1VORCBhY3Rpb24gaWYgb25lIHdhcyBzdXBwbGllZC4KKyMgT3RoZXJ3aXNlIGFib3J0cyB3aXRoIGFuIGVycm9yIG1lc3NhZ2UuCitBQ19ERUZVTl9PTkNFKFtCT09TVF9SRVFVSVJFXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0NYWF0pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX0dSRVBdKWRubAorZWNobyAiJGFzX21lOiB0aGlzIGlzIGJvb3N0Lm00W11fQk9PU1RfU0VSSUFMIiA+JkFTX01FU1NBR0VfTE9HX0ZECitib29zdF9zYXZlX0lGUz0kSUZTCitib29zdF92ZXJzaW9uX3JlcT0kMQorSUZTPS4KK3NldCB4ICRib29zdF92ZXJzaW9uX3JlcSAwIDAgMAorSUZTPSRib29zdF9zYXZlX0lGUworc2hpZnQKK2Jvb3N0X3ZlcnNpb25fcmVxPWBleHByICIkWzFdIiAnKicgMTAwMDAwICsgIiRbMl0iICcqJyAxMDAgKyAiJFszXSJgCitib29zdF92ZXJzaW9uX3JlcV9zdHJpbmc9JFsxXS4kWzJdLiRbM10KK0FDX0FSR19XSVRIKFtib29zdF0sCisgICBbQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1ib29zdD1ESVJdLAorICAgICAgICAgICAgICAgICAgIFtwcmVmaXggb2YgQm9vc3QgJDEgQDw6QGd1ZXNzQDo+QF0pXSlkbmwKK0FDX0FSR19WQVIoW0JPT1NUX1JPT1RdLFtMb2NhdGlvbiBvZiBCb29zdCBpbnN0YWxsYXRpb25dKWRubAorIyBJZiBCT09TVF9ST09UIGlzIHNldCBhbmQgdGhlIHVzZXIgaGFzIG5vdCBwcm92aWRlZCBhIHZhbHVlIHRvCisjIC0td2l0aC1ib29zdCwgdGhlbiB0cmVhdCBCT09TVF9ST09UIGFzIGlmIGl0IHRoZSB1c2VyIHN1cHBsaWVkIGl0LgoraWYgdGVzdCB4IiRCT09TVF9ST09UIiAhPSB4OyB0aGVuCisgIGlmIHRlc3QgeCIkd2l0aF9ib29zdCIgPSB4OyB0aGVuCisgICAgQUNfTVNHX05PVElDRShbRGV0ZWN0ZWQgQk9PU1RfUk9PVDsgY29udGludWluZyB3aXRoIC0td2l0aC1ib29zdD0kQk9PU1RfUk9PVF0pCisgICAgd2l0aF9ib29zdD0kQk9PU1RfUk9PVAorICBlbHNlCisgICAgQUNfTVNHX05PVElDRShbRGV0ZWN0ZWQgQk9PU1RfUk9PVD0kQk9PU1RfUk9PVCwgYnV0IG92ZXJyaWRkZW4gYnkgLS13aXRoLWJvb3N0PSR3aXRoX2Jvb3N0XSkKKyAgZmkKK2ZpCitBQ19TVUJTVChbRElTVENIRUNLX0NPTkZJR1VSRV9GTEFHU10sCisgICAgICAgICBbIiRESVNUQ0hFQ0tfQ09ORklHVVJFX0ZMQUdTICctLXdpdGgtYm9vc3Q9JHdpdGhfYm9vc3QnIl0pZG5sCitib29zdF9zYXZlX0NQUEZMQUdTPSRDUFBGTEFHUworICBBQ19DQUNIRV9DSEVDSyhbZm9yIEJvb3N0IGhlYWRlcnMgdmVyc2lvbiA+PSAkYm9vc3RfdmVyc2lvbl9yZXFfc3RyaW5nXSwKKyAgICBbYm9vc3RfY3ZfaW5jX3BhdGhdLAorICAgIFtib29zdF9jdl9pbmNfcGF0aD1ubworQUNfTEFOR19QVVNIKFtDKytdKWRubAorbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX1ZFUlNJT04kXSlkbmwKKyAgICBBQ19MQU5HX0NPTkZURVNUKFtBQ19MQU5HX1BST0dSQU0oW1sjaW5jbHVkZSA8Ym9vc3QvdmVyc2lvbi5ocHA+CisjaWYgIWRlZmluZWQgQk9PU1RfVkVSU0lPTgorIyBlcnJvciBCT09TVF9WRVJTSU9OIGlzIG5vdCBkZWZpbmVkCisjZWxpZiBCT09TVF9WRVJTSU9OIDwgJGJvb3N0X3ZlcnNpb25fcmVxCisjIGVycm9yIEJvb3N0IGhlYWRlcnMgdmVyc2lvbiA8ICRib29zdF92ZXJzaW9uX3JlcQorI2VuZGlmCitdXSldKQorICAgICMgSWYgdGhlIHVzZXIgcHJvdmlkZWQgYSB2YWx1ZSB0byAtLXdpdGgtYm9vc3QsIHVzZSBpdCBhbmQgb25seSBpdC4KKyAgICBjYXNlICR3aXRoX2Jvb3N0IGluICMoCisgICAgICAnJ3x5ZXMpIHNldCB4ICcnIC9vcHQvbG9jYWwvaW5jbHVkZSAvdXNyL2xvY2FsL2luY2x1ZGUgL29wdC9pbmNsdWRlIFwKKyAgICAgICAgICAgICAgICAgL3Vzci9pbmNsdWRlIEM6L0Jvb3N0L2luY2x1ZGU7OyAjKAorICAgICAgKikgICAgICBzZXQgeCAiJHdpdGhfYm9vc3QvaW5jbHVkZSIgIiR3aXRoX2Jvb3N0Ijs7CisgICAgZXNhYworICAgIHNoaWZ0CisgICAgZm9yIGJvb3N0X2RpcgorICAgIGRvCisgICAgIyBXaXRob3V0IC0tbGF5b3V0PXN5c3RlbSwgQm9vc3QgKG9yIGF0IGxlYXN0IHNvbWUgdmVyc2lvbnMpIGluc3RhbGxzCisgICAgIyBpdHNlbGYgaW4gPHByZWZpeD4vaW5jbHVkZS9ib29zdC08dmVyc2lvbj4uICBUaGlzIGlubmVyIGxvb3AgaGVscHMgdG8KKyAgICAjIGZpbmQgaGVhZGVycyBpbiBzdWNoIGRpcmVjdG9yaWVzLgorICAgICMKKyAgICAjIEFueSAke2Jvb3N0X2Rpcn0vYm9vc3QteF94eCBkaXJlY3RvcmllcyBhcmUgc2VhcmNoZWQgaW4gcmV2ZXJzZSB2ZXJzaW9uCisgICAgIyBvcmRlciBmb2xsb3dlZCBieSAke2Jvb3N0X2Rpcn0uICBUaGUgZmluYWwgJy4nIGlzIGEgc2VudGluZWwgZm9yCisgICAgIyBzZWFyY2hpbmcgJGJvb3N0X2RpciIgaXRzZWxmLiAgRW50cmllcyBhcmUgd2hpdGVzcGFjZSBzZXBhcmF0ZWQuCisgICAgIworICAgICMgSSBkaWRuJ3QgaW5kZW50IHRoaXMgbG9vcCBvbiBwdXJwb3NlICh0byBhdm9pZCBvdmVyLWluZGVudGVkIGNvZGUpCisgICAgYm9vc3RfbGF5b3V0X3N5c3RlbV9zZWFyY2hfbGlzdD1gY2QgIiRib29zdF9kaXIiIDI+L2Rldi9udWxsIFwKKyAgICAgICAgJiYgbHMgLTEgfCAiJHtHUkVQfSIgJ15ib29zdC0nIHwgc29ydCAtcm4gLXQtIC1rMiBcCisgICAgICAgICYmIGVjaG8gLmAKKyAgICBmb3IgYm9vc3RfaW5jIGluICRib29zdF9sYXlvdXRfc3lzdGVtX3NlYXJjaF9saXN0CisgICAgZG8KKyAgICAgIGlmIHRlc3QgeCIkYm9vc3RfaW5jIiAhPSB4LjsgdGhlbgorICAgICAgICBib29zdF9pbmM9IiRib29zdF9kaXIvJGJvb3N0X2luYyIKKyAgICAgIGVsc2UKKyAgICAgICAgYm9vc3RfaW5jPSIkYm9vc3RfZGlyIiAjIFVzZXMgc2VudGluZWwgaW4gYm9vc3RfbGF5b3V0X3N5c3RlbV9zZWFyY2hfbGlzdAorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgeCIkYm9vc3RfaW5jIiAhPSB4OyB0aGVuCisgICAgICAgICMgV2UgYXJlIGdvaW5nIHRvIGNoZWNrIHdoZXRoZXIgdGhlIHZlcnNpb24gb2YgQm9vc3QgaW5zdGFsbGVkCisgICAgICAgICMgaW4gJGJvb3N0X2luYyBpcyB1c2FibGUgYnkgcnVubmluZyBhIGNvbXBpbGF0aW9uIHRoYXQKKyAgICAgICAgIyAjaW5jbHVkZXMgaXQuICBCdXQgaWYgd2UgcGFzcyBhIC1JL3NvbWUvcGF0aCBpbiB3aGljaCBCb29zdAorICAgICAgICAjIGlzIG5vdCBpbnN0YWxsZWQsIHRoZSBjb21waWxlciB3aWxsIGp1c3Qgc2tpcCB0aGlzIC1JIGFuZAorICAgICAgICAjIHVzZSBvdGhlciBsb2NhdGlvbnMgKGVpdGhlciBmcm9tIENQUEZMQUdTLCBvciBmcm9tIGl0cyBsaXN0CisgICAgICAgICMgb2Ygc3lzdGVtIGluY2x1ZGUgZGlyZWN0b3JpZXMpLiAgQXMgYSByZXN1bHQgd2Ugd291bGQgdXNlCisgICAgICAgICMgaGVhZGVyIGluc3RhbGxlZCBvbiB0aGUgbWFjaGluZSBpbnN0ZWFkIG9mIHRoZSAvc29tZS9wYXRoCisgICAgICAgICMgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLiAgU28gaW4gdGhhdCBwcmVjaXNlIGNhc2UgKHRyeWluZworICAgICAgICAjICRib29zdF9pbmMpLCBtYWtlIHN1cmUgdGhlIHZlcnNpb24uaHBwIGV4aXN0cy4KKyAgICAgICAgIworICAgICAgICAjIFVzZSB0ZXN0IC1lIGFzIHRoZXJlIGNhbiBiZSBzeW1saW5rcy4KKyAgICAgICAgdGVzdCAtZSAiJGJvb3N0X2luYy9ib29zdC92ZXJzaW9uLmhwcCIgfHwgY29udGludWUKKyAgICAgICAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAtSSRib29zdF9pbmMiCisgICAgICBmaQorICAgICAgQUNfQ09NUElMRV9JRkVMU0UoW10sIFtib29zdF9jdl9pbmNfcGF0aD15ZXNdLCBbYm9vc3RfY3ZfdmVyc2lvbj1ub10pCisgICAgICBpZiB0ZXN0IHgiJGJvb3N0X2N2X2luY19wYXRoIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgaWYgdGVzdCB4IiRib29zdF9pbmMiICE9IHg7IHRoZW4KKyAgICAgICAgICBib29zdF9jdl9pbmNfcGF0aD0kYm9vc3RfaW5jCisgICAgICAgIGZpCisgICAgICAgIGJyZWFrIDIKKyAgICAgIGZpCisgICAgZG9uZQorICAgIGRvbmUKK0FDX0xBTkdfUE9QKFtDKytdKWRubAorICAgIF0pCisgICAgY2FzZSAkYm9vc3RfY3ZfaW5jX3BhdGggaW4gIygKKyAgICAgIG5vKQorICAgICAgICBib29zdF9lcnJtc2c9ImNhbm5vdCBmaW5kIEJvb3N0IGhlYWRlcnMgdmVyc2lvbiA+PSAkYm9vc3RfdmVyc2lvbl9yZXFfc3RyaW5nIgorICAgICAgICBtNF9pZihbJDJdLCBbXSwgIFtBQ19NU0dfRVJST1IoWyRib29zdF9lcnJtc2ddKV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbQUNfTVNHX05PVElDRShbJGJvb3N0X2Vycm1zZ10pXSkKKyAgICAgICAgJDIKKyAgICAgICAgOzsjKAorICAgICAgeWVzKQorICAgICAgICBCT09TVF9DUFBGTEFHUz0KKyAgICAgICAgOzsjKAorICAgICAgKikKKyAgICAgICAgQUNfU1VCU1QoW0JPT1NUX0NQUEZMQUdTXSwgWyItSSRib29zdF9jdl9pbmNfcGF0aCJdKWRubAorICAgICAgICA7OworICAgIGVzYWMKKyAgaWYgdGVzdCB4IiRib29zdF9jdl9pbmNfcGF0aCIgIT0geG5vOyB0aGVuCisgIEFDX0RFRklORShbSEFWRV9CT09TVF0sIFsxXSwKKyAgICAgICAgICAgIFtEZWZpbmVkIGlmIHRoZSByZXF1ZXN0ZWQgbWluaW11bSBCT09TVCB2ZXJzaW9uIGlzIHNhdGlzZmllZF0pCisgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgQm9vc3QncyBoZWFkZXIgdmVyc2lvbl0sCisgICAgW2Jvb3N0X2N2X2xpYl92ZXJzaW9uXSwKKyAgICBbbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX0xJQl9WRVJTSU9OJF0pZG5sCisgICAgIF9CT09TVF9TRURfQ1BQKFtbL15ib29zdC1saWItdmVyc2lvbiA9IC97cy8vLztzL1tcIiBdLy9nO3A7cTt9XV0sCisgICAgICAgICAgICAgICAgICAgIFsjaW5jbHVkZSA8Ym9vc3QvdmVyc2lvbi5ocHA+Citib29zdC1saWItdmVyc2lvbiA9IEJPT1NUX0xJQl9WRVJTSU9OXSwKKyAgICBbYm9vc3RfY3ZfbGliX3ZlcnNpb249YGNhdCBjb25mdGVzdC5pYF0pXSkKKyAgICAjIGUuZy4gIjEzNCIgZm9yIDFfMzRfMSBvciAiMTM1IiBmb3IgMV8zNQorICAgIGJvb3N0X21ham9yX3ZlcnNpb249YGVjaG8gIiRib29zdF9jdl9saWJfdmVyc2lvbiIgfCBzZWQgJ3MvXy8vO3MvXy4qLy8nYAorICAgIGNhc2UgJGJvb3N0X21ham9yX3ZlcnNpb24gaW4gIygKKyAgICAgICcnIHwgKltbITAtOV1dKikKKyAgICAgICAgQUNfTVNHX0VSUk9SKFtpbnZhbGlkIHZhbHVlOiBib29zdF9tYWpvcl92ZXJzaW9uPSckYm9vc3RfbWFqb3JfdmVyc2lvbiddKQorICAgICAgICA7OworICAgIGVzYWMKK2ZpCitDUFBGTEFHUz0kYm9vc3Rfc2F2ZV9DUFBGTEFHUworXSkjIEJPT1NUX1JFUVVJUkUKKworCisjIEJPT1NUX1NUQVRJQygpCisjIC0tLS0tLS0tLS0tLS0tCisjIEFkZCB0aGUgIi0tZW5hYmxlLXN0YXRpYy1ib29zdCIgY29uZmlndXJlIGFyZ3VtZW50LiBJZiB0aGlzIGFyZ3VtZW50IGlzIGdpdmVuCisjIG9uIHRoZSBjb21tYW5kIGxpbmUsIHN0YXRpYyB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyaWVzIHdpbGwgYmUgbG9va2VkIHVwLgorQUNfREVGVU4oW0JPT1NUX1NUQVRJQ10sCisgIFtBQ19BUkdfRU5BQkxFKFtzdGF0aWMtYm9vc3RdLAorICAgICBbQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXN0YXRpYy1ib29zdF0sCisgICAgICAgICAgICAgICBbUHJlZmVyIHRoZSBzdGF0aWMgYm9vc3QgbGlicmFyaWVzIG92ZXIgdGhlIHNoYXJlZCBvbmVzIFtub11dKV0sCisgICAgIFtlbmFibGVfc3RhdGljX2Jvb3N0PXllc10sCisgICAgIFtlbmFibGVfc3RhdGljX2Jvb3N0PW5vXSldKSMgQk9PU1RfU1RBVElDCisKKworIyBCT09TVF9GSU5EX0hFQURFUihbSEVBREVSLU5BTUVdLCBbQUNUSU9OLUlGLU5PVC1GT1VORF0sIFtBQ1RJT04tSUYtRk9VTkRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBXcmFwcGVyIGFyb3VuZCBBQ19DSEVDS19IRUFERVIgZm9yIEJvb3N0IGhlYWRlcnMuICBVc2VmdWwgdG8gY2hlY2sgZm9yCisjIHNvbWUgcGFydHMgb2YgdGhlIEJvb3N0IGxpYnJhcnkgd2hpY2ggYXJlIG9ubHkgbWFkZSBvZiBoZWFkZXJzIGFuZCBkb24ndAorIyByZXF1aXJlIGxpbmtpbmcgKHN1Y2ggYXMgQm9vc3QuRm9yZWFjaCkuCisjCisjIERlZmF1bHQgQUNUSU9OLUlGLU5PVC1GT1VORDogRmFpbCB3aXRoIGEgZmF0YWwgZXJyb3IgdW5sZXNzIEJvb3N0IGNvdWxkbid0IGJlCisjIGZvdW5kIGluIHRoZSBmaXJzdCBwbGFjZSwgaW4gd2hpY2ggY2FzZSBieSBkZWZhdWx0IGEgbm90aWNlIGlzIGlzc3VlZCB0byB0aGUKKyMgdXNlci4gIFByZXN1bWFibHkgaWYgd2UgaGF2ZW4ndCBkaWVkIGFscmVhZHkgaXQncyBiZWNhdXNlIGl0J3MgT0sgdG8gbm90IGhhdmUKKyMgQm9vc3QsIHdoaWNoIGlzIHdoeSBvbmx5IGEgbm90aWNlIGlzIGlzc3VlZCBpbnN0ZWFkIG9mIGEgaGFyZCBlcnJvci4KKyMKKyMgRGVmYXVsdCBBQ1RJT04tSUYtRk9VTkQ6IGRlZmluZSB0aGUgcHJlcHJvY2Vzc29yIHN5bWJvbCBIQVZFXzxIRUFERVItTkFNRT4gaW4KKyMgY2FzZSBvZiBzdWNjZXNzICMgKHdoZXJlIEhFQURFUi1OQU1FIGlzIHdyaXR0ZW4gTElLRV9USElTLCBlLmcuLAorIyBIQVZFX0JPT1NUX0ZPUkVBQ0hfSFBQKS4KK0FDX0RFRlVOKFtCT09TVF9GSU5EX0hFQURFUl0sCitbQUNfUkVRVUlSRShbQk9PU1RfUkVRVUlSRV0pZG5sCitpZiB0ZXN0IHgiJGJvb3N0X2N2X2luY19wYXRoIiA9IHhubzsgdGhlbgorICBtNF9kZWZhdWx0KFskMl0sIFtBQ19NU0dfTk9USUNFKFtCb29zdCBub3QgYXZhaWxhYmxlLCBub3Qgc2VhcmNoaW5nIGZvciAkMV0pXSkKK2Vsc2UKK0FDX0xBTkdfUFVTSChbQysrXSlkbmwKK2Jvb3N0X3NhdmVfQ1BQRkxBR1M9JENQUEZMQUdTCitDUFBGTEFHUz0iJENQUEZMQUdTICRCT09TVF9DUFBGTEFHUyIKK0FDX0NIRUNLX0hFQURFUihbJDFdLAorICBbbTRfZGVmYXVsdChbJDNdLCBbQUNfREVGSU5FKEFTX1RSX0NQUChbSEFWRV8kMV0pLCBbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0RlZmluZSB0byAxIGlmIHlvdSBoYXZlIDwkMT5dKV0pXSwKKyAgW200X2RlZmF1bHQoWyQyXSwgW0FDX01TR19FUlJPUihbY2Fubm90IGZpbmQgJDFdKV0pXSkKK0NQUEZMQUdTPSRib29zdF9zYXZlX0NQUEZMQUdTCitBQ19MQU5HX1BPUChbQysrXSlkbmwKK2ZpCitdKSMgQk9PU1RfRklORF9IRUFERVIKKworCisjIEJPT1NUX0ZJTkRfTElCUyhbQ09NUE9ORU5ULU5BTUVdLCBbQ0FORElEQVRFLUxJQi1OQU1FU10sCisjICAgICAgICAgICAgICAgICBbUFJFRkVSUkVELVJULU9QVF0sIFtIRUFERVItTkFNRV0sIFtDWFgtVEVTVF0sCisjICAgICAgICAgICAgICAgICBbQ1hYLVBST0xPR1VFXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgdGhlIEJvb3N0IGxpYnJhcnkgQ09NUE9ORU5ULU5BTUUgKGUuZy4sIGB0aHJlYWQnLCBmb3IKKyMgbGliYm9vc3RfdGhyZWFkKSB1bmRlciB0aGUgcG9zc2libGUgQ0FORElEQVRFLUxJQi1OQU1FUyAoZS5nLiwKKyMgInRocmVhZF93aW4zMiB0aHJlYWQiKS4gIENoZWNrIHRoYXQgSEVBREVSLU5BTUUgd29ya3MgYW5kIGNoZWNrIHRoYXQKKyMgbGliYm9vc3RfTElCLU5BTUUgY2FuIGxpbmsgd2l0aCB0aGUgY29kZSBDWFgtVEVTVC4gIFRoZSBvcHRpb25hbAorIyBhcmd1bWVudCBDWFgtUFJPTE9HVUUgY2FuIGJlIHVzZWQgdG8gaW5jbHVkZSBzb21lIEMrKyBjb2RlIGJlZm9yZQorIyB0aGUgYG1haW4nIGZ1bmN0aW9uLgorIworIyBJbnZva2VzIEJPT1NUX0ZJTkRfSEVBREVSKFtIRUFERVItTkFNRV0pIChzZWUgYWJvdmUpLgorIworIyBCb29zdCBsaWJyYXJpZXMgdHlwaWNhbGx5IGNvbWUgY29tcGlsZWQgd2l0aCBzZXZlcmFsIGZsYXZvcnMgKHdpdGggZGlmZmVyZW50CisjIHJ1bnRpbWUgb3B0aW9ucykgc28gUFJFRkVSUkVELVJULU9QVCBpcyB0aGUgcHJlZmVycmVkIHN1ZmZpeC4gIEEgc3VmZml4IGlzIG9uZQorIyBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgbGV0dGVyczogc2dkcG4gKGluIHRoYXQgb3JkZXIpLiAgcyA9IHN0YXRpYworIyBydW50aW1lLCBkID0gZGVidWcgYnVpbGQsIGcgPSBkZWJ1Zy9kaWFnbm9zdGljIHJ1bnRpbWUsIHAgPSBTVExQb3J0IGJ1aWxkLAorIyBuID0gKHVuc3VyZSkgU1RMUG9ydCBidWlsZCB3aXRob3V0IGlvc3RyZWFtcyBmcm9tIFNUTFBvcnQgKGl0IGxvb2tzIGxpa2UgYG4nCisjIG11c3QgYWx3YXlzIGJlIHVzZWQgYWxvbmcgd2l0aCBgcCcpLiAgQWRkaXRpb25hbGx5LCBQUkVGRVJSRUQtUlQtT1BUIGNhbgorIyBzdGFydCB3aXRoIGBtdC0nIHRvIGluZGljYXRlIHRoYXQgdGhlcmUgaXMgYSBwcmVmZXJlbmNlIGZvciBtdWx0aS10aHJlYWQKKyMgYnVpbGRzLiAgU29tZSBzYW1wbGUgdmFsdWVzIGZvciBQUkVGRVJSRUQtUlQtT1BUOiAobm90aGluZyksIG10LCBkLCBtdC1kLCBnZHAKKyMgLi4uICBJZiB5b3Ugd2FudCB0byBtYWtlIHN1cmUgeW91IGhhdmUgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIEJvb3N0CisjIChlZywgPj0gMS4zMykgeW91ICptdXN0KiBpbnZva2UgQk9PU1RfUkVRVUlSRSBiZWZvcmUgdGhpcyBtYWNyby4KK0FDX0RFRlVOKFtCT09TVF9GSU5EX0xJQlNdLAorW0FDX1JFUVVJUkUoW0JPT1NUX1JFUVVJUkVdKWRubAorQUNfUkVRVUlSRShbX0JPT1NUX0ZJTkRfQ09NUElMRVJfVEFHXSlkbmwKK0FDX1JFUVVJUkUoW0JPT1NUX1NUQVRJQ10pZG5sCitBQ19SRVFVSVJFKFtfQk9PU1RfR1VFU1NfV0hFVEhFUl9UT19VU0VfTVRdKWRubAoraWYgdGVzdCB4IiRib29zdF9jdl9pbmNfcGF0aCIgPSB4bm87IHRoZW4KKyAgQUNfTVNHX05PVElDRShbQm9vc3Qgbm90IGF2YWlsYWJsZSwgbm90IHNlYXJjaGluZyBmb3IgdGhlIEJvb3N0ICQxIGxpYnJhcnldKQorZWxzZQorZG5sIFRoZSBlbHNlIGJyYW5jaCBpcyBodWdlIGFuZCB3YXNuJ3QgaW50ZW5kZWQgb24gcHVycG9zZS4KK0FDX0xBTkdfUFVTSChbQysrXSlkbmwKK0FTX1ZBUl9QVVNIREVGKFtCb29zdF9saWJdLCBbYm9vc3RfY3ZfbGliXyQxXSlkbmwKK0FTX1ZBUl9QVVNIREVGKFtCb29zdF9saWJfTERGTEFHU10sIFtib29zdF9jdl9saWJfJDFfTERGTEFHU10pZG5sCitBU19WQVJfUFVTSERFRihbQm9vc3RfbGliX0xEUEFUSF0sIFtib29zdF9jdl9saWJfJDFfTERQQVRIXSlkbmwKK0FTX1ZBUl9QVVNIREVGKFtCb29zdF9saWJfTElCU10sIFtib29zdF9jdl9saWJfJDFfTElCU10pZG5sCitCT09TVF9GSU5EX0hFQURFUihbJDRdKQorYm9vc3Rfc2F2ZV9DUFBGTEFHUz0kQ1BQRkxBR1MKK0NQUEZMQUdTPSIkQ1BQRkxBR1MgJEJPT1NUX0NQUEZMQUdTIgorQUNfQ0FDSEVfQ0hFQ0soW2ZvciB0aGUgQm9vc3QgJDEgbGlicmFyeV0sIFtCb29zdF9saWJdLAorICAgICAgICAgICAgICAgW19CT09TVF9GSU5EX0xJQlMoJEApXSkKK2Nhc2UgJEJvb3N0X2xpYiBpbiAjKAorICAobm8pIF9BQ19NU0dfTE9HX0NPTkZURVNUCisgICAgQUNfTVNHX0VSUk9SKFtjYW5ub3QgZmluZCB0aGUgZmxhZ3MgdG8gbGluayB3aXRoIEJvb3N0ICQxXSkKKyAgICA7OworZXNhYworQUNfU1VCU1QoQVNfVFJfQ1BQKFtCT09TVF8kMV9MREZMQUdTXSksIFskQm9vc3RfbGliX0xERkxBR1NdKWRubAorQUNfU1VCU1QoQVNfVFJfQ1BQKFtCT09TVF8kMV9MRFBBVEhdKSwgWyRCb29zdF9saWJfTERQQVRIXSlkbmwKK0FDX1NVQlNUKFtCT09TVF9MRFBBVEhdLCBbJEJvb3N0X2xpYl9MRFBBVEhdKWRubAorQUNfU1VCU1QoQVNfVFJfQ1BQKFtCT09TVF8kMV9MSUJTXSksIFskQm9vc3RfbGliX0xJQlNdKWRubAorQ1BQRkxBR1M9JGJvb3N0X3NhdmVfQ1BQRkxBR1MKK0FTX1ZBUl9QT1BERUYoW0Jvb3N0X2xpYl0pZG5sCitBU19WQVJfUE9QREVGKFtCb29zdF9saWJfTERGTEFHU10pZG5sCitBU19WQVJfUE9QREVGKFtCb29zdF9saWJfTERQQVRIXSlkbmwKK0FTX1ZBUl9QT1BERUYoW0Jvb3N0X2xpYl9MSUJTXSlkbmwKK0FDX0xBTkdfUE9QKFtDKytdKWRubAorZmkKK10pCisKKworIyBCT09TVF9GSU5EX0xJQihbTElCLU5BTUVdLAorIyAgICAgICAgICAgICAgICBbUFJFRkVSUkVELVJULU9QVF0sIFtIRUFERVItTkFNRV0sIFtDWFgtVEVTVF0sCisjICAgICAgICAgICAgICAgIFtDWFgtUFJPTE9HVUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdyYXBwZXIgZm9yIEJPT1NUX0ZJTkRfTElCUy4KK0FDX0RFRlVOKFtCT09TVF9GSU5EX0xJQl0sCitbQk9PU1RfRklORF9MSUJTKFskMV0sICRAKV0pCisKKworIyBfQk9PU1RfRklORF9MSUJTKFtMSUItTkFNRV0sIFtDQU5ESURBVEUtTElCLU5BTUVTXSwKKyMgICAgICAgICAgICAgICAgIFtQUkVGRVJSRUQtUlQtT1BUXSwgW0hFQURFUi1OQU1FXSwgW0NYWC1URVNUXSwKKyMgICAgICAgICAgICAgICAgIFtDWFgtUFJPTE9HVUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBSZWFsIGltcGxlbWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCUzogcmVseSBvbiB0aGVzZSBsb2NhbCBtYWNyb3M6CisjIEJvb3N0X2xpYiwgQm9vc3RfbGliX0xERkxBR1MsIEJvb3N0X2xpYl9MRFBBVEgsIEJvb3N0X2xpYl9MSUJTCisjCisjIFRoZSBhbGdvcml0aG0gaXMgYXMgZm9sbG93czogZmlyc3QgbG9vayBmb3IgYSBnaXZlbiBsaWJyYXJ5IG5hbWUKKyMgYWNjb3JkaW5nIHRvIHRoZSB1c2VyJ3MgUFJFRkVSUkVELVJULU9QVC4gIEZvciBlYWNoIGxpYnJhcnkgbmFtZSwgd2UKKyMgcHJlZmVyIHRvIHVzZSB0aGUgb25lcyB0aGF0IGNhcnJ5IHRoZSB0YWcgKHRvb2xzZXQgbmFtZSkuICBFYWNoCisjIGxpYnJhcnkgaXMgc2VhcmNoZWQgdGhyb3VnaCB0aGUgdmFyaW91cyBzdGFuZGFyZCBwYXRocyB3ZXJlIEJvb3N0IGlzCisjIHVzdWFsbHkgaW5zdGFsbGVkLiAgSWYgd2UgY2FuJ3QgZmluZCB0aGUgc3RhbmRhcmQgdmFyaWFudHMsIHdlIHRyeQorIyB0byBlbmZvcmNlIC1tdCAoZm9yIGluc3RhbmNlIG9uIE1hY09TWCwgbGliYm9vc3RfdGhyZWFkLmR5bGliCisjIGRvZXNuJ3QgZXhpc3QgYnV0IHRoZXJlJ3MgLW9idmlvdXNseS0gbGliYm9vc3RfdGhyZWFkLW10LmR5bGliKS4KK0FDX0RFRlVOKFtfQk9PU1RfRklORF9MSUJTXSwKK1tCb29zdF9saWI9bm8KKyAgY2FzZSAiJDMiIGluICMoCisgICAgKG10IHwgbXQtKSBib29zdF9tdD0tbXQ7IGJvb3N0X3J0b3B0PTs7ICMoCisgICAgKG10KiB8IG10LSopIGJvb3N0X210PS1tdDsgYm9vc3RfcnRvcHQ9YGV4cHIgIlgkMyIgOiAnWG10LSpcKC4qXCknYDs7ICMoCisgICAgKCopIGJvb3N0X210PTsgYm9vc3RfcnRvcHQ9JDM7OworICBlc2FjCisgIGlmIHRlc3QgJGVuYWJsZV9zdGF0aWNfYm9vc3QgPSB5ZXM7IHRoZW4KKyAgICBib29zdF9ydG9wdD0icyRib29zdF9ydG9wdCIKKyAgZmkKKyAgIyBGaW5kIHRoZSBwcm9wZXIgZGVidWcgdmFyaWFudCBkZXBlbmRpbmcgb24gd2hhdCB3ZSd2ZSBiZWVuIGFza2VkIHRvIGZpbmQuCisgIGNhc2UgJGJvb3N0X3J0b3B0IGluICMoCisgICAgKCpkKikgYm9vc3RfcnRfZD0kYm9vc3RfcnRvcHQ7OyAjKAorICAgICgqW1tzZ3BuXV0qKSAjIEluc2VydCB0aGUgYGQnIGF0IHRoZSByaWdodCBwbGFjZSAoaW4gYmV0d2VlbiBgc2cnIGFuZCBgcG4nKQorICAgICAgYm9vc3RfcnRfZD1gZWNobyAiJGJvb3N0X3J0b3B0IiB8IHNlZCAncy9cKHMqZypcKVwocCpuKlwpL1wxXDIvJ2A7OyAjKAorICAgICgqKSBib29zdF9ydF9kPSctZCc7OworICBlc2FjCisgICMgSWYgdGhlIFBSRUZFUlJFRC1SVC1PUFQgYXJlIG5vdCBlbXB0eSwgcHJlcGVuZCBhIGAtJy4KKyAgdGVzdCAtbiAiJGJvb3N0X3J0b3B0IiAmJiBib29zdF9ydG9wdD0iLSRib29zdF9ydG9wdCIKKyAgJGJvb3N0X2d1ZXNzX3VzZV9tdCAmJiBib29zdF9tdD0tbXQKKyAgIyBMb29rIGZvciB0aGUgYWJzIHBhdGggdGhlIHN0YXRpYyBhcmNoaXZlLgorICAjICRsaWJleHQgaXMgY29tcHV0ZWQgYnkgTGlidG9vbCBidXQgbGV0J3MgbWFrZSBzdXJlIGl0J3Mgbm9uIGVtcHR5LgorICB0ZXN0IC16ICIkbGliZXh0IiAmJgorICAgIEFDX01TR19FUlJPUihbdGhlIGxpYmV4dCB2YXJpYWJsZSBpcyBlbXB0eSwgZGlkIHlvdSBpbnZva2UgTGlidG9vbD9dKQorICBib29zdF9zYXZlX2FjX29iamV4dD0kYWNfb2JqZXh0CisgICMgR2VuZXJhdGUgdGhlIHRlc3QgZmlsZS4KKyAgQUNfTEFOR19DT05GVEVTVChbQUNfTEFOR19QUk9HUkFNKFsjaW5jbHVkZSA8JDQ+CiskNl0sIFskNV0pXSkKK2RubCBPcHRpbWl6YXRpb24gaGFja3M6IGNvbXBpbGluZyBDKysgaXMgc2xvdywgZXNwZWNpYWxseSB3aXRoIEJvb3N0LiAgV2hhdAorZG5sIHdlJ3JlIHRyeWluZyB0byBkbyBoZXJlIGlzIGd1ZXNzIHRoZSByaWdodCBjb21iaW5hdGlvbiBvZiBsaW5rIGZsYWdzCitkbmwgKExJQlMgLyBMREZMQUdTKSB0byB1c2UgYSBnaXZlbiBsaWJyYXJ5LiAgVGhpcyBjYW4gdGFrZSBzZXZlcmFsCitkbmwgaXRlcmF0aW9ucyBiZWZvcmUgaXQgc3VjY2VlZHMgYW5kIGlzIHRodXMgKnZlcnkqIHNsb3cuICBTbyB3aGF0IHdlIGRvCitkbmwgaW5zdGVhZCBpcyB0aGF0IHdlIGNvbXBpbGUgdGhlIGNvZGUgZmlyc3QgKGFuZCB0aHVzIGdldCBhbiBvYmplY3QgZmlsZSwKK2RubCB0eXBpY2FsbHkgY29uZnRlc3QubykuICBUaGVuIHdlIHRyeSB2YXJpb3VzIGNvbWJpbmF0aW9ucyBvZiBsaW5rIGZsYWdzCitkbmwgdW50aWwgd2Ugc3VjY2VlZCB0byBsaW5rIGNvbmZ0ZXN0Lm8gaW4gYW4gZXhlY3V0YWJsZS4gIFRoZSBwcm9ibGVtIGlzCitkbmwgdGhhdCB0aGUgdmFyaW91cyBUUllfTElOSyAvIENPTVBJTEVfSUZFTFNFIG1hY3JvcyBvZiBBdXRvY29uZiBhbHdheXMKK2RubCByZW1vdmUgYWxsIHRoZSB0ZW1wb3JhcnkgZmlsZXMgaW5jbHVkaW5nIGNvbmZ0ZXN0Lm8uICBTbyB0aGUgdHJpY2sgaGVyZQorZG5sIGlzIHRvIHRlbXBvcmFyaWx5IGNoYW5nZSB0aGUgdmFsdWUgb2YgYWNfb2JqZXh0IHNvIHRoYXQgY29uZnRlc3QubyBpcworZG5sIHByZXNlcnZlZCBhY2Nyb3NzIHRlc3RzLiAgVGhpcyBpcyBvYnZpb3VzbHkgZnJhZ2lsZSBhbmQgSSB3aWxsIGJ1cm4gaW4KK2RubCBoZWxsIGZvciBub3QgcmVzcGVjdGluZyBBdXRvY29uZidzIGRvY3VtZW50ZWQgaW50ZXJmYWNlcywgYnV0IGluIHRoZQorZG5sIG1lYW4gdGltZSwgaXQgb3B0aW1pemVzIHRoZSBtYWNybyBieSBhIGZhY3RvciBvZiA1IHRvIDMwLgorZG5sIEFub3RoZXIgc21hbGwgb3B0aW1pemF0aW9uOiB0aGUgZmlyc3QgYXJndW1lbnQgb2YgQUNfQ09NUElMRV9JRkVMU0UgbGVmdAorZG5sIGVtcHR5IGJlY2F1c2UgdGhlIHRlc3QgZmlsZSBpcyBnZW5lcmF0ZWQgb25seSBvbmNlIGFib3ZlIChiZWZvcmUgd2UKK2RubCBzdGFydCB0aGUgZm9yIGxvb3BzKS4KKyAgQUNfQ09NUElMRV9JRkVMU0UoW10sCisgICAgW2FjX29iamV4dD1kb19ub3Rfcm1fbWVfcGx6XSwKKyAgICBbQUNfTVNHX0VSUk9SKFtjYW5ub3QgY29tcGlsZSBhIHRlc3QgdGhhdCB1c2VzIEJvb3N0ICQxXSldKQorICBhY19vYmpleHQ9JGJvb3N0X3NhdmVfYWNfb2JqZXh0CisgIGJvb3N0X2ZhaWxlZF9saWJzPQorIyBEb24ndCBib3RoZXIgdG8gaWRlbnQgdGhlIGZvbGxvd2luZyBuZXN0ZWQgZm9yIGxvb3BzLCBvbmx5IHRoZSAyCisjIGlubmVybW9zdCBvbmVzIG1hdHRlci4KK2ZvciBib29zdF9saWJfIGluICQyOyBkbworZm9yIGJvb3N0X3RhZ18gaW4gLSRib29zdF9jdl9saWJfdGFnICcnOyBkbworZm9yIGJvb3N0X3Zlcl8gaW4gLSRib29zdF9jdl9saWJfdmVyc2lvbiAnJzsgZG8KK2ZvciBib29zdF9tdF8gaW4gJGJvb3N0X210IC1tdCAnJzsgZG8KK2ZvciBib29zdF9ydG9wdF8gaW4gJGJvb3N0X3J0b3B0ICcnIC1kOyBkbworICBmb3IgYm9vc3RfbGliIGluIFwKKyAgICBib29zdF8kYm9vc3RfbGliXyRib29zdF90YWdfJGJvb3N0X210XyRib29zdF9ydG9wdF8kYm9vc3RfdmVyXyBcCisgICAgYm9vc3RfJGJvb3N0X2xpYl8kYm9vc3RfdGFnXyRib29zdF9ydG9wdF8kYm9vc3RfdmVyXyBcCisgICAgYm9vc3RfJGJvb3N0X2xpYl8kYm9vc3RfdGFnXyRib29zdF9tdF8kYm9vc3RfdmVyXyBcCisgICAgYm9vc3RfJGJvb3N0X2xpYl8kYm9vc3RfdGFnXyRib29zdF92ZXJfCisgIGRvCisgICAgIyBBdm9pZCB0ZXN0aW5nIHR3aWNlIHRoZSBzYW1lIGxpYgorICAgIGNhc2UgJGJvb3N0X2ZhaWxlZF9saWJzIGluICMoCisgICAgICAoKkAkYm9vc3RfbGliQCopIGNvbnRpbnVlOzsKKyAgICBlc2FjCisgICAgIyBJZiB3aXRoX2Jvb3N0IGlzIGVtcHR5LCB3ZSdsbCBzZWFyY2ggaW4gL2xpYiBmaXJzdCwgd2hpY2ggaXMgbm90IHF1aXRlCisgICAgIyByaWdodCBzbyBpbnN0ZWFkIHdlJ2xsIHRyeSB0byBhIGxvY2F0aW9uIGJhc2VkIG9uIHdoZXJlIHRoZSBoZWFkZXJzIGFyZS4KKyAgICBib29zdF90bXBfbGliPSR3aXRoX2Jvb3N0CisgICAgdGVzdCB4IiR3aXRoX2Jvb3N0IiA9IHggJiYgYm9vc3RfdG1wX2xpYj0ke2Jvb3N0X2N2X2luY19wYXRoJS9pbmNsdWRlfQorICAgIGZvciBib29zdF9sZHBhdGggaW4gIiRib29zdF90bXBfbGliL2xpYiIgJycgXAorICAgICAgICAgICAgIC9vcHQvbG9jYWwvbGliKiAvdXNyL2xvY2FsL2xpYiogL29wdC9saWIqIC91c3IvbGliKiBcCisgICAgICAgICAgICAgIiR3aXRoX2Jvb3N0IiBDOi9Cb29zdC9saWIgL2xpYioKKyAgICBkbworICAgICAgIyBEb24ndCB3YXN0ZSB0aW1lIHdpdGggZGlyZWN0b3JpZXMgdGhhdCBkb24ndCBleGlzdC4KKyAgICAgIGlmIHRlc3QgeCIkYm9vc3RfbGRwYXRoIiAhPSB4ICYmIHRlc3QgISAtZSAiJGJvb3N0X2xkcGF0aCI7IHRoZW4KKyAgICAgICAgY29udGludWUKKyAgICAgIGZpCisgICAgICBib29zdF9zYXZlX0xERkxBR1M9JExERkxBR1MKKyAgICAgICMgQXJlIHdlIGxvb2tpbmcgZm9yIGEgc3RhdGljIGxpYnJhcnk/CisgICAgICBjYXNlICRib29zdF9sZHBhdGg6JGJvb3N0X3J0b3B0XyBpbiAjKAorICAgICAgICAoKj8qOipzKikgIyBZZXMgKE5vbiBlbXB0eSBib29zdF9sZHBhdGggKyBzIGluIHJ0IG9wdCkKKyAgICAgICAgICBCb29zdF9saWJfTElCUz0iJGJvb3N0X2xkcGF0aC9saWIkYm9vc3RfbGliLiRsaWJleHQiCisgICAgICAgICAgdGVzdCAtZSAiJEJvb3N0X2xpYl9MSUJTIiB8fCBjb250aW51ZTs7ICMoCisgICAgICAgICgqKSAjIE5vOiB1c2UgLWxib29zdF9mb28gdG8gZmluZCB0aGUgc2hhcmVkIGxpYnJhcnkuCisgICAgICAgICAgQm9vc3RfbGliX0xJQlM9Ii1sJGJvb3N0X2xpYiI7OworICAgICAgZXNhYworICAgICAgYm9vc3Rfc2F2ZV9MSUJTPSRMSUJTCisgICAgICBMSUJTPSIkQm9vc3RfbGliX0xJQlMgJExJQlMiCisgICAgICB0ZXN0IHgiJGJvb3N0X2xkcGF0aCIgIT0geCAmJiBMREZMQUdTPSIkTERGTEFHUyAtTCRib29zdF9sZHBhdGgiCitkbmwgRmlyc3QgYXJndW1lbnQgb2YgQUNfTElOS19JRkVMU0UgbGVmdCBlbXB0eSBiZWNhdXNlIHRoZSB0ZXN0IGZpbGUgaXMKK2RubCBnZW5lcmF0ZWQgb25seSBvbmNlIGFib3ZlIChiZWZvcmUgd2Ugc3RhcnQgdGhlIGZvciBsb29wcykuCisgICAgICBfQk9PU1RfQUNfTElOS19JRkVMU0UoW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0Jvb3N0X2xpYj15ZXNdLCBbQm9vc3RfbGliPW5vXSkKKyAgICAgIGFjX29iamV4dD0kYm9vc3Rfc2F2ZV9hY19vYmpleHQKKyAgICAgIExERkxBR1M9JGJvb3N0X3NhdmVfTERGTEFHUworICAgICAgTElCUz0kYm9vc3Rfc2F2ZV9MSUJTCisgICAgICBpZiB0ZXN0IHgiJEJvb3N0X2xpYiIgPSB4eWVzOyB0aGVuCisgICAgICAgICMgQ2hlY2sgb3IgdXNlZCBjYWNoZWQgcmVzdWx0IG9mIHdoZXRoZXIgb3Igbm90IHVzaW5nIC1SIG9yCisgICAgICAgICMgLXJwYXRoIG1ha2VzIHNlbnNlLiAgU29tZSBpbXBsZW1lbnRhdGlvbnMgb2YgbGQsIHN1Y2ggYXMgZm9yCisgICAgICAgICMgTWFjIE9TWCwgcmVxdWlyZSAtcnBhdGggYnV0IC1SIGlzIHRoZSBmbGFnIGtub3duIHRvIHdvcmsgb24KKyAgICAgICAgIyBvdGhlciBzeXN0ZW1zLiAgaHR0cHM6Ly9naXRodWIuY29tL3RzdW5hL2Jvb3N0Lm00L2lzc3Vlcy8xOQorICAgICAgICBBQ19DQUNIRV9WQUwoW2Jvb3N0X2N2X3JwYXRoX2xpbmtfbGRmbGFnXSwKKyAgICAgICAgICBbY2FzZSAkYm9vc3RfbGRwYXRoIGluCisgICAgICAgICAgICcnKSAjIE5vdGhpbmcgdG8gZG8uCisgICAgICAgICAgICAgYm9vc3RfY3ZfcnBhdGhfbGlua19sZGZsYWc9CisgICAgICAgICAgICAgYm9vc3RfcnBhdGhfbGlua19sZGZsYWdfZm91bmQ9eWVzOzsKKyAgICAgICAgICAgKikKKyAgICAgICAgICAgIGZvciBib29zdF9jdl9ycGF0aF9saW5rX2xkZmxhZyBpbiAtV2wsLVIsIC1XbCwtcnBhdGgsOyBkbworICAgICAgICAgICAgICBMREZMQUdTPSIkYm9vc3Rfc2F2ZV9MREZMQUdTIC1MJGJvb3N0X2xkcGF0aCAkYm9vc3RfY3ZfcnBhdGhfbGlua19sZGZsYWckYm9vc3RfbGRwYXRoIgorICAgICAgICAgICAgICBMSUJTPSIkYm9vc3Rfc2F2ZV9MSUJTICRCb29zdF9saWJfTElCUyIKKyAgICAgICAgICAgICAgX0JPT1NUX0FDX0xJTktfSUZFTFNFKFtdLAorICAgICAgICAgICAgICAgIFtib29zdF9ycGF0aF9saW5rX2xkZmxhZ19mb3VuZD15ZXMKKyAgICAgICAgICAgICAgICBicmVha10sCisgICAgICAgICAgICAgICAgW2Jvb3N0X3JwYXRoX2xpbmtfbGRmbGFnX2ZvdW5kPW5vXSkKKyAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgIDs7CisgICAgICAgICAgZXNhYworICAgICAgICAgIEFTX0lGKFt0ZXN0ICJ4JGJvb3N0X3JwYXRoX2xpbmtfbGRmbGFnX2ZvdW5kIiAhPSAieHllcyJdLAorICAgICAgICAgICAgW0FDX01TR19FUlJPUihbVW5hYmxlIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHVzZSAtUiBvciAtcnBhdGhdKV0pCisgICAgICAgICAgTERGTEFHUz0kYm9vc3Rfc2F2ZV9MREZMQUdTCisgICAgICAgICAgTElCUz0kYm9vc3Rfc2F2ZV9MSUJTCisgICAgICAgICAgXSkKKyAgICAgICAgdGVzdCB4IiRib29zdF9sZHBhdGgiICE9IHggJiYKKyAgICAgICAgICBCb29zdF9saWJfTERGTEFHUz0iLUwkYm9vc3RfbGRwYXRoICRib29zdF9jdl9ycGF0aF9saW5rX2xkZmxhZyRib29zdF9sZHBhdGgiCisgICAgICAgIEJvb3N0X2xpYl9MRFBBVEg9IiRib29zdF9sZHBhdGgiCisgICAgICAgIGJyZWFrIDcKKyAgICAgIGVsc2UKKyAgICAgICAgYm9vc3RfZmFpbGVkX2xpYnM9IiRib29zdF9mYWlsZWRfbGlic0AkYm9vc3RfbGliQCIKKyAgICAgIGZpCisgICAgZG9uZQorICBkb25lCitkb25lCitkb25lCitkb25lCitkb25lCitkb25lICMgYm9vc3RfbGliXworcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorXSkKKworCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKKyMgQ2hlY2tzIGZvciB0aGUgdmFyaW91cyBCb29zdCBsaWJyYXJpZXMuICMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKKworIyBMaXN0IG9mIGJvb3N0IGxpYnJhcmllczogaHR0cDovL3d3dy5ib29zdC5vcmcvbGlicy9saWJyYXJpZXMuaHRtCisjIFRoZSBwYWdlIGh0dHA6Ly9iZXRhLmJvb3N0Lm9yZy9kb2MvbGlicyBpcyB1c2VmdWw6IGl0IGdpdmVzIHRoZSBmaXJzdCByZWxlYXNlCisjIHZlcnNpb24gb2YgZWFjaCBsaWJyYXJ5IChhbW9uZyBvdGhlciB0aGluZ3MpLgorCisjIEJPT1NUX0RFRlVOKExJQlJBUlksIENPREUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlZmluZSBCT09TVF88TElCUkFSWS1VUFBFUkNBU0U+IGFzIGEgbWFjcm8gdGhhdCBydW5zIENPREUuCisjCisjIFVzZSBpbmRpciB0byBhdm9pZCB0aGUgd2FybmluZyBvbiB1bmRlcnF1b3RlZCBtYWNybyBuYW1lIGdpdmVuIHRvIEFDX0RFRlVOLgorbTRfZGVmaW5lKFtCT09TVF9ERUZVTl0sCitbbTRfaW5kaXIoW0FDX0RFRlVOXSwKKyAgICAgICAgICBtNF90b3VwcGVyKFtCT09TVF8kMV0pLAorW200X3B1c2hkZWYoW0JPT1NUX0xpYnJhcnldLCBbJDFdKWRubAorJDIKK200X3BvcGRlZihbQk9PU1RfTGlicmFyeV0pZG5sCitdKQorXSkKKworIyBCT09TVF9BUlJBWSgpCisjIC0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuQXJyYXkKK0JPT1NUX0RFRlVOKFtBcnJheV0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L2FycmF5LmhwcF0pXSkKKworCisjIEJPT1NUX0FTSU8oKQorIyAtLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuQXNpbyAobmV3IGluIEJvb3N0IDEuMzUpLgorQk9PU1RfREVGVU4oW0FzaW9dLAorW0FDX1JFUVVJUkUoW0JPT1NUX1NZU1RFTV0pZG5sCitCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvYXNpby5ocHBdKV0pCisKKworIyBCT09TVF9CSU5EKCkKKyMgLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkJpbmQuCitCT09TVF9ERUZVTihbQmluZF0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L2JpbmQuaHBwXSldKQorCisKKyMgQk9PU1RfQ0hST05PKCkKKyMgLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuQ2hyb25vLgorQk9PU1RfREVGVU4oW0Nocm9ub10sCitbIyBEbyB3ZSBoYXZlIHRvIGNoZWNrIGZvciBCb29zdC5TeXN0ZW0/ICBUaGlzIGxpbmstdGltZSBkZXBlbmRlbmN5IHdhcworIyBhZGRlZCBhcyBvZiAxLjM1LjAuICBJZiB3ZSBoYXZlIGEgdmVyc2lvbiA8MS4zNSwgd2UgbXVzdCBub3QgYXR0ZW1wdCB0bworIyBmaW5kIEJvb3N0LlN5c3RlbSBhcyBpdCBkaWRuJ3QgZXhpc3QgYnkgdGhlbi4KK2lmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWdlIDEzNTsgdGhlbgorICBCT09TVF9TWVNURU0oWyQxXSkKK2ZpICMgZW5kIG9mIHRoZSBCb29zdC5TeXN0ZW0gY2hlY2suCitib29zdF9maWxlc3lzdGVtX3NhdmVfTElCUz0kTElCUworYm9vc3RfZmlsZXN5c3RlbV9zYXZlX0xERkxBR1M9JExERkxBR1MKK200X3BhdHRlcm5fYWxsb3coW15CT09TVF9TWVNURU1fKExJQlN8TERGTEFHUykkXSlkbmwKK0xJQlM9IiRMSUJTICRCT09TVF9TWVNURU1fTElCUyIKK0xERkxBR1M9IiRMREZMQUdTICRCT09TVF9TWVNURU1fTERGTEFHUyIKK0JPT1NUX0ZJTkRfTElCKFtjaHJvbm9dLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9jaHJvbm8uaHBwXSwKKyAgICAgICAgICAgICAgICBbYm9vc3Q6OmNocm9ubzo6dGhyZWFkX2Nsb2NrIGQ7XSkKK2lmIHRlc3QgJGVuYWJsZV9zdGF0aWNfYm9vc3QgPSB5ZXMgJiYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtZ2UgMTM1OyB0aGVuCisgIEJPT1NUX0NIUk9OT19MSUJTPSIkQk9PU1RfQ0hST05PX0xJQlMgJEJPT1NUX1NZU1RFTV9MSUJTIgorZmkKK0xJQlM9JGJvb3N0X2ZpbGVzeXN0ZW1fc2F2ZV9MSUJTCitMREZMQUdTPSRib29zdF9maWxlc3lzdGVtX3NhdmVfTERGTEFHUworXSkjIEJPT1NUX0NIUk9OTworCisKKyMgQk9PU1RfQ09OVEVYVChbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkNvbnRleHQuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorIworIyAqIFRoaXMgbGlicmFyeSB3YXMgaW50cm9kdWNlZCBpbiBCb29zdCAxLjUxLjAKKyMgKiBUaGUgc2lnbmF0dXJlcyBvZiBtYWtlX2Zjb250ZXh0KCkgYW5kIGp1bXBfZmNvbnRleHQgd2VyZSBjaGFuZ2VkIGluIDEuNTYuMAorIyAqIEEgZGVwZW5kZW5jeSBvbiBib29zdF90aHJlYWQgYXBwZWFycyBpbiAxLjU3LjAKK0JPT1NUX0RFRlVOKFtDb250ZXh0XSwKK1tib29zdF9jb250ZXh0X3NhdmVfTElCUz0kTElCUworIGJvb3N0X2NvbnRleHRfc2F2ZV9MREZMQUdTPSRMREZMQUdTCitpZiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxNTc7IHRoZW4KKyAgQk9PU1RfVEhSRUFEKFskMV0pCisgIG00X3BhdHRlcm5fYWxsb3coW15CT09TVF9USFJFQURfKExJQlN8TERGTEFHUykkXSlkbmwKKyAgTElCUz0iJExJQlMgJEJPT1NUX1RIUkVBRF9MSUJTIgorICBMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfVEhSRUFEX0xERkxBR1MiCitmaQorQk9PU1RfRklORF9MSUIoW2NvbnRleHRdLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9jb250ZXh0L2FsbC5ocHBdLFtbCisKKy8vIGNyZWF0ZXMgYSBzdGFjawordm9pZCAqIHN0YWNrX3BvaW50ZXIgPSBuZXcgdm9pZCpbNDA5Nl07CitzdGQ6OnNpemVfdCBjb25zdCBzaXplID0gc2l6ZW9mKHZvaWQqWzQwOTZdKTsKKworI2lmIEJPT1NUX1ZFUlNJT04gPD0gMTA1MTAwCitjdHg6Om1ha2VfZmNvbnRleHQoJmZjLCBmKTsKK3JldHVybiBjdHg6Omp1bXBfZmNvbnRleHQoJmZjbSwgJmZjLCAzKSA9PSA2OworCisjZWxzZQorCitmYyA9IGN0eDo6bWFrZV9mY29udGV4dChzdGFja19wb2ludGVyLCBzaXplLCBmKTsKK3JldHVybiBjdHg6Omp1bXBfZmNvbnRleHQoJmZjbSwgZmMsIDMpID09IDY7CisKKyNlbmRpZgorCisKK11dLFtkbmwKKworI2luY2x1ZGUgPGJvb3N0L3ZlcnNpb24uaHBwPgorI2lmIEJPT1NUX1ZFUlNJT04gPD0gMTA1MTAwCisKK25hbWVzcGFjZSBjdHggPSBib29zdDo6Y3R4OworCitzdGF0aWMgY3R4OjpmY29udGV4dF90IGZjbSwgZmM7CisKK3N0YXRpYyB2b2lkIGYoaW50cHRyX3QgaSkgeworICAgIGN0eDo6anVtcF9mY29udGV4dCgmZmMsICZmY20sIGkgKiAyKTsKK30KKworI2VsaWYgQk9PU1RfVkVSU0lPTiA8PSAxMDU1MDAKKworbmFtZXNwYWNlIGN0eCA9IGJvb3N0Ojpjb250ZXh0OworCisvLyBjb250ZXh0CitzdGF0aWMgY3R4OjpmY29udGV4dF90IGZjbSwgKmZjOworCisvLyBjb250ZXh0LWZ1bmN0aW9uCitzdGF0aWMgdm9pZCBmKGludHB0cl90IGkpIHsKKyAgICBjdHg6Omp1bXBfZmNvbnRleHQoZmMsICZmY20sIGkgKiAyKTsKK30KKworI2Vsc2UKKworbmFtZXNwYWNlIGN0eCA9IGJvb3N0Ojpjb250ZXh0OworCisvLyBjb250ZXh0CitzdGF0aWMgY3R4OjpmY29udGV4dF90IGZjbSwgZmM7CisKKy8vIGNvbnRleHQtZnVuY3Rpb24KK3N0YXRpYyB2b2lkIGYoaW50cHRyX3QgaSkgeworICAgIGN0eDo6anVtcF9mY29udGV4dCgmZmMsIGZjbSwgaSAqIDIpOworfQorI2VuZGlmCitdKQorTElCUz0kYm9vc3RfY29udGV4dF9zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X2NvbnRleHRfc2F2ZV9MREZMQUdTCitdKSMgQk9PU1RfQ09OVEVYVAorCisKKyMgQk9PU1RfQ09OVkVSU0lPTigpCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5Db252ZXJzaW9uIChjYXN0IC8gbGV4aWNhbF9jYXN0KQorQk9PU1RfREVGVU4oW0NvbnZlcnNpb25dLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9jYXN0LmhwcF0pCitCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvbGV4aWNhbF9jYXN0LmhwcF0pCitdKSMgQk9PU1RfQ09OVkVSU0lPTgorCisKKyMgQk9PU1RfQ09ST1VUSU5FKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuQ29yb3V0aW5lLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsIHNlZSB0aGUKKyMgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4gIFRoaXMgbGlicmFyeSB3YXMgaW50cm9kdWNlZCBpbiBCb29zdAorIyAxLjUzLjAKK0JPT1NUX0RFRlVOKFtDb3JvdXRpbmVdLAorWworYm9vc3RfY29yb3V0aW5lX3NhdmVfTElCUz0kTElCUworYm9vc3RfY29yb3V0aW5lX3NhdmVfTERGTEFHUz0kTERGTEFHUworIyBMaW5rLXRpbWUgZGVwZW5kZW5jeSBmcm9tIGNvcm91dGluZSB0byBjb250ZXh0CitCT09TVF9DT05URVhUKFskMV0pCisjIFN0YXJ0aW5nIGZyb20gQm9vc3QgMS41NSBhIGRlcGVuZGVuY3kgb24gQm9vc3QuU3lzdGVtIGlzIGFkZGVkCitpZiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxNTU7IHRoZW4KKyAgQk9PU1RfU1lTVEVNKFskMV0pCitmaQorbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUXyhDT05URVhUfFNZU1RFTSlfKExJQlN8TERGTEFHUyldKQorTElCUz0iJExJQlMgJEJPT1NUX0NPTlRFWFRfTElCUyAkQk9PU1RfU1lTVEVNX0xJQlMiCitMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfQ09OVEVYVF9MREZMQUdTIgorCisjIGluIDEuNTMgY29yb3V0aW5lIHdhcyBhIGhlYWRlciBvbmx5IGxpYnJhcnkKK2lmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWVxIDE1MzsgdGhlbgorICBCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvY29yb3V0aW5lL2Nvcm91dGluZS5ocHBdKQorZWxzZQorICBCT09TVF9GSU5EX0xJQihbY29yb3V0aW5lXSwgWyQxXSwKKwkJICBbYm9vc3QvY29yb3V0aW5lL2Nvcm91dGluZS5ocHBdLAorCQkgIFsKKyAgI2luY2x1ZGUgPGJvb3N0L3ZlcnNpb24uaHBwPgorICAjaWYgICBCT09TVF9WRVJTSU9OIDw9IDEwNTUwMAorICBib29zdDo6Y29yb3V0aW5lczo6Y29yb3V0aW5lPGludChpbnQpPiBjb3JvOyBjb3JvLmdldCgpOworICAjZWxzZQorICBib29zdDo6Y29yb3V0aW5lczo6YXN5bW1ldHJpY19jb3JvdXRpbmU8aW50Pjo6cHVsbF90eXBlIGNvcm87IGNvcm8uZ2V0KCk7CisgICNlbmRpZgorICBdKQorZmkKKyMgTGluay10aW1lIGRlcGVuZGVuY3kgZnJvbSBjb3JvdXRpbmUgdG8gY29udGV4dCwgZXhpc3RlZCBvbmx5IGluIDEuNTMsIGluIDEuNTQKKyMgY29yb3V0aW5lIGRvZXNuJ3QgdXNlIGNvbnRleHQgZnJvbSBpdHMgaGVhZGVycyBidXQgZnJvbSBpdHMgbGlicmFyeS4KK2lmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWVxIDE1MyB8fCB0ZXN0ICRlbmFibGVfc3RhdGljX2Jvb3N0ID0geWVzICYmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWdlIDE1NDsgdGhlbgorICBCT09TVF9DT1JPVVRJTkVfTElCUz0iJEJPT1NUX0NPUk9VVElORV9MSUJTICRCT09TVF9DT05URVhUX0xJQlMiCisgIEJPT1NUX0NPUk9VVElORV9MREZMQUdTPSIkQk9PU1RfQ09ST1VUSU5FX0xERkxBR1MgJEJPT1NUX0NPTlRFWFRfTERGTEFHUyIKK2ZpCitpZiB0ZXN0ICRlbmFibGVfc3RhdGljX2Jvb3N0ID0geWVzICYmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWdlIDE1NTsgdGhlbgorICBCT09TVF9DT1JPVVRJTkVfTElCUz0iJEJPT1NUX0NPUk9VVElORV9MSUJTICRCT09TVF9TWVNURU1fTElCUyIKKyAgQk9PU1RfQ09ST1VUSU5FX0xERkxBR1M9IiRCT09TVF9DT1JPVVRJTkVfTERGTEFHUyAkQk9PU1RfU1lTVEVNX0xERkxBR1MiCitmaQorTElCUz0kYm9vc3RfY29yb3V0aW5lX3NhdmVfTElCUworTERGTEFHUz0kYm9vc3RfY29yb3V0aW5lX3NhdmVfTERGTEFHUworXSkjIEJPT1NUX0NPUk9VVElORQorCisKKyMgQk9PU1RfQ1JDKCkKKyMgLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuQ1JDCitCT09TVF9ERUZVTihbQ1JDXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvY3JjLmhwcF0pCitdKSMgQk9PU1RfQ1JDCisKKworIyBCT09TVF9EQVRFX1RJTUUoW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5EYXRlX1RpbWUuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW0RhdGVfVGltZV0sCitbQk9PU1RfRklORF9MSUIoW2RhdGVfdGltZV0sIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L2RhdGVfdGltZS9wb3NpeF90aW1lL3Bvc2l4X3RpbWUuaHBwXSwKKyAgICAgICAgICAgICAgICBbYm9vc3Q6OnBvc2l4X3RpbWU6OnB0aW1lIHQ7XSkKK10pIyBCT09TVF9EQVRFX1RJTUUKKworCisjIEJPT1NUX0ZJTEVTWVNURU0oW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuRmlsZXN5c3RlbS4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUKKyMgdGhlIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCisjIERvIG5vdCBjaGVjayBmb3IgYm9vc3QvZmlsZXN5c3RlbS5ocHAgYmVjYXVzZSB0aGlzIGZpbGUgd2FzIGludHJvZHVjZWQgaW4KKyMgMS4zNC4KK0JPT1NUX0RFRlVOKFtGaWxlc3lzdGVtXSwKK1sjIERvIHdlIGhhdmUgdG8gY2hlY2sgZm9yIEJvb3N0LlN5c3RlbT8gIFRoaXMgbGluay10aW1lIGRlcGVuZGVuY3kgd2FzCisjIGFkZGVkIGFzIG9mIDEuMzUuMC4gIElmIHdlIGhhdmUgYSB2ZXJzaW9uIDwxLjM1LCB3ZSBtdXN0IG5vdCBhdHRlbXB0IHRvCisjIGZpbmQgQm9vc3QuU3lzdGVtIGFzIGl0IGRpZG4ndCBleGlzdCBieSB0aGVuLgoraWYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtZ2UgMTM1OyB0aGVuCisgIEJPT1NUX1NZU1RFTShbJDFdKQorZmkgIyBlbmQgb2YgdGhlIEJvb3N0LlN5c3RlbSBjaGVjay4KK2Jvb3N0X2ZpbGVzeXN0ZW1fc2F2ZV9MSUJTPSRMSUJTCitib29zdF9maWxlc3lzdGVtX3NhdmVfTERGTEFHUz0kTERGTEFHUworbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX1NZU1RFTV8oTElCU3xMREZMQUdTKSRdKWRubAorTElCUz0iJExJQlMgJEJPT1NUX1NZU1RFTV9MSUJTIgorTERGTEFHUz0iJExERkxBR1MgJEJPT1NUX1NZU1RFTV9MREZMQUdTIgorQk9PU1RfRklORF9MSUIoW2ZpbGVzeXN0ZW1dLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9maWxlc3lzdGVtL3BhdGguaHBwXSwgW2Jvb3N0OjpmaWxlc3lzdGVtOjpwYXRoIHA7XSkKK2lmIHRlc3QgJGVuYWJsZV9zdGF0aWNfYm9vc3QgPSB5ZXMgJiYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtZ2UgMTM1OyB0aGVuCisgIEJPT1NUX0ZJTEVTWVNURU1fTElCUz0iJEJPT1NUX0ZJTEVTWVNURU1fTElCUyAkQk9PU1RfU1lTVEVNX0xJQlMiCitmaQorTElCUz0kYm9vc3RfZmlsZXN5c3RlbV9zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X2ZpbGVzeXN0ZW1fc2F2ZV9MREZMQUdTCitdKSMgQk9PU1RfRklMRVNZU1RFTQorCisKKyMgQk9PU1RfRkxZV0VJR0hUKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuRmx5d2VpZ2h0LgorQk9PU1RfREVGVU4oW0ZseXdlaWdodF0sCitbZG5sIFRoZXJlJ3MgYSBoaWRkZW4gZGVwZW5kZW5jeSBvbiBwdGhyZWFkcy4KK0FDX1JFUVVJUkUoW19CT09TVF9QVEhSRUFEX0ZMQUddKWRubAorQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L2ZseXdlaWdodC5ocHBdKQorQUNfU1VCU1QoW0JPT1NUX0ZMWVdFSUdIVF9MSUJTXSwgWyRib29zdF9jdl9wdGhyZWFkX2ZsYWddKQorXSkKKworCisjIEJPT1NUX0ZPUkVBQ0goKQorIyAtLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuRm9yZWFjaC4KK0JPT1NUX0RFRlVOKFtGb3JlYWNoXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvZm9yZWFjaC5ocHBdKV0pCisKKworIyBCT09TVF9GT1JNQVQoKQorIyAtLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5Gb3JtYXQuCisjIE5vdGU6IHdlIGNhbid0IGNoZWNrIGZvciBib29zdC9mb3JtYXQvZm9ybWF0X2Z3ZC5ocHAgYmVjYXVzZSB0aGUgaGVhZGVyIGlzbid0CisjIHN0YW5kYWxvbmUuICBJdCBjYW4ndCBiZSBjb21waWxlZCBiZWNhdXNlIGl0IHRyaWdnZXJzIHRoZSBmb2xsb3dpbmcgZXJyb3I6CisjIGJvb3N0L2Zvcm1hdC9kZXRhaWwvY29uZmlnX21hY3Jvcy5ocHA6ODg6IGVycm9yOiAnbG9jYWxlJyBpbiBuYW1lc3BhY2UgJ3N0ZCcKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZXMgbm90IG5hbWUgYSB0eXBlCitCT09TVF9ERUZVTihbRm9ybWF0XSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvZm9ybWF0LmhwcF0pXSkKKworCisjIEJPT1NUX0ZVTkNUSU9OKCkKKyMgLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5GdW5jdGlvbgorQk9PU1RfREVGVU4oW0Z1bmN0aW9uXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvZnVuY3Rpb24uaHBwXSldKQorCisKKyMgQk9PU1RfR0VPTUVUUlkoKQorIyAtLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0Lkdlb21ldHJ5IChuZXcgc2luY2UgMS40Ny4wKS4KK0JPT1NUX0RFRlVOKFtHZW9tZXRyeV0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L2dlb21ldHJ5LmhwcF0pCitdKSMgQk9PU1RfR0VPTUVUUlkKKworCisjIEJPT1NUX0dSQVBIKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5HcmFwaHMuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW0dyYXBoXSwKK1tib29zdF9ncmFwaF9zYXZlX0xJQlM9JExJQlMKK2Jvb3N0X2dyYXBoX3NhdmVfTERGTEFHUz0kTERGTEFHUworIyBMaW5rLXRpbWUgZGVwZW5kZW5jeSBmcm9tIGdyYXBoIHRvIHJlZ2V4IHdhcyBhZGRlZCBhcyBvZiAxLjQwLjAuCitpZiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxNDA7IHRoZW4KKyAgQk9PU1RfUkVHRVgoWyQxXSkKKyAgbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX1JFR0VYXyhMSUJTfExERkxBR1MpJF0pZG5sCisgIExJQlM9IiRMSUJTICRCT09TVF9SRUdFWF9MSUJTIgorICBMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfUkVHRVhfTERGTEFHUyIKK2ZpCitCT09TVF9GSU5EX0xJQihbZ3JhcGhdLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9ncmFwaC9hZGphY2VuY3lfbGlzdC5ocHBdLCBbYm9vc3Q6OmFkamFjZW5jeV9saXN0PD4gZztdKQorTElCUz0kYm9vc3RfZ3JhcGhfc2F2ZV9MSUJTCitMREZMQUdTPSRib29zdF9ncmFwaF9zYXZlX0xERkxBR1MKK10pIyBCT09TVF9HUkFQSAorCisKKyMgQk9PU1RfSU9TVFJFQU1TKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuSU9TdHJlYW1zLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsIHNlZSB0aGUKKyMgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4KK0JPT1NUX0RFRlVOKFtJT1N0cmVhbXNdLAorW0JPT1NUX0ZJTkRfTElCKFtpb3N0cmVhbXNdLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9pb3N0cmVhbXMvZGV2aWNlL2ZpbGVfZGVzY3JpcHRvci5ocHBdLAorICAgICAgICAgICAgICAgIFtib29zdDo6aW9zdHJlYW1zOjpmaWxlX2Rlc2NyaXB0b3IgZmQ7IGZkLmNsb3NlKCk7XSkKK10pIyBCT09TVF9JT1NUUkVBTVMKKworCisjIEJPT1NUX0hBU0goKQorIyAtLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuRnVuY3Rpb25hbC9IYXNoCitCT09TVF9ERUZVTihbSGFzaF0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L2Z1bmN0aW9uYWwvaGFzaC5ocHBdKV0pCisKKworIyBCT09TVF9MQU1CREEoKQorIyAtLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5MYW1iZGEKK0JPT1NUX0RFRlVOKFtMYW1iZGFdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9sYW1iZGEvbGFtYmRhLmhwcF0pXSkKKworCisjIEJPT1NUX0xPQ0FMRSgpCisjIC0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkxvY2FsZQorQk9PU1RfREVGVU4oW0xvY2FsZV0sCitbCitib29zdF9sb2NhbGVfc2F2ZV9MSUJTPSRMSUJTCitib29zdF9sb2NhbGVfc2F2ZV9MREZMQUdTPSRMREZMQUdTCisjIHJlcXVpcmUgU1lTVEVNIGZvciBib29zdC0xLjUwLjAgYW5kIHVwCitpZiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxNTA7IHRoZW4KKyAgQk9PU1RfU1lTVEVNKFskMV0pCisgIG00X3BhdHRlcm5fYWxsb3coW15CT09TVF9TWVNURU1fKExJQlN8TERGTEFHUykkXSlkbmwKKyAgTElCUz0iJExJQlMgJEJPT1NUX1NZU1RFTV9MSUJTIgorICBMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfU1lTVEVNX0xERkxBR1MiCitmaSAjIGVuZCBvZiB0aGUgQm9vc3QuU3lzdGVtIGNoZWNrLgorQk9PU1RfRklORF9MSUIoW2xvY2FsZV0sIFskMV0sCisgICAgW2Jvb3N0L2xvY2FsZS5ocHBdLAorICAgIFtbYm9vc3Q6OmxvY2FsZTo6Z2VuZXJhdG9yIGdlbjsgc3RkOjpsb2NhbGU6Omdsb2JhbChnZW4oIiIpKTtdXSkKK0xJQlM9JGJvb3N0X2xvY2FsZV9zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X2xvY2FsZV9zYXZlX0xERkxBR1MKK10pIyBCT09TVF9MT0NBTEUKKworIyBCT09TVF9MT0coW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5Mb2cuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW0xvZ10sCitbYm9vc3RfbG9nX3NhdmVfTElCUz0kTElCUworYm9vc3RfbG9nX3NhdmVfTERGTEFHUz0kTERGTEFHUworQk9PU1RfU1lTVEVNKFskMV0pCitCT09TVF9GSUxFU1lTVEVNKFskMV0pCitCT09TVF9EQVRFX1RJTUUoWyQxXSkKK200X3BhdHRlcm5fYWxsb3coW15CT09TVF8oU1lTVEVNfEZJTEVTWVNURU18REFURV9USU1FKV8oTElCU3xMREZMQUdTKSRdKWRubAorTElCUz0iJExJQlMgJEJPT1NUX0RBVEVfVElNRV9MSUJTICRCT09TVF9GSUxFU1lTVEVNX0xJQlMgJEJPT1NUX1NZU1RFTV9MSUJTIgorTERGTEFHUz0iJExERkxBR1MgJEJPT1NUX0RBVEVfVElNRV9MREZMQUdTICRCT09TVF9GSUxFU1lTVEVNX0xERkxBR1MgJEJPT1NUX1NZU1RFTV9MREZMQUdTIgorQk9PU1RfRklORF9MSUIoW2xvZ10sIFskMV0sCisgICAgW2Jvb3N0L2xvZy9jb3JlL2NvcmUuaHBwXSwKKyAgICBbYm9vc3Q6OmxvZzo6YXR0cmlidXRlIGE7IGEuZ2V0X3ZhbHVlKCk7XSkKK0xJQlM9JGJvb3N0X2xvZ19zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X2xvZ19zYXZlX0xERkxBR1MKK10pIyBCT09TVF9MT0cKKworCisjIEJPT1NUX0xPR19TRVRVUChbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkxvZy4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbTG9nX1NldHVwXSwKK1tib29zdF9sb2dfc2V0dXBfc2F2ZV9MSUJTPSRMSUJTCitib29zdF9sb2dfc2V0dXBfc2F2ZV9MREZMQUdTPSRMREZMQUdTCitCT09TVF9MT0coWyQxXSkKK200X3BhdHRlcm5fYWxsb3coW15CT09TVF9MT0dfKExJQlN8TERGTEFHUykkXSlkbmwKK0xJQlM9IiRMSUJTICRCT09TVF9MT0dfTElCUyIKK0xERkxBR1M9IiRMREZMQUdTICRCT09TVF9MT0dfTERGTEFHUyIKK0JPT1NUX0ZJTkRfTElCKFtsb2dfc2V0dXBdLCBbJDFdLAorICAgIFtib29zdC9sb2cvdXRpbGl0eS9zZXR1cC9mcm9tX3NldHRpbmdzLmhwcF0sCisgICAgW2Jvb3N0Ojpsb2c6OmJhc2ljX3NldHRpbmdzPGNoYXI+IGJzOyBicy5lbXB0eSgpO10pCitMSUJTPSRib29zdF9sb2dfc2V0dXBfc2F2ZV9MSUJTCitMREZMQUdTPSRib29zdF9sb2dfc2V0dXBfc2F2ZV9MREZMQUdTCitdKSMgQk9PU1RfTE9HX1NFVFVQCisKKworIyBCT09TVF9NQVRIKCkKKyMgLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0Lk1hdGgKKyMgVE9ETzogVGhpcyBsaWJyYXJ5IGlzbid0IGhlYWRlci1vbmx5IGJ1dCBpdCBjb21lcyBpbiBtdWx0aXBsZSBkaWZmZXJlbnQKKyMgZmxhdm9ycyB0aGF0IGRvbid0IHBsYXkgd2VsbCB3aXRoIEJPT1NUX0ZJTkRfTElCIChlLmcsIGxpYmJvb3N0X21hdGhfYzk5LAorIyBsaWJib29zdF9tYXRoX2M5OWYsIGxpYmJvb3N0X21hdGhfYzk5bCwgbGliYm9vc3RfbWF0aF90cjEsCisjIGxpYmJvb3N0X21hdGhfdHIxZiwgbGliYm9vc3RfbWF0aF90cjFsKS4gIFRoaXMgbWFjcm8gbXVzdCBiZSBmaXhlZCB0byBkbyB0aGUKKyMgcmlnaHQgdGhpbmcgYW55d2F5LgorQk9PU1RfREVGVU4oW01hdGhdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9tYXRoL3NwZWNpYWxfZnVuY3Rpb25zLmhwcF0pXSkKKworCisjIEJPT1NUX01QSShbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QgTVBJLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsIHNlZSB0aGUKKyMgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4gIFVzZXMgTVBJQ1hYIHZhcmlhYmxlIGlmIGl0IGlzCisjIHNldCwgb3RoZXJ3aXNlIHRyaWVzIENYWAorIworQk9PU1RfREVGVU4oW01QSV0sCitbYm9vc3Rfc2F2ZV9DWFg9JHtDWFh9Citib29zdF9zYXZlX0NYWENQUD0ke0NYWENQUH0KK2lmIHRlc3QgeCIke01QSUNYWH0iICE9IHg7IHRoZW4KKyAgQ1hYPSR7TVBJQ1hYfQorICBDWFhDUFA9IiR7TVBJQ1hYfSAtRSIKK2ZpCitCT09TVF9GSU5EX0xJQihbbXBpXSwgWyQxXSwKKyAgICAgICAgICAgICAgIFtib29zdC9tcGkuaHBwXSwKKyAgICAgICAgICAgICAgIFtpbnQgYXJnYyA9IDA7CisgICAgICAgICAgICAgICAgY2hhciAqKmFyZ3YgPSAwOworICAgICAgICAgICAgICAgIGJvb3N0OjptcGk6OmVudmlyb25tZW50IGVudihhcmdjLGFyZ3YpO10pCitDWFg9JHtib29zdF9zYXZlX0NYWH0KK0NYWENQUD0ke2Jvb3N0X3NhdmVfQ1hYQ1BQfQorXSkjIEJPT1NUX01QSQorCisKKyMgQk9PU1RfTVVMVElBUlJBWSgpCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5NdWx0aUFycmF5CitCT09TVF9ERUZVTihbTXVsdGlBcnJheV0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L211bHRpX2FycmF5LmhwcF0pXSkKKworCisjIEJPT1NUX05VTUVSSUNfVUJMQVMoKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5OdW1lcmljVWJsYXMgKEJhc2ljIExpbmVhciBBbGdlYnJhKQorQk9PU1RfREVGVU4oW051bWVyaWNfVWJsYXNdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9udW1lcmljL3VibGFzL3ZlY3Rvci5ocHBdKQorXSkjIEJPT1NUX05VTUVSSUNfVUJMQVMKKworCisjIEJPT1NUX05VTUVSSUNfQ09OVkVSU0lPTigpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0Lk51bWVyaWNDb252ZXJzaW9uIChwb2xpY3ktYmFzZWQgbnVtZXJpYyBjb252ZXJzaW9uKQorQk9PU1RfREVGVU4oW051bWVyaWNfQ29udmVyc2lvbl0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L251bWVyaWMvY29udmVyc2lvbi9jb252ZXJ0ZXIuaHBwXSkKK10pIyBCT09TVF9OVU1FUklDX0NPTlZFUlNJT04KKworCisjIEJPT1NUX09QVElPTkFMKCkKKyMgLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5PcHRpb25hbAorQk9PU1RfREVGVU4oW09wdGlvbmFsXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3Qvb3B0aW9uYWwuaHBwXSldKQorCisKKyMgQk9PU1RfUFJFUFJPQ0VTU09SKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuUHJlcHJvY2Vzc29yCitCT09TVF9ERUZVTihbUHJlcHJvY2Vzc29yXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvcHJlcHJvY2Vzc29yL3JlcGVhdC5ocHBdKV0pCisKKworIyBCT09TVF9SQU5HRSgpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlJhbmdlCitCT09TVF9ERUZVTihbUmFuZ2VdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9yYW5nZS9hZGFwdG9ycy5ocHBdKV0pCisKKyMgQk9PU1RfVU5PUkRFUkVEKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuVW5vcmRlcmVkCitCT09TVF9ERUZVTihbVW5vcmRlcmVkXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvdW5vcmRlcmVkX21hcC5ocHBdKV0pCisKKworIyBCT09TVF9VVUlEKCkKKyMgLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlV1aWQKK0JPT1NUX0RFRlVOKFtVdWlkXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvdXVpZC91dWlkLmhwcF0pXSkKKworCisjIEJPT1NUX1BST0dSQU1fT1BUSU9OUyhbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlByb2dyYW1fb3B0aW9ucy4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULAorIyBzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbUHJvZ3JhbV9PcHRpb25zXSwKK1tCT09TVF9GSU5EX0xJQihbcHJvZ3JhbV9vcHRpb25zXSwgWyQxXSwKKyAgICAgICAgICAgICAgICBbYm9vc3QvcHJvZ3JhbV9vcHRpb25zLmhwcF0sCisgICAgICAgICAgICAgICAgW2Jvb3N0Ojpwcm9ncmFtX29wdGlvbnM6Om9wdGlvbnNfZGVzY3JpcHRpb24gZCgidGVzdCIpO10pCitdKSMgQk9PU1RfUFJPR1JBTV9PUFRJT05TCisKKworCisjIF9CT09TVF9QWVRIT05fQ09ORklHKFZBUklBQkxFLCBGTEFHKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2F2ZSBWQVJJQUJMRSwgYW5kIGRlZmluZSBpdCB2aWEgYHB5dGhvbi1jb25maWcgLS1GTEFHYC4KKyMgU3Vic3RpdHV0ZSBCT09TVF9QWVRIT05fVkFSSUFCTEUuCittNF9kZWZpbmUoW19CT09TVF9QWVRIT05fQ09ORklHXSwKK1tBQ19TVUJTVChbQk9PU1RfUFlUSE9OXyQxXSwKKyAgICAgICAgICBbYHB5dGhvbi1jb25maWcgLS0kMiAyPi9kZXYvbnVsbGBdKWRubAorYm9vc3RfcHl0aG9uX3NhdmVfJDE9JCQxCiskMT0iJCQxICRCT09TVF9QWVRIT05fJDEiXSkKKworCisjIEJPT1NUX1BZVEhPTihbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlB5dGhvbi4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULAorIyBzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbUHl0aG9uXSwKK1tfQk9PU1RfUFlUSE9OX0NPTkZJRyhbQ1BQRkxBR1NdLCBbaW5jbHVkZXNdKQorX0JPT1NUX1BZVEhPTl9DT05GSUcoW0xERkxBR1NdLCAgIFtsZGZsYWdzXSkKK19CT09TVF9QWVRIT05fQ09ORklHKFtMSUJTXSwgICAgICBbbGlic10pCittNF9wYXR0ZXJuX2FsbG93KFteQk9PU1RfUFlUSE9OX01PRFVMRSRdKWRubAorQk9PU1RfRklORF9MSUJTKFtweXRob25dLCBbcHl0aG9uIHB5dGhvbjNdLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9weXRob24uaHBwXSwKKyAgICAgICAgICAgICAgICBbXSwgW0JPT1NUX1BZVEhPTl9NT0RVTEUoZW1wdHkpIHt9XSkKK0NQUEZMQUdTPSRib29zdF9weXRob25fc2F2ZV9DUFBGTEFHUworTERGTEFHUz0kYm9vc3RfcHl0aG9uX3NhdmVfTERGTEFHUworTElCUz0kYm9vc3RfcHl0aG9uX3NhdmVfTElCUworXSkjIEJPT1NUX1BZVEhPTgorCisKKyMgQk9PU1RfUkVGKCkKKyMgLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuUmVmCitCT09TVF9ERUZVTihbUmVmXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvcmVmLmhwcF0pXSkKKworCisjIEJPT1NUX1JFR0VYKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5SZWdleC4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbUmVnZXhdLAorW0JPT1NUX0ZJTkRfTElCKFtyZWdleF0sIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L3JlZ2V4LmhwcF0sCisgICAgICAgICAgICAgICAgW2Jvb3N0OjpyZWdleCBleHAoIioiKTsgYm9vc3Q6OnJlZ2V4X21hdGNoKCJmb28iLCBleHApO10pCitdKSMgQk9PU1RfUkVHRVgKKworCisjIEJPT1NUX1NFUklBTElaQVRJT04oW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuU2VyaWFsaXphdGlvbi4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUKKyMgdGhlIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbU2VyaWFsaXphdGlvbl0sCitbQk9PU1RfRklORF9MSUIoW3NlcmlhbGl6YXRpb25dLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9hcmNoaXZlL3RleHRfb2FyY2hpdmUuaHBwXSwKKyAgICAgICAgICAgICAgICBbc3RkOjpvc3RyZWFtKiBvID0gMDsgLy8gQ2hlYXAgd2F5IHRvIGdldCBhbiBvc3RyZWFtLi4uCisgICAgICAgICAgICAgICAgYm9vc3Q6OmFyY2hpdmU6OnRleHRfb2FyY2hpdmUgdCgqbyk7XSkKK10pIyBCT09TVF9TRVJJQUxJWkFUSU9OCisKKworIyBCT09TVF9TSUdOQUxTKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlNpZ25hbHMuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW1NpZ25hbHNdLAorW0JPT1NUX0ZJTkRfTElCKFtzaWduYWxzXSwgWyQxXSwKKyAgICAgICAgICAgICAgICBbYm9vc3Qvc2lnbmFsLmhwcF0sCisgICAgICAgICAgICAgICAgW2Jvb3N0OjpzaWduYWw8dm9pZCAoKT4gcztdKQorXSkjIEJPT1NUX1NJR05BTFMKKworCisjIEJPT1NUX1NJR05BTFMyKCkKKyMgLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5TaWduYWxzMiAobmV3IHNpbmNlIDEuMzkuMCkuCitCT09TVF9ERUZVTihbU2lnbmFsczJdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9zaWduYWxzMi5ocHBdKQorXSkjIEJPT1NUX1NJR05BTFMyCisKKworIyBCT09TVF9TTUFSVF9QVFIoKQorIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5TbWFydFB0cgorQk9PU1RfREVGVU4oW1NtYXJ0X1B0cl0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3Njb3BlZF9wdHIuaHBwXSkKK0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9zaGFyZWRfcHRyLmhwcF0pCitdKQorCisKKyMgQk9PU1RfU1RBVElDQVNTRVJUKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuU3RhdGljQXNzZXJ0CitCT09TVF9ERUZVTihbU3RhdGljQXNzZXJ0XSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3Qvc3RhdGljX2Fzc2VydC5ocHBdKV0pCisKKworIyBCT09TVF9TVFJJTkdfQUxHTygpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuU3RyaW5nQWxnbworQk9PU1RfREVGVU4oW1N0cmluZ19BbGdvXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvYWxnb3JpdGhtL3N0cmluZy5ocHBdKQorXSkKKworCisjIEJPT1NUX1NZU1RFTShbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlN5c3RlbS4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuICBUaGlzIGxpYnJhcnkgd2FzIGludHJvZHVjZWQgaW4gQm9vc3QKKyMgMS4zNS4wLgorQk9PU1RfREVGVU4oW1N5c3RlbV0sCitbQk9PU1RfRklORF9MSUIoW3N5c3RlbV0sIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L3N5c3RlbS9lcnJvcl9jb2RlLmhwcF0sCisgICAgICAgICAgICAgICAgW2Jvb3N0OjpzeXN0ZW06OmVycm9yX2NvZGUgZTsgZS5jbGVhcigpO10pCitdKSMgQk9PU1RfU1lTVEVNCisKKworIyBCT09TVF9URVNUKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlRlc3QuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW1Rlc3RdLAorW200X3BhdHRlcm5fYWxsb3coW15CT09TVF9DSEVDSyRdKWRubAorQk9PU1RfRklORF9MSUIoW3VuaXRfdGVzdF9mcmFtZXdvcmtdLCBbJDFdLAorICAgICAgICAgICAgICAgW2Jvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcF0sIFtCT09TVF9DSEVDSygyID09IDIpO10sCisgICAgICAgICAgICAgICBbdXNpbmcgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZTsKKyAgICAgICAgICAgICAgIHRlc3Rfc3VpdGUqIGluaXRfdW5pdF90ZXN0X3N1aXRlKGludCBhcmdjLCBjaGFyICoqIGFyZ3YpCisgICAgICAgICAgICAgICB7IHJldHVybiBOVUxMOyB9XSkKK10pIyBCT09TVF9URVNUCisKKworIyBCT09TVF9USFJFQUQoW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuVGhyZWFkLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsIHNlZSB0aGUKKyMgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4KK0JPT1NUX0RFRlVOKFtUaHJlYWRdLAorW2RubCBIYXZpbmcgdGhlIHB0aHJlYWQgZmxhZyBpcyByZXF1aXJlZCBhdCBsZWFzdCBvbiBHQ0MzIHdoZXJlCitkbmwgYm9vc3QvdGhyZWFkLmhwcCB3b3VsZCBjb21wbGFpbiBpZiB3ZSB0cnkgdG8gY29tcGlsZSB3aXRob3V0CitkbmwgLXB0aHJlYWQgb24gR05VL0xpbnV4LgorQUNfUkVRVUlSRShbX0JPT1NUX1BUSFJFQURfRkxBR10pZG5sCitib29zdF90aHJlYWRfc2F2ZV9MSUJTPSRMSUJTCitib29zdF90aHJlYWRfc2F2ZV9MREZMQUdTPSRMREZMQUdTCitib29zdF90aHJlYWRfc2F2ZV9DUFBGTEFHUz0kQ1BQRkxBR1MKKyMgTGluay10aW1lIGRlcGVuZGVuY3kgZnJvbSB0aHJlYWQgdG8gc3lzdGVtIHdhcyBhZGRlZCBhcyBvZiAxLjQ5LjAuCitpZiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxNDk7IHRoZW4KK0JPT1NUX1NZU1RFTShbJDFdKQorZmkgIyBlbmQgb2YgdGhlIEJvb3N0LlN5c3RlbSBjaGVjay4KK200X3BhdHRlcm5fYWxsb3coW15CT09TVF9TWVNURU1fKExJQlN8TERGTEFHUykkXSlkbmwKK0xJQlM9IiRMSUJTICRCT09TVF9TWVNURU1fTElCUyAkYm9vc3RfY3ZfcHRocmVhZF9mbGFnIgorTERGTEFHUz0iJExERkxBR1MgJEJPT1NUX1NZU1RFTV9MREZMQUdTIgorQ1BQRkxBR1M9IiRDUFBGTEFHUyAkYm9vc3RfY3ZfcHRocmVhZF9mbGFnIgorCisjIFdoZW4gY29tcGlsaW5nIGZvciB0aGUgV2luZG93cyBwbGF0Zm9ybSwgdGhlIHRocmVhZHMgbGlicmFyeSBpcyBuYW1lZAorIyBkaWZmZXJlbnRseS4gIFRoaXMgc3VmZml4IGRvZXNuJ3QgZXhpc3QgaW4gbmV3IHZlcnNpb25zIG9mIEJvb3N0LCBvcgorIyBwb3NzaWJseSBuZXcgdmVyc2lvbnMgb2YgR0NDIG9uIG1pbmd3IEkgYW0gYXNzdW1pbmcgaXQncyBCb29zdCdzIGNoYW5nZSBmb3IKKyMgbm93IGFuZCBJIGFtIHNldHRpbmcgdmVyc2lvbiB0byAxLjQ4LCBmb3IgbGFjayBvZiBrbm93bGVkZ2UgYXMgdG8gd2hlbiB0aGlzCisjIGNoYW5nZSBvY2N1cnJlZC4KK2lmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWx0IDE0ODsgdGhlbgorICBjYXNlICRob3N0X29zIGluCisgICAgKCptaW5ndyopIGJvb3N0X3RocmVhZF9saWJfZXh0PV93aW4zMjs7CisgIGVzYWMKK2ZpCitCT09TVF9GSU5EX0xJQlMoW3RocmVhZF0sIFt0aHJlYWQkYm9vc3RfdGhyZWFkX2xpYl9leHRdLAorICAgICAgICAgICAgICAgIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L3RocmVhZC5ocHBdLCBbYm9vc3Q6OnRocmVhZCB0OyBib29zdDo6bXV0ZXggbTtdKQorCitjYXNlICRob3N0X29zIGluCisgICgqbWluZ3cqKSBib29zdF90aHJlYWRfdzMyX3NvY2tldF9saW5rPS1sd3MyXzMyOzsKK2VzYWMKKworQk9PU1RfVEhSRUFEX0xJQlM9IiRCT09TVF9USFJFQURfTElCUyAkQk9PU1RfU1lTVEVNX0xJQlMgJGJvb3N0X2N2X3B0aHJlYWRfZmxhZyAkYm9vc3RfdGhyZWFkX3czMl9zb2NrZXRfbGluayIKK0JPT1NUX1RIUkVBRF9MREZMQUdTPSIkQk9PU1RfU1lTVEVNX0xERkxBR1MiCitCT09TVF9DUFBGTEFHUz0iJEJPT1NUX0NQUEZMQUdTICRib29zdF9jdl9wdGhyZWFkX2ZsYWciCitMSUJTPSRib29zdF90aHJlYWRfc2F2ZV9MSUJTCitMREZMQUdTPSRib29zdF90aHJlYWRfc2F2ZV9MREZMQUdTCitDUFBGTEFHUz0kYm9vc3RfdGhyZWFkX3NhdmVfQ1BQRkxBR1MKK10pIyBCT09TVF9USFJFQUQKKworQVVfQUxJQVMoW0JPT1NUX1RIUkVBRFNdLCBbQk9PU1RfVEhSRUFEXSkKKworCisjIEJPT1NUX1RPS0VOSVpFUigpCisjIC0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlRva2VuaXplcgorQk9PU1RfREVGVU4oW1Rva2VuaXplcl0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3Rva2VuaXplci5ocHBdKV0pCisKKworIyBCT09TVF9UUklCT09MKCkKKyMgLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlRyaWJvb2wKK0JPT1NUX0RFRlVOKFtUcmlib29sXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvbG9naWMvdHJpYm9vbF9md2QuaHBwXSkKK0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9sb2dpYy90cmlib29sLmhwcF0pCitdKQorCisKKyMgQk9PU1RfVFVQTEUoKQorIyAtLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlR1cGxlCitCT09TVF9ERUZVTihbVHVwbGVdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC90dXBsZS90dXBsZS5ocHBdKV0pCisKKworIyBCT09TVF9UWVBFVFJBSVRTKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuVHlwZVRyYWl0cworQk9PU1RfREVGVU4oW1R5cGVUcmFpdHNdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC90eXBlX3RyYWl0cy5ocHBdKV0pCisKKworIyBCT09TVF9VVElMSVRZKCkKKyMgLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlV0aWxpdHkgKG5vbmNvcHlhYmxlLCByZXN1bHRfb2YsIGJhc2UtZnJvbS1tZW1iZXIgaWRpb20sCisjIGV0Yy4pCitCT09TVF9ERUZVTihbVXRpbGl0eV0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3V0aWxpdHkuaHBwXSldKQorCisKKyMgQk9PU1RfVkFSSUFOVCgpCisjIC0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5WYXJpYW50LgorQk9PU1RfREVGVU4oW1ZhcmlhbnRdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC92YXJpYW50L3ZhcmlhbnRfZndkLmhwcF0pCitCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvdmFyaWFudC5ocHBdKV0pCisKKworIyBCT09TVF9QT0lOVEVSX0NPTlRBSU5FUigpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5Qb2ludGVyQ29udGFpbmVyCitCT09TVF9ERUZVTihbUG9pbnRlcl9Db250YWluZXJdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9wdHJfY29udGFpbmVyL3B0cl9kZXF1ZS5ocHBdKQorQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3B0cl9jb250YWluZXIvcHRyX2xpc3QuaHBwXSkKK0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9wdHJfY29udGFpbmVyL3B0cl92ZWN0b3IuaHBwXSkKK0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9wdHJfY29udGFpbmVyL3B0cl9hcnJheS5ocHBdKQorQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3B0cl9jb250YWluZXIvcHRyX3NldC5ocHBdKQorQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3B0cl9jb250YWluZXIvcHRyX21hcC5ocHBdKQorXSkjIEJPT1NUX1BPSU5URVJfQ09OVEFJTkVSCisKKworIyBCT09TVF9XQVZFKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE5PVEU6IElmIHlvdSBpbnRlbmQgdG8gdXNlIFdhdmUvU3Bpcml0IHdpdGggdGhyZWFkIHN1cHBvcnQsIG1ha2Ugc3VyZSB5b3UKKyMgY2FsbCBCT09TVF9USFJFQUQgZmlyc3QuCisjIExvb2sgZm9yIEJvb3N0LldhdmUuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW1dhdmVdLAorW0FDX1JFUVVJUkUoW0JPT1NUX0ZJTEVTWVNURU1dKWRubAorQUNfUkVRVUlSRShbQk9PU1RfREFURV9USU1FXSlkbmwKK2Jvb3N0X3dhdmVfc2F2ZV9MSUJTPSRMSUJTCitib29zdF93YXZlX3NhdmVfTERGTEFHUz0kTERGTEFHUworbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUXygoRklMRSk/U1lTVEVNfERBVEVfVElNRXxUSFJFQUQpXyhMSUJTfExERkxBR1MpJF0pZG5sCitMSUJTPSIkTElCUyAkQk9PU1RfU1lTVEVNX0xJQlMgJEJPT1NUX0ZJTEVTWVNURU1fTElCUyAkQk9PU1RfREFURV9USU1FX0xJQlMgXAorJEJPT1NUX1RIUkVBRF9MSUJTIgorTERGTEFHUz0iJExERkxBR1MgJEJPT1NUX1NZU1RFTV9MREZMQUdTICRCT09TVF9GSUxFU1lTVEVNX0xERkxBR1MgXAorJEJPT1NUX0RBVEVfVElNRV9MREZMQUdTICRCT09TVF9USFJFQURfTERGTEFHUyIKK0JPT1NUX0ZJTkRfTElCKFt3YXZlXSwgWyQxXSwKKyAgICAgICAgICAgICAgICBbYm9vc3Qvd2F2ZS5ocHBdLAorICAgICAgICAgICAgICAgIFtib29zdDo6d2F2ZTo6dG9rZW5faWQgaWQ7IGdldF90b2tlbl9uYW1lKGlkKTtdKQorTElCUz0kYm9vc3Rfd2F2ZV9zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X3dhdmVfc2F2ZV9MREZMQUdTCitdKSMgQk9PU1RfV0FWRQorCisKKyMgQk9PU1RfWFBSRVNTSVZFKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuWHByZXNzaXZlIChuZXcgc2luY2UgMS4zNi4wKS4KK0JPT1NUX0RFRlVOKFtYcHJlc3NpdmVdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC94cHJlc3NpdmUveHByZXNzaXZlLmhwcF0pXSkKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tICMKKyMgSW50ZXJuYWwgaGVscGVycy4gIworIyAtLS0tLS0tLS0tLS0tLS0tLSAjCisKKworIyBfQk9PU1RfUFRIUkVBRF9GTEFHKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEludGVybmFsIGhlbHBlciBmb3IgQk9PU1RfVEhSRUFELiAgQ29tcHV0ZXMgYm9vc3RfY3ZfcHRocmVhZF9mbGFnCisjIHdoaWNoIG11c3QgYmUgdXNlZCBpbiBDUFBGTEFHUyBhbmQgTElCUy4KKyMKKyMgWWVzLCB3ZSAqbmVlZCogdG8gcHV0IHRoZSAtcHRocmVhZCB0aGluZyBpbiBDUFBGTEFHUyBiZWNhdXNlIHdpdGggR0NDMywKKyMgYm9vc3QvdGhyZWFkLmhwcCB3aWxsIHRyaWdnZXIgYSAjZXJyb3IgaWYgLXB0aHJlYWQgaXNuJ3QgdXNlZDoKKyMgICBib29zdC9jb25maWcvcmVxdWlyZXNfdGhyZWFkcy5ocHA6NDc6NTogI2Vycm9yICJDb21waWxlciB0aHJlYWRpbmcgc3VwcG9ydAorIyAgIGlzIG5vdCB0dXJuZWQgb24uIFBsZWFzZSBzZXQgdGhlIGNvcnJlY3QgY29tbWFuZCBsaW5lIG9wdGlvbnMgZm9yCisjICAgdGhyZWFkaW5nOiAtcHRocmVhZCAoTGludXgpLCAtcHRocmVhZHMgKFNvbGFyaXMpIG9yIC1tdGhyZWFkcyAoTWluZ3czMikiCisjCisjIEJhc2VkIG9uIEFDWF9QVEhSRUFEOiBodHRwOi8vYXV0b2NvbmYtYXJjaGl2ZS5jcnlwLnRvL2FjeF9wdGhyZWFkLmh0bWwKK0FDX0RFRlVOKFtfQk9PU1RfUFRIUkVBRF9GTEFHXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0NYWF0pZG5sCitBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCitBQ19MQU5HX1BVU0goW0MrK10pZG5sCitBQ19DQUNIRV9DSEVDSyhbZm9yIHRoZSBmbGFncyBuZWVkZWQgdG8gdXNlIHB0aHJlYWRzXSwgW2Jvb3N0X2N2X3B0aHJlYWRfZmxhZ10sCitbIGJvb3N0X2N2X3B0aHJlYWRfZmxhZz0KKyAgIyBUaGUgb3JkZXJpbmcgKmlzKiAoc29tZXRpbWVzKSBpbXBvcnRhbnQuICBTb21lIG5vdGVzIG9uIHRoZQorICAjIGluZGl2aWR1YWwgaXRlbXMgZm9sbG93OgorICAjIChub25lKTogaW4gY2FzZSB0aHJlYWRzIGFyZSBpbiBsaWJjOyBzaG91bGQgYmUgdHJpZWQgYmVmb3JlIC1LdGhyZWFkIGFuZAorICAjICAgICAgIG90aGVyIGNvbXBpbGVyIGZsYWdzIHRvIHByZXZlbnQgY29udGludWFsIGNvbXBpbGVyIHdhcm5pbmdzCisgICMgLWxwdGhyZWFkczogQUlYIChtdXN0IGNoZWNrIHRoaXMgYmVmb3JlIC1scHRocmVhZCkKKyAgIyAtS3RocmVhZDogU2VxdWVudCAodGhyZWFkcyBpbiBsaWJjLCBidXQgLUt0aHJlYWQgbmVlZGVkIGZvciBwdGhyZWFkLmgpCisgICMgLWt0aHJlYWQ6IEZyZWVCU0Qga2VybmVsIHRocmVhZHMgKHByZWZlcnJlZCB0byAtcHRocmVhZCBzaW5jZSBTTVAtYWJsZSkKKyAgIyAtbGx0aHJlYWQ6IExpbnV4VGhyZWFkcyBwb3J0IG9uIEZyZWVCU0QgKGFsc28gcHJlZmVycmVkIHRvIC1wdGhyZWFkKQorICAjIC1wdGhyZWFkOiBHTlUgTGludXgvR0NDIChrZXJuZWwgdGhyZWFkcyksIEJTRC9HQ0MgKHVzZXJsYW5kIHRocmVhZHMpCisgICMgLXB0aHJlYWRzOiBTb2xhcmlzL0dDQworICAjIC1tdGhyZWFkczogTWluR1czMi9HQ0MsIEx5bngvR0NDCisgICMgLW10OiBTdW4gV29ya3Nob3AgQyAobWF5IG9ubHkgbGluayBTdW5PUyB0aHJlYWRzIFstbHRocmVhZF0sIGJ1dCBpdAorICAjICAgICAgZG9lc24ndCBodXJ0IHRvIGNoZWNrIHNpbmNlIHRoaXMgc29tZXRpbWVzIGRlZmluZXMgcHRocmVhZHMgdG9vOworICAjICAgICAgYWxzbyBkZWZpbmVzIC1EX1JFRU5UUkFOVCkKKyAgIyAgICAgIC4uLiAtbXQgaXMgYWxzbyB0aGUgcHRocmVhZHMgZmxhZyBmb3IgSFAvYUNDCisgICMgLWxwdGhyZWFkOiBHTlUgTGludXgsIGV0Yy4KKyAgIyAtLXRocmVhZC1zYWZlOiBLQUkgQysrCisgIGNhc2UgJGhvc3Rfb3MgaW4gIygKKyAgICAqc29sYXJpcyopCisgICAgICAjIE9uIFNvbGFyaXMgKGF0IGxlYXN0LCBmb3Igc29tZSB2ZXJzaW9ucyksIGxpYmMgY29udGFpbnMgc3R1YmJlZAorICAgICAgIyAobm9uLWZ1bmN0aW9uYWwpIHZlcnNpb25zIG9mIHRoZSBwdGhyZWFkcyByb3V0aW5lcywgc28gbGluay1iYXNlZAorICAgICAgIyB0ZXN0cyB3aWxsIGVycm9uZW91c2x5IHN1Y2NlZWQuICAoV2UgbmVlZCB0byBsaW5rIHdpdGggLXB0aHJlYWRzLy1tdC8KKyAgICAgICMgLWxwdGhyZWFkLikgIChUaGUgc3R1YnMgYXJlIG1pc3NpbmcgcHRocmVhZF9jbGVhbnVwX3B1c2gsIG9yIHJhdGhlcgorICAgICAgIyBhIGZ1bmN0aW9uIGNhbGxlZCBieSB0aGlzIG1hY3JvLCBzbyB3ZSBjb3VsZCBjaGVjayBmb3IgdGhhdCwgYnV0CisgICAgICAjIHdobyBrbm93cyB3aGV0aGVyIHRoZXknbGwgc3R1YiB0aGF0IHRvbyBpbiBhIGZ1dHVyZSBsaWJjLikgIFNvLAorICAgICAgIyB3ZSdsbCBqdXN0IGxvb2sgZm9yIC1wdGhyZWFkcyBhbmQgLWxwdGhyZWFkIGZpcnN0OgorICAgICAgYm9vc3RfcHRocmVhZF9mbGFncz0iLXB0aHJlYWRzIC1scHRocmVhZCAtbXQgLXB0aHJlYWQiOzsgIygKKyAgICAqKQorICAgICAgYm9vc3RfcHRocmVhZF9mbGFncz0iLWxwdGhyZWFkcyAtS3RocmVhZCAta3RocmVhZCAtbGx0aHJlYWQgLXB0aHJlYWQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLXB0aHJlYWRzIC1tdGhyZWFkcyAtbHB0aHJlYWQgLS10aHJlYWQtc2FmZSAtbXQiOzsKKyAgZXNhYworICAjIEdlbmVyYXRlIHRoZSB0ZXN0IGZpbGUuCisgIEFDX0xBTkdfQ09ORlRFU1QoW0FDX0xBTkdfUFJPR1JBTShbI2luY2x1ZGUgPHB0aHJlYWQuaD5dLAorICAgIFtwdGhyZWFkX3QgdGg7IHB0aHJlYWRfam9pbih0aCwgMCk7CisgICAgcHRocmVhZF9hdHRyX2luaXQoMCk7IHB0aHJlYWRfY2xlYW51cF9wdXNoKDAsIDApOworICAgIHB0aHJlYWRfY3JlYXRlKDAsMCwwLDApOyBwdGhyZWFkX2NsZWFudXBfcG9wKDApO10pXSkKKyAgZm9yIGJvb3N0X3B0aHJlYWRfZmxhZyBpbiAnJyAkYm9vc3RfcHRocmVhZF9mbGFnczsgZG8KKyAgICBib29zdF9wdGhyZWFkX29rPWZhbHNlCitkbmwgUmUtdXNlIHRoZSB0ZXN0IGZpbGUgYWxyZWFkeSBnZW5lcmF0ZWQuCisgICAgYm9vc3RfcHRocmVhZHNfX3NhdmVfTElCUz0kTElCUworICAgIExJQlM9IiRMSUJTICRib29zdF9wdGhyZWFkX2ZsYWciCisgICAgQUNfTElOS19JRkVMU0UoW10sCisgICAgICBbaWYgZ3JlcCAiLiokYm9vc3RfcHRocmVhZF9mbGFnIiBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICAgICAgIGVjaG8gIlRoaXMgZmxhZyBzZWVtcyB0byBoYXZlIHRyaWdnZXJlZCB3YXJuaW5ncyIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgIGVsc2UKKyAgICAgICAgIGJvb3N0X3B0aHJlYWRfb2s9OjsgYm9vc3RfY3ZfcHRocmVhZF9mbGFnPSRib29zdF9wdGhyZWFkX2ZsYWcKKyAgICAgICBmaV0pCisgICAgTElCUz0kYm9vc3RfcHRocmVhZHNfX3NhdmVfTElCUworICAgICRib29zdF9wdGhyZWFkX29rICYmIGJyZWFrCisgIGRvbmUKK10pCitBQ19MQU5HX1BPUChbQysrXSlkbmwKK10pIyBfQk9PU1RfUFRIUkVBRF9GTEFHCisKKworIyBfQk9PU1RfZ2NjX3Rlc3QoTUFKT1IsIE1JTk9SKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBJbnRlcm5hbCBoZWxwZXIgZm9yIF9CT09TVF9GSU5EX0NPTVBJTEVSX1RBRy4KK200X2RlZmluZShbX0JPT1NUX2djY190ZXN0XSwKK1siZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA9PSAkMSAmJiBfX0dOVUNfTUlOT1JfXyA9PSAkMiAmJiAhZGVmaW5lZCBfX0lDQyBAIGdjYyQxJDIiXSlkbmwKKworIyBfQk9PU1RfbWluZ3dfdGVzdChNQUpPUiwgTUlOT1IpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEludGVybmFsIGhlbHBlciBmb3IgX0JPT1NUX0ZJTkRfQ09NUElMRVJfVEFHLgorbTRfZGVmaW5lKFtfQk9PU1RfbWluZ3dfdGVzdF0sCitbImRlZmluZWQgX19HTlVDX18gJiYgX19HTlVDX18gPT0gJDEgJiYgX19HTlVDX01JTk9SX18gPT0gJDIgJiYgIWRlZmluZWQgX19JQ0MgJiYgXAorICAoZGVmaW5lZCBXSU4zMiB8fCBkZWZpbmVkIFdJTk5UIHx8IGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMiBcCisgICAgICAgICB8fCBkZWZpbmVkIF9fV0lOMzJfXyB8fCBkZWZpbmVkIF9fV0lOTlQgfHwgZGVmaW5lZCBfX1dJTk5UX18pIEAgbWd3JDEkMiJdKWRubAorCisKKyMgX0JPT1NUX0ZJTkRfQ09NUElMRVJfVEFHKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSW50ZXJuYWwuICBXaGVuIEJvb3N0IGlzIGluc3RhbGxlZCB3aXRob3V0IC0tbGF5b3V0PXN5c3RlbSwgZWFjaCBsaWJyYXJ5CisjIGZpbGVuYW1lIHdpbGwgaG9sZCBhIHN1ZmZpeCB0aGF0IGVuY29kZXMgdGhlIGNvbXBpbGVyIHVzZWQgZHVyaW5nIHRoZQorIyBidWlsZC4gIFRoZSBCb29zdCBidWlsZCBzeXN0ZW0gc2VlbXMgdG8gY2FsbCB0aGlzIGEgYHRhZycuCitBQ19ERUZVTihbX0JPT1NUX0ZJTkRfQ09NUElMRVJfVEFHXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0NYWF0pZG5sCitBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCitBQ19DQUNIRV9DSEVDSyhbZm9yIHRoZSB0b29sc2V0IG5hbWUgdXNlZCBieSBCb29zdCBmb3IgJENYWF0sCisgICAgICAgICAgICAgICBbYm9vc3RfY3ZfbGliX3RhZ10sCitbYm9vc3RfY3ZfbGliX3RhZz11bmtub3duCitpZiB0ZXN0IHgkYm9vc3RfY3ZfaW5jX3BhdGggIT0geG5vOyB0aGVuCisgIEFDX0xBTkdfUFVTSChbQysrXSlkbmwKKyAgIyBUaGUgZm9sbG93aW5nIHRlc3RzIGFyZSBtb3N0bHkgaW5zcGlyZWQgYnkgYm9vc3QvY29uZmlnL2F1dG9fbGluay5ocHAKKyAgIyBUaGUgbGlzdCBpcyBzb3J0ZWQgdG8gbW9zdCByZWNlbnQvY29tbW9uIHRvIG9sZGVzdCBjb21waWxlciAoaW4gb3JkZXIKKyAgIyB0byBpbmNyZWFzZSB0aGUgbGlrZWxpaG9vZCBvZiBmaW5kaW5nIHRoZSByaWdodCBjb21waWxlciB3aXRoIHRoZQorICAjIGxlYXN0IG51bWJlciBvZiBjb21waWxhdGlvbiBhdHRlbXB0KS4KKyAgIyBCZXdhcmUgdGhhdCBzb21lIHRlc3RzIGFyZSBzZW5zaWJsZSB0byB0aGUgb3JkZXIgKGZvciBpbnN0YW5jZSwgd2UgbXVzdAorICAjIGxvb2sgZm9yIE1pbkdXIGJlZm9yZSBsb29raW5nIGZvciBHQ0MzKS4KKyAgIyBJIHVzZWQgb25lIGNvbXBpbGF0aW9uIHRlc3QgcGVyIGNvbXBpbGVyIHdpdGggYSAjZXJyb3IgdG8gcmVjb2duaXplCisgICMgZWFjaCBjb21waWxlciBzbyB0aGF0IGl0IHdvcmtzIGV2ZW4gd2hlbiBjcm9zcy1jb21waWxpbmcgKGxldCBtZSBrbm93CisgICMgaWYgeW91IGtub3cgYSBiZXR0ZXIgYXBwcm9hY2gpLgorICAjIEtub3duIG1pc3NpbmcgdGFncyAoa25vd24gZnJvbSBCb29zdCdzIHRvb2xzL2J1aWxkL3YyL3Rvb2xzL2NvbW1vbi5qYW0pOgorICAjICAgY29tbywgZWRnLCBrY2MsIGJjaywgbXAsIHN3LCB0cnUsIHhsYworICAjIEknbSBub3Qgc3VyZSBhYm91dCBteSB0ZXN0IGZvciBgaWwnIChiZSBjYXJlZnVsOiBJbnRlbCdzIElDQyBwcmUtZGVmaW5lcworICAjIHRoZSBzYW1lIGRlZmluZXMgYXMgR0NDJ3MpLgorICBmb3IgaSBpbiBcCisgICAgX0JPT1NUX21pbmd3X3Rlc3QoNSwgMykgXAorICAgIF9CT09TVF9nY2NfdGVzdCg1LCAzKSBcCisgICAgX0JPT1NUX21pbmd3X3Rlc3QoNSwgMikgXAorICAgIF9CT09TVF9nY2NfdGVzdCg1LCAyKSBcCisgICAgX0JPT1NUX21pbmd3X3Rlc3QoNSwgMSkgXAorICAgIF9CT09TVF9nY2NfdGVzdCg1LCAxKSBcCisgICAgX0JPT1NUX21pbmd3X3Rlc3QoNSwgMCkgXAorICAgIF9CT09TVF9nY2NfdGVzdCg1LCAwKSBcCisgICAgX0JPT1NUX21pbmd3X3Rlc3QoNCwgMTApIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoNCwgMTApIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCA5KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDkpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCA4KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDgpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCA3KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDcpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCA2KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDYpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCA1KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDUpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCA0KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDQpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCAzKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDMpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCAyKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDIpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCAxKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDEpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCAwKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDApIFwKKyAgICAiZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA9PSAzICYmICFkZWZpbmVkIF9fSUNDIFwKKyAgICAgJiYgKGRlZmluZWQgV0lOMzIgfHwgZGVmaW5lZCBXSU5OVCB8fCBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzIgXAorICAgICAgICAgfHwgZGVmaW5lZCBfX1dJTjMyX18gfHwgZGVmaW5lZCBfX1dJTk5UIHx8IGRlZmluZWQgX19XSU5OVF9fKSBAIG1ndyIgXAorICAgIF9CT09TVF9nY2NfdGVzdCgzLCA0KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDMsIDMpIFwKKyAgICAiZGVmaW5lZCBfTVNDX1ZFUiAmJiBfTVNDX1ZFUiA+PSAxNTAwIEAgdmM5MCIgXAorICAgICJkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSID09IDE0MDAgQCB2YzgwIiBcCisgICAgX0JPT1NUX2djY190ZXN0KDMsIDIpIFwKKyAgICAiZGVmaW5lZCBfTVNDX1ZFUiAmJiBfTVNDX1ZFUiA9PSAxMzEwIEAgdmM3MSIgXAorICAgIF9CT09TVF9nY2NfdGVzdCgzLCAxKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDMsIDApIFwKKyAgICAiZGVmaW5lZCBfX0JPUkxBTkRDX18gQCBiY2IiIFwKKyAgICAiZGVmaW5lZCBfX0lDQyAmJiAoZGVmaW5lZCBfX3VuaXggfHwgZGVmaW5lZCBfX3VuaXhfXykgQCBpbCIgXAorICAgICJkZWZpbmVkIF9fSUNMIEAgaXciIFwKKyAgICAiZGVmaW5lZCBfTVNDX1ZFUiAmJiBfTVNDX1ZFUiA9PSAxMzAwIEAgdmM3IiBcCisgICAgX0JPT1NUX2djY190ZXN0KDIsIDk1KSBcCisgICAgImRlZmluZWQgX19NV0VSS1NfXyAmJiBfX01XRVJLU19fIDw9IDB4MzJGRiBAIGN3OSIgXAorICAgICJkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSIDwgMTMwMCAmJiAhZGVmaW5lZCBVTkRFUl9DRSBAIHZjNiIgXAorICAgICJkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSIDwgMTMwMCAmJiBkZWZpbmVkIFVOREVSX0NFIEAgZXZjNCIgXAorICAgICJkZWZpbmVkIF9fTVdFUktTX18gJiYgX19NV0VSS1NfXyA8PSAweDMxRkYgQCBjdzgiCisgIGRvCisgICAgYm9vc3RfdGFnX3Rlc3Q9YGV4cHIgIlgkaSIgOiAnWFwoW1teQF1dKlwpIEAgJ2AKKyAgICBib29zdF90YWc9YGV4cHIgIlgkaSIgOiAnWFtbXkBdXSogQCBcKC4qXCknYAorICAgIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKKyNpZiAkYm9vc3RfdGFnX3Rlc3QKKy8qIE9LICovCisjZWxzZQorIyBlcnJvciAkYm9vc3RfdGFnX3Rlc3QKKyNlbmRpZgorXV0pXSwgW2Jvb3N0X2N2X2xpYl90YWc9JGJvb3N0X3RhZzsgYnJlYWtdLCBbXSkKKyAgZG9uZQorQUNfTEFOR19QT1AoW0MrK10pZG5sCisgIGNhc2UgJGJvb3N0X2N2X2xpYl90YWcgaW4gIygKKyAgICAjIFNvbWUgbmV3ZXIgKD49IDEuMzU/KSB2ZXJzaW9ucyBvZiBCb29zdCBzZWVtIHRvIG9ubHkgdXNlICJnY2MiIGFzIG9wcG9zZWQKKyAgICAjIHRvICJnY2M0MSIgZm9yIGluc3RhbmNlLgorICAgICotZ2NjIHwgKictZ2NjICcpIDo7OyAjKCAgRG9uJ3QgcmUtYWRkIC1nY2M6IGl0J3MgYWxyZWFkeSBpbiB0aGVyZS4KKyAgICBnY2MqKQorICAgICAgYm9vc3RfdGFnX3g9CisgICAgICBjYXNlICRob3N0X29zIGluICMoCisgICAgICAgIGRhcndpbiopCisgICAgICAgICAgaWYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtZ2UgMTM2OyB0aGVuCisgICAgICAgICAgICAjIFRoZSBgeCcgYWRkZWQgaW4gcjQ2NzkzIG9mIEJvb3N0LgorICAgICAgICAgICAgYm9vc3RfdGFnX3g9eAorICAgICAgICAgIGZpOzsKKyAgICAgIGVzYWMKKyAgICAgICMgV2UgY2FuIHNwZWNpZnkgbXVsdGlwbGUgdGFncyBpbiB0aGlzIHZhcmlhYmxlIGJlY2F1c2UgaXQncyB1c2VkIGJ5CisgICAgICAjIEJPT1NUX0ZJTkRfTElCIHRoYXQgZG9lcyBhIGBmb3IgdGFnIGluIC0kYm9vc3RfY3ZfbGliX3RhZycgLi4uCisgICAgICBib29zdF9jdl9saWJfdGFnPSIkYm9vc3RfdGFnX3gkYm9vc3RfY3ZfbGliX3RhZyAtJHtib29zdF90YWdfeH1nY2MiCisgICAgICA7OyAjKAorICAgIHVua25vd24pCisgICAgICBBQ19NU0dfV0FSTihbW2NvdWxkIG5vdCBmaWd1cmUgb3V0IHdoaWNoIHRvb2xzZXQgbmFtZSB0byB1c2UgZm9yICRDWFhdXSkKKyAgICAgIGJvb3N0X2N2X2xpYl90YWc9CisgICAgICA7OworICBlc2FjCitmaV0pZG5sIGVuZCBvZiBBQ19DQUNIRV9DSEVDSworXSkjIF9CT09TVF9GSU5EX0NPTVBJTEVSX1RBRworCisKKyMgX0JPT1NUX0dVRVNTX1dIRVRIRVJfVE9fVVNFX01UKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29tcGlsZSBhIHNtYWxsIHRlc3QgdG8gdHJ5IHRvIGd1ZXNzIHdoZXRoZXIgd2Ugc2hvdWxkIGZhdm9yIE1UIChNdWx0aQorIyBUaHJlYWQpIGZsYXZvcnMgb2YgQm9vc3QuICBTZXRzIGJvb3N0X2d1ZXNzX3VzZV9tdCBhY2NvcmRpbmdseS4KK0FDX0RFRlVOKFtfQk9PU1RfR1VFU1NfV0hFVEhFUl9UT19VU0VfTVRdLAorWyMgQ2hlY2sgd2hldGhlciB3ZSBkbyBiZXR0ZXIgdXNlIGBtdCcgZXZlbiB0aG91Z2ggd2Ugd2VyZW4ndCBhc2sgdG8uCitBQ19MQU5HX1BVU0goW0MrK10pZG5sCitBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCisjaWYgZGVmaW5lZCBfUkVFTlRSQU5UIHx8IGRlZmluZWQgX01UIHx8IGRlZmluZWQgX19NVF9fCisvKiB1c2UgLW10ICovCisjZWxzZQorIyBlcnJvciBNVCBub3QgbmVlZGVkCisjZW5kaWYKK11dKV0sIFtib29zdF9ndWVzc191c2VfbXQ9Ol0sIFtib29zdF9ndWVzc191c2VfbXQ9ZmFsc2VdKQorQUNfTEFOR19QT1AoW0MrK10pZG5sCitdKQorCisjIF9CT09TVF9BQ19MSU5LX0lGRUxTRShQUk9HUkFNLCBbQUNUSU9OLUlGLVRSVUVdLCBbQUNUSU9OLUlGLUZBTFNFXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGb3JrIG9mIF9BQ19MSU5LX0lGRUxTRSB0aGF0IHByZXNlcnZlcyBjb25mdGVzdC5vIGFjcm9zcyBjYWxscy4gIEZyYWdpbGUsCisjIHdpbGwgYnJlYWsgd2hlbiBBdXRvY29uZiBjaGFuZ2VzIGl0cyBpbnRlcm5hbHMuICBSZXF1aXJlcyB0aGF0IHlvdSBtYW51YWxseQorIyBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGluIGJldHdlZW4gdG8gcmVhbGx5IGRpZmZlcmVudCB0ZXN0cywgb3RoZXJ3aXNlCisjIHlvdSB3aWxsIHRyeSB0byBsaW5rIGEgY29uZnRlc3QubyBsZWZ0IGJlaGluZCBieSBhIHByZXZpb3VzIHRlc3QuCisjIFVzZWQgdG8gYWdncmVzc2l2ZWx5IG9wdGltaXplIEJPT1NUX0ZJTkRfTElCIChzZWUgdGhlIGJpZyBjb21tZW50IGluIHRoaXMKKyMgbWFjcm8pLgorIworIyBEb24ndCB1c2UgImJyZWFrIiBpbiB0aGUgYWN0aW9ucywgYXMgaXQgd291bGQgc2hvcnQtY2lyY3VpdCBzb21lIGNvZGUKKyMgdGhpcyBtYWNybyBydW5zIGFmdGVyIHRoZSBhY3Rpb25zLgorbTRfZGVmaW5lKFtfQk9PU1RfQUNfTElOS19JRkVMU0VdLAorW200X2lmdmFsbihbJDFdLCBbQUNfTEFOR19DT05GVEVTVChbJDFdKV0pZG5sCitybSAtZiBjb25mdGVzdCRhY19leGVleHQKK2Jvb3N0X3NhdmVfYWNfZXh0PSRhY19leHQKK2Jvb3N0X3VzZV9zb3VyY2U9OgorIyBJZiB3ZSBhbHJlYWR5IGhhdmUgYSAubywgcmUtdXNlIGl0LiAgV2UgY2hhbmdlICRhY19leHQgc28gdGhhdCAkYWNfbGluaworIyB0cmllcyB0byBsaW5rIHRoZSBleGlzdGluZyBvYmplY3QgZmlsZSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBmcm9tIHNvdXJjZS4KK3Rlc3QgLWYgY29uZnRlc3QuJGFjX29iamV4dCAmJiBhY19leHQ9JGFjX29iamV4dCAmJiBib29zdF91c2Vfc291cmNlPWZhbHNlICYmCisgIF9BU19FQ0hPX0xPRyhbcmUtdXNpbmcgdGhlIGV4aXN0aW5nIGNvbmZ0ZXN0LiRhY19vYmpleHRdKQorQVNfSUYoW19BQ19ET19TVERFUlIoJGFjX2xpbmspICYmIHsKKyAgICAgICAgIHRlc3QgLXogIiRhY19bXV9BQ19MQU5HX0FCQlJFVltdX3dlcnJvcl9mbGFnIiB8fAorICAgICAgICAgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworICAgICAgICAgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKyAgICAgICAgICRhc19leGVjdXRhYmxlX3AgY29uZnRlc3QkYWNfZXhlZXh0CitkbmwgRklYTUU6IHVzZSBBU19URVNUX1ggaW5zdGVhZCB3aGVuIDIuNjEgaXMgd2lkZXNwcmVhZCBlbm91Z2guCisgICAgICAgfV0sCisgICAgICBbJDJdLAorICAgICAgW2lmICRib29zdF91c2Vfc291cmNlOyB0aGVuCisgICAgICAgICBfQUNfTVNHX0xPR19DT05GVEVTVAorICAgICAgIGZpCisgICAgICAgJDNdKQorYWNfb2JqZXh0PSRib29zdF9zYXZlX2FjX29iamV4dAorYWNfZXh0PSRib29zdF9zYXZlX2FjX2V4dAorZG5sIERlbGV0ZSBhbHNvIHRoZSBJUEEvSVBPIChJbnRlciBQcm9jZWR1cmFsIEFuYWx5c2lzL09wdGltaXphdGlvbikKK2RubCBpbmZvcm1hdGlvbiBjcmVhdGVkIGJ5IHRoZSBQR0kgY29tcGlsZXIgKGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28pLAorZG5sIGFzIGl0IHdvdWxkIGludGVyZmVyZSB3aXRoIHRoZSBuZXh0IGxpbmsgY29tbWFuZC4KK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IG00X2lmdmFsKFskMV0sIFtjb25mdGVzdC4kYWNfZXh0XSlbXWRubAorXSkjIF9CT09TVF9BQ19MSU5LX0lGRUxTRQorCisjIExvY2FsIFZhcmlhYmxlczoKKyMgbW9kZTogYXV0b2NvbmYKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9jdmM0LW1hc3Rlci1wYXRjaC9vcHRpb25zL29wdGlvbnNfdGVtcGxhdGUuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9jdmM0LW1hc3Rlci1wYXRjaC9vcHRpb25zL29wdGlvbnNfdGVtcGxhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYTliNmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL2N2YzQtbWFzdGVyLXBhdGNoL29wdGlvbnMvb3B0aW9uc190ZW1wbGF0ZS5jcHAKQEAgLTAsMCArMSw4MzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiEgXGZpbGUgb3B0aW9uc190ZW1wbGF0ZS5jcHAKKyAqKiBcdmVyYmF0aW0KKyAqKiBUb3AgY29udHJpYnV0b3JzICh0byBjdXJyZW50IHZlcnNpb24pOgorICoqICAgVGltIEtpbmcsIE1vcmdhbiBEZXRlcnMsIEtzaGl0aWogQmFuc2FsCisgKiogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIENWQzQgcHJvamVjdC4KKyAqKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxNiBieSB0aGUgYXV0aG9ycyBsaXN0ZWQgaW4gdGhlIGZpbGUgQVVUSE9SUworICoqIGluIHRoZSB0b3AtbGV2ZWwgc291cmNlIGRpcmVjdG9yeSkgYW5kIHRoZWlyIGluc3RpdHV0aW9uYWwgYWZmaWxpYXRpb25zLgorICoqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgdG9wLWxldmVsIHNvdXJjZQorICoqIGRpcmVjdG9yeSBmb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLlxlbmR2ZXJiYXRpbQorICoqCisgKiogXGJyaWVmIENvbnRhaW5zIGNvZGUgZm9yIGhhbmRsaW5nIGNvbW1hbmQtbGluZSBvcHRpb25zLgorICoqCisgKiogQ29udGFpbnMgY29kZSBmb3IgaGFuZGxpbmcgY29tbWFuZC1saW5lIG9wdGlvbnMKKyAqKi8KKworI2lmICFkZWZpbmVkKF9CU0RfU09VUkNFKSAmJiBkZWZpbmVkKF9fTUlOR1czMl9fKSAmJiAhZGVmaW5lZChfX01JTkdXNjRfXykKKy8vIGZvcmNlIHVzZSBvZiBvcHRyZXNldDsgbWluZ3czMiBjcm9ha3Mgb24gYXJndi1zd2l0Y2hpbmcgb3RoZXJ3aXNlCisjICBpbmNsdWRlICJjdmM0YXV0b2NvbmZpZy5oIgorIyAgZGVmaW5lIF9CU0RfU09VUkNFCisjICB1bmRlZiBIQVZFX0RFQ0xfT1BUUkVTRVQKKyMgIGRlZmluZSBIQVZFX0RFQ0xfT1BUUkVTRVQgMQorIyAgZGVmaW5lIENWQzRfSVNfTk9UX1JFQUxMWV9CU0QKKyNlbmRpZiAvKiAhX0JTRF9TT1VSQ0UgJiYgX19NSU5HVzMyX18gJiYgIV9fTUlOR1c2NF9fICovCisKKyNpZmRlZiBfX01JTkdXNjRfXworI2RlZmluZSBfQlNEX1NPVVJDRSAvLyBOZWVkZWQgdG8gYXZvaWQgJ29wdHJlc2V0JyBlcnJvciBhdCBsaW5rCitleHRlcm4gaW50IG9wdHJlc2V0OworI2VuZGlmIC8qIF9fTUlOR1c2NF9fICovCisKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKworLy8gY2xlYW4gdXAKKyNpZmRlZiBDVkM0X0lTX05PVF9SRUFMTFlfQlNECisjICB1bmRlZiBfQlNEX1NPVVJDRQorI2VuZGlmIC8qIENWQzRfSVNfTk9UX1JFQUxMWV9CU0QgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxuZXc+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8bGltaXRzPgorCisjaW5jbHVkZSAiYmFzZS9jdmM0X2Fzc2VydC5oIgorI2luY2x1ZGUgImJhc2UvZXhjZXB0aW9uLmgiCisjaW5jbHVkZSAiYmFzZS9vdXRwdXQuaCIKKyNpbmNsdWRlICJiYXNlL3Rscy5oIgorI2luY2x1ZGUgIm9wdGlvbnMvYXJndW1lbnRfZXh0ZW5kZXIuaCIKKyNpbmNsdWRlICJvcHRpb25zL2FyZ3VtZW50X2V4dGVuZGVyX2ltcGxlbWVudGF0aW9uLmgiCisjaW5jbHVkZSAib3B0aW9ucy9kaWR5b3VtZWFuLmgiCisjaW5jbHVkZSAib3B0aW9ucy9sYW5ndWFnZS5oIgorI2luY2x1ZGUgIm9wdGlvbnMvb3B0aW9uc19oYW5kbGVyLmgiCisKKyR7aW5jbHVkZV9hbGxfb3B0aW9uX2hlYWRlcnN9CisKKyNsaW5lIDY0ICIke3RlbXBsYXRlfSIKKworI2luY2x1ZGUgIm9wdGlvbnMvb3B0aW9uc19ob2xkZXIuaCIKKyNpbmNsdWRlICJjdmM0YXV0b2NvbmZpZy5oIgorI2luY2x1ZGUgIm9wdGlvbnMvYmFzZV9oYW5kbGVycy5oIgorCiske29wdGlvbl9oYW5kbGVyX2luY2x1ZGVzfQorCisjbGluZSA3MiAiJHt0ZW1wbGF0ZX0iCisKK3VzaW5nIG5hbWVzcGFjZSBDVkM0OwordXNpbmcgbmFtZXNwYWNlIENWQzQ6Om9wdGlvbnM7CisKK25hbWVzcGFjZSBDVkM0IHsKKworQ1ZDNF9USFJFQURMT0NBTChPcHRpb25zKikgT3B0aW9uczo6c19jdXJyZW50ID0gTlVMTDsKKworCisKKy8qKgorICogVGhpcyBpcyBhIGRlZmF1bHQgaGFuZGxlciBmb3Igb3B0aW9ucyBvZiBidWlsdC1pbiBDKysgdHlwZS4gIFRoaXMKKyAqIHRlbXBsYXRlIGlzIHJlYWxseSBqdXN0IGEgaGVscGVyIGZvciB0aGUgaGFuZGxlT3B0aW9uKCkgdGVtcGxhdGUsCisgKiBiZWxvdy4gIFZhcmlhbnRzIG9mIHRoaXMgdGVtcGxhdGUgaGFuZGxlIG51bWVyaWMgYW5kIG5vbi1udW1lcmljLAorICogaW50ZWdyYWwgYW5kIG5vbi1pbnRlZ3JhbCwgc2lnbmVkIGFuZCB1bnNpZ25lZCBDKysgdHlwZXMuCisgKiBoYW5kbGVPcHRpb24oKSBtYWtlcyBzdXJlIHRvIGluc3RhbnRpYXRlIHRoZSByaWdodCBvbmUuCisgKgorICogVGhpcyBpbXBsZW1lbnRzIGRlZmF1bHQgYmVoYXZpb3Igd2hlbiBlLmcuIGFuIG9wdGlvbiBpcworICogdW5zaWduZWQgYnV0IHRoZSB1c2VyIHNwZWNpZmllcyBhIG5lZ2F0aXZlIGFyZ3VtZW50OyBldGMuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBULCBib29sIGlzX251bWVyaWMsIGJvb2wgaXNfaW50ZWdlcj4KK3N0cnVjdCBPcHRpb25IYW5kbGVyIHsKKyAgc3RhdGljIFQgaGFuZGxlKHN0ZDo6c3RyaW5nIG9wdGlvbiwgc3RkOjpzdHJpbmcgb3B0aW9uYXJnKTsKK307Lyogc3RydWN0IE9wdGlvbkhhbmRsZXI8PiAqLworCisvKiogVmFyaWFudCBmb3IgaW50ZWdyYWwgQysrIHR5cGVzICovCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3N0cnVjdCBPcHRpb25IYW5kbGVyPFQsIHRydWUsIHRydWU+IHsKKyAgc3RhdGljIGJvb2wgc3RyaW5nVG9JbnQoVCYgdCwgY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICAgIHN0ZDo6aXN0cmluZ3N0cmVhbSBzcyhzdHIpOworICAgIHNzID4+IHQ7CisgICAgY2hhciB0bXA7CisgICAgcmV0dXJuICEoc3MuZmFpbCgpIHx8IHNzLmdldCh0bXApKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNvbnRhaW5zTWludXMoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICAgIHJldHVybiBzdHIuZmluZCgnLScpICE9IHN0ZDo6c3RyaW5nOjpucG9zOworICB9CisKKyAgc3RhdGljIFQgaGFuZGxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25hcmcpIHsKKyAgICB0cnkgeworICAgICAgVCBpOworICAgICAgYm9vbCBzdWNjZXNzID0gc3RyaW5nVG9JbnQoaSwgb3B0aW9uYXJnKTsKKworICAgICAgaWYoIXN1Y2Nlc3MpeworICAgICAgICB0aHJvdyBPcHRpb25FeGNlcHRpb24ob3B0aW9uICsgIjogZmFpbGVkIHRvIHBhcnNlICIrIG9wdGlvbmFyZyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGFzIGFuIGludGVnZXIgb2YgdGhlIGFwcHJvcHJhaXRlIHR5cGUuIik7CisgICAgICB9CisKKyAgICAgIC8vIERlcGVuZGluZyBpbiB0aGUgcGxhdGZvcm0gdW5zaWduZWQgbnVtYmVycyB3aXRoICctJyBzaWducyBtYXkgcGFyc2UuCisgICAgICAvLyBSZWplY3QgdGhlc2UgYnkgbG9va2luZyBmb3IgYW55IG1pbnVzIGlmIGl0IGlzIG5vdCBzaWduZWQuCisgICAgICBpZiggKCEgc3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfc2lnbmVkKSAmJiBjb250YWluc01pbnVzKG9wdGlvbmFyZykgKSB7CisgICAgICAgIC8vIHVuc2lnbmVkIHR5cGUgYnV0IHVzZXIgZ2F2ZSBuZWdhdGl2ZSBhcmd1bWVudAorICAgICAgICB0aHJvdyBPcHRpb25FeGNlcHRpb24ob3B0aW9uICsgIiByZXF1aXJlcyBhIG5vbm5lZ2F0aXZlIGFyZ3VtZW50Iik7CisgICAgICB9IGVsc2UgaWYoaSA8IHN0ZDo6bnVtZXJpY19saW1pdHM8VD46Om1pbigpKSB7CisgICAgICAgIC8vIG5lZ2F0aXZlIG92ZXJmbG93IGZvciB0eXBlCisgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgICBzcyA8PCBvcHRpb24gPDwgIiByZXF1aXJlcyBhbiBhcmd1bWVudCA+PSAiCisgICAgICAgICAgIDw8IHN0ZDo6bnVtZXJpY19saW1pdHM8VD46Om1pbigpOworICAgICAgICB0aHJvdyBPcHRpb25FeGNlcHRpb24oc3Muc3RyKCkpOworICAgICAgfSBlbHNlIGlmKGkgPiBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptYXgoKSkgeworICAgICAgICAvLyBwb3NpdGl2ZSBvdmVyZmxvdyBmb3IgdHlwZQorICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgc3MgPDwgb3B0aW9uIDw8ICIgcmVxdWlyZXMgYW4gYXJndW1lbnQgPD0gIgorICAgICAgICAgICA8PCBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptYXgoKTsKKyAgICAgICAgdGhyb3cgT3B0aW9uRXhjZXB0aW9uKHNzLnN0cigpKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGk7CisKKyAgICAgIC8vIGlmKHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX3NpZ25lZCkgeworICAgICAgLy8gICByZXR1cm4gVChpLmdldExvbmcoKSk7CisgICAgICAvLyB9IGVsc2UgeworICAgICAgLy8gICByZXR1cm4gVChpLmdldFVuc2lnbmVkTG9uZygpKTsKKyAgICAgIC8vIH0KKyAgICB9IGNhdGNoKHN0ZDo6aW52YWxpZF9hcmd1bWVudCYpIHsKKyAgICAgIC8vIHVzZXIgZ2F2ZSBzb21ldGhpbmcgb3RoZXIgdGhhbiBhbiBpbnRlZ2VyCisgICAgICB0aHJvdyBPcHRpb25FeGNlcHRpb24ob3B0aW9uICsgIiByZXF1aXJlcyBhbiBpbnRlZ2VyIGFyZ3VtZW50Iik7CisgICAgfQorICB9Cit9Oy8qIHN0cnVjdCBPcHRpb25IYW5kbGVyPFQsIHRydWUsIHRydWU+ICovCisKKy8qKiBWYXJpYW50IGZvciBudW1lcmljIGJ1dCBub24taW50ZWdyYWwgQysrIHR5cGVzICovCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3N0cnVjdCBPcHRpb25IYW5kbGVyPFQsIHRydWUsIGZhbHNlPiB7CisgIHN0YXRpYyBUIGhhbmRsZShzdGQ6OnN0cmluZyBvcHRpb24sIHN0ZDo6c3RyaW5nIG9wdGlvbmFyZykgeworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGluKG9wdGlvbmFyZyk7CisgICAgbG9uZyBkb3VibGUgcjsKKyAgICBpbiA+PiByOworICAgIGlmKCEgaW4uZW9mKCkpIHsKKyAgICAgIC8vIHdlIGRpZG4ndCBjb25zdW1lIHRoZSB3aG9sZSBzdHJpbmcgKGp1bmsgYXQgZW5kKQorICAgICAgdGhyb3cgT3B0aW9uRXhjZXB0aW9uKG9wdGlvbiArICIgcmVxdWlyZXMgYSBudW1lcmljIGFyZ3VtZW50Iik7CisgICAgfQorCisgICAgaWYoISBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+Ojppc19zaWduZWQgJiYgciA8IDAuMCkgeworICAgICAgLy8gdW5zaWduZWQgdHlwZSBidXQgdXNlciBnYXZlIG5lZ2F0aXZlIHZhbHVlCisgICAgICB0aHJvdyBPcHRpb25FeGNlcHRpb24ob3B0aW9uICsgIiByZXF1aXJlcyBhIG5vbm5lZ2F0aXZlIGFyZ3VtZW50Iik7CisgICAgfSBlbHNlIGlmKHIgPCAtc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWF4KCkpIHsKKyAgICAgIC8vIG5lZ2F0aXZlIG92ZXJmbG93IGZvciB0eXBlCisgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgIHNzIDw8IG9wdGlvbiA8PCAiIHJlcXVpcmVzIGFuIGFyZ3VtZW50ID49ICIKKyAgICAgICAgIDw8IC1zdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptYXgoKTsKKyAgICAgIHRocm93IE9wdGlvbkV4Y2VwdGlvbihzcy5zdHIoKSk7CisgICAgfSBlbHNlIGlmKHIgPiBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptYXgoKSkgeworICAgICAgLy8gcG9zaXRpdmUgb3ZlcmZsb3cgZm9yIHR5cGUKKyAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgc3MgPDwgb3B0aW9uIDw8ICIgcmVxdWlyZXMgYW4gYXJndW1lbnQgPD0gIgorICAgICAgICAgPDwgc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWF4KCk7CisgICAgICB0aHJvdyBPcHRpb25FeGNlcHRpb24oc3Muc3RyKCkpOworICAgIH0KKworICAgIHJldHVybiBUKHIpOworICB9Cit9Oy8qIHN0cnVjdCBPcHRpb25IYW5kbGVyPFQsIHRydWUsIGZhbHNlPiAqLworCisvKiogVmFyaWFudCBmb3Igbm9uLW51bWVyaWMgQysrIHR5cGVzICovCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3N0cnVjdCBPcHRpb25IYW5kbGVyPFQsIGZhbHNlLCBmYWxzZT4geworICBzdGF0aWMgVCBoYW5kbGUoc3RkOjpzdHJpbmcgb3B0aW9uLCBzdGQ6OnN0cmluZyBvcHRpb25hcmcpIHsKKyAgICBUOjp1bnN1cHBvcnRlZF9oYW5kbGVPcHRpb25fY2FsbF9fX3BsZWFzZV93cml0ZV9tZTsKKyAgICAvLyBUaGUgYWJvdmUgbGluZSBjYXVzZXMgYSBjb21waWxlciBlcnJvciBpZiB0aGlzIHZlcnNpb24gb2YgdGhlIHRlbXBsYXRlCisgICAgLy8gaXMgZXZlciBpbnN0YW50aWF0ZWQgKG1lYW5pbmcgdGhhdCBhIHNwZWNpYWxpemF0aW9uIGlzIG1pc3NpbmcpLiAgU28KKyAgICAvLyBkb24ndCB3b3JyeSBhYm91dCB0aGUgc2VnZmF1bHQgaW4gdGhlIG5leHQgbGluZSwgdGhlICJyZXR1cm4iIGlzIG9ubHkKKyAgICAvLyB0aGVyZSB0byBrZWVwIHRoZSBjb21waWxlciBmcm9tIGdpdmluZyBhZGRpdGlvbmFsLCBkaXN0cmFjdGluZyBlcnJvcnMKKyAgICAvLyBhbmQgd2FybmluZ3MuCisgICAgcmV0dXJuICooVCopMDsKKyAgfQorfTsvKiBzdHJ1Y3QgT3B0aW9uSGFuZGxlcjxULCBmYWxzZSwgZmFsc2U+ICovCisKKy8qKiBIYW5kbGUgYW4gb3B0aW9uIG9mIHR5cGUgVCBpbiB0aGUgZGVmYXVsdCB3YXkuICovCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK1QgaGFuZGxlT3B0aW9uKHN0ZDo6c3RyaW5nIG9wdGlvbiwgc3RkOjpzdHJpbmcgb3B0aW9uYXJnKSB7CisgIHJldHVybiBPcHRpb25IYW5kbGVyPFQsIHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX3NwZWNpYWxpemVkLCBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+Ojppc19pbnRlZ2VyPjo6aGFuZGxlKG9wdGlvbiwgb3B0aW9uYXJnKTsKK30KKworLyoqIEhhbmRsZSBhbiBvcHRpb24gb2YgdHlwZSBzdGQ6OnN0cmluZyBpbiB0aGUgZGVmYXVsdCB3YXkuICovCit0ZW1wbGF0ZSA8Pgorc3RkOjpzdHJpbmcgaGFuZGxlT3B0aW9uPHN0ZDo6c3RyaW5nPihzdGQ6OnN0cmluZyBvcHRpb24sIHN0ZDo6c3RyaW5nIG9wdGlvbmFyZykgeworICByZXR1cm4gb3B0aW9uYXJnOworfQorCisvKioKKyAqIFJ1biBoYW5kbGVyLCBhbmQgYW55IHVzZXItZ2l2ZW4gcHJlZGljYXRlcywgZm9yIG9wdGlvbiBULgorICogSWYgYSB1c2VyIHNwZWNpZmllcyBhIDpoYW5kbGVyIG9yIDpwcmVkaWNhdGVzLCBpdCBvdmVycmlkZXMgdGhpcy4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFQ+Cit0eXBlbmFtZSBUOjp0eXBlIHJ1bkhhbmRsZXJBbmRQcmVkaWNhdGVzKFQsIHN0ZDo6c3RyaW5nIG9wdGlvbiwgc3RkOjpzdHJpbmcgb3B0aW9uYXJnLCBvcHRpb25zOjpPcHRpb25zSGFuZGxlciogaGFuZGxlcikgeworICAvLyBCeSBkZWZhdWx0LCBwYXJzZSB0aGUgb3B0aW9uIGFyZ3VtZW50IGluIGEgd2F5IGFwcHJvcHJpYXRlIGZvciBpdHMgdHlwZS4KKyAgLy8gRS5nLiwgZm9yICJ1bnNpZ25lZCBpbnQiIG9wdGlvbnMsIGVuc3VyZSB0aGF0IHRoZSBwcm92aWRlZCBhcmd1bWVudCBpcworICAvLyBhIG5vbm5lZ2F0aXZlIGludGVnZXIgdGhhdCBmaXRzIGluIHRoZSB1bnNpZ25lZCBpbnQgdHlwZS4KKworICByZXR1cm4gaGFuZGxlT3B0aW9uPHR5cGVuYW1lIFQ6OnR5cGU+KG9wdGlvbiwgb3B0aW9uYXJnKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+Cit2b2lkIHJ1bkJvb2xQcmVkaWNhdGVzKFQsIHN0ZDo6c3RyaW5nIG9wdGlvbiwgYm9vbCBiLCBvcHRpb25zOjpPcHRpb25zSGFuZGxlciogaGFuZGxlcikgeworICAvLyBCeSBkZWZhdWx0LCBub3RoaW5nIHRvIGRvIGZvciBib29sLiAgVXNlcnMgYWRkIHRoaW5ncyB3aXRoCisgIC8vIDpwcmVkaWNhdGUgaW4gb3B0aW9ucyBmaWxlcyB0byBwcm92aWRlIGN1c3RvbSBjaGVja2luZyByb3V0aW5lcworICAvLyB0aGF0IGNhbiB0aHJvdyBleGNlcHRpb25zLgorfQorCisKK09wdGlvbnM6Ok9wdGlvbnMoKQorICAgIDogZF9ob2xkZXIobmV3IG9wdGlvbnM6Ok9wdGlvbnNIb2xkZXIoKSkKKyAgICAsIGRfaGFuZGxlcihuZXcgb3B0aW9uczo6T3B0aW9uc0hhbmRsZXIodGhpcykpCisgICAgLCBkX2ZvcmNlTG9naWNMaXN0ZW5lcnMoKQorICAgICwgZF9iZWZvcmVTZWFyY2hMaXN0ZW5lcnMoKQorICAgICwgZF90bGltaXRMaXN0ZW5lcnMoKQorICAgICwgZF90bGltaXRQZXJMaXN0ZW5lcnMoKQorICAgICwgZF9ybGltaXRMaXN0ZW5lcnMoKQorICAgICwgZF9ybGltaXRQZXJMaXN0ZW5lcnMoKQore30KKworT3B0aW9uczo6fk9wdGlvbnMoKSB7CisgIGRlbGV0ZSBkX2hhbmRsZXI7CisgIGRlbGV0ZSBkX2hvbGRlcjsKK30KKwordm9pZCBPcHRpb25zOjpjb3B5VmFsdWVzKGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpeworICBpZih0aGlzICE9ICZvcHRpb25zKSB7CisgICAgZGVsZXRlIGRfaG9sZGVyOworICAgIGRfaG9sZGVyID0gbmV3IG9wdGlvbnM6Ok9wdGlvbnNIb2xkZXIoKm9wdGlvbnMuZF9ob2xkZXIpOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIE9wdGlvbnM6OmZvcm1hdFRocmVhZE9wdGlvbkV4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uKSB7CisgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICBzcyA8PCAiY2FuJ3QgdW5kZXJzdGFuZCBvcHRpb24gYCIgPDwgb3B0aW9uCisgICAgIDw8ICInOiBleHBlY3RlZCBzb21ldGhpbmcgbGlrZSAtLXRocmVhZE49XCItLW9wdGlvbjEgLS1vcHRpb24yXCIsIgorICAgICA8PCAiIHdoZXJlIE4gaXMgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIjsKKyAgcmV0dXJuIHNzLnN0cigpOworfQorCitMaXN0ZW5lckNvbGxlY3Rpb246OlJlZ2lzdHJhdGlvbiogT3B0aW9uczo6cmVnaXN0ZXJBbmROb3RpZnkoCisgICAgTGlzdGVuZXJDb2xsZWN0aW9uJiBjb2xsZWN0aW9uLCBMaXN0ZW5lciogbGlzdGVuZXIsIGJvb2wgbm90aWZ5KQoreworICBMaXN0ZW5lckNvbGxlY3Rpb246OlJlZ2lzdHJhdGlvbiogcmVnaXN0cmF0aW9uID0KKyAgICAgIGNvbGxlY3Rpb24ucmVnaXN0ZXJMaXN0ZW5lcihsaXN0ZW5lcik7CisgIGlmKG5vdGlmeSkgeworICAgIGxpc3RlbmVyLT5ub3RpZnkoKTsKKyAgfQorICByZXR1cm4gcmVnaXN0cmF0aW9uOworfQorCitMaXN0ZW5lckNvbGxlY3Rpb246OlJlZ2lzdHJhdGlvbiogT3B0aW9uczo6cmVnaXN0ZXJGb3JjZUxvZ2ljTGlzdGVuZXIoCisgICAgTGlzdGVuZXIqIGxpc3RlbmVyLCBib29sIG5vdGlmeUlmU2V0KQoreworICBib29sIG5vdGlmeSA9IG5vdGlmeUlmU2V0ICYmIHdhc1NldEJ5VXNlcihvcHRpb25zOjpmb3JjZUxvZ2ljU3RyaW5nKTsKKyAgcmV0dXJuIHJlZ2lzdGVyQW5kTm90aWZ5KGRfZm9yY2VMb2dpY0xpc3RlbmVycywgbGlzdGVuZXIsIG5vdGlmeSk7Cit9CisKK0xpc3RlbmVyQ29sbGVjdGlvbjo6UmVnaXN0cmF0aW9uKiBPcHRpb25zOjpyZWdpc3RlckJlZm9yZVNlYXJjaExpc3RlbmVyKAorICAgTGlzdGVuZXIqIGxpc3RlbmVyKQoreworICByZXR1cm4gZF9iZWZvcmVTZWFyY2hMaXN0ZW5lcnMucmVnaXN0ZXJMaXN0ZW5lcihsaXN0ZW5lcik7Cit9CisKK0xpc3RlbmVyQ29sbGVjdGlvbjo6UmVnaXN0cmF0aW9uKiBPcHRpb25zOjpyZWdpc3RlclRsaW1pdExpc3RlbmVyKAorICAgTGlzdGVuZXIqIGxpc3RlbmVyLCBib29sIG5vdGlmeUlmU2V0KQoreworICBib29sIG5vdGlmeSA9IG5vdGlmeUlmU2V0ICYmCisgICAgICB3YXNTZXRCeVVzZXIob3B0aW9uczo6Y3VtdWxhdGl2ZU1pbGxpc2Vjb25kTGltaXQpOworICByZXR1cm4gcmVnaXN0ZXJBbmROb3RpZnkoZF90bGltaXRMaXN0ZW5lcnMsIGxpc3RlbmVyLCBub3RpZnkpOworfQorCitMaXN0ZW5lckNvbGxlY3Rpb246OlJlZ2lzdHJhdGlvbiogT3B0aW9uczo6cmVnaXN0ZXJUbGltaXRQZXJMaXN0ZW5lcigKKyAgIExpc3RlbmVyKiBsaXN0ZW5lciwgYm9vbCBub3RpZnlJZlNldCkKK3sKKyAgYm9vbCBub3RpZnkgPSBub3RpZnlJZlNldCAmJiB3YXNTZXRCeVVzZXIob3B0aW9uczo6cGVyQ2FsbE1pbGxpc2Vjb25kTGltaXQpOworICByZXR1cm4gcmVnaXN0ZXJBbmROb3RpZnkoZF90bGltaXRQZXJMaXN0ZW5lcnMsIGxpc3RlbmVyLCBub3RpZnkpOworfQorCitMaXN0ZW5lckNvbGxlY3Rpb246OlJlZ2lzdHJhdGlvbiogT3B0aW9uczo6cmVnaXN0ZXJSbGltaXRMaXN0ZW5lcigKKyAgIExpc3RlbmVyKiBsaXN0ZW5lciwgYm9vbCBub3RpZnlJZlNldCkKK3sKKyAgYm9vbCBub3RpZnkgPSBub3RpZnlJZlNldCAmJiB3YXNTZXRCeVVzZXIob3B0aW9uczo6Y3VtdWxhdGl2ZVJlc291cmNlTGltaXQpOworICByZXR1cm4gcmVnaXN0ZXJBbmROb3RpZnkoZF9ybGltaXRMaXN0ZW5lcnMsIGxpc3RlbmVyLCBub3RpZnkpOworfQorCitMaXN0ZW5lckNvbGxlY3Rpb246OlJlZ2lzdHJhdGlvbiogT3B0aW9uczo6cmVnaXN0ZXJSbGltaXRQZXJMaXN0ZW5lcigKKyAgIExpc3RlbmVyKiBsaXN0ZW5lciwgYm9vbCBub3RpZnlJZlNldCkKK3sKKyAgYm9vbCBub3RpZnkgPSBub3RpZnlJZlNldCAmJiB3YXNTZXRCeVVzZXIob3B0aW9uczo6cGVyQ2FsbFJlc291cmNlTGltaXQpOworICByZXR1cm4gcmVnaXN0ZXJBbmROb3RpZnkoZF9ybGltaXRQZXJMaXN0ZW5lcnMsIGxpc3RlbmVyLCBub3RpZnkpOworfQorCitMaXN0ZW5lckNvbGxlY3Rpb246OlJlZ2lzdHJhdGlvbiogT3B0aW9uczo6cmVnaXN0ZXJVc2VUaGVvcnlMaXN0TGlzdGVuZXIoCisgICBMaXN0ZW5lciogbGlzdGVuZXIsIGJvb2wgbm90aWZ5SWZTZXQpCit7CisgIGJvb2wgbm90aWZ5ID0gbm90aWZ5SWZTZXQgJiYgd2FzU2V0QnlVc2VyKG9wdGlvbnM6OnVzZVRoZW9yeUxpc3QpOworICByZXR1cm4gcmVnaXN0ZXJBbmROb3RpZnkoZF91c2VUaGVvcnlMaXN0TGlzdGVuZXJzLCBsaXN0ZW5lciwgbm90aWZ5KTsKK30KKworTGlzdGVuZXJDb2xsZWN0aW9uOjpSZWdpc3RyYXRpb24qIE9wdGlvbnM6OnJlZ2lzdGVyU2V0RGVmYXVsdEV4cHJEZXB0aExpc3RlbmVyKAorICAgIExpc3RlbmVyKiBsaXN0ZW5lciwgYm9vbCBub3RpZnlJZlNldCkKK3sKKyAgYm9vbCBub3RpZnkgPSBub3RpZnlJZlNldCAmJiB3YXNTZXRCeVVzZXIob3B0aW9uczo6ZGVmYXVsdEV4cHJEZXB0aCk7CisgIHJldHVybiByZWdpc3RlckFuZE5vdGlmeShkX3NldERlZmF1bHRFeHByRGVwdGhMaXN0ZW5lcnMsIGxpc3RlbmVyLCBub3RpZnkpOworfQorCitMaXN0ZW5lckNvbGxlY3Rpb246OlJlZ2lzdHJhdGlvbiogT3B0aW9uczo6cmVnaXN0ZXJTZXREZWZhdWx0RXhwckRhZ0xpc3RlbmVyKAorICAgIExpc3RlbmVyKiBsaXN0ZW5lciwgYm9vbCBub3RpZnlJZlNldCkKK3sKKyAgYm9vbCBub3RpZnkgPSBub3RpZnlJZlNldCAmJiB3YXNTZXRCeVVzZXIob3B0aW9uczo6ZGVmYXVsdERhZ1RocmVzaCk7CisgIHJldHVybiByZWdpc3RlckFuZE5vdGlmeShkX3NldERlZmF1bHREYWdUaHJlc2hMaXN0ZW5lcnMsIGxpc3RlbmVyLCBub3RpZnkpOworfQorCitMaXN0ZW5lckNvbGxlY3Rpb246OlJlZ2lzdHJhdGlvbiogT3B0aW9uczo6cmVnaXN0ZXJTZXRQcmludEV4cHJUeXBlc0xpc3RlbmVyKAorICAgIExpc3RlbmVyKiBsaXN0ZW5lciwgYm9vbCBub3RpZnlJZlNldCkKK3sKKyAgYm9vbCBub3RpZnkgPSBub3RpZnlJZlNldCAmJiB3YXNTZXRCeVVzZXIob3B0aW9uczo6cHJpbnRFeHByVHlwZXMpOworICByZXR1cm4gcmVnaXN0ZXJBbmROb3RpZnkoZF9zZXRQcmludEV4cHJUeXBlc0xpc3RlbmVycywgbGlzdGVuZXIsIG5vdGlmeSk7Cit9CisKK0xpc3RlbmVyQ29sbGVjdGlvbjo6UmVnaXN0cmF0aW9uKiBPcHRpb25zOjpyZWdpc3RlclNldER1bXBNb2RlTGlzdGVuZXIoCisgICAgTGlzdGVuZXIqIGxpc3RlbmVyLCBib29sIG5vdGlmeUlmU2V0KQoreworICBib29sIG5vdGlmeSA9IG5vdGlmeUlmU2V0ICYmIHdhc1NldEJ5VXNlcihvcHRpb25zOjpkdW1wTW9kZVN0cmluZyk7CisgIHJldHVybiByZWdpc3RlckFuZE5vdGlmeShkX3NldER1bXBNb2RlTGlzdGVuZXJzLCBsaXN0ZW5lciwgbm90aWZ5KTsKK30KKworTGlzdGVuZXJDb2xsZWN0aW9uOjpSZWdpc3RyYXRpb24qIE9wdGlvbnM6OnJlZ2lzdGVyU2V0UHJpbnRTdWNjZXNzTGlzdGVuZXIoCisgICAgTGlzdGVuZXIqIGxpc3RlbmVyLCBib29sIG5vdGlmeUlmU2V0KQoreworICBib29sIG5vdGlmeSA9IG5vdGlmeUlmU2V0ICYmIHdhc1NldEJ5VXNlcihvcHRpb25zOjpwcmludFN1Y2Nlc3MpOworICByZXR1cm4gcmVnaXN0ZXJBbmROb3RpZnkoZF9zZXRQcmludFN1Y2Nlc3NMaXN0ZW5lcnMsIGxpc3RlbmVyLCBub3RpZnkpOworfQorCitMaXN0ZW5lckNvbGxlY3Rpb246OlJlZ2lzdHJhdGlvbiogT3B0aW9uczo6cmVnaXN0ZXJEdW1wVG9GaWxlTmFtZUxpc3RlbmVyKAorICAgIExpc3RlbmVyKiBsaXN0ZW5lciwgYm9vbCBub3RpZnlJZlNldCkKK3sKKyAgYm9vbCBub3RpZnkgPSBub3RpZnlJZlNldCAmJiB3YXNTZXRCeVVzZXIob3B0aW9uczo6ZHVtcFRvRmlsZU5hbWUpOworICByZXR1cm4gcmVnaXN0ZXJBbmROb3RpZnkoZF9kdW1wVG9GaWxlTGlzdGVuZXJzLCBsaXN0ZW5lciwgbm90aWZ5KTsKK30KKworTGlzdGVuZXJDb2xsZWN0aW9uOjpSZWdpc3RyYXRpb24qCitPcHRpb25zOjpyZWdpc3RlclNldFJlZ3VsYXJPdXRwdXRDaGFubmVsTGlzdGVuZXIoCisgICAgTGlzdGVuZXIqIGxpc3RlbmVyLCBib29sIG5vdGlmeUlmU2V0KQoreworICBib29sIG5vdGlmeSA9IG5vdGlmeUlmU2V0ICYmIHdhc1NldEJ5VXNlcihvcHRpb25zOjpyZWd1bGFyQ2hhbm5lbE5hbWUpOworICByZXR1cm4gcmVnaXN0ZXJBbmROb3RpZnkoZF9zZXRSZWd1bGFyQ2hhbm5lbExpc3RlbmVycywgbGlzdGVuZXIsIG5vdGlmeSk7Cit9CisKK0xpc3RlbmVyQ29sbGVjdGlvbjo6UmVnaXN0cmF0aW9uKgorT3B0aW9uczo6cmVnaXN0ZXJTZXREaWFnbm9zdGljT3V0cHV0Q2hhbm5lbExpc3RlbmVyKAorICAgIExpc3RlbmVyKiBsaXN0ZW5lciwgYm9vbCBub3RpZnlJZlNldCkKK3sKKyAgYm9vbCBub3RpZnkgPSBub3RpZnlJZlNldCAmJiB3YXNTZXRCeVVzZXIob3B0aW9uczo6ZGlhZ25vc3RpY0NoYW5uZWxOYW1lKTsKKyAgcmV0dXJuIHJlZ2lzdGVyQW5kTm90aWZ5KGRfc2V0RGlhZ25vc3RpY0NoYW5uZWxMaXN0ZW5lcnMsIGxpc3RlbmVyLCBub3RpZnkpOworfQorCitMaXN0ZW5lckNvbGxlY3Rpb246OlJlZ2lzdHJhdGlvbioKK09wdGlvbnM6OnJlZ2lzdGVyU2V0UmVwbGF5TG9nRmlsZW5hbWUoCisgICAgTGlzdGVuZXIqIGxpc3RlbmVyLCBib29sIG5vdGlmeUlmU2V0KQoreworICBib29sIG5vdGlmeSA9IG5vdGlmeUlmU2V0ICYmIHdhc1NldEJ5VXNlcihvcHRpb25zOjpyZXBsYXlMb2dGaWxlbmFtZSk7CisgIHJldHVybiByZWdpc3RlckFuZE5vdGlmeShkX3NldFJlcGxheUZpbGVuYW1lTGlzdGVuZXJzLCBsaXN0ZW5lciwgbm90aWZ5KTsKK30KKworJHthbGxfY3VzdG9tX2hhbmRsZXJzfQorCisjbGluZSAzOTQgIiR7dGVtcGxhdGV9IgorCisjaWZkZWYgQ1ZDNF9ERUJVRworIyAgZGVmaW5lIFVTRV9FQVJMWV9UWVBFX0NIRUNLSU5HX0JZX0RFRkFVTFQgdHJ1ZQorI2Vsc2UgLyogQ1ZDNF9ERUJVRyAqLworIyAgZGVmaW5lIFVTRV9FQVJMWV9UWVBFX0NIRUNLSU5HX0JZX0RFRkFVTFQgZmFsc2UKKyNlbmRpZiAvKiBDVkM0X0RFQlVHICovCisKKyNpZiBkZWZpbmVkKENWQzRfTVVaWkxFRCkgfHwgZGVmaW5lZChDVkM0X0NPTVBFVElUSU9OX01PREUpCisjICBkZWZpbmUgRE9fU0VNQU5USUNfQ0hFQ0tTX0JZX0RFRkFVTFQgZmFsc2UKKyNlbHNlIC8qIENWQzRfTVVaWkxFRCB8fCBDVkM0X0NPTVBFVElUSU9OX01PREUgKi8KKyMgIGRlZmluZSBET19TRU1BTlRJQ19DSEVDS1NfQllfREVGQVVMVCB0cnVlCisjZW5kaWYgLyogQ1ZDNF9NVVpaTEVEIHx8IENWQzRfQ09NUEVUSVRJT05fTU9ERSAqLworCitvcHRpb25zOjpPcHRpb25zSG9sZGVyOjpPcHRpb25zSG9sZGVyKCkgOiAke2FsbF9tb2R1bGVzX2RlZmF1bHRzfQoreworfQorCisjbGluZSA0MTIgIiR7dGVtcGxhdGV9IgorCitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgbW9zdENvbW1vbk9wdGlvbnNEZXNjcmlwdGlvbiA9ICJcCitNb3N0IGNvbW1vbmx5LXVzZWQgQ1ZDNCBvcHRpb25zOiR7Y29tbW9uX2RvY3VtZW50YXRpb259IjsKKworI2xpbmUgNDE3ICIke3RlbXBsYXRlfSIKKworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIG9wdGlvbnNEZXNjcmlwdGlvbiA9IG1vc3RDb21tb25PcHRpb25zRGVzY3JpcHRpb24gKyAiXG5cCitcblwKK0FkZGl0aW9uYWwgQ1ZDNCBvcHRpb25zOiR7cmVtYWluaW5nX2RvY3VtZW50YXRpb259IjsKKworI2xpbmUgNDIzICIke3RlbXBsYXRlfSIKKworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIG9wdGlvbnNGb290bm90ZSA9ICJcblwKK1sqXSBFYWNoIG9mIHRoZXNlIG9wdGlvbnMgaGFzIGEgLS1uby1PUFRJT05OQU1FIHZhcmlhbnQsIHdoaWNoIHJldmVyc2VzIHRoZVxuXAorICAgIHNlbnNlIG9mIHRoZSBvcHRpb24uXG5cCisiOworCitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgbGFuZ3VhZ2VEZXNjcmlwdGlvbiA9ICJcCitMYW5ndWFnZXMgY3VycmVudGx5IHN1cHBvcnRlZCBhcyBhcmd1bWVudHMgdG8gdGhlIC1MIC8gLS1sYW5nIG9wdGlvbjpcblwKKyAgYXV0byAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHQgdG8gYXV0b21hdGljYWxseSBkZXRlcm1pbmUgbGFuZ3VhZ2VcblwKKyAgY3ZjNCB8IHByZXNlbnRhdGlvbiB8IHBsICAgICAgIENWQzQgcHJlc2VudGF0aW9uIGxhbmd1YWdlXG5cCisgIHNtdDEgfCBzbXRsaWIxICAgICAgICAgICAgICAgICBTTVQtTElCIGZvcm1hdCAxLjJcblwKKyAgc210IHwgc210bGliIHwgc210MiB8XG5cCisgIHNtdDIuMCB8IHNtdGxpYjIgfCBzbXRsaWIyLjAgICBTTVQtTElCIGZvcm1hdCAyLjBcblwKKyAgc210Mi41IHwgc210bGliMi41ICAgICAgICAgICAgIFNNVC1MSUIgZm9ybWF0IDIuNVxuXAorICBzbXQyLjYgfCBzbXRsaWIyLjYgICAgICAgICAgICAgU01ULUxJQiBmb3JtYXQgMi42XG5cCisgIHRwdHAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUFRQIGZvcm1hdCAoY25mIGFuZCBmb2YpXG5cCisgIHN5Z3VzICAgICAgICAgICAgICAgICAgICAgICAgICBTeUd1UyBmb3JtYXRcblwKK1xuXAorTGFuZ3VhZ2VzIGN1cnJlbnRseSBzdXBwb3J0ZWQgYXMgYXJndW1lbnRzIHRvIHRoZSAtLW91dHB1dC1sYW5nIG9wdGlvbjpcblwKKyAgYXV0byAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoIG91dHB1dCBsYW5ndWFnZSB0byBpbnB1dCBsYW5ndWFnZVxuXAorICBjdmM0IHwgcHJlc2VudGF0aW9uIHwgcGwgICAgICAgQ1ZDNCBwcmVzZW50YXRpb24gbGFuZ3VhZ2VcblwKKyAgY3ZjMyAgICAgICAgICAgICAgICAgICAgICAgICAgIENWQzMgcHJlc2VudGF0aW9uIGxhbmd1YWdlXG5cCisgIHNtdDEgfCBzbXRsaWIxICAgICAgICAgICAgICAgICBTTVQtTElCIGZvcm1hdCAxLjJcblwKKyAgc210IHwgc210bGliIHwgc210MiB8XG5cCisgIHNtdDIuMCB8IHNtdGxpYjIuMCB8IHNtdGxpYjIgICBTTVQtTElCIGZvcm1hdCAyLjBcblwKKyAgc210Mi41IHwgc210bGliMi41ICAgICAgICAgICAgIFNNVC1MSUIgZm9ybWF0IDIuNVxuXAorICBzbXQyLjYgfCBzbXRsaWIyLjYgICAgICAgICAgICAgU01ULUxJQiBmb3JtYXQgMi42XG5cCisgIHRwdHAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUFRQIGZvcm1hdFxuXAorICB6M3N0ciAgICAgICAgICAgICAgICAgICAgICAgICAgU01ULUxJQiAyLjAgd2l0aCBaMy1zdHIgc3RyaW5nIGNvbnN0cmFpbnRzXG5cCisgIGFzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbCBmb3JtYXQgKHNpbXBsZSBzeW50YXggdHJlZXMpXG5cCisiOworCitzdGQ6OnN0cmluZyBPcHRpb25zOjpnZXREZXNjcmlwdGlvbigpIGNvbnN0IHsKKyAgcmV0dXJuIG9wdGlvbnNEZXNjcmlwdGlvbjsKK30KKwordm9pZCBPcHRpb25zOjpwcmludFVzYWdlKGNvbnN0IHN0ZDo6c3RyaW5nIG1zZywgc3RkOjpvc3RyZWFtJiBvdXQpIHsKKyAgb3V0IDw8IG1zZyA8PCBvcHRpb25zRGVzY3JpcHRpb24gPDwgc3RkOjplbmRsCisgICAgICA8PCBvcHRpb25zRm9vdG5vdGUgPDwgc3RkOjplbmRsIDw8IHN0ZDo6Zmx1c2g7Cit9CisKK3ZvaWQgT3B0aW9uczo6cHJpbnRTaG9ydFVzYWdlKGNvbnN0IHN0ZDo6c3RyaW5nIG1zZywgc3RkOjpvc3RyZWFtJiBvdXQpIHsKKyAgb3V0IDw8IG1zZyA8PCBtb3N0Q29tbW9uT3B0aW9uc0Rlc2NyaXB0aW9uIDw8IHN0ZDo6ZW5kbAorICAgICAgPDwgb3B0aW9uc0Zvb3Rub3RlIDw8IHN0ZDo6ZW5kbAorICAgICAgPDwgIkZvciBmdWxsIHVzYWdlLCBwbGVhc2UgdXNlIC0taGVscC4iCisgICAgICA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsIDw8IHN0ZDo6Zmx1c2g7Cit9CisKK3ZvaWQgT3B0aW9uczo6cHJpbnRMYW5ndWFnZUhlbHAoc3RkOjpvc3RyZWFtJiBvdXQpIHsKKyAgb3V0IDw8IGxhbmd1YWdlRGVzY3JpcHRpb24gPDwgc3RkOjpmbHVzaDsKK30KKworLyoqCisgKiBUaGlzIGlzIGEgdGFibGUgb2YgbG9uZyBvcHRpb25zLiAgQnkgcG9saWN5LCBlYWNoIHNob3J0IG9wdGlvbgorICogc2hvdWxkIGhhdmUgYW4gZXF1aXZhbGVudCBsb25nIG9wdGlvbiAoYnV0IHRoZSByZXZlcnNlIGlzbid0IHRoZQorICogY2FzZSksIHNvIHRoaXMgdGFibGUgc2hvdWxkIHRodXMgY29udGFpbiBhbGwgY29tbWFuZC1saW5lIG9wdGlvbnMuCisgKgorICogRWFjaCBvcHRpb24gaW4gdGhpcyBhcnJheSBoYXMgZm91ciBlbGVtZW50czoKKyAqCisgKiAxLiB0aGUgbG9uZyBvcHRpb24gc3RyaW5nCisgKiAyLiBhcmd1bWVudCBiZWhhdmlvciBmb3IgdGhlIG9wdGlvbjoKKyAqICAgIG5vX2FyZ3VtZW50IC0gbm8gYXJndW1lbnQgcGVybWl0dGVkCisgKiAgICByZXF1aXJlZF9hcmd1bWVudCAtIGFuIGFyZ3VtZW50IGlzIGV4cGVjdGVkCisgKiAgICBvcHRpb25hbF9hcmd1bWVudCAtIGFuIGFyZ3VtZW50IGlzIHBlcm1pdHRlZCBidXQgbm90IHJlcXVpcmVkCisgKiAzLiB0aGlzIGlzIGEgcG9pbnRlciB0byBhbiBpbnQgd2hpY2ggaXMgc2V0IHRvIHRoZSA0dGggZW50cnkgb2YgdGhlCisgKiAgICBhcnJheSBpZiB0aGUgb3B0aW9uIGlzIHByZXNlbnQ7IG9yIE5VTEwsIGluIHdoaWNoIGNhc2UKKyAqICAgIGdldG9wdF9sb25nKCkgcmV0dXJucyB0aGUgNHRoIGVudHJ5CisgKiA0LiB0aGUgcmV0dXJuIHZhbHVlIGZvciBnZXRvcHRfbG9uZygpIHdoZW4gdGhpcyBsb25nIG9wdGlvbiAob3IgdGhlCisgKiAgICB2YWx1ZSB0byBzZXQgdGhlIDNyZCBlbnRyeSB0bzsgc2VlICMzKQorICoKKyAqIElmIHlvdSBhZGQgc29tZXRoaW5nIGhlcmUsIHlvdSBzaG91bGQgYWRkIGl0IGluIHNyYy9tYWluL3VzYWdlLmgKKyAqIGFsc28sIHRvIGRvY3VtZW50IGl0LgorICoKKyAqIElmIHlvdSBhZGQgc29tZXRoaW5nIHRoYXQgaGFzIGEgc2hvcnQgb3B0aW9uIGVxdWl2YWxlbnQsIHlvdSBzaG91bGQKKyAqIGFkZCBpdCB0byB0aGUgZ2V0b3B0X2xvbmcoKSBjYWxsIGluIHBhcnNlT3B0aW9ucygpLgorICovCitzdGF0aWMgc3RydWN0IG9wdGlvbiBjbWRsaW5lT3B0aW9uc1tdID0geyR7YWxsX21vZHVsZXNfbG9uZ19vcHRpb25zfQorICB7IE5VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAnXDAnIH0KK307LyogY21kbGluZU9wdGlvbnMgKi8KKworI2xpbmUgNTAyICIke3RlbXBsYXRlfSIKKworLy8gc3RhdGljIHZvaWQgcHJlZW1wdEdldG9wdChpbnQmIGFyZ2MsIGNoYXIqKiYgYXJndiwgY29uc3QgY2hhciogb3B0KSB7CisKKy8vICAgRGVidWcoInByZWVtcHRHZXRvcHQiKSA8PCAicHJlZW1wdGluZyBnZXRvcHQoKSB3aXRoICIgPDwgb3B0IDw8IHN0ZDo6ZW5kbDsKKworLy8gICBBbHdheXNBc3NlcnQob3B0ICE9IE5VTEwgJiYgKm9wdCAhPSAnXDAnKTsKKy8vICAgQWx3YXlzQXNzZXJ0KHN0cmxlbihvcHQpIDw9IG1heG9wdGxlbik7CisKKy8vICAgKythcmdjOworLy8gICB1bnNpZ25lZCBpID0gMTsKKy8vICAgd2hpbGUoYXJndltpXSAhPSBOVUxMICYmIGFyZ3ZbaV1bMF0gIT0gJ1wwJykgeworLy8gICAgICsraTsKKy8vICAgfQorCisvLyAgIGlmKGFyZ3ZbaV0gPT0gTlVMTCkgeworLy8gICAgIGFyZ3YgPSAoY2hhcioqKSByZWFsbG9jKGFyZ3YsIChpICsgNikgKiBzaXplb2YoY2hhciopKTsKKy8vICAgICBmb3IodW5zaWduZWQgaiA9IGk7IGogPCBpICsgNTsgKytqKSB7CisvLyAgICAgICBhcmd2W2pdID0gKGNoYXIqKSBtYWxsb2Moc2l6ZW9mKGNoYXIpICogbWF4b3B0bGVuKTsKKy8vICAgICAgIGFyZ3Zbal1bMF0gPSAnXDAnOworLy8gICAgIH0KKy8vICAgICBhcmd2W2kgKyA1XSA9IE5VTEw7CisvLyAgIH0KKworLy8gICBzdHJuY3B5KGFyZ3ZbaV0sIG9wdCwgbWF4b3B0bGVuIC0gMSk7CisvLyAgIGFyZ3ZbaV1bbWF4b3B0bGVuIC0gMV0gPSAnXDAnOyAvLyBlbnN1cmUgTlVMLXRlcm1pbmF0aW9uIGV2ZW4gb24gb3ZlcmZsb3cKKy8vIH0KKworbmFtZXNwYWNlIG9wdGlvbnMgeworCisvKiogU2V0IGEgZ2l2ZW4gT3B0aW9ucyogYXMgImN1cnJlbnQiIGp1c3QgZm9yIGEgcGFydGljdWxhciBzY29wZS4gKi8KK2NsYXNzIE9wdGlvbnNHdWFyZCB7CisgIENWQzRfVEhSRUFETE9DQUxfVFlQRShPcHRpb25zKikqIGRfZmllbGQ7CisgIE9wdGlvbnMqIGRfb2xkOworcHVibGljOgorICBPcHRpb25zR3VhcmQoQ1ZDNF9USFJFQURMT0NBTF9UWVBFKE9wdGlvbnMqKSogZmllbGQsIE9wdGlvbnMqIG9wdHMpIDoKKyAgICBkX2ZpZWxkKGZpZWxkKSwKKyAgICBkX29sZCgqZmllbGQpIHsKKyAgICAqZmllbGQgPSBvcHRzOworICB9CisgIH5PcHRpb25zR3VhcmQoKSB7CisgICAgKmRfZmllbGQgPSBkX29sZDsKKyAgfQorfTsvKiBjbGFzcyBPcHRpb25zR3VhcmQgKi8KKworfS8qIENWQzQ6Om9wdGlvbnMgbmFtZXNwYWNlICovCisKKy8qKgorICogUGFyc2UgYXJnYy9hcmd2IGFuZCBwdXQgdGhlIHJlc3VsdCBpbnRvIGEgQ1ZDNDo6T3B0aW9ucy4KKyAqIFRoZSByZXR1cm4gdmFsdWUgaXMgd2hhdCdzIGxlZnQgb2YgdGhlIGNvbW1hbmQgbGluZSAodGhhdCBpcywgdGhlCisgKiBub24tb3B0aW9uIGFyZ3VtZW50cykuCisgKi8KK3N0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBPcHRpb25zOjpwYXJzZU9wdGlvbnMoT3B0aW9ucyogb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkKKyAgdGhyb3coT3B0aW9uRXhjZXB0aW9uKSB7CisKKyAgQXNzZXJ0KG9wdGlvbnMgIT0gTlVMTCk7CisgIEFzc2VydChhcmd2ICE9IE5VTEwpOworCisgIG9wdGlvbnM6Ok9wdGlvbnNHdWFyZCBndWFyZCgmc19jdXJyZW50LCBvcHRpb25zKTsKKworICBjb25zdCBjaGFyICpwcm9nTmFtZSA9IGFyZ3ZbMF07CisKKyAgLy8gVG8gZGVidWcgb3B0aW9ucyBwYXJzaW5nLCB5b3UgbWF5IHByZWZlciB0byBzaW1wbHkgdW5jb21tZW50IHRoaXMKKyAgLy8gYW5kIHJlY29tcGlsZS4gRGVidWcgZmxhZ3MgaGF2ZSBub3QgYmVlbiBwYXJzZWQgeWV0IHNvIHRoZXNlIGhhdmUKKyAgLy8gbm90IGJlZW4gc2V0LgorICAvL0RlYnVnQ2hhbm5lbC5vbigib3B0aW9ucyIpOworCisgIERlYnVnKCJvcHRpb25zIikgPDwgIk9wdGlvbnM6OnBhcnNlT3B0aW9ucyA9PSAiIDw8IG9wdGlvbnMgPDwgc3RkOjplbmRsOworICBEZWJ1Zygib3B0aW9ucyIpIDw8ICJhcmd2ID09ICIgPDwgYXJndiA8PCBzdGQ6OmVuZGw7CisKKyAgLy8gRmluZCB0aGUgYmFzZSBuYW1lIG9mIHRoZSBwcm9ncmFtLgorICBjb25zdCBjaGFyICp4ID0gc3RycmNocihwcm9nTmFtZSwgJy8nKTsKKyAgaWYoeCAhPSBOVUxMKSB7CisgICAgcHJvZ05hbWUgPSB4ICsgMTsKKyAgfQorICBvcHRpb25zLT5kX2hvbGRlci0+YmluYXJ5X25hbWUgPSBzdGQ6OnN0cmluZyhwcm9nTmFtZSk7CisKKyAgQXJndW1lbnRFeHRlbmRlciogYXJndW1lbnRFeHRlbmRlciA9IG5ldyBBcmd1bWVudEV4dGVuZGVySW1wbGVtZW50YXRpb24oKTsKKyAgZm9yKGludCBwb3NpdGlvbiA9IDE7IHBvc2l0aW9uIDwgYXJnYzsgcG9zaXRpb24rKykgeworICAgIGFyZ3VtZW50RXh0ZW5kZXItPnB1c2hCYWNrQXJndW1lbnQoYXJndltwb3NpdGlvbl0pOworICB9CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG5vbm9wdGlvbnM7CisgIHBhcnNlT3B0aW9uc1JlY3Vyc2l2ZShvcHRpb25zLCBhcmd1bWVudEV4dGVuZGVyLCAmbm9ub3B0aW9ucyk7CisgIGlmKERlYnVnLmlzT24oIm9wdGlvbnMiKSl7CisgICAgZm9yKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaSA9IG5vbm9wdGlvbnMuYmVnaW4oKSwKKyAgICAgICAgICBpZW5kID0gbm9ub3B0aW9ucy5lbmQoKTsgaSAhPSBpZW5kOyArK2kpeworICAgICAgRGVidWcoIm9wdGlvbnMiKSA8PCAibm9ub3B0aW9ucyAiIDw8ICppIDw8IHN0ZDo6ZW5kbDsKKyAgICB9CisgIH0KKworICBkZWxldGUgYXJndW1lbnRFeHRlbmRlcjsKKyAgcmV0dXJuIG5vbm9wdGlvbnM7Cit9CisKK3ZvaWQgT3B0aW9uczo6cGFyc2VPcHRpb25zUmVjdXJzaXZlKE9wdGlvbnMqIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmd1bWVudEV4dGVuZGVyKiBleHRlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogbm9ub3B0aW9ucykKKyAgdGhyb3coT3B0aW9uRXhjZXB0aW9uKSB7CisKKyAgaW50IGFyZ2M7CisgIGNoYXIqKiBhcmd2OworCisgIGV4dGVuZGVyLT5tb3ZlUHJlZW1wdGlvbnNUb0FyZ3VtZW50cygpOworICBleHRlbmRlci0+cHVzaEZyb250QXJndW1lbnQoIiIpOworICBleHRlbmRlci0+Z2V0QXJndW1lbnRzKCZhcmdjLCAmYXJndik7CisKKyAgaWYoRGVidWcuaXNPbigib3B0aW9ucyIpKSB7CisgICAgRGVidWcoIm9wdGlvbnMiKSA8PCAic3RhcnRpbmcgYSBuZXcgcGFyc2VPcHRpb25zUmVjdXJzaXZlIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgPDwgYXJnYyA8PCAiIGFyZ3VtZW50cyIgPDwgc3RkOjplbmRsOworICAgIGZvciggaW50IGkgPSAwOyBpIDwgYXJnYyA7IGkrKyApeworICAgICAgQXNzZXJ0KGFyZ3ZbaV0gIT0gTlVMTCk7CisgICAgICBEZWJ1Zygib3B0aW9ucyIpIDw8ICIgIGFyZ3ZbIiA8PCBpIDw8ICJdID0gIiA8PCBhcmd2W2ldIDw8IHN0ZDo6ZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBIYXZpbmcgdGhpcyBzeW5vbnltIHNpbXBsaWZpZXMgdGhlIGdlbmVyYXRpb24gY29kZSBpbiBta29wdGlvbnMuCisgIG9wdGlvbnM6Ok9wdGlvbnNIYW5kbGVyKiBoYW5kbGVyID0gb3B0aW9ucy0+ZF9oYW5kbGVyOworICBvcHRpb25zOjpPcHRpb25zSG9sZGVyKiBob2xkZXIgPSBvcHRpb25zLT5kX2hvbGRlcjsKKworICAvLyBSZXNldCBnZXRvcHQoKSwgaW4gdGhlIGNhc2Ugb2YgbXVsdGlwbGUgY2FsbHMgdG8gcGFyc2VPcHRpb25zKCkuCisgIC8vIFRoaXMgY2FuIGJlID0gMSBpbiBuZXdlciBHTlUgZ2V0b3B0LCBidXQgb2xkZXIgKDwgMjAwNykgcmVxdWlyZSA9IDAuCisgIG9wdGluZCA9IDA7CisjaWYgSEFWRV9ERUNMX09QVFJFU0VUCisgIG9wdHJlc2V0ID0gMTsgLy8gb24gQlNEIGdldG9wdCgpIChlLmcuIE1hYyBPUyksIG1pZ2h0IG5lZWQgdGhpcworI2VuZGlmIC8qIEhBVkVfREVDTF9PUFRSRVNFVCAqLworCisgIAorICBpbnQgbWFpbl9vcHRpbmQgPSAwOworICBpbnQgb2xkX29wdGluZDsKKworCisgIHdoaWxlKHRydWUpIHsgLy8gUmVwZWF0IEZvcmV2ZXIKKworICAgIGlmKGV4dGVuZGVyLT5oYXNQcmVlbXB0aW9ucygpKXsKKyAgICAgIC8vIFN0b3AgdGhpcyByb3VuZCBvZiBwYXJzaW5nLiBXZSBub3cgcGFyc2UgcmVjdXJzaXZlbHkKKyAgICAgIC8vIHRvIHN0YXJ0IG9uIGEgbmV3IGNoYXJhY3RlciBhcnJheSBmb3IgYXJndi4KKyAgICAgIHBhcnNlT3B0aW9uc1JlY3Vyc2l2ZShvcHRpb25zLCBleHRlbmRlciwgbm9ub3B0aW9ucyk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBvcHRvcHQgPSAwOworICAgIHN0ZDo6c3RyaW5nIG9wdGlvbiwgb3B0aW9uYXJnOworCisgICAgb3B0aW5kID0gbWFpbl9vcHRpbmQ7CisgICAgb2xkX29wdGluZCA9IG1haW5fb3B0aW5kOworICAgIC8vb3B0aW5kX3JlZiA9ICZtYWluX29wdGluZDsKKyAgICAvL2FyZ3YgPSBtYWluX2FyZ3Y7CisKKyAgICAvLyBJZiB3ZSBlbmNvdW50ZXIgYW4gZWxlbWVudCB0aGF0IGlzIG5vdCBhdCB6ZXJvIGFuZCBkb2VzIG5vdCBzdGFydAorICAgIC8vIHdpdGggYSAiLSIsIHRoaXMgaXMgYSBub24tb3B0aW9uLiBXZSBjb25zdW1lIHRoaXMgZWxlbWVudCBhcyBhCisgICAgLy8gbm9uLW9wdGlvbi4KKyAgICBpZiAobWFpbl9vcHRpbmQgPiAwICYmIG1haW5fb3B0aW5kIDwgYXJnYyAmJgorICAgICAgICBhcmd2W21haW5fb3B0aW5kXVswXSAhPSAnLScpIHsKKyAgICAgIERlYnVnKCJvcHRpb25zIikgPDwgImVucXVldWVpbmcgIiA8PCBhcmd2W21haW5fb3B0aW5kXQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGFzIGEgbm9uLW9wdGlvbi4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIG5vbm9wdGlvbnMtPnB1c2hfYmFjayhhcmd2W21haW5fb3B0aW5kXSk7CisgICAgICArK21haW5fb3B0aW5kOworICAgICAgZXh0ZW5kZXItPnBvcEZyb250QXJndW1lbnQoKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworCisgICAgRGVidWcoIm9wdGlvbnMiKSA8PCAiWyBiZWZvcmUsIG1haW5fb3B0aW5kID09ICIgPDwgbWFpbl9vcHRpbmQgPDwgIiBdIgorICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOworICAgIERlYnVnKCJvcHRpb25zIikgPDwgIlsgYmVmb3JlLCBvcHRpbmQgPT0gIiA8PCBvcHRpbmQgPDwgIiBdIiA8PCBzdGQ6OmVuZGw7CisgICAgRGVidWcoIm9wdGlvbnMiKSA8PCAiWyBhcmdjID09ICIgPDwgYXJnYyA8PCAiLCBhcmd2ID09ICIgPDwgYXJndiA8PCAiIF0iCisgICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisgICAgaW50IGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LAorICAgICAgICAgICAgICAgICAgICAgICAgIis6JHthbGxfbW9kdWxlc19zaG9ydF9vcHRpb25zfSIsCisgICAgICAgICAgICAgICAgICAgICAgICBjbWRsaW5lT3B0aW9ucywgTlVMTCk7CisKKyAgICB3aGlsZShtYWluX29wdGluZCA8IG9wdGluZCkgeworICAgICAgbWFpbl9vcHRpbmQrKzsKKyAgICAgIGV4dGVuZGVyLT5wb3BGcm9udEFyZ3VtZW50KCk7CisgICAgfQorCisgICAgRGVidWcoIm9wdGlvbnMiKSA8PCAiWyBnb3QgIiA8PCBpbnQoYykgPDwgIiAoIiA8PCBjaGFyKGMpIDw8ICIpIF0iCisgICAgICAgICAgICAgICAgICAgICA8PCAiWyBuZXh0IG9wdGlvbiB3aWxsIGJlIGF0IHBvczogIiA8PCBvcHRpbmQgPDwgIiBdIgorICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOworCisgICAgLy8gVGhlIGluaXRpYWwgZ2V0b3B0X2xvbmcgY2FsbCBzaG91bGQgYWx3YXlzIGRldGVybWluZSB0aGF0IGFyZ3ZbMF0KKyAgICAvLyBpcyBub3QgYW4gb3B0aW9uIGFuZCByZXR1cm5zIC0xLiBXZSBhbHdheXMgbWFudWFsbHkgYWR2YW5jZSBiZXlvbmQKKyAgICAvLyB0aGlzIGVsZW1lbnQuCisgICAgLy8KKyAgICAvLyBXZSBoYXZlIHRvIHJlaW5pdGlhbGl6ZSBvcHRpbmQgdG8gMCBpbnN0ZWFkIG9mIDEgYXMgd2UgbmVlZCB0byBzdXBwb3J0CisgICAgLy8gY2hhbmdpbmcgdGhlIGFyZ3YgYXJyYXkgcGFzc2VkIHRvIGdldG9wdC4KKyAgICAvLyBUaGlzIGlzIG5lZWRlZCBhcyBhcmUgdXNpbmcgR05VIGV4dGVuc2lvbnMuCisgICAgLy8gRnJvbTogaHR0cDovL21hbjcub3JnL2xpbnV4L21hbi1wYWdlcy9tYW4zL2dldG9wdC4zLmh0bWwKKyAgICAvLyBBIHByb2dyYW0gdGhhdCBzY2FucyBtdWx0aXBsZSBhcmd1bWVudCB2ZWN0b3JzLCBvciByZXNjYW5zIHRoZSBzYW1lCisgICAgLy8gdmVjdG9yIG1vcmUgdGhhbiBvbmNlLCBhbmQgd2FudHMgdG8gbWFrZSB1c2Ugb2YgR05VIGV4dGVuc2lvbnMgc3VjaAorICAgIC8vIGFzICcrJyBhbmQgJy0nIGF0IHRoZSBzdGFydCBvZiBvcHRzdHJpbmcsIG9yIGNoYW5nZXMgdGhlIHZhbHVlIG9mCisgICAgLy8gIFBPU0lYTFlfQ09SUkVDVCBiZXR3ZWVuIHNjYW5zLCBtdXN0IHJlaW5pdGlhbGl6ZSBnZXRvcHQoKSBieQorICAgIC8vICByZXNldHRpbmcgb3B0aW5kIHRvIDAsIHJhdGhlciB0aGFuIHRoZSB0cmFkaXRpb25hbCB2YWx1ZSBvZiAxLgorICAgIC8vICAoUmVzZXR0aW5nIHRvIDAgZm9yY2VzIHRoZSBpbnZvY2F0aW9uIG9mIGFuIGludGVybmFsIGluaXRpYWxpemF0aW9uCisgICAgLy8gIHJvdXRpbmUgdGhhdCByZWNoZWNrcyBQT1NJWExZX0NPUlJFQ1QgYW5kIGNoZWNrcyBmb3IgR05VIGV4dGVuc2lvbnMKKyAgICAvLyAgaW4gb3B0c3RyaW5nLikKKyAgICBpZiAoIG9sZF9vcHRpbmQgPT0gMCAgJiYgYyA9PSAtMSApIHsKKyAgICAgIEFzc2VydChtYWluX29wdGluZCA+IDApOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKCBjID09IC0xICkgeworICAgICAgaWYoRGVidWcuaXNPbigib3B0aW9ucyIpKSB7CisgICAgICAgIERlYnVnKCJvcHRpb25zIikgPDwgImRvbmUgd2l0aCBvcHRpb24gcGFyc2luZyIgPDwgc3RkOjplbmRsOworICAgICAgICBmb3IoaW50IGluZGV4ID0gb3B0aW5kOyBpbmRleCA8IGFyZ2M7ICsraW5kZXgpIHsKKyAgICAgICAgICBEZWJ1Zygib3B0aW9ucyIpIDw8ICJyZW1haW5pbmcgIiA8PCBhcmd2W2luZGV4XSA8PCBzdGQ6OmVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIG9wdGlvbiA9IGFyZ3Zbb2xkX29wdGluZCA9PSAwID8gMSA6IG9sZF9vcHRpbmRdOworICAgIG9wdGlvbmFyZyA9IChvcHRhcmcgPT0gTlVMTCkgPyAiIiA6IG9wdGFyZzsKKworICAgIERlYnVnKCJwcmVlbXB0R2V0b3B0IikgPDwgInByb2Nlc3Npbmcgb3B0aW9uICIgPDwgYworICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAoYCIgPDwgY2hhcihjKSA8PCAiJyksICIgPDwgb3B0aW9uIDw8IHN0ZDo6ZW5kbDsKKworICAgIHN3aXRjaChjKSB7Ciske2FsbF9tb2R1bGVzX29wdGlvbl9oYW5kbGVyc30KKworI2xpbmUgNzI0ICIke3RlbXBsYXRlfSIKKworICAgIGNhc2UgJzonOgorICAgICAgLy8gVGhpcyBjYW4gYmUgYSBsb25nIG9yIHNob3J0IG9wdGlvbiwgYW5kIHRoZSB3YXkgdG8gZ2V0IGF0IHRoZQorICAgICAgLy8gbmFtZSBvZiBpdCBpcyBkaWZmZXJlbnQuCisgICAgICB0aHJvdyBPcHRpb25FeGNlcHRpb24oc3RkOjpzdHJpbmcoIm9wdGlvbiBgIikgKyBvcHRpb24gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIG1pc3NpbmcgaXRzIHJlcXVpcmVkIGFyZ3VtZW50Iik7CisKKyAgICBjYXNlICc/JzoKKyAgICBkZWZhdWx0OgorICAgICAgaWYoICggb3B0b3B0ID09IDAgfHwKKyAgICAgICAgICAgICggb3B0b3B0ID49ICR7bG9uZ19vcHRpb25fdmFsdWVfYmVnaW59ICYmCisgICAgICAgICAgICAgIG9wdG9wdCA8PSAke2xvbmdfb3B0aW9uX3ZhbHVlX2VuZH0gKQorICAgICAgICAgICkgJiYgIXN0cm5jbXAoYXJndltvcHRpbmQgLSAxXSwgIi0tdGhyZWFkIiwgOCkgJiYKKyAgICAgICAgICBzdHJsZW4oYXJndltvcHRpbmQgLSAxXSkgPiA4ICkKKyAgICAgIHsKKyAgICAgICAgaWYoISBpc2RpZ2l0KGFyZ3Zbb3B0aW5kIC0gMV1bOF0pKSB7CisgICAgICAgICAgdGhyb3cgT3B0aW9uRXhjZXB0aW9uKGZvcm1hdFRocmVhZE9wdGlvbkV4Y2VwdGlvbihvcHRpb24pKTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHRocmVhZEFyZ3YgPSBob2xkZXItPnRocmVhZEFyZ3Y7CisgICAgICAgIGNoYXIgKmVuZDsKKyAgICAgICAgbG9uZyB0bnVtID0gc3RydG9sKGFyZ3Zbb3B0aW5kIC0gMV0gKyA4LCAmZW5kLCAxMCk7CisgICAgICAgIGlmKHRudW0gPCAwIHx8ICgqZW5kICE9ICdcMCcgJiYgKmVuZCAhPSAnPScpKSB7CisgICAgICAgICAgdGhyb3cgT3B0aW9uRXhjZXB0aW9uKGZvcm1hdFRocmVhZE9wdGlvbkV4Y2VwdGlvbihvcHRpb24pKTsKKyAgICAgICAgfQorICAgICAgICBpZih0aHJlYWRBcmd2LnNpemUoKSA8PSBzaXplX3QodG51bSkpIHsKKyAgICAgICAgICB0aHJlYWRBcmd2LnJlc2l6ZSh0bnVtICsgMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYodGhyZWFkQXJndlt0bnVtXSAhPSAiIikgeworICAgICAgICAgIHRocmVhZEFyZ3ZbdG51bV0gKz0gIiAiOworICAgICAgICB9CisgICAgICAgIGlmKCplbmQgPT0gJ1wwJykgeyAvLyBlLmcuLCB3ZSBoYXZlIC0tdGhyZWFkMCAiZm9vIgorICAgICAgICAgIGlmKGFyZ2MgPD0gb3B0aW5kKSB7CisgICAgICAgICAgICB0aHJvdyBPcHRpb25FeGNlcHRpb24oc3RkOjpzdHJpbmcoIm9wdGlvbiBgIikgKyBvcHRpb24gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIG1pc3NpbmcgaXRzIHJlcXVpcmVkIGFyZ3VtZW50Iik7CisgICAgICAgICAgfQorICAgICAgICAgIERlYnVnKCJvcHRpb25zIikgPDwgInRocmVhZCAiIDw8IHRudW0gPDwgIiBnZXRzIG9wdGlvbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBhcmd2W29wdGluZF0gPDwgc3RkOjplbmRsOworICAgICAgICAgIHRocmVhZEFyZ3ZbdG51bV0gKz0gYXJndlttYWluX29wdGluZF07CisgICAgICAgICAgbWFpbl9vcHRpbmQrKzsKKyAgICAgICAgfSBlbHNlIHsgLy8gZS5nLiwgd2UgaGF2ZSAtLXRocmVhZDA9ImZvbyIKKyAgICAgICAgICBpZihlbmRbMV0gPT0gJ1wwJykgeworICAgICAgICAgICAgdGhyb3cgT3B0aW9uRXhjZXB0aW9uKHN0ZDo6c3RyaW5nKCJvcHRpb24gYCIpICsgb3B0aW9uICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyBtaXNzaW5nIGl0cyByZXF1aXJlZCBhcmd1bWVudCIpOworICAgICAgICAgIH0KKyAgICAgICAgICBEZWJ1Zygib3B0aW9ucyIpIDw8ICJ0aHJlYWQgIiA8PCB0bnVtIDw8ICIgZ2V0cyBvcHRpb24gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKGVuZCArIDEpIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICB0aHJlYWRBcmd2W3RudW1dICs9IGVuZCArIDE7CisgICAgICAgIH0KKyAgICAgICAgRGVidWcoIm9wdGlvbnMiKSA8PCAidGhyZWFkICIgPDwgdG51bSA8PCAiIG5vdyBoYXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHRocmVhZEFyZ3ZbdG51bV0gPDwgc3RkOjplbmRsOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgdGhyb3cgT3B0aW9uRXhjZXB0aW9uKHN0ZDo6c3RyaW5nKCJjYW4ndCB1bmRlcnN0YW5kIG9wdGlvbiBgIikgKyBvcHRpb24gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIiArIHN1Z2dlc3RDb21tYW5kTGluZU9wdGlvbnMob3B0aW9uKSk7CisgICAgfQorICB9CisKKyAgRGVidWcoIm9wdGlvbnMiKSA8PCAiZ290ICIgPDwgbm9ub3B0aW9ucy0+c2l6ZSgpCisgICAgICAgICAgICAgICAgICAgPDwgIiBub24tb3B0aW9uIGFyZ3VtZW50cy4iIDw8IHN0ZDo6ZW5kbDsKKworICBmcmVlKGFyZ3YpOworfQorCitzdGQ6OnN0cmluZyBPcHRpb25zOjpzdWdnZXN0Q29tbWFuZExpbmVPcHRpb25zKGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25OYW1lKSB0aHJvdygpIHsKKyAgRGlkWW91TWVhbiBkaWRZb3VNZWFuOworCisgIGNvbnN0IGNoYXIqIG9wdDsKKyAgZm9yKHNpemVfdCBpID0gMDsgKG9wdCA9IGNtZGxpbmVPcHRpb25zW2ldLm5hbWUpICE9IE5VTEw7ICsraSkgeworICAgIGRpZFlvdU1lYW4uYWRkV29yZChzdGQ6OnN0cmluZygiLS0iKSArIGNtZGxpbmVPcHRpb25zW2ldLm5hbWUpOworICB9CisKKyAgcmV0dXJuIGRpZFlvdU1lYW4uZ2V0TWF0Y2hBc1N0cmluZyhvcHRpb25OYW1lLnN1YnN0cigwLCBvcHRpb25OYW1lLmZpbmQoJz0nKSkpOworfQorCitzdGF0aWMgY29uc3QgY2hhciogc210T3B0aW9uc1tdID0geworICAke2FsbF9tb2R1bGVzX3NtdF9vcHRpb25zfSwKKyNsaW5lIDgwMiAiJHt0ZW1wbGF0ZX0iCisgIE5VTEwKK307Lyogc210T3B0aW9uc1tdICovCisKK3N0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBPcHRpb25zOjpzdWdnZXN0U210T3B0aW9ucyhjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uTmFtZSkgdGhyb3coKSB7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdWdnZXN0aW9uczsKKworICBjb25zdCBjaGFyKiBvcHQ7CisgIGZvcihzaXplX3QgaSA9IDA7IChvcHQgPSBzbXRPcHRpb25zW2ldKSAhPSBOVUxMOyArK2kpIHsKKyAgICBpZihzdGQ6OnN0cnN0cihvcHQsIG9wdGlvbk5hbWUuY19zdHIoKSkgIT0gTlVMTCkgeworICAgICAgc3VnZ2VzdGlvbnMucHVzaF9iYWNrKG9wdCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHN1Z2dlc3Rpb25zOworfQorCitzdGQ6OnZlY3Rvcjwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ID4gT3B0aW9uczo6Z2V0T3B0aW9ucygpIGNvbnN0IHRocm93KCkgeworICBzdGQ6OnZlY3Rvcjwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ID4gb3B0czsKKworICAke2FsbF9tb2R1bGVzX2dldF9vcHRpb25zfQorCisjbGluZSA4MjQgIiR7dGVtcGxhdGV9IgorCisgIHJldHVybiBvcHRzOworfQorCisKKyN1bmRlZiBVU0VfRUFSTFlfVFlQRV9DSEVDS0lOR19CWV9ERUZBVUxUCisjdW5kZWYgRE9fU0VNQU5USUNfQ0hFQ0tTX0JZX0RFRkFVTFQKKworfS8qIENWQzQgbmFtZXNwYWNlICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL2N2YzQtbWFzdGVyLXBhdGNoL3V0aWwvaW50ZWdlcl9nbXBfaW1wLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL2N2YzQtbWFzdGVyLXBhdGNoL3V0aWwvaW50ZWdlcl9nbXBfaW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJkMmM3ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvY3ZjNC1tYXN0ZXItcGF0Y2gvdXRpbC9pbnRlZ2VyX2dtcF9pbXAuaApAQCAtMCwwICsxLDUxMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qISBcZmlsZSBpbnRlZ2VyX2dtcF9pbXAuaAorICoqIFx2ZXJiYXRpbQorICoqIFRvcCBjb250cmlidXRvcnMgKHRvIGN1cnJlbnQgdmVyc2lvbik6CisgKiogICBUaW0gS2luZywgTW9yZ2FuIERldGVycywgTGlhbmEgSGFkYXJlYW4KKyAqKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQ1ZDNCBwcm9qZWN0LgorICoqIENvcHlyaWdodCAoYykgMjAwOS0yMDE2IGJ5IHRoZSBhdXRob3JzIGxpc3RlZCBpbiB0aGUgZmlsZSBBVVRIT1JTCisgKiogaW4gdGhlIHRvcC1sZXZlbCBzb3VyY2UgZGlyZWN0b3J5KSBhbmQgdGhlaXIgaW5zdGl0dXRpb25hbCBhZmZpbGlhdGlvbnMuCisgKiogQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSB0b3AtbGV2ZWwgc291cmNlCisgKiogZGlyZWN0b3J5IGZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24uXGVuZHZlcmJhdGltCisgKioKKyAqKiBcYnJpZWYgQSBtdWx0aXByZWNpc2lvbiBpbnRlZ2VyIGNvbnN0YW50OyB3cmFwcyBhIEdNUCBtdWx0aXByZWNpc2lvbgorICoqIGludGVnZXIuCisgKioKKyAqKiBBIG11bHRpcHJlY2lzaW9uIGludGVnZXIgY29uc3RhbnQ7IHdyYXBzIGEgR01QIG11bHRpcHJlY2lzaW9uIGludGVnZXIuCisgKiovCisKKyNpbmNsdWRlICJjdmM0X3B1YmxpYy5oIgorCisjaWZuZGVmIF9fQ1ZDNF9fSU5URUdFUl9ICisjZGVmaW5lIF9fQ1ZDNF9fSU5URUdFUl9ICisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8aW9zZndkPgorI2luY2x1ZGUgPGxpbWl0cz4KKworI2luY2x1ZGUgImJhc2UvZXhjZXB0aW9uLmgiCisjaW5jbHVkZSAidXRpbC9nbXBfdXRpbC5oIgorCituYW1lc3BhY2UgQ1ZDNCB7CisKK2NsYXNzIFJhdGlvbmFsOworCitjbGFzcyBDVkM0X1BVQkxJQyBJbnRlZ2VyIHsKK3ByaXZhdGU6CisgIC8qKgorICAgKiBTdG9yZXMgdGhlIHZhbHVlIG9mIHRoZSByYXRpb25hbCBpcyBzdG9yZWQgaW4gYSBDKysgR01QIGludGVnZXIgY2xhc3MuCisgICAqIFVzaW5nIHRoaXMgaW5zdGVhZCBvZiBtcHpfdCBhbGxvd3MgZm9yIGVhc2llciBkZXN0cnVjdGlvbi4KKyAgICovCisgIG1wel9jbGFzcyBkX3ZhbHVlOworCitwdWJsaWM6CisKKyAgLyoqCisgICAqIEdldHMgYSByZWZlcmVuY2UgdG8gdGhlIGdtcCBkYXRhIHRoYXQgYmFja3MgdXAgdGhlIGludGVnZXIuCisgICAqIE9ubHkgYWNjZXNzaWJsZSB0byBmcmllbmQgY2xhc3Nlcy4KKyAgICovCisgIGNvbnN0IG1wel9jbGFzcyYgZ2V0X21weigpIGNvbnN0IHsgcmV0dXJuIGRfdmFsdWU7IH0KKworICAvKioKKyAgICogQ29uc3RydWN0cyBhbiBJbnRlZ2VyIGJ5IGNvcHlpbmcgYSBHTVAgQysrIHByaW1pdGl2ZS4KKyAgICovCisgIEludGVnZXIoY29uc3QgbXB6X2NsYXNzJiB2YWwpIDogZF92YWx1ZSh2YWwpIHt9CisKKyAgLyoqIENvbnN0cnVjdHMgYSByYXRpb25hbCB3aXRoIHRoZSB2YWx1ZSAwLiAqLworICBJbnRlZ2VyKCkgOiBkX3ZhbHVlKDApe30KKworICAvKioKKyAgICogQ29uc3RydWN0cyBhIEludGVnZXIgZnJvbSBhIEMgc3RyaW5nLgorICAgKiBUaHJvd3Mgc3RkOjppbnZhbGlkX2FyZ3VtZW50IGlmIHRoZSBzdHJpbmcgaXMgbm90IGEgdmFsaWQgcmF0aW9uYWwuCisgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgaXMgYSB2YWxpZCByYXRpb25hbCBzdHJpbmcsCisgICAqIHNlZSBHTVAncyBkb2N1bWVudGF0aW9uIGZvciBtcHFfc2V0X3N0cigpLgorICAgKi8KKyAgZXhwbGljaXQgSW50ZWdlcihjb25zdCBjaGFyKiBzLCB1bnNpZ25lZCBiYXNlID0gMTApOworICBleHBsaWNpdCBJbnRlZ2VyKGNvbnN0IHN0ZDo6c3RyaW5nJiBzLCB1bnNpZ25lZCBiYXNlID0gMTApOworCisgIEludGVnZXIoY29uc3QgSW50ZWdlciYgcSkgOiBkX3ZhbHVlKHEuZF92YWx1ZSkge30KKworICBJbnRlZ2VyKCAgc2lnbmVkIGludCB6KSA6IGRfdmFsdWUoeikge30KKyAgSW50ZWdlcih1bnNpZ25lZCBpbnQgeikgOiBkX3ZhbHVlKHopIHt9CisgIEludGVnZXIoICBzaWduZWQgbG9uZyBpbnQgeikgOiBkX3ZhbHVlKHopIHt9CisgIEludGVnZXIodW5zaWduZWQgbG9uZyBpbnQgeikgOiBkX3ZhbHVlKHopIHt9CisKKyNpZmRlZiBDVkM0X05FRURfSU5UNjRfVF9PVkVSTE9BRFMKKyAgSW50ZWdlciggaW50NjRfdCB6KSA6IGRfdmFsdWUoc3RhdGljX2Nhc3Q8bG9uZz4oeikpIHt9CisgIEludGVnZXIodWludDY0X3QgeikgOiBkX3ZhbHVlKHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KHopKSB7fQorI2VuZGlmIC8qIENWQzRfTkVFRF9JTlQ2NF9UX09WRVJMT0FEUyAqLworCisgIH5JbnRlZ2VyKCkge30KKworICBJbnRlZ2VyJiBvcGVyYXRvcj0oY29uc3QgSW50ZWdlciYgeCl7CisgICAgaWYodGhpcyA9PSAmeCkgcmV0dXJuICp0aGlzOworICAgIGRfdmFsdWUgPSB4LmRfdmFsdWU7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEludGVnZXImIHkpIGNvbnN0IHsKKyAgICByZXR1cm4gZF92YWx1ZSA9PSB5LmRfdmFsdWU7CisgIH0KKworICBJbnRlZ2VyIG9wZXJhdG9yLSgpIGNvbnN0IHsKKyAgICByZXR1cm4gSW50ZWdlcigtKGRfdmFsdWUpKTsKKyAgfQorCisKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEludGVnZXImIHkpIGNvbnN0IHsKKyAgICByZXR1cm4gZF92YWx1ZSAhPSB5LmRfdmFsdWU7CisgIH0KKworICBib29sIG9wZXJhdG9yPCAoY29uc3QgSW50ZWdlciYgeSkgY29uc3QgeworICAgIHJldHVybiBkX3ZhbHVlIDwgeS5kX3ZhbHVlOworICB9CisKKyAgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IEludGVnZXImIHkpIGNvbnN0IHsKKyAgICByZXR1cm4gZF92YWx1ZSA8PSB5LmRfdmFsdWU7CisgIH0KKworICBib29sIG9wZXJhdG9yPiAoY29uc3QgSW50ZWdlciYgeSkgY29uc3QgeworICAgIHJldHVybiBkX3ZhbHVlID4geS5kX3ZhbHVlOworICB9CisKKyAgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEludGVnZXImIHkpIGNvbnN0IHsKKyAgICByZXR1cm4gZF92YWx1ZSA+PSB5LmRfdmFsdWU7CisgIH0KKworCisgIEludGVnZXIgb3BlcmF0b3IrKGNvbnN0IEludGVnZXImIHkpIGNvbnN0IHsKKyAgICByZXR1cm4gSW50ZWdlciggZF92YWx1ZSArIHkuZF92YWx1ZSApOworICB9CisgIEludGVnZXImIG9wZXJhdG9yKz0oY29uc3QgSW50ZWdlciYgeSkgeworICAgIGRfdmFsdWUgKz0geS5kX3ZhbHVlOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIEludGVnZXIgb3BlcmF0b3ItKGNvbnN0IEludGVnZXImIHkpIGNvbnN0IHsKKyAgICByZXR1cm4gSW50ZWdlciggZF92YWx1ZSAtIHkuZF92YWx1ZSApOworICB9CisgIEludGVnZXImIG9wZXJhdG9yLT0oY29uc3QgSW50ZWdlciYgeSkgeworICAgIGRfdmFsdWUgLT0geS5kX3ZhbHVlOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIEludGVnZXIgb3BlcmF0b3IqKGNvbnN0IEludGVnZXImIHkpIGNvbnN0IHsKKyAgICByZXR1cm4gSW50ZWdlciggZF92YWx1ZSAqIHkuZF92YWx1ZSApOworICB9CisgIEludGVnZXImIG9wZXJhdG9yKj0oY29uc3QgSW50ZWdlciYgeSkgeworICAgIGRfdmFsdWUgKj0geS5kX3ZhbHVlOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisKKyAgSW50ZWdlciBiaXR3aXNlT3IoY29uc3QgSW50ZWdlciYgeSkgY29uc3QgeworICAgIG1wel9jbGFzcyByZXN1bHQ7CisgICAgbXB6X2lvcihyZXN1bHQuZ2V0X21wel90KCksIGRfdmFsdWUuZ2V0X21wel90KCksIHkuZF92YWx1ZS5nZXRfbXB6X3QoKSk7CisgICAgcmV0dXJuIEludGVnZXIocmVzdWx0KTsKKyAgfQorCisgIEludGVnZXIgYml0d2lzZUFuZChjb25zdCBJbnRlZ2VyJiB5KSBjb25zdCB7CisgICAgbXB6X2NsYXNzIHJlc3VsdDsKKyAgICBtcHpfYW5kKHJlc3VsdC5nZXRfbXB6X3QoKSwgZF92YWx1ZS5nZXRfbXB6X3QoKSwgeS5kX3ZhbHVlLmdldF9tcHpfdCgpKTsKKyAgICByZXR1cm4gSW50ZWdlcihyZXN1bHQpOworICB9CisKKyAgSW50ZWdlciBiaXR3aXNlWG9yKGNvbnN0IEludGVnZXImIHkpIGNvbnN0IHsKKyAgICBtcHpfY2xhc3MgcmVzdWx0OworICAgIG1wel94b3IocmVzdWx0LmdldF9tcHpfdCgpLCBkX3ZhbHVlLmdldF9tcHpfdCgpLCB5LmRfdmFsdWUuZ2V0X21wel90KCkpOworICAgIHJldHVybiBJbnRlZ2VyKHJlc3VsdCk7CisgIH0KKworICBJbnRlZ2VyIGJpdHdpc2VOb3QoKSBjb25zdCB7CisgICAgbXB6X2NsYXNzIHJlc3VsdDsKKyAgICBtcHpfY29tKHJlc3VsdC5nZXRfbXB6X3QoKSwgZF92YWx1ZS5nZXRfbXB6X3QoKSk7CisgICAgcmV0dXJuIEludGVnZXIocmVzdWx0KTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm4gdGhpcyooMl5wb3cpLgorICAgKi8KKyAgSW50ZWdlciBtdWx0aXBseUJ5UG93Mih1aW50MzJfdCBwb3cpIGNvbnN0eworICAgIG1wel9jbGFzcyByZXN1bHQ7CisgICAgbXB6X211bF8yZXhwKHJlc3VsdC5nZXRfbXB6X3QoKSwgZF92YWx1ZS5nZXRfbXB6X3QoKSwgcG93KTsKKyAgICByZXR1cm4gSW50ZWdlciggcmVzdWx0ICk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgSW50ZWdlciBvYnRhaW5lZCBieSBzZXR0aW5nIHRoZSBpdGggYml0IG9mIHRoZQorICAgKiBjdXJyZW50IEludGVnZXIgdG8gMS4KKyAgICovCisgIEludGVnZXIgc2V0Qml0KHVpbnQzMl90IGkpIGNvbnN0IHsKKyAgICBtcHpfY2xhc3MgcmVzID0gZF92YWx1ZTsKKyAgICBtcHpfc2V0Yml0KHJlcy5nZXRfbXB6X3QoKSwgaSk7CisgICAgcmV0dXJuIEludGVnZXIocmVzKTsKKyAgfQorCisgIGJvb2wgaXNCaXRTZXQodWludDMyX3QgaSkgY29uc3QgeworICAgIHJldHVybiAhZXh0cmFjdEJpdFJhbmdlKDEsIGkpLmlzWmVybygpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGludGVnZXIgd2l0aCB0aGUgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHNpemUgYml0cworICAgKiBleHRlbmRlZCB3aXRoIGFtb3VudCAxJ3MKKyAgICovCisgIEludGVnZXIgb25lRXh0ZW5kKHVpbnQzMl90IHNpemUsIHVpbnQzMl90IGFtb3VudCkgY29uc3Q7CisKKyAgdWludDMyX3QgdG9VbnNpZ25lZEludCgpIGNvbnN0IHsKKyAgICByZXR1cm4gIG1wel9nZXRfdWkoZF92YWx1ZS5nZXRfbXB6X3QoKSk7CisgIH0KKworICAvKiogU2VlIEdNUCBEb2N1bWVudGF0aW9uLiAqLworICBJbnRlZ2VyIGV4dHJhY3RCaXRSYW5nZSh1aW50MzJfdCBiaXRDb3VudCwgdWludDMyX3QgbG93KSBjb25zdCB7CisgICAgLy8gYml0Q291bnQgPSBoaWdoLWxvdysxCisgICAgdWludDMyX3QgaGlnaCA9IGxvdyArIGJpdENvdW50LTE7CisgICAgLy/igJQgRnVuY3Rpb246IHZvaWQgbXB6X2ZkaXZfcl8yZXhwIChtcHpfdCByLCBtcHpfdCBuLCBtcF9iaXRjbnRfdCBiKQorICAgIG1wel9jbGFzcyByZW0sIGRpdjsKKyAgICBtcHpfZmRpdl9yXzJleHAocmVtLmdldF9tcHpfdCgpLCBkX3ZhbHVlLmdldF9tcHpfdCgpLCBoaWdoKzEpOworICAgIG1wel9mZGl2X3FfMmV4cChkaXYuZ2V0X21wel90KCksIHJlbS5nZXRfbXB6X3QoKSwgbG93KTsKKworICAgIHJldHVybiBJbnRlZ2VyKGRpdik7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgZmxvb3IodGhpcyAvIHkpCisgICAqLworICBJbnRlZ2VyIGZsb29yRGl2aWRlUXVvdGllbnQoY29uc3QgSW50ZWdlciYgeSkgY29uc3QgeworICAgIG1wel9jbGFzcyBxOworICAgIG1wel9mZGl2X3EocS5nZXRfbXB6X3QoKSwgZF92YWx1ZS5nZXRfbXB6X3QoKSwgeS5kX3ZhbHVlLmdldF9tcHpfdCgpKTsKKyAgICByZXR1cm4gSW50ZWdlciggcSApOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgciA9PSB0aGlzIC0gZmxvb3IodGhpcy95KSp5CisgICAqLworICBJbnRlZ2VyIGZsb29yRGl2aWRlUmVtYWluZGVyKGNvbnN0IEludGVnZXImIHkpIGNvbnN0IHsKKyAgICBtcHpfY2xhc3MgcjsKKyAgICBtcHpfZmRpdl9yKHIuZ2V0X21wel90KCksIGRfdmFsdWUuZ2V0X21wel90KCksIHkuZF92YWx1ZS5nZXRfbXB6X3QoKSk7CisgICAgcmV0dXJuIEludGVnZXIoIHIgKTsKKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlcyBhIGZsb29yIHF1b3RpZW50IGFuZCByZW1haW5kZXIgZm9yIHggZGl2aWRlZCBieSB5LgorICAgKi8KKyAgc3RhdGljIHZvaWQgZmxvb3JRUihJbnRlZ2VyJiBxLCBJbnRlZ2VyJiByLCBjb25zdCBJbnRlZ2VyJiB4LCBjb25zdCBJbnRlZ2VyJiB5KSB7CisgICAgbXB6X2ZkaXZfcXIocS5kX3ZhbHVlLmdldF9tcHpfdCgpLCByLmRfdmFsdWUuZ2V0X21wel90KCksIHguZF92YWx1ZS5nZXRfbXB6X3QoKSwgeS5kX3ZhbHVlLmdldF9tcHpfdCgpKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBjZWlsKHRoaXMgLyB5KQorICAgKi8KKyAgSW50ZWdlciBjZWlsaW5nRGl2aWRlUXVvdGllbnQoY29uc3QgSW50ZWdlciYgeSkgY29uc3QgeworICAgIG1wel9jbGFzcyBxOworICAgIG1wel9jZGl2X3EocS5nZXRfbXB6X3QoKSwgZF92YWx1ZS5nZXRfbXB6X3QoKSwgeS5kX3ZhbHVlLmdldF9tcHpfdCgpKTsKKyAgICByZXR1cm4gSW50ZWdlciggcSApOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGNlaWwodGhpcyAvIHkpCisgICAqLworICBJbnRlZ2VyIGNlaWxpbmdEaXZpZGVSZW1haW5kZXIoY29uc3QgSW50ZWdlciYgeSkgY29uc3QgeworICAgIG1wel9jbGFzcyByOworICAgIG1wel9jZGl2X3Ioci5nZXRfbXB6X3QoKSwgZF92YWx1ZS5nZXRfbXB6X3QoKSwgeS5kX3ZhbHVlLmdldF9tcHpfdCgpKTsKKyAgICByZXR1cm4gSW50ZWdlciggciApOworICB9CisKKyAgLyoqCisgICAqIENvbXB1dGVzIGEgcXVvaXRlbnQgYW5kIHJlbWFpbmRlciBhY2NvcmRpbmcgdG8gQm91dGUncyBFdWNsaWRlYW4gZGVmaW5pdGlvbi4KKyAgICogZXVjbGlkaWFuRGl2aWRlUXVvdGllbnQsIGV1Y2xpZGlhbkRpdmlkZVJlbWFpbmRlci4KKyAgICoKKyAgICogQm91dGUsIFJheW1vbmQgVC4gKEFwcmlsIDE5OTIpLgorICAgKiBUaGUgRXVjbGlkZWFuIGRlZmluaXRpb24gb2YgdGhlIGZ1bmN0aW9ucyBkaXYgYW5kIG1vZC4KKyAgICogQUNNIFRyYW5zYWN0aW9ucyBvbiBQcm9ncmFtbWluZyBMYW5ndWFnZXMgYW5kIFN5c3RlbXMgKFRPUExBUykKKyAgICogQUNNIFByZXNzLiAxNCAoMik6IDEyNyAtIDE0NC4gZG9pOjEwLjExNDUvMTI4ODYxLjEyODg2Mi4KKyAgICovCisgIHN0YXRpYyB2b2lkIGV1Y2xpZGlhblFSKEludGVnZXImIHEsIEludGVnZXImIHIsIGNvbnN0IEludGVnZXImIHgsIGNvbnN0IEludGVnZXImIHkpIHsKKyAgICAvLyBjb21wdXRlIHRoZSBmbG9vciBhbmQgdGhlbiBmaXggdGhlIHZhbHVlIHVwIGlmIG5lZWRlZC4KKyAgICBmbG9vclFSKHEscix4LHkpOworCisgICAgaWYoci5zdHJpY3RseU5lZ2F0aXZlKCkpeworICAgICAgLy8gaWYgciA8IDAKKyAgICAgIC8vIGFicyhyKSA8IGFicyh5KQorICAgICAgLy8gLSBhYnMoeSkgPCByIDwgMCwgdGhlbiAwIDwgciArIGFicyh5KSA8IGFicyh5KQorICAgICAgLy8gbiA9IHkgKiBxICsgcgorICAgICAgLy8gbiA9IHkgKiBxIC0gYWJzKHkpICsgciArIGFicyh5KQorICAgICAgaWYoci5zZ24oKSA+PSAwKXsKKyAgICAgICAgLy8geSA9IGFicyh5KQorICAgICAgICAvLyBuID0geSAqIHEgLSB5ICsgciArIHkKKyAgICAgICAgLy8gbiA9IHkgKiAocS0xKSArIChyK3kpCisgICAgICAgIHEgLT0gMTsKKyAgICAgICAgciArPSB5OworICAgICAgfWVsc2V7CisgICAgICAgIC8vIHkgPSAtYWJzKHkpCisgICAgICAgIC8vIG4gPSB5ICogcSArIHkgKyByIC0geQorICAgICAgICAvLyBuID0geSAqIChxKzEpICsgKHIteSkKKyAgICAgICAgcSArPSAxOworICAgICAgICByIC09IHk7CisgICAgICB9CisgICAgfQorICB9CisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBxdW9pdGVudCBhY2NvcmRpbmcgdG8gQm91dGUncyBFdWNsaWRlYW4gZGVmaW5pdGlvbi4KKyAgICogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBldWNsaWRpYW5RUi4KKyAgICovCisgIEludGVnZXIgZXVjbGlkaWFuRGl2aWRlUXVvdGllbnQoY29uc3QgSW50ZWdlciYgeSkgY29uc3QgeworICAgIEludGVnZXIgcSxyOworICAgIGV1Y2xpZGlhblFSKHEsciwgKnRoaXMsIHkpOworICAgIHJldHVybiBxOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIHJlbWFpbmZpbmcgYWNjb3JkaW5nIHRvIEJvdXRlJ3MgRXVjbGlkZWFuIGRlZmluaXRpb24uCisgICAqIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgZXVjbGlkaWFuUVIuCisgICAqLworICBJbnRlZ2VyIGV1Y2xpZGlhbkRpdmlkZVJlbWFpbmRlcihjb25zdCBJbnRlZ2VyJiB5KSBjb25zdCB7CisgICAgSW50ZWdlciBxLHI7CisgICAgZXVjbGlkaWFuUVIocSxyLCAqdGhpcywgeSk7CisgICAgcmV0dXJuIHI7CisgIH0KKworCisgIC8qKgorICAgKiBJZiB5IGRpdmlkZXMgKnRoaXMsIHRoZW4gZXhhY3RRdW90aWVudCByZXR1cm5zICh0aGlzL3kpCisgICAqLworICBJbnRlZ2VyIGV4YWN0UXVvdGllbnQoY29uc3QgSW50ZWdlciYgeSkgY29uc3Q7CisKKyAgLyoqCisgICAqIFJldHVybnMgeSBtb2QgMl5leHAKKyAgICovCisgIEludGVnZXIgbW9kQnlQb3cyKHVpbnQzMl90IGV4cCkgY29uc3QgeworICAgIG1wel9jbGFzcyByZXM7CisgICAgbXB6X2ZkaXZfcl8yZXhwKHJlcy5nZXRfbXB6X3QoKSwgZF92YWx1ZS5nZXRfbXB6X3QoKSwgZXhwKTsKKyAgICByZXR1cm4gSW50ZWdlcihyZXMpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgeSAvIDJeZXhwCisgICAqLworICBJbnRlZ2VyIGRpdkJ5UG93Mih1aW50MzJfdCBleHApIGNvbnN0IHsKKyAgICBtcHpfY2xhc3MgcmVzOworICAgIG1wel9mZGl2X3FfMmV4cChyZXMuZ2V0X21wel90KCksIGRfdmFsdWUuZ2V0X21wel90KCksIGV4cCk7CisgICAgcmV0dXJuIEludGVnZXIocmVzKTsKKyAgfQorCisKKyAgaW50IHNnbigpIGNvbnN0IHsKKyAgICByZXR1cm4gbXB6X3NnbihkX3ZhbHVlLmdldF9tcHpfdCgpKTsKKyAgfQorCisgIGlubGluZSBib29sIHN0cmljdGx5UG9zaXRpdmUoKSBjb25zdCB7CisgICAgcmV0dXJuIHNnbigpID4gMDsKKyAgfQorCisgIGlubGluZSBib29sIHN0cmljdGx5TmVnYXRpdmUoKSBjb25zdCB7CisgICAgcmV0dXJuIHNnbigpIDwgMDsKKyAgfQorCisgIGlubGluZSBib29sIGlzWmVybygpIGNvbnN0IHsKKyAgICByZXR1cm4gc2duKCkgPT0gMDsKKyAgfQorCisgIGJvb2wgaXNPbmUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1wel9jbXBfc2koZF92YWx1ZS5nZXRfbXB6X3QoKSwgMSkgPT0gMDsKKyAgfQorCisgIGJvb2wgaXNOZWdhdGl2ZU9uZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbXB6X2NtcF9zaShkX3ZhbHVlLmdldF9tcHpfdCgpLCAtMSkgPT0gMDsKKyAgfQorCisgIC8qKgorICAgKiBSYWlzZSB0aGlzIEludGVnZXIgdG8gdGhlIHBvd2VyIDxjb2RlPmV4cDwvY29kZT4uCisgICAqCisgICAqIEBwYXJhbSBleHAgdGhlIGV4cG9uZW50CisgICAqLworICBJbnRlZ2VyIHBvdyh1bnNpZ25lZCBsb25nIGludCBleHApIGNvbnN0IHsKKyAgICBtcHpfY2xhc3MgcmVzdWx0OworICAgIG1wel9wb3dfdWkocmVzdWx0LmdldF9tcHpfdCgpLCBkX3ZhbHVlLmdldF9tcHpfdCgpLCBleHApOworICAgIHJldHVybiBJbnRlZ2VyKHJlc3VsdCk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJuIHRoZSBncmVhdGVzdCBjb21tb24gZGl2aXNvciBvZiB0aGlzIGludGVnZXIgd2l0aCBhbm90aGVyLgorICAgKi8KKyAgSW50ZWdlciBnY2QoY29uc3QgSW50ZWdlciYgeSkgY29uc3QgeworICAgIG1wel9jbGFzcyByZXN1bHQ7CisgICAgbXB6X2djZChyZXN1bHQuZ2V0X21wel90KCksIGRfdmFsdWUuZ2V0X21wel90KCksIHkuZF92YWx1ZS5nZXRfbXB6X3QoKSk7CisgICAgcmV0dXJuIEludGVnZXIocmVzdWx0KTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm4gdGhlIGxlYXN0IGNvbW1vbiBtdWx0aXBsZSBvZiB0aGlzIGludGVnZXIgd2l0aCBhbm90aGVyLgorICAgKi8KKyAgSW50ZWdlciBsY20oY29uc3QgSW50ZWdlciYgeSkgY29uc3QgeworICAgIG1wel9jbGFzcyByZXN1bHQ7CisgICAgbXB6X2xjbShyZXN1bHQuZ2V0X21wel90KCksIGRfdmFsdWUuZ2V0X21wel90KCksIHkuZF92YWx1ZS5nZXRfbXB6X3QoKSk7CisgICAgcmV0dXJuIEludGVnZXIocmVzdWx0KTsKKyAgfQorCisgIC8qKgorICAgKiBBbGwgbm9uLXplcm8gaW50ZWdlcnMgeiwgei5kaXZpZGUoMCkKKyAgICogISB6ZXJvLmRpdmlkZXMoemVybykKKyAgICovCisgIGJvb2wgZGl2aWRlcyhjb25zdCBJbnRlZ2VyJiB5KSBjb25zdCB7CisgICAgaW50IHJlcyA9IG1wel9kaXZpc2libGVfcCh5LmRfdmFsdWUuZ2V0X21wel90KCksIGRfdmFsdWUuZ2V0X21wel90KCkpOworICAgIHJldHVybiByZXMgIT0gMDsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm4gdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoaXMgaW50ZWdlci4KKyAgICovCisgIEludGVnZXIgYWJzKCkgY29uc3QgeworICAgIHJldHVybiBkX3ZhbHVlID49IDAgPyAqdGhpcyA6IC0qdGhpczsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKGludCBiYXNlID0gMTApIGNvbnN0eworICAgIHJldHVybiBkX3ZhbHVlLmdldF9zdHIoYmFzZSk7CisgIH0KKworICBib29sIGZpdHNTaWduZWRJbnQoKSBjb25zdDsKKworICBib29sIGZpdHNVbnNpZ25lZEludCgpIGNvbnN0OworCisgIHNpZ25lZCBpbnQgZ2V0U2lnbmVkSW50KCkgY29uc3Q7CisKKyAgdW5zaWduZWQgaW50IGdldFVuc2lnbmVkSW50KCkgY29uc3Q7CisKKyAgYm9vbCBmaXRzU2lnbmVkTG9uZygpIGNvbnN0OworCisgIGJvb2wgZml0c1Vuc2lnbmVkTG9uZygpIGNvbnN0OworCisgIGxvbmcgZ2V0TG9uZygpIGNvbnN0IHsKKyAgICBsb25nIHNpID0gZF92YWx1ZS5nZXRfc2koKTsKKyAgICAvLyBlbnN1cmUgdGhlcmUgd2Fzbid0IG92ZXJmbG93CisgICAgQ2hlY2tBcmd1bWVudChtcHpfY21wX3NpKGRfdmFsdWUuZ2V0X21wel90KCksIHNpKSA9PSAwLCB0aGlzLAorICAgICAgICAgICAgICAgICAiT3ZlcmZsb3cgZGV0ZWN0ZWQgaW4gSW50ZWdlcjo6Z2V0TG9uZygpLiIpOworICAgIHJldHVybiBzaTsKKyAgfQorCisgIHVuc2lnbmVkIGxvbmcgZ2V0VW5zaWduZWRMb25nKCkgY29uc3QgeworICAgIHVuc2lnbmVkIGxvbmcgdWkgPSBkX3ZhbHVlLmdldF91aSgpOworICAgIC8vIGVuc3VyZSB0aGVyZSB3YXNuJ3Qgb3ZlcmZsb3cKKyAgICBDaGVja0FyZ3VtZW50KG1wel9jbXBfdWkoZF92YWx1ZS5nZXRfbXB6X3QoKSwgdWkpID09IDAsIHRoaXMsCisgICAgICAgICAgICAgICAgICAiT3ZlcmZsb3cgZGV0ZWN0ZWQgaW4gSW50ZWdlcjo6Z2V0VW5zaWduZWRMb25nKCkuIik7CisgICAgcmV0dXJuIHVpOworICB9CisKKyAgLyoqCisgICAqIENvbXB1dGVzIHRoZSBoYXNoIG9mIHRoZSBub2RlIGZyb20gdGhlIGZpcnN0IHdvcmQgb2YgdGhlCisgICAqIG51bWVyYXRvciwgdGhlIGRlbm9taW5hdG9yLgorICAgKi8KKyAgc2l6ZV90IGhhc2goKSBjb25zdCB7CisgICAgcmV0dXJuIGdtcHpfaGFzaChkX3ZhbHVlLmdldF9tcHpfdCgpKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRydWUgaWZmIGJpdCBuIGlzIHNldC4KKyAgICoKKyAgICogQHBhcmFtIG4gdGhlIGJpdCB0byB0ZXN0ICgwID09IGxlYXN0IHNpZ25pZmljYW50IGJpdCkKKyAgICogQHJldHVybiB0cnVlIGlmIGJpdCBuIGlzIHNldCBpbiB0aGlzIGludGVnZXI7IGZhbHNlIG90aGVyd2lzZQorICAgKi8KKyAgYm9vbCB0ZXN0Qml0KHVuc2lnbmVkIG4pIGNvbnN0IHsKKyAgICByZXR1cm4gbXB6X3RzdGJpdChkX3ZhbHVlLmdldF9tcHpfdCgpLCBuKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIGsgaWYgdGhlIGludGVnZXIgaXMgZXF1YWwgdG8gMl4oay0xKQorICAgKiBAcmV0dXJuIGsgaWYgdGhlIGludGVnZXIgaXMgZXF1YWwgdG8gMl4oay0xKSBhbmQgMCBvdGhlcndpc2UKKyAgICovCisgIHVuc2lnbmVkIGlzUG93MigpIGNvbnN0IHsKKyAgICBpZiAoZF92YWx1ZSA8PSAwKSByZXR1cm4gMDsKKyAgICAvLyBjaGVjayB0aGF0IHRoZSBudW1iZXIgb2Ygb25lcyBpbiB0aGUgYmluYXJ5IHJlcHJlc2VudGF0aW9uIGlzIDEKKyAgICBpZiAobXB6X3BvcGNvdW50KGRfdmFsdWUuZ2V0X21wel90KCkpID09IDEpIHsKKyAgICAgIC8vIHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9uZSBwbHVzIDEKKyAgICAgIHJldHVybiBtcHpfc2NhbjEoZF92YWx1ZS5nZXRfbXB6X3QoKSwgMCkgKyAxOworICAgIH0KKyAgICByZXR1cm4gMDsgCisgIH0KKworICAKKyAgLyoqCisgICAqIElmIHggIT0gMCwgcmV0dXJucyB0aGUgc21hbGxlc3QgbiBzLnQuIDJee24tMX0gPD0gYWJzKHgpIDwgMl57bn0uCisgICAqIElmIHggPT0gMCwgcmV0dXJucyAxLgorICAgKi8KKyAgc2l6ZV90IGxlbmd0aCgpIGNvbnN0IHsKKyAgICBpZihzZ24oKSA9PSAwKXsKKyAgICAgIHJldHVybiAxOworICAgIH1lbHNleworICAgICAgcmV0dXJuIG1wel9zaXplaW5iYXNlKGRfdmFsdWUuZ2V0X21wel90KCksMik7CisgICAgfQorICB9CisKKyAgc3RhdGljIHZvaWQgZXh0ZW5kZWRHY2QoSW50ZWdlciYgZywgSW50ZWdlciYgcywgSW50ZWdlciYgdCwgY29uc3QgSW50ZWdlciYgYSwgY29uc3QgSW50ZWdlciYgYil7CisgICAgLy9zZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yOgorICAgIC8vbXB6X2djZGV4dCAobXB6X3QgZywgbXB6X3QgcywgbXB6X3QgdCwgbXB6X3QgYSwgbXB6X3QgYik7CisgICAgbXB6X2djZGV4dCAoZy5kX3ZhbHVlLmdldF9tcHpfdCgpLCBzLmRfdmFsdWUuZ2V0X21wel90KCksIHQuZF92YWx1ZS5nZXRfbXB6X3QoKSwgYS5kX3ZhbHVlLmdldF9tcHpfdCgpLCBiLmRfdmFsdWUuZ2V0X21wel90KCkpOworICB9CisKKyAgLyoqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIG1pbmltdW0gb2YgdHdvIGludGVnZXJzLiAqLworICBzdGF0aWMgY29uc3QgSW50ZWdlciYgbWluKGNvbnN0IEludGVnZXImIGEsIGNvbnN0IEludGVnZXImIGIpeworICAgIHJldHVybiAoYSA8PWIgKSA/IGEgOiBiOworICB9CisKKyAgLyoqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIG1heGltdW0gb2YgdHdvIGludGVnZXJzLiAqLworICBzdGF0aWMgY29uc3QgSW50ZWdlciYgbWF4KGNvbnN0IEludGVnZXImIGEsIGNvbnN0IEludGVnZXImIGIpeworICAgIHJldHVybiAoYSA+PSBiICkgPyBhIDogYjsKKyAgfQorCisgIGZyaWVuZCBjbGFzcyBDVkM0OjpSYXRpb25hbDsKK307LyogY2xhc3MgSW50ZWdlciAqLworCitzdHJ1Y3QgSW50ZWdlckhhc2hGdW5jdGlvbiB7CisgIGlubGluZSBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBDVkM0OjpJbnRlZ2VyJiBpKSBjb25zdCB7CisgICAgcmV0dXJuIGkuaGFzaCgpOworICB9Cit9Oy8qIHN0cnVjdCBJbnRlZ2VySGFzaEZ1bmN0aW9uICovCisKK2lubGluZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgSW50ZWdlciYgbikgeworICByZXR1cm4gb3MgPDwgbi50b1N0cmluZygpOworfQorCit9LyogQ1ZDNCBuYW1lc3BhY2UgKi8KKworI2VuZGlmIC8qIF9fQ1ZDNF9fSU5URUdFUl9IICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL2N2YzQtbWFzdGVyLXBhdGNoL3V0aWwvcmF0aW9uYWxfZ21wX2ltcC5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9jdmM0LW1hc3Rlci1wYXRjaC91dGlsL3JhdGlvbmFsX2dtcF9pbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDczYzkyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9jdmM0LW1hc3Rlci1wYXRjaC91dGlsL3JhdGlvbmFsX2dtcF9pbXAuaApAQCAtMCwwICsxLDM1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qISBcZmlsZSByYXRpb25hbF9nbXBfaW1wLmgKKyAqKiBcdmVyYmF0aW0KKyAqKiBUb3AgY29udHJpYnV0b3JzICh0byBjdXJyZW50IHZlcnNpb24pOgorICoqICAgVGltIEtpbmcsIE1vcmdhbiBEZXRlcnMsIERlamFuIEpvdmFub3ZpYworICoqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDVkM0IHByb2plY3QuCisgKiogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTYgYnkgdGhlIGF1dGhvcnMgbGlzdGVkIGluIHRoZSBmaWxlIEFVVEhPUlMKKyAqKiBpbiB0aGUgdG9wLWxldmVsIHNvdXJjZSBkaXJlY3RvcnkpIGFuZCB0aGVpciBpbnN0aXR1dGlvbmFsIGFmZmlsaWF0aW9ucy4KKyAqKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIHRvcC1sZXZlbCBzb3VyY2UKKyAqKiBkaXJlY3RvcnkgZm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbi5cZW5kdmVyYmF0aW0KKyAqKgorICoqIFxicmllZiBNdWx0aXByZWNpc2lvbiByYXRpb25hbCBjb25zdGFudHM7IHdyYXBzIGEgR01QIG11bHRpcHJlY2lzaW9uCisgKiogcmF0aW9uYWwuCisgKioKKyAqKiBNdWx0aXByZWNpc2lvbiByYXRpb25hbCBjb25zdGFudHM7IHdyYXBzIGEgR01QIG11bHRpcHJlY2lzaW9uIHJhdGlvbmFsLgorICoqLworCisjaW5jbHVkZSAiY3ZjNF9wdWJsaWMuaCIKKworI2lmbmRlZiBfX0NWQzRfX1JBVElPTkFMX0gKKyNkZWZpbmUgX19DVkM0X19SQVRJT05BTF9ICisKKyNpbmNsdWRlIDxnbXAuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJiYXNlL2V4Y2VwdGlvbi5oIgorI2luY2x1ZGUgInV0aWwvaW50ZWdlci5oIgorCituYW1lc3BhY2UgQ1ZDNCB7CisKK2NsYXNzIENWQzRfUFVCTElDIFJhdGlvbmFsRnJvbURvdWJsZUV4Y2VwdGlvbiA6IHB1YmxpYyBFeGNlcHRpb24geworcHVibGljOgorICBSYXRpb25hbEZyb21Eb3VibGVFeGNlcHRpb24oZG91YmxlIGQpIHRocm93KCk7Cit9OworCisvKioKKyAqKiBBIG11bHRpLXByZWNpc2lvbiByYXRpb25hbCBjb25zdGFudC4KKyAqKiBUaGlzIHN0b3JlcyB0aGUgcmF0aW9uYWwgYXMgYSBwYWlyIG9mIG11bHRpLXByZWNpc2lvbiBpbnRlZ2VycywKKyAqKiBvbmUgZm9yIHRoZSBudW1lcmF0b3IgYW5kIG9uZSBmb3IgdGhlIGRlbm9taW5hdG9yLgorICoqIFRoZSBudW1iZXIgaXMgYWx3YXlzIHN0b3JlZCBzbyB0aGF0IHRoZSBnY2Qgb2YgdGhlIG51bWVyYXRvciBhbmQgZGVub21pbmF0b3IKKyAqKiBpcyAxLiAgKFRoaXMgaXMgcmVmZXJyZWQgdG8gYXMgcmVmZXJyZWQgdG8gYXMgY2Fub25pY2FsIGZvcm0gaW4gR01QJ3MKKyAqKiBsaXRlcmF0dXJlLikgQSBjb25zZXF1ZW5jZSBpcyB0aGF0IHRoYXQgdGhlIG51bWVyYXRvciBhbmQgZGVub21pbmF0b3IgbWF5IGJlCisgKiogZGlmZmVyZW50IHRoYW4gdGhlIHZhbHVlcyB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgUmF0aW9uYWwuCisgKioKKyAqKiBOT1RFOiBUaGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIGEgUmF0aW9uYWwgZnJvbSBhbiBpbnQgaXMgdG8gdXNlIG9uZSBvZiB0aGUKKyAqKiBpbnQgbnVtZXJhdG9yL2ludCBkZW5vbWluYXRvciBjb25zdHJ1Y3RvcnMgd2l0aCB0aGUgZGVub21pbmF0b3IgMS4gIFRyeWluZworICoqIHRvIGNvbnN0cnVjdCBhIFJhdGlvbmFsIHdpdGggYSBzaW5nbGUgaW50LCBlLmcuLCBSYXRpb25hbCgwKSwgd2lsbCBwdXQgeW91CisgKiogaW4gZGFuZ2VyIG9mIGludm9raW5nIHRoZSBjaGFyKiBjb25zdHJ1Y3RvciwgZnJvbSB3aGVuY2UgeW91IHdpbGwgc2VnZmF1bHQuCisgKiovCisKK2NsYXNzIENWQzRfUFVCTElDIFJhdGlvbmFsIHsKK3ByaXZhdGU6CisgIC8qKgorICAgKiBTdG9yZXMgdGhlIHZhbHVlIG9mIHRoZSByYXRpb25hbCBpcyBzdG9yZWQgaW4gYSBDKysgR01QIHJhdGlvbmFsIGNsYXNzLgorICAgKiBVc2luZyB0aGlzIGluc3RlYWQgb2YgbXBxX3QgYWxsb3dzIGZvciBlYXNpZXIgZGVzdHJ1Y3Rpb24uCisgICAqLworICBtcHFfY2xhc3MgZF92YWx1ZTsKKworcHVibGljOgorCisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgUmF0aW9uYWwgZnJvbSBhIG1wcV9jbGFzcyBvYmplY3QuCisgICAqIERvZXMgYSBkZWVwIGNvcHkuCisgICAqIEFzc3VtZXMgdGhhdCB0aGUgdmFsdWUgaXMgaW4gY2Fub25pY2FsIGZvcm0sIGFuZCB0aHVzIGRvZXMgbm90CisgICAqIGhhdmUgdG8gY2FsbCBjYW5vbmljYWxpemUoKSBvbiB0aGUgdmFsdWUuCisgICAqLworICBSYXRpb25hbChjb25zdCBtcHFfY2xhc3MmIHZhbCkgOiBkX3ZhbHVlKHZhbCkgeyAgfQorCisgIC8qKgorICAgKiBDcmVhdGVzIGEgcmF0aW9uYWwgZnJvbSBhIGRlY2ltYWwgc3RyaW5nIChlLmcuLCA8Y29kZT4iMS41IjwvY29kZT4pLgorICAgKgorICAgKiBAcGFyYW0gZGVjIGEgc3RyaW5nIGVuY29kaW5nIGEgZGVjaW1hbCBudW1iZXIgaW4gdGhlIGZvcm1hdAorICAgKiA8Y29kZT5bMC05XSpcLlswLTldKjwvY29kZT4KKyAgICovCisgIHN0YXRpYyBSYXRpb25hbCBmcm9tRGVjaW1hbChjb25zdCBzdGQ6OnN0cmluZyYgZGVjKTsKKworICAvKiogQ29uc3RydWN0cyBhIHJhdGlvbmFsIHdpdGggdGhlIHZhbHVlIDAvMS4gKi8KKyAgUmF0aW9uYWwoKSA6IGRfdmFsdWUoMCl7CisgICAgZF92YWx1ZS5jYW5vbmljYWxpemUoKTsKKyAgfQorCisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgUmF0aW9uYWwgZnJvbSBhIEMgc3RyaW5nIGluIGEgZ2l2ZW4gYmFzZSAoZGVmYXVsdHMgdG8gMTApLgorICAgKiBUaHJvd3Mgc3RkOjppbnZhbGlkX2FyZ3VtZW50IGlmIHRoZSBzdHJpbmcgaXMgbm90IGEgdmFsaWQgcmF0aW9uYWwuCisgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgaXMgYSB2YWxpZCByYXRpb25hbCBzdHJpbmcsCisgICAqIHNlZSBHTVAncyBkb2N1bWVudGF0aW9uIGZvciBtcHFfc2V0X3N0cigpLgorICAgKi8KKyAgZXhwbGljaXQgUmF0aW9uYWwoY29uc3QgY2hhciogcywgdW5zaWduZWQgYmFzZSA9IDEwKTogZF92YWx1ZShzLCBiYXNlKSB7CisgICAgZF92YWx1ZS5jYW5vbmljYWxpemUoKTsKKyAgfQorICBSYXRpb25hbChjb25zdCBzdGQ6OnN0cmluZyYgcywgdW5zaWduZWQgYmFzZSA9IDEwKSA6IGRfdmFsdWUocywgYmFzZSkgeworICAgIGRfdmFsdWUuY2Fub25pY2FsaXplKCk7CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlcyBhIFJhdGlvbmFsIGZyb20gYW5vdGhlciBSYXRpb25hbCwgcSwgYnkgcGVyZm9ybWluZyBhIGRlZXAgY29weS4KKyAgICovCisgIFJhdGlvbmFsKGNvbnN0IFJhdGlvbmFsJiBxKSA6IGRfdmFsdWUocS5kX3ZhbHVlKSB7CisgICAgZF92YWx1ZS5jYW5vbmljYWxpemUoKTsKKyAgfQorCisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgY2Fub25pY2FsIFJhdGlvbmFsIGZyb20gYSBudW1lcmF0b3IuCisgICAqLworICBSYXRpb25hbChzaWduZWQgaW50IG4pIDogZF92YWx1ZShuLDEpIHsKKyAgICBkX3ZhbHVlLmNhbm9uaWNhbGl6ZSgpOworICB9CisgIFJhdGlvbmFsKHVuc2lnbmVkIGludCBuKSA6IGRfdmFsdWUobiwxKSB7CisgICAgZF92YWx1ZS5jYW5vbmljYWxpemUoKTsKKyAgfQorICBSYXRpb25hbChzaWduZWQgbG9uZyBpbnQgbikgOiBkX3ZhbHVlKG4sMSkgeworICAgIGRfdmFsdWUuY2Fub25pY2FsaXplKCk7CisgIH0KKyAgUmF0aW9uYWwodW5zaWduZWQgbG9uZyBpbnQgbikgOiBkX3ZhbHVlKG4sMSkgeworICAgIGRfdmFsdWUuY2Fub25pY2FsaXplKCk7CisgIH0KKworI2lmZGVmIENWQzRfTkVFRF9JTlQ2NF9UX09WRVJMT0FEUworICBSYXRpb25hbChpbnQ2NF90IG4pIDogZF92YWx1ZShzdGF0aWNfY2FzdDxsb25nPihuKSwgMSkgeworICAgIGRfdmFsdWUuY2Fub25pY2FsaXplKCk7CisgIH0KKyAgUmF0aW9uYWwodWludDY0X3QgbikgOiBkX3ZhbHVlKHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KG4pLCAxKSB7CisgICAgZF92YWx1ZS5jYW5vbmljYWxpemUoKTsKKyAgfQorI2VuZGlmIC8qIENWQzRfTkVFRF9JTlQ2NF9UX09WRVJMT0FEUyAqLworCisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgY2Fub25pY2FsIFJhdGlvbmFsIGZyb20gYSBudW1lcmF0b3IgYW5kIGRlbm9taW5hdG9yLgorICAgKi8KKyAgUmF0aW9uYWwoc2lnbmVkIGludCBuLCBzaWduZWQgaW50IGQpIDogZF92YWx1ZShuLGQpIHsKKyAgICBkX3ZhbHVlLmNhbm9uaWNhbGl6ZSgpOworICB9CisgIFJhdGlvbmFsKHVuc2lnbmVkIGludCBuLCB1bnNpZ25lZCBpbnQgZCkgOiBkX3ZhbHVlKG4sZCkgeworICAgIGRfdmFsdWUuY2Fub25pY2FsaXplKCk7CisgIH0KKyAgUmF0aW9uYWwoc2lnbmVkIGxvbmcgaW50IG4sIHNpZ25lZCBsb25nIGludCBkKSA6IGRfdmFsdWUobixkKSB7CisgICAgZF92YWx1ZS5jYW5vbmljYWxpemUoKTsKKyAgfQorICBSYXRpb25hbCh1bnNpZ25lZCBsb25nIGludCBuLCB1bnNpZ25lZCBsb25nIGludCBkKSA6IGRfdmFsdWUobixkKSB7CisgICAgZF92YWx1ZS5jYW5vbmljYWxpemUoKTsKKyAgfQorCisjaWZkZWYgQ1ZDNF9ORUVEX0lOVDY0X1RfT1ZFUkxPQURTCisgIFJhdGlvbmFsKGludDY0X3QgbiwgaW50NjRfdCBkKSA6IGRfdmFsdWUoc3RhdGljX2Nhc3Q8bG9uZz4obiksIHN0YXRpY19jYXN0PGxvbmc+KGQpKSB7CisgICAgZF92YWx1ZS5jYW5vbmljYWxpemUoKTsKKyAgfQorICBSYXRpb25hbCh1aW50NjRfdCBuLCB1aW50NjRfdCBkKSA6IGRfdmFsdWUoc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4obiksIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KGQpKSB7CisgICAgZF92YWx1ZS5jYW5vbmljYWxpemUoKTsKKyAgfQorI2VuZGlmIC8qIENWQzRfTkVFRF9JTlQ2NF9UX09WRVJMT0FEUyAqLworCisgIFJhdGlvbmFsKGNvbnN0IEludGVnZXImIG4sIGNvbnN0IEludGVnZXImIGQpIDoKKyAgICBkX3ZhbHVlKG4uZ2V0X21weigpLCBkLmdldF9tcHooKSkKKyAgeworICAgIGRfdmFsdWUuY2Fub25pY2FsaXplKCk7CisgIH0KKyAgUmF0aW9uYWwoY29uc3QgSW50ZWdlciYgbikgOgorICAgIGRfdmFsdWUobi5nZXRfbXB6KCkpCisgIHsKKyAgICBkX3ZhbHVlLmNhbm9uaWNhbGl6ZSgpOworICB9CisgIH5SYXRpb25hbCgpIHt9CisKKyAgLyoqCisgICAqIEdldHMgYSByZWZlcmVuY2UgdG8gdGhlIGdtcCBkYXRhIHRoYXQgYmFja3MgdXAgdGhlIHJhdGlvbmFsLgorICAgKiBPbmx5IGFjY2Vzc2libGUgdG8gZnJpZW5kIGNsYXNzZXMuCisgICAqLworICBjb25zdCBtcHFfY2xhc3MmIGdldF9tcHEoKSBjb25zdCB7IHJldHVybiBkX3ZhbHVlOyB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIG51bWVyYXRvciBvZiB0aGUgUmF0aW9uYWwuCisgICAqIE5vdGUgdGhhdCB0aGlzIG1ha2VzIGEgZGVlcCBjb3B5IG9mIHRoZSBudW1lcmF0b3IuCisgICAqLworICBJbnRlZ2VyIGdldE51bWVyYXRvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gSW50ZWdlcihkX3ZhbHVlLmdldF9udW0oKSk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgZGVub21pbmF0b3Igb2YgdGhlIFJhdGlvbmFsLgorICAgKiBOb3RlIHRoYXQgdGhpcyBtYWtlcyBhIGRlZXAgY29weSBvZiB0aGUgZGVub21pbmF0b3IuCisgICAqLworICBJbnRlZ2VyIGdldERlbm9taW5hdG9yKCkgY29uc3QgeworICAgIHJldHVybiBJbnRlZ2VyKGRfdmFsdWUuZ2V0X2RlbigpKTsKKyAgfQorCisgIHN0YXRpYyBSYXRpb25hbCBmcm9tRG91YmxlKGRvdWJsZSBkKSB0aHJvdyhSYXRpb25hbEZyb21Eb3VibGVFeGNlcHRpb24pOworCisgIC8qKgorICAgKiBHZXQgYSBkb3VibGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBSYXRpb25hbCwgd2hpY2ggaXMKKyAgICogYXBwcm94aW1hdGU6IHRydW5jYXRpb24gbWF5IG9jY3VyLCBvdmVyZmxvdyBtYXkgcmVzdWx0IGluCisgICAqIGluZmluaXR5LCBhbmQgdW5kZXJmbG93IG1heSByZXN1bHQgaW4gemVyby4KKyAgICovCisgIGRvdWJsZSBnZXREb3VibGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGRfdmFsdWUuZ2V0X2QoKTsKKyAgfQorCisgIFJhdGlvbmFsIGludmVyc2UoKSBjb25zdCB7CisgICAgcmV0dXJuIFJhdGlvbmFsKGdldERlbm9taW5hdG9yKCksIGdldE51bWVyYXRvcigpKTsKKyAgfQorCisgIGludCBjbXAoY29uc3QgUmF0aW9uYWwmIHgpIGNvbnN0IHsKKyAgICAvL0Rvbid0IHVzZSBtcHFfY2xhc3MncyBjbXAoKSBmdW5jdGlvbi4KKyAgICAvL1RoZSBuYW1lIGVuZHMgdXAgY29uZmxpY3Rpbmcgd2l0aCB0aGlzIGZ1bmN0aW9uLgorICAgIHJldHVybiBtcHFfY21wKGRfdmFsdWUuZ2V0X21wcV90KCksIHguZF92YWx1ZS5nZXRfbXBxX3QoKSk7CisgIH0KKworICBpbnQgc2duKCkgY29uc3QgeworICAgIHJldHVybiBtcHFfc2duKGRfdmFsdWUuZ2V0X21wcV90KCkpOworICB9CisKKyAgYm9vbCBpc1plcm8oKSBjb25zdCB7CisgICAgcmV0dXJuIHNnbigpID09IDA7CisgIH0KKworICBib29sIGlzT25lKCkgY29uc3QgeworICAgIHJldHVybiBtcHFfY21wX3NpKGRfdmFsdWUuZ2V0X21wcV90KCksIDEsIDEpID09IDA7CisgIH0KKworICBib29sIGlzTmVnYXRpdmVPbmUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1wcV9jbXBfc2koZF92YWx1ZS5nZXRfbXBxX3QoKSwgLTEsIDEpID09IDA7CisgIH0KKworICBSYXRpb25hbCBhYnMoKSBjb25zdCB7CisgICAgaWYoc2duKCkgPCAwKXsKKyAgICAgIHJldHVybiAtKCp0aGlzKTsKKyAgICB9ZWxzZXsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgIH0KKworICBJbnRlZ2VyIGZsb29yKCkgY29uc3QgeworICAgIG1wel9jbGFzcyBxOworICAgIG1wel9mZGl2X3EocS5nZXRfbXB6X3QoKSwgZF92YWx1ZS5nZXRfbnVtX21wel90KCksIGRfdmFsdWUuZ2V0X2Rlbl9tcHpfdCgpKTsKKyAgICByZXR1cm4gSW50ZWdlcihxKTsKKyAgfQorCisgIEludGVnZXIgY2VpbGluZygpIGNvbnN0IHsKKyAgICBtcHpfY2xhc3MgcTsKKyAgICBtcHpfY2Rpdl9xKHEuZ2V0X21wel90KCksIGRfdmFsdWUuZ2V0X251bV9tcHpfdCgpLCBkX3ZhbHVlLmdldF9kZW5fbXB6X3QoKSk7CisgICAgcmV0dXJuIEludGVnZXIocSk7CisgIH0KKworICBSYXRpb25hbCBmbG9vcl9mcmFjKCkgY29uc3QgeworICAgIHJldHVybiAoKnRoaXMpIC0gUmF0aW9uYWwoZmxvb3IoKSk7CisgIH0KKworICBSYXRpb25hbCYgb3BlcmF0b3I9KGNvbnN0IFJhdGlvbmFsJiB4KXsKKyAgICBpZih0aGlzID09ICZ4KSByZXR1cm4gKnRoaXM7CisgICAgZF92YWx1ZSA9IHguZF92YWx1ZTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBSYXRpb25hbCBvcGVyYXRvci0oKSBjb25zdHsKKyAgICByZXR1cm4gUmF0aW9uYWwoLShkX3ZhbHVlKSk7CisgIH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgUmF0aW9uYWwmIHkpIGNvbnN0IHsKKyAgICByZXR1cm4gZF92YWx1ZSA9PSB5LmRfdmFsdWU7CisgIH0KKworICBib29sIG9wZXJhdG9yIT0oY29uc3QgUmF0aW9uYWwmIHkpIGNvbnN0IHsKKyAgICByZXR1cm4gZF92YWx1ZSAhPSB5LmRfdmFsdWU7CisgIH0KKworICBib29sIG9wZXJhdG9yPCAoY29uc3QgUmF0aW9uYWwmIHkpIGNvbnN0IHsKKyAgICByZXR1cm4gZF92YWx1ZSA8IHkuZF92YWx1ZTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I8PShjb25zdCBSYXRpb25hbCYgeSkgY29uc3QgeworICAgIHJldHVybiBkX3ZhbHVlIDw9IHkuZF92YWx1ZTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I+IChjb25zdCBSYXRpb25hbCYgeSkgY29uc3QgeworICAgIHJldHVybiBkX3ZhbHVlID4geS5kX3ZhbHVlOworICB9CisKKyAgYm9vbCBvcGVyYXRvcj49KGNvbnN0IFJhdGlvbmFsJiB5KSBjb25zdCB7CisgICAgcmV0dXJuIGRfdmFsdWUgPj0geS5kX3ZhbHVlOworICB9CisKKyAgUmF0aW9uYWwgb3BlcmF0b3IrKGNvbnN0IFJhdGlvbmFsJiB5KSBjb25zdHsKKyAgICByZXR1cm4gUmF0aW9uYWwoIGRfdmFsdWUgKyB5LmRfdmFsdWUgKTsKKyAgfQorICBSYXRpb25hbCBvcGVyYXRvci0oY29uc3QgUmF0aW9uYWwmIHkpIGNvbnN0IHsKKyAgICByZXR1cm4gUmF0aW9uYWwoIGRfdmFsdWUgLSB5LmRfdmFsdWUgKTsKKyAgfQorCisgIFJhdGlvbmFsIG9wZXJhdG9yKihjb25zdCBSYXRpb25hbCYgeSkgY29uc3QgeworICAgIHJldHVybiBSYXRpb25hbCggZF92YWx1ZSAqIHkuZF92YWx1ZSApOworICB9CisgIFJhdGlvbmFsIG9wZXJhdG9yLyhjb25zdCBSYXRpb25hbCYgeSkgY29uc3QgeworICAgIHJldHVybiBSYXRpb25hbCggZF92YWx1ZSAvIHkuZF92YWx1ZSApOworICB9CisKKyAgUmF0aW9uYWwmIG9wZXJhdG9yKz0oY29uc3QgUmF0aW9uYWwmIHkpeworICAgIGRfdmFsdWUgKz0geS5kX3ZhbHVlOworICAgIHJldHVybiAoKnRoaXMpOworICB9CisgIFJhdGlvbmFsJiBvcGVyYXRvci09KGNvbnN0IFJhdGlvbmFsJiB5KXsKKyAgICBkX3ZhbHVlIC09IHkuZF92YWx1ZTsKKyAgICByZXR1cm4gKCp0aGlzKTsKKyAgfQorCisgIFJhdGlvbmFsJiBvcGVyYXRvcio9KGNvbnN0IFJhdGlvbmFsJiB5KXsKKyAgICBkX3ZhbHVlICo9IHkuZF92YWx1ZTsKKyAgICByZXR1cm4gKCp0aGlzKTsKKyAgfQorCisgIFJhdGlvbmFsJiBvcGVyYXRvci89KGNvbnN0IFJhdGlvbmFsJiB5KXsKKyAgICBkX3ZhbHVlIC89IHkuZF92YWx1ZTsKKyAgICByZXR1cm4gKCp0aGlzKTsKKyAgfQorCisgIGJvb2wgaXNJbnRlZ3JhbCgpIGNvbnN0eworICAgIHJldHVybiBnZXREZW5vbWluYXRvcigpID09IDE7CisgIH0KKworICAvKiogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHJhdGlvbmFsIGluIHRoZSBnaXZlbiBiYXNlLiAqLworICBzdGQ6OnN0cmluZyB0b1N0cmluZyhpbnQgYmFzZSA9IDEwKSBjb25zdCB7CisgICAgcmV0dXJuIGRfdmFsdWUuZ2V0X3N0cihiYXNlKTsKKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlcyB0aGUgaGFzaCBvZiB0aGUgcmF0aW9uYWwgZnJvbSBoYXNoZXMgb2YgdGhlIG51bWVyYXRvciBhbmQgdGhlCisgICAqIGRlbm9taW5hdG9yLgorICAgKi8KKyAgc2l6ZV90IGhhc2goKSBjb25zdCB7CisgICAgc2l6ZV90IG51bWVyYXRvckhhc2ggPSBnbXB6X2hhc2goZF92YWx1ZS5nZXRfbnVtX21wel90KCkpOworICAgIHNpemVfdCBkZW5vbWluYXRvckhhc2ggPSBnbXB6X2hhc2goZF92YWx1ZS5nZXRfZGVuX21wel90KCkpOworCisgICAgcmV0dXJuIG51bWVyYXRvckhhc2ggeG9yIGRlbm9taW5hdG9ySGFzaDsKKyAgfQorCisgIHVpbnQzMl90IGNvbXBsZXhpdHkoKSBjb25zdCB7CisgICAgdWludDMyX3QgbnVtTGVuID0gZ2V0TnVtZXJhdG9yKCkubGVuZ3RoKCk7CisgICAgdWludDMyX3QgZGVuTGVuID0gZ2V0RGVub21pbmF0b3IoKS5sZW5ndGgoKTsKKyAgICByZXR1cm4gIG51bUxlbiArIGRlbkxlbjsKKyAgfQorCisgIC8qKiBFcXVpdmFsZW50IHRvIGNhbGxpbmcgKHRoaXMtPmFicygpKS5jbXAoYi5hYnMoKSkgKi8KKyAgaW50IGFic0NtcChjb25zdCBSYXRpb25hbCYgcSkgY29uc3Q7CisKK307LyogY2xhc3MgUmF0aW9uYWwgKi8KKworc3RydWN0IFJhdGlvbmFsSGFzaEZ1bmN0aW9uIHsKKyAgaW5saW5lIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IENWQzQ6OlJhdGlvbmFsJiByKSBjb25zdCB7CisgICAgcmV0dXJuIHIuaGFzaCgpOworICB9Cit9Oy8qIHN0cnVjdCBSYXRpb25hbEhhc2hGdW5jdGlvbiAqLworCitDVkM0X1BVQkxJQyBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgUmF0aW9uYWwmIG4pOworCit9LyogQ1ZDNCBuYW1lc3BhY2UgKi8KKworI2VuZGlmIC8qIF9fQ1ZDNF9fUkFUSU9OQUxfSCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9jdmM0LXBhdGNoL2NvbmZpZy9ib29zdC12Mi5tNCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvY3ZjNC1wYXRjaC9jb25maWcvYm9vc3QtdjIubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdkMDYzZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvY3ZjNC1wYXRjaC9jb25maWcvYm9vc3QtdjIubTQKQEAgLTAsMCArMSwxNTYwIEBACisjIGJvb3N0Lm00OiBMb2NhdGUgQm9vc3QgaGVhZGVycyBhbmQgbGlicmFyaWVzIGZvciBhdXRvY29uZi1iYXNlZCBwcm9qZWN0cy4KKyMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMTEsIDIwMTQgIEJlbm9pdCBTaWdvdXJlIDx0c3VuYUBscmRlLmVwaXRhLmZyPgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBBZGRpdGlvbmFsIHBlcm1pc3Npb24gdW5kZXIgc2VjdGlvbiA3IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZSwgdmVyc2lvbiAzICgiR1BMdjMiKToKKyMKKyMgSWYgeW91IGNvbnZleSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHdvcmsgdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBkbyBzbyB1bmRlcgorIyB0ZXJtcyBvZiB5b3VyIGNob2ljZS4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKK200X2RlZmluZShbX0JPT1NUX1NFUklBTF0sIFttNF90cmFuc2xpdChbCisjIHNlcmlhbCAyNQorXSwgWyMKK10sIFtdKV0pCisKKyMgT3JpZ2luYWwgc291cmNlcyBjYW4gYmUgZm91bmQgYXQgaHR0cDovL2dpdGh1Yi5jb20vdHN1bmEvYm9vc3QubTQKKyMgWW91IGNhbiBmZXRjaCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIHNjcmlwdCBieSBkb2luZzoKKyMgICB3Z2V0IGh0dHA6Ly9naXRodWIuY29tL3RzdW5hL2Jvb3N0Lm00L3Jhdy9tYXN0ZXIvYnVpbGQtYXV4L2Jvb3N0Lm00CisKKyMgLS0tLS0tICMKKyMgUkVBRE1FICMKKyMgLS0tLS0tICMKKworIyBUaGlzIGZpbGUgcHJvdmlkZXMgc2V2ZXJhbCBtYWNyb3MgdG8gdXNlIHRoZSB2YXJpb3VzIEJvb3N0IGxpYnJhcmllcy4KKyMgVGhlIGZpcnN0IG1hY3JvIGlzIEJPT1NUX1JFUVVJUkUuICBJdCB3aWxsIHNpbXBseSBjaGVjayBpZiBpdCdzIHBvc3NpYmxlIHRvCisjIGZpbmQgdGhlIEJvb3N0IGhlYWRlcnMgb2YgYSBnaXZlbiAob3B0aW9uYWwpIG1pbmltdW0gdmVyc2lvbiBhbmQgaXQgd2lsbAorIyBkZWZpbmUgQk9PU1RfQ1BQRkxBR1MgYWNjb3JkaW5nbHkuICBJdCB3aWxsIGFkZCBhbiBvcHRpb24gLS13aXRoLWJvb3N0IHRvCisjIHlvdXIgY29uZmlndXJlIHNvIHRoYXQgdXNlcnMgY2FuIHNwZWNpZnkgbm9uIHN0YW5kYXJkIGxvY2F0aW9ucy4KKyMgSWYgdGhlIHVzZXIncyBlbnZpcm9ubWVudCBjb250YWlucyBCT09TVF9ST09UIGFuZCAtLXdpdGgtYm9vc3Qgd2FzIG5vdAorIyBzcGVjaWZpZWQsIC0td2l0aC1ib29zdD0kQk9PU1RfUk9PVCBpcyBpbXBsaWNpdGx5IHVzZWQuCisjIEZvciBtb3JlIFJFQURNRSBhbmQgZG9jdW1lbnRhdGlvbiwgZ28gdG8gaHR0cDovL2dpdGh1Yi5jb20vdHN1bmEvYm9vc3QubTQKKyMgTm90ZTogVEhFU0UgTUFDUk9TIEFTU1VNRSBUSEFUIFlPVSBVU0UgTElCVE9PTC4gIElmIHlvdSBkb24ndCwgZG9uJ3Qgd29ycnksCisjIHNpbXBseSByZWFkIHRoZSBSRUFETUUsIGl0IHdpbGwgc2hvdyB5b3Ugd2hhdCB0byBkbyBzdGVwIGJ5IHN0ZXAuCisKK200X3BhdHRlcm5fZm9yYmlkKFteXz8oQk9PU1R8Qm9vc3QpX10pCisKKworIyBfQk9PU1RfU0VEX0NQUChTRUQtUFJPR1JBTSwgUFJPR1JBTSwKKyMgICAgICAgICAgICAgICAgW0FDVElPTi1JRi1GT1VORF0sIFtBQ1RJT04tSUYtTk9ULUZPVU5EXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2FtZSBhcyBBQ19FR1JFUF9DUFAsIGJ1dCBsZWF2ZSB0aGUgcmVzdWx0IGluIGNvbmZ0ZXN0LmkuCisjCisjIFNFRC1QUk9HUkFNIGlzICpub3QqIG92ZXJxdW90ZWQsIGFzIGluIEFDX0VHUkVQX0NQUC4gIEl0IGlzIGV4cGFuZGVkCisjIGluIGRvdWJsZS1xdW90ZXMsIHNvIGVzY2FwZSB5b3VyIGRvdWJsZSBxdW90ZXMuCisjCisjIEl0IGNvdWxkIGJlIHVzZWZ1bCB0byB0dXJuIHRoaXMgaW50byBhIG1hY3JvIHdoaWNoIGV4dHJhY3RzIHRoZQorIyB2YWx1ZSBvZiBhbnkgbWFjcm8uCittNF9kZWZpbmUoW19CT09TVF9TRURfQ1BQXSwKK1tBQ19MQU5HX1BVU0goW0MrK10pZG5sCitBQ19MQU5HX1BSRVBST0NfUkVRVUlSRSgpZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX1NFRF0pZG5sCitBQ19MQU5HX0NPTkZURVNUKFtBQ19MQU5HX1NPVVJDRShbWyQyXV0pXSkKK0FTX0lGKFtkbmwgZXZhbCBpcyBuZWNlc3NhcnkgdG8gZXhwYW5kIGFjX2NwcC4KK2RubCBVbHRyaXggYW5kIFB5cmFtaWQgc2ggcmVmdXNlIHRvIHJlZGlyZWN0IG91dHB1dCBvZiBldmFsLCBzbyB1c2Ugc3Vic2hlbGwuCitkbmwgQmV3YXJlIG9mIFdpbmRvd3MgZW5kLW9mLWxpbmVzLCBmb3IgaW5zdGFuY2UgaWYgd2UgYXJlIHJ1bm5pbmcKK2RubCBzb21lIFdpbmRvd3MgcHJvZ3JhbXMgdW5kZXIgV2luZS4gIEluIHRoYXQgY2FzZSwgYm9vc3QvdmVyc2lvbi5ocHAKK2RubCBpcyBjZXJ0YWlubHkgdXNpbmcgIlxyXG4iLCBidXQgdGhlIHJlZ3VsYXIgVW5peCBzaGVsbCB3aWxsIG9ubHkKK2RubCBzdHJpcCBgXG4nIHdpdGggYmFja3F1b3Rlcywgbm90IHRoZSBgXHInLiAgVGhpcyByZXN1bHRzIGluCitkbmwgYm9vc3RfY3ZfbGliX3ZlcnNpb249JzFfMzdccicgZm9yIGluc3RhbmNlLCB3aGljaCBicmVha3MKK2RubCBldmVyeXRoaW5nIGVsc2UuCitkbmwgQ2Fubm90IHVzZSAnZG5sJyBhZnRlciBbJDRdIGJlY2F1c2UgYSB0cmFpbGluZyBkbmwgbWF5IGJyZWFrIEFDX0NBQ0hFX0NIRUNLCitkbmwKK2RubCBCZXdhcmUgdGhhdCBHQ0MgNSwgd2hlbiBleHBhbmRpbmcgbWFjcm9zLCBtYXkgZW1iZWQgIyBsaW5lIGRpcmVjdGl2ZXMKK2RubCBhIHdpdGhpbiBzaW5nbGUgbGluZToKK2RubAorZG5sICMgMSAiY29uZnRlc3QuY2MiCitkbmwgIyAxICI8YnVpbHQtaW4+IgorZG5sICMgMSAiPGNvbW1hbmQtbGluZT4iCitkbmwgIyAxICJjb25mdGVzdC5jYyIKK2RubCAjIDEgIi9vcHQvbG9jYWwvaW5jbHVkZS9ib29zdC92ZXJzaW9uLmhwcCIgMSAzCitkbmwgIyAyICJjb25mdGVzdC5jYyIgMgorZG5sIGJvb3N0LWxpYi12ZXJzaW9uID0KK2RubCAjIDIgImNvbmZ0ZXN0LmNjIiAzCitkbmwgICAgICAgICAgICAgICAgICAgICIxXzU2IgorZG5sCitkbmwgU28gZ2V0IHJpZCBvZiB0aGUgIyBsaW5lcywgYW5kIGdsdWUgdGhlIHJlbWFpbmluZyBvbmVzIHRvZ2V0aGVyLgorKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JkFTX01FU1NBR0VfTE9HX0ZEIHwKKyAgZ3JlcCAtdiAnIycgfAorICB0ciAtZCAnXHInIHwKKyAgdHIgLXMgJ1xuJyAnICcgfAorICAkU0VEIC1uIC1lICIkMSIgPmNvbmZ0ZXN0LmkgMj4mMV0sCisgIFskM10sCisgIFskNF0pCitybSAtcmYgY29uZnRlc3QqCitBQ19MQU5HX1BPUChbQysrXSlkbmwKK10pIyBfQk9PU1RfU0VEX0NQUAorCisKKworIyBCT09TVF9SRVFVSVJFKFtWRVJTSU9OXSwgW0FDVElPTi1JRi1OT1QtRk9VTkRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC4gIElmIHZlcnNpb24gaXMgZ2l2ZW4sIGl0IG11c3QgZWl0aGVyIGJlIGEgbGl0ZXJhbCBvZiB0aGUgZm9ybQorIyAiWC5ZLloiIHdoZXJlIFgsIFkgYW5kIFogYXJlIGludGVnZXJzICh0aGUgIi5aIiBwYXJ0IGJlaW5nIG9wdGlvbmFsKSBvciBhCisjIHZhcmlhYmxlICIkdmFyIi4KKyMgRGVmaW5lcyB0aGUgdmFsdWUgQk9PU1RfQ1BQRkxBR1MuICBUaGlzIG1hY3JvIG9ubHkgY2hlY2tzIGZvciBoZWFkZXJzIHdpdGgKKyMgdGhlIHJlcXVpcmVkIHZlcnNpb24sIGl0IGRvZXMgbm90IGNoZWNrIGZvciBhbnkgb2YgdGhlIEJvb3N0IGxpYnJhcmllcy4KKyMgT24gIyBzdWNjZXNzLCBkZWZpbmVzIEhBVkVfQk9PU1QuICBPbiBmYWlsdXJlLCBjYWxscyB0aGUgb3B0aW9uYWwKKyMgQUNUSU9OLUlGLU5PVC1GT1VORCBhY3Rpb24gaWYgb25lIHdhcyBzdXBwbGllZC4KKyMgT3RoZXJ3aXNlIGFib3J0cyB3aXRoIGFuIGVycm9yIG1lc3NhZ2UuCitBQ19ERUZVTl9PTkNFKFtCT09TVF9SRVFVSVJFXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0NYWF0pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX0dSRVBdKWRubAorZWNobyAiJGFzX21lOiB0aGlzIGlzIGJvb3N0Lm00W11fQk9PU1RfU0VSSUFMIiA+JkFTX01FU1NBR0VfTE9HX0ZECitib29zdF9zYXZlX0lGUz0kSUZTCitib29zdF92ZXJzaW9uX3JlcT0kMQorSUZTPS4KK3NldCB4ICRib29zdF92ZXJzaW9uX3JlcSAwIDAgMAorSUZTPSRib29zdF9zYXZlX0lGUworc2hpZnQKK2Jvb3N0X3ZlcnNpb25fcmVxPWBleHByICIkWzFdIiAnKicgMTAwMDAwICsgIiRbMl0iICcqJyAxMDAgKyAiJFszXSJgCitib29zdF92ZXJzaW9uX3JlcV9zdHJpbmc9JFsxXS4kWzJdLiRbM10KK0FDX0FSR19XSVRIKFtib29zdF0sCisgICBbQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1ib29zdD1ESVJdLAorICAgICAgICAgICAgICAgICAgIFtwcmVmaXggb2YgQm9vc3QgJDEgQDw6QGd1ZXNzQDo+QF0pXSlkbmwKK0FDX0FSR19WQVIoW0JPT1NUX1JPT1RdLFtMb2NhdGlvbiBvZiBCb29zdCBpbnN0YWxsYXRpb25dKWRubAorIyBJZiBCT09TVF9ST09UIGlzIHNldCBhbmQgdGhlIHVzZXIgaGFzIG5vdCBwcm92aWRlZCBhIHZhbHVlIHRvCisjIC0td2l0aC1ib29zdCwgdGhlbiB0cmVhdCBCT09TVF9ST09UIGFzIGlmIGl0IHRoZSB1c2VyIHN1cHBsaWVkIGl0LgoraWYgdGVzdCB4IiRCT09TVF9ST09UIiAhPSB4OyB0aGVuCisgIGlmIHRlc3QgeCIkd2l0aF9ib29zdCIgPSB4OyB0aGVuCisgICAgQUNfTVNHX05PVElDRShbRGV0ZWN0ZWQgQk9PU1RfUk9PVDsgY29udGludWluZyB3aXRoIC0td2l0aC1ib29zdD0kQk9PU1RfUk9PVF0pCisgICAgd2l0aF9ib29zdD0kQk9PU1RfUk9PVAorICBlbHNlCisgICAgQUNfTVNHX05PVElDRShbRGV0ZWN0ZWQgQk9PU1RfUk9PVD0kQk9PU1RfUk9PVCwgYnV0IG92ZXJyaWRkZW4gYnkgLS13aXRoLWJvb3N0PSR3aXRoX2Jvb3N0XSkKKyAgZmkKK2ZpCitBQ19TVUJTVChbRElTVENIRUNLX0NPTkZJR1VSRV9GTEFHU10sCisgICAgICAgICBbIiRESVNUQ0hFQ0tfQ09ORklHVVJFX0ZMQUdTICctLXdpdGgtYm9vc3Q9JHdpdGhfYm9vc3QnIl0pZG5sCitib29zdF9zYXZlX0NQUEZMQUdTPSRDUFBGTEFHUworICBBQ19DQUNIRV9DSEVDSyhbZm9yIEJvb3N0IGhlYWRlcnMgdmVyc2lvbiA+PSAkYm9vc3RfdmVyc2lvbl9yZXFfc3RyaW5nXSwKKyAgICBbYm9vc3RfY3ZfaW5jX3BhdGhdLAorICAgIFtib29zdF9jdl9pbmNfcGF0aD1ubworQUNfTEFOR19QVVNIKFtDKytdKWRubAorbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX1ZFUlNJT04kXSlkbmwKKyAgICBBQ19MQU5HX0NPTkZURVNUKFtBQ19MQU5HX1BST0dSQU0oW1sjaW5jbHVkZSA8Ym9vc3QvdmVyc2lvbi5ocHA+CisjaWYgIWRlZmluZWQgQk9PU1RfVkVSU0lPTgorIyBlcnJvciBCT09TVF9WRVJTSU9OIGlzIG5vdCBkZWZpbmVkCisjZWxpZiBCT09TVF9WRVJTSU9OIDwgJGJvb3N0X3ZlcnNpb25fcmVxCisjIGVycm9yIEJvb3N0IGhlYWRlcnMgdmVyc2lvbiA8ICRib29zdF92ZXJzaW9uX3JlcQorI2VuZGlmCitdXSldKQorICAgICMgSWYgdGhlIHVzZXIgcHJvdmlkZWQgYSB2YWx1ZSB0byAtLXdpdGgtYm9vc3QsIHVzZSBpdCBhbmQgb25seSBpdC4KKyAgICBjYXNlICR3aXRoX2Jvb3N0IGluICMoCisgICAgICAnJ3x5ZXMpIHNldCB4ICcnIC9vcHQvbG9jYWwvaW5jbHVkZSAvdXNyL2xvY2FsL2luY2x1ZGUgL29wdC9pbmNsdWRlIFwKKyAgICAgICAgICAgICAgICAgL3Vzci9pbmNsdWRlIEM6L0Jvb3N0L2luY2x1ZGU7OyAjKAorICAgICAgKikgICAgICBzZXQgeCAiJHdpdGhfYm9vc3QvaW5jbHVkZSIgIiR3aXRoX2Jvb3N0Ijs7CisgICAgZXNhYworICAgIHNoaWZ0CisgICAgZm9yIGJvb3N0X2RpcgorICAgIGRvCisgICAgIyBXaXRob3V0IC0tbGF5b3V0PXN5c3RlbSwgQm9vc3QgKG9yIGF0IGxlYXN0IHNvbWUgdmVyc2lvbnMpIGluc3RhbGxzCisgICAgIyBpdHNlbGYgaW4gPHByZWZpeD4vaW5jbHVkZS9ib29zdC08dmVyc2lvbj4uICBUaGlzIGlubmVyIGxvb3AgaGVscHMgdG8KKyAgICAjIGZpbmQgaGVhZGVycyBpbiBzdWNoIGRpcmVjdG9yaWVzLgorICAgICMKKyAgICAjIEFueSAke2Jvb3N0X2Rpcn0vYm9vc3QteF94eCBkaXJlY3RvcmllcyBhcmUgc2VhcmNoZWQgaW4gcmV2ZXJzZSB2ZXJzaW9uCisgICAgIyBvcmRlciBmb2xsb3dlZCBieSAke2Jvb3N0X2Rpcn0uICBUaGUgZmluYWwgJy4nIGlzIGEgc2VudGluZWwgZm9yCisgICAgIyBzZWFyY2hpbmcgJGJvb3N0X2RpciIgaXRzZWxmLiAgRW50cmllcyBhcmUgd2hpdGVzcGFjZSBzZXBhcmF0ZWQuCisgICAgIworICAgICMgSSBkaWRuJ3QgaW5kZW50IHRoaXMgbG9vcCBvbiBwdXJwb3NlICh0byBhdm9pZCBvdmVyLWluZGVudGVkIGNvZGUpCisgICAgYm9vc3RfbGF5b3V0X3N5c3RlbV9zZWFyY2hfbGlzdD1gY2QgIiRib29zdF9kaXIiIDI+L2Rldi9udWxsIFwKKyAgICAgICAgJiYgbHMgLTEgfCAiJHtHUkVQfSIgJ15ib29zdC0nIHwgc29ydCAtcm4gLXQtIC1rMiBcCisgICAgICAgICYmIGVjaG8gLmAKKyAgICBmb3IgYm9vc3RfaW5jIGluICRib29zdF9sYXlvdXRfc3lzdGVtX3NlYXJjaF9saXN0CisgICAgZG8KKyAgICAgIGlmIHRlc3QgeCIkYm9vc3RfaW5jIiAhPSB4LjsgdGhlbgorICAgICAgICBib29zdF9pbmM9IiRib29zdF9kaXIvJGJvb3N0X2luYyIKKyAgICAgIGVsc2UKKyAgICAgICAgYm9vc3RfaW5jPSIkYm9vc3RfZGlyIiAjIFVzZXMgc2VudGluZWwgaW4gYm9vc3RfbGF5b3V0X3N5c3RlbV9zZWFyY2hfbGlzdAorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgeCIkYm9vc3RfaW5jIiAhPSB4OyB0aGVuCisgICAgICAgICMgV2UgYXJlIGdvaW5nIHRvIGNoZWNrIHdoZXRoZXIgdGhlIHZlcnNpb24gb2YgQm9vc3QgaW5zdGFsbGVkCisgICAgICAgICMgaW4gJGJvb3N0X2luYyBpcyB1c2FibGUgYnkgcnVubmluZyBhIGNvbXBpbGF0aW9uIHRoYXQKKyAgICAgICAgIyAjaW5jbHVkZXMgaXQuICBCdXQgaWYgd2UgcGFzcyBhIC1JL3NvbWUvcGF0aCBpbiB3aGljaCBCb29zdAorICAgICAgICAjIGlzIG5vdCBpbnN0YWxsZWQsIHRoZSBjb21waWxlciB3aWxsIGp1c3Qgc2tpcCB0aGlzIC1JIGFuZAorICAgICAgICAjIHVzZSBvdGhlciBsb2NhdGlvbnMgKGVpdGhlciBmcm9tIENQUEZMQUdTLCBvciBmcm9tIGl0cyBsaXN0CisgICAgICAgICMgb2Ygc3lzdGVtIGluY2x1ZGUgZGlyZWN0b3JpZXMpLiAgQXMgYSByZXN1bHQgd2Ugd291bGQgdXNlCisgICAgICAgICMgaGVhZGVyIGluc3RhbGxlZCBvbiB0aGUgbWFjaGluZSBpbnN0ZWFkIG9mIHRoZSAvc29tZS9wYXRoCisgICAgICAgICMgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLiAgU28gaW4gdGhhdCBwcmVjaXNlIGNhc2UgKHRyeWluZworICAgICAgICAjICRib29zdF9pbmMpLCBtYWtlIHN1cmUgdGhlIHZlcnNpb24uaHBwIGV4aXN0cy4KKyAgICAgICAgIworICAgICAgICAjIFVzZSB0ZXN0IC1lIGFzIHRoZXJlIGNhbiBiZSBzeW1saW5rcy4KKyAgICAgICAgdGVzdCAtZSAiJGJvb3N0X2luYy9ib29zdC92ZXJzaW9uLmhwcCIgfHwgY29udGludWUKKyAgICAgICAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAtSSRib29zdF9pbmMiCisgICAgICBmaQorICAgICAgQUNfQ09NUElMRV9JRkVMU0UoW10sIFtib29zdF9jdl9pbmNfcGF0aD15ZXNdLCBbYm9vc3RfY3ZfdmVyc2lvbj1ub10pCisgICAgICBpZiB0ZXN0IHgiJGJvb3N0X2N2X2luY19wYXRoIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgaWYgdGVzdCB4IiRib29zdF9pbmMiICE9IHg7IHRoZW4KKyAgICAgICAgICBib29zdF9jdl9pbmNfcGF0aD0kYm9vc3RfaW5jCisgICAgICAgIGZpCisgICAgICAgIGJyZWFrIDIKKyAgICAgIGZpCisgICAgZG9uZQorICAgIGRvbmUKK0FDX0xBTkdfUE9QKFtDKytdKWRubAorICAgIF0pCisgICAgY2FzZSAkYm9vc3RfY3ZfaW5jX3BhdGggaW4gIygKKyAgICAgIG5vKQorICAgICAgICBib29zdF9lcnJtc2c9ImNhbm5vdCBmaW5kIEJvb3N0IGhlYWRlcnMgdmVyc2lvbiA+PSAkYm9vc3RfdmVyc2lvbl9yZXFfc3RyaW5nIgorICAgICAgICBtNF9pZihbJDJdLCBbXSwgIFtBQ19NU0dfRVJST1IoWyRib29zdF9lcnJtc2ddKV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbQUNfTVNHX05PVElDRShbJGJvb3N0X2Vycm1zZ10pXSkKKyAgICAgICAgJDIKKyAgICAgICAgOzsjKAorICAgICAgeWVzKQorICAgICAgICBCT09TVF9DUFBGTEFHUz0KKyAgICAgICAgOzsjKAorICAgICAgKikKKyAgICAgICAgQUNfU1VCU1QoW0JPT1NUX0NQUEZMQUdTXSwgWyItSSRib29zdF9jdl9pbmNfcGF0aCJdKWRubAorICAgICAgICA7OworICAgIGVzYWMKKyAgaWYgdGVzdCB4IiRib29zdF9jdl9pbmNfcGF0aCIgIT0geG5vOyB0aGVuCisgIEFDX0RFRklORShbSEFWRV9CT09TVF0sIFsxXSwKKyAgICAgICAgICAgIFtEZWZpbmVkIGlmIHRoZSByZXF1ZXN0ZWQgbWluaW11bSBCT09TVCB2ZXJzaW9uIGlzIHNhdGlzZmllZF0pCisgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgQm9vc3QncyBoZWFkZXIgdmVyc2lvbl0sCisgICAgW2Jvb3N0X2N2X2xpYl92ZXJzaW9uXSwKKyAgICBbbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX0xJQl9WRVJTSU9OJF0pZG5sCisgICAgIF9CT09TVF9TRURfQ1BQKFtbL15ib29zdC1saWItdmVyc2lvbiA9IC97cy8vLztzL1tcIiBdLy9nO3A7cTt9XV0sCisgICAgICAgICAgICAgICAgICAgIFsjaW5jbHVkZSA8Ym9vc3QvdmVyc2lvbi5ocHA+Citib29zdC1saWItdmVyc2lvbiA9IEJPT1NUX0xJQl9WRVJTSU9OXSwKKyAgICBbYm9vc3RfY3ZfbGliX3ZlcnNpb249YGNhdCBjb25mdGVzdC5pYF0pXSkKKyAgICAjIGUuZy4gIjEzNCIgZm9yIDFfMzRfMSBvciAiMTM1IiBmb3IgMV8zNQorICAgIGJvb3N0X21ham9yX3ZlcnNpb249YGVjaG8gIiRib29zdF9jdl9saWJfdmVyc2lvbiIgfCBzZWQgJ3MvXy8vO3MvXy4qLy8nYAorICAgIGNhc2UgJGJvb3N0X21ham9yX3ZlcnNpb24gaW4gIygKKyAgICAgICcnIHwgKltbITAtOV1dKikKKyAgICAgICAgQUNfTVNHX0VSUk9SKFtpbnZhbGlkIHZhbHVlOiBib29zdF9tYWpvcl92ZXJzaW9uPSckYm9vc3RfbWFqb3JfdmVyc2lvbiddKQorICAgICAgICA7OworICAgIGVzYWMKK2ZpCitDUFBGTEFHUz0kYm9vc3Rfc2F2ZV9DUFBGTEFHUworXSkjIEJPT1NUX1JFUVVJUkUKKworCisjIEJPT1NUX1NUQVRJQygpCisjIC0tLS0tLS0tLS0tLS0tCisjIEFkZCB0aGUgIi0tZW5hYmxlLXN0YXRpYy1ib29zdCIgY29uZmlndXJlIGFyZ3VtZW50LiBJZiB0aGlzIGFyZ3VtZW50IGlzIGdpdmVuCisjIG9uIHRoZSBjb21tYW5kIGxpbmUsIHN0YXRpYyB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyaWVzIHdpbGwgYmUgbG9va2VkIHVwLgorQUNfREVGVU4oW0JPT1NUX1NUQVRJQ10sCisgIFtBQ19BUkdfRU5BQkxFKFtzdGF0aWMtYm9vc3RdLAorICAgICBbQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXN0YXRpYy1ib29zdF0sCisgICAgICAgICAgICAgICBbUHJlZmVyIHRoZSBzdGF0aWMgYm9vc3QgbGlicmFyaWVzIG92ZXIgdGhlIHNoYXJlZCBvbmVzIFtub11dKV0sCisgICAgIFtlbmFibGVfc3RhdGljX2Jvb3N0PXllc10sCisgICAgIFtlbmFibGVfc3RhdGljX2Jvb3N0PW5vXSldKSMgQk9PU1RfU1RBVElDCisKKworIyBCT09TVF9GSU5EX0hFQURFUihbSEVBREVSLU5BTUVdLCBbQUNUSU9OLUlGLU5PVC1GT1VORF0sIFtBQ1RJT04tSUYtRk9VTkRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBXcmFwcGVyIGFyb3VuZCBBQ19DSEVDS19IRUFERVIgZm9yIEJvb3N0IGhlYWRlcnMuICBVc2VmdWwgdG8gY2hlY2sgZm9yCisjIHNvbWUgcGFydHMgb2YgdGhlIEJvb3N0IGxpYnJhcnkgd2hpY2ggYXJlIG9ubHkgbWFkZSBvZiBoZWFkZXJzIGFuZCBkb24ndAorIyByZXF1aXJlIGxpbmtpbmcgKHN1Y2ggYXMgQm9vc3QuRm9yZWFjaCkuCisjCisjIERlZmF1bHQgQUNUSU9OLUlGLU5PVC1GT1VORDogRmFpbCB3aXRoIGEgZmF0YWwgZXJyb3IgdW5sZXNzIEJvb3N0IGNvdWxkbid0IGJlCisjIGZvdW5kIGluIHRoZSBmaXJzdCBwbGFjZSwgaW4gd2hpY2ggY2FzZSBieSBkZWZhdWx0IGEgbm90aWNlIGlzIGlzc3VlZCB0byB0aGUKKyMgdXNlci4gIFByZXN1bWFibHkgaWYgd2UgaGF2ZW4ndCBkaWVkIGFscmVhZHkgaXQncyBiZWNhdXNlIGl0J3MgT0sgdG8gbm90IGhhdmUKKyMgQm9vc3QsIHdoaWNoIGlzIHdoeSBvbmx5IGEgbm90aWNlIGlzIGlzc3VlZCBpbnN0ZWFkIG9mIGEgaGFyZCBlcnJvci4KKyMKKyMgRGVmYXVsdCBBQ1RJT04tSUYtRk9VTkQ6IGRlZmluZSB0aGUgcHJlcHJvY2Vzc29yIHN5bWJvbCBIQVZFXzxIRUFERVItTkFNRT4gaW4KKyMgY2FzZSBvZiBzdWNjZXNzICMgKHdoZXJlIEhFQURFUi1OQU1FIGlzIHdyaXR0ZW4gTElLRV9USElTLCBlLmcuLAorIyBIQVZFX0JPT1NUX0ZPUkVBQ0hfSFBQKS4KK0FDX0RFRlVOKFtCT09TVF9GSU5EX0hFQURFUl0sCitbQUNfUkVRVUlSRShbQk9PU1RfUkVRVUlSRV0pZG5sCitpZiB0ZXN0IHgiJGJvb3N0X2N2X2luY19wYXRoIiA9IHhubzsgdGhlbgorICBtNF9kZWZhdWx0KFskMl0sIFtBQ19NU0dfTk9USUNFKFtCb29zdCBub3QgYXZhaWxhYmxlLCBub3Qgc2VhcmNoaW5nIGZvciAkMV0pXSkKK2Vsc2UKK0FDX0xBTkdfUFVTSChbQysrXSlkbmwKK2Jvb3N0X3NhdmVfQ1BQRkxBR1M9JENQUEZMQUdTCitDUFBGTEFHUz0iJENQUEZMQUdTICRCT09TVF9DUFBGTEFHUyIKK0FDX0NIRUNLX0hFQURFUihbJDFdLAorICBbbTRfZGVmYXVsdChbJDNdLCBbQUNfREVGSU5FKEFTX1RSX0NQUChbSEFWRV8kMV0pLCBbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0RlZmluZSB0byAxIGlmIHlvdSBoYXZlIDwkMT5dKV0pXSwKKyAgW200X2RlZmF1bHQoWyQyXSwgW0FDX01TR19FUlJPUihbY2Fubm90IGZpbmQgJDFdKV0pXSkKK0NQUEZMQUdTPSRib29zdF9zYXZlX0NQUEZMQUdTCitBQ19MQU5HX1BPUChbQysrXSlkbmwKK2ZpCitdKSMgQk9PU1RfRklORF9IRUFERVIKKworCisjIEJPT1NUX0ZJTkRfTElCUyhbQ09NUE9ORU5ULU5BTUVdLCBbQ0FORElEQVRFLUxJQi1OQU1FU10sCisjICAgICAgICAgICAgICAgICBbUFJFRkVSUkVELVJULU9QVF0sIFtIRUFERVItTkFNRV0sIFtDWFgtVEVTVF0sCisjICAgICAgICAgICAgICAgICBbQ1hYLVBST0xPR1VFXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgdGhlIEJvb3N0IGxpYnJhcnkgQ09NUE9ORU5ULU5BTUUgKGUuZy4sIGB0aHJlYWQnLCBmb3IKKyMgbGliYm9vc3RfdGhyZWFkKSB1bmRlciB0aGUgcG9zc2libGUgQ0FORElEQVRFLUxJQi1OQU1FUyAoZS5nLiwKKyMgInRocmVhZF93aW4zMiB0aHJlYWQiKS4gIENoZWNrIHRoYXQgSEVBREVSLU5BTUUgd29ya3MgYW5kIGNoZWNrIHRoYXQKKyMgbGliYm9vc3RfTElCLU5BTUUgY2FuIGxpbmsgd2l0aCB0aGUgY29kZSBDWFgtVEVTVC4gIFRoZSBvcHRpb25hbAorIyBhcmd1bWVudCBDWFgtUFJPTE9HVUUgY2FuIGJlIHVzZWQgdG8gaW5jbHVkZSBzb21lIEMrKyBjb2RlIGJlZm9yZQorIyB0aGUgYG1haW4nIGZ1bmN0aW9uLgorIworIyBJbnZva2VzIEJPT1NUX0ZJTkRfSEVBREVSKFtIRUFERVItTkFNRV0pIChzZWUgYWJvdmUpLgorIworIyBCb29zdCBsaWJyYXJpZXMgdHlwaWNhbGx5IGNvbWUgY29tcGlsZWQgd2l0aCBzZXZlcmFsIGZsYXZvcnMgKHdpdGggZGlmZmVyZW50CisjIHJ1bnRpbWUgb3B0aW9ucykgc28gUFJFRkVSUkVELVJULU9QVCBpcyB0aGUgcHJlZmVycmVkIHN1ZmZpeC4gIEEgc3VmZml4IGlzIG9uZQorIyBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgbGV0dGVyczogc2dkcG4gKGluIHRoYXQgb3JkZXIpLiAgcyA9IHN0YXRpYworIyBydW50aW1lLCBkID0gZGVidWcgYnVpbGQsIGcgPSBkZWJ1Zy9kaWFnbm9zdGljIHJ1bnRpbWUsIHAgPSBTVExQb3J0IGJ1aWxkLAorIyBuID0gKHVuc3VyZSkgU1RMUG9ydCBidWlsZCB3aXRob3V0IGlvc3RyZWFtcyBmcm9tIFNUTFBvcnQgKGl0IGxvb2tzIGxpa2UgYG4nCisjIG11c3QgYWx3YXlzIGJlIHVzZWQgYWxvbmcgd2l0aCBgcCcpLiAgQWRkaXRpb25hbGx5LCBQUkVGRVJSRUQtUlQtT1BUIGNhbgorIyBzdGFydCB3aXRoIGBtdC0nIHRvIGluZGljYXRlIHRoYXQgdGhlcmUgaXMgYSBwcmVmZXJlbmNlIGZvciBtdWx0aS10aHJlYWQKKyMgYnVpbGRzLiAgU29tZSBzYW1wbGUgdmFsdWVzIGZvciBQUkVGRVJSRUQtUlQtT1BUOiAobm90aGluZyksIG10LCBkLCBtdC1kLCBnZHAKKyMgLi4uICBJZiB5b3Ugd2FudCB0byBtYWtlIHN1cmUgeW91IGhhdmUgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIEJvb3N0CisjIChlZywgPj0gMS4zMykgeW91ICptdXN0KiBpbnZva2UgQk9PU1RfUkVRVUlSRSBiZWZvcmUgdGhpcyBtYWNyby4KK0FDX0RFRlVOKFtCT09TVF9GSU5EX0xJQlNdLAorW0FDX1JFUVVJUkUoW0JPT1NUX1JFUVVJUkVdKWRubAorQUNfUkVRVUlSRShbX0JPT1NUX0ZJTkRfQ09NUElMRVJfVEFHXSlkbmwKK0FDX1JFUVVJUkUoW0JPT1NUX1NUQVRJQ10pZG5sCitBQ19SRVFVSVJFKFtfQk9PU1RfR1VFU1NfV0hFVEhFUl9UT19VU0VfTVRdKWRubAoraWYgdGVzdCB4IiRib29zdF9jdl9pbmNfcGF0aCIgPSB4bm87IHRoZW4KKyAgQUNfTVNHX05PVElDRShbQm9vc3Qgbm90IGF2YWlsYWJsZSwgbm90IHNlYXJjaGluZyBmb3IgdGhlIEJvb3N0ICQxIGxpYnJhcnldKQorZWxzZQorZG5sIFRoZSBlbHNlIGJyYW5jaCBpcyBodWdlIGFuZCB3YXNuJ3QgaW50ZW5kZWQgb24gcHVycG9zZS4KK0FDX0xBTkdfUFVTSChbQysrXSlkbmwKK0FTX1ZBUl9QVVNIREVGKFtCb29zdF9saWJdLCBbYm9vc3RfY3ZfbGliXyQxXSlkbmwKK0FTX1ZBUl9QVVNIREVGKFtCb29zdF9saWJfTERGTEFHU10sIFtib29zdF9jdl9saWJfJDFfTERGTEFHU10pZG5sCitBU19WQVJfUFVTSERFRihbQm9vc3RfbGliX0xEUEFUSF0sIFtib29zdF9jdl9saWJfJDFfTERQQVRIXSlkbmwKK0FTX1ZBUl9QVVNIREVGKFtCb29zdF9saWJfTElCU10sIFtib29zdF9jdl9saWJfJDFfTElCU10pZG5sCitCT09TVF9GSU5EX0hFQURFUihbJDRdKQorYm9vc3Rfc2F2ZV9DUFBGTEFHUz0kQ1BQRkxBR1MKK0NQUEZMQUdTPSIkQ1BQRkxBR1MgJEJPT1NUX0NQUEZMQUdTIgorQUNfQ0FDSEVfQ0hFQ0soW2ZvciB0aGUgQm9vc3QgJDEgbGlicmFyeV0sIFtCb29zdF9saWJdLAorICAgICAgICAgICAgICAgW19CT09TVF9GSU5EX0xJQlMoJEApXSkKK2Nhc2UgJEJvb3N0X2xpYiBpbiAjKAorICAobm8pIF9BQ19NU0dfTE9HX0NPTkZURVNUCisgICAgQUNfTVNHX0VSUk9SKFtjYW5ub3QgZmluZCB0aGUgZmxhZ3MgdG8gbGluayB3aXRoIEJvb3N0ICQxXSkKKyAgICA7OworZXNhYworQUNfU1VCU1QoQVNfVFJfQ1BQKFtCT09TVF8kMV9MREZMQUdTXSksIFskQm9vc3RfbGliX0xERkxBR1NdKWRubAorQUNfU1VCU1QoQVNfVFJfQ1BQKFtCT09TVF8kMV9MRFBBVEhdKSwgWyRCb29zdF9saWJfTERQQVRIXSlkbmwKK0FDX1NVQlNUKFtCT09TVF9MRFBBVEhdLCBbJEJvb3N0X2xpYl9MRFBBVEhdKWRubAorQUNfU1VCU1QoQVNfVFJfQ1BQKFtCT09TVF8kMV9MSUJTXSksIFskQm9vc3RfbGliX0xJQlNdKWRubAorQ1BQRkxBR1M9JGJvb3N0X3NhdmVfQ1BQRkxBR1MKK0FTX1ZBUl9QT1BERUYoW0Jvb3N0X2xpYl0pZG5sCitBU19WQVJfUE9QREVGKFtCb29zdF9saWJfTERGTEFHU10pZG5sCitBU19WQVJfUE9QREVGKFtCb29zdF9saWJfTERQQVRIXSlkbmwKK0FTX1ZBUl9QT1BERUYoW0Jvb3N0X2xpYl9MSUJTXSlkbmwKK0FDX0xBTkdfUE9QKFtDKytdKWRubAorZmkKK10pCisKKworIyBCT09TVF9GSU5EX0xJQihbTElCLU5BTUVdLAorIyAgICAgICAgICAgICAgICBbUFJFRkVSUkVELVJULU9QVF0sIFtIRUFERVItTkFNRV0sIFtDWFgtVEVTVF0sCisjICAgICAgICAgICAgICAgIFtDWFgtUFJPTE9HVUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdyYXBwZXIgZm9yIEJPT1NUX0ZJTkRfTElCUy4KK0FDX0RFRlVOKFtCT09TVF9GSU5EX0xJQl0sCitbQk9PU1RfRklORF9MSUJTKFskMV0sICRAKV0pCisKKworIyBfQk9PU1RfRklORF9MSUJTKFtMSUItTkFNRV0sIFtDQU5ESURBVEUtTElCLU5BTUVTXSwKKyMgICAgICAgICAgICAgICAgIFtQUkVGRVJSRUQtUlQtT1BUXSwgW0hFQURFUi1OQU1FXSwgW0NYWC1URVNUXSwKKyMgICAgICAgICAgICAgICAgIFtDWFgtUFJPTE9HVUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBSZWFsIGltcGxlbWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCUzogcmVseSBvbiB0aGVzZSBsb2NhbCBtYWNyb3M6CisjIEJvb3N0X2xpYiwgQm9vc3RfbGliX0xERkxBR1MsIEJvb3N0X2xpYl9MRFBBVEgsIEJvb3N0X2xpYl9MSUJTCisjCisjIFRoZSBhbGdvcml0aG0gaXMgYXMgZm9sbG93czogZmlyc3QgbG9vayBmb3IgYSBnaXZlbiBsaWJyYXJ5IG5hbWUKKyMgYWNjb3JkaW5nIHRvIHRoZSB1c2VyJ3MgUFJFRkVSUkVELVJULU9QVC4gIEZvciBlYWNoIGxpYnJhcnkgbmFtZSwgd2UKKyMgcHJlZmVyIHRvIHVzZSB0aGUgb25lcyB0aGF0IGNhcnJ5IHRoZSB0YWcgKHRvb2xzZXQgbmFtZSkuICBFYWNoCisjIGxpYnJhcnkgaXMgc2VhcmNoZWQgdGhyb3VnaCB0aGUgdmFyaW91cyBzdGFuZGFyZCBwYXRocyB3ZXJlIEJvb3N0IGlzCisjIHVzdWFsbHkgaW5zdGFsbGVkLiAgSWYgd2UgY2FuJ3QgZmluZCB0aGUgc3RhbmRhcmQgdmFyaWFudHMsIHdlIHRyeQorIyB0byBlbmZvcmNlIC1tdCAoZm9yIGluc3RhbmNlIG9uIE1hY09TWCwgbGliYm9vc3RfdGhyZWFkLmR5bGliCisjIGRvZXNuJ3QgZXhpc3QgYnV0IHRoZXJlJ3MgLW9idmlvdXNseS0gbGliYm9vc3RfdGhyZWFkLW10LmR5bGliKS4KK0FDX0RFRlVOKFtfQk9PU1RfRklORF9MSUJTXSwKK1tCb29zdF9saWI9bm8KKyAgY2FzZSAiJDMiIGluICMoCisgICAgKG10IHwgbXQtKSBib29zdF9tdD0tbXQ7IGJvb3N0X3J0b3B0PTs7ICMoCisgICAgKG10KiB8IG10LSopIGJvb3N0X210PS1tdDsgYm9vc3RfcnRvcHQ9YGV4cHIgIlgkMyIgOiAnWG10LSpcKC4qXCknYDs7ICMoCisgICAgKCopIGJvb3N0X210PTsgYm9vc3RfcnRvcHQ9JDM7OworICBlc2FjCisgIGlmIHRlc3QgJGVuYWJsZV9zdGF0aWNfYm9vc3QgPSB5ZXM7IHRoZW4KKyAgICBib29zdF9ydG9wdD0icyRib29zdF9ydG9wdCIKKyAgZmkKKyAgIyBGaW5kIHRoZSBwcm9wZXIgZGVidWcgdmFyaWFudCBkZXBlbmRpbmcgb24gd2hhdCB3ZSd2ZSBiZWVuIGFza2VkIHRvIGZpbmQuCisgIGNhc2UgJGJvb3N0X3J0b3B0IGluICMoCisgICAgKCpkKikgYm9vc3RfcnRfZD0kYm9vc3RfcnRvcHQ7OyAjKAorICAgICgqW1tzZ3BuXV0qKSAjIEluc2VydCB0aGUgYGQnIGF0IHRoZSByaWdodCBwbGFjZSAoaW4gYmV0d2VlbiBgc2cnIGFuZCBgcG4nKQorICAgICAgYm9vc3RfcnRfZD1gZWNobyAiJGJvb3N0X3J0b3B0IiB8IHNlZCAncy9cKHMqZypcKVwocCpuKlwpL1wxXDIvJ2A7OyAjKAorICAgICgqKSBib29zdF9ydF9kPSctZCc7OworICBlc2FjCisgICMgSWYgdGhlIFBSRUZFUlJFRC1SVC1PUFQgYXJlIG5vdCBlbXB0eSwgcHJlcGVuZCBhIGAtJy4KKyAgdGVzdCAtbiAiJGJvb3N0X3J0b3B0IiAmJiBib29zdF9ydG9wdD0iLSRib29zdF9ydG9wdCIKKyAgJGJvb3N0X2d1ZXNzX3VzZV9tdCAmJiBib29zdF9tdD0tbXQKKyAgIyBMb29rIGZvciB0aGUgYWJzIHBhdGggdGhlIHN0YXRpYyBhcmNoaXZlLgorICAjICRsaWJleHQgaXMgY29tcHV0ZWQgYnkgTGlidG9vbCBidXQgbGV0J3MgbWFrZSBzdXJlIGl0J3Mgbm9uIGVtcHR5LgorICB0ZXN0IC16ICIkbGliZXh0IiAmJgorICAgIEFDX01TR19FUlJPUihbdGhlIGxpYmV4dCB2YXJpYWJsZSBpcyBlbXB0eSwgZGlkIHlvdSBpbnZva2UgTGlidG9vbD9dKQorICBib29zdF9zYXZlX2FjX29iamV4dD0kYWNfb2JqZXh0CisgICMgR2VuZXJhdGUgdGhlIHRlc3QgZmlsZS4KKyAgQUNfTEFOR19DT05GVEVTVChbQUNfTEFOR19QUk9HUkFNKFsjaW5jbHVkZSA8JDQ+CiskNl0sIFskNV0pXSkKK2RubCBPcHRpbWl6YXRpb24gaGFja3M6IGNvbXBpbGluZyBDKysgaXMgc2xvdywgZXNwZWNpYWxseSB3aXRoIEJvb3N0LiAgV2hhdAorZG5sIHdlJ3JlIHRyeWluZyB0byBkbyBoZXJlIGlzIGd1ZXNzIHRoZSByaWdodCBjb21iaW5hdGlvbiBvZiBsaW5rIGZsYWdzCitkbmwgKExJQlMgLyBMREZMQUdTKSB0byB1c2UgYSBnaXZlbiBsaWJyYXJ5LiAgVGhpcyBjYW4gdGFrZSBzZXZlcmFsCitkbmwgaXRlcmF0aW9ucyBiZWZvcmUgaXQgc3VjY2VlZHMgYW5kIGlzIHRodXMgKnZlcnkqIHNsb3cuICBTbyB3aGF0IHdlIGRvCitkbmwgaW5zdGVhZCBpcyB0aGF0IHdlIGNvbXBpbGUgdGhlIGNvZGUgZmlyc3QgKGFuZCB0aHVzIGdldCBhbiBvYmplY3QgZmlsZSwKK2RubCB0eXBpY2FsbHkgY29uZnRlc3QubykuICBUaGVuIHdlIHRyeSB2YXJpb3VzIGNvbWJpbmF0aW9ucyBvZiBsaW5rIGZsYWdzCitkbmwgdW50aWwgd2Ugc3VjY2VlZCB0byBsaW5rIGNvbmZ0ZXN0Lm8gaW4gYW4gZXhlY3V0YWJsZS4gIFRoZSBwcm9ibGVtIGlzCitkbmwgdGhhdCB0aGUgdmFyaW91cyBUUllfTElOSyAvIENPTVBJTEVfSUZFTFNFIG1hY3JvcyBvZiBBdXRvY29uZiBhbHdheXMKK2RubCByZW1vdmUgYWxsIHRoZSB0ZW1wb3JhcnkgZmlsZXMgaW5jbHVkaW5nIGNvbmZ0ZXN0Lm8uICBTbyB0aGUgdHJpY2sgaGVyZQorZG5sIGlzIHRvIHRlbXBvcmFyaWx5IGNoYW5nZSB0aGUgdmFsdWUgb2YgYWNfb2JqZXh0IHNvIHRoYXQgY29uZnRlc3QubyBpcworZG5sIHByZXNlcnZlZCBhY2Nyb3NzIHRlc3RzLiAgVGhpcyBpcyBvYnZpb3VzbHkgZnJhZ2lsZSBhbmQgSSB3aWxsIGJ1cm4gaW4KK2RubCBoZWxsIGZvciBub3QgcmVzcGVjdGluZyBBdXRvY29uZidzIGRvY3VtZW50ZWQgaW50ZXJmYWNlcywgYnV0IGluIHRoZQorZG5sIG1lYW4gdGltZSwgaXQgb3B0aW1pemVzIHRoZSBtYWNybyBieSBhIGZhY3RvciBvZiA1IHRvIDMwLgorZG5sIEFub3RoZXIgc21hbGwgb3B0aW1pemF0aW9uOiB0aGUgZmlyc3QgYXJndW1lbnQgb2YgQUNfQ09NUElMRV9JRkVMU0UgbGVmdAorZG5sIGVtcHR5IGJlY2F1c2UgdGhlIHRlc3QgZmlsZSBpcyBnZW5lcmF0ZWQgb25seSBvbmNlIGFib3ZlIChiZWZvcmUgd2UKK2RubCBzdGFydCB0aGUgZm9yIGxvb3BzKS4KKyAgQUNfQ09NUElMRV9JRkVMU0UoW10sCisgICAgW2FjX29iamV4dD1kb19ub3Rfcm1fbWVfcGx6XSwKKyAgICBbQUNfTVNHX0VSUk9SKFtjYW5ub3QgY29tcGlsZSBhIHRlc3QgdGhhdCB1c2VzIEJvb3N0ICQxXSldKQorICBhY19vYmpleHQ9JGJvb3N0X3NhdmVfYWNfb2JqZXh0CisgIGJvb3N0X2ZhaWxlZF9saWJzPQorIyBEb24ndCBib3RoZXIgdG8gaWRlbnQgdGhlIGZvbGxvd2luZyBuZXN0ZWQgZm9yIGxvb3BzLCBvbmx5IHRoZSAyCisjIGlubmVybW9zdCBvbmVzIG1hdHRlci4KK2ZvciBib29zdF9saWJfIGluICQyOyBkbworZm9yIGJvb3N0X3RhZ18gaW4gLSRib29zdF9jdl9saWJfdGFnICcnOyBkbworZm9yIGJvb3N0X3Zlcl8gaW4gLSRib29zdF9jdl9saWJfdmVyc2lvbiAnJzsgZG8KK2ZvciBib29zdF9tdF8gaW4gJGJvb3N0X210IC1tdCAnJzsgZG8KK2ZvciBib29zdF9ydG9wdF8gaW4gJGJvb3N0X3J0b3B0ICcnIC1kOyBkbworICBmb3IgYm9vc3RfbGliIGluIFwKKyAgICBib29zdF8kYm9vc3RfbGliXyRib29zdF90YWdfJGJvb3N0X210XyRib29zdF9ydG9wdF8kYm9vc3RfdmVyXyBcCisgICAgYm9vc3RfJGJvb3N0X2xpYl8kYm9vc3RfdGFnXyRib29zdF9ydG9wdF8kYm9vc3RfdmVyXyBcCisgICAgYm9vc3RfJGJvb3N0X2xpYl8kYm9vc3RfdGFnXyRib29zdF9tdF8kYm9vc3RfdmVyXyBcCisgICAgYm9vc3RfJGJvb3N0X2xpYl8kYm9vc3RfdGFnXyRib29zdF92ZXJfCisgIGRvCisgICAgIyBBdm9pZCB0ZXN0aW5nIHR3aWNlIHRoZSBzYW1lIGxpYgorICAgIGNhc2UgJGJvb3N0X2ZhaWxlZF9saWJzIGluICMoCisgICAgICAoKkAkYm9vc3RfbGliQCopIGNvbnRpbnVlOzsKKyAgICBlc2FjCisgICAgIyBJZiB3aXRoX2Jvb3N0IGlzIGVtcHR5LCB3ZSdsbCBzZWFyY2ggaW4gL2xpYiBmaXJzdCwgd2hpY2ggaXMgbm90IHF1aXRlCisgICAgIyByaWdodCBzbyBpbnN0ZWFkIHdlJ2xsIHRyeSB0byBhIGxvY2F0aW9uIGJhc2VkIG9uIHdoZXJlIHRoZSBoZWFkZXJzIGFyZS4KKyAgICBib29zdF90bXBfbGliPSR3aXRoX2Jvb3N0CisgICAgdGVzdCB4IiR3aXRoX2Jvb3N0IiA9IHggJiYgYm9vc3RfdG1wX2xpYj0ke2Jvb3N0X2N2X2luY19wYXRoJS9pbmNsdWRlfQorICAgIGZvciBib29zdF9sZHBhdGggaW4gIiRib29zdF90bXBfbGliL2xpYiIgJycgXAorICAgICAgICAgICAgIC9vcHQvbG9jYWwvbGliKiAvdXNyL2xvY2FsL2xpYiogL29wdC9saWIqIC91c3IvbGliKiBcCisgICAgICAgICAgICAgIiR3aXRoX2Jvb3N0IiBDOi9Cb29zdC9saWIgL2xpYioKKyAgICBkbworICAgICAgIyBEb24ndCB3YXN0ZSB0aW1lIHdpdGggZGlyZWN0b3JpZXMgdGhhdCBkb24ndCBleGlzdC4KKyAgICAgIGlmIHRlc3QgeCIkYm9vc3RfbGRwYXRoIiAhPSB4ICYmIHRlc3QgISAtZSAiJGJvb3N0X2xkcGF0aCI7IHRoZW4KKyAgICAgICAgY29udGludWUKKyAgICAgIGZpCisgICAgICBib29zdF9zYXZlX0xERkxBR1M9JExERkxBR1MKKyAgICAgICMgQXJlIHdlIGxvb2tpbmcgZm9yIGEgc3RhdGljIGxpYnJhcnk/CisgICAgICBjYXNlICRib29zdF9sZHBhdGg6JGJvb3N0X3J0b3B0XyBpbiAjKAorICAgICAgICAoKj8qOipzKikgIyBZZXMgKE5vbiBlbXB0eSBib29zdF9sZHBhdGggKyBzIGluIHJ0IG9wdCkKKyAgICAgICAgICBCb29zdF9saWJfTElCUz0iJGJvb3N0X2xkcGF0aC9saWIkYm9vc3RfbGliLiRsaWJleHQiCisgICAgICAgICAgdGVzdCAtZSAiJEJvb3N0X2xpYl9MSUJTIiB8fCBjb250aW51ZTs7ICMoCisgICAgICAgICgqKSAjIE5vOiB1c2UgLWxib29zdF9mb28gdG8gZmluZCB0aGUgc2hhcmVkIGxpYnJhcnkuCisgICAgICAgICAgQm9vc3RfbGliX0xJQlM9Ii1sJGJvb3N0X2xpYiI7OworICAgICAgZXNhYworICAgICAgYm9vc3Rfc2F2ZV9MSUJTPSRMSUJTCisgICAgICBMSUJTPSIkQm9vc3RfbGliX0xJQlMgJExJQlMiCisgICAgICB0ZXN0IHgiJGJvb3N0X2xkcGF0aCIgIT0geCAmJiBMREZMQUdTPSIkTERGTEFHUyAtTCRib29zdF9sZHBhdGgiCitkbmwgRmlyc3QgYXJndW1lbnQgb2YgQUNfTElOS19JRkVMU0UgbGVmdCBlbXB0eSBiZWNhdXNlIHRoZSB0ZXN0IGZpbGUgaXMKK2RubCBnZW5lcmF0ZWQgb25seSBvbmNlIGFib3ZlIChiZWZvcmUgd2Ugc3RhcnQgdGhlIGZvciBsb29wcykuCisgICAgICBfQk9PU1RfQUNfTElOS19JRkVMU0UoW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0Jvb3N0X2xpYj15ZXNdLCBbQm9vc3RfbGliPW5vXSkKKyAgICAgIGFjX29iamV4dD0kYm9vc3Rfc2F2ZV9hY19vYmpleHQKKyAgICAgIExERkxBR1M9JGJvb3N0X3NhdmVfTERGTEFHUworICAgICAgTElCUz0kYm9vc3Rfc2F2ZV9MSUJTCisgICAgICBpZiB0ZXN0IHgiJEJvb3N0X2xpYiIgPSB4eWVzOyB0aGVuCisgICAgICAgICMgQ2hlY2sgb3IgdXNlZCBjYWNoZWQgcmVzdWx0IG9mIHdoZXRoZXIgb3Igbm90IHVzaW5nIC1SIG9yCisgICAgICAgICMgLXJwYXRoIG1ha2VzIHNlbnNlLiAgU29tZSBpbXBsZW1lbnRhdGlvbnMgb2YgbGQsIHN1Y2ggYXMgZm9yCisgICAgICAgICMgTWFjIE9TWCwgcmVxdWlyZSAtcnBhdGggYnV0IC1SIGlzIHRoZSBmbGFnIGtub3duIHRvIHdvcmsgb24KKyAgICAgICAgIyBvdGhlciBzeXN0ZW1zLiAgaHR0cHM6Ly9naXRodWIuY29tL3RzdW5hL2Jvb3N0Lm00L2lzc3Vlcy8xOQorICAgICAgICBBQ19DQUNIRV9WQUwoW2Jvb3N0X2N2X3JwYXRoX2xpbmtfbGRmbGFnXSwKKyAgICAgICAgICBbY2FzZSAkYm9vc3RfbGRwYXRoIGluCisgICAgICAgICAgICcnKSAjIE5vdGhpbmcgdG8gZG8uCisgICAgICAgICAgICAgYm9vc3RfY3ZfcnBhdGhfbGlua19sZGZsYWc9CisgICAgICAgICAgICAgYm9vc3RfcnBhdGhfbGlua19sZGZsYWdfZm91bmQ9eWVzOzsKKyAgICAgICAgICAgKikKKyAgICAgICAgICAgIGZvciBib29zdF9jdl9ycGF0aF9saW5rX2xkZmxhZyBpbiAtV2wsLVIsIC1XbCwtcnBhdGgsOyBkbworICAgICAgICAgICAgICBMREZMQUdTPSIkYm9vc3Rfc2F2ZV9MREZMQUdTIC1MJGJvb3N0X2xkcGF0aCAkYm9vc3RfY3ZfcnBhdGhfbGlua19sZGZsYWckYm9vc3RfbGRwYXRoIgorICAgICAgICAgICAgICBMSUJTPSIkYm9vc3Rfc2F2ZV9MSUJTICRCb29zdF9saWJfTElCUyIKKyAgICAgICAgICAgICAgX0JPT1NUX0FDX0xJTktfSUZFTFNFKFtdLAorICAgICAgICAgICAgICAgIFtib29zdF9ycGF0aF9saW5rX2xkZmxhZ19mb3VuZD15ZXMKKyAgICAgICAgICAgICAgICBicmVha10sCisgICAgICAgICAgICAgICAgW2Jvb3N0X3JwYXRoX2xpbmtfbGRmbGFnX2ZvdW5kPW5vXSkKKyAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgIDs7CisgICAgICAgICAgZXNhYworICAgICAgICAgIEFTX0lGKFt0ZXN0ICJ4JGJvb3N0X3JwYXRoX2xpbmtfbGRmbGFnX2ZvdW5kIiAhPSAieHllcyJdLAorICAgICAgICAgICAgW0FDX01TR19FUlJPUihbVW5hYmxlIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHVzZSAtUiBvciAtcnBhdGhdKV0pCisgICAgICAgICAgTERGTEFHUz0kYm9vc3Rfc2F2ZV9MREZMQUdTCisgICAgICAgICAgTElCUz0kYm9vc3Rfc2F2ZV9MSUJTCisgICAgICAgICAgXSkKKyAgICAgICAgdGVzdCB4IiRib29zdF9sZHBhdGgiICE9IHggJiYKKyAgICAgICAgICBCb29zdF9saWJfTERGTEFHUz0iLUwkYm9vc3RfbGRwYXRoICRib29zdF9jdl9ycGF0aF9saW5rX2xkZmxhZyRib29zdF9sZHBhdGgiCisgICAgICAgIEJvb3N0X2xpYl9MRFBBVEg9IiRib29zdF9sZHBhdGgiCisgICAgICAgIGJyZWFrIDcKKyAgICAgIGVsc2UKKyAgICAgICAgYm9vc3RfZmFpbGVkX2xpYnM9IiRib29zdF9mYWlsZWRfbGlic0AkYm9vc3RfbGliQCIKKyAgICAgIGZpCisgICAgZG9uZQorICBkb25lCitkb25lCitkb25lCitkb25lCitkb25lCitkb25lICMgYm9vc3RfbGliXworcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorXSkKKworCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKKyMgQ2hlY2tzIGZvciB0aGUgdmFyaW91cyBCb29zdCBsaWJyYXJpZXMuICMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKKworIyBMaXN0IG9mIGJvb3N0IGxpYnJhcmllczogaHR0cDovL3d3dy5ib29zdC5vcmcvbGlicy9saWJyYXJpZXMuaHRtCisjIFRoZSBwYWdlIGh0dHA6Ly9iZXRhLmJvb3N0Lm9yZy9kb2MvbGlicyBpcyB1c2VmdWw6IGl0IGdpdmVzIHRoZSBmaXJzdCByZWxlYXNlCisjIHZlcnNpb24gb2YgZWFjaCBsaWJyYXJ5IChhbW9uZyBvdGhlciB0aGluZ3MpLgorCisjIEJPT1NUX0RFRlVOKExJQlJBUlksIENPREUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlZmluZSBCT09TVF88TElCUkFSWS1VUFBFUkNBU0U+IGFzIGEgbWFjcm8gdGhhdCBydW5zIENPREUuCisjCisjIFVzZSBpbmRpciB0byBhdm9pZCB0aGUgd2FybmluZyBvbiB1bmRlcnF1b3RlZCBtYWNybyBuYW1lIGdpdmVuIHRvIEFDX0RFRlVOLgorbTRfZGVmaW5lKFtCT09TVF9ERUZVTl0sCitbbTRfaW5kaXIoW0FDX0RFRlVOXSwKKyAgICAgICAgICBtNF90b3VwcGVyKFtCT09TVF8kMV0pLAorW200X3B1c2hkZWYoW0JPT1NUX0xpYnJhcnldLCBbJDFdKWRubAorJDIKK200X3BvcGRlZihbQk9PU1RfTGlicmFyeV0pZG5sCitdKQorXSkKKworIyBCT09TVF9BUlJBWSgpCisjIC0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuQXJyYXkKK0JPT1NUX0RFRlVOKFtBcnJheV0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L2FycmF5LmhwcF0pXSkKKworCisjIEJPT1NUX0FTSU8oKQorIyAtLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuQXNpbyAobmV3IGluIEJvb3N0IDEuMzUpLgorQk9PU1RfREVGVU4oW0FzaW9dLAorW0FDX1JFUVVJUkUoW0JPT1NUX1NZU1RFTV0pZG5sCitCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvYXNpby5ocHBdKV0pCisKKworIyBCT09TVF9CSU5EKCkKKyMgLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkJpbmQuCitCT09TVF9ERUZVTihbQmluZF0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L2JpbmQuaHBwXSldKQorCisKKyMgQk9PU1RfQ0hST05PKCkKKyMgLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuQ2hyb25vLgorQk9PU1RfREVGVU4oW0Nocm9ub10sCitbIyBEbyB3ZSBoYXZlIHRvIGNoZWNrIGZvciBCb29zdC5TeXN0ZW0/ICBUaGlzIGxpbmstdGltZSBkZXBlbmRlbmN5IHdhcworIyBhZGRlZCBhcyBvZiAxLjM1LjAuICBJZiB3ZSBoYXZlIGEgdmVyc2lvbiA8MS4zNSwgd2UgbXVzdCBub3QgYXR0ZW1wdCB0bworIyBmaW5kIEJvb3N0LlN5c3RlbSBhcyBpdCBkaWRuJ3QgZXhpc3QgYnkgdGhlbi4KK2lmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWdlIDEzNTsgdGhlbgorICBCT09TVF9TWVNURU0oWyQxXSkKK2ZpICMgZW5kIG9mIHRoZSBCb29zdC5TeXN0ZW0gY2hlY2suCitib29zdF9maWxlc3lzdGVtX3NhdmVfTElCUz0kTElCUworYm9vc3RfZmlsZXN5c3RlbV9zYXZlX0xERkxBR1M9JExERkxBR1MKK200X3BhdHRlcm5fYWxsb3coW15CT09TVF9TWVNURU1fKExJQlN8TERGTEFHUykkXSlkbmwKK0xJQlM9IiRMSUJTICRCT09TVF9TWVNURU1fTElCUyIKK0xERkxBR1M9IiRMREZMQUdTICRCT09TVF9TWVNURU1fTERGTEFHUyIKK0JPT1NUX0ZJTkRfTElCKFtjaHJvbm9dLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9jaHJvbm8uaHBwXSwKKyAgICAgICAgICAgICAgICBbYm9vc3Q6OmNocm9ubzo6dGhyZWFkX2Nsb2NrIGQ7XSkKK2lmIHRlc3QgJGVuYWJsZV9zdGF0aWNfYm9vc3QgPSB5ZXMgJiYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtZ2UgMTM1OyB0aGVuCisgIEJPT1NUX0NIUk9OT19MSUJTPSIkQk9PU1RfQ0hST05PX0xJQlMgJEJPT1NUX1NZU1RFTV9MSUJTIgorZmkKK0xJQlM9JGJvb3N0X2ZpbGVzeXN0ZW1fc2F2ZV9MSUJTCitMREZMQUdTPSRib29zdF9maWxlc3lzdGVtX3NhdmVfTERGTEFHUworXSkjIEJPT1NUX0NIUk9OTworCisKKyMgQk9PU1RfQ09OVEVYVChbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkNvbnRleHQuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorIworIyAqIFRoaXMgbGlicmFyeSB3YXMgaW50cm9kdWNlZCBpbiBCb29zdCAxLjUxLjAKKyMgKiBUaGUgc2lnbmF0dXJlcyBvZiBtYWtlX2Zjb250ZXh0KCkgYW5kIGp1bXBfZmNvbnRleHQgd2VyZSBjaGFuZ2VkIGluIDEuNTYuMAorIyAqIEEgZGVwZW5kZW5jeSBvbiBib29zdF90aHJlYWQgYXBwZWFycyBpbiAxLjU3LjAKK0JPT1NUX0RFRlVOKFtDb250ZXh0XSwKK1tib29zdF9jb250ZXh0X3NhdmVfTElCUz0kTElCUworIGJvb3N0X2NvbnRleHRfc2F2ZV9MREZMQUdTPSRMREZMQUdTCitpZiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxNTc7IHRoZW4KKyAgQk9PU1RfVEhSRUFEKFskMV0pCisgIG00X3BhdHRlcm5fYWxsb3coW15CT09TVF9USFJFQURfKExJQlN8TERGTEFHUykkXSlkbmwKKyAgTElCUz0iJExJQlMgJEJPT1NUX1RIUkVBRF9MSUJTIgorICBMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfVEhSRUFEX0xERkxBR1MiCitmaQorQk9PU1RfRklORF9MSUIoW2NvbnRleHRdLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9jb250ZXh0L2FsbC5ocHBdLFtbCisKKy8vIGNyZWF0ZXMgYSBzdGFjawordm9pZCAqIHN0YWNrX3BvaW50ZXIgPSBuZXcgdm9pZCpbNDA5Nl07CitzdGQ6OnNpemVfdCBjb25zdCBzaXplID0gc2l6ZW9mKHZvaWQqWzQwOTZdKTsKKworI2lmIEJPT1NUX1ZFUlNJT04gPD0gMTA1MTAwCitjdHg6Om1ha2VfZmNvbnRleHQoJmZjLCBmKTsKK3JldHVybiBjdHg6Omp1bXBfZmNvbnRleHQoJmZjbSwgJmZjLCAzKSA9PSA2OworCisjZWxzZQorCitmYyA9IGN0eDo6bWFrZV9mY29udGV4dChzdGFja19wb2ludGVyLCBzaXplLCBmKTsKK3JldHVybiBjdHg6Omp1bXBfZmNvbnRleHQoJmZjbSwgZmMsIDMpID09IDY7CisKKyNlbmRpZgorCisKK11dLFtkbmwKKworI2luY2x1ZGUgPGJvb3N0L3ZlcnNpb24uaHBwPgorI2lmIEJPT1NUX1ZFUlNJT04gPD0gMTA1MTAwCisKK25hbWVzcGFjZSBjdHggPSBib29zdDo6Y3R4OworCitzdGF0aWMgY3R4OjpmY29udGV4dF90IGZjbSwgZmM7CisKK3N0YXRpYyB2b2lkIGYoaW50cHRyX3QgaSkgeworICAgIGN0eDo6anVtcF9mY29udGV4dCgmZmMsICZmY20sIGkgKiAyKTsKK30KKworI2VsaWYgQk9PU1RfVkVSU0lPTiA8PSAxMDU1MDAKKworbmFtZXNwYWNlIGN0eCA9IGJvb3N0Ojpjb250ZXh0OworCisvLyBjb250ZXh0CitzdGF0aWMgY3R4OjpmY29udGV4dF90IGZjbSwgKmZjOworCisvLyBjb250ZXh0LWZ1bmN0aW9uCitzdGF0aWMgdm9pZCBmKGludHB0cl90IGkpIHsKKyAgICBjdHg6Omp1bXBfZmNvbnRleHQoZmMsICZmY20sIGkgKiAyKTsKK30KKworI2Vsc2UKKworbmFtZXNwYWNlIGN0eCA9IGJvb3N0Ojpjb250ZXh0OworCisvLyBjb250ZXh0CitzdGF0aWMgY3R4OjpmY29udGV4dF90IGZjbSwgZmM7CisKKy8vIGNvbnRleHQtZnVuY3Rpb24KK3N0YXRpYyB2b2lkIGYoaW50cHRyX3QgaSkgeworICAgIGN0eDo6anVtcF9mY29udGV4dCgmZmMsIGZjbSwgaSAqIDIpOworfQorI2VuZGlmCitdKQorTElCUz0kYm9vc3RfY29udGV4dF9zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X2NvbnRleHRfc2F2ZV9MREZMQUdTCitdKSMgQk9PU1RfQ09OVEVYVAorCisKKyMgQk9PU1RfQ09OVkVSU0lPTigpCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5Db252ZXJzaW9uIChjYXN0IC8gbGV4aWNhbF9jYXN0KQorQk9PU1RfREVGVU4oW0NvbnZlcnNpb25dLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9jYXN0LmhwcF0pCitCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvbGV4aWNhbF9jYXN0LmhwcF0pCitdKSMgQk9PU1RfQ09OVkVSU0lPTgorCisKKyMgQk9PU1RfQ09ST1VUSU5FKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuQ29yb3V0aW5lLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsIHNlZSB0aGUKKyMgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4gIFRoaXMgbGlicmFyeSB3YXMgaW50cm9kdWNlZCBpbiBCb29zdAorIyAxLjUzLjAKK0JPT1NUX0RFRlVOKFtDb3JvdXRpbmVdLAorWworYm9vc3RfY29yb3V0aW5lX3NhdmVfTElCUz0kTElCUworYm9vc3RfY29yb3V0aW5lX3NhdmVfTERGTEFHUz0kTERGTEFHUworIyBMaW5rLXRpbWUgZGVwZW5kZW5jeSBmcm9tIGNvcm91dGluZSB0byBjb250ZXh0CitCT09TVF9DT05URVhUKFskMV0pCisjIFN0YXJ0aW5nIGZyb20gQm9vc3QgMS41NSBhIGRlcGVuZGVuY3kgb24gQm9vc3QuU3lzdGVtIGlzIGFkZGVkCitpZiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxNTU7IHRoZW4KKyAgQk9PU1RfU1lTVEVNKFskMV0pCitmaQorbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUXyhDT05URVhUfFNZU1RFTSlfKExJQlN8TERGTEFHUyldKQorTElCUz0iJExJQlMgJEJPT1NUX0NPTlRFWFRfTElCUyAkQk9PU1RfU1lTVEVNX0xJQlMiCitMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfQ09OVEVYVF9MREZMQUdTIgorCisjIGluIDEuNTMgY29yb3V0aW5lIHdhcyBhIGhlYWRlciBvbmx5IGxpYnJhcnkKK2lmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWVxIDE1MzsgdGhlbgorICBCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvY29yb3V0aW5lL2Nvcm91dGluZS5ocHBdKQorZWxzZQorICBCT09TVF9GSU5EX0xJQihbY29yb3V0aW5lXSwgWyQxXSwKKwkJICBbYm9vc3QvY29yb3V0aW5lL2Nvcm91dGluZS5ocHBdLAorCQkgIFsKKyAgI2luY2x1ZGUgPGJvb3N0L3ZlcnNpb24uaHBwPgorICAjaWYgICBCT09TVF9WRVJTSU9OIDw9IDEwNTUwMAorICBib29zdDo6Y29yb3V0aW5lczo6Y29yb3V0aW5lPGludChpbnQpPiBjb3JvOyBjb3JvLmdldCgpOworICAjZWxzZQorICBib29zdDo6Y29yb3V0aW5lczo6YXN5bW1ldHJpY19jb3JvdXRpbmU8aW50Pjo6cHVsbF90eXBlIGNvcm87IGNvcm8uZ2V0KCk7CisgICNlbmRpZgorICBdKQorZmkKKyMgTGluay10aW1lIGRlcGVuZGVuY3kgZnJvbSBjb3JvdXRpbmUgdG8gY29udGV4dCwgZXhpc3RlZCBvbmx5IGluIDEuNTMsIGluIDEuNTQKKyMgY29yb3V0aW5lIGRvZXNuJ3QgdXNlIGNvbnRleHQgZnJvbSBpdHMgaGVhZGVycyBidXQgZnJvbSBpdHMgbGlicmFyeS4KK2lmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWVxIDE1MyB8fCB0ZXN0ICRlbmFibGVfc3RhdGljX2Jvb3N0ID0geWVzICYmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWdlIDE1NDsgdGhlbgorICBCT09TVF9DT1JPVVRJTkVfTElCUz0iJEJPT1NUX0NPUk9VVElORV9MSUJTICRCT09TVF9DT05URVhUX0xJQlMiCisgIEJPT1NUX0NPUk9VVElORV9MREZMQUdTPSIkQk9PU1RfQ09ST1VUSU5FX0xERkxBR1MgJEJPT1NUX0NPTlRFWFRfTERGTEFHUyIKK2ZpCitpZiB0ZXN0ICRlbmFibGVfc3RhdGljX2Jvb3N0ID0geWVzICYmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWdlIDE1NTsgdGhlbgorICBCT09TVF9DT1JPVVRJTkVfTElCUz0iJEJPT1NUX0NPUk9VVElORV9MSUJTICRCT09TVF9TWVNURU1fTElCUyIKKyAgQk9PU1RfQ09ST1VUSU5FX0xERkxBR1M9IiRCT09TVF9DT1JPVVRJTkVfTERGTEFHUyAkQk9PU1RfU1lTVEVNX0xERkxBR1MiCitmaQorTElCUz0kYm9vc3RfY29yb3V0aW5lX3NhdmVfTElCUworTERGTEFHUz0kYm9vc3RfY29yb3V0aW5lX3NhdmVfTERGTEFHUworXSkjIEJPT1NUX0NPUk9VVElORQorCisKKyMgQk9PU1RfQ1JDKCkKKyMgLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuQ1JDCitCT09TVF9ERUZVTihbQ1JDXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvY3JjLmhwcF0pCitdKSMgQk9PU1RfQ1JDCisKKworIyBCT09TVF9EQVRFX1RJTUUoW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5EYXRlX1RpbWUuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW0RhdGVfVGltZV0sCitbQk9PU1RfRklORF9MSUIoW2RhdGVfdGltZV0sIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L2RhdGVfdGltZS9wb3NpeF90aW1lL3Bvc2l4X3RpbWUuaHBwXSwKKyAgICAgICAgICAgICAgICBbYm9vc3Q6OnBvc2l4X3RpbWU6OnB0aW1lIHQ7XSkKK10pIyBCT09TVF9EQVRFX1RJTUUKKworCisjIEJPT1NUX0ZJTEVTWVNURU0oW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuRmlsZXN5c3RlbS4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUKKyMgdGhlIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCisjIERvIG5vdCBjaGVjayBmb3IgYm9vc3QvZmlsZXN5c3RlbS5ocHAgYmVjYXVzZSB0aGlzIGZpbGUgd2FzIGludHJvZHVjZWQgaW4KKyMgMS4zNC4KK0JPT1NUX0RFRlVOKFtGaWxlc3lzdGVtXSwKK1sjIERvIHdlIGhhdmUgdG8gY2hlY2sgZm9yIEJvb3N0LlN5c3RlbT8gIFRoaXMgbGluay10aW1lIGRlcGVuZGVuY3kgd2FzCisjIGFkZGVkIGFzIG9mIDEuMzUuMC4gIElmIHdlIGhhdmUgYSB2ZXJzaW9uIDwxLjM1LCB3ZSBtdXN0IG5vdCBhdHRlbXB0IHRvCisjIGZpbmQgQm9vc3QuU3lzdGVtIGFzIGl0IGRpZG4ndCBleGlzdCBieSB0aGVuLgoraWYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtZ2UgMTM1OyB0aGVuCisgIEJPT1NUX1NZU1RFTShbJDFdKQorZmkgIyBlbmQgb2YgdGhlIEJvb3N0LlN5c3RlbSBjaGVjay4KK2Jvb3N0X2ZpbGVzeXN0ZW1fc2F2ZV9MSUJTPSRMSUJTCitib29zdF9maWxlc3lzdGVtX3NhdmVfTERGTEFHUz0kTERGTEFHUworbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX1NZU1RFTV8oTElCU3xMREZMQUdTKSRdKWRubAorTElCUz0iJExJQlMgJEJPT1NUX1NZU1RFTV9MSUJTIgorTERGTEFHUz0iJExERkxBR1MgJEJPT1NUX1NZU1RFTV9MREZMQUdTIgorQk9PU1RfRklORF9MSUIoW2ZpbGVzeXN0ZW1dLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9maWxlc3lzdGVtL3BhdGguaHBwXSwgW2Jvb3N0OjpmaWxlc3lzdGVtOjpwYXRoIHA7XSkKK2lmIHRlc3QgJGVuYWJsZV9zdGF0aWNfYm9vc3QgPSB5ZXMgJiYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtZ2UgMTM1OyB0aGVuCisgIEJPT1NUX0ZJTEVTWVNURU1fTElCUz0iJEJPT1NUX0ZJTEVTWVNURU1fTElCUyAkQk9PU1RfU1lTVEVNX0xJQlMiCitmaQorTElCUz0kYm9vc3RfZmlsZXN5c3RlbV9zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X2ZpbGVzeXN0ZW1fc2F2ZV9MREZMQUdTCitdKSMgQk9PU1RfRklMRVNZU1RFTQorCisKKyMgQk9PU1RfRkxZV0VJR0hUKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuRmx5d2VpZ2h0LgorQk9PU1RfREVGVU4oW0ZseXdlaWdodF0sCitbZG5sIFRoZXJlJ3MgYSBoaWRkZW4gZGVwZW5kZW5jeSBvbiBwdGhyZWFkcy4KK0FDX1JFUVVJUkUoW19CT09TVF9QVEhSRUFEX0ZMQUddKWRubAorQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L2ZseXdlaWdodC5ocHBdKQorQUNfU1VCU1QoW0JPT1NUX0ZMWVdFSUdIVF9MSUJTXSwgWyRib29zdF9jdl9wdGhyZWFkX2ZsYWddKQorXSkKKworCisjIEJPT1NUX0ZPUkVBQ0goKQorIyAtLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuRm9yZWFjaC4KK0JPT1NUX0RFRlVOKFtGb3JlYWNoXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvZm9yZWFjaC5ocHBdKV0pCisKKworIyBCT09TVF9GT1JNQVQoKQorIyAtLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5Gb3JtYXQuCisjIE5vdGU6IHdlIGNhbid0IGNoZWNrIGZvciBib29zdC9mb3JtYXQvZm9ybWF0X2Z3ZC5ocHAgYmVjYXVzZSB0aGUgaGVhZGVyIGlzbid0CisjIHN0YW5kYWxvbmUuICBJdCBjYW4ndCBiZSBjb21waWxlZCBiZWNhdXNlIGl0IHRyaWdnZXJzIHRoZSBmb2xsb3dpbmcgZXJyb3I6CisjIGJvb3N0L2Zvcm1hdC9kZXRhaWwvY29uZmlnX21hY3Jvcy5ocHA6ODg6IGVycm9yOiAnbG9jYWxlJyBpbiBuYW1lc3BhY2UgJ3N0ZCcKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZXMgbm90IG5hbWUgYSB0eXBlCitCT09TVF9ERUZVTihbRm9ybWF0XSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvZm9ybWF0LmhwcF0pXSkKKworCisjIEJPT1NUX0ZVTkNUSU9OKCkKKyMgLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5GdW5jdGlvbgorQk9PU1RfREVGVU4oW0Z1bmN0aW9uXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvZnVuY3Rpb24uaHBwXSldKQorCisKKyMgQk9PU1RfR0VPTUVUUlkoKQorIyAtLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0Lkdlb21ldHJ5IChuZXcgc2luY2UgMS40Ny4wKS4KK0JPT1NUX0RFRlVOKFtHZW9tZXRyeV0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L2dlb21ldHJ5LmhwcF0pCitdKSMgQk9PU1RfR0VPTUVUUlkKKworCisjIEJPT1NUX0dSQVBIKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5HcmFwaHMuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW0dyYXBoXSwKK1tib29zdF9ncmFwaF9zYXZlX0xJQlM9JExJQlMKK2Jvb3N0X2dyYXBoX3NhdmVfTERGTEFHUz0kTERGTEFHUworIyBMaW5rLXRpbWUgZGVwZW5kZW5jeSBmcm9tIGdyYXBoIHRvIHJlZ2V4IHdhcyBhZGRlZCBhcyBvZiAxLjQwLjAuCitpZiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxNDA7IHRoZW4KKyAgQk9PU1RfUkVHRVgoWyQxXSkKKyAgbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX1JFR0VYXyhMSUJTfExERkxBR1MpJF0pZG5sCisgIExJQlM9IiRMSUJTICRCT09TVF9SRUdFWF9MSUJTIgorICBMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfUkVHRVhfTERGTEFHUyIKK2ZpCitCT09TVF9GSU5EX0xJQihbZ3JhcGhdLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9ncmFwaC9hZGphY2VuY3lfbGlzdC5ocHBdLCBbYm9vc3Q6OmFkamFjZW5jeV9saXN0PD4gZztdKQorTElCUz0kYm9vc3RfZ3JhcGhfc2F2ZV9MSUJTCitMREZMQUdTPSRib29zdF9ncmFwaF9zYXZlX0xERkxBR1MKK10pIyBCT09TVF9HUkFQSAorCisKKyMgQk9PU1RfSU9TVFJFQU1TKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuSU9TdHJlYW1zLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsIHNlZSB0aGUKKyMgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4KK0JPT1NUX0RFRlVOKFtJT1N0cmVhbXNdLAorW0JPT1NUX0ZJTkRfTElCKFtpb3N0cmVhbXNdLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9pb3N0cmVhbXMvZGV2aWNlL2ZpbGVfZGVzY3JpcHRvci5ocHBdLAorICAgICAgICAgICAgICAgIFtib29zdDo6aW9zdHJlYW1zOjpmaWxlX2Rlc2NyaXB0b3IgZmQ7IGZkLmNsb3NlKCk7XSkKK10pIyBCT09TVF9JT1NUUkVBTVMKKworCisjIEJPT1NUX0hBU0goKQorIyAtLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuRnVuY3Rpb25hbC9IYXNoCitCT09TVF9ERUZVTihbSGFzaF0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L2Z1bmN0aW9uYWwvaGFzaC5ocHBdKV0pCisKKworIyBCT09TVF9MQU1CREEoKQorIyAtLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5MYW1iZGEKK0JPT1NUX0RFRlVOKFtMYW1iZGFdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9sYW1iZGEvbGFtYmRhLmhwcF0pXSkKKworCisjIEJPT1NUX0xPQ0FMRSgpCisjIC0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkxvY2FsZQorQk9PU1RfREVGVU4oW0xvY2FsZV0sCitbCitib29zdF9sb2NhbGVfc2F2ZV9MSUJTPSRMSUJTCitib29zdF9sb2NhbGVfc2F2ZV9MREZMQUdTPSRMREZMQUdTCisjIHJlcXVpcmUgU1lTVEVNIGZvciBib29zdC0xLjUwLjAgYW5kIHVwCitpZiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxNTA7IHRoZW4KKyAgQk9PU1RfU1lTVEVNKFskMV0pCisgIG00X3BhdHRlcm5fYWxsb3coW15CT09TVF9TWVNURU1fKExJQlN8TERGTEFHUykkXSlkbmwKKyAgTElCUz0iJExJQlMgJEJPT1NUX1NZU1RFTV9MSUJTIgorICBMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfU1lTVEVNX0xERkxBR1MiCitmaSAjIGVuZCBvZiB0aGUgQm9vc3QuU3lzdGVtIGNoZWNrLgorQk9PU1RfRklORF9MSUIoW2xvY2FsZV0sIFskMV0sCisgICAgW2Jvb3N0L2xvY2FsZS5ocHBdLAorICAgIFtbYm9vc3Q6OmxvY2FsZTo6Z2VuZXJhdG9yIGdlbjsgc3RkOjpsb2NhbGU6Omdsb2JhbChnZW4oIiIpKTtdXSkKK0xJQlM9JGJvb3N0X2xvY2FsZV9zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X2xvY2FsZV9zYXZlX0xERkxBR1MKK10pIyBCT09TVF9MT0NBTEUKKworIyBCT09TVF9MT0coW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5Mb2cuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW0xvZ10sCitbYm9vc3RfbG9nX3NhdmVfTElCUz0kTElCUworYm9vc3RfbG9nX3NhdmVfTERGTEFHUz0kTERGTEFHUworQk9PU1RfU1lTVEVNKFskMV0pCitCT09TVF9GSUxFU1lTVEVNKFskMV0pCitCT09TVF9EQVRFX1RJTUUoWyQxXSkKK200X3BhdHRlcm5fYWxsb3coW15CT09TVF8oU1lTVEVNfEZJTEVTWVNURU18REFURV9USU1FKV8oTElCU3xMREZMQUdTKSRdKWRubAorTElCUz0iJExJQlMgJEJPT1NUX0RBVEVfVElNRV9MSUJTICRCT09TVF9GSUxFU1lTVEVNX0xJQlMgJEJPT1NUX1NZU1RFTV9MSUJTIgorTERGTEFHUz0iJExERkxBR1MgJEJPT1NUX0RBVEVfVElNRV9MREZMQUdTICRCT09TVF9GSUxFU1lTVEVNX0xERkxBR1MgJEJPT1NUX1NZU1RFTV9MREZMQUdTIgorQk9PU1RfRklORF9MSUIoW2xvZ10sIFskMV0sCisgICAgW2Jvb3N0L2xvZy9jb3JlL2NvcmUuaHBwXSwKKyAgICBbYm9vc3Q6OmxvZzo6YXR0cmlidXRlIGE7IGEuZ2V0X3ZhbHVlKCk7XSkKK0xJQlM9JGJvb3N0X2xvZ19zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X2xvZ19zYXZlX0xERkxBR1MKK10pIyBCT09TVF9MT0cKKworCisjIEJPT1NUX0xPR19TRVRVUChbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkxvZy4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbTG9nX1NldHVwXSwKK1tib29zdF9sb2dfc2V0dXBfc2F2ZV9MSUJTPSRMSUJTCitib29zdF9sb2dfc2V0dXBfc2F2ZV9MREZMQUdTPSRMREZMQUdTCitCT09TVF9MT0coWyQxXSkKK200X3BhdHRlcm5fYWxsb3coW15CT09TVF9MT0dfKExJQlN8TERGTEFHUykkXSlkbmwKK0xJQlM9IiRMSUJTICRCT09TVF9MT0dfTElCUyIKK0xERkxBR1M9IiRMREZMQUdTICRCT09TVF9MT0dfTERGTEFHUyIKK0JPT1NUX0ZJTkRfTElCKFtsb2dfc2V0dXBdLCBbJDFdLAorICAgIFtib29zdC9sb2cvdXRpbGl0eS9zZXR1cC9mcm9tX3NldHRpbmdzLmhwcF0sCisgICAgW2Jvb3N0Ojpsb2c6OmJhc2ljX3NldHRpbmdzPGNoYXI+IGJzOyBicy5lbXB0eSgpO10pCitMSUJTPSRib29zdF9sb2dfc2V0dXBfc2F2ZV9MSUJTCitMREZMQUdTPSRib29zdF9sb2dfc2V0dXBfc2F2ZV9MREZMQUdTCitdKSMgQk9PU1RfTE9HX1NFVFVQCisKKworIyBCT09TVF9NQVRIKCkKKyMgLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0Lk1hdGgKKyMgVE9ETzogVGhpcyBsaWJyYXJ5IGlzbid0IGhlYWRlci1vbmx5IGJ1dCBpdCBjb21lcyBpbiBtdWx0aXBsZSBkaWZmZXJlbnQKKyMgZmxhdm9ycyB0aGF0IGRvbid0IHBsYXkgd2VsbCB3aXRoIEJPT1NUX0ZJTkRfTElCIChlLmcsIGxpYmJvb3N0X21hdGhfYzk5LAorIyBsaWJib29zdF9tYXRoX2M5OWYsIGxpYmJvb3N0X21hdGhfYzk5bCwgbGliYm9vc3RfbWF0aF90cjEsCisjIGxpYmJvb3N0X21hdGhfdHIxZiwgbGliYm9vc3RfbWF0aF90cjFsKS4gIFRoaXMgbWFjcm8gbXVzdCBiZSBmaXhlZCB0byBkbyB0aGUKKyMgcmlnaHQgdGhpbmcgYW55d2F5LgorQk9PU1RfREVGVU4oW01hdGhdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9tYXRoL3NwZWNpYWxfZnVuY3Rpb25zLmhwcF0pXSkKKworCisjIEJPT1NUX01QSShbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QgTVBJLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsIHNlZSB0aGUKKyMgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4gIFVzZXMgTVBJQ1hYIHZhcmlhYmxlIGlmIGl0IGlzCisjIHNldCwgb3RoZXJ3aXNlIHRyaWVzIENYWAorIworQk9PU1RfREVGVU4oW01QSV0sCitbYm9vc3Rfc2F2ZV9DWFg9JHtDWFh9Citib29zdF9zYXZlX0NYWENQUD0ke0NYWENQUH0KK2lmIHRlc3QgeCIke01QSUNYWH0iICE9IHg7IHRoZW4KKyAgQ1hYPSR7TVBJQ1hYfQorICBDWFhDUFA9IiR7TVBJQ1hYfSAtRSIKK2ZpCitCT09TVF9GSU5EX0xJQihbbXBpXSwgWyQxXSwKKyAgICAgICAgICAgICAgIFtib29zdC9tcGkuaHBwXSwKKyAgICAgICAgICAgICAgIFtpbnQgYXJnYyA9IDA7CisgICAgICAgICAgICAgICAgY2hhciAqKmFyZ3YgPSAwOworICAgICAgICAgICAgICAgIGJvb3N0OjptcGk6OmVudmlyb25tZW50IGVudihhcmdjLGFyZ3YpO10pCitDWFg9JHtib29zdF9zYXZlX0NYWH0KK0NYWENQUD0ke2Jvb3N0X3NhdmVfQ1hYQ1BQfQorXSkjIEJPT1NUX01QSQorCisKKyMgQk9PU1RfTVVMVElBUlJBWSgpCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5NdWx0aUFycmF5CitCT09TVF9ERUZVTihbTXVsdGlBcnJheV0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L211bHRpX2FycmF5LmhwcF0pXSkKKworCisjIEJPT1NUX05VTUVSSUNfVUJMQVMoKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5OdW1lcmljVWJsYXMgKEJhc2ljIExpbmVhciBBbGdlYnJhKQorQk9PU1RfREVGVU4oW051bWVyaWNfVWJsYXNdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9udW1lcmljL3VibGFzL3ZlY3Rvci5ocHBdKQorXSkjIEJPT1NUX05VTUVSSUNfVUJMQVMKKworCisjIEJPT1NUX05VTUVSSUNfQ09OVkVSU0lPTigpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0Lk51bWVyaWNDb252ZXJzaW9uIChwb2xpY3ktYmFzZWQgbnVtZXJpYyBjb252ZXJzaW9uKQorQk9PU1RfREVGVU4oW051bWVyaWNfQ29udmVyc2lvbl0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L251bWVyaWMvY29udmVyc2lvbi9jb252ZXJ0ZXIuaHBwXSkKK10pIyBCT09TVF9OVU1FUklDX0NPTlZFUlNJT04KKworCisjIEJPT1NUX09QVElPTkFMKCkKKyMgLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5PcHRpb25hbAorQk9PU1RfREVGVU4oW09wdGlvbmFsXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3Qvb3B0aW9uYWwuaHBwXSldKQorCisKKyMgQk9PU1RfUFJFUFJPQ0VTU09SKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuUHJlcHJvY2Vzc29yCitCT09TVF9ERUZVTihbUHJlcHJvY2Vzc29yXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvcHJlcHJvY2Vzc29yL3JlcGVhdC5ocHBdKV0pCisKKworIyBCT09TVF9SQU5HRSgpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlJhbmdlCitCT09TVF9ERUZVTihbUmFuZ2VdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9yYW5nZS9hZGFwdG9ycy5ocHBdKV0pCisKKyMgQk9PU1RfVU5PUkRFUkVEKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuVW5vcmRlcmVkCitCT09TVF9ERUZVTihbVW5vcmRlcmVkXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvdW5vcmRlcmVkX21hcC5ocHBdKV0pCisKKworIyBCT09TVF9VVUlEKCkKKyMgLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlV1aWQKK0JPT1NUX0RFRlVOKFtVdWlkXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvdXVpZC91dWlkLmhwcF0pXSkKKworCisjIEJPT1NUX1BST0dSQU1fT1BUSU9OUyhbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlByb2dyYW1fb3B0aW9ucy4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULAorIyBzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbUHJvZ3JhbV9PcHRpb25zXSwKK1tCT09TVF9GSU5EX0xJQihbcHJvZ3JhbV9vcHRpb25zXSwgWyQxXSwKKyAgICAgICAgICAgICAgICBbYm9vc3QvcHJvZ3JhbV9vcHRpb25zLmhwcF0sCisgICAgICAgICAgICAgICAgW2Jvb3N0Ojpwcm9ncmFtX29wdGlvbnM6Om9wdGlvbnNfZGVzY3JpcHRpb24gZCgidGVzdCIpO10pCitdKSMgQk9PU1RfUFJPR1JBTV9PUFRJT05TCisKKworCisjIF9CT09TVF9QWVRIT05fQ09ORklHKFZBUklBQkxFLCBGTEFHKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2F2ZSBWQVJJQUJMRSwgYW5kIGRlZmluZSBpdCB2aWEgYHB5dGhvbi1jb25maWcgLS1GTEFHYC4KKyMgU3Vic3RpdHV0ZSBCT09TVF9QWVRIT05fVkFSSUFCTEUuCittNF9kZWZpbmUoW19CT09TVF9QWVRIT05fQ09ORklHXSwKK1tBQ19TVUJTVChbQk9PU1RfUFlUSE9OXyQxXSwKKyAgICAgICAgICBbYHB5dGhvbi1jb25maWcgLS0kMiAyPi9kZXYvbnVsbGBdKWRubAorYm9vc3RfcHl0aG9uX3NhdmVfJDE9JCQxCiskMT0iJCQxICRCT09TVF9QWVRIT05fJDEiXSkKKworCisjIEJPT1NUX1BZVEhPTihbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlB5dGhvbi4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULAorIyBzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbUHl0aG9uXSwKK1tfQk9PU1RfUFlUSE9OX0NPTkZJRyhbQ1BQRkxBR1NdLCBbaW5jbHVkZXNdKQorX0JPT1NUX1BZVEhPTl9DT05GSUcoW0xERkxBR1NdLCAgIFtsZGZsYWdzXSkKK19CT09TVF9QWVRIT05fQ09ORklHKFtMSUJTXSwgICAgICBbbGlic10pCittNF9wYXR0ZXJuX2FsbG93KFteQk9PU1RfUFlUSE9OX01PRFVMRSRdKWRubAorQk9PU1RfRklORF9MSUJTKFtweXRob25dLCBbcHl0aG9uIHB5dGhvbjNdLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9weXRob24uaHBwXSwKKyAgICAgICAgICAgICAgICBbXSwgW0JPT1NUX1BZVEhPTl9NT0RVTEUoZW1wdHkpIHt9XSkKK0NQUEZMQUdTPSRib29zdF9weXRob25fc2F2ZV9DUFBGTEFHUworTERGTEFHUz0kYm9vc3RfcHl0aG9uX3NhdmVfTERGTEFHUworTElCUz0kYm9vc3RfcHl0aG9uX3NhdmVfTElCUworXSkjIEJPT1NUX1BZVEhPTgorCisKKyMgQk9PU1RfUkVGKCkKKyMgLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuUmVmCitCT09TVF9ERUZVTihbUmVmXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvcmVmLmhwcF0pXSkKKworCisjIEJPT1NUX1JFR0VYKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5SZWdleC4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbUmVnZXhdLAorW0JPT1NUX0ZJTkRfTElCKFtyZWdleF0sIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L3JlZ2V4LmhwcF0sCisgICAgICAgICAgICAgICAgW2Jvb3N0OjpyZWdleCBleHAoIioiKTsgYm9vc3Q6OnJlZ2V4X21hdGNoKCJmb28iLCBleHApO10pCitdKSMgQk9PU1RfUkVHRVgKKworCisjIEJPT1NUX1NFUklBTElaQVRJT04oW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuU2VyaWFsaXphdGlvbi4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUKKyMgdGhlIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbU2VyaWFsaXphdGlvbl0sCitbQk9PU1RfRklORF9MSUIoW3NlcmlhbGl6YXRpb25dLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9hcmNoaXZlL3RleHRfb2FyY2hpdmUuaHBwXSwKKyAgICAgICAgICAgICAgICBbc3RkOjpvc3RyZWFtKiBvID0gMDsgLy8gQ2hlYXAgd2F5IHRvIGdldCBhbiBvc3RyZWFtLi4uCisgICAgICAgICAgICAgICAgYm9vc3Q6OmFyY2hpdmU6OnRleHRfb2FyY2hpdmUgdCgqbyk7XSkKK10pIyBCT09TVF9TRVJJQUxJWkFUSU9OCisKKworIyBCT09TVF9TSUdOQUxTKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlNpZ25hbHMuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW1NpZ25hbHNdLAorW0JPT1NUX0ZJTkRfTElCKFtzaWduYWxzXSwgWyQxXSwKKyAgICAgICAgICAgICAgICBbYm9vc3Qvc2lnbmFsLmhwcF0sCisgICAgICAgICAgICAgICAgW2Jvb3N0OjpzaWduYWw8dm9pZCAoKT4gcztdKQorXSkjIEJPT1NUX1NJR05BTFMKKworCisjIEJPT1NUX1NJR05BTFMyKCkKKyMgLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5TaWduYWxzMiAobmV3IHNpbmNlIDEuMzkuMCkuCitCT09TVF9ERUZVTihbU2lnbmFsczJdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9zaWduYWxzMi5ocHBdKQorXSkjIEJPT1NUX1NJR05BTFMyCisKKworIyBCT09TVF9TTUFSVF9QVFIoKQorIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5TbWFydFB0cgorQk9PU1RfREVGVU4oW1NtYXJ0X1B0cl0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3Njb3BlZF9wdHIuaHBwXSkKK0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9zaGFyZWRfcHRyLmhwcF0pCitdKQorCisKKyMgQk9PU1RfU1RBVElDQVNTRVJUKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuU3RhdGljQXNzZXJ0CitCT09TVF9ERUZVTihbU3RhdGljQXNzZXJ0XSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3Qvc3RhdGljX2Fzc2VydC5ocHBdKV0pCisKKworIyBCT09TVF9TVFJJTkdfQUxHTygpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuU3RyaW5nQWxnbworQk9PU1RfREVGVU4oW1N0cmluZ19BbGdvXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvYWxnb3JpdGhtL3N0cmluZy5ocHBdKQorXSkKKworCisjIEJPT1NUX1NZU1RFTShbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlN5c3RlbS4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuICBUaGlzIGxpYnJhcnkgd2FzIGludHJvZHVjZWQgaW4gQm9vc3QKKyMgMS4zNS4wLgorQk9PU1RfREVGVU4oW1N5c3RlbV0sCitbQk9PU1RfRklORF9MSUIoW3N5c3RlbV0sIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L3N5c3RlbS9lcnJvcl9jb2RlLmhwcF0sCisgICAgICAgICAgICAgICAgW2Jvb3N0OjpzeXN0ZW06OmVycm9yX2NvZGUgZTsgZS5jbGVhcigpO10pCitdKSMgQk9PU1RfU1lTVEVNCisKKworIyBCT09TVF9URVNUKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlRlc3QuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW1Rlc3RdLAorW200X3BhdHRlcm5fYWxsb3coW15CT09TVF9DSEVDSyRdKWRubAorQk9PU1RfRklORF9MSUIoW3VuaXRfdGVzdF9mcmFtZXdvcmtdLCBbJDFdLAorICAgICAgICAgICAgICAgW2Jvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcF0sIFtCT09TVF9DSEVDSygyID09IDIpO10sCisgICAgICAgICAgICAgICBbdXNpbmcgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZTsKKyAgICAgICAgICAgICAgIHRlc3Rfc3VpdGUqIGluaXRfdW5pdF90ZXN0X3N1aXRlKGludCBhcmdjLCBjaGFyICoqIGFyZ3YpCisgICAgICAgICAgICAgICB7IHJldHVybiBOVUxMOyB9XSkKK10pIyBCT09TVF9URVNUCisKKworIyBCT09TVF9USFJFQUQoW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuVGhyZWFkLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsIHNlZSB0aGUKKyMgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4KK0JPT1NUX0RFRlVOKFtUaHJlYWRdLAorW2RubCBIYXZpbmcgdGhlIHB0aHJlYWQgZmxhZyBpcyByZXF1aXJlZCBhdCBsZWFzdCBvbiBHQ0MzIHdoZXJlCitkbmwgYm9vc3QvdGhyZWFkLmhwcCB3b3VsZCBjb21wbGFpbiBpZiB3ZSB0cnkgdG8gY29tcGlsZSB3aXRob3V0CitkbmwgLXB0aHJlYWQgb24gR05VL0xpbnV4LgorQUNfUkVRVUlSRShbX0JPT1NUX1BUSFJFQURfRkxBR10pZG5sCitib29zdF90aHJlYWRfc2F2ZV9MSUJTPSRMSUJTCitib29zdF90aHJlYWRfc2F2ZV9MREZMQUdTPSRMREZMQUdTCitib29zdF90aHJlYWRfc2F2ZV9DUFBGTEFHUz0kQ1BQRkxBR1MKKyMgTGluay10aW1lIGRlcGVuZGVuY3kgZnJvbSB0aHJlYWQgdG8gc3lzdGVtIHdhcyBhZGRlZCBhcyBvZiAxLjQ5LjAuCitpZiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxNDk7IHRoZW4KK0JPT1NUX1NZU1RFTShbJDFdKQorZmkgIyBlbmQgb2YgdGhlIEJvb3N0LlN5c3RlbSBjaGVjay4KK200X3BhdHRlcm5fYWxsb3coW15CT09TVF9TWVNURU1fKExJQlN8TERGTEFHUykkXSlkbmwKK0xJQlM9IiRMSUJTICRCT09TVF9TWVNURU1fTElCUyAkYm9vc3RfY3ZfcHRocmVhZF9mbGFnIgorTERGTEFHUz0iJExERkxBR1MgJEJPT1NUX1NZU1RFTV9MREZMQUdTIgorQ1BQRkxBR1M9IiRDUFBGTEFHUyAkYm9vc3RfY3ZfcHRocmVhZF9mbGFnIgorCisjIFdoZW4gY29tcGlsaW5nIGZvciB0aGUgV2luZG93cyBwbGF0Zm9ybSwgdGhlIHRocmVhZHMgbGlicmFyeSBpcyBuYW1lZAorIyBkaWZmZXJlbnRseS4gIFRoaXMgc3VmZml4IGRvZXNuJ3QgZXhpc3QgaW4gbmV3IHZlcnNpb25zIG9mIEJvb3N0LCBvcgorIyBwb3NzaWJseSBuZXcgdmVyc2lvbnMgb2YgR0NDIG9uIG1pbmd3IEkgYW0gYXNzdW1pbmcgaXQncyBCb29zdCdzIGNoYW5nZSBmb3IKKyMgbm93IGFuZCBJIGFtIHNldHRpbmcgdmVyc2lvbiB0byAxLjQ4LCBmb3IgbGFjayBvZiBrbm93bGVkZ2UgYXMgdG8gd2hlbiB0aGlzCisjIGNoYW5nZSBvY2N1cnJlZC4KK2lmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWx0IDE0ODsgdGhlbgorICBjYXNlICRob3N0X29zIGluCisgICAgKCptaW5ndyopIGJvb3N0X3RocmVhZF9saWJfZXh0PV93aW4zMjs7CisgIGVzYWMKK2ZpCitCT09TVF9GSU5EX0xJQlMoW3RocmVhZF0sIFt0aHJlYWQkYm9vc3RfdGhyZWFkX2xpYl9leHRdLAorICAgICAgICAgICAgICAgIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L3RocmVhZC5ocHBdLCBbYm9vc3Q6OnRocmVhZCB0OyBib29zdDo6bXV0ZXggbTtdKQorCitjYXNlICRob3N0X29zIGluCisgICgqbWluZ3cqKSBib29zdF90aHJlYWRfdzMyX3NvY2tldF9saW5rPS1sd3MyXzMyOzsKK2VzYWMKKworQk9PU1RfVEhSRUFEX0xJQlM9IiRCT09TVF9USFJFQURfTElCUyAkQk9PU1RfU1lTVEVNX0xJQlMgJGJvb3N0X2N2X3B0aHJlYWRfZmxhZyAkYm9vc3RfdGhyZWFkX3czMl9zb2NrZXRfbGluayIKK0JPT1NUX1RIUkVBRF9MREZMQUdTPSIkQk9PU1RfU1lTVEVNX0xERkxBR1MiCitCT09TVF9DUFBGTEFHUz0iJEJPT1NUX0NQUEZMQUdTICRib29zdF9jdl9wdGhyZWFkX2ZsYWciCitMSUJTPSRib29zdF90aHJlYWRfc2F2ZV9MSUJTCitMREZMQUdTPSRib29zdF90aHJlYWRfc2F2ZV9MREZMQUdTCitDUFBGTEFHUz0kYm9vc3RfdGhyZWFkX3NhdmVfQ1BQRkxBR1MKK10pIyBCT09TVF9USFJFQUQKKworQVVfQUxJQVMoW0JPT1NUX1RIUkVBRFNdLCBbQk9PU1RfVEhSRUFEXSkKKworCisjIEJPT1NUX1RPS0VOSVpFUigpCisjIC0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlRva2VuaXplcgorQk9PU1RfREVGVU4oW1Rva2VuaXplcl0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3Rva2VuaXplci5ocHBdKV0pCisKKworIyBCT09TVF9UUklCT09MKCkKKyMgLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlRyaWJvb2wKK0JPT1NUX0RFRlVOKFtUcmlib29sXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvbG9naWMvdHJpYm9vbF9md2QuaHBwXSkKK0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9sb2dpYy90cmlib29sLmhwcF0pCitdKQorCisKKyMgQk9PU1RfVFVQTEUoKQorIyAtLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlR1cGxlCitCT09TVF9ERUZVTihbVHVwbGVdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC90dXBsZS90dXBsZS5ocHBdKV0pCisKKworIyBCT09TVF9UWVBFVFJBSVRTKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuVHlwZVRyYWl0cworQk9PU1RfREVGVU4oW1R5cGVUcmFpdHNdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC90eXBlX3RyYWl0cy5ocHBdKV0pCisKKworIyBCT09TVF9VVElMSVRZKCkKKyMgLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlV0aWxpdHkgKG5vbmNvcHlhYmxlLCByZXN1bHRfb2YsIGJhc2UtZnJvbS1tZW1iZXIgaWRpb20sCisjIGV0Yy4pCitCT09TVF9ERUZVTihbVXRpbGl0eV0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3V0aWxpdHkuaHBwXSldKQorCisKKyMgQk9PU1RfVkFSSUFOVCgpCisjIC0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5WYXJpYW50LgorQk9PU1RfREVGVU4oW1ZhcmlhbnRdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC92YXJpYW50L3ZhcmlhbnRfZndkLmhwcF0pCitCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvdmFyaWFudC5ocHBdKV0pCisKKworIyBCT09TVF9QT0lOVEVSX0NPTlRBSU5FUigpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5Qb2ludGVyQ29udGFpbmVyCitCT09TVF9ERUZVTihbUG9pbnRlcl9Db250YWluZXJdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9wdHJfY29udGFpbmVyL3B0cl9kZXF1ZS5ocHBdKQorQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3B0cl9jb250YWluZXIvcHRyX2xpc3QuaHBwXSkKK0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9wdHJfY29udGFpbmVyL3B0cl92ZWN0b3IuaHBwXSkKK0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9wdHJfY29udGFpbmVyL3B0cl9hcnJheS5ocHBdKQorQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3B0cl9jb250YWluZXIvcHRyX3NldC5ocHBdKQorQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3B0cl9jb250YWluZXIvcHRyX21hcC5ocHBdKQorXSkjIEJPT1NUX1BPSU5URVJfQ09OVEFJTkVSCisKKworIyBCT09TVF9XQVZFKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE5PVEU6IElmIHlvdSBpbnRlbmQgdG8gdXNlIFdhdmUvU3Bpcml0IHdpdGggdGhyZWFkIHN1cHBvcnQsIG1ha2Ugc3VyZSB5b3UKKyMgY2FsbCBCT09TVF9USFJFQUQgZmlyc3QuCisjIExvb2sgZm9yIEJvb3N0LldhdmUuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW1dhdmVdLAorW0FDX1JFUVVJUkUoW0JPT1NUX0ZJTEVTWVNURU1dKWRubAorQUNfUkVRVUlSRShbQk9PU1RfREFURV9USU1FXSlkbmwKK2Jvb3N0X3dhdmVfc2F2ZV9MSUJTPSRMSUJTCitib29zdF93YXZlX3NhdmVfTERGTEFHUz0kTERGTEFHUworbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUXygoRklMRSk/U1lTVEVNfERBVEVfVElNRXxUSFJFQUQpXyhMSUJTfExERkxBR1MpJF0pZG5sCitMSUJTPSIkTElCUyAkQk9PU1RfU1lTVEVNX0xJQlMgJEJPT1NUX0ZJTEVTWVNURU1fTElCUyAkQk9PU1RfREFURV9USU1FX0xJQlMgXAorJEJPT1NUX1RIUkVBRF9MSUJTIgorTERGTEFHUz0iJExERkxBR1MgJEJPT1NUX1NZU1RFTV9MREZMQUdTICRCT09TVF9GSUxFU1lTVEVNX0xERkxBR1MgXAorJEJPT1NUX0RBVEVfVElNRV9MREZMQUdTICRCT09TVF9USFJFQURfTERGTEFHUyIKK0JPT1NUX0ZJTkRfTElCKFt3YXZlXSwgWyQxXSwKKyAgICAgICAgICAgICAgICBbYm9vc3Qvd2F2ZS5ocHBdLAorICAgICAgICAgICAgICAgIFtib29zdDo6d2F2ZTo6dG9rZW5faWQgaWQ7IGdldF90b2tlbl9uYW1lKGlkKTtdKQorTElCUz0kYm9vc3Rfd2F2ZV9zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X3dhdmVfc2F2ZV9MREZMQUdTCitdKSMgQk9PU1RfV0FWRQorCisKKyMgQk9PU1RfWFBSRVNTSVZFKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuWHByZXNzaXZlIChuZXcgc2luY2UgMS4zNi4wKS4KK0JPT1NUX0RFRlVOKFtYcHJlc3NpdmVdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC94cHJlc3NpdmUveHByZXNzaXZlLmhwcF0pXSkKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tICMKKyMgSW50ZXJuYWwgaGVscGVycy4gIworIyAtLS0tLS0tLS0tLS0tLS0tLSAjCisKKworIyBfQk9PU1RfUFRIUkVBRF9GTEFHKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEludGVybmFsIGhlbHBlciBmb3IgQk9PU1RfVEhSRUFELiAgQ29tcHV0ZXMgYm9vc3RfY3ZfcHRocmVhZF9mbGFnCisjIHdoaWNoIG11c3QgYmUgdXNlZCBpbiBDUFBGTEFHUyBhbmQgTElCUy4KKyMKKyMgWWVzLCB3ZSAqbmVlZCogdG8gcHV0IHRoZSAtcHRocmVhZCB0aGluZyBpbiBDUFBGTEFHUyBiZWNhdXNlIHdpdGggR0NDMywKKyMgYm9vc3QvdGhyZWFkLmhwcCB3aWxsIHRyaWdnZXIgYSAjZXJyb3IgaWYgLXB0aHJlYWQgaXNuJ3QgdXNlZDoKKyMgICBib29zdC9jb25maWcvcmVxdWlyZXNfdGhyZWFkcy5ocHA6NDc6NTogI2Vycm9yICJDb21waWxlciB0aHJlYWRpbmcgc3VwcG9ydAorIyAgIGlzIG5vdCB0dXJuZWQgb24uIFBsZWFzZSBzZXQgdGhlIGNvcnJlY3QgY29tbWFuZCBsaW5lIG9wdGlvbnMgZm9yCisjICAgdGhyZWFkaW5nOiAtcHRocmVhZCAoTGludXgpLCAtcHRocmVhZHMgKFNvbGFyaXMpIG9yIC1tdGhyZWFkcyAoTWluZ3czMikiCisjCisjIEJhc2VkIG9uIEFDWF9QVEhSRUFEOiBodHRwOi8vYXV0b2NvbmYtYXJjaGl2ZS5jcnlwLnRvL2FjeF9wdGhyZWFkLmh0bWwKK0FDX0RFRlVOKFtfQk9PU1RfUFRIUkVBRF9GTEFHXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0NYWF0pZG5sCitBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCitBQ19MQU5HX1BVU0goW0MrK10pZG5sCitBQ19DQUNIRV9DSEVDSyhbZm9yIHRoZSBmbGFncyBuZWVkZWQgdG8gdXNlIHB0aHJlYWRzXSwgW2Jvb3N0X2N2X3B0aHJlYWRfZmxhZ10sCitbIGJvb3N0X2N2X3B0aHJlYWRfZmxhZz0KKyAgIyBUaGUgb3JkZXJpbmcgKmlzKiAoc29tZXRpbWVzKSBpbXBvcnRhbnQuICBTb21lIG5vdGVzIG9uIHRoZQorICAjIGluZGl2aWR1YWwgaXRlbXMgZm9sbG93OgorICAjIChub25lKTogaW4gY2FzZSB0aHJlYWRzIGFyZSBpbiBsaWJjOyBzaG91bGQgYmUgdHJpZWQgYmVmb3JlIC1LdGhyZWFkIGFuZAorICAjICAgICAgIG90aGVyIGNvbXBpbGVyIGZsYWdzIHRvIHByZXZlbnQgY29udGludWFsIGNvbXBpbGVyIHdhcm5pbmdzCisgICMgLWxwdGhyZWFkczogQUlYIChtdXN0IGNoZWNrIHRoaXMgYmVmb3JlIC1scHRocmVhZCkKKyAgIyAtS3RocmVhZDogU2VxdWVudCAodGhyZWFkcyBpbiBsaWJjLCBidXQgLUt0aHJlYWQgbmVlZGVkIGZvciBwdGhyZWFkLmgpCisgICMgLWt0aHJlYWQ6IEZyZWVCU0Qga2VybmVsIHRocmVhZHMgKHByZWZlcnJlZCB0byAtcHRocmVhZCBzaW5jZSBTTVAtYWJsZSkKKyAgIyAtbGx0aHJlYWQ6IExpbnV4VGhyZWFkcyBwb3J0IG9uIEZyZWVCU0QgKGFsc28gcHJlZmVycmVkIHRvIC1wdGhyZWFkKQorICAjIC1wdGhyZWFkOiBHTlUgTGludXgvR0NDIChrZXJuZWwgdGhyZWFkcyksIEJTRC9HQ0MgKHVzZXJsYW5kIHRocmVhZHMpCisgICMgLXB0aHJlYWRzOiBTb2xhcmlzL0dDQworICAjIC1tdGhyZWFkczogTWluR1czMi9HQ0MsIEx5bngvR0NDCisgICMgLW10OiBTdW4gV29ya3Nob3AgQyAobWF5IG9ubHkgbGluayBTdW5PUyB0aHJlYWRzIFstbHRocmVhZF0sIGJ1dCBpdAorICAjICAgICAgZG9lc24ndCBodXJ0IHRvIGNoZWNrIHNpbmNlIHRoaXMgc29tZXRpbWVzIGRlZmluZXMgcHRocmVhZHMgdG9vOworICAjICAgICAgYWxzbyBkZWZpbmVzIC1EX1JFRU5UUkFOVCkKKyAgIyAgICAgIC4uLiAtbXQgaXMgYWxzbyB0aGUgcHRocmVhZHMgZmxhZyBmb3IgSFAvYUNDCisgICMgLWxwdGhyZWFkOiBHTlUgTGludXgsIGV0Yy4KKyAgIyAtLXRocmVhZC1zYWZlOiBLQUkgQysrCisgIGNhc2UgJGhvc3Rfb3MgaW4gIygKKyAgICAqc29sYXJpcyopCisgICAgICAjIE9uIFNvbGFyaXMgKGF0IGxlYXN0LCBmb3Igc29tZSB2ZXJzaW9ucyksIGxpYmMgY29udGFpbnMgc3R1YmJlZAorICAgICAgIyAobm9uLWZ1bmN0aW9uYWwpIHZlcnNpb25zIG9mIHRoZSBwdGhyZWFkcyByb3V0aW5lcywgc28gbGluay1iYXNlZAorICAgICAgIyB0ZXN0cyB3aWxsIGVycm9uZW91c2x5IHN1Y2NlZWQuICAoV2UgbmVlZCB0byBsaW5rIHdpdGggLXB0aHJlYWRzLy1tdC8KKyAgICAgICMgLWxwdGhyZWFkLikgIChUaGUgc3R1YnMgYXJlIG1pc3NpbmcgcHRocmVhZF9jbGVhbnVwX3B1c2gsIG9yIHJhdGhlcgorICAgICAgIyBhIGZ1bmN0aW9uIGNhbGxlZCBieSB0aGlzIG1hY3JvLCBzbyB3ZSBjb3VsZCBjaGVjayBmb3IgdGhhdCwgYnV0CisgICAgICAjIHdobyBrbm93cyB3aGV0aGVyIHRoZXknbGwgc3R1YiB0aGF0IHRvbyBpbiBhIGZ1dHVyZSBsaWJjLikgIFNvLAorICAgICAgIyB3ZSdsbCBqdXN0IGxvb2sgZm9yIC1wdGhyZWFkcyBhbmQgLWxwdGhyZWFkIGZpcnN0OgorICAgICAgYm9vc3RfcHRocmVhZF9mbGFncz0iLXB0aHJlYWRzIC1scHRocmVhZCAtbXQgLXB0aHJlYWQiOzsgIygKKyAgICAqKQorICAgICAgYm9vc3RfcHRocmVhZF9mbGFncz0iLWxwdGhyZWFkcyAtS3RocmVhZCAta3RocmVhZCAtbGx0aHJlYWQgLXB0aHJlYWQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLXB0aHJlYWRzIC1tdGhyZWFkcyAtbHB0aHJlYWQgLS10aHJlYWQtc2FmZSAtbXQiOzsKKyAgZXNhYworICAjIEdlbmVyYXRlIHRoZSB0ZXN0IGZpbGUuCisgIEFDX0xBTkdfQ09ORlRFU1QoW0FDX0xBTkdfUFJPR1JBTShbI2luY2x1ZGUgPHB0aHJlYWQuaD5dLAorICAgIFtwdGhyZWFkX3QgdGg7IHB0aHJlYWRfam9pbih0aCwgMCk7CisgICAgcHRocmVhZF9hdHRyX2luaXQoMCk7IHB0aHJlYWRfY2xlYW51cF9wdXNoKDAsIDApOworICAgIHB0aHJlYWRfY3JlYXRlKDAsMCwwLDApOyBwdGhyZWFkX2NsZWFudXBfcG9wKDApO10pXSkKKyAgZm9yIGJvb3N0X3B0aHJlYWRfZmxhZyBpbiAnJyAkYm9vc3RfcHRocmVhZF9mbGFnczsgZG8KKyAgICBib29zdF9wdGhyZWFkX29rPWZhbHNlCitkbmwgUmUtdXNlIHRoZSB0ZXN0IGZpbGUgYWxyZWFkeSBnZW5lcmF0ZWQuCisgICAgYm9vc3RfcHRocmVhZHNfX3NhdmVfTElCUz0kTElCUworICAgIExJQlM9IiRMSUJTICRib29zdF9wdGhyZWFkX2ZsYWciCisgICAgQUNfTElOS19JRkVMU0UoW10sCisgICAgICBbaWYgZ3JlcCAiLiokYm9vc3RfcHRocmVhZF9mbGFnIiBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICAgICAgIGVjaG8gIlRoaXMgZmxhZyBzZWVtcyB0byBoYXZlIHRyaWdnZXJlZCB3YXJuaW5ncyIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgIGVsc2UKKyAgICAgICAgIGJvb3N0X3B0aHJlYWRfb2s9OjsgYm9vc3RfY3ZfcHRocmVhZF9mbGFnPSRib29zdF9wdGhyZWFkX2ZsYWcKKyAgICAgICBmaV0pCisgICAgTElCUz0kYm9vc3RfcHRocmVhZHNfX3NhdmVfTElCUworICAgICRib29zdF9wdGhyZWFkX29rICYmIGJyZWFrCisgIGRvbmUKK10pCitBQ19MQU5HX1BPUChbQysrXSlkbmwKK10pIyBfQk9PU1RfUFRIUkVBRF9GTEFHCisKKworIyBfQk9PU1RfZ2NjX3Rlc3QoTUFKT1IsIE1JTk9SKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBJbnRlcm5hbCBoZWxwZXIgZm9yIF9CT09TVF9GSU5EX0NPTVBJTEVSX1RBRy4KK200X2RlZmluZShbX0JPT1NUX2djY190ZXN0XSwKK1siZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA9PSAkMSAmJiBfX0dOVUNfTUlOT1JfXyA9PSAkMiAmJiAhZGVmaW5lZCBfX0lDQyBAIGdjYyQxJDIiXSlkbmwKKworIyBfQk9PU1RfbWluZ3dfdGVzdChNQUpPUiwgTUlOT1IpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEludGVybmFsIGhlbHBlciBmb3IgX0JPT1NUX0ZJTkRfQ09NUElMRVJfVEFHLgorbTRfZGVmaW5lKFtfQk9PU1RfbWluZ3dfdGVzdF0sCitbImRlZmluZWQgX19HTlVDX18gJiYgX19HTlVDX18gPT0gJDEgJiYgX19HTlVDX01JTk9SX18gPT0gJDIgJiYgIWRlZmluZWQgX19JQ0MgJiYgXAorICAoZGVmaW5lZCBXSU4zMiB8fCBkZWZpbmVkIFdJTk5UIHx8IGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMiBcCisgICAgICAgICB8fCBkZWZpbmVkIF9fV0lOMzJfXyB8fCBkZWZpbmVkIF9fV0lOTlQgfHwgZGVmaW5lZCBfX1dJTk5UX18pIEAgbWd3JDEkMiJdKWRubAorCisKKyMgX0JPT1NUX0ZJTkRfQ09NUElMRVJfVEFHKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSW50ZXJuYWwuICBXaGVuIEJvb3N0IGlzIGluc3RhbGxlZCB3aXRob3V0IC0tbGF5b3V0PXN5c3RlbSwgZWFjaCBsaWJyYXJ5CisjIGZpbGVuYW1lIHdpbGwgaG9sZCBhIHN1ZmZpeCB0aGF0IGVuY29kZXMgdGhlIGNvbXBpbGVyIHVzZWQgZHVyaW5nIHRoZQorIyBidWlsZC4gIFRoZSBCb29zdCBidWlsZCBzeXN0ZW0gc2VlbXMgdG8gY2FsbCB0aGlzIGEgYHRhZycuCitBQ19ERUZVTihbX0JPT1NUX0ZJTkRfQ09NUElMRVJfVEFHXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0NYWF0pZG5sCitBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCitBQ19DQUNIRV9DSEVDSyhbZm9yIHRoZSB0b29sc2V0IG5hbWUgdXNlZCBieSBCb29zdCBmb3IgJENYWF0sCisgICAgICAgICAgICAgICBbYm9vc3RfY3ZfbGliX3RhZ10sCitbYm9vc3RfY3ZfbGliX3RhZz11bmtub3duCitpZiB0ZXN0IHgkYm9vc3RfY3ZfaW5jX3BhdGggIT0geG5vOyB0aGVuCisgIEFDX0xBTkdfUFVTSChbQysrXSlkbmwKKyAgIyBUaGUgZm9sbG93aW5nIHRlc3RzIGFyZSBtb3N0bHkgaW5zcGlyZWQgYnkgYm9vc3QvY29uZmlnL2F1dG9fbGluay5ocHAKKyAgIyBUaGUgbGlzdCBpcyBzb3J0ZWQgdG8gbW9zdCByZWNlbnQvY29tbW9uIHRvIG9sZGVzdCBjb21waWxlciAoaW4gb3JkZXIKKyAgIyB0byBpbmNyZWFzZSB0aGUgbGlrZWxpaG9vZCBvZiBmaW5kaW5nIHRoZSByaWdodCBjb21waWxlciB3aXRoIHRoZQorICAjIGxlYXN0IG51bWJlciBvZiBjb21waWxhdGlvbiBhdHRlbXB0KS4KKyAgIyBCZXdhcmUgdGhhdCBzb21lIHRlc3RzIGFyZSBzZW5zaWJsZSB0byB0aGUgb3JkZXIgKGZvciBpbnN0YW5jZSwgd2UgbXVzdAorICAjIGxvb2sgZm9yIE1pbkdXIGJlZm9yZSBsb29raW5nIGZvciBHQ0MzKS4KKyAgIyBJIHVzZWQgb25lIGNvbXBpbGF0aW9uIHRlc3QgcGVyIGNvbXBpbGVyIHdpdGggYSAjZXJyb3IgdG8gcmVjb2duaXplCisgICMgZWFjaCBjb21waWxlciBzbyB0aGF0IGl0IHdvcmtzIGV2ZW4gd2hlbiBjcm9zcy1jb21waWxpbmcgKGxldCBtZSBrbm93CisgICMgaWYgeW91IGtub3cgYSBiZXR0ZXIgYXBwcm9hY2gpLgorICAjIEtub3duIG1pc3NpbmcgdGFncyAoa25vd24gZnJvbSBCb29zdCdzIHRvb2xzL2J1aWxkL3YyL3Rvb2xzL2NvbW1vbi5qYW0pOgorICAjICAgY29tbywgZWRnLCBrY2MsIGJjaywgbXAsIHN3LCB0cnUsIHhsYworICAjIEknbSBub3Qgc3VyZSBhYm91dCBteSB0ZXN0IGZvciBgaWwnIChiZSBjYXJlZnVsOiBJbnRlbCdzIElDQyBwcmUtZGVmaW5lcworICAjIHRoZSBzYW1lIGRlZmluZXMgYXMgR0NDJ3MpLgorICBmb3IgaSBpbiBcCisgICAgX0JPT1NUX21pbmd3X3Rlc3QoNSwgMykgXAorICAgIF9CT09TVF9nY2NfdGVzdCg1LCAzKSBcCisgICAgX0JPT1NUX21pbmd3X3Rlc3QoNSwgMikgXAorICAgIF9CT09TVF9nY2NfdGVzdCg1LCAyKSBcCisgICAgX0JPT1NUX21pbmd3X3Rlc3QoNSwgMSkgXAorICAgIF9CT09TVF9nY2NfdGVzdCg1LCAxKSBcCisgICAgX0JPT1NUX21pbmd3X3Rlc3QoNSwgMCkgXAorICAgIF9CT09TVF9nY2NfdGVzdCg1LCAwKSBcCisgICAgX0JPT1NUX21pbmd3X3Rlc3QoNCwgMTApIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoNCwgMTApIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCA5KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDkpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCA4KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDgpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCA3KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDcpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCA2KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDYpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCA1KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDUpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCA0KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDQpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCAzKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDMpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCAyKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDIpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCAxKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDEpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCAwKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDApIFwKKyAgICAiZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA9PSAzICYmICFkZWZpbmVkIF9fSUNDIFwKKyAgICAgJiYgKGRlZmluZWQgV0lOMzIgfHwgZGVmaW5lZCBXSU5OVCB8fCBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzIgXAorICAgICAgICAgfHwgZGVmaW5lZCBfX1dJTjMyX18gfHwgZGVmaW5lZCBfX1dJTk5UIHx8IGRlZmluZWQgX19XSU5OVF9fKSBAIG1ndyIgXAorICAgIF9CT09TVF9nY2NfdGVzdCgzLCA0KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDMsIDMpIFwKKyAgICAiZGVmaW5lZCBfTVNDX1ZFUiAmJiBfTVNDX1ZFUiA+PSAxNTAwIEAgdmM5MCIgXAorICAgICJkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSID09IDE0MDAgQCB2YzgwIiBcCisgICAgX0JPT1NUX2djY190ZXN0KDMsIDIpIFwKKyAgICAiZGVmaW5lZCBfTVNDX1ZFUiAmJiBfTVNDX1ZFUiA9PSAxMzEwIEAgdmM3MSIgXAorICAgIF9CT09TVF9nY2NfdGVzdCgzLCAxKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDMsIDApIFwKKyAgICAiZGVmaW5lZCBfX0JPUkxBTkRDX18gQCBiY2IiIFwKKyAgICAiZGVmaW5lZCBfX0lDQyAmJiAoZGVmaW5lZCBfX3VuaXggfHwgZGVmaW5lZCBfX3VuaXhfXykgQCBpbCIgXAorICAgICJkZWZpbmVkIF9fSUNMIEAgaXciIFwKKyAgICAiZGVmaW5lZCBfTVNDX1ZFUiAmJiBfTVNDX1ZFUiA9PSAxMzAwIEAgdmM3IiBcCisgICAgX0JPT1NUX2djY190ZXN0KDIsIDk1KSBcCisgICAgImRlZmluZWQgX19NV0VSS1NfXyAmJiBfX01XRVJLU19fIDw9IDB4MzJGRiBAIGN3OSIgXAorICAgICJkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSIDwgMTMwMCAmJiAhZGVmaW5lZCBVTkRFUl9DRSBAIHZjNiIgXAorICAgICJkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSIDwgMTMwMCAmJiBkZWZpbmVkIFVOREVSX0NFIEAgZXZjNCIgXAorICAgICJkZWZpbmVkIF9fTVdFUktTX18gJiYgX19NV0VSS1NfXyA8PSAweDMxRkYgQCBjdzgiCisgIGRvCisgICAgYm9vc3RfdGFnX3Rlc3Q9YGV4cHIgIlgkaSIgOiAnWFwoW1teQF1dKlwpIEAgJ2AKKyAgICBib29zdF90YWc9YGV4cHIgIlgkaSIgOiAnWFtbXkBdXSogQCBcKC4qXCknYAorICAgIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKKyNpZiAkYm9vc3RfdGFnX3Rlc3QKKy8qIE9LICovCisjZWxzZQorIyBlcnJvciAkYm9vc3RfdGFnX3Rlc3QKKyNlbmRpZgorXV0pXSwgW2Jvb3N0X2N2X2xpYl90YWc9JGJvb3N0X3RhZzsgYnJlYWtdLCBbXSkKKyAgZG9uZQorQUNfTEFOR19QT1AoW0MrK10pZG5sCisgIGNhc2UgJGJvb3N0X2N2X2xpYl90YWcgaW4gIygKKyAgICAjIFNvbWUgbmV3ZXIgKD49IDEuMzU/KSB2ZXJzaW9ucyBvZiBCb29zdCBzZWVtIHRvIG9ubHkgdXNlICJnY2MiIGFzIG9wcG9zZWQKKyAgICAjIHRvICJnY2M0MSIgZm9yIGluc3RhbmNlLgorICAgICotZ2NjIHwgKictZ2NjICcpIDo7OyAjKCAgRG9uJ3QgcmUtYWRkIC1nY2M6IGl0J3MgYWxyZWFkeSBpbiB0aGVyZS4KKyAgICBnY2MqKQorICAgICAgYm9vc3RfdGFnX3g9CisgICAgICBjYXNlICRob3N0X29zIGluICMoCisgICAgICAgIGRhcndpbiopCisgICAgICAgICAgaWYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtZ2UgMTM2OyB0aGVuCisgICAgICAgICAgICAjIFRoZSBgeCcgYWRkZWQgaW4gcjQ2NzkzIG9mIEJvb3N0LgorICAgICAgICAgICAgYm9vc3RfdGFnX3g9eAorICAgICAgICAgIGZpOzsKKyAgICAgIGVzYWMKKyAgICAgICMgV2UgY2FuIHNwZWNpZnkgbXVsdGlwbGUgdGFncyBpbiB0aGlzIHZhcmlhYmxlIGJlY2F1c2UgaXQncyB1c2VkIGJ5CisgICAgICAjIEJPT1NUX0ZJTkRfTElCIHRoYXQgZG9lcyBhIGBmb3IgdGFnIGluIC0kYm9vc3RfY3ZfbGliX3RhZycgLi4uCisgICAgICBib29zdF9jdl9saWJfdGFnPSIkYm9vc3RfdGFnX3gkYm9vc3RfY3ZfbGliX3RhZyAtJHtib29zdF90YWdfeH1nY2MiCisgICAgICA7OyAjKAorICAgIHVua25vd24pCisgICAgICBBQ19NU0dfV0FSTihbW2NvdWxkIG5vdCBmaWd1cmUgb3V0IHdoaWNoIHRvb2xzZXQgbmFtZSB0byB1c2UgZm9yICRDWFhdXSkKKyAgICAgIGJvb3N0X2N2X2xpYl90YWc9CisgICAgICA7OworICBlc2FjCitmaV0pZG5sIGVuZCBvZiBBQ19DQUNIRV9DSEVDSworXSkjIF9CT09TVF9GSU5EX0NPTVBJTEVSX1RBRworCisKKyMgX0JPT1NUX0dVRVNTX1dIRVRIRVJfVE9fVVNFX01UKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29tcGlsZSBhIHNtYWxsIHRlc3QgdG8gdHJ5IHRvIGd1ZXNzIHdoZXRoZXIgd2Ugc2hvdWxkIGZhdm9yIE1UIChNdWx0aQorIyBUaHJlYWQpIGZsYXZvcnMgb2YgQm9vc3QuICBTZXRzIGJvb3N0X2d1ZXNzX3VzZV9tdCBhY2NvcmRpbmdseS4KK0FDX0RFRlVOKFtfQk9PU1RfR1VFU1NfV0hFVEhFUl9UT19VU0VfTVRdLAorWyMgQ2hlY2sgd2hldGhlciB3ZSBkbyBiZXR0ZXIgdXNlIGBtdCcgZXZlbiB0aG91Z2ggd2Ugd2VyZW4ndCBhc2sgdG8uCitBQ19MQU5HX1BVU0goW0MrK10pZG5sCitBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCisjaWYgZGVmaW5lZCBfUkVFTlRSQU5UIHx8IGRlZmluZWQgX01UIHx8IGRlZmluZWQgX19NVF9fCisvKiB1c2UgLW10ICovCisjZWxzZQorIyBlcnJvciBNVCBub3QgbmVlZGVkCisjZW5kaWYKK11dKV0sIFtib29zdF9ndWVzc191c2VfbXQ9Ol0sIFtib29zdF9ndWVzc191c2VfbXQ9ZmFsc2VdKQorQUNfTEFOR19QT1AoW0MrK10pZG5sCitdKQorCisjIF9CT09TVF9BQ19MSU5LX0lGRUxTRShQUk9HUkFNLCBbQUNUSU9OLUlGLVRSVUVdLCBbQUNUSU9OLUlGLUZBTFNFXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGb3JrIG9mIF9BQ19MSU5LX0lGRUxTRSB0aGF0IHByZXNlcnZlcyBjb25mdGVzdC5vIGFjcm9zcyBjYWxscy4gIEZyYWdpbGUsCisjIHdpbGwgYnJlYWsgd2hlbiBBdXRvY29uZiBjaGFuZ2VzIGl0cyBpbnRlcm5hbHMuICBSZXF1aXJlcyB0aGF0IHlvdSBtYW51YWxseQorIyBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGluIGJldHdlZW4gdG8gcmVhbGx5IGRpZmZlcmVudCB0ZXN0cywgb3RoZXJ3aXNlCisjIHlvdSB3aWxsIHRyeSB0byBsaW5rIGEgY29uZnRlc3QubyBsZWZ0IGJlaGluZCBieSBhIHByZXZpb3VzIHRlc3QuCisjIFVzZWQgdG8gYWdncmVzc2l2ZWx5IG9wdGltaXplIEJPT1NUX0ZJTkRfTElCIChzZWUgdGhlIGJpZyBjb21tZW50IGluIHRoaXMKKyMgbWFjcm8pLgorIworIyBEb24ndCB1c2UgImJyZWFrIiBpbiB0aGUgYWN0aW9ucywgYXMgaXQgd291bGQgc2hvcnQtY2lyY3VpdCBzb21lIGNvZGUKKyMgdGhpcyBtYWNybyBydW5zIGFmdGVyIHRoZSBhY3Rpb25zLgorbTRfZGVmaW5lKFtfQk9PU1RfQUNfTElOS19JRkVMU0VdLAorW200X2lmdmFsbihbJDFdLCBbQUNfTEFOR19DT05GVEVTVChbJDFdKV0pZG5sCitybSAtZiBjb25mdGVzdCRhY19leGVleHQKK2Jvb3N0X3NhdmVfYWNfZXh0PSRhY19leHQKK2Jvb3N0X3VzZV9zb3VyY2U9OgorIyBJZiB3ZSBhbHJlYWR5IGhhdmUgYSAubywgcmUtdXNlIGl0LiAgV2UgY2hhbmdlICRhY19leHQgc28gdGhhdCAkYWNfbGluaworIyB0cmllcyB0byBsaW5rIHRoZSBleGlzdGluZyBvYmplY3QgZmlsZSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBmcm9tIHNvdXJjZS4KK3Rlc3QgLWYgY29uZnRlc3QuJGFjX29iamV4dCAmJiBhY19leHQ9JGFjX29iamV4dCAmJiBib29zdF91c2Vfc291cmNlPWZhbHNlICYmCisgIF9BU19FQ0hPX0xPRyhbcmUtdXNpbmcgdGhlIGV4aXN0aW5nIGNvbmZ0ZXN0LiRhY19vYmpleHRdKQorQVNfSUYoW19BQ19ET19TVERFUlIoJGFjX2xpbmspICYmIHsKKyAgICAgICAgIHRlc3QgLXogIiRhY19bXV9BQ19MQU5HX0FCQlJFVltdX3dlcnJvcl9mbGFnIiB8fAorICAgICAgICAgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworICAgICAgICAgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKyAgICAgICAgICRhc19leGVjdXRhYmxlX3AgY29uZnRlc3QkYWNfZXhlZXh0CitkbmwgRklYTUU6IHVzZSBBU19URVNUX1ggaW5zdGVhZCB3aGVuIDIuNjEgaXMgd2lkZXNwcmVhZCBlbm91Z2guCisgICAgICAgfV0sCisgICAgICBbJDJdLAorICAgICAgW2lmICRib29zdF91c2Vfc291cmNlOyB0aGVuCisgICAgICAgICBfQUNfTVNHX0xPR19DT05GVEVTVAorICAgICAgIGZpCisgICAgICAgJDNdKQorYWNfb2JqZXh0PSRib29zdF9zYXZlX2FjX29iamV4dAorYWNfZXh0PSRib29zdF9zYXZlX2FjX2V4dAorZG5sIERlbGV0ZSBhbHNvIHRoZSBJUEEvSVBPIChJbnRlciBQcm9jZWR1cmFsIEFuYWx5c2lzL09wdGltaXphdGlvbikKK2RubCBpbmZvcm1hdGlvbiBjcmVhdGVkIGJ5IHRoZSBQR0kgY29tcGlsZXIgKGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28pLAorZG5sIGFzIGl0IHdvdWxkIGludGVyZmVyZSB3aXRoIHRoZSBuZXh0IGxpbmsgY29tbWFuZC4KK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IG00X2lmdmFsKFskMV0sIFtjb25mdGVzdC4kYWNfZXh0XSlbXWRubAorXSkjIF9CT09TVF9BQ19MSU5LX0lGRUxTRQorCisjIExvY2FsIFZhcmlhYmxlczoKKyMgbW9kZTogYXV0b2NvbmYKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9jdmM0LXBhdGNoL2NvbmZpZy9ib29zdC5tNCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvY3ZjNC1wYXRjaC9jb25maWcvYm9vc3QubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg0Y2ZkMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvY3ZjNC1wYXRjaC9jb25maWcvYm9vc3QubTQKQEAgLTAsMCArMSwxNTY1IEBACisjIGJvb3N0Lm00OiBMb2NhdGUgQm9vc3QgaGVhZGVycyBhbmQgbGlicmFyaWVzIGZvciBhdXRvY29uZi1iYXNlZCBwcm9qZWN0cy4KKyMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMTEsIDIwMTQgIEJlbm9pdCBTaWdvdXJlIDx0c3VuYUBscmRlLmVwaXRhLmZyPgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBBZGRpdGlvbmFsIHBlcm1pc3Npb24gdW5kZXIgc2VjdGlvbiA3IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZSwgdmVyc2lvbiAzICgiR1BMdjMiKToKKyMKKyMgSWYgeW91IGNvbnZleSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHdvcmsgdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBkbyBzbyB1bmRlcgorIyB0ZXJtcyBvZiB5b3VyIGNob2ljZS4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKK200X2RlZmluZShbX0JPT1NUX1NFUklBTF0sIFttNF90cmFuc2xpdChbCisjIHNlcmlhbCAyNQorXSwgWyMKK10sIFtdKV0pCisKKyMgT3JpZ2luYWwgc291cmNlcyBjYW4gYmUgZm91bmQgYXQgaHR0cDovL2dpdGh1Yi5jb20vdHN1bmEvYm9vc3QubTQKKyMgWW91IGNhbiBmZXRjaCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIHNjcmlwdCBieSBkb2luZzoKKyMgICB3Z2V0IGh0dHA6Ly9naXRodWIuY29tL3RzdW5hL2Jvb3N0Lm00L3Jhdy9tYXN0ZXIvYnVpbGQtYXV4L2Jvb3N0Lm00CisKKyMgLS0tLS0tICMKKyMgUkVBRE1FICMKKyMgLS0tLS0tICMKKworIyBUaGlzIGZpbGUgcHJvdmlkZXMgc2V2ZXJhbCBtYWNyb3MgdG8gdXNlIHRoZSB2YXJpb3VzIEJvb3N0IGxpYnJhcmllcy4KKyMgVGhlIGZpcnN0IG1hY3JvIGlzIEJPT1NUX1JFUVVJUkUuICBJdCB3aWxsIHNpbXBseSBjaGVjayBpZiBpdCdzIHBvc3NpYmxlIHRvCisjIGZpbmQgdGhlIEJvb3N0IGhlYWRlcnMgb2YgYSBnaXZlbiAob3B0aW9uYWwpIG1pbmltdW0gdmVyc2lvbiBhbmQgaXQgd2lsbAorIyBkZWZpbmUgQk9PU1RfQ1BQRkxBR1MgYWNjb3JkaW5nbHkuICBJdCB3aWxsIGFkZCBhbiBvcHRpb24gLS13aXRoLWJvb3N0IHRvCisjIHlvdXIgY29uZmlndXJlIHNvIHRoYXQgdXNlcnMgY2FuIHNwZWNpZnkgbm9uIHN0YW5kYXJkIGxvY2F0aW9ucy4KKyMgSWYgdGhlIHVzZXIncyBlbnZpcm9ubWVudCBjb250YWlucyBCT09TVF9ST09UIGFuZCAtLXdpdGgtYm9vc3Qgd2FzIG5vdAorIyBzcGVjaWZpZWQsIC0td2l0aC1ib29zdD0kQk9PU1RfUk9PVCBpcyBpbXBsaWNpdGx5IHVzZWQuCisjIEZvciBtb3JlIFJFQURNRSBhbmQgZG9jdW1lbnRhdGlvbiwgZ28gdG8gaHR0cDovL2dpdGh1Yi5jb20vdHN1bmEvYm9vc3QubTQKKyMgTm90ZTogVEhFU0UgTUFDUk9TIEFTU1VNRSBUSEFUIFlPVSBVU0UgTElCVE9PTC4gIElmIHlvdSBkb24ndCwgZG9uJ3Qgd29ycnksCisjIHNpbXBseSByZWFkIHRoZSBSRUFETUUsIGl0IHdpbGwgc2hvdyB5b3Ugd2hhdCB0byBkbyBzdGVwIGJ5IHN0ZXAuCisKK200X3BhdHRlcm5fZm9yYmlkKFteXz8oQk9PU1R8Qm9vc3QpX10pCisKKworIyBfQk9PU1RfU0VEX0NQUChTRUQtUFJPR1JBTSwgUFJPR1JBTSwKKyMgICAgICAgICAgICAgICAgW0FDVElPTi1JRi1GT1VORF0sIFtBQ1RJT04tSUYtTk9ULUZPVU5EXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2FtZSBhcyBBQ19FR1JFUF9DUFAsIGJ1dCBsZWF2ZSB0aGUgcmVzdWx0IGluIGNvbmZ0ZXN0LmkuCisjCisjIFNFRC1QUk9HUkFNIGlzICpub3QqIG92ZXJxdW90ZWQsIGFzIGluIEFDX0VHUkVQX0NQUC4gIEl0IGlzIGV4cGFuZGVkCisjIGluIGRvdWJsZS1xdW90ZXMsIHNvIGVzY2FwZSB5b3VyIGRvdWJsZSBxdW90ZXMuCisjCisjIEl0IGNvdWxkIGJlIHVzZWZ1bCB0byB0dXJuIHRoaXMgaW50byBhIG1hY3JvIHdoaWNoIGV4dHJhY3RzIHRoZQorIyB2YWx1ZSBvZiBhbnkgbWFjcm8uCittNF9kZWZpbmUoW19CT09TVF9TRURfQ1BQXSwKK1tBQ19MQU5HX1BVU0goW0MrK10pZG5sCitBQ19MQU5HX1BSRVBST0NfUkVRVUlSRSgpZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX1NFRF0pZG5sCitBQ19MQU5HX0NPTkZURVNUKFtBQ19MQU5HX1NPVVJDRShbWyQyXV0pXSkKK0FTX0lGKFtkbmwgZXZhbCBpcyBuZWNlc3NhcnkgdG8gZXhwYW5kIGFjX2NwcC4KK2RubCBVbHRyaXggYW5kIFB5cmFtaWQgc2ggcmVmdXNlIHRvIHJlZGlyZWN0IG91dHB1dCBvZiBldmFsLCBzbyB1c2Ugc3Vic2hlbGwuCitkbmwgQmV3YXJlIG9mIFdpbmRvd3MgZW5kLW9mLWxpbmVzLCBmb3IgaW5zdGFuY2UgaWYgd2UgYXJlIHJ1bm5pbmcKK2RubCBzb21lIFdpbmRvd3MgcHJvZ3JhbXMgdW5kZXIgV2luZS4gIEluIHRoYXQgY2FzZSwgYm9vc3QvdmVyc2lvbi5ocHAKK2RubCBpcyBjZXJ0YWlubHkgdXNpbmcgIlxyXG4iLCBidXQgdGhlIHJlZ3VsYXIgVW5peCBzaGVsbCB3aWxsIG9ubHkKK2RubCBzdHJpcCBgXG4nIHdpdGggYmFja3F1b3Rlcywgbm90IHRoZSBgXHInLiAgVGhpcyByZXN1bHRzIGluCitkbmwgYm9vc3RfY3ZfbGliX3ZlcnNpb249JzFfMzdccicgZm9yIGluc3RhbmNlLCB3aGljaCBicmVha3MKK2RubCBldmVyeXRoaW5nIGVsc2UuCitkbmwgQ2Fubm90IHVzZSAnZG5sJyBhZnRlciBbJDRdIGJlY2F1c2UgYSB0cmFpbGluZyBkbmwgbWF5IGJyZWFrIEFDX0NBQ0hFX0NIRUNLCitkbmwKK2RubCBCZXdhcmUgdGhhdCBHQ0MgNSwgd2hlbiBleHBhbmRpbmcgbWFjcm9zLCBtYXkgZW1iZWQgIyBsaW5lIGRpcmVjdGl2ZXMKK2RubCBhIHdpdGhpbiBzaW5nbGUgbGluZToKK2RubAorZG5sICMgMSAiY29uZnRlc3QuY2MiCitkbmwgIyAxICI8YnVpbHQtaW4+IgorZG5sICMgMSAiPGNvbW1hbmQtbGluZT4iCitkbmwgIyAxICJjb25mdGVzdC5jYyIKK2RubCAjIDEgIi9vcHQvbG9jYWwvaW5jbHVkZS9ib29zdC92ZXJzaW9uLmhwcCIgMSAzCitkbmwgIyAyICJjb25mdGVzdC5jYyIgMgorZG5sIGJvb3N0LWxpYi12ZXJzaW9uID0KK2RubCAjIDIgImNvbmZ0ZXN0LmNjIiAzCitkbmwgICAgICAgICAgICAgICAgICAgICIxXzU2IgorZG5sCitkbmwgU28gZ2V0IHJpZCBvZiB0aGUgIyBsaW5lcywgYW5kIGdsdWUgdGhlIHJlbWFpbmluZyBvbmVzIHRvZ2V0aGVyLgorKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JkFTX01FU1NBR0VfTE9HX0ZEIHwKKyAgZ3JlcCAtdiAnIycgfAorICB0ciAtZCAnXHInIHwKKyAgdHIgLXMgJ1xuJyAnICcgfAorICAkU0VEIC1uIC1lICIkMSIgPmNvbmZ0ZXN0LmkgMj4mMV0sCisgIFskM10sCisgIFskNF0pCitybSAtcmYgY29uZnRlc3QqCitBQ19MQU5HX1BPUChbQysrXSlkbmwKK10pIyBfQk9PU1RfU0VEX0NQUAorCisKKworIyBCT09TVF9SRVFVSVJFKFtWRVJTSU9OXSwgW0FDVElPTi1JRi1OT1QtRk9VTkRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC4gIElmIHZlcnNpb24gaXMgZ2l2ZW4sIGl0IG11c3QgZWl0aGVyIGJlIGEgbGl0ZXJhbCBvZiB0aGUgZm9ybQorIyAiWC5ZLloiIHdoZXJlIFgsIFkgYW5kIFogYXJlIGludGVnZXJzICh0aGUgIi5aIiBwYXJ0IGJlaW5nIG9wdGlvbmFsKSBvciBhCisjIHZhcmlhYmxlICIkdmFyIi4KKyMgRGVmaW5lcyB0aGUgdmFsdWUgQk9PU1RfQ1BQRkxBR1MuICBUaGlzIG1hY3JvIG9ubHkgY2hlY2tzIGZvciBoZWFkZXJzIHdpdGgKKyMgdGhlIHJlcXVpcmVkIHZlcnNpb24sIGl0IGRvZXMgbm90IGNoZWNrIGZvciBhbnkgb2YgdGhlIEJvb3N0IGxpYnJhcmllcy4KKyMgT24gIyBzdWNjZXNzLCBkZWZpbmVzIEhBVkVfQk9PU1QuICBPbiBmYWlsdXJlLCBjYWxscyB0aGUgb3B0aW9uYWwKKyMgQUNUSU9OLUlGLU5PVC1GT1VORCBhY3Rpb24gaWYgb25lIHdhcyBzdXBwbGllZC4KKyMgT3RoZXJ3aXNlIGFib3J0cyB3aXRoIGFuIGVycm9yIG1lc3NhZ2UuCitBQ19ERUZVTl9PTkNFKFtCT09TVF9SRVFVSVJFXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0NYWF0pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX0dSRVBdKWRubAorZWNobyAiJGFzX21lOiB0aGlzIGlzIGJvb3N0Lm00W11fQk9PU1RfU0VSSUFMIiA+JkFTX01FU1NBR0VfTE9HX0ZECitib29zdF9zYXZlX0lGUz0kSUZTCitib29zdF92ZXJzaW9uX3JlcT0kMQorSUZTPS4KK3NldCB4ICRib29zdF92ZXJzaW9uX3JlcSAwIDAgMAorSUZTPSRib29zdF9zYXZlX0lGUworc2hpZnQKK2Jvb3N0X3ZlcnNpb25fcmVxPWBleHByICIkWzFdIiAnKicgMTAwMDAwICsgIiRbMl0iICcqJyAxMDAgKyAiJFszXSJgCitib29zdF92ZXJzaW9uX3JlcV9zdHJpbmc9JFsxXS4kWzJdLiRbM10KK0FDX0FSR19XSVRIKFtib29zdF0sCisgICBbQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1ib29zdD1ESVJdLAorICAgICAgICAgICAgICAgICAgIFtwcmVmaXggb2YgQm9vc3QgJDEgQDw6QGd1ZXNzQDo+QF0pXSlkbmwKK0FDX0FSR19WQVIoW0JPT1NUX1JPT1RdLFtMb2NhdGlvbiBvZiBCb29zdCBpbnN0YWxsYXRpb25dKWRubAorIyBJZiBCT09TVF9ST09UIGlzIHNldCBhbmQgdGhlIHVzZXIgaGFzIG5vdCBwcm92aWRlZCBhIHZhbHVlIHRvCisjIC0td2l0aC1ib29zdCwgdGhlbiB0cmVhdCBCT09TVF9ST09UIGFzIGlmIGl0IHRoZSB1c2VyIHN1cHBsaWVkIGl0LgoraWYgdGVzdCB4IiRCT09TVF9ST09UIiAhPSB4OyB0aGVuCisgIGlmIHRlc3QgeCIkd2l0aF9ib29zdCIgPSB4OyB0aGVuCisgICAgQUNfTVNHX05PVElDRShbRGV0ZWN0ZWQgQk9PU1RfUk9PVDsgY29udGludWluZyB3aXRoIC0td2l0aC1ib29zdD0kQk9PU1RfUk9PVF0pCisgICAgd2l0aF9ib29zdD0kQk9PU1RfUk9PVAorICBlbHNlCisgICAgQUNfTVNHX05PVElDRShbRGV0ZWN0ZWQgQk9PU1RfUk9PVD0kQk9PU1RfUk9PVCwgYnV0IG92ZXJyaWRkZW4gYnkgLS13aXRoLWJvb3N0PSR3aXRoX2Jvb3N0XSkKKyAgZmkKK2ZpCitBQ19TVUJTVChbRElTVENIRUNLX0NPTkZJR1VSRV9GTEFHU10sCisgICAgICAgICBbIiRESVNUQ0hFQ0tfQ09ORklHVVJFX0ZMQUdTICctLXdpdGgtYm9vc3Q9JHdpdGhfYm9vc3QnIl0pZG5sCitib29zdF9zYXZlX0NQUEZMQUdTPSRDUFBGTEFHUworICBBQ19DQUNIRV9DSEVDSyhbZm9yIEJvb3N0IGhlYWRlcnMgdmVyc2lvbiA+PSAkYm9vc3RfdmVyc2lvbl9yZXFfc3RyaW5nXSwKKyAgICBbYm9vc3RfY3ZfaW5jX3BhdGhdLAorICAgIFtib29zdF9jdl9pbmNfcGF0aD1ubworQUNfTEFOR19QVVNIKFtDKytdKWRubAorbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX1ZFUlNJT04kXSlkbmwKKyAgICBBQ19MQU5HX0NPTkZURVNUKFtBQ19MQU5HX1BST0dSQU0oW1sjaW5jbHVkZSA8Ym9vc3QvdmVyc2lvbi5ocHA+CisjaWYgIWRlZmluZWQgQk9PU1RfVkVSU0lPTgorIyBlcnJvciBCT09TVF9WRVJTSU9OIGlzIG5vdCBkZWZpbmVkCisjZWxpZiBCT09TVF9WRVJTSU9OIDwgJGJvb3N0X3ZlcnNpb25fcmVxCisjIGVycm9yIEJvb3N0IGhlYWRlcnMgdmVyc2lvbiA8ICRib29zdF92ZXJzaW9uX3JlcQorI2VuZGlmCitdXSldKQorICAgICMgSWYgdGhlIHVzZXIgcHJvdmlkZWQgYSB2YWx1ZSB0byAtLXdpdGgtYm9vc3QsIHVzZSBpdCBhbmQgb25seSBpdC4KKyAgICBjYXNlICR3aXRoX2Jvb3N0IGluICMoCisgICAgICAnJ3x5ZXMpIHNldCB4ICcnIC9vcHQvbG9jYWwvaW5jbHVkZSAvdXNyL2xvY2FsL2luY2x1ZGUgL29wdC9pbmNsdWRlIFwKKyAgICAgICAgICAgICAgICAgL3Vzci9pbmNsdWRlIEM6L0Jvb3N0L2luY2x1ZGU7OyAjKAorICAgICAgKikgICAgICBzZXQgeCAiJHdpdGhfYm9vc3QvaW5jbHVkZSIgIiR3aXRoX2Jvb3N0Ijs7CisgICAgZXNhYworICAgIHNoaWZ0CisgICAgZm9yIGJvb3N0X2RpcgorICAgIGRvCisgICAgIyBXaXRob3V0IC0tbGF5b3V0PXN5c3RlbSwgQm9vc3QgKG9yIGF0IGxlYXN0IHNvbWUgdmVyc2lvbnMpIGluc3RhbGxzCisgICAgIyBpdHNlbGYgaW4gPHByZWZpeD4vaW5jbHVkZS9ib29zdC08dmVyc2lvbj4uICBUaGlzIGlubmVyIGxvb3AgaGVscHMgdG8KKyAgICAjIGZpbmQgaGVhZGVycyBpbiBzdWNoIGRpcmVjdG9yaWVzLgorICAgICMKKyAgICAjIEFueSAke2Jvb3N0X2Rpcn0vYm9vc3QteF94eCBkaXJlY3RvcmllcyBhcmUgc2VhcmNoZWQgaW4gcmV2ZXJzZSB2ZXJzaW9uCisgICAgIyBvcmRlciBmb2xsb3dlZCBieSAke2Jvb3N0X2Rpcn0uICBUaGUgZmluYWwgJy4nIGlzIGEgc2VudGluZWwgZm9yCisgICAgIyBzZWFyY2hpbmcgJGJvb3N0X2RpciIgaXRzZWxmLiAgRW50cmllcyBhcmUgd2hpdGVzcGFjZSBzZXBhcmF0ZWQuCisgICAgIworICAgICMgSSBkaWRuJ3QgaW5kZW50IHRoaXMgbG9vcCBvbiBwdXJwb3NlICh0byBhdm9pZCBvdmVyLWluZGVudGVkIGNvZGUpCisgICAgYm9vc3RfbGF5b3V0X3N5c3RlbV9zZWFyY2hfbGlzdD1gY2QgIiRib29zdF9kaXIiIDI+L2Rldi9udWxsIFwKKyAgICAgICAgJiYgbHMgLTEgfCAiJHtHUkVQfSIgJ15ib29zdC0nIHwgc29ydCAtcm4gLXQtIC1rMiBcCisgICAgICAgICYmIGVjaG8gLmAKKyAgICBmb3IgYm9vc3RfaW5jIGluICRib29zdF9sYXlvdXRfc3lzdGVtX3NlYXJjaF9saXN0CisgICAgZG8KKyAgICAgIGlmIHRlc3QgeCIkYm9vc3RfaW5jIiAhPSB4LjsgdGhlbgorICAgICAgICBib29zdF9pbmM9IiRib29zdF9kaXIvJGJvb3N0X2luYyIKKyAgICAgIGVsc2UKKyAgICAgICAgYm9vc3RfaW5jPSIkYm9vc3RfZGlyIiAjIFVzZXMgc2VudGluZWwgaW4gYm9vc3RfbGF5b3V0X3N5c3RlbV9zZWFyY2hfbGlzdAorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgeCIkYm9vc3RfaW5jIiAhPSB4OyB0aGVuCisgICAgICAgICMgV2UgYXJlIGdvaW5nIHRvIGNoZWNrIHdoZXRoZXIgdGhlIHZlcnNpb24gb2YgQm9vc3QgaW5zdGFsbGVkCisgICAgICAgICMgaW4gJGJvb3N0X2luYyBpcyB1c2FibGUgYnkgcnVubmluZyBhIGNvbXBpbGF0aW9uIHRoYXQKKyAgICAgICAgIyAjaW5jbHVkZXMgaXQuICBCdXQgaWYgd2UgcGFzcyBhIC1JL3NvbWUvcGF0aCBpbiB3aGljaCBCb29zdAorICAgICAgICAjIGlzIG5vdCBpbnN0YWxsZWQsIHRoZSBjb21waWxlciB3aWxsIGp1c3Qgc2tpcCB0aGlzIC1JIGFuZAorICAgICAgICAjIHVzZSBvdGhlciBsb2NhdGlvbnMgKGVpdGhlciBmcm9tIENQUEZMQUdTLCBvciBmcm9tIGl0cyBsaXN0CisgICAgICAgICMgb2Ygc3lzdGVtIGluY2x1ZGUgZGlyZWN0b3JpZXMpLiAgQXMgYSByZXN1bHQgd2Ugd291bGQgdXNlCisgICAgICAgICMgaGVhZGVyIGluc3RhbGxlZCBvbiB0aGUgbWFjaGluZSBpbnN0ZWFkIG9mIHRoZSAvc29tZS9wYXRoCisgICAgICAgICMgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLiAgU28gaW4gdGhhdCBwcmVjaXNlIGNhc2UgKHRyeWluZworICAgICAgICAjICRib29zdF9pbmMpLCBtYWtlIHN1cmUgdGhlIHZlcnNpb24uaHBwIGV4aXN0cy4KKyAgICAgICAgIworICAgICAgICAjIFVzZSB0ZXN0IC1lIGFzIHRoZXJlIGNhbiBiZSBzeW1saW5rcy4KKyAgICAgICAgdGVzdCAtZSAiJGJvb3N0X2luYy9ib29zdC92ZXJzaW9uLmhwcCIgfHwgY29udGludWUKKyAgICAgICAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAtSSRib29zdF9pbmMiCisgICAgICBmaQorICAgICAgQUNfQ09NUElMRV9JRkVMU0UoW10sIFtib29zdF9jdl9pbmNfcGF0aD15ZXNdLCBbYm9vc3RfY3ZfdmVyc2lvbj1ub10pCisgICAgICBpZiB0ZXN0IHgiJGJvb3N0X2N2X2luY19wYXRoIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgaWYgdGVzdCB4IiRib29zdF9pbmMiICE9IHg7IHRoZW4KKyAgICAgICAgICBib29zdF9jdl9pbmNfcGF0aD0kYm9vc3RfaW5jCisgICAgICAgIGZpCisgICAgICAgIGJyZWFrIDIKKyAgICAgIGZpCisgICAgZG9uZQorICAgIGRvbmUKK0FDX0xBTkdfUE9QKFtDKytdKWRubAorICAgIF0pCisgICAgY2FzZSAkYm9vc3RfY3ZfaW5jX3BhdGggaW4gIygKKyAgICAgIG5vKQorICAgICAgICBib29zdF9lcnJtc2c9ImNhbm5vdCBmaW5kIEJvb3N0IGhlYWRlcnMgdmVyc2lvbiA+PSAkYm9vc3RfdmVyc2lvbl9yZXFfc3RyaW5nIgorICAgICAgICBtNF9pZihbJDJdLCBbXSwgIFtBQ19NU0dfRVJST1IoWyRib29zdF9lcnJtc2ddKV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbQUNfTVNHX05PVElDRShbJGJvb3N0X2Vycm1zZ10pXSkKKyAgICAgICAgJDIKKyAgICAgICAgOzsjKAorICAgICAgeWVzKQorICAgICAgICBCT09TVF9DUFBGTEFHUz0KKyAgICAgICAgOzsjKAorICAgICAgKikKKyAgICAgICAgQUNfU1VCU1QoW0JPT1NUX0NQUEZMQUdTXSwgWyItSSRib29zdF9jdl9pbmNfcGF0aCJdKWRubAorICAgICAgICA7OworICAgIGVzYWMKKyAgaWYgdGVzdCB4IiRib29zdF9jdl9pbmNfcGF0aCIgIT0geG5vOyB0aGVuCisgIEFDX0RFRklORShbSEFWRV9CT09TVF0sIFsxXSwKKyAgICAgICAgICAgIFtEZWZpbmVkIGlmIHRoZSByZXF1ZXN0ZWQgbWluaW11bSBCT09TVCB2ZXJzaW9uIGlzIHNhdGlzZmllZF0pCisgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgQm9vc3QncyBoZWFkZXIgdmVyc2lvbl0sCisgICAgW2Jvb3N0X2N2X2xpYl92ZXJzaW9uXSwKKyAgICBbbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX0xJQl9WRVJTSU9OJF0pZG5sCisgICAgIF9CT09TVF9TRURfQ1BQKFtbL15ib29zdC1saWItdmVyc2lvbiA9IC97cy8vLztzL1tcIiBdLy9nO3A7cTt9XV0sCisgICAgICAgICAgICAgICAgICAgIFsjaW5jbHVkZSA8Ym9vc3QvdmVyc2lvbi5ocHA+Citib29zdC1saWItdmVyc2lvbiA9IEJPT1NUX0xJQl9WRVJTSU9OXSwKKyAgICBbYm9vc3RfY3ZfbGliX3ZlcnNpb249YGNhdCBjb25mdGVzdC5pYF0pXSkKKyAgICAjIGUuZy4gIjEzNCIgZm9yIDFfMzRfMSBvciAiMTM1IiBmb3IgMV8zNQorICAgIAorICAgICNib29zdF9jdl9saWJfdmVyc2lvbj0iMTYxIgorICAgICNib29zdF9tYWpvcl92ZXJzaW9uPWBlY2hvICIkYm9vc3RfY3ZfbGliX3ZlcnNpb24iIHwgc2VkICdzL18vLztzL18uKi8vJ2AKKyAgICAjYm9vc3RfbWFqb3JfdmVyc2lvbj1gZWNobyAiJEJPT1NUX0xJQl9WRVJTSU9OIiB8IHNlZCAncy9fLy87cy9fLiovLydgCisgICAgYm9vc3RfbWFqb3JfdmVyc2lvbj0iMTYxIgorICAgICAKKyAgICAjY2FzZSAkYm9vc3RfbWFqb3JfdmVyc2lvbiBpbiAjKAorICAgICMgICcnIHwgKltbITAtOV1dKikKKyAgICAjICAgIEFDX01TR19FUlJPUihbaW52YWxpZCB2YWx1ZTogYm9vc3RfbWFqb3JfdmVyc2lvbj0nJGJvb3N0X21ham9yX3ZlcnNpb24nXSkKKyAgICAjICAgIDs7CisgICAgI2VzYWMKK2ZpCitDUFBGTEFHUz0kYm9vc3Rfc2F2ZV9DUFBGTEFHUworXSkjIEJPT1NUX1JFUVVJUkUKKworCisjIEJPT1NUX1NUQVRJQygpCisjIC0tLS0tLS0tLS0tLS0tCisjIEFkZCB0aGUgIi0tZW5hYmxlLXN0YXRpYy1ib29zdCIgY29uZmlndXJlIGFyZ3VtZW50LiBJZiB0aGlzIGFyZ3VtZW50IGlzIGdpdmVuCisjIG9uIHRoZSBjb21tYW5kIGxpbmUsIHN0YXRpYyB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyaWVzIHdpbGwgYmUgbG9va2VkIHVwLgorQUNfREVGVU4oW0JPT1NUX1NUQVRJQ10sCisgIFtBQ19BUkdfRU5BQkxFKFtzdGF0aWMtYm9vc3RdLAorICAgICBbQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXN0YXRpYy1ib29zdF0sCisgICAgICAgICAgICAgICBbUHJlZmVyIHRoZSBzdGF0aWMgYm9vc3QgbGlicmFyaWVzIG92ZXIgdGhlIHNoYXJlZCBvbmVzIFtub11dKV0sCisgICAgIFtlbmFibGVfc3RhdGljX2Jvb3N0PXllc10sCisgICAgIFtlbmFibGVfc3RhdGljX2Jvb3N0PW5vXSldKSMgQk9PU1RfU1RBVElDCisKKworIyBCT09TVF9GSU5EX0hFQURFUihbSEVBREVSLU5BTUVdLCBbQUNUSU9OLUlGLU5PVC1GT1VORF0sIFtBQ1RJT04tSUYtRk9VTkRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBXcmFwcGVyIGFyb3VuZCBBQ19DSEVDS19IRUFERVIgZm9yIEJvb3N0IGhlYWRlcnMuICBVc2VmdWwgdG8gY2hlY2sgZm9yCisjIHNvbWUgcGFydHMgb2YgdGhlIEJvb3N0IGxpYnJhcnkgd2hpY2ggYXJlIG9ubHkgbWFkZSBvZiBoZWFkZXJzIGFuZCBkb24ndAorIyByZXF1aXJlIGxpbmtpbmcgKHN1Y2ggYXMgQm9vc3QuRm9yZWFjaCkuCisjCisjIERlZmF1bHQgQUNUSU9OLUlGLU5PVC1GT1VORDogRmFpbCB3aXRoIGEgZmF0YWwgZXJyb3IgdW5sZXNzIEJvb3N0IGNvdWxkbid0IGJlCisjIGZvdW5kIGluIHRoZSBmaXJzdCBwbGFjZSwgaW4gd2hpY2ggY2FzZSBieSBkZWZhdWx0IGEgbm90aWNlIGlzIGlzc3VlZCB0byB0aGUKKyMgdXNlci4gIFByZXN1bWFibHkgaWYgd2UgaGF2ZW4ndCBkaWVkIGFscmVhZHkgaXQncyBiZWNhdXNlIGl0J3MgT0sgdG8gbm90IGhhdmUKKyMgQm9vc3QsIHdoaWNoIGlzIHdoeSBvbmx5IGEgbm90aWNlIGlzIGlzc3VlZCBpbnN0ZWFkIG9mIGEgaGFyZCBlcnJvci4KKyMKKyMgRGVmYXVsdCBBQ1RJT04tSUYtRk9VTkQ6IGRlZmluZSB0aGUgcHJlcHJvY2Vzc29yIHN5bWJvbCBIQVZFXzxIRUFERVItTkFNRT4gaW4KKyMgY2FzZSBvZiBzdWNjZXNzICMgKHdoZXJlIEhFQURFUi1OQU1FIGlzIHdyaXR0ZW4gTElLRV9USElTLCBlLmcuLAorIyBIQVZFX0JPT1NUX0ZPUkVBQ0hfSFBQKS4KK0FDX0RFRlVOKFtCT09TVF9GSU5EX0hFQURFUl0sCitbQUNfUkVRVUlSRShbQk9PU1RfUkVRVUlSRV0pZG5sCitpZiB0ZXN0IHgiJGJvb3N0X2N2X2luY19wYXRoIiA9IHhubzsgdGhlbgorICBtNF9kZWZhdWx0KFskMl0sIFtBQ19NU0dfTk9USUNFKFtCb29zdCBub3QgYXZhaWxhYmxlLCBub3Qgc2VhcmNoaW5nIGZvciAkMV0pXSkKK2Vsc2UKK0FDX0xBTkdfUFVTSChbQysrXSlkbmwKK2Jvb3N0X3NhdmVfQ1BQRkxBR1M9JENQUEZMQUdTCitDUFBGTEFHUz0iJENQUEZMQUdTICRCT09TVF9DUFBGTEFHUyIKK0FDX0NIRUNLX0hFQURFUihbJDFdLAorICBbbTRfZGVmYXVsdChbJDNdLCBbQUNfREVGSU5FKEFTX1RSX0NQUChbSEFWRV8kMV0pLCBbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0RlZmluZSB0byAxIGlmIHlvdSBoYXZlIDwkMT5dKV0pXSwKKyAgW200X2RlZmF1bHQoWyQyXSwgW0FDX01TR19FUlJPUihbY2Fubm90IGZpbmQgJDFdKV0pXSkKK0NQUEZMQUdTPSRib29zdF9zYXZlX0NQUEZMQUdTCitBQ19MQU5HX1BPUChbQysrXSlkbmwKK2ZpCitdKSMgQk9PU1RfRklORF9IRUFERVIKKworCisjIEJPT1NUX0ZJTkRfTElCUyhbQ09NUE9ORU5ULU5BTUVdLCBbQ0FORElEQVRFLUxJQi1OQU1FU10sCisjICAgICAgICAgICAgICAgICBbUFJFRkVSUkVELVJULU9QVF0sIFtIRUFERVItTkFNRV0sIFtDWFgtVEVTVF0sCisjICAgICAgICAgICAgICAgICBbQ1hYLVBST0xPR1VFXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgdGhlIEJvb3N0IGxpYnJhcnkgQ09NUE9ORU5ULU5BTUUgKGUuZy4sIGB0aHJlYWQnLCBmb3IKKyMgbGliYm9vc3RfdGhyZWFkKSB1bmRlciB0aGUgcG9zc2libGUgQ0FORElEQVRFLUxJQi1OQU1FUyAoZS5nLiwKKyMgInRocmVhZF93aW4zMiB0aHJlYWQiKS4gIENoZWNrIHRoYXQgSEVBREVSLU5BTUUgd29ya3MgYW5kIGNoZWNrIHRoYXQKKyMgbGliYm9vc3RfTElCLU5BTUUgY2FuIGxpbmsgd2l0aCB0aGUgY29kZSBDWFgtVEVTVC4gIFRoZSBvcHRpb25hbAorIyBhcmd1bWVudCBDWFgtUFJPTE9HVUUgY2FuIGJlIHVzZWQgdG8gaW5jbHVkZSBzb21lIEMrKyBjb2RlIGJlZm9yZQorIyB0aGUgYG1haW4nIGZ1bmN0aW9uLgorIworIyBJbnZva2VzIEJPT1NUX0ZJTkRfSEVBREVSKFtIRUFERVItTkFNRV0pIChzZWUgYWJvdmUpLgorIworIyBCb29zdCBsaWJyYXJpZXMgdHlwaWNhbGx5IGNvbWUgY29tcGlsZWQgd2l0aCBzZXZlcmFsIGZsYXZvcnMgKHdpdGggZGlmZmVyZW50CisjIHJ1bnRpbWUgb3B0aW9ucykgc28gUFJFRkVSUkVELVJULU9QVCBpcyB0aGUgcHJlZmVycmVkIHN1ZmZpeC4gIEEgc3VmZml4IGlzIG9uZQorIyBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgbGV0dGVyczogc2dkcG4gKGluIHRoYXQgb3JkZXIpLiAgcyA9IHN0YXRpYworIyBydW50aW1lLCBkID0gZGVidWcgYnVpbGQsIGcgPSBkZWJ1Zy9kaWFnbm9zdGljIHJ1bnRpbWUsIHAgPSBTVExQb3J0IGJ1aWxkLAorIyBuID0gKHVuc3VyZSkgU1RMUG9ydCBidWlsZCB3aXRob3V0IGlvc3RyZWFtcyBmcm9tIFNUTFBvcnQgKGl0IGxvb2tzIGxpa2UgYG4nCisjIG11c3QgYWx3YXlzIGJlIHVzZWQgYWxvbmcgd2l0aCBgcCcpLiAgQWRkaXRpb25hbGx5LCBQUkVGRVJSRUQtUlQtT1BUIGNhbgorIyBzdGFydCB3aXRoIGBtdC0nIHRvIGluZGljYXRlIHRoYXQgdGhlcmUgaXMgYSBwcmVmZXJlbmNlIGZvciBtdWx0aS10aHJlYWQKKyMgYnVpbGRzLiAgU29tZSBzYW1wbGUgdmFsdWVzIGZvciBQUkVGRVJSRUQtUlQtT1BUOiAobm90aGluZyksIG10LCBkLCBtdC1kLCBnZHAKKyMgLi4uICBJZiB5b3Ugd2FudCB0byBtYWtlIHN1cmUgeW91IGhhdmUgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIEJvb3N0CisjIChlZywgPj0gMS4zMykgeW91ICptdXN0KiBpbnZva2UgQk9PU1RfUkVRVUlSRSBiZWZvcmUgdGhpcyBtYWNyby4KK0FDX0RFRlVOKFtCT09TVF9GSU5EX0xJQlNdLAorW0FDX1JFUVVJUkUoW0JPT1NUX1JFUVVJUkVdKWRubAorQUNfUkVRVUlSRShbX0JPT1NUX0ZJTkRfQ09NUElMRVJfVEFHXSlkbmwKK0FDX1JFUVVJUkUoW0JPT1NUX1NUQVRJQ10pZG5sCitBQ19SRVFVSVJFKFtfQk9PU1RfR1VFU1NfV0hFVEhFUl9UT19VU0VfTVRdKWRubAoraWYgdGVzdCB4IiRib29zdF9jdl9pbmNfcGF0aCIgPSB4bm87IHRoZW4KKyAgQUNfTVNHX05PVElDRShbQm9vc3Qgbm90IGF2YWlsYWJsZSwgbm90IHNlYXJjaGluZyBmb3IgdGhlIEJvb3N0ICQxIGxpYnJhcnldKQorZWxzZQorZG5sIFRoZSBlbHNlIGJyYW5jaCBpcyBodWdlIGFuZCB3YXNuJ3QgaW50ZW5kZWQgb24gcHVycG9zZS4KK0FDX0xBTkdfUFVTSChbQysrXSlkbmwKK0FTX1ZBUl9QVVNIREVGKFtCb29zdF9saWJdLCBbYm9vc3RfY3ZfbGliXyQxXSlkbmwKK0FTX1ZBUl9QVVNIREVGKFtCb29zdF9saWJfTERGTEFHU10sIFtib29zdF9jdl9saWJfJDFfTERGTEFHU10pZG5sCitBU19WQVJfUFVTSERFRihbQm9vc3RfbGliX0xEUEFUSF0sIFtib29zdF9jdl9saWJfJDFfTERQQVRIXSlkbmwKK0FTX1ZBUl9QVVNIREVGKFtCb29zdF9saWJfTElCU10sIFtib29zdF9jdl9saWJfJDFfTElCU10pZG5sCitCT09TVF9GSU5EX0hFQURFUihbJDRdKQorYm9vc3Rfc2F2ZV9DUFBGTEFHUz0kQ1BQRkxBR1MKK0NQUEZMQUdTPSIkQ1BQRkxBR1MgJEJPT1NUX0NQUEZMQUdTIgorQUNfQ0FDSEVfQ0hFQ0soW2ZvciB0aGUgQm9vc3QgJDEgbGlicmFyeV0sIFtCb29zdF9saWJdLAorICAgICAgICAgICAgICAgW19CT09TVF9GSU5EX0xJQlMoJEApXSkKK2Nhc2UgJEJvb3N0X2xpYiBpbiAjKAorICAobm8pIF9BQ19NU0dfTE9HX0NPTkZURVNUCisgICAgQUNfTVNHX0VSUk9SKFtjYW5ub3QgZmluZCB0aGUgZmxhZ3MgdG8gbGluayB3aXRoIEJvb3N0ICQxXSkKKyAgICA7OworZXNhYworQUNfU1VCU1QoQVNfVFJfQ1BQKFtCT09TVF8kMV9MREZMQUdTXSksIFskQm9vc3RfbGliX0xERkxBR1NdKWRubAorQUNfU1VCU1QoQVNfVFJfQ1BQKFtCT09TVF8kMV9MRFBBVEhdKSwgWyRCb29zdF9saWJfTERQQVRIXSlkbmwKK0FDX1NVQlNUKFtCT09TVF9MRFBBVEhdLCBbJEJvb3N0X2xpYl9MRFBBVEhdKWRubAorQUNfU1VCU1QoQVNfVFJfQ1BQKFtCT09TVF8kMV9MSUJTXSksIFskQm9vc3RfbGliX0xJQlNdKWRubAorQ1BQRkxBR1M9JGJvb3N0X3NhdmVfQ1BQRkxBR1MKK0FTX1ZBUl9QT1BERUYoW0Jvb3N0X2xpYl0pZG5sCitBU19WQVJfUE9QREVGKFtCb29zdF9saWJfTERGTEFHU10pZG5sCitBU19WQVJfUE9QREVGKFtCb29zdF9saWJfTERQQVRIXSlkbmwKK0FTX1ZBUl9QT1BERUYoW0Jvb3N0X2xpYl9MSUJTXSlkbmwKK0FDX0xBTkdfUE9QKFtDKytdKWRubAorZmkKK10pCisKKworIyBCT09TVF9GSU5EX0xJQihbTElCLU5BTUVdLAorIyAgICAgICAgICAgICAgICBbUFJFRkVSUkVELVJULU9QVF0sIFtIRUFERVItTkFNRV0sIFtDWFgtVEVTVF0sCisjICAgICAgICAgICAgICAgIFtDWFgtUFJPTE9HVUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdyYXBwZXIgZm9yIEJPT1NUX0ZJTkRfTElCUy4KK0FDX0RFRlVOKFtCT09TVF9GSU5EX0xJQl0sCitbQk9PU1RfRklORF9MSUJTKFskMV0sICRAKV0pCisKKworIyBfQk9PU1RfRklORF9MSUJTKFtMSUItTkFNRV0sIFtDQU5ESURBVEUtTElCLU5BTUVTXSwKKyMgICAgICAgICAgICAgICAgIFtQUkVGRVJSRUQtUlQtT1BUXSwgW0hFQURFUi1OQU1FXSwgW0NYWC1URVNUXSwKKyMgICAgICAgICAgICAgICAgIFtDWFgtUFJPTE9HVUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBSZWFsIGltcGxlbWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCUzogcmVseSBvbiB0aGVzZSBsb2NhbCBtYWNyb3M6CisjIEJvb3N0X2xpYiwgQm9vc3RfbGliX0xERkxBR1MsIEJvb3N0X2xpYl9MRFBBVEgsIEJvb3N0X2xpYl9MSUJTCisjCisjIFRoZSBhbGdvcml0aG0gaXMgYXMgZm9sbG93czogZmlyc3QgbG9vayBmb3IgYSBnaXZlbiBsaWJyYXJ5IG5hbWUKKyMgYWNjb3JkaW5nIHRvIHRoZSB1c2VyJ3MgUFJFRkVSUkVELVJULU9QVC4gIEZvciBlYWNoIGxpYnJhcnkgbmFtZSwgd2UKKyMgcHJlZmVyIHRvIHVzZSB0aGUgb25lcyB0aGF0IGNhcnJ5IHRoZSB0YWcgKHRvb2xzZXQgbmFtZSkuICBFYWNoCisjIGxpYnJhcnkgaXMgc2VhcmNoZWQgdGhyb3VnaCB0aGUgdmFyaW91cyBzdGFuZGFyZCBwYXRocyB3ZXJlIEJvb3N0IGlzCisjIHVzdWFsbHkgaW5zdGFsbGVkLiAgSWYgd2UgY2FuJ3QgZmluZCB0aGUgc3RhbmRhcmQgdmFyaWFudHMsIHdlIHRyeQorIyB0byBlbmZvcmNlIC1tdCAoZm9yIGluc3RhbmNlIG9uIE1hY09TWCwgbGliYm9vc3RfdGhyZWFkLmR5bGliCisjIGRvZXNuJ3QgZXhpc3QgYnV0IHRoZXJlJ3MgLW9idmlvdXNseS0gbGliYm9vc3RfdGhyZWFkLW10LmR5bGliKS4KK0FDX0RFRlVOKFtfQk9PU1RfRklORF9MSUJTXSwKK1tCb29zdF9saWI9bm8KKyAgY2FzZSAiJDMiIGluICMoCisgICAgKG10IHwgbXQtKSBib29zdF9tdD0tbXQ7IGJvb3N0X3J0b3B0PTs7ICMoCisgICAgKG10KiB8IG10LSopIGJvb3N0X210PS1tdDsgYm9vc3RfcnRvcHQ9YGV4cHIgIlgkMyIgOiAnWG10LSpcKC4qXCknYDs7ICMoCisgICAgKCopIGJvb3N0X210PTsgYm9vc3RfcnRvcHQ9JDM7OworICBlc2FjCisgIGlmIHRlc3QgJGVuYWJsZV9zdGF0aWNfYm9vc3QgPSB5ZXM7IHRoZW4KKyAgICBib29zdF9ydG9wdD0icyRib29zdF9ydG9wdCIKKyAgZmkKKyAgIyBGaW5kIHRoZSBwcm9wZXIgZGVidWcgdmFyaWFudCBkZXBlbmRpbmcgb24gd2hhdCB3ZSd2ZSBiZWVuIGFza2VkIHRvIGZpbmQuCisgIGNhc2UgJGJvb3N0X3J0b3B0IGluICMoCisgICAgKCpkKikgYm9vc3RfcnRfZD0kYm9vc3RfcnRvcHQ7OyAjKAorICAgICgqW1tzZ3BuXV0qKSAjIEluc2VydCB0aGUgYGQnIGF0IHRoZSByaWdodCBwbGFjZSAoaW4gYmV0d2VlbiBgc2cnIGFuZCBgcG4nKQorICAgICAgYm9vc3RfcnRfZD1gZWNobyAiJGJvb3N0X3J0b3B0IiB8IHNlZCAncy9cKHMqZypcKVwocCpuKlwpL1wxXDIvJ2A7OyAjKAorICAgICgqKSBib29zdF9ydF9kPSctZCc7OworICBlc2FjCisgICMgSWYgdGhlIFBSRUZFUlJFRC1SVC1PUFQgYXJlIG5vdCBlbXB0eSwgcHJlcGVuZCBhIGAtJy4KKyAgdGVzdCAtbiAiJGJvb3N0X3J0b3B0IiAmJiBib29zdF9ydG9wdD0iLSRib29zdF9ydG9wdCIKKyAgJGJvb3N0X2d1ZXNzX3VzZV9tdCAmJiBib29zdF9tdD0tbXQKKyAgIyBMb29rIGZvciB0aGUgYWJzIHBhdGggdGhlIHN0YXRpYyBhcmNoaXZlLgorICAjICRsaWJleHQgaXMgY29tcHV0ZWQgYnkgTGlidG9vbCBidXQgbGV0J3MgbWFrZSBzdXJlIGl0J3Mgbm9uIGVtcHR5LgorICB0ZXN0IC16ICIkbGliZXh0IiAmJgorICAgIEFDX01TR19FUlJPUihbdGhlIGxpYmV4dCB2YXJpYWJsZSBpcyBlbXB0eSwgZGlkIHlvdSBpbnZva2UgTGlidG9vbD9dKQorICBib29zdF9zYXZlX2FjX29iamV4dD0kYWNfb2JqZXh0CisgICMgR2VuZXJhdGUgdGhlIHRlc3QgZmlsZS4KKyAgQUNfTEFOR19DT05GVEVTVChbQUNfTEFOR19QUk9HUkFNKFsjaW5jbHVkZSA8JDQ+CiskNl0sIFskNV0pXSkKK2RubCBPcHRpbWl6YXRpb24gaGFja3M6IGNvbXBpbGluZyBDKysgaXMgc2xvdywgZXNwZWNpYWxseSB3aXRoIEJvb3N0LiAgV2hhdAorZG5sIHdlJ3JlIHRyeWluZyB0byBkbyBoZXJlIGlzIGd1ZXNzIHRoZSByaWdodCBjb21iaW5hdGlvbiBvZiBsaW5rIGZsYWdzCitkbmwgKExJQlMgLyBMREZMQUdTKSB0byB1c2UgYSBnaXZlbiBsaWJyYXJ5LiAgVGhpcyBjYW4gdGFrZSBzZXZlcmFsCitkbmwgaXRlcmF0aW9ucyBiZWZvcmUgaXQgc3VjY2VlZHMgYW5kIGlzIHRodXMgKnZlcnkqIHNsb3cuICBTbyB3aGF0IHdlIGRvCitkbmwgaW5zdGVhZCBpcyB0aGF0IHdlIGNvbXBpbGUgdGhlIGNvZGUgZmlyc3QgKGFuZCB0aHVzIGdldCBhbiBvYmplY3QgZmlsZSwKK2RubCB0eXBpY2FsbHkgY29uZnRlc3QubykuICBUaGVuIHdlIHRyeSB2YXJpb3VzIGNvbWJpbmF0aW9ucyBvZiBsaW5rIGZsYWdzCitkbmwgdW50aWwgd2Ugc3VjY2VlZCB0byBsaW5rIGNvbmZ0ZXN0Lm8gaW4gYW4gZXhlY3V0YWJsZS4gIFRoZSBwcm9ibGVtIGlzCitkbmwgdGhhdCB0aGUgdmFyaW91cyBUUllfTElOSyAvIENPTVBJTEVfSUZFTFNFIG1hY3JvcyBvZiBBdXRvY29uZiBhbHdheXMKK2RubCByZW1vdmUgYWxsIHRoZSB0ZW1wb3JhcnkgZmlsZXMgaW5jbHVkaW5nIGNvbmZ0ZXN0Lm8uICBTbyB0aGUgdHJpY2sgaGVyZQorZG5sIGlzIHRvIHRlbXBvcmFyaWx5IGNoYW5nZSB0aGUgdmFsdWUgb2YgYWNfb2JqZXh0IHNvIHRoYXQgY29uZnRlc3QubyBpcworZG5sIHByZXNlcnZlZCBhY2Nyb3NzIHRlc3RzLiAgVGhpcyBpcyBvYnZpb3VzbHkgZnJhZ2lsZSBhbmQgSSB3aWxsIGJ1cm4gaW4KK2RubCBoZWxsIGZvciBub3QgcmVzcGVjdGluZyBBdXRvY29uZidzIGRvY3VtZW50ZWQgaW50ZXJmYWNlcywgYnV0IGluIHRoZQorZG5sIG1lYW4gdGltZSwgaXQgb3B0aW1pemVzIHRoZSBtYWNybyBieSBhIGZhY3RvciBvZiA1IHRvIDMwLgorZG5sIEFub3RoZXIgc21hbGwgb3B0aW1pemF0aW9uOiB0aGUgZmlyc3QgYXJndW1lbnQgb2YgQUNfQ09NUElMRV9JRkVMU0UgbGVmdAorZG5sIGVtcHR5IGJlY2F1c2UgdGhlIHRlc3QgZmlsZSBpcyBnZW5lcmF0ZWQgb25seSBvbmNlIGFib3ZlIChiZWZvcmUgd2UKK2RubCBzdGFydCB0aGUgZm9yIGxvb3BzKS4KKyAgQUNfQ09NUElMRV9JRkVMU0UoW10sCisgICAgW2FjX29iamV4dD1kb19ub3Rfcm1fbWVfcGx6XSwKKyAgICBbQUNfTVNHX0VSUk9SKFtjYW5ub3QgY29tcGlsZSBhIHRlc3QgdGhhdCB1c2VzIEJvb3N0ICQxXSldKQorICBhY19vYmpleHQ9JGJvb3N0X3NhdmVfYWNfb2JqZXh0CisgIGJvb3N0X2ZhaWxlZF9saWJzPQorIyBEb24ndCBib3RoZXIgdG8gaWRlbnQgdGhlIGZvbGxvd2luZyBuZXN0ZWQgZm9yIGxvb3BzLCBvbmx5IHRoZSAyCisjIGlubmVybW9zdCBvbmVzIG1hdHRlci4KK2ZvciBib29zdF9saWJfIGluICQyOyBkbworZm9yIGJvb3N0X3RhZ18gaW4gLSRib29zdF9jdl9saWJfdGFnICcnOyBkbworZm9yIGJvb3N0X3Zlcl8gaW4gLSRib29zdF9jdl9saWJfdmVyc2lvbiAnJzsgZG8KK2ZvciBib29zdF9tdF8gaW4gJGJvb3N0X210IC1tdCAnJzsgZG8KK2ZvciBib29zdF9ydG9wdF8gaW4gJGJvb3N0X3J0b3B0ICcnIC1kOyBkbworICBmb3IgYm9vc3RfbGliIGluIFwKKyAgICBib29zdF8kYm9vc3RfbGliXyRib29zdF90YWdfJGJvb3N0X210XyRib29zdF9ydG9wdF8kYm9vc3RfdmVyXyBcCisgICAgYm9vc3RfJGJvb3N0X2xpYl8kYm9vc3RfdGFnXyRib29zdF9ydG9wdF8kYm9vc3RfdmVyXyBcCisgICAgYm9vc3RfJGJvb3N0X2xpYl8kYm9vc3RfdGFnXyRib29zdF9tdF8kYm9vc3RfdmVyXyBcCisgICAgYm9vc3RfJGJvb3N0X2xpYl8kYm9vc3RfdGFnXyRib29zdF92ZXJfCisgIGRvCisgICAgIyBBdm9pZCB0ZXN0aW5nIHR3aWNlIHRoZSBzYW1lIGxpYgorICAgIGNhc2UgJGJvb3N0X2ZhaWxlZF9saWJzIGluICMoCisgICAgICAoKkAkYm9vc3RfbGliQCopIGNvbnRpbnVlOzsKKyAgICBlc2FjCisgICAgIyBJZiB3aXRoX2Jvb3N0IGlzIGVtcHR5LCB3ZSdsbCBzZWFyY2ggaW4gL2xpYiBmaXJzdCwgd2hpY2ggaXMgbm90IHF1aXRlCisgICAgIyByaWdodCBzbyBpbnN0ZWFkIHdlJ2xsIHRyeSB0byBhIGxvY2F0aW9uIGJhc2VkIG9uIHdoZXJlIHRoZSBoZWFkZXJzIGFyZS4KKyAgICBib29zdF90bXBfbGliPSR3aXRoX2Jvb3N0CisgICAgdGVzdCB4IiR3aXRoX2Jvb3N0IiA9IHggJiYgYm9vc3RfdG1wX2xpYj0ke2Jvb3N0X2N2X2luY19wYXRoJS9pbmNsdWRlfQorICAgIGZvciBib29zdF9sZHBhdGggaW4gIiRib29zdF90bXBfbGliL2xpYiIgJycgXAorICAgICAgICAgICAgIC9vcHQvbG9jYWwvbGliKiAvdXNyL2xvY2FsL2xpYiogL29wdC9saWIqIC91c3IvbGliKiBcCisgICAgICAgICAgICAgIiR3aXRoX2Jvb3N0IiBDOi9Cb29zdC9saWIgL2xpYioKKyAgICBkbworICAgICAgIyBEb24ndCB3YXN0ZSB0aW1lIHdpdGggZGlyZWN0b3JpZXMgdGhhdCBkb24ndCBleGlzdC4KKyAgICAgIGlmIHRlc3QgeCIkYm9vc3RfbGRwYXRoIiAhPSB4ICYmIHRlc3QgISAtZSAiJGJvb3N0X2xkcGF0aCI7IHRoZW4KKyAgICAgICAgY29udGludWUKKyAgICAgIGZpCisgICAgICBib29zdF9zYXZlX0xERkxBR1M9JExERkxBR1MKKyAgICAgICMgQXJlIHdlIGxvb2tpbmcgZm9yIGEgc3RhdGljIGxpYnJhcnk/CisgICAgICBjYXNlICRib29zdF9sZHBhdGg6JGJvb3N0X3J0b3B0XyBpbiAjKAorICAgICAgICAoKj8qOipzKikgIyBZZXMgKE5vbiBlbXB0eSBib29zdF9sZHBhdGggKyBzIGluIHJ0IG9wdCkKKyAgICAgICAgICBCb29zdF9saWJfTElCUz0iJGJvb3N0X2xkcGF0aC9saWIkYm9vc3RfbGliLiRsaWJleHQiCisgICAgICAgICAgdGVzdCAtZSAiJEJvb3N0X2xpYl9MSUJTIiB8fCBjb250aW51ZTs7ICMoCisgICAgICAgICgqKSAjIE5vOiB1c2UgLWxib29zdF9mb28gdG8gZmluZCB0aGUgc2hhcmVkIGxpYnJhcnkuCisgICAgICAgICAgQm9vc3RfbGliX0xJQlM9Ii1sJGJvb3N0X2xpYiI7OworICAgICAgZXNhYworICAgICAgYm9vc3Rfc2F2ZV9MSUJTPSRMSUJTCisgICAgICBMSUJTPSIkQm9vc3RfbGliX0xJQlMgJExJQlMiCisgICAgICB0ZXN0IHgiJGJvb3N0X2xkcGF0aCIgIT0geCAmJiBMREZMQUdTPSIkTERGTEFHUyAtTCRib29zdF9sZHBhdGgiCitkbmwgRmlyc3QgYXJndW1lbnQgb2YgQUNfTElOS19JRkVMU0UgbGVmdCBlbXB0eSBiZWNhdXNlIHRoZSB0ZXN0IGZpbGUgaXMKK2RubCBnZW5lcmF0ZWQgb25seSBvbmNlIGFib3ZlIChiZWZvcmUgd2Ugc3RhcnQgdGhlIGZvciBsb29wcykuCisgICAgICBfQk9PU1RfQUNfTElOS19JRkVMU0UoW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0Jvb3N0X2xpYj15ZXNdLCBbQm9vc3RfbGliPW5vXSkKKyAgICAgIGFjX29iamV4dD0kYm9vc3Rfc2F2ZV9hY19vYmpleHQKKyAgICAgIExERkxBR1M9JGJvb3N0X3NhdmVfTERGTEFHUworICAgICAgTElCUz0kYm9vc3Rfc2F2ZV9MSUJTCisgICAgICBpZiB0ZXN0IHgiJEJvb3N0X2xpYiIgPSB4eWVzOyB0aGVuCisgICAgICAgICMgQ2hlY2sgb3IgdXNlZCBjYWNoZWQgcmVzdWx0IG9mIHdoZXRoZXIgb3Igbm90IHVzaW5nIC1SIG9yCisgICAgICAgICMgLXJwYXRoIG1ha2VzIHNlbnNlLiAgU29tZSBpbXBsZW1lbnRhdGlvbnMgb2YgbGQsIHN1Y2ggYXMgZm9yCisgICAgICAgICMgTWFjIE9TWCwgcmVxdWlyZSAtcnBhdGggYnV0IC1SIGlzIHRoZSBmbGFnIGtub3duIHRvIHdvcmsgb24KKyAgICAgICAgIyBvdGhlciBzeXN0ZW1zLiAgaHR0cHM6Ly9naXRodWIuY29tL3RzdW5hL2Jvb3N0Lm00L2lzc3Vlcy8xOQorICAgICAgICBBQ19DQUNIRV9WQUwoW2Jvb3N0X2N2X3JwYXRoX2xpbmtfbGRmbGFnXSwKKyAgICAgICAgICBbY2FzZSAkYm9vc3RfbGRwYXRoIGluCisgICAgICAgICAgICcnKSAjIE5vdGhpbmcgdG8gZG8uCisgICAgICAgICAgICAgYm9vc3RfY3ZfcnBhdGhfbGlua19sZGZsYWc9CisgICAgICAgICAgICAgYm9vc3RfcnBhdGhfbGlua19sZGZsYWdfZm91bmQ9eWVzOzsKKyAgICAgICAgICAgKikKKyAgICAgICAgICAgIGZvciBib29zdF9jdl9ycGF0aF9saW5rX2xkZmxhZyBpbiAtV2wsLVIsIC1XbCwtcnBhdGgsOyBkbworICAgICAgICAgICAgICBMREZMQUdTPSIkYm9vc3Rfc2F2ZV9MREZMQUdTIC1MJGJvb3N0X2xkcGF0aCAkYm9vc3RfY3ZfcnBhdGhfbGlua19sZGZsYWckYm9vc3RfbGRwYXRoIgorICAgICAgICAgICAgICBMSUJTPSIkYm9vc3Rfc2F2ZV9MSUJTICRCb29zdF9saWJfTElCUyIKKyAgICAgICAgICAgICAgX0JPT1NUX0FDX0xJTktfSUZFTFNFKFtdLAorICAgICAgICAgICAgICAgIFtib29zdF9ycGF0aF9saW5rX2xkZmxhZ19mb3VuZD15ZXMKKyAgICAgICAgICAgICAgICBicmVha10sCisgICAgICAgICAgICAgICAgW2Jvb3N0X3JwYXRoX2xpbmtfbGRmbGFnX2ZvdW5kPW5vXSkKKyAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgIDs7CisgICAgICAgICAgZXNhYworICAgICAgICAgIEFTX0lGKFt0ZXN0ICJ4JGJvb3N0X3JwYXRoX2xpbmtfbGRmbGFnX2ZvdW5kIiAhPSAieHllcyJdLAorICAgICAgICAgICAgW0FDX01TR19FUlJPUihbVW5hYmxlIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHVzZSAtUiBvciAtcnBhdGhdKV0pCisgICAgICAgICAgTERGTEFHUz0kYm9vc3Rfc2F2ZV9MREZMQUdTCisgICAgICAgICAgTElCUz0kYm9vc3Rfc2F2ZV9MSUJTCisgICAgICAgICAgXSkKKyAgICAgICAgdGVzdCB4IiRib29zdF9sZHBhdGgiICE9IHggJiYKKyAgICAgICAgICBCb29zdF9saWJfTERGTEFHUz0iLUwkYm9vc3RfbGRwYXRoICRib29zdF9jdl9ycGF0aF9saW5rX2xkZmxhZyRib29zdF9sZHBhdGgiCisgICAgICAgIEJvb3N0X2xpYl9MRFBBVEg9IiRib29zdF9sZHBhdGgiCisgICAgICAgIGJyZWFrIDcKKyAgICAgIGVsc2UKKyAgICAgICAgYm9vc3RfZmFpbGVkX2xpYnM9IiRib29zdF9mYWlsZWRfbGlic0AkYm9vc3RfbGliQCIKKyAgICAgIGZpCisgICAgZG9uZQorICBkb25lCitkb25lCitkb25lCitkb25lCitkb25lCitkb25lICMgYm9vc3RfbGliXworcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorXSkKKworCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKKyMgQ2hlY2tzIGZvciB0aGUgdmFyaW91cyBCb29zdCBsaWJyYXJpZXMuICMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKKworIyBMaXN0IG9mIGJvb3N0IGxpYnJhcmllczogaHR0cDovL3d3dy5ib29zdC5vcmcvbGlicy9saWJyYXJpZXMuaHRtCisjIFRoZSBwYWdlIGh0dHA6Ly9iZXRhLmJvb3N0Lm9yZy9kb2MvbGlicyBpcyB1c2VmdWw6IGl0IGdpdmVzIHRoZSBmaXJzdCByZWxlYXNlCisjIHZlcnNpb24gb2YgZWFjaCBsaWJyYXJ5IChhbW9uZyBvdGhlciB0aGluZ3MpLgorCisjIEJPT1NUX0RFRlVOKExJQlJBUlksIENPREUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlZmluZSBCT09TVF88TElCUkFSWS1VUFBFUkNBU0U+IGFzIGEgbWFjcm8gdGhhdCBydW5zIENPREUuCisjCisjIFVzZSBpbmRpciB0byBhdm9pZCB0aGUgd2FybmluZyBvbiB1bmRlcnF1b3RlZCBtYWNybyBuYW1lIGdpdmVuIHRvIEFDX0RFRlVOLgorbTRfZGVmaW5lKFtCT09TVF9ERUZVTl0sCitbbTRfaW5kaXIoW0FDX0RFRlVOXSwKKyAgICAgICAgICBtNF90b3VwcGVyKFtCT09TVF8kMV0pLAorW200X3B1c2hkZWYoW0JPT1NUX0xpYnJhcnldLCBbJDFdKWRubAorJDIKK200X3BvcGRlZihbQk9PU1RfTGlicmFyeV0pZG5sCitdKQorXSkKKworIyBCT09TVF9BUlJBWSgpCisjIC0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuQXJyYXkKK0JPT1NUX0RFRlVOKFtBcnJheV0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L2FycmF5LmhwcF0pXSkKKworCisjIEJPT1NUX0FTSU8oKQorIyAtLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuQXNpbyAobmV3IGluIEJvb3N0IDEuMzUpLgorQk9PU1RfREVGVU4oW0FzaW9dLAorW0FDX1JFUVVJUkUoW0JPT1NUX1NZU1RFTV0pZG5sCitCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvYXNpby5ocHBdKV0pCisKKworIyBCT09TVF9CSU5EKCkKKyMgLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkJpbmQuCitCT09TVF9ERUZVTihbQmluZF0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L2JpbmQuaHBwXSldKQorCisKKyMgQk9PU1RfQ0hST05PKCkKKyMgLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuQ2hyb25vLgorQk9PU1RfREVGVU4oW0Nocm9ub10sCitbIyBEbyB3ZSBoYXZlIHRvIGNoZWNrIGZvciBCb29zdC5TeXN0ZW0/ICBUaGlzIGxpbmstdGltZSBkZXBlbmRlbmN5IHdhcworIyBhZGRlZCBhcyBvZiAxLjM1LjAuICBJZiB3ZSBoYXZlIGEgdmVyc2lvbiA8MS4zNSwgd2UgbXVzdCBub3QgYXR0ZW1wdCB0bworIyBmaW5kIEJvb3N0LlN5c3RlbSBhcyBpdCBkaWRuJ3QgZXhpc3QgYnkgdGhlbi4KK2lmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWdlIDEzNTsgdGhlbgorICBCT09TVF9TWVNURU0oWyQxXSkKK2ZpICMgZW5kIG9mIHRoZSBCb29zdC5TeXN0ZW0gY2hlY2suCitib29zdF9maWxlc3lzdGVtX3NhdmVfTElCUz0kTElCUworYm9vc3RfZmlsZXN5c3RlbV9zYXZlX0xERkxBR1M9JExERkxBR1MKK200X3BhdHRlcm5fYWxsb3coW15CT09TVF9TWVNURU1fKExJQlN8TERGTEFHUykkXSlkbmwKK0xJQlM9IiRMSUJTICRCT09TVF9TWVNURU1fTElCUyIKK0xERkxBR1M9IiRMREZMQUdTICRCT09TVF9TWVNURU1fTERGTEFHUyIKK0JPT1NUX0ZJTkRfTElCKFtjaHJvbm9dLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9jaHJvbm8uaHBwXSwKKyAgICAgICAgICAgICAgICBbYm9vc3Q6OmNocm9ubzo6dGhyZWFkX2Nsb2NrIGQ7XSkKK2lmIHRlc3QgJGVuYWJsZV9zdGF0aWNfYm9vc3QgPSB5ZXMgJiYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtZ2UgMTM1OyB0aGVuCisgIEJPT1NUX0NIUk9OT19MSUJTPSIkQk9PU1RfQ0hST05PX0xJQlMgJEJPT1NUX1NZU1RFTV9MSUJTIgorZmkKK0xJQlM9JGJvb3N0X2ZpbGVzeXN0ZW1fc2F2ZV9MSUJTCitMREZMQUdTPSRib29zdF9maWxlc3lzdGVtX3NhdmVfTERGTEFHUworXSkjIEJPT1NUX0NIUk9OTworCisKKyMgQk9PU1RfQ09OVEVYVChbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkNvbnRleHQuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorIworIyAqIFRoaXMgbGlicmFyeSB3YXMgaW50cm9kdWNlZCBpbiBCb29zdCAxLjUxLjAKKyMgKiBUaGUgc2lnbmF0dXJlcyBvZiBtYWtlX2Zjb250ZXh0KCkgYW5kIGp1bXBfZmNvbnRleHQgd2VyZSBjaGFuZ2VkIGluIDEuNTYuMAorIyAqIEEgZGVwZW5kZW5jeSBvbiBib29zdF90aHJlYWQgYXBwZWFycyBpbiAxLjU3LjAKK0JPT1NUX0RFRlVOKFtDb250ZXh0XSwKK1tib29zdF9jb250ZXh0X3NhdmVfTElCUz0kTElCUworIGJvb3N0X2NvbnRleHRfc2F2ZV9MREZMQUdTPSRMREZMQUdTCitpZiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxNTc7IHRoZW4KKyAgQk9PU1RfVEhSRUFEKFskMV0pCisgIG00X3BhdHRlcm5fYWxsb3coW15CT09TVF9USFJFQURfKExJQlN8TERGTEFHUykkXSlkbmwKKyAgTElCUz0iJExJQlMgJEJPT1NUX1RIUkVBRF9MSUJTIgorICBMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfVEhSRUFEX0xERkxBR1MiCitmaQorQk9PU1RfRklORF9MSUIoW2NvbnRleHRdLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9jb250ZXh0L2FsbC5ocHBdLFtbCisKKy8vIGNyZWF0ZXMgYSBzdGFjawordm9pZCAqIHN0YWNrX3BvaW50ZXIgPSBuZXcgdm9pZCpbNDA5Nl07CitzdGQ6OnNpemVfdCBjb25zdCBzaXplID0gc2l6ZW9mKHZvaWQqWzQwOTZdKTsKKworI2lmIEJPT1NUX1ZFUlNJT04gPD0gMTA1MTAwCitjdHg6Om1ha2VfZmNvbnRleHQoJmZjLCBmKTsKK3JldHVybiBjdHg6Omp1bXBfZmNvbnRleHQoJmZjbSwgJmZjLCAzKSA9PSA2OworCisjZWxzZQorCitmYyA9IGN0eDo6bWFrZV9mY29udGV4dChzdGFja19wb2ludGVyLCBzaXplLCBmKTsKK3JldHVybiBjdHg6Omp1bXBfZmNvbnRleHQoJmZjbSwgZmMsIDMpID09IDY7CisKKyNlbmRpZgorCisKK11dLFtkbmwKKworI2luY2x1ZGUgPGJvb3N0L3ZlcnNpb24uaHBwPgorI2lmIEJPT1NUX1ZFUlNJT04gPD0gMTA1MTAwCisKK25hbWVzcGFjZSBjdHggPSBib29zdDo6Y3R4OworCitzdGF0aWMgY3R4OjpmY29udGV4dF90IGZjbSwgZmM7CisKK3N0YXRpYyB2b2lkIGYoaW50cHRyX3QgaSkgeworICAgIGN0eDo6anVtcF9mY29udGV4dCgmZmMsICZmY20sIGkgKiAyKTsKK30KKworI2VsaWYgQk9PU1RfVkVSU0lPTiA8PSAxMDU1MDAKKworbmFtZXNwYWNlIGN0eCA9IGJvb3N0Ojpjb250ZXh0OworCisvLyBjb250ZXh0CitzdGF0aWMgY3R4OjpmY29udGV4dF90IGZjbSwgKmZjOworCisvLyBjb250ZXh0LWZ1bmN0aW9uCitzdGF0aWMgdm9pZCBmKGludHB0cl90IGkpIHsKKyAgICBjdHg6Omp1bXBfZmNvbnRleHQoZmMsICZmY20sIGkgKiAyKTsKK30KKworI2Vsc2UKKworbmFtZXNwYWNlIGN0eCA9IGJvb3N0Ojpjb250ZXh0OworCisvLyBjb250ZXh0CitzdGF0aWMgY3R4OjpmY29udGV4dF90IGZjbSwgZmM7CisKKy8vIGNvbnRleHQtZnVuY3Rpb24KK3N0YXRpYyB2b2lkIGYoaW50cHRyX3QgaSkgeworICAgIGN0eDo6anVtcF9mY29udGV4dCgmZmMsIGZjbSwgaSAqIDIpOworfQorI2VuZGlmCitdKQorTElCUz0kYm9vc3RfY29udGV4dF9zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X2NvbnRleHRfc2F2ZV9MREZMQUdTCitdKSMgQk9PU1RfQ09OVEVYVAorCisKKyMgQk9PU1RfQ09OVkVSU0lPTigpCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5Db252ZXJzaW9uIChjYXN0IC8gbGV4aWNhbF9jYXN0KQorQk9PU1RfREVGVU4oW0NvbnZlcnNpb25dLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9jYXN0LmhwcF0pCitCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvbGV4aWNhbF9jYXN0LmhwcF0pCitdKSMgQk9PU1RfQ09OVkVSU0lPTgorCisKKyMgQk9PU1RfQ09ST1VUSU5FKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuQ29yb3V0aW5lLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsIHNlZSB0aGUKKyMgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4gIFRoaXMgbGlicmFyeSB3YXMgaW50cm9kdWNlZCBpbiBCb29zdAorIyAxLjUzLjAKK0JPT1NUX0RFRlVOKFtDb3JvdXRpbmVdLAorWworYm9vc3RfY29yb3V0aW5lX3NhdmVfTElCUz0kTElCUworYm9vc3RfY29yb3V0aW5lX3NhdmVfTERGTEFHUz0kTERGTEFHUworIyBMaW5rLXRpbWUgZGVwZW5kZW5jeSBmcm9tIGNvcm91dGluZSB0byBjb250ZXh0CitCT09TVF9DT05URVhUKFskMV0pCisjIFN0YXJ0aW5nIGZyb20gQm9vc3QgMS41NSBhIGRlcGVuZGVuY3kgb24gQm9vc3QuU3lzdGVtIGlzIGFkZGVkCitpZiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxNTU7IHRoZW4KKyAgQk9PU1RfU1lTVEVNKFskMV0pCitmaQorbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUXyhDT05URVhUfFNZU1RFTSlfKExJQlN8TERGTEFHUyldKQorTElCUz0iJExJQlMgJEJPT1NUX0NPTlRFWFRfTElCUyAkQk9PU1RfU1lTVEVNX0xJQlMiCitMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfQ09OVEVYVF9MREZMQUdTIgorCisjIGluIDEuNTMgY29yb3V0aW5lIHdhcyBhIGhlYWRlciBvbmx5IGxpYnJhcnkKK2lmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWVxIDE1MzsgdGhlbgorICBCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvY29yb3V0aW5lL2Nvcm91dGluZS5ocHBdKQorZWxzZQorICBCT09TVF9GSU5EX0xJQihbY29yb3V0aW5lXSwgWyQxXSwKKwkJICBbYm9vc3QvY29yb3V0aW5lL2Nvcm91dGluZS5ocHBdLAorCQkgIFsKKyAgI2luY2x1ZGUgPGJvb3N0L3ZlcnNpb24uaHBwPgorICAjaWYgICBCT09TVF9WRVJTSU9OIDw9IDEwNTUwMAorICBib29zdDo6Y29yb3V0aW5lczo6Y29yb3V0aW5lPGludChpbnQpPiBjb3JvOyBjb3JvLmdldCgpOworICAjZWxzZQorICBib29zdDo6Y29yb3V0aW5lczo6YXN5bW1ldHJpY19jb3JvdXRpbmU8aW50Pjo6cHVsbF90eXBlIGNvcm87IGNvcm8uZ2V0KCk7CisgICNlbmRpZgorICBdKQorZmkKKyMgTGluay10aW1lIGRlcGVuZGVuY3kgZnJvbSBjb3JvdXRpbmUgdG8gY29udGV4dCwgZXhpc3RlZCBvbmx5IGluIDEuNTMsIGluIDEuNTQKKyMgY29yb3V0aW5lIGRvZXNuJ3QgdXNlIGNvbnRleHQgZnJvbSBpdHMgaGVhZGVycyBidXQgZnJvbSBpdHMgbGlicmFyeS4KK2lmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWVxIDE1MyB8fCB0ZXN0ICRlbmFibGVfc3RhdGljX2Jvb3N0ID0geWVzICYmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWdlIDE1NDsgdGhlbgorICBCT09TVF9DT1JPVVRJTkVfTElCUz0iJEJPT1NUX0NPUk9VVElORV9MSUJTICRCT09TVF9DT05URVhUX0xJQlMiCisgIEJPT1NUX0NPUk9VVElORV9MREZMQUdTPSIkQk9PU1RfQ09ST1VUSU5FX0xERkxBR1MgJEJPT1NUX0NPTlRFWFRfTERGTEFHUyIKK2ZpCitpZiB0ZXN0ICRlbmFibGVfc3RhdGljX2Jvb3N0ID0geWVzICYmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWdlIDE1NTsgdGhlbgorICBCT09TVF9DT1JPVVRJTkVfTElCUz0iJEJPT1NUX0NPUk9VVElORV9MSUJTICRCT09TVF9TWVNURU1fTElCUyIKKyAgQk9PU1RfQ09ST1VUSU5FX0xERkxBR1M9IiRCT09TVF9DT1JPVVRJTkVfTERGTEFHUyAkQk9PU1RfU1lTVEVNX0xERkxBR1MiCitmaQorTElCUz0kYm9vc3RfY29yb3V0aW5lX3NhdmVfTElCUworTERGTEFHUz0kYm9vc3RfY29yb3V0aW5lX3NhdmVfTERGTEFHUworXSkjIEJPT1NUX0NPUk9VVElORQorCisKKyMgQk9PU1RfQ1JDKCkKKyMgLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuQ1JDCitCT09TVF9ERUZVTihbQ1JDXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvY3JjLmhwcF0pCitdKSMgQk9PU1RfQ1JDCisKKworIyBCT09TVF9EQVRFX1RJTUUoW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5EYXRlX1RpbWUuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW0RhdGVfVGltZV0sCitbQk9PU1RfRklORF9MSUIoW2RhdGVfdGltZV0sIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L2RhdGVfdGltZS9wb3NpeF90aW1lL3Bvc2l4X3RpbWUuaHBwXSwKKyAgICAgICAgICAgICAgICBbYm9vc3Q6OnBvc2l4X3RpbWU6OnB0aW1lIHQ7XSkKK10pIyBCT09TVF9EQVRFX1RJTUUKKworCisjIEJPT1NUX0ZJTEVTWVNURU0oW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuRmlsZXN5c3RlbS4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUKKyMgdGhlIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCisjIERvIG5vdCBjaGVjayBmb3IgYm9vc3QvZmlsZXN5c3RlbS5ocHAgYmVjYXVzZSB0aGlzIGZpbGUgd2FzIGludHJvZHVjZWQgaW4KKyMgMS4zNC4KK0JPT1NUX0RFRlVOKFtGaWxlc3lzdGVtXSwKK1sjIERvIHdlIGhhdmUgdG8gY2hlY2sgZm9yIEJvb3N0LlN5c3RlbT8gIFRoaXMgbGluay10aW1lIGRlcGVuZGVuY3kgd2FzCisjIGFkZGVkIGFzIG9mIDEuMzUuMC4gIElmIHdlIGhhdmUgYSB2ZXJzaW9uIDwxLjM1LCB3ZSBtdXN0IG5vdCBhdHRlbXB0IHRvCisjIGZpbmQgQm9vc3QuU3lzdGVtIGFzIGl0IGRpZG4ndCBleGlzdCBieSB0aGVuLgoraWYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtZ2UgMTM1OyB0aGVuCisgIEJPT1NUX1NZU1RFTShbJDFdKQorZmkgIyBlbmQgb2YgdGhlIEJvb3N0LlN5c3RlbSBjaGVjay4KK2Jvb3N0X2ZpbGVzeXN0ZW1fc2F2ZV9MSUJTPSRMSUJTCitib29zdF9maWxlc3lzdGVtX3NhdmVfTERGTEFHUz0kTERGTEFHUworbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX1NZU1RFTV8oTElCU3xMREZMQUdTKSRdKWRubAorTElCUz0iJExJQlMgJEJPT1NUX1NZU1RFTV9MSUJTIgorTERGTEFHUz0iJExERkxBR1MgJEJPT1NUX1NZU1RFTV9MREZMQUdTIgorQk9PU1RfRklORF9MSUIoW2ZpbGVzeXN0ZW1dLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9maWxlc3lzdGVtL3BhdGguaHBwXSwgW2Jvb3N0OjpmaWxlc3lzdGVtOjpwYXRoIHA7XSkKK2lmIHRlc3QgJGVuYWJsZV9zdGF0aWNfYm9vc3QgPSB5ZXMgJiYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtZ2UgMTM1OyB0aGVuCisgIEJPT1NUX0ZJTEVTWVNURU1fTElCUz0iJEJPT1NUX0ZJTEVTWVNURU1fTElCUyAkQk9PU1RfU1lTVEVNX0xJQlMiCitmaQorTElCUz0kYm9vc3RfZmlsZXN5c3RlbV9zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X2ZpbGVzeXN0ZW1fc2F2ZV9MREZMQUdTCitdKSMgQk9PU1RfRklMRVNZU1RFTQorCisKKyMgQk9PU1RfRkxZV0VJR0hUKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuRmx5d2VpZ2h0LgorQk9PU1RfREVGVU4oW0ZseXdlaWdodF0sCitbZG5sIFRoZXJlJ3MgYSBoaWRkZW4gZGVwZW5kZW5jeSBvbiBwdGhyZWFkcy4KK0FDX1JFUVVJUkUoW19CT09TVF9QVEhSRUFEX0ZMQUddKWRubAorQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L2ZseXdlaWdodC5ocHBdKQorQUNfU1VCU1QoW0JPT1NUX0ZMWVdFSUdIVF9MSUJTXSwgWyRib29zdF9jdl9wdGhyZWFkX2ZsYWddKQorXSkKKworCisjIEJPT1NUX0ZPUkVBQ0goKQorIyAtLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuRm9yZWFjaC4KK0JPT1NUX0RFRlVOKFtGb3JlYWNoXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvZm9yZWFjaC5ocHBdKV0pCisKKworIyBCT09TVF9GT1JNQVQoKQorIyAtLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5Gb3JtYXQuCisjIE5vdGU6IHdlIGNhbid0IGNoZWNrIGZvciBib29zdC9mb3JtYXQvZm9ybWF0X2Z3ZC5ocHAgYmVjYXVzZSB0aGUgaGVhZGVyIGlzbid0CisjIHN0YW5kYWxvbmUuICBJdCBjYW4ndCBiZSBjb21waWxlZCBiZWNhdXNlIGl0IHRyaWdnZXJzIHRoZSBmb2xsb3dpbmcgZXJyb3I6CisjIGJvb3N0L2Zvcm1hdC9kZXRhaWwvY29uZmlnX21hY3Jvcy5ocHA6ODg6IGVycm9yOiAnbG9jYWxlJyBpbiBuYW1lc3BhY2UgJ3N0ZCcKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZXMgbm90IG5hbWUgYSB0eXBlCitCT09TVF9ERUZVTihbRm9ybWF0XSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvZm9ybWF0LmhwcF0pXSkKKworCisjIEJPT1NUX0ZVTkNUSU9OKCkKKyMgLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5GdW5jdGlvbgorQk9PU1RfREVGVU4oW0Z1bmN0aW9uXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvZnVuY3Rpb24uaHBwXSldKQorCisKKyMgQk9PU1RfR0VPTUVUUlkoKQorIyAtLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0Lkdlb21ldHJ5IChuZXcgc2luY2UgMS40Ny4wKS4KK0JPT1NUX0RFRlVOKFtHZW9tZXRyeV0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L2dlb21ldHJ5LmhwcF0pCitdKSMgQk9PU1RfR0VPTUVUUlkKKworCisjIEJPT1NUX0dSQVBIKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5HcmFwaHMuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW0dyYXBoXSwKK1tib29zdF9ncmFwaF9zYXZlX0xJQlM9JExJQlMKK2Jvb3N0X2dyYXBoX3NhdmVfTERGTEFHUz0kTERGTEFHUworIyBMaW5rLXRpbWUgZGVwZW5kZW5jeSBmcm9tIGdyYXBoIHRvIHJlZ2V4IHdhcyBhZGRlZCBhcyBvZiAxLjQwLjAuCitpZiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxNDA7IHRoZW4KKyAgQk9PU1RfUkVHRVgoWyQxXSkKKyAgbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX1JFR0VYXyhMSUJTfExERkxBR1MpJF0pZG5sCisgIExJQlM9IiRMSUJTICRCT09TVF9SRUdFWF9MSUJTIgorICBMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfUkVHRVhfTERGTEFHUyIKK2ZpCitCT09TVF9GSU5EX0xJQihbZ3JhcGhdLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9ncmFwaC9hZGphY2VuY3lfbGlzdC5ocHBdLCBbYm9vc3Q6OmFkamFjZW5jeV9saXN0PD4gZztdKQorTElCUz0kYm9vc3RfZ3JhcGhfc2F2ZV9MSUJTCitMREZMQUdTPSRib29zdF9ncmFwaF9zYXZlX0xERkxBR1MKK10pIyBCT09TVF9HUkFQSAorCisKKyMgQk9PU1RfSU9TVFJFQU1TKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuSU9TdHJlYW1zLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsIHNlZSB0aGUKKyMgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4KK0JPT1NUX0RFRlVOKFtJT1N0cmVhbXNdLAorW0JPT1NUX0ZJTkRfTElCKFtpb3N0cmVhbXNdLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9pb3N0cmVhbXMvZGV2aWNlL2ZpbGVfZGVzY3JpcHRvci5ocHBdLAorICAgICAgICAgICAgICAgIFtib29zdDo6aW9zdHJlYW1zOjpmaWxlX2Rlc2NyaXB0b3IgZmQ7IGZkLmNsb3NlKCk7XSkKK10pIyBCT09TVF9JT1NUUkVBTVMKKworCisjIEJPT1NUX0hBU0goKQorIyAtLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuRnVuY3Rpb25hbC9IYXNoCitCT09TVF9ERUZVTihbSGFzaF0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L2Z1bmN0aW9uYWwvaGFzaC5ocHBdKV0pCisKKworIyBCT09TVF9MQU1CREEoKQorIyAtLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5MYW1iZGEKK0JPT1NUX0RFRlVOKFtMYW1iZGFdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9sYW1iZGEvbGFtYmRhLmhwcF0pXSkKKworCisjIEJPT1NUX0xPQ0FMRSgpCisjIC0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkxvY2FsZQorQk9PU1RfREVGVU4oW0xvY2FsZV0sCitbCitib29zdF9sb2NhbGVfc2F2ZV9MSUJTPSRMSUJTCitib29zdF9sb2NhbGVfc2F2ZV9MREZMQUdTPSRMREZMQUdTCisjIHJlcXVpcmUgU1lTVEVNIGZvciBib29zdC0xLjUwLjAgYW5kIHVwCitpZiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxNTA7IHRoZW4KKyAgQk9PU1RfU1lTVEVNKFskMV0pCisgIG00X3BhdHRlcm5fYWxsb3coW15CT09TVF9TWVNURU1fKExJQlN8TERGTEFHUykkXSlkbmwKKyAgTElCUz0iJExJQlMgJEJPT1NUX1NZU1RFTV9MSUJTIgorICBMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfU1lTVEVNX0xERkxBR1MiCitmaSAjIGVuZCBvZiB0aGUgQm9vc3QuU3lzdGVtIGNoZWNrLgorQk9PU1RfRklORF9MSUIoW2xvY2FsZV0sIFskMV0sCisgICAgW2Jvb3N0L2xvY2FsZS5ocHBdLAorICAgIFtbYm9vc3Q6OmxvY2FsZTo6Z2VuZXJhdG9yIGdlbjsgc3RkOjpsb2NhbGU6Omdsb2JhbChnZW4oIiIpKTtdXSkKK0xJQlM9JGJvb3N0X2xvY2FsZV9zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X2xvY2FsZV9zYXZlX0xERkxBR1MKK10pIyBCT09TVF9MT0NBTEUKKworIyBCT09TVF9MT0coW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5Mb2cuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW0xvZ10sCitbYm9vc3RfbG9nX3NhdmVfTElCUz0kTElCUworYm9vc3RfbG9nX3NhdmVfTERGTEFHUz0kTERGTEFHUworQk9PU1RfU1lTVEVNKFskMV0pCitCT09TVF9GSUxFU1lTVEVNKFskMV0pCitCT09TVF9EQVRFX1RJTUUoWyQxXSkKK200X3BhdHRlcm5fYWxsb3coW15CT09TVF8oU1lTVEVNfEZJTEVTWVNURU18REFURV9USU1FKV8oTElCU3xMREZMQUdTKSRdKWRubAorTElCUz0iJExJQlMgJEJPT1NUX0RBVEVfVElNRV9MSUJTICRCT09TVF9GSUxFU1lTVEVNX0xJQlMgJEJPT1NUX1NZU1RFTV9MSUJTIgorTERGTEFHUz0iJExERkxBR1MgJEJPT1NUX0RBVEVfVElNRV9MREZMQUdTICRCT09TVF9GSUxFU1lTVEVNX0xERkxBR1MgJEJPT1NUX1NZU1RFTV9MREZMQUdTIgorQk9PU1RfRklORF9MSUIoW2xvZ10sIFskMV0sCisgICAgW2Jvb3N0L2xvZy9jb3JlL2NvcmUuaHBwXSwKKyAgICBbYm9vc3Q6OmxvZzo6YXR0cmlidXRlIGE7IGEuZ2V0X3ZhbHVlKCk7XSkKK0xJQlM9JGJvb3N0X2xvZ19zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X2xvZ19zYXZlX0xERkxBR1MKK10pIyBCT09TVF9MT0cKKworCisjIEJPT1NUX0xPR19TRVRVUChbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkxvZy4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbTG9nX1NldHVwXSwKK1tib29zdF9sb2dfc2V0dXBfc2F2ZV9MSUJTPSRMSUJTCitib29zdF9sb2dfc2V0dXBfc2F2ZV9MREZMQUdTPSRMREZMQUdTCitCT09TVF9MT0coWyQxXSkKK200X3BhdHRlcm5fYWxsb3coW15CT09TVF9MT0dfKExJQlN8TERGTEFHUykkXSlkbmwKK0xJQlM9IiRMSUJTICRCT09TVF9MT0dfTElCUyIKK0xERkxBR1M9IiRMREZMQUdTICRCT09TVF9MT0dfTERGTEFHUyIKK0JPT1NUX0ZJTkRfTElCKFtsb2dfc2V0dXBdLCBbJDFdLAorICAgIFtib29zdC9sb2cvdXRpbGl0eS9zZXR1cC9mcm9tX3NldHRpbmdzLmhwcF0sCisgICAgW2Jvb3N0Ojpsb2c6OmJhc2ljX3NldHRpbmdzPGNoYXI+IGJzOyBicy5lbXB0eSgpO10pCitMSUJTPSRib29zdF9sb2dfc2V0dXBfc2F2ZV9MSUJTCitMREZMQUdTPSRib29zdF9sb2dfc2V0dXBfc2F2ZV9MREZMQUdTCitdKSMgQk9PU1RfTE9HX1NFVFVQCisKKworIyBCT09TVF9NQVRIKCkKKyMgLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0Lk1hdGgKKyMgVE9ETzogVGhpcyBsaWJyYXJ5IGlzbid0IGhlYWRlci1vbmx5IGJ1dCBpdCBjb21lcyBpbiBtdWx0aXBsZSBkaWZmZXJlbnQKKyMgZmxhdm9ycyB0aGF0IGRvbid0IHBsYXkgd2VsbCB3aXRoIEJPT1NUX0ZJTkRfTElCIChlLmcsIGxpYmJvb3N0X21hdGhfYzk5LAorIyBsaWJib29zdF9tYXRoX2M5OWYsIGxpYmJvb3N0X21hdGhfYzk5bCwgbGliYm9vc3RfbWF0aF90cjEsCisjIGxpYmJvb3N0X21hdGhfdHIxZiwgbGliYm9vc3RfbWF0aF90cjFsKS4gIFRoaXMgbWFjcm8gbXVzdCBiZSBmaXhlZCB0byBkbyB0aGUKKyMgcmlnaHQgdGhpbmcgYW55d2F5LgorQk9PU1RfREVGVU4oW01hdGhdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9tYXRoL3NwZWNpYWxfZnVuY3Rpb25zLmhwcF0pXSkKKworCisjIEJPT1NUX01QSShbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QgTVBJLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsIHNlZSB0aGUKKyMgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4gIFVzZXMgTVBJQ1hYIHZhcmlhYmxlIGlmIGl0IGlzCisjIHNldCwgb3RoZXJ3aXNlIHRyaWVzIENYWAorIworQk9PU1RfREVGVU4oW01QSV0sCitbYm9vc3Rfc2F2ZV9DWFg9JHtDWFh9Citib29zdF9zYXZlX0NYWENQUD0ke0NYWENQUH0KK2lmIHRlc3QgeCIke01QSUNYWH0iICE9IHg7IHRoZW4KKyAgQ1hYPSR7TVBJQ1hYfQorICBDWFhDUFA9IiR7TVBJQ1hYfSAtRSIKK2ZpCitCT09TVF9GSU5EX0xJQihbbXBpXSwgWyQxXSwKKyAgICAgICAgICAgICAgIFtib29zdC9tcGkuaHBwXSwKKyAgICAgICAgICAgICAgIFtpbnQgYXJnYyA9IDA7CisgICAgICAgICAgICAgICAgY2hhciAqKmFyZ3YgPSAwOworICAgICAgICAgICAgICAgIGJvb3N0OjptcGk6OmVudmlyb25tZW50IGVudihhcmdjLGFyZ3YpO10pCitDWFg9JHtib29zdF9zYXZlX0NYWH0KK0NYWENQUD0ke2Jvb3N0X3NhdmVfQ1hYQ1BQfQorXSkjIEJPT1NUX01QSQorCisKKyMgQk9PU1RfTVVMVElBUlJBWSgpCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5NdWx0aUFycmF5CitCT09TVF9ERUZVTihbTXVsdGlBcnJheV0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L211bHRpX2FycmF5LmhwcF0pXSkKKworCisjIEJPT1NUX05VTUVSSUNfVUJMQVMoKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5OdW1lcmljVWJsYXMgKEJhc2ljIExpbmVhciBBbGdlYnJhKQorQk9PU1RfREVGVU4oW051bWVyaWNfVWJsYXNdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9udW1lcmljL3VibGFzL3ZlY3Rvci5ocHBdKQorXSkjIEJPT1NUX05VTUVSSUNfVUJMQVMKKworCisjIEJPT1NUX05VTUVSSUNfQ09OVkVSU0lPTigpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0Lk51bWVyaWNDb252ZXJzaW9uIChwb2xpY3ktYmFzZWQgbnVtZXJpYyBjb252ZXJzaW9uKQorQk9PU1RfREVGVU4oW051bWVyaWNfQ29udmVyc2lvbl0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L251bWVyaWMvY29udmVyc2lvbi9jb252ZXJ0ZXIuaHBwXSkKK10pIyBCT09TVF9OVU1FUklDX0NPTlZFUlNJT04KKworCisjIEJPT1NUX09QVElPTkFMKCkKKyMgLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5PcHRpb25hbAorQk9PU1RfREVGVU4oW09wdGlvbmFsXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3Qvb3B0aW9uYWwuaHBwXSldKQorCisKKyMgQk9PU1RfUFJFUFJPQ0VTU09SKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuUHJlcHJvY2Vzc29yCitCT09TVF9ERUZVTihbUHJlcHJvY2Vzc29yXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvcHJlcHJvY2Vzc29yL3JlcGVhdC5ocHBdKV0pCisKKworIyBCT09TVF9SQU5HRSgpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlJhbmdlCitCT09TVF9ERUZVTihbUmFuZ2VdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9yYW5nZS9hZGFwdG9ycy5ocHBdKV0pCisKKyMgQk9PU1RfVU5PUkRFUkVEKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuVW5vcmRlcmVkCitCT09TVF9ERUZVTihbVW5vcmRlcmVkXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvdW5vcmRlcmVkX21hcC5ocHBdKV0pCisKKworIyBCT09TVF9VVUlEKCkKKyMgLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlV1aWQKK0JPT1NUX0RFRlVOKFtVdWlkXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvdXVpZC91dWlkLmhwcF0pXSkKKworCisjIEJPT1NUX1BST0dSQU1fT1BUSU9OUyhbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlByb2dyYW1fb3B0aW9ucy4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULAorIyBzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbUHJvZ3JhbV9PcHRpb25zXSwKK1tCT09TVF9GSU5EX0xJQihbcHJvZ3JhbV9vcHRpb25zXSwgWyQxXSwKKyAgICAgICAgICAgICAgICBbYm9vc3QvcHJvZ3JhbV9vcHRpb25zLmhwcF0sCisgICAgICAgICAgICAgICAgW2Jvb3N0Ojpwcm9ncmFtX29wdGlvbnM6Om9wdGlvbnNfZGVzY3JpcHRpb24gZCgidGVzdCIpO10pCitdKSMgQk9PU1RfUFJPR1JBTV9PUFRJT05TCisKKworCisjIF9CT09TVF9QWVRIT05fQ09ORklHKFZBUklBQkxFLCBGTEFHKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2F2ZSBWQVJJQUJMRSwgYW5kIGRlZmluZSBpdCB2aWEgYHB5dGhvbi1jb25maWcgLS1GTEFHYC4KKyMgU3Vic3RpdHV0ZSBCT09TVF9QWVRIT05fVkFSSUFCTEUuCittNF9kZWZpbmUoW19CT09TVF9QWVRIT05fQ09ORklHXSwKK1tBQ19TVUJTVChbQk9PU1RfUFlUSE9OXyQxXSwKKyAgICAgICAgICBbYHB5dGhvbi1jb25maWcgLS0kMiAyPi9kZXYvbnVsbGBdKWRubAorYm9vc3RfcHl0aG9uX3NhdmVfJDE9JCQxCiskMT0iJCQxICRCT09TVF9QWVRIT05fJDEiXSkKKworCisjIEJPT1NUX1BZVEhPTihbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlB5dGhvbi4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULAorIyBzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbUHl0aG9uXSwKK1tfQk9PU1RfUFlUSE9OX0NPTkZJRyhbQ1BQRkxBR1NdLCBbaW5jbHVkZXNdKQorX0JPT1NUX1BZVEhPTl9DT05GSUcoW0xERkxBR1NdLCAgIFtsZGZsYWdzXSkKK19CT09TVF9QWVRIT05fQ09ORklHKFtMSUJTXSwgICAgICBbbGlic10pCittNF9wYXR0ZXJuX2FsbG93KFteQk9PU1RfUFlUSE9OX01PRFVMRSRdKWRubAorQk9PU1RfRklORF9MSUJTKFtweXRob25dLCBbcHl0aG9uIHB5dGhvbjNdLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9weXRob24uaHBwXSwKKyAgICAgICAgICAgICAgICBbXSwgW0JPT1NUX1BZVEhPTl9NT0RVTEUoZW1wdHkpIHt9XSkKK0NQUEZMQUdTPSRib29zdF9weXRob25fc2F2ZV9DUFBGTEFHUworTERGTEFHUz0kYm9vc3RfcHl0aG9uX3NhdmVfTERGTEFHUworTElCUz0kYm9vc3RfcHl0aG9uX3NhdmVfTElCUworXSkjIEJPT1NUX1BZVEhPTgorCisKKyMgQk9PU1RfUkVGKCkKKyMgLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuUmVmCitCT09TVF9ERUZVTihbUmVmXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvcmVmLmhwcF0pXSkKKworCisjIEJPT1NUX1JFR0VYKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5SZWdleC4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbUmVnZXhdLAorW0JPT1NUX0ZJTkRfTElCKFtyZWdleF0sIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L3JlZ2V4LmhwcF0sCisgICAgICAgICAgICAgICAgW2Jvb3N0OjpyZWdleCBleHAoIioiKTsgYm9vc3Q6OnJlZ2V4X21hdGNoKCJmb28iLCBleHApO10pCitdKSMgQk9PU1RfUkVHRVgKKworCisjIEJPT1NUX1NFUklBTElaQVRJT04oW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuU2VyaWFsaXphdGlvbi4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUKKyMgdGhlIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbU2VyaWFsaXphdGlvbl0sCitbQk9PU1RfRklORF9MSUIoW3NlcmlhbGl6YXRpb25dLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9hcmNoaXZlL3RleHRfb2FyY2hpdmUuaHBwXSwKKyAgICAgICAgICAgICAgICBbc3RkOjpvc3RyZWFtKiBvID0gMDsgLy8gQ2hlYXAgd2F5IHRvIGdldCBhbiBvc3RyZWFtLi4uCisgICAgICAgICAgICAgICAgYm9vc3Q6OmFyY2hpdmU6OnRleHRfb2FyY2hpdmUgdCgqbyk7XSkKK10pIyBCT09TVF9TRVJJQUxJWkFUSU9OCisKKworIyBCT09TVF9TSUdOQUxTKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlNpZ25hbHMuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW1NpZ25hbHNdLAorW0JPT1NUX0ZJTkRfTElCKFtzaWduYWxzXSwgWyQxXSwKKyAgICAgICAgICAgICAgICBbYm9vc3Qvc2lnbmFsLmhwcF0sCisgICAgICAgICAgICAgICAgW2Jvb3N0OjpzaWduYWw8dm9pZCAoKT4gcztdKQorXSkjIEJPT1NUX1NJR05BTFMKKworCisjIEJPT1NUX1NJR05BTFMyKCkKKyMgLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5TaWduYWxzMiAobmV3IHNpbmNlIDEuMzkuMCkuCitCT09TVF9ERUZVTihbU2lnbmFsczJdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9zaWduYWxzMi5ocHBdKQorXSkjIEJPT1NUX1NJR05BTFMyCisKKworIyBCT09TVF9TTUFSVF9QVFIoKQorIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5TbWFydFB0cgorQk9PU1RfREVGVU4oW1NtYXJ0X1B0cl0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3Njb3BlZF9wdHIuaHBwXSkKK0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9zaGFyZWRfcHRyLmhwcF0pCitdKQorCisKKyMgQk9PU1RfU1RBVElDQVNTRVJUKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuU3RhdGljQXNzZXJ0CitCT09TVF9ERUZVTihbU3RhdGljQXNzZXJ0XSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3Qvc3RhdGljX2Fzc2VydC5ocHBdKV0pCisKKworIyBCT09TVF9TVFJJTkdfQUxHTygpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuU3RyaW5nQWxnbworQk9PU1RfREVGVU4oW1N0cmluZ19BbGdvXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvYWxnb3JpdGhtL3N0cmluZy5ocHBdKQorXSkKKworCisjIEJPT1NUX1NZU1RFTShbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlN5c3RlbS4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuICBUaGlzIGxpYnJhcnkgd2FzIGludHJvZHVjZWQgaW4gQm9vc3QKKyMgMS4zNS4wLgorQk9PU1RfREVGVU4oW1N5c3RlbV0sCitbQk9PU1RfRklORF9MSUIoW3N5c3RlbV0sIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L3N5c3RlbS9lcnJvcl9jb2RlLmhwcF0sCisgICAgICAgICAgICAgICAgW2Jvb3N0OjpzeXN0ZW06OmVycm9yX2NvZGUgZTsgZS5jbGVhcigpO10pCitdKSMgQk9PU1RfU1lTVEVNCisKKworIyBCT09TVF9URVNUKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlRlc3QuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW1Rlc3RdLAorW200X3BhdHRlcm5fYWxsb3coW15CT09TVF9DSEVDSyRdKWRubAorQk9PU1RfRklORF9MSUIoW3VuaXRfdGVzdF9mcmFtZXdvcmtdLCBbJDFdLAorICAgICAgICAgICAgICAgW2Jvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcF0sIFtCT09TVF9DSEVDSygyID09IDIpO10sCisgICAgICAgICAgICAgICBbdXNpbmcgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZTsKKyAgICAgICAgICAgICAgIHRlc3Rfc3VpdGUqIGluaXRfdW5pdF90ZXN0X3N1aXRlKGludCBhcmdjLCBjaGFyICoqIGFyZ3YpCisgICAgICAgICAgICAgICB7IHJldHVybiBOVUxMOyB9XSkKK10pIyBCT09TVF9URVNUCisKKworIyBCT09TVF9USFJFQUQoW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuVGhyZWFkLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsIHNlZSB0aGUKKyMgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4KK0JPT1NUX0RFRlVOKFtUaHJlYWRdLAorW2RubCBIYXZpbmcgdGhlIHB0aHJlYWQgZmxhZyBpcyByZXF1aXJlZCBhdCBsZWFzdCBvbiBHQ0MzIHdoZXJlCitkbmwgYm9vc3QvdGhyZWFkLmhwcCB3b3VsZCBjb21wbGFpbiBpZiB3ZSB0cnkgdG8gY29tcGlsZSB3aXRob3V0CitkbmwgLXB0aHJlYWQgb24gR05VL0xpbnV4LgorQUNfUkVRVUlSRShbX0JPT1NUX1BUSFJFQURfRkxBR10pZG5sCitib29zdF90aHJlYWRfc2F2ZV9MSUJTPSRMSUJTCitib29zdF90aHJlYWRfc2F2ZV9MREZMQUdTPSRMREZMQUdTCitib29zdF90aHJlYWRfc2F2ZV9DUFBGTEFHUz0kQ1BQRkxBR1MKKyMgTGluay10aW1lIGRlcGVuZGVuY3kgZnJvbSB0aHJlYWQgdG8gc3lzdGVtIHdhcyBhZGRlZCBhcyBvZiAxLjQ5LjAuCitpZiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxNDk7IHRoZW4KK0JPT1NUX1NZU1RFTShbJDFdKQorZmkgIyBlbmQgb2YgdGhlIEJvb3N0LlN5c3RlbSBjaGVjay4KK200X3BhdHRlcm5fYWxsb3coW15CT09TVF9TWVNURU1fKExJQlN8TERGTEFHUykkXSlkbmwKK0xJQlM9IiRMSUJTICRCT09TVF9TWVNURU1fTElCUyAkYm9vc3RfY3ZfcHRocmVhZF9mbGFnIgorTERGTEFHUz0iJExERkxBR1MgJEJPT1NUX1NZU1RFTV9MREZMQUdTIgorQ1BQRkxBR1M9IiRDUFBGTEFHUyAkYm9vc3RfY3ZfcHRocmVhZF9mbGFnIgorCisjIFdoZW4gY29tcGlsaW5nIGZvciB0aGUgV2luZG93cyBwbGF0Zm9ybSwgdGhlIHRocmVhZHMgbGlicmFyeSBpcyBuYW1lZAorIyBkaWZmZXJlbnRseS4gIFRoaXMgc3VmZml4IGRvZXNuJ3QgZXhpc3QgaW4gbmV3IHZlcnNpb25zIG9mIEJvb3N0LCBvcgorIyBwb3NzaWJseSBuZXcgdmVyc2lvbnMgb2YgR0NDIG9uIG1pbmd3IEkgYW0gYXNzdW1pbmcgaXQncyBCb29zdCdzIGNoYW5nZSBmb3IKKyMgbm93IGFuZCBJIGFtIHNldHRpbmcgdmVyc2lvbiB0byAxLjQ4LCBmb3IgbGFjayBvZiBrbm93bGVkZ2UgYXMgdG8gd2hlbiB0aGlzCisjIGNoYW5nZSBvY2N1cnJlZC4KK2lmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWx0IDE0ODsgdGhlbgorICBjYXNlICRob3N0X29zIGluCisgICAgKCptaW5ndyopIGJvb3N0X3RocmVhZF9saWJfZXh0PV93aW4zMjs7CisgIGVzYWMKK2ZpCitCT09TVF9GSU5EX0xJQlMoW3RocmVhZF0sIFt0aHJlYWQkYm9vc3RfdGhyZWFkX2xpYl9leHRdLAorICAgICAgICAgICAgICAgIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L3RocmVhZC5ocHBdLCBbYm9vc3Q6OnRocmVhZCB0OyBib29zdDo6bXV0ZXggbTtdKQorCitjYXNlICRob3N0X29zIGluCisgICgqbWluZ3cqKSBib29zdF90aHJlYWRfdzMyX3NvY2tldF9saW5rPS1sd3MyXzMyOzsKK2VzYWMKKworQk9PU1RfVEhSRUFEX0xJQlM9IiRCT09TVF9USFJFQURfTElCUyAkQk9PU1RfU1lTVEVNX0xJQlMgJGJvb3N0X2N2X3B0aHJlYWRfZmxhZyAkYm9vc3RfdGhyZWFkX3czMl9zb2NrZXRfbGluayIKK0JPT1NUX1RIUkVBRF9MREZMQUdTPSIkQk9PU1RfU1lTVEVNX0xERkxBR1MiCitCT09TVF9DUFBGTEFHUz0iJEJPT1NUX0NQUEZMQUdTICRib29zdF9jdl9wdGhyZWFkX2ZsYWciCitMSUJTPSRib29zdF90aHJlYWRfc2F2ZV9MSUJTCitMREZMQUdTPSRib29zdF90aHJlYWRfc2F2ZV9MREZMQUdTCitDUFBGTEFHUz0kYm9vc3RfdGhyZWFkX3NhdmVfQ1BQRkxBR1MKK10pIyBCT09TVF9USFJFQUQKKworQVVfQUxJQVMoW0JPT1NUX1RIUkVBRFNdLCBbQk9PU1RfVEhSRUFEXSkKKworCisjIEJPT1NUX1RPS0VOSVpFUigpCisjIC0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlRva2VuaXplcgorQk9PU1RfREVGVU4oW1Rva2VuaXplcl0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3Rva2VuaXplci5ocHBdKV0pCisKKworIyBCT09TVF9UUklCT09MKCkKKyMgLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlRyaWJvb2wKK0JPT1NUX0RFRlVOKFtUcmlib29sXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvbG9naWMvdHJpYm9vbF9md2QuaHBwXSkKK0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9sb2dpYy90cmlib29sLmhwcF0pCitdKQorCisKKyMgQk9PU1RfVFVQTEUoKQorIyAtLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlR1cGxlCitCT09TVF9ERUZVTihbVHVwbGVdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC90dXBsZS90dXBsZS5ocHBdKV0pCisKKworIyBCT09TVF9UWVBFVFJBSVRTKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuVHlwZVRyYWl0cworQk9PU1RfREVGVU4oW1R5cGVUcmFpdHNdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC90eXBlX3RyYWl0cy5ocHBdKV0pCisKKworIyBCT09TVF9VVElMSVRZKCkKKyMgLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlV0aWxpdHkgKG5vbmNvcHlhYmxlLCByZXN1bHRfb2YsIGJhc2UtZnJvbS1tZW1iZXIgaWRpb20sCisjIGV0Yy4pCitCT09TVF9ERUZVTihbVXRpbGl0eV0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3V0aWxpdHkuaHBwXSldKQorCisKKyMgQk9PU1RfVkFSSUFOVCgpCisjIC0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5WYXJpYW50LgorQk9PU1RfREVGVU4oW1ZhcmlhbnRdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC92YXJpYW50L3ZhcmlhbnRfZndkLmhwcF0pCitCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvdmFyaWFudC5ocHBdKV0pCisKKworIyBCT09TVF9QT0lOVEVSX0NPTlRBSU5FUigpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5Qb2ludGVyQ29udGFpbmVyCitCT09TVF9ERUZVTihbUG9pbnRlcl9Db250YWluZXJdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9wdHJfY29udGFpbmVyL3B0cl9kZXF1ZS5ocHBdKQorQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3B0cl9jb250YWluZXIvcHRyX2xpc3QuaHBwXSkKK0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9wdHJfY29udGFpbmVyL3B0cl92ZWN0b3IuaHBwXSkKK0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9wdHJfY29udGFpbmVyL3B0cl9hcnJheS5ocHBdKQorQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3B0cl9jb250YWluZXIvcHRyX3NldC5ocHBdKQorQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3B0cl9jb250YWluZXIvcHRyX21hcC5ocHBdKQorXSkjIEJPT1NUX1BPSU5URVJfQ09OVEFJTkVSCisKKworIyBCT09TVF9XQVZFKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE5PVEU6IElmIHlvdSBpbnRlbmQgdG8gdXNlIFdhdmUvU3Bpcml0IHdpdGggdGhyZWFkIHN1cHBvcnQsIG1ha2Ugc3VyZSB5b3UKKyMgY2FsbCBCT09TVF9USFJFQUQgZmlyc3QuCisjIExvb2sgZm9yIEJvb3N0LldhdmUuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW1dhdmVdLAorW0FDX1JFUVVJUkUoW0JPT1NUX0ZJTEVTWVNURU1dKWRubAorQUNfUkVRVUlSRShbQk9PU1RfREFURV9USU1FXSlkbmwKK2Jvb3N0X3dhdmVfc2F2ZV9MSUJTPSRMSUJTCitib29zdF93YXZlX3NhdmVfTERGTEFHUz0kTERGTEFHUworbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUXygoRklMRSk/U1lTVEVNfERBVEVfVElNRXxUSFJFQUQpXyhMSUJTfExERkxBR1MpJF0pZG5sCitMSUJTPSIkTElCUyAkQk9PU1RfU1lTVEVNX0xJQlMgJEJPT1NUX0ZJTEVTWVNURU1fTElCUyAkQk9PU1RfREFURV9USU1FX0xJQlMgXAorJEJPT1NUX1RIUkVBRF9MSUJTIgorTERGTEFHUz0iJExERkxBR1MgJEJPT1NUX1NZU1RFTV9MREZMQUdTICRCT09TVF9GSUxFU1lTVEVNX0xERkxBR1MgXAorJEJPT1NUX0RBVEVfVElNRV9MREZMQUdTICRCT09TVF9USFJFQURfTERGTEFHUyIKK0JPT1NUX0ZJTkRfTElCKFt3YXZlXSwgWyQxXSwKKyAgICAgICAgICAgICAgICBbYm9vc3Qvd2F2ZS5ocHBdLAorICAgICAgICAgICAgICAgIFtib29zdDo6d2F2ZTo6dG9rZW5faWQgaWQ7IGdldF90b2tlbl9uYW1lKGlkKTtdKQorTElCUz0kYm9vc3Rfd2F2ZV9zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X3dhdmVfc2F2ZV9MREZMQUdTCitdKSMgQk9PU1RfV0FWRQorCisKKyMgQk9PU1RfWFBSRVNTSVZFKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuWHByZXNzaXZlIChuZXcgc2luY2UgMS4zNi4wKS4KK0JPT1NUX0RFRlVOKFtYcHJlc3NpdmVdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC94cHJlc3NpdmUveHByZXNzaXZlLmhwcF0pXSkKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tICMKKyMgSW50ZXJuYWwgaGVscGVycy4gIworIyAtLS0tLS0tLS0tLS0tLS0tLSAjCisKKworIyBfQk9PU1RfUFRIUkVBRF9GTEFHKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEludGVybmFsIGhlbHBlciBmb3IgQk9PU1RfVEhSRUFELiAgQ29tcHV0ZXMgYm9vc3RfY3ZfcHRocmVhZF9mbGFnCisjIHdoaWNoIG11c3QgYmUgdXNlZCBpbiBDUFBGTEFHUyBhbmQgTElCUy4KKyMKKyMgWWVzLCB3ZSAqbmVlZCogdG8gcHV0IHRoZSAtcHRocmVhZCB0aGluZyBpbiBDUFBGTEFHUyBiZWNhdXNlIHdpdGggR0NDMywKKyMgYm9vc3QvdGhyZWFkLmhwcCB3aWxsIHRyaWdnZXIgYSAjZXJyb3IgaWYgLXB0aHJlYWQgaXNuJ3QgdXNlZDoKKyMgICBib29zdC9jb25maWcvcmVxdWlyZXNfdGhyZWFkcy5ocHA6NDc6NTogI2Vycm9yICJDb21waWxlciB0aHJlYWRpbmcgc3VwcG9ydAorIyAgIGlzIG5vdCB0dXJuZWQgb24uIFBsZWFzZSBzZXQgdGhlIGNvcnJlY3QgY29tbWFuZCBsaW5lIG9wdGlvbnMgZm9yCisjICAgdGhyZWFkaW5nOiAtcHRocmVhZCAoTGludXgpLCAtcHRocmVhZHMgKFNvbGFyaXMpIG9yIC1tdGhyZWFkcyAoTWluZ3czMikiCisjCisjIEJhc2VkIG9uIEFDWF9QVEhSRUFEOiBodHRwOi8vYXV0b2NvbmYtYXJjaGl2ZS5jcnlwLnRvL2FjeF9wdGhyZWFkLmh0bWwKK0FDX0RFRlVOKFtfQk9PU1RfUFRIUkVBRF9GTEFHXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0NYWF0pZG5sCitBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCitBQ19MQU5HX1BVU0goW0MrK10pZG5sCitBQ19DQUNIRV9DSEVDSyhbZm9yIHRoZSBmbGFncyBuZWVkZWQgdG8gdXNlIHB0aHJlYWRzXSwgW2Jvb3N0X2N2X3B0aHJlYWRfZmxhZ10sCitbIGJvb3N0X2N2X3B0aHJlYWRfZmxhZz0KKyAgIyBUaGUgb3JkZXJpbmcgKmlzKiAoc29tZXRpbWVzKSBpbXBvcnRhbnQuICBTb21lIG5vdGVzIG9uIHRoZQorICAjIGluZGl2aWR1YWwgaXRlbXMgZm9sbG93OgorICAjIChub25lKTogaW4gY2FzZSB0aHJlYWRzIGFyZSBpbiBsaWJjOyBzaG91bGQgYmUgdHJpZWQgYmVmb3JlIC1LdGhyZWFkIGFuZAorICAjICAgICAgIG90aGVyIGNvbXBpbGVyIGZsYWdzIHRvIHByZXZlbnQgY29udGludWFsIGNvbXBpbGVyIHdhcm5pbmdzCisgICMgLWxwdGhyZWFkczogQUlYIChtdXN0IGNoZWNrIHRoaXMgYmVmb3JlIC1scHRocmVhZCkKKyAgIyAtS3RocmVhZDogU2VxdWVudCAodGhyZWFkcyBpbiBsaWJjLCBidXQgLUt0aHJlYWQgbmVlZGVkIGZvciBwdGhyZWFkLmgpCisgICMgLWt0aHJlYWQ6IEZyZWVCU0Qga2VybmVsIHRocmVhZHMgKHByZWZlcnJlZCB0byAtcHRocmVhZCBzaW5jZSBTTVAtYWJsZSkKKyAgIyAtbGx0aHJlYWQ6IExpbnV4VGhyZWFkcyBwb3J0IG9uIEZyZWVCU0QgKGFsc28gcHJlZmVycmVkIHRvIC1wdGhyZWFkKQorICAjIC1wdGhyZWFkOiBHTlUgTGludXgvR0NDIChrZXJuZWwgdGhyZWFkcyksIEJTRC9HQ0MgKHVzZXJsYW5kIHRocmVhZHMpCisgICMgLXB0aHJlYWRzOiBTb2xhcmlzL0dDQworICAjIC1tdGhyZWFkczogTWluR1czMi9HQ0MsIEx5bngvR0NDCisgICMgLW10OiBTdW4gV29ya3Nob3AgQyAobWF5IG9ubHkgbGluayBTdW5PUyB0aHJlYWRzIFstbHRocmVhZF0sIGJ1dCBpdAorICAjICAgICAgZG9lc24ndCBodXJ0IHRvIGNoZWNrIHNpbmNlIHRoaXMgc29tZXRpbWVzIGRlZmluZXMgcHRocmVhZHMgdG9vOworICAjICAgICAgYWxzbyBkZWZpbmVzIC1EX1JFRU5UUkFOVCkKKyAgIyAgICAgIC4uLiAtbXQgaXMgYWxzbyB0aGUgcHRocmVhZHMgZmxhZyBmb3IgSFAvYUNDCisgICMgLWxwdGhyZWFkOiBHTlUgTGludXgsIGV0Yy4KKyAgIyAtLXRocmVhZC1zYWZlOiBLQUkgQysrCisgIGNhc2UgJGhvc3Rfb3MgaW4gIygKKyAgICAqc29sYXJpcyopCisgICAgICAjIE9uIFNvbGFyaXMgKGF0IGxlYXN0LCBmb3Igc29tZSB2ZXJzaW9ucyksIGxpYmMgY29udGFpbnMgc3R1YmJlZAorICAgICAgIyAobm9uLWZ1bmN0aW9uYWwpIHZlcnNpb25zIG9mIHRoZSBwdGhyZWFkcyByb3V0aW5lcywgc28gbGluay1iYXNlZAorICAgICAgIyB0ZXN0cyB3aWxsIGVycm9uZW91c2x5IHN1Y2NlZWQuICAoV2UgbmVlZCB0byBsaW5rIHdpdGggLXB0aHJlYWRzLy1tdC8KKyAgICAgICMgLWxwdGhyZWFkLikgIChUaGUgc3R1YnMgYXJlIG1pc3NpbmcgcHRocmVhZF9jbGVhbnVwX3B1c2gsIG9yIHJhdGhlcgorICAgICAgIyBhIGZ1bmN0aW9uIGNhbGxlZCBieSB0aGlzIG1hY3JvLCBzbyB3ZSBjb3VsZCBjaGVjayBmb3IgdGhhdCwgYnV0CisgICAgICAjIHdobyBrbm93cyB3aGV0aGVyIHRoZXknbGwgc3R1YiB0aGF0IHRvbyBpbiBhIGZ1dHVyZSBsaWJjLikgIFNvLAorICAgICAgIyB3ZSdsbCBqdXN0IGxvb2sgZm9yIC1wdGhyZWFkcyBhbmQgLWxwdGhyZWFkIGZpcnN0OgorICAgICAgYm9vc3RfcHRocmVhZF9mbGFncz0iLXB0aHJlYWRzIC1scHRocmVhZCAtbXQgLXB0aHJlYWQiOzsgIygKKyAgICAqKQorICAgICAgYm9vc3RfcHRocmVhZF9mbGFncz0iLWxwdGhyZWFkcyAtS3RocmVhZCAta3RocmVhZCAtbGx0aHJlYWQgLXB0aHJlYWQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLXB0aHJlYWRzIC1tdGhyZWFkcyAtbHB0aHJlYWQgLS10aHJlYWQtc2FmZSAtbXQiOzsKKyAgZXNhYworICAjIEdlbmVyYXRlIHRoZSB0ZXN0IGZpbGUuCisgIEFDX0xBTkdfQ09ORlRFU1QoW0FDX0xBTkdfUFJPR1JBTShbI2luY2x1ZGUgPHB0aHJlYWQuaD5dLAorICAgIFtwdGhyZWFkX3QgdGg7IHB0aHJlYWRfam9pbih0aCwgMCk7CisgICAgcHRocmVhZF9hdHRyX2luaXQoMCk7IHB0aHJlYWRfY2xlYW51cF9wdXNoKDAsIDApOworICAgIHB0aHJlYWRfY3JlYXRlKDAsMCwwLDApOyBwdGhyZWFkX2NsZWFudXBfcG9wKDApO10pXSkKKyAgZm9yIGJvb3N0X3B0aHJlYWRfZmxhZyBpbiAnJyAkYm9vc3RfcHRocmVhZF9mbGFnczsgZG8KKyAgICBib29zdF9wdGhyZWFkX29rPWZhbHNlCitkbmwgUmUtdXNlIHRoZSB0ZXN0IGZpbGUgYWxyZWFkeSBnZW5lcmF0ZWQuCisgICAgYm9vc3RfcHRocmVhZHNfX3NhdmVfTElCUz0kTElCUworICAgIExJQlM9IiRMSUJTICRib29zdF9wdGhyZWFkX2ZsYWciCisgICAgQUNfTElOS19JRkVMU0UoW10sCisgICAgICBbaWYgZ3JlcCAiLiokYm9vc3RfcHRocmVhZF9mbGFnIiBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICAgICAgIGVjaG8gIlRoaXMgZmxhZyBzZWVtcyB0byBoYXZlIHRyaWdnZXJlZCB3YXJuaW5ncyIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgIGVsc2UKKyAgICAgICAgIGJvb3N0X3B0aHJlYWRfb2s9OjsgYm9vc3RfY3ZfcHRocmVhZF9mbGFnPSRib29zdF9wdGhyZWFkX2ZsYWcKKyAgICAgICBmaV0pCisgICAgTElCUz0kYm9vc3RfcHRocmVhZHNfX3NhdmVfTElCUworICAgICRib29zdF9wdGhyZWFkX29rICYmIGJyZWFrCisgIGRvbmUKK10pCitBQ19MQU5HX1BPUChbQysrXSlkbmwKK10pIyBfQk9PU1RfUFRIUkVBRF9GTEFHCisKKworIyBfQk9PU1RfZ2NjX3Rlc3QoTUFKT1IsIE1JTk9SKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBJbnRlcm5hbCBoZWxwZXIgZm9yIF9CT09TVF9GSU5EX0NPTVBJTEVSX1RBRy4KK200X2RlZmluZShbX0JPT1NUX2djY190ZXN0XSwKK1siZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA9PSAkMSAmJiBfX0dOVUNfTUlOT1JfXyA9PSAkMiAmJiAhZGVmaW5lZCBfX0lDQyBAIGdjYyQxJDIiXSlkbmwKKworIyBfQk9PU1RfbWluZ3dfdGVzdChNQUpPUiwgTUlOT1IpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEludGVybmFsIGhlbHBlciBmb3IgX0JPT1NUX0ZJTkRfQ09NUElMRVJfVEFHLgorbTRfZGVmaW5lKFtfQk9PU1RfbWluZ3dfdGVzdF0sCitbImRlZmluZWQgX19HTlVDX18gJiYgX19HTlVDX18gPT0gJDEgJiYgX19HTlVDX01JTk9SX18gPT0gJDIgJiYgIWRlZmluZWQgX19JQ0MgJiYgXAorICAoZGVmaW5lZCBXSU4zMiB8fCBkZWZpbmVkIFdJTk5UIHx8IGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMiBcCisgICAgICAgICB8fCBkZWZpbmVkIF9fV0lOMzJfXyB8fCBkZWZpbmVkIF9fV0lOTlQgfHwgZGVmaW5lZCBfX1dJTk5UX18pIEAgbWd3JDEkMiJdKWRubAorCisKKyMgX0JPT1NUX0ZJTkRfQ09NUElMRVJfVEFHKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSW50ZXJuYWwuICBXaGVuIEJvb3N0IGlzIGluc3RhbGxlZCB3aXRob3V0IC0tbGF5b3V0PXN5c3RlbSwgZWFjaCBsaWJyYXJ5CisjIGZpbGVuYW1lIHdpbGwgaG9sZCBhIHN1ZmZpeCB0aGF0IGVuY29kZXMgdGhlIGNvbXBpbGVyIHVzZWQgZHVyaW5nIHRoZQorIyBidWlsZC4gIFRoZSBCb29zdCBidWlsZCBzeXN0ZW0gc2VlbXMgdG8gY2FsbCB0aGlzIGEgYHRhZycuCitBQ19ERUZVTihbX0JPT1NUX0ZJTkRfQ09NUElMRVJfVEFHXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0NYWF0pZG5sCitBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCitBQ19DQUNIRV9DSEVDSyhbZm9yIHRoZSB0b29sc2V0IG5hbWUgdXNlZCBieSBCb29zdCBmb3IgJENYWF0sCisgICAgICAgICAgICAgICBbYm9vc3RfY3ZfbGliX3RhZ10sCitbYm9vc3RfY3ZfbGliX3RhZz11bmtub3duCitpZiB0ZXN0IHgkYm9vc3RfY3ZfaW5jX3BhdGggIT0geG5vOyB0aGVuCisgIEFDX0xBTkdfUFVTSChbQysrXSlkbmwKKyAgIyBUaGUgZm9sbG93aW5nIHRlc3RzIGFyZSBtb3N0bHkgaW5zcGlyZWQgYnkgYm9vc3QvY29uZmlnL2F1dG9fbGluay5ocHAKKyAgIyBUaGUgbGlzdCBpcyBzb3J0ZWQgdG8gbW9zdCByZWNlbnQvY29tbW9uIHRvIG9sZGVzdCBjb21waWxlciAoaW4gb3JkZXIKKyAgIyB0byBpbmNyZWFzZSB0aGUgbGlrZWxpaG9vZCBvZiBmaW5kaW5nIHRoZSByaWdodCBjb21waWxlciB3aXRoIHRoZQorICAjIGxlYXN0IG51bWJlciBvZiBjb21waWxhdGlvbiBhdHRlbXB0KS4KKyAgIyBCZXdhcmUgdGhhdCBzb21lIHRlc3RzIGFyZSBzZW5zaWJsZSB0byB0aGUgb3JkZXIgKGZvciBpbnN0YW5jZSwgd2UgbXVzdAorICAjIGxvb2sgZm9yIE1pbkdXIGJlZm9yZSBsb29raW5nIGZvciBHQ0MzKS4KKyAgIyBJIHVzZWQgb25lIGNvbXBpbGF0aW9uIHRlc3QgcGVyIGNvbXBpbGVyIHdpdGggYSAjZXJyb3IgdG8gcmVjb2duaXplCisgICMgZWFjaCBjb21waWxlciBzbyB0aGF0IGl0IHdvcmtzIGV2ZW4gd2hlbiBjcm9zcy1jb21waWxpbmcgKGxldCBtZSBrbm93CisgICMgaWYgeW91IGtub3cgYSBiZXR0ZXIgYXBwcm9hY2gpLgorICAjIEtub3duIG1pc3NpbmcgdGFncyAoa25vd24gZnJvbSBCb29zdCdzIHRvb2xzL2J1aWxkL3YyL3Rvb2xzL2NvbW1vbi5qYW0pOgorICAjICAgY29tbywgZWRnLCBrY2MsIGJjaywgbXAsIHN3LCB0cnUsIHhsYworICAjIEknbSBub3Qgc3VyZSBhYm91dCBteSB0ZXN0IGZvciBgaWwnIChiZSBjYXJlZnVsOiBJbnRlbCdzIElDQyBwcmUtZGVmaW5lcworICAjIHRoZSBzYW1lIGRlZmluZXMgYXMgR0NDJ3MpLgorICBmb3IgaSBpbiBcCisgICAgX0JPT1NUX21pbmd3X3Rlc3QoNSwgMykgXAorICAgIF9CT09TVF9nY2NfdGVzdCg1LCAzKSBcCisgICAgX0JPT1NUX21pbmd3X3Rlc3QoNSwgMikgXAorICAgIF9CT09TVF9nY2NfdGVzdCg1LCAyKSBcCisgICAgX0JPT1NUX21pbmd3X3Rlc3QoNSwgMSkgXAorICAgIF9CT09TVF9nY2NfdGVzdCg1LCAxKSBcCisgICAgX0JPT1NUX21pbmd3X3Rlc3QoNSwgMCkgXAorICAgIF9CT09TVF9nY2NfdGVzdCg1LCAwKSBcCisgICAgX0JPT1NUX21pbmd3X3Rlc3QoNCwgMTApIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoNCwgMTApIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCA5KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDkpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCA4KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDgpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCA3KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDcpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCA2KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDYpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCA1KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDUpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCA0KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDQpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCAzKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDMpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCAyKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDIpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCAxKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDEpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCAwKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDApIFwKKyAgICAiZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA9PSAzICYmICFkZWZpbmVkIF9fSUNDIFwKKyAgICAgJiYgKGRlZmluZWQgV0lOMzIgfHwgZGVmaW5lZCBXSU5OVCB8fCBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzIgXAorICAgICAgICAgfHwgZGVmaW5lZCBfX1dJTjMyX18gfHwgZGVmaW5lZCBfX1dJTk5UIHx8IGRlZmluZWQgX19XSU5OVF9fKSBAIG1ndyIgXAorICAgIF9CT09TVF9nY2NfdGVzdCgzLCA0KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDMsIDMpIFwKKyAgICAiZGVmaW5lZCBfTVNDX1ZFUiAmJiBfTVNDX1ZFUiA+PSAxNTAwIEAgdmM5MCIgXAorICAgICJkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSID09IDE0MDAgQCB2YzgwIiBcCisgICAgX0JPT1NUX2djY190ZXN0KDMsIDIpIFwKKyAgICAiZGVmaW5lZCBfTVNDX1ZFUiAmJiBfTVNDX1ZFUiA9PSAxMzEwIEAgdmM3MSIgXAorICAgIF9CT09TVF9nY2NfdGVzdCgzLCAxKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDMsIDApIFwKKyAgICAiZGVmaW5lZCBfX0JPUkxBTkRDX18gQCBiY2IiIFwKKyAgICAiZGVmaW5lZCBfX0lDQyAmJiAoZGVmaW5lZCBfX3VuaXggfHwgZGVmaW5lZCBfX3VuaXhfXykgQCBpbCIgXAorICAgICJkZWZpbmVkIF9fSUNMIEAgaXciIFwKKyAgICAiZGVmaW5lZCBfTVNDX1ZFUiAmJiBfTVNDX1ZFUiA9PSAxMzAwIEAgdmM3IiBcCisgICAgX0JPT1NUX2djY190ZXN0KDIsIDk1KSBcCisgICAgImRlZmluZWQgX19NV0VSS1NfXyAmJiBfX01XRVJLU19fIDw9IDB4MzJGRiBAIGN3OSIgXAorICAgICJkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSIDwgMTMwMCAmJiAhZGVmaW5lZCBVTkRFUl9DRSBAIHZjNiIgXAorICAgICJkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSIDwgMTMwMCAmJiBkZWZpbmVkIFVOREVSX0NFIEAgZXZjNCIgXAorICAgICJkZWZpbmVkIF9fTVdFUktTX18gJiYgX19NV0VSS1NfXyA8PSAweDMxRkYgQCBjdzgiCisgIGRvCisgICAgYm9vc3RfdGFnX3Rlc3Q9YGV4cHIgIlgkaSIgOiAnWFwoW1teQF1dKlwpIEAgJ2AKKyAgICBib29zdF90YWc9YGV4cHIgIlgkaSIgOiAnWFtbXkBdXSogQCBcKC4qXCknYAorICAgIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKKyNpZiAkYm9vc3RfdGFnX3Rlc3QKKy8qIE9LICovCisjZWxzZQorIyBlcnJvciAkYm9vc3RfdGFnX3Rlc3QKKyNlbmRpZgorXV0pXSwgW2Jvb3N0X2N2X2xpYl90YWc9JGJvb3N0X3RhZzsgYnJlYWtdLCBbXSkKKyAgZG9uZQorQUNfTEFOR19QT1AoW0MrK10pZG5sCisgIGNhc2UgJGJvb3N0X2N2X2xpYl90YWcgaW4gIygKKyAgICAjIFNvbWUgbmV3ZXIgKD49IDEuMzU/KSB2ZXJzaW9ucyBvZiBCb29zdCBzZWVtIHRvIG9ubHkgdXNlICJnY2MiIGFzIG9wcG9zZWQKKyAgICAjIHRvICJnY2M0MSIgZm9yIGluc3RhbmNlLgorICAgICotZ2NjIHwgKictZ2NjICcpIDo7OyAjKCAgRG9uJ3QgcmUtYWRkIC1nY2M6IGl0J3MgYWxyZWFkeSBpbiB0aGVyZS4KKyAgICBnY2MqKQorICAgICAgYm9vc3RfdGFnX3g9CisgICAgICBjYXNlICRob3N0X29zIGluICMoCisgICAgICAgIGRhcndpbiopCisgICAgICAgICAgaWYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtZ2UgMTM2OyB0aGVuCisgICAgICAgICAgICAjIFRoZSBgeCcgYWRkZWQgaW4gcjQ2NzkzIG9mIEJvb3N0LgorICAgICAgICAgICAgYm9vc3RfdGFnX3g9eAorICAgICAgICAgIGZpOzsKKyAgICAgIGVzYWMKKyAgICAgICMgV2UgY2FuIHNwZWNpZnkgbXVsdGlwbGUgdGFncyBpbiB0aGlzIHZhcmlhYmxlIGJlY2F1c2UgaXQncyB1c2VkIGJ5CisgICAgICAjIEJPT1NUX0ZJTkRfTElCIHRoYXQgZG9lcyBhIGBmb3IgdGFnIGluIC0kYm9vc3RfY3ZfbGliX3RhZycgLi4uCisgICAgICBib29zdF9jdl9saWJfdGFnPSIkYm9vc3RfdGFnX3gkYm9vc3RfY3ZfbGliX3RhZyAtJHtib29zdF90YWdfeH1nY2MiCisgICAgICA7OyAjKAorICAgIHVua25vd24pCisgICAgICBBQ19NU0dfV0FSTihbW2NvdWxkIG5vdCBmaWd1cmUgb3V0IHdoaWNoIHRvb2xzZXQgbmFtZSB0byB1c2UgZm9yICRDWFhdXSkKKyAgICAgIGJvb3N0X2N2X2xpYl90YWc9CisgICAgICA7OworICBlc2FjCitmaV0pZG5sIGVuZCBvZiBBQ19DQUNIRV9DSEVDSworXSkjIF9CT09TVF9GSU5EX0NPTVBJTEVSX1RBRworCisKKyMgX0JPT1NUX0dVRVNTX1dIRVRIRVJfVE9fVVNFX01UKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29tcGlsZSBhIHNtYWxsIHRlc3QgdG8gdHJ5IHRvIGd1ZXNzIHdoZXRoZXIgd2Ugc2hvdWxkIGZhdm9yIE1UIChNdWx0aQorIyBUaHJlYWQpIGZsYXZvcnMgb2YgQm9vc3QuICBTZXRzIGJvb3N0X2d1ZXNzX3VzZV9tdCBhY2NvcmRpbmdseS4KK0FDX0RFRlVOKFtfQk9PU1RfR1VFU1NfV0hFVEhFUl9UT19VU0VfTVRdLAorWyMgQ2hlY2sgd2hldGhlciB3ZSBkbyBiZXR0ZXIgdXNlIGBtdCcgZXZlbiB0aG91Z2ggd2Ugd2VyZW4ndCBhc2sgdG8uCitBQ19MQU5HX1BVU0goW0MrK10pZG5sCitBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCisjaWYgZGVmaW5lZCBfUkVFTlRSQU5UIHx8IGRlZmluZWQgX01UIHx8IGRlZmluZWQgX19NVF9fCisvKiB1c2UgLW10ICovCisjZWxzZQorIyBlcnJvciBNVCBub3QgbmVlZGVkCisjZW5kaWYKK11dKV0sIFtib29zdF9ndWVzc191c2VfbXQ9Ol0sIFtib29zdF9ndWVzc191c2VfbXQ9ZmFsc2VdKQorQUNfTEFOR19QT1AoW0MrK10pZG5sCitdKQorCisjIF9CT09TVF9BQ19MSU5LX0lGRUxTRShQUk9HUkFNLCBbQUNUSU9OLUlGLVRSVUVdLCBbQUNUSU9OLUlGLUZBTFNFXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGb3JrIG9mIF9BQ19MSU5LX0lGRUxTRSB0aGF0IHByZXNlcnZlcyBjb25mdGVzdC5vIGFjcm9zcyBjYWxscy4gIEZyYWdpbGUsCisjIHdpbGwgYnJlYWsgd2hlbiBBdXRvY29uZiBjaGFuZ2VzIGl0cyBpbnRlcm5hbHMuICBSZXF1aXJlcyB0aGF0IHlvdSBtYW51YWxseQorIyBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGluIGJldHdlZW4gdG8gcmVhbGx5IGRpZmZlcmVudCB0ZXN0cywgb3RoZXJ3aXNlCisjIHlvdSB3aWxsIHRyeSB0byBsaW5rIGEgY29uZnRlc3QubyBsZWZ0IGJlaGluZCBieSBhIHByZXZpb3VzIHRlc3QuCisjIFVzZWQgdG8gYWdncmVzc2l2ZWx5IG9wdGltaXplIEJPT1NUX0ZJTkRfTElCIChzZWUgdGhlIGJpZyBjb21tZW50IGluIHRoaXMKKyMgbWFjcm8pLgorIworIyBEb24ndCB1c2UgImJyZWFrIiBpbiB0aGUgYWN0aW9ucywgYXMgaXQgd291bGQgc2hvcnQtY2lyY3VpdCBzb21lIGNvZGUKKyMgdGhpcyBtYWNybyBydW5zIGFmdGVyIHRoZSBhY3Rpb25zLgorbTRfZGVmaW5lKFtfQk9PU1RfQUNfTElOS19JRkVMU0VdLAorW200X2lmdmFsbihbJDFdLCBbQUNfTEFOR19DT05GVEVTVChbJDFdKV0pZG5sCitybSAtZiBjb25mdGVzdCRhY19leGVleHQKK2Jvb3N0X3NhdmVfYWNfZXh0PSRhY19leHQKK2Jvb3N0X3VzZV9zb3VyY2U9OgorIyBJZiB3ZSBhbHJlYWR5IGhhdmUgYSAubywgcmUtdXNlIGl0LiAgV2UgY2hhbmdlICRhY19leHQgc28gdGhhdCAkYWNfbGluaworIyB0cmllcyB0byBsaW5rIHRoZSBleGlzdGluZyBvYmplY3QgZmlsZSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBmcm9tIHNvdXJjZS4KK3Rlc3QgLWYgY29uZnRlc3QuJGFjX29iamV4dCAmJiBhY19leHQ9JGFjX29iamV4dCAmJiBib29zdF91c2Vfc291cmNlPWZhbHNlICYmCisgIF9BU19FQ0hPX0xPRyhbcmUtdXNpbmcgdGhlIGV4aXN0aW5nIGNvbmZ0ZXN0LiRhY19vYmpleHRdKQorQVNfSUYoW19BQ19ET19TVERFUlIoJGFjX2xpbmspICYmIHsKKyAgICAgICAgIHRlc3QgLXogIiRhY19bXV9BQ19MQU5HX0FCQlJFVltdX3dlcnJvcl9mbGFnIiB8fAorICAgICAgICAgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworICAgICAgICAgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKyAgICAgICAgICRhc19leGVjdXRhYmxlX3AgY29uZnRlc3QkYWNfZXhlZXh0CitkbmwgRklYTUU6IHVzZSBBU19URVNUX1ggaW5zdGVhZCB3aGVuIDIuNjEgaXMgd2lkZXNwcmVhZCBlbm91Z2guCisgICAgICAgfV0sCisgICAgICBbJDJdLAorICAgICAgW2lmICRib29zdF91c2Vfc291cmNlOyB0aGVuCisgICAgICAgICBfQUNfTVNHX0xPR19DT05GVEVTVAorICAgICAgIGZpCisgICAgICAgJDNdKQorYWNfb2JqZXh0PSRib29zdF9zYXZlX2FjX29iamV4dAorYWNfZXh0PSRib29zdF9zYXZlX2FjX2V4dAorZG5sIERlbGV0ZSBhbHNvIHRoZSBJUEEvSVBPIChJbnRlciBQcm9jZWR1cmFsIEFuYWx5c2lzL09wdGltaXphdGlvbikKK2RubCBpbmZvcm1hdGlvbiBjcmVhdGVkIGJ5IHRoZSBQR0kgY29tcGlsZXIgKGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28pLAorZG5sIGFzIGl0IHdvdWxkIGludGVyZmVyZSB3aXRoIHRoZSBuZXh0IGxpbmsgY29tbWFuZC4KK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IG00X2lmdmFsKFskMV0sIFtjb25mdGVzdC4kYWNfZXh0XSlbXWRubAorXSkjIF9CT09TVF9BQ19MSU5LX0lGRUxTRQorCisjIExvY2FsIFZhcmlhYmxlczoKKyMgbW9kZTogYXV0b2NvbmYKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9jdmM0LXBhdGNoL2NvbmZpZy9ib29zdC5tNC50eHQgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL2N2YzQtcGF0Y2gvY29uZmlnL2Jvb3N0Lm00LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2QwNjNmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9jdmM0LXBhdGNoL2NvbmZpZy9ib29zdC5tNC50eHQKQEAgLTAsMCArMSwxNTYwIEBACisjIGJvb3N0Lm00OiBMb2NhdGUgQm9vc3QgaGVhZGVycyBhbmQgbGlicmFyaWVzIGZvciBhdXRvY29uZi1iYXNlZCBwcm9qZWN0cy4KKyMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMTEsIDIwMTQgIEJlbm9pdCBTaWdvdXJlIDx0c3VuYUBscmRlLmVwaXRhLmZyPgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBBZGRpdGlvbmFsIHBlcm1pc3Npb24gdW5kZXIgc2VjdGlvbiA3IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZSwgdmVyc2lvbiAzICgiR1BMdjMiKToKKyMKKyMgSWYgeW91IGNvbnZleSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHdvcmsgdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBkbyBzbyB1bmRlcgorIyB0ZXJtcyBvZiB5b3VyIGNob2ljZS4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKK200X2RlZmluZShbX0JPT1NUX1NFUklBTF0sIFttNF90cmFuc2xpdChbCisjIHNlcmlhbCAyNQorXSwgWyMKK10sIFtdKV0pCisKKyMgT3JpZ2luYWwgc291cmNlcyBjYW4gYmUgZm91bmQgYXQgaHR0cDovL2dpdGh1Yi5jb20vdHN1bmEvYm9vc3QubTQKKyMgWW91IGNhbiBmZXRjaCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIHNjcmlwdCBieSBkb2luZzoKKyMgICB3Z2V0IGh0dHA6Ly9naXRodWIuY29tL3RzdW5hL2Jvb3N0Lm00L3Jhdy9tYXN0ZXIvYnVpbGQtYXV4L2Jvb3N0Lm00CisKKyMgLS0tLS0tICMKKyMgUkVBRE1FICMKKyMgLS0tLS0tICMKKworIyBUaGlzIGZpbGUgcHJvdmlkZXMgc2V2ZXJhbCBtYWNyb3MgdG8gdXNlIHRoZSB2YXJpb3VzIEJvb3N0IGxpYnJhcmllcy4KKyMgVGhlIGZpcnN0IG1hY3JvIGlzIEJPT1NUX1JFUVVJUkUuICBJdCB3aWxsIHNpbXBseSBjaGVjayBpZiBpdCdzIHBvc3NpYmxlIHRvCisjIGZpbmQgdGhlIEJvb3N0IGhlYWRlcnMgb2YgYSBnaXZlbiAob3B0aW9uYWwpIG1pbmltdW0gdmVyc2lvbiBhbmQgaXQgd2lsbAorIyBkZWZpbmUgQk9PU1RfQ1BQRkxBR1MgYWNjb3JkaW5nbHkuICBJdCB3aWxsIGFkZCBhbiBvcHRpb24gLS13aXRoLWJvb3N0IHRvCisjIHlvdXIgY29uZmlndXJlIHNvIHRoYXQgdXNlcnMgY2FuIHNwZWNpZnkgbm9uIHN0YW5kYXJkIGxvY2F0aW9ucy4KKyMgSWYgdGhlIHVzZXIncyBlbnZpcm9ubWVudCBjb250YWlucyBCT09TVF9ST09UIGFuZCAtLXdpdGgtYm9vc3Qgd2FzIG5vdAorIyBzcGVjaWZpZWQsIC0td2l0aC1ib29zdD0kQk9PU1RfUk9PVCBpcyBpbXBsaWNpdGx5IHVzZWQuCisjIEZvciBtb3JlIFJFQURNRSBhbmQgZG9jdW1lbnRhdGlvbiwgZ28gdG8gaHR0cDovL2dpdGh1Yi5jb20vdHN1bmEvYm9vc3QubTQKKyMgTm90ZTogVEhFU0UgTUFDUk9TIEFTU1VNRSBUSEFUIFlPVSBVU0UgTElCVE9PTC4gIElmIHlvdSBkb24ndCwgZG9uJ3Qgd29ycnksCisjIHNpbXBseSByZWFkIHRoZSBSRUFETUUsIGl0IHdpbGwgc2hvdyB5b3Ugd2hhdCB0byBkbyBzdGVwIGJ5IHN0ZXAuCisKK200X3BhdHRlcm5fZm9yYmlkKFteXz8oQk9PU1R8Qm9vc3QpX10pCisKKworIyBfQk9PU1RfU0VEX0NQUChTRUQtUFJPR1JBTSwgUFJPR1JBTSwKKyMgICAgICAgICAgICAgICAgW0FDVElPTi1JRi1GT1VORF0sIFtBQ1RJT04tSUYtTk9ULUZPVU5EXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2FtZSBhcyBBQ19FR1JFUF9DUFAsIGJ1dCBsZWF2ZSB0aGUgcmVzdWx0IGluIGNvbmZ0ZXN0LmkuCisjCisjIFNFRC1QUk9HUkFNIGlzICpub3QqIG92ZXJxdW90ZWQsIGFzIGluIEFDX0VHUkVQX0NQUC4gIEl0IGlzIGV4cGFuZGVkCisjIGluIGRvdWJsZS1xdW90ZXMsIHNvIGVzY2FwZSB5b3VyIGRvdWJsZSBxdW90ZXMuCisjCisjIEl0IGNvdWxkIGJlIHVzZWZ1bCB0byB0dXJuIHRoaXMgaW50byBhIG1hY3JvIHdoaWNoIGV4dHJhY3RzIHRoZQorIyB2YWx1ZSBvZiBhbnkgbWFjcm8uCittNF9kZWZpbmUoW19CT09TVF9TRURfQ1BQXSwKK1tBQ19MQU5HX1BVU0goW0MrK10pZG5sCitBQ19MQU5HX1BSRVBST0NfUkVRVUlSRSgpZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX1NFRF0pZG5sCitBQ19MQU5HX0NPTkZURVNUKFtBQ19MQU5HX1NPVVJDRShbWyQyXV0pXSkKK0FTX0lGKFtkbmwgZXZhbCBpcyBuZWNlc3NhcnkgdG8gZXhwYW5kIGFjX2NwcC4KK2RubCBVbHRyaXggYW5kIFB5cmFtaWQgc2ggcmVmdXNlIHRvIHJlZGlyZWN0IG91dHB1dCBvZiBldmFsLCBzbyB1c2Ugc3Vic2hlbGwuCitkbmwgQmV3YXJlIG9mIFdpbmRvd3MgZW5kLW9mLWxpbmVzLCBmb3IgaW5zdGFuY2UgaWYgd2UgYXJlIHJ1bm5pbmcKK2RubCBzb21lIFdpbmRvd3MgcHJvZ3JhbXMgdW5kZXIgV2luZS4gIEluIHRoYXQgY2FzZSwgYm9vc3QvdmVyc2lvbi5ocHAKK2RubCBpcyBjZXJ0YWlubHkgdXNpbmcgIlxyXG4iLCBidXQgdGhlIHJlZ3VsYXIgVW5peCBzaGVsbCB3aWxsIG9ubHkKK2RubCBzdHJpcCBgXG4nIHdpdGggYmFja3F1b3Rlcywgbm90IHRoZSBgXHInLiAgVGhpcyByZXN1bHRzIGluCitkbmwgYm9vc3RfY3ZfbGliX3ZlcnNpb249JzFfMzdccicgZm9yIGluc3RhbmNlLCB3aGljaCBicmVha3MKK2RubCBldmVyeXRoaW5nIGVsc2UuCitkbmwgQ2Fubm90IHVzZSAnZG5sJyBhZnRlciBbJDRdIGJlY2F1c2UgYSB0cmFpbGluZyBkbmwgbWF5IGJyZWFrIEFDX0NBQ0hFX0NIRUNLCitkbmwKK2RubCBCZXdhcmUgdGhhdCBHQ0MgNSwgd2hlbiBleHBhbmRpbmcgbWFjcm9zLCBtYXkgZW1iZWQgIyBsaW5lIGRpcmVjdGl2ZXMKK2RubCBhIHdpdGhpbiBzaW5nbGUgbGluZToKK2RubAorZG5sICMgMSAiY29uZnRlc3QuY2MiCitkbmwgIyAxICI8YnVpbHQtaW4+IgorZG5sICMgMSAiPGNvbW1hbmQtbGluZT4iCitkbmwgIyAxICJjb25mdGVzdC5jYyIKK2RubCAjIDEgIi9vcHQvbG9jYWwvaW5jbHVkZS9ib29zdC92ZXJzaW9uLmhwcCIgMSAzCitkbmwgIyAyICJjb25mdGVzdC5jYyIgMgorZG5sIGJvb3N0LWxpYi12ZXJzaW9uID0KK2RubCAjIDIgImNvbmZ0ZXN0LmNjIiAzCitkbmwgICAgICAgICAgICAgICAgICAgICIxXzU2IgorZG5sCitkbmwgU28gZ2V0IHJpZCBvZiB0aGUgIyBsaW5lcywgYW5kIGdsdWUgdGhlIHJlbWFpbmluZyBvbmVzIHRvZ2V0aGVyLgorKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JkFTX01FU1NBR0VfTE9HX0ZEIHwKKyAgZ3JlcCAtdiAnIycgfAorICB0ciAtZCAnXHInIHwKKyAgdHIgLXMgJ1xuJyAnICcgfAorICAkU0VEIC1uIC1lICIkMSIgPmNvbmZ0ZXN0LmkgMj4mMV0sCisgIFskM10sCisgIFskNF0pCitybSAtcmYgY29uZnRlc3QqCitBQ19MQU5HX1BPUChbQysrXSlkbmwKK10pIyBfQk9PU1RfU0VEX0NQUAorCisKKworIyBCT09TVF9SRVFVSVJFKFtWRVJTSU9OXSwgW0FDVElPTi1JRi1OT1QtRk9VTkRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC4gIElmIHZlcnNpb24gaXMgZ2l2ZW4sIGl0IG11c3QgZWl0aGVyIGJlIGEgbGl0ZXJhbCBvZiB0aGUgZm9ybQorIyAiWC5ZLloiIHdoZXJlIFgsIFkgYW5kIFogYXJlIGludGVnZXJzICh0aGUgIi5aIiBwYXJ0IGJlaW5nIG9wdGlvbmFsKSBvciBhCisjIHZhcmlhYmxlICIkdmFyIi4KKyMgRGVmaW5lcyB0aGUgdmFsdWUgQk9PU1RfQ1BQRkxBR1MuICBUaGlzIG1hY3JvIG9ubHkgY2hlY2tzIGZvciBoZWFkZXJzIHdpdGgKKyMgdGhlIHJlcXVpcmVkIHZlcnNpb24sIGl0IGRvZXMgbm90IGNoZWNrIGZvciBhbnkgb2YgdGhlIEJvb3N0IGxpYnJhcmllcy4KKyMgT24gIyBzdWNjZXNzLCBkZWZpbmVzIEhBVkVfQk9PU1QuICBPbiBmYWlsdXJlLCBjYWxscyB0aGUgb3B0aW9uYWwKKyMgQUNUSU9OLUlGLU5PVC1GT1VORCBhY3Rpb24gaWYgb25lIHdhcyBzdXBwbGllZC4KKyMgT3RoZXJ3aXNlIGFib3J0cyB3aXRoIGFuIGVycm9yIG1lc3NhZ2UuCitBQ19ERUZVTl9PTkNFKFtCT09TVF9SRVFVSVJFXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0NYWF0pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX0dSRVBdKWRubAorZWNobyAiJGFzX21lOiB0aGlzIGlzIGJvb3N0Lm00W11fQk9PU1RfU0VSSUFMIiA+JkFTX01FU1NBR0VfTE9HX0ZECitib29zdF9zYXZlX0lGUz0kSUZTCitib29zdF92ZXJzaW9uX3JlcT0kMQorSUZTPS4KK3NldCB4ICRib29zdF92ZXJzaW9uX3JlcSAwIDAgMAorSUZTPSRib29zdF9zYXZlX0lGUworc2hpZnQKK2Jvb3N0X3ZlcnNpb25fcmVxPWBleHByICIkWzFdIiAnKicgMTAwMDAwICsgIiRbMl0iICcqJyAxMDAgKyAiJFszXSJgCitib29zdF92ZXJzaW9uX3JlcV9zdHJpbmc9JFsxXS4kWzJdLiRbM10KK0FDX0FSR19XSVRIKFtib29zdF0sCisgICBbQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1ib29zdD1ESVJdLAorICAgICAgICAgICAgICAgICAgIFtwcmVmaXggb2YgQm9vc3QgJDEgQDw6QGd1ZXNzQDo+QF0pXSlkbmwKK0FDX0FSR19WQVIoW0JPT1NUX1JPT1RdLFtMb2NhdGlvbiBvZiBCb29zdCBpbnN0YWxsYXRpb25dKWRubAorIyBJZiBCT09TVF9ST09UIGlzIHNldCBhbmQgdGhlIHVzZXIgaGFzIG5vdCBwcm92aWRlZCBhIHZhbHVlIHRvCisjIC0td2l0aC1ib29zdCwgdGhlbiB0cmVhdCBCT09TVF9ST09UIGFzIGlmIGl0IHRoZSB1c2VyIHN1cHBsaWVkIGl0LgoraWYgdGVzdCB4IiRCT09TVF9ST09UIiAhPSB4OyB0aGVuCisgIGlmIHRlc3QgeCIkd2l0aF9ib29zdCIgPSB4OyB0aGVuCisgICAgQUNfTVNHX05PVElDRShbRGV0ZWN0ZWQgQk9PU1RfUk9PVDsgY29udGludWluZyB3aXRoIC0td2l0aC1ib29zdD0kQk9PU1RfUk9PVF0pCisgICAgd2l0aF9ib29zdD0kQk9PU1RfUk9PVAorICBlbHNlCisgICAgQUNfTVNHX05PVElDRShbRGV0ZWN0ZWQgQk9PU1RfUk9PVD0kQk9PU1RfUk9PVCwgYnV0IG92ZXJyaWRkZW4gYnkgLS13aXRoLWJvb3N0PSR3aXRoX2Jvb3N0XSkKKyAgZmkKK2ZpCitBQ19TVUJTVChbRElTVENIRUNLX0NPTkZJR1VSRV9GTEFHU10sCisgICAgICAgICBbIiRESVNUQ0hFQ0tfQ09ORklHVVJFX0ZMQUdTICctLXdpdGgtYm9vc3Q9JHdpdGhfYm9vc3QnIl0pZG5sCitib29zdF9zYXZlX0NQUEZMQUdTPSRDUFBGTEFHUworICBBQ19DQUNIRV9DSEVDSyhbZm9yIEJvb3N0IGhlYWRlcnMgdmVyc2lvbiA+PSAkYm9vc3RfdmVyc2lvbl9yZXFfc3RyaW5nXSwKKyAgICBbYm9vc3RfY3ZfaW5jX3BhdGhdLAorICAgIFtib29zdF9jdl9pbmNfcGF0aD1ubworQUNfTEFOR19QVVNIKFtDKytdKWRubAorbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX1ZFUlNJT04kXSlkbmwKKyAgICBBQ19MQU5HX0NPTkZURVNUKFtBQ19MQU5HX1BST0dSQU0oW1sjaW5jbHVkZSA8Ym9vc3QvdmVyc2lvbi5ocHA+CisjaWYgIWRlZmluZWQgQk9PU1RfVkVSU0lPTgorIyBlcnJvciBCT09TVF9WRVJTSU9OIGlzIG5vdCBkZWZpbmVkCisjZWxpZiBCT09TVF9WRVJTSU9OIDwgJGJvb3N0X3ZlcnNpb25fcmVxCisjIGVycm9yIEJvb3N0IGhlYWRlcnMgdmVyc2lvbiA8ICRib29zdF92ZXJzaW9uX3JlcQorI2VuZGlmCitdXSldKQorICAgICMgSWYgdGhlIHVzZXIgcHJvdmlkZWQgYSB2YWx1ZSB0byAtLXdpdGgtYm9vc3QsIHVzZSBpdCBhbmQgb25seSBpdC4KKyAgICBjYXNlICR3aXRoX2Jvb3N0IGluICMoCisgICAgICAnJ3x5ZXMpIHNldCB4ICcnIC9vcHQvbG9jYWwvaW5jbHVkZSAvdXNyL2xvY2FsL2luY2x1ZGUgL29wdC9pbmNsdWRlIFwKKyAgICAgICAgICAgICAgICAgL3Vzci9pbmNsdWRlIEM6L0Jvb3N0L2luY2x1ZGU7OyAjKAorICAgICAgKikgICAgICBzZXQgeCAiJHdpdGhfYm9vc3QvaW5jbHVkZSIgIiR3aXRoX2Jvb3N0Ijs7CisgICAgZXNhYworICAgIHNoaWZ0CisgICAgZm9yIGJvb3N0X2RpcgorICAgIGRvCisgICAgIyBXaXRob3V0IC0tbGF5b3V0PXN5c3RlbSwgQm9vc3QgKG9yIGF0IGxlYXN0IHNvbWUgdmVyc2lvbnMpIGluc3RhbGxzCisgICAgIyBpdHNlbGYgaW4gPHByZWZpeD4vaW5jbHVkZS9ib29zdC08dmVyc2lvbj4uICBUaGlzIGlubmVyIGxvb3AgaGVscHMgdG8KKyAgICAjIGZpbmQgaGVhZGVycyBpbiBzdWNoIGRpcmVjdG9yaWVzLgorICAgICMKKyAgICAjIEFueSAke2Jvb3N0X2Rpcn0vYm9vc3QteF94eCBkaXJlY3RvcmllcyBhcmUgc2VhcmNoZWQgaW4gcmV2ZXJzZSB2ZXJzaW9uCisgICAgIyBvcmRlciBmb2xsb3dlZCBieSAke2Jvb3N0X2Rpcn0uICBUaGUgZmluYWwgJy4nIGlzIGEgc2VudGluZWwgZm9yCisgICAgIyBzZWFyY2hpbmcgJGJvb3N0X2RpciIgaXRzZWxmLiAgRW50cmllcyBhcmUgd2hpdGVzcGFjZSBzZXBhcmF0ZWQuCisgICAgIworICAgICMgSSBkaWRuJ3QgaW5kZW50IHRoaXMgbG9vcCBvbiBwdXJwb3NlICh0byBhdm9pZCBvdmVyLWluZGVudGVkIGNvZGUpCisgICAgYm9vc3RfbGF5b3V0X3N5c3RlbV9zZWFyY2hfbGlzdD1gY2QgIiRib29zdF9kaXIiIDI+L2Rldi9udWxsIFwKKyAgICAgICAgJiYgbHMgLTEgfCAiJHtHUkVQfSIgJ15ib29zdC0nIHwgc29ydCAtcm4gLXQtIC1rMiBcCisgICAgICAgICYmIGVjaG8gLmAKKyAgICBmb3IgYm9vc3RfaW5jIGluICRib29zdF9sYXlvdXRfc3lzdGVtX3NlYXJjaF9saXN0CisgICAgZG8KKyAgICAgIGlmIHRlc3QgeCIkYm9vc3RfaW5jIiAhPSB4LjsgdGhlbgorICAgICAgICBib29zdF9pbmM9IiRib29zdF9kaXIvJGJvb3N0X2luYyIKKyAgICAgIGVsc2UKKyAgICAgICAgYm9vc3RfaW5jPSIkYm9vc3RfZGlyIiAjIFVzZXMgc2VudGluZWwgaW4gYm9vc3RfbGF5b3V0X3N5c3RlbV9zZWFyY2hfbGlzdAorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgeCIkYm9vc3RfaW5jIiAhPSB4OyB0aGVuCisgICAgICAgICMgV2UgYXJlIGdvaW5nIHRvIGNoZWNrIHdoZXRoZXIgdGhlIHZlcnNpb24gb2YgQm9vc3QgaW5zdGFsbGVkCisgICAgICAgICMgaW4gJGJvb3N0X2luYyBpcyB1c2FibGUgYnkgcnVubmluZyBhIGNvbXBpbGF0aW9uIHRoYXQKKyAgICAgICAgIyAjaW5jbHVkZXMgaXQuICBCdXQgaWYgd2UgcGFzcyBhIC1JL3NvbWUvcGF0aCBpbiB3aGljaCBCb29zdAorICAgICAgICAjIGlzIG5vdCBpbnN0YWxsZWQsIHRoZSBjb21waWxlciB3aWxsIGp1c3Qgc2tpcCB0aGlzIC1JIGFuZAorICAgICAgICAjIHVzZSBvdGhlciBsb2NhdGlvbnMgKGVpdGhlciBmcm9tIENQUEZMQUdTLCBvciBmcm9tIGl0cyBsaXN0CisgICAgICAgICMgb2Ygc3lzdGVtIGluY2x1ZGUgZGlyZWN0b3JpZXMpLiAgQXMgYSByZXN1bHQgd2Ugd291bGQgdXNlCisgICAgICAgICMgaGVhZGVyIGluc3RhbGxlZCBvbiB0aGUgbWFjaGluZSBpbnN0ZWFkIG9mIHRoZSAvc29tZS9wYXRoCisgICAgICAgICMgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLiAgU28gaW4gdGhhdCBwcmVjaXNlIGNhc2UgKHRyeWluZworICAgICAgICAjICRib29zdF9pbmMpLCBtYWtlIHN1cmUgdGhlIHZlcnNpb24uaHBwIGV4aXN0cy4KKyAgICAgICAgIworICAgICAgICAjIFVzZSB0ZXN0IC1lIGFzIHRoZXJlIGNhbiBiZSBzeW1saW5rcy4KKyAgICAgICAgdGVzdCAtZSAiJGJvb3N0X2luYy9ib29zdC92ZXJzaW9uLmhwcCIgfHwgY29udGludWUKKyAgICAgICAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAtSSRib29zdF9pbmMiCisgICAgICBmaQorICAgICAgQUNfQ09NUElMRV9JRkVMU0UoW10sIFtib29zdF9jdl9pbmNfcGF0aD15ZXNdLCBbYm9vc3RfY3ZfdmVyc2lvbj1ub10pCisgICAgICBpZiB0ZXN0IHgiJGJvb3N0X2N2X2luY19wYXRoIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgaWYgdGVzdCB4IiRib29zdF9pbmMiICE9IHg7IHRoZW4KKyAgICAgICAgICBib29zdF9jdl9pbmNfcGF0aD0kYm9vc3RfaW5jCisgICAgICAgIGZpCisgICAgICAgIGJyZWFrIDIKKyAgICAgIGZpCisgICAgZG9uZQorICAgIGRvbmUKK0FDX0xBTkdfUE9QKFtDKytdKWRubAorICAgIF0pCisgICAgY2FzZSAkYm9vc3RfY3ZfaW5jX3BhdGggaW4gIygKKyAgICAgIG5vKQorICAgICAgICBib29zdF9lcnJtc2c9ImNhbm5vdCBmaW5kIEJvb3N0IGhlYWRlcnMgdmVyc2lvbiA+PSAkYm9vc3RfdmVyc2lvbl9yZXFfc3RyaW5nIgorICAgICAgICBtNF9pZihbJDJdLCBbXSwgIFtBQ19NU0dfRVJST1IoWyRib29zdF9lcnJtc2ddKV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbQUNfTVNHX05PVElDRShbJGJvb3N0X2Vycm1zZ10pXSkKKyAgICAgICAgJDIKKyAgICAgICAgOzsjKAorICAgICAgeWVzKQorICAgICAgICBCT09TVF9DUFBGTEFHUz0KKyAgICAgICAgOzsjKAorICAgICAgKikKKyAgICAgICAgQUNfU1VCU1QoW0JPT1NUX0NQUEZMQUdTXSwgWyItSSRib29zdF9jdl9pbmNfcGF0aCJdKWRubAorICAgICAgICA7OworICAgIGVzYWMKKyAgaWYgdGVzdCB4IiRib29zdF9jdl9pbmNfcGF0aCIgIT0geG5vOyB0aGVuCisgIEFDX0RFRklORShbSEFWRV9CT09TVF0sIFsxXSwKKyAgICAgICAgICAgIFtEZWZpbmVkIGlmIHRoZSByZXF1ZXN0ZWQgbWluaW11bSBCT09TVCB2ZXJzaW9uIGlzIHNhdGlzZmllZF0pCisgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgQm9vc3QncyBoZWFkZXIgdmVyc2lvbl0sCisgICAgW2Jvb3N0X2N2X2xpYl92ZXJzaW9uXSwKKyAgICBbbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX0xJQl9WRVJTSU9OJF0pZG5sCisgICAgIF9CT09TVF9TRURfQ1BQKFtbL15ib29zdC1saWItdmVyc2lvbiA9IC97cy8vLztzL1tcIiBdLy9nO3A7cTt9XV0sCisgICAgICAgICAgICAgICAgICAgIFsjaW5jbHVkZSA8Ym9vc3QvdmVyc2lvbi5ocHA+Citib29zdC1saWItdmVyc2lvbiA9IEJPT1NUX0xJQl9WRVJTSU9OXSwKKyAgICBbYm9vc3RfY3ZfbGliX3ZlcnNpb249YGNhdCBjb25mdGVzdC5pYF0pXSkKKyAgICAjIGUuZy4gIjEzNCIgZm9yIDFfMzRfMSBvciAiMTM1IiBmb3IgMV8zNQorICAgIGJvb3N0X21ham9yX3ZlcnNpb249YGVjaG8gIiRib29zdF9jdl9saWJfdmVyc2lvbiIgfCBzZWQgJ3MvXy8vO3MvXy4qLy8nYAorICAgIGNhc2UgJGJvb3N0X21ham9yX3ZlcnNpb24gaW4gIygKKyAgICAgICcnIHwgKltbITAtOV1dKikKKyAgICAgICAgQUNfTVNHX0VSUk9SKFtpbnZhbGlkIHZhbHVlOiBib29zdF9tYWpvcl92ZXJzaW9uPSckYm9vc3RfbWFqb3JfdmVyc2lvbiddKQorICAgICAgICA7OworICAgIGVzYWMKK2ZpCitDUFBGTEFHUz0kYm9vc3Rfc2F2ZV9DUFBGTEFHUworXSkjIEJPT1NUX1JFUVVJUkUKKworCisjIEJPT1NUX1NUQVRJQygpCisjIC0tLS0tLS0tLS0tLS0tCisjIEFkZCB0aGUgIi0tZW5hYmxlLXN0YXRpYy1ib29zdCIgY29uZmlndXJlIGFyZ3VtZW50LiBJZiB0aGlzIGFyZ3VtZW50IGlzIGdpdmVuCisjIG9uIHRoZSBjb21tYW5kIGxpbmUsIHN0YXRpYyB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyaWVzIHdpbGwgYmUgbG9va2VkIHVwLgorQUNfREVGVU4oW0JPT1NUX1NUQVRJQ10sCisgIFtBQ19BUkdfRU5BQkxFKFtzdGF0aWMtYm9vc3RdLAorICAgICBbQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXN0YXRpYy1ib29zdF0sCisgICAgICAgICAgICAgICBbUHJlZmVyIHRoZSBzdGF0aWMgYm9vc3QgbGlicmFyaWVzIG92ZXIgdGhlIHNoYXJlZCBvbmVzIFtub11dKV0sCisgICAgIFtlbmFibGVfc3RhdGljX2Jvb3N0PXllc10sCisgICAgIFtlbmFibGVfc3RhdGljX2Jvb3N0PW5vXSldKSMgQk9PU1RfU1RBVElDCisKKworIyBCT09TVF9GSU5EX0hFQURFUihbSEVBREVSLU5BTUVdLCBbQUNUSU9OLUlGLU5PVC1GT1VORF0sIFtBQ1RJT04tSUYtRk9VTkRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBXcmFwcGVyIGFyb3VuZCBBQ19DSEVDS19IRUFERVIgZm9yIEJvb3N0IGhlYWRlcnMuICBVc2VmdWwgdG8gY2hlY2sgZm9yCisjIHNvbWUgcGFydHMgb2YgdGhlIEJvb3N0IGxpYnJhcnkgd2hpY2ggYXJlIG9ubHkgbWFkZSBvZiBoZWFkZXJzIGFuZCBkb24ndAorIyByZXF1aXJlIGxpbmtpbmcgKHN1Y2ggYXMgQm9vc3QuRm9yZWFjaCkuCisjCisjIERlZmF1bHQgQUNUSU9OLUlGLU5PVC1GT1VORDogRmFpbCB3aXRoIGEgZmF0YWwgZXJyb3IgdW5sZXNzIEJvb3N0IGNvdWxkbid0IGJlCisjIGZvdW5kIGluIHRoZSBmaXJzdCBwbGFjZSwgaW4gd2hpY2ggY2FzZSBieSBkZWZhdWx0IGEgbm90aWNlIGlzIGlzc3VlZCB0byB0aGUKKyMgdXNlci4gIFByZXN1bWFibHkgaWYgd2UgaGF2ZW4ndCBkaWVkIGFscmVhZHkgaXQncyBiZWNhdXNlIGl0J3MgT0sgdG8gbm90IGhhdmUKKyMgQm9vc3QsIHdoaWNoIGlzIHdoeSBvbmx5IGEgbm90aWNlIGlzIGlzc3VlZCBpbnN0ZWFkIG9mIGEgaGFyZCBlcnJvci4KKyMKKyMgRGVmYXVsdCBBQ1RJT04tSUYtRk9VTkQ6IGRlZmluZSB0aGUgcHJlcHJvY2Vzc29yIHN5bWJvbCBIQVZFXzxIRUFERVItTkFNRT4gaW4KKyMgY2FzZSBvZiBzdWNjZXNzICMgKHdoZXJlIEhFQURFUi1OQU1FIGlzIHdyaXR0ZW4gTElLRV9USElTLCBlLmcuLAorIyBIQVZFX0JPT1NUX0ZPUkVBQ0hfSFBQKS4KK0FDX0RFRlVOKFtCT09TVF9GSU5EX0hFQURFUl0sCitbQUNfUkVRVUlSRShbQk9PU1RfUkVRVUlSRV0pZG5sCitpZiB0ZXN0IHgiJGJvb3N0X2N2X2luY19wYXRoIiA9IHhubzsgdGhlbgorICBtNF9kZWZhdWx0KFskMl0sIFtBQ19NU0dfTk9USUNFKFtCb29zdCBub3QgYXZhaWxhYmxlLCBub3Qgc2VhcmNoaW5nIGZvciAkMV0pXSkKK2Vsc2UKK0FDX0xBTkdfUFVTSChbQysrXSlkbmwKK2Jvb3N0X3NhdmVfQ1BQRkxBR1M9JENQUEZMQUdTCitDUFBGTEFHUz0iJENQUEZMQUdTICRCT09TVF9DUFBGTEFHUyIKK0FDX0NIRUNLX0hFQURFUihbJDFdLAorICBbbTRfZGVmYXVsdChbJDNdLCBbQUNfREVGSU5FKEFTX1RSX0NQUChbSEFWRV8kMV0pLCBbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0RlZmluZSB0byAxIGlmIHlvdSBoYXZlIDwkMT5dKV0pXSwKKyAgW200X2RlZmF1bHQoWyQyXSwgW0FDX01TR19FUlJPUihbY2Fubm90IGZpbmQgJDFdKV0pXSkKK0NQUEZMQUdTPSRib29zdF9zYXZlX0NQUEZMQUdTCitBQ19MQU5HX1BPUChbQysrXSlkbmwKK2ZpCitdKSMgQk9PU1RfRklORF9IRUFERVIKKworCisjIEJPT1NUX0ZJTkRfTElCUyhbQ09NUE9ORU5ULU5BTUVdLCBbQ0FORElEQVRFLUxJQi1OQU1FU10sCisjICAgICAgICAgICAgICAgICBbUFJFRkVSUkVELVJULU9QVF0sIFtIRUFERVItTkFNRV0sIFtDWFgtVEVTVF0sCisjICAgICAgICAgICAgICAgICBbQ1hYLVBST0xPR1VFXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgdGhlIEJvb3N0IGxpYnJhcnkgQ09NUE9ORU5ULU5BTUUgKGUuZy4sIGB0aHJlYWQnLCBmb3IKKyMgbGliYm9vc3RfdGhyZWFkKSB1bmRlciB0aGUgcG9zc2libGUgQ0FORElEQVRFLUxJQi1OQU1FUyAoZS5nLiwKKyMgInRocmVhZF93aW4zMiB0aHJlYWQiKS4gIENoZWNrIHRoYXQgSEVBREVSLU5BTUUgd29ya3MgYW5kIGNoZWNrIHRoYXQKKyMgbGliYm9vc3RfTElCLU5BTUUgY2FuIGxpbmsgd2l0aCB0aGUgY29kZSBDWFgtVEVTVC4gIFRoZSBvcHRpb25hbAorIyBhcmd1bWVudCBDWFgtUFJPTE9HVUUgY2FuIGJlIHVzZWQgdG8gaW5jbHVkZSBzb21lIEMrKyBjb2RlIGJlZm9yZQorIyB0aGUgYG1haW4nIGZ1bmN0aW9uLgorIworIyBJbnZva2VzIEJPT1NUX0ZJTkRfSEVBREVSKFtIRUFERVItTkFNRV0pIChzZWUgYWJvdmUpLgorIworIyBCb29zdCBsaWJyYXJpZXMgdHlwaWNhbGx5IGNvbWUgY29tcGlsZWQgd2l0aCBzZXZlcmFsIGZsYXZvcnMgKHdpdGggZGlmZmVyZW50CisjIHJ1bnRpbWUgb3B0aW9ucykgc28gUFJFRkVSUkVELVJULU9QVCBpcyB0aGUgcHJlZmVycmVkIHN1ZmZpeC4gIEEgc3VmZml4IGlzIG9uZQorIyBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgbGV0dGVyczogc2dkcG4gKGluIHRoYXQgb3JkZXIpLiAgcyA9IHN0YXRpYworIyBydW50aW1lLCBkID0gZGVidWcgYnVpbGQsIGcgPSBkZWJ1Zy9kaWFnbm9zdGljIHJ1bnRpbWUsIHAgPSBTVExQb3J0IGJ1aWxkLAorIyBuID0gKHVuc3VyZSkgU1RMUG9ydCBidWlsZCB3aXRob3V0IGlvc3RyZWFtcyBmcm9tIFNUTFBvcnQgKGl0IGxvb2tzIGxpa2UgYG4nCisjIG11c3QgYWx3YXlzIGJlIHVzZWQgYWxvbmcgd2l0aCBgcCcpLiAgQWRkaXRpb25hbGx5LCBQUkVGRVJSRUQtUlQtT1BUIGNhbgorIyBzdGFydCB3aXRoIGBtdC0nIHRvIGluZGljYXRlIHRoYXQgdGhlcmUgaXMgYSBwcmVmZXJlbmNlIGZvciBtdWx0aS10aHJlYWQKKyMgYnVpbGRzLiAgU29tZSBzYW1wbGUgdmFsdWVzIGZvciBQUkVGRVJSRUQtUlQtT1BUOiAobm90aGluZyksIG10LCBkLCBtdC1kLCBnZHAKKyMgLi4uICBJZiB5b3Ugd2FudCB0byBtYWtlIHN1cmUgeW91IGhhdmUgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIEJvb3N0CisjIChlZywgPj0gMS4zMykgeW91ICptdXN0KiBpbnZva2UgQk9PU1RfUkVRVUlSRSBiZWZvcmUgdGhpcyBtYWNyby4KK0FDX0RFRlVOKFtCT09TVF9GSU5EX0xJQlNdLAorW0FDX1JFUVVJUkUoW0JPT1NUX1JFUVVJUkVdKWRubAorQUNfUkVRVUlSRShbX0JPT1NUX0ZJTkRfQ09NUElMRVJfVEFHXSlkbmwKK0FDX1JFUVVJUkUoW0JPT1NUX1NUQVRJQ10pZG5sCitBQ19SRVFVSVJFKFtfQk9PU1RfR1VFU1NfV0hFVEhFUl9UT19VU0VfTVRdKWRubAoraWYgdGVzdCB4IiRib29zdF9jdl9pbmNfcGF0aCIgPSB4bm87IHRoZW4KKyAgQUNfTVNHX05PVElDRShbQm9vc3Qgbm90IGF2YWlsYWJsZSwgbm90IHNlYXJjaGluZyBmb3IgdGhlIEJvb3N0ICQxIGxpYnJhcnldKQorZWxzZQorZG5sIFRoZSBlbHNlIGJyYW5jaCBpcyBodWdlIGFuZCB3YXNuJ3QgaW50ZW5kZWQgb24gcHVycG9zZS4KK0FDX0xBTkdfUFVTSChbQysrXSlkbmwKK0FTX1ZBUl9QVVNIREVGKFtCb29zdF9saWJdLCBbYm9vc3RfY3ZfbGliXyQxXSlkbmwKK0FTX1ZBUl9QVVNIREVGKFtCb29zdF9saWJfTERGTEFHU10sIFtib29zdF9jdl9saWJfJDFfTERGTEFHU10pZG5sCitBU19WQVJfUFVTSERFRihbQm9vc3RfbGliX0xEUEFUSF0sIFtib29zdF9jdl9saWJfJDFfTERQQVRIXSlkbmwKK0FTX1ZBUl9QVVNIREVGKFtCb29zdF9saWJfTElCU10sIFtib29zdF9jdl9saWJfJDFfTElCU10pZG5sCitCT09TVF9GSU5EX0hFQURFUihbJDRdKQorYm9vc3Rfc2F2ZV9DUFBGTEFHUz0kQ1BQRkxBR1MKK0NQUEZMQUdTPSIkQ1BQRkxBR1MgJEJPT1NUX0NQUEZMQUdTIgorQUNfQ0FDSEVfQ0hFQ0soW2ZvciB0aGUgQm9vc3QgJDEgbGlicmFyeV0sIFtCb29zdF9saWJdLAorICAgICAgICAgICAgICAgW19CT09TVF9GSU5EX0xJQlMoJEApXSkKK2Nhc2UgJEJvb3N0X2xpYiBpbiAjKAorICAobm8pIF9BQ19NU0dfTE9HX0NPTkZURVNUCisgICAgQUNfTVNHX0VSUk9SKFtjYW5ub3QgZmluZCB0aGUgZmxhZ3MgdG8gbGluayB3aXRoIEJvb3N0ICQxXSkKKyAgICA7OworZXNhYworQUNfU1VCU1QoQVNfVFJfQ1BQKFtCT09TVF8kMV9MREZMQUdTXSksIFskQm9vc3RfbGliX0xERkxBR1NdKWRubAorQUNfU1VCU1QoQVNfVFJfQ1BQKFtCT09TVF8kMV9MRFBBVEhdKSwgWyRCb29zdF9saWJfTERQQVRIXSlkbmwKK0FDX1NVQlNUKFtCT09TVF9MRFBBVEhdLCBbJEJvb3N0X2xpYl9MRFBBVEhdKWRubAorQUNfU1VCU1QoQVNfVFJfQ1BQKFtCT09TVF8kMV9MSUJTXSksIFskQm9vc3RfbGliX0xJQlNdKWRubAorQ1BQRkxBR1M9JGJvb3N0X3NhdmVfQ1BQRkxBR1MKK0FTX1ZBUl9QT1BERUYoW0Jvb3N0X2xpYl0pZG5sCitBU19WQVJfUE9QREVGKFtCb29zdF9saWJfTERGTEFHU10pZG5sCitBU19WQVJfUE9QREVGKFtCb29zdF9saWJfTERQQVRIXSlkbmwKK0FTX1ZBUl9QT1BERUYoW0Jvb3N0X2xpYl9MSUJTXSlkbmwKK0FDX0xBTkdfUE9QKFtDKytdKWRubAorZmkKK10pCisKKworIyBCT09TVF9GSU5EX0xJQihbTElCLU5BTUVdLAorIyAgICAgICAgICAgICAgICBbUFJFRkVSUkVELVJULU9QVF0sIFtIRUFERVItTkFNRV0sIFtDWFgtVEVTVF0sCisjICAgICAgICAgICAgICAgIFtDWFgtUFJPTE9HVUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdyYXBwZXIgZm9yIEJPT1NUX0ZJTkRfTElCUy4KK0FDX0RFRlVOKFtCT09TVF9GSU5EX0xJQl0sCitbQk9PU1RfRklORF9MSUJTKFskMV0sICRAKV0pCisKKworIyBfQk9PU1RfRklORF9MSUJTKFtMSUItTkFNRV0sIFtDQU5ESURBVEUtTElCLU5BTUVTXSwKKyMgICAgICAgICAgICAgICAgIFtQUkVGRVJSRUQtUlQtT1BUXSwgW0hFQURFUi1OQU1FXSwgW0NYWC1URVNUXSwKKyMgICAgICAgICAgICAgICAgIFtDWFgtUFJPTE9HVUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBSZWFsIGltcGxlbWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCUzogcmVseSBvbiB0aGVzZSBsb2NhbCBtYWNyb3M6CisjIEJvb3N0X2xpYiwgQm9vc3RfbGliX0xERkxBR1MsIEJvb3N0X2xpYl9MRFBBVEgsIEJvb3N0X2xpYl9MSUJTCisjCisjIFRoZSBhbGdvcml0aG0gaXMgYXMgZm9sbG93czogZmlyc3QgbG9vayBmb3IgYSBnaXZlbiBsaWJyYXJ5IG5hbWUKKyMgYWNjb3JkaW5nIHRvIHRoZSB1c2VyJ3MgUFJFRkVSUkVELVJULU9QVC4gIEZvciBlYWNoIGxpYnJhcnkgbmFtZSwgd2UKKyMgcHJlZmVyIHRvIHVzZSB0aGUgb25lcyB0aGF0IGNhcnJ5IHRoZSB0YWcgKHRvb2xzZXQgbmFtZSkuICBFYWNoCisjIGxpYnJhcnkgaXMgc2VhcmNoZWQgdGhyb3VnaCB0aGUgdmFyaW91cyBzdGFuZGFyZCBwYXRocyB3ZXJlIEJvb3N0IGlzCisjIHVzdWFsbHkgaW5zdGFsbGVkLiAgSWYgd2UgY2FuJ3QgZmluZCB0aGUgc3RhbmRhcmQgdmFyaWFudHMsIHdlIHRyeQorIyB0byBlbmZvcmNlIC1tdCAoZm9yIGluc3RhbmNlIG9uIE1hY09TWCwgbGliYm9vc3RfdGhyZWFkLmR5bGliCisjIGRvZXNuJ3QgZXhpc3QgYnV0IHRoZXJlJ3MgLW9idmlvdXNseS0gbGliYm9vc3RfdGhyZWFkLW10LmR5bGliKS4KK0FDX0RFRlVOKFtfQk9PU1RfRklORF9MSUJTXSwKK1tCb29zdF9saWI9bm8KKyAgY2FzZSAiJDMiIGluICMoCisgICAgKG10IHwgbXQtKSBib29zdF9tdD0tbXQ7IGJvb3N0X3J0b3B0PTs7ICMoCisgICAgKG10KiB8IG10LSopIGJvb3N0X210PS1tdDsgYm9vc3RfcnRvcHQ9YGV4cHIgIlgkMyIgOiAnWG10LSpcKC4qXCknYDs7ICMoCisgICAgKCopIGJvb3N0X210PTsgYm9vc3RfcnRvcHQ9JDM7OworICBlc2FjCisgIGlmIHRlc3QgJGVuYWJsZV9zdGF0aWNfYm9vc3QgPSB5ZXM7IHRoZW4KKyAgICBib29zdF9ydG9wdD0icyRib29zdF9ydG9wdCIKKyAgZmkKKyAgIyBGaW5kIHRoZSBwcm9wZXIgZGVidWcgdmFyaWFudCBkZXBlbmRpbmcgb24gd2hhdCB3ZSd2ZSBiZWVuIGFza2VkIHRvIGZpbmQuCisgIGNhc2UgJGJvb3N0X3J0b3B0IGluICMoCisgICAgKCpkKikgYm9vc3RfcnRfZD0kYm9vc3RfcnRvcHQ7OyAjKAorICAgICgqW1tzZ3BuXV0qKSAjIEluc2VydCB0aGUgYGQnIGF0IHRoZSByaWdodCBwbGFjZSAoaW4gYmV0d2VlbiBgc2cnIGFuZCBgcG4nKQorICAgICAgYm9vc3RfcnRfZD1gZWNobyAiJGJvb3N0X3J0b3B0IiB8IHNlZCAncy9cKHMqZypcKVwocCpuKlwpL1wxXDIvJ2A7OyAjKAorICAgICgqKSBib29zdF9ydF9kPSctZCc7OworICBlc2FjCisgICMgSWYgdGhlIFBSRUZFUlJFRC1SVC1PUFQgYXJlIG5vdCBlbXB0eSwgcHJlcGVuZCBhIGAtJy4KKyAgdGVzdCAtbiAiJGJvb3N0X3J0b3B0IiAmJiBib29zdF9ydG9wdD0iLSRib29zdF9ydG9wdCIKKyAgJGJvb3N0X2d1ZXNzX3VzZV9tdCAmJiBib29zdF9tdD0tbXQKKyAgIyBMb29rIGZvciB0aGUgYWJzIHBhdGggdGhlIHN0YXRpYyBhcmNoaXZlLgorICAjICRsaWJleHQgaXMgY29tcHV0ZWQgYnkgTGlidG9vbCBidXQgbGV0J3MgbWFrZSBzdXJlIGl0J3Mgbm9uIGVtcHR5LgorICB0ZXN0IC16ICIkbGliZXh0IiAmJgorICAgIEFDX01TR19FUlJPUihbdGhlIGxpYmV4dCB2YXJpYWJsZSBpcyBlbXB0eSwgZGlkIHlvdSBpbnZva2UgTGlidG9vbD9dKQorICBib29zdF9zYXZlX2FjX29iamV4dD0kYWNfb2JqZXh0CisgICMgR2VuZXJhdGUgdGhlIHRlc3QgZmlsZS4KKyAgQUNfTEFOR19DT05GVEVTVChbQUNfTEFOR19QUk9HUkFNKFsjaW5jbHVkZSA8JDQ+CiskNl0sIFskNV0pXSkKK2RubCBPcHRpbWl6YXRpb24gaGFja3M6IGNvbXBpbGluZyBDKysgaXMgc2xvdywgZXNwZWNpYWxseSB3aXRoIEJvb3N0LiAgV2hhdAorZG5sIHdlJ3JlIHRyeWluZyB0byBkbyBoZXJlIGlzIGd1ZXNzIHRoZSByaWdodCBjb21iaW5hdGlvbiBvZiBsaW5rIGZsYWdzCitkbmwgKExJQlMgLyBMREZMQUdTKSB0byB1c2UgYSBnaXZlbiBsaWJyYXJ5LiAgVGhpcyBjYW4gdGFrZSBzZXZlcmFsCitkbmwgaXRlcmF0aW9ucyBiZWZvcmUgaXQgc3VjY2VlZHMgYW5kIGlzIHRodXMgKnZlcnkqIHNsb3cuICBTbyB3aGF0IHdlIGRvCitkbmwgaW5zdGVhZCBpcyB0aGF0IHdlIGNvbXBpbGUgdGhlIGNvZGUgZmlyc3QgKGFuZCB0aHVzIGdldCBhbiBvYmplY3QgZmlsZSwKK2RubCB0eXBpY2FsbHkgY29uZnRlc3QubykuICBUaGVuIHdlIHRyeSB2YXJpb3VzIGNvbWJpbmF0aW9ucyBvZiBsaW5rIGZsYWdzCitkbmwgdW50aWwgd2Ugc3VjY2VlZCB0byBsaW5rIGNvbmZ0ZXN0Lm8gaW4gYW4gZXhlY3V0YWJsZS4gIFRoZSBwcm9ibGVtIGlzCitkbmwgdGhhdCB0aGUgdmFyaW91cyBUUllfTElOSyAvIENPTVBJTEVfSUZFTFNFIG1hY3JvcyBvZiBBdXRvY29uZiBhbHdheXMKK2RubCByZW1vdmUgYWxsIHRoZSB0ZW1wb3JhcnkgZmlsZXMgaW5jbHVkaW5nIGNvbmZ0ZXN0Lm8uICBTbyB0aGUgdHJpY2sgaGVyZQorZG5sIGlzIHRvIHRlbXBvcmFyaWx5IGNoYW5nZSB0aGUgdmFsdWUgb2YgYWNfb2JqZXh0IHNvIHRoYXQgY29uZnRlc3QubyBpcworZG5sIHByZXNlcnZlZCBhY2Nyb3NzIHRlc3RzLiAgVGhpcyBpcyBvYnZpb3VzbHkgZnJhZ2lsZSBhbmQgSSB3aWxsIGJ1cm4gaW4KK2RubCBoZWxsIGZvciBub3QgcmVzcGVjdGluZyBBdXRvY29uZidzIGRvY3VtZW50ZWQgaW50ZXJmYWNlcywgYnV0IGluIHRoZQorZG5sIG1lYW4gdGltZSwgaXQgb3B0aW1pemVzIHRoZSBtYWNybyBieSBhIGZhY3RvciBvZiA1IHRvIDMwLgorZG5sIEFub3RoZXIgc21hbGwgb3B0aW1pemF0aW9uOiB0aGUgZmlyc3QgYXJndW1lbnQgb2YgQUNfQ09NUElMRV9JRkVMU0UgbGVmdAorZG5sIGVtcHR5IGJlY2F1c2UgdGhlIHRlc3QgZmlsZSBpcyBnZW5lcmF0ZWQgb25seSBvbmNlIGFib3ZlIChiZWZvcmUgd2UKK2RubCBzdGFydCB0aGUgZm9yIGxvb3BzKS4KKyAgQUNfQ09NUElMRV9JRkVMU0UoW10sCisgICAgW2FjX29iamV4dD1kb19ub3Rfcm1fbWVfcGx6XSwKKyAgICBbQUNfTVNHX0VSUk9SKFtjYW5ub3QgY29tcGlsZSBhIHRlc3QgdGhhdCB1c2VzIEJvb3N0ICQxXSldKQorICBhY19vYmpleHQ9JGJvb3N0X3NhdmVfYWNfb2JqZXh0CisgIGJvb3N0X2ZhaWxlZF9saWJzPQorIyBEb24ndCBib3RoZXIgdG8gaWRlbnQgdGhlIGZvbGxvd2luZyBuZXN0ZWQgZm9yIGxvb3BzLCBvbmx5IHRoZSAyCisjIGlubmVybW9zdCBvbmVzIG1hdHRlci4KK2ZvciBib29zdF9saWJfIGluICQyOyBkbworZm9yIGJvb3N0X3RhZ18gaW4gLSRib29zdF9jdl9saWJfdGFnICcnOyBkbworZm9yIGJvb3N0X3Zlcl8gaW4gLSRib29zdF9jdl9saWJfdmVyc2lvbiAnJzsgZG8KK2ZvciBib29zdF9tdF8gaW4gJGJvb3N0X210IC1tdCAnJzsgZG8KK2ZvciBib29zdF9ydG9wdF8gaW4gJGJvb3N0X3J0b3B0ICcnIC1kOyBkbworICBmb3IgYm9vc3RfbGliIGluIFwKKyAgICBib29zdF8kYm9vc3RfbGliXyRib29zdF90YWdfJGJvb3N0X210XyRib29zdF9ydG9wdF8kYm9vc3RfdmVyXyBcCisgICAgYm9vc3RfJGJvb3N0X2xpYl8kYm9vc3RfdGFnXyRib29zdF9ydG9wdF8kYm9vc3RfdmVyXyBcCisgICAgYm9vc3RfJGJvb3N0X2xpYl8kYm9vc3RfdGFnXyRib29zdF9tdF8kYm9vc3RfdmVyXyBcCisgICAgYm9vc3RfJGJvb3N0X2xpYl8kYm9vc3RfdGFnXyRib29zdF92ZXJfCisgIGRvCisgICAgIyBBdm9pZCB0ZXN0aW5nIHR3aWNlIHRoZSBzYW1lIGxpYgorICAgIGNhc2UgJGJvb3N0X2ZhaWxlZF9saWJzIGluICMoCisgICAgICAoKkAkYm9vc3RfbGliQCopIGNvbnRpbnVlOzsKKyAgICBlc2FjCisgICAgIyBJZiB3aXRoX2Jvb3N0IGlzIGVtcHR5LCB3ZSdsbCBzZWFyY2ggaW4gL2xpYiBmaXJzdCwgd2hpY2ggaXMgbm90IHF1aXRlCisgICAgIyByaWdodCBzbyBpbnN0ZWFkIHdlJ2xsIHRyeSB0byBhIGxvY2F0aW9uIGJhc2VkIG9uIHdoZXJlIHRoZSBoZWFkZXJzIGFyZS4KKyAgICBib29zdF90bXBfbGliPSR3aXRoX2Jvb3N0CisgICAgdGVzdCB4IiR3aXRoX2Jvb3N0IiA9IHggJiYgYm9vc3RfdG1wX2xpYj0ke2Jvb3N0X2N2X2luY19wYXRoJS9pbmNsdWRlfQorICAgIGZvciBib29zdF9sZHBhdGggaW4gIiRib29zdF90bXBfbGliL2xpYiIgJycgXAorICAgICAgICAgICAgIC9vcHQvbG9jYWwvbGliKiAvdXNyL2xvY2FsL2xpYiogL29wdC9saWIqIC91c3IvbGliKiBcCisgICAgICAgICAgICAgIiR3aXRoX2Jvb3N0IiBDOi9Cb29zdC9saWIgL2xpYioKKyAgICBkbworICAgICAgIyBEb24ndCB3YXN0ZSB0aW1lIHdpdGggZGlyZWN0b3JpZXMgdGhhdCBkb24ndCBleGlzdC4KKyAgICAgIGlmIHRlc3QgeCIkYm9vc3RfbGRwYXRoIiAhPSB4ICYmIHRlc3QgISAtZSAiJGJvb3N0X2xkcGF0aCI7IHRoZW4KKyAgICAgICAgY29udGludWUKKyAgICAgIGZpCisgICAgICBib29zdF9zYXZlX0xERkxBR1M9JExERkxBR1MKKyAgICAgICMgQXJlIHdlIGxvb2tpbmcgZm9yIGEgc3RhdGljIGxpYnJhcnk/CisgICAgICBjYXNlICRib29zdF9sZHBhdGg6JGJvb3N0X3J0b3B0XyBpbiAjKAorICAgICAgICAoKj8qOipzKikgIyBZZXMgKE5vbiBlbXB0eSBib29zdF9sZHBhdGggKyBzIGluIHJ0IG9wdCkKKyAgICAgICAgICBCb29zdF9saWJfTElCUz0iJGJvb3N0X2xkcGF0aC9saWIkYm9vc3RfbGliLiRsaWJleHQiCisgICAgICAgICAgdGVzdCAtZSAiJEJvb3N0X2xpYl9MSUJTIiB8fCBjb250aW51ZTs7ICMoCisgICAgICAgICgqKSAjIE5vOiB1c2UgLWxib29zdF9mb28gdG8gZmluZCB0aGUgc2hhcmVkIGxpYnJhcnkuCisgICAgICAgICAgQm9vc3RfbGliX0xJQlM9Ii1sJGJvb3N0X2xpYiI7OworICAgICAgZXNhYworICAgICAgYm9vc3Rfc2F2ZV9MSUJTPSRMSUJTCisgICAgICBMSUJTPSIkQm9vc3RfbGliX0xJQlMgJExJQlMiCisgICAgICB0ZXN0IHgiJGJvb3N0X2xkcGF0aCIgIT0geCAmJiBMREZMQUdTPSIkTERGTEFHUyAtTCRib29zdF9sZHBhdGgiCitkbmwgRmlyc3QgYXJndW1lbnQgb2YgQUNfTElOS19JRkVMU0UgbGVmdCBlbXB0eSBiZWNhdXNlIHRoZSB0ZXN0IGZpbGUgaXMKK2RubCBnZW5lcmF0ZWQgb25seSBvbmNlIGFib3ZlIChiZWZvcmUgd2Ugc3RhcnQgdGhlIGZvciBsb29wcykuCisgICAgICBfQk9PU1RfQUNfTElOS19JRkVMU0UoW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0Jvb3N0X2xpYj15ZXNdLCBbQm9vc3RfbGliPW5vXSkKKyAgICAgIGFjX29iamV4dD0kYm9vc3Rfc2F2ZV9hY19vYmpleHQKKyAgICAgIExERkxBR1M9JGJvb3N0X3NhdmVfTERGTEFHUworICAgICAgTElCUz0kYm9vc3Rfc2F2ZV9MSUJTCisgICAgICBpZiB0ZXN0IHgiJEJvb3N0X2xpYiIgPSB4eWVzOyB0aGVuCisgICAgICAgICMgQ2hlY2sgb3IgdXNlZCBjYWNoZWQgcmVzdWx0IG9mIHdoZXRoZXIgb3Igbm90IHVzaW5nIC1SIG9yCisgICAgICAgICMgLXJwYXRoIG1ha2VzIHNlbnNlLiAgU29tZSBpbXBsZW1lbnRhdGlvbnMgb2YgbGQsIHN1Y2ggYXMgZm9yCisgICAgICAgICMgTWFjIE9TWCwgcmVxdWlyZSAtcnBhdGggYnV0IC1SIGlzIHRoZSBmbGFnIGtub3duIHRvIHdvcmsgb24KKyAgICAgICAgIyBvdGhlciBzeXN0ZW1zLiAgaHR0cHM6Ly9naXRodWIuY29tL3RzdW5hL2Jvb3N0Lm00L2lzc3Vlcy8xOQorICAgICAgICBBQ19DQUNIRV9WQUwoW2Jvb3N0X2N2X3JwYXRoX2xpbmtfbGRmbGFnXSwKKyAgICAgICAgICBbY2FzZSAkYm9vc3RfbGRwYXRoIGluCisgICAgICAgICAgICcnKSAjIE5vdGhpbmcgdG8gZG8uCisgICAgICAgICAgICAgYm9vc3RfY3ZfcnBhdGhfbGlua19sZGZsYWc9CisgICAgICAgICAgICAgYm9vc3RfcnBhdGhfbGlua19sZGZsYWdfZm91bmQ9eWVzOzsKKyAgICAgICAgICAgKikKKyAgICAgICAgICAgIGZvciBib29zdF9jdl9ycGF0aF9saW5rX2xkZmxhZyBpbiAtV2wsLVIsIC1XbCwtcnBhdGgsOyBkbworICAgICAgICAgICAgICBMREZMQUdTPSIkYm9vc3Rfc2F2ZV9MREZMQUdTIC1MJGJvb3N0X2xkcGF0aCAkYm9vc3RfY3ZfcnBhdGhfbGlua19sZGZsYWckYm9vc3RfbGRwYXRoIgorICAgICAgICAgICAgICBMSUJTPSIkYm9vc3Rfc2F2ZV9MSUJTICRCb29zdF9saWJfTElCUyIKKyAgICAgICAgICAgICAgX0JPT1NUX0FDX0xJTktfSUZFTFNFKFtdLAorICAgICAgICAgICAgICAgIFtib29zdF9ycGF0aF9saW5rX2xkZmxhZ19mb3VuZD15ZXMKKyAgICAgICAgICAgICAgICBicmVha10sCisgICAgICAgICAgICAgICAgW2Jvb3N0X3JwYXRoX2xpbmtfbGRmbGFnX2ZvdW5kPW5vXSkKKyAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgIDs7CisgICAgICAgICAgZXNhYworICAgICAgICAgIEFTX0lGKFt0ZXN0ICJ4JGJvb3N0X3JwYXRoX2xpbmtfbGRmbGFnX2ZvdW5kIiAhPSAieHllcyJdLAorICAgICAgICAgICAgW0FDX01TR19FUlJPUihbVW5hYmxlIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHVzZSAtUiBvciAtcnBhdGhdKV0pCisgICAgICAgICAgTERGTEFHUz0kYm9vc3Rfc2F2ZV9MREZMQUdTCisgICAgICAgICAgTElCUz0kYm9vc3Rfc2F2ZV9MSUJTCisgICAgICAgICAgXSkKKyAgICAgICAgdGVzdCB4IiRib29zdF9sZHBhdGgiICE9IHggJiYKKyAgICAgICAgICBCb29zdF9saWJfTERGTEFHUz0iLUwkYm9vc3RfbGRwYXRoICRib29zdF9jdl9ycGF0aF9saW5rX2xkZmxhZyRib29zdF9sZHBhdGgiCisgICAgICAgIEJvb3N0X2xpYl9MRFBBVEg9IiRib29zdF9sZHBhdGgiCisgICAgICAgIGJyZWFrIDcKKyAgICAgIGVsc2UKKyAgICAgICAgYm9vc3RfZmFpbGVkX2xpYnM9IiRib29zdF9mYWlsZWRfbGlic0AkYm9vc3RfbGliQCIKKyAgICAgIGZpCisgICAgZG9uZQorICBkb25lCitkb25lCitkb25lCitkb25lCitkb25lCitkb25lICMgYm9vc3RfbGliXworcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorXSkKKworCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKKyMgQ2hlY2tzIGZvciB0aGUgdmFyaW91cyBCb29zdCBsaWJyYXJpZXMuICMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKKworIyBMaXN0IG9mIGJvb3N0IGxpYnJhcmllczogaHR0cDovL3d3dy5ib29zdC5vcmcvbGlicy9saWJyYXJpZXMuaHRtCisjIFRoZSBwYWdlIGh0dHA6Ly9iZXRhLmJvb3N0Lm9yZy9kb2MvbGlicyBpcyB1c2VmdWw6IGl0IGdpdmVzIHRoZSBmaXJzdCByZWxlYXNlCisjIHZlcnNpb24gb2YgZWFjaCBsaWJyYXJ5IChhbW9uZyBvdGhlciB0aGluZ3MpLgorCisjIEJPT1NUX0RFRlVOKExJQlJBUlksIENPREUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlZmluZSBCT09TVF88TElCUkFSWS1VUFBFUkNBU0U+IGFzIGEgbWFjcm8gdGhhdCBydW5zIENPREUuCisjCisjIFVzZSBpbmRpciB0byBhdm9pZCB0aGUgd2FybmluZyBvbiB1bmRlcnF1b3RlZCBtYWNybyBuYW1lIGdpdmVuIHRvIEFDX0RFRlVOLgorbTRfZGVmaW5lKFtCT09TVF9ERUZVTl0sCitbbTRfaW5kaXIoW0FDX0RFRlVOXSwKKyAgICAgICAgICBtNF90b3VwcGVyKFtCT09TVF8kMV0pLAorW200X3B1c2hkZWYoW0JPT1NUX0xpYnJhcnldLCBbJDFdKWRubAorJDIKK200X3BvcGRlZihbQk9PU1RfTGlicmFyeV0pZG5sCitdKQorXSkKKworIyBCT09TVF9BUlJBWSgpCisjIC0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuQXJyYXkKK0JPT1NUX0RFRlVOKFtBcnJheV0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L2FycmF5LmhwcF0pXSkKKworCisjIEJPT1NUX0FTSU8oKQorIyAtLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuQXNpbyAobmV3IGluIEJvb3N0IDEuMzUpLgorQk9PU1RfREVGVU4oW0FzaW9dLAorW0FDX1JFUVVJUkUoW0JPT1NUX1NZU1RFTV0pZG5sCitCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvYXNpby5ocHBdKV0pCisKKworIyBCT09TVF9CSU5EKCkKKyMgLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkJpbmQuCitCT09TVF9ERUZVTihbQmluZF0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L2JpbmQuaHBwXSldKQorCisKKyMgQk9PU1RfQ0hST05PKCkKKyMgLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuQ2hyb25vLgorQk9PU1RfREVGVU4oW0Nocm9ub10sCitbIyBEbyB3ZSBoYXZlIHRvIGNoZWNrIGZvciBCb29zdC5TeXN0ZW0/ICBUaGlzIGxpbmstdGltZSBkZXBlbmRlbmN5IHdhcworIyBhZGRlZCBhcyBvZiAxLjM1LjAuICBJZiB3ZSBoYXZlIGEgdmVyc2lvbiA8MS4zNSwgd2UgbXVzdCBub3QgYXR0ZW1wdCB0bworIyBmaW5kIEJvb3N0LlN5c3RlbSBhcyBpdCBkaWRuJ3QgZXhpc3QgYnkgdGhlbi4KK2lmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWdlIDEzNTsgdGhlbgorICBCT09TVF9TWVNURU0oWyQxXSkKK2ZpICMgZW5kIG9mIHRoZSBCb29zdC5TeXN0ZW0gY2hlY2suCitib29zdF9maWxlc3lzdGVtX3NhdmVfTElCUz0kTElCUworYm9vc3RfZmlsZXN5c3RlbV9zYXZlX0xERkxBR1M9JExERkxBR1MKK200X3BhdHRlcm5fYWxsb3coW15CT09TVF9TWVNURU1fKExJQlN8TERGTEFHUykkXSlkbmwKK0xJQlM9IiRMSUJTICRCT09TVF9TWVNURU1fTElCUyIKK0xERkxBR1M9IiRMREZMQUdTICRCT09TVF9TWVNURU1fTERGTEFHUyIKK0JPT1NUX0ZJTkRfTElCKFtjaHJvbm9dLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9jaHJvbm8uaHBwXSwKKyAgICAgICAgICAgICAgICBbYm9vc3Q6OmNocm9ubzo6dGhyZWFkX2Nsb2NrIGQ7XSkKK2lmIHRlc3QgJGVuYWJsZV9zdGF0aWNfYm9vc3QgPSB5ZXMgJiYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtZ2UgMTM1OyB0aGVuCisgIEJPT1NUX0NIUk9OT19MSUJTPSIkQk9PU1RfQ0hST05PX0xJQlMgJEJPT1NUX1NZU1RFTV9MSUJTIgorZmkKK0xJQlM9JGJvb3N0X2ZpbGVzeXN0ZW1fc2F2ZV9MSUJTCitMREZMQUdTPSRib29zdF9maWxlc3lzdGVtX3NhdmVfTERGTEFHUworXSkjIEJPT1NUX0NIUk9OTworCisKKyMgQk9PU1RfQ09OVEVYVChbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkNvbnRleHQuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorIworIyAqIFRoaXMgbGlicmFyeSB3YXMgaW50cm9kdWNlZCBpbiBCb29zdCAxLjUxLjAKKyMgKiBUaGUgc2lnbmF0dXJlcyBvZiBtYWtlX2Zjb250ZXh0KCkgYW5kIGp1bXBfZmNvbnRleHQgd2VyZSBjaGFuZ2VkIGluIDEuNTYuMAorIyAqIEEgZGVwZW5kZW5jeSBvbiBib29zdF90aHJlYWQgYXBwZWFycyBpbiAxLjU3LjAKK0JPT1NUX0RFRlVOKFtDb250ZXh0XSwKK1tib29zdF9jb250ZXh0X3NhdmVfTElCUz0kTElCUworIGJvb3N0X2NvbnRleHRfc2F2ZV9MREZMQUdTPSRMREZMQUdTCitpZiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxNTc7IHRoZW4KKyAgQk9PU1RfVEhSRUFEKFskMV0pCisgIG00X3BhdHRlcm5fYWxsb3coW15CT09TVF9USFJFQURfKExJQlN8TERGTEFHUykkXSlkbmwKKyAgTElCUz0iJExJQlMgJEJPT1NUX1RIUkVBRF9MSUJTIgorICBMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfVEhSRUFEX0xERkxBR1MiCitmaQorQk9PU1RfRklORF9MSUIoW2NvbnRleHRdLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9jb250ZXh0L2FsbC5ocHBdLFtbCisKKy8vIGNyZWF0ZXMgYSBzdGFjawordm9pZCAqIHN0YWNrX3BvaW50ZXIgPSBuZXcgdm9pZCpbNDA5Nl07CitzdGQ6OnNpemVfdCBjb25zdCBzaXplID0gc2l6ZW9mKHZvaWQqWzQwOTZdKTsKKworI2lmIEJPT1NUX1ZFUlNJT04gPD0gMTA1MTAwCitjdHg6Om1ha2VfZmNvbnRleHQoJmZjLCBmKTsKK3JldHVybiBjdHg6Omp1bXBfZmNvbnRleHQoJmZjbSwgJmZjLCAzKSA9PSA2OworCisjZWxzZQorCitmYyA9IGN0eDo6bWFrZV9mY29udGV4dChzdGFja19wb2ludGVyLCBzaXplLCBmKTsKK3JldHVybiBjdHg6Omp1bXBfZmNvbnRleHQoJmZjbSwgZmMsIDMpID09IDY7CisKKyNlbmRpZgorCisKK11dLFtkbmwKKworI2luY2x1ZGUgPGJvb3N0L3ZlcnNpb24uaHBwPgorI2lmIEJPT1NUX1ZFUlNJT04gPD0gMTA1MTAwCisKK25hbWVzcGFjZSBjdHggPSBib29zdDo6Y3R4OworCitzdGF0aWMgY3R4OjpmY29udGV4dF90IGZjbSwgZmM7CisKK3N0YXRpYyB2b2lkIGYoaW50cHRyX3QgaSkgeworICAgIGN0eDo6anVtcF9mY29udGV4dCgmZmMsICZmY20sIGkgKiAyKTsKK30KKworI2VsaWYgQk9PU1RfVkVSU0lPTiA8PSAxMDU1MDAKKworbmFtZXNwYWNlIGN0eCA9IGJvb3N0Ojpjb250ZXh0OworCisvLyBjb250ZXh0CitzdGF0aWMgY3R4OjpmY29udGV4dF90IGZjbSwgKmZjOworCisvLyBjb250ZXh0LWZ1bmN0aW9uCitzdGF0aWMgdm9pZCBmKGludHB0cl90IGkpIHsKKyAgICBjdHg6Omp1bXBfZmNvbnRleHQoZmMsICZmY20sIGkgKiAyKTsKK30KKworI2Vsc2UKKworbmFtZXNwYWNlIGN0eCA9IGJvb3N0Ojpjb250ZXh0OworCisvLyBjb250ZXh0CitzdGF0aWMgY3R4OjpmY29udGV4dF90IGZjbSwgZmM7CisKKy8vIGNvbnRleHQtZnVuY3Rpb24KK3N0YXRpYyB2b2lkIGYoaW50cHRyX3QgaSkgeworICAgIGN0eDo6anVtcF9mY29udGV4dCgmZmMsIGZjbSwgaSAqIDIpOworfQorI2VuZGlmCitdKQorTElCUz0kYm9vc3RfY29udGV4dF9zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X2NvbnRleHRfc2F2ZV9MREZMQUdTCitdKSMgQk9PU1RfQ09OVEVYVAorCisKKyMgQk9PU1RfQ09OVkVSU0lPTigpCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5Db252ZXJzaW9uIChjYXN0IC8gbGV4aWNhbF9jYXN0KQorQk9PU1RfREVGVU4oW0NvbnZlcnNpb25dLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9jYXN0LmhwcF0pCitCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvbGV4aWNhbF9jYXN0LmhwcF0pCitdKSMgQk9PU1RfQ09OVkVSU0lPTgorCisKKyMgQk9PU1RfQ09ST1VUSU5FKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuQ29yb3V0aW5lLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsIHNlZSB0aGUKKyMgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4gIFRoaXMgbGlicmFyeSB3YXMgaW50cm9kdWNlZCBpbiBCb29zdAorIyAxLjUzLjAKK0JPT1NUX0RFRlVOKFtDb3JvdXRpbmVdLAorWworYm9vc3RfY29yb3V0aW5lX3NhdmVfTElCUz0kTElCUworYm9vc3RfY29yb3V0aW5lX3NhdmVfTERGTEFHUz0kTERGTEFHUworIyBMaW5rLXRpbWUgZGVwZW5kZW5jeSBmcm9tIGNvcm91dGluZSB0byBjb250ZXh0CitCT09TVF9DT05URVhUKFskMV0pCisjIFN0YXJ0aW5nIGZyb20gQm9vc3QgMS41NSBhIGRlcGVuZGVuY3kgb24gQm9vc3QuU3lzdGVtIGlzIGFkZGVkCitpZiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxNTU7IHRoZW4KKyAgQk9PU1RfU1lTVEVNKFskMV0pCitmaQorbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUXyhDT05URVhUfFNZU1RFTSlfKExJQlN8TERGTEFHUyldKQorTElCUz0iJExJQlMgJEJPT1NUX0NPTlRFWFRfTElCUyAkQk9PU1RfU1lTVEVNX0xJQlMiCitMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfQ09OVEVYVF9MREZMQUdTIgorCisjIGluIDEuNTMgY29yb3V0aW5lIHdhcyBhIGhlYWRlciBvbmx5IGxpYnJhcnkKK2lmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWVxIDE1MzsgdGhlbgorICBCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvY29yb3V0aW5lL2Nvcm91dGluZS5ocHBdKQorZWxzZQorICBCT09TVF9GSU5EX0xJQihbY29yb3V0aW5lXSwgWyQxXSwKKwkJICBbYm9vc3QvY29yb3V0aW5lL2Nvcm91dGluZS5ocHBdLAorCQkgIFsKKyAgI2luY2x1ZGUgPGJvb3N0L3ZlcnNpb24uaHBwPgorICAjaWYgICBCT09TVF9WRVJTSU9OIDw9IDEwNTUwMAorICBib29zdDo6Y29yb3V0aW5lczo6Y29yb3V0aW5lPGludChpbnQpPiBjb3JvOyBjb3JvLmdldCgpOworICAjZWxzZQorICBib29zdDo6Y29yb3V0aW5lczo6YXN5bW1ldHJpY19jb3JvdXRpbmU8aW50Pjo6cHVsbF90eXBlIGNvcm87IGNvcm8uZ2V0KCk7CisgICNlbmRpZgorICBdKQorZmkKKyMgTGluay10aW1lIGRlcGVuZGVuY3kgZnJvbSBjb3JvdXRpbmUgdG8gY29udGV4dCwgZXhpc3RlZCBvbmx5IGluIDEuNTMsIGluIDEuNTQKKyMgY29yb3V0aW5lIGRvZXNuJ3QgdXNlIGNvbnRleHQgZnJvbSBpdHMgaGVhZGVycyBidXQgZnJvbSBpdHMgbGlicmFyeS4KK2lmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWVxIDE1MyB8fCB0ZXN0ICRlbmFibGVfc3RhdGljX2Jvb3N0ID0geWVzICYmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWdlIDE1NDsgdGhlbgorICBCT09TVF9DT1JPVVRJTkVfTElCUz0iJEJPT1NUX0NPUk9VVElORV9MSUJTICRCT09TVF9DT05URVhUX0xJQlMiCisgIEJPT1NUX0NPUk9VVElORV9MREZMQUdTPSIkQk9PU1RfQ09ST1VUSU5FX0xERkxBR1MgJEJPT1NUX0NPTlRFWFRfTERGTEFHUyIKK2ZpCitpZiB0ZXN0ICRlbmFibGVfc3RhdGljX2Jvb3N0ID0geWVzICYmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWdlIDE1NTsgdGhlbgorICBCT09TVF9DT1JPVVRJTkVfTElCUz0iJEJPT1NUX0NPUk9VVElORV9MSUJTICRCT09TVF9TWVNURU1fTElCUyIKKyAgQk9PU1RfQ09ST1VUSU5FX0xERkxBR1M9IiRCT09TVF9DT1JPVVRJTkVfTERGTEFHUyAkQk9PU1RfU1lTVEVNX0xERkxBR1MiCitmaQorTElCUz0kYm9vc3RfY29yb3V0aW5lX3NhdmVfTElCUworTERGTEFHUz0kYm9vc3RfY29yb3V0aW5lX3NhdmVfTERGTEFHUworXSkjIEJPT1NUX0NPUk9VVElORQorCisKKyMgQk9PU1RfQ1JDKCkKKyMgLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuQ1JDCitCT09TVF9ERUZVTihbQ1JDXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvY3JjLmhwcF0pCitdKSMgQk9PU1RfQ1JDCisKKworIyBCT09TVF9EQVRFX1RJTUUoW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5EYXRlX1RpbWUuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW0RhdGVfVGltZV0sCitbQk9PU1RfRklORF9MSUIoW2RhdGVfdGltZV0sIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L2RhdGVfdGltZS9wb3NpeF90aW1lL3Bvc2l4X3RpbWUuaHBwXSwKKyAgICAgICAgICAgICAgICBbYm9vc3Q6OnBvc2l4X3RpbWU6OnB0aW1lIHQ7XSkKK10pIyBCT09TVF9EQVRFX1RJTUUKKworCisjIEJPT1NUX0ZJTEVTWVNURU0oW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuRmlsZXN5c3RlbS4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUKKyMgdGhlIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCisjIERvIG5vdCBjaGVjayBmb3IgYm9vc3QvZmlsZXN5c3RlbS5ocHAgYmVjYXVzZSB0aGlzIGZpbGUgd2FzIGludHJvZHVjZWQgaW4KKyMgMS4zNC4KK0JPT1NUX0RFRlVOKFtGaWxlc3lzdGVtXSwKK1sjIERvIHdlIGhhdmUgdG8gY2hlY2sgZm9yIEJvb3N0LlN5c3RlbT8gIFRoaXMgbGluay10aW1lIGRlcGVuZGVuY3kgd2FzCisjIGFkZGVkIGFzIG9mIDEuMzUuMC4gIElmIHdlIGhhdmUgYSB2ZXJzaW9uIDwxLjM1LCB3ZSBtdXN0IG5vdCBhdHRlbXB0IHRvCisjIGZpbmQgQm9vc3QuU3lzdGVtIGFzIGl0IGRpZG4ndCBleGlzdCBieSB0aGVuLgoraWYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtZ2UgMTM1OyB0aGVuCisgIEJPT1NUX1NZU1RFTShbJDFdKQorZmkgIyBlbmQgb2YgdGhlIEJvb3N0LlN5c3RlbSBjaGVjay4KK2Jvb3N0X2ZpbGVzeXN0ZW1fc2F2ZV9MSUJTPSRMSUJTCitib29zdF9maWxlc3lzdGVtX3NhdmVfTERGTEFHUz0kTERGTEFHUworbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX1NZU1RFTV8oTElCU3xMREZMQUdTKSRdKWRubAorTElCUz0iJExJQlMgJEJPT1NUX1NZU1RFTV9MSUJTIgorTERGTEFHUz0iJExERkxBR1MgJEJPT1NUX1NZU1RFTV9MREZMQUdTIgorQk9PU1RfRklORF9MSUIoW2ZpbGVzeXN0ZW1dLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9maWxlc3lzdGVtL3BhdGguaHBwXSwgW2Jvb3N0OjpmaWxlc3lzdGVtOjpwYXRoIHA7XSkKK2lmIHRlc3QgJGVuYWJsZV9zdGF0aWNfYm9vc3QgPSB5ZXMgJiYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtZ2UgMTM1OyB0aGVuCisgIEJPT1NUX0ZJTEVTWVNURU1fTElCUz0iJEJPT1NUX0ZJTEVTWVNURU1fTElCUyAkQk9PU1RfU1lTVEVNX0xJQlMiCitmaQorTElCUz0kYm9vc3RfZmlsZXN5c3RlbV9zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X2ZpbGVzeXN0ZW1fc2F2ZV9MREZMQUdTCitdKSMgQk9PU1RfRklMRVNZU1RFTQorCisKKyMgQk9PU1RfRkxZV0VJR0hUKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuRmx5d2VpZ2h0LgorQk9PU1RfREVGVU4oW0ZseXdlaWdodF0sCitbZG5sIFRoZXJlJ3MgYSBoaWRkZW4gZGVwZW5kZW5jeSBvbiBwdGhyZWFkcy4KK0FDX1JFUVVJUkUoW19CT09TVF9QVEhSRUFEX0ZMQUddKWRubAorQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L2ZseXdlaWdodC5ocHBdKQorQUNfU1VCU1QoW0JPT1NUX0ZMWVdFSUdIVF9MSUJTXSwgWyRib29zdF9jdl9wdGhyZWFkX2ZsYWddKQorXSkKKworCisjIEJPT1NUX0ZPUkVBQ0goKQorIyAtLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuRm9yZWFjaC4KK0JPT1NUX0RFRlVOKFtGb3JlYWNoXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvZm9yZWFjaC5ocHBdKV0pCisKKworIyBCT09TVF9GT1JNQVQoKQorIyAtLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5Gb3JtYXQuCisjIE5vdGU6IHdlIGNhbid0IGNoZWNrIGZvciBib29zdC9mb3JtYXQvZm9ybWF0X2Z3ZC5ocHAgYmVjYXVzZSB0aGUgaGVhZGVyIGlzbid0CisjIHN0YW5kYWxvbmUuICBJdCBjYW4ndCBiZSBjb21waWxlZCBiZWNhdXNlIGl0IHRyaWdnZXJzIHRoZSBmb2xsb3dpbmcgZXJyb3I6CisjIGJvb3N0L2Zvcm1hdC9kZXRhaWwvY29uZmlnX21hY3Jvcy5ocHA6ODg6IGVycm9yOiAnbG9jYWxlJyBpbiBuYW1lc3BhY2UgJ3N0ZCcKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZXMgbm90IG5hbWUgYSB0eXBlCitCT09TVF9ERUZVTihbRm9ybWF0XSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvZm9ybWF0LmhwcF0pXSkKKworCisjIEJPT1NUX0ZVTkNUSU9OKCkKKyMgLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5GdW5jdGlvbgorQk9PU1RfREVGVU4oW0Z1bmN0aW9uXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvZnVuY3Rpb24uaHBwXSldKQorCisKKyMgQk9PU1RfR0VPTUVUUlkoKQorIyAtLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0Lkdlb21ldHJ5IChuZXcgc2luY2UgMS40Ny4wKS4KK0JPT1NUX0RFRlVOKFtHZW9tZXRyeV0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L2dlb21ldHJ5LmhwcF0pCitdKSMgQk9PU1RfR0VPTUVUUlkKKworCisjIEJPT1NUX0dSQVBIKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5HcmFwaHMuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW0dyYXBoXSwKK1tib29zdF9ncmFwaF9zYXZlX0xJQlM9JExJQlMKK2Jvb3N0X2dyYXBoX3NhdmVfTERGTEFHUz0kTERGTEFHUworIyBMaW5rLXRpbWUgZGVwZW5kZW5jeSBmcm9tIGdyYXBoIHRvIHJlZ2V4IHdhcyBhZGRlZCBhcyBvZiAxLjQwLjAuCitpZiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxNDA7IHRoZW4KKyAgQk9PU1RfUkVHRVgoWyQxXSkKKyAgbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUX1JFR0VYXyhMSUJTfExERkxBR1MpJF0pZG5sCisgIExJQlM9IiRMSUJTICRCT09TVF9SRUdFWF9MSUJTIgorICBMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfUkVHRVhfTERGTEFHUyIKK2ZpCitCT09TVF9GSU5EX0xJQihbZ3JhcGhdLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9ncmFwaC9hZGphY2VuY3lfbGlzdC5ocHBdLCBbYm9vc3Q6OmFkamFjZW5jeV9saXN0PD4gZztdKQorTElCUz0kYm9vc3RfZ3JhcGhfc2F2ZV9MSUJTCitMREZMQUdTPSRib29zdF9ncmFwaF9zYXZlX0xERkxBR1MKK10pIyBCT09TVF9HUkFQSAorCisKKyMgQk9PU1RfSU9TVFJFQU1TKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuSU9TdHJlYW1zLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsIHNlZSB0aGUKKyMgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4KK0JPT1NUX0RFRlVOKFtJT1N0cmVhbXNdLAorW0JPT1NUX0ZJTkRfTElCKFtpb3N0cmVhbXNdLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9pb3N0cmVhbXMvZGV2aWNlL2ZpbGVfZGVzY3JpcHRvci5ocHBdLAorICAgICAgICAgICAgICAgIFtib29zdDo6aW9zdHJlYW1zOjpmaWxlX2Rlc2NyaXB0b3IgZmQ7IGZkLmNsb3NlKCk7XSkKK10pIyBCT09TVF9JT1NUUkVBTVMKKworCisjIEJPT1NUX0hBU0goKQorIyAtLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuRnVuY3Rpb25hbC9IYXNoCitCT09TVF9ERUZVTihbSGFzaF0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L2Z1bmN0aW9uYWwvaGFzaC5ocHBdKV0pCisKKworIyBCT09TVF9MQU1CREEoKQorIyAtLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5MYW1iZGEKK0JPT1NUX0RFRlVOKFtMYW1iZGFdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9sYW1iZGEvbGFtYmRhLmhwcF0pXSkKKworCisjIEJPT1NUX0xPQ0FMRSgpCisjIC0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkxvY2FsZQorQk9PU1RfREVGVU4oW0xvY2FsZV0sCitbCitib29zdF9sb2NhbGVfc2F2ZV9MSUJTPSRMSUJTCitib29zdF9sb2NhbGVfc2F2ZV9MREZMQUdTPSRMREZMQUdTCisjIHJlcXVpcmUgU1lTVEVNIGZvciBib29zdC0xLjUwLjAgYW5kIHVwCitpZiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxNTA7IHRoZW4KKyAgQk9PU1RfU1lTVEVNKFskMV0pCisgIG00X3BhdHRlcm5fYWxsb3coW15CT09TVF9TWVNURU1fKExJQlN8TERGTEFHUykkXSlkbmwKKyAgTElCUz0iJExJQlMgJEJPT1NUX1NZU1RFTV9MSUJTIgorICBMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfU1lTVEVNX0xERkxBR1MiCitmaSAjIGVuZCBvZiB0aGUgQm9vc3QuU3lzdGVtIGNoZWNrLgorQk9PU1RfRklORF9MSUIoW2xvY2FsZV0sIFskMV0sCisgICAgW2Jvb3N0L2xvY2FsZS5ocHBdLAorICAgIFtbYm9vc3Q6OmxvY2FsZTo6Z2VuZXJhdG9yIGdlbjsgc3RkOjpsb2NhbGU6Omdsb2JhbChnZW4oIiIpKTtdXSkKK0xJQlM9JGJvb3N0X2xvY2FsZV9zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X2xvY2FsZV9zYXZlX0xERkxBR1MKK10pIyBCT09TVF9MT0NBTEUKKworIyBCT09TVF9MT0coW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5Mb2cuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW0xvZ10sCitbYm9vc3RfbG9nX3NhdmVfTElCUz0kTElCUworYm9vc3RfbG9nX3NhdmVfTERGTEFHUz0kTERGTEFHUworQk9PU1RfU1lTVEVNKFskMV0pCitCT09TVF9GSUxFU1lTVEVNKFskMV0pCitCT09TVF9EQVRFX1RJTUUoWyQxXSkKK200X3BhdHRlcm5fYWxsb3coW15CT09TVF8oU1lTVEVNfEZJTEVTWVNURU18REFURV9USU1FKV8oTElCU3xMREZMQUdTKSRdKWRubAorTElCUz0iJExJQlMgJEJPT1NUX0RBVEVfVElNRV9MSUJTICRCT09TVF9GSUxFU1lTVEVNX0xJQlMgJEJPT1NUX1NZU1RFTV9MSUJTIgorTERGTEFHUz0iJExERkxBR1MgJEJPT1NUX0RBVEVfVElNRV9MREZMQUdTICRCT09TVF9GSUxFU1lTVEVNX0xERkxBR1MgJEJPT1NUX1NZU1RFTV9MREZMQUdTIgorQk9PU1RfRklORF9MSUIoW2xvZ10sIFskMV0sCisgICAgW2Jvb3N0L2xvZy9jb3JlL2NvcmUuaHBwXSwKKyAgICBbYm9vc3Q6OmxvZzo6YXR0cmlidXRlIGE7IGEuZ2V0X3ZhbHVlKCk7XSkKK0xJQlM9JGJvb3N0X2xvZ19zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X2xvZ19zYXZlX0xERkxBR1MKK10pIyBCT09TVF9MT0cKKworCisjIEJPT1NUX0xPR19TRVRVUChbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LkxvZy4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbTG9nX1NldHVwXSwKK1tib29zdF9sb2dfc2V0dXBfc2F2ZV9MSUJTPSRMSUJTCitib29zdF9sb2dfc2V0dXBfc2F2ZV9MREZMQUdTPSRMREZMQUdTCitCT09TVF9MT0coWyQxXSkKK200X3BhdHRlcm5fYWxsb3coW15CT09TVF9MT0dfKExJQlN8TERGTEFHUykkXSlkbmwKK0xJQlM9IiRMSUJTICRCT09TVF9MT0dfTElCUyIKK0xERkxBR1M9IiRMREZMQUdTICRCT09TVF9MT0dfTERGTEFHUyIKK0JPT1NUX0ZJTkRfTElCKFtsb2dfc2V0dXBdLCBbJDFdLAorICAgIFtib29zdC9sb2cvdXRpbGl0eS9zZXR1cC9mcm9tX3NldHRpbmdzLmhwcF0sCisgICAgW2Jvb3N0Ojpsb2c6OmJhc2ljX3NldHRpbmdzPGNoYXI+IGJzOyBicy5lbXB0eSgpO10pCitMSUJTPSRib29zdF9sb2dfc2V0dXBfc2F2ZV9MSUJTCitMREZMQUdTPSRib29zdF9sb2dfc2V0dXBfc2F2ZV9MREZMQUdTCitdKSMgQk9PU1RfTE9HX1NFVFVQCisKKworIyBCT09TVF9NQVRIKCkKKyMgLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0Lk1hdGgKKyMgVE9ETzogVGhpcyBsaWJyYXJ5IGlzbid0IGhlYWRlci1vbmx5IGJ1dCBpdCBjb21lcyBpbiBtdWx0aXBsZSBkaWZmZXJlbnQKKyMgZmxhdm9ycyB0aGF0IGRvbid0IHBsYXkgd2VsbCB3aXRoIEJPT1NUX0ZJTkRfTElCIChlLmcsIGxpYmJvb3N0X21hdGhfYzk5LAorIyBsaWJib29zdF9tYXRoX2M5OWYsIGxpYmJvb3N0X21hdGhfYzk5bCwgbGliYm9vc3RfbWF0aF90cjEsCisjIGxpYmJvb3N0X21hdGhfdHIxZiwgbGliYm9vc3RfbWF0aF90cjFsKS4gIFRoaXMgbWFjcm8gbXVzdCBiZSBmaXhlZCB0byBkbyB0aGUKKyMgcmlnaHQgdGhpbmcgYW55d2F5LgorQk9PU1RfREVGVU4oW01hdGhdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9tYXRoL3NwZWNpYWxfZnVuY3Rpb25zLmhwcF0pXSkKKworCisjIEJPT1NUX01QSShbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QgTVBJLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsIHNlZSB0aGUKKyMgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4gIFVzZXMgTVBJQ1hYIHZhcmlhYmxlIGlmIGl0IGlzCisjIHNldCwgb3RoZXJ3aXNlIHRyaWVzIENYWAorIworQk9PU1RfREVGVU4oW01QSV0sCitbYm9vc3Rfc2F2ZV9DWFg9JHtDWFh9Citib29zdF9zYXZlX0NYWENQUD0ke0NYWENQUH0KK2lmIHRlc3QgeCIke01QSUNYWH0iICE9IHg7IHRoZW4KKyAgQ1hYPSR7TVBJQ1hYfQorICBDWFhDUFA9IiR7TVBJQ1hYfSAtRSIKK2ZpCitCT09TVF9GSU5EX0xJQihbbXBpXSwgWyQxXSwKKyAgICAgICAgICAgICAgIFtib29zdC9tcGkuaHBwXSwKKyAgICAgICAgICAgICAgIFtpbnQgYXJnYyA9IDA7CisgICAgICAgICAgICAgICAgY2hhciAqKmFyZ3YgPSAwOworICAgICAgICAgICAgICAgIGJvb3N0OjptcGk6OmVudmlyb25tZW50IGVudihhcmdjLGFyZ3YpO10pCitDWFg9JHtib29zdF9zYXZlX0NYWH0KK0NYWENQUD0ke2Jvb3N0X3NhdmVfQ1hYQ1BQfQorXSkjIEJPT1NUX01QSQorCisKKyMgQk9PU1RfTVVMVElBUlJBWSgpCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5NdWx0aUFycmF5CitCT09TVF9ERUZVTihbTXVsdGlBcnJheV0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L211bHRpX2FycmF5LmhwcF0pXSkKKworCisjIEJPT1NUX05VTUVSSUNfVUJMQVMoKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5OdW1lcmljVWJsYXMgKEJhc2ljIExpbmVhciBBbGdlYnJhKQorQk9PU1RfREVGVU4oW051bWVyaWNfVWJsYXNdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9udW1lcmljL3VibGFzL3ZlY3Rvci5ocHBdKQorXSkjIEJPT1NUX05VTUVSSUNfVUJMQVMKKworCisjIEJPT1NUX05VTUVSSUNfQ09OVkVSU0lPTigpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0Lk51bWVyaWNDb252ZXJzaW9uIChwb2xpY3ktYmFzZWQgbnVtZXJpYyBjb252ZXJzaW9uKQorQk9PU1RfREVGVU4oW051bWVyaWNfQ29udmVyc2lvbl0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L251bWVyaWMvY29udmVyc2lvbi9jb252ZXJ0ZXIuaHBwXSkKK10pIyBCT09TVF9OVU1FUklDX0NPTlZFUlNJT04KKworCisjIEJPT1NUX09QVElPTkFMKCkKKyMgLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5PcHRpb25hbAorQk9PU1RfREVGVU4oW09wdGlvbmFsXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3Qvb3B0aW9uYWwuaHBwXSldKQorCisKKyMgQk9PU1RfUFJFUFJPQ0VTU09SKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuUHJlcHJvY2Vzc29yCitCT09TVF9ERUZVTihbUHJlcHJvY2Vzc29yXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvcHJlcHJvY2Vzc29yL3JlcGVhdC5ocHBdKV0pCisKKworIyBCT09TVF9SQU5HRSgpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlJhbmdlCitCT09TVF9ERUZVTihbUmFuZ2VdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9yYW5nZS9hZGFwdG9ycy5ocHBdKV0pCisKKyMgQk9PU1RfVU5PUkRFUkVEKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuVW5vcmRlcmVkCitCT09TVF9ERUZVTihbVW5vcmRlcmVkXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvdW5vcmRlcmVkX21hcC5ocHBdKV0pCisKKworIyBCT09TVF9VVUlEKCkKKyMgLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlV1aWQKK0JPT1NUX0RFRlVOKFtVdWlkXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvdXVpZC91dWlkLmhwcF0pXSkKKworCisjIEJPT1NUX1BST0dSQU1fT1BUSU9OUyhbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlByb2dyYW1fb3B0aW9ucy4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULAorIyBzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbUHJvZ3JhbV9PcHRpb25zXSwKK1tCT09TVF9GSU5EX0xJQihbcHJvZ3JhbV9vcHRpb25zXSwgWyQxXSwKKyAgICAgICAgICAgICAgICBbYm9vc3QvcHJvZ3JhbV9vcHRpb25zLmhwcF0sCisgICAgICAgICAgICAgICAgW2Jvb3N0Ojpwcm9ncmFtX29wdGlvbnM6Om9wdGlvbnNfZGVzY3JpcHRpb24gZCgidGVzdCIpO10pCitdKSMgQk9PU1RfUFJPR1JBTV9PUFRJT05TCisKKworCisjIF9CT09TVF9QWVRIT05fQ09ORklHKFZBUklBQkxFLCBGTEFHKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2F2ZSBWQVJJQUJMRSwgYW5kIGRlZmluZSBpdCB2aWEgYHB5dGhvbi1jb25maWcgLS1GTEFHYC4KKyMgU3Vic3RpdHV0ZSBCT09TVF9QWVRIT05fVkFSSUFCTEUuCittNF9kZWZpbmUoW19CT09TVF9QWVRIT05fQ09ORklHXSwKK1tBQ19TVUJTVChbQk9PU1RfUFlUSE9OXyQxXSwKKyAgICAgICAgICBbYHB5dGhvbi1jb25maWcgLS0kMiAyPi9kZXYvbnVsbGBdKWRubAorYm9vc3RfcHl0aG9uX3NhdmVfJDE9JCQxCiskMT0iJCQxICRCT09TVF9QWVRIT05fJDEiXSkKKworCisjIEJPT1NUX1BZVEhPTihbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlB5dGhvbi4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULAorIyBzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbUHl0aG9uXSwKK1tfQk9PU1RfUFlUSE9OX0NPTkZJRyhbQ1BQRkxBR1NdLCBbaW5jbHVkZXNdKQorX0JPT1NUX1BZVEhPTl9DT05GSUcoW0xERkxBR1NdLCAgIFtsZGZsYWdzXSkKK19CT09TVF9QWVRIT05fQ09ORklHKFtMSUJTXSwgICAgICBbbGlic10pCittNF9wYXR0ZXJuX2FsbG93KFteQk9PU1RfUFlUSE9OX01PRFVMRSRdKWRubAorQk9PU1RfRklORF9MSUJTKFtweXRob25dLCBbcHl0aG9uIHB5dGhvbjNdLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9weXRob24uaHBwXSwKKyAgICAgICAgICAgICAgICBbXSwgW0JPT1NUX1BZVEhPTl9NT0RVTEUoZW1wdHkpIHt9XSkKK0NQUEZMQUdTPSRib29zdF9weXRob25fc2F2ZV9DUFBGTEFHUworTERGTEFHUz0kYm9vc3RfcHl0aG9uX3NhdmVfTERGTEFHUworTElCUz0kYm9vc3RfcHl0aG9uX3NhdmVfTElCUworXSkjIEJPT1NUX1BZVEhPTgorCisKKyMgQk9PU1RfUkVGKCkKKyMgLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuUmVmCitCT09TVF9ERUZVTihbUmVmXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvcmVmLmhwcF0pXSkKKworCisjIEJPT1NUX1JFR0VYKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5SZWdleC4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbUmVnZXhdLAorW0JPT1NUX0ZJTkRfTElCKFtyZWdleF0sIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L3JlZ2V4LmhwcF0sCisgICAgICAgICAgICAgICAgW2Jvb3N0OjpyZWdleCBleHAoIioiKTsgYm9vc3Q6OnJlZ2V4X21hdGNoKCJmb28iLCBleHApO10pCitdKSMgQk9PU1RfUkVHRVgKKworCisjIEJPT1NUX1NFUklBTElaQVRJT04oW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuU2VyaWFsaXphdGlvbi4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUKKyMgdGhlIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuCitCT09TVF9ERUZVTihbU2VyaWFsaXphdGlvbl0sCitbQk9PU1RfRklORF9MSUIoW3NlcmlhbGl6YXRpb25dLCBbJDFdLAorICAgICAgICAgICAgICAgIFtib29zdC9hcmNoaXZlL3RleHRfb2FyY2hpdmUuaHBwXSwKKyAgICAgICAgICAgICAgICBbc3RkOjpvc3RyZWFtKiBvID0gMDsgLy8gQ2hlYXAgd2F5IHRvIGdldCBhbiBvc3RyZWFtLi4uCisgICAgICAgICAgICAgICAgYm9vc3Q6OmFyY2hpdmU6OnRleHRfb2FyY2hpdmUgdCgqbyk7XSkKK10pIyBCT09TVF9TRVJJQUxJWkFUSU9OCisKKworIyBCT09TVF9TSUdOQUxTKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlNpZ25hbHMuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW1NpZ25hbHNdLAorW0JPT1NUX0ZJTkRfTElCKFtzaWduYWxzXSwgWyQxXSwKKyAgICAgICAgICAgICAgICBbYm9vc3Qvc2lnbmFsLmhwcF0sCisgICAgICAgICAgICAgICAgW2Jvb3N0OjpzaWduYWw8dm9pZCAoKT4gcztdKQorXSkjIEJPT1NUX1NJR05BTFMKKworCisjIEJPT1NUX1NJR05BTFMyKCkKKyMgLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5TaWduYWxzMiAobmV3IHNpbmNlIDEuMzkuMCkuCitCT09TVF9ERUZVTihbU2lnbmFsczJdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9zaWduYWxzMi5ocHBdKQorXSkjIEJPT1NUX1NJR05BTFMyCisKKworIyBCT09TVF9TTUFSVF9QVFIoKQorIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5TbWFydFB0cgorQk9PU1RfREVGVU4oW1NtYXJ0X1B0cl0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3Njb3BlZF9wdHIuaHBwXSkKK0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9zaGFyZWRfcHRyLmhwcF0pCitdKQorCisKKyMgQk9PU1RfU1RBVElDQVNTRVJUKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuU3RhdGljQXNzZXJ0CitCT09TVF9ERUZVTihbU3RhdGljQXNzZXJ0XSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3Qvc3RhdGljX2Fzc2VydC5ocHBdKV0pCisKKworIyBCT09TVF9TVFJJTkdfQUxHTygpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuU3RyaW5nQWxnbworQk9PU1RfREVGVU4oW1N0cmluZ19BbGdvXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvYWxnb3JpdGhtL3N0cmluZy5ocHBdKQorXSkKKworCisjIEJPT1NUX1NZU1RFTShbUFJFRkVSUkVELVJULU9QVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlN5c3RlbS4gIEZvciB0aGUgZG9jdW1lbnRhdGlvbiBvZiBQUkVGRVJSRUQtUlQtT1BULCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24gb2YgQk9PU1RfRklORF9MSUIgYWJvdmUuICBUaGlzIGxpYnJhcnkgd2FzIGludHJvZHVjZWQgaW4gQm9vc3QKKyMgMS4zNS4wLgorQk9PU1RfREVGVU4oW1N5c3RlbV0sCitbQk9PU1RfRklORF9MSUIoW3N5c3RlbV0sIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L3N5c3RlbS9lcnJvcl9jb2RlLmhwcF0sCisgICAgICAgICAgICAgICAgW2Jvb3N0OjpzeXN0ZW06OmVycm9yX2NvZGUgZTsgZS5jbGVhcigpO10pCitdKSMgQk9PU1RfU1lTVEVNCisKKworIyBCT09TVF9URVNUKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlRlc3QuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW1Rlc3RdLAorW200X3BhdHRlcm5fYWxsb3coW15CT09TVF9DSEVDSyRdKWRubAorQk9PU1RfRklORF9MSUIoW3VuaXRfdGVzdF9mcmFtZXdvcmtdLCBbJDFdLAorICAgICAgICAgICAgICAgW2Jvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcF0sIFtCT09TVF9DSEVDSygyID09IDIpO10sCisgICAgICAgICAgICAgICBbdXNpbmcgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZTsKKyAgICAgICAgICAgICAgIHRlc3Rfc3VpdGUqIGluaXRfdW5pdF90ZXN0X3N1aXRlKGludCBhcmdjLCBjaGFyICoqIGFyZ3YpCisgICAgICAgICAgICAgICB7IHJldHVybiBOVUxMOyB9XSkKK10pIyBCT09TVF9URVNUCisKKworIyBCT09TVF9USFJFQUQoW1BSRUZFUlJFRC1SVC1PUFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuVGhyZWFkLiAgRm9yIHRoZSBkb2N1bWVudGF0aW9uIG9mIFBSRUZFUlJFRC1SVC1PUFQsIHNlZSB0aGUKKyMgZG9jdW1lbnRhdGlvbiBvZiBCT09TVF9GSU5EX0xJQiBhYm92ZS4KK0JPT1NUX0RFRlVOKFtUaHJlYWRdLAorW2RubCBIYXZpbmcgdGhlIHB0aHJlYWQgZmxhZyBpcyByZXF1aXJlZCBhdCBsZWFzdCBvbiBHQ0MzIHdoZXJlCitkbmwgYm9vc3QvdGhyZWFkLmhwcCB3b3VsZCBjb21wbGFpbiBpZiB3ZSB0cnkgdG8gY29tcGlsZSB3aXRob3V0CitkbmwgLXB0aHJlYWQgb24gR05VL0xpbnV4LgorQUNfUkVRVUlSRShbX0JPT1NUX1BUSFJFQURfRkxBR10pZG5sCitib29zdF90aHJlYWRfc2F2ZV9MSUJTPSRMSUJTCitib29zdF90aHJlYWRfc2F2ZV9MREZMQUdTPSRMREZMQUdTCitib29zdF90aHJlYWRfc2F2ZV9DUFBGTEFHUz0kQ1BQRkxBR1MKKyMgTGluay10aW1lIGRlcGVuZGVuY3kgZnJvbSB0aHJlYWQgdG8gc3lzdGVtIHdhcyBhZGRlZCBhcyBvZiAxLjQ5LjAuCitpZiB0ZXN0ICRib29zdF9tYWpvcl92ZXJzaW9uIC1nZSAxNDk7IHRoZW4KK0JPT1NUX1NZU1RFTShbJDFdKQorZmkgIyBlbmQgb2YgdGhlIEJvb3N0LlN5c3RlbSBjaGVjay4KK200X3BhdHRlcm5fYWxsb3coW15CT09TVF9TWVNURU1fKExJQlN8TERGTEFHUykkXSlkbmwKK0xJQlM9IiRMSUJTICRCT09TVF9TWVNURU1fTElCUyAkYm9vc3RfY3ZfcHRocmVhZF9mbGFnIgorTERGTEFHUz0iJExERkxBR1MgJEJPT1NUX1NZU1RFTV9MREZMQUdTIgorQ1BQRkxBR1M9IiRDUFBGTEFHUyAkYm9vc3RfY3ZfcHRocmVhZF9mbGFnIgorCisjIFdoZW4gY29tcGlsaW5nIGZvciB0aGUgV2luZG93cyBwbGF0Zm9ybSwgdGhlIHRocmVhZHMgbGlicmFyeSBpcyBuYW1lZAorIyBkaWZmZXJlbnRseS4gIFRoaXMgc3VmZml4IGRvZXNuJ3QgZXhpc3QgaW4gbmV3IHZlcnNpb25zIG9mIEJvb3N0LCBvcgorIyBwb3NzaWJseSBuZXcgdmVyc2lvbnMgb2YgR0NDIG9uIG1pbmd3IEkgYW0gYXNzdW1pbmcgaXQncyBCb29zdCdzIGNoYW5nZSBmb3IKKyMgbm93IGFuZCBJIGFtIHNldHRpbmcgdmVyc2lvbiB0byAxLjQ4LCBmb3IgbGFjayBvZiBrbm93bGVkZ2UgYXMgdG8gd2hlbiB0aGlzCisjIGNoYW5nZSBvY2N1cnJlZC4KK2lmIHRlc3QgJGJvb3N0X21ham9yX3ZlcnNpb24gLWx0IDE0ODsgdGhlbgorICBjYXNlICRob3N0X29zIGluCisgICAgKCptaW5ndyopIGJvb3N0X3RocmVhZF9saWJfZXh0PV93aW4zMjs7CisgIGVzYWMKK2ZpCitCT09TVF9GSU5EX0xJQlMoW3RocmVhZF0sIFt0aHJlYWQkYm9vc3RfdGhyZWFkX2xpYl9leHRdLAorICAgICAgICAgICAgICAgIFskMV0sCisgICAgICAgICAgICAgICAgW2Jvb3N0L3RocmVhZC5ocHBdLCBbYm9vc3Q6OnRocmVhZCB0OyBib29zdDo6bXV0ZXggbTtdKQorCitjYXNlICRob3N0X29zIGluCisgICgqbWluZ3cqKSBib29zdF90aHJlYWRfdzMyX3NvY2tldF9saW5rPS1sd3MyXzMyOzsKK2VzYWMKKworQk9PU1RfVEhSRUFEX0xJQlM9IiRCT09TVF9USFJFQURfTElCUyAkQk9PU1RfU1lTVEVNX0xJQlMgJGJvb3N0X2N2X3B0aHJlYWRfZmxhZyAkYm9vc3RfdGhyZWFkX3czMl9zb2NrZXRfbGluayIKK0JPT1NUX1RIUkVBRF9MREZMQUdTPSIkQk9PU1RfU1lTVEVNX0xERkxBR1MiCitCT09TVF9DUFBGTEFHUz0iJEJPT1NUX0NQUEZMQUdTICRib29zdF9jdl9wdGhyZWFkX2ZsYWciCitMSUJTPSRib29zdF90aHJlYWRfc2F2ZV9MSUJTCitMREZMQUdTPSRib29zdF90aHJlYWRfc2F2ZV9MREZMQUdTCitDUFBGTEFHUz0kYm9vc3RfdGhyZWFkX3NhdmVfQ1BQRkxBR1MKK10pIyBCT09TVF9USFJFQUQKKworQVVfQUxJQVMoW0JPT1NUX1RIUkVBRFNdLCBbQk9PU1RfVEhSRUFEXSkKKworCisjIEJPT1NUX1RPS0VOSVpFUigpCisjIC0tLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlRva2VuaXplcgorQk9PU1RfREVGVU4oW1Rva2VuaXplcl0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3Rva2VuaXplci5ocHBdKV0pCisKKworIyBCT09TVF9UUklCT09MKCkKKyMgLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlRyaWJvb2wKK0JPT1NUX0RFRlVOKFtUcmlib29sXSwKK1tCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvbG9naWMvdHJpYm9vbF9md2QuaHBwXSkKK0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9sb2dpYy90cmlib29sLmhwcF0pCitdKQorCisKKyMgQk9PU1RfVFVQTEUoKQorIyAtLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlR1cGxlCitCT09TVF9ERUZVTihbVHVwbGVdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC90dXBsZS90dXBsZS5ocHBdKV0pCisKKworIyBCT09TVF9UWVBFVFJBSVRTKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuVHlwZVRyYWl0cworQk9PU1RfREVGVU4oW1R5cGVUcmFpdHNdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC90eXBlX3RyYWl0cy5ocHBdKV0pCisKKworIyBCT09TVF9VVElMSVRZKCkKKyMgLS0tLS0tLS0tLS0tLS0tCisjIExvb2sgZm9yIEJvb3N0LlV0aWxpdHkgKG5vbmNvcHlhYmxlLCByZXN1bHRfb2YsIGJhc2UtZnJvbS1tZW1iZXIgaWRpb20sCisjIGV0Yy4pCitCT09TVF9ERUZVTihbVXRpbGl0eV0sCitbQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3V0aWxpdHkuaHBwXSldKQorCisKKyMgQk9PU1RfVkFSSUFOVCgpCisjIC0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5WYXJpYW50LgorQk9PU1RfREVGVU4oW1ZhcmlhbnRdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC92YXJpYW50L3ZhcmlhbnRfZndkLmhwcF0pCitCT09TVF9GSU5EX0hFQURFUihbYm9vc3QvdmFyaWFudC5ocHBdKV0pCisKKworIyBCT09TVF9QT0lOVEVSX0NPTlRBSU5FUigpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMb29rIGZvciBCb29zdC5Qb2ludGVyQ29udGFpbmVyCitCT09TVF9ERUZVTihbUG9pbnRlcl9Db250YWluZXJdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9wdHJfY29udGFpbmVyL3B0cl9kZXF1ZS5ocHBdKQorQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3B0cl9jb250YWluZXIvcHRyX2xpc3QuaHBwXSkKK0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9wdHJfY29udGFpbmVyL3B0cl92ZWN0b3IuaHBwXSkKK0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC9wdHJfY29udGFpbmVyL3B0cl9hcnJheS5ocHBdKQorQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3B0cl9jb250YWluZXIvcHRyX3NldC5ocHBdKQorQk9PU1RfRklORF9IRUFERVIoW2Jvb3N0L3B0cl9jb250YWluZXIvcHRyX21hcC5ocHBdKQorXSkjIEJPT1NUX1BPSU5URVJfQ09OVEFJTkVSCisKKworIyBCT09TVF9XQVZFKFtQUkVGRVJSRUQtUlQtT1BUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE5PVEU6IElmIHlvdSBpbnRlbmQgdG8gdXNlIFdhdmUvU3Bpcml0IHdpdGggdGhyZWFkIHN1cHBvcnQsIG1ha2Ugc3VyZSB5b3UKKyMgY2FsbCBCT09TVF9USFJFQUQgZmlyc3QuCisjIExvb2sgZm9yIEJvb3N0LldhdmUuICBGb3IgdGhlIGRvY3VtZW50YXRpb24gb2YgUFJFRkVSUkVELVJULU9QVCwgc2VlIHRoZQorIyBkb2N1bWVudGF0aW9uIG9mIEJPT1NUX0ZJTkRfTElCIGFib3ZlLgorQk9PU1RfREVGVU4oW1dhdmVdLAorW0FDX1JFUVVJUkUoW0JPT1NUX0ZJTEVTWVNURU1dKWRubAorQUNfUkVRVUlSRShbQk9PU1RfREFURV9USU1FXSlkbmwKK2Jvb3N0X3dhdmVfc2F2ZV9MSUJTPSRMSUJTCitib29zdF93YXZlX3NhdmVfTERGTEFHUz0kTERGTEFHUworbTRfcGF0dGVybl9hbGxvdyhbXkJPT1NUXygoRklMRSk/U1lTVEVNfERBVEVfVElNRXxUSFJFQUQpXyhMSUJTfExERkxBR1MpJF0pZG5sCitMSUJTPSIkTElCUyAkQk9PU1RfU1lTVEVNX0xJQlMgJEJPT1NUX0ZJTEVTWVNURU1fTElCUyAkQk9PU1RfREFURV9USU1FX0xJQlMgXAorJEJPT1NUX1RIUkVBRF9MSUJTIgorTERGTEFHUz0iJExERkxBR1MgJEJPT1NUX1NZU1RFTV9MREZMQUdTICRCT09TVF9GSUxFU1lTVEVNX0xERkxBR1MgXAorJEJPT1NUX0RBVEVfVElNRV9MREZMQUdTICRCT09TVF9USFJFQURfTERGTEFHUyIKK0JPT1NUX0ZJTkRfTElCKFt3YXZlXSwgWyQxXSwKKyAgICAgICAgICAgICAgICBbYm9vc3Qvd2F2ZS5ocHBdLAorICAgICAgICAgICAgICAgIFtib29zdDo6d2F2ZTo6dG9rZW5faWQgaWQ7IGdldF90b2tlbl9uYW1lKGlkKTtdKQorTElCUz0kYm9vc3Rfd2F2ZV9zYXZlX0xJQlMKK0xERkxBR1M9JGJvb3N0X3dhdmVfc2F2ZV9MREZMQUdTCitdKSMgQk9PU1RfV0FWRQorCisKKyMgQk9PU1RfWFBSRVNTSVZFKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKyMgTG9vayBmb3IgQm9vc3QuWHByZXNzaXZlIChuZXcgc2luY2UgMS4zNi4wKS4KK0JPT1NUX0RFRlVOKFtYcHJlc3NpdmVdLAorW0JPT1NUX0ZJTkRfSEVBREVSKFtib29zdC94cHJlc3NpdmUveHByZXNzaXZlLmhwcF0pXSkKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tICMKKyMgSW50ZXJuYWwgaGVscGVycy4gIworIyAtLS0tLS0tLS0tLS0tLS0tLSAjCisKKworIyBfQk9PU1RfUFRIUkVBRF9GTEFHKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEludGVybmFsIGhlbHBlciBmb3IgQk9PU1RfVEhSRUFELiAgQ29tcHV0ZXMgYm9vc3RfY3ZfcHRocmVhZF9mbGFnCisjIHdoaWNoIG11c3QgYmUgdXNlZCBpbiBDUFBGTEFHUyBhbmQgTElCUy4KKyMKKyMgWWVzLCB3ZSAqbmVlZCogdG8gcHV0IHRoZSAtcHRocmVhZCB0aGluZyBpbiBDUFBGTEFHUyBiZWNhdXNlIHdpdGggR0NDMywKKyMgYm9vc3QvdGhyZWFkLmhwcCB3aWxsIHRyaWdnZXIgYSAjZXJyb3IgaWYgLXB0aHJlYWQgaXNuJ3QgdXNlZDoKKyMgICBib29zdC9jb25maWcvcmVxdWlyZXNfdGhyZWFkcy5ocHA6NDc6NTogI2Vycm9yICJDb21waWxlciB0aHJlYWRpbmcgc3VwcG9ydAorIyAgIGlzIG5vdCB0dXJuZWQgb24uIFBsZWFzZSBzZXQgdGhlIGNvcnJlY3QgY29tbWFuZCBsaW5lIG9wdGlvbnMgZm9yCisjICAgdGhyZWFkaW5nOiAtcHRocmVhZCAoTGludXgpLCAtcHRocmVhZHMgKFNvbGFyaXMpIG9yIC1tdGhyZWFkcyAoTWluZ3czMikiCisjCisjIEJhc2VkIG9uIEFDWF9QVEhSRUFEOiBodHRwOi8vYXV0b2NvbmYtYXJjaGl2ZS5jcnlwLnRvL2FjeF9wdGhyZWFkLmh0bWwKK0FDX0RFRlVOKFtfQk9PU1RfUFRIUkVBRF9GTEFHXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0NYWF0pZG5sCitBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCitBQ19MQU5HX1BVU0goW0MrK10pZG5sCitBQ19DQUNIRV9DSEVDSyhbZm9yIHRoZSBmbGFncyBuZWVkZWQgdG8gdXNlIHB0aHJlYWRzXSwgW2Jvb3N0X2N2X3B0aHJlYWRfZmxhZ10sCitbIGJvb3N0X2N2X3B0aHJlYWRfZmxhZz0KKyAgIyBUaGUgb3JkZXJpbmcgKmlzKiAoc29tZXRpbWVzKSBpbXBvcnRhbnQuICBTb21lIG5vdGVzIG9uIHRoZQorICAjIGluZGl2aWR1YWwgaXRlbXMgZm9sbG93OgorICAjIChub25lKTogaW4gY2FzZSB0aHJlYWRzIGFyZSBpbiBsaWJjOyBzaG91bGQgYmUgdHJpZWQgYmVmb3JlIC1LdGhyZWFkIGFuZAorICAjICAgICAgIG90aGVyIGNvbXBpbGVyIGZsYWdzIHRvIHByZXZlbnQgY29udGludWFsIGNvbXBpbGVyIHdhcm5pbmdzCisgICMgLWxwdGhyZWFkczogQUlYIChtdXN0IGNoZWNrIHRoaXMgYmVmb3JlIC1scHRocmVhZCkKKyAgIyAtS3RocmVhZDogU2VxdWVudCAodGhyZWFkcyBpbiBsaWJjLCBidXQgLUt0aHJlYWQgbmVlZGVkIGZvciBwdGhyZWFkLmgpCisgICMgLWt0aHJlYWQ6IEZyZWVCU0Qga2VybmVsIHRocmVhZHMgKHByZWZlcnJlZCB0byAtcHRocmVhZCBzaW5jZSBTTVAtYWJsZSkKKyAgIyAtbGx0aHJlYWQ6IExpbnV4VGhyZWFkcyBwb3J0IG9uIEZyZWVCU0QgKGFsc28gcHJlZmVycmVkIHRvIC1wdGhyZWFkKQorICAjIC1wdGhyZWFkOiBHTlUgTGludXgvR0NDIChrZXJuZWwgdGhyZWFkcyksIEJTRC9HQ0MgKHVzZXJsYW5kIHRocmVhZHMpCisgICMgLXB0aHJlYWRzOiBTb2xhcmlzL0dDQworICAjIC1tdGhyZWFkczogTWluR1czMi9HQ0MsIEx5bngvR0NDCisgICMgLW10OiBTdW4gV29ya3Nob3AgQyAobWF5IG9ubHkgbGluayBTdW5PUyB0aHJlYWRzIFstbHRocmVhZF0sIGJ1dCBpdAorICAjICAgICAgZG9lc24ndCBodXJ0IHRvIGNoZWNrIHNpbmNlIHRoaXMgc29tZXRpbWVzIGRlZmluZXMgcHRocmVhZHMgdG9vOworICAjICAgICAgYWxzbyBkZWZpbmVzIC1EX1JFRU5UUkFOVCkKKyAgIyAgICAgIC4uLiAtbXQgaXMgYWxzbyB0aGUgcHRocmVhZHMgZmxhZyBmb3IgSFAvYUNDCisgICMgLWxwdGhyZWFkOiBHTlUgTGludXgsIGV0Yy4KKyAgIyAtLXRocmVhZC1zYWZlOiBLQUkgQysrCisgIGNhc2UgJGhvc3Rfb3MgaW4gIygKKyAgICAqc29sYXJpcyopCisgICAgICAjIE9uIFNvbGFyaXMgKGF0IGxlYXN0LCBmb3Igc29tZSB2ZXJzaW9ucyksIGxpYmMgY29udGFpbnMgc3R1YmJlZAorICAgICAgIyAobm9uLWZ1bmN0aW9uYWwpIHZlcnNpb25zIG9mIHRoZSBwdGhyZWFkcyByb3V0aW5lcywgc28gbGluay1iYXNlZAorICAgICAgIyB0ZXN0cyB3aWxsIGVycm9uZW91c2x5IHN1Y2NlZWQuICAoV2UgbmVlZCB0byBsaW5rIHdpdGggLXB0aHJlYWRzLy1tdC8KKyAgICAgICMgLWxwdGhyZWFkLikgIChUaGUgc3R1YnMgYXJlIG1pc3NpbmcgcHRocmVhZF9jbGVhbnVwX3B1c2gsIG9yIHJhdGhlcgorICAgICAgIyBhIGZ1bmN0aW9uIGNhbGxlZCBieSB0aGlzIG1hY3JvLCBzbyB3ZSBjb3VsZCBjaGVjayBmb3IgdGhhdCwgYnV0CisgICAgICAjIHdobyBrbm93cyB3aGV0aGVyIHRoZXknbGwgc3R1YiB0aGF0IHRvbyBpbiBhIGZ1dHVyZSBsaWJjLikgIFNvLAorICAgICAgIyB3ZSdsbCBqdXN0IGxvb2sgZm9yIC1wdGhyZWFkcyBhbmQgLWxwdGhyZWFkIGZpcnN0OgorICAgICAgYm9vc3RfcHRocmVhZF9mbGFncz0iLXB0aHJlYWRzIC1scHRocmVhZCAtbXQgLXB0aHJlYWQiOzsgIygKKyAgICAqKQorICAgICAgYm9vc3RfcHRocmVhZF9mbGFncz0iLWxwdGhyZWFkcyAtS3RocmVhZCAta3RocmVhZCAtbGx0aHJlYWQgLXB0aHJlYWQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLXB0aHJlYWRzIC1tdGhyZWFkcyAtbHB0aHJlYWQgLS10aHJlYWQtc2FmZSAtbXQiOzsKKyAgZXNhYworICAjIEdlbmVyYXRlIHRoZSB0ZXN0IGZpbGUuCisgIEFDX0xBTkdfQ09ORlRFU1QoW0FDX0xBTkdfUFJPR1JBTShbI2luY2x1ZGUgPHB0aHJlYWQuaD5dLAorICAgIFtwdGhyZWFkX3QgdGg7IHB0aHJlYWRfam9pbih0aCwgMCk7CisgICAgcHRocmVhZF9hdHRyX2luaXQoMCk7IHB0aHJlYWRfY2xlYW51cF9wdXNoKDAsIDApOworICAgIHB0aHJlYWRfY3JlYXRlKDAsMCwwLDApOyBwdGhyZWFkX2NsZWFudXBfcG9wKDApO10pXSkKKyAgZm9yIGJvb3N0X3B0aHJlYWRfZmxhZyBpbiAnJyAkYm9vc3RfcHRocmVhZF9mbGFnczsgZG8KKyAgICBib29zdF9wdGhyZWFkX29rPWZhbHNlCitkbmwgUmUtdXNlIHRoZSB0ZXN0IGZpbGUgYWxyZWFkeSBnZW5lcmF0ZWQuCisgICAgYm9vc3RfcHRocmVhZHNfX3NhdmVfTElCUz0kTElCUworICAgIExJQlM9IiRMSUJTICRib29zdF9wdGhyZWFkX2ZsYWciCisgICAgQUNfTElOS19JRkVMU0UoW10sCisgICAgICBbaWYgZ3JlcCAiLiokYm9vc3RfcHRocmVhZF9mbGFnIiBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICAgICAgIGVjaG8gIlRoaXMgZmxhZyBzZWVtcyB0byBoYXZlIHRyaWdnZXJlZCB3YXJuaW5ncyIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgIGVsc2UKKyAgICAgICAgIGJvb3N0X3B0aHJlYWRfb2s9OjsgYm9vc3RfY3ZfcHRocmVhZF9mbGFnPSRib29zdF9wdGhyZWFkX2ZsYWcKKyAgICAgICBmaV0pCisgICAgTElCUz0kYm9vc3RfcHRocmVhZHNfX3NhdmVfTElCUworICAgICRib29zdF9wdGhyZWFkX29rICYmIGJyZWFrCisgIGRvbmUKK10pCitBQ19MQU5HX1BPUChbQysrXSlkbmwKK10pIyBfQk9PU1RfUFRIUkVBRF9GTEFHCisKKworIyBfQk9PU1RfZ2NjX3Rlc3QoTUFKT1IsIE1JTk9SKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBJbnRlcm5hbCBoZWxwZXIgZm9yIF9CT09TVF9GSU5EX0NPTVBJTEVSX1RBRy4KK200X2RlZmluZShbX0JPT1NUX2djY190ZXN0XSwKK1siZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA9PSAkMSAmJiBfX0dOVUNfTUlOT1JfXyA9PSAkMiAmJiAhZGVmaW5lZCBfX0lDQyBAIGdjYyQxJDIiXSlkbmwKKworIyBfQk9PU1RfbWluZ3dfdGVzdChNQUpPUiwgTUlOT1IpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEludGVybmFsIGhlbHBlciBmb3IgX0JPT1NUX0ZJTkRfQ09NUElMRVJfVEFHLgorbTRfZGVmaW5lKFtfQk9PU1RfbWluZ3dfdGVzdF0sCitbImRlZmluZWQgX19HTlVDX18gJiYgX19HTlVDX18gPT0gJDEgJiYgX19HTlVDX01JTk9SX18gPT0gJDIgJiYgIWRlZmluZWQgX19JQ0MgJiYgXAorICAoZGVmaW5lZCBXSU4zMiB8fCBkZWZpbmVkIFdJTk5UIHx8IGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMiBcCisgICAgICAgICB8fCBkZWZpbmVkIF9fV0lOMzJfXyB8fCBkZWZpbmVkIF9fV0lOTlQgfHwgZGVmaW5lZCBfX1dJTk5UX18pIEAgbWd3JDEkMiJdKWRubAorCisKKyMgX0JPT1NUX0ZJTkRfQ09NUElMRVJfVEFHKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSW50ZXJuYWwuICBXaGVuIEJvb3N0IGlzIGluc3RhbGxlZCB3aXRob3V0IC0tbGF5b3V0PXN5c3RlbSwgZWFjaCBsaWJyYXJ5CisjIGZpbGVuYW1lIHdpbGwgaG9sZCBhIHN1ZmZpeCB0aGF0IGVuY29kZXMgdGhlIGNvbXBpbGVyIHVzZWQgZHVyaW5nIHRoZQorIyBidWlsZC4gIFRoZSBCb29zdCBidWlsZCBzeXN0ZW0gc2VlbXMgdG8gY2FsbCB0aGlzIGEgYHRhZycuCitBQ19ERUZVTihbX0JPT1NUX0ZJTkRfQ09NUElMRVJfVEFHXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0NYWF0pZG5sCitBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCitBQ19DQUNIRV9DSEVDSyhbZm9yIHRoZSB0b29sc2V0IG5hbWUgdXNlZCBieSBCb29zdCBmb3IgJENYWF0sCisgICAgICAgICAgICAgICBbYm9vc3RfY3ZfbGliX3RhZ10sCitbYm9vc3RfY3ZfbGliX3RhZz11bmtub3duCitpZiB0ZXN0IHgkYm9vc3RfY3ZfaW5jX3BhdGggIT0geG5vOyB0aGVuCisgIEFDX0xBTkdfUFVTSChbQysrXSlkbmwKKyAgIyBUaGUgZm9sbG93aW5nIHRlc3RzIGFyZSBtb3N0bHkgaW5zcGlyZWQgYnkgYm9vc3QvY29uZmlnL2F1dG9fbGluay5ocHAKKyAgIyBUaGUgbGlzdCBpcyBzb3J0ZWQgdG8gbW9zdCByZWNlbnQvY29tbW9uIHRvIG9sZGVzdCBjb21waWxlciAoaW4gb3JkZXIKKyAgIyB0byBpbmNyZWFzZSB0aGUgbGlrZWxpaG9vZCBvZiBmaW5kaW5nIHRoZSByaWdodCBjb21waWxlciB3aXRoIHRoZQorICAjIGxlYXN0IG51bWJlciBvZiBjb21waWxhdGlvbiBhdHRlbXB0KS4KKyAgIyBCZXdhcmUgdGhhdCBzb21lIHRlc3RzIGFyZSBzZW5zaWJsZSB0byB0aGUgb3JkZXIgKGZvciBpbnN0YW5jZSwgd2UgbXVzdAorICAjIGxvb2sgZm9yIE1pbkdXIGJlZm9yZSBsb29raW5nIGZvciBHQ0MzKS4KKyAgIyBJIHVzZWQgb25lIGNvbXBpbGF0aW9uIHRlc3QgcGVyIGNvbXBpbGVyIHdpdGggYSAjZXJyb3IgdG8gcmVjb2duaXplCisgICMgZWFjaCBjb21waWxlciBzbyB0aGF0IGl0IHdvcmtzIGV2ZW4gd2hlbiBjcm9zcy1jb21waWxpbmcgKGxldCBtZSBrbm93CisgICMgaWYgeW91IGtub3cgYSBiZXR0ZXIgYXBwcm9hY2gpLgorICAjIEtub3duIG1pc3NpbmcgdGFncyAoa25vd24gZnJvbSBCb29zdCdzIHRvb2xzL2J1aWxkL3YyL3Rvb2xzL2NvbW1vbi5qYW0pOgorICAjICAgY29tbywgZWRnLCBrY2MsIGJjaywgbXAsIHN3LCB0cnUsIHhsYworICAjIEknbSBub3Qgc3VyZSBhYm91dCBteSB0ZXN0IGZvciBgaWwnIChiZSBjYXJlZnVsOiBJbnRlbCdzIElDQyBwcmUtZGVmaW5lcworICAjIHRoZSBzYW1lIGRlZmluZXMgYXMgR0NDJ3MpLgorICBmb3IgaSBpbiBcCisgICAgX0JPT1NUX21pbmd3X3Rlc3QoNSwgMykgXAorICAgIF9CT09TVF9nY2NfdGVzdCg1LCAzKSBcCisgICAgX0JPT1NUX21pbmd3X3Rlc3QoNSwgMikgXAorICAgIF9CT09TVF9nY2NfdGVzdCg1LCAyKSBcCisgICAgX0JPT1NUX21pbmd3X3Rlc3QoNSwgMSkgXAorICAgIF9CT09TVF9nY2NfdGVzdCg1LCAxKSBcCisgICAgX0JPT1NUX21pbmd3X3Rlc3QoNSwgMCkgXAorICAgIF9CT09TVF9nY2NfdGVzdCg1LCAwKSBcCisgICAgX0JPT1NUX21pbmd3X3Rlc3QoNCwgMTApIFwKKyAgICBfQk9PU1RfZ2NjX3Rlc3QoNCwgMTApIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCA5KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDkpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCA4KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDgpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCA3KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDcpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCA2KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDYpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCA1KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDUpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCA0KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDQpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCAzKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDMpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCAyKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDIpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCAxKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDEpIFwKKyAgICBfQk9PU1RfbWluZ3dfdGVzdCg0LCAwKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDQsIDApIFwKKyAgICAiZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA9PSAzICYmICFkZWZpbmVkIF9fSUNDIFwKKyAgICAgJiYgKGRlZmluZWQgV0lOMzIgfHwgZGVmaW5lZCBXSU5OVCB8fCBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzIgXAorICAgICAgICAgfHwgZGVmaW5lZCBfX1dJTjMyX18gfHwgZGVmaW5lZCBfX1dJTk5UIHx8IGRlZmluZWQgX19XSU5OVF9fKSBAIG1ndyIgXAorICAgIF9CT09TVF9nY2NfdGVzdCgzLCA0KSBcCisgICAgX0JPT1NUX2djY190ZXN0KDMsIDMpIFwKKyAgICAiZGVmaW5lZCBfTVNDX1ZFUiAmJiBfTVNDX1ZFUiA+PSAxNTAwIEAgdmM5MCIgXAorICAgICJkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSID09IDE0MDAgQCB2YzgwIiBcCisgICAgX0JPT1NUX2djY190ZXN0KDMsIDIpIFwKKyAgICAiZGVmaW5lZCBfTVNDX1ZFUiAmJiBfTVNDX1ZFUiA9PSAxMzEwIEAgdmM3MSIgXAorICAgIF9CT09TVF9nY2NfdGVzdCgzLCAxKSBcCisgICAgX0JPT1NUX2djY190ZXN0KDMsIDApIFwKKyAgICAiZGVmaW5lZCBfX0JPUkxBTkRDX18gQCBiY2IiIFwKKyAgICAiZGVmaW5lZCBfX0lDQyAmJiAoZGVmaW5lZCBfX3VuaXggfHwgZGVmaW5lZCBfX3VuaXhfXykgQCBpbCIgXAorICAgICJkZWZpbmVkIF9fSUNMIEAgaXciIFwKKyAgICAiZGVmaW5lZCBfTVNDX1ZFUiAmJiBfTVNDX1ZFUiA9PSAxMzAwIEAgdmM3IiBcCisgICAgX0JPT1NUX2djY190ZXN0KDIsIDk1KSBcCisgICAgImRlZmluZWQgX19NV0VSS1NfXyAmJiBfX01XRVJLU19fIDw9IDB4MzJGRiBAIGN3OSIgXAorICAgICJkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSIDwgMTMwMCAmJiAhZGVmaW5lZCBVTkRFUl9DRSBAIHZjNiIgXAorICAgICJkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSIDwgMTMwMCAmJiBkZWZpbmVkIFVOREVSX0NFIEAgZXZjNCIgXAorICAgICJkZWZpbmVkIF9fTVdFUktTX18gJiYgX19NV0VSS1NfXyA8PSAweDMxRkYgQCBjdzgiCisgIGRvCisgICAgYm9vc3RfdGFnX3Rlc3Q9YGV4cHIgIlgkaSIgOiAnWFwoW1teQF1dKlwpIEAgJ2AKKyAgICBib29zdF90YWc9YGV4cHIgIlgkaSIgOiAnWFtbXkBdXSogQCBcKC4qXCknYAorICAgIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKKyNpZiAkYm9vc3RfdGFnX3Rlc3QKKy8qIE9LICovCisjZWxzZQorIyBlcnJvciAkYm9vc3RfdGFnX3Rlc3QKKyNlbmRpZgorXV0pXSwgW2Jvb3N0X2N2X2xpYl90YWc9JGJvb3N0X3RhZzsgYnJlYWtdLCBbXSkKKyAgZG9uZQorQUNfTEFOR19QT1AoW0MrK10pZG5sCisgIGNhc2UgJGJvb3N0X2N2X2xpYl90YWcgaW4gIygKKyAgICAjIFNvbWUgbmV3ZXIgKD49IDEuMzU/KSB2ZXJzaW9ucyBvZiBCb29zdCBzZWVtIHRvIG9ubHkgdXNlICJnY2MiIGFzIG9wcG9zZWQKKyAgICAjIHRvICJnY2M0MSIgZm9yIGluc3RhbmNlLgorICAgICotZ2NjIHwgKictZ2NjICcpIDo7OyAjKCAgRG9uJ3QgcmUtYWRkIC1nY2M6IGl0J3MgYWxyZWFkeSBpbiB0aGVyZS4KKyAgICBnY2MqKQorICAgICAgYm9vc3RfdGFnX3g9CisgICAgICBjYXNlICRob3N0X29zIGluICMoCisgICAgICAgIGRhcndpbiopCisgICAgICAgICAgaWYgdGVzdCAkYm9vc3RfbWFqb3JfdmVyc2lvbiAtZ2UgMTM2OyB0aGVuCisgICAgICAgICAgICAjIFRoZSBgeCcgYWRkZWQgaW4gcjQ2NzkzIG9mIEJvb3N0LgorICAgICAgICAgICAgYm9vc3RfdGFnX3g9eAorICAgICAgICAgIGZpOzsKKyAgICAgIGVzYWMKKyAgICAgICMgV2UgY2FuIHNwZWNpZnkgbXVsdGlwbGUgdGFncyBpbiB0aGlzIHZhcmlhYmxlIGJlY2F1c2UgaXQncyB1c2VkIGJ5CisgICAgICAjIEJPT1NUX0ZJTkRfTElCIHRoYXQgZG9lcyBhIGBmb3IgdGFnIGluIC0kYm9vc3RfY3ZfbGliX3RhZycgLi4uCisgICAgICBib29zdF9jdl9saWJfdGFnPSIkYm9vc3RfdGFnX3gkYm9vc3RfY3ZfbGliX3RhZyAtJHtib29zdF90YWdfeH1nY2MiCisgICAgICA7OyAjKAorICAgIHVua25vd24pCisgICAgICBBQ19NU0dfV0FSTihbW2NvdWxkIG5vdCBmaWd1cmUgb3V0IHdoaWNoIHRvb2xzZXQgbmFtZSB0byB1c2UgZm9yICRDWFhdXSkKKyAgICAgIGJvb3N0X2N2X2xpYl90YWc9CisgICAgICA7OworICBlc2FjCitmaV0pZG5sIGVuZCBvZiBBQ19DQUNIRV9DSEVDSworXSkjIF9CT09TVF9GSU5EX0NPTVBJTEVSX1RBRworCisKKyMgX0JPT1NUX0dVRVNTX1dIRVRIRVJfVE9fVVNFX01UKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29tcGlsZSBhIHNtYWxsIHRlc3QgdG8gdHJ5IHRvIGd1ZXNzIHdoZXRoZXIgd2Ugc2hvdWxkIGZhdm9yIE1UIChNdWx0aQorIyBUaHJlYWQpIGZsYXZvcnMgb2YgQm9vc3QuICBTZXRzIGJvb3N0X2d1ZXNzX3VzZV9tdCBhY2NvcmRpbmdseS4KK0FDX0RFRlVOKFtfQk9PU1RfR1VFU1NfV0hFVEhFUl9UT19VU0VfTVRdLAorWyMgQ2hlY2sgd2hldGhlciB3ZSBkbyBiZXR0ZXIgdXNlIGBtdCcgZXZlbiB0aG91Z2ggd2Ugd2VyZW4ndCBhc2sgdG8uCitBQ19MQU5HX1BVU0goW0MrK10pZG5sCitBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCisjaWYgZGVmaW5lZCBfUkVFTlRSQU5UIHx8IGRlZmluZWQgX01UIHx8IGRlZmluZWQgX19NVF9fCisvKiB1c2UgLW10ICovCisjZWxzZQorIyBlcnJvciBNVCBub3QgbmVlZGVkCisjZW5kaWYKK11dKV0sIFtib29zdF9ndWVzc191c2VfbXQ9Ol0sIFtib29zdF9ndWVzc191c2VfbXQ9ZmFsc2VdKQorQUNfTEFOR19QT1AoW0MrK10pZG5sCitdKQorCisjIF9CT09TVF9BQ19MSU5LX0lGRUxTRShQUk9HUkFNLCBbQUNUSU9OLUlGLVRSVUVdLCBbQUNUSU9OLUlGLUZBTFNFXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGb3JrIG9mIF9BQ19MSU5LX0lGRUxTRSB0aGF0IHByZXNlcnZlcyBjb25mdGVzdC5vIGFjcm9zcyBjYWxscy4gIEZyYWdpbGUsCisjIHdpbGwgYnJlYWsgd2hlbiBBdXRvY29uZiBjaGFuZ2VzIGl0cyBpbnRlcm5hbHMuICBSZXF1aXJlcyB0aGF0IHlvdSBtYW51YWxseQorIyBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGluIGJldHdlZW4gdG8gcmVhbGx5IGRpZmZlcmVudCB0ZXN0cywgb3RoZXJ3aXNlCisjIHlvdSB3aWxsIHRyeSB0byBsaW5rIGEgY29uZnRlc3QubyBsZWZ0IGJlaGluZCBieSBhIHByZXZpb3VzIHRlc3QuCisjIFVzZWQgdG8gYWdncmVzc2l2ZWx5IG9wdGltaXplIEJPT1NUX0ZJTkRfTElCIChzZWUgdGhlIGJpZyBjb21tZW50IGluIHRoaXMKKyMgbWFjcm8pLgorIworIyBEb24ndCB1c2UgImJyZWFrIiBpbiB0aGUgYWN0aW9ucywgYXMgaXQgd291bGQgc2hvcnQtY2lyY3VpdCBzb21lIGNvZGUKKyMgdGhpcyBtYWNybyBydW5zIGFmdGVyIHRoZSBhY3Rpb25zLgorbTRfZGVmaW5lKFtfQk9PU1RfQUNfTElOS19JRkVMU0VdLAorW200X2lmdmFsbihbJDFdLCBbQUNfTEFOR19DT05GVEVTVChbJDFdKV0pZG5sCitybSAtZiBjb25mdGVzdCRhY19leGVleHQKK2Jvb3N0X3NhdmVfYWNfZXh0PSRhY19leHQKK2Jvb3N0X3VzZV9zb3VyY2U9OgorIyBJZiB3ZSBhbHJlYWR5IGhhdmUgYSAubywgcmUtdXNlIGl0LiAgV2UgY2hhbmdlICRhY19leHQgc28gdGhhdCAkYWNfbGluaworIyB0cmllcyB0byBsaW5rIHRoZSBleGlzdGluZyBvYmplY3QgZmlsZSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBmcm9tIHNvdXJjZS4KK3Rlc3QgLWYgY29uZnRlc3QuJGFjX29iamV4dCAmJiBhY19leHQ9JGFjX29iamV4dCAmJiBib29zdF91c2Vfc291cmNlPWZhbHNlICYmCisgIF9BU19FQ0hPX0xPRyhbcmUtdXNpbmcgdGhlIGV4aXN0aW5nIGNvbmZ0ZXN0LiRhY19vYmpleHRdKQorQVNfSUYoW19BQ19ET19TVERFUlIoJGFjX2xpbmspICYmIHsKKyAgICAgICAgIHRlc3QgLXogIiRhY19bXV9BQ19MQU5HX0FCQlJFVltdX3dlcnJvcl9mbGFnIiB8fAorICAgICAgICAgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworICAgICAgICAgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKyAgICAgICAgICRhc19leGVjdXRhYmxlX3AgY29uZnRlc3QkYWNfZXhlZXh0CitkbmwgRklYTUU6IHVzZSBBU19URVNUX1ggaW5zdGVhZCB3aGVuIDIuNjEgaXMgd2lkZXNwcmVhZCBlbm91Z2guCisgICAgICAgfV0sCisgICAgICBbJDJdLAorICAgICAgW2lmICRib29zdF91c2Vfc291cmNlOyB0aGVuCisgICAgICAgICBfQUNfTVNHX0xPR19DT05GVEVTVAorICAgICAgIGZpCisgICAgICAgJDNdKQorYWNfb2JqZXh0PSRib29zdF9zYXZlX2FjX29iamV4dAorYWNfZXh0PSRib29zdF9zYXZlX2FjX2V4dAorZG5sIERlbGV0ZSBhbHNvIHRoZSBJUEEvSVBPIChJbnRlciBQcm9jZWR1cmFsIEFuYWx5c2lzL09wdGltaXphdGlvbikKK2RubCBpbmZvcm1hdGlvbiBjcmVhdGVkIGJ5IHRoZSBQR0kgY29tcGlsZXIgKGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28pLAorZG5sIGFzIGl0IHdvdWxkIGludGVyZmVyZSB3aXRoIHRoZSBuZXh0IGxpbmsgY29tbWFuZC4KK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IG00X2lmdmFsKFskMV0sIFtjb25mdGVzdC4kYWNfZXh0XSlbXWRubAorXSkjIF9CT09TVF9BQ19MSU5LX0lGRUxTRQorCisjIExvY2FsIFZhcmlhYmxlczoKKyMgbW9kZTogYXV0b2NvbmYKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9jdmM0LXBhdGNoL29wdGlvbnMvb3B0aW9uc190ZW1wbGF0ZS5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL2N2YzQtcGF0Y2gvb3B0aW9ucy9vcHRpb25zX3RlbXBsYXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWE5YjZjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9jdmM0LXBhdGNoL29wdGlvbnMvb3B0aW9uc190ZW1wbGF0ZS5jcHAKQEAgLTAsMCArMSw4MzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiEgXGZpbGUgb3B0aW9uc190ZW1wbGF0ZS5jcHAKKyAqKiBcdmVyYmF0aW0KKyAqKiBUb3AgY29udHJpYnV0b3JzICh0byBjdXJyZW50IHZlcnNpb24pOgorICoqICAgVGltIEtpbmcsIE1vcmdhbiBEZXRlcnMsIEtzaGl0aWogQmFuc2FsCisgKiogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIENWQzQgcHJvamVjdC4KKyAqKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxNiBieSB0aGUgYXV0aG9ycyBsaXN0ZWQgaW4gdGhlIGZpbGUgQVVUSE9SUworICoqIGluIHRoZSB0b3AtbGV2ZWwgc291cmNlIGRpcmVjdG9yeSkgYW5kIHRoZWlyIGluc3RpdHV0aW9uYWwgYWZmaWxpYXRpb25zLgorICoqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgdG9wLWxldmVsIHNvdXJjZQorICoqIGRpcmVjdG9yeSBmb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLlxlbmR2ZXJiYXRpbQorICoqCisgKiogXGJyaWVmIENvbnRhaW5zIGNvZGUgZm9yIGhhbmRsaW5nIGNvbW1hbmQtbGluZSBvcHRpb25zLgorICoqCisgKiogQ29udGFpbnMgY29kZSBmb3IgaGFuZGxpbmcgY29tbWFuZC1saW5lIG9wdGlvbnMKKyAqKi8KKworI2lmICFkZWZpbmVkKF9CU0RfU09VUkNFKSAmJiBkZWZpbmVkKF9fTUlOR1czMl9fKSAmJiAhZGVmaW5lZChfX01JTkdXNjRfXykKKy8vIGZvcmNlIHVzZSBvZiBvcHRyZXNldDsgbWluZ3czMiBjcm9ha3Mgb24gYXJndi1zd2l0Y2hpbmcgb3RoZXJ3aXNlCisjICBpbmNsdWRlICJjdmM0YXV0b2NvbmZpZy5oIgorIyAgZGVmaW5lIF9CU0RfU09VUkNFCisjICB1bmRlZiBIQVZFX0RFQ0xfT1BUUkVTRVQKKyMgIGRlZmluZSBIQVZFX0RFQ0xfT1BUUkVTRVQgMQorIyAgZGVmaW5lIENWQzRfSVNfTk9UX1JFQUxMWV9CU0QKKyNlbmRpZiAvKiAhX0JTRF9TT1VSQ0UgJiYgX19NSU5HVzMyX18gJiYgIV9fTUlOR1c2NF9fICovCisKKyNpZmRlZiBfX01JTkdXNjRfXworI2RlZmluZSBfQlNEX1NPVVJDRSAvLyBOZWVkZWQgdG8gYXZvaWQgJ29wdHJlc2V0JyBlcnJvciBhdCBsaW5rCitleHRlcm4gaW50IG9wdHJlc2V0OworI2VuZGlmIC8qIF9fTUlOR1c2NF9fICovCisKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKworLy8gY2xlYW4gdXAKKyNpZmRlZiBDVkM0X0lTX05PVF9SRUFMTFlfQlNECisjICB1bmRlZiBfQlNEX1NPVVJDRQorI2VuZGlmIC8qIENWQzRfSVNfTk9UX1JFQUxMWV9CU0QgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxuZXc+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8bGltaXRzPgorCisjaW5jbHVkZSAiYmFzZS9jdmM0X2Fzc2VydC5oIgorI2luY2x1ZGUgImJhc2UvZXhjZXB0aW9uLmgiCisjaW5jbHVkZSAiYmFzZS9vdXRwdXQuaCIKKyNpbmNsdWRlICJiYXNlL3Rscy5oIgorI2luY2x1ZGUgIm9wdGlvbnMvYXJndW1lbnRfZXh0ZW5kZXIuaCIKKyNpbmNsdWRlICJvcHRpb25zL2FyZ3VtZW50X2V4dGVuZGVyX2ltcGxlbWVudGF0aW9uLmgiCisjaW5jbHVkZSAib3B0aW9ucy9kaWR5b3VtZWFuLmgiCisjaW5jbHVkZSAib3B0aW9ucy9sYW5ndWFnZS5oIgorI2luY2x1ZGUgIm9wdGlvbnMvb3B0aW9uc19oYW5kbGVyLmgiCisKKyR7aW5jbHVkZV9hbGxfb3B0aW9uX2hlYWRlcnN9CisKKyNsaW5lIDY0ICIke3RlbXBsYXRlfSIKKworI2luY2x1ZGUgIm9wdGlvbnMvb3B0aW9uc19ob2xkZXIuaCIKKyNpbmNsdWRlICJjdmM0YXV0b2NvbmZpZy5oIgorI2luY2x1ZGUgIm9wdGlvbnMvYmFzZV9oYW5kbGVycy5oIgorCiske29wdGlvbl9oYW5kbGVyX2luY2x1ZGVzfQorCisjbGluZSA3MiAiJHt0ZW1wbGF0ZX0iCisKK3VzaW5nIG5hbWVzcGFjZSBDVkM0OwordXNpbmcgbmFtZXNwYWNlIENWQzQ6Om9wdGlvbnM7CisKK25hbWVzcGFjZSBDVkM0IHsKKworQ1ZDNF9USFJFQURMT0NBTChPcHRpb25zKikgT3B0aW9uczo6c19jdXJyZW50ID0gTlVMTDsKKworCisKKy8qKgorICogVGhpcyBpcyBhIGRlZmF1bHQgaGFuZGxlciBmb3Igb3B0aW9ucyBvZiBidWlsdC1pbiBDKysgdHlwZS4gIFRoaXMKKyAqIHRlbXBsYXRlIGlzIHJlYWxseSBqdXN0IGEgaGVscGVyIGZvciB0aGUgaGFuZGxlT3B0aW9uKCkgdGVtcGxhdGUsCisgKiBiZWxvdy4gIFZhcmlhbnRzIG9mIHRoaXMgdGVtcGxhdGUgaGFuZGxlIG51bWVyaWMgYW5kIG5vbi1udW1lcmljLAorICogaW50ZWdyYWwgYW5kIG5vbi1pbnRlZ3JhbCwgc2lnbmVkIGFuZCB1bnNpZ25lZCBDKysgdHlwZXMuCisgKiBoYW5kbGVPcHRpb24oKSBtYWtlcyBzdXJlIHRvIGluc3RhbnRpYXRlIHRoZSByaWdodCBvbmUuCisgKgorICogVGhpcyBpbXBsZW1lbnRzIGRlZmF1bHQgYmVoYXZpb3Igd2hlbiBlLmcuIGFuIG9wdGlvbiBpcworICogdW5zaWduZWQgYnV0IHRoZSB1c2VyIHNwZWNpZmllcyBhIG5lZ2F0aXZlIGFyZ3VtZW50OyBldGMuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBULCBib29sIGlzX251bWVyaWMsIGJvb2wgaXNfaW50ZWdlcj4KK3N0cnVjdCBPcHRpb25IYW5kbGVyIHsKKyAgc3RhdGljIFQgaGFuZGxlKHN0ZDo6c3RyaW5nIG9wdGlvbiwgc3RkOjpzdHJpbmcgb3B0aW9uYXJnKTsKK307Lyogc3RydWN0IE9wdGlvbkhhbmRsZXI8PiAqLworCisvKiogVmFyaWFudCBmb3IgaW50ZWdyYWwgQysrIHR5cGVzICovCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3N0cnVjdCBPcHRpb25IYW5kbGVyPFQsIHRydWUsIHRydWU+IHsKKyAgc3RhdGljIGJvb2wgc3RyaW5nVG9JbnQoVCYgdCwgY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICAgIHN0ZDo6aXN0cmluZ3N0cmVhbSBzcyhzdHIpOworICAgIHNzID4+IHQ7CisgICAgY2hhciB0bXA7CisgICAgcmV0dXJuICEoc3MuZmFpbCgpIHx8IHNzLmdldCh0bXApKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNvbnRhaW5zTWludXMoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICAgIHJldHVybiBzdHIuZmluZCgnLScpICE9IHN0ZDo6c3RyaW5nOjpucG9zOworICB9CisKKyAgc3RhdGljIFQgaGFuZGxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25hcmcpIHsKKyAgICB0cnkgeworICAgICAgVCBpOworICAgICAgYm9vbCBzdWNjZXNzID0gc3RyaW5nVG9JbnQoaSwgb3B0aW9uYXJnKTsKKworICAgICAgaWYoIXN1Y2Nlc3MpeworICAgICAgICB0aHJvdyBPcHRpb25FeGNlcHRpb24ob3B0aW9uICsgIjogZmFpbGVkIHRvIHBhcnNlICIrIG9wdGlvbmFyZyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGFzIGFuIGludGVnZXIgb2YgdGhlIGFwcHJvcHJhaXRlIHR5cGUuIik7CisgICAgICB9CisKKyAgICAgIC8vIERlcGVuZGluZyBpbiB0aGUgcGxhdGZvcm0gdW5zaWduZWQgbnVtYmVycyB3aXRoICctJyBzaWducyBtYXkgcGFyc2UuCisgICAgICAvLyBSZWplY3QgdGhlc2UgYnkgbG9va2luZyBmb3IgYW55IG1pbnVzIGlmIGl0IGlzIG5vdCBzaWduZWQuCisgICAgICBpZiggKCEgc3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfc2lnbmVkKSAmJiBjb250YWluc01pbnVzKG9wdGlvbmFyZykgKSB7CisgICAgICAgIC8vIHVuc2lnbmVkIHR5cGUgYnV0IHVzZXIgZ2F2ZSBuZWdhdGl2ZSBhcmd1bWVudAorICAgICAgICB0aHJvdyBPcHRpb25FeGNlcHRpb24ob3B0aW9uICsgIiByZXF1aXJlcyBhIG5vbm5lZ2F0aXZlIGFyZ3VtZW50Iik7CisgICAgICB9IGVsc2UgaWYoaSA8IHN0ZDo6bnVtZXJpY19saW1pdHM8VD46Om1pbigpKSB7CisgICAgICAgIC8vIG5lZ2F0aXZlIG92ZXJmbG93IGZvciB0eXBlCisgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgICBzcyA8PCBvcHRpb24gPDwgIiByZXF1aXJlcyBhbiBhcmd1bWVudCA+PSAiCisgICAgICAgICAgIDw8IHN0ZDo6bnVtZXJpY19saW1pdHM8VD46Om1pbigpOworICAgICAgICB0aHJvdyBPcHRpb25FeGNlcHRpb24oc3Muc3RyKCkpOworICAgICAgfSBlbHNlIGlmKGkgPiBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptYXgoKSkgeworICAgICAgICAvLyBwb3NpdGl2ZSBvdmVyZmxvdyBmb3IgdHlwZQorICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgc3MgPDwgb3B0aW9uIDw8ICIgcmVxdWlyZXMgYW4gYXJndW1lbnQgPD0gIgorICAgICAgICAgICA8PCBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptYXgoKTsKKyAgICAgICAgdGhyb3cgT3B0aW9uRXhjZXB0aW9uKHNzLnN0cigpKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGk7CisKKyAgICAgIC8vIGlmKHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX3NpZ25lZCkgeworICAgICAgLy8gICByZXR1cm4gVChpLmdldExvbmcoKSk7CisgICAgICAvLyB9IGVsc2UgeworICAgICAgLy8gICByZXR1cm4gVChpLmdldFVuc2lnbmVkTG9uZygpKTsKKyAgICAgIC8vIH0KKyAgICB9IGNhdGNoKHN0ZDo6aW52YWxpZF9hcmd1bWVudCYpIHsKKyAgICAgIC8vIHVzZXIgZ2F2ZSBzb21ldGhpbmcgb3RoZXIgdGhhbiBhbiBpbnRlZ2VyCisgICAgICB0aHJvdyBPcHRpb25FeGNlcHRpb24ob3B0aW9uICsgIiByZXF1aXJlcyBhbiBpbnRlZ2VyIGFyZ3VtZW50Iik7CisgICAgfQorICB9Cit9Oy8qIHN0cnVjdCBPcHRpb25IYW5kbGVyPFQsIHRydWUsIHRydWU+ICovCisKKy8qKiBWYXJpYW50IGZvciBudW1lcmljIGJ1dCBub24taW50ZWdyYWwgQysrIHR5cGVzICovCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3N0cnVjdCBPcHRpb25IYW5kbGVyPFQsIHRydWUsIGZhbHNlPiB7CisgIHN0YXRpYyBUIGhhbmRsZShzdGQ6OnN0cmluZyBvcHRpb24sIHN0ZDo6c3RyaW5nIG9wdGlvbmFyZykgeworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGluKG9wdGlvbmFyZyk7CisgICAgbG9uZyBkb3VibGUgcjsKKyAgICBpbiA+PiByOworICAgIGlmKCEgaW4uZW9mKCkpIHsKKyAgICAgIC8vIHdlIGRpZG4ndCBjb25zdW1lIHRoZSB3aG9sZSBzdHJpbmcgKGp1bmsgYXQgZW5kKQorICAgICAgdGhyb3cgT3B0aW9uRXhjZXB0aW9uKG9wdGlvbiArICIgcmVxdWlyZXMgYSBudW1lcmljIGFyZ3VtZW50Iik7CisgICAgfQorCisgICAgaWYoISBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+Ojppc19zaWduZWQgJiYgciA8IDAuMCkgeworICAgICAgLy8gdW5zaWduZWQgdHlwZSBidXQgdXNlciBnYXZlIG5lZ2F0aXZlIHZhbHVlCisgICAgICB0aHJvdyBPcHRpb25FeGNlcHRpb24ob3B0aW9uICsgIiByZXF1aXJlcyBhIG5vbm5lZ2F0aXZlIGFyZ3VtZW50Iik7CisgICAgfSBlbHNlIGlmKHIgPCAtc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWF4KCkpIHsKKyAgICAgIC8vIG5lZ2F0aXZlIG92ZXJmbG93IGZvciB0eXBlCisgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgIHNzIDw8IG9wdGlvbiA8PCAiIHJlcXVpcmVzIGFuIGFyZ3VtZW50ID49ICIKKyAgICAgICAgIDw8IC1zdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptYXgoKTsKKyAgICAgIHRocm93IE9wdGlvbkV4Y2VwdGlvbihzcy5zdHIoKSk7CisgICAgfSBlbHNlIGlmKHIgPiBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptYXgoKSkgeworICAgICAgLy8gcG9zaXRpdmUgb3ZlcmZsb3cgZm9yIHR5cGUKKyAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgc3MgPDwgb3B0aW9uIDw8ICIgcmVxdWlyZXMgYW4gYXJndW1lbnQgPD0gIgorICAgICAgICAgPDwgc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWF4KCk7CisgICAgICB0aHJvdyBPcHRpb25FeGNlcHRpb24oc3Muc3RyKCkpOworICAgIH0KKworICAgIHJldHVybiBUKHIpOworICB9Cit9Oy8qIHN0cnVjdCBPcHRpb25IYW5kbGVyPFQsIHRydWUsIGZhbHNlPiAqLworCisvKiogVmFyaWFudCBmb3Igbm9uLW51bWVyaWMgQysrIHR5cGVzICovCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3N0cnVjdCBPcHRpb25IYW5kbGVyPFQsIGZhbHNlLCBmYWxzZT4geworICBzdGF0aWMgVCBoYW5kbGUoc3RkOjpzdHJpbmcgb3B0aW9uLCBzdGQ6OnN0cmluZyBvcHRpb25hcmcpIHsKKyAgICBUOjp1bnN1cHBvcnRlZF9oYW5kbGVPcHRpb25fY2FsbF9fX3BsZWFzZV93cml0ZV9tZTsKKyAgICAvLyBUaGUgYWJvdmUgbGluZSBjYXVzZXMgYSBjb21waWxlciBlcnJvciBpZiB0aGlzIHZlcnNpb24gb2YgdGhlIHRlbXBsYXRlCisgICAgLy8gaXMgZXZlciBpbnN0YW50aWF0ZWQgKG1lYW5pbmcgdGhhdCBhIHNwZWNpYWxpemF0aW9uIGlzIG1pc3NpbmcpLiAgU28KKyAgICAvLyBkb24ndCB3b3JyeSBhYm91dCB0aGUgc2VnZmF1bHQgaW4gdGhlIG5leHQgbGluZSwgdGhlICJyZXR1cm4iIGlzIG9ubHkKKyAgICAvLyB0aGVyZSB0byBrZWVwIHRoZSBjb21waWxlciBmcm9tIGdpdmluZyBhZGRpdGlvbmFsLCBkaXN0cmFjdGluZyBlcnJvcnMKKyAgICAvLyBhbmQgd2FybmluZ3MuCisgICAgcmV0dXJuICooVCopMDsKKyAgfQorfTsvKiBzdHJ1Y3QgT3B0aW9uSGFuZGxlcjxULCBmYWxzZSwgZmFsc2U+ICovCisKKy8qKiBIYW5kbGUgYW4gb3B0aW9uIG9mIHR5cGUgVCBpbiB0aGUgZGVmYXVsdCB3YXkuICovCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK1QgaGFuZGxlT3B0aW9uKHN0ZDo6c3RyaW5nIG9wdGlvbiwgc3RkOjpzdHJpbmcgb3B0aW9uYXJnKSB7CisgIHJldHVybiBPcHRpb25IYW5kbGVyPFQsIHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX3NwZWNpYWxpemVkLCBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+Ojppc19pbnRlZ2VyPjo6aGFuZGxlKG9wdGlvbiwgb3B0aW9uYXJnKTsKK30KKworLyoqIEhhbmRsZSBhbiBvcHRpb24gb2YgdHlwZSBzdGQ6OnN0cmluZyBpbiB0aGUgZGVmYXVsdCB3YXkuICovCit0ZW1wbGF0ZSA8Pgorc3RkOjpzdHJpbmcgaGFuZGxlT3B0aW9uPHN0ZDo6c3RyaW5nPihzdGQ6OnN0cmluZyBvcHRpb24sIHN0ZDo6c3RyaW5nIG9wdGlvbmFyZykgeworICByZXR1cm4gb3B0aW9uYXJnOworfQorCisvKioKKyAqIFJ1biBoYW5kbGVyLCBhbmQgYW55IHVzZXItZ2l2ZW4gcHJlZGljYXRlcywgZm9yIG9wdGlvbiBULgorICogSWYgYSB1c2VyIHNwZWNpZmllcyBhIDpoYW5kbGVyIG9yIDpwcmVkaWNhdGVzLCBpdCBvdmVycmlkZXMgdGhpcy4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFQ+Cit0eXBlbmFtZSBUOjp0eXBlIHJ1bkhhbmRsZXJBbmRQcmVkaWNhdGVzKFQsIHN0ZDo6c3RyaW5nIG9wdGlvbiwgc3RkOjpzdHJpbmcgb3B0aW9uYXJnLCBvcHRpb25zOjpPcHRpb25zSGFuZGxlciogaGFuZGxlcikgeworICAvLyBCeSBkZWZhdWx0LCBwYXJzZSB0aGUgb3B0aW9uIGFyZ3VtZW50IGluIGEgd2F5IGFwcHJvcHJpYXRlIGZvciBpdHMgdHlwZS4KKyAgLy8gRS5nLiwgZm9yICJ1bnNpZ25lZCBpbnQiIG9wdGlvbnMsIGVuc3VyZSB0aGF0IHRoZSBwcm92aWRlZCBhcmd1bWVudCBpcworICAvLyBhIG5vbm5lZ2F0aXZlIGludGVnZXIgdGhhdCBmaXRzIGluIHRoZSB1bnNpZ25lZCBpbnQgdHlwZS4KKworICByZXR1cm4gaGFuZGxlT3B0aW9uPHR5cGVuYW1lIFQ6OnR5cGU+KG9wdGlvbiwgb3B0aW9uYXJnKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+Cit2b2lkIHJ1bkJvb2xQcmVkaWNhdGVzKFQsIHN0ZDo6c3RyaW5nIG9wdGlvbiwgYm9vbCBiLCBvcHRpb25zOjpPcHRpb25zSGFuZGxlciogaGFuZGxlcikgeworICAvLyBCeSBkZWZhdWx0LCBub3RoaW5nIHRvIGRvIGZvciBib29sLiAgVXNlcnMgYWRkIHRoaW5ncyB3aXRoCisgIC8vIDpwcmVkaWNhdGUgaW4gb3B0aW9ucyBmaWxlcyB0byBwcm92aWRlIGN1c3RvbSBjaGVja2luZyByb3V0aW5lcworICAvLyB0aGF0IGNhbiB0aHJvdyBleGNlcHRpb25zLgorfQorCisKK09wdGlvbnM6Ok9wdGlvbnMoKQorICAgIDogZF9ob2xkZXIobmV3IG9wdGlvbnM6Ok9wdGlvbnNIb2xkZXIoKSkKKyAgICAsIGRfaGFuZGxlcihuZXcgb3B0aW9uczo6T3B0aW9uc0hhbmRsZXIodGhpcykpCisgICAgLCBkX2ZvcmNlTG9naWNMaXN0ZW5lcnMoKQorICAgICwgZF9iZWZvcmVTZWFyY2hMaXN0ZW5lcnMoKQorICAgICwgZF90bGltaXRMaXN0ZW5lcnMoKQorICAgICwgZF90bGltaXRQZXJMaXN0ZW5lcnMoKQorICAgICwgZF9ybGltaXRMaXN0ZW5lcnMoKQorICAgICwgZF9ybGltaXRQZXJMaXN0ZW5lcnMoKQore30KKworT3B0aW9uczo6fk9wdGlvbnMoKSB7CisgIGRlbGV0ZSBkX2hhbmRsZXI7CisgIGRlbGV0ZSBkX2hvbGRlcjsKK30KKwordm9pZCBPcHRpb25zOjpjb3B5VmFsdWVzKGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpeworICBpZih0aGlzICE9ICZvcHRpb25zKSB7CisgICAgZGVsZXRlIGRfaG9sZGVyOworICAgIGRfaG9sZGVyID0gbmV3IG9wdGlvbnM6Ok9wdGlvbnNIb2xkZXIoKm9wdGlvbnMuZF9ob2xkZXIpOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIE9wdGlvbnM6OmZvcm1hdFRocmVhZE9wdGlvbkV4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uKSB7CisgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICBzcyA8PCAiY2FuJ3QgdW5kZXJzdGFuZCBvcHRpb24gYCIgPDwgb3B0aW9uCisgICAgIDw8ICInOiBleHBlY3RlZCBzb21ldGhpbmcgbGlrZSAtLXRocmVhZE49XCItLW9wdGlvbjEgLS1vcHRpb24yXCIsIgorICAgICA8PCAiIHdoZXJlIE4gaXMgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIjsKKyAgcmV0dXJuIHNzLnN0cigpOworfQorCitMaXN0ZW5lckNvbGxlY3Rpb246OlJlZ2lzdHJhdGlvbiogT3B0aW9uczo6cmVnaXN0ZXJBbmROb3RpZnkoCisgICAgTGlzdGVuZXJDb2xsZWN0aW9uJiBjb2xsZWN0aW9uLCBMaXN0ZW5lciogbGlzdGVuZXIsIGJvb2wgbm90aWZ5KQoreworICBMaXN0ZW5lckNvbGxlY3Rpb246OlJlZ2lzdHJhdGlvbiogcmVnaXN0cmF0aW9uID0KKyAgICAgIGNvbGxlY3Rpb24ucmVnaXN0ZXJMaXN0ZW5lcihsaXN0ZW5lcik7CisgIGlmKG5vdGlmeSkgeworICAgIGxpc3RlbmVyLT5ub3RpZnkoKTsKKyAgfQorICByZXR1cm4gcmVnaXN0cmF0aW9uOworfQorCitMaXN0ZW5lckNvbGxlY3Rpb246OlJlZ2lzdHJhdGlvbiogT3B0aW9uczo6cmVnaXN0ZXJGb3JjZUxvZ2ljTGlzdGVuZXIoCisgICAgTGlzdGVuZXIqIGxpc3RlbmVyLCBib29sIG5vdGlmeUlmU2V0KQoreworICBib29sIG5vdGlmeSA9IG5vdGlmeUlmU2V0ICYmIHdhc1NldEJ5VXNlcihvcHRpb25zOjpmb3JjZUxvZ2ljU3RyaW5nKTsKKyAgcmV0dXJuIHJlZ2lzdGVyQW5kTm90aWZ5KGRfZm9yY2VMb2dpY0xpc3RlbmVycywgbGlzdGVuZXIsIG5vdGlmeSk7Cit9CisKK0xpc3RlbmVyQ29sbGVjdGlvbjo6UmVnaXN0cmF0aW9uKiBPcHRpb25zOjpyZWdpc3RlckJlZm9yZVNlYXJjaExpc3RlbmVyKAorICAgTGlzdGVuZXIqIGxpc3RlbmVyKQoreworICByZXR1cm4gZF9iZWZvcmVTZWFyY2hMaXN0ZW5lcnMucmVnaXN0ZXJMaXN0ZW5lcihsaXN0ZW5lcik7Cit9CisKK0xpc3RlbmVyQ29sbGVjdGlvbjo6UmVnaXN0cmF0aW9uKiBPcHRpb25zOjpyZWdpc3RlclRsaW1pdExpc3RlbmVyKAorICAgTGlzdGVuZXIqIGxpc3RlbmVyLCBib29sIG5vdGlmeUlmU2V0KQoreworICBib29sIG5vdGlmeSA9IG5vdGlmeUlmU2V0ICYmCisgICAgICB3YXNTZXRCeVVzZXIob3B0aW9uczo6Y3VtdWxhdGl2ZU1pbGxpc2Vjb25kTGltaXQpOworICByZXR1cm4gcmVnaXN0ZXJBbmROb3RpZnkoZF90bGltaXRMaXN0ZW5lcnMsIGxpc3RlbmVyLCBub3RpZnkpOworfQorCitMaXN0ZW5lckNvbGxlY3Rpb246OlJlZ2lzdHJhdGlvbiogT3B0aW9uczo6cmVnaXN0ZXJUbGltaXRQZXJMaXN0ZW5lcigKKyAgIExpc3RlbmVyKiBsaXN0ZW5lciwgYm9vbCBub3RpZnlJZlNldCkKK3sKKyAgYm9vbCBub3RpZnkgPSBub3RpZnlJZlNldCAmJiB3YXNTZXRCeVVzZXIob3B0aW9uczo6cGVyQ2FsbE1pbGxpc2Vjb25kTGltaXQpOworICByZXR1cm4gcmVnaXN0ZXJBbmROb3RpZnkoZF90bGltaXRQZXJMaXN0ZW5lcnMsIGxpc3RlbmVyLCBub3RpZnkpOworfQorCitMaXN0ZW5lckNvbGxlY3Rpb246OlJlZ2lzdHJhdGlvbiogT3B0aW9uczo6cmVnaXN0ZXJSbGltaXRMaXN0ZW5lcigKKyAgIExpc3RlbmVyKiBsaXN0ZW5lciwgYm9vbCBub3RpZnlJZlNldCkKK3sKKyAgYm9vbCBub3RpZnkgPSBub3RpZnlJZlNldCAmJiB3YXNTZXRCeVVzZXIob3B0aW9uczo6Y3VtdWxhdGl2ZVJlc291cmNlTGltaXQpOworICByZXR1cm4gcmVnaXN0ZXJBbmROb3RpZnkoZF9ybGltaXRMaXN0ZW5lcnMsIGxpc3RlbmVyLCBub3RpZnkpOworfQorCitMaXN0ZW5lckNvbGxlY3Rpb246OlJlZ2lzdHJhdGlvbiogT3B0aW9uczo6cmVnaXN0ZXJSbGltaXRQZXJMaXN0ZW5lcigKKyAgIExpc3RlbmVyKiBsaXN0ZW5lciwgYm9vbCBub3RpZnlJZlNldCkKK3sKKyAgYm9vbCBub3RpZnkgPSBub3RpZnlJZlNldCAmJiB3YXNTZXRCeVVzZXIob3B0aW9uczo6cGVyQ2FsbFJlc291cmNlTGltaXQpOworICByZXR1cm4gcmVnaXN0ZXJBbmROb3RpZnkoZF9ybGltaXRQZXJMaXN0ZW5lcnMsIGxpc3RlbmVyLCBub3RpZnkpOworfQorCitMaXN0ZW5lckNvbGxlY3Rpb246OlJlZ2lzdHJhdGlvbiogT3B0aW9uczo6cmVnaXN0ZXJVc2VUaGVvcnlMaXN0TGlzdGVuZXIoCisgICBMaXN0ZW5lciogbGlzdGVuZXIsIGJvb2wgbm90aWZ5SWZTZXQpCit7CisgIGJvb2wgbm90aWZ5ID0gbm90aWZ5SWZTZXQgJiYgd2FzU2V0QnlVc2VyKG9wdGlvbnM6OnVzZVRoZW9yeUxpc3QpOworICByZXR1cm4gcmVnaXN0ZXJBbmROb3RpZnkoZF91c2VUaGVvcnlMaXN0TGlzdGVuZXJzLCBsaXN0ZW5lciwgbm90aWZ5KTsKK30KKworTGlzdGVuZXJDb2xsZWN0aW9uOjpSZWdpc3RyYXRpb24qIE9wdGlvbnM6OnJlZ2lzdGVyU2V0RGVmYXVsdEV4cHJEZXB0aExpc3RlbmVyKAorICAgIExpc3RlbmVyKiBsaXN0ZW5lciwgYm9vbCBub3RpZnlJZlNldCkKK3sKKyAgYm9vbCBub3RpZnkgPSBub3RpZnlJZlNldCAmJiB3YXNTZXRCeVVzZXIob3B0aW9uczo6ZGVmYXVsdEV4cHJEZXB0aCk7CisgIHJldHVybiByZWdpc3RlckFuZE5vdGlmeShkX3NldERlZmF1bHRFeHByRGVwdGhMaXN0ZW5lcnMsIGxpc3RlbmVyLCBub3RpZnkpOworfQorCitMaXN0ZW5lckNvbGxlY3Rpb246OlJlZ2lzdHJhdGlvbiogT3B0aW9uczo6cmVnaXN0ZXJTZXREZWZhdWx0RXhwckRhZ0xpc3RlbmVyKAorICAgIExpc3RlbmVyKiBsaXN0ZW5lciwgYm9vbCBub3RpZnlJZlNldCkKK3sKKyAgYm9vbCBub3RpZnkgPSBub3RpZnlJZlNldCAmJiB3YXNTZXRCeVVzZXIob3B0aW9uczo6ZGVmYXVsdERhZ1RocmVzaCk7CisgIHJldHVybiByZWdpc3RlckFuZE5vdGlmeShkX3NldERlZmF1bHREYWdUaHJlc2hMaXN0ZW5lcnMsIGxpc3RlbmVyLCBub3RpZnkpOworfQorCitMaXN0ZW5lckNvbGxlY3Rpb246OlJlZ2lzdHJhdGlvbiogT3B0aW9uczo6cmVnaXN0ZXJTZXRQcmludEV4cHJUeXBlc0xpc3RlbmVyKAorICAgIExpc3RlbmVyKiBsaXN0ZW5lciwgYm9vbCBub3RpZnlJZlNldCkKK3sKKyAgYm9vbCBub3RpZnkgPSBub3RpZnlJZlNldCAmJiB3YXNTZXRCeVVzZXIob3B0aW9uczo6cHJpbnRFeHByVHlwZXMpOworICByZXR1cm4gcmVnaXN0ZXJBbmROb3RpZnkoZF9zZXRQcmludEV4cHJUeXBlc0xpc3RlbmVycywgbGlzdGVuZXIsIG5vdGlmeSk7Cit9CisKK0xpc3RlbmVyQ29sbGVjdGlvbjo6UmVnaXN0cmF0aW9uKiBPcHRpb25zOjpyZWdpc3RlclNldER1bXBNb2RlTGlzdGVuZXIoCisgICAgTGlzdGVuZXIqIGxpc3RlbmVyLCBib29sIG5vdGlmeUlmU2V0KQoreworICBib29sIG5vdGlmeSA9IG5vdGlmeUlmU2V0ICYmIHdhc1NldEJ5VXNlcihvcHRpb25zOjpkdW1wTW9kZVN0cmluZyk7CisgIHJldHVybiByZWdpc3RlckFuZE5vdGlmeShkX3NldER1bXBNb2RlTGlzdGVuZXJzLCBsaXN0ZW5lciwgbm90aWZ5KTsKK30KKworTGlzdGVuZXJDb2xsZWN0aW9uOjpSZWdpc3RyYXRpb24qIE9wdGlvbnM6OnJlZ2lzdGVyU2V0UHJpbnRTdWNjZXNzTGlzdGVuZXIoCisgICAgTGlzdGVuZXIqIGxpc3RlbmVyLCBib29sIG5vdGlmeUlmU2V0KQoreworICBib29sIG5vdGlmeSA9IG5vdGlmeUlmU2V0ICYmIHdhc1NldEJ5VXNlcihvcHRpb25zOjpwcmludFN1Y2Nlc3MpOworICByZXR1cm4gcmVnaXN0ZXJBbmROb3RpZnkoZF9zZXRQcmludFN1Y2Nlc3NMaXN0ZW5lcnMsIGxpc3RlbmVyLCBub3RpZnkpOworfQorCitMaXN0ZW5lckNvbGxlY3Rpb246OlJlZ2lzdHJhdGlvbiogT3B0aW9uczo6cmVnaXN0ZXJEdW1wVG9GaWxlTmFtZUxpc3RlbmVyKAorICAgIExpc3RlbmVyKiBsaXN0ZW5lciwgYm9vbCBub3RpZnlJZlNldCkKK3sKKyAgYm9vbCBub3RpZnkgPSBub3RpZnlJZlNldCAmJiB3YXNTZXRCeVVzZXIob3B0aW9uczo6ZHVtcFRvRmlsZU5hbWUpOworICByZXR1cm4gcmVnaXN0ZXJBbmROb3RpZnkoZF9kdW1wVG9GaWxlTGlzdGVuZXJzLCBsaXN0ZW5lciwgbm90aWZ5KTsKK30KKworTGlzdGVuZXJDb2xsZWN0aW9uOjpSZWdpc3RyYXRpb24qCitPcHRpb25zOjpyZWdpc3RlclNldFJlZ3VsYXJPdXRwdXRDaGFubmVsTGlzdGVuZXIoCisgICAgTGlzdGVuZXIqIGxpc3RlbmVyLCBib29sIG5vdGlmeUlmU2V0KQoreworICBib29sIG5vdGlmeSA9IG5vdGlmeUlmU2V0ICYmIHdhc1NldEJ5VXNlcihvcHRpb25zOjpyZWd1bGFyQ2hhbm5lbE5hbWUpOworICByZXR1cm4gcmVnaXN0ZXJBbmROb3RpZnkoZF9zZXRSZWd1bGFyQ2hhbm5lbExpc3RlbmVycywgbGlzdGVuZXIsIG5vdGlmeSk7Cit9CisKK0xpc3RlbmVyQ29sbGVjdGlvbjo6UmVnaXN0cmF0aW9uKgorT3B0aW9uczo6cmVnaXN0ZXJTZXREaWFnbm9zdGljT3V0cHV0Q2hhbm5lbExpc3RlbmVyKAorICAgIExpc3RlbmVyKiBsaXN0ZW5lciwgYm9vbCBub3RpZnlJZlNldCkKK3sKKyAgYm9vbCBub3RpZnkgPSBub3RpZnlJZlNldCAmJiB3YXNTZXRCeVVzZXIob3B0aW9uczo6ZGlhZ25vc3RpY0NoYW5uZWxOYW1lKTsKKyAgcmV0dXJuIHJlZ2lzdGVyQW5kTm90aWZ5KGRfc2V0RGlhZ25vc3RpY0NoYW5uZWxMaXN0ZW5lcnMsIGxpc3RlbmVyLCBub3RpZnkpOworfQorCitMaXN0ZW5lckNvbGxlY3Rpb246OlJlZ2lzdHJhdGlvbioKK09wdGlvbnM6OnJlZ2lzdGVyU2V0UmVwbGF5TG9nRmlsZW5hbWUoCisgICAgTGlzdGVuZXIqIGxpc3RlbmVyLCBib29sIG5vdGlmeUlmU2V0KQoreworICBib29sIG5vdGlmeSA9IG5vdGlmeUlmU2V0ICYmIHdhc1NldEJ5VXNlcihvcHRpb25zOjpyZXBsYXlMb2dGaWxlbmFtZSk7CisgIHJldHVybiByZWdpc3RlckFuZE5vdGlmeShkX3NldFJlcGxheUZpbGVuYW1lTGlzdGVuZXJzLCBsaXN0ZW5lciwgbm90aWZ5KTsKK30KKworJHthbGxfY3VzdG9tX2hhbmRsZXJzfQorCisjbGluZSAzOTQgIiR7dGVtcGxhdGV9IgorCisjaWZkZWYgQ1ZDNF9ERUJVRworIyAgZGVmaW5lIFVTRV9FQVJMWV9UWVBFX0NIRUNLSU5HX0JZX0RFRkFVTFQgdHJ1ZQorI2Vsc2UgLyogQ1ZDNF9ERUJVRyAqLworIyAgZGVmaW5lIFVTRV9FQVJMWV9UWVBFX0NIRUNLSU5HX0JZX0RFRkFVTFQgZmFsc2UKKyNlbmRpZiAvKiBDVkM0X0RFQlVHICovCisKKyNpZiBkZWZpbmVkKENWQzRfTVVaWkxFRCkgfHwgZGVmaW5lZChDVkM0X0NPTVBFVElUSU9OX01PREUpCisjICBkZWZpbmUgRE9fU0VNQU5USUNfQ0hFQ0tTX0JZX0RFRkFVTFQgZmFsc2UKKyNlbHNlIC8qIENWQzRfTVVaWkxFRCB8fCBDVkM0X0NPTVBFVElUSU9OX01PREUgKi8KKyMgIGRlZmluZSBET19TRU1BTlRJQ19DSEVDS1NfQllfREVGQVVMVCB0cnVlCisjZW5kaWYgLyogQ1ZDNF9NVVpaTEVEIHx8IENWQzRfQ09NUEVUSVRJT05fTU9ERSAqLworCitvcHRpb25zOjpPcHRpb25zSG9sZGVyOjpPcHRpb25zSG9sZGVyKCkgOiAke2FsbF9tb2R1bGVzX2RlZmF1bHRzfQoreworfQorCisjbGluZSA0MTIgIiR7dGVtcGxhdGV9IgorCitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgbW9zdENvbW1vbk9wdGlvbnNEZXNjcmlwdGlvbiA9ICJcCitNb3N0IGNvbW1vbmx5LXVzZWQgQ1ZDNCBvcHRpb25zOiR7Y29tbW9uX2RvY3VtZW50YXRpb259IjsKKworI2xpbmUgNDE3ICIke3RlbXBsYXRlfSIKKworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIG9wdGlvbnNEZXNjcmlwdGlvbiA9IG1vc3RDb21tb25PcHRpb25zRGVzY3JpcHRpb24gKyAiXG5cCitcblwKK0FkZGl0aW9uYWwgQ1ZDNCBvcHRpb25zOiR7cmVtYWluaW5nX2RvY3VtZW50YXRpb259IjsKKworI2xpbmUgNDIzICIke3RlbXBsYXRlfSIKKworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIG9wdGlvbnNGb290bm90ZSA9ICJcblwKK1sqXSBFYWNoIG9mIHRoZXNlIG9wdGlvbnMgaGFzIGEgLS1uby1PUFRJT05OQU1FIHZhcmlhbnQsIHdoaWNoIHJldmVyc2VzIHRoZVxuXAorICAgIHNlbnNlIG9mIHRoZSBvcHRpb24uXG5cCisiOworCitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgbGFuZ3VhZ2VEZXNjcmlwdGlvbiA9ICJcCitMYW5ndWFnZXMgY3VycmVudGx5IHN1cHBvcnRlZCBhcyBhcmd1bWVudHMgdG8gdGhlIC1MIC8gLS1sYW5nIG9wdGlvbjpcblwKKyAgYXV0byAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHQgdG8gYXV0b21hdGljYWxseSBkZXRlcm1pbmUgbGFuZ3VhZ2VcblwKKyAgY3ZjNCB8IHByZXNlbnRhdGlvbiB8IHBsICAgICAgIENWQzQgcHJlc2VudGF0aW9uIGxhbmd1YWdlXG5cCisgIHNtdDEgfCBzbXRsaWIxICAgICAgICAgICAgICAgICBTTVQtTElCIGZvcm1hdCAxLjJcblwKKyAgc210IHwgc210bGliIHwgc210MiB8XG5cCisgIHNtdDIuMCB8IHNtdGxpYjIgfCBzbXRsaWIyLjAgICBTTVQtTElCIGZvcm1hdCAyLjBcblwKKyAgc210Mi41IHwgc210bGliMi41ICAgICAgICAgICAgIFNNVC1MSUIgZm9ybWF0IDIuNVxuXAorICBzbXQyLjYgfCBzbXRsaWIyLjYgICAgICAgICAgICAgU01ULUxJQiBmb3JtYXQgMi42XG5cCisgIHRwdHAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUFRQIGZvcm1hdCAoY25mIGFuZCBmb2YpXG5cCisgIHN5Z3VzICAgICAgICAgICAgICAgICAgICAgICAgICBTeUd1UyBmb3JtYXRcblwKK1xuXAorTGFuZ3VhZ2VzIGN1cnJlbnRseSBzdXBwb3J0ZWQgYXMgYXJndW1lbnRzIHRvIHRoZSAtLW91dHB1dC1sYW5nIG9wdGlvbjpcblwKKyAgYXV0byAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoIG91dHB1dCBsYW5ndWFnZSB0byBpbnB1dCBsYW5ndWFnZVxuXAorICBjdmM0IHwgcHJlc2VudGF0aW9uIHwgcGwgICAgICAgQ1ZDNCBwcmVzZW50YXRpb24gbGFuZ3VhZ2VcblwKKyAgY3ZjMyAgICAgICAgICAgICAgICAgICAgICAgICAgIENWQzMgcHJlc2VudGF0aW9uIGxhbmd1YWdlXG5cCisgIHNtdDEgfCBzbXRsaWIxICAgICAgICAgICAgICAgICBTTVQtTElCIGZvcm1hdCAxLjJcblwKKyAgc210IHwgc210bGliIHwgc210MiB8XG5cCisgIHNtdDIuMCB8IHNtdGxpYjIuMCB8IHNtdGxpYjIgICBTTVQtTElCIGZvcm1hdCAyLjBcblwKKyAgc210Mi41IHwgc210bGliMi41ICAgICAgICAgICAgIFNNVC1MSUIgZm9ybWF0IDIuNVxuXAorICBzbXQyLjYgfCBzbXRsaWIyLjYgICAgICAgICAgICAgU01ULUxJQiBmb3JtYXQgMi42XG5cCisgIHRwdHAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUFRQIGZvcm1hdFxuXAorICB6M3N0ciAgICAgICAgICAgICAgICAgICAgICAgICAgU01ULUxJQiAyLjAgd2l0aCBaMy1zdHIgc3RyaW5nIGNvbnN0cmFpbnRzXG5cCisgIGFzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbCBmb3JtYXQgKHNpbXBsZSBzeW50YXggdHJlZXMpXG5cCisiOworCitzdGQ6OnN0cmluZyBPcHRpb25zOjpnZXREZXNjcmlwdGlvbigpIGNvbnN0IHsKKyAgcmV0dXJuIG9wdGlvbnNEZXNjcmlwdGlvbjsKK30KKwordm9pZCBPcHRpb25zOjpwcmludFVzYWdlKGNvbnN0IHN0ZDo6c3RyaW5nIG1zZywgc3RkOjpvc3RyZWFtJiBvdXQpIHsKKyAgb3V0IDw8IG1zZyA8PCBvcHRpb25zRGVzY3JpcHRpb24gPDwgc3RkOjplbmRsCisgICAgICA8PCBvcHRpb25zRm9vdG5vdGUgPDwgc3RkOjplbmRsIDw8IHN0ZDo6Zmx1c2g7Cit9CisKK3ZvaWQgT3B0aW9uczo6cHJpbnRTaG9ydFVzYWdlKGNvbnN0IHN0ZDo6c3RyaW5nIG1zZywgc3RkOjpvc3RyZWFtJiBvdXQpIHsKKyAgb3V0IDw8IG1zZyA8PCBtb3N0Q29tbW9uT3B0aW9uc0Rlc2NyaXB0aW9uIDw8IHN0ZDo6ZW5kbAorICAgICAgPDwgb3B0aW9uc0Zvb3Rub3RlIDw8IHN0ZDo6ZW5kbAorICAgICAgPDwgIkZvciBmdWxsIHVzYWdlLCBwbGVhc2UgdXNlIC0taGVscC4iCisgICAgICA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsIDw8IHN0ZDo6Zmx1c2g7Cit9CisKK3ZvaWQgT3B0aW9uczo6cHJpbnRMYW5ndWFnZUhlbHAoc3RkOjpvc3RyZWFtJiBvdXQpIHsKKyAgb3V0IDw8IGxhbmd1YWdlRGVzY3JpcHRpb24gPDwgc3RkOjpmbHVzaDsKK30KKworLyoqCisgKiBUaGlzIGlzIGEgdGFibGUgb2YgbG9uZyBvcHRpb25zLiAgQnkgcG9saWN5LCBlYWNoIHNob3J0IG9wdGlvbgorICogc2hvdWxkIGhhdmUgYW4gZXF1aXZhbGVudCBsb25nIG9wdGlvbiAoYnV0IHRoZSByZXZlcnNlIGlzbid0IHRoZQorICogY2FzZSksIHNvIHRoaXMgdGFibGUgc2hvdWxkIHRodXMgY29udGFpbiBhbGwgY29tbWFuZC1saW5lIG9wdGlvbnMuCisgKgorICogRWFjaCBvcHRpb24gaW4gdGhpcyBhcnJheSBoYXMgZm91ciBlbGVtZW50czoKKyAqCisgKiAxLiB0aGUgbG9uZyBvcHRpb24gc3RyaW5nCisgKiAyLiBhcmd1bWVudCBiZWhhdmlvciBmb3IgdGhlIG9wdGlvbjoKKyAqICAgIG5vX2FyZ3VtZW50IC0gbm8gYXJndW1lbnQgcGVybWl0dGVkCisgKiAgICByZXF1aXJlZF9hcmd1bWVudCAtIGFuIGFyZ3VtZW50IGlzIGV4cGVjdGVkCisgKiAgICBvcHRpb25hbF9hcmd1bWVudCAtIGFuIGFyZ3VtZW50IGlzIHBlcm1pdHRlZCBidXQgbm90IHJlcXVpcmVkCisgKiAzLiB0aGlzIGlzIGEgcG9pbnRlciB0byBhbiBpbnQgd2hpY2ggaXMgc2V0IHRvIHRoZSA0dGggZW50cnkgb2YgdGhlCisgKiAgICBhcnJheSBpZiB0aGUgb3B0aW9uIGlzIHByZXNlbnQ7IG9yIE5VTEwsIGluIHdoaWNoIGNhc2UKKyAqICAgIGdldG9wdF9sb25nKCkgcmV0dXJucyB0aGUgNHRoIGVudHJ5CisgKiA0LiB0aGUgcmV0dXJuIHZhbHVlIGZvciBnZXRvcHRfbG9uZygpIHdoZW4gdGhpcyBsb25nIG9wdGlvbiAob3IgdGhlCisgKiAgICB2YWx1ZSB0byBzZXQgdGhlIDNyZCBlbnRyeSB0bzsgc2VlICMzKQorICoKKyAqIElmIHlvdSBhZGQgc29tZXRoaW5nIGhlcmUsIHlvdSBzaG91bGQgYWRkIGl0IGluIHNyYy9tYWluL3VzYWdlLmgKKyAqIGFsc28sIHRvIGRvY3VtZW50IGl0LgorICoKKyAqIElmIHlvdSBhZGQgc29tZXRoaW5nIHRoYXQgaGFzIGEgc2hvcnQgb3B0aW9uIGVxdWl2YWxlbnQsIHlvdSBzaG91bGQKKyAqIGFkZCBpdCB0byB0aGUgZ2V0b3B0X2xvbmcoKSBjYWxsIGluIHBhcnNlT3B0aW9ucygpLgorICovCitzdGF0aWMgc3RydWN0IG9wdGlvbiBjbWRsaW5lT3B0aW9uc1tdID0geyR7YWxsX21vZHVsZXNfbG9uZ19vcHRpb25zfQorICB7IE5VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAnXDAnIH0KK307LyogY21kbGluZU9wdGlvbnMgKi8KKworI2xpbmUgNTAyICIke3RlbXBsYXRlfSIKKworLy8gc3RhdGljIHZvaWQgcHJlZW1wdEdldG9wdChpbnQmIGFyZ2MsIGNoYXIqKiYgYXJndiwgY29uc3QgY2hhciogb3B0KSB7CisKKy8vICAgRGVidWcoInByZWVtcHRHZXRvcHQiKSA8PCAicHJlZW1wdGluZyBnZXRvcHQoKSB3aXRoICIgPDwgb3B0IDw8IHN0ZDo6ZW5kbDsKKworLy8gICBBbHdheXNBc3NlcnQob3B0ICE9IE5VTEwgJiYgKm9wdCAhPSAnXDAnKTsKKy8vICAgQWx3YXlzQXNzZXJ0KHN0cmxlbihvcHQpIDw9IG1heG9wdGxlbik7CisKKy8vICAgKythcmdjOworLy8gICB1bnNpZ25lZCBpID0gMTsKKy8vICAgd2hpbGUoYXJndltpXSAhPSBOVUxMICYmIGFyZ3ZbaV1bMF0gIT0gJ1wwJykgeworLy8gICAgICsraTsKKy8vICAgfQorCisvLyAgIGlmKGFyZ3ZbaV0gPT0gTlVMTCkgeworLy8gICAgIGFyZ3YgPSAoY2hhcioqKSByZWFsbG9jKGFyZ3YsIChpICsgNikgKiBzaXplb2YoY2hhciopKTsKKy8vICAgICBmb3IodW5zaWduZWQgaiA9IGk7IGogPCBpICsgNTsgKytqKSB7CisvLyAgICAgICBhcmd2W2pdID0gKGNoYXIqKSBtYWxsb2Moc2l6ZW9mKGNoYXIpICogbWF4b3B0bGVuKTsKKy8vICAgICAgIGFyZ3Zbal1bMF0gPSAnXDAnOworLy8gICAgIH0KKy8vICAgICBhcmd2W2kgKyA1XSA9IE5VTEw7CisvLyAgIH0KKworLy8gICBzdHJuY3B5KGFyZ3ZbaV0sIG9wdCwgbWF4b3B0bGVuIC0gMSk7CisvLyAgIGFyZ3ZbaV1bbWF4b3B0bGVuIC0gMV0gPSAnXDAnOyAvLyBlbnN1cmUgTlVMLXRlcm1pbmF0aW9uIGV2ZW4gb24gb3ZlcmZsb3cKKy8vIH0KKworbmFtZXNwYWNlIG9wdGlvbnMgeworCisvKiogU2V0IGEgZ2l2ZW4gT3B0aW9ucyogYXMgImN1cnJlbnQiIGp1c3QgZm9yIGEgcGFydGljdWxhciBzY29wZS4gKi8KK2NsYXNzIE9wdGlvbnNHdWFyZCB7CisgIENWQzRfVEhSRUFETE9DQUxfVFlQRShPcHRpb25zKikqIGRfZmllbGQ7CisgIE9wdGlvbnMqIGRfb2xkOworcHVibGljOgorICBPcHRpb25zR3VhcmQoQ1ZDNF9USFJFQURMT0NBTF9UWVBFKE9wdGlvbnMqKSogZmllbGQsIE9wdGlvbnMqIG9wdHMpIDoKKyAgICBkX2ZpZWxkKGZpZWxkKSwKKyAgICBkX29sZCgqZmllbGQpIHsKKyAgICAqZmllbGQgPSBvcHRzOworICB9CisgIH5PcHRpb25zR3VhcmQoKSB7CisgICAgKmRfZmllbGQgPSBkX29sZDsKKyAgfQorfTsvKiBjbGFzcyBPcHRpb25zR3VhcmQgKi8KKworfS8qIENWQzQ6Om9wdGlvbnMgbmFtZXNwYWNlICovCisKKy8qKgorICogUGFyc2UgYXJnYy9hcmd2IGFuZCBwdXQgdGhlIHJlc3VsdCBpbnRvIGEgQ1ZDNDo6T3B0aW9ucy4KKyAqIFRoZSByZXR1cm4gdmFsdWUgaXMgd2hhdCdzIGxlZnQgb2YgdGhlIGNvbW1hbmQgbGluZSAodGhhdCBpcywgdGhlCisgKiBub24tb3B0aW9uIGFyZ3VtZW50cykuCisgKi8KK3N0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBPcHRpb25zOjpwYXJzZU9wdGlvbnMoT3B0aW9ucyogb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkKKyAgdGhyb3coT3B0aW9uRXhjZXB0aW9uKSB7CisKKyAgQXNzZXJ0KG9wdGlvbnMgIT0gTlVMTCk7CisgIEFzc2VydChhcmd2ICE9IE5VTEwpOworCisgIG9wdGlvbnM6Ok9wdGlvbnNHdWFyZCBndWFyZCgmc19jdXJyZW50LCBvcHRpb25zKTsKKworICBjb25zdCBjaGFyICpwcm9nTmFtZSA9IGFyZ3ZbMF07CisKKyAgLy8gVG8gZGVidWcgb3B0aW9ucyBwYXJzaW5nLCB5b3UgbWF5IHByZWZlciB0byBzaW1wbHkgdW5jb21tZW50IHRoaXMKKyAgLy8gYW5kIHJlY29tcGlsZS4gRGVidWcgZmxhZ3MgaGF2ZSBub3QgYmVlbiBwYXJzZWQgeWV0IHNvIHRoZXNlIGhhdmUKKyAgLy8gbm90IGJlZW4gc2V0LgorICAvL0RlYnVnQ2hhbm5lbC5vbigib3B0aW9ucyIpOworCisgIERlYnVnKCJvcHRpb25zIikgPDwgIk9wdGlvbnM6OnBhcnNlT3B0aW9ucyA9PSAiIDw8IG9wdGlvbnMgPDwgc3RkOjplbmRsOworICBEZWJ1Zygib3B0aW9ucyIpIDw8ICJhcmd2ID09ICIgPDwgYXJndiA8PCBzdGQ6OmVuZGw7CisKKyAgLy8gRmluZCB0aGUgYmFzZSBuYW1lIG9mIHRoZSBwcm9ncmFtLgorICBjb25zdCBjaGFyICp4ID0gc3RycmNocihwcm9nTmFtZSwgJy8nKTsKKyAgaWYoeCAhPSBOVUxMKSB7CisgICAgcHJvZ05hbWUgPSB4ICsgMTsKKyAgfQorICBvcHRpb25zLT5kX2hvbGRlci0+YmluYXJ5X25hbWUgPSBzdGQ6OnN0cmluZyhwcm9nTmFtZSk7CisKKyAgQXJndW1lbnRFeHRlbmRlciogYXJndW1lbnRFeHRlbmRlciA9IG5ldyBBcmd1bWVudEV4dGVuZGVySW1wbGVtZW50YXRpb24oKTsKKyAgZm9yKGludCBwb3NpdGlvbiA9IDE7IHBvc2l0aW9uIDwgYXJnYzsgcG9zaXRpb24rKykgeworICAgIGFyZ3VtZW50RXh0ZW5kZXItPnB1c2hCYWNrQXJndW1lbnQoYXJndltwb3NpdGlvbl0pOworICB9CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG5vbm9wdGlvbnM7CisgIHBhcnNlT3B0aW9uc1JlY3Vyc2l2ZShvcHRpb25zLCBhcmd1bWVudEV4dGVuZGVyLCAmbm9ub3B0aW9ucyk7CisgIGlmKERlYnVnLmlzT24oIm9wdGlvbnMiKSl7CisgICAgZm9yKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaSA9IG5vbm9wdGlvbnMuYmVnaW4oKSwKKyAgICAgICAgICBpZW5kID0gbm9ub3B0aW9ucy5lbmQoKTsgaSAhPSBpZW5kOyArK2kpeworICAgICAgRGVidWcoIm9wdGlvbnMiKSA8PCAibm9ub3B0aW9ucyAiIDw8ICppIDw8IHN0ZDo6ZW5kbDsKKyAgICB9CisgIH0KKworICBkZWxldGUgYXJndW1lbnRFeHRlbmRlcjsKKyAgcmV0dXJuIG5vbm9wdGlvbnM7Cit9CisKK3ZvaWQgT3B0aW9uczo6cGFyc2VPcHRpb25zUmVjdXJzaXZlKE9wdGlvbnMqIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmd1bWVudEV4dGVuZGVyKiBleHRlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogbm9ub3B0aW9ucykKKyAgdGhyb3coT3B0aW9uRXhjZXB0aW9uKSB7CisKKyAgaW50IGFyZ2M7CisgIGNoYXIqKiBhcmd2OworCisgIGV4dGVuZGVyLT5tb3ZlUHJlZW1wdGlvbnNUb0FyZ3VtZW50cygpOworICBleHRlbmRlci0+cHVzaEZyb250QXJndW1lbnQoIiIpOworICBleHRlbmRlci0+Z2V0QXJndW1lbnRzKCZhcmdjLCAmYXJndik7CisKKyAgaWYoRGVidWcuaXNPbigib3B0aW9ucyIpKSB7CisgICAgRGVidWcoIm9wdGlvbnMiKSA8PCAic3RhcnRpbmcgYSBuZXcgcGFyc2VPcHRpb25zUmVjdXJzaXZlIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgPDwgYXJnYyA8PCAiIGFyZ3VtZW50cyIgPDwgc3RkOjplbmRsOworICAgIGZvciggaW50IGkgPSAwOyBpIDwgYXJnYyA7IGkrKyApeworICAgICAgQXNzZXJ0KGFyZ3ZbaV0gIT0gTlVMTCk7CisgICAgICBEZWJ1Zygib3B0aW9ucyIpIDw8ICIgIGFyZ3ZbIiA8PCBpIDw8ICJdID0gIiA8PCBhcmd2W2ldIDw8IHN0ZDo6ZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBIYXZpbmcgdGhpcyBzeW5vbnltIHNpbXBsaWZpZXMgdGhlIGdlbmVyYXRpb24gY29kZSBpbiBta29wdGlvbnMuCisgIG9wdGlvbnM6Ok9wdGlvbnNIYW5kbGVyKiBoYW5kbGVyID0gb3B0aW9ucy0+ZF9oYW5kbGVyOworICBvcHRpb25zOjpPcHRpb25zSG9sZGVyKiBob2xkZXIgPSBvcHRpb25zLT5kX2hvbGRlcjsKKworICAvLyBSZXNldCBnZXRvcHQoKSwgaW4gdGhlIGNhc2Ugb2YgbXVsdGlwbGUgY2FsbHMgdG8gcGFyc2VPcHRpb25zKCkuCisgIC8vIFRoaXMgY2FuIGJlID0gMSBpbiBuZXdlciBHTlUgZ2V0b3B0LCBidXQgb2xkZXIgKDwgMjAwNykgcmVxdWlyZSA9IDAuCisgIG9wdGluZCA9IDA7CisjaWYgSEFWRV9ERUNMX09QVFJFU0VUCisgIG9wdHJlc2V0ID0gMTsgLy8gb24gQlNEIGdldG9wdCgpIChlLmcuIE1hYyBPUyksIG1pZ2h0IG5lZWQgdGhpcworI2VuZGlmIC8qIEhBVkVfREVDTF9PUFRSRVNFVCAqLworCisgIAorICBpbnQgbWFpbl9vcHRpbmQgPSAwOworICBpbnQgb2xkX29wdGluZDsKKworCisgIHdoaWxlKHRydWUpIHsgLy8gUmVwZWF0IEZvcmV2ZXIKKworICAgIGlmKGV4dGVuZGVyLT5oYXNQcmVlbXB0aW9ucygpKXsKKyAgICAgIC8vIFN0b3AgdGhpcyByb3VuZCBvZiBwYXJzaW5nLiBXZSBub3cgcGFyc2UgcmVjdXJzaXZlbHkKKyAgICAgIC8vIHRvIHN0YXJ0IG9uIGEgbmV3IGNoYXJhY3RlciBhcnJheSBmb3IgYXJndi4KKyAgICAgIHBhcnNlT3B0aW9uc1JlY3Vyc2l2ZShvcHRpb25zLCBleHRlbmRlciwgbm9ub3B0aW9ucyk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBvcHRvcHQgPSAwOworICAgIHN0ZDo6c3RyaW5nIG9wdGlvbiwgb3B0aW9uYXJnOworCisgICAgb3B0aW5kID0gbWFpbl9vcHRpbmQ7CisgICAgb2xkX29wdGluZCA9IG1haW5fb3B0aW5kOworICAgIC8vb3B0aW5kX3JlZiA9ICZtYWluX29wdGluZDsKKyAgICAvL2FyZ3YgPSBtYWluX2FyZ3Y7CisKKyAgICAvLyBJZiB3ZSBlbmNvdW50ZXIgYW4gZWxlbWVudCB0aGF0IGlzIG5vdCBhdCB6ZXJvIGFuZCBkb2VzIG5vdCBzdGFydAorICAgIC8vIHdpdGggYSAiLSIsIHRoaXMgaXMgYSBub24tb3B0aW9uLiBXZSBjb25zdW1lIHRoaXMgZWxlbWVudCBhcyBhCisgICAgLy8gbm9uLW9wdGlvbi4KKyAgICBpZiAobWFpbl9vcHRpbmQgPiAwICYmIG1haW5fb3B0aW5kIDwgYXJnYyAmJgorICAgICAgICBhcmd2W21haW5fb3B0aW5kXVswXSAhPSAnLScpIHsKKyAgICAgIERlYnVnKCJvcHRpb25zIikgPDwgImVucXVldWVpbmcgIiA8PCBhcmd2W21haW5fb3B0aW5kXQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGFzIGEgbm9uLW9wdGlvbi4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIG5vbm9wdGlvbnMtPnB1c2hfYmFjayhhcmd2W21haW5fb3B0aW5kXSk7CisgICAgICArK21haW5fb3B0aW5kOworICAgICAgZXh0ZW5kZXItPnBvcEZyb250QXJndW1lbnQoKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworCisgICAgRGVidWcoIm9wdGlvbnMiKSA8PCAiWyBiZWZvcmUsIG1haW5fb3B0aW5kID09ICIgPDwgbWFpbl9vcHRpbmQgPDwgIiBdIgorICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOworICAgIERlYnVnKCJvcHRpb25zIikgPDwgIlsgYmVmb3JlLCBvcHRpbmQgPT0gIiA8PCBvcHRpbmQgPDwgIiBdIiA8PCBzdGQ6OmVuZGw7CisgICAgRGVidWcoIm9wdGlvbnMiKSA8PCAiWyBhcmdjID09ICIgPDwgYXJnYyA8PCAiLCBhcmd2ID09ICIgPDwgYXJndiA8PCAiIF0iCisgICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisgICAgaW50IGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LAorICAgICAgICAgICAgICAgICAgICAgICAgIis6JHthbGxfbW9kdWxlc19zaG9ydF9vcHRpb25zfSIsCisgICAgICAgICAgICAgICAgICAgICAgICBjbWRsaW5lT3B0aW9ucywgTlVMTCk7CisKKyAgICB3aGlsZShtYWluX29wdGluZCA8IG9wdGluZCkgeworICAgICAgbWFpbl9vcHRpbmQrKzsKKyAgICAgIGV4dGVuZGVyLT5wb3BGcm9udEFyZ3VtZW50KCk7CisgICAgfQorCisgICAgRGVidWcoIm9wdGlvbnMiKSA8PCAiWyBnb3QgIiA8PCBpbnQoYykgPDwgIiAoIiA8PCBjaGFyKGMpIDw8ICIpIF0iCisgICAgICAgICAgICAgICAgICAgICA8PCAiWyBuZXh0IG9wdGlvbiB3aWxsIGJlIGF0IHBvczogIiA8PCBvcHRpbmQgPDwgIiBdIgorICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOworCisgICAgLy8gVGhlIGluaXRpYWwgZ2V0b3B0X2xvbmcgY2FsbCBzaG91bGQgYWx3YXlzIGRldGVybWluZSB0aGF0IGFyZ3ZbMF0KKyAgICAvLyBpcyBub3QgYW4gb3B0aW9uIGFuZCByZXR1cm5zIC0xLiBXZSBhbHdheXMgbWFudWFsbHkgYWR2YW5jZSBiZXlvbmQKKyAgICAvLyB0aGlzIGVsZW1lbnQuCisgICAgLy8KKyAgICAvLyBXZSBoYXZlIHRvIHJlaW5pdGlhbGl6ZSBvcHRpbmQgdG8gMCBpbnN0ZWFkIG9mIDEgYXMgd2UgbmVlZCB0byBzdXBwb3J0CisgICAgLy8gY2hhbmdpbmcgdGhlIGFyZ3YgYXJyYXkgcGFzc2VkIHRvIGdldG9wdC4KKyAgICAvLyBUaGlzIGlzIG5lZWRlZCBhcyBhcmUgdXNpbmcgR05VIGV4dGVuc2lvbnMuCisgICAgLy8gRnJvbTogaHR0cDovL21hbjcub3JnL2xpbnV4L21hbi1wYWdlcy9tYW4zL2dldG9wdC4zLmh0bWwKKyAgICAvLyBBIHByb2dyYW0gdGhhdCBzY2FucyBtdWx0aXBsZSBhcmd1bWVudCB2ZWN0b3JzLCBvciByZXNjYW5zIHRoZSBzYW1lCisgICAgLy8gdmVjdG9yIG1vcmUgdGhhbiBvbmNlLCBhbmQgd2FudHMgdG8gbWFrZSB1c2Ugb2YgR05VIGV4dGVuc2lvbnMgc3VjaAorICAgIC8vIGFzICcrJyBhbmQgJy0nIGF0IHRoZSBzdGFydCBvZiBvcHRzdHJpbmcsIG9yIGNoYW5nZXMgdGhlIHZhbHVlIG9mCisgICAgLy8gIFBPU0lYTFlfQ09SUkVDVCBiZXR3ZWVuIHNjYW5zLCBtdXN0IHJlaW5pdGlhbGl6ZSBnZXRvcHQoKSBieQorICAgIC8vICByZXNldHRpbmcgb3B0aW5kIHRvIDAsIHJhdGhlciB0aGFuIHRoZSB0cmFkaXRpb25hbCB2YWx1ZSBvZiAxLgorICAgIC8vICAoUmVzZXR0aW5nIHRvIDAgZm9yY2VzIHRoZSBpbnZvY2F0aW9uIG9mIGFuIGludGVybmFsIGluaXRpYWxpemF0aW9uCisgICAgLy8gIHJvdXRpbmUgdGhhdCByZWNoZWNrcyBQT1NJWExZX0NPUlJFQ1QgYW5kIGNoZWNrcyBmb3IgR05VIGV4dGVuc2lvbnMKKyAgICAvLyAgaW4gb3B0c3RyaW5nLikKKyAgICBpZiAoIG9sZF9vcHRpbmQgPT0gMCAgJiYgYyA9PSAtMSApIHsKKyAgICAgIEFzc2VydChtYWluX29wdGluZCA+IDApOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKCBjID09IC0xICkgeworICAgICAgaWYoRGVidWcuaXNPbigib3B0aW9ucyIpKSB7CisgICAgICAgIERlYnVnKCJvcHRpb25zIikgPDwgImRvbmUgd2l0aCBvcHRpb24gcGFyc2luZyIgPDwgc3RkOjplbmRsOworICAgICAgICBmb3IoaW50IGluZGV4ID0gb3B0aW5kOyBpbmRleCA8IGFyZ2M7ICsraW5kZXgpIHsKKyAgICAgICAgICBEZWJ1Zygib3B0aW9ucyIpIDw8ICJyZW1haW5pbmcgIiA8PCBhcmd2W2luZGV4XSA8PCBzdGQ6OmVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIG9wdGlvbiA9IGFyZ3Zbb2xkX29wdGluZCA9PSAwID8gMSA6IG9sZF9vcHRpbmRdOworICAgIG9wdGlvbmFyZyA9IChvcHRhcmcgPT0gTlVMTCkgPyAiIiA6IG9wdGFyZzsKKworICAgIERlYnVnKCJwcmVlbXB0R2V0b3B0IikgPDwgInByb2Nlc3Npbmcgb3B0aW9uICIgPDwgYworICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAoYCIgPDwgY2hhcihjKSA8PCAiJyksICIgPDwgb3B0aW9uIDw8IHN0ZDo6ZW5kbDsKKworICAgIHN3aXRjaChjKSB7Ciske2FsbF9tb2R1bGVzX29wdGlvbl9oYW5kbGVyc30KKworI2xpbmUgNzI0ICIke3RlbXBsYXRlfSIKKworICAgIGNhc2UgJzonOgorICAgICAgLy8gVGhpcyBjYW4gYmUgYSBsb25nIG9yIHNob3J0IG9wdGlvbiwgYW5kIHRoZSB3YXkgdG8gZ2V0IGF0IHRoZQorICAgICAgLy8gbmFtZSBvZiBpdCBpcyBkaWZmZXJlbnQuCisgICAgICB0aHJvdyBPcHRpb25FeGNlcHRpb24oc3RkOjpzdHJpbmcoIm9wdGlvbiBgIikgKyBvcHRpb24gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIG1pc3NpbmcgaXRzIHJlcXVpcmVkIGFyZ3VtZW50Iik7CisKKyAgICBjYXNlICc/JzoKKyAgICBkZWZhdWx0OgorICAgICAgaWYoICggb3B0b3B0ID09IDAgfHwKKyAgICAgICAgICAgICggb3B0b3B0ID49ICR7bG9uZ19vcHRpb25fdmFsdWVfYmVnaW59ICYmCisgICAgICAgICAgICAgIG9wdG9wdCA8PSAke2xvbmdfb3B0aW9uX3ZhbHVlX2VuZH0gKQorICAgICAgICAgICkgJiYgIXN0cm5jbXAoYXJndltvcHRpbmQgLSAxXSwgIi0tdGhyZWFkIiwgOCkgJiYKKyAgICAgICAgICBzdHJsZW4oYXJndltvcHRpbmQgLSAxXSkgPiA4ICkKKyAgICAgIHsKKyAgICAgICAgaWYoISBpc2RpZ2l0KGFyZ3Zbb3B0aW5kIC0gMV1bOF0pKSB7CisgICAgICAgICAgdGhyb3cgT3B0aW9uRXhjZXB0aW9uKGZvcm1hdFRocmVhZE9wdGlvbkV4Y2VwdGlvbihvcHRpb24pKTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHRocmVhZEFyZ3YgPSBob2xkZXItPnRocmVhZEFyZ3Y7CisgICAgICAgIGNoYXIgKmVuZDsKKyAgICAgICAgbG9uZyB0bnVtID0gc3RydG9sKGFyZ3Zbb3B0aW5kIC0gMV0gKyA4LCAmZW5kLCAxMCk7CisgICAgICAgIGlmKHRudW0gPCAwIHx8ICgqZW5kICE9ICdcMCcgJiYgKmVuZCAhPSAnPScpKSB7CisgICAgICAgICAgdGhyb3cgT3B0aW9uRXhjZXB0aW9uKGZvcm1hdFRocmVhZE9wdGlvbkV4Y2VwdGlvbihvcHRpb24pKTsKKyAgICAgICAgfQorICAgICAgICBpZih0aHJlYWRBcmd2LnNpemUoKSA8PSBzaXplX3QodG51bSkpIHsKKyAgICAgICAgICB0aHJlYWRBcmd2LnJlc2l6ZSh0bnVtICsgMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYodGhyZWFkQXJndlt0bnVtXSAhPSAiIikgeworICAgICAgICAgIHRocmVhZEFyZ3ZbdG51bV0gKz0gIiAiOworICAgICAgICB9CisgICAgICAgIGlmKCplbmQgPT0gJ1wwJykgeyAvLyBlLmcuLCB3ZSBoYXZlIC0tdGhyZWFkMCAiZm9vIgorICAgICAgICAgIGlmKGFyZ2MgPD0gb3B0aW5kKSB7CisgICAgICAgICAgICB0aHJvdyBPcHRpb25FeGNlcHRpb24oc3RkOjpzdHJpbmcoIm9wdGlvbiBgIikgKyBvcHRpb24gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIG1pc3NpbmcgaXRzIHJlcXVpcmVkIGFyZ3VtZW50Iik7CisgICAgICAgICAgfQorICAgICAgICAgIERlYnVnKCJvcHRpb25zIikgPDwgInRocmVhZCAiIDw8IHRudW0gPDwgIiBnZXRzIG9wdGlvbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBhcmd2W29wdGluZF0gPDwgc3RkOjplbmRsOworICAgICAgICAgIHRocmVhZEFyZ3ZbdG51bV0gKz0gYXJndlttYWluX29wdGluZF07CisgICAgICAgICAgbWFpbl9vcHRpbmQrKzsKKyAgICAgICAgfSBlbHNlIHsgLy8gZS5nLiwgd2UgaGF2ZSAtLXRocmVhZDA9ImZvbyIKKyAgICAgICAgICBpZihlbmRbMV0gPT0gJ1wwJykgeworICAgICAgICAgICAgdGhyb3cgT3B0aW9uRXhjZXB0aW9uKHN0ZDo6c3RyaW5nKCJvcHRpb24gYCIpICsgb3B0aW9uICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyBtaXNzaW5nIGl0cyByZXF1aXJlZCBhcmd1bWVudCIpOworICAgICAgICAgIH0KKyAgICAgICAgICBEZWJ1Zygib3B0aW9ucyIpIDw8ICJ0aHJlYWQgIiA8PCB0bnVtIDw8ICIgZ2V0cyBvcHRpb24gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKGVuZCArIDEpIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICB0aHJlYWRBcmd2W3RudW1dICs9IGVuZCArIDE7CisgICAgICAgIH0KKyAgICAgICAgRGVidWcoIm9wdGlvbnMiKSA8PCAidGhyZWFkICIgPDwgdG51bSA8PCAiIG5vdyBoYXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHRocmVhZEFyZ3ZbdG51bV0gPDwgc3RkOjplbmRsOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgdGhyb3cgT3B0aW9uRXhjZXB0aW9uKHN0ZDo6c3RyaW5nKCJjYW4ndCB1bmRlcnN0YW5kIG9wdGlvbiBgIikgKyBvcHRpb24gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIiArIHN1Z2dlc3RDb21tYW5kTGluZU9wdGlvbnMob3B0aW9uKSk7CisgICAgfQorICB9CisKKyAgRGVidWcoIm9wdGlvbnMiKSA8PCAiZ290ICIgPDwgbm9ub3B0aW9ucy0+c2l6ZSgpCisgICAgICAgICAgICAgICAgICAgPDwgIiBub24tb3B0aW9uIGFyZ3VtZW50cy4iIDw8IHN0ZDo6ZW5kbDsKKworICBmcmVlKGFyZ3YpOworfQorCitzdGQ6OnN0cmluZyBPcHRpb25zOjpzdWdnZXN0Q29tbWFuZExpbmVPcHRpb25zKGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25OYW1lKSB0aHJvdygpIHsKKyAgRGlkWW91TWVhbiBkaWRZb3VNZWFuOworCisgIGNvbnN0IGNoYXIqIG9wdDsKKyAgZm9yKHNpemVfdCBpID0gMDsgKG9wdCA9IGNtZGxpbmVPcHRpb25zW2ldLm5hbWUpICE9IE5VTEw7ICsraSkgeworICAgIGRpZFlvdU1lYW4uYWRkV29yZChzdGQ6OnN0cmluZygiLS0iKSArIGNtZGxpbmVPcHRpb25zW2ldLm5hbWUpOworICB9CisKKyAgcmV0dXJuIGRpZFlvdU1lYW4uZ2V0TWF0Y2hBc1N0cmluZyhvcHRpb25OYW1lLnN1YnN0cigwLCBvcHRpb25OYW1lLmZpbmQoJz0nKSkpOworfQorCitzdGF0aWMgY29uc3QgY2hhciogc210T3B0aW9uc1tdID0geworICAke2FsbF9tb2R1bGVzX3NtdF9vcHRpb25zfSwKKyNsaW5lIDgwMiAiJHt0ZW1wbGF0ZX0iCisgIE5VTEwKK307Lyogc210T3B0aW9uc1tdICovCisKK3N0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBPcHRpb25zOjpzdWdnZXN0U210T3B0aW9ucyhjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uTmFtZSkgdGhyb3coKSB7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdWdnZXN0aW9uczsKKworICBjb25zdCBjaGFyKiBvcHQ7CisgIGZvcihzaXplX3QgaSA9IDA7IChvcHQgPSBzbXRPcHRpb25zW2ldKSAhPSBOVUxMOyArK2kpIHsKKyAgICBpZihzdGQ6OnN0cnN0cihvcHQsIG9wdGlvbk5hbWUuY19zdHIoKSkgIT0gTlVMTCkgeworICAgICAgc3VnZ2VzdGlvbnMucHVzaF9iYWNrKG9wdCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHN1Z2dlc3Rpb25zOworfQorCitzdGQ6OnZlY3Rvcjwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ID4gT3B0aW9uczo6Z2V0T3B0aW9ucygpIGNvbnN0IHRocm93KCkgeworICBzdGQ6OnZlY3Rvcjwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ID4gb3B0czsKKworICAke2FsbF9tb2R1bGVzX2dldF9vcHRpb25zfQorCisjbGluZSA4MjQgIiR7dGVtcGxhdGV9IgorCisgIHJldHVybiBvcHRzOworfQorCisKKyN1bmRlZiBVU0VfRUFSTFlfVFlQRV9DSEVDS0lOR19CWV9ERUZBVUxUCisjdW5kZWYgRE9fU0VNQU5USUNfQ0hFQ0tTX0JZX0RFRkFVTFQKKworfS8qIENWQzQgbmFtZXNwYWNlICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL2N2YzQtcGF0Y2gvdXRpbC9pbnRlZ2VyX2dtcF9pbXAuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvY21ha2UvY3ZjNC1wYXRjaC91dGlsL2ludGVnZXJfZ21wX2ltcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MTZiN2YKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL2N2YzQtcGF0Y2gvdXRpbC9pbnRlZ2VyX2dtcF9pbXAuaApAQCAtMCwwICsxLDUyMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qISBcZmlsZSBpbnRlZ2VyX2dtcF9pbXAuaAorICoqIFx2ZXJiYXRpbQorICoqIE9yaWdpbmFsIGF1dGhvcjogVGltIEtpbmcKKyAqKiBNYWpvciBjb250cmlidXRvcnM6IE1vcmdhbiBEZXRlcnMsIExpYW5hIEhhZGFyZWFuCisgKiogTWlub3IgY29udHJpYnV0b3JzICh0byBjdXJyZW50IHZlcnNpb24pOiBEZWphbiBKb3Zhbm92aWMKKyAqKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQ1ZDNCBwcm9qZWN0LgorICoqIENvcHlyaWdodCAoYykgMjAwOS0yMDE0ICBOZXcgWW9yayBVbml2ZXJzaXR5IGFuZCBUaGUgVW5pdmVyc2l0eSBvZiBJb3dhCisgKiogU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIHRvcC1sZXZlbCBzb3VyY2UgZGlyZWN0b3J5IGZvciBsaWNlbnNpbmcKKyAqKiBpbmZvcm1hdGlvbi5cZW5kdmVyYmF0aW0KKyAqKgorICoqIFxicmllZiBBIG11bHRpcHJlY2lzaW9uIGludGVnZXIgY29uc3RhbnQ7IHdyYXBzIGEgR01QIG11bHRpcHJlY2lzaW9uCisgKiogaW50ZWdlci4KKyAqKgorICoqIEEgbXVsdGlwcmVjaXNpb24gaW50ZWdlciBjb25zdGFudDsgd3JhcHMgYSBHTVAgbXVsdGlwcmVjaXNpb24gaW50ZWdlci4KKyAqKi8KKworI2luY2x1ZGUgImN2YzRfcHVibGljLmgiCisKKyNpZm5kZWYgX19DVkM0X19JTlRFR0VSX0gKKyNkZWZpbmUgX19DVkM0X19JTlRFR0VSX0gKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpbmNsdWRlICJ1dGlsL2dtcF91dGlsLmgiCisjaW5jbHVkZSAidXRpbC9leGNlcHRpb24uaCIKKworbmFtZXNwYWNlIENWQzQgeworCitjbGFzcyBSYXRpb25hbDsKKworY2xhc3MgQ1ZDNF9QVUJMSUMgSW50ZWdlciB7Citwcml2YXRlOgorICAvKioKKyAgICogU3RvcmVzIHRoZSB2YWx1ZSBvZiB0aGUgcmF0aW9uYWwgaXMgc3RvcmVkIGluIGEgQysrIEdNUCBpbnRlZ2VyIGNsYXNzLgorICAgKiBVc2luZyB0aGlzIGluc3RlYWQgb2YgbXB6X3QgYWxsb3dzIGZvciBlYXNpZXIgZGVzdHJ1Y3Rpb24uCisgICAqLworICBtcHpfY2xhc3MgZF92YWx1ZTsKKworcHVibGljOgorCisgIC8qKgorICAgKiBHZXRzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbXAgZGF0YSB0aGF0IGJhY2tzIHVwIHRoZSBpbnRlZ2VyLgorICAgKiBPbmx5IGFjY2Vzc2libGUgdG8gZnJpZW5kIGNsYXNzZXMuCisgICAqLworICBjb25zdCBtcHpfY2xhc3MmIGdldF9tcHooKSBjb25zdCB7IHJldHVybiBkX3ZhbHVlOyB9CisKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYW4gSW50ZWdlciBieSBjb3B5aW5nIGEgR01QIEMrKyBwcmltaXRpdmUuCisgICAqLworICBJbnRlZ2VyKGNvbnN0IG1wel9jbGFzcyYgdmFsKSA6IGRfdmFsdWUodmFsKSB7fQorCisgIC8qKiBDb25zdHJ1Y3RzIGEgcmF0aW9uYWwgd2l0aCB0aGUgdmFsdWUgMC4gKi8KKyAgSW50ZWdlcigpIDogZF92YWx1ZSgwKXt9CisKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBJbnRlZ2VyIGZyb20gYSBDIHN0cmluZy4KKyAgICogVGhyb3dzIHN0ZDo6aW52YWxpZF9hcmd1bWVudCBpZiB0aGUgc3RyaW5nIGlzIG5vdCBhIHZhbGlkIHJhdGlvbmFsLgorICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IGlzIGEgdmFsaWQgcmF0aW9uYWwgc3RyaW5nLAorICAgKiBzZWUgR01QJ3MgZG9jdW1lbnRhdGlvbiBmb3IgbXBxX3NldF9zdHIoKS4KKyAgICovCisgIGV4cGxpY2l0IEludGVnZXIoY29uc3QgY2hhciogcywgdW5zaWduZWQgYmFzZSA9IDEwKTsKKyAgZXhwbGljaXQgSW50ZWdlcihjb25zdCBzdGQ6OnN0cmluZyYgcywgdW5zaWduZWQgYmFzZSA9IDEwKTsKKworICBJbnRlZ2VyKGNvbnN0IEludGVnZXImIHEpIDogZF92YWx1ZShxLmRfdmFsdWUpIHt9CisKKyAgSW50ZWdlciggIHNpZ25lZCBpbnQgeikgOiBkX3ZhbHVlKHopIHt9CisgIEludGVnZXIodW5zaWduZWQgaW50IHopIDogZF92YWx1ZSh6KSB7fQorICBJbnRlZ2VyKCAgc2lnbmVkIGxvbmcgaW50IHopIDogZF92YWx1ZSh6KSB7fQorICBJbnRlZ2VyKHVuc2lnbmVkIGxvbmcgaW50IHopIDogZF92YWx1ZSh6KSB7fQorCisjaWZkZWYgQ1ZDNF9ORUVEX0lOVDY0X1RfT1ZFUkxPQURTCisgIEludGVnZXIoIGludDY0X3QgeikgOiBkX3ZhbHVlKHN0YXRpY19jYXN0PGxvbmc+KHopKSB7fQorICBJbnRlZ2VyKHVpbnQ2NF90IHopIDogZF92YWx1ZShzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPih6KSkge30KKyNlbmRpZiAvKiBDVkM0X05FRURfSU5UNjRfVF9PVkVSTE9BRFMgKi8KKworICB+SW50ZWdlcigpIHt9CisKKyAgSW50ZWdlciYgb3BlcmF0b3I9KGNvbnN0IEludGVnZXImIHgpeworICAgIGlmKHRoaXMgPT0gJngpIHJldHVybiAqdGhpczsKKyAgICBkX3ZhbHVlID0geC5kX3ZhbHVlOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJbnRlZ2VyJiB5KSBjb25zdCB7CisgICAgcmV0dXJuIGRfdmFsdWUgPT0geS5kX3ZhbHVlOworICB9CisKKyAgSW50ZWdlciBvcGVyYXRvci0oKSBjb25zdCB7CisgICAgcmV0dXJuIEludGVnZXIoLShkX3ZhbHVlKSk7CisgIH0KKworCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBJbnRlZ2VyJiB5KSBjb25zdCB7CisgICAgcmV0dXJuIGRfdmFsdWUgIT0geS5kX3ZhbHVlOworICB9CisKKyAgYm9vbCBvcGVyYXRvcjwgKGNvbnN0IEludGVnZXImIHkpIGNvbnN0IHsKKyAgICByZXR1cm4gZF92YWx1ZSA8IHkuZF92YWx1ZTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I8PShjb25zdCBJbnRlZ2VyJiB5KSBjb25zdCB7CisgICAgcmV0dXJuIGRfdmFsdWUgPD0geS5kX3ZhbHVlOworICB9CisKKyAgYm9vbCBvcGVyYXRvcj4gKGNvbnN0IEludGVnZXImIHkpIGNvbnN0IHsKKyAgICByZXR1cm4gZF92YWx1ZSA+IHkuZF92YWx1ZTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I+PShjb25zdCBJbnRlZ2VyJiB5KSBjb25zdCB7CisgICAgcmV0dXJuIGRfdmFsdWUgPj0geS5kX3ZhbHVlOworICB9CisKKworICBJbnRlZ2VyIG9wZXJhdG9yKyhjb25zdCBJbnRlZ2VyJiB5KSBjb25zdCB7CisgICAgcmV0dXJuIEludGVnZXIoIGRfdmFsdWUgKyB5LmRfdmFsdWUgKTsKKyAgfQorICBJbnRlZ2VyJiBvcGVyYXRvcis9KGNvbnN0IEludGVnZXImIHkpIHsKKyAgICBkX3ZhbHVlICs9IHkuZF92YWx1ZTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBJbnRlZ2VyIG9wZXJhdG9yLShjb25zdCBJbnRlZ2VyJiB5KSBjb25zdCB7CisgICAgcmV0dXJuIEludGVnZXIoIGRfdmFsdWUgLSB5LmRfdmFsdWUgKTsKKyAgfQorICBJbnRlZ2VyJiBvcGVyYXRvci09KGNvbnN0IEludGVnZXImIHkpIHsKKyAgICBkX3ZhbHVlIC09IHkuZF92YWx1ZTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBJbnRlZ2VyIG9wZXJhdG9yKihjb25zdCBJbnRlZ2VyJiB5KSBjb25zdCB7CisgICAgcmV0dXJuIEludGVnZXIoIGRfdmFsdWUgKiB5LmRfdmFsdWUgKTsKKyAgfQorICBJbnRlZ2VyJiBvcGVyYXRvcio9KGNvbnN0IEludGVnZXImIHkpIHsKKyAgICBkX3ZhbHVlICo9IHkuZF92YWx1ZTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworCisgIEludGVnZXIgYml0d2lzZU9yKGNvbnN0IEludGVnZXImIHkpIGNvbnN0IHsKKyAgICBtcHpfY2xhc3MgcmVzdWx0OworICAgIG1wel9pb3IocmVzdWx0LmdldF9tcHpfdCgpLCBkX3ZhbHVlLmdldF9tcHpfdCgpLCB5LmRfdmFsdWUuZ2V0X21wel90KCkpOworICAgIHJldHVybiBJbnRlZ2VyKHJlc3VsdCk7CisgIH0KKworICBJbnRlZ2VyIGJpdHdpc2VBbmQoY29uc3QgSW50ZWdlciYgeSkgY29uc3QgeworICAgIG1wel9jbGFzcyByZXN1bHQ7CisgICAgbXB6X2FuZChyZXN1bHQuZ2V0X21wel90KCksIGRfdmFsdWUuZ2V0X21wel90KCksIHkuZF92YWx1ZS5nZXRfbXB6X3QoKSk7CisgICAgcmV0dXJuIEludGVnZXIocmVzdWx0KTsKKyAgfQorCisgIEludGVnZXIgYml0d2lzZVhvcihjb25zdCBJbnRlZ2VyJiB5KSBjb25zdCB7CisgICAgbXB6X2NsYXNzIHJlc3VsdDsKKyAgICBtcHpfeG9yKHJlc3VsdC5nZXRfbXB6X3QoKSwgZF92YWx1ZS5nZXRfbXB6X3QoKSwgeS5kX3ZhbHVlLmdldF9tcHpfdCgpKTsKKyAgICByZXR1cm4gSW50ZWdlcihyZXN1bHQpOworICB9CisKKyAgSW50ZWdlciBiaXR3aXNlTm90KCkgY29uc3QgeworICAgIG1wel9jbGFzcyByZXN1bHQ7CisgICAgbXB6X2NvbShyZXN1bHQuZ2V0X21wel90KCksIGRfdmFsdWUuZ2V0X21wel90KCkpOworICAgIHJldHVybiBJbnRlZ2VyKHJlc3VsdCk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJuIHRoaXMqKDJecG93KS4KKyAgICovCisgIEludGVnZXIgbXVsdGlwbHlCeVBvdzIodWludDMyX3QgcG93KSBjb25zdHsKKyAgICBtcHpfY2xhc3MgcmVzdWx0OworICAgIG1wel9tdWxfMmV4cChyZXN1bHQuZ2V0X21wel90KCksIGRfdmFsdWUuZ2V0X21wel90KCksIHBvdyk7CisgICAgcmV0dXJuIEludGVnZXIoIHJlc3VsdCApOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIEludGVnZXIgb2J0YWluZWQgYnkgc2V0dGluZyB0aGUgaXRoIGJpdCBvZiB0aGUKKyAgICogY3VycmVudCBJbnRlZ2VyIHRvIDEuCisgICAqLworICBJbnRlZ2VyIHNldEJpdCh1aW50MzJfdCBpKSBjb25zdCB7CisgICAgbXB6X2NsYXNzIHJlcyA9IGRfdmFsdWU7CisgICAgbXB6X3NldGJpdChyZXMuZ2V0X21wel90KCksIGkpOworICAgIHJldHVybiBJbnRlZ2VyKHJlcyk7CisgIH0KKworICBib29sIGlzQml0U2V0KHVpbnQzMl90IGkpIGNvbnN0IHsKKyAgICByZXR1cm4gIWV4dHJhY3RCaXRSYW5nZSgxLCBpKS5pc1plcm8oKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBpbnRlZ2VyIHdpdGggdGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiBzaXplIGJpdHMKKyAgICogZXh0ZW5kZWQgd2l0aCBhbW91bnQgMSdzCisgICAqLworICBJbnRlZ2VyIG9uZUV4dGVuZCh1aW50MzJfdCBzaXplLCB1aW50MzJfdCBhbW91bnQpIGNvbnN0IHsKKyAgICAvLyBjaGVjayB0aGF0IHRoZSBzaXplIGlzIGFjY3VyYXRlCisgICAgRGVidWdDaGVja0FyZ3VtZW50KCgqdGhpcykgPCBJbnRlZ2VyKDEpLm11bHRpcGx5QnlQb3cyKHNpemUpLCBzaXplKTsKKyAgICBtcHpfY2xhc3MgcmVzID0gZF92YWx1ZTsKKworICAgIGZvciAodW5zaWduZWQgaSA9IHNpemU7IGkgPCBzaXplICsgYW1vdW50OyArK2kpIHsKKyAgICAgIG1wel9zZXRiaXQocmVzLmdldF9tcHpfdCgpLCBpKTsKKyAgICB9CisKKyAgICByZXR1cm4gSW50ZWdlcihyZXMpOworICB9CisKKyAgdWludDMyX3QgdG9VbnNpZ25lZEludCgpIGNvbnN0IHsKKyAgICByZXR1cm4gIG1wel9nZXRfdWkoZF92YWx1ZS5nZXRfbXB6X3QoKSk7CisgIH0KKworICAvKiogU2VlIEdNUCBEb2N1bWVudGF0aW9uLiAqLworICBJbnRlZ2VyIGV4dHJhY3RCaXRSYW5nZSh1aW50MzJfdCBiaXRDb3VudCwgdWludDMyX3QgbG93KSBjb25zdCB7CisgICAgLy8gYml0Q291bnQgPSBoaWdoLWxvdysxCisgICAgdWludDMyX3QgaGlnaCA9IGxvdyArIGJpdENvdW50LTE7CisgICAgLy/igJQgRnVuY3Rpb246IHZvaWQgbXB6X2ZkaXZfcl8yZXhwIChtcHpfdCByLCBtcHpfdCBuLCBtcF9iaXRjbnRfdCBiKQorICAgIG1wel9jbGFzcyByZW0sIGRpdjsKKyAgICBtcHpfZmRpdl9yXzJleHAocmVtLmdldF9tcHpfdCgpLCBkX3ZhbHVlLmdldF9tcHpfdCgpLCBoaWdoKzEpOworICAgIG1wel9mZGl2X3FfMmV4cChkaXYuZ2V0X21wel90KCksIHJlbS5nZXRfbXB6X3QoKSwgbG93KTsKKworICAgIHJldHVybiBJbnRlZ2VyKGRpdik7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgZmxvb3IodGhpcyAvIHkpCisgICAqLworICBJbnRlZ2VyIGZsb29yRGl2aWRlUXVvdGllbnQoY29uc3QgSW50ZWdlciYgeSkgY29uc3QgeworICAgIG1wel9jbGFzcyBxOworICAgIG1wel9mZGl2X3EocS5nZXRfbXB6X3QoKSwgZF92YWx1ZS5nZXRfbXB6X3QoKSwgeS5kX3ZhbHVlLmdldF9tcHpfdCgpKTsKKyAgICByZXR1cm4gSW50ZWdlciggcSApOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgciA9PSB0aGlzIC0gZmxvb3IodGhpcy95KSp5CisgICAqLworICBJbnRlZ2VyIGZsb29yRGl2aWRlUmVtYWluZGVyKGNvbnN0IEludGVnZXImIHkpIGNvbnN0IHsKKyAgICBtcHpfY2xhc3MgcjsKKyAgICBtcHpfZmRpdl9yKHIuZ2V0X21wel90KCksIGRfdmFsdWUuZ2V0X21wel90KCksIHkuZF92YWx1ZS5nZXRfbXB6X3QoKSk7CisgICAgcmV0dXJuIEludGVnZXIoIHIgKTsKKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlcyBhIGZsb29yIHF1b3RpZW50IGFuZCByZW1haW5kZXIgZm9yIHggZGl2aWRlZCBieSB5LgorICAgKi8KKyAgc3RhdGljIHZvaWQgZmxvb3JRUihJbnRlZ2VyJiBxLCBJbnRlZ2VyJiByLCBjb25zdCBJbnRlZ2VyJiB4LCBjb25zdCBJbnRlZ2VyJiB5KSB7CisgICAgbXB6X2ZkaXZfcXIocS5kX3ZhbHVlLmdldF9tcHpfdCgpLCByLmRfdmFsdWUuZ2V0X21wel90KCksIHguZF92YWx1ZS5nZXRfbXB6X3QoKSwgeS5kX3ZhbHVlLmdldF9tcHpfdCgpKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBjZWlsKHRoaXMgLyB5KQorICAgKi8KKyAgSW50ZWdlciBjZWlsaW5nRGl2aWRlUXVvdGllbnQoY29uc3QgSW50ZWdlciYgeSkgY29uc3QgeworICAgIG1wel9jbGFzcyBxOworICAgIG1wel9jZGl2X3EocS5nZXRfbXB6X3QoKSwgZF92YWx1ZS5nZXRfbXB6X3QoKSwgeS5kX3ZhbHVlLmdldF9tcHpfdCgpKTsKKyAgICByZXR1cm4gSW50ZWdlciggcSApOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGNlaWwodGhpcyAvIHkpCisgICAqLworICBJbnRlZ2VyIGNlaWxpbmdEaXZpZGVSZW1haW5kZXIoY29uc3QgSW50ZWdlciYgeSkgY29uc3QgeworICAgIG1wel9jbGFzcyByOworICAgIG1wel9jZGl2X3Ioci5nZXRfbXB6X3QoKSwgZF92YWx1ZS5nZXRfbXB6X3QoKSwgeS5kX3ZhbHVlLmdldF9tcHpfdCgpKTsKKyAgICByZXR1cm4gSW50ZWdlciggciApOworICB9CisKKyAgLyoqCisgICAqIENvbXB1dGVzIGEgcXVvaXRlbnQgYW5kIHJlbWFpbmRlciBhY2NvcmRpbmcgdG8gQm91dGUncyBFdWNsaWRlYW4gZGVmaW5pdGlvbi4KKyAgICogZXVjbGlkaWFuRGl2aWRlUXVvdGllbnQsIGV1Y2xpZGlhbkRpdmlkZVJlbWFpbmRlci4KKyAgICoKKyAgICogQm91dGUsIFJheW1vbmQgVC4gKEFwcmlsIDE5OTIpLgorICAgKiBUaGUgRXVjbGlkZWFuIGRlZmluaXRpb24gb2YgdGhlIGZ1bmN0aW9ucyBkaXYgYW5kIG1vZC4KKyAgICogQUNNIFRyYW5zYWN0aW9ucyBvbiBQcm9ncmFtbWluZyBMYW5ndWFnZXMgYW5kIFN5c3RlbXMgKFRPUExBUykKKyAgICogQUNNIFByZXNzLiAxNCAoMik6IDEyNyAtIDE0NC4gZG9pOjEwLjExNDUvMTI4ODYxLjEyODg2Mi4KKyAgICovCisgIHN0YXRpYyB2b2lkIGV1Y2xpZGlhblFSKEludGVnZXImIHEsIEludGVnZXImIHIsIGNvbnN0IEludGVnZXImIHgsIGNvbnN0IEludGVnZXImIHkpIHsKKyAgICAvLyBjb21wdXRlIHRoZSBmbG9vciBhbmQgdGhlbiBmaXggdGhlIHZhbHVlIHVwIGlmIG5lZWRlZC4KKyAgICBmbG9vclFSKHEscix4LHkpOworCisgICAgaWYoci5zdHJpY3RseU5lZ2F0aXZlKCkpeworICAgICAgLy8gaWYgciA8IDAKKyAgICAgIC8vIGFicyhyKSA8IGFicyh5KQorICAgICAgLy8gLSBhYnMoeSkgPCByIDwgMCwgdGhlbiAwIDwgciArIGFicyh5KSA8IGFicyh5KQorICAgICAgLy8gbiA9IHkgKiBxICsgcgorICAgICAgLy8gbiA9IHkgKiBxIC0gYWJzKHkpICsgciArIGFicyh5KQorICAgICAgaWYoci5zZ24oKSA+PSAwKXsKKyAgICAgICAgLy8geSA9IGFicyh5KQorICAgICAgICAvLyBuID0geSAqIHEgLSB5ICsgciArIHkKKyAgICAgICAgLy8gbiA9IHkgKiAocS0xKSArIChyK3kpCisgICAgICAgIHEgLT0gMTsKKyAgICAgICAgciArPSB5OworICAgICAgfWVsc2V7CisgICAgICAgIC8vIHkgPSAtYWJzKHkpCisgICAgICAgIC8vIG4gPSB5ICogcSArIHkgKyByIC0geQorICAgICAgICAvLyBuID0geSAqIChxKzEpICsgKHIteSkKKyAgICAgICAgcSArPSAxOworICAgICAgICByIC09IHk7CisgICAgICB9CisgICAgfQorICB9CisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBxdW9pdGVudCBhY2NvcmRpbmcgdG8gQm91dGUncyBFdWNsaWRlYW4gZGVmaW5pdGlvbi4KKyAgICogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBldWNsaWRpYW5RUi4KKyAgICovCisgIEludGVnZXIgZXVjbGlkaWFuRGl2aWRlUXVvdGllbnQoY29uc3QgSW50ZWdlciYgeSkgY29uc3QgeworICAgIEludGVnZXIgcSxyOworICAgIGV1Y2xpZGlhblFSKHEsciwgKnRoaXMsIHkpOworICAgIHJldHVybiBxOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIHJlbWFpbmZpbmcgYWNjb3JkaW5nIHRvIEJvdXRlJ3MgRXVjbGlkZWFuIGRlZmluaXRpb24uCisgICAqIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgZXVjbGlkaWFuUVIuCisgICAqLworICBJbnRlZ2VyIGV1Y2xpZGlhbkRpdmlkZVJlbWFpbmRlcihjb25zdCBJbnRlZ2VyJiB5KSBjb25zdCB7CisgICAgSW50ZWdlciBxLHI7CisgICAgZXVjbGlkaWFuUVIocSxyLCAqdGhpcywgeSk7CisgICAgcmV0dXJuIHI7CisgIH0KKworCisgIC8qKgorICAgKiBJZiB5IGRpdmlkZXMgKnRoaXMsIHRoZW4gZXhhY3RRdW90aWVudCByZXR1cm5zICh0aGlzL3kpCisgICAqLworICBJbnRlZ2VyIGV4YWN0UXVvdGllbnQoY29uc3QgSW50ZWdlciYgeSkgY29uc3QgeworICAgIERlYnVnQ2hlY2tBcmd1bWVudCh5LmRpdmlkZXMoKnRoaXMpLCB5KTsKKyAgICBtcHpfY2xhc3MgcTsKKyAgICBtcHpfZGl2ZXhhY3QocS5nZXRfbXB6X3QoKSwgZF92YWx1ZS5nZXRfbXB6X3QoKSwgeS5kX3ZhbHVlLmdldF9tcHpfdCgpKTsKKyAgICByZXR1cm4gSW50ZWdlciggcSApOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgeSBtb2QgMl5leHAKKyAgICovCisgIEludGVnZXIgbW9kQnlQb3cyKHVpbnQzMl90IGV4cCkgY29uc3QgeworICAgIG1wel9jbGFzcyByZXM7CisgICAgbXB6X2ZkaXZfcl8yZXhwKHJlcy5nZXRfbXB6X3QoKSwgZF92YWx1ZS5nZXRfbXB6X3QoKSwgZXhwKTsKKyAgICByZXR1cm4gSW50ZWdlcihyZXMpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgeSAvIDJeZXhwCisgICAqLworICBJbnRlZ2VyIGRpdkJ5UG93Mih1aW50MzJfdCBleHApIGNvbnN0IHsKKyAgICBtcHpfY2xhc3MgcmVzOworICAgIG1wel9mZGl2X3FfMmV4cChyZXMuZ2V0X21wel90KCksIGRfdmFsdWUuZ2V0X21wel90KCksIGV4cCk7CisgICAgcmV0dXJuIEludGVnZXIocmVzKTsKKyAgfQorCisKKyAgaW50IHNnbigpIGNvbnN0IHsKKyAgICByZXR1cm4gbXB6X3NnbihkX3ZhbHVlLmdldF9tcHpfdCgpKTsKKyAgfQorCisgIGlubGluZSBib29sIHN0cmljdGx5UG9zaXRpdmUoKSBjb25zdCB7CisgICAgcmV0dXJuIHNnbigpID4gMDsKKyAgfQorCisgIGlubGluZSBib29sIHN0cmljdGx5TmVnYXRpdmUoKSBjb25zdCB7CisgICAgcmV0dXJuIHNnbigpIDwgMDsKKyAgfQorCisgIGlubGluZSBib29sIGlzWmVybygpIGNvbnN0IHsKKyAgICByZXR1cm4gc2duKCkgPT0gMDsKKyAgfQorCisgIGJvb2wgaXNPbmUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1wel9jbXBfc2koZF92YWx1ZS5nZXRfbXB6X3QoKSwgMSkgPT0gMDsKKyAgfQorCisgIGJvb2wgaXNOZWdhdGl2ZU9uZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbXB6X2NtcF9zaShkX3ZhbHVlLmdldF9tcHpfdCgpLCAtMSkgPT0gMDsKKyAgfQorCisgIC8qKgorICAgKiBSYWlzZSB0aGlzIEludGVnZXIgdG8gdGhlIHBvd2VyIDxjb2RlPmV4cDwvY29kZT4uCisgICAqCisgICAqIEBwYXJhbSBleHAgdGhlIGV4cG9uZW50CisgICAqLworICBJbnRlZ2VyIHBvdyh1bnNpZ25lZCBsb25nIGludCBleHApIGNvbnN0IHsKKyAgICBtcHpfY2xhc3MgcmVzdWx0OworICAgIG1wel9wb3dfdWkocmVzdWx0LmdldF9tcHpfdCgpLGRfdmFsdWUuZ2V0X21wel90KCksZXhwKTsKKyAgICByZXR1cm4gSW50ZWdlciggcmVzdWx0ICk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJuIHRoZSBncmVhdGVzdCBjb21tb24gZGl2aXNvciBvZiB0aGlzIGludGVnZXIgd2l0aCBhbm90aGVyLgorICAgKi8KKyAgSW50ZWdlciBnY2QoY29uc3QgSW50ZWdlciYgeSkgY29uc3QgeworICAgIG1wel9jbGFzcyByZXN1bHQ7CisgICAgbXB6X2djZChyZXN1bHQuZ2V0X21wel90KCksIGRfdmFsdWUuZ2V0X21wel90KCksIHkuZF92YWx1ZS5nZXRfbXB6X3QoKSk7CisgICAgcmV0dXJuIEludGVnZXIocmVzdWx0KTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm4gdGhlIGxlYXN0IGNvbW1vbiBtdWx0aXBsZSBvZiB0aGlzIGludGVnZXIgd2l0aCBhbm90aGVyLgorICAgKi8KKyAgSW50ZWdlciBsY20oY29uc3QgSW50ZWdlciYgeSkgY29uc3QgeworICAgIG1wel9jbGFzcyByZXN1bHQ7CisgICAgbXB6X2xjbShyZXN1bHQuZ2V0X21wel90KCksIGRfdmFsdWUuZ2V0X21wel90KCksIHkuZF92YWx1ZS5nZXRfbXB6X3QoKSk7CisgICAgcmV0dXJuIEludGVnZXIocmVzdWx0KTsKKyAgfQorCisgIC8qKgorICAgKiBBbGwgbm9uLXplcm8gaW50ZWdlcnMgeiwgei5kaXZpZGUoMCkKKyAgICogISB6ZXJvLmRpdmlkZXMoemVybykKKyAgICovCisgIGJvb2wgZGl2aWRlcyhjb25zdCBJbnRlZ2VyJiB5KSBjb25zdCB7CisgICAgaW50IHJlcyA9IG1wel9kaXZpc2libGVfcCh5LmRfdmFsdWUuZ2V0X21wel90KCksIGRfdmFsdWUuZ2V0X21wel90KCkpOworICAgIHJldHVybiByZXMgIT0gMDsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm4gdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoaXMgaW50ZWdlci4KKyAgICovCisgIEludGVnZXIgYWJzKCkgY29uc3QgeworICAgIHJldHVybiBkX3ZhbHVlID49IDAgPyAqdGhpcyA6IC0qdGhpczsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKGludCBiYXNlID0gMTApIGNvbnN0eworICAgIHJldHVybiBkX3ZhbHVlLmdldF9zdHIoYmFzZSk7CisgIH0KKworICBib29sIGZpdHNTaWduZWRJbnQoKSBjb25zdDsKKworICBib29sIGZpdHNVbnNpZ25lZEludCgpIGNvbnN0OworCisgIHNpZ25lZCBpbnQgZ2V0U2lnbmVkSW50KCkgY29uc3Q7CisKKyAgdW5zaWduZWQgaW50IGdldFVuc2lnbmVkSW50KCkgY29uc3Q7CisKKyAgbG9uZyBnZXRMb25nKCkgY29uc3QgeworICAgIGxvbmcgc2kgPSBkX3ZhbHVlLmdldF9zaSgpOworICAgIC8vIGVuc3VyZSB0aGVyZSB3YXNuJ3Qgb3ZlcmZsb3cKKyAgICBDaGVja0FyZ3VtZW50KG1wel9jbXBfc2koZF92YWx1ZS5nZXRfbXB6X3QoKSwgc2kpID09IDAsIHRoaXMsCisgICAgICAgICAgICAgICAgICJPdmVyZmxvdyBkZXRlY3RlZCBpbiBJbnRlZ2VyOjpnZXRMb25nKCkiKTsKKyAgICByZXR1cm4gc2k7CisgIH0KKyAgdW5zaWduZWQgbG9uZyBnZXRVbnNpZ25lZExvbmcoKSBjb25zdCB7CisgICAgdW5zaWduZWQgbG9uZyB1aSA9IGRfdmFsdWUuZ2V0X3VpKCk7CisgICAgLy8gZW5zdXJlIHRoZXJlIHdhc24ndCBvdmVyZmxvdworICAgIENoZWNrQXJndW1lbnQobXB6X2NtcF91aShkX3ZhbHVlLmdldF9tcHpfdCgpLCB1aSkgPT0gMCwgdGhpcywKKyAgICAgICAgICAgICAgICAgICJPdmVyZmxvdyBkZXRlY3RlZCBpbiBJbnRlZ2VyOjpnZXRVbnNpZ25lZExvbmcoKSIpOworICAgIHJldHVybiB1aTsKKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlcyB0aGUgaGFzaCBvZiB0aGUgbm9kZSBmcm9tIHRoZSBmaXJzdCB3b3JkIG9mIHRoZQorICAgKiBudW1lcmF0b3IsIHRoZSBkZW5vbWluYXRvci4KKyAgICovCisgIHNpemVfdCBoYXNoKCkgY29uc3QgeworICAgIHJldHVybiBnbXB6X2hhc2goZF92YWx1ZS5nZXRfbXB6X3QoKSk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0cnVlIGlmZiBiaXQgbiBpcyBzZXQuCisgICAqCisgICAqIEBwYXJhbSBuIHRoZSBiaXQgdG8gdGVzdCAoMCA9PSBsZWFzdCBzaWduaWZpY2FudCBiaXQpCisgICAqIEByZXR1cm4gdHJ1ZSBpZiBiaXQgbiBpcyBzZXQgaW4gdGhpcyBpbnRlZ2VyOyBmYWxzZSBvdGhlcndpc2UKKyAgICovCisgIGJvb2wgdGVzdEJpdCh1bnNpZ25lZCBuKSBjb25zdCB7CisgICAgcmV0dXJuIG1wel90c3RiaXQoZF92YWx1ZS5nZXRfbXB6X3QoKSwgbik7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyBrIGlmIHRoZSBpbnRlZ2VyIGlzIGVxdWFsIHRvIDJeKGstMSkKKyAgICogQHJldHVybiBrIGlmIHRoZSBpbnRlZ2VyIGlzIGVxdWFsIHRvIDJeKGstMSkgYW5kIDAgb3RoZXJ3aXNlCisgICAqLworICB1bnNpZ25lZCBpc1BvdzIoKSBjb25zdCB7CisgICAgaWYgKGRfdmFsdWUgPD0gMCkgcmV0dXJuIDA7CisgICAgLy8gY2hlY2sgdGhhdCB0aGUgbnVtYmVyIG9mIG9uZXMgaW4gdGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbiBpcyAxCisgICAgaWYgKG1wel9wb3Bjb3VudChkX3ZhbHVlLmdldF9tcHpfdCgpKSA9PSAxKSB7CisgICAgICAvLyByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvbmUgcGx1cyAxCisgICAgICByZXR1cm4gbXB6X3NjYW4xKGRfdmFsdWUuZ2V0X21wel90KCksIDApICsgMTsKKyAgICB9CisgICAgcmV0dXJuIDA7IAorICB9CisKKyAgCisgIC8qKgorICAgKiBJZiB4ICE9IDAsIHJldHVybnMgdGhlIHNtYWxsZXN0IG4gcy50LiAyXntuLTF9IDw9IGFicyh4KSA8IDJee259LgorICAgKiBJZiB4ID09IDAsIHJldHVybnMgMS4KKyAgICovCisgIHNpemVfdCBsZW5ndGgoKSBjb25zdCB7CisgICAgaWYoc2duKCkgPT0gMCl7CisgICAgICByZXR1cm4gMTsKKyAgICB9ZWxzZXsKKyAgICAgIHJldHVybiBtcHpfc2l6ZWluYmFzZShkX3ZhbHVlLmdldF9tcHpfdCgpLDIpOworICAgIH0KKyAgfQorCisgIHN0YXRpYyB2b2lkIGV4dGVuZGVkR2NkKEludGVnZXImIGcsIEludGVnZXImIHMsIEludGVnZXImIHQsIGNvbnN0IEludGVnZXImIGEsIGNvbnN0IEludGVnZXImIGIpeworICAgIC8vc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvcjoKKyAgICAvL21wel9nY2RleHQgKG1wel90IGcsIG1wel90IHMsIG1wel90IHQsIG1wel90IGEsIG1wel90IGIpOworICAgIG1wel9nY2RleHQgKGcuZF92YWx1ZS5nZXRfbXB6X3QoKSwgcy5kX3ZhbHVlLmdldF9tcHpfdCgpLCB0LmRfdmFsdWUuZ2V0X21wel90KCksIGEuZF92YWx1ZS5nZXRfbXB6X3QoKSwgYi5kX3ZhbHVlLmdldF9tcHpfdCgpKTsKKyAgfQorCisgIC8qKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBtaW5pbXVtIG9mIHR3byBpbnRlZ2Vycy4gKi8KKyAgc3RhdGljIGNvbnN0IEludGVnZXImIG1pbihjb25zdCBJbnRlZ2VyJiBhLCBjb25zdCBJbnRlZ2VyJiBiKXsKKyAgICByZXR1cm4gKGEgPD1iICkgPyBhIDogYjsKKyAgfQorCisgIC8qKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBtYXhpbXVtIG9mIHR3byBpbnRlZ2Vycy4gKi8KKyAgc3RhdGljIGNvbnN0IEludGVnZXImIG1heChjb25zdCBJbnRlZ2VyJiBhLCBjb25zdCBJbnRlZ2VyJiBiKXsKKyAgICByZXR1cm4gKGEgPj0gYiApID8gYSA6IGI7CisgIH0KKworICBmcmllbmQgY2xhc3MgQ1ZDNDo6UmF0aW9uYWw7Cit9Oy8qIGNsYXNzIEludGVnZXIgKi8KKworc3RydWN0IEludGVnZXJIYXNoRnVuY3Rpb24geworICBpbmxpbmUgc2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgQ1ZDNDo6SW50ZWdlciYgaSkgY29uc3QgeworICAgIHJldHVybiBpLmhhc2goKTsKKyAgfQorfTsvKiBzdHJ1Y3QgSW50ZWdlckhhc2hGdW5jdGlvbiAqLworCitpbmxpbmUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEludGVnZXImIG4pIHsKKyAgcmV0dXJuIG9zIDw8IG4udG9TdHJpbmcoKTsKK30KKworfS8qIENWQzQgbmFtZXNwYWNlICovCisKKyNlbmRpZiAvKiBfX0NWQzRfX0lOVEVHRVJfSCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9jdmM0LXBhdGNoL3V0aWwvcmF0aW9uYWxfZ21wX2ltcC5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9jbWFrZS9jdmM0LXBhdGNoL3V0aWwvcmF0aW9uYWxfZ21wX2ltcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZDA2MzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2NtYWtlL2N2YzQtcGF0Y2gvdXRpbC9yYXRpb25hbF9nbXBfaW1wLmgKQEAgLTAsMCArMSwzNTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiEgXGZpbGUgcmF0aW9uYWxfZ21wX2ltcC5oCisgKiogXHZlcmJhdGltCisgKiogT3JpZ2luYWwgYXV0aG9yOiBUaW0gS2luZworICoqIE1ham9yIGNvbnRyaWJ1dG9yczogTW9yZ2FuIERldGVycworICoqIE1pbm9yIGNvbnRyaWJ1dG9ycyAodG8gY3VycmVudCB2ZXJzaW9uKTogRGVqYW4gSm92YW5vdmljCisgKiogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIENWQzQgcHJvamVjdC4KKyAqKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxNCAgTmV3IFlvcmsgVW5pdmVyc2l0eSBhbmQgVGhlIFVuaXZlcnNpdHkgb2YgSW93YQorICoqIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSB0b3AtbGV2ZWwgc291cmNlIGRpcmVjdG9yeSBmb3IgbGljZW5zaW5nCisgKiogaW5mb3JtYXRpb24uXGVuZHZlcmJhdGltCisgKioKKyAqKiBcYnJpZWYgTXVsdGlwcmVjaXNpb24gcmF0aW9uYWwgY29uc3RhbnRzOyB3cmFwcyBhIEdNUCBtdWx0aXByZWNpc2lvbgorICoqIHJhdGlvbmFsLgorICoqCisgKiogTXVsdGlwcmVjaXNpb24gcmF0aW9uYWwgY29uc3RhbnRzOyB3cmFwcyBhIEdNUCBtdWx0aXByZWNpc2lvbiByYXRpb25hbC4KKyAqKi8KKworI2luY2x1ZGUgImN2YzRfcHVibGljLmgiCisKKyNpZm5kZWYgX19DVkM0X19SQVRJT05BTF9ICisjZGVmaW5lIF9fQ1ZDNF9fUkFUSU9OQUxfSAorCisjaW5jbHVkZSA8Z21wLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAidXRpbC9pbnRlZ2VyLmgiCisjaW5jbHVkZSAidXRpbC9leGNlcHRpb24uaCIKKworbmFtZXNwYWNlIENWQzQgeworCitjbGFzcyBDVkM0X1BVQkxJQyBSYXRpb25hbEZyb21Eb3VibGVFeGNlcHRpb24gOiBwdWJsaWMgRXhjZXB0aW9uIHsKK3B1YmxpYzoKKyAgUmF0aW9uYWxGcm9tRG91YmxlRXhjZXB0aW9uKGRvdWJsZSBkKSB0aHJvdygpOworfTsKKworLyoqCisgKiogQSBtdWx0aS1wcmVjaXNpb24gcmF0aW9uYWwgY29uc3RhbnQuCisgKiogVGhpcyBzdG9yZXMgdGhlIHJhdGlvbmFsIGFzIGEgcGFpciBvZiBtdWx0aS1wcmVjaXNpb24gaW50ZWdlcnMsCisgKiogb25lIGZvciB0aGUgbnVtZXJhdG9yIGFuZCBvbmUgZm9yIHRoZSBkZW5vbWluYXRvci4KKyAqKiBUaGUgbnVtYmVyIGlzIGFsd2F5cyBzdG9yZWQgc28gdGhhdCB0aGUgZ2NkIG9mIHRoZSBudW1lcmF0b3IgYW5kIGRlbm9taW5hdG9yCisgKiogaXMgMS4gIChUaGlzIGlzIHJlZmVycmVkIHRvIGFzIHJlZmVycmVkIHRvIGFzIGNhbm9uaWNhbCBmb3JtIGluIEdNUCdzCisgKiogbGl0ZXJhdHVyZS4pIEEgY29uc2VxdWVuY2UgaXMgdGhhdCB0aGF0IHRoZSBudW1lcmF0b3IgYW5kIGRlbm9taW5hdG9yIG1heSBiZQorICoqIGRpZmZlcmVudCB0aGFuIHRoZSB2YWx1ZXMgdXNlZCB0byBjb25zdHJ1Y3QgdGhlIFJhdGlvbmFsLgorICoqCisgKiogTk9URTogVGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSBhIFJhdGlvbmFsIGZyb20gYW4gaW50IGlzIHRvIHVzZSBvbmUgb2YgdGhlCisgKiogaW50IG51bWVyYXRvci9pbnQgZGVub21pbmF0b3IgY29uc3RydWN0b3JzIHdpdGggdGhlIGRlbm9taW5hdG9yIDEuICBUcnlpbmcKKyAqKiB0byBjb25zdHJ1Y3QgYSBSYXRpb25hbCB3aXRoIGEgc2luZ2xlIGludCwgZS5nLiwgUmF0aW9uYWwoMCksIHdpbGwgcHV0IHlvdQorICoqIGluIGRhbmdlciBvZiBpbnZva2luZyB0aGUgY2hhciogY29uc3RydWN0b3IsIGZyb20gd2hlbmNlIHlvdSB3aWxsIHNlZ2ZhdWx0LgorICoqLworCitjbGFzcyBDVkM0X1BVQkxJQyBSYXRpb25hbCB7Citwcml2YXRlOgorICAvKioKKyAgICogU3RvcmVzIHRoZSB2YWx1ZSBvZiB0aGUgcmF0aW9uYWwgaXMgc3RvcmVkIGluIGEgQysrIEdNUCByYXRpb25hbCBjbGFzcy4KKyAgICogVXNpbmcgdGhpcyBpbnN0ZWFkIG9mIG1wcV90IGFsbG93cyBmb3IgZWFzaWVyIGRlc3RydWN0aW9uLgorICAgKi8KKyAgbXBxX2NsYXNzIGRfdmFsdWU7CisKK3B1YmxpYzoKKworICAvKioKKyAgICogQ29uc3RydWN0cyBhIFJhdGlvbmFsIGZyb20gYSBtcHFfY2xhc3Mgb2JqZWN0LgorICAgKiBEb2VzIGEgZGVlcCBjb3B5LgorICAgKiBBc3N1bWVzIHRoYXQgdGhlIHZhbHVlIGlzIGluIGNhbm9uaWNhbCBmb3JtLCBhbmQgdGh1cyBkb2VzIG5vdAorICAgKiBoYXZlIHRvIGNhbGwgY2Fub25pY2FsaXplKCkgb24gdGhlIHZhbHVlLgorICAgKi8KKyAgUmF0aW9uYWwoY29uc3QgbXBxX2NsYXNzJiB2YWwpIDogZF92YWx1ZSh2YWwpIHsgIH0KKworICAvKioKKyAgICogQ3JlYXRlcyBhIHJhdGlvbmFsIGZyb20gYSBkZWNpbWFsIHN0cmluZyAoZS5nLiwgPGNvZGU+IjEuNSI8L2NvZGU+KS4KKyAgICoKKyAgICogQHBhcmFtIGRlYyBhIHN0cmluZyBlbmNvZGluZyBhIGRlY2ltYWwgbnVtYmVyIGluIHRoZSBmb3JtYXQKKyAgICogPGNvZGU+WzAtOV0qXC5bMC05XSo8L2NvZGU+CisgICAqLworICBzdGF0aWMgUmF0aW9uYWwgZnJvbURlY2ltYWwoY29uc3Qgc3RkOjpzdHJpbmcmIGRlYyk7CisKKyAgLyoqIENvbnN0cnVjdHMgYSByYXRpb25hbCB3aXRoIHRoZSB2YWx1ZSAwLzEuICovCisgIFJhdGlvbmFsKCkgOiBkX3ZhbHVlKDApeworICAgIGRfdmFsdWUuY2Fub25pY2FsaXplKCk7CisgIH0KKworICAvKioKKyAgICogQ29uc3RydWN0cyBhIFJhdGlvbmFsIGZyb20gYSBDIHN0cmluZyBpbiBhIGdpdmVuIGJhc2UgKGRlZmF1bHRzIHRvIDEwKS4KKyAgICogVGhyb3dzIHN0ZDo6aW52YWxpZF9hcmd1bWVudCBpZiB0aGUgc3RyaW5nIGlzIG5vdCBhIHZhbGlkIHJhdGlvbmFsLgorICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IGlzIGEgdmFsaWQgcmF0aW9uYWwgc3RyaW5nLAorICAgKiBzZWUgR01QJ3MgZG9jdW1lbnRhdGlvbiBmb3IgbXBxX3NldF9zdHIoKS4KKyAgICovCisgIGV4cGxpY2l0IFJhdGlvbmFsKGNvbnN0IGNoYXIqIHMsIHVuc2lnbmVkIGJhc2UgPSAxMCk6IGRfdmFsdWUocywgYmFzZSkgeworICAgIGRfdmFsdWUuY2Fub25pY2FsaXplKCk7CisgIH0KKyAgUmF0aW9uYWwoY29uc3Qgc3RkOjpzdHJpbmcmIHMsIHVuc2lnbmVkIGJhc2UgPSAxMCkgOiBkX3ZhbHVlKHMsIGJhc2UpIHsKKyAgICBkX3ZhbHVlLmNhbm9uaWNhbGl6ZSgpOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYSBSYXRpb25hbCBmcm9tIGFub3RoZXIgUmF0aW9uYWwsIHEsIGJ5IHBlcmZvcm1pbmcgYSBkZWVwIGNvcHkuCisgICAqLworICBSYXRpb25hbChjb25zdCBSYXRpb25hbCYgcSkgOiBkX3ZhbHVlKHEuZF92YWx1ZSkgeworICAgIGRfdmFsdWUuY2Fub25pY2FsaXplKCk7CisgIH0KKworICAvKioKKyAgICogQ29uc3RydWN0cyBhIGNhbm9uaWNhbCBSYXRpb25hbCBmcm9tIGEgbnVtZXJhdG9yLgorICAgKi8KKyAgUmF0aW9uYWwoc2lnbmVkIGludCBuKSA6IGRfdmFsdWUobiwxKSB7CisgICAgZF92YWx1ZS5jYW5vbmljYWxpemUoKTsKKyAgfQorICBSYXRpb25hbCh1bnNpZ25lZCBpbnQgbikgOiBkX3ZhbHVlKG4sMSkgeworICAgIGRfdmFsdWUuY2Fub25pY2FsaXplKCk7CisgIH0KKyAgUmF0aW9uYWwoc2lnbmVkIGxvbmcgaW50IG4pIDogZF92YWx1ZShuLDEpIHsKKyAgICBkX3ZhbHVlLmNhbm9uaWNhbGl6ZSgpOworICB9CisgIFJhdGlvbmFsKHVuc2lnbmVkIGxvbmcgaW50IG4pIDogZF92YWx1ZShuLDEpIHsKKyAgICBkX3ZhbHVlLmNhbm9uaWNhbGl6ZSgpOworICB9CisKKyNpZmRlZiBDVkM0X05FRURfSU5UNjRfVF9PVkVSTE9BRFMKKyAgUmF0aW9uYWwoaW50NjRfdCBuKSA6IGRfdmFsdWUoc3RhdGljX2Nhc3Q8bG9uZz4obiksIDEpIHsKKyAgICBkX3ZhbHVlLmNhbm9uaWNhbGl6ZSgpOworICB9CisgIFJhdGlvbmFsKHVpbnQ2NF90IG4pIDogZF92YWx1ZShzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihuKSwgMSkgeworICAgIGRfdmFsdWUuY2Fub25pY2FsaXplKCk7CisgIH0KKyNlbmRpZiAvKiBDVkM0X05FRURfSU5UNjRfVF9PVkVSTE9BRFMgKi8KKworICAvKioKKyAgICogQ29uc3RydWN0cyBhIGNhbm9uaWNhbCBSYXRpb25hbCBmcm9tIGEgbnVtZXJhdG9yIGFuZCBkZW5vbWluYXRvci4KKyAgICovCisgIFJhdGlvbmFsKHNpZ25lZCBpbnQgbiwgc2lnbmVkIGludCBkKSA6IGRfdmFsdWUobixkKSB7CisgICAgZF92YWx1ZS5jYW5vbmljYWxpemUoKTsKKyAgfQorICBSYXRpb25hbCh1bnNpZ25lZCBpbnQgbiwgdW5zaWduZWQgaW50IGQpIDogZF92YWx1ZShuLGQpIHsKKyAgICBkX3ZhbHVlLmNhbm9uaWNhbGl6ZSgpOworICB9CisgIFJhdGlvbmFsKHNpZ25lZCBsb25nIGludCBuLCBzaWduZWQgbG9uZyBpbnQgZCkgOiBkX3ZhbHVlKG4sZCkgeworICAgIGRfdmFsdWUuY2Fub25pY2FsaXplKCk7CisgIH0KKyAgUmF0aW9uYWwodW5zaWduZWQgbG9uZyBpbnQgbiwgdW5zaWduZWQgbG9uZyBpbnQgZCkgOiBkX3ZhbHVlKG4sZCkgeworICAgIGRfdmFsdWUuY2Fub25pY2FsaXplKCk7CisgIH0KKworI2lmZGVmIENWQzRfTkVFRF9JTlQ2NF9UX09WRVJMT0FEUworICBSYXRpb25hbChpbnQ2NF90IG4sIGludDY0X3QgZCkgOiBkX3ZhbHVlKHN0YXRpY19jYXN0PGxvbmc+KG4pLCBzdGF0aWNfY2FzdDxsb25nPihkKSkgeworICAgIGRfdmFsdWUuY2Fub25pY2FsaXplKCk7CisgIH0KKyAgUmF0aW9uYWwodWludDY0X3QgbiwgdWludDY0X3QgZCkgOiBkX3ZhbHVlKHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KG4pLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihkKSkgeworICAgIGRfdmFsdWUuY2Fub25pY2FsaXplKCk7CisgIH0KKyNlbmRpZiAvKiBDVkM0X05FRURfSU5UNjRfVF9PVkVSTE9BRFMgKi8KKworICBSYXRpb25hbChjb25zdCBJbnRlZ2VyJiBuLCBjb25zdCBJbnRlZ2VyJiBkKSA6CisgICAgZF92YWx1ZShuLmdldF9tcHooKSwgZC5nZXRfbXB6KCkpCisgIHsKKyAgICBkX3ZhbHVlLmNhbm9uaWNhbGl6ZSgpOworICB9CisgIFJhdGlvbmFsKGNvbnN0IEludGVnZXImIG4pIDoKKyAgICBkX3ZhbHVlKG4uZ2V0X21weigpKQorICB7CisgICAgZF92YWx1ZS5jYW5vbmljYWxpemUoKTsKKyAgfQorICB+UmF0aW9uYWwoKSB7fQorCisgIC8qKgorICAgKiBHZXRzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbXAgZGF0YSB0aGF0IGJhY2tzIHVwIHRoZSByYXRpb25hbC4KKyAgICogT25seSBhY2Nlc3NpYmxlIHRvIGZyaWVuZCBjbGFzc2VzLgorICAgKi8KKyAgY29uc3QgbXBxX2NsYXNzJiBnZXRfbXBxKCkgY29uc3QgeyByZXR1cm4gZF92YWx1ZTsgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBudW1lcmF0b3Igb2YgdGhlIFJhdGlvbmFsLgorICAgKiBOb3RlIHRoYXQgdGhpcyBtYWtlcyBhIGRlZXAgY29weSBvZiB0aGUgbnVtZXJhdG9yLgorICAgKi8KKyAgSW50ZWdlciBnZXROdW1lcmF0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIEludGVnZXIoZF92YWx1ZS5nZXRfbnVtKCkpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIGRlbm9taW5hdG9yIG9mIHRoZSBSYXRpb25hbC4KKyAgICogTm90ZSB0aGF0IHRoaXMgbWFrZXMgYSBkZWVwIGNvcHkgb2YgdGhlIGRlbm9taW5hdG9yLgorICAgKi8KKyAgSW50ZWdlciBnZXREZW5vbWluYXRvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gSW50ZWdlcihkX3ZhbHVlLmdldF9kZW4oKSk7CisgIH0KKworICBzdGF0aWMgUmF0aW9uYWwgZnJvbURvdWJsZShkb3VibGUgZCkgdGhyb3coUmF0aW9uYWxGcm9tRG91YmxlRXhjZXB0aW9uKTsKKworICAvKioKKyAgICogR2V0IGEgZG91YmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgUmF0aW9uYWwsIHdoaWNoIGlzCisgICAqIGFwcHJveGltYXRlOiB0cnVuY2F0aW9uIG1heSBvY2N1ciwgb3ZlcmZsb3cgbWF5IHJlc3VsdCBpbgorICAgKiBpbmZpbml0eSwgYW5kIHVuZGVyZmxvdyBtYXkgcmVzdWx0IGluIHplcm8uCisgICAqLworICBkb3VibGUgZ2V0RG91YmxlKCkgY29uc3QgeworICAgIHJldHVybiBkX3ZhbHVlLmdldF9kKCk7CisgIH0KKworICBSYXRpb25hbCBpbnZlcnNlKCkgY29uc3QgeworICAgIHJldHVybiBSYXRpb25hbChnZXREZW5vbWluYXRvcigpLCBnZXROdW1lcmF0b3IoKSk7CisgIH0KKworICBpbnQgY21wKGNvbnN0IFJhdGlvbmFsJiB4KSBjb25zdCB7CisgICAgLy9Eb24ndCB1c2UgbXBxX2NsYXNzJ3MgY21wKCkgZnVuY3Rpb24uCisgICAgLy9UaGUgbmFtZSBlbmRzIHVwIGNvbmZsaWN0aW5nIHdpdGggdGhpcyBmdW5jdGlvbi4KKyAgICByZXR1cm4gbXBxX2NtcChkX3ZhbHVlLmdldF9tcHFfdCgpLCB4LmRfdmFsdWUuZ2V0X21wcV90KCkpOworICB9CisKKyAgaW50IHNnbigpIGNvbnN0IHsKKyAgICByZXR1cm4gbXBxX3NnbihkX3ZhbHVlLmdldF9tcHFfdCgpKTsKKyAgfQorCisgIGJvb2wgaXNaZXJvKCkgY29uc3QgeworICAgIHJldHVybiBzZ24oKSA9PSAwOworICB9CisKKyAgYm9vbCBpc09uZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbXBxX2NtcF9zaShkX3ZhbHVlLmdldF9tcHFfdCgpLCAxLCAxKSA9PSAwOworICB9CisKKyAgYm9vbCBpc05lZ2F0aXZlT25lKCkgY29uc3QgeworICAgIHJldHVybiBtcHFfY21wX3NpKGRfdmFsdWUuZ2V0X21wcV90KCksIC0xLCAxKSA9PSAwOworICB9CisKKyAgUmF0aW9uYWwgYWJzKCkgY29uc3QgeworICAgIGlmKHNnbigpIDwgMCl7CisgICAgICByZXR1cm4gLSgqdGhpcyk7CisgICAgfWVsc2V7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICB9CisKKyAgSW50ZWdlciBmbG9vcigpIGNvbnN0IHsKKyAgICBtcHpfY2xhc3MgcTsKKyAgICBtcHpfZmRpdl9xKHEuZ2V0X21wel90KCksIGRfdmFsdWUuZ2V0X251bV9tcHpfdCgpLCBkX3ZhbHVlLmdldF9kZW5fbXB6X3QoKSk7CisgICAgcmV0dXJuIEludGVnZXIocSk7CisgIH0KKworICBJbnRlZ2VyIGNlaWxpbmcoKSBjb25zdCB7CisgICAgbXB6X2NsYXNzIHE7CisgICAgbXB6X2NkaXZfcShxLmdldF9tcHpfdCgpLCBkX3ZhbHVlLmdldF9udW1fbXB6X3QoKSwgZF92YWx1ZS5nZXRfZGVuX21wel90KCkpOworICAgIHJldHVybiBJbnRlZ2VyKHEpOworICB9CisKKyAgUmF0aW9uYWwgZmxvb3JfZnJhYygpIGNvbnN0IHsKKyAgICByZXR1cm4gKCp0aGlzKSAtIFJhdGlvbmFsKGZsb29yKCkpOworICB9CisKKyAgUmF0aW9uYWwmIG9wZXJhdG9yPShjb25zdCBSYXRpb25hbCYgeCl7CisgICAgaWYodGhpcyA9PSAmeCkgcmV0dXJuICp0aGlzOworICAgIGRfdmFsdWUgPSB4LmRfdmFsdWU7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgUmF0aW9uYWwgb3BlcmF0b3ItKCkgY29uc3R7CisgICAgcmV0dXJuIFJhdGlvbmFsKC0oZF92YWx1ZSkpOworICB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFJhdGlvbmFsJiB5KSBjb25zdCB7CisgICAgcmV0dXJuIGRfdmFsdWUgPT0geS5kX3ZhbHVlOworICB9CisKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFJhdGlvbmFsJiB5KSBjb25zdCB7CisgICAgcmV0dXJuIGRfdmFsdWUgIT0geS5kX3ZhbHVlOworICB9CisKKyAgYm9vbCBvcGVyYXRvcjwgKGNvbnN0IFJhdGlvbmFsJiB5KSBjb25zdCB7CisgICAgcmV0dXJuIGRfdmFsdWUgPCB5LmRfdmFsdWU7CisgIH0KKworICBib29sIG9wZXJhdG9yPD0oY29uc3QgUmF0aW9uYWwmIHkpIGNvbnN0IHsKKyAgICByZXR1cm4gZF92YWx1ZSA8PSB5LmRfdmFsdWU7CisgIH0KKworICBib29sIG9wZXJhdG9yPiAoY29uc3QgUmF0aW9uYWwmIHkpIGNvbnN0IHsKKyAgICByZXR1cm4gZF92YWx1ZSA+IHkuZF92YWx1ZTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I+PShjb25zdCBSYXRpb25hbCYgeSkgY29uc3QgeworICAgIHJldHVybiBkX3ZhbHVlID49IHkuZF92YWx1ZTsKKyAgfQorCisgIFJhdGlvbmFsIG9wZXJhdG9yKyhjb25zdCBSYXRpb25hbCYgeSkgY29uc3R7CisgICAgcmV0dXJuIFJhdGlvbmFsKCBkX3ZhbHVlICsgeS5kX3ZhbHVlICk7CisgIH0KKyAgUmF0aW9uYWwgb3BlcmF0b3ItKGNvbnN0IFJhdGlvbmFsJiB5KSBjb25zdCB7CisgICAgcmV0dXJuIFJhdGlvbmFsKCBkX3ZhbHVlIC0geS5kX3ZhbHVlICk7CisgIH0KKworICBSYXRpb25hbCBvcGVyYXRvciooY29uc3QgUmF0aW9uYWwmIHkpIGNvbnN0IHsKKyAgICByZXR1cm4gUmF0aW9uYWwoIGRfdmFsdWUgKiB5LmRfdmFsdWUgKTsKKyAgfQorICBSYXRpb25hbCBvcGVyYXRvci8oY29uc3QgUmF0aW9uYWwmIHkpIGNvbnN0IHsKKyAgICByZXR1cm4gUmF0aW9uYWwoIGRfdmFsdWUgLyB5LmRfdmFsdWUgKTsKKyAgfQorCisgIFJhdGlvbmFsJiBvcGVyYXRvcis9KGNvbnN0IFJhdGlvbmFsJiB5KXsKKyAgICBkX3ZhbHVlICs9IHkuZF92YWx1ZTsKKyAgICByZXR1cm4gKCp0aGlzKTsKKyAgfQorICBSYXRpb25hbCYgb3BlcmF0b3ItPShjb25zdCBSYXRpb25hbCYgeSl7CisgICAgZF92YWx1ZSAtPSB5LmRfdmFsdWU7CisgICAgcmV0dXJuICgqdGhpcyk7CisgIH0KKworICBSYXRpb25hbCYgb3BlcmF0b3IqPShjb25zdCBSYXRpb25hbCYgeSl7CisgICAgZF92YWx1ZSAqPSB5LmRfdmFsdWU7CisgICAgcmV0dXJuICgqdGhpcyk7CisgIH0KKworICBSYXRpb25hbCYgb3BlcmF0b3IvPShjb25zdCBSYXRpb25hbCYgeSl7CisgICAgZF92YWx1ZSAvPSB5LmRfdmFsdWU7CisgICAgcmV0dXJuICgqdGhpcyk7CisgIH0KKworICBib29sIGlzSW50ZWdyYWwoKSBjb25zdHsKKyAgICByZXR1cm4gZ2V0RGVub21pbmF0b3IoKSA9PSAxOworICB9CisKKyAgLyoqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSByYXRpb25hbCBpbiB0aGUgZ2l2ZW4gYmFzZS4gKi8KKyAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoaW50IGJhc2UgPSAxMCkgY29uc3QgeworICAgIHJldHVybiBkX3ZhbHVlLmdldF9zdHIoYmFzZSk7CisgIH0KKworICAvKioKKyAgICogQ29tcHV0ZXMgdGhlIGhhc2ggb2YgdGhlIHJhdGlvbmFsIGZyb20gaGFzaGVzIG9mIHRoZSBudW1lcmF0b3IgYW5kIHRoZQorICAgKiBkZW5vbWluYXRvci4KKyAgICovCisgIHNpemVfdCBoYXNoKCkgY29uc3QgeworICAgIHNpemVfdCBudW1lcmF0b3JIYXNoID0gZ21wel9oYXNoKGRfdmFsdWUuZ2V0X251bV9tcHpfdCgpKTsKKyAgICBzaXplX3QgZGVub21pbmF0b3JIYXNoID0gZ21wel9oYXNoKGRfdmFsdWUuZ2V0X2Rlbl9tcHpfdCgpKTsKKworICAgIHJldHVybiBudW1lcmF0b3JIYXNoIHhvciBkZW5vbWluYXRvckhhc2g7CisgIH0KKworICB1aW50MzJfdCBjb21wbGV4aXR5KCkgY29uc3QgeworICAgIHVpbnQzMl90IG51bUxlbiA9IGdldE51bWVyYXRvcigpLmxlbmd0aCgpOworICAgIHVpbnQzMl90IGRlbkxlbiA9IGdldERlbm9taW5hdG9yKCkubGVuZ3RoKCk7CisgICAgcmV0dXJuICBudW1MZW4gKyBkZW5MZW47CisgIH0KKworICAvKiogRXF1aXZhbGVudCB0byBjYWxsaW5nICh0aGlzLT5hYnMoKSkuY21wKGIuYWJzKCkpICovCisgIGludCBhYnNDbXAoY29uc3QgUmF0aW9uYWwmIHEpIGNvbnN0OworCit9Oy8qIGNsYXNzIFJhdGlvbmFsICovCisKK3N0cnVjdCBSYXRpb25hbEhhc2hGdW5jdGlvbiB7CisgIGlubGluZSBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBDVkM0OjpSYXRpb25hbCYgcikgY29uc3QgeworICAgIHJldHVybiByLmhhc2goKTsKKyAgfQorfTsvKiBzdHJ1Y3QgUmF0aW9uYWxIYXNoRnVuY3Rpb24gKi8KKworQ1ZDNF9QVUJMSUMgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IFJhdGlvbmFsJiBuKTsKKworfS8qIENWQzQgbmFtZXNwYWNlICovCisKKyNlbmRpZiAvKiBfX0NWQzRfX1JBVElPTkFMX0ggKi8KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9mdGVzdHMvQ01ha2VMaXN0cy50eHQgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L2Z0ZXN0cy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Yjg3YWJhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9mdGVzdHMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwyNyBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKyMgICAgICAgICAgICAgICAgICAgICAgQ01ha2UgZmlsZSBmb3IgZnVuY3Rpb25hbCB0ZXN0aW5nIA0KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisNCisNCisjIE1pbmltdW0gcmVxdWlyZWQgQ01ha2UgdmVyc2lvbg0KK2NtYWtlX21pbmltdW1fcmVxdWlyZWQgKFZFUlNJT04gMi44IEZBVEFMX0VSUk9SKQ0KKw0KKw0KKyMgVGVsbCBjbWFrZSB3aGVyZSB0byBmaW5kIGl0cyBvd24gbW9kdWxlcw0KK2xpc3QgKEFQUEVORCBDTUFLRV9NT0RVTEVfUEFUSCAke0NNQUtFX1NPVVJDRV9ESVJ9Ly4uL2NtYWtlKQ0KK2xpc3QgKEFQUEVORCBDTUFLRV9NT0RVTEVfUEFUSCAke0NNQUtFX1NPVVJDRV9ESVJ9L2NtYWtlKQ0KKw0KKyMgUHJpbnQgdGl0bGUgYmFubmVyDQorc2V0IChCQU5ORVJfTUVTU0FHRSAiVGhpcyBpcyBTeW1iZXggRnVuY3Rpb25hbCBUZXN0IikNCitpbmNsdWRlIChQcmludEJhbm5lcikNCisNCisNCisjIFVOREVSIFBST0dSRVNTDQorDQorYWRkX2V4ZWN1dGFibGUobHMgSU1QT1JURUQpDQorc2V0X3Byb3BlcnR5IChUQVJHRVQgbHMgICAgIFBST1BFUlRZIElNUE9SVEVEX0xPQ0FUSU9OIC91c3IvYmluL2xzKQ0KKw0KKw0KKw0KKyMgRGVmaW5lIHRlc3RzDQorYWRkX3Rlc3QgKE5BTUUgbHMgQ09NTUFORCBjOi9tc3lzNjQvdXNyL2Jpbi9scykgIyBEdW1teSB0ZXN0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9mdGVzdHMvQ1Rlc3RUZXN0ZmlsZS5jbWFrZSBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvZnRlc3RzL0NUZXN0VGVzdGZpbGUuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFjODYyMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvZnRlc3RzL0NUZXN0VGVzdGZpbGUuY21ha2UKQEAgLTAsMCArMSwyIEBACisjIERlZmluZSB0ZXN0cw0KK2FkZF90ZXN0IChOQU1FIGxzIENPTU1BTkQgYzovbXN5czY0L3Vzci9iaW4vbHMpICMgRHVtbXkgdGVzdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvZnRlc3RzL2NtYWtlL0RlZmluZVN5bWJleEZ1bmNUZXN0UHJvamVjdC5jbWFrZSBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvZnRlc3RzL2NtYWtlL0RlZmluZVN5bWJleEZ1bmNUZXN0UHJvamVjdC5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmJjZWM1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9mdGVzdHMvY21ha2UvRGVmaW5lU3ltYmV4RnVuY1Rlc3RQcm9qZWN0LmNtYWtlCkBAIC0wLDAgKzEsMiBAQAorYWRkX3N1YmRpcmVjdG9yeSAoYmFzZSkNCithZGRfc3ViZGlyZWN0b3J5IChmbWwpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9yZXNvdXJjZXMvZG9jL0JVSUxEX1dJVEhfQ01BS0UubWQgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3Jlc291cmNlcy9kb2MvQlVJTERfV0lUSF9DTUFLRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjY4NzJiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9yZXNvdXJjZXMvZG9jL0JVSUxEX1dJVEhfQ01BS0UubWQKQEAgLTAsMCArMSw5MiBAQAorIyBTeW1iZXggQnVpbGQgd2l0aCBDTWFrZQ0KKw0KKyMjIEVudmlyb25tZW50IGluc3RhbGxhdGlvbg0KK1N5bWJleCBjYW4gYmUgYnVpbGQgd2l0aCBDTWFrZSBvbiBMaW51eCBVYnVudHUgb3IgV2luZG93cyBNU1lTMiBzeXN0ZW1zDQorRm9sbG93IHN0ZXBzIGRlc2NyaWJlZCBpbiBgSU5TVEFMTF9NU1lTMi5tZCBgIG9yICBgSU5TVEFMTF9MSU5VWC5tZCBgIHRvIGluc3RhbGwgdGhlIHJlcXVpcmVkIGVudmlyb25tZW50Lg0KKw0KKyMjIENNYWtlIEZ1bmRhbWVudGFscw0KK0NNYWtlIGlzIGFuIG9wZW4tc291cmNlLCBjcm9zcy1wbGF0Zm9ybSBmYW1pbHkgb2YgdG9vbHMgZGVzaWduZWQgdG8gYnVpbGQsIHRlc3QgYW5kIHBhY2thZ2Ugc29mdHdhcmUuIENNYWtlIGlzIHVzZWQgdG8gY29udHJvbCB0aGUgc29mdHdhcmUgY29tcGlsYXRpb24gcHJvY2VzcyB1c2luZyBzaW1wbGUgcGxhdGZvcm0gYW5kIGNvbXBpbGVyIGluZGVwZW5kZW50IGNvbmZpZ3VyYXRpb24gZmlsZXMsIGFuZCBnZW5lcmF0ZSBuYXRpdmUgbWFrZWZpbGVzIGFuZCB3b3Jrc3BhY2VzIHRoYXQgY2FuIGJlIHVzZWQgaW4gdGhlIGNvbXBpbGVyIGVudmlyb25tZW50IG9mIHlvdXIgY2hvaWNlLiANCisNCitDTWFrZSBob2xkcyB0aGUgYnVpbGQgcnVsZXMgaW4gY29uZmlndXJhdGlvbiBmaWxlcyAoYGBzcmMvQ01ha2VMaXN0cy50eHRgYCwgYGBzcmMvKi9DTWFrZUxpc3RzLnR4dGBgIGFuZCBgYHNyYy9jbWFrZS8qLmNtYWtlYGApIHdyaXR0ZW4gaW4gYSBkZWRpY2F0ZWQgW3BsYXRmb3JtIGluZGVwZW5kZW50IGxhbmd1YWdlXShodHRwczovL2NtYWtlLm9yZy9jbWFrZS9oZWxwL3YzLjYvbWFudWFsL2NtYWtlLWxhbmd1YWdlLjcuaHRtbCkuDQorDQorQmFzaWNhbGx5LCBbYnVpbGRpbmcgd2l0aCBDTWFrZV0oaHR0cHM6Ly9jbWFrZS5vcmcvY21ha2UvaGVscC92My42L21hbnVhbC9jbWFrZS1idWlsZHN5c3RlbS43Lmh0bWwpIGZvbGxvd3MgdGhpcyBwcm9jZWR1cmUgOiANCisxLiBUaGUgdXNlciBjaG9vc2VzIGEgW1Rvb2xjaGFpbl0oaHR0cHM6Ly9jbWFrZS5vcmcvY21ha2UvaGVscC92My42L21hbnVhbC9jbWFrZS10b29sY2hhaW5zLjcuaHRtbCkgKGEgc2V0IG9mIGNvbXBpbGVyLCBsaW5rZXIgYW5kIGFzc29jaWF0ZWQgbGlicmFyaWVzKSBhbmQgYSBbR2VuZXJhdG9yXShodHRwczovL2NtYWtlLm9yZy9jbWFrZS9oZWxwL3YzLjYvbWFudWFsL2NtYWtlLWdlbmVyYXRvcnMuNy5odG1sKSAoYSBwbGF0Zm9ybSBkZXBlbmRlbnQgYnVpbGQgc3lzdGVtIHN1Y2ggYXMgTWFrZSwgVmlzdWFsIFN0dWRpbywgZXRjLikuIE9mIGNvdXJzZSwgdGhlc2UgbXVzdCBiZSBhdmFpbGFibGUgb24gdGhlIGN1cnJlbnQgcGxhdGZvcm0uDQorMi4gQ29uZmlndXJhdGlvbi4gQ01ha2UgYW5hbHlzZXMgdGhlIGN1cnJlbnQgcGxhdGZvcm0sIHRvb2xjaGFpbiBhbmQgZ2VuZXJhdG9yIGFuZCBwdXQgdGhlIHJlbGV2YW50IGluZm9ybWF0aW9uIGluIGEgY2FjaGUgZmlsZSAoQ01ha2VDYWNoZS50eHQpLg0KKzMuIEdlbmVyYXRpb24uIENNYWtlIGNyZWF0ZXMgYWxsIHRoZSBmaWxlcyBuZWVkZWQgYnkgdGhlIGNob3NlbiBnZW5lcmF0b3IuDQorNC4gQnVpbGQuIFRoZSBnZW5lcmF0b3IgZXhlY3V0ZXMgdGhlIGJ1aWxkIHdpdGhvdXQga25vd2luZyBhbnl0aGluZyBhYm91dCBDTWFrZS4NCisNCitJZiBvbmUgb3Igc2V2ZXJhbCBzb3VyY2VzIGZpbGUgYXJlIG1vZGlmaWVkLCBpdCBpcyBvbmx5IHJlcXVpcmVkIHRvIHJlZG8gdGhlIGJ1aWxkIHN0ZXAuIElmIGNvbXBpbGUgb3B0aW9ucyBvciBwcmVyZXF1aXNpdGVzIGFyZSBtb2RpZmllZCwgdGhlIHdob2xlIHByb2NlZHVyZSBtdXN0IGJlIGRvbmUgYWdhaW4gZnJvbSB0aGUgYmVnaW5uaW5nLg0KKw0KK0NNYWtlIGNhbiBsYXVuY2hlZCB0aHJvdWdoIGEgW0dVSV0oaHR0cHM6Ly9jbWFrZS5vcmcvY21ha2UvaGVscC92My42L21hbnVhbC9jbWFrZS1ndWkuMS5odG1sKSBvciBhIFtjb21tYW5kIGxpbmVdKGh0dHBzOi8vY21ha2Uub3JnL2NtYWtlL2hlbHAvdjMuNi9tYW51YWwvY21ha2UuMS5odG1sKS4NCisNCisjIyBTdGFuZGFyZCBCdWlsZCBQcm9jZWR1cmUNCisNCisjIyMgQnVpbGQgb24gV2luZG93cyBNU1lTMg0KKw0KKyMjIyMgQnlwYXNzIG9mIGEgQ1ZDNCBjb25maWd1cmUgYW5vbWFseSANCitBZnRlciBib29zdCBpcyBpbnN0YWxsZWQsIGNvcHkgdGhlIGJvb3N0IGRlZmF1bHQgaW5zdGFsbGF0aW9uIHRvIGEgZGlyZWN0b3J5IHdoZXJlIENWQzQgY29uZmlndXJlIHdpbGwgYmUgYWJsZSB0byBmaW5kIGl0IDogIA0KK2BgY3AgLVIgL21pbmd3NjQgL21pbmd3NjQyYGANCisNCisjIyMjIEJ1aWxkIFByb2NlZHVyZQ0KKw0KKzEuIE9wZW4gYSBNU1lTMi1NSU5HVzY0IHNoZWxsIGNvbnNvbGUuIE1ha2Ugc3VyZSBNSU5HVzY0IGFwcGVhcnMgaW4gdGhlIHByb21wdC4NCisyLiBDbG9uZSB0aGUgU3ltYmV4IHNvdXJjZXMgcmVwb3NpdG9yeSB1c2luZyBFY2xpcHNlIEdpdCBvciB0aGUgY29tbWFuZCBsaW5lIGBgZ2l0IGNsb25lIHNzaDovL2dpdG9saXRlQDEzMi4xNjYuMTM1LjIxMi9kaXZlcnNpdHkvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC5naXRgYC4gTWFrZSBzdXJlIHlvdXIgU1NIIGtleXMgZXhpc3RzIGFuZCBhcmUgcHJvcGVybHkgZGVjbGFyZWQgdG8gR2l0Lg0KKzMuIExhdW5jaCBgYGNtYWtlLWd1aSAmYGAgYW5kIGZpbGwgdGhlIHR3byB0b3AgZmllbGRzIHdpdGggdGhlIHBhdGggdG8gdGhlIHdvcmtzcGFjZSBzb3VyY2VzIGRpcmVjdG9yeSAoaXQgc2hvdWxkIGJlIGBgc3JjYGApIGFuZCB0aGUgZGlyZWN0b3J5IHdoZXJlIHlvdSB3YW50IHRvIGJ1aWxkIChpdCBpcyBiZXR0ZXIgdG8gY2hvb3NlIG9uZSBvdXRzaWRlIHRoZSB3b3Jrc3BhY2UpLiANCis0LiBQcmVzcyBfQ29uZmlndXJlXy4gSW4gdGhlIG9wZW5pbmcgZGlhbG9nIGNob29zZSB0aGUgX01TWVMgTWFrZWZpbGVfIGdlbmVyYXRvci4gRG9uJ3QgY2hhbmdlIHRoZSBkZWZhdWx0IGNoZWNrZWQgb3B0aW9uIF9Vc2UgRGVmYXVsdCBOYXRpdmUgQ29tcGlsZXJfIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBkby4gUHJlc3MgX0ZpbmlzaF8gdG8gbGF1bmNoIHRoZSBjb25maWd1cmUgc3RlcC4gQ01ha2UgbG9ncyB3aGF0IGl0IGlzIGRvaW5nIGluIHRoZSBib3R0b20gbWVzc2FnZSBjb25zb2xlLiBQYXkgYXR0ZW50aW9uIHRvIG1lc3NhZ2VzIGluIHJlZCBpZiBhbnkuIER1cmluZyB0aGUgdmVyeSBmaXJzdCBidWlsZCwgc29tZSBwcmVyZXF1aXNpdGVzIGFyZSBub3QgZm91bmQgYW5kIENNYWtlIHNheXMgaXQgd2lsbCBidWlsZCB0aGVtIGxhdGVyLiBBdCB0aGUgZW5kIG9mIHRoZSBjb25maWd1cmUgc3RlcCwgdGhlIGNhY2hlIGNvbnNvbGUgc2hvd3MgdGhlIHJlc3VsdGluZyBDTWFrZSB2YXJpYWJsZXMgYW5kIHRoZWlycyB2YWx1ZXMuICh0aGlzIGlzIG5vdGhpbmcgbW9yZSB0aGFuIGEgcHJldHR5IGRpc3BsYXkgb2YgdGhlIGNhY2hlIGZpbGUpLiANCis1LiBQcmVzcyBfR2VuZXJhdGVfIGFuZCB3YWl0IGZvciB0aGUgbWVzc2FnZSBfR2VuZXJhdGluZyBkb25lXyB0byBhcHBlYXIuIE1ha2VmaWxlcyBoYXZlIGJlZW4gY3JlYXRlZCBpbiB0aGUgYnVpbGQgZGlyZWN0b3J5Lg0KKzYuIEluIHRoZSBzaGVsbCBjb25zb2xlLCBnbyB0byB0aGUgYnVpbGQgZGlyZWN0b3J5IGFuZCBsYXVuY2ggdGhlIGJ1aWxkIHdpdGggYGBtYWtlYGAuIE9uIG11bHRpY29yZSBwbGF0Zm9ybSB5b3UgY2FuIGxhdW5jaCBwYXJhbGxlbCBidWlsZCB3aXRoIGBgbWFrZSAtalhgYCB3aGVyZSBYIGlzIHNsaWdodGx5IGluZmVyaW9yIHRvIHRoZSBudW1iZXIgb2YgY29yZXMuIFRoZSBjdXJyZW50IHBsYXRmb3JtIGNvcmUgbnVtYmVyIGlzIGRpc3BsYXllZCBpbiB0aGUgQ01ha2UgbWVzc2FnZSBjb25zb2xlLiBCdWlsZCB2ZXJib3NpdHkgY2FuIGJlIGluY3JlYXNlZCB3aXRoIGBgbWFrZSBWRVJCT1NFPTFgYC4gSWYgaXQgaXMgdGhlIHZlcnkgZmlyc3QgYnVpbGQsIENNYWtlIHdpbGwgdHJ5IHRvIGRvd25sb2FkLCBidWlsZCBhbmQgaW5zdGFsbCB0aGUgbWlzc2luZyBwcmVyZXF1aXNpdGVzIChsb25nZXIgYnVpbGQpLg0KKzcuIEEgdGhlIGVuZCBvZiB0aGUgcHJvY2VzcywgdGhlIGBgc3ltYmV4LmV4ZWBgIGV4ZWN1dGFibGUgaXMgYnVpbHQgYW5kIGNhbiBiZSBjaGVja2VkIHVzaW5nIGBgLi9zeW1iZXggLXRlc3RgYC4NCisNCisjIyMgQnVpbGQgb24gTGludXggVWJ1bnR1DQorDQorIyMjIyBCdWlsZCBQcm9jZWR1cmUNCisxLiBPcGVuIGEgc2hlbGwgY29uc29sZS4gDQorDQorRm9sbG93IHN0ZXBzIDIgdG8gNyBvZiBCdWlsZCBvbiBXaW5kb3dzIE1TWVMyIHByb2NlZHVyZS4NCitEdXJpbmcgc3RlcCA0LCBjaG9vc2UgdGhlIF9Vbml4IE1ha2VmaWxlc18gZ2VuZXJhdG9yDQorRHVyaW5nIHN0ZXAgNiwgaWYgaXQgaXMgdGhlIHZlcnkgZmlyc3QgYnVpbGQsIENtYWtlIHdpbGwgaW5zdGFsbCB0aGUgbWlzc2luZyBwcmVyZXF1aXNpdGVzLCBidXQgd2lsbCBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIGRlZmF1bHQgZm9sZGVycy4gRWl0aGVyIHRyeSBgYHN1ZG8gbWFrZWBgIG9yIGluc3RhbGwgaW4gb3RoZXIgZm9sZGVycy4gSXQgaXMgcG9zc2libGUgdG8gY29uZmlndXJlIGluc3RhbGxhdGlvbiBpbiBvdGhlciBmb2xkZXJzIGluIFNwZWNpZmljT3B0aW9ucy1MaW51eE5BdGl2ZS5jbWFrZQ0KKw0KKyMjIEtub3duIFByb2JsZW1zDQorDQorKiAqKlByb2JsZW0gOiBDb25maWd1cmUgc3RlcCBmYWlsZWQgYXQgdGhlIGJhc2ljIGNvbXBpbGF0aW9uIGNoZWNrIG1hZGUgYnkgQ01ha2UqKiAgDQorVXN1YWxseSB0aGlzIHByb2JsZW0gYXJpc2VzIHdoZW4gY2FjaGUgaXMgZGVsZXRlZC4gU29sdXRpb24gOiBKdXN0IGtpbGwgY21ha2UtZ3VpIGFuZCByZWxhdW5jaC4NCisNCisNCisjIyBDaGFuZ2luZyBCdWlsZCBPcHRpb25zDQorDQorKiAqKk9wdGlvbnMgdGhhdCBhZmZlY3QgdGhlIHdob2xlIHByb2plY3Qgb24gZXZlcnkgcGxhdGZvcm0qKg0KK0VkaXQgYGBHZW5lcmljT3B0aW9ucy5jbWFrZWBgIGFuZCBtb2RpZnkgYGBhZGRfZGVmaW5pdGlvbnMoKWBgIGFuZCBgYGFkZF9vcHRpb25zKClgYCBjb21tYW5kcyBhY2NvcmRpbmcgdG8geW91ciB3aXNoLiBQYXkgYXR0ZW50aW9uIHRvIG9ubHkgcHV0IHBsYXRmb3JtIGluZGVwZW5kZW50IG9wdGlvbnMgaGVyZS4gIEV4ZW1wbGUgOiBgYC1nYGAsIGBgLU8zYGAsIGBgLURfQVZNX0JVSUxUSU5fTlVNRVJJQ19HTVBfICBgYA0KKw0KKyogKipPcHRpb25zIHRoYXQgYWZmZWN0IHRoZSB3aG9sZSBwcm9qZWN0IG9uIGEgc3BlY2lmaWMgcGxhdGZvcm0qKg0KK0VkaXQgYGBTcGVjaWZpY09wdGlvbnMtPHBsYXRmb3JtPi5jbWFrZWBgIGFuZCBtb2RpZnkgYGBhZGRfZGVmaW5pdGlvbnMoKWBgIGFuZCBgYGFkZF9vcHRpb25zKClgYCBjb21tYW5kcyBhY2NvcmRpbmcgdG8geW91ciB3aXNoLiAgDQorRXhlbXBsZSA6IGBgLURfX0FWTV9NSU5HV19fYGANCisNCisqICoqT3B0aW9ucyB0aGF0IGFmZmVjdCBhIHNwZWNpZmljIGludGVybmFsIGxpYnJhcnkgb24gZXZlcnkgcGxhdGZvcm0qKg0KK0VkaXQgdGhlIGBgQ01ha2VMaXN0cy50eHRgYCBmaWxlIG9mIHRoaXMgbGlicmFyeSBhbmQgbW9kaWZ5IChvciBhZGQpIHRoZSBgYGFkZF9kZWZpbml0aW9ucygpYGAgYW5kIGBgYWRkX29wdGlvbnMoKWBgIGNvbW1hbmRzIGFjY29yZGluZyB0byB5b3VyIHdpc2guICANCisNCisqKk5vdGUgOiBObyBtZWNoYW5pc20gaXMgcHJvdmlkZWQgdG8gc2V0IGFuIG9wdGlvbiB0aGF0IGlzIHNwZWNpZmljIHRvIG9ubHkgb25lIGludGVybmFsIGxpYnJhcnkgYW5kIG9ubHkgb25lIHBsYXRmb3JtLioqICANCisNCisNCisjIyBBZHZhbmNlZCBDTWFrZSAoZm9yIERldmVsb3BlcnMpDQorKiAqKkhvdyB0byBhZGQgYSBuZXcgc291cmNlIGZpbGUgPyoqICAgIA0KK0NNYWtlIHdpbGwgYXV0b21hdGljYWxseSBkZXRlY3QgdGhlIGZpbGUgYXMgbG9uZyBhcyBpdCBpcyBsb2NhdGVkIGluIHRoZSBkaXJlY3RvcnkgaGllcmFyY2h5IG9mIGFuIGV4aXN0aW5nIGludGVybmFsIGxpYnJhcnkgYW5kIGhhdmUgYSBrbm93biBzdWZmaXggKGBgLmgsIC5jcHAsIC5jYGApLiANCisNCisqICoqSG93IHRvIGFkZCBhIG5ldyBzb3VyY2VzIGRpcmVjdG9yeSB3aXRob3V0IGRlZmluaW5nIGEgbmV3IGludGVybmFsIGxpYnJhcnkqKiAgDQorQ01ha2Ugd2lsbCBhdXRvbWF0aWNhbGx5IGRldGVjdCB0aGUgZGlyZWN0b3J5IGFuZCBmaWxlcyBpdCBjb250YWlucyBhcyBsb25nIGFzIGl0IGlzIGxvY2F0ZWQgaW4gdGhlIGRpcmVjdG9yeSBoaWVyYXJjaHkgb2YgYW4gZXhpc3RpbmcgaW50ZXJuYWwgbGlicmFyeS4gIA0KKw0KKyogKipIb3cgdG8gYWRkIGEgbmV3IGludGVybmFsIGxpYnJhcnkgPyoqICANCisxLiAgSW4gYGBzcmMvYGAsIGNyZWF0ZSB0aGUgdG9wIGRpcmVjdG9yeSBmb3IgbXlsaWIgYW5kIGFueSBvdGhlciByZXF1aXJlZCBzdWJkaXJlY3Rvcmllcy4gDQorMi4gRWRpdCBgYERlZmluZVByb2plY3QuY21ha2VgYCANCisyLjEgQWRkIHRoZSByZXF1aXJlZCBgYGFkZF9zdWJkaXJlY3RvcnkgKG15bGliKWBgIGNvbW1hbmQuDQorMi4yIEFkZCBteWxpYiBpbiB0aGUgYGB0YXJnZXRfbGlua19saWJyYXJpZXMgKHN5bWJleCAuLi4gbXlsaWIgLi4uKWBgIGNvbW1hbmQsIGF0IHRoZSByaWdodCBwbGFjZSBmb3IgdGhlIGxpbmsgdG8gc3VjY2VlZC4NCiszLiBDb3B5IHRoZSBgYENNYWtlTGlzdHMudHh0YGAgZmlsZSBvZiBhbiBleGlzdGluZyBpbnRlcm5hbCBsaWJyYXJ5IGludG8gdGhlIHRvcCBkaXJlY3Rvcnkgb2YgbXlsaWIuIENoYW5nZSBhbGwgb2NjdXJlbmNlcyBvZiB0aGUgZXhpc3RlbnQgbGlicmFyeSBuYW1lIHdpdGggbXlsaWIuIElmIG5lZWRlZCwgYWRkIG9yIHJlbW92ZSBgYHRhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzKClgYCBjb21tYW5kcyB0byBnaXZlIGFjY2VzcyB0byBhbnkgbmVlZGVkIHByZXJlcXVpc2lzdGUgaGVhZGVycy4gTmV2ZXIgd3JpdGUgYW4gZXhwbGljaXQgcGF0aCBoZXJlLCBpbnN0ZWFkIHVzZSBDTWFrZSB2YXJpYWJsZSAoeW91IGNhbiBsb29rIGF0IHRoZSBDTWFrZUxpc3RzLnR4dCBvZiBvdGhlciBsaWJyYXJ5IHRvIGtub3cgYWJvdXQgdGhlIHJpZ2h0IHZhcmlhYmxlKS4gIA0KKw0KKyogKipIb3cgdG8gYWRkIGEgbmV3IHByZXJlcXVpc2l0ZSBYID8qKg0KK0lmIHRoZSBwcmVyZXF1aXNpdGUgaXMgYSBiaW5hcnkgcGFja2FnZSBhdmFpbGFibGUgb24gZXZlcnkgU3ltYmV4IHN1cHBvcnRlZCBwbGF0Zm9ybSwgZm9sbG93IHRoZSBmb2xsb3dpbmcgcHJvY2VzcyA6ICANCisxLiBDcmVhdGUgYSBuZXcgYGBGaW5kWC5jbWFrZSBtb2R1bGVgYCwgdGFraW5nIGluc3BpcmF0aW9uIGZyb20gYW4gZXhpc3Rpbmcgb25lLiBUaGlzIG1vZHVsZSBzaG91bGQgcmV0dXJuIENNYWtlIHZhcmlhYmxlcyBjb250YWluaW5nIHBhdGggdG8gdGhlIGxpYnJhcnkoaWVzKSBhbmQgdGhlIGluY2x1ZGUgZGlyZWN0b3J5KGllcykuDQorMi4gQWRkIHRoZSByZWxldmFudCBjb2RlIGluIGBgTG9va0Zvck1hbmRhdG9yeVByZXJlcS5jbWFrZWBgIGZvciBDTWFrZSB0byBjYWxsIHRoZSBuZXcgYGBGaW5kWGBgIG1vZHVsZS4NCiszLiBMaW5rIHRvIHRoZSBuZXcgbGlicmFyeShpZXMpICBpbiB0aGUgYGB0YXJnZXRfbGlua19saWJyYXJpZXMoc3ltYmV4IC4uLilgYCBjb21tYW5kIGluIGBgRGVmaW5lUHJvamVjdC5jbWFrZWBgDQorNC4gRm9yIGV2ZXJ5IGludGVybmFsIGxpYnJhcnkgbmVlZGluZyBhY2Nlc3MgdG8gdGhlIG5ldyBwcmVyZXF1aXNpdGVzIGhlYWRlcnMsIGFkZCBhIG5ldyBgYHRhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzYGAgY29tbWFuZCBpbiB0aGUgYGBDTWFsa2VMaXN0cy50eHRgYCBvZiB0aGlzIGxpYnJhcnkuIEFsd2F5cyB1c2UgQ01ha2UgdmFyaWFibGVzIGNyZWF0ZWQgYnkgdGhlIEZpbmRYIG1vZHVsZSAoY2YuIHN0ZXAgMSkuDQorDQorDQorDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9yZXNvdXJjZXMvZG9jL0lOU1RBTExfTElOVVgubWQgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3Jlc291cmNlcy9kb2MvSU5TVEFMTF9MSU5VWC5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjFjYjQwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9yZXNvdXJjZXMvZG9jL0lOU1RBTExfTElOVVgubWQKQEAgLTAsMCArMSw2OSBAQAorIyBMaW51eCBVYnVudHUgRW52aXJvbm1lbnQgSW5zdGFsbGF0aW9uDQorDQorIyMgQ29yZSBTeXN0ZW0gaW5zdGFsbGF0aW9uDQorVGhpcyBwcm9jZWR1cmUgaGFzIGJlZW4gdGVzdGVkIHVuZGVyIFVidW50dSAxNC4wNCBMVFMuDQorDQorIyMgQVBULCB0aGUgcGFja2FnZSBtYW5hZ2VyDQorQVBUIGlzIGEgc2V0IG9mIGNvcmUgdG9vbHMgZm91bmQgaW5zaWRlIERlYmlhbiBiYXNlZCBvcGVyYXRpbmcgc3lzdGVtcy4gSXQgcHJvdmlkZXMgdXRpbGl0aWVzIGZvciB0aGUgaW5zdGFsbGF0aW9uIGFuZCByZW1vdmFsIG9mIHNvZnR3YXJlIHBhY2thZ2VzIGFuZCBkZXBlbmRlbmNpZXMgb24gYSBzeXN0ZW0uDQorDQorIyMjIEFQVC1HRVQsIHBhY2thZ2UgbWFuYWdlbWVudA0KKw0KKyMjIyMgVXBkYXRlIHJlcG9zaXRvcmllcw0KK1JlcG9zaXRvcmllcyBhcmUgdXBkYXRlZCBmcm9tIHRoZSBsb2NhdGlvbnMgc3BlY2lmaWVkIGluIC9ldGMvYXB0L3NvdXJjZXMubGlzdCBhbmQgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvLiANCitgYHN1ZG8gYXB0LWdldCB1cGRhdGVgYA0KKw0KKyMjIyMgVXBncmFkZSB0aGUgd2hvbGUgT1MgZGlzdHJpYnV0aW9uDQorYGBzdWRvIGFwdC1nZXQgdXBncmFkZWBgDQorDQorIyMjIyBJbnN0YWxsaW5nIGEgcGFja2FnZQ0KK2Bgc3VkbyBhcHQtZ2V0IGluc3RhbGwgPHBhY2thZ2U+YGANCisNCisjIyMjIFJlbW92aW5nIGEgcGFja2FnZSB3aXRob3V0IHJlbW92aW5nIGl0cyBjb25maWd1cmF0aW9ucyBmaWxlcw0KK2Bgc3VkbyBhcHQtZ2V0IHJlbW92ZSA8cGFja2FnZT5gYA0KKw0KKyMjIyMgUmVtb3ZpbmcgYSBwYWNrYWdlIGluY2x1ZGluZyBpdHMgY29uZmlndXJhdGlvbnMgZmlsZXMNCitgYHN1ZG8gYXB0LWdldCBwdXJnZSA8cGFja2FnZT5gYA0KK29yDQorYGBzdWRvIGFwdC1nZXQgcmVtb3ZlIC0tcHVyZ2UgPHBhY2thZ2U+YGANCisNCisjIyMgQVBULUNBQ0hFLCBoaWdoIGxldmVsIHBhY2thZ2UgcXVlcnkNCitBUFQgY2FjaGUgZmlsZXMgYXJlIGxvY2F0ZWQgaW4gL3Zhci9jYWNoZS9hcHQvYXJjaGl2ZXMNCisNCisjIyMjIExpc3QgYWxsIGF2YWlsYWJsZSBwYWNrYWdlcyBmb3IgdGhlIE9TDQorYGBhcHQtY2FjaGUgcGtnbmFtZXNgYA0KKw0KKyMjIyMgTG9vayBmb3IgcGFja2FnZXMgbWF0Y2hpbmcgYSBzdHJpbmcgcGF0dGVybg0KK2BgYXB0LWNhY2hlIHNlYXJjaCA8c3RyaW5nPmBgDQorDQorIyMjIyBTaG93IGNvbXByZWhlbnNpdmUgaW5mb3JtYXRpb24gYWJvdXQgYSBwYWNrYWdlDQorYGBhcHQtY2FjaGUgc2hvdyA8cGFja2FnZT5gYA0KKw0KKyMjIyBEUEtHLCBsb3cgbGV2ZWwgcGFja2FnZSBtYW5hZ2VtZW50DQorDQorIyMjIyBTaG93IGFsbCBmaWxlcyBpbnN0YWxsZWQgYnkgYSBwYWNrYWdlDQorYGBkcGtnIC1MIDxwYWNrYWdlPmBgDQorDQorIyMjIyBTaG93IGFsbCBwYWNrYWdlcyBjb250YWluaW5nIGEgZmlsZW5hbWUgb3IgZmlsZXBhdGgNCitgYGRwa2cgLVMgPGZpbGVuYW1lb3JwYXRoPmBgDQorDQorIyMgTWFpbiBDb21wb25lbnRzIEluc3RhbGxhdGlvbg0KKw0KKyMjIyMgQ01ha2UsIGEgdG9vbCB0byBidWlsZCBhY3Jvc3Mgc2V2ZXJhbCBwbGF0Zm9ybXMNCitgc3VkbyBhcHQtZ2V0IGluc3RhbGwgY21ha2VgICANCitgc3VkbyBhcHQtZ2V0IGluc3RhbGwgY21ha2UtZ3VpYCAgDQorDQorIyMjIyBCb29zdCwgdGhlIEZyZWUgcGVlci1yZXZpZXdlZCBwb3J0YWJsZSBDKysgc291cmNlIGxpYnJhcmllcyAoY29tcHVsc29yeSkgIA0KK2BzdWRvIGFwdC1nZXQgaW5zdGFsbCBsaWJib29zdC1hbGwtZGV2YCA6IERlYmlhbidzIGRlZmF1bHQgYm9vc3QgdmVyc2lvbiAoY3VycmVudGx5IDEuNTQpDQorDQorIyMjIyBBTlRMUjIsIGEgcGFyc2VyDQorYHN1ZG8gYXB0LWdldCBpbnN0YWxsIGxpYmFudGxyLWRldmAgICANCisNCisjIyMjIEdNUCwgYSBmcmVlIGxpYnJhcnkgZm9yIGFyYml0cmFyeSBwcmVjaXNpb24gYXJpdGhtZXRpYyAob3B0aW9uYWwpDQorYHN1ZG8gYXB0LWdldCBpbnN0YWxsIGxpYmdtcC1kZXZgDQorDQorIyMjIyBHaXQsIFRoZSBkaXN0cmlidXRlZCB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtDQorYHN1ZG8gYXB0LWdldCBpbnN0YWxsIGdpdGANCisNCisNCisNCisNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3Jlc291cmNlcy9kb2MvSU5TVEFMTF9NU1lTMi5tZCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvcmVzb3VyY2VzL2RvYy9JTlNUQUxMX01TWVMyLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNGVkNjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3Jlc291cmNlcy9kb2MvSU5TVEFMTF9NU1lTMi5tZApAQCAtMCwwICsxLDE2NiBAQAorIyBNU1lTMiBDb21waWxlciBFbnZpcm9ubWVudCA6IGluc3RhbGxhdGlvbg0KKw0KKyMjIENvcmUgU3lzdGVtIGluc3RhbGxhdGlvbg0KKyogR28gdG8gW2h0dHA6Ly9tc3lzMi5naXRodWIuaW9dKGh0dHA6Ly9tc3lzMi5naXRodWIuaW8vKQ0KKyogRG93bmxvYWQgYW5kIHJ1biB0aGUgaW5zdGFsbGVyICoqbXN5czIteDg2XzY0LTIwMTYwOTIxLmV4ZSoqDQorKiBXaGVuIHByb21wdGVkIHRvIGVudGVyICoqSW5zdGFsbGF0aW9uIEZvbGRlcioqLCB1c2UgZGVmYXVsdCBjaG9pY2UgKipDOlxtc3lzNjQqKg0KKyogVGljayAqKlJ1biBNU1lTMiBub3cqKiwgdGhpcyB3aWxsIG9wZW4gYSBzaGVsbA0KKyogVXBkYXRlIHRoZSBwYWNrYWdlIGRhdGFiYXNlIGFuZCBwYWNtYW4gd2l0aCBgYHBhY21hbiAtU3kgcGFjbWFuYGANCisqIElmIG5lZWRlZCwgY2xvc2UgTVNZUzIsIHJ1biBpdCBhZ2FpbiBmcm9tIFN0YXJ0IG1lbnUuIFVwZGF0ZSB0aGUgcmVzdCB3aXRoOiBVcGRhdGUgdGhlIHBhY2thZ2UgZGF0YWJhc2UgYW5kIGNvcmUgc3lzdGVtIHBhY2thZ2VzIHdpdGg6ICBgYHBhY21hbiAtU3l1YGANCisqIEFnYWluLCBpZiBuZWVkZWQsIGNsb3NlIE1TWVMyLCBydW4gaXQgYWdhaW4gZnJvbSBTdGFydCBtZW51LiBVcGRhdGUgdGhlIHJlc3Qgd2l0aDogYGBwYWNtYW4gLVN1YGANCisNCitQaW5uaW5nIHRvIFRhc2tiYXI6IHNob3J0Y3V0IGNvbW1hbmQgbGlzdCANCisxLiBDOlxtc3lzNjRcbXN5czJfc2hlbGwuY21kIC1taW5ndzY0DQorMi4gQzpcbXN5czY0XHVzclxiaW5cbWludHR5LmV4ZSAtaSAvbXN5czIuaWNvIC91c3IvYmluL2Jhc2ggLS1sb2dpbg0KKw0KKw0KKw0KKyMjIFBhY21hbiwgdGhlIHBhY2thZ2UgbWFuYWdlcg0KK1RoZSBkb2N1bWVudGF0aW9uIFt3aWtpIHBhZ2VdKGh0dHBzOi8vd2lraS5hcmNobGludXgub3JnL2luZGV4LnBocC9wYWNtYW4pDQorDQorIyMjIFF1ZXJ5aW5nIHBhY2thZ2UgZGF0YWJhc2VzDQorKiBIZWxwIG9uIHF1ZXJpZXMgb24gdGhlIHN5bmMgZGF0YWJhc2UgKiotUyoqDQorKiBIZWxwIG9uIHF1ZXJpZXMgb24gaW5zdGFsbGVkIHBhY2thZ2VzICoqLVEqKg0KKw0KK2BgYA0KK3BhY21hbiAtUyAtLWhlbHANCitwYWNtYW4gLVEgLS1oZWxwDQorYGBgDQorDQorKiBTZWFyY2ggZm9yIHBhY2thZ2VzIGluIHRoZSBkYXRhYmFzZSAvIGluIGFscmVhZHkgaW5zdGFsbGVkIHBhY2thZ2VzDQorDQorYGBgDQorDQorcGFjbWFuIC1TcyBzdHJpbmcxIHN0cmluZzINCisNCitwYWNtYW4gLVFzIHN0cmluZzEgc3RyaW5nMg0KKw0KK2BgYA0KKw0KKw0KKyogVG8gZGlzcGxheSBpbnN0YWxsZWQgZmlsZSBsaXN0IGEgZ2l2ZW4gcGFja2FnZQ0KKw0KK2BgYA0KK3BhY21hbiAtU2xxIHBhY2thZ2VfbmFtZQ0KKw0KK3BhY21hbiAtUWxxIHBhY2thZ2VfbmFtZQ0KK2BgYA0KKw0KKyogVG8gZGlzcGxheSBleHRlbnNpdmUgaW5mb3JtYXRpb24gYWJvdXQgYSBnaXZlbiBwYWNrYWdlDQorDQorYGBgDQorcGFjbWFuIC1TaSBwYWNrYWdlX25hbWUNCisNCitwYWNtYW4gLVFpIHBhY2thZ2VfbmFtZQ0KK2BgYA0KKw0KKyMjIyBJbnN0YWxsaW5nIHBhY2thZ2VzDQorKiBJbnN0YWxsaW5nIHNwZWNpZmljIHBhY2thZ2VzDQorDQorYGBgDQorcGFjbWFuIC1TIHBhY2thZ2VfbmFtZTEgcGFja2FnZV9uYW1lMg0KK2BgYA0KKw0KKyMjIyBSZW1vdmluZyBwYWNrYWdlcw0KKyogUmVtb3ZpbmcgcGFja2FnZXMsIGxlYXZpbmcgYWxsIG9mIGl0cyBkZXBlbmRlbmNpZXMgaW5zdGFsbGVkDQorDQorYGBgDQorcGFjbWFuIC1SIHBhY2thZ2VfbmFtZQ0KK2BgYA0KKw0KKyogUmVtb3ZpbmcgcGFja2FnZXMgYW5kIGl0cyBkZXBlbmRlbmNpZXMgd2hpY2ggYXJlIG5vdCByZXF1aXJlZCBieSBhbnkgb3RoZXIgaW5zdGFsbGVkIHBhY2thZ2UNCisNCitgYGANCitwYWNtYW4gLVJzIHBhY2thZ2VfbmFtZQ0KK2BgYA0KKw0KKyMjIyBVcGRhdGluZyBwYWNrYWdlcw0KKyogQ29tcGFyaW5nIHZlcnNpb25zIGJlZm9yZSB1cGRhdGluZywgdG8gc2VlIG9sZCBhbmQgbmV3IHZlcnNpb25zIG9mIGF2YWlsYWJsZSBwYWNrYWdlcw0KKw0KK2BgYA0KK3BhY21hbiAtU3l1DQorYGBgDQorDQorDQorIyMgTWFpbiBDb21wb25lbnRzIGluc3RhbGxhdGlvbg0KKyMjIyBVdGlsaXRpZXMgdXNlZCB0byBzdG9yZSwgYmFja3VwLCBhbmQgdHJhbnNwb3J0IGZpbGVzDQorDQorYGBgDQorcGFjbWFuIC1TIHRhcg0KK2BgYA0KKw0KKyMjIyBHaXQgOiBUaGUgZGlzdHJpYnV0ZWQgdmVyc2lvbiBjb250cm9sIHN5c3RlbQ0KKw0KK2BgYA0KK3BhY21hbiAtUyBnaXQNCitgYGANCisNCisjIyMgQmludXRpbHMgOiBBIHNldCBvZiBwcm9ncmFtcyB0byBhc3NlbWJsZSBhbmQgbWFuaXB1bGF0ZSBiaW5hcnkgYW5kIG9iamVjdCBmaWxlcw0KKw0KK2BgYA0KK3BhY21hbiAtUyBiaW51dGlscw0KK2BgYCANCisNCisjIFV0aWxzIGZvciBjb21waWxhdGlvbg0KKw0KKyMjIyBHTlUgYXV0b3Rvb2xzIDogdG9vbHMgdG8gYXV0b21hdGUgcGFydHMgb2YgdGhlIGNvbXBpbGF0aW9uIHByb2Nlc3MNCitgYGANCitwYWNtYW4gLVMgYXV0b2NvbmYNCisNCitwYWNtYW4gLVMgYXV0b21ha2UNCisNCitwYWNtYW4gLVMgbGlidG9vbA0KKw0KK3BhY21hbiAtUyBtYWtlDQorYGBgDQorDQorIyMjIENNYWtlIDogYSB0b29sIHRvIGJ1aWxkIGFjcm9zcyBzZXZlcmFsIHBsYXRmb3Jtcw0KKyogICoqQ01ha2UqKiAgKGNvbXB1bHNvcnkpDQorDQorYGBgDQorcGFjbWFuIC1TIG1pbmd3LXc2NC14ODZfNjQtY21ha2UNCitgYGANCisqICAqKlF0NSBGcmFtZXdvcmsqKiAgKG9wdGlvbmFsIGJpZyBwYWNrYWdlIG9ubHkgbmVlZGVkIGZvciBjbWFrZS1ndWkpDQorYGBgDQorcGFjbWFuIC1TIG1pbmd3LXc2NC14ODZfNjQtcXQ1DQorYGBgDQorDQorIyMjIEdjYyA6IFRoZSBHTlUgQ29tcGlsZXIgQ29sbGVjdGlvbiAtIEMgYW5kIEMrKyBmcm9udGVuZHMNCisqICAqKkdjYyoqIGZvciAqKk1pbkdXIHc2NC14ODZfNjQqKiBlbnZpcm9ubWVudCAoY29tcHVsc29yeSkNCisNCitgYGANCitwYWNtYW4gLVMgbWluZ3ctdzY0LXg4Nl82NC1nY2MNCitgYGANCisNCisqICAqKkdOVSBEZWJ1Z2dlcioqIChvcHRpb25hbCkNCisNCitgYGANCitwYWNtYW4gLVMgbWluZ3ctdzY0LXg4Nl82NC1nZGINCitgYGANCisNCisjIyMgQWRkaXRpb25hbCBkZXZlbG9wZXIgbGlicmFyaWVzDQorKiAqKkJvb3N0KiosIHRoZSBGcmVlIHBlZXItcmV2aWV3ZWQgcG9ydGFibGUgQysrIHNvdXJjZSBsaWJyYXJpZXMgKGNvbXB1bHNvcnkpDQorDQorYGBgDQorcGFjbWFuIC1TIG1pbmd3LXc2NC14ODZfNjQtYm9vc3QNCitgYGANCisNCisqICoqR01QKiosICBBIGZyZWUgbGlicmFyeSBmb3IgYXJiaXRyYXJ5IHByZWNpc2lvbiBhcml0aG1ldGljIChvcHRpb25hbCkNCisNCitgYGANCitwYWNtYW4gLVMgbWluZ3ctdzY0LXg4Nl82NC1nbXANCitgYGANCisNCisqICAqKkdOVSByZWFkbGluZSoqIGxpYnJhcnkgKG9wdGlvbmFsKQ0KKw0KK2BgYA0KK3BhY21hbiAtUyBsaWJyZWFkbGluZS1kZXZlbA0KK2BgYA0KKw0KKyMjIyBQeXRob24gOiB0aGUgdmVyc2lvbiAzIG9mIHRoZSBoaWdoLWxldmVsIHNjcmlwdGluZyBsYW5ndWFnZSANCitSZXF1aXJlZCBieQ0KKyogWjMgcHJvdmVyIGNvbXBpbGF0aW9uDQorT3B0aW9uYWwgb3RoZXJ3aXNlDQorYGBgDQorcGFjbWFuIC1TIG1pbmd3LXc2NC14ODZfNjQtcHl0aG9uMw0KK2BgYA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvcmVzb3VyY2VzL2RvYy9JTlNUQUxMX1NPTFZFUlMubWQgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3Jlc291cmNlcy9kb2MvSU5TVEFMTF9TT0xWRVJTLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMWJlOTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3Jlc291cmNlcy9kb2MvSU5TVEFMTF9TT0xWRVJTLm1kCkBAIC0wLDAgKzEsNTQ2IEBACittc3lzNjQvc3ltYmV4IyBNaW5HVyBEaXN0cm8gLSBudXdlbi5uZXQKKworKiAqKldlYioqIFttaW5ndy1udXdlbl0oaHR0cHM6Ly9udXdlbi5uZXQvbWluZ3cuaHRtbCkKKyogKipEb3dubG9hZCAmIGluc3RhbGwqKgorCitgYGAKK0Rvd25sb2FkOiAnbWluZ3ctMTQueC5leGUnCitVbmFyY2hpdmUgaXQgaW4gdGhlIHJvb3QgZGlyZWN0b3J5OiAnQzpcJworYGBgCisKKworIyBTRVA6IE9wZW4gU291cmNlIFNvbHZlcnMgY29tcGlsYXRpb24gJiBpbnN0YWxsYXRpb24KKworKiBGb3IgTWljcm9zb2Z0IFdpbmRvd3MgcGxhdGZvcm0sIGFzc3VtZSB0aGF0IHRoZSBzeXN0ZW0gKipNU1lTMiAvIE1pbkdXNjQqKiBpcyBpbnN0YWxsZWQsIHNlZSBbSU5TVEFMTF9NU1lTMl0oSU5TVEFMTF9NU1lTMi5tZCkKKworKiBBc3N1bWUgdGhhdCB5b3UgaGF2ZSB0aGVzZSBmaWxlIHN5c3RlbSBjb25maWd1cmF0aW9uCisKK2BgYAorIGdpdC1yZXBvc2l0b3J5LWxvY2FsLWRpcmVjdG9yeQorIAl8X18gc29sdmVycworIAl8X18gaW5zdGFsbAorYGBgCisKKyogR28gdG8gYGBgZ2l0LXJlcG9zaXRvcnktbG9jYWwtZGlyZWN0b3J5YGBgCisKK2BgYHNoCitjZCBnaXQtcmVwb3NpdG9yeS1sb2NhbC1kaXJlY3RvcnkKK2BgYAorCisKKyMjIEFOVExSIFRvb2xzLCBmb3IgQysrIGxleGVyIG9yIHBhcnNlciwgdmVyc2lvbiAyLjcuNworCisqICoqUmVwb3NpdG9yeSoqIFtkb3dubG9hZF0oaHR0cDovL3d3dy5hbnRscjIub3JnL2Rvd25sb2FkLmh0bWwpCisqICoqV2ViKiogW2FudGxyMi5vcmddKGh0dHA6Ly93d3cuYW50bHIyLm9yZy8pCisqICoqR2V0IHNvdXJjZSBjb2RlKioKKworYGBgc2gKK0p1c3QgZG93bmxvYWQgaXQ6IGh0dHA6Ly93d3cuYW50bHIyLm9yZy9kb3dubG9hZC9hbnRsci0yLjcuNy50YXIuZ3oKK2BgYAorKiAqKkdvIHRvKiogdGhlIGxvY2FsIHVuYXJjaGl2ZSBkaXJlY3RvcnkKKworYGBgc2gKK2NkIGFudGxyLTIuNy43LWRpcmVjdG9yeQorYGBgCisKKyogKipQYXRjaCoqIGBgYGxpYlxjcHBcYW50bHJcQ2hhclNjYW5uZXIuaHBwYGBgCisKK2BgYGNwcAorKyNpbmNsdWRlIDxzdHJpbmcuaD4KK29yCisrI2luY2x1ZGUgPGNzdHJpbmc+CitgYGAKKworKiAqKkNvbmZpZ3VyYXRpb24qKgorCitgYGBzaAorLi9jb25maWd1cmUgLS1ob3N0PXg4Nl82NC13NjQtbWluZ3czMiAtLWJ1aWxkPXg4Nl82NC13NjQtbWluZ3czMiAtLXByZWZpeD0vYy9tc3lzNjQvc3ltYmV4IC0tZW5hYmxlLWN4eCAtLWRpc2FibGUtamF2YSAtLWRpc2FibGUtcHl0aG9uIC0tZGlzYWJsZS1jc2hhcnAgIC0tZW5hYmxlLXN0YXRpYz10cnVlIC0tZW5hYmxlLXNoYXJlZD1mYWxzZSAtLWVuYWJsZS02NGJpdAorCistLWhvc3Q9eDg2XzY0LXc2NC1taW5ndzMyIC0tYnVpbGQ9eDg2XzY0LXc2NC1taW5ndzMyCisKKyMtLWhvc3Q9aTY4Ni13NjQtbWluZ3czMiAtLWJ1aWxkPWk2ODYtdzY0LW1pbmd3MzIKKyMtLWhvc3Q9bWluZ3ctdzY0LXg4Nl82NCAtLWJ1aWxkPW1pbmd3LXc2NC14ODZfNjQKKworCisuL2NvbmZpZ3VyZSAtLWhvc3Q9eDg2XzY0LXc2NC1taW5ndzMyIC0tYnVpbGQ9eDg2XzY0LXc2NC1taW5ndzMyIC0tcHJlZml4PS9jL21pbmd3L3N5bWJleCAtLWVuYWJsZS1jeHggLS1kaXNhYmxlLWphdmEgLS1kaXNhYmxlLXB5dGhvbiAtLWRpc2FibGUtY3NoYXJwICAtLWVuYWJsZS1zdGF0aWM9dHJ1ZSAtLWVuYWJsZS1zaGFyZWQ9ZmFsc2UgLS1lbmFibGUtNjRiaXQKK2BgYAorCisjIyBBTlRMUiBUb29scywgZm9yIEMrKyBsZXhlciBvciBwYXJzZXIsIHZlcnNpb24gMy40CisKKyogKipSZXBvc2l0b3J5KiogW2Rvd25sb2FkXShodHRwOi8vd3d3LmFudGxyMy5vcmcvZG93bmxvYWQvQy8pCisqICoqV2ViKiogW2FudGxyMy5vcmddKGh0dHA6Ly93d3cuYW50bHIzLm9yZy8pCisqICoqR2V0IHNvdXJjZSBjb2RlKioKKworYGBgc2gKK0p1c3QgZG93bmxvYWQgaXQ6IGh0dHA6Ly93d3cuYW50bHIzLm9yZy9kb3dubG9hZC9DL2xpYmFudGxyM2MtMy40LnRhci5negorYGBgCisqICoqR28gdG8qKiB0aGUgbG9jYWwgdW5hcmNoaXZlIGRpcmVjdG9yeQorCitgYGBzaAorY2QgbGliYW50bHIzYy0zLjQtZGlyZWN0b3J5CitgYGAKKworKiAqKkNvbmZpZ3VyYXRpb24qKgorCitgYGBzaAorLi9jb25maWd1cmUgLS1wcmVmaXg9L2MvbXN5czY0L3N5bWJleCAtLWVuYWJsZS1zdGF0aWM9dHJ1ZSAtLWVuYWJsZS1zaGFyZWQ9ZmFsc2UgLS1lbmFibGUtNjRiaXQKKworLi9jb25maWd1cmUgLS1wcmVmaXg9L2MvbWluZ3cvc3ltYmV4IC0tZW5hYmxlLXN0YXRpYz10cnVlIC0tZW5hYmxlLXNoYXJlZD1mYWxzZSAtLWVuYWJsZS02NGJpdAorYGBgCisKKyMjIEFOVExSIFRvb2xzLCBmb3IgQysrIGxleGVyIG9yIHBhcnNlciwgdmVyc2lvbiA0LjYKKworKiAqKlJlcG9zaXRvcnkqKiBbR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vYW50bHIvYW50bHI0KQorKiAqKkRvYyoqIFtjcHAtdGFyZ2V0XShodHRwczovL2dpdGh1Yi5jb20vYW50bHIvYW50bHI0L2Jsb2IvbWFzdGVyL2RvYy9jcHAtdGFyZ2V0Lm1kKQorKiAqKkdldCBzb3VyY2UgY29kZSoqCisKK2BgYHNoCisgZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnRsci9hbnRscjQuZ2l0CitgYGAKKyogKipHbyB0byoqIHRoZSBsb2NhbCBjbG9uZSBkaXJlY3RvcnkKKworYGBgc2gKK2NkIGFudGxyNC1kaXJlY3RvcnkKK2BgYAorCisqICoqQ29uZmlndXJhdGlvbioqCisKK2BgYHNoCitjZCAvcnVudGltZS9DcHAKK21rZGlyIGJ1aWxkICYmIG1rZGlyIHJ1biAmJiBjZCBidWlsZAorY21ha2UgLi4gLURBTlRMUl9KQVJfTE9DQVRJT049L2MvbXN5czY0L3N5bWJleC9zb3VyY2UvYW50bHItNC42LWNvbXBsZXQuamFyICAtRENNQUtFX0JVSUxEX1RZUEU9UmVsZWFzZSAtRENNQUtFX01BS0VfUFJPR1JBTT1tYWtlIC1EQ01BS0VfQ19DT01QSUxFUj1nY2MgLURDTUFLRV9DWFhfQ09NUElMRVI9ZysrIC1EV0lUSF9ERU1PPVRydWUKK2BgYAorCisKKworIyMgR01QLCBUaGUgR05VIE11bHRpcGxlIFByZWNpc2lvbiBBcml0aG1ldGljIExpYnJhcnksIHZlcnNpb24gNi4xLjIKKworKiAqKlJlcG9zaXRvcnkqKiBbZG93bmxvYWRdKGh0dHBzOi8vZ21wbGliLm9yZy8jRE9XTkxPQUQpCisqICoqV2ViKiogW2dtcGxpYi5vcmddKGh0dHBzOi8vZ21wbGliLm9yZy8pCisqICoqR2V0IHNvdXJjZSBjb2RlKioKKworYGBgc2gKK0p1c3QgZG93bmxvYWQgaXQ6IGh0dHBzOi8vZ21wbGliLm9yZy9kb3dubG9hZC9nbXAvZ21wLTYuMS4yLnRhci5iejIKK2BgYAorKiAqKkdvIHRvKiogdGhlIGxvY2FsIHVuYXJjaGl2ZSBkaXJlY3RvcnkKKworYGBgc2gKK2NkIGdtcC02LjEtZGlyZWN0b3J5CitgYGAKKworKiAqKkNvbmZpZ3VyYXRpb24qKgorCitgYGBzaAorLi9jb25maWd1cmUgLS1wcmVmaXg9L2MvbXN5czY0L3N5bWJleCAtLWVuYWJsZS1jeHggIC0tZGlzYWJsZS1zaGFyZWQKKworLi9jb25maWd1cmUgLS1wcmVmaXg9L2MvbWluZ3cvc3ltYmV4IC0tZW5hYmxlLWN4eCAgLS1kaXNhYmxlLXNoYXJlZAorYGBgCisKKworIyMgQ0xOLCBDbGFzcyBMaWJyYXJ5IGZvciBOdW1iZXJzLCB2ZXJzaW9uIDEuMy40CisKKyogKipSZXBvc2l0b3J5KiogW0NMTl0oaHR0cDovL3d3dy5naW5hYy5kZS9DTE4vY2xuLmdpdC8pCisqICoqV2ViKiogW0NMTl0oaHR0cDovL3d3dy5naW5hYy5kZS9DTE4vKQorKiAqKkdldCBzb3VyY2UgY29kZSoqCisKK2BgYHNoCisgZ2l0IGNsb25lIGdpdDovL3d3dy5naW5hYy5kZS9jbG4uZ2l0CisgYXV0b3JlY29uZiAtaXYKK2BgYAorKiAqKkdvIHRvKiogdGhlIGxvY2FsIGNsb25lIGRpcmVjdG9yeQorCitgYGBzaAorY2QgY2xuLTEuMy1kaXJlY3RvcnkKK2BgYAorCisqICoqQ29uZmlndXJhdGlvbioqCisKK2BgYHNoCisKKy4vY29uZmlndXJlIC0taG9zdD14ODZfNjQtdzY0LW1pbmd3MzIgLS1idWlsZD14ODZfNjQtdzY0LW1pbmd3MzIgLS1wcmVmaXg9L2MvbXN5czY0L3N5bWJleCAtLXdpdGgtZ21wPS9jL21zeXM2NC9zeW1iZXggLS1lbmFibGUtc3RhdGljICAtLWRpc2FibGUtc2hhcmVkCisKKy4vY29uZmlndXJlIC0taG9zdD14ODZfNjQtdzY0LW1pbmd3MzIgLS1idWlsZD14ODZfNjQtdzY0LW1pbmd3MzIgLS1wcmVmaXg9L2MvbWluZ3cvc3ltYmV4IC0td2l0aC1nbXA9L2MvbWluZ3cvc3ltYmV4IC0tZW5hYmxlLXN0YXRpYyAgLS1kaXNhYmxlLXNoYXJlZAorCitgYGAKKworIyMgR2lOYUMgaXMgTm90IGEgQ0FTICgpQ29tcHV0ZXIgQWxnZWJyYSBTeXN0ZW0pLCB2ZXJzaW9uIDEuNy4xCisKKyogKipSZXBvc2l0b3J5KiogW0dpTmFDXShodHRwOi8vd3d3LmdpbmFjLmRlL2dpbmFjLmdpdC8pCisqICoqV2ViKiogW0dpTmFDXShodHRwOi8vd3d3LmdpbmFjLmRlLykKKyogKipHZXQgc291cmNlIGNvZGUqKgorCitgYGBzaAorIGdpdCBjbG9uZSBnaXQ6Ly93d3cuZ2luYWMuZGUvZ2luYWMuZ2l0CisgYXV0b3JlY29uZiAtaQorYGBgCisqICoqR28gdG8qKiB0aGUgbG9jYWwgY2xvbmUgZGlyZWN0b3J5CisKK2BgYHNoCitjZCBnaW5hYy0xLjctZGlyZWN0b3J5CitgYGAKKworKiAqKkNvbmZpZ3VyYXRpb24qKgorCitgYGBzaAorCitleHBvcnQgQ0xOX0NGTEFHUz0tSS9jL21zeXM2NC9zeW1iZXgvaW5jbHVkZQorCitleHBvcnQgQ0xOX0xJQlM9LUwvYy9tc3lzNjQvc3ltYmV4L2xpYgorCisKK2V4cG9ydCBMSUJTPSIvYy9tc3lzNjQvc3ltYmV4L2xpYi9saWJjbG4uYSAvYy9tc3lzNjQvc3ltYmV4L2xpYi9saWJnbXAuYSAtbHJlYWRsaW5lIC1sbmN1cnNlcyIKKworLi9jb25maWd1cmUgLS1wcmVmaXg9L2MvbXN5czY0L3N5bWJleCAtLWVuYWJsZS1zdGF0aWMgIC0tZGlzYWJsZS1zaGFyZWQKKworCitleHBvcnQgTElCUz0iL2MvbWluZ3cvc3ltYmV4L2xpYi9saWJjbG4uYSAvYy9taW5ndy9zeW1iZXgvbGliL2xpYmdtcC5hIC1scmVhZGxpbmUgLWxuY3Vyc2VzIgorCisuL2NvbmZpZ3VyZSAtLXByZWZpeD0vYy9taW5ndy9zeW1iZXggLS1lbmFibGUtc3RhdGljICAtLWRpc2FibGUtc2hhcmVkCisKK2BgYAorCisKKworCisjIyBPbWVnYSBMaWJyYXJ5LCBmb3IgY29uc3RyYWludCBtYW5pcHVsYXRpb24KK09tZWdhIFByb2plY3QgU291cmNlIFJlbGVhc2UsIHZlcnNpb24gMi4xCisKKyogKipSZXBvc2l0b3J5KiogW0dpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2RhdmV3YXRoYXZlcmZvcmQvdGhlLW9tZWdhLXByb2plY3QpCisKKyogKipHZXQgc291cmNlIGNvZGUqKgorCitgYGBzaAorIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vZGF2ZXdhdGhhdmVyZm9yZC90aGUtb21lZ2EtcHJvamVjdC5naXQKK2BgYAorKiAqKkdvIHRvKiogdGhlIGxvY2FsIGNsb25lIGRpcmVjdG9yeQorCitgYGBzaAorY2Qgb21lZ2EtZGlyZWN0b3J5CitgYGAKKworKiAqKkNvbmZpZ3VyYXRpb24qKgorCSsgRWRpdCBgYGBvbWVnYS1kaXJlY3RvcnkvTWFrZWZpbGUuY29uZmlnYGBgCisJKyBNb2RpZnkgY29tcGlsZXIgZmxhZ3MgYGBgQ09NUElMRVJfQ0ZMQUdTYGBgIGFuZCBpbnN0YWxsIGxvY2F0aW9uIGBgYERFU1RESVJgYGAKKworYGBgbWFrZWZpbGUKKworIyBsaW5lIDE1OiB1bmNvbW1lbnQgaXQgaS5lLgorWDExX0xJQlMgPSAtbFhtIC1sWHQgLWxYMTEgIC1sSUNFIC1sU00KKworIyBsaW5lIDE4OiBjb21tZW50IGl0IGkuZS4KKyNYMTFfTElCUyA9ICMtbElDRSAtbFNNCisKKyMgbmVhciBsaW5lIDI4CitDT01QSUxFUl9DRkxBR1M9LVdhbGwgLVduby1mb3JtYXQgLVdwYXJlbnRoZXNlcyAtRFNJR19IQU5ETEVSX0hBU19PTkVfQVJHPTEgLURTSFVUX1VQX0FCT1VUX1NUQVRFTUVOVF9XSVRIX05PX0VGRkVDVF9JTl9EWU5BTUlDX0FSUkFZX0NSRUFUSU9OIC1EREFWRVdfVEhFU0lTX1JFRFVDVElPTlMgLURTVFVEWV9LSUxMX1VTRQorCisjIG5lYXIgbGluZSA4MworREVTVERJUj1naXQtcmVwb3NpdG9yeS1sb2NhbC1kaXJlY3RvcnkvaW5zdGFsbAorYGBgCisKKyogKipQYXRjaCoqIGBgYGJhc2ljXGluY2x1ZGVcYmFzaWNcYXNzZXJ0LmhgYGAKKworYGBgY3BwCisKKzE1LDE3YzE1LDE3Cis8ICNpZmRlZiBXSU4zMgorPCAjIGRlZmluZSBfYXNzZXJ0KGV4KQkoKCEoZXgpKSA/ICgodm9pZClmcHJpbnRmKHN0ZGVyciwiXG5cbkFzc2VydGlvbiBcIiVzXCIgZmFpbGVkOiBmaWxlIFwiJXNcIiwgbGluZSAlZFxuIiwgZXgsIF9fRklMRV9fLCBfX0xJTkVfXyksIEV4aXQoLTIpLCAwKSA6IDEpCis8ICNlbHNlCistLS0KKz4gLy8jaWZkZWYgV0lOMzIKKz4gLy8jIGRlZmluZSBfYXNzZXJ0KGV4KQkoKCEoZXgpKSA/ICgodm9pZClmcHJpbnRmKHN0ZGVyciwiXG5cbkFzc2VydGlvbiBcIiVzXCIgZmFpbGVkOiBmaWxlIFwiJXNcIiwgbGluZSAlZFxuIiwgZXgsIF9fRklMRV9fLCBfX0xJTkVfXyksIC8vRXhpdCgtMiksIDApIDogMSkKKz4gLy8jZWxzZQorMjBjMjAKKzwgI2VuZGlmCistLS0KKz4gLy8jZW5kaWYKKworYGBgCisKKyogKipQYXRjaCoqIGBgYGJhc2ljXGluY2x1ZGVcYmFzaWNcdXRpbC5oYGBgCisKK2BgYGNwcAorCis0LDhjNCwxMAorPCAjaWZkZWYgV0lOMzIKKzwgI2RlZmluZSBMT05HTE9ORyBfaW50NjQKKzwgI2Vsc2UKKzwgI2RlZmluZSBMT05HTE9ORyBsb25nIGxvbmcKKzwgI2VuZGlmCistLS0KKz4gI2luY2x1ZGUgPHN0ZGludC5oPgorPgorPiAvLyNpZmRlZiBXSU4zMgorPiAjZGVmaW5lIExPTkdMT05HIGludDY0X3QKKz4gLy8jZWxzZQorPiAvLyNkZWZpbmUgTE9OR0xPTkcgbG9uZyBsb25nCis+IC8vI2VuZGlmCisyMiwyNGMyNCwyNgorPCAjaWZkZWYgV0lOMzIKKzwgIyAgICBkZWZpbmUgTUFYTE9OR0xPTkcgKDB4N2ZmZmZmZmZmZmZmZmZmKQorPCAjZWxzZQorLS0tCis+IC8vI2lmZGVmIFdJTjMyCis+IC8vIyAgICBkZWZpbmUgTUFYTE9OR0xPTkcgKDB4N2ZmZmZmZmZmZmZmZmZmKQorPiAvLyNlbHNlCisyNmMyOAorPCAjZW5kaWYKKy0tLQorPiAvLyNlbmRpZgorCitgYGAKKworKiAqKlBhdGNoKiogYGBgb21lZ2FfbGliL3NyYy9vbWVnYV9jb3JlL29jX3NpbXBsZS5jYGBgCisKK2BgYGNwcAorCisxMTg5Cis8CQlpZiAoR0VRc1tlMl0uY29lZlswXSA+IEdFUXNbZV0uY29lZlswXSB8fAorPAkJICAgIChHRVFzW2UyXS5jb2VmWzBdID09IEdFUXNbZV0uY29lZlswXSAmJiBHRVFzW2UyXS5jb2xvcikpCistLS0KKz4JCWlmIChHRVFzW2UyXS5jb2VmWzBdID49IEdFUXNbZV0uY29lZlswXSAmJiBHRVFzW2UyXS5jb2xvcikKKworYGBgCisKKyogKipQYXRjaCoqIGBgYG9tZWdhX2xpYi9zcmMvY2xvc3VyZS5jYGBgCisKK2BgYGNwcAorCisKK2BgYAorCisqICoqUGF0Y2gqKiBgYGBvbWVnYV9saWIvc3JjL3ByZXNfZG5mLmNgYGAKKworYGBgY3BwCisKKzMzMgorPCAgICAgaW50IHJlY3Vyc2l2ZT0wOworLS0tCis+IC8vICAgIGludCByZWN1cnNpdmU9MDsKKworOTgyCis8ICAgICBib29sIGVtcHR5X29yPXRydWU7CistLS0KKz4gLy8gICAgYm9vbCBlbXB0eV9vcj10cnVlOworCitgYGAKKworCisqICoqQ29tcGlsYXRpb24qKgorCSsgRG8KKworYGBgc2gKK21ha2UgZGVwZW5kCisKK21ha2UgbGlib21lZ2EuYQorYGBgCisKKyogKippbnN0YWxsYXRpb24qKgorCisJKyBEbworCitgYGBzaAorbWFrZSBpbnN0YWxsCitgYGAKKworIyMgQ1ZDNCwgU01UIFNvbHZlciBmcm9tIE5ldyBZb3JrIFVuaXZlcnNpdHkKK1RoaXMgaXMgQ1ZDNCByZWxlYXNlIHZlcnNpb24gMS40CisKKyogKipSZXBvc2l0b3J5KiogW0dpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL0NWQzQvQ1ZDNCkKKworKiAqKkdldCBzb3VyY2UgY29kZSoqCisKK2BgYHNoCitnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL0NWQzQvQ1ZDNC5naXQKK2BgYAorCisqICoqR28gdG8qKiB0aGUgbG9jYWwgY2xvbmUgZGlyZWN0b3J5CisKK2BgYHNoCitjZCBjdmM0LWRpcmVjdG9yeQorCisuL2F1dG9nZW4uc2gKK2BgYAorCisqICoqUGF0Y2gqKiBgYGBzcmNcdXRpbFxzZXhwci5oOmxpbmU3MWBgYAorCitgYGBjcHAKKworI2lmZGVmIENWQzRfTkVFRF9JTlQ2NF9UX09WRVJMT0FEUworICBTRXhwcihpbnQ2NF90ICB2YWx1ZSk7CisgIFNFeHByKHVpbnQ2NF90IHZhbHVlKTsKKyNlbmRpZiAvKiBDVkM0X05FRURfSU5UNjRfVF9PVkVSTE9BRFMgKi8KKworYGBgCisKKyogKipQYXRjaCoqIGBgYHNyY1x1dGlsXHNleHByLmNwcDpsaW5lMTI3YGBgCisKK2BgYGNwcAorCisjaWZkZWYgQ1ZDNF9ORUVEX0lOVDY0X1RfT1ZFUkxPQURTCitTRXhwcjo6U0V4cHIoaW50NjRfdCB2YWx1ZSkKKyAgICA6IGRfc2V4cHJUeXBlKFNFWFBSX0lOVEVHRVIpLAorICAgICAgZF9pbnRlZ2VyVmFsdWUodmFsdWUpLAorICAgICAgZF9yYXRpb25hbFZhbHVlKDApLAorICAgICAgZF9zdHJpbmdWYWx1ZSgiIiksCisgICAgICBkX2NoaWxkcmVuKE5VTEwpIHt9CisKK1NFeHByOjpTRXhwcih1aW50NjRfdCB2YWx1ZSkKKyAgICA6IGRfc2V4cHJUeXBlKFNFWFBSX0lOVEVHRVIpLAorICAgICAgZF9pbnRlZ2VyVmFsdWUodmFsdWUpLAorICAgICAgZF9yYXRpb25hbFZhbHVlKDApLAorICAgICAgZF9zdHJpbmdWYWx1ZSgiIiksCisgICAgICBkX2NoaWxkcmVuKE5VTEwpIHt9CisjZW5kaWYgLyogQ1ZDNF9ORUVEX0lOVDY0X1RfT1ZFUkxPQURTICovCisKK2BgYAorCisKKyogKipDb25maWd1cmF0aW9uKioKKwkrIEdldCAmIENvbXBpbGUgdGhlIHRvb2wgKiphbnRsci0zLjQqKgorCitgYGBzaAorCitjZCBjb250cmliLworLi9nZXQtYW50bHItMy40CitjZCAuLgorCitjZCBjb250cmliLyAmJiAuL2dldC1hbnRsci0zLjQgJiYgY2QgLi4KKworYGBgCisKKyAgICsgQ29uZmlndXJlIFVOSVgKKworYGBgc2gKK2V4cG9ydCBMSUJTPSItbGdtcCIKKworLi9jb25maWd1cmUgLS1wcmVmaXg9L2hvbWUvbGFwaXRyZV9pczE0ODI0NS9lZm0vc3ltYmV4L2NvbnRyaWIgLS13aXRoLWFudGxyLWRpcj1gcHdkYC9hbnRsci0zLjQgQU5UTFI9YHB3ZGAvYW50bHItMy40L2Jpbi9hbnRscjMgIC0tZW5hYmxlLXN0YXRpYz10cnVlIC0tZW5hYmxlLXNoYXJlZD1mYWxzZSAtLWVuYWJsZS1zdGF0aWMtYmluYXJ5IC0tZW5hYmxlLXByb29mIC0tZW5hYmxlLW9wdGltaXplZCAtLWJzZAorCistLXdpdGhvdXQtY2xuICAtLXdpdGgtZ21wIAorCistLWJlc3QgbmVlZCAgLS13aXRoLWNsbgorYGBgCisKKworICAgKyBDb25maWd1cmUgTVNZUzIKKworYGBgc2gKK2V4cG9ydCBMSUJTPSItbGdtcCIKKworZXhwb3J0IENGTEFHUz0tSS9jL21zeXM2NC9zeW1iZXgvaW5jbHVkZQorZXhwb3J0IENQUEZMQUdTPS1JL2MvbXN5czY0L3N5bWJleC9pbmNsdWRlCitleHBvcnQgQ1hYRkxBR1M9LUkvYy9tc3lzNjQvc3ltYmV4L2luY2x1ZGUKK2V4cG9ydCBMREZMQUdTPS1ML2MvbXN5czY0L3N5bWJleC9saWIKKworLi9jb25maWd1cmUgLS1wcmVmaXg9L2MvbXN5czY0L3N5bWJleCAtLXdpdGgtYW50bHItZGlyPWBwd2RgL2FudGxyLTMuNCBBTlRMUj1gcHdkYC9hbnRsci0zLjQvYmluL2FudGxyMyAgLS1lbmFibGUtc3RhdGljPXRydWUgLS1lbmFibGUtc2hhcmVkPWZhbHNlIC0tZW5hYmxlLXN0YXRpYy1iaW5hcnkgLS1lbmFibGUtcHJvb2YgLS1lbmFibGUtb3B0aW1pemVkIC0tYnNkCisKKy4vY29uZmlndXJlIC0tcHJlZml4PS9jL21zeXM2NC9zeW1iZXggLS13aXRoLWFudGxyLWRpcj1gcHdkYC9hbnRsci0zLjQgQU5UTFI9YHB3ZGAvYW50bHItMy40L2Jpbi9hbnRscjMgIC0tZW5hYmxlLXN0YXRpYz10cnVlIC0tZW5hYmxlLXNoYXJlZD1mYWxzZSAtLWVuYWJsZS1zdGF0aWMtYmluYXJ5IC0tZW5hYmxlLXByb29mIC0tZW5hYmxlLW9wdGltaXplZCAtLXdpdGhvdXQtY2xuIC0td2l0aC1nbXAgLS1ic2QKKworLS13aXRoLWJvb3N0PS9jL21zeXM2NC9taW5ndzY0L2luY2x1ZGUvYm9vc3QgLS13aXRoLWJvb3N0LWxpYmRpcj0vYy9tc3lzNjQvbWluZ3c2NC9saWIKKworCitleHBvcnQgTElCUz0iLWxnbXAiCisKK2V4cG9ydCBDRkxBR1M9LUkvYy9taW5ndy9zeW1iZXgvaW5jbHVkZQorZXhwb3J0IENQUEZMQUdTPS1JL2MvbWluZ3cvc3ltYmV4L2luY2x1ZGUKK2V4cG9ydCBDWFhGTEFHUz0tSS9jL21pbmd3L3N5bWJleC9pbmNsdWRlCisKKy4vY29uZmlndXJlIC0tcHJlZml4PS9jL21pbmd3L3N5bWJleCAtLXdpdGgtYW50bHItZGlyPWBwd2RgL2FudGxyLTMuNCBBTlRMUj1gcHdkYC9hbnRsci0zLjQvYmluL2FudGxyMyAgLS1lbmFibGUtc3RhdGljPXRydWUgLS1lbmFibGUtc2hhcmVkPWZhbHNlIC0tZW5hYmxlLXN0YXRpYy1iaW5hcnkgLS1lbmFibGUtcHJvb2YgLS1lbmFibGUtb3B0aW1pemVkIC0tYnNkCisKKy4vY29uZmlndXJlIC0tcHJlZml4PS9jL21pbmd3L3N5bWJleCAtLXdpdGgtYW50bHItZGlyPWBwd2RgL2FudGxyLTMuNCBBTlRMUj1gcHdkYC9hbnRsci0zLjQvYmluL2FudGxyMyAgLS1lbmFibGUtc3RhdGljPXRydWUgLS1lbmFibGUtc2hhcmVkPWZhbHNlIC0tZW5hYmxlLXN0YXRpYy1iaW5hcnkgLS1lbmFibGUtcHJvb2YgLS1lbmFibGUtb3B0aW1pemVkIC0td2l0aG91dC1jbG4gIC0td2l0aC1nbXAgIC0td2l0aC1ib29zdD0vYy9taW5ndy9pbmNsdWRlL2Jvb3N0IC0td2l0aC1ib29zdC1saWJkaXI9L2MvbWluZ3cvbGliIC0tYnNkCisKKworLS1iZXN0IG5lZWQgIC0td2l0aC1jbG4KK2BgYAorCisqICoqQ29tcGlsYXRpb24qKgorCitDaGVjayBpZiB0aGUgYE1ha2VmaWxlYCBpcyBjb3JyZWN0IGkuZS4gaWYgYGJ1aWxkaXJzID0gPGJ1aWxkcy8kYXJjaC8kYnVpbGRpZD5gICEKKworYGBgc2gKK21ha2UgLWo0CitgYGAKKworKiAqKmluc3RhbGxhdGlvbioqCitgYGBzaAorbWFrZSBpbnN0YWxsCitgYGAKKworCisjIyBaMywgVGhlb3JlbSBQcm92ZXIgZnJvbSBNaWNyb3NvZnQgUmVzZWFyY2gKK1RoaXMgaXMgWjMgcmVsZWFzZSB2ZXJzaW9uIDQuNC4xCisKKyogKipSZXBvc2l0b3J5KiogW0dpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL1ozUHJvdmVyL3ozKQorCisqICoqR2V0IHNvdXJjZSBjb2RlKioKK2BgYHNoCisgZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9aM1Byb3Zlci96My5naXQKK2BgYAorCisqICoqR28gdG8qKiB0aGUgbG9jYWwgY2xvbmUgZGlyZWN0b3J5CitgYGBzaAorY2QgejMtZGlyZWN0b3J5CitgYGAKKworKiAqKkNvbmZpZ3VyYXRpb24qKgorICArIFVzaW5nIGNvbmZpZ3VyZQorCitgYGBzaAorCitleHBvcnQgTERGTEFHUz0iLUwvYy9tc3lzNjQvc3ltYmV4L2xpYiIKKworZXhwb3J0IExJQlM9Ii9jL21zeXM2NC9zeW1iZXgvbGliL2xpYmdtcC5hIgorCitleHBvcnQgWjNfSU5TVEFMTF9CSU5fRElSPS9jL21zeXM2NC9zeW1iZXgvYmluCitleHBvcnQgWjNfSU5TVEFMTF9MSUJfRElSPS9jL21zeXM2NC9zeW1iZXgvbGliCitleHBvcnQgWjNfSU5TVEFMTF9JTkNMVURFX0RJUj0vYy9tc3lzNjQvc3ltYmV4L2luY2x1ZGUKKworZXhwb3J0IExERkxBR1M9Ii1ML2MvbWluZ3cvc3ltYmV4L2xpYiIKKworZXhwb3J0IExJQlM9Ii9jL21pbmd3L3N5bWJleC9saWIvbGliZ21wLmEiCisKK2V4cG9ydCBaM19JTlNUQUxMX0JJTl9ESVI9L2MvbWluZ3cvc3ltYmV4L2JpbgorZXhwb3J0IFozX0lOU1RBTExfTElCX0RJUj0vYy9taW5ndy9zeW1iZXgvbGliCitleHBvcnQgWjNfSU5TVEFMTF9JTkNMVURFX0RJUj0vYy9taW5ndy9zeW1iZXgvaW5jbHVkZQorCisKKy4vY29uZmlndXJlIENYWD1nKysgQ0M9Z2NjIEFSPWFyIC0tc3RhdGljbGliIC0tc3RhdGljYmluIC0tb3B0aW1pemUgLS1ub29tcAorQ1hYPWcrKyBDQz1nY2MgQVI9YXIgLi9jb25maWd1cmUgLS1zdGF0aWNsaWIgLS1zdGF0aWNiaW4gLS1vcHRpbWl6ZSAtLW5vb21wIC0tbWFrZWZpbGVzCisKK0NYWD1nKysgQ0M9Z2NjIEFSPWFyIHB5dGhvbiBzY3JpcHRzL21rX21ha2UucHkgLS1zdGF0aWNsaWIgLS1zdGF0aWNiaW4gLS1vcHRpbWl6ZSAtLW5vb21wCitweXRob24gc2NyaXB0cy9ta19tYWtlLnB5IC0tc3RhdGljbGliIC0tc3RhdGljYmluIC0tb3B0aW1pemUgLS1ub29tcAorCitgYGAKKworICArIFVzaW5nIGNtYWtlCisKK2BgYHNoCisKK2NkIHozLWRpcmVjdG9yeQorCitnaXQgY2xlYW4gLW54IHNyYworZ2l0IGNsZWFuIC1meCBzcmMKKworcHl0aG9uIGNvbnRyaWIvY21ha2UvYm9vdHN0cmFwLnB5IGNyZWF0ZQorCisuL2NvbmZpZ3VyZSAtLXN0YXRpY2xpYiAtLXN0YXRpY2JpbiAtLW9wdGltaXplIC0tbm9vbXAKKworI3JtIC1yZmQgYnVpbGQKK21rZGlyIGJ1aWxkICYmIGNkIGJ1aWxkCisKK2NtYWtlIC1HICJVbml4IE1ha2VmaWxlcyIgLi4vCisKK21ha2UgLWo0ICMgUmVwbGFjZSA0IHdpdGggYW4gYXBwcm9wcmlhdGUgbnVtYmVyCisKK2BgYAorCisKKyogKipDb21waWxhdGlvbioqCitgYGBzaAorY2QgYnVpbGQKK21ha2UgLWo0CitgYGAKKworKiAqKmluc3RhbGxhdGlvbioqCitgYGBzaAorbWFrZSBpbnN0YWxsCitgYGAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvcmVzb3VyY2VzL2RvYy9SRUFETUUubWQgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3Jlc291cmNlcy9kb2MvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZjU3ODIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3Jlc291cmNlcy9kb2MvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjY1IEBACisjIFNFUCwgU3ltYm9saWMgRXhlY3V0aW9uIFBsYXRmb3JtOiBEb2N1bWVudGF0aW9uCitMYSBwYWx0ZWZvcm1lIGVzdCBjb25zdGl0dcOpZSBkZXMgcHJvamV0cyBzdWl2YW50czoKKworUHJvamV0ICAgICAgICAgICAgICAgICAgICAgICAgfCBEZXNjcml0cHRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgb3JnLmVjbGlwc2UuZWZtLnNlcC5kb2MgICAgICB8ICBEb2N1bWVudGF0aW9uLCBhcmNoaXRlY3R1cmUgZ8OpbsOpcmFsZQorIG9yZy5lY2xpcHNlLmVmbS5zZXAuY29tbW9uICAgfCAgRWzDqW1lbnRzIGNvbW11bnMKKyBvcmcuZWNsaXBzZS5lZm0uc2VwLmNvcmUgICAgIHwgIEVsw6ltZW50cyBkZSBiYXNlCisgb3JnLmVjbGlwc2UuZWZtLnNlcC5pbmZyYSAgICB8ICBJbmZyYXN0cnVjdHVyZSBkZSBkb25uw6llcworIG9yZy5lY2xpcHNlLmVmbS5zZXAuZmFtICAgICAgfCAgTW9kdWxlcyBkJ2FuYWx5c2UgZm9ybWFsbGUKKyBvcmcuZWNsaXBzZS5lZm0uc2VwLnNvbHZlciAgIHwgIFNlcnZpY2VzIGRlIHNvbHZlcgorIG9yZy5lY2xpcHNlLmVmbS5zZXAuZW5naW5lICAgfCAgTGUgbW90ZXVyCisgb3JnLmVjbGlwc2UuZWZtLnNlcC53b3JrZmxvdyB8ICBMZSB3b3JrZmxvdworCitDaGFxdWUgcHJvamV0IGVzdCBjb25zdGl0dcOpIGRlcyBzZWN0aW9ucyBzdWl2YW50ZToKKyogKipyZXF1aXJlKiogOj4gc2VzIGTDqXBlbmRhbmNlcyBleHRlcm5lcworKiAqKmltcG9ydCoqIDo+IHNlcyBkw6lwZW5kYW5jZXMgYXUgc2VpbiBkZSBsYSBTRVAKKyogKipleHBvcnQqKiA6PiBzZXMgc2VydmljZXMgcHJvcG9zw6llcworKiAqKmludGVybmFsKiogOj4gc2VzIMOpbMOpbWVudHMgaW50ZXJuZXMKKworCisjIyBvcmcuZWNsaXBzZS5lZm0uc2VwLmNvbW1vbgorVXRpbGl0YWlyZXMgY29tbXVucyDDoCB0b3VzIGxlcyBhdXRyZXMgY29tcG9zYW50cworCisjIyMgUmVxdWlyZQorCisKKyMjIyBJbXBvcnQKKworCisjIyMgRXhwb3J0CitzZXJ2aWNlcyBkZSBzw6lyaWFsaXNhdGlvbgorc2VydmljZXMgZGUgZ2VzdGlvbiBkZSB0cmFjZSBkZSBtaXNlIGF1IHBvaW50CisKKyMjIyBJbnRlcm5hbAorTGVzIGTDqXRhaWxzIGQnaW1wbMOpbWVudGF0aW9uIGludGVybmUgIQorCisKKyMjIG9yZy5lY2xpcHNlLmVmbS5zZXAuY29yZQorCisjIyMgUmVxdWlyZQorCisKKyMjIyBJbXBvcnQKKyogKipvcmcuZWNsaXBzZS5lZm0uc2VwLmNvbW1vbioqCisKKyMjIyBFeHBvcnQKKyogU21hcnQtUG9pbnRlcgorCisKKyMjIyBJbnRlcm5hbAorTGVzIGTDqXRhaWxzIGQnaW1wbMOpbWVudGF0aW9uIGludGVybmUgIQorCisKKyMjIG9yZy5lY2xpcHNlLmVmbS5zZXAuaW5mcmEKK0luZnJhc3RydWN0dXJlIHBvdXIgbCdleMOpY3V0aW9uIHN5bWJvbGlxdWUKKworIyMjIFJlcXVpcmUKKworIyMjIEltcG9ydAorKiAqKm9yZy5lY2xpcHNlLmVmbS5zZXAuY29tbW9uKioKKyogKipvcmcuZWNsaXBzZS5lZm0uc2VwLmNvcmUqKgorCisKKyMjIyBFeHBvcnQKKyogRXhwcmVzc2lvbgorKiBJbnN0cnVjdGlvbgorKiBFQzogRXhlY3V0aW9uIENvbnRleHQKKyogRUQ6IEV4ZWN1dGlvbiBEYXRhCisqIEVWQUw6IEV2YWx1YXRpb24gRW52aXJvbm5lbWVudAorKiBFWEVDOiBFeGVjdXRpb24gRW52aXJvbm5lbWVudAorCisjIyMgSW50ZXJuYWwKK0xlcyBkw6l0YWlscyBkJ2ltcGzDqW1lbnRhdGlvbiBpbnRlcm5lICEKKworCisjIyBvcmcuZWNsaXBzZS5lZm0uc2VwLmZhbQorTW9kdWxlIGQnQW5hbHlzZSBGb3JtZWxsZQorCisjIyMgUmVxdWlyZQorCisjIyMgSW1wb3J0CisqICoqb3JnLmVjbGlwc2UuZWZtLnNlcC5jb21tb24qKgorKiAqKm9yZy5lY2xpcHNlLmVmbS5zZXAuY29yZSoqCisgICsgU21hcnQtUG9pbnRlcgorCisjIyMgRXhwb3J0CisKKyMjIyMgSUZBTTogSW50ZXJmYWNlIG9mIEZvcm1hbCBBbmFseXNpcyBNb2R1bGUKK0MnZXN0IGwnaW50ZXJmYWNlIHF1ZSBkb2l0IGltcGzDqW1lbnRlciB0b3V0IE1vZHVsZSBkJ0FuYWx5c2UgRm9ybWVsbGUuCitJbCBmb3Vybml0IGRlcyBzZXJ2aWNlcyBwb3VyIGludGVydmVuaXIgZGFucyBsZXMgZGlmZsOpcmVudGVzIHBoYXNlcyBkdSBTRVcsIFN5bWJvbGljIEV4ZWN1dGlvbiBXb3JrZmxvdywgw6Agc2F2b2lyOgorCisqICoqY29uZmlndXJlKiosIE1BTkRBVE9SWQorCSsgRMOpZmluaXQgKGV0IHbDqXJpZmllPykgZGFucyBxdWVsbGUgcGhhc2UgZHUgKlNFLVdvcmtmbG93KiBpbCB2YSBpbnRlcnZlbmlyCisJKyBQcmlzZSBlbiBjb21wdGUgbGEgY29uZmlndXJhdGlvbiBmb3Vybml0IHBhciBsJ3V0aWxpc2F0ZXVyLCBkw6lmaW5pIGRhbnMgc29uICoqZmljaGllci5zZXcqKiAoYW5jaWVubW1lbnQgKmZpY2hpZXIuZmF2bSopCisKKyogKipwcmVwcm9jZXNzKiosIE9QVElPTkFMLCBzJ2lsIGEgdW4gdHJhaXRlbWVudCDDoCBlZmZlY3R1ZXIsIGVuICpwcmVwcm9jZXNzaW5nKiwgaS5lLiBhdmFudCBsYSBwaGFzZSBkeW5hbWlxdWUgZHUgcHJvY2Vzc3VzIERpdmVyc2l0eQorKiAqKnBvc3Rwcm9jZXNzKiosIE9QVElPTkFMLCBzJ2lsIGEgdW4gdHJhaXRlbWVudCDDoCBlZmZlY3R1ZXIsIGVuICpwb3N0cHJvY2Vzc2luZyosIGkuZS4gYXByw6hzIGxhIHBoYXNlIGR5bmFtaXF1ZSBkdSBwcm9jZXNzdXMgRGl2ZXJzaXR5CisKKyogKipwcmVmaWx0ZXIqKiwgT1BUSU9OQUwsIHMnaWwgYSB1biB0cmFpdGVtZW50IMOgIGVmZmVjdHVlciwgZW4gKnByZWZpbHRlcmluZyosIGkuZS4gcGVuZGFudCBsYSBwaGFzZSBkeW5hbWlxdWUgZHUgcHJvY2Vzc3VzIERpdmVyc2l0eSAsIG1haXMgYXZhbnQgbCdleMOpY3V0aW9uIHN5bWJvbGlxdWUgcHJvcHJlbWVudCBkaXRlCisKKyogKipwb3N0ZmlsdGVyKiosIE9QVElPTkFMLCBzJ2lsIGEgdW4gdHJhaXRlbWVudCDDoCBlZmZlY3R1ZXIsIGVuICpwb3N0ZmlsdGVyaW5nKiwgaS5lLiBwZW5kYW50IGxhIHBoYXNlIGR5bmFtaXF1ZSBkdSBwcm9jZXNzdXMgRGl2ZXJzaXR5ICwgbWFpcyBhcHLDqHMgbCdleMOpY3V0aW9uIHN5bWJvbGlxdWUgcHJvcHJlbWVudCBkaXRlCisKKworKiAqKnJlcG9ydCoqLCBPUFRJT05BTCwgcG91ciBwcm9wb3NlciB1biBiaWxhbiBkZSBsJ2FuYWx5c2UgZm9ybWVsbGUgZWZmZWN0dcOpZQorCitTb2l0IHBhciBleGVtcGxlOgorCitgYGBjcHAKK2NsYXNzIE15RkFNIDogcHVibGljIEF1dG9SZWdpc3RlcmVkRkFNPCBNeUZBTSA+LAoreworCS8vIE1BTkRBVE9SWSBmb3IgU21hcnQgUG9pbnRlciBzZXJ2aWNlcworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBNeUZBTSApCisKKwkvKioKKwkgKiBNeUZBTQorCSAqIGZvciBhdXRvbWF0aWMgcmVnaXN0cmF0aW9uIGluIHRoZSBGQU0gcmVwb3NpdG9yeQorCSAqIHRoZSBVRklEIGtleQorCSAqIG5lZWQgZm9yIGluc3RhbmNpYXRpb24gZnJvbSB0aGUgU0VXIHNwZWNpZmljYXRpb24gZmlsZQorCSAqLworCUFWTV9JTkpFQ1RfQVVUT19SRUdJU1RFUl9VRklEX0tFWSggIk15RkFNIiApCisJLy8gZW5kIHJlZ2lzdHJhdGlvbgorCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQVRUUklCVVRFCisJICovCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqLworCU15RkFNKENlbnRyYWxQcm9jZXNzb3JVbml0ICYgYU1hbmFnZXIsIEZvcm0gKiBhUGFyYW1ldGVyRm9ybSkKKwk6IEF1dG9SZWdpc3RlcmVkRkFNKGFNYW5hZ2VyLCBhUGFyYW1ldGVyRm9ybSwKKwkJQVZNX1BSRV9GSUxURVJJTkdfU1RBR0UgfCBBVk1fUE9TVF9GSUxURVJJTkdfU1RBR0UsIC4uLiksCisKKwkvKioKKwkgKiBDT05GSUdVUkUKKwkgKi8KKwlib29sIGNvbmZpZ3VyZUltcGwoKTsKKworCS8qKgorCSAqIFJFUE9SVCBUUkFDRQorCSAqLworCXZpcnR1YWwgdm9pZCByZXBvcnREZWZhdWx0KEF2bU9zdHJlYW0gJiBvcykgY29uc3Q7CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gUFJPQ0VTU0lORyBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkvKioKKwkgKiBwcmVQcm9jZXNzaW5nCisJICovCisJdmlydHVhbCBib29sIHByZXByb2Nlc3MoKTsKKworCS8qKgorCSAqIHBvc3Rwcm9jZXNzaW5nCisJICovCisJdmlydHVhbCBib29sIHBvc3Rwcm9jZXNzKCk7CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gRklMVEVSSU5HIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCS8qKgorCSAqIHByZUZpbHRlcmluZworCSAqLworCXZpcnR1YWwgYm9vbCBwcmVmaWx0ZXIoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpOworCisJLyoqCisJICogcG9zdEZpbHRlcmluZworCSAqIEV2ZXJ5IHBvc3QgZmlsdGVyIGhhcyB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QKKwkgKi8KKwl2aXJ0dWFsIGJvb2wgcG9zdGZpbHRlcihFeGVjdXRpb25Db250ZXh0ICogYW5FQyk7Cit9OworCitgYGAKKworCisjIyMjIENQVTogQ2VudHJhbCBQcm9jZXNzb3IgVW5pdAorQydlc3QgbGUgc2NoZWR1bGVyIHF1aSBnw6hyZSBsJ2FjdGl2YXRpb24gbGVzIEZBTXMgZGFucyBsZXMgZGlmZsOpcmVudGVzIHBoYXNlcyBkZSBsJ2V4w6ljdXRpb24gKHZvaXIgKnNlY3Rpb24gTU9FKiBkYW5zIGxlICpmaWNoaWVyIFNFVy9GQVZNKiBkZSBzcMOpY2lmaWNhdGlvbiBkdSB3b3JrZmxvdykKKworIyMjIyBNUFU6IE1haW4gUHJvY2Vzc29yIFVuaXQKK0MnZXN0IGxlIEZBTSBwcmluY2lwYWwsIHRvdWpvdXJzIGFjdGlmLCBheWFudCBsYSBjaGFyZ2UgZGUKKworKiBnw6lyZXIgbGVzICJjcml0w6hyc2UgZCdhcnLDqnRzIiAodm9pciAqZmljaGllciBTRVcvRkFWTSogZGFucyBsZSBmaWNoaWVyCisqIGTDqXRlY3RlciBsZXMgKmRlYWRsb2NrcyogZCdleMOpY3V0aW9uIChub2V1ZCBzYW5zIGZpbHMgZW4gKnBvc3RwcmVmaWx0ZXJpbmcqKQorKiBkaXZlcnNlcyB0cmFpdGVtZW50ZW50cyBpbnRlcm5lcywgdGVsIGwnYXR0cmlidXRpb24gZCd1biBpZGVudGlmaWFudCAobnVtw6lybykgZGUgbGFyZ2V1ciBkYW5zIGxlIGdyYXBoZSBkJ2V4w6ljdXRpb24KKyogLi4uCisKKworIyMjIyBTb21lIEZBTXMKKyogRkFNIENvdmVyYWdlIChzdGF0ZSAvIHRyYW5zaXRpb24gLS0gaW5wdXQgLyBvdXRwdXQsIC4uLikgOnBvdXIgbGVzIGFuYWx5c2VzIGTDqWRpw6llcyBjb3V2ZXJ0dXJlcyBzdHJ1Y3R1cmVsbGVzIGRlcyBtb2TDqGxlcworKiBGQU0gSGl0IG9yIEp1bXAgOiBwb3VyIGxhIHPDqWxlY3Rpb24gZGUgY29tcG9ydGVtZW50IMOgIHBhcnRpciBkZSB0cmFjZSBmb3VybmllIHBhciBsJ3V0aWxpc2F0ZXVyCisqIEZBTSBUZXN0aW5nIChPbmxpbmUgLyBPZmZsaW5lKSA6IHBvdXIgY2FsY3VsZXIgdW4gdmVyZGljdCBhc3NvY2nDqSDDoCB1biAqb2JqZWN0aWYgZGUgdGVzdCogZW4gbW9kZSAqb25saW5lL29mZmxpbmUqCisKKyMjIyBJbnRlcm5hbAorTGVzIGTDqXRhaWxzIGQnaW1wbMOpbWVudGF0aW9uIGludGVybmUgIQorCisKKyMjIG9yZy5lY2xpcHNlLmVmbS5zZXAuc29sdmVyCisKKyMjIyBSZXF1aXJlCisqIENWQzQsIGxlIHNvbHZlciBkZSBsJ3VuaXZlcnNpdMOpIGRlIE5ldyBZb3JrIGjDqWJlcmfDqSBbaWNpXShodHRwOi8vY3ZjNC5jcy5ueXUuZWR1L3dlYi8pIGV0IHN1ciBHaXRodWIgW2ljaV0oaHR0cHM6Ly9naXRodWIuY29tL0NWQzQvQ1ZDNCkKKyogWjMsIGxlIHNvbHZlciBvcGVuLXNvdXJjZSBkZSBNaWNyb3NvZnQgaMOpYmVyZ8OpIFtpY2ldKGh0dHBzOi8vZ2l0aHViLmNvbS9aM1Byb3Zlci96My93aWtpKSBldCBzdXIgR2l0aHViIFtpY2ldKGh0dHBzOi8vZ2l0aHViLmNvbS9aM1Byb3Zlci96MykKKworIyMjIEltcG9ydAorKiAqKm9yZy5lY2xpcHNlLmVmbS5zZXAuY29tbW9uKioKKyAgKyBPdXRpbHMgZGUgbWlzZSBhdSBwb2ludAorCisqICoqb3JnLmVjbGlwc2UuZWZtLnNlcC5jb3JlKioKKyAgKyBTbWFydC1Qb2ludGVyCisKKyogKipvcmcuZWNsaXBzZS5lZm0uc2VwLmluZnJhKioKKyAgKyBFeHByZXNzaW9uCisKKyMjIyBFeHBvcnQKKyoqb3JnLmVjbGlwc2UuZWZtLnNlcC5zb2x2ZXIuSVNvbHZlcioqIGTDqWZpbmkgbCdpbnRlcmZhY2UgZGVzIHNlcnZpY2VzIGF0dGVuZHVzIGQndW4gc29sdmVyLCBwb3VyIHVuIHByw6lkaWNhdCBib29sw6llbiBkb25uw6ksIHRlbDoKKyogKipjaGVja1NhdGlzZmlhYmlsaXR5KCkqKiBwb3VyIHbDqXJpZmllciAob3UgKmNoZWNrZXIqKSBzYSBzYXRpc2ZpYWJpbGl0w6kgaS5lLgorICArIFNBVCwgc2F0aXNmaWFibGUKKyAgKyBVTlNBVCwgbm9uLXNhdGlzZmlhYmxlCisgICsgQUJPUlQsIMOpY2hlYyAocGFyIGFiYW5kb24pIGRlIGxhIHbDqXJpZmljYXRpb24KKyAgKyBVTktOT1dOLCBzYXRpc2ZpYWJpbGl0w6kgaW5jb25udSAhCisqICoqY2hlY2tNb2RlbCgpKiogcG91ciBvYnRlbmlyLCBzaSBwb3Nzc2libGUsIHVuIG1vZMOobGUgY29uY3LDqHQgbGEgdmFsaWRhbnQKKworKipvcmcuZWNsaXBzZS5lZm0uc2VwLnNvbHZlci5Tb2x2ZXJGYWN0b3J5KiogZXN0IHVuZSBmYWN0b3J5IHBlcm1ldHRhbnQ6CisqIGwnaW5zdGFuY2lhdGlvbiBkJ3VuIHNvbHZlciBwYXJpY3VsaWVyLAorKiBsJ2FjY8OocyBhdSBzb2x2ZXIgaW5zdGFuY2nDqSBwYXIgZMOpZmF1dC4KKworIyMjIEludGVybmFsCitMZXMgZMOpdGFpbHMgZCdpbXBsw6ltZW50YXRpb24gaW50ZXJuZSAhCisKKworIyMgb3JnLmVjbGlwc2UuZWZtLnNlcC5lbmdpbmUKK0luc3RhbmNpZSBldCBleMOpY3V0ZSBsYSBwbGF0ZWZvcm1lIGQnYW5hbHlzZSBzeW1ib2xpcXVlIGTDqWZpbmllIGRhbnMgbGUgKndvcmtmbG93KgorCisjIyMgUmVxdWlyZQorKiBSaWVuCisKKyMjIyBJbXBvcnQKKyoqb3JnLmVjbGlwc2UuZWZtLnNlcC4qKgorKiB0b3VzIGxlcyBhdXRyZXMgY29tcG9zYW50cyBkZSBsYSBwbGF0ZWZvcm1lIFNFUC4KKworIyMjIEV4cG9ydAorTCdleMOpY3V0YWJsZSByw6lzdWx0YW50CisKKyMjIyBJbnRlcm5hbAorTGVzIGTDqXRhaWxzIGQnaW1wbMOpbWVudGF0aW9uIGludGVybmUgIQorKiBDUFU6IENlbnRyYWwgUHJvY2Vzc29yIFVuaXQKKyogTVBVOiBNYWluIFByb2Nlc3NvciBVbml0CisKKworIyMgb3JnLmVjbGlwc2UuZWZtLnNlcC4KKworIyMjIFJlcXVpcmUKKworCisjIyMgSW1wb3J0CisKKworIyMjIEV4cG9ydAorCisKKyMjIyBJbnRlcm5hbAorTGVzIGTDqXRhaWxzIGQnaW1wbMOpbWVudGF0aW9uIGludGVybmUgIQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9yZXNvdXJjZXMvZG9jL1NZTUJPTElDX0VYRUNVVElPTl9XT1JLRkxPVy5tZCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvcmVzb3VyY2VzL2RvYy9TWU1CT0xJQ19FWEVDVVRJT05fV09SS0ZMT1cubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNkZTM5NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvcmVzb3VyY2VzL2RvYy9TWU1CT0xJQ19FWEVDVVRJT05fV09SS0ZMT1cubWQKQEAgLTAsMCArMSwzMTMgQEAKKyMgU0VXLCBTeW1ib2xpYyBFeGVjdXRpb24gV29ya2Zsb3cgU3BlY2lmaWNhdGlvbgorCisjIyAgQ2xhc3MgV29ya2Zsb3cKKyogKip3b3Jrc3BhY2UqKiBhcyBWaXJ0dWFsIEZpbGUgU3lzdGVtIGZvciB0aGUgV29ya2Zsb3cKKyogKipwcm9qZXQqKiBhcyB0aGUgc3BlY2lmaWNhdGlvbgorKiAqKmpvYioqIGFzIGFuYWx5c2lzIGpvYnMKKworYGBgc2V3CisKK1dvcmtmbG93IDxzZXctaWQ+ICI8ZGVzY3JpcHRpb24+IG9mIHRoZSBTeW1ib2xpYyBFeGVjdXRpb24gV29ya2Zsb3ciIHsKKwl3b3Jrc3BhY2UgeworCQkvLy4uLgorCX0KKworCXByb2plY3QgeworCQkvLy4uLgorCX0KKworCS8vIERlZmF1bHQgSm9iCisJam9iID0gSm9iIDxpZD4gIjxkZXNjcmlwdGlvbj4iIHsKKwkJLy8gLi4uCisJfQorCisJLy8gQWRkaXRpb25hbCBKb2IKKwlqb2IgKz0gSm9iIDxpZD4gIjxkZXNjcmlwdGlvbj4iIHsKKwkJLy8gLi4uCisJfQorCisJLyoKKwlzb3AgOiBTZXF1ZW5jZQorCSAgICB8IFBhcmFsbGVsCisJKi8KKwlzY2hlZHVsZXIgPSA8c29wPiB7CisJCXN0YXJ0IDxqb2QtaWQtMT4KKwkJc3RhcnQgPGpvZC1pZC0xPgorCX0KK30KKworYGBgCisKKworIyMjIENsYXNzIFdvcmtzcGFjZQorKiAqKnJvb3QqKiBhcyB3b3Jrc3BhY2UgbmF0aXZlIGZpbGUgc3lzdGVtIHBhdGgKKyogKipzb3VyY2UqKiBhcyB3b3Jrc3BhY2Ugc291cmNlIGZvbGRlcgorKiAqKm91dHB1dCoqIGFzIHdvcmtzcGFjZSBvdXRwdXQgZm9sZGVyCisqICoqbG9nKiogYXMgd29ya3NwYWNlIG91dHB1dCBsb2cgZm9sZGVyCisKK2BgYHNldworCit3b3Jrc3BhY2UgeworCS8vIENoZW1pbiBhYnNvbHUgb3UgcmVsYXRpZiAoYXUgZG9zc2llciBkZSBsYW5jZW1lbnQhKSBkdSBwcm9qZXQgU0VXCisJcm9vdCA9IDxwYXRoPgorCS8vIENoZW1pbiByZWxhdGlmIMOgIEBwcm9qZWN0IChvdSBhYnNvbHUhKSBkdSBkb3NzaWVyIGNvbnRlbmFudCBsZXMgZmljaGllcnMgWEZTUAorCXNvdXJjZSA9IDxwYXRoPgorCS8vIENoZW1pbiByZWxhdGlmIMOgIEBwcm9qZWN0IChvdSBhYnNvbHUhKSBkdSBkb3NzaWVyIHByaW5jaXBhbCBkZXMgZmljaGllcnMgZ8OpbsOpcsOpcyBwYXIgRElWRVJTSVRZCisJb3V0cHV0ID0gPHBhdGg+CisJLy8gQ2hlbWluIHJlbGF0aWYgw6AgQG91dHB1dCAob3UgYWJzb2x1ISkgZHUgZG9zc2llciBkZXMgZmljaGllcnMgbG9nIGV0IGRlYnVnCisJbG9nID0gPHBhdGg+Cit9CisKK2BgYAorCisKKyMjIyBDbGFzcyBQcm9qZWN0CisKK2BgYHNldworCitwcm9qZWN0IHsKKwkvLyAuLi4KK30KKworYGBgCisKKworCisKKyMjIyBDbGFzcyBTQUosIFN5bWJvbGljIEFuYWx5c2lzIEpvYgorKiAqKnN0cmVhbSoqIGFzIGRlZmF1bHQgaW50ZXJhY3Rpb24gc3RyZWFtcworKiAqKnByb2plY3QqKiBhcyBhbmFseXplZCBzcGVjaWZpY2F0aW9uCisqICoqc2VyaWFsaXplcioqIGFzIGRlZmF1bHQgc2VyaWFsaXplcnMKKyogKipmYW0qKiBhcyBGb3JtYWwgQW5hbHlzaXMgTW9kdWxlCisKKworYGBgc2V3CisKKwlzdHJlYW0geworCQkvLyAuLi4KKwl9CisKKwlwcm9qZWN0IHsKKwkJLy8uLi4KKwl9CisKKwltYWluID0gTWFpbkFuYWx5c2lzTW9kdWxlIDxpZD4gIjxkZXNjcmlwdGlvbj4gb2YgdGhlIE1haW4gQW5hbHlzaXMgTW9kdWxlIiB7CisJCS8vIC4uLgorCX0KKworCXNlcmlhbGl6ZXIgPSBHcmFwaFZpelN0YXRlbWFjaGluZVNlcmlhbGl6ZXIgPGlkPiAiPGRlc2NyaXB0aW9uPiIgeworCQkvLyAuLi4KKwl9CisKKwlzZXJpYWxpemVyID0gR3JhcGhWaXpFeGVjdXRpb25HcmFwaFNlcmlhbGl6ZXIgPGlkPiAiPGRlc2NyaXB0aW9uPiIgeworCQkvLyAuLi4KKwl9CisKKworCWZhbSArPSBTdGF0ZVRyYW5zaXRpb25Db3ZlcmFnZU1vZHVsZSAiU3RhdGUvVHJhbnNpdGlvbiBDb3ZlcmFnZSBBbmFseXNpcyBNb2R1bGUiIHsKKwkJLy8gLi4uCisJfQorCisJZmFtICs9IEhpdE9ySnVtcE1vZHVsZSAiSGl0IG9yIEp1bXAgQW5hbHlzaXMgTW9kdWxlIiB7CisJCS8vIC4uLgorCX0KKworCisJZmFtICJGb3JtYWwgQW5hbHlzaXMgTW9kdWxlIiA9IGhpdG9yanVtcCB7CisJCS8vICJQcm9jZXNzb3IiIGRlIGdlc3Rpb24gZGVzIGNyaXTDqHJlcyBkJ2FycsOqdCBhYnNvbHVzIChwYXJhbcOodHJlcyB1dGlsaXNhdGV1cikKKwkJbWFpbiB7CisJCQlAcHJvcGVydHk6CisKKwkJCWxvZzoKKworCQkJZGVidWcgeworCisJCQl9CisKKwkJCXF1ZXVlIHsKKworCQkJfQorCQl9CisJfQorCit9CisKK2BgYAorCisjIyMjIENsYXNzIFN0cmVhbQorKiAqKnN0ZGluKiogYXMgU3RhbmRhcmQgSW5wdXQgU3RyZWFtCisqICoqc3Rkb3V0KiogYXMgU3RhbmRhcmQgT3V0cHV0IFN0cmVhbQorKiAqKnN0ZGVycioqIGFzIFN0YW5kYXJkIEVycm9yIFN0cmVhbQorCisqICoqcHJvamVjdCoqIGFzIG1vZGVsIHNwZWNpZmljYXRpb24KKworCitgYGBzZXcKKworc3RyZWFtIHsKKwkvKgorCXVyaSA6IHN0ZCAgICAgICI6OiIgKCAnY291dCcgfCAnY2VycicgfCAnY2luJyAgKQorCSAgICB8IHNldyAgICAgICI6OiIgKCAnbG9nJyAgfCAndHJhY2UnICkKKwkgICAgfCBmb2xkZXIgICAiOjoiIDxwYXRoPgorCSAgICB8IGZpbGUgICAgICI6OiIgPHBhdGg+CisJICAgIHwgZmlsZW5hbWUgIjo6IiA8cGF0aD4KKwkgICAgfCBzb2NrZXQgICAiOjoiIDxob3N0LWlkPiAiOiIgPHBvcnQtbnVtYmVyPgorCSovCisJc3RkaW4gID0gPHVyaT4KKwlzdGRvdXQgPSA8dXJpPgorCXN0ZGVyciA9IDx1cmk+CisKKwkvLyAuLi4KK30KKworYGBgCisKKworIyMjIyBDbGFzcyBQcm9qZWN0CisqICoqbW9kZWwqKiBhcyBGb3JtYWxNTCBDb25jcmV0ZSBTeW50YXggbW9kZWwKKworYGBgc2V3CisKK3Byb2plY3QgeworCS8vIENoZW1pbiByZWxhdGlmIMOgIEB3b3Jrc3BhY2U6OnNvdXJjZSAob3UgYWJzb2x1ISkKKwltb2RlbCA9IDxGb3JtYWxNTC1Db25jcmV0ZS1TeW50YXguZm1sPgorCisJLy8gLi4uCit9CisKK2BgYAorCisjIyMjIENsYXNzIEZBTSwgRm9ybWFsIEFuYWx5c2lzIE1vZHVsZS9QbHVnaW4KKyogKipwcmlvcml0eSoqIGFzICpzY2hlZHVsZXIgcHJpb3JpdHkqIGluIHRoZSB3b3JrZmxvdworCitgYGBzZXcKKworZmFtICs9IENvdmVyYWdlRkFNICJUcmFuc2l0aW9uIENvdmVyYWdlIEFuYWx5c2lzIE1vZHVsZSIgeworCXByaW9yaXR5ICB7CisJCS8vIC4uLgorCX0KK30KKworYGBgCisKKworIyMjIyMgQ2xhc3MgUHJpb3JpdHkKKyogKipwcmVwcm9jZXNzKiogYXMgcHJlcHJvY2Vzc2luZyB0aHJlYWQgcHJpb3JpdHkKKyogKipwcmVmaWx0ZXIqKiBhcyBwcmVmaWx0ZXJpbmcgdGhyZWFkIHByaW9yaXR5CisqICoqcG9zdGZpbHRlcioqIGFzIHBvc3RmaWx0ZXJpbmcgdGhyZWFkIHByaW9yaXR5CisqICoqcG9zdHByb2Nlc3MqKiBhcyBwb3N0cHJvY2Vzc2luZyB0aHJlYWQgcHJpb3JpdHkKKworYGBgc2V3CisKK3ByaW9yaXR5IHsKKwlwcmVwcm9jZXNzICA9IDxpbnRlZ2VyPgorCXByZWZpbHRlciAgID0gPGludGVnZXI+CisJcG9zdGZpbHRlciAgPSA8aW50ZWdlcj4KKwlwb3N0cHJvY2VzcyA9IDxpbnRlZ2VyPgorCisJLy8gLi4uCit9CisKK2BgYAorCisKKyMjIyMgQ2xhc3MgTWFpbkFuYWx5c2lzTW9kdWxlCisqICoqcXVldWUqKiBhcyBTeW1ib2xpYyBFeGVjdXRpb24gUXVldWUKKyogKipsaW1pdCoqIGFzIFN5bWJvbGljIEV4ZWN1dGlvbiBQcm9jZXNzaW5nIExpbWl0CisKK2BgYHNldworCittYWluICs9IE1haW5BbmFseXNpc01vZHVsZSA8aWQ+ICI8ZGVzY3JpcHRpb24+IG9mIHRoZSBNQU0iICB7CisJcXVldWUgPGlkPiAiU3ltYm9saWMgRXhlY3V0aW9uIFF1ZXVlIiB7CisJCS8vIC4uLgorCX0KKworCWxpbWl0IDxpZD4gIlN5bWJvbGljIEV4ZWN1dGlvbiBQcm9jZXNzaW5nIExpbWl0IiB7CisJCS8vIC4uLgorCX0KKworCS8vIE5vbWJyZSBkZSBub2V1ZCBNQVhJTUFMICgtMSA8PT4gbm8tbGltaXQpIGRlIGwnYXJicmUgZCfDqXZhbHVhdGlvbiBzeW1ib2xpcXVlCisJbm9kZSA9IDxpbnRlZ2VyPgorCisJLy8gTm9tYnJlIGRlIHBhcyBkZSBjYWxjdWwgTUFYSU1BTCAoLTEgPD0+IG5vLWxpbWl0KSBkdSBtb3RldXIgZCfDqXZhbHVhdGlvbiBzeW1ib2xpcXVlCisJQGV2YWwgPSA8aW50ZWdlcj47CisKKwkvLyBIYXV0ZXVyIE1BWElNQUxFCisJQGhlaWdodCA9IDxpbnRlZ2VyPjsKKworCS8vIExhcmdldXIgTUFYSU1BTEUKKwlAd2lkdGggID0gPGludGVnZXI+OworCisJLy8gLi4uCit9CisKK2BgYAorCisjIyMjIyBDbGFzcyBRdWV1ZQorKiAqKnBvbGljeSoqIGFzICplbnF1ZXVlL2RlcXVldWUgcG9saWN5KiBvZiB0aGUgcXVldWUKKworYGBgc2V3CisKK3F1ZXVlIDxpZD4gIjxkZXNjcmlwdGlvbj4gb2YgdGhlIFN5bWJvbGljIEV4ZWN1dGlvbiBRdWV1ZSIgeworCS8qCisJJ0JGUycgfCAnQlJFQURUSF9GSVJTVF9TRUFSQ0gnCisJJ0RGUycgfCAnREVQVEhfRklSU1RfU0VBUkNIJworCSdSRlMnIHwgJ1JBTkRPTV9GSVJTVF9TRUFSQ0gnCisJJ1dFSUdIVDo6eyBERlMgfCBCRlMgfCBSRlMgfCBYRlMgfScKKwkqLworCXBvbGljeSA9IDxwb2xpY3k+CisKKwkvLyAuLi4KK30KKworYGBgCisKKworIyMjIyBDbGFzcyBTZXJpYWxpemVyCisKKyMjIyMjIENsYXNzIEdyYXBoVml6U3RhdGVtYWNoaW5lU2VyaWFsaXplcgorCitgYGBzZXcKKworc2VyaWFsaXplciArPSBHcmFwaFZpelN0YXRlbWFjaGluZVNlcmlhbGl6ZXIgPGlkPiAiPGRlc2NyaXB0aW9uPiIgeworCS8vIC4uLgorfQorCitgYGAKKworIyMjIyMgQ2xhc3MgR3JhcGhWaXpFeGVjdXRpb25HcmFwaFNlcmlhbGl6ZXIKKworYGBgc2V3CisKK3NlcmlhbGl6ZXIgKz0gR3JhcGhWaXpFeGVjdXRpb25HcmFwaFNlcmlhbGl6ZXIgPGlkPiAiPGRlc2NyaXB0aW9uPiIgeworCS8vIC4uLgorfQorCitgYGAKKworCisjIyMjIENsYXNzIFN0YXRlVHJhbnNpdGlvbkNvdmVyYWdlTW9kdWxlCisKK2BgYHNldworCitmYW0gKz0gU3RhdGVUcmFuc2l0aW9uQ292ZXJhZ2VNb2R1bGUgIlN0YXRlL1RyYW5zaXRpb24gQ292ZXJhZ2UgQW5hbHlzaXMgTW9kdWxlIiB7CisJLy8gLi4uCit9CisKK2BgYAorCisKKyMjIyMgQ2xhc3MgSGl0T3JKdW1wTW9kdWxlCisKK2BgYHNldworCitmYW0gKz0gSGl0T3JKdW1wTW9kdWxlIDxpZD4gIjxkZXNjcmlwdGlvbj4iIHsKKwkvLyAuLi4KK30KKworYGBgCisKKworCisKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvQ01ha2VMaXN0cy50eHQgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGRjMTIxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwyNCBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKyMgICAgICAgICAgICAgICAgICAgIENNYWtlIE1hc3RlciBGaWxlIGZvciBTeW1iZXggQnVpbGQNCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorIw0KKyMgTm90ZSA6IFRoaXMgZmlsZSBkZWZpbmVzIHRoZSB3aG9sZSBwcm9jZXNzIA0KKyMNCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorDQorIyBNaW5pbXVtIHJlcXVpcmVkIENNYWtlIHZlcnNpb24NCitjbWFrZV9taW5pbXVtX3JlcXVpcmVkIChWRVJTSU9OIDIuOCBGQVRBTF9FUlJPUikNCisNCisjIFRlbGwgY21ha2Ugd2hlcmUgdG8gZmluZCBpdHMgb3duIG1vZHVsZXMNCitsaXN0IChBUFBFTkQgQ01BS0VfTU9EVUxFX1BBVEggJHtDTUFLRV9TT1VSQ0VfRElSfS9jbWFrZSkgIyBDb21tb24gbW9kdWxlcw0KK2xpc3QgKEFQUEVORCBDTUFLRV9NT0RVTEVfUEFUSCAke0NNQUtFX1NPVVJDRV9ESVJ9L3NyYy9jbWFrZSkgICAgIyBTcGVjaWZpYyBtb2R1bGVzDQorDQorIyBQcmludCB0aXRsZSBiYW5uZXINCitzZXQgKEJBTk5FUl9NRVNTQUdFICJUaGlzIGlzIFN5bWJleCBCdWlsZCBTeXN0ZW0iKQ0KK2luY2x1ZGUgKFByaW50QmFubmVyKQ0KKw0KKyMgR2VuZXJhdGluZyBpbmZvcm1hdGlvbiBoZWFkZXJzDQoraW5jbHVkZSAoR2VuZXJhdGVJbmZvSGVhZGVycykNCisNCisjIFByb2plY3QgZGVmaW5pdGlvbiAoZGlyZWN0b3JpZXMgaGllcmFyY2h5LCBtYWluIHRhcmdldCBzb3VyY2VzLCBsaW5rKQ0KK2luY2x1ZGUgKERlZmluZVN5bWJleFByb2plY3QpDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvR1VJREVMSU5FUy5tZCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL0dVSURFTElORVMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM2YzU5ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL0dVSURFTElORVMubWQKQEAgLTAsMCArMSw2IEBACisjIEVGTS1TWU1CRVggOiBFY2xpcHNlIEZvcm1hbCBNb2RlbGluZyAtIFN5bWJvbGljIEV4ZWN1dGlvbiBQbGF0Zm9ybQorCisjIyBSdWxlcworCisqIE91dHB1dCBzdHJlYW0gZm9yIGxpdmUgZGVidWdnaW5nIDogQVZNX09TX0RFQlVHCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL1JFQURNRS5tZCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzhlNmRmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNTEgQEAKKyMgRUZNLVNZTUJFWCA6IEVjbGlwc2UgRm9ybWFsIE1vZGVsaW5nIC0gU3ltYm9saWMgRXhlY3V0aW9uIFBsYXRmb3JtCisKKyMjIFNvdXJjZSBjb2RlIHN0cnVjdHVyZQorCisKKyMjIyBQYWNrYWdlICpiYXNlKgorW0Jhc2UgQ2xhc3Nlc10oYmFzZS9SRUFETUUubWQpCisKKworIyMjIFBhY2thZ2UgKmNvbW1vbioKK1tDb21tb24gQ2xhc3Nlc10oY29tbW9uL1JFQURNRS5tZCkKKworCisjIyMgUGFja2FnZSAqY29yZSoKKworW0NvcmUgQ2xhc3Nlc10oY29yZS9SRUFETUUubWQpCisKKworIyMjIFBhY2thZ2UgKmZtbCoKK1tGb3JtYWwgTW9kZWxpbmcgTGFuZ3VhZ2VdKGZtbC9SRUFETUUubWQpCisKKworIyMjIFBhY2thZ2UgKnBhcnNlcioKK1tQYXJzZXIgQ2xhc3Nlc10ocGFyc2VyL1JFQURNRS5tZCkKKworCisjIyMgUGFja2FnZSAqY29tcGlsZXIqCitbQ29tcGlsZXIgQ2xhc3Nlc10oY29tcGlsZXIvUkVBRE1FLm1kKQorCisKKyMjIyBQYWNrYWdlICpjb250ZXh0KgorW0NvbnRleHQgQ2xhc3Nlc10oY29udGV4dC9SRUFETUUubWQpCisKKyMjIyBQYWNrYWdlICpzZXcqCitbU3ltYm9saWMgRXhlY3V0aW9uIFdvcmtmbG93IENsYXNzZXNdKHNldy9SRUFETUUubWQpCisKKworIyMjIFBhY2thZ2UgKmZhbSoKK1tGb3JtYWwgQW5hbHlzaXMgTW9kdWxlIENsYXNzZXNdKGZhbS9SRUFETUUubWQpCisKKworIyMjIFBhY2thZ2UgKnNvbHZlcioKK1tTb2x2ZXIgQ2xhc3Nlc10oc29sdmVyL1JFQURNRS5tZCkKKworCisjIyMgUGFja2FnZSAqdXRpbCoKK1tVdGlsIENsYXNzZXNdKHV0aWwvUkVBRE1FLm1kKQorCisKKyMjIyBQYWNrYWdlICptYWluKgorW01haW4gQ1BQIENsYXNzZXNdKG1haW4vUkVBRE1FLm1kKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYmFzZS9DTWFrZUxpc3RzLnR4dCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2Jhc2UvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMwNzM1OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2Jhc2UvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNyBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKyMgICAgICAgICAgICAgICAgICAgICAgQ01ha2UgZmlsZSBmb3IgdGhlIEJBU0UgbGlicmFyeSANCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorDQorIyBDKysgc291cmNlIGZpbGVzIHRvIHRha2UgaW50byBhY2NvdW50IChhbGwgZmlsZXMgbWF0Y2hpbmcgcGF0dGVybnMgcmVjdXJzaXZlbHkpDQorZmlsZSAoR0xPQl9SRUNVUlNFIEJBU0VfQ1hYX1NSQ19GSUxFUyAqLmNwcCAqLmgpDQorDQorIyBUYXJnZXQgdG8gYnVpbGQNCithZGRfbGlicmFyeSAoYmFzZSBTVEFUSUMgJHtCQVNFX0NYWF9TUkNfRklMRVN9KQ0KKw0KKyMgSW5jbHVkZSBkaXJlY3RvcmllcyAoaW50ZXJuYWwpDQordGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMgKGJhc2UgUFVCTElDIC4uKSAjwqBGSVhNRSA6IGV4cGxpY2l0IHRoZSBkZXBlbmRlbmNpZXMgbGliIGJ5IGxpYg0KKw0KKw0KKyMgVGFyZ2V0IGluY2x1ZGUgZGlyZWN0b3JpZXMgKGV4dGVybmFsKQ0KK3RhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzIChiYXNlIFBVQkxJQyAke0dNUF9JTkNMVURFX0RJUn0gJHtHTVBYWF9JTkNMVURFX0RJUn0pDQordGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMgKGJhc2UgUFVCTElDICR7Qm9vc3RfSU5DTFVERV9ESVJTfSkNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9iYXNlL0NsYXNzS2luZEluZm8uY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYmFzZS9DbGFzc0tpbmRJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTI4ZjUxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYmFzZS9DbGFzc0tpbmRJbmZvLmNwcApAQCAtMCwwICsxLDg3MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDI2IGTDqWMuIDIwMTIKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkNsYXNzS2luZEluZm8uaCIKKworI2luY2x1ZGUgPGNvbW1vbi9OYW1lZEVsZW1lbnQuaD4KKworI2luY2x1ZGUgPHByaW50ZXIvT3V0U3RyZWFtLmg+CisKKyNpbmNsdWRlIDxmYW0vY292ZXJhZ2UvRm9ybXVsYUNvdmVyYWdlRmlsdGVyLmg+CisKKyNpbmNsdWRlIDxmbWwvY29tbW9uL0JlaGF2aW9yYWxFbGVtZW50Lmg+CisjaW5jbHVkZSA8Zm1sL2NvbW1vbi9Qcm9wZXJ0eUVsZW1lbnQuaD4KKyNpbmNsdWRlIDxmbWwvY29tbW9uL09iamVjdEVsZW1lbnQuaD4KKworI2luY2x1ZGUgPGZtbC9idWlsdGluL0Jvb2xlYW4uaD4KKyNpbmNsdWRlIDxmbWwvYnVpbHRpbi9CdWlsdGluRm9ybS5oPgorI2luY2x1ZGUgPGZtbC9idWlsdGluL0NoYXJhY3Rlci5oPgorI2luY2x1ZGUgPGZtbC9idWlsdGluL0lkZW50aWZpZXIuaD4KKyNpbmNsdWRlIDxmbWwvYnVpbHRpbi9TdHJpbmcuaD4KKworI2luY2x1ZGUgPGZtbC9idWZmZXIvQmFzZUJ1ZmZlclF1ZXVlLmg+CisjaW5jbHVkZSA8Zm1sL2J1ZmZlci9Ccm9hZGNhc3RCdWZmZXIuaD4KKyNpbmNsdWRlIDxmbWwvYnVmZmVyL0ZpZm9CdWZmZXIuaD4KKyNpbmNsdWRlIDxmbWwvYnVmZmVyL0xpZm9CdWZmZXIuaD4KKyNpbmNsdWRlIDxmbWwvYnVmZmVyL011bHRpRmlmb0J1ZmZlci5oPgorI2luY2x1ZGUgPGZtbC9idWZmZXIvTXVsdGlMaWZvQnVmZmVyLmg+CisjaW5jbHVkZSA8Zm1sL2J1ZmZlci9NdWx0aXNldEJ1ZmZlci5oPgorI2luY2x1ZGUgPGZtbC9idWZmZXIvUmFtQnVmZmVyLmg+CisjaW5jbHVkZSA8Zm1sL2J1ZmZlci9TZXRCdWZmZXIuaD4KKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0F2bUxhbWJkYS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0F2bVByb2dyYW0uaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9Bdm1UcmFuc2l0aW9uLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvQmFzZUluc3RhbmNlRm9ybS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0Jhc2VBdm1Qcm9ncmFtLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvQ29tUm91dGVEYXRhLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZUZvcm0uaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlU3lzdGVtLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZkJ1ZmZlci5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZDb25uZWN0Lmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZkRhdGEuaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mTWFjaGluZS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZQb3J0Lmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvUm91dGVyLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvUm91dGluZ0RhdGEuaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0J1aWx0aW5BcnJheS5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0J1aWx0aW5RdWV1ZS5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0J1aWx0aW5Db250YWluZXIuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uRmFjdG9yeS5oPgorCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0J1ZmZlci5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9DaGFubmVsLmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0NvbVBvaW50Lmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0NvbVJvdXRlLmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0Nvbm5lY3Rvci5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9EYXRhVHlwZS5oPgorLy8jaW5jbHVkZSA8aW5mcmFzdHJ1Y3R1cmUvSW5zdGFuY2UuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvTWFjaGluZS5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9QYWNrYWdlLmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1BvcnQuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvUm91dGluZS5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9TeXN0ZW0uaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvVHJhbnNpdGlvbi5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9WYXJpYWJsZS5oPgorCisjaW5jbHVkZSA8Zm1sL251bWVyaWMvRmxvYXQuaD4KKyNpbmNsdWRlIDxmbWwvbnVtZXJpYy9JbnRlZ2VyLmg+CisjaW5jbHVkZSA8Zm1sL251bWVyaWMvTnVtYmVyLmg+CisjaW5jbHVkZSA8Zm1sL251bWVyaWMvUmF0aW9uYWwuaD4KKworI2luY2x1ZGUgPGZtbC9vcGVyYXRvci9PcGVyYXRvci5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uQ29uZmlndXJhdGlvbi5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkNvbnRleHQuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25EYXRhLmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvTWVzc2FnZS5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL1J1bnRpbWVGb3JtLmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvUnVudGltZUlELmg+CisKKyNpbmNsdWRlIDxmbWwvdHJhY2UvVHJhY2VQb2ludC5oPgorI2luY2x1ZGUgPGZtbC90cmFjZS9UcmFjZVNlcXVlbmNlLmg+CisKKyNpbmNsdWRlIDxmbWwvdHlwZS9CYXNlVHlwZVNwZWNpZmllci5oPgorI2luY2x1ZGUgPGZtbC90eXBlL0Jhc2VTeW1ib2xUeXBlU3BlY2lmaWVyLmg+CisjaW5jbHVkZSA8Zm1sL3R5cGUvQ2xhc3NUeXBlU3BlY2lmaWVyLmg+CisjaW5jbHVkZSA8Zm1sL3R5cGUvQ29udGFpbmVyVHlwZVNwZWNpZmllci5oPgorI2luY2x1ZGUgPGZtbC90eXBlL0VudW1UeXBlU3BlY2lmaWVyLmg+CisjaW5jbHVkZSA8Zm1sL3R5cGUvSW50ZXJ2YWxUeXBlU3BlY2lmaWVyLmg+CisjaW5jbHVkZSA8Zm1sL3R5cGUvVHlwZUFsaWFzU3BlY2lmaWVyLmg+CisjaW5jbHVkZSA8Zm1sL3R5cGUvVW5pb25UeXBlU3BlY2lmaWVyLmg+CisKKyNpbmNsdWRlIDxmbWwvd29ya2Zsb3cvVW5pRm9ybUlkZW50aWZpZXIuaD4KKyNpbmNsdWRlIDxmbWwvd29ya2Zsb3cvV09iamVjdC5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitDbGFzc0tpbmRJbmZvICogQ2xhc3NLaW5kSW5mbzo6VFlQRV9VTkRFRklORURfSU5GTzsKKworY2xhc3Nfa2luZF90IENsYXNzS2luZEluZm9Jbml0aWFsaXplcjo6VFlQRV9ORVdfSUQgPSAwOworCitzdGQ6OnZlY3RvcjwgQ2xhc3NLaW5kSW5mbyAqID4gKiBDbGFzc0tpbmRJbmZvSW5pdGlhbGl6ZXI6OkNLSV9UQUJMRTsKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gSU5JVElBTElaQVRJT04gLyBERVNUUlVDVElPTiAgSU5WQVJJQU5UCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCisjZGVmaW5lIElOSVRfQ0xBU1NfS0lORF9JTkZPKCBUICkgIFwKKwlkbyB7IFwKKwkJQ2xhc3NLaW5kSW5mb0luaXRpYWxpemVyOjpjbGFzc0tpbmRJbmZvPCBUID4oKS5tTkFNRSA9ICNUOyBcCisJfSB3aGlsZSggZmFsc2UgKQorCitzdGF0aWMgYXZtX3VpbnQxNl90IE5JRlRZX0NPVU5URVIgPSAwOworCitDbGFzc0tpbmRJbmZvSW5pdGlhbGl6ZXI6OkNsYXNzS2luZEluZm9Jbml0aWFsaXplcigpCit7CisJaWYoICgwID09IE5JRlRZX0NPVU5URVIrKykgJiYgKDAgPT0gVFlQRV9ORVdfSUQpICkKKwl7CisJCS8vIFNUQVRJQyBJTklUSUFMSVpBVElPTiBERVBFTkRBTkNZCisJCUNLSV9UQUJMRSA9IG5ldyBzdGQ6OnZlY3RvcjwgQ2xhc3NLaW5kSW5mbyAqID4oKTsKKworCQlDbGFzc0tpbmRJbmZvOjpUWVBFX1VOREVGSU5FRF9JTkZPID0KKwkJCQluZXcgQ2xhc3NLaW5kSW5mbyhUWVBFX1VOREVGSU5FRF9JRCwgIiN1bmRlZmluZWQiKTsKKworCQkvLyBUWVBFX05FV19JRCA9PSAwIGZvciBDbGFzc0tpbmRJbmZvOjpUWVBFX1VOREVGSU5FRF9JTkZPCisJCVRZUEVfTkVXX0lEID0gMTsKKworCisJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQkvL1BSRURFRklORUQgQ0xBU1MgS0lORCB3LnIudC4gRU5VTV9DTEFTU19LSU5EIE9SREVSCisJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJCS8vIEJVSUxUSU4KKwkJSU5JVF9DTEFTU19LSU5EX0lORk8oIEJvb2xlYW4gICApOworCisJCUlOSVRfQ0xBU1NfS0lORF9JTkZPKCBDaGFyYWN0ZXIgKTsKKworCQlJTklUX0NMQVNTX0tJTkRfSU5GTyggSW50ZWdlciAgICk7CisKKwkJSU5JVF9DTEFTU19LSU5EX0lORk8oIFJhdGlvbmFsICApOworCisJCUlOSVRfQ0xBU1NfS0lORF9JTkZPKCBGbG9hdCAgICAgKTsKKworCQlJTklUX0NMQVNTX0tJTkRfSU5GTyggU3RyaW5nICAgICk7CisKKwkJSU5JVF9DTEFTU19LSU5EX0lORk8oIElkZW50aWZpZXIgICAgICAgICAgKTsKKwkJSU5JVF9DTEFTU19LSU5EX0lORk8oIFF1YWxpZmllZElkZW50aWZpZXIgKTsKKworCQkvLyBPUEVSQVRPUgorCQlJTklUX0NMQVNTX0tJTkRfSU5GTyggT3BlcmF0b3IgKTsKKworCQkvLyBFWFBSRVNTSU9OICwgU1RBVEVNRU5UCisJCUlOSVRfQ0xBU1NfS0lORF9JTkZPKCBBdm1Db2RlICApOworCisJCS8vIEVYRUNVVEFCTEUgT0JKRUNUIElOU1RBTkNFCisJCUlOSVRfQ0xBU1NfS0lORF9JTkZPKCBJbnN0YW5jZU9mQnVmZmVyICApOworCQlJTklUX0NMQVNTX0tJTkRfSU5GTyggSW5zdGFuY2VPZkNvbm5lY3QgKTsKKwkJSU5JVF9DTEFTU19LSU5EX0lORk8oIEluc3RhbmNlT2ZEYXRhICAgICk7CisJCUlOSVRfQ0xBU1NfS0lORF9JTkZPKCBJbnN0YW5jZU9mTWFjaGluZSApOworCQlJTklUX0NMQVNTX0tJTkRfSU5GTyggSW5zdGFuY2VPZlBvcnQgICAgKTsKKworCQkvLyBFWEVDVVRBQkxFIE9CSkVDVAorCQlJTklUX0NMQVNTX0tJTkRfSU5GTyggQXZtTGFtYmRhICAgICAgICAgKTsKKwkJSU5JVF9DTEFTU19LSU5EX0lORk8oIEF2bVByb2dyYW0gICAgICAgICk7CisJCUlOSVRfQ0xBU1NfS0lORF9JTkZPKCBBdm1UcmFuc2l0aW9uICAgICApOworCisJCUlOSVRfQ0xBU1NfS0lORF9JTkZPKCBFeGVjdXRhYmxlRm9ybSAgICApOworCQlJTklUX0NMQVNTX0tJTkRfSU5GTyggRXhlY3V0YWJsZVN5c3RlbSAgKTsKKworCQkvLyBSVU5USU1FIE9CSkVDVAorCQlJTklUX0NMQVNTX0tJTkRfSU5GTyggUnVudGltZUlEICAgICAgICAgKTsKKwkJSU5JVF9DTEFTU19LSU5EX0lORk8oIFJ1bnRpbWVGb3JtICAgICAgICk7CisKKwkJLy8gRVhFQ1VUSU9OIE9CSkVDVAorCQlJTklUX0NMQVNTX0tJTkRfSU5GTyggRXhlY3V0aW9uQ29uZmlndXJhdGlvbiApOworCisJCUlOSVRfQ0xBU1NfS0lORF9JTkZPKCBFeGVjdXRpb25EYXRhICAgICApOworCQlJTklUX0NMQVNTX0tJTkRfSU5GTyggRXhlY3V0aW9uQ29udGV4dCAgKTsKKworCQkvLyBXT1JLRkxPVyBDT05GSUdVUkFUSU9OCisJCUlOSVRfQ0xBU1NfS0lORF9JTkZPKCBXT2JqZWN0ICk7CisKKwkJLy8gTElBIG9yIEZTUAorCQlJTklUX0NMQVNTX0tJTkRfSU5GTyggVW5pRm9ybUlkZW50aWZpZXIgKTsKKworCQkvLyBYTElBIG9yIFhGU1AKKwkJSU5JVF9DTEFTU19LSU5EX0lORk8oIEJ1ZmZlciAgICAgKTsKKwkJSU5JVF9DTEFTU19LSU5EX0lORk8oIENoYW5uZWwgICAgKTsKKwkJSU5JVF9DTEFTU19LSU5EX0lORk8oIENvbVBvaW50ICAgKTsKKwkJSU5JVF9DTEFTU19LSU5EX0lORk8oIENvbVJvdXRlICAgKTsKKwkJSU5JVF9DTEFTU19LSU5EX0lORk8oIENvbm5lY3RvciAgKTsKKwkJSU5JVF9DTEFTU19LSU5EX0lORk8oIE1hY2hpbmUgICAgKTsKKy8vCQlJTklUX0NMQVNTX0tJTkRfSU5GTyggSW5zdGFuY2UgICApOworCQlJTklUX0NMQVNTX0tJTkRfSU5GTyggUGFja2FnZSAgICApOworCQlJTklUX0NMQVNTX0tJTkRfSU5GTyggUG9ydCAgICAgICApOworCQlJTklUX0NMQVNTX0tJTkRfSU5GTyggUm91dGluZSAgICApOworCQlJTklUX0NMQVNTX0tJTkRfSU5GTyggU3lzdGVtICAgICApOworCQlJTklUX0NMQVNTX0tJTkRfSU5GTyggVHJhbnNpdGlvbiApOworCQlJTklUX0NMQVNTX0tJTkRfSU5GTyggVmFyaWFibGUgICApOworCQkvLyBEQVRBIFRZUEUKKwkJSU5JVF9DTEFTU19LSU5EX0lORk8oIERhdGFUeXBlICAgKTsKKworCQkvLyBBUlJBWQorCQlJTklUX0NMQVNTX0tJTkRfSU5GTyggQXJyYXlCb29sZWFuICAgICk7CisJCUlOSVRfQ0xBU1NfS0lORF9JTkZPKCBBcnJheUNoYXJhY3RlciAgKTsKKwkJSU5JVF9DTEFTU19LSU5EX0lORk8oIEFycmF5SW50ZWdlciAgICApOworCQlJTklUX0NMQVNTX0tJTkRfSU5GTyggQXJyYXlSYXRpb25hbCAgICk7CisJCUlOSVRfQ0xBU1NfS0lORF9JTkZPKCBBcnJheUZsb2F0ICAgICAgKTsKKwkJSU5JVF9DTEFTU19LSU5EX0lORk8oIEFycmF5U3RyaW5nICAgICApOworCisJCUlOSVRfQ0xBU1NfS0lORF9JTkZPKCBBcnJheUlkZW50aWZpZXIgKTsKKwkJSU5JVF9DTEFTU19LSU5EX0lORk8oIEFycmF5UXVhbGlmaWVkSWRlbnRpZmllciApOworCisJCUlOSVRfQ0xBU1NfS0lORF9JTkZPKCBBcnJheUJGICk7CisKKwkJLy8gQ09OVEFJTkVSCisJCUlOSVRfQ0xBU1NfS0lORF9JTkZPKCBCdWlsdGluVmVjdG9yICk7CisJCUlOSVRfQ0xBU1NfS0lORF9JTkZPKCBCdWlsdGluUmV2ZXJzZVZlY3RvciApOworCQlJTklUX0NMQVNTX0tJTkRfSU5GTyggQnVpbHRpbkxpc3QgICApOworCQlJTklUX0NMQVNTX0tJTkRfSU5GTyggQnVpbHRpblNldCAgICApOworCQlJTklUX0NMQVNTX0tJTkRfSU5GTyggQnVpbHRpbkJhZyAgICApOworCQlJTklUX0NMQVNTX0tJTkRfSU5GTyggQnVpbHRpbkZpZm8gICApOworCQlJTklUX0NMQVNTX0tJTkRfSU5GTyggQnVpbHRpbkxpZm8gICApOworCisJCS8vIEJVRkZFUgorCQlJTklUX0NMQVNTX0tJTkRfSU5GTyggRmlmb0J1ZmZlciAgICAgICk7CisJCUlOSVRfQ0xBU1NfS0lORF9JTkZPKCBMaWZvQnVmZmVyICAgICAgKTsKKwkJSU5JVF9DTEFTU19LSU5EX0lORk8oIE11bHRpRmlmb0J1ZmZlciApOworCQlJTklUX0NMQVNTX0tJTkRfSU5GTyggTXVsdGlMaWZvQnVmZmVyICk7CisJCUlOSVRfQ0xBU1NfS0lORF9JTkZPKCBNdWx0aXNldEJ1ZmZlciAgKTsKKwkJSU5JVF9DTEFTU19LSU5EX0lORk8oIFNldEJ1ZmZlciAgICAgICApOworCQlJTklUX0NMQVNTX0tJTkRfSU5GTyggQnJvYWRjYXN0QnVmZmVyICk7CisJCUlOSVRfQ0xBU1NfS0lORF9JTkZPKCBSYW1CdWZmZXIgICAgICAgKTsKKworCQkvLyBDT00KKwkJSU5JVF9DTEFTU19LSU5EX0lORk8oIE1lc3NhZ2UgICAgICApOworCQlJTklUX0NMQVNTX0tJTkRfSU5GTyggQ29tUm91dGVEYXRhICk7CisJCUlOSVRfQ0xBU1NfS0lORF9JTkZPKCBSb3V0ZXIgICAgICAgKTsKKwkJSU5JVF9DTEFTU19LSU5EX0lORk8oIFJvdXRpbmdEYXRhICApOworCisJCS8vIE9USEVSCisJCUlOSVRfQ0xBU1NfS0lORF9JTkZPKCBGb3JtdWxhRGF0YSAgKTsKKworCQkvLyBFWEVDVVRJT04gVFJBQ0UKKwkJSU5JVF9DTEFTU19LSU5EX0lORk8oIFRyYWNlUG9pbnQgICAgKTsKKwkJSU5JVF9DTEFTU19LSU5EX0lORk8oIFRyYWNlU2VxdWVuY2UgKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIFVMVFJBICwgQ09NUElMSU5HICkKKwl0b1N0cmVhbVRhYmxlKEFWTV9PU19DT1VULAorCQkJIkNsYXNzS2luZEluZm9Jbml0aWFsaXplcjo6Q2xhc3NLaW5kSW5mb0luaXRpYWxpemVyIik7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggVUxUUkEgLCBDT01QSUxJTkcgKQorCX0KK30KKworCitDbGFzc0tpbmRJbmZvSW5pdGlhbGl6ZXI6On5DbGFzc0tpbmRJbmZvSW5pdGlhbGl6ZXIoKQoreworCWlmKCAwID09IC0tTklGVFlfQ09VTlRFUiApCisJeworLy8JCXRvU3RyZWFtVGFibGUoc3RkOjpjb3V0LCB+Q2xhc3NLaW5kSW5mb0luaXRpYWxpemVyKTsKKy8vCisvLwkJQ2xhc3NLaW5kSW5mb0luaXRpYWxpemVyOjpDS0lfVEFCTEUtPmNsZWFyKCk7CisKKwkJZGVsZXRlKCBDS0lfVEFCTEUgKTsKKwkJZGVsZXRlKCBDbGFzc0tpbmRJbmZvOjpUWVBFX1VOREVGSU5FRF9JTkZPICk7CisJfQorfQorCisKKworCisvKioKKyAqIENPTlNUUlVDVE9SCisgKiBEZWZhdWx0CisgKi8KK0NsYXNzS2luZEluZm86OkNsYXNzS2luZEluZm8oY2xhc3Nfa2luZF90IGFDbGFzc0tpbmQsIGNvbnN0IGNoYXIgKiB0bmFtZSkKKzogbUtJTkQoIGFDbGFzc0tpbmQgKSwKK21UTkFNRSggdG5hbWUgKSwKK21OQU1FKCB0bmFtZSApCit7CisJQ2xhc3NLaW5kSW5mb0luaXRpYWxpemVyOjpDS0lfVEFCTEUtPnB1c2hfYmFjayggdGhpcyApOworfQorCisKK3N0ZDo6c3RyaW5nIENsYXNzS2luZEluZm86OmluZm8oKSBjb25zdAoreworCXJldHVybiggT1NTKCkgPDwgInR5cGVpbmZvPCAiIDw8IHN0ZDo6c2V0dygzKSA8PCAoKGF2bV9zaXplX3QpIG1LSU5EKQorCQkJPDwgIiAsICIgPDwgbU5BTUUgPDwgRlFOX0lEX1JPT1RfU0VQQVJBVE9SIDw8IG1UTkFNRSA8PCAiID4iICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCit2b2lkIENsYXNzS2luZEluZm9Jbml0aWFsaXplcjo6dG9TdHJlYW1UYWJsZSgKKwkJT3V0U3RyZWFtICYgb3MsIGNvbnN0IHN0ZDo6c3RyaW5nICYgbXNnKQoreworCW9zIDw8IFRBQiA8PCBtc2cgPDwgIjo+IiA8PCBzdGQ6OmVuZGw7CisJc3RkOjp2ZWN0b3I8IENsYXNzS2luZEluZm8gKiA+Ojpjb25zdF9pdGVyYXRvciBpdCA9IENLSV9UQUJMRS0+YmVnaW4oKTsKKwlzdGQ6OnZlY3RvcjwgQ2xhc3NLaW5kSW5mbyAqID46OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gQ0tJX1RBQkxFLT5lbmQoKTsKKwlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwl7CisJCW9zIDw8IFRBQjIgPDwgKCppdCktPmluZm8oKSA8PCBFT0w7CisJfQorCisJb3MgPDwgVEFCIDw8ICJDS0lfVEFCTEUuc2l6ZTogIiA8PCBDS0lfVEFCTEUtPnNpemUoKSA8PCBFT0w7CisJb3MgPDwgVEFCIDw8ICJDS0lfTkVXX0lEICAgIDogIiA8PCAoKGF2bV9zaXplX3QpIFRZUEVfTkVXX0lEKSA8PCBFT0w7CisJb3MgPDwgVEFCIDw8ICJOSUZUWV9DT1VOVEVSIDogIiA8PCBOSUZUWV9DT1VOVEVSIDw8IEVPTDsKKworCW9zIDw8IFRBQiA8PCAiZW5kIiA8PCBFT0xfRkxVU0g7Cit9CisKKworCisKKyNkZWZpbmUgQ0hFQ0tfQ0xBU1NfS0lORF9JTkZPKCBUICwgSyApICBcCisJZG8geyAgXAorCQlpZiggQ0xBU1NfS0lORF9UKCBUICkgIT0gKChjbGFzc19raW5kX3QpIEspICkgIFwKKwkJeyAgXAorCQkJc3RkOjpjb3V0IDw8ICJGQVRBTF9FUlJPUiA6PiAiIDw8ICNUIDw8ICIgOiAiICBcCisJCQkJCTw8ICgoYXZtX3NpemVfdCkgQ0xBU1NfS0lORF9UKCBUICkpIDw8ICIgPS89ICIgIFwKKwkJCQkJPDwgKChhdm1fc2l6ZV90KSBLKSA8PCAiIDogIiA8PCAjSyA8PCAiISEhIiA8PCBzdGQ6OmVuZGw7ICBcCisJCX0gIFwKKwl9IHdoaWxlKCBmYWxzZSApCisKKworc3RhdGljIHZvaWQgY2hlY2tDbGFzc0tpbmRJbmZvX3dfcl90X0VudW1DbGFzc0tpbmQoKQoreworLy8Jc3RkOjpjb3V0IDw8ICJjaGVja0NsYXNzS2luZEluZm9fd19yX3RfRW51bUNsYXNzS2luZCA6PiIgPDwgc3RkOjplbmRsOworCisJLy8gQlVJTFRJTgorCUNIRUNLX0NMQVNTX0tJTkRfSU5GTyggQm9vbGVhbiAgICAsIEZPUk1fQlVJTFRJTl9CT09MRUFOX0tJTkQgICAgKTsKKworCUNIRUNLX0NMQVNTX0tJTkRfSU5GTyggQ2hhcmFjdGVyICAsIEZPUk1fQlVJTFRJTl9DSEFSQUNURVJfS0lORCAgKTsKKworCUNIRUNLX0NMQVNTX0tJTkRfSU5GTyggSW50ZWdlciAgICAsIEZPUk1fQlVJTFRJTl9JTlRFR0VSX0tJTkQgICAgKTsKKwlDSEVDS19DTEFTU19LSU5EX0lORk8oIFJhdGlvbmFsICAgLCBGT1JNX0JVSUxUSU5fUkFUSU9OQUxfS0lORCAgICk7CisJQ0hFQ0tfQ0xBU1NfS0lORF9JTkZPKCBGbG9hdCAgICAgICwgRk9STV9CVUlMVElOX0ZMT0FUX0tJTkQgICAgICApOworCisJQ0hFQ0tfQ0xBU1NfS0lORF9JTkZPKCBTdHJpbmcgICAgICwgRk9STV9CVUlMVElOX1NUUklOR19LSU5EICAgICApOworCUNIRUNLX0NMQVNTX0tJTkRfSU5GTyggSWRlbnRpZmllciAsIEZPUk1fQlVJTFRJTl9JREVOVElGSUVSX0tJTkQgKTsKKwlDSEVDS19DTEFTU19LSU5EX0lORk8oIFF1YWxpZmllZElkZW50aWZpZXIsIEZPUk1fQlVJTFRJTl9RVUFMSUZJRURfSURFTlRJRklFUl9LSU5EICk7CisKKwkvLyBPUEVSQVRPUgorCUNIRUNLX0NMQVNTX0tJTkRfSU5GTyggT3BlcmF0b3IgLCBGT1JNX09QRVJBVE9SX0tJTkQgKTsKKworCS8vIEVYUFJFU1NJT04gLCBTVEFURU1FTlQKKwlDSEVDS19DTEFTU19LSU5EX0lORk8oIEF2bUNvZGUgICwgRk9STV9BVk1DT0RFX0tJTkQgICk7CisKKwkvLyBFWEVDVVRBQkxFIE9CSkVDVCBJTlNUQU5DRQorCUNIRUNLX0NMQVNTX0tJTkRfSU5GTyggSW5zdGFuY2VPZkJ1ZmZlciAgLCBGT1JNX0lOU1RBTkNFX0JVRkZFUl9LSU5EICAgKTsKKwlDSEVDS19DTEFTU19LSU5EX0lORk8oIEluc3RhbmNlT2ZDb25uZWN0ICwgRk9STV9JTlNUQU5DRV9DT05ORUNUT1JfS0lORCAgKTsKKwlDSEVDS19DTEFTU19LSU5EX0lORk8oIEluc3RhbmNlT2ZEYXRhICAgICwgRk9STV9JTlNUQU5DRV9EQVRBX0tJTkQgICAgICk7CisJQ0hFQ0tfQ0xBU1NfS0lORF9JTkZPKCBJbnN0YW5jZU9mTWFjaGluZSAsIEZPUk1fSU5TVEFOQ0VfTUFDSElORV9LSU5EICApOworCUNIRUNLX0NMQVNTX0tJTkRfSU5GTyggSW5zdGFuY2VPZlBvcnQgICAgLCBGT1JNX0lOU1RBTkNFX1BPUlRfS0lORCAgICAgKTsKKworCS8vIEVYRUNVVEFCTEUgT0JKRUNUCisJQ0hFQ0tfQ0xBU1NfS0lORF9JTkZPKCBBdm1MYW1iZGEgICAgICAgICwgRk9STV9BVk1MQU1CREFfS0lORCAgICAgICAgICApOworCUNIRUNLX0NMQVNTX0tJTkRfSU5GTyggQXZtUHJvZ3JhbSAgICAgICAsIEZPUk1fQVZNUFJPR1JBTV9LSU5EICAgICAgICAgKTsKKwlDSEVDS19DTEFTU19LSU5EX0lORk8oIEF2bVRyYW5zaXRpb24gICAgLCBGT1JNX0FWTVRSQU5TSVRJT05fS0lORCAgICAgICk7CisJQ0hFQ0tfQ0xBU1NfS0lORF9JTkZPKCBFeGVjdXRhYmxlRm9ybSAgICwgRk9STV9FWEVDVVRBQkxFX01BQ0hJTkVfS0lORCApOworCUNIRUNLX0NMQVNTX0tJTkRfSU5GTyggRXhlY3V0YWJsZVN5c3RlbSAsIEZPUk1fRVhFQ1VUQUJMRV9TWVNURU1fS0lORCAgKTsKKworCS8vIFJVTlRJTUUgT0JKRUNUCisJQ0hFQ0tfQ0xBU1NfS0lORF9JTkZPKCBSdW50aW1lSUQgICAsIEZPUk1fUlVOVElNRV9JRF9LSU5EICk7CisJQ0hFQ0tfQ0xBU1NfS0lORF9JTkZPKCBSdW50aW1lRm9ybSAsIEZPUk1fUlVOVElNRV9LSU5EICAgICk7CisKKwkvLyBFWEVDVVRJT04gT0JKRUNUCisJQ0hFQ0tfQ0xBU1NfS0lORF9JTkZPKCBFeGVjdXRpb25Db25maWd1cmF0aW9uICwgRk9STV9FWEVDVVRJT05fQ09ORklHVVJBVElPTl9LSU5EICk7CisJQ0hFQ0tfQ0xBU1NfS0lORF9JTkZPKCBFeGVjdXRpb25EYXRhICAgICAgICAgICwgRk9STV9FWEVDVVRJT05fREFUQV9LSU5EICk7CisJQ0hFQ0tfQ0xBU1NfS0lORF9JTkZPKCBFeGVjdXRpb25Db250ZXh0ICAgICAgICwgRk9STV9FWEVDVVRJT05fQ09OVEVYVF9LSU5EICk7CisKKwkvLyBXT1JLRkxPVyBDT05GSUdVUkFUSU9OCisJQ0hFQ0tfQ0xBU1NfS0lORF9JTkZPKCBXT2JqZWN0ICAgLCBGT1JNX1dPQkpFQ1RfS0lORCAgICAgKTsKKworCS8vIExJQSBvciBGU1AKKwlDSEVDS19DTEFTU19LSU5EX0lORk8oIFVuaUZvcm1JZGVudGlmaWVyICwgRk9STV9VRklfS0lORCApOworCisJLy8gWExJQSBvciBYRlNQCisJQ0hFQ0tfQ0xBU1NfS0lORF9JTkZPKCBCdWZmZXIgICAgICAgLCBGT1JNX1hGU1BfQlVGRkVSX0tJTkQgICAgICk7CisJQ0hFQ0tfQ0xBU1NfS0lORF9JTkZPKCBDaGFubmVsICAgICAgLCBGT1JNX1hGU1BfQ0hBTk5FTF9LSU5EICAgICk7CisJQ0hFQ0tfQ0xBU1NfS0lORF9JTkZPKCBDb21Qb2ludCAgICAgLCBGT1JNX1hGU1BfQ09NX1BPSU5UX0tJTkQgICk7CisJQ0hFQ0tfQ0xBU1NfS0lORF9JTkZPKCBDb21Sb3V0ZSAgICAgLCBGT1JNX1hGU1BfQ09NX1JPVVRFX0tJTkQgICk7CisJQ0hFQ0tfQ0xBU1NfS0lORF9JTkZPKCBDb25uZWN0b3IgICAgLCBGT1JNX1hGU1BfQ09OTkVDVE9SX0tJTkQgICk7CisJQ0hFQ0tfQ0xBU1NfS0lORF9JTkZPKCBNYWNoaW5lICAgICAgLCBGT1JNX1hGU1BfTUFDSElORV9LSU5EICAgICk7CisvLwlDSEVDS19DTEFTU19LSU5EX0lORk8oIEluc3RhbmNlICAgICAsIEZPUk1fWEZTUF9JTlNUQU5DRV9LSU5EICAgKTsKKwlDSEVDS19DTEFTU19LSU5EX0lORk8oIFBhY2thZ2UgICAgICAsIEZPUk1fWEZTUF9QQUNLQUdFX0tJTkQgICAgKTsKKwlDSEVDS19DTEFTU19LSU5EX0lORk8oIFBvcnQgICAgICAgICAsIEZPUk1fWEZTUF9QT1JUX0tJTkQgICAgICAgKTsKKwlDSEVDS19DTEFTU19LSU5EX0lORk8oIFJvdXRpbmUgICAgICAsIEZPUk1fWEZTUF9ST1VUSU5FX0tJTkQgICAgKTsKKwlDSEVDS19DTEFTU19LSU5EX0lORk8oIFN5c3RlbSAgICAgICAsIEZPUk1fWEZTUF9TWVNURU1fS0lORCAgICAgKTsKKwlDSEVDS19DTEFTU19LSU5EX0lORk8oIFRyYW5zaXRpb24gICAsIEZPUk1fWEZTUF9UUkFOU0lUSU9OX0tJTkQgKTsKKwlDSEVDS19DTEFTU19LSU5EX0lORk8oIFZhcmlhYmxlICAgICAsIEZPUk1fWEZTUF9WQVJJQUJMRV9LSU5EICAgKTsKKwkvLyBEQVRBIFRZUEUKKwlDSEVDS19DTEFTU19LSU5EX0lORk8oIERhdGFUeXBlICAgICAsIEZPUk1fWEZTUF9EQVRBVFlQRV9LSU5EICAgKTsKKworCS8vIEFSUkFZCisJQ0hFQ0tfQ0xBU1NfS0lORF9JTkZPKCBBcnJheUJvb2xlYW4gICAgLCBGT1JNX0FSUkFZX0JPT0xFQU5fS0lORCAgICApOworCUNIRUNLX0NMQVNTX0tJTkRfSU5GTyggQXJyYXlDaGFyYWN0ZXIgICwgRk9STV9BUlJBWV9DSEFSQUNURVJfS0lORCAgKTsKKwlDSEVDS19DTEFTU19LSU5EX0lORk8oIEFycmF5SW50ZWdlciAgICAsIEZPUk1fQVJSQVlfSU5URUdFUl9LSU5EICAgICk7CisJQ0hFQ0tfQ0xBU1NfS0lORF9JTkZPKCBBcnJheVJhdGlvbmFsICAgLCBGT1JNX0FSUkFZX1JBVElPTkFMX0tJTkQgICApOworCUNIRUNLX0NMQVNTX0tJTkRfSU5GTyggQXJyYXlGbG9hdCAgICAgICwgRk9STV9BUlJBWV9GTE9BVF9LSU5EICAgICAgKTsKKwlDSEVDS19DTEFTU19LSU5EX0lORk8oIEFycmF5U3RyaW5nICAgICAsIEZPUk1fQVJSQVlfU1RSSU5HX0tJTkQgICAgICk7CisJQ0hFQ0tfQ0xBU1NfS0lORF9JTkZPKCBBcnJheUlkZW50aWZpZXIgLCBGT1JNX0FSUkFZX0lERU5USUZJRVJfS0lORCApOworCUNIRUNLX0NMQVNTX0tJTkRfSU5GTyggQXJyYXlRdWFsaWZpZWRJZGVudGlmaWVyICwKKwkJCQkJCQkJICAgRk9STV9BUlJBWV9RVUFMSUZJRURfSURFTlRJRklFUl9LSU5EICk7CisJQ0hFQ0tfQ0xBU1NfS0lORF9JTkZPKCBBcnJheUJGICAgICAgICAgLCBGT1JNX0FSUkFZX0JGX0tJTkQgICAgICAgICApOworCisJLy8gQ09OVEFJTkVSCisJQ0hFQ0tfQ0xBU1NfS0lORF9JTkZPKCBCdWlsdGluVmVjdG9yICwgRk9STV9DT05UQUlORVJfVkVDVE9SX0tJTkQgKTsKKwlDSEVDS19DTEFTU19LSU5EX0lORk8oIEJ1aWx0aW5SZXZlcnNlVmVjdG9yICwKKwkJCQkJCQkJCQlGT1JNX0NPTlRBSU5FUl9SRVZFUlNFX1ZFQ1RPUl9LSU5EICk7CisJQ0hFQ0tfQ0xBU1NfS0lORF9JTkZPKCBCdWlsdGluTGlzdCAgICwgRk9STV9DT05UQUlORVJfTElTVF9LSU5EICk7CisJQ0hFQ0tfQ0xBU1NfS0lORF9JTkZPKCBCdWlsdGluU2V0ICAgICwgRk9STV9DT05UQUlORVJfU0VUX0tJTkQgKTsKKwlDSEVDS19DTEFTU19LSU5EX0lORk8oIEJ1aWx0aW5CYWcgICAgLCBGT1JNX0NPTlRBSU5FUl9CQUdfS0lORCApOworCUNIRUNLX0NMQVNTX0tJTkRfSU5GTyggQnVpbHRpbkZpZm8gICAsIEZPUk1fQ09OVEFJTkVSX0ZJRk9fS0lORCApOworCUNIRUNLX0NMQVNTX0tJTkRfSU5GTyggQnVpbHRpbkxpZm8gICAsIEZPUk1fQ09OVEFJTkVSX0xJRk9fS0lORCApOworCisJLy8gQlVGRkVSCisJQ0hFQ0tfQ0xBU1NfS0lORF9JTkZPKCBGaWZvQnVmZmVyICAgICAgLCBGT1JNX0JVRkZFUl9GSUZPX0tJTkQgICAgICAgKTsKKwlDSEVDS19DTEFTU19LSU5EX0lORk8oIExpZm9CdWZmZXIgICAgICAsIEZPUk1fQlVGRkVSX0xJRk9fS0lORCAgICAgICApOworCUNIRUNLX0NMQVNTX0tJTkRfSU5GTyggTXVsdGlGaWZvQnVmZmVyICwgRk9STV9CVUZGRVJfTVVMVElfRklGT19LSU5EICk7CisJQ0hFQ0tfQ0xBU1NfS0lORF9JTkZPKCBNdWx0aUxpZm9CdWZmZXIgLCBGT1JNX0JVRkZFUl9NVUxUSV9MSUZPX0tJTkQgKTsKKworCUNIRUNLX0NMQVNTX0tJTkRfSU5GTyggTXVsdGlzZXRCdWZmZXIgICwgRk9STV9CVUZGRVJfTVVMVElTRVRfS0lORCAgICk7CisJQ0hFQ0tfQ0xBU1NfS0lORF9JTkZPKCBTZXRCdWZmZXIgICAgICAgLCBGT1JNX0JVRkZFUl9TRVRfS0lORCAgICAgICAgKTsKKworCUNIRUNLX0NMQVNTX0tJTkRfSU5GTyggQnJvYWRjYXN0QnVmZmVyICwgRk9STV9CVUZGRVJfQlJPQURDQVNUX0tJTkQgICk7CisJQ0hFQ0tfQ0xBU1NfS0lORF9JTkZPKCBSYW1CdWZmZXIgICAgICAgLCBGT1JNX0JVRkZFUl9SQU1fS0lORCAgICAgICAgKTsKKworCS8vIENPTQorCUNIRUNLX0NMQVNTX0tJTkRfSU5GTyggTWVzc2FnZSAgICAgICwgRk9STV9NRVNTQUdFX0tJTkQgICAgICAgICk7CisJQ0hFQ0tfQ0xBU1NfS0lORF9JTkZPKCBDb21Sb3V0ZURhdGEgLCBGT1JNX0NPTV9ST1VURV9EQVRBX0tJTkQgKTsKKwlDSEVDS19DTEFTU19LSU5EX0lORk8oIFJvdXRlciAgICAgICAsIEZPUk1fUk9VVEVSX0tJTkQgICAgICAgICApOworCUNIRUNLX0NMQVNTX0tJTkRfSU5GTyggUm91dGluZ0RhdGEgICwgRk9STV9ST1VUSU5HX0RBVEFfS0lORCAgICk7CisKKwkvLyBPVEhFUgorCUNIRUNLX0NMQVNTX0tJTkRfSU5GTyggRm9ybXVsYURhdGEgICwgRk9STV9FWEVDX0ZJTFRFUl9GT1JNVUxBX0RBVEFfS0lORCApOworCisJLy8gRVhFQ1VUSU9OIFRSQUNFCisJQ0hFQ0tfQ0xBU1NfS0lORF9JTkZPKCBUcmFjZVBvaW50ICAgLCBGT1JNX1RSQUNFX1BPSU5UX0tJTkQgICAgICAgICk7CisJQ0hFQ0tfQ0xBU1NfS0lORF9JTkZPKCBUcmFjZVNlcXVlbmNlLCBGT1JNX1RSQUNFX1NFUVVFTkNFX0tJTkQgICAgICApOworCisJLy8Jc3RkOjpjb3V0IDw8ICJlbmQiIDw8IHN0ZDo6ZW5kbDsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIExPQURFUiAvIERJU1BPU0VSICBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgQ2xhc3NLaW5kSW5mb0luaXRpYWxpemVyOjpsb2FkKCkKK3sKKwljaGVja0NsYXNzS2luZEluZm9fd19yX3RfRW51bUNsYXNzS2luZCgpOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggVUxUUkEgLCBDT01QSUxJTkcgKQorCXRvU3RyZWFtVGFibGUoQVZNX09TX0NPVVQsICJDbGFzc0tpbmRJbmZvSW5pdGlhbGl6ZXI6OmxvYWQiKTsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBVTFRSQSAsIENPTVBJTElORyApCit9CisKKwordm9pZCBDbGFzc0tpbmRJbmZvSW5pdGlhbGl6ZXI6OmRpc3Bvc2UoKQoreworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIFVMVFJBICwgQ09NUElMSU5HICkKKwl0b1N0cmVhbVRhYmxlKEFWTV9PU19DT1VULCAiQ2xhc3NLaW5kSW5mb0luaXRpYWxpemVyOjpkaXNwb3NlIik7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggVUxUUkEgLCBDT01QSUxJTkcgKQorfQorCisKKworCisvKioKKyAqIENMQVNTIEtJTkQgQ0hFQ0tFUgorICogQ0FTVAorICovCit0ZW1wbGF0ZTw+IGJvb2wgQ2xhc3NLaW5kSW1wbDo6aXM8IE1hY2hpbmUgPigpIGNvbnN0Cit7CisJcmV0dXJuKCBpc19leGFjdGx5PCBNYWNoaW5lID4oKSB8fAorCQkJaXM8IFN5c3RlbSAgICAgICAgICA+KCkgfHwKKwkJCWlzPCBQYWNrYWdlICAgICAgICAgPigpICk7Cit9CisKK3RlbXBsYXRlPD4gYm9vbCBDbGFzc0tpbmRJbXBsOjppc25vdDwgTWFjaGluZSA+KCkgY29uc3QKK3sKKwlyZXR1cm4oIGlzbm90X2V4YWN0bHk8IE1hY2hpbmUgPigpICYmCisJCQlpc25vdDwgU3lzdGVtICAgICAgICAgID4oKSAmJgorCQkJaXNub3Q8IFBhY2thZ2UgICAgICAgICA+KCkgKTsKK30KKworCit0ZW1wbGF0ZTw+IGJvb2wgQ2xhc3NLaW5kSW1wbDo6aXM8IEJlaGF2aW9yYWxFbGVtZW50ID4oKSBjb25zdAoreworCXJldHVybiggaXM8IFByb3BlcnR5RWxlbWVudCA+KCkgfHwKKwkJCWlzPCBNYWNoaW5lICAgICAgICAgPigpIHx8CisvLwkJCWlzPCBJbnN0YW5jZSAgICAgICAgPigpIHx8CisJCQlpczwgVHJhbnNpdGlvbiAgICAgID4oKSB8fAorCQkJaXM8IFJvdXRpbmUgICAgICAgICA+KCkgKTsKK30KKwordGVtcGxhdGU8PiBib29sIENsYXNzS2luZEltcGw6Omlzbm90PCBCZWhhdmlvcmFsRWxlbWVudCA+KCkgY29uc3QKK3sKKwlyZXR1cm4oIGlzbm90PCBQcm9wZXJ0eUVsZW1lbnQgPigpICYmCisJCQlpc25vdDwgTWFjaGluZSAgICAgICAgID4oKSAmJgorLy8JCQlpc25vdDwgSW5zdGFuY2UgICAgICAgID4oKSAmJgorCQkJaXNub3Q8IFRyYW5zaXRpb24gICAgICA+KCkgJiYKKwkJCWlzbm90PCBSb3V0aW5lICAgICAgICAgPigpICk7Cit9CisKKwordGVtcGxhdGU8PiBib29sIENsYXNzS2luZEltcGw6OmlzPCBQcm9wZXJ0eUVsZW1lbnQgPigpIGNvbnN0Cit7CisJcmV0dXJuKCBpczwgVmFyaWFibGUgPigpIHx8CisJCQlpczwgUG9ydCAgICAgPigpIHx8CisJCQlpczwgQnVmZmVyICAgPigpIHx8CisJCQlpczwgQ2hhbm5lbCAgPigpICk7Cit9CisKK3RlbXBsYXRlPD4gYm9vbCBDbGFzc0tpbmRJbXBsOjppc25vdDwgUHJvcGVydHlFbGVtZW50ID4oKSBjb25zdAoreworCXJldHVybiggaXNub3Q8IFZhcmlhYmxlID4oKSAmJgorCQkJaXNub3Q8IFBvcnQgICAgID4oKSAmJgorCQkJaXNub3Q8IEJ1ZmZlciAgID4oKSAmJgorCQkJaXNub3Q8IENoYW5uZWwgID4oKSApOworfQorCisKK3RlbXBsYXRlPD4gYm9vbCBDbGFzc0tpbmRJbXBsOjppczwgT2JqZWN0RWxlbWVudCA+KCkgY29uc3QKK3sKKwlyZXR1cm4oIGlzPCBQcm9wZXJ0eUVsZW1lbnQgICA+KCkgfHwKKwkJCWlzPCBCZWhhdmlvcmFsRWxlbWVudCA+KCkgfHwKKwkJCWlzPCBEYXRhVHlwZSAgICAgICAgICA+KCkgfHwKKwkJCWlzPCBDb25uZWN0b3IgICAgICAgICA+KCkgfHwKKwkJCWlzPCBDb21Sb3V0ZSAgICAgICAgICA+KCkgfHwKKwkJCWlzPCBCYXNlQ29tcGlsZWRGb3JtICA+KCkgfHwKKwkJCWlzPCBXT2JqZWN0ICAgICAgICAgICA+KCkgKTsKK30KKwordGVtcGxhdGU8PiBib29sIENsYXNzS2luZEltcGw6Omlzbm90PCBPYmplY3RFbGVtZW50ID4oKSBjb25zdAoreworCXJldHVybiggaXNub3Q8IFByb3BlcnR5RWxlbWVudCAgID4oKSAmJgorCQkJaXNub3Q8IEJlaGF2aW9yYWxFbGVtZW50ID4oKSAmJgorCQkJaXNub3Q8IERhdGFUeXBlICAgICAgICAgID4oKSAmJgorCQkJaXNub3Q8IENvbm5lY3RvciAgICAgICAgID4oKSAmJgorCQkJaXNub3Q8IENvbVJvdXRlICAgICAgICAgID4oKSAmJgorCQkJaXNub3Q8IEJhc2VDb21waWxlZEZvcm0gID4oKSAmJgorCQkJaXNub3Q8IFdPYmplY3QgICAgICAgICAgID4oKSApOworfQorCisKK3RlbXBsYXRlPD4gYm9vbCBDbGFzc0tpbmRJbXBsOjppczwgTnVtYmVyID4oKSBjb25zdAoreworCXJldHVybiggaXM8IEludGVnZXIgID4oKSB8fAorCQkJaXM8IFJhdGlvbmFsID4oKSB8fAorCQkJaXM8IEZsb2F0ICAgID4oKSApOworfQorCit0ZW1wbGF0ZTw+IGJvb2wgQ2xhc3NLaW5kSW1wbDo6aXNub3Q8IE51bWJlciA+KCkgY29uc3QKK3sKKwlyZXR1cm4oIGlzbm90PCBJbnRlZ2VyICA+KCkgJiYKKwkJCWlzbm90PCBSYXRpb25hbCA+KCkgJiYKKwkJCWlzbm90PCBGbG9hdCAgICA+KCkgKTsKK30KKworCit0ZW1wbGF0ZTw+IGJvb2wgQ2xhc3NLaW5kSW1wbDo6aXM8IEJ1aWx0aW5RdWV1ZSA+KCkgY29uc3QKK3sKKwlyZXR1cm4oIGlzPCBCdWlsdGluRmlmbyA+KCkgfHwKKwkJCWlzPCBCdWlsdGluTGlmbyA+KCkgKTsKK30KKwordGVtcGxhdGU8PiBib29sIENsYXNzS2luZEltcGw6Omlzbm90PCBCdWlsdGluUXVldWUgPigpIGNvbnN0Cit7CisJcmV0dXJuKCBpc25vdDwgQnVpbHRpbkZpZm8gPigpICYmCisJCQlpc25vdDwgQnVpbHRpbkxpZm8gPigpICk7Cit9CisKKwordGVtcGxhdGU8PiBib29sIENsYXNzS2luZEltcGw6OmlzPCBCdWlsdGluTGlzdCA+KCkgY29uc3QKK3sKKwlyZXR1cm4oIGlzX2V4YWN0bHk8IEJ1aWx0aW5MaXN0ID4oKSB8fAorCQkJaXM8IEJ1aWx0aW5RdWV1ZSAgICAgICAgPigpIHx8CisJCQlpczwgQnVpbHRpblNldCAgICAgICAgICA+KCkgfHwKKwkJCWlzPCBCdWlsdGluQmFnICAgICAgICAgID4oKSApOworfQorCit0ZW1wbGF0ZTw+IGJvb2wgQ2xhc3NLaW5kSW1wbDo6aXNub3Q8IEJ1aWx0aW5MaXN0ID4oKSBjb25zdAoreworCXJldHVybiggaXNub3RfZXhhY3RseTwgQnVpbHRpbkxpc3QgPigpIHx8CisJCQlpc25vdDwgQnVpbHRpblF1ZXVlICAgICAgICA+KCkgfHwKKwkJCWlzbm90PCBCdWlsdGluU2V0ICAgICAgICAgID4oKSB8fAorCQkJaXNub3Q8IEJ1aWx0aW5CYWcgICAgICAgICAgPigpICk7Cit9CisKKwordGVtcGxhdGU8PiBib29sIENsYXNzS2luZEltcGw6OmlzPCBCdWlsdGluVmVjdG9yID4oKSBjb25zdAoreworCXJldHVybiggaXNfZXhhY3RseTwgQnVpbHRpblZlY3RvciA+KCkgfHwKKwkJCWlzPCBCdWlsdGluUmV2ZXJzZVZlY3RvciAgPigpICk7Cit9CisKK3RlbXBsYXRlPD4gYm9vbCBDbGFzc0tpbmRJbXBsOjppc25vdDwgQnVpbHRpblZlY3RvciA+KCkgY29uc3QKK3sKKwlyZXR1cm4oIGlzbm90X2V4YWN0bHk8IEJ1aWx0aW5WZWN0b3IgPigpICYmCisJCQlpc25vdDwgQnVpbHRpblJldmVyc2VWZWN0b3IgID4oKSApOworfQorCisKK3RlbXBsYXRlPD4gYm9vbCBDbGFzc0tpbmRJbXBsOjppczwgQnVpbHRpbkFycmF5ID4oKSBjb25zdAoreworCXJldHVybiggaXM8IEFycmF5Qm9vbGVhbiAgICAgICAgICAgICA+KCkgfHwKKwkJCWlzPCBBcnJheUNoYXJhY3RlciAgICAgICAgICAgPigpIHx8CisJCQlpczwgQXJyYXlJbnRlZ2VyICAgICAgICAgICAgID4oKSB8fAorCQkJaXM8IEFycmF5RmxvYXQgICAgICAgICAgICAgICA+KCkgfHwKKwkJCWlzPCBBcnJheVN0cmluZyAgICAgICAgICAgICAgPigpIHx8CisJCQlpczwgQXJyYXlJZGVudGlmaWVyICAgICAgICAgID4oKSB8fAorCQkJaXM8IEFycmF5UXVhbGlmaWVkSWRlbnRpZmllciA+KCkgfHwKKwkJCWlzPCBBcnJheUJGICAgICAgICAgICAgICAgICAgPigpICk7Cit9CisKK3RlbXBsYXRlPD4gYm9vbCBDbGFzc0tpbmRJbXBsOjppc25vdDwgQnVpbHRpbkFycmF5ID4oKSBjb25zdAoreworCXJldHVybiggaXNub3Q8IEFycmF5Qm9vbGVhbiAgICAgICAgICAgICA+KCkgJiYKKwkJCWlzbm90PCBBcnJheUNoYXJhY3RlciAgICAgICAgICAgPigpICYmCisJCQlpc25vdDwgQXJyYXlJbnRlZ2VyICAgICAgICAgICAgID4oKSAmJgorCQkJaXNub3Q8IEFycmF5RmxvYXQgICAgICAgICAgICAgICA+KCkgJiYKKwkJCWlzbm90PCBBcnJheVN0cmluZyAgICAgICAgICAgICAgPigpICYmCisJCQlpc25vdDwgQXJyYXlJZGVudGlmaWVyICAgICAgICAgID4oKSAmJgorCQkJaXNub3Q8IEFycmF5UXVhbGlmaWVkSWRlbnRpZmllciA+KCkgJiYKKwkJCWlzbm90PCBBcnJheUJGICAgICAgICAgICAgICAgICAgPigpICk7Cit9CisKKwordGVtcGxhdGU8PiBib29sIENsYXNzS2luZEltcGw6OmlzX3N0cmljdGx5PCBCdWlsdGluQXJyYXkgPigpIGNvbnN0Cit7CisJcmV0dXJuKCBpczwgQXJyYXlCb29sZWFuICAgICAgICAgICAgID4oKSB8fAorCQkJaXM8IEFycmF5Q2hhcmFjdGVyICAgICAgICAgICA+KCkgfHwKKwkJCWlzPCBBcnJheUludGVnZXIgICAgICAgICAgICAgPigpIHx8CisJCQlpczwgQXJyYXlGbG9hdCAgICAgICAgICAgICAgID4oKSB8fAorCQkJaXM8IEFycmF5U3RyaW5nICAgICAgICAgICAgICA+KCkgfHwKKwkJCWlzPCBBcnJheUlkZW50aWZpZXIgICAgICAgICAgPigpIHx8CisJCQlpczwgQXJyYXlRdWFsaWZpZWRJZGVudGlmaWVyID4oKSApOworfQorCit0ZW1wbGF0ZTw+IGJvb2wgQ2xhc3NLaW5kSW1wbDo6aXNub3Rfc3RyaWN0bHk8IEJ1aWx0aW5BcnJheSA+KCkgY29uc3QKK3sKKwlyZXR1cm4oIGlzPCBBcnJheUJGID4oKSApOworfQorCisKK3RlbXBsYXRlPD4gYm9vbCBDbGFzc0tpbmRJbXBsOjppczwgQnVpbHRpbkNvbnRhaW5lciA+KCkgY29uc3QKK3sKKwlyZXR1cm4oIGlzPCBCdWlsdGluVmVjdG9yICAgICAgICA+KCkgfHwKKwkJCWlzPCBCdWlsdGluTGlzdCAgICAgICAgICA+KCkgfHwKKwkJCWlzPCBCdWlsdGluUXVldWUgICAgICAgICA+KCkgfHwKKwkJCWlzPCBCdWlsdGluUmV2ZXJzZVZlY3RvciA+KCkgKTsKK30KKwordGVtcGxhdGU8PiBib29sIENsYXNzS2luZEltcGw6Omlzbm90PCBCdWlsdGluQ29udGFpbmVyID4oKSBjb25zdAoreworCXJldHVybiggaXNub3Q8IEJ1aWx0aW5WZWN0b3IgICAgICAgID4oKSAmJgorCQkJaXNub3Q8IEJ1aWx0aW5MaXN0ICAgICAgICAgID4oKSAmJgorCQkJaXNub3Q8IEJ1aWx0aW5RdWV1ZSAgICAgICAgID4oKSAmJgorCQkJaXNub3Q8IEJ1aWx0aW5SZXZlcnNlVmVjdG9yID4oKSApOworfQorCisKK3RlbXBsYXRlPD4gYm9vbCBDbGFzc0tpbmRJbXBsOjppczwgQnVpbHRpbkNvbGxlY3Rpb24gPigpIGNvbnN0Cit7CisJcmV0dXJuKCBpczwgQnVpbHRpbkFycmF5ICAgICA+KCkgfHwKKwkJCWlzPCBCdWlsdGluQ29udGFpbmVyID4oKSApOworfQorCit0ZW1wbGF0ZTw+IGJvb2wgQ2xhc3NLaW5kSW1wbDo6aXNub3Q8IEJ1aWx0aW5Db2xsZWN0aW9uID4oKSBjb25zdAoreworCXJldHVybiggaXNub3Q8IEJ1aWx0aW5BcnJheSAgICAgPigpICYmCisJCQlpc25vdDwgQnVpbHRpbkNvbnRhaW5lciA+KCkgKTsKK30KKworCit0ZW1wbGF0ZTw+IGJvb2wgQ2xhc3NLaW5kSW1wbDo6aXM8IEJ1aWx0aW5Gb3JtID4oKSBjb25zdAoreworCXJldHVybiggaXM8IEJvb2xlYW4gICAgICAgICAgID4oKSB8fAorCQkJaXM8IENoYXJhY3RlciAgICAgICAgID4oKSB8fAorCQkJaXM8IE51bWJlciAgICAgICAgICAgID4oKSB8fAorCQkJaXM8IFN0cmluZyAgICAgICAgICAgID4oKSB8fAorCQkJaXM8IEJ1aWx0aW5Db2xsZWN0aW9uID4oKSApOworfQorCit0ZW1wbGF0ZTw+IGJvb2wgQ2xhc3NLaW5kSW1wbDo6aXNub3Q8IEJ1aWx0aW5Gb3JtID4oKSBjb25zdAoreworCXJldHVybiggaXNub3Q8IEJvb2xlYW4gICAgICAgICAgID4oKSAmJgorCQkJaXNub3Q8IENoYXJhY3RlciAgICAgICAgID4oKSAmJgorCQkJaXNub3Q8IE51bWJlciAgICAgICAgICAgID4oKSAmJgorCQkJaXNub3Q8IFN0cmluZyAgICAgICAgICAgID4oKSAmJgorCQkJaXNub3Q8IEJ1aWx0aW5Db2xsZWN0aW9uID4oKSApOworfQorCisKK3RlbXBsYXRlPD4gYm9vbCBDbGFzc0tpbmRJbXBsOjppczwgQmFzZUluc3RhbmNlRm9ybSA+KCkgY29uc3QKK3sKKwlyZXR1cm4oIGlzPCBJbnN0YW5jZU9mRGF0YSAgICA+KCkgfHwKKwkJCWlzPCBJbnN0YW5jZU9mUG9ydCAgICA+KCkgfHwKKwkJCWlzPCBJbnN0YW5jZU9mTWFjaGluZSA+KCkgfHwKKwkJCWlzPCBJbnN0YW5jZU9mQnVmZmVyICA+KCkgfHwKKwkJCWlzPCBJbnN0YW5jZU9mQ29ubmVjdCA+KCkgKTsKK30KKwordGVtcGxhdGU8PiBib29sIENsYXNzS2luZEltcGw6Omlzbm90PCBCYXNlSW5zdGFuY2VGb3JtID4oKSBjb25zdAoreworCXJldHVybiggaXNub3Q8IEluc3RhbmNlT2ZEYXRhICAgID4oKSAmJgorCQkJaXNub3Q8IEluc3RhbmNlT2ZQb3J0ICAgID4oKSAmJgorCQkJaXNub3Q8IEluc3RhbmNlT2ZNYWNoaW5lID4oKSAmJgorCQkJaXNub3Q8IEluc3RhbmNlT2ZCdWZmZXIgID4oKSAmJgorCQkJaXNub3Q8IEluc3RhbmNlT2ZDb25uZWN0ID4oKSApOworfQorCisKK3RlbXBsYXRlPD4gYm9vbCBDbGFzc0tpbmRJbXBsOjppczwgQXZtUHJvZ3JhbSA+KCkgY29uc3QKK3sKKwlyZXR1cm4oIGlzX2V4YWN0bHk8IEF2bVByb2dyYW0gPigpIHx8CisJCQlpczwgQXZtVHJhbnNpdGlvbiAgICAgID4oKSB8fAorCQkJaXM8IEV4ZWN1dGFibGVGb3JtICAgICA+KCkgKTsKK30KKwordGVtcGxhdGU8PiBib29sIENsYXNzS2luZEltcGw6Omlzbm90PCBBdm1Qcm9ncmFtID4oKSBjb25zdAoreworCXJldHVybiggaXNub3RfZXhhY3RseTwgQXZtUHJvZ3JhbSA+KCkgJiYKKwkJCWlzbm90PCBBdm1UcmFuc2l0aW9uICAgICAgPigpICYmCisJCQlpc25vdDwgRXhlY3V0YWJsZUZvcm0gICAgID4oKSApOworfQorCisKK3RlbXBsYXRlPD4gYm9vbCBDbGFzc0tpbmRJbXBsOjppczwgQmFzZUF2bVByb2dyYW0gPigpIGNvbnN0Cit7CisJcmV0dXJuKCBpc19leGFjdGx5PCBCYXNlQXZtUHJvZ3JhbSA+KCkgfHwKKwkJCWlzPCBBdm1Qcm9ncmFtICAgICAgICAgICAgID4oKSB8fAorCQkJaXM8IEF2bUxhbWJkYSAgICAgICAgICAgICAgPigpICk7Cit9CisKK3RlbXBsYXRlPD4gYm9vbCBDbGFzc0tpbmRJbXBsOjppc25vdDwgQmFzZUF2bVByb2dyYW0gPigpIGNvbnN0Cit7CisJcmV0dXJuKCBpc25vdF9leGFjdGx5PCBCYXNlQXZtUHJvZ3JhbSA+KCkgJiYKKwkJCWlzbm90PCBBdm1Qcm9ncmFtICAgICAgICAgICAgID4oKSAmJgorCQkJaXNub3Q8IEF2bUxhbWJkYSAgICAgICAgICAgICAgPigpICk7Cit9CisKKwordGVtcGxhdGU8PiBib29sIENsYXNzS2luZEltcGw6OmlzPCBCYXNlU3ltYm9sVHlwZVNwZWNpZmllciA+KCkgY29uc3QKK3sKKwlyZXR1cm4oIGlzPCBDbGFzc1R5cGVTcGVjaWZpZXIgPigpIHx8CisJCQlpczwgRW51bVR5cGVTcGVjaWZpZXIgID4oKSB8fAorCQkJaXM8IFVuaW9uVHlwZVNwZWNpZmllciA+KCkgKTsKK30KKwordGVtcGxhdGU8PiBib29sIENsYXNzS2luZEltcGw6Omlzbm90PCBCYXNlU3ltYm9sVHlwZVNwZWNpZmllciA+KCkgY29uc3QKK3sKKwlyZXR1cm4oIGlzbm90PCBDbGFzc1R5cGVTcGVjaWZpZXIgPigpICYmCisJCQlpc25vdDwgRW51bVR5cGVTcGVjaWZpZXIgID4oKSAmJgorCQkJaXNub3Q8IFVuaW9uVHlwZVNwZWNpZmllciA+KCkgKTsKK30KKworCit0ZW1wbGF0ZTw+IGJvb2wgQ2xhc3NLaW5kSW1wbDo6aXM8IEJhc2VUeXBlU3BlY2lmaWVyID4oKSBjb25zdAoreworCXJldHVybiggaXNfZXhhY3RseTwgQmFzZVR5cGVTcGVjaWZpZXIgPigpIHx8CisJCQlpczwgQmFzZVN5bWJvbFR5cGVTcGVjaWZpZXIgICA+KCkgfHwKKwkJCWlzPCBDb250YWluZXJUeXBlU3BlY2lmaWVyICAgID4oKSB8fAorCQkJaXM8IEludGVydmFsVHlwZVNwZWNpZmllciAgICAgPigpIHx8CisJCQlpczwgVHlwZUFsaWFzU3BlY2lmaWVyICAgICAgICA+KCkgKTsKK30KKwordGVtcGxhdGU8PiBib29sIENsYXNzS2luZEltcGw6Omlzbm90PCBCYXNlVHlwZVNwZWNpZmllciA+KCkgY29uc3QKK3sKKwlyZXR1cm4oIGlzbm90X2V4YWN0bHk8IEJhc2VUeXBlU3BlY2lmaWVyID4oKSAmJgorCQkJaXNub3Q8IEJhc2VTeW1ib2xUeXBlU3BlY2lmaWVyICAgPigpICYmCisJCQlpc25vdDwgQ29udGFpbmVyVHlwZVNwZWNpZmllciAgICA+KCkgJiYKKwkJCWlzbm90PCBJbnRlcnZhbFR5cGVTcGVjaWZpZXIgICAgID4oKSAmJgorCQkJaXNub3Q8IFR5cGVBbGlhc1NwZWNpZmllciAgICAgICAgPigpICk7Cit9CisKKwordGVtcGxhdGU8PiBib29sIENsYXNzS2luZEltcGw6OmlzPCBCYXNlQ29tcGlsZWRGb3JtID4oKSBjb25zdAoreworCXJldHVybiggaXM8IEJhc2VJbnN0YW5jZUZvcm0gID4oKSB8fAorCQkJaXM8IEJhc2VBdm1Qcm9ncmFtICAgID4oKSB8fAorCQkJaXM8IEV4ZWN1dGFibGVTeXN0ZW0gID4oKSB8fAorCQkJaXM8IENvbVJvdXRlRGF0YSAgICAgID4oKSB8fAorCQkJaXM8IEJhc2VUeXBlU3BlY2lmaWVyID4oKSApOworfQorCit0ZW1wbGF0ZTw+IGJvb2wgQ2xhc3NLaW5kSW1wbDo6aXNub3Q8IEJhc2VDb21waWxlZEZvcm0gPigpIGNvbnN0Cit7CisJcmV0dXJuKCBpc25vdDwgQmFzZUluc3RhbmNlRm9ybSAgPigpICYmCisJCQlpc25vdDwgQmFzZUF2bVByb2dyYW0gICAgPigpICYmCisJCQlpc25vdDwgRXhlY3V0YWJsZVN5c3RlbSAgPigpICYmCisJCQlpc25vdDwgQ29tUm91dGVEYXRhICAgICAgPigpICYmCisJCQlpc25vdDwgQmFzZVR5cGVTcGVjaWZpZXIgPigpICk7Cit9CisKKwordGVtcGxhdGU8PiBib29sIENsYXNzS2luZEltcGw6OmlzPCBSYW1CdWZmZXIgPigpIGNvbnN0Cit7CisJcmV0dXJuKCBpc19leGFjdGx5PCBSYW1CdWZmZXIgPigpIHx8CisJCQlpczwgQnJvYWRjYXN0QnVmZmVyICAgPigpICk7Cit9CisKK3RlbXBsYXRlPD4gYm9vbCBDbGFzc0tpbmRJbXBsOjppc25vdDwgUmFtQnVmZmVyID4oKSBjb25zdAoreworCXJldHVybiggaXNub3RfZXhhY3RseTwgUmFtQnVmZmVyID4oKSAmJgorCQkJaXNub3Q8IEJyb2FkY2FzdEJ1ZmZlciAgID4oKSApOworfQorCisKK3RlbXBsYXRlPD4gYm9vbCBDbGFzc0tpbmRJbXBsOjppczwgQmFzZUJ1ZmZlclF1ZXVlID4oKSBjb25zdAoreworCXJldHVybiggaXM8IEZpZm9CdWZmZXIgICAgICA+KCkgfHwKKwkJCWlzPCBMaWZvQnVmZmVyICAgICAgPigpIHx8CisJCQlpczwgTXVsdGlGaWZvQnVmZmVyID4oKSB8fAorCQkJaXM8IE11bHRpTGlmb0J1ZmZlciA+KCkgfHwKKwkJCWlzPCBTZXRCdWZmZXIgICAgICAgPigpIHx8CisJCQlpczwgTXVsdGlzZXRCdWZmZXIgID4oKSApOworfQorCit0ZW1wbGF0ZTw+IGJvb2wgQ2xhc3NLaW5kSW1wbDo6aXNub3Q8IEJhc2VCdWZmZXJRdWV1ZSA+KCkgY29uc3QKK3sKKwlyZXR1cm4oIGlzbm90PCBGaWZvQnVmZmVyICAgICAgPigpICYmCisJCQlpc25vdDwgTGlmb0J1ZmZlciAgICAgID4oKSAmJgorCQkJaXNub3Q8IE11bHRpRmlmb0J1ZmZlciA+KCkgJiYKKwkJCWlzbm90PCBNdWx0aUxpZm9CdWZmZXIgPigpICYmCisJCQlpc25vdDwgU2V0QnVmZmVyICAgICAgID4oKSAmJgorCQkJaXNub3Q8IE11bHRpc2V0QnVmZmVyICA+KCkgKTsKK30KKworCit0ZW1wbGF0ZTw+IGJvb2wgQ2xhc3NLaW5kSW1wbDo6aXM8IEJhc2VCdWZmZXJGb3JtID4oKSBjb25zdAoreworCXJldHVybiggaXM8IEJhc2VCdWZmZXJRdWV1ZSA+KCkgfHwKKwkJCWlzPCBSYW1CdWZmZXIgICAgICAgPigpICk7Cit9CisKK3RlbXBsYXRlPD4gYm9vbCBDbGFzc0tpbmRJbXBsOjppc25vdDwgQmFzZUJ1ZmZlckZvcm0gPigpIGNvbnN0Cit7CisJcmV0dXJuKCBpc25vdDwgQmFzZUJ1ZmZlclF1ZXVlID4oKSAmJgorCQkJaXNub3Q8IFJhbUJ1ZmZlciAgICAgICA+KCkgKTsKK30KKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2Jhc2UvQ2xhc3NLaW5kSW5mby5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYmFzZS9DbGFzc0tpbmRJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZlYmRkNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2Jhc2UvQ2xhc3NLaW5kSW5mby5oCkBAIC0wLDAgKzEsNjE4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjYgZMOpYy4gMjAxMgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEJBU0VfQ0xBU1NLSU5ESU5GT19IXworI2RlZmluZSBCQVNFX0NMQVNTS0lORElORk9fSF8KKworI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVpbmZvPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHByaW50ZXIvT3V0U3RyZWFtLmg+CisKKyNpbmNsdWRlIDx1dGlsL2F2bV9hc3NlcnQuaD4KKyNpbmNsdWRlIDx1dGlsL2F2bV9pbmplY3Rvci5oPgorI2luY2x1ZGUgPHV0aWwvYXZtX251bWVyaWMuaD4KKyNpbmNsdWRlIDx1dGlsL2F2bV9zdHJpbmcuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKwordHlwZWRlZiBhdm1fdWludDhfdCAgICAgICAgICBjbGFzc19raW5kX3Q7CisKKworZW51bSBFTlVNX0NMQVNTX0tJTkQKK3sKKwkvLyBVTkRFRklORUQKKwlGT1JNX1VOREVGSU5FRF9LSU5EID0gMCwKKworCS8vIEJVSUxUSU4KKwlGT1JNX0JVSUxUSU5fQk9PTEVBTl9LSU5ELAorCisJRk9STV9CVUlMVElOX0NIQVJBQ1RFUl9LSU5ELAorCisJRk9STV9CVUlMVElOX0lOVEVHRVJfS0lORCwKKwlGT1JNX0JVSUxUSU5fUkFUSU9OQUxfS0lORCwKKwlGT1JNX0JVSUxUSU5fRkxPQVRfS0lORCwKKworCUZPUk1fQlVJTFRJTl9TVFJJTkdfS0lORCwKKwlGT1JNX0JVSUxUSU5fSURFTlRJRklFUl9LSU5ELAorCUZPUk1fQlVJTFRJTl9RVUFMSUZJRURfSURFTlRJRklFUl9LSU5ELAorCisJLy8gT1BFUkFUT1IKKwlGT1JNX09QRVJBVE9SX0tJTkQsCisKKwkvLyBFWFBSRVNTSU9OICwgU1RBVEVNRU5UCisJRk9STV9BVk1DT0RFX0tJTkQsCisKKworCS8vIEVYRUNVVEFCTEUgT0JKRUNUIElOU1RBTkNFCisJRk9STV9JTlNUQU5DRV9CVUZGRVJfS0lORCwKKwlGT1JNX0lOU1RBTkNFX0NPTk5FQ1RPUl9LSU5ELAorCUZPUk1fSU5TVEFOQ0VfREFUQV9LSU5ELAorCUZPUk1fSU5TVEFOQ0VfTUFDSElORV9LSU5ELAorCUZPUk1fSU5TVEFOQ0VfUE9SVF9LSU5ELAorCisJLy8gRVhFQ1VUQUJMRSBPQkpFQ1QKKwlGT1JNX0FWTUxBTUJEQV9LSU5ELAorCUZPUk1fQVZNUFJPR1JBTV9LSU5ELAorCUZPUk1fQVZNVFJBTlNJVElPTl9LSU5ELAorCUZPUk1fRVhFQ1VUQUJMRV9NQUNISU5FX0tJTkQsCisJRk9STV9FWEVDVVRBQkxFX1NZU1RFTV9LSU5ELAorCisJLy8gUlVOVElNRSBPQkpFQ1QKKwlGT1JNX1JVTlRJTUVfSURfS0lORCwKKwlGT1JNX1JVTlRJTUVfS0lORCwKKworCS8vIEVYRUNVVElPTiBPQkpFQ1QKKwlGT1JNX0VYRUNVVElPTl9DT05GSUdVUkFUSU9OX0tJTkQsCisJRk9STV9FWEVDVVRJT05fREFUQV9LSU5ELAorCUZPUk1fRVhFQ1VUSU9OX0NPTlRFWFRfS0lORCwKKworCS8vIFdPUktGTE9XIENPTkZJR1VSQVRJT04KKwlGT1JNX1dPQkpFQ1RfS0lORCwKKworCS8vIExJQSBvciBGU1AKKwlGT1JNX1VGSV9LSU5ELAorCisJLy8gWExJQSBvciBYRlNQCisJRk9STV9YRlNQX0JVRkZFUl9LSU5ELAorCUZPUk1fWEZTUF9DSEFOTkVMX0tJTkQsCisJRk9STV9YRlNQX0NPTV9QT0lOVF9LSU5ELAorCUZPUk1fWEZTUF9DT01fUk9VVEVfS0lORCwKKwlGT1JNX1hGU1BfQ09OTkVDVE9SX0tJTkQsCisJRk9STV9YRlNQX01BQ0hJTkVfS0lORCwKKy8vCUZPUk1fWEZTUF9JTlNUQU5DRV9LSU5ELAorCUZPUk1fWEZTUF9QQUNLQUdFX0tJTkQsCisJRk9STV9YRlNQX1BPUlRfS0lORCwKKwlGT1JNX1hGU1BfUk9VVElORV9LSU5ELAorCUZPUk1fWEZTUF9TWVNURU1fS0lORCwKKwlGT1JNX1hGU1BfVFJBTlNJVElPTl9LSU5ELAorCUZPUk1fWEZTUF9WQVJJQUJMRV9LSU5ELAorCS8vIFRZUEUKKwlGT1JNX1hGU1BfREFUQVRZUEVfS0lORCwKKworCS8vIEFSUkFZCisJRk9STV9BUlJBWV9CT09MRUFOX0tJTkQsCisJRk9STV9BUlJBWV9DSEFSQUNURVJfS0lORCwKKwlGT1JNX0FSUkFZX0lOVEVHRVJfS0lORCwKKwlGT1JNX0FSUkFZX1JBVElPTkFMX0tJTkQsCisJRk9STV9BUlJBWV9GTE9BVF9LSU5ELAorCUZPUk1fQVJSQVlfU1RSSU5HX0tJTkQsCisJRk9STV9BUlJBWV9JREVOVElGSUVSX0tJTkQsCisJRk9STV9BUlJBWV9RVUFMSUZJRURfSURFTlRJRklFUl9LSU5ELAorCUZPUk1fQVJSQVlfQkZfS0lORCwKKworCS8vIENPTlRBSU5FUgorCUZPUk1fQ09OVEFJTkVSX1ZFQ1RPUl9LSU5ELAorCUZPUk1fQ09OVEFJTkVSX1JFVkVSU0VfVkVDVE9SX0tJTkQsCisJRk9STV9DT05UQUlORVJfTElTVF9LSU5ELAorCUZPUk1fQ09OVEFJTkVSX1NFVF9LSU5ELAorCUZPUk1fQ09OVEFJTkVSX0JBR19LSU5ELAorCUZPUk1fQ09OVEFJTkVSX0ZJRk9fS0lORCwKKwlGT1JNX0NPTlRBSU5FUl9MSUZPX0tJTkQsCisKKwkvLyBCVUZGRVIKKwlGT1JNX0JVRkZFUl9GSUZPX0tJTkQsCisJRk9STV9CVUZGRVJfTElGT19LSU5ELAorCUZPUk1fQlVGRkVSX01VTFRJX0ZJRk9fS0lORCwKKwlGT1JNX0JVRkZFUl9NVUxUSV9MSUZPX0tJTkQsCisKKwlGT1JNX0JVRkZFUl9NVUxUSVNFVF9LSU5ELAorCUZPUk1fQlVGRkVSX1NFVF9LSU5ELAorCisJRk9STV9CVUZGRVJfQlJPQURDQVNUX0tJTkQsCisJRk9STV9CVUZGRVJfUkFNX0tJTkQsCisKKwkvLyBDT00KKwlGT1JNX01FU1NBR0VfS0lORCwKKwlGT1JNX0NPTV9ST1VURV9EQVRBX0tJTkQsCisJRk9STV9ST1VURVJfS0lORCwKKwlGT1JNX1JPVVRJTkdfREFUQV9LSU5ELAorCisJLy8gT1RIRVIKKwlGT1JNX0VYRUNfRklMVEVSX0ZPUk1VTEFfREFUQV9LSU5ELAorCisJLy8gRVhFQ1VUSU9OIFRSQUNFCisJRk9STV9UUkFDRV9QT0lOVF9LSU5ELAorCUZPUk1fVFJBQ0VfU0VRVUVOQ0VfS0lORCwKKworCS8vIERFU1RST1lFRAorCUZPUk1fREVTVFJPWUVEX0tJTkQKK307CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENMQVNTIEtJTkQgSU5GTworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0cnVjdCBDbGFzc0tpbmRJbmZvIDoKKwkJQVZNX0lOSkVDVF9JTlNUQU5DRV9DT1VOVEVSX0NMQVNTKCBDbGFzc0tpbmRJbmZvICkKK3sKKworCWZyaWVuZCBjbGFzcyBDbGFzc0tpbmRJbmZvSW5pdGlhbGl6ZXI7CisKKworcHVibGljOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlzdGF0aWMgQ2xhc3NLaW5kSW5mbyAqIFRZUEVfVU5ERUZJTkVEX0lORk87CisKKwljb25zdCBjbGFzc19raW5kX3QgbUtJTkQ7CisKKwljb25zdCBjaGFyICogbVROQU1FOworCisJc3RkOjpzdHJpbmcgbU5BTUU7CisKKworcHVibGljOgorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQ2xhc3NLaW5kSW5mbyhjbGFzc19raW5kX3QgYUNsYXNzS2luZCwgY29uc3QgY2hhciAqIHRuYW1lKTsKKworCS8qKgorCSAqIGluZm8KKwkgKi8KKwlzdGQ6OnN0cmluZyBpbmZvKCkgY29uc3Q7CisKK307CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENMQVNTIEtJTkQgSU5GTyBJTklUSUFMSVpFUgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyBjbGFzcyBDbGFzc0tpbmRJbmZvSW5pdGlhbGl6ZXIKK3sKKworcHVibGljOgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gSU5JVElBTElaQVRJT04gLyBERVNUUlVDVElPTiAgSU5WQVJJQU5UCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCUNsYXNzS2luZEluZm9Jbml0aWFsaXplcigpOworCisJfkNsYXNzS2luZEluZm9Jbml0aWFsaXplcigpOworCisKK3B1YmxpYzoKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gTE9BREVSIC8gRElTUE9TRVIgIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXN0YXRpYyB2b2lkIGxvYWQoKTsKKwlzdGF0aWMgdm9pZCBkaXNwb3NlKCk7CisKKworcHVibGljOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlzdGF0aWMgY29uc3QgY2xhc3Nfa2luZF90IFRZUEVfVU5ERUZJTkVEX0lEID0gMDsKKworCXN0YXRpYyBjbGFzc19raW5kX3QgVFlQRV9ORVdfSUQ7CisKKworCXN0YXRpYyBzdGQ6OnZlY3RvcjwgQ2xhc3NLaW5kSW5mbyAqID4gKiBDS0lfVEFCTEU7CisKKworCXRlbXBsYXRlPCBjbGFzcyBUID4KKwlzdGF0aWMgQ2xhc3NLaW5kSW5mbyAmIGNsYXNzS2luZEluZm8oKQorCXsKKwkJc3RhdGljIENsYXNzS2luZEluZm8gX1RZUEVfSU5GT18oIFRZUEVfTkVXX0lEKysgLCB0eXBlaWQoVCkubmFtZSgpICk7CisKKwkJcmV0dXJuKCBfVFlQRV9JTkZPXyApOworCX0KKworCisJc3RhdGljIHZvaWQgdG9TdHJlYW1UYWJsZShPdXRTdHJlYW0gJiBvcywgY29uc3Qgc3RkOjpzdHJpbmcgJiBtc2cpOworCit9ICBDTEFTU19LSU5EX0lORk9fSU5JVElBTElaRVI7CisKKworI2RlZmluZSBDS0lJX1RBQkxFX0lORk8oIGFDbGFzc0tpbmQgKSAgXAorCQkoKkNsYXNzS2luZEluZm9Jbml0aWFsaXplcjo6Q0tJX1RBQkxFKVsgYUNsYXNzS2luZCBdCisKKyNkZWZpbmUgQ0tJSV9UQUJMRV9JTkZPX1QoIGFDbGFzc0tpbmQgKSAgXAorCQkoKkNsYXNzS2luZEluZm9Jbml0aWFsaXplcjo6Q0tJX1RBQkxFKSAgXAorCQkJCVsgQ2xhc3NLaW5kSW5mb0ltcGw8IFQgPjo6Q0xBU1NfS0lORF9JTkZPLm1LSU5EIF0KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ0xBU1MgS0lORCBJTkZPIElNUExFTUVOVEFUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordGVtcGxhdGU8IGNsYXNzIFQgPgorY2xhc3MgQ2xhc3NLaW5kSW5mb0ltcGwKK3sKKworCWZyaWVuZCBjbGFzcyBDbGFzc0tpbmRJbmZvSW5pdGlhbGl6ZXI7CisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlDbGFzc0tpbmRJbmZvSW1wbCgpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+Q2xhc3NLaW5kSW5mb0ltcGwoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBBVFRSSUJVVEVTCisJICovCisJc3RhdGljIENsYXNzS2luZEluZm8gJiBDTEFTU19LSU5EX0lORk87CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIGNsYXNzS2luZAorCSAqIGNsYXNzS2luZE5hbWUKKwkgKi8KKwlpbmxpbmUgc3RhdGljIHN0ZDo6c3RyaW5nIGluZm8oKQorCXsKKwkJcmV0dXJuKCBDbGFzc0tpbmRJbmZvSW1wbDwgVCA+OjpDTEFTU19LSU5EX0lORk8uaW5mbygpICk7CisJfQorCit9OworCit0ZW1wbGF0ZTwgY2xhc3MgVCA+CitDbGFzc0tpbmRJbmZvICYgQ2xhc3NLaW5kSW5mb0ltcGw8IFQgPjo6Q0xBU1NfS0lORF9JTkZPID0KKwkJQ2xhc3NLaW5kSW5mb0luaXRpYWxpemVyOjpjbGFzc0tpbmRJbmZvPCBUID4oKTsKKworCisjZGVmaW5lIENMQVNTX0tJTkRfVCggVCApICBDbGFzc0tpbmRJbmZvSW1wbDwgVCA+OjpDTEFTU19LSU5EX0lORk8ubUtJTkQKKworI2RlZmluZSBDTEFTU19LSU5EX05BTUVfVCggVCApICBDbGFzc0tpbmRJbmZvSW1wbDwgVCA+OjpDTEFTU19LSU5EX0lORk8ubU5BTUUKKworCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDTEFTUyBLSU5EIERFRkFVTFQgSU1QTEVNRU5UQVRJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjbGFzcyBDbGFzc0tpbmRJbXBsCit7CisKKwlmcmllbmQgY2xhc3MgQ2xhc3NLaW5kSW5mb0luaXRpYWxpemVyOworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQVRUUklCVVRFUworCSAqLworCWNsYXNzX2tpbmRfdCBtQ2xhc3NLaW5kOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlDbGFzc0tpbmRJbXBsKGNsYXNzX2tpbmRfdCBhQ2xhc3NLaW5kKQorCTogbUNsYXNzS2luZCggYUNsYXNzS2luZCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlDbGFzc0tpbmRJbXBsKGNvbnN0IENsYXNzS2luZEltcGwgJiBhQ0tJKQorCTogbUNsYXNzS2luZCggYUNLSS5tQ2xhc3NLaW5kICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl+Q2xhc3NLaW5kSW1wbCgpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBDTEFTUyBLSU5EIENIRUNLRVIgJiBDQVNUIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCS8qKgorCSAqIEdFVFRFUgorCSAqIGNsYXNzS2luZAorCSAqIGNsYXNzS2luZE5hbWUKKwkgKi8KKwlpbmxpbmUgY2xhc3Nfa2luZF90IGNsYXNzS2luZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1DbGFzc0tpbmQgKTsKKwl9CisKKwlpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcgJiBjbGFzc0tpbmROYW1lKCkgY29uc3QKKwl7CisJCXJldHVybiggQ0tJSV9UQUJMRV9JTkZPKCBtQ2xhc3NLaW5kICktPm1OQU1FICk7CisJfQorCisJaW5saW5lIHN0ZDo6c3RyaW5nIGNsYXNzS2luZEluZm8oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBPU1MoKSA8PCAiY2xhc3NLaW5kSW5mbzwgIgorCQkJCTw8IHN0YXRpY19jYXN0PCBhdm1fc2l6ZV90PiggbUNsYXNzS2luZCApIDw8ICIgLCAiCisJCQkJPDwgQ0tJSV9UQUJMRV9JTkZPKCBtQ2xhc3NLaW5kICktPm1OQU1FCisJCQkJPDwgIiA+IiApOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIENMQVNTIEtJTkQgQ0hFQ0tFUiAmIENBU1QgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJLy8gQ2hlY2sgaWYgQkYgaXMgYSBoYW5kbGUgdG8gYSBULCBpbmNsdWRpbmcgYmFzZSBjbGFzc2VzLgorCXRlbXBsYXRlPCB0eXBlbmFtZSBUID4KKwlpbmxpbmUgYm9vbCBpcygpIGNvbnN0CisJeworCQlyZXR1cm4oIENsYXNzS2luZEluZm9JbXBsPCBUID46OkNMQVNTX0tJTkRfSU5GTy5tS0lORCA9PSBtQ2xhc3NLaW5kICk7CisJfQorCisJdGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorCWlubGluZSBib29sIGlzbm90KCkgY29uc3QKKwl7CisJCXJldHVybiggQ2xhc3NLaW5kSW5mb0ltcGw8IFQgPjo6Q0xBU1NfS0lORF9JTkZPLm1LSU5EICE9IG1DbGFzc0tpbmQgKTsKKwl9CisKKwkvLyBDaGVjayBpZiBCRiBpcyBhIGhhbmRsZSB0byBhIFQsIG5vdCBpbmNsdWRpbmcgYmFzZSBjbGFzc2VzLgorCXRlbXBsYXRlPCB0eXBlbmFtZSBUID4KKwlpbmxpbmUgYm9vbCBpc19leGFjdGx5KCkgY29uc3QKKwl7CisJCXJldHVybiggQ2xhc3NLaW5kSW5mb0ltcGw8IFQgPjo6Q0xBU1NfS0lORF9JTkZPLm1LSU5EID09IG1DbGFzc0tpbmQgKTsKKwl9CisKKwl0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CisJaW5saW5lIGJvb2wgaXNub3RfZXhhY3RseSgpIGNvbnN0CisJeworCQlyZXR1cm4oIENsYXNzS2luZEluZm9JbXBsPCBUID46OkNMQVNTX0tJTkRfSU5GTy5tS0lORCAhPSBtQ2xhc3NLaW5kICk7CisJfQorCisJLy8gQ2hlY2sgaWYgQkYgaXMgYSBoYW5kbGUgdG8gYSBULCBub3QgaW5jbHVkaW5nIHNwZWNpZmljIGNsYXNzZXMuCisJdGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorCWlubGluZSBib29sIGlzX3N0cmljdGx5KCkgY29uc3QKKwl7CisJCXJldHVybiggaXM8IFQgPigpICk7CisJfQorCisJdGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorCWlubGluZSBib29sIGlzbm90X3N0cmljdGx5KCkgY29uc3QKKwl7CisJCXJldHVybiggbm90IGlzX3N0cmljdGx5PCBUID4oKSApOworCX0KKworCisJLy8gY2FzdCBhcyBzcGVjaWZpZWQgcG9pbnRlcgorCXRlbXBsYXRlPCB0eXBlbmFtZSBUID4KKwlpbmxpbmUgVCAqIGFzKCkKKwl7CisJCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggaXM8IFQgPigpICkKKwkJCQk8PCAiSW52YWxpZCB0eXBlIGNhc3RpbmcgOj4gc3RhdGljX2Nhc3Q8ICIKKwkJCQk8PCBDS0lJX1RBQkxFX0lORk9fVCggVCApLT5tTkFNRQorCQkJCTw8ICIgKiA+KCAiCisJCQkJPDwgQ0tJSV9UQUJMRV9JTkZPKCBtQ2xhc3NLaW5kICktPm1OQU1FCisJCQkJPDwgIiAqICkiCisJCQkJPDwgU0VORF9FWElUOworCisJCXJldHVybiggc3RhdGljX2Nhc3Q8IFQgKiA+KCB0aGlzICkgKTsKKwl9CisKKwl0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CisJaW5saW5lIGNvbnN0IFQgKiBhcygpIGNvbnN0CisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoIGlzPCBUID4oKSApCisJCQkJPDwgIkludmFsaWQgdHlwZSBjYXN0aW5nIDo+IHN0YXRpY19jYXN0PCAiCisJCQkJPDwgQ0tJSV9UQUJMRV9JTkZPX1QoIFQgKS0+bU5BTUUKKwkJCQk8PCAiICogPiggIgorCQkJCTw8IENLSUlfVEFCTEVfSU5GTyggbUNsYXNzS2luZCApLT5tTkFNRQorCQkJCTw8ICIgKiApIgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQlyZXR1cm4oIHN0YXRpY19jYXN0PCBjb25zdCBUICogPiggdGhpcyApICk7CisJfQorCisKKwl0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CisJaW5saW5lIFQgKiB0bygpCisJeworCQkvLyBOTyBBU1NFUlQKKwkJLy8gQXNzdW1lcyB0aGF0IHRoZSB0eXBlIGNoZWNraW5nIGhhcyBiZWVuIGRvbmUgYnkgdGhlIHVzZXIKKwkJcmV0dXJuKCBzdGF0aWNfY2FzdDwgVCAqID4oIHRoaXMgKSApOworCX0KKworCXRlbXBsYXRlPCB0eXBlbmFtZSBUID4KKwlpbmxpbmUgY29uc3QgVCAqIHRvKCkgY29uc3QKKwl7CisJCS8vIE5PIEFTU0VSVAorCQkvLyBBc3N1bWVzIHRoYXQgdGhlIHR5cGUgY2hlY2tpbmcgaGFzIGJlZW4gZG9uZSBieSB0aGUgdXNlcgorCQlyZXR1cm4oIHN0YXRpY19jYXN0PCBjb25zdCBUICogPiggdGhpcyApICk7CisJfQorCisJdGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorCWlubGluZSBjb25zdCBUICYgdG9fcmVmKCkgY29uc3QKKwl7CisJCS8vIE5PIEFTU0VSVAorCQkvLyBBc3N1bWVzIHRoYXQgdGhlIHR5cGUgY2hlY2tpbmcgaGFzIGJlZW4gZG9uZSBieSB0aGUgdXNlcgorCQlyZXR1cm4oIHN0YXRpY19jYXN0PCBjb25zdCBUICYgPiggKnRoaXMgKSApOworCX0KKworfTsKKworCisKKy8qKgorICogQ0xBU1MgS0lORCBDSEVDS0VSCisgKiBDQVNUCisgKi8KK2NsYXNzIE1hY2hpbmU7Cit0ZW1wbGF0ZTw+IGJvb2wgQ2xhc3NLaW5kSW1wbDo6aXM8IE1hY2hpbmUgICAgPigpIGNvbnN0OwordGVtcGxhdGU8PiBib29sIENsYXNzS2luZEltcGw6Omlzbm90PCBNYWNoaW5lID4oKSBjb25zdDsKKworCitjbGFzcyBCZWhhdmlvcmFsRWxlbWVudDsKK3RlbXBsYXRlPD4gYm9vbCBDbGFzc0tpbmRJbXBsOjppczwgQmVoYXZpb3JhbEVsZW1lbnQgICAgPigpIGNvbnN0OwordGVtcGxhdGU8PiBib29sIENsYXNzS2luZEltcGw6Omlzbm90PCBCZWhhdmlvcmFsRWxlbWVudCA+KCkgY29uc3Q7CisKK2NsYXNzIFByb3BlcnR5RWxlbWVudDsKK3RlbXBsYXRlPD4gYm9vbCBDbGFzc0tpbmRJbXBsOjppczwgUHJvcGVydHlFbGVtZW50ICAgID4oKSBjb25zdDsKK3RlbXBsYXRlPD4gYm9vbCBDbGFzc0tpbmRJbXBsOjppc25vdDwgUHJvcGVydHlFbGVtZW50ID4oKSBjb25zdDsKKworCitjbGFzcyBPYmplY3RFbGVtZW50OwordGVtcGxhdGU8PiBib29sIENsYXNzS2luZEltcGw6OmlzPCBPYmplY3RFbGVtZW50ICAgID4oKSBjb25zdDsKK3RlbXBsYXRlPD4gYm9vbCBDbGFzc0tpbmRJbXBsOjppc25vdDwgT2JqZWN0RWxlbWVudCA+KCkgY29uc3Q7CisKKworY2xhc3MgTnVtYmVyOwordGVtcGxhdGU8PiBib29sIENsYXNzS2luZEltcGw6OmlzPCBOdW1iZXIgICAgPigpIGNvbnN0OwordGVtcGxhdGU8PiBib29sIENsYXNzS2luZEltcGw6Omlzbm90PCBOdW1iZXIgPigpIGNvbnN0OworCisKK2NsYXNzIEJ1aWx0aW5RdWV1ZTsKK3RlbXBsYXRlPD4gYm9vbCBDbGFzc0tpbmRJbXBsOjppczwgQnVpbHRpblF1ZXVlICAgID4oKSBjb25zdDsKK3RlbXBsYXRlPD4gYm9vbCBDbGFzc0tpbmRJbXBsOjppc25vdDwgQnVpbHRpblF1ZXVlID4oKSBjb25zdDsKKworCitjbGFzcyBCdWlsdGluTGlzdDsKK3RlbXBsYXRlPD4gYm9vbCBDbGFzc0tpbmRJbXBsOjppczwgQnVpbHRpbkxpc3QgICAgPigpIGNvbnN0OwordGVtcGxhdGU8PiBib29sIENsYXNzS2luZEltcGw6Omlzbm90PCBCdWlsdGluTGlzdCA+KCkgY29uc3Q7CisKKworY2xhc3MgQnVpbHRpblZlY3RvcjsKK3RlbXBsYXRlPD4gYm9vbCBDbGFzc0tpbmRJbXBsOjppczwgQnVpbHRpblZlY3RvciAgICA+KCkgY29uc3Q7Cit0ZW1wbGF0ZTw+IGJvb2wgQ2xhc3NLaW5kSW1wbDo6aXNub3Q8IEJ1aWx0aW5WZWN0b3IgPigpIGNvbnN0OworCisKK2NsYXNzIEJ1aWx0aW5BcnJheTsKK3RlbXBsYXRlPD4gYm9vbCBDbGFzc0tpbmRJbXBsOjppczwgQnVpbHRpbkFycmF5ICAgID4oKSBjb25zdDsKK3RlbXBsYXRlPD4gYm9vbCBDbGFzc0tpbmRJbXBsOjppc25vdDwgQnVpbHRpbkFycmF5ID4oKSBjb25zdDsKKwordGVtcGxhdGU8PiBib29sIENsYXNzS2luZEltcGw6OmlzX3N0cmljdGx5PCBCdWlsdGluQXJyYXkgICAgPigpIGNvbnN0OwordGVtcGxhdGU8PiBib29sIENsYXNzS2luZEltcGw6Omlzbm90X3N0cmljdGx5PCBCdWlsdGluQXJyYXkgPigpIGNvbnN0OworCisKK2NsYXNzIEJ1aWx0aW5Db250YWluZXI7Cit0ZW1wbGF0ZTw+IGJvb2wgQ2xhc3NLaW5kSW1wbDo6aXM8IEJ1aWx0aW5Db250YWluZXIgICAgPigpIGNvbnN0OwordGVtcGxhdGU8PiBib29sIENsYXNzS2luZEltcGw6Omlzbm90PCBCdWlsdGluQ29udGFpbmVyID4oKSBjb25zdDsKKworCitjbGFzcyBCdWlsdGluQ29sbGVjdGlvbjsKK3RlbXBsYXRlPD4gYm9vbCBDbGFzc0tpbmRJbXBsOjppczwgQnVpbHRpbkNvbGxlY3Rpb24gICAgPigpIGNvbnN0OwordGVtcGxhdGU8PiBib29sIENsYXNzS2luZEltcGw6Omlzbm90PCBCdWlsdGluQ29sbGVjdGlvbiA+KCkgY29uc3Q7CisKKworY2xhc3MgQnVpbHRpbkZvcm07Cit0ZW1wbGF0ZTw+IGJvb2wgQ2xhc3NLaW5kSW1wbDo6aXM8IEJ1aWx0aW5Gb3JtICAgID4oKSBjb25zdDsKK3RlbXBsYXRlPD4gYm9vbCBDbGFzc0tpbmRJbXBsOjppc25vdDwgQnVpbHRpbkZvcm0gPigpIGNvbnN0OworCisKK2NsYXNzIEJhc2VJbnN0YW5jZUZvcm07Cit0ZW1wbGF0ZTw+IGJvb2wgQ2xhc3NLaW5kSW1wbDo6aXM8IEJhc2VJbnN0YW5jZUZvcm0gICAgPigpIGNvbnN0OwordGVtcGxhdGU8PiBib29sIENsYXNzS2luZEltcGw6Omlzbm90PCBCYXNlSW5zdGFuY2VGb3JtID4oKSBjb25zdDsKKworCisKK2NsYXNzIEF2bVByb2dyYW07Cit0ZW1wbGF0ZTw+IGJvb2wgQ2xhc3NLaW5kSW1wbDo6aXM8IEF2bVByb2dyYW0gICAgPigpIGNvbnN0OwordGVtcGxhdGU8PiBib29sIENsYXNzS2luZEltcGw6Omlzbm90PCBBdm1Qcm9ncmFtID4oKSBjb25zdDsKKworY2xhc3MgQmFzZUF2bVByb2dyYW07Cit0ZW1wbGF0ZTw+IGJvb2wgQ2xhc3NLaW5kSW1wbDo6aXM8IEJhc2VBdm1Qcm9ncmFtICAgID4oKSBjb25zdDsKK3RlbXBsYXRlPD4gYm9vbCBDbGFzc0tpbmRJbXBsOjppc25vdDwgQmFzZUF2bVByb2dyYW0gPigpIGNvbnN0OworCisKK2NsYXNzIEJhc2VTeW1ib2xUeXBlU3BlY2lmaWVyOwordGVtcGxhdGU8PiBib29sIENsYXNzS2luZEltcGw6OmlzPCBCYXNlU3ltYm9sVHlwZVNwZWNpZmllciAgICA+KCkgY29uc3Q7Cit0ZW1wbGF0ZTw+IGJvb2wgQ2xhc3NLaW5kSW1wbDo6aXNub3Q8IEJhc2VTeW1ib2xUeXBlU3BlY2lmaWVyID4oKSBjb25zdDsKKworY2xhc3MgQmFzZVR5cGVTcGVjaWZpZXI7Cit0ZW1wbGF0ZTw+IGJvb2wgQ2xhc3NLaW5kSW1wbDo6aXM8IEJhc2VUeXBlU3BlY2lmaWVyICAgID4oKSBjb25zdDsKK3RlbXBsYXRlPD4gYm9vbCBDbGFzc0tpbmRJbXBsOjppc25vdDwgQmFzZVR5cGVTcGVjaWZpZXIgPigpIGNvbnN0OworCisKK2NsYXNzIEJhc2VDb21waWxlZEZvcm07Cit0ZW1wbGF0ZTw+IGJvb2wgQ2xhc3NLaW5kSW1wbDo6aXM8IEJhc2VDb21waWxlZEZvcm0gICAgPigpIGNvbnN0OwordGVtcGxhdGU8PiBib29sIENsYXNzS2luZEltcGw6Omlzbm90PCBCYXNlQ29tcGlsZWRGb3JtID4oKSBjb25zdDsKKworCisKK2NsYXNzIFJhbUJ1ZmZlcjsKK3RlbXBsYXRlPD4gYm9vbCBDbGFzc0tpbmRJbXBsOjppczwgUmFtQnVmZmVyICAgID4oKSBjb25zdDsKK3RlbXBsYXRlPD4gYm9vbCBDbGFzc0tpbmRJbXBsOjppc25vdDwgUmFtQnVmZmVyID4oKSBjb25zdDsKKworCitjbGFzcyBCYXNlQnVmZmVyUXVldWU7Cit0ZW1wbGF0ZTw+IGJvb2wgQ2xhc3NLaW5kSW1wbDo6aXM8IEJhc2VCdWZmZXJRdWV1ZSAgICA+KCkgY29uc3Q7Cit0ZW1wbGF0ZTw+IGJvb2wgQ2xhc3NLaW5kSW1wbDo6aXNub3Q8IEJhc2VCdWZmZXJRdWV1ZSA+KCkgY29uc3Q7CisKKworY2xhc3MgQmFzZUJ1ZmZlckZvcm07Cit0ZW1wbGF0ZTw+IGJvb2wgQ2xhc3NLaW5kSW1wbDo6aXM8IEJhc2VCdWZmZXJGb3JtICAgID4oKSBjb25zdDsKK3RlbXBsYXRlPD4gYm9vbCBDbGFzc0tpbmRJbXBsOjppc25vdDwgQmFzZUJ1ZmZlckZvcm0gPigpIGNvbnN0OworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworI2VuZGlmIC8qIEJBU0VfQ0xBU1NLSU5ESU5GT19IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYmFzZS9JbnN0YW5jZUNvdW50ZXIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2Jhc2UvSW5zdGFuY2VDb3VudGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM3ODJmYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2Jhc2UvSW5zdGFuY2VDb3VudGVyLmgKQEAgLTAsMCArMSw5NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDI5IGTDqWMuIDIwMTIKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBCQVNFX0lOU1RBTkNFQ09VTlRFUl9IXworI2RlZmluZSBCQVNFX0lOU1RBTkNFQ09VTlRFUl9IXworCisjaW5jbHVkZSA8cHJpbnRlci9PdXRTdHJlYW0uaD4JCS8vIHByaW50ZXIvT3V0U3RyZWFtLmgKKworCituYW1lc3BhY2Ugc2VwCit7CisKKwordGVtcGxhdGU8IGNsYXNzIFQgPgorY2xhc3MgSW5zdGFuY2VDb3VudGVyCit7CisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlJbnN0YW5jZUNvdW50ZXIoKQorCXsKKwkJKytJTlNUQU5DRV9DUkVBVEVEOworCisJCSsrSU5TVEFOQ0VfQUxJVkU7CisJfQorCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+SW5zdGFuY2VDb3VudGVyKCkKKwl7CisJCS0tSU5TVEFOQ0VfQUxJVkU7CisJfQorCisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJaW5saW5lIHN0YXRpYyB2b2lkIHJlcG9ydENvdW50ZXJzKAorCQkJT3V0U3RyZWFtICYgb3MsIGNvbnN0IHN0ZDo6c3RyaW5nICYgY2xhc3NOYW1lKQorCXsKKwkJaWYoIElOU1RBTkNFX0FMSVZFID4gMCApCisJCXsKKwkJCXNob3dDb3VudGVycyhvcywgY2xhc3NOYW1lKTsKKwkJfQorCX0KKworCWlubGluZSBzdGF0aWMgdm9pZCBzaG93Q291bnRlcnMoCisJCQlPdXRTdHJlYW0gJiBvcywgY29uc3Qgc3RkOjpzdHJpbmcgJiBjbGFzc05hbWUpCisJeworCQlpbnQgY29sU2l6ZSA9IDMyIC0gY2xhc3NOYW1lLnNpemUoKTsKKworCQlvcyA8PCBUQUIgPDwgY2xhc3NOYW1lIDw8IHN0ZDo6c2V0dyggKGNvbFNpemUgPiAwKSA/IGNvbFNpemUgOiAxICkKKwkJCQk8PCAiIDo+ICIgPDwgc3RkOjpzZXR3KDYpCisJCQkJPDwgSU5TVEFOQ0VfQUxJVkUgPDwgIiAvICIgPDwgSU5TVEFOQ0VfQ1JFQVRFRAorCQkJCTw8IEVPTF9GTFVTSDsKKwl9CisKKworCS8qKgorCSAqIEFUVFJJQlVURQorCSAqLworCXN0YXRpYyBzdGQ6OnNpemVfdCBJTlNUQU5DRV9DUkVBVEVEOworCisJc3RhdGljIHN0ZDo6c2l6ZV90IElOU1RBTkNFX0FMSVZFOworCisKK307CisKKwordGVtcGxhdGU8IGNsYXNzIFQgPgorc3RkOjpzaXplX3QgSW5zdGFuY2VDb3VudGVyPCBUID46OklOU1RBTkNFX0NSRUFURUQgPSAwOworCit0ZW1wbGF0ZTwgY2xhc3MgVCA+CitzdGQ6OnNpemVfdCBJbnN0YW5jZUNvdW50ZXI8IFQgPjo6SU5TVEFOQ0VfQUxJVkUgPSAwOworCisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisjZW5kaWYgLyogQkFTRV9JTlNUQU5DRUNPVU5URVJfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2Jhc2UvUkVBRE1FLm1kIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYmFzZS9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNhMGFjNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2Jhc2UvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTIgQEAKKyMgRUZNLVNZTUJFWCA6IEJhc2UKKworIyMgU291cmNlIGNvZGUgc3RydWN0dXJlCisKKyMjIyMgSW50ZXJmYWNlcworCisjIyMgQ2xhc3NlcworKiAqKkFzc2VydCoqCisqICoqRXhjZXB0aW9uKioKKyogKipTdHJlYW0qKgorCisjIyMjIEZhY3RvcmllcwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYmFzZS9SZWZlcmVuY2VDb3VudGVyLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2Jhc2UvUmVmZXJlbmNlQ291bnRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMwZjA2MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2Jhc2UvUmVmZXJlbmNlQ291bnRlci5jcHAKQEAgLTAsMCArMSwyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDE5IG1hcnMgMjAxNgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiUmVmZXJlbmNlQ291bnRlci5oIgorCituYW1lc3BhY2Ugc2VwCit7CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9iYXNlL1JlZmVyZW5jZUNvdW50ZXIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2Jhc2UvUmVmZXJlbmNlQ291bnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYWNiMmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9iYXNlL1JlZmVyZW5jZUNvdW50ZXIuaApAQCAtMCwwICsxLDE1NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDE5IG1hcnMgMjAxNgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEJBU0VfUkVGRVJFTkNFQ09VTlRFUl9IXworI2RlZmluZSBCQVNFX1JFRkVSRU5DRUNPVU5URVJfSF8KKworI2luY2x1ZGUgPHByaW50ZXIvT3V0U3RyZWFtLmg+CQkJLy8gcHJpbnRlci9PdXRTdHJlYW0uaAorI2luY2x1ZGUgPHV0aWwvYXZtX2RlYnVnLmg+CQkvLyB1dGlsL2F2bV9kZWJ1Zy5oCisjaW5jbHVkZSA8dXRpbC9hdm1fbnVtZXJpYy5oPgkvLyB1dGlsL2F2bV9kZWJ1Zy5oCisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBSZWZlcmVuY2VDb3VudGVyCit7CisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBBVFRSSUJVVEUKKwkgKi8KKwlhdm1fdWludDMyX3QgbVJlZmVyZW5jZUNvdW50OworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlSZWZlcmVuY2VDb3VudGVyKCBhdm1fdWludDMyX3QgY291bnQgPSAxICkKKwk6IG1SZWZlcmVuY2VDb3VudCggY291bnQgKQorCXsKKwkJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5SZWZlcmVuY2VDb3VudGVyKCkKKwl7CisJCW1SZWZlcmVuY2VDb3VudCA9IDA7CisJfQorCisKKwkvKioKKwkgKiBBVk0gREVCVUcgUkVGIENPVU5URVIKKwkgKi8KKwlpbmxpbmUgdm9pZCBBVk1fREVCVUdfUkVGX0NPVU5URVIoT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworQVZNX0lGX0RFQlVHX0ZMQUcoIFJFRkVSRU5DRV9DT1VOVElORyApCisJCW9zIDw8ICIgLyogPCByZWY6ICIgPDwgZ2V0UmVmQ291bnQoKSA8PCAiID4gKi8iIDw8IHN0ZDo6Zmx1c2g7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggUkVGRVJFTkNFX0NPVU5USU5HICkKKwl9CisKKwlpbmxpbmUgc3RkOjpzdHJpbmcgQVZNX0RFQlVHX1JFRl9DT1VOVEVSKCkgY29uc3QKKwl7CisJCVN0cmluZ091dFN0cmVhbSBvc3M7CisKKwkJQVZNX0RFQlVHX1JFRl9DT1VOVEVSKG9zcyk7CisKKwkJcmV0dXJuKCBvc3Muc3RyKCkgKTsKKwl9CisKKwlpbmxpbmUgc3RkOjpzdHJpbmcgc3RyUmVmQ291bnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBPU1MoKSA8PCAiIC8qIDwgcmVmOiAiIDw8IGdldFJlZkNvdW50KCkgPDwgIiA+ICovIiApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVJlZmVyZW5jZUNvdW50CisJICovCisJaW5saW5lIGF2bV91aW50MzJfdCBnZXRSZWZDb3VudCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1SZWZlcmVuY2VDb3VudCApOworCX0KKworCWlubGluZSB2b2lkIHNldFJlZkNvdW50KGF2bV91aW50MzJfdCBjb3VudCkKKwl7CisJCW1SZWZlcmVuY2VDb3VudCA9IGNvdW50OworCX0KKworCisJLyoqCisJICogUkVGRVJDRU5DRSBDT1VOVAorCSAqIE1BTkFHRU1FTlQKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCB2b2lkIGRlY3JSZWZDb3VudCgpCisJeworCQktLW1SZWZlcmVuY2VDb3VudDsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIGluY3JSZWZDb3VudCgpCisJeworCQkrK21SZWZlcmVuY2VDb3VudDsKKwl9CisKKworCS8qKgorCSAqIExJRkVDWUNMRQorCSAqLworCWlubGluZSBib29sIGlzQWxpdmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUmVmZXJlbmNlQ291bnQgPiAwICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNEZWFkKCkgY29uc3QKKwl7CisJCXJldHVybiggbVJlZmVyZW5jZUNvdW50ID09IDAgKTsKKwl9CisKKwkvKioKKwkgKiBNVUxUSVBMSUNJVFkKKwkgKi8KKwlpbmxpbmUgYm9vbCBpc1VuaXF1ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1SZWZlcmVuY2VDb3VudCA9PSAxICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNNdWx0aXBsZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1SZWZlcmVuY2VDb3VudCA+PSAyICk7CisJfQorCisKKwkvKioKKwkgKiBXUklUQUJJTElUWQorCSAqLworCWlubGluZSBib29sIGlzV3JpdGFibGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUmVmZXJlbmNlQ291bnQgPT0gMSApOworCX0KKworCWlubGluZSBib29sIGlzbm90V3JpdGFibGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUmVmZXJlbmNlQ291bnQgIT0gMSApOworCX0KKworfTsKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qIEJBU0VfUkVGRVJFTkNFQ09VTlRFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYmFzZS9TbWFydFBvaW50ZXIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2Jhc2UvU21hcnRQb2ludGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y3NDk3NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2Jhc2UvU21hcnRQb2ludGVyLmgKQEAgLTAsMCArMSw0MDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgQkFTRV9TTUFSVFBPSU5URVJfSF8KKyNkZWZpbmUgQkFTRV9TTUFSVFBPSU5URVJfSF8KKworI2luY2x1ZGUgPGJpdHMvbW92ZS5oPgorCisjaW5jbHVkZSAiU21hcnRQb2ludGVyVXRpbC5oIgorCisjaW5jbHVkZSA8dXRpbC9hdm1fbnVtZXJpYy5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCit0ZW1wbGF0ZTwgY2xhc3MgVCwgY2xhc3MgVGRlc3RydWN0b3IgPgorY2xhc3MgU21hcnRQb2ludGVyCit7CisKK3ByaXZhdGU6CisJLyoqCisJICogVFlQRURFRgorCSAqLworCXR5cGVkZWYgICAgICAgU21hcnRQb2ludGVyPCBUICwgVGRlc3RydWN0b3IgPiAgdGhpc190eXBlOworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogVFlQRURFRgorCSAqLworCXR5cGVkZWYgICAgICAgVCAgIHZhbHVlX3R5cGU7CisKKwl0eXBlZGVmICAgICAgIFQgJiByZWZlcmVuY2U7CisJdHlwZWRlZiBjb25zdCBUICYgY29uc3RfcmVmZXJlbmNlOworCisKKwl0eXBlZGVmICAgICAgIFQgKiBwb2ludGVyOworCXR5cGVkZWYgY29uc3QgVCAqIGNvbnN0X3BvaW50ZXI7CisKKworcHJvdGVjdGVkOgorCS8qCisJICogQVRUUklCVVRFUworCSAqLworCXBvaW50ZXIgbVBUUjsKKworCitwdWJsaWM6CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlleHBsaWNpdCBTbWFydFBvaW50ZXIocG9pbnRlciBwdHIgPSBOVUxMKQorCTogbVBUUiggcHRyICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCVNtYXJ0UG9pbnRlcihjb25zdCBTbWFydFBvaW50ZXIgJiBvdGhlcikKKwk6IG1QVFIoIE5VTEwgKQorCXsKKwkJYWNxdWlyZSggb3RoZXIubVBUUiApOworCX0KKworCXRlbXBsYXRlPCBjbGFzcyBVID4KKwlTbWFydFBvaW50ZXIoY29uc3QgU21hcnRQb2ludGVyPCBVICwgVGRlc3RydWN0b3IgPiAmIG90aGVyKQorCTogbVBUUiggTlVMTCApCisJeworCQlhY3F1aXJlKCBvdGhlci5yYXdfcG9pbnRlcigpICk7CisJfQorCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCX5TbWFydFBvaW50ZXIoKQorCXsKKwkJZGVzdHJveSgpOworCX0KKworCWlubGluZSB2b2lkIGRlc3Ryb3koKQorCXsKKwkJcmVsZWFzZSggTlVMTCApOworCX0KKworCisJLyoqCisJICogUkVGQ09VTlQKKwkgKi8KKwlpbmxpbmUgYXZtX3VpbnQzMl90IGdldFJlZkNvdW50KCkgY29uc3QKKwl7CisJCXJldHVybiggKCBtUFRSICE9IE5VTEwgKT8gbVBUUi0+Z2V0UmVmQ291bnQoKSA6IDAgKTsKKwl9CisKKworCWlubGluZSBib29sIGlzVW5pcXVlKCkgY29uc3QKKwl7CisJCXJldHVybiggKG1QVFIgIT0gTlVMTCk/IG1QVFItPmlzVW5pcXVlKCkgOiBmYWxzZSApOworCX0KKworCWlubGluZSBib29sIGlzTXVsdGlwbGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobVBUUiAhPSBOVUxMKT8gbVBUUi0+aXNNdWx0aXBsZSgpIDogZmFsc2UgKTsKKwl9CisKKworCS8qKgorCSAqIFdSSVRBQklMSVRZCisJICovCisJaW5saW5lIGJvb2wgaXNXcml0YWJsZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldFJlZkNvdW50KCkgPT0gMSApOworCX0KKworCWlubGluZSBib29sIGlzbm90V3JpdGFibGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRSZWZDb3VudCgpICE9IDEgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBtYWtlV3JpdGFibGUoKQorCXsKKy8vCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBtUFRSICkKKy8vCQkJCTw8ICJyYXdfcG9pbnRlciBpbiBhbiBTbWFydFBvaW50ZXIgISEhIgorLy8JCQkJPDwgU0VORF9FWElUOworCisJCWlmKCBtUFRSLT5nZXRSZWZDb3VudCgpID4gMSApCisJCXsKKwkJCW1QVFItPmRlY3JSZWZDb3VudCgpOworCisJCQltUFRSID0gbVBUUi0+Y2xvbmUoKTsKKwkJfQorCX0KKworCisJLyoqCisJICogW0lOXVZBTElESVRZCisJICovCisJaW5saW5lIGJvb2wgaXNOdWxsKCkgY29uc3QKKwl7CisJCXJldHVybiggbVBUUiA9PSBOVUxMICk7CisJfQorCisJaW5saW5lIGJvb2wgaW52YWxpZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1QVFIgPT0gTlVMTCApOworCX0KKworCisJaW5saW5lIGJvb2wgaXNub3ROdWxsKCkgY29uc3QKKwl7CisJCXJldHVybiggbVBUUiAhPSBOVUxMICk7CisJfQorCisJaW5saW5lIGJvb2wgdmFsaWQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUFRSICE9IE5VTEwgKTsKKwl9CisKKworCS8qKgorCSAqIFNXQVAKKwkgKiBGTFVTSAorCSAqLworCWlubGluZSB2b2lkIHN3YXAoU21hcnRQb2ludGVyICYgb3RoZXIpCisJeworCQlzdGQ6OnN3YXAobVBUUiwgb3RoZXIubVBUUik7CisJfQorCisJaW5saW5lIHZvaWQgZmx1c2goU21hcnRQb2ludGVyICYgb3RoZXIpCisJeworCQlyZWxlYXNlKCBvdGhlci5tUFRSICk7CisKKwkJb3RoZXIubVBUUiA9IE5VTEw7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBtUFRSCisJICovCisJaW5saW5lIHBvaW50ZXIgcmF3X3BvaW50ZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUFRSICApOworCX0KKworCWlubGluZSBjb25zdF9yZWZlcmVuY2UgcmF3X3JlZmVyZW5jZSgpIGNvbnN0CisJeworCQlyZXR1cm4oICogbVBUUiAgKTsKKwl9CisKKwlpbmxpbmUgYXZtX2FkZHJlc3NfdCByYXdfYWRkcmVzcygpIGNvbnN0CisJeworCQlyZXR1cm4oIGF2bV9hZGRyZXNzX3QoIG1QVFIgKSApOworCX0KKworCisJLyoqCisJICogW1JFXVNFVFRFUgorCSAqIG1QVFIKKwkgKi8KKwlpbmxpbmUgdm9pZCBhY3F1aXJlUG9pbnRlcihwb2ludGVyIGFQdHIpCisJeworCQlyZWxlYXNlX2FjcXVpcmUoIGFQdHIgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRQb2ludGVyKHBvaW50ZXIgYVB0cikKKwl7CisJCXJlbGVhc2UoIGFQdHIgKTsKKwl9CisKKworCWlubGluZSB2b2lkIHJlcGxhY2VQb2ludGVyKHBvaW50ZXIgYVB0cikKKwl7CisJCW1QVFIgPSBhUHRyOworCX0KKworCisJLyoqCisJICogT1BFUkFUT1JTCisJICovCisvLwlpbmxpbmUgcmVmZXJlbmNlIG9wZXJhdG9yKiAoKSBjb25zdCB0aHJvdygpCisvLwl7CisvLwkJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggbVBUUiApCisvLwkJCQk8PCAicmF3X3BvaW50ZXIgaW4gYW4gU21hcnRQb2ludGVyICEhISIKKy8vCQkJCTw8IFNFTkRfRVhJVDsKKy8vCisvLwkJcmV0dXJuKCAqbVBUUiApOworLy8JfQorLy8KKy8vCWlubGluZSBwb2ludGVyIG9wZXJhdG9yLT4gKCkgY29uc3QKKy8vCXsKKy8vCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBtUFRSICkKKy8vCQkJCTw8ICJyYXdfcG9pbnRlciBpbiBhbiBTbWFydFBvaW50ZXIgISEhIgorLy8JCQkJPDwgU0VORF9FWElUOworLy8KKy8vCQlyZXR1cm4oIG1QVFIgKTsKKy8vICAgIH0KKworCS8vIENPTU1FTlQgRk9SIFVTRSBJTiBTVEwgQ09OVEFJTkVSCisvLwlpbmxpbmUgcG9pbnRlciBvcGVyYXRvciAmICgpIGNvbnN0CisvLwl7CisvLwkJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggbVBUUiApCisvLwkJCQk8PCAicmF3X3BvaW50ZXIgaW4gYW4gU21hcnRQb2ludGVyICEhISIKKy8vCQkJCTw8IFNFTkRfRVhJVDsKKy8vCisvLwkJcmV0dXJuKCBtUFRSICk7CisvLwl9CisKKworCS8qKgorCSAqIENBU1QKKwkgKi8KKy8vCWlubGluZSBvcGVyYXRvciBwb2ludGVyICgpIGNvbnN0CisvLwl7CisvLwkJcmV0dXJuKCBtUFRSICk7CisvLwl9CisvLworLy8JLy8gRGVzYWN0aXZlIGNhbGwgb2YgPDwgZGVsZXRlID4+IHVzaW5nIGNvbXBpbGVyIGFtYmlndW91cyBtZWNhbmlzbQorLy8JaW5saW5lIG9wZXJhdG9yIHZvaWQgKiAoKSBjb25zdAorLy8JeworLy8JCXJldHVybiggbVBUUiApOworLy8JfQorCisKKwkvKioKKwkgKiBBU1NJR05NRU5UCisJICovCisJaW5saW5lIFNtYXJ0UG9pbnRlciAmIG9wZXJhdG9yPShwb2ludGVyIGFQdHIpCisJeworCQlpZiggbVBUUiAhPSBhUHRyICkKKwkJeworCQkJcmVsZWFzZSggYVB0ciApOworCQl9CisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwlpbmxpbmUgU21hcnRQb2ludGVyICYgb3BlcmF0b3I9KGNvbnN0IFNtYXJ0UG9pbnRlciAmIG90aGVyKQorCXsKKwkJaWYoIG1QVFIgIT0gb3RoZXIubVBUUiApCisJCXsKKwkJCXJlbGVhc2VfYWNxdWlyZSggb3RoZXIubVBUUiApOworCQl9CisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwl0ZW1wbGF0ZTwgY2xhc3MgVSA+CisJaW5saW5lIFNtYXJ0UG9pbnRlciAmIG9wZXJhdG9yPSgKKwkJCWNvbnN0IFNtYXJ0UG9pbnRlcjwgVSAsIFRkZXN0cnVjdG9yID4gJiBvdGhlcikKKwl7CisJCWlmKCBtUFRSICE9IG90aGVyLnJhd19wb2ludGVyKCkgKQorCQl7CisJCQlyZWxlYXNlX2FjcXVpcmUoIG90aGVyLnJhd19wb2ludGVyKCkgKTsKKwkJfQorCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisKKy8vCXRlbXBsYXRlPCBjbGFzcyBVID4KKy8vCWlubGluZSBTbWFydFBvaW50ZXIgJiBvcGVyYXRvcj0oVSAqIGFQdHIpCisvLwl7CisvLwkJaWYoIG1QVFIgIT0gYVB0ciApCisvLwkJeworLy8JCQlyZWxlYXNlKCBhUHRyICk7CisvLwkJfQorLy8JCXJldHVybiggKnRoaXMgKTsKKy8vCX0KKworCisJLyoqCisJICogQ09NUEFSSVNPTgorCSAqIE9QRVJBVE9SCisJICovCisKKwlpbmxpbmUgYm9vbCBvcGVyYXRvcj09KHBvaW50ZXIgYVB0cikgY29uc3QKKwl7CisJCXJldHVybiggbVBUUiA9PSBhUHRyKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNtYXJ0UG9pbnRlciAmIG90aGVyKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUFRSID09IG90aGVyLm1QVFIgKTsKKwl9CisKKwl0ZW1wbGF0ZTxjbGFzcyBVPgorCWlubGluZSBib29sIG9wZXJhdG9yPT0oCisJCQljb25zdCBTbWFydFBvaW50ZXI8IFUgLCBUZGVzdHJ1Y3RvciA+ICYgb3RoZXIpIGNvbnN0CisJeworCQlyZXR1cm4oIG1QVFIgPT0gb3RoZXIucmF3X3BvaW50ZXIoKSApOworCX0KKworCisJaW5saW5lIGJvb2wgb3BlcmF0b3IhPShwb2ludGVyIGFQdHIpIGNvbnN0CisJeworCQlyZXR1cm4oIG1QVFIgIT0gYVB0ciApOworCX0KKworCWlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgU21hcnRQb2ludGVyICYgb3RoZXIpIGNvbnN0CisJeworCQlyZXR1cm4oIG1QVFIgIT0gb3RoZXIubVBUUiApOworCX0KKworCXRlbXBsYXRlPGNsYXNzIFU+CisJaW5saW5lIGJvb2wgb3BlcmF0b3IhPSgKKwkJCWNvbnN0IFNtYXJ0UG9pbnRlcjwgVSAsIFRkZXN0cnVjdG9yID4gJiBvdGhlcikgY29uc3QKKwl7CisJCXJldHVybiggbVBUUiAhPSBvdGhlci5yYXdfcG9pbnRlcigpICk7CisJfQorCisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBhY3F1aXJlCisJICogcmVsZWFzZQorCSAqIHJlbGVhc2VfYWNxdWlyZQorCSAqLworCS8vIGluY3JlbWVudCB0aGUgY291bnQKKwlpbmxpbmUgdm9pZCBhY3F1aXJlKHBvaW50ZXIgYVB0cikKKwl7CisJCWlmKCBhUHRyICE9IE5VTEwgKQorCQl7CisJCQlhUHRyLT5pbmNyUmVmQ291bnQoKTsKKwkJfQorCQltUFRSID0gYVB0cjsKKwl9CisKKworCS8vIGRlY3JlbWVudCB0aGUgY291bnQsIGRlbGV0ZSBpZiBpdCBpcyAwCisJaW5saW5lIHZvaWQgcmVsZWFzZShwb2ludGVyIGFQdHIpCisJeworCQlUZGVzdHJ1Y3Rvcjo6ZGVzdHJveSggbVBUUiApOworCisJCW1QVFIgPSBhUHRyOworCX0KKworCisJaW5saW5lIHZvaWQgcmVsZWFzZV9hY3F1aXJlKHBvaW50ZXIgYVB0cikKKwl7CisJCVRkZXN0cnVjdG9yOjpkZXN0cm95KCBtUFRSICk7CisKKwkJaWYoIGFQdHIgIT0gTlVMTCApCisJCXsKKwkJCWFQdHItPmluY3JSZWZDb3VudCgpOworCQl9CisJCW1QVFIgPSBhUHRyOworCX0KKworfTsKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qQkFTRV9TTUFSVFBPSU5URVJfSF8qLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYmFzZS9TbWFydFBvaW50ZXJVdGlsLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2Jhc2UvU21hcnRQb2ludGVyVXRpbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEwMTJjNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2Jhc2UvU21hcnRQb2ludGVyVXRpbC5jcHAKQEAgLTAsMCArMSwxODUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxOSBtYXJzIDIwMTYKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlNtYXJ0UG9pbnRlclV0aWwuaCIKKworI2luY2x1ZGUgPHV0aWwvYXZtX2RlYnVnLmg+CQkvLyB1dGlsL2F2bV9kZWJ1Zy5oCisKKyNpbmNsdWRlIDxjb21tb24vQXZtT2JqZWN0Lmg+CS8vIGNvbW1vbi9Bdm1PYmplY3QuaAorI2luY2x1ZGUgPGNvbW1vbi9FbGVtZW50Lmg+CQkvLyBjb21tb24vRWxlbWVudC5oCisKKyNpbmNsdWRlIDxwcmludGVyL091dFN0cmVhbS5oPgkvLyBwcmludGVyL091dFN0cmVhbS5oCisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorICogTUVNT1JZIE1BTkFHRU1FTlQKKyAqIERFU1RST1kKKyAqIEZPUk0KKyAqLwordm9pZCBkZXN0cm95KEF2bU9iamVjdCAqIGFuT2JqZWN0KQoreworCURlc3Ryb3lPYmplY3RQb2xpY3k6OmRlc3Ryb3koYW5PYmplY3QpOworfQorCisKK3ZvaWQgRGVzdHJveU9iamVjdFBvbGljeTo6ZGVzdHJveShBdm1PYmplY3QgKiBhbk9iamVjdCkKK3sKKwlpZiggYW5PYmplY3QgIT0gTlVMTCApCisJeworCQlpZiggYW5PYmplY3QtPmlzVW5pcXVlKCkgKQorCQl7CisvLwkJCUFWTV9PU19UUkFDRSA8PCAiZGVzdHJveSA6PiAiIDw8IGFuT2JqZWN0LT5zdHIoKSA8PCBzdGQ6OmVuZGw7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgUkVGRVJFTkNFX0NPVU5USU5HICkKKwlhbk9iamVjdC0+ZGJnRGVzdHJveSgpOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBSRUZFUkVOQ0VfQ09VTlRJTkcgKQorCisJCQlkZWxldGUoIGFuT2JqZWN0ICk7CisKKwkJCWFuT2JqZWN0ID0gTlVMTDsKKwkJfQorCisJCWVsc2UgaWYoIGFuT2JqZWN0LT5nZXRSZWZDb3VudCgpID09IDAgKQorCQl7CisvL0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgUkVGRVJFTkNFX0NPVU5USU5HICkKKy8vCQkJY29uc3QgY2hhciAqIGNsYXNzS2luZE5hbWUgPSBhbk9iamVjdC0+Y2xhc3NLaW5kTmFtZSgpOworLy8JCQlzdGQ6OnN0cmluZyBzdHJGb3JtID0gIiI7Ly9hbk9iamVjdC0+c3RyKCk7CisvLworLy8JCQlBVk1fT1NfQ09VVCA8PCAiPj4+IGRlc3Ryb3kgQXZtT2JqZWN0IDwgIiA8PCBjbGFzc0tpbmROYW1lCisvLwkJCQkJPDwgIiA+IEAgIiA8PCBhdm1fYWRkcmVzc190KGFuT2JqZWN0KSA8PCAiIDogIiA8PCBzdHJGb3JtCisvLwkJCQkJPDwgIiB3aXRoIHJlZkNvdW50ID09IDAgISEhIgorLy8JCQkJCTw8IHN0ZDo6ZW5kbDsKKy8vCisvLwkJCUFWTV9PU19MT0cgPDwgIj4+PiBkZXN0cm95IEF2bU9iamVjdCA8ICIgPDwgY2xhc3NLaW5kTmFtZQorLy8JCQkJCTw8ICIgPiBAICIgPDwgYXZtX2FkZHJlc3NfdChhbk9iamVjdCkgPDwgIiA6ICIgPDwgc3RyRm9ybQorLy8JCQkJCTw8ICIgd2l0aCByZWZDb3VudCA9PSAwICEhISIKKy8vCQkJCQk8PCBzdGQ6OmVuZGw7CisvLworLy8JCQlBVk1fT1NfVFJBQ0UgPDwgIj4+PiBkZXN0cm95IEF2bU9iamVjdCA8ICIgPDwgY2xhc3NLaW5kTmFtZQorLy8JCQkJCTw8ICIgPiBAICIgPDwgYXZtX2FkZHJlc3NfdChhbk9iamVjdCkgPDwgIiA6ICIgPDwgc3RyRm9ybQorLy8JCQkJCTw8ICIgd2l0aCByZWZDb3VudCA9PSAwICEhISIKKy8vCQkJCQk8PCBzdGQ6OmVuZGw7CisvL19BVk1fRUxTRV8KKy8vCQkJQVZNX09TX1dBUk5JTkdfQUxFUlQgPDwgIj4+PiBkZXN0cm95IHdpdGggcmVmQ291bnQgPT0gMCAhISEiCisvLwkJCQkJPDwgU0VORF9BTEVSVDsKKworCQkJQVZNX09TX0NPVVQgPDwgIj4+PiBkZXN0cm95IEF2bU9iamVjdCBAICIKKwkJCQkJPDwgYXZtX2FkZHJlc3NfdChhbk9iamVjdCkKKwkJCQkJPDwgIiB3aXRoIHJlZkNvdW50ID09IDAgISEhIiA8PCBzdGQ6OmVuZGw7CisKKwkJCUFWTV9PU19MT0cgPDwgIj4+PiBkZXN0cm95IEF2bU9iamVjdCBAICIKKwkJCQkJPDwgYXZtX2FkZHJlc3NfdChhbk9iamVjdCkKKwkJCQkJPDwgIiB3aXRoIHJlZkNvdW50ID09IDAgISEhIiA8PCBzdGQ6OmVuZGw7CisKKwkJCUFWTV9PU19UUkFDRSA8PCAiXHQ+Pj4gZGVzdHJveSBBdm1PYmplY3QgQCAiCisJCQkJCTw8IGF2bV9hZGRyZXNzX3QoYW5PYmplY3QpCisJCQkJCTw8ICIgd2l0aCByZWZDb3VudCA9PSAwICEhISIgPDwgc3RkOjplbmRsOworCisJCQlhbk9iamVjdC0+dG9TdHJlYW0oQVZNX09TX0NPVVQpOworLy9BVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFJFRkVSRU5DRV9DT1VOVElORyApCisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgUkVGRVJFTkNFX0NPVU5USU5HICkKKwlhbk9iamVjdC0+ZGJnRGVzdHJveSgpOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBSRUZFUkVOQ0VfQ09VTlRJTkcgKQorCQl9CisKKwkJZWxzZQorCQl7CisJCQlhbk9iamVjdC0+ZGVjclJlZkNvdW50KCk7CisJCX0KKwl9Cit9CisKKworCit2b2lkIGRlc3Ryb3lFbGVtZW50KEVsZW1lbnQgKiBhbkVsZW1lbnQpCit7CisJRGVzdHJveUVsZW1lbnRQb2xpY3k6OmRlc3Ryb3koYW5FbGVtZW50KTsKK30KKworCit2b2lkIERlc3Ryb3lFbGVtZW50UG9saWN5OjpkZXN0cm95KEVsZW1lbnQgKiBhbkVsZW1lbnQpCit7CisJaWYoIGFuRWxlbWVudCAhPSBOVUxMICkKKwl7CisJCWlmKCBhbkVsZW1lbnQtPmlzVW5pcXVlKCkgKQorCQl7CisvLwkJCUFWTV9PU19UUkFDRSA8PCAiZGVzdHJveSA6PiAiIDw8IGFuRWxlbWVudC0+c3RyKCkgPDwgc3RkOjplbmRsOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFJFRkVSRU5DRV9DT1VOVElORyApCisJYW5FbGVtZW50LT5kYmdEZXN0cm95KCk7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFJFRkVSRU5DRV9DT1VOVElORyApCisKKwkJCWRlbGV0ZSggYW5FbGVtZW50ICk7CisKKwkJCWFuRWxlbWVudCA9IE5VTEw7CisJCX0KKworCQllbHNlIGlmKCBhbkVsZW1lbnQtPmdldFJlZkNvdW50KCkgPT0gMCApCisJCXsKKy8vQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBSRUZFUkVOQ0VfQ09VTlRJTkcgKQorLy8KKy8vCQkJY29uc3QgY2hhciAqIGNsYXNzS2luZE5hbWUgPSBhbkVsZW1lbnQtPmNsYXNzS2luZE5hbWUoKTsKKy8vCQkJc3RkOjpzdHJpbmcgc3RyRm9ybSA9ICIiOy8vYW5FbGVtZW50LT5zdHIoKTsKKy8vCisvLwkJCUFWTV9PU19DT1VUIDw8ICI+Pj4gZGVzdHJveSBFbGVtZW50IDwgIiA8PCBjbGFzc0tpbmROYW1lCisvLwkJCQkJPDwgIiA+IEAgIiA8PCBhdm1fYWRkcmVzc190KGFuRWxlbWVudCkgPDwgIiA6ICIgPDwgc3RyRm9ybQorLy8JCQkJCTw8ICIgd2l0aCByZWZDb3VudCA9PSAwICEhISIKKy8vCQkJCQk8PCBzdGQ6OmVuZGw7CisvLworLy8JCQlBVk1fT1NfTE9HIDw8ICI+Pj4gZGVzdHJveSBFbGVtZW50IDwgIiA8PCBjbGFzc0tpbmROYW1lCisvLwkJCQkJPDwgIiA+IEAgIiA8PCBhdm1fYWRkcmVzc190KGFuRWxlbWVudCkgPDwgIiA6ICIgPDwgc3RyRm9ybQorLy8JCQkJCTw8ICIgd2l0aCByZWZDb3VudCA9PSAwICEhISIKKy8vCQkJCQk8PCBzdGQ6OmVuZGw7CisvLworLy8JCQlBVk1fT1NfVFJBQ0UgPDwgIj4+PiBkZXN0cm95IEVsZW1lbnQgPCAiIDw8IGNsYXNzS2luZE5hbWUKKy8vCQkJCQk8PCAiID4gQCAiIDw8IGF2bV9hZGRyZXNzX3QoYW5FbGVtZW50KSA8PCAiIDogIiA8PCBzdHJGb3JtCisvLwkJCQkJPDwgIiB3aXRoIHJlZkNvdW50ID09IDAgISEhIgorLy8JCQkJCTw8IHN0ZDo6ZW5kbDsKKy8vX0FWTV9FTFNFXworLy8JCQlBVk1fT1NfV0FSTklOR19BTEVSVCA8PCAiPj4+IGRlc3Ryb3kgd2l0aCByZWZDb3VudCA9PSAwICEhISIKKy8vCQkJCQk8PCBTRU5EX0FMRVJUOworCisJCQlBVk1fT1NfQ09VVCA8PCAiPj4+IGRlc3Ryb3kgRWxlbWVudCBAICIKKwkJCQkJPDwgYXZtX2FkZHJlc3NfdChhbkVsZW1lbnQpCisJCQkJCTw8ICIgd2l0aCByZWZDb3VudCA9PSAwICEhISIgPDwgc3RkOjplbmRsOworCQkJQVZNX09TX0NPVVQgPDwgIlx0Pj4gIiA8PCBhbkVsZW1lbnQtPnN0cigpIDw8IHN0ZDo6ZW5kbDsKKworCQkJQVZNX09TX0xPRyA8PCAiPj4+IGRlc3Ryb3kgRWxlbWVudCBAICIKKwkJCQkJPDwgYXZtX2FkZHJlc3NfdChhbkVsZW1lbnQpCisJCQkJCTw8ICIgd2l0aCByZWZDb3VudCA9PSAwICEhISIgPDwgc3RkOjplbmRsOworCQkJQVZNX09TX0xPRyA8PCAiXHQ+PiAiIDw8IGFuRWxlbWVudC0+c3RyKCkgPDwgc3RkOjplbmRsOworCisJCQlBVk1fT1NfVFJBQ0UgPDwgIlx0Pj4+IGRlc3Ryb3kgRWxlbWVudCBAICIKKwkJCQkJPDwgYXZtX2FkZHJlc3NfdChhbkVsZW1lbnQpCisJCQkJCTw8ICIgd2l0aCByZWZDb3VudCA9PSAwICEhISIgPDwgc3RkOjplbmRsOworCQkJQVZNX09TX1RSQUNFIDw8ICJcdD4+ICIgPDwgYW5FbGVtZW50LT5zdHIoKSA8PCBzdGQ6OmVuZGw7CisKKy8vQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBSRUZFUkVOQ0VfQ09VTlRJTkcgKQorCQl9CisKKwkJZWxzZQorCQl7CisJCQlhbkVsZW1lbnQtPmRlY3JSZWZDb3VudCgpOworCQl9CisJfQorfQorCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYmFzZS9TbWFydFBvaW50ZXJVdGlsLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9iYXNlL1NtYXJ0UG9pbnRlclV0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWUzYjkwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYmFzZS9TbWFydFBvaW50ZXJVdGlsLmgKQEAgLTAsMCArMSw3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDE5IG1hcnMgMjAxNgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEJBU0VfU01BUlRQT0lOVEVSVVRJTF9IXworI2RlZmluZSBCQVNFX1NNQVJUUE9JTlRFUlVUSUxfSF8KKworI2luY2x1ZGUgPGNzdGRkZWY+CisKK25hbWVzcGFjZSBzZXAKK3sKKworLyoqCisgKiBNRU1PUlkgTUFOQUdFTUVOVAorICogSU5DUiAtIERFQ1IKKyAqIFJFRkNPVU5UCisgKi8KKwordGVtcGxhdGU8IGNsYXNzIFQgPgorVCAqIGluY3JSZWZlcmVuY2VDb3VudChUICogYW5FbGVtZW50KQoreworCWlmKCBhbkVsZW1lbnQgIT0gTlVMTCApCisJeworCQlhbkVsZW1lbnQtPmluY3JSZWZDb3VudCgpOworCX0KKworCXJldHVybiggYW5FbGVtZW50ICk7Cit9CisKKworLyoqCisgKiBNRU1PUlkgTUFOQUdFTUVOVAorICogREVTVFJPWQorICogRk9STQorICovCisKK2NsYXNzIEF2bU9iamVjdDsKK2NsYXNzIEVsZW1lbnQ7CisKKworLyoqCisgKiBTTUFSVCBERVNUUk9ZIFBPTElDWQorICogRk9STQorICovCitzdHJ1Y3QgRGVzdHJveU9iamVjdFBvbGljeQoreworCXN0YXRpYyB2b2lkIGRlc3Ryb3koQXZtT2JqZWN0ICogYW5PYmplY3QpOworfTsKKwordm9pZCBkZXN0cm95KEF2bU9iamVjdCAqIGFuT2JqZWN0KTsKKworCitzdHJ1Y3QgRGVzdHJveUVsZW1lbnRQb2xpY3kKK3sKKwlzdGF0aWMgdm9pZCBkZXN0cm95KEVsZW1lbnQgKiBhbk9iamVjdCk7Cit9OworCitleHRlcm4gdm9pZCBkZXN0cm95RWxlbWVudChFbGVtZW50ICogYW5FbGVtZW50KTsKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qIEJBU0VfU01BUlRQT0lOVEVSVVRJTF9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYmFzZS9TbWFydFRhYmxlLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9iYXNlL1NtYXJ0VGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWY0NGRhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYmFzZS9TbWFydFRhYmxlLmgKQEAgLTAsMCArMSwxMTQ3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4NCisgKg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDcmVhdGVkIG9uOiAxMyBqYW52LiAyMDE3DQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnINCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaWZuZGVmIEJBU0VfU01BUlRUQUJMRV9IXw0KKyNkZWZpbmUgQkFTRV9TTUFSVFRBQkxFX0hfDQorDQorI2luY2x1ZGUgPHV0aWwvYXZtX2Fzc2VydC5oPg0KKyNpbmNsdWRlIDx1dGlsL2F2bV9kZWJ1Zy5oPg0KKyNpbmNsdWRlIDx1dGlsL2F2bV9pbmplY3Rvci5oPg0KKyNpbmNsdWRlIDx1dGlsL2F2bV9udW1lcmljLmg+DQorDQorI2luY2x1ZGUgPGJhc2UvUmVmZXJlbmNlQ291bnRlci5oPg0KKyNpbmNsdWRlIDxiYXNlL1NtYXJ0UG9pbnRlci5oPg0KKw0KKyNpbmNsdWRlIDxwcmludGVyL091dFN0cmVhbS5oPg0KKw0KKw0KK25hbWVzcGFjZSBzZXANCit7DQorDQordGVtcGxhdGU8IGNsYXNzIFQsIGNsYXNzIFRkZXN0cnVjdG9yID4NCitjbGFzcyBTbWFydFRhYmxlDQorew0KKw0KK3Byb3RlY3RlZDoNCisJLyoqDQorCSAqIFRZUEVERUYNCisJICovDQorCXR5cGVkZWYgICAgICAgU21hcnRUYWJsZSAgPCBUICwgVGRlc3RydWN0b3IgPiAgdGhpc190eXBlOw0KKw0KKwl0eXBlZGVmICAgICAgIFNtYXJ0UG9pbnRlcjwgVCAsIFRkZXN0cnVjdG9yID4gIHNtYXJ0X3BvaW50ZXJfdDsNCisNCitwcm90ZWN0ZWQ6DQorCS8qKg0KKwkgKiBUWVBFREVGDQorCSAqLw0KKwl0eXBlZGVmICAgICAgIFQgICB2YWx1ZV90eXBlOw0KKw0KKwl0eXBlZGVmICAgICAgIFQgJiByZWZlcmVuY2VfdDsNCisJdHlwZWRlZiBjb25zdCBUICYgY29uc3RfcmVmZXJlbmNlX3Q7DQorDQorCXR5cGVkZWYgICAgICAgVCAqIHBvaW50ZXJfdDsNCisJdHlwZWRlZiBjb25zdCBUICogY29uc3RfcG9pbnRlcl90Ow0KKw0KKwl0eXBlZGVmICAgICAgIFQgKiAmIHJlZmVyZW5jZV9wb2ludGVyX3Q7DQorCXR5cGVkZWYgY29uc3QgVCAqICYgY29uc3RfcmVmZXJlbmNlX3BvaW50ZXJfdDsNCisNCisJdHlwZWRlZiAgICAgICBUICogKiBwb2ludGVyX3BvaW50ZXJfdDsNCisJdHlwZWRlZiBjb25zdCBUICogKiBjb25zdF9wb2ludGVyX3BvaW50ZXJfdDsNCisNCitwdWJsaWM6DQorCXR5cGVkZWYgICAgICAgVCAqICogaXRlcmF0b3I7DQorCXR5cGVkZWYgVCAqIGNvbnN0ICogY29uc3RfaXRlcmF0b3I7DQorDQorDQorcHJpdmF0ZToNCisJLyoqDQorCSAqIEludGVybmFsIFRhYmxlDQorCSAqLw0KKwlzdHJ1Y3QgVGFibGVUIDogcHVibGljIFJlZmVyZW5jZUNvdW50ZXIsDQorCQkJQVZNX0lOSkVDVF9JTlNUQU5DRV9DT1VOVEVSX0NMQVNTKCBUYWJsZVQgKQ0KKwl7DQorDQorCQkvKioNCisJCSAqIEFUVFJJQlVURVMNCisJCSAqLw0KKwkJYXZtX3NpemVfdCBtU2l6ZTsNCisNCisJCXBvaW50ZXJfcG9pbnRlcl90IG1FbGVtZW50czsNCisJCS8qKg0KKwkJICogQ09OU1RSVUNUT1INCisJCSAqIERlZmF1bHQNCisJCSAqLw0KKwkJVGFibGVUKCkNCisJCTogUmVmZXJlbmNlQ291bnRlciggKSwNCisJCW1TaXplKCAwICksDQorCQltRWxlbWVudHMoIE5VTEwgKQ0KKwkJew0KKwkJCS8vISEgTk9USElORw0KKwkJfQ0KKw0KKwkJVGFibGVUKGF2bV9zaXplX3QgYVNpemUsIHBvaW50ZXJfdCBhRGVmYXVsdFZhbHVlID0gTlVMTCkNCisJCTogUmVmZXJlbmNlQ291bnRlciggKSwNCisJCW1TaXplKCBhU2l6ZSApLA0KKwkJbUVsZW1lbnRzKCBOVUxMICkNCisJCXsNCisJCQlhbGxvYyhhRGVmYXVsdFZhbHVlKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQ09OU1RSVUNUT1INCisJCSAqIENvcHkNCisJCSAqLw0KKwkJVGFibGVUKGNvbnN0IFRhYmxlVCAmIGFUYWJsZSkNCisJCTogUmVmZXJlbmNlQ291bnRlciggKSwNCisJCW1TaXplKCBhVGFibGUubVNpemUgKSwNCisJCW1FbGVtZW50cyggTlVMTCApDQorCQl7DQorCQkJYWNxdWlyZSggYVRhYmxlICk7DQorCQl9DQorDQorCQlUYWJsZVQoYXZtX3NpemVfdCBhU2l6ZSwgY29uc3QgVGFibGVUICYgYVRhYmxlLA0KKwkJCQlwb2ludGVyX3QgYURlZmF1bHRWYWx1ZSA9IE5VTEwpDQorCQk6IFJlZmVyZW5jZUNvdW50ZXIoICksDQorCQltU2l6ZSggYVNpemUgKSwNCisJCW1FbGVtZW50cyggTlVMTCApDQorCQl7DQorCQkJYWNxdWlyZV9yZXNpemUoIGFUYWJsZSwgYURlZmF1bHRWYWx1ZSApOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBERVNUUlVDVE9SDQorCQkgKi8NCisJCXZpcnR1YWwgflRhYmxlVCgpDQorCQl7DQorCQkJZGVzdHJveVRhYmxlKCk7DQorDQorCQkJbVNpemUgPSAwOw0KKwkJfQ0KKw0KKwkJaW5saW5lIHZvaWQgZGVzdHJveVRhYmxlKCkNCisJCXsNCisJCQlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMCA7IG9mZnNldCA8IG1TaXplIDsgKytvZmZzZXQgKQ0KKwkJCXsNCisJCQkJVGRlc3RydWN0b3I6OmRlc3Ryb3koIG1FbGVtZW50c1sgb2Zmc2V0IF0gKTsNCisJCQl9DQorCQl9DQorDQorCQkvKioNCisJCSAqIEFMTE9DQVRJT04NCisJCSAqLw0KKwkJaW5saW5lIHZvaWQgYWxsb2MocG9pbnRlcl90IGFEZWZhdWx0VmFsdWUgPSBOVUxMKQ0KKwkJew0KKwkJCWlmKCBtU2l6ZSA+IDAgKQ0KKwkJCXsNCisJCQkJbUVsZW1lbnRzID0gbmV3IHBvaW50ZXJfdFsgbVNpemUgXTsNCisNCisJCQkJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDAgOyBvZmZzZXQgPCBtU2l6ZSA7ICsrb2Zmc2V0ICkNCisJCQkJew0KKwkJCQkJbUVsZW1lbnRzW29mZnNldF0gPSBhRGVmYXVsdFZhbHVlOw0KKwkJCQl9DQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCW1FbGVtZW50cyA9IE5VTEw7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBSZXNpemUNCisJCSAqLw0KKwkJaW5saW5lIHZvaWQgcmVzaXplKGF2bV9zaXplX3QgYVNpemUsIHBvaW50ZXJfdCBhRGVmYXVsdFZhbHVlID0gTlVMTCkNCisJCXsNCisJCQlpZiggYVNpemUgPT0gMCApDQorCQkJew0KKwkJCQlkZXN0cm95VGFibGUoKTsNCisNCisJCQkJbVNpemUgPSAwOw0KKwkJCX0NCisJCQllbHNlIGlmKCBtU2l6ZSA+IDAgKQ0KKwkJCXsNCisJCQkJYXZtX3NpemVfdCBvbGRTaXplID0gbVNpemU7DQorCQkJCXBvaW50ZXJfcG9pbnRlcl90IG9sZEVMZW1lbnRzID0gbUVsZW1lbnRzOw0KKw0KKwkJCQltRWxlbWVudHMgPSBuZXcgcG9pbnRlcl90WyBtU2l6ZSA9IGFTaXplIF07DQorDQorCQkJCWF2bV9zaXplX3Qgb2Zmc2V0ID0gMDsNCisNCisJCQkJLy8gVGhlIHNpemUgaW5jcmVhc2VkDQorCQkJCWlmKCBhU2l6ZSA+PSBvbGRTaXplICkNCisJCQkJew0KKwkJCQkJZm9yKCA7IG9mZnNldCA8IG9sZFNpemUgOyArK29mZnNldCApDQorCQkJCQl7DQorCQkJCQkJbUVsZW1lbnRzW29mZnNldF0gPSBvbGRFTGVtZW50c1tvZmZzZXRdOw0KKwkJCQkJfQ0KKwkJCQkJLy8gQ29tcGxldGlvbg0KKwkJCQkJZm9yKCA7IG9mZnNldCA8IGFTaXplIDsgKytvZmZzZXQgKQ0KKwkJCQkJew0KKwkJCQkJCW1FbGVtZW50c1tvZmZzZXRdID0gYURlZmF1bHRWYWx1ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQkvLyBUaGUgc2l6ZSBkZWNyZWFzZWQNCisJCQkJZWxzZQ0KKwkJCQl7DQorCQkJCQlmb3IoIDsgb2Zmc2V0IDwgYVNpemUgOyArK29mZnNldCApDQorCQkJCQl7DQorCQkJCQkJbUVsZW1lbnRzW29mZnNldF0gPSBvbGRFTGVtZW50c1tvZmZzZXRdOw0KKwkJCQkJfQ0KKwkJCQkJLy8gRGVsZXRpb24NCisJCQkJCWZvciggOyBvZmZzZXQgPCBvbGRTaXplIDsgKytvZmZzZXQgKQ0KKwkJCQkJew0KKwkJCQkJCVRkZXN0cnVjdG9yOjpkZXN0cm95KCBtRWxlbWVudHNbIG9mZnNldCBdICk7DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJZGVsZXRlIFtdIG9sZEVMZW1lbnRzOw0KKwkJCX0NCisJCQllbHNlDQorCQkJew0KKwkJCQltU2l6ZSA9IGFTaXplOw0KKw0KKwkJCQlhbGxvYyhhRGVmYXVsdFZhbHVlKTsNCisJCQl9DQorCQl9DQorDQorDQorCQkvKioNCisJCSAqIGFjcXVpcmUNCisJCSAqIHJlbGVhc2UNCisJCSAqIHJlbGVhc2VfYWNxdWlyZQ0KKwkJICovDQorCQlpbmxpbmUgdm9pZCBhY3F1aXJlKGNvbnN0IFRhYmxlVCAmIGFUYWJsZSkNCisJCXsNCisJCQlpZiggbVNpemUgPiAwICkNCisJCQl7DQorCQkJCW1FbGVtZW50cyA9IG5ldyBwb2ludGVyX3RbIG1TaXplIF07DQorDQorCQkJCS8vIEFjcXVpcmUNCisJCQkJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDAgOyBvZmZzZXQgPCBtU2l6ZSA7ICsrb2Zmc2V0ICkNCisJCQkJew0KKwkJCQkJYWNxdWlyZShvZmZzZXQsIGFUYWJsZS5tRWxlbWVudHNbb2Zmc2V0XSk7DQorCQkJCX0NCisJCQl9DQorCQkJZWxzZQ0KKwkJCXsNCisJCQkJbUVsZW1lbnRzID0gTlVMTDsNCisJCQl9DQorCQl9DQorDQorCQlpbmxpbmUgdm9pZCBhY3F1aXJlX3Jlc2l6ZSgNCisJCQkJY29uc3QgVGFibGVUICYgYVRhYmxlLCBwb2ludGVyX3QgYURlZmF1bHRWYWx1ZSkNCisJCXsNCisJCQlpZiggbVNpemUgPiAwICkNCisJCQl7DQorCQkJCW1FbGVtZW50cyA9IG5ldyBwb2ludGVyX3RbIG1TaXplIF07DQorDQorCQkJCWF2bV9zaXplX3Qgb2Zmc2V0ID0gMDsNCisNCisJCQkJYXZtX3NpemVfdCBtaW5Cb3VuZCA9IHN0ZDo6bWluKG1TaXplLCBhVGFibGUubVNpemUpOw0KKw0KKwkJCQkvLyBBY3F1aXJlDQorCQkJCWZvciggOyBvZmZzZXQgPCBtaW5Cb3VuZCA7ICsrb2Zmc2V0ICkNCisJCQkJew0KKwkJCQkJYWNxdWlyZShvZmZzZXQsIGFUYWJsZS5tRWxlbWVudHNbb2Zmc2V0XSk7DQorCQkJCX0NCisJCQkJLy8gQ29tcGxldGlvbiBpZiBuZWVkDQorCQkJCWZvciggOyBvZmZzZXQgPCBtU2l6ZSA7ICsrb2Zmc2V0ICkNCisJCQkJew0KKwkJCQkJbUVsZW1lbnRzW29mZnNldF0gPSBhRGVmYXVsdFZhbHVlOw0KKwkJCQl9DQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCW1FbGVtZW50cyA9IE5VTEw7DQorCQkJfQ0KKwkJfQ0KKw0KKw0KKwkJaW5saW5lIHZvaWQgYWNxdWlyZShhdm1fc2l6ZV90IG9mZnNldCwgcG9pbnRlcl90IGFuRWxlbWVudCkNCisJCXsNCisJCQlpZiggYW5FbGVtZW50ICE9IE5VTEwgKQ0KKwkJCXsNCisJCQkJYW5FbGVtZW50LT5pbmNyUmVmQ291bnQoKTsNCisJCQl9DQorDQorCQkJbUVsZW1lbnRzW29mZnNldF0gPSBhbkVsZW1lbnQ7DQorCQl9DQorDQorCQlpbmxpbmUgdm9pZCByZWxlYXNlKGF2bV9zaXplX3Qgb2Zmc2V0LCBwb2ludGVyX3QgYW5FbGVtZW50KQ0KKwkJew0KKwkJCVRkZXN0cnVjdG9yOjpkZXN0cm95KCBtRWxlbWVudHNbb2Zmc2V0XSApOw0KKw0KKwkJCW1FbGVtZW50c1tvZmZzZXRdID0gYW5FbGVtZW50Ow0KKwkJfQ0KKw0KKwkJaW5saW5lIHZvaWQgcmVsZWFzZV9hY3F1aXJlKGF2bV9zaXplX3Qgb2Zmc2V0LCBwb2ludGVyX3QgYW5FbGVtZW50KQ0KKwkJew0KKwkJCVRkZXN0cnVjdG9yOjpkZXN0cm95KCBtRWxlbWVudHNbb2Zmc2V0XSApOw0KKw0KKwkJCWlmKCBhbkVsZW1lbnQgIT0gTlVMTCApDQorCQkJew0KKwkJCQlhbkVsZW1lbnQtPmluY3JSZWZDb3VudCgpOw0KKwkJCX0NCisNCisJCQltRWxlbWVudHNbb2Zmc2V0XSA9IGFuRWxlbWVudDsNCisJCX0NCisNCisNCisJCS8qKg0KKwkJICogV3JpdGFibGUNCisJCSAqLw0KKwkJaW5saW5lIFRhYmxlVCAqIGNsb25lX2FjcXVpcmUoKSBjb25zdA0KKwkJew0KKwkJCXJldHVybiggbmV3IFRhYmxlVCgqdGhpcykgKTsNCisJCX0NCisNCisJCWlubGluZSBUYWJsZVQgKiBjbG9uZV9yZXNpemVfYWNxdWlyZSgNCisJCQkJYXZtX3NpemVfdCBhU2l6ZSwgcG9pbnRlcl90IGFEZWZhdWx0VmFsdWUgPSBOVUxMKSBjb25zdA0KKwkJew0KKwkJCXJldHVybiggbmV3IFRhYmxlVChhU2l6ZSwgKnRoaXMsIGFEZWZhdWx0VmFsdWUpICk7DQorCQl9DQorDQorCX07DQorDQorcHJvdGVjdGVkOg0KKwkvKioNCisJICogVFlQRURFRg0KKwkgKi8NCisJdHlwZWRlZiBUYWJsZVQgICB0YWJsZV90eXBlOw0KKwl0eXBlZGVmIFRhYmxlVCAqIHRhYmxlX3BvaW50ZXJfdDsNCisNCisNCitwcm90ZWN0ZWQ6DQorCS8qDQorCSAqIEFUVFJJQlVURVMNCisJICovDQorCXRhYmxlX3BvaW50ZXJfdCBtVGFibGU7DQorDQorDQorcHVibGljOg0KKw0KKwkvKioNCisJICogQ09OU1RSVUNUT1INCisJICogRGVmYXVsdA0KKwkgKi8NCisJZXhwbGljaXQgU21hcnRUYWJsZSh0YWJsZV9wb2ludGVyX3QgYVRhYmxlID0gTlVMTCkNCisJOiBtVGFibGUoIGFUYWJsZSApDQorCXsNCisJCS8vISEgTk9USElORw0KKwl9DQorDQorCVNtYXJ0VGFibGUoYXZtX3NpemVfdCBhU2l6ZSwgcG9pbnRlcl90IGFEZWZhdWx0VmFsdWUgPSBOVUxMKQ0KKwk6IG1UYWJsZSggbmV3IHRhYmxlX3R5cGUoYVNpemUsIGFEZWZhdWx0VmFsdWUpICkNCisJew0KKwkJLy8hISBOT1RISU5HDQorCX0NCisNCisJU21hcnRUYWJsZShhdm1fc2l6ZV90IGFTaXplLA0KKwkJCWNvbnN0IFNtYXJ0VGFibGUgJiBhU21hcnRUYWJsZSwgcG9pbnRlcl90IGFEZWZhdWx0VmFsdWUgPSBOVUxMKQ0KKwk6IG1UYWJsZSggTlVMTCApDQorCXsNCisJCWlmKCBhU2l6ZSA9PSBhU21hcnRUYWJsZS5zaXplKCkgKQ0KKwkJew0KKwkJCWFjcXVpcmUoIGFTbWFydFRhYmxlLm1UYWJsZSApOw0KKwkJfQ0KKwkJZWxzZQ0KKwkJew0KKwkJCW1UYWJsZSA9IGFTbWFydFRhYmxlLm1UYWJsZQ0KKwkJCQkJLT5jbG9uZV9yZXNpemVfYWNxdWlyZShhU2l6ZSwgYURlZmF1bHRWYWx1ZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIENPTlNUUlVDVE9SDQorCSAqIENvcHkNCisJICovDQorCVNtYXJ0VGFibGUoY29uc3QgU21hcnRUYWJsZSAmIGFTbWFydFRhYmxlKQ0KKwk6IG1UYWJsZSggTlVMTCApDQorCXsNCisJCWFjcXVpcmUoIGFTbWFydFRhYmxlLm1UYWJsZSApOw0KKwl9DQorDQorCXRlbXBsYXRlPCBjbGFzcyBVID4NCisJU21hcnRUYWJsZShjb25zdCBTbWFydFRhYmxlPCBVICwgVGRlc3RydWN0b3IgPiAmIGFTbWFydFRhYmxlKQ0KKwk6IG1UYWJsZSggTlVMTCApDQorCXsNCisJCWFjcXVpcmUoIGFTbWFydFRhYmxlLm1UYWJsZSApOw0KKwl9DQorDQorCS8qKg0KKwkgKiBERVNUUlVDVE9SDQorCSAqLw0KKwl+U21hcnRUYWJsZSgpDQorCXsNCisJCWRlc3Ryb3koKTsNCisJfQ0KKw0KKwlpbmxpbmUgdm9pZCBkZXN0cm95KCkNCisJew0KKwkJZGVzdHJveVRhYmxlKCBtVGFibGUgKTsNCisJfQ0KKw0KKwlpbmxpbmUgdm9pZCBkZXN0cm95VGFibGUodGFibGVfcG9pbnRlcl90ICYgYVRhYmxlKQ0KKwl7DQorCQlpZiggYVRhYmxlICE9IE5VTEwgKQ0KKwkJew0KKwkJCWlmKCBhVGFibGUtPmlzVW5pcXVlKCkgKQ0KKwkJCXsNCisJCQkJZGVsZXRlKCBhVGFibGUgKTsNCisJCQl9DQorCQkJZWxzZQ0KKwkJCXsNCisJCQkJYVRhYmxlLT5kZWNyUmVmQ291bnQoKTsNCisJCQl9DQorDQorCQkJYVRhYmxlID0gTlVMTDsNCisJCX0NCisJfQ0KKw0KKw0KKwkvKioNCisJICogbVNpemUNCisJICovDQorCWlubGluZSBhdm1fc2l6ZV90IHNpemUoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIChtVGFibGUgPT0gTlVMTCkgPyAwIDogbVRhYmxlLT5tU2l6ZSApOw0KKwl9DQorDQorCWlubGluZSBib29sIGVtcHR5KCkgY29uc3QNCisJew0KKwkJcmV0dXJuKCAobVRhYmxlID09IE5VTEwpIHx8IChtVGFibGUtPm1TaXplID09IDApICk7DQorCX0NCisNCisJaW5saW5lIGJvb2wgbm9uZW1wdHkoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIChtVGFibGUgIT0gTlVMTCkgJiYgKG1UYWJsZS0+bVNpemUgPiAwKSApOw0KKwl9DQorDQorCWlubGluZSBib29sIHBvcHVsYXRlZCgpIGNvbnN0DQorCXsNCisJCXJldHVybiggKG1UYWJsZSAhPSBOVUxMKSAmJiAobVRhYmxlLT5tU2l6ZSA+IDEpICk7DQorCX0NCisNCisNCisJLyoqDQorCSAqIEdFVFRFUg0KKwkgKiBmb3IgZWxlbWVudCBhdCBnaXZlbiBwb3NpdGlvbiBieSByZWZlcmVuY2UNCisJICogcmV0dXJuKCBbY29uc3RfXXBvaW50ZXJfdCApDQorCSAqLw0KKwlpbmxpbmUgcG9pbnRlcl90IGF0KGF2bV9zaXplX3Qgb2Zmc2V0KQ0KKwl7DQorCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX0FSUkFZX0lOREVYX0VYSVQoIG9mZnNldCAsIHNpemUoKSApDQorCQkJCTw8IFNFTkRfRVhJVDsNCisNCisJCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9QT0lOVEVSX0VYSVQoIG1UYWJsZS0+bUVsZW1lbnRzW29mZnNldF0gKQ0KKwkJCQk8PCAiIHBvaW50ZXIgaW4gYW4gU21hcnRUYWJsZSBhdCBvZmZzZXQ6ICIgPDwgb2Zmc2V0IDw8ICIgISEhIg0KKwkJCQk8PCBTRU5EX0VYSVQ7DQorDQorCQlyZXR1cm4oIG1UYWJsZS0+bUVsZW1lbnRzW29mZnNldF0gKTsNCisJfQ0KKw0KKwlpbmxpbmUgY29uc3RfcG9pbnRlcl90IGF0KGF2bV9zaXplX3Qgb2Zmc2V0KSBjb25zdA0KKwl7DQorCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX0FSUkFZX0lOREVYX0VYSVQoIG9mZnNldCAsIHNpemUoKSApDQorCQkJCTw8IFNFTkRfRVhJVDsNCisNCisJCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9QT0lOVEVSX0VYSVQoIG1UYWJsZS0+bUVsZW1lbnRzW29mZnNldF0gKQ0KKwkJCQk8PCAiIHBvaW50ZXIgaW4gYW4gU21hcnRUYWJsZSBhdCBvZmZzZXQ6ICIgPDwgb2Zmc2V0IDw8ICIgISEhIg0KKwkJCQk8PCBTRU5EX0VYSVQ7DQorDQorCQlyZXR1cm4oIG1UYWJsZS0+bUVsZW1lbnRzW29mZnNldF0gKTsNCisJfQ0KKw0KKwkvKioNCisJICogR0VUVEVSDQorCSAqIGZvciBlbGVtZW50IGF0IGdpdmVuIHBvc2l0aW9uDQorCSAqIHJldHVybiggW2NvbnN0X11yZWZlcmVuY2VfdCApDQorCSAqLw0KKwlpbmxpbmUgcmVmZXJlbmNlX3QgcmVmKGF2bV9zaXplX3Qgb2Zmc2V0KQ0KKwl7DQorCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX0FSUkFZX0lOREVYX0VYSVQoIG9mZnNldCAsIHNpemUoKSApDQorCQkJCTw8IFNFTkRfRVhJVDsNCisNCisJCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9QT0lOVEVSX0VYSVQoIG1UYWJsZS0+bUVsZW1lbnRzW29mZnNldF0gKQ0KKwkJCQk8PCAiIHBvaW50ZXIgaW4gYW4gU21hcnRUYWJsZSBhdCBvZmZzZXQ6ICIgPDwgb2Zmc2V0IDw8ICIgISEhIg0KKwkJCQk8PCBTRU5EX0VYSVQ7DQorDQorCQlyZXR1cm4oICooIG1UYWJsZS0+bUVsZW1lbnRzW29mZnNldF0gKSApOw0KKwl9DQorDQorCWlubGluZSBjb25zdF9yZWZlcmVuY2VfdCByZWYoYXZtX3NpemVfdCBvZmZzZXQpIGNvbnN0DQorCXsNCisJCUFWTV9PU19BU1NFUlRfRkFUQUxfQVJSQVlfSU5ERVhfRVhJVCggb2Zmc2V0ICwgc2l6ZSgpICkNCisJCQkJPDwgU0VORF9FWElUOw0KKw0KKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggbVRhYmxlLT5tRWxlbWVudHNbb2Zmc2V0XSApDQorCQkJCTw8ICIgcG9pbnRlciBpbiBhbiBTbWFydFRhYmxlIGF0IG9mZnNldDogIiA8PCBvZmZzZXQgPDwgIiAhISEiDQorCQkJCTw8IFNFTkRfRVhJVDsNCisNCisJCXJldHVybiggKiggbVRhYmxlLT5tRWxlbWVudHNbb2Zmc2V0XSApICk7DQorCX0NCisNCisNCisJLyoqDQorCSAqIFNFVFRFUg0KKwkgKiBmb3IgZWxlbWVudCBhdCBnaXZlbiBwb3NpdGlvbg0KKwkgKi8NCisJaW5saW5lIHZvaWQgc2V0KGF2bV9zaXplX3Qgb2Zmc2V0LCBwb2ludGVyX3QgYW5FbGVtZW50KSBjb25zdA0KKwl7DQorCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX0FSUkFZX0lOREVYX0VYSVQoIG9mZnNldCAsIHNpemUoKSApDQorCQkJCTw8IFNFTkRfRVhJVDsNCisNCisJCW1UYWJsZS0+bUVsZW1lbnRzW29mZnNldF0gPSBhbkVsZW1lbnQ7DQorCX0NCisNCisJaW5saW5lIHZvaWQgYXBwZW5kKHBvaW50ZXJfdCBhbkVsZW1lbnQpIGNvbnN0DQorCXsNCisJCUFWTV9PU19BU1NFUlRfRkFUQUxfQVJSQVlfSU5ERVhfRVhJVCggMCAsIHNpemUoKSApDQorCQkJCTw8IFNFTkRfRVhJVDsNCisNCisJCWF2bV9zaXplX3Qgb2Zmc2V0ID0gMDsNCisJCWZvciggOyBvZmZzZXQgPCBtVGFibGUtPm1TaXplIDsgKytvZmZzZXQgKQ0KKwkJew0KKwkJCWlmKCBtVGFibGUtPm1FbGVtZW50c1sgb2Zmc2V0IF0gPT0gTlVMTCApDQorCQkJew0KKwkJCQltVGFibGUtPm1FbGVtZW50c1tvZmZzZXRdID0gYW5FbGVtZW50Ow0KKw0KKwkJCQlyZXR1cm47DQorCQkJfQ0KKwkJfQ0KKw0KKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKCBvZmZzZXQgPCBtVGFibGUtPm1TaXplICkNCisJCQkJPDwgIlVuZXhwZWN0ZWQgYSBmdWxsIFNtYXJ0VGFibGUgaW4gbWV0aG9kIGFwcGVuZCguLi4pICEiDQorCQkJCTw8IFNFTkRfRVhJVDsNCisJfQ0KKw0KKwkvKioNCisJICogU0VUVEVSDQorCSAqIGZvciBlbGVtZW50IGF0IGdpdmVuIHBvc2l0aW9uDQorCSAqIHVwZGF0ZSByZWZlcmVuY2UgY291bnRlcjo+IHJlbGVhc2UgYWNxdWlyZQ0KKwkgKi8NCisJaW5saW5lIHZvaWQgYXNzaWduKGF2bV9zaXplX3Qgb2Zmc2V0LCBwb2ludGVyX3QgYW5FbGVtZW50KSBjb25zdA0KKwl7DQorCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX0FSUkFZX0lOREVYX0VYSVQoIG9mZnNldCAsIHNpemUoKSApDQorCQkJCTw8IFNFTkRfRVhJVDsNCisNCisJCW1UYWJsZS0+cmVsZWFzZV9hY3F1aXJlKG9mZnNldCwgYW5FbGVtZW50KTsNCisJfQ0KKw0KKwlpbmxpbmUgdm9pZCBhc3NpZ24oYXZtX3NpemVfdCBvZmZzZXQsDQorCQkJY29uc3Qgc21hcnRfcG9pbnRlcl90ICYgYW5FbGVtZW50KSBjb25zdA0KKwl7DQorCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX0FSUkFZX0lOREVYX0VYSVQoIG9mZnNldCAsIHNpemUoKSApDQorCQkJCTw8IFNFTkRfRVhJVDsNCisNCisJCW1UYWJsZS0+cmVsZWFzZV9hY3F1aXJlKG9mZnNldCwgYW5FbGVtZW50LnJhd19wb2ludGVyKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBHRVRURVINCisJICogZm9yIGVsZW1lbnQgYXQgZ2l2ZW4gcG9zaXRpb24NCisJICogcmV0dXJuKCBTbWFydCBQb2ludGVyICkNCisJICovDQorCXRlbXBsYXRlPCBjbGFzcyBTbWFydFBvaW50ZXJUID4NCisJaW5saW5lIFNtYXJ0UG9pbnRlclQgdG9fc3AoYXZtX3NpemVfdCBvZmZzZXQpIGNvbnN0DQorCXsNCisJCUFWTV9PU19BU1NFUlRfRkFUQUxfQVJSQVlfSU5ERVhfRVhJVCggb2Zmc2V0ICwgc2l6ZSgpICkNCisJCQkJPDwgU0VORF9FWElUOw0KKw0KKwkJaWYoIC8vKG1UYWJsZSAhPSBOVUxMKSAmJiAobVRhYmxlLT5tU2l6ZSA+IG9mZnNldCkgJiYNCisJCQkobVRhYmxlLT5tRWxlbWVudHNbIG9mZnNldCBdICE9IE5VTEwpICkNCisJCXsNCisJCQltVGFibGUtPm1FbGVtZW50c1sgb2Zmc2V0IF0tPmluY3JSZWZDb3VudCgpOw0KKw0KKwkJCXJldHVybiggU21hcnRQb2ludGVyVCggbVRhYmxlLT5tRWxlbWVudHNbb2Zmc2V0XSApICk7DQorCQl9DQorDQorCQlyZXR1cm4oIFNtYXJ0UG9pbnRlclQoKSApOw0KKwl9DQorDQorDQorCS8qKg0KKwkgKiBHRVRURVINCisJICogZm9yIGVsZW1lbnQgYXQgZ2l2ZW4gcG9zaXRpb24NCisJICogb3BlcmF0b3JbXQ0KKwkgKiByZXR1cm4oIFtjb25zdF9dcmVmZXJlbmNlX3QgKQ0KKwkgKi8NCisJaW5saW5lIHJlZmVyZW5jZV90IG9wZXJhdG9yW10oYXZtX3NpemVfdCBvZmZzZXQpDQorCXsNCisJCUFWTV9PU19BU1NFUlRfRkFUQUxfQVJSQVlfSU5ERVhfRVhJVCggb2Zmc2V0ICwgc2l6ZSgpICkNCisJCQkJPDwgU0VORF9FWElUOw0KKw0KKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggbVRhYmxlLT5tRWxlbWVudHNbb2Zmc2V0XSApDQorCQkJCTw8ICIgcG9pbnRlciBpbiBhbiBTbWFydFRhYmxlIGF0IG9mZnNldDogIiA8PCBvZmZzZXQgPDwgIiAhISEiDQorCQkJCTw8IFNFTkRfRVhJVDsNCisNCisJCXJldHVybiggKiggbVRhYmxlLT5tRWxlbWVudHNbb2Zmc2V0XSApICk7DQorCX0NCisNCisJaW5saW5lIGNvbnN0X3JlZmVyZW5jZV90IG9wZXJhdG9yW10oYXZtX3NpemVfdCBvZmZzZXQpIGNvbnN0DQorCXsNCisJCUFWTV9PU19BU1NFUlRfRkFUQUxfQVJSQVlfSU5ERVhfRVhJVCggb2Zmc2V0ICwgc2l6ZSgpICkNCisJCQkJPDwgU0VORF9FWElUOw0KKw0KKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggbVRhYmxlLT5tRWxlbWVudHNbb2Zmc2V0XSApDQorCQkJCTw8ICIgcG9pbnRlciBpbiBhbiBTbWFydFRhYmxlIGF0IG9mZnNldDogIiA8PCBvZmZzZXQgPDwgIiAhISEiDQorCQkJCTw8IFNFTkRfRVhJVDsNCisNCisJCXJldHVybiggKiggbVRhYmxlLT5tRWxlbWVudHNbb2Zmc2V0XSApICk7DQorCX0NCisNCisJLyoqDQorCSAqIEdFVFRFUg0KKwkgKiBmb3IgZWxlbWVudCBhdCAoIGZyb250IHwgYmFjayApIHBvc2l0aW9uDQorCSAqIHJldHVybiggW2NvbnN0X11wb2ludGVyX3QgKQ0KKwkgKi8NCisJaW5saW5lIHJlZmVyZW5jZV9wb2ludGVyX3QgZnJvbnQoKQ0KKwl7DQorCQlyZXR1cm4oKHNpemUoKSA9PSAwKSA/IE5VTEwgOiBtVGFibGUtPm1FbGVtZW50c1sgMCBdICk7DQorCX0NCisNCisJaW5saW5lIGNvbnN0X3JlZmVyZW5jZV9wb2ludGVyX3QgZnJvbnQoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIChzaXplKCkgPT0gMCkgPyBOVUxMIDogbVRhYmxlLT5tRWxlbWVudHNbIDAgXSApOw0KKwl9DQorDQorCWlubGluZSByZWZlcmVuY2VfcG9pbnRlcl90IGJhY2soKQ0KKwl7DQorCQlyZXR1cm4oIChzaXplKCkgPT0gMCkgPyBOVUxMIDogbVRhYmxlLT5tRWxlbWVudHNbbVRhYmxlLT5tU2l6ZSAtIDFdICk7DQorCX0NCisNCisJaW5saW5lIGNvbnN0X3JlZmVyZW5jZV9wb2ludGVyX3QgYmFjaygpIGNvbnN0DQorCXsNCisJCXJldHVybiggKHNpemUoKSA9PSAwKSA/IE5VTEwgOiBtVGFibGUtPm1FbGVtZW50c1ttVGFibGUtPm1TaXplIC0gMV0gKTsNCisJfQ0KKw0KKw0KKwkvKioNCisJICogSVRFUkFUT1INCisJICovDQorCWlubGluZSBpdGVyYXRvciBiZWdpbigpDQorCXsNCisJCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9QT0lOVEVSX0VYSVQoIG1UYWJsZSApDQorCQkJCTw8ICIgVGFibGUgaW4gYW4gU21hcnRUYWJsZSAhISEiDQorCQkJCTw8IFNFTkRfRVhJVDsNCisNCisJCXJldHVybiggbVRhYmxlLT5tRWxlbWVudHMgKTsNCisJfQ0KKw0KKwlpbmxpbmUgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdA0KKwl7DQorCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBtVGFibGUgKQ0KKwkJCQk8PCAiIFRhYmxlIGluIGFuIFNtYXJ0VGFibGUgISEhIg0KKwkJCQk8PCBTRU5EX0VYSVQ7DQorDQorCQlyZXR1cm4oIG1UYWJsZS0+bUVsZW1lbnRzICk7DQorCX0NCisNCisNCisJaW5saW5lIGl0ZXJhdG9yIGVuZCgpDQorCXsNCisJCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9QT0lOVEVSX0VYSVQoIG1UYWJsZSApDQorCQkJCTw8ICIgVGFibGUgaW4gYW4gU21hcnRUYWJsZSAhISEiDQorCQkJCTw8IFNFTkRfRVhJVDsNCisNCisJCXJldHVybiggbVRhYmxlLT5tRWxlbWVudHMgKyBzaXplKCkgKTsNCisJfQ0KKw0KKwlpbmxpbmUgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QNCisJew0KKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggbVRhYmxlICkNCisJCQkJPDwgIiBUYWJsZSBpbiBhbiBTbWFydFRhYmxlICEhISINCisJCQkJPDwgU0VORF9FWElUOw0KKw0KKwkJcmV0dXJuKCBtVGFibGUtPm1FbGVtZW50cyArIHNpemUoKSApOw0KKwl9DQorDQorCisJLyoqDQorCSAqIFJFRkNPVU5UDQorCSAqLw0KKwlpbmxpbmUgYXZtX3VpbnQzMl90IGdldFJlZkNvdW50KCkgY29uc3QNCisJew0KKwkJcmV0dXJuKCAoIG1UYWJsZSA9PSBOVUxMICkgPyAwIDogbVRhYmxlLT5nZXRSZWZDb3VudCgpICk7DQorCX0NCisNCisNCisJaW5saW5lIGJvb2wgaXNVbmlxdWUoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIChtVGFibGUgPT0gTlVMTCkgPyBmYWxzZSA6IG1UYWJsZS0+aXNVbmlxdWUoKSApOw0KKwl9DQorDQorCWlubGluZSBib29sIGlzTXVsdGlwbGUoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIChtVGFibGUgPT0gTlVMTCkgPyBmYWxzZSA6IG1UYWJsZS0+aXNNdWx0aXBsZSgpICk7DQorCX0NCisNCisJLyoqDQorCSAqIEFWTSBERUJVRyBSRUYgQ09VTlRFUg0KKwkgKi8NCisJaW5saW5lIHZvaWQgQVZNX0RFQlVHX1JFRl9DT1VOVEVSKE91dFN0cmVhbSAmIG9zKSBjb25zdA0KKwl7DQorQVZNX0lGX0RFQlVHX0ZMQUcoIFJFRkVSRU5DRV9DT1VOVElORyApDQorCQlpZiggbVRhYmxlICE9IE5VTEwgKQ0KKwkJew0KKwkJCW9zIDw8ICIgLyogPCByZWY6ICIgPDwgbVRhYmxlLT5nZXRSZWZDb3VudCgpIDw8ICIgPiAqLyI7DQorCQl9DQorCQllbHNlDQorCQl7DQorCQkJb3MgPDwgIiAvKiA8IHJlZjogU21hcnRUYWJsZTxudWxsPiAqLyI7DQorCQl9DQorCQlvcyA8PCBzdGQ6OmZsdXNoOw0KK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBSRUZFUkVOQ0VfQ09VTlRJTkcgKQ0KKwl9DQorDQorDQorCS8qKg0KKwkgKiBXUklUQUJJTElUWQ0KKwkgKi8NCisJaW5saW5lIGJvb2wgaXNXcml0YWJsZSgpIGNvbnN0DQorCXsNCisJCXJldHVybiggZ2V0UmVmQ291bnQoKSA9PSAxICk7DQorCX0NCisNCisJaW5saW5lIGJvb2wgaXNub3RXcml0YWJsZSgpIGNvbnN0DQorCXsNCisJCXJldHVybiggZ2V0UmVmQ291bnQoKSAhPSAxICk7DQorCX0NCisNCisJaW5saW5lIHZvaWQgbWFrZVdyaXRhYmxlKCkNCisJew0KKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggbVRhYmxlICkNCisJCQkJPDwgIiBUYWJsZSBpbiBhbiBTbWFydFRhYmxlICEhISINCisJCQkJPDwgU0VORF9FWElUOw0KKw0KKwkJaWYoIG1UYWJsZS0+aXNNdWx0aXBsZSgpICkNCisJCXsNCisJCQltVGFibGUtPmRlY3JSZWZDb3VudCgpOw0KKw0KKwkJCW1UYWJsZSA9IG1UYWJsZS0+Y2xvbmVfYWNxdWlyZSgpOw0KKwkJfQ0KKwl9DQorDQorCWlubGluZSB2b2lkIG1ha2VXcml0YWJsZShhdm1fc2l6ZV90IG9mZnNldCkNCisJew0KKwkJbWFrZVdyaXRhYmxlKCk7DQorDQorCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBtVGFibGUtPm1FbGVtZW50c1tvZmZzZXRdICkNCisJCQkJPDwgIiBwb2ludGVyIGluIGFuIFNtYXJ0VGFibGUgYXQgb2Zmc2V0OiAiIDw8IG9mZnNldCA8PCAiICEhISINCisJCQkJPDwgU0VORF9FWElUOw0KKw0KKwkJaWYoIG1UYWJsZS0+bUVsZW1lbnRzW29mZnNldF0tPmlzTXVsdGlwbGUoKSApDQorCQl7DQorCQkJbVRhYmxlLT5tRWxlbWVudHNbb2Zmc2V0XS0+ZGVjclJlZkNvdW50KCk7DQorDQorCQkJbVRhYmxlLT5tRWxlbWVudHNbb2Zmc2V0XSA9IG1UYWJsZS0+bUVsZW1lbnRzW29mZnNldF0tPmNsb25lKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEdFVFRFUg0KKwkgKiBmb3Igd2l0YWJsZSBlbGVtZW50IGF0IGdpdmVuIHBvc2l0aW9uDQorCSAqIHJldHVybiggcmVmZXJlbmNlX3BvaW50ZXJfdCApDQorCSAqLw0KKwlpbmxpbmUgcmVmZXJlbmNlX3BvaW50ZXJfdCBnZXRXcml0YWJsZShhdm1fc2l6ZV90IG9mZnNldCkNCisJew0KKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9BUlJBWV9JTkRFWF9FWElUKCBvZmZzZXQgLCBzaXplKCkgKQ0KKwkJCQk8PCBTRU5EX0VYSVQ7DQorDQorCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBtVGFibGUtPm1FbGVtZW50c1tvZmZzZXRdICkNCisJCQkJPDwgIiBwb2ludGVyIGluIGFuIFNtYXJ0VGFibGUgYXQgb2Zmc2V0OiAiIDw8IG9mZnNldCA8PCAiICEhISINCisJCQkJPDwgU0VORF9FWElUOw0KKw0KKwkJbWFrZVdyaXRhYmxlKCk7DQorDQorCQlpZiggbVRhYmxlLT5tRWxlbWVudHNbb2Zmc2V0XS0+aXNNdWx0aXBsZSgpICkNCisJCXsNCisJCQltVGFibGUtPm1FbGVtZW50c1tvZmZzZXRdLT5kZWNyUmVmQ291bnQoKTsNCisNCisJCQltVGFibGUtPm1FbGVtZW50c1tvZmZzZXRdID0gbVRhYmxlLT5tRWxlbWVudHNbb2Zmc2V0XS0+Y2xvbmUoKTsNCisJCX0NCisNCisJCXJldHVybiggbVRhYmxlLT5tRWxlbWVudHNbb2Zmc2V0XSApOw0KKwl9DQorDQorCS8qKg0KKwkgKiBHRVRURVINCisJICogZm9yIHdpdGFibGUgZWxlbWVudCBhdCBnaXZlbiBwb3NpdGlvbg0KKwkgKiByZXR1cm4oIHJlZmVyZW5jZV90ICkNCisJICovDQorCWlubGluZSByZWZlcmVuY2VfdCByZWZXcml0YWJsZShhdm1fc2l6ZV90IG9mZnNldCkNCisJew0KKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9BUlJBWV9JTkRFWF9FWElUKCBvZmZzZXQgLCBzaXplKCkgKQ0KKwkJCQk8PCBTRU5EX0VYSVQ7DQorDQorCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBtVGFibGUtPm1FbGVtZW50c1tvZmZzZXRdICkNCisJCQkJPDwgIiBwb2ludGVyIGluIGFuIFNtYXJ0VGFibGUgYXQgb2Zmc2V0OiAiIDw8IG9mZnNldCA8PCAiICEhISINCisJCQkJPDwgU0VORF9FWElUOw0KKw0KKwkJbWFrZVdyaXRhYmxlKCk7DQorDQorCQlpZiggbVRhYmxlLT5tRWxlbWVudHNbb2Zmc2V0XS0+aXNNdWx0aXBsZSgpICkNCisJCXsNCisJCQltVGFibGUtPm1FbGVtZW50c1tvZmZzZXRdLT5kZWNyUmVmQ291bnQoKTsNCisNCisJCQltVGFibGUtPm1FbGVtZW50c1tvZmZzZXRdID0gbVRhYmxlLT5tRWxlbWVudHNbb2Zmc2V0XS0+Y2xvbmUoKTsNCisJCX0NCisNCisJCXJldHVybiggKiggbVRhYmxlLT5tRWxlbWVudHNbb2Zmc2V0XSApICk7DQorCX0NCisNCisvLwl0ZW1wbGF0ZTwgY2xhc3MgRWxlbWVudFQgPg0KKy8vCWlubGluZSByZWZlcmVuY2VfcG9pbnRlcl90IGdldFdyaXRhYmxlKEVsZW1lbnRUICogYW5FbGVtZW50KQ0KKy8vCXsNCisvLwkJcmV0dXJuKCBnZXRXcml0YWJsZSggYW5FbGVtZW50LT5nZXRPZmZzZXQoKSApICk7DQorLy8JfQ0KKw0KKwkvKioNCisJICogR0VUVEVSDQorCSAqIGZvciB3aXRhYmxlIGVsZW1lbnQgYXQgZ2l2ZW4gcG9zaXRpb24NCisJICogcmV0dXJuKCBTbWFydFBvaW50ZXJUICkNCisJICovDQorCXRlbXBsYXRlPCBjbGFzcyBTbWFydFBvaW50ZXJUID4NCisJaW5saW5lIFNtYXJ0UG9pbnRlclQgc3BXcml0YWJsZShhdm1fc2l6ZV90IG9mZnNldCkNCisJew0KKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9BUlJBWV9JTkRFWF9FWElUKCBvZmZzZXQgLCBzaXplKCkgKQ0KKwkJCQk8PCBTRU5EX0VYSVQ7DQorDQorCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBtVGFibGUtPm1FbGVtZW50c1tvZmZzZXRdICkNCisJCQkJPDwgIiBwb2ludGVyIGluIGFuIFNtYXJ0VGFibGUgYXQgb2Zmc2V0OiAiIDw8IG9mZnNldCA8PCAiICEhISINCisJCQkJPDwgU0VORF9FWElUOw0KKw0KKwkJbWFrZVdyaXRhYmxlKCk7DQorDQorCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBtVGFibGUtPm1FbGVtZW50c1tvZmZzZXRdICkNCisJCQkJPDwgIiBwb2ludGVyIGluIGFuIFNtYXJ0VGFibGUgYXQgb2Zmc2V0OiAiIDw8IG9mZnNldCA8PCAiICEhISINCisJCQkJPDwgU0VORF9FWElUOw0KKw0KKwkJaWYoIG1UYWJsZS0+bUVsZW1lbnRzW29mZnNldF0tPmlzTXVsdGlwbGUoKSApDQorCQl7DQorCQkJbVRhYmxlLT5tRWxlbWVudHNbb2Zmc2V0XS0+ZGVjclJlZkNvdW50KCk7DQorDQorCQkJbVRhYmxlLT5tRWxlbWVudHNbb2Zmc2V0XSA9IG1UYWJsZS0+bUVsZW1lbnRzW29mZnNldF0tPmNsb25lKCk7DQorCQl9DQorDQorCQltVGFibGUtPm1FbGVtZW50c1sgb2Zmc2V0IF0tPmluY3JSZWZDb3VudCgpOw0KKw0KKwkJcmV0dXJuKCBTbWFydFBvaW50ZXJUKG1UYWJsZS0+bUVsZW1lbnRzW29mZnNldF0pICk7DQorCX0NCisNCisNCisJLyoqDQorCSAqIFJFU0laRQ0KKwkgKi8NCisJaW5saW5lIHZvaWQgbWFrZVdyaXRhYmxlUmVzaXplKA0KKwkJCWF2bV9zaXplX3QgYVNpemUsIHBvaW50ZXJfdCBhRGVmYXVsdFZhbHVlID0gTlVMTCkNCisJew0KKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggbVRhYmxlICkNCisJCQkJPDwgIiBUYWJsZSBpbiBhbiBTbWFydFRhYmxlICEhISINCisJCQkJPDwgU0VORF9FWElUOw0KKw0KKwkJaWYoIG1UYWJsZS0+aXNNdWx0aXBsZSgpICkNCisJCXsNCisJCQltVGFibGUtPmRlY3JSZWZDb3VudCgpOw0KKw0KKwkJCW1UYWJsZSA9IG1UYWJsZS0+Y2xvbmVfcmVzaXplX2FjcXVpcmUoYVNpemUsIGFEZWZhdWx0VmFsdWUpOw0KKwkJfQ0KKwkJZWxzZSAvLyBpZiggbVRhYmxlLT5pc1VuaXF1ZSgpID4gMSApDQorCQl7DQorCQkJbVRhYmxlLT5yZXNpemUoYVNpemUsIGFEZWZhdWx0VmFsdWUpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBbSU5dVkFMSURJVFkNCisJICovDQorCWlubGluZSBib29sIGlzTnVsbCgpIGNvbnN0DQorCXsNCisJCXJldHVybiggbVRhYmxlID09IE5VTEwgKTsNCisJfQ0KKw0KKwlpbmxpbmUgYm9vbCBpc051bGwoYXZtX3NpemVfdCBvZmZzZXQpIGNvbnN0DQorCXsNCisvLwkJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggbVRhYmxlICkNCisvLwkJCQk8PCAiIFRhYmxlIGluIGFuIFNtYXJ0VGFibGUgISEhIg0KKy8vCQkJCTw8IFNFTkRfRVhJVDsNCisNCisJCXJldHVybiggKG1UYWJsZSA9PSBOVUxMKQ0KKwkJCQl8fCAobVRhYmxlLT5tRWxlbWVudHNbb2Zmc2V0XSA9PSBOVUxMKSApOw0KKwl9DQorDQorCWlubGluZSBib29sIGludmFsaWQoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIG1UYWJsZSA9PSBOVUxMICk7DQorCX0NCisNCisJaW5saW5lIGJvb2wgaW52YWxpZChhdm1fc2l6ZV90IG9mZnNldCkgY29uc3QNCisJew0KKy8vCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBtVGFibGUgKQ0KKy8vCQkJCTw8ICIgVGFibGUgaW4gYW4gU21hcnRUYWJsZSAhISEiDQorLy8JCQkJPDwgU0VORF9FWElUOw0KKw0KKwkJcmV0dXJuKCAobVRhYmxlID09IE5VTEwpDQorCQkJCXx8IChtVGFibGUtPm1FbGVtZW50c1tvZmZzZXRdID09IE5VTEwpICk7DQorCX0NCisNCisNCisJaW5saW5lIGJvb2wgaXNub3ROdWxsKCkgY29uc3QNCisJew0KKwkJcmV0dXJuKCBtVGFibGUgIT0gTlVMTCApOw0KKwl9DQorDQorCWlubGluZSBib29sIGlzbm90TnVsbChhdm1fc2l6ZV90IG9mZnNldCkgY29uc3QNCisJew0KKy8vCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBtVGFibGUgKQ0KKy8vCQkJCTw8ICIgVGFibGUgaW4gYW4gU21hcnRUYWJsZSAhISEiDQorLy8JCQkJPDwgU0VORF9FWElUOw0KKw0KKwkJcmV0dXJuKCAobVRhYmxlICE9IE5VTEwpDQorCQkJCSYmIChtVGFibGUtPm1FbGVtZW50c1tvZmZzZXRdICE9IE5VTEwpICk7DQorCX0NCisNCisNCisJaW5saW5lIGJvb2wgdmFsaWQoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIG1UYWJsZSAhPSBOVUxMICk7DQorCX0NCisNCisJaW5saW5lIGJvb2wgdmFsaWQoYXZtX3NpemVfdCBvZmZzZXQpIGNvbnN0DQorCXsNCisvLwkJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggbVRhYmxlICkNCisvLwkJCQk8PCAiIFRhYmxlIGluIGFuIFNtYXJ0VGFibGUgISEhIg0KKy8vCQkJCTw8IFNFTkRfRVhJVDsNCisNCisJCXJldHVybiggKG1UYWJsZSAhPSBOVUxMKQ0KKwkJCQkmJiAobVRhYmxlLT5tRWxlbWVudHNbb2Zmc2V0XSAhPSBOVUxMKSApOw0KKwl9DQorDQorDQorCS8qKg0KKwkgKiBTV0FQDQorCSAqIEZMVVNIDQorCSAqLw0KKwlpbmxpbmUgdm9pZCBzd2FwKFNtYXJ0VGFibGUgJiBvdGhlcikNCisJew0KKwkJc3RkOjpzd2FwKG1UYWJsZSwgb3RoZXIubVRhYmxlKTsNCisJfQ0KKw0KKwlpbmxpbmUgdm9pZCBmbHVzaChTbWFydFRhYmxlICYgb3RoZXIpDQorCXsNCisJCXJlbGVhc2UoIG90aGVyLm1UYWJsZSApOw0KKw0KKwkJb3RoZXIubVRhYmxlID0gTlVMTDsNCisJfQ0KKw0KKw0KKwkvKioNCisJICogR0VUVEVSDQorCSAqIG1UYWJsZQ0KKwkgKi8NCisJaW5saW5lIGF2bV9hZGRyZXNzX3QgcmF3X2FkZHJlc3MoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIGF2bV9hZGRyZXNzX3QoIG1UYWJsZSApICk7DQorCX0NCisNCisJLyoqDQorCSAqIEFTU0lHTk1FTlQNCisJICovDQorCWlubGluZSBTbWFydFRhYmxlICYgb3BlcmF0b3I9KHRhYmxlX3BvaW50ZXJfdCBhVGFibGUpDQorCXsNCisJCWlmKCBtVGFibGUgIT0gYVRhYmxlICkNCisJCXsNCisJCQlyZWxlYXNlKCBhVGFibGUgKTsNCisJCX0NCisJCXJldHVybiggKnRoaXMgKTsNCisJfQ0KKw0KKwlpbmxpbmUgU21hcnRUYWJsZSAmIG9wZXJhdG9yPShjb25zdCBTbWFydFRhYmxlICYgb3RoZXIpDQorCXsNCisJCWlmKCBtVGFibGUgIT0gb3RoZXIubVRhYmxlICkNCisJCXsNCisJCQlyZWxlYXNlX2FjcXVpcmUoIG90aGVyLm1UYWJsZSApOw0KKwkJfQ0KKwkJcmV0dXJuKCAqdGhpcyApOw0KKwl9DQorDQorDQorCS8qKg0KKwkgKiBDT01QQVJJU09ODQorCSAqIE9QRVJBVE9SDQorCSAqLw0KKw0KKwlpbmxpbmUgYm9vbCBvcGVyYXRvcj09KHRhYmxlX3BvaW50ZXJfdCBhVGFibGUpIGNvbnN0DQorCXsNCisJCXJldHVybiggbVRhYmxlID09IGFUYWJsZSApOw0KKwl9DQorDQorCWlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgU21hcnRUYWJsZSAmIG90aGVyKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIG1UYWJsZSA9PSBvdGhlci5tVGFibGUgKTsNCisJfQ0KKw0KKwl0ZW1wbGF0ZTxjbGFzcyBVPg0KKwlpbmxpbmUgYm9vbCBvcGVyYXRvcj09KA0KKwkJCWNvbnN0IFNtYXJ0VGFibGU8IFUgLCBUZGVzdHJ1Y3RvciA+ICYgb3RoZXIpIGNvbnN0DQorCXsNCisJCXJldHVybiggbVRhYmxlID09IG90aGVyLnJhd19wb2ludGVyKCkgKTsNCisJfQ0KKw0KKw0KKwlpbmxpbmUgYm9vbCBvcGVyYXRvciE9KHRhYmxlX3BvaW50ZXJfdCBhVGFibGUpIGNvbnN0DQorCXsNCisJCXJldHVybiggbVRhYmxlICE9IGFUYWJsZSApOw0KKwl9DQorDQorCWlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgU21hcnRUYWJsZSAmIG90aGVyKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIG1UYWJsZSAhPSBvdGhlci5tVGFibGUgKTsNCisJfQ0KKw0KKwl0ZW1wbGF0ZTxjbGFzcyBVPg0KKwlpbmxpbmUgYm9vbCBvcGVyYXRvciE9KA0KKwkJCWNvbnN0IFNtYXJ0VGFibGU8IFUgLCBUZGVzdHJ1Y3RvciA+ICYgb3RoZXIpIGNvbnN0DQorCXsNCisJCXJldHVybiggbVRhYmxlICE9IG90aGVyLnJhd19wb2ludGVyKCkgKTsNCisJfQ0KKw0KKw0KK3Byb3RlY3RlZDoNCisJLyoqDQorCSAqIGFjcXVpcmUNCisJICogcmVsZWFzZQ0KKwkgKiByZWxlYXNlX2FjcXVpcmUNCisJICovDQorCS8vIGluY3JlbWVudCB0aGUgY291bnQNCisJaW5saW5lIHZvaWQgYWNxdWlyZSh0YWJsZV9wb2ludGVyX3QgYVRhYmxlKQ0KKwl7DQorCQlpZiggYVRhYmxlICE9IE5VTEwgKQ0KKwkJew0KKwkJCWFUYWJsZS0+aW5jclJlZkNvdW50KCk7DQorCQl9DQorDQorCQltVGFibGUgPSBhVGFibGU7DQorCX0NCisNCisNCisJLy8gZGVjcmVtZW50IHRoZSBjb3VudCwgZGVsZXRlIGlmIGl0IGlzIDANCisJaW5saW5lIHZvaWQgcmVsZWFzZSh0YWJsZV9wb2ludGVyX3QgYVRhYmxlKQ0KKwl7DQorCQlkZXN0cm95VGFibGUoIG1UYWJsZSApOw0KKw0KKwkJbVRhYmxlID0gYVRhYmxlOw0KKwl9DQorDQorDQorCWlubGluZSB2b2lkIHJlbGVhc2VfYWNxdWlyZSh0YWJsZV9wb2ludGVyX3QgYVRhYmxlKQ0KKwl7DQorCQlkZXN0cm95VGFibGUoIG1UYWJsZSApOw0KKw0KKwkJaWYoIGFUYWJsZSAhPSBOVUxMICkNCisJCXsNCisJCQlhVGFibGUtPmluY3JSZWZDb3VudCgpOw0KKwkJfQ0KKw0KKwkJbVRhYmxlID0gYVRhYmxlOw0KKwl9DQorDQorDQorcHVibGljOg0KKwkvKioNCisJICogU2VyaWFsaXphdGlvbg0KKwkgKi8NCisJaW5saW5lIHN0ZDo6c3RyaW5nIHN0cigpIGNvbnN0DQorCXsNCisJCXN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7DQorDQorCQlpZiggbVRhYmxlICE9IE5VTEwgKQ0KKwkJew0KKwkJCWlmKCBtVGFibGUtPm1TaXplID4gMCApDQorCQkJew0KKwkJCQlvc3MgPDwgIlsgIiA8PCBtVGFibGUtPm1FbGVtZW50c1sgMCBdLT5zdHIoKTsNCisNCisJCQkJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDEgOyBvZmZzZXQgPCBtVGFibGUtPm1TaXplIDsgKytvZmZzZXQgKQ0KKwkJCQl7DQorCQkJCQlpZiggbVRhYmxlLT5tRWxlbWVudHNbIG9mZnNldCBdICE9IE5VTEwgKQ0KKwkJCQkJew0KKwkJCQkJCW9zcwk8PCAiICwgIiA8PCBtVGFibGUtPm1FbGVtZW50c1sgb2Zmc2V0IF0tPnN0cigpOw0KKwkJCQkJfQ0KKwkJCQkJZWxzZQ0KKwkJCQkJew0KKwkJCQkJCW9zcyA8PCAiICwgbnVsbDwgVCAqID4iOw0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCW9zcyA8PCAiIF0iOw0KKw0KKwkJCQlyZXR1cm4oIG9zcy5zdHIoKSApOw0KKwkJCX0NCisJCQllbHNlDQorCQkJew0KKwkJCQlyZXR1cm4oICJlbXB0eTxTbWFydFRhYmxlPiIgKTsNCisJCQl9DQorCQl9DQorCQllbHNlDQorCQl7DQorCQkJcmV0dXJuKCAibnVsbDxTbWFydFRhYmxlPiIgKTsNCisJCX0NCisJfQ0KKw0KKwlpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoDQorCQkJY29uc3QgQXZtSW5kZW50ICYgaW5kZW50ID0gQVZNX1RBQl9JTkRFTlQpIGNvbnN0DQorCXsNCisJCVN0cmluZ091dFN0cmVhbSBvc3MoaW5kZW50KTsNCisNCisJCXRvU3RyZWFtKCBvc3MgKTsNCisNCisJCXJldHVybiggb3NzLnN0cigpICk7DQorCX0NCisNCisJaW5saW5lIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0DQorCXsNCisJCWlmKCBtVGFibGUgIT0gTlVMTCApDQorCQl7DQorCQkJaWYoIG1UYWJsZS0+bVNpemUgPiAwICkNCisJCQl7DQorCQkJCWZvciggYXZtX3NpemVfdCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgbVRhYmxlLT5tU2l6ZSA7ICsrb2Zmc2V0ICkNCisJCQkJew0KKwkJCQkJaWYoIG1UYWJsZS0+bUVsZW1lbnRzWyBvZmZzZXQgXSAhPSBOVUxMICkNCisJCQkJCXsNCisJCQkJCQltVGFibGUtPm1FbGVtZW50c1sgb2Zmc2V0IF0tPnRvU3RyZWFtKG9zKTsNCisJCQkJCX0NCisJCQkJCWVsc2UNCisJCQkJCXsNCisJCQkJCQlvcyA8PCBUQUIgPDwgIm51bGw8IFQgKiA+IiA8PCBFT0w7DQorCQkJCQl9DQorCQkJCQlvcyA8PCBzdGQ6OmZsdXNoOw0KKwkJCQl9DQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCW9zIDw8IFRBQiA8PCAiZW1wdHk8U21hcnRUYWJsZT4iIDw8IEVPTF9GTFVTSDsNCisJCQl9DQorCQl9DQorCQllbHNlDQorCQl7DQorCQkJb3MgPDwgVEFCIDw8ICJudWxsPFNtYXJ0VGFibGU+IiA8PCBFT0xfRkxVU0g7DQorCQl9DQorCX0NCisNCit9Ow0KKw0KKw0KK30gLyogbmFtZXNwYWNlIHNlcCAqLw0KKw0KKyNlbmRpZiAvKiBCQVNFX1NNQVJUVEFCTEVfSF8gKi8NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL0J1aWxkZXIuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9CdWlsZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTZhMmIxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9CdWlsZGVyLmNwcApAQCAtMCwwICsxLDk5OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQnVpbGRlci5oIgorCisjaW5jbHVkZSA8YnVpbGRlci9Mb2FkZXIuaD4KKworI2luY2x1ZGUgPGJ1aWxkZXIvcHJpbWl0aXZlL0NvbXBpbGF0aW9uRW52aXJvbm1lbnQuaD4KKworI2luY2x1ZGUgPGNvbXB1dGVyL0V4ZWN1dGlvbkVudmlyb25tZW50Lmg+CisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9Bdm1Qcm9ncmFtLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvQmFzZUluc3RhbmNlRm9ybS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVGb3JtLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZVF1ZXJ5Lmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZVN5c3RlbS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZCdWZmZXIuaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mQ29ubmVjdC5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZEYXRhLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZk1hY2hpbmUuaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mUG9ydC5oPgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkNvbnN0YW50Lmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkNvbnN0cnVjdG9yLmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vU3RhdGVtZW50Q29uc3RydWN0b3IuaD4KKworI2luY2x1ZGUgPGZtbC9vcGVyYXRvci9PcGVyYXRvci5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uQ29uZmlndXJhdGlvbi5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkNvbnRleHQuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25EYXRhLmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvTG9jYWxSdW50aW1lLmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvUnVudGltZUZvcm0uaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9UYWJsZU9mUnVudGltZUZvcm1TdGF0ZS5oPgorCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1N5c3RlbS5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL0xvY2FsUnVudGltZS5oPgorCisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1VuaUZvcm1JZGVudGlmaWVyLmg+CisKKyNpbmNsdWRlIDxzZXcvQ29uZmlndXJhdGlvbi5oPgorI2luY2x1ZGUgPHNldy9TeW1iZXhFbmdpbmUuaD4KKworI2luY2x1ZGUgPHV0aWwvRXhlY3V0aW9uVGltZS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvKioKKyAqIExPQURFUgorICovCit2b2lkIEJ1aWxkZXI6OmxvYWQoKQoreworCUNvbXBpbGF0aW9uRW52aXJvbm1lbnQ6OmluaXRDYWNoZSgpOworfQorCisKKy8qKgorICogRElTUE9TRVIKKyAqLwordm9pZCBCdWlsZGVyOjpkaXNwb3NlKCkKK3sKKwlDb21waWxhdGlvbkVudmlyb25tZW50OjpmaW5hbGl6ZUNhY2hlKCk7Cit9CisKKworCisvKioKKyAqIENPTkZJR1VSRQorICovCitib29sIEJ1aWxkZXI6OmNvbmZpZ3VyZSgpCit7CisJaWYoIG5vdCBtQ29tcGlsZXIuY29uZmlndXJlKCkgKQorCXsKKwkJQVZNX09TX0VSUk9SX0FMRVJUCisJCQkJPDwgIkJ1aWxkZXI6OmNvbmZpZ3VyZTo+ICIKKwkJCQkJInRoZSBYTElBIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gZmFpbGVkICEhISIKKwkJCQk8PCBTRU5EX0FMRVJUOworCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvKioKKyAqIFNUQVJUCisgKi8KK2Jvb2wgQnVpbGRlcjo6c3RhcnQoKQoreworCS8vIENPTVBJTEFUSU9OCisvL0NIUk9OTworLy9BVk1fT1NfREVCVUcgPDwgc3RkOjplbmRsIDw8ICJCdWlsZGluZzo+IHN0YXJ0IGNocm9ubyAhIiA8PCBzdGQ6OmVuZGw7CisvL0V4ZWN1dGlvblRpbWUgY2hyb25vKCB0cnVlICk7CisKKwlpZiggbUNvbmZpZ3VyYXRpb24uaGFzU3BlY2lmaWNhdGlvbigpICkKKwl7CisJCW1Db21waWxlci5zdGFydCggbUNvbmZpZ3VyYXRpb24uZ2V0U3BlY2lmaWNhdGlvbigpICk7CisKKwkJbUNvbXBpbGVyLnJlcG9ydENvbXBpbGF0aW9uKEFWTV9PU19MT0cpOworCQlpZiggbUNvbXBpbGVyLmhhc0Vycm9yKCkgKQorCQl7CisJCQltQ29tcGlsZXIucmVwb3J0Q29tcGlsYXRpb24oQVZNX09TX0NPVVQpOworCQkJbUNvbXBpbGVyLnJlcG9ydENvbXBpbGF0aW9uKEFWTV9PU19UUkFDRSk7CisKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCQllbHNlIGlmKCBtQ29tcGlsZXIuaGFzRXJyb3JXYXJuaW5nKCkgKQorCQl7CisJCQltQ29tcGlsZXIucmVwb3J0Q29tcGlsYXRpb24oQVZNX09TX0NPVVQpOworCQl9CisJfQorCWVsc2UgaWYoIEFWTV9FUlJPUl9DT1VOVCA9PSAwICkKKwl7CisJCSsrQVZNX0VSUk9SX0NPVU5UOworCX0KKworCisJaWYoIChBVk1fRVJST1JfQ09VTlQgPiAwKSAmJiAoQVZNX1dBUk5JTkdfQ09VTlQgPiAwKSApCisJeworCQlBVk1fT1NfRVhJVCggRkFJTEVEICkKKwkJCQk8PCAiQ29tcGlsYXRpb24gOiBlcnJvciIKKwkJCQk8PCAoIChBVk1fRVJST1JfQ09VTlQgPiAwKSA/ICJzICIgOiAiICIgKSA8PCBBVk1fRVJST1JfQ09VTlQKKwkJCQk8PCAiIDogd2FybmluZyIKKwkJCQk8PCAoIChBVk1fRVJST1JfQ09VTlQgPiAwKSA/ICJzICIgOiAiICIgKSA8PCBBVk1fV0FSTklOR19DT1VOVAorCQkJCTw8IFNFTkRfRVhJVDsKKwl9CisKKworLy8JQ0hST05PCisvL2Nocm9uby5maW5pc2hfdGltZSgpOworLy9BVk1fT1NfREVCVUcgPDwgc3RkOjplbmRsIDw8ICJjaHJvbm8gc3RvcDo+ICIgPDwgY2hyb25vLnRpbWVfc3RhdCgpIDw8IHN0ZDo6ZW5kbDsKKworCitBVk1fSUZfREVCVUdfRkxBRyggQ09NUElMSU5HICkKKwltQ29uZmlndXJhdGlvbi5zZXJpYWxpemVEZWJ1Z0V4ZWN1dGFibGUoICJjb21waWxlZCIgKTsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKENPTVBJTElORyApCisKKworCS8vIExPQURJTkcgSU5TVEFOQ0UgRk9SIEVYRUNVVElPTgorLy9DSFJPTk8KKy8vQVZNX09TX0RFQlVHIDw8IHN0ZDo6ZW5kbCA8PCAiTG9hZGluZzo+IHN0YXJ0IGNocm9ubyAhIiA8PCBzdGQ6OmVuZGw7CisvL2Nocm9uby5zdGFydF90aW1lKCk7CisKKwkvKgorCSAqIENyZWF0aW5nIHRoZSBmaXJzdC9pbml0aWFsIGV4ZWN1dGlvbiBkYXRhL2NvbnRleHQKKwkgKi8KKwlBUEV4ZWN1dGlvbkRhdGEgdGhlSW5pdGlhbEV4ZWN1dGlvbkRhdGEgPSBjcmVhdGVJbml0aWFsRXhlY3V0aW9uRGF0YSgpOworCisJbUNvbmZpZ3VyYXRpb24uc2V0TWFpbkV4ZWN1dGlvbkRhdGEoIHRoZUluaXRpYWxFeGVjdXRpb25EYXRhICk7CisKKwlFeGVjdXRpb25Db250ZXh0ICogYW5Jbml0aWFsRXhlY3V0aW9uQ29udGV4dCA9CisJCQluZXcgRXhlY3V0aW9uQ29udGV4dCh0aGVJbml0aWFsRXhlY3V0aW9uRGF0YSwgMCwgMSk7CisKKwltQ29uZmlndXJhdGlvbi5hcHBlbmRJbnB1dENvbnRleHQoIGFuSW5pdGlhbEV4ZWN1dGlvbkNvbnRleHQgKTsKKworLy9DSFJPTk8KKy8vY2hyb25vLmZpbmlzaF90aW1lKCk7CisvL0FWTV9PU19ERUJVRyA8PCBzdGQ6OmVuZGwgPDwgImNocm9ubyBzdG9wOj4gIiA8PCBjaHJvbm8udGltZV9zdGF0KCkgPDwgc3RkOjplbmRsOworCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworLyoKKyAqIEluaXRpYWwgRXhlY3V0aW9uIENvbnRleHQgY3JlYXRpb24KKyAqLworQVBFeGVjdXRpb25EYXRhIEJ1aWxkZXI6OmNyZWF0ZUluaXRpYWxFeGVjdXRpb25EYXRhKCkKK3sKKwlFeGVjdXRhYmxlU3lzdGVtICYgYW5FeGVjdXRhYmxlU3lzdGVtID0KKwkJCW1Db25maWd1cmF0aW9uLmdldEV4ZWN1dGFibGVTeXN0ZW0oKTsKKworCUFQRXhlY3V0aW9uRGF0YSB0aGVJbml0aWFsRXhlY3V0aW9uRGF0YSggbmV3IEV4ZWN1dGlvbkRhdGEoCisJCQlhbkV4ZWN1dGFibGVTeXN0ZW0uZ2V0TWFjaGluZUNvdW50KCkgKyAxIC8qIGZvciBQQVJBTUVURVJTICovICkgKTsKKworCXRoZUluaXRpYWxFeGVjdXRpb25EYXRhLT5zZXROb2RlQ29uZGl0aW9uKAorCQkJRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX1RSVUUgKTsKKwl0aGVJbml0aWFsRXhlY3V0aW9uRGF0YS0+c2V0Tm9kZVRpbWVkQ29uZGl0aW9uKAorCQkJRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX1RSVUUgKTsKKworCXRoZUluaXRpYWxFeGVjdXRpb25EYXRhLT5zZXRQYXRoQ29uZGl0aW9uKAorCQkJRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX1RSVUUgKTsKKwl0aGVJbml0aWFsRXhlY3V0aW9uRGF0YS0+c2V0UGF0aFRpbWVkQ29uZGl0aW9uKAorCQkJRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX1RSVUUgKTsKKworCS8qCisJICogTG9hZGluZyBpbnN0YW5jZQorCSAqLworCWludCB0aGVQaWQgPSAwOworCWF2bV9vZmZzZXRfdCB0aGVPZmZzZXQgPSAwOworCisJTG9hZGVyICYgdGhlTG9hZGVyID0gbVN5bWJleEVuZ2luZS5nZXRMb2FkZXIoKTsKKworCS8qCisJICogTG9hZGluZyBwYXJhbWV0ZXJzIGluc3RhbmNlCisJICovCisJLy8gRXhlY3V0aW9uRGF0YTo6UEFSQU1fTUFDSElORV9SVU5USU1FX09GRlNFVCA9PT0gdGhlT2Zmc2V0ID09PSAwCisJUnVudGltZUlEIHBhcmFtZXRlcnNSSUQoUnVudGltZUlEOjpSRUZfTlVMTCwgdGhlUGlkKyssCisJCQl0aGVPZmZzZXQrKywgYW5FeGVjdXRhYmxlU3lzdGVtLnJhd1BhcmFtZXRlcnNJbnN0YW5jZSgpKTsKKworCW1Db25maWd1cmF0aW9uLmFwcGVuZFJJRCggcGFyYW1ldGVyc1JJRCApOworCisJdGhlSW5pdGlhbEV4ZWN1dGlvbkRhdGEtPnNhdmVSdW50aW1lRm9ybShwYXJhbWV0ZXJzUklELmdldE9mZnNldCgpLAorCQkJbmV3IFBhcmFtZXRlcnNSdW50aW1lRm9ybSggcGFyYW1ldGVyc1JJRCApICk7CisKKwl0aGVJbml0aWFsRXhlY3V0aW9uRGF0YS0+c2V0UnVudGltZUZvcm1TdGF0ZSgKKwkJCXBhcmFtZXRlcnNSSUQuZ2V0T2Zmc2V0KCksIFBST0NFU1NfVU5ERUZJTkVEX1NUQVRFKTsKKworCS8qCisJICogTG9hZGluZyBzeXN0ZW0gaW5zdGFuY2UKKwkgKi8KKwkvLyBFeGVjdXRpb25EYXRhOjpTWVNURU1fUlVOVElNRV9PRkZTRVQgPT09IHRoZU9mZnNldCA9PT0gMQorCVJ1bnRpbWVGb3JtICogdGhlU3lzdGVtUnVudGltZSA9IHRoZUxvYWRlci5sb2FkU3lzdGVtSW5zdGFuY2UoCisJCQl0aGVJbml0aWFsRXhlY3V0aW9uRGF0YSwgUnVudGltZUlEOjpSRUZfTlVMTCwKKwkJCWFuRXhlY3V0YWJsZVN5c3RlbS5yYXdTeXN0ZW1JbnN0YW5jZSgpLCB0aGVQaWQsIHRoZU9mZnNldCk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgTE9BRElORyApCisJdGhlU3lzdGVtUnVudGltZS0+dG9TdHJlYW0oIEFWTV9PU19UUkFDRSApOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBMT0FESU5HICkKKworCS8qKgorCSAqIFJVTk5JTkcgb25DUkVBVEUKKwkgKi8KKwlpZiggbm90IHRoZUxvYWRlci5maW5hbGl6ZVJ1bm5pbmdPbkNyZWF0ZShFTlYsIHRoZUluaXRpYWxFeGVjdXRpb25EYXRhKSApCisJeworCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCTw8ICJjcmVhdGVJbml0aWFsRXhlY3V0aW9uQ29udGV4dDo+IEZhaWxlZCB0byBmaW5hbGl6ZSAiCisJCQkJCQkibG9hZGluZyBieSBydW5uaW5nIDw8IG9uQ3JlYXRlIFByaW1pdGl2ZSA+PiAhISEiCisJCQkJPDwgU0VORF9FWElUOworCX0KKworCS8vIFdBUk5JTkcgQXNzdW1lIHBvc3NpYmxlIGF1dG8tZGVzdHJ1Y3Rpb24gb2YgPHRoZVN5c3RlbUV4ZWN1dGFibGU+CisJLy8gYWZ0ZXIgcnVubmluZzwgc3lzdGVtLT5vbkNyZWF0ZSgpID4gZHVlIHRvIG1ha2VXcml0YWJsZS4uLiBwcm9jZXNzICEKKwljb25zdCBSdW50aW1lSUQgJiB0aGVTeXN0ZW1SSUQgPSB0aGVJbml0aWFsRXhlY3V0aW9uRGF0YS0+Z2V0U3lzdGVtUklEKCk7CisKKwlFeGVjdXRhYmxlRm9ybSAqIHRoZVN5c3RlbUV4ZWN1dGFibGUgPSB0aGVTeXN0ZW1SSUQuZ2V0RXhlY3V0YWJsZSgpOworCisKKy8vISFbTUlHUkFUSU9OXTpNT05JVE9SIC0tPiBvbkNyZWF0ZSBSb3V0aW5lCisvLwl0aGVMb2FkZXIubG9hZEluaXRpYWxNb25pdG9yRGF0YSh0aGVJbml0aWFsRXhlY3V0aW9uRGF0YSwKKy8vCQkJdGhlU3lzdGVtUklELCBhbkV4ZWN1dGFibGVTeXN0ZW0ucmF3U3lzdGVtSW5zdGFuY2UoKSwgdHJ1ZSk7CisKK0FWTV9JRl9ERUJVR19GTEFHKCBMT0FESU5HICkKKwltQ29uZmlndXJhdGlvbi5zZXJpYWxpemVEZWJ1Z0V4ZWN1dGFibGUoICJsb2FkZWQiICk7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggTE9BRElORyApCisKKwkvKgorCSAqIFNldHRpbmcgdGhlIG1haW4gcHJvZ3JhbQorCSAqLworCXRoZUluaXRpYWxFeGVjdXRpb25EYXRhLT5zZXRPbkluaXQoIHRoZVN5c3RlbUV4ZWN1dGFibGUtPmdldE9uSW5pdCgpICk7CisKKwl0aGVJbml0aWFsRXhlY3V0aW9uRGF0YS0+c2V0T25TY2hlZHVsZSggdGhlU3lzdGVtRXhlY3V0YWJsZS0+Z2V0T25SdW4oKSApOworCisvLwlpZiggdGhlSW5pdGlhbEV4ZWN1dGlvbkRhdGEtPmdldE9uU2NoZWR1bGUoKS0+bm9uZW1wdHkoKQorLy8JCSYmIHRoZUluaXRpYWxFeGVjdXRpb25EYXRhLT5nZXRPblNjaGVkdWxlKCkKKy8vCQkJCS0+aXNPcENvZGUoIEFWTV9PUENPREVfU0NIRURVTEVfSU5WT0tFICkKKy8vCQkmJiB0aGVTeXN0ZW1FeGVjdXRhYmxlLT5pc01vY0tpbmRBbmQoKSApCisvLwl7CisvLwkJdGhlSW5pdGlhbEV4ZWN1dGlvbkRhdGEtPnNldE9uU2NoZWR1bGUoCisvLwkJCQl0aGVTeXN0ZW1FeGVjdXRhYmxlLT5nZXRPblNjaGVkdWxlKCkgKTsKKy8vCX0KKworCXRoZUluaXRpYWxFeGVjdXRpb25EYXRhLT5zZXRTeXN0ZW1SSUQoKTsKKworCXRoZUluaXRpYWxFeGVjdXRpb25EYXRhLT5zZXRSdW50aW1lRm9ybVN0YXRlKAorCQkJdGhlU3lzdGVtUklELCBQUk9DRVNTX1JVTk5JTkdfU1RBVEUgKTsKKworCXJldHVybiggdGhlSW5pdGlhbEV4ZWN1dGlvbkRhdGEgKTsKK30KKworCisKKworLyoqCisgKiBCVUlMREVSCisgKiBSZXBsYWNlIGEgcXVhbGlmaWVkIGVsZW1lbnQgYnkgaXRzIHJ1bnRpbWUncyBjb3VudGVycGFydAorICovCisKK0JGIEJ1aWxkZXI6OmNvbXBpbGVFeHByZXNzaW9uKGNvbnN0IEJGICYgYUNvZGUpCit7CisJcmV0dXJuKCBjb21waWxlRXhwcmVzc2lvbiggbUNvbmZpZ3VyYXRpb24uCisJCQlnZXRFeGVjdXRhYmxlU3lzdGVtKCkuZGVmYXVsdEV4ZWN1dGFibGVGb3JtKCksIGFDb2RlKSApOworfQorCitCRkNvZGUgQnVpbGRlcjo6Y29tcGlsZVN0YXRlbWVudChjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlyZXR1cm4oIGNvbXBpbGVTdGF0ZW1lbnQoIG1Db25maWd1cmF0aW9uLgorCQkJZ2V0RXhlY3V0YWJsZVN5c3RlbSgpLmRlZmF1bHRFeGVjdXRhYmxlRm9ybSgpLCBhQ29kZSkgKTsKK30KKworCisKK0JGIEJ1aWxkZXI6OnNlYXJjaFN5bWJvbEluc3RhbmNlKFRhYmxlT2ZTeW1ib2wgJiBhbGlhc1RhYmxlLAorCQljb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwgVW5pRm9ybUlkZW50aWZpZXIgKiBhblVGSSkKK3sKKwlzdGQ6Om9zdHJpbmdzdHJlYW0gb3NVRkk7CisKKwlzdGQ6OnN0cmluZyBhRnVsbHlRdWFsaWZpZWROYW1lSUQgPSBhblVGSS0+c3RyKCk7CisKKwl7CisJCWNvbnN0IEJGICYgZm91bmRJbnN0YW5jZSA9CisJCQkJYWxpYXNUYWJsZS5nZXRCeUZRTmFtZUlEKCBhRnVsbHlRdWFsaWZpZWROYW1lSUQgKTsKKwkJaWYoIGZvdW5kSW5zdGFuY2UudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRJbnN0YW5jZSApOworCQl9CisJfQorCisKKwlpZiggYW5FRC5oYXNMb2NhbFJ1bnRpbWVTdGFjaygpICkKKwl7CisJCVN0YWNrT2ZMb2NhbFJ1bnRpbWU6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgaXQgPQorCQkJCWFuRUQuZ2V0TG9jYWxSdW50aW1lcygpLT5yYmVnaW4oKTsKKwkJU3RhY2tPZkxvY2FsUnVudGltZTo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBpdEVuZCA9CisJCQkJYW5FRC5nZXRMb2NhbFJ1bnRpbWVzKCktPnJlbmQoKTsKKwkJZm9yKCAgOyBpdCAhPSBpdEVuZCA7ICsraXQgKQorCQl7CisJCQljb25zdCBCRiAmIGFuSW5zdGFuY2UgPSAoKml0KS5nZXRQcm9ncmFtKCktPmdldEFsbERhdGEoKS4KKwkJCQkJZ2V0QnlGUU5hbWVJRCggYUZ1bGx5UXVhbGlmaWVkTmFtZUlEICk7CisJCQlpZiggYW5JbnN0YW5jZS52YWxpZCgpICkKKwkJCXsKKwkJCQlyZXR1cm4oIGFuSW5zdGFuY2UgKTsKKwkJCX0KKwkJfQorCX0KKworCisJVW5pRm9ybUlkZW50aWZpZXI6Oml0ZXJhdG9yIGl0ID0gYW5VRkktPmJlZ2luKCk7CisJVW5pRm9ybUlkZW50aWZpZXI6Oml0ZXJhdG9yIGl0RW5kID0gYW5VRkktPmVuZCgpOworCisJLy8gcmVjaGVyY2hlIGRlIGxhIG1hY2hpbmUgUFJJTkNJUEFMRSAoUk9PVCkKKwlvc1VGSSA8PCAiaW5zdDo6IiA8PCAoKml0KS5zdHIoKTsKKworCWNvbnN0IFJ1bnRpbWVJRCAmIHRoZVN5c3RlbVJJRCA9IGFuRUQuZ2V0U3lzdGVtUklEKCk7CisJUnVudGltZUlEIHRoZU1hY2hpbmVJRCA9IHRoZVN5c3RlbVJJRDsKKworCWZvciggKytpdCA7IChpdCAhPSBpdEVuZCkgOyArK2l0ICkKKwl7CisJCWlmKCB0aGVNYWNoaW5lSUQuZ2V0SW5zdGFuY2UoKS0+ZnFuRXF1YWxzKCBvc1VGSS5zdHIoKSApICkKKwkJeworCQkJYnJlYWs7CisJCX0KKwkJb3NVRkkgPDwgIi4iIDw8ICgqaXQpLnN0cigpOworCX0KKworCWlmKCBpdCAhPSBpdEVuZCApCisJeworCQlWZWN0b3JPZkluc3RhbmNlT2ZNYWNoaW5lIGFsaWFzUGF0aDsKKworCQlSdW50aW1lSUQgcmlkID0gdGhlTWFjaGluZUlEOworCisJCS8vIGNvbW1lIGMnZXN0IGxhIHNwZWMgUklECisvLwkJYWxpYXNQYXRoLmFwcGVuZCggdGhlTWFjaGluZUlELmdldEluc3RhbmNlKCkgKTsKKworCQkvLyByZWNoZXJjaGUgZGUgbGEgbWFjaGluZSBGRVVJTExFCisJCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQpCisJCXsKKwkJCW9zVUZJIDw8ICIuIiA8PCAoKml0KS5zdHIoKTsKKwkJCXJpZCA9IGFuRUQuZ2V0UnVudGltZShyaWQpLmdldENoaWxkKCBvc1VGSS5zdHIoKSApOworCQkJaWYoIHJpZC52YWxpZCgpICkKKwkJCXsKKwkJCQl0aGVNYWNoaW5lSUQgPSByaWQ7CisJCQkJYWxpYXNQYXRoLmFwcGVuZCggdGhlTWFjaGluZUlELmdldEluc3RhbmNlKCkgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmKCAoaXQgPT0gaXRFbmQpICYmICh0aGVNYWNoaW5lSUQgPT0gdGhlU3lzdGVtUklEKSApCisJCXsKKwkJCS0taXQ7CisJCX0KKworCQlpZiggaXQgIT0gaXRFbmQgKQorCQl7CisJCQlFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZSA9IHRoZU1hY2hpbmVJRC5nZXRFeGVjdXRhYmxlKCk7CisJCQlvc1VGSS5zdHIoICIiICk7CisKKwkJCW9zVUZJIDw8ICJpbnN0OjoiICAgICAgLy8gd2l0aCBzdGQ6OnN0cmxlbiggImV4ZWM6OiIgKSAtLT4gNgorCQkJCQk8PCBhbkV4ZWN1dGFibGUtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkuc3Vic3RyKCA2ICk7CisKKwkJCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQpCisJCQl7CisJCQkJb3NVRkkgPDwgIi4iIDw8ICgqaXQpLnN0cigpOworCQkJfQorCisKKwkJCS8vIFRoZSBPUklHSU5BTCBJTlNUQU5DRQorCQkJQkYgYW5JbnN0YW5jZSA9IGFuRXhlY3V0YWJsZS0+Z2V0QWxsRGF0YSgpLmdldEJ5RlFOYW1lSUQoCisJCQkJCW9zVUZJLnN0cigpICk7CisKKwkJCWlmKCBhbkluc3RhbmNlLmludmFsaWQoKSApCisJCQl7CisJCQkJYW5JbnN0YW5jZSA9IGFuRXhlY3V0YWJsZS0+Z2V0Q29uc3REYXRhKCkuZ2V0QnlGUU5hbWVJRCgKKwkJCQkJCW9zVUZJLnN0cigpICk7CisJCQl9CisJCQlpZiggYW5JbnN0YW5jZS5pbnZhbGlkKCkgKQorCQkJeworCQkJCWFuSW5zdGFuY2UgPSBhbkV4ZWN1dGFibGUtPmdldFBvcnQoKS5nZXRCeUZRTmFtZUlEKAorCQkJCQkJb3NVRkkuc3RyKCkgKTsKKwkJCX0KKwkJCWlmKCBhbkluc3RhbmNlLmludmFsaWQoKSApCisJCQl7CisJCQkJYW5JbnN0YW5jZSA9IGFuRXhlY3V0YWJsZS0+Z2V0QnVmZmVyKCkuZ2V0QnlGUU5hbWVJRCgKKwkJCQkJCW9zVUZJLnN0cigpICk7CisJCQl9CisJCQlpZiggYW5JbnN0YW5jZS5pbnZhbGlkKCkgKQorCQkJeworCQkJCWFuSW5zdGFuY2UgPSBhbkV4ZWN1dGFibGUtPmdldENvbm5lY3QoKS5nZXRCeUZRTmFtZUlEKAorCQkJCQkJb3NVRkkuc3RyKCkgKTsKKwkJCX0KKworCQkJaWYoIGFuSW5zdGFuY2UudmFsaWQoKSApCisJCQl7CisKKy8vCQkJCUFWTV9PU19UUkFDRSA8PCBUQUIgPDwgIlNlYXJjaGluZyAiIDw8IGFuVUZJLT5zdHIoKSA8PCBzdGQ6OmVuZGwKKy8vCQkJCQkJPDwgVEFCIDw8ICJGb3VuZCAiIDw8IHN0ZDo6ZW5kbDsKKy8vCQkJCWFuSW5zdGFuY2UudG9TdHJlYW0oQVZNX09TX1RSQUNFIDw8IFRBQik7CisvLwkJCQlBVk1fT1NfVFJBQ0UgPDwgc3RkOjpmbHVzaDsKKworCQkJCWlmKCBhbGlhc1BhdGgubm9uZW1wdHkoKSApCisJCQkJeworCQkJCQlCYXNlSW5zdGFuY2VGb3JtICogbmV3SW5zdGFuY2UgPSBOVUxMOworCisJCQkJCXN3aXRjaCAoIGFuSW5zdGFuY2UuY2xhc3NLaW5kKCkgKQorCQkJCQl7CisJCQkJCQljYXNlIEZPUk1fSU5TVEFOQ0VfREFUQV9LSU5EOgorCQkJCQkJeworCQkJCQkJCW5ld0luc3RhbmNlID0gbmV3IEluc3RhbmNlT2ZEYXRhKAorCQkJCQkJCQkJdGhlU3lzdGVtUklELmdldEV4ZWN1dGFibGUoKSwKKwkJCQkJCQkJCWFuSW5zdGFuY2UudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCksCisJCQkJCQkJCQlhbGlhc1BhdGgpOworCQkJCQkJCW5ld0luc3RhbmNlLT5zZXRDcmVhdG9yQ29udGFpbmVyUklEKCB0aGVNYWNoaW5lSUQgKTsKKwkJCQkJCQluZXdJbnN0YW5jZS0+c2V0UnVudGltZUNvbnRhaW5lclJJRCggdGhlTWFjaGluZUlEICk7CisJCQkJCQkJYWxpYXNUYWJsZS5zYXZlKCBuZXdJbnN0YW5jZSApOworCisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisKKwkJCQkJCWNhc2UgRk9STV9JTlNUQU5DRV9NQUNISU5FX0tJTkQ6CisJCQkJCQl7CisJCQkJCQkJbmV3SW5zdGFuY2UgPSBuZXcgSW5zdGFuY2VPZk1hY2hpbmUoCisJCQkJCQkJCQl0aGVTeXN0ZW1SSUQuZ2V0RXhlY3V0YWJsZSgpLAorCQkJCQkJCQkJYW5JbnN0YW5jZS50b19wdHI8IEluc3RhbmNlT2ZNYWNoaW5lID4oKSwKKwkJCQkJCQkJCWFsaWFzUGF0aCk7CisJCQkJCQkJbmV3SW5zdGFuY2UtPnNldENyZWF0b3JDb250YWluZXJSSUQoIHRoZU1hY2hpbmVJRCApOworCQkJCQkJCW5ld0luc3RhbmNlLT5zZXRSdW50aW1lQ29udGFpbmVyUklEKCB0aGVNYWNoaW5lSUQgKTsKKworCQkJCQkJCXJldHVybiggYWxpYXNUYWJsZS5zYXZlKCBuZXdJbnN0YW5jZSApICk7CisJCQkJCQl9CisKKwkJCQkJCWNhc2UgRk9STV9JTlNUQU5DRV9QT1JUX0tJTkQ6CisJCQkJCQl7CisJCQkJCQkJbmV3SW5zdGFuY2UgPSBuZXcgSW5zdGFuY2VPZlBvcnQoCisJCQkJCQkJCQl0aGVTeXN0ZW1SSUQuZ2V0RXhlY3V0YWJsZSgpLAorCQkJCQkJCQkJYW5JbnN0YW5jZS50b19wdHI8IEluc3RhbmNlT2ZQb3J0ID4oKSwKKwkJCQkJCQkJCWFsaWFzUGF0aCk7CisJCQkJCQkJbmV3SW5zdGFuY2UtPnNldENyZWF0b3JDb250YWluZXJSSUQoIHRoZU1hY2hpbmVJRCApOworCQkJCQkJCW5ld0luc3RhbmNlLT5zZXRSdW50aW1lQ29udGFpbmVyUklEKCB0aGVNYWNoaW5lSUQgKTsKKworCQkJCQkJCXJldHVybiggYWxpYXNUYWJsZS5zYXZlKCBuZXdJbnN0YW5jZSApICk7CisJCQkJCQl9CisKKwkJCQkJCWNhc2UgRk9STV9JTlNUQU5DRV9CVUZGRVJfS0lORDoKKwkJCQkJCXsKKwkJCQkJCQluZXdJbnN0YW5jZSA9IG5ldyBJbnN0YW5jZU9mQnVmZmVyKAorCQkJCQkJCQkJdGhlU3lzdGVtUklELmdldEV4ZWN1dGFibGUoKSwKKwkJCQkJCQkJCWFuSW5zdGFuY2UudG9fcHRyPCBJbnN0YW5jZU9mQnVmZmVyID4oKSwKKwkJCQkJCQkJCWFsaWFzUGF0aCk7CisJCQkJCQkJbmV3SW5zdGFuY2UtPnNldENyZWF0b3JDb250YWluZXJSSUQoIHRoZU1hY2hpbmVJRCApOworCQkJCQkJCW5ld0luc3RhbmNlLT5zZXRSdW50aW1lQ29udGFpbmVyUklEKCB0aGVNYWNoaW5lSUQgKTsKKworCQkJCQkJCXJldHVybiggYWxpYXNUYWJsZS5zYXZlKCBuZXdJbnN0YW5jZSApICk7CisJCQkJCQl9CisKKwkJCQkJCWNhc2UgRk9STV9JTlNUQU5DRV9DT05ORUNUT1JfS0lORDoKKwkJCQkJCXsKKwkJCQkJCQluZXdJbnN0YW5jZSA9IG5ldyBJbnN0YW5jZU9mQ29ubmVjdCgKKwkJCQkJCQkJCXRoZVN5c3RlbVJJRC5nZXRFeGVjdXRhYmxlKCksCisJCQkJCQkJCQlhbkluc3RhbmNlLnRvX3B0cjwgSW5zdGFuY2VPZkNvbm5lY3QgPigpLAorCQkJCQkJCQkJYWxpYXNQYXRoKTsKKwkJCQkJCQluZXdJbnN0YW5jZS0+c2V0Q3JlYXRvckNvbnRhaW5lclJJRCggdGhlTWFjaGluZUlEICk7CisJCQkJCQkJbmV3SW5zdGFuY2UtPnNldFJ1bnRpbWVDb250YWluZXJSSUQoIHRoZU1hY2hpbmVJRCApOworCisJCQkJCQkJcmV0dXJuKCBhbGlhc1RhYmxlLnNhdmUoIG5ld0luc3RhbmNlICkgKTsKKwkJCQkJCX0KKworCQkJCQkJZGVmYXVsdCA6CisJCQkJCQl7CisJCQkJCQkJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJcmV0dXJuKCBhbkluc3RhbmNlICk7CisJCX0KKworCQllbHNlIGlmKCBhbGlhc1BhdGgubm9uZW1wdHkoKSApCisJCXsKKwkJCXJldHVybiggQkYoCXNlcDo6aW5jclJlZmVyZW5jZUNvdW50KGFsaWFzUGF0aC5sYXN0KCkpICkgKTsKKwkJfQorCisKKwkJZWxzZQorCQl7CisJCQlBVk1fT1NfRVhJVCggRkFJTEVEICkKKwkJCQkJPDwgIlVuZm91bmQgbGVhZiBtYWNoaW5lIDogIiA8PCBvc1VGSS5zdHIoKQorCQkJCQk8PCAiID4+IGNvbnRhaW5lciBvZiA8PCAiIDw8IGFGdWxseVF1YWxpZmllZE5hbWVJRAorCQkJCQk8PCAiID4+ICEhISIKKwkJCQkJPDwgU0VORF9FWElUOworCQl9CisJfQorCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKK30KKworCitjb25zdCBCRiAmIEJ1aWxkZXI6OnNlYXJjaFN5bWJvbEluc3RhbmNlKFRhYmxlT2ZTeW1ib2wgJiBhbGlhc1RhYmxlLAorCQljb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwgY29uc3QgT2JqZWN0RWxlbWVudCAqIGFzdEVsZW1lbnQpCit7CisJeworCQljb25zdCBCRiAmIGZvdW5kSW5zdGFuY2UgPSBhbGlhc1RhYmxlLmdldEJ5QXN0RWxlbWVudChhc3RFbGVtZW50KTsKKwkJaWYoIGZvdW5kSW5zdGFuY2UudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRJbnN0YW5jZSApOworCQl9CisJfQorCisJaWYoIGFuRUQuaGFzTG9jYWxSdW50aW1lU3RhY2soKSApCisJeworCQlTdGFja09mTG9jYWxSdW50aW1lOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGl0ID0KKwkJCQlhbkVELmdldExvY2FsUnVudGltZXMoKS0+cmJlZ2luKCk7CisJCVN0YWNrT2ZMb2NhbFJ1bnRpbWU6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgaXRFbmQgPQorCQkJCWFuRUQuZ2V0TG9jYWxSdW50aW1lcygpLT5yZW5kKCk7CisJCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQorCQl7CisJCQljb25zdCBCRiAmIGFuSW5zdGFuY2UgPQorCQkJCQkoKml0KS5nZXRQcm9ncmFtKCktPmdldEFsbERhdGEoKS5nZXRCeUFzdEVsZW1lbnQoYXN0RWxlbWVudCk7CisJCQlpZiggYW5JbnN0YW5jZS52YWxpZCgpICkKKwkJCXsKKwkJCQlyZXR1cm4oIGFuSW5zdGFuY2UgKTsKKwkJCX0KKwkJfQorCX0KKworCXsKKwkJRXhlY3V0YWJsZVF1ZXJ5IFhRdWVyeSggbUNvbmZpZ3VyYXRpb24gKTsKKworCQljb25zdCBCRiAmIGZvdW5kSW5zdGFuY2UgPSBYUXVlcnkuZ2V0SW5zdGFuY2VCeUFzdEVsZW1lbnQoYXN0RWxlbWVudCk7CisKKwkJcmV0dXJuKCBmb3VuZEluc3RhbmNlICk7CisJfQorfQorCisKK2NvbnN0IEJGICYgQnVpbGRlcjo6c2VhcmNoU3ltYm9sSW5zdGFuY2UoVGFibGVPZlN5bWJvbCAmIGFsaWFzVGFibGUsCisJCWNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVELCBjb25zdCBCRiAmIGFCYXNlSW5zdGFuY2UpCit7CisJaWYoIGFsaWFzVGFibGUuY29udGFpbnMoYUJhc2VJbnN0YW5jZSkgKQorCXsKKwkJcmV0dXJuKCBhQmFzZUluc3RhbmNlICk7CisJfQorCisJaWYoIGFuRUQuaGFzTG9jYWxSdW50aW1lU3RhY2soKSApCisJeworCQlTdGFja09mTG9jYWxSdW50aW1lOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGl0ID0KKwkJCQlhbkVELmdldExvY2FsUnVudGltZXMoKS0+cmJlZ2luKCk7CisJCVN0YWNrT2ZMb2NhbFJ1bnRpbWU6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgaXRFbmQgPQorCQkJCWFuRUQuZ2V0TG9jYWxSdW50aW1lcygpLT5yZW5kKCk7CisJCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQorCQl7CisJCQlpZiggKCppdCkuZ2V0UHJvZ3JhbSgpLT5jb250YWluc0RhdGEoIGFCYXNlSW5zdGFuY2UgKSApCisJCQl7CisJCQkJcmV0dXJuKCBhQmFzZUluc3RhbmNlICk7CisJCQl9CisJCX0KKwl9CisKKwljb25zdCBSdW50aW1lSUQgJiB0aGVTeXN0ZW1SSUQgPSBhbkVELmdldFN5c3RlbVJJRCgpOworCisJVmVjdG9yT2ZJbnN0YW5jZU9mTWFjaGluZSBhbGlhc1BhdGg7CisKKwlUYWJsZU9mUnVudGltZVQ6OmNvbnN0X2l0ZXJhdG9yIGl0UkYgPSBhbkVELmdldFRhYmxlT2ZSdW50aW1lKCkuYmVnaW4oKTsKKwlUYWJsZU9mUnVudGltZVQ6OmNvbnN0X2l0ZXJhdG9yIGVuZFJGID0gYW5FRC5nZXRUYWJsZU9mUnVudGltZSgpLmVuZCgpOworCWZvciggUnVudGltZUlEIGl0UklEIDsgaXRSRiAhPSBlbmRSRiA7ICsraXRSRikKKwl7CisJCWl0UklEID0gKCppdFJGKS0+Z2V0UklEKCk7CisKKwkJc3dpdGNoKCBhQmFzZUluc3RhbmNlLmNsYXNzS2luZCgpICkKKwkJeworCQkJY2FzZSBGT1JNX0lOU1RBTkNFX0RBVEFfS0lORDoKKwkJCXsKKwkJCQlpZiggaXRSSUQuZ2V0RXhlY3V0YWJsZSgpLT5jb250YWluc0RhdGEoCisJCQkJCQlhQmFzZUluc3RhbmNlLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpICkgKQorCQkJCXsKKwkJCQkJYWxpYXNQYXRoLmFwcGVuZCggaXRSSUQuZ2V0SW5zdGFuY2UoKSApOworCisJCQkJCUluc3RhbmNlT2ZEYXRhICogbmV3SW5zdGFuY2UgPSBuZXcgSW5zdGFuY2VPZkRhdGEoCisJCQkJCQkJdGhlU3lzdGVtUklELmdldEV4ZWN1dGFibGUoKSwKKwkJCQkJCQlhQmFzZUluc3RhbmNlLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpLCBhbGlhc1BhdGgpOworCQkJCQluZXdJbnN0YW5jZS0+c2V0Q3JlYXRvckNvbnRhaW5lclJJRCggaXRSSUQgKTsKKwkJCQkJbmV3SW5zdGFuY2UtPnNldFJ1bnRpbWVDb250YWluZXJSSUQoIGl0UklEICk7CisKKwkJCQkJYWxpYXNUYWJsZS5zYXZlKCBuZXdJbnN0YW5jZSApOworCQkJCX0KKworCQkJCWJyZWFrOworCQkJfQorCisJCQljYXNlIEZPUk1fSU5TVEFOQ0VfTUFDSElORV9LSU5EOgorCQkJeworCQkJCWlmKCBpdFJJRC5nZXRFeGVjdXRhYmxlKCktPgorCQkJCQkJZ2V0SW5zdGFuY2VTdGF0aWMoKS5jb250YWlucyhhQmFzZUluc3RhbmNlKSApCisJCQkJeworCQkJCQlhbGlhc1BhdGguYXBwZW5kKCBpdFJJRC5nZXRJbnN0YW5jZSgpICk7CisKKwkJCQkJSW5zdGFuY2VPZk1hY2hpbmUgKiBuZXdJbnN0YW5jZSA9IG5ldyBJbnN0YW5jZU9mTWFjaGluZSgKKwkJCQkJCQl0aGVTeXN0ZW1SSUQuZ2V0RXhlY3V0YWJsZSgpLAorCQkJCQkJCWFCYXNlSW5zdGFuY2UudG9fcHRyPCBJbnN0YW5jZU9mTWFjaGluZSA+KCksCisJCQkJCQkJYWxpYXNQYXRoICk7CisJCQkJCW5ld0luc3RhbmNlLT5zZXRDcmVhdG9yQ29udGFpbmVyUklEKCBpdFJJRCApOworCQkJCQluZXdJbnN0YW5jZS0+c2V0UnVudGltZUNvbnRhaW5lclJJRCggaXRSSUQgKTsKKworCQkJCQlhbGlhc1RhYmxlLnNhdmUoIG5ld0luc3RhbmNlICk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCQljYXNlIEZPUk1fSU5TVEFOQ0VfUE9SVF9LSU5EOgorCQkJeworCQkJCWlmKCBpdFJJRC5nZXRFeGVjdXRhYmxlKCktPmdldFBvcnQoKS5jb250YWlucyhhQmFzZUluc3RhbmNlKSApCisJCQkJeworCQkJCQlhbGlhc1BhdGguYXBwZW5kKCBpdFJJRC5nZXRJbnN0YW5jZSgpICk7CisKKwkJCQkJSW5zdGFuY2VPZlBvcnQgKiBuZXdJbnN0YW5jZSA9IG5ldyBJbnN0YW5jZU9mUG9ydCgKKwkJCQkJCQl0aGVTeXN0ZW1SSUQuZ2V0RXhlY3V0YWJsZSgpLAorCQkJCQkJCWFCYXNlSW5zdGFuY2UudG9fcHRyPCBJbnN0YW5jZU9mUG9ydCA+KCksIGFsaWFzUGF0aCk7CisJCQkJCW5ld0luc3RhbmNlLT5zZXRDcmVhdG9yQ29udGFpbmVyUklEKCBpdFJJRCApOworCQkJCQluZXdJbnN0YW5jZS0+c2V0UnVudGltZUNvbnRhaW5lclJJRCggaXRSSUQgKTsKKworCQkJCQlhbGlhc1RhYmxlLnNhdmUoIG5ld0luc3RhbmNlICk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCQljYXNlIEZPUk1fSU5TVEFOQ0VfQlVGRkVSX0tJTkQ6CisJCQl7CisJCQkJSW5zdGFuY2VPZkJ1ZmZlciAqIGJ1ZmZlckluc3RhbmNlID0KKwkJCQkJCWFCYXNlSW5zdGFuY2UudG9fcHRyPCBJbnN0YW5jZU9mQnVmZmVyID4oKTsKKworCQkJCWlmKCBpdFJJRC5nZXRFeGVjdXRhYmxlKCktPmdldEJ1ZmZlcigpLmNvbnRhaW5zKGJ1ZmZlckluc3RhbmNlKSApCisJCQkJeworCQkJCQlhbGlhc1BhdGguYXBwZW5kKCBpdFJJRC5nZXRJbnN0YW5jZSgpICk7CisKKwkJCQkJSW5zdGFuY2VPZkJ1ZmZlciAqIG5ld0luc3RhbmNlID0gbmV3IEluc3RhbmNlT2ZCdWZmZXIoCisJCQkJCQkJdGhlU3lzdGVtUklELmdldEV4ZWN1dGFibGUoKSwKKwkJCQkJCQlidWZmZXJJbnN0YW5jZSwgYWxpYXNQYXRoICk7CisJCQkJCW5ld0luc3RhbmNlLT5zZXRDcmVhdG9yQ29udGFpbmVyUklEKCBpdFJJRCApOworCQkJCQluZXdJbnN0YW5jZS0+c2V0UnVudGltZUNvbnRhaW5lclJJRCggaXRSSUQgKTsKKworCQkJCQlhbGlhc1RhYmxlLnNhdmUoIG5ld0luc3RhbmNlICk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCQljYXNlIEZPUk1fSU5TVEFOQ0VfQ09OTkVDVE9SX0tJTkQ6CisJCQl7CisJCQkJSW5zdGFuY2VPZkNvbm5lY3QgKiBjb25uZWN0SW5zdGFuY2UgPQorCQkJCQkJYUJhc2VJbnN0YW5jZS50b19wdHI8IEluc3RhbmNlT2ZDb25uZWN0ID4oKTsKKworCQkJCWlmKCBpdFJJRC5nZXRFeGVjdXRhYmxlKCktPmdldENvbm5lY3QoKS5jb250YWlucyhjb25uZWN0SW5zdGFuY2UpICkKKwkJCQl7CisJCQkJCWFsaWFzUGF0aC5hcHBlbmQoIGl0UklELmdldEluc3RhbmNlKCkgKTsKKworCQkJCQlJbnN0YW5jZU9mQ29ubmVjdCAqIG5ld0luc3RhbmNlID0gbmV3IEluc3RhbmNlT2ZDb25uZWN0KAorCQkJCQkJCXRoZVN5c3RlbVJJRC5nZXRFeGVjdXRhYmxlKCksCisJCQkJCQkJY29ubmVjdEluc3RhbmNlLCBhbGlhc1BhdGggKTsKKwkJCQkJbmV3SW5zdGFuY2UtPnNldENyZWF0b3JDb250YWluZXJSSUQoIGl0UklEICk7CisJCQkJCW5ld0luc3RhbmNlLT5zZXRSdW50aW1lQ29udGFpbmVyUklEKCBpdFJJRCApOworCisJCQkJCWFsaWFzVGFibGUuc2F2ZSggbmV3SW5zdGFuY2UgKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWRlZmF1bHQgOgorCQkJeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuKCBhQmFzZUluc3RhbmNlICk7Cit9CisKKworCitCRiBCdWlsZGVyOjpidWlsZChUYWJsZU9mU3ltYm9sICYgYWxpYXNUYWJsZSwKKwkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQsIGNvbnN0IEF2bVByb2dyYW0gJiBhUHJvZ3JhbSwgY29uc3QgQkYgJiBhQ29kZSkKK3sKKwlpZiggYVByb2dyYW0uaGFzRGF0YSgpICkKKwl7CisJCWJvb2wgZGVzdHJveUxvY2FsUnVudGltZVN0YWNrRmxhZyA9IGZhbHNlOworCisJCUV4ZWN1dGlvbkRhdGEgY2xvbmVFRCggYW5FRCApOworCisJCWlmKCBub3QgY2xvbmVFRC5oYXNMb2NhbFJ1bnRpbWVTdGFjaygpICkKKwkJeworCQkJZGVzdHJveUxvY2FsUnVudGltZVN0YWNrRmxhZyA9IHRydWU7CisJCQljbG9uZUVELmNyZWF0ZUxvY2FsUnVudGltZVN0YWNrKCk7CisJCX0KKwkJY2xvbmVFRC5nZXRMb2NhbFJ1bnRpbWVzKCktPnB1c2goIExvY2FsUnVudGltZShhUHJvZ3JhbSkgKTsKKworCQlCRiBidWlsZENvZGUgPSBidWlsZChhbGlhc1RhYmxlLCBjbG9uZUVELCBhQ29kZSk7CisKKwkJY2xvbmVFRC5nZXRMb2NhbFJ1bnRpbWVzKCktPnBvcCgpOworCQlpZiggZGVzdHJveUxvY2FsUnVudGltZVN0YWNrRmxhZyApCisJCXsKKwkJCWNsb25lRUQuZGVzdHJveUxvY2FsUnVudGltZVN0YWNrKCk7CisJCX0KKworCisJCXJldHVybiggYnVpbGRDb2RlICk7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiggYnVpbGQoYWxpYXNUYWJsZSwgYW5FRCwgYUNvZGUpICk7CisJfQorfQorCisKK0JGIEJ1aWxkZXI6OmJ1aWxkKGNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVELCBjb25zdCBCRiAmIGFDb2RlKQoreworCVRhYmxlT2ZTeW1ib2wgYWxpYXNUYWJsZTsKKworCUJGIGJ1aWxkQ29kZSA9IGJ1aWxkKGFsaWFzVGFibGUsIGFuRUQsIGFDb2RlKTsKKworCWFsaWFzVGFibGUuY2xlYXIoKTsKKworCXJldHVybiggYnVpbGRDb2RlICk7Cit9CisKKworQkYgQnVpbGRlcjo6YnVpbGQoVGFibGVPZlN5bWJvbCAmIGFsaWFzVGFibGUsCisJCWNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVELCBjb25zdCBCRiAmIGFDb2RlKQoreworCUJGIGNvbXBpbGVDb2RlID0gY29tcGlsZShhbGlhc1RhYmxlLCBhbkVELCBhQ29kZSk7CisJaWYoIGNvbXBpbGVDb2RlLmlzPCBBdm1Db2RlID4oKSApCisJeworCQljb21waWxlQ29kZSA9IG1Bdm1jb2RlQ29tcGlsZXIub3B0aW1pemVFeHByZXNzaW9uKAorCQkJCW1Db25maWd1cmF0aW9uLmdldEV4ZWN1dGFibGVTeXN0ZW0oKS5yYXdTeXN0ZW1JbnN0YW5jZSgpCisJCQkJCQktPmdldEV4ZWN1dGFibGUoKSwgY29tcGlsZUNvZGUuYmZDb2RlKCkpOworCX0KKworCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdFeHByKCBjb21waWxlQ29kZSApICk7Cit9CisKKworQkYgQnVpbGRlcjo6Y29tcGlsZShUYWJsZU9mU3ltYm9sICYgYWxpYXNUYWJsZSwKKwkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQsIGNvbnN0IEJGICYgYUNvZGUpCit7CisJc3dpdGNoKCBhQ29kZS5jbGFzc0tpbmQoKSApCisJeworCQljYXNlIEZPUk1fQVZNQ09ERV9LSU5EOgorCQl7CisJCQlCRkNvZGUgYW5Bdm1Db2RlID0gYUNvZGUuYmZDb2RlKCk7CisJCQlPcGVyYXRvciAqIG1haW5PcGVyYXRvciA9IGFuQXZtQ29kZS0+Z2V0T3BlcmF0b3IoKTsKKworCQkJQkZDb2RlIG5ld0NvZGUoIG1haW5PcGVyYXRvciApOworCisJCQlBdm1Db2RlOjppdGVyYXRvciBpdEFyZyA9IGFuQXZtQ29kZS0+YmVnaW4oKTsKKwkJCUF2bUNvZGU6Oml0ZXJhdG9yIGl0RW5kQXJnID0gYW5Bdm1Db2RlLT5lbmQoKTsKKwkJCWZvciggOyBpdEFyZyAhPSBpdEVuZEFyZyA7ICsraXRBcmcgKQorCQkJeworCQkJCXN3aXRjaCggKCppdEFyZykuY2xhc3NLaW5kKCkgKQorCQkJCXsKKwkJCQkJY2FzZSBGT1JNX0FWTUNPREVfS0lORDoKKwkJCQkJeworCQkJCQkJQkYgYmYgPSBjb21waWxlKGFsaWFzVGFibGUsIGFuRUQsICppdEFyZyk7CisKKwkJCQkJCWlmKCBiZi5pczwgQXZtQ29kZSA+KCkgKQorCQkJCQkJeworCQkJCQkJCWFuQXZtQ29kZSA9IGJmLmJmQ29kZSgpOworCQkJCQkJCWlmKCBhbkF2bUNvZGUtPmlzT3BDb2RlKCBtYWluT3BlcmF0b3IgKSAmJgorCQkJCQkJCQltYWluT3BlcmF0b3ItPmlzQXNzb2NpYXRpdmUoKSApCisJCQkJCQkJeworCQkJCQkJCQluZXdDb2RlLT5hcHBlbmQoIGFuQXZtQ29kZS0+Z2V0QXJncygpICk7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCW5ld0NvZGUtPmFwcGVuZCggYmYgKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJbmV3Q29kZS0+YXBwZW5kKCBiZiApOworCQkJCQkJfQorCisJCQkJCQlicmVhazsKKwkJCQkJfQorCisKKwkJCQkJZGVmYXVsdDoKKwkJCQkJeworCQkJCQkJbmV3Q29kZS0+YXBwZW5kKCBjb21waWxlKGFsaWFzVGFibGUsIGFuRUQsICppdEFyZykgKTsKKworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisKKwkJCX0KKworCQkJcmV0dXJuKCBuZXdDb2RlICk7CisJCX0KKworCisJCWNhc2UgRk9STV9VRklfS0lORDoKKwkJeworCQkJQkYgYW5JbnN0YW5jZSA9IHNlYXJjaFN5bWJvbEluc3RhbmNlKGFsaWFzVGFibGUsCisJCQkJCWFuRUQsIGFDb2RlLnRvX3B0cjwgVW5pRm9ybUlkZW50aWZpZXI+KCkpOworCQkJaWYoIGFuSW5zdGFuY2UudmFsaWQoKSApCisJCQl7CisJCQkJaWYoIGFuSW5zdGFuY2UuaXM8IEluc3RhbmNlT2ZEYXRhID4oKSApCisJCQkJeworCQkJCQlJbnN0YW5jZU9mRGF0YSAqIGFEYXRhID0gYW5JbnN0YW5jZS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKTsKKwkJCQkJaWYoIGFEYXRhLT5nZXRNb2RpZmllcigpLmhhc0ZlYXR1cmVGaW5hbCgpICYmIGFEYXRhLT5oYXNWYWx1ZSgpICkKKwkJCQkJeworCQkJCQkJcmV0dXJuKCBhRGF0YS0+Z2V0VmFsdWUoKSApOworCQkJCQl9CisJCQkJfQorCisJCQkJcmV0dXJuKCBhbkluc3RhbmNlICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJRXhlY3V0YWJsZVF1ZXJ5IFhRdWVyeSggbUNvbmZpZ3VyYXRpb24gKTsKKworCQkJCWNvbnN0IEJGICYgYVByb2dyYW0gPSBYUXVlcnkuZ2V0RXhlY3V0YWJsZU9yUHJvZ3JhbShhQ29kZS5zdHIoKSk7CisJCQkJaWYoIGFQcm9ncmFtLnZhbGlkKCkgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCBhUHJvZ3JhbSApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlBVk1fT1NfRVhJVCggRkFJTEVEICkKKwkJCQkJCQk8PCAiVW5mb3VuZCBVRkkgc3ltYm9sIDogIiA8PCBhQ29kZS5zdHIoKQorCQkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCQlyZXR1cm4oIGFDb2RlICk7CisJCQkJfQorCQkJfQorCisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgRk9STV9YRlNQX0JVRkZFUl9LSU5EOgorCQljYXNlIEZPUk1fWEZTUF9DSEFOTkVMX0tJTkQ6CisJCWNhc2UgRk9STV9YRlNQX0NPTk5FQ1RPUl9LSU5EOgorCQljYXNlIEZPUk1fWEZTUF9NQUNISU5FX0tJTkQ6CisJCWNhc2UgRk9STV9YRlNQX1BPUlRfS0lORDoKKwkJY2FzZSBGT1JNX1hGU1BfUk9VVElORV9LSU5EOgorCQljYXNlIEZPUk1fWEZTUF9TWVNURU1fS0lORDoKKwkJY2FzZSBGT1JNX1hGU1BfVFJBTlNJVElPTl9LSU5EOgorCQljYXNlIEZPUk1fWEZTUF9EQVRBVFlQRV9LSU5EOgorCQljYXNlIEZPUk1fWEZTUF9WQVJJQUJMRV9LSU5EOgorCQl7CisJCQljb25zdCBCRiAmIGFuSW5zdGFuY2UgPSBzZWFyY2hTeW1ib2xJbnN0YW5jZSgKKwkJCQkJYWxpYXNUYWJsZSwgYW5FRCwgYUNvZGUudG9fcHRyPCBPYmplY3RFbGVtZW50ID4oKSApOworCQkJaWYoIGFuSW5zdGFuY2UudmFsaWQoKSApCisJCQl7CisJCQkJaWYoIGFuSW5zdGFuY2UuaXM8IEluc3RhbmNlT2ZEYXRhID4oKSApCisJCQkJeworCQkJCQlJbnN0YW5jZU9mRGF0YSAqIGFEYXRhID0gYW5JbnN0YW5jZS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKTsKKwkJCQkJaWYoIGFEYXRhLT5nZXRNb2RpZmllcigpLmhhc0ZlYXR1cmVGaW5hbCgpICYmIGFEYXRhLT5oYXNWYWx1ZSgpICkKKwkJCQkJeworCQkJCQkJcmV0dXJuKCBhRGF0YS0+Z2V0VmFsdWUoKSApOworCQkJCQl9CisJCQkJfQorCisJCQkJcmV0dXJuKCBhbkluc3RhbmNlICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJRXhlY3V0YWJsZVF1ZXJ5IFhRdWVyeSggbUNvbmZpZ3VyYXRpb24gKTsKKworCQkJCWNvbnN0IEJGICYgYVByb2dyYW0gPSBYUXVlcnkuZ2V0RXhlY3V0YWJsZU9yUHJvZ3JhbSgKKwkJCQkJCWFDb2RlLnRvX3B0cjwgT2JqZWN0RWxlbWVudCA+KCkgKTsKKwkJCQlpZiggYVByb2dyYW0udmFsaWQoKSApCisJCQkJeworCQkJCQlyZXR1cm4oIGFQcm9ncmFtICk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUFWTV9PU19FWElUKCBGQUlMRUQgKQorCQkJCQkJCTw8ICJVbmZvdW5kIEZPUk0gc3ltYm9sIDogIiA8PCBhQ29kZS5zdHIoKQorCQkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCQlyZXR1cm4oIGFDb2RlICk7CisJCQkJfQorCQkJfQorCisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgRk9STV9PUEVSQVRPUl9LSU5EOgorCQl7CisJCQlyZXR1cm4oIGFDb2RlICk7CisJCX0KKworCQljYXNlIEZPUk1fSU5TVEFOQ0VfREFUQV9LSU5EOgorCQl7CisJCQljb25zdCBCRiAmIGFuSW5zdGFuY2UgPSBzZWFyY2hTeW1ib2xJbnN0YW5jZShhbGlhc1RhYmxlLCBhbkVELCBhQ29kZSk7CisJCQlpZiggYW5JbnN0YW5jZS52YWxpZCgpICkKKwkJCXsKKwkJCQlpZiggYW5JbnN0YW5jZS5pczwgSW5zdGFuY2VPZkRhdGEgPigpICkKKwkJCQl7CisJCQkJCUluc3RhbmNlT2ZEYXRhICogYURhdGEgPSBhbkluc3RhbmNlLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpOworCQkJCQlpZiggYURhdGEtPmdldE1vZGlmaWVyKCkuaGFzRmVhdHVyZUZpbmFsKCkgJiYgYURhdGEtPmhhc1ZhbHVlKCkgKQorCQkJCQl7CisJCQkJCQlyZXR1cm4oIGFEYXRhLT5nZXRWYWx1ZSgpICk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlyZXR1cm4oIGFuSW5zdGFuY2UgKTsKKwkJCX0KKworCQkJcmV0dXJuKCBhQ29kZSApOworCQl9CisKKwkJY2FzZSBGT1JNX0lOU1RBTkNFX0JVRkZFUl9LSU5EOgorCQljYXNlIEZPUk1fSU5TVEFOQ0VfQ09OTkVDVE9SX0tJTkQ6CisJCWNhc2UgRk9STV9JTlNUQU5DRV9NQUNISU5FX0tJTkQ6CisJCWNhc2UgRk9STV9JTlNUQU5DRV9QT1JUX0tJTkQ6CisJCXsKKwkJCUJGIGFuSW5zdGFuY2UgPSBzZWFyY2hTeW1ib2xJbnN0YW5jZShhbGlhc1RhYmxlLCBhbkVELCBhQ29kZSk7CisJCQlpZiggYW5JbnN0YW5jZS52YWxpZCgpICkKKwkJCXsKKwkJCQkvLyBBVk1fT1NfVFJBQ0UgPDwgIiAtLT4gYk9LIiA8PCBzdGQ6OmVuZGw7CisKKwkJCQlyZXR1cm4oIGFuSW5zdGFuY2UgKTsKKwkJCX0KKworCQkJcmV0dXJuKCBhQ29kZSApOworCQl9CisKKwkJY2FzZSBGT1JNX1JVTlRJTUVfSURfS0lORDoKKwkJeworCQkJcmV0dXJuKCBhQ29kZSApOworCQl9CisKKworCQkvL0BkZXByZWNhdGVkCisJCS8vY2FzZSBGT1JNX0VYUFJFU1NJT05fR0lOQUNfS0lORDoKKworCQljYXNlIEZPUk1fQlVJTFRJTl9CT09MRUFOX0tJTkQ6CisJCWNhc2UgRk9STV9CVUlMVElOX0NIQVJBQ1RFUl9LSU5EOgorCQljYXNlIEZPUk1fQlVJTFRJTl9JTlRFR0VSX0tJTkQ6CisJCWNhc2UgRk9STV9CVUlMVElOX1JBVElPTkFMX0tJTkQ6CisJCWNhc2UgRk9STV9CVUlMVElOX0ZMT0FUX0tJTkQ6CisJCWNhc2UgRk9STV9CVUlMVElOX1NUUklOR19LSU5EOgorCQljYXNlIEZPUk1fQlVJTFRJTl9JREVOVElGSUVSX0tJTkQ6CisJCWNhc2UgRk9STV9CVUlMVElOX1FVQUxJRklFRF9JREVOVElGSUVSX0tJTkQ6CisJCXsKKwkJCXJldHVybiggYUNvZGUgKTsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCUFWTV9PU19FWElUKCBGQUlMRUQgKQorCQkJCQk8PCAiVW5leHBlY3RlZCBGT1JNIEtJTkQgZm9yIGNvbXBpbGVBdm1Db2RlXG4iCisJCQkJCTw8IGFDb2RlLnRvU3RyaW5nKCkKKwkJCQkJPDwgU0VORF9FWElUOworCisJCQlyZXR1cm4oIGFDb2RlICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCit9CisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9CdWlsZGVyLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL0J1aWxkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmE2YmJkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9CdWlsZGVyLmgKQEAgLTAsMCArMSwyMjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgQlVJTERFUl9IXworI2RlZmluZSBCVUlMREVSX0hfCisKKyNpbmNsdWRlIDxjb21wdXRlci9FdmFsdWF0aW9uRW52aXJvbm1lbnQuaD4KKworI2luY2x1ZGUgPGJ1aWxkZXIvY29tcGlsZXIvQmFzZUNvbXBpbGVyVGFibGUuaD4KKworI2luY2x1ZGUgPGJ1aWxkZXIvY29tcGlsZXIvQ29tcGlsZXIuaD4KKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVTeXN0ZW0uaD4KKworI2luY2x1ZGUgPGZtbC9zeW1ib2wvVGFibGVPZlN5bWJvbC5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworY2xhc3MgQXZtQ29kZTsKK2NsYXNzIEF2bWNvZGVDb21waWxlcjsKK2NsYXNzIEF2bVByaW1pdGl2ZVByb2Nlc3NvcjsKK2NsYXNzIEF2bVByb2dyYW07CisKK2NsYXNzIENvbmZpZ3VyYXRpb247CisKK2NsYXNzIEV4ZWN1dGlvbkRhdGE7CitjbGFzcyBFeGVjdXRhYmxlU3lzdGVtOworCitjbGFzcyBPYmplY3RFbGVtZW50OworCitjbGFzcyBTeW1iZXhFbmdpbmU7CisKK2NsYXNzIFVuaUZvcm1JZGVudGlmaWVyOworCisKKworY2xhc3MgQnVpbGRlcgoreworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQVRUUklCVVRFCisJICovCisJU3ltYmV4RW5naW5lICYgbVN5bWJleEVuZ2luZTsKKworCUNvbmZpZ3VyYXRpb24gJiBtQ29uZmlndXJhdGlvbjsKKworCUV2YWx1YXRpb25FbnZpcm9ubWVudCBFTlY7CisKKwlCYXNlQ29tcGlsZXJUYWJsZSBtQmFzZUNvbXBpbGVyVGFibGU7CisKKwlBdm1jb2RlQ29tcGlsZXIgbUF2bWNvZGVDb21waWxlcjsKKworCUNvbXBpbGVyIG1Db21waWxlcjsKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUJ1aWxkZXIoU3ltYmV4RW5naW5lICYgYVN5bWJleEVuZ2luZSwgQ29uZmlndXJhdGlvbiAmIGFDb25maWd1cmF0aW9uLAorCQkJQXZtUHJpbWl0aXZlUHJvY2Vzc29yICYgYVByaW1pdGl2ZVByb2Nlc3NvcikKKwk6IG1TeW1iZXhFbmdpbmUoIGFTeW1iZXhFbmdpbmUgKSwKKwltQ29uZmlndXJhdGlvbiggYUNvbmZpZ3VyYXRpb24gKSwKKwlFTlYoIGFQcmltaXRpdmVQcm9jZXNzb3IgKSwKKwltQmFzZUNvbXBpbGVyVGFibGUoIGFDb25maWd1cmF0aW9uICksCisJbUF2bWNvZGVDb21waWxlciggYUNvbmZpZ3VyYXRpb24gLCBtQmFzZUNvbXBpbGVyVGFibGUgKSwKKwltQ29tcGlsZXIoIGFDb25maWd1cmF0aW9uICwgbUF2bWNvZGVDb21waWxlciApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+QnVpbGRlcigpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIExPQURFUiAtIERJU1BPU0VSCisJICovCisJc3RhdGljIHZvaWQgbG9hZCgpOworCXN0YXRpYyB2b2lkIGRpc3Bvc2UoKTsKKworCisJLyoqCisJICogQ09ORklHVVJFCisJICovCisJYm9vbCBjb25maWd1cmUoKTsKKworCisJLyoqCisJICogR0VUVEVSCisJICogbUNvbmZpZ3VyYXRpb24KKwkgKiBtQXZtY29kZUNvbXBpbGVyCisJICogbUNvbXBpbGVyCisJICovCisJaW5saW5lIENvbmZpZ3VyYXRpb24gJiBnZXRDb25maWd1cmF0aW9uKCkKKwl7CisJCXJldHVybiggbUNvbmZpZ3VyYXRpb24gKTsKKwl9CisKKwlpbmxpbmUgQXZtY29kZUNvbXBpbGVyICYgZ2V0QXZtY29kZUNvbXBpbGVyKCkKKwl7CisJCXJldHVybiggbUF2bWNvZGVDb21waWxlciApOworCX0KKworCWlubGluZSBDb21waWxlciAmIGdldENvbXBpbGVyKCkKKwl7CisJCXJldHVybiggbUNvbXBpbGVyICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBDb21waWxlciBFcnJvciAvIFdhcm5pbmcgY291bnQKKwkgKi8KKwlpbmxpbmUgYm9vbCBoYXNFcnJvcigpCisJeworCQlyZXR1cm4oIG1Db21waWxlci5oYXNFcnJvcigpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzV2FybmluZygpCisJeworCQlyZXR1cm4oIG1Db21waWxlci5oYXNXYXJuaW5nKCkgKTsKKwl9CisKKworCWlubGluZSB2b2lkIHJlc2V0RXJyb3JXYXJuaW5nKCkKKwl7CisJCW1Db21waWxlci5yZXNldEVycm9yV2FybmluZygpOworCX0KKworCisJLyoqCisJICogU1RBUlQKKwkgKi8KKwlib29sIHN0YXJ0KCk7CisKKwkvKgorCSAqIEluaXRpYWwgRXhlY3V0aW9uIENvbnRleHQgY3JlYXRpb24KKwkgKi8KKwlBUEV4ZWN1dGlvbkRhdGEgY3JlYXRlSW5pdGlhbEV4ZWN1dGlvbkRhdGEoKTsKKworCisJLyoqCisJICogQlVJTERFUgorCSAqIFJlcGxhY2UgVUZJIG9mIHZhciBieSB0aGlzIGFzc29jaWF0ZWQgQmFzZUluc3RhbmNlRm9ybQorCSAqLworCisJaW5saW5lIEJGIGNvbXBpbGVFeHByZXNzaW9uKEV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlLCBjb25zdCBCRiAmIGFDb2RlKQorCXsKKwkJQ29tcGlsYXRpb25FbnZpcm9ubWVudCBjb21waWxFTlYoYW5FeGVjdXRhYmxlKTsKKworCQljb21waWxFTlYubUNUWC0+c2V0TW9kaWZpZXIoCisJCQkJTW9kaWZpZXI6OlBST1BFUlRZX1BVQkxJQ19WT0xBVElMRV9NT0RJRklFUiApOworCisJCUJGIGJmID0gbUF2bWNvZGVDb21waWxlci5kZWNvZGVfY29tcGlsZUV4cHJlc3Npb24oCisJCQkJY29tcGlsRU5WLm1DVFgsIGFDb2RlKTsKKworCQlyZXR1cm4oICggYmYuaXNub3Q8IEF2bUNvZGUgPigpICkgPyAgYmYgIDoKKwkJCW1Bdm1jb2RlQ29tcGlsZXIub3B0aW1pemVFeHByZXNzaW9uKGNvbXBpbEVOVi5tQ1RYLCBiZi5iZkNvZGUoKSkgKTsKKwl9CisKKwlpbmxpbmUgQkYgY29tcGlsZUV4cHJlc3Npb24oY29uc3QgQkYgJiBhQ29kZSk7CisKKworCWlubGluZSBCRkNvZGUgY29tcGlsZVN0YXRlbWVudCgKKwkJCUV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKKwl7CisJCUJGQ29kZSBjb21waWxlZENvZGUgPQorCQkJCW1Bdm1jb2RlQ29tcGlsZXIuY29tcGlsZVN0YXRlbWVudChhbkV4ZWN1dGFibGUsIGFDb2RlKTsKKworCQlyZXR1cm4oIG1Bdm1jb2RlQ29tcGlsZXIub3B0aW1pemVTdGF0ZW1lbnQoCisJCQkJYW5FeGVjdXRhYmxlLCBjb21waWxlZENvZGUpICk7CisJfQorCisJaW5saW5lIEJGQ29kZSBjb21waWxlU3RhdGVtZW50KGNvbnN0IEJGQ29kZSAmIGFDb2RlKTsKKworCisKKwlCRiBidWlsZChUYWJsZU9mU3ltYm9sICYgYWxpYXNUYWJsZSwKKwkJCWNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVELCBjb25zdCBCRiAmIGFDb2RlKTsKKworCisJQkYgYnVpbGQoY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQsIGNvbnN0IEJGICYgYUNvZGUpOworCisJaW5saW5lIEJGIGJ1aWxkKGNvbnN0IEFQRXhlY3V0aW9uRGF0YSAmIGFwRUQsIGNvbnN0IEJGICYgYUNvZGUpCisJeworCQlyZXR1cm4oIGJ1aWxkKCgqIGFwRUQpLCBhQ29kZSkgKTsKKwl9CisKKworCUJGIGJ1aWxkKFRhYmxlT2ZTeW1ib2wgJiBhbGlhc1RhYmxlLCBjb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwKKwkJCWNvbnN0IEF2bVByb2dyYW0gJiBhUHJvZ3JhbSwgY29uc3QgQkYgJiBhQ29kZSk7CisKKwlCRiBjb21waWxlKFRhYmxlT2ZTeW1ib2wgJiBhbGlhc1RhYmxlLAorCQkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQsIGNvbnN0IEJGICYgYUNvZGUpOworCisKKwlCRiBzZWFyY2hTeW1ib2xJbnN0YW5jZShUYWJsZU9mU3ltYm9sICYgYWxpYXNUYWJsZSwKKwkJCWNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVELCBVbmlGb3JtSWRlbnRpZmllciAqIGFuVUZJKTsKKworCWNvbnN0IEJGICYgc2VhcmNoU3ltYm9sSW5zdGFuY2UoVGFibGVPZlN5bWJvbCAmIGFsaWFzVGFibGUsCisJCQljb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwgY29uc3QgT2JqZWN0RWxlbWVudCAqIG9iakVsZW1lbnQpOworCisJY29uc3QgQkYgJiBzZWFyY2hTeW1ib2xJbnN0YW5jZShUYWJsZU9mU3ltYm9sICYgYWxpYXNUYWJsZSwKKwkJCWNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVELCBjb25zdCBCRiAmIGFCYXNlSW5zdGFuY2UpOworCit9OworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworCisjZW5kaWYgLypCVUlMREVSX0hfKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvQ01ha2VMaXN0cy50eHQgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNjUzNjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTkgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgICAgICAgICAgICAgICAgICAgIENNYWtlIGZpbGUgZm9yIHRoZSBCVUlMREVSIGxpYnJhcnkgCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgQysrIHNvdXJjZSBmaWxlcyB0byB0YWtlIGludG8gYWNjb3VudCAoYWxsIGZpbGVzIG1hdGNoaW5nIHBhdHRlcm5zLCByZWN1cnNpdmVseSkKK2ZpbGUgKEdMT0JfUkVDVVJTRSBCVUlMREVSX0NYWF9TUkNfRklMRVMgKi5jcHAgKi5oKQorCisjIFRhcmdldCB0byBidWlsZAorYWRkX2xpYnJhcnkgKGJ1aWxkZXIgU1RBVElDICR7QlVJTERFUl9DWFhfU1JDX0ZJTEVTfSkKKworIyBJbmNsdWRlIGRpcmVjdG9yaWVzIChpbnRlcm5hbCkKK3RhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzIChidWlsZGVyIFBVQkxJQyAuLikgI8KgRklYTUUgOiBleHBsaWNpdCB0aGUgZGVwZW5kZW5jaWVzIGxpYiBieSBsaWIKKworIyBUYXJnZXQgaW5jbHVkZSBkaXJlY3RvcmllcyAoZXh0ZXJuYWwpCit0YXJnZXRfaW5jbHVkZV9kaXJlY3RvcmllcyAoYnVpbGRlciBQVUJMSUMgJHtHTVBfSU5DTFVERV9ESVJ9ICR7R01QWFhfSU5DTFVERV9ESVJ9KQordGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMgKGJ1aWxkZXIgUFVCTElDICR7Qm9vc3RfSU5DTFVERV9ESVJTfSkKK3RhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzIChidWlsZGVyIFBVQkxJQyAke0NWQzRfSU5DTFVERV9ESVJ9KQorCithZGRfZGVwZW5kZW5jaWVzKGJ1aWxkZXIgcmVzY2FuX2N2YzQpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL0xvYWRlci5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL0xvYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVhYTI1ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvTG9hZGVyLmNwcApAQCAtMCwwICsxLDE3ODMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxvYWRlci5oIgorCisjaW5jbHVkZSA8YnVpbGRlci9wcmltaXRpdmUvQXZtY29kZUNvbXBpbGVyLmg+CisKKyNpbmNsdWRlIDxidWlsZGVyL0J1aWxkZXIuaD4KKyNpbmNsdWRlIDxjb21wdXRlci9FeGVjdXRpb25FbnZpcm9ubWVudC5oPgorCisjaW5jbHVkZSA8Zm1sL2J1ZmZlci9CYXNlQnVmZmVyRm9ybS5oPgorI2luY2x1ZGUgPGZtbC9idWZmZXIvQnJvYWRjYXN0QnVmZmVyLmg+CisjaW5jbHVkZSA8Zm1sL2J1ZmZlci9GaWZvQnVmZmVyLmg+CisjaW5jbHVkZSA8Zm1sL2J1ZmZlci9MaWZvQnVmZmVyLmg+CisjaW5jbHVkZSA8Zm1sL2J1ZmZlci9NdWx0aUZpZm9CdWZmZXIuaD4KKyNpbmNsdWRlIDxmbWwvYnVmZmVyL011bHRpTGlmb0J1ZmZlci5oPgorI2luY2x1ZGUgPGZtbC9idWZmZXIvTXVsdGlzZXRCdWZmZXIuaD4KKyNpbmNsdWRlIDxmbWwvYnVmZmVyL1JhbUJ1ZmZlci5oPgorI2luY2x1ZGUgPGZtbC9idWZmZXIvU2V0QnVmZmVyLmg+CisKKyNpbmNsdWRlIDxmbWwvY29tbW9uL01vZGlmaWVyRWxlbWVudC5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvQmFzZUluc3RhbmNlRm9ybS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVGb3JtLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZUxpYi5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZEYXRhLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZk1hY2hpbmUuaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mUG9ydC5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL1JvdXRlci5oPgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQXZtQ29kZS5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0J1aWx0aW5RdWV1ZS5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0J1aWx0aW5Db250YWluZXIuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29uc3RhbnQuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uRmFjdG9yeS5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25UeXBlQ2hlY2tlci5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL1N0YXRlbWVudENvbnN0cnVjdG9yLmg+CisKKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvQnVmZmVyLmg+CisKKyNpbmNsdWRlIDxmbWwvb3BlcmF0b3IvT3BlcmF0b3JNYW5hZ2VyLmg+CisKKyNpbmNsdWRlIDxmbWwvc3ltYm9sL1N5bWJvbC5oPgorI2luY2x1ZGUgPGZtbC9zeW1ib2wvVGFibGVPZlN5bWJvbC5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uQ29udGV4dC5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkRhdGEuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9NZXNzYWdlLmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvUnVudGltZUZvcm0uaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lSUQuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lTGliLmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvVGFibGVPZkRhdGEuaD4KKworI2luY2x1ZGUgPGZtbC90eXBlL0Jhc2VUeXBlU3BlY2lmaWVyLmg+CisjaW5jbHVkZSA8Zm1sL3R5cGUvQ2xhc3NUeXBlU3BlY2lmaWVyLmg+CisjaW5jbHVkZSA8Zm1sL3R5cGUvQ29udGFpbmVyVHlwZVNwZWNpZmllci5oPgorI2luY2x1ZGUgPGZtbC90eXBlL1R5cGVNYW5hZ2VyLmg+CisKKyNpbmNsdWRlIDxzZXcvQ29uZmlndXJhdGlvbi5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvKioKKyAqIENPTlNUUlVDVE9SCisgKiBEZWZhdWx0CisgKi8KK0xvYWRlcjo6TG9hZGVyKENvbmZpZ3VyYXRpb24gJiBhQ29uZmlndXJhdGlvbiwgQnVpbGRlciAmIGFCdWlsZGVyLAorCQlBdm1QcmltaXRpdmVQcm9jZXNzb3IgJiBhUHJpbWl0aXZlUHJvY2Vzc29yKQorOiBtQ29uZmlndXJhdGlvbiggYUNvbmZpZ3VyYXRpb24gKSwKK21CdWlsZGVyKCBhQnVpbGRlciApLAorRU5WKCBhUHJpbWl0aXZlUHJvY2Vzc29yICksCittT25DcmVhdGVSb3V0aW1lKCApCit7CisJLy8hISBOT1RISU5HCit9CisKKy8qKgorICogQ09ORklHVVJFCisgKi8KK2Jvb2wgTG9hZGVyOjpjb25maWd1cmUoKQoreworCS8vISEgTk9USElORworCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworLyoqCisgKiBSVU5OSU5HIG9uQ1JFQVRFCisgKiBtT25DcmVhdGVSb3V0aW1lCisgKi8KK2Jvb2wgTG9hZGVyOjpmaW5hbGl6ZVJ1bm5pbmdPbkNyZWF0ZSgKKwkJY29uc3QgQmFzZUVudmlyb25tZW50ICYgRU5WLCBBUEV4ZWN1dGlvbkRhdGEgJiBhbkVEKQoreworCWlmKCBoYXNPbkNyZWF0ZVJvdXRpbWUoKSApCisJeworCQkvLyBTYXZlIGN1cnJlbnQgYWN0aXZlIFJJRAorCQlSdW50aW1lSUQgc2F2ZVJJRCA9IGFuRUQtPm1SSUQ7CisKKwkJY29uc3RfcmlkX2l0ZXJhdG9yIGl0UklEID0gb25fY3JlYXRlX2JlZ2luKCk7CisJCWNvbnN0X3JpZF9pdGVyYXRvciBlbmRSSUQgPSBvbl9jcmVhdGVfZW5kKCk7CisJCWZvciggOyBpdFJJRCAhPSBlbmRSSUQgOyArK2l0UklEICkKKwkJeworLy8hIVtUUkFDRV06IHRvIGRlbGV0ZQorLy9BVk1fT1NfREVCVUcgPDwgIm9uQ3JlYXRlOiAiIDw8IHN0cl9oZWFkZXIoICppdFJJRCApIDw8IHN0ZDo6ZW5kbAorLy8JCTw8IHRvX3N0cmVhbSggKCppdFJJRCkuZ2V0T25DcmVhdGUoKSApIDw8IHN0ZDo6Zmx1c2g7CisKKwkJCUV4ZWN1dGlvbkVudmlyb25tZW50IHRtcEVOVihFTlYsIGFuRUQsCisJCQkJCSgqaXRSSUQpLCAoKml0UklEKS5nZXRPbkNyZWF0ZSgpICk7CisKKwkJCWlmKCB0bXBFTlYucnVuKFBST0NFU1NfQ1JFQVRJTkdfU1RBVEUpICkKKwkJCXsKKwkJCQl0bXBFTlYub3V0RURTLnBvcF9sYXN0X3RvKCBhbkVEICk7CisKKwkJCQlpZiggdG1wRU5WLm91dEVEUy5ub25lbXB0eSgpICkKKwkJCQl7CisJCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQkJPDwgIlVuc3VwcG9ydGVkIDw8IG9uQ3JlYXRlIFByaW1pdGl2ZSA+PiAiCisJCQkJCQkJCQkid2hpY2ggZXhlY3V0aW9uIGNyZWF0ZSBtb3JlIHRoYW4gb25lICIKKwkJCQkJCQkJCSJFeGVjdXRpb24gQ29udGV4dCA6PlxuIgorCQkJCQkJCTw8ICgqaXRSSUQpLmdldE9uQ3JlYXRlKCktPnRvU3RyaW5nKCBBVk1fVEFCMV9JTkRFTlQgKQorCQkJCQkJCTw8IFNFTkRfQUxFUlQ7CisKKwkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCX0KKworCQkJCWFuRUQubXdzZXRSdW50aW1lRm9ybVN0YXRlKCgqaXRSSUQpLAorCQkJCQkJUFJPQ0VTU19DUkVBVElOR19TVEFURSwgUFJPQ0VTU19ESVNBQkxFRF9TVEFURSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJCTw8ICJGYWlsZWQgdG8gZXZhbCA8PCBvbkNyZWF0ZSBSb3V0aW5lID4+ICIKKwkJCQkJCQkJIm9uIGluaXRpYWwgRXhlY3V0aW9uIENvbnRleHQgOj5cbiIKKwkJCQkJCTw8IEVOVi5pbkNPREUtPnRvU3RyaW5nKCBBVk1fVEFCMV9JTkRFTlQgKQorCQkJCQkJPDwgU0VORF9BTEVSVDsKKworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJfQorCisJCXJlc2V0T25DcmVhdGVSb3V0aW1lKCk7CisKKwkJLy8gUmVzdG9yZSBjdXJyZW50IGFjdGl2ZSBSSUQKKwkJYW5FRC0+bVJJRCA9IHNhdmVSSUQ7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworCisvKioKKyAqIGxvYWRTY2hlZHVsZXJDb2RlCisgKiBmb3Igb25TY2hlZHVsZSBSb3V0aW5lCisgKi8KK0JGQ29kZSBMb2FkZXI6OmxvYWRTY2hlZHVsZXJDb2RlKAorCQlBUEV4ZWN1dGlvbkRhdGEgJiBhbkVELCBjb25zdCBSdW50aW1lRm9ybSAmIGFSRiwKKwkJY29uc3QgQkZDb2RlICYgYVNjaGVkdWxlckNvZGUsIGJvb2wgaXNTdGF0aWNMb2FkaW5nKQoreworCWlmKCBhU2NoZWR1bGVyQ29kZS5pbnZhbGlkKCkgKQorCXsKKwkJQVZNX09TX0VYSVQoIEZBSUxFRCApCisJCQkJPDwgImxvYWRTY2hlZHVsZXJDb2RlOj4gVW5leHBlY3RlZCBhIDw8IG51bGw8Y29kZT4gPj4gISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQlyZXR1cm4oIGFTY2hlZHVsZXJDb2RlICk7CisJfQorCWVsc2UgaWYoIGFTY2hlZHVsZXJDb2RlLT5lbXB0eSgpICkKKwl7CisJCXJldHVybiggYVNjaGVkdWxlckNvZGUgKTsKKwl9CisKKwlpZiggYVNjaGVkdWxlckNvZGUtPnNpbmdsZXRvbigpCisJCSYmIGFTY2hlZHVsZXJDb2RlLT5maXJzdCgpLmlzPCBJbnN0YW5jZU9mTWFjaGluZSA+KCkKKwkJJiYgT3BlcmF0b3JNYW5hZ2VyOjppc0FjdGl2aXR5KCBhU2NoZWR1bGVyQ29kZS0+Z2V0T3BlcmF0b3IoKSApICkKKwl7CisJCUluc3RhbmNlT2ZNYWNoaW5lICogYW5JbnN0YW5jZSA9CisJCQkJYVNjaGVkdWxlckNvZGUtPmZpcnN0KCkudG9fcHRyPCBJbnN0YW5jZU9mTWFjaGluZSA+KCk7CisKKwkJaWYoIGlzU3RhdGljTG9hZGluZworCQkJJiYgYW5JbnN0YW5jZS0+aGFzUnVudGltZVJJRCgpCisJCQkmJiBhbkVELT5pc0FsaXZlKCBhbkluc3RhbmNlLT5nZXRSdW50aW1lUklEKCkgKSApCisJCXsKKwkJCXJldHVybiggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld09wdGlOb3BDb2RlKAorCQkJCQlhU2NoZWR1bGVyQ29kZS0+Z2V0T3BlcmF0b3IoKSwKKwkJCQkJYW5JbnN0YW5jZS0+Z2V0UnVudGltZVJJRCgpLCBBVk1fQVJHX01BQ0hJTkVfUklEKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYoIGFSRi5nZXRFeGVjdXRhYmxlKCktPmhhc09uQ29uY3VycmVuY3koKSApCisJCQl7CisJCQkJQkZDb2RlIGxvYWRDb2RlKCBhUkYuZ2V0RXhlY3V0YWJsZSgpLT5nZXRPbkNvbmN1cnJlbmN5T3BlcmF0b3IoKSApOworCisJCQkJbG9hZFNjaGVkdWxlckNvZGUoYW5FRCwgYVJGLCBhU2NoZWR1bGVyQ29kZSwKKwkJCQkJCWxvYWRDb2RlLCBpc1N0YXRpY0xvYWRpbmcpOworCisJCQkJbG9hZENvZGUgPSBtQnVpbGRlci5nZXRBdm1jb2RlQ29tcGlsZXIoKS5vcHRpbWl6ZVN0YXRlbWVudCgKKwkJCQkJCWFSRi5nZXRFeGVjdXRhYmxlKCksIGxvYWRDb2RlKTsKKworCQkJCXJldHVybiggbG9hZENvZGUgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlUYWJsZU9mUnVudGltZUlEOjppdGVyYXRvciBpdENoaWxkID0gYVJGLmdldENoaWxkVGFibGUoKS0+YmVnaW4oKTsKKwkJCQlUYWJsZU9mUnVudGltZUlEOjppdGVyYXRvciBlbmRDaGlsZCA9IGFSRi5nZXRDaGlsZFRhYmxlKCktPmVuZCgpOworCQkJCWZvciggOyBpdENoaWxkICE9IGVuZENoaWxkIDsgKytpdENoaWxkICkKKwkJCQl7CisJCQkJCWlmKCBhbkluc3RhbmNlLT5nZXRTcGVjaWZpZXIoKS5oYXNEZXNpZ25JbnN0YW5jZVN0YXRpYygpCisJCQkJCQkmJiAoYW5JbnN0YW5jZSA9PSAoKml0Q2hpbGQpLmdldEluc3RhbmNlKCkpCisJCQkJCQkmJiBhbkVELT5pc0FsaXZlKCAqaXRDaGlsZCApICkKKwkJCQkJeworCQkJCQkJcmV0dXJuKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3T3B0aU5vcENvZGUoCisJCQkJCQkJCWFTY2hlZHVsZXJDb2RlLT5nZXRPcGVyYXRvcigpLAorCQkJCQkJCQkoKml0Q2hpbGQpLCBBVk1fQVJHX01BQ0hJTkVfUklEKSApOworCQkJCQl9CisJCQkJCWVsc2UgaWYoIGFuSW5zdGFuY2UtPmdldFNwZWNpZmllcigpLmhhc0Rlc2lnbk1vZGVsKCkKKwkJCQkJCQkmJiAoKml0Q2hpbGQpLmlzRHluYW1pY0xvYWRlZCgpCisJCQkJCQkJJiYgKGFuSW5zdGFuY2UgPT0gKCppdENoaWxkKS4KKwkJCQkJCQkJCWdldEluc3RhbmNlKCktPmdldEluc3RhbmNlTW9kZWwoKSkKKwkJCQkJCQkmJiBhbkVELT5pc0FsaXZlKCAqaXRDaGlsZCApICkKKwkJCQkJeworCQkJCQkJcmV0dXJuKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3T3B0aU5vcENvZGUoCisJCQkJCQkJCWFTY2hlZHVsZXJDb2RlLT5nZXRPcGVyYXRvcigpLAorCQkJCQkJCQkoKml0Q2hpbGQpLCBBVk1fQVJHX01BQ0hJTkVfUklEKSApOworCQkJCQl9CisJCQkJfQorCisJCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJCTw8ICJsb2FkU2NoZWR1bGVyQ29kZTo+IEZhaWxlZCAhISEiIDw8IGFTY2hlZHVsZXJDb2RlCisJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQlyZXR1cm4oIGFTY2hlZHVsZXJDb2RlICk7CisJCQl9CisJCX0KKwl9CisKKwllbHNlCisJeworCQlCRkNvZGUgbG9hZENvZGUoIGFTY2hlZHVsZXJDb2RlLT5nZXRPcGVyYXRvcigpICk7CisKKwkJQXZtQ29kZTo6aXRlcmF0b3IgaXRBcmcgPSBhU2NoZWR1bGVyQ29kZS0+YmVnaW4oKTsKKwkJQXZtQ29kZTo6aXRlcmF0b3IgZW5kQXJnID0gYVNjaGVkdWxlckNvZGUtPmVuZCgpOworCQlmb3IoIDsgaXRBcmcgIT0gZW5kQXJnIDsgKytpdEFyZyApCisJCXsKKwkJCWlmKCAoKml0QXJnKS5pczwgQXZtQ29kZSA+KCkgKQorCQkJeworCQkJCWxvYWRTY2hlZHVsZXJDb2RlKGFuRUQsIGFSRiwKKwkJCQkJCSgqaXRBcmcpLmJmQ29kZSgpLCBsb2FkQ29kZSwgaXNTdGF0aWNMb2FkaW5nKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJPDwgImxvYWRTY2hlZHVsZXJDb2RlOj4gVW5leHBlY3RlZCBhcmcgOj4iCisJCQkJCQk8PCAoKml0QXJnKQorCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJbG9hZENvZGUtPmFwcGVuZCggKml0QXJnICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4oIG1CdWlsZGVyLmdldEF2bWNvZGVDb21waWxlcigpLm9wdGltaXplU3RhdGVtZW50KAorCQkJCWFSRi5nZXRFeGVjdXRhYmxlKCksIGxvYWRDb2RlKSApOworCX0KK30KKworCit2b2lkIExvYWRlcjo6bG9hZFNjaGVkdWxlckNvZGUoQVBFeGVjdXRpb25EYXRhICYgYW5FRCwKKwkJY29uc3QgUnVudGltZUZvcm0gJiBhUkYsIGNvbnN0IEJGQ29kZSAmIGFTY2hlZHVsZXJDb2RlLAorCQlCRkNvZGUgJiBsb2FkQ29kZSwgYm9vbCBpc1N0YXRpY0xvYWRpbmcpCit7CisJaWYoIGFTY2hlZHVsZXJDb2RlLT5zaW5nbGV0b24oKSAmJgorCQlhU2NoZWR1bGVyQ29kZS0+Zmlyc3QoKS5pczwgSW5zdGFuY2VPZk1hY2hpbmUgPigpICYmCisJCU9wZXJhdG9yTWFuYWdlcjo6aXNBY3Rpdml0eSggYVNjaGVkdWxlckNvZGUtPmdldE9wZXJhdG9yKCkgKSApCisJeworCQlJbnN0YW5jZU9mTWFjaGluZSAqIGFuSW5zdGFuY2UgPQorCQkJCWFTY2hlZHVsZXJDb2RlLT5maXJzdCgpLnRvX3B0cjwgSW5zdGFuY2VPZk1hY2hpbmUgPigpOworCisJCWlmKCBpc1N0YXRpY0xvYWRpbmcKKwkJCSYmIGFuSW5zdGFuY2UtPmhhc1J1bnRpbWVSSUQoKQorCQkJJiYgYW5FRC0+aXNBbGl2ZSggYW5JbnN0YW5jZS0+Z2V0UnVudGltZVJJRCgpICkgKQorCQl7CisJCQlsb2FkQ29kZS0+YXBwZW5kKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3T3B0aU5vcENvZGUoCisJCQkJCWFTY2hlZHVsZXJDb2RlLT5nZXRPcGVyYXRvcigpLAorCQkJCQlhbkluc3RhbmNlLT5nZXRSdW50aW1lUklEKCksIEFWTV9BUkdfTUFDSElORV9SSUQpICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlUYWJsZU9mUnVudGltZUlEOjppdGVyYXRvciBpdENoaWxkID0gYVJGLmdldENoaWxkVGFibGUoKS0+YmVnaW4oKTsKKwkJCVRhYmxlT2ZSdW50aW1lSUQ6Oml0ZXJhdG9yIGVuZENoaWxkID0gYVJGLmdldENoaWxkVGFibGUoKS0+ZW5kKCk7CisJCQlmb3IoIDsgaXRDaGlsZCAhPSBlbmRDaGlsZCA7ICsraXRDaGlsZCApCisJCQl7CisJCQkJaWYoIGFuSW5zdGFuY2UtPmdldFNwZWNpZmllcigpLmhhc0Rlc2lnbkluc3RhbmNlU3RhdGljKCkKKwkJCQkJJiYgKGFuSW5zdGFuY2UgPT0gKCppdENoaWxkKS5nZXRJbnN0YW5jZSgpKQorCQkJCQkmJiBhbkVELT5pc0FsaXZlKCAqaXRDaGlsZCApICkKKwkJCQl7CisJCQkJCWxvYWRDb2RlLT5hcHBlbmQoIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdPcHRpTm9wQ29kZSgKKwkJCQkJCQlhU2NoZWR1bGVyQ29kZS0+Z2V0T3BlcmF0b3IoKSwKKwkJCQkJCQkoKml0Q2hpbGQpLCBBVk1fQVJHX01BQ0hJTkVfUklEKSApOworCQkJCX0KKwkJCQllbHNlIGlmKCBhbkluc3RhbmNlLT5nZXRTcGVjaWZpZXIoKS5oYXNEZXNpZ25Nb2RlbCgpCisJCQkJCQkmJiAoKml0Q2hpbGQpLmlzRHluYW1pY0xvYWRlZCgpCisJCQkJCQkmJiAoYW5JbnN0YW5jZSA9PSAoKml0Q2hpbGQpLgorCQkJCQkJCQlnZXRJbnN0YW5jZSgpLT5nZXRJbnN0YW5jZU1vZGVsKCkpCisJCQkJCQkmJiBhbkVELT5pc0FsaXZlKCAqaXRDaGlsZCApICkKKwkJCQl7CisJCQkJCWxvYWRDb2RlLT5hcHBlbmQoIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdPcHRpTm9wQ29kZSgKKwkJCQkJCQlhU2NoZWR1bGVyQ29kZS0+Z2V0T3BlcmF0b3IoKSwKKwkJCQkJCQkoKml0Q2hpbGQpLCBBVk1fQVJHX01BQ0hJTkVfUklEKSApOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwllbHNlCisJeworCQlsb2FkQ29kZS0+YXBwZW5kKAorCQkJCWxvYWRTY2hlZHVsZXJDb2RlKGFuRUQsIGFSRiwKKwkJCQkJCWFTY2hlZHVsZXJDb2RlLCBpc1N0YXRpY0xvYWRpbmcpICk7CisJfQorfQorCisKKy8qKgorICogbG9hZFN5c3RlbUluc3RhbmNlCisgKi8KK1J1bnRpbWVGb3JtICogTG9hZGVyOjpsb2FkU3lzdGVtSW5zdGFuY2UoQVBFeGVjdXRpb25EYXRhICYgYW5FRCwKKwkJY29uc3QgUnVudGltZUlEICYgYVBhcmVudFJJRCwgSW5zdGFuY2VPZk1hY2hpbmUgKiBhTWFjaGluZSwKKwkJaW50ICYgdGhlUGlkLCBhdm1fb2Zmc2V0X3QgJiB0aGVPZmZzZXQpCit7CitBVk1fSUZfREVCVUdfRkxBRyggTE9BRElORyApCisJQVZNX09TX1RSQUNFIDw8IElOQ1JfSU5ERU5UX1RBQgorCQkJPDwgIjwgYmVnaW4gbG9hZGluZyBzeXN0ZW0gaW5zdGFuY2UgPCAiCisJCQk8PCBhTWFjaGluZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiID4iCisJCQk8PCBzdGQ6OmVuZGwKKwkJCTw8IFRBQiA8PCAiXHQ+Pj4+IHBhcmVudCBpczogIgorCQkJPDwgc3RkOjplbmRsOworCisJYVBhcmVudFJJRC50b1N0cmVhbShBVk1fT1NfVFJBQ0UgPDwgSU5DUjJfSU5ERU5UKTsKKworCUFWTV9PU19UUkFDRSA8PCBFT0xfREVDUjJfSU5ERU5UOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIExPQURJTkcgKQorCisKKwkvLyBQSUQgJiBPRkZTRVQgZm9yIHRoZSBydW50aW1lIG1hY2hpbmUKKwlpbnQgcGlkID0gdGhlUGlkKys7CisJYXZtX29mZnNldF90IG9mZnNldCA9IHRoZU9mZnNldCsrOworCisJUnVudGltZUlEIGxvYWRNYWNoaW5lUklEKGFQYXJlbnRSSUQsIHBpZCwgb2Zmc2V0LCBhTWFjaGluZSk7CisKKwltQ29uZmlndXJhdGlvbi5hcHBlbmRSSUQoIGxvYWRNYWNoaW5lUklEICk7CisKKwlpZiggYU1hY2hpbmUtPmdldEV4ZWN1dGFibGUoKS0+aGFzU2luZ2xlUnVudGltZUluc3RhbmNlKCkgKQorCXsKKwkJYU1hY2hpbmUtPnNldFJ1bnRpbWVSSUQobG9hZE1hY2hpbmVSSUQpOworCX0KKworCVJ1bnRpbWVGb3JtICogYVJGID0gbmV3IFJ1bnRpbWVGb3JtKCBsb2FkTWFjaGluZVJJRCApOworCisJYW5FRC0+c2F2ZVJ1bnRpbWVGb3JtKG9mZnNldCwgYVJGKTsKKworCWlmKCBhTWFjaGluZS0+aGFzT25DcmVhdGUoKSApCisJeworCQltT25DcmVhdGVSb3V0aW1lLmFwcGVuZCggbG9hZE1hY2hpbmVSSUQgKTsKKworCQlhbkVELT5zZXRSdW50aW1lRm9ybVN0YXRlKG9mZnNldCwgUFJPQ0VTU19DUkVBVElOR19TVEFURSk7CisJfQorCWVsc2UKKwl7CisJCWFuRUQtPnNldFJ1bnRpbWVGb3JtU3RhdGUob2Zmc2V0LCBQUk9DRVNTX0RJU0FCTEVEX1NUQVRFKTsKKwl9CisKKy8vIT8hIENvZGUgcG91ciDDqXZvbHV0aW9uIGZ1dHVyZQorLy8JYVJGLT5zZXROb2RlQ29uZGl0aW9uKCBFeHByZXNzaW9uQ29uc3RhbnQ6OkJPT0xFQU5fVFJVRSApOworLy8JYVJGLT5zZXROb2RlVGltZWRDb25kaXRpb24oIEV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9UUlVFICk7CisKKworCWlmKCBhUGFyZW50UklELnZhbGlkKCkgKQorCXsKKwkJYW5FRC0+Z2V0UnVudGltZShhUGFyZW50UklEKS5hcHBlbmRDaGlsZCggbG9hZE1hY2hpbmVSSUQgKTsKKwl9CisKKwlFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZSA9IGFNYWNoaW5lLT5nZXRFeGVjdXRhYmxlKCk7CisKKwkvLyBMb2FkIERBVEEKKwlpZiggbG9hZERhdGEoYW5FRCwgbG9hZE1hY2hpbmVSSUQsIGxvYWRNYWNoaW5lUklEKSApCisJeworCQkvLyBPcHRpbWl6YXRpb24gZm9yIHJ1bnRpbWUgcmVzb3VyY2UgYWNjZXNzCisJCVRhYmxlT2ZJbnN0YW5jZU9mRGF0YTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGl0RGF0YSA9CisJCQkJYW5FeGVjdXRhYmxlLT5nZXREYXRhKCkuYmVnaW4oKTsKKwkJVGFibGVPZkluc3RhbmNlT2ZEYXRhOjpjb25zdF9yYXdfaXRlcmF0b3IgZW5kRGF0YSA9CisJCQkJYW5FeGVjdXRhYmxlLT5nZXREYXRhKCkuZW5kKCk7CisJCWZvciggOyBpdERhdGEgIT0gZW5kRGF0YSA7ICsraXREYXRhICkKKwkJeworCQkJKGl0RGF0YSktPnNldFJ1bnRpbWVDb250YWluZXJSSUQoIGxvYWRNYWNoaW5lUklEICk7CisJCX0KKwl9CisKKwkvLyBMb2FkIEJVRkZFUgorCWlmKCBsb2FkQnVmZmVyKGFuRUQsIGxvYWRNYWNoaW5lUklELCBsb2FkTWFjaGluZVJJRCkgKQorCXsKKwkJLy8gT3B0aW1pemF0aW9uIGZvciBydW50aW1lIHJlc291cmNlIGFjY2VzcworCQlUYWJsZU9mU3ltYm9sOjppdGVyYXRvciBpdEJ1ZmZlciA9IGFuRXhlY3V0YWJsZS0+Z2V0QnVmZmVyKCkuYmVnaW4oKTsKKwkJVGFibGVPZlN5bWJvbDo6aXRlcmF0b3IgZW5kQnVmZmVyID0gYW5FeGVjdXRhYmxlLT5nZXRCdWZmZXIoKS5lbmQoKTsKKwkJZm9yKCA7IGl0QnVmZmVyIDwgZW5kQnVmZmVyIDsgKytpdEJ1ZmZlciApCisJCXsKKwkJCSgqaXRCdWZmZXIpLnNldFJ1bnRpbWVDb250YWluZXJSSUQoIGxvYWRNYWNoaW5lUklEICk7CisJCX0KKwl9CisKKwkvLyBMb2FkIFJPVVRFUgorCWlmKCBsb2FkUm91dGVyKGFuRUQsIGxvYWRNYWNoaW5lUklELCBsb2FkTWFjaGluZVJJRCkgKQorCXsKKwkJLy8gT3B0aW1pemF0aW9uIGZvciBydW50aW1lIHJlc291cmNlIGFjY2VzcworCQlUYWJsZU9mU3ltYm9sOjppdGVyYXRvciBpdFBvcnQgPSBhbkV4ZWN1dGFibGUtPmdldFBvcnQoKS5iZWdpbigpOworCQlUYWJsZU9mU3ltYm9sOjppdGVyYXRvciBlbmRQb3J0ID0gYW5FeGVjdXRhYmxlLT5nZXRQb3J0KCkuZW5kKCk7CisJCWZvciggOyBpdFBvcnQgIT0gZW5kUG9ydCA7ICsraXRQb3J0ICkKKwkJeworCQkJKCppdFBvcnQpLnNldFJ1bnRpbWVDb250YWluZXJSSUQoIGxvYWRNYWNoaW5lUklEICk7CisKKwkJCWlmKCAoKml0UG9ydCkucG9ydCgpLmlzUG9ydCgpICkKKwkJCXsKKwkJCQlpZiggKCppdFBvcnQpLmdldE1vZGlmaWVyKCkuaGFzRGlyZWN0aW9uSW5wdXQoKSApCisJCQkJeworCQkJCQkoKml0UG9ydCkuc2V0SW5wdXRSb3V0aW5nRGF0YSggYVJGLT5nZXRSb3V0ZXIoKS4KKwkJCQkJCQlnZXRJbnB1dFJvdXRpbmcoKCppdFBvcnQpLmdldFJvdXRlT2Zmc2V0KCkpICk7CisJCQkJfQorCQkJCWlmKCAoKml0UG9ydCkuZ2V0TW9kaWZpZXIoKS5oYXNEaXJlY3Rpb25PdXRwdXQoKSApCisJCQkJeworCQkJCQkoKml0UG9ydCkuc2V0T3V0cHV0Um91dGluZ0RhdGEoIGFSRi0+Z2V0Um91dGVyKCkuCisJCQkJCQkJZ2V0T3V0cHV0Um91dGluZygoKml0UG9ydCkuZ2V0Um91dGVPZmZzZXQoKSkgKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKworCS8vIExvYWQgTUFDSElORQorCWxvYWRNYWNoaW5lKGFuRUQsIGxvYWRNYWNoaW5lUklELCBsb2FkTWFjaGluZVJJRCwgdGhlUGlkLCB0aGVPZmZzZXQpOworCisJLy8gc2V0IFNDSEVEVUxFCisJaWYoIGFuRXhlY3V0YWJsZS0+aGFzU2luZ2xlUnVudGltZUluc3RhbmNlKCkgJiYKKwkJCWFNYWNoaW5lLT5nZXRFeGVjdXRhYmxlKCktPmhhc09uU2NoZWR1bGUoKSApCisJeworCQlhUkYtPnNldE9uU2NoZWR1bGUoCisJCQkJbG9hZFNjaGVkdWxlckNvZGUoYW5FRCwgKCphUkYpLAorCQkJCQkJYU1hY2hpbmUtPmdldEV4ZWN1dGFibGUoKS0+Z2V0T25TY2hlZHVsZSgpLCB0cnVlKSApOworCX0KKworCS8vIE9wdGltaXphdGlvbiBmb3IgcnVudGltZSByZXNvdXJjZSBhY2Nlc3MKKwlUYWJsZU9mSW5zdGFuY2VPZkRhdGE6OmNvbnN0X3Jhd19pdGVyYXRvciBpdERhdGEgPQorCQkJYW5FeGVjdXRhYmxlLT5nZXREYXRhQWxpYXMoKS5iZWdpbigpOworCVRhYmxlT2ZJbnN0YW5jZU9mRGF0YTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGVuZERhdGEgPQorCQkJYW5FeGVjdXRhYmxlLT5nZXREYXRhQWxpYXMoKS5lbmQoKTsKKwlmb3IoIDsgaXREYXRhICE9IGVuZERhdGEgOyArK2l0RGF0YSApCisJeworCQlpZiggKGl0RGF0YSktPmlzQWxpYXMoKSApCisJCXsKKwkJCWlmKCAoaXREYXRhKS0+aGFzQWxpYXNUYXJnZXQoKSAmJgorCQkJCShpdERhdGEpLT5nZXRBbGlhc1RhcmdldCgpLT5oYXNSdW50aW1lQ29udGFpbmVyUklEKCkgKQorCQkJeworCQkJCShpdERhdGEpLT5zZXRSdW50aW1lQ29udGFpbmVyUklEKAorCQkJCQkJKGl0RGF0YSktPmdldEFsaWFzVGFyZ2V0KCktPmdldFJ1bnRpbWVDb250YWluZXJSSUQoKSApOworCQkJfQorCQkJZWxzZSBpZiggKGl0RGF0YSktPmhhc01hY2hpbmVQYXRoKCkgKQorCQkJeworCQkJCShpdERhdGEpLT5zZXRSdW50aW1lQ29udGFpbmVyUklEKCAoaXREYXRhKS0+Z2V0TWFjaGluZVBhdGgoKS0+CisJCQkJCWxhc3QoKS0+Z2V0RXhlY3V0YWJsZSgpLT5nZXREYXRhKCkuCisJCQkJCXJhd0F0KChpdERhdGEpLT5nZXRPZmZzZXQoKSktPmdldFJ1bnRpbWVDb250YWluZXJSSUQoKSApOworCQkJfQorCQl9CisJfQorCisJLy8gT3B0aW1pemF0aW9uIGZvciBydW50aW1lIHJlc291cmNlIGFjY2VzcworCVRhYmxlT2ZTeW1ib2w6Oml0ZXJhdG9yIGl0QWxpYXMgPSBhbkV4ZWN1dGFibGUtPmdldEFsaWFzKCkuYmVnaW4oKTsKKwlUYWJsZU9mU3ltYm9sOjppdGVyYXRvciBlbmRBbGlhcyA9IGFuRXhlY3V0YWJsZS0+Z2V0QWxpYXMoKS5lbmQoKTsKKwlmb3IoIDsgaXRBbGlhcyA8IGVuZEFsaWFzIDsgKytpdEFsaWFzICkKKwl7CisJCWlmKCAoKml0QWxpYXMpLmlzQWxpYXMoKSApCisJCXsKKwkJCWlmKCAoKml0QWxpYXMpLmhhc0FsaWFzVGFyZ2V0KCkgJiYKKwkJCQkJKCppdEFsaWFzKS5nZXRBbGlhc1RhcmdldCgpLT5oYXNSdW50aW1lQ29udGFpbmVyUklEKCkgKQorCQkJeworCQkJCSgqaXRBbGlhcykuc2V0UnVudGltZUNvbnRhaW5lclJJRCgKKwkJCQkJKCppdEFsaWFzKS5nZXRBbGlhc1RhcmdldCgpLT5nZXRSdW50aW1lQ29udGFpbmVyUklEKCkgKTsKKwkJCX0KKwkJCWVsc2UgaWYoICgqaXRBbGlhcykuaGFzTWFjaGluZVBhdGgoKSApCisJCQl7CisJCQkJKCppdEFsaWFzKS5zZXRSdW50aW1lQ29udGFpbmVyUklEKCgqaXRBbGlhcykuCisJCQkJCWdldE1hY2hpbmVQYXRoKCktPmxhc3QoKS0+Z2V0RXhlY3V0YWJsZSgpLT5nZXREYXRhKCkuCisJCQkJCXJhd0F0KCgqaXRBbGlhcykuZ2V0T2Zmc2V0KCkpLT5nZXRSdW50aW1lQ29udGFpbmVyUklEKCkgKTsKKwkJCX0KKwkJfQorCX0KKworQVZNX0lGX0RFQlVHX0ZMQUcoIExPQURJTkcgKQorCUFWTV9PU19UUkFDRSA8PCBUQUJfREVDUl9JTkRFTlQKKwkJCTw8ICI+IGVuZCBsb2FkaW5nIHN5c3RlbSBpbnN0YW5jZSA8ICIKKwkJCTw8IGFNYWNoaW5lLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8ICIgPiIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIExPQURJTkcgKQorCisJcmV0dXJuKCBhUkYgKTsKK30KKworCisvKioKKyAqIGxvYWRNYWNoaW5lSW5zdGFuY2UKKyAqLworUnVudGltZUZvcm0gKiBMb2FkZXI6OmxvYWRNYWNoaW5lSW5zdGFuY2UoQVBFeGVjdXRpb25EYXRhICYgYW5FRCwKKwkJY29uc3QgUnVudGltZUlEICYgYVBhcmVudFJJRCwgSW5zdGFuY2VPZk1hY2hpbmUgKiBhbkluc3RhbmNlLAorCQlpbnQgJiB0aGVQaWQsIGF2bV9vZmZzZXRfdCAmIHRoZU9mZnNldCkKK3sKK0FWTV9JRl9ERUJVR19GTEFHKCBMT0FESU5HICkKKwlBVk1fT1NfVFJBQ0UgPDwgSU5DUl9JTkRFTlRfVEFCCisJCQk8PCAiPCBiZWdpbiBsb2FkaW5nIG1hY2hpbmUgaW5zdGFuY2UgPCAiCisJCQk8PCBhbkluc3RhbmNlLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8ICIgPiIKKwkJCTw8IHN0ZDo6ZW5kbAorCQkJPDwgVEFCIDw8ICJcdD4+Pj4gcGFyZW50IGlzOiAiCisJCQk8PCBzdGQ6OmVuZGw7CisKKwlhUGFyZW50UklELnRvU3RyZWFtKEFWTV9PU19UUkFDRSA8PCBJTkNSMl9JTkRFTlQpOworCisJQVZNX09TX1RSQUNFIDw8IEVPTF9ERUNSMl9JTkRFTlQ7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggTE9BRElORyApCisKKwkvLyBQSUQgJiBPRkZTRVQgZm9yIHRoZSBydW50aW1lIG1hY2hpbmUKKwlpbnQgcGlkID0gdGhlUGlkKys7CisJYXZtX29mZnNldF90IG9mZnNldCA9IHRoZU9mZnNldCsrOworCisJUnVudGltZUlEIGxvYWRNYWNoaW5lUklEKGFQYXJlbnRSSUQsIHBpZCwgb2Zmc2V0LCBhbkluc3RhbmNlKTsKKwlpZiggYW5JbnN0YW5jZS0+Z2V0RXhlY3V0YWJsZSgpLT5oYXNTaW5nbGVSdW50aW1lSW5zdGFuY2UoKSApCisJeworCQlhbkluc3RhbmNlLT5zZXRSdW50aW1lUklEKGxvYWRNYWNoaW5lUklEKTsKKwl9CisKKwltQ29uZmlndXJhdGlvbi5hcHBlbmRSSUQoIGxvYWRNYWNoaW5lUklEICk7CisKKwlSdW50aW1lRm9ybSAqIGFSRiA9IG5ldyBSdW50aW1lRm9ybSggbG9hZE1hY2hpbmVSSUQgKTsKKworCWFuRUQtPnNhdmVSdW50aW1lRm9ybShvZmZzZXQsIGFSRik7CisKKy8vIT8hIENvZGUgcG91ciDDqXZvbHV0aW9uIGZ1dHVyZQorLy8JYVJGLT5zZXROb2RlQ29uZGl0aW9uKCBFeHByZXNzaW9uQ29uc3RhbnQ6OkJPT0xFQU5fVFJVRSApOworLy8JYVJGLT5zZXROb2RlVGltZWRDb25kaXRpb24oIEV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9UUlVFICk7CisKKworCWlmKCBhbkluc3RhbmNlLT5pc0F1dG9TdGFydCgpICkKKwl7CisvLwkJYW5FRC0+c2V0UnVudGltZUZvcm1TdGF0ZShvZmZzZXQsIGFuRUQtPmdldFJ1bnRpbWVGb3JtU3RhdGUoYVBhcmVudFJGKSk7CisKKwkJaWYoIGFuSW5zdGFuY2UtPmhhc09uQ3JlYXRlKCkgKQorCQl7CisJCQltT25DcmVhdGVSb3V0aW1lLmFwcGVuZCggbG9hZE1hY2hpbmVSSUQgKTsKKworCQkJYW5FRC0+c2V0UnVudGltZUZvcm1TdGF0ZShvZmZzZXQsIFBST0NFU1NfQ1JFQVRJTkdfU1RBVEUpOworCQl9CisJCWVsc2UKKwkJeworCQkJYW5FRC0+c2V0UnVudGltZUZvcm1TdGF0ZShvZmZzZXQsIFBST0NFU1NfRElTQUJMRURfU1RBVEUpOworCQl9CisJfQorCWVsc2UKKwl7CisJCWFuRUQtPnNldFJ1bnRpbWVGb3JtU3RhdGUob2Zmc2V0LCBQUk9DRVNTX0NSRUFURURfU1RBVEUpOworCisJCWxvYWRNYWNoaW5lUklELnNldER5bmFtaWNMb2FkZWQoIHRydWUgKTsKKwl9CisKKwlpZiggYVBhcmVudFJJRC52YWxpZCgpICkKKwl7CisJCWFuRUQtPmdldFJ1bnRpbWUoYVBhcmVudFJJRCkuYXBwZW5kQ2hpbGQoIGxvYWRNYWNoaW5lUklEICk7CisJfQorCisKKwlFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZSA9IGFuSW5zdGFuY2UtPmdldEV4ZWN1dGFibGUoKTsKKworCS8vIExvYWQgREFUQQorCWlmKCBsb2FkRGF0YShhbkVELCBsb2FkTWFjaGluZVJJRCwgbG9hZE1hY2hpbmVSSUQpICkKKwl7CisJCS8vIE9wdGltaXphdGlvbiBmb3IgcnVudGltZSByZXNvdXJjZSBhY2Nlc3MKKwkJaWYoIGFuRXhlY3V0YWJsZS0+aGFzU2luZ2xlUnVudGltZUluc3RhbmNlKCkgJiYKKwkJCQlhbkV4ZWN1dGFibGUtPmdldERhdGEoKS5ub25lbXB0eSgpICkKKwkJeworCQkJVGFibGVPZkluc3RhbmNlT2ZEYXRhOjpjb25zdF9yYXdfaXRlcmF0b3IgaXREYXRhID0KKwkJCQkJYW5FeGVjdXRhYmxlLT5nZXREYXRhKCkuYmVnaW4oKTsKKwkJCVRhYmxlT2ZJbnN0YW5jZU9mRGF0YTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGVuZERhdGEgPQorCQkJCQlhbkV4ZWN1dGFibGUtPmdldERhdGEoKS5lbmQoKTsKKwkJCWZvciggOyBpdERhdGEgIT0gZW5kRGF0YSA7ICsraXREYXRhICkKKwkJCXsKKwkJCQkoaXREYXRhKS0+c2V0UnVudGltZUNvbnRhaW5lclJJRCggbG9hZE1hY2hpbmVSSUQgKTsKKwkJCX0KKwkJfQorCX0KKworCS8vIExvYWQgQlVGRkVSCisJaWYoIGxvYWRCdWZmZXIoYW5FRCwgbG9hZE1hY2hpbmVSSUQsIGxvYWRNYWNoaW5lUklEKSApCisJeworCQkvLyBPcHRpbWl6YXRpb24gZm9yIHJ1bnRpbWUgcmVzb3VyY2UgYWNjZXNzCisJCWlmKCBhbkV4ZWN1dGFibGUtPmhhc1NpbmdsZVJ1bnRpbWVJbnN0YW5jZSgpICYmCisJCQkJYW5FeGVjdXRhYmxlLT5nZXRCdWZmZXIoKS5ub25lbXB0eSgpKQorCQl7CisJCQlUYWJsZU9mU3ltYm9sOjppdGVyYXRvciBpdEJ1ZmZlciA9IGFuRXhlY3V0YWJsZS0+Z2V0QnVmZmVyKCkuYmVnaW4oKTsKKwkJCVRhYmxlT2ZTeW1ib2w6Oml0ZXJhdG9yIGVuZEJ1ZmZlciA9IGFuRXhlY3V0YWJsZS0+Z2V0QnVmZmVyKCkuZW5kKCk7CisJCQlmb3IoIDsgaXRCdWZmZXIgPCBlbmRCdWZmZXIgOyArK2l0QnVmZmVyICkKKwkJCXsKKwkJCQkoKml0QnVmZmVyKS5zZXRSdW50aW1lQ29udGFpbmVyUklEKCBsb2FkTWFjaGluZVJJRCApOworCQkJfQorCQl9CisJfQorCisJLy8gTG9hZCBST1VURVIKKwlpZiggbG9hZFJvdXRlcihhbkVELCBsb2FkTWFjaGluZVJJRCwgbG9hZE1hY2hpbmVSSUQpICkKKwl7CisJCWlmKCBhbkV4ZWN1dGFibGUtPmhhc1NpbmdsZVJ1bnRpbWVJbnN0YW5jZSgpICYmCisJCQkJYW5FeGVjdXRhYmxlLT5nZXRQb3J0KCkubm9uZW1wdHkoKSApCisJCXsKKwkJCS8vIE9wdGltaXphdGlvbiBmb3IgcnVudGltZSByZXNvdXJjZSBhY2Nlc3MKKwkJCVRhYmxlT2ZTeW1ib2w6Oml0ZXJhdG9yIGl0UG9ydCA9IGFuRXhlY3V0YWJsZS0+Z2V0UG9ydCgpLmJlZ2luKCk7CisJCQlUYWJsZU9mU3ltYm9sOjppdGVyYXRvciBlbmRQb3J0ID0gYW5FeGVjdXRhYmxlLT5nZXRQb3J0KCkuZW5kKCk7CisJCQlmb3IoIDsgaXRQb3J0ICE9IGVuZFBvcnQgOyArK2l0UG9ydCApCisJCQl7CisJCQkJKCppdFBvcnQpLnNldFJ1bnRpbWVDb250YWluZXJSSUQoIGxvYWRNYWNoaW5lUklEICk7CisKKwkJCQlpZiggKCppdFBvcnQpLnBvcnQoKS5pc1BvcnQoKSApCisJCQkJeworCQkJCQlpZiggKCppdFBvcnQpLmdldE1vZGlmaWVyKCkuaGFzRGlyZWN0aW9uSW5wdXQoKSApCisJCQkJCXsKKwkJCQkJCSgqaXRQb3J0KS5zZXRJbnB1dFJvdXRpbmdEYXRhKCBhUkYtPmdldFJvdXRlcigpLgorCQkJCQkJCQlnZXRJbnB1dFJvdXRpbmcoKCppdFBvcnQpLmdldFJvdXRlT2Zmc2V0KCkpICk7CisJCQkJCX0KKwkJCQkJaWYoICgqaXRQb3J0KS5nZXRNb2RpZmllcigpLmhhc0RpcmVjdGlvbk91dHB1dCgpICkKKwkJCQkJeworCQkJCQkJKCppdFBvcnQpLnNldE91dHB1dFJvdXRpbmdEYXRhKGFSRi0+Z2V0Um91dGVyKCkuCisJCQkJCQkJCWdldE91dHB1dFJvdXRpbmcoKCppdFBvcnQpLmdldFJvdXRlT2Zmc2V0KCkpICk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKworCS8vIExvYWQgTUFDSElORQorCWxvYWRNYWNoaW5lKGFuRUQsIGxvYWRNYWNoaW5lUklELCBsb2FkTWFjaGluZVJJRCwgdGhlUGlkLCB0aGVPZmZzZXQpOworCisJLy8gc2V0IFNDSEVEVUxFCisJaWYoIC8vYW5FeGVjdXRhYmxlLT5oYXNTaW5nbGVSdW50aW1lSW5zdGFuY2UoKSAmJgorCQkJYW5FeGVjdXRhYmxlLT5oYXNPblNjaGVkdWxlKCkgKQorCXsKKwkJYVJGLT5zZXRPblNjaGVkdWxlKAorCQkJCWxvYWRTY2hlZHVsZXJDb2RlKGFuRUQsICgqYVJGKSwKKwkJCQkJCWFuRXhlY3V0YWJsZS0+Z2V0T25TY2hlZHVsZSgpLCB0cnVlKSApOworCX0KKworCisJLy8gT3B0aW1pemF0aW9uIGZvciBydW50aW1lIHJlc291cmNlIGFjY2VzcworCVRhYmxlT2ZJbnN0YW5jZU9mRGF0YTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGl0RGF0YSA9CisJCQlhbkV4ZWN1dGFibGUtPmdldERhdGFBbGlhcygpLmJlZ2luKCk7CisJVGFibGVPZkluc3RhbmNlT2ZEYXRhOjpjb25zdF9yYXdfaXRlcmF0b3IgZW5kRGF0YSA9CisJCQlhbkV4ZWN1dGFibGUtPmdldERhdGFBbGlhcygpLmVuZCgpOworCWZvciggOyBpdERhdGEgIT0gZW5kRGF0YSA7ICsraXREYXRhICkKKwl7CisJCWlmKCAoaXREYXRhKS0+aXNBbGlhcygpICkKKwkJeworCQkJaWYoIChpdERhdGEpLT5oYXNBbGlhc1RhcmdldCgpICYmCisJCQkJKGl0RGF0YSktPmdldEFsaWFzVGFyZ2V0KCktPmhhc1J1bnRpbWVDb250YWluZXJSSUQoKSApCisJCQl7CisJCQkJKGl0RGF0YSktPnNldFJ1bnRpbWVDb250YWluZXJSSUQoCisJCQkJCQkoaXREYXRhKS0+Z2V0QWxpYXNUYXJnZXQoKS0+Z2V0UnVudGltZUNvbnRhaW5lclJJRCgpICk7CisJCQl9CisJCQllbHNlIGlmKCAoaXREYXRhKS0+aGFzTWFjaGluZVBhdGgoKSApCisJCQl7CisJCQkJKGl0RGF0YSktPnNldFJ1bnRpbWVDb250YWluZXJSSUQoKGl0RGF0YSktPmdldE1hY2hpbmVQYXRoKCktPgorCQkJCQlsYXN0KCktPmdldEV4ZWN1dGFibGUoKS0+Z2V0RGF0YSgpLgorCQkJCQlyYXdBdCgoaXREYXRhKS0+Z2V0T2Zmc2V0KCkpLT5nZXRSdW50aW1lQ29udGFpbmVyUklEKCkgKTsKKwkJCX0KKwkJfQorCX0KKworCS8vIE9wdGltaXphdGlvbiBmb3IgcnVudGltZSByZXNvdXJjZSBhY2Nlc3MKKwlUYWJsZU9mU3ltYm9sOjppdGVyYXRvciBpdEFsaWFzID0gYW5FeGVjdXRhYmxlLT5nZXRBbGlhcygpLmJlZ2luKCk7CisJVGFibGVPZlN5bWJvbDo6aXRlcmF0b3IgZW5kQWxpYXMgPSBhbkV4ZWN1dGFibGUtPmdldEFsaWFzKCkuZW5kKCk7CisJZm9yKCA7IGl0QWxpYXMgPCBlbmRBbGlhcyA7ICsraXRBbGlhcyApCisJeworCQlpZiggKCppdEFsaWFzKS5pc0FsaWFzKCkgKQorCQl7CisJCQlpZiggKCppdEFsaWFzKS5oYXNBbGlhc1RhcmdldCgpICYmCisJCQkJCSgqaXRBbGlhcykuZ2V0QWxpYXNUYXJnZXQoKS0+aGFzUnVudGltZUNvbnRhaW5lclJJRCgpICkKKwkJCXsKKwkJCQkoKml0QWxpYXMpLnNldFJ1bnRpbWVDb250YWluZXJSSUQoCisJCQkJCSgqaXRBbGlhcykuZ2V0QWxpYXNUYXJnZXQoKS0+Z2V0UnVudGltZUNvbnRhaW5lclJJRCgpICk7CisJCQl9CisJCQllbHNlIGlmKCAoKml0QWxpYXMpLmhhc01hY2hpbmVQYXRoKCkgKQorCQkJeworCQkJCSgqaXRBbGlhcykuc2V0UnVudGltZUNvbnRhaW5lclJJRCggKCppdEFsaWFzKS4KKwkJCQkJZ2V0TWFjaGluZVBhdGgoKS0+bGFzdCgpLT5nZXRFeGVjdXRhYmxlKCktPmdldERhdGEoKS4KKwkJCQkJcmF3QXQoKCppdEFsaWFzKS5nZXRPZmZzZXQoKSktPmdldFJ1bnRpbWVDb250YWluZXJSSUQoKSApOworCQkJfQorCQl9CisJfQorCitBVk1fSUZfREVCVUdfRkxBRyggTE9BRElORyApCisJQVZNX09TX1RSQUNFIDw8IFRBQl9ERUNSX0lOREVOVAorCQkJPDwgIj4gZW5kIGxvYWRpbmcgbWFjaGluZSBpbnN0YW5jZSA8ICIKKwkJCTw8IGFuSW5zdGFuY2UtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIiA+IiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggTE9BRElORyApCisKKwlyZXR1cm4oIGFSRiApOworfQorCisKKy8qKgorICogbG9hZERhdGEKKyAqLworYm9vbCBMb2FkZXI6OmxvYWREYXRhKEFQRXhlY3V0aW9uRGF0YSAmIGFuRUQsCisJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsIGNvbnN0IFJ1bnRpbWVJRCAmIGFEYXRhUklEKQoreworCWlmKCBhRGF0YVJJRC5oYXNWYXJpYWJsZSgpICkKKwl7CisJCWF2bV9zaXplX3QgZXJyb3JDb3VudCA9IDA7CisKKwkJRXhlY3V0YWJsZUZvcm0gKiB0aGVFeGVjdXRhYmxlID0gYURhdGFSSUQuZ2V0RXhlY3V0YWJsZSgpOworCisJCVRhYmxlT2ZEYXRhICogYURhdGFUYWJsZSA9IG5ldyBUYWJsZU9mRGF0YSggdGhlRXhlY3V0YWJsZS0+Z2V0RGF0YVNpemUoKSApOworCQlhbkVELT5nZXRSdW50aW1lKGFEYXRhUklEKS5zZXREYXRhVGFibGUoYURhdGFUYWJsZSk7CisKKwkJSW5zdGFuY2VPZk1hY2hpbmUgKiBhTWFjaGluZSA9IGFEYXRhUklELmdldEluc3RhbmNlKCk7CisKKwkJVGFibGVPZkluc3RhbmNlT2ZEYXRhOjpjb25zdF9yYXdfaXRlcmF0b3IgaXREYXRhID0KKwkJCQl0aGVFeGVjdXRhYmxlLT5nZXREYXRhKCkuYmVnaW4oKTsKKwkJVGFibGVPZkluc3RhbmNlT2ZEYXRhOjpjb25zdF9yYXdfaXRlcmF0b3IgZW5kRGF0YSA9CisJCQkJdGhlRXhlY3V0YWJsZS0+Z2V0RGF0YSgpLmVuZCgpOworCQlhdm1fb2Zmc2V0X3Qgb2Zmc2V0ID0gMDsKKworCQkvLyBMT0FEIFBBUkFNRVRFUiAmIFJFVFVSTgorCQlpZiggdGhlRXhlY3V0YWJsZS0+aGFzUGFyYW1SZXR1cm4oKQorCQkJJiYgYU1hY2hpbmUtPmhhc1BhcmFtUmV0dXJuVGFibGUoKSApCisJCXsKKwkJCUJGIHBhcmFtUmV0dXJuQXJndW1lbnQ7CisKKwkJCWFuRUQtPm1ha2VXcml0YWJsZVJ1bnRpbWVGb3JtU3RhdGVUYWJsZSgpOworCisJCQlhdm1fc2l6ZV90IHBhcmFtUmV0dXJuQ291bnQgPSB0aGVFeGVjdXRhYmxlLT5nZXRQYXJhbVJldHVybkNvdW50KCk7CisJCQlmb3IoIDsgb2Zmc2V0IDwgcGFyYW1SZXR1cm5Db3VudCA7ICsraXREYXRhICwgKytvZmZzZXQgKQorCQkJeworCQkJCWFuRUQtPnNldEFzc2lnbmVkKGFEYXRhUklELCBvZmZzZXQsIHRydWUpOworCitBVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoIG9mZnNldCA9PSAoaXREYXRhKS0+Z2V0T2Zmc2V0KCkgKQorCQk8PCAiSW52YWxpZCB2YXJpYWJsZSBvZmZzZXQgaW4gZGF0YSB0YWJsZSAhXG5cdCIKKwkJPDwgc3RyX2hlYWRlciggKml0RGF0YSApCisJCTw8IFNFTkRfRVhJVDsKKworCQkJCXBhcmFtUmV0dXJuQXJndW1lbnQgPSBhTWFjaGluZS0+Z2V0UGFyYW1SZXR1cm4ob2Zmc2V0KTsKKwkJCQlpZiggcGFyYW1SZXR1cm5Bcmd1bWVudC5pbnZhbGlkKCkgJiYgKGl0RGF0YSktPmhhc1ZhbHVlKCkgKQorCQkJCXsKKwkJCQkJcGFyYW1SZXR1cm5Bcmd1bWVudCA9IChpdERhdGEpLT5nZXRWYWx1ZSgpOworCQkJCX0KKworCQkJCWlmKCBwYXJhbVJldHVybkFyZ3VtZW50LnZhbGlkKCkgKQorCQkJCXsKKwkJCQkJaWYoIChpdERhdGEpLT5nZXRNb2RpZmllcigpLmhhc05hdHVyZVJlZmVyZW5jZSgpICkKKwkJCQkJeworCQkJCQkJaWYoIHBhcmFtUmV0dXJuQXJndW1lbnQuaXNub3Q8IEluc3RhbmNlT2ZEYXRhID4oKSApCisJCQkJCQl7CisJCQkJCQkJQVZNX09TX0VYSVQoIEZBSUxFRCApCisJCQkJCQkJCQk8PCAibG9hZGluZzo+IFVuZXhwZWN0ZWQgYSBub24gIgorCQkJCQkJCQkJCSJsdmFsdWUgZm9yIHJlZmVyZW5jZSBwYXJhbSA8PCAiCisJCQkJCQkJCQk8PCBwYXJhbVJldHVybkFyZ3VtZW50LnN0cigpIDw8ICIgPj4gISEhIgorCQkJCQkJCQkJPDwgU0VORF9FWElUOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UgaWYoIChpdERhdGEpLT5nZXRNb2RpZmllcigpLmhhc05hdHVyZU1hY3JvKCkgKQorCQkJCQl7CisJCQkJCQkvLyEhIE5PVEhJTkcKKwkJCQkJfQorCQkJCQllbHNlIGlmKCBhRGF0YVJJRC5nZXRJbnN0YW5jZSgpLT5pc0F1dG9TdGFydCgpICkKKwkJCQkJCQkvLyhub3QgdGhlRXhlY3V0YWJsZS0+Z2V0U3BlY2lmaWVyKCkuaXNDb21wb25lbnRQcm9jZWR1cmUoKSkpCisJCQkJCXsKKwkJCQkJCWlmKCBFTlYuZXZhbChhbkVELCBhRGF0YVJJRCwgcGFyYW1SZXR1cm5Bcmd1bWVudCkgKQorCQkJCQkJeworCQkJCQkJCXBhcmFtUmV0dXJuQXJndW1lbnQgPSBFTlYub3V0VkFMOworCQkJCQkJfQorCQkJCQkJLy8gQVNTRVJUIHBhcmFtRm9ybSBpcyBhbiBMVkFMVUUKKwkJCQkJCWVsc2UgLy9pZiggbm90IChpdERhdGEpLT5nZXRNb2RpZmllcigpLmhhc05hdHVyZVJlZmVyZW5jZSgpICkKKwkJCQkJCXsKKwkJCQkJCQlBVk1fT1NfRVhJVCggRkFJTEVEICkKKwkJCQkJCQkJCTw8ICJsb2FkaW5nOj4gRmFpbGVkIHRvIGV2YWwgaW5pdGlhbCAiCisJCQkJCQkJCQkJInZhbHVlIGZvciBwYXJhbSA8PCAiCisJCQkJCQkJCQk8PCBwYXJhbVJldHVybkFyZ3VtZW50LnN0cigpIDw8ICIgPj4gISEhIgorCQkJCQkJCQkJPDwgU0VORF9FWElUOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcGFyYW1SZXR1cm5Bcmd1bWVudCA9IEVOVi5jcmVhdGVJbml0aWFsKAorCQkJCQkJCQlhbkVELCBhRGF0YVJJRCwgKGl0RGF0YSkgKTsKKwkJCQkJfQorCisJCQkJCWlmKCBub3QgRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc1R5cGVkKAorCQkJCQkJCShpdERhdGEpLT5nZXRUeXBlU3BlY2lmaWVyKCksIHBhcmFtUmV0dXJuQXJndW1lbnQpICkKKwkJCQkJeworCQkJCQkJKytlcnJvckNvdW50OworCisvLwkJCQkJCWdldENvbXBpbGVyVGFibGUoKS5pbmNyRXJyb3JDb3VudCgpOworCQkJCQkJQVZNX09TX1dBUk4KKwkJCQkJCQkJPDwgYU1hY2hpbmUtPmdldEFzdEVsZW1lbnQoKS0+ZXJyb3JMb2NhdGlvbigpCisJCQkJCQkJCTw8ICJsb2FkRGF0YSA6PiBVbmV4cGVjdGVkIDw8ICI7CisKK0FWTV9JRl9ERUJVR19GTEFHKCBMT0FESU5HICkKKwlBVk1fT1NfV0FSTiA8PCBzdGQ6OmVuZGwgPDwgcGFyYW1SZXR1cm5Bcmd1bWVudAorCQkJPDwgIiA+PiBhcyA8PCAiIDw8IChpdERhdGEpLT5nZXRUeXBlU3BlY2lmaWVyKCktPnN0clQoKTsKKworCWFNYWNoaW5lLT5nZXRBc3RFbGVtZW50KCktPmVycm9yTG9jYXRpb24oQVZNX09TX1RSQUNFKQorCQkJPDwgImxvYWREYXRhIDo+IFVuZXhwZWN0ZWQgPDwgIgorCQkJPDwgc3RyX2hlYWRlciggcGFyYW1SZXR1cm5Bcmd1bWVudCApIDw8ICIgPj4gYXMgPDwgIgorCQkJPDwgKGl0RGF0YSktPmdldFR5cGVTcGVjaWZpZXIoKS0+c3RyVCgpCisJCQk8PCAiID4+IHBhcmFtZXRlciBmb3Jcblx0PDwgIiA8PCBzdHJfaGVhZGVyKCAqaXREYXRhICkgPDwgIiA+PiAhISEiCisJCQk8PCBzdGQ6OmVuZGw7CisKK0FWTV9FTFNFCisKKwlBVk1fT1NfV0FSTiA8PCBzdHJfaGVhZGVyKCBwYXJhbVJldHVybkFyZ3VtZW50ICkgPDwgIiA+PiBhcyA8PCAiCisJCQk8PCAoaXREYXRhKS0+Z2V0VHlwZVNwZWNpZmllcigpLT5zdHJUKCk7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggTE9BRElORyApCisKKwkJCQkJCUFWTV9PU19XQVJOIDw8ICIgPj4gcGFyYW1ldGVyIGZvclxuXHQ8PCAiCisJCQkJCQkJCTw8IHN0cl9oZWFkZXIoICppdERhdGEgKSA8PCAiID4+ISEhIgorCQkJCQkJCQk8PCBzdGQ6OmVuZGw7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcGFyYW1SZXR1cm5Bcmd1bWVudCA9CisJCQkJCQkJRU5WLmNyZWF0ZUluaXRpYWwoYW5FRCwgYURhdGFSSUQsIChpdERhdGEpKTsKKwkJCQl9CisKKwkJCQlhRGF0YVRhYmxlLT5zZXQob2Zmc2V0LCBwYXJhbVJldHVybkFyZ3VtZW50KTsKKwkJCX0KKwkJfQorCisKKwkJZm9yKCA7IGl0RGF0YSAhPSBlbmREYXRhIDsgKytpdERhdGEgLCArK29mZnNldCApCisJCXsKKwkJCWFuRUQtPnNldEFzc2lnbmVkKGFEYXRhUklELCBvZmZzZXQsIHRydWUpOworCisJCQlhRGF0YVRhYmxlLT5zZXQob2Zmc2V0LAorCQkJCQlFTlYuY3JlYXRlSW5pdGlhbChhbkVELCBhRGF0YVJJRCwgKGl0RGF0YSkpKTsKKwkJfQorCisJCXJldHVybiggZXJyb3JDb3VudCA9PSAwICk7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKy8qKgorICogbG9hZEluaXRpYWxNb25pdG9yRGF0YQorICovCisvLyEhW01JR1JBVElPTl06TU9OSVRPUiAtLT4gb25DcmVhdGUgUm91dGluZQorLy92b2lkIExvYWRlcjo6bG9hZEluaXRpYWxNb25pdG9yRGF0YSgKKy8vCQlBUEV4ZWN1dGlvbkRhdGEgJiBhbkVELCBjb25zdCBSdW50aW1lSUQgJiBhUklELAorLy8JCUluc3RhbmNlT2ZNYWNoaW5lICogYW5JbnN0YW5jZU1hY2hpbmUsIGJvb2wgaXNSZWN1cnNpdmUpCisvL3sKKy8vCWNvbnN0IFJ1bnRpbWVJRCAmIGFEYXRhUklEID0gYW5FRC0+Z2V0UnVudGltZUlEKGFuSW5zdGFuY2VNYWNoaW5lKTsKKy8vCUV4ZWN1dGFibGVGb3JtICogdGhlRXhlY3V0YWJsZSA9IGFEYXRhUklELmdldEV4ZWN1dGFibGUoKTsKKy8vCisvLwkvLyBMb2FkIERBVEEKKy8vCWlmKCB0aGVFeGVjdXRhYmxlLT5nZXREYXRhKCkubm9uZW1wdHkoKSApCisvLwl7CisvLwkJVGFibGVPZkluc3RhbmNlT2ZEYXRhOjpjb25zdF9yYXdfaXRlcmF0b3IgaXREYXRhID0KKy8vCQkJCXRoZUV4ZWN1dGFibGUtPmdldERhdGEoKS5iZWdpbigpOworLy8JCVRhYmxlT2ZJbnN0YW5jZU9mRGF0YTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGVuZERhdGEgPQorLy8JCQkJdGhlRXhlY3V0YWJsZS0+Z2V0RGF0YSgpLmVuZCgpOworLy8KKy8vCQkvLyBMT0FEIFBBUkFNRVRFUgorLy8JCWlmKCB0aGVFeGVjdXRhYmxlLT5oYXNQYXJhbSgpICYmIGFuSW5zdGFuY2VNYWNoaW5lLT5oYXNQYXJhbVJldHVyblRhYmxlKCkgKQorLy8JCXsKKy8vCQkJYXZtX3NpemVfdCBwYXJhbUNvdW50ID0gdGhlRXhlY3V0YWJsZS0+Z2V0UGFyYW1Db3VudCgpOworLy8JCQlmb3IoIGF2bV9vZmZzZXRfdCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgcGFyYW1Db3VudCA7ICsraXREYXRhICwgKytvZmZzZXQgKQorLy8JCQl7CisvLwkJCQlpZiggKGl0RGF0YSktPmhhc09uV3JpdGVSb3V0aW5lKCkgKQorLy8JCQkJeworLy8JCQkJCUJGIHBhcmFtRm9ybSA9IGFuSW5zdGFuY2VNYWNoaW5lLT5nZXRQYXJhbShvZmZzZXQpOworLy8KKy8vCQkJCQlpZiggcGFyYW1Gb3JtLnZhbGlkKCkgKQorLy8JCQkJCXsKKy8vCQkJCQkJRU5WLmV2YWwoYW5FRCwgYVJJRCwgcGFyYW1Gb3JtKTsKKy8vCQkJCQkJcGFyYW1Gb3JtID0gRU5WLm91dFZBTDsKKy8vCQkJCQl9CisvLwkJCQkJZWxzZSBpZiggRU5WLmdldFJ2YWx1ZShhbkVELCBhRGF0YVJJRCwgKGl0RGF0YSkpLmludmFsaWQoKSApCisvLwkJCQkJeworLy8JCQkJCQlwYXJhbUZvcm0gPSBFTlYuY3JlYXRlSW5pdGlhbChhbkVELCBhRGF0YVJJRCwgKGl0RGF0YSkpOworLy8JCQkJCX0KKy8vCisvLwkJCQkJaWYoIG5vdCBFeHByZXNzaW9uRmFjdG9yeTo6Y29udGFpbnNWYXJpYWJsZSgKKy8vCQkJCQkJCShpdERhdGEpLT5nZXRPbldyaXRlQ29kZSgpLCAoaXREYXRhKSkgKQorLy8JCQkJCXsKKy8vCQkJCQkJaWYoIG5vdCBFTlYud3JpdGVEYXRhKGFuRUQsIGFEYXRhUklELCAoaXREYXRhKSwgcGFyYW1Gb3JtKSApCisvLwkJCQkJCXsKKy8vCQkJCQkJCUFWTV9PU19FWElUKCBGQUlMRUQgKQorLy8JCQkJCQkJCQk8PCAibG9hZEluaXRpYWxNb25pdG9yRGF0YTo+IFVudmFsaWQgIgorLy8JCQkJCQkJCQkJIkluaXRpYWwgVmFsdWUgPDwgIiA8PCBwYXJhbUZvcm0uc3RyKCkKKy8vCQkJCQkJCQkJPDwgIiA+PiBmb3Igb25Jbml0IG1vbml0b3IgIVxuIgorLy8JCQkJCQkJCQk8PCAoaXREYXRhKS0+dG9TdHJpbmcoKQorLy8JCQkJCQkJCQk8PCBTRU5EX0VYSVQ7CisvLwkJCQkJCX0KKy8vCQkJCQl9CisvLwkJCQl9CisvLwkJCX0KKy8vCQl9CisvLworLy8JCWZvciggOyBpdERhdGEgIT0gZW5kRGF0YSA7ICsraXREYXRhICkKKy8vCQl7CisvLwkJCWlmKCAoaXREYXRhKS0+aGFzT25Xcml0ZVJvdXRpbmUoKSApCisvLwkJCXsKKy8vCQkJCUJGIHBhcmFtRm9ybSA9IEVOVi5nZXRSdmFsdWUoYW5FRCwgYURhdGFSSUQsIChpdERhdGEpKTsKKy8vCQkJCWlmKCBwYXJhbUZvcm0uaW52YWxpZCgpICkKKy8vCQkJCXsKKy8vCQkJCQlwYXJhbUZvcm0gPSBFTlYuY3JlYXRlSW5pdGlhbChhbkVELCBhRGF0YVJJRCwgKGl0RGF0YSkpOworLy8JCQkJfQorLy8KKy8vCQkJCWlmKCBub3QgRXhwcmVzc2lvbkZhY3Rvcnk6OmNvbnRhaW5zVmFyaWFibGUoCisvLwkJCQkJCShpdERhdGEpLT5nZXRPbldyaXRlQ29kZSgpLCAoaXREYXRhKSkgKQorLy8JCQkJeworLy8JCQkJCWlmKCBub3QgRU5WLndyaXRlRGF0YShhbkVELCBhRGF0YVJJRCwgKGl0RGF0YSksIHBhcmFtRm9ybSkgKQorLy8JCQkJCXsKKy8vCQkJCQkJQVZNX09TX0VYSVQoIEZBSUxFRCApCisvLwkJCQkJCQkJPDwgImxvYWRJbml0aWFsTW9uaXRvckRhdGE6PiBVbnZhbGlkICIKKy8vCQkJCQkJCQkJIkluaXRpYWwgVmFsdWUgPDwgIiA8PCBwYXJhbUZvcm0uc3RyKCkKKy8vCQkJCQkJCQk8PCAiID4+IGZvciBvbkluaXQgbW9uaXRvciAhXG4iCisvLwkJCQkJCQkJPDwgKGl0RGF0YSktPnRvU3RyaW5nKCkKKy8vCQkJCQkJCQk8PCBTRU5EX0VYSVQ7CisvLwkJCQkJfQorLy8JCQkJfQorLy8JCQl9CisvLwkJfQorLy8JfQorLy8KKy8vCS8vIExvYWQgTUFDSElORQorLy8JaWYoIGlzUmVjdXJzaXZlICYmIHRoZUV4ZWN1dGFibGUtPmdldE1hY2hpbmVJbnN0YW5jZSgpLm5vbmVtcHR5KCkgKQorLy8JeworLy8JCVRhYmxlT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGl0TWFjaGluZSA9CisvLwkJCQl0aGVFeGVjdXRhYmxlLT5pbnN0YW5jZV9zdGF0aWNfYmVnaW4oKTsKKy8vCQlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBlbmRNYWNoaW5lID0KKy8vCQkJCXRoZUV4ZWN1dGFibGUtPmluc3RhbmNlX3N0YXRpY19lbmQoKTsKKy8vCQlmb3IoICA7IGl0TWFjaGluZSAhPSBlbmRNYWNoaW5lIDsgKytpdE1hY2hpbmUgKQorLy8JCXsKKy8vCQkJbG9hZEluaXRpYWxNb25pdG9yRGF0YShhbkVELCBhUklELAorLy8JCQkJCSgqaXRNYWNoaW5lKS5yYXdNYWNoaW5lKCksIGlzUmVjdXJzaXZlKTsKKy8vCQl9CisvLwl9CisvL30KKworCisvKioKKyAqIGxvYWRCdWZmZXIKKyAqLworYm9vbCBMb2FkZXI6OmxvYWRCdWZmZXIoQVBFeGVjdXRpb25EYXRhICYgYW5FRCwKKwkJY29uc3QgUnVudGltZUlEICYgYVJJRCwgY29uc3QgUnVudGltZUlEICYgbG9hZE1hY2hpbmVSSUQpCit7CisJRXhlY3V0YWJsZUZvcm0gKiBsb2FkRXhlY3V0YWJsZSA9IGxvYWRNYWNoaW5lUklELmdldEV4ZWN1dGFibGUoKTsKKworCWlmKCBsb2FkRXhlY3V0YWJsZS0+Z2V0QnVmZmVyKCkubm9uZW1wdHkoKSApCisJeworCQlUYWJsZU9mQnVmZmVyVCBhQnVmZmVyVGFibGUoIGxvYWRFeGVjdXRhYmxlLT5nZXRCdWZmZXIoKS5zaXplKCkgKTsKKwkJYW5FRC0+Z2V0UnVudGltZSggbG9hZE1hY2hpbmVSSUQgKS5zZXRCdWZmZXJUYWJsZShhQnVmZmVyVGFibGUpOworCisJCVRhYmxlT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGl0QnVmZmVyID0gbG9hZEV4ZWN1dGFibGUtPmdldEJ1ZmZlcigpLmJlZ2luKCk7CisJCVRhYmxlT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGVuZEJ1ZmZlciA9IGxvYWRFeGVjdXRhYmxlLT5nZXRCdWZmZXIoKS5lbmQoKTsKKwkJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDAgOyBpdEJ1ZmZlciA8IGVuZEJ1ZmZlciA7ICsraXRCdWZmZXIgLCArK29mZnNldCApCisJCXsKKwkJCXN3aXRjaCggKCppdEJ1ZmZlcikuZ2V0UG9saWN5U3BlY2lmaWVyS2luZCgpICkKKwkJCXsKKwkJCQljYXNlIFRZUEVfRklGT19TUEVDSUZJRVI6CisJCQkJeworCQkJCQlhQnVmZmVyVGFibGUuc2V0KG9mZnNldCwKKwkJCQkJCQluZXcgRmlmb0J1ZmZlcigoKCppdEJ1ZmZlcikucmF3QnVmZmVyKCkpKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljYXNlIFRZUEVfTElGT19TUEVDSUZJRVI6CisJCQkJeworCQkJCQlhQnVmZmVyVGFibGUuc2V0KG9mZnNldCwKKwkJCQkJCQluZXcgTGlmb0J1ZmZlcigoKCppdEJ1ZmZlcikucmF3QnVmZmVyKCkpKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCisJCQkJY2FzZSBUWVBFX01VTFRJX0ZJRk9fU1BFQ0lGSUVSOgorCQkJCXsKKwkJCQkJYUJ1ZmZlclRhYmxlLnNldChvZmZzZXQsCisJCQkJCQkJbmV3IE11bHRpRmlmb0J1ZmZlcigoKCppdEJ1ZmZlcikucmF3QnVmZmVyKCkpKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljYXNlIFRZUEVfTVVMVElfTElGT19TUEVDSUZJRVI6CisJCQkJeworCQkJCQlhQnVmZmVyVGFibGUuc2V0KG9mZnNldCwKKwkJCQkJCQluZXcgTXVsdGlMaWZvQnVmZmVyKCgoKml0QnVmZmVyKS5yYXdCdWZmZXIoKSkpKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisKKwkJCQljYXNlIFRZUEVfUkFNX1NQRUNJRklFUjoKKwkJCQl7CisJCQkJCWFCdWZmZXJUYWJsZS5zZXQob2Zmc2V0LAorCQkJCQkJCW5ldyBSYW1CdWZmZXIoKCgqaXRCdWZmZXIpLnJhd0J1ZmZlcigpKSkpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQljYXNlIFRZUEVfTVVMVElTRVRfU1BFQ0lGSUVSOgorCQkJCXsKKwkJCQkJYUJ1ZmZlclRhYmxlLnNldChvZmZzZXQsCisJCQkJCQkJbmV3IE11bHRpc2V0QnVmZmVyKCgoKml0QnVmZmVyKS5yYXdCdWZmZXIoKSkpKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWNhc2UgVFlQRV9TRVRfU1BFQ0lGSUVSOgorCQkJCXsKKwkJCQkJYUJ1ZmZlclRhYmxlLnNldChvZmZzZXQsCisJCQkJCQkJbmV3IFNldEJ1ZmZlcigoKCppdEJ1ZmZlcikucmF3QnVmZmVyKCkpKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlBVk1fT1NfRVhJVCggRkFJTEVEICkKKwkJCQkJCQk8PCAidGhlQnVmZmVyIE5hdHVyZSBpcyB1bmV4cGVjdGVkIgorCQkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCQlhQnVmZmVyVGFibGUuc2V0KG9mZnNldCwKKwkJCQkJCQluZXcgRmlmb0J1ZmZlcigoKCppdEJ1ZmZlcikucmF3QnVmZmVyKCkpKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKKy8qKgorICogbG9hZE1hY2hpbmUKKyAqLwordm9pZCBMb2FkZXI6OmxvYWRNYWNoaW5lKEFQRXhlY3V0aW9uRGF0YSAmIGFuRUQsCisJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsIGNvbnN0IFJ1bnRpbWVJRCAmIGxvYWRNYWNoaW5lUklELAorCQlpbnQgJiB0aGVQaWQsIGF2bV9vZmZzZXRfdCAmIHRoZU9mZnNldCkKK3sKKwlFeGVjdXRhYmxlRm9ybSAqIGxvYWRFeGVjdXRhYmxlID0gbG9hZE1hY2hpbmVSSUQuZ2V0RXhlY3V0YWJsZSgpOworCisJaWYoIGxvYWRFeGVjdXRhYmxlLT5nZXRJbnN0YW5jZVN0YXRpYygpLm5vbmVtcHR5KCkgKQorCXsKKwkJaWYoIGxvYWRFeGVjdXRhYmxlLT5oYXNJbnN0YW5jZVN0YXRpY1RoaXMoKSApCisJCXsKKwkJCWFuRUQtPmdldFJ1bnRpbWUoIGxvYWRNYWNoaW5lUklEICkuYXBwZW5kQ2hpbGQoIGxvYWRNYWNoaW5lUklEICk7CisJCX0KKworCQlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBpdEluc3RhbmNlID0KKwkJCQlsb2FkRXhlY3V0YWJsZS0+aW5zdGFuY2Vfc3RhdGljX2JlZ2luKCk7CisJCVRhYmxlT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGVuZEluc3RhbmNlID0KKwkJCQlsb2FkRXhlY3V0YWJsZS0+aW5zdGFuY2Vfc3RhdGljX2VuZCgpOworCQlmb3IoICA7IGl0SW5zdGFuY2UgIT0gZW5kSW5zdGFuY2UgOyArK2l0SW5zdGFuY2UgKQorCQl7CisJCQlsb2FkTWFjaGluZUluc3RhbmNlKCBhbkVEICwgbG9hZE1hY2hpbmVSSUQsCisJCQkJCSgqaXRJbnN0YW5jZSkucmF3TWFjaGluZSgpLCB0aGVQaWQsIHRoZU9mZnNldCk7CisJCX0KKwl9Cit9CisKKworLyoqCisgKiBkeW5hbWljTG9hZE1hY2hpbmUKKyAqLworUnVudGltZUZvcm0gKiBMb2FkZXI6OmR5bmFtaWNMb2FkTWFjaGluZShBUEV4ZWN1dGlvbkRhdGEgJiBhbkVELAorCQljb25zdCBSdW50aW1lSUQgJiBhUklELCBSdW50aW1lRm9ybSAqIGFNb2RlbFJGLAorCQljb25zdCBSdW50aW1lSUQgJiBhUGFyZW50UklELCBPcGVyYXRvciAqIGFTY2hlZHVsZU9wKQoreworCUluc3RhbmNlT2ZNYWNoaW5lICogYU1hY2hpbmUgPSBhTW9kZWxSRi0+Z2V0SW5zdGFuY2UoKS0+Y2xvbmUoKTsKKy8vCUJGIGJmTWFjaGluZSggYU1hY2hpbmUgKTsKKworCWFNYWNoaW5lLT5zZXRJbnN0YW5jaWF0aW9uQ291bnQoIGFNb2RlbFJGLT5nZXRJbnN0YW5jaWF0aW9uQ291bnQoKSApOworCisJRXhlY3V0YWJsZUZvcm0gKiB0aGVFeGVjdXRhYmxlID0gYU1hY2hpbmUtPmdldEV4ZWN1dGFibGUoKTsKKworCWFNYWNoaW5lLT51cGRhdGVVZmlkKCBhTW9kZWxSRi0+Z2V0SW5zdGFuY2lhdGlvbkNvdW50KCkgKTsKKworCWFNYWNoaW5lLT5zZXRPZmZzZXQoIGFuRUQtPmdldFJ1bnRpbWUoYVBhcmVudFJJRCkuZ2V0Q2hpbGRUYWJsZSgpLT5zaXplKCkgKTsKKworCitBVk1fSUZfREVCVUdfRkxBRyggTE9BRElORyApCisJQVZNX09TX1RSQUNFIDw8IElOQ1JfSU5ERU5UX1RBQgorCQkJPDwgIjwgYmVnaW4gbG9hZGluZyBtYWNoaW5lIGluc3RhbmNlIDwgIgorCQkJPDwgYU1hY2hpbmUtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIiA+IiA8PCBzdGQ6OmVuZGw7CisKKwlBVk1fT1NfVFJBQ0UgPDwgaW5jcl9zdHJlYW0oIGFNYWNoaW5lICkgPDwgVEFCIDw8ICJcdD4+Pj4gcGFyZW50IGlzOiAiCisJCQk8PCBzdGQ6OmVuZGw7CisKKwlhUGFyZW50UklELnRvU3RyZWFtKEFWTV9PU19UUkFDRSA8PCBJTkNSMl9JTkRFTlQpOworCisJQVZNX09TX1RSQUNFIDw8IEVPTF9ERUNSMl9JTkRFTlQ7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggTE9BRElORyApCisKKworCS8vIFBJRCAmIE9GRlNFVCBmb3IgdGhlIHJ1bnRpbWUgbWFjaGluZQorCWF2bV9vZmZzZXRfdCB0aGVPZmZzZXQgPSBhbkVELT5nZXRUYWJsZU9mUnVudGltZSgpLnNpemUoKTsKKwlpbnQgdGhlUGlkID0gYW5FRC0+Z2V0UnVudGltZUlEKHRoZU9mZnNldCAtIDEpLmdldFJpZCgpICsgMTsKKworCWF2bV9zaXplX3QgbmV3TWFjaGluZUNvdW50ID0KKwkJCTEgKyB0aGVFeGVjdXRhYmxlLT5nZXRyZWNNYWNoaW5lQ291bnQoKSArIHRoZU9mZnNldDsKKworCWludCBwaWQgPSB0aGVQaWQrKzsKKwlhdm1fb2Zmc2V0X3Qgb2Zmc2V0ID0gdGhlT2Zmc2V0Kys7CisKKworCS8vISEgVE9ETyBSRVNJWkUgJiBNRU1PUlkKKwlhbkVELT5yZXNpemUoIG5ld01hY2hpbmVDb3VudCApOworCisKKwlSdW50aW1lSUQgbG9hZE1hY2hpbmVSSUQoCisJCQlhTW9kZWxSRi0+Z2V0UklEKCksIGFQYXJlbnRSSUQsIHBpZCwgb2Zmc2V0LCBhTWFjaGluZSk7CisKKwlsb2FkTWFjaGluZVJJRC5zZXREeW5hbWljTG9hZGVkKCB0cnVlICk7CisKKwltQ29uZmlndXJhdGlvbi5hcHBlbmRSSUQoIGxvYWRNYWNoaW5lUklEICk7CisKKwlSdW50aW1lRm9ybSAqIGFSRiA9IG5ldyBSdW50aW1lRm9ybSggbG9hZE1hY2hpbmVSSUQgKTsKKwlhbkVELT5zYXZlUnVudGltZUZvcm0ob2Zmc2V0LCBhUkYpOworCisvLyE/ISBDb2RlIHBvdXIgw6l2b2x1dGlvbiBmdXR1cmUKKy8vCWFSRi0+c2V0Tm9kZUNvbmRpdGlvbiggRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX1RSVUUgKTsKKy8vCWFSRi0+c2V0Tm9kZVRpbWVkQ29uZGl0aW9uKCBFeHByZXNzaW9uQ29uc3RhbnQ6OkJPT0xFQU5fVFJVRSApOworCisJaWYoIGFNYWNoaW5lLT5oYXNPbkNyZWF0ZSgpICkKKwl7CisJCW1PbkNyZWF0ZVJvdXRpbWUuYXBwZW5kKCBsb2FkTWFjaGluZVJJRCApOworCisJCWFuRUQtPnNldFJ1bnRpbWVGb3JtU3RhdGUob2Zmc2V0LCBQUk9DRVNTX0NSRUFUSU5HX1NUQVRFKTsKKwl9CisJZWxzZQorCXsKKwkJYW5FRC0+c2V0UnVudGltZUZvcm1TdGF0ZShvZmZzZXQsIFBST0NFU1NfRElTQUJMRURfU1RBVEUpOworCX0KKworCVJ1bnRpbWVGb3JtICYgYVBhcmVudFJGID0gYW5FRC5nZXRXcml0YWJsZVJ1bnRpbWUoIGFQYXJlbnRSSUQgKTsKKworCWFQYXJlbnRSRi5tYWtlV3JpdGFibGVDaGlsZFRhYmxlKCk7CisJYVBhcmVudFJGLmFwcGVuZENoaWxkKCBsb2FkTWFjaGluZVJJRCApOworCisJYVBhcmVudFJGLnNldE9uU2NoZWR1bGUoCisJCQlsb2FkU2NoZWR1bGVyQ29kZShhbkVELCBhUGFyZW50UkYsCisJCQkJCWFQYXJlbnRSRi5nZXRFeGVjdXRhYmxlKCktPmdldE9uU2NoZWR1bGUoKSwgdHJ1ZSkgKTsKKworCS8vIExvYWQgREFUQQorCWlmKCBsb2FkRGF0YShhbkVELCBhUklELCBsb2FkTWFjaGluZVJJRCkgKQorCXsKKwkJaWYoIGxvYWRNYWNoaW5lUklELmhhc1ZhcmlhYmxlKCkgKQorCQl7CisvLyEhW01JR1JBVElPTl06TU9OSVRPUiAtLT4gb25DcmVhdGUgUm91dGluZQorLy8JCQlsb2FkSW5pdGlhbE1vbml0b3JEYXRhKGFuRUQsIGFSSUQsCisvLwkJCQkJbG9hZE1hY2hpbmVSSUQuZ2V0SW5zdGFuY2UoKSwgZmFsc2UpOworCQl9CisJfQorCWVsc2UKKwl7CisJCUFWTV9PU19FWElUKCBGQUlMRUQgKQorCQkJCTw8ICJkeW5hbWljTG9hZE1hY2hpbmU6PiBsb2FkRGF0YSBmYWlsZWQiCisJCQkJPDwgU0VORF9FWElUOworCX0KKworCS8vIExvYWQgQlVGRkVSCisJaWYoIG5vdCBsb2FkQnVmZmVyKGFuRUQsIGFSSUQsIGxvYWRNYWNoaW5lUklEKSApCisJeworCQlBVk1fT1NfRVhJVCggRkFJTEVEICkKKwkJCQk8PCAiZHluYW1pY0xvYWRNYWNoaW5lOj4gbG9hZEJ1ZmZlciBmYWlsZWQiCisJCQkJPDwgU0VORF9FWElUOworCX0KKworCS8vIExvYWQgUk9VVEVSCisJaWYoIG5vdCBkeW5hbWljTG9hZFJvdXRlcihhbkVELCBsb2FkTWFjaGluZVJJRCkgKQorCXsKKwkJQVZNX09TX0VYSVQoIEZBSUxFRCApCisJCQkJPDwgImR5bmFtaWNMb2FkTWFjaGluZTo+IGR5bmFtaWNMb2FkUm91dGVyIGZhaWxlZCIKKwkJCQk8PCBTRU5EX0VYSVQ7CisJfQorCisKKwkvLyBMb2FkIE1BQ0hJTkUKKwlsb2FkTWFjaGluZShhbkVELCBsb2FkTWFjaGluZVJJRCwgbG9hZE1hY2hpbmVSSUQsIHRoZVBpZCwgdGhlT2Zmc2V0KTsKKworCS8vIHNldCBTQ0hFRFVMRQorCWlmKCB0aGVFeGVjdXRhYmxlLT5oYXNPblNjaGVkdWxlKCkgKQorCXsKKwkJYVJGLT5zZXRPblNjaGVkdWxlKAorCQkJCWxvYWRTY2hlZHVsZXJDb2RlKGFuRUQsICgqYVJGKSwKKwkJCQkJCXRoZUV4ZWN1dGFibGUtPmdldE9uU2NoZWR1bGUoKSwgdHJ1ZSkgKTsKKwl9CisKKworQVZNX0lGX0RFQlVHX0ZMQUcoIExPQURJTkcgKQorCUFWTV9PU19UUkFDRSA8PCBUQUJfREVDUl9JTkRFTlQKKwkJCTw8ICI+IGVuZCBsb2FkaW5nIG1hY2hpbmUgaW5zdGFuY2UgPCAiCisJCQk8PCBhTWFjaGluZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiID4iIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBMT0FESU5HICkKKworCisJcmV0dXJuKCBhUkYgKTsKK30KKworCisKK1J1bnRpbWVGb3JtICogTG9hZGVyOjpkeW5hbWljTG9hZE1hY2hpbmUoQVBFeGVjdXRpb25EYXRhICYgYW5FRCwKKwkJY29uc3QgUnVudGltZUlEICYgYVJJRCwgSW5zdGFuY2VPZk1hY2hpbmUgKiBhbkluc3RhbmNlRHluYW1pYywKKwkJY29uc3QgUnVudGltZUlEICYgYVBhcmVudFJJRCwgT3BlcmF0b3IgKiBhU2NoZWR1bGVPcCkKK3sKKwlJbnN0YW5jZU9mTWFjaGluZSAqIGFNYWNoaW5lID0gYW5JbnN0YW5jZUR5bmFtaWMtPmNsb25lKCk7CisvLwlCRiBiZk1hY2hpbmUoIGFNYWNoaW5lICk7CisKKwlhTWFjaGluZS0+c2V0SW5zdGFuY2lhdGlvbkNvdW50KAorCQkJYW5JbnN0YW5jZUR5bmFtaWMtPmdldEluc3RhbmNpYXRpb25Db3VudCgpICk7CisKKwlFeGVjdXRhYmxlRm9ybSAqIHRoZUV4ZWN1dGFibGUgPSBhTWFjaGluZS0+Z2V0RXhlY3V0YWJsZSgpOworCisvLwlhTWFjaGluZS0+dXBkYXRlVWZpZCggYW5JbnN0YW5jZUR5bmFtaWMtPmdldEluc3RhbmNpYXRpb25Db3VudCgpICk7CisKKwlhTWFjaGluZS0+c2V0T2Zmc2V0KAorCQkJYW5FRC0+Z2V0UnVudGltZShhUGFyZW50UklEKS5nZXRDaGlsZFRhYmxlKCktPnNpemUoKSApOworCisKK0FWTV9JRl9ERUJVR19GTEFHKCBMT0FESU5HICkKKwlBVk1fT1NfVFJBQ0UgPDwgSU5DUl9JTkRFTlRfVEFCCisJCQk8PCAiPCBiZWdpbiBsb2FkaW5nIG1hY2hpbmUgaW5zdGFuY2UgPCAiCisJCQk8PCBhTWFjaGluZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiID4iIDw8IHN0ZDo6ZW5kbDsKKworCUFWTV9PU19UUkFDRSA8PCB0b19zdHJlYW0oIGFNYWNoaW5lICkgPDwgVEFCIDw8ICJcdD4+Pj4gcGFyZW50IGlzOiAiCisJCQk8PCBzdGQ6OmVuZGw7CisKKwlhUGFyZW50UklELnRvU3RyZWFtKEFWTV9PU19UUkFDRSA8PCBJTkNSMl9JTkRFTlQpOworCisJQVZNX09TX1RSQUNFIDw8IEVPTF9ERUNSMl9JTkRFTlQ7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggTE9BRElORyApCisKKworCS8vIFBJRCAmIE9GRlNFVCBmb3IgdGhlIHJ1bnRpbWUgbWFjaGluZQorCWF2bV9vZmZzZXRfdCB0aGVPZmZzZXQgPSBhbkVELT5nZXRUYWJsZU9mUnVudGltZSgpLnNpemUoKTsKKwlpbnQgdGhlUGlkID0gYW5FRC0+Z2V0UnVudGltZUlEKHRoZU9mZnNldCAtIDEpLmdldFJpZCgpICsgMTsKKworCWF2bV9zaXplX3QgbmV3TWFjaGluZUNvdW50ID0KKwkJCTEgKyB0aGVFeGVjdXRhYmxlLT5nZXRyZWNNYWNoaW5lQ291bnQoKSArIHRoZU9mZnNldDsKKworCWludCBwaWQgPSB0aGVQaWQrKzsKKwlhdm1fb2Zmc2V0X3Qgb2Zmc2V0ID0gdGhlT2Zmc2V0Kys7CisKKworCS8vISEgVE9ETyBSRVNJWkUgJiBNRU1PUlkKKwlhbkVELT5yZXNpemUoIG5ld01hY2hpbmVDb3VudCApOworCisKKwlSdW50aW1lSUQgbG9hZE1hY2hpbmVSSUQoYVBhcmVudFJJRCwgcGlkLCBvZmZzZXQsIGFNYWNoaW5lKTsKKworCWxvYWRNYWNoaW5lUklELnNldER5bmFtaWNMb2FkZWQoIHRydWUgKTsKKworCW1Db25maWd1cmF0aW9uLmFwcGVuZFJJRCggbG9hZE1hY2hpbmVSSUQgKTsKKworCVJ1bnRpbWVGb3JtICogYVJGID0gbmV3IFJ1bnRpbWVGb3JtKCBsb2FkTWFjaGluZVJJRCApOworCWFuRUQtPnNhdmVSdW50aW1lRm9ybShvZmZzZXQsIGFSRik7CisKKy8vIT8hIENvZGUgcG91ciDDqXZvbHV0aW9uIGZ1dHVyZQorLy8JYVJGLT5zZXROb2RlQ29uZGl0aW9uKCBFeHByZXNzaW9uQ29uc3RhbnQ6OkJPT0xFQU5fVFJVRSApOworLy8JYVJGLT5zZXROb2RlVGltZWRDb25kaXRpb24oIEV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9UUlVFICk7CisKKwlpZiggYU1hY2hpbmUtPmhhc09uQ3JlYXRlKCkgKQorCXsKKwkJbU9uQ3JlYXRlUm91dGltZS5hcHBlbmQoIGxvYWRNYWNoaW5lUklEICk7CisKKwkJYW5FRC0+c2V0UnVudGltZUZvcm1TdGF0ZShvZmZzZXQsIFBST0NFU1NfQ1JFQVRJTkdfU1RBVEUpOworCX0KKwllbHNlCisJeworCQlhbkVELT5zZXRSdW50aW1lRm9ybVN0YXRlKG9mZnNldCwgUFJPQ0VTU19ESVNBQkxFRF9TVEFURSk7CisJfQorCisJUnVudGltZUZvcm0gJiBhUGFyZW50UkYgPSBhbkVELmdldFdyaXRhYmxlUnVudGltZSggYVBhcmVudFJJRCApOworCisJYVBhcmVudFJGLm1ha2VXcml0YWJsZUNoaWxkVGFibGUoKTsKKwlhUGFyZW50UkYuYXBwZW5kQ2hpbGQoIGxvYWRNYWNoaW5lUklEICk7CisKKwlhUGFyZW50UkYuc2V0T25TY2hlZHVsZSggbG9hZFNjaGVkdWxlckNvZGUoYW5FRCwgYVBhcmVudFJGLAorCQkJYVBhcmVudFJGLmdldEV4ZWN1dGFibGUoKS0+Z2V0T25TY2hlZHVsZSgpLCBmYWxzZSkgKTsKKworCS8vIExvYWQgREFUQQorCWlmKCBsb2FkRGF0YShhbkVELCBhUklELCBsb2FkTWFjaGluZVJJRCkgKQorCXsKKwkJaWYoIGxvYWRNYWNoaW5lUklELmhhc1ZhcmlhYmxlKCkgKQorCQl7CisvLwkJCWxvYWRJbml0aWFsTW9uaXRvckRhdGEoYW5FRCwgYVJJRCwKKy8vCQkJCQlsb2FkTWFjaGluZVJJRC5nZXRJbnN0YW5jZSgpLCBmYWxzZSk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJQVZNX09TX0VYSVQoIEZBSUxFRCApCisJCQkJPDwgImR5bmFtaWNMb2FkTWFjaGluZTo+IGxvYWREYXRhIGZhaWxlZCIKKwkJCQk8PCBTRU5EX0VYSVQ7CisJfQorCisJLy8gTG9hZCBCVUZGRVIKKwlpZiggbm90IGxvYWRCdWZmZXIoYW5FRCwgYVJJRCwgbG9hZE1hY2hpbmVSSUQpICkKKwl7CisJCUFWTV9PU19FWElUKCBGQUlMRUQgKQorCQkJCTw8ICJkeW5hbWljTG9hZE1hY2hpbmU6PiBsb2FkQnVmZmVyIGZhaWxlZCIKKwkJCQk8PCBTRU5EX0VYSVQ7CisJfQorCisJLy8gTG9hZCBST1VURVIKKwlpZiggbm90IGR5bmFtaWNMb2FkUm91dGVyKGFuRUQsIGxvYWRNYWNoaW5lUklEKSApCisJeworCQlBVk1fT1NfRVhJVCggRkFJTEVEICkKKwkJCQk8PCAiZHluYW1pY0xvYWRNYWNoaW5lOj4gZHluYW1pY0xvYWRSb3V0ZXIgZmFpbGVkIgorCQkJCTw8IFNFTkRfRVhJVDsKKwl9CisKKworCS8vIExvYWQgTUFDSElORQorCWxvYWRNYWNoaW5lKGFuRUQsIGxvYWRNYWNoaW5lUklELCBsb2FkTWFjaGluZVJJRCwgdGhlUGlkLCB0aGVPZmZzZXQpOworCisJLy8gc2V0IFNDSEVEVUxFCisJaWYoIHRoZUV4ZWN1dGFibGUtPmhhc09uU2NoZWR1bGUoKSApCisJeworCQlhUkYtPnNldE9uU2NoZWR1bGUoCisJCQkJbG9hZFNjaGVkdWxlckNvZGUoYW5FRCwgKCphUkYpLAorCQkJCQkJdGhlRXhlY3V0YWJsZS0+Z2V0T25TY2hlZHVsZSgpLCB0cnVlKSApOworCX0KKworCitBVk1fSUZfREVCVUdfRkxBRyggTE9BRElORyApCisJQVZNX09TX1RSQUNFIDw8IFRBQl9ERUNSX0lOREVOVAorCQkJPDwgIj4gZW5kIGxvYWRpbmcgbWFjaGluZSBpbnN0YW5jZSA8ICIKKwkJCTw8IGFNYWNoaW5lLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8ICIgPiIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIExPQURJTkcgKQorCisKKwlyZXR1cm4oIGFSRiApOworfQorCisKKy8qKgorICogZ2V0Um91dGVyNE1vZGVsCisgKi8KK2NvbnN0IFJvdXRlciAmIExvYWRlcjo6Z2V0Um91dGVyNE1vZGVsKAorCQlBUEV4ZWN1dGlvbkRhdGEgJiBhbkVELCBSdW50aW1lSUQgJiBhUm91dGluZ1JJRCkKK3sKKwl3aGlsZSggYVJvdXRpbmdSSUQudmFsaWQoKSApCisJeworCQlpZiggYVJvdXRpbmdSSUQuZ2V0RXhlY3V0YWJsZSgpLT5oYXNSb3V0ZXI0TW9kZWwoKSApCisJCXsKKwkJCWNvbnN0IFJvdXRlciAmIGFSb3V0ZXIgPSBhUm91dGluZ1JJRC5nZXRFeGVjdXRhYmxlKCkKKwkJCQkJLT5nZXRSb3V0ZXI0TW9kZWwoIGFSb3V0aW5nUklELmdldEV4ZWN1dGFibGUoKSApOworCisJCQlpZiggYVJvdXRlci52YWxpZCgpICkKKwkJCXsKKwkJCQlyZXR1cm4oIGFSb3V0ZXIgKTsKKwkJCX0KKwkJfQorCisJCWFSb3V0aW5nUklEID0gYVJvdXRpbmdSSUQuZ2V0UFJJRCgpOworCX0KKworCXJldHVybiggUm91dGVyOjpfTlVMTF8gKTsKK30KKworLyoqCisgKiBjbG9uZVVwZGF0ZVJvdXRlcgorICovCitzdGF0aWMgUm91dGVyIGNsb25lVXBkYXRlUm91dGVyKGNvbnN0IFJvdXRlciAmIGxvYWRSb3V0ZXIsCisJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSb3V0aW5nUklELAorCQljb25zdCBSdW50aW1lSUQgJiBsb2FkTWFjaGluZVJJRCkKK3sKKwlhdm1fc2l6ZV90IHJvdXRlQ291bnQgPSBsb2FkUm91dGVyLmdldFJvdXRlSUQoKTsKKworCVJvdXRlciBuZXdSb3V0ZXIobG9hZE1hY2hpbmVSSUQuZ2V0SW5zdGFuY2UoKSwgcm91dGVDb3VudCwgcm91dGVDb3VudCk7CisKKwlSb3V0aW5nRGF0YSBhUm91dGluZ0RhdGE7CisKKwkvLyBHTE9CQUwgSU5QVVQgb3IgT1VUUFVUIFJPVVRFCisJYXZtX3NpemVfdCBvZmZzZXQgPSAwOworCWZvciggOyBvZmZzZXQgPCByb3V0ZUNvdW50IDsgKytvZmZzZXQgKQorCXsKKwkJYVJvdXRpbmdEYXRhID0gbG9hZFJvdXRlci5nZXRJbnB1dFJvdXRpbmcob2Zmc2V0KTsKKwkJaWYoIGFSb3V0aW5nRGF0YS52YWxpZCgpICkKKwkJeworCQkJYVJvdXRpbmdEYXRhLm1ha2VXcml0YWJsZSgpOworCQkJYVJvdXRpbmdEYXRhLnNldFJ1bnRpbWVSSUQoYVJvdXRpbmdSSUQpOworCisJCQluZXdSb3V0ZXIuc2V0SW5wdXRSb3V0aW5nKG9mZnNldCwgYVJvdXRpbmdEYXRhKTsKKwkJfQorCisJCS8vIE5PIEVMU0UgYmVjYXVzZSBvZiBJTk9VVCBQT1JUCisJCWFSb3V0aW5nRGF0YSA9IGxvYWRSb3V0ZXIuZ2V0T3V0cHV0Um91dGluZyhvZmZzZXQpOworCQlpZiggYVJvdXRpbmdEYXRhLnZhbGlkKCkgKQorCQl7CisJCQlhUm91dGluZ0RhdGEubWFrZVdyaXRhYmxlKCk7CisJCQlhUm91dGluZ0RhdGEuc2V0UnVudGltZVJJRChhUm91dGluZ1JJRCk7CisKKwkJCW5ld1JvdXRlci5zZXRPdXRwdXRSb3V0aW5nKG9mZnNldCwgYVJvdXRpbmdEYXRhKTsKKwkJfQorCX0KKworCisJLy8gTE9DQUwgSU5QVVQgUk9VVEUKKwlvZmZzZXQgPSBsb2FkUm91dGVyLmdldFJvdXRlSUQoKTsKKwlyb3V0ZUNvdW50ID0gbG9hZFJvdXRlci5nZXRJbnB1dFJvdXRpbmdUYWJsZSgpLnNpemUoKTsKKwlmb3IoIDsgb2Zmc2V0IDwgcm91dGVDb3VudCA7ICsrb2Zmc2V0ICkKKwl7CisJCWFSb3V0aW5nRGF0YSA9IGxvYWRSb3V0ZXIuZ2V0SW5wdXRSb3V0aW5nKG9mZnNldCk7CisJCWlmKCBhUm91dGluZ0RhdGEudmFsaWQoKSApCisJCXsKKwkJCWFSb3V0aW5nRGF0YS5tYWtlV3JpdGFibGUoKTsKKwkJCWFSb3V0aW5nRGF0YS5zZXRSdW50aW1lUklEKGFSb3V0aW5nUklEKTsKKworCQkJbmV3Um91dGVyLmFwcGVuZElucHV0Um91dGluZyggYVJvdXRpbmdEYXRhICk7CisJCX0KKwl9CisKKwkvLyBMT0NBTCBPVVBVVCBST1VURQorCW9mZnNldCA9IGxvYWRSb3V0ZXIuZ2V0Um91dGVJRCgpOworCXJvdXRlQ291bnQgPSBsb2FkUm91dGVyLmdldE91dHB1dFJvdXRpbmdUYWJsZSgpLnNpemUoKTsKKwlmb3IoIDsgb2Zmc2V0IDwgcm91dGVDb3VudCA7ICsrb2Zmc2V0ICkKKwl7CisJCWFSb3V0aW5nRGF0YSA9IGxvYWRSb3V0ZXIuZ2V0T3V0cHV0Um91dGluZyhvZmZzZXQpOworCQlpZiggYVJvdXRpbmdEYXRhLnZhbGlkKCkgKQorCQl7CisJCQlhUm91dGluZ0RhdGEubWFrZVdyaXRhYmxlKCk7CisJCQlhUm91dGluZ0RhdGEuc2V0UnVudGltZVJJRChhUm91dGluZ1JJRCk7CisKKwkJCW5ld1JvdXRlci5hcHBlbmRPdXRwdXRSb3V0aW5nKCBhUm91dGluZ0RhdGEgKTsKKwkJfQorCX0KKworCXJldHVybiggbmV3Um91dGVyICk7Cit9CisKKworLyoqCisgKiBsb2FkUm91dGVyCisgKi8KK2Jvb2wgTG9hZGVyOjpsb2FkUm91dGVyKEFQRXhlY3V0aW9uRGF0YSAmIGFuRUQsCisJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsIGNvbnN0IFJ1bnRpbWVJRCAmIGxvYWRNYWNoaW5lUklEKQoreworCUV4ZWN1dGFibGVGb3JtICogbG9hZEV4ZWN1dGFibGUgPSBsb2FkTWFjaGluZVJJRC5nZXRFeGVjdXRhYmxlKCk7CisKKwkvLyBMb2FkIFJPVVRFUgorCWlmKCBsb2FkRXhlY3V0YWJsZS0+aGFzUG9ydCgpIHx8IGxvYWRFeGVjdXRhYmxlLT5oYXNSb3V0ZXI0VGhpcygpICkKKwl7CisJCVJ1bnRpbWVGb3JtICYgbG9hZFJGID0gYW5FRC0+Z2V0UnVudGltZSggbG9hZE1hY2hpbmVSSUQgKTsKKworCQlSb3V0ZXIgcGFyZW50TG9hZFJvdXRlcjsKKwkJUnVudGltZUlEIGFSb3V0aW5nUklEOworCQlUYWJsZU9mUm91dGVyICogY29udGFpbmVyUm91dGVyVGFibGUgPSBOVUxMOworCisJCWlmKCBsb2FkTWFjaGluZVJJRC5oYXNQUklEKCkgKQorCQl7CisJCQljb250YWluZXJSb3V0ZXJUYWJsZSA9ICYoIGxvYWRNYWNoaW5lUklELmdldFBSSUQoKS4KKwkJCQkJZ2V0RXhlY3V0YWJsZSgpLT5nZXRSb3V0ZXJzNEluc3RhbmNlKCkgKTsKKworCQkJcGFyZW50TG9hZFJvdXRlciA9IGFuRUQtPmdldFJ1bnRpbWUoCisJCQkJCWxvYWRNYWNoaW5lUklELmdldFBSSUQoKSApLmdldFJvdXRlcigpOworCQl9CisKKwkJaWYoIGxvYWRFeGVjdXRhYmxlLT5oYXNSb3V0ZXI0SW5zdGFuY2UoKSApCisJCXsKKwkJCWNvbnN0IFJvdXRlciAmIHRoZVJvdXRlcjRUaGlzID0gbG9hZEV4ZWN1dGFibGUtPmdldFJvdXRlcjRUaGlzKCk7CisKKwkJCWlmKCAoY29udGFpbmVyUm91dGVyVGFibGUgIT0gTlVMTCkKKwkJCQkmJiBjb250YWluZXJSb3V0ZXJUYWJsZS0+cG9wdWxhdGVkKCkgKQorCQkJeworCQkJCWNvbnN0IFJvdXRlciAmIHRoZVJvdXRlcjRQYXJlbnQgPSBjb250YWluZXJSb3V0ZXJUYWJsZS0+Z2V0KAorCQkJCQkJbG9hZE1hY2hpbmVSSUQuZ2V0SW5zdGFuY2UoKS0+Z2V0T2Zmc2V0KCkpOworCisJCQkJYXZtX3NpemVfdCByb3V0ZUNvdW50ID0gdGhlUm91dGVyNFRoaXMuZ2V0Um91dGVJRCgpOworCisJCQkJUm91dGVyIG5ld1JvdXRlcigKKwkJCQkJCWxvYWRNYWNoaW5lUklELmdldEluc3RhbmNlKCksIHJvdXRlQ291bnQsIHJvdXRlQ291bnQpOworCQkJCWxvYWRSRi5zZXRSb3V0ZXIoIG5ld1JvdXRlciApOworCisJCQkJUm91dGluZ0RhdGEgYVJvdXRpbmdEYXRhOworCisJCQkJLy8gR0xPQkFMIElOUFVUIG9yIE9VVFBVVCBST1VURQorCQkJCWZvciggYXZtX3NpemVfdCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgcm91dGVDb3VudCA7ICsrb2Zmc2V0ICkKKwkJCQl7CisJCQkJCWFSb3V0aW5nRGF0YSA9IHRoZVJvdXRlcjRUaGlzLmdldElucHV0Um91dGluZyhvZmZzZXQpOworCQkJCQlpZiggYVJvdXRpbmdEYXRhLmludmFsaWQoKSApCisJCQkJCXsKKwkJCQkJCWFSb3V0aW5nRGF0YSA9IHRoZVJvdXRlcjRQYXJlbnQuZ2V0SW5wdXRSb3V0aW5nKG9mZnNldCk7CisJCQkJCX0KKwkJCQkJaWYoIGFSb3V0aW5nRGF0YS5pbnZhbGlkKCkgKQorCQkJCQl7CisJCQkJCQlhUm91dGluZ0RhdGEgPSBwYXJlbnRMb2FkUm91dGVyLmdldElucHV0Um91dGluZyhvZmZzZXQpOworCQkJCQl9CisJCQkJCWlmKCBhUm91dGluZ0RhdGEudmFsaWQoKSApCisJCQkJCXsKKwkJCQkJCWFSb3V0aW5nRGF0YS5tYWtlV3JpdGFibGUoKTsKKwkJCQkJCWFSb3V0aW5nRGF0YS5zZXRSdW50aW1lUklEKGxvYWRNYWNoaW5lUklEKTsKKworCQkJCQkJbmV3Um91dGVyLnNldElucHV0Um91dGluZyhvZmZzZXQsIGFSb3V0aW5nRGF0YSk7CisJCQkJCX0KKworCQkJCQkvLyBOTyBFTFNFIGJlY2F1c2Ugb2YgSU5PVVQgUE9SVAorCQkJCQlhUm91dGluZ0RhdGEgPSB0aGVSb3V0ZXI0VGhpcy5nZXRPdXRwdXRSb3V0aW5nKG9mZnNldCk7CisJCQkJCWlmKCBhUm91dGluZ0RhdGEuaW52YWxpZCgpICkKKwkJCQkJeworCQkJCQkJYVJvdXRpbmdEYXRhID0gdGhlUm91dGVyNFBhcmVudC5nZXRPdXRwdXRSb3V0aW5nKG9mZnNldCk7CisJCQkJCX0KKwkJCQkJaWYoIGFSb3V0aW5nRGF0YS5pbnZhbGlkKCkgKQorCQkJCQl7CisJCQkJCQlhUm91dGluZ0RhdGEgPSBwYXJlbnRMb2FkUm91dGVyLmdldE91dHB1dFJvdXRpbmcob2Zmc2V0KTsKKwkJCQkJfQorCQkJCQlpZiggYVJvdXRpbmdEYXRhLnZhbGlkKCkgKQorCQkJCQl7CisJCQkJCQlhUm91dGluZ0RhdGEubWFrZVdyaXRhYmxlKCk7CisJCQkJCQlhUm91dGluZ0RhdGEuc2V0UnVudGltZVJJRChsb2FkTWFjaGluZVJJRCk7CisKKwkJCQkJCW5ld1JvdXRlci5zZXRPdXRwdXRSb3V0aW5nKG9mZnNldCwgYVJvdXRpbmdEYXRhKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCS8vIExPQ0FMIElOUFVUIG9yIE9VVFBVVCBST1VURQorCQkJCVRhYmxlT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGl0UG9ydCA9CisJCQkJCQlsb2FkRXhlY3V0YWJsZS0+Z2V0UG9ydCgpLmJlZ2luKCk7CisJCQkJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgZW5kUG9ydCA9CisJCQkJCQlsb2FkRXhlY3V0YWJsZS0+Z2V0UG9ydCgpLmVuZCgpOworCQkJCWZvciggOyBpdFBvcnQgIT0gZW5kUG9ydCA7ICsraXRQb3J0ICkKKwkJCQl7CisJCQkJCWlmKCAoKml0UG9ydCkucG9ydCgpLmlzUG9ydCgpICkKKwkJCQkJeworCQkJCQkJaWYoICgqaXRQb3J0KS5nZXRNb2RpZmllcigpLmhhc0RpcmVjdGlvbklucHV0KCkgKQorCQkJCQkJeworCQkJCQkJCWlmKCAoKml0UG9ydCkuZ2V0TW9kaWZpZXIoKS5pc1Zpc2liaWxpdHlQdWJsaWMoKSApCisJCQkJCQkJeworCQkJCQkJCQlhUm91dGluZ0RhdGEgPSB0aGVSb3V0ZXI0UGFyZW50LmdldElucHV0Um91dGluZygKKwkJCQkJCQkJCQkoKml0UG9ydCkuZ2V0Um91dGVPZmZzZXQoKSk7CisKKwkJCQkJCQkJYVJvdXRpbmdSSUQgPSBsb2FkTWFjaGluZVJJRC5nZXRQUklEKCk7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCWFSb3V0aW5nRGF0YSA9IHRoZVJvdXRlcjRUaGlzLmdldElucHV0Um91dGluZygKKwkJCQkJCQkJCQkoKml0UG9ydCkuZ2V0Um91dGVPZmZzZXQoKSk7CisKKwkJCQkJCQkJYVJvdXRpbmdSSUQgPSBsb2FkTWFjaGluZVJJRDsKKwkJCQkJCQl9CisKKwkJCQkJCQlhUm91dGluZ0RhdGEubWFrZVdyaXRhYmxlKCk7CisJCQkJCQkJYVJvdXRpbmdEYXRhLnNldFJ1bnRpbWVSSUQoYVJvdXRpbmdSSUQpOworCisJCQkJCQkJbmV3Um91dGVyLmFwcGVuZElucHV0Um91dGluZyggYVJvdXRpbmdEYXRhICk7CisJCQkJCQl9CisJCQkJCQkvLyBOTyBFTFNFIGJlY2F1c2Ugb2YgSU5PVVQgUE9SVAorCQkJCQkJaWYoICgqaXRQb3J0KS5nZXRNb2RpZmllcigpLmhhc0RpcmVjdGlvbk91dHB1dCgpICkKKwkJCQkJCXsKKwkJCQkJCQlpZiggKCppdFBvcnQpLmdldE1vZGlmaWVyKCkuaXNWaXNpYmlsaXR5UHVibGljKCkgKQorCQkJCQkJCXsKKwkJCQkJCQkJYVJvdXRpbmdEYXRhID0gdGhlUm91dGVyNFBhcmVudC5nZXRPdXRwdXRSb3V0aW5nKAorCQkJCQkJCQkJCSgqaXRQb3J0KS5nZXRSb3V0ZU9mZnNldCgpKTsKKwkJCQkJCQkJYVJvdXRpbmdSSUQgPSBsb2FkTWFjaGluZVJJRC5nZXRQUklEKCk7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCWFSb3V0aW5nRGF0YSA9IHRoZVJvdXRlcjRUaGlzLmdldE91dHB1dFJvdXRpbmcoCisJCQkJCQkJCQkJKCppdFBvcnQpLmdldFJvdXRlT2Zmc2V0KCkpOworCQkJCQkJCQlhUm91dGluZ1JJRCA9bG9hZE1hY2hpbmVSSUQ7CisJCQkJCQkJfQorCisJCQkJCQkJYVJvdXRpbmdEYXRhLm1ha2VXcml0YWJsZSgpOworCQkJCQkJCWFSb3V0aW5nRGF0YS5zZXRSdW50aW1lUklEKGFSb3V0aW5nUklEKTsKKworCQkJCQkJCW5ld1JvdXRlci5hcHBlbmRPdXRwdXRSb3V0aW5nKCBhUm91dGluZ0RhdGEgKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKy8vCQkJCWxvYWRSRi5zZXRSb3V0ZXIoIHRoZVJvdXRlcjRUaGlzICk7CisKKwkJCQlsb2FkUkYuc2V0Um91dGVyKCBjbG9uZVVwZGF0ZVJvdXRlcigKKwkJCQkJCXRoZVJvdXRlcjRUaGlzLCBsb2FkTWFjaGluZVJJRCwgbG9hZE1hY2hpbmVSSUQpICk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiggKGNvbnRhaW5lclJvdXRlclRhYmxlICE9IE5VTEwpCisJCQkJJiYgY29udGFpbmVyUm91dGVyVGFibGUtPm5vbmVtcHR5KCkgKQorCQl7CisvLwkJCWxvYWRSRi5zZXRSb3V0ZXIoIGNvbnRhaW5lclJvdXRlclRhYmxlLT5nZXRSb3V0ZXIobWFjaGluZU9mZnNldCkgKTsKKworCQkJbG9hZFJGLnNldFJvdXRlciggY2xvbmVVcGRhdGVSb3V0ZXIoCisJCQkJCWNvbnRhaW5lclJvdXRlclRhYmxlLT5nZXQoCisJCQkJCQkJbG9hZE1hY2hpbmVSSUQuZ2V0SW5zdGFuY2UoKS0+Z2V0T2Zmc2V0KCkpLAorCQkJCQlsb2FkTWFjaGluZVJJRC5nZXRQUklEKCksIGxvYWRNYWNoaW5lUklEKSApOworCQl9CisKKwkJZWxzZQorCQl7CisJCQlhUm91dGluZ1JJRCA9IGxvYWRNYWNoaW5lUklEOworCQkJY29uc3QgUm91dGVyICYgYVJvdXRlciA9IGdldFJvdXRlcjRNb2RlbChhbkVELCBhUm91dGluZ1JJRCk7CisJCQlpZiggYVJvdXRlci52YWxpZCgpICkKKwkJCXsKKy8vCQkJCWxvYWRSRi5zZXRSb3V0ZXIoIGFSb3V0ZXIgKTsKKworCQkJCWxvYWRSRi5zZXRSb3V0ZXIoIGNsb25lVXBkYXRlUm91dGVyKAorCQkJCQkJYVJvdXRlciwgYVJvdXRpbmdSSUQsIGxvYWRNYWNoaW5lUklEKSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUFWTV9PU19FWElUKCBGQUlMRUQgKQorCQkJCQkJPDwgIk5vIFJvdXRlciBUYWJsZSBmb3VuZCAhISEiCisJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQl9CisJCX0KKy8vQGRlYnVnOgorLy8JCUFWTV9PU19UUkFDRSA8PCAibG9hZFJvdXRlcjogIiA8PCBsb2FkUkYuZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCBzdGQ6OmVuZGw7CisvLwkJbG9hZFJGLmdldFJvdXRlcigpLnRvU3RyZWFtKEFWTV9PU19UUkFDRSk7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworLyoqCisgKiBkeW5hbWljTG9hZFJvdXRlcgorICovCitib29sIExvYWRlcjo6ZHluYW1pY0xvYWRSb3V0ZXIoQVBFeGVjdXRpb25EYXRhICYgYW5FRCwKKwkJY29uc3QgUnVudGltZUlEICYgbG9hZE1hY2hpbmVSSUQpCit7CisJRXhlY3V0YWJsZUZvcm0gKiBsb2FkRXhlY3V0YWJsZSA9IGxvYWRNYWNoaW5lUklELmdldEV4ZWN1dGFibGUoKTsKKworCS8vIExvYWQgUk9VVEVSCisJaWYoIGxvYWRFeGVjdXRhYmxlLT5oYXNQb3J0KCkgfHwgbG9hZEV4ZWN1dGFibGUtPmhhc1JvdXRlcjRUaGlzKCkgKQorCXsKKwkJUnVudGltZUZvcm0gJiBsb2FkUkYgPSBhbkVELT5nZXRSdW50aW1lKCBsb2FkTWFjaGluZVJJRCApOworCisJCWNvbnN0IFRhYmxlT2ZSb3V0ZXIgJiBjb250YWluZXJSb3V0ZXJUYWJsZSA9IGxvYWRNYWNoaW5lUklELgorCQkJCWdldFBSSUQoKS5nZXRFeGVjdXRhYmxlKCktPmdldFJvdXRlcnM0TW9kZWwoKTsKKworCQlSb3V0ZXIgcGFyZW50TG9hZFJvdXRlciA9IGFuRUQtPmdldFJ1bnRpbWUoCisJCQkJbG9hZE1hY2hpbmVSSUQuZ2V0UFJJRCgpICkuZ2V0Um91dGVyKCk7CisKKwkJaWYoIGxvYWRFeGVjdXRhYmxlLT5oYXNSb3V0ZXI0SW5zdGFuY2UoKSApCisJCXsKKwkJCWNvbnN0IFJvdXRlciAmIHRoZVJvdXRlcjRUaGlzID0gbG9hZEV4ZWN1dGFibGUtPmdldFJvdXRlcjRUaGlzKCk7CisKKwkJCWlmKCBjb250YWluZXJSb3V0ZXJUYWJsZS5ub25lbXB0eSgpICkKKwkJCXsKKwkJCQljb25zdCBSb3V0ZXIgJiB0aGVSb3V0ZXI0UGFyZW50ID0gY29udGFpbmVyUm91dGVyVGFibGUuZ2V0KAorCQkJCQlsb2FkTWFjaGluZVJJRC5nZXRJbnN0YW5jZSgpLT5nZXRJbnN0YW5jZU1vZGVsKCktPmdldE9mZnNldCgpKTsKKworCQkJCWF2bV9zaXplX3QgYVJvdXRlSUQgPSB0aGVSb3V0ZXI0VGhpcy5nZXRSb3V0ZUlEKCk7CisKKwkJCQlSb3V0ZXIgbmV3Um91dGVyKAorCQkJCQkJbG9hZE1hY2hpbmVSSUQuZ2V0SW5zdGFuY2UoKSwgYVJvdXRlSUQsIGFSb3V0ZUlEKTsKKwkJCQlsb2FkUkYuc2V0Um91dGVyKCBuZXdSb3V0ZXIgKTsKKworCQkJCVJvdXRpbmdEYXRhIGFSb3V0aW5nRGF0YTsKKworCQkJCS8vIEdMT0JBTCBJTlBVVCBvciBPVVRQVVQgUk9VVEUKKwkJCQlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMCA7IG9mZnNldCA8IGFSb3V0ZUlEIDsgKytvZmZzZXQgKQorCQkJCXsKKwkJCQkJYVJvdXRpbmdEYXRhID0gdGhlUm91dGVyNFRoaXMuZ2V0SW5wdXRSb3V0aW5nKG9mZnNldCk7CisJCQkJCWlmKCBhUm91dGluZ0RhdGEuaW52YWxpZCgpICkKKwkJCQkJeworCQkJCQkJYVJvdXRpbmdEYXRhID0gdGhlUm91dGVyNFBhcmVudC5nZXRJbnB1dFJvdXRpbmcob2Zmc2V0KTsKKwkJCQkJfQorCQkJCQlpZiggYVJvdXRpbmdEYXRhLmludmFsaWQoKSApCisJCQkJCXsKKwkJCQkJCWFSb3V0aW5nRGF0YSA9IHBhcmVudExvYWRSb3V0ZXIuZ2V0SW5wdXRSb3V0aW5nKG9mZnNldCk7CisJCQkJCX0KKwkJCQkJaWYoIGFSb3V0aW5nRGF0YS52YWxpZCgpICkKKwkJCQkJeworCQkJCQkJYVJvdXRpbmdEYXRhLm1ha2VXcml0YWJsZSgpOworCQkJCQkJYVJvdXRpbmdEYXRhLnNldFJ1bnRpbWVSSUQobG9hZE1hY2hpbmVSSUQpOworCisJCQkJCQluZXdSb3V0ZXIuc2V0SW5wdXRSb3V0aW5nKG9mZnNldCwgYVJvdXRpbmdEYXRhKTsKKwkJCQkJfQorCisJCQkJCS8vIE5PIEVMU0UgYmVjYXVzZSBvZiBJTk9VVCBQT1JUCisJCQkJCWFSb3V0aW5nRGF0YSA9IHRoZVJvdXRlcjRUaGlzLmdldE91dHB1dFJvdXRpbmcob2Zmc2V0KTsKKwkJCQkJaWYoIGFSb3V0aW5nRGF0YS5pbnZhbGlkKCkgKQorCQkJCQl7CisJCQkJCQlhUm91dGluZ0RhdGEgPSB0aGVSb3V0ZXI0UGFyZW50LmdldE91dHB1dFJvdXRpbmcob2Zmc2V0KTsKKwkJCQkJfQorCQkJCQlpZiggYVJvdXRpbmdEYXRhLmludmFsaWQoKSApCisJCQkJCXsKKwkJCQkJCWFSb3V0aW5nRGF0YSA9IHBhcmVudExvYWRSb3V0ZXIuZ2V0T3V0cHV0Um91dGluZyhvZmZzZXQpOworCQkJCQl9CisJCQkJCWlmKCBhUm91dGluZ0RhdGEudmFsaWQoKSApCisJCQkJCXsKKwkJCQkJCWFSb3V0aW5nRGF0YS5tYWtlV3JpdGFibGUoKTsKKwkJCQkJCWFSb3V0aW5nRGF0YS5zZXRSdW50aW1lUklEKGxvYWRNYWNoaW5lUklEKTsKKworCQkJCQkJbmV3Um91dGVyLnNldE91dHB1dFJvdXRpbmcob2Zmc2V0LCBhUm91dGluZ0RhdGEpOworCQkJCQl9CisJCQkJfQorCisJCQkJLy8gTE9DQUwgSU5QVVQgb3IgT1VUUFVUIFJPVVRFCisJCQkJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgaXRQb3J0ID0KKwkJCQkJCWxvYWRFeGVjdXRhYmxlLT5nZXRQb3J0KCkuYmVnaW4oKTsKKwkJCQlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBlbmRQb3J0ID0KKwkJCQkJCWxvYWRFeGVjdXRhYmxlLT5nZXRQb3J0KCkuZW5kKCk7CisJCQkJZm9yKCA7IGl0UG9ydCAhPSBlbmRQb3J0IDsgKytpdFBvcnQgKQorCQkJCXsKKwkJCQkJaWYoICgqaXRQb3J0KS5nZXRNb2RpZmllcigpLmhhc0RpcmVjdGlvbklucHV0KCkgKQorCQkJCQl7CisJCQkJCQlpZiggKCppdFBvcnQpLmdldE1vZGlmaWVyKCkuaXNWaXNpYmlsaXR5UHVibGljKCkgKQorCQkJCQkJeworCQkJCQkJCW5ld1JvdXRlci5hcHBlbmRJbnB1dFJvdXRpbmcoIHRoZVJvdXRlcjRQYXJlbnQKKwkJCQkJCQkJCS5nZXRJbnB1dFJvdXRpbmcoKCppdFBvcnQpLmdldFJvdXRlT2Zmc2V0KCkpICk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJbmV3Um91dGVyLmFwcGVuZElucHV0Um91dGluZyggdGhlUm91dGVyNFRoaXMKKwkJCQkJCQkJCS5nZXRJbnB1dFJvdXRpbmcoKCppdFBvcnQpLmdldFJvdXRlT2Zmc2V0KCkpICk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJLy8gTk8gRUxTRSBiZWNhdXNlIG9mIElOT1VUIFBPUlQKKwkJCQkJaWYoICgqaXRQb3J0KS5nZXRNb2RpZmllcigpLmhhc0RpcmVjdGlvbk91dHB1dCgpICkKKwkJCQkJeworCQkJCQkJaWYoICgqaXRQb3J0KS5nZXRNb2RpZmllcigpLmlzVmlzaWJpbGl0eVB1YmxpYygpICkKKwkJCQkJCXsKKwkJCQkJCQluZXdSb3V0ZXIuYXBwZW5kT3V0cHV0Um91dGluZyggdGhlUm91dGVyNFBhcmVudAorCQkJCQkJCQkuZ2V0T3V0cHV0Um91dGluZygoKml0UG9ydCkuZ2V0Um91dGVPZmZzZXQoKSkgKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQluZXdSb3V0ZXIuYXBwZW5kT3V0cHV0Um91dGluZyggdGhlUm91dGVyNFRoaXMKKwkJCQkJCQkJLmdldE91dHB1dFJvdXRpbmcoKCppdFBvcnQpLmdldFJvdXRlT2Zmc2V0KCkpICk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJbG9hZFJGLnNldFJvdXRlciggdGhlUm91dGVyNFRoaXMgKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmKCBjb250YWluZXJSb3V0ZXJUYWJsZS5ub25lbXB0eSgpICkKKwkJeworCQkJbG9hZFJGLnNldFJvdXRlciggY29udGFpbmVyUm91dGVyVGFibGUuZ2V0KAorCQkJCWxvYWRNYWNoaW5lUklELmdldEluc3RhbmNlKCktPmdldEluc3RhbmNlTW9kZWwoKS0+Z2V0T2Zmc2V0KCkpICk7CisJCX0KKworCQllbHNlCisJCXsKKwkJCVJ1bnRpbWVJRCBhUm91dGluZ1JJRCA9IGxvYWRNYWNoaW5lUklEOworCQkJY29uc3QgUm91dGVyICYgYVJvdXRlciA9IGdldFJvdXRlcjRNb2RlbChhbkVELCBhUm91dGluZ1JJRCk7CisJCQlpZiggYVJvdXRlci52YWxpZCgpICkKKwkJCXsKKwkJCQlsb2FkUkYuc2V0Um91dGVyKCBhUm91dGVyICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQVZNX09TX0VYSVQoIEZBSUxFRCApCisJCQkJCQk8PCAiTm8gUm91dGVyIFRhYmxlIGZvdW5kICEhISIKKwkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvTG9hZGVyLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL0xvYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YWUwOWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL0xvYWRlci5oCkBAIC0wLDAgKzEsMTgwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIExPQURFUl9IXworI2RlZmluZSBMT0FERVJfSF8KKworI2luY2x1ZGUgPGNvbW1vbi9CRi5oPgorCisjaW5jbHVkZSA8Y29sbGVjdGlvbi9MaXN0Lmg+CisKKyNpbmNsdWRlIDxjb21wdXRlci9FdmFsdWF0aW9uRW52aXJvbm1lbnQuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkRhdGEuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lSUQuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKK2NsYXNzIEF2bVByaW1pdGl2ZVByb2Nlc3NvcjsKKworY2xhc3MgQmFzZUVudmlyb25tZW50OworY2xhc3MgQnVpbGRlcjsKKworY2xhc3MgQ29uZmlndXJhdGlvbjsKKworY2xhc3MgRXhlY3V0YWJsZUZvcm07CisKK2NsYXNzIEluc3RhbmNlT2ZEYXRhOworY2xhc3MgSW5zdGFuY2VPZk1hY2hpbmU7CisKK2NsYXNzIFJ1bnRpbWVGb3JtOworCitjbGFzcyBMb2FkZXIKK3sKKworcHVibGljOgorCS8qKgorCSAqIFRZUEVERUYKKwkgKi8KKwl0eXBlZGVmIExpc3Q8IFJ1bnRpbWVJRCA+Ojpjb25zdF9pdGVyYXRvciAgY29uc3RfcmlkX2l0ZXJhdG9yOworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQVRUUklCVVRFCisJICovCisJQ29uZmlndXJhdGlvbiAmIG1Db25maWd1cmF0aW9uOworCisJQnVpbGRlciAmIG1CdWlsZGVyOworCisJRXZhbHVhdGlvbkVudmlyb25tZW50IEVOVjsKKworCUxpc3Q8IFJ1bnRpbWVJRCA+IG1PbkNyZWF0ZVJvdXRpbWU7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUxvYWRlcihDb25maWd1cmF0aW9uICYgYUNvbmZpZ3VyYXRpb24sIEJ1aWxkZXIgJiBhQnVpbGRlciwKKwkJCUF2bVByaW1pdGl2ZVByb2Nlc3NvciAmIGFQcmltaXRpdmVQcm9jZXNzb3IpOworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkxvYWRlcigpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBDT05GSUdVUkUKKwkgKi8KKwlib29sIGNvbmZpZ3VyZSgpOworCisJLyoqCisJICogbU9uQ3JlYXRlUm91dGltZQorCSAqLworCWlubGluZSBib29sIGhhc09uQ3JlYXRlUm91dGltZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1PbkNyZWF0ZVJvdXRpbWUubm9uZW1wdHkoKSApOworCX0KKworCWlubGluZSB2b2lkIHJlc2V0T25DcmVhdGVSb3V0aW1lKCkKKwl7CisJCW1PbkNyZWF0ZVJvdXRpbWUuY2xlYXIoKTsKKwl9CisKKwkvKioKKwkgKiBbIENPTlNUIF0gSVRFUkFUT1IKKwkgKi8KKwlpbmxpbmUgY29uc3RfcmlkX2l0ZXJhdG9yIG9uX2NyZWF0ZV9iZWdpbigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1PbkNyZWF0ZVJvdXRpbWUuYmVnaW4oKSApOworCX0KKworCWlubGluZSBjb25zdF9yaWRfaXRlcmF0b3Igb25fY3JlYXRlX2VuZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1PbkNyZWF0ZVJvdXRpbWUuZW5kKCkgKTsKKwl9CisKKworCS8qKgorCSAqIFJVTk5JTkcgb25DUkVBVEUKKwkgKiBtT25DcmVhdGVSb3V0aW1lCisJICovCisJYm9vbCBmaW5hbGl6ZVJ1bm5pbmdPbkNyZWF0ZSgKKwkJCWNvbnN0IEJhc2VFbnZpcm9ubWVudCAmIEVOViwgQVBFeGVjdXRpb25EYXRhICYgYW5FRCk7CisKKwkvKioKKwkgKiBVVElMUworCSAqLworCUJGQ29kZSBsb2FkU2NoZWR1bGVyQ29kZSgKKwkJCUFQRXhlY3V0aW9uRGF0YSAmIGFuRUQsIGNvbnN0IFJ1bnRpbWVGb3JtICYgYVJGLAorCQkJY29uc3QgQkZDb2RlICYgYVNjaGVkdWxlckNvZGUsIGJvb2wgaXNTdGF0aWNMb2FkaW5nKTsKKworCXZvaWQgbG9hZFNjaGVkdWxlckNvZGUoQVBFeGVjdXRpb25EYXRhICYgYW5FRCwKKwkJCWNvbnN0IFJ1bnRpbWVGb3JtICYgYVJGLCBjb25zdCBCRkNvZGUgJiBhU2NoZWR1bGVyQ29kZSwKKwkJCUJGQ29kZSAmIGxvYWRDb2RlLCBib29sIGlzU3RhdGljTG9hZGluZyk7CisKKworCVJ1bnRpbWVGb3JtICogbG9hZFN5c3RlbUluc3RhbmNlKEFQRXhlY3V0aW9uRGF0YSAmIGFuRUQsCisJCQljb25zdCBSdW50aW1lSUQgJiBhUGFyZW50UklELCBJbnN0YW5jZU9mTWFjaGluZSAqIGFNYWNoaW5lLAorCQkJaW50ICYgdGhlUGlkLCBhdm1fb2Zmc2V0X3QgJiB0aGVPZmZzZXQpOworCisJUnVudGltZUZvcm0gKiBsb2FkTWFjaGluZUluc3RhbmNlKEFQRXhlY3V0aW9uRGF0YSAmIGFuRUQsCisJCQljb25zdCBSdW50aW1lSUQgJiBhUGFyZW50UklELCBJbnN0YW5jZU9mTWFjaGluZSAqIGFNYWNoaW5lLAorCQkJaW50ICYgdGhlUGlkLCBhdm1fb2Zmc2V0X3QgJiB0aGVPZmZzZXQpOworCisKKwl2b2lkIGxvYWRNYWNoaW5lKEFQRXhlY3V0aW9uRGF0YSAmIGFuRUQsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsCisJCQljb25zdCBSdW50aW1lSUQgJiBsb2FkTWFjaGluZVJJRCwgaW50ICYgdGhlUGlkLAorCQkJYXZtX29mZnNldF90ICYgdGhlT2Zmc2V0KTsKKworCVJ1bnRpbWVGb3JtICogZHluYW1pY0xvYWRNYWNoaW5lKEFQRXhlY3V0aW9uRGF0YSAmIGFuRUQsCisJCQljb25zdCBSdW50aW1lSUQgJiBhUklELCBSdW50aW1lRm9ybSAqIGFNb2RlbFJGLAorCQkJY29uc3QgUnVudGltZUlEICYgYVBhcmVudFJJRCwgT3BlcmF0b3IgKiBhU2NoZWR1bGVPcCk7CisKKwlSdW50aW1lRm9ybSAqIGR5bmFtaWNMb2FkTWFjaGluZShBUEV4ZWN1dGlvbkRhdGEgJiBhbkVELAorCQkJY29uc3QgUnVudGltZUlEICYgYVJJRCwgSW5zdGFuY2VPZk1hY2hpbmUgKiBhbkluc3RhbmNlRHluYW1pYywKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFQYXJlbnRSSUQsIE9wZXJhdG9yICogYVNjaGVkdWxlT3ApOworCisKKy8vCXZvaWQgbG9hZEluaXRpYWxNb25pdG9yRGF0YSgKKy8vCQkJQVBFeGVjdXRpb25EYXRhICYgYW5FRCwgY29uc3QgUnVudGltZUlEICYgYVJJRCwKKy8vCQkJSW5zdGFuY2VPZk1hY2hpbmUgKiBhbkluc3RhbmNlTWFjaGluZSwgYm9vbCBpc1JlY3Vyc2l2ZSk7CisKKworCWJvb2wgbG9hZERhdGEoQVBFeGVjdXRpb25EYXRhICYgYW5FRCwgY29uc3QgUnVudGltZUlEICYgYVJJRCwKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFEYXRhUklEKTsKKworCWJvb2wgbG9hZEJ1ZmZlcihBUEV4ZWN1dGlvbkRhdGEgJiBhbkVELCBjb25zdCBSdW50aW1lSUQgJiBhUklELAorCQkJY29uc3QgUnVudGltZUlEICYgbG9hZE1hY2hpbmVSSUQpOworCisKKwljb25zdCBSb3V0ZXIgJiBnZXRSb3V0ZXI0TW9kZWwoCisJCQlBUEV4ZWN1dGlvbkRhdGEgJiBhbkVELCBSdW50aW1lSUQgJiBhUm91dGluZ1JJRCk7CisKKwlib29sIGxvYWRSb3V0ZXIoQVBFeGVjdXRpb25EYXRhICYgYW5FRCwgY29uc3QgUnVudGltZUlEICYgYVJJRCwKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGxvYWRNYWNoaW5lUklEKTsKKworCWJvb2wgZHluYW1pY0xvYWRSb3V0ZXIoQVBFeGVjdXRpb25EYXRhICYgYW5FRCwKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGxvYWRNYWNoaW5lUklEKTsKKworfTsKKworCit9CisKKyNlbmRpZiAvKkxPQURFUl9IXyovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL1JFQURNRS5tZCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4ZjAwNTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL1JFQURNRS5tZApAQCAtMCwwICsxLDEwIEBACisjIEVGTS1TWU1CRVggOiBCdWlsZGVyCisKKyMjIFNvdXJjZSBjb2RlIHN0cnVjdHVyZQorCisjIyMgSW50ZXJmYWNlcworCisjIyMgQ2xhc3NlcworCisjIyMgRmFjdG9yaWVzCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvYW5hbHlzaXMvQ29tbXVuaWNhdGlvbkRlcGVuZGVuY3kuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9hbmFseXNpcy9Db21tdW5pY2F0aW9uRGVwZW5kZW5jeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIxZGU5YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvYW5hbHlzaXMvQ29tbXVuaWNhdGlvbkRlcGVuZGVuY3kuY3BwCkBAIC0wLDAgKzEsODM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjQgZsOpdnIuIDIwMTQKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkNvbW11bmljYXRpb25EZXBlbmRlbmN5LmgiCisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9TdGF0ZW1lbnRGYWN0b3J5Lmg+CisKKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25EYXRhLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLyB0aGUgY29tbXVuaWNhdGlvbiBpbmZvcm1hdGlvbgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0JGIENvbW11bmljYXRpb25EZXBlbmRlbmN5OjpnZXRDb21tdW5pY2F0aW9uQ29kZSgKKwkJQXZtUHJvZ3JhbSAqIGFuQXZtUHJvZ3JhbSwgY29uc3QgQkZDb2RlICYgYUNvZGUsCisJCWJvb2wgKCppc0NvbSkoQXZtQ29kZSAqIGNvbUNvZGUpLCBib29sICYgaGFzTXV0YWJsZVNjaGVkdWxlICkKK3sKKwlpZiggYUNvZGUuaW52YWxpZCgpICkKKwl7CisJCS8vISEgTk9USElORworCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCX0KKwllbHNlIGlmKCBpc0NvbShhQ29kZSkgKQorCXsKKwkJcmV0dXJuKCBhQ29kZSApOworCX0KKwllbHNlCisJeworCQlFeGVjdXRhYmxlRm9ybSAqIGFjdGl2aXR5RXhlYyA9IE5VTEw7CisKKwkJc3dpdGNoKCBhbkF2bVByb2dyYW0tPmlzU2NvcGVUcmFuc2l0aW9uKCkgPyAvL2lzPCBBdm1UcmFuc2l0aW9uID4oKQorCQkJCUFWTV9PUENPREVfTlVMTCA6IGFDb2RlLT5nZXRBdm1PcENvZGUoKSApCisJCXsKKwkJCWNhc2UgQVZNX09QQ09ERV9TQ0hFRFVMRV9JTlZPS0U6CisJCQl7CisJCQkJaWYoIChhY3Rpdml0eUV4ZWMgPSBTdGF0ZW1lbnRGYWN0b3J5OjoKKwkJCQkJCWdldEFjdGl2aXR5VGFyZ2V0RXhlY3V0YWJsZShhbkF2bVByb2dyYW0sIGFDb2RlKSkKKwkJCQkJCSE9IE5VTEwgKQorCQkJCXsKKwkJCQkJaWYoIGFjdGl2aXR5RXhlYy0+aXNNdXRhYmxlU2NoZWR1bGUoKSApCisJCQkJCXsKKwkJCQkJCWhhc011dGFibGVTY2hlZHVsZSA9IHRydWU7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlnZXRDb21tdW5pY2F0aW9uQ29kZShhY3Rpdml0eUV4ZWMsCisJCQkJCQkJCWFjdGl2aXR5RXhlYy0+Z2V0T25TY2hlZHVsZSgpLCBpc0NvbSwKKwkJCQkJCQkJaGFzTXV0YWJsZVNjaGVkdWxlICk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCQkJfQorCisJCQljYXNlIEFWTV9PUENPREVfSU5WT0tFX1RSQU5TSVRJT046CisJCQl7CisJCQkJLy8gUG91ciDDqXZpdGVyIGxlcyByw6ljdXJzaW9ucyBpbmZpbmlzICEhIQorCQkJCWlmKCBpc0NvbSA9PSAoJiBDb21tdW5pY2F0aW9uRGVwZW5kZW5jeTo6aXNDb21tdW5pY2F0aW9uQ29kZSkgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCBhQ29kZS0+Zmlyc3QoKS50b19wdHI8IEF2bVByb2dyYW0gPigpCisJCQkJCQkJLT5nZXRDb21tdW5pY2F0aW9uQ29kZSgpICk7CisJCQkJfQorCQkJCWVsc2UgaWYoIGlzQ29tID09CisJCQkJCQkoJiBDb21tdW5pY2F0aW9uRGVwZW5kZW5jeTo6aXNJbnRlcm5hbENvbW11bmljYXRpb25Db2RlKSApCisJCQkJeworCQkJCQlyZXR1cm4oIGFDb2RlLT5maXJzdCgpLnRvX3B0cjwgQXZtUHJvZ3JhbSA+KCkKKwkJCQkJCQktPmdldENvbW11bmljYXRpb25Db2RlKCkgKTsKKwkJCQl9CisJCQkJZWxzZSBpZiggaXNDb20gPT0gKCYgQ29tbXVuaWNhdGlvbkRlcGVuZGVuY3k6OmlzRW52aXJvbm1lbnRDb20pICkKKwkJCQl7CisJCQkJCXJldHVybiggYUNvZGUtPmZpcnN0KCkudG9fcHRyPCBBdm1Qcm9ncmFtID4oKQorCQkJCQkJCS0+Z2V0RW52aXJvbm1lbnRDb20oKSApOworCQkJCX0KKwkJCQllbHNlIGlmKCBpc0NvbSA9PQorCQkJCQkJKCYgQ29tbXVuaWNhdGlvbkRlcGVuZGVuY3k6OmlzRW52aXJvbm1lbnRJbnB1dENvbSkgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCBhQ29kZS0+Zmlyc3QoKS50b19wdHI8IEF2bVByb2dyYW0gPigpCisJCQkJCQkJLT5nZXRFbnZpcm9ubWVudElucHV0Q29tKCkgKTsKKwkJCQl9CisJCQkJZWxzZSBpZiggaXNDb20gPT0KKwkJCQkJCSgmIENvbW11bmljYXRpb25EZXBlbmRlbmN5Ojppc0Vudmlyb25tZW50T3V0cHV0Q29tKSApCisJCQkJeworCQkJCQlyZXR1cm4oIGFDb2RlLT5maXJzdCgpLnRvX3B0cjwgQXZtUHJvZ3JhbSA+KCkKKwkJCQkJCQktPmdldEVudmlyb25tZW50T3V0cHV0Q29tKCkgKTsKKwkJCQl9CisKKwkJCQllbHNlCisJCQkJeworCQkJCQlyZXR1cm4oIGdldENvbW11bmljYXRpb25Db2RlKAorCQkJCQkJCWFDb2RlLT5maXJzdCgpLnRvX3B0cjwgQXZtUHJvZ3JhbSA+KCksCisJCQkJCQkJYUNvZGUtPmZpcnN0KCkudG9fcHRyPCBBdm1Qcm9ncmFtID4oKS0+Z2V0Q29kZSgpLAorCQkJCQkJCWlzQ29tLCBoYXNNdXRhYmxlU2NoZWR1bGUpICk7CisJCQkJfQorCisJCQkJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKKwkJCX0KKworCQkJY2FzZSBBVk1fT1BDT0RFX0lSVU46CisJCQl7CisJCQkJaWYoIChhY3Rpdml0eUV4ZWMgPSBTdGF0ZW1lbnRGYWN0b3J5OjoKKwkJCQkJCWdldEFjdGl2aXR5VGFyZ2V0RXhlY3V0YWJsZShhbkF2bVByb2dyYW0sIGFDb2RlKSkKKwkJCQkJCSE9IE5VTEwgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCBnZXRDb21tdW5pY2F0aW9uQ29kZShhY3Rpdml0eUV4ZWMsCisJCQkJCQkJYWN0aXZpdHlFeGVjLT5nZXRPbklSdW4oKSwgaXNDb20sCisJCQkJCQkJaGFzTXV0YWJsZVNjaGVkdWxlKSApOworCQkJCX0KKworCQkJCXJldHVybiggQkY6OlJFRl9OVUxMICk7CisJCQl9CisJCQljYXNlIEFWTV9PUENPREVfUlVOOgorCQkJeworCQkJCWlmKCAoYWN0aXZpdHlFeGVjID0gU3RhdGVtZW50RmFjdG9yeTo6CisJCQkJCQlnZXRBY3Rpdml0eVRhcmdldEV4ZWN1dGFibGUoYW5Bdm1Qcm9ncmFtLCBhQ29kZSkpCisJCQkJCQkhPSBOVUxMICkKKwkJCQl7CisJCQkJCXJldHVybiggZ2V0Q29tbXVuaWNhdGlvbkNvZGUoYWN0aXZpdHlFeGVjLAorCQkJCQkJCWFjdGl2aXR5RXhlYy0+Z2V0T25SdW4oKSwgaXNDb20sCisJCQkJCQkJaGFzTXV0YWJsZVNjaGVkdWxlKSApOworCQkJCX0KKworCQkJCXJldHVybiggQkY6OlJFRl9OVUxMICk7CisJCQl9CisJCQljYXNlIEFWTV9PUENPREVfUlRDOgorCQkJeworCQkJCWlmKCAoYWN0aXZpdHlFeGVjID0gU3RhdGVtZW50RmFjdG9yeTo6CisJCQkJCQlnZXRBY3Rpdml0eVRhcmdldEV4ZWN1dGFibGUoYW5Bdm1Qcm9ncmFtLCBhQ29kZSkpCisJCQkJCQkhPSBOVUxMICkKKwkJCQl7CisJCQkJCXJldHVybiggZ2V0Q29tbXVuaWNhdGlvbkNvZGUoYWN0aXZpdHlFeGVjLAorCQkJCQkJCWFjdGl2aXR5RXhlYy0+Z2V0T25SdGMoKSwgaXNDb20sCisJCQkJCQkJaGFzTXV0YWJsZVNjaGVkdWxlKSApOworCQkJCX0KKworCQkJCXJldHVybiggQkY6OlJFRl9OVUxMICk7CisJCQl9CisKKwkJCWNhc2UgQVZNX09QQ09ERV9JRU5BQkxFX0lOVk9LRToKKwkJCXsKKwkJCQlpZiggKGFjdGl2aXR5RXhlYyA9IFN0YXRlbWVudEZhY3Rvcnk6OgorCQkJCQkJZ2V0QWN0aXZpdHlUYXJnZXRFeGVjdXRhYmxlKGFuQXZtUHJvZ3JhbSwgYUNvZGUpKQorCQkJCQkJIT0gTlVMTCApCisJCQkJeworCQkJCQlyZXR1cm4oIGdldENvbW11bmljYXRpb25Db2RlKGFjdGl2aXR5RXhlYywKKwkJCQkJCQlhY3Rpdml0eUV4ZWMtPmdldE9uSUVuYWJsZSgpLCBpc0NvbSwKKwkJCQkJCQloYXNNdXRhYmxlU2NoZWR1bGUpICk7CisJCQkJfQorCisJCQkJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKKwkJCX0KKwkJCWNhc2UgQVZNX09QQ09ERV9FTkFCTEVfSU5WT0tFOgorCQkJeworCQkJCWlmKCAoYWN0aXZpdHlFeGVjID0gU3RhdGVtZW50RmFjdG9yeTo6CisJCQkJCQlnZXRBY3Rpdml0eVRhcmdldEV4ZWN1dGFibGUoYW5Bdm1Qcm9ncmFtLCBhQ29kZSkpCisJCQkJCQkhPSBOVUxMICkKKwkJCQl7CisJCQkJCXJldHVybiggZ2V0Q29tbXVuaWNhdGlvbkNvZGUoYWN0aXZpdHlFeGVjLAorCQkJCQkJCWFjdGl2aXR5RXhlYy0+Z2V0T25FbmFibGUoKSwgaXNDb20sCisJCQkJCQkJaGFzTXV0YWJsZVNjaGVkdWxlKSApOworCQkJCX0KKworCQkJCXJldHVybiggQkY6OlJFRl9OVUxMICk7CisJCQl9CisKKwkJCWNhc2UgQVZNX09QQ09ERV9JRElTQUJMRV9JTlZPS0U6CisJCQl7CisJCQkJaWYoIChhY3Rpdml0eUV4ZWMgPSBTdGF0ZW1lbnRGYWN0b3J5OjoKKwkJCQkJCWdldEFjdGl2aXR5VGFyZ2V0RXhlY3V0YWJsZShhbkF2bVByb2dyYW0sIGFDb2RlKSkKKwkJCQkJCSE9IE5VTEwgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCBnZXRDb21tdW5pY2F0aW9uQ29kZShhY3Rpdml0eUV4ZWMsCisJCQkJCQkJYWN0aXZpdHlFeGVjLT5nZXRPbklEaXNhYmxlKCksIGlzQ29tLAorCQkJCQkJCWhhc011dGFibGVTY2hlZHVsZSkgKTsKKwkJCQl9CisKKwkJCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCQkJfQorCQkJY2FzZSBBVk1fT1BDT0RFX0RJU0FCTEVfSU5WT0tFOgorCQkJeworCQkJCWlmKCAoYWN0aXZpdHlFeGVjID0gU3RhdGVtZW50RmFjdG9yeTo6CisJCQkJCQlnZXRBY3Rpdml0eVRhcmdldEV4ZWN1dGFibGUoYW5Bdm1Qcm9ncmFtLCBhQ29kZSkpCisJCQkJCQkhPSBOVUxMICkKKwkJCQl7CisJCQkJCXJldHVybiggZ2V0Q29tbXVuaWNhdGlvbkNvZGUoYWN0aXZpdHlFeGVjLAorCQkJCQkJCWFjdGl2aXR5RXhlYy0+Z2V0T25EaXNhYmxlKCksIGlzQ29tLAorCQkJCQkJCWhhc011dGFibGVTY2hlZHVsZSkgKTsKKwkJCQl9CisKKwkJCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCQkJfQorCisJCQljYXNlIEFWTV9PUENPREVfSUFCT1JUX0lOVk9LRToKKwkJCXsKKwkJCQlpZiggKGFjdGl2aXR5RXhlYyA9IFN0YXRlbWVudEZhY3Rvcnk6OgorCQkJCQkJZ2V0QWN0aXZpdHlUYXJnZXRFeGVjdXRhYmxlKGFuQXZtUHJvZ3JhbSwgYUNvZGUpKQorCQkJCQkJIT0gTlVMTCApCisJCQkJeworCQkJCQlyZXR1cm4oIGdldENvbW11bmljYXRpb25Db2RlKGFjdGl2aXR5RXhlYywKKwkJCQkJCQlhY3Rpdml0eUV4ZWMtPmdldE9uSUFib3J0KCksIGlzQ29tLAorCQkJCQkJCWhhc011dGFibGVTY2hlZHVsZSkgKTsKKwkJCQl9CisKKwkJCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCQkJfQorCQkJY2FzZSBBVk1fT1BDT0RFX0FCT1JUX0lOVk9LRToKKwkJCXsKKwkJCQlpZiggKGFjdGl2aXR5RXhlYyA9IFN0YXRlbWVudEZhY3Rvcnk6OgorCQkJCQkJZ2V0QWN0aXZpdHlUYXJnZXRFeGVjdXRhYmxlKGFuQXZtUHJvZ3JhbSwgYUNvZGUpKQorCQkJCQkJIT0gTlVMTCApCisJCQkJeworCQkJCQlyZXR1cm4oIGdldENvbW11bmljYXRpb25Db2RlKGFjdGl2aXR5RXhlYywKKwkJCQkJCQlhY3Rpdml0eUV4ZWMtPmdldE9uQWJvcnQoKSwgaXNDb20sCisJCQkJCQkJaGFzTXV0YWJsZVNjaGVkdWxlKSApOworCQkJCX0KKworCQkJCXJldHVybiggQkY6OlJFRl9OVUxMICk7CisJCQl9CisKKworCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQlpZiggT3BlcmF0b3JNYW5hZ2VyOjppc1NjaGVkdWxlKGFDb2RlLT5nZXRPcGVyYXRvcigpKSApCisJCQkJeworCQkJCQlBdm1Db2RlOjp0aGlzX2NvbnRhaW5lcl90eXBlIGxpc3RPZkNvbUFyZzsKKwkJCQkJQkYgY29tQXJnOworCisJCQkJCUF2bUNvZGU6Oml0ZXJhdG9yIGl0QXJnID0gYUNvZGUtPmJlZ2luKCk7CisJCQkJCUF2bUNvZGU6Oml0ZXJhdG9yIGl0RW5kQXJnID0gYUNvZGUtPmVuZCgpOworCQkJCQlmb3IoIDsgaXRBcmcgIT0gaXRFbmRBcmcgOyArK2l0QXJnICkKKwkJCQkJeworCQkJCQkJaWYoICgqaXRBcmcpLmlzPCBBdm1Db2RlID4oKSApCisJCQkJCQl7CisJCQkJCQkJY29tQXJnID0gZ2V0Q29tbXVuaWNhdGlvbkNvZGUoYW5Bdm1Qcm9ncmFtLAorCQkJCQkJCQkoKml0QXJnKS5iZkNvZGUoKSwgaXNDb20sIGhhc011dGFibGVTY2hlZHVsZSk7CisKKwkJCQkJCQlpZiggY29tQXJnLnZhbGlkKCkgKQorCQkJCQkJCXsKKwkJCQkJCQkJbGlzdE9mQ29tQXJnLmFwcGVuZChjb21BcmcpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCWlmKCBsaXN0T2ZDb21BcmcucG9wdWxhdGVkKCkgKQorCQkJCQl7CisJCQkJCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQkJCQkJYUNvZGUtPmdldE9wZXJhdG9yKCksIGxpc3RPZkNvbUFyZykgKTsKKwkJCQkJfQorCQkJCQllbHNlIGlmKCBsaXN0T2ZDb21Bcmcubm9uZW1wdHkoKSApCisJCQkJCXsKKwkJCQkJCXJldHVybiggbGlzdE9mQ29tQXJnLnBvcF9maXJzdCgpICk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKK30KKworCisvKioKKyAqIENvbGxlY3QgaW5mb3JtYXRpb24gYWJvdXQKKyAqIHN0YXRpYyBpbnB1dCBlbmFibGVkIGNvbW11bmljYXRpb24KKyAqLwordm9pZCBDb21tdW5pY2F0aW9uRGVwZW5kZW5jeTo6Y29tcHV0ZUlucHV0RW5hYmxlZENvbShBdm1Qcm9ncmFtICogYW5Bdm1Qcm9ncmFtLAorCQlMaXN0T2ZJbnN0YW5jZU9mUG9ydCAmIGlucHV0RW5hYmxlZENvbSwgQXZtQ29kZSAqIGFDb2RlLAorCQlib29sICgqaXNDb20pKEF2bUNvZGUgKiBjb21Db2RlKSwgYm9vbCAmIGhhc011dGFibGVTY2hlZHVsZSApCit7CisJaWYoIGFDb2RlID09IE5VTEwgKQorCXsKKwkJLy8hISBOT1RISU5HCisJCXJldHVybjsKKwl9CisJZWxzZSBpZiggaXNDb20oYUNvZGUpICkKKwl7CisJCWlmKCBhQ29kZS0+Zmlyc3QoKS5pczwgSW5zdGFuY2VPZlBvcnQgPigpICkKKwkJeworCQkJaW5wdXRFbmFibGVkQ29tLmFkZF91bmlvbiggYUNvZGUtPmZpcnN0KCkudG9fcHRyPCBJbnN0YW5jZU9mUG9ydCA+KCkgKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlFeGVjdXRhYmxlRm9ybSAqIGFjdGl2aXR5RXhlYyA9IE5VTEw7CisKKwkJc3dpdGNoKCAoIGFuQXZtUHJvZ3JhbS0+aXNTY29wZVRyYW5zaXRpb24oKSAmJiAvL2lzPCBBdm1UcmFuc2l0aW9uID4oKQorCQkJCShub3QgT3BlcmF0b3JNYW5hZ2VyOjppc1NjaGVkdWxlKGFDb2RlLT5nZXRPcGVyYXRvcigpKSkgKSA/CisJCQkJCQlBVk1fT1BDT0RFX05VTEwgOiBhQ29kZS0+Z2V0QXZtT3BDb2RlKCkgKQorCQl7CisJCQljYXNlIEFWTV9PUENPREVfU0NIRURVTEVfSU5WT0tFOgorCQkJeworCQkJCWlmKCAoYWN0aXZpdHlFeGVjID0gU3RhdGVtZW50RmFjdG9yeTo6CisJCQkJCQlnZXRBY3Rpdml0eVRhcmdldEV4ZWN1dGFibGUoYW5Bdm1Qcm9ncmFtLCBhQ29kZSkpCisJCQkJCQkhPSBOVUxMICkKKwkJCQl7CisJCQkJCWlmKCBhY3Rpdml0eUV4ZWMtPmlzTXV0YWJsZVNjaGVkdWxlKCkgKQorCQkJCQl7CisJCQkJCQloYXNNdXRhYmxlU2NoZWR1bGUgPSB0cnVlOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJY29tcHV0ZUlucHV0RW5hYmxlZENvbShhY3Rpdml0eUV4ZWMsIGlucHV0RW5hYmxlZENvbSwKKwkJCQkJCQkJYWN0aXZpdHlFeGVjLT5nZXRPblNjaGVkdWxlKCksIGlzQ29tLAorCQkJCQkJCQloYXNNdXRhYmxlU2NoZWR1bGUgKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWJyZWFrOworCQkJfQorCisJCQljYXNlIEFWTV9PUENPREVfSU5WT0tFX1RSQU5TSVRJT046CisJCQl7CisJCQkJLy8gUG91ciDDqXZpdGVyIGxlcyByw6ljdXJzaW9ucyBpbmZpbmlzICEhIQorCQkJCWlmKCBpc0NvbSA9PSAoJiBDb21tdW5pY2F0aW9uRGVwZW5kZW5jeTo6aXNJbnB1dEVuYWJsZWRDb20pICkKKwkJCQl7CisJCQkJCWlucHV0RW5hYmxlZENvbS5hZGRfdW5pb24oIGFDb2RlLT5maXJzdCgpLgorCQkJCQkJCXRvX3B0cjwgQXZtUHJvZ3JhbSA+KCktPmdldElucHV0RW5hYmxlZENvbSgpICk7CisJCQkJfQorCQkJCWVsc2UgaWYoIGlzQ29tID09ICgmIENvbW11bmljYXRpb25EZXBlbmRlbmN5Ojppc0lucHV0RW5hYmxlZFNhdmUpICkKKwkJCQl7CisJCQkJCWlucHV0RW5hYmxlZENvbS5hZGRfdW5pb24oIGFDb2RlLT5maXJzdCgpLgorCQkJCQkJCXRvX3B0cjwgQXZtUHJvZ3JhbSA+KCktPmdldElucHV0RW5hYmxlZFNhdmUoKSApOworCQkJCX0KKworCQkJCWVsc2UgaWYoIGlzQ29tID09ICgmIENvbW11bmljYXRpb25EZXBlbmRlbmN5Ojppc0lucHV0Q29tKSApCisJCQkJeworCQkJCQlpbnB1dEVuYWJsZWRDb20uYWRkX3VuaW9uKCBhQ29kZS0+Zmlyc3QoKS4KKwkJCQkJCQl0b19wdHI8IEF2bVByb2dyYW0gPigpLT5nZXRJbnB1dENvbSgpICk7CisJCQkJfQorCQkJCWVsc2UgaWYoIGlzQ29tID09ICgmIENvbW11bmljYXRpb25EZXBlbmRlbmN5Ojppc091dHB1dENvbSkgKQorCQkJCXsKKwkJCQkJaW5wdXRFbmFibGVkQ29tLmFkZF91bmlvbiggYUNvZGUtPmZpcnN0KCkuCisJCQkJCQkJdG9fcHRyPCBBdm1Qcm9ncmFtID4oKS0+Z2V0T3V0cHV0Q29tKCkgKTsKKwkJCQl9CisKKwkJCQllbHNlCisJCQkJeworCQkJCQljb21wdXRlSW5wdXRFbmFibGVkQ29tKAorCQkJCQkJCWFDb2RlLT5maXJzdCgpLnRvX3B0cjwgQXZtUHJvZ3JhbSA+KCksCisJCQkJCQkJaW5wdXRFbmFibGVkQ29tLAorCQkJCQkJCWFDb2RlLT5maXJzdCgpLnRvX3B0cjwgQXZtUHJvZ3JhbSA+KCktPmdldENvZGUoKSwKKwkJCQkJCQlpc0NvbSwgaGFzTXV0YWJsZVNjaGVkdWxlICk7CisJCQkJfQorCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNhc2UgQVZNX09QQ09ERV9JUlVOOgorCQkJeworCQkJCWlmKCAoYWN0aXZpdHlFeGVjID0gU3RhdGVtZW50RmFjdG9yeTo6CisJCQkJCQlnZXRBY3Rpdml0eVRhcmdldEV4ZWN1dGFibGUoYW5Bdm1Qcm9ncmFtLCBhQ29kZSkpCisJCQkJCQkhPSBOVUxMICkKKwkJCQl7CisJCQkJCWNvbXB1dGVJbnB1dEVuYWJsZWRDb20oYWN0aXZpdHlFeGVjLCBpbnB1dEVuYWJsZWRDb20sCisJCQkJCQkJYWN0aXZpdHlFeGVjLT5nZXRPbklSdW4oKSwgaXNDb20sCisJCQkJCQkJaGFzTXV0YWJsZVNjaGVkdWxlICk7CisJCQkJfQorCisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIEFWTV9PUENPREVfUlVOOgorCQkJeworCQkJCWlmKCAoYWN0aXZpdHlFeGVjID0gU3RhdGVtZW50RmFjdG9yeTo6CisJCQkJCQlnZXRBY3Rpdml0eVRhcmdldEV4ZWN1dGFibGUoYW5Bdm1Qcm9ncmFtLCBhQ29kZSkpCisJCQkJCQkhPSBOVUxMICkKKwkJCQl7CisJCQkJCWNvbXB1dGVJbnB1dEVuYWJsZWRDb20oYWN0aXZpdHlFeGVjLCBpbnB1dEVuYWJsZWRDb20sCisJCQkJCQkJYWN0aXZpdHlFeGVjLT5nZXRPblJ1bigpLCBpc0NvbSwKKwkJCQkJCQloYXNNdXRhYmxlU2NoZWR1bGUgKTsKKwkJCQl9CisKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgQVZNX09QQ09ERV9SVEM6CisJCQl7CisJCQkJaWYoIChhY3Rpdml0eUV4ZWMgPSBTdGF0ZW1lbnRGYWN0b3J5OjoKKwkJCQkJCWdldEFjdGl2aXR5VGFyZ2V0RXhlY3V0YWJsZShhbkF2bVByb2dyYW0sIGFDb2RlKSkgIT0gTlVMTCApCisJCQkJeworCQkJCQljb21wdXRlSW5wdXRFbmFibGVkQ29tKGFjdGl2aXR5RXhlYywgaW5wdXRFbmFibGVkQ29tLAorCQkJCQkJCWFjdGl2aXR5RXhlYy0+Z2V0T25SdGMoKSwgaXNDb20sCisJCQkJCQkJaGFzTXV0YWJsZVNjaGVkdWxlICk7CisJCQkJfQorCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNhc2UgQVZNX09QQ09ERV9JRU5BQkxFX0lOVk9LRToKKwkJCXsKKwkJCQlpZiggKGFjdGl2aXR5RXhlYyA9IFN0YXRlbWVudEZhY3Rvcnk6OgorCQkJCQkJZ2V0QWN0aXZpdHlUYXJnZXRFeGVjdXRhYmxlKGFuQXZtUHJvZ3JhbSwgYUNvZGUpKQorCQkJCQkJIT0gTlVMTCApCisJCQkJeworCQkJCQljb21wdXRlSW5wdXRFbmFibGVkQ29tKGFjdGl2aXR5RXhlYywgaW5wdXRFbmFibGVkQ29tLAorCQkJCQkJCWFjdGl2aXR5RXhlYy0+Z2V0T25JRW5hYmxlKCksIGlzQ29tLAorCQkJCQkJCWhhc011dGFibGVTY2hlZHVsZSApOworCQkJCX0KKworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBBVk1fT1BDT0RFX0VOQUJMRV9JTlZPS0U6CisJCQl7CisJCQkJaWYoIChhY3Rpdml0eUV4ZWMgPSBTdGF0ZW1lbnRGYWN0b3J5OjoKKwkJCQkJCWdldEFjdGl2aXR5VGFyZ2V0RXhlY3V0YWJsZShhbkF2bVByb2dyYW0sIGFDb2RlKSkKKwkJCQkJCSE9IE5VTEwgKQorCQkJCXsKKwkJCQkJY29tcHV0ZUlucHV0RW5hYmxlZENvbShhY3Rpdml0eUV4ZWMsIGlucHV0RW5hYmxlZENvbSwKKwkJCQkJCQlhY3Rpdml0eUV4ZWMtPmdldE9uRW5hYmxlKCksIGlzQ29tLAorCQkJCQkJCWhhc011dGFibGVTY2hlZHVsZSApOworCQkJCX0KKworCQkJCWJyZWFrOworCQkJfQorCisJCQljYXNlIEFWTV9PUENPREVfSURJU0FCTEVfSU5WT0tFOgorCQkJeworCQkJCWlmKCAoYWN0aXZpdHlFeGVjID0gU3RhdGVtZW50RmFjdG9yeTo6CisJCQkJCQlnZXRBY3Rpdml0eVRhcmdldEV4ZWN1dGFibGUoYW5Bdm1Qcm9ncmFtLCBhQ29kZSkpCisJCQkJCQkhPSBOVUxMICkKKwkJCQl7CisJCQkJCWNvbXB1dGVJbnB1dEVuYWJsZWRDb20oYWN0aXZpdHlFeGVjLCBpbnB1dEVuYWJsZWRDb20sCisJCQkJCQkJYWN0aXZpdHlFeGVjLT5nZXRPbklEaXNhYmxlKCksIGlzQ29tLAorCQkJCQkJCWhhc011dGFibGVTY2hlZHVsZSApOworCQkJCX0KKworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBBVk1fT1BDT0RFX0RJU0FCTEVfSU5WT0tFOgorCQkJeworCQkJCWlmKCAoYWN0aXZpdHlFeGVjID0gU3RhdGVtZW50RmFjdG9yeTo6CisJCQkJCQlnZXRBY3Rpdml0eVRhcmdldEV4ZWN1dGFibGUoYW5Bdm1Qcm9ncmFtLCBhQ29kZSkpCisJCQkJCQkhPSBOVUxMICkKKwkJCQl7CisJCQkJCWNvbXB1dGVJbnB1dEVuYWJsZWRDb20oYWN0aXZpdHlFeGVjLCBpbnB1dEVuYWJsZWRDb20sCisJCQkJCQkJYWN0aXZpdHlFeGVjLT5nZXRPbkRpc2FibGUoKSwgaXNDb20sCisJCQkJCQkJaGFzTXV0YWJsZVNjaGVkdWxlICk7CisJCQkJfQorCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNhc2UgQVZNX09QQ09ERV9JQUJPUlRfSU5WT0tFOgorCQkJeworCQkJCWlmKCAoYWN0aXZpdHlFeGVjID0gU3RhdGVtZW50RmFjdG9yeTo6CisJCQkJCQlnZXRBY3Rpdml0eVRhcmdldEV4ZWN1dGFibGUoYW5Bdm1Qcm9ncmFtLCBhQ29kZSkpCisJCQkJCQkhPSBOVUxMICkKKwkJCQl7CisJCQkJCWNvbXB1dGVJbnB1dEVuYWJsZWRDb20oYWN0aXZpdHlFeGVjLCBpbnB1dEVuYWJsZWRDb20sCisJCQkJCQkJYWN0aXZpdHlFeGVjLT5nZXRPbklBYm9ydCgpLCBpc0NvbSwKKwkJCQkJCQloYXNNdXRhYmxlU2NoZWR1bGUgKTsKKwkJCQl9CisKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgQVZNX09QQ09ERV9BQk9SVF9JTlZPS0U6CisJCQl7CisJCQkJaWYoIChhY3Rpdml0eUV4ZWMgPSBTdGF0ZW1lbnRGYWN0b3J5OjoKKwkJCQkJCWdldEFjdGl2aXR5VGFyZ2V0RXhlY3V0YWJsZShhbkF2bVByb2dyYW0sIGFDb2RlKSkKKwkJCQkJCSE9IE5VTEwgKQorCQkJCXsKKwkJCQkJY29tcHV0ZUlucHV0RW5hYmxlZENvbShhY3Rpdml0eUV4ZWMsIGlucHV0RW5hYmxlZENvbSwKKwkJCQkJCQlhY3Rpdml0eUV4ZWMtPmdldE9uQWJvcnQoKSwgaXNDb20sCisJCQkJCQkJaGFzTXV0YWJsZVNjaGVkdWxlICk7CisJCQkJfQorCisJCQkJYnJlYWs7CisJCQl9CisKKworCQkJLy8gSnVzdGlmaWNhdGlvbiBvZiB0aGVzZSBzd2l0Y2ggc3RhdGVtZW50CisvLwkJCXN3aXRjaCggKCBhbkF2bVByb2dyYW0tPmlzU2NvcGVUcmFuc2l0aW9uKCkgJiYKKy8vCQkJCQkobm90IE9wZXJhdG9yTWFuYWdlcjo6aXNTY2hlZHVsZShhQ29kZS0+Z2V0T3BlcmF0b3IoKSkpICkgPworLy8JCQkJCQkJQVZNX09QQ09ERV9OVUxMIDogYUNvZGUtPmdldEF2bU9wQ29kZSgpICkKKworCQkJY2FzZSBBVk1fT1BDT0RFX1NFUVVFTkNFOgorCQkJY2FzZSBBVk1fT1BDT0RFX0FUT01JQ19TRVFVRU5DRToKKwkJCWNhc2UgQVZNX09QQ09ERV9TRVFVRU5DRV9TSURFOgorCQkJY2FzZSBBVk1fT1BDT0RFX1BSSU9SX0dUOgorCQkJeworCQkJCUxpc3RPZkluc3RhbmNlT2ZQb3J0IGxvY2FsUG9ydHM7CisKKwkJCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdEFyZyA9IGFDb2RlLT5iZWdpbigpOworCQkJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kQXJnID0gYUNvZGUtPmVuZCgpOworCQkJCWZvciggOyBpdEFyZyAhPSBpdEVuZEFyZyA7ICsraXRBcmcgKQorCQkJCXsKKwkJCQkJaWYoICgqaXRBcmcpLmlzPCBBdm1Db2RlID4oKSApCisJCQkJCXsKKwkJCQkJCWNvbXB1dGVJbnB1dEVuYWJsZWRDb20oIGFuQXZtUHJvZ3JhbSwgbG9jYWxQb3J0cywKKwkJCQkJCQkJKCppdEFyZykudG9fcHRyPCBBdm1Db2RlID4oKSwgaXNDb20sCisJCQkJCQkJCWhhc011dGFibGVTY2hlZHVsZSApOworCisJCQkJCQlpZiggbG9jYWxQb3J0cy5ub25lbXB0eSgpICkKKwkJCQkJCXsKKwkJCQkJCQlpbnB1dEVuYWJsZWRDb20uYWRkX3VuaW9uKGxvY2FsUG9ydHMpOworCisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNhc2UgQVZNX09QQ09ERV9QUklPUl9MVDoKKwkJCXsKKwkJCQlMaXN0T2ZJbnN0YW5jZU9mUG9ydCBsb2NhbFBvcnRzOworCisJCQkJQXZtQ29kZTo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBpdEFyZyA9IGFDb2RlLT5yYmVnaW4oKTsKKwkJCQlBdm1Db2RlOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGl0RW5kQXJnID0gYUNvZGUtPnJlbmQoKTsKKwkJCQlmb3IoIDsgaXRBcmcgIT0gaXRFbmRBcmcgOyArK2l0QXJnICkKKwkJCQl7CisJCQkJCWlmKCAoKml0QXJnKS5pczwgQXZtQ29kZSA+KCkgKQorCQkJCQl7CisJCQkJCQljb21wdXRlSW5wdXRFbmFibGVkQ29tKCBhbkF2bVByb2dyYW0sIGxvY2FsUG9ydHMsCisJCQkJCQkJCSgqaXRBcmcpLnRvX3B0cjwgQXZtQ29kZSA+KCksIGlzQ29tLAorCQkJCQkJCQloYXNNdXRhYmxlU2NoZWR1bGUgKTsKKworCQkJCQkJaWYoIGxvY2FsUG9ydHMubm9uZW1wdHkoKSApCisJCQkJCQl7CisJCQkJCQkJaW5wdXRFbmFibGVkQ29tLmFkZF91bmlvbihsb2NhbFBvcnRzKTsKKworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCQlkZWZhdWx0OgorCQkJeworCQkJCWlmKCBPcGVyYXRvck1hbmFnZXI6OmlzU2NoZWR1bGUoYUNvZGUtPmdldE9wZXJhdG9yKCkpICkKKwkJCQl7CisJCQkJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0QXJnID0gYUNvZGUtPmJlZ2luKCk7CisJCQkJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kQXJnID0gYUNvZGUtPmVuZCgpOworCQkJCQlmb3IoIDsgaXRBcmcgIT0gaXRFbmRBcmcgOyArK2l0QXJnICkKKwkJCQkJeworCQkJCQkJaWYoICgqaXRBcmcpLmlzPCBBdm1Db2RlID4oKSApCisJCQkJCQl7CisJCQkJCQkJY29tcHV0ZUlucHV0RW5hYmxlZENvbSgKKwkJCQkJCQkJCWFuQXZtUHJvZ3JhbSwgaW5wdXRFbmFibGVkQ29tLAorCQkJCQkJCQkJKCppdEFyZykudG9fcHRyPCBBdm1Db2RlID4oKSwgaXNDb20sCisJCQkJCQkJCQloYXNNdXRhYmxlU2NoZWR1bGUgKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorfQorCisKKy8qKgorICogQ29sbGVjdCBpbmZvcm1hdGlvbiBhYm91dAorICogcnVudGltZSBpbnB1dCBlbmFibGVkIGNvbW11bmljYXRpb24KKyAqLwordm9pZCBDb21tdW5pY2F0aW9uRGVwZW5kZW5jeTo6Y29tcHV0ZUlucHV0RW5hYmxlZENvbSgKKwkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsCisJCUxpc3RPZkluc3RhbmNlT2ZQb3J0ICYgaW5wdXRFbmFibGVkQ29tLAorCQlBdm1Db2RlICogYUNvZGUsIGJvb2wgKCppc0NvbSkoQXZtQ29kZSAqIGNvbUNvZGUpICkKK3sKKwlpZiggYUNvZGUgPT0gTlVMTCApCisJeworCQkvLyEhIE5PVEhJTkcKKwkJcmV0dXJuOworCX0KKwllbHNlIGlmKCBpc0NvbShhQ29kZSkgKQorCXsKKwkJaWYoIGFDb2RlLT5maXJzdCgpLmlzPCBJbnN0YW5jZU9mUG9ydCA+KCkgKQorCQl7CisJCQlpbnB1dEVuYWJsZWRDb20uYWRkX3VuaW9uKAorCQkJCQlhQ29kZS0+Zmlyc3QoKS50b19wdHI8IEluc3RhbmNlT2ZQb3J0ID4oKSApOworCQl9CisJfQorCWVsc2UKKwl7CisJCVJ1bnRpbWVJRCBhY3Rpdml0eVJJRDsKKworCQlzd2l0Y2goIGFDb2RlLT5nZXRBdm1PcENvZGUoKSApCisJCXsKKwkJCWNhc2UgQVZNX09QQ09ERV9TQ0hFRFVMRV9JTlZPS0U6CisJCQl7CisJCQkJaWYoIChhY3Rpdml0eVJJRCA9IFN0YXRlbWVudEZhY3Rvcnk6OgorCQkJCQkJZ2V0QWN0aXZpdHlUYXJnZXRSSUQoYW5FRCwgYVJJRCwgYUNvZGUpKS52YWxpZCgpICkKKwkJCQl7CisJCQkJCWlmKCBhY3Rpdml0eVJJRC5nZXRFeGVjdXRhYmxlKCktPmlzTXV0YWJsZVNjaGVkdWxlKCkgKQorCQkJCQl7CisJCQkJCQljb21wdXRlSW5wdXRFbmFibGVkQ29tKGFuRUQsIGFjdGl2aXR5UklELCBpbnB1dEVuYWJsZWRDb20sCisJCQkJCQkJYW5FRC5nZXRSdW50aW1lRm9ybU9uU2NoZWR1bGUoYWN0aXZpdHlSSUQpLCBpc0NvbSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQljb21wdXRlSW5wdXRFbmFibGVkQ29tKGFuRUQsIGFjdGl2aXR5UklELCBpbnB1dEVuYWJsZWRDb20sCisJCQkJCQkJCWFjdGl2aXR5UklELmdldEV4ZWN1dGFibGUoKS0+Z2V0T25TY2hlZHVsZSgpLAorCQkJCQkJCQlpc0NvbSApOworCQkJCQl9CisJCQkJfQorCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNhc2UgQVZNX09QQ09ERV9JTlZPS0VfVFJBTlNJVElPTjoKKwkJCXsKKwkJCQkvLyBQb3VyIMOpdml0ZXIgbGVzIHLDqWN1cnNpb25zIGluZmluaXMgISEhCisJCQkJaWYoIGlzQ29tID09ICgmIENvbW11bmljYXRpb25EZXBlbmRlbmN5Ojppc0lucHV0RW5hYmxlZENvbSkgKQorCQkJCXsKKwkJCQkJaW5wdXRFbmFibGVkQ29tLmFkZF91bmlvbiggYUNvZGUtPmZpcnN0KCkuCisJCQkJCQkJdG9fcHRyPCBBdm1Qcm9ncmFtID4oKS0+Z2V0SW5wdXRFbmFibGVkQ29tKCkgKTsKKwkJCQl9CisJCQkJZWxzZSBpZiggaXNDb20gPT0gKCYgQ29tbXVuaWNhdGlvbkRlcGVuZGVuY3k6OmlzSW5wdXRFbmFibGVkU2F2ZSkgKQorCQkJCXsKKwkJCQkJaW5wdXRFbmFibGVkQ29tLmFkZF91bmlvbiggYUNvZGUtPmZpcnN0KCkuCisJCQkJCQkJdG9fcHRyPCBBdm1Qcm9ncmFtID4oKS0+Z2V0SW5wdXRFbmFibGVkU2F2ZSgpICk7CisJCQkJfQorCisJCQkJZWxzZSBpZiggaXNDb20gPT0gKCYgQ29tbXVuaWNhdGlvbkRlcGVuZGVuY3k6OmlzSW5wdXRDb20pICkKKwkJCQl7CisJCQkJCWlucHV0RW5hYmxlZENvbS5hZGRfdW5pb24oIGFDb2RlLT5maXJzdCgpLgorCQkJCQkJCXRvX3B0cjwgQXZtUHJvZ3JhbSA+KCktPmdldElucHV0Q29tKCkgKTsKKwkJCQl9CisJCQkJZWxzZSBpZiggaXNDb20gPT0gKCYgQ29tbXVuaWNhdGlvbkRlcGVuZGVuY3k6OmlzT3V0cHV0Q29tKSApCisJCQkJeworCQkJCQlpbnB1dEVuYWJsZWRDb20uYWRkX3VuaW9uKCBhQ29kZS0+Zmlyc3QoKS4KKwkJCQkJCQl0b19wdHI8IEF2bVByb2dyYW0gPigpLT5nZXRPdXRwdXRDb20oKSApOworCQkJCX0KKworCQkJCWVsc2UKKwkJCQl7CisJCQkJCWNvbXB1dGVJbnB1dEVuYWJsZWRDb20oYW5FRCwgYWN0aXZpdHlSSUQsIGlucHV0RW5hYmxlZENvbSwKKwkJCQkJCWFDb2RlLT5maXJzdCgpLnRvX3B0cjwgQXZtUHJvZ3JhbSA+KCktPmdldENvZGUoKSwgaXNDb20pOworCQkJCX0KKworCQkJCWJyZWFrOworCQkJfQorCisJCQljYXNlIEFWTV9PUENPREVfSVJVTjoKKwkJCXsKKwkJCQlpZiggKGFjdGl2aXR5UklEID0gU3RhdGVtZW50RmFjdG9yeTo6CisJCQkJCQlnZXRBY3Rpdml0eVRhcmdldFJJRChhbkVELCBhUklELCBhQ29kZSkpLnZhbGlkKCkgKQorCQkJCXsKKwkJCQkJY29tcHV0ZUlucHV0RW5hYmxlZENvbShhbkVELCBhY3Rpdml0eVJJRCwgaW5wdXRFbmFibGVkQ29tLAorCQkJCQkJCWFjdGl2aXR5UklELmdldEV4ZWN1dGFibGUoKS0+Z2V0T25JUnVuKCksIGlzQ29tICk7CisJCQkJfQorCisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIEFWTV9PUENPREVfUlVOOgorCQkJeworCQkJCWlmKCAoYWN0aXZpdHlSSUQgPSBTdGF0ZW1lbnRGYWN0b3J5OjoKKwkJCQkJCWdldEFjdGl2aXR5VGFyZ2V0UklEKGFuRUQsIGFSSUQsIGFDb2RlKSkudmFsaWQoKSApCisJCQkJeworCQkJCQljb21wdXRlSW5wdXRFbmFibGVkQ29tKGFuRUQsIGFjdGl2aXR5UklELCBpbnB1dEVuYWJsZWRDb20sCisJCQkJCQkJYWN0aXZpdHlSSUQuZ2V0RXhlY3V0YWJsZSgpLT5nZXRPblJ1bigpLCBpc0NvbSApOworCQkJCX0KKworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBBVk1fT1BDT0RFX1JUQzoKKwkJCXsKKwkJCQlpZiggKGFjdGl2aXR5UklEID0gU3RhdGVtZW50RmFjdG9yeTo6CisJCQkJCQlnZXRBY3Rpdml0eVRhcmdldFJJRChhbkVELCBhUklELCBhQ29kZSkpICE9IE5VTEwgKQorCQkJCXsKKwkJCQkJY29tcHV0ZUlucHV0RW5hYmxlZENvbShhbkVELCBhY3Rpdml0eVJJRCwgaW5wdXRFbmFibGVkQ29tLAorCQkJCQkJCWFjdGl2aXR5UklELmdldEV4ZWN1dGFibGUoKS0+Z2V0T25SdGMoKSwgaXNDb20gKTsKKwkJCQl9CisKKwkJCQlicmVhazsKKwkJCX0KKworCQkJY2FzZSBBVk1fT1BDT0RFX0lFTkFCTEVfSU5WT0tFOgorCQkJeworCQkJCWlmKCAoYWN0aXZpdHlSSUQgPSBTdGF0ZW1lbnRGYWN0b3J5OjoKKwkJCQkJCWdldEFjdGl2aXR5VGFyZ2V0UklEKGFuRUQsIGFSSUQsIGFDb2RlKSkudmFsaWQoKSApCisJCQkJeworCQkJCQljb21wdXRlSW5wdXRFbmFibGVkQ29tKGFuRUQsIGFjdGl2aXR5UklELCBpbnB1dEVuYWJsZWRDb20sCisJCQkJCQkJYWN0aXZpdHlSSUQuZ2V0RXhlY3V0YWJsZSgpLT5nZXRPbklFbmFibGUoKSwKKwkJCQkJCQlpc0NvbSApOworCQkJCX0KKworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBBVk1fT1BDT0RFX0VOQUJMRV9JTlZPS0U6CisJCQl7CisJCQkJaWYoIChhY3Rpdml0eVJJRCA9IFN0YXRlbWVudEZhY3Rvcnk6OgorCQkJCQkJZ2V0QWN0aXZpdHlUYXJnZXRSSUQoYW5FRCwgYVJJRCwgYUNvZGUpKS52YWxpZCgpICkKKwkJCQl7CisJCQkJCWNvbXB1dGVJbnB1dEVuYWJsZWRDb20oYW5FRCwgYWN0aXZpdHlSSUQsIGlucHV0RW5hYmxlZENvbSwKKwkJCQkJCQlhY3Rpdml0eVJJRC5nZXRFeGVjdXRhYmxlKCktPmdldE9uRW5hYmxlKCksCisJCQkJCQkJaXNDb20gKTsKKwkJCQl9CisKKwkJCQlicmVhazsKKwkJCX0KKworCQkJY2FzZSBBVk1fT1BDT0RFX0lESVNBQkxFX0lOVk9LRToKKwkJCXsKKwkJCQlpZiggKGFjdGl2aXR5UklEID0gU3RhdGVtZW50RmFjdG9yeTo6CisJCQkJCQlnZXRBY3Rpdml0eVRhcmdldFJJRChhbkVELCBhUklELCBhQ29kZSkpLnZhbGlkKCkgKQorCQkJCXsKKwkJCQkJY29tcHV0ZUlucHV0RW5hYmxlZENvbShhbkVELCBhY3Rpdml0eVJJRCwgaW5wdXRFbmFibGVkQ29tLAorCQkJCQkJCWFjdGl2aXR5UklELmdldEV4ZWN1dGFibGUoKS0+Z2V0T25JRGlzYWJsZSgpLAorCQkJCQkJCWlzQ29tICk7CisJCQkJfQorCisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIEFWTV9PUENPREVfRElTQUJMRV9JTlZPS0U6CisJCQl7CisJCQkJaWYoIChhY3Rpdml0eVJJRCA9IFN0YXRlbWVudEZhY3Rvcnk6OgorCQkJCQkJZ2V0QWN0aXZpdHlUYXJnZXRSSUQoYW5FRCwgYVJJRCwgYUNvZGUpKS52YWxpZCgpICkKKwkJCQl7CisJCQkJCWNvbXB1dGVJbnB1dEVuYWJsZWRDb20oYW5FRCwgYWN0aXZpdHlSSUQsIGlucHV0RW5hYmxlZENvbSwKKwkJCQkJCQlhY3Rpdml0eVJJRC5nZXRFeGVjdXRhYmxlKCktPmdldE9uRGlzYWJsZSgpLAorCQkJCQkJCWlzQ29tICk7CisJCQkJfQorCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNhc2UgQVZNX09QQ09ERV9JQUJPUlRfSU5WT0tFOgorCQkJeworCQkJCWlmKCAoYWN0aXZpdHlSSUQgPSBTdGF0ZW1lbnRGYWN0b3J5OjoKKwkJCQkJCWdldEFjdGl2aXR5VGFyZ2V0UklEKGFuRUQsIGFSSUQsIGFDb2RlKSkudmFsaWQoKSApCisJCQkJeworCQkJCQljb21wdXRlSW5wdXRFbmFibGVkQ29tKGFuRUQsIGFjdGl2aXR5UklELCBpbnB1dEVuYWJsZWRDb20sCisJCQkJCQkJYWN0aXZpdHlSSUQuZ2V0RXhlY3V0YWJsZSgpLT5nZXRPbklBYm9ydCgpLAorCQkJCQkJCWlzQ29tICk7CisJCQkJfQorCisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIEFWTV9PUENPREVfQUJPUlRfSU5WT0tFOgorCQkJeworCQkJCWlmKCAoYWN0aXZpdHlSSUQgPSBTdGF0ZW1lbnRGYWN0b3J5OjoKKwkJCQkJCWdldEFjdGl2aXR5VGFyZ2V0UklEKGFuRUQsIGFSSUQsIGFDb2RlKSkudmFsaWQoKSApCisJCQkJeworCQkJCQljb21wdXRlSW5wdXRFbmFibGVkQ29tKGFuRUQsIGFjdGl2aXR5UklELCBpbnB1dEVuYWJsZWRDb20sCisJCQkJCQkJYWN0aXZpdHlSSUQuZ2V0RXhlY3V0YWJsZSgpLT5nZXRPbkFib3J0KCksIGlzQ29tICk7CisJCQkJfQorCisJCQkJYnJlYWs7CisJCQl9CisKKworCQkJY2FzZSBBVk1fT1BDT0RFX1NFUVVFTkNFOgorCQkJY2FzZSBBVk1fT1BDT0RFX0FUT01JQ19TRVFVRU5DRToKKwkJCWNhc2UgQVZNX09QQ09ERV9TRVFVRU5DRV9TSURFOgorCQkJY2FzZSBBVk1fT1BDT0RFX1BSSU9SX0dUOgorCQkJeworCQkJCUxpc3RPZkluc3RhbmNlT2ZQb3J0IGxvY2FsUG9ydHM7CisKKwkJCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdEFyZyA9IGFDb2RlLT5iZWdpbigpOworCQkJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kQXJnID0gYUNvZGUtPmVuZCgpOworCQkJCWZvciggOyBpdEFyZyAhPSBpdEVuZEFyZyA7ICsraXRBcmcgKQorCQkJCXsKKwkJCQkJaWYoICgqaXRBcmcpLmlzPCBBdm1Db2RlID4oKSApCisJCQkJCXsKKwkJCQkJCWNvbXB1dGVJbnB1dEVuYWJsZWRDb20oYW5FRCwgYVJJRCwgbG9jYWxQb3J0cywKKwkJCQkJCQkJKCppdEFyZykudG9fcHRyPCBBdm1Db2RlID4oKSwgaXNDb20gKTsKKworCQkJCQkJaWYoIGxvY2FsUG9ydHMubm9uZW1wdHkoKSApCisJCQkJCQl7CisJCQkJCQkJaW5wdXRFbmFibGVkQ29tLmFkZF91bmlvbihsb2NhbFBvcnRzKTsKKworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCQljYXNlIEFWTV9PUENPREVfUFJJT1JfTFQ6CisJCQl7CisJCQkJTGlzdE9mSW5zdGFuY2VPZlBvcnQgbG9jYWxQb3J0czsKKworCQkJCUF2bUNvZGU6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgaXRBcmcgPSBhQ29kZS0+cmJlZ2luKCk7CisJCQkJQXZtQ29kZTo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBpdEVuZEFyZyA9IGFDb2RlLT5yZW5kKCk7CisJCQkJZm9yKCA7IGl0QXJnICE9IGl0RW5kQXJnIDsgKytpdEFyZyApCisJCQkJeworCQkJCQlpZiggKCppdEFyZykuaXM8IEF2bUNvZGUgPigpICkKKwkJCQkJeworCQkJCQkJY29tcHV0ZUlucHV0RW5hYmxlZENvbShhbkVELCBhUklELCBsb2NhbFBvcnRzLAorCQkJCQkJCQkoKml0QXJnKS50b19wdHI8IEF2bUNvZGUgPigpLCBpc0NvbSApOworCisJCQkJCQlpZiggbG9jYWxQb3J0cy5ub25lbXB0eSgpICkKKwkJCQkJCXsKKwkJCQkJCQlpbnB1dEVuYWJsZWRDb20uYWRkX3VuaW9uKGxvY2FsUG9ydHMpOworCisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJaWYoIE9wZXJhdG9yTWFuYWdlcjo6aXNTY2hlZHVsZShhQ29kZS0+Z2V0T3BlcmF0b3IoKSkgKQorCQkJCXsKKwkJCQkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXRBcmcgPSBhQ29kZS0+YmVnaW4oKTsKKwkJCQkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXRFbmRBcmcgPSBhQ29kZS0+ZW5kKCk7CisJCQkJCWZvciggOyBpdEFyZyAhPSBpdEVuZEFyZyA7ICsraXRBcmcgKQorCQkJCQl7CisJCQkJCQlpZiggKCppdEFyZykuaXM8IEF2bUNvZGUgPigpICkKKwkJCQkJCXsKKwkJCQkJCQljb21wdXRlSW5wdXRFbmFibGVkQ29tKAorCQkJCQkJCQkJYW5FRCwgYVJJRCwgaW5wdXRFbmFibGVkQ29tLAorCQkJCQkJCQkJKCppdEFyZykudG9fcHRyPCBBdm1Db2RlID4oKSwgaXNDb20gKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorfQorCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9hbmFseXNpcy9Db21tdW5pY2F0aW9uRGVwZW5kZW5jeS5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9hbmFseXNpcy9Db21tdW5pY2F0aW9uRGVwZW5kZW5jeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MjkwNTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL2FuYWx5c2lzL0NvbW11bmljYXRpb25EZXBlbmRlbmN5LmgKQEAgLTAsMCArMSwyNzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyNCBmw6l2ci4gMjAxNAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIENPTU1VTklDQVRJT05ERVBFTkRFTkNZX0hfCisjZGVmaW5lIENPTU1VTklDQVRJT05ERVBFTkRFTkNZX0hfCisKKyNpbmNsdWRlIDxjb21tb24vQkYuaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0F2bUNvZGUuaD4KKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0F2bVByb2dyYW0uaD4KKworI2luY2x1ZGUgPGZtbC9vcGVyYXRvci9PcGVyYXRvckxpYi5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjbGFzcyBFeGVjdXRpb25EYXRhOworCisKK2NsYXNzIENvbW11bmljYXRpb25EZXBlbmRlbmN5Cit7CisKK3B1YmxpYzoKKworCS8qKgorCSAqIENvbGxlY3QgaW5mb3JtYXRpb24gYWJvdXQKKwkgKiBnZW5lcmFsIGNvbW11bmljYXRpb24KKwkgKi8KKwlzdGF0aWMgQkYgZ2V0Q29tbXVuaWNhdGlvbkNvZGUoCisJCQlBdm1Qcm9ncmFtICogYW5Bdm1Qcm9ncmFtLCBjb25zdCBCRkNvZGUgJiBhQ29kZSwKKwkJCWJvb2wgKCppc0NvbSkoQXZtQ29kZSAqIGNvbUNvZGUpICwgYm9vbCAmIGhhc011dGFibGVTY2hlZHVsZSApOworCisKKwlzdGF0aWMgYm9vbCBpc0NvbW11bmljYXRpb25Db2RlKEF2bUNvZGUgKiBjb21Db2RlKQorCXsKKwkJQVZNX09QQ09ERSBvcENvZGUgPSBjb21Db2RlLT5nZXRBdm1PcENvZGUoKTsKKworCQlyZXR1cm4oIChvcENvZGUgPT0gQVZNX09QQ09ERV9JTlBVVCAgICAgICkgfHwKKwkJCQkob3BDb2RlID09IEFWTV9PUENPREVfSU5QVVRfRlJPTSApIHx8CisJCQkJKG9wQ29kZSA9PSBBVk1fT1BDT0RFX09VVFBVVCAgICAgKSB8fAorCQkJCShvcENvZGUgPT0gQVZNX09QQ09ERV9PVVRQVVRfVE8gICkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIEJGIGdldENvbW11bmljYXRpb25Db2RlKEF2bVByb2dyYW0gKiBhbkF2bVByb2dyYW0sCisJCQljb25zdCBCRkNvZGUgJiBhQ29kZSwgYm9vbCAmIGhhc011dGFibGVTY2hlZHVsZSkKKwl7CisJCXJldHVybiggZ2V0Q29tbXVuaWNhdGlvbkNvZGUoYW5Bdm1Qcm9ncmFtLCBhQ29kZSwKKwkJCQkmIENvbW11bmljYXRpb25EZXBlbmRlbmN5Ojppc0NvbW11bmljYXRpb25Db2RlLAorCQkJCWhhc011dGFibGVTY2hlZHVsZSkgKTsKKwl9CisKKworCXN0YXRpYyBib29sIGlzSW50ZXJuYWxDb21tdW5pY2F0aW9uQ29kZShBdm1Db2RlICogY29tQ29kZSkKKwl7CisJCUFWTV9PUENPREUgb3BDb2RlID0gY29tQ29kZS0+Z2V0QXZtT3BDb2RlKCk7CisJCUFWTV9PUENPREUgb3B0aW1pekNvZGUgPSBjb21Db2RlLT5nZXRPcHRpbWl6ZWRPcENvZGUoKTsKKworCQlyZXR1cm4oICgob3BDb2RlID09IEFWTV9PUENPREVfSU5QVVQgICAgICkgfHwKKwkJCQkob3BDb2RlID09IEFWTV9PUENPREVfSU5QVVRfRlJPTSApIHx8CisJCQkJKG9wQ29kZSA9PSBBVk1fT1BDT0RFX09VVFBVVCAgICAgKSB8fAorCQkJCShvcENvZGUgPT0gQVZNX09QQ09ERV9PVVRQVVRfVE8gICkgKSAgJiYKKwkJCQkob3B0aW1pekNvZGUgIT0gQVZNX09QQ09ERV9JTlBVVF9FTlYpICYmCisJCQkJKG9wdGltaXpDb2RlICE9IEFWTV9PUENPREVfT1VUUFVUX0VOVikgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIEJGIGdldEludGVybmFsQ29tbXVuaWNhdGlvbkNvZGUoQXZtUHJvZ3JhbSAqIGFuQXZtUHJvZ3JhbSwKKwkJCWNvbnN0IEJGQ29kZSAmIGFDb2RlLCBib29sICYgaGFzTXV0YWJsZVNjaGVkdWxlKQorCXsKKwkJcmV0dXJuKCBnZXRDb21tdW5pY2F0aW9uQ29kZShhbkF2bVByb2dyYW0sIGFDb2RlLAorCQkJCSYgQ29tbXVuaWNhdGlvbkRlcGVuZGVuY3k6OmlzSW50ZXJuYWxDb21tdW5pY2F0aW9uQ29kZSwKKwkJCQloYXNNdXRhYmxlU2NoZWR1bGUpICk7CisJfQorCisKKwkvKioKKwkgKiBDb2xsZWN0IGluZm9ybWF0aW9uIGFib3V0CisJICogY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBlbnZpcm9ubWVudAorCSAqLworCXN0YXRpYyBib29sIGlzRW52aXJvbm1lbnRDb20oQXZtQ29kZSAqIGNvbUNvZGUpCisJeworCQlBVk1fT1BDT0RFIG9wdGltaXplQ29kZSA9IGNvbUNvZGUtPmdldE9wdGltaXplZE9wQ29kZSgpOworCisJCXJldHVybiggKG9wdGltaXplQ29kZSA9PSBBVk1fT1BDT0RFX0lOUFVUX0VOVikgfHwKKwkJCQkob3B0aW1pemVDb2RlID09IEFWTV9PUENPREVfT1VUUFVUX0VOVikgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIEJGIGdldEVudmlyb25tZW50Q29tKEF2bVByb2dyYW0gKiBhbkF2bVByb2dyYW0sCisJCQljb25zdCBCRkNvZGUgJiBhQ29kZSwgYm9vbCAmIGhhc011dGFibGVTY2hlZHVsZSkKKwl7CisJCXJldHVybiggZ2V0Q29tbXVuaWNhdGlvbkNvZGUoYW5Bdm1Qcm9ncmFtLCBhQ29kZSwKKwkJCQkmIENvbW11bmljYXRpb25EZXBlbmRlbmN5Ojppc0Vudmlyb25tZW50Q29tLAorCQkJCWhhc011dGFibGVTY2hlZHVsZSkgKTsKKwl9CisKKworCisJc3RhdGljIGJvb2wgaXNFbnZpcm9ubWVudElucHV0Q29tKEF2bUNvZGUgKiBjb21Db2RlKQorCXsKKwkJcmV0dXJuKCBjb21Db2RlLT5nZXRPcHRpbWl6ZWRPcENvZGUoKSA9PSBBVk1fT1BDT0RFX0lOUFVUX0VOViApOworCX0KKworCWlubGluZSBzdGF0aWMgQkYgZ2V0RW52aXJvbm1lbnRJbnB1dENvbShBdm1Qcm9ncmFtICogYW5Bdm1Qcm9ncmFtLAorCQkJY29uc3QgQkZDb2RlICYgYUNvZGUsIGJvb2wgJiBoYXNNdXRhYmxlU2NoZWR1bGUpCisJeworCQlyZXR1cm4oIGdldENvbW11bmljYXRpb25Db2RlKGFuQXZtUHJvZ3JhbSwgYUNvZGUsCisJCQkJJiBDb21tdW5pY2F0aW9uRGVwZW5kZW5jeTo6aXNFbnZpcm9ubWVudElucHV0Q29tLAorCQkJCWhhc011dGFibGVTY2hlZHVsZSkgKTsKKwl9CisKKworCXN0YXRpYyBib29sIGlzRW52aXJvbm1lbnRPdXRwdXRDb20oQXZtQ29kZSAqIGNvbUNvZGUpCisJeworCQlyZXR1cm4oIGNvbUNvZGUtPmdldE9wdGltaXplZE9wQ29kZSgpID09IEFWTV9PUENPREVfT1VUUFVUX0VOViApOworCX0KKworCWlubGluZSBzdGF0aWMgQkYgZ2V0RW52aXJvbm1lbnRPdXRwdXRDb20oQXZtUHJvZ3JhbSAqIGFuQXZtUHJvZ3JhbSwKKwkJCWNvbnN0IEJGQ29kZSAmIGFDb2RlLCBib29sICYgaGFzTXV0YWJsZVNjaGVkdWxlKQorCXsKKwkJcmV0dXJuKCBnZXRDb21tdW5pY2F0aW9uQ29kZShhbkF2bVByb2dyYW0sIGFDb2RlLAorCQkJCSYgQ29tbXVuaWNhdGlvbkRlcGVuZGVuY3k6OmlzRW52aXJvbm1lbnRPdXRwdXRDb20sCisJCQkJaGFzTXV0YWJsZVNjaGVkdWxlKSApOworCX0KKworCisKKwkvKioKKwkgKiBDb2xsZWN0IGluZm9ybWF0aW9uIGFib3V0CisJICogc3RhdGljIGlucHV0IGVuYWJsZWQgY29tbXVuaWNhdGlvbgorCSAqLworCXN0YXRpYyB2b2lkIGNvbXB1dGVJbnB1dEVuYWJsZWRDb20oQXZtUHJvZ3JhbSAqIGFuQXZtUHJvZ3JhbSwKKwkJCUxpc3RPZkluc3RhbmNlT2ZQb3J0ICYgaW5wdXRFbmFibGVkQ29tLCBBdm1Db2RlICogYUNvZGUsCisJCQlib29sICgqaXNDb20pKEF2bUNvZGUgKiBjb21Db2RlKSAsIGJvb2wgJiBoYXNNdXRhYmxlU2NoZWR1bGUgKTsKKworCisJc3RhdGljIGJvb2wgaXNJbnB1dEVuYWJsZWRDb20oQXZtQ29kZSAqIGNvbUNvZGUpCisJeworCQlyZXR1cm4oIChjb21Db2RlLT5oYXNPcENvZGUoIEFWTV9PUENPREVfSU5QVVQsIEFWTV9PUENPREVfSU5QVVRfRlJPTSApKQorCQkJCSYmIChjb21Db2RlLT5nZXRPcHRpbWl6ZWRPcENvZGUoKSAhPSBBVk1fT1BDT0RFX0lOUFVUX0VOVikgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIHZvaWQgY29tcHV0ZUlucHV0RW5hYmxlZENvbSgKKwkJCUF2bVByb2dyYW0gKiBhbkF2bVByb2dyYW0sIEF2bUNvZGUgKiBhQ29kZSkKKwl7CisJCWJvb2wgaGFzTXV0YWJsZVNjaGVkdWxlID0gZmFsc2U7CisKKwkJY29tcHV0ZUlucHV0RW5hYmxlZENvbSggYW5Bdm1Qcm9ncmFtLAorCQkJCWFuQXZtUHJvZ3JhbS0+Z2V0SW5wdXRFbmFibGVkQ29tKCksIGFDb2RlLAorCQkJCSYgQ29tbXVuaWNhdGlvbkRlcGVuZGVuY3k6OmlzSW5wdXRFbmFibGVkQ29tLAorCQkJCWhhc011dGFibGVTY2hlZHVsZSApOworCisJCWFuQXZtUHJvZ3JhbS0+c2V0TXV0YWJsZUNvbW11bmljYXRpb24oIGhhc011dGFibGVTY2hlZHVsZSApOworCX0KKworCisJc3RhdGljIGJvb2wgaXNJbnB1dEVuYWJsZWRTYXZlKEF2bUNvZGUgKiBjb21Db2RlKQorCXsKKwkJcmV0dXJuKCBjb21Db2RlLT5pc09wQ29kZSggQVZNX09QQ09ERV9JTlBVVF9TQVZFICkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIHZvaWQgY29tcHV0ZUlucHV0RW5hYmxlZFNhdmUoCisJCQlBdm1Qcm9ncmFtICogYW5Bdm1Qcm9ncmFtLCBBdm1Db2RlICogYUNvZGUpCisJeworCQlib29sIGhhc011dGFibGVTY2hlZHVsZSA9IGZhbHNlOworCisJCWNvbXB1dGVJbnB1dEVuYWJsZWRDb20oIGFuQXZtUHJvZ3JhbSwKKwkJCQlhbkF2bVByb2dyYW0tPmdldElucHV0RW5hYmxlZFNhdmUoKSwgYUNvZGUsCisJCQkJJiBDb21tdW5pY2F0aW9uRGVwZW5kZW5jeTo6aXNJbnB1dEVuYWJsZWRTYXZlLAorCQkJCWhhc011dGFibGVTY2hlZHVsZSApOworCisJCWFuQXZtUHJvZ3JhbS0+c2V0TXV0YWJsZUNvbW11bmljYXRpb24oIGhhc011dGFibGVTY2hlZHVsZSApOworCX0KKworCisKKwkvKioKKwkgKiBDb2xsZWN0IGluZm9ybWF0aW9uIGFib3V0CisJICogaW5wdXQgLyBvdXRwdXQgaW50ZXJuYWwgY29tbXVuaWNhdGlvbgorCSAqLworCXN0YXRpYyBib29sIGlzSW5wdXRDb20oQXZtQ29kZSAqIGNvbUNvZGUpCisJeworCQlyZXR1cm4oIChjb21Db2RlLT5oYXNPcENvZGUoIEFWTV9PUENPREVfSU5QVVQsIEFWTV9PUENPREVfSU5QVVRfRlJPTSApKQorCQkJCSYmIChjb21Db2RlLT5nZXRPcHRpbWl6ZWRPcENvZGUoKSAhPSBBVk1fT1BDT0RFX0lOUFVUX0VOVikgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIEJGIGdldElucHV0Q29tKEF2bVByb2dyYW0gKiBhbkF2bVByb2dyYW0sCisJCQljb25zdCBCRkNvZGUgJiBhQ29kZSwgYm9vbCAmIGhhc011dGFibGVTY2hlZHVsZSkKKwl7CisJCXJldHVybiggZ2V0Q29tbXVuaWNhdGlvbkNvZGUoYW5Bdm1Qcm9ncmFtLCBhQ29kZSwKKwkJCQkmIENvbW11bmljYXRpb25EZXBlbmRlbmN5Ojppc0lucHV0Q29tLCBoYXNNdXRhYmxlU2NoZWR1bGUpICk7CisJfQorCisJc3RhdGljIHZvaWQgY29tcHV0ZUlucHV0Q29tKEF2bVByb2dyYW0gKiBhbkF2bVByb2dyYW0sIEF2bUNvZGUgKiBhQ29kZSkKKwl7CisJCWJvb2wgaGFzTXV0YWJsZVNjaGVkdWxlID0gZmFsc2U7CisKKwkJY29tcHV0ZUlucHV0RW5hYmxlZENvbShhbkF2bVByb2dyYW0sIGFuQXZtUHJvZ3JhbS0+Z2V0SW5wdXRDb20oKSwgYUNvZGUsCisJCQkJJiBDb21tdW5pY2F0aW9uRGVwZW5kZW5jeTo6aXNJbnB1dENvbSwgaGFzTXV0YWJsZVNjaGVkdWxlKTsKKworCQlhbkF2bVByb2dyYW0tPnNldE11dGFibGVDb21tdW5pY2F0aW9uKCBoYXNNdXRhYmxlU2NoZWR1bGUgKTsKKwl9CisKKworCXN0YXRpYyBib29sIGlzT3V0cHV0Q29tKEF2bUNvZGUgKiBjb21Db2RlKQorCXsKKwkJcmV0dXJuKCAoY29tQ29kZS0+aGFzT3BDb2RlKCBBVk1fT1BDT0RFX09VVFBVVCwgQVZNX09QQ09ERV9PVVRQVVRfVE8gKSkKKwkJCQkmJiAoY29tQ29kZS0+Z2V0T3B0aW1pemVkT3BDb2RlKCkgIT0gQVZNX09QQ09ERV9PVVRQVVRfRU5WKSApOworCX0KKworCWlubGluZSBzdGF0aWMgQkYgZ2V0T3V0cHV0Q29tKEF2bVByb2dyYW0gKiBhbkF2bVByb2dyYW0sCisJCQljb25zdCBCRkNvZGUgJiBhQ29kZSwgYm9vbCAmIGhhc011dGFibGVTY2hlZHVsZSkKKwl7CisJCXJldHVybiggZ2V0Q29tbXVuaWNhdGlvbkNvZGUoYW5Bdm1Qcm9ncmFtLCBhQ29kZSwKKwkJCQkmIENvbW11bmljYXRpb25EZXBlbmRlbmN5Ojppc091dHB1dENvbSwgaGFzTXV0YWJsZVNjaGVkdWxlKSApOworCX0KKworCisJc3RhdGljIHZvaWQgY29tcHV0ZU91dHB1dENvbSggQXZtUHJvZ3JhbSAqIGFuQXZtUHJvZ3JhbSwgQXZtQ29kZSAqIGFDb2RlKQorCXsKKwkJYm9vbCBoYXNNdXRhYmxlU2NoZWR1bGUgPSBmYWxzZTsKKworCQljb21wdXRlSW5wdXRFbmFibGVkQ29tKGFuQXZtUHJvZ3JhbSwgYW5Bdm1Qcm9ncmFtLT5nZXRPdXRwdXRDb20oKSwgYUNvZGUsCisJCQkJJiBDb21tdW5pY2F0aW9uRGVwZW5kZW5jeTo6aXNPdXRwdXRDb20sIGhhc011dGFibGVTY2hlZHVsZSk7CisKKwkJYW5Bdm1Qcm9ncmFtLT5zZXRNdXRhYmxlQ29tbXVuaWNhdGlvbiggaGFzTXV0YWJsZVNjaGVkdWxlICk7CisJfQorCisKKworCS8qKgorCSAqIENvbGxlY3QgaW5mb3JtYXRpb24gYWJvdXQKKwkgKiBydW50aW1lIGlucHV0IGVuYWJsZWQgY29tbXVuaWNhdGlvbgorCSAqLworCXN0YXRpYyB2b2lkIGNvbXB1dGVJbnB1dEVuYWJsZWRDb20oY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQsCisJCQljb25zdCBSdW50aW1lSUQgJiBhUklELCBMaXN0T2ZJbnN0YW5jZU9mUG9ydCAmIGlucHV0RW5hYmxlZENvbSwKKwkJCUF2bUNvZGUgKiBhQ29kZSwgYm9vbCAoKmlzQ29tKShBdm1Db2RlICogY29tQ29kZSkgKTsKKworCisJaW5saW5lIHN0YXRpYyB2b2lkIGNvbXB1dGVJbnB1dEVuYWJsZWRDb20oCisJCQljb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwgY29uc3QgUnVudGltZUlEICYgYVJJRCwKKwkJCUxpc3RPZkluc3RhbmNlT2ZQb3J0ICYgaW5wdXRFbmFibGVkQ29tLCBBdm1Db2RlICogYUNvZGUpCisJeworCQljb21wdXRlSW5wdXRFbmFibGVkQ29tKGFuRUQsIGFSSUQsIGlucHV0RW5hYmxlZENvbSwgYUNvZGUsCisJCQkJJiBDb21tdW5pY2F0aW9uRGVwZW5kZW5jeTo6aXNJbnB1dEVuYWJsZWRDb20gKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIHZvaWQgY29tcHV0ZUlucHV0RW5hYmxlZFNhdmUoCisJCQljb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwgY29uc3QgUnVudGltZUlEICYgYVJJRCwKKwkJCUxpc3RPZkluc3RhbmNlT2ZQb3J0ICYgaW5wdXRFbmFibGVkU2F2ZSwgQXZtQ29kZSAqIGFDb2RlICkKKwl7CisJCWNvbXB1dGVJbnB1dEVuYWJsZWRDb20oYW5FRCwgYVJJRCwgaW5wdXRFbmFibGVkU2F2ZSwgYUNvZGUsCisJCQkJJiBDb21tdW5pY2F0aW9uRGVwZW5kZW5jeTo6aXNJbnB1dEVuYWJsZWRTYXZlICk7CisJfQorCisKKworfTsKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKiBDT01NVU5JQ0FUSU9OREVQRU5ERU5DWV9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9hbmFseXNpcy9NYWNoaW5lRGVwZW5kZW5jeS5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL2FuYWx5c2lzL01hY2hpbmVEZXBlbmRlbmN5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGZjN2ViCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9hbmFseXNpcy9NYWNoaW5lRGVwZW5kZW5jeS5jcHAKQEAgLTAsMCArMSwxMjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyNSBqdWlsLiAyMDEzCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJNYWNoaW5lRGVwZW5kZW5jeS5oIgorCisjaW5jbHVkZSA8Y29tbW9uL0JGLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9Bdm1MYW1iZGEuaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9Bdm1Qcm9ncmFtLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZUZvcm0uaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlU3lzdGVtLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9Bdm1Db2RlLmg+CisKK25hbWVzcGFjZSBzZXAKK3sKKworCitib29sIE1hY2hpbmVEZXBlbmRlbmN5Ojpjb21wdXRlVmFyaWFibGVEZXBlbmRlbmN5KEV4ZWN1dGFibGVTeXN0ZW0gKiBhbkV4ZWNTeXN0ZW0pCit7CisJY29uc3QgVGFibGVPZkV4ZWN1dGFibGVGb3JtICYgZXhlY3V0YWJsZXMgPSBhbkV4ZWNTeXN0ZW0tPmdldEV4ZWN1dGFibGVzKCk7CisKKwlUYWJsZU9mRXhlY3V0YWJsZUZvcm06OmNvbnN0X3Jhd19pdGVyYXRvciBpdEV4ZWMgPSBleGVjdXRhYmxlcy5iZWdpbigpOworCVRhYmxlT2ZFeGVjdXRhYmxlRm9ybTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGVuZEV4ZWMgPSBleGVjdXRhYmxlcy5lbmQoKTsKKwlmb3IoIDsgaXRFeGVjICE9IGVuZEV4ZWMgOyArK2l0RXhlYyApCisJeworCQlpZiggbm90IGNvbXB1dGVWYXJpYWJsZURlcGVuZGVuY3koIGl0RXhlYyApICkKKwkJeworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworCitib29sIE1hY2hpbmVEZXBlbmRlbmN5Ojpjb21wdXRlVmFyaWFibGVEZXBlbmRlbmN5KEV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlKQoreworCWF2bV9zaXplX3QgZW5kT2Zmc2V0ID0gYW5FeGVjdXRhYmxlLT5nZXRUcmFuc2l0aW9uKCkuc2l6ZSgpOworCWZvciggYXZtX3NpemVfdCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgZW5kT2Zmc2V0IDsgKytvZmZzZXQgKQorCXsKKwkJaWYoIG5vdCBjb21wdXRlVmFyaWFibGVEZXBlbmRlbmN5KCBhbkV4ZWN1dGFibGUtPnJhd1RyYW5zaXRpb24ob2Zmc2V0KSApICkKKwkJeworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorCisJZW5kT2Zmc2V0ID0gYW5FeGVjdXRhYmxlLT5nZXRQcm9ncmFtKCkuc2l6ZSgpOworCWZvciggYXZtX3NpemVfdCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgZW5kT2Zmc2V0IDsgKytvZmZzZXQgKQorCXsKKwkJaWYoIG5vdCBjb21wdXRlVmFyaWFibGVEZXBlbmRlbmN5KCBhbkV4ZWN1dGFibGUtPnJhd1Byb2dyYW0ob2Zmc2V0KSApICkKKwkJeworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworYm9vbCBNYWNoaW5lRGVwZW5kZW5jeTo6aXNWYXJpYWJsZURlcGVuZGVuY3koCisJCUV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlLCBBdm1Db2RlICogYUNvZGUpCit7CisJcmV0dXJuKCBmYWxzZSApOworfQorCitib29sIE1hY2hpbmVEZXBlbmRlbmN5Ojppc1ZhcmlhYmxlRGVwZW5kZW5jeSgKKwkJRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGUsIGNvbnN0IEJGICYgYVZhcikKK3sKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKworCitib29sIE1hY2hpbmVEZXBlbmRlbmN5Ojpjb21wdXRlVmFyaWFibGVEZXBlbmRlbmN5KEF2bVByb2dyYW0gKiBhUHJvZ3JhbSkKK3sKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKK2Jvb2wgTWFjaGluZURlcGVuZGVuY3k6OmlzVmFyaWFibGVEZXBlbmRlbmN5KAorCQlBdm1Qcm9ncmFtICogYVByb2dyYW0sIEF2bUNvZGUgKiBhQ29kZSkKK3sKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKK2Jvb2wgTWFjaGluZURlcGVuZGVuY3k6OmlzVmFyaWFibGVEZXBlbmRlbmN5KAorCQlBdm1Qcm9ncmFtICogYVByb2dyYW0sIGNvbnN0IEJGICYgYVZhcikKK3sKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKworCitib29sIE1hY2hpbmVEZXBlbmRlbmN5Ojpjb21wdXRlVmFyaWFibGVEZXBlbmRlbmN5KEF2bUxhbWJkYSAqIGFMYW1iZGEpCit7CisJcmV0dXJuKCBmYWxzZSApOworfQorCitib29sIE1hY2hpbmVEZXBlbmRlbmN5Ojppc1ZhcmlhYmxlRGVwZW5kZW5jeSgKKwkJQXZtTGFtYmRhICogYUxhbWJkYSwgQXZtQ29kZSAqIGFDb2RlKQoreworCXJldHVybiggZmFsc2UgKTsKK30KKworYm9vbCBNYWNoaW5lRGVwZW5kZW5jeTo6aXNWYXJpYWJsZURlcGVuZGVuY3koCisJCUF2bUxhbWJkYSAqIGFMYW1iZGEsIGNvbnN0IEJGICYgYVZhcikKK3sKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvYW5hbHlzaXMvTWFjaGluZURlcGVuZGVuY3kuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvYW5hbHlzaXMvTWFjaGluZURlcGVuZGVuY3kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2ZhMWE5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9hbmFseXNpcy9NYWNoaW5lRGVwZW5kZW5jeS5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyNSBqdWlsLiAyMDEzCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgTUFDSElORURFUEVOREVOQ1lfSF8KKyNkZWZpbmUgTUFDSElORURFUEVOREVOQ1lfSF8KKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIEJGOworCitjbGFzcyBBdm1Db2RlOworCitjbGFzcyBBdm1MYW1iZGE7CitjbGFzcyBBdm1Qcm9ncmFtOworY2xhc3MgRXhlY3V0YWJsZUZvcm07CitjbGFzcyBFeGVjdXRhYmxlU3lzdGVtOworCisKK2NsYXNzIE1hY2hpbmVEZXBlbmRlbmN5Cit7CisKK3B1YmxpYzoKKworCXN0YXRpYyBib29sIGNvbXB1dGVWYXJpYWJsZURlcGVuZGVuY3koRXhlY3V0YWJsZVN5c3RlbSAqIGFuRXhlY1N5c3RlbSk7CisKKworCXN0YXRpYyBib29sIGNvbXB1dGVWYXJpYWJsZURlcGVuZGVuY3koRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGUpOworCisJc3RhdGljIGJvb2wgaXNWYXJpYWJsZURlcGVuZGVuY3koCisJCQlFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZSwgQXZtQ29kZSAqIGFDb2RlKTsKKwlzdGF0aWMgYm9vbCBpc1ZhcmlhYmxlRGVwZW5kZW5jeSgKKwkJCUV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlLCBjb25zdCBCRiAmIGFWYXIpOworCisKKwlzdGF0aWMgYm9vbCBjb21wdXRlVmFyaWFibGVEZXBlbmRlbmN5KEF2bVByb2dyYW0gKiBhUHJvZ3JhbSk7CisKKwlzdGF0aWMgYm9vbCBpc1ZhcmlhYmxlRGVwZW5kZW5jeSgKKwkJCUF2bVByb2dyYW0gKiBhUHJvZ3JhbSwgQXZtQ29kZSAqIGFDb2RlKTsKKwlzdGF0aWMgYm9vbCBpc1ZhcmlhYmxlRGVwZW5kZW5jeSgKKwkJCUF2bVByb2dyYW0gKiBhUHJvZ3JhbSwgY29uc3QgQkYgJiBhVmFyKTsKKworCisJc3RhdGljIGJvb2wgY29tcHV0ZVZhcmlhYmxlRGVwZW5kZW5jeShBdm1MYW1iZGEgKiBhTGFtYmRhKTsKKworCXN0YXRpYyBib29sIGlzVmFyaWFibGVEZXBlbmRlbmN5KAorCQkJQXZtTGFtYmRhICogYUxhbWJkYSwgQXZtQ29kZSAqIGFDb2RlKTsKKworCXN0YXRpYyBib29sIGlzVmFyaWFibGVEZXBlbmRlbmN5KAorCQkJQXZtTGFtYmRhICogYUxhbWJkYSwgY29uc3QgQkYgJiBhVmFyKTsKKworCit9OworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKyNlbmRpZiAvKiBNQUNISU5FREVQRU5ERU5DWV9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9hbmFseXNpcy9UcmFuc2l0aW9uUmVhY2hhYmlsaXR5LmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvYW5hbHlzaXMvVHJhbnNpdGlvblJlYWNoYWJpbGl0eS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE3ZmM4MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvYW5hbHlzaXMvVHJhbnNpdGlvblJlYWNoYWJpbGl0eS5jcHAKQEAgLTAsMCArMSw4MzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxMCBub3YuIDIwMTQKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlRyYW5zaXRpb25SZWFjaGFiaWxpdHkuaCIKKworCisjaW5jbHVkZSA8Y29tcHV0ZXIvcHJpbWl0aXZlL0F2bUNvbW11bmljYXRpb25GYWN0b3J5Lmg+CisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9Bdm1UcmFuc2l0aW9uLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZUxpYi5oPgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vU3RhdGVtZW50VHlwZUNoZWNrZXIuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkNvbnRleHQuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25EYXRhLmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvTWVzc2FnZS5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL1J1bnRpbWVGb3JtLmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvUnVudGltZUlELmg+CisKKyNpbmNsdWRlIDxmbWwvdHJhY2UvVHJhY2VQb2ludC5oPgorI2luY2x1ZGUgPGZtbC90cmFjZS9UcmFjZVNlcXVlbmNlLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisvKioKKyAqIENPTlNUUlVDVE9SCisgKiBEZWZhdWx0CisgKi8KK1RyYW5zaXRpb25SZWFjaGFiaWxpdHk6OlRyYW5zaXRpb25SZWFjaGFiaWxpdHkoY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMsCisJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsIEF2bVRyYW5zaXRpb24gKiBhVHJhbnNpdGlvbikKKzogdGhlRUMoIGFuRUMgKSwKK3RoZUVEKCBhbkVDLnJlZkV4ZWN1dGlvbkRhdGEoKSApLAordGhlUklEKCBhUklEICksCit0aGVUcmFuc2l0aW9uKCBhVHJhbnNpdGlvbiApLAordGhlVHJhbnNpdGlvblBvaW50KCBOVUxMICksCit0aGVUcmFjZUVsZW1lbnQoICksCisKK3RoZVJ1bnRpbWVQYXRoQ29tcHV0aW5nQ291bnRMaW1pdCggMTYgKSwKKwordGhlR29hbEFjaGlldmVkRmxhZyggZmFsc2UgKSwKKwordGhlVmlydHVhbEJ1ZmZlcih0aGVUcmFuc2l0aW9uLCBOVUxMLCAwLCBUWVBFX0xJRk9fU1BFQ0lGSUVSLCAtMSksCit0aGVFbWl0T3V0cHV0KCAmIHRoZVZpcnR1YWxCdWZmZXIgKSwKKwordGhlVGFibGVPZlJ1bnRpbWVTdGF0dXMoICooIHRoZUVELmdldFJ1bnRpbWVGb3JtU3RhdGVUYWJsZSgpICkgKQoreworCS8vISEgTk9USElORworfQorCisKKy8qKgorICogVVRJTFMKKyAqLworYm9vbCBUcmFuc2l0aW9uUmVhY2hhYmlsaXR5Ojppbml0aWFsaXplKCkKK3sKKwl0aGVHb2FsQWNoaWV2ZWRGbGFnID0gZmFsc2U7CisKKwlpZiggdGhlUklELmludmFsaWQoKSApCisJeworCQlpZiggdGhlRUQubVJJRC5nZXRFeGVjdXRhYmxlKCktPmdldFRyYW5zaXRpb24oKS5jb250YWlucyh0aGVUcmFuc2l0aW9uKSApCisJCXsKKwkJCXRoZVJJRCA9IHRoZUVELm1SSUQ7CisJCX0KKworCQlpZiggdGhlUklELmludmFsaWQoKSApCisJCXsKKwkJCWlmKCB0aGVUcmFuc2l0aW9uUG9pbnQgIT0gTlVMTCApCisJCQl7CisJCQkJdGhlVHJhbnNpdGlvblBvaW50LT51cGRhdGVSSUQoIHRoZUVEICk7CisKKwkJCQl0aGVSSUQgPSB0aGVUcmFuc2l0aW9uUG9pbnQtPlJJRDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQl0aGVSSUQgPSB0aGVFRC5nZXRSdW50aW1lSUQoIHRoZVRyYW5zaXRpb24tPmdldEV4ZWN1dGFibGUoKSApOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuKCB0aGVSSUQudmFsaWQoKSApOworfQorCisKK2Jvb2wgVHJhbnNpdGlvblJlYWNoYWJpbGl0eTo6Y29tcHV0ZVBhdGgoKQoreworCWlmKCBpbml0aWFsaXplKCkgKQorCXsKKwkJQXZtQ29tbXVuaWNhdGlvbkZhY3Rvcnk6OmNvbGxlY3RCdWZmZXJNZXNzYWdlKHRoZUVELCB0aGVFbWl0T3V0cHV0KTsKKworCQlyZXR1cm4oIHRoZUdvYWxBY2hpZXZlZEZsYWcgPSBjb21wdXRlUGF0aCh0aGVSSUQsIHRoZVRyYW5zaXRpb24pICk7CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKK2Jvb2wgVHJhbnNpdGlvblJlYWNoYWJpbGl0eTo6Y29tcHV0ZVBhdGgoVHJhY2VTZXF1ZW5jZSAmIGFUcmFjZUVsZW1lbnQpCit7CisJaWYoIGluaXRpYWxpemUoKSApCisJeworCQlBdm1Db21tdW5pY2F0aW9uRmFjdG9yeTo6Y29sbGVjdEJ1ZmZlck1lc3NhZ2UodGhlRUQsIHRoZUVtaXRPdXRwdXQpOworCisJCWlmKCBjb21wdXRlUGF0aCh0aGVSSUQsIHRoZVRyYW5zaXRpb24pICkKKwkJeworCQkJYVRyYWNlRWxlbWVudC5jb3B5VHJhY2UoIHRoZVRyYWNlRWxlbWVudCApOworCisJCQl0aGVHb2FsQWNoaWV2ZWRGbGFnID0gdHJ1ZTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKworCit2b2lkIFRyYW5zaXRpb25SZWFjaGFiaWxpdHk6OnJlcG9ydChPdXRTdHJlYW0gJiBvcykKK3sKKwlvcyA8PCAiVHJhY2UgdG8gcmVhY2ggOj4gIiA8PCB0aGVUcmFuc2l0aW9uLT5zdHJUcmFuc2l0aW9uSGVhZGVyKCk7CisJdGhlVHJhY2VFbGVtZW50LnRvU3RyZWFtKG9zKTsKKworLy8Jb3MgPDwgVEFCIDw8ICJFbWl0IE91dHB1dCA6PiIgPDwgdG9fc3RyZWFtKCB0aGVFbWl0T3V0cHV0ICk7CisKKwlvcyA8PCAoIHRoZUdvYWxBY2hpZXZlZEZsYWcgPyAiTkVXIiA6ICJOTyIgKSA8PCAiIE9CSkVDVElWRSAhISEiIDw8IHN0ZDo6ZW5kbDsKK30KKworCisKK2Jvb2wgVHJhbnNpdGlvblJlYWNoYWJpbGl0eTo6Y29tcHV0ZVBhdGgoCisJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsIEF2bVRyYW5zaXRpb24gKiBhVHJhbnNpdGlvbikKK3sKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX0NPVVQgPDwgVEFCIDw8ICJjb21wdXRlUGF0aCBmcm9tIDo+ICI7CisJdGhlRUMudHJhY2VNaW5pbXVtKEFWTV9PU19DT1VUKTsKKwlBVk1fT1NfQ09VVCA8PCBUQUIyIDw8IGFSSUQuc3RyVW5pcUlkKCkgPDwgIiB8PT0+ICI7CisJYVRyYW5zaXRpb24tPnRvU3RyZWFtSGVhZGVyKEFWTV9PU19DT1VUKTsgQVZNX09TX0NPVVQgPDwgc3RkOjplbmRsOworCWlmKCBhVHJhbnNpdGlvbi0+aGFzSW50ZXJuYWxDb21tdW5pY2F0aW9uQ29kZSgpICkKKwl7CisJCUFWTV9PU19DT1VUIDw8IFRBQjIgPDwgImNvbSB8PT0+ICI7CisJCUJhc2VDb21waWxlZEZvcm06OnRvU3RyZWFtU3RhdGljQ29tKEFWTV9PU19DT1VULAorCQkJCWFUcmFuc2l0aW9uLT5nZXRJbnRlcm5hbENvbW11bmljYXRpb25Db2RlKCkpOworCX0KKwlBVk1fT1NfQ09VVCA8PCBUQUIyIDw8ICJFbWl0IE91dHB1dCA6PiIgPDwgdG9fc3RyZWFtKCB0aGVFbWl0T3V0cHV0ICkKKwkJCSA8PCBUQUIgPDwgImVuZCAvL2NvbXB1dGVQYXRoIiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCisKKwlpZiggdGhlRUQuaXNJZGxlT3JSdW5uaW5nKGFSSUQpICkKKwl7CisJCXJldHVybiggZmlyZVRyYW5zaXRpb24oYVJJRCwgYVRyYW5zaXRpb24pICk7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiggY29tcHV0ZVBhdGhUb1RyYW5zaXRpb24oYVJJRCwgYVRyYW5zaXRpb24pICk7CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKK2Jvb2wgVHJhbnNpdGlvblJlYWNoYWJpbGl0eTo6ZmlyZVRyYW5zaXRpb24oCisJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsIEF2bVRyYW5zaXRpb24gKiBhVHJhbnNpdGlvbikKK3sKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX0NPVVQgPDwgc3RkOjplbmRsCisJCQk8PCBUQUIgPDwgImZpcmVUcmFuc2l0aW9uIDo+ICIgPDwgYVJJRC5zdHJVbmlxSWQoKQorCQkJPDwgIiB8PT0+ICIgPDwgYVRyYW5zaXRpb24tPnN0clRyYW5zaXRpb25IZWFkZXIoKSA8PCBzdGQ6OmVuZGwKKwkJCTw8IFRBQjIgPDwgIkVtaXQgT3V0cHV0IDo+IiA8PCB0b19zdHJlYW0oIHRoZUVtaXRPdXRwdXQgKQorCQkJPDwgVEFCIDw8ICJlbmQgLy9maXJlVHJhbnNpdGlvbiIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKworCisJdGhlVGFibGVPZlJ1bnRpbWVTdGF0dXMuc3RhdGVTZXQoYVJJRC5nZXRPZmZzZXQoKSwgUFJPQ0VTU19TVVNQRU5ERURfU1RBVEUpOworCisJaWYoIGFUcmFuc2l0aW9uLT5oYXNJbnB1dENvbSgpICkKKwl7CisJCUxpc3RPZkluc3RhbmNlT2ZQb3J0IGFuSW5wdXRUcmFjZSggYVRyYW5zaXRpb24tPmdldElucHV0Q29tKCkgKTsKKwkJaWYoIHRoZUVtaXRPdXRwdXQudW5jb250YWlucyggYW5JbnB1dFRyYWNlICkgKQorCQl7CisJCQkvLyB0cm91dmVyIGRlcyDDqW1ldHRldXJzIHBvdXIgbGVzIElOUFVUIGF0dGVuZHUgYXUgcmVnYXJkIGRlIEVEPCBTQyA+CisJCQl3aGlsZSggYW5JbnB1dFRyYWNlLm5vbmVtcHR5KCkgKQorCQkJeworCQkJCWlmKCBjb21wdXRlUGF0aFRvSW5wdXQoYVJJRCwgYW5JbnB1dFRyYWNlLmZyb250KCkpICkKKwkJCQl7CisJCQkJCWFuSW5wdXRUcmFjZS5wb3BfZnJvbnQoKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlpZiggYW5JbnB1dFRyYWNlLmVtcHR5KCkgKQorCQkJeworCQkJCXRyYWNlVHJhbnNpdGlvbihhUklELCBhVHJhbnNpdGlvbik7CisKKwkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCX0KKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXRyYWNlVHJhbnNpdGlvbihhUklELCBhVHJhbnNpdGlvbik7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJdHJhY2VUcmFuc2l0aW9uKGFSSUQsIGFUcmFuc2l0aW9uKTsKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCit2b2lkIFRyYW5zaXRpb25SZWFjaGFiaWxpdHk6OnRyYWNlVHJhbnNpdGlvbigKKwkJY29uc3QgUnVudGltZUlEICYgYVJJRCwgQXZtVHJhbnNpdGlvbiAqIGFUcmFuc2l0aW9uKQoreworCVRyYWNlUG9pbnQgKiB0bXBUUCA9IG5ldyBUcmFjZVBvaW50KAorCQkJRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfVFJBTlNJVElPTl9OQVRVUkUsCisJCQlBVk1fT1BDT0RFX0lOVk9LRV9UUkFOU0lUSU9OLCBhUklELCBhVHJhbnNpdGlvbik7CisKKwl0aGVUcmFjZUVsZW1lbnQucG9pbnRzLmFwcGVuZCggQkYodG1wVFApICk7CisKKwkvLyBWaXJ0dWFsIEV2YWwgT2YgYVRyYW5zaXRpb24KKwlpZiggYVRyYW5zaXRpb24tPmhhc091dHB1dENvbSgpICkKKwl7CisJCUxpc3RPZkluc3RhbmNlT2ZQb3J0Ojpjb25zdF9pdGVyYXRvciBpdE91dHB1dCA9CisJCQkJYVRyYW5zaXRpb24tPmdldE91dHB1dENvbSgpLmJlZ2luKCk7CisJCUxpc3RPZkluc3RhbmNlT2ZQb3J0Ojpjb25zdF9pdGVyYXRvciBlbmRPdXRwdXQgPQorCQkJCWFUcmFuc2l0aW9uLT5nZXRPdXRwdXRDb20oKS5lbmQoKTsKKwkJZm9yKCA7IGl0T3V0cHV0ICE9IGVuZE91dHB1dCA7ICsraXRPdXRwdXQgKQorCQl7CisJCQl0aGVFbWl0T3V0cHV0LnB1c2goIE1lc3NhZ2UoYVJJRCwgSU5DUl9CRigqaXRPdXRwdXQpKSApOworCQl9CisJfQorfQorCisKK2Jvb2wgVHJhbnNpdGlvblJlYWNoYWJpbGl0eTo6Y29tcHV0ZVBhdGhUb1RyYW5zaXRpb24oCisJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsIEF2bVRyYW5zaXRpb24gKiBhVHJhbnNpdGlvbikKK3sKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX0NPVVQgPDwgc3RkOjplbmRsCisJCQk8PCBUQUIgPDwgImNvbXB1dGVQYXRoVG9UcmFuc2l0aW9uIHVzaW5nIDo+ICIgPDwgYVJJRC5zdHJVbmlxSWQoKQorCQkJPDwgIiB8PT0+ICIgPDwgYVRyYW5zaXRpb24tPnN0clRyYW5zaXRpb25IZWFkZXIoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCisKKwlSdW50aW1lSUQgdG1wUklEID0gYVJJRC5nZXRQUklEKCk7CisJZm9yKCA7IHRtcFJJRC52YWxpZCgpIDsgdG1wUklEID0gdG1wUklELmdldFBSSUQoKSApCisJeworLy8JCUFWTV9PU19DT1VUIDw8IHRtcFJJRC5zdHJVbmlxSWQoKSA8PCAiIDogIgorLy8JCQkJPDwgdG1wUklELmdldEluc3RhbmNlKCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgc3RkOjplbmRsOworCisJCWlmKCB0aGVFRC5pc0lkbGVPclJ1bm5pbmcodG1wUklEKSApCisJCXsKKwkJCWJyZWFrOworCQl9CisJfQorCisJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1NNQVJUX1BPSU5URVJfRVhJVCggdG1wUklEICkKKwkJCTw8ICJSdW5uYWJsZSBBbmNlc3RvciBTdGF0ZW1hY2hpbmUgZm9yICIKKwkJCTw8IGFSSUQuc3RyVW5pcUlkKCkgPDwgIiBpbiB0aGUgY29udGV4dCBvZiAiCisJCQk8PCBhVHJhbnNpdGlvbi0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiICEhISIKKwkJCTw8IFNFTkRfRVhJVDsKKworCWNvbnN0IFJ1bnRpbWVGb3JtICYgdG1wUkYgPSB0aGVFRC5nZXRSdW50aW1lKHRtcFJJRCk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX0NPVVQgPDwgVEFCMiA8PCAiUnVubmFibGUgQW5jZXN0b3IgU3RhdGVtYWNoaW5lIDo+ICIKKwkJCTw8IHRtcFJJRC5zdHIoKSA8PCBzdGQ6OmVuZGwKKwkJCTw8IFRBQjIgPDwgIlJ1bm5hYmxlIEFuY2VzdG9yIFN0YXRlIFNjaGVkdWxlciA6PiB7IjsKKwl0bXBSRi5nZXRPblNjaGVkdWxlKCktPnRvU3RyZWFtUm91dGluZSggQVZNX09TX0NPVVQgKQorCQkJPDwgVEFCMiA8PCAifSIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKworCisJaWYoIHRtcFJGLmdldE9uU2NoZWR1bGUoKS0+aXNPcENvZGUoIEFWTV9PUENPREVfUlVOICkgJiYKKwkJdG1wUkYuZ2V0T25TY2hlZHVsZSgpLT5maXJzdCgpLmlzPCBSdW50aW1lSUQgPigpICkKKwl7CisJCXJldHVybiggY29tcHV0ZVBhdGhGcm9tUnVubmFibGUoCisJCQkJdG1wUkYuZ2V0T25TY2hlZHVsZSgpLT5maXJzdCgpLmJmUklEKCksIGFUcmFuc2l0aW9uKSApOworCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKworCitib29sIFRyYW5zaXRpb25SZWFjaGFiaWxpdHk6OmNvbXB1dGVQYXRoRnJvbVJ1bm5hYmxlKAorCQljb25zdCBSdW50aW1lSUQgJiBhUklELCBBdm1UcmFuc2l0aW9uICogYVRyYW5zaXRpb24pCit7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCUFWTV9PU19DT1VUIDw8IHN0ZDo6ZW5kbAorCQkJPDwgVEFCIDw8ICJjb21wdXRlUGF0aEZyb21SdW5uYWJsZSB1c2luZyA6PiAiIDw8IGFSSUQuc3RyVW5pcUlkKCkKKwkJCTw8ICIgfD09PiAiIDw8IGFUcmFuc2l0aW9uLT5zdHJUcmFuc2l0aW9uSGVhZGVyKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKworCWlmKCBub3QgYVJJRC5nZXRFeGVjdXRhYmxlKCktPgorCQkJY29udGFpbnNGb3J3YXJkUmVhY2hhYmxlVHJhbnNpdGlvbihhVHJhbnNpdGlvbikgKQorCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJCUFWTV9PU19DT1VUIDw8IFRBQjIgPDwgIlVucmVhY2hhYmxlIHRyYW5zaXRpb24gOj4gIgorCQkJCTw8IHRoZVRyYW5zaXRpb24tPnN0clRyYW5zaXRpb25IZWFkZXIoKSA8PCBzdGQ6OmVuZGwKKwkJCQk8PCBUQUIyIDw8ICJmcm9tIDogIiA8PCBhUklELnN0cigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCUFWTV9PU19DT1VUIDw8IFRBQiA8PCAiTG9va2luZyBmb3IgYSBwYXRoIHRvIDo+ICIgPDwgYVJJRC5zdHIoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCisKKwlMaXN0T2ZBdm1UcmFuc2l0aW9uIG9uZVRyYW5zaXRpb25QYXRoOworCisJaWYoIGNvbXB1dGVQYXRoVG9UcmFuc2l0aW9uKGFSSUQsIGFUcmFuc2l0aW9uLCBvbmVUcmFuc2l0aW9uUGF0aCkgKQorCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX0NPVVQgPDwgSU5DUl9JTkRFTlQ7CisJQXZtVHJhbnNpdGlvbjo6dG9TdHJlYW0oQVZNX09TX0NPVVQsIG9uZVRyYW5zaXRpb25QYXRoKTsKKwlBVk1fT1NfQ09VVCA8PCBERUNSX0lOREVOVCA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCisJCS8vIEFsbCBmb3VuZCBwYXRoCisvLwkJTGlzdE9mTGlzdE9mQXZtVHJhbnNpdGlvbiBhbGxUcmFuc2l0aW9uUGF0aHM7CisvLwkJY29tcHV0ZVBhdGhUb1RyYW5zaXRpb24oYVJJRCwgYVRyYW5zaXRpb24sIGFsbFRyYW5zaXRpb25QYXRocyk7CisKKwkJUnVudGltZUlEIHRtcFJJRCA9IGFSSUQ7CisJCWRvCisJCXsKKwkJCWFUcmFuc2l0aW9uID0gb25lVHJhbnNpdGlvblBhdGguZnJvbnQoKTsKKworCQkJaWYoIGZpcmVUcmFuc2l0aW9uKHRtcFJJRCwgYVRyYW5zaXRpb24pICkKKwkJCXsKKwkJCQlvbmVUcmFuc2l0aW9uUGF0aC5wb3BfZnJvbnQoKTsKKworCQkJCWlmKCBub3QgY29tcHV0ZVRhcmdldE1hY2hpbmUodG1wUklELCBhVHJhbnNpdGlvbi0+Z2V0Q29kZSgpKSApCisJCQkJeworCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXdoaWxlKCBvbmVUcmFuc2l0aW9uUGF0aC5ub25lbXB0eSgpICk7CisKKwkJcmV0dXJuKCBvbmVUcmFuc2l0aW9uUGF0aC5lbXB0eSgpICk7CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKKworLy9ib29sIFRyYW5zaXRpb25SZWFjaGFiaWxpdHk6OmNvbXB1dGVQYXRoRnJvbVJ1bm5hYmxlKAorLy8JCWNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsIEF2bVRyYW5zaXRpb24gKiBhVHJhbnNpdGlvbikKKy8veworLy9BVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorLy8JQVZNX09TX0NPVVQgPDwgc3RkOjplbmRsCisvLwkJCTw8IFRBQiA8PCAiY29tcHV0ZVBhdGhGcm9tUnVubmFibGUgdXNpbmcgOj4gIiA8PCBhUklELnN0clVuaXFJZCgpCisvLwkJCTw8ICIgfD09PiAiIDw8IGFUcmFuc2l0aW9uLT5zdHJUcmFuc2l0aW9uSGVhZGVyKCkgPDwgc3RkOjplbmRsOworLy9BVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorLy8KKy8vCWlmKCBub3QgYVJJRC5nZXRFeGVjdXRhYmxlKCktPgorLy8JCQljb250YWluc0ZvcndhcmRSZWFjaGFibGVUcmFuc2l0aW9uKGFUcmFuc2l0aW9uKSApCisvLwl7CisvL0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisvLwkJQVZNX09TX0NPVVQgPDwgVEFCMiA8PCAiVW5yZWFjaGFibGUgdHJhbnNpdGlvbiA6PiAiCisvLwkJCQk8PCB0aGVUcmFuc2l0aW9uLT5zdHJUcmFuc2l0aW9uSGVhZGVyKCkgPDwgc3RkOjplbmRsCisvLwkJCQk8PCBUQUIyIDw8ICJmcm9tIDogIiA8PCBhUklELnN0cigpIDw8IHN0ZDo6ZW5kbDsKKy8vQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKy8vCisvLwkJcmV0dXJuKCBmYWxzZSApOworLy8JfQorLy8KKy8vCisvL0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisvLwlBVk1fT1NfQ09VVCA8PCBUQUIgPDwgIkxvb2tpbmcgZm9yIGEgcGF0aCB0byA6PiAiIDw8IGFSSUQuc3RyKCkgPDwgc3RkOjplbmRsOworLy9BVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorLy8KKy8vCisvLwkvLyBBbGwgZm91bmQgcGF0aAorLy8JTGlzdE9mTGlzdE9mQXZtVHJhbnNpdGlvbiBhbGxUcmFuc2l0aW9uUGF0aHM7CisvLwljb21wdXRlUGF0aFRvVHJhbnNpdGlvbihhUklELCBhVHJhbnNpdGlvbiwgYWxsVHJhbnNpdGlvblBhdGhzKTsKKy8vCisvLwlCRkxpc3Qgc2F2ZVRyYWNlUG9pbnRzKCB0aGVUcmFjZUVsZW1lbnQucG9pbnRzICk7CisvLworLy8JTGlzdE9mQXZtVHJhbnNpdGlvbiBvbmVUcmFuc2l0aW9uUGF0aDsKKy8vCVJ1bnRpbWVJRCB0bXBSSUQ7CisvLworLy8vLwlpZiggY29tcHV0ZVBhdGhUb1RyYW5zaXRpb24oYVJJRCwgYVRyYW5zaXRpb24sIG9uZVRyYW5zaXRpb25QYXRoKSApCisvLwl3aGlsZSggYWxsVHJhbnNpdGlvblBhdGhzLm5vbmVtcHR5KCkgKQorLy8JeworLy8JCW9uZVRyYW5zaXRpb25QYXRoLmNsZWFyKCk7CisvLwkJb25lVHJhbnNpdGlvblBhdGguc3BsaWNlKCBhbGxUcmFuc2l0aW9uUGF0aHMuZnJvbnQoKSApOworLy8JCWFsbFRyYW5zaXRpb25QYXRocy5wb3BfZnJvbnQoKTsKKy8vCisvL0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisvLwlBVk1fT1NfQ09VVCA8PCBUQUIgPDwgIkZvdW5kIFBhdGggLS0+ICIKKy8vCQkJPDwgYVRyYW5zaXRpb24tPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgc3RkOjplbmRsIDw8IElOQ1JfSU5ERU5UOworLy8JQXZtVHJhbnNpdGlvbjo6dG9TdHJlYW0oQVZNX09TX0NPVVQsIG9uZVRyYW5zaXRpb25QYXRoKTsKKy8vCUFWTV9PU19DT1VUIDw8IERFQ1JfSU5ERU5UIDw8IHN0ZDo6ZW5kbDsKKy8vQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKy8vCisvLwkJdG1wUklEID0gYVJJRDsKKy8vCQlkbworLy8JCXsKKy8vCQkJYVRyYW5zaXRpb24gPSBvbmVUcmFuc2l0aW9uUGF0aC5mcm9udCgpOworLy8KKy8vCQkJaWYoIGZpcmVUcmFuc2l0aW9uKHRtcFJJRCwgYVRyYW5zaXRpb24pICkKKy8vCQkJeworLy8JCQkJb25lVHJhbnNpdGlvblBhdGgucG9wX2Zyb250KCk7CisvLworLy8JCQkJY29tcHV0ZVRhcmdldE1hY2hpbmUodG1wUklELCBhVHJhbnNpdGlvbi0+Z2V0Q29kZSgpKTsKKy8vCQkJfQorLy8JCQllbHNlCisvLwkJCXsKKy8vCQkJCWJyZWFrOworLy8JCQl9CisvLwkJfQorLy8JCXdoaWxlKCBvbmVUcmFuc2l0aW9uUGF0aC5ub25lbXB0eSgpICk7CisvLworLy8JCWlmKCAgb25lVHJhbnNpdGlvblBhdGguZW1wdHkoKSApCisvLwkJeworLy8JCQlyZXR1cm4oIHRydWUgKTsKKy8vCQl9CisvLwkJZWxzZSBpZiggYWxsVHJhbnNpdGlvblBhdGhzLmVtcHR5KCkgKQorLy8JCXsKKy8vCQkJcmV0dXJuKCBmYWxzZSApOworLy8JCX0KKy8vCisvLwkJLy8gQkFDS1RSQUNLCisvLwkJZWxzZSBpZiggc2F2ZVRyYWNlUG9pbnRzLmVtcHR5KCkgKQorLy8JCXsKKy8vCQkJdGhlVHJhY2VFbGVtZW50LnBvaW50cy5jbGVhcigpOworLy8JCX0KKy8vCQllbHNlCisvLwkJeworLy8JCQl3aGlsZSggdGhlVHJhY2VFbGVtZW50LnBvaW50cy5iYWNrKCkuaXNOVEVRKCBzYXZlVHJhY2VQb2ludHMuYmFjaygpICkgKQorLy8JCQl7CisvLwkJCQl0aGVUcmFjZUVsZW1lbnQucG9pbnRzLnBvcF9iYWNrKCk7CisvLwkJCX0KKy8vCQl9CisvLwl9CisvLworLy8JcmV0dXJuKCBmYWxzZSApOworLy99CisKKworYm9vbCBUcmFuc2l0aW9uUmVhY2hhYmlsaXR5Ojpjb21wdXRlUGF0aFRvSW5wdXQoCisJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsIEluc3RhbmNlT2ZQb3J0ICogYW5JbnB1dFRyYWNlKQoreworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwlBVk1fT1NfQ09VVCA8PCBUQUIgPDwgImNvbXB1dGVQYXRoVG9JbnB1dCA6PiAiIDw8IHN0ZDo6ZW5kbAorCQkJPDwgVEFCMiA8PCAiRXhwZWN0ZWQgSW5wdXQgOj4gIgorCQkJPDwgYW5JbnB1dFRyYWNlLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbAorCQkJPDwgVEFCMiA8PCAiRW1pdCBPdXRwdXQgOj4iIDw8IHRvX3N0cmVhbSggdGhlRW1pdE91dHB1dCApCisJCQk8PCBUQUIgPDwgImVuZCAvL2NvbXB1dGVQYXRoVG9JbnB1dCIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKworCisJRXhlY3V0YWJsZUZvcm0gKiB0bXBFeGVjdXRhYmxlID0gTlVMTDsKKwlSdW50aW1lSUQgc3JjUklEOworCisJLy8gUGFyY291cmlyIHRvdXMgbGVzIMOpdGF0cyBldCByZXDDqXJlciBjZXV4IGNvbnRlbmFudCBsZXMgYm9ucyBvdXRwdXQvb3V0cHV0VG8KKwlUYWJsZU9mUnVudGltZVQ6OmNvbnN0X2l0ZXJhdG9yIGl0UkYgPSB0aGVFRC5nZXRUYWJsZU9mUnVudGltZSgpLmJlZ2luKCk7CisJVGFibGVPZlJ1bnRpbWVUOjpjb25zdF9pdGVyYXRvciBlbmRSRiA9IHRoZUVELmdldFRhYmxlT2ZSdW50aW1lKCkuZW5kKCk7CisJZm9yKCA7IGl0UkYgIT0gZW5kUkYgOyArK2l0UkYgKQorCXsKKwkJc3JjUklEID0gKCppdFJGKS0+Z2V0UklEKCk7CisJCXRtcEV4ZWN1dGFibGUgPSBzcmNSSUQuZ2V0RXhlY3V0YWJsZSgpOworCisJCWlmKCB0aGVUYWJsZU9mUnVudGltZVN0YXR1cy5pc1N1c3BlbmRlZChzcmNSSUQuZ2V0T2Zmc2V0KCkpICkKKwkJeworCQkJLy8hISBFeGNsdWRlIG1hY2hpbmUKKwkJfQorCQllbHNlIGlmKCB0aGVFRC5pc0lkbGVPclJ1bm5pbmcoIHNyY1JJRCApICYmCisJCQl0bXBFeGVjdXRhYmxlLT5nZXRGb3J3YXJkUmVhY2hhYmxlVHJhbnNpdGlvbigpLm5vbmVtcHR5KCkgKQorCQl7CisJCQlMaXN0T2ZBdm1UcmFuc2l0aW9uOjpjb25zdF9pdGVyYXRvciBpdFRyYW5zID0KKwkJCQkJdG1wRXhlY3V0YWJsZS0+Z2V0Rm9yd2FyZFJlYWNoYWJsZVRyYW5zaXRpb24oKS5iZWdpbigpOworCQkJTGlzdE9mQXZtVHJhbnNpdGlvbjo6Y29uc3RfaXRlcmF0b3IgZW5kVHJhbnMgPQorCQkJCQl0bXBFeGVjdXRhYmxlLT5nZXRGb3J3YXJkUmVhY2hhYmxlVHJhbnNpdGlvbigpLmVuZCgpOworCQkJZm9yKCA7IGl0VHJhbnMgIT0gZW5kVHJhbnMgOyArK2l0VHJhbnMgKQorCQkJeworCQkJCWlmKCAoKml0VHJhbnMpLT5nZXRPdXRwdXRDb20oKS5jb250YWlucyhhbklucHV0VHJhY2UpICkKKwkJCQl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCUFWTV9PU19DT1VUIDw8IFRBQiA8PCAiZm91bmQgT3V0cHV0IGluIDo+ICIgPDwgc3JjUklELnN0clVuaXFJZCgpIDw8ICIgfD09PiAiCisJCQk8PCAoKml0VHJhbnMpLT5zdHJUcmFuc2l0aW9uSGVhZGVyKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKworCQkJCQlpZiggdG1wRXhlY3V0YWJsZSAhPSAoKml0VHJhbnMpLT5nZXRFeGVjdXRhYmxlKCkgKQorCQkJCQl7CisJCQkJCQlpZiggY29tcHV0ZVBhdGhGcm9tUnVubmFibGUoc3JjUklELCAoKml0VHJhbnMpKSApCisJCQkJCQl7CisJCQkJCQkJcmV0dXJuKCB0cnVlICk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZSBpZiggZmlyZVRyYW5zaXRpb24oc3JjUklELCAoKml0VHJhbnMpKSApCisJCQkJCXsKKwkJCQkJCXJldHVybiggdHJ1ZSApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCUFWTV9PU19DT1VUIDw8IFRBQiA8PCAiVW5mb3VuZCBJbnB1dCA6PiAiCisJCQk8PCBhbklucHV0VHJhY2UtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKworCXJldHVybiggZmFsc2UgKTsKK30KKworCitib29sIFRyYW5zaXRpb25SZWFjaGFiaWxpdHk6OmNvbXB1dGVQYXRoVG9UcmFuc2l0aW9uKGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsCisJCUF2bVRyYW5zaXRpb24gKiBhVHJhbnNpdGlvbiwgTGlzdE9mQXZtVHJhbnNpdGlvbiAmIG9uZVRyYW5zaXRpb25QYXRoKQoreworCUxpc3RPZkxpc3RPZkF2bVRyYW5zaXRpb24gYW55VHJhbnNpdGlvblBhdGhzOworCisJTGlzdE9mQXZtVHJhbnNpdGlvbiBsaXN0T2ZPdXRnb2luZ1RyYW5zaXRpb247CisJSW5zdGFuY2VPZk1hY2hpbmUgKiB0Z3RJbnN0YW5jZTsKKworCS8vIEluaXRpYWxpemF0aW9uIHN0ZXAKKwlFeGVjdXRhYmxlRm9ybSAqIGZ3ZE1hY2hpbmUgPSBhUklELmdldEV4ZWN1dGFibGUoKTsKKwlmd2RNYWNoaW5lLT5nZXRPdXRnb2luZ1RyYW5zaXRpb24oIGxpc3RPZk91dGdvaW5nVHJhbnNpdGlvbiApOworCisJRXhlY3V0YWJsZUZvcm0gKiB0Z3RNYWNoaW5lID0gZndkTWFjaGluZTsKKworCUxpc3RPZkF2bVRyYW5zaXRpb246OmNvbnN0X2l0ZXJhdG9yIGl0VHJhbnMgPSBsaXN0T2ZPdXRnb2luZ1RyYW5zaXRpb24uYmVnaW4oKTsKKwlMaXN0T2ZBdm1UcmFuc2l0aW9uOjpjb25zdF9pdGVyYXRvciBlbmRUcmFucyA9IGxpc3RPZk91dGdvaW5nVHJhbnNpdGlvbi5lbmQoKTsKKwlmb3IoIDsgaXRUcmFucyAhPSBlbmRUcmFucyA7ICsraXRUcmFucyApCisJeworCQlpZiggKHRndEluc3RhbmNlID0gKCppdFRyYW5zKS0+Z2V0VHJhbnNpdGlvblRhcmdldCgpKSAhPSBOVUxMICkKKwkJeworCQkJdGd0TWFjaGluZSA9IHRndEluc3RhbmNlLT5nZXRFeGVjdXRhYmxlKCk7CisJCX0KKwkJaWYoIHRndE1hY2hpbmUtPmNvbnRhaW5zRm9yd2FyZFJlYWNoYWJsZVRyYW5zaXRpb24oYVRyYW5zaXRpb24pICkKKwkJeworCQkJYW55VHJhbnNpdGlvblBhdGhzLmFwcGVuZCggTGlzdE9mQXZtVHJhbnNpdGlvbigqaXRUcmFucykgKTsKKwkJfQorCX0KKworCisJTGlzdE9mQXZtVHJhbnNpdGlvbiBhVHJhbnNpdGlvblBhdGg7CisKKwkvLyBJdGVyYXRpdmUgc3RlcAorCXdoaWxlKCBhbnlUcmFuc2l0aW9uUGF0aHMubm9uZW1wdHkoKSApCisJeworCQlhVHJhbnNpdGlvblBhdGguY2xlYXIoKTsKKwkJYVRyYW5zaXRpb25QYXRoLnNwbGljZSggYW55VHJhbnNpdGlvblBhdGhzLmZyb250KCkgKTsKKwkJYW55VHJhbnNpdGlvblBhdGhzLnBvcF9mcm9udCgpOworCisJCWlmKCAodGd0SW5zdGFuY2UgPSBhVHJhbnNpdGlvblBhdGguYmFjaygpLT5nZXRUcmFuc2l0aW9uVGFyZ2V0KCkpICE9IE5VTEwgKQorCQl7CisJCQlmd2RNYWNoaW5lID0gdGd0SW5zdGFuY2UtPmdldEV4ZWN1dGFibGUoKTsKKwkJfQorCQlpZiggZndkTWFjaGluZS0+Z2V0VHJhbnNpdGlvbigpLmNvbnRhaW5zKGFUcmFuc2l0aW9uKSApCisJCXsKKwkJCW9uZVRyYW5zaXRpb25QYXRoLnNwbGljZSggYVRyYW5zaXRpb25QYXRoICk7CisJCQlvbmVUcmFuc2l0aW9uUGF0aC5wdXNoX2JhY2soIGFUcmFuc2l0aW9uICk7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisJCWVsc2UKKwkJeworCQkJbGlzdE9mT3V0Z29pbmdUcmFuc2l0aW9uLmNsZWFyKCk7CisJCQlmd2RNYWNoaW5lLT5nZXRPdXRnb2luZ1RyYW5zaXRpb24oIGxpc3RPZk91dGdvaW5nVHJhbnNpdGlvbiApOworCisJCQlpdFRyYW5zID0gbGlzdE9mT3V0Z29pbmdUcmFuc2l0aW9uLmJlZ2luKCk7CisJCQllbmRUcmFucyA9IGxpc3RPZk91dGdvaW5nVHJhbnNpdGlvbi5lbmQoKTsKKwkJCWZvciggOyBpdFRyYW5zICE9IGVuZFRyYW5zIDsgKytpdFRyYW5zICkKKwkJCXsKKwkJCQlpZiggbm90IGFUcmFuc2l0aW9uUGF0aC5jb250YWlucyggKml0VHJhbnMgKSApCisJCQkJeworCQkJCQlpZiggKHRndEluc3RhbmNlID0gKCppdFRyYW5zKS0+Z2V0VHJhbnNpdGlvblRhcmdldCgpKSAhPSBOVUxMICkKKwkJCQkJeworCQkJCQkJdGd0TWFjaGluZSA9IHRndEluc3RhbmNlLT5nZXRFeGVjdXRhYmxlKCk7CisJCQkJCX0KKwkJCQkJaWYoIHRndE1hY2hpbmUtPmNvbnRhaW5zRm9yd2FyZFJlYWNoYWJsZVRyYW5zaXRpb24oYVRyYW5zaXRpb24pICkKKwkJCQkJeworCQkJCQkJaWYoIGFueVRyYW5zaXRpb25QYXRocy5zaXplKCkgPAorCQkJCQkJCXRoZVJ1bnRpbWVQYXRoQ29tcHV0aW5nQ291bnRMaW1pdCApCisJCQkJCQl7CisJCQkJCQkJYW55VHJhbnNpdGlvblBhdGhzLnB1c2hfYmFjayggYVRyYW5zaXRpb25QYXRoICk7CisJCQkJCQkJYW55VHJhbnNpdGlvblBhdGhzLmJhY2soKS5wdXNoX2JhY2soICppdFRyYW5zICk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKworYm9vbCBUcmFuc2l0aW9uUmVhY2hhYmlsaXR5Ojpjb21wdXRlUGF0aFRvVHJhbnNpdGlvbihjb25zdCBSdW50aW1lSUQgJiBhUklELAorCQlBdm1UcmFuc2l0aW9uICogYVRyYW5zaXRpb24sIExpc3RPZkxpc3RPZkF2bVRyYW5zaXRpb24gJiBhbGxUcmFuc2l0aW9uUGF0aHMpCit7CisJTGlzdE9mTGlzdE9mQXZtVHJhbnNpdGlvbiBhbnlUcmFuc2l0aW9uUGF0aHM7CisJTGlzdE9mTGlzdE9mQXZtVHJhbnNpdGlvbiBwcmVmaXhMb29wVHJhbnNpdGlvblBhdGhzOworCisJTGlzdE9mQXZtVHJhbnNpdGlvbiBhVHJhbnNpdGlvblBhdGg7CisKKwlMaXN0T2ZBdm1UcmFuc2l0aW9uIGxpc3RPZk91dGdvaW5nVHJhbnNpdGlvbjsKKwlJbnN0YW5jZU9mTWFjaGluZSAqIHRndEluc3RhbmNlOworCisJLy8gSW5pdGlhbGl6YXRpb24gc3RlcAorCUV4ZWN1dGFibGVGb3JtICogZndkTWFjaGluZSA9IGFSSUQuZ2V0RXhlY3V0YWJsZSgpOworCWZ3ZE1hY2hpbmUtPmdldE91dGdvaW5nVHJhbnNpdGlvbiggbGlzdE9mT3V0Z29pbmdUcmFuc2l0aW9uICk7CisKKwlFeGVjdXRhYmxlRm9ybSAqIHRndE1hY2hpbmUgPSBmd2RNYWNoaW5lOworCisJTGlzdE9mQXZtVHJhbnNpdGlvbjo6Y29uc3RfaXRlcmF0b3IgaXRUcmFucyA9IGxpc3RPZk91dGdvaW5nVHJhbnNpdGlvbi5iZWdpbigpOworCUxpc3RPZkF2bVRyYW5zaXRpb246OmNvbnN0X2l0ZXJhdG9yIGVuZFRyYW5zID0gbGlzdE9mT3V0Z29pbmdUcmFuc2l0aW9uLmVuZCgpOworCWZvciggOyBpdFRyYW5zICE9IGVuZFRyYW5zIDsgKytpdFRyYW5zICkKKwl7CisJCWlmKCAodGd0SW5zdGFuY2UgPSAoKml0VHJhbnMpLT5nZXRUcmFuc2l0aW9uVGFyZ2V0KCkpICE9IE5VTEwgKQorCQl7CisJCQl0Z3RNYWNoaW5lID0gdGd0SW5zdGFuY2UtPmdldEV4ZWN1dGFibGUoKTsKKwkJfQorCQlpZiggdGd0TWFjaGluZS0+Y29udGFpbnNGb3J3YXJkUmVhY2hhYmxlVHJhbnNpdGlvbihhVHJhbnNpdGlvbikgKQorCQl7CisJCQlhbnlUcmFuc2l0aW9uUGF0aHMuYXBwZW5kKCBMaXN0T2ZBdm1UcmFuc2l0aW9uKCppdFRyYW5zKSApOworCQl9CisJfQorCisJLy8gSXRlcmF0aXZlIHN0ZXAKKwl3aGlsZSggYW55VHJhbnNpdGlvblBhdGhzLm5vbmVtcHR5KCkgKQorCXsKKy8vCQlBVk1fT1NfQ09VVCA8PCBUQUIgPDwgIlRNUCBmb3VuZCBwYXRocyA6PiAiIDw8IHN0ZDo6ZW5kbDsKKy8vCQlMaXN0T2ZMaXN0T2ZBdm1UcmFuc2l0aW9uOjpjb25zdF9pdGVyYXRvciBpdExpc3QgPSBhbGxUcmFuc2l0aW9uUGF0aHMuYmVnaW4oKTsKKy8vCQlMaXN0T2ZMaXN0T2ZBdm1UcmFuc2l0aW9uOjpjb25zdF9pdGVyYXRvciBlbmRMaXN0ID0gYWxsVHJhbnNpdGlvblBhdGhzLmVuZCgpOworLy8JCWZvciggYXZtX3NpemVfdCBudW1iZXIgPSAwIDsgaXRMaXN0ICE9IGVuZExpc3QgOyArK2l0TGlzdCAsICsrbnVtYmVyICkKKy8vCQl7CisvLwkJCUFWTV9PU19DT1VUIDw8IFRBQiA8PCAiUGF0aCBudW1iZXIgOiIgPDwgbnVtYmVyIDw8ICI+IgorLy8JCQkJCTw8IHN0ZDo6ZW5kbCA8PCBJTkNSX0lOREVOVDsKKy8vCQkJQXZtVHJhbnNpdGlvbjo6dG9TdHJlYW0oQVZNX09TX0NPVVQsICppdExpc3QpOworLy8JCQlBVk1fT1NfQ09VVCA8PCBzdGQ6OmVuZGwgPDwgREVDUl9JTkRFTlQ7CisvLwkJfQorLy8KKy8vCQlBVk1fT1NfQ09VVCA8PCBUQUIgPDwgIlRNUCBDb21wdXRpbmcgcGF0aHMgOj4gIiA8PCBzdGQ6OmVuZGw7CisvLwkJaXRMaXN0ID0gYW55VHJhbnNpdGlvblBhdGhzLmJlZ2luKCk7CisvLwkJZW5kTGlzdCA9IGFueVRyYW5zaXRpb25QYXRocy5lbmQoKTsKKy8vCQlmb3IoIGF2bV9zaXplX3QgbnVtYmVyID0gMCA7IGl0TGlzdCAhPSBlbmRMaXN0IDsgKytpdExpc3QgLCArK251bWJlciApCisvLwkJeworLy8JCQlBVk1fT1NfQ09VVCA8PCBUQUIgPDwgIlBhdGggbnVtYmVyIDoiIDw8IG51bWJlciA8PCAiPiIKKy8vCQkJCQk8PCBzdGQ6OmVuZGwgPDwgSU5DUl9JTkRFTlQ7CisvLwkJCUF2bVRyYW5zaXRpb246OnRvU3RyZWFtKEFWTV9PU19DT1VULCAqaXRMaXN0KTsKKy8vCQkJQVZNX09TX0NPVVQgPDwgREVDUl9JTkRFTlQ7CisvLwkJfQorLy8JCUFWTV9PU19DT1VUIDw8IHN0ZDo6ZW5kbDsKKworCQlhVHJhbnNpdGlvblBhdGguY2xlYXIoKTsKKwkJYVRyYW5zaXRpb25QYXRoLnNwbGljZSggYW55VHJhbnNpdGlvblBhdGhzLmZyb250KCkgKTsKKwkJYW55VHJhbnNpdGlvblBhdGhzLnBvcF9mcm9udCgpOworCisJCWlmKCAodGd0SW5zdGFuY2UgPSBhVHJhbnNpdGlvblBhdGguYmFjaygpLT5nZXRUcmFuc2l0aW9uVGFyZ2V0KCkpICE9IE5VTEwgKQorCQl7CisJCQlmd2RNYWNoaW5lID0gdGd0SW5zdGFuY2UtPmdldEV4ZWN1dGFibGUoKTsKKwkJfQorCQlpZiggZndkTWFjaGluZS0+Z2V0VHJhbnNpdGlvbigpLmNvbnRhaW5zKGFUcmFuc2l0aW9uKSApCisJCXsKKwkJCWFsbFRyYW5zaXRpb25QYXRocy5wdXNoX2JhY2soIGFUcmFuc2l0aW9uUGF0aCApOworCQkJYWxsVHJhbnNpdGlvblBhdGhzLmJhY2soKS5wdXNoX2JhY2soIGFUcmFuc2l0aW9uICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlsaXN0T2ZPdXRnb2luZ1RyYW5zaXRpb24uY2xlYXIoKTsKKwkJCWZ3ZE1hY2hpbmUtPmdldE91dGdvaW5nVHJhbnNpdGlvbiggbGlzdE9mT3V0Z29pbmdUcmFuc2l0aW9uICk7CisKKwkJCWl0VHJhbnMgPSBsaXN0T2ZPdXRnb2luZ1RyYW5zaXRpb24uYmVnaW4oKTsKKwkJCWVuZFRyYW5zID0gbGlzdE9mT3V0Z29pbmdUcmFuc2l0aW9uLmVuZCgpOworCQkJZm9yKCA7IGl0VHJhbnMgIT0gZW5kVHJhbnMgOyArK2l0VHJhbnMgKQorCQkJeworCQkJCWlmKCBhVHJhbnNpdGlvblBhdGguY29udGFpbnMoICppdFRyYW5zICkgKQorCQkJCXsKKwkJCQkJcHJlZml4TG9vcFRyYW5zaXRpb25QYXRocy5wdXNoX2JhY2soIGFUcmFuc2l0aW9uUGF0aCApOworCQkJCQlwcmVmaXhMb29wVHJhbnNpdGlvblBhdGhzLmJhY2soKS5wdXNoX2JhY2soICppdFRyYW5zICk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWlmKCAodGd0SW5zdGFuY2UgPSAoKml0VHJhbnMpLT5nZXRUcmFuc2l0aW9uVGFyZ2V0KCkpICE9IE5VTEwgKQorCQkJCQl7CisJCQkJCQl0Z3RNYWNoaW5lID0gdGd0SW5zdGFuY2UtPmdldEV4ZWN1dGFibGUoKTsKKwkJCQkJfQorCQkJCQlpZiggdGd0TWFjaGluZS0+Y29udGFpbnNGb3J3YXJkUmVhY2hhYmxlVHJhbnNpdGlvbihhVHJhbnNpdGlvbikgKQorCQkJCQl7CisJCQkJCQlhbnlUcmFuc2l0aW9uUGF0aHMucHVzaF9iYWNrKCBhVHJhbnNpdGlvblBhdGggKTsKKwkJCQkJCWFueVRyYW5zaXRpb25QYXRocy5iYWNrKCkucHVzaF9iYWNrKCAqaXRUcmFucyApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJQVZNX09TX0NPVVQgPDwgVEFCIDw8ICJMaXN0IG9mIGZvdW5kIHBhdGhzIDo+ICIgPDwgc3RkOjplbmRsOworCUxpc3RPZkxpc3RPZkF2bVRyYW5zaXRpb246OmNvbnN0X2l0ZXJhdG9yIGl0TGlzdCA9IGFsbFRyYW5zaXRpb25QYXRocy5iZWdpbigpOworCUxpc3RPZkxpc3RPZkF2bVRyYW5zaXRpb246OmNvbnN0X2l0ZXJhdG9yIGVuZExpc3QgPSBhbGxUcmFuc2l0aW9uUGF0aHMuZW5kKCk7CisJZm9yKCBhdm1fc2l6ZV90IG51bWJlciA9IDAgOyBpdExpc3QgIT0gZW5kTGlzdCA7ICsraXRMaXN0ICwgKytudW1iZXIgKQorCXsKKwkJQVZNX09TX0NPVVQgPDwgVEFCIDw8ICJQYXRoIG51bWJlciA6IiA8PCBudW1iZXIgPDwgIiAtLT4gIgorCQkJCTw8IGFUcmFuc2l0aW9uLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbCA8PCBJTkNSX0lOREVOVDsKKwkJQXZtVHJhbnNpdGlvbjo6dG9TdHJlYW0oQVZNX09TX0NPVVQsICppdExpc3QpOworCQlBVk1fT1NfQ09VVCA8PCBzdGQ6OmVuZGwgPDwgREVDUl9JTkRFTlQ7CisJfQorCisvLwlBVk1fT1NfQ09VVCA8PCBUQUIgPDwgIkxpc3Qgb2YgZm91bmQgcHJlZml4LXBhdGhzIDo+ICIgPDwgc3RkOjplbmRsOworLy8JaXRMaXN0ID0gcHJlZml4TG9vcFRyYW5zaXRpb25QYXRocy5iZWdpbigpOworLy8JZW5kTGlzdCA9IHByZWZpeExvb3BUcmFuc2l0aW9uUGF0aHMuZW5kKCk7CisvLwlmb3IoIGF2bV9zaXplX3QgbnVtYmVyID0gMCA7IGl0TGlzdCAhPSBlbmRMaXN0IDsgKytpdExpc3QgLCArK251bWJlciApCisvLwl7CisvLwkJQVZNX09TX0NPVVQgPDwgVEFCIDw8ICJQcmVmaXggbnVtYmVyIDoiIDw8IG51bWJlciA8PCAiPiIKKy8vCQkJCTw8IHN0ZDo6ZW5kbCA8PCBJTkNSX0lOREVOVDsKKy8vCQlBdm1UcmFuc2l0aW9uOjp0b1N0cmVhbShBVk1fT1NfQ09VVCwgKml0TGlzdCk7CisvLwkJQVZNX09TX0NPVVQgPDwgc3RkOjplbmRsIDw8IERFQ1JfSU5ERU5UOworLy8JfQorCisJcmV0dXJuKCBhbGxUcmFuc2l0aW9uUGF0aHMubm9uZW1wdHkoKSApOworfQorCisKK2Jvb2wgVHJhbnNpdGlvblJlYWNoYWJpbGl0eTo6Y29tcHV0ZVRhcmdldE1hY2hpbmUoCisJCVJ1bnRpbWVJRCAmIGFSSUQsIEF2bUNvZGUgKiBhQ29kZSkKK3sKKwlzd2l0Y2goIGFDb2RlLT5nZXRBdm1PcENvZGUoKSApCisJeworCQljYXNlIEFWTV9PUENPREVfRU5BQkxFX0lOVk9LRToKKwkJY2FzZSBBVk1fT1BDT0RFX0VOQUJMRV9TRVQ6CisJCXsKKwkJCWNvbnN0IEJGICYgdGFyZ2V0TWFjaGluZSA9IGFDb2RlLT5maXJzdCgpOworCisJCQlpZiggdGFyZ2V0TWFjaGluZS5pczwgSW5zdGFuY2VPZk1hY2hpbmUgPigpICkKKwkJCXsKKwkJCQlpZiggKHRhcmdldE1hY2hpbmUudG9fcHRyPCBJbnN0YW5jZU9mTWFjaGluZSA+KCkKKwkJCQkJCSE9IGFSSUQuZ2V0SW5zdGFuY2UoKSkKKwkJCQkJJiYgdGhlRUQuZ2V0UnVudGltZShhUklEKS5oYXNDaGlsZCgpICkKKwkJCQl7CisJCQkJCWFSSUQgPSB0aGVFRC5nZXRSdW50aW1lRm9ybUNoaWxkKGFSSUQsCisJCQkJCQkJdGFyZ2V0TWFjaGluZS50b19wdHI8IEluc3RhbmNlT2ZNYWNoaW5lID4oKSApOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYoIHRhcmdldE1hY2hpbmUuaXM8IFJ1bnRpbWVJRCA+KCkgKQorCQkJeworCQkJCWFSSUQgPSB0YXJnZXRNYWNoaW5lLmJmUklEKCk7CisJCQl9CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisJCWNhc2UgQVZNX09QQ09ERV9ESVNBQkxFX1NFTEY6CisJCXsKKwkJCWFSSUQgPSBhUklELmdldFBSSUQoKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwkJY2FzZSBBVk1fT1BDT0RFX0RJU0FCTEVfSU5WT0tFOgorCQl7CisJCQlpZiggKGFDb2RlLT5maXJzdCgpID09IEV4ZWN1dGFibGVMaWI6Ok1BQ0hJTkVfU0VMRikKKwkJCQl8fCAoYVJJRCA9PSBhQ29kZS0+Zmlyc3QoKSkgKQorCQkJeworCQkJCWFSSUQgPSBhUklELmdldFBSSUQoKTsKKworCQkJCXJldHVybiggdHJ1ZSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJfQorCQljYXNlIEFWTV9PUENPREVfRElTQUJMRV9TRUxWRVM6CisJCXsKKwkJCWlmKCBhQ29kZS0+Zmlyc3QoKS5pc0ludGVnZXIoKSApCisJCQl7CisJCQkJZm9yKCBhdm1fdWludGVnZXJfdCBsZXZlbCA9IGFDb2RlLT5maXJzdCgpLnRvSW50ZWdlcigpIDsKKwkJCQkJCWxldmVsID4gMCA7IC0tbGV2ZWwgKQorCQkJCXsKKwkJCQkJYVJJRCA9IGFSSUQuZ2V0UFJJRCgpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlhUklEID0gYVJJRC5nZXRQUklEKCk7CisJCQl9CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisJCWRlZmF1bHQ6CisJCXsKKwkJCWlmKCBTdGF0ZW1lbnRUeXBlQ2hlY2tlcjo6aXNTY2hlZHVsZShhQ29kZSkgKQorCQkJeworCQkJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYUNvZGUtPmJlZ2luKCk7CisJCQkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBhQ29kZS0+ZW5kKCk7CisJCQkJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJCQkJeworCQkJCQlpZiggKCppdCkuaXM8IEF2bUNvZGUgPigpICkKKwkJCQkJeworCQkJCQkJaWYoIG5vdCBjb21wdXRlVGFyZ2V0TWFjaGluZShhUklELAorCQkJCQkJCQkoKml0KS50b19wdHI8IEF2bUNvZGUgPigpKSApCisJCQkJCQl7CisJCQkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCX0KK30KKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvYW5hbHlzaXMvVHJhbnNpdGlvblJlYWNoYWJpbGl0eS5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9hbmFseXNpcy9UcmFuc2l0aW9uUmVhY2hhYmlsaXR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU2YTNiOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvYW5hbHlzaXMvVHJhbnNpdGlvblJlYWNoYWJpbGl0eS5oCkBAIC0wLDAgKzEsMTMyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTAgbm92LiAyMDE0CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgVFJBTlNJVElPTlJFQUNIQUJJTElUWV9IXworI2RlZmluZSBUUkFOU0lUSU9OUkVBQ0hBQklMSVRZX0hfCisKKyNpbmNsdWRlIDxjb2xsZWN0aW9uL0xpc3QuaD4KKyNpbmNsdWRlIDxjb2xsZWN0aW9uL1R5cGVkZWYuaD4KKworI2luY2x1ZGUgPGZtbC9idWZmZXIvTGlmb0J1ZmZlci5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvQXZtVHJhbnNpdGlvbi5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZCdWZmZXIuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkRhdGEuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lSUQuaD4KKworI2luY2x1ZGUgPGZtbC90cmFjZS9UcmFjZVNlcXVlbmNlLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBPdXRTdHJlYW07CitjbGFzcyBBdm1UcmFuc2l0aW9uOworCitjbGFzcyBFeGVjdXRhYmxlRm9ybTsKK2NsYXNzIEV4ZWN1dGlvbkNvbnRleHQ7CitjbGFzcyBFeGVjdXRpb25EYXRhOworCitjbGFzcyBJbnN0YW5jZU9mUG9ydDsKKworY2xhc3MgUnVudGltZUZvcm07CitjbGFzcyBSdW50aW1lSUQ7CisKK2NsYXNzIFRyYWNlUG9pbnQ7CisKKworY2xhc3MgVHJhbnNpdGlvblJlYWNoYWJpbGl0eQoreworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogVFlQRURFRgorCSAqLworCXR5cGVkZWYgTGlzdDwgTGlzdE9mQXZtVHJhbnNpdGlvbiA+IExpc3RPZkxpc3RPZkF2bVRyYW5zaXRpb247CisKKworCS8qKgorCSAqIEFUVFJJQlVURQorCSAqLworCWNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiB0aGVFQzsKKwljb25zdCBFeGVjdXRpb25EYXRhICYgdGhlRUQ7CisJUnVudGltZUlEIHRoZVJJRDsKKwlBdm1UcmFuc2l0aW9uICogdGhlVHJhbnNpdGlvbjsKKworCVRyYWNlUG9pbnQgKiB0aGVUcmFuc2l0aW9uUG9pbnQ7CisJVHJhY2VTZXF1ZW5jZSB0aGVUcmFjZUVsZW1lbnQ7CisKKwlhdm1fc2l6ZV90IHRoZVJ1bnRpbWVQYXRoQ29tcHV0aW5nQ291bnRMaW1pdDsKKworCWJvb2wgdGhlR29hbEFjaGlldmVkRmxhZzsKKworCUluc3RhbmNlT2ZCdWZmZXIgdGhlVmlydHVhbEJ1ZmZlcjsKKwlMaWZvQnVmZmVyIHRoZUVtaXRPdXRwdXQ7CisKKwlUYWJsZU9mUnVudGltZUZvcm1TdGF0ZSB0aGVUYWJsZU9mUnVudGltZVN0YXR1czsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJVHJhbnNpdGlvblJlYWNoYWJpbGl0eShjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQywKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsIEF2bVRyYW5zaXRpb24gKiBhVHJhbnNpdGlvbik7CisKKworCS8qKgorCSAqIFVUSUxTCisJICovCisJYm9vbCBpbml0aWFsaXplKCk7CisKKwlib29sIGNvbXB1dGVQYXRoKCk7CisKKwlib29sIGNvbXB1dGVQYXRoKFRyYWNlU2VxdWVuY2UgJiBhVHJhY2VFbGVtZW50KTsKKworCXZvaWQgcmVwb3J0KE91dFN0cmVhbSAmIG9zKTsKKworCisJYm9vbCBjb21wdXRlUGF0aChjb25zdCBSdW50aW1lSUQgJiBhUklELCBBdm1UcmFuc2l0aW9uICogYVRyYW5zaXRpb24pOworCisJYm9vbCBmaXJlVHJhbnNpdGlvbihjb25zdCBSdW50aW1lSUQgJiBhUklELCBBdm1UcmFuc2l0aW9uICogYVRyYW5zaXRpb24pOworCisJdm9pZCB0cmFjZVRyYW5zaXRpb24oY29uc3QgUnVudGltZUlEICYgYVJJRCwgQXZtVHJhbnNpdGlvbiAqIGFUcmFuc2l0aW9uKTsKKworCWJvb2wgY29tcHV0ZVBhdGhUb1RyYW5zaXRpb24oCisJCQljb25zdCBSdW50aW1lSUQgJiBhUklELCBBdm1UcmFuc2l0aW9uICogYVRyYW5zaXRpb24pOworCisJYm9vbCBjb21wdXRlUGF0aEZyb21SdW5uYWJsZSgKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsIEF2bVRyYW5zaXRpb24gKiBhVHJhbnNpdGlvbik7CisKKwlib29sIGNvbXB1dGVQYXRoVG9JbnB1dCgKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsIEluc3RhbmNlT2ZQb3J0ICogYW5JbnB1dFRyYWNlKTsKKworCisJYm9vbCBjb21wdXRlUGF0aFRvVHJhbnNpdGlvbihjb25zdCBSdW50aW1lSUQgJiBhUklELAorCQkJQXZtVHJhbnNpdGlvbiAqIGFUcmFuc2l0aW9uLCBMaXN0T2ZBdm1UcmFuc2l0aW9uICYgb25lVHJhbnNpdGlvblBhdGgpOworCisJYm9vbCBjb21wdXRlUGF0aFRvVHJhbnNpdGlvbihjb25zdCBSdW50aW1lSUQgJiBhUklELAorCQkJQXZtVHJhbnNpdGlvbiAqIGFUcmFuc2l0aW9uLCBMaXN0T2ZMaXN0T2ZBdm1UcmFuc2l0aW9uICYgYWxsVHJhbnNpdGlvblBhdGhzKTsKKworCWJvb2wgY29tcHV0ZVRhcmdldE1hY2hpbmUoUnVudGltZUlEICYgYVJJRCwgQXZtQ29kZSAqIGFDb2RlKTsKKworfTsKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qIFRSQU5TSVRJT05SRUFDSEFCSUxJVFlfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvY29tcGlsZXIvQmFzZUNvbXBpbGVyLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvY29tcGlsZXIvQmFzZUNvbXBpbGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWM1YzYxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9jb21waWxlci9CYXNlQ29tcGlsZXIuY3BwCkBAIC0wLDAgKzEsNjk3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiQmFzZUNvbXBpbGVyLmgiCisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlTGliLmg+CisKKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvRGF0YVR5cGUuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvUHJvcGVydHlQYXJ0Lmg+CisKKyNpbmNsdWRlIDxmbWwvdHlwZS9CYXNlVHlwZVNwZWNpZmllci5oPgorI2luY2x1ZGUgPGZtbC90eXBlL0Nob2ljZVR5cGVTcGVjaWZpZXIuaD4KKyNpbmNsdWRlIDxmbWwvdHlwZS9DbGFzc1R5cGVTcGVjaWZpZXIuaD4KKyNpbmNsdWRlIDxmbWwvdHlwZS9FbnVtVHlwZVNwZWNpZmllci5oPgorI2luY2x1ZGUgPGZtbC90eXBlL1VuaW9uVHlwZVNwZWNpZmllci5oPgorI2luY2x1ZGUgPGZtbC90eXBlL1R5cGVNYW5hZ2VyLmg+CisKKyNpbmNsdWRlIDxmbWwvd29ya2Zsb3cvVW5pRm9ybUlkZW50aWZpZXIuaD4KKworI2luY2x1ZGUgPHNldy9Db25maWd1cmF0aW9uLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorICogUHJlLUNvbXBpbGluZyB0eXBlIHNwZWNpZmllcgorICovCit2b2lkIEJhc2VDb21waWxlcjo6cHJlY29tcGlsZVR5cGVTcGVjaWZpZXIoCisJCUF2bVByb2dyYW0gKiBhQ29udGFpbmVyLCBjb25zdCBCRiAmIGJmVHlwZSkKK3sKKwlUeXBlU3BlY2lmaWVyIGFUeXBlU3BlY2lmaWVyOworCisJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1NNQVJUX1BPSU5URVJfRVhJVCggYmZUeXBlICkKKwkJCTw8ICJ0eXBlZGVmIGZvciBjb21waWxpbmcgISEhIgorCQkJPDwgU0VORF9FWElUOworCisJaWYoIGJmVHlwZS5pczwgRGF0YVR5cGUgPigpICkKKwl7CisJCURhdGFUeXBlICogYURhdGFUeXBlID0gYmZUeXBlLnRvX3B0cjwgRGF0YVR5cGUgPigpOworCisJCWlmKCBhRGF0YVR5cGUtPmhhc1R5cGVDb250YWluZXIoKSApCisJCXsKKwkJCWFUeXBlU3BlY2lmaWVyID0gY29tcGlsZUNvbnRhaW5lclNwZWNpZmllcihhQ29udGFpbmVyLCBhRGF0YVR5cGUpOworCQl9CisJCWVsc2UgaWYoIGFEYXRhVHlwZS0+aXNUeXBlZEludGVydmFsKCkgKQorCQl7CisJCQlhVHlwZVNwZWNpZmllciA9IGNvbXBpbGVJbnRlcnZhbFNwZWNpZmllcihhQ29udGFpbmVyLCBhRGF0YVR5cGUpOworCQl9CisJCWVsc2UgaWYoIGFEYXRhVHlwZS0+aXNUeXBlZEVudW0oKSApCisJCXsKKwkJCWFUeXBlU3BlY2lmaWVyID0gY29tcGlsZUVudW1lcmF0aW9uU3BlY2lmaWVyKGFDb250YWluZXIsIGFEYXRhVHlwZSk7CisJCX0KKwkJZWxzZSBpZiggYURhdGFUeXBlLT5pc1R5cGVkU3RydWN0dXJlKCkgKQorCQl7CisJCQlhVHlwZVNwZWNpZmllciA9IGNvbXBpbGVTdHJ1Y3R1cmVTcGVjaWZpZXIoYUNvbnRhaW5lciwgYURhdGFUeXBlKTsKKwkJfQorCisJCWVsc2UgaWYoIGFEYXRhVHlwZS0+aXNUeXBlZENob2ljZSgpICkKKwkJeworCQkJYVR5cGVTcGVjaWZpZXIgPSBjb21waWxlQ2hvaWNlU3BlY2lmaWVyKGFDb250YWluZXIsIGFEYXRhVHlwZSk7CisJCX0KKworCQllbHNlIGlmKCBhRGF0YVR5cGUtPmlzVHlwZWRVbmlvbigpICkKKwkJeworCQkJYVR5cGVTcGVjaWZpZXIgPSBjb21waWxlVW5pb25TcGVjaWZpZXIoYUNvbnRhaW5lciwgYURhdGFUeXBlKTsKKwkJfQorCisJCWVsc2UgaWYoIGFEYXRhVHlwZS0+aXNUeXBlZEFsaWFzKCkgKQorCQl7CisJCQlhVHlwZVNwZWNpZmllciA9IGNvbXBpbGVUeXBlQWxpYXNTcGVjaWZpZXIoYUNvbnRhaW5lciwgYURhdGFUeXBlKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCTw8ICJVbmV4cGVjdGVkIGEgdHlwZWRlZiA8PCAiIDw8IGJmVHlwZS5zdHIoKQorCQkJCQk8PCAiID4+IGZvciBjb21waWxpbmcgISEhIgorCQkJCQk8PCBTRU5EX0VYSVQ7CisJCX0KKwl9CisKKwllbHNlIGlmKCBiZlR5cGUuaXM8IEJhc2VUeXBlU3BlY2lmaWVyID4oKSApCisJeworCQkvLyEhIE9LCisJfQorCWVsc2UKKwl7CisJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJPDwgIlVuZXhwZWN0ZWQgYSB0eXBlZGVmIDw8ICIgPDwgYmZUeXBlLnN0cigpCisJCQkJPDwgIiA+PiBmb3IgY29tcGlsaW5nICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisJfQorCisJaWYoIGFUeXBlU3BlY2lmaWVyLnZhbGlkKCkgKQorCXsKKwkJYUNvbnRhaW5lci0+YXBwZW5kVHlwZVNwZWNpZmllciggYVR5cGVTcGVjaWZpZXIgKTsKKwl9Cit9CisKKworCisvKioKKyAqIENvbXBpbGluZyB0eXBlIHNwZWNpZmllcgorICovCitUeXBlU3BlY2lmaWVyIEJhc2VDb21waWxlcjo6Y29tcGlsZVR5cGVTcGVjaWZpZXIoCisJCUF2bVByb2dyYW0gKiBhQ29udGFpbmVyLCBjb25zdCBzdGQ6OnN0cmluZyAmIGFUeXBlSUQpCit7CisJY29uc3QgVHlwZVNwZWNpZmllciAmIGFUeXBlID0gVHlwZU1hbmFnZXI6OmdldFByaW1pdGl2ZVR5cGUoIGFUeXBlSUQgKTsKKworCWlmKCBhVHlwZS52YWxpZCgpICkKKwl7CisJCXJldHVybiggYVR5cGUgKTsKKwl9CisJZWxzZQorCXsKKwkJQ29tcGlsYXRpb25FbnZpcm9ubWVudCBjb21waWxFTlYoYUNvbnRhaW5lcik7CisKKwkJY29uc3QgVHlwZVNwZWNpZmllciAmIGFUeXBlID0gU3ltYm9sVGFibGU6OnNlYXJjaFR5cGVTcGVjaWZpZXIoCisJCQkJZ2V0Q29uZmlndXJhdGlvbigpLmdldEV4ZWN1dGFibGVTeXN0ZW0oKSwKKwkJCQljb21waWxFTlYubUNUWCwgYVR5cGVJRCk7CisKKwkJaWYoIGFUeXBlLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGFUeXBlICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlhQ29udGFpbmVyLT5nZXRBc3RFbGVtZW50KCktPmVycm9yTG9jYXRpb24oQVZNX09TX1dBUk4pCisJCQkJCTw8ICJFcnJvciB3aGlsZSBjb21waWxpbmcgdHlwZSBzcGVjaWZpZXIgPDwgIgorCQkJCQk8PCBhVHlwZUlEIDw8ICIgPj4iIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisKKwkJCXJldHVybiggVHlwZU1hbmFnZXI6OlVOSVZFUlNBTCApOworCQl9CisJfQorfQorCisKK1R5cGVTcGVjaWZpZXIgQmFzZUNvbXBpbGVyOjpjb21waWxlVHlwZVNwZWNpZmllcigKKwkJQXZtUHJvZ3JhbSAqIGFDb250YWluZXIsIGNvbnN0IEJGICYgYmZUeXBlKQoreworCWlmKCBiZlR5cGUuaW52YWxpZCgpICkKKwl7CisJCXJldHVybiggVHlwZU1hbmFnZXI6OlVOSVZFUlNBTCApOworCX0KKworCWVsc2UgaWYoIGJmVHlwZS5pczwgQmFzZVR5cGVTcGVjaWZpZXIgPigpICkKKwl7CisJCXJldHVybiggYmZUeXBlLmFzX2JmPCBUeXBlU3BlY2lmaWVyID4oKSApOworCX0KKworCWVsc2UgaWYoIGJmVHlwZS5pczwgVW5pRm9ybUlkZW50aWZpZXIgPigpICkKKwl7CisJCUNvbXBpbGF0aW9uRW52aXJvbm1lbnQgY29tcGlsRU5WKGFDb250YWluZXIpOworCisJCWNvbnN0IFR5cGVTcGVjaWZpZXIgJiBhVHlwZSA9IFN5bWJvbFRhYmxlOjpzZWFyY2hUeXBlU3BlY2lmaWVyKAorCQkJCWdldENvbmZpZ3VyYXRpb24oKS5nZXRFeGVjdXRhYmxlU3lzdGVtKCksCisJCQkJY29tcGlsRU5WLm1DVFgsIGJmVHlwZS5zdHIoKSk7CisKKwkJaWYoIGFUeXBlLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGFUeXBlICk7CisJCX0KKwkJZWxzZQorCQl7CisvLwkJCWluY3JFcnJvckNvdW50KCk7CisJCQlBVk1fT1NfV0FSTiA8PCBiZlR5cGUudG9fcHRyPCBVbmlGb3JtSWRlbnRpZmllciA+KCkKKwkJCQkJLT5lcnJvckxvY2F0aW9uKGFDb250YWluZXItPmdldEFzdEVsZW1lbnQoKSkKKwkJCQkJPDwgIlVuZm91bmQgZGF0YSB0eXBlIGZvcm0gPDwgIiA8PCBiZlR5cGUuc3RyKCkKKwkJCQkJPDwgIiA+PiIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKworCQkJcmV0dXJuKCBUeXBlTWFuYWdlcjo6VU5JVkVSU0FMICk7CisJCX0KKwl9CisKKwllbHNlIGlmKCBiZlR5cGUuaXNub3Q8IE9iamVjdEVsZW1lbnQgLyohRGF0YVR5cGUhKi8gPigpICkKKwl7CisJCWNvbnN0IFR5cGVTcGVjaWZpZXIgJiBhVHlwZSA9CisJCQkJVHlwZU1hbmFnZXI6OmdldFByaW1pdGl2ZVR5cGUoIGJmVHlwZS5zdHIoKSApOworCisJCWlmKCBhVHlwZS52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCBhVHlwZSApOworCQl9CisJCWVsc2UKKwkJeworCQkJQVZNX09TX1RPRE9fQUxFUlQKKwkJCQkJPDwgIkNvbXBpbGF0aW9uIG9mIHVua25vd24gdHlwZSBzcGVjaWZpY2llciA8PCAiCisJCQkJCTw8IGJmVHlwZS5zdHIoKSA8PCAiID4+ICEhISIKKwkJCQkJPDwgU0VORF9BTEVSVDsKKworCQkJcmV0dXJuKCBUeXBlTWFuYWdlcjo6VU5JVkVSU0FMICk7CisJCX0KKwl9CisKKwllbHNlCisJeworCQlDb21waWxhdGlvbkVudmlyb25tZW50IGNvbXBpbEVOVihhQ29udGFpbmVyKTsKKworCQlUeXBlU3BlY2lmaWVyIGJmVFMgPSAgU3ltYm9sVGFibGU6OnNlYXJjaFR5cGVTcGVjaWZpZXIoCisJCQkJZ2V0Q29uZmlndXJhdGlvbigpLmdldEV4ZWN1dGFibGVTeXN0ZW0oKSwKKwkJCQljb21waWxFTlYubUNUWCwgYmZUeXBlLnRvX3B0cjwgT2JqZWN0RWxlbWVudCA+KCkgKTsKKworCQlpZiggYmZUUy52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCBiZlRTICk7CisJCX0KKworCQllbHNlICBpZiggYmZUeXBlLmlzPCBEYXRhVHlwZSA+KCkgKQorCQl7CisJCQlEYXRhVHlwZSAqIGFEYXRhVHlwZSA9IGJmVHlwZS50b19wdHI8IERhdGFUeXBlID4oKTsKKworCQkJaWYoIGFEYXRhVHlwZS0+aGFzVHlwZUNvbnRhaW5lcigpICkKKwkJCXsKKwkJCQliZlRTID0gY29tcGlsZUNvbnRhaW5lclNwZWNpZmllcihhQ29udGFpbmVyLCBhRGF0YVR5cGUpOworCQkJfQorCQkJZWxzZSBpZiggYURhdGFUeXBlLT5pc1R5cGVkSW50ZXJ2YWwoKSApCisJCQl7CisJCQkJYmZUUyA9IGNvbXBpbGVJbnRlcnZhbFNwZWNpZmllcihhQ29udGFpbmVyLCBhRGF0YVR5cGUpOworCQkJfQorCQkJZWxzZSBpZiggYURhdGFUeXBlLT5pc1R5cGVkRW51bSgpICkKKwkJCXsKKwkJCQliZlRTID0gY29tcGlsZUVudW1lcmF0aW9uU3BlY2lmaWVyKGFDb250YWluZXIsIGFEYXRhVHlwZSk7CisJCQl9CisJCQllbHNlIGlmKCBhRGF0YVR5cGUtPmlzVHlwZWRTdHJ1Y3R1cmUoKSApCisJCQl7CisJCQkJYmZUUyA9IGNvbXBpbGVTdHJ1Y3R1cmVTcGVjaWZpZXIoYUNvbnRhaW5lciwgYURhdGFUeXBlKTsKKwkJCX0KKworCQkJZWxzZSBpZiggYURhdGFUeXBlLT5pc1R5cGVkQ2hvaWNlKCkgKQorCQkJeworCQkJCWJmVFMgPSBjb21waWxlQ2hvaWNlU3BlY2lmaWVyKGFDb250YWluZXIsIGFEYXRhVHlwZSk7CisJCQl9CisKKwkJCWVsc2UgaWYoIGFEYXRhVHlwZS0+aXNUeXBlZFVuaW9uKCkgKQorCQkJeworCQkJCWJmVFMgPSBjb21waWxlVW5pb25TcGVjaWZpZXIoYUNvbnRhaW5lciwgYURhdGFUeXBlKTsKKwkJCX0KKworCQkJZWxzZS8vIGlmKCBhRGF0YVR5cGUtPmlzVHlwZWRBbGlhcygpICkKKwkJCXsKKwkJCQliZlRTID0gY29tcGlsZVR5cGVBbGlhc1NwZWNpZmllcihhQ29udGFpbmVyLCBhRGF0YVR5cGUpOworCQkJfQorCQl9CisKKwkJaWYoIGJmVFMudmFsaWQoKSApCisJCXsKKwkJCWlmKCBiZlRTLmhhc1R5cGVFbnVtT3JDb21wb3NpdGUoKSAmJgorCQkJCQlTeW1ib2xUYWJsZTo6c2VhcmNoVHlwZVNwZWNpZmllcigKKwkJCQkJCQlnZXRDb25maWd1cmF0aW9uKCkuZ2V0RXhlY3V0YWJsZVN5c3RlbSgpLAorCQkJCQkJCWNvbXBpbEVOVi5tQ1RYLCBiZlRTLmdldEFzdEVsZW1lbnQoKSkuaW52YWxpZCgpICkKKwkJCXsKKwkJCQlhQ29udGFpbmVyLT5hcHBlbmRUeXBlU3BlY2lmaWVyKCBiZlRTICk7CisJCQl9CisKKwkJCXJldHVybiggYmZUUyApOworCQl9CisJCWVsc2UKKwkJeworCQkJYUNvbnRhaW5lci0+Z2V0QXN0RWxlbWVudCgpLT5lcnJvckxvY2F0aW9uKEFWTV9PU19XQVJOKQorCQkJCQk8PCAiRXJyb3Igd2hpbGUgY29tcGlsaW5nIHR5cGUgc3BlY2lmaWVyIDw8ICIKKwkJCQkJPDwgYmZUeXBlLnN0cigpIDw8ICIgPj4iIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisKKwkJCXJldHVybiggVHlwZU1hbmFnZXI6OlVOSVZFUlNBTCApOworCQl9CisKKworLy8JCWluY3JFcnJvckNvdW50KCk7CisJCSsrQVZNX0VSUk9SX0NPVU5UOworCisJCUFWTV9PU19FUlJPUl9BTEVSVAorCQkJCTw8ICJUT0RPOj4gY29tcGlsYXRpb24gb2YgdW5rbm93biB0eXBlIHNwZWNpZmljaWVyIGxpa2UgOiA8PCAiCisJCQkJPDwgYmZUeXBlLnN0cigpIDw8ICIgPj4gISEhIgorCQkJCTw8IFNFTkRfQUxFUlQ7CisKKwkJcmV0dXJuKCBUeXBlTWFuYWdlcjo6VU5JVkVSU0FMICk7CisJfQorfQorCisKK1R5cGVTcGVjaWZpZXIgQmFzZUNvbXBpbGVyOjpjb21waWxlU3RydWN0dXJlU3BlY2lmaWVyKAorCQlBdm1Qcm9ncmFtICogYUNvbnRhaW5lciwgRGF0YVR5cGUgKiBhU3RydWN0dXJlVCkKK3sKKwlDbGFzc1R5cGVTcGVjaWZpZXIgKiB0aGVDbGFzc1R5cGU7CisJVHlwZVNwZWNpZmllciBiZlRTKCB0aGVDbGFzc1R5cGUgPSBUeXBlTWFuYWdlcjo6bmV3Q2xhc3MoYVN0cnVjdHVyZVQpICk7CisKKwlCRiBhVmFsdWU7CisJVHlwZVNwZWNpZmllciBhVHlwZVNwZWNpZmllcjsKKworCVRhYmxlT2ZWYXJpYWJsZTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGl0ID0KKwkJCWFTdHJ1Y3R1cmVULT5nZXRQcm9wZXJ0eVBhcnQoKS0+Z2V0VmFyaWFibGVzKCkuYmVnaW4oKTsKKwlUYWJsZU9mVmFyaWFibGU6OmNvbnN0X3Jhd19pdGVyYXRvciBlbmRJdCA9CisJCQlhU3RydWN0dXJlVC0+Z2V0UHJvcGVydHlQYXJ0KCktPmdldFZhcmlhYmxlcygpLmVuZCgpOworCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCXsKKwkJYVR5cGVTcGVjaWZpZXIgPSBjb21waWxlVHlwZVNwZWNpZmllcihhQ29udGFpbmVyLCAoaXQpLT5nZXRUeXBlKCkpOworCisJCUluc3RhbmNlT2ZEYXRhICogYW5JbnN0YW5jZUF0dHJpYnV0ZSA9IG5ldyBJbnN0YW5jZU9mRGF0YSgKKwkJCQlJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfRklFTERfQ0xBU1NfQVRUUklCVVRFX05BVFVSRSwKKwkJCQlOVUxMLCAoaXQpLCBhVHlwZVNwZWNpZmllciwKKwkJCQl0aGVDbGFzc1R5cGUtPmdldFN5bWJvbERhdGEoKS5zaXplKCksIChpdCktPmdldE1vZGlmaWVyKCkgKTsKKwkJYW5JbnN0YW5jZUF0dHJpYnV0ZS0+c2V0TmFtZUlEKCAoaXQpLT5nZXROYW1lSUQoKSApOworCisJCWFWYWx1ZSA9IChpdCktPmdldFZhbHVlKCk7CisJCWlmKCBhVmFsdWUudmFsaWQoKSApCisJCXsKKwkJCXN3aXRjaCggYVZhbHVlLmNsYXNzS2luZCgpICkKKwkJCXsKKwkJCQljYXNlIEZPUk1fT1BFUkFUT1JfS0lORDoKKworCQkJCWNhc2UgRk9STV9CVUlMVElOX0JPT0xFQU5fS0lORDoKKwkJCQljYXNlIEZPUk1fQlVJTFRJTl9DSEFSQUNURVJfS0lORDoKKwkJCQljYXNlIEZPUk1fQlVJTFRJTl9JTlRFR0VSX0tJTkQ6CisJCQkJY2FzZSBGT1JNX0JVSUxUSU5fUkFUSU9OQUxfS0lORDoKKwkJCQljYXNlIEZPUk1fQlVJTFRJTl9GTE9BVF9LSU5EOgorCQkJCWNhc2UgRk9STV9CVUlMVElOX1NUUklOR19LSU5EOgorCQkJCWNhc2UgRk9STV9CVUlMVElOX0lERU5USUZJRVJfS0lORDoKKwkJCQljYXNlIEZPUk1fQlVJTFRJTl9RVUFMSUZJRURfSURFTlRJRklFUl9LSU5EOgorCQkJCS8vQGRlcHJlY2F0ZWQKKwkJCQkvL2Nhc2UgRk9STV9FWFBSRVNTSU9OX0dJTkFDX0tJTkQ6CisJCQkJeworCQkJCQlhbkluc3RhbmNlQXR0cmlidXRlLT5zZXRWYWx1ZSggYVZhbHVlICk7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCWlmKCAoYVZhbHVlID09IEV4ZWN1dGFibGVMaWI6Ok1BQ0hJTkVfTlVMTCkKKwkJCQkJCXx8IChhVmFsdWUgPT0gRXhlY3V0YWJsZUxpYjo6Q0hBTk5FTF9OSUwpCisJCQkJCQl8fCAoYVZhbHVlID09IEV4ZWN1dGFibGVMaWI6OlBPUlRfTklMICAgKQorCQkJCQkJfHwgKGFWYWx1ZSA9PSBFeGVjdXRhYmxlTGliOjpCVUZGRVJfTklMICkgKQorCQkJCQl7CisJCQkJCQlhbkluc3RhbmNlQXR0cmlidXRlLT5zZXRWYWx1ZSggYVZhbHVlICk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJCQk8PCAiVW5leHBlY3RlZCBTVFJVQ1RVUkUgQVRUUklCVVRFIHZhbHVlICIKKwkJCQkJCQkJCSJmb3IgY29tcGlsZVN0cnVjdHVyZVNwZWNpZmllciA6PlxuIgorCQkJCQkJCQk8PCBhVmFsdWUudG9TdHJpbmcoIEFWTV9UQUIxX0lOREVOVCApCisJCQkJCQkJCTw8IFNFTkRfRVhJVDsKKworLy8JCQkJCQlhbkluc3RhbmNlQXR0cmlidXRlLT5zZXRWYWx1ZSggbUF2bWNvZGVDb21waWxlci4KKy8vCQkJCQkJCQlkZWNvZGVfY29tcGlsZUV4cHJlc3Npb24oYUNvbnRhaW5lciwgYVZhbHVlKSApOworCQkJCQl9CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCX0KKworCQl0aGVDbGFzc1R5cGUtPnNhdmVTeW1ib2xEYXRhKGFuSW5zdGFuY2VBdHRyaWJ1dGUpOworCX0KKworCXRoZUNsYXNzVHlwZS0+dXBkYXRlU2l6ZSgpOworCisJcmV0dXJuKCBiZlRTICk7Cit9CisKKworVHlwZVNwZWNpZmllciBCYXNlQ29tcGlsZXI6OmNvbXBpbGVDaG9pY2VTcGVjaWZpZXIoCisJCUF2bVByb2dyYW0gKiBhQ29udGFpbmVyLCBEYXRhVHlwZSAqIGFDaG9pY2VUKQoreworCUNob2ljZVR5cGVTcGVjaWZpZXIgKiB0aGVDaG9pY2VUeXBlOworCVR5cGVTcGVjaWZpZXIgYmZUUyggdGhlQ2hvaWNlVHlwZSA9IFR5cGVNYW5hZ2VyOjpuZXdDaG9pY2UoYUNob2ljZVQpICk7CisKKwlCRiBhVmFsdWU7CisJVHlwZVNwZWNpZmllciBhVHlwZVNwZWNpZmllcjsKKworCVRhYmxlT2ZWYXJpYWJsZTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGl0ID0KKwkJCWFDaG9pY2VULT5nZXRQcm9wZXJ0eVBhcnQoKS0+Z2V0VmFyaWFibGVzKCkuYmVnaW4oKTsKKwlUYWJsZU9mVmFyaWFibGU6OmNvbnN0X3Jhd19pdGVyYXRvciBlbmRJdCA9CisJCQlhQ2hvaWNlVC0+Z2V0UHJvcGVydHlQYXJ0KCktPmdldFZhcmlhYmxlcygpLmVuZCgpOworCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCXsKKwkJYVR5cGVTcGVjaWZpZXIgPSBjb21waWxlVHlwZVNwZWNpZmllcihhQ29udGFpbmVyLCAoaXQpLT5nZXRUeXBlKCkpOworCisJCUluc3RhbmNlT2ZEYXRhICogYW5JbnN0YW5jZUF0dHJpYnV0ZSA9IG5ldyBJbnN0YW5jZU9mRGF0YSgKKwkJCQlJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfRklFTERfQ0hPSUNFX0FUVFJJQlVURV9OQVRVUkUsCisJCQkJTlVMTCwgKGl0KSwgYVR5cGVTcGVjaWZpZXIsCisJCQkJdGhlQ2hvaWNlVHlwZS0+Z2V0U3ltYm9sRGF0YSgpLnNpemUoKSwgKGl0KS0+Z2V0TW9kaWZpZXIoKSApOworCQlhbkluc3RhbmNlQXR0cmlidXRlLT5zZXROYW1lSUQoIChpdCktPmdldE5hbWVJRCgpICk7CisKKwkJYVZhbHVlID0gKGl0KS0+Z2V0VmFsdWUoKTsKKwkJaWYoIGFWYWx1ZS52YWxpZCgpICkKKwkJeworCQkJc3dpdGNoKCBhVmFsdWUuY2xhc3NLaW5kKCkgKQorCQkJeworCQkJCWNhc2UgRk9STV9PUEVSQVRPUl9LSU5EOgorCisJCQkJY2FzZSBGT1JNX0JVSUxUSU5fQk9PTEVBTl9LSU5EOgorCQkJCWNhc2UgRk9STV9CVUlMVElOX0NIQVJBQ1RFUl9LSU5EOgorCQkJCWNhc2UgRk9STV9CVUlMVElOX0lOVEVHRVJfS0lORDoKKwkJCQljYXNlIEZPUk1fQlVJTFRJTl9SQVRJT05BTF9LSU5EOgorCQkJCWNhc2UgRk9STV9CVUlMVElOX0ZMT0FUX0tJTkQ6CisJCQkJY2FzZSBGT1JNX0JVSUxUSU5fU1RSSU5HX0tJTkQ6CisJCQkJY2FzZSBGT1JNX0JVSUxUSU5fSURFTlRJRklFUl9LSU5EOgorCQkJCWNhc2UgRk9STV9CVUlMVElOX1FVQUxJRklFRF9JREVOVElGSUVSX0tJTkQ6CisJCQkJLy9AZGVwcmVjYXRlZAorCQkJCS8vY2FzZSBGT1JNX0VYUFJFU1NJT05fR0lOQUNfS0lORDoKKwkJCQl7CisJCQkJCWFuSW5zdGFuY2VBdHRyaWJ1dGUtPnNldFZhbHVlKCBhVmFsdWUgKTsKKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJaWYoIChhVmFsdWUgPT0gRXhlY3V0YWJsZUxpYjo6TUFDSElORV9OVUxMKQorCQkJCQkJfHwgKGFWYWx1ZSA9PSBFeGVjdXRhYmxlTGliOjpDSEFOTkVMX05JTCkKKwkJCQkJCXx8IChhVmFsdWUgPT0gRXhlY3V0YWJsZUxpYjo6UE9SVF9OSUwgICApCisJCQkJCQl8fCAoYVZhbHVlID09IEV4ZWN1dGFibGVMaWI6OkJVRkZFUl9OSUwgKSApCisJCQkJCXsKKwkJCQkJCWFuSW5zdGFuY2VBdHRyaWJ1dGUtPnNldFZhbHVlKCBhVmFsdWUgKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQkJCTw8ICJVbmV4cGVjdGVkIFNUUlVDVFVSRSBBVFRSSUJVVEUgdmFsdWUgIgorCQkJCQkJCQkJImZvciBjb21waWxlQ2hvaWNlU3BlY2lmaWVyIDo+XG4iCisJCQkJCQkJCTw8IGFWYWx1ZS50b1N0cmluZyggQVZNX1RBQjFfSU5ERU5UICkKKwkJCQkJCQkJPDwgU0VORF9FWElUOworCisvLwkJCQkJCWFuSW5zdGFuY2VBdHRyaWJ1dGUtPnNldFZhbHVlKCBtQXZtY29kZUNvbXBpbGVyLgorLy8JCQkJCQkJCWRlY29kZV9jb21waWxlRXhwcmVzc2lvbihhQ29udGFpbmVyLCBhVmFsdWUpICk7CisJCQkJCX0KKworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJfQorCisJCXRoZUNob2ljZVR5cGUtPnNhdmVTeW1ib2xEYXRhKGFuSW5zdGFuY2VBdHRyaWJ1dGUpOworCX0KKworCXRoZUNob2ljZVR5cGUtPnVwZGF0ZVNpemUoKTsKKworCXJldHVybiggYmZUUyApOworfQorCisKK1R5cGVTcGVjaWZpZXIgQmFzZUNvbXBpbGVyOjpjb21waWxlVW5pb25TcGVjaWZpZXIoCisJCUF2bVByb2dyYW0gKiBhQ29udGFpbmVyLCBEYXRhVHlwZSAqIGFuVW5pb25UKQoreworCVVuaW9uVHlwZVNwZWNpZmllciAqIHRoZVVuaW9uVHlwZTsKKwlUeXBlU3BlY2lmaWVyIGJmVFMoIHRoZVVuaW9uVHlwZSA9IFR5cGVNYW5hZ2VyOjpuZXdVbmlvbihhblVuaW9uVCkgKTsKKworCUJGIGFWYWx1ZTsKKwlUeXBlU3BlY2lmaWVyIGFUeXBlU3BlY2lmaWVyOworCisJVGFibGVPZlZhcmlhYmxlOjpjb25zdF9yYXdfaXRlcmF0b3IgaXQgPQorCQkJYW5VbmlvblQtPmdldFByb3BlcnR5UGFydCgpLT5nZXRWYXJpYWJsZXMoKS5iZWdpbigpOworCVRhYmxlT2ZWYXJpYWJsZTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGVuZEl0ID0KKwkJCWFuVW5pb25ULT5nZXRQcm9wZXJ0eVBhcnQoKS0+Z2V0VmFyaWFibGVzKCkuZW5kKCk7CisJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJeworCQlhVHlwZVNwZWNpZmllciA9IGNvbXBpbGVUeXBlU3BlY2lmaWVyKGFDb250YWluZXIsIChpdCktPmdldFR5cGUoKSk7CisKKwkJSW5zdGFuY2VPZkRhdGEgKiBhbkluc3RhbmNlQXR0cmlidXRlID0gbmV3IEluc3RhbmNlT2ZEYXRhKAorCQkJCUlQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9GSUVMRF9VTklPTl9BVFRSSUJVVEVfTkFUVVJFLAorCQkJCU5VTEwsIChpdCksIGFUeXBlU3BlY2lmaWVyLCAwLCAoaXQpLT5nZXRNb2RpZmllcigpKTsKKwkJYW5JbnN0YW5jZUF0dHJpYnV0ZS0+c2V0TmFtZUlEKCAoaXQpLT5nZXROYW1lSUQoKSApOworCisJCWFWYWx1ZSA9IChpdCktPmdldFZhbHVlKCk7CisJCWlmKCBhVmFsdWUudmFsaWQoKSApCisJCXsKKwkJCXN3aXRjaCggYVZhbHVlLmNsYXNzS2luZCgpICkKKwkJCXsKKwkJCQljYXNlIEZPUk1fT1BFUkFUT1JfS0lORDoKKworCQkJCWNhc2UgRk9STV9CVUlMVElOX0JPT0xFQU5fS0lORDoKKwkJCQljYXNlIEZPUk1fQlVJTFRJTl9DSEFSQUNURVJfS0lORDoKKwkJCQljYXNlIEZPUk1fQlVJTFRJTl9JTlRFR0VSX0tJTkQ6CisJCQkJY2FzZSBGT1JNX0JVSUxUSU5fUkFUSU9OQUxfS0lORDoKKwkJCQljYXNlIEZPUk1fQlVJTFRJTl9GTE9BVF9LSU5EOgorCQkJCWNhc2UgRk9STV9CVUlMVElOX1NUUklOR19LSU5EOgorCQkJCWNhc2UgRk9STV9CVUlMVElOX0lERU5USUZJRVJfS0lORDoKKwkJCQljYXNlIEZPUk1fQlVJTFRJTl9RVUFMSUZJRURfSURFTlRJRklFUl9LSU5EOgorCQkJCS8vQGRlcHJlY2F0ZWQKKwkJCQkvL2Nhc2UgRk9STV9FWFBSRVNTSU9OX0dJTkFDX0tJTkQ6CisJCQkJeworCQkJCQlhbkluc3RhbmNlQXR0cmlidXRlLT5zZXRWYWx1ZSggYVZhbHVlICk7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCWlmKCAoYVZhbHVlID09IEV4ZWN1dGFibGVMaWI6Ok1BQ0hJTkVfTlVMTCkKKwkJCQkJCXx8IChhVmFsdWUgPT0gRXhlY3V0YWJsZUxpYjo6Q0hBTk5FTF9OSUwpCisJCQkJCQl8fCAoYVZhbHVlID09IEV4ZWN1dGFibGVMaWI6OlBPUlRfTklMICAgKQorCQkJCQkJfHwgKGFWYWx1ZSA9PSBFeGVjdXRhYmxlTGliOjpCVUZGRVJfTklMICkgKQorCQkJCQl7CisJCQkJCQlhbkluc3RhbmNlQXR0cmlidXRlLT5zZXRWYWx1ZSggYVZhbHVlICk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJCQk8PCAiVW5leHBlY3RlZCBVTklPTiBBVFRSSUJVVEUgdmFsdWUgIgorCQkJCQkJCQkJImZvciBjb21waWxlVW5pb25TcGVjaWZpZXIgOj5cbiIKKwkJCQkJCQkJPDwgYVZhbHVlLnRvU3RyaW5nKCBBVk1fVEFCMV9JTkRFTlQgKQorCQkJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKy8vCQkJCQkJYW5JbnN0YW5jZUF0dHJpYnV0ZS0+c2V0VmFsdWUoIG1Bdm1jb2RlQ29tcGlsZXIuCisvLwkJCQkJCQkJZGVjb2RlX2NvbXBpbGVFeHByZXNzaW9uKGFDb250YWluZXIsIGFWYWx1ZSkgKTsKKwkJCQkJfQorCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQl9CisKKwkJdGhlVW5pb25UeXBlLT5zYXZlU3ltYm9sRGF0YShhbkluc3RhbmNlQXR0cmlidXRlKTsKKwl9CisKKwl0aGVVbmlvblR5cGUtPnVwZGF0ZVNpemUoKTsKKworCXJldHVybiggYmZUUyApOworfQorCisKK1R5cGVTcGVjaWZpZXIgQmFzZUNvbXBpbGVyOjpjb21waWxlQ29udGFpbmVyU3BlY2lmaWVyKAorCQlBdm1Qcm9ncmFtICogYUNvbnRhaW5lciwgRGF0YVR5cGUgKiBhQ29sbGVjdGlvblQpCit7CisJVHlwZVNwZWNpZmllciB0aGVDb250YWluZXJUeXBlID0gY29tcGlsZVR5cGVTcGVjaWZpZXIoCisJCQlhQ29udGFpbmVyLCBhQ29sbGVjdGlvblQtPmdldENvbnRlbnRzVHlwZVNwZWNpZmllcigpKTsKKworCWlmKCB0aGVDb250YWluZXJUeXBlLmludmFsaWQoKSApCisJeworCQl0aGVDb250YWluZXJUeXBlID0gVHlwZU1hbmFnZXI6OlVOSVZFUlNBTDsKKworLy8JCWluY3JFcnJvckNvdW50KCk7CisJCSsrQVZNX0VSUk9SX0NPVU5UOworCisJCUFWTV9PU19FUlJPUl9BTEVSVCA8PCAiQmFzZUNvbXBpbGVyOjpjb21waWxlQ29sbGVjdGlvblNwZWNpZmllciA6IDw8ICIKKwkJCQk8PCBhQ29sbGVjdGlvblQtPnN0clQoKSA8PCAiID4+ICEhISIKKwkJCQk8PCBTRU5EX0FMRVJUOworCX0KKworCisJaW50IHRoZVNpemUgPSBhQ29sbGVjdGlvblQtPnNpemUoKTsKKworCWlmKCAoYUNvbGxlY3Rpb25ULT5nZXRDb250YWluZXJTcGVjaWZpZXJLaW5kKCkgPT0gVFlQRV9BUlJBWV9TUEVDSUZJRVIpCisJCSYmICh0aGVTaXplIDwgMSkgKQorCXsKKwkJdGhlU2l6ZSA9IDE7CisKKy8vCQlpbmNyRXJyb3JDb3VudCgpOworCQkrK0FWTV9FUlJPUl9DT1VOVDsKKworCQlBVk1fT1NfRVJST1JfQUxFUlQgPDwgIkJhc2VDb21waWxlcjo6Y29tcGlsZUNvbGxlY3Rpb25TcGVjaWZpZXIgOiA8PCAiCisJCQkJPDwgYUNvbGxlY3Rpb25ULT5zdHJUKCkgPDwgIiA+PiAhISEiCisJCQkJPDwgU0VORF9BTEVSVDsKKwl9CisKKwlUeXBlU3BlY2lmaWVyIGJmVFMoIFR5cGVNYW5hZ2VyOjpuZXdDb2xsZWN0aW9uKGFDb2xsZWN0aW9uVCwKKwkJCWFDb2xsZWN0aW9uVC0+Z2V0Q29udGFpbmVyU3BlY2lmaWVyS2luZCgpLCB0aGVDb250YWluZXJUeXBlLAorCQkJKHRoZVNpemUgPCAwKT8gQVZNX05VTUVSSUNfTUFYX0lOVEVHRVIgOiB0aGVTaXplICkgKTsKKworCXJldHVybiggYmZUUyApOworfQorCisKK1R5cGVTcGVjaWZpZXIgQmFzZUNvbXBpbGVyOjpjb21waWxlSW50ZXJ2YWxTcGVjaWZpZXIoCisJCUF2bVByb2dyYW0gKiBhQ29udGFpbmVyLCBEYXRhVHlwZSAqIGFuSW50ZXJ2YWxUKQoreworCVR5cGVTcGVjaWZpZXIgdGhlQmFzZVR5cGUgPSBjb21waWxlVHlwZVNwZWNpZmllcigKKwkJCWFDb250YWluZXIsIGFuSW50ZXJ2YWxULT5nZXRJbnRlcnZhbFR5cGVTcGVjaWZpZXIoKSk7CisKKwlpZiggdGhlQmFzZVR5cGUuaW52YWxpZCgpICkKKwl7CisJCXRoZUJhc2VUeXBlID0gVHlwZU1hbmFnZXI6OklOVEVHRVI7CisKKy8vCQlpbmNyRXJyb3JDb3VudCgpOworCQkrK0FWTV9FUlJPUl9DT1VOVDsKKworCQlBVk1fT1NfRVJST1JfQUxFUlQgPDwgIkJhc2VDb21waWxlcjo6Y29tcGlsZUludGVydmFsU3BlY2lmaWVyIDogPDwgIgorCQkJCTw8IGFuSW50ZXJ2YWxULT5zdHJUKCkgPDwgIiA+PiAhISEiCisJCQkJPDwgU0VORF9BTEVSVDsKKwl9CisKKwlCRiBhTWluID0gbUF2bWNvZGVDb21waWxlci5kZWNvZGVfY29tcGlsZUV4cHJlc3Npb24oCisJCQlhQ29udGFpbmVyLCBhbkludGVydmFsVC0+Z2V0SW50ZXJ2YWxJbmZpbXVtKCkpOworCisJQkYgYU1heCA9IG1Bdm1jb2RlQ29tcGlsZXIuZGVjb2RlX2NvbXBpbGVFeHByZXNzaW9uKAorCQkJYUNvbnRhaW5lciwgYW5JbnRlcnZhbFQtPmdldEludGVydmFsU3VwcmVtdW0oKSk7CisKKwlUeXBlU3BlY2lmaWVyIGJmVFMoIFR5cGVNYW5hZ2VyOjpuZXdJbnRlcnZhbChhbkludGVydmFsVCwKKwkJCXRoZUJhc2VUeXBlLCBhbkludGVydmFsVC0+Z2V0SW50ZXJ2YWxLaW5kKCksIGFNaW4sIGFNYXgpICk7CisKKwlyZXR1cm4oIGJmVFMgKTsKK30KKworCitUeXBlU3BlY2lmaWVyIEJhc2VDb21waWxlcjo6Y29tcGlsZUVudW1lcmF0aW9uU3BlY2lmaWVyKAorCQlBdm1Qcm9ncmFtICogYUNvbnRhaW5lciwgRGF0YVR5cGUgKiBhbkVudW1UKQoreworCUVudW1UeXBlU3BlY2lmaWVyICogdGhlRW51bVR5cGU7CisJVHlwZVNwZWNpZmllciBiZlRTKCB0aGVFbnVtVHlwZSA9IFR5cGVNYW5hZ2VyOjpuZXdFbnVtKGFuRW51bVQpKTsKKworCUJGIGFWYWx1ZTsKKworCVRhYmxlT2ZWYXJpYWJsZTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGl0ID0KKwkJCWFuRW51bVQtPmdldFByb3BlcnR5UGFydCgpLT5nZXRWYXJpYWJsZXMoKS5iZWdpbigpOworCVRhYmxlT2ZWYXJpYWJsZTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGVuZEl0ID0KKwkJCWFuRW51bVQtPmdldFByb3BlcnR5UGFydCgpLT5nZXRWYXJpYWJsZXMoKS5lbmQoKTsKKwlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwl7CisJCUluc3RhbmNlT2ZEYXRhICogYW5JbnN0YW5jZVN5bWJvbCA9IG5ldyBJbnN0YW5jZU9mRGF0YSgKKwkJCQlJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfRU5VTV9TWU1CT0xfTkFUVVJFLAorCQkJCWFDb250YWluZXIsIChpdCksIGJmVFMsIChpdCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCksCisJCQkJdGhlRW51bVR5cGUtPmdldFN5bWJvbERhdGEoKS5zaXplKCksCisJCQkJTW9kaWZpZXI6OlBST1BFUlRZX1BVQkxJQ19GSU5BTF9TVEFUSUNfTU9ESUZJRVIpOworCQlhbkluc3RhbmNlU3ltYm9sLT51cGRhdGVGdWxseVF1YWxpZmllZE5hbWVJRCgpOworCisJCWFWYWx1ZSA9IChpdCktPmdldFZhbHVlKCk7CisJCWlmKCBhVmFsdWUudmFsaWQoKSApCisJCXsKKwkJCWlmKCBhVmFsdWUuaXNCdWlsdGluVmFsdWUoKSApCisJCQl7CisJCQkJYW5JbnN0YW5jZVN5bWJvbC0+c2V0VmFsdWUoIGFWYWx1ZSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQk8PCAiVW5leHBlY3RlZCBFTlVNIHZhbHVlIGZvciAiCisJCQkJCQkJImNvbXBpbGVFbnVtZXJhdGlvblNwZWNpZmllciA6PlxuIgorCQkJCQkJPDwgYVZhbHVlLnRvU3RyaW5nKCBBVk1fVEFCMV9JTkRFTlQgKQorCQkJCQkJPDwgU0VORF9FWElUOworCisvLwkJCQlhbkluc3RhbmNlU3ltYm9sLT5zZXRWYWx1ZSggbUF2bWNvZGVDb21waWxlci4KKy8vCQkJCQkJZGVjb2RlX2NvbXBpbGVFeHByZXNzaW9uKGFDb250YWluZXIsIGFWYWx1ZSkgKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWFuSW5zdGFuY2VTeW1ib2wtPnNldFZhbHVlKCB0aGVFbnVtVHlwZS0+bmV3ZnJlc2hTeW1ib2xWYWx1ZSgpICk7CisJCX0KKworCQl0aGVFbnVtVHlwZS0+c2F2ZVN5bWJvbERhdGEoYW5JbnN0YW5jZVN5bWJvbCk7CisJfQorCisJdGhlRW51bVR5cGUtPnVwZGF0ZVNpemUoKTsKKwl0aGVFbnVtVHlwZS0+dXBkYXRlQm91bmQoKTsKKworCXJldHVybiggYmZUUyApOworfQorCisKK1R5cGVTcGVjaWZpZXIgQmFzZUNvbXBpbGVyOjpjb21waWxlVHlwZUFsaWFzU3BlY2lmaWVyKAorCQlBdm1Qcm9ncmFtICogYUNvbnRhaW5lciwgRGF0YVR5cGUgKiBhRGF0YVR5cGUpCit7CisJVHlwZVNwZWNpZmllciB0aGVUeXBlU3BlY2lmaWVyID0gY29tcGlsZVR5cGVTcGVjaWZpZXIoCisJCQlhQ29udGFpbmVyLCBhRGF0YVR5cGUtPmdldFR5cGVTcGVjaWZpZXIoKSk7CisKKwlpZiggdGhlVHlwZVNwZWNpZmllci5pbnZhbGlkKCkgKQorCXsKKwkJdGhlVHlwZVNwZWNpZmllciA9IFR5cGVNYW5hZ2VyOjpVTklWRVJTQUw7CisKKy8vCQlpbmNyRXJyb3JDb3VudCgpOworCQkrK0FWTV9FUlJPUl9DT1VOVDsKKworCQlBVk1fT1NfRVJST1JfQUxFUlQgPDwgIkJhc2VDb21waWxlcjo6Y29tcGlsZVR5cGVBbGlhc1NwZWNpZmllciA6IDw8ICIKKwkJCQk8PCBhRGF0YVR5cGUtPnRvU3RyaW5nKCkgPDwgIiA+PiAhISEiCisJCQkJPDwgU0VORF9BTEVSVDsKKwl9CisKKwlUeXBlU3BlY2lmaWVyIGJmVFMoCisJCQlUeXBlTWFuYWdlcjo6bmV3VHlwZUFsaWFzKGFEYXRhVHlwZSwgdGhlVHlwZVNwZWNpZmllcikgKTsKKworCWlmKCBhRGF0YVR5cGUtPmhhc0NvbnN0cmFpbnRSb3V0aW5lKCkgJiYKKwkJYURhdGFUeXBlLT5nZXRDb25zdHJhaW50Um91dGluZSgpLT5kb1NvbWV0aGluZygpICkKKwl7CisJCWJmVFMuc2F2ZUNvbnN0cmFpbnQoCisJCQkJbUF2bWNvZGVDb21waWxlci5jb21waWxlUm91dGluZSgKKwkJCQkJCXRoaXMsIGFDb250YWluZXIsIHRoZVR5cGVTcGVjaWZpZXIsCisJCQkJCQlhRGF0YVR5cGUtPmdldENvbnN0cmFpbnRSb3V0aW5lKCkgKSApOworCX0KKworCXJldHVybiggYmZUUyApOworfQorCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvY29tcGlsZXIvQmFzZUNvbXBpbGVyLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL2NvbXBpbGVyL0Jhc2VDb21waWxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZDFjMzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL2NvbXBpbGVyL0Jhc2VDb21waWxlci5oCkBAIC0wLDAgKzEsMjQ1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIEJVSUxERVJfQ09NUElMRVJfQkFTRUNPTVBJTEVSX0hfCisjZGVmaW5lIEJVSUxERVJfQ09NUElMRVJfQkFTRUNPTVBJTEVSX0hfCisKKyNpbmNsdWRlIDxjb21tb24vQXZtT2JqZWN0Lmg+CisKKyNpbmNsdWRlIDxidWlsZGVyL2NvbXBpbGVyL0Jhc2VDb21waWxlclRhYmxlLmg+CisKKyNpbmNsdWRlIDxidWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlQ29tcGlsZXIuaD4KKworI2luY2x1ZGUgPGZtbC90eXBlL1R5cGVTcGVjaWZpZXIuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKK2NsYXNzIEF2bWNvZGVDb21waWxlcjsKK2NsYXNzIEF2bVByb2dyYW07CisKK2NsYXNzIEJhc2VDb21waWxlclRhYmxlOworY2xhc3MgQkY7CisKK2NsYXNzIENvbmZpZ3VyYXRpb247CisKK2NsYXNzIERhdGFUeXBlOworCitjbGFzcyBFeGVjdXRhYmxlU3lzdGVtOworCitjbGFzcyBTeW1ib2xUYWJsZTsKKworCitjbGFzcyBCYXNlQ29tcGlsZXIgIDogIHB1YmxpYyBBdm1PYmplY3QKK3sKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURQorCSAqLworCUNvbmZpZ3VyYXRpb24gJiBtQ29uZmlndXJhdGlvbjsKKworcHVibGljOgorCS8qKgorCSAqIEFUVFJJQlVURQorCSAqLworCUF2bWNvZGVDb21waWxlciAmIG1Bdm1jb2RlQ29tcGlsZXI7CisKKwlCYXNlQ29tcGlsZXJUYWJsZSAmIG1Db21waWxlclRhYmxlOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlCYXNlQ29tcGlsZXIoQ29uZmlndXJhdGlvbiAmIGFDb25maWd1cmF0aW9uLAorCQkJQXZtY29kZUNvbXBpbGVyICYgYW5Bdm1jb2RlQ29tcGlsZXIpCisJOiBBdm1PYmplY3QoICksCisJbUNvbmZpZ3VyYXRpb24oIGFDb25maWd1cmF0aW9uICksCisJbUF2bWNvZGVDb21waWxlciggYW5Bdm1jb2RlQ29tcGlsZXIgKSwKKwltQ29tcGlsZXJUYWJsZSggYW5Bdm1jb2RlQ29tcGlsZXIubUNvbXBpbGVyVGFibGUgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBPdGhlcgorCSAqLworCUJhc2VDb21waWxlcihCYXNlQ29tcGlsZXIgJiBhQmFzZUNvbXBpbGVyKQorCTogQXZtT2JqZWN0KCApLAorCW1Db25maWd1cmF0aW9uKCBhQmFzZUNvbXBpbGVyLm1Db25maWd1cmF0aW9uICksCisJbUF2bWNvZGVDb21waWxlciggYUJhc2VDb21waWxlci5tQXZtY29kZUNvbXBpbGVyICksCisJbUNvbXBpbGVyVGFibGUoIGFCYXNlQ29tcGlsZXIubUNvbXBpbGVyVGFibGUgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+QmFzZUNvbXBpbGVyKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoKKwkgKiBHRVRURVIKKwkgKiBtQ29uZmlndXJhdGlvbgorCSAqLworCWlubGluZSBDb25maWd1cmF0aW9uICYgZ2V0Q29uZmlndXJhdGlvbigpCisJeworCQlyZXR1cm4oIG1Db25maWd1cmF0aW9uICk7CisJfQorCisKKwkvKgorCSAqIEdFVFRFUgorCSAqIHRoZVN5bWJvbFRhYmxlCisJICovCisJaW5saW5lIFN5bWJvbFRhYmxlICYgZ2V0U3ltYm9sVGFibGUoKQorCXsKKwkJcmV0dXJuKCBtQ29tcGlsZXJUYWJsZS5nZXRTeW1ib2xUYWJsZSgpICk7CisJfQorCisJLyoKKwkgKiBHRVRURVIKKwkgKiB0aGVFcnJvckNvdW50CisJICovCisJaW5saW5lIGF2bV9zaXplX3QgZ2V0RXJyb3JDb3VudCgpCisJeworCQlyZXR1cm4oIG1Db21waWxlclRhYmxlLmdldEVycm9yQ291bnQoKSApOworCX0KKworCWlubGluZSBib29sIGhhc0Vycm9yKCkgY29uc3QKKwl7CisJCXJldHVybiggbUNvbXBpbGVyVGFibGUuaGFzRXJyb3IoKSApOworCX0KKworCWlubGluZSBib29sIGhhc1plcm9FcnJvcigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Db21waWxlclRhYmxlLmhhc1plcm9FcnJvcigpICk7CisJfQorCisJaW5saW5lIGF2bV9zaXplX3QgaW5jckVycm9yQ291bnQoKQorCXsKKwkJcmV0dXJuKCBtQ29tcGlsZXJUYWJsZS5pbmNyRXJyb3JDb3VudCgpICk7CisJfQorCisKKwkvKgorCSAqIEdFVFRFUgorCSAqIHRoZVdhcm5pbmdDb3VudAorCSAqLworCWlubGluZSBhdm1fc2l6ZV90IGdldFdhcm5pbmdDb3VudCgpCisJeworCQlyZXR1cm4oIG1Db21waWxlclRhYmxlLmdldFdhcm5pbmdDb3VudCgpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzV2FybmluZygpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Db21waWxlclRhYmxlLmhhc1dhcm5pbmcoKSApOworCX0KKworCWlubGluZSBib29sIGhhc1plcm9XYXJuaW5nKCkgY29uc3QKKwl7CisJCXJldHVybiggbUNvbXBpbGVyVGFibGUuaGFzWmVyb1dhcm5pbmcoKSApOworCX0KKworCWlubGluZSBhdm1fc2l6ZV90IGluY3JXYXJuaW5nQ291bnQoKQorCXsKKwkJcmV0dXJuKCBtQ29tcGlsZXJUYWJsZS5pbmNyV2FybmluZ0NvdW50KCkgKTsKKwl9CisKKworCS8qKgorCSAqIFJFUE9SVAorCSAqLworCXZvaWQgcmVwb3J0Q29tcGlsYXRpb24oT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQltQ29tcGlsZXJUYWJsZS5yZXBvcnRDb21waWxhdGlvbihvcyk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBoYXNFcnJvcldhcm5pbmcoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQ29tcGlsZXJUYWJsZS5oYXNFcnJvcigpIHx8IG1Db21waWxlclRhYmxlLmhhc1dhcm5pbmcoKSApOworCX0KKworCWlubGluZSB2b2lkIHJlc2V0RXJyb3JXYXJuaW5nKCkKKwl7CisJCW1Db21waWxlclRhYmxlLnJlc2V0RXJyb3JXYXJuaW5nKCk7CisJfQorCisKKwkvKioKKwkgKiBNRVRIT0RTCisJICogc3RhcnQKKwkgKi8KKwl2aXJ0dWFsIGJvb2wgc3RhcnQoKQorCXsKKwkJLy8hISBOT1RISU5HCisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFRZUEUgU1BFQ0lGSUVSICBbIFBSRSBdIENPTVBJTEFUSU9OCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXZvaWQgcHJlY29tcGlsZVR5cGVTcGVjaWZpZXIoCisJCQlBdm1Qcm9ncmFtICogYUNvbnRhaW5lciwgY29uc3QgQkYgJiBhRGF0YVR5cGUpOworCisKKwlUeXBlU3BlY2lmaWVyIGNvbXBpbGVUeXBlU3BlY2lmaWVyKAorCQkJQXZtUHJvZ3JhbSAqIGFDb250YWluZXIsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYVR5cGVJRCk7CisKKwlUeXBlU3BlY2lmaWVyIGNvbXBpbGVUeXBlU3BlY2lmaWVyKAorCQkJQXZtUHJvZ3JhbSAqIGFDb250YWluZXIsIGNvbnN0IEJGICYgYmZUeXBlKTsKKworCVR5cGVTcGVjaWZpZXIgY29tcGlsZVN0cnVjdHVyZVNwZWNpZmllcigKKwkJCUF2bVByb2dyYW0gKiBhQ29udGFpbmVyLCBEYXRhVHlwZSAqIGFTdHJ1Y3R1cmVUKTsKKworCVR5cGVTcGVjaWZpZXIgY29tcGlsZUNob2ljZVNwZWNpZmllcigKKwkJCUF2bVByb2dyYW0gKiBhQ29udGFpbmVyLCBEYXRhVHlwZSAqIGFDaG9pY2VUKTsKKworCVR5cGVTcGVjaWZpZXIgY29tcGlsZVVuaW9uU3BlY2lmaWVyKAorCQkJQXZtUHJvZ3JhbSAqIGFDb250YWluZXIsIERhdGFUeXBlICogYW5VbmlvblQpOworCisJVHlwZVNwZWNpZmllciBjb21waWxlQ29udGFpbmVyU3BlY2lmaWVyKAorCQkJQXZtUHJvZ3JhbSAqIGFDb250YWluZXIsIERhdGFUeXBlICogYUNvbGxlY3Rpb25UKTsKKworCVR5cGVTcGVjaWZpZXIgY29tcGlsZUludGVydmFsU3BlY2lmaWVyKAorCQkJQXZtUHJvZ3JhbSAqIGFDb250YWluZXIsIERhdGFUeXBlICogYW5JbnRlcnZhbFQpOworCisJVHlwZVNwZWNpZmllciBjb21waWxlRW51bWVyYXRpb25TcGVjaWZpZXIoCisJCQlBdm1Qcm9ncmFtICogYUNvbnRhaW5lciwgRGF0YVR5cGUgKiBhbkVudW1UKTsKKworCVR5cGVTcGVjaWZpZXIgY29tcGlsZVR5cGVBbGlhc1NwZWNpZmllcigKKwkJCUF2bVByb2dyYW0gKiBhQ29udGFpbmVyLCBEYXRhVHlwZSAqIGFEYXRhVHlwZSk7CisKKworCisKK307CisKKworfQorCisjZW5kaWYgLyogQlVJTERFUl9DT01QSUxFUl9CQVNFQ09NUElMRVJfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvY29tcGlsZXIvQmFzZUNvbXBpbGVyVGFibGUuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvY29tcGlsZXIvQmFzZUNvbXBpbGVyVGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTY1ZDRjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9jb21waWxlci9CYXNlQ29tcGlsZXJUYWJsZS5oCkBAIC0wLDAgKzEsMjYxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTggc2VwdC4gMjAwOAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEJVSUxERVJfQ09NUElMRVJfQkFTRUNPTVBJTEVSVEFCTEVfSF8KKyNkZWZpbmUgQlVJTERFUl9DT01QSUxFUl9CQVNFQ09NUElMRVJUQUJMRV9IXworCisjaW5jbHVkZSA8Y29tbW9uL0F2bVBvaW50ZXIuaD4KKyNpbmNsdWRlIDxjb21tb24vQXZtT2JqZWN0Lmg+CisKKyNpbmNsdWRlIDxidWlsZGVyL2NvbXBpbGVyL1N5bWJvbFRhYmxlLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIEJhc2VDb21waWxlclRhYmxlIDogcHVibGljIEF2bU9iamVjdAoreworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIEJhc2VDb21waWxlclRhYmxlICkKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURQorCSAqLworCVN5bWJvbFRhYmxlIG1TeW1ib2xUYWJsZTsKKworCWF2bV9zaXplX3QgbUVycm9yQ291bnQ7CisKKwlhdm1fc2l6ZV90IG1XYXJuaW5nQ291bnQ7CisKKwlTdHJpbmdPdXRTdHJlYW0gRVJST1JfT1M7CisKKwlTdHJpbmdPdXRTdHJlYW0gV0FSTklOR19PUzsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQmFzZUNvbXBpbGVyVGFibGUoQ29uZmlndXJhdGlvbiAmIGFDb25maWd1cmF0aW9uKQorCTogQXZtT2JqZWN0KCApLAorCW1TeW1ib2xUYWJsZSggYUNvbmZpZ3VyYXRpb24gKSwKKwltRXJyb3JDb3VudCggMCApLAorCW1XYXJuaW5nQ291bnQoIDAgKSwKKwlFUlJPUl9PUyggKSwKKwlXQVJOSU5HX09TKCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCUJhc2VDb21waWxlclRhYmxlKGNvbnN0IEJhc2VDb21waWxlclRhYmxlICYgYUNvbXBpbGVyVGFibGUpCisJOiBBdm1PYmplY3QoIGFDb21waWxlclRhYmxlICksCisJbVN5bWJvbFRhYmxlKCBhQ29tcGlsZXJUYWJsZS5tU3ltYm9sVGFibGUgKSwKKwltRXJyb3JDb3VudCggYUNvbXBpbGVyVGFibGUubUVycm9yQ291bnQgKSwKKwltV2FybmluZ0NvdW50KCBhQ29tcGlsZXJUYWJsZS5tV2FybmluZ0NvdW50ICksCisJRVJST1JfT1MoKSwKKwlXQVJOSU5HX09TKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkJhc2VDb21waWxlclRhYmxlKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoKKwkgKiBHRVRURVIKKwkgKiBtU3ltYm9sVGFibGUKKwkgKi8KKwlpbmxpbmUgU3ltYm9sVGFibGUgJiBnZXRTeW1ib2xUYWJsZSgpCisJeworCQlyZXR1cm4oIG1TeW1ib2xUYWJsZSApOworCX0KKworCisJLyoKKwkgKiBHRVRURVIKKwkgKiBtRXJyb3JDb3VudAorCSAqLworCWlubGluZSBhdm1fc2l6ZV90IGdldEVycm9yQ291bnQoKQorCXsKKwkJcmV0dXJuKCBtRXJyb3JDb3VudCApOworCX0KKworCWlubGluZSBib29sIGhhc0Vycm9yKCkgY29uc3QKKwl7CisJCXJldHVybiggbUVycm9yQ291bnQgPiAwICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzWmVyb0Vycm9yKCkgY29uc3QKKwl7CisJCXJldHVybiggbUVycm9yQ291bnQgPT0gMCApOworCX0KKworCWlubGluZSBhdm1fc2l6ZV90IGluY3JFcnJvckNvdW50KCkKKwl7CisJCXJldHVybiggKyttRXJyb3JDb3VudCApOworCX0KKworCWlubGluZSB2b2lkIHJlc2V0RXJyb3JDb3VudCgpCisJeworCQltRXJyb3JDb3VudCA9IDA7CisJfQorCisKKwkvKgorCSAqIEdFVFRFUgorCSAqIG1XYXJuaW5nQ291bnQKKwkgKi8KKwlpbmxpbmUgYXZtX3NpemVfdCBnZXRXYXJuaW5nQ291bnQoKQorCXsKKwkJcmV0dXJuKCBtV2FybmluZ0NvdW50ICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzV2FybmluZygpIGNvbnN0CisJeworCQlyZXR1cm4oIG1XYXJuaW5nQ291bnQgPiAwICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzWmVyb1dhcm5pbmcoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtV2FybmluZ0NvdW50ID09IDAgKTsKKwl9CisKKwlpbmxpbmUgYXZtX3NpemVfdCBpbmNyV2FybmluZ0NvdW50KCkKKwl7CisJCXJldHVybiggKyttV2FybmluZ0NvdW50ICk7CisJfQorCisJaW5saW5lIHZvaWQgcmVzZXRXYXJuaW5nQ291bnQoKQorCXsKKwkJbVdhcm5pbmdDb3VudCA9IDA7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBFUlJPUl9PUworCSAqLworCWlubGluZSBzdGQ6OnN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKQorCXsKKwkJcmV0dXJuKCBFUlJPUl9PUy5zdHIoKSApOworCX0KKworCWlubGluZSBib29sIGhhc0Vycm9yTWVzc2FnZSgpIGNvbnN0CisJeworCQlyZXR1cm4oICEgKEVSUk9SX09TLnN0cigpLmVtcHR5KCkpICk7CisJfQorCisKKwlpbmxpbmUgdm9pZCBhZGRFcnJvck1lc3NhZ2UoY29uc3Qgc3RkOjpzdHJpbmcgJiBhbkVycm9yTWVzc2FnZSkKKwl7CisJCWlmKCBoYXNFcnJvck1lc3NhZ2UoKSApCisJCXsKKwkJCUVSUk9SX09TIDw8ICJcbiI7CisJCX0KKwkJRVJST1JfT1MgPDwgYW5FcnJvck1lc3NhZ2U7CisJfQorCisKKwlpbmxpbmUgdm9pZCByZXNldEVycm9yKCkKKwl7CisJCUVSUk9SX09TLnN0cigiIik7CisJfQorCisJaW5saW5lIHZvaWQgc2V0RXJyb3JNZXNzYWdlKGNvbnN0IHN0ZDo6c3RyaW5nICYgYW5FcnJvck1lc3NhZ2UpCisJeworCQlyZXNldEVycm9yKCk7CisJCUVSUk9SX09TIDw8IGFuRXJyb3JNZXNzYWdlOworCX0KKworCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBXQVJOSU5HX09TCisJICovCisJaW5saW5lIHN0ZDo6c3RyaW5nIGdldFdhcm5pbmdNZXNzYWdlKCkKKwl7CisJCXJldHVybiggV0FSTklOR19PUy5zdHIoKSApOworCX0KKworCWlubGluZSBib29sIGhhc1dhcm5pbmdNZXNzYWdlKCkgY29uc3QKKwl7CisJCXJldHVybiggISAoV0FSTklOR19PUy5zdHIoKS5lbXB0eSgpKSApOworCX0KKworCisJaW5saW5lIHZvaWQgYWRkV2FybmluZ01lc3NhZ2UoY29uc3Qgc3RkOjpzdHJpbmcgJiBhbldhcm5pbmdNZXNzYWdlKQorCXsKKwkJaWYoIGhhc1dhcm5pbmdNZXNzYWdlKCkgKQorCQl7CisJCQlXQVJOSU5HX09TIDw8ICJcbiI7CisJCX0KKwkJV0FSTklOR19PUyA8PCBhbldhcm5pbmdNZXNzYWdlOworCX0KKworCisJaW5saW5lIHZvaWQgcmVzZXRXYXJuaW5nKCkKKwl7CisJCVdBUk5JTkdfT1Muc3RyKCIiKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRXYXJuaW5nTWVzc2FnZShjb25zdCBzdGQ6OnN0cmluZyAmIGFuV2FybmluZ01lc3NhZ2UpCisJeworCQlyZXNldFdhcm5pbmcoKTsKKwkJV0FSTklOR19PUyA8PCBhbldhcm5pbmdNZXNzYWdlOworCX0KKworCisJLyoqCisJICogUkVQT1JUCisJICovCisJdm9pZCByZXBvcnRDb21waWxhdGlvbihPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCW9zIDw8IF9TRVdfIDw8ICJDb21waWxhdGlvbiByZXBvcnQ6PiAiIDw8IG1FcnJvckNvdW50CisJCQk8PCAiIGVycm9yIiA8PCAoKG1FcnJvckNvdW50ID4gMSk/ICJzICIgOiAiICIpCisJCQk8PCBtV2FybmluZ0NvdW50IDw8ICIgd2FybmluZyIKKwkJCTw8ICgobVdhcm5pbmdDb3VudCA+IDEpPyAicyIgOiAiIikgPDwgRU9MX0ZMVVNIOworCX0KKworCWlubGluZSB2b2lkIHJlc2V0RXJyb3JXYXJuaW5nKCkKKwl7CisJCXJlc2V0RXJyb3IoKTsKKwkJcmVzZXRFcnJvckNvdW50KCk7CisKKwkJcmVzZXRXYXJuaW5nQ291bnQoKTsKKwkJcmVzZXRXYXJuaW5nKCk7CisJfQorCit9OworCisKK30KKworI2VuZGlmIC8qIEJVSUxERVJfQ09NUElMRVJfQkFTRUNPTVBJTEVSVEFCTEVfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvY29tcGlsZXIvQmFzZU1hY2hpbmVDb21waWxlci5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL2NvbXBpbGVyL0Jhc2VNYWNoaW5lQ29tcGlsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMWQwMGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL2NvbXBpbGVyL0Jhc2VNYWNoaW5lQ29tcGlsZXIuY3BwCkBAIC0wLDAgKzEsNzY1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjIgbm92LiAyMDEyCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJCYXNlTWFjaGluZUNvbXBpbGVyLmgiCisKKyNpbmNsdWRlIDxidWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlQ29tcGlsZXIuaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0F2bUNvZGUuaD4KKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0F2bVByb2dyYW0uaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9CYXNlSW5zdGFuY2VGb3JtLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZUxpYi5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVGb3JtLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZVN5c3RlbS5oPgorCisjaW5jbHVkZSA8c2V3L0NvbmZpZ3VyYXRpb24uaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUE9TVC1DT01QSUxBVElPTiBPRiBFWEVDVVRBQkxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK3ZvaWQgQmFzZU1hY2hpbmVDb21waWxlcjo6cG9zdGNvbXBpbGVFeGVjdXRhYmxlU3lzdGVtKCkKK3sKKwlUYWJsZU9mRXhlY3V0YWJsZUZvcm06OmNvbnN0X3Jhd19pdGVyYXRvciBpdEV4ZWMgPQorCQkJZ2V0Q29uZmlndXJhdGlvbigpLmdldEV4ZWN1dGFibGVTeXN0ZW0oKS5nZXRFeGVjdXRhYmxlcygpLmJlZ2luKCk7CisJVGFibGVPZkV4ZWN1dGFibGVGb3JtOjpjb25zdF9yYXdfaXRlcmF0b3IgZW5kRXhlYyA9CisJCQlnZXRDb25maWd1cmF0aW9uKCkuZ2V0RXhlY3V0YWJsZVN5c3RlbSgpLmdldEV4ZWN1dGFibGVzKCkuZW5kKCk7CisJZm9yKCA7IGl0RXhlYyAhPSBlbmRFeGVjIDsgKytpdEV4ZWMgKQorCXsKKwkJb3B0aW1pemVFeGVjdXRhYmxlKCBpdEV4ZWMgKTsKKwl9CisKKwkvLyBPcHRpbWl6ZSB0aGUgc3lzdGVtIEluc3RhbmNlCisJSW5zdGFuY2VPZk1hY2hpbmUgKiB0aGVTeXN0ZW1JbnN0YW5jZSA9IGdldENvbmZpZ3VyYXRpb24oKS4KKwkJCWdldEV4ZWN1dGFibGVTeXN0ZW0oKS5nZXRTeXN0ZW1JbnN0YW5jZSgpLnJhd01hY2hpbmUoKTsKKwlvcHRpbWl6ZUluc3RhbmNlKCB0aGVTeXN0ZW1JbnN0YW5jZS0+Z2V0RXhlY3V0YWJsZSgpLCB0aGVTeXN0ZW1JbnN0YW5jZSApOworfQorCisKK3ZvaWQgQmFzZU1hY2hpbmVDb21waWxlcjo6b3B0aW1pemVFeGVjdXRhYmxlKEV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlRm9ybSkKK3sKKwlpZiggYW5FeGVjdXRhYmxlRm9ybS0+aXNPcHRpbWl6ZWRGbGFnKCkgKQorCXsKKwkJcmV0dXJuOworCX0KKworQVZNX0lGX0RFQlVHX0ZMQUcoIENPTVBJTElORyApCisJQVZNX09TX1RSQUNFIDw8IElOQ1JfSU5ERU5UX1RBQgorCQkJPDwgIjwgYmVnaW4gcG9zdGNvbXBpbGluZyBleGVjdXRhYmxlIHJvdXRpbmU6PiAiCisJCQk8PCBhbkV4ZWN1dGFibGVGb3JtLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBDT01QSUxJTkcgKQorCisJLy8gT3B0aW1pemUgYWxsIHJvdXRpbmVzIHdoaWNoIGRlZmluZWQgdGhlIGV4ZWN1dGFibGUncyBiZWhhdmlvcgorCW9wdGltaXplQWxsQmVoYXZpb3JhbFJvdXRpbmVzKCBhbkV4ZWN1dGFibGVGb3JtICk7CisKKwkvLyBPcHRpbWl6ZSBhbGwgaW5zdGFuY2Ugb2YgbWFjaGluZSBwYXJhbWV0ZXJzCisJb3B0aW1pemVJbnN0YW5jZSggYW5FeGVjdXRhYmxlRm9ybSApOworCitBVk1fSUZfREVCVUdfRkxBRyggQ09NUElMSU5HICkKKwlBVk1fT1NfVFJBQ0UgPDwgVEFCX0RFQ1JfSU5ERU5UCisJPDwgIj4gZW5kIHBvc3Rjb21waWxpbmcgZXhlY3V0YWJsZSByb3V0aW5lOj4gIgorCQkJPDwgYW5FeGVjdXRhYmxlRm9ybS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggQ09NUElMSU5HICkKKworCWFuRXhlY3V0YWJsZUZvcm0tPnNldE9wdGltaXplZEZsYWcoKTsKK30KKworCisKK3ZvaWQgQmFzZU1hY2hpbmVDb21waWxlcjo6b3B0aW1pemVBbGxCZWhhdmlvcmFsUm91dGluZXMoCisJCUV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlRm9ybSkKK3sKKy8vCUFWTV9PU19UUkFDRSA8PCBUQUIgPDwgIjx8IG9wdGltaXppbmc8bWFjaGluZT46ICIKKy8vCQkJPDwgYW5FeGVjdXRhYmxlRm9ybS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCBzdGQ6OmVuZGw7CisKKworCS8qCisJICogb25SZWFkIC8gb25Xcml0ZSByb3V0aW5lcyBvZiBkYXRhCisJICovCisJbUF2bWNvZGVDb21waWxlci5vcHRpbWl6ZURhdGFSb3V0aW5lKCBhbkV4ZWN1dGFibGVGb3JtICk7CisKKworCS8qCisJICogb25DcmVhdGUKKwkgKi8KKwlpZiggYW5FeGVjdXRhYmxlRm9ybS0+aGFzT25DcmVhdGUoKSApCisJeworCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPbkNyZWF0ZSgKKwkJCQltQXZtY29kZUNvbXBpbGVyLm9wdGltaXplU3RhdGVtZW50KAorCQkJCQkJYW5FeGVjdXRhYmxlRm9ybSwKKwkJCQkJCWFuRXhlY3V0YWJsZUZvcm0tPmdldE9uQ3JlYXRlKCkpICk7CisJfQorCisJLyoKKwkgKiBvbkluaXQKKwkgKi8KKwlpZiggYW5FeGVjdXRhYmxlRm9ybS0+aGFzT25Jbml0KCkgKQorCXsKKwkJYW5FeGVjdXRhYmxlRm9ybS0+c2V0T25Jbml0KAorCQkJCW1Bdm1jb2RlQ29tcGlsZXIub3B0aW1pemVTdGF0ZW1lbnQoCisJCQkJCQlhbkV4ZWN1dGFibGVGb3JtLAorCQkJCQkJYW5FeGVjdXRhYmxlRm9ybS0+Z2V0T25Jbml0KCkpICk7CisJfQorCisJLyoKKwkgKiBvbkV4aXQKKwkgKi8KKwlpZiggYW5FeGVjdXRhYmxlRm9ybS0+aGFzT25GaW5hbCgpICkKKwl7CisJCWFuRXhlY3V0YWJsZUZvcm0tPnNldE9uRmluYWwoCisJCQkJbUF2bWNvZGVDb21waWxlci5vcHRpbWl6ZVN0YXRlbWVudCgKKwkJCQkJCWFuRXhlY3V0YWJsZUZvcm0sCisJCQkJCQlhbkV4ZWN1dGFibGVGb3JtLT5nZXRPbkZpbmFsKCkpICk7CisJfQorCisKKwkvKgorCSAqIG9uU3RhcnQKKwkgKi8KKwlpZiggYW5FeGVjdXRhYmxlRm9ybS0+aGFzT25TdGFydCgpICkKKwl7CisJCWFuRXhlY3V0YWJsZUZvcm0tPnNldE9uU3RhcnQoCisJCQkJbUF2bWNvZGVDb21waWxlci5vcHRpbWl6ZVN0YXRlbWVudCgKKwkJCQkJCWFuRXhlY3V0YWJsZUZvcm0sCisJCQkJCQlhbkV4ZWN1dGFibGVGb3JtLT5nZXRPblN0YXJ0KCkpICk7CisJfQorCisJLyoKKwkgKiBvblN0b3AKKwkgKi8KKwlpZiggYW5FeGVjdXRhYmxlRm9ybS0+aGFzT25TdG9wKCkgKQorCXsKKwkJYW5FeGVjdXRhYmxlRm9ybS0+c2V0T25TdG9wKAorCQkJCW1Bdm1jb2RlQ29tcGlsZXIub3B0aW1pemVTdGF0ZW1lbnQoCisJCQkJCQlhbkV4ZWN1dGFibGVGb3JtLAorCQkJCQkJYW5FeGVjdXRhYmxlRm9ybS0+Z2V0T25TdG9wKCkpICk7CisJfQorCisKKwkvKgorCSAqIG9uSUVuYWJsZQorCSAqLworCWlmKCBhbkV4ZWN1dGFibGVGb3JtLT5oYXNPbklFbmFibGUoKSApCisJeworCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPbklFbmFibGUoCisJCQkJbUF2bWNvZGVDb21waWxlci5vcHRpbWl6ZVN0YXRlbWVudCgKKwkJCQkJCWFuRXhlY3V0YWJsZUZvcm0sCisJCQkJCQlhbkV4ZWN1dGFibGVGb3JtLT5nZXRPbklFbmFibGUoKSkgKTsKKwl9CisKKwkvKgorCSAqIG9uRW5hYmxlCisJICovCisJaWYoIGFuRXhlY3V0YWJsZUZvcm0tPmhhc09uRW5hYmxlKCkgKQorCXsKKwkJYW5FeGVjdXRhYmxlRm9ybS0+c2V0T25FbmFibGUoCisJCQkJbUF2bWNvZGVDb21waWxlci5vcHRpbWl6ZVN0YXRlbWVudCgKKwkJCQkJCWFuRXhlY3V0YWJsZUZvcm0sCisJCQkJCQlhbkV4ZWN1dGFibGVGb3JtLT5nZXRPbkVuYWJsZSgpKSApOworCX0KKworCisJLyoKKwkgKiBvbklEaXNhYmxlCisJICovCisJaWYoIGFuRXhlY3V0YWJsZUZvcm0tPmhhc09uSURpc2FibGUoKSApCisJeworCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPbklEaXNhYmxlKAorCQkJCW1Bdm1jb2RlQ29tcGlsZXIub3B0aW1pemVTdGF0ZW1lbnQoCisJCQkJCQlhbkV4ZWN1dGFibGVGb3JtLAorCQkJCQkJYW5FeGVjdXRhYmxlRm9ybS0+Z2V0T25JRGlzYWJsZSgpKSApOworCX0KKworCS8qCisJICogb25EaXNhYmxlCisJICovCisJaWYoIGFuRXhlY3V0YWJsZUZvcm0tPmhhc09uRGlzYWJsZSgpICkKKwl7CisJCWFuRXhlY3V0YWJsZUZvcm0tPnNldE9uRGlzYWJsZSgKKwkJCQltQXZtY29kZUNvbXBpbGVyLm9wdGltaXplU3RhdGVtZW50KAorCQkJCQkJYW5FeGVjdXRhYmxlRm9ybSwKKwkJCQkJCWFuRXhlY3V0YWJsZUZvcm0tPmdldE9uRGlzYWJsZSgpKSApOworCX0KKworCisJLyoKKwkgKiBvbklBYm9ydAorCSAqLworCWlmKCBhbkV4ZWN1dGFibGVGb3JtLT5oYXNPbklBYm9ydCgpICkKKwl7CisJCWFuRXhlY3V0YWJsZUZvcm0tPnNldE9uSUFib3J0KAorCQkJCW1Bdm1jb2RlQ29tcGlsZXIub3B0aW1pemVTdGF0ZW1lbnQoCisJCQkJCQlhbkV4ZWN1dGFibGVGb3JtLAorCQkJCQkJYW5FeGVjdXRhYmxlRm9ybS0+Z2V0T25JQWJvcnQoKSkgKTsKKwl9CisKKwkvKgorCSAqIG9uQWJvcnQKKwkgKi8KKwlpZiggYW5FeGVjdXRhYmxlRm9ybS0+aGFzT25BYm9ydCgpICkKKwl7CisJCWFuRXhlY3V0YWJsZUZvcm0tPnNldE9uQWJvcnQoCisJCQkJbUF2bWNvZGVDb21waWxlci5vcHRpbWl6ZVN0YXRlbWVudCgKKwkJCQkJCWFuRXhlY3V0YWJsZUZvcm0sCisJCQkJCQlhbkV4ZWN1dGFibGVGb3JtLT5nZXRPbkFib3J0KCkpICk7CisJfQorCisKKwkvKgorCSAqIG9uSVJ1bgorCSAqLworCWlmKCBhbkV4ZWN1dGFibGVGb3JtLT5oYXNPbklSdW4oKSApCisJeworCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPbklSdW4oCisJCQkJbUF2bWNvZGVDb21waWxlci5vcHRpbWl6ZVN0YXRlbWVudCgKKwkJCQkJCWFuRXhlY3V0YWJsZUZvcm0sCisJCQkJCQlhbkV4ZWN1dGFibGVGb3JtLT5nZXRPbklSdW4oKSkgKTsKKwl9CisKKwkvKgorCSAqIG9uUnVuCisJICovCisJaWYoIGFuRXhlY3V0YWJsZUZvcm0tPmhhc09uUnVuKCkgKQorCXsKKwkJYW5FeGVjdXRhYmxlRm9ybS0+c2V0T25SdW4oCisJCQkJbUF2bWNvZGVDb21waWxlci5vcHRpbWl6ZVN0YXRlbWVudCgKKwkJCQkJCWFuRXhlY3V0YWJsZUZvcm0sCisJCQkJCQlhbkV4ZWN1dGFibGVGb3JtLT5nZXRPblJ1bigpKSApOworCX0KKwllbHNlIGlmKCBhbkV4ZWN1dGFibGVGb3JtLT5oYXNPbklSdW4oKSApCisJeworCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPblJ1biggYW5FeGVjdXRhYmxlRm9ybS0+Z2V0T25JUnVuKCkgKTsKKwl9CisKKworCS8qCisJICogb25SdGMKKwkgKi8KKwlpZiggYW5FeGVjdXRhYmxlRm9ybS0+aGFzT25SdGMoKSApCisJeworCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPblJ0YygKKwkJCQltQXZtY29kZUNvbXBpbGVyLm9wdGltaXplU3RhdGVtZW50KAorCQkJCQkJYW5FeGVjdXRhYmxlRm9ybSwKKwkJCQkJCWFuRXhlY3V0YWJsZUZvcm0tPmdldE9uUnRjKCkpICk7CisJfQorCisKKwkvKgorCSAqIG9uQ29uY3VycmVuY3kKKwkgKi8KKwlpZiggYW5FeGVjdXRhYmxlRm9ybS0+aGFzT25Db25jdXJyZW5jeSgpICkKKwl7CisJCWlmKCBub3QgU3RhdGVtZW50VHlwZUNoZWNrZXI6OmlzRW1wdHlTY2hlZHVsZSgKKwkJCQlhbkV4ZWN1dGFibGVGb3JtLT5nZXRPbkNvbmN1cnJlbmN5KCkpICkKKwkJeworCQkJYW5FeGVjdXRhYmxlRm9ybS0+c2V0T25Db25jdXJyZW5jeSgKKwkJCQltQXZtY29kZUNvbXBpbGVyLm9wdGltaXplU3RhdGVtZW50KAorCQkJCQlhbkV4ZWN1dGFibGVGb3JtLAorCQkJCQlhbkV4ZWN1dGFibGVGb3JtLT5nZXRPbkNvbmN1cnJlbmN5KCkpICk7CisJCX0KKwl9CisKKwkvKgorCSAqIG9uU2NoZWR1bGUKKwkgKi8KKwlpZiggYW5FeGVjdXRhYmxlRm9ybS0+aGFzT25TY2hlZHVsZSgpICkKKwl7CisJCWFuRXhlY3V0YWJsZUZvcm0tPnNldE9uU2NoZWR1bGUoCisJCQkJb3B0aW1pemVTY2hlZHVsaW5nUm91dGluZSgKKwkJCQkJCWFuRXhlY3V0YWJsZUZvcm0sCisJCQkJCQlhbkV4ZWN1dGFibGVGb3JtLT5nZXRPblNjaGVkdWxlKCkgKSApOworCX0KKworCS8qCisJICogb25TeW5jaHJvbml6ZQorCSAqLworCWlmKCBhbkV4ZWN1dGFibGVGb3JtLT5oYXNPblN5bmNocm9uaXplKCkgKQorCXsKKwkJYW5FeGVjdXRhYmxlRm9ybS0+c2V0T25TeW5jaHJvbml6ZSgKKwkJCQltQXZtY29kZUNvbXBpbGVyLm9wdGltaXplU3RhdGVtZW50KAorCQkJCQkJYW5FeGVjdXRhYmxlRm9ybSwKKwkJCQkJCWFuRXhlY3V0YWJsZUZvcm0tPmdldE9uU3luY2hyb25pemUoKSkgKTsKKwl9CisKKworCS8qCisJICogYWxsIFRyYW5zaXRpb24KKwkgKi8KKwlBdm1UcmFuc2l0aW9uICogaXRUcmFuc2l0aW9uOworCWF2bV9zaXplX3QgZW5kT2Zmc2V0ID0gYW5FeGVjdXRhYmxlRm9ybS0+Z2V0VHJhbnNpdGlvbigpLnNpemUoKTsKKwlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMCA7IG9mZnNldCA8IGVuZE9mZnNldCA7ICsrb2Zmc2V0ICkKKwl7CisJCWl0VHJhbnNpdGlvbiA9IGFuRXhlY3V0YWJsZUZvcm0tPmdldFRyYW5zaXRpb24oKS5yYXdBdChvZmZzZXQpOworCitBVk1fSUZfREVCVUdfRkxBRyggQ09NUElMSU5HICkKKwlBVk1fT1NfVFJBQ0UgPDwgSU5DUl9JTkRFTlRfVEFCCisJCQk8PCAiPCBiZWdpbiBwb3N0Y29tcGlsaW5nIHRyYW5zaXRpb246PiAiCisJCQk8PCBpdFRyYW5zaXRpb24tPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIENPTVBJTElORyApCisKKwkJLy8gT3B0aW1pemUgYWxsIHByb2dyYW0gcm91dGluZQorCQltQXZtY29kZUNvbXBpbGVyLm9wdGltaXplUHJvZ3JhbVJvdXRpbmUoIGl0VHJhbnNpdGlvbiApOworCitBVk1fSUZfREVCVUdfRkxBRyggQ09NUElMSU5HICkKKwlBVk1fT1NfVFJBQ0UgPDwgVEFCX0RFQ1JfSU5ERU5UCisJCQk8PCAiPiBlbmQgcG9zdGNvbXBpbGluZyB0cmFuc2l0aW9uOj4gIgorCQkJPDwgaXRUcmFuc2l0aW9uLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBDT01QSUxJTkcgKQorCX0KKworCisJLyoKKwkgKiBhbGwgUHJvZ3JhbQorCSAqLworCUF2bVByb2dyYW0gKiBpdFByb2c7CisJZW5kT2Zmc2V0ID0gYW5FeGVjdXRhYmxlRm9ybS0+Z2V0UHJvZ3JhbSgpLnNpemUoKTsKKwlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMCA7IG9mZnNldCA8IGVuZE9mZnNldCA7ICsrb2Zmc2V0ICkKKwl7CisJCWl0UHJvZyA9IGFuRXhlY3V0YWJsZUZvcm0tPmdldFByb2dyYW0oKS5yYXdBdChvZmZzZXQpOworCitBVk1fSUZfREVCVUdfRkxBRyggQ09NUElMSU5HICkKKwlBVk1fT1NfVFJBQ0UgPDwgSU5DUl9JTkRFTlRfVEFCCisJCQk8PCAiPCBiZWdpbiBwb3N0Y29tcGlsaW5nIGF2bV9wcm9ncmFtOj4gIgorCQkJPDwgaXRQcm9nLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBDT01QSUxJTkcgKQorCisJCS8vIE9wdGltaXplIGFsbCBwcm9ncmFtIHJvdXRpbmUKKwkJbUF2bWNvZGVDb21waWxlci5vcHRpbWl6ZVByb2dyYW1Sb3V0aW5lKCBpdFByb2cgKTsKKworQVZNX0lGX0RFQlVHX0ZMQUcoIENPTVBJTElORyApCisJQVZNX09TX1RSQUNFIDw8IFRBQl9ERUNSX0lOREVOVAorCQkJPDwgIj4gZW5kIHBvc3Rjb21waWxpbmcgYXZtX3Byb2dyYW06PiAiCisJCQk8PCBpdFByb2ctPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIENPTVBJTElORyApCisJfQorCisvLwlBVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICI+fCBvcHRpbWl6aW5nPG1hY2hpbmU+OiAiCisvLwkJCTw8IGFuRXhlY3V0YWJsZUZvcm0tPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKK30KKworCisKK3ZvaWQgQmFzZU1hY2hpbmVDb21waWxlcjo6b3B0aW1pemVJbnN0YW5jZShFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZUZvcm0pCit7CisvL0FWTV9PU19UUkFDRSA8PCBUQUIgPDwgIjx8IG9wdGltaXppbmc8bWFjaGluZT46ICIKKy8vCQk8PCBhbkV4ZWN1dGFibGVGb3JtLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbDsKKworCS8qCisJICogYWxsIFByb2dyYW0KKwkgKi8KKwlpZiggYW5FeGVjdXRhYmxlRm9ybS0+aGFzSW5zdGFuY2VTdGF0aWMoKSApCisJeworCQlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBpdE1hY2hpbmUgPQorCQkJCWFuRXhlY3V0YWJsZUZvcm0tPmluc3RhbmNlX3N0YXRpY19iZWdpbigpOworCQlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBlbmRNYWNoaW5lID0KKwkJCQlhbkV4ZWN1dGFibGVGb3JtLT5pbnN0YW5jZV9zdGF0aWNfZW5kKCk7CisJCWZvciggOyBpdE1hY2hpbmUgIT0gZW5kTWFjaGluZSA7ICsraXRNYWNoaW5lICkKKwkJeworCQkJb3B0aW1pemVJbnN0YW5jZShhbkV4ZWN1dGFibGVGb3JtLCAoKml0TWFjaGluZSkucmF3TWFjaGluZSgpKTsKKwkJfQorCX0KKworCWlmKCBhbkV4ZWN1dGFibGVGb3JtLT5oYXNJbnN0YW5jZUR5bmFtaWMoKSApCisJeworCQlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBpdE1hY2hpbmUgPQorCQkJCWFuRXhlY3V0YWJsZUZvcm0tPmluc3RhbmNlX2R5bmFtaWNfYmVnaW4oKTsKKwkJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgZW5kTWFjaGluZSA9CisJCQkJYW5FeGVjdXRhYmxlRm9ybS0+aW5zdGFuY2VfZHluYW1pY19lbmQoKTsKKwkJZm9yKCA7IGl0TWFjaGluZSAhPSBlbmRNYWNoaW5lIDsgKytpdE1hY2hpbmUgKQorCQl7CisJCQlvcHRpbWl6ZUluc3RhbmNlKGFuRXhlY3V0YWJsZUZvcm0sICgqaXRNYWNoaW5lKS5yYXdNYWNoaW5lKCkpOworCQl9CisJfQorCisvL0FWTV9PU19UUkFDRSA8PCBUQUIgPDwgIj58IG9wdGltaXppbmc8bWFjaGluZT46ICIKKy8vCQk8PCBhbkV4ZWN1dGFibGVGb3JtLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7Cit9CisKKworCit2b2lkIEJhc2VNYWNoaW5lQ29tcGlsZXI6Om9wdGltaXplSW5zdGFuY2UoCisJCUV4ZWN1dGFibGVGb3JtICogdGhlRXhlY3V0YWJsZUNvbnRhaW5lciwgSW5zdGFuY2VPZk1hY2hpbmUgKiBhbkluc3RhbmNlKQoreworCUFWTV9JRl9ERUJVR19GTEFHKCBDT01QSUxJTkcgKQorCQlBVk1fT1NfVFJBQ0UgPDwgSU5DUl9JTkRFTlRfVEFCCisJCQkJPDwgIjwgYmVnaW4gcG9zdGNvbXBpbGluZyBpbnN0YW5jZSBvZiBtYWNoaW5lIHBhcmFtZXRlciA6PiAiCisJCQkJPDwgc3RyX2hlYWRlciggYW5JbnN0YW5jZSApIDw8IHN0ZDo6ZW5kbDsKKwlBVk1fRU5ESUZfREVCVUdfRkxBRyggQ09NUElMSU5HICkKKworCS8vIE9wdGltaXplIGFsbCBpbnN0YW5jZSByb3V0aW5lCisJbUF2bWNvZGVDb21waWxlci5vcHRpbWl6ZUluc3RhbmNlKCB0aGVFeGVjdXRhYmxlQ29udGFpbmVyLCBhbkluc3RhbmNlICk7CisKKwlBVk1fSUZfREVCVUdfRkxBRyggQ09NUElMSU5HICkKKwkJQVZNX09TX1RSQUNFIDw8IFRBQl9ERUNSX0lOREVOVAorCQkJCTw8ICI+IGVuZCBwb3N0Y29tcGlsaW5nIGluc3RhbmNlIG9mIG1hY2hpbmUgcGFyYW1ldGVyIDo+ICIKKwkJCQk8PCBzdHJfaGVhZGVyKCBhbkluc3RhbmNlICkgPDwgc3RkOjplbmRsOworCUFWTV9FTkRJRl9ERUJVR19GTEFHKCBDT01QSUxJTkcgKQorfQorCisKKy8qKgorICogQ09NUElMSU5HIEVYRUNVVEFCTEUgU0NIRURVTEVSCisgKiBTcGVjaWZpYyBiZWNhdXNlIG9mIGR5bmFtaWMgaW5zdGFudGlhdGlvbgorICovCitCRkNvZGUgQmFzZU1hY2hpbmVDb21waWxlcjo6Y29tcGlsZVNjaGVkdWxlclJvdXRpbmUoCisJCUV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlRm9ybSwKKwkJTGlzdE9mSW5zdGFuY2VPZk1hY2hpbmUgJiB1c2VkSW5zdGFuY2UsCisJCWNvbnN0IEJGQ29kZSAmIGFTY2hlZHVsZXJDb2RlKQoreworCWlmKCBhU2NoZWR1bGVyQ29kZS5pbnZhbGlkKCkgKQorCXsKKwkJQVZNX09TX0VYSVQoIEZBSUxFRCApCisJCQkJPDwgImNvbXBsZXRlU2NoZWR1bGVyUm91dGluZTo+IFVuZXhwZWN0ZWQgYSA8PCBudWxsPGNvZGU+ID4+ICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJcmV0dXJuKCBhU2NoZWR1bGVyQ29kZSApOworCX0KKwllbHNlIGlmKCBhU2NoZWR1bGVyQ29kZS0+ZW1wdHkoKSApCisJeworCQlyZXR1cm4oIGFTY2hlZHVsZXJDb2RlICk7CisJfQorCisJaWYoIGFTY2hlZHVsZXJDb2RlLT5zaW5nbGV0b24oKQorCQkmJiBhU2NoZWR1bGVyQ29kZS0+Zmlyc3QoKS5pczwgSW5zdGFuY2VPZk1hY2hpbmUgPigpCisJCSYmIE9wZXJhdG9yTWFuYWdlcjo6aXNBY3Rpdml0eSggYVNjaGVkdWxlckNvZGUtPmdldE9wZXJhdG9yKCkgKSApCisJeworCQlJbnN0YW5jZU9mTWFjaGluZSAqIGFuSW5zdGFuY2UgPQorCQkJCWFTY2hlZHVsZXJDb2RlLT5maXJzdCgpLnRvX3B0cjwgSW5zdGFuY2VPZk1hY2hpbmUgPigpOworCisJCWlmKCBhbkluc3RhbmNlLT5nZXRTcGVjaWZpZXIoKS5pc0Rlc2lnbkluc3RhbmNlU3RhdGljKCkgKQorCQl7CisJCQlyZXR1cm4oIGFTY2hlZHVsZXJDb2RlICk7CisJCX0KKworCQllbHNlIGlmKCBhbkV4ZWN1dGFibGVGb3JtLT5oYXNPbkNvbmN1cnJlbmN5KCkgKQorCQl7CisJCQlCRkNvZGUgY29tcGlsQ29kZSggYW5FeGVjdXRhYmxlRm9ybS0+Z2V0T25Db25jdXJyZW5jeU9wZXJhdG9yKCkgKTsKKworCQkJY29tcGlsZVNjaGVkdWxlclJvdXRpbmUoYW5FeGVjdXRhYmxlRm9ybSwKKwkJCQkJdXNlZEluc3RhbmNlLCBhU2NoZWR1bGVyQ29kZSwgY29tcGlsQ29kZSk7CisKKwkJCXJldHVybiggY29tcGlsQ29kZSApOworCQl9CisJCWVsc2UgaWYoIGFuSW5zdGFuY2UtPmdldFNwZWNpZmllcigpLmlzRGVzaWduUHJvdG90eXBlU3RhdGljKCkKKwkJCQkmJiBhbkluc3RhbmNlLT5pc0F1dG9TdGFydCgpICkKKwkJeworCQkJcmV0dXJuKCBhU2NoZWR1bGVyQ29kZSApOworCQl9CisJCWVsc2UKKwkJeworCQkJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgaXRNYWNoaW5lID0KKwkJCQkJYW5FeGVjdXRhYmxlRm9ybS0+aW5zdGFuY2Vfc3RhdGljX2JlZ2luKCk7CisJCQlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBlbmRNYWNoaW5lID0KKwkJCQkJYW5FeGVjdXRhYmxlRm9ybS0+aW5zdGFuY2Vfc3RhdGljX2VuZCgpOworCQkJZm9yKCA7IGl0TWFjaGluZSAhPSBlbmRNYWNoaW5lIDsgKytpdE1hY2hpbmUgKQorCQkJeworCQkJCWlmKCBhbkluc3RhbmNlLT5nZXRTcGVjaWZpZXIoKS5oYXNEZXNpZ25Nb2RlbCgpCisJCQkJCSYmIChhbkluc3RhbmNlICE9ICgqaXRNYWNoaW5lKS5yYXdNYWNoaW5lKCkpCisJCQkJCSYmICgqaXRNYWNoaW5lKS5pc0luc3RhbmNlTW9kZWwoIGFuSW5zdGFuY2UgKQorCQkJCQkmJiAobm90IHVzZWRJbnN0YW5jZS5jb250YWlucygoKml0TWFjaGluZSkucmF3TWFjaGluZSgpKSkgKQorCQkJCXsKKwkJCQkJdXNlZEluc3RhbmNlLmFwcGVuZCggKCppdE1hY2hpbmUpLnJhd01hY2hpbmUoKSApOworCisJCQkJCXJldHVybiggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQkJYVNjaGVkdWxlckNvZGUtPmdldE9wZXJhdG9yKCksICgqaXRNYWNoaW5lKSkgKTsKKwkJCQl9CisJCQl9CisKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCTw8ICJjb21wbGV0ZVNjaGVkdWxlclJvdXRpbmU6PiBGYWlsZWQgISEhXG4iCisJCQkJCTw8IGFTY2hlZHVsZXJDb2RlCisJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJcmV0dXJuKCBhU2NoZWR1bGVyQ29kZSApOworCQl9CisJfQorCisJZWxzZQorCXsKKwkJQkZDb2RlIGNvbXBpbENvZGUoIGFTY2hlZHVsZXJDb2RlLT5nZXRPcGVyYXRvcigpICk7CisKKwkJQXZtQ29kZTo6aXRlcmF0b3IgaXRBcmcgPSBhU2NoZWR1bGVyQ29kZS0+YmVnaW4oKTsKKwkJQXZtQ29kZTo6aXRlcmF0b3IgZW5kQXJnID0gYVNjaGVkdWxlckNvZGUtPmVuZCgpOworCQlmb3IoIDsgaXRBcmcgIT0gZW5kQXJnIDsgKytpdEFyZyApCisJCXsKKwkJCWlmKCAoKml0QXJnKS5pczwgQXZtQ29kZSA+KCkgKQorCQkJeworCQkJCWNvbXBpbGVTY2hlZHVsZXJSb3V0aW5lKGFuRXhlY3V0YWJsZUZvcm0sCisJCQkJCQl1c2VkSW5zdGFuY2UsICgqaXRBcmcpLmJmQ29kZSgpLCBjb21waWxDb2RlKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJPDwgImNvbXBsZXRlU2NoZWR1bGVyUm91dGluZTo+IFVuZXhwZWN0ZWQgYXJnIDo+XG4iCisJCQkJCQk8PCAoKml0QXJnKQorCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJY29tcGlsQ29kZS0+YXBwZW5kKCAqaXRBcmcgKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiggY29tcGlsQ29kZSApOworCX0KK30KKworCit2b2lkIEJhc2VNYWNoaW5lQ29tcGlsZXI6OmNvbXBpbGVTY2hlZHVsZXJSb3V0aW5lKAorCQlFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZUZvcm0sCisJCUxpc3RPZkluc3RhbmNlT2ZNYWNoaW5lICYgdXNlZEluc3RhbmNlLAorCQljb25zdCBCRkNvZGUgJiBhU2NoZWR1bGVyQ29kZSwgQkZDb2RlICYgY29tcGlsQ29kZSkKK3sKKwlpZiggYVNjaGVkdWxlckNvZGUtPnNpbmdsZXRvbigpICYmCisJCWFTY2hlZHVsZXJDb2RlLT5maXJzdCgpLmlzPCBJbnN0YW5jZU9mTWFjaGluZSA+KCkgJiYKKwkJT3BlcmF0b3JNYW5hZ2VyOjppc0FjdGl2aXR5KCBhU2NoZWR1bGVyQ29kZS0+Z2V0T3BlcmF0b3IoKSApICkKKwl7CisJCUluc3RhbmNlT2ZNYWNoaW5lICogYW5JbnN0YW5jZSA9CisJCQkJYVNjaGVkdWxlckNvZGUtPmZpcnN0KCkudG9fcHRyPCBJbnN0YW5jZU9mTWFjaGluZSA+KCk7CisKKwkJaWYoIGFuSW5zdGFuY2UtPmdldFNwZWNpZmllcigpLmlzRGVzaWduSW5zdGFuY2VTdGF0aWMoKSApCisJCXsKKwkJCWNvbXBpbENvZGUuYXBwZW5kKCBhU2NoZWR1bGVyQ29kZSApOworCQl9CisJCWVsc2UKKwkJeworCQkJQkZDb2RlIG1vZGVsU2NoZWR1bGVyOworCisJCQlpZiggYW5JbnN0YW5jZS0+Z2V0U3BlY2lmaWVyKCkuaXNEZXNpZ25Qcm90b3R5cGVTdGF0aWMoKSApCisJCQl7CisJCQkJaWYoIGFuSW5zdGFuY2UtPmlzQXV0b1N0YXJ0KCkgKQorCQkJCXsKKwkJCQkJQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKCBjb21waWxDb2RlLT5ub25lbXB0eSgpCisJCQkJCQl8fCAoYW5JbnN0YW5jZS0+Z2V0RXhlY3V0YWJsZSgpICE9IGFuRXhlY3V0YWJsZUZvcm0pICkKKwkJCQkJCQk8PCAiSW5maW5pdGUgcmVjdXJzaXZlIGxvb3AgZGV0ZWN0aW9uIHdpdGggIgorCQkJCQkJCQkiaW5zdGFuY2UgPDwgIiA8PCBzdHJfaGVhZGVyKCBhbkluc3RhbmNlICkKKwkJCQkJCQk8PCAiID4+IGluIHRoZSBzY2hlZHVsZSBjb2RlIG9mIHRoZSBleGVjdXRhYmxlIDw8ICIKKwkJCQkJCQk8PCBzdHJfaGVhZGVyKCBhbkV4ZWN1dGFibGVGb3JtICkgPDwgIiA+PiAhISEiCisJCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJCWNvbXBpbENvZGUuYXBwZW5kKCBhU2NoZWR1bGVyQ29kZSApOworCQkJCX0KKworCQkJCWlmKCBhbkluc3RhbmNlLT5oYXNJbnN0YW5jZU1vZGVsKCkgKQorCQkJCXsKKwkJCQkJYW5JbnN0YW5jZSA9IGFuSW5zdGFuY2UtPmdldEluc3RhbmNlTW9kZWwoKTsKKworCQkJCQltb2RlbFNjaGVkdWxlciA9IFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQkJYVNjaGVkdWxlckNvZGUtPmdldE9wZXJhdG9yKCksIElOQ1JfQkYoYW5JbnN0YW5jZSkgKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJQVZNX09TX0FTU0VSVF9XQVJOSU5HX0FMRVJUKAorCQkJCQkJCW5vdCBhbkluc3RhbmNlLT5nZXRTcGVjaWZpZXIoKS5pc0NvbXBvbmVudFN5c3RlbSgpICkKKwkJCQkJCQk8PCAiVW5leHBlY3RlZCB0aGUgc3lzdGVtIGluc3RhbmNlIDw8ICIKKwkJCQkJCQk8PCBzdHJfaGVhZGVyKCBhbkluc3RhbmNlICkKKwkJCQkJCQk8PCAiID4+IGluIHRoZSBzY2hlZHVsZSBjb2RlIG9mIHRoZSBleGVjdXRhYmxlIDw8ICIKKwkJCQkJCQk8PCBzdHJfaGVhZGVyKCBhbkV4ZWN1dGFibGVGb3JtICkgPDwgIiA+PiAhISEiCisJCQkJCQkJPDwgU0VORF9FWElUOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQltb2RlbFNjaGVkdWxlciA9IGFTY2hlZHVsZXJDb2RlOworCQkJfQorCisJCQlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBpdE1hY2hpbmUgPQorCQkJCQlhbkV4ZWN1dGFibGVGb3JtLT5pbnN0YW5jZV9zdGF0aWNfYmVnaW4oKTsKKwkJCVRhYmxlT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGVuZE1hY2hpbmUgPQorCQkJCQlhbkV4ZWN1dGFibGVGb3JtLT5pbnN0YW5jZV9zdGF0aWNfZW5kKCk7CisJCQlmb3IoIDsgaXRNYWNoaW5lICE9IGVuZE1hY2hpbmUgOyArK2l0TWFjaGluZSApCisJCQl7CisJCQkJaWYoIGFuSW5zdGFuY2UgPT0gKCppdE1hY2hpbmUpLmdldEluc3RhbmNlTW9kZWwoKSAmJgorCQkJCQkobm90IHVzZWRJbnN0YW5jZS5jb250YWlucygoKml0TWFjaGluZSkucmF3TWFjaGluZSgpKSkgKQorCQkJCXsKKwkJCQkJY29tcGlsQ29kZS0+YXBwZW5kKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQkJCQlhU2NoZWR1bGVyQ29kZS0+Z2V0T3BlcmF0b3IoKSwgKCppdE1hY2hpbmUpKSApOworCisJCQkJCXVzZWRJbnN0YW5jZS5hcHBlbmQoICgqaXRNYWNoaW5lKS5yYXdNYWNoaW5lKCkgKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmKCBtb2RlbFNjaGVkdWxlci52YWxpZCgpICkKKwkJCXsKKwkJCQljb21waWxDb2RlLmFwcGVuZCggbW9kZWxTY2hlZHVsZXIgKTsKKwkJCX0KKwkJfQorCX0KKwllbHNlCisJeworCQljb21waWxDb2RlLT5hcHBlbmQoIGNvbXBpbGVTY2hlZHVsZXJSb3V0aW5lKAorCQkJCWFuRXhlY3V0YWJsZUZvcm0sIHVzZWRJbnN0YW5jZSwgYVNjaGVkdWxlckNvZGUpICk7CisJfQorfQorCisKK0JGQ29kZSBCYXNlTWFjaGluZUNvbXBpbGVyOjpjb21waWxlU2NoZWR1bGVyUm91dGluZSgKKwkJRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGVGb3JtLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlpZiggT3BlcmF0b3JNYW5hZ2VyOjppc1NjaGVkdWxlKCBhQ29kZS0+Z2V0T3BlcmF0b3IoKSApICkKKwl7CisJCUJGQ29kZSBzY2hlZENvZGUoIGFDb2RlLT5nZXRPcGVyYXRvcigpICk7CisKKwkJQXZtQ29kZTo6aXRlcmF0b3IgaXRBcmcgPSBhQ29kZS0+YmVnaW4oKTsKKwkJQXZtQ29kZTo6aXRlcmF0b3IgZW5kQXJnID0gYUNvZGUtPmVuZCgpOworCQlmb3IoIDsgaXRBcmcgIT0gZW5kQXJnIDsgKytpdEFyZyApCisJCXsKKwkJCWlmKCAoKml0QXJnKS5pczwgQXZtQ29kZSA+KCkgKQorCQkJeworCQkJCXNjaGVkQ29kZS0+YXBwZW5kKCBjb21waWxlU2NoZWR1bGVyUm91dGluZSgKKwkJCQkJCWFuRXhlY3V0YWJsZUZvcm0sICgqaXRBcmcpLmJmQ29kZSgpICkgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJPDwgImNvbXBpbGVTY2hlZHVsZXJSb3V0aW5lOj4gVW5leHBlY3RlZCBhcmcgOj5cbiIKKwkJCQkJCTw8ICgqaXRBcmcpCisJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQlzY2hlZENvZGUtPmFwcGVuZCggKml0QXJnICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4oIHNjaGVkQ29kZSApOworCX0KKwllbHNlIGlmKCBPcGVyYXRvck1hbmFnZXI6OmlzQWN0aXZpdHkoIGFDb2RlLT5nZXRPcGVyYXRvcigpICkgKQorCXsKKwkJcmV0dXJuKCBtQXZtY29kZUNvbXBpbGVyLmNvbXBpbGVTdGF0ZW1lbnQoYW5FeGVjdXRhYmxlRm9ybSwgYUNvZGUpICk7CisJfQorCWVsc2UKKwl7CisJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJPDwgImNvbXBpbGVTY2hlZHVsZXJSb3V0aW5lOj4gVW5leHBlY3RlZCBjb2RlIDo+XG4iIDw8IGFDb2RlCisJCQkJPDwgU0VORF9FWElUOworCisJCXJldHVybiggYUNvZGUgKTsKKwl9Cit9CisKKworQkZDb2RlIEJhc2VNYWNoaW5lQ29tcGlsZXI6Om9wdGltaXplU2NoZWR1bGluZ1JvdXRpbmUoCisJCUV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlRm9ybSwgY29uc3QgQkZDb2RlICYgYVNjaGVkdWxlckNvZGUpCit7CisJaWYoIGFTY2hlZHVsZXJDb2RlLmludmFsaWQoKSApCisJeworCQlBVk1fT1NfRVhJVCggRkFJTEVEICkKKwkJCQk8PCAiY29tcGxldGVTY2hlZHVsZXJSb3V0aW5lOj4gVW5leHBlY3RlZCBhIDw8IG51bGw8Y29kZT4gPj4gISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQlyZXR1cm4oIGFTY2hlZHVsZXJDb2RlICk7CisJfQorCWVsc2UgaWYoIGFTY2hlZHVsZXJDb2RlLT5lbXB0eSgpICkKKwl7CisJCXJldHVybiggYVNjaGVkdWxlckNvZGUgKTsKKwl9CisKKwlpZiggYVNjaGVkdWxlckNvZGUtPnNpbmdsZXRvbigpICYmCisJCWFTY2hlZHVsZXJDb2RlLT5maXJzdCgpLmlzPCBJbnN0YW5jZU9mTWFjaGluZSA+KCkgJiYKKwkJT3BlcmF0b3JNYW5hZ2VyOjppc0FjdGl2aXR5KCBhU2NoZWR1bGVyQ29kZS0+Z2V0T3BlcmF0b3IoKSApICkKKwl7CisJCUluc3RhbmNlT2ZNYWNoaW5lICogYW5JbnN0YW5jZSA9CisJCQkJYVNjaGVkdWxlckNvZGUtPmZpcnN0KCkudG9fcHRyPCBJbnN0YW5jZU9mTWFjaGluZSA+KCk7CisKKwkJaWYoIGFuSW5zdGFuY2UtPmdldFNwZWNpZmllcigpLmlzRGVzaWduSW5zdGFuY2VTdGF0aWMoKSApCisJCXsKKwkJCXJldHVybiggYVNjaGVkdWxlckNvZGUgKTsKKwkJfQorCisJCWVsc2UgaWYoIGFuSW5zdGFuY2UtPmdldFNwZWNpZmllcigpLmlzRGVzaWduUHJvdG90eXBlU3RhdGljKCkgKQorCQl7CisJCQlpZiggYW5JbnN0YW5jZS0+aXNBdXRvU3RhcnQoKSApCisJCQl7CisJCQkJcmV0dXJuKCBhU2NoZWR1bGVyQ29kZSApOworCQkJfQorCQkJZWxzZSBpZiggYW5JbnN0YW5jZS0+aGFzUG9zc2libGVEeW5hbWljSW5zdGFuY2lhdGlvbigpICkKKwkJCXsKKwkJCQlyZXR1cm4oIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQkJYVNjaGVkdWxlckNvZGUtPmdldE9wZXJhdG9yKCksCisJCQkJCQlJTkNSX0JGKGFuSW5zdGFuY2UtPmdldEluc3RhbmNlTW9kZWwoKSkgKSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQk8PCAib3B0aW1pemVTY2hlZHVsaW5nUm91dGluZTo+ICIKKwkJCQkJCQkiVW5leHBlY3RlZCBub24gYXV0by1zdGFydCBwcm90b3R5cGUgbWFjaGluZSA6PlxuIgorCQkJCQkJPDwgdG9fc3RyZWFtKCBhbkluc3RhbmNlICkKKwkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCXJldHVybiggYVNjaGVkdWxlckNvZGUgKTsKKwkJCX0KKwkJfQorCisJCWVsc2UgaWYoIGFuSW5zdGFuY2UtPmdldFNwZWNpZmllcigpLmlzRGVzaWduTW9kZWwoKSApCisJCXsKKwkJCWlmKCBhbkluc3RhbmNlLT5oYXNQb3NzaWJsZUR5bmFtaWNJbnN0YW5jaWF0aW9uKCkgKQorCQkJeworCQkJCXJldHVybiggYVNjaGVkdWxlckNvZGUgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4oIEJGQ29kZTo6UkVGX05VTEwgKTsKKwkJCX0KKwkJfQorCX0KKworCWVsc2UKKwl7CisJCUJGQ29kZSBvcHRpQ29kZSggYVNjaGVkdWxlckNvZGUtPmdldE9wZXJhdG9yKCkgKTsKKwkJQkZDb2RlIGFyZ0NvZGU7CisKKwkJQXZtQ29kZTo6aXRlcmF0b3IgaXRBcmcgPSBhU2NoZWR1bGVyQ29kZS0+YmVnaW4oKTsKKwkJQXZtQ29kZTo6aXRlcmF0b3IgZW5kQXJnID0gYVNjaGVkdWxlckNvZGUtPmVuZCgpOworCQlmb3IoIDsgaXRBcmcgIT0gZW5kQXJnIDsgKytpdEFyZyApCisJCXsKKwkJCWlmKCAoKml0QXJnKS5pczwgQXZtQ29kZSA+KCkgKQorCQkJeworCQkJCWFyZ0NvZGUgPSBvcHRpbWl6ZVNjaGVkdWxpbmdSb3V0aW5lKAorCQkJCQkJYW5FeGVjdXRhYmxlRm9ybSwgKCppdEFyZykuYmZDb2RlKCkgKTsKKworCQkJCWlmKCBhcmdDb2RlLnZhbGlkKCkgKQorCQkJCXsKKwkJCQkJb3B0aUNvZGUtPmFwcGVuZCggYXJnQ29kZSApOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlvcHRpQ29kZS0+YXBwZW5kKCAqaXRBcmcgKTsKKwkJCX0KKwkJfQorCisJCWlmKCBvcHRpQ29kZS0+ZW1wdHkoKSApCisJCXsKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCTw8ICJvcHRpbWl6ZVNjaGVkdWxpbmdSb3V0aW5lOj4gIgorCQkJCQkJIlVuZXhwZWN0ZWQgc2NoZWR1bGVyIGNvZGUgOj5cbiIKKwkJCQkJPDwgYVNjaGVkdWxlckNvZGUKKwkJCQkJPDwgU0VORF9FWElUOworCQl9CisKKwkJcmV0dXJuKCBvcHRpQ29kZSApOworCX0KKworCXJldHVybiggYVNjaGVkdWxlckNvZGUgKTsKKy8vCXJldHVybiggbUF2bWNvZGVDb21waWxlci5vcHRpbWl6ZVN0YXRlbWVudChhbkV4ZWN1dGFibGVGb3JtLCBhQ29kZSkgKTsKK30KKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvY29tcGlsZXIvQmFzZU1hY2hpbmVDb21waWxlci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9jb21waWxlci9CYXNlTWFjaGluZUNvbXBpbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhiY2VjMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvY29tcGlsZXIvQmFzZU1hY2hpbmVDb21waWxlci5oCkBAIC0wLDAgKzEsOTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyMiBub3YuIDIwMTIKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBCVUlMREVSX0NPTVBJTEVSX0JBU0VNQUNISU5FQ09NUElMRVJfSF8KKyNkZWZpbmUgQlVJTERFUl9DT01QSUxFUl9CQVNFTUFDSElORUNPTVBJTEVSX0hfCisKKyNpbmNsdWRlIDxidWlsZGVyL2NvbXBpbGVyL0Jhc2VDb21waWxlci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjbGFzcyBBdm1jb2RlQ29tcGlsZXI7CitjbGFzcyBFeGVjdXRhYmxlRm9ybTsKK2NsYXNzIEluc3RhbmNlT2ZNYWNoaW5lOworCisKK2NsYXNzIEJhc2VNYWNoaW5lQ29tcGlsZXIgOiBwdWJsaWMgQmFzZUNvbXBpbGVyCit7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUJhc2VNYWNoaW5lQ29tcGlsZXIoQ29uZmlndXJhdGlvbiAmIGFDb25maWd1cmF0aW9uLAorCQkJQXZtY29kZUNvbXBpbGVyICYgYW5Bdm1jb2RlQ29tcGlsZXIpCisJOiBCYXNlQ29tcGlsZXIoIGFDb25maWd1cmF0aW9uICwgYW5Bdm1jb2RlQ29tcGlsZXIgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkJhc2VNYWNoaW5lQ29tcGlsZXIoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBDT01QSUxJTkcgRVhFQ1VUQUJMRSAtIEFWTVBST0dSQU0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJdm9pZCBwb3N0Y29tcGlsZUV4ZWN1dGFibGVTeXN0ZW0oKTsKKworCXZvaWQgb3B0aW1pemVFeGVjdXRhYmxlKEV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlRm9ybSk7CisKKwl2b2lkIG9wdGltaXplQWxsQmVoYXZpb3JhbFJvdXRpbmVzKEV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlRm9ybSk7CisKKwl2b2lkIG9wdGltaXplSW5zdGFuY2UoRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGVGb3JtKTsKKworCXZvaWQgb3B0aW1pemVJbnN0YW5jZSgKKwkJCUV4ZWN1dGFibGVGb3JtICogdGhlRXhlY3V0YWJsZUNvbnRhaW5lciwKKwkJCUluc3RhbmNlT2ZNYWNoaW5lICogYW5JbnN0YW5jZSk7CisKKworCisJLyoqCisJICogQ09NUElMSU5HIEVYRUNVVEFCTEUgU0NIRURVTEVSCisJICovCisJQkZDb2RlIGNvbXBpbGVTY2hlZHVsZXJSb3V0aW5lKAorCQkJRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGVGb3JtLAorCQkJTGlzdE9mSW5zdGFuY2VPZk1hY2hpbmUgJiB1c2VkSW5zdGFuY2UsCisJCQljb25zdCBCRkNvZGUgJiBhU2NoZWR1bGVyQ29kZSk7CisKKwl2b2lkIGNvbXBpbGVTY2hlZHVsZXJSb3V0aW5lKEV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlRm9ybSwKKwkJCUxpc3RPZkluc3RhbmNlT2ZNYWNoaW5lICYgdXNlZEluc3RhbmNlLAorCQkJY29uc3QgQkZDb2RlICYgYVNjaGVkdWxlckNvZGUsIEJGQ29kZSAmIGNvbXBpbENvZGUpOworCisJQkZDb2RlIGNvbXBpbGVTY2hlZHVsZXJSb3V0aW5lKAorCQkJRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGVGb3JtLCBjb25zdCBCRkNvZGUgJiBhQ29kZSk7CisKKwlCRkNvZGUgb3B0aW1pemVTY2hlZHVsaW5nUm91dGluZSgKKwkJCUV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlRm9ybSwgY29uc3QgQkZDb2RlICYgYVNjaGVkdWxlckNvZGUpOworCit9OworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworI2VuZGlmIC8qIEJVSUxERVJfQ09NUElMRVJfQkFTRU1BQ0hJTkVDT01QSUxFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9jb21waWxlci9Db21waWxlci5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL2NvbXBpbGVyL0NvbXBpbGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjdhNzI1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9jb21waWxlci9Db21waWxlci5jcHAKQEAgLTAsMCArMSwzNTc0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJDb21waWxlci5oIgorCisjaW5jbHVkZSA8YnVpbGRlci9hbmFseXNpcy9Db21tdW5pY2F0aW9uRGVwZW5kZW5jeS5oPgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQXZtQ29kZS5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25Db25zdGFudC5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25GYWN0b3J5Lmg+CisjaW5jbHVkZSA8Zm1sL2J1aWx0aW4vSWRlbnRpZmllci5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL1N0YXRlbWVudFR5cGVDaGVja2VyLmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vU3RhdGVtZW50Q29uc3RydWN0b3IuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9TdGF0ZW1lbnRGYWN0b3J5Lmg+CisjaW5jbHVkZSA8Zm1sL2J1aWx0aW4vUXVhbGlmaWVkSWRlbnRpZmllci5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvQXZtUHJvZ3JhbS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0F2bVRyYW5zaXRpb24uaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9CYXNlSW5zdGFuY2VGb3JtLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZUxpYi5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVGb3JtLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZVN5c3RlbS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZCdWZmZXIuaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mRGF0YS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZNYWNoaW5lLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZlBvcnQuaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9Sb3V0aW5nRGF0YS5oPgorCisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yTWFuYWdlci5oPgorCisjaW5jbHVkZSA8Zm1sL3R5cGUvVHlwZU1hbmFnZXIuaD4KKworI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9EYXRhVHlwZS5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9NYWNoaW5lLmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1N5c3RlbS5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9UcmFuc2l0aW9uLmg+CisKKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvQmVoYXZpb3JhbFBhcnQuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvQ29tcG9zaXRlUGFydC5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Qcm9wZXJ0eVBhcnQuaD4KKworI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9VbmlGb3JtSWRlbnRpZmllci5oPgorI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9XT2JqZWN0Lmg+CisKKyNpbmNsdWRlIDxzZXcvQ29uZmlndXJhdGlvbi5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvKioKKyAqIENPTlNUUlVDVE9SCisgKiBEZWZhdWx0CisgKi8KK0NvbXBpbGVyOjpDb21waWxlcihDb25maWd1cmF0aW9uICYgYUNvbmZpZ3VyYXRpb24sCisJCUF2bWNvZGVDb21waWxlciAmIGFuQXZtY29kZUNvbXBpbGVyKQorOiBCYXNlTWFjaGluZUNvbXBpbGVyKCBhQ29uZmlndXJhdGlvbiwgYW5Bdm1jb2RlQ29tcGlsZXIgKSwKK21EYXRhQ29tcGlsZXIoICp0aGlzICksCittUHJvZ3JhbUNvbXBpbGVyKCAqdGhpcyApLAorbVRyYW5zaXRpb25Db21waWxlciggKnRoaXMgKSwKK21Db21Db21waWxlciggKnRoaXMgKQoreworCS8vISEgTk9USElORworfQorCisKKy8qKgorICogQ09ORklHVVJFCisgKi8KK2Jvb2wgQ29tcGlsZXI6OmNvbmZpZ3VyZSgpCit7CisJaWYoIG5vdCBtQXZtY29kZUNvbXBpbGVyLmNvbmZpZ3VyZSgpICkKKwl7CisJCUFWTV9PU19FUlJPUl9BTEVSVCA8PCAiQ29tcGlsZXI6OmNvbmZpZ3VyZTo+ICIKKwkJCQkJInRoZSBBdm1jb2RlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gZmFpbGVkICEhISIKKwkJCQk8PCBTRU5EX0FMRVJUOworCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU1RBUlQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCitib29sIENvbXBpbGVyOjpzdGFydChTeXN0ZW0gJiBhU3lzdGVtKQoreworCUV4ZWN1dGFibGVTeXN0ZW0gKiBhRXhlY3V0YWJsZVN5c3RlbSA9IG5ldyBFeGVjdXRhYmxlU3lzdGVtKCBhU3lzdGVtICk7CisJbUNvbmZpZ3VyYXRpb24uc2V0RXhlY3V0YWJsZVN5c3RlbSggYUV4ZWN1dGFibGVTeXN0ZW0gKTsKKworCXByZWNvbXBpbGVTeXN0ZW0oYVN5c3RlbSk7CisKKworQVZNX0lGX0RFQlVHX0ZMQUcoIENPTVBJTElORyApCisJbUNvbmZpZ3VyYXRpb24uc2VyaWFsaXplRGVidWdFeGVjdXRhYmxlKCAicHJlY29tcGlsaW5nIiApOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIENPTVBJTElORyApCisKKwltQ29tQ29tcGlsZXIudXBkYXRlTWVzc2FnZUlEKCk7CisKKwljb21waWxlRXhlY3V0YWJsZVN5c3RlbSgpOworCitBVk1fSUZfREVCVUdfRkxBRyggQ09NUElMSU5HICkKKwltQ29uZmlndXJhdGlvbi5zZXJpYWxpemVEZWJ1Z0V4ZWN1dGFibGUoICJjb21waWxpbmciICk7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggQ09NUElMSU5HICkKKworCisJcG9zdGNvbXBpbGVFeGVjdXRhYmxlU3lzdGVtKCk7CisKK0FWTV9JRl9ERUJVR19GTEFHKCBDT01QSUxJTkcgKQorbUNvbmZpZ3VyYXRpb24uc2VyaWFsaXplRGVidWdFeGVjdXRhYmxlKCAicG9zdGNvbXBpbGluZyIgKTsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBDT01QSUxJTkcgKQorCisKKwlyZXR1cm4oIGhhc1plcm9FcnJvcigpICk7Cit9CisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBSRUNPTVBJTEFUSU9OCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKgorICogcHJlY29tcGlsZQorICogZGVjbGFyYXRpb24KKyAqLwordm9pZCBDb21waWxlcjo6cHJlY29tcGlsZVByb3BlcnR5UGFydChFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZSwKKwkJUHJvcGVydHlQYXJ0ICYgdGhlRGVjbGFyYXRpb24sIFRhYmxlT2ZJbnN0YW5jZU9mRGF0YSAmIHRhYmxlT2ZWYXJpYWJsZSkKK3sKKwkvLyBVc2VyIFZhcmlhYmxlLVBhcmFtZXRlcnMKKwlQcm9wZXJ0eVBhcnQ6OmNvbnN0X3ZhcmlhYmxlX2l0ZXJhdG9yIGl0VmFyID0KKwkJCXRoZURlY2xhcmF0aW9uLnZhcl9wYXJhbWV0ZXJfYmVnaW4oKTsKKwlQcm9wZXJ0eVBhcnQ6OmNvbnN0X293bmVkX2l0ZXJhdG9yIGVuZFZhciA9CisJCQl0aGVEZWNsYXJhdGlvbi52YXJfcGFyYW1ldGVyX2VuZCgpOworCWZvciggOyBpdFZhciAhPSBlbmRWYXIgOyArK2l0VmFyICkKKwl7CisJCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9TTUFSVF9QT0lOVEVSX0VYSVQoICgqaXRWYXIpICkKKwkJCQk8PCAiZGF0YSBvciB0eXBlIGZvciBjb21waWxpbmcgISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQkvLyBBbGxvY2F0aW9uIGZvciB2YXJpYWJsZQorCQltRGF0YUNvbXBpbGVyLnByZWNvbXBpbGVEYXRhKGFuRXhlY3V0YWJsZSwKKwkJCQkoKml0VmFyKS50b19wdHI8IFZhcmlhYmxlID4oKSwgdGFibGVPZlZhcmlhYmxlKTsKKwl9CisKKwkvLyBVc2VyIFZhcmlhYmxlLVJldHVybnMKKwlpdFZhciA9IHRoZURlY2xhcmF0aW9uLnZhcl9yZXR1cm5fYmVnaW4oKTsKKwllbmRWYXIgPSB0aGVEZWNsYXJhdGlvbi52YXJfcmV0dXJuX2VuZCgpOworCWZvciggOyBpdFZhciAhPSBlbmRWYXIgOyArK2l0VmFyICkKKwl7CisJCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9TTUFSVF9QT0lOVEVSX0VYSVQoICgqaXRWYXIpICkKKwkJCQk8PCAiZGF0YSBvciB0eXBlIGZvciBjb21waWxpbmcgISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQkvLyBBbGxvY2F0aW9uIGZvciB2YXJpYWJsZQorCQltRGF0YUNvbXBpbGVyLnByZWNvbXBpbGVEYXRhKGFuRXhlY3V0YWJsZSwKKwkJCQkoKml0VmFyKS50b19wdHI8IFZhcmlhYmxlID4oKSwgdGFibGVPZlZhcmlhYmxlKTsKKwl9CisKKwkvLyBPdGhlciBPd25lZEVsZW1lbnRzCisJUHJvcGVydHlQYXJ0Ojpjb25zdF9vd25lZF9pdGVyYXRvciBpdFdmTyA9IHRoZURlY2xhcmF0aW9uLm93bmVkX2JlZ2luKCk7CisJUHJvcGVydHlQYXJ0Ojpjb25zdF9vd25lZF9pdGVyYXRvciBlbmRXZk8gPSB0aGVEZWNsYXJhdGlvbi5vd25lZF9lbmQoKTsKKwlmb3IoIDsgaXRXZk8gIT0gZW5kV2ZPIDsgKytpdFdmTyApCisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfU01BUlRfUE9JTlRFUl9FWElUKCAoKml0V2ZPKSApCisJCQkJPDwgImRhdGEgb3IgdHlwZSBmb3IgY29tcGlsaW5nICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJLy8gQWxsb2NhdGlvbiBmb3IgdmFyaWFibGUKKwkJaWYoICgqaXRXZk8pLmlzPCBWYXJpYWJsZSA+KCkgKQorCQl7CisJCQlWYXJpYWJsZSAqIGFWYXJpYWJsZSA9ICgqaXRXZk8pLnRvX3B0cjwgVmFyaWFibGUgPigpOworCisJCQlpZiggYVZhcmlhYmxlLT5nZXRNb2RpZmllcigpLm5vTmF0dXJlUGFyYW1ldGVyKCkgKQorCQkJeworCQkJCW1EYXRhQ29tcGlsZXIucHJlY29tcGlsZURhdGEoYW5FeGVjdXRhYmxlLAorCQkJCQkJYVZhcmlhYmxlLCB0YWJsZU9mVmFyaWFibGUpOworCQkJfQorCQl9CisKKwkJLy8gQWxsb2NhdGlvbiBmb3IgYnVmZmVyCisJCWVsc2UgaWYoICgqaXRXZk8pLmlzPCBCdWZmZXIgPigpICkKKwkJeworCQkJbUNvbUNvbXBpbGVyLnByZWNvbXBpbGVCdWZmZXIoCisJCQkJCWFuRXhlY3V0YWJsZSwgKCppdFdmTykudG9fcHRyPCBCdWZmZXIgPigpKTsKKwkJfQorCisJCS8vIEFsbG9jYXRpb24gZm9yIHBvcnQKKwkJZWxzZSBpZiggKCppdFdmTykuaXM8IFBvcnQgPigpICkKKwkJeworLy8JCQltQ29tQ29tcGlsZXIucHJlY29tcGlsZVBvcnQoYW5FeGVjdXRhYmxlLAorLy8JCQkJCSgqaXQpLnRvX3B0cjwgUG9ydCA+KCksIHRhYmxlT2ZWYXJpYWJsZSk7CisJCX0KKworCQllbHNlIGlmKCAoKml0V2ZPKS5pczwgQ2hhbm5lbCA+KCkgKQorCQl7CisvLwkJCW1Db21Db21waWxlci5wcmVjb21waWxlQ2hhbm5lbCgKKy8vCQkJCQlhbkV4ZWN1dGFibGUsICgqaXQpLnRvX3B0cjwgQ2hhbm5lbCA+KCkpOworCQl9CisKKwkJZWxzZSBpZiggKCppdFdmTykuaXM8IE1hY2hpbmUgPigpICkKKwkJeworLy8JCQlwcmVjb21waWxlSW5zdGFuY2VTdGF0aWMoCisvLwkJCQkJYW5FeGVjdXRhYmxlLCAoKml0KS50b19wdHI8IE1hY2hpbmUgPigpKTsKKwkJfQorCisJCS8vIEFsbG9jYXRpb24gZm9yIHR5cGVkZWYKKwkJZWxzZSAgaWYoICgqaXRXZk8pLmlzPCBEYXRhVHlwZSA+KCkgKQorCQl7CisJCQlwcmVjb21waWxlVHlwZVNwZWNpZmllcihhbkV4ZWN1dGFibGUsICgqaXRXZk8pKTsKKwkJfQorCX0KKworCS8vIEFsbG9jYXRpb24gZm9yIHBvcnRzIC8gc2lnbmFscworCW1Db21Db21waWxlci5wcmVjb21waWxlQ29tUG9pbnQoCisJCQlhbkV4ZWN1dGFibGUsIHRoZURlY2xhcmF0aW9uLCB0YWJsZU9mVmFyaWFibGUpOworCisJLy8gQWxsb2NhdGlvbiBmb3IgY2hhbm5lbHMKKwltQ29tQ29tcGlsZXIucHJlY29tcGlsZUNoYW5uZWwoYW5FeGVjdXRhYmxlLAorCQkJdGhlRGVjbGFyYXRpb24sIHRhYmxlT2ZWYXJpYWJsZSk7Cit9CisKKwordm9pZCBDb21waWxlcjo6cHJlY29tcGlsZURhdGFUeXBlKEF2bVByb2dyYW0gKiBhUHJvZ3JhbSwKKwkJUHJvcGVydHlQYXJ0ICYgdGhlRGVjbGFyYXRpb24sIFRhYmxlT2ZJbnN0YW5jZU9mRGF0YSAmIHRhYmxlT2ZWYXJpYWJsZSkKK3sKKwlQcm9wZXJ0eVBhcnQ6OmNvbnN0X293bmVkX2l0ZXJhdG9yIGl0ID0gdGhlRGVjbGFyYXRpb24ub3duZWRfYmVnaW4oKTsKKwlQcm9wZXJ0eVBhcnQ6OmNvbnN0X293bmVkX2l0ZXJhdG9yIGVuZEl0ID0gdGhlRGVjbGFyYXRpb24ub3duZWRfZW5kKCk7CisJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfU01BUlRfUE9JTlRFUl9FWElUKCAoKml0KSApCisJCQkJPDwgImRhdGEgb3IgdHlwZSBmb3IgY29tcGlsaW5nICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJLy8gQWxsb2NhdGlvbiBmb3IgdmFyaWFibGUKKwkJaWYoICgqaXQpLmlzPCBWYXJpYWJsZSA+KCkgKQorCQl7CisJCQltRGF0YUNvbXBpbGVyLnByZWNvbXBpbGVEYXRhKGFQcm9ncmFtLAorCQkJCQkoKml0KS50b19wdHI8IFZhcmlhYmxlID4oKSwgdGFibGVPZlZhcmlhYmxlKTsKKwkJfQorCisJCS8vIEFsbG9jYXRpb24gZm9yIHR5cGVkZWYKKwkJZWxzZQorCQl7CisJCQlwcmVjb21waWxlVHlwZVNwZWNpZmllcihhUHJvZ3JhbSwgKCppdCkpOworCQl9CisJfQorfQorCisKKy8qKgorICogcHJlY29tcGlsZQorICogc3BlY2lmaWNhdGlvbgorICovCit2b2lkIENvbXBpbGVyOjpwcmVjb21waWxlRXhlY3V0YWJsZUNvbXBvc2l0ZVBhcnQoCisJCUV4ZWN1dGFibGVGb3JtICogYUNvbnRhaW5lciwgTWFjaGluZSAqIGFuRXhlY3V0YWJsZVNwZWMpCit7CisJQ29tcG9zaXRlUGFydCAqIGFDb21wb3NpdGVQYXJ0ID0gYW5FeGVjdXRhYmxlU3BlYy0+Z2V0Q29tcG9zaXRlUGFydCgpOworCisJaWYoIGFDb21wb3NpdGVQYXJ0ID09IE5VTEwgKQorCXsKKwkJLy8hISBOT1RISU5HCisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIHByZWNvbXBpbGluZyBwcm9jZWR1cmUKKwkgKi8KKwlpZiggYUNvbXBvc2l0ZVBhcnQtPmhhc1Byb2NlZHVyZSgpICkKKwl7CisJCUNvbXBvc2l0ZVBhcnQ6OmNvbnN0X3Byb2NlZHVyZV9pdGVyYXRvciBpdCA9CisJCQkJYUNvbXBvc2l0ZVBhcnQtPnByb2NlZHVyZV9iZWdpbigpOworCQlDb21wb3NpdGVQYXJ0Ojpjb25zdF9wcm9jZWR1cmVfaXRlcmF0b3IgZW5kSXQgPQorCQkJCWFDb21wb3NpdGVQYXJ0LT5wcm9jZWR1cmVfZW5kKCk7CisJCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCQl7CisJCQlwcmVjb21waWxlRXhlY3V0YWJsZShhQ29udGFpbmVyLCAoaXQpKTsKKwkJfQorCX0KKworCS8qCisJICogcHJlY29tcGlsaW5nIGV4ZWN1dGFibGUgLSBpbnN0YW5jZSBzdGF0aWMKKwkgKi8KKwlpZiggYUNvbXBvc2l0ZVBhcnQtPmhhc01hY2hpbmUoKSApCisJeworCQkvLyBwcmVjb21waWxpbmcgc3ViLWV4ZWN1dGFibGUKKwkJYW5FeGVjdXRhYmxlU3BlYy0+ZXhwYW5kR3JvdXBTdGF0ZW1hY2hpbmUoKTsKKworCQlDb21wb3NpdGVQYXJ0Ojpjb25zdF9tYWNoaW5lX2l0ZXJhdG9yIGl0ID0KKwkJCQlhQ29tcG9zaXRlUGFydC0+bWFjaGluZV9iZWdpbigpOworCQlDb21wb3NpdGVQYXJ0Ojpjb25zdF9tYWNoaW5lX2l0ZXJhdG9yIGVuZEl0ID0KKwkJCQlhQ29tcG9zaXRlUGFydC0+bWFjaGluZV9lbmQoKTsKKwkJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJCXsKKwkJCXByZWNvbXBpbGVFeGVjdXRhYmxlKGFDb250YWluZXIsIChpdCkpOworCQl9CisJfQorCisJLyoKKwkgKiBwcmVjb21waWxpbmcgaW5zdGFuY2UgZHluYW1pYworCSAqLworCWlmKCBhQ29tcG9zaXRlUGFydC0+aGFzSW5zdGFuY2VEeW5hbWljKCkgKQorCXsKKwkJQ29tcG9zaXRlUGFydDo6Y29uc3RfbWFjaGluZV9pdGVyYXRvciBpdCA9CisJCQkJYUNvbXBvc2l0ZVBhcnQtPmluc3RhbmNlX2R5bmFtaWNfYmVnaW4oKTsKKwkJQ29tcG9zaXRlUGFydDo6Y29uc3RfbWFjaGluZV9pdGVyYXRvciBlbmRJdCA9CisJCQkJYUNvbXBvc2l0ZVBhcnQtPmluc3RhbmNlX2R5bmFtaWNfZW5kKCk7CisJCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCQl7CisvLwkJCWlmKCAoaXQpLT5nZXRTcGVjaWZpZXIoKS5pc0Rlc2lnbkluc3RhbmNlRHluYW1pYygpICkKKwkJCXsKKwkJCQlwcmVjb21waWxlRXhlY3V0YWJsZUluc3RhbmNlRHluYW1pcXVlKGFDb250YWluZXIsIChpdCkpOworCQkJfQorCQl9CisJfQorfQorCisKK3ZvaWQgQ29tcGlsZXI6OnByZWNvbXBpbGVFeGVjdXRhYmxlKAorCQlFeGVjdXRhYmxlRm9ybSAqIGFDb250YWluZXIsIE1hY2hpbmUgKiBhbkV4ZWN1dGFibGVTcGVjKQoreworCWlmKCBhbkV4ZWN1dGFibGVTcGVjLT5nZXRTcGVjaWZpZXIoKS5oYXNHcm91cE1hc2soKSApCisJeworCQlwcmVjb21waWxlRXhlY3V0YWJsZUdyb3VwKGFDb250YWluZXIsIGFuRXhlY3V0YWJsZVNwZWMpOworCX0KKwllbHNlIGlmKCBhbkV4ZWN1dGFibGVTcGVjLT5nZXRTcGVjaWZpZXIoKS5pc0Rlc2lnbk1vZGVsKCkpCisJeworCQlwcmVjb21waWxlRXhlY3V0YWJsZU1vZGVsKGFDb250YWluZXIsIGFuRXhlY3V0YWJsZVNwZWMpOworCX0KKwllbHNlIGlmKCBhbkV4ZWN1dGFibGVTcGVjLT5nZXRTcGVjaWZpZXIoKS5pc0Rlc2lnblByb3RvdHlwZVN0YXRpYygpICkKKwl7CisJCXByZWNvbXBpbGVFeGVjdXRhYmxlUHJvdG90eXBlKGFDb250YWluZXIsIGFuRXhlY3V0YWJsZVNwZWMpOworCX0KKwllbHNlIGlmKCBhbkV4ZWN1dGFibGVTcGVjLT5nZXRTcGVjaWZpZXIoKS5pc0Rlc2lnbkluc3RhbmNlU3RhdGljKCkgKQorCXsKKwkJcHJlY29tcGlsZUV4ZWN1dGFibGVJbnN0YW5jZVN0YXRpYyhhQ29udGFpbmVyLCBhbkV4ZWN1dGFibGVTcGVjKTsKKwl9CisJZWxzZSBpZiggYW5FeGVjdXRhYmxlU3BlYy0+Z2V0U3BlY2lmaWVyKCkuaXNEZXNpZ25JbnN0YW5jZUR5bmFtaWMoKSApCisJeworCQlwcmVjb21waWxlRXhlY3V0YWJsZUluc3RhbmNlRHluYW1pcXVlKGFDb250YWluZXIsIGFuRXhlY3V0YWJsZVNwZWMpOworCX0KKwllbHNlCisJeworCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCTw8ICJVbmV4cGVjdGVkIGluIHByZWNvbXBpbGluZyBzdGFnZSB0aGUgZXhlY3V0YWJsZTogIgorCQkJCTw8IHN0ZDo6ZW5kbCA8PCBzdHJfaGVhZGVyKCBhbkV4ZWN1dGFibGVTcGVjICkgPDwgc3RkOjplbmRsCisJCQkJPDwgIj09PiB3aXRoIHNwZWNpZmllcjogIgorCQkJCTw8IGFuRXhlY3V0YWJsZVNwZWMtPmdldFNwZWNpZmllcigpLnN0cigpIDw8ICIgISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKwl9Cit9CisKKworRXhlY3V0YWJsZUZvcm0gKiBDb21waWxlcjo6cHJlY29tcGlsZUV4ZWN1dGFibGVNb2RlbCgKKwkJRXhlY3V0YWJsZUZvcm0gKiBhQ29udGFpbmVyLCBNYWNoaW5lICogYW5FeGVjdXRhYmxlU3BlYykKK3sKKy8vQVZNX09TX0NFUlIgPDwgVEFCIDw8ICI8KiogYmVnaW4gcHJlY29tcGlsaW5nIGV4ZWN1dGFibGUgbW9kZWw6PiIKKy8vCQk8PCBzdGQ6OmVuZGwgPDwgc3RyX2hlYWRlciggYW5FeGVjdXRhYmxlU3BlYyApIDw8IHN0ZDo6ZW5kbDsKKworCS8vIENSRUFURSBORVcgRVhFQ1VUQUJMRQorCUV4ZWN1dGFibGVGb3JtICogYW5FeGVjID0gbmV3IEV4ZWN1dGFibGVGb3JtKAorCQkJbUNvbmZpZ3VyYXRpb24uZ2V0RXhlY3V0YWJsZVN5c3RlbSgpLAorCQkJYUNvbnRhaW5lciwgYW5FeGVjdXRhYmxlU3BlYyk7CisKKwlzZXRJbmhlcml0ZWRTcGVjaWZpZXIoYUNvbnRhaW5lciwgYW5FeGVjKTsKKworCS8vIEFQUEVORCBORVcgRVhFQ1VUQUJMRSBJTiBUSEUgU1lTVEVNCisvLwkvLz8/IEZvciByZXRyb2NvbXBhdGliaXR5IHNlcmlhbGl6YXRpb24gb3JkZXIKKy8vCWdldFN5bWJvbFRhYmxlKCkuYWRkTWFjaGluZUV4ZWN1dGFibGUoCisvLwkJCW1FeGVjdXRhYmxlU3lzdGVtLT5zYXZlRXhlY3V0YWJsZSggYW5FeGVjICkgKTsKKworCWF2bV9zaXplX3QgbWF4aW1hbEluc3RhbmNlQ291bnQgPSBhbkV4ZWN1dGFibGVTcGVjLT5oYXNJbnN0YW5jZVNwZWNpZmllcigpCisJCT8gYW5FeGVjdXRhYmxlU3BlYy0+Z2V0SW5zdGFuY2VTcGVjaWZpZXIoKS0+Z2V0TWF4aW1hbEluc3RhbmNlQ291bnQoKQorCQk6IEFWTV9OVU1FUklDX01BWF9TSVpFX1Q7CisKKwkvLz8/PyBTZXJhIGZhaXQgZGFucyBwcmVjb21waWxlRXhlY3V0YWJsZUluc3RhbmNlWFhYKC4uLikgPworLy8JYW5FeGVjLT5pbmNyUG9zc2libGVTdGF0aWNJbnN0YW5jaWF0aW9uQ291bnQoIGNyZWF0ZWRJbnN0YW5jZUNvdW50ICk7CisKKwlpZiggYW5FeGVjdXRhYmxlU3BlYy0+Z2V0U3BlY2lmaWVyKCkuaXNGYW1pbHlDb21wb25lbnRDb21wb3NpdGUoKSApCisJeworCQlTcGVjaWZpZXIgYVNwZWNpZmllciggYW5FeGVjdXRhYmxlU3BlYy0+Z2V0U3BlY2lmaWVyKCkgKTsKKworCQlJbnN0YW5jZU9mTWFjaGluZSAqIGFNb2RlbEluc3RhbmNlID0gbmV3IEluc3RhbmNlT2ZNYWNoaW5lKAorCQkJCWFDb250YWluZXIsIGFuRXhlY3V0YWJsZVNwZWMsIGFuRXhlYywgTlVMTCwKKwkJCQlhQ29udGFpbmVyLT5nZXRJbnN0YW5jZU1vZGVsKCkuc2l6ZSgpLAorCQkJCWFTcGVjaWZpZXIuc2V0RGVzaWduTW9kZWwoKSApOworCisJCS8vPz8/IFNlcmEgZmFpdCBkYW5zIHByZWNvbXBpbGVFeGVjdXRhYmxlSW5zdGFuY2VYWFgoLi4uKSA/CisJCWFNb2RlbEluc3RhbmNlLT5zZXRJbnN0YW5jZUNvdW50KAorCQkJCS8qY3JlYXRlZEluc3RhbmNlQ291bnQqLzAsIG1heGltYWxJbnN0YW5jZUNvdW50KTsKKworCQlhQ29udGFpbmVyLT5zYXZlSW5zdGFuY2VNb2RlbCggYU1vZGVsSW5zdGFuY2UgKTsKKwl9CisKKwkvKgorCSAqIEFsbG9jYXRpb24gb2YgZGVjbGFyYXRpb24gY29udGVudHMgOj4KKwkgKiBjb25zdGFudCwgdmFyaWFibGUsIHR5cGVkZWYsIGJ1ZmZlciwgcG9ydAorCSAqLworCVRhYmxlT2ZJbnN0YW5jZU9mRGF0YSB0YWJsZU9mVmFyaWFibGU7CisKKwlpZiggYW5FeGVjdXRhYmxlU3BlYy0+aGFzUHJvcGVydHkoKSApCisJeworCQlhdm1fb2Zmc2V0X3QgcGFyYW1ldGVyc0NvdW50ID0gYW5FeGVjdXRhYmxlU3BlYy0+CisJCQkJZ2V0UHJvcGVydHlQYXJ0KCkuZ2V0VmFyaWFibGVQYXJhbWV0ZXJzQ291bnQoKTsKKworCQlhbkV4ZWMtPnNldFBhcmFtT2Zmc2V0Q291bnQoIDAgLCBwYXJhbWV0ZXJzQ291bnQgKTsKKworCQlhbkV4ZWMtPnNldFJldHVybk9mZnNldENvdW50KCBwYXJhbWV0ZXJzQ291bnQsIGFuRXhlY3V0YWJsZVNwZWMtPgorCQkJCWdldFByb3BlcnR5UGFydCgpLmdldFZhcmlhYmxlUmV0dXJuc0NvdW50KCkgKTsKKworCQlwcmVjb21waWxlUHJvcGVydHlQYXJ0KGFuRXhlYywKKwkJCQlhbkV4ZWN1dGFibGVTcGVjLT5nZXRQcm9wZXJ0eVBhcnQoKSwgdGFibGVPZlZhcmlhYmxlKTsKKwl9CisKKwkvKgorCSAqIFVwZGF0ZSBkYXRhIHRhYmxlCisJICovCisJYW5FeGVjLT5zZXREYXRhKHRhYmxlT2ZWYXJpYWJsZSk7CisKKworCS8qCisJICogcHJlY29tcGlsaW5nIGV4ZWN1dGFibGUgY29tcG9zaXRlIHBhcnQKKwkgKi8KKwlpZiggYW5FeGVjdXRhYmxlU3BlYy0+aGFzTWFjaGluZSgpIHx8IGFuRXhlY3V0YWJsZVNwZWMtPmhhc1BvcnRTaWduYWwoKSApCisJeworCQlTcGVjaWZpZXIgYVNwZWNpZmllciggYW5FeGVjdXRhYmxlU3BlYy0+Z2V0U3BlY2lmaWVyKCkgKTsKKworCQkvLyBTZXQgdGhlIGluc3RhbmNlIFRISVMgYXQgZmlyc3QgcG9zaXRpb24gKGluZGV4ID0gMCkKKwkJSW5zdGFuY2VPZk1hY2hpbmUgKiBhTmV3SW5zdGFuY2UgPQorCQkJCUluc3RhbmNlT2ZNYWNoaW5lOjpuZXdJbnN0YW5jZU1vZGVsVGhpcygKKwkJCQkJCWFuRXhlYywgYW5FeGVjdXRhYmxlU3BlYywgYW5FeGVjLCBOVUxMLAorCQkJCQkJYW5FeGVjLT5nZXRJbnN0YW5jZU1vZGVsKCkuc2l6ZSgpLAorCQkJCQkJYVNwZWNpZmllci5zZXREZXNpZ25Nb2RlbCgpICk7CisKKwkJYW5FeGVjLT5zYXZlSW5zdGFuY2VNb2RlbChhTmV3SW5zdGFuY2UpOworCisJCWFOZXdJbnN0YW5jZSA9IEluc3RhbmNlT2ZNYWNoaW5lOjpuZXdUaGlzKGFuRXhlYywKKwkJCQlhTmV3SW5zdGFuY2UsIGFuRXhlYy0+Z2V0SW5zdGFuY2VTdGF0aWMoKS5zaXplKCkgKTsKKy8vCQlhTmV3SW5zdGFuY2UtPnNldEF1dG9TdGFydCggYW5FeGVjdXRhYmxlU3BlYy0+aGFzSW5pdGlhbEluc3RhbmNlKCkgKTsKKworCQlhbkV4ZWMtPnNhdmVJbnN0YW5jZVN0YXRpYyhhTmV3SW5zdGFuY2UpOworCX0KKworCXByZWNvbXBpbGVFeGVjdXRhYmxlQ29tcG9zaXRlUGFydChhbkV4ZWMsIGFuRXhlY3V0YWJsZVNwZWMpOworCisKKwkvKgorCSAqIHByZWNvbXBpbGluZyB0cmFuc2l0aW9uCisJICovCisJaWYoIGFuRXhlY3V0YWJsZVNwZWMtPmhhc091dGdvaW5nVHJhbnNpdGlvbigpICkKKwl7CisJCUJlaGF2aW9yYWxQYXJ0Ojpjb25zdF90cmFuc2l0aW9uX2l0ZXJhdG9yIGl0ID0gYW5FeGVjdXRhYmxlU3BlYy0+CisJCQkJZ2V0QmVoYXZpb3IoKS0+b3V0Z29pbmdfdHJhbnNpdGlvbl9iZWdpbigpOworCQlCZWhhdmlvcmFsUGFydDo6Y29uc3RfdHJhbnNpdGlvbl9pdGVyYXRvciBlbmRJdCA9IGFuRXhlY3V0YWJsZVNwZWMtPgorCQkJCWdldEJlaGF2aW9yKCktPm91dGdvaW5nX3RyYW5zaXRpb25fZW5kKCk7CisJCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCQl7CisJCQltVHJhbnNpdGlvbkNvbXBpbGVyLnByZWNvbXBpbGVUcmFuc2l0aW9uKCBhbkV4ZWMsIChpdCkgKTsKKwkJfQorCX0KKworCS8vIEFQUEVORCBORVcgRVhFQ1VUQUJMRSBJTiBUSEUgU1lTVEVNCisJLy8/PyBGb3IgcmV0cm9jb21wYXRpYml0eSBzZXJpYWxpemF0aW9uIG9yZGVyCisJZ2V0U3ltYm9sVGFibGUoKS5hZGRNYWNoaW5lRXhlY3V0YWJsZSggbUNvbmZpZ3VyYXRpb24uCisJCQlnZXRFeGVjdXRhYmxlU3lzdGVtKCkuc2F2ZUV4ZWN1dGFibGUoIGFuRXhlYyApICk7CisKKy8vQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiPioqIGVuZCBwcmVjb21waWxpbmcgZXhlY3V0YWJsZSBNT0RFTDo+IgorLy8JPDwgc3RkOjplbmRsIDw8IHN0cl9oZWFkZXIoIGFuRXhlY3V0YWJsZVNwZWMgKSA8PCBzdGQ6OmVuZGw7CisKKwlyZXR1cm4oIGFuRXhlYyApOworfQorCisKK3ZvaWQgQ29tcGlsZXI6OnByZWNvbXBpbGVFeGVjdXRhYmxlUHJvdG90eXBlKAorCQlFeGVjdXRhYmxlRm9ybSAqIGFDb250YWluZXIsIE1hY2hpbmUgKiBhbkV4ZWN1dGFibGVTcGVjKQoreworLy9BVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICI8KysgYmVnaW4gcHJlY29tcGlsaW5nIGV4ZWN1dGFibGUgI2luc3RhbmNlIG1vZGVsOj4iCisvLwkJPDwgc3RkOjplbmRsIDw8IHN0cl9oZWFkZXIoIGFuRXhlY3V0YWJsZVNwZWMgKSA8PCBzdGQ6OmVuZGw7CisKKwkJRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWMgPQorCQkJCXByZWNvbXBpbGVFeGVjdXRhYmxlTW9kZWwoYUNvbnRhaW5lciwgYW5FeGVjdXRhYmxlU3BlYyk7CisKKwkJYXZtX3NpemVfdCBpbml0aWFsSW5zdGFuY2VDb3VudCA9IDE7CisJCWF2bV9zaXplX3QgbWF4aW1hbEluc3RhbmNlQ291bnQgPSBBVk1fTlVNRVJJQ19NQVhfU0laRV9UOworCQlpZiggYW5FeGVjdXRhYmxlU3BlYy0+aGFzSW5zdGFuY2VTcGVjaWZpZXIoKSApCisJCXsKKwkJCWluaXRpYWxJbnN0YW5jZUNvdW50ID0gYW5FeGVjdXRhYmxlU3BlYy0+CisJCQkJCWdldEluc3RhbmNlU3BlY2lmaWVyKCktPmdldEluaXRpYWxJbnN0YW5jZUNvdW50KCk7CisKKwkJCW1heGltYWxJbnN0YW5jZUNvdW50ID0gYW5FeGVjdXRhYmxlU3BlYy0+CisJCQkJCWdldEluc3RhbmNlU3BlY2lmaWVyKCktPmdldE1heGltYWxJbnN0YW5jZUNvdW50KCk7CisJCX0KKworCQkvLyBJbnN0YW5jZXMgZm9yIDw8IE1PREVMID4+ICYgSU5TVEFOQ0UKKwkJSW5zdGFuY2VPZk1hY2hpbmUgKiBhTW9kZWxJbnN0YW5jZSA9IE5VTEw7CisJCWlmKCBhbkV4ZWN1dGFibGVTcGVjLT5nZXRTcGVjaWZpZXIoKS5pc0ZhbWlseUNvbXBvbmVudENvbXBvc2l0ZSgpICkKKwkJeworCQkJYU1vZGVsSW5zdGFuY2UgPSBhQ29udGFpbmVyLT5nZXRJbnN0YW5jZU1vZGVsKCkuCisJCQkJCWdldEJ5QXN0RWxlbWVudCggYW5FeGVjLT5nZXRBc3RFbGVtZW50KCkgKS5yYXdNYWNoaW5lKCk7CisJCQlpZiggYU1vZGVsSW5zdGFuY2UgPT0gTlVMTCApCisJCQl7CisJCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJCTw8ICJVbmZvdW5kIG1vZGVsIGluc3RhbmNlIG9mICNwcm90b3R5cGUgZXhlY3V0YWJsZSAhISEiCisJCQkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RyX2hlYWRlciggYW5FeGVjLT5nZXRBc3RFbGVtZW50KCkgKQorCQkJCQkJPDwgU0VORF9FWElUOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWFNb2RlbEluc3RhbmNlLT5pbmNySW5zdGFuY2lhdGlvbkNvdW50KCBpbml0aWFsSW5zdGFuY2VDb3VudCApOworCisJCQkJYW5FeGVjLT5pbmNyUG9zc2libGVTdGF0aWNJbnN0YW5jaWF0aW9uQ291bnQoIGluaXRpYWxJbnN0YW5jZUNvdW50ICk7CisJCQl9CisJCX0KKworCQlpZiggaW5pdGlhbEluc3RhbmNlQ291bnQgPiAwICkKKwkJeworCQkJU3BlY2lmaWVyIGFTcGVjaWZpZXIoIGFuRXhlY3V0YWJsZVNwZWMtPmdldFNwZWNpZmllcigpICk7CisKKwkJCUluc3RhbmNlT2ZNYWNoaW5lICogYU5ld0luc3RhbmNlID0gbmV3IEluc3RhbmNlT2ZNYWNoaW5lKAorCQkJCQlhQ29udGFpbmVyLCBhbkV4ZWN1dGFibGVTcGVjLCBhbkV4ZWMsIGFNb2RlbEluc3RhbmNlLAorCQkJCQlhQ29udGFpbmVyLT5nZXRJbnN0YW5jZVN0YXRpYygpLnNpemUoKSwKKwkJCQkJYVNwZWNpZmllci5zZXREZXNpZ25Qcm90b3R5cGVTdGF0aWMoKSApOworCisJCQlhTmV3SW5zdGFuY2UtPnNldEluc3RhbmNlQ291bnQoCisJCQkJCWluaXRpYWxJbnN0YW5jZUNvdW50LCBtYXhpbWFsSW5zdGFuY2VDb3VudCk7CisKKwkJCWFOZXdJbnN0YW5jZS0+c2V0QXV0b1N0YXJ0KCB0cnVlICk7CisKKwkJCXNldEluaGVyaXRlZFNwZWNpZmllcihhQ29udGFpbmVyLCBhTmV3SW5zdGFuY2UpOworCisJCQlhbkV4ZWMtPnNldFByb3RvdHlwZUluc3RhbmNlKCBhTmV3SW5zdGFuY2UgKTsKKworCQkJY29uc3QgU3ltYm9sICYgYmZJbnN0YW5jZSA9CisJCQkJCWFDb250YWluZXItPnNhdmVJbnN0YW5jZVN0YXRpYyhhTmV3SW5zdGFuY2UpOworCQkJZ2V0U3ltYm9sVGFibGUoKS5hZGRJbnN0YW5jZVN0YXRpYyhiZkluc3RhbmNlKTsKKworCQkJYVNwZWNpZmllci5zZXREZXNpZ25JbnN0YW5jZVN0YXRpYygpOworCisJCQlhdm1fc2l6ZV90IG9mZnNldCA9IDE7CisJCQlmb3IoIDsgb2Zmc2V0IDwgaW5pdGlhbEluc3RhbmNlQ291bnQgOyArK29mZnNldCApCisJCQl7CisJCQkJYU5ld0luc3RhbmNlID0gbmV3IEluc3RhbmNlT2ZNYWNoaW5lKAorCQkJCQkJYUNvbnRhaW5lciwgYW5FeGVjdXRhYmxlU3BlYywgYW5FeGVjLCBhTW9kZWxJbnN0YW5jZSwKKwkJCQkJCWFDb250YWluZXItPmdldEluc3RhbmNlU3RhdGljKCkuc2l6ZSgpLCBhU3BlY2lmaWVyKTsKKwkJCQlhTmV3SW5zdGFuY2UtPnNldEluc3RhbmNlQ291bnQoMSwgbWF4aW1hbEluc3RhbmNlQ291bnQpOworCisJCQkJYU5ld0luc3RhbmNlLT51cGRhdGVVZmlkKG9mZnNldCk7CisKKwkJCQlhTmV3SW5zdGFuY2UtPnNldEF1dG9TdGFydCggdHJ1ZSApOworCisJCQkJc2V0SW5oZXJpdGVkU3BlY2lmaWVyKGFDb250YWluZXIsIGFOZXdJbnN0YW5jZSk7CisKKwkJCQlnZXRTeW1ib2xUYWJsZSgpLmFkZEluc3RhbmNlU3RhdGljKAorCQkJCQkJYUNvbnRhaW5lci0+c2F2ZUluc3RhbmNlU3RhdGljKGFOZXdJbnN0YW5jZSkpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworLy8hIVtUUkFDRV06IHRvIGRlbGV0ZQorLy9BVk1fT1NfREVCVUcgPDwgInByZWNvbXBpbGVFeGVjdXRhYmxlUHJvdG90eXBlIEluaXRpYWwgSW5zdGFuY2lhdGlvbiBDb3VudDogMCIKKy8vCQk8PCBzdGQ6OmVuZGwgPDwgc3RyX2hlYWRlciggYW5FeGVjICkgPDwgc3RkOjplbmRsOworCQl9CisKKy8vQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiPisrIGVuZCBwcmVjb21waWxpbmcgZXhlY3V0YWJsZSAjaW5zdGFuY2UgbW9kZWw6PiIKKy8vCQk8PCBzdGQ6OmVuZGwgPDwgc3RyX2hlYWRlciggYW5FeGVjdXRhYmxlU3BlYyApIDw8IHN0ZDo6ZW5kbDsKK30KKworCit2b2lkIENvbXBpbGVyOjpwcmVjb21waWxlRXhlY3V0YWJsZUluc3RhbmNlU3RhdGljKAorCQlFeGVjdXRhYmxlRm9ybSAqIGFDb250YWluZXIsIE1hY2hpbmUgKiBhbkV4ZWN1dGFibGVTcGVjKQoreworLy9BVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICI8LS0gYmVnaW4gcHJlY29tcGlsaW5nIGV4ZWN1dGFibGUgI3N0YXRpYyBpbnN0YW5jZTo+IgorLy8JCTw8IHN0ZDo6ZW5kbCA8PCBzdHJfaGVhZGVyKCBhbkV4ZWN1dGFibGVTcGVjICkgPDwgc3RkOjplbmRsOworCisJCUV4ZWN1dGFibGVGb3JtICogYW5FeGVjID0KKwkJCQlnZXRTeW1ib2xUYWJsZSgpLnNlYXJjaEV4ZWN1dGFibGVNb2RlbChhbkV4ZWN1dGFibGVTcGVjKTsKKworCQlpZiggYW5FeGVjICE9IE5VTEwgKQorCQl7CisJCQlhdm1fc2l6ZV90IGluaXRpYWxJbnN0YW5jZUNvdW50ID0gYW5FeGVjdXRhYmxlU3BlYy0+CisJCQkJCWdldEluc3RhbmNlU3BlY2lmaWVyKCktPmdldEluaXRpYWxJbnN0YW5jZUNvdW50KCk7CisJCQlhdm1fc2l6ZV90IG1heGltYWxJbnN0YW5jZUNvdW50ID0gYW5FeGVjdXRhYmxlU3BlYy0+CisJCQkJCWdldEluc3RhbmNlU3BlY2lmaWVyKCktPmdldE1heGltYWxJbnN0YW5jZUNvdW50KCk7CisKKwkJCWFuRXhlYy0+aW5jclBvc3NpYmxlU3RhdGljSW5zdGFuY2lhdGlvbkNvdW50KCBpbml0aWFsSW5zdGFuY2VDb3VudCApOworCisJCQkvLyBJbnN0YW5jZXMgZm9yIDw8IE1PREVMID4+ICYgSU5TVEFOQ0UKKwkJCUluc3RhbmNlT2ZNYWNoaW5lICogYU1vZGVsSW5zdGFuY2UgPSBhQ29udGFpbmVyLT5nZXRJbnN0YW5jZU1vZGVsKCkuCisJCQkJCWdldEJ5QXN0RWxlbWVudCggYW5FeGVjLT5nZXRBc3RFbGVtZW50KCkgKS5yYXdNYWNoaW5lKCk7CisJCQlpZiggYU1vZGVsSW5zdGFuY2UgPT0gTlVMTCApCisJCQl7CisJCQkJU3BlY2lmaWVyIGFTcGVjaWZpZXIoCisJCQkJCQlhbkV4ZWMtPmdldEFzdE1hY2hpbmUoKS0+Z2V0U3BlY2lmaWVyKCkgKTsKKworCQkJCWFNb2RlbEluc3RhbmNlID0gbmV3IEluc3RhbmNlT2ZNYWNoaW5lKCBhQ29udGFpbmVyLAorCQkJCQkJYW5FeGVjLT5nZXRBc3RNYWNoaW5lKCksIGFuRXhlYywgTlVMTCwKKwkJCQkJCWFDb250YWluZXItPmdldEluc3RhbmNlTW9kZWwoKS5zaXplKCksCisJCQkJCQlhU3BlY2lmaWVyLnNldERlc2lnbk1vZGVsKCkgKTsKKworCQkJCWFNb2RlbEluc3RhbmNlLT5zZXRJbnN0YW5jZUNvdW50KAorCQkJCQkJaW5pdGlhbEluc3RhbmNlQ291bnQsIG1heGltYWxJbnN0YW5jZUNvdW50KTsKKworCQkJCWFDb250YWluZXItPnNhdmVJbnN0YW5jZU1vZGVsKCBhTW9kZWxJbnN0YW5jZSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWFNb2RlbEluc3RhbmNlLT5pbmNySW5zdGFuY2lhdGlvbkNvdW50KCBpbml0aWFsSW5zdGFuY2VDb3VudCApOworCQkJfQorCisJCQlJbnN0YW5jZU9mTWFjaGluZSAqIGFOZXdJbnN0YW5jZSA9IE5VTEw7CisJCQlhdm1fc2l6ZV90IG9mZnNldCA9IDA7CisJCQlmb3IoIDsgb2Zmc2V0IDwgaW5pdGlhbEluc3RhbmNlQ291bnQgOyArK29mZnNldCApCisJCQl7CisJCQkJYU5ld0luc3RhbmNlID0gbmV3IEluc3RhbmNlT2ZNYWNoaW5lKAorCQkJCQkJYUNvbnRhaW5lciwgYW5FeGVjdXRhYmxlU3BlYywgYW5FeGVjLCBhTW9kZWxJbnN0YW5jZSwKKwkJCQkJCWFDb250YWluZXItPmdldEluc3RhbmNlU3RhdGljKCkuc2l6ZSgpICk7CisKKwkJCQlhTmV3SW5zdGFuY2UtPnNldEluc3RhbmNlQ291bnQoCisJCQkJCQlpbml0aWFsSW5zdGFuY2VDb3VudCwgbWF4aW1hbEluc3RhbmNlQ291bnQpOworCisJCQkJaWYoIG9mZnNldCA+IDAgKQorCQkJCXsKKwkJCQkJYU5ld0luc3RhbmNlLT51cGRhdGVVZmlkKG9mZnNldCk7CisJCQkJfQorCisJCQkJYU5ld0luc3RhbmNlLT5zZXRBdXRvU3RhcnQoIGFuRXhlY3V0YWJsZVNwZWMtPmlzQXV0b1N0YXJ0KCkgKTsKKy8vCQkJCWFOZXdJbnN0YW5jZS0+c2V0QXV0b1N0YXJ0KCB0cnVlICk7CisKKwkJCQlzZXRJbmhlcml0ZWRTcGVjaWZpZXIoYUNvbnRhaW5lciwgYU5ld0luc3RhbmNlKTsKKworCQkJCWdldFN5bWJvbFRhYmxlKCkuYWRkSW5zdGFuY2VTdGF0aWMoCisJCQkJCQlhQ29udGFpbmVyLT5zYXZlSW5zdGFuY2VTdGF0aWMoYU5ld0luc3RhbmNlKSk7CisJCQl9CisJCX0KKworCQkvLyBFUlJPUiBSRVBPUlRJTkcKKwkJZWxzZSBpZiggZ2V0U3ltYm9sVGFibGUoKS5oYXNFcnJvcigpICkKKwkJeworCQkJaW5jckVycm9yQ291bnQoKTsKKwkJCWFuRXhlY3V0YWJsZVNwZWMtPmVycm9yTG9jYXRpb24oQVZNX09TX1dBUk4pCisJCQkJCTw8IGdldFN5bWJvbFRhYmxlKCkuZ2V0RXJyb3JNZXNzYWdlKCkKKwkJCQkJPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKwkJfQorCisJCWVsc2UKKwkJeworCisKKwkJCWluY3JFcnJvckNvdW50KCk7CisJCQlhbkV4ZWN1dGFibGVTcGVjLT5lcnJvckxvY2F0aW9uKEFWTV9PU19XQVJOKQorCQkJCQk8PCAiVW5mb3VuZCB0aGUgbW9kZWwgPDwgIiA8PCBhbkV4ZWN1dGFibGVTcGVjLT5zdHJUeXBlKCkKKwkJCQkJPDwgIiA+PiBvZiB0aGUgZXhlY3V0YWJsZSBpbnN0YW5jZSA8PCAiCisJCQkJCTw8IHN0cl9oZWFkZXIoIGFuRXhlY3V0YWJsZVNwZWMgKSA8PCAiID4+IgorCQkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCQl9CisKKy8vQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiPi0tIGVuZCBwcmVjb21waWxpbmcgZXhlY3V0YWJsZSAjZHluYW1pYyBpbnN0YW5jZTo+IgorLy8JCTw8IHN0ZDo6ZW5kbCA8PCBzdHJfaGVhZGVyKCBhbkV4ZWN1dGFibGVTcGVjICkgPDwgc3RkOjplbmRsOworfQorCisKK3ZvaWQgQ29tcGlsZXI6OnByZWNvbXBpbGVFeGVjdXRhYmxlSW5zdGFuY2VEeW5hbWlxdWUoCisJCUV4ZWN1dGFibGVGb3JtICogYUNvbnRhaW5lciwgTWFjaGluZSAqIGFuRXhlY3V0YWJsZVNwZWMpCit7CisvL0FWTV9PU19XQVJOIDw8IFRBQiA8PCAiPC0tIGJlZ2luIHByZWNvbXBpbGluZyBleGVjdXRhYmxlICNkeW5hbWljIGluc3RhbmNlOj4iCisvLwkJPDwgc3RkOjplbmRsIDw8IHN0cl9oZWFkZXIoIGFuRXhlY3V0YWJsZVNwZWMgKSA8PCBzdGQ6OmVuZGw7CisKKwkJRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWMgPQorCQkJCWdldFN5bWJvbFRhYmxlKCkuc2VhcmNoRXhlY3V0YWJsZU1vZGVsKGFuRXhlY3V0YWJsZVNwZWMpOworCisJCWF2bV9zaXplX3QgaW5pdGlhbEluc3RhbmNlQ291bnQgPSBhbkV4ZWN1dGFibGVTcGVjLT4KKwkJCQlnZXRJbnN0YW5jZVNwZWNpZmllcigpLT5nZXRJbml0aWFsSW5zdGFuY2VDb3VudCgpOworCQlhdm1fc2l6ZV90IG1heGltYWxJbnN0YW5jZUNvdW50ID0gYW5FeGVjdXRhYmxlU3BlYy0+CisJCQkJZ2V0SW5zdGFuY2VTcGVjaWZpZXIoKS0+Z2V0TWF4aW1hbEluc3RhbmNlQ291bnQoKTsKKworCQlpZiggYW5FeGVjICE9IE5VTEwgKQorCQl7CisJCQkvLyBJbnN0YW5jZXMgZm9yIDw8IE1PREVMID4+ICYgSU5TVEFOQ0UKKwkJCUNvbXBpbGF0aW9uRW52aXJvbm1lbnQgY0VOVihhbkV4ZWMpOworCisJCQlJbnN0YW5jZU9mTWFjaGluZSAqIGFNb2RlbEluc3RhbmNlID0KKwkJCQkJZ2V0U3ltYm9sVGFibGUoKS5zZWFyY2hJbnN0YW5jZU1vZGVsKAorCQkJCQkJCWNFTlYubUNUWCwgYW5FeGVjLT5nZXRBc3RFbGVtZW50KCkpLnJhd01hY2hpbmUoKTsKKwkJCWlmKCBhTW9kZWxJbnN0YW5jZSA9PSBOVUxMICkKKwkJCXsKKwkJCQlhTW9kZWxJbnN0YW5jZSA9IGFDb250YWluZXItPmdldEluc3RhbmNlTW9kZWwoKS4KKwkJCQkJCWdldEJ5QXN0RWxlbWVudCggYW5FeGVjLT5nZXRBc3RFbGVtZW50KCkgKS5yYXdNYWNoaW5lKCk7CisJCQl9CisJCQlpZiggYU1vZGVsSW5zdGFuY2UgPT0gTlVMTCApCisJCQl7CisJCQkJU3BlY2lmaWVyIGFTcGVjaWZpZXIoCisJCQkJCQlhbkV4ZWMtPmdldEFzdE1hY2hpbmUoKS0+Z2V0U3BlY2lmaWVyKCkgKTsKKworCQkJCWFNb2RlbEluc3RhbmNlID0gbmV3IEluc3RhbmNlT2ZNYWNoaW5lKCBhQ29udGFpbmVyLAorCQkJCQkJYW5FeGVjLT5nZXRBc3RNYWNoaW5lKCksIGFuRXhlYywgTlVMTCwKKwkJCQkJCWFDb250YWluZXItPmdldEluc3RhbmNlTW9kZWwoKS5zaXplKCksCisJCQkJCQlhU3BlY2lmaWVyLnNldERlc2lnbk1vZGVsKCkgKTsKKworCQkJCWFNb2RlbEluc3RhbmNlLT5zZXRJbnN0YW5jZUNvdW50KAorCQkJCQkJaW5pdGlhbEluc3RhbmNlQ291bnQsIG1heGltYWxJbnN0YW5jZUNvdW50KTsKKworCQkJCWFDb250YWluZXItPnNhdmVJbnN0YW5jZU1vZGVsKCBhTW9kZWxJbnN0YW5jZSApOworCisJCQkJYW5FeGVjLT5pbmNyUG9zc2libGVEeW5hbWljSW5zdGFuY2lhdGlvbkNvdW50KAorCQkJCQkJaW5pdGlhbEluc3RhbmNlQ291bnQgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlhTW9kZWxJbnN0YW5jZS0+aW5jclBvc3NpYmxlRHluYW1pY0luc3RhbmNpYXRpb25Db3VudCgKKwkJCQkJCWluaXRpYWxJbnN0YW5jZUNvdW50ICk7CisJCQl9CisKKwkJCUluc3RhbmNlT2ZNYWNoaW5lICogYU5ld0luc3RhbmNlID0gbmV3IEluc3RhbmNlT2ZNYWNoaW5lKAorCQkJCQlhQ29udGFpbmVyLCBhbkV4ZWN1dGFibGVTcGVjLCBhbkV4ZWMsIGFNb2RlbEluc3RhbmNlLAorCQkJCQlhQ29udGFpbmVyLT5nZXRJbnN0YW5jZVN0YXRpYygpLnNpemUoKSApOworCisJCQlhTmV3SW5zdGFuY2UtPnNldEluc3RhbmNlQ291bnQoCisJCQkJCWluaXRpYWxJbnN0YW5jZUNvdW50LCBtYXhpbWFsSW5zdGFuY2VDb3VudCk7CisKKwkJCWFOZXdJbnN0YW5jZS0+c2V0QXV0b1N0YXJ0KCB0cnVlICk7CisKKwkJCXNldEluaGVyaXRlZFNwZWNpZmllcihhQ29udGFpbmVyLCBhTmV3SW5zdGFuY2UpOworCisJCQlhQ29udGFpbmVyLT5zYXZlSW5zdGFuY2VEeW5hbWljKGFOZXdJbnN0YW5jZSk7CisJCX0KKworCQkvLyBFUlJPUiBSRVBPUlRJTkcKKwkJZWxzZSBpZiggZ2V0U3ltYm9sVGFibGUoKS5oYXNFcnJvcigpICkKKwkJeworCQkJaW5jckVycm9yQ291bnQoKTsKKwkJCWFuRXhlY3V0YWJsZVNwZWMtPmVycm9yTG9jYXRpb24oQVZNX09TX1dBUk4pCisJCQkJCTw8IGdldFN5bWJvbFRhYmxlKCkuZ2V0RXJyb3JNZXNzYWdlKCkKKwkJCQkJPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKwkJfQorCisJCWVsc2UKKwkJeworCQkJaW5jcldhcm5pbmdDb3VudCgpOworCQkJYW5FeGVjdXRhYmxlU3BlYy0+d2FybmluZ0xvY2F0aW9uKEFWTV9PU19MT0cpCisJCQkJCTw8ICJVbmZvdW5kIHRoZSBleGVjdXRhYmxlIG1vZGVsIDw8ICIKKwkJCQkJPDwgYW5FeGVjdXRhYmxlU3BlYy0+c3RyVHlwZSgpCisJCQkJCTw8ICIgPj4gb2YgdGhlICNkeW5hbWljIGluc3RhbmNlICEhISIKKwkJCQkJPDwgc3RkOjplbmRsIDw8IHN0cl9oZWFkZXIoIGFuRXhlY3V0YWJsZVNwZWMgKQorCQkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCisJCQlJbnN0YW5jZU9mTWFjaGluZSAqIGFOZXdJbnN0YW5jZSA9IG5ldyBJbnN0YW5jZU9mTWFjaGluZSgKKwkJCQkJYUNvbnRhaW5lciwgYW5FeGVjdXRhYmxlU3BlYywgYW5FeGVjLCBOVUxMLAorCQkJCQlhQ29udGFpbmVyLT5nZXRJbnN0YW5jZVN0YXRpYygpLnNpemUoKSApOworCisJCQlhTmV3SW5zdGFuY2UtPnNldEluc3RhbmNlQ291bnQoCisJCQkJCWluaXRpYWxJbnN0YW5jZUNvdW50LCBtYXhpbWFsSW5zdGFuY2VDb3VudCk7CisKKwkJCWFOZXdJbnN0YW5jZS0+c2V0QXV0b1N0YXJ0KCBmYWxzZSApOworCisJCQlzZXRJbmhlcml0ZWRTcGVjaWZpZXIoYUNvbnRhaW5lciwgYU5ld0luc3RhbmNlKTsKKworCQkJYUNvbnRhaW5lci0+c2F2ZUluc3RhbmNlRHluYW1pYyhhTmV3SW5zdGFuY2UpOworCQl9CisKKy8vQVZNX09TX1dBUk4gPDwgVEFCIDw8ICI+LS0gZW5kIHByZWNvbXBpbGluZyBleGVjdXRhYmxlICNkeW5hbWljIGluc3RhbmNlOj4iCisvLwkJPDwgc3RkOjplbmRsIDw8IHN0cl9oZWFkZXIoIGFuRXhlY3V0YWJsZVNwZWMgKSA8PCBzdGQ6OmVuZGw7Cit9CisKKwordm9pZCBDb21waWxlcjo6cHJlY29tcGlsZUV4ZWN1dGFibGVHcm91cCgKKwkJRXhlY3V0YWJsZUZvcm0gKiBhQ29udGFpbmVyLCBNYWNoaW5lICogYW5FeGVjdXRhYmxlU3BlYykKK3sKKy8vCU1hY2hpbmUgKiBjb250YWluZXJTTSA9IGFuRXhlY3V0YWJsZVNwZWMtPmdldENvbnRhaW5lck1hY2hpbmUoKTsKKy8vCisvLwlpZiggYW5FeGVjdXRhYmxlU3BlYy0+Z2V0U3BlY2lmaWVyKCkuaXNHcm91cEV2ZXJ5KCkpCisvLwl7CisvLwkJY29udGFpbmVyU00tPmFwcGVuZE91dGdvaW5nVHJhbnNpdGlvblRvRXZlcnlTdGF0ZShhbkV4ZWN1dGFibGVTcGVjKTsKKy8vCX0KKy8vCWVsc2UgaWYoIGFuRXhlY3V0YWJsZVNwZWMtPmdldFNwZWNpZmllcigpLmlzR3JvdXBTb21lKCkpCisvLwl7CisvLwkJY29udGFpbmVyU00tPmFwcGVuZE91dGdvaW5nVHJhbnNpdGlvblRvU29tZVN0YXRlKGFuRXhlY3V0YWJsZVNwZWMpOworLy8JfQorLy8JZWxzZSBpZiggYW5FeGVjdXRhYmxlU3BlYy0+Z2V0U3BlY2lmaWVyKCkuaXNHcm91cEV4Y2VwdCgpICkKKy8vCXsKKy8vCQljb250YWluZXJTTS0+YXBwZW5kT3V0Z29pbmdUcmFuc2l0aW9uVG9FeGNlcHRTdGF0ZShhbkV4ZWN1dGFibGVTcGVjKTsKKy8vCX0KK30KKworCisKKworCisvKioKKyAqIHByZWNvbXBpbGUKKyAqIHNwZWNpZmljYXRpb24KKyAqLwordm9pZCBDb21waWxlcjo6cHJlY29tcGlsZVN5c3RlbShTeXN0ZW0gJiBhU3lzdGVtKQoreworLy9BVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICI8IGJlZ2luIHByZWNvbXBpbGluZyBzcGVjaWZpY2F0aW9uOj4gIgorLy8JCTw8IGFTeXN0ZW0uZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCBzdGQ6OmVuZGw7CisKKwkvKgorCSAqIEZvciB0aGUgc3lzdGVtIGV4ZWN1dGFibGUKKwkgKi8KKwlFeGVjdXRhYmxlRm9ybSAqIHN5c3RlbUV4ZWMgPSBuZXcgRXhlY3V0YWJsZUZvcm0oCisJCQltQ29uZmlndXJhdGlvbi5nZXRFeGVjdXRhYmxlU3lzdGVtKCksIE5VTEwsICgmIGFTeXN0ZW0pKTsKKworCS8vIEFQUEVORCBORVcgRVhFQ1VUQUJMRSBJTiBUSEUgU1lTVEVNCisvLwkvLz8/IEZvciByZXRyb2NvbXBhdGliaXR5IHNlcmlhbGl6YXRpb24gb3JkZXIKKy8vCWdldFN5bWJvbFRhYmxlKCkuYWRkTWFjaGluZUV4ZWN1dGFibGUoCisvLwkJCW1FeGVjdXRhYmxlU3lzdGVtLT5zYXZlRXhlY3V0YWJsZSggc3lzdGVtRXhlYyApICk7CisKKwkvLyBTdHJ1Y3R1cmFsIGRlY29tcG9zaXRvbgorCXN5c3RlbUV4ZWMtPnNldE1haW5Db21wb25lbnQoIHRydWUgKTsKKworCisJU3BlY2lmaWVyIGFTcGVjaWZpZXIoIGFTeXN0ZW0uZ2V0U3BlY2lmaWVyKCkgKTsKKworCUluc3RhbmNlT2ZNYWNoaW5lICogYU5ld0luc3RhbmNlID0gbmV3IEluc3RhbmNlT2ZNYWNoaW5lKE5VTEwsICgmIGFTeXN0ZW0pLAorCQkJc3lzdGVtRXhlYywgTlVMTCwgMCwgYVNwZWNpZmllci5zZXREZXNpZ25Qcm90b3R5cGVTdGF0aWMoKSApOworCisJYU5ld0luc3RhbmNlLT5zZXRBdXRvU3RhcnQoIHRydWUgKTsKKy8vCWFTeXN0ZW0uZ2V0SW5zdGFuY2VTcGVjaWZpZXIoKS0+aGFzSW5pdGlhbEluc3RhbmNlKCkgKTsKKworCWFOZXdJbnN0YW5jZS0+c2V0SW5zdGFuY2VDb3VudCgxLCAxKTsKKworCXN5c3RlbUV4ZWMtPnNldFByb3RvdHlwZUluc3RhbmNlKCBhTmV3SW5zdGFuY2UgKTsKKwlzeXN0ZW1FeGVjLT5pbmNyUG9zc2libGVTdGF0aWNJbnN0YW5jaWF0aW9uQ291bnQoMSk7CisKKwlnZXRTeW1ib2xUYWJsZSgpLmFkZEluc3RhbmNlU3RhdGljKCBtQ29uZmlndXJhdGlvbi4KKwkJCWdldEV4ZWN1dGFibGVTeXN0ZW0oKS5zZXRTeXN0ZW1JbnN0YW5jZShhTmV3SW5zdGFuY2UpICk7CisKKworCS8vIFNldCB0aGUgaW5zdGFuY2UgVEhJUyBpbiBmaXJzdCBwb3NpdGlvbiAoaW5kZXggPSAwKQorCS8vIGZvciA8PCBNT0RFTCA+PiAmIElOU1RBTkNFCisJYU5ld0luc3RhbmNlID0gSW5zdGFuY2VPZk1hY2hpbmU6Om5ld0luc3RhbmNlTW9kZWxUaGlzKAorCQkJc3lzdGVtRXhlYywgKCYgYVN5c3RlbSksIHN5c3RlbUV4ZWMsIE5VTEwsCisJCQlzeXN0ZW1FeGVjLT5nZXRJbnN0YW5jZU1vZGVsKCkuc2l6ZSgpLAorCQkJYVNwZWNpZmllci5zZXREZXNpZ25Nb2RlbCgpICk7CisKKwlhTmV3SW5zdGFuY2UtPnNldEluc3RhbmNlQ291bnQoMCwgMSk7CisKKwlzeXN0ZW1FeGVjLT5zYXZlSW5zdGFuY2VNb2RlbCggYU5ld0luc3RhbmNlICk7CisKKwlhTmV3SW5zdGFuY2UgPSBJbnN0YW5jZU9mTWFjaGluZTo6bmV3VGhpcyhzeXN0ZW1FeGVjLAorCQkJYU5ld0luc3RhbmNlLCBzeXN0ZW1FeGVjLT5nZXRJbnN0YW5jZVN0YXRpYygpLnNpemUoKSApOworCisJc3lzdGVtRXhlYy0+c2F2ZUluc3RhbmNlU3RhdGljKGFOZXdJbnN0YW5jZSk7CisKKwkvKgorCSAqIEFsbG9jYXRpb24gb2YgZGVjbGFyYXRpb24gY29udGVudHMgOj4KKwkgKiBjb25zdGFudCwgdmFyaWFibGUsIHR5cGVkZWYsIGJ1ZmZlciwgcG9ydAorCSAqLworCWlmKCBhU3lzdGVtLmhhc1Byb3BlcnR5KCkgKQorCXsKKwkJVGFibGVPZkluc3RhbmNlT2ZEYXRhIHRhYmxlT2ZWYXJpYWJsZTsKKworCQlwcmVjb21waWxlUHJvcGVydHlQYXJ0KHN5c3RlbUV4ZWMsCisJCQkJYVN5c3RlbS5nZXRQcm9wZXJ0eVBhcnQoKSwgdGFibGVPZlZhcmlhYmxlKTsKKworCQkvKgorCQkgKiBVcGRhdGUgZGF0YSB0YWJsZQorCQkgKi8KKwkJc3lzdGVtRXhlYy0+c2V0RGF0YSh0YWJsZU9mVmFyaWFibGUpOworCX0KKworCisJLyoKKwkgKiBwcmVjb21waWxpbmcgZXhlY3V0YWJsZSBjb21wb3NpdGUgcGFydAorCSAqLworCXByZWNvbXBpbGVFeGVjdXRhYmxlQ29tcG9zaXRlUGFydChzeXN0ZW1FeGVjLCAoJiBhU3lzdGVtKSk7CisKKy8vQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiPiBlbmQgcHJlY29tcGlsaW5nIHNwZWNpZmljYXRpb246PiAiCisvLwkJPDwgYVN5c3RlbS5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisKKwkvLyBBUFBFTkQgTkVXIEVYRUNVVEFCTEUgSU4gVEhFIFNZU1RFTQorCS8vPz8gRm9yIHJldHJvY29tcGF0aWJpdHkgc2VyaWFsaXphdGlvbiBvcmRlcgorCWdldFN5bWJvbFRhYmxlKCkuYWRkTWFjaGluZUV4ZWN1dGFibGUoIG1Db25maWd1cmF0aW9uLgorCQkJZ2V0RXhlY3V0YWJsZVN5c3RlbSgpLnNhdmVFeGVjdXRhYmxlKCBzeXN0ZW1FeGVjICkgKTsKK30KKworCisvKioKKyAqIHNldEluaGVyaXRlZFNwZWNpZmllciBmcm9tIGNvbnRhaW5lciB0byBvd25lZCBlbGVtZW50cworICovCit2b2lkIENvbXBpbGVyOjpzZXRJbmhlcml0ZWRTcGVjaWZpZXIoCisJCUV4ZWN1dGFibGVGb3JtICogYUNvbnRhaW5lciwgRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGUpCit7CisJaWYoIGFDb250YWluZXItPmdldFNwZWNpZmllcigpLmhhc0ZlYXR1cmVJbnB1dEVuYWJsZWQoKSApCisJeworCQlhbkV4ZWN1dGFibGUtPmdldHdTcGVjaWZpZXIoKS5zZXRGZWF0dXJlSW5wdXRFbmFibGVkKCk7CisKKwkJY29uc3RfY2FzdDwgTWFjaGluZSAqID4oYW5FeGVjdXRhYmxlLT5nZXRBc3RNYWNoaW5lKCkgKQorCQkJCS0+Z2V0d1NwZWNpZmllcigpLnNldEZlYXR1cmVJbnB1dEVuYWJsZWQoKTsKKworCX0KK30KKwordm9pZCBDb21waWxlcjo6c2V0SW5oZXJpdGVkU3BlY2lmaWVyKAorCQlFeGVjdXRhYmxlRm9ybSAqIGFDb250YWluZXIsIEluc3RhbmNlT2ZNYWNoaW5lICogYU1hY2hpbmUpCit7CisJaWYoIGFDb250YWluZXItPmdldFNwZWNpZmllcigpLmhhc0ZlYXR1cmVJbnB1dEVuYWJsZWQoKSApCisJeworCQlhTWFjaGluZS0+Z2V0d1NwZWNpZmllcigpLnNldEZlYXR1cmVJbnB1dEVuYWJsZWQoKTsKKwl9Cit9CisKKworCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENPTVBJTEFUSU9OIE9GIEVYRUNVVEFCTEUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKwordm9pZCBDb21waWxlcjo6Y29tcGlsZUV4ZWN1dGFibGVTeXN0ZW0oKQoreworCVRhYmxlT2ZFeGVjdXRhYmxlRm9ybTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGl0UHJvYzsKKwlUYWJsZU9mRXhlY3V0YWJsZUZvcm06OmNvbnN0X3Jhd19pdGVyYXRvciBlbmRQcm9jOworCisJVGFibGVPZkV4ZWN1dGFibGVGb3JtOjpjb25zdF9yYXdfaXRlcmF0b3IgaXRFeGVjID0KKwkJCW1Db25maWd1cmF0aW9uLmdldEV4ZWN1dGFibGVTeXN0ZW0oKS5nZXRFeGVjdXRhYmxlcygpLmJlZ2luKCk7CisJVGFibGVPZkV4ZWN1dGFibGVGb3JtOjpjb25zdF9yYXdfaXRlcmF0b3IgZW5kSXQgPQorCQkJbUNvbmZpZ3VyYXRpb24uZ2V0RXhlY3V0YWJsZVN5c3RlbSgpLmdldEV4ZWN1dGFibGVzKCkuZW5kKCk7CisJZm9yKCA7IGl0RXhlYyAhPSBlbmRJdCA7ICsraXRFeGVjICkKKwl7CisJCWNvbXBpbGVFeGVjdXRhYmxlKCAoaXRFeGVjKSApOworCisJCWlmKCAoaXRFeGVjKS0+aGFzRXhlY3V0YWJsZSgpICkKKwkJeworCQkJaXRQcm9jID0gKGl0RXhlYyktPmdldEV4ZWN1dGFibGVzKCkuYmVnaW4oKTsKKwkJCWVuZFByb2MgPSAoaXRFeGVjKS0+Z2V0RXhlY3V0YWJsZXMoKS5lbmQoKTsKKwkJCWZvciggOyBpdFByb2MgIT0gZW5kUHJvYyA7ICsraXRQcm9jICkKKwkJCXsKKwkJCQljb21waWxlUHJvY2VkdXJlKCBpdFByb2MgKTsKKwkJCX0KKwkJfQorCX0KK30KKworCit2b2lkIENvbXBpbGVyOjpjb21waWxlRXhlY3V0YWJsZShFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZSkKK3sKKwlpZiggYW5FeGVjdXRhYmxlLT5pc0NvbXBpbGVkRmxhZygpICkKKwl7CisJCXJldHVybjsKKwl9CisJZWxzZQorCXsKKwkJYW5FeGVjdXRhYmxlLT5zZXRDb21waWxlZEZsYWcoKTsKKwl9CisKK0FWTV9JRl9ERUJVR19GTEFHKCBDT01QSUxJTkcgKQorCUFWTV9PU19UUkFDRSA8PCBJTkNSX0lOREVOVF9UQUIgPDwgIjx8IGNvbXBpbGluZzxleGVjdXRhYmxlPjogIgorCQkJPDwgYW5FeGVjdXRhYmxlLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBDT01QSUxJTkcgKQorCisJLy8gQ29tcGlsZSBkYXRhICYgYWxsIG1hY2hpbmUgTU9FIHByb2dyYW0KKwljb21waWxlQmFzZU1hY2hpbmUoYW5FeGVjdXRhYmxlKTsKKworCS8vIENvbXBpbGUgZGF0YSAmIGFsbCBpbnN0YW5jZSBNT0UgcHJvZ3JhbQorCWNvbXBpbGVBbGxJbnN0YW5jZXMoIGFuRXhlY3V0YWJsZSApOworCisJaWYoIGFuRXhlY3V0YWJsZS0+Z2V0QXN0RWxlbWVudCgpLT5pczwgU3lzdGVtID4oKSApCisJeworCQljb21waWxlU3lzdGVtKCBhbkV4ZWN1dGFibGUgKTsKKwl9CisKKwllbHNlIGlmKCBhbkV4ZWN1dGFibGUtPmdldEFzdEVsZW1lbnQoKS0+aXNfZXhhY3RseTwgTWFjaGluZSA+KCkgKQorCXsKKwkJaWYoIGFuRXhlY3V0YWJsZS0+Z2V0U3BlY2lmaWVyKCkuaXNGYW1pbHlDb21wb25lbnRTdGF0ZW1hY2hpbmUoKSApCisJCXsKKwkJCWNvbXBpbGVTdGF0ZW1hY2hpbmUoIGFuRXhlY3V0YWJsZSApOworCQl9CisKKwkJZWxzZQorCQl7CisJCQljb21waWxlTWFjaGluZSggYW5FeGVjdXRhYmxlICk7CisJCX0KKwl9CisKKwllbHNlCisJeworCQlBVk1fT1NfRVhJVCggRkFJTEVEICkKKwkJCQk8PCAiVW5leHBlY3RlZCBleGVjdXRhYmxlIGZvcm0gZm9yIGNvbXBpbGluZyA6XG4iCisJCQkJPDwgYW5FeGVjdXRhYmxlLT50b1N0cmluZygpCisJCQkJPDwgU0VORF9FWElUOworCX0KKworQVZNX0lGX0RFQlVHX0ZMQUcoIENPTVBJTElORyApCisJQVZNX09TX1RSQUNFIDw8IFRBQl9ERUNSX0lOREVOVCA8PCAiPnwgY29tcGlsaW5nPGV4ZWN1dGFibGU+OiAiCisJCQk8PCBhbkV4ZWN1dGFibGUtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIENPTVBJTElORyApCit9CisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ09NUElMQVRJT04gT0YgSU5TVEFOQ0UgTUFDSElORSBQQVJBTQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLwordm9pZCBDb21waWxlcjo6Y29tcGlsZUFsbEluc3RhbmNlcyhFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZUZvcm0pCit7CisJaWYoIGFuRXhlY3V0YWJsZUZvcm0tPmhhc0luc3RhbmNlU3RhdGljKCkgKQorCXsKKwkJLy8gQ29tcGlsYXRpb24gb2YgSW5zdGFuY2VPZk1hY2hpbmUgUGFyYW1ldGVycyAvIEJlaGF2aW9ycworCQlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBpdE1hY2hpbmUgPQorCQkJCWFuRXhlY3V0YWJsZUZvcm0tPmluc3RhbmNlX3N0YXRpY19iZWdpbigpOworCQlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBlbmRNYWNoaW5lID0KKwkJCQlhbkV4ZWN1dGFibGVGb3JtLT5pbnN0YW5jZV9zdGF0aWNfZW5kKCk7CisJCWZvciggOyBpdE1hY2hpbmUgIT0gZW5kTWFjaGluZSA7ICsraXRNYWNoaW5lICkKKwkJeworCQkJY29tcGlsZUluc3RhbmNlKGFuRXhlY3V0YWJsZUZvcm0sICgqaXRNYWNoaW5lKS5yYXdNYWNoaW5lKCkpOworCisJCQlpZiggbm90ICgqaXRNYWNoaW5lKS5oYXNFeGVjdXRhYmxlKCkgKQorCQkJeworCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQk8PCAiVW5leHBlY3RlZCBhICNzdGF0aWMgaW5zdGFuY2UgIgorCQkJCQkJCQkid2l0aG91dCBleGVjdXRhYmxlIG1vZGVsICEhISIKKwkJCQkJCTw8IHN0ZDo6ZW5kbCA8PCBzdHJfaGVhZGVyKCAoKml0TWFjaGluZSkgKQorCQkJCQkJPDwgU0VORF9FWElUOworCQkJfQorCQl9CisJfQorCisJaWYoIGFuRXhlY3V0YWJsZUZvcm0tPmhhc0luc3RhbmNlRHluYW1pYygpICkKKwl7CisJCS8vIENvbXBpbGF0aW9uIG9mIEluc3RhbmNlT2ZNYWNoaW5lIFBhcmFtZXRlcnMgLyBCZWhhdmlvcnMKKwkJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgaXRNYWNoaW5lID0KKwkJCQlhbkV4ZWN1dGFibGVGb3JtLT5pbnN0YW5jZV9keW5hbWljX2JlZ2luKCk7CisJCVRhYmxlT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGVuZE1hY2hpbmUgPQorCQkJCWFuRXhlY3V0YWJsZUZvcm0tPmluc3RhbmNlX2R5bmFtaWNfZW5kKCk7CisJCWZvciggOyBpdE1hY2hpbmUgIT0gZW5kTWFjaGluZSA7ICsraXRNYWNoaW5lICkKKwkJeworCQkJY29tcGlsZUluc3RhbmNlKGFuRXhlY3V0YWJsZUZvcm0sICgqaXRNYWNoaW5lKS5yYXdNYWNoaW5lKCkpOworCisJCQlpZiggbm90ICgqaXRNYWNoaW5lKS5oYXNFeGVjdXRhYmxlKCkgKQorCQkJeworCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQk8PCAiVW5leHBlY3RlZCBhICNkeW5hbWljIGluc3RhbmNlICIKKwkJCQkJCQkJIndpdGhvdXQgZXhlY3V0YWJsZSBtb2RlbCAhISEiCisJCQkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RyX2hlYWRlciggKCppdE1hY2hpbmUpICkKKwkJCQkJCTw8IFNFTkRfRVhJVDsKKwkJCX0KKwkJfQorCX0KK30KKwordm9pZCBDb21waWxlcjo6Y29tcGlsZUluc3RhbmNlKAorCQlFeGVjdXRhYmxlRm9ybSAqIHRoZUV4ZWN1dGFibGVDb250YWluZXIsIEluc3RhbmNlT2ZNYWNoaW5lICogYW5JbnN0YW5jZSkKK3sKKwljb25zdCBNYWNoaW5lICogYW5FeGVjdXRhYmxlU3BlYyA9IGFuSW5zdGFuY2UtPmdldEFzdE1hY2hpbmUoKTsKKworLy9BVk1fT1NfV0FSTiA8PCBUQUIgPDwgIjwtLSBiZWdpbiBjb21waWxpbmcgZXhlY3V0YWJsZSBpbnN0YW5jZTo+IiA8PCBzdGQ6OmVuZGwKKy8vCQkJPDwgdG9fc3RyZWFtKCBhbkluc3RhbmNlICkvLyA8PCBzdGQ6OmVuZGwKKy8vCQkJPDwgdG9fc3RyZWFtKCBhbkV4ZWN1dGFibGVTcGVjICkgPDwgc3RkOjplbmRsOworCisJRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWMgPSBhbkluc3RhbmNlLT5nZXRFeGVjdXRhYmxlKCk7CisKKwlpZiggYW5FeGVjID09IE5VTEwgKQorCXsKKwkJYW5FeGVjID0gZ2V0U3ltYm9sVGFibGUoKS5zZWFyY2hFeGVjdXRhYmxlTW9kZWwoYW5FeGVjdXRhYmxlU3BlYyk7CisKKwkJaWYoIGFuRXhlYyAhPSBOVUxMICkKKwkJeworCQkJYW5JbnN0YW5jZS0+c2V0RXhlY3V0YWJsZSggYW5FeGVjICk7CisKKwkJCWFuSW5zdGFuY2UtPnNldEF1dG9TdGFydCggdHJ1ZSApOworCisJCQkvLyBJbnN0YW5jZXMgZm9yIDw8IE1PREVMID4+ICYgSU5TVEFOQ0UKKwkJCUNvbXBpbGF0aW9uRW52aXJvbm1lbnQgY0VOVihhbkV4ZWMpOworCisJCQlJbnN0YW5jZU9mTWFjaGluZSAqIGFNb2RlbEluc3RhbmNlID0KKwkJCQkJZ2V0U3ltYm9sVGFibGUoKS5zZWFyY2hJbnN0YW5jZU1vZGVsKAorCQkJCQkJCWNFTlYubUNUWCwgYW5FeGVjLT5nZXRBc3RFbGVtZW50KCkpLnJhd01hY2hpbmUoKTsKKwkJCWlmKCBhTW9kZWxJbnN0YW5jZSA9PSBOVUxMICkKKwkJCXsKKwkJCQlhTW9kZWxJbnN0YW5jZSA9IHRoZUV4ZWN1dGFibGVDb250YWluZXItPmdldEluc3RhbmNlTW9kZWwoKS4KKwkJCQkJCWdldEJ5QXN0RWxlbWVudCggYW5FeGVjLT5nZXRBc3RFbGVtZW50KCkgKS5yYXdNYWNoaW5lKCk7CisJCQl9CisJCQlpZiggYU1vZGVsSW5zdGFuY2UgIT0gTlVMTCApCisJCQl7CisJCQkJYW5JbnN0YW5jZS0+c2V0SW5zdGFuY2VNb2RlbCggYU1vZGVsSW5zdGFuY2UgKTsKKwkJCX0KKworCQkJaWYoIGFuSW5zdGFuY2UtPmdldFNwZWNpZmllcigpLmhhc0Rlc2lnbkluc3RhbmNlRHluYW1pYygpICkKKwkJCXsKKwkJCQlpZiggYU1vZGVsSW5zdGFuY2UgIT0gTlVMTCApCisJCQkJeworCQkJCQlhTW9kZWxJbnN0YW5jZS0+aW5jclBvc3NpYmxlRHluYW1pY0luc3RhbmNpYXRpb25Db3VudCggMSApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlhbkV4ZWMtPmluY3JQb3NzaWJsZUR5bmFtaWNJbnN0YW5jaWF0aW9uQ291bnQoIDEgKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJYW5FeGVjLT5pbmNyUG9zc2libGVTdGF0aWNJbnN0YW5jaWF0aW9uQ291bnQoIDEgKTsKKwkJCX0KKwkJfQorCisJCS8vIEVSUk9SIFJFUE9SVElORworCQllbHNlIGlmKCBnZXRTeW1ib2xUYWJsZSgpLmhhc0Vycm9yKCkgKQorCQl7CisJCQlpbmNyRXJyb3JDb3VudCgpOworCQkJYW5FeGVjdXRhYmxlU3BlYy0+ZXJyb3JMb2NhdGlvbihBVk1fT1NfV0FSTikKKwkJCQkJPDwgZ2V0U3ltYm9sVGFibGUoKS5nZXRFcnJvck1lc3NhZ2UoKQorCQkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCQl9CisKKwkJZWxzZQorCQl7CisJCQlpbmNyRXJyb3JDb3VudCgpOworCQkJYW5FeGVjdXRhYmxlU3BlYy0+ZXJyb3JMb2NhdGlvbihBVk1fT1NfV0FSTikKKwkJCQkJPDwgIlVuZm91bmQgdGhlIG1vZGVsIDw8ICIKKwkJCQkJPDwgYW5FeGVjdXRhYmxlU3BlYy0+c3RyVHlwZSgpCisJCQkJCTw8ICIgPj4gb2YgdGhlIHN0YXRlbWFjaGluZSBpbnN0YW5jZSA8PCAiCisJCQkJCTw8IHN0cl9oZWFkZXIoIGFuRXhlY3V0YWJsZVNwZWMgKSA8PCAiID4+IgorCQkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCQl9CisJfQorCisJaWYoIGFuRXhlYyAhPSBOVUxMICkKKwl7CisJCWNvbXBpbGVFeGVjdXRhYmxlKCBhbkV4ZWMgKTsKKworCQlpZiggYW5FeGVjLT5oYXNQYXJhbVJldHVybigpICkKKwkJeworCQkJY29tcGlsZUluc3RhbmNlUGFyYW1ldGVycyh0aGVFeGVjdXRhYmxlQ29udGFpbmVyLCBhbkluc3RhbmNlKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCTw8ICJVbmV4cGVjdGVkIGEgaW5zdGFuY2Ugd2l0aG91dCBleGVjdXRhYmxlIG1vZGVsICEhISIKKwkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RyX2hlYWRlciggYW5JbnN0YW5jZSApCisJCQkJPDwgU0VORF9FWElUOworCisJCXJldHVybjsKKwl9CisKKwlCZWhhdmlvcmFsUGFydCAqIHRoZUJlaGF2aW9yID0gYW5FeGVjdXRhYmxlU3BlYy0+Z2V0QmVoYXZpb3IoKTsKKworCWlmKCB0aGVCZWhhdmlvciAhPSBOVUxMICkKKwl7CisJCS8qCisJCSAqIG9uQ3JlYXRlCisJCSAqLworCQlpZiggdGhlQmVoYXZpb3ItPmhhc09uQ3JlYXRlKCkKKwkJCSYmIFN0YXRlbWVudFR5cGVDaGVja2VyOjpkb1NvbWV0aGluZyh0aGVCZWhhdmlvci0+Z2V0T25DcmVhdGUoKSkgKQorCQl7CisJCQlDb21waWxhdGlvbkVudmlyb25tZW50IGNFTlYoTlVMTCwgYW5FeGVjLCB0aGVFeGVjdXRhYmxlQ29udGFpbmVyKTsKKworCQkJQkZDb2RlIG9uQ3JlYXRlID0gdGhlQmVoYXZpb3ItPmdldE9uQ3JlYXRlKCk7CisJCQlpZiggYW5FeGVjLT5oYXNPbkNyZWF0ZSgpCisJCQkJJiYgYW5JbnN0YW5jZS0+Z2V0U3BlY2lmaWVyKCkuaGFzRGVzaWduSW5zdGFuY2VOb3RNb2RlbCgpICkKKwkJCXsKKwkJCQlvbkNyZWF0ZSA9IFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlRmxhdCgKKwkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU0VRVUVOQ0UsCisJCQkJCQlhbkV4ZWMtPmdldE9uQ3JlYXRlKCksIG9uQ3JlYXRlICk7CisJCQl9CisKKwkJCWFuSW5zdGFuY2UtPnNldE9uQ3JlYXRlKAorCQkJCQltQXZtY29kZUNvbXBpbGVyLmNvbXBpbGVTdGF0ZW1lbnQoY0VOVi5tQ1RYLCBvbkNyZWF0ZSkgKTsKKwkJfQorCisJCS8qCisJCSAqIG9uU3RhcnQKKwkJICovCisJCWlmKCB0aGVCZWhhdmlvci0+aGFzT25TdGFydCgpCisJCQkmJiBTdGF0ZW1lbnRUeXBlQ2hlY2tlcjo6ZG9Tb21ldGhpbmcodGhlQmVoYXZpb3ItPmdldE9uU3RhcnQoKSkgKQorCQl7CisJCQlDb21waWxhdGlvbkVudmlyb25tZW50IGNFTlYoTlVMTCwgYW5FeGVjLCB0aGVFeGVjdXRhYmxlQ29udGFpbmVyKTsKKworCQkJQkZDb2RlIG9uU3RhcnQgPSB0aGVCZWhhdmlvci0+Z2V0T25TdGFydCgpOworCQkJaWYoIGFuRXhlYy0+aGFzT25TdGFydCgpICkKKwkJCXsKKwkJCQlvblN0YXJ0ID0gU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGVGbGF0KAorCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TRVFVRU5DRSwKKwkJCQkJCWFuRXhlYy0+Z2V0T25TdGFydCgpLCBvblN0YXJ0ICk7CisJCQl9CisKKwkJCWlmKCBhbkV4ZWMtPmhhc09uSW5pdCgpICkKKwkJCXsKKwkJCQlvblN0YXJ0ID0gU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGVGbGF0KAorCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TRVFVRU5DRSwKKwkJCQkJCW9uU3RhcnQsIGFuRXhlYy0+Z2V0T25Jbml0KCkgKTsKKwkJCX0KKworCQkJYW5JbnN0YW5jZS0+c2V0T25TdGFydCgKKwkJCQkJbUF2bWNvZGVDb21waWxlci5jb21waWxlU3RhdGVtZW50KGNFTlYubUNUWCwgb25TdGFydCkgKTsKKwkJfQorCX0KKworLy9BVk1fT1NfV0FSTiA8PCBUQUIgPDwgIj4tLSBlbmQgY29tcGlsaW5nIGV4ZWN1dGFibGUgaW5zdGFuY2U6PiIgPDwgc3RkOjplbmRsCisvLwkJCTw8IHRvX3N0cmVhbSggYW5JbnN0YW5jZSApLy8gPDwgc3RkOjplbmRsCisvLwkJCTw8IHN0cl9oZWFkZXIoIGFuRXhlY3V0YWJsZVNwZWMgKSA8PCBzdGQ6OmVuZGw7Cit9CisKKwordm9pZCBDb21waWxlcjo6Y29tcGlsZUluc3RhbmNlUGFyYW1ldGVycygKKwkJRXhlY3V0YWJsZUZvcm0gKiB0aGVFeGVjdXRhYmxlQ29udGFpbmVyLCBJbnN0YW5jZU9mTWFjaGluZSAqIGFuSW5zdGFuY2UpCit7CisJRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGVGb3JtID0gYW5JbnN0YW5jZS0+Z2V0RXhlY3V0YWJsZSgpOworCisJY29uc3QgTWFjaGluZSAqIGFNYWNoaW5lID0gYW5JbnN0YW5jZS0+Z2V0QXN0TWFjaGluZSgpOworCisJaWYoIChhbkV4ZWN1dGFibGVGb3JtICE9IE5VTEwpICYmIGFuRXhlY3V0YWJsZUZvcm0tPmhhc1BhcmFtUmV0dXJuKCkgKQorCXsKKwkJQVBUYWJsZU9mRGF0YSBhUGFyYW1UYWJsZSggbmV3IFRhYmxlT2ZEYXRhKAorCQkJCWFuRXhlY3V0YWJsZUZvcm0tPmdldFBhcmFtUmV0dXJuQ291bnQoKSApICk7CisJCWFuSW5zdGFuY2UtPnNldFBhcmFtUmV0dXJuVGFibGUoIGFQYXJhbVRhYmxlICk7CisKKwkJYW5JbnN0YW5jZS0+c2V0UmV0dXJuT2Zmc2V0KCBhbkV4ZWN1dGFibGVGb3JtLT5nZXRQYXJhbUNvdW50KCkgKTsKKworCQlib29sIGhhc0luaXRpYWxJbnN0YW5jZSA9CisJCQkJYU1hY2hpbmUtPmdldEluc3RhbmNlU3BlY2lmaWVyKCktPmhhc0luaXRpYWxJbnN0YW5jZSgpOworCisKKwkJaWYoIGFuRXhlY3V0YWJsZUZvcm0tPmhhc1BhcmFtKCkgKQorCQl7CisJCQlpZiggYU1hY2hpbmUtPmhhc1ZhcmlhYmxlUGFyYW1ldGVyKCkgKQorCQkJeworCQkJCUJGIHBhcmFtVmFsdWU7CisKKwkJCQlUYWJsZU9mVmFyaWFibGU6OmNvbnN0X3Jhd19pdGVyYXRvciBpdCA9CisJCQkJCQlhTWFjaGluZS0+Z2V0VmFyaWFibGVQYXJhbWV0ZXJzKCkuYmVnaW4oKTsKKwkJCQlUYWJsZU9mVmFyaWFibGU6OmNvbnN0X3Jhd19pdGVyYXRvciBpdEVuZCA9CisJCQkJCQlhTWFjaGluZS0+Z2V0VmFyaWFibGVQYXJhbWV0ZXJzKCkuZW5kKCk7CisJCQkJZm9yKCBhdm1fb2Zmc2V0X3Qgb2Zmc2V0ID0gMCA7IGl0ICE9IGl0RW5kIDsgKytpdCAsICsrb2Zmc2V0ICkKKwkJCQl7CisJCQkJCWlmKCAoKml0KS5pbnZhbGlkKCkgKQorCQkJCQl7CisJCQkJCQlpZiggaGFzSW5pdGlhbEluc3RhbmNlICkKKwkJCQkJCXsKKwkJCQkJCQlpbmNyV2FybmluZ0NvdW50KCk7CisJCQkJCQkJYU1hY2hpbmUtPmVycm9yTG9jYXRpb24oQVZNX09TX1dBUk4pCisJCQkJCQkJCQk8PCAiQ29tcGlsZSBwYXJhbSB3YXJuaW5nIDw8ICIKKwkJCQkJCQkJCTw8IHN0cl9oZWFkZXIoCisJCQkJCQkJCQkJYW5FeGVjdXRhYmxlRm9ybS0+cmF3UGFyYW1EYXRhKG9mZnNldCkgKQorCQkJCQkJCQkJPDwgIiA+PiBmb3IgdGhlIHN0YXRlbWFjaGluZSBpbnN0YW5jZSA8PCAiCisJCQkJCQkJCQk8PCBzdHJfaGVhZGVyKCBhTWFjaGluZSApIDw8ICIgPj4gIgorCQkJCQkJCQkJPDwgIlVuZXhwZWN0ZWQgbm9uLWluc3RhbmNpYXRlZCBwYXJhbWV0ZXJzICEiCisJCQkJCQkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCQkJCQkJCS8vISEgR2VuZXJhdGlvbiBvZiBzeW1ib2xpYyBwYXJhbWV0ZXIKKwkJCQkJCQkvLyEhIEdlbmVyYXRpb24gb2Ygc3ltYm9saWMgcGFyYW1ldGVyCisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZSBpZiggKGl0KS0+aGFzVmFsdWUoKSApCisJCQkJCXsKKwkJCQkJCXBhcmFtVmFsdWUgPSBtQXZtY29kZUNvbXBpbGVyLmRlY29kZV9jb21waWxlRXhwcmVzc2lvbigKKwkJCQkJCQkJdGhlRXhlY3V0YWJsZUNvbnRhaW5lciwgKGl0KS0+Z2V0VmFsdWUoKSApOworCQkJCQkJaWYoIHBhcmFtVmFsdWUudmFsaWQoKSApCisJCQkJCQl7CisJCQkJCQkJYVBhcmFtVGFibGUtPnNldChvZmZzZXQsIHBhcmFtVmFsdWUpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCWluY3JFcnJvckNvdW50KCk7CisJCQkJCQkJYU1hY2hpbmUtPmVycm9yTG9jYXRpb24oQVZNX09TX1dBUk4pCisJCQkJCQkJCQk8PCAiQ29tcGlsZSBwYXJhbSBlcnJvciA8PCAiCisJCQkJCQkJCQk8PCBzdHJfaGVhZGVyKCAqaXQgKQorCQkJCQkJCQkJPDwgIiA+PiBmb3IgdGhlIHN0YXRlbWFjaGluZSBpbnN0YW5jZSA8PCAiCisJCQkJCQkJCQk8PCBzdHJfaGVhZGVyKCBhTWFjaGluZSApIDw8ICIgPj4iCisJCQkJCQkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UgaWYoIGhhc0luaXRpYWxJbnN0YW5jZSApCisJCQkJCXsKKwkJCQkJCWluY3JXYXJuaW5nQ291bnQoKTsKKwkJCQkJCWFNYWNoaW5lLT53YXJuaW5nTG9jYXRpb24oQVZNX09TX1dBUk4pCisJCQkJCQkJCTw8ICJDb21waWxlIHBhcmFtIHdhcm5pbmcgPDwgIgorCQkJCQkJCQk8PCBzdHJfaGVhZGVyKCAqaXQgKQorCQkJCQkJCQk8PCAiID4+IGZvciB0aGUgc3RhdGVtYWNoaW5lIGluc3RhbmNlIDw8ICIKKwkJCQkJCQkJPDwgc3RyX2hlYWRlciggYU1hY2hpbmUgKSA8PCAiID4+ICIKKwkJCQkJCQkJPDwgIlVuZXhwZWN0ZWQgbm9uLWluc3RhbmNpYXRlZCBwYXJhbWV0ZXJzICEiCisJCQkJCQkJCTw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisJCQkJCQkvLyEhIEdlbmVyYXRpb24gb2Ygc3ltYm9saWMgcGFyYW1ldGVyCisJCQkJCQkvLyEhIEdlbmVyYXRpb24gb2Ygc3ltYm9saWMgcGFyYW1ldGVyCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiggYW5FeGVjdXRhYmxlRm9ybS0+aGFzUmV0dXJuKCkgKQorCQl7CisJCQlpZiggYU1hY2hpbmUtPmhhc1ZhcmlhYmxlUmV0dXJuKCkgKQorCQkJeworCQkJCUJGIHJldHVyblZhbHVlOworCisJCQkJVGFibGVPZlZhcmlhYmxlOjpjb25zdF9yYXdfaXRlcmF0b3IgaXQgPQorCQkJCQkJYU1hY2hpbmUtPmdldFZhcmlhYmxlUmV0dXJucygpLmJlZ2luKCk7CisJCQkJVGFibGVPZlZhcmlhYmxlOjpjb25zdF9yYXdfaXRlcmF0b3IgaXRFbmQgPQorCQkJCQkJYU1hY2hpbmUtPmdldFZhcmlhYmxlUmV0dXJucygpLmVuZCgpOworCQkJCWZvciggYXZtX29mZnNldF90IG9mZnNldCA9IDAgOyBpdCAhPSBpdEVuZCA7ICsraXQgLCArK29mZnNldCApCisJCQkJeworCQkJCQlpZiggKCppdCkuaW52YWxpZCgpICkKKwkJCQkJeworCQkJCQkJaW5jcldhcm5pbmdDb3VudCgpOworCQkJCQkJYU1hY2hpbmUtPmVycm9yTG9jYXRpb24oQVZNX09TX1dBUk4pCisJCQkJCQkJCTw8ICJDb21waWxlIHJldHVybiB3YXJuaW5nIDw8ICIKKwkJCQkJCQkJPDwgc3RyX2hlYWRlcigKKwkJCQkJCQkJCWFuRXhlY3V0YWJsZUZvcm0tPnJhd1JldHVybkRhdGEob2Zmc2V0KSApCisJCQkJCQkJCTw8ICIgPj4gZm9yIHRoZSBzdGF0ZW1hY2hpbmUgaW5zdGFuY2UgPDwgIgorCQkJCQkJCQk8PCBzdHJfaGVhZGVyKCBhTWFjaGluZSApIDw8ICIgPj4gIgorCQkJCQkJCQk8PCAiVW5leHBlY3RlZCBub24taW5zdGFuY2lhdGVkIHBhcmFtZXRlcnMgISIKKwkJCQkJCQkJPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKwkJCQkJCS8vISEgR2VuZXJhdGlvbiBvZiBzeW1ib2xpYyBwYXJhbWV0ZXIKKwkJCQkJCS8vISEgR2VuZXJhdGlvbiBvZiBzeW1ib2xpYyBwYXJhbWV0ZXIKKwkJCQkJfQorCQkJCQllbHNlIGlmKCAoaXQpLT5oYXNWYWx1ZSgpICkKKwkJCQkJeworCQkJCQkJcmV0dXJuVmFsdWUgPSBtQXZtY29kZUNvbXBpbGVyLmRlY29kZV9jb21waWxlRXhwcmVzc2lvbigKKwkJCQkJCQkJdGhlRXhlY3V0YWJsZUNvbnRhaW5lciwgKGl0KS0+Z2V0VmFsdWUoKSApOworCQkJCQkJaWYoIHJldHVyblZhbHVlLnZhbGlkKCkgKQorCQkJCQkJeworCQkJCQkJCWFQYXJhbVRhYmxlLT5zZXQoYW5FeGVjdXRhYmxlRm9ybS0+Z2V0UmV0dXJuT2Zmc2V0KCkKKwkJCQkJCQkJCSsgb2Zmc2V0LCByZXR1cm5WYWx1ZSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJaW5jckVycm9yQ291bnQoKTsKKwkJCQkJCQlhTWFjaGluZS0+ZXJyb3JMb2NhdGlvbihBVk1fT1NfV0FSTikKKwkJCQkJCQkJCTw8ICJDb21waWxlIHJldHVybiBlcnJvciA8PCAiCisJCQkJCQkJCQk8PCBzdHJfaGVhZGVyKCAqaXQgKQorCQkJCQkJCQkJPDwgIiA+PiBmb3IgdGhlIHN0YXRlbWFjaGluZSBpbnN0YW5jZSA8PCAiCisJCQkJCQkJCQk8PCBzdHJfaGVhZGVyKCBhTWFjaGluZSApIDw8ICIgPj4iCisJCQkJCQkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENPTVBJTEFUSU9OIE9GIEFWTVBST0dSQU0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKwordm9pZCBDb21waWxlcjo6Y29tcGlsZUF2bVByb2dyYW1zKCkKK3sKKwlBdm1Qcm9ncmFtICogYVByb2dyYW07CisJYXZtX3NpemVfdCBvZmZzZXQ7CisKKwlUYWJsZU9mRXhlY3V0YWJsZUZvcm06OmNvbnN0X3Jhd19pdGVyYXRvciBpdEV4ZWMgPQorCQkJbUNvbmZpZ3VyYXRpb24uZ2V0RXhlY3V0YWJsZVN5c3RlbSgpLmdldEV4ZWN1dGFibGVzKCkuYmVnaW4oKTsKKwlUYWJsZU9mRXhlY3V0YWJsZUZvcm06OmNvbnN0X3Jhd19pdGVyYXRvciBlbmRFeGVjID0KKwkJCW1Db25maWd1cmF0aW9uLmdldEV4ZWN1dGFibGVTeXN0ZW0oKS5nZXRFeGVjdXRhYmxlcygpLmVuZCgpOworCWZvciggOyBpdEV4ZWMgIT0gZW5kRXhlYyA7ICsraXRFeGVjICkKKwl7CisJCWZvciggb2Zmc2V0ID0gMCA7IG9mZnNldCA8IChpdEV4ZWMpLT5nZXRQcm9ncmFtKCkuc2l6ZSgpIDsgKytvZmZzZXQgKQorCQl7CisJCQlhUHJvZ3JhbSA9IChpdEV4ZWMpLT5nZXRQcm9ncmFtKCkucmF3QXQob2Zmc2V0KTsKKworQVZNX0lGX0RFQlVHX0ZMQUcoIENPTVBJTElORyApCisJQVZNX09TX1RSQUNFIDw8IElOQ1JfSU5ERU5UX1RBQiA8PCAiPHwgY29tcGlsaW5nPHByb2dyYW0+OiAiCisJCQk8PCBhUHJvZ3JhbS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggQ09NUElMSU5HICkKKworCQkJbVByb2dyYW1Db21waWxlci5jb21waWxlUHJvZ3JhbSggYVByb2dyYW0gKTsKKworQVZNX0lGX0RFQlVHX0ZMQUcoIENPTVBJTElORyApCisvLwkoKml0UHJvZyktPnRvU3RyZWFtKEFWTV9PU19UUkFDRSk7CisJQVZNX09TX1RSQUNFIDw8IFRBQl9ERUNSX0lOREVOVCA8PCAiPnwgY29tcGlsaW5nPHByb2dyYW0+OiAiCisJCQk8PCBhUHJvZ3JhbS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggQ09NUElMSU5HICkKKwkJfQorCX0KK30KKworCisvKioKKyAqIGNvbXBpbGUKKyAqIEV4ZWN1dGFibGUKKyAqLwordm9pZCBDb21waWxlcjo6Y29tcGlsZUJhc2VNYWNoaW5lKEV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlRm9ybSkKK3sKKwljb25zdCBNYWNoaW5lICogYU1hY2hpbmUgPSBhbkV4ZWN1dGFibGVGb3JtLT5nZXRBc3RNYWNoaW5lKCk7CisKKy8vQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiPHwgY29tcGlsaW5nPG1hY2hpbmU+OiAiCisvLwkJPDwgc3RyX2hlYWRlciggYU1hY2hpbmUgKSA8PCBzdGQ6OmVuZGw7CisKKworCS8vIENPTVBJTEFUSU9OIE9GIFBPUlQKKwltQ29tQ29tcGlsZXIuY29tcGlsZVBvcnQoYW5FeGVjdXRhYmxlRm9ybSk7CisKKwkvLyBDT01QSUxBVElPTiBPRiBEQVRBCisJbURhdGFDb21waWxlci5jb21waWxlRGF0YShhbkV4ZWN1dGFibGVGb3JtKTsKKworCisJaWYoIG5vdCBhTWFjaGluZS0+aGFzQmVoYXZpb3IoKSApCisJeworCQlyZXR1cm47CisJfQorCisJQmVoYXZpb3JhbFBhcnQgKiB0aGVCZWhhdmlvciA9IGFNYWNoaW5lLT5nZXRCZWhhdmlvcigpOworCisJLyoKKwkgKiBvbkNyZWF0ZQorCSAqLworCWlmKCB0aGVCZWhhdmlvci0+aGFzT25DcmVhdGUoKSAmJgorCQkJU3RhdGVtZW50VHlwZUNoZWNrZXI6OmRvU29tZXRoaW5nKHRoZUJlaGF2aW9yLT5nZXRPbkNyZWF0ZSgpKSApCisJeworCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPbkNyZWF0ZSgKKwkJCQltQXZtY29kZUNvbXBpbGVyLmNvbXBpbGVTdGF0ZW1lbnQoCisJCQkJCQlhbkV4ZWN1dGFibGVGb3JtLCB0aGVCZWhhdmlvci0+Z2V0T25DcmVhdGUoKSkgKTsKKwl9CisKKwkvKgorCSAqIG9uSW5pdAorCSAqLworCWlmKCB0aGVCZWhhdmlvci0+aGFzT25Jbml0KCkgJiYKKwkJCVN0YXRlbWVudFR5cGVDaGVja2VyOjpkb1NvbWV0aGluZyh0aGVCZWhhdmlvci0+Z2V0T25Jbml0KCkpICkKKwl7CisJCWFuRXhlY3V0YWJsZUZvcm0tPnNldE9uSW5pdCgKKwkJCQltQXZtY29kZUNvbXBpbGVyLmNvbXBpbGVTdGF0ZW1lbnQoCisJCQkJCQlhbkV4ZWN1dGFibGVGb3JtLCB0aGVCZWhhdmlvci0+Z2V0T25Jbml0KCkpICk7CisJfQorCisJLyoKKwkgKiBvbkZpbmFsCisJICovCisJaWYoIHRoZUJlaGF2aW9yLT5oYXNPbkZpbmFsKCkgJiYKKwkJCVN0YXRlbWVudFR5cGVDaGVja2VyOjpkb1NvbWV0aGluZyh0aGVCZWhhdmlvci0+Z2V0T25GaW5hbCgpKSApCisJeworCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPbkZpbmFsKAorCQkJCW1Bdm1jb2RlQ29tcGlsZXIuY29tcGlsZVN0YXRlbWVudCgKKwkJCQkJCWFuRXhlY3V0YWJsZUZvcm0sIHRoZUJlaGF2aW9yLT5nZXRPbkZpbmFsKCkpICk7CisJfQorCisKKwkvKgorCSAqIG9uUmV0dXJuCisJICovCisJaWYoIHRoZUJlaGF2aW9yLT5oYXNPblJldHVybigpICYmCisJCQlTdGF0ZW1lbnRUeXBlQ2hlY2tlcjo6ZG9Tb21ldGhpbmcodGhlQmVoYXZpb3ItPmdldE9uUmV0dXJuKCkpICkKKwl7CisJCWFuRXhlY3V0YWJsZUZvcm0tPnNldE9uUmV0dXJuKAorCQkJCVN0YXRlbWVudENvbnN0cnVjdG9yOjp4bmV3Q29kZUZsYXQoCisJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NFUVVFTkNFLAorCQkJCQkJbUF2bWNvZGVDb21waWxlci5jb21waWxlU3RhdGVtZW50KAorCQkJCQkJCQlhbkV4ZWN1dGFibGVGb3JtLCB0aGVCZWhhdmlvci0+Z2V0T25SZXR1cm4oKSksCisJCQkJCQlTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9GSU5BTCkgKSApOworCX0KKworCisJLyoKKwkgKiBvblN0YXJ0CisJICovCisJaWYoIHRoZUJlaGF2aW9yLT5oYXNPblN0YXJ0KCkgJiYKKwkJCVN0YXRlbWVudFR5cGVDaGVja2VyOjpkb1NvbWV0aGluZyh0aGVCZWhhdmlvci0+Z2V0T25TdGFydCgpKSApCisJeworCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPblN0YXJ0KAorCQkJCW1Bdm1jb2RlQ29tcGlsZXIuY29tcGlsZVN0YXRlbWVudCgKKwkJCQkJCWFuRXhlY3V0YWJsZUZvcm0sIHRoZUJlaGF2aW9yLT5nZXRPblN0YXJ0KCkpICk7CisJfQorCisJLyoKKwkgKiBvblN0b3AKKwkgKi8KKwlpZiggdGhlQmVoYXZpb3ItPmhhc09uU3RvcCgpICYmCisJCQlTdGF0ZW1lbnRUeXBlQ2hlY2tlcjo6ZG9Tb21ldGhpbmcodGhlQmVoYXZpb3ItPmdldE9uU3RvcCgpKSApCisJeworCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPblN0b3AoCisJCQkJbUF2bWNvZGVDb21waWxlci5jb21waWxlU3RhdGVtZW50KAorCQkJCQkJYW5FeGVjdXRhYmxlRm9ybSwgdGhlQmVoYXZpb3ItPmdldE9uU3RvcCgpKSApOworCX0KKworCisJLyoKKwkgKiBvbklFbmFibGUKKwkgKi8KKwlpZiggdGhlQmVoYXZpb3ItPmhhc09uSUVuYWJsZSgpICYmCisJCQlTdGF0ZW1lbnRUeXBlQ2hlY2tlcjo6ZG9Tb21ldGhpbmcodGhlQmVoYXZpb3ItPmdldE9uSUVuYWJsZSgpKSApCisJeworCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPbklFbmFibGUoCisJCQkJbUF2bWNvZGVDb21waWxlci5jb21waWxlU3RhdGVtZW50KAorCQkJCQkJYW5FeGVjdXRhYmxlRm9ybSwgdGhlQmVoYXZpb3ItPmdldE9uSUVuYWJsZSgpKSApOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBDT01QVVRJTkcgLCBTVEFURU1FTlQgKQorCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPbklFbmFibGUoU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGVGbGF0TWlkZGxlKAorCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQVRPTUlDX1NFUVVFTkNFLAorCisJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvbW1lbnQoICJiZWdpbjxpZW5hYmxlPiAiICsKKwkJCQkJCWFuRXhlY3V0YWJsZUZvcm0tPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgKSwKKworCQkJCWFuRXhlY3V0YWJsZUZvcm0tPmdldE9uSUVuYWJsZSgpLAorCisJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvbW1lbnQoICJlbmQ8aWVuYWJsZT4gIiArCisJCQkJCQlhbkV4ZWN1dGFibGVGb3JtLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpICkgKSApOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgQ09NUFVUSU5HICwgU1RBVEVNRU5UICkKKwl9CisKKwkvKgorCSAqIG9uRW5hYmxlCisJICovCisJaWYoIHRoZUJlaGF2aW9yLT5oYXNPbkVuYWJsZSgpICYmCisJCQlTdGF0ZW1lbnRUeXBlQ2hlY2tlcjo6ZG9Tb21ldGhpbmcodGhlQmVoYXZpb3ItPmdldE9uRW5hYmxlKCkpICkKKwl7CisJCWFuRXhlY3V0YWJsZUZvcm0tPnNldE9uRW5hYmxlKAorCQkJCW1Bdm1jb2RlQ29tcGlsZXIuY29tcGlsZVN0YXRlbWVudCgKKwkJCQkJCWFuRXhlY3V0YWJsZUZvcm0sIHRoZUJlaGF2aW9yLT5nZXRPbkVuYWJsZSgpKSApOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBDT01QVVRJTkcgLCBTVEFURU1FTlQgKQorCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPbkVuYWJsZShTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZUZsYXRNaWRkbGUoCisJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BVE9NSUNfU0VRVUVOQ0UsCisKKwkJCQlTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29tbWVudCggImJlZ2luPGVuYWJsZT4gIiArCisJCQkJCQlhbkV4ZWN1dGFibGVGb3JtLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpICksCisKKwkJCQlhbkV4ZWN1dGFibGVGb3JtLT5nZXRPbkVuYWJsZSgpLAorCisJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvbW1lbnQoICJlbmQ8ZW5hYmxlPiAiICsKKwkJCQkJCWFuRXhlY3V0YWJsZUZvcm0tPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgKSApICk7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBDT01QVVRJTkcgLCBTVEFURU1FTlQgKQorCX0KKworCS8vIEVYUEFORCBJRU5BQkxFIC8gRU5BQkxFCisJaWYoIGFuRXhlY3V0YWJsZUZvcm0tPmhhc09uSUVuYWJsZSgpICkKKwl7CisJCWlmKCBhbkV4ZWN1dGFibGVGb3JtLT5oYXNPbkVuYWJsZSgpICkKKwkJeworCQkJaWYoIG5vdCBBdm1Db2RlRmFjdG9yeTo6Y29udGFpbnMoYW5FeGVjdXRhYmxlRm9ybSwKKwkJCQkJYW5FeGVjdXRhYmxlRm9ybS0+Z2V0T25FbmFibGUoKSwgQVZNX09QQ09ERV9JRU5BQkxFX0lOVk9LRSkgKQorCQkJeworCQkJCWFuRXhlY3V0YWJsZUZvcm0tPnNldE9uRW5hYmxlKAorCQkJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGVGbGF0KAorCQkJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FUT01JQ19TRVFVRU5DRSwKKworCQkJCQkJCQlhbkV4ZWN1dGFibGVGb3JtLT5nZXRPbklFbmFibGUoKSwKKworCQkJCQkJCQlhbkV4ZWN1dGFibGVGb3JtLT5nZXRPbkVuYWJsZSgpICkgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBFWFBBTkQgSUVOQUJMRQorCQkJfQorCQl9CisJCWVsc2UKKwkJeworLy8JCQkoKml0KS0+c2V0T25FbmFibGUoIEJGQ29kZShPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0lFTkFCTEUpICk7CisKKwkJCS8vT3B0aW1pemF0aW9uCisJCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPbkVuYWJsZSggYW5FeGVjdXRhYmxlRm9ybS0+Z2V0T25JRW5hYmxlKCkgKTsKKwkJfQorCX0KKworCisKKwkvKgorCSAqIG9uSURpc2FibGUKKwkgKi8KKwlpZiggdGhlQmVoYXZpb3ItPmhhc09uSURpc2FibGUoKSAmJgorCQkJU3RhdGVtZW50VHlwZUNoZWNrZXI6OmRvU29tZXRoaW5nKHRoZUJlaGF2aW9yLT5nZXRPbklEaXNhYmxlKCkpICkKKwl7CisJCWFuRXhlY3V0YWJsZUZvcm0tPnNldE9uSURpc2FibGUoCisJCQkJbUF2bWNvZGVDb21waWxlci5jb21waWxlU3RhdGVtZW50KAorCQkJCQkJYW5FeGVjdXRhYmxlRm9ybSwgdGhlQmVoYXZpb3ItPmdldE9uSURpc2FibGUoKSkgKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgQ09NUFVUSU5HICwgU1RBVEVNRU5UICkKKwkJYW5FeGVjdXRhYmxlRm9ybS0+c2V0T25JRGlzYWJsZShTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZUZsYXRNaWRkbGUoCisJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BVE9NSUNfU0VRVUVOQ0UsCisJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvbW1lbnQoICJiZWdpbjxpZGlzYWJsZT4gIiArCisJCQkJCQlhbkV4ZWN1dGFibGVGb3JtLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpICksCisKKwkJCQlhbkV4ZWN1dGFibGVGb3JtLT5nZXRPbklEaXNhYmxlKCksCisKKwkJCQlTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29tbWVudCggImVuZDxpZGlzYWJsZT4gIiArCisJCQkJCQlhbkV4ZWN1dGFibGVGb3JtLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpICkgKSApOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgQ09NUFVUSU5HICwgU1RBVEVNRU5UICkKKwl9CisKKwkvKgorCSAqIG9uRGlzYWJsZQorCSAqLworCWlmKCB0aGVCZWhhdmlvci0+aGFzT25EaXNhYmxlKCkgJiYKKwkJCVN0YXRlbWVudFR5cGVDaGVja2VyOjpkb1NvbWV0aGluZyh0aGVCZWhhdmlvci0+Z2V0T25EaXNhYmxlKCkpICkKKwl7CisJCWFuRXhlY3V0YWJsZUZvcm0tPnNldE9uRGlzYWJsZSgKKwkJCQltQXZtY29kZUNvbXBpbGVyLmNvbXBpbGVTdGF0ZW1lbnQoCisJCQkJCQlhbkV4ZWN1dGFibGVGb3JtLCB0aGVCZWhhdmlvci0+Z2V0T25EaXNhYmxlKCkpICk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIENPTVBVVElORyAsIFNUQVRFTUVOVCApCisJCWFuRXhlY3V0YWJsZUZvcm0tPnNldE9uRGlzYWJsZShTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZUZsYXRNaWRkbGUoCisJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BVE9NSUNfU0VRVUVOQ0UsCisJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvbW1lbnQoICJiZWdpbjxkaXNhYmxlPiAiICsKKwkJCQkJCWFuRXhlY3V0YWJsZUZvcm0tPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgKSwKKworCQkJCWFuRXhlY3V0YWJsZUZvcm0tPmdldE9uRGlzYWJsZSgpLAorCisJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvbW1lbnQoICJlbmQ8ZGlzYWJsZT4gIiArCisJCQkJCQlhbkV4ZWN1dGFibGVGb3JtLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpICkgKSApOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgQ09NUFVUSU5HICwgU1RBVEVNRU5UICkKKworCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPbkRpc2FibGUoIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlRmxhdCgKKwkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FUT01JQ19TRVFVRU5DRSwKKworCQkJCWFuRXhlY3V0YWJsZUZvcm0tPmdldE9uRGlzYWJsZSgpLAorCisJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0RJU0FCTEVfU0VMRikgKSApOworCX0KKworCS8vIEVYUEFORCBJRElTQUJMRSAvIERJU0FCTEUKKwlpZiggYW5FeGVjdXRhYmxlRm9ybS0+aGFzT25JRGlzYWJsZSgpICkKKwl7CisJCWlmKCBhbkV4ZWN1dGFibGVGb3JtLT5oYXNPbkRpc2FibGUoKSApCisJCXsKKwkJCWlmKCBub3QgQXZtQ29kZUZhY3Rvcnk6OmNvbnRhaW5zKGFuRXhlY3V0YWJsZUZvcm0sCisJCQkJYW5FeGVjdXRhYmxlRm9ybS0+Z2V0T25EaXNhYmxlKCksIEFWTV9PUENPREVfSURJU0FCTEVfSU5WT0tFKSApCisJCQl7CisJCQkJYW5FeGVjdXRhYmxlRm9ybS0+c2V0T25EaXNhYmxlKAorCQkJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGVGbGF0KAorCQkJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FUT01JQ19TRVFVRU5DRSwKKworCQkJCQkJCQlhbkV4ZWN1dGFibGVGb3JtLT5nZXRPbklEaXNhYmxlKCksCisKKwkJCQkJCQkJYW5FeGVjdXRhYmxlRm9ybS0+Z2V0T25EaXNhYmxlKCkgKSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIEVYUEFORCBJRElTQUJMRQorCQkJfQorCQl9CisJCWVsc2UKKwkJeworLy8JCQkoKml0KS0+c2V0T25EaXNhYmxlKCBCRkNvZGUoT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9JRElTQUJMRSkgKTsKKworCQkJLy9PcHRpbWl6YXRpb24KKwkJCWFuRXhlY3V0YWJsZUZvcm0tPnNldE9uRGlzYWJsZSggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGVGbGF0KAorCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FUT01JQ19TRVFVRU5DRSwKKworCQkJCQlhbkV4ZWN1dGFibGVGb3JtLT5nZXRPbklEaXNhYmxlKCksCisKKwkJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9ESVNBQkxFX1NFTEYpICkgKTsKKwkJfQorCisJCWFuRXhlY3V0YWJsZUZvcm0tPnNldE9uSURpc2FibGUoIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlRmxhdCgKKwkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FUT01JQ19TRVFVRU5DRSwKKworCQkJCWFuRXhlY3V0YWJsZUZvcm0tPmdldE9uSURpc2FibGUoKSwKKworCQkJCVN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9ESVNBQkxFX1NFTEYpICkgKTsKKwl9CisKKworCS8qCisJICogb25JQWJvcnQKKwkgKi8KKwlpZiggdGhlQmVoYXZpb3ItPmhhc09uSUFib3J0KCkgJiYKKwkJCVN0YXRlbWVudFR5cGVDaGVja2VyOjpkb1NvbWV0aGluZyh0aGVCZWhhdmlvci0+Z2V0T25JQWJvcnQoKSkgKQorCXsKKwkJYW5FeGVjdXRhYmxlRm9ybS0+c2V0T25JQWJvcnQoCisJCQkJbUF2bWNvZGVDb21waWxlci5jb21waWxlU3RhdGVtZW50KAorCQkJCQkJYW5FeGVjdXRhYmxlRm9ybSwgdGhlQmVoYXZpb3ItPmdldE9uSUFib3J0KCkpICk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIENPTVBVVElORyAsIFNUQVRFTUVOVCApCisJCWFuRXhlY3V0YWJsZUZvcm0tPnNldE9uSUFib3J0KFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlRmxhdE1pZGRsZSgKKwkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FUT01JQ19TRVFVRU5DRSwKKwkJCQlTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29tbWVudCggImJlZ2luPGlhYm9ydD4gIiArCisJCQkJCQlhbkV4ZWN1dGFibGVGb3JtLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpICksCisKKwkJCQlhbkV4ZWN1dGFibGVGb3JtLT5nZXRPbklBYm9ydCgpLAorCisJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvbW1lbnQoICJlbmQ8aWFib3J0PiAiICsKKwkJCQkJCWFuRXhlY3V0YWJsZUZvcm0tPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgKSApICk7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBDT01QVVRJTkcgLCBTVEFURU1FTlQgKQorCX0KKworCS8qCisJICogb25BYm9ydAorCSAqLworCWlmKCB0aGVCZWhhdmlvci0+aGFzT25BYm9ydCgpICYmCisJCQlTdGF0ZW1lbnRUeXBlQ2hlY2tlcjo6ZG9Tb21ldGhpbmcodGhlQmVoYXZpb3ItPmdldE9uQWJvcnQoKSkgKQorCXsKKwkJYW5FeGVjdXRhYmxlRm9ybS0+c2V0T25BYm9ydCgKKwkJCQltQXZtY29kZUNvbXBpbGVyLmNvbXBpbGVTdGF0ZW1lbnQoCisJCQkJCQlhbkV4ZWN1dGFibGVGb3JtLCB0aGVCZWhhdmlvci0+Z2V0T25BYm9ydCgpKSApOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBDT01QVVRJTkcgLCBTVEFURU1FTlQgKQorCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPbkFib3J0KFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlRmxhdE1pZGRsZSgKKwkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FUT01JQ19TRVFVRU5DRSwKKwkJCQlTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29tbWVudCggImJlZ2luPGFib3J0PiAiICsKKwkJCQkJCWFuRXhlY3V0YWJsZUZvcm0tPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgKSwKKworCQkJCWFuRXhlY3V0YWJsZUZvcm0tPmdldE9uQWJvcnQoKSwKKworCQkJCVN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb21tZW50KCAiZW5kPGFib3J0PiAiICsKKwkJCQkJCWFuRXhlY3V0YWJsZUZvcm0tPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgKSApICk7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBDT01QVVRJTkcgLCBTVEFURU1FTlQgKQorCisJCWFuRXhlY3V0YWJsZUZvcm0tPnNldE9uQWJvcnQoIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlRmxhdCgKKwkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FUT01JQ19TRVFVRU5DRSwKKworCQkJCWFuRXhlY3V0YWJsZUZvcm0tPmdldE9uQWJvcnQoKSwKKworCQkJCVN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BQk9SVF9TRUxGKSApICk7CisJfQorCisJLy8gRVhQQU5EIElBQk9SVCAvIEFCT1JUCisJaWYoIGFuRXhlY3V0YWJsZUZvcm0tPmhhc09uSUFib3J0KCkgKQorCXsKKwkJaWYoIGFuRXhlY3V0YWJsZUZvcm0tPmhhc09uQWJvcnQoKSApCisJCXsKKwkJCWlmKCBub3QgQXZtQ29kZUZhY3Rvcnk6OmNvbnRhaW5zKGFuRXhlY3V0YWJsZUZvcm0sCisJCQkJYW5FeGVjdXRhYmxlRm9ybS0+Z2V0T25BYm9ydCgpLCBBVk1fT1BDT0RFX0lBQk9SVF9JTlZPS0UpICkKKwkJCXsKKwkJCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPbkFib3J0KAorCQkJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGVGbGF0KAorCQkJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FUT01JQ19TRVFVRU5DRSwKKworCQkJCQkJCQlhbkV4ZWN1dGFibGVGb3JtLT5nZXRPbklBYm9ydCgpLAorCisJCQkJCQkJCWFuRXhlY3V0YWJsZUZvcm0tPmdldE9uQWJvcnQoKSApICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gRVhQQU5EIElBQk9SVAorCQkJfQorCQl9CisJCWVsc2UKKwkJeworLy8JCQkoKml0KS0+c2V0T25BYm9ydCggQkZDb2RlKE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfSUFCT1JUKSApOworCisJCQkvL09wdGltaXphdGlvbgorCQkJYW5FeGVjdXRhYmxlRm9ybS0+c2V0T25BYm9ydCggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGVGbGF0KAorCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FUT01JQ19TRVFVRU5DRSwKKworCQkJCQlhbkV4ZWN1dGFibGVGb3JtLT5nZXRPbklBYm9ydCgpLAorCisJCQkJCVN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQUJPUlRfU0VMRikgKSApOworCQl9CisKKwkJYW5FeGVjdXRhYmxlRm9ybS0+c2V0T25JQWJvcnQoIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlRmxhdCgKKwkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FUT01JQ19TRVFVRU5DRSwKKworCQkJCWFuRXhlY3V0YWJsZUZvcm0tPmdldE9uSUFib3J0KCksCisKKwkJCQlTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQUJPUlRfU0VMRikgKSApOworCX0KKworCisJLyoKKwkgKiBvbklSdW4KKwkgKi8KKwlpZiggdGhlQmVoYXZpb3ItPmhhc09uSVJ1bigpICYmCisJCQlTdGF0ZW1lbnRUeXBlQ2hlY2tlcjo6ZG9Tb21ldGhpbmcodGhlQmVoYXZpb3ItPmdldE9uSVJ1bigpKSApCisJeworCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPbklSdW4oCisJCQkJbUF2bWNvZGVDb21waWxlci5jb21waWxlU3RhdGVtZW50KAorCQkJCQkJYW5FeGVjdXRhYmxlRm9ybSwgdGhlQmVoYXZpb3ItPmdldE9uSVJ1bigpKSApOworCX0KKworCS8qCisJICogb25SdW4KKwkgKi8KKwlpZiggdGhlQmVoYXZpb3ItPmhhc09uUnVuKCkgJiYKKwkJCVN0YXRlbWVudFR5cGVDaGVja2VyOjpkb1NvbWV0aGluZyh0aGVCZWhhdmlvci0+Z2V0T25SdW4oKSkgKQorCXsKKwkJYW5FeGVjdXRhYmxlRm9ybS0+c2V0T25SdW4oCisJCQkJbUF2bWNvZGVDb21waWxlci5jb21waWxlU3RhdGVtZW50KAorCQkJCQkJYW5FeGVjdXRhYmxlRm9ybSwgdGhlQmVoYXZpb3ItPmdldE9uUnVuKCkpICk7CisJfQorCisJLyoKKwkgKiBvblJ0YworCSAqLworCWlmKCB0aGVCZWhhdmlvci0+aGFzT25SdGMoKSAmJgorCQkJU3RhdGVtZW50VHlwZUNoZWNrZXI6OmRvU29tZXRoaW5nKHRoZUJlaGF2aW9yLT5nZXRPblJ0YygpKSApCisJeworCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPblJ0YygKKwkJCQltQXZtY29kZUNvbXBpbGVyLmNvbXBpbGVTdGF0ZW1lbnQoCisJCQkJCQlhbkV4ZWN1dGFibGVGb3JtLCB0aGVCZWhhdmlvci0+Z2V0T25SdGMoKSkgKTsKKwl9CisKKworCS8qCisJICogb25TY2hlZHVsZQorCSAqLworCWlmKCB0aGVCZWhhdmlvci0+aGFzT25TY2hlZHVsZSgpICkKKwl7CisJCWlmKCBTdGF0ZW1lbnRUeXBlQ2hlY2tlcjo6aXNFbXB0eVNjaGVkdWxlKHRoZUJlaGF2aW9yLT5nZXRPblNjaGVkdWxlKCkpICkKKwkJeworCQkJLy8hISBOT1RISU5HCisJCX0KKwkJZWxzZQorCQl7CisJCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPblNjaGVkdWxlKAorCQkJCQljb21waWxlU2NoZWR1bGVyUm91dGluZSgKKwkJCQkJCQlhbkV4ZWN1dGFibGVGb3JtLAorCQkJCQkJCXRoZUJlaGF2aW9yLT5nZXRPblNjaGVkdWxlKCkgKSApOworCQl9CisJfQorCisJLyoKKwkgKiBvbkNvbmN1cnJlbmN5CisJICovCisJaWYoIHRoZUJlaGF2aW9yLT5oYXNPbkNvbmN1cnJlbmN5KCkgKQorCXsKKwkJaWYoIFN0YXRlbWVudFR5cGVDaGVja2VyOjppc0VtcHR5U2NoZWR1bGUodGhlQmVoYXZpb3ItPmdldE9uQ29uY3VycmVuY3koKSkgKQorCQl7CisJCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPbkNvbmN1cnJlbmN5KCB0aGVCZWhhdmlvci0+Z2V0T25Db25jdXJyZW5jeSgpICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPbkNvbmN1cnJlbmN5KAorCQkJCQltQXZtY29kZUNvbXBpbGVyLmNvbXBpbGVTdGF0ZW1lbnQoCisJCQkJCQkJYW5FeGVjdXRhYmxlRm9ybSwgdGhlQmVoYXZpb3ItPmdldE9uQ29uY3VycmVuY3koKSkgKTsKKwkJfQorCX0KKwllbHNlIGlmKCBTdGF0ZW1lbnRUeXBlQ2hlY2tlcjo6aXNTY2hlZHVsZSh0aGVCZWhhdmlvci0+Z2V0T25TY2hlZHVsZSgpKSApCisJeworCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPbkNvbmN1cnJlbmN5KAorCQkJCXRoZUJlaGF2aW9yLT5nZXRPblNjaGVkdWxlKCkuZ2V0T3BlcmF0b3IoKSApOworCX0KKworCisJLyoKKwkgKiBvblN5bmNocm9uaXplCisJICovCisJaWYoIHRoZUJlaGF2aW9yLT5oYXNPblN5bmNocm9uaXplKCkgKQorCXsKKwkJYW5FeGVjdXRhYmxlRm9ybS0+c2V0T25TeW5jaHJvbml6ZSgKKwkJCQltQXZtY29kZUNvbXBpbGVyLmNvbXBpbGVTdGF0ZW1lbnQoCisJCQkJCQlhbkV4ZWN1dGFibGVGb3JtLCB0aGVCZWhhdmlvci0+Z2V0T25TeW5jaHJvbml6ZSgpKSApOworCX0KKworCisJLyoKKwkgKiBvdGhlciB1c2VyIFJvdXRpbmVzCisJICovCisJQmVoYXZpb3JhbFBhcnQ6OmNvbnN0X3JvdXRpbmVfaXRlcmF0b3IgaXQgPSB0aGVCZWhhdmlvci0+cm91dGluZV9iZWdpbigpOworCUJlaGF2aW9yYWxQYXJ0Ojpjb25zdF9yb3V0aW5lX2l0ZXJhdG9yIGVuZEl0ID0gdGhlQmVoYXZpb3ItPnJvdXRpbmVfZW5kKCk7CisJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJeworCQlhbkV4ZWN1dGFibGVGb3JtLT5zYXZlUHJvZ3JhbSgKKwkJCQltQXZtY29kZUNvbXBpbGVyLmNvbXBpbGVSb3V0aW5lKHRoaXMsIGFuRXhlY3V0YWJsZUZvcm0sIGl0KSApOworCX0KKworCisvL0FWTV9PU19UUkFDRSA8PCBUQUIgPDwgIj58IGNvbXBpbGluZzxtYWNoaW5lPjogIgorLy8JCTw8IHN0cl9oZWFkZXIoIGFNYWNoaW5lICkgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKK30KKworCisvKioKKyAqIGNvbXBpbGUKKyAqIGV4ZWN1dGFibGUgcHJvY2VkdXJlCisgKi8KK3ZvaWQgQ29tcGlsZXI6OmNvbXBpbGVQcm9jZWR1cmUoRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGVGb3JtKQoreworCS8vIENvbXBpbGUgZGF0YSAmIGFsbCBtYWNoaW5lIE1PRSBwcm9ncmFtCisJY29tcGlsZUJhc2VNYWNoaW5lKGFuRXhlY3V0YWJsZUZvcm0pOworCisJY29uc3QgTWFjaGluZSAqIGFQcm9jZWR1cmUgPSBhbkV4ZWN1dGFibGVGb3JtLT5nZXRBc3RNYWNoaW5lKCk7CisKKy8vQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiPHwgY29tcGlsaW5nPHN0YXRlbWFjaGluZT46ICIKKy8vCQk8PCBzdHJfaGVhZGVyKCBhUHJvY2VkdXJlICkgPDwgc3RkOjplbmRsOworCisJLy8gUFVTSCBNT0MKKwlXT2JqZWN0ICogbW9jX3RyYW5zaXRpb24gPSBOVUxMOy8vYVByb2NlZHVyZTo6Z2V0VHJhbnNpdGlvbk1vYygpOworCWlmKCBtb2NfdHJhbnNpdGlvbiAhPSBOVUxMICkKKwl7CisJCW1UcmFuc2l0aW9uQ29tcGlsZXIucHVzaE1vYyhtb2NfdHJhbnNpdGlvbik7CisJfQorCisKKwkvLyBDb21waWxlIGFsbCBzcGVjaWZpYyBzdGF0ZW1hY2hpbmUKKwlpZiggYVByb2NlZHVyZS0+Z2V0U3BlY2lmaWVyKCkuaXNTdGF0ZUJhc2ljKCkgKQorCXsKKwkJY29tcGlsZVN0YXRlbWFjaGluZUJhc2ljKGFuRXhlY3V0YWJsZUZvcm0pOworCX0KKworCWVsc2UgaWYoIGFQcm9jZWR1cmUtPmdldFNwZWNpZmllcigpLmlzTW9jU3RhdGVUcmFuc2l0aW9uU3RydWN0dXJlKCkgKQorCXsKKwkJY29tcGlsZUV4ZWN1dGFibGVNb2NTdGF0ZVRyYW5zaXRpb25TdHJ1Y3R1cmUoYW5FeGVjdXRhYmxlRm9ybSk7CisJfQorCWVsc2UgaWYoIGFQcm9jZWR1cmUtPmdldFNwZWNpZmllcigpLmlzTW9jQ29tcG9zaXRlU3RydWN0dXJlKCkgKQorCXsKKwkJY29tcGlsZUV4ZWN1dGFibGVNb2NDb21wb3NpdGVTdHJ1Y3R1cmUoYW5FeGVjdXRhYmxlRm9ybSk7CisJfQorCisJZWxzZQorCXsKKwkJLy8gTU9DIEF0dHJpYnV0ZSBmb3IgbXV0YWJsZSBTY2hlZHVsZQorCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRNdXRhYmxlU2NoZWR1bGUoCisJCQkJYW5FeGVjdXRhYmxlRm9ybS0+aGFzT25TY2hlZHVsZSgpICk7CisKKwkJLyoKKwkJICogQ29tcGlsaW5nIGNvbW11bmljYXRpb24KKwkJICovCisJCWJvb2wgaGFzU3luY2hyb25pemVNYWNoaW5lID0gZmFsc2U7CisJCWJvb2wgaGFzVXBkYXRlQnVmZmVyID0gZmFsc2U7CisKKwkJbUNvbUNvbXBpbGVyLmNvbXBpbGVDb21tdW5pY2F0aW9uKGFuRXhlY3V0YWJsZUZvcm0sCisJCQkJaGFzVXBkYXRlQnVmZmVyLCBoYXNTeW5jaHJvbml6ZU1hY2hpbmUpOworCisJCWlmKCBhbkV4ZWN1dGFibGVGb3JtLT5oYXNPblJ1bigpICkKKwkJeworCQkJLy8hISBOT1RISU5HCisJCX0KKwkJZWxzZSBpZiggYW5FeGVjdXRhYmxlRm9ybS0+aGFzT25SdGMoKSApCisJCXsKKwkJCWFuRXhlY3V0YWJsZUZvcm0tPnNldE9uUnVuKFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1JUQykpOworCQl9CisKKwkJZWxzZSBpZiggYW5FeGVjdXRhYmxlRm9ybS0+aGFzT25TY2hlZHVsZSgpICkKKwkJeworCQkJYW5FeGVjdXRhYmxlRm9ybS0+c2V0T25SdW4oIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NDSEVEVUxFX0lOVk9LRSkpOworCQl9CisJfQorCisJLy8gUE9QIE1PQworCWlmKCBtb2NfdHJhbnNpdGlvbiAhPSBOVUxMICkKKwl7CisJCW1UcmFuc2l0aW9uQ29tcGlsZXIucG9wTW9jKCk7CisJfQorCisvL0FWTV9PU19UUkFDRSA8PCBUQUIgPDwgIj58IGNvbXBpbGluZzxzdGF0ZW1hY2hpbmU+OiAiCisvLwkJPDwgc3RyX2hlYWRlciggYVByb2NlZHVyZSApIDw8IHN0ZDo6ZW5kbDsKK30KKworCisvKioKKyAqIGNvbXBpbGUKKyAqIGV4ZWN1dGFibGUgbWFjaGluZQorICovCit2b2lkIENvbXBpbGVyOjpjb21waWxlTWFjaGluZShFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZUZvcm0pCit7CisvL0FWTV9PU19UUkFDRSA8PCBUQUIgPDwgIjx8IGNvbXBpbGluZzxtYWNoaW5lPjogIgorLy8JCTw8IHN0cl9oZWFkZXIoIGFNYWNoaW5lICkgPDwgc3RkOjplbmRsOworCisJLy8gQ09NUElMRSBQUk9HUkFNCisJaWYoIGFuRXhlY3V0YWJsZUZvcm0tPmhhc1Byb2dyYW0oKSApCisJeworCQlBdm1Qcm9ncmFtICogYVByb2dyYW07CisKKwkJYXZtX3NpemVfdCBvZmZzZXQgPSAwOworCQlmb3IoIDsgb2Zmc2V0IDwgYW5FeGVjdXRhYmxlRm9ybS0+Z2V0UHJvZ3JhbSgpLnNpemUoKSA7ICsrb2Zmc2V0ICkKKwkJeworCQkJYVByb2dyYW0gPSBhbkV4ZWN1dGFibGVGb3JtLT5nZXRQcm9ncmFtKCkucmF3QXQob2Zmc2V0KTsKKworQVZNX0lGX0RFQlVHX0ZMQUcoIENPTVBJTElORyApCisJQVZNX09TX1RSQUNFIDw8IElOQ1JfSU5ERU5UX1RBQiA8PCAiPHwgY29tcGlsaW5nPHByb2dyYW0+OiAiCisJCQk8PCBhUHJvZ3JhbS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggQ09NUElMSU5HICkKKworCQkJbVByb2dyYW1Db21waWxlci5jb21waWxlUHJvZ3JhbSggYVByb2dyYW0gKTsKKworQVZNX0lGX0RFQlVHX0ZMQUcoIENPTVBJTElORyApCisvLwkoKml0UHJvZyktPnRvU3RyZWFtKEFWTV9PU19UUkFDRSk7CisJQVZNX09TX1RSQUNFIDw8IFRBQl9ERUNSX0lOREVOVCA8PCAiPnwgY29tcGlsaW5nPHByb2dyYW0+OiAiCisJCQk8PCBhUHJvZ3JhbS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggQ09NUElMSU5HICkKKwkJfQorCX0KKworCisJY29uc3QgTWFjaGluZSAqIGFNYWNoaW5lID0gYW5FeGVjdXRhYmxlRm9ybS0+Z2V0QXN0TWFjaGluZSgpOworCisJLy8gQ29tcGlsZSBhbGwgc3BlY2lmaWMgbWFjaGluZQorCWlmKCBhTWFjaGluZS0+Z2V0U3BlY2lmaWVyKCkuaXNNb2NTdGF0ZVRyYW5zaXRpb25TdHJ1Y3R1cmUoKSApCisJeworCQljb21waWxlRXhlY3V0YWJsZU1vY1N0YXRlVHJhbnNpdGlvblN0cnVjdHVyZShhbkV4ZWN1dGFibGVGb3JtKTsKKwl9CisJZWxzZSBpZiggYU1hY2hpbmUtPmdldFNwZWNpZmllcigpLmlzTW9jQ29tcG9zaXRlU3RydWN0dXJlKCkgKQorCXsKKwkJY29tcGlsZUV4ZWN1dGFibGVNb2NDb21wb3NpdGVTdHJ1Y3R1cmUoYW5FeGVjdXRhYmxlRm9ybSk7CisJfQorCWVsc2UKKwl7CisJCS8vIE1PQyBBdHRyaWJ1dGUgZm9yIG11dGFibGUgU2NoZWR1bGUKKwkJYW5FeGVjdXRhYmxlRm9ybS0+c2V0TXV0YWJsZVNjaGVkdWxlKAorCQkJCWFuRXhlY3V0YWJsZUZvcm0tPmhhc09uU2NoZWR1bGUoKSApOworCisJCS8qCisJCSAqIENvbXBpbGluZyBjb21tdW5pY2F0aW9uCisJCSAqLworCQlib29sIGhhc1N5bmNocm9uaXplTWFjaGluZSA9IGZhbHNlOworCQlib29sIGhhc1VwZGF0ZUJ1ZmZlciA9IGZhbHNlOworCisJCW1Db21Db21waWxlci5jb21waWxlQ29tbXVuaWNhdGlvbihhbkV4ZWN1dGFibGVGb3JtLAorCQkJCWhhc1VwZGF0ZUJ1ZmZlciwgaGFzU3luY2hyb25pemVNYWNoaW5lKTsKKworCQlpZiggYW5FeGVjdXRhYmxlRm9ybS0+aGFzT25SdW4oKSApCisJCXsKKwkJCS8vISEgTk9USElORworCQl9CisJCWVsc2UgaWYoIGFuRXhlY3V0YWJsZUZvcm0tPmhhc09uUnRjKCkgKQorCQl7CisJCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPblJ1bihTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9SVEMpKTsKKwkJfQorCisJCWVsc2UgaWYoIGFuRXhlY3V0YWJsZUZvcm0tPmhhc09uU2NoZWR1bGUoKSApCisJCXsKKwkJCWFuRXhlY3V0YWJsZUZvcm0tPnNldE9uUnVuKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TQ0hFRFVMRV9JTlZPS0UpKTsKKwkJfQorCX0KKworLy9BVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICI+fCBjb21waWxpbmc8bWFjaGluZT46ICIKKy8vCQk8PCBzdHJfaGVhZGVyKCBhTWFjaGluZSApIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7Cit9CisKKworLyoqCisgKiBjb21waWxlCisgKiBzcGVjaWZpY2F0aW9uCisgKi8KK3ZvaWQgQ29tcGlsZXI6OmNvbXBpbGVTeXN0ZW0oRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGVGb3JtKQoreworCWNvbnN0IFN5c3RlbSAqIGFTeXN0ZW0gPSBhbkV4ZWN1dGFibGVGb3JtLT5nZXRBc3RTeXN0ZW0oKTsKKworLy9BVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICI8fCBjb21waWxpbmc8c3lzdGVtPjogIgorLy8JCTw8IGFTeXN0ZW0tPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgc3RkOjplbmRsOworCisJLy8gQ29tcGlsZSBhbGwgc3BlY2lmaWMgbWFjaGluZQorCWlmKCBhU3lzdGVtLT5nZXRTcGVjaWZpZXIoKS5pc01vY1N0YXRlVHJhbnNpdGlvblN0cnVjdHVyZSgpICkKKwl7CisJCWNvbXBpbGVFeGVjdXRhYmxlTW9jU3RhdGVUcmFuc2l0aW9uU3RydWN0dXJlKGFuRXhlY3V0YWJsZUZvcm0pOworCX0KKwllbHNlIC8vaWYoIGFTeXN0ZW0tPmdldFNwZWNpZmllcigpLmlzTW9jQ29tcG9zaXRlU3RydWN0dXJlKCkKKwkJLy98fCAobm90IGFTeXN0ZW0tPmhhc1J1bm5hYmxlQmVoYXZpb3IoKSkgKQorCXsKKwkJY29tcGlsZUV4ZWN1dGFibGVNb2NDb21wb3NpdGVTdHJ1Y3R1cmUoYW5FeGVjdXRhYmxlRm9ybSk7CisJfQorCisJaWYoIG5vdCBhbkV4ZWN1dGFibGVGb3JtLT5oYXNPbkluaXQoKSApCisJeworCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPbkluaXQoIFN0YXRlbWVudENvbnN0cnVjdG9yOjpub3BDb2RlKCkgKTsKKwl9CisKKwlpZiggYW5FeGVjdXRhYmxlRm9ybS0+aGFzT25JUnVuKCkgKQorCXsKKwkJaWYoIGFuRXhlY3V0YWJsZUZvcm0tPmhhc09uUnVuKCkgKQorCQl7CisJCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPblJ1bigKKwkJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TRVFVRU5DRV9TSURFLAorCQkJCQkJCWFuRXhlY3V0YWJsZUZvcm0tPmdldE9uSVJ1bigpLAorCQkJCQkJCWFuRXhlY3V0YWJsZUZvcm0tPmdldE9uUnVuKCkpICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPblJ1biggYW5FeGVjdXRhYmxlRm9ybS0+Z2V0T25JUnVuKCkgKTsKKwkJfQorCX0KKwllbHNlIGlmKCAobm90IGFuRXhlY3V0YWJsZUZvcm0tPmhhc09uU2NoZWR1bGUoKSkKKwkJCSYmIChub3QgYW5FeGVjdXRhYmxlRm9ybS0+aGFzT25SdW4oKSkgICkKKwl7CisJCWFuRXhlY3V0YWJsZUZvcm0tPnNldE9uUnVuKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bm9wQ29kZSgpICk7CisJfQorCisKKy8vQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiPnwgY29tcGlsaW5nPHN5c3RlbT46ICIKKy8vCQk8PCBhU3lzdGVtLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7Cit9CisKKworCisKKy8qKgorICogY29tcGlsZQorICogc3RhdGVtYWNoaW5lCisgKi8KK3ZvaWQgQ29tcGlsZXI6OmNvbXBpbGVTdGF0ZW1hY2hpbmUoRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGVGb3JtKQoreworCWNvbnN0IE1hY2hpbmUgKiBhU3RhdGVtYWNoaW5lID0gYW5FeGVjdXRhYmxlRm9ybS0+Z2V0QXN0TWFjaGluZSgpOworCisvL0FWTV9PU19UUkFDRSA8PCBUQUIgPDwgIjx8IGNvbXBpbGluZzxzdGF0ZW1hY2hpbmU+OiAiCisvLwkJPDwgc3RyX2hlYWRlciggYVN0YXRlbWFjaGluZSApIDw8IHN0ZDo6ZW5kbDsKKworCS8vIFBVU0ggTU9DCisJV09iamVjdCAqIG1vY190cmFuc2l0aW9uID0gTlVMTDsvL2FTdGF0ZW1hY2hpbmU6OmdldFRyYW5zaXRpb25Nb2MoKTsKKwlpZiggbW9jX3RyYW5zaXRpb24gIT0gTlVMTCApCisJeworCQltVHJhbnNpdGlvbkNvbXBpbGVyLnB1c2hNb2MobW9jX3RyYW5zaXRpb24pOworCX0KKworCS8vIENvbXBpbGUgYWxsIHNwZWNpZmljIHN0YXRlbWFjaGluZQorCWlmKCBhU3RhdGVtYWNoaW5lLT5nZXRTcGVjaWZpZXIoKS5oYXNGYW1pbHlQc2V1ZG9zdGF0ZUVuZGluZygpICkKKwl7CisJCWNvbXBpbGVQc2V1ZG9zdGF0ZUVuZGluZyhhbkV4ZWN1dGFibGVGb3JtKTsKKwl9CisJZWxzZSBpZiggYVN0YXRlbWFjaGluZS0+Z2V0U3BlY2lmaWVyKCkuaGFzUHNldWRvc3RhdGVNb2NISVNUT1JZKCkgKQorCXsKKwkJY29tcGlsZVN0YXRlbWFjaGluZUhpc3RvcnkoYW5FeGVjdXRhYmxlRm9ybSk7CisJfQorCWVsc2UgIGlmKCBhU3RhdGVtYWNoaW5lLT5nZXRTcGVjaWZpZXIoKS5pc1BzZXVkb3N0YXRlKCkgKQorCXsKKwkJY29tcGlsZVN0YXRlbWFjaGluZVBzZXVkbyhhbkV4ZWN1dGFibGVGb3JtKTsKKwl9CisKKwllbHNlIGlmKCBhU3RhdGVtYWNoaW5lLT5nZXRTcGVjaWZpZXIoKS5pc1N0YXRlQmFzaWMoKSApCisJeworCQljb21waWxlU3RhdGVtYWNoaW5lQmFzaWMoYW5FeGVjdXRhYmxlRm9ybSk7CisJfQorCisJZWxzZSBpZiggYVN0YXRlbWFjaGluZS0+Z2V0U3BlY2lmaWVyKCkuaXNNb2NTdGF0ZVRyYW5zaXRpb25TdHJ1Y3R1cmUoKSApCisJeworCQljb21waWxlRXhlY3V0YWJsZU1vY1N0YXRlVHJhbnNpdGlvblN0cnVjdHVyZShhbkV4ZWN1dGFibGVGb3JtKTsKKwl9CisJZWxzZSBpZiggYVN0YXRlbWFjaGluZS0+Z2V0U3BlY2lmaWVyKCkuaXNNb2NDb21wb3NpdGVTdHJ1Y3R1cmUoKSApCisJeworCQljb21waWxlRXhlY3V0YWJsZU1vY0NvbXBvc2l0ZVN0cnVjdHVyZShhbkV4ZWN1dGFibGVGb3JtKTsKKwl9CisJZWxzZSBpZiggYVN0YXRlbWFjaGluZS0+Z2V0U3BlY2lmaWVyKCkuaXNDb21wb25lbnRQcm9jZWR1cmUoKSApCisJeworCQljb21waWxlRXhlY3V0YWJsZU1vY0NvbXBvc2l0ZVN0cnVjdHVyZShhbkV4ZWN1dGFibGVGb3JtKTsKKwl9CisKKwllbHNlCisJeworCQlpbmNyRXJyb3JDb3VudCgpOworCQlhU3RhdGVtYWNoaW5lLT5lcnJvckxvY2F0aW9uKEFWTV9PU19XQVJOKQorCQkJCTw8ICJVbmV4cGVjdGVkIHN0YXRlbWFjaGluZSB0eXBlIDw8ICIKKwkJCQk8PCBzdHJfaGVhZGVyKCBhU3RhdGVtYWNoaW5lICkgPDwgIiA+PiIKKwkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCX0KKworCisJLy8gQ09NUElMRSBUUkFOU0lUSU9OCisJaWYoIGFuRXhlY3V0YWJsZUZvcm0tPmhhc1RyYW5zaXRpb24oKSApCisJeworCQlBdm1UcmFuc2l0aW9uICogYVRyYW5zaXRpb247CisKKwkJYXZtX3NpemVfdCBvZmZzZXQgPSAwOworCQlmb3IoIDsgb2Zmc2V0IDwgYW5FeGVjdXRhYmxlRm9ybS0+Z2V0VHJhbnNpdGlvbigpLnNpemUoKSA7ICsrb2Zmc2V0ICkKKwkJeworCQkJYVRyYW5zaXRpb24gPSBhbkV4ZWN1dGFibGVGb3JtLT5nZXRUcmFuc2l0aW9uKCkucmF3QXQob2Zmc2V0KTsKKworQVZNX0lGX0RFQlVHX0ZMQUcoIENPTVBJTElORyApCisJQVZNX09TX1RSQUNFIDw8IElOQ1JfSU5ERU5UX1RBQiA8PCAiPHwgY29tcGlsaW5nPHRyYW5zaXRpb24+OiAiCisJCQk8PCBhVHJhbnNpdGlvbi0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggQ09NUElMSU5HICkKKworCQkJbVRyYW5zaXRpb25Db21waWxlci5jb21waWxlVHJhbnNpdGlvbiggYVRyYW5zaXRpb24gKTsKKworQVZNX0lGX0RFQlVHX0ZMQUcoIENPTVBJTElORyApCisvLwkoKml0UHJvZyktPnRvU3RyZWFtKEFWTV9PU19UUkFDRSk7CisJQVZNX09TX1RSQUNFIDw8IFRBQl9ERUNSX0lOREVOVCA8PCAiPnwgY29tcGlsaW5nPHRyYW5zaXRpb24+OiAiCisJCQk8PCBhVHJhbnNpdGlvbi0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggQ09NUElMSU5HICkKKwkJfQorCisJCWlmKCBhbkV4ZWN1dGFibGVGb3JtLT5nZXRTcGVjaWZpZXIoKS5oYXNGZWF0dXJlSW5wdXRFbmFibGVkKCkgKQorCQl7CisJCQljb21wdXRlSW5wdXRFbmFibGVkQ29tKCBhbkV4ZWN1dGFibGVGb3JtICk7CisJCX0KKwl9CisKKworCS8vIENPTVBJTEUgUFJPR1JBTQorCWlmKCBhbkV4ZWN1dGFibGVGb3JtLT5oYXNQcm9ncmFtKCkgKQorCXsKKwkJQXZtUHJvZ3JhbSAqIGFQcm9ncmFtOworCisJCWF2bV9zaXplX3Qgb2Zmc2V0ID0gMDsKKwkJZm9yKCA7IG9mZnNldCA8IGFuRXhlY3V0YWJsZUZvcm0tPmdldFByb2dyYW0oKS5zaXplKCkgOyArK29mZnNldCApCisJCXsKKwkJCWFQcm9ncmFtID0gYW5FeGVjdXRhYmxlRm9ybS0+Z2V0UHJvZ3JhbSgpLnJhd0F0KG9mZnNldCk7CisKK0FWTV9JRl9ERUJVR19GTEFHKCBDT01QSUxJTkcgKQorCUFWTV9PU19UUkFDRSA8PCBJTkNSX0lOREVOVF9UQUIgPDwgIjx8IGNvbXBpbGluZzxwcm9ncmFtPjogIgorCQkJPDwgYVByb2dyYW0tPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIENPTVBJTElORyApCisKKwkJCW1Qcm9ncmFtQ29tcGlsZXIuY29tcGlsZVByb2dyYW0oIGFQcm9ncmFtICk7CisKK0FWTV9JRl9ERUJVR19GTEFHKCBDT01QSUxJTkcgKQorLy8JKCppdFByb2cpLT50b1N0cmVhbShBVk1fT1NfVFJBQ0UpOworCUFWTV9PU19UUkFDRSA8PCBUQUJfREVDUl9JTkRFTlQgPDwgIj58IGNvbXBpbGluZzxwcm9ncmFtPjogIgorCQkJPDwgYVByb2dyYW0tPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIENPTVBJTElORyApCisJCX0KKworCQlpZiggYW5FeGVjdXRhYmxlRm9ybS0+Z2V0U3BlY2lmaWVyKCkuaGFzRmVhdHVyZUlucHV0RW5hYmxlZCgpICkKKwkJeworCQkJY29tcHV0ZUlucHV0RW5hYmxlZENvbSggYW5FeGVjdXRhYmxlRm9ybSApOworCQl9CisJfQorCisKKwkvLyBQT1AgTU9DCisJaWYoIG1vY190cmFuc2l0aW9uICE9IE5VTEwgKQorCXsKKwkJbVRyYW5zaXRpb25Db21waWxlci5wb3BNb2MoKTsKKwl9CisKKy8vQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiPnwgY29tcGlsaW5nPHN0YXRlbWFjaGluZT46ICIKKy8vCQk8PCBzdHJfaGVhZGVyKCBhU3RhdGVtYWNoaW5lICkgPDwgc3RkOjplbmRsOworfQorCisKK3ZvaWQgQ29tcGlsZXI6OmNvbXBpbGVFeGVjdXRhYmxlTW9jQ29tcG9zaXRlU3RydWN0dXJlKAorCQlFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZUZvcm0pCit7CisJY29uc3QgTWFjaGluZSAqIGFuRXhlY3V0YWJsZVNwZWMgPSBhbkV4ZWN1dGFibGVGb3JtLT5nZXRBc3RNYWNoaW5lKCk7CisKKy8vQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiPHwgY29tcGlsaW5nIGV4ZWN1dGFibGU8IG1vYzogYW5kID46ICIKKy8vCQk8PCBzdHJfaGVhZGVyKCBhbkV4ZWN1dGFibGVTcGVjICkgPDwgc3RkOjplbmRsOworCisJYm9vbCBoYXNJbnN0YW5jZVN0YXRpYyA9IGFuRXhlY3V0YWJsZVNwZWMtPmhhc01hY2hpbmUoKTsKKwlib29sIGhhc1N5bmNocm9uaXplTWFjaGluZSA9IGZhbHNlOworCWJvb2wgaGFzVXBkYXRlQnVmZmVyID0gZmFsc2U7CisKKworCS8vIE1PQyBBdHRyaWJ1dGUgZm9yIG11dGFibGUgU2NoZWR1bGUKKwlhbkV4ZWN1dGFibGVGb3JtLT5zZXRNdXRhYmxlU2NoZWR1bGUoIGZhbHNlICk7CisKKwkvKioKKwkgKiBjb21waWxlIGFsbCByb3V0aW5lcyB3aGljaCBkZWZpbmVkIHRoZSBleGVjdXRhYmxlJ3MgYmVoYXZpb3IKKwkgKi8KKwljb21waWxlQWxsQmVoYXZpb3JhbFJvdXRpbmVzKCBhbkV4ZWN1dGFibGVGb3JtICk7CisKKwkvKgorCSAqIENvbXBpbGluZyBjb21tdW5pY2F0aW9uCisJICovCisJbUNvbUNvbXBpbGVyLmNvbXBpbGVDb21tdW5pY2F0aW9uKGFuRXhlY3V0YWJsZUZvcm0sCisJCQloYXNVcGRhdGVCdWZmZXIsIGhhc1N5bmNocm9uaXplTWFjaGluZSk7CisKKworCS8qCisJICogT25SdW4KKwkgKiB3aGl0aCBoaWdoIHByaW9yaXR5IG9yZGVyCisJICoKKwkgKiBTdHJvbmdBYm9ydCBUcmFuc2l0aW9uCisJICogT25JUnVuCisJICogKCBTaW1wbGUgVHJhbnNpdGlvbiBvciBzdWJtYWNoaW5lICkgZGVwZW5kIG9uIE1PQworCSAqIFdlYWtBYm9ydCBUcmFuc2l0aW9uCisJICogTm9ybWFsVGVybWluYWlzb24gVHJhbnNpdGlvbgorCSAqLworCisJQkZDb2RlIG9uUnVuUHJvZ3JhbTsKKworCS8vIFVwZGF0ZSBCdWZmZXIKKwlpZiggaGFzSW5zdGFuY2VTdGF0aWMgKQorCXsKKwkJaWYoIGhhc1N5bmNocm9uaXplTWFjaGluZSApIAkvLyBvbmx5IGlmIGhhcyBSRFYgcHJvdG9jb2wKKwkJeworCQkJYW5FeGVjdXRhYmxlRm9ybS0+c2V0UmR2Q29tbXVuaWNhdGlvbiggaGFzU3luY2hyb25pemVNYWNoaW5lICk7CisKKwkJCXNldFJkdlNjaGVkdWxpbmcoIGFuRXhlY3V0YWJsZUZvcm0gKTsKKwkJfQorCisJCWlmKCBhbkV4ZWN1dGFibGVGb3JtLT5oYXNPblJ1bigpICkKKwkJeworCQkJb25SdW5Qcm9ncmFtID0gYW5FeGVjdXRhYmxlRm9ybS0+Z2V0T25SdW4oKTsKKworCQkJYW5FeGVjdXRhYmxlRm9ybS0+c2V0T25SdW4oIEJGQ29kZTo6UkVGX05VTEwgKTsKKworCQkJaWYoIG5vdCBBdm1Db2RlRmFjdG9yeTo6Y29udGFpbnMoYW5FeGVjdXRhYmxlRm9ybSwKKwkJCQkJb25SdW5Qcm9ncmFtLCBBVk1fT1BDT0RFX1NDSEVEVUxFX0lOVk9LRSkgKQorCQkJeworCQkJCWlmKCAobm90IGFuRXhlY3V0YWJsZUZvcm0tPmhhc09uUnRjKCkpICYmCisJCQkJCQlBdm1Db2RlRmFjdG9yeTo6Y29udGFpbnMoYW5FeGVjdXRhYmxlRm9ybSwKKwkJCQkJCQkJb25SdW5Qcm9ncmFtLCBBVk1fT1BDT0RFX1JUQykgKQorCQkJCXsKKwkJCQkJYW5FeGVjdXRhYmxlRm9ybS0+c2V0T25SdGMoCisJCQkJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU0NIRURVTEVfSU5WT0tFKSApOworCQkJCX0KKwkJCQllbHNlIGlmKCBhbkV4ZWN1dGFibGVGb3JtLT5oYXNPblNjaGVkdWxlKCkKKwkJCQkJCXx8IGFuRXhlY3V0YWJsZUZvcm0tPmlzTXV0YWJsZVNjaGVkdWxlKCkgKQorCQkJCXsKKwkJCQkJb25SdW5Qcm9ncmFtID0gU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGVGbGF0KAorCQkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU0VRVUVOQ0UsIG9uUnVuUHJvZ3JhbSwKKwkJCQkJCQlTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TQ0hFRFVMRV9JTlZPS0UpICk7CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UgaWYoIGFuRXhlY3V0YWJsZUZvcm0tPmhhc09uU2NoZWR1bGUoKQorCQkJCXx8IGFuRXhlY3V0YWJsZUZvcm0tPmlzTXV0YWJsZVNjaGVkdWxlKCkgKQorCQl7CisJCQlvblJ1blByb2dyYW0gPSBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TQ0hFRFVMRV9JTlZPS0UpOworCQl9CisKKwkJaWYoIGhhc1VwZGF0ZUJ1ZmZlciApICAvLyBvbmx5IGlmIGhhcyBCUk9BRENBU1QgcHJvdG9jb2wKKwkJeworCQkJb25SdW5Qcm9ncmFtID0gU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfVVBEQVRFX0JVRkZFUiwgb25SdW5Qcm9ncmFtKTsKKwkJfQorCX0KKworCWlmKCBhbkV4ZWN1dGFibGVTcGVjLT5oYXNPdXRnb2luZ1RyYW5zaXRpb24oKSApCisJeworCQkvLyBDb21waWxlIFN0YXRlbWFjaGluZSBUcmFuc2l0aW9uCisJCW1UcmFuc2l0aW9uQ29tcGlsZXIuY29tcGlsZVN0YXRlbWFjaGluZVRyYW5zaXRpb24oCisJCQkJYW5FeGVjdXRhYmxlRm9ybSwgb25SdW5Qcm9ncmFtICk7CisJfQorCWVsc2UgaWYoIG9uUnVuUHJvZ3JhbS52YWxpZCgpICkKKwl7CisJCWFuRXhlY3V0YWJsZUZvcm0tPnNldE9uUnVuKCBvblJ1blByb2dyYW0gKTsKKwl9CisJZWxzZSBpZiggYW5FeGVjdXRhYmxlRm9ybS0+aGFzT25JUnVuKCkgKQorCXsKKwkJYW5FeGVjdXRhYmxlRm9ybS0+c2V0T25SdW4oIFN0YXRlbWVudENvbnN0cnVjdG9yOjpub3BDb2RlKCkgKTsKKwl9CisKKworLy9BVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICI+fCBjb21waWxpbmcgZXhlY3V0YWJsZTwgbW9jOiBhbmQgPjogIgorLy8JCTw8IHN0cl9oZWFkZXIoIGFuRXhlY3V0YWJsZVNwZWMgKSA8PCBzdGQ6OmVuZGw7Cit9CisKKwordm9pZCBDb21waWxlcjo6Y29tcGlsZUV4ZWN1dGFibGVNb2NTdGF0ZVRyYW5zaXRpb25TdHJ1Y3R1cmUoCisJCUV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlRm9ybSkKK3sKKwljb25zdCBNYWNoaW5lICogYW5FeGVjdXRhYmxlU3BlYyA9IGFuRXhlY3V0YWJsZUZvcm0tPmdldEFzdE1hY2hpbmUoKTsKKworLy9BVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICI8fCBjb21waWxpbmcgZXhlY3V0YWJsZTwgbW9jOiBhbmQgPjogIgorLy8JCTw8IHN0cl9oZWFkZXIoIGFuRXhlY3V0YWJsZVNwZWMgKSA8PCBzdGQ6OmVuZGw7CisKKwlib29sIGhhc1N5bmNocm9uaXplTWFjaGluZSA9IGZhbHNlOworCWJvb2wgaGFzVXBkYXRlQnVmZmVyID0gZmFsc2U7CisKKy8vCS8qCisvLwkgKiBDb21waWxpbmcgcHJvZ3JhbQorLy8JICovCisvLworLy8JVGFibGVPZkF2bVByb2dyYW06Oml0ZXJhdG9yIGl0ID0gYW5FeGVjdXRhYmxlRm9ybS0+Z2V0UHJvZ3JhbSgpLmJlZ2luKCk7CisvLwlmb3IoIDsgaXQgIT0gYW5FeGVjdXRhYmxlRm9ybS0+Z2V0UHJvZ3JhbSgpLmVuZCgpIDsgKytpdCApCisvLwl7CisvLwkJY29tcGlsZVByb2dyYW0oYW5FeGVjdXRhYmxlRm9ybSwgKCppdCkpOworLy8JfQorCisKKwkvLyBNT0MgQXR0cmlidXRlIGZvciBtdXRhYmxlIFNjaGVkdWxlCisJYW5FeGVjdXRhYmxlRm9ybS0+c2V0TXV0YWJsZVNjaGVkdWxlKCB0cnVlICk7CisKKwlpZiggYW5FeGVjdXRhYmxlU3BlYy0+aGFzTWFjaGluZSgpICkKKwl7CisJCS8qCisJCSAqIE9OX0lOSVQKKwkJICogT05fRU5BQkxFCisJCSAqLworCQkvLyBub24gZGV0ZXJtaW5pc206IHNpbXVsYXRpb24gb2YgZW5hYmxpbmcgZm9yCisJCS8vIGVhY2ggWyBzdGFydCBdIHN0YXRlIG9yIFsgaW5pdGlhbCBdIHN0YXRlIC4uLgorCQlCRkNvZGUgb25Jbml0Q29kZSggT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9OT05ERVRFUk1JTklTTSApOworCisJCUJGQ29kZSBvbkVuYWJsZUNvZGUoIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfTk9OREVURVJNSU5JU00gKTsKKworCQlCRkNvZGUgb25TY2hlZHVsZUNvZGUoIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfTk9OREVURVJNSU5JU00gKTsKKworCQlib29sIGhhc25vdE93bmVkUHNldWRvc3RhdGVIaXN0b3J5ID0gKG5vdCBhbkV4ZWN1dGFibGVTcGVjLT4KKwkJCQlnZXRPd25lZEVsZW1lbnRzU3BlY2lmaWVyKCkuaGFzUHNldWRvc3RhdGVNb2NISVNUT1JZKCkpOworCisJCWJvb2wgaGFzbm90T3duZWRQc2V1ZG9zdGF0ZUluaXRpYWxPclN0YXRlU3RhcnQgPQorCQkJCShub3QgYW5FeGVjdXRhYmxlU3BlYy0+CisJCQkJCQlnZXRPd25lZEVsZW1lbnRzU3BlY2lmaWVyKCkuaGFzTW9jSU5JVElBTF9TVEFSVCgpKTsKKworCQlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBpdE1hY2hpbmUgPQorCQkJCWFuRXhlY3V0YWJsZUZvcm0tPmluc3RhbmNlX3N0YXRpY19iZWdpbigpOworCQlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBlbmRNYWNoaW5lID0KKwkJCQlhbkV4ZWN1dGFibGVGb3JtLT5pbnN0YW5jZV9zdGF0aWNfZW5kKCk7CisJCWZvciggOyBpdE1hY2hpbmUgIT0gZW5kTWFjaGluZSA7ICsraXRNYWNoaW5lICkKKwkJeworCQkJY29uc3QgU3BlY2lmaWVyICYgaXRTcGVjaWZpZXIgPQorCQkJCQkoKml0TWFjaGluZSkuZ2V0RXhlY3V0YWJsZSgpLT5nZXRTcGVjaWZpZXIoKTsKKworCQkJaWYoIGl0U3BlY2lmaWVyLmlzUHNldWRvc3RhdGVJbml0aWFsT3JTdGF0ZVN0YXJ0KCkgKQorCQkJeworCQkJCW9uSW5pdENvZGUtPmFwcGVuZCggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0lOSVQsICgqaXRNYWNoaW5lKSApICk7CisKKwkJCQlpZiggaGFzbm90T3duZWRQc2V1ZG9zdGF0ZUhpc3RvcnkgKQorCQkJCXsKKwkJCQkJb25FbmFibGVDb2RlLT5hcHBlbmQoIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfRU5BQkxFX0lOVk9LRSwKKwkJCQkJCQkoKml0TWFjaGluZSkgKSApOworCQkJCX0KKworCQkJCW9uU2NoZWR1bGVDb2RlLT5hcHBlbmQoIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9SVU4sICgqaXRNYWNoaW5lKSkgKTsKKwkJCX0KKwkJCWVsc2UgaWYoIGl0U3BlY2lmaWVyLmhhc1BzZXVkb3N0YXRlSGlzdG9yeSgpICkKKwkJCXsKKwkJCQlvbkVuYWJsZUNvZGUtPmFwcGVuZCggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0VOQUJMRV9JTlZPS0UsCisJCQkJCQkoKml0TWFjaGluZSkgKSApOworCQkJfQorCQkJZWxzZSBpZiggaGFzbm90T3duZWRQc2V1ZG9zdGF0ZUluaXRpYWxPclN0YXRlU3RhcnQgKQorCQkJeworCQkJCW9uSW5pdENvZGUtPmFwcGVuZCggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0lOSVQsICgqaXRNYWNoaW5lKSApICk7CisKKwkJCQlpZiggaGFzbm90T3duZWRQc2V1ZG9zdGF0ZUhpc3RvcnkgKQorCQkJCXsKKwkJCQkJb25FbmFibGVDb2RlLT5hcHBlbmQoIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQVRPTUlDX1NFUVVFTkNFLAorCQkJCQkJCVN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9FTkFCTEVfU0VULAorCQkJCQkJCQkJKCppdE1hY2hpbmUpICksCisJCQkJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0VOQUJMRV9JTlZPS0UsCisJCQkJCQkJCQkoKml0TWFjaGluZSkgKSApICk7CisJCQkJfQorCisJCQkJb25TY2hlZHVsZUNvZGUtPmFwcGVuZCggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1JVTiwgKCppdE1hY2hpbmUpICkgKTsKKwkJCX0KKwkJfQorCisJCS8vIE9OIElOSVQKKwkJaWYoIG9uSW5pdENvZGUtPm5vbmVtcHR5KCkgKQorCQl7CisJCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPbkluaXQoIFN0YXRlbWVudENvbnN0cnVjdG9yOjp4bmV3Q29kZUZsYXQoCisJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU0VRVUVOQ0UsCisJCQkJCWFuRXhlY3V0YWJsZUZvcm0tPmdldE9uSW5pdCgpLAorCQkJCQkob25Jbml0Q29kZS0+c2luZ2xldG9uKCkgPworCQkJCQkJCW9uSW5pdENvZGUtPmZpcnN0KCkuYmZDb2RlKCkgOiBvbkluaXRDb2RlKSApICk7CisJCX0KKworCQkvLyBPTiBFTkFCTEUKKwkJaWYoIG9uRW5hYmxlQ29kZS0+bm9uZW1wdHkoKSApCisJCXsKKwkJCWFuRXhlY3V0YWJsZUZvcm0tPnNldE9uRW5hYmxlKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6eG5ld0NvZGVGbGF0KAorCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NFUVVFTkNFLAorCQkJCQlhbkV4ZWN1dGFibGVGb3JtLT5nZXRPbkVuYWJsZSgpLAorCQkJCQkob25FbmFibGVDb2RlLT5zaW5nbGV0b24oKSA/CisJCQkJCQkJb25FbmFibGVDb2RlLT5maXJzdCgpLmJmQ29kZSgpIDogb25FbmFibGVDb2RlKSApICk7CisJCX0KKworCQkvKioKKwkJICogT04gU0NIRURVTEUKKwkJICovCisJCWlmKCBhbkV4ZWN1dGFibGVGb3JtLT5oYXNPblNjaGVkdWxlKCkgKQorCQl7CisJCQlpbmNyRXJyb3JDb3VudCgpOworCQkJYW5FeGVjdXRhYmxlU3BlYy0+ZXJyb3JMb2NhdGlvbihBVk1fT1NfV0FSTikKKwkJCQkJPDwgIlVuZXhwZWN0ZWQgYSBTdGF0ZS1UcmFuc2l0aW9uLVN5c3RlbSA8PCAiCisJCQkJCTw8IHN0cl9oZWFkZXIoIGFuRXhlY3V0YWJsZVNwZWMgKQorCQkJCQk8PCAiID4+IHdpdGggdXNlciBzY2hlZHVsZSBjb2RlOiAiCisJCQkJCTw8IGFuRXhlY3V0YWJsZUZvcm0tPmdldE9uU2NoZWR1bGUoKSA8PCBzdGQ6OmVuZGw7CisJCX0KKwkJZWxzZSBpZiggb25TY2hlZHVsZUNvZGUtPm5vbmVtcHR5KCkgKQorCQl7CisJCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPblNjaGVkdWxlKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6eG5ld0NvZGVGbGF0KAorCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NFUVVFTkNFLAorCQkJCQlhbkV4ZWN1dGFibGVGb3JtLT5nZXRPblNjaGVkdWxlKCksCisJCQkJCShvblNjaGVkdWxlQ29kZS0+c2luZ2xldG9uKCkgPworCQkJCQkJb25TY2hlZHVsZUNvZGUtPmZpcnN0KCkuYmZDb2RlKCkgOiBvblNjaGVkdWxlQ29kZSkgKSApOworCQl9CisJCWVsc2UgaWYoIGFuRXhlY3V0YWJsZUZvcm0tPmhhc09uZUluc3RhbmNlU3RhdGljKCkgKQorCQl7CisJCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPblNjaGVkdWxlKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9SVU4sCisJCQkJCWFuRXhlY3V0YWJsZUZvcm0tPmZpcnN0SW5zdGFuY2VTdGF0aWMoKSApICk7CisJCX0KKworCQkvKgorCQkgKiBPTl9ESVNBQkxFCisJCSAqLworCQlpZiggYW5FeGVjdXRhYmxlRm9ybS0+aGFzT25EaXNhYmxlKCkgKQorCQl7CisJCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPbkRpc2FibGUoCisJCQkJCVN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlRmxhdCgKKwkJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NFUVVFTkNFLAorCQkJCQkJCVN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9ESVNBQkxFX0NISUxEKSwKKwkJCQkJCQlhbkV4ZWN1dGFibGVGb3JtLT5nZXRPbkRpc2FibGUoKSApICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPbkRpc2FibGUoIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FUT01JQ19TRVFVRU5DRSwKKwkJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9ESVNBQkxFX0NISUxEKSwKKwkJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9ESVNBQkxFX1NFTEYpICkgKTsKKwkJfQorCX0KKworCS8qCisJICogQ29tcGlsaW5nIGNvbW11bmljYXRpb24KKwkgKi8KKwltQ29tQ29tcGlsZXIuY29tcGlsZUNvbW11bmljYXRpb24oYW5FeGVjdXRhYmxlRm9ybSwKKwkJCWhhc1VwZGF0ZUJ1ZmZlciwgaGFzU3luY2hyb25pemVNYWNoaW5lKTsKKworCisJLyoKKwkgKiBPblJ1bgorCSAqIHdoaXRoIGhpZ2ggcHJpb3JpdHkgb3JkZXIKKwkgKgorCSAqIFN0cm9uZ0Fib3J0IFRyYW5zaXRpb24KKwkgKiBPbklSdW4KKwkgKiAoIFNpbXBsZSBUcmFuc2l0aW9uIG9yIHN1Ym1hY2hpbmUgKSBkZXBlbmQgb24gTU9DCisJICogV2Vha0Fib3J0IFRyYW5zaXRpb24KKwkgKiBOb3JtYWxUZXJtaW5haXNvbiBUcmFuc2l0aW9uCisJICovCisKKwlCRkNvZGUgb25SdW5Qcm9ncmFtOworCisJLy8gVXBkYXRlIEJ1ZmZlcgorCWlmKCBhbkV4ZWN1dGFibGVTcGVjLT5oYXNNYWNoaW5lKCkgKQorCXsKKwkJaWYoIGhhc1N5bmNocm9uaXplTWFjaGluZSApIAkvLyBvbmx5IGlmIGhhcyBSRFYgcHJvdG9jb2wKKwkJeworCQkJYW5FeGVjdXRhYmxlRm9ybS0+c2V0UmR2Q29tbXVuaWNhdGlvbiggaGFzU3luY2hyb25pemVNYWNoaW5lICk7CisKKwkJCXNldFJkdlNjaGVkdWxpbmcoIGFuRXhlY3V0YWJsZUZvcm0gKTsKKwkJfQorCisJCWlmKCBhbkV4ZWN1dGFibGVGb3JtLT5oYXNPblJ1bigpICkKKwkJeworCQkJb25SdW5Qcm9ncmFtID0gYW5FeGVjdXRhYmxlRm9ybS0+Z2V0T25SdW4oKTsKKworCQkJaWYoIEF2bUNvZGVGYWN0b3J5Ojpjb250YWlucyhhbkV4ZWN1dGFibGVGb3JtLAorCQkJCQlvblJ1blByb2dyYW0sIEFWTV9PUENPREVfU0NIRURVTEVfSU5WT0tFKSApCisJCQl7CisJCQkJLy8hIU5PVEhJTkcKKwkJCX0KKwkJCWVsc2UgaWYoIChub3QgYW5FeGVjdXRhYmxlRm9ybS0+aGFzT25SdGMoKSkKKwkJCQkJJiYgQXZtQ29kZUZhY3Rvcnk6OmNvbnRhaW5zKGFuRXhlY3V0YWJsZUZvcm0sCisJCQkJCQkJb25SdW5Qcm9ncmFtLCBBVk1fT1BDT0RFX1JUQykgKQorCQkJeworCQkJCWFuRXhlY3V0YWJsZUZvcm0tPnNldE9uUnRjKAorCQkJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU0NIRURVTEVfSU5WT0tFKSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW9uUnVuUHJvZ3JhbSA9IFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlRmxhdCgKKwkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU0VRVUVOQ0UsIG9uUnVuUHJvZ3JhbSwKKwkJCQkJCVN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NDSEVEVUxFX0lOVk9LRSkgKTsKKwkJCX0KKworCQkJYW5FeGVjdXRhYmxlRm9ybS0+c2V0T25SdW4oIEJGQ29kZTo6UkVGX05VTEwgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW9uUnVuUHJvZ3JhbSA9IFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NDSEVEVUxFX0lOVk9LRSk7CisJCX0KKworCQlpZiggaGFzVXBkYXRlQnVmZmVyICkgIC8vIG9ubHkgaWYgaGFzIEJST0FEQ0FTVCBwcm90b2NvbAorCQl7CisJCQlvblJ1blByb2dyYW0gPSBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9VUERBVEVfQlVGRkVSLCBvblJ1blByb2dyYW0pOworCQl9CisJfQorCisJaWYoIGFuRXhlY3V0YWJsZVNwZWMtPmhhc091dGdvaW5nVHJhbnNpdGlvbigpICkKKwl7CisJCS8vIENvbXBpbGUgU3RhdGVtYWNoaW5lIFRyYW5zaXRpb24KKwkJbVRyYW5zaXRpb25Db21waWxlci5jb21waWxlU3RhdGVtYWNoaW5lVHJhbnNpdGlvbigKKwkJCQlhbkV4ZWN1dGFibGVGb3JtLCBvblJ1blByb2dyYW0pOworCX0KKwllbHNlIGlmKCBvblJ1blByb2dyYW0udmFsaWQoKSApCisJeworCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPblJ1biggb25SdW5Qcm9ncmFtICk7CisJfQorCWVsc2UgaWYoIGFuRXhlY3V0YWJsZUZvcm0tPmhhc09uSVJ1bigpICkKKwl7CisJCWFuRXhlY3V0YWJsZUZvcm0tPnNldE9uUnVuKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bm9wQ29kZSgpICk7CisJfQorCisKKy8vQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiPnwgY29tcGlsaW5nIGV4ZWN1dGFibGU8IG1vYzogYW5kID46ICIKKy8vCQk8PCBzdHJfaGVhZGVyKCBhbkV4ZWN1dGFibGVTcGVjICkgPDwgc3RkOjplbmRsOworfQorCisKK3ZvaWQgQ29tcGlsZXI6OmNvbXBpbGVQc2V1ZG9zdGF0ZUVuZGluZyhFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZUZvcm0pCit7CisJY29uc3QgTWFjaGluZSAqIGFTdGF0ZW1hY2hpbmUgPSBhbkV4ZWN1dGFibGVGb3JtLT5nZXRBc3RNYWNoaW5lKCk7CisKKy8vQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiPHwgY29tcGlsaW5nPHN0YXRlbWFjaGluZT46ICIKKy8vCQk8PCBzdHJfaGVhZGVyKCBhU3RhdGVtYWNoaW5lICkgPDwgc3RkOjplbmRsOworCisJLy8gTU9DIEF0dHJpYnV0ZSBmb3IgbXV0YWJsZSBTY2hlZHVsZQorCWFuRXhlY3V0YWJsZUZvcm0tPnNldE11dGFibGVTY2hlZHVsZSggZmFsc2UgKTsKKworCS8qCisJICogT04gRU5BQkxFCisJICovCisJQkZDb2RlIG9uVGVybWluYWxDb2RlOworCisJaWYoIGFTdGF0ZW1hY2hpbmUtPmdldFNwZWNpZmllcigpLmlzUHNldWRvc3RhdGVUZXJtaW5hbCgpICkKKwl7CisJCW9uVGVybWluYWxDb2RlID0gU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9ERVNUUk9ZLCBFeGVjdXRhYmxlTGliOjpNQUNISU5FX1BBUkVOVCk7CisJfQorCWVsc2UgLy9pZiggYVN0YXRlbWFjaGluZS0+Z2V0U3BlY2lmaWVyKCkuaXNQc2V1ZG9zdGF0ZVJldHVybigpICkKKwl7CisJCW9uVGVybWluYWxDb2RlID0gU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9GSU5BTCk7CisJfQorCisJYW5FeGVjdXRhYmxlRm9ybS0+c2V0T25FbmFibGUoIFN0YXRlbWVudENvbnN0cnVjdG9yOjp4bmV3Q29kZUZsYXQoCisJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NFUVVFTkNFLAorCQkJYW5FeGVjdXRhYmxlRm9ybS0+Z2V0T25FbmFibGUoKSwgb25UZXJtaW5hbENvZGUpICk7CisKKwlpZiggYVN0YXRlbWFjaGluZS0+aGFzT3V0Z29pbmdUcmFuc2l0aW9uKCkgKQorCXsKKwkJaW5jckVycm9yQ291bnQoKTsKKwkJYVN0YXRlbWFjaGluZS0+ZXJyb3JMb2NhdGlvbihBVk1fT1NfV0FSTikKKwkJCQk8PCAiVW5leHBlY3RlZCBzdGF0ZTwgdGVybWluYWwgPiA8PCAiCisJCQkJPDwgc3RyX2hlYWRlciggYVN0YXRlbWFjaGluZSApCisJCQkJPDwgIiA+PiB3aXRoIG91dGdvaW5nIHRyYW5zaXRpb25zIgorCQkJCTw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisJfQorCisvL2FTdGF0ZW1hY2hpbmUtPnRvU3RyZWFtKEFWTV9PU19UUkFDRSA8PCBUQUIpOworLy9hbkV4ZWN1dGFibGVGb3JtLT50b1N0cmVhbShBVk1fT1NfVFJBQ0UgPDwgVEFCKTsKKy8vQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiPnwgY29tcGlsaW5nPHN0YXRlbWFjaGluZT46ICIKKy8vCQk8PCBzdHJfaGVhZGVyKCBhU3RhdGVtYWNoaW5lICkgPDwgc3RkOjplbmRsOworfQorCisKK3ZvaWQgQ29tcGlsZXI6OmNvbXBpbGVTdGF0ZW1hY2hpbmVIaXN0b3J5KEV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlRm9ybSkKK3sKKwljb25zdCBNYWNoaW5lICogYVN0YXRlbWFjaGluZSA9IGFuRXhlY3V0YWJsZUZvcm0tPmdldEFzdE1hY2hpbmUoKTsKKworLy9BVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICI8fCBjb21waWxpbmc8c3RhdGVtYWNoaW5lPjogIgorLy8JCTw8IHN0cl9oZWFkZXIoIGFTdGF0ZW1hY2hpbmUgKSA8PCBzdGQ6OmVuZGw7CisKKwkvLyBNT0MgQXR0cmlidXRlIGZvciBtdXRhYmxlIFNjaGVkdWxlCisJYW5FeGVjdXRhYmxlRm9ybS0+c2V0TXV0YWJsZVNjaGVkdWxlKCBmYWxzZSApOworCisJaWYoIGFTdGF0ZW1hY2hpbmUtPmhhc091dGdvaW5nVHJhbnNpdGlvbigpICkKKwl7CisJCS8vIENvbXBpbGUgU3RhdGVtYWNoaW5lIFRyYW5zaXRpb24KKwkJbVRyYW5zaXRpb25Db21waWxlci5jb21waWxlU3RhdGVtYWNoaW5lVHJhbnNpdGlvbigKKwkJCQlhbkV4ZWN1dGFibGVGb3JtICwgYW5FeGVjdXRhYmxlRm9ybS0+Z2V0T25SdW4oKSk7CisJfQorCisJQkZDb2RlIG9uRW5hYmxlQ29kZSA9IFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9SVU4pOworCisJQkZDb2RlIG9uSGlzdG9yeUNvZGUgPSBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCWFTdGF0ZW1hY2hpbmUtPmdldFNwZWNpZmllcigpLmlzUHNldWRvc3RhdGVEZWVwSGlzdG9yeSgpID8KKwkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9ERUVQX0hJU1RPUllfSU5WT0tFIDoKKwkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TSEFMTE9XX0hJU1RPUllfSU5WT0tFLAorCQkJRXhlY3V0YWJsZUxpYjo6TUFDSElORV9QQVJFTlQpOworCisJaWYoIGFuRXhlY3V0YWJsZUZvcm0tPmhhc09uUnVuKCkgKQorCXsKKwkJYW5FeGVjdXRhYmxlRm9ybS0+c2V0T25SdW4oIFN0YXRlbWVudENvbnN0cnVjdG9yOjp4bmV3Q29kZUZsYXQoCisJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9QUklPUl9HVCwKKwkJCQlhbkV4ZWN1dGFibGVGb3JtLT5nZXRPblJ1bigpLCBvbkhpc3RvcnlDb2RlKSApOworCX0KKwllbHNlIGlmKCBhbkV4ZWN1dGFibGVGb3JtLT5oYXNPbklSdW4oKSApCisJeworCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPblJ1biggb25IaXN0b3J5Q29kZSApOworCX0KKwllbHNlCisJeworCQlvbkVuYWJsZUNvZGUgPSBvbkhpc3RvcnlDb2RlOworCX0KKworCisJLyoKKwkgKiBPTiBJTklUCisJICogT04gRU5BQkxFCisJICovCisJLy8gdGhpcyBpcyBhU3RhdGVtYWNoaW5lLT5nZXRTcGVjaWZpZXIoKS5pc1BzZXVkb3N0YXRlKCkKKwkvLyBPTiBJTklUCisJYW5FeGVjdXRhYmxlRm9ybS0+c2V0T25Jbml0KCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6eG5ld0NvZGVGbGF0KAorCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TRVFVRU5DRSwKKwkJCWFuRXhlY3V0YWJsZUZvcm0tPmdldE9uSW5pdCgpLCBvbkVuYWJsZUNvZGUpICk7CisKKwkvLyBPTiBFTkFCTEUKKwlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPbkVuYWJsZSggU3RhdGVtZW50Q29uc3RydWN0b3I6OnhuZXdDb2RlRmxhdCgKKwkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU0VRVUVOQ0UsCisJCQlhbkV4ZWN1dGFibGVGb3JtLT5nZXRPbkVuYWJsZSgpLCBvbkVuYWJsZUNvZGUpICk7CisKKy8vYVN0YXRlbWFjaGluZS0+dG9TdHJlYW0oQVZNX09TX1RSQUNFIDw8IFRBQik7CisvL2FuRXhlY3V0YWJsZUZvcm0tPnRvU3RyZWFtKEFWTV9PU19UUkFDRSA8PCBUQUIpOworLy9BVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICI+fCBjb21waWxpbmc8c3RhdGVtYWNoaW5lPjogIgorLy8JCTw8IHN0cl9oZWFkZXIoIGFTdGF0ZW1hY2hpbmUgKSA8PCBzdGQ6OmVuZGw7Cit9CisKKwordm9pZCBDb21waWxlcjo6Y29tcGlsZVN0YXRlbWFjaGluZVBzZXVkbyhFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZUZvcm0pCit7CisJY29uc3QgTWFjaGluZSAqIGFTdGF0ZW1hY2hpbmUgPSBhbkV4ZWN1dGFibGVGb3JtLT5nZXRBc3RNYWNoaW5lKCk7CisKKy8vQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiPHwgY29tcGlsaW5nPHN0YXRlbWFjaGluZT46ICIKKy8vCQk8PCBzdHJfaGVhZGVyKCBhU3RhdGVtYWNoaW5lICkgPDwgc3RkOjplbmRsOworCisJLy8gTU9DIEF0dHJpYnV0ZSBmb3IgbXV0YWJsZSBTY2hlZHVsZQorCWFuRXhlY3V0YWJsZUZvcm0tPnNldE11dGFibGVTY2hlZHVsZSggZmFsc2UgKTsKKworCS8qCisJICogT04gSU5JVAorCSAqIE9OIEVOQUJMRQorCSAqLworCUJGQ29kZSBvbkVuYWJsZUNvZGUgID0gU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1JVTik7CisKKwkvLyBPTiBJTklUCisJaWYoIGFTdGF0ZW1hY2hpbmUtPmdldFNwZWNpZmllcigpLmlzUHNldWRvc3RhdGVJbml0aWFsKCkKKwkJJiYgYW5FeGVjdXRhYmxlRm9ybS0+aGFzT25FbmFibGUoKSApCisJeworCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPbkluaXQoCisJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6OnhuZXdDb2RlRmxhdCgKKwkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU0VRVUVOQ0UsCisJCQkJCQlhbkV4ZWN1dGFibGVGb3JtLT5nZXRPbkluaXQoKSwKKwkJCQkJCWFuRXhlY3V0YWJsZUZvcm0tPmdldE9uRW5hYmxlKCksIG9uRW5hYmxlQ29kZSkgKTsKKwl9CisJZWxzZQorCXsKKwkJYW5FeGVjdXRhYmxlRm9ybS0+c2V0T25Jbml0KCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6eG5ld0NvZGVGbGF0KAorCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU0VRVUVOQ0UsCisJCQkJYW5FeGVjdXRhYmxlRm9ybS0+Z2V0T25Jbml0KCksIG9uRW5hYmxlQ29kZSkgKTsKKwl9CisKKwlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPbkVuYWJsZSgKKwkJCVN0YXRlbWVudENvbnN0cnVjdG9yOjp4bmV3Q29kZUZsYXQoCisJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU0VRVUVOQ0UsCisJCQkJCWFuRXhlY3V0YWJsZUZvcm0tPmdldE9uRW5hYmxlKCksIG9uRW5hYmxlQ29kZSkgKTsKKworCisKKwkvKgorCSAqIFNjaGVkdWxlIFN0YXRlIFRyYW5zaXRpb24KKwkgKi8KKwlpZiggYVN0YXRlbWFjaGluZS0+Z2V0U3BlY2lmaWVyKCkuaXNQc2V1ZG9zdGF0ZUZvcmsoKSApCisJeworCQlpZiggYVN0YXRlbWFjaGluZS0+aGFzT3V0Z29pbmdUcmFuc2l0aW9uKCkgJiYKKwkJCWFTdGF0ZW1hY2hpbmUtPmdldEJlaGF2aW9yKCktPgorCQkJCQlnZXRPdXRnb2luZ1RyYW5zaXRpb25zKCkucG9wdWxhdGVkKCkgKQorCQl7CisJCQkvLyBTY2hlZHVsZSBTdGF0ZTwgZm9yayA+IFRyYW5zaXRpb24KKwkJCW1UcmFuc2l0aW9uQ29tcGlsZXIuY29tcGlsZVN0YXRlRm9ya091dHB1dFRyYW5zaXRpb24oCisJCQkJCWFuRXhlY3V0YWJsZUZvcm0sIGFuRXhlY3V0YWJsZUZvcm0tPmdldE9uUnVuKCkpOworCQl9CisJCWVsc2UKKwkJeworCQkJaW5jckVycm9yQ291bnQoKTsKKwkJCWFTdGF0ZW1hY2hpbmUtPmVycm9yTG9jYXRpb24oQVZNX09TX1dBUk4pCisJCQkJCTw8ICJVbmV4cGVjdGVkIHBzZXVkb3N0YXRlPCBmb3JrID4gPDwgIgorCQkJCQk8PCBzdHJfaGVhZGVyKCBhU3RhdGVtYWNoaW5lICkKKwkJCQkJPDwgIiA+PiB3aXRoIGxlc3MgdGhhbiAyIG91dGdvaW5nIHRyYW5zaXRpb25zIgorCQkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCQl9CisJfQorCisJZWxzZSBpZiggYVN0YXRlbWFjaGluZS0+Z2V0U3BlY2lmaWVyKCkuaXNQc2V1ZG9zdGF0ZUpvaW4oKSApCisJeworCQlpZiggYVN0YXRlbWFjaGluZS0+aGFzSW5jb21pbmdUcmFuc2l0aW9uKCkKKwkJCSYmIGFTdGF0ZW1hY2hpbmUtPmdldEJlaGF2aW9yKCktPgorCQkJCQlnZXRJbmNvbWluZ1RyYW5zaXRpb25zKCkucG9wdWxhdGVkKCkgKQorCQl7CisJCQkvLyBTWW5jaHJvbml6ZSBpbmNvbWluZyBUcmFuc2l0aW9uCisJCQltVHJhbnNpdGlvbkNvbXBpbGVyLmNvbXBpbGVTdGF0ZUpvaW5JbnB1dFRyYW5zaXRpb24oCisJCQkJCWFuRXhlY3V0YWJsZUZvcm0gKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWluY3JFcnJvckNvdW50KCk7CisJCQlhU3RhdGVtYWNoaW5lLT5lcnJvckxvY2F0aW9uKEFWTV9PU19XQVJOKQorCQkJCQk8PCAiVW5leHBlY3RlZCBwc2V1ZG9zdGF0ZTwgam9pbiA+IDw8ICIKKwkJCQkJPDwgc3RyX2hlYWRlciggYVN0YXRlbWFjaGluZSApCisJCQkJCTw8ICIgPj4gd2l0aCBsZXNzIHRoYW4gMiBpbmNvbWluZyB0cmFuc2l0aW9ucyIKKwkJCQkJPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKwkJfQorCisKKwkJaWYoIGFTdGF0ZW1hY2hpbmUtPmhhc091dGdvaW5nVHJhbnNpdGlvbigpICkKKwkJeworCQkJLy8gQ29tcGlsZSBTdGF0ZW1hY2hpbmUgVHJhbnNpdGlvbgorCQkJbVRyYW5zaXRpb25Db21waWxlci5jb21waWxlU3RhdGVtYWNoaW5lVHJhbnNpdGlvbigKKwkJCQkJYW5FeGVjdXRhYmxlRm9ybSAsIGFuRXhlY3V0YWJsZUZvcm0tPmdldE9uUnVuKCkpOworCQl9CisJCWVsc2UKKwkJeworCQkJaW5jckVycm9yQ291bnQoKTsKKwkJCWFTdGF0ZW1hY2hpbmUtPmVycm9yTG9jYXRpb24oQVZNX09TX1dBUk4pCisJCQkJCTw8ICJVbmV4cGVjdGVkIHBzZXVkb3N0YXRlPCBqb2luID4gPDwgIgorCQkJCQk8PCBzdHJfaGVhZGVyKCBhU3RhdGVtYWNoaW5lICkKKwkJCQkJPDwgIiA+PiB3aXRob3V0IG91dGdvaW5nIHRyYW5zaXRpb25zIgorCQkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCQl9CisJfQorCisKKwllbHNlIGlmKCBhU3RhdGVtYWNoaW5lLT5oYXNPdXRnb2luZ1RyYW5zaXRpb24oKSApCisJeworCQkvLyBDb21waWxlIFN0YXRlbWFjaGluZSBUcmFuc2l0aW9uCisJCW1UcmFuc2l0aW9uQ29tcGlsZXIuY29tcGlsZVN0YXRlbWFjaGluZVRyYW5zaXRpb24oCisJCQkJYW5FeGVjdXRhYmxlRm9ybSAsIGFuRXhlY3V0YWJsZUZvcm0tPmdldE9uUnVuKCkgKTsKKwl9CisKKworCWlmKCBub3QgYW5FeGVjdXRhYmxlRm9ybS0+aGFzT25SdW4oKSApCisJeworCQlpZiggbm90IGFTdGF0ZW1hY2hpbmUtPmdldFNwZWNpZmllcigpLmhhc0ZhbWlseVBzZXVkb3N0YXRlRU5ESU5HKCkgKQorCQl7CisJCQlpbmNyV2FybmluZ0NvdW50KCk7CisJCQlhU3RhdGVtYWNoaW5lLT53YXJuaW5nTG9jYXRpb24oQVZNX09TX1dBUk4pCisJCQkJCTw8ICJObyBldmFsIGNvZGUgZm9yIDw8ICIgPDwgc3RyX2hlYWRlciggYVN0YXRlbWFjaGluZSApCisJCQkJCTw8ICIgPj4gd2hpY2ggaXMgbm90IFRFUk1JTkFMIG9yIFJFVFVSTiBtb2MhIiA8PCBzdGQ6OmVuZGw7CisJCX0KKwkJZWxzZSBpZiggYVN0YXRlbWFjaGluZS0+Z2V0U3BlY2lmaWVyKCkuaXNQc2V1ZG9zdGF0ZUluaXRpYWwoKSApCisJCXsKKwkJCWluY3JFcnJvckNvdW50KCk7CisJCQlhU3RhdGVtYWNoaW5lLT5lcnJvckxvY2F0aW9uKEFWTV9PU19XQVJOKQorCQkJCQk8PCAiTm8gZXZhbCBjb2RlIGZvciA8PCAiIDw8IHN0cl9oZWFkZXIoIGFTdGF0ZW1hY2hpbmUgKQorCQkJCQk8PCAiID4+IHdoaWNoIGlzIGFuIElOSVRJQUwgc3RhdGUhISEiIDw8IHN0ZDo6ZW5kbDsKKworCQkJYW5FeGVjdXRhYmxlRm9ybS0+c2V0T25SdW4oIFN0YXRlbWVudENvbnN0cnVjdG9yOjpub3BDb2RlKCkgKTsKKwkJfQorCQlBVk1fT1NfV0FSTiA8PCBzdGQ6OmVuZGw7CisKKwkJaWYoIGFuRXhlY3V0YWJsZUZvcm0tPmhhc09uSVJ1bigpICkKKwkJeworCQkJYW5FeGVjdXRhYmxlRm9ybS0+c2V0T25SdW4oIFN0YXRlbWVudENvbnN0cnVjdG9yOjpub3BDb2RlKCkgKTsKKwkJfQorCX0KKworLy9hU3RhdGVtYWNoaW5lLT50b1N0cmVhbShBVk1fT1NfVFJBQ0UgPDwgVEFCKTsKKy8vYW5FeGVjdXRhYmxlRm9ybS0+dG9TdHJlYW0oQVZNX09TX1RSQUNFIDw8IFRBQik7CisvL0FWTV9PU19UUkFDRSA8PCBUQUIgPDwgIj58IGNvbXBpbGluZzxzdGF0ZW1hY2hpbmU+OiAiCisvLwkJPDwgc3RyX2hlYWRlciggYVN0YXRlbWFjaGluZSApIDw8IHN0ZDo6ZW5kbDsKK30KKworCit2b2lkIENvbXBpbGVyOjpjb21waWxlU3RhdGVtYWNoaW5lQmFzaWMoRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGVGb3JtKQoreworCWNvbnN0IE1hY2hpbmUgKiBhU3RhdGVtYWNoaW5lID0gYW5FeGVjdXRhYmxlRm9ybS0+Z2V0QXN0TWFjaGluZSgpOworCisvL0FWTV9PU19UUkFDRSA8PCBUQUIgPDwgIjx8IGNvbXBpbGluZzxzdGF0ZW1hY2hpbmU+OiAiCisvLwkJPDwgc3RyX2hlYWRlciggYVN0YXRlbWFjaGluZSApIDw8IHN0ZDo6ZW5kbDsKKworCS8vIE1PQyBBdHRyaWJ1dGUgZm9yIG11dGFibGUgU2NoZWR1bGUKKwlhbkV4ZWN1dGFibGVGb3JtLT5zZXRNdXRhYmxlU2NoZWR1bGUoIGZhbHNlICk7CisKKworCS8vIE9OIElOSVQKKwlpZiggYVN0YXRlbWFjaGluZS0+Z2V0U3BlY2lmaWVyKCkuaXNTdGF0ZVN0YXJ0KCkKKwkJJiYgYW5FeGVjdXRhYmxlRm9ybS0+aGFzT25FbmFibGUoKSApCisJeworCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPbkluaXQoCisJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6OnhuZXdDb2RlRmxhdCgKKwkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU0VRVUVOQ0UsCisJCQkJCQlhbkV4ZWN1dGFibGVGb3JtLT5nZXRPbkluaXQoKSwKKwkJCQkJCWFuRXhlY3V0YWJsZUZvcm0tPmdldE9uRW5hYmxlKCkpICk7CisJfQorCisKKwkvKgorCSAqIFNjaGVkdWxlIFN0YXRlIFRyYW5zaXRpb24KKwkgKi8KKwlpZiggYVN0YXRlbWFjaGluZS0+Z2V0U3BlY2lmaWVyKCkuaXNTdGF0ZUZpbmFsKCkgKQorCXsKKwkJYW5FeGVjdXRhYmxlRm9ybS0+c2V0T25FbmFibGUoCisJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6OnhuZXdDb2RlRmxhdCgKKwkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU0VRVUVOQ0UsCisJCQkJCQlhbkV4ZWN1dGFibGVGb3JtLT5nZXRPbkVuYWJsZSgpLAorCQkJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfRklOQUwpKSApOworCisJCWlmKCBhU3RhdGVtYWNoaW5lLT5oYXNPdXRnb2luZ1RyYW5zaXRpb24oKSApCisJCXsKKwkJCWluY3JFcnJvckNvdW50KCk7CisJCQlhU3RhdGVtYWNoaW5lLT5lcnJvckxvY2F0aW9uKEFWTV9PU19XQVJOKQorCQkJCQk8PCAiVW5leHBlY3RlZCBzdGF0ZTwgZmluYWwgPiA8PCAiCisJCQkJCTw8IHN0cl9oZWFkZXIoIGFTdGF0ZW1hY2hpbmUgKQorCQkJCQk8PCAiID4+IHdpdGggb3V0Z29pbmcgdHJhbnNpdGlvbnMiCisJCQkJCTw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisJCX0KKwl9CisKKworCWVsc2UgaWYoIGFTdGF0ZW1hY2hpbmUtPmhhc091dGdvaW5nVHJhbnNpdGlvbigpICkKKwl7CisJCS8vIENvbXBpbGUgU3RhdGVtYWNoaW5lIFRyYW5zaXRpb24KKwkJbVRyYW5zaXRpb25Db21waWxlci5jb21waWxlU3RhdGVtYWNoaW5lVHJhbnNpdGlvbigKKwkJCQlhbkV4ZWN1dGFibGVGb3JtICwgYW5FeGVjdXRhYmxlRm9ybS0+Z2V0T25SdW4oKSApOworCX0KKworCWlmKCBhU3RhdGVtYWNoaW5lLT5nZXRTcGVjaWZpZXIoKS5pc1N0YXRlU3luYygpICkKKwl7CisJCVZhcmlhYmxlICogYVZhciA9IG5ldyBWYXJpYWJsZSgKKwkJCQljb25zdF9jYXN0PCBNYWNoaW5lICogPiggYVN0YXRlbWFjaGluZSApLAorCQkJCU1vZGlmaWVyOjpQUk9QRVJUWV9QVUJMSUNfVk9MQVRJTEVfTU9ESUZJRVIsCisJCQkJVHlwZU1hbmFnZXI6OklOVEVHRVIsCisJCQkJYVN0YXRlbWFjaGluZS0+Z2V0TmFtZUlEKCkgKyAiI3N5bmNWYXIiICk7CisKKwkJY29uc3RfY2FzdDwgTWFjaGluZSAqID4oIGFTdGF0ZW1hY2hpbmUgKS0+CisJCQkJZ2V0UHJvcGVydHlQYXJ0KCkuc2F2ZU93bmVkVmFyaWFibGUoIGFWYXIgKTsKKworCQlJbnN0YW5jZU9mRGF0YSAqIHN5bmNJbnN0YW5jZSA9IG5ldyBJbnN0YW5jZU9mRGF0YSgKKwkJCQlJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfU1RBTkRBUkRfTkFUVVJFLAorCQkJCWFuRXhlY3V0YWJsZUZvcm0sIGFWYXIsIFR5cGVNYW5hZ2VyOjpJTlRFR0VSLAorCQkJCWFuRXhlY3V0YWJsZUZvcm0tPmdldERhdGFTaXplKCksCisJCQkJTW9kaWZpZXI6OlBST1BFUlRZX1BVQkxJQ19WT0xBVElMRV9NT0RJRklFUik7CisvLyEhW01JR1JBVElPTl06TU9ESUZJRVIKKy8vCQkJCU1vZGlmaWVyOjpQUk9QRVJUWV9WT0xBVElMRV9GRUFUVVJFKTsKKwkJc3luY0luc3RhbmNlLT5zZXRWYWx1ZSggRXhwcmVzc2lvbkNvbnN0YW50OjpJTlRFR0VSX1pFUk8gKTsKKworCQljb25zdCBCRiAmIHN5bmNWYXIgPSBhbkV4ZWN1dGFibGVGb3JtLT5zYXZlRGF0YShzeW5jSW5zdGFuY2UpOworCisKKwkJQkZDb2RlIGluY3JTeW5jVmFyID0gU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BU1NJR04sIHN5bmNWYXIsCisJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1BMVVMsIHN5bmNWYXIsCisJCQkJCQlFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfT05FKSApOworCisJCWFuRXhlY3V0YWJsZUZvcm0tPnNldE9uRW5hYmxlKAorCQkJCVN0YXRlbWVudENvbnN0cnVjdG9yOjp4bmV3Q29kZUZsYXQoCisJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FUT01JQ19TRVFVRU5DRSwKKwkJCQkJCWFuRXhlY3V0YWJsZUZvcm0tPmdldE9uRW5hYmxlKCksIGluY3JTeW5jVmFyKSApOworCisKKwkJQkZDb2RlIGRlY3JTeW5jVmFyID0gU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BU1NJR04sIHN5bmNWYXIsCisJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1BMVVMsIHN5bmNWYXIsCisJCQkJCQlFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfTUlOVVNfT05FKSApOworCisJCWFuRXhlY3V0YWJsZUZvcm0tPnNldE9uRGlzYWJsZSgKKwkJCQlTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6eG5ld0NvZGVGbGF0KAorCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BVE9NSUNfU0VRVUVOQ0UsCisJCQkJCQlhbkV4ZWN1dGFibGVGb3JtLT5nZXRPbkRpc2FibGUoKSwgZGVjclN5bmNWYXIpICk7CisKKworCQlCRkNvZGUgZ3VhcmRTeW5jVmFyID0gU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9HVUFSRCwKKwkJCQlTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfR1QsIHN5bmNWYXIsCisJCQkJCQlFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfWkVSTykgKTsKKworCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPblJ1bigKKwkJCQlTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6eG5ld0NvZGVGbGF0KAorCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TRVFVRU5DRSwKKwkJCQkJCWd1YXJkU3luY1ZhciwgYW5FeGVjdXRhYmxlRm9ybS0+Z2V0T25SdW4oKSkgKTsKKwl9CisKKworCWlmKCBhbkV4ZWN1dGFibGVGb3JtLT5oYXNPbklSdW4oKQorCQkmJiAobm90IGFuRXhlY3V0YWJsZUZvcm0tPmhhc09uUnVuKCkpICkKKwl7CisJCWFuRXhlY3V0YWJsZUZvcm0tPnNldE9uUnVuKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bm9wQ29kZSgpICk7CisJfQorCisJaWYoIChub3QgYW5FeGVjdXRhYmxlRm9ybS0+aGFzT25SdW4oKSkKKwkJJiYgKG5vdCBhU3RhdGVtYWNoaW5lLT5nZXRTcGVjaWZpZXIoKS5pc1N0YXRlRmluYWwoKSkgKQorCXsKKwkJaW5jcldhcm5pbmdDb3VudCgpOworCQlhU3RhdGVtYWNoaW5lLT53YXJuaW5nTG9jYXRpb24oQVZNX09TX1dBUk4pCisJCQkJPDwgIk5vIGV2YWwgY29kZSBmb3IgPDwgIiA8PCBzdHJfaGVhZGVyKCBhU3RhdGVtYWNoaW5lICkKKwkJCQk8PCAiID4+IHdoaWNoIGlzIG5vdCBGSU5BTCEiCisJCQkJPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKwl9CisKKy8vYVN0YXRlbWFjaGluZS0+dG9TdHJlYW0oQVZNX09TX1RSQUNFIDw8IFRBQik7CisvL2FuRXhlY3V0YWJsZUZvcm0tPnRvU3RyZWFtKEFWTV9PU19UUkFDRSA8PCBUQUIpOworLy9BVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICI+fCBjb21waWxpbmc8c3RhdGVtYWNoaW5lPjogIgorLy8JCTw8IHN0cl9oZWFkZXIoIGFTdGF0ZW1hY2hpbmUgKSA8PCBzdGQ6OmVuZGw7Cit9CisKKworLyoqCisgKiBjb21waWxlCisgKiBzdGF0ZW1hY2hpbmUgaW5wdXRfZW5hYmxlZAorICovCisKK3ZvaWQgQ29tcGlsZXI6OnJlbW92ZVN1Ym1hY2hpbmVJbnB1dEVuYWJsZWRDb2RlKAorCQlFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZUZvcm0pCit7CisJaWYoIGFuRXhlY3V0YWJsZUZvcm0tPmhhc0luc3RhbmNlU3RhdGljKCkgKQorCXsKKwkJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgaXRNYWNoaW5lID0KKwkJCQlhbkV4ZWN1dGFibGVGb3JtLT5pbnN0YW5jZV9zdGF0aWNfYmVnaW4oKTsKKwkJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgZW5kTWFjaGluZSA9CisJCQkJYW5FeGVjdXRhYmxlRm9ybS0+aW5zdGFuY2Vfc3RhdGljX2VuZCgpOworCQlmb3IoIDsgaXRNYWNoaW5lICE9IGVuZE1hY2hpbmUgOyArK2l0TWFjaGluZSApCisJCXsKKwkJCWlmKCAoKml0TWFjaGluZSkubWFjaGluZSgpLgorCQkJCQlnZXRTcGVjaWZpZXIoKS5pc0Rlc2lnblByb3RvdHlwZVN0YXRpYygpCisJCQkJJiYgKCppdE1hY2hpbmUpLmdldEV4ZWN1dGFibGUoKS0+aGFzT25SdW4oKSApCisJCQl7CisJCQkJaWYoICgqaXRNYWNoaW5lKS5nZXRFeGVjdXRhYmxlKCktPgorCQkJCQkJZ2V0T25SdW4oKS0+aXNPcENvZGUoIEFWTV9PUENPREVfSU5QVVRfRU5BQkxFRCApICkKKwkJCQl7CisJCQkJCUJGQ29kZSBuZXdDb2RlID0gKCppdE1hY2hpbmUpLmdldEV4ZWN1dGFibGUoKS0+CisJCQkJCQkJZ2V0T25SdW4oKS0+Zmlyc3QoKS5iZkNvZGUoKTsKKwkJCQkJKCppdE1hY2hpbmUpLmdldEV4ZWN1dGFibGUoKS0+c2V0T25SdW4oIG5ld0NvZGUgKTsKKwkJCQl9CisKKwkJCQlyZW1vdmVTdWJtYWNoaW5lSW5wdXRFbmFibGVkQ29kZSgKKwkJCQkJCSgqaXRNYWNoaW5lKS5nZXRFeGVjdXRhYmxlKCkgKTsKKwkJCX0KKwkJfQorCX0KK30KKworCit2b2lkIENvbXBpbGVyOjpjb21wdXRlSW5wdXRFbmFibGVkQ29tKEV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlRm9ybSkKK3sKKwlBVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoCisJCQlhbkV4ZWN1dGFibGVGb3JtLT5nZXRTcGVjaWZpZXIoKS5oYXNGZWF0dXJlSW5wdXRFbmFibGVkKCkgKQorCQkJPDwgIlVuZXhwZWN0ZWQgYSBub24gSU5QVVRfRU5BQkxFRCBFeGVjdXRhYmxlICEhISIKKwkJCTw8IFNFTkRfRVhJVDsKKworCS8vIGlucHV0IGVuYWJsZWQgcnVubmluZyBjb2RlCisJQ29tbXVuaWNhdGlvbkRlcGVuZGVuY3k6OmNvbXB1dGVJbnB1dEVuYWJsZWRDb20oCisJCQlhbkV4ZWN1dGFibGVGb3JtLCBhbkV4ZWN1dGFibGVGb3JtLT5nZXRPblJ1bigpICk7CisKKwlpZiggYW5FeGVjdXRhYmxlRm9ybS0+Z2V0U3BlY2lmaWVyKCkuaXNTdGF0ZSgpICkKKwl7CisJCWNvbXB1dGVJbnB1dEVuYWJsZWRCdWZmZXIoIGFuRXhlY3V0YWJsZUZvcm0gKTsKKworCQlpZiggYW5FeGVjdXRhYmxlRm9ybS0+Z2V0SW5wdXRFbmFibGVkQnVmZmVyKCkucG9wdWxhdGVkKCkgKQorCQl7CisJCQlpbmNyRXJyb3JDb3VudCgpOworCQkJYW5FeGVjdXRhYmxlRm9ybS0+Z2V0QXN0TWFjaGluZSgpLT5lcnJvckxvY2F0aW9uKEFWTV9PU19XQVJOKQorCQkJCQk8PCAiSW5wdXRFbmFibGVkOj4gTk8gU1VQUE9SVCBmb3IgbXVsdGlwbGUgYnVmZmVyICIKKwkJCQkJCQkiYXQgcnVudGltZSBmb3IgPDwgIgorCQkJCQk8PCBzdHJfaGVhZGVyKCBhbkV4ZWN1dGFibGVGb3JtLT5nZXRBc3RNYWNoaW5lKCkgKQorCQkJCQk8PCAiID4+ICEiIDw8IHN0ZDo6ZW5kbDsKKworCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQgPDwgIkV4cGVjdCB0aGUgRnV0dXJlICEhISIgPDwgU0VORF9FWElUOworCQl9CisJCWVsc2UgaWYoIGFuRXhlY3V0YWJsZUZvcm0tPmdldElucHV0RW5hYmxlZEJ1ZmZlcigpLmVtcHR5KCkgKQorCQl7CisJCQlpbmNyRXJyb3JDb3VudCgpOworCQkJYW5FeGVjdXRhYmxlRm9ybS0+Z2V0QXN0TWFjaGluZSgpLT5lcnJvckxvY2F0aW9uKEFWTV9PU19XQVJOKQorCQkJCQk8PCAiSW5wdXRFbmFibGVkOj4gVW5mb3VuZCBydW50aW1lIGJ1ZmZlciBmb3IgPDwgIgorCQkJCQk8PCBzdHJfaGVhZGVyKCBhbkV4ZWN1dGFibGVGb3JtLT5nZXRBc3RNYWNoaW5lKCkgKQorCQkJCQk8PCAiID4+ICEiIDw8IHN0ZDo6ZW5kbDsKKwkJfQorCisJCWlmKCBhbkV4ZWN1dGFibGVGb3JtLT5oYXNDb250YWluZXIoKSAmJgorCQkJYW5FeGVjdXRhYmxlRm9ybS0+Z2V0RXhlY3V0YWJsZUNvbnRhaW5lcigpLT5oYXNUcmFuc2l0aW9uKCkgKQorCQl7CisJCQkvLyEhIE5PVEhJTkcKKwkJfQorCQllbHNlCisJCXsKKwkJCWFuRXhlY3V0YWJsZUZvcm0tPnNldE9uUnVuKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9JTlBVVF9FTkFCTEVELAorCQkJCQlhbkV4ZWN1dGFibGVGb3JtLT5nZXRPblJ1bigpICkpOworCisJCQlyZW1vdmVTdWJtYWNoaW5lSW5wdXRFbmFibGVkQ29kZSggYW5FeGVjdXRhYmxlRm9ybSApOworCQl9CisJfQorfQorCisKK3ZvaWQgQ29tcGlsZXI6OmNvbXB1dGVJbnB1dEVuYWJsZWRCdWZmZXIoRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGVGb3JtKQoreworCWZvciggRXhlY3V0YWJsZUZvcm0gKiB0bXBFeGVjID0gYW5FeGVjdXRhYmxlRm9ybSA7IHRtcEV4ZWMgIT0gTlVMTCA7CisJCQl0bXBFeGVjID0gdG1wRXhlYy0+Z2V0RXhlY3V0YWJsZUNvbnRhaW5lcigpICkKKwl7CisJCWlmKCB0bXBFeGVjLT5oYXNCdWZmZXIoKSApCisJCXsKKwkJCWNvbnN0IFRhYmxlT2ZTeW1ib2wgJiBidWZmZXJUYWJsZSA9IHRtcEV4ZWMtPmdldEJ1ZmZlcigpOworCQkJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDAgOyBvZmZzZXQgPCBidWZmZXJUYWJsZS5zaXplKCkgOyArK29mZnNldCApCisJCQl7CisJCQkJYW5FeGVjdXRhYmxlRm9ybS0+YWRkSW5wdXRFbmFibGVkQnVmZmVyKAorCQkJCQkJYnVmZmVyVGFibGVbIG9mZnNldCBdLnJhd0J1ZmZlcigpKTsKKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCisJCWlmKCB0bXBFeGVjLT5oYXNSb3V0ZXI0VGhpcygpICkKKwkJeworCQkJcmV0dXJuOworCQl9CisKKwkJaWYoIHRtcEV4ZWMtPmhhc1JvdXRlcjRJbnN0YW5jZSgpICkKKwkJeworCQkJcmV0dXJuOworCQl9CisKKwkJaWYoIHRtcEV4ZWMtPmhhc1JvdXRlcjRNb2RlbCgpICkKKwkJeworCQkJcmV0dXJuOworCQl9CisJfQorfQorCisKKy8qKgorICogY29tcGlsZSBzdGF0ZW1hY2hpbmUKKyAqIGluaXRpYWxpemF0aW9uCisgKiBlbmFibGluZworICogc2NoZWR1bGluZworICovCit2b2lkIENvbXBpbGVyOjpjb21waWxlQWxsQmVoYXZpb3JhbFJvdXRpbmVzKEV4ZWN1dGFibGVGb3JtICogdGhlRXhlY3V0YWJsZSkKK3sKKwljb25zdCBNYWNoaW5lICogYU1hY2hpbmUgPSB0aGVFeGVjdXRhYmxlLT5nZXRBc3RNYWNoaW5lKCk7CisKKwlpZiggYU1hY2hpbmUtPmhhc01hY2hpbmUoKSApCisJeworCQkvL2NvbXBpbGluZyBpbml0aWFsaXphdGlvbgorCQljb21waWxlQmVoYXZpb3JJbml0aWFsaXphdGlvbih0aGVFeGVjdXRhYmxlKTsKKworCQkvL2NvbXBpbGluZyBzY2hlZHVsZXIKKwkJY29tcGlsZUJlaGF2aW9yU2NoZWR1bGluZyh0aGVFeGVjdXRhYmxlKTsKKworCQkvL2VuYWJsaW5nCisJCWNvbXBpbGVCZWhhdmlvckVuYWJsaW5nKHRoZUV4ZWN1dGFibGUpOworCisJCS8vZGlzYWJsaW5nCisJCWNvbXBpbGVCZWhhdmlvckRpc2FibGluZyh0aGVFeGVjdXRhYmxlKTsKKworCQkvL2Fib3J0aW5nCisJCWNvbXBpbGVCZWhhdmlvckFib3J0aW5nKHRoZUV4ZWN1dGFibGUpOworCX0KK30KKworCisKK3ZvaWQgQ29tcGlsZXI6OmNvbXBpbGVCZWhhdmlvckluaXRpYWxpemF0aW9uKEV4ZWN1dGFibGVGb3JtICogdGhlRXhlY3V0YWJsZSkKK3sKKwlCRkNvZGVMaXN0IGxpc3RPZkNvZGU7CisKKwlMaXN0T2ZJbnN0YW5jZU9mTWFjaGluZSB1c2VkSW5zdGFuY2U7CisJaWYoIHRoZUV4ZWN1dGFibGUtPmhhc09uSW5pdCgpICkKKwl7CisJCVN0YXRlbWVudEZhY3Rvcnk6OmNvbGxlY3RBY3Rpdml0eU1hY2hpbmUoCisJCQkJdGhlRXhlY3V0YWJsZSwgQVZNX09QQ09ERV9JTklULCBBVk1fT1BDT0RFX1NUQVJULAorCQkJCXRoZUV4ZWN1dGFibGUtPmdldE9uSW5pdCgpLCB1c2VkSW5zdGFuY2UpOworCX0KKworCVRhYmxlT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGl0TWFjaGluZSA9CisJCQl0aGVFeGVjdXRhYmxlLT5pbnN0YW5jZV9zdGF0aWNfYmVnaW4oKTsKKwlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBlbmRNYWNoaW5lID0KKwkJCXRoZUV4ZWN1dGFibGUtPmluc3RhbmNlX3N0YXRpY19lbmQoKTsKKwlmb3IoIDsgaXRNYWNoaW5lICE9IGVuZE1hY2hpbmUgOyArK2l0TWFjaGluZSApCisJeworCQlpZiggKCppdE1hY2hpbmUpLmdldEV4ZWN1dGFibGUoKS0+aXNTY2hlZHVsYWJsZSgpCisJCQkmJiAoKml0TWFjaGluZSkubWFjaGluZSgpLmlzQXV0b1N0YXJ0KCkKKwkJCSYmIChub3QgdXNlZEluc3RhbmNlLmNvbnRhaW5zKCAoKml0TWFjaGluZSkucmF3TWFjaGluZSgpICkpICkKKwkJeworCQkJbGlzdE9mQ29kZS5hcHBlbmQoIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0lOSVQsICgqaXRNYWNoaW5lKSkgKTsKKwkJfQorCX0KKworCS8qKgorCSAqIE9wdGltaXNpemF0aW9uCisJICovCisJQkZDb2RlIG9uSW5pdENvZGU7CisJaWYoIGxpc3RPZkNvZGUucG9wdWxhdGVkKCkgKQorCXsKKwkJb25Jbml0Q29kZSA9IFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU1RST05HX1NZTkNIUk9OT1VTLCBsaXN0T2ZDb2RlKTsKKwl9CisJZWxzZSBpZiggbGlzdE9mQ29kZS5ub25lbXB0eSgpICkKKwl7CisJCW9uSW5pdENvZGUgPSBsaXN0T2ZDb2RlLmZpcnN0KCk7CisJfQorCWVsc2UgaWYoIG5vdCB0aGVFeGVjdXRhYmxlLT5oYXNPbkluaXQoKSApCisJeworLy8JCWluY3JXYXJuaW5nQ291bnQoKTsKKwkJdGhlRXhlY3V0YWJsZS0+Z2V0QXN0RWxlbWVudCgpLT53YXJuaW5nTG9jYXRpb24oQVZNX09TX0xPRykKKwkJCQkJPDwgIlVuZm91bmQgSW5zdGFuY2VTdGF0aWMgZm9yIG9uSW5pdCBjb2RlIGNvbXBpbGF0aW9uICIKKwkJCQkJCQkib2YgY29tcG9zaXRlIG1hY2hpbmUgPDwgIgorCQkJCQk8PCB0aGVFeGVjdXRhYmxlLT5nZXRBc3RFbGVtZW50KCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKwkJCQkJPDwgIiA+PiIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKwl9CisKKwlpZiggb25Jbml0Q29kZS52YWxpZCgpICkKKwl7CisJCXRoZUV4ZWN1dGFibGUtPnNldE9uSW5pdCgKKwkJCQlTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6eG5ld0NvZGVGbGF0KAorCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TRVFVRU5DRSwKKwkJCQkJCXRoZUV4ZWN1dGFibGUtPmdldE9uSW5pdCgpLCBvbkluaXRDb2RlKSApOworCX0KKworCS8vIG9uU1RBUlQKKwl0aGVFeGVjdXRhYmxlLT5zZXRPblN0YXJ0KAorCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6OnhuZXdDb2RlRmxhdCgKKwkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TRVFVRU5DRSwKKwkJCQkJdGhlRXhlY3V0YWJsZS0+Z2V0T25TdGFydCgpLAorCQkJCQl0aGVFeGVjdXRhYmxlLT5nZXRPbkluaXQoKSkgKTsKK30KKworCit2b2lkIENvbXBpbGVyOjpjb21waWxlQmVoYXZpb3JFbmFibGluZyhFeGVjdXRhYmxlRm9ybSAqIHRoZUV4ZWN1dGFibGUpCit7CisJQkZDb2RlTGlzdCBsaXN0T2ZDb2RlOworCisJTGlzdE9mSW5zdGFuY2VPZk1hY2hpbmUgdXNlZEluc3RhbmNlOworCWlmKCB0aGVFeGVjdXRhYmxlLT5oYXNPbkVuYWJsZSgpICkKKwl7CisJCVN0YXRlbWVudEZhY3Rvcnk6OmNvbGxlY3RBY3Rpdml0eU1hY2hpbmUoCisJCQkJdGhlRXhlY3V0YWJsZSwgQVZNX09QQ09ERV9FTkFCTEVfSU5WT0tFLAorCQkJCXRoZUV4ZWN1dGFibGUtPmdldE9uRW5hYmxlKCksIHVzZWRJbnN0YW5jZSk7CisJfQorCisJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgaXRNYWNoaW5lID0KKwkJCXRoZUV4ZWN1dGFibGUtPmluc3RhbmNlX3N0YXRpY19iZWdpbigpOworCVRhYmxlT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGVuZE1hY2hpbmUgPQorCQkJdGhlRXhlY3V0YWJsZS0+aW5zdGFuY2Vfc3RhdGljX2VuZCgpOworCWZvciggOyBpdE1hY2hpbmUgIT0gZW5kTWFjaGluZSA7ICsraXRNYWNoaW5lICkKKwl7CisJCWlmKCAoICgqaXRNYWNoaW5lKS5nZXRFeGVjdXRhYmxlKCktPmhhc09uSW5pdCgpCisJCQkJfHwgKCppdE1hY2hpbmUpLmdldEV4ZWN1dGFibGUoKS0+aGFzT25SdW4oKQorCQkJCXx8ICgqaXRNYWNoaW5lKS5nZXRFeGVjdXRhYmxlKCktPmhhc09uRW5hYmxlKCkgKQorCQkJJiYgKCppdE1hY2hpbmUpLm1hY2hpbmUoKS5pc0F1dG9TdGFydCgpCisJCQkmJiAobm90IHVzZWRJbnN0YW5jZS5jb250YWlucyggKCppdE1hY2hpbmUpLnJhd01hY2hpbmUoKSApKSApCisJCXsKKwkJCWxpc3RPZkNvZGUuYXBwZW5kKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9FTkFCTEVfSU5WT0tFLCAoKml0TWFjaGluZSkpICk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBPcHRpbWlzaXphdGlvbgorCSAqLworCUJGQ29kZSBvbkVuYWJsZUNvZGU7CisJaWYoIGxpc3RPZkNvZGUucG9wdWxhdGVkKCkgKQorCXsKKwkJb25FbmFibGVDb2RlID0gU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TVFJPTkdfU1lOQ0hST05PVVMsIGxpc3RPZkNvZGUpOworCX0KKwllbHNlIGlmKCBsaXN0T2ZDb2RlLm5vbmVtcHR5KCkgKQorCXsKKwkJb25FbmFibGVDb2RlID0gbGlzdE9mQ29kZS5maXJzdCgpOworCX0KKwllbHNlIGlmKCBub3QgdGhlRXhlY3V0YWJsZS0+aGFzT25Jbml0KCkgKQorCXsKKy8vCQlpbmNyV2FybmluZ0NvdW50KCk7CisJCXRoZUV4ZWN1dGFibGUtPmdldEFzdEVsZW1lbnQoKS0+d2FybmluZ0xvY2F0aW9uKEFWTV9PU19MT0cpCisJCQkJCTw8ICJVbmZvdW5kIEluc3RhbmNlU3RhdGljIGZvciBvbkVuYWJsZSBjb2RlIGNvbXBpbGF0aW9uICIKKwkJCQkJCQkib2YgY29tcG9zaXRlIG1hY2hpbmUgPDwgIgorCQkJCQk8PCB0aGVFeGVjdXRhYmxlLT5nZXRBc3RFbGVtZW50KCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKwkJCQkJPDwgIiA+PiIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKwl9CisKKwlpZiggb25FbmFibGVDb2RlLnZhbGlkKCkgKQorCXsKKwkJdGhlRXhlY3V0YWJsZS0+c2V0T25FbmFibGUoCisJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6OnhuZXdDb2RlRmxhdCgKKwkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU0VRVUVOQ0UsCisJCQkJCQl0aGVFeGVjdXRhYmxlLT5nZXRPbkVuYWJsZSgpLCBvbkVuYWJsZUNvZGUpICk7CisJfQorfQorCisKK3ZvaWQgQ29tcGlsZXI6OmNvbXBpbGVCZWhhdmlvckRpc2FibGluZyhFeGVjdXRhYmxlRm9ybSAqIHRoZUV4ZWN1dGFibGUpCit7CisJQkZDb2RlTGlzdCBsaXN0T2ZDb2RlOworCisJTGlzdE9mSW5zdGFuY2VPZk1hY2hpbmUgdXNlZEluc3RhbmNlOworCWlmKCB0aGVFeGVjdXRhYmxlLT5oYXNPbkRpc2FibGUoKSApCisJeworCQlTdGF0ZW1lbnRGYWN0b3J5Ojpjb2xsZWN0QWN0aXZpdHlNYWNoaW5lKAorCQkJCXRoZUV4ZWN1dGFibGUsIEFWTV9PUENPREVfRElTQUJMRV9JTlZPS0UsCisJCQkJdGhlRXhlY3V0YWJsZS0+Z2V0T25EaXNhYmxlKCksIHVzZWRJbnN0YW5jZSk7CisJfQorCisJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgaXRNYWNoaW5lID0KKwkJCXRoZUV4ZWN1dGFibGUtPmluc3RhbmNlX3N0YXRpY19iZWdpbigpOworCVRhYmxlT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGVuZE1hY2hpbmUgPQorCQkJdGhlRXhlY3V0YWJsZS0+aW5zdGFuY2Vfc3RhdGljX2VuZCgpOworCWZvciggOyBpdE1hY2hpbmUgIT0gZW5kTWFjaGluZSA7ICsraXRNYWNoaW5lICkKKwl7CisJCWlmKCAoKml0TWFjaGluZSkubWFjaGluZSgpLmlzQXV0b1N0YXJ0KCkKKwkJCSYmIChub3QgdXNlZEluc3RhbmNlLmNvbnRhaW5zKCAoKml0TWFjaGluZSkucmF3TWFjaGluZSgpICkpICkKKwkJeworCQkJbGlzdE9mQ29kZS5hcHBlbmQoIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0RJU0FCTEVfSU5WT0tFLCAoKml0TWFjaGluZSkpICk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBPcHRpbWlzaXphdGlvbgorCSAqLworCUJGQ29kZSBvbkRpc2FibGVDb2RlOworCWlmKCBsaXN0T2ZDb2RlLnBvcHVsYXRlZCgpICkKKwl7CisJCW9uRGlzYWJsZUNvZGUgPSBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NUUk9OR19TWU5DSFJPTk9VUywgbGlzdE9mQ29kZSk7CisJfQorCWVsc2UgaWYoIGxpc3RPZkNvZGUubm9uZW1wdHkoKSApCisJeworCQlvbkRpc2FibGVDb2RlID0gbGlzdE9mQ29kZS5maXJzdCgpOworCX0KKworCWlmKCBvbkRpc2FibGVDb2RlLnZhbGlkKCkgKQorCXsKKwkJdGhlRXhlY3V0YWJsZS0+c2V0T25EaXNhYmxlKAorCQkJCVN0YXRlbWVudENvbnN0cnVjdG9yOjp4bmV3Q29kZUZsYXQoCisJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NFUVVFTkNFLAorCQkJCQkJb25EaXNhYmxlQ29kZSwgdGhlRXhlY3V0YWJsZS0+Z2V0T25EaXNhYmxlKCkpICk7CisJfQorfQorCisKK3ZvaWQgQ29tcGlsZXI6OmNvbXBpbGVCZWhhdmlvckFib3J0aW5nKEV4ZWN1dGFibGVGb3JtICogdGhlRXhlY3V0YWJsZSkKK3sKKwlCRkNvZGVMaXN0IGxpc3RPZkNvZGU7CisKKwlMaXN0T2ZJbnN0YW5jZU9mTWFjaGluZSB1c2VkSW5zdGFuY2U7CisJaWYoIHRoZUV4ZWN1dGFibGUtPmhhc09uQWJvcnQoKSApCisJeworCQlTdGF0ZW1lbnRGYWN0b3J5Ojpjb2xsZWN0QWN0aXZpdHlNYWNoaW5lKAorCQkJCXRoZUV4ZWN1dGFibGUsIEFWTV9PUENPREVfQUJPUlRfSU5WT0tFLAorCQkJCXRoZUV4ZWN1dGFibGUtPmdldE9uQWJvcnQoKSwgdXNlZEluc3RhbmNlKTsKKwl9CisKKwlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBpdE1hY2hpbmUgPQorCQkJdGhlRXhlY3V0YWJsZS0+aW5zdGFuY2Vfc3RhdGljX2JlZ2luKCk7CisJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgZW5kTWFjaGluZSA9CisJCQl0aGVFeGVjdXRhYmxlLT5pbnN0YW5jZV9zdGF0aWNfZW5kKCk7CisJZm9yKCA7IGl0TWFjaGluZSAhPSBlbmRNYWNoaW5lIDsgKytpdE1hY2hpbmUgKQorCXsKKwkJaWYoICgqaXRNYWNoaW5lKS5tYWNoaW5lKCkuaXNBdXRvU3RhcnQoKQorCQkJJiYgKG5vdCB1c2VkSW5zdGFuY2UuY29udGFpbnMoICgqaXRNYWNoaW5lKS5yYXdNYWNoaW5lKCkgKSkgKQorCQl7CisJCQlsaXN0T2ZDb2RlLmFwcGVuZCggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQUJPUlRfSU5WT0tFLCAoKml0TWFjaGluZSkpICk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBPcHRpbWlzaXphdGlvbgorCSAqLworCUJGQ29kZSBvbkFib3J0Q29kZTsKKwlpZiggbGlzdE9mQ29kZS5wb3B1bGF0ZWQoKSApCisJeworCQlvbkFib3J0Q29kZSA9IFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU1RST05HX1NZTkNIUk9OT1VTLCBsaXN0T2ZDb2RlKTsKKwl9CisJZWxzZSBpZiggbGlzdE9mQ29kZS5ub25lbXB0eSgpICkKKwl7CisJCW9uQWJvcnRDb2RlID0gbGlzdE9mQ29kZS5maXJzdCgpOworCX0KKworCWlmKCBvbkFib3J0Q29kZS52YWxpZCgpICkKKwl7CisJCXRoZUV4ZWN1dGFibGUtPnNldE9uQWJvcnQoCisJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6OnhuZXdDb2RlRmxhdCgKKwkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU0VRVUVOQ0UsCisJCQkJCQlvbkFib3J0Q29kZSwgdGhlRXhlY3V0YWJsZS0+Z2V0T25BYm9ydCgpKSApOworCX0KK30KKworCit2b2lkIENvbXBpbGVyOjpjb21waWxlQmVoYXZpb3JTY2hlZHVsaW5nKEV4ZWN1dGFibGVGb3JtICogdGhlRXhlY3V0YWJsZSkKK3sKKwlMaXN0T2ZJbnN0YW5jZU9mTWFjaGluZSB1c2VkSW5zdGFuY2U7CisJT3BlcmF0b3IgKiBkZWZhdWx0Q29uY3VycmVuY3lPcCA9IE5VTEw7CisJQkZDb2RlIHVzZXJTY2hlZHVsZXI7CisKKwkvLyBJTklUIFNURVAKKwkvLyBDb2xsZWN0IHVuc2NoZWR1bGVkIHN1Ym1hY2hpbmVzCisJLy8gZ2V0IGRlZmF1bHQgY29uY3VycmVuY3kgcG9saWN5CisJaWYoIHRoZUV4ZWN1dGFibGUtPmhhc09uUnVuKCkgKQorCXsKKwkJU3RhdGVtZW50RmFjdG9yeTo6Y29sbGVjdFJ1bk1hY2hpbmUoCisJCQkJdGhlRXhlY3V0YWJsZSwgdGhlRXhlY3V0YWJsZS0+Z2V0T25SdW4oKSwgdXNlZEluc3RhbmNlKTsKKwl9CisKKwlpZiggdGhlRXhlY3V0YWJsZS0+aGFzT25TY2hlZHVsZSgpICkKKwl7CisJCXVzZXJTY2hlZHVsZXIgPSB0aGVFeGVjdXRhYmxlLT5nZXRPblNjaGVkdWxlKCk7CisKKwkJaWYoIHVzZXJTY2hlZHVsZXItPmVtcHR5KCkgKQorCQl7CisJCQlkZWZhdWx0Q29uY3VycmVuY3lPcCA9IHVzZXJTY2hlZHVsZXItPmdldE9wZXJhdG9yKCk7CisJCQl0aGVFeGVjdXRhYmxlLT5zZXRPblNjaGVkdWxlKCB1c2VyU2NoZWR1bGVyID0gQkZDb2RlOjpSRUZfTlVMTCApOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYoIE9wZXJhdG9yTWFuYWdlcjo6aXNTY2hlZHVsZSggdXNlclNjaGVkdWxlci0+Z2V0T3BlcmF0b3IoKSApICkKKwkJCXsKKwkJCQlkZWZhdWx0Q29uY3VycmVuY3lPcCA9IHVzZXJTY2hlZHVsZXItPmdldE9wZXJhdG9yKCk7CisJCQl9CisKKwkJCVN0YXRlbWVudEZhY3Rvcnk6OmNvbGxlY3RSdW5NYWNoaW5lKAorCQkJCQl0aGVFeGVjdXRhYmxlLCB1c2VyU2NoZWR1bGVyLCB1c2VkSW5zdGFuY2UpOworCQl9CisJfQorCisJaWYoIHRoZUV4ZWN1dGFibGUtPmhhc09uQ29uY3VycmVuY3koKSApCisJeworCQlkZWZhdWx0Q29uY3VycmVuY3lPcCA9IHRoZUV4ZWN1dGFibGUtPmdldE9uQ29uY3VycmVuY3lPcGVyYXRvcigpOworCX0KKwllbHNlCisJeworCQlpZiggZGVmYXVsdENvbmN1cnJlbmN5T3AgPT0gTlVMTCApCisJCXsKKwkJCWRlZmF1bHRDb25jdXJyZW5jeU9wID0gT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9JTlRFUkxFQVZJTkc7CisJCX0KKworCQl0aGVFeGVjdXRhYmxlLT5zZXRPbkNvbmN1cnJlbmN5KAorCQkJCVN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKGRlZmF1bHRDb25jdXJyZW5jeU9wKSApOworCX0KKworCS8vIFNURVAgY2FzZSBmb3Igc2luZ2xldG9uIHN1Ym1hY2hpbmUKKwlpZiggdXNlZEluc3RhbmNlLmVtcHR5KCkKKwkJJiYgdGhlRXhlY3V0YWJsZS0+aGFzT25lSW5zdGFuY2VTdGF0aWMoKQorCQkmJiB0aGVFeGVjdXRhYmxlLT5oYXNPbmVJbnN0YW5jZU1vZGVsKCkgKQorCXsKKwkJQkZDb2RlIHJ1bk1hY2hpbmVDb2RlKE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfUlVOLAorCQkJCXRoZUV4ZWN1dGFibGUtPmdldEluc3RhbmNlU3RhdGljKCkubGFzdCgpKTsKKworCQlpZiggdXNlclNjaGVkdWxlci52YWxpZCgpICkKKwkJeworCQkJaWYoIHVzZXJTY2hlZHVsZXItPmlzT3BlcmF0b3IoIGRlZmF1bHRDb25jdXJyZW5jeU9wICkgKQorCQkJeworCQkJCXVzZXJTY2hlZHVsZXItPmFwcGVuZCggcnVuTWFjaGluZUNvZGUgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQl1c2VyU2NoZWR1bGVyID0gU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQlkZWZhdWx0Q29uY3VycmVuY3lPcCwgdXNlclNjaGVkdWxlciwgcnVuTWFjaGluZUNvZGUgKTsKKwkJCX0KKworCQkJdGhlRXhlY3V0YWJsZS0+c2V0T25TY2hlZHVsZSggdXNlclNjaGVkdWxlciApOworCQl9CisJCWVsc2UKKwkJeworCQkJdGhlRXhlY3V0YWJsZS0+c2V0T25TY2hlZHVsZSggcnVuTWFjaGluZUNvZGUgKTsKKwkJfQorCX0KKworCS8vIFNURVAgY2FzZSBmb3IgbWFueSBzdWJtYWNoaW5lcworCWVsc2UgaWYoIHVzZWRJbnN0YW5jZS5zaXplKCkgPCAodGhlRXhlY3V0YWJsZS0+c2l6ZUluc3RhbmNlU3RhdGljKCkKKwkJCSsgdGhlRXhlY3V0YWJsZS0+c2l6ZUluc3RhbmNlTW9kZWwoKSkgKQorCXsKKwkJQkZDb2RlIGFTY2hlZHVsZUNvZGU7CisKKwkJaWYoIHVzZXJTY2hlZHVsZXIudmFsaWQoKSApCisJCXsKKwkJCWFTY2hlZHVsZUNvZGUgPSBjb21waWxlU2NoZWR1bGVyUm91dGluZSgKKwkJCQkJdGhlRXhlY3V0YWJsZSwgdXNlZEluc3RhbmNlLCB1c2VyU2NoZWR1bGVyKTsKKworCQkJaWYoIGFTY2hlZHVsZUNvZGUtPmlzbm90T3BlcmF0b3IoIGRlZmF1bHRDb25jdXJyZW5jeU9wICkgKQorCQkJeworCQkJCWFTY2hlZHVsZUNvZGUgPSBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQkJCWRlZmF1bHRDb25jdXJyZW5jeU9wLCBhU2NoZWR1bGVDb2RlICk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQl1c2VyU2NoZWR1bGVyID0gYVNjaGVkdWxlQ29kZSA9CisJCQkJCVN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKCBkZWZhdWx0Q29uY3VycmVuY3lPcCApOworCQl9CisKKwkJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgaXRJbnN0YW5jZSA9CisJCQkJdGhlRXhlY3V0YWJsZS0+aW5zdGFuY2Vfc3RhdGljX2JlZ2luKCk7CisJCVRhYmxlT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGVuZEluc3RhbmNlID0KKwkJCQl0aGVFeGVjdXRhYmxlLT5pbnN0YW5jZV9zdGF0aWNfZW5kKCk7CisJCWZvciggOyBpdEluc3RhbmNlICE9IGVuZEluc3RhbmNlIDsgKytpdEluc3RhbmNlICkKKwkJeworCQkJaWYoICgqaXRJbnN0YW5jZSkuZ2V0RXhlY3V0YWJsZSgpLT5pc1NjaGVkdWxhYmxlKCkKKwkJCQkmJiAobm90IHVzZWRJbnN0YW5jZS5jb250YWlucygoKml0SW5zdGFuY2UpLnJhd01hY2hpbmUoKSkpICkKKwkJCXsKKwkJCQlhU2NoZWR1bGVDb2RlLT5hcHBlbmQoIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9SVU4sICgqaXRJbnN0YW5jZSkpICk7CisJCQl9CisJCX0KKworCQlpdEluc3RhbmNlID0gdGhlRXhlY3V0YWJsZS0+aW5zdGFuY2VfbW9kZWxfYmVnaW4oKTsKKwkJZW5kSW5zdGFuY2UgPSB0aGVFeGVjdXRhYmxlLT5pbnN0YW5jZV9tb2RlbF9lbmQoKTsKKwkJZm9yKCA7IGl0SW5zdGFuY2UgIT0gZW5kSW5zdGFuY2UgOyArK2l0SW5zdGFuY2UgKQorCQl7CisJCQlpZiggKCppdEluc3RhbmNlKS5tYWNoaW5lKCkuaGFzUG9zc2libGVEeW5hbWljSW5zdGFuY2lhdGlvbigpCisJCQkJJiYgKCppdEluc3RhbmNlKS5nZXRFeGVjdXRhYmxlKCktPmlzU2NoZWR1bGFibGUoKQorCQkJCSYmIChub3QgdXNlZEluc3RhbmNlLmNvbnRhaW5zKCgqaXRJbnN0YW5jZSkucmF3TWFjaGluZSgpKSkgKQorCQkJeworCQkJCWFTY2hlZHVsZUNvZGUtPmFwcGVuZCggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1JVTiwgKCppdEluc3RhbmNlKSkgKTsKKwkJCX0KKwkJfQorCisJCWlmKCBhU2NoZWR1bGVDb2RlLT5zaW5nbGV0b24oKSApCisJCXsKKwkJCWFTY2hlZHVsZUNvZGUtPnBvcF9sYXN0X3RvKCB1c2VyU2NoZWR1bGVyICk7CisKKwkJCWlmKCB1c2VyU2NoZWR1bGVyLnZhbGlkKCkgKQorCQkJeworCQkJCXRoZUV4ZWN1dGFibGUtPnNldE9uU2NoZWR1bGUoIHVzZXJTY2hlZHVsZXIgKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCXRoZUV4ZWN1dGFibGUtPnNldE9uU2NoZWR1bGUoIGFTY2hlZHVsZUNvZGUgKTsKKwkJfQorCX0KKwllbHNlIGlmKCB1c2VyU2NoZWR1bGVyLnZhbGlkKCkgKQorCXsKKwkJdGhlRXhlY3V0YWJsZS0+c2V0T25TY2hlZHVsZSggY29tcGlsZVNjaGVkdWxlclJvdXRpbmUoCisJCQkJdGhlRXhlY3V0YWJsZSwgdXNlZEluc3RhbmNlLCB1c2VyU2NoZWR1bGVyKSApOworCX0KK30KKworCit2b2lkIENvbXBpbGVyOjpzZXRSZHZTY2hlZHVsaW5nKEV4ZWN1dGFibGVGb3JtICogdGhlRXhlY3V0YWJsZSkKK3sKKwlBVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoIHRoZUV4ZWN1dGFibGUtPmhhc1JkdkNvbW11bmljYXRpb24oKSApCisJCQk8PCAiVW5leHBlY3RlZCBFeGVjdXRhYmxlIHdpdGhvdXQgUkRWIGNvbXVuaWNhdGlvbiAhISEiCisJCQk8PCBTRU5EX0VYSVQ7CisKKworCUJGQ29kZSAmIGFTY2hlZHVsZUNvZGUgPSB0aGVFeGVjdXRhYmxlLT5nZXRPblNjaGVkdWxlKCk7CisJc3dpdGNoKCBhU2NoZWR1bGVDb2RlLmdldEF2bU9wQ29kZSgpICkKKwl7CisJCWNhc2UgQVZNX09QQ09ERV9BU1lOQ0hST05PVVM6CisJCXsKKwkJCWFTY2hlZHVsZUNvZGUuc2V0T3BlcmF0b3IoCisJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfUkRWX0FTWU5DSFJPTk9VUyApOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfU1RST05HX1NZTkNIUk9OT1VTOgorCQl7CisJCQlhU2NoZWR1bGVDb2RlLnNldE9wZXJhdG9yKAorCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1JEVl9TVFJPTkdfU1lOQ0hST05PVVMgKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBBVk1fT1BDT0RFX1dFQUtfU1lOQ0hST05PVVM6CisJCXsKKwkJCWFTY2hlZHVsZUNvZGUuc2V0T3BlcmF0b3IoCisJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfUkRWX1dFQUtfU1lOQ0hST05PVVMgKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBBVk1fT1BDT0RFX0lOVEVSTEVBVklORzoKKwkJeworCQkJYVNjaGVkdWxlQ29kZS5zZXRPcGVyYXRvcigKKwkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9SRFZfSU5URVJMRUFWSU5HICk7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9QQVJBTExFTDoKKwkJeworCQkJYVNjaGVkdWxlQ29kZS5zZXRPcGVyYXRvcigKKwkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9SRFZfUEFSQUxMRUwgKTsKKwkJCWJyZWFrOworCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJdGhlRXhlY3V0YWJsZS0+c2V0T25TY2hlZHVsZShTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TWU5DSFJPTklaRSwgYVNjaGVkdWxlQ29kZSkpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9jb21waWxlci9Db21waWxlci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9jb21waWxlci9Db21waWxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMDFkMTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL2NvbXBpbGVyL0NvbXBpbGVyLmgKQEAgLTAsMCArMSwyMDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgQlVJTERFUl9DT01QSUxFUl9DT01QSUxFUl9IXworI2RlZmluZSBCVUlMREVSX0NPTVBJTEVSX0NPTVBJTEVSX0hfCisKKyNpbmNsdWRlIDxidWlsZGVyL2NvbXBpbGVyL0Jhc2VNYWNoaW5lQ29tcGlsZXIuaD4KKworI2luY2x1ZGUgPGJ1aWxkZXIvY29tcGlsZXIvQ29tcGlsZXJPZkludGVyYWN0aW9uLmg+CisjaW5jbHVkZSA8YnVpbGRlci9jb21waWxlci9Db21waWxlck9mUHJvZ3JhbS5oPgorI2luY2x1ZGUgPGJ1aWxkZXIvY29tcGlsZXIvQ29tcGlsZXJPZlRyYW5zaXRpb24uaD4KKyNpbmNsdWRlIDxidWlsZGVyL2NvbXBpbGVyL0NvbXBpbGVyT2ZWYXJpYWJsZS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworY2xhc3MgQ29uZmlndXJhdGlvbjsKKworY2xhc3MgQXZtY29kZUNvbXBpbGVyOworCitjbGFzcyBBdm1Qcm9ncmFtOworY2xhc3MgRXhlY3V0YWJsZUZvcm07CitjbGFzcyBFeGVjdXRhYmxlU3lzdGVtOworY2xhc3MgSW5zdGFuY2VPZkJ1ZmZlcjsKK2NsYXNzIEluc3RhbmNlT2ZNYWNoaW5lOworY2xhc3MgTWFjaGluZTsKK2NsYXNzIFByb3BlcnR5UGFydDsKK2NsYXNzIFN5c3RlbTsKKworCitjbGFzcyBDb21waWxlciA6IHB1YmxpYyBCYXNlTWFjaGluZUNvbXBpbGVyCit7CisKK3B1YmxpYzoKKwkvKioKKwkgKiBBVFRSSUJVVEUKKwkgKi8KKwlDb21waWxlck9mVmFyaWFibGUgbURhdGFDb21waWxlcjsKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURQorCSAqLworCUNvbXBpbGVyT2ZQcm9ncmFtIG1Qcm9ncmFtQ29tcGlsZXI7CisKKwlDb21waWxlck9mVHJhbnNpdGlvbiBtVHJhbnNpdGlvbkNvbXBpbGVyOworCisJQ29tcGlsZXJPZkludGVyYWN0aW9uIG1Db21Db21waWxlcjsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQ29tcGlsZXIoQ29uZmlndXJhdGlvbiAmIGFDb25maWd1cmF0aW9uLCBBdm1jb2RlQ29tcGlsZXIgJiBhbkF2bWNvZGVDb21waWxlcik7CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+Q29tcGlsZXIoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBDT05GSUdVUkUKKwkgKi8KKwlib29sIGNvbmZpZ3VyZSgpOworCisKKwkvKioKKwkgKiBNRVRIT0RTCisJICogc3RhcnQKKwkgKi8KKwl2aXJ0dWFsIGJvb2wgc3RhcnQoU3lzdGVtICYgYVN5c3RlbSk7CisKKworCS8qCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFBSRS1DT01QSUxJTkcgU1lTVEVNIC0gKFNUQVRFKU1BQ0hJTkUgIFRSQU5TSVRJT04KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJdm9pZCBwcmVjb21waWxlUHJvcGVydHlQYXJ0KAorCQkJRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGUsIFByb3BlcnR5UGFydCAmIHRoZURlY2xhcmF0aW9uLAorCQkJVGFibGVPZkluc3RhbmNlT2ZEYXRhICYgdGFibGVPZlZhcmlhYmxlKTsKKworCXZvaWQgcHJlY29tcGlsZURhdGFUeXBlKAorCQkJQXZtUHJvZ3JhbSAqIGFQcm9ncmFtLCBQcm9wZXJ0eVBhcnQgJiB0aGVEZWNsYXJhdGlvbiwKKwkJCVRhYmxlT2ZJbnN0YW5jZU9mRGF0YSAmIHRhYmxlT2ZWYXJpYWJsZSk7CisKKworCXZvaWQgcHJlY29tcGlsZUV4ZWN1dGFibGVDb21wb3NpdGVQYXJ0KAorCQkJRXhlY3V0YWJsZUZvcm0gKiBhQ29udGFpbmVyLCBNYWNoaW5lICogYW5FeGVjdXRhYmxlU3BlYyk7CisKKwl2b2lkIHByZWNvbXBpbGVFeGVjdXRhYmxlKAorCQkJRXhlY3V0YWJsZUZvcm0gKiBhQ29udGFpbmVyLCBNYWNoaW5lICogYW5FeGVjdXRhYmxlU3BlYyk7CisKKwlFeGVjdXRhYmxlRm9ybSAqIHByZWNvbXBpbGVFeGVjdXRhYmxlTW9kZWwoCisJCQlFeGVjdXRhYmxlRm9ybSAqIGFDb250YWluZXIsIE1hY2hpbmUgKiBhbkV4ZWN1dGFibGVTcGVjKTsKKworCXZvaWQgcHJlY29tcGlsZUV4ZWN1dGFibGVQcm90b3R5cGUoCisJCQlFeGVjdXRhYmxlRm9ybSAqIGFDb250YWluZXIsIE1hY2hpbmUgKiBhbkV4ZWN1dGFibGVTcGVjKTsKKworCXZvaWQgcHJlY29tcGlsZUV4ZWN1dGFibGVJbnN0YW5jZVN0YXRpYygKKwkJCUV4ZWN1dGFibGVGb3JtICogYUNvbnRhaW5lciwgTWFjaGluZSAqIGFuRXhlY3V0YWJsZVNwZWMpOworCisJdm9pZCBwcmVjb21waWxlRXhlY3V0YWJsZUluc3RhbmNlRHluYW1pcXVlKAorCQkJRXhlY3V0YWJsZUZvcm0gKiBhQ29udGFpbmVyLCBNYWNoaW5lICogYW5FeGVjdXRhYmxlU3BlYyk7CisKKwl2b2lkIHByZWNvbXBpbGVFeGVjdXRhYmxlR3JvdXAoCisJCQlFeGVjdXRhYmxlRm9ybSAqIGFDb250YWluZXIsIE1hY2hpbmUgKiBhU3RhdGVtYWNoaW5lKTsKKworCisJdm9pZCBwcmVjb21waWxlU3lzdGVtKFN5c3RlbSAmIGFTeXN0ZW0pOworCisKKwkvKioKKwkgKiBzZXRJbmhlcml0ZWRTcGVjaWZpZXIgZnJvbSBjb250YWluZXIgdG8gb3duZWQgZWxlbWVudHMKKwkgKi8KKwl2b2lkIHNldEluaGVyaXRlZFNwZWNpZmllcigKKwkJCUV4ZWN1dGFibGVGb3JtICogYUNvbnRhaW5lciwgRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGUpOworCisJdm9pZCBzZXRJbmhlcml0ZWRTcGVjaWZpZXIoCisJCQlFeGVjdXRhYmxlRm9ybSAqIGFDb250YWluZXIsIEluc3RhbmNlT2ZNYWNoaW5lICogYU1hY2hpbmUpOworCisKKwkvKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBDT01QSUxJTkcgRVhFQ1VUQUJMRSAtIEFWTVBST0dSQU0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJdm9pZCBjb21waWxlRXhlY3V0YWJsZVN5c3RlbSgpOworCisJdm9pZCBjb21waWxlRXhlY3V0YWJsZShFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZSk7CisKKwl2b2lkIGNvbXBpbGVBdm1Qcm9ncmFtcygpOworCisKKwkvKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBDT01QSUxJTkcgU1lTVEVNIC0gKFNUQVRFKU1BQ0hJTkUgIFRSQU5TSVRJT04KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJdm9pZCBjb21waWxlQWxsSW5zdGFuY2VzKEV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlRm9ybSk7CisKKwl2b2lkIGNvbXBpbGVJbnN0YW5jZSgKKwkJCUV4ZWN1dGFibGVGb3JtICogdGhlRXhlY3V0YWJsZUNvbnRhaW5lciwKKwkJCUluc3RhbmNlT2ZNYWNoaW5lICogYW5JbnN0YW5jZU1hY2hpbmUpOworCisJdm9pZCBjb21waWxlSW5zdGFuY2VQYXJhbWV0ZXJzKAorCQkJRXhlY3V0YWJsZUZvcm0gKiB0aGVFeGVjdXRhYmxlQ29udGFpbmVyLAorCQkJSW5zdGFuY2VPZk1hY2hpbmUgKiBhbkluc3RhbmNlTWFjaGluZSk7CisKKwl2b2lkIGNvbXBpbGVCYXNlTWFjaGluZShFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZUZvcm0pOworCisJdm9pZCBjb21waWxlUHJvY2VkdXJlKEV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlRm9ybSk7CisKKwl2b2lkIGNvbXBpbGVNYWNoaW5lKEV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlRm9ybSk7CisKKwl2b2lkIGNvbXBpbGVTeXN0ZW0oRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGVGb3JtKTsKKwl2b2lkIGNvbXBpbGVTdGF0ZW1hY2hpbmUoRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGVGb3JtKTsKKworCXZvaWQgY29tcGlsZUV4ZWN1dGFibGVNb2NDb21wb3NpdGVTdHJ1Y3R1cmUoCisJCQlFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZUZvcm0pOworCisJdm9pZCBjb21waWxlRXhlY3V0YWJsZU1vY1N0YXRlVHJhbnNpdGlvblN0cnVjdHVyZSgKKwkJCUV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlRm9ybSk7CisKKwl2b2lkIGNvbXBpbGVTdGF0ZW1hY2hpbmVCYXNpYyhFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZUZvcm0pOworCXZvaWQgY29tcGlsZVN0YXRlbWFjaGluZVBzZXVkbyhFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZUZvcm0pOworCXZvaWQgY29tcGlsZVN0YXRlbWFjaGluZUhpc3RvcnkoRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGVGb3JtKTsKKwl2b2lkIGNvbXBpbGVQc2V1ZG9zdGF0ZUVuZGluZyhFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZUZvcm0pOworCisKKwl2b2lkIHJlbW92ZVN1Ym1hY2hpbmVJbnB1dEVuYWJsZWRDb2RlKEV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlRm9ybSk7CisKKwl2b2lkIGNvbXB1dGVJbnB1dEVuYWJsZWRDb20oRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGVGb3JtKTsKKworCXZvaWQgY29tcHV0ZUlucHV0RW5hYmxlZEJ1ZmZlcihFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZUZvcm0pOworCisJdm9pZCBjb21waWxlQWxsQmVoYXZpb3JhbFJvdXRpbmVzKEV4ZWN1dGFibGVGb3JtICogdGhlRXhlY3V0YWJsZSk7CisKKwl2b2lkIGNvbXBpbGVCZWhhdmlvckluaXRpYWxpemF0aW9uKEV4ZWN1dGFibGVGb3JtICogdGhlRXhlY3V0YWJsZSk7CisJdm9pZCBjb21waWxlQmVoYXZpb3JFbmFibGluZyhFeGVjdXRhYmxlRm9ybSAqIHRoZUV4ZWN1dGFibGUpOworCXZvaWQgY29tcGlsZUJlaGF2aW9yRGlzYWJsaW5nKEV4ZWN1dGFibGVGb3JtICogdGhlRXhlY3V0YWJsZSk7CisJdm9pZCBjb21waWxlQmVoYXZpb3JBYm9ydGluZyhFeGVjdXRhYmxlRm9ybSAqIHRoZUV4ZWN1dGFibGUpOworCisJdm9pZCBjb21waWxlQmVoYXZpb3JTY2hlZHVsaW5nKEV4ZWN1dGFibGVGb3JtICogdGhlRXhlY3V0YWJsZSk7CisJdm9pZCBzZXRSZHZTY2hlZHVsaW5nKEV4ZWN1dGFibGVGb3JtICogdGhlRXhlY3V0YWJsZSk7CisKK307CisKKworCit9CisKKyNlbmRpZiAvKkJVSUxERVJfQ09NUElMRVJfQ09NUElMRVJfSF8qLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9jb21waWxlci9Db21waWxlck9mSW50ZXJhY3Rpb24uY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9jb21waWxlci9Db21waWxlck9mSW50ZXJhY3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZDc4NzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL2NvbXBpbGVyL0NvbXBpbGVyT2ZJbnRlcmFjdGlvbi5jcHAKQEAgLTAsMCArMSwzMDg2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTggc2VwdC4gMjAwOAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQ29tcGlsZXJPZkludGVyYWN0aW9uLmgiCisKKyNpbmNsdWRlIDxidWlsZGVyL2NvbXBpbGVyL1N5bWJvbFRhYmxlLmg+CisjaW5jbHVkZSA8YnVpbGRlci9jb21waWxlci9Db21waWxlci5oPgorCisjaW5jbHVkZSA8Zm1sL2NvbW1vbi9Nb2RpZmllckVsZW1lbnQuaD4KKworI2luY2x1ZGUgPGZtbC9saWIvSUNvbVBvaW50Lmg+CisKKyNpbmNsdWRlIDxmbWwvYnVpbHRpbi9JZGVudGlmaWVyLmg+CisjaW5jbHVkZSA8Zm1sL2J1aWx0aW4vUXVhbGlmaWVkSWRlbnRpZmllci5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZUZvcm0uaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mQnVmZmVyLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZkNvbm5lY3QuaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mRGF0YS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZNYWNoaW5lLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvUm91dGVyLmg+CisKKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvQnVmZmVyLmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0NoYW5uZWwuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvQ29tUG9pbnQuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvQ29tUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvQ29tUm91dGUuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvQ29ubmVjdG9yLmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0ludGVyYWN0aW9uUGFydC5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9NYWNoaW5lLmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1BvcnQuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvUHJvcGVydHlQYXJ0Lmg+CisKKyNpbmNsdWRlIDxmbWwvdHlwZS9CYXNlVHlwZVNwZWNpZmllci5oPgorI2luY2x1ZGUgPGZtbC90eXBlL1R5cGVNYW5hZ2VyLmg+CisKKyNpbmNsdWRlIDxmbWwvd29ya2Zsb3cvVW5pRm9ybUlkZW50aWZpZXIuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoqCisgKiBDT05TVFJVQ1RPUgorICogRGVmYXVsdAorICovCitDb21waWxlck9mSW50ZXJhY3Rpb246OkNvbXBpbGVyT2ZJbnRlcmFjdGlvbihDb21waWxlciAmIGFDb21waWxlcikKKzogQmFzZUNvbXBpbGVyKGFDb21waWxlciksCittTmV4dFJvdXRlSUQoIDAgKSwKK21OZXh0Q29ubmVjdElEKCAwICkKK3sKKwkvLyEhIE5PVEhJTkcKK30KKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQUkVDT01QSUxBVElPTgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKioKKyAqIHByZWNvbXBpbGUKKyAqIHBvcnQKKyAqLworCitCRiBDb21waWxlck9mSW50ZXJhY3Rpb246OnByZWNvbXBpbGVQYXJhbWV0ZXIoCisJCUV4ZWN1dGFibGVGb3JtICogYUNvbnRhaW5lciwgVGFibGVPZkluc3RhbmNlT2ZEYXRhICYgdGFibGVPZlZhcmlhYmxlLAorCQlWYXJpYWJsZSAqIGFQYXJhbWV0ZXIsIGF2bV9vZmZzZXRfdCBvZmZzZXQpCit7CisJLy8gI2JpbmQgcGFyYW1ldGVyCisJaWYoIGFQYXJhbWV0ZXItPmdldE1vZGlmaWVyKCkuaGFzTmF0dXJlUGFyYW1ldGVyQmluZCgpICkKKwl7CisJCUluc3RhbmNlT2ZEYXRhICogYmluZEluc3RhbmNlID0gbmV3IEluc3RhbmNlT2ZEYXRhKAorCQkJCUlQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9TVEFOREFSRF9OQVRVUkUsCisJCQkJYUNvbnRhaW5lciwgYVBhcmFtZXRlciwgVHlwZU1hbmFnZXI6OlVOSVZFUlNBTCwKKwkJCQlvZmZzZXQsIGFQYXJhbWV0ZXItPmdldE1vZGlmaWVyKCkgKTsKKwkJaWYoIGFQYXJhbWV0ZXItPmdldE5hbWVJRCgpLmVtcHR5KCkgKQorCQl7CisJCQliaW5kSW5zdGFuY2UtPnNldE5hbWVJRCggT1NTKCkgPDwgIiQiIDw8IG9mZnNldCApOworCQl9CisJCWVsc2UKKwkJeworCQkJYmluZEluc3RhbmNlLT5zZXROYW1lSUQoIGFQYXJhbWV0ZXItPmdldE5hbWVJRCgpICk7CisJCX0KKwkJYmluZEluc3RhbmNlLT5zZXRWYWx1ZSggYVBhcmFtZXRlci0+Z2V0VmFsdWUoKSApOworCisJCXJldHVybiggQkYoIGJpbmRJbnN0YW5jZSApICk7CisJfQorCisJLy8gdmFyaWFibGUgcGFyYW1ldGVyCisJZWxzZSBpZiggYVBhcmFtZXRlci0+Z2V0TW9kaWZpZXIoKS5oYXNOYXR1cmVQYXJhbWV0ZXIoKSApCisJeworCQlUeXBlU3BlY2lmaWVyIGFUeXBlU3BlY2lmaWVyID0KKwkJCQljb21waWxlVHlwZVNwZWNpZmllcihhQ29udGFpbmVyLCBhUGFyYW1ldGVyLT5nZXRUeXBlKCkpOworCisJCUluc3RhbmNlT2ZEYXRhICogcGFyYW1JbnN0YW5jZSA9IG5ldyBJbnN0YW5jZU9mRGF0YSgKKwkJCQlJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfU1RBTkRBUkRfTkFUVVJFLCBhQ29udGFpbmVyLAorCQkJCWFQYXJhbWV0ZXIsIGFUeXBlU3BlY2lmaWVyLCBvZmZzZXQsCisJCQkJYVBhcmFtZXRlci0+Z2V0TW9kaWZpZXIoKSApOworCQlpZiggYVBhcmFtZXRlci0+Z2V0TmFtZUlEKCkuZW1wdHkoKSApCisJCXsKKwkJCXBhcmFtSW5zdGFuY2UtPnNldE5hbWVJRCggT1NTKCkgPDwgIiQiIDw8IG9mZnNldCApOworCQl9CisJCWVsc2UKKwkJeworCQkJcGFyYW1JbnN0YW5jZS0+c2V0TmFtZUlEKCBhUGFyYW1ldGVyLT5nZXROYW1lSUQoKSApOworCQl9CisJCXBhcmFtSW5zdGFuY2UtPnNldFZhbHVlKCBhUGFyYW1ldGVyLT5nZXRWYWx1ZSgpICk7CisKKwkJcmV0dXJuKCBCRiggcGFyYW1JbnN0YW5jZSApICk7CisJfQorCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKK30KKworCit2b2lkIENvbXBpbGVyT2ZJbnRlcmFjdGlvbjo6cHJlY29tcGlsZUNvbVBvaW50KEV4ZWN1dGFibGVGb3JtICogYUNvbnRhaW5lciwKKwkJUHJvcGVydHlQYXJ0ICYgdGhlRGVjbGFyYXRpb24sIFRhYmxlT2ZJbnN0YW5jZU9mRGF0YSAmIHRhYmxlT2ZWYXJpYWJsZSkKK3sKKwlQcm9wZXJ0eVBhcnQ6OlRhYmxlT2ZQb3J0IGxpc3RPZklucHV0UG9ydDsKKwlQcm9wZXJ0eVBhcnQ6OlRhYmxlT2ZQb3J0IGxpc3RPZklub3V0UG9ydDsKKwlQcm9wZXJ0eVBhcnQ6OlRhYmxlT2ZQb3J0IGxpc3RPZk91dHB1dFBvcnQ7CisKKwlCRiBhUGFyYW1ldGVyOworCVRhYmxlT2ZWYXJpYWJsZTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGl0UGFyYW07CisJVGFibGVPZlZhcmlhYmxlOjpjb25zdF9yYXdfaXRlcmF0b3IgZW5kUGFyYW07CisKKwlhdm1fc2l6ZV90IGlub3V0UG9ydENvdW50ID0gMDsKKworCS8vIENsYXNzaWZpY2F0aW9uIG9mIHNpZ25hbHMKKwlQcm9wZXJ0eVBhcnQ6OlRhYmxlT2ZTaWduYWw6OmNvbnN0X3Jhd19pdGVyYXRvciBpdHMgPQorCQkJdGhlRGVjbGFyYXRpb24uZ2V0U2lnbmFscygpLmJlZ2luKCk7CisJUHJvcGVydHlQYXJ0OjpUYWJsZU9mU2lnbmFsOjpjb25zdF9yYXdfaXRlcmF0b3IgZW5kSXRzID0KKwkJCXRoZURlY2xhcmF0aW9uLmdldFNpZ25hbHMoKS5lbmQoKTsKKwlmb3IoIDsgaXRzICE9IGVuZEl0cyA7ICsraXRzICkKKwl7CisJCWlmKCAoaXRzKS0+Z2V0TW9kaWZpZXIoKS5pc0RpcmVjdGlvbklucHV0KCkgKQorCQl7CisJCQlsaXN0T2ZJbnB1dFBvcnQuYXBwZW5kKCAqaXRzICk7CisJCX0KKwkJZWxzZSBpZiggKGl0cyktPmdldE1vZGlmaWVyKCkuaXNEaXJlY3Rpb25Jbm91dCgpICkKKwkJeworCQkJbGlzdE9mSW5vdXRQb3J0LmFwcGVuZCggKml0cyApOworCQkJKytpbm91dFBvcnRDb3VudDsKKwkJfQorCQllbHNlIGlmKCAoaXRzKS0+Z2V0TW9kaWZpZXIoKS5pc0RpcmVjdGlvbk91dHB1dCgpICkKKwkJeworCQkJbGlzdE9mT3V0cHV0UG9ydC5hcHBlbmQoICppdHMgKTsKKwkJfQorCX0KKworCWFDb250YWluZXItPnNldE1lc3NhZ2VTaWduYWxDb3VudCggdGhlRGVjbGFyYXRpb24uZ2V0U2lnbmFscygpLnNpemUoKSApOworCisJLy8gQ2xhc3NpZmljYXRpb24gb2YgcG9ydHMKKwlQcm9wZXJ0eVBhcnQ6OlRhYmxlT2ZQb3J0Ojpjb25zdF9yYXdfaXRlcmF0b3IgaXRwID0KKwkJCXRoZURlY2xhcmF0aW9uLmdldFBvcnRzKCkuYmVnaW4oKTsKKwlQcm9wZXJ0eVBhcnQ6OlRhYmxlT2ZQb3J0Ojpjb25zdF9yYXdfaXRlcmF0b3IgZW5kSXRwID0KKwkJCXRoZURlY2xhcmF0aW9uLmdldFBvcnRzKCkuZW5kKCk7CisJZm9yKCA7IGl0cCAhPSBlbmRJdHAgOyArK2l0cCApCisJeworCQlpZiggKGl0cCktPmdldE1vZGlmaWVyKCkuaXNEaXJlY3Rpb25JbnB1dCgpICkKKwkJeworCQkJbGlzdE9mSW5wdXRQb3J0LmFwcGVuZCggKml0cCApOworCQl9CisJCWVsc2UgaWYoIChpdHApLT5nZXRNb2RpZmllcigpLmlzRGlyZWN0aW9uSW5vdXQoKSApCisJCXsKKwkJCWxpc3RPZklub3V0UG9ydC5hcHBlbmQoICppdHAgKTsKKwkJCSsraW5vdXRQb3J0Q291bnQ7CisJCX0KKwkJZWxzZSBpZiggKGl0cCktPmdldE1vZGlmaWVyKCkuaXNEaXJlY3Rpb25PdXRwdXQoKSApCisJCXsKKwkJCWxpc3RPZk91dHB1dFBvcnQuYXBwZW5kKCAqaXRwICk7CisJCX0KKwl9CisKKwkvLyBQcmUtY29tcGlsYXRpb24gb2YgcG9ydHMKKwlwcmVjb21waWxlQ29tUG9pbnQoYUNvbnRhaW5lciwKKwkJCWxpc3RPZklub3V0UG9ydCwgMCwgdGFibGVPZlZhcmlhYmxlKTsKKworCXByZWNvbXBpbGVDb21Qb2ludChhQ29udGFpbmVyLAorCQkJbGlzdE9mSW5wdXRQb3J0LCBpbm91dFBvcnRDb3VudCwgdGFibGVPZlZhcmlhYmxlKTsKKworCXByZWNvbXBpbGVDb21Qb2ludChhQ29udGFpbmVyLAorCQkJbGlzdE9mT3V0cHV0UG9ydCwgaW5vdXRQb3J0Q291bnQsIHRhYmxlT2ZWYXJpYWJsZSk7Cit9CisKKwordm9pZCBDb21waWxlck9mSW50ZXJhY3Rpb246OnByZWNvbXBpbGVDb21Qb2ludChFeGVjdXRhYmxlRm9ybSAqIGFDb250YWluZXIsCisJCWNvbnN0IFByb3BlcnR5UGFydDo6VGFibGVPZlBvcnQgJiBsaXN0T2ZDb21Qb2ludCwKKwkJYXZtX3NpemVfdCBpb1BvcnRPZmZzZXQsIFRhYmxlT2ZJbnN0YW5jZU9mRGF0YSAmIHRhYmxlT2ZWYXJpYWJsZSkKK3sKKwlJbnN0YW5jZU9mUG9ydCAqIG5ld1BvcnRJbnN0YW5jZSA9IE5VTEw7CisKKwlCRiBhUGFyYW1ldGVyOworCVRhYmxlT2ZWYXJpYWJsZTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGl0UGFyYW07CisJVGFibGVPZlZhcmlhYmxlOjpjb25zdF9yYXdfaXRlcmF0b3IgZW5kUGFyYW07CisKKwlhdm1fb2Zmc2V0X3QgdHlwZU9mZnNldCA9IDA7CisKKwlQcm9wZXJ0eVBhcnQ6OlRhYmxlT2ZQb3J0Ojpjb25zdF9yYXdfaXRlcmF0b3IgaXQgPSBsaXN0T2ZDb21Qb2ludC5iZWdpbigpOworCVByb3BlcnR5UGFydDo6VGFibGVPZlBvcnQ6OmNvbnN0X3Jhd19pdGVyYXRvciBlbmRJdCA9IGxpc3RPZkNvbVBvaW50LmVuZCgpOworCWZvciggYXZtX29mZnNldF90IG9mZnNldCA9IGlvUG9ydE9mZnNldCA7IGl0ICE9IGVuZEl0IDsgKytpdCAsICsrb2Zmc2V0ICkKKwl7CisJCW5ld1BvcnRJbnN0YW5jZSA9IG5ldyBJbnN0YW5jZU9mUG9ydChhQ29udGFpbmVyLCAoaXQpLCBvZmZzZXQsCisJCQkJKGl0KS0+Z2V0UGFyYW1ldGVycygpLnNpemUoKSwgKGl0KS0+Z2V0Q29tUG9pbnROYXR1cmUoKSk7CisKKwkJZ2V0U3ltYm9sVGFibGUoKS5hZGRQb3J0SW5zdGFuY2UoCisJCQkJYUNvbnRhaW5lci0+c2F2ZVBvcnQobmV3UG9ydEluc3RhbmNlKSApOworCisJCWlmKCBuZXdQb3J0SW5zdGFuY2UtPmlzU2lnbmFsKCkgKQorCQl7CisJCQluZXdQb3J0SW5zdGFuY2UtPnNldFJvdXRlT2Zmc2V0KCBtTmV4dFJvdXRlSUQrKyApOworCQl9CisKKwkJaXRQYXJhbSA9IChpdCktPmdldFBhcmFtZXRlcnMoKS5iZWdpbigpOworCQllbmRQYXJhbSA9IChpdCktPmdldFBhcmFtZXRlcnMoKS5lbmQoKTsKKwkJZm9yKCB0eXBlT2Zmc2V0ID0gMCA7IGl0UGFyYW0gIT0gZW5kUGFyYW0gOyArK2l0UGFyYW0gLCArK3R5cGVPZmZzZXQgKQorCQl7CisJCQlhUGFyYW1ldGVyID0gcHJlY29tcGlsZVBhcmFtZXRlcihhQ29udGFpbmVyLAorCQkJCQl0YWJsZU9mVmFyaWFibGUsIChpdFBhcmFtKSwgdHlwZU9mZnNldCk7CisJCQluZXdQb3J0SW5zdGFuY2UtPnNldFBhcmFtZXRlcih0eXBlT2Zmc2V0LCBhUGFyYW1ldGVyKTsKKwkJfQorCX0KK30KKworCisKK3ZvaWQgQ29tcGlsZXJPZkludGVyYWN0aW9uOjpwcmVjb21waWxlQ2hhbm5lbChFeGVjdXRhYmxlRm9ybSAqIGFDb250YWluZXIsCisJCVByb3BlcnR5UGFydCAmIHRoZURlY2xhcmF0aW9uLCBUYWJsZU9mSW5zdGFuY2VPZkRhdGEgJiB0YWJsZU9mVmFyaWFibGUpCit7CisJSW5zdGFuY2VPZlBvcnQgKiBuZXdJbnN0YW5jZU9mQ2hhbm5lbDsKKwlJbnN0YW5jZU9mUG9ydCAqIG5ld0luc3RhbmNlT2ZQb3J0OworCisJUHJvcGVydHlQYXJ0Ojpjb25zdF9vd25lZF9pdGVyYXRvciBpdDsKKwlQcm9wZXJ0eVBhcnQ6OmNvbnN0X293bmVkX2l0ZXJhdG9yIGVuZEl0OworCisJUHJvcGVydHlQYXJ0OjpUYWJsZU9mQ2hhbm5lbDo6Y29uc3RfcmF3X2l0ZXJhdG9yIGl0Q2hhbm5lbCA9CisJCQl0aGVEZWNsYXJhdGlvbi5nZXRDaGFubmVscygpLmJlZ2luKCk7CisJUHJvcGVydHlQYXJ0OjpUYWJsZU9mQ2hhbm5lbDo6Y29uc3RfcmF3X2l0ZXJhdG9yIGVuZENoYW5uZWwgPQorCQkJdGhlRGVjbGFyYXRpb24uZ2V0Q2hhbm5lbHMoKS5lbmQoKTsKKwlhdm1fb2Zmc2V0X3Qgb2Zmc2V0ID0gMDsKKwlmb3IoIDsgaXRDaGFubmVsICE9IGVuZENoYW5uZWwgOyArK2l0Q2hhbm5lbCwgKytvZmZzZXQgKQorCXsKKwkJbmV3SW5zdGFuY2VPZkNoYW5uZWwgPSBJbnN0YW5jZU9mUG9ydDo6bmV3Q2hhbm5lbCgKKwkJCQlhQ29udGFpbmVyLCAoaXRDaGFubmVsKSwgb2Zmc2V0KTsKKworCQlhQ29udGFpbmVyLT5zYXZlQ2hhbm5lbChuZXdJbnN0YW5jZU9mQ2hhbm5lbCk7CisKKwkJaWYoIChpdENoYW5uZWwpLT5oYXNDb250ZW50cygpICkKKwkJeworCQkJaXQgPSAoaXRDaGFubmVsKS0+Z2V0Q29udGVudHMoKS0+b3duZWRfYmVnaW4oKTsKKwkJCWVuZEl0ID0gKGl0Q2hhbm5lbCktPmdldENvbnRlbnRzKCktPm93bmVkX2VuZCgpOworCQkJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJCQl7CisJCQkJLy8gY2FzZSBvZiBTaWduYWwKKwkJCQlpZiggKCppdCkuaXM8IFNpZ25hbCA+KCkgKQorCQkJCXsKKwkJCQkJY29uc3QgU3ltYm9sICYgYVBvcnQgPSBnZXRTeW1ib2xUYWJsZSgpLnNlYXJjaFBvcnRJbnN0YW5jZSgKKwkJCQkJCQkoKml0KS50b19wdHI8IFBvcnQgPigpLT5nZXRTaWduYWxNb2RlbCgpICk7CisJCQkJCWlmKCBhUG9ydC52YWxpZCgpICkKKwkJCQkJeworCQkJCQkJbmV3SW5zdGFuY2VPZlBvcnQgPSBuZXcgSW5zdGFuY2VPZlBvcnQoCisJCQkJCQkJCWFDb250YWluZXIsICgqaXQpLnRvX3B0cjwgUG9ydCA+KCksCisJCQkJCQkJCW5ld0luc3RhbmNlT2ZDaGFubmVsLCBhUG9ydC5yYXdQb3J0KCkgKTsKKworCQkJCQkJbmV3SW5zdGFuY2VPZkNoYW5uZWwtPmFwcGVuZENvbnRlbnQoCisJCQkJCQkJCVN5bWJvbChuZXdJbnN0YW5jZU9mUG9ydCkgKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWVsc2UgaWYoICgqaXQpLmlzPCBWYXJpYWJsZSA+KCkgKQorCQkJCXsKKworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworCisvKioKKyAqIHByZWNvbXBpbGUKKyAqIGJ1ZmZlcgorICovCit2b2lkIENvbXBpbGVyT2ZJbnRlcmFjdGlvbjo6cHJlY29tcGlsZUJ1ZmZlcigKKwkJRXhlY3V0YWJsZUZvcm0gKiBhQ29udGFpbmVyLCBCdWZmZXIgKiBhQnVmZmVyKQoreworCUluc3RhbmNlT2ZCdWZmZXIgKiBuZXdCdWZmZXJJbnN0YW5jZSA9IG5ldyBJbnN0YW5jZU9mQnVmZmVyKAorCQkJYUNvbnRhaW5lciwgYUJ1ZmZlciwgYUNvbnRhaW5lci0+Z2V0QnVmZmVyKCkuc2l6ZSgpKTsKKworCWdldFN5bWJvbFRhYmxlKCkuYWRkQnVmZmVySW5zdGFuY2UoCisJCQlhQ29udGFpbmVyLT5zYXZlQnVmZmVyKG5ld0J1ZmZlckluc3RhbmNlKSApOworfQorCisKKworCisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDT01QSUxBVElPTgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKwordm9pZCBDb21waWxlck9mSW50ZXJhY3Rpb246OmNvbXBpbGVQb3J0KEV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlKQoreworCVRhYmxlT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGl0UG9ydCA9IGFuRXhlY3V0YWJsZS0+Z2V0UG9ydCgpLmJlZ2luKCk7CisJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgZW5kUG9ydCA9IGFuRXhlY3V0YWJsZS0+Z2V0UG9ydCgpLmVuZCgpOworCWZvciggOyBpdFBvcnQgIT0gZW5kUG9ydCA7ICsraXRQb3J0ICkKKwl7CisJCWNvbXBpbGVQb3J0KGFuRXhlY3V0YWJsZSwgKCppdFBvcnQpLnBvcnQoKSk7CisJfQorfQorCit2b2lkIENvbXBpbGVyT2ZJbnRlcmFjdGlvbjo6Y29tcGlsZVBvcnQoRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGUsCisJCWNvbnN0IEluc3RhbmNlT2ZQb3J0ICYgYVBvcnRJbnN0YW5jZSkKK3sKKwlBcnJheU9mQkY6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYVBvcnRJbnN0YW5jZS5nZXRQYXJhbWV0ZXJzKCkuYmVnaW4oKTsKKwlBcnJheU9mQkY6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gYVBvcnRJbnN0YW5jZS5nZXRQYXJhbWV0ZXJzKCkuZW5kKCk7CisJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJeworCQlpZiggKCppdCkuaXM8IEluc3RhbmNlT2ZEYXRhID4oKSApCisJCXsKKwkJCUluc3RhbmNlT2ZEYXRhICogYVZhciA9ICgqaXQpLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpOworCisJCQkvLyAjYmluZCBwYXJhbWV0ZXIKKwkJCWlmKCBhVmFyLT5nZXRNb2RpZmllcigpLmhhc05hdHVyZVBhcmFtZXRlckJpbmQoKQorCQkJCSYmIGFWYXItPmhhc1ZhbHVlKCkgKQorCQkJeworCQkJCWFWYXItPnNldFZhbHVlKCBtQXZtY29kZUNvbXBpbGVyLmRlY29kZV9jb21waWxlRXhwcmVzc2lvbigKKwkJCQkJCWFuRXhlY3V0YWJsZSwgYVZhci0+Z2V0VmFsdWUoKSkgKTsKKwkJCX0KKworCQkJLy8gdmFyaWFibGUgcGFyYW1ldGVyLCBvcHRpb25hbCBkZWZhdWx0IHZhbHVlCisJCQllbHNlIGlmKCBhVmFyLT5nZXRNb2RpZmllcigpLmhhc05hdHVyZVBhcmFtZXRlcigpCisJCQkJCSYmIGFWYXItPmhhc1ZhbHVlKCkKKwkJCQkJJiYgKG5vdCBhVmFyLT5nZXRWYWx1ZSgpLmlzTnVtZXJpYygpKSApCisJCQl7CisJCQkJYVZhci0+c2V0VmFsdWUoIG1Bdm1jb2RlQ29tcGlsZXIuZGVjb2RlX2NvbXBpbGVFeHByZXNzaW9uKAorCQkJCQkJYW5FeGVjdXRhYmxlLCBhVmFyLT5nZXRWYWx1ZSgpKSApOworCQkJfQorCQl9CisJfQorfQorCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRPT0xTIEZPUiBST1VURVIgQ1JFQVRJT04KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworUm91dGVyIENvbXBpbGVyT2ZJbnRlcmFjdGlvbjo6bmV3TWFjaGluZVJvdXRlcihJbnN0YW5jZU9mTWFjaGluZSAqIGFNYWNoaW5lKQoreworCVJvdXRlciBhUm91dGVyKGFNYWNoaW5lLCBtTmV4dFJvdXRlSUQsIG1OZXh0Um91dGVJRCk7CisKKwlFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZSA9IGFNYWNoaW5lLT5nZXRFeGVjdXRhYmxlKCk7CisKKwlUYWJsZU9mU3ltYm9sOjppdGVyYXRvciBpdFBvcnQgPSBhbkV4ZWN1dGFibGUtPmdldFBvcnQoKS5iZWdpbigpOworCVRhYmxlT2ZTeW1ib2w6Oml0ZXJhdG9yIGVuZFBvcnQgPSBhbkV4ZWN1dGFibGUtPmdldFBvcnQoKS5lbmQoKTsKKwlmb3IoIDsgaXRQb3J0ICE9IGVuZFBvcnQgOyArK2l0UG9ydCApCisJeworCQlpZiggKCppdFBvcnQpLnBvcnQoKS5pc1BvcnQoKSApCisJCXsKKwkJCS8vIHRoZSByb3V0ZSBvZmZzZXQgb2YgbG9jYWwgcG9ydCB3LnIudC4gZ2xvYmFsIHJvdXRlIG9mZnNldAorCQkJKCppdFBvcnQpLnNldFJvdXRlT2Zmc2V0KCBtTmV4dFJvdXRlSUQgKyAoKml0UG9ydCkuZ2V0T2Zmc2V0KCkgLQorCQkJCQlhbkV4ZWN1dGFibGUtPmdldE1lc3NhZ2VTaWduYWxDb3VudCgpICk7CisKKwkJCWlmKCAoKml0UG9ydCkuZ2V0TW9kaWZpZXIoKS5oYXNEaXJlY3Rpb25JbnB1dCgpICkKKwkJCXsKKwkJCQlhUm91dGVyLmFwcGVuZElucHV0Um91dGluZyggUm91dGluZ0RhdGE6Ol9OVUxMXyApOworCQkJfQorCQkJLy8gTk8gRUxTRSBiZWNhdXNlIG9mIElOT1VUIFBPUlQKKwkJCWlmKCAoKml0UG9ydCkuZ2V0TW9kaWZpZXIoKS5oYXNEaXJlY3Rpb25PdXRwdXQoKSApCisJCQl7CisJCQkJYVJvdXRlci5hcHBlbmRPdXRwdXRSb3V0aW5nKCBSb3V0aW5nRGF0YTo6X05VTExfICk7CisJCQl9CisJCX0KKworCQllbHNlLy8gaWYoICgqaXRQb3J0KS5pc1NpZ25hbCgpICkKKwkJeworCQkJLy8hISBOT1RISU5HCisJCX0KKwl9CisKKwlyZXR1cm4oIGFSb3V0ZXIgKTsKK30KKworCitSb3V0ZXIgQ29tcGlsZXJPZkludGVyYWN0aW9uOjphZGRNYWNoaW5lTW9kZWxSb3V0ZXIoCisJCUV4ZWN1dGFibGVGb3JtICogdGhlRXhlY3V0YWJsZSwgSW5zdGFuY2VPZk1hY2hpbmUgKiBhTWFjaGluZSkKK3sKKwlBVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoIGFNYWNoaW5lLT5nZXRPZmZzZXQoKSA9PSAwICkKKwkJCTw8ICJVbmV4cGVjdGVkIHRoZSBmaXJzdCBtYWNoaW5lIG1vZGVsICIKKwkJCQkiZm9yIHJvdXRlciB3aXRoIG9mZnNldCA+IDAgISEhIgorCQkJPDwgU0VORF9FWElUOworCisJUm91dGVyIGFSb3V0ZXIgPSBuZXdNYWNoaW5lUm91dGVyKGFNYWNoaW5lKTsKKworCXRoZUV4ZWN1dGFibGUtPmFwcGVuZFJvdXRlcjRNb2RlbCggYVJvdXRlciApOworCisJcmV0dXJuKCBhUm91dGVyICk7Cit9CisKKworCisvKioKKyAqIGNvbXBpbGUKKyAqIHN0YXRlbWFjaGluZSBpbnRlcmFjdGlvbgorICovCit2b2lkIENvbXBpbGVyT2ZJbnRlcmFjdGlvbjo6Y29tcGlsZUNvbW11bmljYXRpb24oRXhlY3V0YWJsZUZvcm0gKiB0aGVFeGVjdXRhYmxlLAorCQlib29sICYgaGFzU3luY2hyb25pemVNYWNoaW5lLCBib29sICYgaGFzVXBkYXRlQnVmZmVyKQoreworCWNvbnN0IE1hY2hpbmUgKiBhTWFjaGluZSA9IHRoZUV4ZWN1dGFibGUtPmdldEFzdE1hY2hpbmUoKTsKKworCWlmKCBhTWFjaGluZS0+aGFzSW50ZXJhY3Rpb24oKSApCisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoIHRoZUV4ZWN1dGFibGUtPmhhc0luc3RhbmNlU3RhdGljVGhpcygpICkKKwkJCQk8PCAiVW5leHBlY3RlZCBjb21tdW5pY2F0ZWQgTWFjaGluZSB3aXRob3V0IHN1Ym1hY2hpbmUgVEhJUyAhISEiCisJCQkJPDwgU0VORF9FWElUOworCisJCWF2bV9zaXplX3QgbmJDb21NYWNoaW5lQ291bnQgPSAwOworCisJCVRhYmxlT2ZSb3V0ZXIgJiB0aGVUYWJsZU9mUm91dGVyNEluc3RhbmNlID0KKwkJCQl0aGVFeGVjdXRhYmxlLT5nZXRSb3V0ZXJzNEluc3RhbmNlKCk7CisKKwkJLy8gQXR0ZW50aW9uOiB0aGUgb2Zmc2V0IG9mIHJvdXRpbmcgdGFibGUgb2YgYW4gaW5zdGFuY2UgbWFjaGluZSBpcworCQkvLyB0aGUgc2FtZSB0aGFuIHRoZSBvZmZzZXQgb2YgdGhpcyBpbnN0YW5jZQorCQlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBpdE1hY2hpbmUgPQorCQkJCXRoZUV4ZWN1dGFibGUtPmdldEluc3RhbmNlU3RhdGljKCkuYmVnaW4oKTsKKwkJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgZW5kTWFjaGluZSA9CisJCQkJdGhlRXhlY3V0YWJsZS0+Z2V0SW5zdGFuY2VTdGF0aWMoKS5lbmQoKTsKKwkJZm9yKCA7IGl0TWFjaGluZSAhPSBlbmRNYWNoaW5lIDsgKytpdE1hY2hpbmUgKQorCQl7CisJCQlpZiggKCppdE1hY2hpbmUpLmdldEV4ZWN1dGFibGUoKS0+aGFzUG9ydCgpICkKKwkJCXsKKwkJCQkrK25iQ29tTWFjaGluZUNvdW50OworCQkJCXRoZVRhYmxlT2ZSb3V0ZXI0SW5zdGFuY2UuYXBwZW5kKAorCQkJCQkJbmV3TWFjaGluZVJvdXRlcigoKml0TWFjaGluZSkucmF3TWFjaGluZSgpKSApOworLy9AZGVidWc6CisvLwkJCQlBVk1fT1NfVFJBQ0UgPDwgImNvbXBpbGVDb21tdW5pY2F0aW9uIDo+IElOSVQgIgorLy8JCQkJCQk8PCBzdHJfaGVhZGVyKCB0aGVFeGVjdXRhYmxlICkgPDwgc3RkOjplbmRsOworLy8JCQkJdGhlUm91dGVyVGFibGUtPmxhc3QoKS0+dG9TdHJlYW0oQVZNX09TX1RSQUNFKTsKKwkJCX0KKwkJCWVsc2UgaWYoICgqaXRNYWNoaW5lKS5nZXRBc3RNYWNoaW5lKCktPmhhc0ludGVyYWN0aW9uKCkgKQorCQkJeworCQkJCSsrbmJDb21NYWNoaW5lQ291bnQ7CisJCQkJdGhlVGFibGVPZlJvdXRlcjRJbnN0YW5jZS5hcHBlbmQoCisJCQkJCQluZXdNYWNoaW5lUm91dGVyKCgqaXRNYWNoaW5lKS5yYXdNYWNoaW5lKCkpICk7CisvL0BkZWJ1ZzoKKy8vCQkJCUFWTV9PU19UUkFDRSA8PCAiY29tcGlsZUNvbW11bmljYXRpb24gOj4gSU5JVCAiCisvLwkJCQkJCTw8IHN0cl9oZWFkZXIoIHRoZUV4ZWN1dGFibGUgKSA8PCBzdGQ6OmVuZGw7CisvLwkJCQl0aGVSb3V0ZXJUYWJsZS0+bGFzdCgpLT50b1N0cmVhbShBVk1fT1NfVFJBQ0UpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXRoZVRhYmxlT2ZSb3V0ZXI0SW5zdGFuY2UuYXBwZW5kKCBSb3V0ZXI6Ol9OVUxMXyApOworCQkJfQorCQl9CisKKwkJLy8gRm9yIE1BQ0hJTkUgTU9ERUwKKwkJVGFibGVPZlJvdXRlciAmIHRoZVRhYmxlT2ZSb3V0ZXI0TW9kZWwgPQorCQkJCXRoZUV4ZWN1dGFibGUtPmdldFJvdXRlcnM0TW9kZWwoKTsKKworCQkvLyBSb3V0ZXIgZm9yIGluc3RhbmNlIG1hY2hpbmUgVEhJUworCQl0aGVUYWJsZU9mUm91dGVyNE1vZGVsLmFwcGVuZCggdGhlRXhlY3V0YWJsZS0+Z2V0Um91dGVyNFRoaXMoKSApOworCisJCWl0TWFjaGluZSA9IHRoZUV4ZWN1dGFibGUtPmluc3RhbmNlX21vZGVsX2JlZ2luKCk7CisJCWVuZE1hY2hpbmUgPSB0aGVFeGVjdXRhYmxlLT5pbnN0YW5jZV9tb2RlbF9lbmQoKTsKKwkJZm9yKCA7IGl0TWFjaGluZSAhPSBlbmRNYWNoaW5lIDsgKytpdE1hY2hpbmUgKQorCQl7CisJCQlpZiggKCppdE1hY2hpbmUpLmdldEV4ZWN1dGFibGUoKS0+aGFzUG9ydCgpICkKKwkJCXsKKwkJCQkrK25iQ29tTWFjaGluZUNvdW50OworCQkJCXRoZVRhYmxlT2ZSb3V0ZXI0TW9kZWwuYXBwZW5kKAorCQkJCQkJbmV3TWFjaGluZVJvdXRlcigoKml0TWFjaGluZSkucmF3TWFjaGluZSgpKSApOworLy9AZGVidWc6CisvLwkJCQlBVk1fT1NfVFJBQ0UgPDwgImNvbXBpbGVDb21tdW5pY2F0aW9uIDo+IElOSVQgIgorLy8JCQkJCQk8PCBzdHJfaGVhZGVyKCB0aGVFeGVjdXRhYmxlICkgPDwgc3RkOjplbmRsOworLy8JCQkJdGhlUm91dGVyVGFibGUtPmxhc3QoKS0+dG9TdHJlYW0oQVZNX09TX1RSQUNFKTsKKwkJCX0KKwkJCWVsc2UgaWYoICgqaXRNYWNoaW5lKS5nZXRBc3RNYWNoaW5lKCktPmhhc0ludGVyYWN0aW9uKCkgKQorCQkJeworCQkJCSsrbmJDb21NYWNoaW5lQ291bnQ7CisJCQkJdGhlVGFibGVPZlJvdXRlcjRNb2RlbC5hcHBlbmQoCisJCQkJCQluZXdNYWNoaW5lUm91dGVyKCgqaXRNYWNoaW5lKS5yYXdNYWNoaW5lKCkpICk7CisvL0BkZWJ1ZzoKKy8vCQkJCUFWTV9PU19UUkFDRSA8PCAiY29tcGlsZUNvbW11bmljYXRpb24gOj4gSU5JVCAiCisvLwkJCQkJCTw8IHN0cl9oZWFkZXIoIHRoZUV4ZWN1dGFibGUgKSA8PCBzdGQ6OmVuZGw7CisvLwkJCQl0aGVSb3V0ZXJUYWJsZS0+bGFzdCgpLT50b1N0cmVhbShBVk1fT1NfVFJBQ0UpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXRoZVRhYmxlT2ZSb3V0ZXI0TW9kZWwuYXBwZW5kKCBSb3V0ZXI6Ol9OVUxMXyApOworCQkJfQorCQl9CisKKwkJaWYoIG5iQ29tTWFjaGluZUNvdW50ID4gMCApCisJCXsKKwkJCWNvbXBpbGVDb25uZWN0b3IodGhlRXhlY3V0YWJsZSwKKwkJCQkJaGFzVXBkYXRlQnVmZmVyLCBoYXNTeW5jaHJvbml6ZU1hY2hpbmUpOworCisJCQlwb3N0Q29tcGlsZUNvbW11bmljYXRpb24odGhlRXhlY3V0YWJsZSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQl0aGVFeGVjdXRhYmxlLT5nZXRSb3V0ZXJzNEluc3RhbmNlKCkuY2xlYXIoKTsKKworCQkJdGhlRXhlY3V0YWJsZS0+Z2V0Um91dGVyczRNb2RlbCgpLmNsZWFyKCk7CisJCX0KKwl9CisKKwllbHNlIGlmKCBhTWFjaGluZS0+aGFzUG9ydFNpZ25hbCgpCisJCQkmJiAoIGFNYWNoaW5lLT5nZXRTcGVjaWZpZXIoKS5pc0NvbXBvbmVudFN5c3RlbSgpCisJCQkJfHwgKG5vdCBhTWFjaGluZS0+Z2V0Q29udGFpbmVyTWFjaGluZSgpLT5oYXNJbnRlcmFjdGlvbigpKSApICkKKwl7CisJCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggdGhlRXhlY3V0YWJsZS0+aGFzSW5zdGFuY2VTdGF0aWNUaGlzKCkgKQorCQkJCTw8ICJVbmV4cGVjdGVkIGNvbW11bmljYXRlZCBNYWNoaW5lIHdpdGhvdXQgc3VibWFjaGluZSBUSElTICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJUm91dGVyIGJmUm91dGVyID0gbmV3TWFjaGluZVJvdXRlcigKKwkJCQl0aGVFeGVjdXRhYmxlLT5nZXRJbnN0YW5jZVN0YXRpY1RoaXMoKS5yYXdNYWNoaW5lKCkpOworCisJCXRoZUV4ZWN1dGFibGUtPmFwcGVuZFJvdXRlcjRJbnN0YW5jZSggYmZSb3V0ZXIgKTsKKworCQlpZiggbm90IGFNYWNoaW5lLT5nZXRTcGVjaWZpZXIoKS5pc0NvbXBvbmVudFN5c3RlbSgpICkKKwkJeworCQkJdGhlRXhlY3V0YWJsZS0+YXBwZW5kUm91dGVyNE1vZGVsKCBiZlJvdXRlciApOworCQl9CisKKy8vQGRlYnVnOgorLy8JCUFWTV9PU19UUkFDRSA8PCAiY29tcGlsZUNvbW11bmljYXRpb24gOj4gSU5JVCAiCisvLwkJCQk8PCBzdHJfaGVhZGVyKCBhTWFjaGluZSApIDw8IHN0ZDo6ZW5kbDsKKy8vCQl0aGVSb3V0ZXJUYWJsZS0+bGFzdCgpLT50b1N0cmVhbShBVk1fT1NfVFJBQ0UpOworCisJCXBvc3RDb21waWxlQ29tbXVuaWNhdGlvbih0aGVFeGVjdXRhYmxlKTsKKwl9Cit9CisKKworCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENPTVBJTEUgSU5URVJBQ1RJT04gQ09OTkVDVAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLwordm9pZCBDb21waWxlck9mSW50ZXJhY3Rpb246OmNvbXBpbGVDb25uZWN0b3IoRXhlY3V0YWJsZUZvcm0gKiB0aGVFeGVjdXRhYmxlLAorCQlib29sICYgaGFzU3luY2hyb25pemVNYWNoaW5lLCBib29sICYgaGFzVXBkYXRlQnVmZmVyKQoreworCWNvbnN0IE1hY2hpbmUgKiBhTWFjaGluZSA9IHRoZUV4ZWN1dGFibGUtPmdldEFzdE1hY2hpbmUoKTsKKworCUluc3RhbmNlT2ZDb25uZWN0ICogaW9jID0gTlVMTDsKKworCUludGVyYWN0aW9uUGFydDo6Y29uc3RfY29ubmVjdG9yX2l0ZXJhdG9yIGl0Q29ubmVjdG9yOworCUludGVyYWN0aW9uUGFydDo6Y29uc3RfY29ubmVjdG9yX2l0ZXJhdG9yIGVuZENvbm5lY3RvcjsKKworCWNvbnN0IEludGVyYWN0aW9uUGFydCAqIHRoZUludGVyYWN0aW9uUGFydCA9IGFNYWNoaW5lLT5nZXRJbnRlcmFjdGlvbigpOworCWlmKCB0aGVJbnRlcmFjdGlvblBhcnQgIT0gTlVMTCApCisJeworCQlpdENvbm5lY3RvciAgPSB0aGVJbnRlcmFjdGlvblBhcnQtPmNvbm5lY3Rvcl9iZWdpbigpOworCQllbmRDb25uZWN0b3IgPSB0aGVJbnRlcmFjdGlvblBhcnQtPmNvbm5lY3Rvcl9lbmQoKTsKKwkJZm9yKCA7IGl0Q29ubmVjdG9yICE9IGVuZENvbm5lY3RvciA7ICsraXRDb25uZWN0b3IgKQorCQl7CisJCQlpb2MgPSBuZXcgSW5zdGFuY2VPZkNvbm5lY3QoIHRoZUV4ZWN1dGFibGUsCisJCQkJCShpdENvbm5lY3RvciksIHRoZUV4ZWN1dGFibGUtPmdldENvbm5lY3QoKS5zaXplKCksCisJCQkJCShpdENvbm5lY3RvciktPmdldFByb3RvY29sKCksIChpdENvbm5lY3RvciktPmdldENhc3QoKSApOworCisJCQlnZXRTeW1ib2xUYWJsZSgpLmFkZENvbm5lY3RJbnN0YW5jZSgKKwkJCQkJdGhlRXhlY3V0YWJsZS0+c2F2ZUNvbm5lY3QoaW9jKSApOworCisJCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQkJLy8gRm9yIFBPUlQKKwkJCWlmKCAoaXRDb25uZWN0b3IpLT5pc1BvcnQoKSApCisJCQl7CisJCQkJY29tcGlsZUNvbm5lY3Rvcih0aGVFeGVjdXRhYmxlLCAoaXRDb25uZWN0b3IpLCBpb2MsCisJCQkJCQloYXNTeW5jaHJvbml6ZU1hY2hpbmUsIGhhc1VwZGF0ZUJ1ZmZlcik7CisJCQl9CisKKwkJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCQkvLyBGb3IgTUVTU0FHRSBPUiBTSUdOQUwKKwkJCWVsc2UgaWYoIChpdENvbm5lY3RvciktPmlzU2lnbmFsKCkgKQorCQkJeworCQkJCWNvbXBpbGVSb3V0ZSh0aGVFeGVjdXRhYmxlLCAoaXRDb25uZWN0b3IpLCBpb2MsCisJCQkJCQloYXNTeW5jaHJvbml6ZU1hY2hpbmUsIGhhc1VwZGF0ZUJ1ZmZlcik7CisJCQl9CisJCX0KKwl9Cit9CisKKworCit2b2lkIENvbXBpbGVyT2ZJbnRlcmFjdGlvbjo6Y29tcGlsZUNvbm5lY3RvcihFeGVjdXRhYmxlRm9ybSAqIHRoZUV4ZWN1dGFibGUsCisJCUNvbm5lY3RvciAqIGFDb25uZWN0b3IsIEluc3RhbmNlT2ZDb25uZWN0ICogaW9jLAorCQlib29sICYgaGFzU3luY2hyb25pemVNYWNoaW5lLCBib29sICYgaGFzVXBkYXRlQnVmZmVyKQoreworCS8vIE9uZSB1bmlxdWUgQ29ubmVjdG9yIElEIHBlciBjb25uZWN0aW9uIQorCWlvYy0+c2V0TUlEKCArK21OZXh0Q29ubmVjdElEICk7CisJc3dpdGNoKCBhQ29ubmVjdG9yLT5nZXRQcm90b2NvbCgpICkKKwl7CisJCWNhc2UgQ29tUHJvdG9jb2w6OlBST1RPQ09MX0JVRkZFUl9LSU5EOgorCQl7CisJCQljb21waWxlQ29ubmVjdG9yQnVmZmVyKHRoZUV4ZWN1dGFibGUsIGlvYyk7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgQ29tUHJvdG9jb2w6OlBST1RPQ09MX1JEVl9LSU5EOgorCQljYXNlIENvbVByb3RvY29sOjpQUk9UT0NPTF9NVUxUSVJEVl9LSU5EOgorCQl7CisJCQloYXNTeW5jaHJvbml6ZU1hY2hpbmUgPSB0cnVlOworCQkJY29tcGlsZUNvbm5lY3RvclN5bmNocm9ub3VzKHRoZUV4ZWN1dGFibGUsIGlvYyk7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgQ29tUHJvdG9jb2w6OlBST1RPQ09MX0ZMT1dfS0lORDoKKwkJeworCQkJaGFzU3luY2hyb25pemVNYWNoaW5lID0gdHJ1ZTsKKwkJCWNvbXBpbGVDb25uZWN0b3JGbG93KHRoZUV4ZWN1dGFibGUsIGlvYyk7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgQ29tUHJvdG9jb2w6OlBST1RPQ09MX0JST0FEQ0FTVF9LSU5EOgorCQl7CisJCQloYXNVcGRhdGVCdWZmZXIgPSB0cnVlOworCQkJY29tcGlsZUNvbm5lY3RvckJyb2FkY2FzdCh0aGVFeGVjdXRhYmxlLCBpb2MpOworCQkJYnJlYWs7CisJCX0KKworCisJCWNhc2UgQ29tUHJvdG9jb2w6OlBST1RPQ09MX1RSQU5TRkVSVF9LSU5EOgorCQl7CisJCQljb21waWxlQ29ubmVjdG9yVHJhbnNmZXJ0KHRoZUV4ZWN1dGFibGUsIGlvYyk7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgQ29tUHJvdG9jb2w6OlBST1RPQ09MX0VOVklST05NRU5UX0tJTkQ6CisJCXsKKwkJCWNvbXBpbGVDb25uZWN0b3JFbnZpcm9ubWVudCh0aGVFeGVjdXRhYmxlLCBpb2MpOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIENvbVByb3RvY29sOjpQUk9UT0NPTF9NVUxUSUNBU1RfS0lORDoKKwkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfVU5JQ0FTVF9LSU5EOgorCQljYXNlIENvbVByb3RvY29sOjpQUk9UT0NPTF9BTllDQVNUX0tJTkQ6CisJCXsKKwkJCWNvbXBpbGVDb25uZWN0b3JSb3V0aW5nQ2FzdCh0aGVFeGVjdXRhYmxlLCBpb2MpOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIENvbVByb3RvY29sOjpQUk9UT0NPTF9VTkRFRklORURfS0lORDoKKwkJZGVmYXVsdDoKKwkJeworCQkJLy8gRVJST1IgUkVQT1JUSU5HCisJCQlpbmNyRXJyb3JDb3VudCgpOworCQkJYUNvbm5lY3Rvci0+ZXJyb3JMb2NhdGlvbihBVk1fT1NfV0FSTikKKwkJCQkJPDwgIlVuZXhwZWN0ZWQgZm9yIHRoZSBjb25uZWN0aW9uPHBvcnQ+IHRoZSBwcm90b2NvbCA8PCAiCisJCQkJCTw8IGFDb25uZWN0b3ItPnN0clByb3RvY29sQ2FzdCh0cnVlKSA8PCAiID4+IgorCQkJCQk8PCBzdGQ6OmVuZGw7CisKKwkJCWJyZWFrOworCQl9CisJfQorfQorCit2b2lkIENvbXBpbGVyT2ZJbnRlcmFjdGlvbjo6Y29tcGlsZVJvdXRlKEV4ZWN1dGFibGVGb3JtICogdGhlRXhlY3V0YWJsZSwKKwkJQ29ubmVjdG9yICogYUNvbm5lY3RvciwgSW5zdGFuY2VPZkNvbm5lY3QgKiBpb2MsCisJCWJvb2wgJiBoYXNTeW5jaHJvbml6ZU1hY2hpbmUsIGJvb2wgJiBoYXNVcGRhdGVCdWZmZXIpCit7CisJc3dpdGNoKCBhQ29ubmVjdG9yLT5nZXRQcm90b2NvbCgpICkKKwl7CisJCWNhc2UgQ29tUHJvdG9jb2w6OlBST1RPQ09MX0JVRkZFUl9LSU5EOgorCQl7CisJCQljb21waWxlUm91dGVCdWZmZXIodGhlRXhlY3V0YWJsZSwgaW9jKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfUkRWX0tJTkQ6CisJCWNhc2UgQ29tUHJvdG9jb2w6OlBST1RPQ09MX01VTFRJUkRWX0tJTkQ6CisJCXsKKwkJCWhhc1N5bmNocm9uaXplTWFjaGluZSA9IHRydWU7CisJCQljb21waWxlUm91dGVTeW5jaHJvbm91cyh0aGVFeGVjdXRhYmxlLCBpb2MpOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIENvbVByb3RvY29sOjpQUk9UT0NPTF9CUk9BRENBU1RfS0lORDoKKwkJeworCQkJaGFzVXBkYXRlQnVmZmVyID0gdHJ1ZTsKKwkJCWNvbXBpbGVSb3V0ZUJyb2FkY2FzdCh0aGVFeGVjdXRhYmxlLCBpb2MpOworCQkJYnJlYWs7CisJCX0KKworCisJCWNhc2UgQ29tUHJvdG9jb2w6OlBST1RPQ09MX1RSQU5TRkVSVF9LSU5EOgorCQl7CisJCQljb21waWxlUm91dGVUcmFuc2ZlcnQodGhlRXhlY3V0YWJsZSwgaW9jKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfRU5WSVJPTk1FTlRfS0lORDoKKwkJeworCQkJY29tcGlsZVJvdXRlRW52aXJvbm1lbnQodGhlRXhlY3V0YWJsZSwgaW9jKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfTVVMVElDQVNUX0tJTkQ6CisJCWNhc2UgQ29tUHJvdG9jb2w6OlBST1RPQ09MX1VOSUNBU1RfS0lORDoKKwkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfQU5ZQ0FTVF9LSU5EOgorCQl7CisJCQljb21waWxlUm91dGVSb3V0aW5nQ2FzdCh0aGVFeGVjdXRhYmxlLCBpb2MpOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIENvbVByb3RvY29sOjpQUk9UT0NPTF9VTkRFRklORURfS0lORDoKKwkJZGVmYXVsdDoKKwkJeworCQkJLy8gRVJST1IgUkVQT1JUSU5HCisJCQlpbmNyRXJyb3JDb3VudCgpOworCQkJYUNvbm5lY3Rvci0+ZXJyb3JMb2NhdGlvbihBVk1fT1NfV0FSTikKKwkJCQkJPDwgIlVuZXhwZWN0ZWQgZm9yIHRoZSBjb25uZWN0aW9uPG1lc3NhZ2V8c2lnbmFsPiAiCisJCQkJCQkJInRoZSBwcm90b2NvbCA8PCAiCisJCQkJCTw8IGFDb25uZWN0b3ItPnN0clByb3RvY29sQ2FzdCh0cnVlKSA8PCAiID4+IgorCQkJCQk8PCBzdGQ6OmVuZGw7CisKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ09NUElMRSBJTlRFUkFDVElPTiBDT05ORUNUIEJST0FEQ0FTVAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLwordm9pZCBDb21waWxlck9mSW50ZXJhY3Rpb246OmNvbXBpbGVDb25uZWN0b3JCcm9hZGNhc3QoCisJCUV4ZWN1dGFibGVGb3JtICogdGhlRXhlY3V0YWJsZSwgSW5zdGFuY2VPZkNvbm5lY3QgKiBpb2MpCit7CisJY29uc3QgQ29ubmVjdG9yICogYUNvbm5lY3RvciA9IGlvYy0+Z2V0QXN0Q29ubmVjdG9yKCk7CisKK0FWTV9JRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgQ09NTVVOSUNBVElPTiApCisJQVZNX09TX1RSQUNFIDw8IElOQ1JfSU5ERU5UX1RBQgorCQkJPDwgIkNPTVBJTEUgSU5URVJBQ1RJT04gQ09OTkVDVCBCUk9BRENBU1QiIDw8IHN0ZDo6ZW5kbDsKKwlhQ29ubmVjdG9yLT50b1N0cmVhbShBVk1fT1NfVFJBQ0UpOworCUFWTV9PU19UUkFDRSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRzIoIENPTVBJTElORyAsIENPTU1VTklDQVRJT04gKQorCisJQnVmZmVyICogYnVmZmVyID0gTlVMTDsKKwlJbnN0YW5jZU9mQnVmZmVyICogdGhlQnVmZmVySW5zdGFuY2UgPSBOVUxMOworCisJaWYoIGFDb25uZWN0b3ItPmhhc0J1ZmZlcigpICkKKwl7CisJCWJ1ZmZlciA9IGFDb25uZWN0b3ItPmdldEJ1ZmZlcigpOworCisJCWlmKCBidWZmZXItPmlzQW5vbnltSUQoKSApCisJCXsKKwkJCXRoZUJ1ZmZlckluc3RhbmNlID0gbmV3IEluc3RhbmNlT2ZCdWZmZXIoCisJCQkJCXRoZUV4ZWN1dGFibGUsIGJ1ZmZlciwgdGhlRXhlY3V0YWJsZS0+Z2V0QnVmZmVyKCkuc2l6ZSgpKTsKKworCQkJZ2V0U3ltYm9sVGFibGUoKS5hZGRCdWZmZXJJbnN0YW5jZSgKKwkJCQkJdGhlRXhlY3V0YWJsZS0+c2F2ZUJ1ZmZlcih0aGVCdWZmZXJJbnN0YW5jZSkgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXRoZUJ1ZmZlckluc3RhbmNlID0gZ2V0U3ltYm9sVGFibGUoKS5zZWFyY2hCdWZmZXJJbnN0YW5jZSgKKwkJCQkJdGhlRXhlY3V0YWJsZSwgYnVmZmVyKS5yYXdCdWZmZXIoKTsKKwkJfQorCX0KKwllbHNlIGlmKCBhQ29ubmVjdG9yLT5oYXNCdWZmZXJVZmlkKCkgKQorCXsKKwkJdGhlQnVmZmVySW5zdGFuY2UgPQorCQkJCWdldFN5bWJvbFRhYmxlKCkuc2VhcmNoQnVmZmVySW5zdGFuY2VCeVF1YWxpZmllZE5hbWVJRCgKKwkJCQkJdGhlRXhlY3V0YWJsZSwgYUNvbm5lY3Rvci0+c3RyQnVmZmVyVWZpZCgpKS5yYXdCdWZmZXIoKTsKKworCQlpZiggdGhlQnVmZmVySW5zdGFuY2UgPT0gTlVMTCApCisJCXsKKwkJCWluY3JFcnJvckNvdW50KCk7CisJCQlhQ29ubmVjdG9yLT5lcnJvckxvY2F0aW9uKEFWTV9PU19XQVJOKQorCQkJCQk8PCAiVW5mb3VuZCBpbiB0aGUgQ09NIFBPSU5UIHRoZSBidWZmZXIgaW5zdGFuY2UgPCAiCisJCQkJCTw8IGFDb25uZWN0b3ItPnN0ckJ1ZmZlclVmaWQoKSA8PCAiID4gISIgPDwgc3RkOjplbmRsOworCQl9CisJfQorCWVsc2UgLy9pZiggYnVmZmVyID09IE5VTEwgKQorCXsKKwkJdGhlQnVmZmVySW5zdGFuY2UgPSBuZXcgSW5zdGFuY2VPZkJ1ZmZlcigKKwkJCQl0aGVFeGVjdXRhYmxlLAlOVUxMLCB0aGVFeGVjdXRhYmxlLT5nZXRCdWZmZXIoKS5zaXplKCksCisJCQkJVFlQRV9GSUZPX1NQRUNJRklFUiwgLTEgKTsKKworCQlnZXRTeW1ib2xUYWJsZSgpLmFkZEJ1ZmZlckluc3RhbmNlKAorCQkJCXRoZUV4ZWN1dGFibGUtPnNhdmVCdWZmZXIodGhlQnVmZmVySW5zdGFuY2UpICk7CisJfQorCisKKwlCRkxpc3Q6OmNvbnN0X3Jhd19pdGVyYXRvcjwgQ29tUG9pbnQgPiBpdENvbVBvaW50OworCUJGTGlzdDo6Y29uc3RfcmF3X2l0ZXJhdG9yPCBDb21Qb2ludCA+IGVuZEl0Q29tUG9pbnQ7CisKKwlMaXN0PCBSb3V0aW5nRGF0YSA+IGxpc3RPZlJvdXRpbmdEYXRhOworCVJvdXRpbmdEYXRhIHRoZVJvdXRpbmdEYXRhOworCisJLy8gUm91dGluZyBmb3IgYWxsIHBvcnQKKwlDb25uZWN0b3I6OnJvdXRlX2l0ZXJhdG9yIGl0Q29tUm91dGUgPSBhQ29ubmVjdG9yLT5iZWdpbigpOworCUNvbm5lY3Rvcjo6cm91dGVfaXRlcmF0b3IgZW5kSXRDb21Sb3V0ZSA9IGFDb25uZWN0b3ItPmVuZCgpOworCWZvciggOyBpdENvbVJvdXRlICE9IGVuZEl0Q29tUm91dGUgOyArK2l0Q29tUm91dGUgKQorCXsKKwkJaXRDb21Qb2ludCA9ICgqaXRDb21Sb3V0ZSktPmdldENvbVBvaW50cygpLmJlZ2luKCk7CisJCWVuZEl0Q29tUG9pbnQgPSAoKml0Q29tUm91dGUpLT5nZXRDb21Qb2ludHMoKS5lbmQoKTsKKwkJZm9yKCA7IGl0Q29tUG9pbnQgIT0gZW5kSXRDb21Qb2ludCA7ICsraXRDb21Qb2ludCApCisJCXsKKwkJCWNyZWF0ZVJvdXRpbmdEYXRhKGxpc3RPZlJvdXRpbmdEYXRhLCB0aGVFeGVjdXRhYmxlLAorCQkJCQlpb2MsICgqaXRDb21Sb3V0ZSksIChpdENvbVBvaW50KSk7CisKKwkJCXdoaWxlKCBsaXN0T2ZSb3V0aW5nRGF0YS5ub25lbXB0eSgpICkKKwkJCXsKKwkJCQlsaXN0T2ZSb3V0aW5nRGF0YS5wb3BfZmlyc3RfdG8oIHRoZVJvdXRpbmdEYXRhICk7CisKKwkJCQkvLyBmb3IgYnVmZmVyIHBvcnQKKwkJCQlpZiggdGhlQnVmZmVySW5zdGFuY2UgIT0gTlVMTCApCisJCQkJeworCQkJCQl0aGVSb3V0aW5nRGF0YS5hcHBlbmRCdWZmZXIodGhlQnVmZmVySW5zdGFuY2UpOworCQkJCX0KKworCQkJCWlmKCAoKml0Q29tUm91dGUpLT5oYXNQcm90b2NvbCgpICkKKwkJCQl7CisJCQkJCS8vIFRPRE8gZm9yIG90aGVyIENPTV9QUk9UT0NPTAorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworQVZNX0lGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBDT01NVU5JQ0FUSU9OICkKKwlpb2MtPnRvU3RyZWFtKEFWTV9PU19UUkFDRSk7CisJQVZNX09TX1RSQUNFIDw8IFRBQl9ERUNSX0lOREVOVAorCQkJPDwgIkVORCBDT01QSUxFIElOVEVSQUNUSU9OIENPTk5FQ1QgQlJPQURDQVNUIgorCQkJPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgQ09NTVVOSUNBVElPTiApCit9CisKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDT01QSUxFIElOVEVSQUNUSU9OIENPTk5FQ1QgQlVGRkVSCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK3N0YXRpYyB2b2lkIGJ1ZmZlckNvbXBsZXRpb24oCisJCUxpc3Q8IFJvdXRpbmdEYXRhID4gJiBsaXN0T2ZPdXRSb3V0aW5nRGF0YSwKKwkJTGlzdDwgUm91dGluZ0RhdGEgPiAmIGxpc3RPZkluUm91dGluZ0RhdGEpCit7CisJTGlzdDwgUm91dGluZ0RhdGEgPjo6aXRlcmF0b3IgaW5SRDsKKwlMaXN0PCBSb3V0aW5nRGF0YSA+OjppdGVyYXRvciBvdXRSRDsKKworCWJvb2wgaGFzbnRCdWZmZXI7CisKKwlpblJEID0gbGlzdE9mSW5Sb3V0aW5nRGF0YS5iZWdpbigpOworCWZvciggOyBpblJEICE9IGxpc3RPZkluUm91dGluZ0RhdGEuZW5kKCkgOyArK2luUkQgKQorCXsKKwkJaGFzbnRCdWZmZXIgPSBpblJELT5nZXRCdWZmZXJJbnN0YW5jZSgpLmVtcHR5KCk7CisKKwkJb3V0UkQgPSBsaXN0T2ZPdXRSb3V0aW5nRGF0YS5iZWdpbigpOworCQlmb3IoIDsgb3V0UkQgIT0gbGlzdE9mT3V0Um91dGluZ0RhdGEuZW5kKCkgOyArK291dFJEICkKKwkJeworCQkJaWYoIGhhc250QnVmZmVyICYmIG91dFJELT5nZXRCdWZmZXJJbnN0YW5jZSgpLm5vbmVtcHR5KCkgKQorCQkJeworCQkJCWluUkQtPmdldEJ1ZmZlckluc3RhbmNlKCkuYXBwZW5kKAorCQkJCQkJb3V0UkQtPmdldEJ1ZmZlckluc3RhbmNlKCkgKTsKKwkJCX0KKwkJfQorCisJCWluUkQtPmdldEJ1ZmZlckluc3RhbmNlKCkubWFrZVVuaXF1ZSgpOworCX0KKworCW91dFJEID0gbGlzdE9mT3V0Um91dGluZ0RhdGEuYmVnaW4oKTsKKwlmb3IoIDsgb3V0UkQgIT0gbGlzdE9mT3V0Um91dGluZ0RhdGEuZW5kKCkgOyArK291dFJEICkKKwl7CisJCWhhc250QnVmZmVyID0gKG91dFJEKS0+Z2V0QnVmZmVySW5zdGFuY2UoKS5lbXB0eSgpOworCisJCWluUkQgPSBsaXN0T2ZJblJvdXRpbmdEYXRhLmJlZ2luKCk7CisJCWZvciggOyBpblJEICE9IGxpc3RPZkluUm91dGluZ0RhdGEuZW5kKCkgOyArK2luUkQgKQorCQl7CisJCQlpZiggaGFzbnRCdWZmZXIgJiYgKGluUkQpLT5nZXRCdWZmZXJJbnN0YW5jZSgpLm5vbmVtcHR5KCkgKQorCQkJeworCQkJCShvdXRSRCktPmdldEJ1ZmZlckluc3RhbmNlKCkuYXBwZW5kKAorCQkJCQkJKGluUkQpLT5nZXRCdWZmZXJJbnN0YW5jZSgpICk7CisJCQl9CisJCX0KKworCQkob3V0UkQpLT5nZXRCdWZmZXJJbnN0YW5jZSgpLm1ha2VVbmlxdWUoKTsKKwl9Cit9CisKKwordm9pZCBDb21waWxlck9mSW50ZXJhY3Rpb246OmNvbXBpbGVDb25uZWN0b3JCdWZmZXIoCisJCUV4ZWN1dGFibGVGb3JtICogdGhlRXhlY3V0YWJsZSwgSW5zdGFuY2VPZkNvbm5lY3QgKiBpb2MpCit7CisJY29uc3QgQ29ubmVjdG9yICogYUNvbm5lY3RvciA9IGlvYy0+Z2V0QXN0Q29ubmVjdG9yKCk7CisKK0FWTV9JRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgQ09NTVVOSUNBVElPTiApCisJQVZNX09TX1RSQUNFIDw8IElOQ1JfSU5ERU5UX1RBQgorCQkJPDwgIkNPTVBJTEUgSU5URVJBQ1RJT04gQ09OTkVDVCBCVUZGRVIiIDw8IHN0ZDo6ZW5kbDsKKwlhQ29ubmVjdG9yLT50b1N0cmVhbShBVk1fT1NfVFJBQ0UpOworCUFWTV9PU19UUkFDRSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRzIoIENPTVBJTElORyAsIENPTU1VTklDQVRJT04gKQorCisJQnVmZmVyICogYnVmZmVyID0gTlVMTDsKKwlJbnN0YW5jZU9mQnVmZmVyICogdGhlQnVmZmVySW5zdGFuY2UgPSBOVUxMOworCUluc3RhbmNlT2ZCdWZmZXIgKiBsb2NhbEJ1ZmZlckluc3RhbmNlID0gTlVMTDsKKworCWlmKCBhQ29ubmVjdG9yLT5oYXNCdWZmZXIoKSApCisJeworCQlidWZmZXIgPSBhQ29ubmVjdG9yLT5nZXRCdWZmZXIoKTsKKworCQlpZiggYnVmZmVyLT5pc0Fub255bUlEKCkgKQorCQl7CisJCQl0aGVCdWZmZXJJbnN0YW5jZSA9IG5ldyBJbnN0YW5jZU9mQnVmZmVyKHRoZUV4ZWN1dGFibGUsCisJCQkJCWJ1ZmZlciwgdGhlRXhlY3V0YWJsZS0+Z2V0QnVmZmVyKCkuc2l6ZSgpICk7CisKKwkJCWdldFN5bWJvbFRhYmxlKCkuYWRkQnVmZmVySW5zdGFuY2UoCisJCQkJCXRoZUV4ZWN1dGFibGUtPnNhdmVCdWZmZXIodGhlQnVmZmVySW5zdGFuY2UpICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQl0aGVCdWZmZXJJbnN0YW5jZSA9IGdldFN5bWJvbFRhYmxlKCkuc2VhcmNoQnVmZmVySW5zdGFuY2UoCisJCQkJCXRoZUV4ZWN1dGFibGUsIGJ1ZmZlcikucmF3QnVmZmVyKCk7CisJCX0KKwl9CisJZWxzZSBpZiggYUNvbm5lY3Rvci0+aGFzQnVmZmVyVWZpZCgpICkKKwl7CisJCXRoZUJ1ZmZlckluc3RhbmNlID0KKwkJCQlnZXRTeW1ib2xUYWJsZSgpLnNlYXJjaEJ1ZmZlckluc3RhbmNlQnlRdWFsaWZpZWROYW1lSUQoCisJCQkJCXRoZUV4ZWN1dGFibGUsIGFDb25uZWN0b3ItPnN0ckJ1ZmZlclVmaWQoKSkucmF3QnVmZmVyKCk7CisKKwkJaWYoIHRoZUJ1ZmZlckluc3RhbmNlID09IE5VTEwgKQorCQl7CisJCQlpbmNyRXJyb3JDb3VudCgpOworCQkJYUNvbm5lY3Rvci0+ZXJyb3JMb2NhdGlvbihBVk1fT1NfV0FSTikKKwkJCQkJPDwgIlVuZm91bmQgaW4gdGhlIENPTSBQT0lOVCB0aGUgYnVmZmVyIGluc3RhbmNlIDwgIgorCQkJCQk8PCBhQ29ubmVjdG9yLT5zdHJCdWZmZXJVZmlkKCkgPDwgIiA+ICEiIDw8IHN0ZDo6ZW5kbDsKKwkJfQorCX0KKwllbHNlIC8vaWYoIGJ1ZmZlciA9PSBOVUxMICkKKwl7CisJCXRoZUJ1ZmZlckluc3RhbmNlID0gbmV3IEluc3RhbmNlT2ZCdWZmZXIoCisJCQkJdGhlRXhlY3V0YWJsZSwJTlVMTCwgdGhlRXhlY3V0YWJsZS0+Z2V0QnVmZmVyKCkuc2l6ZSgpLAorCQkJCVRZUEVfRklGT19TUEVDSUZJRVIsIC0xICk7CisKKwkJZ2V0U3ltYm9sVGFibGUoKS5hZGRCdWZmZXJJbnN0YW5jZSgKKwkJCQl0aGVFeGVjdXRhYmxlLT5zYXZlQnVmZmVyKHRoZUJ1ZmZlckluc3RhbmNlKSApOworCX0KKworCS8vIGxpc3RzIGZvciB1cGRhdGUgaW5wdXQgcG9ydCBjb25uZWN0b3IgbGlzdAorCUxpc3Q8IFJvdXRpbmdEYXRhID4gbGlzdE9mT3V0Um91dGluZ0RhdGE7CisJTGlzdDwgUm91dGluZ0RhdGEgPiBsaXN0T2ZJblJvdXRpbmdEYXRhOworCisJQkZMaXN0Ojpjb25zdF9yYXdfaXRlcmF0b3I8IENvbVBvaW50ID4gaXRDb21Qb2ludDsKKwlCRkxpc3Q6OmNvbnN0X3Jhd19pdGVyYXRvcjwgQ29tUG9pbnQgPiBlbmRJdENvbVBvaW50OworCisJTGlzdDwgUm91dGluZ0RhdGEgPiBsaXN0T2ZSb3V0aW5nRGF0YTsKKwlSb3V0aW5nRGF0YSB0aGVSb3V0aW5nRGF0YTsKKworCS8vIFJvdXRpbmcgZm9yIGFsbCBwb3J0CisJQ29ubmVjdG9yOjpyb3V0ZV9pdGVyYXRvciBpdENvbVJvdXRlID0gYUNvbm5lY3Rvci0+YmVnaW4oKTsKKwlDb25uZWN0b3I6OnJvdXRlX2l0ZXJhdG9yIGVuZEl0Q29tUm91dGUgPSBhQ29ubmVjdG9yLT5lbmQoKTsKKwlmb3IoIDsgaXRDb21Sb3V0ZSAhPSBlbmRJdENvbVJvdXRlIDsgKytpdENvbVJvdXRlICkKKwl7CisJCWl0Q29tUG9pbnQgPSAoKml0Q29tUm91dGUpLT5nZXRDb21Qb2ludHMoKS5iZWdpbigpOworCQllbmRJdENvbVBvaW50ID0gKCppdENvbVJvdXRlKS0+Z2V0Q29tUG9pbnRzKCkuZW5kKCk7CisJCWZvciggOyBpdENvbVBvaW50ICE9IGVuZEl0Q29tUG9pbnQgOyArK2l0Q29tUG9pbnQgKQorCQl7CisJCQljcmVhdGVSb3V0aW5nRGF0YShsaXN0T2ZSb3V0aW5nRGF0YSwgdGhlRXhlY3V0YWJsZSwKKwkJCQkJaW9jLCAoKml0Q29tUm91dGUpLCAoaXRDb21Qb2ludCkpOworCisJCQl3aGlsZSggbGlzdE9mUm91dGluZ0RhdGEubm9uZW1wdHkoKSApCisJCQl7CisJCQkJbGlzdE9mUm91dGluZ0RhdGEucG9wX2ZpcnN0X3RvKCB0aGVSb3V0aW5nRGF0YSApOworCisJCQkJaWYoIHRoZUJ1ZmZlckluc3RhbmNlICE9IE5VTEwgKQorCQkJCXsKKwkJCQkJLy8gZm9yIGJ1ZmZlciBwb3J0CisJCQkJCXRoZVJvdXRpbmdEYXRhLmFwcGVuZEJ1ZmZlcih0aGVCdWZmZXJJbnN0YW5jZSk7CisJCQkJfQorCisJCQkJLy8gZm9yIGJ1ZmZlciBwb3J0CisJCQkJaWYoIG5vdCAoKml0Q29tUm91dGUpLT5oYXNQcm90b2NvbCgpICkKKwkJCQl7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCXN3aXRjaCggKCppdENvbVJvdXRlKS0+Z2V0UHJvdG9jb2woKSApCisJCQkJeworCQkJCQljYXNlIENvbVByb3RvY29sOjpQUk9UT0NPTF9CVUZGRVJfS0lORDoKKwkJCQkJeworCQkJCQkJbG9jYWxCdWZmZXJJbnN0YW5jZSA9IHRoZUJ1ZmZlckluc3RhbmNlOworCisJCQkJCQlpZiggKCppdENvbVJvdXRlKS0+aGFzQnVmZmVyKCkgKQorCQkJCQkJeworCQkJCQkJCWJ1ZmZlciA9ICgqaXRDb21Sb3V0ZSktPmdldEJ1ZmZlcigpOworCQkJCQkJCWlmKCBidWZmZXItPmlzQW5vbnltSUQoKSApCisJCQkJCQkJeworCQkJCQkJCQlsb2NhbEJ1ZmZlckluc3RhbmNlID0gbmV3IEluc3RhbmNlT2ZCdWZmZXIoCisJCQkJCQkJCQkJdGhlRXhlY3V0YWJsZSwgYnVmZmVyLAorCQkJCQkJCQkJCXRoZUV4ZWN1dGFibGUtPmdldEJ1ZmZlcigpLnNpemUoKSk7CisKKwkJCQkJCQkJZ2V0U3ltYm9sVGFibGUoKS5hZGRCdWZmZXJJbnN0YW5jZSgKKwkJCQkJCQkJCXRoZUV4ZWN1dGFibGUtPnNhdmVCdWZmZXIoCisJCQkJCQkJCQkJCWxvY2FsQnVmZmVySW5zdGFuY2UpICk7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCWxvY2FsQnVmZmVySW5zdGFuY2UgPSBnZXRTeW1ib2xUYWJsZSgpLgorCQkJCQkJCQkJc2VhcmNoQnVmZmVySW5zdGFuY2UoCisJCQkJCQkJCQkJdGhlRXhlY3V0YWJsZSwgYnVmZmVyKS5yYXdCdWZmZXIoKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQllbHNlIGlmKCAoKml0Q29tUm91dGUpLT5oYXNCdWZmZXJVZmlkKCkgKQorCQkJCQkJeworCQkJCQkJCWxvY2FsQnVmZmVySW5zdGFuY2UgPSBnZXRTeW1ib2xUYWJsZSgpLgorCQkJCQkJCQlzZWFyY2hCdWZmZXJJbnN0YW5jZUJ5UXVhbGlmaWVkTmFtZUlEKAorCQkJCQkJCQkJdGhlRXhlY3V0YWJsZSwKKwkJCQkJCQkJCSgqaXRDb21Sb3V0ZSktPnN0ckJ1ZmZlclVmaWQoKSkucmF3QnVmZmVyKCk7CisKKwkJCQkJCQlpZiggbG9jYWxCdWZmZXJJbnN0YW5jZSA9PSBOVUxMICkKKwkJCQkJCQl7CisJCQkJCQkJCWluY3JFcnJvckNvdW50KCk7CisJCQkJCQkJCWFDb25uZWN0b3ItPmVycm9yTG9jYXRpb24oQVZNX09TX1dBUk4pCisJCQkJCQkJCQkJPDwgIlVuZm91bmQgaW4gdGhlIENPTSBQT0lOVCAiCisJCQkJCQkJCQkJCQkidGhlIGJ1ZmZlciBpbnN0YW5jZSA8ICIKKwkJCQkJCQkJCQk8PCBhQ29ubmVjdG9yLT5zdHJCdWZmZXJVZmlkKCkgPDwgIiA+ICEiCisJCQkJCQkJCQkJPDwgc3RkOjplbmRsOworCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQkJaWYoIGxvY2FsQnVmZmVySW5zdGFuY2UgIT0gTlVMTCApCisJCQkJCQl7CisJCQkJCQkJdGhlUm91dGluZ0RhdGEuYXBwZW5kQnVmZmVyKGxvY2FsQnVmZmVySW5zdGFuY2UpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCS8vIFRPRE8gZm9yIG90aGVyIEVSUk9SCisJCQkJCQl9CisKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJZGVmYXVsdDoKKwkJCQkJeworCQkJCQkJLy8gVE9ETyBmb3Igb3RoZXIgQ09NX1BST1RPQ09MCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKworCQkJCS8vIGxpc3QgZm9yIHVwZGF0ZSBhbGwgYnVmZmVyIGFuZCBwb3J0IGNvbm5lY3RvciBsaXN0CisJCQkJaWYoICgqaXRDb21Sb3V0ZSktPmdldE1vZGlmaWVyKCkuaXNEaXJlY3Rpb25PdXRwdXQoKSApCisJCQkJeworCQkJCQlsaXN0T2ZPdXRSb3V0aW5nRGF0YS5hcHBlbmQodGhlUm91dGluZ0RhdGEpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlsaXN0T2ZJblJvdXRpbmdEYXRhLmFwcGVuZCh0aGVSb3V0aW5nRGF0YSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisKKwkvLyBidWZmZXIgY29tcGxldGlvbgorCWJ1ZmZlckNvbXBsZXRpb24obGlzdE9mT3V0Um91dGluZ0RhdGEsIGxpc3RPZkluUm91dGluZ0RhdGEpOworCisKK0FWTV9JRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgQ09NTVVOSUNBVElPTiApCisJaW9jLT50b1N0cmVhbShBVk1fT1NfVFJBQ0UpOworCUFWTV9PU19UUkFDRSA8PCBUQUJfREVDUl9JTkRFTlQKKwkJCTw8ICJFTkQgQ09NUElMRSBJTlRFUkFDVElPTiBDT05ORUNUIEJVRkZFUiIKKwkJCTw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRzIoIENPTVBJTElORyAsIENPTU1VTklDQVRJT04gKQorfQorCisKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDT01QSUxFIElOVEVSQUNUSU9OIENPTk5FQ1QgUk9VVElORyBDQVNUCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCit2b2lkIENvbXBpbGVyT2ZJbnRlcmFjdGlvbjo6Y29tcGlsZUNvbm5lY3RvclJvdXRpbmdDYXN0KAorCQlFeGVjdXRhYmxlRm9ybSAqIHRoZUV4ZWN1dGFibGUsIEluc3RhbmNlT2ZDb25uZWN0ICogaW9jKQoreworCWNvbnN0IENvbm5lY3RvciAqIGFDb25uZWN0b3IgPSBpb2MtPmdldEFzdENvbm5lY3RvcigpOworCitBVk1fSUZfREVCVUdfRkxBRzIoIENPTVBJTElORyAsIENPTU1VTklDQVRJT04gKQorCUFWTV9PU19UUkFDRSA8PCBJTkNSX0lOREVOVF9UQUIKKwkJCTw8ICJDT01QSUxFIElOVEVSQUNUSU9OIENPTk5FQ1QgUk9VVElORyBDQVNUIiA8PCBzdGQ6OmVuZGw7CisJYUNvbm5lY3Rvci0+dG9TdHJlYW0oQVZNX09TX1RSQUNFKTsKKwlBVk1fT1NfVFJBQ0UgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBDT01NVU5JQ0FUSU9OICkKKworCUJ1ZmZlciAqIGJ1ZmZlciA9IE5VTEw7CisJSW5zdGFuY2VPZkJ1ZmZlciAqIHRoZUJ1ZmZlckluc3RhbmNlID0gTlVMTDsKKworCS8vIGxpc3RzIGZvciB1cGRhdGUgaW5wdXQgcG9ydCBjb25uZWN0b3IgbGlzdAorCUxpc3Q8IFJvdXRpbmdEYXRhID4gbGlzdE9mT3V0Um91dGluZ0RhdGE7CisJTGlzdDwgUm91dGluZ0RhdGEgPiBsaXN0T2ZJblJvdXRpbmdEYXRhOworCisJQkZMaXN0Ojpjb25zdF9yYXdfaXRlcmF0b3I8IENvbVBvaW50ID4gaXRDb21Qb2ludDsKKwlCRkxpc3Q6OmNvbnN0X3Jhd19pdGVyYXRvcjwgQ29tUG9pbnQgPiBlbmRJdENvbVBvaW50OworCisJTGlzdDwgUm91dGluZ0RhdGEgPiBsaXN0T2ZSb3V0aW5nRGF0YTsKKwlSb3V0aW5nRGF0YSB0aGVSb3V0aW5nRGF0YTsKKworCS8vIFJvdXRpbmcgZm9yIGFsbCBwb3J0CisJQ29ubmVjdG9yOjpyb3V0ZV9pdGVyYXRvciBpdENvbVJvdXRlID0gYUNvbm5lY3Rvci0+YmVnaW4oKTsKKwlDb25uZWN0b3I6OnJvdXRlX2l0ZXJhdG9yIGVuZEl0Q29tUm91dGUgPSBhQ29ubmVjdG9yLT5lbmQoKTsKKwlmb3IoIDsgaXRDb21Sb3V0ZSAhPSBlbmRJdENvbVJvdXRlIDsgKytpdENvbVJvdXRlICkKKwl7CisJCWl0Q29tUG9pbnQgPSAoKml0Q29tUm91dGUpLT5nZXRDb21Qb2ludHMoKS5iZWdpbigpOworCQllbmRJdENvbVBvaW50ID0gKCppdENvbVJvdXRlKS0+Z2V0Q29tUG9pbnRzKCkuZW5kKCk7CisJCWZvciggOyBpdENvbVBvaW50ICE9IGVuZEl0Q29tUG9pbnQgOyArK2l0Q29tUG9pbnQgKQorCQl7CisJCQljcmVhdGVSb3V0aW5nRGF0YShsaXN0T2ZSb3V0aW5nRGF0YSwgdGhlRXhlY3V0YWJsZSwKKwkJCQkJaW9jLCAoKml0Q29tUm91dGUpLCAoaXRDb21Qb2ludCkpOworCisJCQl3aGlsZSggbGlzdE9mUm91dGluZ0RhdGEubm9uZW1wdHkoKSApCisJCQl7CisJCQkJbGlzdE9mUm91dGluZ0RhdGEucG9wX2ZpcnN0X3RvKCB0aGVSb3V0aW5nRGF0YSApOworCisJCQkJLy8gbGlzdCBmb3IgdXBkYXRlIGlucHV0IGJ1ZmZlciBhbmQgcG9ydCBjb25uZWN0b3IgbGlzdAorCQkJCWxpc3RPZk91dFJvdXRpbmdEYXRhLmFwcGVuZCh0aGVSb3V0aW5nRGF0YSk7CisKKwkJCQkvLyBmb3IgYnVmZmVyIHBvcnQKKwkJCQlpZiggbm90ICgqaXRDb21Sb3V0ZSktPmhhc1Byb3RvY29sKCkgKQorCQkJCXsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJc3dpdGNoKCAoKml0Q29tUm91dGUpLT5nZXRQcm90b2NvbCgpICkKKwkJCQl7CisJCQkJCWNhc2UgQ29tUHJvdG9jb2w6OlBST1RPQ09MX0JVRkZFUl9LSU5EOgorCQkJCQl7CisJCQkJCQlpZiggKCppdENvbVJvdXRlKS0+aGFzQnVmZmVyKCkgKQorCQkJCQkJeworCQkJCQkJCWJ1ZmZlciA9ICgqaXRDb21Sb3V0ZSktPmdldEJ1ZmZlcigpOworCQkJCQkJCWlmKCBidWZmZXItPmlzQW5vbnltSUQoKSApCisJCQkJCQkJeworCQkJCQkJCQl0aGVCdWZmZXJJbnN0YW5jZSA9IG5ldyBJbnN0YW5jZU9mQnVmZmVyKAorCQkJCQkJCQkJCXRoZUV4ZWN1dGFibGUsIGJ1ZmZlciwKKwkJCQkJCQkJCQl0aGVFeGVjdXRhYmxlLT5nZXRCdWZmZXIoKS5zaXplKCkpOworCisJCQkJCQkJCWdldFN5bWJvbFRhYmxlKCkuYWRkQnVmZmVySW5zdGFuY2UoCisJCQkJCQkJCQkJdGhlRXhlY3V0YWJsZS0+c2F2ZUJ1ZmZlcigKKwkJCQkJCQkJCQkJCXRoZUJ1ZmZlckluc3RhbmNlKSApOworCQkJCQkJCX0KKwkJCQkJCQllbHNlCisJCQkJCQkJeworCQkJCQkJCQl0aGVCdWZmZXJJbnN0YW5jZSA9IGdldFN5bWJvbFRhYmxlKCkuCisJCQkJCQkJCQlzZWFyY2hCdWZmZXJJbnN0YW5jZSgKKwkJCQkJCQkJCQkJdGhlRXhlY3V0YWJsZSwgYnVmZmVyKS5yYXdCdWZmZXIoKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQllbHNlIGlmKCAoKml0Q29tUm91dGUpLT5oYXNCdWZmZXJVZmlkKCkgKQorCQkJCQkJeworCQkJCQkJCXRoZUJ1ZmZlckluc3RhbmNlID0gZ2V0U3ltYm9sVGFibGUoKS4KKwkJCQkJCQkJc2VhcmNoQnVmZmVySW5zdGFuY2UodGhlRXhlY3V0YWJsZSwKKwkJCQkJCQkJCSgqaXRDb21Sb3V0ZSktPnN0ckJ1ZmZlclVmaWQoKSkucmF3QnVmZmVyKCk7CisKKwkJCQkJCQlpZiggdGhlQnVmZmVySW5zdGFuY2UgPT0gTlVMTCApCisJCQkJCQkJeworCQkJCQkJCQlpbmNyRXJyb3JDb3VudCgpOworCQkJCQkJCQlhQ29ubmVjdG9yLT5lcnJvckxvY2F0aW9uKEFWTV9PU19XQVJOKQorCQkJCQkJCQkJCTw8ICJVbmZvdW5kIGluIHRoZSBDT00gUE9JTlQgIgorCQkJCQkJCQkJCQkJInRoZSBidWZmZXIgaW5zdGFuY2UgPCAiCisJCQkJCQkJCQkJPDwgKCppdENvbVJvdXRlKS0+c3RyQnVmZmVyVWZpZCgpCisJCQkJCQkJCQkJPDwgIiA+ICEiIDw8IHN0ZDo6ZW5kbDsKKwkJCQkJCQl9CisJCQkJCQl9CisKKwkJCQkJCWlmKCB0aGVCdWZmZXJJbnN0YW5jZSAhPSBOVUxMICkKKwkJCQkJCXsKKwkJCQkJCQl0aGVSb3V0aW5nRGF0YS5hcHBlbmRCdWZmZXIodGhlQnVmZmVySW5zdGFuY2UpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCS8vIFRPRE8gZm9yIG90aGVyIEVSUk9SCisJCQkJCQl9CisKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfTVVMVElDQVNUX0tJTkQ6CisJCQkJCXsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWNhc2UgQ29tUHJvdG9jb2w6OlBST1RPQ09MX1VOSUNBU1RfS0lORDoKKwkJCQkJeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfQU5ZQ0FTVF9LSU5EOgorCQkJCQl7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlkZWZhdWx0OgorCQkJCQl7CisJCQkJCQkvLyBUT0RPIGZvciBvdGhlciBDT01fUFJPVE9DT0wKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCisJCQkJLy8gbGlzdCBmb3IgdXBkYXRlIGFsbCBidWZmZXIgYW5kIHBvcnQgY29ubmVjdG9yIGxpc3QKKwkJCQlpZiggKCppdENvbVJvdXRlKS0+Z2V0TW9kaWZpZXIoKS5pc0RpcmVjdGlvbk91dHB1dCgpICkKKwkJCQl7CisJCQkJCWxpc3RPZk91dFJvdXRpbmdEYXRhLmFwcGVuZCh0aGVSb3V0aW5nRGF0YSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWxpc3RPZkluUm91dGluZ0RhdGEuYXBwZW5kKHRoZVJvdXRpbmdEYXRhKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKworCS8vIGJ1ZmZlciBjb21wbGV0aW9uCisJYnVmZmVyQ29tcGxldGlvbihsaXN0T2ZPdXRSb3V0aW5nRGF0YSwgbGlzdE9mSW5Sb3V0aW5nRGF0YSk7CisKKworQVZNX0lGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBDT01NVU5JQ0FUSU9OICkKKwlBVk1fT1NfVFJBQ0UgPDwgVEFCX0RFQ1JfSU5ERU5UCisJPDwgIkVORCBDT01QSUxFIElOVEVSQUNUSU9OIENPTk5FQ1QgUk9VVElORyBDQVNUIgorCQkJPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgQ09NTVVOSUNBVElPTiApCit9CisKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDT01QSUxFIElOVEVSQUNUSU9OIENPTk5FQ1QgU1lOQ0hST05PVVMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3ZvaWQgQ29tcGlsZXJPZkludGVyYWN0aW9uOjpjb21waWxlQ29ubmVjdG9yU3luY2hyb25vdXMoCisJCUV4ZWN1dGFibGVGb3JtICogdGhlRXhlY3V0YWJsZSwgSW5zdGFuY2VPZkNvbm5lY3QgKiBpb2MpCit7CisJY29uc3QgQ29ubmVjdG9yICogYUNvbm5lY3RvciA9IGlvYy0+Z2V0QXN0Q29ubmVjdG9yKCk7CisKK0FWTV9JRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgQ09NTVVOSUNBVElPTiApCisJQVZNX09TX1RSQUNFIDw8IElOQ1JfSU5ERU5UX1RBQgorCQkJPDwgIkNPTVBJTEUgSU5URVJBQ1RJT04gQ09OTkVDVCBTWU5DSFJPTk9VUyIKKwkJCTw8IHN0ZDo6ZW5kbDsKKwlhQ29ubmVjdG9yLT50b1N0cmVhbShBVk1fT1NfVFJBQ0UpOworCUFWTV9PU19UUkFDRSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRzIoIENPTVBJTElORyAsIENPTU1VTklDQVRJT04gKQorCisJQkZMaXN0Ojpjb25zdF9yYXdfaXRlcmF0b3I8IENvbVBvaW50ID4gaXRDb21Qb2ludDsKKwlCRkxpc3Q6OmNvbnN0X3Jhd19pdGVyYXRvcjwgQ29tUG9pbnQgPiBlbmRJdENvbVBvaW50OworCisJTGlzdDwgUm91dGluZ0RhdGEgPiBsaXN0T2ZSb3V0aW5nRGF0YTsKKworCS8vIFJvdXRpbmcgZm9yIGFsbCBwb3J0CisJQ29ubmVjdG9yOjpyb3V0ZV9pdGVyYXRvciBpdENvbVJvdXRlID0gYUNvbm5lY3Rvci0+YmVnaW4oKTsKKwlDb25uZWN0b3I6OnJvdXRlX2l0ZXJhdG9yIGVuZEl0Q29tUm91dGUgPSBhQ29ubmVjdG9yLT5lbmQoKTsKKwlmb3IoIDsgaXRDb21Sb3V0ZSAhPSBlbmRJdENvbVJvdXRlIDsgKytpdENvbVJvdXRlICkKKwl7CisJCWlmKCAoKml0Q29tUm91dGUpLT5oYXNDYXN0KCkgKQorCQl7CisJCQlpZiggKCppdENvbVJvdXRlKS0+Z2V0TW9kaWZpZXIoKS5pc0RpcmVjdGlvbk91dHB1dCgpICkKKwkJCXsKKwkJCQlpb2MtPmdldE91dHB1dENvbVJvdXRlRGF0YSgpLnNldENhc3QoKCppdENvbVJvdXRlKS0+Z2V0Q2FzdCgpKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpb2MtPmdldElucHV0Q29tUm91dGVEYXRhKCkuc2V0Q2FzdCgoKml0Q29tUm91dGUpLT5nZXRDYXN0KCkpOworCQkJfQorCQl9CisKKwkJaXRDb21Qb2ludCA9ICgqaXRDb21Sb3V0ZSktPmdldENvbVBvaW50cygpLmJlZ2luKCk7CisJCWVuZEl0Q29tUG9pbnQgPSAoKml0Q29tUm91dGUpLT5nZXRDb21Qb2ludHMoKS5lbmQoKTsKKwkJZm9yKCA7IGl0Q29tUG9pbnQgIT0gZW5kSXRDb21Qb2ludCA7ICsraXRDb21Qb2ludCApCisJCXsKKwkJCWNyZWF0ZVJvdXRpbmdEYXRhKGxpc3RPZlJvdXRpbmdEYXRhLCB0aGVFeGVjdXRhYmxlLAorCQkJCQlpb2MsICgqaXRDb21Sb3V0ZSksIChpdENvbVBvaW50KSk7CisKKwkJCWlmKCAoKml0Q29tUm91dGUpLT5oYXNQcm90b2NvbCgpICkKKwkJCXsKKwkJCQkvLyBUT0RPIGZvciBvdGhlciBDT01fUFJPVE9DT0wKKwkJCX0KKwkJfQorCX0KKworCWlmKCBpb2MtPmdldFByb3RvY29sKCkgPT0gQ29tUHJvdG9jb2w6OlBST1RPQ09MX01VTFRJUkRWX0tJTkQgKQorCXsKKwkJaWYoIChub3QgaW9jLT5nZXRPdXRwdXRDb21Sb3V0ZURhdGEoKS5oYXNDYXN0KCkpICYmCisJCQkJaW9jLT5nZXRPdXRwdXRDb21Sb3V0ZURhdGEoKS5nZXRNYWNoaW5lUG9ydHMoKS5zaW5nbGV0b24oKSApCisJCXsKKwkJCWlvYy0+Z2V0T3V0cHV0Q29tUm91dGVEYXRhKCkuc2V0Q2FzdCgKKwkJCQkJQ29tUHJvdG9jb2w6OlBST1RPQ09MX1VOSUNBU1RfS0lORCApOworCQl9CisKKwkJaWYoIChub3QgaW9jLT5nZXRJbnB1dENvbVJvdXRlRGF0YSgpLmhhc0Nhc3QoKSkgJiYKKwkJCQlpb2MtPmdldElucHV0Q29tUm91dGVEYXRhKCkuZ2V0TWFjaGluZVBvcnRzKCkuc2luZ2xldG9uKCkgKQorCQl7CisJCQlpb2MtPmdldElucHV0Q29tUm91dGVEYXRhKCkuc2V0Q2FzdCgKKwkJCQkJQ29tUHJvdG9jb2w6OlBST1RPQ09MX1VOSUNBU1RfS0lORCApOworCQl9CisJfQorCisKK0FWTV9JRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgQ09NTVVOSUNBVElPTiApCisJaW9jLT50b1N0cmVhbShBVk1fT1NfVFJBQ0UpOworCUFWTV9PU19UUkFDRSA8PCBUQUJfREVDUl9JTkRFTlQKKwkJCTw8ICJFTkQgQ09NUElMRSBJTlRFUkFDVElPTiBDT05ORUNUIFNZTkNIUk9OT1VTIgorCQkJPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgQ09NTVVOSUNBVElPTiApCit9CisKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDT01QSUxFIElOVEVSQUNUSU9OIENPTk5FQ1QgRkxPVworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLwordm9pZCBDb21waWxlck9mSW50ZXJhY3Rpb246OmNvbXBpbGVDb25uZWN0b3JGbG93KAorCQlFeGVjdXRhYmxlRm9ybSAqIHRoZUV4ZWN1dGFibGUsIEluc3RhbmNlT2ZDb25uZWN0ICogaW9jKQoreworCWNvbnN0IENvbm5lY3RvciAqIGFDb25uZWN0b3IgPSBpb2MtPmdldEFzdENvbm5lY3RvcigpOworCitBVk1fSUZfREVCVUdfRkxBRzIoIENPTVBJTElORyAsIENPTU1VTklDQVRJT04gKQorCUFWTV9PU19UUkFDRSA8PCBJTkNSX0lOREVOVF9UQUIKKwkJCTw8ICJDT01QSUxFIElOVEVSQUNUSU9OIENPTk5FQ1QgRkxPVyIKKwkJCTw8IHN0ZDo6ZW5kbDsKKwlhQ29ubmVjdG9yLT50b1N0cmVhbShBVk1fT1NfVFJBQ0UpOworCUFWTV9PU19UUkFDRSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRzIoIENPTVBJTElORyAsIENPTU1VTklDQVRJT04gKQorCisJQkZMaXN0Ojpjb25zdF9yYXdfaXRlcmF0b3I8IENvbVBvaW50ID4gaXRDb21Qb2ludDsKKwlCRkxpc3Q6OmNvbnN0X3Jhd19pdGVyYXRvcjwgQ29tUG9pbnQgPiBlbmRJdENvbVBvaW50OworCisJTGlzdDwgUm91dGluZ0RhdGEgPiBsaXN0T2ZSb3V0aW5nRGF0YTsKKworCS8vIFJvdXRpbmcgZm9yIGFsbCBwb3J0CisJQ29ubmVjdG9yOjpyb3V0ZV9pdGVyYXRvciBpdENvbVJvdXRlID0gYUNvbm5lY3Rvci0+YmVnaW4oKTsKKwlDb25uZWN0b3I6OnJvdXRlX2l0ZXJhdG9yIGVuZEl0Q29tUm91dGUgPSBhQ29ubmVjdG9yLT5lbmQoKTsKKwlmb3IoIDsgaXRDb21Sb3V0ZSAhPSBlbmRJdENvbVJvdXRlIDsgKytpdENvbVJvdXRlICkKKwl7CisJCWl0Q29tUG9pbnQgPSAoKml0Q29tUm91dGUpLT5nZXRDb21Qb2ludHMoKS5iZWdpbigpOworCQllbmRJdENvbVBvaW50ID0gKCppdENvbVJvdXRlKS0+Z2V0Q29tUG9pbnRzKCkuZW5kKCk7CisJCWZvciggOyBpdENvbVBvaW50ICE9IGVuZEl0Q29tUG9pbnQgOyArK2l0Q29tUG9pbnQgKQorCQl7CisJCQljcmVhdGVSb3V0aW5nRGF0YShsaXN0T2ZSb3V0aW5nRGF0YSwgdGhlRXhlY3V0YWJsZSwKKwkJCQkJaW9jLCAoKml0Q29tUm91dGUpLCAoaXRDb21Qb2ludCkpOworCisJCQlpZiggKCppdENvbVJvdXRlKS0+aGFzUHJvdG9jb2woKSApCisJCQl7CisJCQkJLy8gVE9ETyBmb3Igb3RoZXIgQ09NX1BST1RPQ09MCisJCQl9CisJCX0KKwl9CisKKworQVZNX0lGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBDT01NVU5JQ0FUSU9OICkKKwlpb2MtPnRvU3RyZWFtKEFWTV9PU19UUkFDRSk7CisJQVZNX09TX1RSQUNFIDw8IFRBQl9ERUNSX0lOREVOVAorCQkJPDwgIkVORCBDT01QSUxFIElOVEVSQUNUSU9OIENPTk5FQ1QgRkxPVyIKKwkJCTw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRzIoIENPTVBJTElORyAsIENPTU1VTklDQVRJT04gKQorfQorCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ09NUElMRSBJTlRFUkFDVElPTiBDT05ORUNUIFRSQU5TRkVSVAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLwordm9pZCBDb21waWxlck9mSW50ZXJhY3Rpb246OmNvbXBpbGVDb25uZWN0b3JUcmFuc2ZlcnQoCisJCUV4ZWN1dGFibGVGb3JtICogdGhlRXhlY3V0YWJsZSwgSW5zdGFuY2VPZkNvbm5lY3QgKiBpb2MpCit7CisJY29uc3QgQ29ubmVjdG9yICogYUNvbm5lY3RvciA9IGlvYy0+Z2V0QXN0Q29ubmVjdG9yKCk7CisKK0FWTV9JRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgQ09NTVVOSUNBVElPTiApCisJQVZNX09TX1RSQUNFIDw8IElOQ1JfSU5ERU5UX1RBQgorCQkJPDwgIkNPTVBJTEUgSU5URVJBQ1RJT04gQ09OTkVDVCBUUkFOU0ZFUlQiCisJCQk8PCBzdGQ6OmVuZGw7CisJYUNvbm5lY3Rvci0+dG9TdHJlYW0oQVZNX09TX1RSQUNFKTsKKwlBVk1fT1NfVFJBQ0UgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBDT01NVU5JQ0FUSU9OICkKKworCUJGTGlzdDo6Y29uc3RfcmF3X2l0ZXJhdG9yPCBDb21Qb2ludCA+IGl0Q29tUG9pbnQ7CisJQkZMaXN0Ojpjb25zdF9yYXdfaXRlcmF0b3I8IENvbVBvaW50ID4gZW5kSXRDb21Qb2ludDsKKworCUxpc3Q8IFJvdXRpbmdEYXRhID4gbGlzdE9mUm91dGluZ0RhdGE7CisvLwlSb3V0aW5nRGF0YSB0aGVSb3V0aW5nRGF0YTsKKworCS8vIFJvdXRpbmcgZm9yIGFsbCBwb3J0CisJQ29ubmVjdG9yOjpyb3V0ZV9pdGVyYXRvciBpdENvbVJvdXRlID0gYUNvbm5lY3Rvci0+YmVnaW4oKTsKKwlDb25uZWN0b3I6OnJvdXRlX2l0ZXJhdG9yIGVuZEl0Q29tUm91dGUgPSBhQ29ubmVjdG9yLT5lbmQoKTsKKwlmb3IoIDsgaXRDb21Sb3V0ZSAhPSBlbmRJdENvbVJvdXRlIDsgKytpdENvbVJvdXRlICkKKwl7CisJCWl0Q29tUG9pbnQgPSAoKml0Q29tUm91dGUpLT5nZXRDb21Qb2ludHMoKS5iZWdpbigpOworCQllbmRJdENvbVBvaW50ID0gKCppdENvbVJvdXRlKS0+Z2V0Q29tUG9pbnRzKCkuZW5kKCk7CisJCWZvciggOyBpdENvbVBvaW50ICE9IGVuZEl0Q29tUG9pbnQgOyArK2l0Q29tUG9pbnQgKQorCQl7CisJCQljcmVhdGVSb3V0aW5nRGF0YShsaXN0T2ZSb3V0aW5nRGF0YSwgdGhlRXhlY3V0YWJsZSwKKwkJCQkJaW9jLCAoKml0Q29tUm91dGUpLCAoaXRDb21Qb2ludCkpOworCisvLwkJCXdoaWxlKCBsaXN0T2ZSb3V0aW5nRGF0YS5ub25lbXB0eSgpICkKKy8vCQkJeworLy8JCQkJbGlzdE9mUm91dGluZ0RhdGEucG9wX2ZpcnN0X3RvKCB0aGVSb3V0aW5nRGF0YSApOworLy8KKy8vCQkJCWlmKCB0aGVSb3V0aW5nRGF0YS5nZXRDb21Qb2ludCgpLT5pczwgT3V0cHV0Q29tUG9pbnQgPigpICkKKy8vCQkJCXsKKy8vCQkJCQl0aGVFeGVjdXRhYmxlLT5nZXRSb3V0ZXI0SW5zdGFuY2UoCisvLwkJCQkJCXRoZUluc3RhbmNlU3RhdGljLT5nZXRPZmZzZXQoKSktPnNldE91dHB1dFJvdXRpbmcoCisvLwkJCQkJCQkJdGhlQ29tUG9pbnRJbnN0YW5jZSwgdGhlUm91dGluZ0RhdGEpOworLy8JCQkJCWlvYy0+Z2V0T3V0cHV0Q29tUm91dGVEYXRhKCkuYXBwZW5kTWFjaGluZUNvbVBvaW50KAorLy8JCQkJCQkJdGhlUm91dGluZ0RhdGEuZ2V0TWFjaGluZVBvcnQoKSApOworLy8JCQkJfQorLy8KKy8vCQkJCWlmKCB0aGVSb3V0aW5nRGF0YS5nZXRDb21Qb2ludCgpLT5pczwgSW5wdXRDb21Qb2ludCA+KCkgKQorLy8JCQkJeworLy8JCQkJCXRoZUV4ZWN1dGFibGUtPmdldFJvdXRlcjRJbnN0YW5jZSgKKy8vCQkJCQkJdGhlSW5zdGFuY2VTdGF0aWMtPmdldE9mZnNldCgpKS0+c2V0SW5wdXRSb3V0aW5nKAorLy8JCQkJCQkJCXRoZUNvbVBvaW50SW5zdGFuY2UsIHRoZVJvdXRpbmdEYXRhKTsKKy8vCQkJCQlpb2MtPmdldElucHV0Q29tUm91dGVEYXRhKCkuYXBwZW5kTWFjaGluZUNvbVBvaW50KAorLy8JCQkJCQkJdGhlUm91dGluZ0RhdGEuZ2V0TWFjaGluZVBvcnQoKSApOworLy8JCQkJfQorLy8JCQl9CisJCX0KKwl9CisKKworQVZNX0lGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBDT01NVU5JQ0FUSU9OICkKKwlpb2MtPnRvU3RyZWFtKEFWTV9PU19UUkFDRSk7CisJQVZNX09TX1RSQUNFIDw8IFRBQl9ERUNSX0lOREVOVAorCQkJPDwgIkVORCBDT01QSUxFIElOVEVSQUNUSU9OIENPTk5FQ1QgVFJBTlNGRVJUIgorCQkJPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgQ09NTVVOSUNBVElPTiApCit9CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ09NUElMRSBJTlRFUkFDVElPTiBDT05ORUNUIEVOVklST05NRU5UCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK3ZvaWQgQ29tcGlsZXJPZkludGVyYWN0aW9uOjpjb21waWxlQ29ubmVjdG9yRW52aXJvbm1lbnQoCisJCUV4ZWN1dGFibGVGb3JtICogdGhlRXhlY3V0YWJsZSwgSW5zdGFuY2VPZkNvbm5lY3QgKiBpb2MpCit7CisJY29uc3QgQ29ubmVjdG9yICogYUNvbm5lY3RvciA9IGlvYy0+Z2V0QXN0Q29ubmVjdG9yKCk7CisKK0FWTV9JRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgQ09NTVVOSUNBVElPTiApCisJQVZNX09TX1RSQUNFIDw8IElOQ1JfSU5ERU5UX1RBQgorCQkJPDwgIkNPTVBJTEUgSU5URVJBQ1RJT04gQ09OTkVDVCBFTlZJUk9OTUVOVCIKKwkJCTw8IHN0ZDo6ZW5kbDsKKwlhQ29ubmVjdG9yLT50b1N0cmVhbShBVk1fT1NfVFJBQ0UpOworCUFWTV9PU19UUkFDRSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRzIoIENPTVBJTElORyAsIENPTU1VTklDQVRJT04gKQorCisJQkZMaXN0Ojpjb25zdF9yYXdfaXRlcmF0b3I8IENvbVBvaW50ID4gaXRDb21Qb2ludDsKKwlCRkxpc3Q6OmNvbnN0X3Jhd19pdGVyYXRvcjwgQ29tUG9pbnQgPiBlbmRJdENvbVBvaW50OworCisJTGlzdDwgUm91dGluZ0RhdGEgPiBsaXN0T2ZSb3V0aW5nRGF0YTsKKwlSb3V0aW5nRGF0YSB0aGVSb3V0aW5nRGF0YTsKKworCS8vIFJvdXRpbmcgZm9yIGFsbCBwb3J0CisJQ29ubmVjdG9yOjpyb3V0ZV9pdGVyYXRvciBpdENvbVJvdXRlID0gYUNvbm5lY3Rvci0+YmVnaW4oKTsKKwlDb25uZWN0b3I6OnJvdXRlX2l0ZXJhdG9yIGVuZEl0Q29tUm91dGUgPSBhQ29ubmVjdG9yLT5lbmQoKTsKKwlmb3IoIDsgaXRDb21Sb3V0ZSAhPSBlbmRJdENvbVJvdXRlIDsgKytpdENvbVJvdXRlICkKKwl7CisJCWl0Q29tUG9pbnQgPSAoKml0Q29tUm91dGUpLT5nZXRDb21Qb2ludHMoKS5iZWdpbigpOworCQllbmRJdENvbVBvaW50ID0gKCppdENvbVJvdXRlKS0+Z2V0Q29tUG9pbnRzKCkuZW5kKCk7CisJCWZvciggOyBpdENvbVBvaW50ICE9IGVuZEl0Q29tUG9pbnQgOyArK2l0Q29tUG9pbnQgKQorCQl7CisJCQljcmVhdGVSb3V0aW5nRGF0YShsaXN0T2ZSb3V0aW5nRGF0YSwgdGhlRXhlY3V0YWJsZSwKKwkJCQkJaW9jLCAoKml0Q29tUm91dGUpLCAoaXRDb21Qb2ludCkpOworCisJCQl3aGlsZSggbGlzdE9mUm91dGluZ0RhdGEubm9uZW1wdHkoKSApCisJCQl7CisJCQkJbGlzdE9mUm91dGluZ0RhdGEucG9wX2ZpcnN0X3RvKCB0aGVSb3V0aW5nRGF0YSApOworCisJCQkJLy8gRVJST1IgUkVQT1JUSU5HCisJCQkJaWYoIHRoZVJvdXRpbmdEYXRhLmdldFBvcnQoKS0+Z2V0TW9kaWZpZXIoKS5pc25vdERpcmVjdGlvbktpbmQoCisJCQkJCQkoKml0Q29tUm91dGUpLT5nZXRNb2RpZmllcigpLmdldERpcmVjdGlvbktpbmQoKSApCisJCQkJCSYmIChub3QgdGhlUm91dGluZ0RhdGEuZ2V0UG9ydCgpLT4KKwkJCQkJCQlnZXRNb2RpZmllcigpLmlzRGlyZWN0aW9uSW5vdXQoKSkgKQorCQkJCXsKKwkJCQkJaW5jckVycm9yQ291bnQoKTsKKwkJCQkJQVZNX09TX1dBUk4gPDwgKCppdENvbVJvdXRlKS0+ZXJyb3JMb2NhdGlvbihhQ29ubmVjdG9yKQorCQkJCQkJPDwgIlVuZXhwZWN0ZWQgYSAiCisJCQkJCQk8PCB0aGVSb3V0aW5nRGF0YS5nZXRQb3J0KCktPmdldE1vZGlmaWVyKCkuc3RyRGlyZWN0aW9uKCkKKwkJCQkJCTw8ICIgUE9SVCA8PCAiCisJCQkJCQk8PCB0aGVSb3V0aW5nRGF0YS5nZXRQb3J0KCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKwkJCQkJCTw8ICIgPj4gaW4gYW4gIgorCQkJCQkJPDwgKCppdENvbVJvdXRlKS0+Z2V0TW9kaWZpZXIoKS5zdHJEaXJlY3Rpb24oKQorCQkJCQkJPDwgIiBCVVMgPDwgIiA8PCBhQ29ubmVjdG9yLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQkJCQk8PCAiID4+IiA8PCBzdGQ6OmVuZGw7CisJCQkJfQorCQkJfQorCQl9CisJfQorCitBVk1fSUZfREVCVUdfRkxBRzIoIENPTVBJTElORyAsIENPTU1VTklDQVRJT04gKQorCWlvYy0+dG9TdHJlYW0oQVZNX09TX1RSQUNFKTsKKwlBVk1fT1NfVFJBQ0UgPDwgVEFCX0RFQ1JfSU5ERU5UCisJCQk8PCAiRU5EIENPTVBJTEUgSU5URVJBQ1RJT04gQ09OTkVDVCBFTlZJUk9OTUVOVCIKKwkJCTw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRzIoIENPTVBJTElORyAsIENPTU1VTklDQVRJT04gKQorfQorCisKKworCisKKworCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ09NUElMRSBJTlRFUkFDVElPTiBDT05ORUNUIEJST0FEQ0FTVAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLwordm9pZCBDb21waWxlck9mSW50ZXJhY3Rpb246OmNvbXBpbGVSb3V0ZUJyb2FkY2FzdCgKKwkJRXhlY3V0YWJsZUZvcm0gKiB0aGVFeGVjdXRhYmxlLCBJbnN0YW5jZU9mQ29ubmVjdCAqIGlvYykKK3sKKwljb25zdCBDb25uZWN0b3IgKiBhQ29ubmVjdG9yID0gaW9jLT5nZXRBc3RDb25uZWN0b3IoKTsKKworQVZNX0lGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBDT01NVU5JQ0FUSU9OICkKKwlBVk1fT1NfVFJBQ0UgPDwgSU5DUl9JTkRFTlRfVEFCCisJCQk8PCAiQ09NUElMRSBJTlRFUkFDVElPTiBDT05ORUNUIEJST0FEQ0FTVCIKKwkJCTw8IHN0ZDo6ZW5kbDsKKwlhQ29ubmVjdG9yLT50b1N0cmVhbShBVk1fT1NfVFJBQ0UpOworCUFWTV9PU19UUkFDRSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRzIoIENPTVBJTElORyAsIENPTU1VTklDQVRJT04gKQorCisJQnVmZmVyICogYnVmZmVyID0gTlVMTDsKKwlJbnN0YW5jZU9mQnVmZmVyICogdGhlQnVmZmVySW5zdGFuY2UgPSBOVUxMOworCisJaWYoIGFDb25uZWN0b3ItPmhhc0J1ZmZlcigpICkKKwl7CisJCWJ1ZmZlciA9IGFDb25uZWN0b3ItPmdldEJ1ZmZlcigpOworCisJCWlmKCBidWZmZXItPmlzQW5vbnltSUQoKSApCisJCXsKKwkJCXRoZUJ1ZmZlckluc3RhbmNlID0gbmV3IEluc3RhbmNlT2ZCdWZmZXIoCisJCQkJCXRoZUV4ZWN1dGFibGUsIGJ1ZmZlciwgdGhlRXhlY3V0YWJsZS0+Z2V0QnVmZmVyKCkuc2l6ZSgpKTsKKworCQkJZ2V0U3ltYm9sVGFibGUoKS5hZGRCdWZmZXJJbnN0YW5jZSgKKwkJCQkJdGhlRXhlY3V0YWJsZS0+c2F2ZUJ1ZmZlcih0aGVCdWZmZXJJbnN0YW5jZSkgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXRoZUJ1ZmZlckluc3RhbmNlID0gZ2V0U3ltYm9sVGFibGUoKS5zZWFyY2hCdWZmZXJJbnN0YW5jZSgKKwkJCQkJdGhlRXhlY3V0YWJsZSwgYnVmZmVyKS5yYXdCdWZmZXIoKTsKKwkJfQorCX0KKwllbHNlIGlmKCBhQ29ubmVjdG9yLT5oYXNCdWZmZXJVZmlkKCkgKQorCXsKKwkJdGhlQnVmZmVySW5zdGFuY2UgPQorCQkJZ2V0U3ltYm9sVGFibGUoKS5zZWFyY2hCdWZmZXJJbnN0YW5jZUJ5UXVhbGlmaWVkTmFtZUlEKAorCQkJCXRoZUV4ZWN1dGFibGUsIGFDb25uZWN0b3ItPnN0ckJ1ZmZlclVmaWQoKSkucmF3QnVmZmVyKCk7CisKKwkJaWYoIHRoZUJ1ZmZlckluc3RhbmNlID09IE5VTEwgKQorCQl7CisJCQlpbmNyRXJyb3JDb3VudCgpOworCQkJYUNvbm5lY3Rvci0+ZXJyb3JMb2NhdGlvbihBVk1fT1NfV0FSTikKKwkJCQkJPDwgIlVuZm91bmQgaW4gdGhlIENPTSBQT0lOVCB0aGUgYnVmZmVyIGluc3RhbmNlIDwgIgorCQkJCQk8PCBhQ29ubmVjdG9yLT5zdHJCdWZmZXJVZmlkKCkgPDwgIiA+ICEiIDw8IHN0ZDo6ZW5kbDsKKwkJfQorCX0KKwllbHNlIGlmKCBidWZmZXIgPT0gTlVMTCApCisJeworCQl0aGVCdWZmZXJJbnN0YW5jZSA9IG5ldyBJbnN0YW5jZU9mQnVmZmVyKAorCQkJCXRoZUV4ZWN1dGFibGUsCWJ1ZmZlciwgdGhlRXhlY3V0YWJsZS0+Z2V0QnVmZmVyKCkuc2l6ZSgpLAorCQkJCVRZUEVfRklGT19TUEVDSUZJRVIsIC0xICk7CisKKwkJZ2V0U3ltYm9sVGFibGUoKS5hZGRCdWZmZXJJbnN0YW5jZSgKKwkJCQl0aGVFeGVjdXRhYmxlLT5zYXZlQnVmZmVyKHRoZUJ1ZmZlckluc3RhbmNlKSApOworCX0KKworCisJQkZMaXN0Ojpjb25zdF9yYXdfaXRlcmF0b3I8IENvbVBvaW50ID4gaXRDb21Qb2ludDsKKwlCRkxpc3Q6OmNvbnN0X3Jhd19pdGVyYXRvcjwgQ29tUG9pbnQgPiBlbmRJdENvbVBvaW50OworCisJTGlzdDwgUm91dGluZ0RhdGEgPiBsaXN0T2ZSb3V0aW5nRGF0YTsKKwlSb3V0aW5nRGF0YSB0aGVSb3V0aW5nRGF0YTsKKworCS8vIFJvdXRpbmcgZm9yIGFsbCBwb3J0CisJQ29ubmVjdG9yOjpyb3V0ZV9pdGVyYXRvciBpdENvbVJvdXRlID0gYUNvbm5lY3Rvci0+YmVnaW4oKTsKKwlDb25uZWN0b3I6OnJvdXRlX2l0ZXJhdG9yIGVuZEl0Q29tUm91dGUgPSBhQ29ubmVjdG9yLT5lbmQoKTsKKwlmb3IoIDsgaXRDb21Sb3V0ZSAhPSBlbmRJdENvbVJvdXRlIDsgKytpdENvbVJvdXRlICkKKwl7CisJCWl0Q29tUG9pbnQgPSAoKml0Q29tUm91dGUpLT5nZXRDb21Qb2ludHMoKS5iZWdpbigpOworCQllbmRJdENvbVBvaW50ID0gKCppdENvbVJvdXRlKS0+Z2V0Q29tUG9pbnRzKCkuZW5kKCk7CisJCWZvciggOyBpdENvbVBvaW50ICE9IGVuZEl0Q29tUG9pbnQgOyArK2l0Q29tUG9pbnQgKQorCQl7CisJCQljcmVhdGVSb3V0aW5nRGF0YShsaXN0T2ZSb3V0aW5nRGF0YSwgdGhlRXhlY3V0YWJsZSwKKwkJCQkJaW9jLCAoKml0Q29tUm91dGUpLCAoaXRDb21Qb2ludCkpOworCisJCQl3aGlsZSggbGlzdE9mUm91dGluZ0RhdGEubm9uZW1wdHkoKSApCisJCQl7CisJCQkJbGlzdE9mUm91dGluZ0RhdGEucG9wX2ZpcnN0X3RvKCB0aGVSb3V0aW5nRGF0YSApOworCisJCQkJLy8gZm9yIGJ1ZmZlciBwb3J0CisJCQkJaWYoIHRoZUJ1ZmZlckluc3RhbmNlICE9IE5VTEwgKQorCQkJCXsKKwkJCQkJdGhlUm91dGluZ0RhdGEuYXBwZW5kQnVmZmVyKHRoZUJ1ZmZlckluc3RhbmNlKTsKKwkJCQl9CisKKwkJCQlpZiggKCppdENvbVJvdXRlKS0+aGFzUHJvdG9jb2woKSApCisJCQkJeworCQkJCQkvLyBUT0RPIGZvciBvdGhlciBDT01fUFJPVE9DT0wKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKK0FWTV9JRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgQ09NTVVOSUNBVElPTiApCisJaW9jLT50b1N0cmVhbShBVk1fT1NfVFJBQ0UpOworCUFWTV9PU19UUkFDRSA8PCBUQUJfREVDUl9JTkRFTlQKKwkJCTw8ICJFTkQgQ09NUElMRSBJTlRFUkFDVElPTiBDT05ORUNUIEJST0FEQ0FTVCIKKwkJCTw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRzIoIENPTVBJTElORyAsIENPTU1VTklDQVRJT04gKQorfQorCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ09NUElMRSBJTlRFUkFDVElPTiBDT05ORUNUIEJVRkZFUgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLwordm9pZCBDb21waWxlck9mSW50ZXJhY3Rpb246OmNvbXBpbGVSb3V0ZUJ1ZmZlcigKKwkJRXhlY3V0YWJsZUZvcm0gKiB0aGVFeGVjdXRhYmxlLCBJbnN0YW5jZU9mQ29ubmVjdCAqIGlvYykKK3sKKwljb25zdCBDb25uZWN0b3IgKiBhQ29ubmVjdG9yID0gaW9jLT5nZXRBc3RDb25uZWN0b3IoKTsKKworQVZNX0lGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBDT01NVU5JQ0FUSU9OICkKKwlBVk1fT1NfVFJBQ0UgPDwgSU5DUl9JTkRFTlRfVEFCCisJCQk8PCAiQ09NUElMRSBJTlRFUkFDVElPTiBDT05ORUNUIEJVRkZFUiIgPDwgc3RkOjplbmRsOworCWFDb25uZWN0b3ItPnRvU3RyZWFtKEFWTV9PU19UUkFDRSk7CisJQVZNX09TX1RSQUNFIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgQ09NTVVOSUNBVElPTiApCisKKwlCdWZmZXIgKiBidWZmZXIgPSBOVUxMOworCUluc3RhbmNlT2ZCdWZmZXIgKiB0aGVCdWZmZXJJbnN0YW5jZSA9IE5VTEw7CisJSW5zdGFuY2VPZkJ1ZmZlciAqIGxvY2FsQnVmZmVySW5zdGFuY2UgPSBOVUxMOworCisJaWYoIGFDb25uZWN0b3ItPmhhc0J1ZmZlcigpICkKKwl7CisJCWJ1ZmZlciA9IGFDb25uZWN0b3ItPmdldEJ1ZmZlcigpOworCQlpZiggYnVmZmVyLT5pc0Fub255bUlEKCkgKQorCQl7CisJCQl0aGVCdWZmZXJJbnN0YW5jZSA9IG5ldyBJbnN0YW5jZU9mQnVmZmVyKAorCQkJCQl0aGVFeGVjdXRhYmxlLCBidWZmZXIsIHRoZUV4ZWN1dGFibGUtPmdldEJ1ZmZlcigpLnNpemUoKSk7CisKKwkJCWdldFN5bWJvbFRhYmxlKCkuYWRkQnVmZmVySW5zdGFuY2UoCisJCQkJCXRoZUV4ZWN1dGFibGUtPnNhdmVCdWZmZXIodGhlQnVmZmVySW5zdGFuY2UpICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQl0aGVCdWZmZXJJbnN0YW5jZSA9IGdldFN5bWJvbFRhYmxlKCkuc2VhcmNoQnVmZmVySW5zdGFuY2UoCisJCQkJCXRoZUV4ZWN1dGFibGUsIGJ1ZmZlcikucmF3QnVmZmVyKCk7CisJCX0KKwl9CisJZWxzZSBpZiggYUNvbm5lY3Rvci0+aGFzQnVmZmVyVWZpZCgpICkKKwl7CisJCXRoZUJ1ZmZlckluc3RhbmNlID0KKwkJCWdldFN5bWJvbFRhYmxlKCkuc2VhcmNoQnVmZmVySW5zdGFuY2VCeVF1YWxpZmllZE5hbWVJRCgKKwkJCQl0aGVFeGVjdXRhYmxlLCBhQ29ubmVjdG9yLT5zdHJCdWZmZXJVZmlkKCkpLnJhd0J1ZmZlcigpOworCisJCWlmKCB0aGVCdWZmZXJJbnN0YW5jZSA9PSBOVUxMICkKKwkJeworCQkJaW5jckVycm9yQ291bnQoKTsKKwkJCWFDb25uZWN0b3ItPmVycm9yTG9jYXRpb24oQVZNX09TX1dBUk4pCisJCQkJCTw8ICJVbmZvdW5kIGluIHRoZSBDT00gUE9JTlQgdGhlIGJ1ZmZlciBpbnN0YW5jZSA8ICIKKwkJCQkJPDwgYUNvbm5lY3Rvci0+c3RyQnVmZmVyVWZpZCgpIDw8ICIgPiAhIiA8PCBzdGQ6OmVuZGw7CisJCX0KKwl9CisJZWxzZSBpZiggYnVmZmVyID09IE5VTEwgKQorCXsKKwkJdGhlQnVmZmVySW5zdGFuY2UgPSBuZXcgSW5zdGFuY2VPZkJ1ZmZlcigKKwkJCQl0aGVFeGVjdXRhYmxlLAlidWZmZXIsIHRoZUV4ZWN1dGFibGUtPmdldEJ1ZmZlcigpLnNpemUoKSwKKwkJCQlUWVBFX0ZJRk9fU1BFQ0lGSUVSLCAtMSApOworCisJCWdldFN5bWJvbFRhYmxlKCkuYWRkQnVmZmVySW5zdGFuY2UoCisJCQkJdGhlRXhlY3V0YWJsZS0+c2F2ZUJ1ZmZlcih0aGVCdWZmZXJJbnN0YW5jZSkgKTsKKwl9CisKKwkvLyBsaXN0cyBmb3IgdXBkYXRlIGlucHV0IHBvcnQgY29ubmVjdG9yIGxpc3QKKwlMaXN0PCBSb3V0aW5nRGF0YSA+IGxpc3RPZk91dFJvdXRpbmdEYXRhOworCUxpc3Q8IFJvdXRpbmdEYXRhID4gbGlzdE9mSW5Sb3V0aW5nRGF0YTsKKworCUJGTGlzdDo6Y29uc3RfcmF3X2l0ZXJhdG9yPCBDb21Qb2ludCA+IGl0Q29tUG9pbnQ7CisJQkZMaXN0Ojpjb25zdF9yYXdfaXRlcmF0b3I8IENvbVBvaW50ID4gZW5kSXRDb21Qb2ludDsKKworCUxpc3Q8IFJvdXRpbmdEYXRhID4gbGlzdE9mUm91dGluZ0RhdGE7CisJUm91dGluZ0RhdGEgdGhlUm91dGluZ0RhdGE7CisKKwkvLyBSb3V0aW5nIGZvciBhbGwgcG9ydAorCUNvbm5lY3Rvcjo6cm91dGVfaXRlcmF0b3IgaXRDb21Sb3V0ZSA9IGFDb25uZWN0b3ItPmJlZ2luKCk7CisJQ29ubmVjdG9yOjpyb3V0ZV9pdGVyYXRvciBlbmRJdENvbVJvdXRlID0gYUNvbm5lY3Rvci0+ZW5kKCk7CisJZm9yKCA7IGl0Q29tUm91dGUgIT0gZW5kSXRDb21Sb3V0ZSA7ICsraXRDb21Sb3V0ZSApCisJeworCQlpdENvbVBvaW50ID0gKCppdENvbVJvdXRlKS0+Z2V0Q29tUG9pbnRzKCkuYmVnaW4oKTsKKwkJZW5kSXRDb21Qb2ludCA9ICgqaXRDb21Sb3V0ZSktPmdldENvbVBvaW50cygpLmVuZCgpOworCQlmb3IoIDsgaXRDb21Qb2ludCAhPSBlbmRJdENvbVBvaW50IDsgKytpdENvbVBvaW50ICkKKwkJeworCQkJY3JlYXRlUm91dGluZ0RhdGEobGlzdE9mUm91dGluZ0RhdGEsIHRoZUV4ZWN1dGFibGUsCisJCQkJCWlvYywgKCppdENvbVJvdXRlKSwgKGl0Q29tUG9pbnQpKTsKKworCQkJd2hpbGUoIGxpc3RPZlJvdXRpbmdEYXRhLm5vbmVtcHR5KCkgKQorCQkJeworCQkJCWxpc3RPZlJvdXRpbmdEYXRhLnBvcF9maXJzdF90byggdGhlUm91dGluZ0RhdGEgKTsKKworCQkJCWlmKCB0aGVCdWZmZXJJbnN0YW5jZSAhPSBOVUxMICkKKwkJCQl7CisJCQkJCS8vIGZvciBidWZmZXIgcG9ydAorCQkJCQl0aGVSb3V0aW5nRGF0YS5hcHBlbmRCdWZmZXIodGhlQnVmZmVySW5zdGFuY2UpOworCQkJCX0KKworCQkJCS8vIGZvciBidWZmZXIgcG9ydAorCQkJCWlmKCBub3QgKCppdENvbVJvdXRlKS0+aGFzUHJvdG9jb2woKSApCisJCQkJeworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlzd2l0Y2goICgqaXRDb21Sb3V0ZSktPmdldFByb3RvY29sKCkgKQorCQkJCXsKKwkJCQkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfQlVGRkVSX0tJTkQ6CisJCQkJCXsKKwkJCQkJCWxvY2FsQnVmZmVySW5zdGFuY2UgPSB0aGVCdWZmZXJJbnN0YW5jZTsKKworCQkJCQkJaWYoICgqaXRDb21Sb3V0ZSktPmhhc0J1ZmZlcigpICkKKwkJCQkJCXsKKwkJCQkJCQlidWZmZXIgPSAoKml0Q29tUm91dGUpLT5nZXRCdWZmZXIoKTsKKworCQkJCQkJCWlmKCBidWZmZXItPmlzQW5vbnltSUQoKSApCisJCQkJCQkJeworCQkJCQkJCQlsb2NhbEJ1ZmZlckluc3RhbmNlID0gbmV3IEluc3RhbmNlT2ZCdWZmZXIoCisJCQkJCQkJCQkJdGhlRXhlY3V0YWJsZSwgYnVmZmVyLAorCQkJCQkJCQkJCXRoZUV4ZWN1dGFibGUtPmdldEJ1ZmZlcigpLnNpemUoKSk7CisKKwkJCQkJCQkJZ2V0U3ltYm9sVGFibGUoKS5hZGRCdWZmZXJJbnN0YW5jZSgKKwkJCQkJCQkJCXRoZUV4ZWN1dGFibGUtPnNhdmVCdWZmZXIoCisJCQkJCQkJCQkJCWxvY2FsQnVmZmVySW5zdGFuY2UpICk7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCWxvY2FsQnVmZmVySW5zdGFuY2UgPSBnZXRTeW1ib2xUYWJsZSgpLgorCQkJCQkJCQkJc2VhcmNoQnVmZmVySW5zdGFuY2UodGhlRXhlY3V0YWJsZSwgYnVmZmVyKS4KKwkJCQkJCQkJCQlyYXdCdWZmZXIoKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQllbHNlIGlmKCAoKml0Q29tUm91dGUpLT5oYXNCdWZmZXJVZmlkKCkgKQorCQkJCQkJeworCQkJCQkJCWxvY2FsQnVmZmVySW5zdGFuY2UgPSBnZXRTeW1ib2xUYWJsZSgpLgorCQkJCQkJCQlzZWFyY2hCdWZmZXJJbnN0YW5jZSh0aGVFeGVjdXRhYmxlLAorCQkJCQkJCQkJKCppdENvbVJvdXRlKS0+c3RyQnVmZmVyVWZpZCgpKS5yYXdCdWZmZXIoKTsKKworCQkJCQkJCWlmKCBsb2NhbEJ1ZmZlckluc3RhbmNlID09IE5VTEwgKQorCQkJCQkJCXsKKwkJCQkJCQkJaW5jckVycm9yQ291bnQoKTsKKwkJCQkJCQkJYUNvbm5lY3Rvci0+ZXJyb3JMb2NhdGlvbihBVk1fT1NfV0FSTikKKwkJCQkJCQkJCQk8PCAiVW5mb3VuZCBpbiB0aGUgQ09NIFBPSU5UICIKKwkJCQkJCQkJCQkJCSJ0aGUgYnVmZmVyIGluc3RhbmNlIDwgIgorCQkJCQkJCQkJCTw8ICgqaXRDb21Sb3V0ZSktPnN0ckJ1ZmZlclVmaWQoKQorCQkJCQkJCQkJCTw8ICIgPiAhIiA8PCBzdGQ6OmVuZGw7CisJCQkJCQkJfQorCQkJCQkJfQorCisJCQkJCQlpZiggbG9jYWxCdWZmZXJJbnN0YW5jZSAhPSBOVUxMICkKKwkJCQkJCXsKKwkJCQkJCQl0aGVSb3V0aW5nRGF0YS5hcHBlbmRCdWZmZXIobG9jYWxCdWZmZXJJbnN0YW5jZSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJLy8gVE9ETyBmb3Igb3RoZXIgRVJST1IKKwkJCQkJCX0KKworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQlkZWZhdWx0OgorCQkJCQl7CisJCQkJCQkvLyBUT0RPIGZvciBvdGhlciBDT01fUFJPVE9DT0wKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCisJCQkJLy8gbGlzdCBmb3IgdXBkYXRlIGFsbCBidWZmZXIgYW5kIHBvcnQgY29ubmVjdG9yIGxpc3QKKwkJCQlpZiggKCppdENvbVJvdXRlKS0+Z2V0TW9kaWZpZXIoKS5pc0RpcmVjdGlvbk91dHB1dCgpICkKKwkJCQl7CisJCQkJCWxpc3RPZk91dFJvdXRpbmdEYXRhLmFwcGVuZCh0aGVSb3V0aW5nRGF0YSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWxpc3RPZkluUm91dGluZ0RhdGEuYXBwZW5kKHRoZVJvdXRpbmdEYXRhKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKworCS8vIGJ1ZmZlciBjb21wbGV0aW9uCisJYnVmZmVyQ29tcGxldGlvbihsaXN0T2ZPdXRSb3V0aW5nRGF0YSwgbGlzdE9mSW5Sb3V0aW5nRGF0YSk7CisKKworQVZNX0lGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBDT01NVU5JQ0FUSU9OICkKKwlpb2MtPnRvU3RyZWFtKEFWTV9PU19UUkFDRSk7CisJQVZNX09TX1RSQUNFIDw8IFRBQl9ERUNSX0lOREVOVAorCQkJPDwgIkVORCBDT01QSUxFIElOVEVSQUNUSU9OIENPTk5FQ1QgQlVGRkVSIgorCQkJPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgQ09NTVVOSUNBVElPTiApCit9CisKKworCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENPTVBJTEUgSU5URVJBQ1RJT04gQ09OTkVDVCBST1VUSU5HIENBU1QKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3ZvaWQgQ29tcGlsZXJPZkludGVyYWN0aW9uOjpjb21waWxlUm91dGVSb3V0aW5nQ2FzdCgKKwkJRXhlY3V0YWJsZUZvcm0gKiB0aGVFeGVjdXRhYmxlLCBJbnN0YW5jZU9mQ29ubmVjdCAqIGlvYykKK3sKKwljb25zdCBDb25uZWN0b3IgKiBhQ29ubmVjdG9yID0gaW9jLT5nZXRBc3RDb25uZWN0b3IoKTsKKworQVZNX0lGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBDT01NVU5JQ0FUSU9OICkKKwlBVk1fT1NfVFJBQ0UgPDwgSU5DUl9JTkRFTlRfVEFCCisJCQk8PCAiQ09NUElMRSBJTlRFUkFDVElPTiBDT05ORUNUIFJPVVRJTkcgQ0FTVCIKKwkJCTw8IHN0ZDo6ZW5kbDsKKwlhQ29ubmVjdG9yLT50b1N0cmVhbShBVk1fT1NfVFJBQ0UpOworCUFWTV9PU19UUkFDRSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRzIoIENPTVBJTElORyAsIENPTU1VTklDQVRJT04gKQorCisJQnVmZmVyICogYnVmZmVyID0gTlVMTDsKKwlJbnN0YW5jZU9mQnVmZmVyICogdGhlQnVmZmVySW5zdGFuY2UgPSBOVUxMOworCisJLy8gbGlzdHMgZm9yIHVwZGF0ZSBpbnB1dCBwb3J0IGNvbm5lY3RvciBsaXN0CisJTGlzdDwgUm91dGluZ0RhdGEgPiBsaXN0T2ZPdXRSb3V0aW5nRGF0YTsKKwlMaXN0PCBSb3V0aW5nRGF0YSA+IGxpc3RPZkluUm91dGluZ0RhdGE7CisKKwlCRkxpc3Q6OmNvbnN0X3Jhd19pdGVyYXRvcjwgQ29tUG9pbnQgPiBpdENvbVBvaW50OworCUJGTGlzdDo6Y29uc3RfcmF3X2l0ZXJhdG9yPCBDb21Qb2ludCA+IGVuZEl0Q29tUG9pbnQ7CisKKwlMaXN0PCBSb3V0aW5nRGF0YSA+IGxpc3RPZlJvdXRpbmdEYXRhOworCVJvdXRpbmdEYXRhIHRoZVJvdXRpbmdEYXRhOworCisJLy8gUm91dGluZyBmb3IgYWxsIHBvcnQKKwlDb25uZWN0b3I6OnJvdXRlX2l0ZXJhdG9yIGl0Q29tUm91dGUgPSBhQ29ubmVjdG9yLT5iZWdpbigpOworCUNvbm5lY3Rvcjo6cm91dGVfaXRlcmF0b3IgZW5kSXRDb21Sb3V0ZSA9IGFDb25uZWN0b3ItPmVuZCgpOworCWZvciggOyBpdENvbVJvdXRlICE9IGVuZEl0Q29tUm91dGUgOyArK2l0Q29tUm91dGUgKQorCXsKKwkJaXRDb21Qb2ludCA9ICgqaXRDb21Sb3V0ZSktPmdldENvbVBvaW50cygpLmJlZ2luKCk7CisJCWVuZEl0Q29tUG9pbnQgPSAoKml0Q29tUm91dGUpLT5nZXRDb21Qb2ludHMoKS5lbmQoKTsKKwkJZm9yKCA7IGl0Q29tUG9pbnQgIT0gZW5kSXRDb21Qb2ludCA7ICsraXRDb21Qb2ludCApCisJCXsKKwkJCWNyZWF0ZVJvdXRpbmdEYXRhKGxpc3RPZlJvdXRpbmdEYXRhLCB0aGVFeGVjdXRhYmxlLAorCQkJCQlpb2MsICgqaXRDb21Sb3V0ZSksIChpdENvbVBvaW50KSk7CisKKwkJCXdoaWxlKCBsaXN0T2ZSb3V0aW5nRGF0YS5ub25lbXB0eSgpICkKKwkJCXsKKwkJCQlsaXN0T2ZSb3V0aW5nRGF0YS5wb3BfZmlyc3RfdG8oIHRoZVJvdXRpbmdEYXRhICk7CisKKwkJCQkvLyBsaXN0IGZvciB1cGRhdGUgaW5wdXQgYnVmZmVyIGFuZCBwb3J0IGNvbm5lY3RvciBsaXN0CisJCQkJbGlzdE9mT3V0Um91dGluZ0RhdGEuYXBwZW5kKHRoZVJvdXRpbmdEYXRhKTsKKworCQkJCS8vIGZvciBidWZmZXIgcG9ydAorCQkJCWlmKCBub3QgKCppdENvbVJvdXRlKS0+aGFzUHJvdG9jb2woKSApCisJCQkJeworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlzd2l0Y2goICgqaXRDb21Sb3V0ZSktPmdldFByb3RvY29sKCkgKQorCQkJCXsKKwkJCQkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfQlVGRkVSX0tJTkQ6CisJCQkJCXsKKwkJCQkJCWlmKCAoKml0Q29tUm91dGUpLT5oYXNCdWZmZXIoKSApCisJCQkJCQl7CisJCQkJCQkJYnVmZmVyID0gKCppdENvbVJvdXRlKS0+Z2V0QnVmZmVyKCk7CisKKwkJCQkJCQlpZiggYnVmZmVyLT5pc0Fub255bUlEKCkgKQorCQkJCQkJCXsKKwkJCQkJCQkJdGhlQnVmZmVySW5zdGFuY2UgPSBuZXcgSW5zdGFuY2VPZkJ1ZmZlcigKKwkJCQkJCQkJCQl0aGVFeGVjdXRhYmxlLCBidWZmZXIsCisJCQkJCQkJCQkJdGhlRXhlY3V0YWJsZS0+Z2V0QnVmZmVyKCkuc2l6ZSgpKTsKKworCQkJCQkJCQlnZXRTeW1ib2xUYWJsZSgpLmFkZEJ1ZmZlckluc3RhbmNlKAorCQkJCQkJCQkJdGhlRXhlY3V0YWJsZS0+c2F2ZUJ1ZmZlcih0aGVCdWZmZXJJbnN0YW5jZSkpOworCQkJCQkJCX0KKwkJCQkJCQllbHNlCisJCQkJCQkJeworCQkJCQkJCQl0aGVCdWZmZXJJbnN0YW5jZSA9IGdldFN5bWJvbFRhYmxlKCkuCisJCQkJCQkJCQlzZWFyY2hCdWZmZXJJbnN0YW5jZSh0aGVFeGVjdXRhYmxlLCBidWZmZXIpLgorCQkJCQkJCQkJCXJhd0J1ZmZlcigpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWVsc2UgaWYoICgqaXRDb21Sb3V0ZSktPmhhc0J1ZmZlclVmaWQoKSApCisJCQkJCQl7CisJCQkJCQkJdGhlQnVmZmVySW5zdGFuY2UgPSBnZXRTeW1ib2xUYWJsZSgpLgorCQkJCQkJCQlzZWFyY2hCdWZmZXJJbnN0YW5jZSh0aGVFeGVjdXRhYmxlLAorCQkJCQkJCQkJKCppdENvbVJvdXRlKS0+c3RyQnVmZmVyVWZpZCgpKS5yYXdCdWZmZXIoKTsKKworCQkJCQkJCWlmKCB0aGVCdWZmZXJJbnN0YW5jZSA9PSBOVUxMICkKKwkJCQkJCQl7CisJCQkJCQkJCWluY3JFcnJvckNvdW50KCk7CisJCQkJCQkJCWFDb25uZWN0b3ItPmVycm9yTG9jYXRpb24oQVZNX09TX1dBUk4pCisJCQkJCQkJCQkJPDwgIlVuZm91bmQgaW4gdGhlIENPTSBQT0lOVCAiCisJCQkJCQkJCQkJCQkidGhlIGJ1ZmZlciBpbnN0YW5jZSA8ICIKKwkJCQkJCQkJCQk8PCAoKml0Q29tUm91dGUpLT5zdHJCdWZmZXJVZmlkKCkKKwkJCQkJCQkJCQk8PCAiID4gISIgPDwgc3RkOjplbmRsOworCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQkJaWYoIHRoZUJ1ZmZlckluc3RhbmNlICE9IE5VTEwgKQorCQkJCQkJeworCQkJCQkJCXRoZVJvdXRpbmdEYXRhLmFwcGVuZEJ1ZmZlcih0aGVCdWZmZXJJbnN0YW5jZSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJLy8gVE9ETyBmb3Igb3RoZXIgRVJST1IKKwkJCQkJCX0KKworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQljYXNlIENvbVByb3RvY29sOjpQUk9UT0NPTF9NVUxUSUNBU1RfS0lORDoKKwkJCQkJeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfVU5JQ0FTVF9LSU5EOgorCQkJCQl7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQljYXNlIENvbVByb3RvY29sOjpQUk9UT0NPTF9BTllDQVNUX0tJTkQ6CisJCQkJCXsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWRlZmF1bHQ6CisJCQkJCXsKKwkJCQkJCS8vIFRPRE8gZm9yIG90aGVyIENPTV9QUk9UT0NPTAorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisKKwkJCQkvLyBsaXN0IGZvciB1cGRhdGUgYWxsIGJ1ZmZlciBhbmQgcG9ydCBjb25uZWN0b3IgbGlzdAorCQkJCWlmKCAoKml0Q29tUm91dGUpLT5nZXRNb2RpZmllcigpLmlzRGlyZWN0aW9uT3V0cHV0KCkgKQorCQkJCXsKKwkJCQkJbGlzdE9mT3V0Um91dGluZ0RhdGEuYXBwZW5kKHRoZVJvdXRpbmdEYXRhKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJbGlzdE9mSW5Sb3V0aW5nRGF0YS5hcHBlbmQodGhlUm91dGluZ0RhdGEpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCisJLy8gYnVmZmVyIGNvbXBsZXRpb24KKwlidWZmZXJDb21wbGV0aW9uKGxpc3RPZk91dFJvdXRpbmdEYXRhLCBsaXN0T2ZJblJvdXRpbmdEYXRhKTsKKworCitBVk1fSUZfREVCVUdfRkxBRzIoIENPTVBJTElORyAsIENPTU1VTklDQVRJT04gKQorCUFWTV9PU19UUkFDRSA8PCBUQUJfREVDUl9JTkRFTlQKKwkJCTw8ICJFTkQgQ09NUElMRSBJTlRFUkFDVElPTiBDT05ORUNUIFJPVVRJTkcgQ0FTVCIKKwkJCTw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRzIoIENPTVBJTElORyAsIENPTU1VTklDQVRJT04gKQorfQorCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ09NUElMRSBJTlRFUkFDVElPTiBDT05ORUNUIFNZTkNIUk9OT1VTCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCit2b2lkIENvbXBpbGVyT2ZJbnRlcmFjdGlvbjo6Y29tcGlsZVJvdXRlU3luY2hyb25vdXMoCisJCUV4ZWN1dGFibGVGb3JtICogdGhlRXhlY3V0YWJsZSwgSW5zdGFuY2VPZkNvbm5lY3QgKiBpb2MpCit7CisJY29uc3QgQ29ubmVjdG9yICogYUNvbm5lY3RvciA9IGlvYy0+Z2V0QXN0Q29ubmVjdG9yKCk7CisKK0FWTV9JRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgQ09NTVVOSUNBVElPTiApCisJQVZNX09TX1RSQUNFIDw8IElOQ1JfSU5ERU5UX1RBQgorCQkJPDwgIkNPTVBJTEUgSU5URVJBQ1RJT04gQ09OTkVDVCBTWU5DSFJPTk9VUyIgPDwgc3RkOjplbmRsOworCWFDb25uZWN0b3ItPnRvU3RyZWFtKEFWTV9PU19UUkFDRSk7CisJQVZNX09TX1RSQUNFIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgQ09NTVVOSUNBVElPTiApCisKKwlCRkxpc3Q6OmNvbnN0X3Jhd19pdGVyYXRvcjwgQ29tUG9pbnQgPiBpdENvbVBvaW50OworCUJGTGlzdDo6Y29uc3RfcmF3X2l0ZXJhdG9yPCBDb21Qb2ludCA+IGVuZEl0Q29tUG9pbnQ7CisKKwlMaXN0PCBSb3V0aW5nRGF0YSA+IGxpc3RPZlJvdXRpbmdEYXRhOworLy8JUm91dGluZ0RhdGEgdGhlUm91dGluZ0RhdGE7CisKKwkvLyBSb3V0aW5nIGZvciBhbGwgcG9ydAorCUNvbm5lY3Rvcjo6cm91dGVfaXRlcmF0b3IgaXRDb21Sb3V0ZSA9IGFDb25uZWN0b3ItPmJlZ2luKCk7CisJQ29ubmVjdG9yOjpyb3V0ZV9pdGVyYXRvciBlbmRJdENvbVJvdXRlID0gYUNvbm5lY3Rvci0+ZW5kKCk7CisJZm9yKCA7IGl0Q29tUm91dGUgIT0gZW5kSXRDb21Sb3V0ZSA7ICsraXRDb21Sb3V0ZSApCisJeworCQlpZiggKCppdENvbVJvdXRlKS0+aGFzQ2FzdCgpICkKKwkJeworCQkJaWYoICgqaXRDb21Sb3V0ZSktPmdldE1vZGlmaWVyKCkuaXNEaXJlY3Rpb25PdXRwdXQoKSApCisJCQl7CisJCQkJaW9jLT5nZXRPdXRwdXRDb21Sb3V0ZURhdGEoKS5zZXRDYXN0KAorCQkJCQkJKCppdENvbVJvdXRlKS0+Z2V0Q2FzdCgpICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaW9jLT5nZXRJbnB1dENvbVJvdXRlRGF0YSgpLnNldENhc3QoCisJCQkJCQkoKml0Q29tUm91dGUpLT5nZXRDYXN0KCkgKTsKKwkJCX0KKwkJfQorCisJCWl0Q29tUG9pbnQgPSAoKml0Q29tUm91dGUpLT5nZXRDb21Qb2ludHMoKS5iZWdpbigpOworCQllbmRJdENvbVBvaW50ID0gKCppdENvbVJvdXRlKS0+Z2V0Q29tUG9pbnRzKCkuZW5kKCk7CisJCWZvciggOyBpdENvbVBvaW50ICE9IGVuZEl0Q29tUG9pbnQgOyArK2l0Q29tUG9pbnQgKQorCQl7CisJCQljcmVhdGVSb3V0aW5nRGF0YShsaXN0T2ZSb3V0aW5nRGF0YSwgdGhlRXhlY3V0YWJsZSwKKwkJCQkJaW9jLCAoKml0Q29tUm91dGUpLCAoaXRDb21Qb2ludCkpOworCisvLwkJCXdoaWxlKCBsaXN0T2ZSb3V0aW5nRGF0YS5ub25lbXB0eSgpICkKKy8vCQkJeworLy8JCQkJbGlzdE9mUm91dGluZ0RhdGEucG9wX2ZpcnN0X3RvKCB0aGVSb3V0aW5nRGF0YSApOworLy8KKy8vCQkJCWlmKCAoKml0Q29tUm91dGUpLT5oYXNQcm90b2NvbCgpICkKKy8vCQkJCXsKKy8vCQkJCQkvLyBUT0RPIGZvciBvdGhlciBDT01fUFJPVE9DT0wKKy8vCQkJCX0KKy8vCQkJfQorCQl9CisJfQorCisJaWYoIGlvYy0+Z2V0UHJvdG9jb2woKSA9PSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfTVVMVElSRFZfS0lORCApCisJeworCQlpZiggKG5vdCBpb2MtPmdldE91dHB1dENvbVJvdXRlRGF0YSgpLmhhc0Nhc3QoKSkgJiYKKwkJCQlpb2MtPmdldE91dHB1dENvbVJvdXRlRGF0YSgpLmdldE1hY2hpbmVQb3J0cygpLnNpbmdsZXRvbigpICkKKwkJeworCQkJaW9jLT5nZXRPdXRwdXRDb21Sb3V0ZURhdGEoKS5zZXRDYXN0KAorCQkJCQlDb21Qcm90b2NvbDo6UFJPVE9DT0xfVU5JQ0FTVF9LSU5EICk7CisJCX0KKworCQlpZiggKG5vdCBpb2MtPmdldElucHV0Q29tUm91dGVEYXRhKCkuaGFzQ2FzdCgpKSAmJgorCQkJCWlvYy0+Z2V0SW5wdXRDb21Sb3V0ZURhdGEoKS5nZXRNYWNoaW5lUG9ydHMoKS5zaW5nbGV0b24oKSApCisJCXsKKwkJCWlvYy0+Z2V0SW5wdXRDb21Sb3V0ZURhdGEoKS5zZXRDYXN0KAorCQkJCQlDb21Qcm90b2NvbDo6UFJPVE9DT0xfVU5JQ0FTVF9LSU5EICk7CisJCX0KKwl9CisKKworQVZNX0lGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBDT01NVU5JQ0FUSU9OICkKKwlpb2MtPnRvU3RyZWFtKEFWTV9PU19UUkFDRSk7CisJQVZNX09TX1RSQUNFIDw8IFRBQl9ERUNSX0lOREVOVAorCQkJPDwgIkVORCBDT01QSUxFIElOVEVSQUNUSU9OIENPTk5FQ1QgU1lOQ0hST05PVVMiCisJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBDT01NVU5JQ0FUSU9OICkKK30KKworCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ09NUElMRSBJTlRFUkFDVElPTiBDT05ORUNUIFRSQU5TRkVSVAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLwordm9pZCBDb21waWxlck9mSW50ZXJhY3Rpb246OmNvbXBpbGVSb3V0ZVRyYW5zZmVydCgKKwkJRXhlY3V0YWJsZUZvcm0gKiB0aGVFeGVjdXRhYmxlLCBJbnN0YW5jZU9mQ29ubmVjdCAqIGlvYykKK3sKKwljb25zdCBDb25uZWN0b3IgKiBhQ29ubmVjdG9yID0gaW9jLT5nZXRBc3RDb25uZWN0b3IoKTsKKworQVZNX0lGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBDT01NVU5JQ0FUSU9OICkKKwlBVk1fT1NfVFJBQ0UgPDwgSU5DUl9JTkRFTlRfVEFCCisJCQk8PCAiQ09NUElMRSBJTlRFUkFDVElPTiBDT05ORUNUIFRSQU5TRkVSVCIgPDwgc3RkOjplbmRsOworCWFDb25uZWN0b3ItPnRvU3RyZWFtKEFWTV9PU19UUkFDRSk7CisJQVZNX09TX1RSQUNFIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgQ09NTVVOSUNBVElPTiApCisKKwlCRkxpc3Q6OmNvbnN0X3Jhd19pdGVyYXRvcjwgQ29tUG9pbnQgPiBpdENvbVBvaW50OworCUJGTGlzdDo6Y29uc3RfcmF3X2l0ZXJhdG9yPCBDb21Qb2ludCA+IGVuZEl0Q29tUG9pbnQ7CisKKwlMaXN0PCBSb3V0aW5nRGF0YSA+IGxpc3RPZlJvdXRpbmdEYXRhOworLy8JUm91dGluZ0RhdGEgdGhlUm91dGluZ0RhdGE7CisKKwkvLyBSb3V0aW5nIGZvciBhbGwgcG9ydAorCUNvbm5lY3Rvcjo6cm91dGVfaXRlcmF0b3IgaXRDb21Sb3V0ZSA9IGFDb25uZWN0b3ItPmJlZ2luKCk7CisJQ29ubmVjdG9yOjpyb3V0ZV9pdGVyYXRvciBlbmRJdENvbVJvdXRlID0gYUNvbm5lY3Rvci0+ZW5kKCk7CisJZm9yKCA7IGl0Q29tUm91dGUgIT0gZW5kSXRDb21Sb3V0ZSA7ICsraXRDb21Sb3V0ZSApCisJeworCQlpdENvbVBvaW50ID0gKCppdENvbVJvdXRlKS0+Z2V0Q29tUG9pbnRzKCkuYmVnaW4oKTsKKwkJZW5kSXRDb21Qb2ludCA9ICgqaXRDb21Sb3V0ZSktPmdldENvbVBvaW50cygpLmVuZCgpOworCQlmb3IoIDsgaXRDb21Qb2ludCAhPSBlbmRJdENvbVBvaW50IDsgKytpdENvbVBvaW50ICkKKwkJeworCQkJY3JlYXRlUm91dGluZ0RhdGEobGlzdE9mUm91dGluZ0RhdGEsIHRoZUV4ZWN1dGFibGUsCisJCQkJCWlvYywgKCppdENvbVJvdXRlKSwgKGl0Q29tUG9pbnQpKTsKKy8vCisvLwkJCXdoaWxlKCBsaXN0T2ZSb3V0aW5nRGF0YS5ub25lbXB0eSgpICkKKy8vCQkJeworLy8JCQkJbGlzdE9mUm91dGluZ0RhdGEucG9wX2ZpcnN0X3RvKCB0aGVSb3V0aW5nRGF0YSApOworLy8KKy8vCQkJCWlmKCB0aGVSb3V0aW5nRGF0YS5nZXRDb21Qb2ludCgpLT5pczwgT3V0cHV0Q29tUG9pbnQgPigpICkKKy8vCQkJCXsKKy8vCQkJCQl0aGVFeGVjdXRhYmxlLT5nZXRSb3V0ZXI0SW5zdGFuY2UoCisvLwkJCQkJCXRoZUluc3RhbmNlU3RhdGljLT5nZXRPZmZzZXQoKSktPnNldE91dHB1dFJvdXRpbmcoCisvLwkJCQkJCQkJdGhlQ29tUG9pbnRJbnN0YW5jZSwgdGhlUm91dGluZ0RhdGEpOworLy8JCQkJCWlvYy0+Z2V0T3V0cHV0Q29tUm91dGVEYXRhKCkuYXBwZW5kTWFjaGluZUNvbVBvaW50KAorLy8JCQkJCQkJdGhlUm91dGluZ0RhdGEuZ2V0TWFjaGluZVBvcnQoKSApOworLy8JCQkJfQorLy8KKy8vCQkJCWlmKCB0aGVSb3V0aW5nRGF0YS5nZXRDb21Qb2ludCgpLT5pczwgSW5wdXRDb21Qb2ludCA+KCkgKQorLy8JCQkJeworLy8JCQkJCXRoZUV4ZWN1dGFibGUtPmdldFJvdXRlcjRJbnN0YW5jZSgKKy8vCQkJCQkJdGhlSW5zdGFuY2VTdGF0aWMtPmdldE9mZnNldCgpKS0+c2V0SW5wdXRSb3V0aW5nKAorLy8JCQkJCQkJCXRoZUNvbVBvaW50SW5zdGFuY2UsIHRoZVJvdXRpbmdEYXRhKTsKKy8vCQkJCQlpb2MtPmdldElucHV0Q29tUm91dGVEYXRhKCkuYXBwZW5kTWFjaGluZUNvbVBvaW50KAorLy8JCQkJCQkJdGhlUm91dGluZ0RhdGEuZ2V0TWFjaGluZVBvcnQoKSApOworLy8JCQkJfQorLy8JCQl9CisJCX0KKwl9CisKKworQVZNX0lGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBDT01NVU5JQ0FUSU9OICkKKwlpb2MtPnRvU3RyZWFtKEFWTV9PU19UUkFDRSk7CisJQVZNX09TX1RSQUNFIDw8IFRBQl9ERUNSX0lOREVOVAorCQkJPDwgIkVORCBDT01QSUxFIElOVEVSQUNUSU9OIENPTk5FQ1QgVFJBTlNGRVJUIgorCQkJPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgQ09NTVVOSUNBVElPTiApCit9CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ09NUElMRSBJTlRFUkFDVElPTiBDT05ORUNUIEVOVklST05NRU5UCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK3ZvaWQgQ29tcGlsZXJPZkludGVyYWN0aW9uOjpjb21waWxlUm91dGVFbnZpcm9ubWVudCgKKwkJRXhlY3V0YWJsZUZvcm0gKiB0aGVFeGVjdXRhYmxlLCBJbnN0YW5jZU9mQ29ubmVjdCAqIGlvYykKK3sKKwljb25zdCBDb25uZWN0b3IgKiBhQ29ubmVjdG9yID0gaW9jLT5nZXRBc3RDb25uZWN0b3IoKTsKKworQVZNX0lGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBDT01NVU5JQ0FUSU9OICkKKwlBVk1fT1NfVFJBQ0UgPDwgSU5DUl9JTkRFTlRfVEFCCisJCQk8PCAiQ09NUElMRSBJTlRFUkFDVElPTiBDT05ORUNUIEVOVklST05NRU5UIiA8PCBzdGQ6OmVuZGw7CisJYUNvbm5lY3Rvci0+dG9TdHJlYW0oQVZNX09TX1RSQUNFKTsKKwlBVk1fT1NfVFJBQ0UgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBDT01NVU5JQ0FUSU9OICkKKworCUJGTGlzdDo6Y29uc3RfcmF3X2l0ZXJhdG9yPCBDb21Qb2ludCA+IGl0Q29tUG9pbnQ7CisJQkZMaXN0Ojpjb25zdF9yYXdfaXRlcmF0b3I8IENvbVBvaW50ID4gZW5kSXRDb21Qb2ludDsKKworCUxpc3Q8IFJvdXRpbmdEYXRhID4gbGlzdE9mUm91dGluZ0RhdGE7CisJUm91dGluZ0RhdGEgdGhlUm91dGluZ0RhdGE7CisKKwkvLyBSb3V0aW5nIGZvciBhbGwgcG9ydAorCUNvbm5lY3Rvcjo6cm91dGVfaXRlcmF0b3IgaXRDb21Sb3V0ZSA9IGFDb25uZWN0b3ItPmJlZ2luKCk7CisJQ29ubmVjdG9yOjpyb3V0ZV9pdGVyYXRvciBlbmRJdENvbVJvdXRlID0gYUNvbm5lY3Rvci0+ZW5kKCk7CisJZm9yKCA7IGl0Q29tUm91dGUgIT0gZW5kSXRDb21Sb3V0ZSA7ICsraXRDb21Sb3V0ZSApCisJeworCQlpdENvbVBvaW50ID0gKCppdENvbVJvdXRlKS0+Z2V0Q29tUG9pbnRzKCkuYmVnaW4oKTsKKwkJZW5kSXRDb21Qb2ludCA9ICgqaXRDb21Sb3V0ZSktPmdldENvbVBvaW50cygpLmVuZCgpOworCQlmb3IoIDsgaXRDb21Qb2ludCAhPSBlbmRJdENvbVBvaW50IDsgKytpdENvbVBvaW50ICkKKwkJeworCQkJY3JlYXRlUm91dGluZ0RhdGEobGlzdE9mUm91dGluZ0RhdGEsIHRoZUV4ZWN1dGFibGUsCisJCQkJCWlvYywgKCppdENvbVJvdXRlKSwgKGl0Q29tUG9pbnQpKTsKKworCQkJd2hpbGUoIGxpc3RPZlJvdXRpbmdEYXRhLm5vbmVtcHR5KCkgKQorCQkJeworCQkJCWxpc3RPZlJvdXRpbmdEYXRhLnBvcF9maXJzdF90byggdGhlUm91dGluZ0RhdGEgKTsKKworCQkJCS8vIEVSUk9SIFJFUE9SVElORworCQkJCWlmKCB0aGVSb3V0aW5nRGF0YS5nZXRQb3J0KCktPmdldE1vZGlmaWVyKCkuaXNub3REaXJlY3Rpb25LaW5kKAorCQkJCQkJKCppdENvbVJvdXRlKS0+Z2V0TW9kaWZpZXIoKS5nZXREaXJlY3Rpb25LaW5kKCkgKQorCQkJCQkmJiAobm90IHRoZVJvdXRpbmdEYXRhLmdldFBvcnQoKS0+CisJCQkJCQkJZ2V0TW9kaWZpZXIoKS5pc0RpcmVjdGlvbklub3V0KCkpICkKKwkJCQl7CisJCQkJCWluY3JFcnJvckNvdW50KCk7CisJCQkJCUFWTV9PU19XQVJOIDw8ICgqaXRDb21Sb3V0ZSktPmVycm9yTG9jYXRpb24oYUNvbm5lY3RvcikKKwkJCQkJCTw8ICJVbmV4cGVjdGVkIGEgIgorCQkJCQkJPDwgdGhlUm91dGluZ0RhdGEuZ2V0UG9ydCgpLT5nZXRNb2RpZmllcigpLnN0ckRpcmVjdGlvbigpCisJCQkJCQk8PCAiIFBPUlQgPDwgIgorCQkJCQkJPDwgdGhlUm91dGluZ0RhdGEuZ2V0UG9ydCgpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQkJCQk8PCAiID4+IGluIGFuICIKKwkJCQkJCTw8ICgqaXRDb21Sb3V0ZSktPmdldE1vZGlmaWVyKCkuc3RyRGlyZWN0aW9uKCkKKwkJCQkJCTw8ICIgQlVTIDw8ICIgPDwgYUNvbm5lY3Rvci0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJCQkJPDwgIiA+PiIgPDwgc3RkOjplbmRsOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworQVZNX0lGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBDT01NVU5JQ0FUSU9OICkKKwlpb2MtPnRvU3RyZWFtKEFWTV9PU19UUkFDRSk7CisJQVZNX09TX1RSQUNFIDw8IFRBQl9ERUNSX0lOREVOVAorCQkJPDwgIkVORCBDT01QSUxFIElOVEVSQUNUSU9OIENPTk5FQ1QgRU5WSVJPTk1FTlQiCisJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBDT01NVU5JQ0FUSU9OICkKK30KKworCisKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUT09MUyBGT1IgUk9VVElORyBEQVRBCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitSb3V0aW5nRGF0YSBDb21waWxlck9mSW50ZXJhY3Rpb246OmFkZFJvdXRpbmdEYXRhKAorCQlFeGVjdXRhYmxlRm9ybSAqIHRoZUV4ZWN1dGFibGUsIGJvb2wgaXNJbnN0YW5jZVN0YXRpY0ZsYWcsCisJCUluc3RhbmNlT2ZDb25uZWN0ICogaW9jLCBJbnN0YW5jZU9mTWFjaGluZSAqIHRoZUluc3RhbmNlU3RhdGljLAorCQlJbnN0YW5jZU9mUG9ydCAqIHRoZVBvcnRJbnN0YW5jZSwKKwkJTW9kaWZpZXI6OkRJUkVDVElPTl9LSU5EIGFEaXJlY3Rpb24pCit7CisJUm91dGluZ0RhdGEgdGhlUm91dGluZ0RhdGEoaW9jLCB0aGVJbnN0YW5jZVN0YXRpYywgdGhlUG9ydEluc3RhbmNlKTsKKworCWlmKCB0aGVQb3J0SW5zdGFuY2UtPmlzUG9ydCgpICkKKwl7CisJCVJvdXRlciAmIHRoZVJvdXRlciA9ICggaXNJbnN0YW5jZVN0YXRpY0ZsYWcgKQorCQkJPyB0aGVFeGVjdXRhYmxlLT5nZXRSb3V0ZXI0SW5zdGFuY2UodGhlSW5zdGFuY2VTdGF0aWMtPmdldE9mZnNldCgpKQorCQkJOiB0aGVFeGVjdXRhYmxlLT5nZXRSb3V0ZXI0TW9kZWwodGhlSW5zdGFuY2VTdGF0aWMtPmdldE9mZnNldCgpKTsKKworCQlyZXR1cm4oIGFkZFJvdXRpbmdEYXRhKHRoZVJvdXRlciwgdGhlUm91dGluZ0RhdGEsIGFEaXJlY3Rpb24pICk7CisJfQorCWVsc2UvLyBpZiggdGhlUG9ydEluc3RhbmNlLT5pc1NpZ25hbCgpICkKKwl7CisJCXRoZVJvdXRpbmdEYXRhLnNldE1JRCggdGhlUG9ydEluc3RhbmNlLT5nZXRSb3V0ZU9mZnNldCgpICsgMSApOworCisJCXJldHVybiggYWRkUm91dGluZ0RhdGEodGhlRXhlY3V0YWJsZS0+Z2V0Um91dGVyNFRoaXMoKSwKKwkJCQl0aGVSb3V0aW5nRGF0YSwgYURpcmVjdGlvbikgKTsKKwl9Cit9CisKKworUm91dGluZ0RhdGEgQ29tcGlsZXJPZkludGVyYWN0aW9uOjphZGRSb3V0aW5nRGF0YSgKKwkJUm91dGVyICYgdGhlUm91dGVyLCBSb3V0aW5nRGF0YSAmIHRoZVJvdXRpbmdEYXRhLAorCQlNb2RpZmllcjo6RElSRUNUSU9OX0tJTkQgYURpcmVjdGlvbikKK3sKKwlzd2l0Y2goIGFEaXJlY3Rpb24gKQorCXsKKwkJY2FzZSBNb2RpZmllcjo6RElSRUNUSU9OX0lOUFVUX0tJTkQ6CisJCXsKKwkJCXRoZVJvdXRlci5hcHBlbmRJbnB1dFJvdXRpbmcoCisJCQkJCXRoZVJvdXRpbmdEYXRhLmdldFBvcnQoKSwgdGhlUm91dGluZ0RhdGEpOworCisJCQl0aGVSb3V0aW5nRGF0YS5nZXRDb25uZWN0KCktPmdldElucHV0Q29tUm91dGVEYXRhKCkuCisJCQkJCWFwcGVuZE1hY2hpbmVQb3J0KCB0aGVSb3V0aW5nRGF0YS5nZXRNYWNoaW5lUG9ydCgpICk7CisKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBNb2RpZmllcjo6RElSRUNUSU9OX09VVFBVVF9LSU5EOgorCQl7CisJCQl0aGVSb3V0ZXIuYXBwZW5kT3V0cHV0Um91dGluZygKKwkJCQkJdGhlUm91dGluZ0RhdGEuZ2V0UG9ydCgpLCB0aGVSb3V0aW5nRGF0YSk7CisKKwkJCXRoZVJvdXRpbmdEYXRhLmdldENvbm5lY3QoKS0+Z2V0T3V0cHV0Q29tUm91dGVEYXRhKCkuCisJCQkJCWFwcGVuZE1hY2hpbmVQb3J0KCB0aGVSb3V0aW5nRGF0YS5nZXRNYWNoaW5lUG9ydCgpICk7CisKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBNb2RpZmllcjo6RElSRUNUSU9OX0lOT1VUX0tJTkQ6CisJCXsKKwkJCXRoZVJvdXRlci5hcHBlbmRJbnB1dFJvdXRpbmcoCisJCQkJCXRoZVJvdXRpbmdEYXRhLmdldFBvcnQoKSwgdGhlUm91dGluZ0RhdGEpOworCisJCQl0aGVSb3V0aW5nRGF0YS5nZXRDb25uZWN0KCktPmdldElucHV0Q29tUm91dGVEYXRhKCkuCisJCQkJCWFwcGVuZE1hY2hpbmVQb3J0KCB0aGVSb3V0aW5nRGF0YS5nZXRNYWNoaW5lUG9ydCgpICk7CisKKworCQkJdGhlUm91dGVyLmFwcGVuZE91dHB1dFJvdXRpbmcoCisJCQkJCXRoZVJvdXRpbmdEYXRhLmdldFBvcnQoKSwgdGhlUm91dGluZ0RhdGEpOworCisJCQl0aGVSb3V0aW5nRGF0YS5nZXRDb25uZWN0KCktPmdldE91dHB1dENvbVJvdXRlRGF0YSgpLgorCQkJCQlhcHBlbmRNYWNoaW5lUG9ydCggdGhlUm91dGluZ0RhdGEuZ2V0TWFjaGluZVBvcnQoKSApOworCisJCQlicmVhazsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCXRoZVJvdXRpbmdEYXRhLmdldENvbm5lY3QoKS0+CisJCQkJCWdldEFzdEVsZW1lbnQoKS0+ZXJyb3JMb2NhdGlvbihBVk1fT1NfV0FSTikKKwkJCQkJPDwgIlJvdXRpbmcgRGF0YSBmb3IgPCAiCisJCQkJCTw8IHN0cl9oZWFkZXIoIHRoZVJvdXRpbmdEYXRhLmdldFBvcnQoKSApIDw8ICIgPiAhIgorCQkJCQk8PCBzdGQ6OmVuZGw7CisKKwkJCUFWTV9PU19FWElUKCBGQUlMRUQgKQorCQkJCQk8PCAiVW5leHBlY3RlZCBQb3J0IE5hdHVyZSAhISEiCisJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4oIHRoZVJvdXRpbmdEYXRhICk7Cit9CisKKworCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNFQVJDSCBQT1JUIENPTk5FQ1QgSU5TVEFOQ0UKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworRXhlY3V0YWJsZUZvcm0gKiBDb21waWxlck9mSW50ZXJhY3Rpb246OmNvbXBpbGVDb21Qb2ludE1hY2hpbmUoCisJCUV4ZWN1dGFibGVGb3JtICogdGhlRXhlY3V0YWJsZSwgQ29tUG9pbnQgKiBhQ29tUG9pbnQsCisJCWJvb2wgJiBpc0luc3RhbmNlU3RhdGljRmxhZywgSW5zdGFuY2VPZk1hY2hpbmUgKiAmIGFNYWNoaW5lKQoreworCWlmKCBhQ29tUG9pbnQtPmhhc01hY2hpbmUoKSApCisJeworCQlNYWNoaW5lICogY29tTWFjaGluZSA9IGFDb21Qb2ludC0+Z2V0TWFjaGluZSgpOworCisJCUV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlNFBvcnQgPSB0aGVFeGVjdXRhYmxlOworCQl3aGlsZSggYW5FeGVjdXRhYmxlNFBvcnQgIT0gTlVMTCApCisJCXsKKwkJCWlmKCBhbkV4ZWN1dGFibGU0UG9ydC0+aXNBc3RFbGVtZW50KCBjb21NYWNoaW5lICkKKwkJCQkmJiBhbkV4ZWN1dGFibGU0UG9ydC0+aGFzSW5zdGFuY2VTdGF0aWNUaGlzKCkgKQorCQkJeworCQkJCWlzSW5zdGFuY2VTdGF0aWNGbGFnID0gdHJ1ZTsKKwkJCQlhTWFjaGluZSA9IGFuRXhlY3V0YWJsZTRQb3J0LT4KKwkJCQkJCWdldEluc3RhbmNlU3RhdGljVGhpcygpLnJhd01hY2hpbmUoKTsKKworCQkJCXJldHVybiggYW5FeGVjdXRhYmxlNFBvcnQgKTsKKwkJCX0KKwkJCWFuRXhlY3V0YWJsZTRQb3J0ID0gYW5FeGVjdXRhYmxlNFBvcnQtPmdldEV4ZWN1dGFibGVDb250YWluZXIoKTsKKwkJfQorCisJCWlmKCBjb21NYWNoaW5lLT5nZXRTcGVjaWZpZXIoKS5oYXNEZXNpZ25JbnN0YW5jZVN0YXRpYygpICkKKwkJeworCQkJaXNJbnN0YW5jZVN0YXRpY0ZsYWcgPSB0cnVlOworCisJCQlhTWFjaGluZSA9IHRoZUV4ZWN1dGFibGUtPgorCQkJCQlnZXRCeUFzdEluc3RhbmNlU3RhdGljKCBjb21NYWNoaW5lICkucmF3TWFjaGluZSgpOworCQl9CisJCWVsc2UKKwkJeworCQkJaXNJbnN0YW5jZVN0YXRpY0ZsYWcgPSBmYWxzZTsKKworCQkJYU1hY2hpbmUgPSB0aGVFeGVjdXRhYmxlLT5nZXRJbnN0YW5jZU1vZGVsKCkuCisJCQkJCWdldEJ5QXN0RWxlbWVudCggY29tTWFjaGluZSApLnJhd01hY2hpbmUoKTsKKworCQkJaWYoIGFNYWNoaW5lID09IE5VTEwgKQorCQkJeworCQkJCUV4ZWN1dGFibGVGb3JtICogYU1hY2hpbmVFeGVjID0gZ2V0U3ltYm9sVGFibGUoKS4KKwkJCQkJc2VhcmNoRXhlY3V0YWJsZShjb21NYWNoaW5lKS50b19wdHI8IEV4ZWN1dGFibGVGb3JtID4oKTsKKworCQkJCWlmKCBhTWFjaGluZUV4ZWMgIT0gTlVMTCApCisJCQkJeworCQkJCQlpZiggYU1hY2hpbmVFeGVjLT5pc0FuY2VzdG9yT2YodGhlRXhlY3V0YWJsZSkgKQorCQkJCQl7CisJCQkJCQlpc0luc3RhbmNlU3RhdGljRmxhZyA9IHRydWU7CisJCQkJCQlhTWFjaGluZSA9IHRoZUV4ZWN1dGFibGUtPgorCQkJCQkJCQlnZXRJbnN0YW5jZVN0YXRpY1RoaXMoKS5yYXdNYWNoaW5lKCk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlhTWFjaGluZSA9IG5ldyBJbnN0YW5jZU9mTWFjaGluZSh0aGVFeGVjdXRhYmxlLAorCQkJCQkJCWFNYWNoaW5lRXhlYy0+Z2V0QXN0TWFjaGluZSgpLCBhTWFjaGluZUV4ZWMsCisJCQkJCQkJTlVMTCwgdGhlRXhlY3V0YWJsZS0+Z2V0SW5zdGFuY2VNb2RlbCgpLnNpemUoKSk7CisKKwkJCQkJCXRoZUV4ZWN1dGFibGUtPnNhdmVJbnN0YW5jZU1vZGVsKGFNYWNoaW5lKTsKKworCQkJCQkJYWRkTWFjaGluZU1vZGVsUm91dGVyKHRoZUV4ZWN1dGFibGUsIGFNYWNoaW5lKTsKKwkJCQkJfQorCisJCQkJCXJldHVybiggYU1hY2hpbmVFeGVjICk7CisJCQkJfQorCisJCQkJZWxzZQorCQkJCXsKKwkJCQkJaW5jckVycm9yQ291bnQoKTsKKwkJCQkJQVZNX09TX1dBUk4gPDwgYUNvbVBvaW50LT5lcnJvckxvY2F0aW9uKCBhQ29tUG9pbnQgKQorCQkJCQkJCTw8ICJVbmZvdW5kIGluIHRoZSBDT00gUE9JTlQgPCAiCisJCQkJCQkJPDwgc3RyX2hlYWRlciggY29tTWFjaGluZSApIDw8ICIgPiAhIgorCQkJCQkJCTw8IHN0ZDo6ZW5kbDsKKworCQkJCQlyZXR1cm4oIE5VTEwgKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiggYU1hY2hpbmUgIT0gTlVMTCApCisJCXsKKwkJCWlmKCBhTWFjaGluZS0+aGFzRXhlY3V0YWJsZSgpICkKKwkJCXsKKwkJCQlyZXR1cm4oIGFNYWNoaW5lLT5nZXRFeGVjdXRhYmxlKCkgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpbmNyRXJyb3JDb3VudCgpOworCQkJCUFWTV9PU19XQVJOCisJCQkJCTw8IGFDb21Qb2ludC0+ZXJyb3JMb2NhdGlvbiggYUNvbVBvaW50ICkKKwkJCQkJPDwgIlVuZXhwZWN0ZWQgaW4gdGhlIENPTVAgUE9JTlQgPCAiCisJCQkJCTw8IHN0cl9oZWFkZXIoIGNvbU1hY2hpbmUgKQorCQkJCQk8PCAiID4gd2l0aG91dCBhIG1vZGVsIHdpdGggYW4gaW50ZXJmYWNlICEiCisJCQkJCTw8IHN0ZDo6ZW5kbDsKKworCQkJCXJldHVybiggTlVMTCApOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJaW5jckVycm9yQ291bnQoKTsKKwkJCUFWTV9PU19XQVJOIDw8IGFDb21Qb2ludC0+ZXJyb3JMb2NhdGlvbiggYUNvbVBvaW50ICkKKwkJCQkJPDwgIlVuZm91bmQgaW4gdGhlIENPTSBQT0lOVCA8ICIKKwkJCQkJPDwgc3RyX2hlYWRlciggY29tTWFjaGluZSApIDw8ICIgPiAhIgorCQkJCQk8PCBzdGQ6OmVuZGw7CisKKwkJCXJldHVybiggTlVMTCApOworCQl9CisJfQorCisJZWxzZSBpZiggYUNvbVBvaW50LT5oYXNNYWNoaW5lUG9ydFF1YWxpZmllZE5hbWVJRCgpICkKKwl7CisJCWlmKCBhQ29tUG9pbnQtPmdldE1hY2hpbmVQb3J0UXVhbGlmaWVkTmFtZUlEKCkuaXM8IElkZW50aWZpZXIgPigpICkKKwkJeworCQkJaWYoIHRoZUV4ZWN1dGFibGUtPmhhc0luc3RhbmNlU3RhdGljVGhpcygpICkKKwkJCXsKKwkJCQlpc0luc3RhbmNlU3RhdGljRmxhZyA9IHRydWU7CisJCQkJYU1hY2hpbmUgPSB0aGVFeGVjdXRhYmxlLT5nZXRJbnN0YW5jZVN0YXRpY1RoaXMoKS5yYXdNYWNoaW5lKCk7CisKKwkJCQlFeGVjdXRhYmxlRm9ybSAqIGNvbUV4ZWMgPSB0aGVFeGVjdXRhYmxlOworCQkJCXdoaWxlKCBjb21FeGVjICE9IE5VTEwgKQorCQkJCXsKKwkJCQkJaWYoIGNvbUV4ZWMtPmdldFBvcnQoKS5nZXRCeU5hbWVJRCggYUNvbVBvaW50LT4KKwkJCQkJCQlnZXRNYWNoaW5lUG9ydFF1YWxpZmllZE5hbWVJRCgpLnN0cigpICkudmFsaWQoKSApCisJCQkJCXsKKwkJCQkJCWFNYWNoaW5lID0gdGhlRXhlY3V0YWJsZS0+CisJCQkJCQkJCWdldEluc3RhbmNlU3RhdGljVGhpcygpLnJhd01hY2hpbmUoKTsKKwkJCQkJCXJldHVybiggY29tRXhlYyApOworCQkJCQl9CisJCQkJCWNvbUV4ZWMgPSBjb21FeGVjLT5nZXRFeGVjdXRhYmxlQ29udGFpbmVyKCk7CisJCQkJfQorCQkJfQorCisJCQlpbmNyRXJyb3JDb3VudCgpOworCQkJQVZNX09TX1dBUk4gPDwgYUNvbVBvaW50LT5lcnJvckxvY2F0aW9uKCBhQ29tUG9pbnQgKQorCQkJCQk8PCAiVW5mb3VuZCBpbiB0aGUgQ09NIFBPSU5UIHRoZSBwb3J0IGNvbnRhaW5lZCBtYWNoaW5lIDwgIgorCQkJCQk8PCBhQ29tUG9pbnQtPmdldE1hY2hpbmVQb3J0UXVhbGlmaWVkTmFtZUlEKCkgPDwgIiA+ICEiCisJCQkJCTw8IHN0ZDo6ZW5kbDsKKworCQkJcmV0dXJuKCBOVUxMICk7CisJCX0KKworCisJCXN0ZDo6c3RyaW5nIG1hY2hpbmVGUU47CisKKwkJaWYoIGFDb21Qb2ludC0+Z2V0TWFjaGluZVBvcnRRdWFsaWZpZWROYW1lSUQoKS4KKwkJCQlpczwgUXVhbGlmaWVkSWRlbnRpZmllciA+KCkgKQorCQl7CisJCQltYWNoaW5lRlFOID0gYUNvbVBvaW50LT5nZXRNYWNoaW5lUG9ydFF1YWxpZmllZE5hbWVJRCgpLnRvX3B0cjwKKwkJCQkJUXVhbGlmaWVkSWRlbnRpZmllciA+KCktPmdldENvbnRhaW5lclF1YWxpZmllZE5hbWVJRCgpOworCQl9CisJCWVsc2UgaWYoIGFDb21Qb2ludC0+Z2V0TWFjaGluZVBvcnRRdWFsaWZpZWROYW1lSUQoKS4KKwkJCQkJaXM8IFVuaUZvcm1JZGVudGlmaWVyID4oKSApCisJCXsKKwkJCW1hY2hpbmVGUU4gPSBhQ29tUG9pbnQtPmdldE1hY2hpbmVQb3J0UXVhbGlmaWVkTmFtZUlEKCkuCisJCQkJCXRvX3B0cjwgVW5pRm9ybUlkZW50aWZpZXIgPigpLT50b1N0cmluZ0NvbnRhaW5lcigpOworCQl9CisKKwkJaWYoIG5vdCBtYWNoaW5lRlFOLmVtcHR5KCkgKQorCQl7CisJCQlhTWFjaGluZSA9IHRoZUV4ZWN1dGFibGUtPmdldEluc3RhbmNlU3RhdGljKCkuCisJCQkJCWdldEJ5RlFOYW1lSUQoIG1hY2hpbmVGUU4gKS5yYXdNYWNoaW5lKCk7CisKKwkJCWlmKCBhTWFjaGluZSA9PSBOVUxMICkKKwkJCXsKKwkJCQlpc0luc3RhbmNlU3RhdGljRmxhZyA9IGZhbHNlOworCisJCQkJYU1hY2hpbmUgPSB0aGVFeGVjdXRhYmxlLT5nZXRJbnN0YW5jZU1vZGVsKCkuCisJCQkJCQlnZXRCeUZRTmFtZUlEKCBtYWNoaW5lRlFOICkucmF3TWFjaGluZSgpOworCisJCQkJaWYoIGFNYWNoaW5lID09IE5VTEwgKQorCQkJCXsKKwkJCQkJRXhlY3V0YWJsZUZvcm0gKiB0aGVNYWNoaW5lTW9kZWwgPSBnZXRTeW1ib2xUYWJsZSgpLgorCQkJCQkJc2VhcmNoRXhlY3V0YWJsZShtYWNoaW5lRlFOKS50b19wdHI8IEV4ZWN1dGFibGVGb3JtID4oKTsKKworCQkJCQlpZiggdGhlTWFjaGluZU1vZGVsICE9IE5VTEwgKQorCQkJCQl7CisJCQkJCQlhTWFjaGluZSA9IG5ldyBJbnN0YW5jZU9mTWFjaGluZSh0aGVFeGVjdXRhYmxlLAorCQkJCQkJCQl0aGVNYWNoaW5lTW9kZWwtPmdldEFzdE1hY2hpbmUoKSwKKwkJCQkJCQkJdGhlTWFjaGluZU1vZGVsLCBOVUxMLAorCQkJCQkJCQl0aGVFeGVjdXRhYmxlLT5nZXRJbnN0YW5jZU1vZGVsKCkuc2l6ZSgpKTsKKworCQkJCQkJdGhlRXhlY3V0YWJsZS0+c2F2ZUluc3RhbmNlTW9kZWwoYU1hY2hpbmUpOworCisJCQkJCQlhZGRNYWNoaW5lTW9kZWxSb3V0ZXIodGhlRXhlY3V0YWJsZSwgYU1hY2hpbmUpOworCisJCQkJCQlyZXR1cm4oIHRoZU1hY2hpbmVNb2RlbCApOworCQkJCQl9CisKKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlpbmNyRXJyb3JDb3VudCgpOworCQkJCQkJQVZNX09TX1dBUk4gPDwgYUNvbVBvaW50LT5lcnJvckxvY2F0aW9uKCBhQ29tUG9pbnQgKQorCQkJCQkJCQk8PCAiVW5mb3VuZCBpbiB0aGUgQ09NIFBPSU5UIHRoZSBtYWNoaW5lIDwgIgorCQkJCQkJCQk8PCBtYWNoaW5lRlFOIDw8ICIgPiAhIiA8PCBzdGQ6OmVuZGw7CisKKwkJCQkJCXJldHVybiggTlVMTCApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYoIGFNYWNoaW5lICE9IE5VTEwgKQorCQl7CisJCQlpZiggYU1hY2hpbmUtPmhhc0V4ZWN1dGFibGUoKSApCisJCQl7CisJCQkJcmV0dXJuKCBhTWFjaGluZS0+Z2V0RXhlY3V0YWJsZSgpICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaW5jckVycm9yQ291bnQoKTsKKwkJCQlBVk1fT1NfV0FSTgorCQkJCQk8PCBhQ29tUG9pbnQtPmVycm9yTG9jYXRpb24oIGFDb21Qb2ludCApCisJCQkJCTw8ICJVbmV4cGVjdGVkIGluIHRoZSBDT01QIFBPSU5UIDwgIgorCQkJCQk8PCBhQ29tUG9pbnQtPmdldE1hY2hpbmVQb3J0UXVhbGlmaWVkTmFtZUlEKCkuc3RyKCkKKwkJCQkJPDwgIiA+IGEgbWFjaGluZSB3aXRob3V0IGEgbW9kZWwgd2l0aCBhbiBpbnRlcmZhY2UgISIKKwkJCQkJPDwgc3RkOjplbmRsOworCisJCQkJcmV0dXJuKCBOVUxMICk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlpbmNyRXJyb3JDb3VudCgpOworCQkJQVZNX09TX1dBUk4gPDwgYUNvbVBvaW50LT5lcnJvckxvY2F0aW9uKCBhQ29tUG9pbnQgKQorCQkJCQk8PCAiVW5mb3VuZCBpbiB0aGUgQ09NIFBPSU5UIDwgIgorCQkJCQk8PCBhQ29tUG9pbnQtPmdldE1hY2hpbmVQb3J0UXVhbGlmaWVkTmFtZUlEKCkuc3RyKCkKKwkJCQkJPDwgIiA+ICBhIG1hY2hpbmUgISIgPDwgc3RkOjplbmRsOworCisJCQlyZXR1cm4oIE5VTEwgKTsKKwkJfQorCisJfQorCisJcmV0dXJuKCAoYU1hY2hpbmUgIT0gTlVMTCkgPyBhTWFjaGluZS0+Z2V0RXhlY3V0YWJsZSgpIDogTlVMTCApOworfQorCisKK2Jvb2wgQ29tcGlsZXJPZkludGVyYWN0aW9uOjpjb21waWxlQ29tUG9pbnRQb3J0KAorCQlFeGVjdXRhYmxlRm9ybSAqIHRoZUV4ZWN1dGFibGU0UG9ydCwKKwkJQ29tUG9pbnQgKiBhQ29tUG9pbnQsIEluc3RhbmNlT2ZQb3J0ICogJiB0aGVQb3J0SW5zdGFuY2UpCit7CisJaWYoIGFDb21Qb2ludC0+aGFzUG9ydCgpICkKKwl7CisJCWlmKCBhQ29tUG9pbnQtPmdldFBvcnQoKS0+aXNCYXNpYygpICkKKwkJeworCQkJdGhlUG9ydEluc3RhbmNlID0gZ2V0U3ltYm9sVGFibGUoKS5zZWFyY2hQb3J0Q29ubmVjdG9ySW5zdGFuY2UoCisJCQkJCXRoZUV4ZWN1dGFibGU0UG9ydCwgYUNvbVBvaW50LT5nZXRQb3J0KCkpOworCisJCQlpZiggdGhlUG9ydEluc3RhbmNlID09IE5VTEwgKQorCQkJeworCQkJCWluY3JFcnJvckNvdW50KCk7CisJCQkJQVZNX09TX1dBUk4KKwkJCQkJPDwgYUNvbVBvaW50LT5lcnJvckxvY2F0aW9uKCBhQ29tUG9pbnQgKQorCQkJCQk8PCAiVW5mb3VuZCBpbiB0aGUgQ09NIFBPSU5UIHRoZSBwb3J0IDwgIgorCQkJCQk8PCBhQ29tUG9pbnQtPmdldFBvcnQoKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJCQk8PCAiID4gaW4gdGhlIG1vZGVsICIKKwkJCQkJPDwgc3RyX2hlYWRlciggYUNvbVBvaW50LT5nZXRNYWNoaW5lKCkgKQorCQkJCQk8PCBzdGQ6OmVuZGw7CisJCQl9CisJCX0KKwkJZWxzZSAvL2lmKCBhQ29tUG9pbnQtPmdldFBvcnQoKS0+aXNDb21wb3NpdGUoKSApCisJCXsKKwkJCWluY3JFcnJvckNvdW50KCk7CisJCQlBVk1fT1NfV0FSTiA8PCBhQ29tUG9pbnQtPmVycm9yTG9jYXRpb24oIGFDb21Qb2ludCApCisJCQkJCQk8PCAiVW5leHBlY3RlZCB0aGUgQ09NUE9TSVRFIFBPUlQgPDwgIgorCQkJCQkJPDwgc3RyX2hlYWRlciggdGhlUG9ydEluc3RhbmNlICkgPDwgIiA+PiBhcyBDT00gUE9JTlQgIgorCQkJCQkJPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorCWVsc2UgaWYoIGFDb21Qb2ludC0+aGFzTWFjaGluZVBvcnRRdWFsaWZpZWROYW1lSUQoKSApCisJeworCQlzdGQ6OnN0cmluZyBwb3J0SWQ7CisKKwkJaWYoIGFDb21Qb2ludC0+Z2V0TWFjaGluZVBvcnRRdWFsaWZpZWROYW1lSUQoKS5pczwgSWRlbnRpZmllciA+KCkgKQorCQl7CisJCQlwb3J0SWQ9IGFDb21Qb2ludC0+Z2V0TWFjaGluZVBvcnRRdWFsaWZpZWROYW1lSUQoKS5zdHIoKTsKKwkJfQorCQlpZiggYUNvbVBvaW50LT5nZXRNYWNoaW5lUG9ydFF1YWxpZmllZE5hbWVJRCgpLgorCQkJCWlzPCBRdWFsaWZpZWRJZGVudGlmaWVyID4oKSApCisJCXsKKwkJCXBvcnRJZCA9IGFDb21Qb2ludC0+Z2V0TWFjaGluZVBvcnRRdWFsaWZpZWROYW1lSUQoKS4KKwkJCQkJdG9fcHRyPCBRdWFsaWZpZWRJZGVudGlmaWVyID4oKS0+Z2V0TmFtZUlEKCk7CisJCX0KKwkJZWxzZSBpZiggYUNvbVBvaW50LT5nZXRNYWNoaW5lUG9ydFF1YWxpZmllZE5hbWVJRCgpLgorCQkJCWlzPCBVbmlGb3JtSWRlbnRpZmllciA+KCkgKQorCQl7CisJCQlwb3J0SWQgPSBhQ29tUG9pbnQtPmdldE1hY2hpbmVQb3J0UXVhbGlmaWVkTmFtZUlEKCkuCisJCQkJCXRvX3B0cjwgVW5pRm9ybUlkZW50aWZpZXIgPigpLT50b1N0cmluZ0lkKCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpbmNyRXJyb3JDb3VudCgpOworCQkJQVZNX09TX1dBUk4gPDwgYUNvbVBvaW50LT5lcnJvckxvY2F0aW9uKCBhQ29tUG9pbnQgKQorCQkJCQk8PCAiVW5mb3VuZCBpbiB0aGUgQ09OTkVDVCB0aGUgcG9ydCA8ICIKKwkJCQkJPDwgYUNvbVBvaW50LT5nZXRNYWNoaW5lUG9ydFF1YWxpZmllZE5hbWVJRCgpCisJCQkJCTw8ICIgPiBpbiB0aGUgbW9kZWwgb2YgPCAiCisJCQkJCTw8IHN0cl9oZWFkZXIoIHRoZUV4ZWN1dGFibGU0UG9ydCApIDw8ICIgPiAhIgorCQkJCQk8PCBzdGQ6OmVuZGw7CisKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCisJCXN0ZDo6c3RyaW5nIHBvcnRVZmkgPQorCQkJdGhlRXhlY3V0YWJsZTRQb3J0LT5nZXRBc3RGdWxseVF1YWxpZmllZE5hbWVJRCgpICsgIi4iICsgcG9ydElkOworCisJCXRoZVBvcnRJbnN0YW5jZSA9IGdldFN5bWJvbFRhYmxlKCkuc2VhcmNoUG9ydENvbm5lY3Rvckluc3RhbmNlKAorCQkJCXRoZUV4ZWN1dGFibGU0UG9ydCwgcG9ydFVmaSk7CisKKwkJaWYoIHRoZVBvcnRJbnN0YW5jZSA9PSBOVUxMICkKKwkJeworCQkJaW5jckVycm9yQ291bnQoKTsKKwkJCUFWTV9PU19XQVJOIDw8IGFDb21Qb2ludC0+ZXJyb3JMb2NhdGlvbiggYUNvbVBvaW50ICkKKwkJCQkJPDwgIlVuZm91bmQgaW4gdGhlIENPTk5FQ1QgdGhlIHBvcnQgPCAiCisJCQkJCTw8IHBvcnRVZmkgPDwgIiA+IGluIHRoZSBtb2RlbCBvZiA8ICIKKwkJCQkJPDwgc3RyX2hlYWRlciggYUNvbVBvaW50LT5nZXRNYWNoaW5lKCkgKSA8PCAiID4gISIKKwkJCQkJPDwgc3RkOjplbmRsOworCisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIHRoZVBvcnRJbnN0YW5jZSAhPSBOVUxMICk7Cit9CisKKworCit2b2lkIENvbXBpbGVyT2ZJbnRlcmFjdGlvbjo6Y3JlYXRlUm91dGluZ0RhdGEoCisJCUxpc3Q8IFJvdXRpbmdEYXRhID4gJiBsaXN0T2ZSb3V0aW5nRGF0YSwKKwkJRXhlY3V0YWJsZUZvcm0gKiB0aGVFeGVjdXRhYmxlLCBJbnN0YW5jZU9mQ29ubmVjdCAqIGlvYywKKwkJQ29tUm91dGUgKiBhQ29tUm91dGUsIENvbVBvaW50ICogYUNvbVBvaW50KQoreworCWJvb2wgaXNJbnN0YW5jZVN0YXRpY0ZsYWcgPSB0cnVlOworCisJSW5zdGFuY2VPZk1hY2hpbmUgKiBhbkluc3RhbmNlU3RhdGljID0gTlVMTDsKKworCUV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlNFBvcnQgPSBjb21waWxlQ29tUG9pbnRNYWNoaW5lKAorCQkJdGhlRXhlY3V0YWJsZSwgYUNvbVBvaW50LCBpc0luc3RhbmNlU3RhdGljRmxhZywgYW5JbnN0YW5jZVN0YXRpYyk7CisJaWYoIGFuRXhlY3V0YWJsZTRQb3J0ICE9IE5VTEwgKQorCXsKKwkJaWYoIGFDb21Qb2ludC0+aXNNYWNoaW5lQWxsUG9ydCgpICkKKwkJeworCQkJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgaXRQb3J0OworCQkJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgZW5kUG9ydDsKKworCQkJZG8KKwkJCXsKKwkJCQlpdFBvcnQgPSBhbkV4ZWN1dGFibGU0UG9ydC0+Z2V0UG9ydCgpLmJlZ2luKCk7CisJCQkJZW5kUG9ydCA9IGFuRXhlY3V0YWJsZTRQb3J0LT5nZXRQb3J0KCkuZW5kKCk7CisJCQkJZm9yKCA7IGl0UG9ydCAhPSBlbmRQb3J0IDsgKytpdFBvcnQpCisJCQkJeworCQkJCQlpZiggKCppdFBvcnQpLnBvcnQoKS5pc1NpZ25hbCgpCisJCQkJCQl8fCAoKCppdFBvcnQpLmdldENvbnRhaW5lcigpID09IHRoZUV4ZWN1dGFibGUpICkKKwkJCQkJeworCQkJCQkJaWYoICgqaXRQb3J0KS5nZXRNb2RpZmllcigpLmhhc0RpcmVjdGlvbktpbmQoCisJCQkJCQkJCWFDb21Sb3V0ZS0+Z2V0TW9kaWZpZXIoKS5nZXREaXJlY3Rpb25LaW5kKCkgKSApCisJCQkJCQl7CisJCQkJCQkJbGlzdE9mUm91dGluZ0RhdGEuYXBwZW5kKCBhZGRSb3V0aW5nRGF0YSgKKwkJCQkJCQkJdGhlRXhlY3V0YWJsZSwgaXNJbnN0YW5jZVN0YXRpY0ZsYWcsIGlvYywKKwkJCQkJCQkJYW5JbnN0YW5jZVN0YXRpYywgKCppdFBvcnQpLnJhd1BvcnQoKSwKKwkJCQkJCQkJYUNvbVJvdXRlLT5nZXRNb2RpZmllcigpLmdldERpcmVjdGlvbktpbmQoKSkgKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlpbmNyV2FybmluZ0NvdW50KCk7CisJCQkJCQkJQVZNX09TX1dBUk4gPDwgYUNvbVBvaW50LT53YXJuaW5nTG9jYXRpb24oYUNvbVBvaW50KQorCQkJCQkJCQk8PCAiSW5jb21wYXRpYmlsaXR5IGJldHdlZW4gdGhlIENvbVJvdXRlIDw8ICIKKwkJCQkJCQkJPDwgYUNvbVJvdXRlLT5zdHIoKSA8PCAiID4+ICYgdGhlIENvbVBvaW50IDw8ICIKKwkJCQkJCQkJPDwgc3RyX2hlYWRlciggKml0UG9ydCApIDw8ICIgPj4gTkFUVVJFICIKKwkJCQkJCQkJPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKworCQkJCWFuRXhlY3V0YWJsZTRQb3J0ID0gYW5FeGVjdXRhYmxlNFBvcnQtPmdldEV4ZWN1dGFibGVDb250YWluZXIoKTsKKwkJCX0KKwkJCXdoaWxlKCBhbkV4ZWN1dGFibGU0UG9ydCAhPSBOVUxMICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlJbnN0YW5jZU9mUG9ydCAqIGFQb3J0SW5zdGFuY2UgPSBOVUxMOworCisJCQlpZiggY29tcGlsZUNvbVBvaW50UG9ydCgKKwkJCQkJYW5FeGVjdXRhYmxlNFBvcnQsIGFDb21Qb2ludCwgYVBvcnRJbnN0YW5jZSkgKQorCQkJeworCQkJCWlmKCBhUG9ydEluc3RhbmNlLT5nZXRNb2RpZmllcigpLmlzRGlyZWN0aW9uS2luZCgKKwkJCQkJCWFDb21Sb3V0ZS0+Z2V0TW9kaWZpZXIoKS5nZXREaXJlY3Rpb25LaW5kKCkgKQorCQkJCQl8fCBhUG9ydEluc3RhbmNlLT5nZXRNb2RpZmllcigpLmlzRGlyZWN0aW9uSW5vdXQoKSApCisJCQkJeworCQkJCQlsaXN0T2ZSb3V0aW5nRGF0YS5hcHBlbmQoIGFkZFJvdXRpbmdEYXRhKAorCQkJCQkJCXRoZUV4ZWN1dGFibGUsIGlzSW5zdGFuY2VTdGF0aWNGbGFnLAorCQkJCQkJCWlvYywgYW5JbnN0YW5jZVN0YXRpYywgYVBvcnRJbnN0YW5jZSwKKwkJCQkJCQlhQ29tUm91dGUtPmdldE1vZGlmaWVyKCkuZ2V0RGlyZWN0aW9uS2luZCgpKSApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlpbmNyV2FybmluZ0NvdW50KCk7CisJCQkJCUFWTV9PU19XQVJOIDw8IGFDb21Qb2ludC0+d2FybmluZ0xvY2F0aW9uKCBhQ29tUG9pbnQgKQorCQkJCQkJCTw8ICJJbmNvbXBhdGliaWxpdHkgYmV0d2VlbiB0aGUgQ29tUm91dGUgPDwgIgorCQkJCQkJCTw8IGFDb21Sb3V0ZS0+c3RyKCkgPDwgIiA+PiAmIHRoZSBDb21Qb2ludCA8PCAiCisJCQkJCQkJPDwgc3RyX2hlYWRlciggYVBvcnRJbnN0YW5jZSApIDw8ICIgPj4gTkFUVVJFICIKKwkJCQkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQT1NULUNPTVBJTEFUSU9OCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK3ZvaWQgQ29tcGlsZXJPZkludGVyYWN0aW9uOjpzZXRVbmRlZmluZWRMb2NhbFJvdXRlVG9FbnYoY29uc3QgUm91dGVyICYgYVJvdXRlcikKK3sKKwlJbnN0YW5jZU9mTWFjaGluZSAqIGFNYWNoaW5lID0gYVJvdXRlci5nZXRNYWNoaW5lKCk7CisKKwlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBpdFBvcnQgPQorCQkJYU1hY2hpbmUtPmdldEV4ZWN1dGFibGUoKS0+Z2V0UG9ydCgpLmJlZ2luKCk7CisJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgZW5kUG9ydCA9CisJCQlhTWFjaGluZS0+Z2V0RXhlY3V0YWJsZSgpLT5nZXRQb3J0KCkuZW5kKCk7CisKKwlmb3IoIDsgaXRQb3J0ICE9IGVuZFBvcnQgOyArK2l0UG9ydCApCisJeworCQlpZiggKCppdFBvcnQpLnBvcnQoKS5pc1BvcnQoKSApCisJCXsKKwkJCWlmKCAoKml0UG9ydCkuZ2V0TW9kaWZpZXIoKS5oYXNEaXJlY3Rpb25JbnB1dCgpCisJCQkJJiYgYVJvdXRlci5oYXNudElucHV0Um91dGluZyggKCppdFBvcnQpLmdldFJvdXRlT2Zmc2V0KCkgKSApCisJCQl7CisJCQkJYVJvdXRlci5zZXRJbnB1dFJvdXRpbmcoKCppdFBvcnQpLmdldFJvdXRlT2Zmc2V0KCksCisJCQkJCQlSb3V0aW5nRGF0YSgwLCBhTWFjaGluZSwgKCppdFBvcnQpLnJhd1BvcnQoKSwKKwkJCQkJCQkJQ29tUHJvdG9jb2w6OlBST1RPQ09MX0VOVklST05NRU5UX0tJTkQpICk7CisJCQl9CisJCQkvLyBOTyBFTFNFIGJlY2F1c2Ugb2YgSU5PVVQgUE9SVAorCQkJaWYoICgqaXRQb3J0KS5nZXRNb2RpZmllcigpLmhhc0RpcmVjdGlvbk91dHB1dCgpCisJCQkJJiYgYVJvdXRlci5oYXNudE91dHB1dFJvdXRpbmcoICgqaXRQb3J0KS5nZXRSb3V0ZU9mZnNldCgpICkgKQorCQkJeworCQkJCWFSb3V0ZXIuc2V0T3V0cHV0Um91dGluZygoKml0UG9ydCkuZ2V0Um91dGVPZmZzZXQoKSwKKwkJCQkJCVJvdXRpbmdEYXRhKDAsIGFNYWNoaW5lLCAoKml0UG9ydCkucmF3UG9ydCgpLAorCQkJCQkJCQlDb21Qcm90b2NvbDo6UFJPVE9DT0xfRU5WSVJPTk1FTlRfS0lORCkgKTsKKwkJCX0KKwkJfQorCX0KK30KKworCit2b2lkIENvbXBpbGVyT2ZJbnRlcmFjdGlvbjo6dXBkYXRlR2xvYmFsUm91dGUoCisJCWNvbnN0IFJvdXRlciAmIHJlZlJvdXRlciwgY29uc3QgUm91dGVyICYgbmV3Um91dGVyKQoreworCWZvciggYXZtX3NpemVfdCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgbU5leHRSb3V0ZUlEIDsgKytvZmZzZXQgKQorCXsKKwkJaWYoIG5ld1JvdXRlci5nZXRJbnB1dFJvdXRpbmcob2Zmc2V0KS5pbnZhbGlkKCkgKQorCQl7CisJCQlpZiggcmVmUm91dGVyLmhhc0lucHV0Um91dGluZyhvZmZzZXQpICkKKwkJCXsKKwkJCQluZXdSb3V0ZXIuc2V0SW5wdXRSb3V0aW5nKG9mZnNldCwKKwkJCQkJCXJlZlJvdXRlci5nZXRJbnB1dFJvdXRpbmcob2Zmc2V0KSk7CisJCQl9CisvLwkJCWVsc2UKKy8vCQkJeworLy8JCQkJbmV3Um91dGVyLnNldElucHV0Um91dGluZyhvZmZzZXQsIFJvdXRpbmdEYXRhKDAsIGFNYWNoaW5lLAorLy8JCQkJCQl0aGVNZXNzYWdlLCBDb21Qcm90b2NvbDo6UFJPVE9DT0xfRU5WSVJPTk1FTlRfS0lORCkpICk7CisvLwkJCX0KKwkJfQorCQkvLyBOTyBFTFNFIGJlY2F1c2Ugb2YgSU5PVVQgUE9SVAorCQlpZiggbmV3Um91dGVyLmhhc250T3V0cHV0Um91dGluZyhvZmZzZXQpICkKKwkJeworCQkJaWYoIHJlZlJvdXRlci5oYXNPdXRwdXRSb3V0aW5nKG9mZnNldCkgKQorCQkJeworCQkJCW5ld1JvdXRlci5zZXRPdXRwdXRSb3V0aW5nKG9mZnNldCwKKwkJCQkJCXJlZlJvdXRlci5nZXRPdXRwdXRSb3V0aW5nKG9mZnNldCkpOworCQkJfQorLy8JCQllbHNlCisvLwkJCXsKKy8vCQkJCW5ld1JvdXRlci5zZXRPdXRwdXRSb3V0aW5nKG9mZnNldCwgUm91dGluZ0RhdGEoMCwgYU1hY2hpbmUsCisvLwkJCQkJCXRoZU1lc3NhZ2UsIENvbVByb3RvY29sOjpQUk9UT0NPTF9FTlZJUk9OTUVOVF9LSU5EKSkgKTsKKy8vCQkJfQorCQl9CisJfQorfQorCit2b2lkIENvbXBpbGVyT2ZJbnRlcmFjdGlvbjo6dXBkYXRlTG9jYWxNb2RlbFVzaW5nTG9jYWxQcm90b3R5cGUoCisJCUV4ZWN1dGFibGVGb3JtICogdGhlRXhlY3V0YWJsZSwgY29uc3QgUm91dGVyICYgYVJvdXRlcjRNb2RlbCkKK3sKKwlJbnN0YW5jZU9mTWFjaGluZSAqIGFNYWNoaW5lID0gYVJvdXRlcjRNb2RlbC5nZXRNYWNoaW5lKCk7CisKKy8vQGRlYnVnOgorLy8JQVZNX09TX1RSQUNFIDw8ICJ1cGRhdGVMb2NhbE1vZGVsVXNpbmdMb2NhbFByb3RvdHlwZTogIgorLy8JCQk8PCB0aGVFeGVjdXRhYmxlLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbAorLy8JCQk8PCAiID4+PT0+PiAiIDw8IHN0cl9oZWFkZXIoIGFNYWNoaW5lICkgPDwgc3RkOjplbmRsOworLy8JQVZNX09TX1RSQUNFIDw8ICJJTklUIDo+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PiIgPDwgc3RkOjplbmRsOworLy8JYVJvdXRlcjRNb2RlbC50b1N0cmVhbShBVk1fT1NfVFJBQ0UpOworCisJUm91dGVyIGFSb3V0ZXI0UHJvdG90eXBlOworCWlmKCBhTWFjaGluZS0+Z2V0U3BlY2lmaWVyKCkuaXNEZXNpZ25Qcm90b3R5cGVTdGF0aWMoKSApCisJeworCQlhUm91dGVyNFByb3RvdHlwZSA9IHRoZUV4ZWN1dGFibGUtPmdldFJvdXRlcjRQcm90b3R5cGUoYU1hY2hpbmUpOworCX0KKworCWlmKCBhUm91dGVyNFByb3RvdHlwZS52YWxpZCgpICkKKwl7CisvL0BkZWJ1ZzoKKy8vCQlhUm91dGVyNFByb3RvdHlwZS50b1N0cmVhbShBVk1fT1NfVFJBQ0UpOworLy8JCWFSb3V0ZXI0TW9kZWwudG9TdHJlYW0oQVZNX09TX1RSQUNFKTsKKworCQkvLyBVUERBVEUgR0xPQkFMIFJPVVRFCisJCXVwZGF0ZUdsb2JhbFJvdXRlKGFSb3V0ZXI0UHJvdG90eXBlLCBhUm91dGVyNE1vZGVsKTsKKworLy9AZGVidWc6CisvLwkJQVZNX09TX1RSQUNFIDw8ICJBVkFOVCA6Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+IiA8PCBzdGQ6OmVuZGw7CisvLwkJYVJvdXRlcjRNb2RlbC50b1N0cmVhbShBVk1fT1NfVFJBQ0UpOworCisJCVRhYmxlT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGl0UG9ydCA9CisJCQkJYU1hY2hpbmUtPmdldEV4ZWN1dGFibGUoKS0+Z2V0UG9ydCgpLmJlZ2luKCk7CisJCVRhYmxlT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGVuZFBvcnQgPQorCQkJCWFNYWNoaW5lLT5nZXRFeGVjdXRhYmxlKCktPmdldFBvcnQoKS5lbmQoKTsKKwkJZm9yKCA7IGl0UG9ydCAhPSBlbmRQb3J0IDsgKytpdFBvcnQgKQorCQl7CisJCQlpZiggKCppdFBvcnQpLmdldE1vZGlmaWVyKCkuaGFzRGlyZWN0aW9uSW5wdXQoKQorCQkJCSYmIGFSb3V0ZXI0TW9kZWwuZ2V0SW5wdXRSb3V0aW5nKAorCQkJCQkJKCppdFBvcnQpLmdldFJvdXRlT2Zmc2V0KCkpLmludmFsaWQoKSApCisJCQl7CisJCQkJaWYoIGFSb3V0ZXI0UHJvdG90eXBlLmdldElucHV0Um91dGluZygKKwkJCQkJCSgqaXRQb3J0KS5nZXRSb3V0ZU9mZnNldCgpKS52YWxpZCgpICkKKwkJCQl7CisJCQkJCWFSb3V0ZXI0TW9kZWwuc2V0SW5wdXRSb3V0aW5nKCgqaXRQb3J0KS5nZXRSb3V0ZU9mZnNldCgpLAorCQkJCQkJCWFSb3V0ZXI0UHJvdG90eXBlLmdldElucHV0Um91dGluZygKKwkJCQkJCQkJCSgqaXRQb3J0KS5nZXRSb3V0ZU9mZnNldCgpKSk7CisJCQkJfQorCQkJfQorCQkJLy8gTk8gRUxTRSBiZWNhdXNlIG9mIElOT1VUIFBPUlQKKwkJCWlmKCAoKml0UG9ydCkuZ2V0TW9kaWZpZXIoKS5oYXNEaXJlY3Rpb25PdXRwdXQoKQorCQkJCSYmIGFSb3V0ZXI0TW9kZWwuaGFzbnRPdXRwdXRSb3V0aW5nKAorCQkJCQkJKCppdFBvcnQpLmdldFJvdXRlT2Zmc2V0KCkpICkKKwkJCXsKKwkJCQlpZiggYVJvdXRlcjRQcm90b3R5cGUuZ2V0T3V0cHV0Um91dGluZygKKwkJCQkJCSgqaXRQb3J0KS5nZXRSb3V0ZU9mZnNldCgpKS52YWxpZCgpICkKKwkJCQl7CisJCQkJCWFSb3V0ZXI0TW9kZWwuc2V0T3V0cHV0Um91dGluZygoKml0UG9ydCkuZ2V0Um91dGVPZmZzZXQoKSwKKwkJCQkJCQlhUm91dGVyNFByb3RvdHlwZS5nZXRPdXRwdXRSb3V0aW5nKAorCQkJCQkJCQkJKCppdFBvcnQpLmdldFJvdXRlT2Zmc2V0KCkpKTsKKwkJCQl9CisJCQl9CisJCX0KKworLy9AZGVidWc6CisvLwkJQVZNX09TX1RSQUNFIDw8ICJBUFJFUyA6Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+IiA8PCBzdGQ6OmVuZGw7CisvLwkJYVJvdXRlcjRNb2RlbC50b1N0cmVhbShBVk1fT1NfVFJBQ0UpOworLy8JCUFWTV9PU19UUkFDRSA8PCBzdGQ6OmVuZGw7CisJfQorfQorCisKK3ZvaWQgQ29tcGlsZXJPZkludGVyYWN0aW9uOjp1cGRhdGVMb2NhbE1vZGVsVXNpbmdHbG9iYWxNb2RlbCgKKwkJY29uc3QgUm91dGVyICYgYVJvdXRlcjRNb2RlbCkKK3sKKwlJbnN0YW5jZU9mTWFjaGluZSAqIGFNYWNoaW5lID0gYVJvdXRlcjRNb2RlbC5nZXRNYWNoaW5lKCk7CisKKwlFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZSA9IGFNYWNoaW5lLT5nZXRFeGVjdXRhYmxlKCk7CisKKy8vQGRlYnVnOgorLy8JQVZNX09TX1RSQUNFIDw8ICJ1cGRhdGVMb2NhbE1vZGVsVXNpbmdHbG9iYWxNb2RlbDogIgorLy8JCQk8PCB0aGVFeGVjdXRhYmxlLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbAorLy8JCQk8PCAiID4+PT0+PiAiIDw8IHN0cl9oZWFkZXIoIGFNYWNoaW5lICkgPDwgc3RkOjplbmRsOworLy8JQVZNX09TX1RSQUNFIDw8ICJJTklUIDo+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PiIgPDwgc3RkOjplbmRsOworLy8JYVJvdXRlcjRNb2RlbC50b1N0cmVhbShBVk1fT1NfVFJBQ0UpOworCisJUm91dGVyIGFSb3V0ZXI0TW9kZWxUaGlzOworCisJaWYoIGFNYWNoaW5lLT5nZXRTcGVjaWZpZXIoKS5pc0Rlc2lnblByb3RvdHlwZVN0YXRpYygpCisJCSYmIGFuRXhlY3V0YWJsZS0+aGFzUm91dGVyNEluc3RhbmNlKCkgKQorCXsKKwkJYVJvdXRlcjRNb2RlbFRoaXMgPSBhbkV4ZWN1dGFibGUtPmdldFJvdXRlcjRUaGlzKCk7CisJfQorCWVsc2UgaWYoIG5vdCBhbkV4ZWN1dGFibGUtPmhhc1JvdXRlcjRJbnN0YW5jZSgpICkKKwl7CisJCWFuRXhlY3V0YWJsZS0+YXBwZW5kUm91dGVyNEluc3RhbmNlKCBhUm91dGVyNE1vZGVsICk7CisKKwkJYVJvdXRlcjRNb2RlbFRoaXMgPSBhbkV4ZWN1dGFibGUtPmdldFJvdXRlcjRUaGlzKCk7CisKKwkJaWYoIG5vdCBhbkV4ZWN1dGFibGUtPmhhc1JvdXRlcjRNb2RlbCgpICkKKwkJeworCQkJYW5FeGVjdXRhYmxlLT5zZXRSb3V0ZXJzNE1vZGVsKAorCQkJCQlhbkV4ZWN1dGFibGUtPmdldFJvdXRlcnM0SW5zdGFuY2UoKSApOworCQl9CisJfQorCWVsc2UgaWYoIG5vdCBhbkV4ZWN1dGFibGUtPmhhc1JvdXRlcjRNb2RlbCgpICkKKwl7CisJCWFuRXhlY3V0YWJsZS0+c2V0Um91dGVyczRNb2RlbCgKKwkJCQlhbkV4ZWN1dGFibGUtPmdldFJvdXRlcnM0SW5zdGFuY2UoKSApOworCX0KKworCisJaWYoIGFSb3V0ZXI0TW9kZWxUaGlzLnZhbGlkKCkgKQorCXsKKy8vQGRlYnVnOgorLy8JCWFSb3V0ZXI0TW9kZWxUaGlzLnRvU3RyZWFtKEFWTV9PU19UUkFDRSk7CisvLwkJYVJvdXRlcjRNb2RlbC50b1N0cmVhbShBVk1fT1NfVFJBQ0UpOworCisJCS8vIFVQREFURSBHTE9CQUwgUk9VVEUKKwkJdXBkYXRlR2xvYmFsUm91dGUoYVJvdXRlcjRNb2RlbFRoaXMsIGFSb3V0ZXI0TW9kZWwpOworCisKKy8vQGRlYnVnOgorLy8JCUFWTV9PU19UUkFDRSA8PCAiQVZBTlQgOj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PiIgPDwgc3RkOjplbmRsOworLy8JCWFSb3V0ZXI0TW9kZWwudG9TdHJlYW0oQVZNX09TX1RSQUNFKTsKKworCQlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBpdFBvcnQgPQorCQkJCWFNYWNoaW5lLT5nZXRFeGVjdXRhYmxlKCktPmdldFBvcnQoKS5iZWdpbigpOworCQlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBlbmRQb3J0ID0KKwkJCQlhTWFjaGluZS0+Z2V0RXhlY3V0YWJsZSgpLT5nZXRQb3J0KCkuZW5kKCk7CisKKwkJZm9yKCA7IGl0UG9ydCAhPSBlbmRQb3J0IDsgKytpdFBvcnQgKQorCQl7CisJCQlpZiggKCppdFBvcnQpLmdldE1vZGlmaWVyKCkuaGFzRGlyZWN0aW9uSW5wdXQoKQorCQkJCSYmIGFSb3V0ZXI0TW9kZWwuZ2V0SW5wdXRSb3V0aW5nKAorCQkJCQkJKCppdFBvcnQpLmdldFJvdXRlT2Zmc2V0KCkpLmludmFsaWQoKSApCisJCQl7CisJCQkJaWYoIGFSb3V0ZXI0TW9kZWxUaGlzLmdldElucHV0Um91dGluZygKKwkJCQkJCSgqaXRQb3J0KS5nZXRSb3V0ZU9mZnNldCgpKS52YWxpZCgpICkKKwkJCQl7CisJCQkJCWFSb3V0ZXI0TW9kZWwuc2V0SW5wdXRSb3V0aW5nKCgqaXRQb3J0KS5nZXRSb3V0ZU9mZnNldCgpLAorCQkJCQkJCWFSb3V0ZXI0TW9kZWxUaGlzLmdldElucHV0Um91dGluZygKKwkJCQkJCQkJCSgqaXRQb3J0KS5nZXRSb3V0ZU9mZnNldCgpKSk7CisJCQkJfQorCQkJCWVsc2UgaWYoICgqaXRQb3J0KS5wb3J0KCkuaXNQb3J0KCkgKQorCQkJCXsKKwkJCQkJYVJvdXRlcjRNb2RlbC5zZXRJbnB1dFJvdXRpbmcoKCppdFBvcnQpLmdldFJvdXRlT2Zmc2V0KCksCisJCQkJCQkJUm91dGluZ0RhdGEoMCwgYU1hY2hpbmUsICgqaXRQb3J0KS5yYXdQb3J0KCksCisJCQkJCQkJCQlDb21Qcm90b2NvbDo6UFJPVE9DT0xfRU5WSVJPTk1FTlRfS0lORCkgKTsKKwkJCQl9CisJCQl9CisJCQkvLyBOTyBFTFNFIGJlY2F1c2Ugb2YgSU5PVVQgUE9SVAorCQkJaWYoICgqaXRQb3J0KS5nZXRNb2RpZmllcigpLmhhc0RpcmVjdGlvbk91dHB1dCgpCisJCQkJJiYgYVJvdXRlcjRNb2RlbC5oYXNudE91dHB1dFJvdXRpbmcoCisJCQkJCQkoKml0UG9ydCkuZ2V0Um91dGVPZmZzZXQoKSkgKQorCQkJeworCQkJCWlmKCBhUm91dGVyNE1vZGVsVGhpcy5nZXRPdXRwdXRSb3V0aW5nKAorCQkJCQkJKCppdFBvcnQpLmdldFJvdXRlT2Zmc2V0KCkpLnZhbGlkKCkgKQorCQkJCXsKKwkJCQkJYVJvdXRlcjRNb2RlbC5zZXRPdXRwdXRSb3V0aW5nKCgqaXRQb3J0KS5nZXRSb3V0ZU9mZnNldCgpLAorCQkJCQkJCWFSb3V0ZXI0TW9kZWxUaGlzLmdldE91dHB1dFJvdXRpbmcoCisJCQkJCQkJCQkoKml0UG9ydCkuZ2V0Um91dGVPZmZzZXQoKSkpOworCQkJCX0KKwkJCQllbHNlIGlmKCAoKml0UG9ydCkucG9ydCgpLmlzUG9ydCgpICkKKwkJCQl7CisJCQkJCWFSb3V0ZXI0TW9kZWwuc2V0T3V0cHV0Um91dGluZygoKml0UG9ydCkuZ2V0Um91dGVPZmZzZXQoKSwKKwkJCQkJCQlSb3V0aW5nRGF0YSgwLCBhTWFjaGluZSwgKCppdFBvcnQpLnJhd1BvcnQoKSwKKwkJCQkJCQkJCUNvbVByb3RvY29sOjpQUk9UT0NPTF9FTlZJUk9OTUVOVF9LSU5EKSApOworCQkJCX0KKwkJCX0KKwkJfQorCisvL0BkZWJ1ZzoKKy8vCQlBVk1fT1NfVFJBQ0UgPDwgIkFQUkVTIDo+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4iIDw8IHN0ZDo6ZW5kbDsKKy8vCQlhUm91dGVyNE1vZGVsLnRvU3RyZWFtKEFWTV9PU19UUkFDRSk7CisvLwkJQVZNX09TX1RSQUNFIDw8IHN0ZDo6ZW5kbDsKKwl9CisJZWxzZQorCXsKKwkJc2V0VW5kZWZpbmVkTG9jYWxSb3V0ZVRvRW52KCBhUm91dGVyNE1vZGVsICk7CisJfQorfQorCisKK3ZvaWQgQ29tcGlsZXJPZkludGVyYWN0aW9uOjpwb3N0Q29tcGlsZUNvbW11bmljYXRpb24oCisJCUV4ZWN1dGFibGVGb3JtICogdGhlRXhlY3V0YWJsZSkKK3sKKwlUYWJsZU9mUm91dGVyOjppdGVyYXRvciBpdFJvdXRlcjsKKwlUYWJsZU9mUm91dGVyOjppdGVyYXRvciBlbmRSb3V0ZXI7CisKKwkvLyBVUERBVEUgREVGQVVMVCBNT0RFTCBST1VURVIgVE8gRU5WSVJPTk1FTlQKKwlpZiggdGhlRXhlY3V0YWJsZS0+aGFzUm91dGVyNE1vZGVsKCkgKQorCXsKKwkJaXRSb3V0ZXIgPSB0aGVFeGVjdXRhYmxlLT5nZXRSb3V0ZXJzNE1vZGVsKCkuYmVnaW4oKTsKKwkJZW5kUm91dGVyID0gdGhlRXhlY3V0YWJsZS0+Z2V0Um91dGVyczRNb2RlbCgpLmVuZCgpOworCQlmb3IoIDsgaXRSb3V0ZXIgIT0gZW5kUm91dGVyIDsgKytpdFJvdXRlciApCisJCXsKKwkJCWlmKCAoKml0Um91dGVyKS52YWxpZCgpICkKKwkJCXsKKwkJCQl1cGRhdGVMb2NhbE1vZGVsVXNpbmdMb2NhbFByb3RvdHlwZSh0aGVFeGVjdXRhYmxlLCAqaXRSb3V0ZXIpOworCisJCQkJdXBkYXRlTG9jYWxNb2RlbFVzaW5nR2xvYmFsTW9kZWwoICppdFJvdXRlciApOworCisJCQkJdXBkYXRlR2xvYmFsUm91dGUodGhlRXhlY3V0YWJsZS0+Z2V0Um91dGVyNFRoaXMoKSwgKml0Um91dGVyKTsKKwkJCX0KKwkJfQorCisJCS8vIFVQREFURSBERUZBVUxUIElOU1RBTkNFIFJPVVRFUiBBUyBNT0RFTCdTCisJCVRhYmxlT2ZSb3V0aW5nRGF0YTo6aXRlcmF0b3IgaXRSZEluc3Q7CisJCVRhYmxlT2ZSb3V0aW5nRGF0YTo6Y29uc3RfaXRlcmF0b3IgaXRSZE1vZGVsOworCQlUYWJsZU9mUm91dGluZ0RhdGE6Oml0ZXJhdG9yIGVuZFJEOworCisJCWl0Um91dGVyID0gdGhlRXhlY3V0YWJsZS0+Z2V0Um91dGVyczRJbnN0YW5jZSgpLmJlZ2luKCk7CisJCWVuZFJvdXRlciA9IHRoZUV4ZWN1dGFibGUtPmdldFJvdXRlcnM0SW5zdGFuY2UoKS5lbmQoKTsKKwkJZm9yKCA7IGl0Um91dGVyICE9IGVuZFJvdXRlciA7ICsraXRSb3V0ZXIgKQorCQl7CisJCQlpZiggKCppdFJvdXRlcikudmFsaWQoKSApCisJCQl7CisJCQkJY29uc3QgUm91dGVyICYgdGhlUm91dGVyID0gdGhlRXhlY3V0YWJsZS0+CisJCQkJCQlnZXRSb3V0ZXI0TW9kZWwoKCppdFJvdXRlcikuZ2V0TWFjaGluZSgpKTsKKworCQkJCWlmKCB0aGVSb3V0ZXIgPT0gKCppdFJvdXRlcikgKQorCQkJCXsKKwkJCQkJY29udGludWU7CisJCQkJfQorLy8JCQkJaWYoIHRoZVJvdXRlciA9PSBOVUxMICkKKy8vCQkJCXsKKy8vCQkJCQkvLyBJREVOVElGSUNBVElPTiBST1VURVIobWFjaGluZSBwcm90b3R5cGUpCisvLwkJCQkJLy8gPT0+IFJPVVRFUihtYWNoaW5lIGluc3RhbmNlKQorLy8JCQkJCXRoZVJvdXRlciA9IHRoZUV4ZWN1dGFibGUtPmdldFJvdXRlcjRQcm90b3R5cGUoCisvLwkJCQkJCQkoKml0Um91dGVySW5zdCktPmdldE1hY2hpbmUoKSApOworLy8JCQkJfQorCisJCQkJaWYoIHRoZVJvdXRlciAhPSBOVUxMICkKKwkJCQl7CisJCQkJCWl0UmRNb2RlbCA9IHRoZVJvdXRlci5nZXRJbnB1dFJvdXRpbmdUYWJsZSgpLmJlZ2luKCk7CisKKwkJCQkJaXRSZEluc3QgPSAoKml0Um91dGVyKS5nZXRJbnB1dFJvdXRpbmdUYWJsZSgpLmJlZ2luKCk7CisJCQkJCWVuZFJEID0gKCppdFJvdXRlcikuZ2V0SW5wdXRSb3V0aW5nVGFibGUoKS5lbmQoKTsKKwkJCQkJZm9yKCA7IGl0UmRJbnN0ICE9IGVuZFJEIDsgKytpdFJkSW5zdCAsICsraXRSZE1vZGVsICkKKwkJCQkJeworCQkJCQkJaWYoICgqaXRSZEluc3QpLmludmFsaWQoKSAmJiAoKml0UmRNb2RlbCkudmFsaWQoKSkKKwkJCQkJCXsKKwkJCQkJCQkoKml0UmRJbnN0KSA9ICgqaXRSZE1vZGVsKTsKKwkJCQkJCX0KKwkJCQkJfQorCisKKwkJCQkJaXRSZE1vZGVsID0gdGhlUm91dGVyLmdldE91dHB1dFJvdXRpbmdUYWJsZSgpLmJlZ2luKCk7CisKKwkJCQkJaXRSZEluc3QgPSAoKml0Um91dGVyKS5nZXRPdXRwdXRSb3V0aW5nVGFibGUoKS5iZWdpbigpOworCQkJCQllbmRSRCA9ICgqaXRSb3V0ZXIpLmdldE91dHB1dFJvdXRpbmdUYWJsZSgpLmVuZCgpOworCQkJCQlmb3IoIDsgaXRSZEluc3QgIT0gZW5kUkQgOyArK2l0UmRJbnN0ICwgKytpdFJkTW9kZWwgKQorCQkJCQl7CisJCQkJCQlpZiggKCppdFJkSW5zdCkuaW52YWxpZCgpICYmICgqaXRSZE1vZGVsKS52YWxpZCgpKQorCQkJCQkJeworCQkJCQkJCSgqaXRSZEluc3QpID0gKCppdFJkTW9kZWwpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCWVsc2UKKwl7CisJCWl0Um91dGVyID0gdGhlRXhlY3V0YWJsZS0+Z2V0Um91dGVyczRJbnN0YW5jZSgpLmJlZ2luKCk7CisJCWVuZFJvdXRlciA9IHRoZUV4ZWN1dGFibGUtPmdldFJvdXRlcnM0SW5zdGFuY2UoKS5lbmQoKTsKKwkJZm9yKCA7IGl0Um91dGVyICE9IGVuZFJvdXRlciA7ICsraXRSb3V0ZXIgKQorCQl7CisJCQlpZiggKCppdFJvdXRlcikudmFsaWQoKSApCisJCQl7CisJCQkJc2V0VW5kZWZpbmVkTG9jYWxSb3V0ZVRvRW52KCAoKml0Um91dGVyKSApOworCQkJfQorCQl9CisJfQorfQorCisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9jb21waWxlci9Db21waWxlck9mSW50ZXJhY3Rpb24uaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvY29tcGlsZXIvQ29tcGlsZXJPZkludGVyYWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JhZTc4MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvY29tcGlsZXIvQ29tcGlsZXJPZkludGVyYWN0aW9uLmgKQEAgLTAsMCArMSwyMjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxOCBzZXB0LiAyMDA4CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQlVJTERFUl9DT01QSUxFUl9DT01QSUxFUk9GSU5URVJBQ1RJT05fSF8KKyNkZWZpbmUgQlVJTERFUl9DT01QSUxFUl9DT01QSUxFUk9GSU5URVJBQ1RJT05fSF8KKworI2luY2x1ZGUgPGJ1aWxkZXIvY29tcGlsZXIvQmFzZUNvbXBpbGVyLmg+CisKKyNpbmNsdWRlIDxjb2xsZWN0aW9uL0xpc3QuaD4KKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL1JvdXRlci5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL1JvdXRpbmdEYXRhLmg+CisKKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvUHJvcGVydHlQYXJ0Lmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIENvbXBpbGVyOworCitjbGFzcyBCdWZmZXI7CitjbGFzcyBDb21Qb2ludDsKK2NsYXNzIENvbVJvdXRlOworY2xhc3MgQ29ubmVjdG9yOworY2xhc3MgRXhlY3V0YWJsZUZvcm07CitjbGFzcyBJbnN0YW5jZU9mQ29ubmVjdDsKK2NsYXNzIEluc3RhbmNlT2ZNYWNoaW5lOworY2xhc3MgSW5zdGFuY2VPZlBvcnQ7CitjbGFzcyBQcm9wZXJ0eVBhcnQ7CisKKworY2xhc3MgQ29tcGlsZXJPZkludGVyYWN0aW9uICA6ICBwdWJsaWMgQmFzZUNvbXBpbGVyCit7CisKK3Byb3RlY3RlZDoKKwkvKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlhdm1fc2l6ZV90IG1OZXh0Um91dGVJRDsKKworCWF2bV9zaXplX3QgbU5leHRDb25uZWN0SUQ7CisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlDb21waWxlck9mSW50ZXJhY3Rpb24oQ29tcGlsZXIgJiBhQ29tcGlsZXIpOworCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+Q29tcGlsZXJPZkludGVyYWN0aW9uKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogbU5leHRSb3V0ZUlECisJICogbU5leHRDb25uZWN0SUQKKwkgKi8KKwl2b2lkIHVwZGF0ZU1lc3NhZ2VJRCgpCisJeworCQltTmV4dENvbm5lY3RJRCA9IG1OZXh0Um91dGVJRDsKKwl9CisKKwkvKioKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogUFJFLUNPTVBJTEFUSU9OCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCUJGIHByZWNvbXBpbGVQYXJhbWV0ZXIoRXhlY3V0YWJsZUZvcm0gKiBhQ29udGFpbmVyLAorCQkJVGFibGVPZkluc3RhbmNlT2ZEYXRhICYgdGFibGVPZlZhcmlhYmxlLAorCQkJVmFyaWFibGUgKiBhUGFyYW1ldGVyLCBhdm1fb2Zmc2V0X3Qgb2Zmc2V0KTsKKworCXZvaWQgcHJlY29tcGlsZUNvbVBvaW50KAorCQkJRXhlY3V0YWJsZUZvcm0gKiBhQ29udGFpbmVyLCBQcm9wZXJ0eVBhcnQgJiB0aGVEZWNsYXJhdGlvbiwKKwkJCVRhYmxlT2ZJbnN0YW5jZU9mRGF0YSAmIHRhYmxlT2ZWYXJpYWJsZSk7CisKKwl2b2lkIHByZWNvbXBpbGVDb21Qb2ludChFeGVjdXRhYmxlRm9ybSAqIGFDb250YWluZXIsCisJCQljb25zdCBQcm9wZXJ0eVBhcnQ6OlRhYmxlT2ZQb3J0ICYgbGlzdE9mQ29tUG9pbnQsCisJCQlhdm1fc2l6ZV90IGlvUG9ydE9mZnNldCwgVGFibGVPZkluc3RhbmNlT2ZEYXRhICYgdGFibGVPZlZhcmlhYmxlKTsKKworCXZvaWQgcHJlY29tcGlsZUNoYW5uZWwoCisJCQlFeGVjdXRhYmxlRm9ybSAqIGFDb250YWluZXIsIFByb3BlcnR5UGFydCAmIHRoZURlY2xhcmF0aW9uLAorCQkJVGFibGVPZkluc3RhbmNlT2ZEYXRhICYgdGFibGVPZlZhcmlhYmxlKTsKKworCXZvaWQgcHJlY29tcGlsZUJ1ZmZlcihFeGVjdXRhYmxlRm9ybSAqIGFDb250YWluZXIsIEJ1ZmZlciAqIGFCdWZmZXIpOworCisKKworCS8qKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBDT01QSUxBVElPTgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKi8KKwl2b2lkIGNvbXBpbGVQb3J0KEV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlKTsKKworCXZvaWQgY29tcGlsZVBvcnQoRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGUsCisJCQljb25zdCBJbnN0YW5jZU9mUG9ydCAmIGFQb3J0SW5zdGFuY2UpOworCisKKwlSb3V0ZXIgYWRkTWFjaGluZU1vZGVsUm91dGVyKAorCQkJRXhlY3V0YWJsZUZvcm0gKiB0aGVFeGVjdXRhYmxlLCBJbnN0YW5jZU9mTWFjaGluZSAqIGFNYWNoaW5lKTsKKworCVJvdXRlciBuZXdNYWNoaW5lUm91dGVyKEluc3RhbmNlT2ZNYWNoaW5lICogYU1hY2hpbmUpOworCisKKwl2b2lkIGNvbXBpbGVDb21tdW5pY2F0aW9uKEV4ZWN1dGFibGVGb3JtICogdGhlRXhlY3V0YWJsZSwKKwkJCWJvb2wgJiBoYXNTeW5jaHJvbml6ZU1hY2hpbmUsIGJvb2wgJiBoYXNVcGRhdGVCdWZmZXIpOworCisJdm9pZCBjb21waWxlQ29ubmVjdG9yKEV4ZWN1dGFibGVGb3JtICogdGhlRXhlY3V0YWJsZSwKKwkJCWJvb2wgJiBoYXNTeW5jaHJvbml6ZU1hY2hpbmUsIGJvb2wgJiBoYXNVcGRhdGVCdWZmZXIpOworCisJdm9pZCBjb21waWxlQ29ubmVjdG9yKEV4ZWN1dGFibGVGb3JtICogdGhlRXhlY3V0YWJsZSwKKwkJCUNvbm5lY3RvciAqIGFDb25uZWN0b3IsIEluc3RhbmNlT2ZDb25uZWN0ICogaW9jLAorCQkJYm9vbCAmIGhhc1N5bmNocm9uaXplTWFjaGluZSwgYm9vbCAmIGhhc1VwZGF0ZUJ1ZmZlcik7CisKKwl2b2lkIGNvbXBpbGVSb3V0ZShFeGVjdXRhYmxlRm9ybSAqIHRoZUV4ZWN1dGFibGUsCisJCQlDb25uZWN0b3IgKiBhQ29ubmVjdG9yLCBJbnN0YW5jZU9mQ29ubmVjdCAqIGlvYywKKwkJCWJvb2wgJiBoYXNTeW5jaHJvbml6ZU1hY2hpbmUsIGJvb2wgJiBoYXNVcGRhdGVCdWZmZXIpOworCisKKworCXZvaWQgY29tcGlsZUNvbm5lY3RvckJyb2FkY2FzdCgKKwkJCUV4ZWN1dGFibGVGb3JtICogdGhlRXhlY3V0YWJsZSwgSW5zdGFuY2VPZkNvbm5lY3QgKiBpb2MpOworCisJdm9pZCBjb21waWxlQ29ubmVjdG9yQnVmZmVyKAorCQkJRXhlY3V0YWJsZUZvcm0gKiB0aGVFeGVjdXRhYmxlLCBJbnN0YW5jZU9mQ29ubmVjdCAqIGlvYyk7CisKKwl2b2lkIGNvbXBpbGVDb25uZWN0b3JSb3V0aW5nQ2FzdCgKKwkJCUV4ZWN1dGFibGVGb3JtICogdGhlRXhlY3V0YWJsZSwgSW5zdGFuY2VPZkNvbm5lY3QgKiBpb2MpOworCisJdm9pZCBjb21waWxlQ29ubmVjdG9yU3luY2hyb25vdXMoCisJCQlFeGVjdXRhYmxlRm9ybSAqIHRoZUV4ZWN1dGFibGUsIEluc3RhbmNlT2ZDb25uZWN0ICogaW9jKTsKKworCXZvaWQgY29tcGlsZUNvbm5lY3RvckZsb3coCisJCQlFeGVjdXRhYmxlRm9ybSAqIHRoZUV4ZWN1dGFibGUsIEluc3RhbmNlT2ZDb25uZWN0ICogaW9jKTsKKworCXZvaWQgY29tcGlsZUNvbm5lY3RvclRyYW5zZmVydCgKKwkJCUV4ZWN1dGFibGVGb3JtICogdGhlRXhlY3V0YWJsZSwgSW5zdGFuY2VPZkNvbm5lY3QgKiBpb2MpOworCisJdm9pZCBjb21waWxlQ29ubmVjdG9yRW52aXJvbm1lbnQoCisJCQlFeGVjdXRhYmxlRm9ybSAqIHRoZUV4ZWN1dGFibGUsIEluc3RhbmNlT2ZDb25uZWN0ICogaW9jKTsKKworCisJdm9pZCBjb21waWxlUm91dGVCcm9hZGNhc3QoCisJCQlFeGVjdXRhYmxlRm9ybSAqIHRoZUV4ZWN1dGFibGUsIEluc3RhbmNlT2ZDb25uZWN0ICogaW9jKTsKKworCXZvaWQgY29tcGlsZVJvdXRlQnVmZmVyKAorCQkJRXhlY3V0YWJsZUZvcm0gKiB0aGVFeGVjdXRhYmxlLCBJbnN0YW5jZU9mQ29ubmVjdCAqIGlvYyk7CisKKwl2b2lkIGNvbXBpbGVSb3V0ZVJvdXRpbmdDYXN0KAorCQkJRXhlY3V0YWJsZUZvcm0gKiB0aGVFeGVjdXRhYmxlLCBJbnN0YW5jZU9mQ29ubmVjdCAqIGlvYyk7CisKKwl2b2lkIGNvbXBpbGVSb3V0ZVN5bmNocm9ub3VzKAorCQkJRXhlY3V0YWJsZUZvcm0gKiB0aGVFeGVjdXRhYmxlLCBJbnN0YW5jZU9mQ29ubmVjdCAqIGlvYyk7CisKKwl2b2lkIGNvbXBpbGVSb3V0ZVRyYW5zZmVydCgKKwkJCUV4ZWN1dGFibGVGb3JtICogdGhlRXhlY3V0YWJsZSwgSW5zdGFuY2VPZkNvbm5lY3QgKiBpb2MpOworCisJdm9pZCBjb21waWxlUm91dGVFbnZpcm9ubWVudCgKKwkJCUV4ZWN1dGFibGVGb3JtICogdGhlRXhlY3V0YWJsZSwgSW5zdGFuY2VPZkNvbm5lY3QgKiBpb2MpOworCisKKworCUV4ZWN1dGFibGVGb3JtICogY29tcGlsZUNvbVBvaW50TWFjaGluZSgKKwkJCUV4ZWN1dGFibGVGb3JtICogdGhlRXhlY3V0YWJsZSwgQ29tUG9pbnQgKiBhQ29tUG9pbnQsCisJCQlib29sICYgaXNJbnN0YW5jZVN0YXRpY0ZsYWcsIEluc3RhbmNlT2ZNYWNoaW5lICogJiBhTWFjaGluZSk7CisKKwlib29sIGNvbXBpbGVDb21Qb2ludFBvcnQoRXhlY3V0YWJsZUZvcm0gKiB0aGVFeGVjdXRhYmxlNFBvcnQsCisJCQlDb21Qb2ludCAqIGFDb21Qb2ludCwgSW5zdGFuY2VPZlBvcnQgKiAmIGFQb3J0KTsKKworCXZvaWQgY3JlYXRlUm91dGluZ0RhdGEoTGlzdDwgUm91dGluZ0RhdGEgPiAmIGxpc3RPZlJvdXRpbmdEYXRhLAorCQkJRXhlY3V0YWJsZUZvcm0gKiB0aGVFeGVjdXRhYmxlLCBJbnN0YW5jZU9mQ29ubmVjdCAqIGlvYywKKwkJCUNvbVJvdXRlICogYUNvbVJvdXRlLCBDb21Qb2ludCAqIGFDb21Qb2ludCk7CisKKwlSb3V0aW5nRGF0YSBhZGRSb3V0aW5nRGF0YShFeGVjdXRhYmxlRm9ybSAqIHRoZUV4ZWN1dGFibGUsCisJCQlib29sIGlzSW5zdGFuY2VTdGF0aWNGbGFnLCBJbnN0YW5jZU9mQ29ubmVjdCAqIGlvYywKKwkJCUluc3RhbmNlT2ZNYWNoaW5lICogdGhlSW5zdGFuY2VTdGF0aWMsCisJCQlJbnN0YW5jZU9mUG9ydCAqIHRoZVBvcnRJbnN0YW5jZSwKKwkJCU1vZGlmaWVyOjpESVJFQ1RJT05fS0lORCBhRGlyZWN0aW9uKTsKKworCVJvdXRpbmdEYXRhIGFkZFJvdXRpbmdEYXRhKFJvdXRlciAmIHRoZVJvdXRlciwKKwkJCVJvdXRpbmdEYXRhICYgdGhlUm91dGluZ0RhdGEsCisJCQlNb2RpZmllcjo6RElSRUNUSU9OX0tJTkQgYURpcmVjdGlvbik7CisKKworCS8qKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBQT1NULUNPTVBJTEFUSU9OCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCisJdm9pZCBzZXRVbmRlZmluZWRMb2NhbFJvdXRlVG9FbnYoY29uc3QgUm91dGVyICYgYVJvdXRlcik7CisKKwl2b2lkIHVwZGF0ZUdsb2JhbFJvdXRlKGNvbnN0IFJvdXRlciAmIHJlZlJvdXRlciwgY29uc3QgUm91dGVyICYgbmV3Um91dGVyKTsKKworCXZvaWQgdXBkYXRlTG9jYWxNb2RlbFVzaW5nTG9jYWxQcm90b3R5cGUoCisJCQlFeGVjdXRhYmxlRm9ybSAqIHRoZUV4ZWN1dGFibGUsIGNvbnN0IFJvdXRlciAmIGFSb3V0ZXI0TW9kZWwpOworCisJdm9pZCB1cGRhdGVMb2NhbE1vZGVsVXNpbmdHbG9iYWxNb2RlbChjb25zdCBSb3V0ZXIgJiBhUm91dGVyNE1vZGVsKTsKKworCXZvaWQgcG9zdENvbXBpbGVDb21tdW5pY2F0aW9uKEV4ZWN1dGFibGVGb3JtICogdGhlRXhlY3V0YWJsZSk7CisKK307CisKKworfQorCisjZW5kaWYgLyogQlVJTERFUl9DT01QSUxFUl9DT01QSUxFUk9GSU5URVJBQ1RJT05fSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvY29tcGlsZXIvQ29tcGlsZXJPZlByb2dyYW0uY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9jb21waWxlci9Db21waWxlck9mUHJvZ3JhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ5YmRiOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvY29tcGlsZXIvQ29tcGlsZXJPZlByb2dyYW0uY3BwCkBAIC0wLDAgKzEsMTc3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjkgbWFycyAyMDExCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJDb21waWxlck9mUHJvZ3JhbS5oIgorCisjaW5jbHVkZSA8YnVpbGRlci9wcmltaXRpdmUvQXZtY29kZUNvbXBpbGVyLmg+CisjaW5jbHVkZSA8YnVpbGRlci9jb21waWxlci9Db21waWxlci5oPgorI2luY2x1ZGUgPGJ1aWxkZXIvY29tcGlsZXIvQ29tcGlsZXJPZlZhcmlhYmxlLmg+CisKKyNpbmNsdWRlIDxmbWwvY29tbW9uL1NwZWNpZmllckVsZW1lbnQuaD4KKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0F2bVByb2dyYW0uaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlRm9ybS5oPgorCisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorICogQ09OU1RSVUNUT1IKKyAqIERlZmF1bHQKKyAqLworQ29tcGlsZXJPZlByb2dyYW06OkNvbXBpbGVyT2ZQcm9ncmFtKENvbXBpbGVyICYgYUNvbXBpbGVyKQorOiBCYXNlQ29tcGlsZXIoYUNvbXBpbGVyKSwKK21EYXRhQ29tcGlsZXIoIGFDb21waWxlci5tRGF0YUNvbXBpbGVyICkKK3sKKwkvLyEhIE5PVEhJTkcKK30KKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJTVBMRU1FTlQgRk9STSBQUk9HUkFNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZvcm0KKyAqIAlzZWN0aW9uIEhFQURFUgorICogCQlAdWZpID0gPCUgVUZJICU+IDsKKyAqIAkJQG5hbWUgPSA8JSBTdHJpbmcgJT4gOworICogCQlAdHlwZSA9IDwlIDxQUk9HUkFNPiAlPiA7CisgKiAJCUBkZXNpZ24gPSBGT1JNIDsKKyAqIAllbmRzZWN0aW9uIEhFQURFUgorICoKKyAqIAlzZWN0aW9uIFBBUkFNCisgKiAJCSggQGNvbnN0ID0gPCUgQm9vbGVhbiAlPiA7ICk/CisgKiAJZW5kc2VjdGlvbiBQQVJBTQorICoKKyAqIAlzZWN0aW9uIERBVEEKKyAqIAkJKCBkYXRhX3R5cGVkZWYgKSogCQkvLyBNT0RFTCBvZiBhIERBVEFfVFlQRSBpLmUgZGVmaW5pdGlvbiBvZiBuZXcgREFUQV9UWVBFCisgKiAJCSggY29uc3RfZGVjbCApKiAJCS8vIElOU1RBTkNFIG9mIERBVEFfVFlQRSBDT05TVEFOVCBERUZJTklUSU9OCisgKiAJCSggdmFyX2RlY2wgKSogCQkJLy8gSU5TVEFOQ0Ugb2YgREFUQV9UWVBFIFZBUklBQkxFIERFQ0xBUkFUSU9OCisgKiAJZW5kc2VjdGlvbiBEQVRBCisgKgorICogCXNlY3Rpb24gTU9FCisgKiAJCSggQHJ1bnsgPCUgPEF2bUNvZGU+ICU+IH0gKT8KKyAqIAllbmRzZWN0aW9uIE1PRQorICogZW5kZm9ybQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUFJFQ09NUElMQVRJT04KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3ZvaWQgQ29tcGlsZXJPZlByb2dyYW06OnByZWNvbXBpbGVQcm9ncmFtKAorCQlFeGVjdXRhYmxlRm9ybSAqIGFDb250YWluZXIsIE9iamVjdEVsZW1lbnQgKiBhUHJvZ3JhbSkKK3sKKy8vCUFWTV9PU19UUkFDRSA8PCBUQUIgPDwgIjx8fHx8fCBiZWdpbiBwcmVjb21waWxpbmcgc2ltcGxlIFByb2dyYW06PiAiCisvLwkJCTw8IGFQcm9ncmFtLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbDsKKworCS8vIENSRUFURSBORVcgRVhFQ1VUQUJMRQorCUF2bVByb2dyYW0gKiBhbkF2bVByb2dyYW0gPSBuZXcgQXZtUHJvZ3JhbSgKKwkJCVNwZWNpZmllcjo6U0NPUEVfUFJPR1JBTV9LSU5ELCBhQ29udGFpbmVyLCBhUHJvZ3JhbSwgMCk7CisKKwlnZXRTeW1ib2xUYWJsZSgpLmFkZFByb2dyYW0oIGFDb250YWluZXItPnNhdmVQcm9ncmFtKCBhbkF2bVByb2dyYW0gKSApOworCisJVGFibGVPZkluc3RhbmNlT2ZEYXRhIHRhYmxlT2ZWYXJpYWJsZTsKKworCS8qCisJICogQWxsb2NhdGlvbiBvZiBwcm9ncmFtIFBBUkFNIHZhcmlhYmxlCisJICovCisvLwlpZiggYU1hY2hpbmUtPmhhc0RlY2xhcmF0aW9uUGFyYW0oKSApCisvLwl7CisvLwkJYXZtX29mZnNldF90IHBhcmFtT2Zmc2V0ID0gdGFibGVPZlZhcmlhYmxlLnNpemUoKTsKKy8vCisvLwkJbURhdGFDb21waWxlci5wcmVjb21waWxlRGF0YShhbkV4ZWMsIGFQcm9ncmFtLT5nZXREZWNsYXJhdGlvblBhcmFtKCksCisvLwkJCQl0YWJsZU9mVmFyaWFibGUpOworLy8KKy8vCQlhbkF2bVByb2dyYW0tPnNldFBhcmFtT2Zmc2V0Q291bnQoIHBhcmFtT2Zmc2V0ICwgdGFibGVPZlZhcmlhYmxlLnNpemUoKSApOworLy8JfQorLy8KKy8vCWlmKCBhTWFjaGluZS0+aGFzRGVjbGFyYXRpb24oKSApCisvLwl7CisvLwkJUHJvcGVydHlQYXJ0ICogYURlY2xhcmF0aW9uID0gYVByb2dyYW0tPmdldERlY2xhcmF0aW9uKCk7CisvLworLy8JCS8qCisvLwkJICogQWxsb2NhdGlvbiBvZiBwcm9ncmFtIERBVEEgdmFyaWFibGUKKy8vCQkgKi8KKy8vCQltRGF0YUNvbXBpbGVyLnByZWNvbXBpbGVEYXRhKGFuRXhlYywgYURlY2xhcmF0aW9uLCB0YWJsZU9mVmFyaWFibGUpOworLy8JfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gVXBkYXRlIGRhdGEgdGFibGUKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJYW5Bdm1Qcm9ncmFtLT5zZXREYXRhKHRhYmxlT2ZWYXJpYWJsZSk7CisKKy8vCUFWTV9PU19UUkFDRSA8PCBUQUIgPDwgIj58fHx8fCBlbmQgcHJlY29tcGlsaW5nIHNpbXBsZSBQcm9ncmFtOj4gIgorLy8JCQk8PCBhUHJvZ3JhbS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCBzdGQ6OmVuZGw7Cit9CisKKworCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENPTVBJTEFUSU9OCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKgorICogY29tcGlsZQorICogdHJhbnNpdGlvbgorICovCit2b2lkIENvbXBpbGVyT2ZQcm9ncmFtOjpjb21waWxlUHJvZ3JhbShBdm1Qcm9ncmFtICogYW5Bdm1Qcm9ncmFtKQoreworCWNvbnN0IE9iamVjdEVsZW1lbnQgKiBhQ29tcGlsZWRQcm9ncmFtID0gYW5Bdm1Qcm9ncmFtLT5nZXRBc3RFbGVtZW50KCk7CisKKy8vCUFWTV9PU19UUkFDRSA8PCBUQUIgPDwgIjx8IGNvbXBpbGluZzxwcm9ncmFtPjogIgorLy8JCQk8PCBRdWVyeTo6Z2V0VWZpKGFQcm9ncmFtKSA8PCBzdGQ6OmVuZGw7CisKKworCS8vIENPTVBJTEFUSU9OIE9GIERBVEEKKwltRGF0YUNvbXBpbGVyLmNvbXBpbGVEYXRhKGFuQXZtUHJvZ3JhbSk7CisKKworCS8qCisJICogb25SdW4KKwkgKi8KKwlpZiggYUNvbXBpbGVkUHJvZ3JhbS0+aXM8IFJvdXRpbmUgPigpICkKKwl7CisJCWFuQXZtUHJvZ3JhbS0+c2V0Q29kZSggbUF2bWNvZGVDb21waWxlci5jb21waWxlU3RhdGVtZW50KGFuQXZtUHJvZ3JhbSwKKwkJCQlhQ29tcGlsZWRQcm9ncmFtLT5hczwgUm91dGluZSA+KCktPmdldENvZGUoKSkgKTsKKwl9CisJaWYoIGFDb21waWxlZFByb2dyYW0tPmlzPCBUcmFuc2l0aW9uID4oKSApCisJeworCQlhbkF2bVByb2dyYW0tPnNldENvZGUoIG1Bdm1jb2RlQ29tcGlsZXIuY29tcGlsZVN0YXRlbWVudChhbkF2bVByb2dyYW0sCisJCQkJYUNvbXBpbGVkUHJvZ3JhbS0+YXM8IFRyYW5zaXRpb24gPigpLT5nZXRTdGF0ZW1lbnQoKSkgKTsKKwl9CisKKy8vCUFWTV9PU19UUkFDRSA8PCBUQUIgPDwgIj58IGNvbXBpbGluZzxwcm9ncmFtPjogIgorLy8JCQk8PCBRdWVyeTo6Z2V0VWZpKGFQcm9ncmFtKSA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworfQorCisKKworfQorCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvY29tcGlsZXIvQ29tcGlsZXJPZlByb2dyYW0uaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvY29tcGlsZXIvQ29tcGlsZXJPZlByb2dyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTA4YjYyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9jb21waWxlci9Db21waWxlck9mUHJvZ3JhbS5oCkBAIC0wLDAgKzEsODcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyOSBtYXJzIDIwMTEKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBCVUlMREVSX0NPTVBJTEVSX0NPTVBJTEVST0ZQUk9HUkFNX0hfCisjZGVmaW5lIEJVSUxERVJfQ09NUElMRVJfQ09NUElMRVJPRlBST0dSQU1fSF8KKworI2luY2x1ZGUgPGJ1aWxkZXIvY29tcGlsZXIvQmFzZUNvbXBpbGVyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIEF2bWNvZGVDb21waWxlcjsKK2NsYXNzIENvbXBpbGVyT2ZBdm1Db2RlOworY2xhc3MgQ29tcGlsZXI7CitjbGFzcyBDb21waWxlck9mVmFyaWFibGU7CisKK2NsYXNzIEF2bUNvZGU7CitjbGFzcyBBdm1Qcm9ncmFtOworY2xhc3MgRXhlY3V0YWJsZUZvcm07CitjbGFzcyBPYmplY3RFbGVtZW50OworCisKKworY2xhc3MgQ29tcGlsZXJPZlByb2dyYW0gIDogIHB1YmxpYyBCYXNlQ29tcGlsZXIKK3sKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURQorCSAqLworCUNvbXBpbGVyT2ZWYXJpYWJsZSAmIG1EYXRhQ29tcGlsZXI7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUNvbXBpbGVyT2ZQcm9ncmFtKENvbXBpbGVyICYgYUNvbXBpbGVyKTsKKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkNvbXBpbGVyT2ZQcm9ncmFtKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFBSRUNPTVBJTEFUSU9OCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCXZvaWQgcHJlY29tcGlsZVByb2dyYW0oRXhlY3V0YWJsZUZvcm0gKiBhQ29udGFpbmVyLCBPYmplY3RFbGVtZW50ICogYVByb2dyYW0pOworCisKKwkvKioKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogQ09NUElMQVRJT04KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJdm9pZCBjb21waWxlUHJvZ3JhbShBdm1Qcm9ncmFtICogYW5Bdm1Qcm9ncmFtKTsKKworfTsKKworCit9CisKKworCisjZW5kaWYgLyogQlVJTERFUl9DT01QSUxFUl9DT01QSUxFUk9GUFJPR1JBTV9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9jb21waWxlci9Db21waWxlck9mVHJhbnNpdGlvbi5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL2NvbXBpbGVyL0NvbXBpbGVyT2ZUcmFuc2l0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWViMGEzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9jb21waWxlci9Db21waWxlck9mVHJhbnNpdGlvbi5jcHAKQEAgLTAsMCArMSwxNDIwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTAgbm92LiAyMDA4CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJDb21waWxlck9mVHJhbnNpdGlvbi5oIgorCisjaW5jbHVkZSA8YnVpbGRlci9hbmFseXNpcy9Db21tdW5pY2F0aW9uRGVwZW5kZW5jeS5oPgorI2luY2x1ZGUgPGJ1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVDb21waWxlci5oPgorI2luY2x1ZGUgPGJ1aWxkZXIvcHJpbWl0aXZlL0NvbXBpbGF0aW9uRW52aXJvbm1lbnQuaD4KKyNpbmNsdWRlIDxidWlsZGVyL2NvbXBpbGVyL0NvbXBpbGVyLmg+CisjaW5jbHVkZSA8YnVpbGRlci9jb21waWxlci9Db21waWxlck9mVmFyaWFibGUuaD4KKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0F2bUxhbWJkYS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVGb3JtLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZUxpYi5oPgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkNvbnN0cnVjdG9yLmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvblR5cGVDaGVja2VyLmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vU3RhdGVtZW50Q29uc3RydWN0b3IuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9TdGF0ZW1lbnRGYWN0b3J5Lmg+CisKKyNpbmNsdWRlIDxmbWwvb3BlcmF0b3IvT3BlcmF0b3IuaD4KKyNpbmNsdWRlIDxmbWwvb3BlcmF0b3IvT3BlcmF0b3JNYW5hZ2VyLmg+CisKKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvQmVoYXZpb3JhbFBhcnQuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvVHJhbnNpdGlvbi5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvKioKKyAqIENPTlNUUlVDVE9SCisgKiBEZWZhdWx0CisgKi8KK0NvbXBpbGVyT2ZUcmFuc2l0aW9uOjpDb21waWxlck9mVHJhbnNpdGlvbihDb21waWxlciAmIGFDb21waWxlcikKKzogQmFzZUNvbXBpbGVyKGFDb21waWxlciksCittQ29tcGlsZXIoIGFDb21waWxlciApLAorbURhdGFDb21waWxlciggYUNvbXBpbGVyLm1EYXRhQ29tcGlsZXIgKSwKK21Nb2NTdGFjayggKSwKK21DdXJyZW50TW9jKCBOVUxMICksCittRGVmYXVsdE1vYyggVHJhbnNpdGlvbk1vYzo6TU9FX1JERV9SVU4gKQoreworCXNldERlZmF1bHRNb2MoKTsKK30KKworCisKK3ZvaWQgQ29tcGlsZXJPZlRyYW5zaXRpb246OnNldERlZmF1bHRNb2MoKQoreworCW1DdXJyZW50TW9jID0gJiBtRGVmYXVsdE1vYzsKK30KKworCit2b2lkIENvbXBpbGVyT2ZUcmFuc2l0aW9uOjpwdXNoTW9jKFdPYmplY3QgKiBtb2NUcmFuc2l0aW9uKQoreworCW1DdXJyZW50TW9jID0gbmV3IFRyYW5zaXRpb25Nb2MoIG1vY1RyYW5zaXRpb24gKTsKKworCW1Nb2NTdGFjay5wdXNoX2JhY2soIG1DdXJyZW50TW9jICk7Cit9CisKK3ZvaWQgQ29tcGlsZXJPZlRyYW5zaXRpb246OnBvcE1vYygpCit7CisJaWYoIG1Nb2NTdGFjay5ub25lbXB0eSgpICkKKwl7CisJCWRlbGV0ZSggbU1vY1N0YWNrLnBvcF9sYXN0KCkgKTsKKwl9CisKKwlpZiggbU1vY1N0YWNrLm5vbmVtcHR5KCkgKQorCXsKKwkJbUN1cnJlbnRNb2MgPSBtTW9jU3RhY2subGFzdCgpOworCX0KKwllbHNlCisJeworCQltQ3VycmVudE1vYyA9ICYgbURlZmF1bHRNb2M7CisJfQorfQorCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBSRUNPTVBJTEFUSU9OCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCit2b2lkIENvbXBpbGVyT2ZUcmFuc2l0aW9uOjpwcmVjb21waWxlVHJhbnNpdGlvbigKKwkJRXhlY3V0YWJsZUZvcm0gKiBhQ29udGFpbmVyLCBUcmFuc2l0aW9uICogYVRyYW5zaXRpb24pCit7CisvLwlBVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICI8JCQkJCQgcHJlY29tcGlsaW5nIHRyYW5zaXRpb24gPCAiCisvLwkJCTw8IGFUcmFuc2l0aW9uLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8ICIgPiIgPDwgc3RkOjplbmRsOworCisJQXZtVHJhbnNpdGlvbiAqIGFuQXZtVHJhbnNpdGlvbiA9CisJCQluZXcgQXZtVHJhbnNpdGlvbihhQ29udGFpbmVyLCBhVHJhbnNpdGlvbiwgMCk7CisKKwlnZXRTeW1ib2xUYWJsZSgpLmFkZFRyYW5zaXRpb24oCisJCQlhQ29udGFpbmVyLT5zYXZlVHJhbnNpdGlvbiggYW5Bdm1UcmFuc2l0aW9uICkgKTsKKworCU1hY2hpbmUgKiB0YXJnZXQgPSBOVUxMOworCWlmKCBhVHJhbnNpdGlvbi0+aGFzVGFyZ2V0KCkgKQorCXsKKwkJdGFyZ2V0ID0gZ2V0VHJhbnNpdGlvblRhcmdldChhVHJhbnNpdGlvbiwgYVRyYW5zaXRpb24tPmdldFRhcmdldCgpKTsKKwkJaWYoIHRhcmdldCAhPSBOVUxMICkKKwkJeworCQkJYVRyYW5zaXRpb24tPmdldFRhcmdldCgpLmFjcXVpcmVQb2ludGVyKCB0YXJnZXQgKTsKKworCQkJdGFyZ2V0LT5nZXRVbmlxQmVoYXZpb3JQYXJ0KCktPgorCQkJCQlhcHBlbmRJbmNvbWluZ1RyYW5zaXRpb24oIElOQ1JfQkYoYVRyYW5zaXRpb24pICk7CisJCX0KKwl9CisKKwkvKgorCSAqIEFsbG9jYXRpb24gb2YgZGVjbGFyYXRpb24gY29udGVudHMgOj4KKwkgKiBjb25zdGFudCwgdmFyaWFibGUsIHR5cGVkZWYsIGJ1ZmZlciwgcG9ydAorCSAqLworCWlmKCBhVHJhbnNpdGlvbi0+aGFzRGVjbGFyYXRpb24oKSApCisJeworCQlUYWJsZU9mSW5zdGFuY2VPZkRhdGEgdGFibGVPZlZhcmlhYmxlOworCisJCW1Db21waWxlci5wcmVjb21waWxlRGF0YVR5cGUoYW5Bdm1UcmFuc2l0aW9uLAorCQkJCSooYVRyYW5zaXRpb24tPmdldERlY2xhcmF0aW9uKCkpLCB0YWJsZU9mVmFyaWFibGUpOworCisJCS8qCisJCSAqIFVwZGF0ZSBkYXRhIHRhYmxlCisJCSAqLworCQlhbkF2bVRyYW5zaXRpb24tPnNldERhdGEodGFibGVPZlZhcmlhYmxlKTsKKwl9CisKKworCisvLwlBVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICI+JCQkJCQgZW5kIHByZWNvbXBpbGluZyB0cmFuc2l0aW9uIDwgIgorLy8JCQk8PCBhVHJhbnNpdGlvbi0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiID4iIDw8IHN0ZDo6ZW5kbDsKK30KKworCisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ09NUElMQVRJT04KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoqCisgKiBjb21waWxlCisgKiB0cmFuc2l0aW9uCisgKi8KK3ZvaWQgQ29tcGlsZXJPZlRyYW5zaXRpb246OmNvbXBpbGVUcmFuc2l0aW9uKEF2bVRyYW5zaXRpb24gKiBhbkF2bVRyYW5zaXRpb24pCit7CisJY29uc3QgVHJhbnNpdGlvbiAqIGFUcmFuc2l0aW9uID0gYW5Bdm1UcmFuc2l0aW9uLT5nZXRBc3RUcmFuc2l0aW9uKCk7CisKKy8vCUFWTV9PU19UUkFDRSA8PCBUQUIgPDwgIjx8IGNvbXBpbGluZzx0cmFuc2l0b24+OiAiCisvLwkJCTw8IFRSSU0oYVRyYW5zaXRpb24tPnRvU3RyaW5nKEFWTV9PU19UUkFDRS5JTkRFTlQpKQorLy8JCQk8PCBzdGQ6OmVuZGw7CisKKwljb25zdCBNYWNoaW5lICogc291cmNlID0gYVRyYW5zaXRpb24tPmdldFNvdXJjZSgpOworCWNvbnN0IE1hY2hpbmUgKiB0YXJnZXQgPSBOVUxMOworCisJQkYgdGFyZ2V0VmFyaWFibGU7CisJQkYgdGFyZ2V0TWFjaGluZTsKKworCWlmKCBhVHJhbnNpdGlvbi0+aGFzVGFyZ2V0KCkgKQorCXsKKwkJQkYgdGd0ID0gY29tcGlsZVRyYW5zaXRpb25UYXJnZXQoYW5Bdm1UcmFuc2l0aW9uLCBhVHJhbnNpdGlvbi0+Z2V0VGFyZ2V0KCkpOworCisJCWlmKCB0Z3QudmFsaWQoKSApCisJCXsKKwkJCWFuQXZtVHJhbnNpdGlvbi0+c2V0VGFyZ2V0KCB0Z3QgKTsKKworCQkJaWYoIHRndC5pczwgSW5zdGFuY2VPZk1hY2hpbmUgPigpICkKKwkJCXsKKwkJCQl0YXJnZXQgPSB0Z3QudG9fcHRyPCBJbnN0YW5jZU9mTWFjaGluZSA+KCktPmdldEFzdE1hY2hpbmUoKTsKKworCQkJCXRhcmdldE1hY2hpbmUgPSB0Z3Q7CisKKwkJCQlpZiggdGFyZ2V0LT5nZXRTcGVjaWZpZXIoKS5pc1BzZXVkb3N0YXRlSW5pdGlhbCgpICkKKwkJCQl7CisJCQkJCWluY3JXYXJuaW5nQ291bnQoKTsKKwkJCQkJYVRyYW5zaXRpb24tPndhcm5pbmdMb2NhdGlvbihBVk1fT1NfV0FSTikKKwkJCQkJCQk8PCAiVW5leHBlY3RlZCB0aGUgcHNldWRvLXN0YXRlPCBpbml0aWFsID4gJyIKKwkJCQkJCQk8PCB0YXJnZXQtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKwkJCQkJCQk8PCAiJyBhcyB0YXJnZXQgb2YgdGhlIHRyYW5zaXRpb24gOiAiCisJCQkJCQkJPDwgc3RyX2hlYWRlciggYVRyYW5zaXRpb24gKSA8PCBzdGQ6OmVuZGw7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiggdGd0LmlzPCBJbnN0YW5jZU9mRGF0YSA+KCkgKQorCQkJeworCQkJCXRhcmdldFZhcmlhYmxlID0gdGd0OworCQkJfQorCQl9CisJfQorCisJLy8gQnkgZGVmYXVsdCA6IHRoZSBsYXN0IGFjdGl2ZSBzdGF0ZQorCS8vIE9ubHkgZm9yIFRyYWNlIHVzYWdlCisJZWxzZSBpZiggbm90IHNvdXJjZS0+Z2V0U3BlY2lmaWVyKCkuaXNQc2V1ZG9zdGF0ZSgpICkKKwl7CisJCWFuQXZtVHJhbnNpdGlvbi0+c2V0VGFyZ2V0KAorCQkJCWdldFN5bWJvbFRhYmxlKCkuc2VhcmNoSW5zdGFuY2VTdGF0aWMoc291cmNlKSApOworCisJCS8vPz8/CisvLwkJYVRyYW5zaXRpb24tPnNldFRhcmdldCggYW5Bdm1UcmFuc2l0aW9uLT5nZXRUYXJnZXQoKSApOworLy8JCWFUcmFuc2l0aW9uLT5zZXRUYXJnZXQoIElOQ1JfQkYoc291cmNlKSApOworCX0KKwllbHNlCisJeworCQkvLyBUT0RPIGZvdW5kIGxhc3Qgc3RhYmxlIHN0YXRlICEhIQorCX0KKworCisJLy8gQ09NUElMQVRJT04gT0YgREFUQQorCW1EYXRhQ29tcGlsZXIuY29tcGlsZURhdGEoYW5Bdm1UcmFuc2l0aW9uKTsKKworCS8qCisJICogRVZBTCB0cmFuc2l0aW9uCisJICovCisJQkZDb2RlIE9uUnVuKE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU0VRVUVOQ0UpOworCisJLy8gRElTQUJMRSBzb3VyY2UgLyBFTkFCTEUgdGFyZ2V0CisJQkZDb2RlIGRpc2FibGVTb3VyY2U7CisJQkZDb2RlIGVuYWJsZVRhcmdldDsKKwlCRkNvZGVMaXN0IGllbmFibGVBdG9taWNTZXF1ZW5jZTsKKworCS8vIERJU0FCTEUgc291cmNlCisJZGlzYWJsZVNvdXJjZSA9IFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJYVRyYW5zaXRpb24tPmhhc01vY0Fib3J0KCkgPworCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FCT1JUX0lOVk9LRSA6CisJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfRElTQUJMRV9JTlZPS0UpOworCisJaWYoIHRhcmdldE1hY2hpbmUudmFsaWQoKSApCisJeworCQllbmFibGVUYXJnZXQgPSBCRkNvZGUoIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfRU5BQkxFX0lOVk9LRSwKKwkJCQl0YXJnZXRNYWNoaW5lKTsKKworCQlpZiggdGFyZ2V0LT5nZXRTcGVjaWZpZXIoKS5oYXNQc2V1ZG9zdGF0ZUhpc3RvcnkoKSApCisJCXsKKwkJCS8vISEgbW9lPCBzdGF0ZW1hY2hpbmUgPiA6PiBkb24ndCBpbnZva2UgRU5BQkxFX1NFVAorCQl9CisJCWVsc2UgaWYoIHRhcmdldC0+Z2V0U3BlY2lmaWVyKCkuaGFzRmFtaWx5UHNldWRvc3RhdGVFbmRpbmcoKSApCisJCXsKKwkJCWVuYWJsZVRhcmdldCA9IFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NFUVVFTkNFLAorCQkJCQlTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfRU5BQkxFX1NFVCwgdGFyZ2V0TWFjaGluZSksCisJCQkJCWVuYWJsZVRhcmdldCk7CisJCX0KKwkJZWxzZSBpZiggdGFyZ2V0LT5nZXRTcGVjaWZpZXIoKS5pc1BzZXVkb3N0YXRlKCkgKQorCQl7CisJCQkvLyEhIG1vZTwgc3RhdGVtYWNoaW5lID4gOj4gbm8gbmVlZCB0byBpbnZva2UgRU5BQkxFX1NFVAorCQl9CisJCS8vIFRSQU5TSVRJT04gSU5TVEFCTEUKKwkJZWxzZSBpZiggYVRyYW5zaXRpb24tPmdldE1vZGlmaWVyKCkuaGFzRmVhdHVyZVRyYW5zaWVudCgpICkKKwkJeworCQkJZW5hYmxlVGFyZ2V0ID0gU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQVRPTUlDX1NFUVVFTkNFLAorCQkJCQlTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0lFTkFCTEVfSU5WT0tFLAorCQkJCQkJCXRhcmdldE1hY2hpbmUpLAorCQkJCQlTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfUlVOLCB0YXJnZXRNYWNoaW5lKSApOworCQl9CisJCWVsc2UgaWYoIENPTVBJTEVfQ09OVEVYVDo6SU5MSU5FX0VOQUJMRV9NQVNLICkKKwkJeworCQkJZW5hYmxlVGFyZ2V0ID0gU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU0VRVUVOQ0UsCisJCQkJCVN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9FTkFCTEVfU0VULCB0YXJnZXRNYWNoaW5lKSwKKwkJCQkJZW5hYmxlVGFyZ2V0KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWVuYWJsZVRhcmdldCA9IFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FUT01JQ19TRVFVRU5DRSwKKwkJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0VOQUJMRV9TRVQsIHRhcmdldE1hY2hpbmUpLAorCQkJCQllbmFibGVUYXJnZXQpOworCQl9CisKKwkJaWYoIHNvdXJjZSA9PSB0YXJnZXQgKQorCQl7CisJCQlpZiggc291cmNlLT5nZXRTcGVjaWZpZXIoKS5pc1BzZXVkb3N0YXRlSW5pdGlhbCgpICkKKwkJCXsKKwkJCQlpbmNyRXJyb3JDb3VudCgpOworCQkJCUFWTV9PU19XQVJOIDw8IHNvdXJjZS0+ZXJyb3JMb2NhdGlvbihhVHJhbnNpdGlvbikKKwkJCQkJCTw8ICJVbmV4cGVjdGVkIHRyYW5zaXRpb24gbG9vcCBpbiBpbml0aWFsIHN0YXRlIDw8ICIKKwkJCQkJCTw8IHN0cl9oZWFkZXIoIHNvdXJjZSApIDw8ICIgPj4gISEhIiA8PCBzdGQ6OmVuZGw7CisJCQl9CisJCQllbHNlIGlmKCBzb3VyY2UtPmdldFNwZWNpZmllcigpLmlzUHNldWRvc3RhdGUoKSApCisJCQl7CisJCQkJaW5jcldhcm5pbmdDb3VudCgpOworCQkJCUFWTV9PU19XQVJOIDw8IHNvdXJjZS0+d2FybmluZ0xvY2F0aW9uKGFUcmFuc2l0aW9uKQorCQkJCQkJPDwgIlRyYW5zaXRpb24gbG9vcCBpbiAodW5zdGFibGUpIHBzZXVkbyBzdGF0ZSA8PCAiCisJCQkJCQk8PCBzdHJfaGVhZGVyKCBzb3VyY2UgKSA8PCAiID4+ICEhISIgPDwgc3RkOjplbmRsOworCQkJfQorCisJCQkvLyEhIE5PVEhJTkcKKwkJCS8vIEJFVFdFRU4gIERJU0FCTEUvQUJPUlQgU09VUkNFCisJCQkvLyA9PT4gIEVOQUJMRSBUQVJHRVQKKwkJfQorCisJCWVsc2UgaWYoIHNvdXJjZS0+Z2V0Q29udGFpbmVyTWFjaGluZSgpID09IHRhcmdldC0+Z2V0Q29udGFpbmVyTWFjaGluZSgpICkKKwkJeworCQkJLy8hISBOT1RISU5HCisJCQkvLyBCRVRXRUVOICBESVNBQkxFL0FCT1JUIFNPVVJDRQorCQkJLy8gPT0+ICBFTkFCTEUgVEFSR0VUCisJCX0KKworCQllbHNlIGlmKCBzb3VyY2UgPT0gdGFyZ2V0LT5nZXRDb250YWluZXJNYWNoaW5lKCkgKQorCQl7CisJCQkvLyBJRElTQUJMRS9JQUJPUlQgU09VUkNFCisJCQkvLyA9PT4gIElFTkFCTEUgJiBFTkFCTEUgVEFSR0VUCisJCQlkaXNhYmxlU291cmNlID0gU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCWFUcmFuc2l0aW9uLT5oYXNNb2NBYm9ydCgpID8KKwkJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0lBQk9SVF9JTlZPS0UgOgorCQkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfSURJU0FCTEVfSU5WT0tFKTsKKworCQkJZGlzYWJsZVNvdXJjZSA9IFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FUT01JQ19TRVFVRU5DRSwKKwkJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQkJYVRyYW5zaXRpb24tPmhhc01vY0Fib3J0KCkgPworCQkJCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BQk9SVF9DSElMRCA6CisJCQkJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0RJU0FCTEVfQ0hJTEQpLAorCQkJCQlkaXNhYmxlU291cmNlKTsKKworCQkJaWVuYWJsZUF0b21pY1NlcXVlbmNlLnB1c2hfZnJvbnQoCisJCQkJCUJGQ29kZShPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0lFTkFCTEVfSU5WT0tFKSApOworLy8JCQkJCQkJRXhlY3V0YWJsZUxpYjo6TUFDSElORV9TRUxGKSApOworCQl9CisKKwkJZWxzZSBpZiggc291cmNlLT5nZXRDb250YWluZXJNYWNoaW5lKCkgPT0gdGFyZ2V0ICkKKwkJeworCQkJLy8gRElTQUJMRS9BQk9SVCBTT1VSQ0UgJiBJRElTQUJMRS9JQUJPUlQgQ09OVEFJTkVSCisJCQkvLyA9PT4gIElFTkFCTEUgJiBFTkFCTEUgVEFSR0VUCisJCQlkaXNhYmxlU291cmNlID0gU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQVRPTUlDX1NFUVVFTkNFLAorCQkJCQlkaXNhYmxlU291cmNlLAorCQkJCQlTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQkJCQlhVHJhbnNpdGlvbi0+aGFzTW9jQWJvcnQoKSA/CisJCQkJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0lBQk9SVF9JTlZPS0UgOgorCQkJCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9JRElTQUJMRV9JTlZPS0UpICk7CisKKwkJCWVuYWJsZVRhcmdldCA9IEJGQ29kZSgKKwkJCQkJYVRyYW5zaXRpb24tPmdldE1vZGlmaWVyKCkuaGFzRmVhdHVyZVRyYW5zaWVudCgpCisJCQkJCQk/IE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfUkVUVVJOCisJCQkJCQk6IE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfRU5BQkxFX0lOVk9LRSApOworCQl9CisKKwkJZWxzZQorCQl7CisJCQljb25zdCBNYWNoaW5lICogbGNhTWFjaGluZSA9IHNvdXJjZS0+TENBKAorCQkJCSggdGFyZ2V0LT5nZXRTcGVjaWZpZXIoKS5oYXNQc2V1ZG9zdGF0ZUhpc3RvcnkoKQorCQkJCXx8IHRhcmdldC0+Z2V0U3BlY2lmaWVyKCkuaXNQc2V1ZG9zdGF0ZUluaXRpYWwoKSApID8KKwkJCQkJCXRhcmdldC0+Z2V0Q29udGFpbmVyTWFjaGluZSgpIDogdGFyZ2V0ICk7CisKKwkJCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9QT0lOVEVSX0VYSVQoIGxjYU1hY2hpbmUgKSAiTENBKCAiCisJCQkJCTw8IHNvdXJjZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiICwgIgorCQkJCQk8PCB0YXJnZXQtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIiApICEhISIKKwkJCQkJPDwgU0VORF9FWElUOworCisJCQlpZiggc291cmNlICE9IGxjYU1hY2hpbmUgKQorCQkJeworCQkJCWNvbnN0IE1hY2hpbmUgKiBjb250YWluZXJPZlNvdXJjZSA9IHNvdXJjZS0+Z2V0Q29udGFpbmVyTWFjaGluZSgpOworCQkJCWlmKCBjb250YWluZXJPZlNvdXJjZSAhPSBsY2FNYWNoaW5lICkKKwkJCQl7CisJCQkJCWF2bV91aW50ZWdlcl90IGRpc2FibGVMZXZlbCA9IDE7CisKKwkJCQkJZm9yKCA7IGNvbnRhaW5lck9mU291cmNlICE9IGxjYU1hY2hpbmUgOyArK2Rpc2FibGVMZXZlbCApCisJCQkJCXsKKwkJCQkJCWNvbnRhaW5lck9mU291cmNlID0KKwkJCQkJCQkJY29udGFpbmVyT2ZTb3VyY2UtPmdldENvbnRhaW5lck1hY2hpbmUoKTsKKwkJCQkJfQorCisJCQkJCWRpc2FibGVTb3VyY2UgPSBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQkJCQlhVHJhbnNpdGlvbi0+aGFzTW9jQWJvcnQoKQorCQkJCQkJCQk/IE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQUJPUlRfU0VMVkVTCisJCQkJCQkJCTogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9ESVNBQkxFX1NFTFZFUywKKwkJCQkJCQlFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld1VJbnRlZ2VyKGRpc2FibGVMZXZlbCkgKTsKKworCQkJCQlpZiggc291cmNlLT5oYXNNYWNoaW5lKCkgKQorCQkJCQl7CisJCQkJCQlkaXNhYmxlU291cmNlID0gU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BVE9NSUNfU0VRVUVOQ0UsCisJCQkJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQkJCWFUcmFuc2l0aW9uLT5oYXNNb2NBYm9ydCgpID8KKwkJCQkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQUJPUlRfQ0hJTEQgOgorCQkJCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9ESVNBQkxFX0NISUxEKSwKKwkJCQkJCQlkaXNhYmxlU291cmNlKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJaWYoIHRhcmdldC0+Z2V0Q29udGFpbmVyTWFjaGluZSgpICE9IGxjYU1hY2hpbmUgKQorCQkJeworCQkJCWNvbnN0IE1hY2hpbmUgKiBjb250YWluZXJPZlRhcmdldCA9IHRhcmdldC0+Z2V0Q29udGFpbmVyTWFjaGluZSgpOworCQkJCWZvciggOyBjb250YWluZXJPZlRhcmdldCAhPSBsY2FNYWNoaW5lIDsKKwkJCQkJY29udGFpbmVyT2ZUYXJnZXQgPSBjb250YWluZXJPZlRhcmdldC0+Z2V0Q29udGFpbmVyTWFjaGluZSgpICkKKwkJCQl7CisJCQkJCWlmKCAodGFyZ2V0TWFjaGluZSA9IGdldFN5bWJvbFRhYmxlKCkuc2VhcmNoSW5zdGFuY2VTdGF0aWMoCisJCQkJCQkJY29udGFpbmVyT2ZUYXJnZXQpKS52YWxpZCgpICkKKwkJCQkJeworCQkJCQkJaWVuYWJsZUF0b21pY1NlcXVlbmNlLnB1c2hfZnJvbnQoCisJCQkJCQkJCUJGQ29kZShPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0lFTkFCTEVfSU5WT0tFLAorCQkJCQkJCQkJCXRhcmdldE1hY2hpbmUpICk7CisvLwkJCQkJCQkJCQlFeGVjdXRhYmxlTGliOjpNQUNISU5FX1NFTEYpICk7CisKKwkJCQkJCWllbmFibGVBdG9taWNTZXF1ZW5jZS5wdXNoX2Zyb250KAorCQkJCQkJCQlCRkNvZGUoT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9FTkFCTEVfU0VULAorCQkJCQkJCQkJCXRhcmdldE1hY2hpbmUpICk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlpbmNyRXJyb3JDb3VudCgpOworCQkJCQkJYVRyYW5zaXRpb24tPmVycm9yTG9jYXRpb24oQVZNX09TX1dBUk4pCisJCQkJCQkJCTw8ICJVbmZvdW5kIHRyYW5zaXRpb24gdGFyZ2V0IGNvbnRhaW5lciIKKwkJCQkJCQkJCSIgc3RhdGUgaW5zdGFuY2UgPCAiCisJCQkJCQkJCTw8IHN0cl9oZWFkZXIoIGNvbnRhaW5lck9mVGFyZ2V0ICkKKwkJCQkJCQkJPDwgIiA+IHdoZXJlIExDQSBpcyA8ICIKKwkJCQkJCQkJPDwgc3RyX2hlYWRlciggbGNhTWFjaGluZSApPDwgIiA+IgorCQkJCQkJCQk8PCBzdGQ6OmVuZGwKKwkJCQkJCQkJPDwgYVRyYW5zaXRpb24tPnRvU3RyaW5nKEFWTV9UQUIxX0lOREVOVCkKKwkJCQkJCQkJPDwgc3RkOjplbmRsOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCWVsc2UgaWYoIHRhcmdldFZhcmlhYmxlLnZhbGlkKCkgKQorCXsKKwkJZW5hYmxlVGFyZ2V0ID0gQkZDb2RlKCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0VOQUJMRV9JTlZPS0UsCisJCQkJdGFyZ2V0VmFyaWFibGUpOworCisJCWVuYWJsZVRhcmdldCA9IFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQVRPTUlDX1NFUVVFTkNFLAorCQkJCVN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0VOQUJMRV9TRVQsIHRhcmdldFZhcmlhYmxlKSwKKwkJCQllbmFibGVUYXJnZXQpOworCX0KKworCisJaWYoIGFUcmFuc2l0aW9uLT5oYXNTdGF0ZW1lbnQoKSApCisJeworCQkvLyBBdHRlbnRpb246IGNyw6lhdGlvbiBwb3NzaWJsZSBkZSB2YXJpYWJsZSBsb2NhbCBkYW5zIGxlIGNvbnRlbmV1ciwKKwkJLy8gaS5lLiBsJ8OpdGF0IHNvdXJjZSBkZSBsYSB0cmFuc2l0aW9uCisJCU9uUnVuLT5hcHBlbmRGbGF0KCBhVHJhbnNpdGlvbi0+Z2V0U3RhdGVtZW50KCkgKTsKKwl9CisKKwkvKgorCSAqIERJU0FCTEUgc291cmNlIC8gRU5BQkxFIHRhcmdldAorCSAqLworCWlmKCBkaXNhYmxlU291cmNlLnZhbGlkKCkgJiYgZW5hYmxlVGFyZ2V0LnZhbGlkKCkgJiYKKwkJCSghIGFUcmFuc2l0aW9uLT5pc01vY0ludGVybmFsKCkpICkKKwl7CisJCXN3aXRjaCggbUN1cnJlbnRNb2MtPmdldE1vZVJ1bigpICkKKwkJeworCQkJY2FzZSBUcmFuc2l0aW9uTW9jOjpNT0VfUkRFX1JVTjoKKwkJCXsKKy8vCQkJCU9uUnVuLT5wdXNoX2JhY2soIGRpc2FibGVTb3VyY2UgKTsKKy8vCQkJCU9uUnVuLT5wdXNoX2JhY2soIGllbmFibGVBdG9taWNTZXF1ZW5jZSApOworLy8JCQkJT25SdW4tPnB1c2hfYmFjayggZW5hYmxlVGFyZ2V0ICk7CisKKwkJCQlpZiggaWVuYWJsZUF0b21pY1NlcXVlbmNlLm5vbmVtcHR5KCkgKQorCQkJCXsKKwkJCQkJQkZDb2RlIGRpc2FibGVFbmFibGVBdG9taWNTZXF1ZW5jZSgKKwkJCQkJCQlTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZUZsYXQoCisJCQkJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NFUVVFTkNFLAorCQkJCQkJCQkJZGlzYWJsZVNvdXJjZSkgKTsKKwkJCQkJZGlzYWJsZUVuYWJsZUF0b21pY1NlcXVlbmNlLT5wdXNoX2JhY2soaWVuYWJsZUF0b21pY1NlcXVlbmNlKTsKKwkJCQkJZGlzYWJsZUVuYWJsZUF0b21pY1NlcXVlbmNlLT5wdXNoX2JhY2soZW5hYmxlVGFyZ2V0KTsKKworCQkJCQlPblJ1bi0+cHVzaF9iYWNrKCBkaXNhYmxlRW5hYmxlQXRvbWljU2VxdWVuY2UgKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJT25SdW4tPnB1c2hfYmFjayggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGVGbGF0KAorCQkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU0VRVUVOQ0UsCisJCQkJCQkJZGlzYWJsZVNvdXJjZSwgZW5hYmxlVGFyZ2V0ICkgKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNhc2UgVHJhbnNpdGlvbk1vYzo6TU9FX0RSRV9SVU46CisJCQl7CisJCQkJT25SdW4tPnB1c2hfZnJvbnQoIGRpc2FibGVTb3VyY2UgKTsKKworCQkJCWlmKCBpZW5hYmxlQXRvbWljU2VxdWVuY2Uubm9uZW1wdHkoKSApCisJCQkJeworCQkJCQlCRkNvZGUgaWVuYWJsZUVuYWJsZUF0b21pY1NlcXVlbmNlKAorCQkJCQkJCVN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TRVFVRU5DRSwKKwkJCQkJCQkJCWllbmFibGVBdG9taWNTZXF1ZW5jZSkgKTsKKwkJCQkJaWVuYWJsZUVuYWJsZUF0b21pY1NlcXVlbmNlLT5wdXNoX2JhY2soIGVuYWJsZVRhcmdldCApOworCisJCQkJCU9uUnVuLT5wdXNoX2JhY2soIGllbmFibGVFbmFibGVBdG9taWNTZXF1ZW5jZSApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlPblJ1bi0+cHVzaF9iYWNrKCBlbmFibGVUYXJnZXQgKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNhc2UgVHJhbnNpdGlvbk1vYzo6TU9FX0RFUl9SVU46CisJCQl7CisvLwkJCQlPblJ1bi0+cHVzaF9mcm9udCggZW5hYmxlVGFyZ2V0ICk7CisvLwkJCQlPblJ1bi0+cHVzaF9mcm9udCggaWVuYWJsZUF0b21pY1NlcXVlbmNlICk7CisvLwkJCQlPblJ1bi0+cHVzaF9mcm9udCggZGlzYWJsZVNvdXJjZSApOworCisJCQkJaWYoIGllbmFibGVBdG9taWNTZXF1ZW5jZS5ub25lbXB0eSgpICkKKwkJCQl7CisJCQkJCUJGQ29kZSBkaXNhYmxlRW5hYmxlQXRvbWljU2VxdWVuY2UoCisJCQkJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGVGbGF0KAorCQkJCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TRVFVRU5DRSwKKwkJCQkJCQkJCWRpc2FibGVTb3VyY2UpICk7CisJCQkJCWRpc2FibGVFbmFibGVBdG9taWNTZXF1ZW5jZS0+cHVzaF9iYWNrKCBpZW5hYmxlQXRvbWljU2VxdWVuY2UgKTsKKwkJCQkJZGlzYWJsZUVuYWJsZUF0b21pY1NlcXVlbmNlLT5wdXNoX2JhY2soIGVuYWJsZVRhcmdldCApOworCisJCQkJCU9uUnVuLT5wdXNoX2Zyb250KCBkaXNhYmxlRW5hYmxlQXRvbWljU2VxdWVuY2UgKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJT25SdW4tPnB1c2hfZnJvbnQoIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlRmxhdCgKKwkJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NFUVVFTkNFLAorCQkJCQkJCWRpc2FibGVTb3VyY2UsIGVuYWJsZVRhcmdldCApICk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCQljYXNlIFRyYW5zaXRpb25Nb2M6Ok1PRV9VTkRFRklORURfUlVOOgorCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQkvLyEhISBOT1RISU5HCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiggT25SdW4tPm5vbmVtcHR5KCkgKQorCXsKKwkJYW5Bdm1UcmFuc2l0aW9uLT5zZXRDb2RlKCBtQXZtY29kZUNvbXBpbGVyLgorCQkJCWNvbXBpbGVTdGF0ZW1lbnQoYW5Bdm1UcmFuc2l0aW9uLCBPblJ1bikgKTsKKworCQlpZiggYVRyYW5zaXRpb24tPmhhc1N0YXRlbWVudCgpICkKKwkJeworCQkJLy8gQXR0ZW50aW9uOiBjcsOpYXRpb24gcG9zc2libGUgZGUgdmFyaWFibGUgbG9jYWwgZGFucyBsZSBjb250ZW5ldXIsCisJCQkvLyBpLmUuIGwnw6l0YXQgc291cmNlIGRlIGxhIHRyYW5zaXRpb24KKwkJCUJGQ29kZSBhQ29tcGlsZWRDb2RlID0gYW5Bdm1UcmFuc2l0aW9uLT5nZXRDb2RlKCk7CisKKworCQkJLy8gdGhlIGNvbW11bmljYXRpb24gaW5mb3JtYXRpb24KKwkJCWJvb2wgaGFzTXV0YWJsZVNjaGVkdWxlID0gZmFsc2U7CisKKwkJCWFuQXZtVHJhbnNpdGlvbi0+c2V0Q29tbXVuaWNhdGlvbkNvZGUoCisJCQkJCUNvbW11bmljYXRpb25EZXBlbmRlbmN5OjpnZXRDb21tdW5pY2F0aW9uQ29kZSgKKwkJCQkJCQlhbkF2bVRyYW5zaXRpb24sIGFDb21waWxlZENvZGUsIGhhc011dGFibGVTY2hlZHVsZSkgKTsKKworCQkJYW5Bdm1UcmFuc2l0aW9uLT5zZXRNdXRhYmxlQ29tbXVuaWNhdGlvbiggaGFzTXV0YWJsZVNjaGVkdWxlICk7CisKKworCQkJYW5Bdm1UcmFuc2l0aW9uLT5zZXRJbnRlcm5hbENvbW11bmljYXRpb25Db2RlKAorCQkJCQlDb21tdW5pY2F0aW9uRGVwZW5kZW5jeTo6Z2V0SW50ZXJuYWxDb21tdW5pY2F0aW9uQ29kZSgKKwkJCQkJCQlhbkF2bVRyYW5zaXRpb24sIGFDb21waWxlZENvZGUsIGhhc011dGFibGVTY2hlZHVsZSkgKTsKKworLy8/PyEhPz8KKy8vCQkJaWYoIGFuQXZtVHJhbnNpdGlvbi0+Z2V0RXhlY3V0YWJsZUNvbnRhaW5lcigpLT4KKy8vCQkJCQlnZXRTcGVjaWZpZXIoKS5oYXNGZWF0dXJlSW5wdXRFbmFibGVkKCkgKQorCQkJeworCQkJCUNvbW11bmljYXRpb25EZXBlbmRlbmN5Ojpjb21wdXRlSW5wdXRFbmFibGVkQ29tKAorCQkJCQkJYW5Bdm1UcmFuc2l0aW9uLCBhQ29tcGlsZWRDb2RlICk7CisKKwkJCQlDb21tdW5pY2F0aW9uRGVwZW5kZW5jeTo6Y29tcHV0ZUlucHV0RW5hYmxlZFNhdmUoCisJCQkJCQlhbkF2bVRyYW5zaXRpb24sIGFDb21waWxlZENvZGUgKTsKKworCisJCQkJQ29tbXVuaWNhdGlvbkRlcGVuZGVuY3k6OmNvbXB1dGVJbnB1dENvbSgKKwkJCQkJCWFuQXZtVHJhbnNpdGlvbiwgYUNvbXBpbGVkQ29kZSk7CisKKwkJCQlDb21tdW5pY2F0aW9uRGVwZW5kZW5jeTo6Y29tcHV0ZU91dHB1dENvbSgKKwkJCQkJCWFuQXZtVHJhbnNpdGlvbiwgYUNvbXBpbGVkQ29kZSk7CisKKworCQkJCWFuQXZtVHJhbnNpdGlvbi0+c2V0RW52aXJvbm1lbnRDb20oCisJCQkJCQlDb21tdW5pY2F0aW9uRGVwZW5kZW5jeTo6Z2V0RW52aXJvbm1lbnRDb20oCisJCQkJCQkJYW5Bdm1UcmFuc2l0aW9uLCBhQ29tcGlsZWRDb2RlLCBoYXNNdXRhYmxlU2NoZWR1bGUpICk7CisKKwkJCQlhbkF2bVRyYW5zaXRpb24tPnNldEVudmlyb25tZW50SW5wdXRDb20oCisJCQkJCQlDb21tdW5pY2F0aW9uRGVwZW5kZW5jeTo6Z2V0RW52aXJvbm1lbnRJbnB1dENvbSgKKwkJCQkJCQlhbkF2bVRyYW5zaXRpb24sIGFDb21waWxlZENvZGUsIGhhc011dGFibGVTY2hlZHVsZSkgKTsKKworCQkJCWFuQXZtVHJhbnNpdGlvbi0+c2V0RW52aXJvbm1lbnRPdXRwdXRDb20oCisJCQkJCQlDb21tdW5pY2F0aW9uRGVwZW5kZW5jeTo6Z2V0RW52aXJvbm1lbnRPdXRwdXRDb20oCisJCQkJCQkJYW5Bdm1UcmFuc2l0aW9uLCBhQ29tcGlsZWRDb2RlLCBoYXNNdXRhYmxlU2NoZWR1bGUpICk7CisKKy8vCQkJCUFWTV9PU19DT1VUIDw8ICJjb21waWxlVHJhbnNpdGlvbjo+ICIKKy8vCQkJCQkJPDwgc3RyX2hlYWRlciggYW5Bdm1UcmFuc2l0aW9uICkgPDwgc3RkOjplbmRsOworLy8JCQkJYW5Bdm1UcmFuc2l0aW9uLT50b1N0cmVhbVN0YXRpY0NvbShBVk1fT1NfQ09VVCk7CisJCQl9CisJCX0KKwl9CisJZWxzZQorCXsKKwkJaWYoIE9wZXJhdG9yTWFuYWdlcjo6aXNTY2hlZHVsZShPblJ1bi0+Z2V0T3BlcmF0b3IoKSkgKQorCQl7CisJCQlPblJ1biA9IFN0YXRlbWVudENvbnN0cnVjdG9yOjpub3BDb2RlKCk7CisJCX0KKwkJYW5Bdm1UcmFuc2l0aW9uLT5zZXRDb2RlKCBPblJ1biApOworCX0KKworLy8JQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiPnwgY29tcGlsaW5nPHRyYW5zaXRvbj46ICIKKy8vCQkJPDwgYVRyYW5zaXRpb24tPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgc3RkOjplbmRsOworfQorCisKKworLyoKKyAqIEdFVFRFUgorICogZm9yIHRyYW5zaXRpb24KKyAqLworTWFjaGluZSAqIENvbXBpbGVyT2ZUcmFuc2l0aW9uOjpnZXRUcmFuc2l0aW9uVGFyZ2V0KAorCQlUcmFuc2l0aW9uICogYVRyYW5zaXRpb24sIGNvbnN0IEJGICYgc21UYXJnZXQpCit7CisJaWYoIHNtVGFyZ2V0LmlzPCBNYWNoaW5lID4oKSApCisJeworCQlyZXR1cm4oIHNtVGFyZ2V0LnRvX3B0cjwgTWFjaGluZSA+KCkgKTsKKwl9CisJZWxzZSBpZiggc21UYXJnZXQuaXM8IFZhcmlhYmxlID4oKSApCisJeworCQlyZXR1cm4oIE5VTEwgKTsKKwl9CisJZWxzZQorCXsKKwkJTWFjaGluZSAqIHRndE1hY2hpbmUgPSBOVUxMOworCisJCU1hY2hpbmUgKiBzcmNNYWNoaW5lID0gYVRyYW5zaXRpb24tPmdldENvbnRhaW5lcigpLT5hczwgTWFjaGluZSA+KCk7CisJCWlmKCBzcmNNYWNoaW5lLT5nZXROYW1lSUQoKSA9PSBzbVRhcmdldC5zdHIoKSApCisJCXsKKwkJCXJldHVybiggc3JjTWFjaGluZSApOworCQl9CisKKwkJTWFjaGluZSAqIGNvbnRhaW5lck1hY2hpbmUgPSBzcmNNYWNoaW5lOworCQl3aGlsZSggY29udGFpbmVyTWFjaGluZS0+aGFzQ29udGFpbmVyKCkgJiYKKwkJCQljb250YWluZXJNYWNoaW5lLT5nZXRDb250YWluZXIoKS0+aXM8IE1hY2hpbmUgPigpICkKKwkJeworCQkJdGd0TWFjaGluZSA9IGNvbnRhaW5lck1hY2hpbmU7CisJCQljb250YWluZXJNYWNoaW5lID0gY29udGFpbmVyTWFjaGluZS0+Z2V0Q29udGFpbmVyKCktPmFzPCBNYWNoaW5lID4oKTsKKworCQkJdGd0TWFjaGluZSA9IGNvbnRhaW5lck1hY2hpbmUtPmdldHJlY01hY2hpbmUoc21UYXJnZXQuc3RyKCksIHRndE1hY2hpbmUpOworCQkJaWYoIHRndE1hY2hpbmUgIT0gTlVMTCApCisJCQl7CisJCQkJaWYoIHRndE1hY2hpbmUtPmhhc0NvbnRhaW5lcigpCisJCQkJCSYmIHRndE1hY2hpbmUtPmdldENvbnRhaW5lcigpLT5pczwgTWFjaGluZSA+KCkKKwkJCQkJJiYgdGd0TWFjaGluZS0+Z2V0Q29udGFpbmVyKCktPnRvPCBNYWNoaW5lID4oKS0+CisJCQkJCQkJZ2V0U3BlY2lmaWVyKCkuaXNNb2NTdGF0ZVRyYW5zaXRpb25TdHJ1Y3R1cmUoKSApCisJCQkJeworCQkJCQlyZXR1cm4oIHRndE1hY2hpbmUgKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJaW5jckVycm9yQ291bnQoKTsKKwkJCQkJYVRyYW5zaXRpb24tPmVycm9yTG9jYXRpb24oQVZNX09TX1dBUk4pCisJCQkJCQkJPDwgIlVuZXhwZWN0ZWQgdHJhbnNpdGlvbiB0YXJnZXQgd2l0aG91dCAiCisJCQkJCQkJImEgU1RBVEVNQUNISU5FPCBvciA+IGNvbnRhaW5lciA6PiAiCisJCQkJCQkJPDwgc3RkOjplbmRsCisJCQkJCQkJPDwgVEFCIDw8ICJ0YXJnZXQgc3RhdGU6PiAiIDw8IHN0cl9oZWFkZXIoIHRndE1hY2hpbmUgKQorCQkJCQkJCTw8IHN0ZDo6ZW5kbAorCQkJCQkJCTw8IFRBQiA8PCAidGFyZ2V0IHN1cGVyOj4gIiA8PCBzdHJfaGVhZGVyKAorCQkJCQkJCQl0Z3RNYWNoaW5lLT5nZXRDb250YWluZXIoKS0+dG88IE1hY2hpbmUgPigpICkKKwkJCQkJCQk8PCBzdGQ6OmVuZGwKKwkJCQkJCQk8PCBhVHJhbnNpdGlvbi0+dG9TdHJpbmcoQVZNX1RBQjFfSU5ERU5UKQorCQkJCQkJCTw8IHN0ZDo6ZW5kbDsKKworCQkJCQlyZXR1cm4oIHRndE1hY2hpbmUgKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiggc3JjTWFjaGluZS0+aGFzTWFjaGluZSgpICkKKwkJeworCQkJTWFjaGluZSAqIHRndE1hY2hpbmUgPQorCQkJCQlzcmNNYWNoaW5lLT5nZXRyZWNNYWNoaW5lKHNtVGFyZ2V0LnN0cigpLCBOVUxMKTsKKwkJCWlmKCB0Z3RNYWNoaW5lICE9IE5VTEwgKQorCQkJeworCQkJCWlmKCB0Z3RNYWNoaW5lLT5oYXNDb250YWluZXIoKQorCQkJCQkmJiB0Z3RNYWNoaW5lLT5nZXRDb250YWluZXIoKS0+aXM8IE1hY2hpbmUgPigpCisJCQkJCSYmIHRndE1hY2hpbmUtPmdldENvbnRhaW5lcigpLT50bzwgTWFjaGluZSA+KCktPgorCQkJCQkJCWdldFNwZWNpZmllcigpLmlzTW9jU3RhdGVUcmFuc2l0aW9uU3RydWN0dXJlKCkgKQorCQkJCXsKKwkJCQkJaW5jcldhcm5pbmdDb3VudCgpOworCQkJCQlhVHJhbnNpdGlvbi0+d2FybmluZ0xvY2F0aW9uKEFWTV9PU19XQVJOKQorCQkJCQkJCTw8ICJUaGUgdHJhbnNpdGlvbiB0YXJnZXQgaXMgYSBzdWItc3RhdGUiCisJCQkJCQkJIiBvZiB0aGUgdHJhbnNpdGlvbiBzb3VyY2UgIgorCQkJCQkJCTw8IHN0ZDo6ZW5kbAorCQkJCQkJCTw8IFRBQiA8PCBzdHJfaGVhZGVyKAorCQkJCQkJCQl0Z3RNYWNoaW5lLT5nZXRDb250YWluZXIoKS0+dG88IE1hY2hpbmUgPigpICkKKwkJCQkJCQk8PCAiIC0tPiAiIDw8IHN0cl9oZWFkZXIoIHRndE1hY2hpbmUgKQorCQkJCQkJCTw8IHN0ZDo6ZW5kbAorCQkJCQkJCTw8IGFUcmFuc2l0aW9uLT50b1N0cmluZyhBVk1fVEFCMV9JTkRFTlQpCisJCQkJCQkJPDwgc3RkOjplbmRsOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlpbmNyRXJyb3JDb3VudCgpOworCQkJCQlhVHJhbnNpdGlvbi0+ZXJyb3JMb2NhdGlvbihBVk1fT1NfV0FSTikKKwkJCQkJCQk8PCAiVW5leHBlY3RlZCB0cmFuc2l0aW9uIHRhcmdldCB3aXRob3V0ICIKKwkJCQkJCQkiYSBTVEFURU1BQ0hJTkU8IG9yID4gY29udGFpbmVyIDo+ICIKKwkJCQkJCQk8PCBzdGQ6OmVuZGwKKwkJCQkJCQk8PCBUQUIgPDwgInRhcmdldCBzdGF0ZTo+ICIKKwkJCQkJCQk8PCBzdHJfaGVhZGVyKCB0Z3RNYWNoaW5lICkKKwkJCQkJCQk8PCBzdGQ6OmVuZGwKKwkJCQkJCQk8PCBUQUIgPDwgInRhcmdldCBzdXBlcjo+ICIgPDwgc3RyX2hlYWRlcigKKwkJCQkJCQkJdGd0TWFjaGluZS0+Z2V0Q29udGFpbmVyKCktPnRvPCBNYWNoaW5lID4oKSApCisJCQkJCQkJPDwgc3RkOjplbmRsCisJCQkJCQkJPDwgYVRyYW5zaXRpb24tPnRvU3RyaW5nKEFWTV9UQUIxX0lOREVOVCkKKwkJCQkJCQk8PCBzdGQ6OmVuZGw7CisJCQkJfQorCisJCQkJcmV0dXJuKCB0Z3RNYWNoaW5lICk7CisJCQl9CisJCX0KKworCQlpbmNyRXJyb3JDb3VudCgpOworCQlhVHJhbnNpdGlvbi0+ZXJyb3JMb2NhdGlvbihBVk1fT1NfV0FSTikKKwkJCQk8PCAiVW5mb3VuZCB0aGUgdHJhbnNpdGlvbiB0YXJnZXQgOj4gIiA8PCBzbVRhcmdldC5zdHIoKQorCQkJCTw8IHN0ZDo6ZW5kbAorCQkJCTw8IGFUcmFuc2l0aW9uLT50b1N0cmluZyhBVk1fVEFCMV9JTkRFTlQpCisJCQkJPDwgc3RkOjplbmRsOworCisJCXJldHVybiggTlVMTCApOworCX0KK30KKworCitCRiBDb21waWxlck9mVHJhbnNpdGlvbjo6Y29tcGlsZVRyYW5zaXRpb25UYXJnZXQoCisJCUF2bVRyYW5zaXRpb24gKiBhbkF2bVRyYW5zaXRpb24sIGNvbnN0IEJGICYgc21UYXJnZXQpCit7CisJaWYoIHNtVGFyZ2V0LmlzPCBWYXJpYWJsZSA+KCkgKQorCXsKKwkJQ29tcGlsYXRpb25FbnZpcm9ubWVudCBjb21waWxFTlYoYW5Bdm1UcmFuc2l0aW9uKTsKKworCQlyZXR1cm4oIGdldFN5bWJvbFRhYmxlKCkuc2VhcmNoRGF0YUluc3RhbmNlKAorCQkJCWNvbXBpbEVOVi5tQ1RYLCBzbVRhcmdldC50b19wdHI8IFZhcmlhYmxlID4oKSkgKTsKKworLy8JCWlmKCBub3QgRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc1R5cGVkKFR5cGVNYW5hZ2VyOjpNQUNISU5FLCBzbVRhcmdldCkgKQorLy8JCXsKKy8vCQkJaW5jckVycm9yQ291bnQoKTsKKy8vCQkJYW5Bdm1UcmFuc2l0aW9uLT5nZXRBc3RFbGVtZW50KCktPmVycm9yTG9jYXRpb24oQVZNX09TX1dBUk4pCisvLwkJCQkJPDwgIlVuZXhwZWN0ZWQgdGhlIHRyYW5zaXRpb24gdmFyaWFibGUgdGFyZ2V0IHR5cGUgOj4gIgorLy8JCQkJCTw8IHN0cl9oZWFkZXIoIHNtVGFyZ2V0LnRvX3B0cjwgVmFyaWFibGUgPigpICkgPDwgc3RkOjplbmRsOworLy8JCX0KKwl9CisKKwlpZiggc21UYXJnZXQuaXM8IE1hY2hpbmUgPigpICkKKwl7CisJCXJldHVybiggZ2V0U3ltYm9sVGFibGUoKS4KKwkJCQlzZWFyY2hJbnN0YW5jZVN0YXRpYyhzbVRhcmdldC50b19wdHI8IE1hY2hpbmUgPigpKSApOworCX0KKwllbHNlCisJeworCQlCRkxpc3QgZm91bmRUYXJnZXQ7CisJCWdldFN5bWJvbFRhYmxlKCkuc2VhcmNoTWFjaGluZUluc3RhbmNlQnlRdWFsaWZpZWROYW1lSUQoCisJCQkJc21UYXJnZXQuc3RyKCksIGZvdW5kVGFyZ2V0KTsKKwkJaWYoIGZvdW5kVGFyZ2V0LnNpbmdsZXRvbigpICkKKwkJeworCQkJcmV0dXJuKCBmb3VuZFRhcmdldC5wb3BfZmlyc3QoKSApOworCQl9CisJCWVsc2UgaWYoIGZvdW5kVGFyZ2V0LnBvcHVsYXRlZCgpICkKKwkJeworCQkJaW5jckVycm9yQ291bnQoKTsKKwkJCUFWTV9PU19XQVJOIDw8ICJJbmRldGVybWluaXNtOj4gZm91bmQgbWFueSB0YXJnZXQgc3RhdGUgPCAiCisJCQkJCTw8IHNtVGFyZ2V0LnN0cigpIDw8ICIgPiBmcm9tIHByb2dyYW0gPCAiCisJCQkJCTw8IHN0cl9oZWFkZXIoIGFuQXZtVHJhbnNpdGlvbiApIDw8ICIgPiAhISEiOworCQkJd2hpbGUoIGZvdW5kVGFyZ2V0Lm5vbmVtcHR5KCkgKQorCQkJeworCQkJCUFWTV9PU19XQVJOIDw8ICJcblx0Rm91bmQgOj4gIiA8PCBzdHJfaGVhZGVyKAorCQkJCQlmb3VuZFRhcmdldC5wb3BfZmlyc3QoKS50b19wdHI8IEluc3RhbmNlT2ZNYWNoaW5lID4oKSApOworCQkJfQorCisJCQlyZXR1cm4oIGZvdW5kVGFyZ2V0LnBvcF9maXJzdCgpICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpbmNyRXJyb3JDb3VudCgpOworCQkJQVZNX09TX1dBUk4gPDwgIlVuZm91bmQgdGFyZ2V0IHN0YXRlIDwgIgorCQkJCQk8PCBzbVRhcmdldC5zdHIoKSA8PCAiID4gZnJvbSBwcm9ncmFtIDwgIgorCQkJCQk8PCBzdHJfaGVhZGVyKCBhbkF2bVRyYW5zaXRpb24gKSA8PCAiID4gISEhIjsKKwkJCXdoaWxlKCBmb3VuZFRhcmdldC5ub25lbXB0eSgpICkKKwkJCXsKKwkJCQlBVk1fT1NfV0FSTiA8PCAiXG5cdEZvdW5kIDo+ICIgPDwgc3RyX2hlYWRlcigKKwkJCQkJCWZvdW5kVGFyZ2V0LnBvcF9maXJzdCgpLnRvX3B0cjwgSW5zdGFuY2VPZk1hY2hpbmUgPigpICk7CisJCQl9CisKKwkJCXJldHVybiggQkY6OlJFRl9OVUxMICk7CisJCX0KKwl9Cit9CisKKworCisvKioKKyAqIGNvbXBpbGUKKyAqIGxpc3Qgb2YgdHJhbnNpdGlvbgorICovCitCRkNvZGUgQ29tcGlsZXJPZlRyYW5zaXRpb246OnNjaGVkdWxlTGlzdE9mVHJhbnNpdGlvbigKKwkJRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGVGb3JtLCBCRkxpc3QgJiBsaXN0T2ZUcmFuc2l0aW9uKQoreworCWlmKCBsaXN0T2ZUcmFuc2l0aW9uLnBvcHVsYXRlZCgpICkKKwl7CisJCUxpc3RPZkJGTGlzdCBzY2hlZExpc3Q7CisJCUxpc3RPZkludCBwcmlvckxpc3Q7CisJCWludCBwcmlvcml0eSA9IDA7CisKKwkJQkZMaXN0ICogdG1wTGlzdCA9IG5ldyBCRkxpc3QoKTsKKwkJc2NoZWRMaXN0LmFwcGVuZCggdG1wTGlzdCApOworCQlwcmlvckxpc3QuYXBwZW5kKCBwcmlvcml0eSApOworCisJCUxpc3RPZkJGTGlzdDo6aXRlcmF0b3IgaXRTY2hlZDsKKwkJTGlzdE9mQkZMaXN0OjppdGVyYXRvciBlbmRTY2hlZDsKKwkJTGlzdE9mSW50OjppdGVyYXRvciBpdFByaW9yOworCisJCS8vIFRSSQorCQlCRkxpc3Q6Oml0ZXJhdG9yIGl0ID0gbGlzdE9mVHJhbnNpdGlvbi5iZWdpbigpOworCQlmb3IoIDsgaXQgIT0gbGlzdE9mVHJhbnNpdGlvbi5lbmQoKSA7ICsraXQgKQorCQl7CisJCQlwcmlvcml0eSA9ICgqaXQpLnRvX3B0cjwgQXZtVHJhbnNpdGlvbiA+KCktPgorCQkJCQlnZXRBc3RUcmFuc2l0aW9uKCktPmdldFByaW9yaXR5KCk7CisKKwkJCWl0U2NoZWQgPSBzY2hlZExpc3QuYmVnaW4oKTsKKwkJCWVuZFNjaGVkID0gc2NoZWRMaXN0LmVuZCgpOworCQkJaXRQcmlvciA9IHByaW9yTGlzdC5iZWdpbigpOworCQkJZm9yKCA7IGl0U2NoZWQgIT0gZW5kU2NoZWQgOyArK2l0U2NoZWQgLCArK2l0UHJpb3IgKQorCQkJeworCQkJCWlmKCAoKml0UHJpb3IpID09IHByaW9yaXR5ICkKKwkJCQl7CisJCQkJCSgqaXRTY2hlZCktPmFwcGVuZCggKCppdCkgKTsKKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQllbHNlIGlmKCAobUN1cnJlbnRNb2MtPmlzVXNlclByaW9yaXR5TWluRmlyc3QoKSAmJgorCQkJCQkJKCgqaXRQcmlvcikgPiBwcmlvcml0eSkpIHx8CisJCQkJCQkoKCEgbUN1cnJlbnRNb2MtPmlzVXNlclByaW9yaXR5TWluRmlyc3QoKSkgJiYKKwkJCQkJCQkJKCgqaXRQcmlvcikgPCBwcmlvcml0eSkpICkKKwkJCQl7CisJCQkJCXRtcExpc3QgPSBuZXcgQkZMaXN0KCk7CisJCQkJCXRtcExpc3QtPmFwcGVuZCggKCppdCkgKTsKKworCQkJCQlzY2hlZExpc3QuaW5zZXJ0KCBpdFNjaGVkICwgdG1wTGlzdCApOworCQkJCQlwcmlvckxpc3QuaW5zZXJ0KCBpdFByaW9yICwgcHJpb3JpdHkgKTsKKworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmKCBpdFNjaGVkID09IGVuZFNjaGVkICkKKwkJCXsKKwkJCQl0bXBMaXN0ID0gbmV3IEJGTGlzdCgpOworCQkJCXRtcExpc3QtPmFwcGVuZCggKCppdCkgKTsKKworCQkJCXNjaGVkTGlzdC5hcHBlbmQoIHRtcExpc3QgKTsKKwkJCQlwcmlvckxpc3QuYXBwZW5kKCBwcmlvcml0eSApOworCQkJfQorCQl9CisKKworCQkvLyBTQ0hFRFVMRQorCQlpZiggc2NoZWRMaXN0LnBvcHVsYXRlZCgpICkKKwkJeworCQkJQkZDb2RlIGFDb2RlKE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfUFJJT1JfR1QpOworCisJCQllbmRTY2hlZCA9IHNjaGVkTGlzdC5lbmQoKTsKKwkJCWZvciggaXRTY2hlZCA9IHNjaGVkTGlzdC5iZWdpbigpIDsgaXRTY2hlZCAhPSBlbmRTY2hlZCA7ICsraXRTY2hlZCApCisJCQl7CisJCQkJaWYoICgqaXRTY2hlZCktPnBvcHVsYXRlZCgpICkKKwkJCQl7CisJCQkJCUJGQ29kZSB0bXBDb2RlKCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX05PTkRFVEVSTUlOSVNNICk7CisKKwkJCQkJQkZMaXN0OjppdGVyYXRvciBpdCA9ICgqaXRTY2hlZCktPmJlZ2luKCk7CisJCQkJCWZvciggOyBpdCAhPSAoKml0U2NoZWQpLT5lbmQoKSA7ICsraXQgKQorCQkJCQl7CisJCQkJCQl0bXBDb2RlLT5hcHBlbmQoIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0lOVk9LRV9UUkFOU0lUSU9OLAorCQkJCQkJCQkoKml0KSkgKTsKKwkJCQkJfQorCisJCQkJCWFDb2RlLT5hcHBlbmQoIHRtcENvZGUgKTsKKwkJCQl9CisJCQkJZWxzZSBpZiggKCppdFNjaGVkKS0+bm9uZW1wdHkoKSApCisJCQkJeworCQkJCQlhQ29kZS0+YXBwZW5kKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0lOVk9LRV9UUkFOU0lUSU9OLAorCQkJCQkJCSgqaXRTY2hlZCktPmxhc3QoKSkgKTsKKwkJCQl9CisKKwkJCQlkZWxldGUoICgqaXRTY2hlZCkgKTsKKwkJCX0KKworCQkJcmV0dXJuKCBhQ29kZSApOworCQl9CisKKwkJZWxzZQorCQl7CisJCQlCRkNvZGUgYVRyYW5zOworCisJCQlpZiggc2NoZWRMaXN0Lmxhc3QoKS0+cG9wdWxhdGVkKCkgKQorCQkJeworCQkJCUJGQ29kZSB0bXBDb2RlKCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX05PTkRFVEVSTUlOSVNNICk7CisKKwkJCQlCRkxpc3Q6Oml0ZXJhdG9yIGl0ID0gc2NoZWRMaXN0Lmxhc3QoKS0+YmVnaW4oKTsKKwkJCQlmb3IoIDsgaXQgIT0gc2NoZWRMaXN0Lmxhc3QoKS0+ZW5kKCkgOyArK2l0ICkKKwkJCQl7CisJCQkJCXRtcENvZGUtPmFwcGVuZCggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9JTlZPS0VfVFJBTlNJVElPTiwgKCppdCkpICk7CisJCQkJfQorCisJCQkJYVRyYW5zID0gdG1wQ29kZTsKKwkJCX0KKwkJCWVsc2UgaWYoIHNjaGVkTGlzdC5sYXN0KCktPm5vbmVtcHR5KCkgKQorCQkJeworCQkJCWFUcmFucyA9IFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9JTlZPS0VfVFJBTlNJVElPTiwKKwkJCQkJCXNjaGVkTGlzdC5sYXN0KCktPmxhc3QoKSk7CisJCQl9CisKKwkJCWRlbGV0ZSggc2NoZWRMaXN0Lmxhc3QoKSApOworCisJCQlyZXR1cm4oIGFUcmFucyApOworCQl9CisJfQorCisJZWxzZSBpZiggbGlzdE9mVHJhbnNpdGlvbi5ub25lbXB0eSgpICkKKwl7CisJCXJldHVybiggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9JTlZPS0VfVFJBTlNJVElPTiwKKwkJCQlsaXN0T2ZUcmFuc2l0aW9uLmZpcnN0KCkpICk7CisJfQorCisJcmV0dXJuKCBCRkNvZGU6OlJFRl9OVUxMICk7Cit9CisKKworCisKK3ZvaWQgQ29tcGlsZXJPZlRyYW5zaXRpb246OmNvbXBpbGVTdGF0ZW1hY2hpbmVUcmFuc2l0aW9uKAorCQlFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZUZvcm0sIGNvbnN0IEJGQ29kZSAmIHJ1blJvdXRpbmUpCit7CisJY29uc3QgTWFjaGluZSAqIGFTdGF0ZW1hY2hpbmUgPSBhbkV4ZWN1dGFibGVGb3JtLT5nZXRBc3RNYWNoaW5lKCk7CisKKy8vCUFWTV9PU19UUkFDRSA8PCBUQUIgPDwgIjx8IGNvbXBpbGluZzx0cmFuc2l0aW9uPiBvZiAiCisvLwkJCTw8IHN0cl9oZWFkZXIoIGFTdGF0ZW1hY2hpbmUgKSA8PCBzdGQ6OmVuZGw7CisKKwlib29sIGhhc1RyYW5zaXRpb24gPSBhU3RhdGVtYWNoaW5lLT5oYXNPdXRnb2luZ1RyYW5zaXRpb24oKTsKKworCS8qCisJICogQ29tcGlsaW5nIHRyYW5zaXRpb24KKwkgKi8KKwlCRkxpc3QgbGlzdE9mU2ltcGxlVHJhbnNpdGlvbjsKKwlCRkxpc3QgbGlzdE9mU2ltcGxlRWxzZVRyYW5zaXRpb247CisKKwlCRkxpc3QgbGlzdE9mQWJvcnRUcmFuc2l0aW9uOworCUJGTGlzdCBsaXN0T2ZBYm9ydEVsc2VUcmFuc2l0aW9uOworCisKKwlCRkxpc3QgbGlzdE9mRmluYWxUcmFuc2l0aW9uOworCUJGTGlzdCBsaXN0T2ZGaW5hbEVsc2VUcmFuc2l0aW9uOworCisJQkZMaXN0IGxpc3RPZkludGVybmFsVHJhbnNpdGlvbjsKKwlCRkxpc3QgbGlzdE9mSW50ZXJuYWxFbHNlVHJhbnNpdGlvbjsKKworCUJGTGlzdCBsaXN0T2ZBdXRvVHJhbnNpdGlvbjsKKwlCRkxpc3QgbGlzdE9mQXV0b0Vsc2VUcmFuc2l0aW9uOworCisJaWYoIGhhc1RyYW5zaXRpb24gKQorCXsKKwkJTGlzdE9mQXZtVHJhbnNpdGlvbiB1c2VkVHJhbnNpdGlvbjsKKworCQlpZiggcnVuUm91dGluZS52YWxpZCgpICkKKwkJeworCQkJU3RhdGVtZW50RmFjdG9yeTo6Y29sbGVjdEludm9rZVRyYW5zaXRpb24oCisJCQkJCWFuRXhlY3V0YWJsZUZvcm0sIHJ1blJvdXRpbmUsIHVzZWRUcmFuc2l0aW9uKTsKKwkJfQorCisJCUJlaGF2aW9yYWxQYXJ0Ojpjb25zdF90cmFuc2l0aW9uX2l0ZXJhdG9yIGl0ID0KKwkJCQlhU3RhdGVtYWNoaW5lLT5nZXRCZWhhdmlvcigpLT5vdXRnb2luZ190cmFuc2l0aW9uX2JlZ2luKCk7CisJCUJlaGF2aW9yYWxQYXJ0Ojpjb25zdF90cmFuc2l0aW9uX2l0ZXJhdG9yIGVuZEl0ID0KKwkJCQlhU3RhdGVtYWNoaW5lLT5nZXRCZWhhdmlvcigpLT5vdXRnb2luZ190cmFuc2l0aW9uX2VuZCgpOworCQlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJeworCQkJY29uc3QgQkYgJiBjb21waWxlZFRyYW5zaXRpb24gPQorCQkJCQlhbkV4ZWN1dGFibGVGb3JtLT5nZXRUcmFuc2l0aW9uQnlBc3RFbGVtZW50KGl0KTsKKworCQkJaWYoIHVzZWRUcmFuc2l0aW9uLm5vbmVtcHR5KCkgJiYgdXNlZFRyYW5zaXRpb24uY29udGFpbnMoCisJCQkJCWNvbXBpbGVkVHJhbnNpdGlvbi50b19wdHI8IEF2bVRyYW5zaXRpb24gPigpKSApCisJCQl7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCXN3aXRjaCggKGl0KS0+Z2V0TW9jS2luZCgpICkKKwkJCXsKKwkJCQljYXNlIFRyYW5zaXRpb246Ok1PQ19TSU1QTEVfS0lORDoKKwkJCQl7CisJCQkJCWxpc3RPZlNpbXBsZVRyYW5zaXRpb24uYXBwZW5kKGNvbXBpbGVkVHJhbnNpdGlvbik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljYXNlIFRyYW5zaXRpb246Ok1PQ19FTFNFX0tJTkQ6CisJCQkJY2FzZSBUcmFuc2l0aW9uOjpNT0NfU0lNUExFX0VMU0VfS0lORDoKKwkJCQl7CisJCQkJCWxpc3RPZlNpbXBsZUVsc2VUcmFuc2l0aW9uLmFwcGVuZChjb21waWxlZFRyYW5zaXRpb24pOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQljYXNlIFRyYW5zaXRpb246Ok1PQ19BQk9SVF9LSU5EOgorCQkJCXsKKwkJCQkJbGlzdE9mQWJvcnRUcmFuc2l0aW9uLmFwcGVuZChjb21waWxlZFRyYW5zaXRpb24pOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2FzZSBUcmFuc2l0aW9uOjpNT0NfQUJPUlRfRUxTRV9LSU5EOgorCQkJCXsKKwkJCQkJbGlzdE9mQWJvcnRFbHNlVHJhbnNpdGlvbi5hcHBlbmQoY29tcGlsZWRUcmFuc2l0aW9uKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJY2FzZSBUcmFuc2l0aW9uOjpNT0NfRklOQUxfS0lORDoKKwkJCQl7CisJCQkJCWxpc3RPZkZpbmFsVHJhbnNpdGlvbi5hcHBlbmQoY29tcGlsZWRUcmFuc2l0aW9uKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWNhc2UgVHJhbnNpdGlvbjo6TU9DX0ZJTkFMX0VMU0VfS0lORDoKKwkJCQl7CisJCQkJCWxpc3RPZkZpbmFsRWxzZVRyYW5zaXRpb24uYXBwZW5kKGNvbXBpbGVkVHJhbnNpdGlvbik7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWNhc2UgVHJhbnNpdGlvbjo6TU9DX0lOVEVSTkFMX0tJTkQ6CisJCQkJeworCQkJCQlsaXN0T2ZJbnRlcm5hbFRyYW5zaXRpb24uYXBwZW5kKGNvbXBpbGVkVHJhbnNpdGlvbik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljYXNlIFRyYW5zaXRpb246Ok1PQ19JTlRFUk5BTF9FTFNFX0tJTkQ6CisJCQkJeworCQkJCQlsaXN0T2ZJbnRlcm5hbEVsc2VUcmFuc2l0aW9uLmFwcGVuZChjb21waWxlZFRyYW5zaXRpb24pOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQljYXNlIFRyYW5zaXRpb246Ok1PQ19BVVRPX0tJTkQ6CisJCQkJeworCQkJCQlsaXN0T2ZBdXRvVHJhbnNpdGlvbi5hcHBlbmQoY29tcGlsZWRUcmFuc2l0aW9uKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWNhc2UgVHJhbnNpdGlvbjo6TU9DX0FVVE9fRUxTRV9LSU5EOgorCQkJCXsKKwkJCQkJbGlzdE9mQXV0b0Vsc2VUcmFuc2l0aW9uLmFwcGVuZChjb21waWxlZFRyYW5zaXRpb24pOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQljYXNlIFRyYW5zaXRpb246Ok1PQ19VTkRFRklORURfS0lORDoKKwkJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJaW5jckVycm9yQ291bnQoKTsKKwkJCQkJKGl0KS0+d2FybmluZ0xvY2F0aW9uKEFWTV9PU19XQVJOKQorCQkJCQkJCTw8ICJVbmV4cGVjdGVkIHRyYW5zaXRpb24ga2luZDo+ICIKKwkJCQkJCQk8PCBzdGQ6OmVuZGwgPDwgKCppdCkgPDwgc3RkOjpmbHVzaDsKKworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKworCS8qCisJICogT25SdW4KKwkgKiB3aGl0aCBoaWdoIHByaW9yaXR5IG9yZGVyCisJICoKKwkgKiBTdHJvbmdBYm9ydCBUcmFuc2l0aW9uCisJICogQWN0aXZpdHlEbworCSAqICggU2ltcGxlIFRyYW5zaXRpb24gb3Igc3VibWFjaGluZSApIGRlcGVuZCBvbiBNT0MKKwkgKiBXZWFrQWJvcnQgVHJhbnNpdGlvbgorCSAqIE5vcm1hbFRlcm1pbmFpc29uIFRyYW5zaXRpb24KKwkgKi8KKworCUF2bUNvZGU6OnRoaXNfY29udGFpbmVyX3R5cGUgbGlzdE9mT3JkZXJBcmc7CisKKwlpZiggaGFzVHJhbnNpdGlvbiAmJiBydW5Sb3V0aW5lLnZhbGlkKCkgKQorCXsKKwkJaWYoIGFTdGF0ZW1hY2hpbmUtPmhhc01vZGVsT2ZDb21wdXRhdGlvbigpICkKKwkJeworCisJCX0KKworCQkvLyBBYm9ydCBUcmFuc2l0aW9uCisJCWlmKCBsaXN0T2ZBYm9ydFRyYW5zaXRpb24ubm9uZW1wdHkoKSApCisJCXsKKwkJCWxpc3RPZk9yZGVyQXJnLmFwcGVuZCggc2NoZWR1bGVMaXN0T2ZUcmFuc2l0aW9uKAorCQkJCQlhbkV4ZWN1dGFibGVGb3JtLCBsaXN0T2ZBYm9ydFRyYW5zaXRpb24pICk7CisJCX0KKwkJLy8gRWxzZSBUcmFuc2l0aW9uPCBhYm9ydCA+CisJCWlmKCBsaXN0T2ZBYm9ydEVsc2VUcmFuc2l0aW9uLm5vbmVtcHR5KCkgKQorCQl7CisJCQlsaXN0T2ZPcmRlckFyZy5hcHBlbmQoIHNjaGVkdWxlTGlzdE9mVHJhbnNpdGlvbigKKwkJCQkJYW5FeGVjdXRhYmxlRm9ybSwgbGlzdE9mQWJvcnRFbHNlVHJhbnNpdGlvbikgKTsKKwkJfQorCisJCS8qCisJCSAqIEVWQUwKKwkJICogKCBTaW1wbGUgVHJhbnNpdGlvbiBvciBzdWJtYWNoaW5lICkgZGVwZW5kIG9uIE1PQworCQkgKi8KKwkJaWYoIGxpc3RPZlNpbXBsZVRyYW5zaXRpb24ubm9uZW1wdHkoKSAmJiBydW5Sb3V0aW5lLnZhbGlkKCkgKQorCQl7CisJCQlPcGVyYXRvciAqIG9wID0gT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9QUklPUl9HVDsKKwkJCWlmKCAobUN1cnJlbnRNb2MtPmlzTGNhRW5hYmxlZCgpICYmCisJCQkJCW1DdXJyZW50TW9jLT5pc0xjYU1pbkZpcnN0KCkpIHx8CisJCQkJCShtQ3VycmVudE1vYy0+aXNTb3VyY2VFbmFibGVkKCkgJiYKKwkJCQkJCQltQ3VycmVudE1vYy0+aXNTb3VyY2VNaW5GaXJzdCgpKSApCisJCQl7CisJCQkJbGlzdE9mT3JkZXJBcmcuYXBwZW5kKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6eG5ld0NvZGVGbGF0KG9wLAorCQkJCQkJcnVuUm91dGluZSwKKwkJCQkJCXNjaGVkdWxlTGlzdE9mVHJhbnNpdGlvbigKKwkJCQkJCQkJYW5FeGVjdXRhYmxlRm9ybSwgbGlzdE9mU2ltcGxlVHJhbnNpdGlvbikpICk7CisJCQl9CisJCQllbHNlIGlmKCAobUN1cnJlbnRNb2MtPmlzTGNhRW5hYmxlZCgpICYmCisJCQkJCSghIG1DdXJyZW50TW9jLT5pc0xjYU1pbkZpcnN0KCkpKSB8fAorCQkJCQkobUN1cnJlbnRNb2MtPmlzU291cmNlRW5hYmxlZCgpICYmCisJCQkJCQkJKCEgbUN1cnJlbnRNb2MtPmlzU291cmNlTWluRmlyc3QoKSkpICkKKwkJCXsKKwkJCQlsaXN0T2ZPcmRlckFyZy5hcHBlbmQoIFN0YXRlbWVudENvbnN0cnVjdG9yOjp4bmV3Q29kZUZsYXQob3AsCisJCQkJCQlzY2hlZHVsZUxpc3RPZlRyYW5zaXRpb24oCisJCQkJCQkJCWFuRXhlY3V0YWJsZUZvcm0sIGxpc3RPZlNpbXBsZVRyYW5zaXRpb24pLAorCQkJCQkJcnVuUm91dGluZSkgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlvcCA9IE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfTk9OREVURVJNSU5JU007CisJCQkJbGlzdE9mT3JkZXJBcmcuYXBwZW5kKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6eG5ld0NvZGVGbGF0KG9wLAorCQkJCQkJcnVuUm91dGluZSwKKwkJCQkJCXNjaGVkdWxlTGlzdE9mVHJhbnNpdGlvbigKKwkJCQkJCQkJYW5FeGVjdXRhYmxlRm9ybSwgbGlzdE9mU2ltcGxlVHJhbnNpdGlvbikpICk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiggbGlzdE9mU2ltcGxlVHJhbnNpdGlvbi5ub25lbXB0eSgpICkKKwkJeworCQkJbGlzdE9mT3JkZXJBcmcuYXBwZW5kKCBzY2hlZHVsZUxpc3RPZlRyYW5zaXRpb24oCisJCQkJCWFuRXhlY3V0YWJsZUZvcm0sIGxpc3RPZlNpbXBsZVRyYW5zaXRpb24pICk7CisJCX0KKwkJZWxzZSBpZiggcnVuUm91dGluZS52YWxpZCgpICkKKwkJeworCQkJbGlzdE9mT3JkZXJBcmcuYXBwZW5kKCBydW5Sb3V0aW5lICk7CisJCX0KKworCQkvLyBFbHNlIFRyYW5zaXRpb248IHNpbXBsZSA+CisJCWlmKCBsaXN0T2ZTaW1wbGVFbHNlVHJhbnNpdGlvbi5ub25lbXB0eSgpICkKKwkJeworCQkJbGlzdE9mT3JkZXJBcmcuYXBwZW5kKCBzY2hlZHVsZUxpc3RPZlRyYW5zaXRpb24oCisJCQkJCWFuRXhlY3V0YWJsZUZvcm0sIGxpc3RPZlNpbXBsZUVsc2VUcmFuc2l0aW9uKSApOworCQl9CisKKwkJLy8gRmluYWwgVHJhbnNpdGlvbgorCisJCS8vIEF1dG8gVHJhbnNpdGlvbgorCQlpZiggbGlzdE9mQXV0b1RyYW5zaXRpb24ubm9uZW1wdHkoKSApCisJCXsKKwkJCWxpc3RPZk9yZGVyQXJnLmFwcGVuZCggc2NoZWR1bGVMaXN0T2ZUcmFuc2l0aW9uKAorCQkJCQlhbkV4ZWN1dGFibGVGb3JtLCBsaXN0T2ZBdXRvVHJhbnNpdGlvbikgKTsKKwkJfQorCQkvLyBFbHNlIFRyYW5zaXRpb248IGF1dG8gPgorCQlpZiggbGlzdE9mQXV0b0Vsc2VUcmFuc2l0aW9uLm5vbmVtcHR5KCkgKQorCQl7CisJCQlsaXN0T2ZPcmRlckFyZy5hcHBlbmQoIHNjaGVkdWxlTGlzdE9mVHJhbnNpdGlvbigKKwkJCQkJYW5FeGVjdXRhYmxlRm9ybSwgbGlzdE9mQXV0b0Vsc2VUcmFuc2l0aW9uKSApOworCQl9CisKKwkJLy8gSW50ZXJuYWwgVHJhbnNpdGlvbgorCQlpZiggbGlzdE9mSW50ZXJuYWxUcmFuc2l0aW9uLm5vbmVtcHR5KCkgKQorCQl7CisJCQlsaXN0T2ZPcmRlckFyZy5hcHBlbmQoIHNjaGVkdWxlTGlzdE9mVHJhbnNpdGlvbigKKwkJCQkJYW5FeGVjdXRhYmxlRm9ybSwgbGlzdE9mSW50ZXJuYWxUcmFuc2l0aW9uKSApOworCQl9CisJCS8vIEVsc2UgVHJhbnNpdGlvbjwgc2ltcGxlID4KKwkJaWYoIGxpc3RPZkludGVybmFsRWxzZVRyYW5zaXRpb24ubm9uZW1wdHkoKSApCisJCXsKKwkJCWxpc3RPZk9yZGVyQXJnLmFwcGVuZCggc2NoZWR1bGVMaXN0T2ZUcmFuc2l0aW9uKAorCQkJCQlhbkV4ZWN1dGFibGVGb3JtLCBsaXN0T2ZJbnRlcm5hbEVsc2VUcmFuc2l0aW9uKSApOworCQl9CisJfQorCWVsc2UgaWYoIGhhc1RyYW5zaXRpb24gKQorCXsKKwkJLyoKKwkJICogT25SdW4KKwkJICogU3Ryb25nQWJvcnQgVHJhbnNpdGlvbiA+CisJCSAqIEFjdGl2aXR5RG8gPgorCQkgKiBTaW1wbGUgVHJhbnNpdGlvbiA+CisJCSAqIFdlYWtBYm9ydCBUcmFuc2l0aW9uID4KKwkJICogTm9ybWFsVGVybWluYWlzb24gVHJhbnNpdGlvbgorCQkgKi8KKworCQkvLyBBYm9ydCBUcmFuc2l0aW9uCisJCWlmKCBsaXN0T2ZBYm9ydFRyYW5zaXRpb24ubm9uZW1wdHkoKSApCisJCXsKKwkJCWxpc3RPZk9yZGVyQXJnLmFwcGVuZCggc2NoZWR1bGVMaXN0T2ZUcmFuc2l0aW9uKGFuRXhlY3V0YWJsZUZvcm0sCisJCQkJCWxpc3RPZkFib3J0VHJhbnNpdGlvbikgKTsKKwkJfQorCQkvLyBFbHNlIFRyYW5zaXRpb248IGFib3J0ID4KKwkJaWYoIGxpc3RPZkFib3J0RWxzZVRyYW5zaXRpb24ubm9uZW1wdHkoKSApCisJCXsKKwkJCWxpc3RPZk9yZGVyQXJnLmFwcGVuZCggc2NoZWR1bGVMaXN0T2ZUcmFuc2l0aW9uKAorCQkJCQlhbkV4ZWN1dGFibGVGb3JtLCBsaXN0T2ZBYm9ydEVsc2VUcmFuc2l0aW9uKSApOworCQl9CisKKworCQkvLyBTaW1wbGUgVHJhbnNpdGlvbgorCQlpZiggbGlzdE9mU2ltcGxlVHJhbnNpdGlvbi5ub25lbXB0eSgpICApCisJCXsKKwkJCWxpc3RPZk9yZGVyQXJnLmFwcGVuZCggc2NoZWR1bGVMaXN0T2ZUcmFuc2l0aW9uKGFuRXhlY3V0YWJsZUZvcm0sCisJCQkJCWxpc3RPZlNpbXBsZVRyYW5zaXRpb24pICk7CisJCX0KKworCQkvLyBFbHNlIFRyYW5zaXRpb248IHNpbXBsZSA+CisJCWlmKCBsaXN0T2ZTaW1wbGVFbHNlVHJhbnNpdGlvbi5ub25lbXB0eSgpICkKKwkJeworCQkJbGlzdE9mT3JkZXJBcmcuYXBwZW5kKCBzY2hlZHVsZUxpc3RPZlRyYW5zaXRpb24oYW5FeGVjdXRhYmxlRm9ybSwKKwkJCQkJbGlzdE9mU2ltcGxlRWxzZVRyYW5zaXRpb24pICk7CisJCX0KKworCQkvLyBGaW5hbCBUcmFuc2l0aW9uCisJfQorCWVsc2UgaWYoIHJ1blJvdXRpbmUudmFsaWQoKSApCisJeworCQlsaXN0T2ZPcmRlckFyZy5hcHBlbmQoIHJ1blJvdXRpbmUgKTsKKwl9CisKKworCS8qCisJICogQXNzZW1ibGUgT25SdW4gY29kZQorCSAqLworCWlmKCBsaXN0T2ZPcmRlckFyZy5wb3B1bGF0ZWQoKSApCisJeworCQlCRkNvZGUgYUNvZGUgPSBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1BSSU9SX0dULCBsaXN0T2ZPcmRlckFyZyk7CisKKwkJYW5FeGVjdXRhYmxlRm9ybS0+c2V0T25SdW4oIGFDb2RlICk7CisJfQorCWVsc2UgaWYoIGxpc3RPZk9yZGVyQXJnLm5vbmVtcHR5KCkgKQorCXsKKwkJaWYoIGxpc3RPZk9yZGVyQXJnLmZpcnN0KCkuaXM8IEF2bUNvZGUgPigpICkKKwkJeworCQkJYW5FeGVjdXRhYmxlRm9ybS0+c2V0T25SdW4oIGxpc3RPZk9yZGVyQXJnLmZpcnN0KCkuYmZDb2RlKCkgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWFuRXhlY3V0YWJsZUZvcm0tPnNldE9uUnVuKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9JTlZPS0VfVFJBTlNJVElPTiwKKwkJCQkJbGlzdE9mT3JkZXJBcmcuZmlyc3QoKSkgKTsKKwkJfQorCX0KKworCisJLy8gRmluYWwgVHJhbnNpdGlvbgorCWlmKCBsaXN0T2ZGaW5hbFRyYW5zaXRpb24ubm9uZW1wdHkoKSApCisJeworCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPbkZpbmFsKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6eG5ld0NvZGVGbGF0KAorCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU0VRVUVOQ0UsCisJCQkJYW5FeGVjdXRhYmxlRm9ybS0+Z2V0T25GaW5hbCgpLAorCQkJCXNjaGVkdWxlTGlzdE9mVHJhbnNpdGlvbihhbkV4ZWN1dGFibGVGb3JtLAorCQkJCQkJbGlzdE9mRmluYWxUcmFuc2l0aW9uKSApICk7CisJfQorCS8vIEVsc2UgVHJhbnNpdGlvbjwgZmluYWwgPgorCWlmKCBsaXN0T2ZGaW5hbEVsc2VUcmFuc2l0aW9uLm5vbmVtcHR5KCkgKQorCXsKKwkJYW5FeGVjdXRhYmxlRm9ybS0+c2V0T25GaW5hbCggU3RhdGVtZW50Q29uc3RydWN0b3I6OnhuZXdDb2RlRmxhdCgKKwkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NFUVVFTkNFLAorCQkJCWFuRXhlY3V0YWJsZUZvcm0tPmdldE9uRmluYWwoKSwKKwkJCQlzY2hlZHVsZUxpc3RPZlRyYW5zaXRpb24oYW5FeGVjdXRhYmxlRm9ybSwKKwkJCQkJCWxpc3RPZkZpbmFsRWxzZVRyYW5zaXRpb24pICkgKTsKKwl9CisKKy8vCUFWTV9PU19UUkFDRSA8PCBUQUIgPDwgIj58IGNvbXBpbGluZzx0cmFuc2l0aW9uPiBvZiAiCisvLwkJCTw8IHN0cl9oZWFkZXIoIGFTdGF0ZW1hY2hpbmUgKSA8PCBzdGQ6OmVuZGw7Cit9CisKKworCit2b2lkIENvbXBpbGVyT2ZUcmFuc2l0aW9uOjpjb21waWxlU3RhdGVGb3JrT3V0cHV0VHJhbnNpdGlvbigKKwkJRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGVGb3JtLCBjb25zdCBCRkNvZGUgJiBydW5Sb3V0aW5lKQoreworCWNvbnN0IE1hY2hpbmUgKiBhU3RhdGVtYWNoaW5lID0gYW5FeGVjdXRhYmxlRm9ybS0+Z2V0QXN0TWFjaGluZSgpOworCisvLwlBVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICI8fCBjb21waWxpbmc8dHJhbnNpdGlvbj4gb2YgIgorLy8JCQk8PCBzdHJfaGVhZGVyKCBhU3RhdGVtYWNoaW5lICkgPDwgc3RkOjplbmRsOworCisJLyoKKwkgKiBTY2hlZHVsZSB0cmFuc2l0aW9uCisJICovCisJQkZDb2RlIGZvcmtDb2RlKE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfRk9SSyk7CisKKwlCZWhhdmlvcmFsUGFydDo6Y29uc3RfdHJhbnNpdGlvbl9pdGVyYXRvciBpdCA9CisJCQlhU3RhdGVtYWNoaW5lLT5nZXRCZWhhdmlvcigpLT5vdXRnb2luZ190cmFuc2l0aW9uX2JlZ2luKCk7CisJQmVoYXZpb3JhbFBhcnQ6OmNvbnN0X3RyYW5zaXRpb25faXRlcmF0b3IgZW5kSXQgPQorCQkJYVN0YXRlbWFjaGluZS0+Z2V0QmVoYXZpb3IoKS0+b3V0Z29pbmdfdHJhbnNpdGlvbl9lbmQoKTsKKwlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwl7CisJCXN3aXRjaCggKGl0KS0+Z2V0TW9jS2luZCgpICkKKwkJeworCQkJY2FzZSBUcmFuc2l0aW9uOjpNT0NfU0lNUExFX0tJTkQ6CisJCQl7CisJCQkJZm9ya0NvZGUtPmFwcGVuZCggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0lOVk9LRV9UUkFOU0lUSU9OLAorCQkJCQkJYW5FeGVjdXRhYmxlRm9ybS0+Z2V0VHJhbnNpdGlvbkJ5QXN0RWxlbWVudChpdCkpICk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNhc2UgVHJhbnNpdGlvbjo6TU9DX0FCT1JUX0tJTkQ6CisJCQljYXNlIFRyYW5zaXRpb246Ok1PQ19FTFNFX0tJTkQ6CisJCQljYXNlIFRyYW5zaXRpb246Ok1PQ19GSU5BTF9LSU5EOgorCQkJY2FzZSBUcmFuc2l0aW9uOjpNT0NfSU5URVJOQUxfS0lORDoKKwkJCWNhc2UgVHJhbnNpdGlvbjo6TU9DX0FVVE9fS0lORDoKKwkJCWNhc2UgVHJhbnNpdGlvbjo6TU9DX1VOREVGSU5FRF9LSU5EOgorCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQlpbmNyRXJyb3JDb3VudCgpOworCQkJCShpdCktPndhcm5pbmdMb2NhdGlvbihBVk1fT1NfV0FSTikKKwkJCQkJCTw8ICJVbmV4cGVjdGVkIG91dGdvaW5nIHRyYW5zaXRpb24ga2luZDo+ICIKKwkJCQkJCTw8ICgqaXQpIDw8ICJmb3IgdGhlIHBzZXVkb3N0YXRlPCBmb3JrID4gPDwgIgorCQkJCQkJPDwgc3RyX2hlYWRlciggYVN0YXRlbWFjaGluZSApIDw8IHN0ZDo6ZW5kbDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWFuRXhlY3V0YWJsZUZvcm0tPnNldE9uUnVuKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6eG5ld0NvZGVGbGF0KAorCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TRVFVRU5DRSwgcnVuUm91dGluZSwgZm9ya0NvZGUpICk7CisKKy8vCUFWTV9PU19UUkFDRSA8PCBUQUIgPDwgIj58IGNvbXBpbGluZzx0cmFuc2l0aW9uPiBvZiAiCisvLwkJCTw8IHN0cl9oZWFkZXIoIGFTdGF0ZW1hY2hpbmUgKSA8PCBzdGQ6OmVuZGw7Cit9CisKKworCit2b2lkIENvbXBpbGVyT2ZUcmFuc2l0aW9uOjpjb21waWxlU3RhdGVKb2luSW5wdXRUcmFuc2l0aW9uKAorCQlFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZUZvcm0pCit7CisJY29uc3QgTWFjaGluZSAqIGFTdGF0ZW1hY2hpbmUgPSBhbkV4ZWN1dGFibGVGb3JtLT5nZXRBc3RNYWNoaW5lKCk7CisKKy8vCUFWTV9PU19UUkFDRSA8PCBUQUIgPDwgIjx8IGNvbXBpbGluZzx0cmFuc2l0aW9uPiBvZiAiCisvLwkJCTw8IHN0cl9oZWFkZXIoIGFTdGF0ZW1hY2hpbmUgKSA8PCBzdGQ6OmVuZGw7CisKKwkvKgorCSAqIFNjaGVkdWxlIHRyYW5zaXRpb24KKwkgKi8KKwlCRkNvZGUgc3luY0NvZGUoT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TVFJPTkdfU1lOQ0hST05PVVMpOworCisJQ29tcGlsYXRpb25FbnZpcm9ubWVudCBjb21waWxFTlYoYW5FeGVjdXRhYmxlRm9ybSk7CisKKwlCZWhhdmlvcmFsUGFydDo6Y29uc3RfdHJhbnNpdGlvbl9pdGVyYXRvciBpdCA9CisJCQlhU3RhdGVtYWNoaW5lLT5nZXRCZWhhdmlvcigpLT5pbmNvbWluZ190cmFuc2l0aW9uX2JlZ2luKCk7CisJQmVoYXZpb3JhbFBhcnQ6OmNvbnN0X3RyYW5zaXRpb25faXRlcmF0b3IgZW5kSXQgPQorCQkJYVN0YXRlbWFjaGluZS0+Z2V0QmVoYXZpb3IoKS0+aW5jb21pbmdfdHJhbnNpdGlvbl9lbmQoKTsKKwlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwl7CisJCXN3aXRjaCggKGl0KS0+Z2V0TW9jS2luZCgpICkKKwkJeworCQkJY2FzZSBUcmFuc2l0aW9uOjpNT0NfU0lNUExFX0tJTkQ6CisJCQl7CisJCQkJY29uc3QgQkYgJiBhVHJhbnNpdGlvbiA9CisJCQkJCQlnZXRTeW1ib2xUYWJsZSgpLnNlYXJjaFRyYW5zaXRpb24oY29tcGlsRU5WLm1DVFgsIChpdCkpOworCQkJCWlmKCBhVHJhbnNpdGlvbi52YWxpZCgpICkKKwkJCQl7CisJCQkJCXN5bmNDb2RlLT5hcHBlbmQoIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfSU5WT0tFX1RSQU5TSVRJT04sIGFUcmFuc2l0aW9uKSApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlpbmNyRXJyb3JDb3VudCgpOworCQkJCQkoaXQpLT53YXJuaW5nTG9jYXRpb24oQVZNX09TX1dBUk4pCisJCQkJCQkJPDwgImNvbXBpbGVTdGF0ZUpvaW5JbnB1dFRyYW5zaXRpb246PiAiCisJCQkJCQkJIlVuZm91bmQgaW5jb21pbmcgdHJhbnNpdGlvbiA6IgorCQkJCQkJCTw8IHN0ZDo6ZW5kbCA8PCAoKml0KSA8PCBzdGQ6OmZsdXNoOworCQkJCX0KKworCQkJCWJyZWFrOworCQkJfQorCisJCQljYXNlIFRyYW5zaXRpb246Ok1PQ19BQk9SVF9LSU5EOgorCQkJY2FzZSBUcmFuc2l0aW9uOjpNT0NfRUxTRV9LSU5EOgorCQkJY2FzZSBUcmFuc2l0aW9uOjpNT0NfRklOQUxfS0lORDoKKwkJCWNhc2UgVHJhbnNpdGlvbjo6TU9DX0lOVEVSTkFMX0tJTkQ6CisJCQljYXNlIFRyYW5zaXRpb246Ok1PQ19BVVRPX0tJTkQ6CisJCQljYXNlIFRyYW5zaXRpb246Ok1PQ19VTkRFRklORURfS0lORDoKKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJaW5jckVycm9yQ291bnQoKTsKKwkJCQkoaXQpLT53YXJuaW5nTG9jYXRpb24oQVZNX09TX1dBUk4pCisJCQkJCQk8PCAiVW5leHBlY3RlZCBvdXRnb2luZyB0cmFuc2l0aW9uIGtpbmQ6PiAiCisJCQkJCQk8PCBzdGQ6OmVuZGwgPDwgKCppdCkgPDwgc3RkOjpmbHVzaAorCQkJCQkJPDwgImZvciB0aGUgcHNldWRvc3RhdGU8IGZvcmsgPiA8PCAiCisJCQkJCQk8PCBzdHJfaGVhZGVyKCBhU3RhdGVtYWNoaW5lICkgPDwgc3RkOjplbmRsOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJYW5FeGVjdXRhYmxlRm9ybS0+c2V0T25FbmFibGUoIFN0YXRlbWVudENvbnN0cnVjdG9yOjp4bmV3Q29kZUZsYXQoCisJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NFUVVFTkNFLAorCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfSk9JTiwgc3luY0NvZGUpLAorCQkJYW5FeGVjdXRhYmxlRm9ybS0+Z2V0T25FbmFibGUoKSkgKTsKKworLy8JQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiPnwgY29tcGlsaW5nPHRyYW5zaXRpb24+IG9mICIKKy8vCQkJPDwgc3RyX2hlYWRlciggYVN0YXRlbWFjaGluZSApIDw8IHN0ZDo6ZW5kbDsKK30KKworCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvY29tcGlsZXIvQ29tcGlsZXJPZlRyYW5zaXRpb24uaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvY29tcGlsZXIvQ29tcGlsZXJPZlRyYW5zaXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDBiMWIzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9jb21waWxlci9Db21waWxlck9mVHJhbnNpdGlvbi5oCkBAIC0wLDAgKzEsMTI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTAgbm92LiAyMDA4CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQlVJTERFUl9DT01QSUxFUl9DT01QSUxFUk9GVFJBTlNJVElPTl9IXworI2RlZmluZSBCVUlMREVSX0NPTVBJTEVSX0NPTVBJTEVST0ZUUkFOU0lUSU9OX0hfCisKKyNpbmNsdWRlIDxidWlsZGVyL2NvbXBpbGVyL0Jhc2VDb21waWxlci5oPgorCisjaW5jbHVkZSA8Y29sbGVjdGlvbi9UeXBlZGVmLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9Bdm1UcmFuc2l0aW9uLmg+CisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yTWFuYWdlci5oPgorCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1RyYW5zaXRpb25Nb2MuaD4KKworCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjbGFzcyBBdm1jb2RlQ29tcGlsZXI7CitjbGFzcyBDb21waWxlck9mQXZtQ29kZTsKK2NsYXNzIENvbXBpbGVyOworY2xhc3MgQ29tcGlsZXJPZlZhcmlhYmxlOworCitjbGFzcyBBdm1Db2RlOworY2xhc3MgQXZtVHJhbnNpdGlvbjsKK2NsYXNzIEV4ZWN1dGFibGVGb3JtOworY2xhc3MgTWFjaGluZTsKK2NsYXNzIFRyYW5zaXRpb247CitjbGFzcyBXT2JqZWN0OworCisKK2NsYXNzIENvbXBpbGVyT2ZUcmFuc2l0aW9uICA6ICBwdWJsaWMgQmFzZUNvbXBpbGVyCit7CisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlDb21waWxlck9mVHJhbnNpdGlvbihDb21waWxlciAmIGFDb21waWxlcik7CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+Q29tcGlsZXJPZlRyYW5zaXRpb24oKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwl2b2lkIHNldERlZmF1bHRNb2MoKTsKKworCisJdm9pZCBwdXNoTW9jKFdPYmplY3QgKiBtb2NUcmFuc2l0aW9uKTsKKworCXZvaWQgcG9wTW9jKCk7CisKKworCS8qKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBQUkVDT01QSUxBVElPTgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKi8KKwl2b2lkIHByZWNvbXBpbGVUcmFuc2l0aW9uKAorCQkJRXhlY3V0YWJsZUZvcm0gKiBhQ29udGFpbmVyLCBUcmFuc2l0aW9uICogYVRyYW5zaXRpb24pOworCisKKwkvKioKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogQ09NUElMQVRJT04KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJdm9pZCBjb21waWxlVHJhbnNpdGlvbihBdm1UcmFuc2l0aW9uICogYW5Bdm1UcmFuc2l0aW9uKTsKKworCUJGQ29kZSBzY2hlZHVsZUxpc3RPZlRyYW5zaXRpb24oCisJCQlFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZUZvcm0sIEJGTGlzdCAmIGxpc3RPZlRyYW5zaXRpb24pOworCisJTWFjaGluZSAqIGdldFRyYW5zaXRpb25UYXJnZXQoCisJCQlUcmFuc2l0aW9uICogYVRyYW5zaXRpb24sIGNvbnN0IEJGICYgc21UYXJnZXQpOworCisJQkYgY29tcGlsZVRyYW5zaXRpb25UYXJnZXQoCisJCQlBdm1UcmFuc2l0aW9uICogYW5Bdm1UcmFuc2l0aW9uLCBjb25zdCBCRiAmIHNtVGFyZ2V0KTsKKworCXZvaWQgY29tcGlsZVN0YXRlbWFjaGluZVRyYW5zaXRpb24oRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGVGb3JtLAorCQkJY29uc3QgQkZDb2RlICYgcnVuUm91dGluZSk7CisKKwl2b2lkIGNvbXBpbGVTdGF0ZUZvcmtPdXRwdXRUcmFuc2l0aW9uKEV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlRm9ybSwKKwkJCWNvbnN0IEJGQ29kZSAmIHJ1blJvdXRpbmUpOworCisJdm9pZCBjb21waWxlU3RhdGVKb2luSW5wdXRUcmFuc2l0aW9uKEV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlRm9ybSk7CisKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURQorCSAqLworCUNvbXBpbGVyICYgbUNvbXBpbGVyOworCisJQ29tcGlsZXJPZlZhcmlhYmxlICYgbURhdGFDb21waWxlcjsKKworCisJLy8gTU9DOj4gTW9kZWwgb2YgQ29tcGlsYXRpb24KKwlMaXN0PCBUcmFuc2l0aW9uTW9jICogPiAgbU1vY1N0YWNrOworCisJVHJhbnNpdGlvbk1vYyAqIG1DdXJyZW50TW9jOworCisJVHJhbnNpdGlvbk1vYyBtRGVmYXVsdE1vYzsKKworfTsKKworfQorCisjZW5kaWYgLyogQlVJTERFUl9DT01QSUxFUl9DT01QSUxFUk9GVFJBTlNJVElPTl9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9jb21waWxlci9Db21waWxlck9mVmFyaWFibGUuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9jb21waWxlci9Db21waWxlck9mVmFyaWFibGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYmE5NDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL2NvbXBpbGVyL0NvbXBpbGVyT2ZWYXJpYWJsZS5jcHAKQEAgLTAsMCArMSw5NTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyOSBtYXJzIDIwMTEKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkNvbXBpbGVyT2ZWYXJpYWJsZS5oIgorCisjaW5jbHVkZSA8YnVpbGRlci9wcmltaXRpdmUvQXZtY29kZUNvbXBpbGVyLmg+CisjaW5jbHVkZSA8YnVpbGRlci9jb21waWxlci9Db21waWxlci5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvQXZtTGFtYmRhLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvQXZtUHJvZ3JhbS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVGb3JtLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZkRhdGEuaD4KKworI2luY2x1ZGUgPGZtbC9idWlsdGluL0Jvb2xlYW4uaD4KKyNpbmNsdWRlIDxmbWwvYnVpbHRpbi9DaGFyYWN0ZXIuaD4KKyNpbmNsdWRlIDxmbWwvYnVpbHRpbi9JZGVudGlmaWVyLmg+CisKKyNpbmNsdWRlIDxmbWwvY29tbW9uL1NwZWNpZmllckVsZW1lbnQuaD4KKworI2luY2x1ZGUgPGZtbC9udW1lcmljL0ludGVnZXIuaD4KKyNpbmNsdWRlIDxmbWwvbnVtZXJpYy9OdW1iZXIuaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0J1aWx0aW5BcnJheS5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25GYWN0b3J5Lmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvblR5cGVDaGVja2VyLmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vU3RhdGVtZW50Q29uc3RydWN0b3IuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9TdGF0ZW1lbnRDb25zdHJ1Y3Rvci5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL1N0YXRlbWVudFR5cGVDaGVja2VyLmg+CisKKyNpbmNsdWRlIDxmbWwvb3BlcmF0b3IvT3BlcmF0b3JNYW5hZ2VyLmg+CisKKyNpbmNsdWRlIDxmbWwvc3ltYm9sL1RhYmxlT2ZTeW1ib2wuaD4KKworI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9CZWhhdmlvcmFsUGFydC5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Sb3V0aW5lLmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1ZhcmlhYmxlLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorICogQ09OU1RSVUNUT1IKKyAqIERlZmF1bHQKKyAqLworQ29tcGlsZXJPZlZhcmlhYmxlOjpDb21waWxlck9mVmFyaWFibGUoQ29tcGlsZXIgJiBhQ29tcGlsZXIpCis6IEJhc2VDb21waWxlcihhQ29tcGlsZXIpCit7CisJLy8hISBOT1RISU5HCit9CisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUFJFLUNPTVBJTEFUSU9OCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK3ZvaWQgQ29tcGlsZXJPZlZhcmlhYmxlOjphZGRQcmVjb21waWxlRGF0YSgKKwkJQXZtUHJvZ3JhbSAqIGFDb250YWluZXIsIFN5bWJvbCAmIGFWYXJpYWJsZSwKKwkJVGFibGVPZkluc3RhbmNlT2ZEYXRhICYgdGFibGVPZlZhcmlhYmxlLCBib29sIGNvbGxlY3RWYXJFbmFibGVkKQoreworCWdldFN5bWJvbFRhYmxlKCkuYWRkRGF0YUluc3RhbmNlKGFWYXJpYWJsZSk7CisKKwlBVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoIGFWYXJpYWJsZS5oYXNUeXBlU3BlY2lmaWVyKCkgKQorCQkJPDwgImFkZFByZWNvbXBpbGVEYXRhOj4gVW5leHBlY3RlZCBhICIKKwkJCQkidmFyaWFibGUgd2l0aG91dCB0eXBlLXNwZWNpZmllciAhISEiCisJCQk8PCBTRU5EX0VYSVQ7CisKKwlCYXNlVHlwZVNwZWNpZmllciAqIGFUeXBlU3BlY2lmaWVyID0gYVZhcmlhYmxlLmdldFR5cGVTcGVjaWZpZXIoKTsKKworCWlmKCBhVHlwZVNwZWNpZmllci0+aXM8IFR5cGVBbGlhc1NwZWNpZmllciA+KCkgKQorCXsKKwkJYVR5cGVTcGVjaWZpZXIgPSBhVHlwZVNwZWNpZmllci0+CisJCQkJdG88IFR5cGVBbGlhc1NwZWNpZmllciA+KCktPnRhcmdldFR5cGVTcGVjaWZpZXIoKTsKKwl9CisKKwlBcnJheUJGICogYXJyYXlWYWx1ZSA9ICggYVZhcmlhYmxlLmhhc0FycmF5VmFsdWUoKSApID8KKwkJCWFWYXJpYWJsZS5nZXRBcnJheVZhbHVlKCkgOiBOVUxMOworCisvLwlpZiggYXJyYXlWYWx1ZS0+Z2V0VHlwZVNwZWNpZmllcigpICE9IGFUeXBlU3BlY2lmaWVyICkKKy8vCXsKKy8vCQlhVHlwZVNwZWNpZmllciA9IE5VTEw7CisvLwl9CisKKwlzd2l0Y2goIGFUeXBlU3BlY2lmaWVyLT5nZXRUeXBlU3BlY2lmaWVyS2luZCgpICkKKwl7CisJCWNhc2UgVFlQRV9CT09MRUFOX1NQRUNJRklFUjoKKwkJY2FzZSBUWVBFX0NIQVJBQ1RFUl9TUEVDSUZJRVI6CisJCWNhc2UgVFlQRV9SRUFMX1NQRUNJRklFUjoKKwkJY2FzZSBUWVBFX0ZMT0FUX1NQRUNJRklFUjoKKwkJY2FzZSBUWVBFX1JBVElPTkFMX1NQRUNJRklFUjoKKwkJY2FzZSBUWVBFX0lOVEVHRVJfU1BFQ0lGSUVSOgorCisJCWNhc2UgVFlQRV9JTlRFUlZBTF9TUEVDSUZJRVI6CisKKwkJY2FzZSBUWVBFX0VOVU1fU1BFQ0lGSUVSOgorCisJCWNhc2UgVFlQRV9TVFJJTkdfU1BFQ0lGSUVSOgorCisJCWNhc2UgVFlQRV9NQUNISU5FX1NQRUNJRklFUjoKKwkJeworCQkJaWYoIGNvbGxlY3RWYXJFbmFibGVkICkKKwkJCXsKKwkJCQl0YWJsZU9mVmFyaWFibGUuYXBwZW5kKGFWYXJpYWJsZSk7CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBUWVBFX0NMQVNTX1NQRUNJRklFUjoKKwkJeworCQkJQ2xhc3NUeXBlU3BlY2lmaWVyICogY2xhc3NUeXBlID0KKwkJCQkJYVR5cGVTcGVjaWZpZXItPnRvPCBDbGFzc1R5cGVTcGVjaWZpZXIgPigpOworCisJCQlhVmFyaWFibGUuc2V0QXR0cmlidXRlKCBuZXcgVGFibGVPZlN5bWJvbChjbGFzc1R5cGUtPnNpemUoKSkgKTsKKworCQkJSW5zdGFuY2VPZkRhdGEgKiBuZXdJbnN0YW5jZTsKKwkJCVN5bWJvbCBuZXdTeW1ib2w7CisKKwkJCVRhYmxlT2ZTeW1ib2w6Oml0ZXJhdG9yIGl0ID0gY2xhc3NUeXBlLT5nZXRTeW1ib2xEYXRhKCkuYmVnaW4oKTsKKwkJCVRhYmxlT2ZTeW1ib2w6Oml0ZXJhdG9yIGVuZEl0ID0gY2xhc3NUeXBlLT5nZXRTeW1ib2xEYXRhKCkuZW5kKCk7CisJCQlmb3IoIGF2bV9vZmZzZXRfdCBvZmZzZXQgPSAwIDsgaXQgIT0gZW5kSXQgOyArK2l0LCArK29mZnNldCApCisJCQl7CisJCQkJbmV3U3ltYm9sID0gbmV3SW5zdGFuY2UgPSBuZXcgSW5zdGFuY2VPZkRhdGEoCisJCQkJCQlJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfRklFTERfQ0xBU1NfQVRUUklCVVRFX05BVFVSRSwKKwkJCQkJCWFWYXJpYWJsZS5nZXRDb250YWluZXIoKSwgKCppdCkuZ2V0QXN0RWxlbWVudCgpLAorCQkJCQkJKCppdCkuZ2V0VHlwZVNwZWNpZmllcigpLCBhVmFyaWFibGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSArICIuIiArCisJCQkJCQkoKml0KS5nZXRBc3ROYW1lSUQoKSwgb2Zmc2V0LCBhVmFyaWFibGUucmF3RGF0YSgpICk7CisKKwkJCQluZXdJbnN0YW5jZS0+Z2V0d01vZGlmaWVyKCkuc2V0TmF0dXJlS2luZCgKKwkJCQkJCSgqaXQpLmdldEFzdEVsZW1lbnQoKS0+Z2V0TW9kaWZpZXIoKS5nZXROYXR1cmVLaW5kKCkgKTsKKworCQkJCW5ld0luc3RhbmNlLT5nZXR3TW9kaWZpZXIoKS5zZXRGZWF0dXJlVm9sYXRpbGUoCisJCQkJCQkoKml0KS5nZXRBc3RFbGVtZW50KCktPmdldE1vZGlmaWVyKCkuaGFzRmVhdHVyZVZvbGF0aWxlKCkgKTsKKwkJCQluZXdJbnN0YW5jZS0+Z2V0d01vZGlmaWVyKCkuc2V0RmVhdHVyZVRyYW5zaWVudCgKKwkJCQkJCSgqaXQpLmdldEFzdEVsZW1lbnQoKS0+Z2V0TW9kaWZpZXIoKS5oYXNGZWF0dXJlVHJhbnNpZW50KCkgKTsKKworCQkJCWFWYXJpYWJsZS5zZXRBdHRyaWJ1dGUob2Zmc2V0LCBuZXdTeW1ib2wpOworCisJCQkJaWYoIChhcnJheVZhbHVlICE9IE5VTEwpICYmIChhcnJheVZhbHVlLT5zaXplKCkgPiBvZmZzZXQpICkKKwkJCQl7CisJCQkJCW5ld0luc3RhbmNlLT5zZXRWYWx1ZSggYXJyYXlWYWx1ZS0+YXQob2Zmc2V0KSApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQluZXdJbnN0YW5jZS0+c2V0VmFsdWUoICgqaXQpLmdldFZhbHVlKCkgKTsKKwkJCQl9CisKKwkJCQluZXdJbnN0YW5jZS0+c2V0UGFyZW50KCBhVmFyaWFibGUucmF3RGF0YSgpICk7CisJCQkJbmV3SW5zdGFuY2UtPnVwZGF0ZU5hbWVJRCgpOworCisJCQkJcHJlY29tcGlsZURhdGFfaW5pdGlhbFZhbHVlKGFDb250YWluZXIsIG5ld0luc3RhbmNlKTsKKworCQkJCWlmKCBuZXdJbnN0YW5jZS0+Z2V0TW9kaWZpZXIoKS5oYXNGZWF0dXJlVW5zYWZlKCkKKwkJCQkJfHwgYUNvbnRhaW5lci0+Z2V0TW9kaWZpZXIoKS5oYXNGZWF0dXJlVW5zYWZlKCkgKQorCQkJCXsKKwkJCQkJY29tcGlsZVR5cGVDb25zdHJhaW50KGFDb250YWluZXIsIG5ld0luc3RhbmNlKTsKKwkJCQl9CisKKwkJCQkvLyBBREQgREFUQQorCQkJCWFkZFByZWNvbXBpbGVEYXRhKGFDb250YWluZXIsIG5ld1N5bWJvbCwKKwkJCQkJCXRhYmxlT2ZWYXJpYWJsZSwgY29sbGVjdFZhckVuYWJsZWQpOworCQkJfQorCisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgVFlQRV9DSE9JQ0VfU1BFQ0lGSUVSOgorCQl7CisJCQlDbGFzc1R5cGVTcGVjaWZpZXIgKiBjbGFzc1R5cGUgPQorCQkJCQlhVHlwZVNwZWNpZmllci0+dG88IENsYXNzVHlwZVNwZWNpZmllciA+KCk7CisKKwkJCWFWYXJpYWJsZS5zZXRBdHRyaWJ1dGUoIG5ldyBUYWJsZU9mU3ltYm9sKGNsYXNzVHlwZS0+c2l6ZSgpKSApOworCisJCQlJbnN0YW5jZU9mRGF0YSAqIG5ld0luc3RhbmNlOworCQkJU3ltYm9sIG5ld1N5bWJvbDsKKworCQkJVGFibGVPZlN5bWJvbDo6aXRlcmF0b3IgaXQgPSBjbGFzc1R5cGUtPmdldFN5bWJvbERhdGEoKS5iZWdpbigpOworCQkJVGFibGVPZlN5bWJvbDo6aXRlcmF0b3IgZW5kSXQgPSBjbGFzc1R5cGUtPmdldFN5bWJvbERhdGEoKS5lbmQoKTsKKwkJCWZvciggYXZtX29mZnNldF90IG9mZnNldCA9IDAgOyBpdCAhPSBlbmRJdCA7ICsraXQsICsrb2Zmc2V0ICkKKwkJCXsKKwkJCQluZXdTeW1ib2wgPSBuZXdJbnN0YW5jZSA9IG5ldyBJbnN0YW5jZU9mRGF0YSgKKwkJCQkJCUlQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9GSUVMRF9DSE9JQ0VfQVRUUklCVVRFX05BVFVSRSwKKwkJCQkJCWFWYXJpYWJsZS5nZXRDb250YWluZXIoKSwgKCppdCkuZ2V0QXN0RWxlbWVudCgpLAorCQkJCQkJKCppdCkuZ2V0VHlwZVNwZWNpZmllcigpLCBhVmFyaWFibGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSArICIuIiArCisJCQkJCQkoKml0KS5nZXRBc3ROYW1lSUQoKSwgb2Zmc2V0LCBhVmFyaWFibGUucmF3RGF0YSgpICk7CisKKwkJCQluZXdJbnN0YW5jZS0+Z2V0d01vZGlmaWVyKCkuc2V0TmF0dXJlS2luZCgKKwkJCQkJCSgqaXQpLmdldEFzdEVsZW1lbnQoKS0+Z2V0TW9kaWZpZXIoKS5nZXROYXR1cmVLaW5kKCkgKTsKKworCQkJCW5ld0luc3RhbmNlLT5nZXR3TW9kaWZpZXIoKS5zZXRGZWF0dXJlVm9sYXRpbGUoCisJCQkJCQkoKml0KS5nZXRBc3RFbGVtZW50KCktPmdldE1vZGlmaWVyKCkuaGFzRmVhdHVyZVZvbGF0aWxlKCkgKTsKKwkJCQluZXdJbnN0YW5jZS0+Z2V0d01vZGlmaWVyKCkuc2V0RmVhdHVyZVRyYW5zaWVudCgKKwkJCQkJCSgqaXQpLmdldEFzdEVsZW1lbnQoKS0+Z2V0TW9kaWZpZXIoKS5oYXNGZWF0dXJlVHJhbnNpZW50KCkgKTsKKworCQkJCWFWYXJpYWJsZS5zZXRBdHRyaWJ1dGUob2Zmc2V0LCBuZXdTeW1ib2wpOworCisJCQkJaWYoIChhcnJheVZhbHVlICE9IE5VTEwpICYmIChhcnJheVZhbHVlLT5zaXplKCkgPiBvZmZzZXQpICkKKwkJCQl7CisJCQkJCW5ld0luc3RhbmNlLT5zZXRWYWx1ZSggYXJyYXlWYWx1ZS0+YXQob2Zmc2V0KSApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQluZXdJbnN0YW5jZS0+c2V0VmFsdWUoICgqaXQpLmdldFZhbHVlKCkgKTsKKwkJCQl9CisKKwkJCQluZXdJbnN0YW5jZS0+c2V0UGFyZW50KCBhVmFyaWFibGUucmF3RGF0YSgpICk7CisJCQkJbmV3SW5zdGFuY2UtPnVwZGF0ZU5hbWVJRCgpOworCisJCQkJcHJlY29tcGlsZURhdGFfaW5pdGlhbFZhbHVlKGFDb250YWluZXIsIG5ld0luc3RhbmNlKTsKKworCQkJCWlmKCBuZXdJbnN0YW5jZS0+Z2V0TW9kaWZpZXIoKS5oYXNGZWF0dXJlVW5zYWZlKCkKKwkJCQkJfHwgYUNvbnRhaW5lci0+Z2V0TW9kaWZpZXIoKS5oYXNGZWF0dXJlVW5zYWZlKCkgKQorCQkJCXsKKwkJCQkJY29tcGlsZVR5cGVDb25zdHJhaW50KGFDb250YWluZXIsIG5ld0luc3RhbmNlKTsKKwkJCQl9CisKKwkJCQkvLyBBREQgREFUQQorCQkJCWFkZFByZWNvbXBpbGVEYXRhKGFDb250YWluZXIsIG5ld1N5bWJvbCwKKwkJCQkJCXRhYmxlT2ZWYXJpYWJsZSwgY29sbGVjdFZhckVuYWJsZWQpOworCQkJfQorCisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgVFlQRV9VTklPTl9TUEVDSUZJRVI6CisJCXsKKwkJCVVuaW9uVHlwZVNwZWNpZmllciAqIHVuaW9uVHlwZSA9CisJCQkJCWFUeXBlU3BlY2lmaWVyLT50bzwgVW5pb25UeXBlU3BlY2lmaWVyID4oKTsKKwkJCWFWYXJpYWJsZS5zZXRBdHRyaWJ1dGUoIG5ldyBUYWJsZU9mU3ltYm9sKHVuaW9uVHlwZS0+c2l6ZSgpKSApOworCisJCQlJbnN0YW5jZU9mRGF0YSAqIG5ld0luc3RhbmNlOworCQkJU3ltYm9sIG5ld1N5bWJvbDsKKworCQkJVGFibGVPZlN5bWJvbDo6aXRlcmF0b3IgaXQgPSB1bmlvblR5cGUtPmdldFN5bWJvbERhdGEoKS5iZWdpbigpOworCQkJVGFibGVPZlN5bWJvbDo6aXRlcmF0b3IgZW5kSXQgPSB1bmlvblR5cGUtPmdldFN5bWJvbERhdGEoKS5lbmQoKTsKKwkJCWZvciggYXZtX29mZnNldF90IG9mZnNldCA9IDAgOyBpdCAhPSBlbmRJdCA7ICsraXQsICsrb2Zmc2V0ICkKKwkJCXsKKwkJCQlpZiggKCppdCkuaGFzVHlwZUFycmF5T3JTdHJ1Y3R1cmUoKSApCisJCQkJeworCQkJCQlpbmNyRXJyb3JDb3VudCgpOworCQkJCQlBVk1fT1NfV0FSTiA8PCBhVmFyaWFibGUuZ2V0QXN0RWxlbWVudCgpCisJCQkJCQkJLT5lcnJvckxvY2F0aW9uKGFDb250YWluZXItPmdldEFzdEVsZW1lbnQoKSkKKwkJCQkJCQk8PCAiQ29tcGlsZXJPZlZhcmlhYmxlOjphZGRQcmVjb21waWxlRGF0YSA6ICIKKwkJCQkJCQk8PCAiVW5zdXBwb3J0ZWQgXCJjb21wb3NpdGUgdHlwZVwiICIKKwkJCQkJCQkJImluIGEgXCJ1bmlvbiB0eXBlXCIgPDwgIgorCQkJCQkJCTw8IHN0cl9oZWFkZXIoICppdCApIDw8ICIgPj4hIiA8PCBzdGQ6OmVuZGw7CisJCQkJfQorCisJCQkJbmV3U3ltYm9sID0gbmV3SW5zdGFuY2UgPSBuZXcgSW5zdGFuY2VPZkRhdGEoCisJCQkJCQlJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfRklFTERfVU5JT05fQVRUUklCVVRFX05BVFVSRSwKKwkJCQkJCWFWYXJpYWJsZS5nZXRDb250YWluZXIoKSwgKCppdCkuZ2V0QXN0RWxlbWVudCgpLAorCQkJCQkJKCppdCkuZ2V0VHlwZVNwZWNpZmllcigpLAorCQkJCQkJYVZhcmlhYmxlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgKyAiLiIgKworCQkJCQkJCQkoKml0KS5nZXRBc3ROYW1lSUQoKSwKKwkJCQkJCWFWYXJpYWJsZS5nZXRPZmZzZXQoKSwKKwkJCQkJCWFWYXJpYWJsZS5yYXdEYXRhKCkgKTsKKworCQkJCW5ld0luc3RhbmNlLT5nZXR3TW9kaWZpZXIoKS5zZXROYXR1cmVLaW5kKAorCQkJCQkJKCppdCkuZ2V0QXN0RWxlbWVudCgpLT5nZXRNb2RpZmllcigpLmdldE5hdHVyZUtpbmQoKSApOworCisJCQkJbmV3SW5zdGFuY2UtPmdldHdNb2RpZmllcigpLnNldEZlYXR1cmVWb2xhdGlsZSgKKwkJCQkJCSgqaXQpLmdldEFzdEVsZW1lbnQoKS0+Z2V0TW9kaWZpZXIoKS5oYXNGZWF0dXJlVm9sYXRpbGUoKSApOworCQkJCW5ld0luc3RhbmNlLT5nZXR3TW9kaWZpZXIoKS5zZXRGZWF0dXJlVHJhbnNpZW50KAorCQkJCQkJKCppdCkuZ2V0QXN0RWxlbWVudCgpLT5nZXRNb2RpZmllcigpLmhhc0ZlYXR1cmVUcmFuc2llbnQoKSApOworCisJCQkJYVZhcmlhYmxlLnNldEF0dHJpYnV0ZShvZmZzZXQsIG5ld1N5bWJvbCk7CisKKwkJCQlpZiggKGFycmF5VmFsdWUgIT0gTlVMTCkgJiYgKGFycmF5VmFsdWUtPnNpemUoKSA+IG9mZnNldCkgKQorCQkJCXsKKwkJCQkJbmV3SW5zdGFuY2UtPnNldFZhbHVlKCBhcnJheVZhbHVlLT5hdChvZmZzZXQpICk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCW5ld0luc3RhbmNlLT5zZXRWYWx1ZSggKCppdCkuZ2V0VmFsdWUoKSApOworCQkJCX0KKworCQkJCW5ld0luc3RhbmNlLT5zZXRQYXJlbnQoIGFWYXJpYWJsZS5yYXdEYXRhKCkgKTsKKwkJCQluZXdJbnN0YW5jZS0+dXBkYXRlTmFtZUlEKCk7CisKKwkJCQlwcmVjb21waWxlRGF0YV9pbml0aWFsVmFsdWUoYUNvbnRhaW5lciwgbmV3SW5zdGFuY2UpOworCisJCQkJaWYoIG5ld0luc3RhbmNlLT5nZXRNb2RpZmllcigpLmhhc0ZlYXR1cmVVbnNhZmUoKQorCQkJCQl8fCBhQ29udGFpbmVyLT5nZXRNb2RpZmllcigpLmhhc0ZlYXR1cmVVbnNhZmUoKSApCisJCQkJeworCQkJCQljb21waWxlVHlwZUNvbnN0cmFpbnQoYUNvbnRhaW5lciwgbmV3SW5zdGFuY2UpOworCQkJCX0KKworCQkJCS8vIEFERCBEQVRBCisJCQkJYWRkUHJlY29tcGlsZURhdGEoYUNvbnRhaW5lciwgbmV3U3ltYm9sLAorCQkJCQkJdGFibGVPZlZhcmlhYmxlLCBjb2xsZWN0VmFyRW5hYmxlZCk7CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisKKworCQljYXNlIFRZUEVfQVJSQVlfU1BFQ0lGSUVSOgorCQl7CisJCQlDb250YWluZXJUeXBlU3BlY2lmaWVyICogY29sbGVjdGlvblQgPQorCQkJCQlhVHlwZVNwZWNpZmllci0+dG88IENvbnRhaW5lclR5cGVTcGVjaWZpZXIgPigpOworCisJCQlhVmFyaWFibGUuc2V0QXR0cmlidXRlKCBuZXcgVGFibGVPZlN5bWJvbChjb2xsZWN0aW9uVC0+c2l6ZSgpKSApOworCisJCQlzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzSUQ7CisKKwkJCUluc3RhbmNlT2ZEYXRhICogbmV3SW5zdGFuY2U7CisJCQlTeW1ib2wgbmV3U3ltYm9sOworCisJCQlhdm1fb2Zmc2V0X3Qgb2Zmc2V0ID0gMDsKKwkJCWZvciggOyBvZmZzZXQgPCBjb2xsZWN0aW9uVC0+c2l6ZSgpIDsgKytvZmZzZXQgKQorCQkJeworCQkJCW9zc0lELnN0cigiIik7CisJCQkJb3NzSUQgPDwgIlsiIDw8IG9mZnNldCA8PCAiXSI7CisKKwkJCQluZXdTeW1ib2wgPSBuZXdJbnN0YW5jZSA9IG5ldyBJbnN0YW5jZU9mRGF0YSgKKwkJCQkJCUlQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9GSUVMRF9BUlJBWV9PRkZTRVRfTkFUVVJFLAorCQkJCQkJYVZhcmlhYmxlLmdldENvbnRhaW5lcigpLCBhVmFyaWFibGUuZ2V0QXN0RWxlbWVudCgpLAorCQkJCQkJY29sbGVjdGlvblQtPmdldENvbnRlbnRzVHlwZVNwZWNpZmllcigpLAorCQkJCQkJYVZhcmlhYmxlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgKyBvc3NJRC5zdHIoKSwKKwkJCQkJCW9mZnNldCwgYVZhcmlhYmxlLmdldE1vZGlmaWVyKCkgKTsKKworCQkJCW5ld0luc3RhbmNlLT5zZXRQYXJlbnQoIGFWYXJpYWJsZS5yYXdEYXRhKCkgKTsKKwkJCQluZXdJbnN0YW5jZS0+dXBkYXRlTmFtZUlEKCk7CisKKwkJCQlhVmFyaWFibGUuc2V0QXR0cmlidXRlKG9mZnNldCwgbmV3U3ltYm9sKTsKKworCQkJCWlmKCBuZXdJbnN0YW5jZS0+Z2V0TW9kaWZpZXIoKS5oYXNGZWF0dXJlVW5zYWZlKCkKKwkJCQkJfHwgYUNvbnRhaW5lci0+Z2V0TW9kaWZpZXIoKS5oYXNGZWF0dXJlVW5zYWZlKCkgKQorCQkJCXsKKwkJCQkJY29tcGlsZVR5cGVDb25zdHJhaW50KGFDb250YWluZXIsIG5ld0luc3RhbmNlKTsKKwkJCQl9CisKKwkJCQlpZiggKGFycmF5VmFsdWUgIT0gTlVMTCkgJiYgKGFycmF5VmFsdWUtPnNpemUoKSA+IG9mZnNldCkgKQorCQkJCXsKKwkJCQkJbmV3SW5zdGFuY2UtPnNldFZhbHVlKCBhcnJheVZhbHVlLT5hdChvZmZzZXQpICk7CisJCQkJfQorCisJCQkJLy8gQUREIERBVEEKKwkJCQlhZGRQcmVjb21waWxlRGF0YShhQ29udGFpbmVyLCBuZXdTeW1ib2wsCisJCQkJCQl0YWJsZU9mVmFyaWFibGUsIGNvbGxlY3RWYXJFbmFibGVkKTsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCisJCWNhc2UgVFlQRV9GSUZPX1NQRUNJRklFUjoKKwkJY2FzZSBUWVBFX0xJRk9fU1BFQ0lGSUVSOgorCQljYXNlIFRZUEVfTVVMVElfRklGT19TUEVDSUZJRVI6CisJCWNhc2UgVFlQRV9NVUxUSV9MSUZPX1NQRUNJRklFUjoKKwkJY2FzZSBUWVBFX0xJU1RfU1BFQ0lGSUVSOgorCQljYXNlIFRZUEVfU0VUX1NQRUNJRklFUjoKKwkJeworCQkJaWYoIGNvbGxlY3RWYXJFbmFibGVkICkKKwkJCXsKKwkJCQl0YWJsZU9mVmFyaWFibGUuYXBwZW5kKGFWYXJpYWJsZSk7CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBUWVBFX1VOSVZFUlNBTF9TUEVDSUZJRVI6CisJCXsKKwkJCWlmKCBjb2xsZWN0VmFyRW5hYmxlZCApCisJCQl7CisJCQkJdGFibGVPZlZhcmlhYmxlLmFwcGVuZChhVmFyaWFibGUpOworCQkJfQorCisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgVFlQRV9OVUxMX1NQRUNJRklFUjoKKwkJeworCQkJLy8gVE9ETyBFUlJPUgorCQkJYnJlYWs7CisJCX0KKworCQlkZWZhdWx0IDoKKwkJeworCQkJLy8gVE9ETyBFUlJPUgorCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKworYXZtX3NpemVfdCBDb21waWxlck9mVmFyaWFibGU6Om5leHRPZmZzZXQoCisJCVRhYmxlT2ZJbnN0YW5jZU9mRGF0YSAmIHRhYmxlT2ZWYXJpYWJsZSkKK3sKKwlyZXR1cm4oIHRhYmxlT2ZWYXJpYWJsZS5zaXplKCkgKTsKKworLy8JaWYoIHRhYmxlT2ZWYXJpYWJsZS5ub25lbXB0eSgpICkKKy8vCXsKKy8vCQlJbnN0YW5jZU9mRGF0YSAqIGxhc3RWYXIgPSB0YWJsZU9mVmFyaWFibGUubGFzdCgpLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpOworLy8JCWF2bV9vZmZzZXRfdCBvZmZzZXQgPSAwOworLy8KKy8vCQlpZiggbGFzdFZhci0+Z2V0TW9kaWZpZXIoKS5oYXNOYXR1cmVSZWZlcmVuY2UoKSApCisvLwkJeworLy8JCQlvZmZzZXQgPSAxOworLy8JCX0KKy8vCQllbHNlCisvLwkJeworLy8JCQlvZmZzZXQgPSBsYXN0VmFyLT5nZXRUeXBlU3BlY2lmaWVyKCktPmdldERhdGFTaXplKCk7CisvLwkJfQorLy8KKy8vCQlyZXR1cm4oIG9mZnNldCArIGxhc3RWYXItPmdldE9mZnNldCgpICk7CisvLwl9CisvLwllbHNlCisvLwl7CisvLwkJcmV0dXJuKCAwICk7CisvLwl9Cit9CisKKwordm9pZCBDb21waWxlck9mVmFyaWFibGU6OnByZWNvbXBpbGVEYXRhKEF2bVByb2dyYW0gKiBhQ29udGFpbmVyLAorCQlWYXJpYWJsZSAqIGFWYXJpYWJsZSwgVGFibGVPZkluc3RhbmNlT2ZEYXRhICYgdGFibGVPZlZhcmlhYmxlKQoreworCVR5cGVTcGVjaWZpZXIgYVR5cGVTcGVjaWZpZXI7CisJSW5zdGFuY2VPZkRhdGEgKiBuZXdJbnN0YW5jZTsKKwlTeW1ib2wgbmV3U3ltYm9sOworCisJYVR5cGVTcGVjaWZpZXIgPSBjb21waWxlVHlwZVNwZWNpZmllcihhQ29udGFpbmVyLCBhVmFyaWFibGUtPmdldFR5cGUoKSk7CisKKwluZXdTeW1ib2wgPSBuZXdJbnN0YW5jZSA9IG5ldyBJbnN0YW5jZU9mRGF0YSgKKwkJCUlQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9TVEFOREFSRF9OQVRVUkUsCisJCQlhQ29udGFpbmVyLCBhVmFyaWFibGUsIGFUeXBlU3BlY2lmaWVyLAorCQkJbmV4dE9mZnNldCh0YWJsZU9mVmFyaWFibGUpLCBhVmFyaWFibGUtPmdldE1vZGlmaWVyKCkgKTsKKwluZXdJbnN0YW5jZS0+c2V0TmFtZUlEKCBhVmFyaWFibGUtPmdldE5hbWVJRCgpICk7CisvLwluZXdJbnN0YW5jZS0+ZnVsbHlVcGRhdGVBbGxOYW1lSUQoIGFOZXdJbnN0YW5jZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSApOworCisJcHJlY29tcGlsZURhdGFfaW5pdGlhbFZhbHVlKGFDb250YWluZXIsIG5ld0luc3RhbmNlKTsKKworCWlmKCBhVmFyaWFibGUtPmdldE1vZGlmaWVyKCkuaGFzTmF0dXJlUmVmZXJlbmNlKCkgKQorCXsKKwkJdGFibGVPZlZhcmlhYmxlLmFwcGVuZChuZXdTeW1ib2wpOworCX0KKwllbHNlIGlmKCBhVmFyaWFibGUtPmdldE1vZGlmaWVyKCkuaGFzRmVhdHVyZUZpbmFsKCkgKQorCXsKKwkJYUNvbnRhaW5lci0+YXBwZW5kQ29uc3REYXRhKG5ld1N5bWJvbCk7CisKKwkJVGFibGVPZkluc3RhbmNlT2ZEYXRhIHRhYmxlT2ZDb25zdGFudDsKKworCQlhZGRQcmVjb21waWxlRGF0YShhQ29udGFpbmVyLCBuZXdTeW1ib2wsIHRhYmxlT2ZDb25zdGFudCwgdHJ1ZSk7CisKKwkJaWYoIHRhYmxlT2ZDb25zdGFudC5wb3B1bGF0ZWQoKSApCisJCXsKKwkJCVRhYmxlT2ZJbnN0YW5jZU9mRGF0YTo6Y29uc3RfaXRlcmF0b3IgaXQgPSB0YWJsZU9mQ29uc3RhbnQuYmVnaW4oKTsKKwkJCVRhYmxlT2ZJbnN0YW5jZU9mRGF0YTo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSB0YWJsZU9mQ29uc3RhbnQuZW5kKCk7CisJCQlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJCXsKKwkJCQlpZiggKCppdCkuaXNOVEVRKG5ld0luc3RhbmNlKSApCisJCQkJeworCQkJCQlhQ29udGFpbmVyLT5hcHBlbmRDb25zdERhdGEoICppdCApOworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlIGlmKCB0YWJsZU9mQ29uc3RhbnQuc2luZ2xldG9uKCkgJiYKKwkJCQl0YWJsZU9mQ29uc3RhbnQuZnJvbnQoKS5pc05URVEobmV3SW5zdGFuY2UpICkKKwkJeworCQkJYUNvbnRhaW5lci0+YXBwZW5kQ29uc3REYXRhKCB0YWJsZU9mQ29uc3RhbnQuZnJvbnQoKSApOworCQl9CisJfQorCWVsc2UKKwl7CisJCWlmKCBuZXdJbnN0YW5jZS0+Z2V0TW9kaWZpZXIoKS5oYXNGZWF0dXJlVW5zYWZlKCkKKwkJCXx8IGFDb250YWluZXItPmdldE1vZGlmaWVyKCkuaGFzRmVhdHVyZVVuc2FmZSgpICkKKwkJeworCQkJY29tcGlsZVR5cGVDb25zdHJhaW50KGFDb250YWluZXIsIG5ld0luc3RhbmNlKTsKKwkJfQorCisJCS8vIEFERCBEQVRBCisJCXRhYmxlT2ZWYXJpYWJsZS5hcHBlbmQobmV3U3ltYm9sKTsKKworCQlhZGRQcmVjb21waWxlRGF0YShhQ29udGFpbmVyLCBuZXdTeW1ib2wsIHRhYmxlT2ZWYXJpYWJsZSk7CisJfQorCit9CisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ09NUElMQVRJT04KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKwordm9pZCBDb21waWxlck9mVmFyaWFibGU6OmNvbXBpbGVEYXRhKEV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlKQoreworCVRhYmxlT2ZJbnN0YW5jZU9mRGF0YTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGl0RGF0YSA9CisJCQlhbkV4ZWN1dGFibGUtPmdldENvbnN0RGF0YSgpLmJlZ2luKCk7CisJVGFibGVPZkluc3RhbmNlT2ZEYXRhOjpjb25zdF9yYXdfaXRlcmF0b3IgZW5kRGF0YSA9CisJCQlhbkV4ZWN1dGFibGUtPmdldENvbnN0RGF0YSgpLmVuZCgpOworCWZvciggOyBpdERhdGEgIT0gZW5kRGF0YSA7ICsraXREYXRhICkKKwl7CisJCWlmKCAoaXREYXRhKS0+aGFzQXN0VmFyaWFibGUoKSApCisJCXsKKwkJCWNvbXBpbGVDb25zdERhdGEoYW5FeGVjdXRhYmxlLCAoaXREYXRhKSk7CisJCX0KKwl9CisKKworCUJGQ29kZSBvbkluaXRpYWxpemUoIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU0VRVUVOQ0UgKTsKKworCWl0RGF0YSA9IGFuRXhlY3V0YWJsZS0+Z2V0QWxsRGF0YSgpLmJlZ2luKCk7CisJZW5kRGF0YSA9IGFuRXhlY3V0YWJsZS0+Z2V0QWxsRGF0YSgpLmVuZCgpOworCWZvciggOyBpdERhdGEgIT0gZW5kRGF0YSA7ICsraXREYXRhICkKKwl7CisJCWlmKCAoaXREYXRhKS0+aGFzQXN0VmFyaWFibGUoKSApCisJCXsKKwkJCWNvbXBpbGVEYXRhT25DcmVhdGUoYW5FeGVjdXRhYmxlLCBpdERhdGEsIG9uSW5pdGlhbGl6ZSk7CisKKwkJCWNvbXBpbGVEYXRhKGFuRXhlY3V0YWJsZSwgKGl0RGF0YSkpOworCQl9CisJfQorCisJaWYoIG9uSW5pdGlhbGl6ZS0+bm9uZW1wdHkoKSApCisJeworLy8hIVtUUkFDRV06IHRvIGRlbGV0ZQorLy9BVk1fT1NfREVCVUcgPDwgc3RkOjplbmRsIDw8ICJjb21waWxlRGF0YSgpID0+IG9uQ3JlYXRlOj4gIgorLy8JCTw8IG9uSW5pdGlhbGl6ZSA8PCBzdGQ6OmVuZGw7CisKKwkJQmVoYXZpb3JhbFBhcnQgKiB0aGVCZWhhdmlvcmFsUGFydCA9IGNvbnN0X2Nhc3Q8IE1hY2hpbmUgKiA+KAorCQkJCWFuRXhlY3V0YWJsZS0+Z2V0QXN0TWFjaGluZSgpICktPmdldFVuaXFCZWhhdmlvclBhcnQoKTsKKworCQlvbkluaXRpYWxpemUgPSBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6eG5ld0NvZGVGbGF0KAorCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TRVFVRU5DRSwKKwkJCQkJCW9uSW5pdGlhbGl6ZSwgdGhlQmVoYXZpb3JhbFBhcnQtPmdldE9uQ3JlYXRlKCkgKTsKKworCQl0aGVCZWhhdmlvcmFsUGFydC0+c2V0T25DcmVhdGUoIG9uSW5pdGlhbGl6ZS0+cG9wdWxhdGVkKCkgPworCQkJCW9uSW5pdGlhbGl6ZSA6IG9uSW5pdGlhbGl6ZS0+Zmlyc3QoKS5iZkNvZGUoKSApOworCX0KK30KKworCit2b2lkIENvbXBpbGVyT2ZWYXJpYWJsZTo6Y29tcGlsZURhdGFPbkNyZWF0ZSgKKwkJRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGUsCisJCVRhYmxlT2ZJbnN0YW5jZU9mRGF0YTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGl0RGF0YSwKKwkJQkZDb2RlICYgb25Jbml0aWFsaXplKQoreworCWNvbnN0IFZhcmlhYmxlICogYVZhcmlhYmxlID0gKGl0RGF0YSktPmdldEFzdFZhcmlhYmxlKCk7CisKKwljb25zdCBCRiAmIGFWYWx1ZSA9ICggKGl0RGF0YSktPmhhc0FsaWFzVGFyZ2V0KCkgJiYKKwkJCShpdERhdGEpLT5nZXRBbGlhc1RhcmdldCgpLT5hczwgSW5zdGFuY2VPZkRhdGEgPigpLT5oYXNWYWx1ZSgpICk/CisJCQkJKGl0RGF0YSktPmdldEFsaWFzVGFyZ2V0KCktPmFzPCBJbnN0YW5jZU9mRGF0YSA+KCktPmdldFZhbHVlKCkgOgorCQkJCQkoIChpdERhdGEpLT5oYXNWYWx1ZSgpID8KKwkJCQkJCQkoaXREYXRhKS0+Z2V0VmFsdWUoKSA6IGFWYXJpYWJsZS0+Z2V0VmFsdWUoKSApOworLy8hIVtUUkFDRV06IHRvIGRlbGV0ZQorLy8hIVtNSUdSQVRJT05dOlRSQUNFCisvLwlBVk1fT1NfREVCVUcgPDwgc3RkOjplbmRsCisvLwkJCTw8ICJjb21waWxlRGF0YSgpID0+IG9uQ3JlYXRlOj5cbiIKKy8vCQkJPDwgdG9fc3RyZWFtKCAqaXREYXRhICkgPDwgdG9fc3RyZWFtKCBhVmFyaWFibGUgKSA8PCBzdGQ6OmVuZGw7CisKKwlpZiggYVZhbHVlLnZhbGlkKCkgKQorCXsKKwkJLyppZiggKGl0RGF0YSktPmhhc1R5cGVBcnJheU9yU3RydWN0dXJlKCkKKwkJCSYmIChub3QgYVZhbHVlLmlzPCBCdWlsdGluQ29sbGVjdGlvbiA+KCkpICkKKwkJeworCQkJQVZNX09TX0RFQlVHIDw8IHN0ZDo6ZW5kbAorCQkJCQk8PCAiY29tcGlsZURhdGEoKSA9PiBvbkNyZWF0ZTo+IHVuZXhwZWN0ZWRcbiIKKwkJCQkJPDwgInR5cGU6PiAiIDw8IGFWYWx1ZS5jbGFzc0tpbmRJbmZvKCkgPDwgc3RkOjplbmRsCisJCQkJCTw8IHRvX3N0cmVhbSggKml0RGF0YSApIDw8IHN0ZDo6ZW5kbDsKKwkJfQorCQllbHNlKi8gaWYoIG5vdCAoIChpdERhdGEpLT5oYXNQYXJlbnQoKQorCQkJCSYmIChpdERhdGEpLT5nZXRQYXJlbnQoKS0+aGFzVmFsdWUoKSApICkKKy8vCQkJCSYmIChpdERhdGEpLT5nZXRQYXJlbnQoKS0+aGFzVHlwZUFycmF5T3JTdHJ1Y3R1cmUoKQorLy8JCQkJJiYgKGl0RGF0YSktPmdldFBhcmVudCgpLT5nZXRWYWx1ZSgpLmlzPCBCdWlsdGluQ29sbGVjdGlvbiA+KCkgKSApCisJCXsKKy8vQVZNX09TX0RFQlVHIDw8IHN0ZDo6ZW5kbCA8PCAiY29tcGlsZURhdGEoKSA9PiBvbkNyZWF0ZTo+XG4iCisvLwkJPDwgdG9fc3RyZWFtKCAqaXREYXRhICkgPDwgc3RkOjplbmRsOworLy8vLwk8PCBzdHJfaGVhZGVyKCAqaXREYXRhICkgPDwgc3RkOjplbmRsOworCisJCQlvbkluaXRpYWxpemUtPmFwcGVuZCggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCWFWYXJpYWJsZS0+Z2V0QXNzaWduT3BlcmF0b3IoKSwgKCppdERhdGEpLCBhVmFsdWUgKSApOworCQl9CisJfQorfQorCit2b2lkIENvbXBpbGVyT2ZWYXJpYWJsZTo6Y29tcGlsZURhdGEoQXZtUHJvZ3JhbSAqIGFQcm9ncmFtKQoreworCVRhYmxlT2ZJbnN0YW5jZU9mRGF0YTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGl0RGF0YSA9CisJCQlhUHJvZ3JhbS0+Z2V0Q29uc3REYXRhKCkuYmVnaW4oKTsKKwlUYWJsZU9mSW5zdGFuY2VPZkRhdGE6OmNvbnN0X3Jhd19pdGVyYXRvciBlbmREYXRhID0KKwkJCWFQcm9ncmFtLT5nZXRDb25zdERhdGEoKS5lbmQoKTsKKwlmb3IoIDsgaXREYXRhICE9IGVuZERhdGEgOyArK2l0RGF0YSApCisJeworCQlpZiggKGl0RGF0YSktPmhhc0FzdFZhcmlhYmxlKCkgKQorCQl7CisJCQljb21waWxlQ29uc3REYXRhKGFQcm9ncmFtLCAoaXREYXRhKSk7CisJCX0KKwl9CisKKworCWl0RGF0YSA9IGFQcm9ncmFtLT5nZXRBbGxEYXRhKCkuYmVnaW4oKTsKKwllbmREYXRhID0gYVByb2dyYW0tPmdldEFsbERhdGEoKS5lbmQoKTsKKwlmb3IoIDsgaXREYXRhICE9IGVuZERhdGEgOyArK2l0RGF0YSApCisJeworCQlpZiggKGl0RGF0YSktPmhhc0FzdFZhcmlhYmxlKCkgKQorCQl7CisJCQljb21waWxlRGF0YShhUHJvZ3JhbSwgKGl0RGF0YSkpOworCQl9CisJfQorfQorCisKK3ZvaWQgQ29tcGlsZXJPZlZhcmlhYmxlOjpjb21waWxlQ29uc3REYXRhKAorCQlBdm1Qcm9ncmFtICogYUNvbnRhaW5lciwgSW5zdGFuY2VPZkRhdGEgKiBhVmFySW5zdGFuY2UpCit7CisJaWYoIGFWYXJJbnN0YW5jZS0+aGFzQXN0VmFyaWFibGUoKSApCisJeworCQljb25zdCBWYXJpYWJsZSAqIGFDb21waWxlZFZhciA9IGFWYXJJbnN0YW5jZS0+Z2V0QXN0VmFyaWFibGUoKTsKKwkJaWYoIGFDb21waWxlZFZhci0+aGFzT25Xcml0ZSgpICkKKwkJeworCQkJLy8hISEgRVJST1IKKwkJfQorCisJCWNvbXBpbGVEYXRhX2luaXRpYWxWYWx1ZShhQ29udGFpbmVyLCBhVmFySW5zdGFuY2UpOworCX0KK30KKworCit2b2lkIENvbXBpbGVyT2ZWYXJpYWJsZTo6Y29tcGlsZURhdGEoCisJCUF2bVByb2dyYW0gKiBhQ29udGFpbmVyLCBJbnN0YW5jZU9mRGF0YSAqIGFWYXJJbnN0YW5jZSkKK3sKKwljb25zdCBWYXJpYWJsZSAqIGFDb21waWxlZFZhciA9IGFWYXJJbnN0YW5jZS0+Z2V0QXN0VmFyaWFibGUoKTsKKworCWlmKCBhQ29tcGlsZWRWYXItPmhhc09uV3JpdGUoKSAmJgorCQlhQ29tcGlsZWRWYXItPmdldE9uV3JpdGVSb3V0aW5lKCktPmRvU29tZXRoaW5nKCkgKQorCXsKKwkJQXZtUHJvZ3JhbSAqIG9uV3JpdGVQcm9nID0gbUF2bWNvZGVDb21waWxlci5jb21waWxlUm91dGluZSh0aGlzLAorCQkJCWFDb250YWluZXIsIGFWYXJJbnN0YW5jZSwgYUNvbXBpbGVkVmFyLT5nZXRPbldyaXRlUm91dGluZSgpKTsKKworCQlpZiggYVZhckluc3RhbmNlLT5pc0NvbmNyZXRlU3RydWN0QXR0cmlidXRlKCkgKQorCQl7CisJCQlvbldyaXRlUHJvZy0+c2V0RnVsbHlRdWFsaWZpZWROYW1lQ29udGFpbmVyKCBhVmFySW5zdGFuY2UgKTsKKwkJfQorCisJCWFWYXJJbnN0YW5jZS0+c2V0T25Xcml0ZVJvdXRpbmUoIG9uV3JpdGVQcm9nICk7CisKKwkJYUNvbnRhaW5lci0+Z2V0RXhlY3V0YWJsZSgpLT5zYXZlQW5vbnltb3VzSW5uZXJSb3V0aW5lKCBvbldyaXRlUHJvZyApOworCX0KKworCWVsc2UgaWYoIGFWYXJJbnN0YW5jZS0+aGFzVHlwZVNwZWNpZmllcigpICYmCisJCQlhVmFySW5zdGFuY2UtPmdldFR5cGVTcGVjaWZpZXIoKS0+aGFzQ29uc3RyYWludCgpICkKKwl7CisJCWFWYXJJbnN0YW5jZS0+c2V0T25Xcml0ZVJvdXRpbmUoIGFWYXJJbnN0YW5jZS0+Z2V0VHlwZVNwZWNpZmllcigpLT4KKwkJCQlnZXRDb25zdHJhaW50KCkuYXNfcHRyPCBBdm1Qcm9ncmFtID4oKSApOworCX0KKy8vCWVsc2UgaWYoIGFDb21waWxlZFZhci0+aGFzRGF0YVR5cGUoKSAmJgorLy8JCQlhQ29tcGlsZWRWYXItPmdldERhdGFUeXBlKCktPmdldENvbnN0cmFpbnRSb3V0aW5lKCkuZG9Tb21ldGhpbmcoKSApCisvLwl7CisvLwkJYVZhckluc3RhbmNlLT5zZXRPbldyaXRlUm91dGluZSggY29tcGlsZURhdGFfbW9uaXRvcigKKy8vCQkJCWFDb250YWluZXIsIGFWYXJJbnN0YW5jZSwKKy8vCQkJCWFDb21waWxlZFZhci0+Z2V0RGF0YVR5cGUoKS0+Z2V0Q29uc3RyYWludFJvdXRpbmUoKSkgKTsKKy8vCX0KKworCWNvbXBpbGVEYXRhX2luaXRpYWxWYWx1ZShhQ29udGFpbmVyLCBhVmFySW5zdGFuY2UpOworfQorCisKK0JGIENvbXBpbGVyT2ZWYXJpYWJsZTo6cHJlY29tcGlsZURhdGFfaW5pdGlhbFZhbHVlKEF2bVByb2dyYW0gKiBhQ29udGFpbmVyLAorCQlCYXNlVHlwZVNwZWNpZmllciAqIGFUeXBlU3BlY2lmaWVyLCBjb25zdCBCRiAmIGFWYWx1ZSkKK3sKKwlpZiggYVZhbHVlLmludmFsaWQoKSApCisJeworCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCX0KKworCWVsc2UgaWYoIGFWYWx1ZS5pczwgSW5zdGFuY2VPZkRhdGEgPigpICkKKwl7CisJCWlmKCBhVmFsdWUudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCktPmhhc1ZhbHVlKCkgJiYKKwkJCUV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNGaW5hbFN5bWJvbGljQmFzaWNTeW1ib2woCisJCQkJCWFWYWx1ZS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKS0+Z2V0VmFsdWUoKSkgKQorCQl7CisJCQlyZXR1cm4oIGFWYWx1ZS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKS0+Z2V0VmFsdWUoKSApOworCQl9CisJCWVsc2UgaWYoIGFWYWx1ZS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKS0+Z2V0TW9kaWZpZXIoKS4KKwkJCQkJaGFzTW9kaWZpZXJQdWJsaWNGaW5hbFN0YXRpY1BhcmFtZXRlcigpICkKKwkJeworCQkJcmV0dXJuKCBhVmFsdWUgKTsKKwkJfQorCX0KKworCWVsc2UgaWYoIGFWYWx1ZS5pc19zdHJpY3RseTwgQnVpbHRpbkFycmF5ID4oKSApCisJeworCQlCdWlsdGluQXJyYXkgKiBhQnVpbHRpbkFycmF5VmFsdWUgPSBhVmFsdWUudG9fcHRyPCBCdWlsdGluQXJyYXkgPigpOworCisJCWlmKCBhQnVpbHRpbkFycmF5VmFsdWUtPmlzPCBBcnJheUlkZW50aWZpZXIgPigpCisJCQl8fCBhQnVpbHRpbkFycmF5VmFsdWUtPmlzPCBBcnJheVF1YWxpZmllZElkZW50aWZpZXIgPigpICkKKwkJeworCQkJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKKwkJfQorCQllbHNlIGlmKCBhVHlwZVNwZWNpZmllci0+aGFzVHlwZUxpc3RDb2xsZWN0aW9uKCkgKQorCQl7CisJCQlCdWlsdGluQ29udGFpbmVyICogY29udGFpbmVyVmFsdWUgPSBCdWlsdGluQ29udGFpbmVyOjpjcmVhdGUoCisJCQkJCWFUeXBlU3BlY2lmaWVyLT5hczwgQ29udGFpbmVyVHlwZVNwZWNpZmllciA+KCkgKTsKKworCQkJY29udGFpbmVyVmFsdWUtPmNvcHkoYUJ1aWx0aW5BcnJheVZhbHVlLCBzdGQ6Om1pbigKKwkJCQkJY29udGFpbmVyVmFsdWUtPmNhcGFjaXR5KCksIGFCdWlsdGluQXJyYXlWYWx1ZS0+c2l6ZSgpKSApOworCisJCQlyZXR1cm4oIEJGKGNvbnRhaW5lclZhbHVlKSApOworCQl9CisKKwkJZWxzZQorCQl7CisJCQlBcnJheUJGICogYmZBcnJheSA9IGFCdWlsdGluQXJyYXlWYWx1ZS0+Z2V0QXJyYXlCRigpOworCisJCQlpZiggKGJmQXJyYXktPmdldFR5cGVTcGVjaWZpZXIoKSAhPSBhVHlwZVNwZWNpZmllcikKKwkJCQkmJiBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzVHlwZWQoYVR5cGVTcGVjaWZpZXIsIGFWYWx1ZSkgKQorCQkJeworCQkJCWJmQXJyYXktPnNldFR5cGVTcGVjaWZpZXIoIGFUeXBlU3BlY2lmaWVyICk7CisJCQl9CisKKwkJCWlmKCBiZkFycmF5LT5nZXRUeXBlU3BlY2lmaWVyKCktPmlzPCBDb250YWluZXJUeXBlU3BlY2lmaWVyID4oKQorCQkJCSYmIGJmQXJyYXktPmdldFR5cGVTcGVjaWZpZXIoKS0+dG88CisJCQkJCQlDb250YWluZXJUeXBlU3BlY2lmaWVyID4oKS0+d2Vha2x5VHlwZWRJZGVudGlmaWVyKCkgKQorCQkJeworCQkJCWRlbGV0ZSBiZkFycmF5OworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJldHVybiggQkYoIGJmQXJyYXkgKSApOworCQkJfQorCQl9CisJfQorCisJZWxzZSBpZiggYVZhbHVlLmlzPCBBcnJheUJGID4oKQorCQkJLyomJiBhVmFySW5zdGFuY2UtPmdldE1vZGlmaWVyKCkuaGFzRmVhdHVyZUZpbmFsCisJCQkmJiBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzRmluYWxTeW1ib2xpY0NvbXBvc2l0ZVN5bWJvbCgKKwkJCQkJYVZhbHVlLnRvX3B0cjwgQXJyYXlCRiA+KCkpKi8gKQorCXsKKwkJYm9vbCBpc0ZpbmFsU3ltYm9sID0gdHJ1ZTsKKworCQlDb21waWxhdGlvbkVudmlyb25tZW50IGNvbXBpbEVOVihhQ29udGFpbmVyKTsKKworCQlBcnJheUJGICogYmZBcnJheSA9IGFWYWx1ZS50b19wdHI8IEFycmF5QkYgPigpOworCQlmb3IoIGF2bV9zaXplX3QgaWR4ID0gMCA7IGlkeCA8IGJmQXJyYXktPnNpemUoKSA7ICsraWR4ICkKKwkJeworCQkJY29uc3QgQkYgJiBhcmcgPSBiZkFycmF5LT5hdChpZHgpOworCQkJaWYoIGFyZy5pczwgVmFyaWFibGUgPigpICkKKwkJCXsKKwkJCQlpZiggYXJnLnRvX3B0cjwgVmFyaWFibGUgPigpLT5oYXNWYWx1ZSgpCisJCQkJCSYmIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNGaW5hbFN5bWJvbGljU3ltYm9sKAorCQkJCQkJCWFyZy50b19wdHI8IFZhcmlhYmxlID4oKS0+Z2V0VmFsdWUoKSkgKQorCQkJCXsKKwkJCQkJY29uc3QgQkYgJiBjb21waWxlZFZhciA9CisJCQkJCQkJbUF2bWNvZGVDb21waWxlci5nZXRTeW1ib2xUYWJsZSgpLnNlYXJjaFNlbVN5bWJvbCgKKwkJCQkJCQkJCWNvbXBpbEVOVi5tQ1RYLCBhcmcudG9fcHRyPCBWYXJpYWJsZSA+KCkgKTsKKworCQkJCQlpZiggY29tcGlsZWRWYXIudmFsaWQoKQorCQkJCQkJJiYgY29tcGlsZWRWYXIuaXM8IEluc3RhbmNlT2ZEYXRhID4oKQorCQkJCQkJJiYgY29tcGlsZWRWYXIudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCktPmhhc1ZhbHVlKCkgKQorCQkJCQl7CisJCQkJCQliZkFycmF5LT5zZXQoaWR4LAorCQkJCQkJCWNvbXBpbGVkVmFyLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpLT5nZXRWYWx1ZSgpICk7CisJCQkJCX0KKwkJCQkJZWxzZSBpZiggYVR5cGVTcGVjaWZpZXItPmhhc1R5cGVDb250YWluZXIoKSApCisJCQkJCXsKKwkJCQkJCWJmQXJyYXktPnNldChpZHgsIHByZWNvbXBpbGVEYXRhX2luaXRpYWxWYWx1ZShhQ29udGFpbmVyLAorCQkJCQkJCQlhVHlwZVNwZWNpZmllci0+YXM8IENvbnRhaW5lclR5cGVTcGVjaWZpZXIgPigpCisJCQkJCQkJCQkJLT5nZXRDb250ZW50c1R5cGVTcGVjaWZpZXIoKSwKKwkJCQkJCQkJYXJnLnRvX3B0cjwgVmFyaWFibGUgPigpLT5nZXRWYWx1ZSgpKSApOworCQkJCQl9CisJCQkJCWVsc2UgaWYoIGFUeXBlU3BlY2lmaWVyLT5pc1R5cGVkQ2xhc3MoKSApCisJCQkJCXsKKwkJCQkJCWJmQXJyYXktPnNldChpZHgsIHByZWNvbXBpbGVEYXRhX2luaXRpYWxWYWx1ZShhQ29udGFpbmVyLAorCQkJCQkJCQlhVHlwZVNwZWNpZmllci0+YXM8IENsYXNzVHlwZVNwZWNpZmllciA+KCkKKwkJCQkJCQkJCQktPmdldFN5bWJvbERhdGEoaWR4KS5nZXRUeXBlU3BlY2lmaWVyKCksCisJCQkJCQkJCWFyZy50b19wdHI8IFZhcmlhYmxlID4oKS0+Z2V0VmFsdWUoKSkgKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCWJmQXJyYXktPnNldChpZHgsIGFyZy50b19wdHI8IFZhcmlhYmxlID4oKS0+Z2V0VmFsdWUoKSApOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWlzRmluYWxTeW1ib2wgPSBmYWxzZTsKKwkJCQl9CisJCQl9CisJCQllbHNlIGlmKCBub3QgRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc0ZpbmFsU3ltYm9saWNTeW1ib2woIGFyZyApICkKKwkJCXsKKwkJCQlpc0ZpbmFsU3ltYm9sID0gZmFsc2U7CisJCQl9CisJCX0KKworCQlpZiggaXNGaW5hbFN5bWJvbCApCisJCXsKKwkJCWlmKCAoYVZhbHVlLnRvX3B0cjwgQXJyYXlCRiA+KCktPmdldFR5cGVTcGVjaWZpZXIoKSAhPSBhVHlwZVNwZWNpZmllcikKKwkJCQkmJiBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzVHlwZWQoYVR5cGVTcGVjaWZpZXIsIGFWYWx1ZSkgKQorCQkJeworCQkJCWFWYWx1ZS50b19wdHI8IEFycmF5QkYgPigpLT5zZXRUeXBlU3BlY2lmaWVyKCBhVHlwZVNwZWNpZmllciApOworCQkJfQorCisJCQlyZXR1cm4oIGFWYWx1ZSApOworCQl9CisJfQorCisJZWxzZSBpZiggYVR5cGVTcGVjaWZpZXItPmlzVHlwZWRBcnJheSgpICkKKwl7CisJCWlmKCBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzRmluYWxTeW1ib2xpY0Jhc2ljU3ltYm9sKGFWYWx1ZSkgKQorCQl7CisJCQlyZXR1cm4oIEJGKCBuZXcgQXJyYXlCRihhVHlwZVNwZWNpZmllciwKKwkJCQkJYVR5cGVTcGVjaWZpZXItPnNpemUoKSwgYVZhbHVlKSApICk7CisJCX0KKwl9CisKKwllbHNlIGlmKCBhVHlwZVNwZWNpZmllci0+aXNUeXBlZEVudW0oKSApCisJeworCQlpZiggYVZhbHVlLmlzPCBWYXJpYWJsZSA+KCkgKQorCQl7CisJCQlyZXR1cm4oIGFUeXBlU3BlY2lmaWVyLT5hczwgRW51bVR5cGVTcGVjaWZpZXIgPigpLT5nZXRTeW1ib2xEYXRhKCkuCisJCQkJCWdldEJ5QXN0RWxlbWVudCggYVZhbHVlLnRvX3B0cjwgVmFyaWFibGUgPigpICkgKTsKKwkJfQorCQllbHNlIGlmKCBhVmFsdWUuaXM8IElkZW50aWZpZXIgPigpICkKKwkJeworCQkJcmV0dXJuKCBhVHlwZVNwZWNpZmllci0+YXM8IEVudW1UeXBlU3BlY2lmaWVyID4oKS0+Z2V0U3ltYm9sRGF0YSgpLgorCQkJCQlnZXRCeU5hbWVJRCggYVZhbHVlLnRvX3B0cjwgSWRlbnRpZmllciA+KCktPmdldFZhbHVlKCkgKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuKCBhVHlwZVNwZWNpZmllci0+YXM8IEVudW1UeXBlU3BlY2lmaWVyID4oKS0+CisJCQkJCWdldFN5bWJvbERhdGEoKS5nZXRCeVF1YWxpZmllZE5hbWVJRCggYVZhbHVlLnN0cigpICkgKTsKKwkJfQorCX0KKworCWVsc2UgaWYoIGFWYWx1ZS5pczwgTnVtYmVyID4oKSAgIHx8IGFWYWx1ZS5pczwgQm9vbGVhbiA+KCkgfHwKKwkJCWFWYWx1ZS5pczwgQ2hhcmFjdGVyID4oKSB8fCBhVmFsdWUuaXM8IFN0cmluZyA+KCkgKQorCXsKKwkJcmV0dXJuKCBhVmFsdWUgKTsKKwl9CisKKwlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworfQorCit2b2lkIENvbXBpbGVyT2ZWYXJpYWJsZTo6cHJlY29tcGlsZURhdGFfaW5pdGlhbFZhbHVlKAorCQlBdm1Qcm9ncmFtICogYUNvbnRhaW5lciwgSW5zdGFuY2VPZkRhdGEgKiBhVmFySW5zdGFuY2UpCit7CisJY29uc3QgVmFyaWFibGUgKiBhVmFyID0gYVZhckluc3RhbmNlLT5nZXRBc3RWYXJpYWJsZSgpOworCisJQkYgYVZhbHVlID0gYVZhci0+Z2V0VmFsdWUoKTsKKwlpZiggYVZhbHVlLnZhbGlkKCkgKQorCXsKK0FWTV9JRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgUVVBTElGSUVEX05BTUVfSUQgKQorCUFWTV9PU19UUkFDRSA8PCAidmFyaWFibGU6cHJlY29tcGlsZSN2YWx1ZT4gIiA8PCBzdHJfaGVhZGVyKCBhVmFyICkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBRVUFMSUZJRURfTkFNRV9JRCApCisKKwkJYVZhckluc3RhbmNlLT5zZXRWYWx1ZSggcHJlY29tcGlsZURhdGFfaW5pdGlhbFZhbHVlKGFDb250YWluZXIsCisJCQkJYVZhckluc3RhbmNlLT5nZXRUeXBlU3BlY2lmaWVyKCksIGFWYWx1ZSkgKTsKKworQVZNX0lGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBRVUFMSUZJRURfTkFNRV9JRCApCisJQVZNX09TX1RSQUNFIDw8ICJpbnN0YW5jZTo+ICIgPDwgc3RyX2hlYWRlciggYVZhckluc3RhbmNlICkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBRVUFMSUZJRURfTkFNRV9JRCApCisJfQorfQorCisKKwordm9pZCBDb21waWxlck9mVmFyaWFibGU6OmNvbXBpbGVEYXRhX2luaXRpYWxWYWx1ZSgKKwkJQXZtUHJvZ3JhbSAqIGFDb250YWluZXIsIEluc3RhbmNlT2ZEYXRhICogYVZhckluc3RhbmNlKQoreworCWNvbnN0IFZhcmlhYmxlICogYVZhciA9IGFWYXJJbnN0YW5jZS0+Z2V0QXN0VmFyaWFibGUoKTsKKworQVZNX0lGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBRVUFMSUZJRURfTkFNRV9JRCApCisJQVZNX09TX1RSQUNFIDw8ICJ2YXJpYWJsZTpjb21waWxlI3ZhbHVlPiAiIDw8IHN0cl9oZWFkZXIoIGFWYXIgKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRzIoIENPTVBJTElORyAsIFFVQUxJRklFRF9OQU1FX0lEICkKKworCWlmKCBub3QgYVZhckluc3RhbmNlLT5oYXNWYWx1ZSgpICkKKwl7CisJCWNvbnN0IEJGICYgYVZhbHVlID0gYVZhci0+Z2V0VmFsdWUoKTsKKwkJaWYoIGFWYWx1ZS52YWxpZCgpICkKKwkJeworCQkJQ29tcGlsYXRpb25FbnZpcm9ubWVudCBjb21waWxFTlYoYUNvbnRhaW5lcik7CisJCQljb21waWxFTlYubUNUWC0+bVR5cGUgPSBhVmFySW5zdGFuY2UtPmdldFR5cGVTcGVjaWZpZXIoKTsKKworCQkJYVZhckluc3RhbmNlLT5zZXRWYWx1ZSgJbUF2bWNvZGVDb21waWxlci4KKwkJCQkJZGVjb2RlX2NvbXBpbGVFeHByZXNzaW9uKGNvbXBpbEVOVi5tQ1RYLCBhVmFsdWUpICk7CisKKwkJCWlmKCBhVmFySW5zdGFuY2UtPmdldFZhbHVlKCkuaXM8IEFycmF5QkYgPigpICkKKwkJCXsKKwkJCQlBcnJheUJGICogYmZBcnJheSA9IGFWYXJJbnN0YW5jZS0+Z2V0VmFsdWUoKS50b19wdHI8IEFycmF5QkYgPigpOworCQkJCWZvciggYXZtX3NpemVfdCBpZHggPSAwIDsgaWR4IDwgYmZBcnJheS0+c2l6ZSgpIDsgKytpZHggKQorCQkJCXsKKwkJCQkJY29uc3QgQkYgJiBhcmcgPSBiZkFycmF5LT5hdChpZHgpOworCQkJCQlpZiggYXJnLmlzPCBJbnN0YW5jZU9mRGF0YSA+KCkgJiYKKwkJCQkJCQlhcmcudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCktPmhhc1ZhbHVlKCkgJiYKKwkJCQkJCQlFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzRmluYWxTeW1ib2xpY1N5bWJvbCgKKwkJCQkJCQkJYXJnLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpLT5nZXRWYWx1ZSgpKSApCisJCQkJCXsKKwkJCQkJCWJmQXJyYXktPnNldChpZHgsCisJCQkJCQkJYXJnLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpLT5nZXRWYWx1ZSgpICk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKK0FWTV9JRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgUVVBTElGSUVEX05BTUVfSUQgKQorCUFWTV9PU19UUkFDRSA8PCAiaW5zdGFuY2U6PiAiIDw8IHN0cl9oZWFkZXIoIGFWYXJJbnN0YW5jZSApIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgUVVBTElGSUVEX05BTUVfSUQgKQorfQorCisKKy8vIFRPRE8gVmVyaWZpZXIgbGEgZ8OpbsOpcmFsaXNhdGlvbiwgaG9ycyBkZXMgdHlwZXMgw6ludW3DqXLDqXMhISEKK3ZvaWQgQ29tcGlsZXJPZlZhcmlhYmxlOjpjb21waWxlVHlwZUNvbnN0cmFpbnQoCisJCUF2bVByb2dyYW0gKiBhQ29udGFpbmVyLCBJbnN0YW5jZU9mRGF0YSAqIGFWYXJJbnN0YW5jZSkKK3sKKwlBVk1fT1NfQVNTRVJUX1dBUk5JTkdfQUxFUlQoIGFWYXJJbnN0YW5jZS0+Z2V0TW9kaWZpZXIoKS5oYXNGZWF0dXJlVW5zYWZlKCkKKwkJCXx8IGFDb250YWluZXItPmdldE1vZGlmaWVyKCkuaGFzRmVhdHVyZVVuc2FmZSgpICkKKwkJCTw8ICJVbmV4cGVjdGVkIGEgPDwgbm9uLXVuc2FmZSA+PiBJbnN0YW5jZU9mRGF0YSAhISEiCisJCQk8PCBTRU5EX0FMRVJUOworCisJQmFzZVR5cGVTcGVjaWZpZXIgKiBhVHlwZVNwZWNpZmllciA9IGFWYXJJbnN0YW5jZS0+Z2V0VHlwZVNwZWNpZmllcigpOworCWlmKCBhVHlwZVNwZWNpZmllci0+Y291bGRHZW5lcmF0ZUNvbnN0cmFpbnQoKSApCisJeworCQlBdm1Qcm9ncmFtICogb25Xcml0ZVByb2cgPSBuZXcgQXZtUHJvZ3JhbSgKKwkJCQlTcGVjaWZpZXI6OlNDT1BFX1JPVVRJTkVfS0lORCwKKwkJCQlhQ29udGFpbmVyLCBhVmFySW5zdGFuY2UtPmdldEFzdEVsZW1lbnQoKSwgMSk7CisJCW9uV3JpdGVQcm9nLT51cGRhdGVVZmlkKCAiI29uV3JpdGVUeXBlQ29uc3RyYWludCIgKTsKKwkJb25Xcml0ZVByb2ctPnNldFBhcmFtT2Zmc2V0Q291bnQoMCwgMSk7CisKKwkJQkYgbmV3VmFsdWUoIG5ldyBJbnN0YW5jZU9mRGF0YSgKKwkJCQlJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfU1RBTkRBUkRfTkFUVVJFLCBvbldyaXRlUHJvZywKKwkJCQlhVmFySW5zdGFuY2UtPmdldEFzdEVsZW1lbnQoKSwgYVR5cGVTcGVjaWZpZXIsICJuZXdWYWx1ZSIsICAwKSApOworCQlvbldyaXRlUHJvZy0+c2V0RGF0YSgwLCBuZXdWYWx1ZSk7CisJCW9uV3JpdGVQcm9nLT51cGRhdGVEYXRhVGFibGUoKTsKKworCQlCRkNvZGUgY29kZShPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0dVQVJELAorCQkJCWFUeXBlU3BlY2lmaWVyLT5nZW5Db25zdHJhaW50KG5ld1ZhbHVlKSApOworCisJCW9uV3JpdGVQcm9nLT5zZXRDb2RlKGNvZGUpOworCisJCWFWYXJJbnN0YW5jZS0+c2V0T25Xcml0ZVJvdXRpbmUoIG9uV3JpdGVQcm9nICk7CisKKwkJYUNvbnRhaW5lci0+Z2V0RXhlY3V0YWJsZSgpLT5zYXZlQW5vbnltb3VzSW5uZXJSb3V0aW5lKCBvbldyaXRlUHJvZyApOworCX0KK30KKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL2NvbXBpbGVyL0NvbXBpbGVyT2ZWYXJpYWJsZS5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9jb21waWxlci9Db21waWxlck9mVmFyaWFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzlmN2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9jb21waWxlci9Db21waWxlck9mVmFyaWFibGUuaApAQCAtMCwwICsxLDExMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDI5IG1hcnMgMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEJVSUxERVJfQ09NUElMRVJfQ09NUElMRVJPRlZBUklBQkxFX0hfCisjZGVmaW5lIEJVSUxERVJfQ09NUElMRVJfQ09NUElMRVJPRlZBUklBQkxFX0hfCisKKyNpbmNsdWRlIDxidWlsZGVyL2NvbXBpbGVyL0Jhc2VDb21waWxlci5oPgorCisjaW5jbHVkZSA8Y29sbGVjdGlvbi9WZWN0b3IuaD4KKworI2luY2x1ZGUgPGZtbC90eXBlL1R5cGVTcGVjaWZpZXIuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworY2xhc3MgQXZtUHJvZ3JhbTsKK2NsYXNzIEV4ZWN1dGFibGVGb3JtOworCitjbGFzcyBJbnN0YW5jZU9mRGF0YTsKKworY2xhc3MgVmFyaWFibGU7CisKK2NsYXNzIENvbXBpbGVyOworCisKKworY2xhc3MgQ29tcGlsZXJPZlZhcmlhYmxlICA6ICBwdWJsaWMgQmFzZUNvbXBpbGVyCit7CisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlDb21waWxlck9mVmFyaWFibGUoQ29tcGlsZXIgJiBhQ29tcGlsZXIpOworCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+Q29tcGlsZXJPZlZhcmlhYmxlKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFBSRUNPTVBJTEFUSU9OCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCisJdm9pZCBhZGRQcmVjb21waWxlRGF0YShBdm1Qcm9ncmFtICogYUNvbnRhaW5lciwgU3ltYm9sICYgYVZhcmlhYmxlLAorCQkJVGFibGVPZkluc3RhbmNlT2ZEYXRhICYgdGFibGVPZlZhcmlhYmxlLAorCQkJYm9vbCBjb2xsZWN0VmFyRW5hYmxlZCA9IGZhbHNlKTsKKworCXN0YXRpYyBhdm1fc2l6ZV90IG5leHRPZmZzZXQoVGFibGVPZkluc3RhbmNlT2ZEYXRhICYgdGFibGVPZlZhcmlhYmxlKTsKKworCisJdm9pZCBwcmVjb21waWxlVHlwZVNwZWNpZmllcihBdm1Qcm9ncmFtICogYUNvbnRhaW5lciwgY29uc3QgQkYgJiBhRGF0YVR5cGUpOworCisJdm9pZCBwcmVjb21waWxlRGF0YShBdm1Qcm9ncmFtICogYUNvbnRhaW5lciwKKwkJCVZhcmlhYmxlICogYVZhcmlhYmxlLCBUYWJsZU9mSW5zdGFuY2VPZkRhdGEgJiB0YWJsZU9mVmFyaWFibGUpOworCisJQkYgcHJlY29tcGlsZURhdGFfaW5pdGlhbFZhbHVlKEF2bVByb2dyYW0gKiBhQ29udGFpbmVyLAorCQkJQmFzZVR5cGVTcGVjaWZpZXIgKiBhVHlwZVNwZWNpZmllciwgY29uc3QgQkYgJiBhVmFsdWUpOworCisJdm9pZCBwcmVjb21waWxlRGF0YV9pbml0aWFsVmFsdWUoQXZtUHJvZ3JhbSAqIGFDb250YWluZXIsCisJCQlJbnN0YW5jZU9mRGF0YSAqIGFWYXJJbnN0YW5jZSk7CisKKwkvKioKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogQ09NUElMQVRJT04KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJdm9pZCBjb21waWxlRGF0YShFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZSk7CisKKwl2b2lkIGNvbXBpbGVEYXRhT25DcmVhdGUoRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGUsCisJCQlUYWJsZU9mSW5zdGFuY2VPZkRhdGE6OmNvbnN0X3Jhd19pdGVyYXRvciBpdERhdGEsCisJCQlCRkNvZGUgJiBvbkluaXRpYWxpemUpOworCisKKworCXZvaWQgY29tcGlsZURhdGEoQXZtUHJvZ3JhbSAqIGFQcm9ncmFtKTsKKworCXZvaWQgY29tcGlsZUNvbnN0RGF0YShBdm1Qcm9ncmFtICogYUNvbnRhaW5lciwgSW5zdGFuY2VPZkRhdGEgKiBhVmFySW5zdGFuY2UpOworCXZvaWQgY29tcGlsZURhdGEoQXZtUHJvZ3JhbSAqIGFDb250YWluZXIsIEluc3RhbmNlT2ZEYXRhICogYVZhckluc3RhbmNlKTsKKworCXZvaWQgY29tcGlsZURhdGFfaW5pdGlhbFZhbHVlKAorCQkJQXZtUHJvZ3JhbSAqIGFDb250YWluZXIsIEluc3RhbmNlT2ZEYXRhICogYVZhckluc3RhbmNlKTsKKworCXZvaWQgY29tcGlsZVR5cGVDb25zdHJhaW50KAorCQkJQXZtUHJvZ3JhbSAqIGFDb250YWluZXIsIEluc3RhbmNlT2ZEYXRhICogYVZhckluc3RhbmNlKTsKKworfTsKKworfQorCisjZW5kaWYgLyogQlVJTERFUl9DT01QSUxFUl9DT01QSUxFUk9GVkFSSUFCTEVfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvY29tcGlsZXIvUkVBRE1FLm1kIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9jb21waWxlci9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc1NTBkZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvY29tcGlsZXIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTAgQEAKKyMgRUZNLVNZTUJFWCA6IENvbXBpbGVyCisKKyMjIFNvdXJjZSBjb2RlIHN0cnVjdHVyZQorCisjIyMgSW50ZXJmYWNlcworCisjIyMgQ2xhc3NlcworCisjIyMgRmFjdG9yaWVzCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvY29tcGlsZXIvU3ltYm9sUHJlZGljYXRlLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL2NvbXBpbGVyL1N5bWJvbFByZWRpY2F0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3M2JhODMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL2NvbXBpbGVyL1N5bWJvbFByZWRpY2F0ZS5oCkBAIC0wLDAgKzEsMTk1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTUgc2VwdC4gMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEJVSUxERVJfQ09NUElMRVJfU1lNQk9MUFJFRElDQVRFX0hfCisjZGVmaW5lIEJVSUxERVJfQ09NUElMRVJfU1lNQk9MUFJFRElDQVRFX0hfCisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9CYXNlQ29tcGlsZWRGb3JtLmg+CisKKyNpbmNsdWRlIDxmbWwvc3ltYm9sL1N5bWJvbC5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjbGFzcyBTeW1ib2xQcmVkaWNhdGUKK3sKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUiAvIERFU1RSVUNUT1IKKwkgKi8KKwlTeW1ib2xQcmVkaWNhdGUoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJdmlydHVhbCB+U3ltYm9sUHJlZGljYXRlKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIE9QRVJBVE9SIEFQSQorCSAqLworCXZpcnR1YWwgYm9vbCBvcGVyYXRvcigpIChjb25zdCBCYXNlQ29tcGlsZWRGb3JtICogYVN5bWJvbCkgY29uc3QgPSAwOworCisJdmlydHVhbCBib29sIG9wZXJhdG9yKCkgKGNvbnN0IFN5bWJvbCAmIGFTeW1ib2wpIGNvbnN0ID0gMDsKKworfTsKKworCisKKworY2xhc3MgU3ltYm9sUHJlZGljYXRlQnlRdWFsaWZpZWROYW1lSUQgIDogIHB1YmxpYyBTeW1ib2xQcmVkaWNhdGUKK3sKKworcHVibGljOgorCS8qKgorCSAqIEFUVFJJQlVURQorCSAqLworCXN0ZDo6c3RyaW5nIG1RdWFsaWZpZWROYW1lSUQ7CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUiAvIERFU1RSVUNUT1IKKwkgKgorCSAqLworCVN5bWJvbFByZWRpY2F0ZUJ5UXVhbGlmaWVkTmFtZUlEKGNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkKKwk6IFN5bWJvbFByZWRpY2F0ZSggKSwKKwltUXVhbGlmaWVkTmFtZUlEKCBhUXVhbGlmaWVkTmFtZUlEICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCXZpcnR1YWwgflN5bWJvbFByZWRpY2F0ZUJ5UXVhbGlmaWVkTmFtZUlEKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIE9QRVJBVE9SCisJICovCisJaW5saW5lIHZpcnR1YWwgYm9vbCBvcGVyYXRvcigpIChjb25zdCBCYXNlQ29tcGlsZWRGb3JtICogYVN5bWJvbCkgY29uc3QKKwl7CisJCXJldHVybiggYVN5bWJvbC0+ZnFuRW5kc1dpdGgobVF1YWxpZmllZE5hbWVJRCkgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBib29sIG9wZXJhdG9yKCkgKGNvbnN0IFN5bWJvbCAmIGFTeW1ib2wpIGNvbnN0CisJeworCQlyZXR1cm4oIGFTeW1ib2wuZnFuRW5kc1dpdGgobVF1YWxpZmllZE5hbWVJRCkgKTsKKwl9CisKK307CisKKworCitjbGFzcyBTeW1ib2xQcmVkaWNhdGVCeU5hbWVJRCAgOiAgcHVibGljIFN5bWJvbFByZWRpY2F0ZUJ5UXVhbGlmaWVkTmFtZUlECit7CitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKi8KKwlTeW1ib2xQcmVkaWNhdGVCeU5hbWVJRChjb25zdCBzdGQ6OnN0cmluZyAmIGlkKQorCTogU3ltYm9sUHJlZGljYXRlQnlRdWFsaWZpZWROYW1lSUQoIGlkICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIE9QRVJBVE9SCisJICovCisJaW5saW5lIHZpcnR1YWwgYm9vbCBvcGVyYXRvcigpIChjb25zdCBCYXNlQ29tcGlsZWRGb3JtICogYVN5bWJvbCkgY29uc3QKKwl7CisJCXJldHVybiggYVN5bWJvbC0+Z2V0TmFtZUlEKCkgPT0gbVF1YWxpZmllZE5hbWVJRCApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGJvb2wgb3BlcmF0b3IoKSAoY29uc3QgU3ltYm9sICYgYVN5bWJvbCkgY29uc3QKKwl7CisJCXJldHVybiggYVN5bWJvbC5nZXROYW1lSUQoKSA9PSBtUXVhbGlmaWVkTmFtZUlEICk7CisJfQorCit9OworCisKK2NsYXNzIFN5bWJvbFByZWRpY2F0ZUJ5Q29tcGlsZWRGUU5hbWVJRCAgOgorCQlwdWJsaWMgU3ltYm9sUHJlZGljYXRlQnlRdWFsaWZpZWROYW1lSUQKK3sKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqLworCVN5bWJvbFByZWRpY2F0ZUJ5Q29tcGlsZWRGUU5hbWVJRCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEKQorCTogU3ltYm9sUHJlZGljYXRlQnlRdWFsaWZpZWROYW1lSUQoIGFGdWxseVF1YWxpZmllZE5hbWVJRCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBPUEVSQVRPUgorCSAqLworCWlubGluZSB2aXJ0dWFsIGJvb2wgb3BlcmF0b3IoKSAoY29uc3QgQmFzZUNvbXBpbGVkRm9ybSAqIGFTeW1ib2wpIGNvbnN0CisJeworCQlyZXR1cm4oIGFTeW1ib2wtPmdldEFzdEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPT0gbVF1YWxpZmllZE5hbWVJRCApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGJvb2wgb3BlcmF0b3IoKSAoY29uc3QgU3ltYm9sICYgYVN5bWJvbCkgY29uc3QKKwl7CisJCXJldHVybiggYVN5bWJvbC5nZXRBc3RGdWxseVF1YWxpZmllZE5hbWVJRCgpID09IG1RdWFsaWZpZWROYW1lSUQgKTsKKwl9CisKK307CisKKworCitjbGFzcyBTeW1ib2xQcmVkaWNhdGVCeUNvbXBpbGVkRWxlbWVudCAgOiAgcHVibGljIFN5bWJvbFByZWRpY2F0ZQoreworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQVRUUklCVVRFCisJICovCisJY29uc3QgT2JqZWN0RWxlbWVudCAqIG1FbGVtZW50OworCitwdWJsaWM6CisJU3ltYm9sUHJlZGljYXRlQnlDb21waWxlZEVsZW1lbnQoY29uc3QgT2JqZWN0RWxlbWVudCAqIGFuRWxlbWVudCkKKwk6IFN5bWJvbFByZWRpY2F0ZSggKSwKKwkgIG1FbGVtZW50KGFuRWxlbWVudCkKKwl7CisJCS8vISEgTk9USElORworCX0KKwl2aXJ0dWFsIH5TeW1ib2xQcmVkaWNhdGVCeUNvbXBpbGVkRWxlbWVudCgpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBPUEVSQVRPUgorCSAqLworCWlubGluZSB2aXJ0dWFsIGJvb2wgb3BlcmF0b3IoKSAoY29uc3QgQmFzZUNvbXBpbGVkRm9ybSAqIGFTeW1ib2wpIGNvbnN0CisJeworCQlyZXR1cm4oIGFTeW1ib2wtPmlzQXN0RWxlbWVudCggbUVsZW1lbnQgKSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGJvb2wgb3BlcmF0b3IoKSAoY29uc3QgU3ltYm9sICYgYVN5bWJvbCkgY29uc3QKKwl7CisJCXJldHVybiggYVN5bWJvbC5pc0FzdEVsZW1lbnQoIG1FbGVtZW50ICkgKTsKKwl9CisKK307CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisjZW5kaWYgLyogQlVJTERFUl9DT01QSUxFUl9TWU1CT0xQUkVESUNBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvY29tcGlsZXIvU3ltYm9sVGFibGUuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9jb21waWxlci9TeW1ib2xUYWJsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBkNjEwZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvY29tcGlsZXIvU3ltYm9sVGFibGUuY3BwCkBAIC0wLDAgKzEsMjkwOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8YnVpbGRlci9jb21waWxlci9TeW1ib2xUYWJsZS5oPgorCisjaW5jbHVkZSA8YnVpbGRlci9wcmltaXRpdmUvQ29tcGlsYXRpb25FbnZpcm9ubWVudC5oPgorCisjaW5jbHVkZSA8Zm1sL2NvbW1vbi9PYmplY3RFbGVtZW50Lmg+CisjaW5jbHVkZSA8Zm1sL2NvbW1vbi9Qcm9wZXJ0eUVsZW1lbnQuaD4KKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0F2bVByb2dyYW0uaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9Bdm1UcmFuc2l0aW9uLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvQmFzZUF2bVByb2dyYW0uaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9CYXNlSW5zdGFuY2VGb3JtLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZUZvcm0uaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlTGliLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZVN5c3RlbS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZCdWZmZXIuaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mUG9ydC5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL1JvdXRpbmdEYXRhLmg+CisKKyNpbmNsdWRlIDxmbWwvYnVpbHRpbi9RdWFsaWZpZWRJZGVudGlmaWVyLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9Bdm1Db2RlLmg+CisKKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvQ2hhbm5lbC5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Db25uZWN0b3IuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvTWFjaGluZS5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Qb3J0Lmg+CisKKyNpbmNsdWRlIDxmbWwvc3ltYm9sL1N5bWJvbC5oPgorCisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1VuaUZvcm1JZGVudGlmaWVyLmg+CisKKyNpbmNsdWRlIDxzZXcvQ29uZmlndXJhdGlvbi5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTRUFSQ0gKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworCS8qKgorICogU0VBUkNICisgKiBmb3IgVHlwZQorICovCitjb25zdCBUeXBlU3BlY2lmaWVyICYgU3ltYm9sVGFibGU6OnNlYXJjaFR5cGVTcGVjaWZpZXIoCisJCUV4ZWN1dGFibGVTeXN0ZW0gJiBhbkV4ZWN1dGFibGVTeXN0ZW0sCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IE9iamVjdEVsZW1lbnQgKiBhc3RFbGVtZW50KQoreworCUJhc2VBdm1Qcm9ncmFtICogYVByb2dyYW0gPSBhQ1RYLT5tQ29tcGlsZUN0eDsKKwlmb3IoIDsgYVByb2dyYW0gIT0gTlVMTCA7IGFQcm9ncmFtID0gYVByb2dyYW0tPmdldENvbnRhaW5lcigpICkKKwl7CisJCWlmKCBhUHJvZ3JhbS0+aXM8IEF2bVByb2dyYW0gPigpICkKKwkJeworCQkJY29uc3QgVHlwZVNwZWNpZmllciAmIGZvdW5kVHlwZSA9CisJCQkJCWFQcm9ncmFtLT50bzwgQXZtUHJvZ3JhbSA+KCktPmdldFR5cGVTcGVjaWZpZXIoYXN0RWxlbWVudCk7CisJCQlpZiggZm91bmRUeXBlLnZhbGlkKCkgKQorCQkJeworCQkJCXJldHVybiggZm91bmRUeXBlICk7CisJCQl9CisJCX0KKwl9CisKKwlUYWJsZU9mRXhlY3V0YWJsZUZvcm06OmNvbnN0X3Jhd19pdGVyYXRvciBpdEV4ZWMgPQorCQkJYW5FeGVjdXRhYmxlU3lzdGVtLmdldEV4ZWN1dGFibGVzKCkuYmVnaW4oKTsKKwlUYWJsZU9mRXhlY3V0YWJsZUZvcm06OmNvbnN0X3Jhd19pdGVyYXRvciBpdEVuZCA9CisJCQlhbkV4ZWN1dGFibGVTeXN0ZW0uZ2V0RXhlY3V0YWJsZXMoKS5lbmQoKTsKKwlmb3IoICA7IGl0RXhlYyAhPSBpdEVuZCA7ICsraXRFeGVjICkKKwl7CisJCWNvbnN0IFR5cGVTcGVjaWZpZXIgJiBmb3VuZFR5cGUgPQorCQkJCShpdEV4ZWMpLT5nZXRUeXBlU3BlY2lmaWVyKGFzdEVsZW1lbnQpOworCQlpZiggZm91bmRUeXBlLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kVHlwZSApOworCQl9CisJfQorCisJcmV0dXJuKCBUeXBlU3BlY2lmaWVyOjpSRUZfTlVMTCApOworfQorCisKK2NvbnN0IFR5cGVTcGVjaWZpZXIgJiBTeW1ib2xUYWJsZTo6c2VhcmNoVHlwZVNwZWNpZmllcigKKwkJRXhlY3V0YWJsZVN5c3RlbSAmIGFuRXhlY3V0YWJsZVN5c3RlbSwgQ09NUElMRV9DT05URVhUICogYUNUWCwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQpCit7CisJQmFzZUF2bVByb2dyYW0gKiBhUHJvZ3JhbSA9IGFDVFgtPm1Db21waWxlQ3R4OworCWZvciggOyBhUHJvZ3JhbSAhPSBOVUxMIDsgYVByb2dyYW0gPSBhUHJvZ3JhbS0+Z2V0Q29udGFpbmVyKCkgKQorCXsKKwkJaWYoIGFQcm9ncmFtLT5pczwgQXZtUHJvZ3JhbSA+KCkgKQorCQl7CisJCQljb25zdCBUeXBlU3BlY2lmaWVyICYgZm91bmRUeXBlID0gYVByb2dyYW0tPnRvPCBBdm1Qcm9ncmFtID4oKS0+CisJCQkJCWdldFR5cGVTcGVjaWZpZXIoIGFGdWxseVF1YWxpZmllZE5hbWVJRCApOworCQkJaWYoIGZvdW5kVHlwZS52YWxpZCgpICkKKwkJCXsKKwkJCQlyZXR1cm4oIGZvdW5kVHlwZSApOworCQkJfQorCQl9CisJfQorCisJVGFibGVPZkV4ZWN1dGFibGVGb3JtOjpjb25zdF9yYXdfaXRlcmF0b3IgaXRFeGVjID0KKwkJCWFuRXhlY3V0YWJsZVN5c3RlbS5nZXRFeGVjdXRhYmxlcygpLmJlZ2luKCk7CisJVGFibGVPZkV4ZWN1dGFibGVGb3JtOjpjb25zdF9yYXdfaXRlcmF0b3IgaXRFbmQgPQorCQkJYW5FeGVjdXRhYmxlU3lzdGVtLmdldEV4ZWN1dGFibGVzKCkuZW5kKCk7CisJZm9yKCAgOyBpdEV4ZWMgIT0gaXRFbmQgOyArK2l0RXhlYyApCisJeworCQljb25zdCBUeXBlU3BlY2lmaWVyICYgZm91bmRUeXBlID0KKwkJCQkoaXRFeGVjKS0+Z2V0VHlwZVNwZWNpZmllciggYUZ1bGx5UXVhbGlmaWVkTmFtZUlEICk7CisJCWlmKCBmb3VuZFR5cGUudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRUeXBlICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIFR5cGVTcGVjaWZpZXI6OlJFRl9OVUxMICk7Cit9CisKKworLyoKKyAqIFNFQVJDSAorICogZm9yIERhdGEgSW5zdGFuY2UKKyAqLworY29uc3QgQkYgJiBTeW1ib2xUYWJsZTo6c2VhcmNoRGF0YUluc3RhbmNlKAorCQlCYXNlQXZtUHJvZ3JhbSAqIHRtcFByb2dyYW0sIGNvbnN0IE9iamVjdEVsZW1lbnQgKiBhc3RFbGVtZW50KSBjb25zdAoreworCWZvciggOyB0bXBQcm9ncmFtICE9IE5VTEwgOyB0bXBQcm9ncmFtID0gdG1wUHJvZ3JhbS0+Z2V0Q29udGFpbmVyKCkgKQorCXsKKwkJeworCQkJY29uc3QgQkYgJiBmb3VuZEluc3RhbmNlID0KKwkJCQkJdG1wUHJvZ3JhbS0+Z2V0QWxsRGF0YSgpLmdldEJ5QXN0RWxlbWVudChhc3RFbGVtZW50KTsKKwkJCWlmKCBmb3VuZEluc3RhbmNlLnZhbGlkKCkgKQorCQkJeworCQkJCXJldHVybiggZm91bmRJbnN0YW5jZSApOworCQkJfQorCQl9CisKKwkJeworCQkJY29uc3QgQkYgJiBmb3VuZEluc3RhbmNlID0KKwkJCQkJdG1wUHJvZ3JhbS0+Z2V0RGF0YUFsaWFzKCkuZ2V0QnlBc3RFbGVtZW50KGFzdEVsZW1lbnQpOworCQkJaWYoIGZvdW5kSW5zdGFuY2UudmFsaWQoKSApCisJCQl7CisJCQkJcmV0dXJuKCBmb3VuZEluc3RhbmNlICk7CisJCQl9CisJCX0KKworCQlpZiggdG1wUHJvZ3JhbS0+aXM8IEF2bVByb2dyYW0gPigpICkKKwkJeworCQkJeworCQkJCWNvbnN0IEJGICYgZm91bmRJbnN0YW5jZSA9IHRtcFByb2dyYW0tPnRvPCBBdm1Qcm9ncmFtID4oKS0+CisJCQkJCQlnZXRDb25zdERhdGEoKS5nZXRCeUFzdEVsZW1lbnQoYXN0RWxlbWVudCk7CisJCQkJaWYoIGZvdW5kSW5zdGFuY2UudmFsaWQoKSApCisJCQkJeworCQkJCQlyZXR1cm4oIGZvdW5kSW5zdGFuY2UgKTsKKwkJCQl9CisJCQl9CisKKwkJCXsKKwkJCQljb25zdCBCRiAmIGZvdW5kSW5zdGFuY2UgPSB0bXBQcm9ncmFtLT50bzwgQXZtUHJvZ3JhbSA+KCktPgorCQkJCQkJZ2V0U3ltYm9sRGF0YUJ5QXN0RWxlbWVudChhc3RFbGVtZW50KTsKKwkJCQlpZiggZm91bmRJbnN0YW5jZS52YWxpZCgpICkKKwkJCQl7CisJCQkJCXJldHVybiggZm91bmRJbnN0YW5jZSApOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXJldHVybiggQkY6OlJFRl9OVUxMICk7Cit9CisKK2NvbnN0IEJGICYgU3ltYm9sVGFibGU6OnNlYXJjaERhdGFJbnN0YW5jZSgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgT2JqZWN0RWxlbWVudCAqIG9iakVsZW1lbnQpCit7CisJLy8gUkVTRVQgRVJST1IKKwlyZXNldEVycm9yKCk7CisKKwljb25zdCBCRiAmIGZvdW5kSW5zdGFuY2UgPQorCQkJc2VhcmNoRGF0YUluc3RhbmNlKGFDVFgtPm1Db21waWxlQ3R4LCBvYmpFbGVtZW50KTsKKwlpZiggZm91bmRJbnN0YW5jZS52YWxpZCgpICkKKwl7CisJCXJldHVybiggZm91bmRJbnN0YW5jZSApOworCX0KKwllbHNlIGlmKCBhQ1RYLT5pc1NwZWNpZmljUnVudGltZUN0eCgpICkKKwl7CisJCWNvbnN0IEJGICYgZm91bmRJbnN0YW5jZSA9CisJCQkJc2VhcmNoRGF0YUluc3RhbmNlKGFDVFgtPm1SdW50aW1lQ3R4LCBvYmpFbGVtZW50KTsKKwkJaWYoIGZvdW5kSW5zdGFuY2UudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRJbnN0YW5jZSApOworCQl9CisJfQorCisJcmV0dXJuKCBzZWFyY2hEYXRhSW5zdGFuY2VBbGlhcyhhQ1RYLCBvYmpFbGVtZW50KSApOworfQorCisKKworY29uc3QgQkYgJiBTeW1ib2xUYWJsZTo6c2VhcmNoRGF0YUluc3RhbmNlKEJhc2VBdm1Qcm9ncmFtICogdG1wUHJvZ3JhbSwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQpIGNvbnN0Cit7CisJZm9yKCA7IHRtcFByb2dyYW0gIT0gTlVMTCA7IHRtcFByb2dyYW0gPSB0bXBQcm9ncmFtLT5nZXRDb250YWluZXIoKSApCisJeworCQljb25zdCBCRiAmIGZvdW5kSW5zdGFuY2UgPSB0bXBQcm9ncmFtLT5nZXRBbGxEYXRhKCkuCisJCQkJZ2V0QnlGUU5hbWVJRCggYUZ1bGx5UXVhbGlmaWVkTmFtZUlEICk7CisJCWlmKCBmb3VuZEluc3RhbmNlLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kSW5zdGFuY2UgKTsKKwkJfQorCisJCWlmKCB0bXBQcm9ncmFtLT5pczwgQXZtUHJvZ3JhbSA+KCkgKQorCQl7CisJCQl7CisJCQkJY29uc3QgQkYgJiBmb3VuZEluc3RhbmNlID0gdG1wUHJvZ3JhbS0+dG88IEF2bVByb2dyYW0gPigpLT4KKwkJCQkJCWdldENvbnN0RGF0YSgpLmdldEJ5RlFOYW1lSUQoIGFGdWxseVF1YWxpZmllZE5hbWVJRCApOworCQkJCWlmKCBmb3VuZEluc3RhbmNlLnZhbGlkKCkgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCBmb3VuZEluc3RhbmNlICk7CisJCQkJfQorCQkJfQorCisJCQl7CisJCQkJY29uc3QgQkYgJiBmb3VuZEluc3RhbmNlID0gdG1wUHJvZ3JhbS0+dG88IEF2bVByb2dyYW0gPigpLT4KKwkJCQkJCWdldFN5bWJvbERhdGEoIGFGdWxseVF1YWxpZmllZE5hbWVJRCApOworCQkJCWlmKCBmb3VuZEluc3RhbmNlLnZhbGlkKCkgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCBmb3VuZEluc3RhbmNlICk7CisJCQkJfQorCQkJfQorCisJCQlpZiggdG1wUHJvZ3JhbS0+aXM8IEV4ZWN1dGFibGVGb3JtID4oKSApCisJCQl7CisJCQkJY29uc3QgQkYgJiBmb3VuZEluc3RhbmNlID0gdG1wUHJvZ3JhbS0+dG88IEV4ZWN1dGFibGVGb3JtID4oKS0+CisJCQkJCQlnZXREYXRhQWxpYXMoKS5nZXRCeUZRTmFtZUlEKCBhRnVsbHlRdWFsaWZpZWROYW1lSUQgKTsKKwkJCQlpZiggZm91bmRJbnN0YW5jZS52YWxpZCgpICkKKwkJCQl7CisJCQkJCXJldHVybiggZm91bmRJbnN0YW5jZSApOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXJldHVybiggQkY6OlJFRl9OVUxMICk7Cit9CisKK2NvbnN0IEJGICYgU3ltYm9sVGFibGU6OnNlYXJjaERhdGFJbnN0YW5jZShDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCkKK3sKKwkvLyBSRVNFVCBFUlJPUgorCXJlc2V0RXJyb3IoKTsKKworCWNvbnN0IEJGICYgZm91bmRJbnN0YW5jZSA9CisJCQlzZWFyY2hEYXRhSW5zdGFuY2UoYUNUWC0+bUNvbXBpbGVDdHgsIGFGdWxseVF1YWxpZmllZE5hbWVJRCk7CisJaWYoIGZvdW5kSW5zdGFuY2UudmFsaWQoKSApCisJeworCQlyZXR1cm4oIGZvdW5kSW5zdGFuY2UgKTsKKwl9CisJZWxzZSBpZiggYUNUWC0+aXNTcGVjaWZpY1J1bnRpbWVDdHgoKSApCisJeworCQljb25zdCBCRiAmIGZvdW5kSW5zdGFuY2UgPQorCQkJCXNlYXJjaERhdGFJbnN0YW5jZShhQ1RYLT5tUnVudGltZUN0eCwgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEKTsKKwkJaWYoIGZvdW5kSW5zdGFuY2UudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRJbnN0YW5jZSApOworCQl9CisJfQorCisJcmV0dXJuKCBzZWFyY2hEYXRhSW5zdGFuY2VBbGlhcyhhQ1RYLCBhRnVsbHlRdWFsaWZpZWROYW1lSUQpICk7Cit9CisKKworCitjb25zdCBCRiAmIFN5bWJvbFRhYmxlOjpzZWFyY2hEYXRhSW5zdGFuY2VCeVF1YWxpZmllZE5hbWVJRCgKKwkJQmFzZUF2bVByb2dyYW0gKiB0bXBQcm9ncmFtLCBjb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpIGNvbnN0Cit7CisJZm9yKCA7IHRtcFByb2dyYW0gIT0gTlVMTCA7IHRtcFByb2dyYW0gPSB0bXBQcm9ncmFtLT5nZXRDb250YWluZXIoKSApCisJeworCQljb25zdCBCRiAmIGZvdW5kSW5zdGFuY2UgPSB0bXBQcm9ncmFtLT4KKwkJCQlnZXRBbGxEYXRhKCkuZ2V0QnlRdWFsaWZpZWROYW1lSUQoYVF1YWxpZmllZE5hbWVJRCk7CisJCWlmKCBmb3VuZEluc3RhbmNlLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kSW5zdGFuY2UgKTsKKwkJfQorCisJCWlmKCB0bXBQcm9ncmFtLT5pczwgQXZtUHJvZ3JhbSA+KCkgKQorCQl7CisJCQl7CisJCQkJY29uc3QgQkYgJiBmb3VuZEluc3RhbmNlID0gdG1wUHJvZ3JhbS0+dG88IEF2bVByb2dyYW0gPigpLT4KKwkJCQkJCWdldENvbnN0RGF0YSgpLmdldEJ5UXVhbGlmaWVkTmFtZUlEKGFRdWFsaWZpZWROYW1lSUQpOworCQkJCWlmKCBmb3VuZEluc3RhbmNlLnZhbGlkKCkgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCBmb3VuZEluc3RhbmNlICk7CisJCQkJfQorCQkJfQorCisJCQl7CisJCQkJY29uc3QgQkYgJiBmb3VuZEluc3RhbmNlID0gdG1wUHJvZ3JhbS0+dG88IEF2bVByb2dyYW0gPigpLT4KKwkJCQkJCWdldFN5bWJvbERhdGFCeVF1YWxpZmllZE5hbWVJRChhUXVhbGlmaWVkTmFtZUlEKTsKKwkJCQlpZiggZm91bmRJbnN0YW5jZS52YWxpZCgpICkKKwkJCQl7CisJCQkJCXJldHVybiggZm91bmRJbnN0YW5jZSApOworCQkJCX0KKwkJCX0KKworCQkJaWYoIHRtcFByb2dyYW0tPmlzPCBFeGVjdXRhYmxlRm9ybSA+KCkgKQorCQkJeworCQkJCWNvbnN0IEJGICYgZm91bmRJbnN0YW5jZSA9IHRtcFByb2dyYW0tPnRvPCBFeGVjdXRhYmxlRm9ybSA+KCktPgorCQkJCQkJZ2V0RGF0YUFsaWFzKCkuZ2V0QnlRdWFsaWZpZWROYW1lSUQoYVF1YWxpZmllZE5hbWVJRCk7CisJCQkJaWYoIGZvdW5kSW5zdGFuY2UudmFsaWQoKSApCisJCQkJeworCQkJCQlyZXR1cm4oIGZvdW5kSW5zdGFuY2UgKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworfQorCitjb25zdCBCRiAmIFN5bWJvbFRhYmxlOjpzZWFyY2hEYXRhSW5zdGFuY2VCeVF1YWxpZmllZE5hbWVJRCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKQoreworCS8vIFJFU0VUIEVSUk9SCisJcmVzZXRFcnJvcigpOworCisJY29uc3QgQkYgJiBmb3VuZEluc3RhbmNlID0gc2VhcmNoRGF0YUluc3RhbmNlQnlRdWFsaWZpZWROYW1lSUQoCisJCQlhQ1RYLT5tQ29tcGlsZUN0eCwgYVF1YWxpZmllZE5hbWVJRCk7CisJaWYoIGZvdW5kSW5zdGFuY2UudmFsaWQoKSApCisJeworCQlyZXR1cm4oIGZvdW5kSW5zdGFuY2UgKTsKKwl9CisJZWxzZSBpZiggYUNUWC0+aXNTcGVjaWZpY1J1bnRpbWVDdHgoKSApCisJeworCQljb25zdCBCRiAmIGZvdW5kSW5zdGFuY2UgPSBzZWFyY2hEYXRhSW5zdGFuY2VCeVF1YWxpZmllZE5hbWVJRCgKKwkJCQlhQ1RYLT5tUnVudGltZUN0eCwgYVF1YWxpZmllZE5hbWVJRCk7CisJCWlmKCBmb3VuZEluc3RhbmNlLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kSW5zdGFuY2UgKTsKKwkJfQorCX0KKworCXJldHVybiggQkY6OlJFRl9OVUxMICk7Cit9CisKKworCitjb25zdCBCRiAmIFN5bWJvbFRhYmxlOjpzZWFyY2hEYXRhSW5zdGFuY2VCeU5hbWVJRCgKKwkJQmFzZUF2bVByb2dyYW0gKiB0bXBQcm9ncmFtLCBjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpIGNvbnN0Cit7CisJZm9yKCA7IHRtcFByb2dyYW0gIT0gTlVMTCA7IHRtcFByb2dyYW0gPSB0bXBQcm9ncmFtLT5nZXRDb250YWluZXIoKSApCisJeworCQljb25zdCBCRiAmIGZvdW5kSW5zdGFuY2UgPQorCQkJCXRtcFByb2dyYW0tPmdldEFsbERhdGEoKS5nZXRCeU5hbWVJRChhTmFtZUlEKTsKKwkJaWYoIGZvdW5kSW5zdGFuY2UudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRJbnN0YW5jZSApOworCQl9CisKKwkJaWYoIHRtcFByb2dyYW0tPmlzPCBBdm1Qcm9ncmFtID4oKSApCisJCXsKKwkJCXsKKwkJCQljb25zdCBCRiAmIGZvdW5kSW5zdGFuY2UgPSB0bXBQcm9ncmFtLT50bzwKKwkJCQkJCUF2bVByb2dyYW0gPigpLT5nZXRDb25zdERhdGEoKS5nZXRCeU5hbWVJRChhTmFtZUlEKTsKKwkJCQlpZiggZm91bmRJbnN0YW5jZS52YWxpZCgpICkKKwkJCQl7CisJCQkJCXJldHVybiggZm91bmRJbnN0YW5jZSApOworCQkJCX0KKwkJCX0KKworCQkJeworCQkJCWNvbnN0IEJGICYgZm91bmRJbnN0YW5jZSA9IHRtcFByb2dyYW0tPnRvPAorCQkJCQkJQXZtUHJvZ3JhbSA+KCktPmdldFN5bWJvbERhdGFCeU5hbWVJRChhTmFtZUlEKTsKKwkJCQlpZiggZm91bmRJbnN0YW5jZS52YWxpZCgpICkKKwkJCQl7CisJCQkJCXJldHVybiggZm91bmRJbnN0YW5jZSApOworCQkJCX0KKwkJCX0KKworCQkJaWYoIHRtcFByb2dyYW0tPmlzPCBFeGVjdXRhYmxlRm9ybSA+KCkgKQorCQkJeworCQkJCWNvbnN0IEJGICYgZm91bmRJbnN0YW5jZSA9IHRtcFByb2dyYW0tPnRvPAorCQkJCQkJRXhlY3V0YWJsZUZvcm0gPigpLT5nZXREYXRhQWxpYXMoKS5nZXRCeU5hbWVJRChhTmFtZUlEKTsKKwkJCQlpZiggZm91bmRJbnN0YW5jZS52YWxpZCgpICkKKwkJCQl7CisJCQkJCXJldHVybiggZm91bmRJbnN0YW5jZSApOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXJldHVybiggQkY6OlJFRl9OVUxMICk7Cit9CisKKworY29uc3QgQkYgJiBTeW1ib2xUYWJsZTo6c2VhcmNoRGF0YUluc3RhbmNlQWxpYXMoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IE9iamVjdEVsZW1lbnQgKiBhc3RFbGVtZW50KQoreworCUV4ZWN1dGFibGVGb3JtICogdG1wRXhlY3V0YWJsZSA9IE5VTEw7CisJQkYgZm91bmRJbnN0YW5jZTsKKwlJbnN0YW5jZU9mRGF0YSAqIGZvdW5kRGF0YSA9IE5VTEw7CisKKwlUYWJsZU9mRXhlY3V0YWJsZUZvcm06OmNvbnN0X3Jhd19pdGVyYXRvciBpdEV4ZWMgPQorCQkJbUNvbmZpZ3VyYXRpb24uZ2V0RXhlY3V0YWJsZVN5c3RlbSgpLmdldEV4ZWN1dGFibGVzKCkuYmVnaW4oKTsKKwlUYWJsZU9mRXhlY3V0YWJsZUZvcm06OmNvbnN0X3Jhd19pdGVyYXRvciBlbmRFeGVjID0KKwkJCW1Db25maWd1cmF0aW9uLmdldEV4ZWN1dGFibGVTeXN0ZW0oKS5nZXRFeGVjdXRhYmxlcygpLmVuZCgpOworCWZvciggOyBpdEV4ZWMgIT0gZW5kRXhlYyA7ICsraXRFeGVjICkKKwl7CisJCWZvdW5kSW5zdGFuY2UgPSAoaXRFeGVjKS0+Z2V0QWxsRGF0YSgpLmdldEJ5QXN0RWxlbWVudChhc3RFbGVtZW50KTsKKwkJaWYoIGZvdW5kSW5zdGFuY2UudmFsaWQoKSApCisJCXsKKwkJCXRtcEV4ZWN1dGFibGUgPSAoaXRFeGVjKTsKKwkJCWJyZWFrOworCQl9CisKKwkJZm91bmRJbnN0YW5jZSA9IChpdEV4ZWMpLT5nZXRDb25zdERhdGEoKS5nZXRCeUFzdEVsZW1lbnQoYXN0RWxlbWVudCk7CisJCWlmKCBmb3VuZEluc3RhbmNlLnZhbGlkKCkgKQorCQl7CisJCQl0bXBFeGVjdXRhYmxlID0gKGl0RXhlYyk7CisJCQlicmVhazsKKwkJfQorCisJCWZvdW5kSW5zdGFuY2UgPSAoaXRFeGVjKS0+Z2V0U3ltYm9sRGF0YUJ5QXN0RWxlbWVudChhc3RFbGVtZW50KTsKKwkJaWYoIGZvdW5kSW5zdGFuY2UudmFsaWQoKSApCisJCXsKKwkJCXRtcEV4ZWN1dGFibGUgPSAoaXRFeGVjKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYoIGZvdW5kSW5zdGFuY2UudmFsaWQoKSApCisJeworCQlmb3VuZERhdGEgPSBmb3VuZEluc3RhbmNlLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpOworCQlpZiggZm91bmREYXRhLT5nZXRNb2RpZmllcigpLmlzVmlzaWJpbGl0eVB1YmxpYyggYUNUWC0+Z2V0TW9kaWZpZXIoKSApICkKKwkJeworCQkJcmV0dXJuKCBjcmVhdGVEYXRhSW5zdGFuY2VBbGlhcygKKwkJCQkJYUNUWC0+bUNvbXBpbGVDdHgtPmdldEV4ZWN1dGFibGUoKSwKKwkJCQkJYXN0RWxlbWVudC0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSwKKwkJCQkJZm91bmREYXRhLCB0bXBFeGVjdXRhYmxlKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJaW5jckVycm9yQ291bnQoKTsKKwkJCUVSUk9SX09TIDw8ICJJbGxlZ2FsIGFjY2VzIG9mIHRoZSBOT04tUFVCTElDIGluc3RhbmNlIDw8ICYiCisJCQkJCTw8IGFzdEVsZW1lbnQtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIiA+PiAhISEiOworCQl9CisJfQorCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKK30KKworCitjb25zdCBCRiAmIFN5bWJvbFRhYmxlOjpzZWFyY2hEYXRhSW5zdGFuY2VBbGlhcygKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQpCit7CisJc3RkOjpzdHJpbmcgZnFuUHJlZml4ID0gYUZ1bGx5UXVhbGlmaWVkTmFtZUlELnN1YnN0cigwLAorCQkJYUZ1bGx5UXVhbGlmaWVkTmFtZUlELmZpbmRfbGFzdF9vZignLicpKTsKKworCXN0ZDo6c3RyaW5nIGFsaWFzRlFOOworCisJVmVjdG9yT2ZJbnN0YW5jZU9mTWFjaGluZSB0aGVJbnN0YW5jZU9mTWFjaGluZVBhdGg7CisKKwlFeGVjdXRhYmxlRm9ybSAqIHRtcEV4ZWN1dGFibGUgPSBhQ1RYLT5tQ29tcGlsZUN0eC0+Z2V0RXhlY3V0YWJsZSgpOworCisJU3ltYm9sIGFNYWNoaW5lOworCisJZm9yKCA7IHRtcEV4ZWN1dGFibGUgIT0gTlVMTCA7CisJCQl0bXBFeGVjdXRhYmxlID0gdG1wRXhlY3V0YWJsZS0+Z2V0RXhlY3V0YWJsZUNvbnRhaW5lcigpICkKKwl7CisJCWlmKCAoKGFNYWNoaW5lID0gdG1wRXhlY3V0YWJsZS0+Z2V0SW5zdGFuY2VTdGF0aWMoKS4KKwkJCQlnZXRCeUZRTmFtZUlEKGZxblByZWZpeCkpLnZhbGlkKCkgKQorCQl8fCAoKGFNYWNoaW5lID0gdG1wRXhlY3V0YWJsZS0+Z2V0SW5zdGFuY2VTdGF0aWMoKS4KKwkJCQlnZXRCeVF1YWxpZmllZE5hbWVJRChmcW5QcmVmaXgpKS52YWxpZCgpKSApCisJCXsKKwkJCXRoZUluc3RhbmNlT2ZNYWNoaW5lUGF0aC5hcHBlbmQoIGFNYWNoaW5lLnJhd01hY2hpbmUoKSApOworCisJCQl0bXBFeGVjdXRhYmxlID0gYU1hY2hpbmUuZ2V0RXhlY3V0YWJsZSgpOworCisJCQlhbGlhc0ZRTiA9IGFNYWNoaW5lLmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7CisKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYoIGFNYWNoaW5lLmludmFsaWQoKSApCisJeworCQlmcW5QcmVmaXggPSBhRnVsbHlRdWFsaWZpZWROYW1lSUQuc3Vic3RyKDAsCisJCQkJYUZ1bGx5UXVhbGlmaWVkTmFtZUlELmZpbmQoJy4nKSk7CisJCXRtcEV4ZWN1dGFibGUgPSBOVUxMOworCisJCVRhYmxlT2ZFeGVjdXRhYmxlRm9ybTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGl0RXhlYyA9CisJCQkJbUNvbmZpZ3VyYXRpb24uZ2V0RXhlY3V0YWJsZVN5c3RlbSgpLmdldEV4ZWN1dGFibGVzKCkuYmVnaW4oKTsKKwkJVGFibGVPZkV4ZWN1dGFibGVGb3JtOjpjb25zdF9yYXdfaXRlcmF0b3IgZW5kRXhlYyA9CisJCQkJbUNvbmZpZ3VyYXRpb24uZ2V0RXhlY3V0YWJsZVN5c3RlbSgpLmdldEV4ZWN1dGFibGVzKCkuZW5kKCk7CisJCWZvciggOyBpdEV4ZWMgIT0gZW5kRXhlYyA7ICsraXRFeGVjICkKKwkJeworCQkJaWYoIChpdEV4ZWMpLT5nZXRBc3RGdWxseVF1YWxpZmllZE5hbWVJRCgpID09IGZxblByZWZpeCApCisJCQl7CisJCQkJdG1wRXhlY3V0YWJsZSA9IChpdEV4ZWMpOworCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZSBpZiggTmFtZWRFbGVtZW50Ojpjb21wYXJlTG9jYXRpb24oCisJCQkJCShpdEV4ZWMpLT5nZXRBc3RGdWxseVF1YWxpZmllZE5hbWVJRCgpLCBmcW5QcmVmaXgpICkKKwkJCXsKKwkJCQl0bXBFeGVjdXRhYmxlID0gKGl0RXhlYyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlIGlmKCAoaXRFeGVjKS0+Z2V0TmFtZUlEKCkgPT0gZnFuUHJlZml4ICkKKwkJCXsKKwkJCQl0bXBFeGVjdXRhYmxlID0gKGl0RXhlYyk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiggdG1wRXhlY3V0YWJsZSAhPSBOVUxMICkKKwl7CisJCUxpc3RPZlN0cmluZyBzdHJMaXN0OworCisJCU5hbWVkRWxlbWVudDo6Y29sbGVjdE5hbWVJRChzdHJMaXN0LAorCQkJCWFGdWxseVF1YWxpZmllZE5hbWVJRCwgZnFuUHJlZml4LnNpemUoKSArIDEpOworCisJCWlmKCBzdHJMaXN0LnNpbmdsZXRvbigpICkKKwkJeworCQkJYWxpYXNGUU4gPSBhbGlhc0ZRTiArICcuJyArIHN0ckxpc3QuZmlyc3QoKTsKKwkJCWZxblByZWZpeCA9IHRtcEV4ZWN1dGFibGUtPmdldEFzdEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgKworCQkJCQknLicgKyBzdHJMaXN0LnBvcF9maXJzdCgpOworCisJCQlpZiggdG1wRXhlY3V0YWJsZS0+Z2V0QWxsRGF0YSgpLmdldEJ5RlFOYW1lSUQoZnFuUHJlZml4KS5pbnZhbGlkKCkgKQorCQkJeworCQkJCXRtcEV4ZWN1dGFibGUgPSBOVUxMOworCQkJfQorCQl9CisKKwkJd2hpbGUoIHN0ckxpc3QucG9wdWxhdGVkKCkgJiYgKHRtcEV4ZWN1dGFibGUgIT0gTlVMTCkgKQorCQl7CisJCQlmcW5QcmVmaXggPSB0bXBFeGVjdXRhYmxlLT5nZXRBc3RGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQkJCSsgJy4nICsgc3RyTGlzdC5wb3BfZmlyc3QoKTsKKworCQkJYU1hY2hpbmUgPSB0bXBFeGVjdXRhYmxlLT4KKwkJCQkJZ2V0SW5zdGFuY2VTdGF0aWMoKS5nZXRCeUZRTmFtZUlEKCBmcW5QcmVmaXggKTsKKwkJCWlmKCBhTWFjaGluZSAhPSBOVUxMICkKKwkJCXsKKwkJCQlhbGlhc0ZRTiA9IGFNYWNoaW5lLmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7CisKKwkJCQl0aGVJbnN0YW5jZU9mTWFjaGluZVBhdGguYXBwZW5kKCBhTWFjaGluZS5yYXdNYWNoaW5lKCkgKTsKKworCQkJCXRtcEV4ZWN1dGFibGUgPSBhTWFjaGluZS5nZXRFeGVjdXRhYmxlKCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYoIHRtcEV4ZWN1dGFibGUtPmdldEFsbERhdGEoKS4KKwkJCQkJCWdldEJ5RlFOYW1lSUQoZnFuUHJlZml4KS5pbnZhbGlkKCkgKQorCQkJCXsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYoIHRtcEV4ZWN1dGFibGUgIT0gTlVMTCApCisJCXsKKwkJCXdoaWxlKCBzdHJMaXN0Lm5vbmVtcHR5KCkgKQorCQkJeworCQkJCWFsaWFzRlFOID0gYWxpYXNGUU4gKyAnLicgKyBzdHJMaXN0LmZpcnN0KCk7CisJCQkJZnFuUHJlZml4ID0gZnFuUHJlZml4ICsgJy4nICsgc3RyTGlzdC5wb3BfZmlyc3QoKTsKKwkJCX0KKworCQkJY29uc3QgQkYgJiBmb3VuZEluc3RhbmNlID0KKwkJCQkJdG1wRXhlY3V0YWJsZS0+Z2V0QWxsRGF0YSgpLmdldEJ5RlFOYW1lSUQoZnFuUHJlZml4KTsKKworCQkJaWYoIGZvdW5kSW5zdGFuY2UudmFsaWQoKSApCisJCQl7CisJCQkJSW5zdGFuY2VPZkRhdGEgKiBmb3VuZERhdGEgPQorCQkJCQkJZm91bmRJbnN0YW5jZS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKTsKKwkJCQlpZiggZm91bmREYXRhLT5nZXRNb2RpZmllcigpLgorCQkJCQkJaXNWaXNpYmlsaXR5UHVibGljKCBhQ1RYLT5nZXRNb2RpZmllcigpICkgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCBjcmVhdGVEYXRhSW5zdGFuY2VBbGlhcygKKwkJCQkJCQlhQ1RYLT5tQ29tcGlsZUN0eC0+Z2V0RXhlY3V0YWJsZSgpLAorCQkJCQkJCWFsaWFzRlFOLCBmb3VuZERhdGEsIHRoZUluc3RhbmNlT2ZNYWNoaW5lUGF0aCkgKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJaW5jckVycm9yQ291bnQoKTsKKwkJCQkJRVJST1JfT1MgPDwgIklsbGVnYWwgYWNjZXMgb2YgdGhlIE5PTi1QVUJMSUMgaW5zdGFuY2UgPDwgIgorCQkJCQkJCTw8IGFGdWxseVF1YWxpZmllZE5hbWVJRCA8PCAiID4+ICEhISI7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKK30KKworCitjb25zdCBCRiAmIFN5bWJvbFRhYmxlOjpjcmVhdGVEYXRhSW5zdGFuY2VBbGlhcyhFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZSwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQsCisJCUluc3RhbmNlT2ZEYXRhICogYW5JbnN0YW5jZSwgRXhlY3V0YWJsZUZvcm0gKiBpbnN0Q29udGFpbmVyKQoreworCWNvbnN0IEV4ZWN1dGFibGVGb3JtICogbGNhRXhlY3V0YWJsZSA9IGFuRXhlY3V0YWJsZS0+TENBKCBpbnN0Q29udGFpbmVyICk7CisKKwlpZiggbGNhRXhlY3V0YWJsZSAhPSBOVUxMICkKKwl7CisJCXN0ZDo6c3RyaW5nIGZxblByZWZpeCA9IGxjYUV4ZWN1dGFibGUtPmdldEFzdEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7CisKKwkJTGlzdE9mU3RyaW5nIHN0ckxpc3Q7CisJCU5hbWVkRWxlbWVudDo6Y29sbGVjdE5hbWVJRChzdHJMaXN0LCBhRnVsbHlRdWFsaWZpZWROYW1lSUQsIGZxblByZWZpeCk7CisKKwkJVmVjdG9yT2ZJbnN0YW5jZU9mTWFjaGluZSB0aGVJbnN0YW5jZU9mTWFjaGluZVBhdGg7CisKKwkJd2hpbGUoIHN0ckxpc3QucG9wdWxhdGVkKCkgKQorCQl7CisJCQlmcW5QcmVmaXggPSBmcW5QcmVmaXggKyAnLicgKyBzdHJMaXN0LnBvcF9maXJzdCgpOworCisJCQljb25zdCBTeW1ib2wgJiBleGVjSW5zdGFuY2UgPQorCQkJCWxjYUV4ZWN1dGFibGUtPmdldEluc3RhbmNlU3RhdGljKCkuZ2V0QnlGUU5hbWVJRCggZnFuUHJlZml4ICk7CisJCQlpZiggZXhlY0luc3RhbmNlLnZhbGlkKCkgKQorCQkJeworCQkJCXRoZUluc3RhbmNlT2ZNYWNoaW5lUGF0aC5hcHBlbmQoZXhlY0luc3RhbmNlLnJhd01hY2hpbmUoKSk7CisJCQkJbGNhRXhlY3V0YWJsZSA9IGV4ZWNJbnN0YW5jZS5nZXRFeGVjdXRhYmxlKCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYoIGxjYUV4ZWN1dGFibGUtPmdldEFsbERhdGEoKS4KKwkJCQkJCWdldEJ5RlFOYW1lSUQoIGZxblByZWZpeCApLmludmFsaWQoKSApCisJCQkJeworCQkJCQlsY2FFeGVjdXRhYmxlID0gTlVMTDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiggbGNhRXhlY3V0YWJsZSAhPSBOVUxMICkKKwkJeworCQkJd2hpbGUoIHN0ckxpc3Qubm9uZW1wdHkoKSApCisJCQl7CisJCQkJZnFuUHJlZml4ID0gZnFuUHJlZml4ICsgJy4nICsgc3RyTGlzdC5wb3BfZmlyc3QoKTsKKwkJCX0KKworCQkJQkYgZm91bmRJbnN0YW5jZSA9CisJCQkJCWxjYUV4ZWN1dGFibGUtPmdldEFsbERhdGEoKS5nZXRCeUZRTmFtZUlEKCBmcW5QcmVmaXggKTsKKwkJCWlmKCBmb3VuZEluc3RhbmNlLmludmFsaWQoKSApCisJCQl7CisJCQkJZm91bmRJbnN0YW5jZSA9CisJCQkJCQlsY2FFeGVjdXRhYmxlLT5nZXRDb25zdERhdGEoKS5nZXRCeUZRTmFtZUlEKCBmcW5QcmVmaXggKTsKKworCQkJCWlmKCBmb3VuZEluc3RhbmNlLmludmFsaWQoKSApCisJCQkJeworCQkJCQlmb3VuZEluc3RhbmNlID0gbGNhRXhlY3V0YWJsZS0+Z2V0U3ltYm9sRGF0YShmcW5QcmVmaXgpOworCQkJCX0KKwkJCX0KKworCQkJaWYoIGZvdW5kSW5zdGFuY2UgPT0gYW5JbnN0YW5jZSApCisJCQl7CisJCQkJSW5zdGFuY2VPZkRhdGEgKiBhbGlhc0luc3RhbmNlKCBuZXcgSW5zdGFuY2VPZkRhdGEoCisJCQkJCQlhbkV4ZWN1dGFibGUsIGFuSW5zdGFuY2UsIHRoZUluc3RhbmNlT2ZNYWNoaW5lUGF0aCkgKTsKKwkJCQlhbGlhc0luc3RhbmNlLT5zZXRGdWxseVF1YWxpZmllZE5hbWVJRCgiYWxpYXMiICsKKwkJCQkJCWFGdWxseVF1YWxpZmllZE5hbWVJRC5zdWJzdHIoCisJCQkJCQkJCWFGdWxseVF1YWxpZmllZE5hbWVJRC5maW5kKCc6JykpICk7CisKKwkJCQlyZXR1cm4oIGFuRXhlY3V0YWJsZS0+c2F2ZURhdGFBbGlhcyhhbGlhc0luc3RhbmNlKSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWluY3JFcnJvckNvdW50KCk7CisJCQkJRVJST1JfT1MgPDwgIkZhaWxlZCB0byBjcmVhdGUgQUxJQVMgZm9yIGluc3RhbmNlIDw8ICIKKwkJCQkJCTw8IGFGdWxseVF1YWxpZmllZE5hbWVJRCA8PCAiID4+ICEhISI7CisJCQl9CisJCX0KKwl9CisJZWxzZQorCXsKKwkJaW5jckVycm9yQ291bnQoKTsKKwkJRVJST1JfT1MgPDwgIlVuZm91bmQgTENBIGV4ZWN1dGFibGUgYmV0d2VlbiAiCisJCQkJPDwgYW5FeGVjdXRhYmxlLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8ICIgJiAiOworCQlFUlJPUl9PUyA8PCBpbnN0Q29udGFpbmVyLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQkJPDwgIiBmb3IgQUxJQVMgY3JlYXRpb24gZm9yIGluc3RhbmNlIDw8ICIKKwkJCQk8PCBhRnVsbHlRdWFsaWZpZWROYW1lSUQgPDwgIiA+PiAhISEiOworCX0KKworCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKK30KKworCitjb25zdCBCRiAmIFN5bWJvbFRhYmxlOjpjcmVhdGVEYXRhSW5zdGFuY2VBbGlhcyhFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZSwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQsIEluc3RhbmNlT2ZEYXRhICogYW5JbnN0YW5jZSwKKwkJVmVjdG9yT2ZJbnN0YW5jZU9mTWFjaGluZSAmIHRoZUluc3RhbmNlT2ZNYWNoaW5lUGF0aCkKK3sKKwljb25zdCBFeGVjdXRhYmxlRm9ybSAqIGxjYUV4ZWN1dGFibGUgPSBhbkV4ZWN1dGFibGUtPkxDUkEoCisJCQl0aGVJbnN0YW5jZU9mTWFjaGluZVBhdGgubGFzdCgpLT5nZXRDb250YWluZXIoKS0+Z2V0RXhlY3V0YWJsZSgpICk7CisKKwlpZiggbGNhRXhlY3V0YWJsZSAhPSBOVUxMICkKKwl7CisJCWlmKCBsY2FFeGVjdXRhYmxlLT5oYXNDb250YWluZXIoKQorCQkJJiYgdGhlSW5zdGFuY2VPZk1hY2hpbmVQYXRoLnBvcHVsYXRlZCgpCisJCQkmJiAodGhlSW5zdGFuY2VPZk1hY2hpbmVQYXRoLmZpcnN0KCkKKwkJCQkhPSBtQ29uZmlndXJhdGlvbi5nZXRFeGVjdXRhYmxlU3lzdGVtKCkucmF3U3lzdGVtSW5zdGFuY2UoKSkgKQorCQl7CisJCQl3aGlsZSggdGhlSW5zdGFuY2VPZk1hY2hpbmVQYXRoLmZpcnN0KCktPmdldEV4ZWN1dGFibGUoKQorCQkJCQkhPSBsY2FFeGVjdXRhYmxlICkKKwkJCXsKKwkJCQl0aGVJbnN0YW5jZU9mTWFjaGluZVBhdGgucmVtb3ZlX2ZpcnN0KCk7CisJCQl9CisJCQlpZiggbGNhRXhlY3V0YWJsZSA9PSBhbkV4ZWN1dGFibGUgKQorCQkJeworCQkJCXRoZUluc3RhbmNlT2ZNYWNoaW5lUGF0aC5yZW1vdmVfZmlyc3QoKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCS8vISEgTk9USElORworCQl9CisKKwkJSW5zdGFuY2VPZkRhdGEgKiBhbGlhc0luc3RhbmNlKCBuZXcgSW5zdGFuY2VPZkRhdGEoYW5FeGVjdXRhYmxlLAorCQkJCWFuSW5zdGFuY2UsIHRoZUluc3RhbmNlT2ZNYWNoaW5lUGF0aCkgKTsKKworCQlhbGlhc0luc3RhbmNlLT5zZXRGdWxseVF1YWxpZmllZE5hbWVJRCggImFsaWFzIiArCisJCQkJYUZ1bGx5UXVhbGlmaWVkTmFtZUlELnN1YnN0cihhRnVsbHlRdWFsaWZpZWROYW1lSUQuZmluZCgnOicpKSApOworCisJCXJldHVybiggYW5FeGVjdXRhYmxlLT5zYXZlRGF0YUFsaWFzKGFsaWFzSW5zdGFuY2UpICk7CisJfQorCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKK30KKworCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU0VBUkNIIFBPUlQgQ09OTkVDVCBJTlNUQU5DRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK0luc3RhbmNlT2ZQb3J0ICogU3ltYm9sVGFibGU6OnNlYXJjaFBvcnRDb25uZWN0b3JJbnN0YW5jZSgKKwkJRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGUsCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEKSBjb25zdAoreworCS8vIFNFQUNIIEZPUiBJTlRFUk5BTCBQT1JUIENPTk5FWElPTgorCXsKKwkJY29uc3QgU3ltYm9sICYgZm91bmRJbnN0YW5jZSA9CisJCQkJYW5FeGVjdXRhYmxlLT5nZXRQb3J0KCkuZ2V0QnlGUU5hbWVJRCggYUZ1bGx5UXVhbGlmaWVkTmFtZUlEICk7CisJCWlmKCBmb3VuZEluc3RhbmNlLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kSW5zdGFuY2UucmF3UG9ydCgpICk7CisJCX0KKwl9CisKKwkvLyBTRUFDSCBGT1IgTUFDSElORSBQT1JUIENPTk5FWElPTgorCVRhYmxlT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGl0TWFjaGluZSA9CisJCQlhbkV4ZWN1dGFibGUtPmdldEluc3RhbmNlU3RhdGljKCkuYmVnaW4oKTsKKwlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBlbmRNYWNoaW5lID0KKwkJCWFuRXhlY3V0YWJsZS0+Z2V0SW5zdGFuY2VTdGF0aWMoKS5lbmQoKTsKKwlmb3IoIDsgaXRNYWNoaW5lICE9IGVuZE1hY2hpbmUgOyArK2l0TWFjaGluZSApCisJeworCQljb25zdCBTeW1ib2wgJiBmb3VuZEluc3RhbmNlID0gKCppdE1hY2hpbmUpLmdldEV4ZWN1dGFibGUoKS0+Z2V0UG9ydCgpLgorCQkJCWdldEJ5RlFOYW1lSUQoIGFGdWxseVF1YWxpZmllZE5hbWVJRCApOworCQlpZiggZm91bmRJbnN0YW5jZS52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCBmb3VuZEluc3RhbmNlLnJhd1BvcnQoKSApOworCQl9CisJfQorCisJcmV0dXJuKCBOVUxMICk7Cit9CisKK0luc3RhbmNlT2ZQb3J0ICogU3ltYm9sVGFibGU6OnNlYXJjaFBvcnRDb25uZWN0b3JJbnN0YW5jZSgKKwkJRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGUsIGNvbnN0IE9iamVjdEVsZW1lbnQgKiBhUG9ydCkgY29uc3QKK3sKKwkvLyBTRUFDSCBGT1IgSU5URVJOQUwgUE9SVCBDT05ORVhJT04KKwl7CisJCWNvbnN0IFN5bWJvbCAmIGZvdW5kSW5zdGFuY2UgPQorCQkJCWFuRXhlY3V0YWJsZS0+Z2V0UG9ydCgpLmdldEJ5QXN0RWxlbWVudChhUG9ydCk7CisJCWlmKCBmb3VuZEluc3RhbmNlLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kSW5zdGFuY2UucmF3UG9ydCgpICk7CisJCX0KKwl9CisKKwkvLyBTRUFDSCBGT1IgTUFDSElORSBQT1JUIENPTk5FWElPTgorCVRhYmxlT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGl0TWFjaGluZSA9CisJCQlhbkV4ZWN1dGFibGUtPmdldEluc3RhbmNlU3RhdGljKCkuYmVnaW4oKTsKKwlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBlbmRNYWNoaW5lID0KKwkJCWFuRXhlY3V0YWJsZS0+Z2V0SW5zdGFuY2VTdGF0aWMoKS5lbmQoKTsKKwlmb3IoIDsgaXRNYWNoaW5lICE9IGVuZE1hY2hpbmUgOyArK2l0TWFjaGluZSApCisJeworCQljb25zdCBTeW1ib2wgJiBmb3VuZEluc3RhbmNlID0gKCppdE1hY2hpbmUpLmdldEV4ZWN1dGFibGUoKS0+CisJCQkJZ2V0UG9ydCgpLmdldEJ5QXN0RWxlbWVudChhUG9ydCk7CisJCWlmKCBmb3VuZEluc3RhbmNlLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kSW5zdGFuY2UucmF3UG9ydCgpICk7CisJCX0KKwl9CisKKwljb25zdCBTeW1ib2wgJiBmb3VuZEluc3RhbmNlID0gWFF1ZXJ5LmdldFNlbVBvcnRCeUFzdEVsZW1lbnQoCisJCQlhbkV4ZWN1dGFibGUtPmdldEV4ZWN1dGFibGVDb250YWluZXIoKSwgYVBvcnQpOworCWlmKCBmb3VuZEluc3RhbmNlLnZhbGlkKCkgKQorCXsKKwkJcmV0dXJuKCBmb3VuZEluc3RhbmNlLnJhd1BvcnQoKSApOworCX0KKworCXJldHVybiggTlVMTCApOworfQorCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTRUFSQ0ggUE9SVCBTWU1CT0wgSU5TVEFOQ0UKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworY29uc3QgU3ltYm9sICYgU3ltYm9sVGFibGU6OnNlYXJjaFBvcnRTeW1ib2xJbnN0YW5jZSgKKwkJRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWMsIFBvcnQgKiBhUG9ydCkgY29uc3QKK3sKKwljb25zdCBTeW1ib2wgJiBmb3VuZEluc3RhbmNlID0gWFF1ZXJ5LmdldFNlbVBvcnRCeUFzdEVsZW1lbnQoYW5FeGVjLCBhUG9ydCk7CisJaWYoIGZvdW5kSW5zdGFuY2UudmFsaWQoKSApCisJeworCQlyZXR1cm4gZm91bmRJbnN0YW5jZTsKKwl9CisKKwlpZiggYVBvcnQtPmhhc1JvdXRpbmdDaGFubmVsKCkgKQorCXsKKwkJY29uc3QgU3ltYm9sICYgZm91bmRDaGFubmVsID0KKwkJCQlYUXVlcnkuZ2V0Q2hhbm5lbCggYVBvcnQtPmdldFJvdXRpbmdDaGFubmVsKCkgKTsKKwkJaWYoIGZvdW5kQ2hhbm5lbC52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuIGZvdW5kQ2hhbm5lbC5jaGFubmVsKCkuZ2V0Q29udGVudHMoKS5nZXRCeUFzdEVsZW1lbnQoYVBvcnQpOworCQl9CisJfQorCisJcmV0dXJuKCBTeW1ib2w6OlJFRl9OVUxMICk7Cit9CisKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTRUFSQ0ggQlVGRkVSIFNZTUJPTCBJTlNUQU5DRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCitjb25zdCBTeW1ib2wgJiBTeW1ib2xUYWJsZTo6c2VhcmNoQnVmZmVySW5zdGFuY2UoCisJCUV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlLCBjb25zdCBPYmplY3RFbGVtZW50ICogb2JqRWxlbWVudCkgY29uc3QKK3sKKwkvLyBTRUFSQ0ggT04gQ1VSUkVOVCBCVUZGRVIgTElTVAorCXsKKwkJY29uc3QgU3ltYm9sICYgYW5JbnN0YW5jZSA9CisJCQkJYW5FeGVjdXRhYmxlLT5nZXRCdWZmZXIoKS5nZXRCeUFzdEVsZW1lbnQob2JqRWxlbWVudCk7CisJCWlmKCBhbkluc3RhbmNlLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGFuSW5zdGFuY2UgKTsKKwkJfQorCX0KKworCS8vIFNFQVJDSCBPTiBDVVJSRU5UIEFMSUFTIEJVRkZFUiBMSVNUCisJeworCQljb25zdCBTeW1ib2wgJiBhbkluc3RhbmNlID0KKwkJCQlhbkV4ZWN1dGFibGUtPmdldEFsaWFzKCkuZ2V0QnlBc3RFbGVtZW50KG9iakVsZW1lbnQpOworCQlpZiggYW5JbnN0YW5jZS5pczwgSW5zdGFuY2VPZkJ1ZmZlciA+KCkgKQorCQl7CisJCQlyZXR1cm4oIGFuSW5zdGFuY2UgKTsKKwkJfQorCX0KKworCisJLy8gU0VBUkNIIE9OIENVUlJFTlQgTU9ERUwgQ0hJTEQgQlVGRkVSIExJU1QgJiBNQUtFIEFOIEFMSUFTCisJSW5zdGFuY2VPZkJ1ZmZlciAqIGFCdWZmZXJJbnN0YW5jZSA9IE5VTEw7CisKKwlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBpdE1hY2hpbmUgPSBhbkV4ZWN1dGFibGUtPmluc3RhbmNlX21vZGVsX2JlZ2luKCk7CisJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgZW5kTWFjaGluZSA9IGFuRXhlY3V0YWJsZS0+aW5zdGFuY2VfbW9kZWxfZW5kKCk7CisJZm9yKCA7IGl0TWFjaGluZSAhPSBlbmRNYWNoaW5lIDsgKytpdE1hY2hpbmUgKQorCXsKKwkJYUJ1ZmZlckluc3RhbmNlID0gKCppdE1hY2hpbmUpLmdldEV4ZWN1dGFibGUoKS0+CisJCQkJZ2V0QnVmZmVyKCkuZ2V0QnlBc3RFbGVtZW50KG9iakVsZW1lbnQpLnJhd0J1ZmZlcigpOworCQlpZiggYUJ1ZmZlckluc3RhbmNlICE9IE5VTEwgKQorCQl7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmKCBhQnVmZmVySW5zdGFuY2UgIT0gTlVMTCApCisJeworCQlWZWN0b3JPZkluc3RhbmNlT2ZNYWNoaW5lIHRoZUluc3RhbmNlT2ZNYWNoaW5lUGF0aDsKKwkJdGhlSW5zdGFuY2VPZk1hY2hpbmVQYXRoLmFwcGVuZCggKCppdE1hY2hpbmUpLnJhd01hY2hpbmUoKSApOworCisJCUluc3RhbmNlT2ZCdWZmZXIgKiBhbGlhc0luc3RhbmNlID0gbmV3IEluc3RhbmNlT2ZCdWZmZXIoCisJCQkJYW5FeGVjdXRhYmxlLCBhQnVmZmVySW5zdGFuY2UsIHRoZUluc3RhbmNlT2ZNYWNoaW5lUGF0aCk7CisKKwkJc3RkOjpzdHJpbmcgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEID0KKwkJCQlhQnVmZmVySW5zdGFuY2UtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7CisKKwkJYWxpYXNJbnN0YW5jZS0+c2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoICJhbGlhcyIgKworCQkJCWFGdWxseVF1YWxpZmllZE5hbWVJRC5zdWJzdHIoYUZ1bGx5UXVhbGlmaWVkTmFtZUlELmZpbmQoJzonKSkgKTsKKworCQlyZXR1cm4oIGFuRXhlY3V0YWJsZS0+c2F2ZUFsaWFzKGFsaWFzSW5zdGFuY2UpICk7CisJfQorCisJcmV0dXJuKCBzZWFyY2hCdWZmZXJJbnN0YW5jZShvYmpFbGVtZW50KSApOworfQorCisKKworY29uc3QgU3ltYm9sICYgU3ltYm9sVGFibGU6OnNlYXJjaEJ1ZmZlckluc3RhbmNlKEV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlLAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCkKK3sKKwkvLyBTRUFSQ0ggT04gQ1VSUkVOVCBCVUZGRVIgTElTVAorCXsKKwkJY29uc3QgU3ltYm9sICYgYW5JbnN0YW5jZSA9CisJCQlhbkV4ZWN1dGFibGUtPmdldEJ1ZmZlcigpLmdldEJ5RlFOYW1lSUQoIGFGdWxseVF1YWxpZmllZE5hbWVJRCApOworCQlpZiggYW5JbnN0YW5jZS52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCBhbkluc3RhbmNlICk7CisJCX0KKwl9CisKKwkvLyBTRUFSQ0ggT04gQ1VSUkVOVCBBTElBUyBCVUZGRVIgTElTVAorCXsKKwkJY29uc3QgU3ltYm9sICYgYW5JbnN0YW5jZSA9CisJCQkJYW5FeGVjdXRhYmxlLT5nZXRBbGlhcygpLmdldEJ5RlFOYW1lSUQoIGFGdWxseVF1YWxpZmllZE5hbWVJRCApOworCQlpZiggYW5JbnN0YW5jZS5pczwgSW5zdGFuY2VPZkJ1ZmZlciA+KCkgKQorCQl7CisJCQlyZXR1cm4oIGFuSW5zdGFuY2UgKTsKKwkJfQorCX0KKworCS8vIFNFQVJDSCBPTiBDVVJSRU5UIE1PREVMIENISUxEIEJVRkZFUiBMSVNUICYgTUFLRSBBTiBBTElBUworCUluc3RhbmNlT2ZCdWZmZXIgKiBhQnVmZmVySW5zdGFuY2UgPSBOVUxMOworCisJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgaXRNYWNoaW5lID0gYW5FeGVjdXRhYmxlLT5pbnN0YW5jZV9tb2RlbF9iZWdpbigpOworCVRhYmxlT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGVuZE1hY2hpbmUgPSBhbkV4ZWN1dGFibGUtPmluc3RhbmNlX21vZGVsX2VuZCgpOworCWZvciggOyBpdE1hY2hpbmUgIT0gZW5kTWFjaGluZSA7ICsraXRNYWNoaW5lICkKKwl7CisJCWFCdWZmZXJJbnN0YW5jZSA9ICgqaXRNYWNoaW5lKS5nZXRFeGVjdXRhYmxlKCktPgorCQkJCWdldEJ1ZmZlcigpLmdldEJ5RlFOYW1lSUQoIGFGdWxseVF1YWxpZmllZE5hbWVJRCApLnJhd0J1ZmZlcigpOworCQlpZiggYUJ1ZmZlckluc3RhbmNlICE9IE5VTEwgKQorCQl7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmKCBhQnVmZmVySW5zdGFuY2UgIT0gTlVMTCApCisJeworCQlWZWN0b3JPZkluc3RhbmNlT2ZNYWNoaW5lIHRoZUluc3RhbmNlT2ZNYWNoaW5lUGF0aDsKKwkJdGhlSW5zdGFuY2VPZk1hY2hpbmVQYXRoLmFwcGVuZCggKCppdE1hY2hpbmUpLnJhd01hY2hpbmUoKSApOworCisJCUluc3RhbmNlT2ZCdWZmZXIgKiBhbGlhc0luc3RhbmNlID0gbmV3IEluc3RhbmNlT2ZCdWZmZXIoCisJCQkJYW5FeGVjdXRhYmxlLCBhQnVmZmVySW5zdGFuY2UsIHRoZUluc3RhbmNlT2ZNYWNoaW5lUGF0aCApOworCisJCXN0ZDo6c3RyaW5nIGZxbklEID0gYUJ1ZmZlckluc3RhbmNlLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOworCQlhbGlhc0luc3RhbmNlLT5zZXRGdWxseVF1YWxpZmllZE5hbWVJRCggImFsaWFzIiArCisJCQkJZnFuSUQuc3Vic3RyKGZxbklELmZpbmQoJzonKSkgKTsKKworCQlyZXR1cm4oIGFuRXhlY3V0YWJsZS0+c2F2ZUFsaWFzKGFsaWFzSW5zdGFuY2UpICk7CisJfQorCisJcmV0dXJuKCBzZWFyY2hCdWZmZXJJbnN0YW5jZUFsaWFzKGFuRXhlY3V0YWJsZSwgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEKSApOworfQorCisKK2NvbnN0IFN5bWJvbCAmIFN5bWJvbFRhYmxlOjpzZWFyY2hCdWZmZXJJbnN0YW5jZUJ5UXVhbGlmaWVkTmFtZUlEKAorCQlFeGVjdXRhYmxlRm9ybSAqIGFuRXhlYywgY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKSBjb25zdAoreworCWZvciggOyBhbkV4ZWMgIT0gTlVMTCA7IGFuRXhlYyA9IGFuRXhlYy0+Z2V0RXhlY3V0YWJsZUNvbnRhaW5lcigpICkKKwl7CisJCWNvbnN0IFN5bWJvbCAmIGFuSW5zdGFuY2UgPQorCQkJCWFuRXhlYy0+Z2V0QnVmZmVyKCkuZ2V0QnlRdWFsaWZpZWROYW1lSUQoYVF1YWxpZmllZE5hbWVJRCk7CisJCWlmKCBhbkluc3RhbmNlLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGFuSW5zdGFuY2UgKTsKKwkJfQorCX0KKworCXJldHVybiggU3ltYm9sOjpSRUZfTlVMTCApOworfQorCisKK2NvbnN0IFN5bWJvbCAmIFN5bWJvbFRhYmxlOjpzZWFyY2hCdWZmZXJJbnN0YW5jZUJ5TmFtZUlEKAorCQlFeGVjdXRhYmxlRm9ybSAqIGFuRXhlYywgY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKSBjb25zdAoreworCWZvciggOyBhbkV4ZWMgIT0gTlVMTCA7IGFuRXhlYyA9IGFuRXhlYy0+Z2V0RXhlY3V0YWJsZUNvbnRhaW5lcigpICkKKwl7CisJCWNvbnN0IFN5bWJvbCAmIGZvdW5kSW5zdGFuY2UgPQorCQkJCWFuRXhlYy0+Z2V0QnVmZmVyKCkuZ2V0QnlOYW1lSUQoYU5hbWVJRCk7CisJCWlmKCBmb3VuZEluc3RhbmNlLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kSW5zdGFuY2UgKTsKKwkJfQorCX0KKworCXJldHVybiggU3ltYm9sOjpSRUZfTlVMTCApOworfQorCisKK2NvbnN0IFN5bWJvbCAmIFN5bWJvbFRhYmxlOjpzZWFyY2hCdWZmZXJJbnN0YW5jZUFsaWFzKAorCQlFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZSwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQpCit7CisJc3RkOjpzdHJpbmcgZnFuUHJlZml4ID0gYUZ1bGx5UXVhbGlmaWVkTmFtZUlELnN1YnN0cigwLAorCQkJYUZ1bGx5UXVhbGlmaWVkTmFtZUlELmZpbmRfbGFzdF9vZignLicpKTsKKworCXN0ZDo6c3RyaW5nIGFsaWFzRlFOOworCisJVmVjdG9yT2ZJbnN0YW5jZU9mTWFjaGluZSB0aGVJbnN0YW5jZU9mTWFjaGluZVBhdGg7CisKKwlFeGVjdXRhYmxlRm9ybSAqIHRtcEV4ZWN1dGFibGUgPSBhbkV4ZWN1dGFibGU7CisKKwlTeW1ib2wgYU1hY2hpbmU7CisKKwlmb3IoIDsgdG1wRXhlY3V0YWJsZSAhPSBOVUxMIDsKKwkJCXRtcEV4ZWN1dGFibGUgPSB0bXBFeGVjdXRhYmxlLT5nZXRFeGVjdXRhYmxlQ29udGFpbmVyKCkgKQorCXsKKwkJaWYoICgoYU1hY2hpbmUgPSB0bXBFeGVjdXRhYmxlLT5nZXRJbnN0YW5jZVN0YXRpYygpLmdldEJ5RlFOYW1lSUQoCisJCQkJZnFuUHJlZml4KSkudmFsaWQoKSkKKwkJfHwgKChhTWFjaGluZSA9IHRtcEV4ZWN1dGFibGUtPmdldEluc3RhbmNlU3RhdGljKCkuCisJCQkJZ2V0QnlRdWFsaWZpZWROYW1lSUQoZnFuUHJlZml4KSkudmFsaWQoKSkgKQorCQl7CisJCQl0aGVJbnN0YW5jZU9mTWFjaGluZVBhdGguYXBwZW5kKCBhTWFjaGluZS5yYXdNYWNoaW5lKCkgKTsKKworCQkJdG1wRXhlY3V0YWJsZSA9IGFNYWNoaW5lLmdldEV4ZWN1dGFibGUoKTsKKworCQkJYWxpYXNGUU4gPSBhTWFjaGluZS5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOworCisJCQlicmVhazsKKwkJfQorCX0KKworCWlmKCBhTWFjaGluZS5pbnZhbGlkKCkgKQorCXsKKwkJZnFuUHJlZml4ID0gYUZ1bGx5UXVhbGlmaWVkTmFtZUlELnN1YnN0cigwLAorCQkJCWFGdWxseVF1YWxpZmllZE5hbWVJRC5maW5kKCcuJykpOworCQl0bXBFeGVjdXRhYmxlID0gTlVMTDsKKworCQlUYWJsZU9mRXhlY3V0YWJsZUZvcm06OmNvbnN0X3Jhd19pdGVyYXRvciBpdEV4ZWMgPQorCQkJCW1Db25maWd1cmF0aW9uLmdldEV4ZWN1dGFibGVTeXN0ZW0oKS5nZXRFeGVjdXRhYmxlcygpLmJlZ2luKCk7CisJCVRhYmxlT2ZFeGVjdXRhYmxlRm9ybTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGVuZEV4ZWMgPQorCQkJCW1Db25maWd1cmF0aW9uLmdldEV4ZWN1dGFibGVTeXN0ZW0oKS5nZXRFeGVjdXRhYmxlcygpLmVuZCgpOworCQlmb3IoIDsgaXRFeGVjICE9IGVuZEV4ZWMgOyArK2l0RXhlYyApCisJCXsKKwkJCWlmKCAoaXRFeGVjKS0+Z2V0QXN0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA9PSBmcW5QcmVmaXggKQorCQkJeworCQkJCXRtcEV4ZWN1dGFibGUgPSAoaXRFeGVjKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UgaWYoIE5hbWVkRWxlbWVudDo6Y29tcGFyZUxvY2F0aW9uKAorCQkJCQkoaXRFeGVjKS0+Z2V0QXN0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSwgZnFuUHJlZml4KSApCisJCQl7CisJCQkJdG1wRXhlY3V0YWJsZSA9IChpdEV4ZWMpOworCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZSBpZiggKGl0RXhlYyktPmdldE5hbWVJRCgpID09IGZxblByZWZpeCApCisJCQl7CisJCQkJdG1wRXhlY3V0YWJsZSA9IChpdEV4ZWMpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYoIHRtcEV4ZWN1dGFibGUgIT0gTlVMTCApCisJeworCQlMaXN0T2ZTdHJpbmcgc3RyTGlzdDsKKworCQlOYW1lZEVsZW1lbnQ6OmNvbGxlY3ROYW1lSUQoc3RyTGlzdCwKKwkJCQlhRnVsbHlRdWFsaWZpZWROYW1lSUQsIGZxblByZWZpeC5zaXplKCkgKyAxKTsKKworCQlpZiggc3RyTGlzdC5zaW5nbGV0b24oKSApCisJCXsKKwkJCWFsaWFzRlFOID0gYWxpYXNGUU4gKyAnLicgKyBzdHJMaXN0LmZpcnN0KCk7CisJCQlmcW5QcmVmaXggPSB0bXBFeGVjdXRhYmxlLT5nZXRBc3RGdWxseVF1YWxpZmllZE5hbWVJRCgpICsKKwkJCQkJJy4nICsgc3RyTGlzdC5wb3BfZmlyc3QoKTsKKworCQkJaWYoIHRtcEV4ZWN1dGFibGUtPmdldEJ1ZmZlcigpLmdldEJ5RlFOYW1lSUQoZnFuUHJlZml4KS5pbnZhbGlkKCkgKQorCQkJeworCQkJCXRtcEV4ZWN1dGFibGUgPSBOVUxMOworCQkJfQorCQl9CisKKwkJd2hpbGUoIHN0ckxpc3QucG9wdWxhdGVkKCkgJiYgKHRtcEV4ZWN1dGFibGUgIT0gTlVMTCkgKQorCQl7CisJCQlmcW5QcmVmaXggPSB0bXBFeGVjdXRhYmxlLT5nZXRBc3RGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQkJCSsgJy4nICsgc3RyTGlzdC5wb3BfZmlyc3QoKTsKKworCQkJYU1hY2hpbmUgPSB0bXBFeGVjdXRhYmxlLT5nZXRJbnN0YW5jZVN0YXRpYygpLgorCQkJCQlnZXRCeUZRTmFtZUlEKCBmcW5QcmVmaXggKTsKKwkJCWlmKCBhTWFjaGluZS52YWxpZCgpICkKKwkJCXsKKwkJCQlhbGlhc0ZRTiA9IGFNYWNoaW5lLmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7CisKKwkJCQl0aGVJbnN0YW5jZU9mTWFjaGluZVBhdGguYXBwZW5kKCBhTWFjaGluZS5yYXdNYWNoaW5lKCkgKTsKKworCQkJCXRtcEV4ZWN1dGFibGUgPSBhTWFjaGluZS5nZXRFeGVjdXRhYmxlKCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYoIHRtcEV4ZWN1dGFibGUtPmdldEJ1ZmZlcigpLgorCQkJCQkJZ2V0QnlGUU5hbWVJRCggZnFuUHJlZml4ICkuaW52YWxpZCgpICkKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmKCB0bXBFeGVjdXRhYmxlICE9IE5VTEwgKQorCQl7CisJCQl3aGlsZSggc3RyTGlzdC5ub25lbXB0eSgpICkKKwkJCXsKKwkJCQlhbGlhc0ZRTiA9IGFsaWFzRlFOICsgJy4nICsgc3RyTGlzdC5maXJzdCgpOworCQkJCWZxblByZWZpeCA9IGZxblByZWZpeCArICcuJyArIHN0ckxpc3QucG9wX2ZpcnN0KCk7CisJCQl9CisKKwkJCWNvbnN0IFN5bWJvbCAmIGZvdW5kSW5zdGFuY2UgPQorCQkJCQl0bXBFeGVjdXRhYmxlLT5nZXRCdWZmZXIoKS5nZXRCeUZRTmFtZUlEKCBmcW5QcmVmaXggKTsKKworCQkJaWYoIGZvdW5kSW5zdGFuY2UudmFsaWQoKSApCisJCQl7CisJCQkJaWYoIGZvdW5kSW5zdGFuY2UuZ2V0TW9kaWZpZXIoKS5pc1Zpc2liaWxpdHlQdWJsaWMoKSApCisJCQkJeworCQkJCQlyZXR1cm4oIGNyZWF0ZUJ1ZmZlckluc3RhbmNlQWxpYXMoYW5FeGVjdXRhYmxlLCBhbGlhc0ZRTiwKKwkJCQkJCQlmb3VuZEluc3RhbmNlLnJhd0J1ZmZlcigpLCB0aGVJbnN0YW5jZU9mTWFjaGluZVBhdGgpICk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWluY3JFcnJvckNvdW50KCk7CisJCQkJCUVSUk9SX09TIDw8ICJJbGxlZ2FsIGFjY2VzIG9mIHRoZSBOT04tUFVCTElDIGluc3RhbmNlIDw8ICIKKwkJCQkJCQk8PCBhRnVsbHlRdWFsaWZpZWROYW1lSUQgPDwgIiA+PiAhISEiOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCisJcmV0dXJuKCBTeW1ib2w6OlJFRl9OVUxMICk7Cit9CisKKworCitjb25zdCBTeW1ib2wgJiBTeW1ib2xUYWJsZTo6Y3JlYXRlQnVmZmVySW5zdGFuY2VBbGlhcyhFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZSwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQsIEluc3RhbmNlT2ZCdWZmZXIgKiBhbkluc3RhbmNlLAorCQlWZWN0b3JPZkluc3RhbmNlT2ZNYWNoaW5lICYgdGhlSW5zdGFuY2VPZk1hY2hpbmVQYXRoKQoreworCWNvbnN0IEV4ZWN1dGFibGVGb3JtICogbGNhRXhlY3V0YWJsZSA9IGFuRXhlY3V0YWJsZS0+TENSQSgKKwkJCXRoZUluc3RhbmNlT2ZNYWNoaW5lUGF0aC5sYXN0KCktPmdldENvbnRhaW5lcigpLT5nZXRFeGVjdXRhYmxlKCkgKTsKKworCWlmKCBsY2FFeGVjdXRhYmxlICE9IE5VTEwgKQorCXsKKwkJaWYoIGxjYUV4ZWN1dGFibGUtPmhhc0NvbnRhaW5lcigpCisJCQkmJiAodGhlSW5zdGFuY2VPZk1hY2hpbmVQYXRoLmZpcnN0KCkKKwkJCQkhPSBtQ29uZmlndXJhdGlvbi5nZXRFeGVjdXRhYmxlU3lzdGVtKCkucmF3U3lzdGVtSW5zdGFuY2UoKSkgKQorCQl7CisJCQl3aGlsZSggdGhlSW5zdGFuY2VPZk1hY2hpbmVQYXRoLmZpcnN0KCktPmdldEV4ZWN1dGFibGUoKQorCQkJCQkhPSBsY2FFeGVjdXRhYmxlICkKKwkJCXsKKwkJCQl0aGVJbnN0YW5jZU9mTWFjaGluZVBhdGgucmVtb3ZlX2ZpcnN0KCk7CisJCQl9CisJCQlpZiggbGNhRXhlY3V0YWJsZSA9PSBhbkV4ZWN1dGFibGUgKQorCQkJeworCQkJCXRoZUluc3RhbmNlT2ZNYWNoaW5lUGF0aC5yZW1vdmVfZmlyc3QoKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCS8vISEgTk9USElORworCQl9CisKKwkJSW5zdGFuY2VPZkJ1ZmZlciAqIGFsaWFzSW5zdGFuY2UoIG5ldyBJbnN0YW5jZU9mQnVmZmVyKAorCQkJCWFuRXhlY3V0YWJsZSwgYW5JbnN0YW5jZSwgdGhlSW5zdGFuY2VPZk1hY2hpbmVQYXRoKSApOworCisJCWFsaWFzSW5zdGFuY2UtPnNldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCAiYWxpYXMiICsKKwkJCQlhRnVsbHlRdWFsaWZpZWROYW1lSUQuc3Vic3RyKGFGdWxseVF1YWxpZmllZE5hbWVJRC5maW5kKCc6JykpICk7CisKKwkJcmV0dXJuKCBhbkV4ZWN1dGFibGUtPnNhdmVBbGlhcyhhbGlhc0luc3RhbmNlKSApOworCX0KKworCXJldHVybiggU3ltYm9sOjpSRUZfTlVMTCApOworfQorCisKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTRUFSQ0ggQ09OTkVDVCBTWU1CT0wgSU5TVEFOQ0UKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworY29uc3QgU3ltYm9sICYgU3ltYm9sVGFibGU6OnNlYXJjaENvbm5lY3Rvckluc3RhbmNlKAorCQlFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZSwgY29uc3QgT2JqZWN0RWxlbWVudCAqIG9iakVsZW1lbnQpIGNvbnN0Cit7CisJLy8gU0VBUkNIIE9OIENVUlJFTlQgQlVGRkVSIExJU1QKKwl7CisJCWNvbnN0IFN5bWJvbCAmIGFuSW5zdGFuY2UgPQorCQkJCWFuRXhlY3V0YWJsZS0+Z2V0Q29ubmVjdCgpLmdldEJ5QXN0RWxlbWVudChvYmpFbGVtZW50KTsKKwkJaWYoIGFuSW5zdGFuY2UudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggYW5JbnN0YW5jZSApOworCQl9CisJfQorCisJLy8gU0VBUkNIIE9OIENVUlJFTlQgQUxJQVMgQlVGRkVSIExJU1QKKwl7CisJCWNvbnN0IFN5bWJvbCAmIGFuSW5zdGFuY2UgPQorCQkJCWFuRXhlY3V0YWJsZS0+Z2V0QWxpYXMoKS5nZXRCeUFzdEVsZW1lbnQob2JqRWxlbWVudCk7CisJCWlmKCBhbkluc3RhbmNlLmlzPCBJbnN0YW5jZU9mQ29ubmVjdCA+KCkgKQorCQl7CisJCQlyZXR1cm4oIGFuSW5zdGFuY2UgKTsKKwkJfQorCX0KKworCisJLy8gU0VBUkNIIE9OIENVUlJFTlQgTU9ERUwgQ0hJTEQgQlVGRkVSIExJU1QgJiBNQUtFIEFOIEFMSUFTCisJU3ltYm9sIGJmQ29ubmVjdDsKKworCVRhYmxlT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGl0TWFjaGluZSA9IGFuRXhlY3V0YWJsZS0+aW5zdGFuY2VfbW9kZWxfYmVnaW4oKTsKKwlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBpdEVuZCA9IGFuRXhlY3V0YWJsZS0+aW5zdGFuY2VfbW9kZWxfZW5kKCk7CisJZm9yKCA7IGl0TWFjaGluZSAhPSBpdEVuZCA7ICsraXRNYWNoaW5lICkKKwl7CisJCWJmQ29ubmVjdCA9ICgqaXRNYWNoaW5lKS5nZXRFeGVjdXRhYmxlKCktPgorCQkJCWdldENvbm5lY3QoKS5nZXRCeUFzdEVsZW1lbnQob2JqRWxlbWVudCk7CisJCWlmKCBiZkNvbm5lY3QudmFsaWQoKSApCisJCXsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYoIGJmQ29ubmVjdC52YWxpZCgpICkKKwl7CisJCVZlY3Rvck9mSW5zdGFuY2VPZk1hY2hpbmUgdGhlSW5zdGFuY2VPZk1hY2hpbmVQYXRoOworCQl0aGVJbnN0YW5jZU9mTWFjaGluZVBhdGguYXBwZW5kKCAoKml0TWFjaGluZSkucmF3TWFjaGluZSgpICk7CisKKwkJSW5zdGFuY2VPZkNvbm5lY3QgKiBhbGlhc0luc3RhbmNlID0gbmV3IEluc3RhbmNlT2ZDb25uZWN0KAorCQkJCWFuRXhlY3V0YWJsZSwgYmZDb25uZWN0LnJhd0Nvbm5lY3QoKSwgdGhlSW5zdGFuY2VPZk1hY2hpbmVQYXRoICk7CisKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQgPQorCQkJCWJmQ29ubmVjdC5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOworCisJCWFsaWFzSW5zdGFuY2UtPnNldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCAiYWxpYXMiICsKKwkJCQlhRnVsbHlRdWFsaWZpZWROYW1lSUQuc3Vic3RyKGFGdWxseVF1YWxpZmllZE5hbWVJRC5maW5kKCc6JykpICk7CisKKwkJcmV0dXJuKCBhbkV4ZWN1dGFibGUtPnNhdmVBbGlhcyhhbGlhc0luc3RhbmNlKSApOworCX0KKworCXJldHVybiggc2VhcmNoQ29ubmVjdG9ySW5zdGFuY2Uob2JqRWxlbWVudCkgKTsKK30KKworCisKK2NvbnN0IFN5bWJvbCAmIFN5bWJvbFRhYmxlOjpzZWFyY2hDb25uZWN0b3JJbnN0YW5jZShFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZSwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQpIGNvbnN0Cit7CisJLy8gU0VBUkNIIE9OIENVUlJFTlQgQlVGRkVSIExJU1QKKwl7CisJCWNvbnN0IFN5bWJvbCAmIGFuSW5zdGFuY2UgPQorCQkJYW5FeGVjdXRhYmxlLT5nZXRDb25uZWN0KCkuZ2V0QnlGUU5hbWVJRCggYUZ1bGx5UXVhbGlmaWVkTmFtZUlEICk7CisJCWlmKCBhbkluc3RhbmNlLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGFuSW5zdGFuY2UgKTsKKwkJfQorCX0KKworCS8vIFNFQVJDSCBPTiBDVVJSRU5UIEFMSUFTIEJVRkZFUiBMSVNUCisJeworCQljb25zdCBTeW1ib2wgJiBhbkluc3RhbmNlID0KKwkJCQlhbkV4ZWN1dGFibGUtPmdldEFsaWFzKCkuZ2V0QnlGUU5hbWVJRCggYUZ1bGx5UXVhbGlmaWVkTmFtZUlEICk7CisJCWlmKCBhbkluc3RhbmNlLmlzPCBJbnN0YW5jZU9mQ29ubmVjdCA+KCkgKQorCQl7CisJCQlyZXR1cm4oIGFuSW5zdGFuY2UgKTsKKwkJfQorCX0KKworCS8vIFNFQVJDSCBPTiBDVVJSRU5UIE1PREVMIENISUxEIEJVRkZFUiBMSVNUICYgTUFLRSBBTiBBTElBUworCVN5bWJvbCBiZkNvbm5lY3Q7CisKKwlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBpdE1hY2hpbmUgPSBhbkV4ZWN1dGFibGUtPmluc3RhbmNlX21vZGVsX2JlZ2luKCk7CisJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgZW5kTWFjaGluZSA9IGFuRXhlY3V0YWJsZS0+aW5zdGFuY2VfbW9kZWxfZW5kKCk7CisJZm9yKCA7IGl0TWFjaGluZSAhPSBlbmRNYWNoaW5lIDsgKytpdE1hY2hpbmUgKQorCXsKKwkJYmZDb25uZWN0ID0gKCppdE1hY2hpbmUpLmdldEV4ZWN1dGFibGUoKS0+Z2V0Q29ubmVjdCgpLgorCQkJCWdldEJ5RlFOYW1lSUQoIGFGdWxseVF1YWxpZmllZE5hbWVJRCApOworCQlpZiggYmZDb25uZWN0LnZhbGlkKCkgKQorCQl7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmKCBiZkNvbm5lY3QudmFsaWQoKSApCisJeworCQlWZWN0b3JPZkluc3RhbmNlT2ZNYWNoaW5lIHRoZUluc3RhbmNlT2ZNYWNoaW5lUGF0aDsKKwkJdGhlSW5zdGFuY2VPZk1hY2hpbmVQYXRoLmFwcGVuZCggKCppdE1hY2hpbmUpLnJhd01hY2hpbmUoKSApOworCisJCUluc3RhbmNlT2ZDb25uZWN0ICogYWxpYXNJbnN0YW5jZSA9IG5ldyBJbnN0YW5jZU9mQ29ubmVjdCgKKwkJCQlhbkV4ZWN1dGFibGUsIGJmQ29ubmVjdC5yYXdDb25uZWN0KCksIHRoZUluc3RhbmNlT2ZNYWNoaW5lUGF0aCApOworCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEID0KKwkJCQliZkNvbm5lY3QuZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsKKworCQlhbGlhc0luc3RhbmNlLT5zZXRGdWxseVF1YWxpZmllZE5hbWVJRCggImFsaWFzIiArCisJCQkJYUZ1bGx5UXVhbGlmaWVkTmFtZUlELnN1YnN0cihhRnVsbHlRdWFsaWZpZWROYW1lSUQuZmluZCgnOicpKSApOworCisJCXJldHVybiggYW5FeGVjdXRhYmxlLT5zYXZlQWxpYXMoYWxpYXNJbnN0YW5jZSkgKTsKKwl9CisKKwlyZXR1cm4oIHNlYXJjaENvbm5lY3Rvckluc3RhbmNlKCBhRnVsbHlRdWFsaWZpZWROYW1lSUQgKSApOworfQorCisKK2NvbnN0IFN5bWJvbCAmIFN5bWJvbFRhYmxlOjpzZWFyY2hDb25uZWN0b3JJbnN0YW5jZUJ5UXVhbGlmaWVkTmFtZUlEKAorCQlFeGVjdXRhYmxlRm9ybSAqIGFuRXhlYywgY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKSBjb25zdAoreworCWZvciggOyBhbkV4ZWMgIT0gTlVMTCA7IGFuRXhlYyA9IGFuRXhlYy0+Z2V0RXhlY3V0YWJsZUNvbnRhaW5lcigpICkKKwl7CisJCWNvbnN0IFN5bWJvbCAmIGZvdW5kSW5zdGFuY2UgPQorCQkJCWFuRXhlYy0+Z2V0Q29ubmVjdCgpLmdldEJ5UXVhbGlmaWVkTmFtZUlEKGFRdWFsaWZpZWROYW1lSUQpOworCQlpZiggZm91bmRJbnN0YW5jZS52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCBmb3VuZEluc3RhbmNlICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIFN5bWJvbDo6UkVGX05VTEwgKTsKK30KKworCitjb25zdCBTeW1ib2wgJiBTeW1ib2xUYWJsZTo6c2VhcmNoQ29ubmVjdG9ySW5zdGFuY2VCeU5hbWVJRCgKKwkJRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWMsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkgY29uc3QKK3sKKwlmb3IoIDsgYW5FeGVjICE9IE5VTEwgOyBhbkV4ZWMgPSBhbkV4ZWMtPmdldEV4ZWN1dGFibGVDb250YWluZXIoKSApCisJeworCQljb25zdCBTeW1ib2wgJiBmb3VuZEluc3RhbmNlID0KKwkJCQlhbkV4ZWMtPmdldENvbm5lY3QoKS5nZXRCeU5hbWVJRChhTmFtZUlEKTsKKwkJaWYoIGZvdW5kSW5zdGFuY2UudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRJbnN0YW5jZSApOworCQl9CisJfQorCisJcmV0dXJuKCBTeW1ib2w6OlJFRl9OVUxMICk7Cit9CisKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTRUFSQ0ggTUFDSElORSBJTlNUQU5DRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworY29uc3QgU3ltYm9sICYgU3ltYm9sVGFibGU6OnNlYXJjaEluc3RhbmNlTW9kZWxCeU5hbWVJRCgKKwkJRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWMsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkgY29uc3QKK3sKKwlmb3IoIDsgYW5FeGVjICE9IE5VTEwgOyBhbkV4ZWMgPSBhbkV4ZWMtPmdldEV4ZWN1dGFibGVDb250YWluZXIoKSApCisJeworCQljb25zdCBTeW1ib2wgJiBmb3VuZEluc3RhbmNlID0KKwkJCQlhbkV4ZWMtPmdldEluc3RhbmNlTW9kZWwoKS5nZXRCeU5hbWVJRChhTmFtZUlEKTsKKwkJaWYoIGZvdW5kSW5zdGFuY2UudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRJbnN0YW5jZSApOworCQl9CisJfQorCisJcmV0dXJuKCBTeW1ib2w6OlJFRl9OVUxMICk7Cit9CisKK2NvbnN0IFN5bWJvbCAmIFN5bWJvbFRhYmxlOjpzZWFyY2hJbnN0YW5jZU1vZGVsQnlOYW1lSUQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkgY29uc3QKK3sKKwlyZXR1cm4oIHNlYXJjaEluc3RhbmNlTW9kZWxCeU5hbWVJRCgKKwkJCWFDVFgtPm1Db21waWxlQ3R4LT5nZXRFeGVjdXRhYmxlKCksIGFOYW1lSUQpICk7Cit9CisKKworY29uc3QgU3ltYm9sICYgU3ltYm9sVGFibGU6OnNlYXJjaE1hY2hpbmVJbnN0YW5jZUJ5TmFtZUlEKAorCQlFeGVjdXRhYmxlRm9ybSAqIGFuRXhlYywgY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKSBjb25zdAoreworCWZvciggOyBhbkV4ZWMgIT0gTlVMTCA7IGFuRXhlYyA9IGFuRXhlYy0+Z2V0RXhlY3V0YWJsZUNvbnRhaW5lcigpICkKKwl7CisJCWNvbnN0IFN5bWJvbCAmIGZvdW5kSW5zdGFuY2UgPQorCQkJCWFuRXhlYy0+Z2V0SW5zdGFuY2VTdGF0aWMoKS5nZXRCeU5hbWVJRChhTmFtZUlEKTsKKwkJaWYoIGZvdW5kSW5zdGFuY2UudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRJbnN0YW5jZSApOworCQl9CisJfQorCisJcmV0dXJuKCBTeW1ib2w6OlJFRl9OVUxMICk7Cit9CisKK2NvbnN0IFN5bWJvbCAmIFN5bWJvbFRhYmxlOjpzZWFyY2hNYWNoaW5lSW5zdGFuY2VCeU5hbWVJRCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKSBjb25zdAoreworCXJldHVybiggc2VhcmNoTWFjaGluZUluc3RhbmNlQnlOYW1lSUQoCisJCQlhQ1RYLT5tQ29tcGlsZUN0eC0+Z2V0RXhlY3V0YWJsZSgpLCBhTmFtZUlEKSApOworfQorCisKKy8qKgorICogU0VBUkNICisgKiBmb3IgTWFjaGluZSBJbnN0YW5jZQorICovCitjb25zdCBTeW1ib2wgJiBTeW1ib2xUYWJsZTo6c2VhcmNoSW5zdGFuY2VNb2RlbCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgT2JqZWN0RWxlbWVudCAqIGFzdEVsZW1lbnQpIGNvbnN0Cit7CisJRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWMgPSBhQ1RYLT5tQ29tcGlsZUN0eC0+Z2V0RXhlY3V0YWJsZSgpOworCisJZm9yKCA7IGFuRXhlYyAhPSBOVUxMIDsgYW5FeGVjID0gYW5FeGVjLT5nZXRFeGVjdXRhYmxlQ29udGFpbmVyKCkgKQorCXsKKwkJY29uc3QgU3ltYm9sICYgZm91bmRJbnN0YW5jZSA9CisJCQkJYW5FeGVjLT5nZXRCeUFzdEluc3RhbmNlTW9kZWwoYXN0RWxlbWVudCk7CisJCWlmKCBmb3VuZEluc3RhbmNlLnZhbGlkKCkgJiYgZm91bmRJbnN0YW5jZS5tYWNoaW5lKCkuaXNub3RUaGlzKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kSW5zdGFuY2UgKTsKKwkJfQorCX0KKworCXJldHVybiggc2VhcmNoSW5zdGFuY2VTdGF0aWMoIGFzdEVsZW1lbnQgKSApOworfQorCisKK2NvbnN0IFN5bWJvbCAmIFN5bWJvbFRhYmxlOjpzZWFyY2hJbnN0YW5jZVN0YXRpYygKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgT2JqZWN0RWxlbWVudCAqIGFzdEVsZW1lbnQpIGNvbnN0Cit7CisJRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWMgPSBhQ1RYLT5tQ29tcGlsZUN0eC0+Z2V0RXhlY3V0YWJsZSgpOworCisJZm9yKCA7IGFuRXhlYyAhPSBOVUxMIDsgYW5FeGVjID0gYW5FeGVjLT5nZXRFeGVjdXRhYmxlQ29udGFpbmVyKCkgKQorCXsKKwkJY29uc3QgU3ltYm9sICYgZm91bmRJbnN0YW5jZSA9CisJCQkJYW5FeGVjLT5nZXRCeUFzdEluc3RhbmNlU3RhdGljKGFzdEVsZW1lbnQpOworCQlpZiggZm91bmRJbnN0YW5jZS52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCBmb3VuZEluc3RhbmNlICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIHNlYXJjaEluc3RhbmNlU3RhdGljKCBhc3RFbGVtZW50ICkgKTsKK30KKworCitjb25zdCBTeW1ib2wgJiBTeW1ib2xUYWJsZTo6c2VhcmNoSW5zdGFuY2VEeW5hbWljKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBPYmplY3RFbGVtZW50ICogYXN0RWxlbWVudCkgY29uc3QKK3sKKwlFeGVjdXRhYmxlRm9ybSAqIGFuRXhlYyA9IGFDVFgtPm1Db21waWxlQ3R4LT5nZXRFeGVjdXRhYmxlKCk7CisKKwlmb3IoIDsgYW5FeGVjICE9IE5VTEwgOyBhbkV4ZWMgPSBhbkV4ZWMtPmdldEV4ZWN1dGFibGVDb250YWluZXIoKSApCisJeworCQljb25zdCBTeW1ib2wgJiBmb3VuZEluc3RhbmNlID0KKwkJCQlhbkV4ZWMtPmdldEJ5QXN0SW5zdGFuY2VEeW5hbWljKGFzdEVsZW1lbnQpOworCQlpZiggZm91bmRJbnN0YW5jZS52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCBmb3VuZEluc3RhbmNlICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIHNlYXJjaEluc3RhbmNlU3RhdGljKCBhc3RFbGVtZW50ICkgKTsKK30KKworCisKKworSW5zdGFuY2VPZk1hY2hpbmUgKiBTeW1ib2xUYWJsZTo6c2VhcmNoSW5zdGFuY2VTdGF0aWMoCisJCWNvbnN0IE9iamVjdEVsZW1lbnQgKiBmcm9tTWFjaGluZSwgY29uc3QgVW5pRm9ybUlkZW50aWZpZXIgJiBhblVGSSkKK3sKKwkvLyBSRVNFVCBFUlJPUgorCXJlc2V0RXJyb3IoKTsKKworCUJGTGlzdCBsaXN0b2ZNYWNoaW5lOworCXNlYXJjaEluc3RhbmNlU3RhdGljKAorCQkJZnJvbU1hY2hpbmUtPmdldENvbnRhaW5lck1hY2hpbmUoKSwgYW5VRkksIGxpc3RvZk1hY2hpbmUpOworCisJaWYoIGxpc3RvZk1hY2hpbmUucG9wdWxhdGVkKCkgKQorCXsKKwkJaW5jckVycm9yQ291bnQoKTsKKwkJRVJST1JfT1MgPDwgIlRvbyBtb3JlIHN0YXRlbWFjaGluZSA8PCAiCisJCQkJPDwgYW5VRkkuc3RyKCkgPDwgIiA+PiBhcmUgZm91bmQgISI7CisKKwkJcmV0dXJuKCBsaXN0b2ZNYWNoaW5lLmZpcnN0KCkudG9fcHRyPCBJbnN0YW5jZU9mTWFjaGluZSA+KCkgKTsKKwl9CisJZWxzZSBpZiggbGlzdG9mTWFjaGluZS5ub25lbXB0eSgpICkKKwl7CisJCXJldHVybiggbGlzdG9mTWFjaGluZS5maXJzdCgpLnRvX3B0cjwgSW5zdGFuY2VPZk1hY2hpbmUgPigpICk7CisJfQorCWVsc2UKKwl7CisJCWluY3JFcnJvckNvdW50KCk7CisJCUVSUk9SX09TIDw8ICJVbmZvdW5kIHN0YXRlbWFjaGluZSA8PCAiCisJCQkJPDwgYW5VRkkuc3RyKCkgPDwgIiA+PiAhIjsKKworCQlyZXR1cm4oIE5VTEwgKTsKKwl9Cit9CisKK3ZvaWQgU3ltYm9sVGFibGU6OnNlYXJjaEluc3RhbmNlU3RhdGljKGNvbnN0IE9iamVjdEVsZW1lbnQgKiByZWZNYWNoaW5lLAorCQljb25zdCBVbmlGb3JtSWRlbnRpZmllciAmIGFuVUZJLCBCRkxpc3QgJiBmb3VuZExpc3QpIGNvbnN0Cit7CisJc3RkOjpzdHJpbmcgc3RyVUZJID0gYW5VRkkuc3RyKCk7CisJU3ltYm9sUHJlZGljYXRlQnlDb21waWxlZEZRTmFtZUlEIHByZWQoc3RyVUZJKTsKKworCWlmKCBub3QgYW5VRkkuaGFzTG9jYXRvcigpICkKKwl7CisJCXN0ZDo6c3RyaW5nIHJlZlVmaSA9IHJlZk1hY2hpbmUtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7CisJCXJlZlVmaSA9IHJlZlVmaS5zdWJzdHIoCisJCQkJcmVmVWZpLmZpbmQoRlFOX0lEX1JPT1RfU0VQQVJBVE9SKSwgcmVmVWZpLnNpemUoKSk7CisKKwkJcHJlZC5tUXVhbGlmaWVkTmFtZUlEID0gcmVmVWZpICsgJy4nICsgc3RyVUZJOworCQlzZWFyY2hDb21waWxlZEVsZW1lbnQobUxpc3RPZkluc3RhbmNlU3RhdGljLCBwcmVkLCBmb3VuZExpc3QpOworCisJCWlmKCBhblVGSS5wb3B1bGF0ZWQoKSApCisJCXsKKwkJCXN0ZDo6c3RyaW5nIGNvbW1vbkFuY2VzdG9yID0gYW5VRkkuZmlyc3QoKS5zdHIoKTsKKworCQkJc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBwb3M7CisJCQl3aGlsZSggKHBvcyA9IHJlZlVmaS5yZmluZChjb21tb25BbmNlc3RvcikpICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKwkJCXsKKwkJCQlyZWZVZmkgPSByZWZVZmkuc3Vic3RyKDAsIHBvcyk7CisJCQkJcHJlZC5tUXVhbGlmaWVkTmFtZUlEID0gcmVmVWZpICsgc3RyVUZJOworCQkJCXNlYXJjaENvbXBpbGVkRWxlbWVudChtTGlzdE9mSW5zdGFuY2VTdGF0aWMsIHByZWQsIGZvdW5kTGlzdCk7CisJCQl9CisJCX0KKwl9CisJZWxzZQorCXsKKwkJc2VhcmNoQ29tcGlsZWRFbGVtZW50KG1MaXN0T2ZJbnN0YW5jZVN0YXRpYywgcHJlZCwgZm91bmRMaXN0KTsKKwl9Cit9CisKKwordm9pZCBTeW1ib2xUYWJsZTo6c2VhcmNoSW5zdGFuY2VCeU5hbWVJRChDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsIEJGTGlzdCAmIGZvdW5kTGlzdCkgY29uc3QKK3sKKwlzd2l0Y2goIGFDVFgtPm1UeXBlLT5nZXRUeXBlU3BlY2lmaWVyS2luZCgpICkKKwl7CisJCWNhc2UgVFlQRV9NQUNISU5FX1NQRUNJRklFUjoKKwkJeworCQkJc2VhcmNoTWFjaGluZUluc3RhbmNlQnlOYW1lSUQoYU5hbWVJRCwgZm91bmRMaXN0KTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgVFlQRV9QT1JUX1NQRUNJRklFUjoKKwkJeworCQkJc2VhcmNoUG9ydEluc3RhbmNlQnlOYW1lSUQoYU5hbWVJRCwgZm91bmRMaXN0KTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgVFlQRV9TSUdOQUxfU1BFQ0lGSUVSOgorCQl7CisJCQlzZWFyY2hQb3J0SW5zdGFuY2VCeU5hbWVJRChhTmFtZUlELCBmb3VuZExpc3QpOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFRZUEVfQlVGRkVSX1NQRUNJRklFUjoKKwkJeworCQkJc2VhcmNoQnVmZmVySW5zdGFuY2VCeU5hbWVJRChhTmFtZUlELCBmb3VuZExpc3QpOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFRZUEVfQ09OTkVDVE9SX1NQRUNJRklFUjoKKwkJeworCQkJc2VhcmNoQ29ubmVjdG9ySW5zdGFuY2VCeU5hbWVJRChhTmFtZUlELCBmb3VuZExpc3QpOworCQkJYnJlYWs7CisJCX0KKworCisJCWNhc2UgVFlQRV9CT09MRUFOX1NQRUNJRklFUjoKKworCQljYXNlIFRZUEVfUE9TX0lOVEVHRVJfU1BFQ0lGSUVSOgorCQljYXNlIFRZUEVfVUlOVEVHRVJfU1BFQ0lGSUVSOgorCQljYXNlIFRZUEVfSU5URUdFUl9TUEVDSUZJRVI6CisKKwkJY2FzZSBUWVBFX1VSQVRJT05BTF9TUEVDSUZJRVI6CisJCWNhc2UgVFlQRV9SQVRJT05BTF9TUEVDSUZJRVI6CisKKwkJY2FzZSBUWVBFX1VGTE9BVF9TUEVDSUZJRVI6CisJCWNhc2UgVFlQRV9GTE9BVF9TUEVDSUZJRVI6CisKKwkJY2FzZSBUWVBFX1VSRUFMX1NQRUNJRklFUjoKKwkJY2FzZSBUWVBFX1JFQUxfU1BFQ0lGSUVSOgorCisJCWNhc2UgVFlQRV9FTlVNX1NQRUNJRklFUjoKKworCQljYXNlIFRZUEVfQ0hBUkFDVEVSX1NQRUNJRklFUjoKKwkJY2FzZSBUWVBFX1NUUklOR19TUEVDSUZJRVI6CisKKwkJY2FzZSBUWVBFX0NMT0NLX1NQRUNJRklFUjoKKwkJY2FzZSBUWVBFX1RJTUVfU1BFQ0lGSUVSOgorCQljYXNlIFRZUEVfQ09OVElOVU9VU19USU1FX1NQRUNJRklFUjoKKwkJY2FzZSBUWVBFX0RJU0NSRVRFX1RJTUVfU1BFQ0lGSUVSOgorCisJCWNhc2UgVFlQRV9JTlRFUlZBTF9TUEVDSUZJRVI6CisJCWNhc2UgVFlQRV9PUEVSQVRPUl9TUEVDSUZJRVI6CisJCWNhc2UgVFlQRV9BVk1DT0RFX1NQRUNJRklFUjoKKwkJY2FzZSBUWVBFX01FU1NBR0VfU1BFQ0lGSUVSOgorCQl7CisJCQlzZWFyY2hEYXRhSW5zdGFuY2VCeU5hbWVJRChhTmFtZUlELCBmb3VuZExpc3QpOworCisJCQlpZiggZm91bmRMaXN0LmVtcHR5KCkgKQorCQkJeworCQkJCXNlYXJjaFBvcnRJbnN0YW5jZUJ5TmFtZUlEKGFOYW1lSUQsIGZvdW5kTGlzdCk7CisKKwkJCQlzZWFyY2hNYWNoaW5lSW5zdGFuY2VCeU5hbWVJRChhTmFtZUlELCBmb3VuZExpc3QpOworCisJCQkJc2VhcmNoQnVmZmVySW5zdGFuY2VCeU5hbWVJRChhTmFtZUlELCBmb3VuZExpc3QpOworCisJCQkJc2VhcmNoQ29ubmVjdG9ySW5zdGFuY2VCeU5hbWVJRChhTmFtZUlELCBmb3VuZExpc3QpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlzZWFyY2hEYXRhSW5zdGFuY2VCeU5hbWVJRChhTmFtZUlELCBmb3VuZExpc3QpOworCisJCQlzZWFyY2hQb3J0SW5zdGFuY2VCeU5hbWVJRChhTmFtZUlELCBmb3VuZExpc3QpOworCisJCQlzZWFyY2hNYWNoaW5lSW5zdGFuY2VCeU5hbWVJRChhTmFtZUlELCBmb3VuZExpc3QpOworCisJCQlzZWFyY2hCdWZmZXJJbnN0YW5jZUJ5TmFtZUlEKGFOYW1lSUQsIGZvdW5kTGlzdCk7CisKKwkJCXNlYXJjaENvbm5lY3Rvckluc3RhbmNlQnlOYW1lSUQoYU5hbWVJRCwgZm91bmRMaXN0KTsKKworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiggZm91bmRMaXN0LmVtcHR5KCkgKQorCXsKKwkJc2VhcmNoRGF0YUluc3RhbmNlQnlOYW1lSUQoYU5hbWVJRCwgZm91bmRMaXN0KTsKKwl9Cit9CisKKworCit2b2lkIFN5bWJvbFRhYmxlOjpzZWFyY2hJbnN0YW5jZUJ5UXVhbGlmaWVkTmFtZUlEKENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCwgQkZMaXN0ICYgZm91bmRMaXN0KSBjb25zdAoreworCXN3aXRjaCggYUNUWC0+bVR5cGUtPmdldFR5cGVTcGVjaWZpZXJLaW5kKCkgKQorCXsKKwkJY2FzZSBUWVBFX01BQ0hJTkVfU1BFQ0lGSUVSOgorCQl7CisJCQlzZWFyY2hNYWNoaW5lSW5zdGFuY2VCeVF1YWxpZmllZE5hbWVJRChhUXVhbGlmaWVkTmFtZUlELCBmb3VuZExpc3QpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBUWVBFX1BPUlRfU1BFQ0lGSUVSOgorCQl7CisJCQlzZWFyY2hQb3J0SW5zdGFuY2VCeVF1YWxpZmllZE5hbWVJRChhUXVhbGlmaWVkTmFtZUlELCBmb3VuZExpc3QpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBUWVBFX1NJR05BTF9TUEVDSUZJRVI6CisJCXsKKwkJCXNlYXJjaFBvcnRJbnN0YW5jZUJ5UXVhbGlmaWVkTmFtZUlEKGFRdWFsaWZpZWROYW1lSUQsIGZvdW5kTGlzdCk7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgVFlQRV9CVUZGRVJfU1BFQ0lGSUVSOgorCQl7CisJCQlzZWFyY2hCdWZmZXJJbnN0YW5jZUJ5UXVhbGlmaWVkTmFtZUlEKGFRdWFsaWZpZWROYW1lSUQsIGZvdW5kTGlzdCk7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgVFlQRV9DT05ORUNUT1JfU1BFQ0lGSUVSOgorCQl7CisJCQlzZWFyY2hDb25uZWN0b3JJbnN0YW5jZUJ5UXVhbGlmaWVkTmFtZUlEKGFRdWFsaWZpZWROYW1lSUQsIGZvdW5kTGlzdCk7CisJCQlicmVhazsKKwkJfQorCisKKwkJY2FzZSBUWVBFX0JPT0xFQU5fU1BFQ0lGSUVSOgorCisJCWNhc2UgVFlQRV9QT1NfSU5URUdFUl9TUEVDSUZJRVI6CisJCWNhc2UgVFlQRV9VSU5URUdFUl9TUEVDSUZJRVI6CisJCWNhc2UgVFlQRV9JTlRFR0VSX1NQRUNJRklFUjoKKworCQljYXNlIFRZUEVfVVJBVElPTkFMX1NQRUNJRklFUjoKKwkJY2FzZSBUWVBFX1JBVElPTkFMX1NQRUNJRklFUjoKKworCQljYXNlIFRZUEVfVUZMT0FUX1NQRUNJRklFUjoKKwkJY2FzZSBUWVBFX0ZMT0FUX1NQRUNJRklFUjoKKworCQljYXNlIFRZUEVfVVJFQUxfU1BFQ0lGSUVSOgorCQljYXNlIFRZUEVfUkVBTF9TUEVDSUZJRVI6CisKKwkJY2FzZSBUWVBFX0VOVU1fU1BFQ0lGSUVSOgorCisJCWNhc2UgVFlQRV9DSEFSQUNURVJfU1BFQ0lGSUVSOgorCQljYXNlIFRZUEVfU1RSSU5HX1NQRUNJRklFUjoKKworCQljYXNlIFRZUEVfQ0xPQ0tfU1BFQ0lGSUVSOgorCQljYXNlIFRZUEVfVElNRV9TUEVDSUZJRVI6CisJCWNhc2UgVFlQRV9DT05USU5VT1VTX1RJTUVfU1BFQ0lGSUVSOgorCQljYXNlIFRZUEVfRElTQ1JFVEVfVElNRV9TUEVDSUZJRVI6CisKKwkJY2FzZSBUWVBFX0lOVEVSVkFMX1NQRUNJRklFUjoKKwkJY2FzZSBUWVBFX09QRVJBVE9SX1NQRUNJRklFUjoKKwkJY2FzZSBUWVBFX0FWTUNPREVfU1BFQ0lGSUVSOgorCQljYXNlIFRZUEVfTUVTU0FHRV9TUEVDSUZJRVI6CisJCXsKKwkJCXNlYXJjaERhdGFJbnN0YW5jZUJ5UXVhbGlmaWVkTmFtZUlEKGFRdWFsaWZpZWROYW1lSUQsIGZvdW5kTGlzdCk7CisKKwkJCWlmKCBmb3VuZExpc3QuZW1wdHkoKSApCisJCQl7CisJCQkJc2VhcmNoUG9ydEluc3RhbmNlQnlRdWFsaWZpZWROYW1lSUQoYVF1YWxpZmllZE5hbWVJRCwgZm91bmRMaXN0KTsKKworCQkJCXNlYXJjaE1hY2hpbmVJbnN0YW5jZUJ5UXVhbGlmaWVkTmFtZUlEKGFRdWFsaWZpZWROYW1lSUQsIGZvdW5kTGlzdCk7CisKKwkJCQlzZWFyY2hCdWZmZXJJbnN0YW5jZUJ5UXVhbGlmaWVkTmFtZUlEKGFRdWFsaWZpZWROYW1lSUQsIGZvdW5kTGlzdCk7CisKKwkJCQlzZWFyY2hDb25uZWN0b3JJbnN0YW5jZUJ5UXVhbGlmaWVkTmFtZUlEKGFRdWFsaWZpZWROYW1lSUQsIGZvdW5kTGlzdCk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCXNlYXJjaERhdGFJbnN0YW5jZUJ5UXVhbGlmaWVkTmFtZUlEKGFRdWFsaWZpZWROYW1lSUQsIGZvdW5kTGlzdCk7CisKKwkJCXNlYXJjaFBvcnRJbnN0YW5jZUJ5UXVhbGlmaWVkTmFtZUlEKGFRdWFsaWZpZWROYW1lSUQsIGZvdW5kTGlzdCk7CisKKwkJCXNlYXJjaE1hY2hpbmVJbnN0YW5jZUJ5UXVhbGlmaWVkTmFtZUlEKGFRdWFsaWZpZWROYW1lSUQsIGZvdW5kTGlzdCk7CisKKwkJCXNlYXJjaEJ1ZmZlckluc3RhbmNlQnlRdWFsaWZpZWROYW1lSUQoYVF1YWxpZmllZE5hbWVJRCwgZm91bmRMaXN0KTsKKworCQkJc2VhcmNoQ29ubmVjdG9ySW5zdGFuY2VCeVF1YWxpZmllZE5hbWVJRChhUXVhbGlmaWVkTmFtZUlELCBmb3VuZExpc3QpOworCisJCQlicmVhazsKKwkJfQorCX0KKworCWlmKCBmb3VuZExpc3QuZW1wdHkoKSApCisJeworCQlzZWFyY2hEYXRhSW5zdGFuY2VCeU5hbWVJRChhUXVhbGlmaWVkTmFtZUlELCBmb3VuZExpc3QpOworCX0KK30KKworCisvKioKKyAqIFNFQVJDSAorICogZm9yIERhdGFGYWN0b3J5LCBQb3J0IG9yIE1hY2hpbmUKKyAqLworY29uc3QgQkYgJiBTeW1ib2xUYWJsZTo6c2VhcmNoSW5zdGFuY2UoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IE9iamVjdEVsZW1lbnQgKiBvYmpFbGVtZW50KQoreworCS8vIENBU0UgZm9ybSBpcyBhIFBPUlQKKwlpZiggb2JqRWxlbWVudC0+aXM8IFBvcnQgPigpICkKKwl7CisJCWNvbnN0IFN5bWJvbCAmIGZvdW5kSW5zdGFuY2UgPSBYUXVlcnkuZ2V0U2VtUG9ydEJ5QXN0RWxlbWVudCgKKwkJCQlhQ1RYLT5tQ29tcGlsZUN0eC0+Z2V0RXhlY3V0YWJsZSgpLCBvYmpFbGVtZW50KTsKKwkJaWYoIGZvdW5kSW5zdGFuY2UudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRJbnN0YW5jZSApOworCQl9CisJfQorCisJLy8gQ0FTRSBmb3JtIGlzIGEgW1NUQVRFXU1BQ0hJTkUKKwlpZiggb2JqRWxlbWVudC0+aXM8IE1hY2hpbmUgPigpICkKKwl7CisJCXsKKwkJCWNvbnN0IFN5bWJvbCAmIGZvdW5kSW5zdGFuY2UgPQorCQkJCQlzZWFyY2hJbnN0YW5jZVN0YXRpYyhhQ1RYLCBvYmpFbGVtZW50KTsKKwkJCWlmKCBmb3VuZEluc3RhbmNlLnZhbGlkKCkgKQorCQkJeworCQkJCXJldHVybiggZm91bmRJbnN0YW5jZSApOworCQkJfQorCQl9CisJCXsKKwkJCWNvbnN0IFN5bWJvbCAmIGZvdW5kSW5zdGFuY2UgPQorCQkJCQlzZWFyY2hJbnN0YW5jZU1vZGVsKGFDVFgsIG9iakVsZW1lbnQpOworCQkJaWYoIGZvdW5kSW5zdGFuY2UudmFsaWQoKSApCisJCQl7CisJCQkJcmV0dXJuKCBmb3VuZEluc3RhbmNlICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4oIHNlYXJjaEluc3RhbmNlU3RhdGljKG9iakVsZW1lbnQpICk7CisJfQorCisJLy8gQ0FTRSBmb3JtIGlzIGEgQlVGRkVSCisJaWYoIG9iakVsZW1lbnQtPmlzPCBCdWZmZXIgPigpICkKKwl7CisJCWNvbnN0IFN5bWJvbCAmIGZvdW5kSW5zdGFuY2UgPSBzZWFyY2hCdWZmZXJJbnN0YW5jZSgKKwkJCQlhQ1RYLT5tQ29tcGlsZUN0eC0+Z2V0RXhlY3V0YWJsZSgpLCBvYmpFbGVtZW50KTsKKwkJaWYoIGZvdW5kSW5zdGFuY2UudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRJbnN0YW5jZSApOworCQl9CisJfQorCisKKwkvLyBDQVNFIGZvcm0gaXMgYSBDT05ORUNUCisJaWYoIG9iakVsZW1lbnQtPmlzPCBDb25uZWN0b3IgPigpICkKKwl7CisJCWNvbnN0IFN5bWJvbCAmIGZvdW5kSW5zdGFuY2UgPSBzZWFyY2hDb25uZWN0b3JJbnN0YW5jZSgKKwkJCQlhQ1RYLT5tQ29tcGlsZUN0eC0+Z2V0RXhlY3V0YWJsZSgpLCBvYmpFbGVtZW50KTsKKwkJaWYoIGZvdW5kSW5zdGFuY2UudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRJbnN0YW5jZSApOworCQl9CisJfQorCisJeworCQljb25zdCBCRiAmIGZvdW5kSW5zdGFuY2UgPSBzZWFyY2hEYXRhSW5zdGFuY2UoYUNUWCwgb2JqRWxlbWVudCk7CisJCWlmKCBmb3VuZEluc3RhbmNlLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kSW5zdGFuY2UgKTsKKwkJfQorCX0KKworCS8vIEZvciB0aGUgQ2FzZSBvZiB1bmRldGVjdGVkIFRZUEUKKwl7CisJCWNvbnN0IFN5bWJvbCAmIGZvdW5kSW5zdGFuY2UgPSBzZWFyY2hJbnN0YW5jZVN0YXRpYyhvYmpFbGVtZW50KTsKKwkJaWYoIGZvdW5kSW5zdGFuY2UudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRJbnN0YW5jZSApOworCQl9CisJfQorCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKK30KKworCisKK2NvbnN0IEJGICYgU3ltYm9sVGFibGU6OnNlYXJjaEluc3RhbmNlKENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEKQoreworCS8vIENBU0UgZWxlbWVudCBpcyBhIFBPUlQKKwlpZiggYUNUWC0+dHlwZU11c3RCZVBvcnRGYW1pbHkoKSApCisJeworCQljb25zdCBTeW1ib2wgJiBmb3VuZEluc3RhbmNlID0gWFF1ZXJ5LmdldFNlbVBvcnQoCisJCQkJYUNUWC0+bUNvbXBpbGVDdHgtPmdldEV4ZWN1dGFibGUoKSwgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEKTsKKwkJaWYoIGZvdW5kSW5zdGFuY2UudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRJbnN0YW5jZSApOworCQl9CisJfQorCisJLy8gQ0FTRSBlbGVtZW50IGlzIGEgW1NUQVRFXU1BQ0hJTkUKKwlpZiggYUNUWC0+dHlwZU11c3RCZU1hY2hpbmVGYW1pbHkoKSApCisJeworCQljb25zdCBTeW1ib2wgJiBmb3VuZEluc3RhbmNlID0KKwkJCQlzZWFyY2hJbnN0YW5jZVN0YXRpYyhhRnVsbHlRdWFsaWZpZWROYW1lSUQpOworCQlpZiggZm91bmRJbnN0YW5jZS52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCBmb3VuZEluc3RhbmNlICk7CisJCX0KKwl9CisKKwkvLyBDQVNFIGVsZW1lbnQgaXMgYSBCVUZGRVIKKwlpZiggYUNUWC0+dHlwZU11c3RCZUJ1ZmZlckZhbWlseSgpICkKKwl7CisJCWNvbnN0IFN5bWJvbCAmIGZvdW5kSW5zdGFuY2UgPSBzZWFyY2hCdWZmZXJJbnN0YW5jZSgKKwkJCQlhQ1RYLT5tQ29tcGlsZUN0eC0+Z2V0RXhlY3V0YWJsZSgpLCBhRnVsbHlRdWFsaWZpZWROYW1lSUQpOworCQlpZiggZm91bmRJbnN0YW5jZS52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCBmb3VuZEluc3RhbmNlICk7CisJCX0KKwl9CisKKworCS8vIENBU0UgZWxlbWVudCBpcyBhIENPTk5FQ1QKKwlpZiggYUNUWC0+dHlwZU11c3RCZUNvbm5lY3RvckZhbWlseSgpICkKKwl7CisJCWNvbnN0IFN5bWJvbCAmIGZvdW5kSW5zdGFuY2UgPSBzZWFyY2hDb25uZWN0b3JJbnN0YW5jZSgKKwkJCQlhQ1RYLT5tQ29tcGlsZUN0eC0+Z2V0RXhlY3V0YWJsZSgpLCBhRnVsbHlRdWFsaWZpZWROYW1lSUQpOworCQlpZiggZm91bmRJbnN0YW5jZS52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCBmb3VuZEluc3RhbmNlICk7CisJCX0KKwl9CisKKwkvLyBDQVNFIGVsZW1lbnQgaXMgYW55dGhpbmcgRUxTRQorCS8vIFVOQ09ORElUSU9OQUwKKwl7CisJCWNvbnN0IEJGICYgZm91bmRJbnN0YW5jZSA9CisJCQkJc2VhcmNoRGF0YUluc3RhbmNlKGFDVFgsIGFGdWxseVF1YWxpZmllZE5hbWVJRCk7CisJCWlmKCBmb3VuZEluc3RhbmNlLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kSW5zdGFuY2UgKTsKKwkJfQorCX0KKworCXJldHVybiggQkY6OlJFRl9OVUxMICk7Cit9CisKKworLyoKKyAqIFNFQVJDSAorICogUHJvZ3JhbSBmb3IgYSBnaXZlbiBGT1JNCisgKi8KK2NvbnN0IEJGICYgU3ltYm9sVGFibGU6OnNlYXJjaFRyYW5zaXRpb24oCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IE9iamVjdEVsZW1lbnQgKiBvYmpFbGVtZW50KSBjb25zdAoreworCUV4ZWN1dGFibGVGb3JtICogYW5FeGVjID0gYUNUWC0+bUNvbXBpbGVDdHgtPmdldEV4ZWN1dGFibGUoKTsKKwlmb3IoIDsgYW5FeGVjICE9IE5VTEwgOyBhbkV4ZWMgPSBhbkV4ZWMtPmdldEV4ZWN1dGFibGVDb250YWluZXIoKSApCisJeworCQljb25zdCBCRiAmIHRtcFRyYW5zaXRpb24gPQorCQkJCWFuRXhlYy0+Z2V0VHJhbnNpdGlvbkJ5QXN0RWxlbWVudChvYmpFbGVtZW50KTsKKwkJaWYoIHRtcFRyYW5zaXRpb24udmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggdG1wVHJhbnNpdGlvbiApOworCQl9CisJfQorCisJeworCQljb25zdCBCRiAmIGFUcmFuc2l0aW9uID0gc2VhcmNoVHJhbnNpdGlvbihvYmpFbGVtZW50KTsKKwkJaWYoIGFUcmFuc2l0aW9uLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGFUcmFuc2l0aW9uICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworfQorCisKK2NvbnN0IEJGICYgU3ltYm9sVGFibGU6OnNlYXJjaFRyYW5zaXRpb24oCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEKSBjb25zdAoreworCUV4ZWN1dGFibGVGb3JtICogYW5FeGVjID0gYUNUWC0+bUNvbXBpbGVDdHgtPmdldEV4ZWN1dGFibGUoKTsKKworCWZvciggOyBhbkV4ZWMgIT0gTlVMTCA7IGFuRXhlYyA9IGFuRXhlYy0+Z2V0RXhlY3V0YWJsZUNvbnRhaW5lcigpICkKKwl7CisJCWNvbnN0IEJGICYgdG1wVHJhbnNpdGlvbiA9IGFuRXhlYy0+Z2V0VHJhbnNpdGlvbihhRnVsbHlRdWFsaWZpZWROYW1lSUQpOworCQlpZiggdG1wVHJhbnNpdGlvbi52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCB0bXBUcmFuc2l0aW9uICk7CisJCX0KKwl9CisKKwl7CisJCWNvbnN0IEJGICYgYVRyYW5zaXRpb24gPSBzZWFyY2hUcmFuc2l0aW9uKGFGdWxseVF1YWxpZmllZE5hbWVJRCk7CisJCWlmKCBhVHJhbnNpdGlvbi52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCBhVHJhbnNpdGlvbiApOworCQl9CisJfQorCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKK30KKworCitjb25zdCBCRiAmIFN5bWJvbFRhYmxlOjpzZWFyY2hUcmFuc2l0aW9uQnlOYW1lSUQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkgY29uc3QKK3sKKwlFeGVjdXRhYmxlRm9ybSAqIGFuRXhlYyA9IGFDVFgtPm1Db21waWxlQ3R4LT5nZXRFeGVjdXRhYmxlKCk7CisKKwlmb3IoIDsgYW5FeGVjICE9IE5VTEwgOyBhbkV4ZWMgPSBhbkV4ZWMtPmdldEV4ZWN1dGFibGVDb250YWluZXIoKSApCisJeworCQljb25zdCBCRiAmIHRtcFRyYW5zaXRpb24gPSBhbkV4ZWMtPmdldFRyYW5zaXRpb25CeU5hbWVJRChhTmFtZUlEKTsKKwkJaWYoIHRtcFRyYW5zaXRpb24udmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggdG1wVHJhbnNpdGlvbiApOworCQl9CisJfQorCisJeworCQljb25zdCBCRiAmIGFUcmFuc2l0aW9uID0gc2VhcmNoVHJhbnNpdGlvbkJ5TmFtZUlEKGFOYW1lSUQpOworCQlpZiggYVRyYW5zaXRpb24udmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggYVRyYW5zaXRpb24gKTsKKwkJfQorCX0KKworCXJldHVybiggQkY6OlJFRl9OVUxMICk7Cit9CisKKworY29uc3QgQkYgJiBTeW1ib2xUYWJsZTo6c2VhcmNoUHJvZ3JhbSgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgT2JqZWN0RWxlbWVudCAqIG9iakVsZW1lbnQpIGNvbnN0Cit7CisJRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWMgPSBhQ1RYLT5tQ29tcGlsZUN0eC0+Z2V0RXhlY3V0YWJsZSgpOworCWZvciggOyBhbkV4ZWMgIT0gTlVMTCA7IGFuRXhlYyA9IGFuRXhlYy0+Z2V0RXhlY3V0YWJsZUNvbnRhaW5lcigpICkKKwl7CisJCWNvbnN0IEJGICYgdG1wUHJvZ3JhbSA9IGFuRXhlYy0+Z2V0UHJvZ3JhbUJ5QXN0RWxlbWVudChvYmpFbGVtZW50KTsKKwkJaWYoIHRtcFByb2dyYW0udmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggdG1wUHJvZ3JhbSApOworCQl9CisJfQorCisJeworCQljb25zdCBCRiAmIGFQcm9ncmFtID0gc2VhcmNoUHJvZ3JhbShvYmpFbGVtZW50KTsKKwkJaWYoIGFQcm9ncmFtLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGFQcm9ncmFtICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIHNlYXJjaEV4ZWN1dGFibGUob2JqRWxlbWVudCkgKTsKK30KKworCitjb25zdCBCRiAmIFN5bWJvbFRhYmxlOjpzZWFyY2hQcm9ncmFtKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCkgY29uc3QKK3sKKwlFeGVjdXRhYmxlRm9ybSAqIGFuRXhlYyA9IGFDVFgtPm1Db21waWxlQ3R4LT5nZXRFeGVjdXRhYmxlKCk7CisKKwlmb3IoIDsgYW5FeGVjICE9IE5VTEwgOyBhbkV4ZWMgPSBhbkV4ZWMtPmdldEV4ZWN1dGFibGVDb250YWluZXIoKSApCisJeworCQljb25zdCBCRiAmIHRtcFByb2dyYW0gPSBhbkV4ZWMtPmdldFByb2dyYW0oYUZ1bGx5UXVhbGlmaWVkTmFtZUlEKTsKKwkJaWYoIHRtcFByb2dyYW0udmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggdG1wUHJvZ3JhbSApOworCQl9CisJfQorCisJeworCQljb25zdCBCRiAmIGFQcm9ncmFtID0gc2VhcmNoUHJvZ3JhbShhRnVsbHlRdWFsaWZpZWROYW1lSUQpOworCQlpZiggYVByb2dyYW0udmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggYVByb2dyYW0gKTsKKwkJfQorCX0KKworCXJldHVybiggc2VhcmNoRXhlY3V0YWJsZShhRnVsbHlRdWFsaWZpZWROYW1lSUQpICk7Cit9CisKKworY29uc3QgQkYgJiBTeW1ib2xUYWJsZTo6c2VhcmNoUHJvZ3JhbUJ5TmFtZUlEKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpIGNvbnN0Cit7CisJRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWMgPSBhQ1RYLT5tQ29tcGlsZUN0eC0+Z2V0RXhlY3V0YWJsZSgpOworCisJZm9yKCA7IGFuRXhlYyAhPSBOVUxMIDsgYW5FeGVjID0gYW5FeGVjLT5nZXRFeGVjdXRhYmxlQ29udGFpbmVyKCkgKQorCXsKKwkJY29uc3QgQkYgJiB0bXBQcm9ncmFtID0gYW5FeGVjLT5nZXRQcm9ncmFtQnlOYW1lSUQoYU5hbWVJRCk7CisJCWlmKCB0bXBQcm9ncmFtLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIHRtcFByb2dyYW0gKTsKKwkJfQorCX0KKworCXsKKwkJY29uc3QgQkYgJiBhUHJvZ3JhbSA9IHNlYXJjaFByb2dyYW1CeU5hbWVJRChhTmFtZUlEKTsKKwkJaWYoIGFQcm9ncmFtLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGFQcm9ncmFtICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIHNlYXJjaEV4ZWN1dGFibGVCeU5hbWVJRChhTmFtZUlEKSApOworfQorCisKKy8qCisgKiBTRUFSQ0gKKyAqIEV4ZWN1dGFibGUgb2YgdGhlIE1PREVMIGZvciBhIGdpdmVuIEZPUk0KKyAqLworRXhlY3V0YWJsZUZvcm0gKiBTeW1ib2xUYWJsZTo6c2VhcmNoRXhlY3V0YWJsZU1vZGVsKGNvbnN0IE1hY2hpbmUgKiBhTWFjaGluZSkKK3sKKwkvLyBSRVNFVCBFUlJPUgorCXJlc2V0RXJyb3IoKTsKKworCWNvbnN0IEJGICYgYU1vZGVsID0gYU1hY2hpbmUtPmdldFR5cGUoKTsKKwlpZiggYU1vZGVsLmlzPCBNYWNoaW5lID4oKSApCisJeworCQlpZiggYU1vZGVsLnRvX3B0cjwgTWFjaGluZSA+KCktPmdldFNwZWNpZmllcigpLmhhc0Rlc2lnbk1vZGVsKCkgKQorCQl7CisJCQlyZXR1cm4oIHNlYXJjaEV4ZWN1dGFibGUoYU1vZGVsLnRvX3B0cjwgTWFjaGluZSA+KCkpLgorCQkJCQl0b19wdHI8IEV4ZWN1dGFibGVGb3JtID4oKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuKCBzZWFyY2hFeGVjdXRhYmxlTW9kZWwoYU1vZGVsLnRvX3B0cjwgTWFjaGluZSA+KCkpICk7CisJCX0KKwl9CisJZWxzZSBpZiggYU1vZGVsLmlzPCBJZGVudGlmaWVyID4oKSApCisJeworCQlzdGQ6OnN0cmluZyBhTmFtZUlEID0gYU1vZGVsLnRvX3B0cjwgSWRlbnRpZmllciA+KCktPmdldFZhbHVlKCk7CisKKwkJY29uc3QgQkYgJiBmb3VuZEV4ZWMgPSBzZWFyY2hFeGVjdXRhYmxlQnlOYW1lSUQoYU5hbWVJRCk7CisKKwkJcmV0dXJuKCBmb3VuZEV4ZWMudmFsaWQoKSA/CisJCQkJZm91bmRFeGVjLmFzX3B0cjwgRXhlY3V0YWJsZUZvcm0gPigpIDogTlVMTCApOworCX0KKworCWVsc2UKKwl7CisJCXN0ZDo6c3RyaW5nIGFRdWFsaWZpZWROYW1lSUQgPSBhTW9kZWwuaXM8IFF1YWxpZmllZElkZW50aWZpZXIgPigpCisJCQkJPyBhTW9kZWwudG9fcHRyPCBRdWFsaWZpZWRJZGVudGlmaWVyID4oKS0+Z2V0VmFsdWUoKQorCQkJCTogKCBhTW9kZWwuaXM8IFVuaUZvcm1JZGVudGlmaWVyID4oKQorCQkJCQk/IGFNb2RlbC50b19wdHI8IFVuaUZvcm1JZGVudGlmaWVyID4oKS0+dG9TdHJpbmdMb2NhdGlvbigpCisJCQkJCTogYU1vZGVsLnN0cigpICk7CisKKwkJY29uc3QgQkYgJiBmb3VuZEV4ZWMgPQorCQkJCXNlYXJjaEV4ZWN1dGFibGVCeVF1YWxpZmllZE5hbWVJRCggYVF1YWxpZmllZE5hbWVJRCApOworCisJCXJldHVybiggZm91bmRFeGVjLnZhbGlkKCkgPworCQkJCWZvdW5kRXhlYy5hc19wdHI8IEV4ZWN1dGFibGVGb3JtID4oKSA6IE5VTEwgKTsKKwl9Cit9CisKKworLyoqCisgKiBTRUFSQ0ggU1lNQk9MCisgKiBmb3IgRGF0YUZhY3RvcnksIFBvcnQsIE1hY2hpbmUsIEV4ZWN1dGFibGUKKyAqLworY29uc3QgQkYgJiBTeW1ib2xUYWJsZTo6c2VhcmNoU3ltYm9sKENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsCisJCWNvbnN0IE9iamVjdEVsZW1lbnQgKiBvYmpFbGVtZW50KQoreworCXsKKwkJY29uc3QgQkYgJiB0aGVTeW1ib2wgPSBzZWFyY2hJbnN0YW5jZShhQ1RYLCBvYmpFbGVtZW50KTsKKwkJaWYoIHRoZVN5bWJvbC52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCB0aGVTeW1ib2wgKTsKKwkJfQorCX0KKworCXsKKwkJY29uc3QgQkYgJiB0aGVTeW1ib2wgPSBzZWFyY2hUcmFuc2l0aW9uKGFDVFgsIG9iakVsZW1lbnQpOworCQlpZiggdGhlU3ltYm9sLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIHRoZVN5bWJvbCApOworCQl9CisJfQorCXsKKwkJY29uc3QgQkYgJiB0aGVTeW1ib2wgPSBzZWFyY2hQcm9ncmFtKGFDVFgsIG9iakVsZW1lbnQpOworCQlpZiggdGhlU3ltYm9sLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIHRoZVN5bWJvbCApOworCQl9CisJfQorCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKK30KKworCitjb25zdCBCRiAmIFN5bWJvbFRhYmxlOjpzZWFyY2hTeW1ib2woQ09NUElMRV9DT05URVhUICogYUNUWCwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQpCit7CisJeworCQljb25zdCBCRiAmIHRoZVN5bWJvbCA9IHNlYXJjaEluc3RhbmNlKGFDVFgsIGFGdWxseVF1YWxpZmllZE5hbWVJRCk7CisJCWlmKCB0aGVTeW1ib2wudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggdGhlU3ltYm9sICk7CisJCX0KKwl9CisKKwl7CisJCWNvbnN0IEJGICYgdGhlU3ltYm9sID0gc2VhcmNoVHJhbnNpdGlvbihhQ1RYLCBhRnVsbHlRdWFsaWZpZWROYW1lSUQpOworCQlpZiggdGhlU3ltYm9sLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIHRoZVN5bWJvbCApOworCQl9CisJfQorCisJeworCQljb25zdCBCRiAmIHRoZVN5bWJvbCA9IHNlYXJjaFByb2dyYW0oYUNUWCwgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEKTsKKwkJaWYoIHRoZVN5bWJvbC52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCB0aGVTeW1ib2wgKTsKKwkJfQorCX0KKworCXJldHVybiggQkY6OlJFRl9OVUxMICk7Cit9CisKKworQkYgU3ltYm9sVGFibGU6OnNlYXJjaFN5bWJvbEJ5VUZJKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBVbmlGb3JtSWRlbnRpZmllciAmIGFuVUZJKQoreworCVVuaUZvcm1JZGVudGlmaWVyOjpjb25zdF9pdGVyYXRvciBpdCA9IGFuVUZJLmJlZ2luKCk7CisJVW5pRm9ybUlkZW50aWZpZXI6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gYW5VRkkuZW5kKCk7CisKKwlzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzVUZJOworCWNvbnN0IE9iamVjdEVsZW1lbnQgKiBUaGVNYWluT2JqZWN0RWxlbWVudCA9IE5VTEw7CisKKwlCRiBiZkluc3RhbmNlOworCUluc3RhbmNlT2ZNYWNoaW5lICogdGhlSW5zdGFuY2VNYWNoaW5lOworCisJLy8gQ0hFQ0tJTkcgUk9PVCBNQUNISU5FIElOU1RBTkNFCisJaWYoICgqaXQpLmlzPCBPYmplY3RFbGVtZW50ID4oKSApCisJeworCQlUaGVNYWluT2JqZWN0RWxlbWVudCA9ICgqaXQpLnRvX3B0cjwgT2JqZWN0RWxlbWVudCA+KCk7CisKKwkJaWYoIChiZkluc3RhbmNlID0gc2VhcmNoSW5zdGFuY2VTdGF0aWMoVGhlTWFpbk9iamVjdEVsZW1lbnQpKS52YWxpZCgpICkKKwkJeworCQkJdGhlSW5zdGFuY2VNYWNoaW5lID0gYmZJbnN0YW5jZS50b19wdHI8IEluc3RhbmNlT2ZNYWNoaW5lID4oKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWluY3JFcnJvckNvdW50KCk7CisJCQlFUlJPUl9PUyA8PCAiVW5mb3VuZCB0aGUgbWFpbiBmb3JtIDwgIgorCQkJCQk8PCBUaGVNYWluT2JqZWN0RWxlbWVudC0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJCQk8PCAiID4gb2YgVUZJIDwgIiA8PCBhblVGSS5zdHIoKSA8PCAiID4gaW4gdGhlIHN5c3RlbSA8PCAiCisJCQkJCTw8IG1Db25maWd1cmF0aW9uLmdldEV4ZWN1dGFibGVTeXN0ZW0oKS5yYXdTeXN0ZW1JbnN0YW5jZSgpCisJCQkJCQkJLT5nZXRBc3RFbGVtZW50KCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIiA+PiIKKwkJCQkJPDwgc3RkOjplbmRsOworCisJCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCQl9CisJfQorCWVsc2UKKwl7CisJCW9zc1VGSSA8PCBhblVGSS50b1N0cmluZ0xvY2F0b3IoKQorCQkJCTw8IEZRTl9JRF9ST09UX1NFUEFSQVRPUiA8PCAoKml0KS5zdHIoKTsKKworCQl0aGVJbnN0YW5jZU1hY2hpbmUgPQorCQkJCW1Db25maWd1cmF0aW9uLmdldEV4ZWN1dGFibGVTeXN0ZW0oKS5yYXdTeXN0ZW1JbnN0YW5jZSgpOworCQlUaGVNYWluT2JqZWN0RWxlbWVudCA9IHRoZUluc3RhbmNlTWFjaGluZS0+Z2V0QXN0RWxlbWVudCgpOworCQlpZiggKFRoZU1haW5PYmplY3RFbGVtZW50ICE9IE5VTEwpCisJCQkmJiBUaGVNYWluT2JqZWN0RWxlbWVudC0+ZnFuRXF1YWxzKCBvc3NVRkkuc3RyKCkgKSApCisJCXsKKwkJCWlmKCBpdCA9PSBpdEVuZCApCisJCQl7CisJCQkJcmV0dXJuKCBtQ29uZmlndXJhdGlvbi5nZXRFeGVjdXRhYmxlU3lzdGVtKCkuZ2V0U3lzdGVtSW5zdGFuY2UoKSApOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJaW5jckVycm9yQ291bnQoKTsKKwkJCUVSUk9SX09TIDw8ICJVbmZvdW5kIHRoZSBtYWluIGZvcm0gPCAiCisJCQkJCTw8IG9zc1VGSS5zdHIoKSA8PCAiID4gb2YgVUZJIDwgIgorCQkJCQk8PCBhblVGSS5zdHIoKSA8PCAiID4gaW4gdGhlIHN5c3RlbSA8PCAiCisJCQkJCTw8IG1Db25maWd1cmF0aW9uLmdldEV4ZWN1dGFibGVTeXN0ZW0oKS5yYXdTeXN0ZW1JbnN0YW5jZSgpCisJCQkJCQkJLT5nZXRBc3RFbGVtZW50KCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIiA+PiIKKwkJCQkJPDwgc3RkOjplbmRsOworCisJCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCQl9CisJfQorCisJb3NzVUZJLnN0cigiIik7CisJb3NzVUZJIDw8IHRoZUluc3RhbmNlTWFjaGluZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsKKworCS8vIENIRUNLSU5HIE1BSU4gTUFDSElORSBJTlNUQU5DRQorCWZvciggKytpdCA7IGl0ICE9IGl0RW5kIDsgKytpdCApCisJeworCQlpZiggKCppdCkuaXNJZGVudGlmaWVyKCkgKQorCQl7CisJCQlvc3NVRkkgPDwgJy4nIDw8ICgqaXQpLnN0cigpOworCisJCQliZkluc3RhbmNlID0gdGhlSW5zdGFuY2VNYWNoaW5lLT5nZXRFeGVjdXRhYmxlKCktPgorCQkJCQlnZXRJbnN0YW5jZVN0YXRpYygpLmdldEJ5RlFOYW1lSUQoIG9zc1VGSS5zdHIoKSApOworCisJCQlpZiggYmZJbnN0YW5jZS5pbnZhbGlkKCkgKQorCQkJeworCQkJCWJmSW5zdGFuY2UgPSB0aGVJbnN0YW5jZU1hY2hpbmUtPmdldEV4ZWN1dGFibGUoKS0+CisJCQkJCQlnZXRJbnN0YW5jZVN0YXRpYygpLmdldEJ5TmFtZUlEKCAoKml0KS5zdHIoKSApOworCQkJfQorCisJCQlpZiggYmZJbnN0YW5jZS52YWxpZCgpICkKKwkJCXsKKwkJCQl0aGVJbnN0YW5jZU1hY2hpbmUgPSBiZkluc3RhbmNlLnRvX3B0cjwgSW5zdGFuY2VPZk1hY2hpbmUgPigpOworCisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJZWxzZSBpZiggKCppdCkuaXM8IE9iamVjdEVsZW1lbnQgPigpICkKKwkJeworCQkJaWYoICgqaXQpLnRvX3B0cjwgT2JqZWN0RWxlbWVudCA+KCktPmdldENvbnRhaW5lcigpCisJCQkJPT0gVGhlTWFpbk9iamVjdEVsZW1lbnQgKQorCQkJeworCQkJCVRoZU1haW5PYmplY3RFbGVtZW50ID0gKCppdCkudG9fcHRyPCBPYmplY3RFbGVtZW50ID4oKTsKKworCQkJCWlmKCAoYmZJbnN0YW5jZSA9IHRoZUluc3RhbmNlTWFjaGluZS0+Z2V0RXhlY3V0YWJsZSgpLT4KKwkJCQkJCWdldEJ5QXN0SW5zdGFuY2VTdGF0aWMoVGhlTWFpbk9iamVjdEVsZW1lbnQpKS52YWxpZCgpICkKKwkJCQl7CisJCQkJCXRoZUluc3RhbmNlTWFjaGluZSA9IGJmSW5zdGFuY2UudG9fcHRyPCBJbnN0YW5jZU9mTWFjaGluZSA+KCk7CisKKwkJCQkJb3NzVUZJLnN0cigiIik7CisJCQkJCW9zc1VGSSA8PCB0aGVJbnN0YW5jZU1hY2hpbmUtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7CisKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWluY3JFcnJvckNvdW50KCk7CisJCQkJRVJST1JfT1MgPDwgIk1pc3NGb3JtZWQgVUZJIDwgIgorCQkJCQkJPDwgYW5VRkkuc3RyKCkgPDwgIiA+IDogdGhlIGZpZWxkIDwgIgorCQkJCQkJPDwgKCppdCkudG9fcHRyPAorCQkJCQkJCQlPYmplY3RFbGVtZW50ID4oKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJCQkJPDwgIiA+IGNvbnRhaW5lciBpcyBub3QgPCAiCisJCQkJCQk8PCBUaGVNYWluT2JqZWN0RWxlbWVudC0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJCQkJPDwgIiA+ICEhISIgPDwgc3RkOjplbmRsOworCisJCQkJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWluY3JFcnJvckNvdW50KCk7CisJCQlFUlJPUl9PUyA8PCAiVW5leHBlY3RlZCA8ICIgPDwgaXQtPnN0cigpCisJCQkJCTw8ICIgPiBhcyBmaWVsZCBvZiB0aGUgVUZJIDwgIgorCQkJCQk8PCBhblVGSS5zdHIoKSA8PCAiID4gISEhIgorCQkJCQk8PCBzdGQ6OmVuZGw7CisKKwkJCXJldHVybiggQkY6OlJFRl9OVUxMICk7CisJCX0KKworCQlicmVhazsKKwl9CisKKwlpZiggYmZJbnN0YW5jZS52YWxpZCgpICkKKwl7CisJCWlmKCBpdCA9PSBpdEVuZCApCisJCXsKKwkJCXJldHVybiggYmZJbnN0YW5jZSApOworCQl9CisKKwkJLy8gQ0hFQ0tJTkcgRk9SIE1BSU4gTUFDSElORQorCQlvc3NVRkkuc3RyKCIiKTsKKwkJb3NzVUZJIDw8IHRoZUluc3RhbmNlTWFjaGluZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsKKwkJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApCisJCXsKKwkJCWlmKCAoKml0KS5pc1VmaWQoKSApCisJCQl7CisJCQkJb3NzVUZJIDw8ICcuJyA8PCBpdC0+c3RyKCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaW5jckVycm9yQ291bnQoKTsKKwkJCQlFUlJPUl9PUyA8PCAiVW5leHBlY3RlZCA8ICIgPDwgaXQtPnN0cigpCisJCQkJCQk8PCAiID4gYXMgZmllbGQgb2YgdGhlIFVGSSA8ICIgPDwgYW5VRkkuc3RyKCkKKwkJCQkJCTw8ICIgPiAhISEiIDw8IHN0ZDo6ZW5kbDsKKworCQkJCXJldHVybiggQkY6OlJFRl9OVUxMICk7CisJCQl9CisJCX0KKworCQljb25zdCBCRiAmIGFTeW1ib2wgPSB0aGVJbnN0YW5jZU1hY2hpbmUtPmdldEV4ZWN1dGFibGUoKS0+CisJCQkJZ2V0U3ltYm9sKG9zc1VGSS5zdHIoKSwgYUNUWC0+Z2V0VHlwZUZhbWlseSgpKTsKKwkJaWYoIGFTeW1ib2wudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggYVN5bWJvbCApOworCQl9CisJCWVsc2UKKwkJeworCQkJaW5jckVycm9yQ291bnQoKTsKKwkJCUVSUk9SX09TIDw8ICJVbmZvdW5kIGEgcnVudGltZSBzeW1ib2wgZm9yIHRoZSBVRkkgPCAiCisJCQkJCTw8IGFuVUZJLnN0cigpIDw8ICIgPiIgPDwgc3RkOjplbmRsOworCQl9CisJfQorCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKK30KKworCitjb25zdCBCRiAmIFN5bWJvbFRhYmxlOjpzZWFyY2hTZW1TeW1ib2woCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IE9iamVjdEVsZW1lbnQgKiBhc3RFbGVtZW50KSBjb25zdAoreworCUJhc2VBdm1Qcm9ncmFtICogYVByb2dyYW0gPSBhQ1RYLT5tQ29tcGlsZUN0eDsKKwlmb3IoIDsgYVByb2dyYW0gIT0gTlVMTCA7IGFQcm9ncmFtID0gYVByb2dyYW0tPmdldENvbnRhaW5lcigpICkKKwl7CisJCWNvbnN0IEJGICYgdGhlU3ltYm9sID0KKwkJCWFQcm9ncmFtLT5nZXRTeW1ib2xCeUFzdEVsZW1lbnQoYXN0RWxlbWVudCwgYUNUWC0+Z2V0VHlwZUZhbWlseSgpKTsKKwkJaWYoIHRoZVN5bWJvbC52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCB0aGVTeW1ib2wgKTsKKwkJfQorCX0KKworCWlmKCBhQ1RYLT5tUnVudGltZUN0eCAhPSBhQ1RYLT5tQ29tcGlsZUN0eCApCisJeworCQlhUHJvZ3JhbSA9IGFDVFgtPm1SdW50aW1lQ3R4OworCQlmb3IoIDsgYVByb2dyYW0gIT0gTlVMTCA7IGFQcm9ncmFtID0gYVByb2dyYW0tPmdldENvbnRhaW5lcigpICkKKwkJeworCQkJY29uc3QgQkYgJiB0aGVTeW1ib2wgPSBhUHJvZ3JhbS0+CisJCQkJCWdldFN5bWJvbEJ5QXN0RWxlbWVudChhc3RFbGVtZW50LCBhQ1RYLT5nZXRUeXBlRmFtaWx5KCkpOworCQkJaWYoIHRoZVN5bWJvbC52YWxpZCgpICkKKwkJCXsKKwkJCQlyZXR1cm4oIHRoZVN5bWJvbCApOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKK30KKworY29uc3QgQkYgJiBTeW1ib2xUYWJsZTo6c2VhcmNoU2VtU3ltYm9sQnlRdWFsaWZpZWROYW1lSUQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkgY29uc3QKK3sKKwlCYXNlQXZtUHJvZ3JhbSAqIGFQcm9ncmFtID0gYUNUWC0+bUNvbXBpbGVDdHg7CisJZm9yKCA7IGFQcm9ncmFtICE9IE5VTEwgOyBhUHJvZ3JhbSA9IGFQcm9ncmFtLT5nZXRDb250YWluZXIoKSApCisJeworCQljb25zdCBCRiAmIHRoZVN5bWJvbCA9IGFQcm9ncmFtLT5nZXRTeW1ib2xCeVF1YWxpZmllZE5hbWVJRCgKKwkJCQlhUXVhbGlmaWVkTmFtZUlELCBhQ1RYLT5nZXRUeXBlRmFtaWx5KCkpOworCQlpZiggdGhlU3ltYm9sLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIHRoZVN5bWJvbCApOworCQl9CisJfQorCisJaWYoIGFDVFgtPm1SdW50aW1lQ3R4ICE9IGFDVFgtPm1Db21waWxlQ3R4ICkKKwl7CisJCWFQcm9ncmFtID0gYUNUWC0+bVJ1bnRpbWVDdHg7CisJCWZvciggOyBhUHJvZ3JhbSAhPSBOVUxMIDsgYVByb2dyYW0gPSBhUHJvZ3JhbS0+Z2V0Q29udGFpbmVyKCkgKQorCQl7CisJCQljb25zdCBCRiAmIHRoZVN5bWJvbCA9IGFQcm9ncmFtLT5nZXRTeW1ib2xCeVF1YWxpZmllZE5hbWVJRCgKKwkJCQkJYVF1YWxpZmllZE5hbWVJRCwgYUNUWC0+Z2V0VHlwZUZhbWlseSgpKTsKKwkJCWlmKCB0aGVTeW1ib2wudmFsaWQoKSApCisJCQl7CisJCQkJcmV0dXJuKCB0aGVTeW1ib2wgKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiggQkY6OlJFRl9OVUxMICk7Cit9CisKKworY29uc3QgQkYgJiBTeW1ib2xUYWJsZTo6c2VhcmNoU2VtU3ltYm9sQnlOYW1lSUQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkgY29uc3QKK3sKKwlCYXNlQXZtUHJvZ3JhbSAqIGFQcm9ncmFtID0gYUNUWC0+bUNvbXBpbGVDdHg7CisJZm9yKCA7IGFQcm9ncmFtICE9IE5VTEwgOyBhUHJvZ3JhbSA9IGFQcm9ncmFtLT5nZXRDb250YWluZXIoKSApCisJeworCQljb25zdCBCRiAmIHRoZVN5bWJvbCA9CisJCQkJYVByb2dyYW0tPmdldFN5bWJvbEJ5TmFtZUlEKGFOYW1lSUQsIGFDVFgtPmdldFR5cGVGYW1pbHkoKSk7CisJCWlmKCB0aGVTeW1ib2wudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggdGhlU3ltYm9sICk7CisJCX0KKwl9CisKKwlpZiggYUNUWC0+bVJ1bnRpbWVDdHggIT0gYUNUWC0+bUNvbXBpbGVDdHggKQorCXsKKwkJYVByb2dyYW0gPSBhQ1RYLT5tUnVudGltZUN0eDsKKwkJZm9yKCA7IGFQcm9ncmFtICE9IE5VTEwgOyBhUHJvZ3JhbSA9IGFQcm9ncmFtLT5nZXRDb250YWluZXIoKSApCisJCXsKKwkJCWNvbnN0IEJGICYgdGhlU3ltYm9sID0gYVByb2dyYW0tPgorCQkJCQlnZXRTeW1ib2xCeU5hbWVJRChhTmFtZUlELCBhQ1RYLT5nZXRUeXBlRmFtaWx5KCkpOworCQkJaWYoIHRoZVN5bWJvbC52YWxpZCgpICkKKwkJCXsKKwkJCQlyZXR1cm4oIHRoZVN5bWJvbCApOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKK30KKworCisvLyBUT0RPIE9wdGltaXplIHNlYXJjaFN5bWJvbEJ5UXVhbGlmaWVkTmFtZUlECitCRiBTeW1ib2xUYWJsZTo6c2VhcmNoU3ltYm9sQnlRdWFsaWZpZWROYW1lSUQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkKK3sKKwl7CisJCWNvbnN0IEJGICYgdGhlU3ltYm9sID0KKwkJCQlzZWFyY2hTZW1TeW1ib2xCeVF1YWxpZmllZE5hbWVJRChhQ1RYLCBhUXVhbGlmaWVkTmFtZUlEKTsKKwkJaWYoIHRoZVN5bWJvbC52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCB0aGVTeW1ib2wgKTsKKwkJfQorCX0KKworCUxpc3RPZlN0cmluZyBsaXN0T2ZJZDsKKwlhdm1fc2l6ZV90IGlkQ291bnQgPSBOYW1lZEVsZW1lbnQ6OmNvbGxlY3ROYW1lSUQobGlzdE9mSWQsIGFRdWFsaWZpZWROYW1lSUQpOworCWlmKCBpZENvdW50ID09IDIgKQorCXsKKwkJY29uc3QgU3ltYm9sICYgYU1hY2hpbmUgPSBhQ1RYLT5tQ29tcGlsZUN0eC0+Z2V0RXhlY3V0YWJsZSgpCisJCQkJLT5nZXRJbnN0YW5jZVN0YXRpYygpLmdldEJ5TmFtZUlEKGxpc3RPZklkLmZpcnN0KCkpOworCQlpZiggYU1hY2hpbmUudmFsaWQoKSApCisJCXsKKwkJCWNvbnN0IEJGICYgdGhlU3ltYm9sID0gYU1hY2hpbmUuZ2V0RXhlY3V0YWJsZSgpLT4KKwkJCQkJZ2V0U3ltYm9sQnlOYW1lSUQobGlzdE9mSWQuc2Vjb25kKCksIGFDVFgtPmdldFR5cGVGYW1pbHkoKSk7CisJCQlpZiggdGhlU3ltYm9sLnZhbGlkKCkgKQorCQkJeworCQkJCWlmKCB0aGVTeW1ib2wuaXM8IEJhc2VJbnN0YW5jZUZvcm0gPigpICkKKwkJCQl7CisJCQkJCXJldHVybiggY3JlYXRlQWxpYXNJZk5vdEFjY2Vzc2libGUoCisJCQkJCQkJYUNUWCwgYU1hY2hpbmUucmF3TWFjaGluZSgpLCB0aGVTeW1ib2wpICk7CisJCQkJfQorCisJCQkJcmV0dXJuKCB0aGVTeW1ib2wgKTsKKwkJCX0KKwkJfQorCX0KKworCUJGTGlzdCBmb3VuZExpc3Q7CisJc2VhcmNoSW5zdGFuY2VCeVF1YWxpZmllZE5hbWVJRChhQ1RYLCBhUXVhbGlmaWVkTmFtZUlELCBmb3VuZExpc3QpOworCWlmKCBmb3VuZExpc3Quc2luZ2xldG9uKCkgKQorCXsKKwkJcmV0dXJuKCBmb3VuZExpc3QucG9wX2ZpcnN0KCkgKTsKKwl9CisJZWxzZSBpZiggZm91bmRMaXN0LnBvcHVsYXRlZCgpICkKKwl7CisJCWluY3JFcnJvckNvdW50KCk7CisJCUVSUk9SX09TIDw8ICJJbmRldGVybWluaXNtOj4gZm91bmQgdG9vIG1hbnkgZWxlbWVudCA8ICIKKwkJCQk8PCBhUXVhbGlmaWVkTmFtZUlEIDw8ICIgPiBmcm9tICIKKwkJCQk8PCAoIGFDVFgtPm1Db21waWxlQ3R4LT5pczwgRXhlY3V0YWJsZUZvcm0gPigpID8KKwkJCQkJCSJleGVjdXRhYmxlIiA6ICJwcm9ncmFtIiApCisJCQkJPDwgIiA8ICIgPDwgYUNUWC0+bUNvbXBpbGVDdHgtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKwkJCQk8PCAiID4gISEhIjsKKwkJd2hpbGUoIGZvdW5kTGlzdC5ub25lbXB0eSgpICkKKwkJeworCQkJRVJST1JfT1MgPDwgIlxuXHRGb3VuZCA6PiAiIDw8IHN0cl9oZWFkZXIoIGZvdW5kTGlzdC5wb3BfZmlyc3QoKSApOworCQl9CisKKwkJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKKwl9CisKKwl7CisJCWNvbnN0IEJGICYgdGhlU3ltYm9sID0gc2VhcmNoVHJhbnNpdGlvbihhQ1RYLCBhUXVhbGlmaWVkTmFtZUlEKTsKKwkJaWYoIHRoZVN5bWJvbC52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCB0aGVTeW1ib2wgKTsKKwkJfQorCX0KKwl7CisJCWNvbnN0IEJGICYgdGhlU3ltYm9sID0gc2VhcmNoUHJvZ3JhbShhQ1RYLCBhUXVhbGlmaWVkTmFtZUlEKTsKKwkJaWYoIHRoZVN5bWJvbC52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCB0aGVTeW1ib2wgKTsKKwkJfQorCX0KKworCXsKKwkJY29uc3QgQkYgJiB0aGVTeW1ib2wgPSBzZWFyY2hJbnN0YW5jZVN0YXRpYyhhUXVhbGlmaWVkTmFtZUlEKTsKKwkJaWYoIHRoZVN5bWJvbC52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCB0aGVTeW1ib2wgKTsKKwkJfQorCX0KKwlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworfQorCisKK0JGIFN5bWJvbFRhYmxlOjpzZWFyY2hTeW1ib2xCeU5hbWVJRCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKQoreworCXsKKwkJY29uc3QgQkYgJiB0aGVTeW1ib2wgPSBzZWFyY2hTZW1TeW1ib2xCeU5hbWVJRChhQ1RYLCBhTmFtZUlEKTsKKwkJaWYoIHRoZVN5bWJvbC52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCB0aGVTeW1ib2wgKTsKKwkJfQorCX0KKworCUJGTGlzdCBmb3VuZExpc3Q7CisJc2VhcmNoSW5zdGFuY2VCeU5hbWVJRChhQ1RYLCBhTmFtZUlELCBmb3VuZExpc3QpOworCWlmKCBmb3VuZExpc3Quc2luZ2xldG9uKCkgKQorCXsKKwkJcmV0dXJuKCBmb3VuZExpc3QucG9wX2ZpcnN0KCkgKTsKKwl9CisJZWxzZSBpZiggZm91bmRMaXN0LnBvcHVsYXRlZCgpICkKKwl7CisJCWluY3JFcnJvckNvdW50KCk7CisJCUVSUk9SX09TIDw8ICJJbmRldGVybWluaXNtOj4gZm91bmQgdG9vIG1hbnkgZWxlbWVudCA8ICIgPDwgYU5hbWVJRAorCQkJCTw8ICIgPiBmcm9tICIgPDwgKCBhQ1RYLT5tQ29tcGlsZUN0eC0+aXM8IEV4ZWN1dGFibGVGb3JtID4oKSA/CisJCQkJCQkiZXhlY3V0YWJsZSIgOiAicHJvZ3JhbSIgKQorCQkJCTw8ICIgPCAiIDw8IGFDVFgtPm1Db21waWxlQ3R4LT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8ICIgPiAhISEiOworCQl3aGlsZSggZm91bmRMaXN0Lm5vbmVtcHR5KCkgKQorCQl7CisJCQlFUlJPUl9PUyA8PCAiXG5cdEZvdW5kIDo+ICIgPDwgc3RyX2hlYWRlciggZm91bmRMaXN0LnBvcF9maXJzdCgpICk7CisJCX0KKworCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCX0KKworCXsKKwkJY29uc3QgQkYgJiB0aGVTeW1ib2wgPSBzZWFyY2hNYWNoaW5lSW5zdGFuY2VCeU5hbWVJRChhQ1RYLCBhTmFtZUlEKTsKKwkJaWYoIHRoZVN5bWJvbC52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCB0aGVTeW1ib2wgKTsKKwkJfQorCX0KKwl7CisJCWNvbnN0IEJGICYgdGhlU3ltYm9sID0gc2VhcmNoSW5zdGFuY2VNb2RlbEJ5TmFtZUlEKGFDVFgsIGFOYW1lSUQpOworCQlpZiggdGhlU3ltYm9sLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIHRoZVN5bWJvbCApOworCQl9CisJfQorCisJeworCQljb25zdCBCRiAmIHRoZVN5bWJvbCA9IHNlYXJjaFRyYW5zaXRpb25CeU5hbWVJRChhQ1RYLCBhTmFtZUlEKTsKKwkJaWYoIHRoZVN5bWJvbC52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCB0aGVTeW1ib2wgKTsKKwkJfQorCX0KKwl7CisJCWNvbnN0IEJGICYgdGhlU3ltYm9sID0gc2VhcmNoUHJvZ3JhbUJ5TmFtZUlEKGFDVFgsIGFOYW1lSUQpOworCQlpZiggdGhlU3ltYm9sLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIHRoZVN5bWJvbCApOworCQl9CisJfQorCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKK30KKworCitCRiBTeW1ib2xUYWJsZTo6Y3JlYXRlQWxpYXNJZk5vdEFjY2Vzc2libGUoQ09NUElMRV9DT05URVhUICogYUNUWCwKKwkJSW5zdGFuY2VPZk1hY2hpbmUgKiBhQ29udGFpbmVySW5zdGFuY2UsIGNvbnN0IEJGICYgYmZJbnN0YW5jZSkKK3sKKwlpZiggbm90IGFDb250YWluZXJJbnN0YW5jZS0+Z2V0U3BlY2lmaWVyKCkuaXNEZXNpZ25JbnN0YW5jZVN0YXRpYygpICkKKwl7CisJCXJldHVybiggY3JlYXRlQWxpYXNJZk5vdEFjY2Vzc2libGUoYUNUWCwgYmZJbnN0YW5jZSkgKTsKKwl9CisKKwlFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZSA9IGFDVFgtPm1Db21waWxlQ3R4LT5nZXRFeGVjdXRhYmxlKCk7CisKKwljb25zdCBFeGVjdXRhYmxlRm9ybSAqIGxjYUV4ZWN1dGFibGUgPSBhbkV4ZWN1dGFibGUtPkxDUkEoCisJCQlhQ29udGFpbmVySW5zdGFuY2UtPmdldENvbnRhaW5lcigpLT5nZXRFeGVjdXRhYmxlKCkgKTsKKworCWlmKCBsY2FFeGVjdXRhYmxlICE9IE5VTEwgKQorCXsKKwkJQmFzZUluc3RhbmNlRm9ybSAqIHB0ckluc3RhbmNlID0gYmZJbnN0YW5jZS50b19wdHI8IEJhc2VJbnN0YW5jZUZvcm0gPigpOworCisJCXN0ZDo6c3RyaW5nIGZxblByZWZpeCA9IGxjYUV4ZWN1dGFibGUtPmdldEFzdEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7CisKKwkJTGlzdE9mU3RyaW5nIHN0ckxpc3Q7CisJCU5hbWVkRWxlbWVudDo6Y29sbGVjdE5hbWVJRChzdHJMaXN0LAorCQkJCWFDb250YWluZXJJbnN0YW5jZS0+Z2V0QXN0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSArICcuJyArCisJCQkJcHRySW5zdGFuY2UtPmdldE5hbWVJRCgpLCBmcW5QcmVmaXgpOworCisJCVZlY3Rvck9mSW5zdGFuY2VPZk1hY2hpbmUgdGhlSW5zdGFuY2VPZk1hY2hpbmVQYXRoOworCisJCXdoaWxlKCBzdHJMaXN0LnBvcHVsYXRlZCgpICkKKwkJeworCQkJZnFuUHJlZml4ID0gZnFuUHJlZml4ICsgJy4nICsgc3RyTGlzdC5wb3BfZmlyc3QoKTsKKworCQkJY29uc3QgU3ltYm9sICYgZXhlY0luc3RhbmNlID0gbGNhRXhlY3V0YWJsZS0+Z2V0SW5zdGFuY2VTdGF0aWMoKS4KKwkJCQkJZ2V0QnlGUU5hbWVJRCggZnFuUHJlZml4ICk7CisJCQlpZiggZXhlY0luc3RhbmNlLnZhbGlkKCkgKQorCQkJeworCQkJCXRoZUluc3RhbmNlT2ZNYWNoaW5lUGF0aC5hcHBlbmQoZXhlY0luc3RhbmNlLnJhd01hY2hpbmUoKSk7CisJCQkJbGNhRXhlY3V0YWJsZSA9IGV4ZWNJbnN0YW5jZS5nZXRFeGVjdXRhYmxlKCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYoIGxjYUV4ZWN1dGFibGUtPmdldEFsbERhdGEoKS5nZXRCeUZRTmFtZUlEKCBmcW5QcmVmaXggKS52YWxpZCgpCisJCQkJfHwgbGNhRXhlY3V0YWJsZS0+Z2V0QnVmZmVyKCkuZ2V0QnlGUU5hbWVJRCggZnFuUHJlZml4ICkudmFsaWQoKQorCQkJCXx8IGxjYUV4ZWN1dGFibGUtPmdldFBvcnQoKS5nZXRCeUZRTmFtZUlEKCBmcW5QcmVmaXggKS52YWxpZCgpCisJCQkJfHwgbGNhRXhlY3V0YWJsZS0+Z2V0Q29ubmVjdCgpLmdldEJ5RlFOYW1lSUQoIGZxblByZWZpeCApLnZhbGlkKCkgKQorCQkJCXsKKwkJCQkJbGNhRXhlY3V0YWJsZSA9IE5VTEw7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYoIGxjYUV4ZWN1dGFibGUgIT0gTlVMTCApCisJCXsKKy8vCQkJaWYoIHRoZUluc3RhbmNlT2ZNYWNoaW5lUGF0aC5sYXN0KCkgIT0gYUNvbnRhaW5lckluc3RhbmNlICkKKy8vCQkJeworLy8JCQkJdGhlSW5zdGFuY2VPZk1hY2hpbmVQYXRoLmFwcGVuZChhQ29udGFpbmVySW5zdGFuY2UpOworLy8JCQl9CisKKwkJCVN5bWJvbCBuZXdJbnN0YW5jZTsKKworCQkJc3dpdGNoICggcHRySW5zdGFuY2UtPmNsYXNzS2luZCgpICkKKwkJCXsKKwkJCQljYXNlIEZPUk1fSU5TVEFOQ0VfREFUQV9LSU5EOgorCQkJCXsKKwkJCQkJaWYoIGxjYUV4ZWN1dGFibGUtPmNvbnRhaW5zQWxsRGF0YSgKKwkJCQkJCQliZkluc3RhbmNlLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpKSApCisJCQkJCXsKKwkJCQkJCW5ld0luc3RhbmNlID0gbmV3IEluc3RhbmNlT2ZEYXRhKGFuRXhlY3V0YWJsZSwKKwkJCQkJCQkJcHRySW5zdGFuY2UtPnRvPCBJbnN0YW5jZU9mRGF0YSA+KCksCisJCQkJCQkJCXRoZUluc3RhbmNlT2ZNYWNoaW5lUGF0aCk7CisJCQkJCX0KKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQljYXNlIEZPUk1fSU5TVEFOQ0VfTUFDSElORV9LSU5EOgorCQkJCXsKKwkJCQkJaWYoIGxjYUV4ZWN1dGFibGUtPmdldEluc3RhbmNlU3RhdGljKCkuY29udGFpbnMoYmZJbnN0YW5jZSkgKQorCQkJCQl7CisJCQkJCQluZXdJbnN0YW5jZSA9IG5ldyBJbnN0YW5jZU9mTWFjaGluZSggYW5FeGVjdXRhYmxlLAorCQkJCQkJCQlwdHJJbnN0YW5jZS0+dG88IEluc3RhbmNlT2ZNYWNoaW5lID4oKSwKKwkJCQkJCQkJdGhlSW5zdGFuY2VPZk1hY2hpbmVQYXRoKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQljYXNlIEZPUk1fSU5TVEFOQ0VfUE9SVF9LSU5EOgorCQkJCXsKKwkJCQkJaWYoIGxjYUV4ZWN1dGFibGUtPmdldFBvcnQoKS5jb250YWlucyhiZkluc3RhbmNlKSApCisJCQkJCXsKKwkJCQkJCW5ld0luc3RhbmNlID0gbmV3IEluc3RhbmNlT2ZQb3J0KGFuRXhlY3V0YWJsZSwKKwkJCQkJCQkJcHRySW5zdGFuY2UtPnRvPCBJbnN0YW5jZU9mUG9ydCA+KCksCisJCQkJCQkJCXRoZUluc3RhbmNlT2ZNYWNoaW5lUGF0aCk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJY2FzZSBGT1JNX0lOU1RBTkNFX0JVRkZFUl9LSU5EOgorCQkJCXsKKwkJCQkJaWYoIGxjYUV4ZWN1dGFibGUtPmdldEJ1ZmZlcigpLmNvbnRhaW5zKGJmSW5zdGFuY2UpICkKKwkJCQkJeworCQkJCQkJbmV3SW5zdGFuY2UgPSBuZXcgSW5zdGFuY2VPZkJ1ZmZlcihhbkV4ZWN1dGFibGUsCisJCQkJCQkJCXB0ckluc3RhbmNlLT50bzwgSW5zdGFuY2VPZkJ1ZmZlciA+KCksCisJCQkJCQkJCXRoZUluc3RhbmNlT2ZNYWNoaW5lUGF0aCk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJY2FzZSBGT1JNX0lOU1RBTkNFX0NPTk5FQ1RPUl9LSU5EOgorCQkJCXsKKwkJCQkJaWYoIGxjYUV4ZWN1dGFibGUtPmdldENvbm5lY3QoKS5jb250YWlucyhiZkluc3RhbmNlKSApCisJCQkJCXsKKwkJCQkJCW5ld0luc3RhbmNlID0gbmV3IEluc3RhbmNlT2ZDb25uZWN0KGFuRXhlY3V0YWJsZSwKKwkJCQkJCQkJcHRySW5zdGFuY2UtPnRvPCBJbnN0YW5jZU9mQ29ubmVjdCA+KCksCisJCQkJCQkJCXRoZUluc3RhbmNlT2ZNYWNoaW5lUGF0aCk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJZGVmYXVsdCA6CisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmKCBuZXdJbnN0YW5jZSAhPSBOVUxMICkKKwkJCXsKKwkJCQluZXdJbnN0YW5jZS5zZXRGdWxseVF1YWxpZmllZE5hbWVJRCggImFsaWFzIgorCQkJCQkrIGFDb250YWluZXJJbnN0YW5jZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKS5zdWJzdHIoCisJCQkJCQlhQ29udGFpbmVySW5zdGFuY2UtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkuZmluZCgnOicpKQorCQkJCQkrICIuIiArIHB0ckluc3RhbmNlLT5nZXROYW1lSUQoKSApOworCisJCQkJaWYoIG5vdCBuZXdJbnN0YW5jZS5nZXRNb2RpZmllcigpLgorCQkJCQkJaXNWaXNpYmlsaXR5UHVibGljKCBhQ1RYLT5nZXRNb2RpZmllcigpICkgKQorCQkJCXsKKwkJCQkJaW5jckVycm9yQ291bnQoKTsKKwkJCQkJRVJST1JfT1MgPDwgIkZhaWxlZCB0byBjcmVhdGUgQUxJQVMgZm9yIGEgbm9uIFBVQkxJQyBpbnN0YW5jZSA8PCAiCisJCQkJCQkJPDwgc3RyX2hlYWRlciggcHRySW5zdGFuY2UgKSA8PCAiID4+ICEhISI7CisJCQkJfQorCisJCQkJaWYoIG5ld0luc3RhbmNlLmlzPCBJbnN0YW5jZU9mRGF0YSA+KCkgKQorCQkJCXsKKwkJCQkJYUNUWC0+bUNvbXBpbGVDdHgtPmdldEV4ZWN1dGFibGUoKS0+YXBwZW5kRGF0YUFsaWFzKG5ld0luc3RhbmNlKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJYUNUWC0+bUNvbXBpbGVDdHgtPmdldEV4ZWN1dGFibGUoKS0+YXBwZW5kQWxpYXMobmV3SW5zdGFuY2UpOworCQkJCX0KKworCQkJCXJldHVybiggbmV3SW5zdGFuY2UgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpbmNyRXJyb3JDb3VudCgpOworCQkJCUVSUk9SX09TIDw8ICJGYWlsZWQgdG8gY3JlYXRlIEFMSUFTIGZvciBpbnN0YW5jZSA8PCAiCisJCQkJCQk8PCBzdHJfaGVhZGVyKCBwdHJJbnN0YW5jZSApIDw8ICIgPj4gISEhIjsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiggYmZJbnN0YW5jZSApOworfQorCisKK0JGIFN5bWJvbFRhYmxlOjpjcmVhdGVBbGlhc0lmTm90QWNjZXNzaWJsZSgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkYgJiBiZkluc3RhbmNlKQoreworCUJhc2VJbnN0YW5jZUZvcm0gKiBwdHJJbnN0YW5jZSA9IGJmSW5zdGFuY2UudG9fcHRyPCBCYXNlSW5zdGFuY2VGb3JtID4oKTsKKworCWZvciggQmFzZUF2bVByb2dyYW0gKiB0bXBQcm9ncmFtID0gYUNUWC0+bUNvbXBpbGVDdHggOyB0bXBQcm9ncmFtICE9IE5VTEwgOworCQkJdG1wUHJvZ3JhbSA9IHRtcFByb2dyYW0tPmdldENvbnRhaW5lcigpICkKKwl7CisJCWlmKCB0bXBQcm9ncmFtID09IHB0ckluc3RhbmNlLT5nZXRDb250YWluZXIoKSApCisJCXsKKwkJCXJldHVybiggYmZJbnN0YW5jZSApOworCQl9CisJfQorCisJRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGUgPSBhQ1RYLT5tQ29tcGlsZUN0eC0+Z2V0RXhlY3V0YWJsZSgpOworCisJY29uc3QgRXhlY3V0YWJsZUZvcm0gKiBsY2FFeGVjdXRhYmxlID0gYW5FeGVjdXRhYmxlLT5MQ1JBKAorCQkJcHRySW5zdGFuY2UtPmdldENvbnRhaW5lcigpLT5nZXRFeGVjdXRhYmxlKCkgKTsKKworCWlmKCBsY2FFeGVjdXRhYmxlICE9IE5VTEwgKQorCXsKKwkJc3RkOjpzdHJpbmcgZnFuUHJlZml4ID0gbGNhRXhlY3V0YWJsZS0+Z2V0QXN0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsKKworCQlMaXN0T2ZTdHJpbmcgc3RyTGlzdDsKKwkJTmFtZWRFbGVtZW50Ojpjb2xsZWN0TmFtZUlEKHN0ckxpc3QsCisJCQkJcHRySW5zdGFuY2UtPmdldEFzdEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCksIGZxblByZWZpeCk7CisKKwkJVmVjdG9yT2ZJbnN0YW5jZU9mTWFjaGluZSB0aGVJbnN0YW5jZU9mTWFjaGluZVBhdGg7CisKKwkJd2hpbGUoIHN0ckxpc3QucG9wdWxhdGVkKCkgKQorCQl7CisJCQlmcW5QcmVmaXggPSBmcW5QcmVmaXggKyAnLicgKyBzdHJMaXN0LnBvcF9maXJzdCgpOworCisJCQljb25zdCBTeW1ib2wgJiBleGVjSW5zdGFuY2UgPQorCQkJCWxjYUV4ZWN1dGFibGUtPmdldEluc3RhbmNlU3RhdGljKCkuZ2V0QnlGUU5hbWVJRCggZnFuUHJlZml4ICk7CisJCQlpZiggZXhlY0luc3RhbmNlLnZhbGlkKCkgKQorCQkJeworCQkJCXRoZUluc3RhbmNlT2ZNYWNoaW5lUGF0aC5hcHBlbmQoZXhlY0luc3RhbmNlLnJhd01hY2hpbmUoKSk7CisJCQkJbGNhRXhlY3V0YWJsZSA9IGV4ZWNJbnN0YW5jZS5nZXRFeGVjdXRhYmxlKCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYoIGxjYUV4ZWN1dGFibGUtPmdldEFsbERhdGEoKS5nZXRCeUZRTmFtZUlEKCBmcW5QcmVmaXggKS52YWxpZCgpCisJCQkJfHwgbGNhRXhlY3V0YWJsZS0+Z2V0QnVmZmVyKCkuZ2V0QnlGUU5hbWVJRChmcW5QcmVmaXggKS52YWxpZCgpCisJCQkJfHwgbGNhRXhlY3V0YWJsZS0+Z2V0UG9ydCgpLmdldEJ5RlFOYW1lSUQoZnFuUHJlZml4ICkudmFsaWQoKQorCQkJCXx8IGxjYUV4ZWN1dGFibGUtPmdldENvbm5lY3QoKS5nZXRCeUZRTmFtZUlEKGZxblByZWZpeCApLnZhbGlkKCkgKQorCQkJCXsKKwkJCQkJbGNhRXhlY3V0YWJsZSA9IE5VTEw7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYoIGxjYUV4ZWN1dGFibGUgIT0gTlVMTCApCisJCXsKKwkJCVN5bWJvbCBuZXdJbnN0YW5jZTsKKworCQkJc3dpdGNoICggYmZJbnN0YW5jZS5jbGFzc0tpbmQoKSApCisJCQl7CisJCQkJY2FzZSBGT1JNX0lOU1RBTkNFX0RBVEFfS0lORDoKKwkJCQl7CisJCQkJCWlmKCBsY2FFeGVjdXRhYmxlLT5jb250YWluc0FsbERhdGEoCisJCQkJCQkJYmZJbnN0YW5jZS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSkgKQorCQkJCQl7CisJCQkJCQluZXdJbnN0YW5jZSA9IG5ldyBJbnN0YW5jZU9mRGF0YShhbkV4ZWN1dGFibGUsCisJCQkJCQkJCXB0ckluc3RhbmNlLT50bzwgSW5zdGFuY2VPZkRhdGEgPigpLAorCQkJCQkJCQl0aGVJbnN0YW5jZU9mTWFjaGluZVBhdGgpOworCQkJCQl9CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJY2FzZSBGT1JNX0lOU1RBTkNFX01BQ0hJTkVfS0lORDoKKwkJCQl7CisJCQkJCWlmKCBsY2FFeGVjdXRhYmxlLT5nZXRJbnN0YW5jZVN0YXRpYygpLmNvbnRhaW5zKGJmSW5zdGFuY2UpICkKKwkJCQkJeworCQkJCQkJbmV3SW5zdGFuY2UgPSBuZXcgSW5zdGFuY2VPZk1hY2hpbmUoYW5FeGVjdXRhYmxlLAorCQkJCQkJCQlwdHJJbnN0YW5jZS0+dG88IEluc3RhbmNlT2ZNYWNoaW5lID4oKSwKKwkJCQkJCQkJdGhlSW5zdGFuY2VPZk1hY2hpbmVQYXRoKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQljYXNlIEZPUk1fSU5TVEFOQ0VfUE9SVF9LSU5EOgorCQkJCXsKKwkJCQkJaWYoIGxjYUV4ZWN1dGFibGUtPmdldFBvcnQoKS5jb250YWlucyhiZkluc3RhbmNlKSApCisJCQkJCXsKKwkJCQkJCW5ld0luc3RhbmNlID0gbmV3IEluc3RhbmNlT2ZQb3J0KGFuRXhlY3V0YWJsZSwKKwkJCQkJCQkJcHRySW5zdGFuY2UtPnRvPCBJbnN0YW5jZU9mUG9ydCA+KCksCisJCQkJCQkJCXRoZUluc3RhbmNlT2ZNYWNoaW5lUGF0aCk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJY2FzZSBGT1JNX0lOU1RBTkNFX0JVRkZFUl9LSU5EOgorCQkJCXsKKwkJCQkJaWYoIGxjYUV4ZWN1dGFibGUtPmdldEJ1ZmZlcigpLmNvbnRhaW5zKGJmSW5zdGFuY2UpICkKKwkJCQkJeworCQkJCQkJbmV3SW5zdGFuY2UgPSBuZXcgSW5zdGFuY2VPZkJ1ZmZlcihhbkV4ZWN1dGFibGUsCisJCQkJCQkJCXB0ckluc3RhbmNlLT50bzwgSW5zdGFuY2VPZkJ1ZmZlciA+KCksCisJCQkJCQkJCXRoZUluc3RhbmNlT2ZNYWNoaW5lUGF0aCk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJY2FzZSBGT1JNX0lOU1RBTkNFX0NPTk5FQ1RPUl9LSU5EOgorCQkJCXsKKwkJCQkJaWYoIGxjYUV4ZWN1dGFibGUtPmdldENvbm5lY3QoKS5jb250YWlucyhiZkluc3RhbmNlKSApCisJCQkJCXsKKwkJCQkJCW5ld0luc3RhbmNlID0gbmV3IEluc3RhbmNlT2ZDb25uZWN0KGFuRXhlY3V0YWJsZSwKKwkJCQkJCQkJcHRySW5zdGFuY2UtPnRvPCBJbnN0YW5jZU9mQ29ubmVjdCA+KCksCisJCQkJCQkJCXRoZUluc3RhbmNlT2ZNYWNoaW5lUGF0aCk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJZGVmYXVsdCA6CisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmKCBuZXdJbnN0YW5jZS52YWxpZCgpICkKKwkJCXsKKwkJCQluZXdJbnN0YW5jZS5zZXRGdWxseVF1YWxpZmllZE5hbWVJRCggImFsaWFzIiArCisJCQkJCQlwdHJJbnN0YW5jZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKS5zdWJzdHIoCisJCQkJCQkJCXB0ckluc3RhbmNlLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpLmZpbmQoJzonKSkgKTsKKworCQkJCWlmKCBub3QgbmV3SW5zdGFuY2UuZ2V0TW9kaWZpZXIoKS4KKwkJCQkJCWlzVmlzaWJpbGl0eVB1YmxpYyggYUNUWC0+Z2V0TW9kaWZpZXIoKSApICkKKwkJCQl7CisJCQkJCWluY3JFcnJvckNvdW50KCk7CisJCQkJCUVSUk9SX09TIDw8ICJGYWlsZWQgdG8gY3JlYXRlIEFMSUFTIGZvciBhIG5vbiBQVUJMSUMgaW5zdGFuY2UgPDwgIgorCQkJCQkJCTw8IHN0cl9oZWFkZXIoIHB0ckluc3RhbmNlICkgPDwgIiA+PiAhISEiOworCQkJCX0KKworCQkJCWlmKCBuZXdJbnN0YW5jZS5pczwgSW5zdGFuY2VPZkRhdGEgPigpICkKKwkJCQl7CisJCQkJCWFDVFgtPm1Db21waWxlQ3R4LT5nZXRFeGVjdXRhYmxlKCktPmFwcGVuZERhdGFBbGlhcyhuZXdJbnN0YW5jZSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWFDVFgtPm1Db21waWxlQ3R4LT5nZXRFeGVjdXRhYmxlKCktPmFwcGVuZEFsaWFzKG5ld0luc3RhbmNlKTsKKwkJCQl9CisKKwkJCQlyZXR1cm4oIG5ld0luc3RhbmNlICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaW5jckVycm9yQ291bnQoKTsKKwkJCQlFUlJPUl9PUyA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBBTElBUyBmb3IgaW5zdGFuY2UgPDwgIgorCQkJCQkJPDwgc3RyX2hlYWRlciggcHRySW5zdGFuY2UgKSA8PCAiID4+ICEhISI7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4oIGJmSW5zdGFuY2UgKTsKK30KKworCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvY29tcGlsZXIvU3ltYm9sVGFibGUuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvY29tcGlsZXIvU3ltYm9sVGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjQwOWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9jb21waWxlci9TeW1ib2xUYWJsZS5oCkBAIC0wLDAgKzEsOTIzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIEJVSUxERVJfQ09NUElMRVJfU1lNQk9MVEFCTEVfSF8KKyNkZWZpbmUgQlVJTERFUl9DT01QSUxFUl9TWU1CT0xUQUJMRV9IXworCisjaW5jbHVkZSA8YnVpbGRlci9jb21waWxlci9TeW1ib2xQcmVkaWNhdGUuaD4KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vVHlwZWRlZi5oPgorI2luY2x1ZGUgPGNvbGxlY3Rpb24vQkZDb250YWluZXIuaD4KKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVRdWVyeS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZEYXRhLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZk1hY2hpbmUuaD4KKworI2luY2x1ZGUgPGZtbC9zeW1ib2wvU3ltYm9sLmg+CisKKyNpbmNsdWRlIDxmbWwvdHlwZS9CYXNlVHlwZVNwZWNpZmllci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjbGFzcyBDT01QSUxFX0NPTlRFWFQ7CisKK2NsYXNzIENvbmZpZ3VyYXRpb247CisKK2NsYXNzIEV4ZWN1dGFibGVGb3JtOworY2xhc3MgRXhlY3V0YWJsZVN5c3RlbTsKKworY2xhc3MgSW5zdGFuY2VPZkJ1ZmZlcjsKK2NsYXNzIEluc3RhbmNlT2ZQb3J0OworCitjbGFzcyBPYmplY3RFbGVtZW50OworCitjbGFzcyBNYWNoaW5lOworY2xhc3MgUG9ydDsKKworY2xhc3MgVHlwZVNwZWNpZmllcjsKKworY2xhc3MgVW5pRm9ybUlkZW50aWZpZXI7CisKKworCitjbGFzcyBTeW1ib2xUYWJsZQoreworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQVRUUklCVVRFCisJICovCisJQ29uZmlndXJhdGlvbiAmIG1Db25maWd1cmF0aW9uOworCisJTGlzdE9mU3ltYm9sIG1MaXN0T2ZJbnN0YW5jZVN0YXRpYzsKKworCUxpc3RPZlN5bWJvbCBtTGlzdE9mUG9ydEluc3RhbmNlOworCisJTGlzdE9mU3ltYm9sIG1MaXN0T2ZCdWZmZXJJbnN0YW5jZTsKKworCUxpc3RPZlN5bWJvbCBtTGlzdE9mQ29ubmVjdG9ySW5zdGFuY2U7CisKKwlMaXN0T2ZTeW1ib2wgbUxpc3RPZkRhdGFJbnN0YW5jZTsKKworCisJQkZMaXN0IG1MaXN0T2ZNYWNoaW5lRXhlY3V0YWJsZTsKKworCUJGTGlzdCBtTGlzdE9mQXZtVHJhbnNpdGlvbjsKKworCUJGTGlzdCBtTGlzdE9mQXZtUHJvZ3JhbTsKKworCUV4ZWN1dGFibGVRdWVyeSBYUXVlcnk7CisKKworCWF2bV9zaXplX3QgbUVycm9yQ291bnQ7CisKKwlhdm1fc2l6ZV90IG1XYXJuaW5nQ291bnQ7CisKKwlTdHJpbmdPdXRTdHJlYW0gRVJST1JfT1M7CisKKwlTdHJpbmdPdXRTdHJlYW0gV0FSTklOR19PUzsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJU3ltYm9sVGFibGUoQ29uZmlndXJhdGlvbiAmIGFDb25maWd1cmF0aW9uKQorCTogbUNvbmZpZ3VyYXRpb24oIGFDb25maWd1cmF0aW9uICksCisJWFF1ZXJ5KCBtQ29uZmlndXJhdGlvbiApLAorCW1FcnJvckNvdW50KCAwICksCisJbVdhcm5pbmdDb3VudCgwKSwKKwlFUlJPUl9PUygpLAorCVdBUk5JTkdfT1MoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJU3ltYm9sVGFibGUoY29uc3QgU3ltYm9sVGFibGUgJiBhU3ltYm9sVGFibGUpCisJOiBtQ29uZmlndXJhdGlvbiggYVN5bWJvbFRhYmxlLm1Db25maWd1cmF0aW9uICksCisJWFF1ZXJ5KCBtQ29uZmlndXJhdGlvbiApLAorCW1FcnJvckNvdW50KCBhU3ltYm9sVGFibGUubUVycm9yQ291bnQgKSwKKwltV2FybmluZ0NvdW50KGFTeW1ib2xUYWJsZS5tV2FybmluZ0NvdW50ICksCisJRVJST1JfT1MoKSwKKwlXQVJOSU5HX09TKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5TeW1ib2xUYWJsZSgpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qCisJICogU0VUVEVSCisJICogbUV4ZWN1dGFibGVTeXN0ZW0KKwkgKi8KKwlpbmxpbmUgdm9pZCBzZXRTeW1ib2xUYWJsZShTeW1ib2xUYWJsZSAmIGFTeW1ib2xUYWJsZSkKKwl7CisJCW1MaXN0T2ZJbnN0YW5jZVN0YXRpYy5hcHBlbmQoIGFTeW1ib2xUYWJsZS5tTGlzdE9mSW5zdGFuY2VTdGF0aWMgKTsKKworCQltTGlzdE9mUG9ydEluc3RhbmNlLmFwcGVuZCggYVN5bWJvbFRhYmxlLm1MaXN0T2ZQb3J0SW5zdGFuY2UgKTsKKworCQltTGlzdE9mQnVmZmVySW5zdGFuY2UuYXBwZW5kKCBhU3ltYm9sVGFibGUubUxpc3RPZkJ1ZmZlckluc3RhbmNlICk7CisKKwkJbUxpc3RPZkNvbm5lY3Rvckluc3RhbmNlLmFwcGVuZCggYVN5bWJvbFRhYmxlLm1MaXN0T2ZDb25uZWN0b3JJbnN0YW5jZSApOworCisJCW1MaXN0T2ZEYXRhSW5zdGFuY2UuYXBwZW5kKCBhU3ltYm9sVGFibGUubUxpc3RPZkRhdGFJbnN0YW5jZSApOworCisJCW1MaXN0T2ZBdm1UcmFuc2l0aW9uLmFwcGVuZCggYVN5bWJvbFRhYmxlLm1MaXN0T2ZBdm1UcmFuc2l0aW9uICk7CisKKwkJbUxpc3RPZkF2bVByb2dyYW0uYXBwZW5kKCBhU3ltYm9sVGFibGUubUxpc3RPZkF2bVByb2dyYW0gKTsKKwl9CisKKworCS8qKgorCSAqIFNFQVJDSAorCSAqIGZvciBQb3J0CisJICovCisJSW5zdGFuY2VPZlBvcnQgKiBzZWFyY2hQb3J0Q29ubmVjdG9ySW5zdGFuY2UoCisJCQlFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZSwgY29uc3QgT2JqZWN0RWxlbWVudCAqIGFQb3J0KSBjb25zdDsKKworCUluc3RhbmNlT2ZQb3J0ICogc2VhcmNoUG9ydENvbm5lY3Rvckluc3RhbmNlKAorCQkJRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGUsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCkgY29uc3Q7CisKKworCWNvbnN0IFN5bWJvbCAmIHNlYXJjaFBvcnRTeW1ib2xJbnN0YW5jZSgKKwkJCUV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlLCBQb3J0ICogYVBvcnQpIGNvbnN0OworCisKKwkvKioKKwkgKiBTRUFSQ0gKKwkgKiBmb3IgVHlwZQorCSAqLworCXN0YXRpYyBjb25zdCBUeXBlU3BlY2lmaWVyICYgc2VhcmNoVHlwZVNwZWNpZmllcigKKwkJCUV4ZWN1dGFibGVTeXN0ZW0gJiBhbkV4ZWN1dGFibGVTeXN0ZW0sCisJCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBPYmplY3RFbGVtZW50ICogb2JqRWxlbWVudCk7CisKKwlzdGF0aWMgY29uc3QgVHlwZVNwZWNpZmllciAmIHNlYXJjaFR5cGVTcGVjaWZpZXIoCisJCQlFeGVjdXRhYmxlU3lzdGVtICYgYW5FeGVjdXRhYmxlU3lzdGVtLCBDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQpOworCisJLyoqCisJICogU0VBUkNICisJICogZm9yIERhdGEKKwkgKi8KKwljb25zdCBCRiAmIHNlYXJjaERhdGFJbnN0YW5jZShCYXNlQXZtUHJvZ3JhbSAqIHRtcFByb2dyYW0sCisJCQljb25zdCBPYmplY3RFbGVtZW50ICogb2JqRWxlbWVudCkgY29uc3Q7CisKKwljb25zdCBCRiAmIHNlYXJjaERhdGFJbnN0YW5jZSgKKwkJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IE9iamVjdEVsZW1lbnQgKiBvYmpFbGVtZW50KTsKKworCisJY29uc3QgQkYgJiBzZWFyY2hEYXRhSW5zdGFuY2UoQmFzZUF2bVByb2dyYW0gKiB0bXBQcm9ncmFtLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQpIGNvbnN0OworCisJY29uc3QgQkYgJiBzZWFyY2hEYXRhSW5zdGFuY2UoQ09NUElMRV9DT05URVhUICogYUNUWCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEKTsKKworCisJY29uc3QgQkYgJiBzZWFyY2hEYXRhSW5zdGFuY2VCeVF1YWxpZmllZE5hbWVJRChCYXNlQXZtUHJvZ3JhbSAqIHRtcFByb2dyYW0sCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpIGNvbnN0OworCisJY29uc3QgQkYgJiBzZWFyY2hEYXRhSW5zdGFuY2VCeVF1YWxpZmllZE5hbWVJRCgKKwkJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCk7CisKKworCWNvbnN0IEJGICYgc2VhcmNoRGF0YUluc3RhbmNlQnlOYW1lSUQoCisJCQlCYXNlQXZtUHJvZ3JhbSAqIHRtcFByb2dyYW0sIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkgY29uc3Q7CisKKy8vJERFTEVURQorLy8JY29uc3QgQkYgJiBzZWFyY2hEYXRhSW5zdGFuY2VCeU5hbWVJRCgKKy8vCQkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKTsKKworCisKKwljb25zdCBCRiAmIHNlYXJjaERhdGFJbnN0YW5jZUFsaWFzKAorCQkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgT2JqZWN0RWxlbWVudCAqIG9iakVsZW1lbnQpOworCisJY29uc3QgQkYgJiBzZWFyY2hEYXRhSW5zdGFuY2VBbGlhcyhDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQpOworCisKKwljb25zdCBCRiAmIGNyZWF0ZURhdGFJbnN0YW5jZUFsaWFzKEV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQsCisJCQlJbnN0YW5jZU9mRGF0YSAqIGFuSW5zdGFuY2UsIEV4ZWN1dGFibGVGb3JtICogaW5zdENvbnRhaW5lcik7CisKKwljb25zdCBCRiAmIGNyZWF0ZURhdGFJbnN0YW5jZUFsaWFzKEV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQsCisJCQlJbnN0YW5jZU9mRGF0YSAqIGFuSW5zdGFuY2UsCisJCQlWZWN0b3JPZkluc3RhbmNlT2ZNYWNoaW5lICYgdGhlSW5zdGFuY2VPZk1hY2hpbmVQYXRoKTsKKworCS8qKgorCSAqIFNFQVJDSAorCSAqIGZvciBNYWNoaW5lIEluc3RhbmNlCisJICovCisJY29uc3QgU3ltYm9sICYgc2VhcmNoSW5zdGFuY2VNb2RlbCgKKwkJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IE9iamVjdEVsZW1lbnQgKiBhc3RFbGVtZW50KSBjb25zdDsKKworCWNvbnN0IFN5bWJvbCAmIHNlYXJjaEluc3RhbmNlU3RhdGljKAorCQkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgT2JqZWN0RWxlbWVudCAqIGFzdEVsZW1lbnQpIGNvbnN0OworCisJY29uc3QgU3ltYm9sICYgc2VhcmNoSW5zdGFuY2VEeW5hbWljKAorCQkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgT2JqZWN0RWxlbWVudCAqIGFzdEVsZW1lbnQpIGNvbnN0OworCisKKwljb25zdCBTeW1ib2wgJiBzZWFyY2hJbnN0YW5jZU1vZGVsQnlOYW1lSUQoCisJCQlFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZSwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKSBjb25zdDsKKworCWNvbnN0IFN5bWJvbCAmIHNlYXJjaEluc3RhbmNlTW9kZWxCeU5hbWVJRCgKKwkJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkgY29uc3Q7CisKKwljb25zdCBTeW1ib2wgJiBzZWFyY2hNYWNoaW5lSW5zdGFuY2VCeU5hbWVJRCgKKwkJCUV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlLCBjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpIGNvbnN0OworCisJY29uc3QgU3ltYm9sICYgc2VhcmNoTWFjaGluZUluc3RhbmNlQnlOYW1lSUQoCisJCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpIGNvbnN0OworCisKKwlJbnN0YW5jZU9mTWFjaGluZSAqIHNlYXJjaEluc3RhbmNlU3RhdGljKAorCQkJY29uc3QgT2JqZWN0RWxlbWVudCAqIGZyb21NYWNoaW5lLCBjb25zdCBVbmlGb3JtSWRlbnRpZmllciAmIGFuVUZJKTsKKworCXZvaWQgc2VhcmNoSW5zdGFuY2VTdGF0aWMoY29uc3QgT2JqZWN0RWxlbWVudCAqIHJlZk1hY2hpbmUsCisJCQljb25zdCBVbmlGb3JtSWRlbnRpZmllciAmIGFuVUZJLCBCRkxpc3QgJiBmb3VuZExpc3QpIGNvbnN0OworCisKKwl2b2lkIHNlYXJjaEluc3RhbmNlQnlOYW1lSUQoQ09NUElMRV9DT05URVhUICogYUNUWCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCwgQkZMaXN0ICYgZm91bmRMaXN0KSBjb25zdDsKKworCXZvaWQgc2VhcmNoSW5zdGFuY2VCeVF1YWxpZmllZE5hbWVJRChDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlELCBCRkxpc3QgJiBmb3VuZExpc3QpIGNvbnN0OworCisJLyoqCisJICogU0VBUkNICisJICogZm9yIERhdGEsIFBvcnQgb3IgTWFjaGluZQorCSAqLworCWNvbnN0IEJGICYgc2VhcmNoSW5zdGFuY2UoCisJCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBPYmplY3RFbGVtZW50ICogb2JqRWxlbWVudCk7CisKKwljb25zdCBCRiAmIHNlYXJjaEluc3RhbmNlKENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCk7CisKKworCS8qKgorCSAqIFNFQVJDSCBTWU1CT0wKKwkgKiBmb3IgRGF0YSwgUG9ydCBvciBNYWNoaW5lCisJICovCisJY29uc3QgQkYgJiBzZWFyY2hTeW1ib2woCisJCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBPYmplY3RFbGVtZW50ICogb2JqRWxlbWVudCk7CisKKwljb25zdCBCRiAmIHNlYXJjaFN5bWJvbChDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQpOworCisJQkYgc2VhcmNoU3ltYm9sQnlVRkkoQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgVW5pRm9ybUlkZW50aWZpZXIgJiBhblVGSSk7CisKKworCWNvbnN0IEJGICYgc2VhcmNoU2VtU3ltYm9sKENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsCisJCQljb25zdCBPYmplY3RFbGVtZW50ICogb2JqRWxlbWVudCkgY29uc3Q7CisKKwljb25zdCBCRiAmIHNlYXJjaFNlbVN5bWJvbEJ5UXVhbGlmaWVkTmFtZUlEKENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpIGNvbnN0OworCisJY29uc3QgQkYgJiBzZWFyY2hTZW1TeW1ib2xCeU5hbWVJRChDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKSBjb25zdDsKKworCisJQkYgc2VhcmNoU3ltYm9sQnlRdWFsaWZpZWROYW1lSUQoQ09NUElMRV9DT05URVhUICogYUNUWCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCk7CisKKwlCRiBzZWFyY2hTeW1ib2xCeU5hbWVJRCgKKwkJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCk7CisKKworCUJGIGNyZWF0ZUFsaWFzSWZOb3RBY2Nlc3NpYmxlKENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsCisJCQlJbnN0YW5jZU9mTWFjaGluZSAqIGFDb250YWluZXJJbnN0YW5jZSwgY29uc3QgQkYgJiBiZkluc3RhbmNlKTsKKworCUJGIGNyZWF0ZUFsaWFzSWZOb3RBY2Nlc3NpYmxlKENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGICYgYmZJbnN0YW5jZSk7CisKKworCS8qKgorCSAqIFNFQVJDSAorCSAqIEV4ZWN1dGFibGUgZm9yIGEgZ2l2ZW4gRk9STQorCSAqLworCWNvbnN0IEJGICYgc2VhcmNoVHJhbnNpdGlvbigKKwkJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IE9iamVjdEVsZW1lbnQgKiBvYmpFbGVtZW50KSBjb25zdDsKKworCWNvbnN0IEJGICYgc2VhcmNoVHJhbnNpdGlvbihDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQpIGNvbnN0OworCisJY29uc3QgQkYgJiBzZWFyY2hUcmFuc2l0aW9uQnlOYW1lSUQoCisJCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpIGNvbnN0OworCisKKwljb25zdCBCRiAmIHNlYXJjaFByb2dyYW0oQ09NUElMRV9DT05URVhUICogYUNUWCwKKwkJCWNvbnN0IE9iamVjdEVsZW1lbnQgKiBvYmpFbGVtZW50KSBjb25zdDsKKworCWNvbnN0IEJGICYgc2VhcmNoUHJvZ3JhbShDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQpIGNvbnN0OworCisJY29uc3QgQkYgJiBzZWFyY2hQcm9ncmFtQnlOYW1lSUQoCisJCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpIGNvbnN0OworCisJLyoqCisJICogU0VBUkNICisJICogRXhlY3V0YWJsZSBvZiB0aGUgTU9ERUwgZm9yIGEgZ2l2ZW4gRk9STQorCSAqLworCUV4ZWN1dGFibGVGb3JtICogc2VhcmNoRXhlY3V0YWJsZU1vZGVsKGNvbnN0IE1hY2hpbmUgKiBhTWFjaGluZSk7CisKKwkvKioKKwkgKiBTRUFSQ0gKKwkgKiBJbnN0YW5jZSBmb3IgYSBnaXZlbiBGT1JNCisJICovCisJaW5saW5lIGNvbnN0IEJGICYgc2VhcmNoQ29tcGlsZWRFbGVtZW50KAorCQkJY29uc3QgQkZMaXN0ICYgbGlzdE9mSW5zdGFuY2UsIGNvbnN0IFN5bWJvbFByZWRpY2F0ZSAmIHByZWQpIGNvbnN0CisJeworCQlCRkxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbGlzdE9mSW5zdGFuY2UuYmVnaW4oKTsKKwkJZm9yKCA7IGl0ICE9IGxpc3RPZkluc3RhbmNlLmVuZCgpIDsgKytpdCApCisJCXsKKwkJCWlmKCBwcmVkKCAoKml0KS50b19wdHI8IEJhc2VDb21waWxlZEZvcm0gPigpICkgKQorCQkJeworCQkJCXJldHVybiggKml0ICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCX0KKworCWlubGluZSBjb25zdCBTeW1ib2wgJiBzZWFyY2hDb21waWxlZEVsZW1lbnQoCisJCQljb25zdCBMaXN0T2ZTeW1ib2wgJiBsaXN0T2ZJbnN0YW5jZSwKKwkJCWNvbnN0IFN5bWJvbFByZWRpY2F0ZSAmIHByZWQpIGNvbnN0CisJeworCQlMaXN0T2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbGlzdE9mSW5zdGFuY2UuYmVnaW4oKTsKKwkJTGlzdE9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IGxpc3RPZkluc3RhbmNlLmVuZCgpOworCQlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJeworCQkJaWYoIHByZWQoICgqaXQpICkgKQorCQkJeworCQkJCXJldHVybiggKml0ICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4oIFN5bWJvbDo6UkVGX05VTEwgKTsKKwl9CisKKwl0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CisJaW5saW5lIFQgKiBzZWFyY2hDb21waWxlZEVsZW1lbnQoQkZWZWN0b3IgJiB0YWJsZU9mSW5zdGFuY2UsCisJCQljb25zdCBTeW1ib2xQcmVkaWNhdGUgJiBwcmVkKSBjb25zdAorCXsKKwkJQkZWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gdGFibGVPZkluc3RhbmNlLmJlZ2luKCk7CisJCWZvciggOyBpdCAhPSB0YWJsZU9mSW5zdGFuY2UuZW5kKCkgOyArK2l0ICkKKwkJeworCQkJaWYoIHByZWQoICgqaXQpLmFzX3B0cjwgVCA+KCkgKSApCisJCQl7CisJCQkJcmV0dXJuKCAoKml0KS50b19wdHI8IFQgPigpICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4oIE5VTEwgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgU3ltYm9sICYgc2VhcmNoQ29tcGlsZWRFbGVtZW50KAorCQkJVmVjdG9yT2ZTeW1ib2wgJiB0YWJsZU9mSW5zdGFuY2UsCisJCQljb25zdCBTeW1ib2xQcmVkaWNhdGUgJiBwcmVkKSBjb25zdAorCXsKKwkJVmVjdG9yT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gdGFibGVPZkluc3RhbmNlLmJlZ2luKCk7CisJCVZlY3Rvck9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IHRhYmxlT2ZJbnN0YW5jZS5lbmQoKTsKKwkJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJCXsKKwkJCWlmKCBwcmVkKCAoKml0KSApICkKKwkJCXsKKwkJCQlyZXR1cm4oICgqaXQpICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4oIFN5bWJvbDo6UkVGX05VTEwgKTsKKwl9CisKKworCWlubGluZSB2b2lkIHNlYXJjaENvbXBpbGVkRWxlbWVudChjb25zdCBMaXN0T2ZTeW1ib2wgJiBsaXN0T2ZJbnN0YW5jZSwKKwkJCWNvbnN0IFN5bWJvbFByZWRpY2F0ZSAmIHByZWQsIEJGTGlzdCAmIGZvdW5kTGlzdCkgY29uc3QKKwl7CisJCUxpc3RPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBsaXN0T2ZJbnN0YW5jZS5iZWdpbigpOworCQlMaXN0T2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gbGlzdE9mSW5zdGFuY2UuZW5kKCk7CisJCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCQl7CisJCQlpZiggcHJlZCggKCppdCkgKSApCisJCQl7CisJCQkJZm91bmRMaXN0LmFwcGVuZCggKml0ICk7CisJCQl9CisJCX0KKwl9CisKKworCS8qKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBHRVRURVIgLyBTRVRURVIKKwkgKiBtTGlzdE9mTWFjaGluZUV4ZWN1dGFibGUKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJaW5saW5lIGNvbnN0IEJGICYgc2VhcmNoRXhlY3V0YWJsZShjb25zdCBPYmplY3RFbGVtZW50ICogYW5FbGVtZW50KSBjb25zdAorCXsKKwkJU3ltYm9sUHJlZGljYXRlQnlDb21waWxlZEVsZW1lbnQgcHJlZCggYW5FbGVtZW50ICk7CisKKwkJcmV0dXJuKCBzZWFyY2hDb21waWxlZEVsZW1lbnQobUxpc3RPZk1hY2hpbmVFeGVjdXRhYmxlLCBwcmVkKSApOworCX0KKworCWlubGluZSBjb25zdCBCRiAmIHNlYXJjaEV4ZWN1dGFibGUoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCkgY29uc3QKKwl7CisJCVN5bWJvbFByZWRpY2F0ZUJ5Q29tcGlsZWRGUU5hbWVJRCBwcmVkKGFGdWxseVF1YWxpZmllZE5hbWVJRCk7CisKKwkJcmV0dXJuKCBzZWFyY2hDb21waWxlZEVsZW1lbnQobUxpc3RPZk1hY2hpbmVFeGVjdXRhYmxlLCBwcmVkKSApOworCX0KKworCWlubGluZSBjb25zdCBCRiAmIHNlYXJjaEV4ZWN1dGFibGVCeVF1YWxpZmllZE5hbWVJRCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkgY29uc3QKKwl7CisJCVN5bWJvbFByZWRpY2F0ZUJ5UXVhbGlmaWVkTmFtZUlEIHByZWQoYVF1YWxpZmllZE5hbWVJRCk7CisKKwkJcmV0dXJuKCBzZWFyY2hDb21waWxlZEVsZW1lbnQobUxpc3RPZk1hY2hpbmVFeGVjdXRhYmxlLCBwcmVkKSApOworCX0KKworCWlubGluZSBjb25zdCBCRiAmIHNlYXJjaEV4ZWN1dGFibGVCeU5hbWVJRCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkgY29uc3QKKwl7CisJCVN5bWJvbFByZWRpY2F0ZUJ5TmFtZUlEIHByZWQoYVF1YWxpZmllZE5hbWVJRCk7CisKKwkJcmV0dXJuKCBzZWFyY2hDb21waWxlZEVsZW1lbnQobUxpc3RPZk1hY2hpbmVFeGVjdXRhYmxlLCBwcmVkKSApOworCX0KKworCisKKwkvKioKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogR0VUVEVSIC8gU0VUVEVSCisJICogbUxpc3RPZkluc3RhbmNlU3RhdGljCisJICogIlNZTUJPTCBUQUJMRSA6IE1BQ0hJTkUiCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCisJaW5saW5lIHZvaWQgYWRkSW5zdGFuY2VTdGF0aWMoY29uc3QgU3ltYm9sICYgYW5JbnN0YW5jZSkKKwl7CisJCW1MaXN0T2ZJbnN0YW5jZVN0YXRpYy5hcHBlbmQoYW5JbnN0YW5jZSk7CisJfQorCisJaW5saW5lIGNvbnN0IFN5bWJvbCAmIHNlYXJjaEluc3RhbmNlU3RhdGljKAorCQkJY29uc3QgT2JqZWN0RWxlbWVudCAqIGFuRWxlbWVudCkgY29uc3QKKwl7CisJCVN5bWJvbFByZWRpY2F0ZUJ5Q29tcGlsZWRFbGVtZW50IHByZWQoIGFuRWxlbWVudCApOworCisJCXJldHVybiggc2VhcmNoQ29tcGlsZWRFbGVtZW50KG1MaXN0T2ZJbnN0YW5jZVN0YXRpYywgcHJlZCkgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgU3ltYm9sICYgc2VhcmNoSW5zdGFuY2VTdGF0aWMoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCkgY29uc3QKKwl7CisJCVN5bWJvbFByZWRpY2F0ZUJ5Q29tcGlsZWRGUU5hbWVJRCBwcmVkKGFGdWxseVF1YWxpZmllZE5hbWVJRCk7CisKKwkJcmV0dXJuKCBzZWFyY2hDb21waWxlZEVsZW1lbnQobUxpc3RPZkluc3RhbmNlU3RhdGljLCBwcmVkKSApOworCX0KKworCisJaW5saW5lIHZvaWQgc2VhcmNoTWFjaGluZUluc3RhbmNlQnlOYW1lSUQoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsIEJGTGlzdCAmIGZvdW5kTGlzdCkgY29uc3QKKwl7CisJCVN5bWJvbFByZWRpY2F0ZUJ5TmFtZUlEIHByZWQoYU5hbWVJRCk7CisKKwkJc2VhcmNoQ29tcGlsZWRFbGVtZW50KG1MaXN0T2ZJbnN0YW5jZVN0YXRpYywgcHJlZCwgZm91bmRMaXN0KTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZWFyY2hNYWNoaW5lSW5zdGFuY2VCeVF1YWxpZmllZE5hbWVJRCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCwgQkZMaXN0ICYgZm91bmRMaXN0KSBjb25zdAorCXsKKwkJU3ltYm9sUHJlZGljYXRlQnlRdWFsaWZpZWROYW1lSUQgcHJlZChhUXVhbGlmaWVkTmFtZUlEKTsKKworCQlzZWFyY2hDb21waWxlZEVsZW1lbnQobUxpc3RPZkluc3RhbmNlU3RhdGljLCBwcmVkLCBmb3VuZExpc3QpOworCX0KKworCisJLyoqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIEdFVFRFUiAvIFNFVFRFUgorCSAqIG1MaXN0T2ZQb3J0SW5zdGFuY2UKKwkgKiAiU1lNQk9MIFRBQkxFIDogUE9SVCIKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJaW5saW5lIHZvaWQgYWRkUG9ydEluc3RhbmNlKGNvbnN0IFN5bWJvbCAmIGFuSW5zdGFuY2UpCisJeworCQltTGlzdE9mUG9ydEluc3RhbmNlLmFwcGVuZChhbkluc3RhbmNlKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgU3ltYm9sICYgc2VhcmNoUG9ydEluc3RhbmNlKAorCQkJY29uc3QgT2JqZWN0RWxlbWVudCAqIGFuRWxlbWVudCkgY29uc3QKKwl7CisJCVN5bWJvbFByZWRpY2F0ZUJ5Q29tcGlsZWRFbGVtZW50IHByZWQoIGFuRWxlbWVudCApOworCisJCXJldHVybiggc2VhcmNoQ29tcGlsZWRFbGVtZW50KG1MaXN0T2ZQb3J0SW5zdGFuY2UsIHByZWQpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2VhcmNoUG9ydEluc3RhbmNlQnlOYW1lSUQoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsIEJGTGlzdCAmIGZvdW5kTGlzdCkgY29uc3QKKwl7CisJCVN5bWJvbFByZWRpY2F0ZUJ5TmFtZUlEIHByZWQoYU5hbWVJRCk7CisKKwkJc2VhcmNoQ29tcGlsZWRFbGVtZW50KG1MaXN0T2ZQb3J0SW5zdGFuY2UsIHByZWQsIGZvdW5kTGlzdCk7CisJfQorCisJaW5saW5lIHZvaWQgc2VhcmNoUG9ydEluc3RhbmNlQnlRdWFsaWZpZWROYW1lSUQoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQsIEJGTGlzdCAmIGZvdW5kTGlzdCkgY29uc3QKKwl7CisJCVN5bWJvbFByZWRpY2F0ZUJ5UXVhbGlmaWVkTmFtZUlEIHByZWQoYVF1YWxpZmllZE5hbWVJRCk7CisKKwkJc2VhcmNoQ29tcGlsZWRFbGVtZW50KG1MaXN0T2ZQb3J0SW5zdGFuY2UsIHByZWQsIGZvdW5kTGlzdCk7CisJfQorCisKKwljb25zdCBTeW1ib2wgJiBzZWFyY2hQb3J0SW5zdGFuY2UoCisJCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBJbnN0YW5jZU9mRGF0YSAqIGFEYXRhKSBjb25zdDsKKworCisJLyoqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIEdFVFRFUiAvIFNFVFRFUgorCSAqIG1MaXN0T2ZCdWZmZXJJbnN0YW5jZQorCSAqICJTWU1CT0wgVEFCTEUgOiBCVUZGRVIiCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCWlubGluZSB2b2lkIGFkZEJ1ZmZlckluc3RhbmNlKGNvbnN0IFN5bWJvbCAmIGFuSW5zdGFuY2UpCisJeworCQltTGlzdE9mQnVmZmVySW5zdGFuY2UuYXBwZW5kKGFuSW5zdGFuY2UpOworCX0KKworCWlubGluZSBjb25zdCBTeW1ib2wgJiBzZWFyY2hCdWZmZXJJbnN0YW5jZSgKKwkJCWNvbnN0IE9iamVjdEVsZW1lbnQgKiBhbkVsZW1lbnQpIGNvbnN0CisJeworCQlTeW1ib2xQcmVkaWNhdGVCeUNvbXBpbGVkRWxlbWVudCBwcmVkKCBhbkVsZW1lbnQgKTsKKworCQlyZXR1cm4oIHNlYXJjaENvbXBpbGVkRWxlbWVudChtTGlzdE9mQnVmZmVySW5zdGFuY2UsIHByZWQpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2VhcmNoQnVmZmVySW5zdGFuY2VCeU5hbWVJRCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwgQkZMaXN0ICYgZm91bmRMaXN0KSBjb25zdAorCXsKKwkJU3ltYm9sUHJlZGljYXRlQnlOYW1lSUQgcHJlZChhTmFtZUlEKTsKKworCQlzZWFyY2hDb21waWxlZEVsZW1lbnQobUxpc3RPZkJ1ZmZlckluc3RhbmNlLCBwcmVkLCBmb3VuZExpc3QpOworCX0KKworCWlubGluZSB2b2lkIHNlYXJjaEJ1ZmZlckluc3RhbmNlQnlRdWFsaWZpZWROYW1lSUQoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQsIEJGTGlzdCAmIGZvdW5kTGlzdCkgY29uc3QKKwl7CisJCVN5bWJvbFByZWRpY2F0ZUJ5UXVhbGlmaWVkTmFtZUlEIHByZWQoYVF1YWxpZmllZE5hbWVJRCk7CisKKwkJc2VhcmNoQ29tcGlsZWRFbGVtZW50KG1MaXN0T2ZCdWZmZXJJbnN0YW5jZSwgcHJlZCwgZm91bmRMaXN0KTsKKwl9CisKKwljb25zdCBTeW1ib2wgJiBzZWFyY2hCdWZmZXJJbnN0YW5jZShFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZSwKKwkJCWNvbnN0IE9iamVjdEVsZW1lbnQgKiBvYmpFbGVtZW50KSBjb25zdDsKKworCWNvbnN0IFN5bWJvbCAmIHNlYXJjaEJ1ZmZlckluc3RhbmNlKEV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQpOworCisJY29uc3QgU3ltYm9sICYgc2VhcmNoQnVmZmVySW5zdGFuY2VCeVF1YWxpZmllZE5hbWVJRCgKKwkJCUV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKSBjb25zdDsKKworCWNvbnN0IFN5bWJvbCAmIHNlYXJjaEJ1ZmZlckluc3RhbmNlQnlOYW1lSUQoCisJCQlFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZSwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKSBjb25zdDsKKworCWNvbnN0IFN5bWJvbCAmIHNlYXJjaEJ1ZmZlckluc3RhbmNlQWxpYXMoRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGUsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCk7CisKKworCWNvbnN0IFN5bWJvbCAmIGNyZWF0ZUJ1ZmZlckluc3RhbmNlQWxpYXMoRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGUsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCwKKwkJCUluc3RhbmNlT2ZCdWZmZXIgKiBhbkluc3RhbmNlLAorCQkJVmVjdG9yT2ZJbnN0YW5jZU9mTWFjaGluZSAmIHRoZUluc3RhbmNlT2ZNYWNoaW5lUGF0aCk7CisKKwkvKioKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogR0VUVEVSIC8gU0VUVEVSCisJICogdGhlTGlzdE9mQ29ubmVjdEluc3RhbmNlCisJICogIlNZTUJPTCBUQUJMRSA6IENPTk5FQ1QiCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCWlubGluZSB2b2lkIGFkZENvbm5lY3RJbnN0YW5jZShjb25zdCBTeW1ib2wgJiBhbkluc3RhbmNlKQorCXsKKwkJbUxpc3RPZkNvbm5lY3Rvckluc3RhbmNlLmFwcGVuZChhbkluc3RhbmNlKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgU3ltYm9sICYgc2VhcmNoQ29ubmVjdG9ySW5zdGFuY2UoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCkgY29uc3QKKwl7CisJCVN5bWJvbFByZWRpY2F0ZUJ5Q29tcGlsZWRGUU5hbWVJRCBwcmVkKGFGdWxseVF1YWxpZmllZE5hbWVJRCk7CisKKwkJcmV0dXJuKCBzZWFyY2hDb21waWxlZEVsZW1lbnQobUxpc3RPZkNvbm5lY3Rvckluc3RhbmNlLCBwcmVkKSApOworCX0KKworCisJaW5saW5lIGNvbnN0IFN5bWJvbCAmIHNlYXJjaENvbm5lY3Rvckluc3RhbmNlKAorCQkJY29uc3QgT2JqZWN0RWxlbWVudCAqIGFuRWxlbWVudCkgY29uc3QKKwl7CisJCVN5bWJvbFByZWRpY2F0ZUJ5Q29tcGlsZWRFbGVtZW50IHByZWQoIGFuRWxlbWVudCApOworCisJCXJldHVybiggc2VhcmNoQ29tcGlsZWRFbGVtZW50KG1MaXN0T2ZDb25uZWN0b3JJbnN0YW5jZSwgcHJlZCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZWFyY2hDb25uZWN0b3JJbnN0YW5jZUJ5TmFtZUlEKAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELCBCRkxpc3QgJiBmb3VuZExpc3QpIGNvbnN0CisJeworCQlTeW1ib2xQcmVkaWNhdGVCeU5hbWVJRCBwcmVkKGFOYW1lSUQpOworCisJCXNlYXJjaENvbXBpbGVkRWxlbWVudChtTGlzdE9mQ29ubmVjdG9ySW5zdGFuY2UsIHByZWQsIGZvdW5kTGlzdCk7CisJfQorCisJaW5saW5lIHZvaWQgc2VhcmNoQ29ubmVjdG9ySW5zdGFuY2VCeVF1YWxpZmllZE5hbWVJRCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCwgQkZMaXN0ICYgZm91bmRMaXN0KSBjb25zdAorCXsKKwkJU3ltYm9sUHJlZGljYXRlQnlRdWFsaWZpZWROYW1lSUQgcHJlZChhUXVhbGlmaWVkTmFtZUlEKTsKKworCQlzZWFyY2hDb21waWxlZEVsZW1lbnQobUxpc3RPZkNvbm5lY3Rvckluc3RhbmNlLCBwcmVkLCBmb3VuZExpc3QpOworCX0KKworCisJY29uc3QgU3ltYm9sICYgc2VhcmNoQ29ubmVjdG9ySW5zdGFuY2UoRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGUsCisJCQljb25zdCBPYmplY3RFbGVtZW50ICogb2JqRWxlbWVudCkgY29uc3Q7CisKKwljb25zdCBTeW1ib2wgJiBzZWFyY2hDb25uZWN0b3JJbnN0YW5jZShFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZSwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEKSBjb25zdDsKKworCWNvbnN0IFN5bWJvbCAmIHNlYXJjaENvbm5lY3Rvckluc3RhbmNlQnlRdWFsaWZpZWROYW1lSUQoCisJCQlFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZSwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkgY29uc3Q7CisKKwljb25zdCBTeW1ib2wgJiBzZWFyY2hDb25uZWN0b3JJbnN0YW5jZUJ5TmFtZUlEKAorCQkJRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGUsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkgY29uc3Q7CisKKworCisJLyoqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIEdFVFRFUiAvIFNFVFRFUgorCSAqIG1MaXN0T2ZEYXRhSW5zdGFuY2UKKwkgKiAiU1lNQk9MIFRBQkxFIDogREFUQSIKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJaW5saW5lIHZvaWQgYWRkRGF0YUluc3RhbmNlKGNvbnN0IFN5bWJvbCAmIGFuSW5zdGFuY2UpCisJeworCQltTGlzdE9mRGF0YUluc3RhbmNlLmFwcGVuZChhbkluc3RhbmNlKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZWFyY2hEYXRhSW5zdGFuY2VCeU5hbWVJRCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwgQkZMaXN0ICYgZm91bmRMaXN0KSBjb25zdAorCXsKKwkJU3ltYm9sUHJlZGljYXRlQnlOYW1lSUQgcHJlZChhTmFtZUlEKTsKKworCQlzZWFyY2hDb21waWxlZEVsZW1lbnQobUxpc3RPZkRhdGFJbnN0YW5jZSwgcHJlZCwgZm91bmRMaXN0KTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZWFyY2hEYXRhSW5zdGFuY2VCeVF1YWxpZmllZE5hbWVJRCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCwgQkZMaXN0ICYgZm91bmRMaXN0KSBjb25zdAorCXsKKwkJU3ltYm9sUHJlZGljYXRlQnlRdWFsaWZpZWROYW1lSUQgcHJlZChhUXVhbGlmaWVkTmFtZUlEKTsKKworCQlzZWFyY2hDb21waWxlZEVsZW1lbnQobUxpc3RPZkRhdGFJbnN0YW5jZSwgcHJlZCwgZm91bmRMaXN0KTsKKwl9CisKKwkvKioKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogR0VUVEVSIC8gU0VUVEVSCisJICogbUxpc3RPZk1hY2hpbmVFeGVjdXRhYmxlCisJICogIlNZTUJPTCBUQUJMRSA6IE1BQ0hJTkUgRVhFQ1VUQUJMRSIKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJaW5saW5lIHZvaWQgYWRkTWFjaGluZUV4ZWN1dGFibGUoY29uc3QgQkYgJiBhbkV4ZWN1dGFibGUpCisJeworCQltTGlzdE9mTWFjaGluZUV4ZWN1dGFibGUuYXBwZW5kKCBhbkV4ZWN1dGFibGUgKTsKKwl9CisKKwkvKioKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogR0VUVEVSIC8gU0VUVEVSCisJICogbUxpc3RPZkF2bVRyYW5zaXRpb24KKwkgKiAiU1lNQk9MIFRBQkxFIDogQVZNIFBST0dSQU0iCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCWlubGluZSB2b2lkIGFkZFRyYW5zaXRpb24oY29uc3QgQkYgJiBhVHJhbnNpdGlvbikKKwl7CisJCW1MaXN0T2ZBdm1UcmFuc2l0aW9uLmFwcGVuZCggYVRyYW5zaXRpb24gKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQkYgJiBzZWFyY2hUcmFuc2l0aW9uKGNvbnN0IE9iamVjdEVsZW1lbnQgKiBhbkVsZW1lbnQpIGNvbnN0CisJeworCQlTeW1ib2xQcmVkaWNhdGVCeUNvbXBpbGVkRWxlbWVudCBwcmVkKCBhbkVsZW1lbnQgKTsKKworCQlyZXR1cm4oIHNlYXJjaENvbXBpbGVkRWxlbWVudChtTGlzdE9mQXZtVHJhbnNpdGlvbiwgcHJlZCkgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQkYgJiBzZWFyY2hUcmFuc2l0aW9uKAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQpIGNvbnN0CisJeworCQlTeW1ib2xQcmVkaWNhdGVCeUNvbXBpbGVkRlFOYW1lSUQgcHJlZChhRnVsbHlRdWFsaWZpZWROYW1lSUQpOworCisJCXJldHVybiggc2VhcmNoQ29tcGlsZWRFbGVtZW50KG1MaXN0T2ZBdm1UcmFuc2l0aW9uLCBwcmVkKSApOworCX0KKworCWlubGluZSBjb25zdCBCRiAmIHNlYXJjaFRyYW5zaXRpb25CeU5hbWVJRChjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpIGNvbnN0CisJeworCQlTeW1ib2xQcmVkaWNhdGVCeU5hbWVJRCBwcmVkKGFOYW1lSUQpOworCisJCXJldHVybiggc2VhcmNoQ29tcGlsZWRFbGVtZW50KG1MaXN0T2ZBdm1UcmFuc2l0aW9uLCBwcmVkKSApOworCX0KKworCisJLyoqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIEdFVFRFUiAvIFNFVFRFUgorCSAqIG1MaXN0T2ZBdm1Qcm9ncmFtCisJICogIlNZTUJPTCBUQUJMRSA6IEFWTSBQUk9HUkFNIgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKi8KKwlpbmxpbmUgdm9pZCBhZGRQcm9ncmFtKGNvbnN0IEJGICYgYVByb2dyYW0pCisJeworCQltTGlzdE9mQXZtUHJvZ3JhbS5hcHBlbmQoIGFQcm9ncmFtICk7CisJfQorCisJaW5saW5lIGNvbnN0IEJGICYgc2VhcmNoUHJvZ3JhbShjb25zdCBPYmplY3RFbGVtZW50ICogYW5FbGVtZW50KSBjb25zdAorCXsKKwkJU3ltYm9sUHJlZGljYXRlQnlDb21waWxlZEVsZW1lbnQgcHJlZCggYW5FbGVtZW50ICk7CisKKwkJcmV0dXJuKCBzZWFyY2hDb21waWxlZEVsZW1lbnQobUxpc3RPZkF2bVByb2dyYW0sIHByZWQpICk7CisJfQorCisJaW5saW5lIGNvbnN0IEJGICYgc2VhcmNoUHJvZ3JhbSgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEKSBjb25zdAorCXsKKwkJU3ltYm9sUHJlZGljYXRlQnlDb21waWxlZEZRTmFtZUlEIHByZWQoYUZ1bGx5UXVhbGlmaWVkTmFtZUlEKTsKKworCQlyZXR1cm4oIHNlYXJjaENvbXBpbGVkRWxlbWVudChtTGlzdE9mQXZtUHJvZ3JhbSwgcHJlZCkgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQkYgJiBzZWFyY2hQcm9ncmFtQnlOYW1lSUQoY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKSBjb25zdAorCXsKKwkJU3ltYm9sUHJlZGljYXRlQnlOYW1lSUQgcHJlZChhTmFtZUlEKTsKKworCQlyZXR1cm4oIHNlYXJjaENvbXBpbGVkRWxlbWVudChtTGlzdE9mQXZtUHJvZ3JhbSwgcHJlZCkgKTsKKwl9CisKKworCS8qCisJICogR0VUVEVSCisJICogbUVycm9yQ291bnQKKwkgKi8KKwlpbmxpbmUgYXZtX3NpemVfdCBnZXRFcnJvckNvdW50KCkgY29uc3QKKwl7CisJCXJldHVybiggbUVycm9yQ291bnQgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNFcnJvcigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1FcnJvckNvdW50ID4gMCApOworCX0KKworCWlubGluZSBib29sIGhhc1plcm9FcnJvcigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1FcnJvckNvdW50ID09IDAgKTsKKwl9CisKKwlpbmxpbmUgYXZtX3NpemVfdCBpbmNyRXJyb3JDb3VudCgpCisJeworCQlyZXR1cm4oICsrbUVycm9yQ291bnQgKTsKKwl9CisKKworCisJLyoKKwkgKiBHRVRURVIKKwkgKiBtV2FybmluZ0NvdW50CisJICovCisJaW5saW5lIGF2bV9zaXplX3QgZ2V0V2FybmluZ0NvdW50KCkgY29uc3QKKwl7CisJCXJldHVybiggbVdhcm5pbmdDb3VudCApOworCX0KKworCWlubGluZSBib29sIGhhc1dhcm5pbmcoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtV2FybmluZ0NvdW50ID4gMCApOworCX0KKworCWlubGluZSBib29sIGhhc1plcm9XYXJuaW5nKCkgY29uc3QKKwl7CisJCXJldHVybiggbVdhcm5pbmdDb3VudCA9PSAwICk7CisJfQorCisJaW5saW5lIGF2bV9zaXplX3QgaW5jcldhcm5pbmdDb3VudCgpCisJeworCQlyZXR1cm4oICsrbVdhcm5pbmdDb3VudCApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogRVJST1JfT1MKKwkgKi8KKwlpbmxpbmUgc3RkOjpzdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgY29uc3QKKwl7CisJCXJldHVybiggRVJST1JfT1Muc3RyKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNFcnJvck1lc3NhZ2UoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAhIChFUlJPUl9PUy5zdHIoKS5lbXB0eSgpKSApOworCX0KKworCisJaW5saW5lIHZvaWQgYWRkRXJyb3JNZXNzYWdlKGNvbnN0IHN0ZDo6c3RyaW5nICYgYW5FcnJvck1lc3NhZ2UpCisJeworCQlpZiggaGFzRXJyb3JNZXNzYWdlKCkgKQorCQl7CisJCQlFUlJPUl9PUyA8PCAiXG4iOworCQl9CisJCUVSUk9SX09TIDw8IGFuRXJyb3JNZXNzYWdlOworCX0KKworCisJaW5saW5lIHZvaWQgcmVzZXRFcnJvcigpCisJeworCQltRXJyb3JDb3VudCA9IDA7CisKKwkJRVJST1JfT1Muc3RyKCIiKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRFcnJvck1lc3NhZ2UoY29uc3Qgc3RkOjpzdHJpbmcgJiBhbkVycm9yTWVzc2FnZSkKKwl7CisJCXJlc2V0RXJyb3IoKTsKKwkJRVJST1JfT1MgPDwgYW5FcnJvck1lc3NhZ2U7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBXQVJOSU5HX09TCisJICovCisJaW5saW5lIHN0ZDo6c3RyaW5nIGdldFdhcm5pbmdNZXNzYWdlKCkgY29uc3QKKwl7CisJCXJldHVybiggV0FSTklOR19PUy5zdHIoKSApOworCX0KKworCWlubGluZSBib29sIGhhc1dhcm5pbmdNZXNzYWdlKCkgY29uc3QKKwl7CisJCXJldHVybiggISAoV0FSTklOR19PUy5zdHIoKS5lbXB0eSgpKSApOworCX0KKworCisJaW5saW5lIHZvaWQgYWRkV2FybmluZ01lc3NhZ2UoY29uc3Qgc3RkOjpzdHJpbmcgJiBhbldhcm5pbmdNZXNzYWdlKQorCXsKKwkJaWYoIGhhc1dhcm5pbmdNZXNzYWdlKCkgKQorCQl7CisJCQlXQVJOSU5HX09TIDw8ICJcbiI7CisJCX0KKwkJV0FSTklOR19PUyA8PCBhbldhcm5pbmdNZXNzYWdlOworCX0KKworCisJaW5saW5lIHZvaWQgcmVzZXRXYXJuaW5nKCkKKwl7CisJCW1XYXJuaW5nQ291bnQgPSAwOworCisJCVdBUk5JTkdfT1Muc3RyKCIiKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRXYXJuaW5nTWVzc2FnZShjb25zdCBzdGQ6OnN0cmluZyAmIGFuV2FybmluZ01lc3NhZ2UpCisJeworCQlyZXNldFdhcm5pbmcoKTsKKwkJV0FSTklOR19PUyA8PCBhbldhcm5pbmdNZXNzYWdlOworCX0KKworfTsKKworCit9CisKKyNlbmRpZiAvKiBCVUlMREVSX0NPTVBJTEVSX1NZTUJPTFRBQkxFX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9BYnN0cmFjdEF2bWNvZGVDb21waWxlci5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9BYnN0cmFjdEF2bWNvZGVDb21waWxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhhMjZiZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0Fic3RyYWN0QXZtY29kZUNvbXBpbGVyLmNwcApAQCAtMCwwICsxLDE5MzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiA3IGF2ci4gMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXIuaCIKKworI2luY2x1ZGUgPGJ1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVDb21waWxlci5oPgorCisjaW5jbHVkZSA8Y29tcHV0ZXIvaW5zdHJ1Y3Rpb24vQXZtSW5zdHJ1Y3Rpb24uaD4KKworI2luY2x1ZGUgPGZtbC9idWlsdGluL1F1YWxpZmllZElkZW50aWZpZXIuaD4KKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0Jhc2VBdm1Qcm9ncmFtLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZUxpYi5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZCdWZmZXIuaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mQ29ubmVjdC5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZEYXRhLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZk1hY2hpbmUuaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mUG9ydC5oPgorCisjaW5jbHVkZSA8Zm1sL2J1aWx0aW4vQm9vbGVhbi5oPgorI2luY2x1ZGUgPGZtbC9idWlsdGluL0NoYXJhY3Rlci5oPgorCisjaW5jbHVkZSA8Zm1sL251bWVyaWMvRmxvYXQuaD4KKyNpbmNsdWRlIDxmbWwvbnVtZXJpYy9JbnRlZ2VyLmg+CisjaW5jbHVkZSA8Zm1sL251bWVyaWMvUmF0aW9uYWwuaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0F2bUNvZGUuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9CdWlsdGluQXJyYXkuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uVHlwZUNoZWNrZXIuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9TdGF0ZW1lbnRUeXBlQ2hlY2tlci5oPgorCisjaW5jbHVkZSA8Zm1sL2xpYi9Bdm1PcGVyYXRpb25GYWN0b3J5Lmg+CisjaW5jbHVkZSA8Zm1sL2xpYi9JVHlwZVNwZWNpZmllci5oPgorCisjaW5jbHVkZSA8Zm1sL3R5cGUvQ29udGFpbmVyVHlwZVNwZWNpZmllci5oPgorCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0J1ZmZlci5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Db25uZWN0b3IuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvTWFjaGluZS5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Qb3J0Lmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1JvdXRpbmUuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvVHJhbnNpdGlvbi5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9WYXJpYWJsZS5oPgorCisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1VuaUZvcm1JZGVudGlmaWVyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTUEVDSUZJQyBBUkdVTUVOVCBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkYgQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXI6OmNvbXBpbGVBcmdMdmFsdWUoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGICYgYXJnKQoreworCUJGIGNvbXBpbGVBcmc7CisKKwlzd2l0Y2goIGFyZy5jbGFzc0tpbmQoKSApCisJeworCQljYXNlIEZPUk1fWEZTUF9WQVJJQUJMRV9LSU5EOgorCQl7CisJCQljb21waWxlQXJnID0gQVZNQ09ERV9DT01QSUxFUi5jb21waWxlVmFyaWFibGUoYUNUWCwgYXJnKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBGT1JNX0JVSUxUSU5fUVVBTElGSUVEX0lERU5USUZJRVJfS0lORDoKKwkJeworCQkJaWYoIGFyZy50b19wdHI8IFF1YWxpZmllZElkZW50aWZpZXIgPigpLT5pc1Bvc2l0aW9uYWxQYXJhbWV0ZXIoKSApCisJCQl7CisJCQkJY29tcGlsZUFyZyA9IEFWTUNPREVfQ09NUElMRVIuCisJCQkJCQljb21waWxlUXVhbGlmaWVkUG9zaXRpb25hbElkZW50aWZpZXIoYUNUWCwgYXJnKTsKKwkJCX0KKwkJCWVsc2UgaWYoIGFyZy5zdHIoKS5maW5kKCc6JykgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorCQkJeworCQkJCWNvbXBpbGVBcmcgPSBBVk1DT0RFX0NPTVBJTEVSLgorCQkJCQkJY29tcGlsZUZ1bGx5UXVhbGlmaWVkTmFtZUlEKGFDVFgsIGFyZyk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJY29tcGlsZUFyZyA9IEFWTUNPREVfQ09NUElMRVIuCisJCQkJCQljb21waWxlUXVhbGlmaWVkSWRlbnRpZmllcihhQ1RYLCBhcmcpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBGT1JNX0JVSUxUSU5fSURFTlRJRklFUl9LSU5EOgorCQl7CisJCQljb21waWxlQXJnID0gQVZNQ09ERV9DT01QSUxFUi5jb21waWxlSWRlbnRpZmllcihhQ1RYLCBhcmcpOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEZPUk1fWEZTUF9CVUZGRVJfS0lORDoKKwkJY2FzZSBGT1JNX1hGU1BfQ0hBTk5FTF9LSU5EOgorCQljYXNlIEZPUk1fWEZTUF9DT05ORUNUT1JfS0lORDoKKwkJY2FzZSBGT1JNX1hGU1BfTUFDSElORV9LSU5EOgorCQljYXNlIEZPUk1fWEZTUF9QT1JUX0tJTkQ6CisJCWNhc2UgRk9STV9YRlNQX1JPVVRJTkVfS0lORDoKKwkJY2FzZSBGT1JNX1hGU1BfU1lTVEVNX0tJTkQ6CisJCWNhc2UgRk9STV9YRlNQX1RSQU5TSVRJT05fS0lORDoKKwkJY2FzZSBGT1JNX1hGU1BfREFUQVRZUEVfS0lORDoKKwkJeworCQkJY29tcGlsZUFyZyA9IEFWTUNPREVfQ09NUElMRVIuY29tcGlsZUVsZW1lbnQoYUNUWCwgYXJnKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBGT1JNX1VGSV9LSU5EOgorCQl7CisJCQljb21waWxlQXJnID0gQVZNQ09ERV9DT01QSUxFUi5jb21waWxlVUZJKAorCQkJCQlhQ1RYLCBhcmcudG9fcmVmPCBVbmlGb3JtSWRlbnRpZmllcj4oKSk7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgRk9STV9BVk1DT0RFX0tJTkQ6CisJCXsKKwkJCWNvbXBpbGVBcmcgPSBBVk1DT0RFX0NPTVBJTEVSLmNvbXBpbGVFeHByZXNzaW9uKGFDVFgsIGFyZy5iZkNvZGUoKSk7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgRk9STV9JTlNUQU5DRV9EQVRBX0tJTkQ6CisJCXsKKwkJCWNvbXBpbGVBcmcgPSBhcmc7CisJCQlicmVhazsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCWNvbXBpbGVBcmcgPSBBVk1DT0RFX0NPTVBJTEVSLmRlY29kZV9jb21waWxlRXhwcmVzc2lvbihhQ1RYLCBhcmcpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKworCWlmKCBjb21waWxlQXJnLnZhbGlkKCkgKQorCXsKKwkJaWYoIGNvbXBpbGVBcmcuaXM8IEluc3RhbmNlT2ZEYXRhID4oKSApCisJCXsKKwkJCUluc3RhbmNlT2ZEYXRhICogaW9kQXJnID0gY29tcGlsZUFyZy50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKTsKKworCQkJaWYoIGlvZEFyZy0+Z2V0TW9kaWZpZXIoKS5oYXNGZWF0dXJlTXV0YWJsZSgpICkKKwkJCXsKKwkJCQlpZiggaW9kQXJnLT5pc0FsaWFzKCkgKQorCQkJCXsKKwkJCQkJaWYoIG5vdCBpb2RBcmctPmdldE1vZGlmaWVyKCkuCisJCQkJCQkJaXNWaXNpYmlsaXR5UHVibGljKCBhQ1RYLT5nZXRNb2RpZmllcigpICkgKQorCQkJCQl7CisJCQkJCQlnZXRDb21waWxlclRhYmxlKCkuaW5jckVycm9yQ291bnQoKTsKKwkJCQkJCWFDVFgtPmVycm9yQ29udGV4dCggQVZNX09TX1dBUk4gKQorCQkJCQkJCTw8ICJjb21waWxlQXJnTHZhbHVlOj4gY29tcGlsYXRpb24gZXJyb3IgOiAiCisJCQkJCQkJIklsbGVnYWwgYWNjZXNzIG9mIG5vbiBcInB1YmxpY1wiIExWQUxVRSA8PCAiCisJCQkJCQkJPDwgc3RyX2hlYWRlciggaW9kQXJnICkgPDwgIiA+PiBmb3IgPDwgIgorCQkJCQkJCTw8IGFyZy5zdHIoKSA8PCAiID4+IiA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCQkJCQl9CisJCQkJCWlmKCBub3QgaW9kQXJnLT5nZXRNb2RpZmllcigpLgorCQkJCQkJCWhhc0ZlYXR1cmVWb2xhdGlsZSggYUNUWC0+Z2V0TW9kaWZpZXIoKSApICkKKwkJCQkJeworCQkJCQkJaWYoIGlvZEFyZy0+Z2V0QXN0RWxlbWVudCgpLT5pc25vdDwgT2JqZWN0RWxlbWVudCA+KCkgKQorCQkJCQkJeworCQkJCQkJCWdldENvbXBpbGVyVGFibGUoKS5pbmNyRXJyb3JDb3VudCgpOworCQkJCQkJCWFDVFgtPmVycm9yQ29udGV4dCggQVZNX09TX1dBUk4gKQorCQkJCQkJCQk8PCAiY29tcGlsZUFyZ0x2YWx1ZTo+IGNvbXBpbGF0aW9uIGVycm9yIDogIgorCQkJCQkJCQkiSWxsZWdhbCBhY2Nlc3Mgb2Ygbm9uIFwidm9sYXRpbGVcIiBMVkFMVUUgPDwgIgorCQkJCQkJCQk8PCBzdHJfaGVhZGVyKCBpb2RBcmcgKSA8PCAiID4+IGZvciA8PCAiCisJCQkJCQkJCTw8IGFyZy5zdHIoKSA8PCAiID4+IiA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCXJldHVybiggY29tcGlsZUFyZyApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWdldENvbXBpbGVyVGFibGUoKS5pbmNyRXJyb3JDb3VudCgpOworCQkJCWFDVFgtPmVycm9yQ29udGV4dCggQVZNX09TX1dBUk4gKQorCQkJCQkJPDwgImNvbXBpbGVBcmdMdmFsdWU6PiBjb21waWxhdGlvbiBlcnJvciA6ICIKKwkJCQkJCSJJbGxlZ2FsIGFjY2VzcyBvZiBhIFwiY29uc3RcIiBMVkFMVUUgPDwgIgorCQkJCQkJPDwgc3RyX2hlYWRlciggaW9kQXJnICkgPDwgIiA+PiBmb3IgPDwgIgorCQkJCQkJPDwgYXJnLnN0cigpIDw8ICIgPj4iIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisKKwkJCQlyZXR1cm4oIGFyZyApOworCQkJfQorCQl9CisJCWVsc2UgaWYoIGNvbXBpbGVBcmcuaXM8IEF2bUNvZGUgPigpICkKKwkJeworCQkJcmV0dXJuKCBjb21waWxlQXJnICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlnZXRDb21waWxlclRhYmxlKCkuaW5jckVycm9yQ291bnQoKTsKKwkJCWFDVFgtPmVycm9yQ29udGV4dCggQVZNX09TX1dBUk4gKQorCQkJCQk8PCAiY29tcGlsZUFyZ0x2YWx1ZTo+IGNvbXBpbGF0aW9uIGVycm9yIDogIgorCQkJCQkiVW5leHBlY3RlZCA8PCAiIDw8IGNvbXBpbGVBcmcuc3RyKCkKKwkJCQkJPDwgIiA+PiBhcyBMVkFMVUUgZm9yIDw8ICIgPDwgYXJnLnN0cigpIDw8ICIgPj4iCisJCQkJCTw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisKKwkJCXJldHVybiggYXJnICk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JFcnJvckNvdW50KCk7CisJCWFDVFgtPmVycm9yQ29udGV4dCggQVZNX09TX1dBUk4gKQorCQkJCTw8ICJjb21waWxlQXJnTHZhbHVlOj4gY29tcGlsYXRpb24gZXJyb3IgPDwgIgorCQkJCTw8IGFyZy5zdHIoKSA8PCAiID4+IiA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCisJCXJldHVybiggYXJnICk7CisJfQorfQorCisKK0JGIEFic3RyYWN0QXZtY29kZUNvbXBpbGVyOjpjb21waWxlQXJnUnZhbHVlKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRiAmIGFyZywgYm9vbCBuZWVkVHlwZUNoZWNraW5nKQoreworCUJGIGNvbXBpbGVBcmcgPSBBVk1DT0RFX0NPTVBJTEVSLmRlY29kZV9jb21waWxlRXhwcmVzc2lvbihhQ1RYLCBhcmcpOworCisJaWYoIGNvbXBpbGVBcmcudmFsaWQoKSApCisJeworCQlpZiggY29tcGlsZUFyZy5pczwgSW5zdGFuY2VPZkRhdGEgPigpICkKKwkJeworCQkJSW5zdGFuY2VPZkRhdGEgKiBpb2RBcmcgPSBjb21waWxlQXJnLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpOworCisJCQlpZiggaW9kQXJnLT5nZXRNb2RpZmllcigpLmhhc0ZlYXR1cmVNdXRhYmxlKCkgKQorCQkJeworCQkJCWlmKCBpb2RBcmctPmlzQWxpYXMoKSApCisJCQkJeworCQkJCQlpZiggbm90IGlvZEFyZy0+Z2V0TW9kaWZpZXIoKS4KKwkJCQkJCQlpc1Zpc2liaWxpdHlQdWJsaWMoIGFDVFgtPmdldE1vZGlmaWVyKCkgKSApCisJCQkJCXsKKwkJCQkJCWdldENvbXBpbGVyVGFibGUoKS5pbmNyRXJyb3JDb3VudCgpOworCQkJCQkJYUNUWC0+ZXJyb3JDb250ZXh0KCBBVk1fT1NfV0FSTiApCisJCQkJCQkJCTw8ICJjb21waWxlQXJnTHZhbHVlOj4gY29tcGlsYXRpb24gZXJyb3IgOiAiCisJCQkJCQkJCSJJbGxlZ2FsIGFjY2VzcyBvZiBub24gXCJwdWJsaWNcIiBSVkFMVUUgPDwgIgorCQkJCQkJCQk8PCBzdHJfaGVhZGVyKCBpb2RBcmcgKSA8PCAiID4+IGZvciA8PCAiCisJCQkJCQkJCTw8IGFyZy5zdHIoKSA8PCAiID4+IiA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYoIGNvbXBpbGVBcmcudmFsaWQoKSApCisJeworCQlpZiggYUNUWC0+aXNOZWVkVHlwZUNoZWNraW5nKG5lZWRUeXBlQ2hlY2tpbmcpICkKKwkJeworCQkJY2hlY2tBcmdUeXBlKGFDVFgsIGFDVFgtPm1UeXBlLCBjb21waWxlQXJnKTsKKwkJfQorCisJCXJldHVybiggY29tcGlsZUFyZyApOworCX0KKwllbHNlCisJeworCQlnZXRDb21waWxlclRhYmxlKCkuaW5jckVycm9yQ291bnQoKTsKKwkJYUNUWC0+ZXJyb3JDb250ZXh0KCBBVk1fT1NfV0FSTiApCisJCQkJPDwgImNvbXBpbGVBcmdSdmFsdWU6PiBjb21waWxhdGlvbiBlcnJvciA8PCAiCisJCQkJPDwgYXJnLnN0cigpIDw8ICIgPj4iIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisKKwkJcmV0dXJuKCBhcmcgKTsKKwl9Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ09NUElMQVRJT04gT0YgRVhQUkVTU0lPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkZDb2RlIEFic3RyYWN0QXZtY29kZUNvbXBpbGVyOjpjb21waWxlRXhwcmVzc2lvbkNvZGUoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCU9wZXJhdG9yICogbWFpbk9wZXJhdG9yID0gYUNvZGUtPmdldE9wZXJhdG9yKCk7CisJQkZDb2RlIG5ld0NvZGUoIG1haW5PcGVyYXRvciApOworCisJQkYgYXJnOworCUF2bUNvZGUgKiBwQ29kZTsKKworCUF2bUNvZGU6Oml0ZXJhdG9yIGl0QXJnID0gYUNvZGUtPmJlZ2luKCk7CisJQXZtQ29kZTo6aXRlcmF0b3IgaXRFbmRBcmcgPSBhQ29kZS0+ZW5kKCk7CisKKwlmb3IoIDsgaXRBcmcgIT0gaXRFbmRBcmcgOyArK2l0QXJnICkKKwl7CisJCWFyZyA9IEFWTUNPREVfQ09NUElMRVIuZGVjb2RlX2NvbXBpbGVFeHByZXNzaW9uKGFDVFgsICppdEFyZyk7CisKKwkJaWYoIGFyZy5pbnZhbGlkKCkgKQorCQl7CisJCQlnZXRDb21waWxlclRhYmxlKCkuaW5jckVycm9yQ291bnQoKTsKKwkJCWFDVFgtPmVycm9yQ29udGV4dCggQVZNX09TX1dBUk4gKQorCQkJCQk8PCAiQXZtQ29kZTwgZXhwcmVzc2lvbiA+IGNvbXBpbGF0aW9uIGVycm9yIDw8ICIKKwkJCQkJPDwgKCppdEFyZykuc3RyKCkgPDwgIiA+PiIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKworCQkJbmV3Q29kZS0+YXBwZW5kKCBhcmcgKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYoIGFyZy5pczwgQXZtQ29kZSA+KCkgKQorCQl7CisJCQlwQ29kZSA9IGFyZy50b19wdHI8IEF2bUNvZGUgPigpOworCisJCQlpZiggcENvZGUtPmlzT3BlcmF0b3IoIG1haW5PcGVyYXRvciApCisJCQkJJiYgbWFpbk9wZXJhdG9yLT5pc0Fzc29jaWF0aXZlKCkgKQorCQkJeworCQkJCW5ld0NvZGUtPmFwcGVuZCggcENvZGUtPmdldEFyZ3MoKSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW5ld0NvZGUtPmFwcGVuZCggYXJnICk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQluZXdDb2RlLT5hcHBlbmQoIGFyZyApOworCQl9CisJfQorCisJcmV0dXJuKCBuZXdDb2RlICk7Cit9CisKKworQkZDb2RlIEFic3RyYWN0QXZtY29kZUNvbXBpbGVyOjpvcHRpbWl6ZUV4cHJlc3Npb25Db2RlKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSwKKwkJYXZtX2FyZ19vcGVyYW5kX3QgYW5PcGVyYW5kKQoreworCU9wZXJhdG9yICogbWFpbk9wZXJhdG9yID0gYUNvZGUtPmdldE9wZXJhdG9yKCk7CisJQkZDb2RlIG5ld0NvZGUoIG1haW5PcGVyYXRvciApOworCisJQkYgYXJnOworCUF2bUNvZGUgKiBwQ29kZTsKKworCUF2bUNvZGU6Oml0ZXJhdG9yIGl0QXJnID0gYUNvZGUtPmJlZ2luKCk7CisJQXZtQ29kZTo6aXRlcmF0b3IgaXRFbmRBcmcgPSBhQ29kZS0+ZW5kKCk7CisKKwlBdm1JbnN0cnVjdGlvbiAqIGFyZ3NJbnN0cnVjdGlvbiA9IG5ld0NvZGUtPm5ld0VtcHR5SW5zdHJ1Y3Rpb24oKTsKKworCVZlY3RvcjwgQXZtQnl0ZWNvZGUgPiB2ZWN0b3JPZkFyZ09wY29kZTsKKworCWZvciggOyBpdEFyZyAhPSBpdEVuZEFyZyA7ICsraXRBcmcgKQorCXsKKwkJYXJnID0gQVZNQ09ERV9DT01QSUxFUi5kZWNvZGVfb3B0aW1pemVFeHByZXNzaW9uKGFDVFgsICppdEFyZyk7CisKKwkJaWYoIGFyZy5pbnZhbGlkKCkgKQorCQl7CisJCQlnZXRDb21waWxlclRhYmxlKCkuaW5jckVycm9yQ291bnQoKTsKKwkJCWFDVFgtPmVycm9yQ29udGV4dCggQVZNX09TX1dBUk4gKQorCQkJCQk8PCAiQXZtQ29kZTwgZXhwcmVzc2lvbiA+IG9wdGltaXphdGlvbiBlcnJvciA8PCAiCisJCQkJCTw8ICgqaXRBcmcpLnN0cigpIDw8ICIgPj4iIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisKKwkJCW5ld0NvZGUtPmFwcGVuZCggYXJnICk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmKCBhcmcuaXM8IEF2bUNvZGUgPigpICkKKwkJeworCQkJcENvZGUgPSBhcmcudG9fcHRyPCBBdm1Db2RlID4oKTsKKworCQkJaWYoIHBDb2RlLT5pc09wZXJhdG9yKCBtYWluT3BlcmF0b3IgKQorCQkJCSYmIG1haW5PcGVyYXRvci0+aXNBc3NvY2lhdGl2ZSgpICkKKwkJCXsKKwkJCQluZXdDb2RlLT5hcHBlbmQoIHBDb2RlLT5nZXRBcmdzKCkgKTsKKworCQkJCXZlY3Rvck9mQXJnT3Bjb2RlLmFwcGVuZCgKKwkJCQkJCXBDb2RlLT5nZXRJbnN0cnVjdGlvbigpLT5nZXRCeXRlY29kZSgpLAorCQkJCQkJcENvZGUtPnNpemUoKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJbmV3Q29kZS0+YXBwZW5kKCBhcmcgKTsKKworCQkJCXZlY3Rvck9mQXJnT3Bjb2RlLmFwcGVuZCggYXJnY29kZU9mRXhwcmVzc2lvbihhQ1RYLCBwQ29kZSkgKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCW5ld0NvZGUtPmFwcGVuZCggYXJnICk7CisKKwkJCUF2bUJ5dGVjb2RlIGFyZ09wY29kZTsKKwkJCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJnT3Bjb2RlLCBhcmcsIGZhbHNlKTsKKwkJCXZlY3Rvck9mQXJnT3Bjb2RlLmFwcGVuZCggYXJnT3Bjb2RlICk7CisJCX0KKwl9CisKKwlhcmdzSW5zdHJ1Y3Rpb24tPnNldE1haW5CeXRlY29kZSgKKwkJCS8qb3BlcmF0aW9uKi8gQVZNX0FSR19TRVZBTF9SVkFMVUUsCisJCQkvKm9wZXJhbmQgICovIGFuT3BlcmFuZCApOworCisJYXJnc0luc3RydWN0aW9uLT5jb21wdXRlQnl0ZWNvZGUoIGZhbHNlICwgdmVjdG9yT2ZBcmdPcGNvZGUgKTsKKworCXJldHVybiggbmV3Q29kZSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDT01QSUxBVElPTiBPRiBTVEFURU1FTlQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0JGQ29kZSBBYnN0cmFjdEF2bWNvZGVDb21waWxlcjo6Y29tcGlsZVN0YXRlbWVudENvZGUoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCU9wZXJhdG9yICogbWFpbk9wZXJhdG9yID0gYUNvZGUtPmdldE9wZXJhdG9yKCk7CisJQkZDb2RlIG5ld0NvZGUoIG1haW5PcGVyYXRvciApOworCisJQkYgYXJnOworCisJQXZtQ29kZTo6aXRlcmF0b3IgaXRBcmcgPSBhQ29kZS0+YmVnaW4oKTsKKwlBdm1Db2RlOjppdGVyYXRvciBpdEVuZEFyZyA9IGFDb2RlLT5lbmQoKTsKKworCWZvciggOyBpdEFyZyAhPSBpdEVuZEFyZyA7ICsraXRBcmcgKQorCXsKKwkJYXJnID0gQVZNQ09ERV9DT01QSUxFUi5kZWNvZGVfY29tcGlsZVN0YXRlbWVudChhQ1RYLCAqaXRBcmcpOworCisJCWlmKCBhcmcuaW52YWxpZCgpICkKKwkJeworCQkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JFcnJvckNvdW50KCk7CisJCQlhQ1RYLT5lcnJvckNvbnRleHQoIEFWTV9PU19XQVJOICkKKwkJCQkJPDwgIkF2bUNvZGU8IHN0YXRlbWVudCA+IGNvbXBpbGF0aW9uIGVycm9yIDw8ICIKKwkJCQkJPDwgKCppdEFyZykuc3RyKCkgPDwgIiA+PiIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKworCQkJbmV3Q29kZS0+YXBwZW5kKCAqaXRBcmcgKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc3dpdGNoKCBhcmcuY2xhc3NLaW5kKCkgKQorCQl7CisJCQljYXNlIEZPUk1fQVZNQ09ERV9LSU5EOgorCQkJeworCQkJCWlmKCBhcmcudG9fcHRyPCBBdm1Db2RlID4oKS0+aXNPcENvZGUoIG1haW5PcGVyYXRvciApCisJCQkJCSYmIG1haW5PcGVyYXRvci0+aXNBc3NvY2lhdGl2ZSgpICkKKwkJCQl7CisJCQkJCW5ld0NvZGUtPmFwcGVuZCggYXJnLnRvX3B0cjwgQXZtQ29kZSA+KCktPmdldEFyZ3MoKSApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQluZXdDb2RlLT5hcHBlbmQoIGFyZyApOworCQkJCX0KKworCQkJCWJyZWFrOworCQkJfQorCisJCQlkZWZhdWx0OgorCQkJeworCQkJCW5ld0NvZGUtPmFwcGVuZCggYXJnICk7CisKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiggbmV3Q29kZSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIENPTVBJTEFUSU9OIFNURVAKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0JGQ29kZSBBYnN0cmFjdEF2bWNvZGVDb21waWxlcjo6Y29tcGlsZUF2bWNvZGUoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCU9wZXJhdG9yICogbWFpbk9wZXJhdG9yID0gYUNvZGUtPmdldE9wZXJhdG9yKCk7CisJQkZDb2RlIG5ld0NvZGUoIG1haW5PcGVyYXRvciApOworCisJQkYgYXJnOworCisJQXZtQ29kZTo6aXRlcmF0b3IgaXRBcmcgPSBhQ29kZS0+YmVnaW4oKTsKKwlBdm1Db2RlOjppdGVyYXRvciBpdEVuZEFyZyA9IGFDb2RlLT5lbmQoKTsKKworCWZvciggOyBpdEFyZyAhPSBpdEVuZEFyZyA7ICsraXRBcmcgKQorCXsKKwkJc3dpdGNoKCAoKml0QXJnKS5jbGFzc0tpbmQoKSApCisJCXsKKwkJCWNhc2UgRk9STV9BVk1DT0RFX0tJTkQ6CisJCQl7CisJCQkJYXJnID0gY29tcGlsZUF2bWNvZGUoYUNUWCwgKCppdEFyZykuYmZDb2RlKCkpOworCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJYXJnID0gQVZNQ09ERV9DT01QSUxFUi5kZWNvZGVfY29tcGlsZUV4cHJlc3Npb24oYUNUWCwgKml0QXJnKTsKKworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKworCisJCWlmKCBhcmcuaW52YWxpZCgpICkKKwkJeworCQkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JFcnJvckNvdW50KCk7CisJCQlhQ1RYLT5lcnJvckNvbnRleHQoIEFWTV9PU19XQVJOICkKKwkJCQkJPDwgIkF2bUNvZGU8IHN0YXRlbWVudCA+IGNvbXBpbGF0aW9uIGVycm9yIDw8ICIKKwkJCQkJPDwgKCppdEFyZykuc3RyKCkgPDwgIiA+PiIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKworCQkJbmV3Q29kZS0+YXBwZW5kKCAqaXRBcmcgKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc3dpdGNoKCBhcmcuY2xhc3NLaW5kKCkgKQorCQl7CisJCQljYXNlIEZPUk1fQVZNQ09ERV9LSU5EOgorCQkJeworCQkJCWlmKCBhcmcudG9fcHRyPCBBdm1Db2RlID4oKS0+aXNPcGVyYXRvciggbWFpbk9wZXJhdG9yICkKKwkJCQkJJiYgbWFpbk9wZXJhdG9yLT5pc0Fzc29jaWF0aXZlKCkgKQorCQkJCXsKKwkJCQkJbmV3Q29kZS0+YXBwZW5kKCBhcmcudG9fcHRyPCBBdm1Db2RlID4oKS0+Z2V0QXJncygpICk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCW5ld0NvZGUtPmFwcGVuZCggYXJnICk7CisJCQkJfQorCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJbmV3Q29kZS0+YXBwZW5kKCBhcmcgKTsKKworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuKCBuZXdDb2RlICk7Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQVZNIE9QQ09ERSBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCisgKiBvcGVyYW5kCisgKi8KKworYm9vbCBBYnN0cmFjdEF2bWNvZGVDb21waWxlcjo6bXVzdEJlRXZhbHVhdGVkQXJndW1lbnQoY29uc3QgQkYgJiBhcmcpCit7CisJc3dpdGNoKCBhcmcuY2xhc3NLaW5kKCkgKQorCXsKKwkJY2FzZSBGT1JNX0JVSUxUSU5fQk9PTEVBTl9LSU5EOgorCQljYXNlIEZPUk1fQlVJTFRJTl9JTlRFR0VSX0tJTkQ6CisJCWNhc2UgRk9STV9CVUlMVElOX1JBVElPTkFMX0tJTkQ6CisJCWNhc2UgRk9STV9CVUlMVElOX0ZMT0FUX0tJTkQ6CisKKwkJY2FzZSBGT1JNX0JVSUxUSU5fQ0hBUkFDVEVSX0tJTkQ6CisJCWNhc2UgRk9STV9CVUlMVElOX1NUUklOR19LSU5EOgorCQl7CisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKworCQljYXNlIEZPUk1fQlVJTFRJTl9JREVOVElGSUVSX0tJTkQ6CisJCWNhc2UgRk9STV9CVUlMVElOX1FVQUxJRklFRF9JREVOVElGSUVSX0tJTkQ6CisJCXsKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisKKwkJY2FzZSBGT1JNX0FWTUNPREVfS0lORDoKKwkJeworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQljYXNlIEZPUk1fQVJSQVlfQk9PTEVBTl9LSU5EOgorCQljYXNlIEZPUk1fQVJSQVlfQ0hBUkFDVEVSX0tJTkQ6CisJCWNhc2UgRk9STV9BUlJBWV9JTlRFR0VSX0tJTkQ6CisJCWNhc2UgRk9STV9BUlJBWV9SQVRJT05BTF9LSU5EOgorCQljYXNlIEZPUk1fQVJSQVlfRkxPQVRfS0lORDoKKwkJY2FzZSBGT1JNX0FSUkFZX1NUUklOR19LSU5EOgorCQljYXNlIEZPUk1fQVJSQVlfSURFTlRJRklFUl9LSU5EOgorCQljYXNlIEZPUk1fQVJSQVlfUVVBTElGSUVEX0lERU5USUZJRVJfS0lORDoKKwkJeworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisKKwkJY2FzZSBGT1JNX0FSUkFZX0JGX0tJTkQ6CisJCXsKKwkJCXJldHVybiggbXVzdEJlRXZhbHVhdGVkQXJndW1lbnRBcnJheSggYXJnLnRvX3B0cjwgQXJyYXlCRiA+KCkgKSApOworCQl9CisKKwkJY2FzZSBGT1JNX0lOU1RBTkNFX0RBVEFfS0lORDoKKwkJeworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQljYXNlIEZPUk1fUlVOVElNRV9JRF9LSU5EOgorCisJCWNhc2UgRk9STV9JTlNUQU5DRV9QT1JUX0tJTkQ6CisJCWNhc2UgRk9STV9JTlNUQU5DRV9CVUZGRVJfS0lORDoKKwkJY2FzZSBGT1JNX0lOU1RBTkNFX0NPTk5FQ1RPUl9LSU5EOgorCQl7CisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKworCQljYXNlIEZPUk1fT1BFUkFUT1JfS0lORDoKKwkJY2FzZSBGT1JNX0FWTUxBTUJEQV9LSU5EOgorCQljYXNlIEZPUk1fQVZNUFJPR1JBTV9LSU5EOgorCQljYXNlIEZPUk1fQVZNVFJBTlNJVElPTl9LSU5EOgorCQljYXNlIEZPUk1fRVhFQ1VUQUJMRV9NQUNISU5FX0tJTkQ6CisJCWNhc2UgRk9STV9FWEVDVVRBQkxFX1NZU1RFTV9LSU5EOgorCQl7CisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCX0KK30KKworCitib29sIEFic3RyYWN0QXZtY29kZUNvbXBpbGVyOjptdXN0QmVFdmFsdWF0ZWRBcmd1bWVudEFycmF5KEFycmF5QkYgKiBhcnJheUFyZykKK3sKKwlmb3IoIGF2bV9zaXplX3QgaWR4ID0gMCA7IGlkeCA8IGFycmF5QXJnLT5zaXplKCkgOyArK2lkeCApCisJeworCQlpZiggbXVzdEJlRXZhbHVhdGVkQXJndW1lbnQoYXJyYXlBcmctPmF0KGlkeCkpICkKKwkJeworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwl9CisJcmV0dXJuKCBmYWxzZSApOworfQorCithdm1fYXJnX29wZXJhbmRfdCBBYnN0cmFjdEF2bWNvZGVDb21waWxlcjo6b3BlcmFuZE9mKGNvbnN0IEJGICYgYXJnKQoreworCXN3aXRjaCggYXJnLmNsYXNzS2luZCgpICkKKwl7CisJCWNhc2UgRk9STV9CVUlMVElOX0JPT0xFQU5fS0lORDoKKwkJeworCQkJcmV0dXJuKCBBVk1fQVJHX0JPT0xFQU5fS0lORCApOworCQl9CisJCWNhc2UgRk9STV9CVUlMVElOX0lOVEVHRVJfS0lORDoKKwkJeworCQkJcmV0dXJuKCBBVk1fQVJHX0lOVEVHRVJfS0lORCApOworCQl9CisJCWNhc2UgRk9STV9CVUlMVElOX1JBVElPTkFMX0tJTkQ6CisJCXsKKwkJCXJldHVybiggQVZNX0FSR19SQVRJT05BTF9LSU5EICk7CisJCX0KKwkJY2FzZSBGT1JNX0JVSUxUSU5fRkxPQVRfS0lORDoKKwkJeworCQkJcmV0dXJuKCBBVk1fQVJHX0ZMT0FUX0tJTkQgKTsKKwkJfQorCisJCWNhc2UgRk9STV9CVUlMVElOX0NIQVJBQ1RFUl9LSU5EOgorCQl7CisJCQlyZXR1cm4oIEFWTV9BUkdfQ0hBUkFDVEVSX0tJTkQgKTsKKwkJfQorCQljYXNlIEZPUk1fQlVJTFRJTl9TVFJJTkdfS0lORDoKKwkJeworCQkJcmV0dXJuKCBBVk1fQVJHX1NUUklOR19LSU5EICk7CisJCX0KKworCQljYXNlIEZPUk1fQlVJTFRJTl9JREVOVElGSUVSX0tJTkQ6CisJCWNhc2UgRk9STV9CVUlMVElOX1FVQUxJRklFRF9JREVOVElGSUVSX0tJTkQ6CisJCXsKKwkJCXJldHVybiggQVZNX0FSR19CVUlMVElOX0tJTkQgKTsKKwkJfQorCisJCWNhc2UgRk9STV9PUEVSQVRPUl9LSU5EOgorCQl7CisJCQlyZXR1cm4oIEFWTV9BUkdfT1BFUkFUT1JfS0lORCApOworCQl9CisKKwkJY2FzZSBGT1JNX0FWTUNPREVfS0lORDoKKwkJeworCQkJcmV0dXJuKCBBVk1fQVJHX0VYUFJFU1NJT05fS0lORCApOworCQl9CisKKwkJY2FzZSBGT1JNX0FSUkFZX0JPT0xFQU5fS0lORDoKKwkJY2FzZSBGT1JNX0FSUkFZX0NIQVJBQ1RFUl9LSU5EOgorCQljYXNlIEZPUk1fQVJSQVlfSU5URUdFUl9LSU5EOgorCQljYXNlIEZPUk1fQVJSQVlfUkFUSU9OQUxfS0lORDoKKwkJY2FzZSBGT1JNX0FSUkFZX0ZMT0FUX0tJTkQ6CisJCWNhc2UgRk9STV9BUlJBWV9TVFJJTkdfS0lORDoKKwkJY2FzZSBGT1JNX0FSUkFZX0lERU5USUZJRVJfS0lORDoKKwkJY2FzZSBGT1JNX0FSUkFZX1FVQUxJRklFRF9JREVOVElGSUVSX0tJTkQ6CisJCXsKKwkJCXJldHVybiggQVZNX0FSR19CVUlMVElOX0FSUkFZX0tJTkQgKTsKKwkJfQorCisJCWNhc2UgRk9STV9BUlJBWV9CRl9LSU5EOgorCQl7CisJCQlBcnJheUJGICogYXJyYXlBcmcgPSBhcmcudG9fcHRyPCBBcnJheUJGID4oKTsKKwkJCWZvciggYXZtX3NpemVfdCBpZHggPSAwIDsgaWR4IDwgYXJyYXlBcmctPnNpemUoKSA7ICsraWR4ICkKKwkJCXsKKwkJCQlpZiggbXVzdEJlRXZhbHVhdGVkQXJndW1lbnQoYXJyYXlBcmctPmF0KGlkeCkpICkKKwkJCQl7CisJCQkJCXJldHVybiggQVZNX0FSR19FWFBSRVNTSU9OX0tJTkQgKTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4oIEFWTV9BUkdfQlVJTFRJTl9BUlJBWV9LSU5EICk7CisJCX0KKworCQljYXNlIEZPUk1fSU5TVEFOQ0VfREFUQV9LSU5EOgorCQl7CisJCQlJbnN0YW5jZU9mRGF0YSAqIGFuSW5zdGFuY2UgPSBhcmcudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCk7CisKKwkJCWlmKCBhbkluc3RhbmNlLT5pc1VmaU1peGVkUG9pbnRlcigpICkKKwkJCXsKKwkJCQlyZXR1cm4oIEFWTV9BUkdfREFUQV9VRklfS0lORCApOworCQkJfQorCQkJZWxzZSBpZiggYW5JbnN0YW5jZS0+Z2V0TW9kaWZpZXIoKS5oYXNOYXR1cmVSZWZlcmVuY2UoKSApCisJCQl7CisJCQkJcmV0dXJuKCBhbkluc3RhbmNlLT5pc1VmaU9mZnNldFBvaW50ZXIoKSA/CisJCQkJCQlBVk1fQVJHX0RBVEFfVUZJX0tJTkQgOiBBVk1fQVJHX0RBVEFfUkVGX0tJTkQgKTsKKwkJCX0KKwkJCWVsc2UgaWYoIGFuSW5zdGFuY2UtPmdldE1vZGlmaWVyKCkuaGFzTmF0dXJlTWFjcm8oKSApCisJCQl7CisJCQkJcmV0dXJuKCBBVk1fQVJHX0RBVEFfTUFDUk9fS0lORCApOworCQkJfQorCQkJZWxzZSBpZiggYW5JbnN0YW5jZS0+Z2V0TW9kaWZpZXIoKS5oYXNGZWF0dXJlTXV0YWJsZSgpICkKKwkJCXsKKwkJCQlyZXR1cm4oIEFWTV9BUkdfREFUQV9LSU5EICk7CisJCQl9CisJCQllbHNlIGlmKCBhbkluc3RhbmNlLT5nZXRNb2RpZmllcigpLmhhc01vZGlmaWVyUHVibGljRmluYWxTdGF0aWMoKSApCisJCQl7CisJCQkJaWYoIEV4ZWN1dGFibGVMaWI6Ok1BQ0hJTkVfQ09NUE9ORU5UX1NFTEYgPT0gYW5JbnN0YW5jZSApCisJCQkJeworCQkJCQlyZXR1cm4oIEFWTV9BUkdfQ09NUE9ORU5UX1NFTEZfUklEICk7CisJCQkJfQorCQkJCWVsc2UgaWYoIEV4ZWN1dGFibGVMaWI6Ok1BQ0hJTkVfQ09NUE9ORU5UX1BBUkVOVCA9PSBhbkluc3RhbmNlICkKKwkJCQl7CisJCQkJCXJldHVybiggQVZNX0FSR19DT01QT05FTlRfUEFSRU5UX1JJRCApOworCQkJCX0KKwkJCQllbHNlIGlmKCBFeGVjdXRhYmxlTGliOjpNQUNISU5FX0NPTVBPTkVOVF9DT01NVU5JQ0FUT1IKKwkJCQkJCT09IGFuSW5zdGFuY2UgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCBBVk1fQVJHX0NPTVBPTkVOVF9DT01NVU5JQ0FUT1JfUklEICk7CisJCQkJfQorCisJCQkJZWxzZSBpZiggRXhlY3V0YWJsZUxpYjo6TUFDSElORV9FTlZJUk9OTUVOVCA9PSBhbkluc3RhbmNlICkKKwkJCQl7CisJCQkJCXJldHVybiggQVZNX0FSR19FTlZJUk9OTUVOVF9SSUQgKTsKKwkJCQl9CisKKwkJCQllbHNlIGlmKCBFeGVjdXRhYmxlTGliOjpNQUNISU5FX1NZU1RFTSA9PSBhbkluc3RhbmNlICkKKwkJCQl7CisJCQkJCXJldHVybiggQVZNX0FSR19TWVNURU1fUklEICk7CisJCQkJfQorCisJCQkJZWxzZSBpZiggRXhlY3V0YWJsZUxpYjo6TUFDSElORV9TRUxGID09IGFuSW5zdGFuY2UgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCBBVk1fQVJHX1NFTEZfUklEICk7CisJCQkJfQorCQkJCWVsc2UgaWYoIEV4ZWN1dGFibGVMaWI6Ok1BQ0hJTkVfUEFSRU5UID09IGFuSW5zdGFuY2UgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCBBVk1fQVJHX1BBUkVOVF9SSUQgKTsKKwkJCQl9CisJCQkJZWxzZSBpZiggRXhlY3V0YWJsZUxpYjo6TUFDSElORV9DT01NVU5JQ0FUT1IgPT0gYW5JbnN0YW5jZSApCisJCQkJeworCQkJCQlyZXR1cm4oIEFWTV9BUkdfQ09NTVVOSUNBVE9SX1JJRCApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlyZXR1cm4oIEFWTV9BUkdfREFUQV9DU1RfS0lORCApOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYoIGFuSW5zdGFuY2UtPmdldE1vZGlmaWVyKCkuaGFzRmVhdHVyZUZpbmFsKCkgKQorCQkJeworCQkJCXJldHVybiggQVZNX0FSR19EQVRBX0NTVF9LSU5EICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuKCBBVk1fQVJHX0RBVEFfS0lORCApOworCQkJfQorCQl9CisKKwkJY2FzZSBGT1JNX1JVTlRJTUVfSURfS0lORDoKKwkJeworCQkJcmV0dXJuKCBBVk1fQVJHX01BQ0hJTkVfUklEICk7CisJCX0KKworCQljYXNlIEZPUk1fSU5TVEFOQ0VfUE9SVF9LSU5EOgorCQl7CisJCQlyZXR1cm4oIEFWTV9BUkdfUE9SVF9LSU5EICk7CisJCX0KKwkJY2FzZSBGT1JNX0lOU1RBTkNFX0JVRkZFUl9LSU5EOgorCQl7CisJCQlyZXR1cm4oIEFWTV9BUkdfQlVGRkVSX0tJTkQgKTsKKwkJfQorCQljYXNlIEZPUk1fSU5TVEFOQ0VfQ09OTkVDVE9SX0tJTkQ6CisJCXsKKwkJCXJldHVybiggQVZNX0FSR19DT05ORUNUT1JfS0lORCApOworCQl9CisKKwkJY2FzZSBGT1JNX0FWTUxBTUJEQV9LSU5EOgorCQljYXNlIEZPUk1fQVZNUFJPR1JBTV9LSU5EOgorCQljYXNlIEZPUk1fQVZNVFJBTlNJVElPTl9LSU5EOgorCQljYXNlIEZPUk1fRVhFQ1VUQUJMRV9NQUNISU5FX0tJTkQ6CisJCWNhc2UgRk9STV9FWEVDVVRBQkxFX1NZU1RFTV9LSU5EOgorCQl7CisJCQlyZXR1cm4oIEFWTV9BUkdfU1RBVEVNRU5UX0tJTkQgKTsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCXJldHVybiggQVZNX0FSR19VTkRFRklORURfT1BFUkFORCApOworCQl9CisJfQorfQorCisKK2F2bV9hcmdfcHJvY2Vzc29yX3QgQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXI6OnByb2Nlc3Nvck9mKAorCQlCYXNlVHlwZVNwZWNpZmllciAqIGFUeXBlKQoreworCXN3aXRjaCggYVR5cGUtPmdldFR5cGVTcGVjaWZpZXJLaW5kKCkgKQorCXsKKwkJY2FzZSBUWVBFX0JPT0xFQU5fU1BFQ0lGSUVSOgorCQljYXNlIFRZUEVfSU5URUdFUl9TUEVDSUZJRVI6CisJCWNhc2UgVFlQRV9SQVRJT05BTF9TUEVDSUZJRVI6CisJCWNhc2UgVFlQRV9GTE9BVF9TUEVDSUZJRVI6CisJCXsKKwkJCXJldHVybiggQVZNX0FSR19BUklUSE1FVElDX0xPR0lDX0NQVSApOworCQl9CisKKwkJY2FzZSBUWVBFX0NIQVJBQ1RFUl9TUEVDSUZJRVI6CisJCXsKKwkJCXJldHVybiggQVZNX0FSR19DSEFSQUNURVJfQ1BVICk7CisJCX0KKworCQljYXNlIFRZUEVfU1RSSU5HX1NQRUNJRklFUjoKKwkJeworCQkJcmV0dXJuKCBBVk1fQVJHX1NUUklOR19DUFUgKTsKKwkJfQorCisJCWNhc2UgVFlQRV9BUlJBWV9TUEVDSUZJRVI6CisJCXsKKwkJCXJldHVybiggQVZNX0FSR19BUlJBWV9SVkFMVUVfQ1BVICk7CisvLwkJCXJldHVybiggQVZNX0FSR19BUlJBWV9MVkFMVUVfQ1BVICk7CisJCX0KKworCQljYXNlIFRZUEVfVkVDVE9SX1NQRUNJRklFUjoKKwkJY2FzZSBUWVBFX1JFVkVSU0VfVkVDVE9SX1NQRUNJRklFUjoKKwkJeworCQkJcmV0dXJuKCBBVk1fQVJHX1ZFQ1RPUl9DUFUgKTsKKwkJfQorCisJCWNhc2UgVFlQRV9MSVNUX1NQRUNJRklFUjoKKwkJeworCQkJcmV0dXJuKCBBVk1fQVJHX0xJU1RfQ1BVICk7CisJCX0KKworCQljYXNlIFRZUEVfRklGT19TUEVDSUZJRVI6CisJCWNhc2UgVFlQRV9MSUZPX1NQRUNJRklFUjoKKwkJY2FzZSBUWVBFX01VTFRJX0ZJRk9fU1BFQ0lGSUVSOgorCQljYXNlIFRZUEVfTVVMVElfTElGT19TUEVDSUZJRVI6CisJCWNhc2UgVFlQRV9SQU1fU1BFQ0lGSUVSOgorCQl7CisJCQlyZXR1cm4oIEFWTV9BUkdfUVVFVUVfQ1BVICk7CisJCX0KKworCQljYXNlIFRZUEVfU0VUX1NQRUNJRklFUjoKKwkJY2FzZSBUWVBFX01VTFRJU0VUX1NQRUNJRklFUjoKKwkJeworCQkJcmV0dXJuKCBBVk1fQVJHX0NPTExFQ1RJT05fQ1BVICk7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlyZXR1cm4oIEFWTV9BUkdfVU5ERUZJTkVEX1BST0NFU1NPUiApOworCQl9CisJfQorfQorCisKK2F2bV9hcmdfb3BlcmFuZF90IEFic3RyYWN0QXZtY29kZUNvbXBpbGVyOjpvcGVyYW5kT2YoQmFzZVR5cGVTcGVjaWZpZXIgKiBhVHlwZSkKK3sKKwlzd2l0Y2goIGFUeXBlLT5nZXRUeXBlU3BlY2lmaWVyS2luZCgpICkKKwl7CisJCWNhc2UgVFlQRV9CT09MRUFOX1NQRUNJRklFUjoKKwkJeworCQkJcmV0dXJuKCBBVk1fQVJHX0JPT0xFQU5fS0lORCApOworCQl9CisJCWNhc2UgVFlQRV9JTlRFR0VSX1NQRUNJRklFUjoKKwkJeworCQkJcmV0dXJuKCBBVk1fQVJHX0lOVEVHRVJfS0lORCApOworCQl9CisJCWNhc2UgVFlQRV9SQVRJT05BTF9TUEVDSUZJRVI6CisJCXsKKwkJCXJldHVybiggQVZNX0FSR19SQVRJT05BTF9LSU5EICk7CisJCX0KKwkJY2FzZSBUWVBFX0ZMT0FUX1NQRUNJRklFUjoKKwkJeworCQkJcmV0dXJuKCBBVk1fQVJHX0ZMT0FUX0tJTkQgKTsKKwkJfQorCisJCWNhc2UgVFlQRV9DSEFSQUNURVJfU1BFQ0lGSUVSOgorCQl7CisJCQlyZXR1cm4oIEFWTV9BUkdfQ0hBUkFDVEVSX0tJTkQgKTsKKwkJfQorCQljYXNlIFRZUEVfU1RSSU5HX1NQRUNJRklFUjoKKwkJeworCQkJcmV0dXJuKCBBVk1fQVJHX1NUUklOR19LSU5EICk7CisJCX0KKworCQljYXNlIFRZUEVfT1BFUkFUT1JfU1BFQ0lGSUVSOgorCQl7CisJCQlyZXR1cm4oIEFWTV9BUkdfT1BFUkFUT1JfS0lORCApOworCQl9CisKKwkJY2FzZSBUWVBFX0FWTUNPREVfU1BFQ0lGSUVSOgorCQl7CisJCQlyZXR1cm4oIEFWTV9BUkdfRVhQUkVTU0lPTl9LSU5EICk7CisJCX0KKworCQljYXNlIFRZUEVfQVJSQVlfU1BFQ0lGSUVSOgorCQl7CisJCQlyZXR1cm4oIEFWTV9BUkdfQVJSQVlfS0lORCApOworCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJaWYoIGFUeXBlLT5oYXNUeXBlQ29sbGVjdGlvbigpICkKKwkJCXsKKwkJCQlyZXR1cm4oIEFWTV9BUkdfQ09MTEVDVElPTl9LSU5EICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuKCBBVk1fQVJHX1VOREVGSU5FRF9PUEVSQU5EICk7CisJCQl9CisJCX0KKwl9Cit9CisKKworCit2b2lkIEFic3RyYWN0QXZtY29kZUNvbXBpbGVyOjpzZXRBcmdjb2RlTFZhbHVlKENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsCisJCUF2bUJ5dGVjb2RlICYgYXJnQ29kZSwgY29uc3QgQkYgJiBhcmcsIGJvb2wgbmVlZFR5cGVDaGVja2luZykKK3sKKwlhcmdDb2RlLnByb2Nlc3NvciA9IEFWTV9BUkdfTUVNT1JZX0xWQUxVRV9DUFU7CisJYXJnQ29kZS5vcGVyYXRpb24gPSBBVk1fQVJHX1NFVkFMX0xWQUxVRTsKKworCWlmKCBhcmcuaXM8IEluc3RhbmNlT2ZEYXRhID4oKSApCisJeworCQlJbnN0YW5jZU9mRGF0YSAqIGFuSW5zdGFuY2UgPSBhcmcudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCk7CisKKwkJaWYoIGFDVFgtPmlzTmVlZFR5cGVDaGVja2luZyhuZWVkVHlwZUNoZWNraW5nKSApCisJCXsKKwkJCWlmKCBhcmdDb2RlLmhhc1R5cGUoKSApCisJCQl7CisJCQkJY2hlY2tBcmdUeXBlKGFDVFgsIGFyZ0NvZGUuZHR5cGUsIGFyZyk7CisJCQl9CisJCQllbHNlIGlmKCBhQ1RYLT5oYXNUeXBlKCkgKQorCQkJeworCQkJCWFyZ0NvZGUuZHR5cGUgPSBhQ1RYLT5tVHlwZTsKKwkJCQljaGVja0FyZ1R5cGUoYUNUWCwgYXJnQ29kZS5kdHlwZSwgYXJnKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlhcmdDb2RlLmR0eXBlID0gYW5JbnN0YW5jZS0+Z2V0VHlwZVNwZWNpZmllcigpOworCQkJfQorCQl9CisJCWVsc2UgaWYoIG5vdCBhcmdDb2RlLmhhc1R5cGUoKSApCisJCXsKKwkJCWFyZ0NvZGUuZHR5cGUgPSBhbkluc3RhbmNlLT5nZXRUeXBlU3BlY2lmaWVyKCk7CisJCX0KKworCQlpZiggYW5JbnN0YW5jZS0+aXNVZmlNaXhlZFBvaW50ZXIoKSApCisJCXsKKwkJCWFyZ0NvZGUub3BlcmFuZCAgID0gQVZNX0FSR19EQVRBX1VGSV9LSU5EOworCQl9CisJCWVsc2UgaWYoIGFuSW5zdGFuY2UtPmdldE1vZGlmaWVyKCkuaGFzTmF0dXJlUmVmZXJlbmNlKCkgKQorCQl7CisJCQlhcmdDb2RlLm9wZXJhbmQgICA9IChhbkluc3RhbmNlLT5pc1VmaU9mZnNldFBvaW50ZXIoKSA/CisJCQkJCUFWTV9BUkdfREFUQV9VRklfS0lORCA6IEFWTV9BUkdfREFUQV9SRUZfS0lORCk7CisJCX0KKwkJZWxzZSBpZiggYW5JbnN0YW5jZS0+Z2V0TW9kaWZpZXIoKS5oYXNOYXR1cmVNYWNybygpICkKKwkJeworCQkJYXJnQ29kZS5vcGVyYW5kICAgPSBBVk1fQVJHX0RBVEFfTUFDUk9fS0lORDsKKwkJfQorCisJCWVsc2UgaWYoIGFuSW5zdGFuY2UtPmdldE1vZGlmaWVyKCkuaGFzRmVhdHVyZU11dGFibGUoKSApCisJCXsKKwkJCWFyZ0NvZGUucHJvY2Vzc29yID0gQVZNX0FSR19OT1BfQ1BVOworCQkJYXJnQ29kZS5vcGVyYXRpb24gPSBBVk1fQVJHX05PUF9MVkFMVUU7CisJCQlhcmdDb2RlLm9wZXJhbmQgICA9IEFWTV9BUkdfREFUQV9LSU5EOworCQl9CisJCWVsc2UKKwkJeworCQkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JXYXJuaW5nQ291bnQoKTsKKwkJCWFDVFgtPmVycm9yQ29udGV4dCggQVZNX09TX1dBUk4gKQorCQkJCQk8PCAic2V0QXJnY29kZUx2YWx1ZSA6PiBVbmV4cGVjdGVkIHRoZSBJbnN0YW5jZU9mRGF0YSA8PCAiCisJCQkJCTw8IHN0cl9oZWFkZXIoIGFyZyApIDw8ICIgPj4gYXMgPDwgIiA8PCBhcmdDb2RlLnN0clR5cGUoKQorCQkJCQk8PCAiID4+IGFyZ3VtZW50ICEhISIgPDwgc3RkOjplbmRsOworCisJCQlhcmdDb2RlLnByb2Nlc3NvciA9IEFWTV9BUkdfTk9QX0NQVTsKKwkJCWFyZ0NvZGUub3BlcmF0aW9uID0gQVZNX0FSR19OT1BfTFZBTFVFOworCQkJYXJnQ29kZS5vcGVyYW5kICAgPSBBVk1fQVJHX0RBVEFfS0lORDsKKwkJfQorCX0KKworCWVsc2UgaWYoIGFyZy5pczwgQXZtQ29kZSA+KCkgKQorCXsKKwkJYXJnQ29kZS5vcGVyYW5kICAgPSBBVk1fQVJHX0VYUFJFU1NJT05fS0lORDsKKwl9CisKKwllbHNlCisJeworCQlnZXRDb21waWxlclRhYmxlKCkuaW5jckVycm9yQ291bnQoKTsKKwkJYUNUWC0+ZXJyb3JDb250ZXh0KCBBVk1fT1NfV0FSTiApCisJCQkJPDwgInNldEFyZ2NvZGVMdmFsdWUgOj4gVW5leHBlY3RlZCA8PCAiCisJCQkJPDwgc3RyX2hlYWRlciggYXJnICkgPDwgIiA+PiBhcyBsdmFsdWUgYXJndW1lbnQgdHlwZWQgYnkgIgorCQkJCTw8IGFyZ0NvZGUuc3RyVHlwZSgpIDw8ICIgPj4gISEhIiA8PCBzdGQ6OmVuZGw7CisKKwkJYXJnQ29kZS5vcGVyYW5kICAgPSBBVk1fQVJHX0VYUFJFU1NJT05fS0lORDsKKwl9Cit9CisKKwordm9pZCBBYnN0cmFjdEF2bWNvZGVDb21waWxlcjo6c2V0QXJnY29kZUxWYWx1ZVJlZihDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLAorCQlBdm1CeXRlY29kZSAmIGFyZ0NvZGUsIGNvbnN0IEJGICYgYXJnLCBib29sIG5lZWRUeXBlQ2hlY2tpbmcpCit7CisJaWYoIGFyZy5pczwgSW5zdGFuY2VPZkRhdGEgPigpCisJCSYmIGFyZy50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKS0+Z2V0TW9kaWZpZXIoKS5oYXNOYXR1cmVSZWZlcmVuY2UoKSApCisJeworCQlpZiggYUNUWC0+aXNOZWVkVHlwZUNoZWNraW5nKG5lZWRUeXBlQ2hlY2tpbmcpICkKKwkJeworCQkJaWYoIGFyZ0NvZGUuaGFzVHlwZSgpICkKKwkJCXsKKwkJCQljaGVja0FyZ1R5cGUoYUNUWCwgYXJnQ29kZS5kdHlwZSwgYXJnKTsKKwkJCX0KKwkJCWVsc2UgaWYoIGFDVFgtPmhhc1R5cGUoKSApCisJCQl7CisJCQkJYXJnQ29kZS5kdHlwZSA9IGFDVFgtPm1UeXBlOworCQkJCWNoZWNrQXJnVHlwZShhQ1RYLCBhcmdDb2RlLmR0eXBlLCBhcmcpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWFyZ0NvZGUuZHR5cGUgPSBhcmcudG9fcHRyPAorCQkJCQkJSW5zdGFuY2VPZkRhdGEgPigpLT5nZXRUeXBlU3BlY2lmaWVyKCk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiggbm90IGFyZ0NvZGUuaGFzVHlwZSgpICkKKwkJeworCQkJYXJnQ29kZS5kdHlwZSA9IGFyZy50b19wdHI8CisJCQkJCUluc3RhbmNlT2ZEYXRhID4oKS0+Z2V0VHlwZVNwZWNpZmllcigpOworCQl9CisKKwkJYXJnQ29kZS5wcm9jZXNzb3IgPSBBVk1fQVJHX05PUF9DUFU7CisJCWFyZ0NvZGUub3BlcmF0aW9uID0gQVZNX0FSR19OT1BfTFZBTFVFOworCQlhcmdDb2RlLm9wZXJhbmQgICA9IEFWTV9BUkdfREFUQV9SRUZfS0lORDsKKwl9CisJZWxzZQorCXsKKwkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JFcnJvckNvdW50KCk7CisJCWFDVFgtPmVycm9yQ29udGV4dCggQVZNX09TX1dBUk4gKQorCQkJCTw8ICJzZXRBcmdjb2RlTHZhbHVlIDo+IFVuZXhwZWN0ZWQgPDwgIgorCQkJCTw8IHN0cl9oZWFkZXIoIGFyZyApIDw8ICIgPj4gYXMgPDwgIiA8PCBhcmdDb2RlLnN0clR5cGUoKQorCQkJCTw8ICIgPj4gcmVmZXJlbmNlIEluc3RhbmNlT2ZEYXRhIGFyZ3VtZW50ICEhISIgPDwgc3RkOjplbmRsOworCisJCWFyZ0NvZGUucHJvY2Vzc29yID0gQVZNX0FSR19OT1BfQ1BVOworCQlhcmdDb2RlLm9wZXJhdGlvbiA9IEFWTV9BUkdfTk9QX0xWQUxVRTsKKwkJYXJnQ29kZS5vcGVyYW5kICAgPSBBVk1fQVJHX0VYUFJFU1NJT05fS0lORDsKKwl9Cit9CisKKwordm9pZCBBYnN0cmFjdEF2bWNvZGVDb21waWxlcjo6c2V0QXJnY29kZUxWYWx1ZU1hY3JvKENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsCisJCUF2bUJ5dGVjb2RlICYgYXJnQ29kZSwgY29uc3QgQkYgJiBhcmcsIGJvb2wgbmVlZFR5cGVDaGVja2luZykKK3sKKwlpZiggYXJnLmlzPCBJbnN0YW5jZU9mRGF0YSA+KCkKKwkJJiYgYXJnLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpLT5nZXRNb2RpZmllcigpLmhhc05hdHVyZU1hY3JvKCkgKQorCXsKKwkJaWYoIGFDVFgtPmlzTmVlZFR5cGVDaGVja2luZyhuZWVkVHlwZUNoZWNraW5nKSApCisJCXsKKwkJCWlmKCBhcmdDb2RlLmhhc1R5cGUoKSApCisJCQl7CisJCQkJY2hlY2tBcmdUeXBlKGFDVFgsIGFyZ0NvZGUuZHR5cGUsIGFyZyk7CisJCQl9CisJCQllbHNlIGlmKCBhQ1RYLT5oYXNUeXBlKCkgKQorCQkJeworCQkJCWFyZ0NvZGUuZHR5cGUgPSBhQ1RYLT5tVHlwZTsKKwkJCQljaGVja0FyZ1R5cGUoYUNUWCwgYXJnQ29kZS5kdHlwZSwgYXJnKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlhcmdDb2RlLmR0eXBlID0gYXJnLnRvX3B0cjwKKwkJCQkJCUluc3RhbmNlT2ZEYXRhID4oKS0+Z2V0VHlwZVNwZWNpZmllcigpOworCQkJfQorCQl9CisJCWVsc2UgaWYoIG5vdCBhcmdDb2RlLmhhc1R5cGUoKSApCisJCXsKKwkJCWFyZ0NvZGUuZHR5cGUgPSBhcmcudG9fcHRyPAorCQkJCQlJbnN0YW5jZU9mRGF0YSA+KCktPmdldFR5cGVTcGVjaWZpZXIoKTsKKwkJfQorCisJCWFyZ0NvZGUucHJvY2Vzc29yID0gQVZNX0FSR19OT1BfQ1BVOworCQlhcmdDb2RlLm9wZXJhdGlvbiA9IEFWTV9BUkdfTk9QX0xWQUxVRTsKKwkJYXJnQ29kZS5vcGVyYW5kICAgPSBBVk1fQVJHX0RBVEFfTUFDUk9fS0lORDsKKwl9CisJZWxzZQorCXsKKwkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JFcnJvckNvdW50KCk7CisJCWFDVFgtPmVycm9yQ29udGV4dCggQVZNX09TX1dBUk4gKQorCQkJCTw8ICJzZXRBcmdjb2RlTHZhbHVlIDo+IFVuZXhwZWN0ZWQgPDwgIgorCQkJCTw8IHN0cl9oZWFkZXIoIGFyZyApIDw8ICIgPj4gYXMgPDwgIiA8PCBhcmdDb2RlLnN0clR5cGUoKQorCQkJCTw8ICIgPj4gbWFjcm8gSW5zdGFuY2VPZkRhdGEgYXJndW1lbnQgISEhIiA8PCBzdGQ6OmVuZGw7CisKKwkJYXJnQ29kZS5wcm9jZXNzb3IgPSBBVk1fQVJHX05PUF9DUFU7CisJCWFyZ0NvZGUub3BlcmF0aW9uID0gQVZNX0FSR19OT1BfTFZBTFVFOworCQlhcmdDb2RlLm9wZXJhbmQgICA9IEFWTV9BUkdfRVhQUkVTU0lPTl9LSU5EOworCX0KK30KKworCit2b2lkIEFic3RyYWN0QXZtY29kZUNvbXBpbGVyOjpzZXRBcmdjb2RlUlZhbHVlKENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsCisJCUF2bUJ5dGVjb2RlICYgYXJnQ29kZSwgQkYgJiBhcmcsIGJvb2wgbmVlZFR5cGVDaGVja2luZykKK3sKKwlpZiggYXJnQ29kZS5kdHlwZS0+aXNUeXBlZEFycmF5KCkgKQorCXsKKwkJc2V0QXJnY29kZVJWYWx1ZUFycmF5KGFDVFgsIGFyZ0NvZGUsIGFyZywgbmVlZFR5cGVDaGVja2luZyk7CisKKwkJcmV0dXJuOworCX0KKworCWlmKCBhQ1RYLT5pc05lZWRUeXBlQ2hlY2tpbmcobmVlZFR5cGVDaGVja2luZykgKQorCXsKKwkJY2hlY2tBcmdUeXBlKGFDVFgsIGFyZ0NvZGUuZHR5cGUsIGFyZyk7CisJfQorCisJaWYoIGFyZy5pczwgQXJyYXlCRiA+KCkgKQorCXsKKwkJc2V0QXJnY29kZVJWYWx1ZUFycmF5KGFDVFgsIGFyZ0NvZGUsCisJCQkJYXJnLnRvX3B0cjwgQXJyYXlCRiA+KCksIG5lZWRUeXBlQ2hlY2tpbmcpOworCX0KKwllbHNlIGlmKCBhcmcuaXNCdWlsdGluVmFsdWUoKSApCisJeworLy8JCWFyZ0NvZGUucHJvY2Vzc29yID0gQVZNX0FSR19BUklUSE1FVElDX0xPR0lDX0NQVTsKKwkJYXJnQ29kZS5wcm9jZXNzb3IgPSBBVk1fQVJHX05PUF9DUFU7CisJCWFyZ0NvZGUub3BlcmF0aW9uID0gQVZNX0FSR19OT1BfUlZBTFVFOworCisJCWlmKCBhcmcuaXM8IEJvb2xlYW4gPigpICkKKwkJeworCQkJYXJnQ29kZS5vcGVyYW5kID0gQVZNX0FSR19CT09MRUFOX0tJTkQ7CisJCX0KKwkJZWxzZSBpZiggYXJnLmlzPCBJbnRlZ2VyID4oKSApCisJCXsKKwkJCWFyZ0NvZGUub3BlcmFuZCA9IEFWTV9BUkdfSU5URUdFUl9LSU5EOworCQl9CisJCWVsc2UgaWYoIGFyZy5pczwgUmF0aW9uYWwgPigpICkKKwkJeworCQkJYXJnQ29kZS5vcGVyYW5kID0gQVZNX0FSR19SQVRJT05BTF9LSU5EOworCQl9CisJCWVsc2UgaWYoIGFyZy5pczwgRmxvYXQgPigpICkKKwkJeworCQkJYXJnQ29kZS5vcGVyYW5kID0gQVZNX0FSR19GTE9BVF9LSU5EOworCQl9CisJCWVsc2UgaWYoIGFyZy5pczwgQ2hhcmFjdGVyID4oKSApCisJCXsKKy8vCQkJYXJnQ29kZS5wcm9jZXNzb3IgPSBBVk1fQVJHX0NIQVJBQ1RFUl9DUFU7CisJCQlhcmdDb2RlLm9wZXJhbmQgPSBBVk1fQVJHX0NIQVJBQ1RFUl9LSU5EOworCQl9CisJCWVsc2UgaWYoIGFyZy5pczwgU3RyaW5nID4oKSApCisJCXsKKy8vCQkJYXJnQ29kZS5wcm9jZXNzb3IgPSBBVk1fQVJHX1NUUklOR19DUFU7CisJCQlhcmdDb2RlLm9wZXJhbmQgPSBBVk1fQVJHX1NUUklOR19LSU5EOworCQl9CisJCWVsc2UKKwkJeworCQkJYXJnQ29kZS5vcGVyYW5kID0gQVZNX0FSR19CVUlMVElOX0tJTkQ7CisJCX0KKwl9CisKKwllbHNlIGlmKCBhcmcuaXM8IEluc3RhbmNlT2ZEYXRhID4oKSApCisJeworCQlJbnN0YW5jZU9mRGF0YSAqIGFuSW5zdGFuY2UgPSBhcmcudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCk7CisKKwkJYXJnQ29kZS5wcm9jZXNzb3IgPSBhbkluc3RhbmNlLT5pc1R5cGVkTWFjaGluZSgpID8KKwkJCQlBVk1fQVJHX01FTU9SWV9NQUNISU5FX0NQVSAgOiAgQVZNX0FSR19NRU1PUllfUlZBTFVFX0NQVTsKKworCQlhcmdDb2RlLm9wZXJhdGlvbiA9IEFWTV9BUkdfU0VWQUxfUlZBTFVFOworCisJCWlmKCBhbkluc3RhbmNlLT5pc1VmaU1peGVkUG9pbnRlcigpICkKKwkJeworCQkJYXJnQ29kZS5vcGVyYW5kID0gQVZNX0FSR19EQVRBX1VGSV9LSU5EOworCQl9CisJCWVsc2UgaWYoIGFuSW5zdGFuY2UtPmdldE1vZGlmaWVyKCkuaGFzTmF0dXJlUmVmZXJlbmNlKCkgKQorCQl7CisJCQlhcmdDb2RlLm9wZXJhbmQgPSAoYW5JbnN0YW5jZS0+aXNVZmlPZmZzZXRQb2ludGVyKCkgPworCQkJCQlBVk1fQVJHX0RBVEFfVUZJX0tJTkQgOiBBVk1fQVJHX0RBVEFfUkVGX0tJTkQpOworCQl9CisJCWVsc2UgaWYoIGFuSW5zdGFuY2UtPmdldE1vZGlmaWVyKCkuaGFzTmF0dXJlTWFjcm8oKSApCisJCXsKKwkJCWFyZ0NvZGUub3BlcmFuZCA9IEFWTV9BUkdfREFUQV9NQUNST19LSU5EOworCQl9CisKKwkJZWxzZSBpZiggYW5JbnN0YW5jZS0+Z2V0TW9kaWZpZXIoKS5oYXNGZWF0dXJlTXV0YWJsZSgpICkKKwkJeworCQkJYXJnQ29kZS5vcGVyYW5kID0gQVZNX0FSR19EQVRBX0tJTkQ7CisJCX0KKworCQllbHNlIGlmKCBhbkluc3RhbmNlLT5nZXRNb2RpZmllcigpLmhhc01vZGlmaWVyUHVibGljRmluYWxTdGF0aWMoKSApCisJCXsKKwkJCWlmKCBhbkluc3RhbmNlLT5pc1R5cGVkRW51bSgpICYmIGFuSW5zdGFuY2UtPmhhc1ZhbHVlKCkgKQorCQkJeworCQkJCWFyZyA9IGFuSW5zdGFuY2UtPmdldFZhbHVlKCk7CisJCQkJc2V0QXJnY29kZVJWYWx1ZShhQ1RYLCBhcmdDb2RlLCBhcmcsIGZhbHNlKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlhcmdDb2RlLnByb2Nlc3NvciA9IEFWTV9BUkdfTUVNT1JZX01BQ0hJTkVfQ1BVOworCisJCQkJaWYoIEV4ZWN1dGFibGVMaWI6Ok1BQ0hJTkVfQ09NUE9ORU5UX1NFTEYgPT0gYW5JbnN0YW5jZSApCisJCQkJeworCQkJCQlhcmdDb2RlLm9wZXJhbmQgPSBBVk1fQVJHX0NPTVBPTkVOVF9TRUxGX1JJRDsKKwkJCQl9CisJCQkJZWxzZSBpZiggRXhlY3V0YWJsZUxpYjo6TUFDSElORV9DT01QT05FTlRfUEFSRU5UID09IGFuSW5zdGFuY2UgKQorCQkJCXsKKwkJCQkJYXJnQ29kZS5vcGVyYW5kID0gQVZNX0FSR19DT01QT05FTlRfUEFSRU5UX1JJRDsKKwkJCQl9CisJCQkJZWxzZSBpZiggRXhlY3V0YWJsZUxpYjo6TUFDSElORV9DT01QT05FTlRfQ09NTVVOSUNBVE9SID09IGFuSW5zdGFuY2UgKQorCQkJCXsKKwkJCQkJYXJnQ29kZS5vcGVyYW5kID0gQVZNX0FSR19DT01QT05FTlRfQ09NTVVOSUNBVE9SX1JJRDsKKwkJCQl9CisKKwkJCQllbHNlIGlmKCBFeGVjdXRhYmxlTGliOjpNQUNISU5FX0VOVklST05NRU5UID09IGFuSW5zdGFuY2UgKQorCQkJCXsKKwkJCQkJYXJnQ29kZS5vcGVyYW5kID0gQVZNX0FSR19FTlZJUk9OTUVOVF9SSUQ7CisJCQkJfQorCisJCQkJZWxzZSBpZiggRXhlY3V0YWJsZUxpYjo6TUFDSElORV9TWVNURU0gPT0gYW5JbnN0YW5jZSApCisJCQkJeworCQkJCQlhcmdDb2RlLm9wZXJhbmQgPSBBVk1fQVJHX1NZU1RFTV9SSUQ7CisJCQkJfQorCisJCQkJZWxzZSBpZiggRXhlY3V0YWJsZUxpYjo6TUFDSElORV9TRUxGID09IGFuSW5zdGFuY2UgKQorCQkJCXsKKwkJCQkJYXJnQ29kZS5vcGVyYW5kID0gQVZNX0FSR19TRUxGX1JJRDsKKwkJCQl9CisJCQkJZWxzZSBpZiggRXhlY3V0YWJsZUxpYjo6TUFDSElORV9QQVJFTlQgPT0gYW5JbnN0YW5jZSApCisJCQkJeworCQkJCQlhcmdDb2RlLm9wZXJhbmQgPSBBVk1fQVJHX1BBUkVOVF9SSUQ7CisJCQkJfQorCQkJCWVsc2UgaWYoIEV4ZWN1dGFibGVMaWI6Ok1BQ0hJTkVfQ09NTVVOSUNBVE9SID09IGFuSW5zdGFuY2UgKQorCQkJCXsKKwkJCQkJYXJnQ29kZS5vcGVyYW5kID0gQVZNX0FSR19DT01NVU5JQ0FUT1JfUklEOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlhcmdDb2RlLnByb2Nlc3NvciA9IEFWTV9BUkdfTk9QX0NQVTsKKwkJCQkJYXJnQ29kZS5vcGVyYXRpb24gPSBBVk1fQVJHX05PUF9SVkFMVUU7CisJCQkJCWFyZ0NvZGUub3BlcmFuZCAgID0gQVZNX0FSR19EQVRBX0NTVF9LSU5EOworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlIGlmKCBhbkluc3RhbmNlLT5nZXRNb2RpZmllcigpLmhhc0ZlYXR1cmVGaW5hbCgpICkKKwkJeworCQkJYXJnQ29kZS5wcm9jZXNzb3IgPSBBVk1fQVJHX05PUF9DUFU7CisJCQlhcmdDb2RlLm9wZXJhdGlvbiA9IEFWTV9BUkdfTk9QX1JWQUxVRTsKKwkJCWFyZ0NvZGUub3BlcmFuZCAgID0gQVZNX0FSR19EQVRBX0NTVF9LSU5EOworCQl9CisKKwkJZWxzZQorCQl7CisJCQlnZXRDb21waWxlclRhYmxlKCkuaW5jcldhcm5pbmdDb3VudCgpOworCQkJYUNUWC0+ZXJyb3JDb250ZXh0KCBBVk1fT1NfV0FSTiApCisJCQkJCTw8ICJzZXRBcmdjb2RlUnZhbHVlIDo+IFVuZXhwZWN0ZWQgdGhlIEluc3RhbmNlT2ZEYXRhIDw8ICIKKwkJCQkJPDwgc3RyX2hlYWRlciggYW5JbnN0YW5jZSApIDw8ICIgPj4gYXMgPDwgIgorCQkJCQk8PCBhcmdDb2RlLnN0clR5cGUoKSA8PCAiID4+IGFyZ3VtZW50ICEhISIgPDwgc3RkOjplbmRsOworCisJCQlhcmdDb2RlLm9wZXJhdGlvbiA9IEFWTV9BUkdfTk9QX1JWQUxVRTsKKwkJCWFyZ0NvZGUub3BlcmFuZCAgID0gQVZNX0FSR19EQVRBX0tJTkQ7CisJCX0KKworCQlpZiggYXJnQ29kZS5kdHlwZSA9PSBUeXBlTWFuYWdlcjo6VU5JVkVSU0FMICkKKwkJeworCQkJYXJnQ29kZS5kdHlwZSA9IGFuSW5zdGFuY2UtPmdldFR5cGVTcGVjaWZpZXIoKTsKKwkJfQorCisJfQorCisJZWxzZSBpZiggYXJnLmlzPCBSdW50aW1lSUQgPigpICkKKwl7CisJCWFyZ0NvZGUucHJvY2Vzc29yID0gQVZNX0FSR19OT1BfQ1BVOworCQlhcmdDb2RlLm9wZXJhdGlvbiA9IEFWTV9BUkdfTk9QX1JWQUxVRTsKKwkJYXJnQ29kZS5vcGVyYW5kICAgPSBBVk1fQVJHX01BQ0hJTkVfUklEOworCX0KKworCWVsc2UgaWYoIGFyZy5pczwgSW5zdGFuY2VPZk1hY2hpbmUgPigpICkKKwl7CisJCWFyZ0NvZGUucHJvY2Vzc29yID0gQVZNX0FSR19NRU1PUllfTUFDSElORV9DUFU7CisKKwkJaWYoIChub3QgYXJnQ29kZS5oYXNUeXBlKCkpIHx8IGFyZ0NvZGUuZHR5cGUtPmlzVHlwZWRNYWNoaW5lKCkgKQorCQl7CisJCQlhcmdDb2RlLm9wZXJhdGlvbiA9IEFWTV9BUkdfU0VWQUxfUlZBTFVFOworCQkJYXJnQ29kZS5vcGVyYW5kICAgPSBBVk1fQVJHX01BQ0hJTkVfUklEOworCQl9CisJCWVsc2UKKwkJeworCQkJYXJnQ29kZS5vcGVyYXRpb24gPSBBVk1fQVJHX05PUF9SVkFMVUU7CisJCQlhcmdDb2RlLm9wZXJhbmQgICA9IEFWTV9BUkdfREFUQV9LSU5EOworCQl9CisJfQorCWVsc2UgaWYoIGFyZy5pczwgSW5zdGFuY2VPZlBvcnQgPigpICkKKwl7CisJCWFyZ0NvZGUucHJvY2Vzc29yID0gQVZNX0FSR19OT1BfQ1BVOworCQlhcmdDb2RlLm9wZXJhdGlvbiA9IEFWTV9BUkdfTk9QX1JWQUxVRTsKKwkJYXJnQ29kZS5vcGVyYW5kICAgPSBBVk1fQVJHX1BPUlRfS0lORDsKKwl9CisJZWxzZSBpZiggYXJnLmlzPCBJbnN0YW5jZU9mQnVmZmVyID4oKSApCisJeworCQlhcmdDb2RlLnByb2Nlc3NvciA9IEFWTV9BUkdfTk9QX0NQVTsKKwkJYXJnQ29kZS5vcGVyYXRpb24gPSBBVk1fQVJHX05PUF9SVkFMVUU7CisJCWFyZ0NvZGUub3BlcmFuZCAgID0gQVZNX0FSR19CVUZGRVJfS0lORDsKKwl9CisJZWxzZSBpZiggYXJnLmlzPCBJbnN0YW5jZU9mQ29ubmVjdCA+KCkgKQorCXsKKwkJYXJnQ29kZS5wcm9jZXNzb3IgPSBBVk1fQVJHX05PUF9DUFU7CisJCWFyZ0NvZGUub3BlcmF0aW9uID0gQVZNX0FSR19OT1BfUlZBTFVFOworCQlhcmdDb2RlLm9wZXJhbmQgICA9IEFWTV9BUkdfQ09OTkVDVE9SX0tJTkQ7CisJfQorCisJZWxzZSBpZiggYXJnLmlzPCBCYXNlSW5zdGFuY2VGb3JtID4oKSApCisJeworCQlhcmdDb2RlLnByb2Nlc3NvciA9IEFWTV9BUkdfTk9QX0NQVTsKKwkJYXJnQ29kZS5vcGVyYXRpb24gPSBBVk1fQVJHX05PUF9SVkFMVUU7CisJCWFyZ0NvZGUub3BlcmFuZCAgID0gQVZNX0FSR19EQVRBX0tJTkQ7CisJfQorCisKKwllbHNlIGlmKCBhcmcuaXM8IEF2bUNvZGUgPigpICkKKwl7CisJCWlmKCBub3QgYXJnLnRvX3B0cjwgQXZtQ29kZSA+KCktPmhhc0luc3RydWN0aW9uKCkgKQorCQl7CisJCQlhcmcgPSBBVk1DT0RFX0NPTVBJTEVSLm9wdGltaXplRXhwcmVzc2lvbihhQ1RYLCBhcmcuYmZDb2RlKCkpOworCQl9CisKKwkJYXJnQ29kZSA9IGFyZ2NvZGVPZkV4cHJlc3Npb24oYUNUWCwgYXJnLnRvX3B0cjwgQXZtQ29kZSA+KCkpOworCX0KKworCWVsc2UgaWYoIGFyZy5pczwgT3BlcmF0b3IgPigpCisJCQkmJiAoIChub3QgYXJnQ29kZS5oYXNUeXBlKCkpCisJCQkJfHwgYXJnQ29kZS5kdHlwZS0+aXNUeXBlZE9wZXJhdG9yKCkgKSApCisJeworCQlhcmdDb2RlLnByb2Nlc3NvciA9IEFWTV9BUkdfTk9QX0NQVTsKKwkJYXJnQ29kZS5vcGVyYXRpb24gPSBBVk1fQVJHX05PUF9SVkFMVUU7CisJCWFyZ0NvZGUub3BlcmFuZCAgID0gQVZNX0FSR19PUEVSQVRPUl9LSU5EOworCX0KKwllbHNlCisJeworCQlnZXRDb21waWxlclRhYmxlKCkuaW5jckVycm9yQ291bnQoKTsKKwkJYUNUWC0+ZXJyb3JDb250ZXh0KCBBVk1fT1NfV0FSTiApCisJCQkJPDwgInNldEFyZ2NvZGVSdmFsdWUgOj4gVW5leHBlY3RlZCA8PCAiCisJCQkJPDwgc3RyX2hlYWRlciggYXJnICkgPDwgIiA+PiBhcyA8PCAiIDw8IGFyZ0NvZGUuc3RyVHlwZSgpCisJCQkJPDwgIiA+PiBhcmd1bWVudCAhISEiIDw8IHN0ZDo6ZW5kbDsKKworCQlhcmdDb2RlLnByb2Nlc3NvciA9IEFWTV9BUkdfQVJJVEhNRVRJQ19MT0dJQ19DUFU7CisJCWFyZ0NvZGUub3BlcmF0aW9uID0gQVZNX0FSR19TRVZBTF9SVkFMVUU7CisJCWFyZ0NvZGUub3BlcmFuZCAgID0gQVZNX0FSR19FWFBSRVNTSU9OX0tJTkQ7CisJfQorfQorCisKK0F2bUJ5dGVjb2RlIEFic3RyYWN0QXZtY29kZUNvbXBpbGVyOjphcmdjb2RlT2ZFeHByZXNzaW9uKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBBdm1Db2RlICogYUNvZGUpCit7CisJQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKCBhQ29kZS0+aGFzSW5zdHJ1Y3Rpb24oKSApCisJCQk8PCAic2V0QXJnY29kZVJ2YWx1ZSA6PiBVbmV4cGVjdGVkIDw8ICIgPDwgYUNvZGUtPnN0cigpCisJCQk8PCAiID4+IHdpdGhvdXQgY29tcGlsZUluc3RydWN0aW9uICEhISIKKwkJCTw8IFNFTkRfRVhJVDsKKworCUF2bUJ5dGVjb2RlIGFyZ0NvZGUgPSBhQ29kZS0+Z2V0SW5zdHJ1Y3Rpb24oKS0+Z2V0TWFpbkJ5dGVjb2RlKCk7CisKKwlpZihTdGF0ZW1lbnRUeXBlQ2hlY2tlcjo6aXNBc3NpZ24oYUNvZGUpICkKKwl7CisJCWFyZ0NvZGUucHJvY2Vzc29yID0gQVZNX0FSR19NRU1PUllfUlZBTFVFX0NQVTsKKwkJaWYoIGFyZ0NvZGUuaXNOb3BPcGVyYXRpb24oKSApCisJCXsKKwkJCWFyZ0NvZGUub3BlcmF0aW9uID0gQVZNX0FSR19TRVZBTF9SVkFMVUU7CisJCX0KKwl9CisJZWxzZSBpZihTdGF0ZW1lbnRUeXBlQ2hlY2tlcjo6aXNDb21tdW5pY2F0aW9uKGFDb2RlKSApCisJeworCQlhcmdDb2RlLnByb2Nlc3NvciA9IEFWTV9BUkdfU1RBVEVNRU5UX0NQVTsKKwkJYXJnQ29kZS5vcGVyYXRpb24gPSBBVk1fQVJHX1NFVkFMX1JWQUxVRTsKKwkJYXJnQ29kZS5vcGVyYW5kICAgPSBBVk1fQVJHX1NUQVRFTUVOVF9LSU5EOworCX0KKworCWVsc2UgaWYoRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc0N0b3IoYUNvZGUpICkKKwl7CisJCWFyZ0NvZGUub3BlcmFuZCA9IEFWTV9BUkdfRVhQUkVTU0lPTl9LSU5EOworCX0KKwlyZXR1cm4oIGFyZ0NvZGUgKTsKK30KKworCisKK3ZvaWQgQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXI6OnNldEFyZ2NvZGVSVmFsdWVBcnJheShDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLAorCQlBdm1CeXRlY29kZSAmIGFyZ0NvZGUsIEJGICYgYXJnLCBib29sIG5lZWRUeXBlQ2hlY2tpbmcpCit7CisJQ29udGFpbmVyVHlwZVNwZWNpZmllciAqIGFycmF5VCA9CisJCQlhcmdDb2RlLmR0eXBlLT5hczwgQ29udGFpbmVyVHlwZVNwZWNpZmllciA+KCk7CisKKwlpZiggYXJnLmlzPCBBcnJheUJGID4oKSApCisJeworCQlpZiggYUNUWC0+aXNOZWVkVHlwZUNoZWNraW5nKG5lZWRUeXBlQ2hlY2tpbmcpICkKKwkJeworCQkJY2hlY2tBcmdUeXBlKGFDVFgsIGFyZ0NvZGUuZHR5cGUsIGFyZyk7CisJCX0KKworCQlBcnJheUJGICogYXJnQXJyYXkgPSBhcmcudG9fcHRyPCBBcnJheUJGID4oKTsKKworCisJCWlmKCBhcmdBcnJheS0+c2l6ZSgpIDwgYXJyYXlULT5zaXplKCkgKQorCQl7CisJCQlnZXRDb21waWxlclRhYmxlKCkuaW5jckVycm9yQ291bnQoKTsKKwkJCWFDVFgtPmVycm9yQ29udGV4dCggQVZNX09TX1dBUk4gKQorCQkJCQk8PCAic2V0QXJnY29kZVJWYWx1ZUFycmF5IDo+IFRvbyBmZXcgZWxlbWVudCBpbiBhcnJheSA6PlxuPDwgIgorCQkJCQk8PCBhcmcuc3RyKCkgPDwgIiA+PlxuYXMgdHlwZSA8PCAiIDw8IGFycmF5VC0+c3RyVCgpCisJCQkJCTw8ICIgPj4gYXJndW1lbnQgISEhIiA8PCBzdGQ6OmVuZGw7CisJCX0KKwkJZWxzZSBpZiggYXJnQXJyYXktPnNpemUoKSA+IGFycmF5VC0+c2l6ZSgpICkKKwkJeworCQkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JXYXJuaW5nQ291bnQoKTsKKwkJCWFDVFgtPndhcm5pbmdDb250ZXh0KCBBVk1fT1NfV0FSTiApCisJCQkJCTw8ICJzZXRBcmdjb2RlUlZhbHVlQXJyYXkgOj4gVG9vIG11Y2ggZWxlbWVudCBpbiBhcnJheVxuPDwgIgorCQkJCQk8PCBhcmcuc3RyKCkgPDwgIiA+PlxuYXMgdHlwZSA8PCAiIDw8IGFycmF5VC0+c3RyVHlwZSgpCisJCQkJCTw8ICIgPj4gYXJndW1lbnQgISEhIiA8PCBzdGQ6OmVuZGw7CisKKwkJCUFycmF5QkYgKiByZWR1Y2VkQXJnQXJyYXkgPSBuZXcgQXJyYXlCRihhcnJheVQsIGFycmF5VC0+c2l6ZSgpKTsKKworCQkJZm9yKCBhdm1fc2l6ZV90IGlkeCA9IDAgOyBpZHggPCBhcnJheVQtPnNpemUoKSA7ICsraWR4ICkKKwkJCXsKKwkJCQlyZWR1Y2VkQXJnQXJyYXktPnNldChpZHgsIGFyZ0FycmF5LT5hdChpZHgpKTsKKwkJCX0KKworCQkJYXJnLnJlbmV3KCByZWR1Y2VkQXJnQXJyYXkgKTsKKworCQkJc2V0QXJnY29kZVJWYWx1ZUFycmF5KGFDVFgsIGFyZ0NvZGUsCisJCQkJCXJlZHVjZWRBcmdBcnJheSwgbmVlZFR5cGVDaGVja2luZyk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlzZXRBcmdjb2RlUlZhbHVlQXJyYXkoYUNUWCwgYXJnQ29kZSwKKwkJCQkJYXJnLnRvX3B0cjwgQXJyYXlCRiA+KCksIG5lZWRUeXBlQ2hlY2tpbmcpOworCQl9CisJfQorCisKKwllbHNlIGlmKCBhcmcuaXM8IEluc3RhbmNlT2ZEYXRhID4oKQorCQkJJiYgRXhwcmVzc2lvblR5cGVDaGVja2VyOjp3ZWFrbHlUeXBlZCggYXJyYXlULAorCQkJCQlhcmcudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCktPmdldFR5cGVTcGVjaWZpZXIoKSApICkKKwl7CisJCWFyZ0NvZGUucHJvY2Vzc29yID0gQVZNX0FSR19NRU1PUllfUlZBTFVFX0NQVTsKKwkJYXJnQ29kZS5vcGVyYXRpb24gPSBBVk1fQVJHX1NFVkFMX1JWQUxVRTsKKwkJYXJnQ29kZS5vcGVyYW5kICAgPSBBVk1fQVJHX0RBVEFfS0lORDsKKwl9CisKKwllbHNlIGlmKCBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzVHlwZWQoYXJyYXlULCBhcmcpICkKKwl7CisJCWFyZ0NvZGUucHJvY2Vzc29yID0gQVZNX0FSR19BUklUSE1FVElDX0xPR0lDX0NQVTsKKwkJYXJnQ29kZS5vcGVyYXRpb24gPSBBVk1fQVJHX1NFVkFMX1JWQUxVRTsKKwkJYXJnQ29kZS5vcGVyYW5kICAgPSBBVk1fQVJHX0VYUFJFU1NJT05fS0lORDsKKwl9CisKKwllbHNlCisJeworCQl3aGlsZSggYXJyYXlULT5nZXRDb250ZW50c1R5cGVTcGVjaWZpZXIoKS5pc1R5cGVkQXJyYXkoKSApCisJCXsKKwkJCWFycmF5VCA9IGFycmF5VC0+Z2V0Q29udGVudHNUeXBlU3BlY2lmaWVyKCkucmF3Q29udGFpbmVyKCk7CisJCX0KKwkJaWYoIGFDVFgtPmlzTmVlZFR5cGVDaGVja2luZyhuZWVkVHlwZUNoZWNraW5nKSApCisJCXsKKwkJCWNoZWNrQXJnVHlwZShhQ1RYLCBhcnJheVQtPmdldENvbnRlbnRzVHlwZVNwZWNpZmllcigpLCBhcmcpOworCQl9CisKKwkJYXJnQ29kZS5wcm9jZXNzb3IgPSBBVk1fQVJHX0FSUkFZX1JWQUxVRV9DUFU7CisJCWFyZ0NvZGUub3BlcmF0aW9uID0gQVZNX0FSR19TRVZBTF9SVkFMVUU7CisJCWFyZ0NvZGUub3BlcmFuZCAgID0gb3BlcmFuZE9mKGFyZyk7CisJfQorfQorCit2b2lkIEFic3RyYWN0QXZtY29kZUNvbXBpbGVyOjpzZXRBcmdjb2RlUlZhbHVlQXJyYXkoQ09NUElMRV9DT05URVhUICogYUNUWCwKKwkJQXZtQnl0ZWNvZGUgJiBhcmdDb2RlLCBBcnJheUJGICogYXJnQXJyYXksIGJvb2wgbmVlZFR5cGVDaGVja2luZykKK3sKKwlhdm1fc2l6ZV90IGFyZ0FycmF5U2l6ZSA9IGFyZ0FycmF5LT5zaXplKCk7CisKKwlhcmdDb2RlLnByb2Nlc3NvciA9IEFWTV9BUkdfQVJSQVlfUlZBTFVFX0NQVTsKKwlhcmdDb2RlLm9wZXJhdGlvbiA9IEFWTV9BUkdfTk9QX1JWQUxVRTsKKwlhcmdDb2RlLm9wZXJhbmQgICA9IEFWTV9BUkdfQlVJTFRJTl9BUlJBWV9LSU5EOworCisJZm9yKCBhdm1fc2l6ZV90IGlkeCA9IDAgOyBpZHggPCBhcmdBcnJheVNpemUgOyArK2lkeCApCisJeworCQlpZiggbXVzdEJlRXZhbHVhdGVkQXJndW1lbnQoYXJnQXJyYXktPmF0KGlkeCkpICkKKwkJeworCQkJYXJnQ29kZS5vcGVyYXRpb24gPSBBVk1fQVJHX1NFVkFMX1JWQUxVRTsKKwkJCWFyZ0NvZGUub3BlcmFuZCAgID0gQVZNX0FSR19BUlJBWV9LSU5EOworCQkJYnJlYWs7CisJCX0KKwl9CisKKworCUF2bUluc3RydWN0aW9uICogYXJyYXlJbnN0cnVjdGlvbiA9IG5ldyBBdm1JbnN0cnVjdGlvbiggYXJnQXJyYXlTaXplICk7CisKKwlhcmdBcnJheS0+c2V0SW5zdHJ1Y3Rpb24oIGFycmF5SW5zdHJ1Y3Rpb24gKTsKKworCS8vIEdsb2JhbCBBcmdDb2RlCisJYXJyYXlJbnN0cnVjdGlvbi0+c2V0TWFpbkJ5dGVjb2RlKGFyZ0NvZGUpOworCisJaWYoIGFyZ0FycmF5LT5nZXRUeXBlU3BlY2lmaWVyKCktPmlzPCBDbGFzc1R5cGVTcGVjaWZpZXIgPigpICkKKwl7CisJCUNsYXNzVHlwZVNwZWNpZmllciAqIHN0cnVjdFQgPQorCQkJCWFyZ0FycmF5LT5nZXRUeXBlU3BlY2lmaWVyKCktPnRvPCBDbGFzc1R5cGVTcGVjaWZpZXIgPigpOworCisJCWZvciggYXZtX3NpemVfdCBpZHggPSAwIDsgaWR4IDwgYXJnQXJyYXlTaXplIDsgKytpZHggKQorCQl7CisJCQlzZXRBcmdjb2RlUlZhbHVlKAorCQkJCQlhQ1RYLT5jbG9uZShzdHJ1Y3RULT5nZXRTeW1ib2xEYXRhKGlkeCkuZ2V0VHlwZVNwZWNpZmllcigpKSwKKwkJCQkJYXJyYXlJbnN0cnVjdGlvbi0+YXQoaWR4KSwgYXJnQXJyYXktPmF0KGlkeCksIG5lZWRUeXBlQ2hlY2tpbmcpOworCisJCQlhcnJheUluc3RydWN0aW9uLT5hdChpZHgpLm9mZnNldCA9IGlkeDsKKwkJfQorCX0KKwllbHNlCisJeworCQlpZiggYXJnQXJyYXktPmdldFR5cGVTcGVjaWZpZXIoKS0+aXM8IENvbnRhaW5lclR5cGVTcGVjaWZpZXIgPigpICkKKwkJeworCQkJYUNUWCA9IGFDVFgtPmNsb25lKCBhcmdBcnJheS0+Z2V0VHlwZVNwZWNpZmllcigpLT4KKwkJCQkJdG88IENvbnRhaW5lclR5cGVTcGVjaWZpZXIgPigpLT5nZXRDb250ZW50c1R5cGVTcGVjaWZpZXIoKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJbmVlZFR5cGVDaGVja2luZyA9IGZhbHNlOworCQl9CisKKwkJZm9yKCBhdm1fc2l6ZV90IGlkeCA9IDAgOyBpZHggPCBhcmdBcnJheVNpemUgOyArK2lkeCApCisJCXsKKwkJCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJyYXlJbnN0cnVjdGlvbi0+YXQoaWR4KSwKKwkJCQkJYXJnQXJyYXktPmF0KGlkeCksIG5lZWRUeXBlQ2hlY2tpbmcpOworCisJCQlhcnJheUluc3RydWN0aW9uLT5hdChpZHgpLm9mZnNldCA9IGlkeDsKKwkJfQorCX0KK30KKworCit2b2lkIEFic3RyYWN0QXZtY29kZUNvbXBpbGVyOjpzZXRBcmdjb2RlQ29udGFpbmVyV1ZhbHVlKENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsCisJCUF2bUJ5dGVjb2RlICYgYXJnQ29kZSwgY29uc3QgQkYgJiBhcmcpCit7CisJYXJnQ29kZS5wcm9jZXNzb3IgPSBBVk1fQVJHX01FTU9SWV9XVkFMVUVfQ1BVOworCisJaWYoIGFyZy5pczwgQnVpbHRpbkNvbnRhaW5lciA+KCkgKQorCXsKKwkJYXJnQ29kZS5vcGVyYXRpb24gPSBBVk1fQVJHX1NFVkFMX1dWQUxVRTsKKwkJYXJnQ29kZS5vcGVyYW5kICAgPSBBVk1fQVJHX0JVSUxUSU5fQ09OVEFJTkVSX0tJTkQ7CisJfQorCisJZWxzZSBpZiggYXJnLmlzPCBJbnN0YW5jZU9mQnVmZmVyID4oKSApCisJeworCQlhcmdDb2RlLm9wZXJhdGlvbiA9IEFWTV9BUkdfU0VWQUxfV1ZBTFVFOworCQlhcmdDb2RlLm9wZXJhbmQgICA9IEFWTV9BUkdfQlVGRkVSX0tJTkQ7CisJCWFyZ0NvZGUuZHR5cGUgICAgID0gVHlwZU1hbmFnZXI6OkJVRkZFUjsKKworCX0KKworCWVsc2UgaWYoIGFyZy5pczwgSW5zdGFuY2VPZkRhdGEgPigpICkKKwl7CisJCWFyZ0NvZGUub3BlcmF0aW9uID0gQVZNX0FSR19TRVZBTF9XVkFMVUU7CisKKwkJSW5zdGFuY2VPZkRhdGEgKiBhbkluc3RhbmNlID0gYXJnLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpOworCisJCWlmKCBhbkluc3RhbmNlLT5pc1VmaU1peGVkUG9pbnRlcigpICkKKwkJeworCQkJYXJnQ29kZS5vcGVyYW5kID0gQVZNX0FSR19EQVRBX1VGSV9LSU5EOworCQl9CisJCWVsc2UgaWYoIGFuSW5zdGFuY2UtPmdldE1vZGlmaWVyKCkuaGFzTmF0dXJlUmVmZXJlbmNlKCkgKQorCQl7CisJCQlhcmdDb2RlLm9wZXJhbmQgPSAoYW5JbnN0YW5jZS0+aXNVZmlPZmZzZXRQb2ludGVyKCkgPworCQkJCQlBVk1fQVJHX0RBVEFfVUZJX0tJTkQgOiBBVk1fQVJHX0RBVEFfUkVGX0tJTkQpOworCQl9CisJCWVsc2UgaWYoIGFuSW5zdGFuY2UtPmdldE1vZGlmaWVyKCkuaGFzTmF0dXJlTWFjcm8oKSApCisJCXsKKwkJCWFyZ0NvZGUub3BlcmFuZCA9IEFWTV9BUkdfREFUQV9NQUNST19LSU5EOworCQl9CisKKwkJZWxzZSBpZiggYW5JbnN0YW5jZS0+Z2V0TW9kaWZpZXIoKS5oYXNGZWF0dXJlTXV0YWJsZSgpICkKKwkJeworCQkJYXJnQ29kZS5vcGVyYW5kID0gQVZNX0FSR19EQVRBX0tJTkQ7CisJCX0KKworCQllbHNlCisJCXsKKwkJCWdldENvbXBpbGVyVGFibGUoKS5pbmNyV2FybmluZ0NvdW50KCk7CisJCQlhQ1RYLT5lcnJvckNvbnRleHQoIEFWTV9PU19XQVJOICkKKwkJCQkJPDwgInNldEFyZ2NvZGVDb250YWluZXJXVmFsdWUgOj4gIgorCQkJCQkJIlVuZXhwZWN0ZWQgdGhlIEluc3RhbmNlT2ZEYXRhIDw8ICIKKwkJCQkJPDwgc3RyX2hlYWRlciggYW5JbnN0YW5jZSApIDw8ICIgPj4gYXMgPDwgIgorCQkJCQk8PCBhcmdDb2RlLnN0clR5cGUoKSA8PCAiID4+IGFyZ3VtZW50ICEhISIgPDwgc3RkOjplbmRsOworCisJCQlhcmdDb2RlLm9wZXJhdGlvbiA9IEFWTV9BUkdfTk9QX1JWQUxVRTsKKwkJCWFyZ0NvZGUub3BlcmFuZCAgID0gQVZNX0FSR19EQVRBX0tJTkQ7CisJCX0KKworCQlpZiggYW5JbnN0YW5jZS0+aXNUeXBlZEJ1ZmZlcigpIHx8IGFuSW5zdGFuY2UtPmhhc1R5cGVDb2xsZWN0aW9uKCkgKQorCQl7CisJCQlhcmdDb2RlLmR0eXBlID0gYW5JbnN0YW5jZS0+Z2V0VHlwZVNwZWNpZmllcigpOworCQl9CisJCWVsc2UKKwkJeworCQkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JFcnJvckNvdW50KCk7CisJCQlhQ1RYLT5lcnJvckNvbnRleHQoIEFWTV9PU19XQVJOICkKKwkJCQkJPDwgInNldEFyZ2NvZGVDb250YWluZXJXVmFsdWUgOj4gVW5leHBlY3RlZCA8PCAiCisJCQkJCTw8IHN0cl9oZWFkZXIoIGFuSW5zdGFuY2UgKSA8PCAiID4+IGFzIDw8IENvbGxlY3Rpb248IFQgPiIKKwkJCQkJPDwgIiA+PiBhcmd1bWVudCAhISEiIDw8IHN0ZDo6ZW5kbDsKKworCQkJQVZNX09TX1dBUk4gPDwgIlRoZSB0eXBlIGJlbG93LCBpcyB0aGVyZSBhIHR5cGUgb2YgIgorCQkJCQkiY29sbGVjdGlvbiA/IElmIHllcywgeW91IGZvdW5kIGEgQlVHICEgIgorCQkJCQk8PCBzdGQ6OmVuZGwKKwkJCQkJPDwgdG9fc3RyZWFtKCBhbkluc3RhbmNlLT5yZWZlcmVkVHlwZVNwZWNpZmllcigpICk7CisJCX0KKwl9CisKKwllbHNlCisJeworCQlnZXRDb21waWxlclRhYmxlKCkuaW5jckVycm9yQ291bnQoKTsKKwkJYUNUWC0+ZXJyb3JDb250ZXh0KCBBVk1fT1NfV0FSTiApCisJCQkJPDwgInNldEFyZ2NvZGVDb250YWluZXJXVmFsdWUgOj4gVW5leHBlY3RlZCA8PCAiCisJCQkJPDwgc3RyX2hlYWRlciggYXJnICkgPDwgIiA+PiBhcyA8PCBjb250YWluZXIgPj4gYXJndW1lbnQgISEhIgorCQkJCTw8IHN0ZDo6ZW5kbDsKKworCQlhcmdDb2RlLm9wZXJhdGlvbiA9IEFWTV9BUkdfU0VWQUxfV1ZBTFVFOworCQlhcmdDb2RlLm9wZXJhbmQgICA9IEFWTV9BUkdfRVhQUkVTU0lPTl9LSU5EOworCX0KK30KKworCit2b2lkIEFic3RyYWN0QXZtY29kZUNvbXBpbGVyOjpzZXRBcmdjb2RlQ29udGFpbmVyUlZhbHVlKENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsCisJCUF2bUJ5dGVjb2RlICYgYXJnQ29kZSwgY29uc3QgQkYgJiBhcmcpCit7CisJaWYoIGFyZy5pczwgQnVpbHRpbkNvbnRhaW5lciA+KCkgKQorCXsKKwkJYXJnQ29kZS5wcm9jZXNzb3IgPSBBVk1fQVJHX0NPTExFQ1RJT05fQ1BVOworCQlhcmdDb2RlLm9wZXJhdGlvbiA9IEFWTV9BUkdfTk9QX1JWQUxVRTsKKwkJYXJnQ29kZS5vcGVyYW5kICAgPSBBVk1fQVJHX0JVSUxUSU5fQ09OVEFJTkVSX0tJTkQ7CisJfQorCisJZWxzZSBpZiggYXJnLmlzPCBJbnN0YW5jZU9mQnVmZmVyID4oKSApCisJeworCQlhcmdDb2RlLnByb2Nlc3NvciA9IEFWTV9BUkdfQlVGRkVSX0NQVTsKKwkJYXJnQ29kZS5vcGVyYXRpb24gPSBBVk1fQVJHX1NFVkFMX1JWQUxVRTsKKwkJYXJnQ29kZS5vcGVyYW5kICAgPSBBVk1fQVJHX0JVRkZFUl9LSU5EOworCQlhcmdDb2RlLmR0eXBlICAgICA9IFR5cGVNYW5hZ2VyOjpCVUZGRVI7CisKKwl9CisKKwllbHNlIGlmKCBhcmcuaXM8IEluc3RhbmNlT2ZEYXRhID4oKSApCisJeworCQlhcmdDb2RlLnByb2Nlc3NvciA9IEFWTV9BUkdfTUVNT1JZX1JWQUxVRV9DUFU7CisJCWFyZ0NvZGUub3BlcmF0aW9uID0gQVZNX0FSR19TRVZBTF9SVkFMVUU7CisKKwkJSW5zdGFuY2VPZkRhdGEgKiBhbkluc3RhbmNlID0gYXJnLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpOworCisJCWlmKCBhbkluc3RhbmNlLT5pc1VmaU1peGVkUG9pbnRlcigpICkKKwkJeworCQkJYXJnQ29kZS5vcGVyYW5kID0gQVZNX0FSR19EQVRBX1VGSV9LSU5EOworCQl9CisJCWVsc2UgaWYoIGFuSW5zdGFuY2UtPmdldE1vZGlmaWVyKCkuaGFzTmF0dXJlUmVmZXJlbmNlKCkgKQorCQl7CisJCQlhcmdDb2RlLm9wZXJhbmQgPSAoYW5JbnN0YW5jZS0+aXNVZmlPZmZzZXRQb2ludGVyKCkgPworCQkJCQlBVk1fQVJHX0RBVEFfVUZJX0tJTkQgOiBBVk1fQVJHX0RBVEFfUkVGX0tJTkQpOworCQl9CisJCWVsc2UgaWYoIGFuSW5zdGFuY2UtPmdldE1vZGlmaWVyKCkuaGFzTmF0dXJlTWFjcm8oKSApCisJCXsKKwkJCWFyZ0NvZGUub3BlcmFuZCA9IEFWTV9BUkdfREFUQV9NQUNST19LSU5EOworCQl9CisKKwkJZWxzZSBpZiggYW5JbnN0YW5jZS0+Z2V0TW9kaWZpZXIoKS5oYXNGZWF0dXJlTXV0YWJsZSgpICkKKwkJeworCQkJYXJnQ29kZS5vcGVyYW5kID0gQVZNX0FSR19EQVRBX0tJTkQ7CisJCX0KKworCQllbHNlCisJCXsKKwkJCWdldENvbXBpbGVyVGFibGUoKS5pbmNyV2FybmluZ0NvdW50KCk7CisJCQlhQ1RYLT5lcnJvckNvbnRleHQoIEFWTV9PU19XQVJOICkKKwkJCQkJPDwgInNldEFyZ2NvZGVDb250YWluZXJSVmFsdWUgOj4gIgorCQkJCQkJIlVuZXhwZWN0ZWQgdGhlIEluc3RhbmNlT2ZEYXRhIDw8ICIKKwkJCQkJPDwgc3RyX2hlYWRlciggYW5JbnN0YW5jZSApIDw8ICIgPj4gYXMgPDwgIgorCQkJCQk8PCBhcmdDb2RlLnN0clR5cGUoKSA8PCAiID4+IGFyZ3VtZW50ICEhISIgPDwgc3RkOjplbmRsOworCisJCQlhcmdDb2RlLm9wZXJhdGlvbiA9IEFWTV9BUkdfTk9QX1JWQUxVRTsKKwkJCWFyZ0NvZGUub3BlcmFuZCAgID0gQVZNX0FSR19EQVRBX0tJTkQ7CisJCX0KKworCQlpZiggYW5JbnN0YW5jZS0+aXNUeXBlZEJ1ZmZlcigpCisJCQl8fCBhbkluc3RhbmNlLT5pc1R5cGVkU3RyaW5nKCkKKwkJCXx8IGFuSW5zdGFuY2UtPmhhc1R5cGVDb2xsZWN0aW9uKCkgKQorCQl7CisJCQlhcmdDb2RlLmR0eXBlID0gYW5JbnN0YW5jZS0+Z2V0VHlwZVNwZWNpZmllcigpOworCQl9CisJCWVsc2UKKwkJeworCQkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JFcnJvckNvdW50KCk7CisJCQlhQ1RYLT5lcnJvckNvbnRleHQoIEFWTV9PU19XQVJOICkKKwkJCQkJPDwgInNldEFyZ2NvZGVDb250YWluZXJSVmFsdWUgOj4gVW5leHBlY3RlZCA8PCAiCisJCQkJCTw8IHN0cl9oZWFkZXIoIGFuSW5zdGFuY2UgKSA8PCAiID4+IGFzIDw8IENvbGxlY3Rpb248IFQgPiIKKwkJCQkJPDwgIiA+PiBhcmd1bWVudCAhISEiIDw8IHN0ZDo6ZW5kbDsKKworCQkJQVZNX09TX1dBUk4gPDwgIlRoZSB0eXBlIGJlbG93LCBpcyB0aGVyZSBhIHR5cGUgb2YgIgorCQkJCQkiY29sbGVjdGlvbiA/IGlmIHllcywgeW91IGZvdW5kIGEgQlVHICEgIgorCQkJCQk8PCBzdGQ6OmVuZGwKKwkJCQkJPDwgdG9fc3RyZWFtKCBhbkluc3RhbmNlLT5yZWZlcmVkVHlwZVNwZWNpZmllcigpICk7CisJCX0KKwl9CisKKwllbHNlCisJeworCQlnZXRDb21waWxlclRhYmxlKCkuaW5jckVycm9yQ291bnQoKTsKKwkJYUNUWC0+ZXJyb3JDb250ZXh0KCBBVk1fT1NfV0FSTiApCisJCQkJPDwgInNldEFyZ2NvZGVDb250YWluZXJSVmFsdWUgOj4gVW5leHBlY3RlZCA8PCAiCisJCQkJPDwgYXJnLnJhd19wb2ludGVyKCktPmNsYXNzS2luZEluZm8oKSA8PCAiIDogIiA8PCBzdHJfaGVhZGVyKCBhcmcgKQorCQkJCTw8ICIgPj4gYXMgPDwgY29udGFpbmVyID4+IGFyZ3VtZW50ICEhISIgPDwgc3RkOjplbmRsOworCisJCWFyZ0NvZGUub3BlcmF0aW9uID0gQVZNX0FSR19TRVZBTF9SVkFMVUU7CisJCWFyZ0NvZGUub3BlcmFuZCAgID0gQVZNX0FSR19FWFBSRVNTSU9OX0tJTkQ7CisJfQorfQorCisKKwordm9pZCBBYnN0cmFjdEF2bWNvZGVDb21waWxlcjo6c2V0QXJnY29kZVN0YXRlbWVudChDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLAorCQlBdm1CeXRlY29kZSAmIGFyZ0NvZGUsIGNvbnN0IEJGICYgYXJnLCBib29sIG5lZWRUeXBlQ2hlY2tpbmcpCit7CisJYXJnQ29kZS5kdHlwZSAgPSBUeXBlTWFuYWdlcjo6QVZNQ09ERTsKKwlpZiggYUNUWC0+aXNOZWVkVHlwZUNoZWNraW5nKG5lZWRUeXBlQ2hlY2tpbmcpICkKKwl7CisJCWNoZWNrQXJnVHlwZShhQ1RYLCBhcmdDb2RlLmR0eXBlLCBhcmcpOworCX0KKworCWFyZ0NvZGUub3BlcmF0aW9uID0gQVZNX0FSR19VTkRFRklORURfT1BFUkFUSU9OOworCWFyZ0NvZGUub3BlcmFuZCAgID0gQVZNX0FSR19VTkRFRklORURfT1BFUkFORDsKKworCWlmKCBhcmcuaXM8IEluc3RhbmNlT2ZEYXRhID4oKSApCisJeworCQlJbnN0YW5jZU9mRGF0YSAqIGFuSW5zdGFuY2UgPSBhcmcudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCk7CisKKwkJYXJnQ29kZS5wcm9jZXNzb3IgPSBBVk1fQVJHX01FTU9SWV9SVkFMVUVfQ1BVOworCQlhcmdDb2RlLm9wZXJhdGlvbiA9IEFWTV9BUkdfU0VWQUxfUlZBTFVFOworCisJCWlmKCBhbkluc3RhbmNlLT5pc1VmaU1peGVkUG9pbnRlcigpICkKKwkJeworCQkJYXJnQ29kZS5vcGVyYW5kICAgPSBBVk1fQVJHX0RBVEFfVUZJX0tJTkQ7CisJCX0KKwkJZWxzZSBpZiggYW5JbnN0YW5jZS0+Z2V0TW9kaWZpZXIoKS5oYXNOYXR1cmVSZWZlcmVuY2UoKSApCisJCXsKKwkJCWFyZ0NvZGUub3BlcmFuZCAgID0gKGFuSW5zdGFuY2UtPmlzVWZpT2Zmc2V0UG9pbnRlcigpID8KKwkJCQkJQVZNX0FSR19EQVRBX1VGSV9LSU5EIDogQVZNX0FSR19EQVRBX1JFRl9LSU5EKTsKKwkJfQorCQllbHNlIGlmKCBhbkluc3RhbmNlLT5nZXRNb2RpZmllcigpLmhhc05hdHVyZU1hY3JvKCkgKQorCQl7CisJCQlhcmdDb2RlLm9wZXJhbmQgICA9IEFWTV9BUkdfREFUQV9NQUNST19LSU5EOworCQl9CisJCWVsc2UgaWYoIGFuSW5zdGFuY2UtPmdldE1vZGlmaWVyKCkuaGFzRmVhdHVyZU11dGFibGUoKSApCisJCXsKKwkJCWFyZ0NvZGUub3BlcmFuZCAgID0gQVZNX0FSR19EQVRBX0tJTkQ7CisJCX0KKwl9CisJZWxzZSBpZiggYXJnLmlzPCBBdm1Db2RlID4oKSApCisJeworCQlhcmdDb2RlLnByb2Nlc3NvciA9IEFWTV9BUkdfTk9QX0NQVTsKKwkJYXJnQ29kZS5vcGVyYXRpb24gPSBBVk1fQVJHX05PUF9SVkFMVUU7CisJCWFyZ0NvZGUub3BlcmFuZCAgID0gQVZNX0FSR19TVEFURU1FTlRfS0lORDsKKwl9CisKKwlpZiggKGFyZ0NvZGUub3BlcmF0aW9uID09IEFWTV9BUkdfVU5ERUZJTkVEX09QRVJBVElPTikKKwkJJiYgKGFyZ0NvZGUub3BlcmFuZCA9PSBBVk1fQVJHX1VOREVGSU5FRF9PUEVSQU5EKSApCisJeworCQlnZXRDb21waWxlclRhYmxlKCkuaW5jckVycm9yQ291bnQoKTsKKwkJYUNUWC0+ZXJyb3JDb250ZXh0KCBBVk1fT1NfV0FSTiApCisJCQkJPDwgInNldEFyZ2NvZGVTdGF0ZW1lbnQgOj4gVW5leHBlY3RlZCA8PCAiCisJCQkJPDwgc3RyX2hlYWRlciggYXJnICkgPDwgIiA+PiBhcyA8PCAiCisJCQkJPDwgYXJnQ29kZS5zdHJUeXBlKCkgPDwgIiA+PiBhcmd1bWVudCAhISEiIDw8IHN0ZDo6ZW5kbDsKKworCQlhcmdDb2RlLm9wZXJhdGlvbiA9IEFWTV9BUkdfU0VWQUxfUlZBTFVFOworCQlhcmdDb2RlLm9wZXJhbmQgICA9IEFWTV9BUkdfU1RBVEVNRU5UX0tJTkQ7CisJfQorfQorCisKKworRXhlY3V0YWJsZUZvcm0gKiBBYnN0cmFjdEF2bWNvZGVDb21waWxlcjo6Z2V0RXhlY3V0YWJsZU1hY2hpbmUoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGICYgYXJnKQoreworCXN3aXRjaCggYXJnLmNsYXNzS2luZCgpICkKKwl7CisJCWNhc2UgRk9STV9SVU5USU1FX0lEX0tJTkQ6CisJCXsKKwkJCXJldHVybiggYXJnLmJmUklEKCkuZ2V0RXhlY3V0YWJsZSgpICk7CisJCX0KKworCQljYXNlIEZPUk1fSU5TVEFOQ0VfTUFDSElORV9LSU5EOgorCQl7CisJCQlyZXR1cm4oIGFyZy50b19wdHI8IEluc3RhbmNlT2ZNYWNoaW5lID4oKS0+Z2V0RXhlY3V0YWJsZSgpICk7CisJCX0KKworCQljYXNlIEZPUk1fSU5TVEFOQ0VfREFUQV9LSU5EOgorCQl7CisJCQlJbnN0YW5jZU9mRGF0YSAqIGFuSW5zdGFuY2UgPSBhcmcudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCk7CisKKwkJCWlmKCBhbkluc3RhbmNlLT5pc1R5cGVkTWFjaGluZSgpCisJCQkJJiYgYW5JbnN0YW5jZS0+Z2V0TW9kaWZpZXIoKS5oYXNNb2RpZmllclB1YmxpY0ZpbmFsU3RhdGljKCkgKQorCQkJeworCQkJCUV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlID0gYUNUWC0+bUNvbXBpbGVDdHgtPmdldEV4ZWN1dGFibGUoKTsKKworCQkJCWlmKCBFeGVjdXRhYmxlTGliOjpNQUNISU5FX0NPTVBPTkVOVF9TRUxGID09IGFuSW5zdGFuY2UgKQorCQkJCXsKKwkJCQkJd2hpbGUoIGFuRXhlY3V0YWJsZSAhPSBOVUxMICkKKwkJCQkJeworCQkJCQkJaWYoIGFuRXhlY3V0YWJsZS0+aXNNYWluQ29tcG9uZW50KCkgKQorCQkJCQkJeworCQkJCQkJCXJldHVybiggYW5FeGVjdXRhYmxlICk7CisJCQkJCQl9CisJCQkJCQlhbkV4ZWN1dGFibGUgPSBhbkV4ZWN1dGFibGUtPmdldEV4ZWN1dGFibGVDb250YWluZXIoKTsKKwkJCQkJfQorCQkJCQlyZXR1cm4oIGFuRXhlY3V0YWJsZSApOworCQkJCX0KKwkJCQllbHNlIGlmKCBFeGVjdXRhYmxlTGliOjpNQUNISU5FX0NPTVBPTkVOVF9QQVJFTlQgPT0gYW5JbnN0YW5jZSApCisJCQkJeworCQkJCQlmb3IoIGJvb2wgaXNQYXJlbnQgPSBmYWxzZSA7IGFuRXhlY3V0YWJsZSAhPSBOVUxMIDsgICkKKwkJCQkJeworCQkJCQkJaWYoIGFuRXhlY3V0YWJsZS0+aXNNYWluQ29tcG9uZW50KCkgKQorCQkJCQkJeworCQkJCQkJCWlmKCBpc1BhcmVudCApCisJCQkJCQkJeworCQkJCQkJCQlyZXR1cm4oIGFuRXhlY3V0YWJsZSApOworCQkJCQkJCX0KKwkJCQkJCQlpc1BhcmVudCA9IHRydWU7CisJCQkJCQl9CisJCQkJCQlhbkV4ZWN1dGFibGUgPSBhbkV4ZWN1dGFibGUtPmdldEV4ZWN1dGFibGVDb250YWluZXIoKTsKKwkJCQkJfQorCQkJCQlyZXR1cm4oIGFuRXhlY3V0YWJsZSApOworCQkJCX0KKwkJCQllbHNlIGlmKCBFeGVjdXRhYmxlTGliOjpNQUNISU5FX0NPTVBPTkVOVF9DT01NVU5JQ0FUT1IKKwkJCQkJCT09IGFuSW5zdGFuY2UgKQorCQkJCXsKKwkJCQkJd2hpbGUoIGFuRXhlY3V0YWJsZSAhPSBOVUxMICkKKwkJCQkJeworCQkJCQkJaWYoIGFuRXhlY3V0YWJsZS0+aXNNYWluQ29tcG9uZW50KCkKKwkJCQkJCQkmJiBhbkV4ZWN1dGFibGUtPmhhc1BvcnQoKSApCisJCQkJCQl7CisJCQkJCQkJcmV0dXJuKCBhbkV4ZWN1dGFibGUgKTsKKwkJCQkJCX0KKwkJCQkJCWFuRXhlY3V0YWJsZSA9IGFuRXhlY3V0YWJsZS0+Z2V0RXhlY3V0YWJsZUNvbnRhaW5lcigpOworCQkJCQl9CisJCQkJCXJldHVybiggYW5FeGVjdXRhYmxlICk7CisJCQkJfQorCisJCQkJZWxzZSBpZiggRXhlY3V0YWJsZUxpYjo6TUFDSElORV9TWVNURU0gPT0gYW5JbnN0YW5jZSApCisJCQkJeworCQkJCQl3aGlsZSggYW5FeGVjdXRhYmxlLT5oYXNDb250YWluZXIoKSAgKQorCQkJCQl7CisJCQkJCQlhbkV4ZWN1dGFibGUgPSBhbkV4ZWN1dGFibGUtPmdldEV4ZWN1dGFibGVDb250YWluZXIoKTsKKwkJCQkJfQorCQkJCQlyZXR1cm4oIGFuRXhlY3V0YWJsZSApOworCQkJCX0KKworCQkJCWlmKCBFeGVjdXRhYmxlTGliOjpNQUNISU5FX1NFTEYgPT0gYW5JbnN0YW5jZSApCisJCQkJeworCQkJCQlyZXR1cm4oIGFuRXhlY3V0YWJsZSApOworCQkJCX0KKwkJCQllbHNlIGlmKCBFeGVjdXRhYmxlTGliOjpNQUNISU5FX1BBUkVOVCA9PSBhbkluc3RhbmNlICkKKwkJCQl7CisJCQkJCXJldHVybiggYW5FeGVjdXRhYmxlLT5nZXRFeGVjdXRhYmxlQ29udGFpbmVyKCkgKTsKKwkJCQl9CisJCQkJZWxzZSBpZiggRXhlY3V0YWJsZUxpYjo6TUFDSElORV9DT01NVU5JQ0FUT1IgPT0gYW5JbnN0YW5jZSApCisJCQkJeworCQkJCQl3aGlsZSggYW5FeGVjdXRhYmxlICE9IE5VTEwgKQorCQkJCQl7CisJCQkJCQlpZiggYW5FeGVjdXRhYmxlLT5oYXNQb3J0KCkgKQorCQkJCQkJeworCQkJCQkJCXJldHVybiggYW5FeGVjdXRhYmxlICk7CisJCQkJCQl9CisJCQkJCQlhbkV4ZWN1dGFibGUgPSBhbkV4ZWN1dGFibGUtPmdldEV4ZWN1dGFibGVDb250YWluZXIoKTsKKwkJCQkJfQorCQkJCQlyZXR1cm4oIGFuRXhlY3V0YWJsZSApOworCQkJCX0KKwkJCX0KKworCQkJcmV0dXJuKCBOVUxMICk7CisJCX0KKworCQljYXNlIEZPUk1fVUZJX0tJTkQ6CisJCWNhc2UgRk9STV9BVk1DT0RFX0tJTkQ6CisJCWRlZmF1bHQ6CisJCXsKKwkJCXJldHVybiggTlVMTCApOworCQl9CisJfQorCisJcmV0dXJuKCBOVUxMICk7Cit9CisKKworCit2b2lkIEFic3RyYWN0QXZtY29kZUNvbXBpbGVyOjpjaGVja0FyZ1R5cGUoQ09NUElMRV9DT05URVhUICogYUNUWCwKKwkJQmFzZVR5cGVTcGVjaWZpZXIgKiBhVHlwZSwgY29uc3QgQkYgJiBhcmcpCit7CisJaWYoIChhVHlwZSA9PSBOVUxMKSB8fCBhVHlwZS0+aXNUeXBlZFVuaXZlcnNhbCgpICkKKwl7CisJCXJldHVybjsKKwl9CisJZWxzZSBpZiggbm90IEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNUeXBlZChhVHlwZSwgYXJnKSApCisJeworCQlnZXRDb21waWxlclRhYmxlKCkuaW5jckVycm9yQ291bnQoKTsKKwkJYUNUWC0+ZXJyb3JDb250ZXh0KCBBVk1fT1NfV0FSTiApCisJCQkJPDwgImNoZWNrQXJnVHlwZSA6PiBVbmV4cGVjdGVkIDw8ICI7CisKK0FWTV9JRl9ERUJVR19GTEFHKCBDT01QSUxJTkcgKQorCUFWTV9PU19XQVJOIDw8IHN0ZDo6ZW5kbCA8PCBhcmc7CitBVk1fRUxTRQorCUFWTV9PU19XQVJOIDw8IHN0cl9oZWFkZXIoIGFyZyApOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIENPTVBJTElORyApCisKKwkJQVZNX09TX1dBUk4gPDwgIiA+PiBhcyA8PCAiIDw8IGFUeXBlLT5zdHJUKCkKKwkJCQk8PCAiID4+IGFyZ3VtZW50ICEhISIgPDwgc3RkOjplbmRsOworCisJCWlmKCBhVHlwZS0+aXNUeXBlZEFsaWFzKCkgKQorCQl7CisJCQlBVk1fT1NfV0FSTiA8PCAiSW5mbzogPDwgIiA8PCBhVHlwZS0+c3RyVCgpCisJCQkJCTw8ICIgPj4gaXMgYW4gYWxpYXMgb3IgYSB0eXBlZGVmIG9mIDo+ICIKKwkJCQkJPDwgYVR5cGUtPnJlZmVyZWRUeXBlU3BlY2lmaWVyKCktPnN0clQoKSA8PCBzdGQ6OmVuZGw7CisJCX0KKwl9Cit9CisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0Fic3RyYWN0QXZtY29kZUNvbXBpbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgwZTljZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0Fic3RyYWN0QXZtY29kZUNvbXBpbGVyLmgKQEAgLTAsMCArMSw0NzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiA3IGF2ci4gMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEFCU1RSQUNUQVZNQ09ERUNPTVBJTEVSX0hfCisjZGVmaW5lIEFCU1RSQUNUQVZNQ09ERUNPTVBJTEVSX0hfCisKKyNpbmNsdWRlIDxjb21tb24vQXZtT2JqZWN0Lmg+CisKKyNpbmNsdWRlIDxidWlsZGVyL2NvbXBpbGVyL0Jhc2VDb21waWxlclRhYmxlLmg+CisKKyNpbmNsdWRlIDxidWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlQ29tcGlsZXIuaD4KKyNpbmNsdWRlIDxidWlsZGVyL3ByaW1pdGl2ZS9Db21waWxhdGlvbkVudmlyb25tZW50Lmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9Bdm1Db2RlLmg+CisKKyNpbmNsdWRlIDxmbWwvdHlwZS9CYXNlVHlwZVNwZWNpZmllci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworY2xhc3MgQXJyYXlCRjsKK2NsYXNzIEF2bUJ5dGVjb2RlOworCitjbGFzcyBCYXNlQXZtUHJvZ3JhbTsKK2NsYXNzIEVsZW1lbnQ7CisKK2NsYXNzIEV4ZWN1dGFibGVGb3JtOworCitjbGFzcyBTeW1ib2xUYWJsZTsKKworCitjbGFzcyBBYnN0cmFjdEF2bWNvZGVDb21waWxlciAgOiAgcHVibGljIEF2bU9iamVjdAoreworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXIoQXZtY29kZUNvbXBpbGVyICYgYUNvZGVDb21waWxlcikKKwk6IEF2bU9iamVjdCggKSwKKwlBVk1DT0RFX0NPTVBJTEVSKCBhQ29kZUNvbXBpbGVyICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5BYnN0cmFjdEF2bWNvZGVDb21waWxlcigpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qCisJICogR0VUVEVSCisJICogdGhlQ29tcGlsZXJUYWJsZQorCSAqLworCWlubGluZSBCYXNlQ29tcGlsZXJUYWJsZSAmIGdldENvbXBpbGVyVGFibGUoKQorCXsKKwkJcmV0dXJuKCBBVk1DT0RFX0NPTVBJTEVSLmdldENvbXBpbGVyVGFibGUoKSApOworCX0KKworCisJLyoKKwkgKiBHRVRURVIKKwkgKiB0aGVTeW1ib2xUYWJsZQorCSAqLworCWlubGluZSBTeW1ib2xUYWJsZSAmIGdldFN5bWJvbFRhYmxlKCkKKwl7CisJCXJldHVybiggQVZNQ09ERV9DT01QSUxFUi5nZXRTeW1ib2xUYWJsZSgpICk7CisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gU1BFQ0lGSUMgQVJHVU1FTlQgQ09NUElMQVRJT04KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlCRiBjb21waWxlQXJnTHZhbHVlKENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGICYgYXJnKTsKKworCUJGIGNvbXBpbGVBcmdSdmFsdWUoQ09NUElMRV9DT05URVhUICogYUNUWCwKKwkJCWNvbnN0IFR5cGVTcGVjaWZpZXIgJiBhVHlwZSwgY29uc3QgQkYgJiBhcmcpCisJeworCQlyZXR1cm4oIGNvbXBpbGVBcmdSdmFsdWUoYUNUWC0+Y2xvbmUoYVR5cGUpLCBhcmcsCisJCQkJKGFUeXBlICE9IFR5cGVNYW5hZ2VyOjpVTklWRVJTQUwpKSApOworCX0KKworCUJGIGNvbXBpbGVBcmdSdmFsdWUoQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkYgJiBhcmcsCisJCQlib29sIG5lZWRUeXBlQ2hlY2tpbmcgPSBmYWxzZSk7CisKKwlpbmxpbmUgQkYgY29tcGlsZUFyZ1N0YXRlbWVudChDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRiAmIGFyZykKKwl7CisJCXJldHVybiggQVZNQ09ERV9DT01QSUxFUi5kZWNvZGVfY29tcGlsZVN0YXRlbWVudChhQ1RYLCBhcmcpICk7CisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gRVhQUkVTU0lPTiBDT01QSUxBVElPTiBTVEVQCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJQkZDb2RlIGNvbXBpbGVFeHByZXNzaW9uQ29kZShDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLAorCQkJY29uc3QgQkZDb2RlICYgYUNvZGUpOworCisJaW5saW5lIHZpcnR1YWwgQkYgY29tcGlsZUV4cHJlc3Npb24oQ09NUElMRV9DT05URVhUICogYUNUWCwKKwkJCWNvbnN0IEJGQ29kZSAmIGFDb2RlKQorCXsKKwkJcmV0dXJuKCBjb21waWxlRXhwcmVzc2lvbkNvZGUoYUNUWCwgYUNvZGUpICk7CisJfQorCisKKwlCRkNvZGUgb3B0aW1pemVFeHByZXNzaW9uQ29kZShDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSwKKwkJCWF2bV9hcmdfb3BlcmFuZF90IGFuT3BlcmFuZCA9IEFWTV9BUkdfRVhQUkVTU0lPTl9LSU5EKTsKKworCWlubGluZSB2aXJ0dWFsIEJGIG9wdGltaXplRXhwcmVzc2lvbihDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLAorCQkJY29uc3QgQkZDb2RlICYgYUNvZGUpCisJeworCQlyZXR1cm4oIG9wdGltaXplRXhwcmVzc2lvbkNvZGUoYUNUWCwgYUNvZGUpICk7CisJfQorCisKKwlpbmxpbmUgdm9pZCBvcHRpbWl6ZUFyZ0V4cHJlc3Npb24oQ09NUElMRV9DT05URVhUICogYUNUWCwKKwkJCWNvbnN0IEJGQ29kZSAmIGFDb2RlLCBhdm1fb2Zmc2V0X3Qgb2Zmc2V0KQorCXsKKwkJaWYoIGFDb2RlLT5hdChvZmZzZXQpLmlzPCBBdm1Db2RlID4oKSApCisJCXsKKwkJCWFDb2RlLT5zYWZlX3NldCggb2Zmc2V0LAorCQkJCQlBVk1DT0RFX0NPTVBJTEVSLm9wdGltaXplRXhwcmVzc2lvbigKKwkJCQkJCQlhQ1RYLCBhQ29kZS0+YXQob2Zmc2V0KS5iZkNvZGUoKSkgKTsKKwkJfQorCX0KKworCWlubGluZSB2b2lkIG9wdGltaXplQXJnU3RhdGVtZW50KENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsCisJCQljb25zdCBCRkNvZGUgJiBhQ29kZSwgYXZtX29mZnNldF90IG9mZnNldCkKKwl7CisJCWlmKCBhQ29kZS0+YXQob2Zmc2V0KS5pczwgQXZtQ29kZSA+KCkgKQorCQl7CisJCQlhQ29kZS0+c2FmZV9zZXQoIG9mZnNldCwKKwkJCQkJQVZNQ09ERV9DT01QSUxFUi5vcHRpbWl6ZVN0YXRlbWVudCgKKwkJCQkJCQlhQ1RYLCBhQ29kZS0+YXQob2Zmc2V0KS5iZkNvZGUoKSkgKTsKKwkJfQorCX0KKworCisJaW5saW5lIHZvaWQgb3B0aW1pemVBcmdFeHByZXNzaW9uKENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsCisJCQlCRkNvZGVMaXN0ICYgbGlzdE9mQ29kZXMpCisJeworCQlCRkNvZGVMaXN0OjppdGVyYXRvciBpdENvZGUgPSBsaXN0T2ZDb2Rlcy5iZWdpbigpOworCQlCRkNvZGVMaXN0OjppdGVyYXRvciBlbmRDb2RlID0gbGlzdE9mQ29kZXMuZW5kKCk7CisJCWZvciggOyBpdENvZGUgIT0gZW5kQ29kZSA7ICsraXRDb2RlICkKKwkJeworCQkJKCppdENvZGUpID0gQVZNQ09ERV9DT01QSUxFUi5vcHRpbWl6ZUV4cHJlc3Npb24oYUNUWCwgKCppdENvZGUpKTsKKwkJfQorCX0KKworCWlubGluZSB2b2lkIG9wdGltaXplQXJnU3RhdGVtZW50KENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsCisJCQlCRkNvZGVMaXN0ICYgbGlzdE9mQ29kZXMpCisJeworCQlCRkNvZGVMaXN0OjppdGVyYXRvciBpdENvZGUgPSBsaXN0T2ZDb2Rlcy5iZWdpbigpOworCQlCRkNvZGVMaXN0OjppdGVyYXRvciBlbmRDb2RlID0gbGlzdE9mQ29kZXMuZW5kKCk7CisJCWZvciggOyBpdENvZGUgIT0gZW5kQ29kZSA7ICsraXRDb2RlICkKKwkJeworCQkJKCppdENvZGUpID0gQVZNQ09ERV9DT01QSUxFUi5vcHRpbWl6ZVN0YXRlbWVudChhQ1RYLCAoKml0Q29kZSkpOworCQl9CisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gU1RBVEVNRU5UIENPTVBJTEFUSU9OIFNURVAKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwl2aXJ0dWFsIEJGQ29kZSBjb21waWxlU3RhdGVtZW50Q29kZShDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLAorCQkJY29uc3QgQkZDb2RlICYgYUNvZGUpOworCisJaW5saW5lIHZpcnR1YWwgQkZDb2RlIG9wdGltaXplU3RhdGVtZW50Q29kZShDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLAorCQkJY29uc3QgQkZDb2RlICYgYUNvZGUpCisJeworCQlyZXR1cm4oIG9wdGltaXplRXhwcmVzc2lvbkNvZGUoYUNUWCwgYUNvZGUsIEFWTV9BUkdfU1RBVEVNRU5UX0tJTkQpICk7CisJfQorCisKKworCWlubGluZSB2aXJ0dWFsIEJGQ29kZSBjb21waWxlU3RhdGVtZW50KENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsCisJCQljb25zdCBCRkNvZGUgJiBhQ29kZSkKKwl7CisJCXJldHVybiggY29tcGlsZVN0YXRlbWVudENvZGUoYUNUWCwgYUNvZGUpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgQkZDb2RlIG9wdGltaXplU3RhdGVtZW50KENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsCisJCQljb25zdCBCRkNvZGUgJiBhQ29kZSkKKwl7CisJCXJldHVybiggYUNvZGUgKTsKKy8vCQlyZXR1cm4oIG9wdGltaXplU3RhdGVtZW50Q29kZShhQ1RYLCBhQ29kZSkgKTsKKwl9CisKKworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQVZNQ09ERSBDT01QSUxBVElPTiBTVEVQCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJdmlydHVhbCBCRkNvZGUgY29tcGlsZUF2bWNvZGUoQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQVZNIE9QQ09ERSBDT01QSUxBVElPTgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXN0YXRpYyBib29sIG11c3RCZUV2YWx1YXRlZEFyZ3VtZW50KGNvbnN0IEJGICYgYXJnKTsKKworCXN0YXRpYyBib29sIG11c3RCZUV2YWx1YXRlZEFyZ3VtZW50QXJyYXkoQXJyYXlCRiAqIGFycmF5QXJnKTsKKworCisJYXZtX2FyZ19vcGVyYW5kX3Qgb3BlcmFuZE9mKGNvbnN0IEJGICYgYXJnKTsKKworCWF2bV9hcmdfcHJvY2Vzc29yX3QgcHJvY2Vzc29yT2YoQmFzZVR5cGVTcGVjaWZpZXIgKiBhVHlwZSk7CisKKwlhdm1fYXJnX29wZXJhbmRfdCBvcGVyYW5kT2YoQmFzZVR5cGVTcGVjaWZpZXIgKiBhVHlwZSk7CisKKworCXZvaWQgc2V0QXJnY29kZUxWYWx1ZShDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBBdm1CeXRlY29kZSAmIGFyZ0NvZGUsCisJCQljb25zdCBCRiAmIGFyZywgYm9vbCBuZWVkVHlwZUNoZWNraW5nID0gdHJ1ZSk7CisKKwl2b2lkIHNldEFyZ2NvZGVMVmFsdWVSZWYoQ09NUElMRV9DT05URVhUICogYUNUWCwgQXZtQnl0ZWNvZGUgJiBhcmdDb2RlLAorCQkJY29uc3QgQkYgJiBhcmcsIGJvb2wgbmVlZFR5cGVDaGVja2luZyA9IHRydWUpOworCisJdm9pZCBzZXRBcmdjb2RlTFZhbHVlTWFjcm8oQ09NUElMRV9DT05URVhUICogYUNUWCwgQXZtQnl0ZWNvZGUgJiBhcmdDb2RlLAorCQkJY29uc3QgQkYgJiBhcmcsIGJvb2wgbmVlZFR5cGVDaGVja2luZyA9IHRydWUpOworCisKKwl2b2lkIHNldEFyZ2NvZGVSVmFsdWUoQ09NUElMRV9DT05URVhUICogYUNUWCwgQXZtQnl0ZWNvZGUgJiBhcmdDb2RlLAorCQkJQkYgJiBhcmcsIGJvb2wgbmVlZFR5cGVDaGVja2luZyA9IHRydWUpOworCisJQXZtQnl0ZWNvZGUgYXJnY29kZU9mRXhwcmVzc2lvbihDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBBdm1Db2RlICogYUNvZGUpOworCisKKwl2b2lkIHNldEFyZ2NvZGVSVmFsdWVBcnJheShDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBBdm1CeXRlY29kZSAmIGFyZ0NvZGUsCisJCQlCRiAmIGFyZywgYm9vbCBuZWVkVHlwZUNoZWNraW5nID0gdHJ1ZSk7CisKKwl2b2lkIHNldEFyZ2NvZGVSVmFsdWVBcnJheShDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBBdm1CeXRlY29kZSAmIGFyZ0NvZGUsCisJCQlBcnJheUJGICogYXJnLCBib29sIG5lZWRUeXBlQ2hlY2tpbmcgPSB0cnVlKTsKKworCWlubGluZSB2b2lkIHNldEFyZ2NvZGVQYXJhbVZhbHVlKENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsCisJCQlBdm1CeXRlY29kZSAmIGFyZ0NvZGUsIEJGICYgYXJnLAorCQkJYm9vbCBuZWVkVHlwZUNoZWNraW5nID0gdHJ1ZSkKKwl7CisJCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJnQ29kZSwgYXJnLCBuZWVkVHlwZUNoZWNraW5nKTsKKwkJYXJnQ29kZS5jb250ZXh0ID0gQVZNX0FSR19QQVJBTUVURVJfQ1RYOworCX0KKworCisJdm9pZCBzZXRBcmdjb2RlQ29udGFpbmVyV1ZhbHVlKENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsCisJCQlBdm1CeXRlY29kZSAmIGFyZ0NvZGUsIGNvbnN0IEJGICYgYXJnKTsKKworCXZvaWQgc2V0QXJnY29kZUNvbnRhaW5lclJWYWx1ZShDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLAorCQkJQXZtQnl0ZWNvZGUgJiBhcmdDb2RlLCBjb25zdCBCRiAmIGFyZyk7CisKKwl2b2lkIHNldEFyZ2NvZGVTdGF0ZW1lbnQoQ09NUElMRV9DT05URVhUICogYUNUWCwgQXZtQnl0ZWNvZGUgJiBhcmdDb2RlLAorCQkJY29uc3QgQkYgJiBhcmcsIGJvb2wgbmVlZFR5cGVDaGVja2luZyA9IHRydWUpOworCisJRXhlY3V0YWJsZUZvcm0gKiBnZXRFeGVjdXRhYmxlTWFjaGluZShDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRiAmIGFyZyk7CisKKwl2b2lkIGNoZWNrQXJnVHlwZShDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLAorCQkJQmFzZVR5cGVTcGVjaWZpZXIgKiBhVHlwZSwgY29uc3QgQkYgJiBhcmcpOworCisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBBVFRSSUJVVEVTCisJICovCisJQXZtY29kZUNvbXBpbGVyICYgQVZNQ09ERV9DT01QSUxFUjsKKworCit9OworCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBNYWNybyBmb3Igc21hcnQgYXZtY29kZSBjb21waWxlciBkZWNsYXJhdGlvbi4KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjZGVmaW5lIEFWTUNPREVfQkFTRUNPTVBJTEVSX0NMQVNTX0hFQURFUihjbGFzc25hbWUsIHN1cGVybmFtZSkgICAgICAgICAgICAgICAgXAorY2xhc3MgY2xhc3NuYW1lIDogIHB1YmxpYyBzdXBlcm5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWNsYXNzbmFtZShBdm1jb2RlQ29tcGlsZXIgJiBhQ29tcGlsZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwk6IHN1cGVybmFtZSggYUNvbXBpbGVyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJeyAvKiEhIE5PVEhJTkcgISEqLyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXZpcnR1YWwgfmNsYXNzbmFtZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7IC8qISEgTk9USElORyAhISovIH0KKworCisKKy8qKgorICogTWFjcm8gZm9yIHNtYXJ0IGF2bWNvZGUgY29tcGlsZXIgZGVjbGFyYXRpb24uCisgKi8KKworI2RlZmluZSBBVk1DT0RFX0NPTVBJTEVSX0NMQVNTX0hFQURFUihjbGFzc25hbWUsIHN1cGVybmFtZSkgICAgICAgICAgICAgICAgICAgIFwKK0FWTUNPREVfQkFTRUNPTVBJTEVSX0NMQVNTX0hFQURFUihBdm1jb2RlIyNjbGFzc25hbWUjI0NvbXBpbGVyLCBzdXBlcm5hbWUpICAgICBcCisJdmlydHVhbCBCRiBjb21waWxlRXhwcmVzc2lvbihDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSk7XAorCXZpcnR1YWwgQkZDb2RlIGNvbXBpbGVTdGF0ZW1lbnQoQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpOworCisjZGVmaW5lIEFWTUNPREVfQ09NUElMRVJfQ0xBU1MoY2xhc3NuYW1lLCBzdXBlcm5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlBVk1DT0RFX0NPTVBJTEVSX0NMQVNTX0hFQURFUihjbGFzc25hbWUsIHN1cGVybmFtZSkgICAgICAgICAgICAgICAgICAgIFwKK307CisKKworCisjZGVmaW5lIEFWTUNPREVfQ09NUElMRVJfRVhQUkVTU0lPTl9DTEFTU19IRUFERVIobmFtZSwgY2xhc3NuYW1lLCBzdXBlcm5hbWUpICAgXAorQVZNQ09ERV9CQVNFQ09NUElMRVJfQ0xBU1NfSEVBREVSKEF2bWNvZGUjI2NsYXNzbmFtZSMjQ29tcGlsZXIsIHN1cGVybmFtZSkgICAgIFwKKwl2aXJ0dWFsIEJGIGNvbXBpbGVFeHByZXNzaW9uKENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKTtcCisJQkZDb2RlIGNvbXBpbGVTdGF0ZW1lbnQoQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpICAgICAgXAorCXsgXAorCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVCA8PCAiVW5leHBlY3RlZCA8PCAiIDw8IG5hbWUgICAgICAgXAorCQkJCTw8ICIgPj4gRVhQUkVTU0lPTiBhcyBzdGF0ZW1lbnQgY29tcGlsYXRpb24gISEhIiAgXAorCQkJCTw8IFNFTkRfRVhJVDsgIFwKKwkJcmV0dXJuKCBhQ29kZSApOyBcCisJfQorCisjZGVmaW5lIEFWTUNPREVfQ09NUElMRVJfRVhQUkVTU0lPTl9DTEFTUyhuYW1lLCBjbGFzc25hbWUsIHN1cGVybmFtZSkgICAgICAgICAgXAorCQlBVk1DT0RFX0NPTVBJTEVSX0VYUFJFU1NJT05fQ0xBU1NfSEVBREVSKG5hbWUsIGNsYXNzbmFtZSwgc3VwZXJuYW1lKSAgIFwKK307CisKKworI2RlZmluZSBBVk1DT0RFX0NPTVBJTEVSX1NUQVRFTUVOVF9DTEFTU19IRUFERVIobmFtZSwgY2xhc3NuYW1lLCBzdXBlcm5hbWUpICAgIFwKK0FWTUNPREVfQkFTRUNPTVBJTEVSX0NMQVNTX0hFQURFUihBdm1jb2RlIyNjbGFzc25hbWUjI0NvbXBpbGVyLCBzdXBlcm5hbWUpICAgICBcCisJQkYgY29tcGlsZUV4cHJlc3Npb24oQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpICAgICAgICAgXAorCXsgXAorCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVCA8PCAiVW5leHBlY3RlZCA8PCAiIDw8IG5hbWUgICAgXAorCQkJCTw8ICIgU1RBVEVNRU5UIGFzIGV4cHJlc3Npb24gY29tcGlsYXRpb24gISEhIiAgXAorCQkJCTw8IFNFTkRfRVhJVDsgXAorCQlyZXR1cm4oIGFDb2RlICk7IFwKKwl9IFwKKwl2aXJ0dWFsIEJGQ29kZSBjb21waWxlU3RhdGVtZW50KENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKTsKKworI2RlZmluZSBBVk1DT0RFX0NPTVBJTEVSX1NUQVRFTUVOVF9DTEFTUyhuYW1lLCBjbGFzc25hbWUsIHN1cGVybmFtZSkgICAgICAgICAgIFwKKwkJQVZNQ09ERV9DT01QSUxFUl9TVEFURU1FTlRfQ0xBU1NfSEVBREVSKG5hbWUsIGNsYXNzbmFtZSwgc3VwZXJuYW1lKSAgICBcCit9OworCisKKworI2RlZmluZSBBVk1DT0RFX0NPTVBJTEVSX09QVElNSVpFUl9DTEFTU19IRUFERVIoY2xhc3NuYW1lLCBzdXBlcm5hbWUpICAgICAgICAgIFwKK0FWTUNPREVfQkFTRUNPTVBJTEVSX0NMQVNTX0hFQURFUihBdm1jb2RlIyNjbGFzc25hbWUjI0NvbXBpbGVyLCBzdXBlcm5hbWUpICAgICBcCisJdmlydHVhbCBCRiBjb21waWxlRXhwcmVzc2lvbihDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSk7XAorCXZpcnR1YWwgQkYgb3B0aW1pemVFeHByZXNzaW9uKENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKTsgXAorCXZpcnR1YWwgQkZDb2RlIGNvbXBpbGVTdGF0ZW1lbnQoQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpOyBcCisJdmlydHVhbCBCRkNvZGUgb3B0aW1pemVTdGF0ZW1lbnQoQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpOworCisKKyNkZWZpbmUgQVZNQ09ERV9DT01QSUxFUl9PUFRJTUlaRVJfQ0xBU1MoY2xhc3NuYW1lLCBzdXBlcm5hbWUpICAgICAgICAgICAgICAgICBcCisJQVZNQ09ERV9DT01QSUxFUl9PUFRJTUlaRVJfQ0xBU1NfSEVBREVSKGNsYXNzbmFtZSwgc3VwZXJuYW1lKSAgICAgICAgICAgICAgXAorfTsKKworCisKKyNkZWZpbmUgQVZNQ09ERV9DT01QSUxFUl9FWFBSRVNTSU9OX09QVElNSVpFUl9DTEFTU19IRUFERVIobmFtZSwgY2xhc3NuYW1lLCBzdXBlcm5hbWUpIFwKK0FWTUNPREVfQkFTRUNPTVBJTEVSX0NMQVNTX0hFQURFUihBdm1jb2RlIyNjbGFzc25hbWUjI0NvbXBpbGVyLCBzdXBlcm5hbWUpICAgICBcCisJdmlydHVhbCBCRiBjb21waWxlRXhwcmVzc2lvbihDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSk7XAorCXZpcnR1YWwgQkYgb3B0aW1pemVFeHByZXNzaW9uKENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKTsgXAorCUJGQ29kZSBjb21waWxlU3RhdGVtZW50KENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKSAgICAgIFwKKwl7IFwKKwkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQgPDwgIlVuZXhwZWN0ZWQgPDwgIiA8PCBuYW1lICAgICAgIFwKKwkJCQk8PCAiID4+IEVYUFJFU1NJT04gYXMgc3RhdGVtZW50IGNvbXBpbGF0aW9uICEhISIgIFwKKwkJCQk8PCBTRU5EX0VYSVQ7IFwKKwkJcmV0dXJuKCBhQ29kZSApOyBcCisJfSBcCisJQkZDb2RlIG9wdGltaXplU3RhdGVtZW50KENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKSAgICAgXAorCXsgXAorCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVCA8PCAiVW5leHBlY3RlZCA8PCAiIDw8IG5hbWUgICAgICAgIFwKKwkJCQk8PCAiID4+IEVYUFJFU1NJT04gYXMgc3RhdGVtZW50IG9wdGltaXphdGlvbiAhISEiICBcCisJCQkJPDwgU0VORF9FWElUOyBcCisJCXJldHVybiggYUNvZGUgKTsgXAorCX0KKworI2RlZmluZSBBVk1DT0RFX0NPTVBJTEVSX0VYUFJFU1NJT05fT1BUSU1JWkVSX0NMQVNTKG5hbWUsIGNsYXNzbmFtZSwgc3VwZXJuYW1lKSBcCisJCUFWTUNPREVfQ09NUElMRVJfRVhQUkVTU0lPTl9PUFRJTUlaRVJfQ0xBU1NfSEVBREVSKG5hbWUsIGNsYXNzbmFtZSwgc3VwZXJuYW1lKSBcCit9OworCisKKyNkZWZpbmUgQVZNQ09ERV9DT01QSUxFUl9TVEFURU1FTlRfT1BUSU1JWkVSX0NMQVNTX0hFQURFUihuYW1lLCBjbGFzc25hbWUsIHN1cGVybmFtZSkgXAorQVZNQ09ERV9CQVNFQ09NUElMRVJfQ0xBU1NfSEVBREVSKEF2bWNvZGUjI2NsYXNzbmFtZSMjQ29tcGlsZXIsIHN1cGVybmFtZSkgICAgIFwKKwlCRiBjb21waWxlRXhwcmVzc2lvbihDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkgICAgICAgICBcCisJeyBcCisJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUIDw8ICJVbmV4cGVjdGVkIDw8ICIgPDwgbmFtZSAgICAgICBcCisJCQkJPDwgIiA+PiBTVEFURU1FTlQgYXMgZXhwcmVzc2lvbiBjb21waWxhdGlvbiAhISEiICBcCisJCQkJPDwgU0VORF9FWElUOyBcCisJCXJldHVybiggYUNvZGUgKTsgXAorCX0gXAorCUJGIG9wdGltaXplRXhwcmVzc2lvbihDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkgICAgICAgIFwKKwl7IFwKKwkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQgPDwgIlVuZXhwZWN0ZWQgPDwgIiA8PCBuYW1lICAgICAgICBcCisJCQkJPDwgIiA+PiBTVEFURU1FTlQgYXMgZXhwcmVzc2lvbiBvcHRpbWl6YXRpb24gISEhIiAgXAorCQkJCTw8IFNFTkRfRVhJVDsgXAorCQlyZXR1cm4oIGFDb2RlICk7IFwKKwl9IFwKKwl2aXJ0dWFsIEJGQ29kZSBjb21waWxlU3RhdGVtZW50KENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKTsgXAorCXZpcnR1YWwgQkZDb2RlIG9wdGltaXplU3RhdGVtZW50KENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKTsKKworI2RlZmluZSBBVk1DT0RFX0NPTVBJTEVSX1NUQVRFTUVOVF9PUFRJTUlaRVJfQ0xBU1MobmFtZSwgY2xhc3NuYW1lLCBzdXBlcm5hbWUpIFwKKwkJQVZNQ09ERV9DT01QSUxFUl9TVEFURU1FTlRfT1BUSU1JWkVSX0NMQVNTX0hFQURFUihuYW1lLCBjbGFzc25hbWUsIHN1cGVybmFtZSkgXAorfTsKKworCisKKworI2RlZmluZSBBVk1DT0RFX0NPTVBJTEVSX05PX09QVElNSVpFUl9DTEFTU19IRUFERVIobmFtZSwgY2xhc3NuYW1lLCBzdXBlcm5hbWUpIFwKK0FWTUNPREVfQkFTRUNPTVBJTEVSX0NMQVNTX0hFQURFUihBdm1jb2RlIyNjbGFzc25hbWUjI0NvbXBpbGVyLCBzdXBlcm5hbWUpICAgICBcCisJQkYgY29tcGlsZUV4cHJlc3Npb24oQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpOyAgICAgICAgXAorCUJGIG9wdGltaXplRXhwcmVzc2lvbihDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkgICAgICAgIFwKKwl7IFwKKwkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQgPDwgIlVuZXhwZWN0ZWQgaW52b2tlIG9mICIgPDwgbmFtZSAgXAorCQkJCTw8ICIgPj4gU1RBVEVNRU5UIGFzIGV4cHJlc3Npb24gb3B0aW1pemF0aW9uICEhISIgICBcCisJCQkJPDwgU0VORF9FWElUOyBcCisJCXJldHVybiggYUNvZGUgKTsgXAorCX0gXAorCXZpcnR1YWwgQkZDb2RlIGNvbXBpbGVTdGF0ZW1lbnQoQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpOyBcCisJdmlydHVhbCBCRkNvZGUgb3B0aW1pemVTdGF0ZW1lbnQoQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpIFwKKwl7IFwKKwkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQgPDwgIlVuZXhwZWN0ZWQgaW52b2tlIG9mICIgPDwgbmFtZSAgXAorCQkJCTw8ICIgPj4gRVhQUkVTU0lPTiBhcyBzdGF0ZW1lbnQgb3B0aW1pemF0aW9uICEhISIgICBcCisJCQkJPDwgU0VORF9FWElUOyBcCisJCXJldHVybiggYUNvZGUgKTsgXAorCX0gXAorCisjZGVmaW5lIEFWTUNPREVfQ09NUElMRVJfTk9fT1BUSU1JWkVSX0NMQVNTKG5hbWUsIGNsYXNzbmFtZSwgc3VwZXJuYW1lKSAgICAgICAgXAorCQlBVk1DT0RFX0NPTVBJTEVSX05PX09QVElNSVpFUl9DTEFTU19IRUFERVIobmFtZSwgY2xhc3NuYW1lLCBzdXBlcm5hbWUpIFwKK307CisKKworCisKKworLyoqCisgKiBNYWNybyBmb3Igc21hcnQgYXZtY29kZSBjb21waWxlciBkZWNsYXJhdGlvbi4KKyAqCisjZGVmaW5lIEFWTUNPREVfQ09NUElMRVJfRVhQUkVTU0lPTl9DTEFTU19IRUFERVIoY2xhc3NuYW1lLCBzdXBlcm5hbWUpICAgICAgICAgXAorQVZNQ09ERV9CQVNFQ09NUElMRVJfQ0xBU1NfSEVBREVSKEF2bWNvZGUjI2NsYXNzbmFtZSMjQ29tcGlsZXIsIHN1cGVybmFtZSkgICAgIFwKKwl2aXJ0dWFsIEJGIGNvbXBpbGVFeHByZXNzaW9uKENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKTsKKworCisjZGVmaW5lIEFWTUNPREVfQ09NUElMRVJfRVhQUkVTU0lPTl9DTEFTUyhjbGFzc25hbWUsIHN1cGVybmFtZSkgICAgICAgICAgICAgICAgXAorQVZNQ09ERV9DT01QSUxFUl9FWFBSRVNTSU9OX0NMQVNTX0hFQURFUihjbGFzc25hbWUsIHN1cGVybmFtZSkgICAgICAgICAgICAgICAgIFwKK307CisqLworCisvKioKKyAqIE1hY3JvIGZvciBzbWFydCBhdm1jb2RlIGNvbXBpbGVyIGRlY2xhcmF0aW9uLgorICoKKyNkZWZpbmUgQVZNQ09ERV9DT01QSUxFUl9TVEFURU1FTlRfQ0xBU1NfSEVBREVSKGNsYXNzbmFtZSwgc3VwZXJuYW1lKSAgICAgICAgICBcCitBVk1DT0RFX0JBU0VDT01QSUxFUl9DTEFTU19IRUFERVIoQXZtY29kZSMjY2xhc3NuYW1lIyNDb21waWxlciwgc3VwZXJuYW1lKSAgICAgXAorCXZpcnR1YWwgQkZDb2RlIGNvbXBpbGVTdGF0ZW1lbnQoQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpOworCisKKyNkZWZpbmUgQVZNQ09ERV9DT01QSUxFUl9TVEFURU1FTlRfQ0xBU1MoY2xhc3NuYW1lLCBzdXBlcm5hbWUpICAgICAgICAgICAgICAgICBcCitBVk1DT0RFX0NPTVBJTEVSX1NUQVRFTUVOVF9DTEFTU19IRUFERVIoY2xhc3NuYW1lLCBzdXBlcm5hbWUpICAgICAgICAgICAgICAgICAgXAorfTsKKyovCisKKworfQorCisjZW5kaWYgLyogQUJTVFJBQ1RBVk1DT0RFQ09NUElMRVJfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVBY3Rpdml0eUNvbXBpbGVyLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVBY3Rpdml0eUNvbXBpbGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGQ5ZmEzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZUFjdGl2aXR5Q29tcGlsZXIuY3BwCkBAIC0wLDAgKzEsMTMxMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDEyIGF2ci4gMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQXZtY29kZUFjdGl2aXR5Q29tcGlsZXIuaCIKKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vVHlwZWRlZi5oPgorCisjaW5jbHVkZSA8YnVpbGRlci9wcmltaXRpdmUvQXZtY29kZVNlcXVlbmNlQ29tcGlsZXIuaD4KKyNpbmNsdWRlIDxidWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlVWZpQ2FzdEV4cHJlc3Npb25Db21waWxlci5oPgorCisjaW5jbHVkZSA8Zm1sL2NvbW1vbi9PYmplY3RFbGVtZW50Lmg+CisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlTGliLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9Bdm1Db2RlLmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkNvbnN0cnVjdG9yLmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvblR5cGVDaGVja2VyLmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vU3RhdGVtZW50Q29uc3RydWN0b3IuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9TdGF0ZW1lbnRUeXBlQ2hlY2tlci5oPgorCisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yTWFuYWdlci5oPgorCisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1VuaUZvcm1JZGVudGlmaWVyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIEFDVElWSVRZIFNUQVRFTUVOVCBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkZDb2RlIEF2bWNvZGVBY3Rpdml0eVN0YXRlbWVudENvbXBpbGVyOjpjb21waWxlU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlpZiggYUNvZGUtPmVtcHR5KCkgKQorCXsKKwkJYUNvZGUtPmFwcGVuZCggRXhlY3V0YWJsZUxpYjo6TUFDSElORV9TRUxGICk7CisJCXJldHVybiggYUNvZGUgKTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuKCBjb21waWxlU3RhdGVtZW50UGFyYW1zKGFDVFgsIGFDb2RlKSApOworCX0KK30KKworQkZDb2RlIEF2bWNvZGVBY3Rpdml0eVN0YXRlbWVudENvbXBpbGVyOjpvcHRpbWl6ZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJaWYoIGFDb2RlLT5oYXNJbnN0cnVjdGlvbigpICkKKwl7CisJCXJldHVybiggYUNvZGUgKTsKKwl9CisKKwlpZiggYUNvZGUtPmVtcHR5KCkgKQorCXsKKwkJYUNvZGUtPmFwcGVuZCggRXhlY3V0YWJsZUxpYjo6TUFDSElORV9TRUxGICk7CisJfQorCisJQXZtSW5zdHJ1Y3Rpb24gKiBhcmdzSW5zdHJ1Y3Rpb24gPSBhQ29kZS0+Z2VuSW5zdHJ1Y3Rpb24oKTsKKworCWFyZ3NJbnN0cnVjdGlvbi0+YXQoMCkuZHR5cGUgPSBUeXBlTWFuYWdlcjo6TUFDSElORTsKKwlzZXRBcmdjb2RlUlZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMCksIGFDb2RlLT5maXJzdCgpKTsKKworCWlmKCBhQ29kZS0+cG9wdWxhdGVkKCkgKQorCXsKKwkJQXZtQ29kZTo6aXRlcmF0b3IgaXRQYXJhbSA9IGFDb2RlLT5iZWdpbigpOworCQlBdm1Db2RlOjppdGVyYXRvciBpdEVuZFBhcmFtID0gYUNvZGUtPmVuZCgpOworCQlhdm1fb2Zmc2V0X3Qgb2Zmc2V0ID0gMTsKKwkJZm9yKCArK2l0UGFyYW0gOyBpdFBhcmFtICE9IGl0RW5kUGFyYW0gOyArK2l0UGFyYW0gLCArK29mZnNldCApCisJCXsKKwkJCW9wdGltaXplQXJnRXhwcmVzc2lvbihhQ1RYLCBhQ29kZSwgb2Zmc2V0KTsKKworCQkJc2V0QXJnY29kZVBhcmFtVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdChvZmZzZXQpLCAoKml0UGFyYW0pLCBmYWxzZSk7CisJCX0KKwl9CisKKwlhcmdzSW5zdHJ1Y3Rpb24tPmNvbXB1dGVNYWluQnl0ZWNvZGUoCisJCQkvKmNvbnRleHQgICovIEFWTV9BUkdfU1RBTkRBUkRfQ1RYLAorCQkJLypwcm9jZXNzb3IqLyBBVk1fQVJHX1NUQVRFTUVOVF9DUFUsCisJCQkvKm9wZXJhdGlvbiovIEFWTV9BUkdfU0VWQUxfUlZBTFVFLAorCQkJLypvcGVyYW5kICAqLyBBVk1fQVJHX1NUQVRFTUVOVF9LSU5ELAorCQkJLypkdHlwZSAgICAgKi8gYXJnc0luc3RydWN0aW9uLT5hdCgwKS5kdHlwZSk7CisKKwlyZXR1cm4oIGFDb2RlICk7Cit9CisKKworQkZDb2RlIEF2bWNvZGVBY3Rpdml0eVN0YXRlbWVudENvbXBpbGVyOjpjb21waWxlU3RhdGVtZW50UGFyYW1zKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlCRkNvZGUgbmV3Q29kZSggYUNvZGUtPmdldE9wZXJhdG9yKCkgKTsKKworCWlmKCBhQ29kZS0+ZW1wdHkoKSApCisJeworCQlyZXR1cm4oIG5ld0NvZGUgKTsKKwl9CisKKwlBdm1Db2RlOjppdGVyYXRvciBpdEFyZyA9IGFDb2RlLT5iZWdpbigpOworCisJbmV3Q29kZS0+YXBwZW5kKCBjb21waWxlQXJnUnZhbHVlKGFDVFgsIFR5cGVNYW5hZ2VyOjpNQUNISU5FLCAoKml0QXJnKSkgKTsKKworCUF2bUNvZGU6Oml0ZXJhdG9yIGl0RW5kQXJnID0gYUNvZGUtPmVuZCgpOworCWZvciggKytpdEFyZyA7IGl0QXJnICE9IGl0RW5kQXJnIDsgKytpdEFyZyApCisJeworCQlzd2l0Y2goICgqaXRBcmcpLmNsYXNzS2luZCgpICkKKwkJeworCQkJY2FzZSBGT1JNX0FWTUNPREVfS0lORDoKKwkJCXsKKwkJCQljb25zdCBCRkNvZGUgJiBhcmdDb2RlID0gKCppdEFyZykuYmZDb2RlKCk7CisJCQkJaWYoIGFDb2RlLT5wb3B1bGF0ZWQoKSAmJgorCQkJCQkJU3RhdGVtZW50VHlwZUNoZWNrZXI6OmlzQXNzaWduKCBhcmdDb2RlICkgJiYKKwkJCQkJCW5ld0NvZGUtPmZpcnN0KCkuaXM8IEluc3RhbmNlT2ZNYWNoaW5lID4oKSApCisJCQkJeworCQkJCQlFeGVjdXRhYmxlRm9ybSAqIGV4ZWNJbnN0YW5jZSA9IG5ld0NvZGUtPmZpcnN0KCkuCisJCQkJCQkJdG9fcHRyPCBJbnN0YW5jZU9mTWFjaGluZSA+KCktPmdldEV4ZWN1dGFibGUoKTsKKworCQkJCQlpZiggYXJnQ29kZS0+cG9wdWxhdGVkKCkgKQorCQkJCQl7CisJCQkJCQluZXdDb2RlLT5hcHBlbmQoIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQkJCWFyZ0NvZGUtPmdldE9wZXJhdG9yKCksCisJCQkJCQkJY29tcGlsZUFyZ0x2YWx1ZSggYUNUWC0+bmV3Q1RYKGV4ZWNJbnN0YW5jZSwKKwkJCQkJCQkJCU1vZGlmaWVyOjpQUk9QRVJUWV9QVUJMSUNfVk9MQVRJTEVfTU9ESUZJRVIpLAorCQkJCQkJCQlhcmdDb2RlLT5maXJzdCgpKSwKKwkJCQkJCQljb21waWxlQXJnUnZhbHVlKCBhQ1RYLT5uZXdDVFgoCisJCQkJCQkJCQlNb2RpZmllcjo6UFJPUEVSVFlfUFVCTElDX1ZPTEFUSUxFX01PRElGSUVSKSwKKwkJCQkJCQkJYXJnQ29kZS0+c2Vjb25kKCkpKSApOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJbmV3Q29kZS0+YXBwZW5kKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQkJCQlhcmdDb2RlLT5nZXRPcGVyYXRvcigpLAljb21waWxlQXJnTHZhbHVlKAorCQkJCQkJCQlhQ1RYLT5uZXdDVFgoZXhlY0luc3RhbmNlLAorCQkJCQkJCQkJCU1vZGlmaWVyOjpQUk9QRVJUWV9QVUJMSUNfVk9MQVRJTEVfTU9ESUZJRVIpLAorCQkJCQkJCQlhcmdDb2RlLT5maXJzdCgpKSkgKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQluZXdDb2RlLT5hcHBlbmQoCisJCQkJCQkJQVZNQ09ERV9DT01QSUxFUi5jb21waWxlRXhwcmVzc2lvbihhQ1RYLCBhcmdDb2RlKSApOworCQkJCX0KKworCQkJCWJyZWFrOworCQkJfQorCisJCQlkZWZhdWx0OgorCQkJeworCQkJCW5ld0NvZGUtPmFwcGVuZCggY29tcGlsZUFyZ1J2YWx1ZShhQ1RYLCAoKml0QXJnKSkgKTsKKworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuKCBuZXdDb2RlICk7Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQVZNQ09ERSBDT05URVhUIFNXSVRDSEVSIFNUQVRFTUVOVCBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkZDb2RlIEF2bWNvZGVDb250ZXh0U3dpdGNoZXJTdGF0ZW1lbnRDb21waWxlcjo6Y29tcGlsZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJaWYoIGFDb2RlLT5zaXplKCkgIT0gMiApCisJeworCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCTw8ICJFeHBlY3RlZCBDT05URVhUIFNXSVRDSEVSIHdpdGggb25lIHJ1bm5pbmcgIgorCQkJCQkibWFjaGluZSBhbmQgYSBzdGF0ZW1lbnQgYXMgcGFyYW1ldGVyICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisJfQorCisJQkYgY3R4TWFjaGluZSA9IGNvbXBpbGVBcmdSdmFsdWUoYUNUWCwgVHlwZU1hbmFnZXI6Ok1BQ0hJTkUsIGFDb2RlLT5maXJzdCgpICk7CisKKwlpZiggY3R4TWFjaGluZS5pczwgSW5zdGFuY2VPZk1hY2hpbmUgPigpICkKKwl7CisJCWFDVFggPSBhQ1RYLT5uZXdDVFgoCisJCQkJLy9jdHhNYWNoaW5lLnRvX3B0cjwgSW5zdGFuY2VPZk1hY2hpbmUgPigpLT5nZXRFeGVjdXRhYmxlKCksCisJCQkJY3R4TWFjaGluZS50b19wdHI8IEluc3RhbmNlT2ZNYWNoaW5lID4oKS0+Z2V0RXhlY3V0YWJsZSgpICk7CisJfQorCisJcmV0dXJuKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSggYUNvZGUtPmdldE9wZXJhdG9yKCksIGN0eE1hY2hpbmUsCisJCQljb21waWxlU3RhdGVtZW50Q29kZShhQ1RYLCBhQ29kZS0+c2Vjb25kKCkuYmZDb2RlKCkpKSApOworfQorCisKK0JGQ29kZSBBdm1jb2RlQ29udGV4dFN3aXRjaGVyU3RhdGVtZW50Q29tcGlsZXI6Om9wdGltaXplU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlBdm1JbnN0cnVjdGlvbiAqIGFyZ3NJbnN0cnVjdGlvbiA9IGFDb2RlLT5nZW5JbnN0cnVjdGlvbigpOworCisJYXJnc0luc3RydWN0aW9uLT5hdCgwKS5kdHlwZSA9IFR5cGVNYW5hZ2VyOjpNQUNISU5FOworCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdCgwKSwgYUNvZGUtPmZpcnN0KCkpOworCisJaWYoIGFDb2RlLT5maXJzdCgpLmlzPCBJbnN0YW5jZU9mTWFjaGluZSA+KCkgKQorCXsKKwkJYUNUWCA9IGFDVFgtPm5ld0NUWChhQ29kZS0+Zmlyc3QoKS4KKwkJCQl0b19wdHI8IEluc3RhbmNlT2ZNYWNoaW5lID4oKS0+Z2V0RXhlY3V0YWJsZSgpICk7CisJfQorCisJb3B0aW1pemVBcmdTdGF0ZW1lbnQoYUNUWCwgYUNvZGUsIDEpOworCWFyZ3NJbnN0cnVjdGlvbi0+YXQoMSkuZHR5cGUgPSBUeXBlTWFuYWdlcjo6VU5JVkVSU0FMOworCXNldEFyZ2NvZGVTdGF0ZW1lbnQoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdCgxKSwgYUNvZGUtPnNlY29uZCgpLCBmYWxzZSk7CisKKwlhcmdzSW5zdHJ1Y3Rpb24tPmNvbXB1dGVNYWluQnl0ZWNvZGUoCisJCQkvKmNvbnRleHQgICovIEFWTV9BUkdfU1RBTkRBUkRfQ1RYLAorCQkJLypwcm9jZXNzb3IqLyBBVk1fQVJHX1NUQVRFTUVOVF9DUFUsCisJCQkvKm9wZXJhdGlvbiovIEFWTV9BUkdfU0VWQUxfUlZBTFVFLAorCQkJLypvcGVyYW5kICAqLyBBVk1fQVJHX1NUQVRFTUVOVF9LSU5ELAorCQkJLypkdHlwZSAgICAgKi8gYXJnc0luc3RydWN0aW9uLT5hdCgwKS5kdHlwZSk7CisKKwlyZXR1cm4oIGFDb2RlICk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIElFTkFCTEUgU1RBVEVNRU5UIENPTVBJTEFUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitCRkNvZGUgQXZtY29kZUlFbmFibGVTdGF0ZW1lbnRDb21waWxlcjo6Y29tcGlsZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJaWYoIGFDb2RlLT5lbXB0eSgpICkKKwl7CisJCWFDb2RlLT5hcHBlbmQoIEV4ZWN1dGFibGVMaWI6Ok1BQ0hJTkVfU0VMRiApOworCX0KKwllbHNlIGlmKCBhQ29kZS0+c2luZ2xldG9uKCkgKQorCXsKKwkJcmV0dXJuKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZShhQ29kZS0+Z2V0T3BlcmF0b3IoKSwKKwkJCQljb21waWxlQXJnUnZhbHVlKGFDVFgsIFR5cGVNYW5hZ2VyOjpNQUNISU5FLCBhQ29kZS0+Zmlyc3QoKSkpICk7CisJfQorCWVsc2UKKwl7CisJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJPDwgIlVuZXhwZWN0ZWQgSUVOQUJMRSBTVEFURU1FTlQgd2l0aCBtb3JlICIKKwkJCQkJInRoYW4gb25lIHJ1bm5pbmcgbWFjaGluZSBhcyBwYXJhbWV0ZXIgISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKwl9CisKKwlyZXR1cm4oIGFDb2RlICk7Cit9CisKKworQkZDb2RlIEF2bWNvZGVJRW5hYmxlU3RhdGVtZW50Q29tcGlsZXI6Om9wdGltaXplU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlpZiggYUNvZGUtPmVtcHR5KCkgKQorCXsKKwkJYUNvZGUtPmFwcGVuZCggRXhlY3V0YWJsZUxpYjo6TUFDSElORV9TRUxGICk7CisJfQorCisJRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGUgPSBnZXRFeGVjdXRhYmxlTWFjaGluZShhQ1RYLCBhQ29kZS0+Zmlyc3QoKSk7CisKKwlpZiggYW5FeGVjdXRhYmxlICE9IE5VTEwgKQorCXsKKwkJaWYoIGFuRXhlY3V0YWJsZS0+aGFzT25JRW5hYmxlKCkgKQorCQl7CisJCQlpZiggYUNUWC0+aXNJbmxpbmVFbmFibGUoYW5FeGVjdXRhYmxlKSApCisJCQl7CisJCQkJQkZDb2RlIG9wdGlDb2RlID0gQVZNQ09ERV9DT01QSUxFUi5vcHRpbWl6ZVN0YXRlbWVudCgKKwkJCQkJCWFDVFgtPm5ld0NUWChhbkV4ZWN1dGFibGUpLCBhbkV4ZWN1dGFibGUtPmdldE9uSUVuYWJsZSgpICk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIENPTVBVVElORyAsIFNUQVRFTUVOVCApCisJCQkJcmV0dXJuKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZUZsYXQoCisJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FUT01JQ19TRVFVRU5DRSwKKworCQkJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvbW1lbnQoCisJCQkJCQkJCSI8aWVuYWJsZT4gIiArIGFuRXhlY3V0YWJsZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSksCisKKwkJCQkJCW9wdGlDb2RlLAorCisJCQkJCQlTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29tbWVudCgKKwkJCQkJCQkJImVuZDxpZW5hYmxlPiAiICsgYW5FeGVjdXRhYmxlLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpKSApKTsKKworQVZNX0VMU0UKKworCQkJCXJldHVybiggb3B0aUNvZGUgKTsKKworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgQ09NUFVUSU5HICwgU1RBVEVNRU5UICkKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4oIEF2bWNvZGVBY3Rpdml0eVN0YXRlbWVudENvbXBpbGVyOjoKKwkJCQkJCW9wdGltaXplU3RhdGVtZW50KGFDVFgsIGFDb2RlKSApOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29tbWVudCgKKwkJCQkJIm5vcDxpZW5hYmxlPiAiICsgYW5FeGVjdXRhYmxlLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpICkpOworCQl9CisJfQorCisJcmV0dXJuKCBBdm1jb2RlQWN0aXZpdHlTdGF0ZW1lbnRDb21waWxlcjo6b3B0aW1pemVTdGF0ZW1lbnQoYUNUWCwgYUNvZGUpICk7Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQVZNQ09ERSBFTkFCTEUgU1RBVEVNRU5UIENPTVBJTEFUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitCRkNvZGUgQXZtY29kZUVuYWJsZVN0YXRlbWVudENvbXBpbGVyOjpjb21waWxlU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlpZiggYUNvZGUtPmVtcHR5KCkgKQorCXsKKwkJYUNvZGUtPmFwcGVuZCggRXhlY3V0YWJsZUxpYjo6TUFDSElORV9TRUxGICk7CisJfQorCWVsc2UgaWYoIGFDb2RlLT5zaW5nbGV0b24oKSApCisJeworCQlyZXR1cm4oIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKGFDb2RlLT5nZXRPcGVyYXRvcigpLAorCQkJCWNvbXBpbGVBcmdSdmFsdWUoYUNUWCwgVHlwZU1hbmFnZXI6Ok1BQ0hJTkUsIGFDb2RlLT5maXJzdCgpKSkgKTsKKwl9CisJZWxzZQorCXsKKwkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQk8PCAiVW5leHBlY3RlZCBFTkFCTEUgU1RBVEVNRU5UIHdpdGggbW9yZSAiCisJCQkJCSJ0aGFuIG9uZSBydW5uaW5nIG1hY2hpbmUgYXMgcGFyYW1ldGVyICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisJfQorCisJcmV0dXJuKCBhQ29kZSApOworfQorCisKK0JGQ29kZSBBdm1jb2RlRW5hYmxlU3RhdGVtZW50Q29tcGlsZXI6Om9wdGltaXplU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlpZiggYUNvZGUtPmVtcHR5KCkgKQorCXsKKwkJYUNvZGUtPmFwcGVuZCggRXhlY3V0YWJsZUxpYjo6TUFDSElORV9TRUxGICk7CisJfQorCisJRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGUgPSBnZXRFeGVjdXRhYmxlTWFjaGluZShhQ1RYLCBhQ29kZS0+Zmlyc3QoKSk7CisKKwlpZiggYW5FeGVjdXRhYmxlICE9IE5VTEwgKQorCXsKKwkJaWYoIGFuRXhlY3V0YWJsZS0+aGFzT25FbmFibGUoKSApCisJCXsKKwkJCWlmKCBhQ1RYLT5pc0lubGluZUVuYWJsZShhbkV4ZWN1dGFibGUpICkKKwkJCXsKKwkJCQlCRkNvZGUgb3B0aUNvZGUgPSBBVk1DT0RFX0NPTVBJTEVSLm9wdGltaXplU3RhdGVtZW50KAorCQkJCQkJYUNUWC0+bmV3Q1RYKGFuRXhlY3V0YWJsZSksIGFuRXhlY3V0YWJsZS0+Z2V0T25FbmFibGUoKSApOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBDT01QVVRJTkcgLCBTVEFURU1FTlQgKQorCQkJCXJldHVybiggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGVGbGF0TWlkZGxlKAorCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BVE9NSUNfU0VRVUVOQ0UsCisKKwkJCQkJCVN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb21tZW50KAorCQkJCQkJCQkiYmVnaW48ZW5hYmxlPiAiICsgYW5FeGVjdXRhYmxlLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpICksCisKKwkJCQkJCW9wdGlDb2RlLAorCisJCQkJCQlTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29tbWVudCgKKwkJCQkJCQkJImVuZDxlbmFibGU+ICIgKyBhbkV4ZWN1dGFibGUtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkpICkpOworCitBVk1fRUxTRQorCisJCQkJcmV0dXJuKCBvcHRpQ29kZSApOworCitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBDT01QVVRJTkcgLCBTVEFURU1FTlQgKQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJldHVybiggQXZtY29kZUFjdGl2aXR5U3RhdGVtZW50Q29tcGlsZXI6OgorCQkJCQkJb3B0aW1pemVTdGF0ZW1lbnQoYUNUWCwgYUNvZGUpICk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4oIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb21tZW50KAorCQkJCQkibm9wPGVuYWJsZT4gIiArIGFuRXhlY3V0YWJsZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSApKTsKKwkJfQorCX0KKworCXJldHVybiggQXZtY29kZUFjdGl2aXR5U3RhdGVtZW50Q29tcGlsZXI6Om9wdGltaXplU3RhdGVtZW50KGFDVFgsIGFDb2RlKSApOworfQorCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFWTUNPREUgSURJU0FCTEUgU1RBVEVNRU5UIENPTVBJTEFUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitCRkNvZGUgQXZtY29kZUlEaXNhYmxlU3RhdGVtZW50Q29tcGlsZXI6OmNvbXBpbGVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCWlmKCBhQ29kZS0+ZW1wdHkoKSApCisJeworCQlhQ29kZS0+YXBwZW5kKCBFeGVjdXRhYmxlTGliOjpNQUNISU5FX1NFTEYgKTsKKwl9CisJZWxzZSBpZiggYUNvZGUtPnNpbmdsZXRvbigpICkKKwl7CisJCXJldHVybiggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoIGFDb2RlLT5nZXRPcGVyYXRvcigpLAorCQkJCWNvbXBpbGVBcmdSdmFsdWUoYUNUWCwgVHlwZU1hbmFnZXI6Ok1BQ0hJTkUsIGFDb2RlLT5maXJzdCgpKSkgKTsKKwl9CisJZWxzZQorCXsKKwkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQk8PCAiVW5leHBlY3RlZCBJRElTQUJMRSBTVEFURU1FTlQgd2l0aCBtb3JlICIKKwkJCQkJInRoYW4gb25lIHJ1bm5pbmcgbWFjaGluZSBhcyBwYXJhbWV0ZXIgISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKwl9CisKKwlyZXR1cm4oIGFDb2RlICk7Cit9CisKKworQkZDb2RlIEF2bWNvZGVJRGlzYWJsZVN0YXRlbWVudENvbXBpbGVyOjpvcHRpbWl6ZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJaWYoIGFDb2RlLT5lbXB0eSgpICkKKwl7CisJCWFDb2RlLT5hcHBlbmQoIEV4ZWN1dGFibGVMaWI6Ok1BQ0hJTkVfU0VMRiApOworCX0KKworCUV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlID0gZ2V0RXhlY3V0YWJsZU1hY2hpbmUoYUNUWCwgYUNvZGUtPmZpcnN0KCkpOworCisJaWYoIGFuRXhlY3V0YWJsZSAhPSBOVUxMICkKKwl7CisJCWlmKCBhbkV4ZWN1dGFibGUtPmhhc09uSURpc2FibGUoKSApCisJCXsKKy8vCQkJQkZDb2RlIG9wdGlDb2RlID0gQVZNQ09ERV9DT01QSUxFUi5vcHRpbWl6ZVN0YXRlbWVudCgKKy8vCQkJCQlhQ1RYLT5uZXdDVFgoYW5FeGVjdXRhYmxlKSwgYW5FeGVjdXRhYmxlLT5nZXRPbklEaXNhYmxlKCkgKTsKKy8vCisvL0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIENPTVBVVElORyAsIFNUQVRFTUVOVCApCisvLwkJCXJldHVybiggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGVGbGF0TWlkZGxlKAorLy8JCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQVRPTUlDX1NFUVVFTkNFLAorLy8KKy8vCQkJCQlTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29tbWVudCgKKy8vCQkJCQkJCSJiZWdpbjxpZGlzYWJsZT4gIiArIGFuRXhlY3V0YWJsZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSksCisvLworLy8JCQkJCW9wdGlDb2RlLAorLy8KKy8vCQkJCQlTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29tbWVudCgKKy8vCQkJCQkJCSJlbmQ8aWRpc2FibGU+ICIgKyBhbkV4ZWN1dGFibGUtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkpICkpOworLy9fQVZNX0VMU0VfCisvLworLy8JCQlyZXR1cm4oIG9wdGlDb2RlICk7CisvLworLy9BVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBDT01QVVRJTkcgLCBTVEFURU1FTlQgKQorCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29tbWVudCgKKwkJCQkJIm5vcDxpZGlzYWJsZT4gIiArIGFuRXhlY3V0YWJsZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSkgKTsKKwkJfQorCX0KKworCXJldHVybiggQXZtY29kZUFjdGl2aXR5U3RhdGVtZW50Q29tcGlsZXI6Om9wdGltaXplU3RhdGVtZW50KGFDVFgsIGFDb2RlKSApOworfQorCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFWTUNPREUgRElTQUJMRSBTVEFURU1FTlQgQ09NUElMQVRJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0JGQ29kZSBBdm1jb2RlRGlzYWJsZVN0YXRlbWVudENvbXBpbGVyOjpjb21waWxlU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlpZiggYUNvZGUtPmVtcHR5KCkgKQorCXsKKwkJYUNvZGUtPmFwcGVuZCggRXhlY3V0YWJsZUxpYjo6TUFDSElORV9TRUxGICk7CisJfQorCWVsc2UgaWYoIGFDb2RlLT5zaW5nbGV0b24oKSApCisJeworCQlpZiggRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc0ludGVnZXIoYUNvZGUtPmZpcnN0KCkpICkKKwkJeworCQkJcmV0dXJuKCBBVk1DT0RFX0NPTVBJTEVSLmNvbXBpbGVTdGF0ZW1lbnQoYUNUWCwKKwkJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9ESVNBQkxFX1NFTFZFUywKKwkJCQkJCQlhQ29kZS0+Zmlyc3QoKSApKSk7CisJCX0KKworCQlyZXR1cm4oIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKCBhQ29kZS0+Z2V0T3BlcmF0b3IoKSwKKwkJCQljb21waWxlQXJnUnZhbHVlKGFDVFgsIFR5cGVNYW5hZ2VyOjpNQUNISU5FLCBhQ29kZS0+Zmlyc3QoKSkpICk7CisKKwl9CisJZWxzZQorCXsKKwkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQk8PCAiVW5leHBlY3RlZCBESVNBQkxFIFNUQVRFTUVOVCB3aXRoIG1vcmUgIgorCQkJCQkidGhhbiBvbmUgcnVubmluZyBtYWNoaW5lIGFzIHBhcmFtZXRlciAhISEiCisJCQkJPDwgU0VORF9FWElUOworCX0KKworCXJldHVybiggYUNvZGUgKTsKK30KKworCitCRkNvZGUgQXZtY29kZURpc2FibGVTdGF0ZW1lbnRDb21waWxlcjo6b3B0aW1pemVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCWlmKCBhQ29kZS0+ZW1wdHkoKSApCisJeworCQlhQ29kZS0+YXBwZW5kKCBFeGVjdXRhYmxlTGliOjpNQUNISU5FX1NFTEYgKTsKKwl9CisKKwlFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZSA9IGdldEV4ZWN1dGFibGVNYWNoaW5lKGFDVFgsIGFDb2RlLT5maXJzdCgpKTsKKworCWlmKCBhbkV4ZWN1dGFibGUgIT0gTlVMTCApCisJeworCQlpZiggYW5FeGVjdXRhYmxlLT5oYXNPbkRpc2FibGUoKSApCisJCXsKKy8vCQkJQkZDb2RlIG9wdGlDb2RlID0gQVZNQ09ERV9DT01QSUxFUi5vcHRpbWl6ZVN0YXRlbWVudCgKKy8vCQkJCQlhQ1RYLT5uZXdDVFgoYW5FeGVjdXRhYmxlKSwgYW5FeGVjdXRhYmxlLT5nZXRPbkRpc2FibGUoKSApOworLy8KKy8vQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgQ09NUFVUSU5HICwgU1RBVEVNRU5UICkKKy8vCQkJcmV0dXJuKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZUZsYXRNaWRkbGUoCisvLwkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BVE9NSUNfU0VRVUVOQ0UsCisvLworLy8JCQkJCVN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb21tZW50KAorLy8JCQkJCQkJImJlZ2luPGRpc2FibGU+ICIgKyBhbkV4ZWN1dGFibGUtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkpLAorLy8KKy8vCQkJCQlvcHRpQ29kZSwKKy8vCisvLwkJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvbW1lbnQoCisvLwkJCQkJCQkiZW5kPGRpc2FibGU+ICIgKyBhbkV4ZWN1dGFibGUtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkpICkpOworLy9fQVZNX0VMU0VfCisvLworLy8JCQlyZXR1cm4oIG9wdGlDb2RlICk7CisvLworLy9BVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBDT01QVVRJTkcgLCBTVEFURU1FTlQgKQorCQl9CisJCWVsc2UgaWYoIGFDb2RlLT5maXJzdCgpID09IEV4ZWN1dGFibGVMaWI6Ok1BQ0hJTkVfU0VMRiApCisJCXsKKwkJCXJldHVybiggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfRElTQUJMRV9TRUxGKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuKCBBdm1jb2RlQWN0aXZpdHlTdGF0ZW1lbnRDb21waWxlcjo6b3B0aW1pemVTdGF0ZW1lbnQoCisJCQkJCWFDVFgsIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0RJU0FCTEVfU0VULCBhQ29kZS0+Zmlyc3QoKSApKSk7CisJCX0KKwl9CisJZWxzZSBpZiggYUNvZGUtPmZpcnN0KCkgPT0gRXhlY3V0YWJsZUxpYjo6TUFDSElORV9TRUxGICkKKwl7CisJCXJldHVybiggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9ESVNBQkxFX1NFTEYpICk7CisJfQorCisJcmV0dXJuKCBBdm1jb2RlQWN0aXZpdHlTdGF0ZW1lbnRDb21waWxlcjo6b3B0aW1pemVTdGF0ZW1lbnQoYUNUWCwgYUNvZGUpICk7Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQVZNQ09ERSBESVNBQkxFI1NFTFZFUyBTVEFURU1FTlQgQ09NUElMQVRJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0JGQ29kZSBBdm1jb2RlRGlzYWJsZVNlbHZlc1N0YXRlbWVudENvbXBpbGVyOjpjb21waWxlU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlpZiggYUNvZGUtPnNpbmdsZXRvbigpICkKKwl7CisJCWlmKCBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzSW50ZWdlcihhQ29kZS0+Zmlyc3QoKSkgKQorCQl7CisJCQlpZiggYUNvZGUtPmZpcnN0KCkuaXNXZWFrSW50ZWdlcigpICYmCisJCQkJCShhQ29kZS0+Zmlyc3QoKS50b0ludGVnZXIoKSA8IDApICkKKwkJCXsKKwkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJPDwgIlVuZXhwZWN0ZWQgRElTQUJMRSNTRUxWRVMgU1RBVEVNRU5UIHdpdGggIgorCQkJCQkJCSJhIG5lZ2F0aXZlIGludGVnZXIgYXMgcGFyYW1ldGVyICEhISIKKwkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCXJldHVybiggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQlhQ29kZS0+Z2V0T3BlcmF0b3IoKSwKKwkJCQkJCUV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3VUludGVnZXIoCisJCQkJCQkJCSgtIGFDb2RlLT5maXJzdCgpLnRvSW50ZWdlcigpKSApICkgKTsKKwkJCX0KKwkJfQorCX0KKwllbHNlCisJeworCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCTw8ICJVbmV4cGVjdGVkIERJU0FCTEUjU0VMVkVTIFNUQVRFTUVOVCB3aXRoICIKKwkJCQkJIm9ubHkgYW4gdW5zaWduZWQgaW50ZWdlciBhcyBwYXJhbWV0ZXIgISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKwl9CisKKwlyZXR1cm4oIGFDb2RlICk7Cit9CisKK0JGQ29kZSBBdm1jb2RlRGlzYWJsZVNlbHZlc1N0YXRlbWVudENvbXBpbGVyOjpvcHRpbWl6ZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJQkZDb2RlIG9wdENvZGU7CisKKwlpZiggYUNvZGUtPmZpcnN0KCkuaXNXZWFrSW50ZWdlcigpICkKKwl7CisJCUV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlID0gYUNUWC0+bUNvbXBpbGVDdHgtPmdldEV4ZWN1dGFibGUoKTsKKwkJYXZtX2ludGVnZXJfdCBpbnRlckxldmVsID0gMDsKKworCQlvcHRDb2RlID0gU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BVE9NSUNfU0VRVUVOQ0UpOworCisJCWF2bV9pbnRlZ2VyX3QgZGlzYWJsZUxldmVsID0gYUNvZGUtPmZpcnN0KCkudG9JbnRlZ2VyKCk7CisJCWZvciggYXZtX2ludGVnZXJfdCBsZXZlbCA9IGRpc2FibGVMZXZlbCA7CisJCQkJKGxldmVsID4gMCkgJiYgKGFuRXhlY3V0YWJsZSAhPSBOVUxMKSA7IC0tbGV2ZWwgKQorCQl7CisJCQlpZiggYW5FeGVjdXRhYmxlLT5oYXNPbklEaXNhYmxlKCkgKQorCQkJeworCQkJCWlmKCBpbnRlckxldmVsID4gMSApCisJCQkJeworCQkJCQlvcHRDb2RlLT5hcHBlbmQoIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdPcHRpTm9wQ29kZSgKKwkJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0RJU0FCTEVfU0VMVkVTLAorCQkJCQkJCUV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3VUludGVnZXIoaW50ZXJMZXZlbCksCisJCQkJCQkJQVZNX0FSR19CVUlMVElOX0tJTkQpICk7CisJCQkJfQorCQkJCWVsc2UgaWYoIGludGVyTGV2ZWwgPT0gMSApCisJCQkJeworCQkJCQlvcHRDb2RlLT5hcHBlbmQoIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfRElTQUJMRV9TRUxGKSApOworCQkJCX0KKworCQkJCW9wdENvZGUtPmFwcGVuZEZsYXQoIGFuRXhlY3V0YWJsZS0+Z2V0T25JRGlzYWJsZSgpICk7CisKKwkJCQlpbnRlckxldmVsID0gMDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpbnRlckxldmVsID0gaW50ZXJMZXZlbCArIDE7CisJCQl9CisKKwkJCWFuRXhlY3V0YWJsZSA9IGFuRXhlY3V0YWJsZS0+Z2V0RXhlY3V0YWJsZUNvbnRhaW5lcigpOworCQl9CisKKwkJaWYoIGludGVyTGV2ZWwgIT0gZGlzYWJsZUxldmVsICkKKwkJeworCQkJaWYoIGludGVyTGV2ZWwgPiAxICkKKwkJCXsKKwkJCQlvcHRDb2RlLT5hcHBlbmQoIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdPcHRpTm9wQ29kZSgKKwkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfRElTQUJMRV9TRUxWRVMsCisJCQkJCQlFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld1VJbnRlZ2VyKGludGVyTGV2ZWwpLAorCQkJCQkJQVZNX0FSR19CVUlMVElOX0tJTkQpICk7CisJCQl9CisJCQllbHNlIGlmKCBpbnRlckxldmVsID09IDEgKQorCQkJeworCQkJCW9wdENvZGUtPmFwcGVuZCggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0RJU0FCTEVfU0VMRikgKTsKKwkJCX0KKworCQkJcmV0dXJuKCBBdm1jb2RlU3Ryb25nU2VxdWVuY2VDb21waWxlcjo6YXRvbWl6ZVNlcXVlbmNlKG9wdENvZGUpICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlBdm1JbnN0cnVjdGlvbiAqIGFyZ3NJbnN0cnVjdGlvbiA9IGFDb2RlLT5nZW5JbnN0cnVjdGlvbigpOworCisJCQlhcmdzSW5zdHJ1Y3Rpb24tPnNldCggMCwKKwkJCQkJLypvcGVyYXRpb24qLyBBVk1fQVJHX05PUF9SVkFMVUUsCisJCQkJCS8qb3BlcmFuZCAgKi8gQVZNX0FSR19CVUlMVElOX0tJTkQsCisJCQkJCS8qZHR5cGUgICAgKi8gVHlwZU1hbmFnZXI6OklOVEVHRVIgKTsKKworCQkJYXJnc0luc3RydWN0aW9uLT5jb21wdXRlTWFpbkJ5dGVjb2RlKDApOworCisJCQlyZXR1cm4oIGFDb2RlICk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJQXZtSW5zdHJ1Y3Rpb24gKiBhcmdzSW5zdHJ1Y3Rpb24gPSBhQ29kZS0+Z2VuSW5zdHJ1Y3Rpb24oKTsKKworCQlvcHRpbWl6ZUFyZ0V4cHJlc3Npb24oYUNUWCwgYUNvZGUsIDApOworCQlhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLmR0eXBlID0gVHlwZU1hbmFnZXI6OklOVEVHRVI7CisJCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdCgwKSwgYUNvZGUtPmZpcnN0KCkpOworCisJCWFyZ3NJbnN0cnVjdGlvbi0+Y29tcHV0ZU1haW5CeXRlY29kZSgwKTsKKworCQlyZXR1cm4oIGFDb2RlICk7CisJfQorfQorCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFWTUNPREUgSUFCT1JUIFNUQVRFTUVOVCBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkZDb2RlIEF2bWNvZGVJQWJvcnRTdGF0ZW1lbnRDb21waWxlcjo6Y29tcGlsZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJaWYoIGFDb2RlLT5lbXB0eSgpICkKKwl7CisJCWFDb2RlLT5hcHBlbmQoIEV4ZWN1dGFibGVMaWI6Ok1BQ0hJTkVfU0VMRiApOworCX0KKwllbHNlIGlmKCBhQ29kZS0+c2luZ2xldG9uKCkgKQorCXsKKwkJcmV0dXJuKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZShhQ29kZS0+Z2V0T3BlcmF0b3IoKSwKKwkJCQljb21waWxlQXJnUnZhbHVlKGFDVFgsIFR5cGVNYW5hZ2VyOjpNQUNISU5FLCBhQ29kZS0+Zmlyc3QoKSkpICk7CisJfQorCWVsc2UKKwl7CisJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJPDwgIlVuZXhwZWN0ZWQgSUFCT1JUIFNUQVRFTUVOVCB3aXRoIG1vcmUgIgorCQkJCQkidGhhbiBvbmUgcnVubmluZyBtYWNoaW5lIGFzIHBhcmFtZXRlciAhISEiCisJCQkJPDwgU0VORF9FWElUOworCX0KKworCXJldHVybiggYUNvZGUgKTsKK30KKworCitCRkNvZGUgQXZtY29kZUlBYm9ydFN0YXRlbWVudENvbXBpbGVyOjpvcHRpbWl6ZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJaWYoIGFDb2RlLT5lbXB0eSgpICkKKwl7CisJCWFDb2RlLT5hcHBlbmQoIEV4ZWN1dGFibGVMaWI6Ok1BQ0hJTkVfU0VMRiApOworCX0KKworCUV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlID0gZ2V0RXhlY3V0YWJsZU1hY2hpbmUoYUNUWCwgYUNvZGUtPmZpcnN0KCkpOworCisJaWYoIGFuRXhlY3V0YWJsZSAhPSBOVUxMICkKKwl7CisJCWlmKCBhbkV4ZWN1dGFibGUtPmhhc09uSUFib3J0KCkgKQorCQl7CisvLwkJCUJGQ29kZSBvcHRpQ29kZSA9IEFWTUNPREVfQ09NUElMRVIub3B0aW1pemVTdGF0ZW1lbnQoCisvLwkJCQkJYUNUWC0+bmV3Q1RYKGFuRXhlY3V0YWJsZSksIGFuRXhlY3V0YWJsZS0+Z2V0T25JQWJvcnQoKSApOworLy8KKy8vQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgQ09NUFVUSU5HICwgU1RBVEVNRU5UICkKKy8vCQkJcmV0dXJuKFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlRmxhdE1pZGRsZSgKKy8vCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FUT01JQ19TRVFVRU5DRSwKKy8vCisvLwkJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvbW1lbnQoCisvLwkJCQkJCQkiYmVnaW48aWFib3J0PiAiICsgYW5FeGVjdXRhYmxlLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpKSwKKy8vCisvLwkJCQkJb3B0aUNvZGUsCisvLworLy8JCQkJCVN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb21tZW50KAorLy8JCQkJCQkJImVuZDxpYWJvcnQ+ICIgKyBhbkV4ZWN1dGFibGUtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkpICkpOworLy9fQVZNX0VMU0VfCisvLworLy8JCQlyZXR1cm4oIG9wdGlDb2RlICk7CisvLworLy9BVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBDT01QVVRJTkcgLCBTVEFURU1FTlQgKQorCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29tbWVudCgKKwkJCQkJIm5vcDxpYWJvcnQ+ICIgKyBhbkV4ZWN1dGFibGUtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkpICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIEF2bWNvZGVBY3Rpdml0eVN0YXRlbWVudENvbXBpbGVyOjpvcHRpbWl6ZVN0YXRlbWVudChhQ1RYLCBhQ29kZSkgKTsKK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIEFCT1JUIFNUQVRFTUVOVCBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkZDb2RlIEF2bWNvZGVBYm9ydFN0YXRlbWVudENvbXBpbGVyOjpjb21waWxlU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlpZiggYUNvZGUtPmVtcHR5KCkgKQorCXsKKwkJYUNvZGUtPmFwcGVuZCggRXhlY3V0YWJsZUxpYjo6TUFDSElORV9TRUxGICk7CisJfQorCWVsc2UgaWYoIGFDb2RlLT5zaW5nbGV0b24oKSApCisJeworCQlyZXR1cm4oIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKGFDb2RlLT5nZXRPcGVyYXRvcigpLAorCQkJCWNvbXBpbGVBcmdSdmFsdWUoYUNUWCwgVHlwZU1hbmFnZXI6Ok1BQ0hJTkUsIGFDb2RlLT5maXJzdCgpKSkgKTsKKwl9CisJZWxzZSBpZiggYUNvZGUtPm5vbmVtcHR5KCkgKQorCXsKKwkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQk8PCAiVW5leHBlY3RlZCBBQk9SVCBTVEFURU1FTlQgd2l0aCBtb3JlICIKKwkJCQkJInRoYW4gb25lIHJ1bm5pbmcgbWFjaGluZSBhcyBwYXJhbWV0ZXIgISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKwl9CisKKwlyZXR1cm4oIGFDb2RlICk7Cit9CisKKworQkZDb2RlIEF2bWNvZGVBYm9ydFN0YXRlbWVudENvbXBpbGVyOjpvcHRpbWl6ZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJaWYoIGFDb2RlLT5lbXB0eSgpICkKKwl7CisJCWFDb2RlLT5hcHBlbmQoIEV4ZWN1dGFibGVMaWI6Ok1BQ0hJTkVfU0VMRiApOworCX0KKworCUV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlID0gZ2V0RXhlY3V0YWJsZU1hY2hpbmUoYUNUWCwgYUNvZGUtPmZpcnN0KCkpOworCisJaWYoIGFuRXhlY3V0YWJsZSAhPSBOVUxMICkKKwl7CisJCWlmKCBhbkV4ZWN1dGFibGUtPmhhc09uQWJvcnQoKSApCisJCXsKKy8vCQkJQkZDb2RlIG9wdGlDb2RlID0gQVZNQ09ERV9DT01QSUxFUi5vcHRpbWl6ZVN0YXRlbWVudCgKKy8vCQkJCQlhQ1RYLT5uZXdDVFgoYW5FeGVjdXRhYmxlKSwgYW5FeGVjdXRhYmxlLT5nZXRPbkFib3J0KCkgKTsKKy8vCisvL0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIENPTVBVVElORyAsIFNUQVRFTUVOVCApCisvLwkJCXJldHVybiggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGVGbGF0TWlkZGxlKAorLy8JCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQVRPTUlDX1NFUVVFTkNFLAorLy8KKy8vCQkJCQlTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29tbWVudCgKKy8vCQkJCQkJCSJiZWdpbjxhYm9ydD4gIiArIGFuRXhlY3V0YWJsZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSApLAorLy8KKy8vCQkJCQlvcHRpQ29kZSwKKy8vCisvLwkJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvbW1lbnQoCisvLwkJCQkJCQkiZW5kPGFib3J0PiAiICsgYW5FeGVjdXRhYmxlLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpKSApKTsKKy8vX0FWTV9FTFNFXworLy8KKy8vCQkJcmV0dXJuKCBvcHRpQ29kZSApOworLy8KKy8vQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgQ09NUFVUSU5HICwgU1RBVEVNRU5UICkKKwkJfQorCQllbHNlIGlmKCBhQ29kZS0+Zmlyc3QoKSA9PSBFeGVjdXRhYmxlTGliOjpNQUNISU5FX1NFTEYgKQorCQl7CisJCQlyZXR1cm4oIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FCT1JUX1NFTEYpICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4oIEF2bWNvZGVBY3Rpdml0eVN0YXRlbWVudENvbXBpbGVyOjpvcHRpbWl6ZVN0YXRlbWVudCgKKwkJCQkJYUNUWCwgU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BQk9SVF9TRVQsCisJCQkJCQkJYUNvZGUtPmZpcnN0KCkgKSkpOworCQl9CisJfQorCisJcmV0dXJuKCBBdm1jb2RlQWN0aXZpdHlTdGF0ZW1lbnRDb21waWxlcjo6b3B0aW1pemVTdGF0ZW1lbnQoYUNUWCwgYUNvZGUpICk7Cit9CisKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIEFCT1JUI1NFTFZFUyBTVEFURU1FTlQgQ09NUElMQVRJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0JGQ29kZSBBdm1jb2RlQWJvcnRTZWx2ZXNTdGF0ZW1lbnRDb21waWxlcjo6Y29tcGlsZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJaWYoIGFDb2RlLT5zaW5nbGV0b24oKSApCisJeworCQlpZiggRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc0ludGVnZXIoYUNvZGUtPmZpcnN0KCkpICkKKwkJeworCQkJaWYoIGFDb2RlLT5maXJzdCgpLmlzV2Vha0ludGVnZXIoKSAmJgorCQkJCQkoYUNvZGUtPmZpcnN0KCkudG9JbnRlZ2VyKCkgPCAwKSApCisJCQl7CisJCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJCTw8ICJVbmV4cGVjdGVkIEFCT1JUI1NFTFZFUyBTVEFURU1FTlQgd2l0aCAiCisJCQkJCQkJImEgbmVnYXRpdmUgaW50ZWdlciBhcyBwYXJhbWV0ZXIgISEhIgorCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJcmV0dXJuKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQkJCWFDb2RlLT5nZXRPcGVyYXRvcigpLAorCQkJCQkJRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdVSW50ZWdlcigKKwkJCQkJCQkJKC0gYUNvZGUtPmZpcnN0KCkudG9JbnRlZ2VyKCkpICkgKSApOworCQkJfQorCQl9CisJfQorCWVsc2UKKwl7CisJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJPDwgIlVuZXhwZWN0ZWQgQUJPUlQjU0VMVkVTIFNUQVRFTUVOVCB3aXRoICIKKwkJCQkJIm9ubHkgYW4gdW5zaWduZWQgaW50ZWdlciBhcyBwYXJhbWV0ZXIgISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKwl9CisKKwlyZXR1cm4oIGFDb2RlICk7Cit9CisKKworQkZDb2RlIEF2bWNvZGVBYm9ydFNlbHZlc1N0YXRlbWVudENvbXBpbGVyOjpvcHRpbWl6ZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJaWYoIGFDb2RlLT5maXJzdCgpLmlzV2Vha0ludGVnZXIoKSApCisJeworCQlFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZSA9IGFDVFgtPm1Db21waWxlQ3R4LT5nZXRFeGVjdXRhYmxlKCk7CisJCWF2bV9pbnRlZ2VyX3QgaW50ZXJMZXZlbCA9IDA7CisKKwkJQkZDb2RlIG9wdENvZGUgPSBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FUT01JQ19TRVFVRU5DRSk7CisKKwkJYXZtX2ludGVnZXJfdCBhYm9ydExldmVsID0gYUNvZGUtPmZpcnN0KCkudG9JbnRlZ2VyKCk7CisJCWZvciggYXZtX2ludGVnZXJfdCBsZXZlbCA9IGFib3J0TGV2ZWwgOworCQkJCShsZXZlbCA+IDApICYmIChhbkV4ZWN1dGFibGUgIT0gTlVMTCkgOyAtLWxldmVsICkKKwkJeworCQkJaWYoIGFuRXhlY3V0YWJsZS0+aGFzT25JQWJvcnQoKSApCisJCQl7CisJCQkJaWYoIGludGVyTGV2ZWwgPiAxICkKKwkJCQl7CisJCQkJCW9wdENvZGUtPmFwcGVuZCggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld09wdGlOb3BDb2RlKAorCQkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQUJPUlRfU0VMVkVTLAorCQkJCQkJCUV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3VUludGVnZXIoaW50ZXJMZXZlbCksCisJCQkJCQkJQVZNX0FSR19CVUlMVElOX0tJTkQpICk7CisJCQkJfQorCQkJCWVsc2UgaWYoIGludGVyTGV2ZWwgPT0gMSApCisJCQkJeworCQkJCQlvcHRDb2RlLT5hcHBlbmQoIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQUJPUlRfU0VMRikgKTsKKwkJCQl9CisKKwkJCQlvcHRDb2RlLT5hcHBlbmRGbGF0KCBhbkV4ZWN1dGFibGUtPmdldE9uSURpc2FibGUoKSApOworCisJCQkJaW50ZXJMZXZlbCA9IDA7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaW50ZXJMZXZlbCA9IGludGVyTGV2ZWwgKyAxOworCQkJfQorCisJCQlhbkV4ZWN1dGFibGUgPSBhbkV4ZWN1dGFibGUtPmdldEV4ZWN1dGFibGVDb250YWluZXIoKTsKKwkJfQorCisJCWlmKCBpbnRlckxldmVsICE9IGFib3J0TGV2ZWwgKQorCQl7CisJCQlpZiggaW50ZXJMZXZlbCA+IDEgKQorCQkJeworCQkJCW9wdENvZGUtPmFwcGVuZCggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld09wdGlOb3BDb2RlKAorCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BQk9SVF9TRUxWRVMsCisJCQkJCQlFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld1VJbnRlZ2VyKGludGVyTGV2ZWwpLAorCQkJCQkJQVZNX0FSR19CVUlMVElOX0tJTkQpICk7CisJCQl9CisJCQllbHNlIGlmKCBpbnRlckxldmVsID09IDEgKQorCQkJeworCQkJCW9wdENvZGUtPmFwcGVuZCggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FCT1JUX1NFTEYpICk7CisJCQl9CisKKwkJCXJldHVybiggQXZtY29kZVN0cm9uZ1NlcXVlbmNlQ29tcGlsZXI6OmF0b21pemVTZXF1ZW5jZShvcHRDb2RlKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJQXZtSW5zdHJ1Y3Rpb24gKiBhcmdzSW5zdHJ1Y3Rpb24gPSBhQ29kZS0+Z2VuSW5zdHJ1Y3Rpb24oKTsKKworCQkJYXJnc0luc3RydWN0aW9uLT5zZXQoIDAsCisJCQkJCS8qb3BlcmF0aW9uKi8gQVZNX0FSR19OT1BfUlZBTFVFLAorCQkJCQkvKm9wZXJhbmQgICovIEFWTV9BUkdfQlVJTFRJTl9LSU5ELAorCQkJCQkvKmR0eXBlICAgICovIFR5cGVNYW5hZ2VyOjpJTlRFR0VSICk7CisKKwkJCWFyZ3NJbnN0cnVjdGlvbi0+Y29tcHV0ZU1haW5CeXRlY29kZSgwKTsKKworCQkJcmV0dXJuKCBhQ29kZSApOworCQl9CisJfQorCWVsc2UKKwl7CisJCUF2bUluc3RydWN0aW9uICogYXJnc0luc3RydWN0aW9uID0gYUNvZGUtPmdlbkluc3RydWN0aW9uKCk7CisKKwkJb3B0aW1pemVBcmdFeHByZXNzaW9uKGFDVFgsIGFDb2RlLCAwKTsKKwkJYXJnc0luc3RydWN0aW9uLT5hdCgwKS5kdHlwZSA9IFR5cGVNYW5hZ2VyOjpJTlRFR0VSOworCQlzZXRBcmdjb2RlUlZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMCksIGFDb2RlLT5maXJzdCgpKTsKKworCQlhcmdzSW5zdHJ1Y3Rpb24tPmNvbXB1dGVNYWluQnl0ZWNvZGUoMCk7CisKKwkJcmV0dXJuKCBhQ29kZSApOworCX0KK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIEZPUksgU1RBVEVNRU5UIENPTVBJTEFUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitCRkNvZGUgQXZtY29kZUZvcmtTdGF0ZW1lbnRDb21waWxlcjo6Y29tcGlsZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJaWYoIGFDb2RlLT5zaXplKCkgPCAyICkKKwl7CisJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJPDwgIlVuZXhwZWN0ZWQgRk9SSyBTVEFURU1FTlQgd2l0aCBsZXNzICIKKwkJCQkJInRoYW4gMiBydW5uaW5nIG1hY2hpbmVzIGFzIHBhcmFtZXRlcnMgISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQlyZXR1cm4oIGFDb2RlICk7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiggQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXI6OmNvbXBpbGVTdGF0ZW1lbnQoYUNUWCwgYUNvZGUpICk7CisJfQorfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIEpPSU4gU1RBVEVNRU5UIENPTVBJTEFUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitCRkNvZGUgQXZtY29kZUpvaW5TdGF0ZW1lbnRDb21waWxlcjo6Y29tcGlsZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJaWYoIGFDb2RlLT5lbXB0eSgpICkKKwl7CisJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJPDwgIlVuZXhwZWN0ZWQgSk9JTiBTVEFURU1FTlQgd2l0aG91dCAiCisJCQkJCSJydW5uaW5nIG1hY2hpbmVzIGFzIHBhcmFtZXRlcnMgISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQlyZXR1cm4oIGFDb2RlICk7CisJfQorCWVsc2UgaWYoIGFDb2RlLT5zaW5nbGV0b24oKSApCisJeworCQlyZXR1cm4oIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKCBhQ29kZS0+Z2V0T3BlcmF0b3IoKSwKKwkJCQljb21waWxlQXJnUnZhbHVlKGFDVFgsIGFDb2RlLT5maXJzdCgpKSApICk7CisJfQorCWVsc2UKKwl7CisKKwkJcmV0dXJuKCBjb21waWxlU3RhdGVtZW50UGFyYW1zKGFDVFgsIGFDb2RlKSApOworCX0KK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQVZNQ09ERSBHT1RPIFNUQVRFTUVOVCBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkZDb2RlIEF2bWNvZGVHb3RvU3RhdGVtZW50Q29tcGlsZXI6OmNvbXBpbGVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCWlmKCBhQ29kZS0+ZW1wdHkoKSApCisJeworCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCTw8ICJVbmV4cGVjdGVkIEdPVE8gU1RBVEVNRU5UIHdpdGhvdXQgIgorCQkJCQkib25lIHJ1bm5pbmcgbWFjaGluZSBhcyB0YXJnZXQgISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQlyZXR1cm4oIGFDb2RlICk7CisJfQorCWVsc2UKKwl7CisJCUJGIGdvdG9UYXJnZXQgPSBBVk1DT0RFX0NPTVBJTEVSLmRlY29kZV9jb21waWxlVmFyaWFibGVNYWNoaW5lKAorCQkJCWFDVFgsIGFDb2RlLT5maXJzdCgpKTsKKworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoIGdvdG9UYXJnZXQuaXM8IEluc3RhbmNlT2ZNYWNoaW5lID4oKSApCisJCQkJPDwgIlVuZXhwZWN0ZWQgR09UTyBtYWNoaW5lIHRhcmdldDo+XG4iIDw8IGFDb2RlLnN0cigpCisJCQkJPDwgU0VORF9FWElUOworCisJCUJGQ29kZSBmbG93U3RhdGVtZW50OworCQlpZiggYUNvZGUtPnBvcHVsYXRlZCgpICYmIGdvdG9UYXJnZXQuaXM8IEluc3RhbmNlT2ZNYWNoaW5lID4oKSApCisJCXsKKwkJCWZsb3dTdGF0ZW1lbnQgPSBBVk1DT0RFX0NPTVBJTEVSLmRlY29kZV9jb21waWxlU3RhdGVtZW50KAorCQkJCQlnb3RvVGFyZ2V0LnRvX3B0cjwgSW5zdGFuY2VPZk1hY2hpbmUgPigpLT5nZXRFeGVjdXRhYmxlKCksCisJCQkJCWFDb2RlLT5zZWNvbmQoKSk7CisKKwkJCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggZmxvd1N0YXRlbWVudC52YWxpZCgpICkKKwkJCQkJPDwgIlVuZXhwZWN0ZWQgR09UTyBmbG93IHN0YXRlbWVudDo+XG4iIDw8IGFDb2RlLnN0cigpCisJCQkJCTw8IFNFTkRfRVhJVDsKKwkJfQorCisKKwkJY29uc3QgTWFjaGluZSAqIHNvdXJjZSA9CisJCQkJYUNUWC0+bUNvbXBpbGVDdHgtPmdldEV4ZWN1dGFibGUoKS0+Z2V0QXN0TWFjaGluZSgpOworCQljb25zdCBNYWNoaW5lICogdGFyZ2V0ID0KKwkJCQlnb3RvVGFyZ2V0LnRvX3B0cjwgSW5zdGFuY2VPZk1hY2hpbmUgPigpLT5nZXRBc3RNYWNoaW5lKCk7CisKKwkJY29uc3QgTWFjaGluZSAqIGxjYU1hY2hpbmUgPSBzb3VyY2UtPkxDUkEodGFyZ2V0KTsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggbGNhTWFjaGluZSApCisJCQkJPDwgIlVuZXhwZWN0ZWQgYSA8bnVsbD4gTENBKCAiCisJCQkJPDwgc291cmNlLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8ICIgLCAiCisJCQkJPDwgdGFyZ2V0LT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8ICIgKSIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJQkZDb2RlIGRpc2FibGVDb2RlKCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0RJU0FCTEVfSU5WT0tFICk7CisJCUJGQ29kZSBlbmFibGVDb2RlICggT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9FTkFCTEVfSU5WT0tFICApOworCQlCRkxpc3QgbGlzdE9mRW5hYmxlVGFyZ2V0OworCisJCWlmKCAoc291cmNlICE9IGxjYU1hY2hpbmUpCisJCQkmJiAoc291cmNlLT5nZXRDb250YWluZXJNYWNoaW5lKCkgIT0gbGNhTWFjaGluZSkgKQorCQl7CisJCQlhdm1fdWludGVnZXJfdCBkaXNhYmxlTGV2ZWwgPSAxOworCisJCQljb25zdCBNYWNoaW5lICogY29udGFpbmVyT2ZTb3VyY2UgPSBzb3VyY2UtPmdldENvbnRhaW5lck1hY2hpbmUoKTsKKwkJCWZvciggOyBjb250YWluZXJPZlNvdXJjZSAhPSBsY2FNYWNoaW5lIDsgKytkaXNhYmxlTGV2ZWwgKQorCQkJeworCQkJCWNvbnRhaW5lck9mU291cmNlID0gY29udGFpbmVyT2ZTb3VyY2UtPmdldENvbnRhaW5lck1hY2hpbmUoKTsKKwkJCX0KKworCQkJZGlzYWJsZUNvZGUgPSBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3T3B0aU5vcENvZGUoCisJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfRElTQUJMRV9TRUxWRVMsCisJCQkJCUV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3VUludGVnZXIoZGlzYWJsZUxldmVsKSwKKwkJCQkJQVZNX0FSR19CVUlMVElOX0tJTkQpOworCQl9CisJCWlmKCB0YXJnZXQgIT0gbGNhTWFjaGluZSApCisJCXsKKwkJCWNvbnN0IE1hY2hpbmUgKiBjb250YWluZXJPZk1hY2hpbmUgPSB0YXJnZXQ7CisJCQlmb3IoIDsgY29udGFpbmVyT2ZNYWNoaW5lICE9IGxjYU1hY2hpbmUgOworCQkJCWNvbnRhaW5lck9mTWFjaGluZSA9IGNvbnRhaW5lck9mTWFjaGluZS0+Z2V0Q29udGFpbmVyTWFjaGluZSgpICkKKwkJCXsKKwkJCQlsaXN0T2ZFbmFibGVUYXJnZXQucHVzaF9mcm9udCgKKwkJCQkJZ2V0U3ltYm9sVGFibGUoKS5zZWFyY2hJbnN0YW5jZVN0YXRpYyhjb250YWluZXJPZk1hY2hpbmUpICk7CisJCQl9CisJCQllbmFibGVDb2RlLmFwcGVuZCggbGlzdE9mRW5hYmxlVGFyZ2V0ICk7CisKKwkJCWlmKCBmbG93U3RhdGVtZW50LnZhbGlkKCkgKQorCQkJeworCQkJCWVuYWJsZUNvZGUgPSBBdm1jb2RlU3Ryb25nU2VxdWVuY2VDb21waWxlcjo6YXRvbWl6ZVNlcXVlbmNlKAorCQkJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGVGbGF0KAorCQkJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NFUVVFTkNFLAorCQkJCQkJCQllbmFibGVDb2RlLCBmbG93U3RhdGVtZW50KSApOworCQkJfQorCQl9CisKKworCQlpZiggc291cmNlICE9IGxjYU1hY2hpbmUgKSAvLyBmb3IgZGlzYWJsZSBzZWxmCisJCXsKKwkJCWlmKCBlbmFibGVDb2RlLT5ub25lbXB0eSgpICkKKwkJCXsKKwkJCQlyZXR1cm4oIEF2bWNvZGVTdHJvbmdTZXF1ZW5jZUNvbXBpbGVyOjphdG9taXplU2VxdWVuY2UoCisJCQkJCQlTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZUZsYXQoCisJCQkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU0VRVUVOQ0UsCisJCQkJCQkJCWRpc2FibGVDb2RlLCBlbmFibGVDb2RlKSApKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4oIGRpc2FibGVDb2RlICk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4oIGVuYWJsZUNvZGUgKTsKKwkJfQorCisvLwkJcmV0dXJuKCBjb21waWxlU3RhdGVtZW50UGFyYW1zKGFDVFgsIGFDb2RlKSApOworCX0KK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIFNDSEVEVUxFIFNUQVRFTUVOVCBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkZDb2RlIEF2bWNvZGVSdGNTdGF0ZW1lbnRDb21waWxlcjo6Y29tcGlsZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJaWYoIGFDb2RlLT5lbXB0eSgpICkKKwl7CisJCWFDb2RlLT5hcHBlbmQoIEV4ZWN1dGFibGVMaWI6Ok1BQ0hJTkVfU0VMRiApOworCQlyZXR1cm4oIGFDb2RlICk7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiggQXZtY29kZUFjdGl2aXR5U3RhdGVtZW50Q29tcGlsZXI6OgorCQkJCWNvbXBpbGVTdGF0ZW1lbnQoYUNUWCwgYUNvZGUpICk7CisJfQorfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIFNDSEVEVUxFI0lOVk9LRSBTVEFURU1FTlQgQ09NUElMQVRJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0JGQ29kZSBBdm1jb2RlU2NoZWR1bGVTdGF0ZW1lbnRDb21waWxlcjo6Y29tcGlsZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJaWYoIGFDb2RlLT5lbXB0eSgpICkKKwl7CisJCWFDb2RlLT5hcHBlbmQoIEV4ZWN1dGFibGVMaWI6Ok1BQ0hJTkVfU0VMRiApOworCQlyZXR1cm4oIGFDb2RlICk7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiggQXZtY29kZUFjdGl2aXR5U3RhdGVtZW50Q29tcGlsZXI6OgorCQkJCWNvbXBpbGVTdGF0ZW1lbnQoYUNUWCwgYUNvZGUpICk7CisJfQorfQorCisKK0JGQ29kZSBBdm1jb2RlU2NoZWR1bGVTdGF0ZW1lbnRDb21waWxlcjo6b3B0aW1pemVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCWlmKCBhQ29kZS0+ZW1wdHkoKSApCisJeworCQlhQ29kZS0+YXBwZW5kKCBFeGVjdXRhYmxlTGliOjpNQUNISU5FX1NFTEYgKTsKKwl9CisKKy8vCUV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlID0gZ2V0RXhlY3V0YWJsZU1hY2hpbmUoYUNUWCwgYUNvZGUtPmZpcnN0KCkpOworLy8KKy8vCWlmKCAoYW5FeGVjdXRhYmxlICE9IE5VTEwpICYmIGFuRXhlY3V0YWJsZS0+aGFzT25TY2hlZHVsZSgpICYmCisvLwkJCWFuRXhlY3V0YWJsZS0+aXNJbmxpbmFibGVTY2hlZHVsZSgpICkKKy8vCXsKKy8vCQlCRkNvZGUgb3B0aUNvZGUgPSBBVk1DT0RFX0NPTVBJTEVSLm9wdGltaXplU3RhdGVtZW50KAorLy8JCQkJYUNUWC0+bmV3Q1RYKGFuRXhlY3V0YWJsZSksIGFuRXhlY3V0YWJsZS0+Z2V0T25TY2hlZHVsZSgpICk7CisvLworLy9BVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBDT01QVVRJTkcgLCBTVEFURU1FTlQgKQorLy8JCXJldHVybiggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGVGbGF0TWlkZGxlKAorLy8JCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BVE9NSUNfU0VRVUVOQ0UsCisvLworLy8JCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvbW1lbnQoCisvLwkJCQkJCSJiZWdpbjxzY2hlZHVsZT4gIiArIGFuRXhlY3V0YWJsZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSApLAorLy8KKy8vCQkJCW9wdGlDb2RlLAorLy8KKy8vCQkJCVN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb21tZW50KAorLy8JCQkJCQkiZW5kPHNjaGVkdWxlPiAiICsgYW5FeGVjdXRhYmxlLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpKSApKTsKKy8vCisvL0FWTV9FTFNFCisvLworLy8JCXJldHVybiggb3B0aUNvZGUgKTsKKy8vCisvL0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIENPTVBVVElORyAsIFNUQVRFTUVOVCApCisvLwl9CisKKwlyZXR1cm4oIEF2bWNvZGVBY3Rpdml0eVN0YXRlbWVudENvbXBpbGVyOjpvcHRpbWl6ZVN0YXRlbWVudChhQ1RYLCBhQ29kZSkgKTsKK30KKworCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFWTUNPREUgU0NIRURVTEUjSU4gU1RBVEVNRU5UIENPTVBJTEFUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitCRiBBdm1jb2RlU2NoZWR1bGVJblN0YXRlbWVudENvbXBpbGVyOjpjb21waWxlRXhwcmVzc2lvbigKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJaWYoIGFDb2RlLT5zaXplKCkgPT0gMiApCisJeworCQlCRiBtYWNoaW5lID0gY29tcGlsZUFyZ1J2YWx1ZShhQ1RYLCBUeXBlTWFuYWdlcjo6TUFDSElORSwgYUNvZGUtPnNlY29uZCgpKTsKKworCQlpZiggbWFjaGluZS5pczwgSW5zdGFuY2VPZk1hY2hpbmUgPigpICkKKwkJeworCQkJYUNUWCA9IGFDVFgtPm5ld0NUWCgKKwkJCQkJbWFjaGluZS50b19wdHI8IEluc3RhbmNlT2ZNYWNoaW5lID4oKS0+Z2V0RXhlY3V0YWJsZSgpICk7CisJCX0KKwkJQkYgc3VibWFjaGluZSA9IGNvbXBpbGVBcmdSdmFsdWUoYUNUWCwgVHlwZU1hbmFnZXI6Ok1BQ0hJTkUsIGFDb2RlLT5maXJzdCgpKTsKKworCQlCRkNvZGUgbmV3Q29kZSggYUNvZGUtPmdldE9wZXJhdG9yKCksIHN1Ym1hY2hpbmUsIG1hY2hpbmUpOworCisJCXJldHVybiggbmV3Q29kZSApOworCX0KKwllbHNlCisJeworCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCTw8ICJVbmV4cGVjdGVkIEVOQUJMRSNTRVQgU1RBVEVNRU5UIHdpdGggbW9yZSAiCisJCQkJCSJ0aGFuIG9uZSBydW5uaW5nIG1hY2hpbmUgYXMgcGFyYW1ldGVyICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJcmV0dXJuKCBhQ29kZSApOworCX0KK30KKworCitCRiBBdm1jb2RlU2NoZWR1bGVJblN0YXRlbWVudENvbXBpbGVyOjpvcHRpbWl6ZUV4cHJlc3Npb24oCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCUF2bUluc3RydWN0aW9uICogYXJnc0luc3RydWN0aW9uID0gYUNvZGUtPmdlbkluc3RydWN0aW9uKCk7CisKKwlhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLmR0eXBlID0gVHlwZU1hbmFnZXI6Ok1BQ0hJTkU7CisJc2V0QXJnY29kZVJWYWx1ZShhQ1RYLCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLCBhQ29kZS0+Zmlyc3QoKSk7CisKKwlhcmdzSW5zdHJ1Y3Rpb24tPmF0KDEpLmR0eXBlID0gYXJnc0luc3RydWN0aW9uLT5hdCgwKS5kdHlwZTsKKwlzZXRBcmdjb2RlUlZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMSksIGFDb2RlLT5zZWNvbmQoKSk7CisKKwlhcmdzSW5zdHJ1Y3Rpb24tPmNvbXB1dGVNYWluQnl0ZWNvZGUoCisJCQkvKmNvbnRleHQgICovIEFWTV9BUkdfUkVUVVJOX0NUWCwKKwkJCS8qcHJvY2Vzc29yKi8gQVZNX0FSR19NRU1PUllfTUFDSElORV9DUFUsCisJCQkvKm9wZXJhdGlvbiovIEFWTV9BUkdfU0VWQUxfUlZBTFVFLAorCQkJLypvcGVyYW5kICAqLyBBVk1fQVJHX0VYUFJFU1NJT05fS0lORCwKKwkJCS8qZHR5cGUgICAgKi8gVHlwZU1hbmFnZXI6Ok1BQ0hJTkUpOworCisJcmV0dXJuKCBhQ29kZSApOworfQorCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFWTUNPREUgSU5QVVRfRU5BQkxFRCBTVEFURU1FTlQgQ09NUElMQVRJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0JGQ29kZSBBdm1jb2RlSW5wdXRFbmFibGVkU3RhdGVtZW50Q29tcGlsZXI6OmNvbXBpbGVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCUJGQ29kZSBuZXdDb2RlKCBhQ29kZS0+Z2V0T3BlcmF0b3IoKSwKKwkJCUFic3RyYWN0QXZtY29kZUNvbXBpbGVyOjpjb21waWxlU3RhdGVtZW50Q29kZShhQ1RYLAorCQkJCQlhQ29kZS0+Zmlyc3QoKS5iZkNvZGUoKSkgKTsKKworCXJldHVybiggbmV3Q29kZSApOworfQorCisKK0JGQ29kZSBBdm1jb2RlSW5wdXRFbmFibGVkU3RhdGVtZW50Q29tcGlsZXI6Om9wdGltaXplU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlCRkNvZGUgb3B0Q29kZSggYUNvZGUtPmdldE9wZXJhdG9yKCkgKTsKKworCW9wdENvZGUtPmFwcGVuZCggQVZNQ09ERV9DT01QSUxFUi5vcHRpbWl6ZVN0YXRlbWVudChhQ1RYLAorCQkJYUNvZGUtPmZpcnN0KCkuYmZDb2RlKCkgKSk7CisKKwlyZXR1cm4oIG9wdENvZGUgKTsKK30KKworCisKKworfQorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlQWN0aXZpdHlDb21waWxlci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZUFjdGl2aXR5Q29tcGlsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2Y4ODBlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZUFjdGl2aXR5Q29tcGlsZXIuaApAQCAtMCwwICsxLDk1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTIgYXZyLiAyMDExCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQVZNQ09ERUFDVElWSVRZQ09NUElMRVJfSF8KKyNkZWZpbmUgQVZNQ09ERUFDVElWSVRZQ09NUElMRVJfSF8KKworI2luY2x1ZGUgPGJ1aWxkZXIvcHJpbWl0aXZlL0Fic3RyYWN0QXZtY29kZUNvbXBpbGVyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK0FWTUNPREVfQ09NUElMRVJfU1RBVEVNRU5UX09QVElNSVpFUl9DTEFTU19IRUFERVIoIkFDVElWSVRZI1NUQVRFTUVOVCIsCisJCUFjdGl2aXR5U3RhdGVtZW50LCBBYnN0cmFjdEF2bWNvZGVDb21waWxlcikKKworCUJGQ29kZSBjb21waWxlU3RhdGVtZW50UGFyYW1zKAorCQkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpOworfTsKKworCitBVk1DT0RFX0NPTVBJTEVSX1NUQVRFTUVOVF9PUFRJTUlaRVJfQ0xBU1MoIkNPTlRFWFRfU1dJVENIRVIiLAorCQlDb250ZXh0U3dpdGNoZXJTdGF0ZW1lbnQsIEF2bWNvZGVBY3Rpdml0eVN0YXRlbWVudENvbXBpbGVyKQorCisKK0FWTUNPREVfQ09NUElMRVJfU1RBVEVNRU5UX09QVElNSVpFUl9DTEFTUygiSUVOQUJMRSIsCisJCUlFbmFibGVTdGF0ZW1lbnQsIEF2bWNvZGVBY3Rpdml0eVN0YXRlbWVudENvbXBpbGVyKQorCitBVk1DT0RFX0NPTVBJTEVSX1NUQVRFTUVOVF9PUFRJTUlaRVJfQ0xBU1MoIkVOQUJMRSIsCisJCUVuYWJsZVN0YXRlbWVudCwgQXZtY29kZUFjdGl2aXR5U3RhdGVtZW50Q29tcGlsZXIpCisKKworQVZNQ09ERV9DT01QSUxFUl9TVEFURU1FTlRfT1BUSU1JWkVSX0NMQVNTKCJJRElTQUJMRSIsCisJCUlEaXNhYmxlU3RhdGVtZW50LCBBdm1jb2RlQWN0aXZpdHlTdGF0ZW1lbnRDb21waWxlcikKKworQVZNQ09ERV9DT01QSUxFUl9TVEFURU1FTlRfT1BUSU1JWkVSX0NMQVNTKCJESVNBQkxFIiwKKwkJRGlzYWJsZVN0YXRlbWVudCwgQXZtY29kZUFjdGl2aXR5U3RhdGVtZW50Q29tcGlsZXIpCisKK0FWTUNPREVfQ09NUElMRVJfU1RBVEVNRU5UX09QVElNSVpFUl9DTEFTUygiRElTQUJMRSNTRUxWRVMiLAorCQlEaXNhYmxlU2VsdmVzU3RhdGVtZW50LCBBdm1jb2RlQWN0aXZpdHlTdGF0ZW1lbnRDb21waWxlcikKKworCitBVk1DT0RFX0NPTVBJTEVSX1NUQVRFTUVOVF9PUFRJTUlaRVJfQ0xBU1MoIklBQk9SVCIsCisJCUlBYm9ydFN0YXRlbWVudCwgQXZtY29kZUFjdGl2aXR5U3RhdGVtZW50Q29tcGlsZXIpCisKK0FWTUNPREVfQ09NUElMRVJfU1RBVEVNRU5UX09QVElNSVpFUl9DTEFTUygiQUJPUlQiLAorCQlBYm9ydFN0YXRlbWVudCwgQXZtY29kZUFjdGl2aXR5U3RhdGVtZW50Q29tcGlsZXIpCisKK0FWTUNPREVfQ09NUElMRVJfU1RBVEVNRU5UX09QVElNSVpFUl9DTEFTUygiQUJPUlQjU0VMVkVTIiwKKwkJQWJvcnRTZWx2ZXNTdGF0ZW1lbnQsIEF2bWNvZGVBY3Rpdml0eVN0YXRlbWVudENvbXBpbGVyKQorCisKKworQVZNQ09ERV9DT01QSUxFUl9TVEFURU1FTlRfQ0xBU1MoIkZPUksiLAorCQlGb3JrU3RhdGVtZW50LCBBdm1jb2RlQWN0aXZpdHlTdGF0ZW1lbnRDb21waWxlcikKKworQVZNQ09ERV9DT01QSUxFUl9TVEFURU1FTlRfQ0xBU1MoIkpPSU4iLAorCQlKb2luU3RhdGVtZW50LCBBdm1jb2RlQWN0aXZpdHlTdGF0ZW1lbnRDb21waWxlcikKKworCitBVk1DT0RFX0NPTVBJTEVSX1NUQVRFTUVOVF9DTEFTUygiR09UTyIsCisJCUdvdG9TdGF0ZW1lbnQsIEF2bWNvZGVBY3Rpdml0eVN0YXRlbWVudENvbXBpbGVyKQorCisKK0FWTUNPREVfQ09NUElMRVJfU1RBVEVNRU5UX0NMQVNTKCJSVEMiLAorCQlSdGNTdGF0ZW1lbnQsIEF2bWNvZGVBY3Rpdml0eVN0YXRlbWVudENvbXBpbGVyKQorCisKK0FWTUNPREVfQ09NUElMRVJfU1RBVEVNRU5UX09QVElNSVpFUl9DTEFTUygiU0NIRURVTEUiLAorCQlTY2hlZHVsZVN0YXRlbWVudCwgQXZtY29kZUFjdGl2aXR5U3RhdGVtZW50Q29tcGlsZXIpCisKK0FWTUNPREVfQ09NUElMRVJfRVhQUkVTU0lPTl9PUFRJTUlaRVJfQ0xBU1MoIlNDSEVEVUxFI0lOIiwKKwkJU2NoZWR1bGVJblN0YXRlbWVudCwgQXZtY29kZUFjdGl2aXR5U3RhdGVtZW50Q29tcGlsZXIpCisKKworQVZNQ09ERV9DT01QSUxFUl9TVEFURU1FTlRfT1BUSU1JWkVSX0NMQVNTKCJJTlBVVF9FTkFCTEVEIiwKKwkJSW5wdXRFbmFibGVkU3RhdGVtZW50LCBBYnN0cmFjdEF2bWNvZGVDb21waWxlcikKKworCisKK30KKworI2VuZGlmIC8qIEFWTUNPREVBQ1RJVklUWUNPTVBJTEVSX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlQXNzaWduQ29tcGlsZXIuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZUFzc2lnbkNvbXBpbGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWY2ZTc3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZUFzc2lnbkNvbXBpbGVyLmNwcApAQCAtMCwwICsxLDQyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDEyIGF2ci4gMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQXZtY29kZUFzc2lnbkNvbXBpbGVyLmgiCisKKyNpbmNsdWRlIDxjb21wdXRlci9pbnN0cnVjdGlvbi9Bdm1JbnN0cnVjdGlvbi5oPgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQXZtQ29kZS5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25Db25zdHJ1Y3Rvci5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL1N0YXRlbWVudENvbnN0cnVjdG9yLmg+CisKKyNpbmNsdWRlIDxmbWwvb3BlcmF0b3IvT3BlcmF0b3JNYW5hZ2VyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIEFTU0lHTiBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworaW5saW5lIEJGIEF2bWNvZGVBc3NpZ25Db21waWxlcjo6Y29tcGlsZUV4cHJlc3Npb24oCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCXJldHVybiggY29tcGlsZVN0YXRlbWVudChhQ1RYLCBhQ29kZSkgKTsKK30KKworaW5saW5lIEJGIEF2bWNvZGVBc3NpZ25Db21waWxlcjo6b3B0aW1pemVFeHByZXNzaW9uKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlBdm1JbnN0cnVjdGlvbiAqIGFyZ3NJbnN0cnVjdGlvbiA9IGFDb2RlLT5nZW5JbnN0cnVjdGlvbigpOworCisJc2V0QXJnY29kZUxWYWx1ZShhQ1RYLCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLCBhQ29kZS0+Zmlyc3QoKSk7CisKKwlvcHRpbWl6ZUFyZ0V4cHJlc3Npb24oYUNUWCwgYUNvZGUsIDEpOworCWFyZ3NJbnN0cnVjdGlvbi0+YXQoMSkuZHR5cGUgPSBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLmR0eXBlOworCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdCgxKSwgYUNvZGUtPnNlY29uZCgpKTsKKworCWFyZ3NJbnN0cnVjdGlvbi0+Y29tcHV0ZU1haW5CeXRlY29kZSgKKwkJCS8qY29udGV4dCAgKi8gQVZNX0FSR19SRVRVUk5fQ1RYLAorCQkJLypwcm9jZXNzb3IqLyBBVk1fQVJHX01FTU9SWV9SVkFMVUVfQ1BVLAorCQkJLypvcGVyYXRpb24qLyBBVk1fQVJHX1NFVkFMX1JWQUxVRSwKKwkJCS8qb3BlcmFuZCAgKi8gQVZNX0FSR19FWFBSRVNTSU9OX0tJTkQsCisJCQkvKmR0eXBlICAgICovIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMCkuZHR5cGUpOworCisJcmV0dXJuKCBhQ29kZSApOworfQorCisKK2lubGluZSBCRkNvZGUgQXZtY29kZUFzc2lnbkNvbXBpbGVyOjpjb21waWxlU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlCRiBsdmFsdWUgPSBjb21waWxlQXJnTHZhbHVlKGFDVFgsIGFDb2RlLT5maXJzdCgpKTsKKworCWlmKCBsdmFsdWUuaXM8IEluc3RhbmNlT2ZEYXRhID4oKSApCisJeworCQlhQ1RYID0gYUNUWC0+Y2xvbmUoCisJCQkJbHZhbHVlLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpLT5nZXRUeXBlU3BlY2lmaWVyKCkgKTsKKwl9CisKKwlCRiBydmFsdWUgPSBjb21waWxlQXJnUnZhbHVlKGFDVFgsIGFDb2RlLT5zZWNvbmQoKSk7CisKKwlCRkNvZGUgY29tcGlsQ29kZSA9IFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJYUNvZGUtPmdldE9wZXJhdG9yKCksIGx2YWx1ZSwgcnZhbHVlICk7CisKKwlyZXR1cm4oIGNvbXBpbENvZGUgKTsKK30KKworLy8gbHZhbHVlID06IHJ2YWx1ZTsgID09PiAgWyBsdmFsdWUgLCBydmFsdWUgXQorQkZDb2RlIEF2bWNvZGVBc3NpZ25Db21waWxlcjo6b3B0aW1pemVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCUF2bUluc3RydWN0aW9uICogYXJnc0luc3RydWN0aW9uID0gYUNvZGUtPmdlbkluc3RydWN0aW9uKCk7CisKKwlzZXRBcmdjb2RlTFZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMCksIGFDb2RlLT5maXJzdCgpKTsKKworCW9wdGltaXplQXJnRXhwcmVzc2lvbihhQ1RYLCBhQ29kZSwgMSk7CisJYXJnc0luc3RydWN0aW9uLT5hdCgxKS5kdHlwZSA9IGFyZ3NJbnN0cnVjdGlvbi0+YXQoMCkuZHR5cGU7CisJc2V0QXJnY29kZVJWYWx1ZShhQ1RYLCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDEpLCBhQ29kZS0+c2Vjb25kKCkpOworCisJYXJnc0luc3RydWN0aW9uLT5jb21wdXRlTWFpbkJ5dGVjb2RlKAorCQkJLypjb250ZXh0ICAqLyBBVk1fQVJHX1NUQU5EQVJEX0NUWCwKKwkJCS8qcHJvY2Vzc29yKi8gQVZNX0FSR19TVEFURU1FTlRfQ1BVLAorCQkJLypvcGVyYXRpb24qLyBBVk1fQVJHX1NFVkFMX1JWQUxVRSwKKwkJCS8qb3BlcmFuZCAgKi8gQVZNX0FSR19TVEFURU1FTlRfS0lORCwKKwkJCS8qZHR5cGUgICAgKi8gYXJnc0luc3RydWN0aW9uLT5hdCgwKS5kdHlwZSk7CisKKwlyZXR1cm4oIGFDb2RlICk7Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQVZNQ09ERSBBU1NJR04gQUZURVIgQ09NUElMQVRJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2lubGluZSBCRiBBdm1jb2RlQXNzaWduQWZ0ZXJDb21waWxlcjo6Y29tcGlsZUV4cHJlc3Npb24oCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCUJGIGx2YWx1ZSA9IGNvbXBpbGVBcmdMdmFsdWUoYUNUWCwgYUNvZGUtPmZpcnN0KCkpOworCisJaWYoIGx2YWx1ZS5pczwgSW5zdGFuY2VPZkRhdGEgPigpICkKKwl7CisJCWFDVFggPSBhQ1RYLT5jbG9uZSgKKwkJCQlsdmFsdWUudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCktPmdldFR5cGVTcGVjaWZpZXIoKSApOworCX0KKworCXJldHVybiggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoIGFDb2RlLT5nZXRPcGVyYXRvcigpLAorCQkJbHZhbHVlLCBsdmFsdWUsIGNvbXBpbGVBcmdSdmFsdWUoYUNUWCwgYUNvZGUtPnNlY29uZCgpKSApICk7Cit9CisKK2lubGluZSBCRiBBdm1jb2RlQXNzaWduQWZ0ZXJDb21waWxlcjo6b3B0aW1pemVFeHByZXNzaW9uKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlBdm1JbnN0cnVjdGlvbiAqIGFyZ3NJbnN0cnVjdGlvbiA9IGFDb2RlLT5nZW5JbnN0cnVjdGlvbigpOworCisJc2V0QXJnY29kZUxWYWx1ZShhQ1RYLCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLCBhQ29kZS0+Zmlyc3QoKSk7CisKKwlhcmdzSW5zdHJ1Y3Rpb24tPmF0KDEpLmR0eXBlID0gYXJnc0luc3RydWN0aW9uLT5hdCgwKS5kdHlwZTsKKwlzZXRBcmdjb2RlUlZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMSksIGFDb2RlLT5zZWNvbmQoKSk7CisKKwlvcHRpbWl6ZUFyZ0V4cHJlc3Npb24oYUNUWCwgYUNvZGUsIDIpOworCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdCgyKSwgYUNvZGUtPnRoaXJkKCkpOworCisJYXJnc0luc3RydWN0aW9uLT5jb21wdXRlTWFpbkJ5dGVjb2RlKAorCQkJLypjb250ZXh0ICAqLyBBVk1fQVJHX1JFVFVSTl9DVFgsCisJCQkvKnByb2Nlc3NvciovIEFWTV9BUkdfTUVNT1JZX1JWQUxVRV9DUFUsCisJCQkvKm9wZXJhdGlvbiovIEFWTV9BUkdfU0VWQUxfUlZBTFVFLAorCQkJLypvcGVyYW5kICAqLyBBVk1fQVJHX0VYUFJFU1NJT05fS0lORCwKKwkJCS8qZHR5cGUgICAgKi8gYXJnc0luc3RydWN0aW9uLT5hdCgwKS5kdHlwZSk7CisKKwlyZXR1cm4oIGFDb2RlICk7Cit9CisKKworaW5saW5lIEJGQ29kZSBBdm1jb2RlQXNzaWduQWZ0ZXJDb21waWxlcjo6Y29tcGlsZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJQkYgbHZhbHVlID0gY29tcGlsZUFyZ0x2YWx1ZShhQ1RYLCBhQ29kZS0+Zmlyc3QoKSk7CisKKwlpZiggbHZhbHVlLmlzPCBJbnN0YW5jZU9mRGF0YSA+KCkgKQorCXsKKwkJYUNUWCA9IGFDVFgtPmNsb25lKAorCQkJCWx2YWx1ZS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKS0+Z2V0VHlwZVNwZWNpZmllcigpICk7CisJfQorCisJcmV0dXJuKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZShPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FTU0lHTiwKKwkJCWx2YWx1ZSwgY29tcGlsZUFyZ1J2YWx1ZShhQ1RYLCBhQ29kZS0+c2Vjb25kKCkpICkgKTsKK30KKworLy8gbHZhbHVlID06IHJ2YWx1ZTsgID09PiAgWyBsdmFsdWUgLCBydmFsdWUgXQorQkZDb2RlIEF2bWNvZGVBc3NpZ25BZnRlckNvbXBpbGVyOjpvcHRpbWl6ZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCTw8ICJVbmV4cGVjdGVkIGludm9rZSBvZiBBU1NJR04jQUZURVIgIgorCQkJCSJzdGF0ZW1lbnQgY29tcGlsYXRpb24gb3B0aW1pemVyICEhISIKKwkJCTw8IFNFTkRfRVhJVDsKKworCXJldHVybiggYUNvZGUgKTsKK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIEFTU0lHTiBPUCBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gbHZhbHVlIG9wIDo9IHJ2YWx1ZTsgID09PiAgWyBsdmFsdWUgLCBWQUxbbHZhbHVlXSBvcCBydmFsdWUgXQoraW5saW5lIEJGIEF2bWNvZGVBc3NpZ25PcENvbXBpbGVyOjpjb21waWxlRXhwcmVzc2lvbigKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJQkZDb2RlIGV4cHIgPSBhQ29kZS0+c2Vjb25kKCkuYmZDb2RlKCk7CisJZXhwciA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q29kZShleHByLT5nZXRPcGVyYXRvcigpLAorCQkJYUNvZGUtPmZpcnN0KCksIGV4cHItPmZpcnN0KCkpOworCisJZXhwciA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQVNTSUdOLCBhQ29kZS0+Zmlyc3QoKSwgZXhwcik7CisKKwlyZXR1cm4oIEFWTUNPREVfQ09NUElMRVIuY29tcGlsZUV4cHJlc3Npb24oYUNUWCwgZXhwcikgKTsKK30KKworCitpbmxpbmUgQkZDb2RlIEF2bWNvZGVBc3NpZ25PcENvbXBpbGVyOjpjb21waWxlU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlCRkNvZGUgZXhwciA9IGFDb2RlLT5zZWNvbmQoKS5iZkNvZGUoKTsKKwlleHByID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlKGV4cHItPmdldE9wZXJhdG9yKCksCisJCQlhQ29kZS0+Zmlyc3QoKSwgZXhwci0+Zmlyc3QoKSk7CisKKwlleHByID0gU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FTU0lHTiwgYUNvZGUtPmZpcnN0KCksIGV4cHIpOworCisJcmV0dXJuKCBBVk1DT0RFX0NPTVBJTEVSLmNvbXBpbGVTdGF0ZW1lbnQoYUNUWCwgZXhwcikgKTsKK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIEFTU0lHTiBPUCBBRlRFUiBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gbHZhbHVlID06IG9wIHJ2YWx1ZTsgID09PiAgWyBsdmFsdWUgLCBWQUxbbHZhbHVlXSAsIChWQUxbbHZhbHVlXSBvcCBydmFsdWUpIF0KK2lubGluZSBCRiBBdm1jb2RlQXNzaWduT3BBZnRlckNvbXBpbGVyOjpjb21waWxlRXhwcmVzc2lvbigKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJQkZDb2RlIGV4cHIgPSBhQ29kZS0+c2Vjb25kKCkuYmZDb2RlKCk7CisJZXhwciA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q29kZShleHByLT5nZXRPcGVyYXRvcigpLAorCQkJYUNvZGUtPmZpcnN0KCksIGV4cHItPmZpcnN0KCkpOworCisJZXhwciA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQVNTSUdOX0FGVEVSLCBhQ29kZS0+Zmlyc3QoKSwgZXhwcik7CisKKwlyZXR1cm4oIEFWTUNPREVfQ09NUElMRVIuY29tcGlsZUV4cHJlc3Npb24oYUNUWCwgZXhwcikgKTsKK30KKworCitpbmxpbmUgQkZDb2RlIEF2bWNvZGVBc3NpZ25PcEFmdGVyQ29tcGlsZXI6OmNvbXBpbGVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCUJGQ29kZSBleHByID0gYUNvZGUtPnNlY29uZCgpLmJmQ29kZSgpOworCWV4cHIgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NvZGUoZXhwci0+Z2V0T3BlcmF0b3IoKSwKKwkJCWFDb2RlLT5maXJzdCgpLCBleHByLT5maXJzdCgpKTsKKworCWV4cHIgPSBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQVNTSUdOLCBhQ29kZS0+Zmlyc3QoKSwgZXhwcik7CisKKwlyZXR1cm4oIEFWTUNPREVfQ09NUElMRVIuY29tcGlsZVN0YXRlbWVudChhQ1RYLCBleHByKSApOworfQorCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFWTUNPREUgQVNTSUdOIFJFRkVSRU5DRSBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworaW5saW5lIEJGIEF2bWNvZGVBc3NpZ25SZWZDb21waWxlcjo6Y29tcGlsZUV4cHJlc3Npb24oCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCXJldHVybiggY29tcGlsZVN0YXRlbWVudChhQ1RYLCBhQ29kZSkgKTsKK30KKworaW5saW5lIEJGIEF2bWNvZGVBc3NpZ25SZWZDb21waWxlcjo6b3B0aW1pemVFeHByZXNzaW9uKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlCRkNvZGUgb3B0Q29kZSA9IG9wdGltaXplU3RhdGVtZW50KGFDVFgsIGFDb2RlKTsKKworCW9wdENvZGUtPmdldEluc3RydWN0aW9uKCktPnNldE1haW5PcGVyYW5kKCBBVk1fQVJHX0VYUFJFU1NJT05fS0lORCApOworCisJcmV0dXJuKCBvcHRDb2RlICk7Cit9CisKKworaW5saW5lIEJGQ29kZSBBdm1jb2RlQXNzaWduUmVmQ29tcGlsZXI6OmNvbXBpbGVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCUJGIGx2YWx1ZSA9IGNvbXBpbGVBcmdMdmFsdWUoYUNUWCwgYUNvZGUtPmZpcnN0KCkpOworCisJaWYoIGx2YWx1ZS5pczwgSW5zdGFuY2VPZkRhdGEgPigpICkKKwl7CisJCWFDVFggPSBhQ1RYLT5jbG9uZSgKKwkJCQlsdmFsdWUudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCktPmdldFR5cGVTcGVjaWZpZXIoKSApOworCX0KKworCXJldHVybiggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoIGFDb2RlLT5nZXRPcGVyYXRvcigpLAorCQkJbHZhbHVlLCBjb21waWxlQXJnTHZhbHVlKGFDVFgsIGFDb2RlLT5zZWNvbmQoKSkgKSApOworfQorCitCRkNvZGUgQXZtY29kZUFzc2lnblJlZkNvbXBpbGVyOjpvcHRpbWl6ZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJLy8gbHZhbHVlID06IGx2YWx1ZTsgIDw9PT4gIGx2YWx1ZSA9ICQocXVvdGUgbHZhbHVlKTsKKwlhQ29kZS0+c2V0T3BlcmF0b3IoIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQVNTSUdOICk7CisKKwlBdm1JbnN0cnVjdGlvbiAqIGFyZ3NJbnN0cnVjdGlvbiA9IGFDb2RlLT5nZW5JbnN0cnVjdGlvbigpOworCisJc2V0QXJnY29kZUxWYWx1ZVJlZihhQ1RYLCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLCBhQ29kZS0+Zmlyc3QoKSk7CisKKwlvcHRpbWl6ZUFyZ0V4cHJlc3Npb24oYUNUWCwgYUNvZGUsIDEpOworCWFyZ3NJbnN0cnVjdGlvbi0+YXQoMSkuZHR5cGUgPSBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLmR0eXBlOworCXNldEFyZ2NvZGVMVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdCgxKSwgYUNvZGUtPnNlY29uZCgpKTsKKworCWFyZ3NJbnN0cnVjdGlvbi0+Y29tcHV0ZU1haW5CeXRlY29kZSgKKwkJCS8qY29udGV4dCAgKi8gQVZNX0FSR19TVEFOREFSRF9DVFgsCisJCQkvKnByb2Nlc3NvciovIEFWTV9BUkdfU1RBVEVNRU5UX0NQVSwKKwkJCS8qb3BlcmF0aW9uKi8gQVZNX0FSR19TRVZBTF9SVkFMVUUsCisJCQkvKm9wZXJhbmQgICovIEFWTV9BUkdfU1RBVEVNRU5UX0tJTkQsCisJCQkvKmR0eXBlICAgICovIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMCkuZHR5cGUpOworCisJcmV0dXJuKCBhQ29kZSApOworfQorCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFWTUNPREUgQVNTSUdOIE1hY3JvIENPTVBJTEFUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitpbmxpbmUgQkYgQXZtY29kZUFzc2lnbk1hY3JvQ29tcGlsZXI6OmNvbXBpbGVFeHByZXNzaW9uKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlyZXR1cm4oIGNvbXBpbGVTdGF0ZW1lbnQoYUNUWCwgYUNvZGUpICk7Cit9CisKK2lubGluZSBCRiBBdm1jb2RlQXNzaWduTWFjcm9Db21waWxlcjo6b3B0aW1pemVFeHByZXNzaW9uKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlCRkNvZGUgb3B0Q29kZSA9IG9wdGltaXplU3RhdGVtZW50KGFDVFgsIGFDb2RlKTsKKworCW9wdENvZGUtPmdldEluc3RydWN0aW9uKCktPnNldE1haW5PcGVyYW5kKCBBVk1fQVJHX0VYUFJFU1NJT05fS0lORCApOworCisJcmV0dXJuKCBvcHRDb2RlICk7Cit9CisKKworaW5saW5lIEJGQ29kZSBBdm1jb2RlQXNzaWduTWFjcm9Db21waWxlcjo6Y29tcGlsZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJQkYgbHZhbHVlID0gY29tcGlsZUFyZ0x2YWx1ZShhQ1RYLCBhQ29kZS0+Zmlyc3QoKSk7CisKKwlpZiggbHZhbHVlLmlzPCBJbnN0YW5jZU9mRGF0YSA+KCkgKQorCXsKKwkJYUNUWCA9IGFDVFgtPmNsb25lKAorCQkJCWx2YWx1ZS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKS0+Z2V0VHlwZVNwZWNpZmllcigpICk7CisJfQorCisJcmV0dXJuKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSggYUNvZGUtPmdldE9wZXJhdG9yKCksCisJCQlsdmFsdWUsIGNvbXBpbGVBcmdSdmFsdWUoYUNUWCwgYUNvZGUtPnNlY29uZCgpKSApICk7Cit9CisKK0JGQ29kZSBBdm1jb2RlQXNzaWduTWFjcm9Db21waWxlcjo6b3B0aW1pemVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCS8vIGx2YWx1ZSA9OiBsdmFsdWU7ICA8PT0+ICBsdmFsdWUgPSAkKHF1b3RlIGx2YWx1ZSk7CisJYUNvZGUtPnNldE9wZXJhdG9yKCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FTU0lHTiApOworCisJQXZtSW5zdHJ1Y3Rpb24gKiBhcmdzSW5zdHJ1Y3Rpb24gPSBhQ29kZS0+Z2VuSW5zdHJ1Y3Rpb24oKTsKKworCXNldEFyZ2NvZGVMVmFsdWVNYWNybyhhQ1RYLCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLCBhQ29kZS0+Zmlyc3QoKSk7CisKKwlvcHRpbWl6ZUFyZ0V4cHJlc3Npb24oYUNUWCwgYUNvZGUsIDEpOworCWFyZ3NJbnN0cnVjdGlvbi0+YXQoMSkuZHR5cGUgPSBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLmR0eXBlOworCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdCgxKSwgYUNvZGUtPnNlY29uZCgpKTsKKwlhcmdzSW5zdHJ1Y3Rpb24tPmF0KDEpLnNldE5vcE9wZXJhdGlvbigpOworCisJYXJnc0luc3RydWN0aW9uLT5jb21wdXRlTWFpbkJ5dGVjb2RlKAorCQkJLypjb250ZXh0ICAqLyBBVk1fQVJHX1NUQU5EQVJEX0NUWCwKKwkJCS8qcHJvY2Vzc29yKi8gQVZNX0FSR19TVEFURU1FTlRfQ1BVLAorCQkJLypvcGVyYXRpb24qLyBBVk1fQVJHX1NFVkFMX1JWQUxVRSwKKwkJCS8qb3BlcmFuZCAgKi8gQVZNX0FSR19TVEFURU1FTlRfS0lORCwKKwkJCS8qZHR5cGUgICAgKi8gYXJnc0luc3RydWN0aW9uLT5hdCgwKS5kdHlwZSk7CisKKwlyZXR1cm4oIGFDb2RlICk7Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQVZNQ09ERSBBU1NJR04gVU5BUlkgQ09NUElMQVRJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2lubGluZSBCRiBBdm1jb2RlQXNzaWduVW5hcnlDb21waWxlcjo6Y29tcGlsZUV4cHJlc3Npb24oCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCXJldHVybiggY29tcGlsZVN0YXRlbWVudChhQ1RYLCBhQ29kZSkgKTsKK30KKworaW5saW5lIEJGIEF2bWNvZGVBc3NpZ25VbmFyeUNvbXBpbGVyOjpvcHRpbWl6ZUV4cHJlc3Npb24oCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCUF2bUluc3RydWN0aW9uICogYXJnc0luc3RydWN0aW9uID0gYUNvZGUtPmdlbkluc3RydWN0aW9uKCk7CisKKwlzZXRBcmdjb2RlTFZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMCksIGFDb2RlLT5maXJzdCgpKTsKKworCWFyZ3NJbnN0cnVjdGlvbi0+Y29tcHV0ZU1haW5CeXRlY29kZSgKKwkJCS8qY29udGV4dCAgKi8gQVZNX0FSR19SRVRVUk5fQ1RYLAorCQkJLypwcm9jZXNzb3IqLyBBVk1fQVJHX01FTU9SWV9SVkFMVUVfQ1BVLAorCQkJLypvcGVyYXRpb24qLyBBVk1fQVJHX1NFVkFMX1JWQUxVRSwKKwkJCS8qb3BlcmFuZCAgKi8gQVZNX0FSR19FWFBSRVNTSU9OX0tJTkQsCisJCQkvKmR0eXBlICAgICovIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMCkuZHR5cGUpOworCisJcmV0dXJuKCBhQ29kZSApOworfQorCisKK2lubGluZSBCRkNvZGUgQXZtY29kZUFzc2lnblVuYXJ5Q29tcGlsZXI6OmNvbXBpbGVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCXJldHVybiggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoIGFDb2RlLT5nZXRPcGVyYXRvcigpLAorCQkJY29tcGlsZUFyZ0x2YWx1ZShhQ1RYLCBhQ29kZS0+Zmlyc3QoKSkgKSApOworfQorCitCRkNvZGUgQXZtY29kZUFzc2lnblVuYXJ5Q29tcGlsZXI6Om9wdGltaXplU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlBdm1JbnN0cnVjdGlvbiAqIGFyZ3NJbnN0cnVjdGlvbiA9IGFDb2RlLT5nZW5JbnN0cnVjdGlvbigpOworCisJc2V0QXJnY29kZUxWYWx1ZShhQ1RYLCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLCBhQ29kZS0+Zmlyc3QoKSk7CisKKwlhcmdzSW5zdHJ1Y3Rpb24tPmNvbXB1dGVNYWluQnl0ZWNvZGUoCisJCQkvKmNvbnRleHQgICovIEFWTV9BUkdfU1RBTkRBUkRfQ1RYLAorCQkJLypwcm9jZXNzb3IqLyBBVk1fQVJHX1NUQVRFTUVOVF9DUFUsCisJCQkvKm9wZXJhdGlvbiovIEFWTV9BUkdfU0VWQUxfUlZBTFVFLAorCQkJLypvcGVyYW5kICAqLyBBVk1fQVJHX1NUQVRFTUVOVF9LSU5ELAorCQkJLypkdHlwZSAgICAqLyBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLmR0eXBlKTsKKworCXJldHVybiggYUNvZGUgKTsKK30KKworCisKK30KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZUFzc2lnbkNvbXBpbGVyLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlQXNzaWduQ29tcGlsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDMwNjlkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZUFzc2lnbkNvbXBpbGVyLmgKQEAgLTAsMCArMSw0OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDEyIGF2ci4gMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEFWTUNPREVBU1NJR05DT01QSUxFUl9IXworI2RlZmluZSBBVk1DT0RFQVNTSUdOQ09NUElMRVJfSF8KKworI2luY2x1ZGUgPGJ1aWxkZXIvcHJpbWl0aXZlL0Fic3RyYWN0QXZtY29kZUNvbXBpbGVyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK0FWTUNPREVfQ09NUElMRVJfT1BUSU1JWkVSX0NMQVNTKEFzc2lnbiwgQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXIpCisKKworQVZNQ09ERV9DT01QSUxFUl9PUFRJTUlaRVJfQ0xBU1MoQXNzaWduQWZ0ZXIsIEFic3RyYWN0QXZtY29kZUNvbXBpbGVyKQorCisKK0FWTUNPREVfQ09NUElMRVJfTk9fT1BUSU1JWkVSX0NMQVNTKCJBU1NJR04jT1AiLCBBc3NpZ25PcCwgQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXIpCisKKworQVZNQ09ERV9DT01QSUxFUl9OT19PUFRJTUlaRVJfQ0xBU1MoIkFTU0lHTiNPUCNBRlRFUiIsIEFzc2lnbk9wQWZ0ZXIsIEFic3RyYWN0QXZtY29kZUNvbXBpbGVyKQorCisKK0FWTUNPREVfQ09NUElMRVJfT1BUSU1JWkVSX0NMQVNTKEFzc2lnblJlZiwgQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXIpCisKK0FWTUNPREVfQ09NUElMRVJfT1BUSU1JWkVSX0NMQVNTKEFzc2lnbk1hY3JvLCBBYnN0cmFjdEF2bWNvZGVDb21waWxlcikKKworCitBVk1DT0RFX0NPTVBJTEVSX09QVElNSVpFUl9DTEFTUyhBc3NpZ25VbmFyeSwgQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXIpCisKKworfQorCisjZW5kaWYgLyogQVZNQ09ERUFTU0lHTkNPTVBJTEVSX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlQ29tbXVuaWNhdGlvbkNvbXBpbGVyLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVDb21tdW5pY2F0aW9uQ29tcGlsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNTBjZTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlQ29tbXVuaWNhdGlvbkNvbXBpbGVyLmNwcApAQCAtMCwwICsxLDExODIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxMiBhdnIuIDIwMTEKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkF2bWNvZGVDb21tdW5pY2F0aW9uQ29tcGlsZXIuaCIKKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0F2bUNvZGUuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uVHlwZUNoZWNrZXIuaD4KKworI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Db21Qcm90b2NvbC5oPgorCisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yTWFuYWdlci5oPgorCisjaW5jbHVkZSA8c2V3L0NvbmZpZ3VyYXRpb24uaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFWTUNPREUgSU5QVVQgU1RBVEVNRU5UIENPTVBJTEFUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitCRkNvZGUgQXZtY29kZUlucHV0Q29tcGlsZXI6OmNvbXBpbGVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCUJGQ29kZSBjb21waWxlZENvZGUgPSBjb21waWxlRXhwcmVzc2lvbkNvZGUoYUNUWCwgYUNvZGUpOworCisJY29uc3QgQkYgJiBhcmcgPSBjb21waWxlZENvZGUtPmZpcnN0KCk7CisKKwlpZiggRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc1R5cGVkKFR5cGVNYW5hZ2VyOjpQT1JULCBhcmcpICkKKwl7CisJCS8vISEgTk9USElORworCX0KKwllbHNlIGlmKCBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzVHlwZWQoVHlwZU1hbmFnZXI6Ok1FU1NBR0UsIGFyZykgKQorCXsKKworCX0KKwllbHNlLy8gaWYoIGFyZy5pczwgSW5zdGFuY2VPZkRhdGEgPigpICkKKwl7CisJCWNvbXBpbGVkQ29kZS0+c2V0T3BlcmF0b3IoT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9JTlBVVF9WQVIpOworCX0KKworCXJldHVybiggY29tcGlsZWRDb2RlICk7Cit9CisKKworQkZDb2RlIEF2bWNvZGVJbnB1dENvbXBpbGVyOjpvcHRpbWl6ZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJQkZDb2RlIG9wdGltaXplZENvZGUoIGFDb2RlLT5nZXRPcGVyYXRvcigpICk7CisKKwlBdm1JbnN0cnVjdGlvbiAqIGFyZ3NJbnN0cnVjdGlvbiA9CisJCQlvcHRpbWl6ZWRDb2RlLT5uZXdJbnN0cnVjdGlvbiggYUNvZGUtPnNpemUoKSApOworCisJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBhQ29kZS0+YmVnaW4oKTsKKwlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IGFDb2RlLT5lbmQoKTsKKworCUJGIGFyZyA9IEFWTUNPREVfQ09NUElMRVIuZGVjb2RlX29wdGltaXplRXhwcmVzc2lvbihhQ1RYLCAoKml0KSk7CisJb3B0aW1pemVkQ29kZS0+YXBwZW5kKCBhcmcgKTsKKworCWlmKCBhcmcuaXM8IEluc3RhbmNlT2ZQb3J0ID4oKSApCisJeworCQlhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLmR0eXBlID0gVHlwZU1hbmFnZXI6OlBPUlQ7CisJCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdCgwKSwgYXJnLCBmYWxzZSk7CisKKwkJSW5zdGFuY2VPZlBvcnQgKiBhUG9ydCA9IGFyZy50b19wdHI8IEluc3RhbmNlT2ZQb3J0ID4oKTsKKworCQlpZiggYVBvcnQtPmhhc0lucHV0Um91dGluZ0RhdGEoKSApCisJCXsKKwkJCWNvbnN0IFJvdXRpbmdEYXRhICYgYVJvdXRpbmdEYXRhID0gYVBvcnQtPmdldElucHV0Um91dGluZ0RhdGEoKTsKKworCQkJc3dpdGNoKCBhUm91dGluZ0RhdGEuZ2V0UHJvdG9jb2woKSApCisJCQl7CisJCQkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfRU5WSVJPTk1FTlRfS0lORDoKKwkJCQl7CisJCQkJCW9wdGltaXplZENvZGUtPnNldE9wZXJhdG9yKAorCQkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfSU5QVVRfRU5WKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfUkRWX0tJTkQ6CisJCQkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfTVVMVElSRFZfS0lORDoKKwkJCQl7CisJCQkJCW9wdGltaXplZENvZGUtPnNldE9wZXJhdG9yKAorCQkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfSU5QVVRfUkRWKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfQlVGRkVSX0tJTkQ6CisJCQkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfQlJPQURDQVNUX0tJTkQ6CisJCQkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfTVVMVElDQVNUX0tJTkQ6CisJCQkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfVU5JQ0FTVF9LSU5EOgorCQkJCWNhc2UgQ29tUHJvdG9jb2w6OlBST1RPQ09MX0FOWUNBU1RfS0lORDoKKwkJCQl7CisJCQkJCWlmKCBhUm91dGluZ0RhdGEuZ2V0QnVmZmVySW5zdGFuY2UoKS5zaW5nbGV0b24oKSApCisJCQkJCXsKKwkJCQkJCW9wdGltaXplZENvZGUtPnNldE9wZXJhdG9yKAorCQkJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0lOUFVUX0JVRkZFUik7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfVFJBTlNGRVJUX0tJTkQ6CisJCQkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfVU5ERUZJTkVEX0tJTkQ6CisJCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWF2bV9zaXplX3QgcGFyYW1Db3VudCA9IGFQb3J0LT5nZXRQYXJhbWV0ZXJDb3VudCgpOworCQlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMSA7CisJCQkJKCsraXQgIT0gZW5kSXQpICYmIChvZmZzZXQgPD0gcGFyYW1Db3VudCkgOyArK29mZnNldCApCisJCXsKKwkJCWFyZyA9IEFWTUNPREVfQ09NUElMRVIuZGVjb2RlX29wdGltaXplRXhwcmVzc2lvbihhQ1RYLCAoKml0KSk7CisJCQlvcHRpbWl6ZWRDb2RlLT5hcHBlbmQoIGFyZyApOworCisJCQlhcmdzSW5zdHJ1Y3Rpb24tPmF0KG9mZnNldCkuZHR5cGUgPSBhUG9ydC0+Z2V0UGFyYW1ldGVyVHlwZShvZmZzZXQtMSk7CisJCQlzZXRBcmdjb2RlTFZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQob2Zmc2V0KSwgYXJnKTsKKwkJfQorCisJCWFyZ3NJbnN0cnVjdGlvbi0+Y29tcHV0ZU1haW5CeXRlY29kZSgKKwkJCQkvKmNvbnRleHQgICovIEFWTV9BUkdfU1RBTkRBUkRfQ1RYLAorCQkJCS8qcHJvY2Vzc29yKi8gQVZNX0FSR19TVEFURU1FTlRfQ1BVLAorCQkJCS8qb3BlcmF0aW9uKi8gQVZNX0FSR19TRVZBTF9SVkFMVUUsCisJCQkJLypvcGVyYW5kICAqLyBBVk1fQVJHX1NUQVRFTUVOVF9LSU5EKTsKKworCQlyZXR1cm4oIG9wdGltaXplZENvZGUgKTsKKwl9CisJZWxzZSBpZiggRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc1R5cGVkKFR5cGVNYW5hZ2VyOjpQT1JULCBhcmcpICkKKwl7CisJCWFyZ3NJbnN0cnVjdGlvbi0+YXQoMCkuZHR5cGUgPSBUeXBlTWFuYWdlcjo6UE9SVDsKKwkJc2V0QXJnY29kZVJWYWx1ZShhQ1RYLCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLCBhcmcsIGZhbHNlKTsKKworCQlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMSA7ICgrK2l0ICE9IGVuZEl0KSA7ICsrb2Zmc2V0ICkKKwkJeworCQkJYXJnID0gQVZNQ09ERV9DT01QSUxFUi5kZWNvZGVfb3B0aW1pemVFeHByZXNzaW9uKGFDVFgsICgqaXQpKTsKKwkJCW9wdGltaXplZENvZGUtPmFwcGVuZCggYXJnICk7CisKKwkJCWFyZ3NJbnN0cnVjdGlvbi0+YXQob2Zmc2V0KS5kdHlwZSA9IFR5cGVNYW5hZ2VyOjpVTklWRVJTQUw7CisJCQlzZXRBcmdjb2RlTFZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQob2Zmc2V0KSwgYXJnKTsKKwkJfQorCisJCWFyZ3NJbnN0cnVjdGlvbi0+Y29tcHV0ZU1haW5CeXRlY29kZSgKKwkJCQkvKmNvbnRleHQgICovIEFWTV9BUkdfU1RBTkRBUkRfQ1RYLAorCQkJCS8qcHJvY2Vzc29yKi8gQVZNX0FSR19TVEFURU1FTlRfQ1BVLAorCQkJCS8qb3BlcmF0aW9uKi8gQVZNX0FSR19TRVZBTF9SVkFMVUUsCisJCQkJLypvcGVyYW5kICAqLyBBVk1fQVJHX1NUQVRFTUVOVF9LSU5EKTsKKworCQlyZXR1cm4oIG9wdGltaXplZENvZGUgKTsKKwl9CisJZWxzZSBpZiggRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc1R5cGVkKFR5cGVNYW5hZ2VyOjpNRVNTQUdFLCBhcmcpICkKKwl7CisJCWFyZ3NJbnN0cnVjdGlvbi0+YXQoMCkuZHR5cGUgPSBUeXBlTWFuYWdlcjo6TUVTU0FHRTsKKwkJc2V0QXJnY29kZVJWYWx1ZShhQ1RYLCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLCBhcmcsIGZhbHNlKTsKKworCQlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMSA7ICgrK2l0ICE9IGVuZEl0KSA7ICsrb2Zmc2V0ICkKKwkJeworCQkJYXJnID0gQVZNQ09ERV9DT01QSUxFUi5kZWNvZGVfb3B0aW1pemVFeHByZXNzaW9uKGFDVFgsICgqaXQpKTsKKwkJCW9wdGltaXplZENvZGUtPmFwcGVuZCggYXJnICk7CisKKwkJCWFyZ3NJbnN0cnVjdGlvbi0+YXQob2Zmc2V0KS5kdHlwZSA9IFR5cGVNYW5hZ2VyOjpVTklWRVJTQUw7CisJCQlzZXRBcmdjb2RlTFZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQob2Zmc2V0KSwgKCppdCksIGZhbHNlKTsKKwkJfQorCisJCWFyZ3NJbnN0cnVjdGlvbi0+Y29tcHV0ZU1haW5CeXRlY29kZSgKKwkJCQkvKmNvbnRleHQgICovIEFWTV9BUkdfU1RBTkRBUkRfQ1RYLAorCQkJCS8qcHJvY2Vzc29yKi8gQVZNX0FSR19TVEFURU1FTlRfQ1BVLAorCQkJCS8qb3BlcmF0aW9uKi8gQVZNX0FSR19TRVZBTF9SVkFMVUUsCisJCQkJLypvcGVyYW5kICAqLyBBVk1fQVJHX1NUQVRFTUVOVF9LSU5EKTsKKworCQlyZXR1cm4oIG9wdGltaXplZENvZGUgKTsKKwl9CisJZWxzZQorCXsKKwkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JFcnJvckNvdW50KCk7CisJCWFDVFgtPmVycm9yQ29udGV4dCggQVZNX09TX1dBUk4gKQorCQkJCTw8ICJBdm1jb2RlSW5wdXRDb21waWxlcjo6b3B0aW1pemVTdGF0ZW1lbnQgOj4gVW5leHBlY3RlZCA8PCAiCisJCQkJPDwgc3RyX2hlYWRlciggYXJnICkgPDwgIiA+PiBhcyBpbnB1dCBmaXJzdCBhcmd1bWVudCAhISEiCisJCQkJPDwgc3RkOjplbmRsOworCisJCXJldHVybiggYUNvZGUgKTsKKwl9Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFWTUNPREUgSU5QVVQjRlJPTSBTVEFURU1FTlQgQ09NUElMQVRJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0JGQ29kZSBBdm1jb2RlSW5wdXRGcm9tQ29tcGlsZXI6OmNvbXBpbGVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCWlmKCBhQ29kZS0+c2l6ZSgpID49IDIgKQorCXsKKwkJQkZDb2RlIGNvbXBpbENvZGUoIGFDb2RlLT5nZXRPcGVyYXRvcigpICk7CisKKwkJQXZtQ29kZTo6aXRlcmF0b3IgaXQgPSBhQ29kZS0+YmVnaW4oKTsKKwkJY29tcGlsQ29kZS5hcHBlbmQoCisJCQkJY29tcGlsZUFyZ1J2YWx1ZShhQ1RYLCBUeXBlTWFuYWdlcjo6UE9SVCwgKml0KSApOworCisJCWNvbXBpbENvZGUuYXBwZW5kKAorCQkJCWNvbXBpbGVBcmdSdmFsdWUoYUNUWCwgVHlwZU1hbmFnZXI6Ok1BQ0hJTkUsICooKytpdCkpICk7CisKKwkJQXZtQ29kZTo6aXRlcmF0b3IgZW5kSXQgPSBhQ29kZS0+ZW5kKCk7CisJCWZvciggKytpdCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJCXsKKwkJCWNvbXBpbENvZGUuYXBwZW5kKCBjb21waWxlQXJnTHZhbHVlKGFDVFgsICppdCkgKTsKKwkJfQorCisJCXJldHVybiggY29tcGlsQ29kZSApOworCisJfQorCWVsc2UKKwl7CisJCWdldENvbXBpbGVyVGFibGUoKS5pbmNyRXJyb3JDb3VudCgpOworCQlhQ1RYLT5lcnJvckNvbnRleHQoIEFWTV9PU19XQVJOICkKKwkJCQk8PCAiQXZtY29kZUlucHV0RnJvbUNvbXBpbGVyOjpjb21waWxlU3RhdGVtZW50IDo+ICIKKwkJCQkJIk5vdCBlbm91Z2ggcGFyYW1ldGVyIGZvciA8PCBpbnB1dF9mcm9tID4+IHN0YXRlbWVudCA8PCAiCisJCQkJPDwgc3RyX2luZGVudCggYUNvZGUgKSA8PCAiID4+ICEhISIKKwkJCQk8PCBzdGQ6OmVuZGw7CisKKwkJcmV0dXJuKCBhQ29kZSApOworCX0KK30KKworCitCRkNvZGUgQXZtY29kZUlucHV0RnJvbUNvbXBpbGVyOjpvcHRpbWl6ZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJQkZDb2RlIG9wdGltaXplZENvZGUoIGFDb2RlLT5nZXRPcGVyYXRvcigpICk7CisKKwlBdm1JbnN0cnVjdGlvbiAqIGFyZ3NJbnN0cnVjdGlvbiA9CisJCQlvcHRpbWl6ZWRDb2RlLT5uZXdJbnN0cnVjdGlvbiggYUNvZGUtPnNpemUoKSApOworCisJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBhQ29kZS0+YmVnaW4oKTsKKwlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IGFDb2RlLT5lbmQoKTsKKworCUJGIGFyZyA9IEFWTUNPREVfQ09NUElMRVIuZGVjb2RlX29wdGltaXplRXhwcmVzc2lvbihhQ1RYLCAoKml0KSk7CisJb3B0aW1pemVkQ29kZS0+YXBwZW5kKCBhcmcgKTsKKworCWlmKCBhcmcuaXM8IEluc3RhbmNlT2ZQb3J0ID4oKSApCisJeworCQlhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLmR0eXBlID0gVHlwZU1hbmFnZXI6OlBPUlQ7CisJCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdCgwKSwgYXJnLCBmYWxzZSk7CisKKwkJSW5zdGFuY2VPZlBvcnQgKiBhUG9ydCA9IGFyZy50b19wdHI8IEluc3RhbmNlT2ZQb3J0ID4oKTsKKwkJYXZtX3NpemVfdCBwYXJhbUNvdW50ID0gYVBvcnQtPmdldFBhcmFtZXRlckNvdW50KCk7CisKKwkJYXJnID0gQVZNQ09ERV9DT01QSUxFUi5kZWNvZGVfb3B0aW1pemVFeHByZXNzaW9uKGFDVFgsICgqKCsraXQpKSk7CisJCW9wdGltaXplZENvZGUtPmFwcGVuZCggYXJnICk7CisKKwkJYXJnc0luc3RydWN0aW9uLT5hdCgxKS5kdHlwZSA9IFR5cGVNYW5hZ2VyOjpNQUNISU5FOworCQlzZXRBcmdjb2RlUlZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMSksIGFyZyk7CisKKwkJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDIgOworCQkJCSgrK2l0ICE9IGVuZEl0KSAmJiAocGFyYW1Db3VudCA+IDApIDsgKytvZmZzZXQgLCAtLXBhcmFtQ291bnQgKQorCQl7CisJCQlhcmcgPSBBVk1DT0RFX0NPTVBJTEVSLmRlY29kZV9vcHRpbWl6ZUV4cHJlc3Npb24oYUNUWCwgKCppdCkpOworCQkJb3B0aW1pemVkQ29kZS0+YXBwZW5kKCBhcmcgKTsKKworCQkJYXJnc0luc3RydWN0aW9uLT5hdChvZmZzZXQpLmR0eXBlID0gYVBvcnQtPmdldFBhcmFtZXRlclR5cGUob2Zmc2V0LTIpOworCQkJc2V0QXJnY29kZUxWYWx1ZShhQ1RYLCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KG9mZnNldCksIGFyZyk7CisJCX0KKworCQlhcmdzSW5zdHJ1Y3Rpb24tPmNvbXB1dGVNYWluQnl0ZWNvZGUoCisJCQkJLypjb250ZXh0ICAqLyBBVk1fQVJHX1NUQU5EQVJEX0NUWCwKKwkJCQkvKnByb2Nlc3NvciovIEFWTV9BUkdfU1RBVEVNRU5UX0NQVSwKKwkJCQkvKm9wZXJhdGlvbiovIEFWTV9BUkdfU0VWQUxfUlZBTFVFLAorCQkJCS8qb3BlcmFuZCAgKi8gQVZNX0FSR19TVEFURU1FTlRfS0lORCk7CisKKwkJcmV0dXJuKCBvcHRpbWl6ZWRDb2RlICk7CisJfQorCWVsc2UgaWYoIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNUeXBlZChUeXBlTWFuYWdlcjo6UE9SVCwgYXJnKSApCisJeworCQlhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLmR0eXBlID0gVHlwZU1hbmFnZXI6OlBPUlQ7CisJCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdCgwKSwgYXJnLCBmYWxzZSk7CisKKwkJYXJnID0gQVZNQ09ERV9DT01QSUxFUi5kZWNvZGVfb3B0aW1pemVFeHByZXNzaW9uKGFDVFgsICgqKCsraXQpKSk7CisJCW9wdGltaXplZENvZGUtPmFwcGVuZCggYXJnICk7CisKKwkJYXJnc0luc3RydWN0aW9uLT5hdCgxKS5kdHlwZSA9IFR5cGVNYW5hZ2VyOjpNQUNISU5FOworCQlzZXRBcmdjb2RlUlZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMSksIGFyZyk7CisKKwkJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDIgOyAoKytpdCAhPSBlbmRJdCkgOyArK29mZnNldCApCisJCXsKKwkJCWFyZyA9IEFWTUNPREVfQ09NUElMRVIuZGVjb2RlX29wdGltaXplRXhwcmVzc2lvbihhQ1RYLCAoKml0KSk7CisJCQlvcHRpbWl6ZWRDb2RlLT5hcHBlbmQoIGFyZyApOworCisJCQlhcmdzSW5zdHJ1Y3Rpb24tPmF0KG9mZnNldCkuZHR5cGUgPSBUeXBlTWFuYWdlcjo6VU5JVkVSU0FMOworCQkJc2V0QXJnY29kZUxWYWx1ZShhQ1RYLCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KG9mZnNldCksIGFyZyk7CisJCX0KKworCQlhcmdzSW5zdHJ1Y3Rpb24tPmNvbXB1dGVNYWluQnl0ZWNvZGUoCisJCQkJLypjb250ZXh0ICAqLyBBVk1fQVJHX1NUQU5EQVJEX0NUWCwKKwkJCQkvKnByb2Nlc3NvciovIEFWTV9BUkdfU1RBVEVNRU5UX0NQVSwKKwkJCQkvKm9wZXJhdGlvbiovIEFWTV9BUkdfU0VWQUxfUlZBTFVFLAorCQkJCS8qb3BlcmFuZCAgKi8gQVZNX0FSR19TVEFURU1FTlRfS0lORCk7CisKKwkJcmV0dXJuKCBvcHRpbWl6ZWRDb2RlICk7CisJfQorCWVsc2UgaWYoIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNUeXBlZChUeXBlTWFuYWdlcjo6TUVTU0FHRSwgYXJnKSApCisJeworCQlhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLmR0eXBlID0gVHlwZU1hbmFnZXI6Ok1FU1NBR0U7CisJCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdCgwKSwgYXJnLCBmYWxzZSk7CisKKworCQlhcmcgPSBBVk1DT0RFX0NPTVBJTEVSLmRlY29kZV9vcHRpbWl6ZUV4cHJlc3Npb24oYUNUWCwgKCooKytpdCkpKTsKKwkJb3B0aW1pemVkQ29kZS0+YXBwZW5kKCBhcmcgKTsKKworCQlhcmdzSW5zdHJ1Y3Rpb24tPmF0KDEpLmR0eXBlID0gVHlwZU1hbmFnZXI6Ok1BQ0hJTkU7CisJCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdCgxKSwgYXJnKTsKKworCQlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMiA7ICgrK2l0ICE9IGVuZEl0KSA7ICsrb2Zmc2V0ICkKKwkJeworCQkJYXJnID0gQVZNQ09ERV9DT01QSUxFUi5kZWNvZGVfb3B0aW1pemVFeHByZXNzaW9uKGFDVFgsICgqaXQpKTsKKwkJCW9wdGltaXplZENvZGUtPmFwcGVuZCggYXJnICk7CisKKwkJCWFyZ3NJbnN0cnVjdGlvbi0+YXQob2Zmc2V0KS5kdHlwZSA9IFR5cGVNYW5hZ2VyOjpVTklWRVJTQUw7CisJCQlzZXRBcmdjb2RlTFZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQob2Zmc2V0KSwgKCppdCksIGZhbHNlKTsKKwkJfQorCisJCWFyZ3NJbnN0cnVjdGlvbi0+Y29tcHV0ZU1haW5CeXRlY29kZSgKKwkJCQkvKmNvbnRleHQgICovIEFWTV9BUkdfU1RBTkRBUkRfQ1RYLAorCQkJCS8qcHJvY2Vzc29yKi8gQVZNX0FSR19TVEFURU1FTlRfQ1BVLAorCQkJCS8qb3BlcmF0aW9uKi8gQVZNX0FSR19TRVZBTF9SVkFMVUUsCisJCQkJLypvcGVyYW5kICAqLyBBVk1fQVJHX1NUQVRFTUVOVF9LSU5EKTsKKworCQlyZXR1cm4oIG9wdGltaXplZENvZGUgKTsKKwl9CisJZWxzZQorCXsKKwkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JFcnJvckNvdW50KCk7CisJCWFDVFgtPmVycm9yQ29udGV4dCggQVZNX09TX1dBUk4gKQorCQkJCTw8ICJBdm1jb2RlSW5wdXRDb21waWxlcjo6b3B0aW1pemVTdGF0ZW1lbnQgOj4gVW5leHBlY3RlZCA8PCAiCisJCQkJPDwgc3RyX2hlYWRlciggYXJnICkgPDwgIiA+PiBhcyBpbnB1dCBmaXJzdCBhcmd1bWVudCAhISEiCisJCQkJPDwgc3RkOjplbmRsOworCisJCXJldHVybiggYUNvZGUgKTsKKwl9Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQVZNQ09ERSBJTlBVVCNTQVZFIFNUQVRFTUVOVCBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkZDb2RlIEF2bWNvZGVJbnB1dFNhdmVDb21waWxlcjo6Y29tcGlsZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisKKwlyZXR1cm4oIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKGFDb2RlLT5nZXRPcGVyYXRvcigpLAorCQkJY29tcGlsZUFyZ1J2YWx1ZShhQ1RYLCBUeXBlTWFuYWdlcjo6UE9SVCwgYUNvZGUtPmZpcnN0KCkpKSApOworCXJldHVybiggY29tcGlsZUV4cHJlc3Npb25Db2RlKGFDVFgsIGFDb2RlKSApOworfQorCisKK0JGQ29kZSBBdm1jb2RlSW5wdXRTYXZlQ29tcGlsZXI6Om9wdGltaXplU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlCRkNvZGUgb3B0aW1pemVkQ29kZSggYUNvZGUtPmdldE9wZXJhdG9yKCkgKTsKKworCUF2bUluc3RydWN0aW9uICogYXJnc0luc3RydWN0aW9uID0KKwkJCW9wdGltaXplZENvZGUtPm5ld0luc3RydWN0aW9uKCBhQ29kZS0+c2l6ZSgpICk7CisKKwlCRiBhcmcgPSBBVk1DT0RFX0NPTVBJTEVSLmRlY29kZV9vcHRpbWl6ZUV4cHJlc3Npb24oYUNUWCwgYUNvZGUtPmZpcnN0KCkpOworCW9wdGltaXplZENvZGUtPmFwcGVuZCggYXJnICk7CisKKwlpZiggYXJnLmlzPCBJbnN0YW5jZU9mUG9ydCA+KCkgKQorCXsKKwkJYXJnc0luc3RydWN0aW9uLT5hdCgwKS5kdHlwZSA9IFR5cGVNYW5hZ2VyOjpQT1JUOworCQlzZXRBcmdjb2RlUlZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMCksIGFyZywgZmFsc2UpOworCisvLwkJSW5zdGFuY2VPZlBvcnQgKiBhUG9ydCA9IGFyZy50b19wdHI8IEluc3RhbmNlT2ZQb3J0ID4oKTsKKworCQlhcmdzSW5zdHJ1Y3Rpb24tPmNvbXB1dGVNYWluQnl0ZWNvZGUoCisJCQkJLypjb250ZXh0ICAqLyBBVk1fQVJHX1NUQU5EQVJEX0NUWCwKKwkJCQkvKnByb2Nlc3NvciovIEFWTV9BUkdfU1RBVEVNRU5UX0NQVSwKKwkJCQkvKm9wZXJhdGlvbiovIEFWTV9BUkdfU0VWQUxfUlZBTFVFLAorCQkJCS8qb3BlcmFuZCAgKi8gQVZNX0FSR19TVEFURU1FTlRfS0lORCk7CisKKworCQlyZXR1cm4oIG9wdGltaXplZENvZGUgKTsKKwl9CisJZWxzZSBpZiggRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc1R5cGVkKFR5cGVNYW5hZ2VyOjpNRVNTQUdFLCBhcmcpICkKKwl7CisJCWFyZ3NJbnN0cnVjdGlvbi0+YXQoMCkuZHR5cGUgPSBUeXBlTWFuYWdlcjo6TUVTU0FHRTsKKwkJc2V0QXJnY29kZVJWYWx1ZShhQ1RYLCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLCBhcmcsIGZhbHNlKTsKKworCQlhcmdzSW5zdHJ1Y3Rpb24tPmNvbXB1dGVNYWluQnl0ZWNvZGUoCisJCQkJLypjb250ZXh0ICAqLyBBVk1fQVJHX1NUQU5EQVJEX0NUWCwKKwkJCQkvKnByb2Nlc3NvciovIEFWTV9BUkdfU1RBVEVNRU5UX0NQVSwKKwkJCQkvKm9wZXJhdGlvbiovIEFWTV9BUkdfU0VWQUxfUlZBTFVFLAorCQkJCS8qb3BlcmFuZCAgKi8gQVZNX0FSR19TVEFURU1FTlRfS0lORCk7CisKKwkJcmV0dXJuKCBvcHRpbWl6ZWRDb2RlICk7CisJfQorCWVsc2UKKwl7CisJCWdldENvbXBpbGVyVGFibGUoKS5pbmNyRXJyb3JDb3VudCgpOworCQlhQ1RYLT5lcnJvckNvbnRleHQoIEFWTV9PU19XQVJOICkKKwkJCQk8PCAiQXZtY29kZUlucHV0Q29tcGlsZXI6Om9wdGltaXplU3RhdGVtZW50IDo+IFVuZXhwZWN0ZWQgPDwgIgorCQkJCTw8IHN0cl9oZWFkZXIoIGFyZyApIDw8ICIgPj4gYXMgaW5wdXQgZmlyc3QgYXJndW1lbnQgISEhIgorCQkJCTw8IHN0ZDo6ZW5kbDsKKworCQlyZXR1cm4oIGFDb2RlICk7CisJfQorfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIElOUFVUI1ZBUiBTVEFURU1FTlQgQ09NUElMQVRJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0JGQ29kZSBBdm1jb2RlSW5wdXRWYXJDb21waWxlcjo6Y29tcGlsZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJQkYgbHZhbHVlID0gY29tcGlsZUFyZ0x2YWx1ZShhQ1RYLCBhQ29kZS0+Zmlyc3QoKSk7CisKKwlpZiggYUNvZGUtPnBvcHVsYXRlZCgpICkKKwl7CisJCWlmKCBsdmFsdWUuaXM8IEluc3RhbmNlT2ZEYXRhID4oKSApCisJCXsKKwkJCWFDVFggPSBhQ1RYLT5jbG9uZSgKKwkJCQkJbHZhbHVlLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpLT5nZXRUeXBlU3BlY2lmaWVyKCkgKTsKKwkJfQorCQlyZXR1cm4oIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKCBhQ29kZS0+Z2V0T3BlcmF0b3IoKSwKKwkJCQlsdmFsdWUsIGNvbXBpbGVBcmdSdmFsdWUoYUNUWCwgYUNvZGUtPnNlY29uZCgpKSkgKTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZShhQ29kZS0+Z2V0T3BlcmF0b3IoKSwgbHZhbHVlKSApOworCX0KK30KKworCitCRkNvZGUgQXZtY29kZUlucHV0VmFyQ29tcGlsZXI6Om9wdGltaXplU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlBdm1JbnN0cnVjdGlvbiAqIGFyZ3NJbnN0cnVjdGlvbiA9IGFDb2RlLT5nZW5JbnN0cnVjdGlvbigpOworCisJc2V0QXJnY29kZUxWYWx1ZShhQ1RYLCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLCBhQ29kZS0+Zmlyc3QoKSk7CisKKwlpZiggYUNvZGUtPnBvcHVsYXRlZCgpICkKKwl7CisJCW9wdGltaXplQXJnRXhwcmVzc2lvbihhQ1RYLCBhQ29kZSwgMSk7CisJCWFyZ3NJbnN0cnVjdGlvbi0+YXQoMSkuZHR5cGUgPSBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLmR0eXBlOworCQlzZXRBcmdjb2RlUlZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMSksIGFDb2RlLT5zZWNvbmQoKSk7CisJfQorCisJYXJnc0luc3RydWN0aW9uLT5jb21wdXRlTWFpbkJ5dGVjb2RlKAorCQkJLypjb250ZXh0ICAqLyBBVk1fQVJHX1NUQU5EQVJEX0NUWCwKKwkJCS8qcHJvY2Vzc29yKi8gQVZNX0FSR19TVEFURU1FTlRfQ1BVLAorCQkJLypvcGVyYXRpb24qLyBBVk1fQVJHX1NFVkFMX1JWQUxVRSwKKwkJCS8qb3BlcmFuZCAgKi8gQVZNX0FSR19TVEFURU1FTlRfS0lORCwKKwkJCS8qZHR5cGUgICAgKi8gYXJnc0luc3RydWN0aW9uLT5hdCgwKS5kdHlwZSk7CisKKwlyZXR1cm4oIGFDb2RlICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFWTUNPREUgSU5QVVQjRU5WIFNUQVRFTUVOVCBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkZDb2RlIEF2bWNvZGVJbnB1dEVudkNvbXBpbGVyOjpjb21waWxlU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlyZXR1cm4oIGNvbXBpbGVFeHByZXNzaW9uQ29kZShhQ1RYLCBhQ29kZSkgKTsKK30KKworCitCRkNvZGUgQXZtY29kZUlucHV0RW52Q29tcGlsZXI6Om9wdGltaXplU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlCRkNvZGUgb3B0aW1pemVkQ29kZSggYUNvZGUtPmdldE9wZXJhdG9yKCkgKTsKKworCUF2bUluc3RydWN0aW9uICogYXJnc0luc3RydWN0aW9uID0KKwkJCW9wdGltaXplZENvZGUtPm5ld0luc3RydWN0aW9uKCBhQ29kZS0+c2l6ZSgpICk7CisKKwlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdCA9IGFDb2RlLT5iZWdpbigpOworCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gYUNvZGUtPmVuZCgpOworCisJQkYgYXJnID0gQVZNQ09ERV9DT01QSUxFUi5kZWNvZGVfb3B0aW1pemVFeHByZXNzaW9uKGFDVFgsICgqaXQpKTsKKwlvcHRpbWl6ZWRDb2RlLT5hcHBlbmQoIGFyZyApOworCisJaWYoIGFyZy5pczwgSW5zdGFuY2VPZlBvcnQgPigpICkKKwl7CisJCWFyZ3NJbnN0cnVjdGlvbi0+YXQoMCkuZHR5cGUgPSBUeXBlTWFuYWdlcjo6UE9SVDsKKwkJc2V0QXJnY29kZVJWYWx1ZShhQ1RYLCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLCBhcmcsIGZhbHNlKTsKKworCQlJbnN0YW5jZU9mUG9ydCAqIGFQb3J0ID0gYXJnLnRvX3B0cjwgSW5zdGFuY2VPZlBvcnQgPigpOworCQlhdm1fc2l6ZV90IHBhcmFtQ291bnQgPSBhUG9ydC0+Z2V0UGFyYW1ldGVyQ291bnQoKTsKKworCQlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMSA7CisJCQkJKCsraXQgIT0gZW5kSXQpICYmIChwYXJhbUNvdW50ID4gMCkgOyArK29mZnNldCAsIC0tcGFyYW1Db3VudCApCisJCXsKKwkJCWFyZyA9IEFWTUNPREVfQ09NUElMRVIuZGVjb2RlX29wdGltaXplRXhwcmVzc2lvbihhQ1RYLCAoKml0KSk7CisJCQlvcHRpbWl6ZWRDb2RlLT5hcHBlbmQoIGFyZyApOworCisJCQlhcmdzSW5zdHJ1Y3Rpb24tPmF0KG9mZnNldCkuZHR5cGUgPSBhUG9ydC0+Z2V0UGFyYW1ldGVyVHlwZShvZmZzZXQtMSk7CisJCQlzZXRBcmdjb2RlTFZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQob2Zmc2V0KSwgYXJnKTsKKwkJfQorCisJCWFyZ3NJbnN0cnVjdGlvbi0+Y29tcHV0ZU1haW5CeXRlY29kZSgKKwkJCQkvKmNvbnRleHQgICovIEFWTV9BUkdfU1RBTkRBUkRfQ1RYLAorCQkJCS8qcHJvY2Vzc29yKi8gQVZNX0FSR19TVEFURU1FTlRfQ1BVLAorCQkJCS8qb3BlcmF0aW9uKi8gQVZNX0FSR19TRVZBTF9SVkFMVUUsCisJCQkJLypvcGVyYW5kICAqLyBBVk1fQVJHX1NUQVRFTUVOVF9LSU5EKTsKKworCQlyZXR1cm4oIG9wdGltaXplZENvZGUgKTsKKwl9CisJZWxzZSBpZiggRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc1R5cGVkKFR5cGVNYW5hZ2VyOjpQT1JULCBhcmcpICkKKwl7CisJCWFyZ3NJbnN0cnVjdGlvbi0+YXQoMCkuZHR5cGUgPSBUeXBlTWFuYWdlcjo6UE9SVDsKKwkJc2V0QXJnY29kZVJWYWx1ZShhQ1RYLCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLCBhcmcsIGZhbHNlKTsKKworCQlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMSA7ICgrK2l0ICE9IGVuZEl0KSA7ICsrb2Zmc2V0ICkKKwkJeworCQkJYXJnID0gQVZNQ09ERV9DT01QSUxFUi5kZWNvZGVfb3B0aW1pemVFeHByZXNzaW9uKGFDVFgsICgqaXQpKTsKKwkJCW9wdGltaXplZENvZGUtPmFwcGVuZCggYXJnICk7CisKKwkJCWFyZ3NJbnN0cnVjdGlvbi0+YXQob2Zmc2V0KS5kdHlwZSA9IFR5cGVNYW5hZ2VyOjpVTklWRVJTQUw7CisJCQlzZXRBcmdjb2RlTFZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQob2Zmc2V0KSwgYXJnKTsKKwkJfQorCisJCWFyZ3NJbnN0cnVjdGlvbi0+Y29tcHV0ZU1haW5CeXRlY29kZSgKKwkJCQkvKmNvbnRleHQgICovIEFWTV9BUkdfU1RBTkRBUkRfQ1RYLAorCQkJCS8qcHJvY2Vzc29yKi8gQVZNX0FSR19TVEFURU1FTlRfQ1BVLAorCQkJCS8qb3BlcmF0aW9uKi8gQVZNX0FSR19TRVZBTF9SVkFMVUUsCisJCQkJLypvcGVyYW5kICAqLyBBVk1fQVJHX1NUQVRFTUVOVF9LSU5EKTsKKworCQlyZXR1cm4oIG9wdGltaXplZENvZGUgKTsKKwl9CisJZWxzZSBpZiggRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc1R5cGVkKFR5cGVNYW5hZ2VyOjpNRVNTQUdFLCBhcmcpICkKKwl7CisJCWFyZ3NJbnN0cnVjdGlvbi0+YXQoMCkuZHR5cGUgPSBUeXBlTWFuYWdlcjo6TUVTU0FHRTsKKwkJc2V0QXJnY29kZVJWYWx1ZShhQ1RYLCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLCBhcmcsIGZhbHNlKTsKKworCQlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMSA7ICgrK2l0ICE9IGVuZEl0KSA7ICsrb2Zmc2V0ICkKKwkJeworCQkJYXJnID0gQVZNQ09ERV9DT01QSUxFUi5kZWNvZGVfb3B0aW1pemVFeHByZXNzaW9uKGFDVFgsICgqaXQpKTsKKwkJCW9wdGltaXplZENvZGUtPmFwcGVuZCggYXJnICk7CisKKwkJCWFyZ3NJbnN0cnVjdGlvbi0+YXQob2Zmc2V0KS5kdHlwZSA9IFR5cGVNYW5hZ2VyOjpVTklWRVJTQUw7CisJCQlzZXRBcmdjb2RlTFZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQob2Zmc2V0KSwgKCppdCksIGZhbHNlKTsKKwkJfQorCisJCWFyZ3NJbnN0cnVjdGlvbi0+Y29tcHV0ZU1haW5CeXRlY29kZSgKKwkJCQkvKmNvbnRleHQgICovIEFWTV9BUkdfU1RBTkRBUkRfQ1RYLAorCQkJCS8qcHJvY2Vzc29yKi8gQVZNX0FSR19TVEFURU1FTlRfQ1BVLAorCQkJCS8qb3BlcmF0aW9uKi8gQVZNX0FSR19TRVZBTF9SVkFMVUUsCisJCQkJLypvcGVyYW5kICAqLyBBVk1fQVJHX1NUQVRFTUVOVF9LSU5EKTsKKworCQlyZXR1cm4oIG9wdGltaXplZENvZGUgKTsKKwl9CisJZWxzZQorCXsKKwkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JFcnJvckNvdW50KCk7CisJCWFDVFgtPmVycm9yQ29udGV4dCggQVZNX09TX1dBUk4gKQorCQkJCTw8ICJBdm1jb2RlSW5wdXRDb21waWxlcjo6b3B0aW1pemVTdGF0ZW1lbnQgOj4gVW5leHBlY3RlZCA8PCAiCisJCQkJPDwgc3RyX2hlYWRlciggYXJnICkgPDwgIiA+PiBhcyBpbnB1dCBmaXJzdCBhcmd1bWVudCAhISEiCisJCQkJPDwgc3RkOjplbmRsOworCisJCXJldHVybiggYUNvZGUgKTsKKwl9Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQVZNQ09ERSBPVVRQVVQgU1RBVEVNRU5UIENPTVBJTEFUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitCRkNvZGUgQXZtY29kZU91dHB1dENvbXBpbGVyOjpjb21waWxlU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlCRkNvZGUgY29tcGlsZWRDb2RlID0gY29tcGlsZUV4cHJlc3Npb25Db2RlKGFDVFgsIGFDb2RlKTsKKworCWNvbnN0IEJGICYgYXJnID0gY29tcGlsZWRDb2RlLT5maXJzdCgpOworCisJaWYoIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNUeXBlZChUeXBlTWFuYWdlcjo6UE9SVCwgYXJnKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisJZWxzZSBpZiggRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc1R5cGVkKFR5cGVNYW5hZ2VyOjpNRVNTQUdFLCBhcmcpICkKKwl7CisKKwl9CisJZWxzZQorCXsKKwkJY29tcGlsZWRDb2RlLT5zZXRPcGVyYXRvcihPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX09VVFBVVF9WQVIpOworCX0KKworCXJldHVybiggY29tcGlsZWRDb2RlICk7Cit9CisKKworQkZDb2RlIEF2bWNvZGVPdXRwdXRDb21waWxlcjo6b3B0aW1pemVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCUJGQ29kZSBvcHRpbWl6ZWRDb2RlKCBhQ29kZS0+Z2V0T3BlcmF0b3IoKSApOworCisJQXZtSW5zdHJ1Y3Rpb24gKiBhcmdzSW5zdHJ1Y3Rpb24gPQorCQkJb3B0aW1pemVkQ29kZS0+bmV3SW5zdHJ1Y3Rpb24oIGFDb2RlLT5zaXplKCkgKTsKKworCUF2bUNvZGU6Oml0ZXJhdG9yIGl0ID0gYUNvZGUtPmJlZ2luKCk7CisJQXZtQ29kZTo6aXRlcmF0b3IgZW5kSXQgPSBhQ29kZS0+ZW5kKCk7CisKKwlCRiBhcmcgPSBBVk1DT0RFX0NPTVBJTEVSLmRlY29kZV9vcHRpbWl6ZUV4cHJlc3Npb24oYUNUWCwgKCppdCkpOworCW9wdGltaXplZENvZGUtPmFwcGVuZCggYXJnICk7CisKKwlpZiggYXJnLmlzPCBJbnN0YW5jZU9mUG9ydCA+KCkgKQorCXsKKwkJYXJnc0luc3RydWN0aW9uLT5hdCgwKS5kdHlwZSA9IFR5cGVNYW5hZ2VyOjpQT1JUOworCQlzZXRBcmdjb2RlUlZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMCksIGFyZywgZmFsc2UpOworCisJCUluc3RhbmNlT2ZQb3J0ICogYVBvcnQgPSBhcmcudG9fcHRyPCBJbnN0YW5jZU9mUG9ydCA+KCk7CisKKwkJaWYoIGFQb3J0LT5oYXNPdXRwdXRSb3V0aW5nRGF0YSgpICkKKwkJeworCQkJY29uc3QgUm91dGluZ0RhdGEgJiBhUm91dGluZ0RhdGEgPSBhUG9ydC0+Z2V0T3V0cHV0Um91dGluZ0RhdGEoKTsKKworCQkJc3dpdGNoKCBhUm91dGluZ0RhdGEuZ2V0UHJvdG9jb2woKSApCisJCQl7CisJCQkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfRU5WSVJPTk1FTlRfS0lORDoKKwkJCQl7CisJCQkJCW9wdGltaXplZENvZGUtPnNldE9wZXJhdG9yKAorCQkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfT1VUUFVUX0VOVik7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWNhc2UgQ29tUHJvdG9jb2w6OlBST1RPQ09MX1JEVl9LSU5EOgorCQkJCWNhc2UgQ29tUHJvdG9jb2w6OlBST1RPQ09MX01VTFRJUkRWX0tJTkQ6CisJCQkJeworCQkJCQlvcHRpbWl6ZWRDb2RlLT5zZXRPcGVyYXRvcigKKwkJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX09VVFBVVF9SRFYpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQljYXNlIENvbVByb3RvY29sOjpQUk9UT0NPTF9CVUZGRVJfS0lORDoKKwkJCQljYXNlIENvbVByb3RvY29sOjpQUk9UT0NPTF9CUk9BRENBU1RfS0lORDoKKwkJCQljYXNlIENvbVByb3RvY29sOjpQUk9UT0NPTF9NVUxUSUNBU1RfS0lORDoKKwkJCQljYXNlIENvbVByb3RvY29sOjpQUk9UT0NPTF9VTklDQVNUX0tJTkQ6CisJCQkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfQU5ZQ0FTVF9LSU5EOgorCQkJCXsKKwkJCQkJaWYoIGFSb3V0aW5nRGF0YS5nZXRCdWZmZXJJbnN0YW5jZSgpLnNpbmdsZXRvbigpICkKKwkJCQkJeworCQkJCQkJb3B0aW1pemVkQ29kZS0+c2V0T3BlcmF0b3IoCisJCQkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfT1VUUFVUX0JVRkZFUik7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfVFJBTlNGRVJUX0tJTkQ6CisJCQkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfVU5ERUZJTkVEX0tJTkQ6CisJCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWF2bV9zaXplX3QgcGFyYW1Db3VudCA9IGFQb3J0LT5nZXRQYXJhbWV0ZXJDb3VudCgpOworCQlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMSA7CisJCQkJKCsraXQgIT0gZW5kSXQpICYmIChvZmZzZXQgPD0gcGFyYW1Db3VudCkgOyArK29mZnNldCApCisJCXsKKwkJCWFyZyA9IEFWTUNPREVfQ09NUElMRVIuZGVjb2RlX29wdGltaXplRXhwcmVzc2lvbihhQ1RYLCAoKml0KSk7CisJCQlvcHRpbWl6ZWRDb2RlLT5hcHBlbmQoIGFyZyApOworCisJCQlhcmdzSW5zdHJ1Y3Rpb24tPmF0KG9mZnNldCkuZHR5cGUgPSBhUG9ydC0+Z2V0UGFyYW1ldGVyVHlwZShvZmZzZXQtMSk7CisJCQlzZXRBcmdjb2RlUlZhbHVlKGFDVFgtPmNsb25lKGFyZ3NJbnN0cnVjdGlvbi0+YXQob2Zmc2V0KS5kdHlwZSksCisJCQkJCWFyZ3NJbnN0cnVjdGlvbi0+YXQob2Zmc2V0KSwgYXJnKTsKKwkJfQorCisJCWFyZ3NJbnN0cnVjdGlvbi0+Y29tcHV0ZU1haW5CeXRlY29kZSgKKwkJCQkvKmNvbnRleHQgICovIEFWTV9BUkdfU1RBTkRBUkRfQ1RYLAorCQkJCS8qcHJvY2Vzc29yKi8gQVZNX0FSR19TVEFURU1FTlRfQ1BVLAorCQkJCS8qb3BlcmF0aW9uKi8gQVZNX0FSR19TRVZBTF9SVkFMVUUsCisJCQkJLypvcGVyYW5kICAqLyBBVk1fQVJHX1NUQVRFTUVOVF9LSU5EKTsKKworCQlyZXR1cm4oIG9wdGltaXplZENvZGUgKTsKKwl9CisJZWxzZSBpZiggRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc1R5cGVkKFR5cGVNYW5hZ2VyOjpQT1JULCBhcmcpICkKKwl7CisJCWFyZ3NJbnN0cnVjdGlvbi0+YXQoMCkuZHR5cGUgPSBUeXBlTWFuYWdlcjo6UE9SVDsKKwkJc2V0QXJnY29kZVJWYWx1ZShhQ1RYLCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLCBhcmcsIGZhbHNlKTsKKworCQlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMSA7ICgrK2l0ICE9IGVuZEl0KSA7ICsrb2Zmc2V0ICkKKwkJeworCQkJYXJnID0gQVZNQ09ERV9DT01QSUxFUi5kZWNvZGVfb3B0aW1pemVFeHByZXNzaW9uKGFDVFgsICgqaXQpKTsKKwkJCW9wdGltaXplZENvZGUtPmFwcGVuZCggYXJnICk7CisKKwkJCWFyZ3NJbnN0cnVjdGlvbi0+YXQob2Zmc2V0KS5kdHlwZSA9IFR5cGVNYW5hZ2VyOjpVTklWRVJTQUw7CisJCQlzZXRBcmdjb2RlUlZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQob2Zmc2V0KSwgYXJnLCBmYWxzZSk7CisJCX0KKworCQlhcmdzSW5zdHJ1Y3Rpb24tPmNvbXB1dGVNYWluQnl0ZWNvZGUoCisJCQkJLypjb250ZXh0ICAqLyBBVk1fQVJHX1NUQU5EQVJEX0NUWCwKKwkJCQkvKnByb2Nlc3NvciovIEFWTV9BUkdfU1RBVEVNRU5UX0NQVSwKKwkJCQkvKm9wZXJhdGlvbiovIEFWTV9BUkdfU0VWQUxfUlZBTFVFLAorCQkJCS8qb3BlcmFuZCAgKi8gQVZNX0FSR19TVEFURU1FTlRfS0lORCk7CisKKwkJcmV0dXJuKCBvcHRpbWl6ZWRDb2RlICk7CisJfQorCWVsc2UgaWYoIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNUeXBlZChUeXBlTWFuYWdlcjo6TUVTU0FHRSwgYXJnKSApCisJeworCQlhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLmR0eXBlID0gVHlwZU1hbmFnZXI6Ok1FU1NBR0U7CisJCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdCgwKSwgYXJnLCBmYWxzZSk7CisKKwkJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDEgOyAoKytpdCAhPSBlbmRJdCkgOyArK29mZnNldCApCisJCXsKKwkJCWFyZyA9IEFWTUNPREVfQ09NUElMRVIuZGVjb2RlX29wdGltaXplRXhwcmVzc2lvbihhQ1RYLCAoKml0KSk7CisJCQlvcHRpbWl6ZWRDb2RlLT5hcHBlbmQoIGFyZyApOworCisJCQlhcmdzSW5zdHJ1Y3Rpb24tPmF0KG9mZnNldCkuZHR5cGUgPSBUeXBlTWFuYWdlcjo6VU5JVkVSU0FMOworCQkJc2V0QXJnY29kZVJWYWx1ZShhQ1RYLCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KG9mZnNldCksICgqaXQpLCBmYWxzZSk7CisJCX0KKworCQlhcmdzSW5zdHJ1Y3Rpb24tPmNvbXB1dGVNYWluQnl0ZWNvZGUoCisJCQkJLypjb250ZXh0ICAqLyBBVk1fQVJHX1NUQU5EQVJEX0NUWCwKKwkJCQkvKnByb2Nlc3NvciovIEFWTV9BUkdfU1RBVEVNRU5UX0NQVSwKKwkJCQkvKm9wZXJhdGlvbiovIEFWTV9BUkdfU0VWQUxfUlZBTFVFLAorCQkJCS8qb3BlcmFuZCAgKi8gQVZNX0FSR19TVEFURU1FTlRfS0lORCk7CisKKwkJcmV0dXJuKCBvcHRpbWl6ZWRDb2RlICk7CisJfQorCWVsc2UKKwl7CisJCWdldENvbXBpbGVyVGFibGUoKS5pbmNyRXJyb3JDb3VudCgpOworCQlhQ1RYLT5lcnJvckNvbnRleHQoIEFWTV9PU19XQVJOICkKKwkJCQk8PCAiQXZtY29kZUlucHV0Q29tcGlsZXI6Om9wdGltaXplU3RhdGVtZW50IDo+IFVuZXhwZWN0ZWQgPDwgIgorCQkJCTw8IHN0cl9oZWFkZXIoIGFyZyApIDw8ICIgPj4gYXMgaW5wdXQgZmlyc3QgYXJndW1lbnQgISEhIgorCQkJCTw8IHN0ZDo6ZW5kbDsKKworCQlyZXR1cm4oIGFDb2RlICk7CisJfQorfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIE9VVFBVVCNUTyBTVEFURU1FTlQgQ09NUElMQVRJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0JGQ29kZSBBdm1jb2RlT3V0cHV0VG9Db21waWxlcjo6Y29tcGlsZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJaWYoIGFDb2RlLT5zaXplKCkgPj0gMiApCisJeworCQlCRkNvZGUgY29tcGlsQ29kZSggYUNvZGUtPmdldE9wZXJhdG9yKCkgKTsKKworCQlBdm1Db2RlOjppdGVyYXRvciBpdCA9IGFDb2RlLT5iZWdpbigpOworCQljb21waWxDb2RlLmFwcGVuZCgKKwkJCQljb21waWxlQXJnUnZhbHVlKGFDVFgsIFR5cGVNYW5hZ2VyOjpQT1JULCAqaXQpICk7CisKKwkJY29tcGlsQ29kZS5hcHBlbmQoCisJCQkJY29tcGlsZUFyZ1J2YWx1ZShhQ1RYLCBUeXBlTWFuYWdlcjo6TUFDSElORSwgKigrK2l0KSkgKTsKKworCQlBdm1Db2RlOjppdGVyYXRvciBlbmRJdCA9IGFDb2RlLT5lbmQoKTsKKwkJZm9yKCArK2l0IDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJeworCQkJY29tcGlsQ29kZS5hcHBlbmQoIGNvbXBpbGVBcmdSdmFsdWUoYUNUWCwgKml0KSApOworCQl9CisKKwkJcmV0dXJuKCBjb21waWxDb2RlICk7CisKKwl9CisJZWxzZQorCXsKKwkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JFcnJvckNvdW50KCk7CisJCWFDVFgtPmVycm9yQ29udGV4dCggQVZNX09TX1dBUk4gKQorCQkJCTw8ICJBdm1jb2RlT3V0cHV0VG9Db21waWxlcjo6Y29tcGlsZVN0YXRlbWVudCA6PiAiCisJCQkJCSJOb3QgZW5vdWdoIHBhcmFtZXRlciBmb3IgPDwgb3V0cHV0X3RvID4+IHN0YXRlbWVudCA8PCAiCisJCQkJPDwgc3RyX2luZGVudCggYUNvZGUgKSA8PCAiID4+ICEhISIKKwkJCQk8PCBzdGQ6OmVuZGw7CisKKwkJcmV0dXJuKCBhQ29kZSApOworCX0KK30KKworCitCRkNvZGUgQXZtY29kZU91dHB1dFRvQ29tcGlsZXI6Om9wdGltaXplU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlCRkNvZGUgb3B0aW1pemVkQ29kZSggYUNvZGUtPmdldE9wZXJhdG9yKCkgKTsKKworCUF2bUluc3RydWN0aW9uICogYXJnc0luc3RydWN0aW9uID0KKwkJCW9wdGltaXplZENvZGUtPm5ld0luc3RydWN0aW9uKCBhQ29kZS0+c2l6ZSgpICk7CisKKwlBdm1Db2RlOjppdGVyYXRvciBpdCA9IGFDb2RlLT5iZWdpbigpOworCUF2bUNvZGU6Oml0ZXJhdG9yIGVuZEl0ID0gYUNvZGUtPmVuZCgpOworCisJQkYgYXJnID0gQVZNQ09ERV9DT01QSUxFUi5kZWNvZGVfb3B0aW1pemVFeHByZXNzaW9uKGFDVFgsICgqaXQpKTsKKwlvcHRpbWl6ZWRDb2RlLT5hcHBlbmQoIGFyZyApOworCisJaWYoIGFyZy5pczwgSW5zdGFuY2VPZlBvcnQgPigpICkKKwl7CisJCWFyZ3NJbnN0cnVjdGlvbi0+YXQoMCkuZHR5cGUgPSBUeXBlTWFuYWdlcjo6UE9SVDsKKwkJc2V0QXJnY29kZVJWYWx1ZShhQ1RYLCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLCBhcmcsIGZhbHNlKTsKKworCQlJbnN0YW5jZU9mUG9ydCAqIGFQb3J0ID0gYXJnLmFzX3B0cjwgSW5zdGFuY2VPZlBvcnQgPigpOworCQlhdm1fc2l6ZV90IHBhcmFtQ291bnQgPSBhUG9ydC0+Z2V0UGFyYW1ldGVyQ291bnQoKTsKKworCisJCWFyZyA9IEFWTUNPREVfQ09NUElMRVIuZGVjb2RlX29wdGltaXplRXhwcmVzc2lvbihhQ1RYLCAoKigrK2l0KSkpOworCQlvcHRpbWl6ZWRDb2RlLT5hcHBlbmQoIGFyZyApOworCisJCWFyZ3NJbnN0cnVjdGlvbi0+YXQoMSkuZHR5cGUgPSBUeXBlTWFuYWdlcjo6TUFDSElORTsKKwkJc2V0QXJnY29kZVJWYWx1ZShhQ1RYLCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDEpLCBhcmcpOworCisJCWZvciggYXZtX3NpemVfdCBvZmZzZXQgPSAyIDsKKwkJCQkoKytpdCAhPSBlbmRJdCkgJiYgKHBhcmFtQ291bnQgPiAwKSA7ICsrb2Zmc2V0ICwgLS1wYXJhbUNvdW50ICkKKwkJeworCQkJYXJnID0gQVZNQ09ERV9DT01QSUxFUi5kZWNvZGVfb3B0aW1pemVFeHByZXNzaW9uKGFDVFgsICgqaXQpKTsKKwkJCW9wdGltaXplZENvZGUtPmFwcGVuZCggYXJnICk7CisKKwkJCWFyZ3NJbnN0cnVjdGlvbi0+YXQob2Zmc2V0KS5kdHlwZSA9IGFQb3J0LT5nZXRQYXJhbWV0ZXJUeXBlKG9mZnNldC0yKTsKKwkJCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdChvZmZzZXQpLCBhcmcpOworCQl9CisKKwkJYXJnc0luc3RydWN0aW9uLT5jb21wdXRlTWFpbkJ5dGVjb2RlKAorCQkJCS8qY29udGV4dCAgKi8gQVZNX0FSR19TVEFOREFSRF9DVFgsCisJCQkJLypwcm9jZXNzb3IqLyBBVk1fQVJHX1NUQVRFTUVOVF9DUFUsCisJCQkJLypvcGVyYXRpb24qLyBBVk1fQVJHX1NFVkFMX1JWQUxVRSwKKwkJCQkvKm9wZXJhbmQgICovIEFWTV9BUkdfU1RBVEVNRU5UX0tJTkQpOworCisJCXJldHVybiggb3B0aW1pemVkQ29kZSApOworCX0KKwllbHNlIGlmKCBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzVHlwZWQoVHlwZU1hbmFnZXI6OlBPUlQsIGFyZykgKQorCXsKKwkJYXJnc0luc3RydWN0aW9uLT5hdCgwKS5kdHlwZSA9IFR5cGVNYW5hZ2VyOjpQT1JUOworCQlzZXRBcmdjb2RlUlZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMCksIGFyZywgZmFsc2UpOworCisJCWFyZyA9IEFWTUNPREVfQ09NUElMRVIuZGVjb2RlX29wdGltaXplRXhwcmVzc2lvbihhQ1RYLCAoKigrK2l0KSkpOworCQlvcHRpbWl6ZWRDb2RlLT5hcHBlbmQoIGFyZyApOworCisJCWFyZ3NJbnN0cnVjdGlvbi0+YXQoMSkuZHR5cGUgPSBUeXBlTWFuYWdlcjo6TUFDSElORTsKKwkJc2V0QXJnY29kZVJWYWx1ZShhQ1RYLCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDEpLCBhcmcpOworCisJCWZvciggYXZtX3NpemVfdCBvZmZzZXQgPSAyIDsgKCsraXQgIT0gZW5kSXQpIDsgKytvZmZzZXQgKQorCQl7CisJCQlhcmcgPSBBVk1DT0RFX0NPTVBJTEVSLmRlY29kZV9vcHRpbWl6ZUV4cHJlc3Npb24oYUNUWCwgKCppdCkpOworCQkJb3B0aW1pemVkQ29kZS0+YXBwZW5kKCBhcmcgKTsKKworCQkJYXJnc0luc3RydWN0aW9uLT5hdChvZmZzZXQpLmR0eXBlID0gVHlwZU1hbmFnZXI6OlVOSVZFUlNBTDsKKwkJCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdChvZmZzZXQpLCBhcmcpOworCQl9CisKKwkJYXJnc0luc3RydWN0aW9uLT5jb21wdXRlTWFpbkJ5dGVjb2RlKAorCQkJCS8qY29udGV4dCAgKi8gQVZNX0FSR19TVEFOREFSRF9DVFgsCisJCQkJLypwcm9jZXNzb3IqLyBBVk1fQVJHX1NUQVRFTUVOVF9DUFUsCisJCQkJLypvcGVyYXRpb24qLyBBVk1fQVJHX1NFVkFMX1JWQUxVRSwKKwkJCQkvKm9wZXJhbmQgICovIEFWTV9BUkdfU1RBVEVNRU5UX0tJTkQpOworCisJCXJldHVybiggb3B0aW1pemVkQ29kZSApOworCX0KKwllbHNlIGlmKCBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzVHlwZWQoVHlwZU1hbmFnZXI6Ok1FU1NBR0UsIGFyZykgKQorCXsKKwkJYXJnc0luc3RydWN0aW9uLT5hdCgwKS5kdHlwZSA9IFR5cGVNYW5hZ2VyOjpNRVNTQUdFOworCQlzZXRBcmdjb2RlUlZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMCksIGFyZywgZmFsc2UpOworCisKKwkJYXJnID0gQVZNQ09ERV9DT01QSUxFUi5kZWNvZGVfb3B0aW1pemVFeHByZXNzaW9uKGFDVFgsICgqKCsraXQpKSk7CisJCW9wdGltaXplZENvZGUtPmFwcGVuZCggYXJnICk7CisKKwkJYXJnc0luc3RydWN0aW9uLT5hdCgxKS5kdHlwZSA9IFR5cGVNYW5hZ2VyOjpNQUNISU5FOworCQlzZXRBcmdjb2RlUlZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMSksIGFyZyk7CisKKwkJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDIgOyAoKytpdCAhPSBlbmRJdCkgOyArK29mZnNldCApCisJCXsKKwkJCWFyZyA9IEFWTUNPREVfQ09NUElMRVIuZGVjb2RlX29wdGltaXplRXhwcmVzc2lvbihhQ1RYLCAoKml0KSk7CisJCQlvcHRpbWl6ZWRDb2RlLT5hcHBlbmQoIGFyZyApOworCisJCQlhcmdzSW5zdHJ1Y3Rpb24tPmF0KG9mZnNldCkuZHR5cGUgPSBUeXBlTWFuYWdlcjo6VU5JVkVSU0FMOworCQkJc2V0QXJnY29kZVJWYWx1ZShhQ1RYLCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KG9mZnNldCksICgqaXQpLCBmYWxzZSk7CisJCX0KKworCQlhcmdzSW5zdHJ1Y3Rpb24tPmNvbXB1dGVNYWluQnl0ZWNvZGUoCisJCQkJLypjb250ZXh0ICAqLyBBVk1fQVJHX1NUQU5EQVJEX0NUWCwKKwkJCQkvKnByb2Nlc3NvciovIEFWTV9BUkdfU1RBVEVNRU5UX0NQVSwKKwkJCQkvKm9wZXJhdGlvbiovIEFWTV9BUkdfU0VWQUxfUlZBTFVFLAorCQkJCS8qb3BlcmFuZCAgKi8gQVZNX0FSR19TVEFURU1FTlRfS0lORCk7CisKKwkJcmV0dXJuKCBvcHRpbWl6ZWRDb2RlICk7CisJfQorCWVsc2UKKwl7CisJCWdldENvbXBpbGVyVGFibGUoKS5pbmNyRXJyb3JDb3VudCgpOworCQlhQ1RYLT5lcnJvckNvbnRleHQoIEFWTV9PU19XQVJOICkKKwkJCQk8PCAiQXZtY29kZUlucHV0Q29tcGlsZXI6Om9wdGltaXplU3RhdGVtZW50IDo+IFVuZXhwZWN0ZWQgPDwgIgorCQkJCTw8IHN0cl9oZWFkZXIoIGFyZyApIDw8ICIgPj4gYXMgaW5wdXQgZmlyc3QgYXJndW1lbnQgISEhIgorCQkJCTw8IHN0ZDo6ZW5kbDsKKworCQlyZXR1cm4oIGFDb2RlICk7CisJfQorfQorCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFWTUNPREUgT1VUUFVUI1ZBUiBTVEFURU1FTlQgQ09NUElMQVRJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0JGQ29kZSBBdm1jb2RlT3V0cHV0VmFyQ29tcGlsZXI6OmNvbXBpbGVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCUJGIGx2YWx1ZSA9IGNvbXBpbGVBcmdMdmFsdWUoYUNUWCwgYUNvZGUtPmZpcnN0KCkpOworCisJaWYoIGFDb2RlLT5wb3B1bGF0ZWQoKSApCisJeworCQlpZiggbHZhbHVlLmlzPCBJbnN0YW5jZU9mRGF0YSA+KCkgKQorCQl7CisJCQlhQ1RYID0gYUNUWC0+Y2xvbmUoIGx2YWx1ZS50b19wdHI8CisJCQkJCUluc3RhbmNlT2ZEYXRhID4oKS0+Z2V0VHlwZVNwZWNpZmllcigpICk7CisJCX0KKwkJcmV0dXJuKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSggYUNvZGUtPmdldE9wZXJhdG9yKCksCisJCQkJbHZhbHVlLCBjb21waWxlQXJnUnZhbHVlKGFDVFgsIGFDb2RlLT5zZWNvbmQoKSkpICk7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJYUNvZGUtPmdldE9wZXJhdG9yKCksIGx2YWx1ZSwgbHZhbHVlKSApOworCX0KK30KKworCitCRkNvZGUgQXZtY29kZU91dHB1dFZhckNvbXBpbGVyOjpvcHRpbWl6ZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJaWYoIGFDb2RlLT5zaW5nbGV0b24oKSApCisJeworCQlhQ29kZS0+YXBwZW5kKCBhQ29kZS0+Zmlyc3QoKSApOworCX0KKworCUF2bUluc3RydWN0aW9uICogYXJnc0luc3RydWN0aW9uID0gYUNvZGUtPmdlbkluc3RydWN0aW9uKCk7CisKKwlzZXRBcmdjb2RlTFZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMCksIGFDb2RlLT5maXJzdCgpKTsKKworCWlmKCBhQ29kZS0+c2luZ2xldG9uKCkgKQorCXsKKwkJYUNvZGUtPmFwcGVuZCggYUNvZGUtPmZpcnN0KCkgKTsKKwl9CisKKwlvcHRpbWl6ZUFyZ0V4cHJlc3Npb24oYUNUWCwgYUNvZGUsIDEpOworCWFyZ3NJbnN0cnVjdGlvbi0+YXQoMSkuZHR5cGUgPSBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLmR0eXBlOworCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdCgxKSwgYUNvZGUtPnNlY29uZCgpKTsKKworCWFyZ3NJbnN0cnVjdGlvbi0+Y29tcHV0ZU1haW5CeXRlY29kZSgKKwkJCS8qY29udGV4dCAgKi8gQVZNX0FSR19TVEFOREFSRF9DVFgsCisJCQkvKnByb2Nlc3NvciovIEFWTV9BUkdfU1RBVEVNRU5UX0NQVSwKKwkJCS8qb3BlcmF0aW9uKi8gQVZNX0FSR19TRVZBTF9SVkFMVUUsCisJCQkvKm9wZXJhbmQgICovIEFWTV9BUkdfU1RBVEVNRU5UX0tJTkQsCisJCQkvKmR0eXBlICAgICovIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMCkuZHR5cGUpOworCisJcmV0dXJuKCBhQ29kZSApOworfQorCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFWTUNPREUgT1VUUFVUI0VOViBTVEFURU1FTlQgQ09NUElMQVRJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0JGQ29kZSBBdm1jb2RlT3V0cHV0RW52Q29tcGlsZXI6OmNvbXBpbGVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCXJldHVybiggY29tcGlsZUV4cHJlc3Npb25Db2RlKGFDVFgsIGFDb2RlKSApOworfQorCisKK0JGQ29kZSBBdm1jb2RlT3V0cHV0RW52Q29tcGlsZXI6Om9wdGltaXplU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlCRkNvZGUgb3B0aW1pemVkQ29kZSggYUNvZGUtPmdldE9wZXJhdG9yKCkgKTsKKworCUF2bUluc3RydWN0aW9uICogYXJnc0luc3RydWN0aW9uID0KKwkJCW9wdGltaXplZENvZGUtPm5ld0luc3RydWN0aW9uKCBhQ29kZS0+c2l6ZSgpICk7CisKKwlBdm1Db2RlOjppdGVyYXRvciBpdCA9IGFDb2RlLT5iZWdpbigpOworCUF2bUNvZGU6Oml0ZXJhdG9yIGVuZEl0ID0gYUNvZGUtPmVuZCgpOworCisJQkYgYXJnID0gQVZNQ09ERV9DT01QSUxFUi5kZWNvZGVfb3B0aW1pemVFeHByZXNzaW9uKGFDVFgsICgqaXQpKTsKKwlvcHRpbWl6ZWRDb2RlLT5hcHBlbmQoIGFyZyApOworCisJaWYoIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNUeXBlZChUeXBlTWFuYWdlcjo6UE9SVCwgYXJnKSApCisJeworCQlhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLmR0eXBlID0gVHlwZU1hbmFnZXI6OlBPUlQ7CisJCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdCgwKSwgYXJnLCBmYWxzZSk7CisKKwkJSW5zdGFuY2VPZlBvcnQgKiBhUG9ydCA9IGFyZy5hc19wdHI8IEluc3RhbmNlT2ZQb3J0ID4oKTsKKwkJYXZtX3NpemVfdCBwYXJhbUNvdW50ID0gYVBvcnQtPmdldFBhcmFtZXRlckNvdW50KCk7CisKKwkJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDEgOworCQkJCSgrK2l0ICE9IGVuZEl0KSAmJiAocGFyYW1Db3VudCA+IDApIDsgKytvZmZzZXQgLCAtLXBhcmFtQ291bnQgKQorCQl7CisJCQlhcmcgPSBBVk1DT0RFX0NPTVBJTEVSLmRlY29kZV9vcHRpbWl6ZUV4cHJlc3Npb24oYUNUWCwgKCppdCkpOworCQkJb3B0aW1pemVkQ29kZS0+YXBwZW5kKCBhcmcgKTsKKworCQkJYXJnc0luc3RydWN0aW9uLT5hdChvZmZzZXQpLmR0eXBlID0gYVBvcnQtPmdldFBhcmFtZXRlclR5cGUob2Zmc2V0LTEpOworCQkJc2V0QXJnY29kZVJWYWx1ZShhQ1RYLCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KG9mZnNldCksIGFyZyk7CisJCX0KKworCQlhcmdzSW5zdHJ1Y3Rpb24tPmNvbXB1dGVNYWluQnl0ZWNvZGUoCisJCQkJLypjb250ZXh0ICAqLyBBVk1fQVJHX1NUQU5EQVJEX0NUWCwKKwkJCQkvKnByb2Nlc3NvciovIEFWTV9BUkdfU1RBVEVNRU5UX0NQVSwKKwkJCQkvKm9wZXJhdGlvbiovIEFWTV9BUkdfU0VWQUxfUlZBTFVFLAorCQkJCS8qb3BlcmFuZCAgKi8gQVZNX0FSR19TVEFURU1FTlRfS0lORCk7CisKKwkJcmV0dXJuKCBvcHRpbWl6ZWRDb2RlICk7CisJfQorCWVsc2UgaWYoIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNUeXBlZChUeXBlTWFuYWdlcjo6UE9SVCwgYXJnKSApCisJeworCQlhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLmR0eXBlID0gVHlwZU1hbmFnZXI6OlBPUlQ7CisJCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdCgwKSwgYXJnLCBmYWxzZSk7CisKKwkJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDEgOyAoKytpdCAhPSBlbmRJdCkgOyArK29mZnNldCApCisJCXsKKwkJCWFyZyA9IEFWTUNPREVfQ09NUElMRVIuZGVjb2RlX29wdGltaXplRXhwcmVzc2lvbihhQ1RYLCAoKml0KSk7CisJCQlvcHRpbWl6ZWRDb2RlLT5hcHBlbmQoIGFyZyApOworCisJCQlhcmdzSW5zdHJ1Y3Rpb24tPmF0KG9mZnNldCkuZHR5cGUgPSBUeXBlTWFuYWdlcjo6VU5JVkVSU0FMOworCQkJc2V0QXJnY29kZVJWYWx1ZShhQ1RYLCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KG9mZnNldCksIGFyZyk7CisJCX0KKworCQlhcmdzSW5zdHJ1Y3Rpb24tPmNvbXB1dGVNYWluQnl0ZWNvZGUoCisJCQkJLypjb250ZXh0ICAqLyBBVk1fQVJHX1NUQU5EQVJEX0NUWCwKKwkJCQkvKnByb2Nlc3NvciovIEFWTV9BUkdfU1RBVEVNRU5UX0NQVSwKKwkJCQkvKm9wZXJhdGlvbiovIEFWTV9BUkdfU0VWQUxfUlZBTFVFLAorCQkJCS8qb3BlcmFuZCAgKi8gQVZNX0FSR19TVEFURU1FTlRfS0lORCk7CisKKwkJcmV0dXJuKCBvcHRpbWl6ZWRDb2RlICk7CisJfQorCWVsc2UgaWYoIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNUeXBlZChUeXBlTWFuYWdlcjo6TUVTU0FHRSwgYXJnKSApCisJeworCQlhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLmR0eXBlID0gVHlwZU1hbmFnZXI6Ok1FU1NBR0U7CisJCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdCgwKSwgYXJnLCBmYWxzZSk7CisKKwkJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDEgOyAoKytpdCAhPSBlbmRJdCkgOyArK29mZnNldCApCisJCXsKKwkJCWFyZyA9IEFWTUNPREVfQ09NUElMRVIuZGVjb2RlX29wdGltaXplRXhwcmVzc2lvbihhQ1RYLCAoKml0KSk7CisJCQlvcHRpbWl6ZWRDb2RlLT5hcHBlbmQoIGFyZyApOworCisJCQlhcmdzSW5zdHJ1Y3Rpb24tPmF0KG9mZnNldCkuZHR5cGUgPSBUeXBlTWFuYWdlcjo6VU5JVkVSU0FMOworCQkJc2V0QXJnY29kZVJWYWx1ZShhQ1RYLCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KG9mZnNldCksICgqaXQpLCBmYWxzZSk7CisJCX0KKworCQlhcmdzSW5zdHJ1Y3Rpb24tPmNvbXB1dGVNYWluQnl0ZWNvZGUoCisJCQkJLypjb250ZXh0ICAqLyBBVk1fQVJHX1NUQU5EQVJEX0NUWCwKKwkJCQkvKnByb2Nlc3NvciovIEFWTV9BUkdfU1RBVEVNRU5UX0NQVSwKKwkJCQkvKm9wZXJhdGlvbiovIEFWTV9BUkdfU0VWQUxfUlZBTFVFLAorCQkJCS8qb3BlcmFuZCAgKi8gQVZNX0FSR19TVEFURU1FTlRfS0lORCk7CisKKwkJcmV0dXJuKCBvcHRpbWl6ZWRDb2RlICk7CisJfQorCWVsc2UKKwl7CisJCWdldENvbXBpbGVyVGFibGUoKS5pbmNyRXJyb3JDb3VudCgpOworCQlhQ1RYLT5lcnJvckNvbnRleHQoIEFWTV9PU19XQVJOICkKKwkJCQk8PCAiQXZtY29kZUlucHV0Q29tcGlsZXI6Om9wdGltaXplU3RhdGVtZW50IDo+IFVuZXhwZWN0ZWQgPDwgIgorCQkJCTw8IHN0cl9oZWFkZXIoIGFyZyApIDw8ICIgPj4gYXMgaW5wdXQgZmlyc3QgYXJndW1lbnQgISEhIgorCQkJCTw8IHN0ZDo6ZW5kbDsKKworCQlyZXR1cm4oIGFDb2RlICk7CisJfQorfQorCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFWTUNPREUgUFJFU0VOVCBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkYgQXZtY29kZUFic2VudFByZXNlbnRDb21waWxlcjo6Y29tcGlsZUV4cHJlc3Npb24oCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCXJldHVybiggY29tcGlsZUV4cHJlc3Npb25Db2RlKGFDVFgsIGFDb2RlKSApOworfQorCitCRiBBdm1jb2RlQWJzZW50UHJlc2VudENvbXBpbGVyOjpvcHRpbWl6ZUV4cHJlc3Npb24oCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCXJldHVybiggb3B0aW1pemVFeHByZXNzaW9uQ29kZShhQ1RYLCBhQ29kZSkgKTsKK30KKworCitCRkNvZGUgQXZtY29kZUFic2VudFByZXNlbnRDb21waWxlcjo6Y29tcGlsZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJcmV0dXJuKCBjb21waWxlRXhwcmVzc2lvbkNvZGUoYUNUWCwgYUNvZGUpICk7Cit9CisKK0JGQ29kZSBBdm1jb2RlQWJzZW50UHJlc2VudENvbXBpbGVyOjpvcHRpbWl6ZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJcmV0dXJuKCBvcHRpbWl6ZVN0YXRlbWVudENvZGUoYUNUWCwgYUNvZGUpICk7Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQVZNQ09ERSBPQlMgQ09NUElMQVRJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2lubGluZSBCRiBBdm1jb2RlT2JzQ29tcGlsZXI6OmNvbXBpbGVFeHByZXNzaW9uKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlyZXR1cm4oIGNvbXBpbGVTdGF0ZW1lbnQoYUNUWCwgYUNvZGUpICk7Cit9CisKK2lubGluZSBCRiBBdm1jb2RlT2JzQ29tcGlsZXI6Om9wdGltaXplRXhwcmVzc2lvbigKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJQkZDb2RlIG9wdENvZGUgPSBvcHRpbWl6ZVN0YXRlbWVudChhQ1RYLCBhQ29kZSk7CisKKwlvcHRDb2RlLT5nZXRJbnN0cnVjdGlvbigpLT5zZXRNYWluT3BlcmFuZCggQVZNX0FSR19FWFBSRVNTSU9OX0tJTkQgKTsKKworCXJldHVybiggb3B0Q29kZSApOworfQorCisKK2lubGluZSBCRkNvZGUgQXZtY29kZU9ic0NvbXBpbGVyOjpjb21waWxlU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlpZiggYUNvZGUtPnNpemUoKSA9PSAyICkKKwl7CisJCXJldHVybiggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoIGFDb2RlLT5nZXRPcGVyYXRvcigpLAorCQkJCUFWTUNPREVfQ09NUElMRVIuZ2V0Q29uZmlndXJhdGlvbigpLgorCQkJCQlnZXRFeGVjdXRhYmxlU3lzdGVtKCkuZ2V0U3lzdGVtSW5zdGFuY2UoKSwKKwkJCQljb21waWxlQXJnU3RhdGVtZW50KGFDVFgsIGFDb2RlLT5maXJzdCgpKSwKKwkJCQljb21waWxlQXJnUnZhbHVlKGFDVFgsIFR5cGVNYW5hZ2VyOjpCT09MRUFOLCBhQ29kZS0+c2Vjb25kKCkpKSApOworCX0KKwlyZXR1cm4oIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKCBhQ29kZS0+Z2V0T3BlcmF0b3IoKSwKKwkJCWNvbXBpbGVBcmdSdmFsdWUoYUNUWCwgVHlwZU1hbmFnZXI6Ok1BQ0hJTkUsIGFDb2RlLT5maXJzdCgpKSwKKwkJCWNvbXBpbGVBcmdTdGF0ZW1lbnQoYUNUWCwgYUNvZGUtPnNlY29uZCgpKSwKKwkJCWNvbXBpbGVBcmdSdmFsdWUoYUNUWCwgVHlwZU1hbmFnZXI6OkJPT0xFQU4sIGFDb2RlLT50aGlyZCgpKSkgKTsKK30KKworLy8gbHZhbHVlID06IHJ2YWx1ZTsgID09PiAgWyBsdmFsdWUgLCBydmFsdWUgXQorQkZDb2RlIEF2bWNvZGVPYnNDb21waWxlcjo6b3B0aW1pemVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCUF2bUluc3RydWN0aW9uICogYXJnc0luc3RydWN0aW9uID0gYUNvZGUtPmdlbkluc3RydWN0aW9uKCk7CisKKwlvcHRpbWl6ZUFyZ1N0YXRlbWVudChhQ1RYLCBhQ29kZSwgMCk7CisJc2V0QXJnY29kZVJWYWx1ZShhQ1RYLCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLCBhQ29kZS0+Zmlyc3QoKSk7CisJYXJnc0luc3RydWN0aW9uLT5vcGVyYW5kKDAsIEFWTV9BUkdfTUFDSElORV9SSUQpOworCisJb3B0aW1pemVBcmdTdGF0ZW1lbnQoYUNUWCwgYUNvZGUsIDEpOworCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdCgxKSwgYUNvZGUtPnNlY29uZCgpKTsKKworCW9wdGltaXplQXJnRXhwcmVzc2lvbihhQ1RYLCBhQ29kZSwgMik7CisJYXJnc0luc3RydWN0aW9uLT5hdCgyKS5kdHlwZSA9IFR5cGVNYW5hZ2VyOjpCT09MRUFOOworCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdCgyKSwgYUNvZGUtPnRoaXJkKCkpOworCisJYXJnc0luc3RydWN0aW9uLT5jb21wdXRlTWFpbkJ5dGVjb2RlKAorCQkJLypjb250ZXh0ICAqLyBBVk1fQVJHX1NUQU5EQVJEX0NUWCwKKwkJCS8qcHJvY2Vzc29yKi8gQVZNX0FSR19TVEFURU1FTlRfQ1BVLAorCQkJLypvcGVyYXRpb24qLyBBVk1fQVJHX1NFVkFMX1JWQUxVRSwKKwkJCS8qb3BlcmFuZCAgKi8gQVZNX0FSR19TVEFURU1FTlRfS0lORCwKKwkJCS8qZHR5cGUgICAgKi8gYXJnc0luc3RydWN0aW9uLT5hdCgwKS5kdHlwZSk7CisKKwlyZXR1cm4oIGFDb2RlICk7Cit9CisKKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlQ29tbXVuaWNhdGlvbkNvbXBpbGVyLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlQ29tbXVuaWNhdGlvbkNvbXBpbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEyMjlmZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVDb21tdW5pY2F0aW9uQ29tcGlsZXIuaApAQCAtMCwwICsxLDYzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTIgYXZyLiAyMDExCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQVZNQ09ERUNPTU1VTklDQVRJT05DT01QSUxFUl9IXworI2RlZmluZSBBVk1DT0RFQ09NTVVOSUNBVElPTkNPTVBJTEVSX0hfCisKKyNpbmNsdWRlIDxidWlsZGVyL3ByaW1pdGl2ZS9BYnN0cmFjdEF2bWNvZGVDb21waWxlci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitBVk1DT0RFX0NPTVBJTEVSX1NUQVRFTUVOVF9PUFRJTUlaRVJfQ0xBU1MoCisJCSJJTlBVVCIsIElucHV0LCBBYnN0cmFjdEF2bWNvZGVDb21waWxlcikKKworQVZNQ09ERV9DT01QSUxFUl9TVEFURU1FTlRfT1BUSU1JWkVSX0NMQVNTKAorCQkiSU5QVVQjRlJPTSIsIElucHV0RnJvbSwgQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXIpCisKK0FWTUNPREVfQ09NUElMRVJfU1RBVEVNRU5UX09QVElNSVpFUl9DTEFTUygKKwkJIklOUFVUI1NBVkUiLCBJbnB1dFNhdmUsIEFic3RyYWN0QXZtY29kZUNvbXBpbGVyKQorCitBVk1DT0RFX0NPTVBJTEVSX1NUQVRFTUVOVF9PUFRJTUlaRVJfQ0xBU1MoCisJCSJJTlBVVCNWQVIiLCBJbnB1dFZhciwgQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXIpCisKK0FWTUNPREVfQ09NUElMRVJfU1RBVEVNRU5UX09QVElNSVpFUl9DTEFTUygKKwkJIklOUFVUI0VOViIsIElucHV0RW52LCBBYnN0cmFjdEF2bWNvZGVDb21waWxlcikKKworCitBVk1DT0RFX0NPTVBJTEVSX1NUQVRFTUVOVF9PUFRJTUlaRVJfQ0xBU1MoCisJCSJPVVRQVVQiLCBPdXRwdXQsIEFic3RyYWN0QXZtY29kZUNvbXBpbGVyKQorCitBVk1DT0RFX0NPTVBJTEVSX1NUQVRFTUVOVF9PUFRJTUlaRVJfQ0xBU1MoCisJCSJPVVRQVVQjVE8iLCBPdXRwdXRUbywgQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXIpCisKK0FWTUNPREVfQ09NUElMRVJfU1RBVEVNRU5UX09QVElNSVpFUl9DTEFTUygKKwkJIk9VVFBVVCNWQVIiLCBPdXRwdXRWYXIsIEFic3RyYWN0QXZtY29kZUNvbXBpbGVyKQorCitBVk1DT0RFX0NPTVBJTEVSX1NUQVRFTUVOVF9PUFRJTUlaRVJfQ0xBU1MoCisJCSJPVVRQVVQjRU5WIiwgT3V0cHV0RW52LCBBYnN0cmFjdEF2bWNvZGVDb21waWxlcikKKworCitBVk1DT0RFX0NPTVBJTEVSX09QVElNSVpFUl9DTEFTUyhBYnNlbnRQcmVzZW50LCBBYnN0cmFjdEF2bWNvZGVDb21waWxlcikKKworCitBVk1DT0RFX0NPTVBJTEVSX09QVElNSVpFUl9DTEFTUyhPYnMsIEFic3RyYWN0QXZtY29kZUNvbXBpbGVyKQorCisKK30KKworI2VuZGlmIC8qIEFWTUNPREVDT01NVU5JQ0FUSU9OQ09NUElMRVJfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVDb21waWxlci5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlQ29tcGlsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNzBkZjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlQ29tcGlsZXIuY3BwCkBAIC0wLDAgKzEsMjkzNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuDQorICoNCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ3JlYXRlZCBvbjogNyBhdnIuIDIwMTENCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcg0KKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlICJBdm1jb2RlQ29tcGlsZXIuaCINCisNCisjaW5jbHVkZSA8aW9zdHJlYW0+DQorDQorI2luY2x1ZGUgPGJ1aWxkZXIvY29tcGlsZXIvQmFzZUNvbXBpbGVyLmg+DQorI2luY2x1ZGUgPGJ1aWxkZXIvY29tcGlsZXIvQmFzZUNvbXBpbGVyVGFibGUuaD4NCisNCisjaW5jbHVkZSA8YnVpbGRlci9wcmltaXRpdmUvQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXIuaD4NCisjaW5jbHVkZSA8YnVpbGRlci9wcmltaXRpdmUvQXZtY29kZUFjdGl2aXR5Q29tcGlsZXIuaD4NCisjaW5jbHVkZSA8YnVpbGRlci9wcmltaXRpdmUvQXZtY29kZUFzc2lnbkNvbXBpbGVyLmg+DQorI2luY2x1ZGUgPGJ1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVDb21tdW5pY2F0aW9uQ29tcGlsZXIuaD4NCisjaW5jbHVkZSA8YnVpbGRlci9wcmltaXRpdmUvQXZtY29kZUNvbnRhaW5lckNvbXBpbGVyLmg+DQorI2luY2x1ZGUgPGJ1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVDdG9yRXhwcmVzc2lvbkNvbXBpbGVyLmg+DQorI2luY2x1ZGUgPGJ1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVFeHByZXNzaW9uQ29tcGlsZXIuaD4NCisjaW5jbHVkZSA8YnVpbGRlci9wcmltaXRpdmUvQXZtY29kZUdpbmFjQ29tcGlsZXIuaD4NCisjaW5jbHVkZSA8YnVpbGRlci9wcmltaXRpdmUvQXZtY29kZUd1YXJkQ29tcGlsZXIuaD4NCisjaW5jbHVkZSA8YnVpbGRlci9wcmltaXRpdmUvQXZtY29kZUludm9rZUNvbXBpbGVyLmg+DQorI2luY2x1ZGUgPGJ1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVJdGVDb21waWxlci5oPg0KKyNpbmNsdWRlIDxidWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlSnVtcENvbXBpbGVyLmg+DQorI2luY2x1ZGUgPGJ1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVMYW1iZGFDb21waWxlci5oPg0KKyNpbmNsdWRlIDxidWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlTG9va3VwRXhwckNvbXBpbGVyLmg+DQorI2luY2x1ZGUgPGJ1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVMb29wQ29tcGlsZXIuaD4NCisjaW5jbHVkZSA8YnVpbGRlci9wcmltaXRpdmUvQXZtY29kZU1hY2hpbmVTdGF0dXNDb21waWxlci5oPg0KKyNpbmNsdWRlIDxidWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlTWF0aEZ1bmN0aW9uQ29tcGlsZXIuaD4NCisjaW5jbHVkZSA8YnVpbGRlci9wcmltaXRpdmUvQXZtY29kZU1ldGFTdGF0ZW1lbnRDb21waWxlci5oPg0KKyNpbmNsdWRlIDxidWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlUXVldWVDb21waWxlci5oPg0KKyNpbmNsdWRlIDxidWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlU2NoZWR1bGluZ0NvbXBpbGVyLmg+DQorI2luY2x1ZGUgPGJ1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVTZXF1ZW5jZUNvbXBpbGVyLmg+DQorI2luY2x1ZGUgPGJ1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVVZmlDYXN0RXhwcmVzc2lvbkNvbXBpbGVyLmg+DQorI2luY2x1ZGUgPGJ1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVWYXJpYWJsZVN0YXR1c0NvbXBpbGVyLmg+DQorDQorI2luY2x1ZGUgPGZtbC9jb21tb24vU3BlY2lmaWVyRWxlbWVudC5oPg0KKw0KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9Bdm1Qcm9ncmFtLmg+DQorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0Jhc2VBdm1Qcm9ncmFtLmg+DQorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVGb3JtLmg+DQorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZEYXRhLmg+DQorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZQb3J0Lmg+DQorDQorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0F2bUNvZGUuaD4NCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQnVpbHRpbkFycmF5Lmg+DQorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0J1aWx0aW5Db250YWluZXIuaD4NCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkNvbnN0cnVjdG9yLmg+DQorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL1N0YXRlbWVudEZhY3RvcnkuaD4NCisNCisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yLmg+DQorI2luY2x1ZGUgPGZtbC9vcGVyYXRvci9PcGVyYXRvck1hbmFnZXIuaD4NCisNCisjaW5jbHVkZSA8Zm1sL3R5cGUvVHlwZU1hbmFnZXIuaD4NCisNCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0J1ZmZlci5oPg0KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvQ29ubmVjdG9yLmg+DQorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9EYXRhVHlwZS5oPg0KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvTWFjaGluZS5oPg0KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvUG9ydC5oPg0KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvUm91dGluZS5oPg0KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvVHJhbnNpdGlvbi5oPg0KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvVmFyaWFibGUuaD4NCisNCisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1VuaUZvcm1JZGVudGlmaWVyLmg+DQorDQorI2luY2x1ZGUgPHNldy9Db25maWd1cmF0aW9uLmg+DQorDQorDQorbmFtZXNwYWNlIHNlcA0KK3sNCisNCisNCisjZGVmaW5lIE5FV19DT01QSUxFUiggT1BfQUMgKSAgXA0KKwkoIEFWTUNPREVfQ09NUElMRVJfVEFCTEVfRk9SX0RFU1RST1kucHVzaF9iYWNrKCBuZXcgT1BfQUMoICp0aGlzICkgKSAsICBcDQorCUFWTUNPREVfQ09NUElMRVJfVEFCTEVfRk9SX0RFU1RST1kuYmFjaygpICkNCisNCisNCisjZGVmaW5lIE9QQ09ERV9DT01QSUxFUiggT1BfSUQgKSAgIFwNCisJQVZNQ09ERV9DT01QSUxFUl9UQUJMRVsgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl8jI09QX0lELT5nZXRPZmZzZXQoKSBdDQorDQorDQorDQorLyoqDQorICogREVTVFJVQ1RPUg0KKyAqLw0KK0F2bWNvZGVDb21waWxlcjo6fkF2bWNvZGVDb21waWxlcigpDQorew0KKwlBVk1DT0RFX0NPTVBJTEVSX1RBQkxFLmNsZWFyKCk7DQorDQorCXN0ZDo6dmVjdG9yPCBBYnN0cmFjdEF2bWNvZGVDb21waWxlciAqID46Oml0ZXJhdG9yIGl0ID0NCisJCQlBVk1DT0RFX0NPTVBJTEVSX1RBQkxFX0ZPUl9ERVNUUk9ZLmJlZ2luKCk7DQorCXN0ZDo6dmVjdG9yPCBBYnN0cmFjdEF2bWNvZGVDb21waWxlciAqID46Oml0ZXJhdG9yIGVuZEl0ID0NCisJCQlBVk1DT0RFX0NPTVBJTEVSX1RBQkxFX0ZPUl9ERVNUUk9ZLmVuZCgpOw0KKwlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMCA7IGl0ICE9IGVuZEl0IDsgKytpdCAsICsrb2Zmc2V0ICkNCisJew0KKwkJZGVsZXRlKCAqaXQgKTsNCisJfQ0KKw0KKwlkZWxldGUoIFVGSV9FWFBSRVNTSU9OX0NPTVBJTEVSICk7DQorDQorCUFWTUNPREVfQ09NUElMRVJfVEFCTEVfRk9SX0RFU1RST1kuY2xlYXIoKTsNCit9DQorDQorDQorLyoNCisgKiBHRVRURVINCisgKiB0aGVTeW1ib2xUYWJsZQ0KKyAqLw0KK1N5bWJvbFRhYmxlICYgQXZtY29kZUNvbXBpbGVyOjpnZXRTeW1ib2xUYWJsZSgpDQorew0KKwlyZXR1cm4oIG1Db21waWxlclRhYmxlLmdldFN5bWJvbFRhYmxlKCkgKTsNCit9DQorDQorDQorLyoqDQorICogQ09ORklHVVJFDQorICovDQorYm9vbCBBdm1jb2RlQ29tcGlsZXI6OmNvbmZpZ3VyZSgpDQorew0KKwlERUZBVUxUX0FWTUNPREVfQ09NUElMRVIgPU5FV19DT01QSUxFUiggQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXIgKTsNCisNCisJTk9USElOR19BVk1DT0RFX0NPTVBJTEVSID1ORVdfQ09NUElMRVIoIEF2bWNvZGVOb3RoaW5nQ29tcGlsZXIgKTsNCisNCisJVU5BUllfQVJJVEhNRVRJQ19FWFBSRVNTSU9OX0NPTVBJTEVSID0NCisJCQlORVdfQ09NUElMRVIoIEF2bWNvZGVVbmFyeUFyaXRobWV0aWNFeHByZXNzaW9uQUxVQ29tcGlsZXIgKTsNCisJQklOQVJZX0FSSVRITUVUSUNfRVhQUkVTU0lPTl9DT01QSUxFUiA9DQorCQkJTkVXX0NPTVBJTEVSKCBBdm1jb2RlQmluYXJ5QXJpdGhtZXRpY0V4cHJlc3Npb25BTFVDb21waWxlciApOw0KKwlBU1NPQ0lBVElWRV9BUklUSE1FVElDX0VYUFJFU1NJT05fQ09NUElMRVIgPQ0KKwkJCU5FV19DT01QSUxFUiggQXZtY29kZUFzc29jaWF0aXZlQXJpdGhtZXRpY0V4cHJlc3Npb25BTFVDb21waWxlciApOw0KKw0KKwlVTkFSWV9CSVRXSVNFX0VYUFJFU1NJT05fQ09NUElMRVIgPQ0KKwkJCU5FV19DT01QSUxFUiggQXZtY29kZVVuYXJ5Qml0d2lzZUV4cHJlc3Npb25Db21waWxlciApOw0KKwlCSU5BUllfQklUV0lTRV9FWFBSRVNTSU9OX0NPTVBJTEVSID0NCisJCQlORVdfQ09NUElMRVIoIEF2bWNvZGVCaW5hcnlCaXR3aXNlRXhwcmVzc2lvbkNvbXBpbGVyICk7DQorCUFTU09DSUFUSVZFX0JJVFdJU0VfRVhQUkVTU0lPTl9DT01QSUxFUiA9DQorCQkJTkVXX0NPTVBJTEVSKCBBdm1jb2RlQXNzb2NpYXRpdmVCaXR3aXNlRXhwcmVzc2lvbkNvbXBpbGVyICk7DQorDQorCVVOQVJZX1BSRURJQ0FURV9FWFBSRVNTSU9OX0NPTVBJTEVSID0NCisJCQlORVdfQ09NUElMRVIoIEF2bWNvZGVVbmFyeVByZWRpY2F0ZUV4cHJlc3Npb25Db21waWxlciApOw0KKwlCSU5BUllfUFJFRElDQVRFX0VYUFJFU1NJT05fQ09NUElMRVIgPQ0KKwkJCU5FV19DT01QSUxFUiggQXZtY29kZUJpbmFyeVByZWRpY2F0ZUV4cHJlc3Npb25Db21waWxlciApOw0KKwlBU1NPQ0lBVElWRV9QUkVESUNBVEVfRVhQUkVTU0lPTl9DT01QSUxFUiA9DQorCQkJTkVXX0NPTVBJTEVSKCBBdm1jb2RlQXNzb2NpYXRpdmVQcmVkaWNhdGVFeHByZXNzaW9uQ29tcGlsZXIgKTsNCisNCisJUkVMQVRJT05BTF9FWFBSRVNTSU9OX0NPTVBJTEVSID0NCisJCQlORVdfQ09NUElMRVIoIEF2bWNvZGVSZWxhdGlvbmFsRXhwcmVzc2lvbkNvbXBpbGVyICk7DQorDQorCVVOQVJZX1NUUklOR19FWFBSRVNTSU9OX0NPTVBJTEVSID0NCisJCQlORVdfQ09NUElMRVIoIEF2bWNvZGVVbmFyeVN0cmluZ0V4cHJlc3Npb25Db21waWxlciApOw0KKwlCSU5BUllfU1RSSU5HX0VYUFJFU1NJT05fQ09NUElMRVIgPQ0KKwkJCU5FV19DT01QSUxFUiggQXZtY29kZUJpbmFyeVN0cmluZ0V4cHJlc3Npb25Db21waWxlciApOw0KKwlBU1NPQ0lBVElWRV9TVFJJTkdfRVhQUkVTU0lPTl9DT01QSUxFUiA9DQorCQkJTkVXX0NPTVBJTEVSKCBBdm1jb2RlQXNzb2NpYXRpdmVTdHJpbmdFeHByZXNzaW9uQ29tcGlsZXIgKTsNCisNCisJTE9PS1VQX0VYUFJFU1NJT05fQ09NUElMRVIgPQ0KKwkJCU5FV19DT01QSUxFUiggQXZtY29kZUxvb2t1cEV4cHJlc3Npb25Db21waWxlciApOw0KKw0KKwlNQUNISU5FX1NUQVRVU19FWFBSRVNTSU9OX0NPTVBJTEVSID0NCisJCQlORVdfQ09NUElMRVIoIEF2bWNvZGVNYWNoaW5lU3RhdHVzRXhwcmVzc2lvbkNvbXBpbGVyICk7DQorDQorCU1BVEhfRlVOQ1RJT05fQ09NUElMRVIgPQ0KKwkJCU5FV19DT01QSUxFUiggQXZtY29kZU1hdGhGdW5jdGlvbkNvbXBpbGVyICk7DQorDQorCVVGSV9FWFBSRVNTSU9OX0NPTVBJTEVSID0NCisJCQluZXcgQXZtY29kZVVmaUV4cHJlc3Npb25Db21waWxlciggKnRoaXMgKTsNCisNCisJVkFSSUFCTEVfU1RBVFVTX0VYUFJFU1NJT05fQ09NUElMRVIgPQ0KKwkJCU5FV19DT01QSUxFUiggQXZtY29kZVZhcmlhYmxlU3RhdHVzRXhwcmVzc2lvbkNvbXBpbGVyICk7DQorDQorDQorCUFDVElWSVRZX1NUQVRFTUVOVF9DT01QSUxFUiA9DQorCQkJTkVXX0NPTVBJTEVSKCBBdm1jb2RlQWN0aXZpdHlTdGF0ZW1lbnRDb21waWxlciApOw0KKw0KKwlTQ0hFRFVMSU5HX1NUQVRFTUVOVF9DT01QSUxFUiA9DQorCQkJTkVXX0NPTVBJTEVSKCBBdm1jb2RlU2NoZWR1bGluZ0NvbXBpbGVyICk7DQorDQorCVNFUVVFTkNFX1NUQVRFTUVOVF9DT01QSUxFUiA9DQorCQkJTkVXX0NPTVBJTEVSKCBBdm1jb2RlU2VxdWVuY2VDb21waWxlciApOw0KKw0KKwlJVEVfU1RBVEVNRU5UX0NPTVBJTEVSID0NCisJCQlORVdfQ09NUElMRVIoIEF2bWNvZGVJdGVDb21waWxlciApOw0KKw0KKw0KKwlVTkFSWV9DT05UQUlORVJfU1RBVEVNRU5UID0NCisJCQlORVdfQ09NUElMRVIoIEF2bWNvZGVVbmFyeUNvbnRhaW5lclN0YXRlbWVudENvbXBpbGVyICk7DQorDQorCVVOQVJZX1dSSVRFX0NPTlRBSU5FUl9TVEFURU1FTlQgPQ0KKwkJCU5FV19DT01QSUxFUiggQXZtY29kZVVuYXJ5V3JpdGVDb250YWluZXJTdGF0ZW1lbnRDb21waWxlciApOw0KKw0KKwlCSU5BUllfQ09OVEFJTkVSX1NUQVRFTUVOVCA9DQorCQkJTkVXX0NPTVBJTEVSKCBBdm1jb2RlQmluYXJ5Q29udGFpbmVyU3RhdGVtZW50Q29tcGlsZXIgKTsNCisNCisJQklOQVJZX1dSSVRFX0NPTlRBSU5FUl9TVEFURU1FTlQgPQ0KKwkJCU5FV19DT01QSUxFUiggQXZtY29kZUJpbmFyeVdyaXRlQ29udGFpbmVyU3RhdGVtZW50Q29tcGlsZXIgKTsNCisNCisNCisJLy9ERUZBVUxUX0FWTUNPREVfQ09NUElMRVIpOw0KKwlBVk1DT0RFX0NPTVBJTEVSX1RBQkxFLnJlc2l6ZSgNCisJCQlPcGVyYXRvck1hbmFnZXI6OlRBQkxFX09GX09QRVJBVE9SLnNpemUoKSwNCisJCQlERUZBVUxUX0FWTUNPREVfQ09NUElMRVIgKTsNCisNCisJaWYoIG5vdCBjb25maWd1cmVPdGhlcigpICkNCisJew0KKwkJcmV0dXJuKCBmYWxzZSApOw0KKwl9DQorDQorCWlmKCBub3QgY29uZmlndXJlTWV0YSgpICkNCisJew0KKwkJcmV0dXJuKCBmYWxzZSApOw0KKwl9DQorDQorCWlmKCBub3QgY29uZmlndXJlTGFtYmRhUHJpbWl0aXZlKCkgKQ0KKwl7DQorCQlyZXR1cm4oIGZhbHNlICk7DQorCX0NCisNCisJaWYoIG5vdCBjb25maWd1cmVBY3Rpdml0eVByaW1pdGl2ZSgpICkNCisJew0KKwkJcmV0dXJuKCBmYWxzZSApOw0KKwl9DQorDQorCWlmKCBub3QgY29uZmlndXJlU3RhdHVzUHJpbWl0aXZlKCkgKQ0KKwl7DQorCQlyZXR1cm4oIGZhbHNlICk7DQorCX0NCisNCisJaWYoIG5vdCBjb25maWd1cmVTY2hlZHVsaW5nUHJpbWl0aXZlKCkgKQ0KKwl7DQorCQlyZXR1cm4oIGZhbHNlICk7DQorCX0NCisJaWYoIG5vdCBjb25maWd1cmVCYXNpY1ByaW1pdGl2ZSgpICkNCisJew0KKwkJcmV0dXJuKCBmYWxzZSApOw0KKwl9DQorDQorCWlmKCBub3QgY29uZmlndXJlQXJpdGhtZXRpY1ByaW1pdGl2ZSgpICkNCisJew0KKwkJcmV0dXJuKCBmYWxzZSApOw0KKwl9DQorCWlmKCBub3QgY29uZmlndXJlQml0d2lzZVByaW1pdGl2ZSgpICkNCisJew0KKwkJcmV0dXJuKCBmYWxzZSApOw0KKwl9DQorCWlmKCBub3QgY29uZmlndXJlTG9naWNQcmltaXRpdmUoKSApDQorCXsNCisJCXJldHVybiggZmFsc2UgKTsNCisJfQ0KKw0KKwlpZiggbm90IGNvbmZpZ3VyZUxvb2t1cFByaW1pdGl2ZSgpICkNCisJew0KKwkJcmV0dXJuKCBmYWxzZSApOw0KKwl9DQorCWlmKCBub3QgY29uZmlndXJlTWF0aGVtYXRpY1ByaW1pdGl2ZSgpICkNCisJew0KKwkJcmV0dXJuKCBmYWxzZSApOw0KKwl9DQorDQorCWlmKCBub3QgY29uZmlndXJlU3RyaW5nQ29sbGVjdGlvblByaW1pdGl2ZSgpICkNCisJew0KKwkJcmV0dXJuKCBmYWxzZSApOw0KKwl9DQorDQorCWlmKCBub3QgY29uZmlndXJlSW9sdFByaW1pdGl2ZSgpICkNCisJew0KKwkJcmV0dXJuKCBmYWxzZSApOw0KKwl9DQorDQorCXJldHVybiggdHJ1ZSApOw0KK30NCisNCisNCitib29sIEF2bWNvZGVDb21waWxlcjo6Y29uZmlndXJlT3RoZXIoKQ0KK3sNCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwkvLyBBVk0gVUZJIFNUQVRFTUVOVA0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorCU9QQ09ERV9DT01QSUxFUiggVUZJICkgPSBVRklfRVhQUkVTU0lPTl9DT01QSUxFUjsNCisNCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwkvLyBBVk0gQ0FTVCBTVEFURU1FTlQNCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwlPUENPREVfQ09NUElMRVIoIENUT1IgKSA9IE5FV19DT01QSUxFUiggQXZtY29kZUN0b3JFeHByZXNzaW9uQ29tcGlsZXIgKTsNCisNCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwkvLyBBVk0gR0lOQUMgRVhQUkVTU0lPTiAmIFNUQVRFTUVOVA0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8JbUdpbmFjUHJpbWl0aXZlID0gTkVXX0NPTVBJTEVSKCBBYnN0cmFjdEF2bWNvZGVDb21waWxlciApOw0KKw0KKw0KKwlyZXR1cm4oIHRydWUgKTsNCit9DQorDQorDQorYm9vbCBBdm1jb2RlQ29tcGlsZXI6OmNvbmZpZ3VyZU1ldGEoKQ0KK3sNCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwkvLyBBVk0gTk9QIFNUQVRFTUVOVA0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorCU9QQ09ERV9DT01QSUxFUiggTk9QICkgPSBOT1RISU5HX0FWTUNPREVfQ09NUElMRVI7DQorDQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisJLy8gQVZNIE1FVEEgU1RBVEVNRU5UDQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisJT1BDT0RFX0NPTVBJTEVSKCBJTkZPUk1BTCAgKSA9IE5FV19DT01QSUxFUiggQXZtY29kZUluZm9ybWFsRXhwcmVzc2lvbkNvbXBpbGVyICk7DQorDQorCU9QQ09ERV9DT01QSUxFUiggVFJBQ0UgICAgICkgPSBORVdfQ09NUElMRVIoIEF2bWNvZGVUcmFjZUV4cHJlc3Npb25Db21waWxlciApOw0KKw0KKwlPUENPREVfQ09NUElMRVIoIERFQlVHICAgICApID0gTkVXX0NPTVBJTEVSKCBBdm1jb2RlRGVidWdFeHByZXNzaW9uQ29tcGlsZXIgKTsNCisNCisJT1BDT0RFX0NPTVBJTEVSKCBDT01NRU5UICAgKSA9IE5FV19DT01QSUxFUiggQXZtY29kZUNvbW1lbnRFeHByZXNzaW9uQ29tcGlsZXIgKTsNCisNCisJT1BDT0RFX0NPTVBJTEVSKCBRVU9URSAgICAgKSA9IERFRkFVTFRfQVZNQ09ERV9DT01QSUxFUjsNCisNCisJT1BDT0RFX0NPTVBJTEVSKCBNRVRBX0VWQUwgKSA9IE5FV19DT01QSUxFUiggQXZtY29kZU1ldGFFdmFsU3RhdGVtZW50Q29tcGlsZXIgKTsNCisJT1BDT0RFX0NPTVBJTEVSKCBNRVRBX1JVTiAgKSA9IE5FV19DT01QSUxFUiggQXZtY29kZU1ldGFSdW5TdGF0ZW1lbnRDb21waWxlciApOw0KKw0KKw0KKwlyZXR1cm4oIHRydWUgKTsNCit9DQorDQorDQorYm9vbCBBdm1jb2RlQ29tcGlsZXI6OmNvbmZpZ3VyZUxhbWJkYVByaW1pdGl2ZSgpDQorew0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorCS8vIExBTUJEQSBTVEFURU1FTlQNCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwlPUENPREVfQ09NUElMRVIoIEFQUExZICApID0gTkVXX0NPTVBJTEVSKCBBdm1jb2RlTGFtYmRhQXBwbHlDb21waWxlciApOw0KKw0KKwlPUENPREVfQ09NUElMRVIoIExBTUJEQSApID0gTkVXX0NPTVBJTEVSKCBBdm1jb2RlTGFtYmRhRXhwckNvbXBpbGVyICk7DQorDQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisJLy8gTEVUIFNUQVRFTUVOVA0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorCU9QQ09ERV9DT01QSUxFUiggTEVUICkgPSBORVdfQ09NUElMRVIoIEF2bWNvZGVMYW1iZGFMZXRDb21waWxlciApOw0KKw0KKw0KKwlyZXR1cm4oIHRydWUgKTsNCit9DQorDQorDQorYm9vbCBBdm1jb2RlQ29tcGlsZXI6OmNvbmZpZ3VyZUFjdGl2aXR5UHJpbWl0aXZlKCkNCit7DQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisJLy8gQVZNIE1BQ0hJTkUgTUFOQUdJTkcNCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwlPUENPREVfQ09NUElMRVIoIENPTlRFWFRfU1dJVENIRVIgKSA9IE5FV19DT01QSUxFUiggQXZtY29kZUNvbnRleHRTd2l0Y2hlclN0YXRlbWVudENvbXBpbGVyICk7DQorDQorCU9QQ09ERV9DT01QSUxFUiggSU5JVCAgICApID0gQUNUSVZJVFlfU1RBVEVNRU5UX0NPTVBJTEVSOw0KKwlPUENPREVfQ09NUElMRVIoIEZJTkFMICAgKSA9IEFDVElWSVRZX1NUQVRFTUVOVF9DT01QSUxFUjsNCisJT1BDT0RFX0NPTVBJTEVSKCBERVNUUk9ZICkgPSBBQ1RJVklUWV9TVEFURU1FTlRfQ09NUElMRVI7DQorDQorCU9QQ09ERV9DT01QSUxFUiggU1RBUlQgICApID0gQUNUSVZJVFlfU1RBVEVNRU5UX0NPTVBJTEVSOw0KKwlPUENPREVfQ09NUElMRVIoIFJFU1RBUlQgKSA9IEFDVElWSVRZX1NUQVRFTUVOVF9DT01QSUxFUjsNCisJT1BDT0RFX0NPTVBJTEVSKCBTVE9QICAgICkgPSBBQ1RJVklUWV9TVEFURU1FTlRfQ09NUElMRVI7DQorDQorCU9QQ09ERV9DT01QSUxFUiggV0FJVCAgICAgICAgKSA9IEFDVElWSVRZX1NUQVRFTUVOVF9DT01QSUxFUjsNCisNCisJT1BDT0RFX0NPTVBJTEVSKCBTVVNQRU5EICkgPSBBQ1RJVklUWV9TVEFURU1FTlRfQ09NUElMRVI7DQorCU9QQ09ERV9DT01QSUxFUiggUkVTVU1FICApID0gQUNUSVZJVFlfU1RBVEVNRU5UX0NPTVBJTEVSOw0KKw0KKw0KKwlPUENPREVfQ09NUElMRVIoIElFTkFCTEVfSU5WT0tFICApID0gTkVXX0NPTVBJTEVSKCBBdm1jb2RlSUVuYWJsZVN0YXRlbWVudENvbXBpbGVyICk7DQorCU9QQ09ERV9DT01QSUxFUiggRU5BQkxFX0lOVk9LRSAgICkgPSBORVdfQ09NUElMRVIoIEF2bWNvZGVFbmFibGVTdGF0ZW1lbnRDb21waWxlciApOw0KKwlPUENPREVfQ09NUElMRVIoIEVOQUJMRV9TRVQgICAgICApID0gQUNUSVZJVFlfU1RBVEVNRU5UX0NPTVBJTEVSOw0KKw0KKwlPUENPREVfQ09NUElMRVIoIElESVNBQkxFX0lOVk9LRSApID0gTkVXX0NPTVBJTEVSKCBBdm1jb2RlSURpc2FibGVTdGF0ZW1lbnRDb21waWxlciApOw0KKwlPUENPREVfQ09NUElMRVIoIERJU0FCTEVfSU5WT0tFICApID0gTkVXX0NPTVBJTEVSKCBBdm1jb2RlRGlzYWJsZVN0YXRlbWVudENvbXBpbGVyICk7DQorCU9QQ09ERV9DT01QSUxFUiggRElTQUJMRV9TRVQgICAgICkgPSBBQ1RJVklUWV9TVEFURU1FTlRfQ09NUElMRVI7DQorCU9QQ09ERV9DT01QSUxFUiggRElTQUJMRV9DSElMRCAgICkgPSBOT1RISU5HX0FWTUNPREVfQ09NUElMRVI7DQorCU9QQ09ERV9DT01QSUxFUiggRElTQUJMRV9TRUxGICAgICkgPSBOT1RISU5HX0FWTUNPREVfQ09NUElMRVI7DQorCU9QQ09ERV9DT01QSUxFUiggRElTQUJMRV9TRUxWRVMgICkgPSBORVdfQ09NUElMRVIoIEF2bWNvZGVEaXNhYmxlU2VsdmVzU3RhdGVtZW50Q29tcGlsZXIgKTsNCisNCisJT1BDT0RFX0NPTVBJTEVSKCBJQUJPUlRfSU5WT0tFICAgKSA9IE5FV19DT01QSUxFUiggQXZtY29kZUlBYm9ydFN0YXRlbWVudENvbXBpbGVyICk7DQorCU9QQ09ERV9DT01QSUxFUiggQUJPUlRfSU5WT0tFICAgICkgPSBORVdfQ09NUElMRVIoIEF2bWNvZGVBYm9ydFN0YXRlbWVudENvbXBpbGVyICk7DQorCU9QQ09ERV9DT01QSUxFUiggQUJPUlRfU0VUICAgICAgICkgPSBBQ1RJVklUWV9TVEFURU1FTlRfQ09NUElMRVI7DQorCU9QQ09ERV9DT01QSUxFUiggQUJPUlRfQ0hJTEQgICAgICkgPSBOT1RISU5HX0FWTUNPREVfQ09NUElMRVI7DQorCU9QQ09ERV9DT01QSUxFUiggQUJPUlRfU0VMRiAgICAgICkgPSBOT1RISU5HX0FWTUNPREVfQ09NUElMRVI7DQorCU9QQ09ERV9DT01QSUxFUiggQUJPUlRfU0VMVkVTICAgICkgPSBORVdfQ09NUElMRVIoIEF2bWNvZGVBYm9ydFNlbHZlc1N0YXRlbWVudENvbXBpbGVyICk7DQorDQorCU9QQ09ERV9DT01QSUxFUiggSElTVE9SWV9DTEVBUiAgICAgICAgICApID0gQUNUSVZJVFlfU1RBVEVNRU5UX0NPTVBJTEVSOw0KKwlPUENPREVfQ09NUElMRVIoIERFRVBfSElTVE9SWV9JTlZPS0UgICAgKSA9IEFDVElWSVRZX1NUQVRFTUVOVF9DT01QSUxFUjsNCisJT1BDT0RFX0NPTVBJTEVSKCBTSEFMTE9XX0hJU1RPUllfSU5WT0tFICkgPSBBQ1RJVklUWV9TVEFURU1FTlRfQ09NUElMRVI7DQorDQorCU9QQ09ERV9DT01QSUxFUiggSVJVTiApID0gQUNUSVZJVFlfU1RBVEVNRU5UX0NPTVBJTEVSOw0KKwlPUENPREVfQ09NUElMRVIoIFJVTiAgKSA9IEFDVElWSVRZX1NUQVRFTUVOVF9DT01QSUxFUjsNCisNCisJT1BDT0RFX0NPTVBJTEVSKCBSVEMgICkgPSBORVdfQ09NUElMRVIoIEF2bWNvZGVSdGNTdGF0ZW1lbnRDb21waWxlciApOw0KKw0KKw0KKwlPUENPREVfQ09NUElMRVIoIElOVk9LRV9ORVcgICAgICAgICkgPSBORVdfQ09NUElMRVIoIEF2bWNvZGVJbnZva2VOZXdDb21waWxlciApOw0KKw0KKwlPUENPREVfQ09NUElMRVIoIElOVk9LRV9ST1VUSU5FICAgICkgPSBORVdfQ09NUElMRVIoIEF2bWNvZGVJbnZva2VSb3V0aW5lQ29tcGlsZXIgKTsNCisNCisJT1BDT0RFX0NPTVBJTEVSKCBJTlZPS0VfVFJBTlNJVElPTiApID0gTkVXX0NPTVBJTEVSKCBBdm1jb2RlSW52b2tlVHJhbnNpdGlvbkNvbXBpbGVyICk7DQorDQorCU9QQ09ERV9DT01QSUxFUiggSU5WT0tFX01FVEhPRCAgICAgKSA9IE5FV19DT01QSUxFUiggQXZtY29kZUludm9rZU1ldGhvZENvbXBpbGVyICk7DQorCU9QQ09ERV9DT01QSUxFUiggSU5WT0tFX1BST0dSQU0gICAgKSA9IE5FV19DT01QSUxFUiggQXZtY29kZUludm9rZVByb2dyYW1Db21waWxlciApOw0KKwlPUENPREVfQ09NUElMRVIoIElOVk9LRV9GVU5DVElPTiAgICkgPSBORVdfQ09NUElMRVIoIEF2bWNvZGVJbnZva2VGdW5jdGlvbkNvbXBpbGVyICk7DQorDQorDQorCU9QQ09ERV9DT01QSUxFUiggU0NIRURVTEVfSU5WT0tFICAgKSA9IE5FV19DT01QSUxFUiggQXZtY29kZVNjaGVkdWxlU3RhdGVtZW50Q29tcGlsZXIgKTsNCisJT1BDT0RFX0NPTVBJTEVSKCBTQ0hFRFVMRV9HRVQgICAgICApID0gQUNUSVZJVFlfU1RBVEVNRU5UX0NPTVBJTEVSOw0KKwlPUENPREVfQ09NUElMRVIoIFNDSEVEVUxFX0lOICAgICAgICkgPSBORVdfQ09NUElMRVIoIEF2bWNvZGVTY2hlZHVsZUluU3RhdGVtZW50Q29tcGlsZXIgKTsNCisJT1BDT0RFX0NPTVBJTEVSKCBTQ0hFRFVMRV9TRVQgICAgICApID0gQUNUSVZJVFlfU1RBVEVNRU5UX0NPTVBJTEVSOw0KKw0KKwlPUENPREVfQ09NUElMRVIoIEdPVE8gICAgICAgICAgICAgICkgPSBORVdfQ09NUElMRVIoIEF2bWNvZGVHb3RvU3RhdGVtZW50Q29tcGlsZXIgKTsNCisNCisJT1BDT0RFX0NPTVBJTEVSKCBGT1JLICAgICAgICAgICAgICApID0gTkVXX0NPTVBJTEVSKCBBdm1jb2RlRm9ya1N0YXRlbWVudENvbXBpbGVyICk7DQorCU9QQ09ERV9DT01QSUxFUiggSk9JTiAgICAgICAgICAgICAgKSA9IE5FV19DT01QSUxFUiggQXZtY29kZUpvaW5TdGF0ZW1lbnRDb21waWxlciApOw0KKw0KKwlPUENPREVfQ09NUElMRVIoIElOUFVUX0VOQUJMRUQgICAgICkgPSBORVdfQ09NUElMRVIoIEF2bWNvZGVJbnB1dEVuYWJsZWRTdGF0ZW1lbnRDb21waWxlciApOw0KKw0KKwlPUENPREVfQ09NUElMRVIoIFJEViAgICAgICAgICAgICAgICkgPSBBQ1RJVklUWV9TVEFURU1FTlRfQ09NUElMRVI7DQorDQorCU9QQ09ERV9DT01QSUxFUiggU1lOQ0hST05JWkUgICAgICAgKSA9IEFDVElWSVRZX1NUQVRFTUVOVF9DT01QSUxFUjsNCisNCisNCisJcmV0dXJuKCB0cnVlICk7DQorfQ0KKw0KKw0KK2Jvb2wgQXZtY29kZUNvbXBpbGVyOjpjb25maWd1cmVTdGF0dXNQcmltaXRpdmUoKQ0KK3sNCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwkvLyBBVk0gTUFDSElORSBTVEFUVVMNCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwlPUENPREVfQ09NUElMRVIoIFNUQVRVU19XQVMgICApID0gTUFDSElORV9TVEFUVVNfRVhQUkVTU0lPTl9DT01QSUxFUjsNCisJT1BDT0RFX0NPTVBJTEVSKCBTVEFUVVNfSVMgICAgKSA9IE1BQ0hJTkVfU1RBVFVTX0VYUFJFU1NJT05fQ09NUElMRVI7DQorCU9QQ09ERV9DT01QSUxFUiggU1RBVFVTX0JFSU5HICkgPSBNQUNISU5FX1NUQVRVU19FWFBSRVNTSU9OX0NPTVBJTEVSOw0KKwlPUENPREVfQ09NUElMRVIoIFNUQVRVU19XSUxMICApID0gTUFDSElORV9TVEFUVVNfRVhQUkVTU0lPTl9DT01QSUxFUjsNCisNCisJT1BDT0RFX0NPTVBJTEVSKCBDSEFOR0VEICAgICAgKSA9IFZBUklBQkxFX1NUQVRVU19FWFBSRVNTSU9OX0NPTVBJTEVSOw0KKwlPUENPREVfQ09NUElMRVIoIENIQU5HRURfVE8gICApID0gVkFSSUFCTEVfU1RBVFVTX0VYUFJFU1NJT05fQ09NUElMRVI7DQorDQorCXJldHVybiggdHJ1ZSApOw0KK30NCisNCisNCitib29sIEF2bWNvZGVDb21waWxlcjo6Y29uZmlndXJlU2NoZWR1bGluZ1ByaW1pdGl2ZSgpDQorew0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorCS8vIEFWTSBQUk9HUkFNIFNDSEVEVUxJTkcNCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwlPUENPREVfQ09NUElMRVIoIEFTWU5DSFJPTk9VUyAgICAgICApID0gU0NIRURVTElOR19TVEFURU1FTlRfQ09NUElMRVI7DQorCU9QQ09ERV9DT01QSUxFUiggU1RST05HX1NZTkNIUk9OT1VTICkgPSBTQ0hFRFVMSU5HX1NUQVRFTUVOVF9DT01QSUxFUjsNCisJT1BDT0RFX0NPTVBJTEVSKCBXRUFLX1NZTkNIUk9OT1VTICAgKSA9IFNDSEVEVUxJTkdfU1RBVEVNRU5UX0NPTVBJTEVSOw0KKwlPUENPREVfQ09NUElMRVIoIElOVEVSTEVBVklORyAgICAgICApID0gU0NIRURVTElOR19TVEFURU1FTlRfQ09NUElMRVI7DQorCU9QQ09ERV9DT01QSUxFUiggUEFSQUxMRUwgICAgICAgICAgICkgPSBTQ0hFRFVMSU5HX1NUQVRFTUVOVF9DT01QSUxFUjsNCisNCisJT1BDT0RFX0NPTVBJTEVSKCBSRFZfQVNZTkNIUk9OT1VTICAgICAgICkgPSBTQ0hFRFVMSU5HX1NUQVRFTUVOVF9DT01QSUxFUjsNCisJT1BDT0RFX0NPTVBJTEVSKCBSRFZfU1RST05HX1NZTkNIUk9OT1VTICkgPSBTQ0hFRFVMSU5HX1NUQVRFTUVOVF9DT01QSUxFUjsNCisJT1BDT0RFX0NPTVBJTEVSKCBSRFZfV0VBS19TWU5DSFJPTk9VUyAgICkgPSBTQ0hFRFVMSU5HX1NUQVRFTUVOVF9DT01QSUxFUjsNCisJT1BDT0RFX0NPTVBJTEVSKCBSRFZfSU5URVJMRUFWSU5HICAgICAgICkgPSBTQ0hFRFVMSU5HX1NUQVRFTUVOVF9DT01QSUxFUjsNCisJT1BDT0RFX0NPTVBJTEVSKCBSRFZfUEFSQUxMRUwgICAgICAgICAgICkgPSBTQ0hFRFVMSU5HX1NUQVRFTUVOVF9DT01QSUxFUjsNCisNCisNCisJT1BDT0RFX0NPTVBJTEVSKCBFWENMVVNJVkUgICAgICAgKSA9IFNDSEVEVUxJTkdfU1RBVEVNRU5UX0NPTVBJTEVSOw0KKwlPUENPREVfQ09NUElMRVIoIE5PTkRFVEVSTUlOSVNNICApID0gU0NIRURVTElOR19TVEFURU1FTlRfQ09NUElMRVI7DQorDQorCU9QQ09ERV9DT01QSUxFUiggUFJJT1JfR1QgICAgICAgICkgPSBTQ0hFRFVMSU5HX1NUQVRFTUVOVF9DT01QSUxFUjsNCisJT1BDT0RFX0NPTVBJTEVSKCBQUklPUl9MVCAgICAgICAgKSA9IFNDSEVEVUxJTkdfU1RBVEVNRU5UX0NPTVBJTEVSOw0KKw0KKwlPUENPREVfQ09NUElMRVIoIFNDSEVEVUxFX0FORF9USEVOICkgPSBTQ0hFRFVMSU5HX1NUQVRFTUVOVF9DT01QSUxFUjsNCisJT1BDT0RFX0NPTVBJTEVSKCBTQ0hFRFVMRV9PUl9FTFNFICApID0gU0NIRURVTElOR19TVEFURU1FTlRfQ09NUElMRVI7DQorDQorCU9QQ09ERV9DT01QSUxFUiggQVRPTUlDX1NFUVVFTkNFICkgPSBORVdfQ09NUElMRVIoIEF2bWNvZGVBdG9taWNTZXF1ZW5jZUNvbXBpbGVyICk7DQorDQorCU9QQ09ERV9DT01QSUxFUiggU0VRVUVOQ0UgICAgICAgICkgPSBORVdfQ09NUElMRVIoIEF2bWNvZGVTdHJvbmdTZXF1ZW5jZUNvbXBpbGVyICk7DQorDQorCU9QQ09ERV9DT01QSUxFUiggU0VRVUVOQ0VfU0lERSAgICkgPSBTRVFVRU5DRV9TVEFURU1FTlRfQ09NUElMRVI7DQorCU9QQ09ERV9DT01QSUxFUiggU0VRVUVOQ0VfV0VBSyAgICkgPSBTRVFVRU5DRV9TVEFURU1FTlRfQ09NUElMRVI7DQorDQorCU9QQ09ERV9DT01QSUxFUiggUFJPRFVDVCAgICAgICAgICkgPSBTQ0hFRFVMSU5HX1NUQVRFTUVOVF9DT01QSUxFUjsNCisNCisNCisJcmV0dXJuKCB0cnVlICk7DQorfQ0KKw0KKw0KK2Jvb2wgQXZtY29kZUNvbXBpbGVyOjpjb25maWd1cmVCYXNpY1ByaW1pdGl2ZSgpDQorew0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorCS8vIEFWTSBCVUZGRVIgTUFOQUdJTkcNCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwlPUENPREVfQ09NUElMRVIoIFVQREFURV9CVUZGRVIgICkgPSBERUZBVUxUX0FWTUNPREVfQ09NUElMRVI7DQorDQorDQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisJLy8gQVZNIFBSSU1JVElWRSBTVEFURU1FTlQNCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwlPUENPREVfQ09NUElMRVIoIEFTU0lHTiAgICAgICApID0gTkVXX0NPTVBJTEVSKCBBdm1jb2RlQXNzaWduQ29tcGlsZXIgKTsNCisJT1BDT0RFX0NPTVBJTEVSKCBBU1NJR05fQUZURVIgKSA9IE5FV19DT01QSUxFUiggQXZtY29kZUFzc2lnbkFmdGVyQ29tcGlsZXIgKTsNCisNCisJT1BDT0RFX0NPTVBJTEVSKCBBU1NJR05fT1AgICAgICAgKSA9IE5FV19DT01QSUxFUiggQXZtY29kZUFzc2lnbk9wQ29tcGlsZXIgKTsNCisJT1BDT0RFX0NPTVBJTEVSKCBBU1NJR05fT1BfQUZURVIgKSA9IE5FV19DT01QSUxFUiggQXZtY29kZUFzc2lnbk9wQWZ0ZXJDb21waWxlciApOw0KKw0KKwlPUENPREVfQ09NUElMRVIoIEFTU0lHTl9SRUYgICApID0gTkVXX0NPTVBJTEVSKCBBdm1jb2RlQXNzaWduUmVmQ29tcGlsZXIgKTsNCisJT1BDT0RFX0NPTVBJTEVSKCBBU1NJR05fTUFDUk8gKSA9IE5FV19DT01QSUxFUiggQXZtY29kZUFzc2lnbk1hY3JvQ29tcGlsZXIgKTsNCisNCisJT1BDT0RFX0NPTVBJTEVSKCBBU1NJR05fTkVXRlJFU0ggKSA9IE5FV19DT01QSUxFUiggQXZtY29kZUFzc2lnblVuYXJ5Q29tcGlsZXIgKTsNCisJT1BDT0RFX0NPTVBJTEVSKCBBU1NJR05fUkVTRVQgICAgKSA9IE9QQ09ERV9DT01QSUxFUiggQVNTSUdOX05FV0ZSRVNIICk7DQorDQorCU9QQ09ERV9DT01QSUxFUiggR1VBUkQgICAgICAgKSA9IE5FV19DT01QSUxFUiggQXZtY29kZUd1YXJkQ29tcGlsZXIgKTsNCisJT1BDT0RFX0NPTVBJTEVSKCBUSU1FRF9HVUFSRCApID0gTkVXX0NPTVBJTEVSKCBBdm1jb2RlVGltZWRHdWFyZENvbXBpbGVyICk7DQorCU9QQ09ERV9DT01QSUxFUiggRVZFTlQgICAgICAgKSA9IE5FV19DT01QSUxFUiggQXZtY29kZUV2ZW50Q29tcGlsZXIgKTsNCisJT1BDT0RFX0NPTVBJTEVSKCBDSEVDS19TQVQgICApID0gTkVXX0NPTVBJTEVSKCBBdm1jb2RlQ2hlY2tzYXRDb21waWxlciApOw0KKw0KKwlPUENPREVfQ09NUElMRVIoIElOUFVUICAgICAgICkgPSBORVdfQ09NUElMRVIoIEF2bWNvZGVJbnB1dENvbXBpbGVyICk7DQorCU9QQ09ERV9DT01QSUxFUiggSU5QVVRfRlJPTSAgKSA9IE5FV19DT01QSUxFUiggQXZtY29kZUlucHV0RnJvbUNvbXBpbGVyICk7DQorCU9QQ09ERV9DT01QSUxFUiggSU5QVVRfU0FWRSAgKSA9IE5FV19DT01QSUxFUiggQXZtY29kZUlucHV0U2F2ZUNvbXBpbGVyICk7DQorDQorCU9QQ09ERV9DT01QSUxFUiggSU5QVVRfVkFSICAgKSA9IE5FV19DT01QSUxFUiggQXZtY29kZUlucHV0VmFyQ29tcGlsZXIgKTsNCisJT1BDT0RFX0NPTVBJTEVSKCBJTlBVVF9FTlYgICApID0gTkVXX0NPTVBJTEVSKCBBdm1jb2RlSW5wdXRFbnZDb21waWxlciApOw0KKw0KKwlPUENPREVfQ09NUElMRVIoIE9VVFBVVCAgICAgICkgPSBORVdfQ09NUElMRVIoIEF2bWNvZGVPdXRwdXRDb21waWxlciApOw0KKwlPUENPREVfQ09NUElMRVIoIE9VVFBVVF9UTyAgICkgPSBORVdfQ09NUElMRVIoIEF2bWNvZGVPdXRwdXRUb0NvbXBpbGVyICk7DQorCU9QQ09ERV9DT01QSUxFUiggT1VUUFVUX1ZBUiAgKSA9IE5FV19DT01QSUxFUiggQXZtY29kZU91dHB1dFZhckNvbXBpbGVyICk7DQorCU9QQ09ERV9DT01QSUxFUiggT1VUUFVUX0VOViApID0gTkVXX0NPTVBJTEVSKCBBdm1jb2RlT3V0cHV0RW52Q29tcGlsZXIgKTsNCisNCisJT1BDT0RFX0NPTVBJTEVSKCBQUkVTRU5UICAgICApID0gTkVXX0NPTVBJTEVSKCBBdm1jb2RlQWJzZW50UHJlc2VudENvbXBpbGVyICk7DQorCU9QQ09ERV9DT01QSUxFUiggQUJTRU5UICAgICAgKSA9IE9QQ09ERV9DT01QSUxFUiggUFJFU0VOVCApOw0KKw0KKwlPUENPREVfQ09NUElMRVIoIElGICAgICAgICAgICkgPSBJVEVfU1RBVEVNRU5UX0NPTVBJTEVSOw0KKwlPUENPREVfQ09NUElMRVIoIElGRSAgICAgICAgICkgPSBJVEVfU1RBVEVNRU5UX0NPTVBJTEVSOw0KKw0KKwlPUENPREVfQ09NUElMRVIoIEZPUiAgICAgICAgICkgPSBORVdfQ09NUElMRVIoIEF2bWNvZGVGb3JDb21waWxlciApOw0KKwlPUENPREVfQ09NUElMRVIoIEZPUkVBQ0ggICAgICkgPSBORVdfQ09NUElMRVIoIEF2bWNvZGVGb3JlYWNoQ29tcGlsZXIgKTsNCisJT1BDT0RFX0NPTVBJTEVSKCBXSElMRV9ETyAgICApID0gTkVXX0NPTVBJTEVSKCBBdm1jb2RlV2hpbGVEb0NvbXBpbGVyICk7DQorCU9QQ09ERV9DT01QSUxFUiggRE9fV0hJTEUgICAgKSA9IE5FV19DT01QSUxFUiggQXZtY29kZURvV2hpbGVDb21waWxlciApOw0KKw0KKwlPUENPREVfQ09NUElMRVIoIEJSRUFLICAgICAgICkgPSBORVdfQ09NUElMRVIoIEF2bWNvZGVCcmVha0NvbXBpbGVyICk7DQorCU9QQ09ERV9DT01QSUxFUiggQ09OVElOVUUgICAgKSA9IE5FV19DT01QSUxFUiggQXZtY29kZUNvbnRpbnVlQ29tcGlsZXIgKTsNCisJT1BDT0RFX0NPTVBJTEVSKCBSRVRVUk4gICAgICApID0gTkVXX0NPTVBJTEVSKCBBdm1jb2RlUmV0dXJuQ29tcGlsZXIgKTsNCisJT1BDT0RFX0NPTVBJTEVSKCBFWElUICAgICAgICApID0gTkVXX0NPTVBJTEVSKCBBdm1jb2RlRXhpdENvbXBpbGVyICk7DQorDQorCU9QQ09ERV9DT01QSUxFUiggU1RFUF9NQVJLICAgKSA9IERFRkFVTFRfQVZNQ09ERV9DT01QSUxFUjsNCisNCisNCisJcmV0dXJuKCB0cnVlICk7DQorfQ0KKw0KKw0KK2Jvb2wgQXZtY29kZUNvbXBpbGVyOjpjb25maWd1cmVCaXR3aXNlUHJpbWl0aXZlKCkNCit7DQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisJLy8gQVZNIEJJVFdJU0UgRVhQUkVTU0lPTg0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorCU9QQ09ERV9DT01QSUxFUiggQk5PVCAgICkgPSBVTkFSWV9CSVRXSVNFX0VYUFJFU1NJT05fQ09NUElMRVI7DQorDQorCU9QQ09ERV9DT01QSUxFUiggQkFORCAgICkgPSBBU1NPQ0lBVElWRV9CSVRXSVNFX0VYUFJFU1NJT05fQ09NUElMRVI7DQorCU9QQ09ERV9DT01QSUxFUiggQk9SICAgICkgPSBBU1NPQ0lBVElWRV9CSVRXSVNFX0VYUFJFU1NJT05fQ09NUElMRVI7DQorCU9QQ09ERV9DT01QSUxFUiggQlhPUiAgICkgPSBCSU5BUllfQklUV0lTRV9FWFBSRVNTSU9OX0NPTVBJTEVSOw0KKw0KKwlPUENPREVfQ09NUElMRVIoIExTSElGVCApID0gQklOQVJZX0JJVFdJU0VfRVhQUkVTU0lPTl9DT01QSUxFUjsNCisJT1BDT0RFX0NPTVBJTEVSKCBSU0hJRlQgKSA9IEJJTkFSWV9CSVRXSVNFX0VYUFJFU1NJT05fQ09NUElMRVI7DQorDQorDQorCXJldHVybiggdHJ1ZSApOw0KK30NCisNCisNCitib29sIEF2bWNvZGVDb21waWxlcjo6Y29uZmlndXJlTG9naWNQcmltaXRpdmUoKQ0KK3sNCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwkvLyBBVk0gUFJFRElDQVQgRVhQUkVTU0lPTg0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorCU9QQ09ERV9DT01QSUxFUiggTk9UICApID0gVU5BUllfUFJFRElDQVRFX0VYUFJFU1NJT05fQ09NUElMRVI7DQorDQorCU9QQ09ERV9DT01QSUxFUiggQU5EICApID0gQVNTT0NJQVRJVkVfUFJFRElDQVRFX0VYUFJFU1NJT05fQ09NUElMRVI7DQorCU9QQ09ERV9DT01QSUxFUiggTkFORCApID0gQVNTT0NJQVRJVkVfUFJFRElDQVRFX0VYUFJFU1NJT05fQ09NUElMRVI7DQorDQorCU9QQ09ERV9DT01QSUxFUiggWEFORCApID0gQklOQVJZX1BSRURJQ0FURV9FWFBSRVNTSU9OX0NPTVBJTEVSOw0KKw0KKwlPUENPREVfQ09NUElMRVIoIE9SICAgKSA9IEFTU09DSUFUSVZFX1BSRURJQ0FURV9FWFBSRVNTSU9OX0NPTVBJTEVSOw0KKwlPUENPREVfQ09NUElMRVIoIE5PUiAgKSA9IEFTU09DSUFUSVZFX1BSRURJQ0FURV9FWFBSRVNTSU9OX0NPTVBJTEVSOw0KKw0KKwlPUENPREVfQ09NUElMRVIoIFhPUiAgKSA9IEJJTkFSWV9QUkVESUNBVEVfRVhQUkVTU0lPTl9DT01QSUxFUjsNCisJT1BDT0RFX0NPTVBJTEVSKCBYTk9SICkgPSBCSU5BUllfUFJFRElDQVRFX0VYUFJFU1NJT05fQ09NUElMRVI7DQorDQorDQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisJLy8gQVZNIENPTVBBUklTT04gRVhQUkVTU0lPTg0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorCU9QQ09ERV9DT01QSUxFUiggRVEgICApID0gUkVMQVRJT05BTF9FWFBSRVNTSU9OX0NPTVBJTEVSOw0KKwlPUENPREVfQ09NUElMRVIoIE5FUSAgKSA9IFJFTEFUSU9OQUxfRVhQUkVTU0lPTl9DT01QSUxFUjsNCisNCisJT1BDT0RFX0NPTVBJTEVSKCBTRVEgICkgPSBSRUxBVElPTkFMX0VYUFJFU1NJT05fQ09NUElMRVI7DQorCU9QQ09ERV9DT01QSUxFUiggTlNFUSApID0gUkVMQVRJT05BTF9FWFBSRVNTSU9OX0NPTVBJTEVSOw0KKw0KKwlPUENPREVfQ09NUElMRVIoIExUICAgKSA9IFJFTEFUSU9OQUxfRVhQUkVTU0lPTl9DT01QSUxFUjsNCisJT1BDT0RFX0NPTVBJTEVSKCBMVEUgICkgPSBSRUxBVElPTkFMX0VYUFJFU1NJT05fQ09NUElMRVI7DQorDQorCU9QQ09ERV9DT01QSUxFUiggR1QgICApID0gUkVMQVRJT05BTF9FWFBSRVNTSU9OX0NPTVBJTEVSOw0KKwlPUENPREVfQ09NUElMRVIoIEdURSAgKSA9IFJFTEFUSU9OQUxfRVhQUkVTU0lPTl9DT01QSUxFUjsNCisNCisNCisJcmV0dXJuKCB0cnVlICk7DQorfQ0KKw0KKw0KK2Jvb2wgQXZtY29kZUNvbXBpbGVyOjpjb25maWd1cmVBcml0aG1ldGljUHJpbWl0aXZlKCkNCit7DQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisJLy8gQVZNIEFSSVRITUVUSUMgRVhQUkVTU0lPTg0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorCU9QQ09ERV9DT01QSUxFUiggUExVUyAgICkgPSBBU1NPQ0lBVElWRV9BUklUSE1FVElDX0VYUFJFU1NJT05fQ09NUElMRVI7DQorCU9QQ09ERV9DT01QSUxFUiggTUlOVVMgICkgPSBCSU5BUllfQVJJVEhNRVRJQ19FWFBSRVNTSU9OX0NPTVBJTEVSOw0KKwlPUENPREVfQ09NUElMRVIoIFVNSU5VUyApID0gVU5BUllfQVJJVEhNRVRJQ19FWFBSRVNTSU9OX0NPTVBJTEVSOw0KKw0KKwlPUENPREVfQ09NUElMRVIoIE1VTFQgICApID0gQVNTT0NJQVRJVkVfQVJJVEhNRVRJQ19FWFBSRVNTSU9OX0NPTVBJTEVSOw0KKwlPUENPREVfQ09NUElMRVIoIFBPVyAgICApID0gQklOQVJZX0FSSVRITUVUSUNfRVhQUkVTU0lPTl9DT01QSUxFUjsNCisNCisJT1BDT0RFX0NPTVBJTEVSKCBESVYgICAgKSA9IEJJTkFSWV9BUklUSE1FVElDX0VYUFJFU1NJT05fQ09NUElMRVI7DQorCU9QQ09ERV9DT01QSUxFUiggTU9EICAgICkgPSBCSU5BUllfQVJJVEhNRVRJQ19FWFBSRVNTSU9OX0NPTVBJTEVSOw0KKw0KKw0KKwlyZXR1cm4oIHRydWUgKTsNCit9DQorDQorDQorYm9vbCBBdm1jb2RlQ29tcGlsZXI6OmNvbmZpZ3VyZUxvb2t1cFByaW1pdGl2ZSgpDQorew0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorCS8vIExPT0tVUCBTVEFURU1FTlQNCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwlPUENPREVfQ09NUElMRVIoIExPT0tVUF9JTlQgICAgICAgKSA9IExPT0tVUF9FWFBSRVNTSU9OX0NPTVBJTEVSOw0KKwlPUENPREVfQ09NUElMRVIoIExPT0tVUF9JTlRfRVhUICAgKSA9IExPT0tVUF9FWFBSRVNTSU9OX0NPTVBJTEVSOw0KKwlPUENPREVfQ09NUElMRVIoIExPT0tVUF9ORUFSRVNUICAgKSA9IExPT0tVUF9FWFBSRVNTSU9OX0NPTVBJTEVSOw0KKwlPUENPREVfQ09NUElMRVIoIExPT0tVUF9CRUxPVyAgICAgKSA9IExPT0tVUF9FWFBSRVNTSU9OX0NPTVBJTEVSOw0KKwlPUENPREVfQ09NUElMRVIoIExPT0tVUF9BQk9WRSAgICAgKSA9IExPT0tVUF9FWFBSRVNTSU9OX0NPTVBJTEVSOw0KKwlPUENPREVfQ09NUElMRVIoIExPT0tVUDJEX0lOVF9FWFQgKSA9IExPT0tVUF9FWFBSRVNTSU9OX0NPTVBJTEVSOw0KKw0KKwlyZXR1cm4oIHRydWUgKTsNCit9DQorDQorDQorYm9vbCBBdm1jb2RlQ29tcGlsZXI6OmNvbmZpZ3VyZU1hdGhlbWF0aWNQcmltaXRpdmUoKQ0KK3sNCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwkvLyBBVk0gTUFUSEVNQVRJQ0FMIEZVTkNUSU9ODQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisNCisJLy8gTUlOIC0gTUFYDQorCU9QQ09ERV9DT01QSUxFUiggTUlOICkgPSBNQVRIX0ZVTkNUSU9OX0NPTVBJTEVSOw0KKwlPUENPREVfQ09NUElMRVIoIE1BWCApID0gTUFUSF9GVU5DVElPTl9DT01QSUxFUjsNCisNCisJLy8gUkFORE9NDQorCU9QQ09ERV9DT01QSUxFUiggUkFORE9NICkgPSBNQVRIX0ZVTkNUSU9OX0NPTVBJTEVSOw0KKw0KKwkvLyBBQlMNCisJT1BDT0RFX0NPTVBJTEVSKCBBQlMgKSA9IE1BVEhfRlVOQ1RJT05fQ09NUElMRVI7DQorDQorCS8vIFJPVU5ESU5HDQorCU9QQ09ERV9DT01QSUxFUiggQ0VJTCAgICAgKSA9IE1BVEhfRlVOQ1RJT05fQ09NUElMRVI7DQorCU9QQ09ERV9DT01QSUxFUiggRkxPT1IgICAgKSA9IE1BVEhfRlVOQ1RJT05fQ09NUElMRVI7DQorCU9QQ09ERV9DT01QSUxFUiggUk9VTkQgICAgKSA9IE1BVEhfRlVOQ1RJT05fQ09NUElMRVI7DQorCU9QQ09ERV9DT01QSUxFUiggVFJVTkNBVEUgKSA9IE1BVEhfRlVOQ1RJT05fQ09NUElMRVI7DQorDQorDQorCS8vIEVYUCAtIExPRw0KKwlPUENPREVfQ09NUElMRVIoIFNRUlQgKSA9IE1BVEhfRlVOQ1RJT05fQ09NUElMRVI7DQorDQorCU9QQ09ERV9DT01QSUxFUiggRVhQICApID0gTUFUSF9GVU5DVElPTl9DT01QSUxFUjsNCisJT1BDT0RFX0NPTVBJTEVSKCBMT0cgICkgPSBNQVRIX0ZVTkNUSU9OX0NPTVBJTEVSOw0KKw0KKwkvLyBUUklHT05PTUVUUklDDQorCU9QQ09ERV9DT01QSUxFUiggU0lOICkgPSBNQVRIX0ZVTkNUSU9OX0NPTVBJTEVSOw0KKwlPUENPREVfQ09NUElMRVIoIENPUyApID0gTUFUSF9GVU5DVElPTl9DT01QSUxFUjsNCisJT1BDT0RFX0NPTVBJTEVSKCBUQU4gKSA9IE1BVEhfRlVOQ1RJT05fQ09NUElMRVI7DQorDQorCU9QQ09ERV9DT01QSUxFUiggU0lOSCApID0gTUFUSF9GVU5DVElPTl9DT01QSUxFUjsNCisJT1BDT0RFX0NPTVBJTEVSKCBDT1NIICkgPSBNQVRIX0ZVTkNUSU9OX0NPTVBJTEVSOw0KKwlPUENPREVfQ09NUElMRVIoIFRBTkggKSA9IE1BVEhfRlVOQ1RJT05fQ09NUElMRVI7DQorDQorCU9QQ09ERV9DT01QSUxFUiggQVNJTiAgKSA9IE1BVEhfRlVOQ1RJT05fQ09NUElMRVI7DQorCU9QQ09ERV9DT01QSUxFUiggQUNPUyAgKSA9IE1BVEhfRlVOQ1RJT05fQ09NUElMRVI7DQorCU9QQ09ERV9DT01QSUxFUiggQVRBTiAgKSA9IE1BVEhfRlVOQ1RJT05fQ09NUElMRVI7DQorCU9QQ09ERV9DT01QSUxFUiggQVRBTjIgKSA9IE1BVEhfRlVOQ1RJT05fQ09NUElMRVI7DQorDQorCU9QQ09ERV9DT01QSUxFUiggQVNJTkggKSA9IE1BVEhfRlVOQ1RJT05fQ09NUElMRVI7DQorCU9QQ09ERV9DT01QSUxFUiggQUNPU0ggKSA9IE1BVEhfRlVOQ1RJT05fQ09NUElMRVI7DQorCU9QQ09ERV9DT01QSUxFUiggQVRBTkggKSA9IE1BVEhfRlVOQ1RJT05fQ09NUElMRVI7DQorDQorCXJldHVybiggdHJ1ZSApOw0KK30NCisNCisNCitib29sIEF2bWNvZGVDb21waWxlcjo6Y29uZmlndXJlU3RyaW5nQ29sbGVjdGlvblByaW1pdGl2ZSgpDQorew0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorCS8vIEFWTSBTVFJJTkcgLyBDT0xMRUNUSU9OIE9QRVJBVE9SDQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisNCisJT1BDT0RFX0NPTVBJTEVSKCBDT05UQUlOUyAgICApID0gQklOQVJZX0NPTlRBSU5FUl9TVEFURU1FTlQ7DQorDQorCU9QQ09ERV9DT01QSUxFUiggSU4gICAgICAgICAgKSA9IEJJTkFSWV9DT05UQUlORVJfU1RBVEVNRU5UOw0KKwlPUENPREVfQ09NUElMRVIoIE5PVElOICAgICAgICkgPSBCSU5BUllfQ09OVEFJTkVSX1NUQVRFTUVOVDsNCisNCisJT1BDT0RFX0NPTVBJTEVSKCBTVUJTRVQgICAgICApID0gQklOQVJZX0NPTlRBSU5FUl9TVEFURU1FTlQ7DQorCU9QQ09ERV9DT01QSUxFUiggU1VCU0VURVEgICAgKSA9IEJJTkFSWV9DT05UQUlORVJfU1RBVEVNRU5UOw0KKw0KKwlPUENPREVfQ09NUElMRVIoIElOVEVSU0VDVCAgICkgPSBCSU5BUllfQ09OVEFJTkVSX1NUQVRFTUVOVDsNCisNCisJT1BDT0RFX0NPTVBJTEVSKCBTVEFSVFNfV0lUSCApID0gQklOQVJZX1NUUklOR19FWFBSRVNTSU9OX0NPTVBJTEVSOw0KKwlPUENPREVfQ09NUElMRVIoIEVORFNfV0lUSCAgICkgPSBCSU5BUllfU1RSSU5HX0VYUFJFU1NJT05fQ09NUElMRVI7DQorCU9QQ09ERV9DT01QSUxFUiggQ09OQ0FUICAgICAgKSA9IEFTU09DSUFUSVZFX1NUUklOR19FWFBSRVNTSU9OX0NPTVBJTEVSOw0KKw0KKwlPUENPREVfQ09NUElMRVIoIFBVU0ggICAgICAgICkgPSBORVdfQ09NUElMRVIoIEF2bWNvZGVQdXNoQ29tcGlsZXIgKTsNCisJT1BDT0RFX0NPTVBJTEVSKCBBU1NJR05fVE9QICApID0gTkVXX0NPTVBJTEVSKCBBdm1jb2RlQXNzaWduVG9wQ29tcGlsZXIgKTsNCisJT1BDT0RFX0NPTVBJTEVSKCBUT1AgICAgICAgICApID0gTkVXX0NPTVBJTEVSKCBBdm1jb2RlVG9wQ29tcGlsZXIgKTsNCisJT1BDT0RFX0NPTVBJTEVSKCBQT1AgICAgICAgICApID0gTkVXX0NPTVBJTEVSKCBBdm1jb2RlUG9wQ29tcGlsZXIgKTsNCisJT1BDT0RFX0NPTVBJTEVSKCBQT1BfRlJPTSAgICApID0gTkVXX0NPTVBJTEVSKCBBdm1jb2RlUG9wRnJvbUNvbXBpbGVyICk7DQorDQorCU9QQ09ERV9DT01QSUxFUiggRU1QVFkgICAgICAgKSA9IFVOQVJZX0NPTlRBSU5FUl9TVEFURU1FTlQ7DQorCU9QQ09ERV9DT01QSUxFUiggTk9ORU1QVFkgICAgKSA9IFVOQVJZX0NPTlRBSU5FUl9TVEFURU1FTlQ7DQorCU9QQ09ERV9DT01QSUxFUiggU0lOR0xFVE9OICAgKSA9IFVOQVJZX0NPTlRBSU5FUl9TVEFURU1FTlQ7DQorCU9QQ09ERV9DT01QSUxFUiggUE9QVUxBVEVEICAgKSA9IFVOQVJZX0NPTlRBSU5FUl9TVEFURU1FTlQ7DQorCU9QQ09ERV9DT01QSUxFUiggRlVMTCAgICAgICAgKSA9IFVOQVJZX0NPTlRBSU5FUl9TVEFURU1FTlQ7DQorDQorCU9QQ09ERV9DT01QSUxFUiggU0laRSAgICAgICAgKSA9IFVOQVJZX0NPTlRBSU5FUl9TVEFURU1FTlQ7DQorDQorCU9QQ09ERV9DT01QSUxFUiggQVBQRU5EICAgICAgKSA9IEJJTkFSWV9XUklURV9DT05UQUlORVJfU1RBVEVNRU5UOw0KKw0KKwlPUENPREVfQ09NUElMRVIoIFJFTU9WRSAgICAgICkgPSBCSU5BUllfV1JJVEVfQ09OVEFJTkVSX1NUQVRFTUVOVDsNCisNCisJT1BDT0RFX0NPTVBJTEVSKCBDTEVBUiAgICAgICApID0gVU5BUllfV1JJVEVfQ09OVEFJTkVSX1NUQVRFTUVOVDsNCisNCisJT1BDT0RFX0NPTVBJTEVSKCBSRVNJWkUgICAgICApID0gQklOQVJZX1dSSVRFX0NPTlRBSU5FUl9TVEFURU1FTlQ7DQorDQorCXJldHVybiggdHJ1ZSApOw0KK30NCisNCisNCitib29sIEF2bWNvZGVDb21waWxlcjo6Y29uZmlndXJlSW9sdFByaW1pdGl2ZSgpDQorew0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorCS8vIElPTFRMIEJFSEFWSU9SQUwgUFJFRElDQVQNCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwlPUENPREVfQ09NUElMRVIoIEdMT0JBTExZICAgKSA9IERFRkFVTFRfQVZNQ09ERV9DT01QSUxFUjsNCisJT1BDT0RFX0NPTVBJTEVSKCBVTlRJTCAgICAgICkgPSBERUZBVUxUX0FWTUNPREVfQ09NUElMRVI7DQorCU9QQ09ERV9DT01QSUxFUiggTkVYVCAgICAgICApID0gREVGQVVMVF9BVk1DT0RFX0NPTVBJTEVSOw0KKwlPUENPREVfQ09NUElMRVIoIEVWRU5UVUFMTFkgKSA9IERFRkFVTFRfQVZNQ09ERV9DT01QSUxFUjsNCisJT1BDT0RFX0NPTVBJTEVSKCBSRUxFQVNFUyAgICkgPSBERUZBVUxUX0FWTUNPREVfQ09NUElMRVI7DQorDQorCU9QQ09ERV9DT01QSUxFUiggT0JTICAgICAgICApID0gTkVXX0NPTVBJTEVSKCBBdm1jb2RlT2JzQ29tcGlsZXIgKTsNCisNCisNCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwkvLyBJT0xUTCBMT0dJQ0FMIFBSRURJQ0FUDQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisJT1BDT0RFX0NPTVBJTEVSKCBBTkRfVCApID0gREVGQVVMVF9BVk1DT0RFX0NPTVBJTEVSOw0KKwlPUENPREVfQ09NUElMRVIoIE9SX1QgICkgPSBERUZBVUxUX0FWTUNPREVfQ09NUElMRVI7DQorCU9QQ09ERV9DT01QSUxFUiggTk9UX1QgKSA9IERFRkFVTFRfQVZNQ09ERV9DT01QSUxFUjsNCisJT1BDT0RFX0NPTVBJTEVSKCBJTVBfVCApID0gREVGQVVMVF9BVk1DT0RFX0NPTVBJTEVSOw0KKw0KKw0KKwlyZXR1cm4oIHRydWUgKTsNCit9DQorDQorDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vLy8gdGhlIENPTVBJTEVSIG9mIEFSR1VNRU5UDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKw0KK2NvbnN0IEJGICYgQXZtY29kZUNvbXBpbGVyOjpwb3N0Q29tcGlsZVN5bWJvbChjb25zdCBCRiAmIGFTeW1ib2wpDQorew0KKwlpZiggYVN5bWJvbC5pczwgSW5zdGFuY2VPZkRhdGEgPigpICkNCisJew0KKwkJSW5zdGFuY2VPZkRhdGEgKiBhbkluc3RhbmNlID0gYVN5bWJvbC50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKTsNCisNCisJCWlmKCBhbkluc3RhbmNlLT5nZXRNb2RpZmllcigpLmhhc0ZlYXR1cmVGaW5hbCgpDQorCQkJJiYgYW5JbnN0YW5jZS0+aGFzVmFsdWUoKSApDQorCQl7DQorCQkJaWYoIGFuSW5zdGFuY2UtPmlzVHlwZWRFbnVtKCkgKQ0KKwkJCXsNCisJCQkJcmV0dXJuKCBhU3ltYm9sICk7DQorCQkJfQ0KKwkJCWVsc2UgaWYoIGFuSW5zdGFuY2UtPmdldE1vZGlmaWVyKCkuaGFzTmF0dXJlUGFyYW1ldGVyKCkgKQ0KKwkJCXsNCisJCQkJcmV0dXJuKCBhU3ltYm9sICk7DQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCXJldHVybiggYW5JbnN0YW5jZS0+Z2V0VmFsdWUoKSApOw0KKwkJCX0NCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQlyZXR1cm4oIGFTeW1ib2wgKTsNCisJCX0NCisJfQ0KKw0KKwllbHNlIGlmKCBhU3ltYm9sLmlzPCBJbnN0YW5jZU9mTWFjaGluZSA+KCkgKQ0KKwl7DQorCQlpZiggYVN5bWJvbC50b19wdHI8IEluc3RhbmNlT2ZNYWNoaW5lID4oKS0+aGFzUnVudGltZVJJRCgpICkNCisJCXsNCisJCQlyZXR1cm4oIGFTeW1ib2wudG9fcHRyPCBJbnN0YW5jZU9mTWFjaGluZSA+KCktPmdldFJ1bnRpbWVSSUQoKSApOw0KKwkJfQ0KKwkJcmV0dXJuKCBhU3ltYm9sICk7DQorCX0NCisNCisJZWxzZSAvL2lmKCBhU3ltYm9sLmlzPCBVbmlGb3JtSWRlbnRpZmllciA+KCkgfHwgYVN5bWJvbC5pczwgQXZtQ29kZSA+KCkgKQ0KKwl7DQorCQlyZXR1cm4oIGFTeW1ib2wgKTsNCisJfQ0KK30NCisNCisNCisNCitCRiBBdm1jb2RlQ29tcGlsZXI6OmNvbXBpbGVVRkkoDQorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBVbmlGb3JtSWRlbnRpZmllciAmIGFuVUZJKQ0KK3sNCitBVk1fSUZfREVCVUdfRkxBRzIoIENPTVBJTElORyAsIFFVQUxJRklFRF9OQU1FX0lEICkNCisJQVZNX09TX1RSQUNFIDw8IElOQ1JfSU5ERU5UX1RBQiA8PCAiPHwgY29tcGlsaW5nPFVGST46ICINCisJCQk8PCBhblVGSS5zdHIoKSA8PCBzdGQ6OmVuZGw7DQorCWFDVFgtPmRlYnVnQ29udGV4dCggQVZNX09TX1RSQUNFIDw8IElOQ1JfSU5ERU5UICkgPDwgREVDUl9JTkRFTlQ7DQorQVZNX0VORElGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBRVUFMSUZJRURfTkFNRV9JRCApDQorDQorCUJGIGFTeW1ib2wgPSBVRklfRVhQUkVTU0lPTl9DT01QSUxFUi0+Y29tcGlsZVVmaUV4cHJlc3Npb24oYUNUWCwgYW5VRkkpOw0KKw0KKwlpZiggYVN5bWJvbC52YWxpZCgpICkNCisJew0KK0FWTV9JRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgUVVBTElGSUVEX05BTUVfSUQgKQ0KKwkJQVZNX09TX1RSQUNFIDw8IFRBQl9ERUNSX0lOREVOVCA8PCAiPnwgcmVzdWx0Ig0KKwkJCQk8PCAoKGFTeW1ib2wuaXM8IFVuaUZvcm1JZGVudGlmaWVyID4oKSkgPyAiPFVGST46ICIgOiAiOj4gIikNCisJCQkJPDwgc3RyX2hlYWRlciggYVN5bWJvbCApIDw8IHN0ZDo6ZW5kbDsNCitBVk1fRU5ESUZfREVCVUdfRkxBRzIoIENPTVBJTElORyAsIFFVQUxJRklFRF9OQU1FX0lEICkNCisNCisJCXJldHVybiggcG9zdENvbXBpbGVTeW1ib2woYVN5bWJvbCkgKTsNCisJfQ0KKw0KKwkvLyBFUlJPUiBSRVBPUlRJTkcNCisJZWxzZSBpZiggZ2V0U3ltYm9sVGFibGUoKS5oYXNFcnJvcigpICkNCisJew0KKwkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JFcnJvckNvdW50KCk7DQorCQlBVk1fT1NfV0FSTiA8PCBhblVGSS5lcnJvckxvY2F0aW9uKGFDVFgtPm1Db21waWxlQ3R4LT5nZXRBc3RFbGVtZW50KCkpDQorCQkJCTw8IGdldFN5bWJvbFRhYmxlKCkuZ2V0RXJyb3JNZXNzYWdlKCkNCisJCQkJPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsNCisNCisJCXJldHVybiggQkY6OlJFRl9OVUxMICk7DQorCX0NCisJZWxzZQ0KKwl7DQorCQlnZXRDb21waWxlclRhYmxlKCkuaW5jckVycm9yQ291bnQoKTsNCisJCUFWTV9PU19XQVJOIDw8IGFuVUZJLmVycm9yTG9jYXRpb24oYUNUWC0+bUNvbXBpbGVDdHgtPmdldEFzdEVsZW1lbnQoKSkNCisJCQkJPDwgIlVGSSBjb21waWxhdGlvbiBlcnJvciA6IHVuZm91bmQgc3ltYm9sIDw8ICINCisJCQkJPDwgYW5VRkkuc3RyKCkgPDwgIiA+PiIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsNCisNCisJCXJldHVybiggQkY6OlJFRl9OVUxMICk7DQorCX0NCit9DQorDQorDQorQkYgQXZtY29kZUNvbXBpbGVyOjpjb21waWxlRnVsbHlRdWFsaWZpZWROYW1lSUQoDQorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCkNCit7DQorQVZNX0lGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBRVUFMSUZJRURfTkFNRV9JRCApDQorCUFWTV9PU19UUkFDRSA8PCBJTkNSX0lOREVOVF9UQUIgPDwgIjx8IGNvbXBpbGluZzxmcW4+OiAiDQorCQkJPDwgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEIDw8IHN0ZDo6ZW5kbDsNCisJYUNUWC0+ZGVidWdDb250ZXh0KCBBVk1fT1NfVFJBQ0UgPDwgSU5DUl9JTkRFTlQgKSA8PCBERUNSX0lOREVOVDsNCitBVk1fRU5ESUZfREVCVUdfRkxBRzIoIENPTVBJTElORyAsIFFVQUxJRklFRF9OQU1FX0lEICkNCisNCisJQkYgYVN5bWJvbCA9IGdldFN5bWJvbFRhYmxlKCkuc2VhcmNoU3ltYm9sKGFDVFgsIGFGdWxseVF1YWxpZmllZE5hbWVJRCk7DQorDQorCWlmKCBhU3ltYm9sLmludmFsaWQoKSApDQorCXsNCisJCVVuaUZvcm1JZGVudGlmaWVyIGFuVUZJKGFGdWxseVF1YWxpZmllZE5hbWVJRCk7DQorDQorCQlhU3ltYm9sID0gZ2V0U3ltYm9sVGFibGUoKS5zZWFyY2hTeW1ib2xCeVVGSShhQ1RYLCBhblVGSSk7DQorCX0NCisNCisJaWYoIGFTeW1ib2wudmFsaWQoKSApDQorCXsNCitBVk1fSUZfREVCVUdfRkxBRzIoIENPTVBJTElORyAsIFFVQUxJRklFRF9OQU1FX0lEICkNCisJQVZNX09TX1RSQUNFIDw8IFRBQl9ERUNSX0lOREVOVCA8PCAiPnwgcmVzdWx0Ig0KKwkJCTw8ICgoYVN5bWJvbC5pczwgVW5pRm9ybUlkZW50aWZpZXIgPigpKT8gIjxmcW4+OiAiIDogIjo+ICIpDQorCQkJPDwgc3RyX2hlYWRlciggYVN5bWJvbCApIDw8IHN0ZDo6ZW5kbDsNCitBVk1fRU5ESUZfREVCVUdfRkxBRzIoIENPTVBJTElORyAsIFFVQUxJRklFRF9OQU1FX0lEICkNCisNCisJCXJldHVybiggcG9zdENvbXBpbGVTeW1ib2woYVN5bWJvbCkgKTsNCisJfQ0KKw0KKwkvLyBFUlJPUiBSRVBPUlRJTkcNCisJZWxzZSBpZiggZ2V0U3ltYm9sVGFibGUoKS5oYXNFcnJvcigpICkNCisJew0KKwkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JFcnJvckNvdW50KCk7DQorCQlhQ1RYLT5lcnJvckNvbnRleHQoIEFWTV9PU19XQVJOICkNCisJCQkJPDwgZ2V0U3ltYm9sVGFibGUoKS5nZXRFcnJvck1lc3NhZ2UoKQ0KKwkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOw0KKw0KKwkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Og0KKwkJCQluZXdRdWFsaWZpZWRJZGVudGlmaWVyKGFGdWxseVF1YWxpZmllZE5hbWVJRCkgKTsNCisJfQ0KKwllbHNlDQorCXsNCisJCWdldENvbXBpbGVyVGFibGUoKS5pbmNyRXJyb3JDb3VudCgpOw0KKwkJYUNUWC0+ZXJyb3JDb250ZXh0KCBBVk1fT1NfV0FSTiApDQorCQkJCTw8ICJGdWxseVF1YWxpZmllZE5hbWVJRCBjb21waWxhdGlvbiBlcnJvciA6IHVuZm91bmQgc3ltYm9sIDw8ICINCisJCQkJPDwgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEIDw8ICIgPj4iDQorCQkJCTw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7DQorDQorCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6DQorCQkJCW5ld1F1YWxpZmllZElkZW50aWZpZXIoYUZ1bGx5UXVhbGlmaWVkTmFtZUlEKSApOw0KKwl9DQorfQ0KKw0KKw0KK0JGIEF2bWNvZGVDb21waWxlcjo6Y29tcGlsZVF1YWxpZmllZElkZW50aWZpZXIoDQorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRiAmIGFRdWFsaWZpZWROYW1lSUQpDQorew0KK0FWTV9JRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgUVVBTElGSUVEX05BTUVfSUQgKQ0KKwlBVk1fT1NfVFJBQ0UgPDwgSU5DUl9JTkRFTlRfVEFCIDw8ICI8fCBjb21waWxpbmc8UXVhbGlmaWVkTmFtZUlEPjogIg0KKwkJCTw8IGFRdWFsaWZpZWROYW1lSUQuc3RyKCkgPDwgc3RkOjplbmRsOw0KKwlhQ1RYLT5kZWJ1Z0NvbnRleHQoIEFWTV9PU19UUkFDRSA8PCBJTkNSX0lOREVOVCApIDw8IERFQ1JfSU5ERU5UOw0KK0FWTV9FTkRJRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgUVVBTElGSUVEX05BTUVfSUQgKQ0KKw0KKwljb25zdCBCRiAmIGFTeW1ib2wgPSBnZXRTeW1ib2xUYWJsZSgpLg0KKwkJCXNlYXJjaFN5bWJvbEJ5UXVhbGlmaWVkTmFtZUlEKGFDVFgsIGFRdWFsaWZpZWROYW1lSUQuc3RyKCkpOw0KKw0KKwlpZiggYVN5bWJvbC52YWxpZCgpICkNCisJew0KK0FWTV9JRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgUVVBTElGSUVEX05BTUVfSUQgKQ0KKwlBVk1fT1NfVFJBQ0UgPDwgVEFCX0RFQ1JfSU5ERU5UIDw8ICI+fCByZXN1bHQgOj4gIg0KKwkJCTw8IHN0cl9oZWFkZXIoIGFTeW1ib2wgKSA8PCBzdGQ6OmVuZGw7DQorQVZNX0VORElGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBRVUFMSUZJRURfTkFNRV9JRCApDQorDQorCQlyZXR1cm4oIHBvc3RDb21waWxlU3ltYm9sKGFTeW1ib2wpICk7DQorCX0NCisNCisJLy8gRVJST1IgUkVQT1JUSU5HDQorCWVsc2UgaWYoIGdldFN5bWJvbFRhYmxlKCkuaGFzRXJyb3IoKSApDQorCXsNCisJCWdldENvbXBpbGVyVGFibGUoKS5pbmNyRXJyb3JDb3VudCgpOw0KKwkJYUNUWC0+ZXJyb3JDb250ZXh0KCBBVk1fT1NfV0FSTiApDQorCQkJCTw8IGdldFN5bWJvbFRhYmxlKCkuZ2V0RXJyb3JNZXNzYWdlKCkNCisJCQkJPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsNCisNCisJCXJldHVybiggYVF1YWxpZmllZE5hbWVJRCApOw0KKwl9DQorCWVsc2UNCisJew0KKwkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JFcnJvckNvdW50KCk7DQorCQlhQ1RYLT5lcnJvckNvbnRleHQoIEFWTV9PU19XQVJOICkNCisJCQkJPDwgIlsgWyBGdWxseSBdIFF1YWxpZmllZCBdIE5hbWUgSUQgY29tcGlsYXRpb24gZXJyb3IgOiAiDQorCQkJCQkidW5mb3VuZCBzeW1ib2wgPDwgIiA8PCBhUXVhbGlmaWVkTmFtZUlELnN0cigpIDw8ICIgPj4iDQorCQkJCTw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7DQorDQorCQlyZXR1cm4oIGFRdWFsaWZpZWROYW1lSUQgKTsNCisJfQ0KK30NCisNCisNCitCRiBBdm1jb2RlQ29tcGlsZXI6OmNvbXBpbGVRdWFsaWZpZWRQb3NpdGlvbmFsSWRlbnRpZmllcigNCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGICYgYVF1YWxpZmllZE5hbWVJRCkNCit7DQorQVZNX0lGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBRVUFMSUZJRURfTkFNRV9JRCApDQorCUFWTV9PU19UUkFDRSA8PCBJTkNSX0lOREVOVF9UQUINCisJCQk8PCAiPHwgY29tcGlsaW5nPFF1YWxpZmllZFBvc2l0aW9uYWxJZGVudGlmaWVyPjogIg0KKwkJCTw8IGFRdWFsaWZpZWROYW1lSUQuc3RyKCkgPDwgc3RkOjplbmRsDQorCQkJPDwgVEFCMiA8PCBzdHJfaGVhZGVyKCBhQ1RYICkgPDwgc3RkOjplbmRsOw0KK0FWTV9FTkRJRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgUVVBTElGSUVEX05BTUVfSUQgKQ0KKw0KKwljb25zdCBCRiAmIGFTeW1ib2wgPSBnZXRTeW1ib2xUYWJsZSgpLg0KKwkJCXNlYXJjaFN5bWJvbEJ5UXVhbGlmaWVkTmFtZUlEKGFDVFgsIGFRdWFsaWZpZWROYW1lSUQuc3RyKCkpOw0KKw0KKwlpZiggYVN5bWJvbC52YWxpZCgpICkNCisJew0KK0FWTV9JRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgUVVBTElGSUVEX05BTUVfSUQgKQ0KKwlBVk1fT1NfVFJBQ0UgPDwgVEFCX0RFQ1JfSU5ERU5UIDw8ICI+fCByZXN1bHQiDQorCQkJPDwgKChhU3ltYm9sLmlzPCBVbmlGb3JtSWRlbnRpZmllciA+KCkpPyAiPHFuaWQ+OiAiIDogIjo+ICIpDQorCQkJPDwgc3RyX2hlYWRlciggYVN5bWJvbCApIDw8IHN0ZDo6ZW5kbDsNCitBVk1fRU5ESUZfREVCVUdfRkxBRzIoIENPTVBJTElORyAsIFFVQUxJRklFRF9OQU1FX0lEICkNCisNCisJCWlmKCBhU3ltYm9sLmlzPCBJbnN0YW5jZU9mTWFjaGluZSA+KCkgKQ0KKwkJew0KKwkJCUV4ZWN1dGFibGVGb3JtICogYW5FeGVjID0gYVN5bWJvbC50b19wdHI8IEluc3RhbmNlT2ZNYWNoaW5lID4oKS0+Z2V0RXhlY3V0YWJsZSgpOw0KKwkJCWlmKCBhbkV4ZWMgIT0gTlVMTCApDQorCQkJew0KKwkJCQlhdm1fb2Zmc2V0X3QgYVBvc2l0aW9uT2Zmc2V0ID0gYVF1YWxpZmllZE5hbWVJRC4NCisJCQkJCQl0b19wdHI8IFF1YWxpZmllZElkZW50aWZpZXIgPigpLT5nZXRQb3NpdGlvbk9mZnNldCgpOw0KKw0KKwkJCQlpZiggYVBvc2l0aW9uT2Zmc2V0IDwgYW5FeGVjLT5nZXRQYXJhbUNvdW50KCkgKQ0KKwkJCQl7DQorCQkJCQlyZXR1cm4oIGFuRXhlYy0+Z2V0UGFyYW0oYVBvc2l0aW9uT2Zmc2V0KSApOw0KKwkJCQl9DQorCQkJfQ0KKwkJCXJldHVybiggYVN5bWJvbCApOw0KKwkJfQ0KKw0KKwkJcmV0dXJuKCBwb3N0Q29tcGlsZVN5bWJvbChhU3ltYm9sKSApOw0KKwl9DQorDQorCS8vIEVSUk9SIFJFUE9SVElORw0KKwllbHNlIGlmKCBnZXRTeW1ib2xUYWJsZSgpLmhhc0Vycm9yKCkgKQ0KKwl7DQorCQlnZXRDb21waWxlclRhYmxlKCkuaW5jckVycm9yQ291bnQoKTsNCisJCWFDVFgtPmVycm9yQ29udGV4dCggQVZNX09TX1dBUk4gKQ0KKwkJCQk8PCBnZXRTeW1ib2xUYWJsZSgpLmdldEVycm9yTWVzc2FnZSgpDQorCQkJCTw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7DQorDQorCQlyZXR1cm4oIGFRdWFsaWZpZWROYW1lSUQgKTsNCisJfQ0KKwllbHNlDQorCXsNCisJCWdldENvbXBpbGVyVGFibGUoKS5pbmNyRXJyb3JDb3VudCgpOw0KKwkJYUNUWC0+ZXJyb3JDb250ZXh0KCBBVk1fT1NfV0FSTiApDQorCQkJCTw8ICJbIFsgRnVsbHkgXSBRdWFsaWZpZWQgXSBOYW1lIElEIGNvbXBpbGF0aW9uIGVycm9yIDoiDQorCQkJCQkiIHVuZm91bmQgc3ltYm9sIDw8ICIgPDwgYVF1YWxpZmllZE5hbWVJRC5zdHIoKSA8PCAiID4+Ig0KKwkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOw0KKw0KKwkJcmV0dXJuKCBhUXVhbGlmaWVkTmFtZUlEICk7DQorCX0NCit9DQorDQorDQorQkYgQXZtY29kZUNvbXBpbGVyOjpjb21waWxlSWRlbnRpZmllcigNCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkNCit7DQorQVZNX0lGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBRVUFMSUZJRURfTkFNRV9JRCApDQorCUFWTV9PU19UUkFDRSA8PCBJTkNSX0lOREVOVF9UQUIgPDwgIjx8IGNvbXBpbGluZzxuYW1lLWlkPjogIg0KKwkJCTw8IGFOYW1lSUQgPDwgc3RkOjplbmRsOw0KKwlhQ1RYLT5kZWJ1Z0NvbnRleHQoIEFWTV9PU19UUkFDRSA8PCBJTkNSX0lOREVOVCApIDw8IERFQ1JfSU5ERU5UOw0KK0FWTV9FTkRJRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgUVVBTElGSUVEX05BTUVfSUQgKQ0KKw0KKwljb25zdCBCRiAmIGFTeW1ib2wgPSBnZXRTeW1ib2xUYWJsZSgpLnNlYXJjaFN5bWJvbEJ5TmFtZUlEKGFDVFgsIGFOYW1lSUQpOw0KKw0KKwlpZiggYVN5bWJvbC52YWxpZCgpICkNCisJew0KK0FWTV9JRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgUVVBTElGSUVEX05BTUVfSUQgKQ0KKwlBVk1fT1NfVFJBQ0UgPDwgVEFCX0RFQ1JfSU5ERU5UIDw8ICI+fCByZXN1bHQiDQorCQkJPDwgKChhU3ltYm9sLmlzPCBVbmlGb3JtSWRlbnRpZmllciA+KCkpPyAiPG5hbWUtaWQ+OiAiIDogIjo+ICIpDQorCQkJPDwgc3RyX2hlYWRlciggYVN5bWJvbCApIDw8IHN0ZDo6ZW5kbDsNCitBVk1fRU5ESUZfREVCVUdfRkxBRzIoIENPTVBJTElORyAsIFFVQUxJRklFRF9OQU1FX0lEICkNCisNCisJCXJldHVybiggcG9zdENvbXBpbGVTeW1ib2woYVN5bWJvbCkgKTsNCisJfQ0KKw0KKwllbHNlDQorCXsNCisJCUluc3RhbmNlT2ZEYXRhICogdmFyQ3R4ID0gYUNUWC0+bVZhcmlhYmxlQ3R4Ow0KKwkJZm9yKCA7IHZhckN0eCAhPSBOVUxMIDsgdmFyQ3R4ID0gdmFyQ3R4LT5nZXRQYXJlbnQoKSApDQorCQl7DQorCQkJQkYgYUZpZWxkU3ltYm9sID0gZ2V0U3ltYm9sVGFibGUoKS5zZWFyY2hTeW1ib2woYUNUWCwNCisJCQkJCSggT1NTKCkgPDwgdmFyQ3R4LT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpDQorCQkJCQkJCTw8ICcuJyA8PCBhTmFtZUlEICkgKTsNCisNCisJCQlpZiggYUZpZWxkU3ltYm9sLnZhbGlkKCkgKQ0KKwkJCXsNCitBVk1fSUZfREVCVUdfRkxBRzIoIENPTVBJTElORyAsIFFVQUxJRklFRF9OQU1FX0lEICkNCisJQVZNX09TX1RSQUNFIDw8IFRBQl9ERUNSX0lOREVOVCA8PCAiPnwgcmVzdWx0Oj4gIg0KKwkJCTw8IHN0cl9oZWFkZXIoIGFGaWVsZFN5bWJvbCApIDw8IHN0ZDo6ZW5kbDsNCitBVk1fRU5ESUZfREVCVUdfRkxBRzIoIENPTVBJTElORyAsIFFVQUxJRklFRF9OQU1FX0lEICkNCisNCisJCQkJcmV0dXJuKCBwb3N0Q29tcGlsZVN5bWJvbChhRmllbGRTeW1ib2wpICk7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJT3BlcmF0b3IgKiBvcElEID0gT3BlcmF0b3JNYW5hZ2VyOjpnZXRPcCggYU5hbWVJRCApOw0KKw0KKwkJaWYoIG9wSUQgIT0gTlVMTCApDQorCQl7DQorCQkJcmV0dXJuKCBDT05TVF9CRl9PUCggb3BJRCApICk7DQorCQl9DQorCQkvLyBFUlJPUiBSRVBPUlRJTkcNCisJCWVsc2UgaWYoIGdldFN5bWJvbFRhYmxlKCkuaGFzRXJyb3IoKSApDQorCQl7DQorCQkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JFcnJvckNvdW50KCk7DQorCQkJYUNUWC0+ZXJyb3JDb250ZXh0KCBBVk1fT1NfV0FSTiApDQorCQkJCQk8PCBnZXRTeW1ib2xUYWJsZSgpLmdldEVycm9yTWVzc2FnZSgpDQorCQkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOw0KKw0KKwkJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdJZGVudGlmaWVyKGFOYW1lSUQpICk7DQorCQl9DQorCQllbHNlDQorCQl7DQorCQkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JFcnJvckNvdW50KCk7DQorCQkJYUNUWC0+ZXJyb3JDb250ZXh0KCBBVk1fT1NfV0FSTiApDQorCQkJCQk8PCAiSWRlbnRpZmllciBjb21waWxhdGlvbiBlcnJvciA6IHVuZm91bmQgc3ltYm9sIDw8ICINCisJCQkJCTw8IGFOYW1lSUQgPDwgIiA+PiIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsNCisNCisJCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3SWRlbnRpZmllcihhTmFtZUlEKSApOw0KKwkJfQ0KKwl9DQorfQ0KKw0KKw0KK2NvbnN0IEJGICYgQXZtY29kZUNvbXBpbGVyOjpjb21waWxlRWxlbWVudCgNCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGICYgYW5FbGVtZW50KQ0KK3sNCisJT2JqZWN0RWxlbWVudCAqIG9iakVsZW1lbnQgPSBhbkVsZW1lbnQudG9fcHRyPCBPYmplY3RFbGVtZW50ID4oKTsNCisNCitBVk1fSUZfREVCVUdfRkxBRzIoIENPTVBJTElORyAsIFFVQUxJRklFRF9OQU1FX0lEICkNCisJQVZNX09TX1RSQUNFIDw8IElOQ1JfSU5ERU5UX1RBQiA8PCAiPHwgY29tcGlsaW5nPEZPUk0+OiAmICINCisJCQk8PCBvYmpFbGVtZW50LT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbDsNCisJYUNUWC0+ZGVidWdDb250ZXh0KCBBVk1fT1NfVFJBQ0UgPDwgSU5DUl9JTkRFTlQgKSA8PCBERUNSX0lOREVOVDsNCitBVk1fRU5ESUZfREVCVUdfRkxBRzIoIENPTVBJTElORyAsIFFVQUxJRklFRF9OQU1FX0lEICkNCisNCisJY29uc3QgQkYgJiBhU3ltYm9sID0gZ2V0U3ltYm9sVGFibGUoKS5zZWFyY2hTeW1ib2woYUNUWCwgb2JqRWxlbWVudCk7DQorDQorCWlmKCBhU3ltYm9sLnZhbGlkKCkgKQ0KKwl7DQorQVZNX0lGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBRVUFMSUZJRURfTkFNRV9JRCApDQorCUFWTV9PU19UUkFDRSA8PCBUQUJfREVDUl9JTkRFTlQNCisJCQk8PCAiPnwgcmVzdWx0Oj4gIiA8PCBzdHJfaGVhZGVyKCBhU3ltYm9sICkgPDwgc3RkOjplbmRsOw0KK0FWTV9FTkRJRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgUVVBTElGSUVEX05BTUVfSUQgKQ0KKw0KKwkJcmV0dXJuKCBwb3N0Q29tcGlsZVN5bWJvbChhU3ltYm9sKSApOw0KKwl9DQorDQorCS8vIEVSUk9SIFJFUE9SVElORw0KKwllbHNlIGlmKCBnZXRTeW1ib2xUYWJsZSgpLmhhc0Vycm9yKCkgKQ0KKwl7DQorCQlnZXRDb21waWxlclRhYmxlKCkuaW5jckVycm9yQ291bnQoKTsNCisJCUFWTV9PU19XQVJOIDw8IG9iakVsZW1lbnQtPmVycm9yTG9jYXRpb24oDQorCQkJCQlhQ1RYLT5tQ29tcGlsZUN0eC0+Z2V0QXN0RWxlbWVudCgpKQ0KKwkJCQk8PCBnZXRTeW1ib2xUYWJsZSgpLmdldEVycm9yTWVzc2FnZSgpDQorCQkJCTw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7DQorDQorCQlyZXR1cm4oIGFuRWxlbWVudCApOw0KKwl9DQorCWVsc2UNCisJew0KKwkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JFcnJvckNvdW50KCk7DQorCQlhQ1RYLT5lcnJvckNvbnRleHQoIEFWTV9PU19XQVJOICkNCisJCQkJPDwgIlVuZm91bmQgZGF0YSBpbnN0YW5jZSA8PCAmICINCisJCQkJPDwgb2JqRWxlbWVudC0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiID4+Ig0KKwkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOw0KKw0KKwkJcmV0dXJuKCBhbkVsZW1lbnQgKTsNCisJfQ0KK30NCisNCisNCitjb25zdCBCRiAmIEF2bWNvZGVDb21waWxlcjo6Y29tcGlsZURhdGFUeXBlKA0KKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkYgJiBhRGF0YVR5cGUpDQorew0KKwlEYXRhVHlwZSAqIHBUeXBlID0gYURhdGFUeXBlLnRvX3B0cjwgRGF0YVR5cGUgPigpOw0KKw0KK0FWTV9JRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgUVVBTElGSUVEX05BTUVfSUQgKQ0KKwlBVk1fT1NfVFJBQ0UgPDwgSU5DUl9JTkRFTlRfVEFCIDw8ICI8fCBjb21waWxpbmc8RGF0YVR5cGU+OiAiDQorCQkJPDwgc3RyX2hlYWRlciggcFR5cGUgKSA8PCBzdGQ6OmVuZGw7DQorCWFDVFgtPmRlYnVnQ29udGV4dCggQVZNX09TX1RSQUNFIDw8IElOQ1JfSU5ERU5UICkgPDwgREVDUl9JTkRFTlQ7DQorQVZNX0VORElGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBRVUFMSUZJRURfTkFNRV9JRCApDQorDQorCWNvbnN0IFR5cGVTcGVjaWZpZXIgJiBhVHlwZVNwZWNpZmllciA9DQorCQkJU3ltYm9sVGFibGU6OnNlYXJjaFR5cGVTcGVjaWZpZXIoDQorCQkJCQlnZXRDb25maWd1cmF0aW9uKCkuZ2V0RXhlY3V0YWJsZVN5c3RlbSgpLCBhQ1RYLCBwVHlwZSk7DQorDQorCWlmKCBhVHlwZVNwZWNpZmllci52YWxpZCgpICkNCisJew0KK0FWTV9JRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgUVVBTElGSUVEX05BTUVfSUQgKQ0KKwlBVk1fT1NfVFJBQ0UgPDwgVEFCX0RFQ1JfSU5ERU5UIDw8ICI+fCByZXN1bHQ6PiAiDQorCQkJPDwgc3RyX2hlYWRlciggYVR5cGVTcGVjaWZpZXIgKSA8PCBzdGQ6OmVuZGw7DQorQVZNX0VORElGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBRVUFMSUZJRURfTkFNRV9JRCApDQorDQorCQlyZXR1cm4oIGFUeXBlU3BlY2lmaWVyICk7DQorCX0NCisNCisJLy8gRVJST1IgUkVQT1JUSU5HDQorCWVsc2UgaWYoIGdldFN5bWJvbFRhYmxlKCkuaGFzRXJyb3IoKSApDQorCXsNCisJCWdldENvbXBpbGVyVGFibGUoKS5pbmNyRXJyb3JDb3VudCgpOw0KKwkJQVZNX09TX1dBUk4gPDwgcFR5cGUtPmVycm9yTG9jYXRpb24oYUNUWC0+bUNvbXBpbGVDdHgtPmdldEFzdEVsZW1lbnQoKSkNCisJCQkJPDwgZ2V0U3ltYm9sVGFibGUoKS5nZXRFcnJvck1lc3NhZ2UoKQ0KKwkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOw0KKw0KKwkJcmV0dXJuKCBhRGF0YVR5cGUgKTsNCisJfQ0KKwllbHNlDQorCXsNCisJCWdldENvbXBpbGVyVGFibGUoKS5pbmNyRXJyb3JDb3VudCgpOw0KKwkJYUNUWC0+ZXJyb3JDb250ZXh0KCBBVk1fT1NfV0FSTiApDQorCQkJCTw8ICJVbmZvdW5kIHR5cGVkZWYgPDwgJiAiIDw8IHN0cl9oZWFkZXIoIHBUeXBlICkNCisJCQkJPDwgIiA+PiIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsNCisNCisJCXJldHVybiggYURhdGFUeXBlICk7DQorCX0NCit9DQorDQorDQorY29uc3QgQkYgJiBBdm1jb2RlQ29tcGlsZXI6OmNvbXBpbGVWYXJpYWJsZSgNCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGICYgYVZhcmlhYmxlKQ0KK3sNCisJVmFyaWFibGUgKiBwVmFyaWFibGUgPSBhVmFyaWFibGUudG9fcHRyPCBWYXJpYWJsZSA+KCk7DQorDQorQVZNX0lGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBRVUFMSUZJRURfTkFNRV9JRCApDQorCUFWTV9PU19UUkFDRSA8PCBJTkNSX0lOREVOVF9UQUIgPDwgIjx8IGNvbXBpbGluZzxWYXJpYWJsZT46ICINCisJCQk8PCBzdHJfaGVhZGVyKCBwVmFyaWFibGUgKSA8PCBzdGQ6OmVuZGw7DQorCWFDVFgtPmRlYnVnQ29udGV4dCggQVZNX09TX1RSQUNFIDw8IElOQ1JfSU5ERU5UICkgPDwgREVDUl9JTkRFTlQ7DQorQVZNX0VORElGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBRVUFMSUZJRURfTkFNRV9JRCApDQorDQorCWNvbnN0IEJGICYgYVN5bWJvbCA9IGdldFN5bWJvbFRhYmxlKCkuc2VhcmNoRGF0YUluc3RhbmNlKGFDVFgsIHBWYXJpYWJsZSk7DQorDQorCWlmKCBhU3ltYm9sLnZhbGlkKCkgKQ0KKwl7DQorCQlJbnN0YW5jZU9mRGF0YSAqIGFuSW5zdGFuY2UgPSBhU3ltYm9sLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpOw0KKw0KK0FWTV9JRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgUVVBTElGSUVEX05BTUVfSUQgKQ0KKwlBVk1fT1NfVFJBQ0UgPDwgVEFCX0RFQ1JfSU5ERU5UDQorCQkJPDwgIj58IHJlc3VsdDo+ICIgPDwgc3RyX2hlYWRlciggYW5JbnN0YW5jZSApIDw8IHN0ZDo6ZW5kbDsNCitBVk1fRU5ESUZfREVCVUdfRkxBRzIoIENPTVBJTElORyAsIFFVQUxJRklFRF9OQU1FX0lEICkNCisNCisJCWlmKCBhbkluc3RhbmNlLT5nZXRNb2RpZmllcigpLmhhc0ZlYXR1cmVGaW5hbCgpICkNCisJCXsNCisJCQlpZiggKG5vdCBhbkluc3RhbmNlLT5oYXNWYWx1ZSgpKSAmJiBwVmFyaWFibGUtPmhhc1ZhbHVlKCkgKQ0KKwkJCXsNCisJCQkJYW5JbnN0YW5jZS0+c2V0VmFsdWUoIGRlY29kZV9jb21waWxlRXhwcmVzc2lvbigNCisJCQkJCQlhQ1RYLT5jbG9uZShhbkluc3RhbmNlLT5nZXRUeXBlU3BlY2lmaWVyKCkpLA0KKwkJCQkJCXBWYXJpYWJsZS0+Z2V0VmFsdWUoKSApICk7DQorCQkJfQ0KKw0KKwkJCWlmKCBhbkluc3RhbmNlLT5oYXNWYWx1ZSgpICkNCisJCQl7DQorCQkJCWlmKCBhbkluc3RhbmNlLT5pc0VudW1TeW1ib2xQb2ludGVyKCkNCisJCQkJCSYmIGFuSW5zdGFuY2UtPmdldE1vZGlmaWVyKCkuaGFzRmVhdHVyZVVuc2FmZSgpICkNCisJCQkJew0KKwkJCQkJcmV0dXJuKCBhU3ltYm9sICk7DQorCQkJCX0NCisJCQkJZWxzZSBpZiggYW5JbnN0YW5jZS0+Z2V0TW9kaWZpZXIoKS5oYXNOYXR1cmVQYXJhbWV0ZXIoKSApDQorCQkJCXsNCisJCQkJCXJldHVybiggYVN5bWJvbCApOw0KKwkJCQl9DQorCQkJCWVsc2UNCisJCQkJew0KKwkJCQkJcmV0dXJuKCBhbkluc3RhbmNlLT5nZXRWYWx1ZSgpICk7DQorCQkJCX0NCisJCQl9DQorCQl9DQorDQorCQlyZXR1cm4oIGFTeW1ib2wgKTsNCisJfQ0KKw0KKwkvLyBFUlJPUiBSRVBPUlRJTkcNCisJZWxzZSBpZiggZ2V0U3ltYm9sVGFibGUoKS5oYXNFcnJvcigpICkNCisJew0KKwkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JFcnJvckNvdW50KCk7DQorCQlBVk1fT1NfV0FSTiA8PCBwVmFyaWFibGUtPmVycm9yTG9jYXRpb24oDQorCQkJCWFDVFgtPm1Db21waWxlQ3R4LT5nZXRBc3RFbGVtZW50KCkgKQ0KKwkJCQk8PCBnZXRTeW1ib2xUYWJsZSgpLmdldEVycm9yTWVzc2FnZSgpDQorCQkJCTw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7DQorDQorDQorQVZNX0lGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBRVUFMSUZJRURfTkFNRV9JRCApDQorCUFWTV9PU19UUkFDRSA8PCBUQUJfREVDUl9JTkRFTlQNCisJCQk8PCAiPnwgZXJyb3I6PiAiIDw8IHN0cl9oZWFkZXIoIHBWYXJpYWJsZSApIDw8IHN0ZDo6ZW5kbDsNCitBVk1fRU5ESUZfREVCVUdfRkxBRzIoIENPTVBJTElORyAsIFFVQUxJRklFRF9OQU1FX0lEICkNCisNCisJCXJldHVybiggYVZhcmlhYmxlICk7DQorCX0NCisJZWxzZQ0KKwl7DQorCQlnZXRDb21waWxlclRhYmxlKCkuaW5jckVycm9yQ291bnQoKTsNCisJCWFDVFgtPmVycm9yQ29udGV4dCggQVZNX09TX1dBUk4gKQ0KKwkJCQk8PCAiVW5mb3VuZCB2YXJpYWJsZSBpbnN0YW5jZSA8PCAiDQorCQkJCTw8IHBWYXJpYWJsZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiID4+Ig0KKwkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOw0KKw0KK0FWTV9JRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgUVVBTElGSUVEX05BTUVfSUQgKQ0KKwlBVk1fT1NfVFJBQ0UgPDwgVEFCX0RFQ1JfSU5ERU5UDQorCQkJPDwgIj58IGVycm9yOj4gIiA8PCBzdHJfaGVhZGVyKCBwVmFyaWFibGUgKSA8PCBzdGQ6OmVuZGw7DQorQVZNX0VORElGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBRVUFMSUZJRURfTkFNRV9JRCApDQorDQorCQlyZXR1cm4oIGFWYXJpYWJsZSApOw0KKwl9DQorfQ0KKw0KKw0KK2NvbnN0IEJGICYgQXZtY29kZUNvbXBpbGVyOjpjb21waWxlQnVmZmVyKA0KKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkYgJiBhQnVmZmVyKQ0KK3sNCisJQnVmZmVyICogcEJ1ZmZlciA9IGFCdWZmZXIudG9fcHRyPCBCdWZmZXIgPigpOw0KKw0KK0FWTV9JRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgUVVBTElGSUVEX05BTUVfSUQgKQ0KKwlBVk1fT1NfVFJBQ0UgPDwgSU5DUl9JTkRFTlRfVEFCIDw8ICI8fCBjb21waWxpbmc8QnVmZmVyPjogIg0KKwkJCTw8IHN0cl9oZWFkZXIoIHBCdWZmZXIgKSA8PCBzdGQ6OmVuZGw7DQorCWFDVFgtPmRlYnVnQ29udGV4dCggQVZNX09TX1RSQUNFIDw8IElOQ1JfSU5ERU5UICkgPDwgREVDUl9JTkRFTlQ7DQorQVZNX0VORElGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBRVUFMSUZJRURfTkFNRV9JRCApDQorDQorCWNvbnN0IEJGICYgYVN5bWJvbCA9IGdldFN5bWJvbFRhYmxlKCkuc2VhcmNoQnVmZmVySW5zdGFuY2UoDQorCQkJYUNUWC0+bUNvbXBpbGVDdHgtPmdldEV4ZWN1dGFibGUoKSwgcEJ1ZmZlcik7DQorDQorCWlmKCBhU3ltYm9sLnZhbGlkKCkgKQ0KKwl7DQorQVZNX0lGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBRVUFMSUZJRURfTkFNRV9JRCApDQorCUFWTV9PU19UUkFDRSA8PCBUQUJfREVDUl9JTkRFTlQgPDwgIj58IHJlc3VsdDo+ICINCisJCQk8PCBzdHJfaGVhZGVyKCBhU3ltYm9sLnRvX3B0cjwgSW5zdGFuY2VPZkJ1ZmZlciA+KCkgKSA8PCBzdGQ6OmVuZGw7DQorQVZNX0VORElGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBRVUFMSUZJRURfTkFNRV9JRCApDQorDQorCQlyZXR1cm4oIGFTeW1ib2wgKTsNCisJfQ0KKw0KKwkvLyBFUlJPUiBSRVBPUlRJTkcNCisJZWxzZSBpZiggZ2V0U3ltYm9sVGFibGUoKS5oYXNFcnJvcigpICkNCisJew0KKwkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JFcnJvckNvdW50KCk7DQorCQlBVk1fT1NfV0FSTiA8PCBwQnVmZmVyLT5lcnJvckxvY2F0aW9uKGFDVFgtPm1Db21waWxlQ3R4LT5nZXRBc3RFbGVtZW50KCkpDQorCQkJCTw8IGdldFN5bWJvbFRhYmxlKCkuZ2V0RXJyb3JNZXNzYWdlKCkNCisJCQkJPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsNCisNCisJCXJldHVybiggYUJ1ZmZlciApOw0KKwl9DQorCWVsc2UNCisJew0KKwkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JFcnJvckNvdW50KCk7DQorCQlhQ1RYLT5lcnJvckNvbnRleHQoIEFWTV9PU19XQVJOICkNCisJCQkJPDwgIlVuZm91bmQgYnVmZmVyIGluc3RhbmNlIDw8ICYgIiA8PCBzdHJfaGVhZGVyKCBwQnVmZmVyICkNCisJCQkJPDwgIiA+PiIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsNCisNCisJCXJldHVybiggYUJ1ZmZlciApOw0KKwl9DQorfQ0KKw0KKw0KK2NvbnN0IEJGICYgQXZtY29kZUNvbXBpbGVyOjpjb21waWxlUG9ydCgNCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGICYgYVBvcnQpDQorew0KKwlQb3J0ICogcFBvcnQgPSBhUG9ydC50b19wdHI8IFBvcnQgPigpOw0KKw0KK0FWTV9JRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgUVVBTElGSUVEX05BTUVfSUQgKQ0KKwlBVk1fT1NfVFJBQ0UgPDwgSU5DUl9JTkRFTlRfVEFCIDw8ICI8fCBjb21waWxpbmc8UG9ydD46ICINCisJCQk8PCBzdHJfaGVhZGVyKCBwUG9ydCApIDw8IHN0ZDo6ZW5kbDsNCisJYUNUWC0+ZGVidWdDb250ZXh0KCBBVk1fT1NfVFJBQ0UgPDwgSU5DUl9JTkRFTlQgKSA8PCBERUNSX0lOREVOVDsNCitBVk1fRU5ESUZfREVCVUdfRkxBRzIoIENPTVBJTElORyAsIFFVQUxJRklFRF9OQU1FX0lEICkNCisNCisJY29uc3QgQkYgJiBhU3ltYm9sID0gZ2V0U3ltYm9sVGFibGUoKS4NCisJCQlzZWFyY2hQb3J0U3ltYm9sSW5zdGFuY2UoYUNUWC0+bUNvbXBpbGVDdHgtPmdldEV4ZWN1dGFibGUoKSwgcFBvcnQpOw0KKw0KKwlpZiggYVN5bWJvbC52YWxpZCgpICkNCisJew0KK0FWTV9JRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgUVVBTElGSUVEX05BTUVfSUQgKQ0KKwlBVk1fT1NfVFJBQ0UgPDwgVEFCX0RFQ1JfSU5ERU5UIDw8ICI+fCByZXN1bHQ6PiAiDQorCQkJPDwgc3RyX2hlYWRlciggYVN5bWJvbC50b19wdHI8IEluc3RhbmNlT2ZQb3J0ID4oKSApIDw8IHN0ZDo6ZW5kbDsNCitBVk1fRU5ESUZfREVCVUdfRkxBRzIoIENPTVBJTElORyAsIFFVQUxJRklFRF9OQU1FX0lEICkNCisNCisJCXJldHVybiggYVN5bWJvbCApOw0KKwl9DQorDQorCS8vIEVSUk9SIFJFUE9SVElORw0KKwllbHNlIGlmKCBnZXRTeW1ib2xUYWJsZSgpLmhhc0Vycm9yKCkgKQ0KKwl7DQorCQlnZXRDb21waWxlclRhYmxlKCkuaW5jckVycm9yQ291bnQoKTsNCisJCUFWTV9PU19XQVJOIDw8IHBQb3J0LT5lcnJvckxvY2F0aW9uKGFDVFgtPm1Db21waWxlQ3R4LT5nZXRBc3RFbGVtZW50KCkpDQorCQkJCTw8IGdldFN5bWJvbFRhYmxlKCkuZ2V0RXJyb3JNZXNzYWdlKCkNCisJCQkJPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsNCisNCisJCXJldHVybiggYVBvcnQgKTsNCisJfQ0KKwllbHNlDQorCXsNCisJCWdldENvbXBpbGVyVGFibGUoKS5pbmNyRXJyb3JDb3VudCgpOw0KKwkJYUNUWC0+ZXJyb3JDb250ZXh0KCBBVk1fT1NfV0FSTiApDQorCQkJCTw8ICJVbmZvdW5kIHBvcnQgaW5zdGFuY2UgPDwgIiA8PCBzdHJfaGVhZGVyKCBwUG9ydCApIDw8ICIgPj4iDQorCQkJCTw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7DQorDQorCQlyZXR1cm4oIGFQb3J0ICk7DQorCX0NCit9DQorDQorDQorY29uc3QgQkYgJiBBdm1jb2RlQ29tcGlsZXI6OmNvbXBpbGVDb25uZWN0b3IoDQorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRiAmIGFDb25uZWN0b3IpDQorew0KKwlyZXR1cm4oIGFDb25uZWN0b3IgKTsNCit9DQorDQorDQorY29uc3QgQkYgJiBBdm1jb2RlQ29tcGlsZXI6OmNvbXBpbGVNYWNoaW5lKA0KKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkYgJiBhTWFjaGluZSkNCit7DQorCU1hY2hpbmUgKiBwTWFjaGluZSA9IGFNYWNoaW5lLnRvX3B0cjwgTWFjaGluZSA+KCk7DQorDQorQVZNX0lGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBRVUFMSUZJRURfTkFNRV9JRCApDQorCUFWTV9PU19UUkFDRSA8PCBJTkNSX0lOREVOVF9UQUIgPDwgIjx8IGNvbXBpbGluZzxNYWNoaW5lPjogIg0KKwkJCTw8IHN0cl9oZWFkZXIoIHBNYWNoaW5lICkgPDwgc3RkOjplbmRsOw0KKwlhQ1RYLT5kZWJ1Z0NvbnRleHQoIEFWTV9PU19UUkFDRSA8PCBJTkNSX0lOREVOVCApIDw8IERFQ1JfSU5ERU5UOw0KK0FWTV9FTkRJRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgUVVBTElGSUVEX05BTUVfSUQgKQ0KKw0KKwljb25zdCBCRiAmIGFTeW1ib2wgPQ0KKwkJCWdldFN5bWJvbFRhYmxlKCkuc2VhcmNoSW5zdGFuY2VTdGF0aWMoYUNUWCwgcE1hY2hpbmUpOw0KKw0KKwlpZiggYVN5bWJvbC52YWxpZCgpICkNCisJew0KKwkJSW5zdGFuY2VPZk1hY2hpbmUgKiBhTWFjaGluZVN5bWJvbCA9DQorCQkJCWFTeW1ib2wudG9fcHRyPCBJbnN0YW5jZU9mTWFjaGluZSA+KCk7DQorDQorQVZNX0lGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBRVUFMSUZJRURfTkFNRV9JRCApDQorCUFWTV9PU19UUkFDRSA8PCBUQUJfREVDUl9JTkRFTlQgPDwgIj58IHJlc3VsdDo+ICINCisJCQk8PCBzdHJfaGVhZGVyKCBhTWFjaGluZVN5bWJvbCApIDw8IHN0ZDo6ZW5kbDsNCitBVk1fRU5ESUZfREVCVUdfRkxBRzIoIENPTVBJTElORyAsIFFVQUxJRklFRF9OQU1FX0lEICkNCisNCisJCWlmKCBhTWFjaGluZVN5bWJvbC0+aGFzUnVudGltZVJJRCgpICkNCisJCXsNCisJCQlBVk1fT1NfVFJBQ0UgPDwgVEFCX0RFQ1JfSU5ERU5UIDw8ICI+fCByZXN1bHQ6PiAiDQorCQkJCQk8PCBhTWFjaGluZVN5bWJvbC0+Z2V0UnVudGltZVJJRCgpLnN0cigpIDw8IHN0ZDo6ZW5kbDsNCisNCisJCQlyZXR1cm4oIGFNYWNoaW5lU3ltYm9sLT5nZXRSdW50aW1lUklEKCkgKTsNCisJCX0NCisNCisJCXJldHVybiggYVN5bWJvbCApOw0KKwl9DQorDQorCWNvbnN0IEJGICYgYVN5bWJvbE1vZGVsID0NCisJCQlnZXRTeW1ib2xUYWJsZSgpLnNlYXJjaEluc3RhbmNlTW9kZWwoYUNUWCwgcE1hY2hpbmUpOw0KKw0KKwlpZiggYVN5bWJvbE1vZGVsLnZhbGlkKCkgKQ0KKwl7DQorCQlyZXR1cm4oIGFTeW1ib2xNb2RlbCApOw0KKwl9DQorDQorCWlmKCBwTWFjaGluZS0+Z2V0U3BlY2lmaWVyKCkuaXNEZXNpZ25JbnN0YW5jZUR5bmFtaWMoKSApDQorCXsNCisJCWNvbnN0IEJGICYgYVN5bWJvbCA9DQorCQkJCWdldFN5bWJvbFRhYmxlKCkuc2VhcmNoSW5zdGFuY2VEeW5hbWljKGFDVFgsIHBNYWNoaW5lKTsNCisNCisJCWlmKCBhU3ltYm9sLnZhbGlkKCkgKQ0KKwkJew0KKwkJCXJldHVybiggYVN5bWJvbCApOw0KKwkJfQ0KKwl9DQorDQorCS8vIEVSUk9SIFJFUE9SVElORw0KKwlpZiggZ2V0U3ltYm9sVGFibGUoKS5oYXNFcnJvcigpICkNCisJew0KKwkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JFcnJvckNvdW50KCk7DQorCQlBVk1fT1NfV0FSTiA8PCBwTWFjaGluZS0+ZXJyb3JMb2NhdGlvbigNCisJCQkJYUNUWC0+bUNvbXBpbGVDdHgtPmdldEFzdEVsZW1lbnQoKSApDQorCQkJCTw8IGdldFN5bWJvbFRhYmxlKCkuZ2V0RXJyb3JNZXNzYWdlKCkNCisJCQkJPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsNCisNCisJCXJldHVybiggYU1hY2hpbmUgKTsNCisJfQ0KKwllbHNlDQorCXsNCisJCWdldENvbXBpbGVyVGFibGUoKS5pbmNyRXJyb3JDb3VudCgpOw0KKwkJYUNUWC0+ZXJyb3JDb250ZXh0KCBBVk1fT1NfV0FSTiApDQorCQkJCTw8ICJVbmZvdW5kIG1hY2hpbmUgPDwgIiA8PCBzdHJfaGVhZGVyKCBwTWFjaGluZSApDQorCQkJCTw8ICIgPj4iIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7DQorDQorCQlyZXR1cm4oIGFNYWNoaW5lICk7DQorCX0NCit9DQorDQorDQorY29uc3QgQkYgJiBBdm1jb2RlQ29tcGlsZXI6OmNvbXBpbGVSb3V0aW5lKA0KKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkYgJiBhUm91dGluZSkNCit7DQorCVJvdXRpbmUgKiBwUm91dGluZSA9IGFSb3V0aW5lLnRvX3B0cjwgUm91dGluZSA+KCk7DQorDQorQVZNX0lGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBRVUFMSUZJRURfTkFNRV9JRCApDQorCUFWTV9PU19UUkFDRSA8PCBJTkNSX0lOREVOVF9UQUIgPDwgIjx8IGNvbXBpbGluZzxSb3V0aW5lPjogIg0KKwkJCTw8IHN0cl9oZWFkZXIoIHBSb3V0aW5lICkgPDwgc3RkOjplbmRsOw0KKwlhQ1RYLT5kZWJ1Z0NvbnRleHQoIEFWTV9PU19UUkFDRSA8PCBJTkNSX0lOREVOVCApIDw8IERFQ1JfSU5ERU5UOw0KK0FWTV9FTkRJRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgUVVBTElGSUVEX05BTUVfSUQgKQ0KKw0KKwljb25zdCBCRiAmIGFTeW1ib2wgPQ0KKwkJCWdldFN5bWJvbFRhYmxlKCkuc2VhcmNoUHJvZ3JhbShhQ1RYLCBwUm91dGluZS0+Z2V0TmFtZUlEKCkpOw0KKw0KKwlpZiggYVN5bWJvbC52YWxpZCgpICkNCisJew0KK0FWTV9JRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgUVVBTElGSUVEX05BTUVfSUQgKQ0KKwlBVk1fT1NfVFJBQ0UgPDwgVEFCX0RFQ1JfSU5ERU5UDQorCQkJPDwgIj58IHJlc3VsdDo+ICIgPDwgc3RyX2hlYWRlciggYVN5bWJvbCApIDw8IHN0ZDo6ZW5kbDsNCitBVk1fRU5ESUZfREVCVUdfRkxBRzIoIENPTVBJTElORyAsIFFVQUxJRklFRF9OQU1FX0lEICkNCisNCisJCXJldHVybiggYVN5bWJvbCApOw0KKwl9DQorDQorCS8vIEVSUk9SIFJFUE9SVElORw0KKwllbHNlIGlmKCBnZXRTeW1ib2xUYWJsZSgpLmhhc0Vycm9yKCkgKQ0KKwl7DQorCQlnZXRDb21waWxlclRhYmxlKCkuaW5jckVycm9yQ291bnQoKTsNCisJCUFWTV9PU19XQVJOIDw8IHBSb3V0aW5lLT5lcnJvckxvY2F0aW9uKA0KKwkJCQlhQ1RYLT5tQ29tcGlsZUN0eC0+Z2V0QXN0RWxlbWVudCgpICkNCisJCQkJPDwgZ2V0U3ltYm9sVGFibGUoKS5nZXRFcnJvck1lc3NhZ2UoKQ0KKwkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOw0KKw0KKwkJcmV0dXJuKCBhUm91dGluZSApOw0KKwl9DQorCWVsc2UNCisJew0KKwkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JFcnJvckNvdW50KCk7DQorCQlhQ1RYLT5lcnJvckNvbnRleHQoIEFWTV9PU19XQVJOICkNCisJCQkJPDwgIlVuZm91bmQgcm91dGluZSA8PCAmICIgPDwgc3RyX2hlYWRlciggcFJvdXRpbmUgKQ0KKwkJCQk8PCAiID4+IiA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOw0KKw0KKwkJcmV0dXJuKCBhUm91dGluZSApOw0KKwl9DQorfQ0KKw0KKw0KK2NvbnN0IEJGICYgQXZtY29kZUNvbXBpbGVyOjpjb21waWxlVHJhbnNpdGlvbigNCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGICYgYVRyYW5zaXRpb24pDQorew0KKwlUcmFuc2l0aW9uICogcFRyYW5zaXRpb24gPSBhVHJhbnNpdGlvbi50b19wdHI8IFRyYW5zaXRpb24gPigpOw0KKw0KK0FWTV9JRl9ERUJVR19GTEFHMiggQ09NUElMSU5HICwgUVVBTElGSUVEX05BTUVfSUQgKQ0KKwlBVk1fT1NfVFJBQ0UgPDwgSU5DUl9JTkRFTlRfVEFCIDw8ICI8fCBjb21waWxpbmc8VHJhbnNpdGlvbj46ICINCisJCQk8PCBzdHJfaGVhZGVyKCBwVHJhbnNpdGlvbiApIDw8IHN0ZDo6ZW5kbDsNCisJYUNUWC0+ZGVidWdDb250ZXh0KCBBVk1fT1NfVFJBQ0UgPDwgSU5DUl9JTkRFTlQgKSA8PCBERUNSX0lOREVOVDsNCitBVk1fRU5ESUZfREVCVUdfRkxBRzIoIENPTVBJTElORyAsIFFVQUxJRklFRF9OQU1FX0lEICkNCisNCisJY29uc3QgQkYgJiBhU3ltYm9sID0gZ2V0U3ltYm9sVGFibGUoKS5zZWFyY2hUcmFuc2l0aW9uKGFDVFgsIHBUcmFuc2l0aW9uKTsNCisNCisJaWYoIGFTeW1ib2wudmFsaWQoKSApDQorCXsNCitBVk1fSUZfREVCVUdfRkxBRzIoIENPTVBJTElORyAsIFFVQUxJRklFRF9OQU1FX0lEICkNCisJQVZNX09TX1RSQUNFIDw8IFRBQl9ERUNSX0lOREVOVA0KKwkJCTw8ICI+fCByZXN1bHQ6PiAiIDw8IHN0cl9oZWFkZXIoIGFTeW1ib2wgKSA8PCBzdGQ6OmVuZGw7DQorQVZNX0VORElGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBRVUFMSUZJRURfTkFNRV9JRCApDQorDQorCQlyZXR1cm4oIGFTeW1ib2wgKTsNCisJfQ0KKw0KKwkvLyBFUlJPUiBSRVBPUlRJTkcNCisJZWxzZSBpZiggZ2V0U3ltYm9sVGFibGUoKS5oYXNFcnJvcigpICkNCisJew0KKwkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JFcnJvckNvdW50KCk7DQorCQlBVk1fT1NfV0FSTiA8PCBwVHJhbnNpdGlvbi0+ZXJyb3JMb2NhdGlvbigNCisJCQkJYUNUWC0+bUNvbXBpbGVDdHgtPmdldEFzdEVsZW1lbnQoKSApDQorCQkJCTw8IGdldFN5bWJvbFRhYmxlKCkuZ2V0RXJyb3JNZXNzYWdlKCkNCisJCQkJPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsNCisNCisJCXJldHVybiggYVRyYW5zaXRpb24gKTsNCisJfQ0KKwllbHNlDQorCXsNCisJCWdldENvbXBpbGVyVGFibGUoKS5pbmNyRXJyb3JDb3VudCgpOw0KKwkJYUNUWC0+ZXJyb3JDb250ZXh0KCBBVk1fT1NfV0FSTiApDQorCQkJCTw8ICJVbmZvdW5kIHRyYW5zaXRpb24gPDwgJiAiIDw8IHN0cl9oZWFkZXIoIHBUcmFuc2l0aW9uICkNCisJCQkJPDwgIiA+PiIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsNCisNCisJCXJldHVybiggYVRyYW5zaXRpb24gKTsNCisJfQ0KK30NCisNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8vLyB0aGUgQ09NUElMRVIgb2YgRVhQUkVTU0lPTg0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisNCitCRiBBdm1jb2RlQ29tcGlsZXI6OmNvbXBpbGVFeHByZXNzaW9uKA0KKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpDQorew0KK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgQ09NUElMSU5HICkNCisJQVZNX09TX1RSQUNFIDw8IElOQ1JfSU5ERU5UX1RBQiA8PCAiaW48ZXhwcj46ICINCisJCQk8PCBTVFJJTUwoIGFDb2RlLT50b1N0cmluZyhBVk1fT1NfVFJBQ0UuSU5ERU5UKSApDQorCQkJPDwgc3RkOjpmbHVzaDsNCitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIENPTVBJTElORyApDQorDQorDQorCUJGIGV4cHIgPSBBVk1DT0RFX0NPTVBJTEVSX1RBQkxFWyBhQ29kZS0+Z2V0T3BPZmZzZXQoKSBdLT4NCisJCQljb21waWxlRXhwcmVzc2lvbihhQ1RYLCBhQ29kZSk7DQorDQorDQorQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBDT01QSUxJTkcgKQ0KKwlBVk1fT1NfVFJBQ0UgPDwgVEFCX0RFQ1JfSU5ERU5UIDw8ICJvdXQ6PiAiDQorCQkJPDwgU1RSSU1MKCBleHByLnRvU3RyaW5nKEFWTV9PU19UUkFDRS5JTkRFTlQpICkNCisJCQk8PCBzdGQ6OmZsdXNoOw0KK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgQ09NUElMSU5HICkNCisNCisJcmV0dXJuKCBleHByICk7DQorfQ0KKw0KKw0KK0JGIEF2bWNvZGVDb21waWxlcjo6ZGVjb2RlX2NvbXBpbGVFeHByZXNzaW9uKA0KKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkYgJiBhQ29kZSkNCit7DQorCXN3aXRjaCggYUNvZGUuY2xhc3NLaW5kKCkgKQ0KKwl7DQorCQljYXNlIEZPUk1fQVZNQ09ERV9LSU5EOg0KKwkJew0KKwkJCXJldHVybiggY29tcGlsZUV4cHJlc3Npb24oYUNUWCwgYUNvZGUuYmZDb2RlKCkpICk7DQorCQl9DQorDQorCQljYXNlIEZPUk1fVUZJX0tJTkQ6DQorCQl7DQorCQkJcmV0dXJuKCBjb21waWxlVUZJKGFDVFgsIGFDb2RlLnRvX3JlZjwgVW5pRm9ybUlkZW50aWZpZXI+KCkpICk7DQorCQl9DQorDQorCQljYXNlIEZPUk1fQlVJTFRJTl9RVUFMSUZJRURfSURFTlRJRklFUl9LSU5EOg0KKwkJew0KKwkJCWlmKCBhQ29kZS5zdHIoKS5maW5kKCc6JykgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQ0KKwkJCXsNCisJCQkJcmV0dXJuKCBjb21waWxlRnVsbHlRdWFsaWZpZWROYW1lSUQoYUNUWCwgYUNvZGUpICk7DQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCXJldHVybiggY29tcGlsZVF1YWxpZmllZElkZW50aWZpZXIoYUNUWCwgYUNvZGUpICk7DQorCQkJfQ0KKwkJfQ0KKwkJY2FzZSBGT1JNX0JVSUxUSU5fSURFTlRJRklFUl9LSU5EOg0KKwkJew0KKwkJCXJldHVybiggY29tcGlsZUlkZW50aWZpZXIoYUNUWCwgYUNvZGUpICk7DQorCQl9DQorDQorCQljYXNlIEZPUk1fWEZTUF9WQVJJQUJMRV9LSU5EOg0KKwkJew0KKwkJCXJldHVybiggY29tcGlsZVZhcmlhYmxlKGFDVFgsIGFDb2RlKSApOw0KKwkJfQ0KKw0KKwkJY2FzZSBGT1JNX1hGU1BfREFUQVRZUEVfS0lORDoNCisJCXsNCisJCQlyZXR1cm4oIGNvbXBpbGVEYXRhVHlwZShhQ1RYLCBhQ29kZSkgKTsNCisJCX0NCisNCisJCWNhc2UgRk9STV9YRlNQX01BQ0hJTkVfS0lORDoNCisJCWNhc2UgRk9STV9YRlNQX1NZU1RFTV9LSU5EOg0KKwkJew0KKwkJCXJldHVybiggY29tcGlsZU1hY2hpbmUoYUNUWCwgYUNvZGUpICk7DQorCQl9DQorDQorLy8JCWNhc2UgRk9STV9YRlNQX0lOU1RBTkNFX0tJTkQ6DQorLy8JCXsNCisvLwkJCXJldHVybiggY29tcGlsZUluc3RhbmNlKGFDVFgsIGFDb2RlKSApOw0KKy8vCQl9DQorDQorCQljYXNlIEZPUk1fWEZTUF9CVUZGRVJfS0lORDoNCisJCXsNCisJCQlyZXR1cm4oIGNvbXBpbGVCdWZmZXIoYUNUWCwgYUNvZGUpICk7DQorCQl9DQorDQorCQljYXNlIEZPUk1fWEZTUF9QT1JUX0tJTkQ6DQorCQl7DQorCQkJcmV0dXJuKCBjb21waWxlUG9ydChhQ1RYLCBhQ29kZSkgKTsNCisJCX0NCisNCisJCWNhc2UgRk9STV9YRlNQX1RSQU5TSVRJT05fS0lORDoNCisJCXsNCisJCQlyZXR1cm4oIGNvbXBpbGVUcmFuc2l0aW9uKGFDVFgsIGFDb2RlKSApOw0KKwkJfQ0KKw0KKwkJY2FzZSBGT1JNX1hGU1BfUk9VVElORV9LSU5EOg0KKwkJew0KKwkJCXJldHVybiggY29tcGlsZVJvdXRpbmUoYUNUWCwgYUNvZGUpICk7DQorCQl9DQorDQorDQorCQljYXNlIEZPUk1fWEZTUF9QQUNLQUdFX0tJTkQ6DQorCQljYXNlIEZPUk1fWEZTUF9DSEFOTkVMX0tJTkQ6DQorCQljYXNlIEZPUk1fWEZTUF9DT01fUE9JTlRfS0lORDoNCisJCWNhc2UgRk9STV9YRlNQX0NPTV9ST1VURV9LSU5EOg0KKwkJY2FzZSBGT1JNX1hGU1BfQ09OTkVDVE9SX0tJTkQ6DQorDQorCQljYXNlIEZPUk1fT1BFUkFUT1JfS0lORDoNCisNCisJCWNhc2UgRk9STV9FWEVDVVRBQkxFX01BQ0hJTkVfS0lORDoNCisNCisJCWNhc2UgRk9STV9JTlNUQU5DRV9CVUZGRVJfS0lORDoNCisJCWNhc2UgRk9STV9JTlNUQU5DRV9DT05ORUNUT1JfS0lORDoNCisJCWNhc2UgRk9STV9JTlNUQU5DRV9EQVRBX0tJTkQ6DQorCQljYXNlIEZPUk1fSU5TVEFOQ0VfTUFDSElORV9LSU5EOg0KKwkJY2FzZSBGT1JNX0lOU1RBTkNFX1BPUlRfS0lORDoNCisNCisJCWNhc2UgRk9STV9CVUlMVElOX0JPT0xFQU5fS0lORDoNCisJCWNhc2UgRk9STV9CVUlMVElOX0NIQVJBQ1RFUl9LSU5EOg0KKwkJY2FzZSBGT1JNX0JVSUxUSU5fSU5URUdFUl9LSU5EOg0KKwkJY2FzZSBGT1JNX0JVSUxUSU5fUkFUSU9OQUxfS0lORDoNCisJCWNhc2UgRk9STV9CVUlMVElOX0ZMT0FUX0tJTkQ6DQorCQljYXNlIEZPUk1fQlVJTFRJTl9TVFJJTkdfS0lORDoNCisJCXsNCisJCQlyZXR1cm4oIGFDb2RlICk7DQorCQl9DQorDQorCQljYXNlIEZPUk1fQVJSQVlfQk9PTEVBTl9LSU5EOg0KKwkJY2FzZSBGT1JNX0FSUkFZX0NIQVJBQ1RFUl9LSU5EOg0KKwkJY2FzZSBGT1JNX0FSUkFZX0lOVEVHRVJfS0lORDoNCisJCWNhc2UgRk9STV9BUlJBWV9SQVRJT05BTF9LSU5EOg0KKwkJY2FzZSBGT1JNX0FSUkFZX0ZMT0FUX0tJTkQ6DQorCQljYXNlIEZPUk1fQVJSQVlfU1RSSU5HX0tJTkQ6DQorCQl7DQorCQkJQnVpbHRpbkFycmF5ICogYUJ1aWx0aW5BcnJheSA9IGFDb2RlLnRvX3B0cjwgQnVpbHRpbkFycmF5ID4oKTsNCisNCisJCQkvLyBCdWlsZCB0aGUgdHlwZSBzcGVjaWZpZWQgY29udGFpbmVyDQorCQkJaWYoIChhQ1RYLT5tVHlwZSAhPSBOVUxMKQ0KKwkJCQkmJiBhQ1RYLT5tVHlwZS0+aGFzVHlwZUNvbGxlY3Rpb24oKQ0KKwkJCQkmJiBhQ1RYLT5tVHlwZS0+aXM8IENvbnRhaW5lclR5cGVTcGVjaWZpZXIgPigpICkNCisJCQl7DQorCQkJCUJ1aWx0aW5Db250YWluZXIgKiBjb250YWluZXJWYWx1ZSA9IEJ1aWx0aW5Db250YWluZXI6OmNyZWF0ZSgNCisJCQkJCQlhQ1RYLT5tVHlwZS0+YXM8IENvbnRhaW5lclR5cGVTcGVjaWZpZXIgPigpICk7DQorDQorCQkJCWNvbnRhaW5lclZhbHVlLT5jb3B5KCBhQnVpbHRpbkFycmF5LCBzdGQ6Om1pbigNCisJCQkJCQljb250YWluZXJWYWx1ZS0+Y2FwYWNpdHkoKSwgYUJ1aWx0aW5BcnJheS0+c2l6ZSgpKSApOw0KKw0KKwkJCQlyZXR1cm4oIEJGKCBjb250YWluZXJWYWx1ZSApICk7DQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCXJldHVybiggQkYoIGFCdWlsdGluQXJyYXktPmdldEFycmF5QkYoKSApICk7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJY2FzZSBGT1JNX0FSUkFZX0lERU5USUZJRVJfS0lORDoNCisJCXsNCisJCQlyZXR1cm4oIGNvbXBpbGVBcnJheU9mSWRlbnRpZmllcihhQ1RYLA0KKwkJCQkJYUNvZGUudG9fcHRyPCBBcnJheUlkZW50aWZpZXIgPigpKSApOw0KKwkJfQ0KKw0KKwkJY2FzZSBGT1JNX0FSUkFZX1FVQUxJRklFRF9JREVOVElGSUVSX0tJTkQ6DQorCQl7DQorCQkJcmV0dXJuKCBjb21waWxlQXJyYXlPZlF1YWxpZmllZElkZW50aWZpZXIoYUNUWCwNCisJCQkJCWFDb2RlLnRvX3B0cjwgQXJyYXlRdWFsaWZpZWRJZGVudGlmaWVyID4oKSkgKTsNCisJCX0NCisNCisJCWNhc2UgRk9STV9BUlJBWV9CRl9LSU5EOg0KKwkJew0KKwkJCXJldHVybiggY29tcGlsZUFycmF5T2ZCRihhQ1RYLCBhQ29kZS50b19wdHI8IEFycmF5QkYgPigpKSApOw0KKwkJfQ0KKw0KKwkJY2FzZSBGT1JNX0NPTlRBSU5FUl9WRUNUT1JfS0lORDoNCisJCWNhc2UgRk9STV9DT05UQUlORVJfUkVWRVJTRV9WRUNUT1JfS0lORDoNCisJCWNhc2UgRk9STV9DT05UQUlORVJfTElTVF9LSU5EOg0KKwkJY2FzZSBGT1JNX0NPTlRBSU5FUl9TRVRfS0lORDoNCisJCWNhc2UgRk9STV9DT05UQUlORVJfQkFHX0tJTkQ6DQorCQljYXNlIEZPUk1fQ09OVEFJTkVSX0ZJRk9fS0lORDoNCisJCWNhc2UgRk9STV9DT05UQUlORVJfTElGT19LSU5EOg0KKwkJew0KKwkJCXJldHVybiggYUNvZGUgKTsNCisJCX0NCisNCisJCWRlZmF1bHQ6DQorCQl7IC8vIFRPRE8NCisJCQlBVk1fT1NfV0FSTklOR19BTEVSVA0KKwkJCQkJPDwgIkF2bWNvZGVDb21waWxlciBpcyB0cnlpbmcgdG8gZGVjb2RlX2NvbXBpbGVFeHByZXNzaW9uIg0KKwkJCQkJIlxuXHR0eXBlaW5mbzogIiA8PCBhQ29kZS5yYXdfcG9pbnRlcigpLT5jbGFzc0tpbmRJbmZvKCkNCisJCQkJCTw8ICJcblx0PDwgIiA8PCBhQ29kZS5zdHIoKSA8PCAiID4+ICEhISINCisJCQkJCTw8IFNFTkRfQUxFUlQ7DQorDQorCQkJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsNCisJCX0NCisJfQ0KKw0KKwlyZXR1cm4oIGFDb2RlICk7DQorfQ0KKw0KKw0KKw0KK0JGIEF2bWNvZGVDb21waWxlcjo6Y29tcGlsZUFycmF5T2ZJZGVudGlmaWVyKA0KKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgQXJyYXlJZGVudGlmaWVyICogaWRBcnJheSkNCit7DQorCUJhc2VUeXBlU3BlY2lmaWVyICogYXJyYXlUeXBlID0gKCAoYUNUWC0+bVR5cGUgIT0gTlVMTCkgJiYNCisJCQlhQ1RYLT5tVHlwZS0+aGFzVHlwZUNvbXBvc2l0ZSgpKSA/IGFDVFgtPm1UeXBlIDoNCisJCQkJCWlkQXJyYXktPmdldFR5cGVTcGVjaWZpZXIoKTsNCisNCisJQXJyYXlCRiAqIGNvbXBpbGVkQXJyYXkgPSBuZXcgQXJyYXlCRihhcnJheVR5cGUsIGlkQXJyYXktPnNpemUoKSk7DQorDQorCWJvb2wgaXNub3RDb21waWxlZCA9IGZhbHNlOw0KKw0KKwlpZiggYUNUWC0+bVR5cGUgIT0gTlVMTCApDQorCXsNCisJCUNPTVBJTEVfQ09OVEVYVCAqIGNvbnRlbnRDVFggPSBOVUxMOw0KKw0KKwkJaWYoIGFDVFgtPm1UeXBlLT5oYXNUeXBlQ29sbGVjdGlvbigpICYmDQorCQkJYUNUWC0+bVR5cGUtPmlzPCBDb250YWluZXJUeXBlU3BlY2lmaWVyID4oKSApDQorCQl7DQorCQkJY29udGVudENUWCA9IGFDVFgtPmNsb25lKCBhQ1RYLT5tVHlwZS0+DQorCQkJCQl0bzwgQ29udGFpbmVyVHlwZVNwZWNpZmllciA+KCktPg0KKwkJCQkJCQlnZXRDb250ZW50c1R5cGVTcGVjaWZpZXIoKSApOw0KKw0KKwkJCWZvciggYXZtX3NpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgaWRBcnJheS0+c2l6ZSgpIDsgKytpbmRleCApDQorCQkJew0KKwkJCQljb21waWxlZEFycmF5LT5zZXQoIGluZGV4LA0KKwkJCQkJCWNvbXBpbGVJZGVudGlmaWVyKGNvbnRlbnRDVFgsIGlkQXJyYXktPmdldChpbmRleCkpICk7DQorCQkJfQ0KKwkJfQ0KKwkJZWxzZSBpZiggYUNUWC0+bVR5cGUtPmlzVHlwZWRTdHJ1Y3R1cmUoKSApDQorCQl7DQorCQkJQ2xhc3NUeXBlU3BlY2lmaWVyICogdHlwZVN0cnVjdCA9DQorCQkJCQlhQ1RYLT5tVHlwZS0+dG88IENsYXNzVHlwZVNwZWNpZmllciA+KCk7DQorCQkJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgaXRGaWVsZCA9DQorCQkJCQl0eXBlU3RydWN0LT5nZXRTeW1ib2xEYXRhKCkuYmVnaW4oKTsNCisJCQlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBlbmRGaWVsZCA9DQorCQkJCQl0eXBlU3RydWN0LT5nZXRTeW1ib2xEYXRhKCkuZW5kKCk7DQorDQorCQkJZm9yKCBhdm1fc2l6ZV90IGluZGV4ID0gMDsgKGluZGV4IDwgaWRBcnJheS0+c2l6ZSgpKSAmJg0KKwkJCQkJKGl0RmllbGQgIT0gZW5kRmllbGQpIDsgKytpbmRleCApDQorCQkJew0KKwkJCQljb250ZW50Q1RYID0gYUNUWC0+Y2xvbmUoDQorCQkJCQkJKCppdEZpZWxkKS5nZXRUeXBlU3BlY2lmaWVyKCkgKTsNCisNCisJCQkJY29tcGlsZWRBcnJheS0+c2V0KCBpbmRleCwNCisJCQkJCQljb21waWxlSWRlbnRpZmllcihjb250ZW50Q1RYLCBpZEFycmF5LT5nZXQoaW5kZXgpKSApOw0KKwkJCX0NCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQlpc25vdENvbXBpbGVkID0gdHJ1ZTsNCisJCX0NCisJfQ0KKw0KKwlpZiggaXNub3RDb21waWxlZCApDQorCXsNCisJCWZvciggYXZtX3NpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgaWRBcnJheS0+c2l6ZSgpIDsgKytpbmRleCApDQorCQl7DQorCQkJY29tcGlsZWRBcnJheS0+c2V0KCBpbmRleCwNCisJCQkJCWNvbXBpbGVJZGVudGlmaWVyKGFDVFgsIGlkQXJyYXktPmdldChpbmRleCkpICk7DQorCQl9DQorCX0NCisNCisJLy8gQnVpbGQgdGhlIHR5cGUgc3BlY2lmaWVkIGNvbnRhaW5lcg0KKwlpZiggKGFDVFgtPm1UeXBlICE9IE5VTEwpICYmIGFDVFgtPm1UeXBlLT5oYXNUeXBlQ29sbGVjdGlvbigpICYmDQorCQlhQ1RYLT5tVHlwZS0+aXM8IENvbnRhaW5lclR5cGVTcGVjaWZpZXIgPigpICkNCisJew0KKwkJQnVpbHRpbkNvbnRhaW5lciAqIGNvbnRhaW5lclZhbHVlID0gQnVpbHRpbkNvbnRhaW5lcjo6Y3JlYXRlKA0KKwkJCQlhQ1RYLT5tVHlwZS0+YXM8IENvbnRhaW5lclR5cGVTcGVjaWZpZXIgPigpICk7DQorDQorCQljb250YWluZXJWYWx1ZS0+Y29weSggY29tcGlsZWRBcnJheSwgc3RkOjptaW4oDQorCQkJCWNvbnRhaW5lclZhbHVlLT5jYXBhY2l0eSgpLCBjb21waWxlZEFycmF5LT5zaXplKCkpICk7DQorDQorCQlyZXR1cm4oIEJGKCBjb250YWluZXJWYWx1ZSApICk7DQorCX0NCisJZWxzZQ0KKwl7DQorCQlyZXR1cm4oIEJGKCBjb21waWxlZEFycmF5ICkgKTsNCisJfQ0KK30NCisNCisNCitCRiBBdm1jb2RlQ29tcGlsZXI6OmNvbXBpbGVBcnJheU9mUXVhbGlmaWVkSWRlbnRpZmllcigNCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIEFycmF5UXVhbGlmaWVkSWRlbnRpZmllciAqIHVmaWRBcnJheSkNCit7DQorCUJhc2VUeXBlU3BlY2lmaWVyICogYXJyYXlUeXBlID0gKCAoYUNUWC0+bVR5cGUgIT0gTlVMTCkgJiYNCisJCQlhQ1RYLT5tVHlwZS0+aGFzVHlwZUNvbXBvc2l0ZSgpKSA/IGFDVFgtPm1UeXBlIDoNCisJCQkJCXVmaWRBcnJheS0+Z2V0VHlwZVNwZWNpZmllcigpOw0KKw0KKwlBcnJheUJGICogY29tcGlsZWRBcnJheSA9IG5ldyBBcnJheUJGKGFycmF5VHlwZSwgdWZpZEFycmF5LT5zaXplKCkpOw0KKw0KKwlib29sIGlzbm90Q29tcGlsZWQgPSBmYWxzZTsNCisNCisJaWYoIGFDVFgtPm1UeXBlICE9IE5VTEwgKQ0KKwl7DQorCQlDT01QSUxFX0NPTlRFWFQgKiBjb250ZW50Q1RYID0gTlVMTDsNCisNCisJCWlmKCBhQ1RYLT5tVHlwZS0+aGFzVHlwZUNvbGxlY3Rpb24oKSAmJg0KKwkJCWFDVFgtPm1UeXBlLT5pczwgQ29udGFpbmVyVHlwZVNwZWNpZmllciA+KCkgKQ0KKwkJew0KKwkJCWNvbnRlbnRDVFggPSBhQ1RYLT5jbG9uZSggYUNUWC0+bVR5cGUtPg0KKwkJCQkJdG88IENvbnRhaW5lclR5cGVTcGVjaWZpZXIgPigpLT4NCisJCQkJCQkJZ2V0Q29udGVudHNUeXBlU3BlY2lmaWVyKCkgKTsNCisNCisJCQlmb3IoIGF2bV9zaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHVmaWRBcnJheS0+c2l6ZSgpIDsgKytpbmRleCApDQorCQkJew0KKwkJCQljb21waWxlZEFycmF5LT5zZXQoIGluZGV4LA0KKwkJCQkJCWNvbXBpbGVGdWxseVF1YWxpZmllZE5hbWVJRCgNCisJCQkJCQkJCWNvbnRlbnRDVFgsIHVmaWRBcnJheS0+Z2V0KGluZGV4KSkgKTsNCisJCQl9DQorCQl9DQorCQllbHNlIGlmKCBhQ1RYLT5tVHlwZS0+aXNUeXBlZFN0cnVjdHVyZSgpICkNCisJCXsNCisJCQlDbGFzc1R5cGVTcGVjaWZpZXIgKiB0eXBlU3RydWN0ID0NCisJCQkJCWFDVFgtPm1UeXBlLT50bzwgQ2xhc3NUeXBlU3BlY2lmaWVyID4oKTsNCisJCQlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBpdEZpZWxkID0NCisJCQkJCXR5cGVTdHJ1Y3QtPmdldFN5bWJvbERhdGEoKS5iZWdpbigpOw0KKwkJCVRhYmxlT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGVuZEZpZWxkID0NCisJCQkJCXR5cGVTdHJ1Y3QtPmdldFN5bWJvbERhdGEoKS5lbmQoKTsNCisNCisJCQlmb3IoIGF2bV9zaXplX3QgaW5kZXggPSAwOyAoaW5kZXggPCB1ZmlkQXJyYXktPnNpemUoKSkgJiYNCisJCQkJCShpdEZpZWxkICE9IGVuZEZpZWxkKSA7ICsraW5kZXggKQ0KKwkJCXsNCisJCQkJY29udGVudENUWCA9IGFDVFgtPmNsb25lKA0KKwkJCQkJCSgqaXRGaWVsZCkuZ2V0VHlwZVNwZWNpZmllcigpICk7DQorDQorCQkJCWNvbXBpbGVkQXJyYXktPnNldCggaW5kZXgsDQorCQkJCQkJY29tcGlsZUZ1bGx5UXVhbGlmaWVkTmFtZUlEKA0KKwkJCQkJCQkJY29udGVudENUWCwgdWZpZEFycmF5LT5nZXQoaW5kZXgpKSApOw0KKwkJCX0NCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQlpc25vdENvbXBpbGVkID0gdHJ1ZTsNCisJCX0NCisJfQ0KKw0KKwlpZiggaXNub3RDb21waWxlZCApDQorCXsNCisJCWZvciggYXZtX3NpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgdWZpZEFycmF5LT5zaXplKCkgOyArK2luZGV4ICkNCisJCXsNCisJCQljb21waWxlZEFycmF5LT5zZXQoIGluZGV4LA0KKwkJCQkJY29tcGlsZUZ1bGx5UXVhbGlmaWVkTmFtZUlEKGFDVFgsIHVmaWRBcnJheS0+Z2V0KGluZGV4KSkgKTsNCisJCX0NCisJfQ0KKw0KKwkvLyBCdWlsZCB0aGUgdHlwZSBzcGVjaWZpZWQgY29udGFpbmVyDQorCWlmKCAoYUNUWC0+bVR5cGUgIT0gTlVMTCkgJiYgYUNUWC0+bVR5cGUtPmhhc1R5cGVDb2xsZWN0aW9uKCkgJiYNCisJCWFDVFgtPm1UeXBlLT5pczwgQ29udGFpbmVyVHlwZVNwZWNpZmllciA+KCkgKQ0KKwl7DQorCQlCdWlsdGluQ29udGFpbmVyICogY29udGFpbmVyVmFsdWUgPSBCdWlsdGluQ29udGFpbmVyOjpjcmVhdGUoDQorCQkJCWFDVFgtPm1UeXBlLT5hczwgQ29udGFpbmVyVHlwZVNwZWNpZmllciA+KCkgKTsNCisNCisJCWNvbnRhaW5lclZhbHVlLT5jb3B5KCBjb21waWxlZEFycmF5LCBzdGQ6Om1pbigNCisJCQkJY29udGFpbmVyVmFsdWUtPmNhcGFjaXR5KCksIGNvbXBpbGVkQXJyYXktPnNpemUoKSkgKTsNCisNCisJCXJldHVybiggQkYoIGNvbnRhaW5lclZhbHVlICkgKTsNCisJfQ0KKwllbHNlDQorCXsNCisJCXJldHVybiggQkYoIGNvbXBpbGVkQXJyYXkgKSApOw0KKwl9DQorfQ0KKw0KKw0KK0JGIEF2bWNvZGVDb21waWxlcjo6Y29tcGlsZUFycmF5T2ZCRigNCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIEFycmF5QkYgKiBiZmFycmF5KQ0KK3sNCisJQmFzZVR5cGVTcGVjaWZpZXIgKiBhcnJheVR5cGUgPSAoIChhQ1RYLT5tVHlwZSAhPSBOVUxMKSAmJg0KKwkJCWFDVFgtPm1UeXBlLT5oYXNUeXBlQ29tcG9zaXRlKCkgKSA/DQorCQkJCQlhQ1RYLT5tVHlwZSA6IGJmYXJyYXktPmdldFR5cGVTcGVjaWZpZXIoKTsNCisNCisJQXJyYXlCRiAqIGNvbXBpbGVkQXJyYXkgPSBuZXcgQXJyYXlCRihhcnJheVR5cGUsIGJmYXJyYXktPnNpemUoKSk7DQorDQorCUJGIGJmQ29tcGlsZWRBcnJheSggY29tcGlsZWRBcnJheSApOw0KKw0KKwlib29sIGlzbm90Q29tcGlsZWQgPSBmYWxzZTsNCisNCisJaWYoIGFDVFgtPm1UeXBlICE9IE5VTEwgKQ0KKwl7DQorCQlDT01QSUxFX0NPTlRFWFQgKiBjb250ZW50Q1RYID0gTlVMTDsNCisNCisJCWlmKCBhQ1RYLT5tVHlwZS0+aGFzVHlwZUNvbGxlY3Rpb24oKSAmJg0KKwkJCWFDVFgtPm1UeXBlLT5pczwgQ29udGFpbmVyVHlwZVNwZWNpZmllciA+KCkgKQ0KKwkJew0KKwkJCWNvbnRlbnRDVFggPSBhQ1RYLT5jbG9uZSggYUNUWC0+bVR5cGUtPg0KKwkJCQkJdG88IENvbnRhaW5lclR5cGVTcGVjaWZpZXIgPigpLT4NCisJCQkJCQkJZ2V0Q29udGVudHNUeXBlU3BlY2lmaWVyKCkgKTsNCisNCisJCQlmb3IoIGF2bV9zaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IGJmYXJyYXktPnNpemUoKSA7ICsraW5kZXggKQ0KKwkJCXsNCisJCQkJY29tcGlsZWRBcnJheS0+c2V0KCBpbmRleCAsIGRlY29kZV9jb21waWxlRXhwcmVzc2lvbigNCisJCQkJCQljb250ZW50Q1RYLCBiZmFycmF5LT5hdChpbmRleCkgKSApOw0KKwkJCX0NCisJCX0NCisJCWVsc2UgaWYoIGFDVFgtPm1UeXBlLT5pc1R5cGVkU3RydWN0dXJlKCkgKQ0KKwkJew0KKwkJCUNsYXNzVHlwZVNwZWNpZmllciAqIHR5cGVTdHJ1Y3QgPQ0KKwkJCQkJYUNUWC0+bVR5cGUtPnRvPCBDbGFzc1R5cGVTcGVjaWZpZXIgPigpOw0KKwkJCVRhYmxlT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGl0RmllbGQgPQ0KKwkJCQkJdHlwZVN0cnVjdC0+Z2V0U3ltYm9sRGF0YSgpLmJlZ2luKCk7DQorCQkJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgZW5kRmllbGQgPQ0KKwkJCQkJdHlwZVN0cnVjdC0+Z2V0U3ltYm9sRGF0YSgpLmVuZCgpOw0KKw0KKwkJCWZvciggYXZtX3NpemVfdCBpbmRleCA9IDA7IChpbmRleCA8IGJmYXJyYXktPnNpemUoKSkgJiYNCisJCQkJCShpdEZpZWxkICE9IGVuZEZpZWxkKSA7ICsraW5kZXggKQ0KKwkJCXsNCisJCQkJY29udGVudENUWCA9IGFDVFgtPmNsb25lKA0KKwkJCQkJCSgqaXRGaWVsZCkuZ2V0VHlwZVNwZWNpZmllcigpICk7DQorDQorCQkJCWNvbXBpbGVkQXJyYXktPnNldCggaW5kZXggLCBkZWNvZGVfY29tcGlsZUV4cHJlc3Npb24oDQorCQkJCQkJY29udGVudENUWCwgYmZhcnJheS0+YXQoaW5kZXgpICkgKTsNCisJCQl9DQorCQl9DQorCQllbHNlDQorCQl7DQorCQkJaXNub3RDb21waWxlZCA9IHRydWU7DQorCQl9DQorCX0NCisNCisJaWYoIGlzbm90Q29tcGlsZWQgKQ0KKwl7DQorCQlmb3IoIGF2bV9zaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IGJmYXJyYXktPnNpemUoKSA7ICsraW5kZXggKQ0KKwkJew0KKwkJCWNvbXBpbGVkQXJyYXktPnNldCggaW5kZXggLA0KKwkJCQkJZGVjb2RlX2NvbXBpbGVFeHByZXNzaW9uKA0KKwkJCQkJCQlhQ1RYLCBiZmFycmF5LT5hdChpbmRleCkgKSApOw0KKwkJfQ0KKwl9DQorDQorCS8vIEJ1aWxkIHRoZSB0eXBlIHNwZWNpZmllZCBjb250YWluZXINCisJaWYoIChhQ1RYLT5tVHlwZSAhPSBOVUxMKSAmJiBhQ1RYLT5tVHlwZS0+aGFzVHlwZUNvbGxlY3Rpb24oKSAmJg0KKwkJYUNUWC0+bVR5cGUtPmlzPCBDb250YWluZXJUeXBlU3BlY2lmaWVyID4oKSApDQorCXsNCisJCWlmKCBBYnN0cmFjdEF2bWNvZGVDb21waWxlcjo6DQorCQkJCW11c3RCZUV2YWx1YXRlZEFyZ3VtZW50QXJyYXkoIGNvbXBpbGVkQXJyYXkgKSApDQorCQl7DQorCQkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NvZGUoDQorCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0NUT1IsDQorCQkJCQlJTkNSX0JGKGFDVFgtPm1UeXBlKSwgYmZDb21waWxlZEFycmF5KSApOw0KKwkJfQ0KKwkJZWxzZQ0KKwkJew0KKwkJCUJ1aWx0aW5Db250YWluZXIgKiBjb250YWluZXJWYWx1ZSA9IEJ1aWx0aW5Db250YWluZXI6OmNyZWF0ZSgNCisJCQkJCWFDVFgtPm1UeXBlLT5hczwgQ29udGFpbmVyVHlwZVNwZWNpZmllciA+KCkgKTsNCisNCisJCQljb250YWluZXJWYWx1ZS0+Y29weSggY29tcGlsZWRBcnJheSwgc3RkOjptaW4oDQorCQkJCQljb250YWluZXJWYWx1ZS0+Y2FwYWNpdHkoKSwgY29tcGlsZWRBcnJheS0+c2l6ZSgpKSApOw0KKw0KKwkJCXJldHVybiggQkYoIGNvbnRhaW5lclZhbHVlICkgKTsNCisJCX0NCisJfQ0KKwllbHNlDQorCXsNCisJCXJldHVybiggYmZDb21waWxlZEFycmF5ICk7DQorCX0NCit9DQorDQorDQorDQorDQorQkYgQXZtY29kZUNvbXBpbGVyOjpkZWNvZGVfY29tcGlsZVZhcmlhYmxlTWFjaGluZSgNCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGICYgYUNvZGUpDQorew0KKwlCRiB2YXJDb2RlID0gZGVjb2RlX2NvbXBpbGVFeHByZXNzaW9uKGFDVFgsIGFDb2RlKTsNCisJaWYoIHZhckNvZGUuaXM8IEluc3RhbmNlT2ZNYWNoaW5lID4oKSApDQorCXsNCisJCWlmKCB2YXJDb2RlLnRvX3B0cjwgSW5zdGFuY2VPZk1hY2hpbmUgPigpLT5oYXNSdW50aW1lUklEKCkgKQ0KKwkJew0KKwkJCXJldHVybiggdmFyQ29kZS50b19wdHI8IEluc3RhbmNlT2ZNYWNoaW5lID4oKS0+Z2V0UnVudGltZVJJRCgpICk7DQorCQl9DQorCQlyZXR1cm4oIHZhckNvZGUgKTsNCisJfQ0KKwllbHNlIGlmKCB2YXJDb2RlLmlzPCBJbnN0YW5jZU9mRGF0YSA+KCkgKQ0KKwl7DQorCQlpZiggdmFyQ29kZS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKS0+aXNUeXBlZE1hY2hpbmUoKSApDQorCQl7DQorCQkJcmV0dXJuKCB2YXJDb2RlICk7DQorCQl9DQorCX0NCisNCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsNCit9DQorDQorQkYgQXZtY29kZUNvbXBpbGVyOjpkZWNvZGVfY29tcGlsZVZhcmlhYmxlUG9ydCgNCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGICYgYUNvZGUpDQorew0KKwlCRiB2YXJDb2RlID0gZGVjb2RlX2NvbXBpbGVFeHByZXNzaW9uKGFDVFgsIGFDb2RlKTsNCisJaWYoIHZhckNvZGUuaXM8IEluc3RhbmNlT2ZQb3J0ID4oKSApDQorCXsNCisJCXJldHVybiggdmFyQ29kZSApOw0KKwl9DQorCWVsc2UgaWYoIHZhckNvZGUuaXM8IEluc3RhbmNlT2ZEYXRhID4oKSApDQorCXsNCisJCWlmKCB2YXJDb2RlLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpLT5pc1R5cGVkUG9ydCgpICkNCisJCXsNCisJCQlyZXR1cm4oIHZhckNvZGUgKTsNCisJCX0NCisJfQ0KKw0KKwlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOw0KK30NCisNCitCRiBBdm1jb2RlQ29tcGlsZXI6OmRlY29kZV9jb21waWxlVmFyaWFibGVCdWZmZXIoDQorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRiAmIGFDb2RlKQ0KK3sNCisJQkYgdmFyQ29kZSA9IGRlY29kZV9jb21waWxlRXhwcmVzc2lvbihhQ1RYLCBhQ29kZSk7DQorCWlmKCB2YXJDb2RlLmlzPCBJbnN0YW5jZU9mQnVmZmVyID4oKSApDQorCXsNCisJCXJldHVybiggdmFyQ29kZSApOw0KKwl9DQorCWVsc2UgaWYoIHZhckNvZGUuaXM8IEluc3RhbmNlT2ZEYXRhID4oKSApDQorCXsNCisJCWlmKCB2YXJDb2RlLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpLT5pc1R5cGVkQnVmZmVyKCkgKQ0KKwkJew0KKwkJCXJldHVybiggdmFyQ29kZSApOw0KKwkJfQ0KKwl9DQorDQorCXJldHVybiggQkY6OlJFRl9OVUxMICk7DQorfQ0KKw0KKw0KKw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLy8vIHRoZSBPUFRJTUlaRVIgb2YgRVhQUkVTU0lPTg0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisNCitCRiBBdm1jb2RlQ29tcGlsZXI6Om9wdGltaXplRXhwcmVzc2lvbigNCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQ0KK3sNCisJaWYoIGFDb2RlLT5oYXNJbnN0cnVjdGlvbigpICkNCisJew0KKwkJcmV0dXJuKCBhQ29kZSApOw0KKwl9DQorDQorQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBDT01QSUxJTkcgKQ0KKwlBVk1fT1NfVFJBQ0UgPDwgSU5DUl9JTkRFTlRfVEFCIDw8ICJpbjxleHByPjogIg0KKwkJCTw8IFNUUklNTCggYUNvZGUtPnRvU3RyaW5nKEFWTV9PU19UUkFDRS5JTkRFTlQpICkNCisJCQk8PCBzdGQ6OmZsdXNoOw0KK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgQ09NUElMSU5HICkNCisNCisNCisJQkYgZXhwciA9IEFWTUNPREVfQ09NUElMRVJfVEFCTEVbIGFDb2RlLT5nZXRPcE9mZnNldCgpIF0tPg0KKwkJCW9wdGltaXplRXhwcmVzc2lvbihhQ1RYLCBhQ29kZSk7DQorDQorDQorQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBDT01QSUxJTkcgKQ0KKwlBVk1fT1NfVFJBQ0UgPDwgVEFCX0RFQ1JfSU5ERU5UIDw8ICJvdXQ6PiAiDQorCQkJPDwgU1RSSU1MKCBleHByLnRvU3RyaW5nKEFWTV9PU19UUkFDRS5JTkRFTlQpICkNCisJCQk8PCBzdGQ6OmZsdXNoOw0KK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgQ09NUElMSU5HICkNCisNCisJcmV0dXJuKCBleHByICk7DQorfQ0KKw0KKw0KK0JGIEF2bWNvZGVDb21waWxlcjo6ZGVjb2RlX29wdGltaXplRXhwcmVzc2lvbigNCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGICYgYUNvZGUpDQorew0KKwlzd2l0Y2goIGFDb2RlLmNsYXNzS2luZCgpICkNCisJew0KKwkJY2FzZSBGT1JNX0FWTUNPREVfS0lORDoNCisJCXsNCisJCQlyZXR1cm4oIG9wdGltaXplRXhwcmVzc2lvbihhQ1RYLCBhQ29kZS5iZkNvZGUoKSkgKTsNCisJCX0NCisNCisJCWNhc2UgRk9STV9JTlNUQU5DRV9EQVRBX0tJTkQ6DQorCQl7DQorCQkJSW5zdGFuY2VPZkRhdGEgKiBhbkluc3RhbmNlID0gYUNvZGUudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCk7DQorCQkJaWYoIGFuSW5zdGFuY2UtPmdldE1vZGlmaWVyKCkuaGFzTW9kaWZpZXJQdWJsaWNGaW5hbFN0YXRpYygpDQorCQkJCSYmIGFuSW5zdGFuY2UtPmlzVHlwZWRFbnVtKCkgJiYgYW5JbnN0YW5jZS0+aGFzVmFsdWUoKSApDQorCQkJew0KKwkJCQlyZXR1cm4oIGFuSW5zdGFuY2UtPmdldFZhbHVlKCkgKTsNCisJCQl9DQorCQkJZWxzZQ0KKwkJCXsNCisJCQkJQkYgb3B0RXhwciA9IGFDb2RlOw0KKw0KKwkJCQlyZXR1cm4oIG9wdEV4cHIgKTsNCisJCQl9DQorCQl9DQorDQorCQlkZWZhdWx0Og0KKwkJew0KKwkJCUJGIG9wdEV4cHIgPSBhQ29kZTsNCisNCisJCQlyZXR1cm4oIG9wdEV4cHIgKTsNCisJCX0NCisJfQ0KK30NCisNCisNCisNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8vLyB0aGUgQ09NUElMRVIgb2YgU1RBVEVNRU5UDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKw0KK0JGQ29kZSBBdm1jb2RlQ29tcGlsZXI6OmNvbXBpbGVTdGF0ZW1lbnQoDQorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkNCit7DQorQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIENPTVBJTElORyApDQorCUFWTV9PU19UUkFDRSA8PCBJTkNSX0lOREVOVF9UQUIgPDwgImluPHN0bW50PjogIg0KKwkJCTw8IFNUUklNTCggYUNvZGUtPnRvU3RyaW5nKEFWTV9PU19UUkFDRS5JTkRFTlQpICkNCisJCQk8PCBzdGQ6OmZsdXNoOw0KKw0KKy8vCUFWTV9PU19UUkFDRSA8PCAiYUNvZGUtPmdldE9wZXJhdG9yKCkgICA6PiAiIDw8IGFDb2RlLT5nZXRPcGVyYXRvcigpLT5zdHJPcCgpDQorLy8JCQk8PCBzdGQ6OmVuZGwNCisvLwkJCTw8ICJhQ29kZS0+Z2V0T3BPZmZzZXQoKSAgIDo+ICIgPDwgYUNvZGUtPmdldE9wT2Zmc2V0KCkNCisvLwkJCTw8IHN0ZDo6ZW5kbA0KKy8vCQkJPDwgIkFWTUNPREVfQ09NUElMRVJfVEFCTEUgOj4gQCIgPDwgJkFWTUNPREVfQ09NUElMRVJfVEFCTEUNCisvLwkJCTw8IHN0ZDo6ZW5kbDsNCitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgQ09NUElMSU5HICkNCisNCisNCisJQkZDb2RlIHN0bW50ID0gQVZNQ09ERV9DT01QSUxFUl9UQUJMRVsgYUNvZGUtPmdldE9wT2Zmc2V0KCkgXS0+DQorCQkJY29tcGlsZVN0YXRlbWVudChhQ1RYLCBhQ29kZSk7DQorDQorDQorQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIENPTVBJTElORyApDQorCUFWTV9PU19UUkFDRSA8PCBUQUJfREVDUl9JTkRFTlQgPDwgIm91dDo+ICINCisJCQk8PCBTVFJJTUwoIHN0bW50LT50b1N0cmluZyhBVk1fT1NfVFJBQ0UuSU5ERU5UKSApDQorCQkJPDwgc3RkOjpmbHVzaDsNCitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgQ09NUElMSU5HICkNCisNCisJcmV0dXJuKCBzdG1udCApOw0KK30NCisNCisNCitCRiBBdm1jb2RlQ29tcGlsZXI6OmRlY29kZV9jb21waWxlU3RhdGVtZW50KA0KKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkYgJiBhQ29kZSkNCit7DQorCXN3aXRjaCggYUNvZGUuY2xhc3NLaW5kKCkgKQ0KKwl7DQorCQljYXNlIEZPUk1fQVZNQ09ERV9LSU5EOg0KKwkJew0KKwkJCXJldHVybiggY29tcGlsZVN0YXRlbWVudChhQ1RYLCBhQ29kZS5iZkNvZGUoKSkgKTsNCisJCX0NCisNCisJCWNhc2UgRk9STV9VRklfS0lORDoNCisJCXsNCisJCQlyZXR1cm4oIGNvbXBpbGVVRkkoYUNUWCwgYUNvZGUudG9fcmVmPCBVbmlGb3JtSWRlbnRpZmllcj4oKSkgKTsNCisJCX0NCisNCisJCWNhc2UgRk9STV9CVUlMVElOX1FVQUxJRklFRF9JREVOVElGSUVSX0tJTkQ6DQorCQl7DQorCQkJaWYoIGFDb2RlLnN0cigpLmZpbmQoJzonKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyApDQorCQkJew0KKwkJCQlyZXR1cm4oIGNvbXBpbGVGdWxseVF1YWxpZmllZE5hbWVJRChhQ1RYLCBhQ29kZSkgKTsNCisJCQl9DQorCQkJZWxzZQ0KKwkJCXsNCisJCQkJcmV0dXJuKCBjb21waWxlUXVhbGlmaWVkSWRlbnRpZmllcihhQ1RYLCBhQ29kZSkgKTsNCisJCQl9DQorCQl9DQorCQljYXNlIEZPUk1fQlVJTFRJTl9JREVOVElGSUVSX0tJTkQ6DQorCQl7DQorCQkJcmV0dXJuKCBjb21waWxlUXVhbGlmaWVkSWRlbnRpZmllcihhQ1RYLCBhQ29kZSkgKTsNCisJCX0NCisNCisJCWNhc2UgRk9STV9YRlNQX0RBVEFUWVBFX0tJTkQ6DQorCQl7DQorCQkJcmV0dXJuKCBjb21waWxlRGF0YVR5cGUoYUNUWCwgYUNvZGUpICk7DQorCQl9DQorDQorCQljYXNlIEZPUk1fWEZTUF9WQVJJQUJMRV9LSU5EOg0KKwkJew0KKwkJCXJldHVybiggY29tcGlsZVZhcmlhYmxlKGFDVFgsIGFDb2RlKSApOw0KKwkJfQ0KKw0KKwkJY2FzZSBGT1JNX1hGU1BfTUFDSElORV9LSU5EOg0KKwkJY2FzZSBGT1JNX1hGU1BfU1lTVEVNX0tJTkQ6DQorCQl7DQorCQkJcmV0dXJuKCBjb21waWxlTWFjaGluZShhQ1RYLCBhQ29kZSkgKTsNCisJCX0NCisNCisvLwkJY2FzZSBGT1JNX1hGU1BfSU5TVEFOQ0VfS0lORDoNCisvLwkJew0KKy8vCQkJcmV0dXJuKCBjb21waWxlSW5zdGFuY2UoYUNUWCwgYUNvZGUpICk7DQorLy8JCX0NCisNCisJCWNhc2UgRk9STV9YRlNQX0JVRkZFUl9LSU5EOg0KKwkJew0KKwkJCXJldHVybiggY29tcGlsZUJ1ZmZlcihhQ1RYLCBhQ29kZSkgKTsNCisJCX0NCisNCisJCWNhc2UgRk9STV9YRlNQX1BPUlRfS0lORDoNCisJCXsNCisJCQlyZXR1cm4oIGNvbXBpbGVQb3J0KGFDVFgsIGFDb2RlKSApOw0KKwkJfQ0KKw0KKwkJY2FzZSBGT1JNX1hGU1BfVFJBTlNJVElPTl9LSU5EOg0KKwkJew0KKwkJCXJldHVybiggY29tcGlsZVRyYW5zaXRpb24oYUNUWCwgYUNvZGUpICk7DQorCQl9DQorDQorCQljYXNlIEZPUk1fWEZTUF9ST1VUSU5FX0tJTkQ6DQorCQl7DQorCQkJcmV0dXJuKCBjb21waWxlUm91dGluZShhQ1RYLCBhQ29kZSkgKTsNCisJCX0NCisNCisNCisJCWNhc2UgRk9STV9YRlNQX1BBQ0tBR0VfS0lORDoNCisJCWNhc2UgRk9STV9YRlNQX0NIQU5ORUxfS0lORDoNCisJCWNhc2UgRk9STV9YRlNQX0NPTV9QT0lOVF9LSU5EOg0KKwkJY2FzZSBGT1JNX1hGU1BfQ09NX1JPVVRFX0tJTkQ6DQorCQljYXNlIEZPUk1fWEZTUF9DT05ORUNUT1JfS0lORDoNCisNCisJCWNhc2UgRk9STV9PUEVSQVRPUl9LSU5EOg0KKw0KKwkJY2FzZSBGT1JNX0VYRUNVVEFCTEVfTUFDSElORV9LSU5EOg0KKw0KKwkJY2FzZSBGT1JNX0lOU1RBTkNFX0JVRkZFUl9LSU5EOg0KKwkJY2FzZSBGT1JNX0lOU1RBTkNFX0NPTk5FQ1RPUl9LSU5EOg0KKwkJY2FzZSBGT1JNX0lOU1RBTkNFX0RBVEFfS0lORDoNCisJCWNhc2UgRk9STV9JTlNUQU5DRV9NQUNISU5FX0tJTkQ6DQorCQljYXNlIEZPUk1fSU5TVEFOQ0VfUE9SVF9LSU5EOg0KKw0KKwkJY2FzZSBGT1JNX0JVSUxUSU5fQk9PTEVBTl9LSU5EOg0KKwkJY2FzZSBGT1JNX0JVSUxUSU5fQ0hBUkFDVEVSX0tJTkQ6DQorCQljYXNlIEZPUk1fQlVJTFRJTl9JTlRFR0VSX0tJTkQ6DQorCQljYXNlIEZPUk1fQlVJTFRJTl9SQVRJT05BTF9LSU5EOg0KKwkJY2FzZSBGT1JNX0JVSUxUSU5fRkxPQVRfS0lORDoNCisJCWNhc2UgRk9STV9CVUlMVElOX1NUUklOR19LSU5EOg0KKwkJew0KKwkJCXJldHVybiggYUNvZGUgKTsNCisJCX0NCisNCisJCWNhc2UgRk9STV9BUlJBWV9CT09MRUFOX0tJTkQ6DQorCQljYXNlIEZPUk1fQVJSQVlfQ0hBUkFDVEVSX0tJTkQ6DQorCQljYXNlIEZPUk1fQVJSQVlfSU5URUdFUl9LSU5EOg0KKwkJY2FzZSBGT1JNX0FSUkFZX1JBVElPTkFMX0tJTkQ6DQorCQljYXNlIEZPUk1fQVJSQVlfRkxPQVRfS0lORDoNCisJCWNhc2UgRk9STV9BUlJBWV9TVFJJTkdfS0lORDoNCisJCXsNCisJCQlyZXR1cm4oIGFDb2RlICk7DQorCQl9DQorDQorCQljYXNlIEZPUk1fQVJSQVlfSURFTlRJRklFUl9LSU5EOg0KKwkJew0KKwkJCUFycmF5SWRlbnRpZmllciAqIGlkQXJyYXkgPSBhQ29kZS50b19wdHI8IEFycmF5SWRlbnRpZmllciA+KCk7DQorCQkJQkZWZWN0b3IgYXJyYXk7DQorDQorCQkJZm9yKCBhdm1fc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBpZEFycmF5LT5zaXplKCkgOyArK2luZGV4ICkNCisJCQl7DQorCQkJCWFycmF5LmFwcGVuZCggY29tcGlsZUlkZW50aWZpZXIoYUNUWCwgaWRBcnJheS0+Z2V0KGluZGV4KSkgKTsNCisJCQl9DQorDQorCQkJcmV0dXJuKCBCdWlsdGluQXJyYXk6OmNyZWF0ZShhcnJheSkgKTsNCisJCX0NCisNCisJCWNhc2UgRk9STV9BUlJBWV9RVUFMSUZJRURfSURFTlRJRklFUl9LSU5EOg0KKwkJew0KKwkJCUFycmF5UXVhbGlmaWVkSWRlbnRpZmllciAqIHVmaUFycmF5ID0NCisJCQkJCWFDb2RlLnRvX3B0cjwgQXJyYXlRdWFsaWZpZWRJZGVudGlmaWVyID4oKTsNCisJCQlCRlZlY3RvciBhcnJheTsNCisNCisJCQlmb3IoIGF2bV9zaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHVmaUFycmF5LT5zaXplKCkgOyArK2luZGV4ICkNCisJCQl7DQorCQkJCWFycmF5LmFwcGVuZCggY29tcGlsZUZ1bGx5UXVhbGlmaWVkTmFtZUlEKA0KKwkJCQkJCWFDVFgsIHVmaUFycmF5LT5nZXQoaW5kZXgpKSApOw0KKwkJCX0NCisNCisJCQlyZXR1cm4oIEJ1aWx0aW5BcnJheTo6Y3JlYXRlKGFycmF5KSApOw0KKwkJfQ0KKw0KKwkJY2FzZSBGT1JNX0FSUkFZX0JGX0tJTkQ6DQorCQl7DQorCQkJQXJyYXlCRiAqIGJmYXJyYXkgPSBhQ29kZS50b19wdHI8IEFycmF5QkYgPigpOw0KKwkJCUJGVmVjdG9yIGFycmF5Ow0KKw0KKwkJCWZvciggYXZtX3NpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgYmZhcnJheS0+c2l6ZSgpIDsgKytpbmRleCApDQorCQkJew0KKwkJCQlhcnJheS5hcHBlbmQoIGRlY29kZV9jb21waWxlRXhwcmVzc2lvbigNCisJCQkJCQlhQ1RYLCBiZmFycmF5LT5hdChpbmRleCkgKSApOw0KKwkJCX0NCisNCisJCQlyZXR1cm4oIEJ1aWx0aW5BcnJheTo6Y3JlYXRlKGFycmF5KSApOw0KKwkJfQ0KKw0KKwkJZGVmYXVsdDoNCisJCXsgLy8gVE9ETw0KKwkJCUFWTV9PU19XQVJOSU5HX0FMRVJUDQorCQkJCQk8PCAiQXZtY29kZUNvbXBpbGVyIGlzIHRyeWluZyB0byBkZWNvZGVfY29tcGlsZVN0YXRlbWVudCINCisJCQkJCSJcblx0PDwgIiA8PCBhQ29kZS5zdHIoKSA8PCAiID4+ICEhISINCisJCQkJCTw8IFNFTkRfQUxFUlQ7DQorDQorCQkJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsNCisJCX0NCisJfQ0KKw0KKwlyZXR1cm4oIGFDb2RlICk7DQorfQ0KKw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLy8vIHRoZSBPUFRJTUlaRVIgb2YgPDwgUlVOVElNRSA+PiBFWFBSRVNTSU9ODQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKw0KK2Jvb2wgQXZtY29kZUNvbXBpbGVyOjpvcHRpbWl6ZUV2YWxFeHByZXNzaW9uKA0KKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgQkZDb2RlICYgYUNvZGUpDQorew0KKwlpZiggYUNvZGUtPmhhc0luc3RydWN0aW9uKCkgKQ0KKwl7DQorCQlyZXR1cm4oIHRydWUgKTsNCisJfQ0KKw0KK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgQ09NUElMSU5HICkNCisJQVZNX09TX1RSQUNFIDw8IElOQ1JfSU5ERU5UX1RBQiA8PCAiaW48ZXhwcj46ICINCisJCQk8PCBTVFJJTUwoIGFDb2RlLT50b1N0cmluZyhBVk1fT1NfVFJBQ0UuSU5ERU5UKSApDQorCQkJPDwgc3RkOjpmbHVzaDsNCitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIENPTVBJTElORyApDQorDQorCUJGIGV4cHIgPSBBVk1DT0RFX0NPTVBJTEVSX1RBQkxFWyBhQ29kZS0+Z2V0T3BPZmZzZXQoKSBdLT4NCisJCQlvcHRpbWl6ZUV4cHJlc3Npb24oYUNUWCwgYUNvZGUpOw0KKw0KK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgQ09NUElMSU5HICkNCisJQVZNX09TX1RSQUNFIDw8IFRBQl9ERUNSX0lOREVOVCA8PCAib3V0Oj4gIg0KKwkJCTw8IFNUUklNTCggZXhwci50b1N0cmluZyhBVk1fT1NfVFJBQ0UuSU5ERU5UKSApDQorCQkJPDwgc3RkOjpmbHVzaDsNCitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIENPTVBJTElORyApDQorDQorCWlmKCBleHByLmlzPCBBdm1Db2RlID4oKSApDQorCXsNCisJCWFDb2RlID0gZXhwci5iZkNvZGUoKTsNCisNCisJCXJldHVybiggdHJ1ZSApOw0KKw0KKwl9DQorDQorCXJldHVybiggZmFsc2UgKTsNCit9DQorDQorDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vLy8gdGhlIE9QVElNSVpFUiBvZiBTVEFURU1FTlQNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorQkZDb2RlIEF2bWNvZGVDb21waWxlcjo6b3B0aW1pemVTdGF0ZW1lbnQoDQorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkNCit7DQorCWlmKCBhQ29kZS0+aGFzSW5zdHJ1Y3Rpb24oKSApDQorCXsNCisJCXJldHVybiggYUNvZGUgKTsNCisJfQ0KKw0KK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBDT01QSUxJTkcgKQ0KKwlBVk1fT1NfVFJBQ0UgPDwgSU5DUl9JTkRFTlRfVEFCIDw8ICJpbjxzdG1udD46ICINCisJCQk8PCBTVFJJTUwoIGFDb2RlLT50b1N0cmluZyhBVk1fT1NfVFJBQ0UuSU5ERU5UKSApDQorCQkJPDwgc3RkOjpmbHVzaDsNCisNCisvLwlBVk1fT1NfVFJBQ0UgPDwgImFDb2RlLT5nZXRPcGVyYXRvcigpICAgOj4gIiA8PCBhQ29kZS0+Z2V0T3BlcmF0b3IoKS0+c3RyT3AoKQ0KKy8vCQkJPDwgc3RkOjplbmRsDQorLy8JCQk8PCAiYUNvZGUtPmdldE9wT2Zmc2V0KCkgICA6PiAiIDw8IGFDb2RlLT5nZXRPcE9mZnNldCgpDQorLy8JCQk8PCBzdGQ6OmVuZGwNCisvLwkJCTw8ICJBVk1DT0RFX0NPTVBJTEVSX1RBQkxFIDo+IEAiIDw8ICZBVk1DT0RFX0NPTVBJTEVSX1RBQkxFDQorLy8JCQk8PCBzdGQ6OmVuZGw7DQorQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIENPTVBJTElORyApDQorDQorDQorCUJGQ29kZSBzdG1udCA9IEFWTUNPREVfQ09NUElMRVJfVEFCTEVbIGFDb2RlLT5nZXRPcE9mZnNldCgpIF0tPg0KKwkJCW9wdGltaXplU3RhdGVtZW50KGFDVFgsIGFDb2RlKTsNCisNCisNCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgQ09NUElMSU5HICkNCisJQVZNX09TX1RSQUNFIDw8IFRBQl9ERUNSX0lOREVOVCA8PCAib3V0Oj4gIg0KKwkJCTw8IFNUUklNTCggc3RtbnQtPnRvU3RyaW5nKEFWTV9PU19UUkFDRS5JTkRFTlQpICkNCisJCQk8PCBzdGQ6OmZsdXNoOw0KK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBDT01QSUxJTkcgKQ0KKw0KKwlyZXR1cm4oIHN0bW50ICk7DQorfQ0KKw0KKw0KK0JGIEF2bWNvZGVDb21waWxlcjo6ZGVjb2RlX29wdGltaXplU3RhdGVtZW50KA0KKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkYgJiBhQ29kZSkNCit7DQorCXN3aXRjaCggYUNvZGUuY2xhc3NLaW5kKCkgKQ0KKwl7DQorCQljYXNlIEZPUk1fQVZNQ09ERV9LSU5EOg0KKwkJew0KKwkJCXJldHVybiggb3B0aW1pemVTdGF0ZW1lbnQoYUNUWCwgYUNvZGUuYmZDb2RlKCkpICk7DQorCQl9DQorDQorCQljYXNlIEZPUk1fQVZNUFJPR1JBTV9LSU5EOg0KKwkJY2FzZSBGT1JNX0FWTVRSQU5TSVRJT05fS0lORDoNCisJCXsNCisJCQlvcHRpbWl6ZVByb2dyYW1Sb3V0aW5lKCBhQ29kZS50b19wdHI8IEF2bVByb2dyYW0gPigpICk7DQorDQorCQkJcmV0dXJuKCBhQ29kZSApOw0KKwkJfQ0KKw0KKwkJZGVmYXVsdDoNCisJCXsNCisJCQlCRiBvcHRDb2RlID0gYUNvZGU7DQorDQorCQkJcmV0dXJuKCBvcHRDb2RlICk7DQorCQl9DQorCX0NCit9DQorDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vLy8gdGhlIENPTVBJTEVSIG9mIFJPVVRJTkUNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorDQorQXZtUHJvZ3JhbSAqIEF2bWNvZGVDb21waWxlcjo6Y29tcGlsZVJvdXRpbmVTdHJ1Y3R1cmUoDQorCQlCYXNlQ29tcGlsZXIgKiBhQ29tcGlsZXIsIEF2bVByb2dyYW0gKiBhUHJvZ3JhbUN0eCwgUm91dGluZSAqIGFSb3V0aW5lKQ0KK3sNCisJYXZtX3NpemVfdCBwYXJhbUNvdW50ID0gYVJvdXRpbmUtPmdldFBhcmFtZXRlcnMoKS5zaXplKCk7DQorCWF2bV9zaXplX3QgcmV0dXJuQ291bnQgPSBhUm91dGluZS0+Z2V0UmV0dXJucygpLnNpemUoKTsNCisJYXZtX3NpemVfdCBwYXJhbVJldHVybkNvdW50ID0gcGFyYW1Db3VudCArIHJldHVybkNvdW50Ow0KKw0KKwlBdm1Qcm9ncmFtICogYUNvbXBpbGVkUm91dGluZSA9IG5ldyBBdm1Qcm9ncmFtKA0KKwkJCVNwZWNpZmllcjo6U0NPUEVfUk9VVElORV9LSU5ELA0KKwkJCWFQcm9ncmFtQ3R4LCBhUm91dGluZSwgcGFyYW1SZXR1cm5Db3VudCApOw0KKw0KKwlhQ29tcGlsZWRSb3V0aW5lLT5zZXRQYXJhbU9mZnNldENvdW50KDAsIHBhcmFtQ291bnQpOw0KKwlhQ29tcGlsZWRSb3V0aW5lLT5zZXRSZXR1cm5PZmZzZXRDb3VudChwYXJhbUNvdW50LCByZXR1cm5Db3VudCk7DQorDQorDQorCUluc3RhbmNlT2ZEYXRhICogYW5JbnN0YW5jZSA9IE5VTEw7DQorCVR5cGVTcGVjaWZpZXIgYmZUUzsNCisNCisJYXZtX3NpemVfdCBvZmZzZXQgPSAwOw0KKw0KKwkvLyBQYXJhbWV0ZXJzDQorCUJGVmVjdG9yOjpyYXdfaXRlcmF0b3I8IFZhcmlhYmxlID4gaXRWYXIgPSBhUm91dGluZS0+Z2V0UGFyYW1ldGVycygpLmJlZ2luKCk7DQorCWZvciggOyBvZmZzZXQgPCBwYXJhbUNvdW50IDsgKytpdFZhciAsICsrb2Zmc2V0ICkNCisJew0KKwkJYmZUUyA9IGFDb21waWxlci0+Y29tcGlsZVR5cGVTcGVjaWZpZXIoYVByb2dyYW1DdHgsIGl0VmFyLT5nZXRUeXBlKCkpOw0KKwkJaWYoIGJmVFMuaW52YWxpZCgpICkNCisJCXsNCisJCQliZlRTID0gVHlwZU1hbmFnZXI6OlVOSVZFUlNBTDsNCisNCisvLwkJCWluY3JFcnJvckNvdW50KCk7DQorCQkJKytBVk1fRVJST1JfQ09VTlQ7DQorDQorCQkJQVZNX09TX0VSUk9SX0FMRVJUIDw8ICJBdm1jb2RlQ29tcGlsZXI6OmNvbXBpbGVSb3V0aW5lIDogPDwgIg0KKwkJCQkJPDwgaXRWYXItPnN0clR5cGVTcGVjaWZpZXIoKSA8PCAiID4+ICEhISINCisJCQkJCTw8IFNFTkRfQUxFUlQ7DQorCQl9DQorDQorCQlhbkluc3RhbmNlID0gbmV3IEluc3RhbmNlT2ZEYXRhKA0KKwkJCQlJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfU1RBTkRBUkRfTkFUVVJFLA0KKwkJCQlhQ29tcGlsZWRSb3V0aW5lLCBpdFZhciwgYmZUUywgb2Zmc2V0KTsNCisNCisJCWFDb21waWxlZFJvdXRpbmUtPnNldERhdGEob2Zmc2V0LCBhbkluc3RhbmNlKTsNCisNCisJCWlmKCBpdFZhci0+aGFzVmFsdWUoKSApDQorCQl7DQorCQkJYW5JbnN0YW5jZS0+c2V0VmFsdWUoDQorCQkJCQlkZWNvZGVfY29tcGlsZUV4cHJlc3Npb24oDQorCQkJCQkJCWFQcm9ncmFtQ3R4LCBpdFZhci0+Z2V0VmFsdWUoKSkgKTsNCisJCX0NCisJfQ0KKw0KKwkvLyBSZXR1cm5zDQorCWl0VmFyID0gYVJvdXRpbmUtPmdldFJldHVybnMoKS5iZWdpbigpOw0KKwlmb3IoIDsgb2Zmc2V0IDwgcGFyYW1SZXR1cm5Db3VudCA7ICsraXRWYXIgLCArK29mZnNldCApDQorCXsNCisJCWJmVFMgPSBhQ29tcGlsZXItPmNvbXBpbGVUeXBlU3BlY2lmaWVyKGFQcm9ncmFtQ3R4LCBpdFZhci0+Z2V0VHlwZSgpKTsNCisJCWlmKCBiZlRTLmludmFsaWQoKSApDQorCQl7DQorCQkJYmZUUyA9IFR5cGVNYW5hZ2VyOjpVTklWRVJTQUw7DQorDQorCS8vCQlpbmNyRXJyb3JDb3VudCgpOw0KKwkJCSsrQVZNX0VSUk9SX0NPVU5UOw0KKw0KKwkJCUFWTV9PU19FUlJPUl9BTEVSVCA8PCAiQXZtY29kZUNvbXBpbGVyOjpjb21waWxlUm91dGluZSA6IDw8ICINCisJCQkJCTw8IGl0VmFyLT5zdHJUeXBlU3BlY2lmaWVyKCkgPDwgIiA+PiAhISEiDQorCQkJCQk8PCBTRU5EX0FMRVJUOw0KKwkJfQ0KKw0KKwkJYW5JbnN0YW5jZSA9IG5ldyBJbnN0YW5jZU9mRGF0YSgNCisJCQkJSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX1NUQU5EQVJEX05BVFVSRSwNCisJCQkJYUNvbXBpbGVkUm91dGluZSwgaXRWYXIsIGJmVFMsIG9mZnNldCk7DQorDQorCQlhQ29tcGlsZWRSb3V0aW5lLT5zZXREYXRhKG9mZnNldCwgYW5JbnN0YW5jZSk7DQorDQorCQlpZiggaXRWYXItPmhhc1ZhbHVlKCkgKQ0KKwkJew0KKwkJCWFuSW5zdGFuY2UtPnNldFZhbHVlKA0KKwkJCQkJZGVjb2RlX2NvbXBpbGVFeHByZXNzaW9uKGFQcm9ncmFtQ3R4LCBpdFZhci0+Z2V0VmFsdWUoKSkgKTsNCisJCX0NCisJfQ0KKw0KKwkvLyBGaW5hbGl6ZSBjb21waWxlZCBkYXRhDQorCWFDb21waWxlZFJvdXRpbmUtPnVwZGF0ZURhdGFUYWJsZSgpOw0KKw0KKwlyZXR1cm4oIGFDb21waWxlZFJvdXRpbmUgKTsNCit9DQorDQorDQorQXZtUHJvZ3JhbSAqIEF2bWNvZGVDb21waWxlcjo6Y29tcGlsZVJvdXRpbmUoQmFzZUNvbXBpbGVyICogYUNvbXBpbGVyLA0KKwkJQXZtUHJvZ3JhbSAqIGFQcm9ncmFtQ3R4LCBSb3V0aW5lICogYVJvdXRpbmUpDQorew0KKwlBdm1Qcm9ncmFtICogYUNvbXBpbGVkUm91dGluZSA9DQorCQkJY29tcGlsZVJvdXRpbmVTdHJ1Y3R1cmUoYUNvbXBpbGVyLCBhUHJvZ3JhbUN0eCwgYVJvdXRpbmUpOw0KKw0KKwkvLyBDb21waWxlIFJvdXRpbmUgLT4gQ29kZQ0KKwlhQ29tcGlsZWRSb3V0aW5lLT5zZXRDb2RlKA0KKwkJCWNvbXBpbGVTdGF0ZW1lbnQoYUNvbXBpbGVkUm91dGluZSwgYVJvdXRpbmUtPmdldENvZGUoKSkgKTsNCisNCisJcmV0dXJuKCBhQ29tcGlsZWRSb3V0aW5lICk7DQorfQ0KKw0KKw0KK0F2bVByb2dyYW0gKiBBdm1jb2RlQ29tcGlsZXI6OmNvbXBpbGVSb3V0aW5lKA0KKwkJQmFzZUNvbXBpbGVyICogYUNvbXBpbGVyLCBBdm1Qcm9ncmFtICogYVByb2dyYW1DdHgsDQorCQlJbnN0YW5jZU9mRGF0YSAqIGFWYXJJbnN0YW5jZUN0eCwgUm91dGluZSAqIGFSb3V0aW5lKQ0KK3sNCisJQXZtUHJvZ3JhbSAqIGFDb21waWxlZFJvdXRpbmUgPQ0KKwkJCWNvbXBpbGVSb3V0aW5lU3RydWN0dXJlKGFDb21waWxlciwgYVByb2dyYW1DdHgsIGFSb3V0aW5lKTsNCisNCisNCisJLy8gQ29tcGlsZSBSb3V0aW5lIC0+IENvZGUNCisJQ29tcGlsYXRpb25FbnZpcm9ubWVudCBjb21waWxFTlYoYUNvbXBpbGVkUm91dGluZSwgYVZhckluc3RhbmNlQ3R4KTsNCisNCisJYUNvbXBpbGVkUm91dGluZS0+c2V0Q29kZSgNCisJCQljb21waWxlU3RhdGVtZW50KGNvbXBpbEVOVi5tQ1RYLCBhUm91dGluZS0+Z2V0Q29kZSgpKSApOw0KKw0KKwlyZXR1cm4oIGFDb21waWxlZFJvdXRpbmUgKTsNCit9DQorDQorDQorQXZtUHJvZ3JhbSAqIEF2bWNvZGVDb21waWxlcjo6Y29tcGlsZVJvdXRpbmUoDQorCQlCYXNlQ29tcGlsZXIgKiBhQ29tcGlsZXIsIEF2bVByb2dyYW0gKiBhUHJvZ3JhbUN0eCwNCisJCWNvbnN0IFR5cGVTcGVjaWZpZXIgJiBhVHlwZVNwZWNpZmllckN0eCwgUm91dGluZSAqIGFSb3V0aW5lKQ0KK3sNCisJQXZtUHJvZ3JhbSAqIGFDb21waWxlZFJvdXRpbmUgPQ0KKwkJCWNvbXBpbGVSb3V0aW5lU3RydWN0dXJlKGFDb21waWxlciwgYVByb2dyYW1DdHgsIGFSb3V0aW5lKTsNCisNCisJLy8gQ29tcGlsZSBSb3V0aW5lIC0+IENvZGUNCisJYUNvbXBpbGVkUm91dGluZS0+c2V0Q29kZSgNCisJCQljb21waWxlU3RhdGVtZW50KGFDb21waWxlZFJvdXRpbmUsIGFSb3V0aW5lLT5nZXRDb2RlKCkpICk7DQorDQorCXJldHVybiggYUNvbXBpbGVkUm91dGluZSApOw0KK30NCisNCisNCisvKioNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIFBPU1QtQ09NUElMQVRJT04gT0YgREFUQSBST1VUSU5FDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKi8NCisNCit2b2lkIEF2bWNvZGVDb21waWxlcjo6b3B0aW1pemVEYXRhUm91dGluZShBdm1Qcm9ncmFtICogYVByb2dyYW0pDQorew0KKy8vQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiPHwgb3B0aW1pemluZzxwcm9ncmFtPjogIg0KKy8vCQk8PCBhUHJvZ3JhbS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCBzdGQ6OmVuZGw7DQorDQorCWlmKCBhUHJvZ3JhbS0+aGFzQ29uc3REYXRhKCkgKQ0KKwl7DQorCQlUYWJsZU9mSW5zdGFuY2VPZkRhdGE6OmNvbnN0X3Jhd19pdGVyYXRvciBpdERhdGEgPQ0KKwkJCQlhUHJvZ3JhbS0+Z2V0Q29uc3REYXRhKCkuYmVnaW4oKTsNCisJCVRhYmxlT2ZJbnN0YW5jZU9mRGF0YTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGVuZERhdGEgPQ0KKwkJCQlhUHJvZ3JhbS0+Z2V0Q29uc3REYXRhKCkuZW5kKCk7DQorCQlmb3IoIDsgaXREYXRhICE9IGVuZERhdGEgOyArK2l0RGF0YSApDQorCQl7DQorCQkJLyoNCisJCQkgKiBpbml0aWFsIG1hY3JvIHZhbHVlDQorCQkJICovDQorCQkJaWYoIChpdERhdGEpLT5nZXRNb2RpZmllcigpLmhhc05hdHVyZU1hY3JvKCkNCisJCQkJJiYgKGl0RGF0YSktPmhhc1ZhbHVlKCkNCisJCQkJJiYgKGl0RGF0YSktPmdldFZhbHVlKCkuaXM8IEF2bUNvZGUgPigpICkNCisJCQl7DQorCQkJCShpdERhdGEpLT5zZXRWYWx1ZSggb3B0aW1pemVFeHByZXNzaW9uKA0KKwkJCQkJCWFQcm9ncmFtLCAoaXREYXRhKS0+Z2V0VmFsdWUoKS5iZkNvZGUoKSkgKTsNCisJCQl9DQorCQl9DQorCX0NCisNCisJaWYoIGFQcm9ncmFtLT5oYXNEYXRhKCkgKQ0KKwl7DQorCQlUYWJsZU9mSW5zdGFuY2VPZkRhdGE6OmNvbnN0X3Jhd19pdGVyYXRvciBpdERhdGEgPQ0KKwkJCQlhUHJvZ3JhbS0+Z2V0QWxsRGF0YSgpLmJlZ2luKCk7DQorCQlUYWJsZU9mSW5zdGFuY2VPZkRhdGE6OmNvbnN0X3Jhd19pdGVyYXRvciBlbmREYXRhID0NCisJCQkJYVByb2dyYW0tPmdldEFsbERhdGEoKS5lbmQoKTsNCisJCWZvciggOyBpdERhdGEgIT0gZW5kRGF0YSA7ICsraXREYXRhICkNCisJCXsNCisJCQkvKg0KKwkJCSAqIGluaXRpYWwgbWFjcm8gdmFsdWUNCisJCQkgKi8NCisJCQlpZiggKGl0RGF0YSktPmdldE1vZGlmaWVyKCkuaGFzTmF0dXJlTWFjcm8oKQ0KKwkJCQkmJiAoaXREYXRhKS0+aGFzVmFsdWUoKQ0KKwkJCQkmJiAoaXREYXRhKS0+Z2V0VmFsdWUoKS5pczwgQXZtQ29kZSA+KCkgKQ0KKwkJCXsNCisJCQkJKGl0RGF0YSktPnNldFZhbHVlKCBvcHRpbWl6ZUV4cHJlc3Npb24oDQorCQkJCQkJYVByb2dyYW0sIChpdERhdGEpLT5nZXRWYWx1ZSgpLmJmQ29kZSgpKSApOw0KKwkJCX0NCisNCisJCQkvKg0KKwkJCSAqIG9uV3JpdGUNCisJCQkgKi8NCisJCQlpZiggKGl0RGF0YSktPmhhc09uV3JpdGVSb3V0aW5lKCkpDQorCQkJew0KKwkJCQlvcHRpbWl6ZVByb2dyYW1Sb3V0aW5lKCAoaXREYXRhKS0+Z2V0T25Xcml0ZVJvdXRpbmUoKSApOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwlpZiggYVByb2dyYW0tPmhhc0RhdGFBbGlhcygpICkNCisJew0KKwkJVGFibGVPZkluc3RhbmNlT2ZEYXRhOjpjb25zdF9yYXdfaXRlcmF0b3IgaXREYXRhID0NCisJCQkJYVByb2dyYW0tPmdldERhdGFBbGlhcygpLmJlZ2luKCk7DQorCQlUYWJsZU9mSW5zdGFuY2VPZkRhdGE6OmNvbnN0X3Jhd19pdGVyYXRvciBlbmREYXRhID0NCisJCQkJYVByb2dyYW0tPmdldERhdGFBbGlhcygpLmVuZCgpOw0KKwkJZm9yKCA7IGl0RGF0YSAhPSBlbmREYXRhIDsgKytpdERhdGEgKQ0KKwkJew0KKwkJCS8qDQorCQkJICogU3ltYm9saWMgQXJyYXkgSW5kZXgNCisJCQkgKi8NCisJCQlpZiggKGl0RGF0YSktPmhhc0FycmF5SW5kZXhQb2ludGVyKCkgKQ0KKwkJCXsNCisJCQkJVGFibGVPZlN5bWJvbDo6aXRlcmF0b3IgaXREUCA9IChpdERhdGEpLT5nZXREYXRhUGF0aCgpLT5iZWdpbigpOw0KKwkJCQlUYWJsZU9mU3ltYm9sOjppdGVyYXRvciBlbmRJdERQID0gKGl0RGF0YSktPmdldERhdGFQYXRoKCktPmVuZCgpOw0KKw0KKwkJCQlmb3IoIDsgaXREUCAhPSBlbmRJdERQIDsgKytpdERQICkNCisJCQkJew0KKwkJCQkJaWYoICgqaXREUCkuaXNGaWVsZEFycmF5SW5kZXhQb2ludGVyKCkgJiYNCisJCQkJCQkJKCppdERQKS5nZXRWYWx1ZSgpLmlzPCBBdm1Db2RlID4oKSApDQorCQkJCQl7DQorCQkJCQkJKCppdERQKS5zZXRWYWx1ZSggb3B0aW1pemVFeHByZXNzaW9uKA0KKwkJCQkJCQkJYVByb2dyYW0sICgqaXREUCkuZ2V0VmFsdWUoKS5iZkNvZGUoKSkgKTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKw0KKy8vQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiPnwgb3B0aW1pemluZzxQcm9ncmFtPjogIg0KKy8vCQk8PCBhUHJvZ3JhbS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOw0KK30NCisNCisNCit2b2lkIEF2bWNvZGVDb21waWxlcjo6b3B0aW1pemVEYXRhUm91dGluZShFeGVjdXRhYmxlRm9ybSAqIHRoZUV4ZWN1dGFibGUpDQorew0KKy8vQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiPHwgb3B0aW1pemluZzxleGVjdXRhYmxlPjogIg0KKy8vCQk8PCB0aGVFeGVjdXRhYmxlLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbDsNCisNCisJb3B0aW1pemVEYXRhUm91dGluZSggc3RhdGljX2Nhc3Q8IEF2bVByb2dyYW0gKiA+KHRoZUV4ZWN1dGFibGUpICk7DQorDQorLy9BVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICI+fCBvcHRpbWl6aW5nPGV4ZWN1dGFibGU+OiAiDQorLy8JCTw8IHRoZUV4ZWN1dGFibGUtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsNCit9DQorDQorDQorDQordm9pZCBBdm1jb2RlQ29tcGlsZXI6Om9wdGltaXplUHJvZ3JhbVJvdXRpbmUoQXZtUHJvZ3JhbSAqIGFQcm9ncmFtKQ0KK3sNCisvL0FWTV9PU19UUkFDRSA8PCBUQUIgPDwgIjx8IG9wdGltaXppbmc8cHJvZ3JhbT46ICINCisvLwkJPDwgYVByb2dyYW0tPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgc3RkOjplbmRsOw0KKw0KKw0KKwkvKg0KKwkgKiBvblJlYWQgLyBvbldyaXRlIHJvdXRpbmUgb2YgZGF0YQ0KKwkgKi8NCisJb3B0aW1pemVEYXRhUm91dGluZSggYVByb2dyYW0gKTsNCisNCisNCisJaWYoIGFQcm9ncmFtLT5oYXNDb2RlKCkgKQ0KKwl7DQorCQlhUHJvZ3JhbS0+c2V0Q29kZSggb3B0aW1pemVTdGF0ZW1lbnQoYVByb2dyYW0sIGFQcm9ncmFtLT5nZXRDb2RlKCkpICk7DQorDQorCQlhUHJvZ3JhbS0+dXBkYXRlT3Bjb2RlRmFtaWx5KCk7DQorCX0NCisNCisNCisJLyoNCisJICogb25TeW5jaHJvbml6ZQ0KKwkgKi8NCisvLwlpZiggYVByb2dyYW0tPmhhc09uU3luY2hyb25pemUoKSApDQorLy8Jew0KKy8vCQlhUHJvZ3JhbS0+c2V0T25TeW5jaHJvbml6ZSgNCisvLwkJCQl0aGVBdm1jb2RlQ29tcGlsZXIub3B0aW1pemVTdGF0ZW1lbnQoDQorLy8JCQkJCQlhUHJvZ3JhbSwgYVByb2dyYW0tPmdldE9uU3luY2hyb25pemUoKSkgKTsNCisvLwl9DQorDQorDQorLy9BVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICI+fCBvcHRpbWl6aW5nPHByb2dyYW0+OiAiDQorLy8JCTw8IGFQcm9ncmFtLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7DQorfQ0KKw0KKw0KKw0KK3ZvaWQgQXZtY29kZUNvbXBpbGVyOjpvcHRpbWl6ZUluc3RhbmNlKA0KKwkJRXhlY3V0YWJsZUZvcm0gKiB0aGVFeGVjdXRhYmxlQ29udGFpbmVyLCBJbnN0YW5jZU9mTWFjaGluZSAqIGFuSW5zdGFuY2UpDQorew0KKwlFeGVjdXRhYmxlRm9ybSAqIGFuRXhlYyA9IGFuSW5zdGFuY2UtPmdldEV4ZWN1dGFibGUoKTsNCisNCisJLyoNCisJICogb25DcmVhdGUNCisJICovDQorCWlmKCBhbkluc3RhbmNlLT5oYXNPbkNyZWF0ZSgpICkNCisJew0KKwkJQ29tcGlsYXRpb25FbnZpcm9ubWVudCBjb21waWxFTlYoTlVMTCwgYW5FeGVjLCB0aGVFeGVjdXRhYmxlQ29udGFpbmVyKTsNCisNCisJCWFuSW5zdGFuY2UtPnNldE9uQ3JlYXRlKCBvcHRpbWl6ZVN0YXRlbWVudCgNCisJCQkJY29tcGlsRU5WLm1DVFgsIGFuSW5zdGFuY2UtPmdldE9uQ3JlYXRlKCkgKSApOw0KKwl9DQorCWVsc2UNCisJew0KKwkJYW5JbnN0YW5jZS0+c2V0T25DcmVhdGUoIGFuRXhlYy0+Z2V0T25DcmVhdGUoKSApOw0KKwl9DQorDQorCS8qDQorCSAqIG9uU3RhcnQNCisJICovDQorCWlmKCBhbkluc3RhbmNlLT5oYXNPblN0YXJ0KCkgKQ0KKwl7DQorCQlDb21waWxhdGlvbkVudmlyb25tZW50IGNvbXBpbEVOVihOVUxMLCBhbkV4ZWMsIHRoZUV4ZWN1dGFibGVDb250YWluZXIpOw0KKw0KKwkJYW5JbnN0YW5jZS0+c2V0T25TdGFydCggb3B0aW1pemVTdGF0ZW1lbnQoDQorCQkJCWNvbXBpbEVOVi5tQ1RYLCBhbkluc3RhbmNlLT5nZXRPblN0YXJ0KCkgKSApOw0KKwl9DQorCWVsc2UgaWYoIGFuRXhlYy0+aGFzT25TdGFydCgpICkNCisJew0KKwkJYW5JbnN0YW5jZS0+c2V0T25TdGFydCggYW5FeGVjLT5nZXRPblN0YXJ0KCkgKTsNCisJfQ0KKwllbHNlIGlmKCBhbkluc3RhbmNlLT5nZXRTcGVjaWZpZXIoKS5oYXNEZXNpZ25JbnN0YW5jZUR5bmFtaWMoKQ0KKwkJfHwgYW5FeGVjLT5nZXRTcGVjaWZpZXIoKS5pc0NvbXBvbmVudFByb2NlZHVyZSgpICkNCisJew0KKwkJaWYoIGFuRXhlYy0+aGFzT25Jbml0KCkgKQ0KKwkJew0KKwkJCWFuSW5zdGFuY2UtPnNldE9uU3RhcnQoIGFuRXhlYy0+Z2V0T25Jbml0KCkgKTsNCisJCX0NCisJCWVsc2UgaWYoIGFuSW5zdGFuY2UtPmdldFNwZWNpZmllcigpLmhhc0Rlc2lnbkluc3RhbmNlRHluYW1pYygpICkNCisJCXsNCisJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVA0KKwkJCQkJPDwgIm9wdGltaXplSW5zdGFuY2U6IFVuZXhwZWN0ZWQgI2R5bmFtaWMgaW5zdGFuY2UgIg0KKwkJCQkJCQkid2l0aG91dCA8PCBvblN0YXJ0IFByaW1pdGl2ZSA+PiAhISEiDQorCQkJCQk8PCBzdGQ6OmVuZGwgPDwgdG9fc3RyZWFtKCBhbkluc3RhbmNlICkNCisJCQkJCTw8IFNFTkRfRVhJVDsNCisJCX0NCisJfQ0KKw0KKwkvLyEhW01JR1JBVElPTl0gb3B0aW1pemVJbnN0YW5jZVBhcmFtZXRlcg0KKwlpZiggYW5JbnN0YW5jZS0+aGFzUGFyYW0oKSApDQorCXsNCisJCUNvbXBpbGF0aW9uRW52aXJvbm1lbnQgY29tcGlsRU5WKE5VTEwsIGFuRXhlYywgdGhlRXhlY3V0YWJsZUNvbnRhaW5lcik7DQorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYOw0KKw0KKwkJSW5zdGFuY2VPZkRhdGEgKiBwYXJhbVZhcjsNCisNCisJCVRhYmxlT2ZEYXRhOjppdGVyYXRvciBpdCA9IGFuSW5zdGFuY2UtPmdldFBhcmFtUmV0dXJuVGFibGUoKS0+YmVnaW4oKTsNCisJCVRhYmxlT2ZEYXRhOjppdGVyYXRvciBlbmRJdCA9IGFuSW5zdGFuY2UtPmdldFBhcmFtUmV0dXJuVGFibGUoKS0+ZW5kKCk7DQorCQlmb3IoIGF2bV9vZmZzZXRfdCBvZmZzZXQgPSAwIDsgaXQgIT0gZW5kSXQgOyArK2l0ICwgKytvZmZzZXQgKQ0KKwkJew0KKwkJCWlmKCAoKml0KS5pczwgQXZtQ29kZSA+KCkgKQ0KKwkJCXsNCisJCQkJcGFyYW1WYXIgPSBhbkV4ZWMtPnJhd1BhcmFtRGF0YShvZmZzZXQpOw0KKw0KKwkJCQlhQ1RYID0gY29tcGlsRU5WLm1DVFgtPmNsb25lKCBwYXJhbVZhci0+Z2V0VHlwZVNwZWNpZmllcigpICk7DQorDQorCQkJCSgqaXQpID0gb3B0aW1pemVFeHByZXNzaW9uKGFDVFgsICgqaXQpLmJmQ29kZSgpKTsNCisNCisvLwkJCQlpZiggcGFyYW1WYXItPmdldE1vZGlmaWVyKCkuaGFzTmF0dXJlUmVmZXJlbmNlKCkNCisvLwkJCQkJJiYgKCppdCkuaXM8IEF2bUNvZGUgPigpICkNCisvLwkJCQl7DQorLy8vLwkJCQlzZXRBcmdjb2RlTFZhbHVlKGFDVFgsDQorLy8vLwkJCQkJKCppdCkudG9fcHRyPCBBdm1Db2RlID4oKS0+Z2V0R2xvYmFsQXJnY29kZSgpLCAoKml0KSk7DQorLy8JCQkJfQ0KKwkJCX0NCisJCQllbHNlIGlmKCAoKml0KS5pczwgSW5zdGFuY2VPZkRhdGEgPigpICkNCisJCQl7DQorCQkJCUluc3RhbmNlT2ZEYXRhICogYW5JbnN0YW5jZSA9ICgqaXQpLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpOw0KKwkJCQlpZiggYW5JbnN0YW5jZS0+Z2V0TW9kaWZpZXIoKS5oYXNNb2RpZmllclB1YmxpY0ZpbmFsU3RhdGljKCkNCisJCQkJCSYmIGFuSW5zdGFuY2UtPmlzVHlwZWRFbnVtKCkgJiYgYW5JbnN0YW5jZS0+aGFzVmFsdWUoKSApDQorCQkJCXsNCisJCQkJCSgqaXQpID0gYW5JbnN0YW5jZS0+Z2V0VmFsdWUoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJfQ0KK30NCisNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8vLyByZXBsYWNlIFVGSSBieSBJTlNUQU5DRQ0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisNCisNCitCRiBBdm1jb2RlQ29tcGlsZXI6OnN1YnN0aXR1dGVVZmlCeUluc3RhbmNlKEV4ZWN1dGFibGVGb3JtICogdGhlRXhlY3V0YWJsZSwNCisJCWNvbnN0IEJGICYgYW5FbGVtZW50LCBMaXN0T2ZTeW1ib2wgJiB1c2luZ0luc3RhbmNlKQ0KK3sNCisJaWYoIGFuRWxlbWVudC5pbnZhbGlkKCkgKQ0KKwl7DQorCQlyZXR1cm4oIGFuRWxlbWVudCApOw0KKwl9DQorCWVsc2UgaWYoIGFuRWxlbWVudC5pczwgTWFjaGluZSA+KCkgKQ0KKwl7DQorCQlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBpdE1hY2hpbmUgPQ0KKwkJCQl0aGVFeGVjdXRhYmxlLT5pbnN0YW5jZV9zdGF0aWNfYmVnaW4oKTsNCisJCVRhYmxlT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGVuZE1hY2hpbmUgPQ0KKwkJCQl0aGVFeGVjdXRhYmxlLT5pbnN0YW5jZV9zdGF0aWNfZW5kKCk7DQorCQlmb3IoICA7IGl0TWFjaGluZSAhPSBlbmRNYWNoaW5lIDsgKytpdE1hY2hpbmUgKQ0KKwkJew0KKwkJCWlmKCBhbkVsZW1lbnQuaXNURVEoICgqaXRNYWNoaW5lKS5nZXRBc3RFbGVtZW50KCkgKSApDQorCQkJew0KKwkJCQl1c2luZ0luc3RhbmNlLmFwcGVuZCggKCppdE1hY2hpbmUpICk7DQorDQorCQkJCXJldHVybiggKCppdE1hY2hpbmUpICk7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJQVZNX09TX0VYSVQoIEZBSUxFRCApDQorCQkJCTw8ICJVbmRlZmluZWQgbWFjaGluZSBpbnN0YW5jZSA8ICINCisJCQkJPDwgYW5FbGVtZW50LnRvX3B0cjwgTWFjaGluZSA+KCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkNCisJCQkJPDwgIiA+IGluIGV4ZWN1dGFibGUgbWFjaGluZSA8ICINCisJCQkJPDwgdGhlRXhlY3V0YWJsZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiID4gISEhIg0KKwkJCQk8PCBTRU5EX0VYSVQ7DQorDQorCQlyZXR1cm4oIGFuRWxlbWVudCApOw0KKwl9DQorCWVsc2UgaWYoIGFuRWxlbWVudC5pczwgVW5pRm9ybUlkZW50aWZpZXIgPigpICkNCisJew0KKwkJc3RkOjpzdHJpbmcgc3RyVUZJID0gYW5FbGVtZW50LnN0cigpOw0KKw0KKwkJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgaXRNYWNoaW5lID0NCisJCQkJdGhlRXhlY3V0YWJsZS0+aW5zdGFuY2Vfc3RhdGljX2JlZ2luKCk7DQorCQlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBlbmRNYWNoaW5lID0NCisJCQkJdGhlRXhlY3V0YWJsZS0+aW5zdGFuY2Vfc3RhdGljX2VuZCgpOw0KKwkJZm9yKCAgOyBpdE1hY2hpbmUgIT0gZW5kTWFjaGluZSA7ICsraXRNYWNoaW5lICkNCisJCXsNCisJCQlpZiggKCppdE1hY2hpbmUpLmdldEFzdEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkuZmluZChzdHJVRkksDQorCQkJCQkoKml0TWFjaGluZSkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKS5zaXplKCkNCisJCQkJCQktIHN0clVGSS5zaXplKCkpICE9IHN0ZDo6c3RyaW5nOjpucG9zICkNCisJCQl7DQorCQkJCXVzaW5nSW5zdGFuY2UuYXBwZW5kKCAoKml0TWFjaGluZSkgKTsNCisNCisJCQkJcmV0dXJuKCAoKml0TWFjaGluZSkgKTsNCisJCQl9DQorCQl9DQorDQorCQlBVk1fT1NfRVhJVCggRkFJTEVEICkNCisJCTw8ICJVbmRlZmluZWQgbWFjaGluZSBpbnN0YW5jZSA8ICINCisJCQkJPDwgc3RyVUZJIDw8ICIgPiBpbiBleGVjdXRhYmxlIG1hY2hpbmUgPCAiDQorCQkJCTw8IHRoZUV4ZWN1dGFibGUtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIiA+ICEhISINCisJCQkJPDwgU0VORF9FWElUOw0KKw0KKwkJcmV0dXJuKCBhbkVsZW1lbnQgKTsNCisJfQ0KKwllbHNlIGlmKCBhbkVsZW1lbnQuaXM8IEF2bUNvZGUgPigpICkNCisJew0KKwkJQkZDb2RlIGFDb2RlID0gYW5FbGVtZW50LmJmQ29kZSgpOw0KKwkJQkZDb2RlIGFOZXdDb2RlKGFDb2RlLT5nZXRPcGVyYXRvcigpKTsNCisNCisJCUF2bUNvZGU6Oml0ZXJhdG9yIGl0ID0gYUNvZGUtPmJlZ2luKCk7DQorCQlmb3IoIDsgaXQgIT0gYUNvZGUtPmVuZCgpIDsgKytpdCApDQorCQl7DQorCQkJYU5ld0NvZGUtPmFwcGVuZCggc3Vic3RpdHV0ZVVmaUJ5SW5zdGFuY2UoDQorCQkJCQl0aGVFeGVjdXRhYmxlLCAqaXQsIHVzaW5nSW5zdGFuY2UpICk7DQorCQl9DQorDQorCQlyZXR1cm4oIGFOZXdDb2RlICk7DQorCX0NCisJZWxzZQ0KKwl7DQorCQlyZXR1cm4oIGFuRWxlbWVudCApOw0KKwl9DQorfQ0KKw0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlQ29tcGlsZXIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVDb21waWxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZWI1NzAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlQ29tcGlsZXIuaApAQCAtMCwwICsxLDQxNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDcgYXZyLiAyMDExCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQVZNQ09ERUNPTVBJTEVSX0hfCisjZGVmaW5lIEFWTUNPREVDT01QSUxFUl9IXworCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Y29tbW9uL0F2bU9iamVjdC5oPgorI2luY2x1ZGUgPGNvbW1vbi9CRi5oPgorCisjaW5jbHVkZSA8YnVpbGRlci9wcmltaXRpdmUvQ29tcGlsYXRpb25FbnZpcm9ubWVudC5oPgorCisjaW5jbHVkZSA8Y29sbGVjdGlvbi9UeXBlZGVmLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9Bdm1Db2RlLmg+CisKKyNpbmNsdWRlIDxmbWwvc3ltYm9sL1N5bWJvbC5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjbGFzcyBBYnN0cmFjdEF2bWNvZGVDb21waWxlcjsKK2NsYXNzIEF2bWNvZGVVZmlFeHByZXNzaW9uQ29tcGlsZXI7CisKK2NsYXNzIEJhc2VDb21waWxlcjsKK2NsYXNzIEJhc2VDb21waWxlclRhYmxlOworCitjbGFzcyBBcnJheUJGOworY2xhc3MgQXJyYXlJZGVudGlmaWVyOworY2xhc3MgQXJyYXlRdWFsaWZpZWRJZGVudGlmaWVyOworCitjbGFzcyBBdm1Db2RlOworY2xhc3MgQXZtUHJvZ3JhbTsKKworY2xhc3MgQ29uZmlndXJhdGlvbjsKKworY2xhc3MgRWxlbWVudDsKK2NsYXNzIEV4ZWN1dGFibGVGb3JtOworY2xhc3MgRXhlY3V0YWJsZVN5c3RlbTsKKworY2xhc3MgUm91dGluZTsKK2NsYXNzIFN5bWJvbFRhYmxlOworY2xhc3MgVHlwZVNwZWNpZmllcjsKKworY2xhc3MgVW5pRm9ybUlkZW50aWZpZXI7CisKKworY2xhc3MgQXZtY29kZUNvbXBpbGVyICA6ICBwdWJsaWMgQXZtT2JqZWN0Cit7CisKK3B1YmxpYzoKKwkvKioKKwkgKiBBVFRSSUJVVEUKKwkgKi8KKwlDb25maWd1cmF0aW9uICYgbUNvbmZpZ3VyYXRpb247CisKKwlCYXNlQ29tcGlsZXJUYWJsZSAmIG1Db21waWxlclRhYmxlOworCisKKwlBdm1jb2RlVWZpRXhwcmVzc2lvbkNvbXBpbGVyICogVUZJX0VYUFJFU1NJT05fQ09NUElMRVI7CisKKwlzdGQ6OnZlY3RvcjwgQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXIgKiA+ICBBVk1DT0RFX0NPTVBJTEVSX1RBQkxFOworCXN0ZDo6dmVjdG9yPCBBYnN0cmFjdEF2bWNvZGVDb21waWxlciAqID4gIEFWTUNPREVfQ09NUElMRVJfVEFCTEVfRk9SX0RFU1RST1k7CisKKwlBYnN0cmFjdEF2bWNvZGVDb21waWxlciAqIERFRkFVTFRfQVZNQ09ERV9DT01QSUxFUjsKKwlBYnN0cmFjdEF2bWNvZGVDb21waWxlciAqIE5PVEhJTkdfQVZNQ09ERV9DT01QSUxFUjsKKworCUFic3RyYWN0QXZtY29kZUNvbXBpbGVyICogVU5BUllfQVJJVEhNRVRJQ19FWFBSRVNTSU9OX0NPTVBJTEVSOworCUFic3RyYWN0QXZtY29kZUNvbXBpbGVyICogQklOQVJZX0FSSVRITUVUSUNfRVhQUkVTU0lPTl9DT01QSUxFUjsKKwlBYnN0cmFjdEF2bWNvZGVDb21waWxlciAqIEFTU09DSUFUSVZFX0FSSVRITUVUSUNfRVhQUkVTU0lPTl9DT01QSUxFUjsKKworCUFic3RyYWN0QXZtY29kZUNvbXBpbGVyICogVU5BUllfQklUV0lTRV9FWFBSRVNTSU9OX0NPTVBJTEVSOworCUFic3RyYWN0QXZtY29kZUNvbXBpbGVyICogQklOQVJZX0JJVFdJU0VfRVhQUkVTU0lPTl9DT01QSUxFUjsKKwlBYnN0cmFjdEF2bWNvZGVDb21waWxlciAqIEFTU09DSUFUSVZFX0JJVFdJU0VfRVhQUkVTU0lPTl9DT01QSUxFUjsKKworCUFic3RyYWN0QXZtY29kZUNvbXBpbGVyICogVU5BUllfUFJFRElDQVRFX0VYUFJFU1NJT05fQ09NUElMRVI7CisJQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXIgKiBCSU5BUllfUFJFRElDQVRFX0VYUFJFU1NJT05fQ09NUElMRVI7CisJQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXIgKiBBU1NPQ0lBVElWRV9QUkVESUNBVEVfRVhQUkVTU0lPTl9DT01QSUxFUjsKKworCUFic3RyYWN0QXZtY29kZUNvbXBpbGVyICogUkVMQVRJT05BTF9FWFBSRVNTSU9OX0NPTVBJTEVSOworCisJQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXIgKiBVTkFSWV9TVFJJTkdfRVhQUkVTU0lPTl9DT01QSUxFUjsKKwlBYnN0cmFjdEF2bWNvZGVDb21waWxlciAqIEJJTkFSWV9TVFJJTkdfRVhQUkVTU0lPTl9DT01QSUxFUjsKKwlBYnN0cmFjdEF2bWNvZGVDb21waWxlciAqIEFTU09DSUFUSVZFX1NUUklOR19FWFBSRVNTSU9OX0NPTVBJTEVSOworCisJQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXIgKiBMT09LVVBfRVhQUkVTU0lPTl9DT01QSUxFUjsKKwlBYnN0cmFjdEF2bWNvZGVDb21waWxlciAqIE1BQ0hJTkVfU1RBVFVTX0VYUFJFU1NJT05fQ09NUElMRVI7CisJQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXIgKiBNQVRIX0ZVTkNUSU9OX0NPTVBJTEVSOworCUFic3RyYWN0QXZtY29kZUNvbXBpbGVyICogVkFSSUFCTEVfU1RBVFVTX0VYUFJFU1NJT05fQ09NUElMRVI7CisKKwlBYnN0cmFjdEF2bWNvZGVDb21waWxlciAqIEFDVElWSVRZX1NUQVRFTUVOVF9DT01QSUxFUjsKKwlBYnN0cmFjdEF2bWNvZGVDb21waWxlciAqIFNDSEVEVUxJTkdfU1RBVEVNRU5UX0NPTVBJTEVSOworCUFic3RyYWN0QXZtY29kZUNvbXBpbGVyICogU0VRVUVOQ0VfU1RBVEVNRU5UX0NPTVBJTEVSOworCisJQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXIgKiBJVEVfU1RBVEVNRU5UX0NPTVBJTEVSOworCisJQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXIgKiBVTkFSWV9DT05UQUlORVJfU1RBVEVNRU5UOworCUFic3RyYWN0QXZtY29kZUNvbXBpbGVyICogVU5BUllfV1JJVEVfQ09OVEFJTkVSX1NUQVRFTUVOVDsKKworCUFic3RyYWN0QXZtY29kZUNvbXBpbGVyICogQklOQVJZX0NPTlRBSU5FUl9TVEFURU1FTlQ7CisJQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXIgKiBCSU5BUllfV1JJVEVfQ09OVEFJTkVSX1NUQVRFTUVOVDsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQXZtY29kZUNvbXBpbGVyKENvbmZpZ3VyYXRpb24gJiBhQ29uZmlndXJhdGlvbiwKKwkJCUJhc2VDb21waWxlclRhYmxlICYgYUNvbXBpbGVyVGFibGUpCisJOiBBdm1PYmplY3QoICksCisJbUNvbmZpZ3VyYXRpb24oIGFDb25maWd1cmF0aW9uICksCisJbUNvbXBpbGVyVGFibGUoIGFDb21waWxlclRhYmxlICksCisKKwlVRklfRVhQUkVTU0lPTl9DT01QSUxFUiggTlVMTCApLAorCisJQVZNQ09ERV9DT01QSUxFUl9UQUJMRSggKSwKKwlBVk1DT0RFX0NPTVBJTEVSX1RBQkxFX0ZPUl9ERVNUUk9ZKCApLAorCisJREVGQVVMVF9BVk1DT0RFX0NPTVBJTEVSKCBOVUxMICksCisJTk9USElOR19BVk1DT0RFX0NPTVBJTEVSKCBOVUxMICksCisKKwlVTkFSWV9BUklUSE1FVElDX0VYUFJFU1NJT05fQ09NUElMRVIoIE5VTEwgKSwKKwlCSU5BUllfQVJJVEhNRVRJQ19FWFBSRVNTSU9OX0NPTVBJTEVSKCBOVUxMICksCisJQVNTT0NJQVRJVkVfQVJJVEhNRVRJQ19FWFBSRVNTSU9OX0NPTVBJTEVSKCBOVUxMICksCisKKwlVTkFSWV9CSVRXSVNFX0VYUFJFU1NJT05fQ09NUElMRVIoIE5VTEwgKSwKKwlCSU5BUllfQklUV0lTRV9FWFBSRVNTSU9OX0NPTVBJTEVSKCBOVUxMICksCisJQVNTT0NJQVRJVkVfQklUV0lTRV9FWFBSRVNTSU9OX0NPTVBJTEVSKCBOVUxMICksCisKKwlVTkFSWV9QUkVESUNBVEVfRVhQUkVTU0lPTl9DT01QSUxFUiggTlVMTCApLAorCUJJTkFSWV9QUkVESUNBVEVfRVhQUkVTU0lPTl9DT01QSUxFUiggTlVMTCApLAorCUFTU09DSUFUSVZFX1BSRURJQ0FURV9FWFBSRVNTSU9OX0NPTVBJTEVSKCBOVUxMICksCisKKwlSRUxBVElPTkFMX0VYUFJFU1NJT05fQ09NUElMRVIoIE5VTEwgKSwKKworCVVOQVJZX1NUUklOR19FWFBSRVNTSU9OX0NPTVBJTEVSKCBOVUxMICksCisJQklOQVJZX1NUUklOR19FWFBSRVNTSU9OX0NPTVBJTEVSKCBOVUxMICksCisJQVNTT0NJQVRJVkVfU1RSSU5HX0VYUFJFU1NJT05fQ09NUElMRVIoIE5VTEwgKSwKKworCUxPT0tVUF9FWFBSRVNTSU9OX0NPTVBJTEVSKCBOVUxMICksCisJTUFDSElORV9TVEFUVVNfRVhQUkVTU0lPTl9DT01QSUxFUiggTlVMTCApLAorCU1BVEhfRlVOQ1RJT05fQ09NUElMRVIoIE5VTEwgKSwKKwlWQVJJQUJMRV9TVEFUVVNfRVhQUkVTU0lPTl9DT01QSUxFUiggTlVMTCApLAorCisJQUNUSVZJVFlfU1RBVEVNRU5UX0NPTVBJTEVSKCBOVUxMICksCisJU0NIRURVTElOR19TVEFURU1FTlRfQ09NUElMRVIoIE5VTEwgKSwKKwlTRVFVRU5DRV9TVEFURU1FTlRfQ09NUElMRVIoIE5VTEwgKSwKKwlJVEVfU1RBVEVNRU5UX0NPTVBJTEVSKCBOVUxMICksCisKKwlVTkFSWV9DT05UQUlORVJfU1RBVEVNRU5UKCBOVUxMICksCisJVU5BUllfV1JJVEVfQ09OVEFJTkVSX1NUQVRFTUVOVCggTlVMTCApLAorCisJQklOQVJZX0NPTlRBSU5FUl9TVEFURU1FTlQoIE5VTEwgKSwKKwlCSU5BUllfV1JJVEVfQ09OVEFJTkVSX1NUQVRFTUVOVCggTlVMTCApCisJeworCQkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkF2bWNvZGVDb21waWxlcigpOworCisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBtQ29uZmlndXJhdGlvbgorCSAqLworCWlubGluZSBDb25maWd1cmF0aW9uICYgZ2V0Q29uZmlndXJhdGlvbigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Db25maWd1cmF0aW9uICk7CisJfQorCisJLyoKKwkgKiBHRVRURVIKKwkgKiBtQ29tcGlsZXJUYWJsZQorCSAqLworCWlubGluZSBCYXNlQ29tcGlsZXJUYWJsZSAmIGdldENvbXBpbGVyVGFibGUoKQorCXsKKwkJcmV0dXJuKCBtQ29tcGlsZXJUYWJsZSApOworCX0KKworCS8qCisJICogR0VUVEVSCisJICogdGhlU3ltYm9sVGFibGUKKwkgKi8KKwlTeW1ib2xUYWJsZSAmIGdldFN5bWJvbFRhYmxlKCk7CisKKworCS8qKgorCSAqIENPTkZJR1VSRQorCSAqLworCWJvb2wgY29uZmlndXJlKCk7CisKKwlib29sIGNvbmZpZ3VyZU90aGVyKCk7CisKKwlib29sIGNvbmZpZ3VyZU1ldGEoKTsKKworCWJvb2wgY29uZmlndXJlTGFtYmRhUHJpbWl0aXZlKCk7CisKKwlib29sIGNvbmZpZ3VyZUFjdGl2aXR5UHJpbWl0aXZlKCk7CisKKwlib29sIGNvbmZpZ3VyZVN0YXR1c1ByaW1pdGl2ZSgpOworCisJYm9vbCBjb25maWd1cmVTY2hlZHVsaW5nUHJpbWl0aXZlKCk7CisJYm9vbCBjb25maWd1cmVCYXNpY1ByaW1pdGl2ZSgpOworCisJYm9vbCBjb25maWd1cmVBcml0aG1ldGljUHJpbWl0aXZlKCk7CisJYm9vbCBjb25maWd1cmVCaXR3aXNlUHJpbWl0aXZlKCk7CisJYm9vbCBjb25maWd1cmVMb2dpY1ByaW1pdGl2ZSgpOworCisJYm9vbCBjb25maWd1cmVMb29rdXBQcmltaXRpdmUoKTsKKwlib29sIGNvbmZpZ3VyZU1hdGhlbWF0aWNQcmltaXRpdmUoKTsKKworCWJvb2wgY29uZmlndXJlU3RyaW5nQ29sbGVjdGlvblByaW1pdGl2ZSgpOworCisJYm9vbCBjb25maWd1cmVJb2x0UHJpbWl0aXZlKCk7CisKKworCS8qCisJICogQ09NUElMRSAgQVJHVU1FTlQKKwkgKi8KKwljb25zdCBCRiAmIHBvc3RDb21waWxlU3ltYm9sKGNvbnN0IEJGICYgYVN5bWJvbCk7CisKKwlCRiBjb21waWxlVUZJKENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IFVuaUZvcm1JZGVudGlmaWVyICYgYW5VRkkpOworCisKKwlCRiBjb21waWxlRnVsbHlRdWFsaWZpZWROYW1lSUQoQ09NUElMRV9DT05URVhUICogYUNUWCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEKTsKKworCWlubGluZSBCRiBjb21waWxlRnVsbHlRdWFsaWZpZWROYW1lSUQoCisJCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRiAmIGFGUU5fSUQpCisJeworCQlyZXR1cm4oIGNvbXBpbGVGdWxseVF1YWxpZmllZE5hbWVJRChhQ1RYLCBhRlFOX0lELnN0cigpKSApOworCX0KKworCisJQkYgY29tcGlsZVF1YWxpZmllZElkZW50aWZpZXIoCisJCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRiAmIGFRdWFsaWZpZWROYW1lSUQpOworCisJQkYgY29tcGlsZVF1YWxpZmllZFBvc2l0aW9uYWxJZGVudGlmaWVyKAorCQkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkYgJiBhUXVhbGlmaWVkTmFtZUlEKTsKKworCisJQkYgY29tcGlsZUlkZW50aWZpZXIoQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKTsKKworCWlubGluZSBCRiBjb21waWxlSWRlbnRpZmllcihDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRiAmIGFOYW1lSUQpCisJeworCQlyZXR1cm4oIGNvbXBpbGVJZGVudGlmaWVyKGFDVFgsIGFOYW1lSUQuc3RyKCkpICk7CisJfQorCisKKwljb25zdCBCRiAmIGNvbXBpbGVFbGVtZW50KENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGICYgYW5FbGVtZW50KTsKKworCWNvbnN0IEJGICYgY29tcGlsZURhdGFUeXBlKENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGICYgYURhdGFUeXBlKTsKKwljb25zdCBCRiAmIGNvbXBpbGVWYXJpYWJsZShDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRiAmIGFWYXJpYWJsZSk7CisJY29uc3QgQkYgJiBjb21waWxlQnVmZmVyKENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGICYgYUJ1ZmZlcik7CisJY29uc3QgQkYgJiBjb21waWxlUG9ydChDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRiAmIGFQb3J0KTsKKwljb25zdCBCRiAmIGNvbXBpbGVDb25uZWN0b3IoQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkYgJiBhQ29ubmVjdG9yKTsKKworCWNvbnN0IEJGICYgY29tcGlsZU1hY2hpbmUoQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkYgJiBhTWFjaGluZSk7CisJY29uc3QgQkYgJiBjb21waWxlUm91dGluZShDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRiAmIGFSb3V0aW5lKTsKKwljb25zdCBCRiAmIGNvbXBpbGVUcmFuc2l0aW9uKENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGICYgYVRyYW5zaXRpb24pOworCisKKwkvKgorCSAqIERFQ09ERSAmIENPTVBJTEUgIEVYUFJFU1NJT04KKwkgKi8KKwlCRiBkZWNvZGVfY29tcGlsZUV4cHJlc3Npb24oQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkYgJiBhQ29kZSk7CisKKwlCRiBkZWNvZGVfY29tcGlsZUV4cHJlc3Npb24oQXZtUHJvZ3JhbSAqIGFDb21waWxlQ3R4LCBjb25zdCBCRiAmIGFDb2RlKQorCXsKKwkJQ29tcGlsYXRpb25FbnZpcm9ubWVudCBjb21waWxFTlYoYUNvbXBpbGVDdHgpOworCisJCXJldHVybiggZGVjb2RlX2NvbXBpbGVFeHByZXNzaW9uKGNvbXBpbEVOVi5tQ1RYLCBhQ29kZSkgKTsKKwl9CisKKwlCRiBjb21waWxlQXJyYXlPZklkZW50aWZpZXIoQ09NUElMRV9DT05URVhUICogYUNUWCwgQXJyYXlJZGVudGlmaWVyICogaWRBcnJheSk7CisKKwlCRiBjb21waWxlQXJyYXlPZlF1YWxpZmllZElkZW50aWZpZXIoQ09NUElMRV9DT05URVhUICogYUNUWCwKKwkJCUFycmF5UXVhbGlmaWVkSWRlbnRpZmllciAqIHVmaUFycmF5KTsKKworCUJGIGNvbXBpbGVBcnJheU9mQkYoQ09NUElMRV9DT05URVhUICogYUNUWCwgQXJyYXlCRiAqIGJmYXJyYXkpOworCisKKwlCRiBjb21waWxlRXhwcmVzc2lvbihDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSk7CisKKworCUJGIGRlY29kZV9vcHRpbWl6ZUV4cHJlc3Npb24oQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkYgJiBhQ29kZSk7CisKKworCUJGIG9wdGltaXplRXhwcmVzc2lvbihDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSk7CisKKwlCRiBvcHRpbWl6ZUV4cHJlc3Npb24oQXZtUHJvZ3JhbSAqIGFDb21waWxlQ3R4LCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKKwl7CisJCUNvbXBpbGF0aW9uRW52aXJvbm1lbnQgY29tcGlsRU5WKGFDb21waWxlQ3R4KTsKKworCQlyZXR1cm4oIG9wdGltaXplRXhwcmVzc2lvbihjb21waWxFTlYubUNUWCwgYUNvZGUpICk7CisJfQorCisKKwlCRiBkZWNvZGVfY29tcGlsZVZhcmlhYmxlTWFjaGluZShDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRiAmIGFDb2RlKTsKKworCUJGIGRlY29kZV9jb21waWxlVmFyaWFibGVQb3J0KENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGICYgYUNvZGUpOworCisJQkYgZGVjb2RlX2NvbXBpbGVWYXJpYWJsZUJ1ZmZlcihDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRiAmIGFDb2RlKTsKKworCisJLyoKKwkgKiBERUNPREUgJiBDT01QSUxFICBFWFBSRVNTSU9OCisJICovCisJYm9vbCBvcHRpbWl6ZUV2YWxFeHByZXNzaW9uKENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIEJGQ29kZSAmIGFDb2RlKTsKKworCWJvb2wgb3B0aW1pemVFdmFsRXhwcmVzc2lvbihBdm1Qcm9ncmFtICogYUNvbXBpbGVDdHgsIEJGQ29kZSAmIGFDb2RlKQorCXsKKwkJQ29tcGlsYXRpb25FbnZpcm9ubWVudCBjb21waWxFTlYoYUNvbXBpbGVDdHgpOworCisJCXJldHVybiggb3B0aW1pemVFdmFsRXhwcmVzc2lvbihjb21waWxFTlYubUNUWCwgYUNvZGUpICk7CisJfQorCisKKwkvKgorCSAqIERFQ09ERSAmIENPTVBJTEUgIFNUQVRFTUVOVAorCSAqLworCUJGIGRlY29kZV9jb21waWxlU3RhdGVtZW50KENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGICYgYUNvZGUpOworCisJQkYgZGVjb2RlX2NvbXBpbGVTdGF0ZW1lbnQoQXZtUHJvZ3JhbSAqIGFDb21waWxlQ3R4LCBjb25zdCBCRiAmIGFDb2RlKQorCXsKKwkJQ29tcGlsYXRpb25FbnZpcm9ubWVudCBjb21waWxFTlYoYUNvbXBpbGVDdHgpOworCisJCXJldHVybiggZGVjb2RlX2NvbXBpbGVTdGF0ZW1lbnQoY29tcGlsRU5WLm1DVFgsIGFDb2RlKSApOworCX0KKworCisJQkZDb2RlIGNvbXBpbGVTdGF0ZW1lbnQoQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpOworCisJQkZDb2RlIGNvbXBpbGVTdGF0ZW1lbnQoQXZtUHJvZ3JhbSAqIGFDb21waWxlQ3R4LCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKKwl7CisJCUNvbXBpbGF0aW9uRW52aXJvbm1lbnQgY29tcGlsRU5WKGFDb21waWxlQ3R4KTsKKworCQlyZXR1cm4oIGNvbXBpbGVTdGF0ZW1lbnQoY29tcGlsRU5WLm1DVFgsIGFDb2RlKSApOworCX0KKworCisJQkYgZGVjb2RlX29wdGltaXplU3RhdGVtZW50KENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGICYgYUNvZGUpOworCisJQkYgZGVjb2RlX29wdGltaXplU3RhdGVtZW50KEF2bVByb2dyYW0gKiBhQ29tcGlsZUN0eCwgY29uc3QgQkYgJiBhQ29kZSkKKwl7CisJCUNvbXBpbGF0aW9uRW52aXJvbm1lbnQgY29tcGlsRU5WKGFDb21waWxlQ3R4KTsKKworCQlyZXR1cm4oIGRlY29kZV9vcHRpbWl6ZVN0YXRlbWVudChjb21waWxFTlYubUNUWCwgYUNvZGUpICk7CisJfQorCisKKwlCRkNvZGUgb3B0aW1pemVTdGF0ZW1lbnQoQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpOworCisJQkZDb2RlIG9wdGltaXplU3RhdGVtZW50KEF2bVByb2dyYW0gKiBhQ29tcGlsZUN0eCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCisJeworCQlDb21waWxhdGlvbkVudmlyb25tZW50IGNvbXBpbEVOVihhQ29tcGlsZUN0eCk7CisKKwkJcmV0dXJuKCBvcHRpbWl6ZVN0YXRlbWVudChjb21waWxFTlYubUNUWCwgYUNvZGUpICk7CisJfQorCisKKwlBdm1Qcm9ncmFtICogY29tcGlsZVJvdXRpbmVTdHJ1Y3R1cmUoQmFzZUNvbXBpbGVyICogYUNvbXBpbGVyLAorCQkJQXZtUHJvZ3JhbSAqIGFQcm9ncmFtQ3R4LCBSb3V0aW5lICogYVJvdXRpbmUpOworCisJQXZtUHJvZ3JhbSAqIGNvbXBpbGVSb3V0aW5lKEJhc2VDb21waWxlciAqIGFDb21waWxlciwKKwkJCUF2bVByb2dyYW0gKiBhUHJvZ3JhbUN0eCwgUm91dGluZSAqIGFSb3V0aW5lKTsKKworCUF2bVByb2dyYW0gKiBjb21waWxlUm91dGluZSgKKwkJCUJhc2VDb21waWxlciAqIGFDb21waWxlciwgQXZtUHJvZ3JhbSAqIGFQcm9ncmFtQ3R4LAorCQkJSW5zdGFuY2VPZkRhdGEgKiBhVmFySW5zdGFuY2VDdHgsIFJvdXRpbmUgKiBhUm91dGluZSk7CisKKwlBdm1Qcm9ncmFtICogY29tcGlsZVJvdXRpbmUoCisJCQlCYXNlQ29tcGlsZXIgKiBhQ29tcGlsZXIsIEF2bVByb2dyYW0gKiBhUHJvZ3JhbUN0eCwKKwkJCWNvbnN0IFR5cGVTcGVjaWZpZXIgJiBhVHlwZVNwZWNpZmllckN0eCwgUm91dGluZSAqIGFSb3V0aW5lKTsKKworCisJQkYgc3Vic3RpdHV0ZVVmaUJ5SW5zdGFuY2UoRXhlY3V0YWJsZUZvcm0gKiB0aGVFeGVjdXRhYmxlLAorCQkJY29uc3QgQkYgJiBhbkVsZW1lbnQsIExpc3RPZlN5bWJvbCAmIHVzaW5nSW5zdGFuY2UpOworCisKKwkvKgorCSAqIE9QVElNSVpFIFBST0dSQU0gZnJvbSBFWEVDVVRBQkxFIG9yIERBVEEKKwkgKi8KKwl2b2lkIG9wdGltaXplUHJvZ3JhbVJvdXRpbmUoQXZtUHJvZ3JhbSAqIGFQcm9ncmFtKTsKKworCXZvaWQgb3B0aW1pemVEYXRhUm91dGluZShBdm1Qcm9ncmFtICogYVByb2dyYW0pOworCisJdm9pZCBvcHRpbWl6ZURhdGFSb3V0aW5lKEV4ZWN1dGFibGVGb3JtICogdGhlRXhlY3V0YWJsZSk7CisKKwl2b2lkIG9wdGltaXplSW5zdGFuY2UoRXhlY3V0YWJsZUZvcm0gKiB0aGVFeGVjdXRhYmxlQ29udGFpbmVyLAorCQkJSW5zdGFuY2VPZk1hY2hpbmUgKiBhTWFjaGluZSk7CisKK307CisKKworfQorCisjZW5kaWYgLyogQVZNQ09ERUNPTVBJTEVSX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlQ29udGFpbmVyQ29tcGlsZXIuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZUNvbnRhaW5lckNvbXBpbGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTI1YThiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZUNvbnRhaW5lckNvbXBpbGVyLmNwcApAQCAtMCwwICsxLDMyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDEyIGF2ci4gMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQXZtY29kZUNvbnRhaW5lckNvbXBpbGVyLmgiCisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9Bdm1Db2RlLmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvblR5cGVDaGVja2VyLmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vU3RhdGVtZW50Q29uc3RydWN0b3IuaD4KKworI2luY2x1ZGUgPGZtbC9vcGVyYXRvci9PcGVyYXRvckxpYi5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQVZNQ09ERSBDT05UQUlORVIgVU5BUlkgU1RBVEVNRU5UIENPTVBJTEFUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitCRiBBdm1jb2RlVW5hcnlDb250YWluZXJTdGF0ZW1lbnRDb21waWxlcjo6Y29tcGlsZUV4cHJlc3Npb24oCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCXJldHVybiggY29tcGlsZVN0YXRlbWVudChhQ1RYLCBhQ29kZSkgKTsKK30KKworQkYgQXZtY29kZVVuYXJ5Q29udGFpbmVyU3RhdGVtZW50Q29tcGlsZXI6Om9wdGltaXplRXhwcmVzc2lvbigKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJQkZDb2RlIG9wdENvZGUgPSBvcHRpbWl6ZVN0YXRlbWVudChhQ1RYLCBhQ29kZSk7CisKKwlhdm1fYXJnX3Byb2Nlc3Nvcl90IGFyZ19jcHUgPSBBVk1fQVJHX0NPTExFQ1RJT05fQ1BVOworCisJaWYoIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNWZWN0b3IoIGFDb2RlLT5maXJzdCgpICkgKQorCXsKKwkJYXJnX2NwdSA9IEFWTV9BUkdfVkVDVE9SX0NQVTsKKwl9CisKKwlvcHRDb2RlLT5nZXRJbnN0cnVjdGlvbigpLT5zZXRNYWluUHJvY2Vzc29yKCBhcmdfY3B1ICk7CisJb3B0Q29kZS0+Z2V0SW5zdHJ1Y3Rpb24oKS0+c2V0TWFpbk9wZXJhbmQoIEFWTV9BUkdfRVhQUkVTU0lPTl9LSU5EICk7CisKKwlyZXR1cm4oIG9wdENvZGUgKTsKK30KKworCitCRkNvZGUgQXZtY29kZVVuYXJ5Q29udGFpbmVyU3RhdGVtZW50Q29tcGlsZXI6OmNvbXBpbGVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCUJGIGNvbnRhaW5lciA9IGNvbXBpbGVBcmdSdmFsdWUoYUNUWCwgVHlwZU1hbmFnZXI6OlVOSVZFUlNBTCwgYUNvZGUtPmZpcnN0KCkpOworCisJcmV0dXJuKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZShhQ29kZS0+Z2V0T3BlcmF0b3IoKSwgY29udGFpbmVyKSApOworfQorCitCRkNvZGUgQXZtY29kZVVuYXJ5Q29udGFpbmVyU3RhdGVtZW50Q29tcGlsZXI6Om9wdGltaXplU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlBdm1JbnN0cnVjdGlvbiAqIGFyZ3NJbnN0cnVjdGlvbiA9IGFDb2RlLT5nZW5JbnN0cnVjdGlvbigpOworCisJb3B0aW1pemVBcmdFeHByZXNzaW9uKGFDVFgsIGFDb2RlLCAwKTsKKwlhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLmR0eXBlID0gVHlwZU1hbmFnZXI6OlVOSVZFUlNBTDsKKwlzZXRBcmdjb2RlQ29udGFpbmVyUlZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMCksIGFDb2RlLT5maXJzdCgpKTsKKworCWFyZ3NJbnN0cnVjdGlvbi0+Y29tcHV0ZU1haW5CeXRlY29kZSgKKwkJCS8qY29udGV4dCAgKi8gQVZNX0FSR19TVEFOREFSRF9DVFgsCisJCQkvKnByb2Nlc3NvciovIEFWTV9BUkdfU1RBVEVNRU5UX0NQVSwKKwkJCS8qb3BlcmF0aW9uKi8gQVZNX0FSR19TRVZBTF9SVkFMVUUsCisJCQkvKm9wZXJhbmQgICovIEFWTV9BUkdfU1RBVEVNRU5UX0tJTkQsCisJCQkvKmR0eXBlICAgICovIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMCkuZHR5cGUpOworCisJcmV0dXJuKCBhQ29kZSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIFdSSVRFIENPTlRBSU5FUiBVTkFSWSBTVEFURU1FTlQgQ09NUElMQVRJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0JGIEF2bWNvZGVVbmFyeVdyaXRlQ29udGFpbmVyU3RhdGVtZW50Q29tcGlsZXI6OmNvbXBpbGVFeHByZXNzaW9uKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlyZXR1cm4oIGNvbXBpbGVTdGF0ZW1lbnQoYUNUWCwgYUNvZGUpICk7Cit9CisKK0JGIEF2bWNvZGVVbmFyeVdyaXRlQ29udGFpbmVyU3RhdGVtZW50Q29tcGlsZXI6Om9wdGltaXplRXhwcmVzc2lvbigKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJQkZDb2RlIG9wdENvZGUgPSBvcHRpbWl6ZVN0YXRlbWVudChhQ1RYLCBhQ29kZSk7CisKKwlhdm1fYXJnX3Byb2Nlc3Nvcl90IGFyZ19jcHUgPSBBVk1fQVJHX0NPTExFQ1RJT05fQ1BVOworCisJaWYoIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNWZWN0b3IoIGFDb2RlLT5maXJzdCgpICkgKQorCXsKKwkJYXJnX2NwdSA9IEFWTV9BUkdfVkVDVE9SX0NQVTsKKwl9CisKKwlvcHRDb2RlLT5nZXRJbnN0cnVjdGlvbigpLT5zZXRNYWluUHJvY2Vzc29yKCBhcmdfY3B1ICk7CisJb3B0Q29kZS0+Z2V0SW5zdHJ1Y3Rpb24oKS0+c2V0TWFpbk9wZXJhbmQoIEFWTV9BUkdfRVhQUkVTU0lPTl9LSU5EICk7CisKKwlyZXR1cm4oIG9wdENvZGUgKTsKK30KKworCitCRkNvZGUgQXZtY29kZVVuYXJ5V3JpdGVDb250YWluZXJTdGF0ZW1lbnRDb21waWxlcjo6Y29tcGlsZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJQkYgY29udGFpbmVyID0gY29tcGlsZUFyZ1J2YWx1ZShhQ1RYLCBUeXBlTWFuYWdlcjo6VU5JVkVSU0FMLCBhQ29kZS0+Zmlyc3QoKSk7CisKKwlyZXR1cm4oIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKGFDb2RlLT5nZXRPcGVyYXRvcigpLCBjb250YWluZXIpICk7Cit9CisKK0JGQ29kZSBBdm1jb2RlVW5hcnlXcml0ZUNvbnRhaW5lclN0YXRlbWVudENvbXBpbGVyOjpvcHRpbWl6ZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJQXZtSW5zdHJ1Y3Rpb24gKiBhcmdzSW5zdHJ1Y3Rpb24gPSBhQ29kZS0+Z2VuSW5zdHJ1Y3Rpb24oKTsKKworCW9wdGltaXplQXJnRXhwcmVzc2lvbihhQ1RYLCBhQ29kZSwgMCk7CisJYXJnc0luc3RydWN0aW9uLT5hdCgwKS5kdHlwZSA9IFR5cGVNYW5hZ2VyOjpVTklWRVJTQUw7CisJc2V0QXJnY29kZUNvbnRhaW5lcldWYWx1ZShhQ1RYLCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLCBhQ29kZS0+Zmlyc3QoKSk7CisKKwlhcmdzSW5zdHJ1Y3Rpb24tPmNvbXB1dGVNYWluQnl0ZWNvZGUoCisJCQkvKmNvbnRleHQgICovIEFWTV9BUkdfU1RBTkRBUkRfQ1RYLAorCQkJLypwcm9jZXNzb3IqLyBBVk1fQVJHX1NUQVRFTUVOVF9DUFUsCisJCQkvKm9wZXJhdGlvbiovIEFWTV9BUkdfU0VWQUxfUlZBTFVFLAorCQkJLypvcGVyYW5kICAqLyBBVk1fQVJHX1NUQVRFTUVOVF9LSU5ELAorCQkJLypkdHlwZSAgICAqLyBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLmR0eXBlKTsKKworCXJldHVybiggYUNvZGUgKTsKK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIENPTlRBSU5FUiBCSU5BUlkgU1RBVEVNRU5UIENPTVBJTEFUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitCRiBBdm1jb2RlQmluYXJ5Q29udGFpbmVyU3RhdGVtZW50Q29tcGlsZXI6OmNvbXBpbGVFeHByZXNzaW9uKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlyZXR1cm4oIGNvbXBpbGVTdGF0ZW1lbnQoYUNUWCwgYUNvZGUpICk7Cit9CisKK0JGIEF2bWNvZGVCaW5hcnlDb250YWluZXJTdGF0ZW1lbnRDb21waWxlcjo6b3B0aW1pemVFeHByZXNzaW9uKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlCRkNvZGUgb3B0Q29kZSA9IG9wdGltaXplU3RhdGVtZW50KGFDVFgsIGFDb2RlKTsKKworCWF2bV9hcmdfcHJvY2Vzc29yX3QgYXJnX2NwdSA9IEFWTV9BUkdfQ09MTEVDVElPTl9DUFU7CisKKwlCRiBvcHRDb250YWluZXIgPSBvcHRDb2RlLT5oYXNPcENvZGUoQVZNX09QQ09ERV9JTiwgQVZNX09QQ09ERV9OT1RJTikgPworCQkJYUNvZGUtPnNlY29uZCgpIDogYUNvZGUtPmZpcnN0KCk7CisKKwlpZiggRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc1ZlY3RvcihvcHRDb250YWluZXIpICkKKwl7CisJCWFyZ19jcHUgPSBBVk1fQVJHX1ZFQ1RPUl9DUFU7CisJfQorCisJb3B0Q29kZS0+Z2V0SW5zdHJ1Y3Rpb24oKS0+c2V0TWFpblByb2Nlc3NvciggYXJnX2NwdSApOworCW9wdENvZGUtPmdldEluc3RydWN0aW9uKCktPnNldE1haW5PcGVyYW5kKCBBVk1fQVJHX0VYUFJFU1NJT05fS0lORCApOworCisJcmV0dXJuKCBvcHRDb2RlICk7Cit9CisKKworQkZDb2RlIEF2bWNvZGVCaW5hcnlDb250YWluZXJTdGF0ZW1lbnRDb21waWxlcjo6Y29tcGlsZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJQkYgY29udGFpbmVyOworCUJGIGVsZW1lbnQ7CisJaWYoIGFDb2RlLT5oYXNPcENvZGUoQVZNX09QQ09ERV9JTiwgQVZNX09QQ09ERV9OT1RJTikgKQorCXsKKwkJY29udGFpbmVyID0gYUNvZGUtPnNlY29uZCgpOworCQllbGVtZW50ICAgPSBhQ29kZS0+Zmlyc3QoKTsKKwl9CisJZWxzZQorCXsKKwkJY29udGFpbmVyID0gYUNvZGUtPmZpcnN0KCk7CisJCWVsZW1lbnQgICA9IGFDb2RlLT5zZWNvbmQoKTsKKwl9CisKKwljb250YWluZXIgPSBjb21waWxlQXJnUnZhbHVlKGFDVFgsIFR5cGVNYW5hZ2VyOjpVTklWRVJTQUwsIGNvbnRhaW5lcik7CisKKwlJbnN0YW5jZU9mRGF0YSAqIGluc3RhbmNlID0gTlVMTDsKKwlpZiggY29udGFpbmVyLmlzPCBJbnN0YW5jZU9mRGF0YSA+KCkgKQorCXsKKwkJaW5zdGFuY2UgPSBjb250YWluZXIudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCk7CisJCWlmKCBpbnN0YW5jZS0+aGFzVHlwZUNvbnRhaW5lcigpICYmCisJCQlhQ29kZS0+aGFzT3BDb2RlKEFWTV9PUENPREVfQ09OVEFJTlMsCisJCQkJCUFWTV9PUENPREVfSU4sIEFWTV9PUENPREVfTk9USU4pICkKKwkJeworCQkJYUNUWCA9IGFDVFgtPmNsb25lKCBpbnN0YW5jZS0+Z2V0VHlwZVNwZWNpZmllcigpLT4KKwkJCQkJdG88IENvbnRhaW5lclR5cGVTcGVjaWZpZXIgPigpLT5nZXRDb250ZW50c1R5cGVTcGVjaWZpZXIoKSApOworCQl9CisJfQorCisJZWxlbWVudCA9IGNvbXBpbGVBcmdSdmFsdWUoYUNUWCwgZWxlbWVudCwgdHJ1ZSk7CisKKworCWlmKCBhQ29kZS0+aGFzT3BDb2RlKEFWTV9PUENPREVfSU4sIEFWTV9PUENPREVfTk9USU4pICkKKwl7CisJCXJldHVybiggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJYUNvZGUtPmdldE9wZXJhdG9yKCksIGVsZW1lbnQsIGNvbnRhaW5lcikgKTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQlhQ29kZS0+Z2V0T3BlcmF0b3IoKSwgY29udGFpbmVyLCBlbGVtZW50KSApOworCX0KK30KKworQkZDb2RlIEF2bWNvZGVCaW5hcnlDb250YWluZXJTdGF0ZW1lbnRDb21waWxlcjo6b3B0aW1pemVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCUF2bUluc3RydWN0aW9uICogYXJnc0luc3RydWN0aW9uID0gYUNvZGUtPmdlbkluc3RydWN0aW9uKCk7CisKKwlhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLmR0eXBlID0gVHlwZU1hbmFnZXI6OlVOSVZFUlNBTDsKKwlzZXRBcmdjb2RlUlZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMCksIGFDb2RlLT5maXJzdCgpLCBmYWxzZSk7CisKKwlhcmdzSW5zdHJ1Y3Rpb24tPmF0KDEpLmR0eXBlID0gVHlwZU1hbmFnZXI6OlVOSVZFUlNBTDsKKwlzZXRBcmdjb2RlUlZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMSksIGFDb2RlLT5zZWNvbmQoKSwgZmFsc2UpOworCisJYXJnc0luc3RydWN0aW9uLT5jb21wdXRlTWFpbkJ5dGVjb2RlKAorCQkJLypjb250ZXh0ICAqLyBBVk1fQVJHX1NUQU5EQVJEX0NUWCwKKwkJCS8qcHJvY2Vzc29yKi8gQVZNX0FSR19TVEFURU1FTlRfQ1BVLAorCQkJLypvcGVyYXRpb24qLyBBVk1fQVJHX1NFVkFMX1JWQUxVRSwKKwkJCS8qb3BlcmFuZCAgKi8gQVZNX0FSR19TVEFURU1FTlRfS0lORCwKKwkJCS8qZHR5cGUgICAgKi8gYXJnc0luc3RydWN0aW9uLT5hdCgwKS5kdHlwZSk7CisKKwlyZXR1cm4oIGFDb2RlICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFWTUNPREUgV1JJVEUgQ09OVEFJTkVSIEJJTkFSWSBTVEFURU1FTlQgQ09NUElMQVRJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0JGIEF2bWNvZGVCaW5hcnlXcml0ZUNvbnRhaW5lclN0YXRlbWVudENvbXBpbGVyOjpjb21waWxlRXhwcmVzc2lvbigKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJcmV0dXJuKCBjb21waWxlU3RhdGVtZW50KGFDVFgsIGFDb2RlKSApOworfQorCitCRiBBdm1jb2RlQmluYXJ5V3JpdGVDb250YWluZXJTdGF0ZW1lbnRDb21waWxlcjo6b3B0aW1pemVFeHByZXNzaW9uKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlCRkNvZGUgb3B0Q29kZSA9IG9wdGltaXplU3RhdGVtZW50KGFDVFgsIGFDb2RlKTsKKworCWF2bV9hcmdfcHJvY2Vzc29yX3QgYXJnX2NwdSA9IEFWTV9BUkdfQ09MTEVDVElPTl9DUFU7CisKKwlCRiBvcHRDb250YWluZXIgPSBvcHRDb2RlLT5oYXNPcENvZGUoQVZNX09QQ09ERV9JTiwgQVZNX09QQ09ERV9OT1RJTikgPworCQkJYUNvZGUtPnNlY29uZCgpIDogYUNvZGUtPmZpcnN0KCk7CisKKwlpZiggRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc1ZlY3RvcihvcHRDb250YWluZXIpICkKKwl7CisJCWFyZ19jcHUgPSBBVk1fQVJHX1ZFQ1RPUl9DUFU7CisJfQorCisJb3B0Q29kZS0+Z2V0SW5zdHJ1Y3Rpb24oKS0+c2V0TWFpblByb2Nlc3NvciggYXJnX2NwdSApOworCW9wdENvZGUtPmdldEluc3RydWN0aW9uKCktPnNldE1haW5PcGVyYW5kKCBBVk1fQVJHX0VYUFJFU1NJT05fS0lORCApOworCisJcmV0dXJuKCBvcHRDb2RlICk7Cit9CisKKworQkZDb2RlIEF2bWNvZGVCaW5hcnlXcml0ZUNvbnRhaW5lclN0YXRlbWVudENvbXBpbGVyOjpjb21waWxlU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlCRiBjb250YWluZXIgPSBjb21waWxlQXJnUnZhbHVlKGFDVFgsIFR5cGVNYW5hZ2VyOjpVTklWRVJTQUwsIGFDb2RlLT5maXJzdCgpKTsKKworCUluc3RhbmNlT2ZEYXRhICogaW5zdGFuY2UgPSBOVUxMOworCWlmKCBjb250YWluZXIuaXM8IEluc3RhbmNlT2ZEYXRhID4oKSApCisJeworCQlpbnN0YW5jZSA9IGNvbnRhaW5lci50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKTsKKwkJaWYoIGluc3RhbmNlLT5oYXNUeXBlQ29udGFpbmVyKCkgKQorCQl7CisJCQlpZiggYUNvZGUtPmhhc09wQ29kZShBVk1fT1BDT0RFX0FQUEVORCwgQVZNX09QQ09ERV9SRU1PVkUpICkKKwkJCXsKKwkJCQlhQ1RYID0gYUNUWC0+Y2xvbmUoIGluc3RhbmNlLT5nZXRUeXBlU3BlY2lmaWVyKCktPgorCQkJCQl0bzwgQ29udGFpbmVyVHlwZVNwZWNpZmllciA+KCktPmdldENvbnRlbnRzVHlwZVNwZWNpZmllcigpICk7CisJCQl9CisJCQllbHNlIGlmKCBhQ29kZS0+aXNPcENvZGUoQVZNX09QQ09ERV9SRVNJWkUpICkKKwkJCXsKKwkJCQlhQ1RYID0gYUNUWC0+Y2xvbmUoIFR5cGVNYW5hZ2VyOjpJTlRFR0VSICk7CisJCQl9CisJCX0KKwl9CisKKwlCRiBlbGVtZW50ID0gY29tcGlsZUFyZ1J2YWx1ZShhQ1RYLCBhQ29kZS0+c2Vjb25kKCksIHRydWUpOworCisJcmV0dXJuKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCWFDb2RlLT5nZXRPcGVyYXRvcigpLCBjb250YWluZXIsIGVsZW1lbnQpICk7Cit9CisKK0JGQ29kZSBBdm1jb2RlQmluYXJ5V3JpdGVDb250YWluZXJTdGF0ZW1lbnRDb21waWxlcjo6b3B0aW1pemVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCUF2bUluc3RydWN0aW9uICogYXJnc0luc3RydWN0aW9uID0gYUNvZGUtPmdlbkluc3RydWN0aW9uKCk7CisKKwlhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLmR0eXBlID0gVHlwZU1hbmFnZXI6OlVOSVZFUlNBTDsKKwlzZXRBcmdjb2RlQ29udGFpbmVyV1ZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMCksIGFDb2RlLT5maXJzdCgpKTsKKworCWFyZ3NJbnN0cnVjdGlvbi0+YXQoMSkuZHR5cGUgPSBUeXBlTWFuYWdlcjo6VU5JVkVSU0FMOworCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdCgxKSwgYUNvZGUtPnNlY29uZCgpLCBmYWxzZSk7CisKKwlhcmdzSW5zdHJ1Y3Rpb24tPmNvbXB1dGVNYWluQnl0ZWNvZGUoCisJCQkvKmNvbnRleHQgICovIEFWTV9BUkdfU1RBTkRBUkRfQ1RYLAorCQkJLypwcm9jZXNzb3IqLyBBVk1fQVJHX1NUQVRFTUVOVF9DUFUsCisJCQkvKm9wZXJhdGlvbiovIEFWTV9BUkdfU0VWQUxfUlZBTFVFLAorCQkJLypvcGVyYW5kICAqLyBBVk1fQVJHX1NUQVRFTUVOVF9LSU5ELAorCQkJLypkdHlwZSAgICAqLyBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLmR0eXBlKTsKKworCXJldHVybiggYUNvZGUgKTsKK30KKworCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVDb250YWluZXJDb21waWxlci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZUNvbnRhaW5lckNvbXBpbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlhMWNlZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVDb250YWluZXJDb21waWxlci5oCkBAIC0wLDAgKzEsMzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxMiBhdnIuIDIwMTEKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBBVk1DT0RFQ09OVEFJTkVSQ09NUElMRVJfSF8KKyNkZWZpbmUgQVZNQ09ERUNPTlRBSU5FUkNPTVBJTEVSX0hfCisKKyNpbmNsdWRlIDxidWlsZGVyL3ByaW1pdGl2ZS9BYnN0cmFjdEF2bWNvZGVDb21waWxlci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitBVk1DT0RFX0NPTVBJTEVSX09QVElNSVpFUl9DTEFTUyhVbmFyeUNvbnRhaW5lclN0YXRlbWVudCwgQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXIpCisKK0FWTUNPREVfQ09NUElMRVJfT1BUSU1JWkVSX0NMQVNTKFVuYXJ5V3JpdGVDb250YWluZXJTdGF0ZW1lbnQsIEFic3RyYWN0QXZtY29kZUNvbXBpbGVyKQorCisKK0FWTUNPREVfQ09NUElMRVJfT1BUSU1JWkVSX0NMQVNTKEJpbmFyeUNvbnRhaW5lclN0YXRlbWVudCwgQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXIpCisKK0FWTUNPREVfQ09NUElMRVJfT1BUSU1JWkVSX0NMQVNTKEJpbmFyeVdyaXRlQ29udGFpbmVyU3RhdGVtZW50LCBBYnN0cmFjdEF2bWNvZGVDb21waWxlcikKKworCit9CisKKyNlbmRpZiAvKiBBVk1DT0RFQ09OVEFJTkVSQ09NUElMRVJfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVDdG9yRXhwcmVzc2lvbkNvbXBpbGVyLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVDdG9yRXhwcmVzc2lvbkNvbXBpbGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGI2ODIxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZUN0b3JFeHByZXNzaW9uQ29tcGlsZXIuY3BwCkBAIC0wLDAgKzEsMTQwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTIgYXZyLiAyMDEzCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJBdm1jb2RlQ3RvckV4cHJlc3Npb25Db21waWxlci5oIgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQnVpbHRpbkFycmF5Lmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkNvbnN0cnVjdG9yLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIENUT1IgRVhQUkVTU0lPTiBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkYgQXZtY29kZUN0b3JFeHByZXNzaW9uQ29tcGlsZXI6OmNvbXBpbGVFeHByZXNzaW9uKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlCRiBjdG9yVHlwZSA9IGNvbXBpbGVBcmdSdmFsdWUoYUNUWCwgYUNvZGUtPmZpcnN0KCkpOworCWlmKCBub3QgY3RvclR5cGUuaXM8IEJhc2VUeXBlU3BlY2lmaWVyID4oKSApCisJeworCQlnZXRDb21waWxlclRhYmxlKCkuaW5jckVycm9yQ291bnQoKTsKKwkJYUNUWC0+ZXJyb3JDb250ZXh0KCBBVk1fT1NfV0FSTiApCisJCQkJPDwgIkF2bWNvZGVDdG9yRXhwcmVzc2lvbkNvbXBpbGVyOjpjb21waWxlRXhwcmVzc2lvbiA6PiAiCisJCQkJCSJVbmV4cGVjdGVkIDw8IiA8PCBzdHJfaW5kZW50KCBjdG9yVHlwZSApCisJCQkJPDwgIiA+PiBhcyBhIHR5cGUgc3BlY2lmaWVyIG9mIGN0b3IgZXhwcmVzc2lvbiA6IgorCQkJCTw8IElHTk9SRV9GSVJTVF9UQUIgPDwgYUNvZGUKKwkJCQk8PCBzdGQ6OmVuZGw7CisKKwkJcmV0dXJuKCBhQ29kZSApOworCX0KKworCUJhc2VUeXBlU3BlY2lmaWVyICogY3RvclR5cGVTcGVjaWZpZXIgPQorCQkJY3RvclR5cGUudG9fcHRyPCBCYXNlVHlwZVNwZWNpZmllciA+KCk7CisKKwlCRiBiZkV4cHIgPSBhQ29kZS0+c2Vjb25kKCk7CisJaWYoIGJmRXhwci5pczwgQnVpbHRpbkFycmF5ID4oKSAmJiBjdG9yVHlwZVNwZWNpZmllci0+aGFzVHlwZUNvbXBvc2l0ZSgpICkKKwl7CisJCWJmRXhwciA9IGNvbXBpbGVBcmdSdmFsdWUoYUNUWC0+Y2xvbmUoY3RvclR5cGVTcGVjaWZpZXIpLCBiZkV4cHIpOworCisJCWlmKCBiZkV4cHIudG9fcHRyPCBCdWlsdGluQXJyYXkgPigpLT4KKwkJCQlnZXRUeXBlU3BlY2lmaWVyKCkgPT0gY3RvclR5cGVTcGVjaWZpZXIgKQorCQl7CisJCQlyZXR1cm4oIGJmRXhwciApOworCQl9CisKKwkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJYUNvZGUtPmdldE9wZXJhdG9yKCksIGN0b3JUeXBlLCBiZkV4cHIpICk7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCWFDb2RlLT5nZXRPcGVyYXRvcigpLCBjdG9yVHlwZSwKKwkJCQljb21waWxlQXJnUnZhbHVlKGFDVFgsIGJmRXhwcikgKSApOworCX0KK30KKworQkYgQXZtY29kZUN0b3JFeHByZXNzaW9uQ29tcGlsZXI6Om9wdGltaXplRXhwcmVzc2lvbigKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJQXZtSW5zdHJ1Y3Rpb24gKiBhcmdzSW5zdHJ1Y3Rpb24gPSBhQ29kZS0+Z2VuSW5zdHJ1Y3Rpb24oKTsKKworCWFyZ3NJbnN0cnVjdGlvbi0+c2V0KDAsCisJCQkvKmNvbnRleHQgICovIEFWTV9BUkdfU1RBTkRBUkRfQ1RYLAorCQkJLypwcm9jZXNzb3IqLyBBVk1fQVJHX05PUF9DUFUsCisJCQkvKm9wZXJhdGlvbiovIEFWTV9BUkdfTk9QX1ZBTFVFLAorCQkJLypvcGVyYW5kICAqLyBBVk1fQVJHX0NUT1JfVFlQRV9LSU5ELAorCQkJLyp0eXBlICAgICAqLyBhQ29kZS0+Zmlyc3QoKS5hc19wdHI8IEJhc2VUeXBlU3BlY2lmaWVyID4oKSApOworCisJb3B0aW1pemVBcmdFeHByZXNzaW9uKGFDVFgsIGFDb2RlLCAxKTsKKwlhcmdzSW5zdHJ1Y3Rpb24tPmF0KDEpLmR0eXBlID0gYUNvZGUtPmZpcnN0KCkudG9fcHRyPCBCYXNlVHlwZVNwZWNpZmllciA+KCk7CisJc2V0QXJnY29kZVJWYWx1ZShhQ1RYLCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDEpLCBhQ29kZS0+c2Vjb25kKCkpOworCisJYXZtX2FyZ19wcm9jZXNzb3JfdCBtYWluUHJvY2Vzc29yID0KKwkJCXByb2Nlc3Nvck9mKCBhcmdzSW5zdHJ1Y3Rpb24tPmR0eXBlKDApICk7CisKKwlzd2l0Y2goIGFyZ3NJbnN0cnVjdGlvbi0+b3BlcmFuZCgxKSApCisJeworCQljYXNlIEFWTV9BUkdfU1RSSU5HX0tJTkQ6CisJCXsKKwkJCW1haW5Qcm9jZXNzb3IgPSBBVk1fQVJHX1NUUklOR19DUFU7CisJCQlicmVhazsKKwkJfQorCQljYXNlIEFWTV9BUkdfQ0hBUkFDVEVSX0tJTkQ6CisJCXsKKwkJCW1haW5Qcm9jZXNzb3IgPSBBVk1fQVJHX0NIQVJBQ1RFUl9DUFU7CisJCQlicmVhazsKKwkJfQorCQljYXNlIEFWTV9BUkdfQk9PTEVBTl9LSU5EOgorCQljYXNlIEFWTV9BUkdfSU5URUdFUl9LSU5EOgorCQljYXNlIEFWTV9BUkdfUkFUSU9OQUxfS0lORDoKKwkJY2FzZSBBVk1fQVJHX0ZMT0FUX0tJTkQ6CisJCXsKKwkJCW1haW5Qcm9jZXNzb3IgPSBBVk1fQVJHX0FSSVRITUVUSUNfTE9HSUNfQ1BVOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEFWTV9BUkdfQVJSQVlfS0lORDoKKwkJeworCQkJbWFpblByb2Nlc3NvciA9IEFWTV9BUkdfQ09MTEVDVElPTl9DUFU7CisJCQlicmVhazsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCWlmKCBhcmdzSW5zdHJ1Y3Rpb24tPmR0eXBlKDEpICE9IFR5cGVNYW5hZ2VyOjpVTklWRVJTQUwgKQorCQkJeworCQkJCW1haW5Qcm9jZXNzb3IgPSBwcm9jZXNzb3JPZiggYXJnc0luc3RydWN0aW9uLT5kdHlwZSgxKSApOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlhcmdzSW5zdHJ1Y3Rpb24tPnNldE1haW5CeXRlY29kZSgKKwkJCS8qY29udGV4dCAgKi8gQVZNX0FSR19SRVRVUk5fQ1RYLAorCQkJLypwcm9jZXNzb3IqLyBtYWluUHJvY2Vzc29yLAorCQkJLypvcGVyYXRpb24qLyBBVk1fQVJHX1NFVkFMX1JWQUxVRSwKKwkJCS8qb3BlcmFuZCAgKi8gb3BlcmFuZE9mKCBhcmdzSW5zdHJ1Y3Rpb24tPmR0eXBlKDApICksCisJCQkvKmR0eXBlICAgICovIGFyZ3NJbnN0cnVjdGlvbi0+ZHR5cGUoMCkpOworCisJcmV0dXJuKCBhQ29kZSApOworfQorCisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlQ3RvckV4cHJlc3Npb25Db21waWxlci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZUN0b3JFeHByZXNzaW9uQ29tcGlsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGJkNjYyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZUN0b3JFeHByZXNzaW9uQ29tcGlsZXIuaApAQCAtMCwwICsxLDMxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTIgYXZyLiAyMDEzCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQVZNQ09ERUNUT1JFWFBSRVNTSU9OQ09NUElMRVJfSF8KKyNkZWZpbmUgQVZNQ09ERUNUT1JFWFBSRVNTSU9OQ09NUElMRVJfSF8KKworI2luY2x1ZGUgPGJ1aWxkZXIvcHJpbWl0aXZlL0Fic3RyYWN0QXZtY29kZUNvbXBpbGVyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK0FWTUNPREVfQ09NUElMRVJfRVhQUkVTU0lPTl9PUFRJTUlaRVJfQ0xBU1MoIkNUT1I8IHR5cGUgPiggZXhwcmVzc2lvbisgKSIsCisJCUN0b3JFeHByZXNzaW9uLCBBYnN0cmFjdEF2bWNvZGVDb21waWxlcikKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKyNlbmRpZiAvKiBBVk1DT0RFQ1RPUkVYUFJFU1NJT05DT01QSUxFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZUV4cHJlc3Npb25Db21waWxlci5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlRXhwcmVzc2lvbkNvbXBpbGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTZkZjczCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZUV4cHJlc3Npb25Db21waWxlci5jcHAKQEAgLTAsMCArMSwxMDEzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMiBhdnIuIDIwMTMKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkF2bWNvZGVFeHByZXNzaW9uQ29tcGlsZXIuaCIKKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZEYXRhLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9CdWlsdGluQXJyYXkuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29uc3RydWN0b3IuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uRmFjdG9yeS5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25UeXBlQ2hlY2tlci5oPgorCisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yTWFuYWdlci5oPgorCisjaW5jbHVkZSA8Zm1sL3R5cGUvQ2xhc3NUeXBlU3BlY2lmaWVyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBVTkFSWSBSVkFMVUUgQ09NUElMQVRJT04gU1RFUAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkZDb2RlIEF2bWNvZGVFeHByZXNzaW9uQUxVQ29tcGlsZXI6Om9wdGltaXplVW5hcnlSdmFsdWUoQ09NUElMRV9DT05URVhUICogYUNUWCwKKwkJY29uc3QgQkZDb2RlICYgYUNvZGUsIEJhc2VUeXBlU3BlY2lmaWVyICogYVR5cGUsCisJCWF2bV9hcmdfcHJvY2Vzc29yX3QgYVByb2Nlc3NvciwgQmFzZVR5cGVTcGVjaWZpZXIgKiBtYWluVHlwZSkKK3sKKwlBdm1JbnN0cnVjdGlvbiAqIGFyZ3NJbnN0cnVjdGlvbiA9IGFDb2RlLT5nZW5JbnN0cnVjdGlvbigpOworCisJb3B0aW1pemVBcmdFeHByZXNzaW9uKGFDVFgsIGFDb2RlLCAwKTsKKwlhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLmR0eXBlID0gYVR5cGU7CisJc2V0QXJnY29kZVJWYWx1ZShhQ1RYLCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLCBhQ29kZS0+Zmlyc3QoKSwgZmFsc2UpOworCisJYXJnc0luc3RydWN0aW9uLT5jb21wdXRlTWFpbkJ5dGVjb2RlKAorCQkJLypjb250ZXh0ICAqLyBBVk1fQVJHX1JFVFVSTl9DVFgsCisJCQkvKnByb2Nlc3NvciovIGFQcm9jZXNzb3IsCisJCQkvKm9wZXJhdGlvbiovIEFWTV9BUkdfU0VWQUxfUlZBTFVFLAorCQkJLypvcGVyYW5kICAqLyBBVk1fQVJHX0VYUFJFU1NJT05fS0lORCwKKwkJCS8qZHR5cGUgICAgKi8gbWFpblR5cGUpOworCisJcmV0dXJuKCBhQ29kZSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBCSU5BUlkgUlZBTFVFIENPTVBJTEFUSU9OIFNURVAKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0JGQ29kZSBBdm1jb2RlRXhwcmVzc2lvbkFMVUNvbXBpbGVyOjpvcHRpbWl6ZUJpbmFyeVJ2YWx1ZSgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUsCisJCUJhc2VUeXBlU3BlY2lmaWVyICogYVR5cGUxLCBCYXNlVHlwZVNwZWNpZmllciAqIGFUeXBlMiwKKwkJYXZtX2FyZ19wcm9jZXNzb3JfdCBhUHJvY2Vzc29yLCBCYXNlVHlwZVNwZWNpZmllciAqIG1haW5UeXBlKQoreworCUF2bUluc3RydWN0aW9uICogYXJnc0luc3RydWN0aW9uID0gYUNvZGUtPmdlbkluc3RydWN0aW9uKCk7CisKKwlvcHRpbWl6ZUFyZ0V4cHJlc3Npb24oYUNUWCwgYUNvZGUsIDApOworCWFyZ3NJbnN0cnVjdGlvbi0+YXQoMCkuZHR5cGUgPSBhVHlwZTE7CisJc2V0QXJnY29kZVJWYWx1ZShhQ1RYLCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLCBhQ29kZS0+Zmlyc3QoKSwgZmFsc2UpOworCisJb3B0aW1pemVBcmdFeHByZXNzaW9uKGFDVFgsIGFDb2RlLCAxKTsKKwlhcmdzSW5zdHJ1Y3Rpb24tPmF0KDEpLmR0eXBlID0gYVR5cGUyOworCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdCgxKSwgYUNvZGUtPnNlY29uZCgpLCBmYWxzZSk7CisKKwlhcmdzSW5zdHJ1Y3Rpb24tPmNvbXB1dGVNYWluQnl0ZWNvZGUoCisJCQkvKmNvbnRleHQgICovIEFWTV9BUkdfUkVUVVJOX0NUWCwKKwkJCS8qcHJvY2Vzc29yKi8gYVByb2Nlc3NvciwKKwkJCS8qb3BlcmF0aW9uKi8gQVZNX0FSR19TRVZBTF9SVkFMVUUsCisJCQkvKm9wZXJhbmQgICovIEFWTV9BUkdfRVhQUkVTU0lPTl9LSU5ELAorCQkJLypkdHlwZSAgICAqLyBtYWluVHlwZSk7CisKKwkvLyBzZXQgb3BlcmF0aW9uIG9uIHN0cmluZworCWlmKCAoYXJnc0luc3RydWN0aW9uLT5hdCgwKS5vcGVyYW5kID09IEFWTV9BUkdfU1RSSU5HX0tJTkQpICYmCisJCQkoYXJnc0luc3RydWN0aW9uLT5hdCgxKS5vcGVyYW5kID09IEFWTV9BUkdfU1RSSU5HX0tJTkQpICkKKwl7CisJCWFyZ3NJbnN0cnVjdGlvbi0+c2V0TWFpbkJ5dGVjb2RlKAorCQkJCS8qY29udGV4dCAgKi8gQVZNX0FSR19SRVRVUk5fQ1RYLAorCQkJCS8qcHJvY2Vzc29yKi8gQVZNX0FSR19TVFJJTkdfQ1BVLAorCQkJCS8qb3BlcmF0aW9uKi8gQVZNX0FSR19TRVZBTF9SVkFMVUUsCisJCQkJLypvcGVyYW5kICAqLyBBVk1fQVJHX0VYUFJFU1NJT05fS0lORCwKKwkJCQkvKmR0eXBlICAgICovIG1haW5UeXBlICk7CisJfQorCisJcmV0dXJuKCBhQ29kZSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBU1NPQ0lBVElWRSBSVkFMVUUgQ09NUElMQVRJT04gU1RFUAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkZDb2RlIEF2bWNvZGVFeHByZXNzaW9uQUxVQ29tcGlsZXI6OmNvbXBpbGVBc3NvY2lhdGl2ZVJ2YWx1ZSgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUsIEJhc2VUeXBlU3BlY2lmaWVyICogYVR5cGUpCit7CisJT3BlcmF0b3IgKiBtYWluT3BlcmF0b3IgPSBhQ29kZS0+Z2V0T3BlcmF0b3IoKTsKKwlCRkNvZGUgbmV3Q29kZSggbWFpbk9wZXJhdG9yICk7CisKKwlCRiBhcmc7CisJQXZtQ29kZSAqIHBDb2RlOworCisJYUNUWCA9IGFDVFgtPmNsb25lKGFUeXBlKTsKKworCUF2bUNvZGU6Oml0ZXJhdG9yIGl0QXJnID0gYUNvZGUtPmJlZ2luKCk7CisJQXZtQ29kZTo6aXRlcmF0b3IgaXRFbmRBcmcgPSBhQ29kZS0+ZW5kKCk7CisJZm9yKCA7IGl0QXJnICE9IGl0RW5kQXJnIDsgKytpdEFyZyApCisJeworCQlhcmcgPSBBVk1DT0RFX0NPTVBJTEVSLmRlY29kZV9jb21waWxlRXhwcmVzc2lvbihhQ1RYLCAqaXRBcmcpOworCisJCWlmKCBhcmcuaW52YWxpZCgpICkKKwkJeworCQkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JFcnJvckNvdW50KCk7CisJCQlhQ1RYLT5lcnJvckNvbnRleHQoIEFWTV9PU19XQVJOICkKKwkJCQkJPDwgIkF2bUNvZGU8IGV4cHJlc3Npb24gPiBjb21waWxhdGlvbiBlcnJvciA8PCAiCisJCQkJCTw8ICgqaXRBcmcpLnN0cigpIDw8ICIgPj4iIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisKKwkJCW5ld0NvZGUtPmFwcGVuZCggYXJnICk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmKCBhcmcuaXM8IEF2bUNvZGUgPigpICkKKwkJeworCQkJcENvZGUgPSBhcmcudG9fcHRyPCBBdm1Db2RlID4oKTsKKworCQkJaWYoIHBDb2RlLT5pc09wZXJhdG9yKCBtYWluT3BlcmF0b3IgKSAmJgorCQkJCW1haW5PcGVyYXRvci0+aXNBc3NvY2lhdGl2ZSgpICkKKwkJCXsKKwkJCQluZXdDb2RlLT5hcHBlbmQoIHBDb2RlLT5nZXRBcmdzKCkgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQluZXdDb2RlLT5hcHBlbmQoIGFyZyApOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJbmV3Q29kZS0+YXBwZW5kKCBhcmcgKTsKKwkJfQorCX0KKworCXJldHVybiggbmV3Q29kZSApOworfQorCitCRkNvZGUgQXZtY29kZUV4cHJlc3Npb25BTFVDb21waWxlcjo6b3B0aW1pemVBc3NvY2lhdGl2ZVJ2YWx1ZSgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUsIEJhc2VUeXBlU3BlY2lmaWVyICogYVR5cGUsCisJCWF2bV9hcmdfcHJvY2Vzc29yX3QgYVByb2Nlc3NvciwgQmFzZVR5cGVTcGVjaWZpZXIgKiBtYWluVHlwZSkKK3sKKwlPcGVyYXRvciAqIG1haW5PcGVyYXRvciA9IGFDb2RlLT5nZXRPcGVyYXRvcigpOworCUJGQ29kZSBuZXdDb2RlKCBtYWluT3BlcmF0b3IgKTsKKworCUJGIGFyZzsKKwlBdm1Db2RlICogcENvZGU7CisKKwlBdm1Db2RlOjppdGVyYXRvciBpdEFyZyA9IGFDb2RlLT5iZWdpbigpOworCUF2bUNvZGU6Oml0ZXJhdG9yIGl0RW5kQXJnID0gYUNvZGUtPmVuZCgpOworCisJQXZtSW5zdHJ1Y3Rpb24gKiBhcmdzSW5zdHJ1Y3Rpb24gPSBuZXdDb2RlLT5uZXdFbXB0eUluc3RydWN0aW9uKCk7CisKKwlWZWN0b3I8IEF2bUJ5dGVjb2RlID4gdmVjdG9yT2ZBcmdPcGNvZGU7CisKKwlhdm1fc2l6ZV90IHN0cmluZ0FyZ0NvdW50ID0gMDsKKworCWZvciggOyBpdEFyZyAhPSBpdEVuZEFyZyA7ICsraXRBcmcgKQorCXsKKwkJYXJnID0gQVZNQ09ERV9DT01QSUxFUi5kZWNvZGVfb3B0aW1pemVFeHByZXNzaW9uKGFDVFgsICppdEFyZyk7CisKKwkJaWYoIGFyZy5pbnZhbGlkKCkgKQorCQl7CisJCQlnZXRDb21waWxlclRhYmxlKCkuaW5jckVycm9yQ291bnQoKTsKKwkJCWFDVFgtPmVycm9yQ29udGV4dCggQVZNX09TX1dBUk4gKQorCQkJCQk8PCAiQXZtQ29kZTwgZXhwcmVzc2lvbiA+IG9wdGltaXphdGlvbiBlcnJvciA8PCAiCisJCQkJCTw8ICgqaXRBcmcpLnN0cigpIDw8ICIgPj4iIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisKKwkJCW5ld0NvZGUtPmFwcGVuZCggYXJnICk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmKCBhcmcuaXM8IEF2bUNvZGUgPigpICkKKwkJeworCQkJcENvZGUgPSBhcmcudG9fcHRyPCBBdm1Db2RlID4oKTsKKworCQkJaWYoIHBDb2RlLT5pc09wZXJhdG9yKCBtYWluT3BlcmF0b3IgKSAmJgorCQkJCW1haW5PcGVyYXRvci0+aXNBc3NvY2lhdGl2ZSgpICkKKwkJCXsKKwkJCQluZXdDb2RlLT5hcHBlbmQoIHBDb2RlLT5nZXRBcmdzKCkgKTsKKworCQkJCXZlY3Rvck9mQXJnT3Bjb2RlLmFwcGVuZCgKKwkJCQkJCXBDb2RlLT5nZXRJbnN0cnVjdGlvbigpLT5nZXRCeXRlY29kZSgpLCBwQ29kZS0+c2l6ZSgpKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQluZXdDb2RlLT5hcHBlbmQoIGFyZyApOworCisJCQkJaWYoIHBDb2RlLT5oYXNJbnN0cnVjdGlvbigpICkKKwkJCQl7CisJCQkJCXZlY3Rvck9mQXJnT3Bjb2RlLmFwcGVuZCggYXJnY29kZU9mRXhwcmVzc2lvbihhQ1RYLCBwQ29kZSkgKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJCQk8PCAiVW5leHBlY3RlZCBleHByZXNzaW9uIHdpdGhvdXQgYXJnY29kZSA8PCAiCisJCQkJCQkJPDwgcENvZGUtPnN0ckRlYnVnKCkgPDwgIiA+PiAhISEiCisJCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJCXZlY3Rvck9mQXJnT3Bjb2RlLmFwcGVuZCggQXZtQnl0ZWNvZGUoQVZNX0FSR19BUkdVTUVOVF9DVFgsCisJCQkJCQkJQVZNX0FSR19TRVZBTF9SVkFMVUUsIEFWTV9BUkdfRVhQUkVTU0lPTl9LSU5EKSApOworCQkJCX0KKwkJCQl2ZWN0b3JPZkFyZ09wY29kZS5iYWNrKCkuY29udGV4dCA9IEFWTV9BUkdfQVJHVU1FTlRfQ1RYOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJbmV3Q29kZS0+YXBwZW5kKCBhcmcgKTsKKworCQkJQXZtQnl0ZWNvZGUgYXJnT3Bjb2RlOworCQkJc2V0QXJnY29kZVJWYWx1ZShhQ1RYLCBhcmdPcGNvZGUsIGFyZywgZmFsc2UpOworCQkJYXJnT3Bjb2RlLmNvbnRleHQgPSBBVk1fQVJHX0FSR1VNRU5UX0NUWDsKKwkJCXZlY3Rvck9mQXJnT3Bjb2RlLmFwcGVuZCggYXJnT3Bjb2RlICk7CisJCX0KKworCQlpZiggdmVjdG9yT2ZBcmdPcGNvZGUuYmFjaygpLm9wZXJhbmQgPT0gQVZNX0FSR19TVFJJTkdfS0lORCApCisJCXsKKwkJCXN0cmluZ0FyZ0NvdW50ICs9IDE7CisJCX0KKwl9CisKKwlhcmdzSW5zdHJ1Y3Rpb24tPnNldE1haW5CeXRlY29kZSgKKwkJCS8qY29udGV4dCAgKi8gQVZNX0FSR19SRVRVUk5fQ1RYLAorCQkJLypwcm9jZXNzb3IqLyBhUHJvY2Vzc29yLAorCQkJLypvcGVyYXRpb24qLyBBVk1fQVJHX1NFVkFMX1JWQUxVRSwKKwkJCS8qb3BlcmFuZCAgKi8gQVZNX0FSR19FWFBSRVNTSU9OX0tJTkQsCisJCQkvKmR0eXBlICAgICovIG1haW5UeXBlICk7CisKKwlhcmdzSW5zdHJ1Y3Rpb24tPmNvbXB1dGVCeXRlY29kZSggZmFsc2UgLCB2ZWN0b3JPZkFyZ09wY29kZSApOworCisJLy8gc2V0IG9wZXJhdGlvbiBvbiBzdHJpbmcKKwlpZiggc3RyaW5nQXJnQ291bnQgPiAwICkKKwl7CisJCWFyZ3NJbnN0cnVjdGlvbi0+c2V0TWFpbkJ5dGVjb2RlKAorCQkJCS8qY29udGV4dCAgKi8gQVZNX0FSR19SRVRVUk5fQ1RYLAorCQkJCS8qcHJvY2Vzc29yKi8gQVZNX0FSR19TVFJJTkdfQ1BVLAorCQkJCS8qb3BlcmF0aW9uKi8gQVZNX0FSR19TRVZBTF9SVkFMVUUsCisJCQkJLypvcGVyYW5kICAqLyBBVk1fQVJHX0VYUFJFU1NJT05fS0lORCwKKwkJCQkvKmR0eXBlICAgICovIG1haW5UeXBlICk7CisJfQorCisJcmV0dXJuKCBuZXdDb2RlICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFWTUNPREUgQVJJVEhNRVRJQyBMT0dJQyBDUFUgQ09NUElMQVRJT04gZm9yIFVOQVJZIEVYUFJFU1NJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKworQkYgQXZtY29kZUV4cHJlc3Npb25BTFVDb21waWxlcjo6Y29tcGlsZUV4cHJlc3Npb24oCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCXJldHVybiggY29tcGlsZVVuYXJ5UnZhbHVlKGFDVFgsIGFDb2RlLCBUeXBlTWFuYWdlcjo6VU5JVkVSU0FMKSApOworfQorCisKK0JGIEF2bWNvZGVFeHByZXNzaW9uQUxVQ29tcGlsZXI6Om9wdGltaXplRXhwcmVzc2lvbigKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisvLwlhcmdzSW5zdHJ1Y3Rpb24tPnNldE1haW5CeXRlY29kZSgKKy8vCQkJLypjb250ZXh0ICAqLyBBVk1fQVJHX1JFVFVSTl9DVFgsCisvLwkJCS8qcHJvY2Vzc29yKi8gQVZNX0FSR19BUklUSE1FVElDX0xPR0lDX0NQVSwKKy8vCQkJLypvcGVyYXRpb24qLyBBVk1fQVJHX1NFVkFMX1JWQUxVRSwKKy8vCQkJLypvcGVyYW5kICAqLyBBVk1fQVJHX0VYUFJFU1NJT05fS0lORCwKKy8vCQkJLypkdHlwZSAgICAqLyBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLmR0eXBlKTsKKworCXJldHVybiggb3B0aW1pemVVbmFyeVJ2YWx1ZShhQ1RYLCBhQ29kZSwgVHlwZU1hbmFnZXI6OlVOSVZFUlNBTCwKKwkJCUFWTV9BUkdfQVJJVEhNRVRJQ19MT0dJQ19DUFUsIFR5cGVNYW5hZ2VyOjpVTklWRVJTQUwpICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFWTUNPREUgQVJJVEhNRVRJQyBMT0dJQyBDUFUgQ09NUElMQVRJT04gZm9yIFVOQVJZIEVYUFJFU1NJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0JGIEF2bWNvZGVVbmFyeUFyaXRobWV0aWNFeHByZXNzaW9uQUxVQ29tcGlsZXI6OmNvbXBpbGVFeHByZXNzaW9uKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlyZXR1cm4oIGNvbXBpbGVVbmFyeVJ2YWx1ZShhQ1RYLCBhQ29kZSwgVHlwZU1hbmFnZXI6OlVOSVZFUlNBTCkgKTsKK30KKworCitCRiBBdm1jb2RlVW5hcnlBcml0aG1ldGljRXhwcmVzc2lvbkFMVUNvbXBpbGVyOjpvcHRpbWl6ZUV4cHJlc3Npb24oCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworLy8JYXJnc0luc3RydWN0aW9uLT5zZXRNYWluQnl0ZWNvZGUoCisvLwkJCS8qY29udGV4dCAgKi8gQVZNX0FSR19SRVRVUk5fQ1RYLAorLy8JCQkvKnByb2Nlc3NvciovIEFWTV9BUkdfQVJJVEhNRVRJQ19MT0dJQ19DUFUsCisvLwkJCS8qb3BlcmF0aW9uKi8gQVZNX0FSR19TRVZBTF9SVkFMVUUsCisvLwkJCS8qb3BlcmFuZCAgKi8gQVZNX0FSR19FWFBSRVNTSU9OX0tJTkQsCisvLwkJCS8qZHR5cGUgICAgKi8gYXJnc0luc3RydWN0aW9uLT5hdCgwKS5kdHlwZSk7CisKKwlyZXR1cm4oIG9wdGltaXplVW5hcnlSdmFsdWUoYUNUWCwgYUNvZGUsIFR5cGVNYW5hZ2VyOjpVTklWRVJTQUwsCisJCQlBVk1fQVJHX0FSSVRITUVUSUNfTE9HSUNfQ1BVLCBUeXBlTWFuYWdlcjo6VU5JVkVSU0FMKSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIEFSSVRITUVUSUMgTE9HSUMgQ1BVIENPTVBJTEFUSU9OIGZvciBCSU5BUlkgRVhQUkVTU0lPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkYgQXZtY29kZUJpbmFyeUFyaXRobWV0aWNFeHByZXNzaW9uQUxVQ29tcGlsZXI6OmNvbXBpbGVFeHByZXNzaW9uKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlyZXR1cm4oIGNvbXBpbGVCaW5hcnlSdmFsdWUoYUNUWCwgYUNvZGUsCisJCQlUeXBlTWFuYWdlcjo6VU5JVkVSU0FMLCBUeXBlTWFuYWdlcjo6VU5JVkVSU0FMKSApOworfQorCisKK0JGIEF2bWNvZGVCaW5hcnlBcml0aG1ldGljRXhwcmVzc2lvbkFMVUNvbXBpbGVyOjpvcHRpbWl6ZUV4cHJlc3Npb24oCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCXJldHVybiggb3B0aW1pemVCaW5hcnlSdmFsdWUoYUNUWCwgYUNvZGUsCisJCQlUeXBlTWFuYWdlcjo6VU5JVkVSU0FMLCBUeXBlTWFuYWdlcjo6VU5JVkVSU0FMLAorCQkJQVZNX0FSR19BUklUSE1FVElDX0xPR0lDX0NQVSwgVHlwZU1hbmFnZXI6OlVOSVZFUlNBTCkgKTsKK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIEFSSVRITUVUSUMgTE9HSUMgQ1BVIENPTVBJTEFUSU9OIGZvciBBU1NPQ0lBVElWRSBFWFBSRVNTSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitCRiBBdm1jb2RlQXNzb2NpYXRpdmVBcml0aG1ldGljRXhwcmVzc2lvbkFMVUNvbXBpbGVyOjpjb21waWxlRXhwcmVzc2lvbigKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJcmV0dXJuKCBjb21waWxlQXNzb2NpYXRpdmVSdmFsdWUoYUNUWCwgYUNvZGUsIFR5cGVNYW5hZ2VyOjpVTklWRVJTQUwpICk7Cit9CisKKworQkYgQXZtY29kZUFzc29jaWF0aXZlQXJpdGhtZXRpY0V4cHJlc3Npb25BTFVDb21waWxlcjo6b3B0aW1pemVFeHByZXNzaW9uKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlyZXR1cm4oIG9wdGltaXplQXNzb2NpYXRpdmVSdmFsdWUoYUNUWCwgYUNvZGUsIFR5cGVNYW5hZ2VyOjpVTklWRVJTQUwsCisJCQlBVk1fQVJHX0FSSVRITUVUSUNfTE9HSUNfQ1BVLCBUeXBlTWFuYWdlcjo6VU5JVkVSU0FMKSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIFBSRURJQ0FUIEVYUFJFU1NJT04gQ09NUElMQVRJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyB2b2lkIGNvbXBhcmVTdHJ1Y3R1cmUoQmFzZUF2bVByb2dyYW0gKiBhUHJvZ3JhbSwJQXZtQ29kZSAqIGV4cGFuZENvZGUsCisJCU9wZXJhdG9yICogb3AsIGNvbnN0IFN5bWJvbCAmIGFyZzEsIGNvbnN0IFN5bWJvbCAmIGFyZzIpCit7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIENPTVBJTElORyApCisvLwlBVk1fT1NfVFJBQ0UgPDwgImNvbXBhcmVTdHJ1Y3R1cmU6PiAiIDw8IHN0ZDo6ZW5kbDsKKy8vCWFyZzEudG9TdHJlYW0oQVZNX09TX1RSQUNFKTsKKy8vCWFyZzIudG9TdHJlYW0oQVZNX09TX1RSQUNFKTsKKwlBVk1fT1NfVFJBQ0UgPDwgImNvbXBhcmVTdHJ1Y3R1cmU6PiAiIDw8IHN0ZDo6ZW5kbAorCQkJPDwgIlx0IiA8PCBzdHJfaGVhZGVyKCBhcmcxICkgIDw8IHN0ZDo6ZW5kbAorCQkJPDwgIlx0IiA8PCBzdHJfaGVhZGVyKCBhcmcyICkgIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgQ09NUElMSU5HICkKKworCWlmKCBhcmcxLmhhc0F0dHJpYnV0ZSgpICYmIGFyZzIuaGFzQXR0cmlidXRlKCkgKQorCXsKKwkJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgaXQxID0gYXJnMS5nZXRBdHRyaWJ1dGUoKS0+YmVnaW4oKTsKKwkJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgaXQyID0gYXJnMi5nZXRBdHRyaWJ1dGUoKS0+YmVnaW4oKTsKKwkJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBhcmcxLmdldEF0dHJpYnV0ZSgpLT5lbmQoKTsKKwkJZm9yKCA7IGl0MSAhPSBpdEVuZCA7ICsraXQxICwgKytpdDIgKQorCQl7CisJCQljb21wYXJlU3RydWN0dXJlKGFQcm9ncmFtLCBleHBhbmRDb2RlLCBvcCwgKCppdDEpICwgKCppdDIpKTsKKwkJfQorCX0KKworCWVsc2UgaWYoIGFyZzEuaGFzQXR0cmlidXRlKCkgfHwgYXJnMi5oYXNBdHRyaWJ1dGUoKSApCisJeworCQljb25zdCBTeW1ib2wgJiBhcmdBdHRycyA9IGFyZzEuaGFzQXR0cmlidXRlKCkgPyBhcmcxIDogYXJnMjsKKwkJY29uc3QgU3ltYm9sICYgYXJnT3RoZXIgPSBhcmcxLmhhc0RhdGFQYXRoKCkgID8gYXJnMSA6IGFyZzI7CisKKwkJU3ltYm9sIGFyZ0FsaWFzOworCQlzdGQ6OnN0cmluZyBhUXVhbGlmaWVkTmFtZUlEOworCisJCVRhYmxlT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYXJnQXR0cnMuZ2V0QXR0cmlidXRlKCktPmJlZ2luKCk7CisJCVRhYmxlT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gYXJnQXR0cnMuZ2V0QXR0cmlidXRlKCktPmVuZCgpOworCQlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwkJeworCQkJYXJnQWxpYXMgPSBuZXcgSW5zdGFuY2VPZkRhdGEoYXJnT3RoZXIuZ2V0UG9pbnRlck5hdHVyZSgpLAorCQkJCQlhcmdPdGhlci5nZXRDb250YWluZXIoKSwgYXJnT3RoZXIucmF3RGF0YSgpLAorCQkJCQkqKGFyZ090aGVyLmdldERhdGFQYXRoKCkpLCAoKml0KSk7CisKKwkJCWFRdWFsaWZpZWROYW1lSUQgPSAoKml0KS5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpLnN1YnN0cigKKwkJCQkJYXJnQXR0cnMuZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKS5sZW5ndGgoKSArIDEpOworCisJCQlhcmdBbGlhcy51cGRhdGVGdWxseVF1YWxpZmllZE5hbWVJRCgKKwkJCQkJT1NTKCkgPDwgYXJnT3RoZXIuZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJCQkJCTw8ICcuJyA8PCBhUXVhbGlmaWVkTmFtZUlELAorCQkJCQlPU1MoKSA8PCBhcmdPdGhlci5nZXROYW1lSUQoKSAgPDwgJy4nIDw8IGFRdWFsaWZpZWROYW1lSUQgKTsKKworCQkJYVByb2dyYW0tPmFwcGVuZERhdGFBbGlhcyhhcmdBbGlhcyk7CisKKwkJCWNvbXBhcmVTdHJ1Y3R1cmUoYVByb2dyYW0sIGV4cGFuZENvZGUsIG9wLCAoKml0KSAsIGFyZ0FsaWFzKTsKKwkJfQorCX0KKworCWVsc2UgaWYoIGFyZzEuaXNUeXBlZFN0cnVjdHVyZSgpICkKKwl7CisJCVN5bWJvbCBhcmcxQWxpYXM7CisJCVN5bWJvbCBhcmcyQWxpYXM7CisJCXN0ZDo6c3RyaW5nIGlkOworCisJCUNsYXNzVHlwZVNwZWNpZmllciAqIHN0cnVjdFQgPQorCQkJCWFyZzEuZ2V0VHlwZVNwZWNpZmllcigpLT5hczwgQ2xhc3NUeXBlU3BlY2lmaWVyID4oKTsKKwkJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzdHJ1Y3RULT5nZXRTeW1ib2xEYXRhKCkuYmVnaW4oKTsKKwkJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBzdHJ1Y3RULT5nZXRTeW1ib2xEYXRhKCkuZW5kKCk7CisJCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQorCQl7CisJCQlpZCA9ICgqaXQpLmdldE5hbWVJRCgpOworCisJCQlhcmcxQWxpYXMgPSBuZXcgSW5zdGFuY2VPZkRhdGEoYXJnMS5nZXRQb2ludGVyTmF0dXJlKCksCisJCQkJCWFyZzEuZ2V0Q29udGFpbmVyKCksIGFyZzEucmF3RGF0YSgpLAorCQkJCQkqKGFyZzEuZ2V0RGF0YVBhdGgoKSksICgqaXQpKTsKKworCQkJYXJnMUFsaWFzLnVwZGF0ZUZ1bGx5UXVhbGlmaWVkTmFtZUlEKAorCQkJCQkoIE9TUygpIDw8IGFyZzEuZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAnLicgPDwgaWQgKSwKKwkJCQkJKCBPU1MoKSA8PCBhcmcxLmdldE5hbWVJRCgpICA8PCAnLicgPDwgaWQgKSApOworCisJCQlhUHJvZ3JhbS0+YXBwZW5kRGF0YUFsaWFzKGFyZzFBbGlhcyk7CisKKworCQkJYXJnMkFsaWFzID0gbmV3IEluc3RhbmNlT2ZEYXRhKGFyZzIuZ2V0UG9pbnRlck5hdHVyZSgpLAorCQkJCQlhcmcyLmdldENvbnRhaW5lcigpLCBhcmcyLnJhd0RhdGEoKSwKKwkJCQkJKihhcmcyLmdldERhdGFQYXRoKCkpLCAoKml0KSk7CisKKwkJCWFyZzJBbGlhcy51cGRhdGVGdWxseVF1YWxpZmllZE5hbWVJRCgKKwkJCQkJKCBPU1MoKSA8PCBhcmcyLmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgJy4nIDw8IGlkICksCisJCQkJCSggT1NTKCkgPDwgYXJnMi5nZXROYW1lSUQoKSAgPDwgJy4nIDw8IGlkICkgKTsKKworCQkJYVByb2dyYW0tPmFwcGVuZERhdGFBbGlhcyhhcmcyQWxpYXMpOworCisJCQljb21wYXJlU3RydWN0dXJlKGFQcm9ncmFtLCBleHBhbmRDb2RlLCBvcCwgYXJnMUFsaWFzICwgYXJnMkFsaWFzKTsKKwkJfQorCX0KKworCWVsc2UKKwl7CisJCUJGQ29kZSBhdG9tQ29kZShvcCk7CisKKwkJaWYoIGFyZzEuaXNGaWVsZENsYXNzQXR0cmlidXRlUG9pbnRlcigpIHx8CisJCQlhcmcxLmlzRmllbGRBcnJheU9mZnNldFBvaW50ZXIoKSApCisJCXsKKwkJCWF0b21Db2RlLT5hcHBlbmQoIElOQ1JfQkYoIGFyZzEuZ2V0QWxpYXNUYXJnZXQoKSApICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlhdG9tQ29kZS0+YXBwZW5kKCBhcmcxICk7CisJCX0KKworCQlpZiggYXJnMi5pc0ZpZWxkQ2xhc3NBdHRyaWJ1dGVQb2ludGVyKCkgfHwKKwkJCWFyZzIuaXNGaWVsZEFycmF5T2Zmc2V0UG9pbnRlcigpICkKKwkJeworCQkJYXRvbUNvZGUtPmFwcGVuZCggSU5DUl9CRiggYXJnMi5nZXRBbGlhc1RhcmdldCgpICkgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWF0b21Db2RlLT5hcHBlbmQoIGFyZzIgKTsKKwkJfQorCisJCWV4cGFuZENvZGUtPmFwcGVuZCggYXRvbUNvZGUgKTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgY29tcGFyZVN0cnVjdHVyZShCYXNlQXZtUHJvZ3JhbSAqIGFQcm9ncmFtLCBBdm1Db2RlICogZXhwYW5kQ29kZSwKKwkJT3BlcmF0b3IgKiBvcCwgY29uc3QgU3ltYm9sICYgYXJnMSwgY29uc3QgQkYgJiBhcmcyKQoreworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBDT01QSUxJTkcgKQorLy8JQVZNX09TX1RSQUNFIDw8ICJjb21wYXJlU3RydWN0dXJlOj4gIiA8PCBzdGQ6OmVuZGw7CisvLwlhcmcxLnRvU3RyZWFtKEFWTV9PU19UUkFDRSk7CisvLwlhcmcyLnRvU3RyZWFtKEFWTV9PU19UUkFDRSk7CisJQVZNX09TX1RSQUNFIDw8ICJjb21wYXJlU3RydWN0dXJlOj4gIiA8PCBzdGQ6OmVuZGwKKwkJCTw8ICJcdCIgPDwgc3RyX2hlYWRlciggYXJnMSApICA8PCBzdGQ6OmVuZGwKKwkJCTw8ICJcdCIgPDwgYXJnMi5zdHIoKSAgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBDT01QSUxJTkcgKQorCisKKwlpZiggYXJnMS5oYXNBdHRyaWJ1dGUoKSAmJiBhcmcyLmlzPCBBcnJheUJGID4oKSkKKwl7CisJCUFycmF5QkYgKiBhcmcyQXJyYXkgPSBhcmcyLnRvX3B0cjwgQXJyYXlCRiA+KCk7CisJCWF2bV9zaXplX3Qgb2Zmc2V0ID0gMDsKKworCQlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBpdCA9IGFyZzEuZ2V0QXR0cmlidXRlKCktPmJlZ2luKCk7CisJCVRhYmxlT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gYXJnMS5nZXRBdHRyaWJ1dGUoKS0+ZW5kKCk7CisJCWZvciggOyAoaXQgIT0gaXRFbmQpICYmIChvZmZzZXQgPCBhcmcyQXJyYXktPnNpemUoKSkgOyArK2l0ICwgKytvZmZzZXQgKQorCQl7CisJCQljb21wYXJlU3RydWN0dXJlKGFQcm9ncmFtLCBleHBhbmRDb2RlLAorCQkJCQlvcCwgKCppdCksIGFyZzJBcnJheS0+YXQob2Zmc2V0KSk7CisJCX0KKwl9CisKKwllbHNlIGlmKCBhcmcxLmlzVHlwZWRTdHJ1Y3R1cmUoKSAmJiBhcmcyLmlzPCBBcnJheUJGID4oKSApCisJeworCQlBcnJheUJGICogYXJnMkFycmF5ID0gYXJnMi50b19wdHI8IEFycmF5QkYgPigpOworCQlhdm1fc2l6ZV90IG9mZnNldCA9IDA7CisKKwkJU3ltYm9sIGFyZzFBbGlhczsKKwkJc3RkOjpzdHJpbmcgaWQ7CisKKwkJQ2xhc3NUeXBlU3BlY2lmaWVyICogc3RydWN0VCA9CisJCQkJYXJnMS5nZXRUeXBlU3BlY2lmaWVyKCktPmFzPCBDbGFzc1R5cGVTcGVjaWZpZXIgPigpOworCQlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBpdCA9IHN0cnVjdFQtPmdldFN5bWJvbERhdGEoKS5iZWdpbigpOworCQlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBpdEVuZCA9IHN0cnVjdFQtPmdldFN5bWJvbERhdGEoKS5lbmQoKTsKKwkJZm9yKCA7IChpdCAhPSBpdEVuZCkgJiYgKG9mZnNldCA8IGFyZzJBcnJheS0+c2l6ZSgpKSA7ICsraXQgLCArK29mZnNldCApCisJCXsKKwkJCWlkID0gKCppdCkuZ2V0TmFtZUlEKCk7CisKKwkJCWFyZzFBbGlhcyA9IG5ldyBJbnN0YW5jZU9mRGF0YShhcmcxLmdldFBvaW50ZXJOYXR1cmUoKSwKKwkJCQkJYXJnMS5nZXRDb250YWluZXIoKSwgYXJnMS5yYXdEYXRhKCksCisJCQkJCSooYXJnMS5nZXREYXRhUGF0aCgpKSwgKCppdCkpOworCisJCQlhcmcxQWxpYXMudXBkYXRlRnVsbHlRdWFsaWZpZWROYW1lSUQoCisJCQkJCSggT1NTKCkgPDwgYXJnMS5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8ICcuJyA8PCBpZCApLAorCQkJCQkoIE9TUygpIDw8IGFyZzEuZ2V0TmFtZUlEKCkgIDw8ICcuJyA8PCBpZCApICk7CisKKwkJCWFQcm9ncmFtLT5hcHBlbmREYXRhQWxpYXMoYXJnMUFsaWFzKTsKKworCQkJY29tcGFyZVN0cnVjdHVyZShhUHJvZ3JhbSwgZXhwYW5kQ29kZSwgb3AsCisJCQkJCWFyZzFBbGlhcywgYXJnMkFycmF5LT5hdChvZmZzZXQpKTsKKwkJfQorCX0KKworCWVsc2UKKwl7CisJCUJGQ29kZSBhdG9tQ29kZShvcCk7CisKKwkJaWYoIGFyZzEuaXNGaWVsZENsYXNzQXR0cmlidXRlUG9pbnRlcigpIHx8CisJCQlhcmcxLmlzRmllbGRBcnJheU9mZnNldFBvaW50ZXIoKSApCisJCXsKKwkJCWF0b21Db2RlLT5hcHBlbmQoIElOQ1JfQkYoIGFyZzEuZ2V0QWxpYXNUYXJnZXQoKSApICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlhdG9tQ29kZS0+YXBwZW5kKCBhcmcxICk7CisJCX0KKworCQlhdG9tQ29kZS0+YXBwZW5kKCBhcmcyICk7CisKKwkJZXhwYW5kQ29kZS0+YXBwZW5kKCBhdG9tQ29kZSApOworCX0KK30KKworCitCRiBBdm1jb2RlUmVsYXRpb25hbEV4cHJlc3Npb25Db21waWxlcjo6Y29tcGlsZUV4cHJlc3Npb24oCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCUJGQ29kZSBjb21waWxlQ29kZSA9IGNvbXBpbGVCaW5hcnlSdmFsdWUoYUNUWCwgYUNvZGUsCisJCQlUeXBlTWFuYWdlcjo6VU5JVkVSU0FMLCBUeXBlTWFuYWdlcjo6VU5JVkVSU0FMKTsKKworCWlmKCBjb21waWxlQ29kZS0+Zmlyc3QoKS5pczwgSW5zdGFuY2VPZkRhdGEgPigpICkKKwl7CisJCVN5bWJvbCBhcmcxKCBjb21waWxlQ29kZS0+Zmlyc3QoKSApOworCisJCWlmKCBhQ1RYLT5pc05lZWRUeXBlQ2hlY2tpbmcoKSApCisJCXsKKwkJCWNoZWNrQXJnVHlwZShhQ1RYLCBhcmcxLmdldFR5cGVTcGVjaWZpZXIoKSwgY29tcGlsZUNvZGUtPnNlY29uZCgpKTsKKwkJfQorCisJCWlmKCBhcmcxLmhhc1R5cGVBcnJheU9yU3RydWN0dXJlKCkgKQorCQl7CisJCQlpZiggY29tcGlsZUNvZGUtPnNlY29uZCgpLmlzPCBJbnN0YW5jZU9mRGF0YSA+KCkgKQorCQkJeworCQkJCVN5bWJvbCBhcmcyKCBjb21waWxlQ29kZS0+c2Vjb25kKCkgKTsKKworCQkJCWlmKCBhcmcxLmdldFR5cGVTcGVjaWZpZXIoKSA9PSBhcmcyLmdldFR5cGVTcGVjaWZpZXIoKSApCisJCQkJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBDT01QSUxJTkcgKQorCUFWTV9PU19UUkFDRSA8PCAiQXZtY29kZVJlbGF0aW9uYWxFeHByZXNzaW9uQ29tcGlsZXI6PlxuIgorCQkJPDwgIlx0IiA8PCBzdHJfaGVhZGVyKCBhcmcxICkgPDwgc3RkOjplbmRsCisJCQk8PCAiXHQiIDw8IHN0cl9oZWFkZXIoIGFyZzIgKSA8PCBzdGQ6OmVuZGw7CisKKwlBVk1fT1NfVFJBQ0UgPDwgIkNvbXBhcmlzb24gb2YgZGF0YSBzdHJ1Y3R1cmUgPDwgIgorCQkJPDwgY29tcGlsZUNvZGUtPnN0cigpIDw8ICIgPj4gIiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIENPTVBJTElORyApCisKKwkJCQkJQkZDb2RlIGV4cGFuZENvZGUoCisJCQkJCQkJYUNvZGUtPmlzT3BDb2RlKCBBVk1fT1BDT0RFX05FUSApID8KKwkJCQkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfT1IgOgorCQkJCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BTkQgKTsKKworCQkJCQljb21wYXJlU3RydWN0dXJlKGFDVFgtPm1Db21waWxlQ3R4LCBleHBhbmRDb2RlLAorCQkJCQkJCWFDb2RlLT5nZXRPcGVyYXRvcigpLCBhcmcxLCBhcmcyKTsKKworCQkJCQlpZiggZXhwYW5kQ29kZS0+c2luZ2xldG9uKCkgJiYgZXhwYW5kQ29kZS5pczwgQXZtQ29kZSA+KCkgKQorCQkJCQl7CisJCQkJCQljb21waWxlQ29kZSA9IGV4cGFuZENvZGUtPmZpcnN0KCk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQljb21waWxlQ29kZSA9IGV4cGFuZENvZGU7CisJCQkJCX0KKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBDT01QSUxJTkcgKQorCUFWTV9PU19UUkFDRSA8PCAiQXZtY29kZVJlbGF0aW9uYWxFeHByZXNzaW9uQ29tcGlsZXI6cmVzdWx0PlxuIgorCQkJPDwgY29tcGlsZUNvZGUuc3RyKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBDT01QSUxJTkcgKQorCQkJCX0KKwkJCX0KKworCQkJZWxzZSBpZiggY29tcGlsZUNvZGUtPnNlY29uZCgpLmlzPCBBcnJheUJGID4oKSApCisJCQl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIENPTVBJTElORyApCisJQVZNX09TX1RSQUNFIDw8ICJBdm1jb2RlUmVsYXRpb25hbEV4cHJlc3Npb25Db21waWxlcjo+XG4iCisJCQk8PCAiXHQiIDw8IHN0cl9oZWFkZXIoIGFyZzEgKSA8PCBzdGQ6OmVuZGwKKwkJCTw8ICJcdCIgPDwgY29tcGlsZUNvZGUtPnNlY29uZCgpLnN0cigpIDw8IHN0ZDo6ZW5kbDsKKworCUFWTV9PU19UUkFDRSA8PCAiQ29tcGFyaXNvbiBvZiBkYXRhIHN0cnVjdHJlIDw8ICIKKwkJCTw8IGNvbXBpbGVDb2RlLT5zdHIoKSA8PCAiID4+ICIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBDT01QSUxJTkcgKQorCisJCQkJQkZDb2RlIGV4cGFuZENvZGUoCisJCQkJCQlhQ29kZS0+aXNPcENvZGUoIEFWTV9PUENPREVfTkVRICkgPworCQkJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX09SIDoKKwkJCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BTkQgKTsKKworCQkJCWNvbXBhcmVTdHJ1Y3R1cmUoYUNUWC0+bUNvbXBpbGVDdHgsIGV4cGFuZENvZGUsCisJCQkJCQlhQ29kZS0+Z2V0T3BlcmF0b3IoKSwgYXJnMSwgY29tcGlsZUNvZGUtPnNlY29uZCgpKTsKKworCQkJCWlmKCBleHBhbmRDb2RlLT5zaW5nbGV0b24oKSAmJiBleHBhbmRDb2RlLmlzPCBBdm1Db2RlID4oKSApCisJCQkJeworCQkJCQljb21waWxlQ29kZSA9IGV4cGFuZENvZGUtPmZpcnN0KCk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWNvbXBpbGVDb2RlID0gZXhwYW5kQ29kZTsKKwkJCQl9CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgQ09NUElMSU5HICkKKwlBVk1fT1NfVFJBQ0UgPDwgIkF2bWNvZGVSZWxhdGlvbmFsRXhwcmVzc2lvbkNvbXBpbGVyOnJlc3VsdD5cbiIKKwkJCTw8IGNvbXBpbGVDb2RlLnN0cigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgQ09NUElMSU5HICkKKwkJCX0KKwkJfQorCX0KKwllbHNlIGlmKCBjb21waWxlQ29kZS0+c2Vjb25kKCkuaXM8IEluc3RhbmNlT2ZEYXRhID4oKSApCisJeworCQlpZiggYUNUWC0+aXNOZWVkVHlwZUNoZWNraW5nKCkgKQorCQl7CisJCQljaGVja0FyZ1R5cGUoYUNUWCwgY29tcGlsZUNvZGUtPnNlY29uZCgpLnRvX3B0cjwKKwkJCQlJbnN0YW5jZU9mRGF0YSA+KCktPmdldFR5cGVTcGVjaWZpZXIoKSwgY29tcGlsZUNvZGUtPmZpcnN0KCkpOworCQl9CisKKwl9CisKKwlyZXR1cm4oIGNvbXBpbGVDb2RlICk7Cit9CisKKworQkYgQXZtY29kZVJlbGF0aW9uYWxFeHByZXNzaW9uQ29tcGlsZXI6Om9wdGltaXplRXhwcmVzc2lvbigKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJYXZtX2FyZ19wcm9jZXNzb3JfdCBwcm9jZXNzb3IgPSBBVk1fQVJHX0FSSVRITUVUSUNfTE9HSUNfQ1BVOworCisJaWYoIGFDb2RlLT5maXJzdCgpLmlzPCBJbnN0YW5jZU9mRGF0YSA+KCkgJiYKKwkJYUNvZGUtPmZpcnN0KCkudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCktPmhhc1R5cGVBcnJheU9yU3RydWN0dXJlKCkgKQorCXsKKwkJcHJvY2Vzc29yID0gQVZNX0FSR19BUlJBWV9SVkFMVUVfQ1BVOworCX0KKwllbHNlIGlmKCBhQ29kZS0+c2Vjb25kKCkuaXM8IEluc3RhbmNlT2ZEYXRhID4oKSAmJgorCQkJYUNvZGUtPnNlY29uZCgpLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpLT5oYXNUeXBlQXJyYXlPclN0cnVjdHVyZSgpICkKKwl7CisJCXByb2Nlc3NvciA9IEFWTV9BUkdfQVJSQVlfUlZBTFVFX0NQVTsKKwl9CisJZWxzZSBpZiggYUNvZGUtPmZpcnN0KCkuaXM8IEFycmF5QkYgPigpIHx8IGFDb2RlLT5zZWNvbmQoKS5pczwgQXJyYXlCRiA+KCkgKQorCXsKKwkJcHJvY2Vzc29yID0gQVZNX0FSR19BUlJBWV9SVkFMVUVfQ1BVOworCX0KKworCXJldHVybiggb3B0aW1pemVCaW5hcnlSdmFsdWUoIGFDVFgsIGFDb2RlLCBUeXBlTWFuYWdlcjo6VU5JVkVSU0FMLAorCQkJVHlwZU1hbmFnZXI6OlVOSVZFUlNBTCwgcHJvY2Vzc29yLCBUeXBlTWFuYWdlcjo6Qk9PTEVBTikgKTsKK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIFBSRURJQ0FURSBFWFBSRVNTSU9OIENPTVBJTEFUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitCRiBBdm1jb2RlVW5hcnlQcmVkaWNhdGVFeHByZXNzaW9uQ29tcGlsZXI6OmNvbXBpbGVFeHByZXNzaW9uKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlyZXR1cm4oIGNvbXBpbGVVbmFyeVJ2YWx1ZShhQ1RYLCBhQ29kZSwgVHlwZU1hbmFnZXI6OkJPT0xFQU4pICk7Cit9CisKKworQkYgQXZtY29kZVVuYXJ5UHJlZGljYXRlRXhwcmVzc2lvbkNvbXBpbGVyOjpvcHRpbWl6ZUV4cHJlc3Npb24oCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCXJldHVybiggb3B0aW1pemVVbmFyeVJ2YWx1ZShhQ1RYLCBhQ29kZSwgVHlwZU1hbmFnZXI6OkJPT0xFQU4sCisJCQlBVk1fQVJHX0FSSVRITUVUSUNfTE9HSUNfQ1BVLCBUeXBlTWFuYWdlcjo6Qk9PTEVBTikgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQVZNQ09ERSBQUkVESUNBVEUgRVhQUkVTU0lPTiBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkYgQXZtY29kZUJpbmFyeVByZWRpY2F0ZUV4cHJlc3Npb25Db21waWxlcjo6Y29tcGlsZUV4cHJlc3Npb24oCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCXJldHVybiggY29tcGlsZUJpbmFyeVJ2YWx1ZShhQ1RYLCBhQ29kZSwKKwkJCVR5cGVNYW5hZ2VyOjpCT09MRUFOLCBUeXBlTWFuYWdlcjo6Qk9PTEVBTikgKTsKK30KKworCitCRiBBdm1jb2RlQmluYXJ5UHJlZGljYXRlRXhwcmVzc2lvbkNvbXBpbGVyOjpvcHRpbWl6ZUV4cHJlc3Npb24oCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCXJldHVybiggb3B0aW1pemVCaW5hcnlSdmFsdWUoYUNUWCwgYUNvZGUsCisJCQlUeXBlTWFuYWdlcjo6Qk9PTEVBTiwgVHlwZU1hbmFnZXI6OkJPT0xFQU4sCisJCQlBVk1fQVJHX0FSSVRITUVUSUNfTE9HSUNfQ1BVLCBUeXBlTWFuYWdlcjo6Qk9PTEVBTikgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQVZNQ09ERSBQUkVESUNBVEUgRVhQUkVTU0lPTiBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkYgQXZtY29kZUFzc29jaWF0aXZlUHJlZGljYXRlRXhwcmVzc2lvbkNvbXBpbGVyOjpjb21waWxlRXhwcmVzc2lvbigKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJcmV0dXJuKCBjb21waWxlQXNzb2NpYXRpdmVSdmFsdWUoYUNUWCwgYUNvZGUsIFR5cGVNYW5hZ2VyOjpCT09MRUFOKSApOworfQorCisKK0JGIEF2bWNvZGVBc3NvY2lhdGl2ZVByZWRpY2F0ZUV4cHJlc3Npb25Db21waWxlcjo6b3B0aW1pemVFeHByZXNzaW9uKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlyZXR1cm4oIG9wdGltaXplQXNzb2NpYXRpdmVSdmFsdWUoYUNUWCwgYUNvZGUsIFR5cGVNYW5hZ2VyOjpCT09MRUFOLAorCQkJQVZNX0FSR19BUklUSE1FVElDX0xPR0lDX0NQVSwgVHlwZU1hbmFnZXI6OkJPT0xFQU4pICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFWTUNPREUgQklUV0lTRSBFWFBSRVNTSU9OIENPTVBJTEFUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitCRiBBdm1jb2RlVW5hcnlCaXR3aXNlRXhwcmVzc2lvbkNvbXBpbGVyOjpjb21waWxlRXhwcmVzc2lvbigKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJcmV0dXJuKCBjb21waWxlVW5hcnlSdmFsdWUoYUNUWCwgYUNvZGUsIFR5cGVNYW5hZ2VyOjpJTlRFR0VSKSApOworfQorCisKK0JGIEF2bWNvZGVVbmFyeUJpdHdpc2VFeHByZXNzaW9uQ29tcGlsZXI6Om9wdGltaXplRXhwcmVzc2lvbigKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJcmV0dXJuKCBvcHRpbWl6ZVVuYXJ5UnZhbHVlKGFDVFgsIGFDb2RlLCBUeXBlTWFuYWdlcjo6SU5URUdFUiwKKwkJCUFWTV9BUkdfQVJJVEhNRVRJQ19MT0dJQ19DUFUsIFR5cGVNYW5hZ2VyOjpJTlRFR0VSKSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIEJJVFdJU0UgRVhQUkVTU0lPTiBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkYgQXZtY29kZUJpbmFyeUJpdHdpc2VFeHByZXNzaW9uQ29tcGlsZXI6OmNvbXBpbGVFeHByZXNzaW9uKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlyZXR1cm4oIGNvbXBpbGVCaW5hcnlSdmFsdWUoYUNUWCwgYUNvZGUsCisJCQlUeXBlTWFuYWdlcjo6SU5URUdFUiwgVHlwZU1hbmFnZXI6OklOVEVHRVIpICk7Cit9CisKKworQkYgQXZtY29kZUJpbmFyeUJpdHdpc2VFeHByZXNzaW9uQ29tcGlsZXI6Om9wdGltaXplRXhwcmVzc2lvbigKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJcmV0dXJuKCBvcHRpbWl6ZUJpbmFyeVJ2YWx1ZShhQ1RYLCBhQ29kZSwKKwkJCVR5cGVNYW5hZ2VyOjpJTlRFR0VSLCBUeXBlTWFuYWdlcjo6SU5URUdFUiwKKwkJCUFWTV9BUkdfQVJJVEhNRVRJQ19MT0dJQ19DUFUsIFR5cGVNYW5hZ2VyOjpJTlRFR0VSKSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIEJJVFdJU0UgRVhQUkVTU0lPTiBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkYgQXZtY29kZUFzc29jaWF0aXZlQml0d2lzZUV4cHJlc3Npb25Db21waWxlcjo6Y29tcGlsZUV4cHJlc3Npb24oCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCXJldHVybiggY29tcGlsZUFzc29jaWF0aXZlUnZhbHVlKGFDVFgsIGFDb2RlLCBUeXBlTWFuYWdlcjo6SU5URUdFUikgKTsKK30KKworCitCRiBBdm1jb2RlQXNzb2NpYXRpdmVCaXR3aXNlRXhwcmVzc2lvbkNvbXBpbGVyOjpvcHRpbWl6ZUV4cHJlc3Npb24oCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCXJldHVybiggb3B0aW1pemVBc3NvY2lhdGl2ZVJ2YWx1ZShhQ1RYLCBhQ29kZSwgVHlwZU1hbmFnZXI6OklOVEVHRVIsCisJCQlBVk1fQVJHX0FSSVRITUVUSUNfTE9HSUNfQ1BVLCBUeXBlTWFuYWdlcjo6SU5URUdFUikgKTsKK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIFNUUklORyBVTkFSWSBFWFBSRVNTSU9OIENPTVBJTEFUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitCRiBBdm1jb2RlVW5hcnlTdHJpbmdFeHByZXNzaW9uQ29tcGlsZXI6OmNvbXBpbGVFeHByZXNzaW9uKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlyZXR1cm4oIGNvbXBpbGVVbmFyeVJ2YWx1ZShhQ1RYLCBhQ29kZSwgVHlwZU1hbmFnZXI6OlNUUklORykgKTsKK30KKworCitCRiBBdm1jb2RlVW5hcnlTdHJpbmdFeHByZXNzaW9uQ29tcGlsZXI6Om9wdGltaXplRXhwcmVzc2lvbigKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJcmV0dXJuKCBvcHRpbWl6ZVVuYXJ5UnZhbHVlKGFDVFgsIGFDb2RlLCBUeXBlTWFuYWdlcjo6U1RSSU5HLAorCQkJQVZNX0FSR19TVFJJTkdfQ1BVLCBUeXBlTWFuYWdlcjo6VU5JVkVSU0FMKSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIFNUUklORyBCSU5BUlkgRVhQUkVTU0lPTiBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkYgQXZtY29kZUJpbmFyeVN0cmluZ0V4cHJlc3Npb25Db21waWxlcjo6Y29tcGlsZUV4cHJlc3Npb24oCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCXJldHVybiggY29tcGlsZUJpbmFyeVJ2YWx1ZShhQ1RYLCBhQ29kZSwKKwkJCVR5cGVNYW5hZ2VyOjpTVFJJTkcsIFR5cGVNYW5hZ2VyOjpTVFJJTkcpICk7Cit9CisKKworQkYgQXZtY29kZUJpbmFyeVN0cmluZ0V4cHJlc3Npb25Db21waWxlcjo6b3B0aW1pemVFeHByZXNzaW9uKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlyZXR1cm4oIG9wdGltaXplQmluYXJ5UnZhbHVlKGFDVFgsIGFDb2RlLAorCQkJVHlwZU1hbmFnZXI6OlNUUklORywgVHlwZU1hbmFnZXI6OlNUUklORywKKwkJCUFWTV9BUkdfU1RSSU5HX0NQVSwgVHlwZU1hbmFnZXI6OlVOSVZFUlNBTCkgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQVZNQ09ERSBBU1NPQ0lBVElWRSBCSU5BUlkgRVhQUkVTU0lPTiBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkYgQXZtY29kZUFzc29jaWF0aXZlU3RyaW5nRXhwcmVzc2lvbkNvbXBpbGVyOjpjb21waWxlRXhwcmVzc2lvbigKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJT3BlcmF0b3IgKiBtYWluT3BlcmF0b3IgPSBhQ29kZS0+Z2V0T3BlcmF0b3IoKTsKKwlCRkNvZGUgbmV3Q29kZSggbWFpbk9wZXJhdG9yICk7CisKKwlCRiBhcmc7CisJQXZtQ29kZSAqIHBDb2RlOworCisJYUNUWCA9IGFDVFgtPmNsb25lKFR5cGVNYW5hZ2VyOjpTVFJJTkcpOworCisJQXZtQ29kZTo6aXRlcmF0b3IgaXRBcmcgPSBhQ29kZS0+YmVnaW4oKTsKKwlBdm1Db2RlOjppdGVyYXRvciBpdEVuZEFyZyA9IGFDb2RlLT5lbmQoKTsKKwlmb3IoIDsgaXRBcmcgIT0gaXRFbmRBcmcgOyArK2l0QXJnICkKKwl7CisJCWFyZyA9IEFWTUNPREVfQ09NUElMRVIuZGVjb2RlX2NvbXBpbGVFeHByZXNzaW9uKGFDVFgsICppdEFyZyk7CisKKwkJaWYoIGFyZy52YWxpZCgpICkKKwkJeworCQkJaWYoIChub3QgRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc1R5cGVkKFR5cGVNYW5hZ2VyOjpTVFJJTkcsIGFyZykpCisJCQkJCSYmIGFyZy5pc25vdDwgQnVpbHRpbkZvcm0gPigpICkKKwkJCXsKKwkJCQlhcmcgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0NUT1IsIFR5cGVNYW5hZ2VyOjpTVFJJTkcsIGFyZyk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlnZXRDb21waWxlclRhYmxlKCkuaW5jckVycm9yQ291bnQoKTsKKwkJCWFDVFgtPmVycm9yQ29udGV4dCggQVZNX09TX1dBUk4gKQorCQkJCQk8PCAiQXZtQ29kZTwgZXhwcmVzc2lvbiA+IGNvbXBpbGF0aW9uIGVycm9yIDw8ICIKKwkJCQkJPDwgKCppdEFyZykuc3RyKCkgPDwgIiA+PiIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKworCQkJbmV3Q29kZS0+YXBwZW5kKCBhcmcgKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYoIGFyZy5pczwgQXZtQ29kZSA+KCkgKQorCQl7CisJCQlwQ29kZSA9IGFyZy50b19wdHI8IEF2bUNvZGUgPigpOworCisJCQlpZiggcENvZGUtPmlzT3BlcmF0b3IoIG1haW5PcGVyYXRvciApICYmCisJCQkJbWFpbk9wZXJhdG9yLT5pc0Fzc29jaWF0aXZlKCkgKQorCQkJeworCQkJCW5ld0NvZGUtPmFwcGVuZCggcENvZGUtPmdldEFyZ3MoKSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW5ld0NvZGUtPmFwcGVuZCggYXJnICk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQluZXdDb2RlLT5hcHBlbmQoIGFyZyApOworCQl9CisJfQorCisJcmV0dXJuKCBuZXdDb2RlICk7Cit9CisKKworQkYgQXZtY29kZUFzc29jaWF0aXZlU3RyaW5nRXhwcmVzc2lvbkNvbXBpbGVyOjpvcHRpbWl6ZUV4cHJlc3Npb24oCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCU9wZXJhdG9yICogbWFpbk9wZXJhdG9yID0gYUNvZGUtPmdldE9wZXJhdG9yKCk7CisJQkZDb2RlIG5ld0NvZGUoIG1haW5PcGVyYXRvciApOworCisJQkYgYXJnOworCUF2bUNvZGUgKiBwQ29kZTsKKworCUF2bUNvZGU6Oml0ZXJhdG9yIGl0QXJnID0gYUNvZGUtPmJlZ2luKCk7CisJQXZtQ29kZTo6aXRlcmF0b3IgaXRFbmRBcmcgPSBhQ29kZS0+ZW5kKCk7CisKKwlBdm1JbnN0cnVjdGlvbiAqIGFyZ3NJbnN0cnVjdGlvbiA9IG5ld0NvZGUtPm5ld0VtcHR5SW5zdHJ1Y3Rpb24oKTsKKworCVZlY3RvcjwgQXZtQnl0ZWNvZGUgPiB2ZWN0b3JPZkFyZ09wY29kZTsKKworCWZvciggOyBpdEFyZyAhPSBpdEVuZEFyZyA7ICsraXRBcmcgKQorCXsKKwkJYXJnID0gQVZNQ09ERV9DT01QSUxFUi5kZWNvZGVfb3B0aW1pemVFeHByZXNzaW9uKGFDVFgsICppdEFyZyk7CisKKwkJaWYoIGFyZy5pbnZhbGlkKCkgKQorCQl7CisJCQlnZXRDb21waWxlclRhYmxlKCkuaW5jckVycm9yQ291bnQoKTsKKwkJCWFDVFgtPmVycm9yQ29udGV4dCggQVZNX09TX1dBUk4gKQorCQkJCQk8PCAiQXZtQ29kZTwgZXhwcmVzc2lvbiA+IG9wdGltaXphdGlvbiBlcnJvciA8PCAiCisJCQkJCTw8ICgqaXRBcmcpLnN0cigpIDw8ICIgPj4iIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisKKwkJCW5ld0NvZGUtPmFwcGVuZCggYXJnICk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmKCBhcmcuaXM8IEF2bUNvZGUgPigpICkKKwkJeworCQkJcENvZGUgPSBhcmcudG9fcHRyPCBBdm1Db2RlID4oKTsKKworCQkJaWYoIHBDb2RlLT5pc09wZXJhdG9yKCBtYWluT3BlcmF0b3IgKSAmJgorCQkJCW1haW5PcGVyYXRvci0+aXNBc3NvY2lhdGl2ZSgpICkKKwkJCXsKKwkJCQluZXdDb2RlLT5hcHBlbmQoIHBDb2RlLT5nZXRBcmdzKCkgKTsKKworCQkJCXZlY3Rvck9mQXJnT3Bjb2RlLmFwcGVuZCgKKwkJCQkJCXBDb2RlLT5nZXRJbnN0cnVjdGlvbigpLT5nZXRCeXRlY29kZSgpLCBwQ29kZS0+c2l6ZSgpKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQluZXdDb2RlLT5hcHBlbmQoIGFyZyApOworCisJCQkJaWYoIHBDb2RlLT5oYXNJbnN0cnVjdGlvbigpICkKKwkJCQl7CisJCQkJCXZlY3Rvck9mQXJnT3Bjb2RlLmFwcGVuZCggYXJnY29kZU9mRXhwcmVzc2lvbihhQ1RYLCBwQ29kZSkgKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJCQk8PCAiVW5leHBlY3RlZCBleHByZXNzaW9uIHdpdGhvdXQgYXJnY29kZSA8PCAiCisJCQkJCQkJPDwgcENvZGUtPnN0ckRlYnVnKCkgPDwgIiA+PiAhISEiCisJCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJCXZlY3Rvck9mQXJnT3Bjb2RlLmFwcGVuZCggQXZtQnl0ZWNvZGUoQVZNX0FSR19BUkdVTUVOVF9DVFgsCisJCQkJCQkJQVZNX0FSR19TRVZBTF9SVkFMVUUsIEFWTV9BUkdfRVhQUkVTU0lPTl9LSU5EKSApOworCQkJCX0KKwkJCQl2ZWN0b3JPZkFyZ09wY29kZS5iYWNrKCkuY29udGV4dCA9IEFWTV9BUkdfQVJHVU1FTlRfQ1RYOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJbmV3Q29kZS0+YXBwZW5kKCBhcmcgKTsKKworCQkJQXZtQnl0ZWNvZGUgYXJnT3Bjb2RlOworCQkJc2V0QXJnY29kZVJWYWx1ZShhQ1RYLCBhcmdPcGNvZGUsIGFyZywgZmFsc2UpOworCisJCQlhcmdPcGNvZGUuY29udGV4dCA9IEFWTV9BUkdfQVJHVU1FTlRfQ1RYOworCisJCQlpZiggKG5vdCBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzVHlwZWQoVHlwZU1hbmFnZXI6OlNUUklORywgYXJnKSkKKwkJCQkJJiYgYXJnLmlzPCBCdWlsdGluRm9ybSA+KCkgKQorCQkJeworCQkJCWFyZ09wY29kZS5wcm9jZXNzb3IgPSBBVk1fQVJHX1NUUklOR19DUFU7CisJCQl9CisKKwkJCXZlY3Rvck9mQXJnT3Bjb2RlLmFwcGVuZCggYXJnT3Bjb2RlICk7CisJCX0KKwl9CisKKwlhcmdzSW5zdHJ1Y3Rpb24tPnNldE1haW5CeXRlY29kZSgKKwkJCS8qY29udGV4dCAgKi8gQVZNX0FSR19SRVRVUk5fQ1RYLAorCQkJLypwcm9jZXNzb3IqLyBBVk1fQVJHX1NUUklOR19DUFUsCisJCQkvKm9wZXJhdGlvbiovIEFWTV9BUkdfU0VWQUxfUlZBTFVFLAorCQkJLypvcGVyYW5kICAqLyBBVk1fQVJHX0VYUFJFU1NJT05fS0lORCwKKwkJCS8qZHR5cGUgICAgKi8gVHlwZU1hbmFnZXI6OlNUUklORyApOworCisJYXJnc0luc3RydWN0aW9uLT5jb21wdXRlQnl0ZWNvZGUoIGZhbHNlICwgdmVjdG9yT2ZBcmdPcGNvZGUgKTsKKworCXJldHVybiggbmV3Q29kZSApOworfQorCisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlRXhwcmVzc2lvbkNvbXBpbGVyLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlRXhwcmVzc2lvbkNvbXBpbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNjNzRkMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVFeHByZXNzaW9uQ29tcGlsZXIuaApAQCAtMCwwICsxLDEyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDIgYXZyLiAyMDEzCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQVZNQ09ERUVYUFJFU1NJT05DT01QSUxFUl9IXworI2RlZmluZSBBVk1DT0RFRVhQUkVTU0lPTkNPTVBJTEVSX0hfCisKKyNpbmNsdWRlIDxidWlsZGVyL3ByaW1pdGl2ZS9BYnN0cmFjdEF2bWNvZGVDb21waWxlci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitBVk1DT0RFX0NPTVBJTEVSX0VYUFJFU1NJT05fT1BUSU1JWkVSX0NMQVNTX0hFQURFUigiQVJJVEhNRVRJQ19MT0dJQ19DUFUiLAorCQlFeHByZXNzaW9uQUxVLCBBYnN0cmFjdEF2bWNvZGVDb21waWxlcikKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBVTkFSWSBSVkFMVUUgQ09NUElMQVRJT04gU1RFUAorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlubGluZSBCRkNvZGUgY29tcGlsZVVuYXJ5UnZhbHVlKENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsCisJCQljb25zdCBCRkNvZGUgJiBhQ29kZSwgY29uc3QgVHlwZVNwZWNpZmllciAmIGFUeXBlKQorCXsKKwkJcmV0dXJuKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSggYUNvZGUtPmdldE9wZXJhdG9yKCksCisJCQkJY29tcGlsZUFyZ1J2YWx1ZShhQ1RYLCBhVHlwZSwgYUNvZGUtPmZpcnN0KCkpICkpOworCisJfQorCisJQkZDb2RlIG9wdGltaXplVW5hcnlSdmFsdWUoQ09NUElMRV9DT05URVhUICogYUNUWCwKKwkJCWNvbnN0IEJGQ29kZSAmIGFDb2RlLCBCYXNlVHlwZVNwZWNpZmllciAqIGFUeXBlLAorCQkJYXZtX2FyZ19wcm9jZXNzb3JfdCBhUHJvY2Vzc29yLCBCYXNlVHlwZVNwZWNpZmllciAqIG1haW5UeXBlKTsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIEJJTkFSWSBSVkFMVUUgQ09NUElMQVRJT04gU1RFUAorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlubGluZSBCRkNvZGUgY29tcGlsZUJpbmFyeVJ2YWx1ZSgKKwkJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlLAorCQkJY29uc3QgVHlwZVNwZWNpZmllciAmIGFUeXBlMSwgY29uc3QgVHlwZVNwZWNpZmllciAmIGFUeXBlMikKKwl7CisJCXJldHVybiggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoIGFDb2RlLT5nZXRPcGVyYXRvcigpLAorCQkJCWNvbXBpbGVBcmdSdmFsdWUoYUNUWCwgYVR5cGUxLCBhQ29kZS0+Zmlyc3QoKSksCisJCQkJY29tcGlsZUFyZ1J2YWx1ZShhQ1RYLCBhVHlwZTIsIGFDb2RlLT5zZWNvbmQoKSkgKSk7CisJfQorCisJQkZDb2RlIG9wdGltaXplQmluYXJ5UnZhbHVlKAorCQkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUsCisJCQlCYXNlVHlwZVNwZWNpZmllciAqIGFUeXBlMSwgQmFzZVR5cGVTcGVjaWZpZXIgKiBhVHlwZTIsCisJCQlhdm1fYXJnX3Byb2Nlc3Nvcl90IGFQcm9jZXNzb3IsIEJhc2VUeXBlU3BlY2lmaWVyICogbWFpblR5cGUpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQVNTT0NJQVRJVkUgUlZBTFVFIENPTVBJTEFUSU9OIFNURVAKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlCRkNvZGUgY29tcGlsZUFzc29jaWF0aXZlUnZhbHVlKENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsCisJCQljb25zdCBCRkNvZGUgJiBhQ29kZSwgQmFzZVR5cGVTcGVjaWZpZXIgKiBhVHlwZSk7CisKKwlCRkNvZGUgb3B0aW1pemVBc3NvY2lhdGl2ZVJ2YWx1ZShDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLAorCQkJY29uc3QgQkZDb2RlICYgYUNvZGUsIEJhc2VUeXBlU3BlY2lmaWVyICogYVR5cGUsCisJCQlhdm1fYXJnX3Byb2Nlc3Nvcl90IGFQcm9jZXNzb3IsIEJhc2VUeXBlU3BlY2lmaWVyICogbWFpblR5cGUpOworCit9OworCisKK0FWTUNPREVfQ09NUElMRVJfRVhQUkVTU0lPTl9PUFRJTUlaRVJfQ0xBU1MoIlVOQVJZX0FSSVRITUVUSUNfTE9HSUNfQ1BVIiwKKwkJVW5hcnlBcml0aG1ldGljRXhwcmVzc2lvbkFMVSwgQXZtY29kZUV4cHJlc3Npb25BTFVDb21waWxlcikKKworQVZNQ09ERV9DT01QSUxFUl9FWFBSRVNTSU9OX09QVElNSVpFUl9DTEFTUygiQklOQVJZX0FSSVRITUVUSUNfTE9HSUNfQ1BVIiwKKwkJQmluYXJ5QXJpdGhtZXRpY0V4cHJlc3Npb25BTFUsIEF2bWNvZGVFeHByZXNzaW9uQUxVQ29tcGlsZXIpCisKK0FWTUNPREVfQ09NUElMRVJfRVhQUkVTU0lPTl9PUFRJTUlaRVJfQ0xBU1MoIkFTU09DSUFUSVZFX0FSSVRITUVUSUNfTE9HSUNfQ1BVIiwKKwkJQXNzb2NpYXRpdmVBcml0aG1ldGljRXhwcmVzc2lvbkFMVSwgQXZtY29kZUV4cHJlc3Npb25BTFVDb21waWxlcikKKworCitBVk1DT0RFX0NPTVBJTEVSX0VYUFJFU1NJT05fT1BUSU1JWkVSX0NMQVNTKCJFWFBSRVNTSU9OI1JFTEFUSU9OQUwiLAorCQlSZWxhdGlvbmFsRXhwcmVzc2lvbiwgQXZtY29kZUV4cHJlc3Npb25BTFVDb21waWxlcikKKworCitBVk1DT0RFX0NPTVBJTEVSX0VYUFJFU1NJT05fT1BUSU1JWkVSX0NMQVNTKCJVTkFSWV9FWFBSRVNTSU9OI1BSRURJQ0FURSIsCisJCVVuYXJ5UHJlZGljYXRlRXhwcmVzc2lvbiwgQXZtY29kZUV4cHJlc3Npb25BTFVDb21waWxlcikKKworQVZNQ09ERV9DT01QSUxFUl9FWFBSRVNTSU9OX09QVElNSVpFUl9DTEFTUygiQklOQVJZX0VYUFJFU1NJT04jUFJFRElDQVRFIiwKKwkJQmluYXJ5UHJlZGljYXRlRXhwcmVzc2lvbiwgQXZtY29kZUV4cHJlc3Npb25BTFVDb21waWxlcikKKworQVZNQ09ERV9DT01QSUxFUl9FWFBSRVNTSU9OX09QVElNSVpFUl9DTEFTUygiQVNTT0NJQVRJVkVfRVhQUkVTU0lPTiNQUkVESUNBVEUiLAorCQlBc3NvY2lhdGl2ZVByZWRpY2F0ZUV4cHJlc3Npb24sIEF2bWNvZGVFeHByZXNzaW9uQUxVQ29tcGlsZXIpCisKKworQVZNQ09ERV9DT01QSUxFUl9FWFBSRVNTSU9OX09QVElNSVpFUl9DTEFTUygiVU5BUllfRVhQUkVTU0lPTiNCSVRXSVNFIiwKKwkJVW5hcnlCaXR3aXNlRXhwcmVzc2lvbiwgQXZtY29kZUV4cHJlc3Npb25BTFVDb21waWxlcikKKworQVZNQ09ERV9DT01QSUxFUl9FWFBSRVNTSU9OX09QVElNSVpFUl9DTEFTUygiQklOQVJZX0VYUFJFU1NJT04jQklUV0lTRSIsCisJCUJpbmFyeUJpdHdpc2VFeHByZXNzaW9uLCBBdm1jb2RlRXhwcmVzc2lvbkFMVUNvbXBpbGVyKQorCitBVk1DT0RFX0NPTVBJTEVSX0VYUFJFU1NJT05fT1BUSU1JWkVSX0NMQVNTKCJBU1NPQ0lBVElWRV9FWFBSRVNTSU9OI0JJVFdJU0UiLAorCQlBc3NvY2lhdGl2ZUJpdHdpc2VFeHByZXNzaW9uLCBBdm1jb2RlRXhwcmVzc2lvbkFMVUNvbXBpbGVyKQorCisKKworQVZNQ09ERV9DT01QSUxFUl9FWFBSRVNTSU9OX09QVElNSVpFUl9DTEFTUygiVU5BUllfRVhQUkVTU0lPTiNTVFJJTkciLAorCQlVbmFyeVN0cmluZ0V4cHJlc3Npb24sIEF2bWNvZGVFeHByZXNzaW9uQUxVQ29tcGlsZXIpCisKK0FWTUNPREVfQ09NUElMRVJfRVhQUkVTU0lPTl9PUFRJTUlaRVJfQ0xBU1MoIkJJTkFSWV9FWFBSRVNTSU9OI1NUUklORyIsCisJCUJpbmFyeVN0cmluZ0V4cHJlc3Npb24sIEF2bWNvZGVFeHByZXNzaW9uQUxVQ29tcGlsZXIpCisKK0FWTUNPREVfQ09NUElMRVJfRVhQUkVTU0lPTl9PUFRJTUlaRVJfQ0xBU1MoIkFTU09DSUFUSVZFX0VYUFJFU1NJT04jU1RSSU5HIiwKKwkJQXNzb2NpYXRpdmVTdHJpbmdFeHByZXNzaW9uLCBBdm1jb2RlRXhwcmVzc2lvbkFMVUNvbXBpbGVyKQorCisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisjZW5kaWYgLyogQVZNQ09ERUVYUFJFU1NJT05DT01QSUxFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZUdpbmFjQ29tcGlsZXIuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZUdpbmFjQ29tcGlsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MmY0NjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlR2luYWNDb21waWxlci5jcHAKQEAgLTAsMCArMSwyNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDEyIGF2ci4gMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQXZtY29kZUdpbmFjQ29tcGlsZXIuaCIKKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0F2bUNvZGUuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZUdpbmFjQ29tcGlsZXIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVHaW5hY0NvbXBpbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZiY2NjNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVHaW5hY0NvbXBpbGVyLmgKQEAgLTAsMCArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDEyIGF2ci4gMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEFWTUNPREVHSU5BQ0NPTVBJTEVSX0hfCisjZGVmaW5lIEFWTUNPREVHSU5BQ0NPTVBJTEVSX0hfCisKKyNpbmNsdWRlIDxidWlsZGVyL3ByaW1pdGl2ZS9BYnN0cmFjdEF2bWNvZGVDb21waWxlci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCit9CisKKyNlbmRpZiAvKiBBVk1DT0RFR0lOQUNDT01QSUxFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZUd1YXJkQ29tcGlsZXIuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZUd1YXJkQ29tcGlsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NzFiNDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlR3VhcmRDb21waWxlci5jcHAKQEAgLTAsMCArMSwyMTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyMCBtYWkgMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQXZtY29kZUd1YXJkQ29tcGlsZXIuaCIKKworI2luY2x1ZGUgPGJ1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVDb21waWxlci5oPgorCisjaW5jbHVkZSA8Y29tcHV0ZXIvaW5zdHJ1Y3Rpb24vQXZtSW5zdHJ1Y3Rpb24uaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0F2bUNvZGUuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uRmFjdG9yeS5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL1N0YXRlbWVudENvbnN0cnVjdG9yLmg+CisKKyNpbmNsdWRlIDxmbWwvdHlwZS9UeXBlTWFuYWdlci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQVZNQ09ERSBHVUFSRCBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkZDb2RlIEF2bWNvZGVHdWFyZENvbXBpbGVyOjpjb21waWxlU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlyZXR1cm4oIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKGFDb2RlLT5nZXRPcGVyYXRvcigpLAorCQkJY29tcGlsZUFyZ1J2YWx1ZShhQ1RYLCBUeXBlTWFuYWdlcjo6Qk9PTEVBTiwgYUNvZGUtPmZpcnN0KCkpKSApOworfQorCisKK0JGQ29kZSBBdm1jb2RlR3VhcmRDb21waWxlcjo6b3B0aW1pemVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCUF2bUluc3RydWN0aW9uICogYXJnc0luc3RydWN0aW9uID0gYUNvZGUtPmdlbkluc3RydWN0aW9uKCk7CisKKwlvcHRpbWl6ZUFyZ0V4cHJlc3Npb24oYUNUWCwgYUNvZGUsIDApOworCWFyZ3NJbnN0cnVjdGlvbi0+YXQoMCkuZHR5cGUgPSBUeXBlTWFuYWdlcjo6Qk9PTEVBTjsKKwlzZXRBcmdjb2RlUlZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMCksIGFDb2RlLT5maXJzdCgpKTsKKworCWFyZ3NJbnN0cnVjdGlvbi0+Y29tcHV0ZU1haW5CeXRlY29kZSgwKTsKKworCisJdHJpdmlhbEFzc2lnbm1lbnRzU2VxdWVuY2UuY2xlYXIoKTsKKworCUV4cHJlc3Npb25GYWN0b3J5OjpkZWR1Y2VUcml2aWFsQXNzaWdubWVudHNGcm9tQ29uam9uY3Rpb24oCisJCQlhQ29kZS0+Zmlyc3QoKSwgdHJpdmlhbEFzc2lnbm1lbnRzU2VxdWVuY2UpOworCWlmKCB0cml2aWFsQXNzaWdubWVudHNTZXF1ZW5jZS5ub25lbXB0eSgpICkKKwl7CisJCWJvb2wgc2F2ZU5lZWRUeXBlQ2hlY2tpbmdTdGF0ZSA9IGFDVFgtPm1OZWVkVHlwZUNoZWNraW5nOworCQlhQ1RYLT5tTmVlZFR5cGVDaGVja2luZyA9IGZhbHNlOworCisJCW9wdGltaXplQXJnU3RhdGVtZW50KGFDVFgsIHRyaXZpYWxBc3NpZ25tZW50c1NlcXVlbmNlKTsKKworCQlhQ1RYLT5tTmVlZFR5cGVDaGVja2luZyA9IHNhdmVOZWVkVHlwZUNoZWNraW5nU3RhdGU7CisKK0FWTV9JRl9ERUJVR19GTEFHMl9BTkQoIENPTVBVVElORyAsIFNUQVRFTUVOVCAsCisJQVZNX0RFQlVHX0xFVkVMX09SX0ZMQUcoSElHSCAsIFRFU1RfREVDSVNJT04pICkKKwkJdHJpdmlhbEFzc2lnbm1lbnRzU2VxdWVuY2UuYXBwZW5kKAorCQkJCVN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb21tZW50KCJlbmQ8Z3VhcmQ+IikgKTsKK0FWTV9FTkRJRl9ERUJVR19GTEFHMl9BTkQoIENPTVBVVElORyAsIFNUQVRFTUVOVCApCisKKwkJcmV0dXJuKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FUT01JQ19TRVFVRU5DRSwKKwkJCQlhQ29kZSwgdHJpdmlhbEFzc2lnbm1lbnRzU2VxdWVuY2UpICk7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiggYUNvZGUgKTsKKwl9Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQVZNQ09ERSBUSU1FRCBHVUFSRCBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkZDb2RlIEF2bWNvZGVUaW1lZEd1YXJkQ29tcGlsZXI6OmNvbXBpbGVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCXJldHVybiggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoYUNvZGUtPmdldE9wZXJhdG9yKCksCisJCQljb21waWxlQXJnUnZhbHVlKGFDVFgsIFR5cGVNYW5hZ2VyOjpCT09MRUFOLCBhQ29kZS0+Zmlyc3QoKSkpICk7Cit9CisKK0JGQ29kZSBBdm1jb2RlVGltZWRHdWFyZENvbXBpbGVyOjpvcHRpbWl6ZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJQXZtSW5zdHJ1Y3Rpb24gKiBhcmdzSW5zdHJ1Y3Rpb24gPSBhQ29kZS0+Z2VuSW5zdHJ1Y3Rpb24oKTsKKworCW9wdGltaXplQXJnRXhwcmVzc2lvbihhQ1RYLCBhQ29kZSwgMCk7CisJYXJnc0luc3RydWN0aW9uLT5hdCgwKS5kdHlwZSA9IFR5cGVNYW5hZ2VyOjpCT09MRUFOOworCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdCgwKSwgYUNvZGUtPmZpcnN0KCkpOworCisJYXJnc0luc3RydWN0aW9uLT5jb21wdXRlTWFpbkJ5dGVjb2RlKDApOworCisKKwl0cml2aWFsQXNzaWdubWVudHNTZXF1ZW5jZS5jbGVhcigpOworCisJRXhwcmVzc2lvbkZhY3Rvcnk6OmRlZHVjZVRyaXZpYWxBc3NpZ25tZW50c0Zyb21Db25qb25jdGlvbigKKwkJCWFDb2RlLT5maXJzdCgpLCB0cml2aWFsQXNzaWdubWVudHNTZXF1ZW5jZSk7CisJaWYoIHRyaXZpYWxBc3NpZ25tZW50c1NlcXVlbmNlLm5vbmVtcHR5KCkgKQorCXsKKwkJb3B0aW1pemVBcmdTdGF0ZW1lbnQoYUNUWCwgdHJpdmlhbEFzc2lnbm1lbnRzU2VxdWVuY2UpOworCitBVk1fSUZfREVCVUdfRkxBRzJfQU5EKCBDT01QVVRJTkcgLCBTVEFURU1FTlQgLAorCUFWTV9ERUJVR19MRVZFTF9PUl9GTEFHKEhJR0ggLCBURVNUX0RFQ0lTSU9OKSApCisJCXRyaXZpYWxBc3NpZ25tZW50c1NlcXVlbmNlLmFwcGVuZCgKKwkJCQlTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29tbWVudCgiZW5kPGd1YXJkPiIpICk7CitBVk1fRU5ESUZfREVCVUdfRkxBRzJfQU5EKCBDT01QVVRJTkcgLCBTVEFURU1FTlQgKQorCisJCXJldHVybiggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BVE9NSUNfU0VRVUVOQ0UsCisJCQkJYUNvZGUsIHRyaXZpYWxBc3NpZ25tZW50c1NlcXVlbmNlKSApOworCX0KKwllbHNlCisJeworCQlyZXR1cm4oIGFDb2RlICk7CisJfQorfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIEVWRU5UIENPTVBJTEFUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitCRkNvZGUgQXZtY29kZUV2ZW50Q29tcGlsZXI6OmNvbXBpbGVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCXJldHVybiggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoYUNvZGUtPmdldE9wZXJhdG9yKCksCisJCQljb21waWxlQXJnUnZhbHVlKGFDVFgsIFR5cGVNYW5hZ2VyOjpCT09MRUFOLCBhQ29kZS0+Zmlyc3QoKSkpICk7Cit9CisKK0JGQ29kZSBBdm1jb2RlRXZlbnRDb21waWxlcjo6b3B0aW1pemVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCUF2bUluc3RydWN0aW9uICogYXJnc0luc3RydWN0aW9uID0gYUNvZGUtPmdlbkluc3RydWN0aW9uKCk7CisKKwlvcHRpbWl6ZUFyZ0V4cHJlc3Npb24oYUNUWCwgYUNvZGUsIDApOworCWFyZ3NJbnN0cnVjdGlvbi0+YXQoMCkuZHR5cGUgPSBUeXBlTWFuYWdlcjo6Qk9PTEVBTjsKKwlzZXRBcmdjb2RlUlZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMCksIGFDb2RlLT5maXJzdCgpKTsKKworCWFyZ3NJbnN0cnVjdGlvbi0+Y29tcHV0ZU1haW5CeXRlY29kZSgwKTsKKworCXJldHVybiggYUNvZGUgKTsKK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIENIRUNLU0FUIENPTVBJTEFUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitCRkNvZGUgQXZtY29kZUNoZWNrc2F0Q29tcGlsZXI6OmNvbXBpbGVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCWlmKCBhQ29kZS0+cG9wdWxhdGVkKCkgKQorCXsKKwkJcmV0dXJuKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZShhQ29kZS0+Z2V0T3BlcmF0b3IoKSwKKwkJCQljb21waWxlQXJnUnZhbHVlKGFDVFgsIFR5cGVNYW5hZ2VyOjpTVFJJTkcsIGFDb2RlLT5maXJzdCgpKSwKKwkJCQljb21waWxlQXJnUnZhbHVlKGFDVFgsIFR5cGVNYW5hZ2VyOjpCT09MRUFOLCBhQ29kZS0+c2Vjb25kKCkpICkpOworCX0KKwllbHNlCisJeworCQlyZXR1cm4oIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKGFDb2RlLT5nZXRPcGVyYXRvcigpLAorCQkJCWNvbXBpbGVBcmdSdmFsdWUoYUNUWCwgVHlwZU1hbmFnZXI6OkJPT0xFQU4sIGFDb2RlLT5maXJzdCgpKSkgKTsKKwl9Cit9CisKK0JGQ29kZSBBdm1jb2RlQ2hlY2tzYXRDb21waWxlcjo6b3B0aW1pemVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCUF2bUluc3RydWN0aW9uICogYXJnc0luc3RydWN0aW9uID0gYUNvZGUtPmdlbkluc3RydWN0aW9uKCk7CisKKwlpZiggYUNvZGUtPnBvcHVsYXRlZCgpICkKKwl7CisJCWFyZ3NJbnN0cnVjdGlvbi0+YXQoMCkuZHR5cGUgPSBUeXBlTWFuYWdlcjo6U1RSSU5HOworCQlzZXRBcmdjb2RlUlZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMCksIGFDb2RlLT5maXJzdCgpKTsKKworCQlvcHRpbWl6ZUFyZ0V4cHJlc3Npb24oYUNUWCwgYUNvZGUsIDEpOworCQlhcmdzSW5zdHJ1Y3Rpb24tPmF0KDEpLmR0eXBlID0gVHlwZU1hbmFnZXI6OkJPT0xFQU47CisJCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdCgxKSwgYUNvZGUtPnNlY29uZCgpKTsKKwl9CisJZWxzZQorCXsKKwkJb3B0aW1pemVBcmdFeHByZXNzaW9uKGFDVFgsIGFDb2RlLCAwKTsKKwkJYXJnc0luc3RydWN0aW9uLT5hdCgwKS5kdHlwZSA9IFR5cGVNYW5hZ2VyOjpCT09MRUFOOworCQlzZXRBcmdjb2RlUlZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMCksIGFDb2RlLT5maXJzdCgpKTsKKwl9CisKKwlhcmdzSW5zdHJ1Y3Rpb24tPmNvbXB1dGVNYWluQnl0ZWNvZGUoCisJCQkvKmNvbnRleHQgICovIEFWTV9BUkdfU1RBTkRBUkRfQ1RYLAorCQkJLypwcm9jZXNzb3IqLyBBVk1fQVJHX1NUQVRFTUVOVF9DUFUsCisJCQkvKm9wZXJhdGlvbiovIEFWTV9BUkdfU0VWQUxfUlZBTFVFLAorCQkJLypvcGVyYW5kICAqLyBBVk1fQVJHX1NUQVRFTUVOVF9LSU5ELAorCQkJLypkdHlwZSAgICAqLyBUeXBlTWFuYWdlcjo6Qk9PTEVBTik7CisKKwlyZXR1cm4oIGFDb2RlICk7Cit9CisKKworCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVHdWFyZENvbXBpbGVyLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlR3VhcmRDb21waWxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNmEwMTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlR3VhcmRDb21waWxlci5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyMCBtYWkgMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEFWTUNPREVHVUFSRENPTVBJTEVSX0hfCisjZGVmaW5lIEFWTUNPREVHVUFSRENPTVBJTEVSX0hfCisKKyNpbmNsdWRlIDxidWlsZGVyL3ByaW1pdGl2ZS9BYnN0cmFjdEF2bWNvZGVDb21waWxlci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitBVk1DT0RFX0NPTVBJTEVSX1NUQVRFTUVOVF9PUFRJTUlaRVJfQ0xBU1NfSEVBREVSKAorCQkiR1VBUkQiLCBHdWFyZCwgQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXIpCitwcm90ZWN0ZWQ6CisJQkZDb2RlTGlzdCB0cml2aWFsQXNzaWdubWVudHNTZXF1ZW5jZTsKK307CisKKworQVZNQ09ERV9DT01QSUxFUl9TVEFURU1FTlRfT1BUSU1JWkVSX0NMQVNTX0hFQURFUigKKwkJIlRJTUVEX0dVQVJEIiwgVGltZWRHdWFyZCwgQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXIpCitwcm90ZWN0ZWQ6CisJQkZDb2RlTGlzdCB0cml2aWFsQXNzaWdubWVudHNTZXF1ZW5jZTsKK307CisKKworQVZNQ09ERV9DT01QSUxFUl9TVEFURU1FTlRfT1BUSU1JWkVSX0NMQVNTKAorCQkiRVZFTlQiLCBFdmVudCwgQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXIpCisKKworQVZNQ09ERV9DT01QSUxFUl9TVEFURU1FTlRfT1BUSU1JWkVSX0NMQVNTKAorCQkiQ0hFQ0tTQVQiLCBDaGVja3NhdCwgQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXIpCisKKworfQorCisjZW5kaWYgLyogQVZNQ09ERUdVQVJEQ09NUElMRVJfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVJbnZva2VDb21waWxlci5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlSW52b2tlQ29tcGlsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNTA3MzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlSW52b2tlQ29tcGlsZXIuY3BwCkBAIC0wLDAgKzEsNTU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTIgYXZyLiAyMDExCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJBdm1jb2RlSW52b2tlQ29tcGlsZXIuaCIKKworI2luY2x1ZGUgPHBhcnNlci9tb2RlbC9QYXJzZXJVdGlsLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9Bdm1MYW1iZGEuaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9Bdm1Qcm9ncmFtLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvQXZtVHJhbnNpdGlvbi5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVGb3JtLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9Bdm1Db2RlLmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkNvbnN0cnVjdG9yLmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vU3RhdGVtZW50Q29uc3RydWN0b3IuaD4KKworI2luY2x1ZGUgPGZtbC9saWIvQXZtT3BlcmF0aW9uRmFjdG9yeS5oPgorCisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yTWFuYWdlci5oPgorCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL01hY2hpbmUuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFWTUNPREUgSU5WT0tFIE5FVyBJTlNUQU5DRSBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkYgQXZtY29kZUludm9rZU5ld0NvbXBpbGVyOjpjb21waWxlRXhwcmVzc2lvbigKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJcmV0dXJuKCBBYnN0cmFjdEF2bWNvZGVDb21waWxlcjo6Y29tcGlsZUV4cHJlc3Npb25Db2RlKGFDVFgsIGFDb2RlKSApOworCisvL1tSRUdSRVNTSU9OXSFUT0RPCisvLwlyZXR1cm4oIGNvbXBpbGVTdGF0ZW1lbnQoYUNUWCwgYUNvZGUpICk7Cit9CisKKworQkYgQXZtY29kZUludm9rZU5ld0NvbXBpbGVyOjpvcHRpbWl6ZUV4cHJlc3Npb24oCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworLy9bUkVHUkVTU0lPTl0hVE9ETworLy8JQkZDb2RlIG5ld0NvZGUgPSBvcHRpbWl6ZVN0YXRlbWVudChhQ1RYLCBhQ29kZSk7CisvLworLy8JbmV3Q29kZS0+Z2V0SW5zdHJ1Y3Rpb24oKS0+c2V0TWFpbkJ5dGVjb2RlKAorLy8JCQkvKmNvbnRleHQgICovIEFWTV9BUkdfUkVUVVJOX0NUWCwKKy8vCQkJLypwcm9jZXNzb3IqLyBBVk1fQVJHX01FTU9SWV9NQUNISU5FX0NQVSwKKy8vCQkJLypvcGVyYXRpb24qLyBBVk1fQVJHX1NFVkFMX1JWQUxVRSwKKy8vCQkJLypvcGVyYW5kICAqLyBBVk1fQVJHX0VYUFJFU1NJT05fS0lORCwKKy8vCQkJLypkdHlwZSAgICAqLyBuZXdDb2RlLT5nZXRJbnN0cnVjdGlvbigpLT5hdCgwKS5kdHlwZSk7CisvLworLy8JcmV0dXJuKCBhQ29kZSApOworCisKKwlCRkNvZGUgb3B0aW1pemVkQ29kZSggYUNvZGUtPmdldE9wZXJhdG9yKCkgKTsKKworCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYUNvZGUtPmJlZ2luKCk7CisJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBhQ29kZS0+ZW5kKCk7CisKKwlBdm1JbnN0cnVjdGlvbiAqIGFyZ3NJbnN0cnVjdGlvbiA9CisJCQlvcHRpbWl6ZWRDb2RlLT5uZXdJbnN0cnVjdGlvbiggYUNvZGUtPnNpemUoKSApOworCisJSW5zdGFuY2VPZk1hY2hpbmUgKiBkeW5hbWljSW5zdGFuY2UgPSBOVUxMOworCisJQkYgYXJnID0gKCppdCk7CisKKwlvcHRpbWl6ZWRDb2RlLT5hcHBlbmQoIGFyZyApOworCisJaWYoIGFyZy5pczwgSW5zdGFuY2VPZk1hY2hpbmUgPigpICkKKwl7CisJCWR5bmFtaWNJbnN0YW5jZSA9IGFyZy50b19wdHI8IEluc3RhbmNlT2ZNYWNoaW5lID4oKTsKKworCQlhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLnNldCgKKwkJCQkvKmNvbnRleHQgICovIEFWTV9BUkdfQVJHVU1FTlRfQ1RYLAorCQkJCS8qcHJvY2Vzc29yKi8gQVZNX0FSR19OT1BfQ1BVLAorCQkJCS8qb3BlcmF0aW9uKi8gQVZNX0FSR19OT1BfUlZBTFVFLAorCQkJCS8qb3BlcmFuZCAgKi8gQVZNX0FSR19NQUNISU5FX1JJRCwKKwkJCQkvKnR5cGUgICAgICovIGR5bmFtaWNJbnN0YW5jZS0+Z2V0VHlwZVNwZWNpZmllcigpCisJCQkJKTsKKwl9CisJZWxzZQorCXsKKwkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JFcnJvckNvdW50KCk7CisJCWFDVFgtPmVycm9yQ29udGV4dCggQVZNX09TX1dBUk4gKQorCQkJCTw8ICJvcHRpbWl6ZVN0YXRlbWVudCA6PiBVbmV4cGVjdGVkIDw8ICIgPDwgc3RyX2hlYWRlciggYXJnICkKKwkJCQk8PCAiID4+ICBhcyBpbnZva2UjbmV3IGZpcnN0IGFyZ3VtZW50IGluIDw8ICIKKwkJCQk8PCBhQ29kZS0+c3RyKCkgPDwgIiA+PiAhISEiIDw8IHN0ZDo6ZW5kbDsKKworCQlyZXR1cm4oIGFDb2RlICk7CisJfQorCisJYXZtX3NpemVfdCBwYXJhbUNvdW50ID0gZHluYW1pY0luc3RhbmNlLT5nZXRQYXJhbUNvdW50KCk7CisJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDEgOworCQkJKCsraXQgIT0gZW5kSXQpICYmIChvZmZzZXQgPD0gcGFyYW1Db3VudCkgOyArK29mZnNldCApCisJeworCQlhcmcgPSBBVk1DT0RFX0NPTVBJTEVSLmRlY29kZV9vcHRpbWl6ZUV4cHJlc3Npb24oYUNUWCwgKCppdCkpOworCQlvcHRpbWl6ZWRDb2RlLT5hcHBlbmQoIGFyZyApOworCisJCWFyZ3NJbnN0cnVjdGlvbi0+YXQob2Zmc2V0KS5kdHlwZSA9CisJCQkJZHluYW1pY0luc3RhbmNlLT5nZXRQYXJhbVR5cGUoIG9mZnNldC0xICk7CisJCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdChvZmZzZXQpLCBhcmcpOworCX0KKworCWFyZ3NJbnN0cnVjdGlvbi0+Y29tcHV0ZU1haW5CeXRlY29kZSgKKwkJCS8qY29udGV4dCAgKi8gQVZNX0FSR19BUkdVTUVOVF9DVFgsCisJCQkvKnByb2Nlc3NvciovIEFWTV9BUkdfTUVNT1JZX01BQ0hJTkVfQ1BVLAorCQkJLypvcGVyYXRpb24qLyBBVk1fQVJHX1NFVkFMX1JWQUxVRSwKKwkJCS8qb3BlcmFuZCAgKi8gQVZNX0FSR19FWFBSRVNTSU9OX0tJTkQpOworCisJcmV0dXJuKCBvcHRpbWl6ZWRDb2RlICk7CisKK30KKworCitCRkNvZGUgQXZtY29kZUludm9rZU5ld0NvbXBpbGVyOjpjb21waWxlU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlpZiggYUNvZGUtPnNpemUoKSAhPSAxICkKKwl7CisJCWdldENvbXBpbGVyVGFibGUoKS5pbmNyRXJyb3JDb3VudCgpOworCQlhQ1RYLT5lcnJvckNvbnRleHQoIEFWTV9PU19XQVJOICkKKwkJCQk8PCAiVW5leHBlY3RlZCBJTlZPS0UjTkVXIHdpdGhvdXQgb25seSBvbmUgcnVubmFibGUgIgorCQkJCQkiI2R5bmFtaWMgaW5zdGFuY2UgbWFjaGluZSAhISEiCisJCQkJPDwgc3RkOjplbmRsIDw8IGFDb2RlLnRvU3RyaW5nKCkKKwkJCQk8PCBTRU5EX0VYSVQ7CisJfQorCisJQkZDb2RlIG5ld0NvZGUgPSBBYnN0cmFjdEF2bWNvZGVDb21waWxlcjo6Y29tcGlsZUV4cHJlc3Npb25Db2RlKGFDVFgsIGFDb2RlKTsKKworCWNvbnN0IEJGICYgYXJnID0gbmV3Q29kZS0+Zmlyc3QoKTsKKwlpZiggYXJnLmlzPCBJbnN0YW5jZU9mTWFjaGluZSA+KCkgKQorCXsKKwkJaWYoIGFyZy50b19wdHI8IEluc3RhbmNlT2ZNYWNoaW5lID4oKS0+CisJCQkJZ2V0U3BlY2lmaWVyKCkuaXNEZXNpZ25JbnN0YW5jZUR5bmFtaWMoKSApCisJCXsKKy8vISFbTUlHUkFUSU9OXTogc2VlIENvbXBpbGVyOjpwcmVjb21waWxlRXhlY3V0YWJsZUluc3RhbmNlRHluYW1pcXVlKC4uLikKKy8vCQkJbW9kZWxNYWNoaW5lLT5pbmNyUG9zc2libGVEeW5hbWljSW5zdGFuY2lhdGlvbkNvdW50KDEpOworCQl9CisJCWVsc2UKKwkJeworCQkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JFcnJvckNvdW50KCk7CisJCQlhQ1RYLT5lcnJvckNvbnRleHQoIEFWTV9PU19XQVJOICkKKwkJCQkJPDwgIlVuZXhwZWN0ZWQgSU5WT0tFI05FVyB3aXRoIG9uZSBydW5uYWJsZSAiCisJCQkJCQkiI2R5bmFtaWMgaW5zdGFuY2UgbWFjaGluZSAhISEiCisJCQkJCTw8IHN0ZDo6ZW5kbCA8PCBuZXdDb2RlLnRvU3RyaW5nKCkKKwkJCQkJPDwgU0VORF9FWElUOworCQl9CisJfQorCWVsc2UKKwl7CisJCWdldENvbXBpbGVyVGFibGUoKS5pbmNyRXJyb3JDb3VudCgpOworCQlhQ1RYLT5lcnJvckNvbnRleHQoIEFWTV9PU19XQVJOICkKKwkJCQk8PCAiVW5leHBlY3RlZCBJTlZPS0UjTkVXIHdpdGhvdXQgb25lICIKKwkJCQkJCSJydW5uYWJsZSAjZHluYW1pYyAjaW5zdGFuY2UgbWFjaGluZSAhISEiCisJCQkJPDwgc3RkOjplbmRsIDw8IG5ld0NvZGUudG9TdHJpbmcoKQorCQkJCTw8IFNFTkRfRVhJVDsKKwl9CisKKwlyZXR1cm4oIG5ld0NvZGUgKTsKK30KKworCitCRkNvZGUgQXZtY29kZUludm9rZU5ld0NvbXBpbGVyOjpvcHRpbWl6ZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJY29uc3QgQkYgJiBhcmcgPSBhQ29kZS0+Zmlyc3QoKTsKKwlpZiggYXJnLmlzPCBJbnN0YW5jZU9mTWFjaGluZSA+KCkKKwkJJiYgYXJnLnRvX3B0cjwgSW5zdGFuY2VPZk1hY2hpbmUgPigpLT4KKwkJCQlnZXRTcGVjaWZpZXIoKS5pc0Rlc2lnbkluc3RhbmNlRHluYW1pYygpICkKKwl7CisJCUF2bUluc3RydWN0aW9uICogYXJnc0luc3RydWN0aW9uID0gYUNvZGUtPm5ld0luc3RydWN0aW9uKCBhQ29kZS0+c2l6ZSgpICk7CisKKwkJSW5zdGFuY2VPZk1hY2hpbmUgKiBkeW5hbWljSW5zdGFuY2UgPSBhcmcudG9fcHRyPCBJbnN0YW5jZU9mTWFjaGluZSA+KCk7CisKKwkJYXJnc0luc3RydWN0aW9uLT5hdCgwKS5zZXQoCisJCQkJLypjb250ZXh0ICAqLyBBVk1fQVJHX0FSR1VNRU5UX0NUWCwKKwkJCQkvKnByb2Nlc3NvciovIEFWTV9BUkdfTk9QX0NQVSwKKwkJCQkvKm9wZXJhdGlvbiovIEFWTV9BUkdfTk9QX1JWQUxVRSwKKwkJCQkvKm9wZXJhbmQgICovIEFWTV9BUkdfTUFDSElORV9SSUQsCisJCQkJLyp0eXBlICAgICAqLyBkeW5hbWljSW5zdGFuY2UtPmdldFR5cGVTcGVjaWZpZXIoKQorCQkJCSk7CisKKwkJYXJnc0luc3RydWN0aW9uLT5zZXRNYWluQnl0ZWNvZGUoCisJCQkJLypjb250ZXh0ICAqLyBBVk1fQVJHX1NUQU5EQVJEX0NUWCwKKwkJCQkvKnByb2Nlc3NvciovIEFWTV9BUkdfTk9QU19DUFUsCisJCQkJLypvcGVyYXRpb24qLyBBVk1fQVJHX05PUFNfUlZBTFVFLAorCQkJCS8qb3BlcmFuZCAgKi8gQVZNX0FSR19TVEFURU1FTlRfS0lORCwKKwkJCQkvKmR0eXBlICAgICovIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMCkuZHR5cGUpOworCX0KKwllbHNlCisJeworCQlnZXRDb21waWxlclRhYmxlKCkuaW5jckVycm9yQ291bnQoKTsKKwkJYUNUWC0+ZXJyb3JDb250ZXh0KCBBVk1fT1NfV0FSTiApCisJCQkJPDwgIm9wdGltaXplU3RhdGVtZW50OiBVbmV4cGVjdGVkIHN0YXRlbWVudCA8PCBpbnZva2UjbmV3ID4+ICIKKwkJCQkJCSJhcmd1bWVudCAhISFcblx0IiA8PCBzdHJfaGVhZGVyKCBhcmcgKQorCQkJCTw8IHN0ZDo6ZW5kbCA8PCB0b19zdHJlYW0oIGFDb2RlICkgPDwgc3RkOjplbmRsOworCisJCXJldHVybiggYUNvZGUgKTsKKwl9CisKKwlyZXR1cm4oIGFDb2RlICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFWTUNPREUgSU5WT0tFIFJPVVRJTkUgQ09NUElMQVRJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0JGIEF2bWNvZGVJbnZva2VSb3V0aW5lQ29tcGlsZXI6OmNvbXBpbGVFeHByZXNzaW9uKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlyZXR1cm4oIGNvbXBpbGVTdGF0ZW1lbnQoYUNUWCwgYUNvZGUpICk7Cit9CisKK0JGQ29kZSBBdm1jb2RlSW52b2tlUm91dGluZUNvbXBpbGVyOjpjb21waWxlU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKy8vCWlmKCBhQ29kZS0+c2luZ2xldG9uICYmICBhQ29kZS0+Zmlyc3QoKS5pczwgUm91dGluZSA+KCkgKQorLy8JeworLy8JCXJldHVybiggUGFyc2VyVXRpbDo6aW52b2tlUm91dGluZUV4cHJlc3Npb24oCisvLwkJCQlhQ29kZS0+Zmlyc3QoKS50b19wdHI8IFJvdXRpbmUgPigpICkgKTsKKy8vCX0KKy8vCWVsc2UKKwlpZiggYUNvZGUtPnNpemUoKSA8IDIgKQorCXsKKwkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JFcnJvckNvdW50KCk7CisJCWFDVFgtPmVycm9yQ29udGV4dCggQVZNX09TX1dBUk4gKQorCQkJCTw8ICJFeHBlY3RlZCBpbnZva2FibGUgZXhwcmVzc2lvbiBsaWtlICIKKwkJCQkJIig6IGZvcm0gaW52b2thYmxlIC4uLikgPDwgIiA8PCBhQ29kZS5zdHIoKSA8PCAiID4+IgorCQkJCTw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisKKwkJcmV0dXJuKCBBYnN0cmFjdEF2bWNvZGVDb21waWxlcjo6Y29tcGlsZVN0YXRlbWVudChhQ1RYLCBhQ29kZSkgKTsKKwl9CisKKwlCRkNvZGUgbmV3Q29kZTsKKworCUJGIGFyZyA9IEFWTUNPREVfQ09NUElMRVIuZGVjb2RlX2NvbXBpbGVTdGF0ZW1lbnQoYUNUWCwgYUNvZGUtPmZpcnN0KCkpOworCWlmKCBhcmcuaW52YWxpZCgpICkKKwl7CisJCWdldENvbXBpbGVyVGFibGUoKS5pbmNyRXJyb3JDb3VudCgpOworCQlhQ1RYLT5lcnJvckNvbnRleHQoIEFWTV9PU19XQVJOICkKKwkJCQk8PCAiQXZtQ29kZTwgc3RhdGVtZW50ID4gY29tcGlsYXRpb24gZXJyb3IgPDwgKDogIgorCQkJCTw8IGFDb2RlLT5maXJzdCgpLnN0cigpIDw8ICIgLi4uKSA+PiIKKwkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCisJCXJldHVybiggYUNvZGUgKTsKKwl9CisKKworCWlmKCBhQ29kZS0+c2Vjb25kKCkuaXM8IE9wZXJhdG9yID4oKSApCisJeworCQluZXdDb2RlID0gU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJYUNvZGUtPnNlY29uZCgpLnRvX3B0cjwgT3BlcmF0b3IgPigpLCBhcmcpOworCX0KKwllbHNlIGlmKCBhQ29kZS0+c2Vjb25kKCkuaXNJZGVudGlmaWVyKCkgKQorCXsKKwkJT3BlcmF0b3IgKiBvcCA9IEF2bU9wZXJhdGlvbkZhY3Rvcnk6OmdldChhcmcsCisJCQkJYUNvZGUtPnNlY29uZCgpLnRvSWRlbnRpZmllcigpKTsKKwkJaWYoIG9wICE9IE5VTEwgKQorCQl7CisJCQluZXdDb2RlID0gU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUob3AsIGFyZyk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlnZXRDb21waWxlclRhYmxlKCkuaW5jckVycm9yQ291bnQoKTsKKwkJCWFDVFgtPmVycm9yQ29udGV4dCggQVZNX09TX1dBUk4gKQorCQkJCQk8PCAiQXZtQ29kZTwgc3RhdGVtZW50ID4gY29tcGlsYXRpb24gZXJyb3IgPDwgKDogIgorCQkJCQk8PCBhcmcuc3RyKCkgPDwgIiAiIDw8IGFDb2RlLT5zZWNvbmQoKS5zdHIoKSA8PCAgIiAuLi4pID4+IgorCQkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCisJCQlyZXR1cm4oIGFDb2RlICk7CisJCX0KKwl9CisKKwlBdm1Db2RlOjppdGVyYXRvciBpdEFyZyA9IGFDb2RlLT5iZWdpbigpICsgMjsKKwlBdm1Db2RlOjppdGVyYXRvciBpdEVuZEFyZyA9IGFDb2RlLT5lbmQoKTsKKwlmb3IoIDsgaXRBcmcgIT0gaXRFbmRBcmcgOyArK2l0QXJnICkKKwl7CisJCWFyZyA9IEFWTUNPREVfQ09NUElMRVIuZGVjb2RlX2NvbXBpbGVTdGF0ZW1lbnQoYUNUWCwgKml0QXJnKTsKKworCQlpZiggYXJnLnZhbGlkKCkgKQorCQl7CisJCQluZXdDb2RlLT5hcHBlbmQoIGFyZyApOworCQl9CisJCWVsc2UKKwkJeworCQkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JFcnJvckNvdW50KCk7CisJCQlhQ1RYLT5lcnJvckNvbnRleHQoIEFWTV9PU19XQVJOICkKKwkJCQkJPDwgIkF2bUNvZGU8IHN0YXRlbWVudCA+IGNvbXBpbGF0aW9uIGVycm9yIDw8ICIKKwkJCQkJPDwgKCppdEFyZykuc3RyKCkgPDwgIiA+PiIKKwkJCQkJPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKworCQkJbmV3Q29kZS0+YXBwZW5kKCAqaXRBcmcgKTsKKwkJCWNvbnRpbnVlOworCQl9CisJfQorCisJcmV0dXJuKCBuZXdDb2RlICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFWTUNPREUgSU5WT0tFIFRSQU5TSVRJT04gQ09NUElMQVRJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0JGQ29kZSBBdm1jb2RlSW52b2tlVHJhbnNpdGlvbkNvbXBpbGVyOjpjb21waWxlU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlpZiggYUNvZGUtPnNpemUoKSAhPSAxICkKKwl7CisJCWdldENvbXBpbGVyVGFibGUoKS5pbmNyRXJyb3JDb3VudCgpOworCQlhQ1RYLT5lcnJvckNvbnRleHQoIEFWTV9PU19XQVJOICkKKwkJCQk8PCAiVW5leHBlY3RlZCBtb3JlIHRoYW4gb25lIGFyZ3VtZW50IGZvciBpbnZva2UjdHJhbnNpdGlvbiA8PCAiCisJCQkJPDwgYUNvZGUuc3RyKCkgPDwgIiA+PiIKKwkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCisJCXJldHVybiggQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXI6OmNvbXBpbGVTdGF0ZW1lbnQoYUNUWCwgYUNvZGUpICk7CisJfQorCisJQkYgYXJnID0gQVZNQ09ERV9DT01QSUxFUi5kZWNvZGVfY29tcGlsZVN0YXRlbWVudChhQ1RYLCBhQ29kZS0+Zmlyc3QoKSk7CisJaWYoIGFyZy5pbnZhbGlkKCkgfHwgYXJnLmlzbm90PCBBdm1UcmFuc2l0aW9uID4oKSApCisJeworCQlnZXRDb21waWxlclRhYmxlKCkuaW5jckVycm9yQ291bnQoKTsKKwkJYUNUWC0+ZXJyb3JDb250ZXh0KCBBVk1fT1NfV0FSTiApCisJCQkJPDwgIkF2bUNvZGU8IHN0YXRlbWVudCA+IGNvbXBpbGF0aW9uIGVycm9yIDw8ICg6ICIKKwkJCQk8PCBhQ29kZS0+Zmlyc3QoKS5zdHIoKSA8PCAiIC4uLikgPj4iCisJCQkJPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKworCQlyZXR1cm4oIGFDb2RlICk7CisJfQorCisJcmV0dXJuKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZShhQ29kZS0+Z2V0T3BlcmF0b3IoKSwgYXJnKSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIElOVk9LRSBNRVRIT0QgQ09NUElMQVRJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0JGIEF2bWNvZGVJbnZva2VNZXRob2RDb21waWxlcjo6Y29tcGlsZUV4cHJlc3Npb24oCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCWlmKCBhQ29kZS0+c2l6ZSgpIDwgMiApCisJeworCQlnZXRDb21waWxlclRhYmxlKCkuaW5jckVycm9yQ291bnQoKTsKKwkJYUNUWC0+ZXJyb3JDb250ZXh0KCBBVk1fT1NfV0FSTiApCisJCQkJPDwgIkV4cGVjdGVkIGludm9rYWJsZSBleHByZXNzaW9uIGxpa2UgKDogZm9ybSBpbnZva2FibGUgLi4uKSA8PCAiCisJCQkJPDwgYUNvZGUuc3RyKCkgPDwgIiA+PiIKKwkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCisJCXJldHVybiggQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXI6OmNvbXBpbGVFeHByZXNzaW9uKGFDVFgsIGFDb2RlKSApOworCX0KKworCUJGQ29kZSBuZXdDb2RlOworCisJQkYgYXJnID0gQVZNQ09ERV9DT01QSUxFUi5kZWNvZGVfY29tcGlsZUV4cHJlc3Npb24oYUNUWCwgYUNvZGUtPmZpcnN0KCkpOworCWlmKCBhcmcuaW52YWxpZCgpICkKKwl7CisJCWdldENvbXBpbGVyVGFibGUoKS5pbmNyRXJyb3JDb3VudCgpOworCQlhQ1RYLT5lcnJvckNvbnRleHQoIEFWTV9PU19XQVJOICkKKwkJCQk8PCAiQXZtQ29kZTwgc3RhdGVtZW50ID4gY29tcGlsYXRpb24gZXJyb3IgPDwgKDogIgorCQkJCTw8IGFDb2RlLT5maXJzdCgpLnN0cigpIDw8ICIgLi4uKSA+PiIKKwkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCisJCXJldHVybiggYUNvZGUgKTsKKwl9CisKKworCWlmKCBhQ29kZS0+c2Vjb25kKCkuaXM8IE9wZXJhdG9yID4oKSApCisJeworCQluZXdDb2RlID0gU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJYUNvZGUtPnNlY29uZCgpLnRvX3B0cjwgT3BlcmF0b3IgPigpLCBhcmcpOworCX0KKwllbHNlIGlmKCBhQ29kZS0+c2Vjb25kKCkuaXNJZGVudGlmaWVyKCkgKQorCXsKKwkJT3BlcmF0b3IgKiBvcCA9IEF2bU9wZXJhdGlvbkZhY3Rvcnk6OmdldChhcmcsCisJCQkJYUNvZGUtPnNlY29uZCgpLnRvSWRlbnRpZmllcigpKTsKKwkJaWYoIG9wICE9IE5VTEwgKQorCQl7CisJCQluZXdDb2RlID0gU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUob3AsIGFyZyk7CisJCX0KKwkJZWxzZQorCQl7CisvLwkJCVR5cGVNYW5hZ2VyOjpnZXQKKworCQkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JFcnJvckNvdW50KCk7CisJCQlhQ1RYLT5lcnJvckNvbnRleHQoIEFWTV9PU19XQVJOICkKKwkJCQkJPDwgIkF2bUNvZGU8IHN0YXRlbWVudCA+IGNvbXBpbGF0aW9uIGVycm9yIDw8ICg6ICIKKwkJCQkJPDwgYXJnLnN0cigpIDw8ICIgIiA8PCBhQ29kZS0+c2Vjb25kKCkuc3RyKCkgPDwgIiAuLi4pID4+IgorCQkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCisJCQlyZXR1cm4oIGFDb2RlICk7CisJCX0KKwl9CisKKwlBdm1Db2RlOjppdGVyYXRvciBpdEFyZyA9IGFDb2RlLT5iZWdpbigpICsgMjsKKwlBdm1Db2RlOjppdGVyYXRvciBpdEVuZEFyZyA9IGFDb2RlLT5lbmQoKTsKKwlmb3IoIDsgaXRBcmcgIT0gaXRFbmRBcmcgOyArK2l0QXJnICkKKwl7CisJCWFyZyA9IEFWTUNPREVfQ09NUElMRVIuZGVjb2RlX2NvbXBpbGVFeHByZXNzaW9uKGFDVFgsICppdEFyZyk7CisKKwkJaWYoIGFyZy52YWxpZCgpICkKKwkJeworCQkJbmV3Q29kZS0+YXBwZW5kKCBhcmcgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWdldENvbXBpbGVyVGFibGUoKS5pbmNyRXJyb3JDb3VudCgpOworCQkJYUNUWC0+ZXJyb3JDb250ZXh0KCBBVk1fT1NfV0FSTiApCisJCQkJCTw8ICJBdm1Db2RlPCBzdGF0ZW1lbnQgPiBjb21waWxhdGlvbiBlcnJvciA8PCAiCisJCQkJCTw8ICgqaXRBcmcpLnN0cigpIDw8ICIgPj4iCisJCQkJCTw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisKKwkJCW5ld0NvZGUtPmFwcGVuZCggKml0QXJnICk7CisJCQljb250aW51ZTsKKwkJfQorCX0KKworCXJldHVybiggQVZNQ09ERV9DT01QSUxFUi5jb21waWxlRXhwcmVzc2lvbihhQ1RYLCBuZXdDb2RlKSApOworfQorCitCRkNvZGUgQXZtY29kZUludm9rZU1ldGhvZENvbXBpbGVyOjpjb21waWxlU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlpZiggYUNvZGUtPnNpemUoKSA8IDIgKQorCXsKKwkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JFcnJvckNvdW50KCk7CisJCWFDVFgtPmVycm9yQ29udGV4dCggQVZNX09TX1dBUk4gKQorCQkJCTw8ICJFeHBlY3RlZCBpbnZva2FibGUgZXhwcmVzc2lvbiBsaWtlICIKKwkJCQkJIig6IGZvcm0gaW52b2thYmxlIC4uLikgPDwgIiA8PCBhQ29kZS5zdHIoKSA8PCAiID4+IgorCQkJCTw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisKKwkJcmV0dXJuKCBBYnN0cmFjdEF2bWNvZGVDb21waWxlcjo6Y29tcGlsZVN0YXRlbWVudChhQ1RYLCBhQ29kZSkgKTsKKwl9CisKKwlCRkNvZGUgbmV3Q29kZTsKKworCUJGIGFyZyA9IEFWTUNPREVfQ09NUElMRVIuZGVjb2RlX2NvbXBpbGVFeHByZXNzaW9uKGFDVFgsIGFDb2RlLT5maXJzdCgpKTsKKwlpZiggYXJnLmludmFsaWQoKSApCisJeworCQlnZXRDb21waWxlclRhYmxlKCkuaW5jckVycm9yQ291bnQoKTsKKwkJYUNUWC0+ZXJyb3JDb250ZXh0KCBBVk1fT1NfV0FSTiApCisJCQkJPDwgIkF2bUNvZGU8IHN0YXRlbWVudCA+IGNvbXBpbGF0aW9uIGVycm9yIDw8ICg6ICIKKwkJCQk8PCBhQ29kZS0+Zmlyc3QoKS5zdHIoKSA8PCAiIC4uLikgPj4iCisJCQkJPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKworCQlyZXR1cm4oIGFDb2RlICk7CisJfQorCisKKwlpZiggYUNvZGUtPnNlY29uZCgpLmlzPCBPcGVyYXRvciA+KCkgKQorCXsKKwkJbmV3Q29kZSA9IFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCWFDb2RlLT5zZWNvbmQoKS50b19wdHI8IE9wZXJhdG9yID4oKSwgYXJnKTsKKwl9CisJZWxzZSBpZiggYUNvZGUtPnNlY29uZCgpLmlzSWRlbnRpZmllcigpICkKKwl7CisJCU9wZXJhdG9yICogb3AgPSBBdm1PcGVyYXRpb25GYWN0b3J5OjpnZXQoYXJnLAorCQkJCWFDb2RlLT5zZWNvbmQoKS50b0lkZW50aWZpZXIoKSk7CisJCWlmKCBvcCAhPSBOVUxMICkKKwkJeworCQkJbmV3Q29kZSA9IFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKG9wLCBhcmcpOworCQl9CisJCWVsc2UKKwkJeworLy8JCQlUeXBlTWFuYWdlcjo6Z2V0CisKKwkJCWdldENvbXBpbGVyVGFibGUoKS5pbmNyRXJyb3JDb3VudCgpOworCQkJYUNUWC0+ZXJyb3JDb250ZXh0KCBBVk1fT1NfV0FSTiApCisJCQkJCTw8ICJBdm1Db2RlPCBzdGF0ZW1lbnQgPiBjb21waWxhdGlvbiBlcnJvciA8PCAoOiAiCisJCQkJCTw8IGFyZy5zdHIoKSA8PCAiICIgPDwgYUNvZGUtPnNlY29uZCgpLnN0cigpIDw8ICIgLi4uKSA+PiIKKwkJCQkJPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKworCQkJcmV0dXJuKCBhQ29kZSApOworCQl9CisJfQorCisJQXZtQ29kZTo6aXRlcmF0b3IgaXRBcmcgPSBhQ29kZS0+YmVnaW4oKSArIDI7CisJQXZtQ29kZTo6aXRlcmF0b3IgaXRFbmRBcmcgPSBhQ29kZS0+ZW5kKCk7CisJZm9yKCA7IGl0QXJnICE9IGl0RW5kQXJnIDsgKytpdEFyZyApCisJeworCQlhcmcgPSBBVk1DT0RFX0NPTVBJTEVSLmRlY29kZV9jb21waWxlRXhwcmVzc2lvbihhQ1RYLCAqaXRBcmcpOworCisJCWlmKCBhcmcudmFsaWQoKSApCisJCXsKKwkJCW5ld0NvZGUtPmFwcGVuZCggYXJnICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlnZXRDb21waWxlclRhYmxlKCkuaW5jckVycm9yQ291bnQoKTsKKwkJCWFDVFgtPmVycm9yQ29udGV4dCggQVZNX09TX1dBUk4gKQorCQkJCQk8PCAiQXZtQ29kZTwgc3RhdGVtZW50ID4gY29tcGlsYXRpb24gZXJyb3IgPDwgIgorCQkJCQk8PCAoKml0QXJnKS5zdHIoKSA8PCAiID4+IgorCQkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCisJCQluZXdDb2RlLT5hcHBlbmQoICppdEFyZyApOworCQkJY29udGludWU7CisJCX0KKwl9CisKKwlyZXR1cm4oIEFWTUNPREVfQ09NUElMRVIuY29tcGlsZVN0YXRlbWVudChhQ1RYLCBuZXdDb2RlKSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIElOVk9LRSBQUk9HUkFNIENPTVBJTEFUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitCRiBBdm1jb2RlSW52b2tlUHJvZ3JhbUNvbXBpbGVyOjpjb21waWxlRXhwcmVzc2lvbigKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJcmV0dXJuKCBjb21waWxlU3RhdGVtZW50KGFDVFgsIGFDb2RlKSApOworfQorCitCRkNvZGUgQXZtY29kZUludm9rZVByb2dyYW1Db21waWxlcjo6Y29tcGlsZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJcmV0dXJuKCBBYnN0cmFjdEF2bWNvZGVDb21waWxlcjo6Y29tcGlsZVN0YXRlbWVudChhQ1RYLCBhQ29kZSkgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQVZNQ09ERSBJTlZPS0UgRlVOQ1RJT04gQ09NUElMQVRJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0JGIEF2bWNvZGVJbnZva2VGdW5jdGlvbkNvbXBpbGVyOjpjb21waWxlRXhwcmVzc2lvbigKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJcmV0dXJuKCBjb21waWxlU3RhdGVtZW50KGFDVFgsIGFDb2RlKSApOworfQorCitCRkNvZGUgQXZtY29kZUludm9rZUZ1bmN0aW9uQ29tcGlsZXI6OmNvbXBpbGVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCXJldHVybiggQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXI6OmNvbXBpbGVTdGF0ZW1lbnQoYUNUWCwgYUNvZGUpICk7CisKK30KKworCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVJbnZva2VDb21waWxlci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZUludm9rZUNvbXBpbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNmMDc2NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVJbnZva2VDb21waWxlci5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxMiBhdnIuIDIwMTEKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBBVk1DT0RFSU5WT0tFQ09NUElMRVJfSF8KKyNkZWZpbmUgQVZNQ09ERUlOVk9LRUNPTVBJTEVSX0hfCisKKyNpbmNsdWRlIDxidWlsZGVyL3ByaW1pdGl2ZS9BYnN0cmFjdEF2bWNvZGVDb21waWxlci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitBVk1DT0RFX0NPTVBJTEVSX09QVElNSVpFUl9DTEFTUyhJbnZva2VOZXcsIEFic3RyYWN0QXZtY29kZUNvbXBpbGVyKQorCisKK0FWTUNPREVfQ09NUElMRVJfQ0xBU1MoSW52b2tlUm91dGluZSwgQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXIpCisKK0FWTUNPREVfQ09NUElMRVJfU1RBVEVNRU5UX0NMQVNTKAorCQkiSU5WT0tFI1RSQU5TSVRJT04iLCBJbnZva2VUcmFuc2l0aW9uLCBBYnN0cmFjdEF2bWNvZGVDb21waWxlcikKKworCitBVk1DT0RFX0NPTVBJTEVSX0NMQVNTKEludm9rZU1ldGhvZCwgQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXIpCisKK0FWTUNPREVfQ09NUElMRVJfQ0xBU1MoSW52b2tlUHJvZ3JhbSwgQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXIpCisKK0FWTUNPREVfQ09NUElMRVJfQ0xBU1MoSW52b2tlRnVuY3Rpb24sIEFic3RyYWN0QXZtY29kZUNvbXBpbGVyKQorCisKK30KKworI2VuZGlmIC8qIEFWTUNPREVJTlZPS0VDT01QSUxFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZUl0ZUNvbXBpbGVyLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVJdGVDb21waWxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJhNGIzNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVJdGVDb21waWxlci5jcHAKQEAgLTAsMCArMSwxMzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyNiBub3YuIDIwMTEKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkF2bWNvZGVJdGVDb21waWxlci5oIgorCisjaW5jbHVkZSA8YnVpbGRlci9wcmltaXRpdmUvQXZtY29kZUNvbXBpbGVyLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9Bdm1Db2RlLmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vU3RhdGVtZW50Q29uc3RydWN0b3IuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFWTUNPREUgSUYgVEhFIEVMU0UgQ09NUElMQVRJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0JGIEF2bWNvZGVJdGVDb21waWxlcjo6Y29tcGlsZUV4cHJlc3Npb24oCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCUJGQ29kZSBhQ29tcGlsZWRDb2RlKCBhQ29kZS0+Z2V0T3BlcmF0b3IoKSwKKwkJCWNvbXBpbGVBcmdSdmFsdWUoYUNUWCwgVHlwZU1hbmFnZXI6OkJPT0xFQU4sIGFDb2RlLT5maXJzdCgpKSwKKwkJCWNvbXBpbGVBcmdSdmFsdWUoYUNUWCwgYUNvZGUtPnNlY29uZCgpKSApOworCisJaWYoIGFDb2RlLT5pc09wQ29kZSggQVZNX09QQ09ERV9JRkUgKSApCisJeworCQlhQ29tcGlsZWRDb2RlLT5hcHBlbmQoIGNvbXBpbGVBcmdSdmFsdWUoYUNUWCwgYUNvZGUtPnRoaXJkKCkpICk7CisJfQorCisJcmV0dXJuKCBhQ29tcGlsZWRDb2RlICk7Cit9CisKK0JGIEF2bWNvZGVJdGVDb21waWxlcjo6b3B0aW1pemVFeHByZXNzaW9uKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlCRkNvZGUgb3B0aW1pemVkQ29kZSggYUNvZGUtPmdldE9wZXJhdG9yKCksCisJCQlBVk1DT0RFX0NPTVBJTEVSLmRlY29kZV9vcHRpbWl6ZUV4cHJlc3Npb24oYUNUWCwgYUNvZGUtPmZpcnN0KCkpLAorCQkJQVZNQ09ERV9DT01QSUxFUi5kZWNvZGVfb3B0aW1pemVFeHByZXNzaW9uKGFDVFgsIGFDb2RlLT5zZWNvbmQoKSkgKTsKKworCUF2bUluc3RydWN0aW9uICogYXJnc0luc3RydWN0aW9uID0KKwkJCW9wdGltaXplZENvZGUtPm5ld0luc3RydWN0aW9uKCBhQ29kZS0+c2l6ZSgpICk7CisKKwlhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLmR0eXBlID0gVHlwZU1hbmFnZXI6OkJPT0xFQU47CisJc2V0QXJnY29kZVJWYWx1ZShhQ1RYLCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLCBvcHRpbWl6ZWRDb2RlLT5maXJzdCgpKTsKKworCWFyZ3NJbnN0cnVjdGlvbi0+YXQoMSkuZHR5cGUgPSBUeXBlTWFuYWdlcjo6VU5JVkVSU0FMOworCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdCgxKSwgb3B0aW1pemVkQ29kZS0+c2Vjb25kKCkpOworCisJaWYoIGFDb2RlLT5pc09wQ29kZSggQVZNX09QQ09ERV9JRkUgKSApCisJeworCQlvcHRpbWl6ZWRDb2RlLT5hcHBlbmQoIEFWTUNPREVfQ09NUElMRVIuZGVjb2RlX29wdGltaXplRXhwcmVzc2lvbigKKwkJCQlhQ1RYLCBhQ29kZS0+dGhpcmQoKSkgKTsKKworCQlhcmdzSW5zdHJ1Y3Rpb24tPmF0KDIpLmR0eXBlID0gVHlwZU1hbmFnZXI6OlVOSVZFUlNBTDsKKwkJc2V0QXJnY29kZVJWYWx1ZShhQ1RYLCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDIpLCBvcHRpbWl6ZWRDb2RlLT50aGlyZCgpKTsKKwl9CisKKwlhcmdzSW5zdHJ1Y3Rpb24tPmNvbXB1dGVNYWluQnl0ZWNvZGUoCisJCQkvKmNvbnRleHQgICovIEFWTV9BUkdfU1RBTkRBUkRfQ1RYLAorCQkJLypwcm9jZXNzb3IqLyBBVk1fQVJHX0FSSVRITUVUSUNfTE9HSUNfQ1BVLAorCQkJLypvcGVyYXRpb24qLyBBVk1fQVJHX1NFVkFMX1JWQUxVRSwKKwkJCS8qb3BlcmFuZCAgKi8gQVZNX0FSR19FWFBSRVNTSU9OX0tJTkQpOworCisJcmV0dXJuKCBvcHRpbWl6ZWRDb2RlICk7Cit9CisKKworCitCRkNvZGUgQXZtY29kZUl0ZUNvbXBpbGVyOjpjb21waWxlU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlCRkNvZGUgYUNvbXBpbGVkQ29kZSggYUNvZGUtPmdldE9wZXJhdG9yKCksCisJCQljb21waWxlQXJnUnZhbHVlKGFDVFgsIFR5cGVNYW5hZ2VyOjpCT09MRUFOLCBhQ29kZS0+Zmlyc3QoKSksCisJCQlBVk1DT0RFX0NPTVBJTEVSLmRlY29kZV9jb21waWxlU3RhdGVtZW50KGFDVFgsIGFDb2RlLT5zZWNvbmQoKSkgKTsKKworCWlmKCBhQ29kZS0+aXNPcENvZGUoIEFWTV9PUENPREVfSUZFICkgKQorCXsKKwkJYUNvbXBpbGVkQ29kZS0+YXBwZW5kKAorCQkJCUFWTUNPREVfQ09NUElMRVIuZGVjb2RlX2NvbXBpbGVTdGF0ZW1lbnQoYUNUWCwgYUNvZGUtPnRoaXJkKCkpICk7CisJfQorCisJcmV0dXJuKCBhQ29tcGlsZWRDb2RlICk7Cit9CisKKworQkZDb2RlIEF2bWNvZGVJdGVDb21waWxlcjo6b3B0aW1pemVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCUJGQ29kZSBvcHRpbWl6ZWRDb2RlKCBhQ29kZS0+Z2V0T3BlcmF0b3IoKSwKKwkJCUFWTUNPREVfQ09NUElMRVIuZGVjb2RlX29wdGltaXplRXhwcmVzc2lvbihhQ1RYLCBhQ29kZS0+Zmlyc3QoKSksCisJCQlBVk1DT0RFX0NPTVBJTEVSLmRlY29kZV9vcHRpbWl6ZVN0YXRlbWVudChhQ1RYLCBhQ29kZS0+c2Vjb25kKCkpICk7CisKKwlBdm1JbnN0cnVjdGlvbiAqIGFyZ3NJbnN0cnVjdGlvbiA9CisJCQlvcHRpbWl6ZWRDb2RlLT5uZXdJbnN0cnVjdGlvbiggYUNvZGUtPnNpemUoKSApOworCisJYXJnc0luc3RydWN0aW9uLT5hdCgwKS5kdHlwZSA9IFR5cGVNYW5hZ2VyOjpCT09MRUFOOworCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdCgwKSwgb3B0aW1pemVkQ29kZS0+Zmlyc3QoKSk7CisKKwlzZXRBcmdjb2RlU3RhdGVtZW50KGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMSksIG9wdGltaXplZENvZGUtPnNlY29uZCgpKTsKKworCWlmKCBhQ29kZS0+aXNPcENvZGUoIEFWTV9PUENPREVfSUZFICkgKQorCXsKKwkJb3B0aW1pemVkQ29kZS0+YXBwZW5kKCBBVk1DT0RFX0NPTVBJTEVSLmRlY29kZV9vcHRpbWl6ZVN0YXRlbWVudCgKKwkJCQlhQ1RYLCBhQ29kZS0+dGhpcmQoKSkgKTsKKworCQlzZXRBcmdjb2RlU3RhdGVtZW50KGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMiksIG9wdGltaXplZENvZGUtPnRoaXJkKCkpOworCX0KKworCWFyZ3NJbnN0cnVjdGlvbi0+Y29tcHV0ZU1haW5CeXRlY29kZSgKKwkJCS8qY29udGV4dCAgKi8gQVZNX0FSR19TVEFOREFSRF9DVFgsCisJCQkvKnByb2Nlc3NvciovIEFWTV9BUkdfU1RBVEVNRU5UX0NQVSwKKwkJCS8qb3BlcmF0aW9uKi8gQVZNX0FSR19TRVZBTF9SVkFMVUUsCisJCQkvKm9wZXJhbmQgICovIEFWTV9BUkdfU1RBVEVNRU5UX0tJTkQpOworCisJcmV0dXJuKCBvcHRpbWl6ZWRDb2RlICk7Cit9CisKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVJdGVDb21waWxlci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZUl0ZUNvbXBpbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc1NWRkYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVJdGVDb21waWxlci5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyNiBub3YuIDIwMTEKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBBVk1DT0RFSVRFQ09NUElMRVJfSF8KKyNkZWZpbmUgQVZNQ09ERUlURUNPTVBJTEVSX0hfCisKKyNpbmNsdWRlIDxidWlsZGVyL3ByaW1pdGl2ZS9BYnN0cmFjdEF2bWNvZGVDb21waWxlci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitBVk1DT0RFX0NPTVBJTEVSX09QVElNSVpFUl9DTEFTUyhJdGUsIEFic3RyYWN0QXZtY29kZUNvbXBpbGVyKQorCisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisjZW5kaWYgLyogQVZNQ09ERUlURUNPTVBJTEVSX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlSnVtcENvbXBpbGVyLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVKdW1wQ29tcGlsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNDM2M2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlSnVtcENvbXBpbGVyLmNwcApAQCAtMCwwICsxLDE2NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDEwIG5vdi4gMjAxMgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQXZtY29kZUp1bXBDb21waWxlci5oIgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQXZtQ29kZS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQVZNQ09ERSBCUkVBSyBFWEVDVVRBQkxFIENPTVBJTEFUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitCRkNvZGUgQXZtY29kZUJyZWFrQ29tcGlsZXI6OmNvbXBpbGVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCXJldHVybiggYUNvZGUgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQVZNQ09ERSBDT05USU5VRSBFWEVDVVRBQkxFIENPTVBJTEFUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitCRkNvZGUgQXZtY29kZUNvbnRpbnVlQ29tcGlsZXI6OmNvbXBpbGVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCXJldHVybiggYUNvZGUgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQVZNQ09ERSBFWElUIEVYRUNVVEFCTEUgQ09NUElMQVRJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0JGQ29kZSBBdm1jb2RlUmV0dXJuQ29tcGlsZXI6OmNvbXBpbGVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCWlmKCBhQ29kZS0+ZW1wdHkoKSApCisJeworCQlyZXR1cm4oIGFDb2RlICk7CisJfQorCWVsc2UKKwl7CisJCWNvbnN0IEF2bVByb2dyYW0gKiBhUHJvZ3JhbSA9IGFDVFgtPm1Db21waWxlQ3R4LT5nZXRBdm1Qcm9ncmFtKCk7CisJCWZvciggOyBhUHJvZ3JhbSAhPSBOVUxMIDsgYVByb2dyYW0gPSBhUHJvZ3JhbS0+Z2V0QXZtUHJvZ3JhbUNvbnRhaW5lcigpICkKKwkJeworCQkJaWYoIGFQcm9ncmFtLT5oYXNSZXR1cm4oKSApCisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiggYVByb2dyYW0gIT0gTlVMTCApCisJCXsKKwkJCUJGQ29kZSByZXRBc3NpZ25Db2RlKCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FTU0lHTiwKKwkJCQkJYVByb2dyYW0tPmdldFJldHVybigwKSwgY29tcGlsZUFyZ1J2YWx1ZSgKKwkJCQkJCQlhQ1RYLT5jbG9uZShhUHJvZ3JhbS0+Z2V0UmV0dXJuVHlwZVNwZWNpZmllcigwKSksCisJCQkJCQkJYUNvZGUtPmZpcnN0KCksIGZhbHNlKSApOworCisvLwkJCWlmKCBhUHJvZ3JhbS0+aXM8IEV4ZWN1dGFibGVGb3JtID4oKSAmJgorLy8JCQkJCSggYVByb2dyYW0tPnRvPCBFeGVjdXRhYmxlRm9ybSA+KCktPmhhc0tpbmRQcm9jZWR1cmUoKSB8fAorLy8JCQkJCQkJYVByb2dyYW0tPnRvPCBFeGVjdXRhYmxlRm9ybSA+KCktPmhhc09uUmV0dXJuKCkgKSApCisvLwkJCXsKKy8vCQkJCXJldHVybiggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisvLwkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQVRPTUlDX1NFUVVFTkNFLCByZXRBc3NpZ25Db2RlLAorLy8JCQkJCQlTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZShhQ29kZS0+Z2V0T3BlcmF0b3IoKSkgKSApOworLy8JCQl9CisvLwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4oIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BVE9NSUNfU0VRVUVOQ0UsIHJldEFzc2lnbkNvZGUsCisJCQkJCQlTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZShhQ29kZS0+Z2V0T3BlcmF0b3IoKSkgKSApOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZShhQ29kZS0+Z2V0T3BlcmF0b3IoKSwKKwkJCQkJY29tcGlsZUFyZ1J2YWx1ZShhQ1RYLCBhQ29kZS0+Zmlyc3QoKSwgZmFsc2UpKSApOworCQl9CisJfQorfQorCitCRkNvZGUgQXZtY29kZVJldHVybkNvbXBpbGVyOjpvcHRpbWl6ZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJaWYoIGFDb2RlLT5ub25lbXB0eSgpICkKKwl7CisJCUF2bUluc3RydWN0aW9uICogYXJnc0luc3RydWN0aW9uID0gYUNvZGUtPmdlbkluc3RydWN0aW9uKCk7CisKKwkJb3B0aW1pemVBcmdFeHByZXNzaW9uKGFDVFgsIGFDb2RlLCAwKTsKKwkJYXJnc0luc3RydWN0aW9uLT5hdCgwKS5kdHlwZSA9IFR5cGVNYW5hZ2VyOjpVTklWRVJTQUw7CisJCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdCgwKSwgYUNvZGUtPmZpcnN0KCkpOworCisJCWFyZ3NJbnN0cnVjdGlvbi0+Y29tcHV0ZU1haW5CeXRlY29kZSgKKwkJCQkvKmNvbnRleHQgICovIEFWTV9BUkdfUkVUVVJOX0NUWCwKKwkJCQkvKnByb2Nlc3NvciovIEFWTV9BUkdfU1RBVEVNRU5UX0NQVSwKKwkJCQkvKm9wZXJhdGlvbiovIEFWTV9BUkdfU0VWQUxfUlZBTFVFLAorCQkJCS8qb3BlcmFuZCAgKi8gQVZNX0FSR19TVEFURU1FTlRfS0lORCwKKwkJCQkvKmR0eXBlICAgICovIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMCkuZHR5cGUpOworCisvLwkJcmV0dXJuKCBvcHRpbWl6ZVN0YXRlbWVudENvZGUoYUNUWCwgYUNvZGUpICk7CisJfQorCisJcmV0dXJuKCBhQ29kZSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIEVYSVQgRVhFQ1VUQUJMRSBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkZDb2RlIEF2bWNvZGVFeGl0Q29tcGlsZXI6OmNvbXBpbGVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCWlmKCBhQ29kZS0+ZW1wdHkoKSApCisJeworCQlyZXR1cm4oIGFDb2RlICk7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoYUNvZGUtPmdldE9wZXJhdG9yKCksCisJCQkJY29tcGlsZUFyZ1J2YWx1ZShhQ1RYLCBhQ29kZS0+Zmlyc3QoKSwgZmFsc2UpKSApOworCX0KK30KKworQkZDb2RlIEF2bWNvZGVFeGl0Q29tcGlsZXI6Om9wdGltaXplU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlpZiggYUNvZGUtPm5vbmVtcHR5KCkgKQorCXsKKwkJQXZtSW5zdHJ1Y3Rpb24gKiBhcmdzSW5zdHJ1Y3Rpb24gPSBhQ29kZS0+Z2VuSW5zdHJ1Y3Rpb24oKTsKKworCQlvcHRpbWl6ZUFyZ0V4cHJlc3Npb24oYUNUWCwgYUNvZGUsIDApOworCQlhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLmR0eXBlID0gVHlwZU1hbmFnZXI6OlVOSVZFUlNBTDsKKwkJc2V0QXJnY29kZVJWYWx1ZShhQ1RYLCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLCBhQ29kZS0+Zmlyc3QoKSk7CisKKwkJYXJnc0luc3RydWN0aW9uLT5jb21wdXRlTWFpbkJ5dGVjb2RlKAorCQkJCS8qY29udGV4dCAgKi8gQVZNX0FSR19SRVRVUk5fQ1RYLAorCQkJCS8qcHJvY2Vzc29yKi8gQVZNX0FSR19TVEFURU1FTlRfQ1BVLAorCQkJCS8qb3BlcmF0aW9uKi8gQVZNX0FSR19TRVZBTF9SVkFMVUUsCisJCQkJLypvcGVyYW5kICAqLyBBVk1fQVJHX1NUQVRFTUVOVF9LSU5ELAorCQkJCS8qZHR5cGUgICAgKi8gYXJnc0luc3RydWN0aW9uLT5hdCgwKS5kdHlwZSk7CisKKy8vCQlyZXR1cm4oIG9wdGltaXplU3RhdGVtZW50Q29kZShhQ1RYLCBhQ29kZSkgKTsKKwl9CisKKwlyZXR1cm4oIGFDb2RlICk7Cit9CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlSnVtcENvbXBpbGVyLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlSnVtcENvbXBpbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTViNjM0YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVKdW1wQ29tcGlsZXIuaApAQCAtMCwwICsxLDQ0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTAgbm92LiAyMDEyCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQVZNQ09ERUpVTVBDT01QSUxFUl9IXworI2RlZmluZSBBVk1DT0RFSlVNUENPTVBJTEVSX0hfCisKKyNpbmNsdWRlIDxidWlsZGVyL3ByaW1pdGl2ZS9BYnN0cmFjdEF2bWNvZGVDb21waWxlci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitBVk1DT0RFX0NPTVBJTEVSX1NUQVRFTUVOVF9DTEFTUygKKwkJIkJSRUFLIiwgQnJlYWssIEFic3RyYWN0QXZtY29kZUNvbXBpbGVyKQorCitBVk1DT0RFX0NPTVBJTEVSX1NUQVRFTUVOVF9DTEFTUygKKwkJIkNPTlROVUUiLCBDb250aW51ZSwgQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXIpCisKK0FWTUNPREVfQ09NUElMRVJfU1RBVEVNRU5UX09QVElNSVpFUl9DTEFTUygKKwkJIlJFVFVSTiIsIFJldHVybiwgQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXIpCisKK0FWTUNPREVfQ09NUElMRVJfU1RBVEVNRU5UX09QVElNSVpFUl9DTEFTUygKKwkJIkVYSVQiLCBFeGl0LCBBYnN0cmFjdEF2bWNvZGVDb21waWxlcikKKworCisKKworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworI2VuZGlmIC8qIEFWTUNPREVKVU1QQ09NUElMRVJfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVMYW1iZGFDb21waWxlci5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlTGFtYmRhQ29tcGlsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZDYzMzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlTGFtYmRhQ29tcGlsZXIuY3BwCkBAIC0wLDAgKzEsNTY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTAgbWFpIDIwMTEKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkF2bWNvZGVMYW1iZGFDb21waWxlci5oIgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvQXZtTGFtYmRhLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9Bdm1Db2RlLmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkNvbnN0cnVjdG9yLmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vU3RhdGVtZW50Q29uc3RydWN0b3IuaD4KKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZEYXRhLmg+CisKKyNpbmNsdWRlIDxmbWwvb3BlcmF0b3IvT3BlcmF0b3JNYW5hZ2VyLmg+CisKKyNpbmNsdWRlIDxmbWwvdHlwZS9UeXBlTWFuYWdlci5oPgorCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1ZhcmlhYmxlLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIExBTUJEQSBBUFBMWSBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkYgQXZtY29kZUxhbWJkYUFwcGx5Q29tcGlsZXI6OmNvbXBpbGVFeHByZXNzaW9uKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlpZiggbm90IGFDb2RlLT5wb3B1bGF0ZWQoKSApCisJeworCQlBVk1fT1NfRVhJVCggRkFJTEVEICkKKwkJCQk8PCAiVW5leHBlY3RlZCBBUFAgRVhQUkVTU0lPTiB3aXRoIGxlc3MgdGhhbiAyIGFyZ3VtZW50cyAiCisJCQkJCSJmb3IgY29tcGlsZUF2bUNvZGVBcHBcbiIgPDwgYUNvZGUtPnRvU3RyaW5nKCkKKwkJCQk8PCBTRU5EX0VYSVQ7CisJfQorCisJQkYgYUxhbWJkYUV4cHJlc3Npb24gPSBjb21waWxlQXJnUnZhbHVlKGFDVFgsIGFDb2RlLT5maXJzdCgpKTsKKworCWlmKCBhTGFtYmRhRXhwcmVzc2lvbi5pbnZhbGlkKCkgKQorCXsKKwkJQVZNX09TX0VYSVQoIEZBSUxFRCApCisJCQkJPDwgIkVycm9yOj4gY29tcGlsaW5nIExBTUJEQSBFWFBSRVNTSU9OIDw8ICIKKwkJCQk8PCBhQ29kZS0+Zmlyc3QoKS5zdHIoKSA8PCAiID4+IGZvciBjb21waWxlQXZtQ29kZUFwcFxuIgorCQkJCTw8IGFDb2RlLT50b1N0cmluZygpCisJCQkJPDwgU0VORF9FWElUOworCX0KKworCUJGQ29kZSBuZXdDb2RlKCBhQ29kZS0+Z2V0T3BlcmF0b3IoKSAsIGFMYW1iZGFFeHByZXNzaW9uKTsKKworLy8JQkYgYXBwVmFyOworCisJQkYgbGFtYmRhVmFsdWU7CisKKwlBdm1Db2RlOjppdGVyYXRvciBpdEFyZyA9IGFDb2RlLT5iZWdpbigpOworCUF2bUNvZGU6Oml0ZXJhdG9yIGl0RW5kQXJnID0gYUNvZGUtPmVuZCgpOworCWZvciggKytpdEFyZyA7IGl0QXJnICE9IGl0RW5kQXJnIDsgKytpdEFyZyApCisJeworCQlsYW1iZGFWYWx1ZSA9IGNvbXBpbGVBcmdSdmFsdWUoYUNUWCwgKCppdEFyZykpOworCQlpZiggbGFtYmRhVmFsdWUudmFsaWQoKSApCisJCXsKKwkJCW5ld0NvZGUtPmFwcGVuZCggbGFtYmRhVmFsdWUgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCUFWTV9PU19FWElUKCBGQUlMRUQgKQorCQkJCQk8PCAiRXJyb3I6PiBjb21waWxpbmcgTEFNQkRBIFZBTFVFIDw8ICIKKwkJCQkJPDwgKCppdEFyZykuc3RyKCkgPDwgIiA+PiBmb3IgY29tcGlsZUF2bUNvZGVBcHBcbiIKKwkJCQkJPDwgYUNvZGUtPnRvU3RyaW5nKCkKKwkJCQkJPDwgU0VORF9FWElUOworCQl9CisKKy8vCQlpZiggKCppdEFyZykuaXNub3Q8IEF2bUNvZGUgPigpICkKKy8vCQl7CisvLwkJCUFWTV9PU19FWElUKCBGQUlMRUQgKQorLy8JCQkJCTw8ICJVbmV4cGVjdGVkIEFWTUNPREUgYXMgdmFyaWFibGUtdmFsdWUgYXNzb2NpYXRpb24gPDwgIgorLy8JCQkJCTw8ICgqaXRBcmcpLnN0cigpIDw8ICIgPj4gZm9yIGNvbXBpbGVBdm1Db2RlQXBwXG4iCisvLwkJCQkJPDwgYUNvZGUtPnRvU3RyaW5nKCkKKy8vCQkJCQk8PCBTRU5EX0VYSVQ7CisvLwkJfQorLy8KKy8vCQljb25zdCBCRkNvZGUgJiBhcHBBc3NpZ24gPSAoKml0QXJnKS5iZkF2bUNvZGUoKTsKKy8vCisvLwkJaWYoIGFwcEFzc2lnbi0+aXNub3RPcGVyYXRvciggT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BU1NJR04gKSApCisvLwkJeworLy8JCQlBVk1fT1NfRVhJVCggRkFJTEVEICkKKy8vCQkJCQk8PCAiVW5leHBlY3RlZCBPUEVSQVRPUiBLSU5EIGluIHZhcmlhYmxlLXZhbHVlICIKKy8vCQkJCQkJImFzc29jaWF0aW9uIDw8ICIgPDwgYXBwQXNzaWduLT5zdHIoKQorLy8JCQkJCTw8ICIgPj4gZm9yIGNvbXBpbGVBdm1Db2RlQXBwXG4iIDw8IGFDb2RlLT50b1N0cmluZygpCisvLwkJCQkJPDwgU0VORF9FWElUOworLy8JCX0KKy8vCisvLwkJYXBwVmFyID0gYXBwQXNzaWduLT5maXJzdCgpOworLy8KKy8vCQlpZiggbm90IGFwcFZhci5pc1VGSUQoKSApCisvLwkJeworLy8JCQlBVk1fT1NfRVhJVCggRkFJTEVEICkKKy8vCQkJCQk8PCAiVW5leHBlY3RlZCBWQVJJQUJMRSBLSU5EIGluIHZhcmlhYmxlLXZhbHVlICIKKy8vCQkJCQkJImFzc29jaWF0aW9uIDw8ICIgPDwgYXBwQXNzaWduLT5zdHIoKQorLy8JCQkJCTw8ICIgPj4gZm9yIGNvbXBpbGVBdm1Db2RlQXBwXG4iIDw8IGFDb2RlLT50b1N0cmluZygpCisvLwkJCQkJPDwgU0VORF9FWElUOworLy8JCX0KKy8vCisvLwkJY29uc3QgQkYgJiBsYW1iZGFWYXIgPSBhcHBBdm1MYW1iZGEtPmdldFN5bWJvbCggYXBwVmFyLnN0cigpICk7CisvLwkJbGFtYmRhVmFsdWUgPSBjb21waWxlQXJnUnZhbHVlKGFwcEF2bUxhbWJkYSwgYXBwQXNzaWduLT5zZWNvbmQoKSk7CisvLworLy8JCWlmKCBsYW1iZGFWYXIudmFsaWQgJiYgbGFtYmRhVmFsdWUudmFsaWQoKSApCisvLwkJeworLy8JCQlsYW1iZGFWYXItPnNldFZhbHVlKCBsYW1iZGFWYWx1ZSApOworLy8JCX0KKwl9CisKKwlyZXR1cm4oIG5ld0NvZGUgKTsKK30KKworQkZDb2RlIEF2bWNvZGVMYW1iZGFBcHBseUNvbXBpbGVyOjpjb21waWxlU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlpZiggbm90IGFDb2RlLT5wb3B1bGF0ZWQoKSApCisJeworCQlBVk1fT1NfRVhJVCggRkFJTEVEICkKKwkJCQk8PCAiVW5leHBlY3RlZCBBUFAgRVhQUkVTU0lPTiB3aXRoIGxlc3MgdGhhbiAyIGFyZ3VtZW50cyAiCisJCQkJCSJmb3IgY29tcGlsZUF2bUNvZGVBcHBcbiIgPDwgYUNvZGUtPnRvU3RyaW5nKCkKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJcmV0dXJuKCBCRkNvZGU6OlJFRl9OVUxMICk7CisJfQorCisJQkYgYUxhbWJkYUV4cHJlc3Npb24gPSBBVk1DT0RFX0NPTVBJTEVSLmRlY29kZV9jb21waWxlU3RhdGVtZW50KGFDVFgsCisJCQlhQ29kZS0+Zmlyc3QoKSk7CisKKwlpZiggYUxhbWJkYUV4cHJlc3Npb24uaW52YWxpZCgpICkKKwl7CisJCUFWTV9PU19FWElUKCBGQUlMRUQgKQorCQkJCTw8ICJFcnJvcjo+IGNvbXBpbGluZyBMQU1CREEgRVhQUkVTU0lPTiA8PCAiCisJCQkJPDwgYUNvZGUtPmZpcnN0KCkuc3RyKCkgPDwgIiA+PiBmb3IgY29tcGlsZUF2bUNvZGVBcHBcbiIKKwkJCQk8PCBhQ29kZS0+dG9TdHJpbmcoKQorCQkJCTw8IFNFTkRfRVhJVDsKKwl9CisKKwlCRkNvZGUgbmV3Q29kZSggYUNvZGUtPmdldE9wZXJhdG9yKCkgLCBhTGFtYmRhRXhwcmVzc2lvbik7CisKKy8vCUJGIGFwcFZhcjsKKworLy8JSW5zdGFuY2VPZkRhdGEgKiBsYW1iZGFWYXIgPSBOVUxMOworCUJGIGxhbWJkYVZhbHVlOworCisJQXZtQ29kZTo6aXRlcmF0b3IgaXRBcmcgPSBhQ29kZS0+YmVnaW4oKTsKKwlBdm1Db2RlOjppdGVyYXRvciBpdEVuZEFyZyA9IGFDb2RlLT5lbmQoKTsKKwlmb3IoICsraXRBcmcgOyBpdEFyZyAhPSBpdEVuZEFyZyA7ICsraXRBcmcgKQorCXsKKwkJbGFtYmRhVmFsdWUgPSBBVk1DT0RFX0NPTVBJTEVSLmRlY29kZV9jb21waWxlU3RhdGVtZW50KGFDVFgsICgqaXRBcmcpKTsKKwkJaWYoIGxhbWJkYVZhbHVlLnZhbGlkKCkgKQorCQl7CisJCQluZXdDb2RlLT5hcHBlbmQoIGxhbWJkYVZhbHVlICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlBVk1fT1NfRVhJVCggRkFJTEVEICkKKwkJCQkJPDwgIkVycm9yOj4gY29tcGlsaW5nIExBTUJEQSBWQUxVRSA8PCAiCisJCQkJCTw8ICgqaXRBcmcpLnN0cigpIDw8ICIgPj4gZm9yIGNvbXBpbGVBdm1Db2RlQXBwXG4iCisJCQkJCTw8IGFDb2RlLT50b1N0cmluZygpCisJCQkJCTw8IFNFTkRfRVhJVDsKKwkJfQorCisvLwkJaWYoICgqaXRBcmcpLmlzbm90PCBBdm1Db2RlID4oKSApCisvLwkJeworLy8JCQlBVk1fT1NfRVhJVCggRkFJTEVEICkKKy8vCQkJCQk8PCAiVW5leHBlY3RlZCBBVk1DT0RFIGFzIHZhcmlhYmxlLXZhbHVlICIKKy8vCQkJCQkiYXNzb2NpYXRpb24gPDwgIiA8PCAoKml0QXJnKS5zdHIoKQorLy8JCQkJCTw8ICIgPj4gZm9yIGNvbXBpbGVBdm1Db2RlQXBwXG4iIDw8IGFDb2RlLT50b1N0cmluZygpCisvLwkJCQkJPDwgU0VORF9FWElUOworLy8JCX0KKy8vCisvLwkJY29uc3QgQkZDb2RlICYgYXBwQXNzaWduID0gKCppdEFyZykuYmZDb2RlKCk7CisvLworLy8JCWlmKCBhcHBBc3NpZ24tPmlzbm90T3BlcmF0b3IoIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQVNTSUdOICkgKQorLy8JCXsKKy8vCQkJQVZNX09TX0VYSVQoIEZBSUxFRCApCisvLwkJCQkJPDwgIlVuZXhwZWN0ZWQgT1BFUkFUT1IgS0lORCBpbiB2YXJpYWJsZS12YWx1ZSAiCisvLwkJCQkJCSJhc3NvY2lhdGlvbiA8PCAiIDw8IGFwcEFzc2lnbi0+c3RyKCkKKy8vCQkJCQk8PCAiID4+IGZvciBjb21waWxlQXZtQ29kZUFwcFxuIiA8PCBhQ29kZS0+dG9TdHJpbmcoKQorLy8JCQkJCTw8IFNFTkRfRVhJVDsKKy8vCQl9CisvLworLy8JCWFwcFZhciA9IGFwcEFzc2lnbi0+Zmlyc3QoKTsKKy8vCisvLwkJaWYoIG5vdCBhcHBWYXIuaXNVRklEKCkgKQorLy8JCXsKKy8vCQkJQVZNX09TX0VYSVQoIEZBSUxFRCApCisvLwkJCQkJPDwgIlVuZXhwZWN0ZWQgVkFSSUFCTEUgS0lORCBpbiB2YXJpYWJsZS12YWx1ZSAiCisvLwkJCQkJCSJhc3NvY2lhdGlvbiA8PCAiIDw8IGFwcEFzc2lnbi0+c3RyKCkKKy8vCQkJCQk8PCAiID4+IGZvciBjb21waWxlQXZtQ29kZUFwcFxuIiA8PCBhQ29kZS0+dG9TdHJpbmcoKQorLy8JCQkJCTw8IFNFTkRfRVhJVDsKKy8vCQl9CisvLworLy8JCWNvbnN0IEJGICYgbGFtYmRhVmFyID0gYXBwQXZtTGFtYmRhLT5nZXRTeW1ib2woIGFwcFZhci5zdHIoKSApOworLy8JCWxhbWJkYVZhbHVlID0gQVZNQ09ERV9DT01QSUxFUi5kZWNvZGVfY29tcGlsZVN0YXRlbWVudChhcHBBdm1MYW1iZGEsCisvLwkJCQlhcHBBc3NpZ24tPnNlY29uZCgpKTsKKy8vCisvLwkJaWYoIGxhbWJkYVZhci52YWxpZCgpICYmIGxhbWJkYVZhbHVlLnZhbGlkKCkgKQorLy8JCXsKKy8vCQkJbGFtYmRhVmFyLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpLT5zZXRWYWx1ZSggbGFtYmRhVmFsdWUgKTsKKy8vCQl9CisJfQorCisJcmV0dXJuKCBuZXdDb2RlICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFWTUNPREUgTEFNQkRBIExFVCBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkYgQXZtY29kZUxhbWJkYUxldENvbXBpbGVyOjpjb21waWxlRXhwcmVzc2lvbigKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJaWYoIG5vdCBhQ29kZS0+cG9wdWxhdGVkKCkgKQorCXsKKwkJQVZNX09TX0VYSVQoIEZBSUxFRCApCisJCQkJPDwgIlVuZXhwZWN0ZWQgTEFNQkRBIEVYUFJFU1NJT04gd2l0aG91dCBhcmd1bWVudCBmb3IgIgorCQkJCQkiY29tcGlsZUF2bUNvZGVMZXRcbiIgPDwgYUNvZGUtPnRvU3RyaW5nKCkKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKKwl9CisKKwlhdm1fc2l6ZV90IHZhckNvdW50ID0gYUNvZGUtPnNpemUoKSAtIDE7CisKKwlBdm1MYW1iZGEgKiBsZXRBdm1MYW1iZGEgPSBuZXcgQXZtTGFtYmRhKAorCQkJYUNUWC0+bUNvbXBpbGVDdHgsIHZhckNvdW50LCBBVk1fTEFNQkRBX0xFVF9OQVRVUkUpOworCisJQkYgYmZMZXRMYW1iZGEoIGxldEF2bUxhbWJkYSApOworCisJQkYgbGV0VmFyOworCUJGIGxldFZhbHVlOworCisJQkZDb2RlIGxldEFzc2lnbjsKKwlCRiBsZXRWYXJGb3JtOworCVZhcmlhYmxlICogbGV0VmFyaWFibGU7CisJSW5zdGFuY2VPZkRhdGEgKiBsYW1iZGFJbnN0YW5jZTsKKworCUF2bUNvZGU6Oml0ZXJhdG9yIGl0QXJnID0gYUNvZGUtPmJlZ2luKCk7CisJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDAgOyBvZmZzZXQgPCB2YXJDb3VudCA7ICsraXRBcmcgLCArK29mZnNldCApCisJeworCQlpZiggKCppdEFyZykuaXM8IEF2bUNvZGUgPigpICkKKwkJeworCQkJbGV0QXNzaWduID0gKCppdEFyZykuYmZDb2RlKCk7CisKKwkJCWlmKCBsZXRBc3NpZ24tPmdldE9wZXJhdG9yKCkgPT0gT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BU1NJR04gKQorCQkJeworCQkJCWxldFZhciA9IGxldEFzc2lnbi0+Zmlyc3QoKTsKKworCQkJCWxldFZhbHVlID0gbGV0QXNzaWduLT5zZWNvbmQoKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlBVk1fT1NfRVhJVCggRkFJTEVEICkKKwkJCQkJCTw8ICJVbmV4cGVjdGVkIE9QRVJBVE9SIEtJTkQgaW4gdmFyaWFibGUtdmFsdWUgIgorCQkJCQkJCSJhc3NvY2lhdGlvbiA8PCAiIDw8IGxldEFzc2lnbi0+c3RyKCkKKwkJCQkJCTw8ICIgPj4gZm9yIGNvbXBpbGVBdm1Db2RlTGV0XG4iIDw8IGFDb2RlLT50b1N0cmluZygpCisJCQkJCQk8PCBTRU5EX0VYSVQ7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlsZXRWYXIgPSAoKml0QXJnKTsKKworCQkJbGV0VmFsdWUuZGVzdHJveSgpOworCQkJbGV0QXNzaWduLmRlc3Ryb3koKTsKKwkJfQorCisKKwkJaWYoIGxldFZhci5pc0lkZW50aWZpZXIoKSB8fCBsZXRWYXIuaXNVZmkoKSB8fAorCQkJCWxldFZhci5pczwgVW5pRm9ybUlkZW50aWZpZXIgPigpICkKKwkJeworCQkJbGV0VmFyRm9ybSA9IEJGKCBsZXRWYXJpYWJsZSA9IG5ldyBWYXJpYWJsZSgKKwkJCQkJY29uc3RfY2FzdDwgT2JqZWN0RWxlbWVudCAqID4oCisJCQkJCQkJYUNUWC0+bUNvbXBpbGVDdHgtPmdldEFzdEVsZW1lbnQoKSApLAorCQkJCQlUeXBlTWFuYWdlcjo6VU5JVkVSU0FMLCBsZXRWYXIuc3RyKCksIGxldFZhci5zdHIoKSkgKTsKKworCQkJbGFtYmRhSW5zdGFuY2UgPSBuZXcgSW5zdGFuY2VPZkRhdGEoCisJCQkJCUlQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9TVEFOREFSRF9OQVRVUkUsCisJCQkJCWxldEF2bUxhbWJkYSwgbGV0VmFyaWFibGUsIFR5cGVNYW5hZ2VyOjpVTklWRVJTQUwsCisJCQkJCW9mZnNldCwgTW9kaWZpZXI6OlBST1BFUlRZX1BBUkFNRVRFUl9NT0RJRklFUiApOworCisJCQlsZXRBdm1MYW1iZGEtPnNldERhdGEob2Zmc2V0LCBsYW1iZGFJbnN0YW5jZSk7CisKKwkJCWlmKCBsZXRWYWx1ZS52YWxpZCgpICkKKwkJCXsKKwkJCQlsZXRBc3NpZ24tPnNldCgwLCBsZXRWYXJGb3JtKTsKKworCQkJCWxhbWJkYUluc3RhbmNlLT5zZXRWYWx1ZSggY29tcGlsZUFyZ1J2YWx1ZShhQ1RYLCBsZXRWYWx1ZSkgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlhQ29kZS0+c2V0KG9mZnNldCwgbGV0VmFyRm9ybSk7CisJCQl9CisJCX0KKworCQllbHNlCisJCXsKKwkJCUFWTV9PU19FWElUKCBGQUlMRUQgKQorCQkJCQk8PCAiVW5leHBlY3RlZCBMQU1CREEgVkFSSUFCTEUgPDwgIiA8PCBsZXRWYXIuc3RyKCkKKwkJCQkJPDwgIiA+PiBmb3IgY29tcGlsZUF2bUNvZGVsZXRcbiIgPDwgYUNvZGUtPnRvU3RyaW5nKCkKKwkJCQkJPDwgU0VORF9FWElUOworCQl9CisJfQorCisJbGV0QXZtTGFtYmRhLT5zZXRFeHByZXNzaW9uKCBjb21waWxlQXJnUnZhbHVlKAorCQkJYUNUWC0+bmV3Q1RYKGxldEF2bUxhbWJkYSwgYUNUWC0+bVJ1bnRpbWVDdHgpLCBhQ29kZS0+bGFzdCgpKSApOworCisJcmV0dXJuKCBiZkxldExhbWJkYSApOworLy8JcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NvZGUoCisvLwkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfSU5WT0tFX0xBTUJEQV9MRVQsIGxldEF2bUxhbWJkYSkgKTsKK30KKworQkZDb2RlIEF2bWNvZGVMYW1iZGFMZXRDb21waWxlcjo6Y29tcGlsZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJaWYoIG5vdCBhQ29kZS0+cG9wdWxhdGVkKCkgKQorCXsKKwkJQVZNX09TX0VYSVQoIEZBSUxFRCApCisJCQkJPDwgIlVuZXhwZWN0ZWQgTEFNQkRBIEVYUFJFU1NJT04gd2l0aG91dCBhcmd1bWVudCAiCisJCQkJCSJmb3IgY29tcGlsZUF2bUNvZGVMZXRcbiIgPDwgYUNvZGUtPnRvU3RyaW5nKCkKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJcmV0dXJuKCBCRkNvZGU6OlJFRl9OVUxMICk7CisJfQorCisJYXZtX3NpemVfdCB2YXJDb3VudCA9IGFDb2RlLT5zaXplKCkgLSAxOworCisJQXZtTGFtYmRhICogbGV0QXZtTGFtYmRhID0gbmV3IEF2bUxhbWJkYSgKKwkJCWFDVFgtPm1Db21waWxlQ3R4LCB2YXJDb3VudCwgQVZNX0xBTUJEQV9MRVRfTkFUVVJFKTsKKworCUJGIGJmTGV0TGFtYmRhKCBsZXRBdm1MYW1iZGEgKTsKKworCUJGIGxldFZhcjsKKwlCRiBsZXRWYWx1ZTsKKworCUJGQ29kZSBsZXRBc3NpZ247CisJQkYgbGV0VmFyRm9ybTsKKwlWYXJpYWJsZSAqIGxldFZhcmlhYmxlOworCUluc3RhbmNlT2ZEYXRhICogbGFtYmRhSW5zdGFuY2U7CisKKwlBdm1Db2RlOjppdGVyYXRvciBpdEFyZyA9IGFDb2RlLT5iZWdpbigpOworCWZvciggYXZtX3NpemVfdCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgdmFyQ291bnQgOyArK2l0QXJnICwgKytvZmZzZXQgKQorCXsKKwkJaWYoICgqaXRBcmcpLmlzPCBBdm1Db2RlID4oKSApCisJCXsKKwkJCWxldEFzc2lnbiA9ICgqaXRBcmcpLmJmQ29kZSgpOworCisJCQlpZiggbGV0QXNzaWduLT5nZXRPcGVyYXRvcigpID09IE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQVNTSUdOICkKKwkJCXsKKwkJCQlsZXRWYXIgPSBsZXRBc3NpZ24tPmZpcnN0KCk7CisKKwkJCQlsZXRWYWx1ZSA9IGxldEFzc2lnbi0+c2Vjb25kKCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQVZNX09TX0VYSVQoIEZBSUxFRCApCisJCQkJCQk8PCAiVW5leHBlY3RlZCBPUEVSQVRPUiBLSU5EIGluIHZhcmlhYmxlLXZhbHVlICIKKwkJCQkJCQkiYXNzb2NpYXRpb24gPDwgIiA8PCBsZXRBc3NpZ24tPnN0cigpCisJCQkJCQk8PCAiID4+IGZvciBjb21waWxlQXZtQ29kZUxldFxuIiA8PCBhQ29kZS0+dG9TdHJpbmcoKQorCQkJCQkJPDwgU0VORF9FWElUOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJbGV0VmFyID0gKCppdEFyZyk7CisKKwkJCWxldFZhbHVlLmRlc3Ryb3koKTsKKwkJCWxldEFzc2lnbi5kZXN0cm95KCk7CisJCX0KKworCisJCWlmKCBsZXRWYXIuaXNJZGVudGlmaWVyKCkgfHwgbGV0VmFyLmlzVWZpKCkgfHwKKwkJCQlsZXRWYXIuaXM8IFVuaUZvcm1JZGVudGlmaWVyID4oKSApCisJCXsKKwkJCWxldFZhckZvcm0gPSBCRiggbGV0VmFyaWFibGUgPSBuZXcgVmFyaWFibGUoCisJCQkJCWNvbnN0X2Nhc3Q8IE9iamVjdEVsZW1lbnQgKiA+KAorCQkJCQkJCWFDVFgtPm1Db21waWxlQ3R4LT5nZXRBc3RFbGVtZW50KCkgKSwKKwkJCQkJVHlwZU1hbmFnZXI6OlVOSVZFUlNBTCwgbGV0VmFyLnN0cigpLCBsZXRWYXIuc3RyKCkpICk7CisKKwkJCWxhbWJkYUluc3RhbmNlID0gbmV3IEluc3RhbmNlT2ZEYXRhKAorCQkJCQlJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfU1RBTkRBUkRfTkFUVVJFLAorCQkJCQlsZXRBdm1MYW1iZGEsIGxldFZhcmlhYmxlLCBUeXBlTWFuYWdlcjo6VU5JVkVSU0FMLAorCQkJCQlvZmZzZXQsIE1vZGlmaWVyOjpQUk9QRVJUWV9QQVJBTUVURVJfTU9ESUZJRVIgKTsKKwkJCWxldEF2bUxhbWJkYS0+c2V0RGF0YShvZmZzZXQsIGxhbWJkYUluc3RhbmNlKTsKKworCQkJaWYoIGxldFZhbHVlLnZhbGlkKCkgKQorCQkJeworCQkJCWxldEFzc2lnbi0+c2V0KDAsIGxldFZhckZvcm0pOworCisJCQkJbGFtYmRhSW5zdGFuY2UtPnNldFZhbHVlKAorCQkJCQlBVk1DT0RFX0NPTVBJTEVSLmRlY29kZV9jb21waWxlU3RhdGVtZW50KGFDVFgsIGxldFZhbHVlKSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWFDb2RlLT5zZXQob2Zmc2V0LCBsZXRWYXJGb3JtKTsKKwkJCX0KKwkJfQorCisJCWVsc2UKKwkJeworCQkJQVZNX09TX0VYSVQoIEZBSUxFRCApCisJCQkJCTw8ICJVbmV4cGVjdGVkIExBTUJEQSBWQVJJQUJMRSA8PCAiIDw8IGxldFZhci5zdHIoKQorCQkJCQk8PCAiID4+IGZvciBjb21waWxlQXZtQ29kZWxldFxuIiA8PCBhQ29kZS0+dG9TdHJpbmcoKQorCQkJCQk8PCBTRU5EX0VYSVQ7CisJCX0KKwl9CisKKwlsZXRBdm1MYW1iZGEtPnNldEV4cHJlc3Npb24oIEFWTUNPREVfQ09NUElMRVIuZGVjb2RlX2NvbXBpbGVTdGF0ZW1lbnQoCisJCQlhQ1RYLT5uZXdDVFgobGV0QXZtTGFtYmRhLCBhQ1RYLT5tUnVudGltZUN0eCksIGFDb2RlLT5sYXN0KCkpICk7CisKKwlyZXR1cm4oIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9JTlZPS0VfTEFNQkRBX0xFVCwgYmZMZXRMYW1iZGEpICk7Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQVZNQ09ERSBMQU1CREEgRVhQUkVTU0lPTiBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkYgQXZtY29kZUxhbWJkYUV4cHJDb21waWxlcjo6Y29tcGlsZUV4cHJlc3Npb24oCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCWlmKCBhQ29kZS0+ZW1wdHkoKSApCisJeworCQlBVk1fT1NfRVhJVCggRkFJTEVEICkKKwkJCQk8PCAiVW5leHBlY3RlZCBMQU1CREEgRVhQUkVTU0lPTiB3aXRob3V0IGFyZ3VtZW50ICIKKwkJCQkJImZvciBjb21waWxlQXZtQ29kZUxhbWJkYVxuIiA8PCBhQ29kZS0+dG9TdHJpbmcoKQorCQkJCTw8IFNFTkRfRVhJVDsKKworCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCX0KKworCWF2bV9zaXplX3QgdmFyQ291bnQgPSBhQ29kZS0+c2l6ZSgpIC0gMTsKKworCUF2bUxhbWJkYSAqIGZ1bkF2bUxhbWJkYSA9IG5ldyBBdm1MYW1iZGEoCisJCQlhQ1RYLT5tQ29tcGlsZUN0eCwgdmFyQ291bnQsIEFWTV9MQU1CREFfRlVOX05BVFVSRSk7CisKKwlCRiBiZkZ1bkxhbWJkYSggZnVuQXZtTGFtYmRhICk7CisKKwlCRiBsYW1iZGFWYXI7CisJQkYgbGFtYmRhVmFyRm9ybTsKKwlWYXJpYWJsZSAqIGxhbWJkYVZhcmlhYmxlOworCUluc3RhbmNlT2ZEYXRhICogbGFtYmRhSW5zdGFuY2U7CisKKwlBdm1Db2RlOjppdGVyYXRvciBpdEFyZyA9IGFDb2RlLT5iZWdpbigpOworCWZvciggYXZtX3NpemVfdCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgdmFyQ291bnQgOyArK2l0QXJnICwgKytvZmZzZXQgKQorCXsKKwkJbGFtYmRhVmFyID0gKCppdEFyZyk7CisKKwkJaWYoIGxhbWJkYVZhci5pc0lkZW50aWZpZXIoKSB8fCBsYW1iZGFWYXIuaXNVZmkoKSB8fAorCQkJCWxhbWJkYVZhci5pczwgVW5pRm9ybUlkZW50aWZpZXIgPigpICkKKwkJeworCQkJbGFtYmRhVmFyRm9ybSA9IEJGKCBsYW1iZGFWYXJpYWJsZSA9IG5ldyBWYXJpYWJsZSgKKwkJCQkJY29uc3RfY2FzdDwgT2JqZWN0RWxlbWVudCAqID4oCisJCQkJCQkJYUNUWC0+bUNvbXBpbGVDdHgtPmdldEFzdEVsZW1lbnQoKSApLAorCQkJCQlUeXBlTWFuYWdlcjo6VU5JVkVSU0FMLCBsYW1iZGFWYXIuc3RyKCksIGxhbWJkYVZhci5zdHIoKSkgKTsKKwkJCWFDb2RlLT5zZXQob2Zmc2V0LCBsYW1iZGFWYXJGb3JtKTsKKworCQkJbGFtYmRhSW5zdGFuY2UgPSBuZXcgSW5zdGFuY2VPZkRhdGEoCisJCQkJCUlQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9TVEFOREFSRF9OQVRVUkUsCisJCQkJCWZ1bkF2bUxhbWJkYSwgbGFtYmRhVmFyaWFibGUsIFR5cGVNYW5hZ2VyOjpVTklWRVJTQUwsCisJCQkJCW9mZnNldCwgTW9kaWZpZXI6OlBST1BFUlRZX1BBUkFNRVRFUl9NT0RJRklFUiApOworCisJCQlmdW5Bdm1MYW1iZGEtPnNldERhdGEob2Zmc2V0LCBsYW1iZGFJbnN0YW5jZSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlBVk1fT1NfRVhJVCggRkFJTEVEICkKKwkJCQkJPDwgIlVuZXhwZWN0ZWQgTEFNQkRBIFZBUklBQkxFIGZvciAiCisJCQkJCQkiY29tcGlsZUF2bUNvZGVMYW1iZGFcbiIgPDwgYUNvZGUtPnRvU3RyaW5nKCkKKwkJCQkJPDwgU0VORF9FWElUOworCQl9CisJfQorCisJZnVuQXZtTGFtYmRhLT5zZXRFeHByZXNzaW9uKCBjb21waWxlQXJnUnZhbHVlKAorCQkJYUNUWC0+bmV3Q1RYKGZ1bkF2bUxhbWJkYSwgYUNUWC0+bVJ1bnRpbWVDdHgpLCBhQ29kZS0+bGFzdCgpKSApOworCisJcmV0dXJuKCBiZkZ1bkxhbWJkYSApOworLy8JcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NvZGUoCisvLwkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfSU5WT0tFX0xBTUJEQV9BUFBMWSwgYmZGdW5MYW1iZGEpICk7Cit9CisKK0JGQ29kZSBBdm1jb2RlTGFtYmRhRXhwckNvbXBpbGVyOjpjb21waWxlU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlpZiggYUNvZGUtPmVtcHR5KCkgKQorCXsKKwkJQVZNX09TX0VYSVQoIEZBSUxFRCApCisJCQkJPDwgIlVuZXhwZWN0ZWQgTEFNQkRBIEVYUFJFU1NJT04gd2l0aG91dCBhcmd1bWVudCAiCisJCQkJCSJmb3IgY29tcGlsZUF2bUNvZGVMYW1iZGFcbiIgPDwgYUNvZGUtPnRvU3RyaW5nKCkKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJcmV0dXJuKCBCRkNvZGU6OlJFRl9OVUxMICk7CisJfQorCisJYXZtX3NpemVfdCB2YXJDb3VudCA9IGFDb2RlLT5zaXplKCkgLSAxOworCisJQXZtTGFtYmRhICogZnVuQXZtTGFtYmRhID0gbmV3IEF2bUxhbWJkYSgKKwkJCWFDVFgtPm1Db21waWxlQ3R4LCB2YXJDb3VudCwgQVZNX0xBTUJEQV9GVU5fTkFUVVJFKTsKKworCUJGIGJmRnVuTGFtYmRhKCBmdW5Bdm1MYW1iZGEgKTsKKworCUJGIGxhbWJkYVZhcjsKKwlCRiBsYW1iZGFWYXJGb3JtOworCVZhcmlhYmxlICogbGFtYmRhVmFyaWFibGU7CisJSW5zdGFuY2VPZkRhdGEgKiBsYW1iZGFJbnN0YW5jZTsKKworCUF2bUNvZGU6Oml0ZXJhdG9yIGl0QXJnID0gYUNvZGUtPmJlZ2luKCk7CisJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDAgOyBvZmZzZXQgPCB2YXJDb3VudCA7ICsraXRBcmcgLCArK29mZnNldCApCisJeworCQlsYW1iZGFWYXIgPSAoKml0QXJnKTsKKworCQlpZiggbGFtYmRhVmFyLmlzSWRlbnRpZmllcigpIHx8IGxhbWJkYVZhci5pc1VmaSgpIHx8CisJCQkJbGFtYmRhVmFyLmlzPCBVbmlGb3JtSWRlbnRpZmllciA+KCkgKQorCQl7CisJCQlsYW1iZGFWYXJGb3JtID0gQkYoIGxhbWJkYVZhcmlhYmxlID0gbmV3IFZhcmlhYmxlKAorCQkJCQljb25zdF9jYXN0PCBPYmplY3RFbGVtZW50ICogPigKKwkJCQkJCQlhQ1RYLT5tQ29tcGlsZUN0eC0+Z2V0QXN0RWxlbWVudCgpICksCisJCQkJCVR5cGVNYW5hZ2VyOjpVTklWRVJTQUwsIGxhbWJkYVZhci5zdHIoKSwgbGFtYmRhVmFyLnN0cigpKSApOworCQkJYUNvZGUtPnNldChvZmZzZXQsIGxhbWJkYVZhckZvcm0pOworCisJCQlsYW1iZGFJbnN0YW5jZSA9IG5ldyBJbnN0YW5jZU9mRGF0YSgKKwkJCQkJSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX1NUQU5EQVJEX05BVFVSRSwKKwkJCQkJZnVuQXZtTGFtYmRhLCBsYW1iZGFWYXJpYWJsZSwgVHlwZU1hbmFnZXI6OlVOSVZFUlNBTCwKKwkJCQkJb2Zmc2V0LCBNb2RpZmllcjo6UFJPUEVSVFlfUEFSQU1FVEVSX01PRElGSUVSICk7CisKKwkJCWZ1bkF2bUxhbWJkYS0+c2V0RGF0YShvZmZzZXQsIGxhbWJkYUluc3RhbmNlKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCUFWTV9PU19FWElUKCBGQUlMRUQgKQorCQkJCQk8PCAiVW5leHBlY3RlZCBMQU1CREEgVkFSSUFCTEUgZm9yICIKKwkJCQkJCSJjb21waWxlQXZtQ29kZUxhbWJkYVxuIiA8PCBhQ29kZS0+dG9TdHJpbmcoKQorCQkJCQk8PCBTRU5EX0VYSVQ7CisJCX0KKwl9CisKKwlCRiBsYW1iZGFDb2RlID0gQVZNQ09ERV9DT01QSUxFUi5kZWNvZGVfY29tcGlsZVN0YXRlbWVudCgKKwkJCWFDVFgtPm5ld0NUWChmdW5Bdm1MYW1iZGEsIGFDVFgtPm1SdW50aW1lQ3R4KSwgYUNvZGUtPmxhc3QoKSk7CisKKwlmdW5Bdm1MYW1iZGEtPnNldEV4cHJlc3Npb24oIGxhbWJkYUNvZGUgKTsKKworCXJldHVybiggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0lOVk9LRV9MQU1CREFfQVBQTFksIGJmRnVuTGFtYmRhKSApOworfQorCisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZUxhbWJkYUNvbXBpbGVyLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlTGFtYmRhQ29tcGlsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWRkMzNmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZUxhbWJkYUNvbXBpbGVyLmgKQEAgLTAsMCArMSwzNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDEwIG1haSAyMDExCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQVZNQ09ERUxBTUJEQUNPTVBJTEVSX0hfCisjZGVmaW5lIEFWTUNPREVMQU1CREFDT01QSUxFUl9IXworCisjaW5jbHVkZSA8YnVpbGRlci9wcmltaXRpdmUvQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXIuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworQVZNQ09ERV9DT01QSUxFUl9DTEFTUyhMYW1iZGFBcHBseSwgQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXIpCisKK0FWTUNPREVfQ09NUElMRVJfQ0xBU1MoTGFtYmRhTGV0LCBBYnN0cmFjdEF2bWNvZGVDb21waWxlcikKKworQVZNQ09ERV9DT01QSUxFUl9DTEFTUyhMYW1iZGFFeHByLCBBYnN0cmFjdEF2bWNvZGVDb21waWxlcikKKworCit9CisKKyNlbmRpZiAvKiBBVk1DT0RFTEFNQkRBQ09NUElMRVJfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVMb29rdXBFeHByQ29tcGlsZXIuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZUxvb2t1cEV4cHJDb21waWxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY1ZDQ5YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVMb29rdXBFeHByQ29tcGlsZXIuY3BwCkBAIC0wLDAgKzEsNDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxIG1haSAyMDExCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJBdm1jb2RlTG9va3VwRXhwckNvbXBpbGVyLmgiCisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9Bdm1Db2RlLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIExPT0tVUCBFWFBSRVNTSU9OIENPTVBJTEFUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitCRiBBdm1jb2RlTG9va3VwRXhwcmVzc2lvbkNvbXBpbGVyOjpjb21waWxlRXhwcmVzc2lvbigKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJcmV0dXJuKCBjb21waWxlRXhwcmVzc2lvbkNvZGUoYUNUWCwgYUNvZGUpICk7Cit9CisKK0JGIEF2bWNvZGVMb29rdXBFeHByZXNzaW9uQ29tcGlsZXI6Om9wdGltaXplRXhwcmVzc2lvbigKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJcmV0dXJuKCBvcHRpbWl6ZUV4cHJlc3Npb25Db2RlKGFDVFgsIGFDb2RlKSApOworfQorCisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZUxvb2t1cEV4cHJDb21waWxlci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZUxvb2t1cEV4cHJDb21waWxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NTI1YjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlTG9va3VwRXhwckNvbXBpbGVyLmgKQEAgLTAsMCArMSwzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDEgbWFpIDIwMTEKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBBVk1DT0RFTE9PS1VQRVhQUkNPTVBJTEVSX0hfCisjZGVmaW5lIEFWTUNPREVMT09LVVBFWFBSQ09NUElMRVJfSF8KKworI2luY2x1ZGUgPGJ1aWxkZXIvcHJpbWl0aXZlL0Fic3RyYWN0QXZtY29kZUNvbXBpbGVyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK0FWTUNPREVfQ09NUElMRVJfRVhQUkVTU0lPTl9PUFRJTUlaRVJfQ0xBU1MoCisJCSJMT09LVVAiLCBMb29rdXBFeHByZXNzaW9uLCBBYnN0cmFjdEF2bWNvZGVDb21waWxlcikKKworCisKK30KKworI2VuZGlmIC8qIEFWTUNPREVMT09LVVBFWFBSQ09NUElMRVJfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVMb29wQ29tcGlsZXIuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZUxvb3BDb21waWxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRlZTk3MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVMb29wQ29tcGlsZXIuY3BwCkBAIC0wLDAgKzEsMTgxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjYgbm92LiAyMDExCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJBdm1jb2RlTG9vcENvbXBpbGVyLmgiCisKKyNpbmNsdWRlIDxidWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlQ29tcGlsZXIuaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0F2bUNvZGUuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9TdGF0ZW1lbnRDb25zdHJ1Y3Rvci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQVZNQ09ERSBGT1IgQ09NUElMQVRJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0JGQ29kZSBBdm1jb2RlRm9yQ29tcGlsZXI6OmNvbXBpbGVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCXJldHVybiggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoYUNvZGUtPmdldE9wZXJhdG9yKCksCisJCQlBVk1DT0RFX0NPTVBJTEVSLmRlY29kZV9jb21waWxlU3RhdGVtZW50KGFDVFgsIGFDb2RlLT5maXJzdCgpKSwKKwkJCWNvbXBpbGVBcmdSdmFsdWUoYUNUWCwgVHlwZU1hbmFnZXI6OkJPT0xFQU4sIGFDb2RlLT5zZWNvbmQoKSksCisJCQlBVk1DT0RFX0NPTVBJTEVSLmRlY29kZV9jb21waWxlU3RhdGVtZW50KGFDVFgsIGFDb2RlLT50aGlyZCgpKSwKKwkJCUFWTUNPREVfQ09NUElMRVIuZGVjb2RlX2NvbXBpbGVTdGF0ZW1lbnQoYUNUWCwgYUNvZGUtPmZvdXJ0aCgpKSkgKTsKK30KKworCitCRkNvZGUgQXZtY29kZUZvckNvbXBpbGVyOjpvcHRpbWl6ZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJQkZDb2RlIG9wdGltaXplZENvZGUoYUNvZGUtPmdldE9wZXJhdG9yKCksCisJCQlBVk1DT0RFX0NPTVBJTEVSLmRlY29kZV9vcHRpbWl6ZVN0YXRlbWVudChhQ1RYLCBhQ29kZS0+Zmlyc3QoKSksCisJCQlBVk1DT0RFX0NPTVBJTEVSLmRlY29kZV9vcHRpbWl6ZUV4cHJlc3Npb24oYUNUWCwgYUNvZGUtPnNlY29uZCgpKSwKKwkJCUFWTUNPREVfQ09NUElMRVIuZGVjb2RlX29wdGltaXplU3RhdGVtZW50KGFDVFgsIGFDb2RlLT50aGlyZCgpKSwKKwkJCUFWTUNPREVfQ09NUElMRVIuZGVjb2RlX29wdGltaXplU3RhdGVtZW50KGFDVFgsIGFDb2RlLT5mb3VydGgoKSkgKTsKKworCUF2bUluc3RydWN0aW9uICogYXJnc0luc3RydWN0aW9uID0gb3B0aW1pemVkQ29kZS0+Z2VuSW5zdHJ1Y3Rpb24oKTsKKworCXNldEFyZ2NvZGVTdGF0ZW1lbnQoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdCgwKSwgb3B0aW1pemVkQ29kZS0+Zmlyc3QoKSk7CisKKwlhcmdzSW5zdHJ1Y3Rpb24tPmF0KDEpLmR0eXBlID0gVHlwZU1hbmFnZXI6OkJPT0xFQU47CisJc2V0QXJnY29kZVJWYWx1ZShhQ1RYLCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDEpLCBvcHRpbWl6ZWRDb2RlLT5zZWNvbmQoKSk7CisKKwlzZXRBcmdjb2RlU3RhdGVtZW50KGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMiksIG9wdGltaXplZENvZGUtPnRoaXJkKCkpOworCisJc2V0QXJnY29kZVN0YXRlbWVudChhQ1RYLCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDMpLCBvcHRpbWl6ZWRDb2RlLT5mb3VydGgoKSk7CisKKwlhcmdzSW5zdHJ1Y3Rpb24tPnNldE1haW5CeXRlY29kZSgKKwkJCS8qb3BlcmF0aW9uKi8gQVZNX0FSR19OT1BTLAorCQkJLypvcGVyYW5kICAqLyBBVk1fQVJHX1NUQVRFTUVOVF9LSU5EICk7CisKKwlyZXR1cm4oIG9wdGltaXplZENvZGUgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQVZNQ09ERSBGT1JFQUNIIENPTVBJTEFUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitCRkNvZGUgQXZtY29kZUZvcmVhY2hDb21waWxlcjo6Y29tcGlsZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJcmV0dXJuKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSggYUNvZGUtPmdldE9wZXJhdG9yKCksCisJCQljb21waWxlQXJnTHZhbHVlKGFDVFgsIGFDb2RlLT5maXJzdCgpKSwKKwkJCWNvbXBpbGVBcmdSdmFsdWUoYUNUWCwgYUNvZGUtPnNlY29uZCgpKSwKKwkJCUFWTUNPREVfQ09NUElMRVIuZGVjb2RlX2NvbXBpbGVTdGF0ZW1lbnQoYUNUWCwgYUNvZGUtPnRoaXJkKCkpICkgKTsKK30KKworCitCRkNvZGUgQXZtY29kZUZvcmVhY2hDb21waWxlcjo6b3B0aW1pemVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCUJGQ29kZSBvcHRpbWl6ZWRDb2RlKGFDb2RlLT5nZXRPcGVyYXRvcigpLAorCQkJQVZNQ09ERV9DT01QSUxFUi5kZWNvZGVfb3B0aW1pemVFeHByZXNzaW9uKGFDVFgsIGFDb2RlLT5maXJzdCgpKSwKKwkJCUFWTUNPREVfQ09NUElMRVIuZGVjb2RlX29wdGltaXplRXhwcmVzc2lvbihhQ1RYLCBhQ29kZS0+c2Vjb25kKCkpLAorCQkJQVZNQ09ERV9DT01QSUxFUi5kZWNvZGVfb3B0aW1pemVTdGF0ZW1lbnQoYUNUWCwgYUNvZGUtPnRoaXJkKCkpICk7CisKKwlBdm1JbnN0cnVjdGlvbiAqIGFyZ3NJbnN0cnVjdGlvbiA9IG9wdGltaXplZENvZGUtPmdlbkluc3RydWN0aW9uKCk7CisKKwlzZXRBcmdjb2RlTFZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMCksIG9wdGltaXplZENvZGUtPmZpcnN0KCksIGZhbHNlKTsKKworCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdCgxKSwgb3B0aW1pemVkQ29kZS0+c2Vjb25kKCkpOworCisJc2V0QXJnY29kZVN0YXRlbWVudChhQ1RYLCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDIpLCBvcHRpbWl6ZWRDb2RlLT50aGlyZCgpKTsKKworCWFyZ3NJbnN0cnVjdGlvbi0+Y29tcHV0ZU1haW5CeXRlY29kZSgKKwkJCS8qY29udGV4dCAgKi8gQVZNX0FSR19TVEFOREFSRF9DVFgsCisJCQkvKnByb2Nlc3NvciovIEFWTV9BUkdfU1RBVEVNRU5UX0NQVSwKKwkJCS8qb3BlcmF0aW9uKi8gQVZNX0FSR19TRVZBTF9WQUxVRSwKKwkJCS8qb3BlcmFuZCAgKi8gQVZNX0FSR19TVEFURU1FTlRfS0lORCk7CisKKwlyZXR1cm4oIG9wdGltaXplZENvZGUgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQVZNQ09ERSBXSElMRSBETyBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkZDb2RlIEF2bWNvZGVXaGlsZURvQ29tcGlsZXI6OmNvbXBpbGVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCXJldHVybiggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoYUNvZGUtPmdldE9wZXJhdG9yKCksCisJCQljb21waWxlQXJnUnZhbHVlKGFDVFgsIFR5cGVNYW5hZ2VyOjpCT09MRUFOLCBhQ29kZS0+Zmlyc3QoKSksCisJCQlBVk1DT0RFX0NPTVBJTEVSLmRlY29kZV9jb21waWxlU3RhdGVtZW50KGFDVFgsIGFDb2RlLT5zZWNvbmQoKSkpICk7Cit9CisKKworQkZDb2RlIEF2bWNvZGVXaGlsZURvQ29tcGlsZXI6Om9wdGltaXplU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlCRkNvZGUgb3B0aW1pemVkQ29kZShTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZShhQ29kZS0+Z2V0T3BlcmF0b3IoKSwKKwkJCUFWTUNPREVfQ09NUElMRVIuZGVjb2RlX29wdGltaXplRXhwcmVzc2lvbihhQ1RYLCBhQ29kZS0+Zmlyc3QoKSksCisJCQlBVk1DT0RFX0NPTVBJTEVSLmRlY29kZV9vcHRpbWl6ZVN0YXRlbWVudChhQ1RYLCBhQ29kZS0+c2Vjb25kKCkpKSApOworCisJQXZtSW5zdHJ1Y3Rpb24gKiBhcmdzSW5zdHJ1Y3Rpb24gPSBvcHRpbWl6ZWRDb2RlLT5nZW5JbnN0cnVjdGlvbigpOworCisJYXJnc0luc3RydWN0aW9uLT5hdCgwKS5kdHlwZSA9IFR5cGVNYW5hZ2VyOjpCT09MRUFOOworCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdCgwKSwgb3B0aW1pemVkQ29kZS0+Zmlyc3QoKSk7CisKKwlzZXRBcmdjb2RlU3RhdGVtZW50KGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMSksIG9wdGltaXplZENvZGUtPnNlY29uZCgpKTsKKworCWFyZ3NJbnN0cnVjdGlvbi0+c2V0TWFpbkJ5dGVjb2RlKAorCQkJLypvcGVyYXRpb24qLyBBVk1fQVJHX05PUFMsCisJCQkvKm9wZXJhbmQgICovIEFWTV9BUkdfU1RBVEVNRU5UX0tJTkQgKTsKKworCXJldHVybiggb3B0aW1pemVkQ29kZSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIERPIFdISUxFIENPTVBJTEFUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitCRkNvZGUgQXZtY29kZURvV2hpbGVDb21waWxlcjo6Y29tcGlsZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJcmV0dXJuKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZShhQ29kZS0+Z2V0T3BlcmF0b3IoKSwKKwkJCUFWTUNPREVfQ09NUElMRVIuZGVjb2RlX2NvbXBpbGVTdGF0ZW1lbnQoYUNUWCwgYUNvZGUtPmZpcnN0KCkpLAorCQkJY29tcGlsZUFyZ1J2YWx1ZShhQ1RYLCBUeXBlTWFuYWdlcjo6Qk9PTEVBTiwgYUNvZGUtPnNlY29uZCgpKSkgKTsKK30KKworCitCRkNvZGUgQXZtY29kZURvV2hpbGVDb21waWxlcjo6b3B0aW1pemVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCUJGQ29kZSBvcHRpbWl6ZWRDb2RlKFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKGFDb2RlLT5nZXRPcGVyYXRvcigpLAorCQkJQVZNQ09ERV9DT01QSUxFUi5kZWNvZGVfb3B0aW1pemVTdGF0ZW1lbnQoYUNUWCwgYUNvZGUtPmZpcnN0KCkpLAorCQkJQVZNQ09ERV9DT01QSUxFUi5kZWNvZGVfb3B0aW1pemVFeHByZXNzaW9uKGFDVFgsIGFDb2RlLT5zZWNvbmQoKSkpICk7CisKKwlBdm1JbnN0cnVjdGlvbiAqIGFyZ3NJbnN0cnVjdGlvbiA9IG9wdGltaXplZENvZGUtPmdlbkluc3RydWN0aW9uKCk7CisKKwlzZXRBcmdjb2RlU3RhdGVtZW50KGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMCksIG9wdGltaXplZENvZGUtPmZpcnN0KCkpOworCisJYXJnc0luc3RydWN0aW9uLT5hdCgxKS5kdHlwZSA9IFR5cGVNYW5hZ2VyOjpCT09MRUFOOworCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdCgxKSwgb3B0aW1pemVkQ29kZS0+c2Vjb25kKCkpOworCisJYXJnc0luc3RydWN0aW9uLT5zZXRNYWluQnl0ZWNvZGUoCisJCQkvKm9wZXJhdGlvbiovIEFWTV9BUkdfTk9QUywKKwkJCS8qb3BlcmFuZCAgKi8gQVZNX0FSR19TVEFURU1FTlRfS0lORCApOworCisJcmV0dXJuKCBvcHRpbWl6ZWRDb2RlICk7Cit9CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlTG9vcENvbXBpbGVyLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlTG9vcENvbXBpbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYzZGMzNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVMb29wQ29tcGlsZXIuaApAQCAtMCwwICsxLDM4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjYgbm92LiAyMDExCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQVZNQ09ERUxPT1BDT01QSUxFUl9IXworI2RlZmluZSBBVk1DT0RFTE9PUENPTVBJTEVSX0hfCisKKyNpbmNsdWRlIDxidWlsZGVyL3ByaW1pdGl2ZS9BYnN0cmFjdEF2bWNvZGVDb21waWxlci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitBVk1DT0RFX0NPTVBJTEVSX1NUQVRFTUVOVF9PUFRJTUlaRVJfQ0xBU1MoIkxPT1AjRk9SIiwgRm9yLCBBYnN0cmFjdEF2bWNvZGVDb21waWxlcikKKworQVZNQ09ERV9DT01QSUxFUl9TVEFURU1FTlRfT1BUSU1JWkVSX0NMQVNTKCJMT09QI0ZPUkVBQ0giLCBGb3JlYWNoLCBBYnN0cmFjdEF2bWNvZGVDb21waWxlcikKKworQVZNQ09ERV9DT01QSUxFUl9TVEFURU1FTlRfT1BUSU1JWkVSX0NMQVNTKCJMT09QI1dISUxFX0RPIiwgV2hpbGVEbywgQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXIpCisKK0FWTUNPREVfQ09NUElMRVJfU1RBVEVNRU5UX09QVElNSVpFUl9DTEFTUygiTE9PUCNET19XSElMRSIsIERvV2hpbGUsIEFic3RyYWN0QXZtY29kZUNvbXBpbGVyKQorCisKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKyNlbmRpZiAvKiBBVk1DT0RFTE9PUENPTVBJTEVSX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlTWFjaGluZVN0YXR1c0NvbXBpbGVyLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVNYWNoaW5lU3RhdHVzQ29tcGlsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YjZjYzAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlTWFjaGluZVN0YXR1c0NvbXBpbGVyLmNwcApAQCAtMCwwICsxLDcwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMSBtYWkgMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQXZtY29kZU1hY2hpbmVTdGF0dXNDb21waWxlci5oIgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQXZtQ29kZS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQVZNQ09ERSBNQUNISU5FIFNUQVRVUyBFWFBSRVNTSU9OIENPTVBJTEFUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitCRiBBdm1jb2RlTWFjaGluZVN0YXR1c0V4cHJlc3Npb25Db21waWxlcjo6Y29tcGlsZUV4cHJlc3Npb24oCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCUJGQ29kZSBhQ29tcGlsZWRDb2RlKCBhQ29kZS0+Z2V0T3BlcmF0b3IoKSwKKwkJCWNvbXBpbGVBcmdSdmFsdWUoYUNUWCwgVHlwZU1hbmFnZXI6Ok9QRVJBVE9SLCBhQ29kZS0+Zmlyc3QoKSksCisJCQljb21waWxlQXJnUnZhbHVlKGFDVFgsIFR5cGVNYW5hZ2VyOjpNQUNISU5FICwgYUNvZGUtPnNlY29uZCgpKSApOworCisJcmV0dXJuKCBhQ29tcGlsZWRDb2RlICk7Cit9CisKKworQkYgQXZtY29kZU1hY2hpbmVTdGF0dXNFeHByZXNzaW9uQ29tcGlsZXI6Om9wdGltaXplRXhwcmVzc2lvbigKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJQXZtSW5zdHJ1Y3Rpb24gKiBhcmdzSW5zdHJ1Y3Rpb24gPSBhQ29kZS0+Z2VuSW5zdHJ1Y3Rpb24oKTsKKworCW9wdGltaXplQXJnRXhwcmVzc2lvbihhQ1RYLCBhQ29kZSwgMCk7CisJb3B0aW1pemVBcmdFeHByZXNzaW9uKGFDVFgsIGFDb2RlLCAxKTsKKworCWlmKCBhQ29kZS0+Zmlyc3QoKS5pc25vdDwgT3BlcmF0b3IgPigpICYmIGFDb2RlLT5zZWNvbmQoKS5pczwgT3BlcmF0b3IgPigpICkKKwl7CisJCXN0ZDo6c3dhcChhQ29kZS0+Zmlyc3QoKSwgYUNvZGUtPnNlY29uZCgpKTsKKwl9CisKKwlhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLmR0eXBlID0gVHlwZU1hbmFnZXI6Ok9QRVJBVE9SOworCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdCgwKSwgYUNvZGUtPmZpcnN0KCkpOworCisJYXJnc0luc3RydWN0aW9uLT5hdCgxKS5kdHlwZSA9IFR5cGVNYW5hZ2VyOjpNQUNISU5FOworCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdCgxKSwgYUNvZGUtPnNlY29uZCgpKTsKKworCWFyZ3NJbnN0cnVjdGlvbi0+Y29tcHV0ZU1haW5CeXRlY29kZSgKKwkJCS8qY29udGV4dCAgKi8gQVZNX0FSR19SRVRVUk5fQ1RYLAorCQkJLypwcm9jZXNzb3IqLyBBVk1fQVJHX01FTU9SWV9NQUNISU5FX0NQVSwKKwkJCS8qb3BlcmF0aW9uKi8gQVZNX0FSR19TRVZBTF9SVkFMVUUsCisJCQkvKm9wZXJhbmQgICovIEFWTV9BUkdfRVhQUkVTU0lPTl9LSU5ELAorCQkJLypkdHlwZSAgICAqLyBUeXBlTWFuYWdlcjo6Qk9PTEVBTik7CisKKwlyZXR1cm4oIGFDb2RlICk7Cit9CisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZU1hY2hpbmVTdGF0dXNDb21waWxlci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZU1hY2hpbmVTdGF0dXNDb21waWxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNjAwNzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlTWFjaGluZVN0YXR1c0NvbXBpbGVyLmgKQEAgLTAsMCArMSwzMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDEgbWFpIDIwMTEKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBBVk1DT0RFTUFDSElORVNUQVRVU0NPTVBJTEVSX0hfCisjZGVmaW5lIEFWTUNPREVNQUNISU5FU1RBVFVTQ09NUElMRVJfSF8KKworI2luY2x1ZGUgPGJ1aWxkZXIvcHJpbWl0aXZlL0Fic3RyYWN0QXZtY29kZUNvbXBpbGVyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK0FWTUNPREVfQ09NUElMRVJfRVhQUkVTU0lPTl9PUFRJTUlaRVJfQ0xBU1MoCisJCSJNQUNISU5FIFNUQVRVUyIsIE1hY2hpbmVTdGF0dXNFeHByZXNzaW9uLCBBYnN0cmFjdEF2bWNvZGVDb21waWxlcikKKworCit9CisKKyNlbmRpZiAvKiBBVk1DT0RFTUFDSElORVNUQVRVU0NPTVBJTEVSX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlTWF0aEZ1bmN0aW9uQ29tcGlsZXIuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZU1hdGhGdW5jdGlvbkNvbXBpbGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTAxYTEyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZU1hdGhGdW5jdGlvbkNvbXBpbGVyLmNwcApAQCAtMCwwICsxLDUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjkgYXZyLiAyMDExCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJBdm1jb2RlTWF0aEZ1bmN0aW9uQ29tcGlsZXIuaCIKKworI2luY2x1ZGUgPGZtbC90eXBlL1R5cGVNYW5hZ2VyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIEFSSVRITUVUSUMgRVhQUkVTU0lPTiBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkYgQXZtY29kZU1hdGhGdW5jdGlvbkNvbXBpbGVyOjpjb21waWxlRXhwcmVzc2lvbigKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJcmV0dXJuKCBjb21waWxlRXhwcmVzc2lvbkNvZGUoYUNUWCwgYUNvZGUpICk7Cit9CisKK0JGIEF2bWNvZGVNYXRoRnVuY3Rpb25Db21waWxlcjo6b3B0aW1pemVFeHByZXNzaW9uKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlCRkNvZGUgb3B0Q29kZSA9IG9wdGltaXplRXhwcmVzc2lvbkNvZGUoYUNUWCwgYUNvZGUsIEFWTV9BUkdfRVhQUkVTU0lPTl9LSU5EKSA7CisKKwlvcHRDb2RlLT5nZXRJbnN0cnVjdGlvbigpLT5zZXRNYWluQnl0ZWNvZGUoCisJCQkvKmNvbnRleHQgICovIEFWTV9BUkdfUkVUVVJOX0NUWCwKKwkJCS8qcHJvY2Vzc29yKi8gQVZNX0FSR19BUklUSE1FVElDX0xPR0lDX0NQVSwKKwkJCS8qb3BlcmF0aW9uKi8gQVZNX0FSR19TRVZBTF9SVkFMVUUsCisJCQkvKm9wZXJhbmQgICovIEFWTV9BUkdfRVhQUkVTU0lPTl9LSU5ELAorCQkJLypkdHlwZSAgICAqLyBUeXBlTWFuYWdlcjo6VU5JVkVSU0FMICk7CisKKworCXJldHVybiggb3B0Q29kZSApOworfQorCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVNYXRoRnVuY3Rpb25Db21waWxlci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZU1hdGhGdW5jdGlvbkNvbXBpbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg5YjIxYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVNYXRoRnVuY3Rpb25Db21waWxlci5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyOSBhdnIuIDIwMTEKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBBVk1DT0RFTUFUSEZVTkNUSU9OQ09NUElMRVJfSF8KKyNkZWZpbmUgQVZNQ09ERU1BVEhGVU5DVElPTkNPTVBJTEVSX0hfCisKKyNpbmNsdWRlIDxidWlsZGVyL3ByaW1pdGl2ZS9BYnN0cmFjdEF2bWNvZGVDb21waWxlci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitBVk1DT0RFX0NPTVBJTEVSX0VYUFJFU1NJT05fT1BUSU1JWkVSX0NMQVNTKCJNQVRIX0ZVQ1RJT04iLAorCQlNYXRoRnVuY3Rpb24sIEFic3RyYWN0QXZtY29kZUNvbXBpbGVyKQorCisKK30KKworI2VuZGlmIC8qIEFWTUNPREVNQVRIRlVOQ1RJT05DT01QSUxFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZU1ldGFTdGF0ZW1lbnRDb21waWxlci5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlTWV0YVN0YXRlbWVudENvbXBpbGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yjc3MTNkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZU1ldGFTdGF0ZW1lbnRDb21waWxlci5jcHAKQEAgLTAsMCArMSwxNzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxNCBtYXJzIDIwMTIKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkF2bWNvZGVNZXRhU3RhdGVtZW50Q29tcGlsZXIuaCIKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIE5PUCBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkYgQXZtY29kZU5vdGhpbmdDb21waWxlcjo6Y29tcGlsZUV4cHJlc3Npb24oCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCXJldHVybiggYUNvZGUgKTsKK30KKworQkYgQXZtY29kZU5vdGhpbmdDb21waWxlcjo6b3B0aW1pemVFeHByZXNzaW9uKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlyZXR1cm4oIGFDb2RlICk7Cit9CisKKworQkZDb2RlIEF2bWNvZGVOb3RoaW5nQ29tcGlsZXI6OmNvbXBpbGVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCXJldHVybiggYUNvZGUgKTsKK30KKworQkZDb2RlIEF2bWNvZGVOb3RoaW5nQ29tcGlsZXI6Om9wdGltaXplU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlyZXR1cm4oIGFDb2RlICk7Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQVZNQ09ERSBJTkZPUk1BTCBFWFBSRVNTSU9OIENPTVBJTEFUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitCRiBBdm1jb2RlSW5mb3JtYWxFeHByZXNzaW9uQ29tcGlsZXI6OmNvbXBpbGVFeHByZXNzaW9uKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlyZXR1cm4oIEFic3RyYWN0QXZtY29kZUNvbXBpbGVyOjpjb21waWxlQXZtY29kZShhQ1RYLCBhQ29kZSkgKTsKK30KKworCitCRkNvZGUgQXZtY29kZUluZm9ybWFsRXhwcmVzc2lvbkNvbXBpbGVyOjpjb21waWxlU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlyZXR1cm4oIEFic3RyYWN0QXZtY29kZUNvbXBpbGVyOjpjb21waWxlQXZtY29kZShhQ1RYLCBhQ29kZSkgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQVZNQ09ERSBUUkFDRSBFWFBSRVNTSU9OIENPTVBJTEFUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitCRiBBdm1jb2RlVHJhY2VFeHByZXNzaW9uQ29tcGlsZXI6OmNvbXBpbGVFeHByZXNzaW9uKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlyZXR1cm4oIEFic3RyYWN0QXZtY29kZUNvbXBpbGVyOjpjb21waWxlQXZtY29kZShhQ1RYLCBhQ29kZSkgKTsKK30KKworCitCRkNvZGUgQXZtY29kZVRyYWNlRXhwcmVzc2lvbkNvbXBpbGVyOjpjb21waWxlU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlyZXR1cm4oIEFic3RyYWN0QXZtY29kZUNvbXBpbGVyOjpjb21waWxlQXZtY29kZShhQ1RYLCBhQ29kZSkgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQVZNQ09ERSBERUJVRyBFWFBSRVNTSU9OIENPTVBJTEFUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitCRiBBdm1jb2RlRGVidWdFeHByZXNzaW9uQ29tcGlsZXI6OmNvbXBpbGVFeHByZXNzaW9uKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlyZXR1cm4oIEFic3RyYWN0QXZtY29kZUNvbXBpbGVyOjpjb21waWxlQXZtY29kZShhQ1RYLCBhQ29kZSkgKTsKK30KKworCitCRkNvZGUgQXZtY29kZURlYnVnRXhwcmVzc2lvbkNvbXBpbGVyOjpjb21waWxlU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlyZXR1cm4oIEFic3RyYWN0QXZtY29kZUNvbXBpbGVyOjpjb21waWxlQXZtY29kZShhQ1RYLCBhQ29kZSkgKTsKK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIENPTU1FTlQgRVhQUkVTU0lPTiBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkYgQXZtY29kZUNvbW1lbnRFeHByZXNzaW9uQ29tcGlsZXI6OmNvbXBpbGVFeHByZXNzaW9uKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlCRkNvZGUgbmV3Q29kZSA9IGFDb2RlOworCisJcmV0dXJuKCBuZXdDb2RlICk7Cit9CisKKworQkZDb2RlIEF2bWNvZGVDb21tZW50RXhwcmVzc2lvbkNvbXBpbGVyOjpjb21waWxlU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlCRkNvZGUgbmV3Q29kZSA9IGFDb2RlOworCisJcmV0dXJuKCBuZXdDb2RlICk7Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQVZNQ09ERSBNRVRBIEVWQUwgU1RBVEVNRU5UIENPTVBJTEFUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitCRiBBdm1jb2RlTWV0YUV2YWxTdGF0ZW1lbnRDb21waWxlcjo6Y29tcGlsZUV4cHJlc3Npb24oCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCXJldHVybiggQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXI6OmNvbXBpbGVBdm1jb2RlKGFDVFgsIGFDb2RlKSApOworfQorCisKK0JGQ29kZSBBdm1jb2RlTWV0YUV2YWxTdGF0ZW1lbnRDb21waWxlcjo6Y29tcGlsZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJcmV0dXJuKCBBYnN0cmFjdEF2bWNvZGVDb21waWxlcjo6Y29tcGlsZUF2bWNvZGUoYUNUWCwgYUNvZGUpICk7Cit9CisKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIE1FVEEgUlVOIFNUQVRFTUVOVCBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkYgQXZtY29kZU1ldGFSdW5TdGF0ZW1lbnRDb21waWxlcjo6Y29tcGlsZUV4cHJlc3Npb24oCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCXJldHVybiggQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXI6OmNvbXBpbGVBdm1jb2RlKGFDVFgsIGFDb2RlKSApOworfQorCisKK0JGQ29kZSBBdm1jb2RlTWV0YVJ1blN0YXRlbWVudENvbXBpbGVyOjpjb21waWxlU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlyZXR1cm4oIEFic3RyYWN0QXZtY29kZUNvbXBpbGVyOjpjb21waWxlQXZtY29kZShhQ1RYLCBhQ29kZSkgKTsKK30KKworCisKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVNZXRhU3RhdGVtZW50Q29tcGlsZXIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVNZXRhU3RhdGVtZW50Q29tcGlsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjRhM2M3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZU1ldGFTdGF0ZW1lbnRDb21waWxlci5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxNCBtYXJzIDIwMTIKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBBVk1DT0RFTUVUQVNUQVRFTUVOVENPTVBJTEVSX0hfCisjZGVmaW5lIEFWTUNPREVNRVRBU1RBVEVNRU5UQ09NUElMRVJfSF8KKworI2luY2x1ZGUgPGJ1aWxkZXIvcHJpbWl0aXZlL0Fic3RyYWN0QXZtY29kZUNvbXBpbGVyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK0FWTUNPREVfQ09NUElMRVJfT1BUSU1JWkVSX0NMQVNTKE5vdGhpbmcsIEFic3RyYWN0QXZtY29kZUNvbXBpbGVyKQorCitBVk1DT0RFX0NPTVBJTEVSX0NMQVNTKEluZm9ybWFsRXhwcmVzc2lvbiwgQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXIpCisKK0FWTUNPREVfQ09NUElMRVJfQ0xBU1MoVHJhY2VFeHByZXNzaW9uLCBBYnN0cmFjdEF2bWNvZGVDb21waWxlcikKKworQVZNQ09ERV9DT01QSUxFUl9DTEFTUyhEZWJ1Z0V4cHJlc3Npb24sIEFic3RyYWN0QXZtY29kZUNvbXBpbGVyKQorCitBVk1DT0RFX0NPTVBJTEVSX0NMQVNTKENvbW1lbnRFeHByZXNzaW9uLCBBYnN0cmFjdEF2bWNvZGVDb21waWxlcikKKworCitBVk1DT0RFX0NPTVBJTEVSX0NMQVNTKE1ldGFFdmFsU3RhdGVtZW50LCBBYnN0cmFjdEF2bWNvZGVDb21waWxlcikKKworQVZNQ09ERV9DT01QSUxFUl9DTEFTUyhNZXRhUnVuU3RhdGVtZW50LCBBYnN0cmFjdEF2bWNvZGVDb21waWxlcikKKworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworI2VuZGlmIC8qIEFWTUNPREVNRVRBU1RBVEVNRU5UQ09NUElMRVJfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVRdWV1ZUNvbXBpbGVyLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVRdWV1ZUNvbXBpbGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYThkNDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZVF1ZXVlQ29tcGlsZXIuY3BwCkBAIC0wLDAgKzEsNDgyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTIgYXZyLiAyMDExCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJBdm1jb2RlUXVldWVDb21waWxlci5oIgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQXZtQ29kZS5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25UeXBlQ2hlY2tlci5oPgorCisjaW5jbHVkZSA8Zm1sL3R5cGUvVHlwZU1hbmFnZXIuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFWTUNPREUgUFVTSCBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkYgQXZtY29kZVB1c2hDb21waWxlcjo6Y29tcGlsZUV4cHJlc3Npb24oCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCXJldHVybiggY29tcGlsZVN0YXRlbWVudChhQ1RYLCBhQ29kZSkgKTsKK30KKworQkYgQXZtY29kZVB1c2hDb21waWxlcjo6b3B0aW1pemVFeHByZXNzaW9uKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlyZXR1cm4oIG9wdGltaXplU3RhdGVtZW50KGFDVFgsIGFDb2RlKSApOworfQorCitCRkNvZGUgQXZtY29kZVB1c2hDb21waWxlcjo6Y29tcGlsZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJcmV0dXJuKCBjb21waWxlRXhwcmVzc2lvbkNvZGUoYUNUWCwgYUNvZGUpICk7Cit9CisKK0JGQ29kZSBBdm1jb2RlUHVzaENvbXBpbGVyOjpvcHRpbWl6ZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJQXZtQ29kZTo6aXRlcmF0b3IgaXQgPSBhQ29kZS0+YmVnaW4oKTsKKwlBdm1Db2RlOjppdGVyYXRvciBlbmRJdCA9IGFDb2RlLT5lbmQoKTsKKwlCRkNvZGUgb3B0aW1pemVkQ29kZSggYUNvZGUtPmdldE9wZXJhdG9yKCkgKTsKKworCUF2bUluc3RydWN0aW9uICogYXJnc0luc3RydWN0aW9uID0KKwkJCW9wdGltaXplZENvZGUtPm5ld0luc3RydWN0aW9uKCBhQ29kZS0+c2l6ZSgpICk7CisKKwlCRiBhcmcgPSBBVk1DT0RFX0NPTVBJTEVSLmRlY29kZV9vcHRpbWl6ZUV4cHJlc3Npb24oYUNUWCwgKCppdCkpOworCW9wdGltaXplZENvZGUtPmFwcGVuZCggYXJnICk7CisKKwlzZXRBcmdjb2RlQ29udGFpbmVyV1ZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMCksIGFyZyk7CisKKwlpZiggYXJnc0luc3RydWN0aW9uLT5hdCgwKS5kdHlwZS0+aXNUeXBlZEJ1ZmZlcigpICkKKwl7CisJCWFyZyA9IEFWTUNPREVfQ09NUElMRVIuZGVjb2RlX29wdGltaXplRXhwcmVzc2lvbihhQ1RYLCAoKigrK2l0KSkpOworCQlvcHRpbWl6ZWRDb2RlLT5hcHBlbmQoIGFyZyApOworCisJCWlmKCBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzVHlwZWQoVHlwZU1hbmFnZXI6Ok1FU1NBR0UsIGFyZykgKQorCQl7CisJCQlhcmdzSW5zdHJ1Y3Rpb24tPmF0KDEpLmR0eXBlID0gVHlwZU1hbmFnZXI6Ok1FU1NBR0U7CisJCQlzZXRBcmdjb2RlUlZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMSksIGFyZywgZmFsc2UpOworCQl9CisJCWVsc2UgaWYoIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNUeXBlZChUeXBlTWFuYWdlcjo6UE9SVCwgYXJnKSApCisJCXsKKwkJCWFyZ3NJbnN0cnVjdGlvbi0+YXQoMSkuZHR5cGUgPSBUeXBlTWFuYWdlcjo6UE9SVDsKKwkJCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdCgxKSwgYXJnLCBmYWxzZSk7CisKKwkJCWlmKCBhcmcuaXM8IEluc3RhbmNlT2ZQb3J0ID4oKSApCisJCQl7CisJCQkJSW5zdGFuY2VPZlBvcnQgKiBhUG9ydCA9IGFyZy50b19wdHI8IEluc3RhbmNlT2ZQb3J0ID4oKTsKKwkJCQlhdm1fc2l6ZV90IHBhcmFtQ291bnQgPSBhUG9ydC0+Z2V0UGFyYW1ldGVyQ291bnQoKTsKKworCQkJCWZvciggYXZtX3NpemVfdCBvZmZzZXQgPSAyIDsKKwkJCQkJCSgrK2l0ICE9IGVuZEl0KSAmJiAob2Zmc2V0IDw9IHBhcmFtQ291bnQpIDsgKytvZmZzZXQgKQorCQkJCXsKKwkJCQkJYXJnID0gQVZNQ09ERV9DT01QSUxFUi5kZWNvZGVfb3B0aW1pemVFeHByZXNzaW9uKGFDVFgsICgqaXQpKTsKKwkJCQkJb3B0aW1pemVkQ29kZS0+YXBwZW5kKCBhcmcgKTsKKworCQkJCQlhcmdzSW5zdHJ1Y3Rpb24tPmF0KG9mZnNldCkuZHR5cGUgPSBhUG9ydC0+Z2V0UGFyYW1ldGVyVHlwZShvZmZzZXQtMSk7CisJCQkJCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdChvZmZzZXQpLCBhcmcpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDIgOyAoKytpdCAhPSBlbmRJdCkgOyArK29mZnNldCApCisJCQl7CisJCQkJYXJnID0gQVZNQ09ERV9DT01QSUxFUi5kZWNvZGVfb3B0aW1pemVFeHByZXNzaW9uKGFDVFgsICgqaXQpKTsKKwkJCQlvcHRpbWl6ZWRDb2RlLT5hcHBlbmQoIGFyZyApOworCisJCQkJYXJnc0luc3RydWN0aW9uLT5hdChvZmZzZXQpLmR0eXBlID0gVHlwZU1hbmFnZXI6OlVOSVZFUlNBTDsKKwkJCQlzZXRBcmdjb2RlUlZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQob2Zmc2V0KSwgKCppdCksIGZhbHNlKTsKKwkJCX0KKwkJfQorCQllbHNlIGZvciggYXZtX3NpemVfdCBvZmZzZXQgPSAyIDsgKCsraXQgIT0gZW5kSXQpIDsgKytvZmZzZXQgKQorCQl7CisJCQlhcmcgPSBBVk1DT0RFX0NPTVBJTEVSLmRlY29kZV9vcHRpbWl6ZUV4cHJlc3Npb24oYUNUWCwgKCppdCkpOworCQkJb3B0aW1pemVkQ29kZS0+YXBwZW5kKCBhcmcgKTsKKworCQkJYXJnc0luc3RydWN0aW9uLT5hdChvZmZzZXQpLmR0eXBlID0gVHlwZU1hbmFnZXI6OlVOSVZFUlNBTDsKKwkJCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdChvZmZzZXQpLCAoKml0KSwgZmFsc2UpOworCQl9CisJfQorCisJZWxzZSBpZiggYXJnc0luc3RydWN0aW9uLT5hdCgwKS5kdHlwZS0+aGFzVHlwZUNvbGxlY3Rpb24oKSApCisJeworCQlCYXNlVHlwZVNwZWNpZmllciAqIGFUUyA9IGFyZ3NJbnN0cnVjdGlvbi0+YXQoMCkuZHR5cGUtPgorCQkJCWFzPCBDb250YWluZXJUeXBlU3BlY2lmaWVyID4oKS0+Z2V0Q29udGVudHNUeXBlU3BlY2lmaWVyKCk7CisKKwkJZm9yKCBhdm1fb2Zmc2V0X3Qgb2Zmc2V0ID0gMSA7ICgrK2l0ICE9IGVuZEl0KSA7ICsrb2Zmc2V0ICkKKwkJeworCQkJYXJnID0gQVZNQ09ERV9DT01QSUxFUi5kZWNvZGVfb3B0aW1pemVFeHByZXNzaW9uKAorCQkJCQlhQ1RYLT5jbG9uZShhVFMpLCAoKml0KSk7CisJCQlvcHRpbWl6ZWRDb2RlLT5hcHBlbmQoIGFyZyApOworCisJCQlhcmdzSW5zdHJ1Y3Rpb24tPmF0KG9mZnNldCkuZHR5cGUgPSBhVFM7CisJCQlzZXRBcmdjb2RlUlZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQob2Zmc2V0KSwgYXJnKTsKKwkJfQorCX0KKworCisJYXJnc0luc3RydWN0aW9uLT5jb21wdXRlTWFpbkJ5dGVjb2RlKAorCQkJLypjb250ZXh0ICAqLyBBVk1fQVJHX1NUQU5EQVJEX0NUWCwKKwkJCS8qcHJvY2Vzc29yKi8gQVZNX0FSR19TVEFURU1FTlRfQ1BVLAorCQkJLypvcGVyYXRpb24qLyBBVk1fQVJHX1NFVkFMX1JWQUxVRSwKKwkJCS8qb3BlcmFuZCAgKi8gQVZNX0FSR19TVEFURU1FTlRfS0lORCwKKwkJCS8qZHR5cGUgICAgKi8gYXJnc0luc3RydWN0aW9uLT5hdCgwKS5kdHlwZSk7CisKKwlyZXR1cm4oIG9wdGltaXplZENvZGUgKTsKK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIFRPUCBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkYgQXZtY29kZUFzc2lnblRvcENvbXBpbGVyOjpjb21waWxlRXhwcmVzc2lvbigKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJcmV0dXJuKCBjb21waWxlU3RhdGVtZW50KGFDVFgsIGFDb2RlKSApOworfQorCitCRiBBdm1jb2RlQXNzaWduVG9wQ29tcGlsZXI6Om9wdGltaXplRXhwcmVzc2lvbigKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJQkZDb2RlIG9wdENvZGUgPSBvcHRpbWl6ZVN0YXRlbWVudChhQ1RYLCBhQ29kZSk7CisKKwlvcHRDb2RlLT5nZXRJbnN0cnVjdGlvbigpLT5zZXRNYWluT3BlcmFuZCggQVZNX0FSR19FWFBSRVNTSU9OX0tJTkQgKTsKKworCXJldHVybiggb3B0Q29kZSApOworfQorCisKK0JGQ29kZSBBdm1jb2RlQXNzaWduVG9wQ29tcGlsZXI6OmNvbXBpbGVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCXJldHVybiggY29tcGlsZUV4cHJlc3Npb25Db2RlKGFDVFgsIGFDb2RlKSApOworfQorCitCRkNvZGUgQXZtY29kZUFzc2lnblRvcENvbXBpbGVyOjpvcHRpbWl6ZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJQXZtQ29kZTo6aXRlcmF0b3IgaXQgPSBhQ29kZS0+YmVnaW4oKTsKKwlBdm1Db2RlOjppdGVyYXRvciBlbmRJdCA9IGFDb2RlLT5lbmQoKTsKKwlCRkNvZGUgb3B0aW1pemVkQ29kZSggYUNvZGUtPmdldE9wZXJhdG9yKCkgKTsKKworCUF2bUluc3RydWN0aW9uICogYXJnc0luc3RydWN0aW9uID0KKwkJCW9wdGltaXplZENvZGUtPm5ld0luc3RydWN0aW9uKCBhQ29kZS0+c2l6ZSgpICk7CisKKwlCRiBhcmcgPSBBVk1DT0RFX0NPTVBJTEVSLmRlY29kZV9vcHRpbWl6ZUV4cHJlc3Npb24oYUNUWCwgKCppdCkpOworCW9wdGltaXplZENvZGUtPmFwcGVuZCggYXJnICk7CisKKwlzZXRBcmdjb2RlQ29udGFpbmVyV1ZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMCksIGFyZyk7CisKKwlpZiggYXJnc0luc3RydWN0aW9uLT5hdCgwKS5kdHlwZS0+aXNUeXBlZEJ1ZmZlcigpICkKKwl7CisJCWFyZyA9IEFWTUNPREVfQ09NUElMRVIuZGVjb2RlX29wdGltaXplRXhwcmVzc2lvbihhQ1RYLCAoKigrK2l0KSkpOworCQlvcHRpbWl6ZWRDb2RlLT5hcHBlbmQoIGFyZyApOworCisJCWlmKCBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzVHlwZWQoVHlwZU1hbmFnZXI6Ok1FU1NBR0UsIGFyZykgKQorCQl7CisJCQlhcmdzSW5zdHJ1Y3Rpb24tPmF0KDEpLmR0eXBlID0gVHlwZU1hbmFnZXI6Ok1FU1NBR0U7CisJCQlzZXRBcmdjb2RlUlZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMSksIGFyZywgZmFsc2UpOworCQl9CisJCWVsc2UgaWYoIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNUeXBlZChUeXBlTWFuYWdlcjo6UE9SVCwgYXJnKSApCisJCXsKKwkJCWFyZ3NJbnN0cnVjdGlvbi0+YXQoMSkuZHR5cGUgPSBUeXBlTWFuYWdlcjo6UE9SVDsKKwkJCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdCgxKSwgYXJnLCBmYWxzZSk7CisKKwkJCWlmKCBhcmcuaXM8IEluc3RhbmNlT2ZQb3J0ID4oKSApCisJCQl7CisJCQkJSW5zdGFuY2VPZlBvcnQgKiBhUG9ydCA9IGFyZy50b19wdHI8IEluc3RhbmNlT2ZQb3J0ID4oKTsKKwkJCQlhdm1fc2l6ZV90IHBhcmFtQ291bnQgPSBhUG9ydC0+Z2V0UGFyYW1ldGVyQ291bnQoKTsKKworCQkJCWZvciggYXZtX3NpemVfdCBvZmZzZXQgPSAyIDsKKwkJCQkJCSgrK2l0ICE9IGVuZEl0KSAmJiAob2Zmc2V0IDw9IHBhcmFtQ291bnQpIDsgKytvZmZzZXQgKQorCQkJCXsKKwkJCQkJYXJnID0gQVZNQ09ERV9DT01QSUxFUi5kZWNvZGVfb3B0aW1pemVFeHByZXNzaW9uKGFDVFgsICgqaXQpKTsKKwkJCQkJb3B0aW1pemVkQ29kZS0+YXBwZW5kKCBhcmcgKTsKKworCQkJCQlhcmdzSW5zdHJ1Y3Rpb24tPmF0KG9mZnNldCkuZHR5cGUgPSBhUG9ydC0+Z2V0UGFyYW1ldGVyVHlwZShvZmZzZXQtMSk7CisJCQkJCXNldEFyZ2NvZGVMVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdChvZmZzZXQpLCBhcmcpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDIgOyAoKytpdCAhPSBlbmRJdCkgOyArK29mZnNldCApCisJCQl7CisJCQkJYXJnID0gQVZNQ09ERV9DT01QSUxFUi5kZWNvZGVfb3B0aW1pemVFeHByZXNzaW9uKGFDVFgsICgqaXQpKTsKKwkJCQlvcHRpbWl6ZWRDb2RlLT5hcHBlbmQoIGFyZyApOworCisJCQkJYXJnc0luc3RydWN0aW9uLT5hdChvZmZzZXQpLmR0eXBlID0gVHlwZU1hbmFnZXI6OlVOSVZFUlNBTDsKKwkJCQlzZXRBcmdjb2RlTFZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQob2Zmc2V0KSwgKCppdCksIGZhbHNlKTsKKwkJCX0KKwkJfQorCQllbHNlIGZvciggYXZtX3NpemVfdCBvZmZzZXQgPSAyIDsgKCsraXQgIT0gZW5kSXQpIDsgKytvZmZzZXQgKQorCQl7CisJCQlhcmcgPSBBVk1DT0RFX0NPTVBJTEVSLmRlY29kZV9vcHRpbWl6ZUV4cHJlc3Npb24oYUNUWCwgKCppdCkpOworCQkJb3B0aW1pemVkQ29kZS0+YXBwZW5kKCBhcmcgKTsKKworCQkJYXJnc0luc3RydWN0aW9uLT5hdChvZmZzZXQpLmR0eXBlID0gVHlwZU1hbmFnZXI6OlVOSVZFUlNBTDsKKwkJCXNldEFyZ2NvZGVMVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdChvZmZzZXQpLCAoKml0KSwgZmFsc2UpOworCQl9CisJfQorCisJZWxzZSBpZiggYXJnc0luc3RydWN0aW9uLT5hdCgwKS5kdHlwZS0+aGFzVHlwZUNvbGxlY3Rpb24oKSApCisJeworCQlCYXNlVHlwZVNwZWNpZmllciAqIGFUUyA9IGFyZ3NJbnN0cnVjdGlvbi0+YXQoMCkuZHR5cGUtPgorCQkJCWFzPCBDb250YWluZXJUeXBlU3BlY2lmaWVyID4oKS0+Z2V0Q29udGVudHNUeXBlU3BlY2lmaWVyKCk7CisKKwkJZm9yKCBhdm1fb2Zmc2V0X3Qgb2Zmc2V0ID0gMSA7ICgrK2l0ICE9IGVuZEl0KSA7ICsrb2Zmc2V0ICkKKwkJeworCQkJYXJnID0gQVZNQ09ERV9DT01QSUxFUi5kZWNvZGVfb3B0aW1pemVFeHByZXNzaW9uKAorCQkJCQlhQ1RYLT5jbG9uZShhVFMpLCAoKml0KSk7CisJCQlvcHRpbWl6ZWRDb2RlLT5hcHBlbmQoIGFyZyApOworCisJCQlhcmdzSW5zdHJ1Y3Rpb24tPmF0KG9mZnNldCkuZHR5cGUgPSBhVFM7CisJCQlzZXRBcmdjb2RlUlZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQob2Zmc2V0KSwgYXJnKTsKKwkJfQorCX0KKworCisJYXJnc0luc3RydWN0aW9uLT5jb21wdXRlTWFpbkJ5dGVjb2RlKAorCQkJLypjb250ZXh0ICAqLyBBVk1fQVJHX1NUQU5EQVJEX0NUWCwKKwkJCS8qcHJvY2Vzc29yKi8gQVZNX0FSR19TVEFURU1FTlRfQ1BVLAorCQkJLypvcGVyYXRpb24qLyBBVk1fQVJHX1NFVkFMX1JWQUxVRSwKKwkJCS8qb3BlcmFuZCAgKi8gQVZNX0FSR19TVEFURU1FTlRfS0lORCwKKwkJCS8qZHR5cGUgICAgKi8gYXJnc0luc3RydWN0aW9uLT5hdCgwKS5kdHlwZSk7CisKKwlyZXR1cm4oIG9wdGltaXplZENvZGUgKTsKK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIFRPUCBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkYgQXZtY29kZVRvcENvbXBpbGVyOjpjb21waWxlRXhwcmVzc2lvbigKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJcmV0dXJuKCBjb21waWxlRXhwcmVzc2lvbkNvZGUoYUNUWCwgYUNvZGUpICk7Cit9CisKK0JGIEF2bWNvZGVUb3BDb21waWxlcjo6b3B0aW1pemVFeHByZXNzaW9uKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlCRkNvZGUgb3B0Q29kZSA9IG9wdGltaXplRXhwcmVzc2lvbkNvZGUoYUNUWCwgYUNvZGUsIEFWTV9BUkdfRVhQUkVTU0lPTl9LSU5EKSA7CisKKwlvcHRDb2RlLT5nZXRJbnN0cnVjdGlvbigpLT5zZXRNYWluUHJvY2Vzc29yKCBBVk1fQVJHX1FVRVVFX0NQVSApOworCisJcmV0dXJuKCBvcHRDb2RlICk7Cit9CisKKworQkZDb2RlIEF2bWNvZGVUb3BDb21waWxlcjo6Y29tcGlsZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJcmV0dXJuKCBjb21waWxlRXhwcmVzc2lvbkNvZGUoYUNUWCwgYUNvZGUpICk7Cit9CisKK0JGQ29kZSBBdm1jb2RlVG9wQ29tcGlsZXI6Om9wdGltaXplU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlyZXR1cm4oIG9wdGltaXplU3RhdGVtZW50Q29kZShhQ1RYLCBhQ29kZSkgKTsKK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIFBPUCBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkYgQXZtY29kZVBvcENvbXBpbGVyOjpjb21waWxlRXhwcmVzc2lvbigKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJcmV0dXJuKCBjb21waWxlU3RhdGVtZW50KGFDVFgsIGFDb2RlKSApOworfQorCitCRiBBdm1jb2RlUG9wQ29tcGlsZXI6Om9wdGltaXplRXhwcmVzc2lvbigKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJQkZDb2RlIG9wdENvZGUgPSBvcHRpbWl6ZVN0YXRlbWVudChhQ1RYLCBhQ29kZSk7CisKKwlvcHRDb2RlLT5nZXRJbnN0cnVjdGlvbigpLT5zZXRNYWluUHJvY2Vzc29yKCBBVk1fQVJHX1FVRVVFX0NQVSApOworCW9wdENvZGUtPmdldEluc3RydWN0aW9uKCktPnNldE1haW5PcGVyYW5kKCBBVk1fQVJHX0VYUFJFU1NJT05fS0lORCApOworCisJcmV0dXJuKCBvcHRDb2RlICk7Cit9CisKKworQkZDb2RlIEF2bWNvZGVQb3BDb21waWxlcjo6Y29tcGlsZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJcmV0dXJuKCBjb21waWxlRXhwcmVzc2lvbkNvZGUoYUNUWCwgYUNvZGUpICk7Cit9CisKK0JGQ29kZSBBdm1jb2RlUG9wQ29tcGlsZXI6Om9wdGltaXplU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlBdm1Db2RlOjppdGVyYXRvciBpdCA9IGFDb2RlLT5iZWdpbigpOworCUF2bUNvZGU6Oml0ZXJhdG9yIGVuZEl0ID0gYUNvZGUtPmVuZCgpOworCUJGQ29kZSBvcHRpbWl6ZWRDb2RlKCBhQ29kZS0+Z2V0T3BlcmF0b3IoKSApOworCisJQXZtSW5zdHJ1Y3Rpb24gKiBhcmdzSW5zdHJ1Y3Rpb24gPQorCQkJb3B0aW1pemVkQ29kZS0+bmV3SW5zdHJ1Y3Rpb24oIGFDb2RlLT5zaXplKCkgKTsKKworCUJGIGFyZyA9IEFWTUNPREVfQ09NUElMRVIuZGVjb2RlX29wdGltaXplRXhwcmVzc2lvbihhQ1RYLCAoKml0KSk7CisJb3B0aW1pemVkQ29kZS0+YXBwZW5kKCBhcmcgKTsKKworCXNldEFyZ2NvZGVDb250YWluZXJXVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdCgwKSwgYXJnKTsKKworCWlmKCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLmR0eXBlLT5pc1R5cGVkQnVmZmVyKCkgKQorCXsKKwkJYXJnID0gQVZNQ09ERV9DT01QSUxFUi5kZWNvZGVfb3B0aW1pemVFeHByZXNzaW9uKGFDVFgsICgqKCsraXQpKSk7CisJCW9wdGltaXplZENvZGUtPmFwcGVuZCggYXJnICk7CisKKwkJaWYoIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNUeXBlZChUeXBlTWFuYWdlcjo6TUVTU0FHRSwgYXJnKSApCisJCXsKKwkJCWFyZ3NJbnN0cnVjdGlvbi0+YXQoMSkuZHR5cGUgPSBUeXBlTWFuYWdlcjo6TUVTU0FHRTsKKwkJCXNldEFyZ2NvZGVSVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdCgxKSwgYXJnLCBmYWxzZSk7CisJCX0KKwkJZWxzZSBpZiggRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc1R5cGVkKFR5cGVNYW5hZ2VyOjpQT1JULCBhcmcpICkKKwkJeworCQkJYXJnc0luc3RydWN0aW9uLT5hdCgxKS5kdHlwZSA9IFR5cGVNYW5hZ2VyOjpQT1JUOworCQkJc2V0QXJnY29kZVJWYWx1ZShhQ1RYLCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDEpLCBhcmcsIGZhbHNlKTsKKworCQkJaWYoIGFyZy5pczwgSW5zdGFuY2VPZlBvcnQgPigpICkKKwkJCXsKKwkJCQlJbnN0YW5jZU9mUG9ydCAqIGFQb3J0ID0gYXJnLnRvX3B0cjwgSW5zdGFuY2VPZlBvcnQgPigpOworCQkJCWF2bV9zaXplX3QgcGFyYW1Db3VudCA9IGFQb3J0LT5nZXRQYXJhbWV0ZXJDb3VudCgpOworCisJCQkJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDIgOworCQkJCQkJKCsraXQgIT0gZW5kSXQpICYmIChvZmZzZXQgPD0gcGFyYW1Db3VudCkgOyArK29mZnNldCApCisJCQkJeworCQkJCQlhcmcgPSBBVk1DT0RFX0NPTVBJTEVSLmRlY29kZV9vcHRpbWl6ZUV4cHJlc3Npb24oYUNUWCwgKCppdCkpOworCQkJCQlvcHRpbWl6ZWRDb2RlLT5hcHBlbmQoIGFyZyApOworCisJCQkJCWFyZ3NJbnN0cnVjdGlvbi0+YXQob2Zmc2V0KS5kdHlwZSA9IGFQb3J0LT5nZXRQYXJhbWV0ZXJUeXBlKG9mZnNldC0xKTsKKwkJCQkJc2V0QXJnY29kZUxWYWx1ZShhQ1RYLCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KG9mZnNldCksIGFyZyk7CisJCQkJfQorCQkJfQorCQkJZWxzZSBmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMiA7ICgrK2l0ICE9IGVuZEl0KSA7ICsrb2Zmc2V0ICkKKwkJCXsKKwkJCQlhcmcgPSBBVk1DT0RFX0NPTVBJTEVSLmRlY29kZV9vcHRpbWl6ZUV4cHJlc3Npb24oYUNUWCwgKCppdCkpOworCQkJCW9wdGltaXplZENvZGUtPmFwcGVuZCggYXJnICk7CisKKwkJCQlhcmdzSW5zdHJ1Y3Rpb24tPmF0KG9mZnNldCkuZHR5cGUgPSBUeXBlTWFuYWdlcjo6VU5JVkVSU0FMOworCQkJCXNldEFyZ2NvZGVMVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdChvZmZzZXQpLCAoKml0KSwgZmFsc2UpOworCQkJfQorCQl9CisJCWVsc2UgZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDIgOyAoKytpdCAhPSBlbmRJdCkgOyArK29mZnNldCApCisJCXsKKwkJCWFyZyA9IEFWTUNPREVfQ09NUElMRVIuZGVjb2RlX29wdGltaXplRXhwcmVzc2lvbihhQ1RYLCAoKml0KSk7CisJCQlvcHRpbWl6ZWRDb2RlLT5hcHBlbmQoIGFyZyApOworCisJCQlhcmdzSW5zdHJ1Y3Rpb24tPmF0KG9mZnNldCkuZHR5cGUgPSBUeXBlTWFuYWdlcjo6VU5JVkVSU0FMOworCQkJc2V0QXJnY29kZUxWYWx1ZShhQ1RYLCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KG9mZnNldCksICgqaXQpLCBmYWxzZSk7CisJCX0KKwl9CisKKwllbHNlIGlmKCBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLmR0eXBlLT5oYXNUeXBlQ29sbGVjdGlvbigpICkKKwl7CisJCUJhc2VUeXBlU3BlY2lmaWVyICogYVRTID0gYXJnc0luc3RydWN0aW9uLT5hdCgwKS5kdHlwZS0+CisJCQkJYXM8IENvbnRhaW5lclR5cGVTcGVjaWZpZXIgPigpLT5nZXRDb250ZW50c1R5cGVTcGVjaWZpZXIoKTsKKworCQlmb3IoIGF2bV9vZmZzZXRfdCBvZmZzZXQgPSAxIDsgKCsraXQgIT0gZW5kSXQpIDsgKytvZmZzZXQgKQorCQl7CisJCQlhcmcgPSBBVk1DT0RFX0NPTVBJTEVSLmRlY29kZV9vcHRpbWl6ZUV4cHJlc3Npb24oCisJCQkJCWFDVFgtPmNsb25lKGFUUyksICgqaXQpKTsKKwkJCW9wdGltaXplZENvZGUtPmFwcGVuZCggYXJnICk7CisKKwkJCWFyZ3NJbnN0cnVjdGlvbi0+YXQob2Zmc2V0KS5kdHlwZSA9IGFUUzsKKwkJCXNldEFyZ2NvZGVMVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdChvZmZzZXQpLCBhcmcpOworCQl9CisJfQorCisKKwlhcmdzSW5zdHJ1Y3Rpb24tPmNvbXB1dGVNYWluQnl0ZWNvZGUoCisJCQkvKmNvbnRleHQgICovIEFWTV9BUkdfU1RBTkRBUkRfQ1RYLAorCQkJLypwcm9jZXNzb3IqLyBBVk1fQVJHX1NUQVRFTUVOVF9DUFUsCisJCQkvKm9wZXJhdGlvbiovIEFWTV9BUkdfU0VWQUxfUlZBTFVFLAorCQkJLypvcGVyYW5kICAqLyBBVk1fQVJHX1NUQVRFTUVOVF9LSU5ELAorCQkJLypkdHlwZSAgICAqLyBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLmR0eXBlKTsKKworCXJldHVybiggb3B0aW1pemVkQ29kZSApOworfQorCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFWTUNPREUgUE9QX0ZST00gQ09NUElMQVRJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0JGIEF2bWNvZGVQb3BGcm9tQ29tcGlsZXI6OmNvbXBpbGVFeHByZXNzaW9uKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlyZXR1cm4oIGNvbXBpbGVTdGF0ZW1lbnQoYUNUWCwgYUNvZGUpICk7Cit9CisKK0JGIEF2bWNvZGVQb3BGcm9tQ29tcGlsZXI6Om9wdGltaXplRXhwcmVzc2lvbigKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJQkZDb2RlIG9wdENvZGUgPSBvcHRpbWl6ZVN0YXRlbWVudChhQ1RYLCBhQ29kZSk7CisKKwlvcHRDb2RlLT5nZXRJbnN0cnVjdGlvbigpLT5zZXRNYWluUHJvY2Vzc29yKCBBVk1fQVJHX1FVRVVFX0NQVSApOworCW9wdENvZGUtPmdldEluc3RydWN0aW9uKCktPnNldE1haW5PcGVyYW5kKCBBVk1fQVJHX0VYUFJFU1NJT05fS0lORCApOworCisJcmV0dXJuKCBvcHRDb2RlICk7Cit9CisKKworQkZDb2RlIEF2bWNvZGVQb3BGcm9tQ29tcGlsZXI6OmNvbXBpbGVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCXJldHVybiggY29tcGlsZUV4cHJlc3Npb25Db2RlKGFDVFgsIGFDb2RlKSApOworfQorCitCRkNvZGUgQXZtY29kZVBvcEZyb21Db21waWxlcjo6b3B0aW1pemVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCUF2bUluc3RydWN0aW9uICogYXJnc0luc3RydWN0aW9uID0gYUNvZGUtPmdlbkluc3RydWN0aW9uKCk7CisKKwlvcHRpbWl6ZUFyZ0V4cHJlc3Npb24oYUNUWCwgYUNvZGUsIDApOworCXNldEFyZ2NvZGVDb250YWluZXJXVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdCgwKSwgYUNvZGUtPmZpcnN0KCkpOworCisJaWYoIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMCkuZHR5cGUtPmlzVHlwZWRCdWZmZXIoKSApCisJeworCQkvLyEhISBUT0RPCisJCW9wdGltaXplQXJnRXhwcmVzc2lvbihhQ1RYLCBhQ29kZSwgMSk7CisJCXNldEFyZ2NvZGVDb250YWluZXJSVmFsdWUoYUNUWCwgYXJnc0luc3RydWN0aW9uLT5hdCgxKSwgYUNvZGUtPnNlY29uZCgpKTsKKwl9CisJZWxzZSBpZiggYXJnc0luc3RydWN0aW9uLT5hdCgwKS5kdHlwZS0+aGFzVHlwZUNvbGxlY3Rpb24oKSApCisJeworCQlvcHRpbWl6ZUFyZ0V4cHJlc3Npb24oYUNUWCwgYUNvZGUsIDEpOworCQlzZXRBcmdjb2RlQ29udGFpbmVyUlZhbHVlKGFDVFgsIGFyZ3NJbnN0cnVjdGlvbi0+YXQoMSksIGFDb2RlLT5zZWNvbmQoKSk7CisJfQorCisKKwlhcmdzSW5zdHJ1Y3Rpb24tPmNvbXB1dGVNYWluQnl0ZWNvZGUoCisJCQkvKmNvbnRleHQgICovIEFWTV9BUkdfU1RBTkRBUkRfQ1RYLAorCQkJLypwcm9jZXNzb3IqLyBBVk1fQVJHX1NUQVRFTUVOVF9DUFUsCisJCQkvKm9wZXJhdGlvbiovIEFWTV9BUkdfU0VWQUxfUlZBTFVFLAorCQkJLypvcGVyYW5kICAqLyBBVk1fQVJHX1NUQVRFTUVOVF9LSU5ELAorCQkJLypkdHlwZSAgICAqLyBhcmdzSW5zdHJ1Y3Rpb24tPmF0KDApLmR0eXBlKTsKKworCXJldHVybiggYUNvZGUgKTsKK30KKworCisKKworfQorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlUXVldWVDb21waWxlci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZVF1ZXVlQ29tcGlsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWZmN2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZVF1ZXVlQ29tcGlsZXIuaApAQCAtMCwwICsxLDQwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTIgYXZyLiAyMDExCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQVZNQ09ERVFVRVVFQ09NUElMRVJfSF8KKyNkZWZpbmUgQVZNQ09ERVFVRVVFQ09NUElMRVJfSF8KKworI2luY2x1ZGUgPGJ1aWxkZXIvcHJpbWl0aXZlL0Fic3RyYWN0QXZtY29kZUNvbXBpbGVyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK0FWTUNPREVfQ09NUElMRVJfT1BUSU1JWkVSX0NMQVNTKFB1c2gsIEFic3RyYWN0QXZtY29kZUNvbXBpbGVyKQorCitBVk1DT0RFX0NPTVBJTEVSX09QVElNSVpFUl9DTEFTUyhBc3NpZ25Ub3AsIEFic3RyYWN0QXZtY29kZUNvbXBpbGVyKQorCitBVk1DT0RFX0NPTVBJTEVSX09QVElNSVpFUl9DTEFTUyhUb3AsIEFic3RyYWN0QXZtY29kZUNvbXBpbGVyKQorCitBVk1DT0RFX0NPTVBJTEVSX09QVElNSVpFUl9DTEFTUyhQb3AsIEFic3RyYWN0QXZtY29kZUNvbXBpbGVyKQorCitBVk1DT0RFX0NPTVBJTEVSX09QVElNSVpFUl9DTEFTUyhQb3BGcm9tLCBBYnN0cmFjdEF2bWNvZGVDb21waWxlcikKKworCisKK30KKworI2VuZGlmIC8qIEFWTUNPREVRVUVVRUNPTVBJTEVSX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlU2NoZWR1bGluZ0NvbXBpbGVyLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVTY2hlZHVsaW5nQ29tcGlsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZGYxZmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlU2NoZWR1bGluZ0NvbXBpbGVyLmNwcApAQCAtMCwwICsxLDk4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMSBtYWkgMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQXZtY29kZVNjaGVkdWxpbmdDb21waWxlci5oIgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQXZtQ29kZS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQVZNQ09ERSBTQ0hFRFVMSU5HIENPTVBJTEFUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitCRiBBdm1jb2RlU2NoZWR1bGluZ0NvbXBpbGVyOjpjb21waWxlRXhwcmVzc2lvbigKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJcmV0dXJuKCBBYnN0cmFjdEF2bWNvZGVDb21waWxlcjo6Y29tcGlsZVN0YXRlbWVudChhQ1RYLCBhQ29kZSkgKTsKK30KKworQkYgQXZtY29kZVNjaGVkdWxpbmdDb21waWxlcjo6b3B0aW1pemVFeHByZXNzaW9uKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlCRkNvZGUgb3B0Q29kZSggYUNvZGUtPmdldE9wZXJhdG9yKCkgKTsKKworCUF2bUNvZGU6Oml0ZXJhdG9yIGl0ID0gYUNvZGUtPmJlZ2luKCk7CisJQXZtQ29kZTo6aXRlcmF0b3IgZW5kSXQgPSBhQ29kZS0+ZW5kKCk7CisJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJeworCQlvcHRDb2RlLT5hcHBlbmQoIEFWTUNPREVfQ09NUElMRVIuZGVjb2RlX29wdGltaXplRXhwcmVzc2lvbihhQ1RYLCAqaXQpICk7CisJfQorCisJaWYoIG9wdENvZGUtPmVtcHR5KCkgKQorCXsKKwkJcmV0dXJuKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bm9wQ29kZSgpICk7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiggb3B0Q29kZS0+c2luZ2xldG9uKCkgPyBvcHRDb2RlLT5maXJzdCgpLmJmQ29kZSgpIDogb3B0Q29kZSApOworCX0KK30KKworCitCRkNvZGUgQXZtY29kZVNjaGVkdWxpbmdDb21waWxlcjo6Y29tcGlsZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJQkZDb2RlIG5ld0NvZGUgPSBBYnN0cmFjdEF2bWNvZGVDb21waWxlcjo6Y29tcGlsZVN0YXRlbWVudChhQ1RYLCBhQ29kZSk7CisKKwlpZiggbmV3Q29kZS0+c2luZ2xldG9uKCkgJiYgbmV3Q29kZS0+Zmlyc3QoKS5pczwgQXZtQ29kZSA+KCkgKQorCXsKKwkJcmV0dXJuKCBuZXdDb2RlLT5maXJzdCgpLmJmQ29kZSgpICk7CisJfQorCisJcmV0dXJuKCBuZXdDb2RlICk7Cit9CisKKworQkZDb2RlIEF2bWNvZGVTY2hlZHVsaW5nQ29tcGlsZXI6Om9wdGltaXplU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlCRkNvZGUgb3B0Q29kZSggYUNvZGUtPmdldE9wZXJhdG9yKCkgKTsKKworCUF2bUNvZGU6Oml0ZXJhdG9yIGl0ID0gYUNvZGUtPmJlZ2luKCk7CisJQXZtQ29kZTo6aXRlcmF0b3IgZW5kSXQgPSBhQ29kZS0+ZW5kKCk7CisJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJeworCQlvcHRDb2RlLT5hcHBlbmQoIEFWTUNPREVfQ09NUElMRVIuZGVjb2RlX29wdGltaXplU3RhdGVtZW50KGFDVFgsICppdCkgKTsKKwl9CisKKwlpZiggb3B0Q29kZS0+ZW1wdHkoKSApCisJeworCQlyZXR1cm4oIFN0YXRlbWVudENvbnN0cnVjdG9yOjpub3BDb2RlKCkgKTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuKCBvcHRDb2RlLT5zaW5nbGV0b24oKSA/IG9wdENvZGUtPmZpcnN0KCkuYmZDb2RlKCkgOiBvcHRDb2RlICk7CisJfQorfQorCisKKworCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVTY2hlZHVsaW5nQ29tcGlsZXIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVTY2hlZHVsaW5nQ29tcGlsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2YyYTZjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZVNjaGVkdWxpbmdDb21waWxlci5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxIG1haSAyMDExCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQVZNQ09ERVNDSEVEVUxJTkdDT01QSUxFUl9IXworI2RlZmluZSBBVk1DT0RFU0NIRURVTElOR0NPTVBJTEVSX0hfCisKKyNpbmNsdWRlIDxidWlsZGVyL3ByaW1pdGl2ZS9BYnN0cmFjdEF2bWNvZGVDb21waWxlci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitBVk1DT0RFX0NPTVBJTEVSX09QVElNSVpFUl9DTEFTUyhTY2hlZHVsaW5nLCBBYnN0cmFjdEF2bWNvZGVDb21waWxlcikKKworCisKK30KKworI2VuZGlmIC8qIEFWTUNPREVTQ0hFRFVMSU5HQ09NUElMRVJfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVTZXF1ZW5jZUNvbXBpbGVyLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVTZXF1ZW5jZUNvbXBpbGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZThkMzM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZVNlcXVlbmNlQ29tcGlsZXIuY3BwCkBAIC0wLDAgKzEsNDM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMSBtYWkgMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQXZtY29kZVNlcXVlbmNlQ29tcGlsZXIuaCIKKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0F2bUNvZGUuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9TdGF0ZW1lbnRDb25zdHJ1Y3Rvci5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL1N0YXRlbWVudFR5cGVDaGVja2VyLmg+CisKKyNpbmNsdWRlIDxmbWwvb3BlcmF0b3IvT3BlcmF0b3IuaD4KKyNpbmNsdWRlIDxmbWwvb3BlcmF0b3IvT3BlcmF0b3JNYW5hZ2VyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIEFUT01JQyBTRVFVRU5DRSBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkYgQXZtY29kZUF0b21pY1NlcXVlbmNlQ29tcGlsZXI6OmNvbXBpbGVFeHByZXNzaW9uKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlyZXR1cm4oIGNvbXBpbGVTdGF0ZW1lbnQoYUNUWCwgYUNvZGUpICk7Cit9CisKK0JGIEF2bWNvZGVBdG9taWNTZXF1ZW5jZUNvbXBpbGVyOjpvcHRpbWl6ZUV4cHJlc3Npb24oCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCUJGQ29kZSBvcHRDb2RlKCBhQ29kZS0+Z2V0T3BlcmF0b3IoKSApOworCisJQXZtQ29kZTo6aXRlcmF0b3IgaXQgPSBhQ29kZS0+YmVnaW4oKTsKKwlBdm1Db2RlOjppdGVyYXRvciBlbmRJdCA9IGFDb2RlLT5lbmQoKTsKKwlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwl7CisJCW9wdENvZGUtPmFwcGVuZCgKKwkJCQlBVk1DT0RFX0NPTVBJTEVSLmRlY29kZV9vcHRpbWl6ZUV4cHJlc3Npb24oYUNUWCwgKml0KSApOworCX0KKworCXJldHVybiggb3B0Q29kZS0+c2luZ2xldG9uKCkgPyBvcHRDb2RlLT5maXJzdCgpLmJmQ29kZSgpIDogb3B0Q29kZSApOworfQorCisKKworQkZDb2RlIEF2bWNvZGVBdG9taWNTZXF1ZW5jZUNvbXBpbGVyOjpjb21waWxlU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlCRkNvZGUgbmV3Q29kZSA9IEFic3RyYWN0QXZtY29kZUNvbXBpbGVyOjpjb21waWxlU3RhdGVtZW50KGFDVFgsIGFDb2RlKTsKKworCWlmKCBuZXdDb2RlLT5zaW5nbGV0b24oKSAmJiBuZXdDb2RlLT5maXJzdCgpLmlzPCBBdm1Db2RlID4oKSApCisJeworCQlyZXR1cm4oIG5ld0NvZGUtPmZpcnN0KCkuYmZDb2RlKCkgKTsKKwl9CisKKwlyZXR1cm4oIG5ld0NvZGUgKTsKK30KKworQkZDb2RlIEF2bWNvZGVBdG9taWNTZXF1ZW5jZUNvbXBpbGVyOjpvcHRpbWl6ZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJQkZDb2RlIG9wdENvZGUoIGFDb2RlLT5nZXRPcGVyYXRvcigpICk7CisKKwlCRiBvcHRpbWl6ZWRBcmc7CisKKwlBdm1Db2RlOjppdGVyYXRvciBpdCA9IGFDb2RlLT5iZWdpbigpOworCUF2bUNvZGU6Oml0ZXJhdG9yIGVuZEl0ID0gYUNvZGUtPmVuZCgpOworCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCXsKKwkJb3B0aW1pemVkQXJnID0gQVZNQ09ERV9DT01QSUxFUi5kZWNvZGVfb3B0aW1pemVTdGF0ZW1lbnQoYUNUWCwgKml0KTsKKworCQlpZiggU3RhdGVtZW50VHlwZUNoZWNrZXI6OmlzQ29tbWVudChvcHRpbWl6ZWRBcmcpICkKKwkJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgQ09NUFVUSU5HICwgU1RBVEVNRU5UICkKKwkJCW9wdENvZGUtPmFwcGVuZCggb3B0aW1pemVkQXJnICk7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBDT01QVVRJTkcgLCBTVEFURU1FTlQgKQorCQl9CisKKwkJZWxzZQorCQl7CisJCQlvcHRDb2RlLT5hcHBlbmRGbGF0KCBvcHRpbWl6ZWRBcmcgKTsKKwkJfQorCX0KKworCWlmKCBvcHRDb2RlLT5lbXB0eSgpICkKKwl7CisJCXJldHVybiggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5vcENvZGUoKSApOworCX0KKwllbHNlCisJeworCQlyZXR1cm4oIG9wdENvZGUtPnNpbmdsZXRvbigpID8gb3B0Q29kZS0+Zmlyc3QoKS5iZkNvZGUoKSA6IG9wdENvZGUgKTsKKwl9Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQVZNQ09ERSBTRVFVRU5DRSBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkYgQXZtY29kZVN0cm9uZ1NlcXVlbmNlQ29tcGlsZXI6OmNvbXBpbGVFeHByZXNzaW9uKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlyZXR1cm4oIGNvbXBpbGVTdGF0ZW1lbnQoYUNUWCwgYUNvZGUpICk7Cit9CisKK0JGIEF2bWNvZGVTdHJvbmdTZXF1ZW5jZUNvbXBpbGVyOjpvcHRpbWl6ZUV4cHJlc3Npb24oCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCXJldHVybiggb3B0aW1pemVTdGF0ZW1lbnQoYUNUWCwgYUNvZGUpICk7Cit9CisKKworCitCRkNvZGUgQXZtY29kZVN0cm9uZ1NlcXVlbmNlQ29tcGlsZXI6OmNvbXBpbGVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCUJGQ29kZSBuZXdDb2RlID0gQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXI6OmNvbXBpbGVTdGF0ZW1lbnQoYUNUWCwgYUNvZGUpOworCisJaWYoIG5ld0NvZGUtPnNpbmdsZXRvbigpICYmIG5ld0NvZGUtPmZpcnN0KCkuaXM8IEF2bUNvZGUgPigpICkKKwl7CisJCXJldHVybiggbmV3Q29kZS0+Zmlyc3QoKS5iZkNvZGUoKSApOworCX0KKworCXJldHVybiggbmV3Q29kZSApOworfQorCitCRkNvZGUgQXZtY29kZVN0cm9uZ1NlcXVlbmNlQ29tcGlsZXI6Om9wdGltaXplU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlCRkNvZGUgb3B0Q29kZSggYUNvZGUtPmdldE9wZXJhdG9yKCkgKTsKKworCUJGQ29kZSBhdG9taWNDb2RlKCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FUT01JQ19TRVFVRU5DRSApOworCisJQkYgb3B0aW1pemVkQXJnOworCisJQXZtQ29kZTo6aXRlcmF0b3IgaXQgPSBhQ29kZS0+YmVnaW4oKTsKKwlBdm1Db2RlOjppdGVyYXRvciBlbmRJdCA9IGFDb2RlLT5lbmQoKTsKKwlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwl7CisJCW9wdGltaXplZEFyZyA9IEFWTUNPREVfQ09NUElMRVIuZGVjb2RlX29wdGltaXplU3RhdGVtZW50KGFDVFgsICppdCk7CisKKwkJaWYoIFN0YXRlbWVudFR5cGVDaGVja2VyOjppc0NvbW1lbnQob3B0aW1pemVkQXJnKSApCisJCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIENPTVBVVElORyAsIFNUQVRFTUVOVCApCisJCQlhdG9taWNDb2RlLT5hcHBlbmQoIG9wdGltaXplZEFyZyApOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgQ09NUFVUSU5HICwgU1RBVEVNRU5UICkKKwkJfQorCisJCS8vID09PiBTdGF0ZW1lbnRUeXBlQ2hlY2tlcjo6aXNTdHJvbmdBdG9taWNTZXF1ZW5jZShhdG9taWNDb2RlKQorCQllbHNlIGlmKCBTdGF0ZW1lbnRUeXBlQ2hlY2tlcjo6aXNBdG9taWNTdGF0ZW1lbnQob3B0aW1pemVkQXJnKSApCisJCXsKKwkJCWF0b21pY0NvZGUtPmFwcGVuZCggb3B0aW1pemVkQXJnICk7CisJCX0KKwkJZWxzZSBpZiggU3RhdGVtZW50VHlwZUNoZWNrZXI6OmlzU3Ryb25nQXRvbWljU2VxdWVuY2Uob3B0aW1pemVkQXJnKSApCisJCXsKKwkJCWF0b21pY0NvZGUtPmFwcGVuZCggb3B0aW1pemVkQXJnLnRvX3B0cjwgQXZtQ29kZSA+KCktPmdldEFyZ3MoKSApOworCQl9CisJCWVsc2UgaWYoIGF0b21pY0NvZGUtPmVtcHR5KCkgKQorCQl7CisJCQlvcHRDb2RlLT5hcHBlbmRGbGF0KCBvcHRpbWl6ZWRBcmcgKTsKKwkJfQorCQllbHNlIGlmKCBTdGF0ZW1lbnRUeXBlQ2hlY2tlcjo6aXNBdG9taWNTZXF1ZW5jZShvcHRpbWl6ZWRBcmcpICkKKwkJeworCQkJYXRvbWljQ29kZS0+YXBwZW5kKCBvcHRpbWl6ZWRBcmcudG9fcHRyPCBBdm1Db2RlID4oKS0+Z2V0QXJncygpICk7CisKKwkJCW9wdENvZGUtPmFwcGVuZCggYXRvbWljQ29kZSApOworCisJCQlhdG9taWNDb2RlID0gU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQVRPTUlDX1NFUVVFTkNFICk7CisJCX0KKwkJZWxzZSBpZiggKChpdCArIDEpICE9IGVuZEl0ICkgKQorCQl7CisJCQlhdG9taWNDb2RlLT5hcHBlbmQoIG9wdGltaXplZEFyZyApOworCisJCQlvcHRDb2RlLT5hcHBlbmQoIGF0b21pY0NvZGUgKTsKKworCQkJYXRvbWljQ29kZSA9IFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FUT01JQ19TRVFVRU5DRSApOworCQl9CisJCWVsc2UgLy8gPT0+IGVuZCBmb3IoLi4uKQorCQl7CisJCQlpZiggYXRvbWljQ29kZS0+c2luZ2xldG9uKCkgKQorCQkJeworCQkJCW9wdENvZGUtPmFwcGVuZEZsYXQoIGF0b21pY0NvZGUtPnBvcF9sYXN0KCkgKTsKKwkJCX0KKwkJCWVsc2UgaWYoIGF0b21pY0NvZGUtPnBvcHVsYXRlZCgpICkKKwkJCXsKKwkJCQlvcHRDb2RlLT5hcHBlbmQoIGF0b21pY0NvZGUgKTsKKwkJCX0KKwkJCWF0b21pY0NvZGUgPSBCRkNvZGU6OlJFRl9OVUxMOworCisJCQlvcHRDb2RlLT5hcHBlbmRGbGF0KCBvcHRpbWl6ZWRBcmcgKTsKKwkJfQorCX0KKworCWlmKCBvcHRDb2RlLT5ub25lbXB0eSgpICkKKwl7CisJCWlmKCBhdG9taWNDb2RlLmludmFsaWQoKSApCisJCXsKKwkJCS8vISEgTk9USElORworCQl9CisJCWVsc2UgaWYoIGF0b21pY0NvZGUtPnNpbmdsZXRvbigpICkKKwkJeworCQkJb3B0Q29kZS0+YXBwZW5kRmxhdCggYXRvbWljQ29kZS0+cG9wX2xhc3QoKSApOworCQl9CisJCWVsc2UgaWYoIGF0b21pY0NvZGUtPnBvcHVsYXRlZCgpICkKKwkJeworCQkJb3B0Q29kZS0+YXBwZW5kKCBhdG9taWNDb2RlICk7CisJCX0KKworCQllbHNlIGlmKCBvcHRDb2RlLT5zaW5nbGV0b24oKSApCisJCXsKKwkJCXJldHVybiggb3B0Q29kZS0+Zmlyc3QoKS5iZkNvZGUoKSApOworCQl9CisKKwkJcmV0dXJuKCBvcHRDb2RlICk7CisJfQorCisJZWxzZSBpZiggYXRvbWljQ29kZS0+ZW1wdHkoKSApCisJeworCQlyZXR1cm4oIFN0YXRlbWVudENvbnN0cnVjdG9yOjpub3BDb2RlKCkgKTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuKCBhdG9taWNDb2RlLT5zaW5nbGV0b24oKSA/CisJCQkJYXRvbWljQ29kZS0+Zmlyc3QoKS5iZkNvZGUoKSA6IGF0b21pY0NvZGUgKTsKKwl9Cit9CisKKworCitCRkNvZGUgQXZtY29kZVN0cm9uZ1NlcXVlbmNlQ29tcGlsZXI6OmF0b21pemVTZXF1ZW5jZShjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlCRkNvZGUgb3B0Q29kZSggYUNvZGUtPmdldE9wZXJhdG9yKCkgKTsKKworCUJGQ29kZSBhdG9taWNDb2RlKCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FUT01JQ19TRVFVRU5DRSApOworCisJQkYgb3B0aW1pemVkQXJnOworCisJQXZtQ29kZTo6aXRlcmF0b3IgaXQgPSBhQ29kZS0+YmVnaW4oKTsKKwlBdm1Db2RlOjppdGVyYXRvciBlbmRJdCA9IGFDb2RlLT5lbmQoKTsKKwlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwl7CisJCW9wdGltaXplZEFyZyA9ICgqaXQpOworCisJCWlmKCBTdGF0ZW1lbnRUeXBlQ2hlY2tlcjo6aXNDb21tZW50KG9wdGltaXplZEFyZykgKQorCQl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBDT01QVVRJTkcgLCBTVEFURU1FTlQgKQorCQkJYXRvbWljQ29kZS0+YXBwZW5kKCBvcHRpbWl6ZWRBcmcgKTsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIENPTVBVVElORyAsIFNUQVRFTUVOVCApCisJCX0KKworCQkvLyA9PT4gU3RhdGVtZW50VHlwZUNoZWNrZXI6OmlzU3Ryb25nQXRvbWljU2VxdWVuY2UoYXRvbWljQ29kZSkKKwkJZWxzZSBpZiggU3RhdGVtZW50VHlwZUNoZWNrZXI6OmlzQXRvbWljU3RhdGVtZW50KG9wdGltaXplZEFyZykgKQorCQl7CisJCQlhdG9taWNDb2RlLT5hcHBlbmQoIG9wdGltaXplZEFyZyApOworCQl9CisJCWVsc2UgaWYoIFN0YXRlbWVudFR5cGVDaGVja2VyOjppc1N0cm9uZ0F0b21pY1NlcXVlbmNlKG9wdGltaXplZEFyZykgKQorCQl7CisJCQlhdG9taWNDb2RlLT5hcHBlbmQoIG9wdGltaXplZEFyZy50b19wdHI8IEF2bUNvZGUgPigpLT5nZXRBcmdzKCkgKTsKKwkJfQorCQllbHNlIGlmKCBhdG9taWNDb2RlLT5lbXB0eSgpICkKKwkJeworCQkJb3B0Q29kZS0+YXBwZW5kRmxhdCggb3B0aW1pemVkQXJnICk7CisJCX0KKwkJZWxzZSBpZiggU3RhdGVtZW50VHlwZUNoZWNrZXI6OmlzQXRvbWljU2VxdWVuY2Uob3B0aW1pemVkQXJnKSApCisJCXsKKwkJCWF0b21pY0NvZGUtPmFwcGVuZCggb3B0aW1pemVkQXJnLnRvX3B0cjwgQXZtQ29kZSA+KCktPmdldEFyZ3MoKSApOworCisJCQlvcHRDb2RlLT5hcHBlbmQoIGF0b21pY0NvZGUgKTsKKworCQkJYXRvbWljQ29kZSA9IFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FUT01JQ19TRVFVRU5DRSApOworCQl9CisJCWVsc2UgaWYoICgoaXQgKyAxKSAhPSBlbmRJdCApICkKKwkJeworCQkJYXRvbWljQ29kZS0+YXBwZW5kKCBvcHRpbWl6ZWRBcmcgKTsKKworCQkJb3B0Q29kZS0+YXBwZW5kKCBhdG9taWNDb2RlICk7CisKKwkJCWF0b21pY0NvZGUgPSBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BVE9NSUNfU0VRVUVOQ0UgKTsKKwkJfQorCQkvLyA9PT4gZW5kIGZvciguLi4pCisJCWVsc2UKKwkJeworCQkJaWYoIGF0b21pY0NvZGUtPnNpbmdsZXRvbigpICkKKwkJCXsKKwkJCQlvcHRDb2RlLT5hcHBlbmRGbGF0KCBhdG9taWNDb2RlLT5wb3BfbGFzdCgpICk7CisJCQl9CisJCQllbHNlIGlmKCBhdG9taWNDb2RlLT5wb3B1bGF0ZWQoKSApCisJCQl7CisJCQkJb3B0Q29kZS0+YXBwZW5kKCBhdG9taWNDb2RlICk7CisJCQl9CisJCQlhdG9taWNDb2RlID0gQkZDb2RlOjpSRUZfTlVMTDsKKworCQkJb3B0Q29kZS0+YXBwZW5kRmxhdCggb3B0aW1pemVkQXJnICk7CisJCX0KKwl9CisKKworCWlmKCBvcHRDb2RlLT5ub25lbXB0eSgpICkKKwl7CisJCWlmKCBhdG9taWNDb2RlLmludmFsaWQoKSApCisJCXsKKwkJCS8vISEgTk9USElORworCQl9CisJCWVsc2UgaWYoIGF0b21pY0NvZGUtPnNpbmdsZXRvbigpICkKKwkJeworCQkJb3B0Q29kZS0+YXBwZW5kRmxhdCggYXRvbWljQ29kZS0+cG9wX2xhc3QoKSApOworCQl9CisJCWVsc2UgaWYoIGF0b21pY0NvZGUtPnBvcHVsYXRlZCgpICkKKwkJeworCQkJb3B0Q29kZS0+YXBwZW5kKCBhdG9taWNDb2RlICk7CisJCX0KKworCQllbHNlIGlmKCBvcHRDb2RlLT5zaW5nbGV0b24oKSApCisJCXsKKwkJCXJldHVybiggb3B0Q29kZS0+Zmlyc3QoKS5iZkNvZGUoKSApOworCQl9CisKKwkJcmV0dXJuKCBvcHRDb2RlICk7CisJfQorCWVsc2UgaWYoIGF0b21pY0NvZGUtPnNpbmdsZXRvbigpICkKKwl7CisJCXJldHVybiggYXRvbWljQ29kZS0+Zmlyc3QoKS5iZkNvZGUoKSApOworCX0KKwllbHNlCisJeworCQlyZXR1cm4oIGF0b21pY0NvZGUgKTsKKwl9Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQVZNQ09ERSBTRVFVRU5DRSBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkYgQXZtY29kZVNlcXVlbmNlQ29tcGlsZXI6OmNvbXBpbGVFeHByZXNzaW9uKAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlyZXR1cm4oIGNvbXBpbGVTdGF0ZW1lbnQoYUNUWCwgYUNvZGUpICk7Cit9CisKK0JGIEF2bWNvZGVTZXF1ZW5jZUNvbXBpbGVyOjpvcHRpbWl6ZUV4cHJlc3Npb24oCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCUJGQ29kZSBvcHRDb2RlKCBhQ29kZS0+Z2V0T3BlcmF0b3IoKSApOworCisJQXZtQ29kZTo6aXRlcmF0b3IgaXQgPSBhQ29kZS0+YmVnaW4oKTsKKwlBdm1Db2RlOjppdGVyYXRvciBlbmRJdCA9IGFDb2RlLT5lbmQoKTsKKwlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwl7CisJCW9wdENvZGUtPmFwcGVuZCgKKwkJCQlBVk1DT0RFX0NPTVBJTEVSLmRlY29kZV9vcHRpbWl6ZUV4cHJlc3Npb24oYUNUWCwgKml0KSApOworCX0KKworCXJldHVybiggb3B0Q29kZS0+c2luZ2xldG9uKCkgPyBvcHRDb2RlLT5maXJzdCgpLmJmQ29kZSgpIDogb3B0Q29kZSApOworfQorCisKK0JGQ29kZSBBdm1jb2RlU2VxdWVuY2VDb21waWxlcjo6Y29tcGlsZVN0YXRlbWVudCgKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJQkZDb2RlIG5ld0NvZGUgPSBBYnN0cmFjdEF2bWNvZGVDb21waWxlcjo6Y29tcGlsZVN0YXRlbWVudChhQ1RYLCBhQ29kZSk7CisKKwlpZiggbmV3Q29kZS0+c2luZ2xldG9uKCkgKQorCXsKKwkJaWYoIG5ld0NvZGUtPmZpcnN0KCkuaXM8IEF2bUNvZGUgPigpICkKKwkJeworCQkJcmV0dXJuKCBuZXdDb2RlLT5maXJzdCgpLmJmQ29kZSgpICk7CisJCX0KKwl9CisJZWxzZSBpZiggbmV3Q29kZS0+ZW1wdHkoKSApCisJeworCQlyZXR1cm4oIFN0YXRlbWVudENvbnN0cnVjdG9yOjpub3BDb2RlKCkgKTsKKwl9CisKKwlyZXR1cm4oIG5ld0NvZGUgKTsKK30KKworCitCRkNvZGUgQXZtY29kZVNlcXVlbmNlQ29tcGlsZXI6Om9wdGltaXplU3RhdGVtZW50KAorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlCRkNvZGUgb3B0Q29kZSggYUNvZGUtPmdldE9wZXJhdG9yKCkgKTsKKworCUJGIG9wdGltaXplZEFyZzsKKworCUF2bUNvZGU6Oml0ZXJhdG9yIGl0ID0gYUNvZGUtPmJlZ2luKCk7CisJQXZtQ29kZTo6aXRlcmF0b3IgZW5kSXQgPSBhQ29kZS0+ZW5kKCk7CisJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJeworCQlvcHRpbWl6ZWRBcmcgPSBBVk1DT0RFX0NPTVBJTEVSLmRlY29kZV9vcHRpbWl6ZVN0YXRlbWVudChhQ1RYLCAqaXQpOworCisJCWlmKCBTdGF0ZW1lbnRUeXBlQ2hlY2tlcjo6aXNDb21tZW50KG9wdGltaXplZEFyZykgKQorCQl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBDT01QVVRJTkcgLCBTVEFURU1FTlQgKQorCQkJb3B0Q29kZS0+YXBwZW5kKCBvcHRpbWl6ZWRBcmcgKTsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIENPTVBVVElORyAsIFNUQVRFTUVOVCApCisJCX0KKworCQllbHNlCisJCXsKKwkJCW9wdENvZGUtPmFwcGVuZEZsYXQoIG9wdGltaXplZEFyZyApOworCQl9CisJfQorCisJaWYoIG9wdENvZGUtPmVtcHR5KCkgKQorCXsKKwkJcmV0dXJuKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bm9wQ29kZSgpICk7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiggb3B0Q29kZS0+c2luZ2xldG9uKCkgPyBvcHRDb2RlLT5maXJzdCgpLmJmQ29kZSgpIDogb3B0Q29kZSApOworCX0KK30KKworCisKKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlU2VxdWVuY2VDb21waWxlci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZVNlcXVlbmNlQ29tcGlsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTYxNzcyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZVNlcXVlbmNlQ29tcGlsZXIuaApAQCAtMCwwICsxLDQwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMSBtYWkgMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEFWTUNPREVTRVFVRU5DRUNPTVBJTEVSX0hfCisjZGVmaW5lIEFWTUNPREVTRVFVRU5DRUNPTVBJTEVSX0hfCisKKyNpbmNsdWRlIDxidWlsZGVyL3ByaW1pdGl2ZS9BYnN0cmFjdEF2bWNvZGVDb21waWxlci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitBVk1DT0RFX0NPTVBJTEVSX09QVElNSVpFUl9DTEFTUyhBdG9taWNTZXF1ZW5jZSwgQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXIpCisKKworQVZNQ09ERV9DT01QSUxFUl9PUFRJTUlaRVJfQ0xBU1NfSEVBREVSKFN0cm9uZ1NlcXVlbmNlLCBBYnN0cmFjdEF2bWNvZGVDb21waWxlcikKKwlzdGF0aWMgQkZDb2RlIGF0b21pemVTZXF1ZW5jZShjb25zdCBCRkNvZGUgJiBhQ29kZSk7Cit9OworCisKK0FWTUNPREVfQ09NUElMRVJfT1BUSU1JWkVSX0NMQVNTKFNlcXVlbmNlLCBBYnN0cmFjdEF2bWNvZGVDb21waWxlcikKKworCisKK30KKworI2VuZGlmIC8qIEFWTUNPREVTRVFVRU5DRUNPTVBJTEVSX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlVWZpQ2FzdEV4cHJlc3Npb25Db21waWxlci5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlVWZpQ2FzdEV4cHJlc3Npb25Db21waWxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjExMzRiNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVVZmlDYXN0RXhwcmVzc2lvbkNvbXBpbGVyLmNwcApAQCAtMCwwICsxLDg2NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDQgbWFpIDIwMTEKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkF2bWNvZGVVZmlDYXN0RXhwcmVzc2lvbkNvbXBpbGVyLmgiCisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9CYXNlSW5zdGFuY2VGb3JtLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZVN5c3RlbS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZEYXRhLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZk1hY2hpbmUuaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0F2bUNvZGUuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29uc3RydWN0b3IuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uVHlwZUNoZWNrZXIuaD4KKworI2luY2x1ZGUgPGZtbC9saWIvQXZtT3BlcmF0aW9uRmFjdG9yeS5oPgorCisjaW5jbHVkZSA8Zm1sL3N5bWJvbC9UYWJsZU9mU3ltYm9sLmg+CisKKyNpbmNsdWRlIDxmbWwvb3BlcmF0b3IvT3BlcmF0b3JNYW5hZ2VyLmg+CisKKyNpbmNsdWRlIDxmbWwvdHlwZS9CYXNlVHlwZVNwZWNpZmllci5oPgorI2luY2x1ZGUgPGZtbC90eXBlL0Jhc2VTeW1ib2xUeXBlU3BlY2lmaWVyLmg+CisjaW5jbHVkZSA8Zm1sL3R5cGUvQ29udGFpbmVyVHlwZVNwZWNpZmllci5oPgorI2luY2x1ZGUgPGZtbC90eXBlL0VudW1UeXBlU3BlY2lmaWVyLmg+CisKKyNpbmNsdWRlIDxmbWwvd29ya2Zsb3cvVW5pRm9ybUlkZW50aWZpZXIuaD4KKworI2luY2x1ZGUgPHNldy9Db25maWd1cmF0aW9uLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk1DT0RFIFVGSSBFWFBSRVNTSU9OIENPTVBJTEFUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitCRiBBdm1jb2RlVWZpRXhwcmVzc2lvbkNvbXBpbGVyOjpjb21waWxlVWZpRXhwcmVzc2lvbigKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgVW5pRm9ybUlkZW50aWZpZXIgJiB0aGVVRkkpCit7CisJQkYgYmZJbnN0YW5jZTsKKworCWlmKCB0aGVVRkkuaXNBYnNvbHV0ZUZ1bGxGaWVsZHMoKSApCisJeworCQliZkluc3RhbmNlID0gZ2V0U3ltYm9sVGFibGUoKS5zZWFyY2hTeW1ib2xCeVVGSShhQ1RYLCB0aGVVRkkpOworCQlpZiggYmZJbnN0YW5jZS52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCBiZkluc3RhbmNlICk7CisJCX0KKworCQllbHNlCisJCXsKKwkJCXN0ZDo6c3RyaW5nIHN0clVGSSA9IHRoZVVGSS5zdHIoKTsKKworCQkJLy9TdHJpbmdUb29sczo6cmVwbGFjZShzdHJVRkksICJzcGVjOjoiLCAiaW5zdDo6Iik7CisJCQlTdHJpbmdUb29sczo6ZXJhc2VBbGwoc3RyVUZJLCAiJiIpOworCisJCQliZkluc3RhbmNlID0gZ2V0U3ltYm9sVGFibGUoKS5zZWFyY2hTeW1ib2woYUNUWCwgc3RyVUZJKTsKKwkJCWlmKCBiZkluc3RhbmNlLnZhbGlkKCkgKQorCQkJeworCQkJCXJldHVybiggYmZJbnN0YW5jZSApOworCQkJfQorCQl9CisJfQorCWVsc2UgaWYoIHRoZVVGSS5pc0Z1bGxPZmZzZXQoKSApCisJeworCQliZkluc3RhbmNlID0gZ2V0U3ltYm9sVGFibGUoKS5zZWFyY2hTeW1ib2xCeVF1YWxpZmllZE5hbWVJRCgKKwkJCQlhQ1RYLCB0aGVVRkkuc3RyKCkpOworCQlpZiggYmZJbnN0YW5jZS52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCBiZkluc3RhbmNlICk7CisJCX0KKwl9CisKKwlVbmlGb3JtSWRlbnRpZmllcjo6Y29uc3RfaXRlcmF0b3IgaXQgPSB0aGVVRkkuYmVnaW4oKTsKKwlVbmlGb3JtSWRlbnRpZmllcjo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSB0aGVVRkkuZW5kKCk7CisKKwlzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzVUZJOworCisJY29uc3QgT2JqZWN0RWxlbWVudCAqIFRoZU1haW5PYmplY3RFbGVtZW50ID0gTlVMTDsKKworCS8vIENIRUNLSU5HIEZJUlNUIEVMRU1FTlQKKwlpZiggKCppdCkuaXM8IE9iamVjdEVsZW1lbnQgPigpICkKKwl7CisJCVRoZU1haW5PYmplY3RFbGVtZW50ID0gKCppdCkudG9fcHRyPCBPYmplY3RFbGVtZW50ID4oKTsKKwl9CisJZWxzZQorCXsKKwkJaWYoIHRoZVVGSS5oYXNMb2NhdG9yKCkgKQorCQl7CisJCQlvc3NVRkkgPDwgdGhlVUZJLnRvU3RyaW5nTG9jYXRvcigpCisJCQkJCTw8IEZRTl9JRF9ST09UX1NFUEFSQVRPUiA8PCAoKml0KS5zdHIoKTsKKwkJfQorCQlvc3NVRkkgPDwgKCppdCkuc3RyKCk7CisKKwkJVGhlTWFpbk9iamVjdEVsZW1lbnQgPSBBVk1DT0RFX0NPTVBJTEVSLmdldENvbmZpZ3VyYXRpb24oKS4KKwkJCQlnZXRFeGVjdXRhYmxlU3lzdGVtKCkuZ2V0U3lzdGVtSW5zdGFuY2UoKS5nZXRBc3RFbGVtZW50KCk7CisJfQorCisJaWYoIFRoZU1haW5PYmplY3RFbGVtZW50ID09IE5VTEwgKQorCXsKKwkJYmZJbnN0YW5jZSA9IGdldFN5bWJvbFRhYmxlKCkuc2VhcmNoRGF0YUluc3RhbmNlKGFDVFgsIHRoZVVGSS5zdHIoKSk7CisJCWlmKCBiZkluc3RhbmNlLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGJmSW5zdGFuY2UgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWJmSW5zdGFuY2UgPSBnZXRTeW1ib2xUYWJsZSgpLnNlYXJjaFN5bWJvbEJ5TmFtZUlEKGFDVFgsICgqaXQpLnN0cigpKTsKKwkJCWlmKCBiZkluc3RhbmNlLnZhbGlkKCkgKQorCQkJeworCQkJCVRoZU1haW5PYmplY3RFbGVtZW50ID0gYmZJbnN0YW5jZS50b19wdHI8CisJCQkJCQlCYXNlSW5zdGFuY2VGb3JtID4oKS0+Z2V0QXN0RWxlbWVudCgpOworCQkJfQorCQl9CisJfQorCisKKwlpZiggVGhlTWFpbk9iamVjdEVsZW1lbnQgIT0gTlVMTCApCisJeworCQlPYmplY3RFbGVtZW50ICogb2JqRWxlbWVudCA9IE5VTEw7CisKKwkJb3NzVUZJLnN0cigiIik7CisJCW9zc1VGSSA8PCBUaGVNYWluT2JqZWN0RWxlbWVudC0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsKKworCQkvLyBDSEVDS0lORyBNQUlOIEZPUk0KKwkJZm9yKCArK2l0IDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwkJeworCQkJaWYoICgqaXQpLmlzPCBPYmplY3RFbGVtZW50ID4oKSApCisJCQl7CisJCQkJb2JqRWxlbWVudCA9ICgqaXQpLnRvX3B0cjwgT2JqZWN0RWxlbWVudCA+KCk7CisKKwkJCQlpZiggb2JqRWxlbWVudC0+Z2V0Q29udGFpbmVyKCkgPT0gVGhlTWFpbk9iamVjdEVsZW1lbnQgKQorCQkJCXsKKwkJCQkJVGhlTWFpbk9iamVjdEVsZW1lbnQgPSBvYmpFbGVtZW50OworCisJCQkJCW9zc1VGSS5zdHIoIiIpOworCQkJCQlvc3NVRkkgPDwgVGhlTWFpbk9iamVjdEVsZW1lbnQtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYoICgqaXQpLmlzSWRlbnRpZmllcigpICkKKwkJCXsKKwkJCQlvc3NVRkkgPDwgJy4nIDw8ICgqaXQpLnN0cigpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiggb2JqRWxlbWVudCAhPSBOVUxMICkKKwkJCXsKKwkJCQlUaGVNYWluT2JqZWN0RWxlbWVudCA9IG9iakVsZW1lbnQ7CisKKwkJCQkvLyEhW01JR1JBVElPTl0gaS5lLiBpc0FycmF5VHlwZSgpIGlzQ29udGFpbmVyVHlwZSgpIGlzQ2xhc3NUeXBlKCkKKwkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJPDwgIiEhISBEYXRhVHlwZUZhY3Rvcnk6OmlzQ29tcG9zaXRlVHlwZSAhISEiCisJCQkJCQk8PCBTRU5EX0VYSVQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJZWxzZSBpZiggKCppdCkuaXNGaWVsZEludm9rYWJsZSgpICkKKwl7CisJCU9wZXJhdG9yICogb3BFeHByID0gQXZtT3BlcmF0aW9uRmFjdG9yeTo6Z2V0KCAoKml0KS5zdHIoKSApOworCQlpZiggb3BFeHByICE9IE5VTEwgKQorCQl7CisJCQlCRkNvZGUgYW5JbnZva2VFeHByZXNzaW9uKCBvcEV4cHIgKTsKKworCQkJQkYgYXJnOworCQkJZm9yKCArK2l0IDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwkJCXsKKwkJCQlpZiggKCppdCkuaXNGaWVsZFBhcmFtZXRlcigpICkKKwkJCQl7CisJCQkJCWFyZyA9IGNvbXBpbGVBcmdSdmFsdWUoYUNUWCwgKml0KTsKKworCQkJCQlpZiggYXJnLnZhbGlkKCkgKQorCQkJCQl7CisJCQkJCQlhbkludm9rZUV4cHJlc3Npb24tPmFwcGVuZCggYXJnICk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlnZXRDb21waWxlclRhYmxlKCkuaW5jckVycm9yQ291bnQoKTsKKwkJCQkJCWFDVFgtPmVycm9yQ29udGV4dCggQVZNX09TX1dBUk4gKQorCQkJCQkJCQk8PCAiQXZtQ29kZTwgc3RhdGVtZW50ID4gY29tcGlsYXRpb24gZXJyb3IgPDwgIgorCQkJCQkJCQk8PCAoKml0KS5zdHIoKSA8PCAiID4+IgorCQkJCQkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCisJCQkJCQlhbkludm9rZUV4cHJlc3Npb24tPmFwcGVuZCggKml0ICk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlpZiggaXQgIT0gaXRFbmQgKQorCQkJeworCQkJCWdldENvbXBpbGVyVGFibGUoKS5pbmNyRXJyb3JDb3VudCgpOworCQkJCWFDVFgtPmVycm9yQ29udGV4dCggQVZNX09TX1dBUk4gKQorCQkJCQkJPDwgIkF2bUNvZGU8IHN0YXRlbWVudCA+IGNvbXBpbGF0aW9uIGVycm9yIgorCQkJCQkJIiA8PCAoOiAiIDw8IGFuSW52b2tlRXhwcmVzc2lvbi5zdHIoKQorCQkJCQkJPDwgIiAiIDw8ICgqaXQpLnN0cigpIDw8ICAiIC4uLikgPj4gZm9yICIKKwkJCQkJCTw8IHRoZVVGSS5zdHIoKSA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCQkJfQorCisJCQlyZXR1cm4oIGFuSW52b2tlRXhwcmVzc2lvbiApOworCQl9CisJCWVsc2UKKwkJeworCQkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JFcnJvckNvdW50KCk7CisJCQlBVk1fT1NfV0FSTiA8PCAiVW5mb3VuZCB0aGUgb3BlcmF0aW9uIDwgIiA8PCAoKml0KS5zdHIoKQorCQkJCQk8PCAiID4gaW4gdGhlIFVGSSA8ICIgPDwgdGhlVUZJLnN0cigpIDw8ICIgPiIKKwkJCQkJPDwgc3RkOjplbmRsOworCisJCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCQl9CisJfQorCisJZWxzZQorCXsKKwkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JFcnJvckNvdW50KCk7CisJCUFWTV9PU19XQVJOIDw8ICJVbmZvdW5kIHRoZSBpbnZva2FibGUgZmllbGQgPCAiIDw8IG9zc1VGSS5zdHIoKQorCQkJCTw8ICIgPiBvZiBVRkkgPCAiIDw8IHRoZVVGSS5zdHIoKSA8PCAiID4gaW4gdGhlIHN5c3RlbSA8PCAiCisJCQkJPDwgQVZNQ09ERV9DT01QSUxFUi5nZXRDb25maWd1cmF0aW9uKCkuCisJCQkJCQlnZXRFeGVjdXRhYmxlU3lzdGVtKCkucmF3U3lzdGVtSW5zdGFuY2UoKS0+CisJCQkJCQkJCWdldEFzdEVsZW1lbnQoKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJCTw8ICIgPj4iIDw8IHN0ZDo6ZW5kbDsKKworCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCX0KKworCisJLy8gQ0hFQ0tJTkcgRklSU1QgSU5TVEFOQ0UKKwlpZiggVGhlTWFpbk9iamVjdEVsZW1lbnQgIT0gTlVMTCApCisJeworCQliZkluc3RhbmNlID0gZ2V0U3ltYm9sVGFibGUoKS5zZWFyY2hJbnN0YW5jZShhQ1RYLCBUaGVNYWluT2JqZWN0RWxlbWVudCk7CisJfQorCWVsc2UKKwl7CisJCWdldENvbXBpbGVyVGFibGUoKS5pbmNyRXJyb3JDb3VudCgpOworCQlBVk1fT1NfV0FSTiA8PCAiVW5mb3VuZCB0aGUgbWFpbiBvYmplY3QgZWxlbWVudCA8ICIgPDwgb3NzVUZJLnN0cigpCisJCQkJPDwgIiA+IG9mIFVGSSA8ICIgPDwgdGhlVUZJLnN0cigpIDw8ICIgPiBpbiB0aGUgc3lzdGVtIDw8ICIKKwkJCQk8PCBBVk1DT0RFX0NPTVBJTEVSLmdldENvbmZpZ3VyYXRpb24oKS4KKwkJCQkJCWdldEV4ZWN1dGFibGVTeXN0ZW0oKS5yYXdTeXN0ZW1JbnN0YW5jZSgpLT4KKwkJCQkJCQkJZ2V0QXN0RWxlbWVudCgpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQkJPDwgIiA+PiIgPDwgc3RkOjplbmRsOworCisJCXJldHVybiggQkY6OlJFRl9OVUxMICk7CisJfQorCisKKwlpZiggYmZJbnN0YW5jZS52YWxpZCgpICkKKwl7CisJCWlmKCBpdCA9PSBpdEVuZCApCisJCXsKKwkJCXJldHVybiggYmZJbnN0YW5jZSApOworCQl9CisKKwkJLy8gQ0FTRSBGSVJTVCBJTlNUQU5DRSBpcyBhIE1BQ0hJTkUKKwkJaWYoIGJmSW5zdGFuY2UuaXM8IEluc3RhbmNlT2ZNYWNoaW5lID4oKSApCisJCXsKKwkJCUluc3RhbmNlT2ZNYWNoaW5lICogdGhlSW5zdGFuY2VNYWNoaW5lID0KKwkJCQkJYmZJbnN0YW5jZS50b19wdHI8IEluc3RhbmNlT2ZNYWNoaW5lID4oKTsKKworCQkJSW5zdGFuY2VPZk1hY2hpbmUgKiBwdHJJbnN0YW5jZSA9IE5VTEw7CisKKwkJCS8vIENIRUNLSU5HIEZPUiBNQUlOIE1BQ0hJTkUKKwkJCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQorCQkJeworCQkJCWlmKCAoKml0KS5pc0lkZW50aWZpZXIoKSApCisJCQkJeworCQkJCQlvc3NVRkkuc3RyKCIiKTsKKwkJCQkJb3NzVUZJIDw8IHRoZUluc3RhbmNlTWFjaGluZS0+Z2V0RXhlY3V0YWJsZSgpLT4KKwkJCQkJCQlnZXRBc3RGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8ICcuJyA8PCAoKml0KS5zdHIoKTsKKwkJCQkJYmZJbnN0YW5jZSA9IGdldFN5bWJvbFRhYmxlKCkuc2VhcmNoSW5zdGFuY2UoCisJCQkJCQkJYUNUWC0+bmV3Q1RYKHRoZUluc3RhbmNlTWFjaGluZS0+Z2V0RXhlY3V0YWJsZSgpKSwKKwkJCQkJCQlvc3NVRkkuc3RyKCkgKTsKKwkJCQkJaWYoIGJmSW5zdGFuY2UudmFsaWQoKSApCisJCQkJCXsKKwkJCQkJCWlmKCBiZkluc3RhbmNlLmlzPCBJbnN0YW5jZU9mTWFjaGluZSA+KCkgKQorCQkJCQkJeworCQkJCQkJCXB0ckluc3RhbmNlID0gYmZJbnN0YW5jZS50b19wdHI8IEluc3RhbmNlT2ZNYWNoaW5lID4oKTsKKworCQkJCQkJCWlmKCBwdHJJbnN0YW5jZS0+Z2V0Q29udGFpbmVyKCkgPT0KKwkJCQkJCQkJCXRoZUluc3RhbmNlTWFjaGluZS0+Z2V0RXhlY3V0YWJsZSgpICkKKwkJCQkJCQl7CisJCQkJCQkJCXRoZUluc3RhbmNlTWFjaGluZSA9IHB0ckluc3RhbmNlOworCQkJCQkJCX0KKwkJCQkJCQllbHNlCisJCQkJCQkJeworCQkJCQkJCQlnZXRDb21waWxlclRhYmxlKCkuaW5jckVycm9yQ291bnQoKTsKKwkJCQkJCQkJQVZNX09TX1dBUk4gPDwgIlVuZXhwZWN0ZWQgYSBub24gY2hpbGQgbWFjaGluZSAiCisJCQkJCQkJCQkJImluc3RhbmNlIDwgIiA8PCBwdHJJbnN0YW5jZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJCQkJCQkJCTw8ICIgb2YgdGhlIG1hY2hpbmUgaW5zdGFuY2UgPCAiCisJCQkJCQkJCQkJPDwgdGhlSW5zdGFuY2VNYWNoaW5lLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQkJCQkJCQkJPDwgIiA+ID4gaW4gdGhlIFVGSSA8ICIgPDwgdGhlVUZJLnN0cigpCisJCQkJCQkJCQkJPDwgIiA+IiA8PCBzdGQ6OmVuZGw7CisKKwkJCQkJCQkJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQllbHNlIGlmKCBiZkluc3RhbmNlLmlzPCBJbnN0YW5jZU9mRGF0YSA+KCkgKQorCQkJCQkJeworCQkJCQkJCSsraXQ7CisKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCWdldENvbXBpbGVyVGFibGUoKS5pbmNyRXJyb3JDb3VudCgpOworCQkJCQkJQVZNX09TX1dBUk4gPDwgIlVuZm91bmQgbWFjaGluZSBhdHRyaWJ1dGUgPCAiCisJCQkJCQkJCTw8ICgqaXQpLnN0cigpIDw8ICIgPiBvZiB0aGUgVUZJIDwgIgorCQkJCQkJCQk8PCB0aGVVRkkuc3RyKCkgPDwgIiA+IiA8PCBzdGQ6OmVuZGw7CisKKwkJCQkJCXJldHVybiggQkY6OlJFRl9OVUxMICk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JFcnJvckNvdW50KCk7CisJCQkJCUFWTV9PU19XQVJOIDw8ICJVbmV4cGVjdGVkIGNsYXNzIGF0dHJpYnV0ZSBraW5kIDwgIgorCQkJCQkJCTw8ICgqaXQpLnN0cigpIDw8ICIgPiBvZiB0aGUgVUZJIDwgIgorCQkJCQkJCTw8IHRoZVVGSS5zdHIoKSA8PCAiID4iIDw8IHN0ZDo6ZW5kbDsKKworCQkJCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCQkJCX0KKwkJCX0KKworCQkJaWYoIGl0ID09IGl0RW5kICkKKwkJCXsKKwkJCQliZkluc3RhbmNlID0gZ2V0U3ltYm9sVGFibGUoKS5jcmVhdGVBbGlhc0lmTm90QWNjZXNzaWJsZSgKKwkJCQkJCWFDVFgsIHRoZUluc3RhbmNlTWFjaGluZSwgYmZJbnN0YW5jZSk7CisKKwkJCQkvLyBFUlJPUiBSRVBPUlRJTkcKKwkJCQlpZiggZ2V0U3ltYm9sVGFibGUoKS5oYXNFcnJvcigpICkKKwkJCQl7CisJCQkJCWdldENvbXBpbGVyVGFibGUoKS5pbmNyRXJyb3JDb3VudCgpOworCQkJCQlBVk1fT1NfV0FSTiA8PCB0aGVVRkkuZXJyb3JMb2NhdGlvbigKKwkJCQkJCQlhQ1RYLT5tQ29tcGlsZUN0eC0+Z2V0QXN0RWxlbWVudCgpICkKKwkJCQkJCQk8PCBnZXRTeW1ib2xUYWJsZSgpLmdldEVycm9yTWVzc2FnZSgpCisJCQkJCQkJPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKwkJCQl9CisKKwkJCQlyZXR1cm4oIGJmSW5zdGFuY2UgKTsKKwkJCX0KKwkJfQorCisKKwkJLy8gQ0FTRSBGSVJTVCBJTlNUQU5DRSBpcyBhIERBVEEKKwkJaWYoIGJmSW5zdGFuY2UuaXM8IEluc3RhbmNlT2ZEYXRhID4oKSApCisJCXsKKwkJCWJmSW5zdGFuY2UgPSBnZXRTeW1ib2xUYWJsZSgpLgorCQkJCQljcmVhdGVBbGlhc0lmTm90QWNjZXNzaWJsZShhQ1RYLCBiZkluc3RhbmNlKTsKKwkJCS8vIEVSUk9SIFJFUE9SVElORworCQkJaWYoIGdldFN5bWJvbFRhYmxlKCkuaGFzRXJyb3IoKSApCisJCQl7CisJCQkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JFcnJvckNvdW50KCk7CisJCQkJQVZNX09TX1dBUk4gPDwgdGhlVUZJLmVycm9yTG9jYXRpb24oCisJCQkJCQlhQ1RYLT5tQ29tcGlsZUN0eC0+Z2V0QXN0RWxlbWVudCgpICkKKwkJCQkJCTw8IGdldFN5bWJvbFRhYmxlKCkuZ2V0RXJyb3JNZXNzYWdlKCkKKwkJCQkJCTw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisJCQl9CisKKwkJCVN5bWJvbCBzeW1ib2xEYXRhKCBiZkluc3RhbmNlICk7CisKKwkJCUluc3RhbmNlT2ZEYXRhICogcHRySW5zdGFuY2UgPSBiZkluc3RhbmNlLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpOworCisJCQlCYXNlVHlwZVNwZWNpZmllciAqIGFUeXBlU3BlY2lmaWVyID0gcHRySW5zdGFuY2UtPmdldFR5cGVTcGVjaWZpZXIoKTsKKworCQkJaWYoIGFUeXBlU3BlY2lmaWVyLT5oYXNUeXBlU3RydWN0dXJlT3JDaG9pY2VPclVuaW9uKCkgfHwKKwkJCQkJYVR5cGVTcGVjaWZpZXItPmhhc1R5cGVBcnJheVZlY3RvcigpICkKKwkJCXsKKwkJCQlCYXNlU3ltYm9sVHlwZVNwZWNpZmllciAqIGFTdHJ1Y3RUeXBlU3BlY2lmaWVyID0gTlVMTDsKKworCQkJCWJvb2wgaXNBcnJheUluZGV4ID0gZmFsc2U7CisvLwkJCQlib29sIGlzTm90QXJyYXkgPSB0cnVlOworCisJCQkJVGFibGVPZlN5bWJvbCBhUmVsYXRpdmVEYXRhUGF0aDsKKwkJCQlzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzSUQ7CisKKwkJCQlvc3NVRkkuc3RyKCAiIiApOworCQkJCW9zc1VGSSA8PCBwdHJJbnN0YW5jZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsKKworCQkJCW9zc0lEIDw8IHB0ckluc3RhbmNlLT5nZXROYW1lSUQoKTsKKworCisJCQkJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApCisJCQkJeworCQkJCQlpZiggKCppdCkuaXNGaWVsZEluZGV4KCkgKQorCQkJCQl7CisJCQkJCQlpZiggbm90IGFUeXBlU3BlY2lmaWVyLT5oYXNUeXBlQXJyYXlWZWN0b3IoKSApCisJCQkJCQl7CisJCQkJCQkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JFcnJvckNvdW50KCk7CisJCQkJCQkJYUNUWC0+ZXJyb3JDb250ZXh0KCBBVk1fT1NfV0FSTiApCisJCQkJCQkJCQk8PCAiVW5leHBlY3RlZCBhIG5vbiBBcnJheSBmaWVsZCBraW5kIDwgIgorCQkJCQkJCQkJPDwgb3NzVUZJLnN0cigpIDw8ICIgPiBvZiB0aGUgVUZJIDwgIgorCQkJCQkJCQkJPDwgdGhlVUZJLnN0cigpIDw8ICIgPiIgPDwgc3RkOjplbmRsOworCisJCQkJCQkJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKKwkJCQkJCX0KKworCQkJCQkJYVR5cGVTcGVjaWZpZXIgPSBhVHlwZVNwZWNpZmllci0+CisJCQkJCQkJCWFzPCBDb250YWluZXJUeXBlU3BlY2lmaWVyID4oKS0+CisJCQkJCQkJCWdldENvbnRlbnRzVHlwZVNwZWNpZmllcigpOworCisJCQkJCQlCRiBpbmRleCA9IGNvbXBpbGVBcmdSdmFsdWUoYUNUWCwgKCppdCkpOworCQkJCQkJaWYoIGluZGV4LnZhbGlkKCkgKQorCQkJCQkJeworLy8JCQkJCQkJaXNOb3RBcnJheSA9IGZhbHNlOworCQkJCQkJCWlmKCBpbmRleC5pc0ludGVnZXIoKSApCisJCQkJCQkJeworCQkJCQkJCQlzeW1ib2xEYXRhID0gbmV3IEluc3RhbmNlT2ZEYXRhKAorCQkJCQkJCQkJCUlQb2ludGVyRGF0YU5hdHVyZTo6CisJCQkJCQkJCQkJCVBPSU5URVJfRklFTERfQVJSQVlfT0ZGU0VUX05BVFVSRSwKKwkJCQkJCQkJCQlhQ1RYLT5tQ29tcGlsZUN0eCwKKwkJCQkJCQkJCQlhVHlwZVNwZWNpZmllci0+Z2V0QXN0RWxlbWVudCgpLAorCQkJCQkJCQkJCWFUeXBlU3BlY2lmaWVyLCAwICk7CisJCQkJCQkJCXN5bWJvbERhdGEuc2V0T2Zmc2V0KCBpbmRleC50b0ludGVnZXIoKSApOworCQkJCQkJCX0KKwkJCQkJCQllbHNlCisJCQkJCQkJeworCQkJCQkJCQlpc0FycmF5SW5kZXggPSB0cnVlOworCQkJCQkJCQlzeW1ib2xEYXRhID0gbmV3IEluc3RhbmNlT2ZEYXRhKAorCQkJCQkJCQkJCUlQb2ludGVyRGF0YU5hdHVyZTo6CisJCQkJCQkJCQkJCVBPSU5URVJfRklFTERfQVJSQVlfSU5ERVhfTkFUVVJFLAorCQkJCQkJCQkJCWFDVFgtPm1Db21waWxlQ3R4LAorCQkJCQkJCQkJCWFUeXBlU3BlY2lmaWVyLT5nZXRBc3RFbGVtZW50KCksCisJCQkJCQkJCQkJYVR5cGVTcGVjaWZpZXIsIDAgKTsKKwkJCQkJCQkJc3ltYm9sRGF0YS5zZXRWYWx1ZSggaW5kZXggKTsKKwkJCQkJCQl9CisKKwkJCQkJCQlhUmVsYXRpdmVEYXRhUGF0aC5hcHBlbmQoIHN5bWJvbERhdGEgKTsKKworCQkJCQkJCW9zc1VGSSA8PCAiWyIgPDwgaW5kZXguc3RyKCkgPDwgIl0iOworCQkJCQkJCW9zc0lEICA8PCAiWyIgPDwgKCBpbmRleC5pczwgQmFzZUluc3RhbmNlRm9ybSA+KCkgPworCQkJCQkJCQkJaW5kZXgudG9fcHRyPCBCYXNlSW5zdGFuY2VGb3JtID4oKS0+Z2V0TmFtZUlEKCkgOgorCQkJCQkJCQkJaW5kZXguc3RyKCkgKSA8PCAiXSI7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JFcnJvckNvdW50KCk7CisJCQkJCQkJQVZNX09TX1dBUk4gPDwgIlVuZm91bmQgYXJyYXkgaW5kZXggPCAiCisJCQkJCQkJCQk8PCAoKml0KS5zdHIoKSA8PCAiID4gb2YgdGhlIFVGSSBlbGVtZW50IDwgIgorCQkJCQkJCQkJPDwgdGhlVUZJLnN0cigpIDw8ICIgPiIgPDwgc3RkOjplbmRsOworCisJCQkJCQkJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCWVsc2UgaWYoIGFUeXBlU3BlY2lmaWVyLT5oYXNUeXBlU3RydWN0dXJlT3JDaG9pY2VPclVuaW9uKCkgKQorCQkJCQl7CisvLwkJCQkJCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9QT0lOVEVSX0VYSVQoIGFUeXBlU3BlY2lmaWVyLT5pc1R5cGVkQ2xhc3MoKSApCisvLwkJCQkJCQkJPDwgIlVuZXhwZWN0ZWQgYSBub24gQ2xhc3MvU3RydWN0IHR5cGUgISEhIgorLy8JCQkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCQkJYVN0cnVjdFR5cGVTcGVjaWZpZXIgPQorCQkJCQkJCQlhVHlwZVNwZWNpZmllci0+dG88IEJhc2VTeW1ib2xUeXBlU3BlY2lmaWVyID4oKTsKKwkJCQkJCWlmKCAoKml0KS5pc0lkZW50aWZpZXIoKSApCisJCQkJCQl7CisJCQkJCQkJb3NzVUZJIDw8ICcuJyA8PCAoKml0KS5zdHIoKTsKKwkJCQkJCQlvc3NJRCA8PCAnLicgPDwgKCppdCkuc3RyKCk7CisKKwkJCQkJCQlzeW1ib2xEYXRhID0gc3ltYm9sRGF0YS5nZXRBdHRyaWJ1dGVCeU5hbWVJRCggb3NzSUQuc3RyKCkgKTsKKwkJCQkJCQlpZiggc3ltYm9sRGF0YS5pbnZhbGlkKCkgKQorCQkJCQkJCXsKKwkJCQkJCQkJc3ltYm9sRGF0YSA9IGFTdHJ1Y3RUeXBlU3BlY2lmaWVyLT4KKwkJCQkJCQkJCQlnZXREYXRhQnlOYW1lSUQoICgqaXQpLnN0cigpICk7CisJCQkJCQkJfQorCisJCQkJCQkJLy8hISBOTyBFTFNFIGhlcmUKKwkJCQkJCQlpZiggc3ltYm9sRGF0YS52YWxpZCgpICkKKwkJCQkJCQl7CisJCQkJCQkJCWlmKCBhVHlwZVNwZWNpZmllci0+aXNUeXBlZFVuaW9uKCkgKQorCQkJCQkJCQl7CisJCQkJCQkJCQkvLyBOb3QgaW5zZXJ0aW9uIGluIERhdGEgcGF0aAorCQkJCQkJCQl9CisJCQkJCQkJCWVsc2UKKwkJCQkJCQkJeworCQkJCQkJCQkJYVJlbGF0aXZlRGF0YVBhdGguYXBwZW5kKCBzeW1ib2xEYXRhICk7CisJCQkJCQkJCX0KKworCQkJCQkJCQlhVHlwZVNwZWNpZmllciA9IHN5bWJvbERhdGEuZ2V0VHlwZVNwZWNpZmllcigpOworCQkJCQkJCX0KKwkJCQkJCQllbHNlCisJCQkJCQkJeworCQkJCQkJCQlnZXRDb21waWxlclRhYmxlKCkuaW5jckVycm9yQ291bnQoKTsKKwkJCQkJCQkJQVZNX09TX1dBUk4gPDwgIlVuZm91bmQgc3RydWN0dXJlIGF0dHJpYnV0ZSA8ICIKKwkJCQkJCQkJCQk8PCAoKml0KS5zdHIoKSA8PCAiID4gb2YgdGhlIFVGSSA8ICIKKwkJCQkJCQkJCQk8PCB0aGVVRkkuc3RyKCkgPDwgIiA+IiA8PCBzdGQ6OmVuZGw7CisKKwkJCQkJCQkJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JFcnJvckNvdW50KCk7CisJCQkJCQkJQVZNX09TX1dBUk4gPDwgIlVuZXhwZWN0ZWQgc3RydWN0dXJlIGF0dHJpYnV0ZSBraW5kIDwgIgorCQkJCQkJCQkJPDwgKCppdCkuc3RyKCkgPDwgIiA+IG9mIHRoZSBVRkkgPCAiCisJCQkJCQkJCQk8PCB0aGVVRkkuc3RyKCkgPDwgIiA+IiA8PCBzdGQ6OmVuZGw7CisKKwkJCQkJCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworLy8JCQkJCWVsc2UKKy8vCQkJCQl7CisvLwkJCQkJCWdldENvbXBpbGVyVGFibGUoKS5pbmNyRXJyb3JDb3VudCgpOworLy8JCQkJCQlBVk1fT1NfV0FSTiA8PCAiVW5leHBlY3RlZCB0eXBlIDwgIgorLy8JCQkJCQkJCTw8IGFUeXBlU3BlY2lmaWVyLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisvLwkJCQkJCQkJPDwgIiA+IGZvciB0aGUgZWxlbWVudCA8ICIgPDwgKCppdCkuc3RyKCkKKy8vCQkJCQkJCQk8PCAiID4gb2YgdGhlIGluc3RhbmNlIG9mIGRhdGEgPCAiIDw8IHRoZVVGSS5zdHIoKQorLy8JCQkJCQkJCTw8ICIgPiIgPDwgc3RkOjplbmRsOworLy8JCQkJCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworLy8JCQkJCX0KKwkJCQl9CisKKwkJCQlJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfREFUQV9OQVRVUkUgYVBvaW50ZXJOYXR1cmUgPQorCQkJCQkJSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX1VOREVGSU5FRF9OQVRVUkU7CisJCQkJaWYoIGlzQXJyYXlJbmRleCApCisJCQkJeworCQkJCQlhUG9pbnRlck5hdHVyZSA9IElQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9VRklfTUlYRURfTkFUVVJFOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlhUG9pbnRlck5hdHVyZSA9IElQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9VRklfT0ZGU0VUX05BVFVSRTsKKwkJCQl9CisKKworCQkJCWlmKCBhUmVsYXRpdmVEYXRhUGF0aC5ub25lbXB0eSgpICkKKwkJCQl7CisJCQkJCWFSZWxhdGl2ZURhdGFQYXRoLnBvcF9sYXN0X3RvKCBzeW1ib2xEYXRhICk7CisKKwkJCQkJc3ltYm9sRGF0YSA9IG5ldyBJbnN0YW5jZU9mRGF0YShhUG9pbnRlck5hdHVyZSwKKwkJCQkJCQlwdHJJbnN0YW5jZS0+Z2V0Q29udGFpbmVyKCksIHB0ckluc3RhbmNlLAorCQkJCQkJCWFSZWxhdGl2ZURhdGFQYXRoLCBzeW1ib2xEYXRhKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJVmVjdG9yT2ZJbnN0YW5jZU9mTWFjaGluZSBhUmVsYXRpdmVNYWNoaW5lUGF0aDsKKworCQkJCQlzeW1ib2xEYXRhID0gbmV3IEluc3RhbmNlT2ZEYXRhKHB0ckluc3RhbmNlLT5nZXRDb250YWluZXIoKSwKKwkJCQkJCQlzeW1ib2xEYXRhLnJhd0RhdGEoKSwgYVJlbGF0aXZlTWFjaGluZVBhdGgpOworCQkJCX0KKworCQkJCXN5bWJvbERhdGEudXBkYXRlRnVsbHlRdWFsaWZpZWROYW1lSUQoIG9zc1VGSS5zdHIoKSAsIG9zc0lELnN0cigpICk7CisKKy8vCQkJCWlmKCBpc05vdEFycmF5ICkKKwkJCQl7CisJCQkJCWFDVFgtPm1Db21waWxlQ3R4LT5nZXRFeGVjdXRhYmxlKCktPgorCQkJCQkJCWFwcGVuZERhdGFBbGlhcyggc3ltYm9sRGF0YSApOworLy8JCQkJCXB0ckluc3RhbmNlLT5nZXRDb250YWluZXIoKS0+YXBwZW5kRGF0YUFsaWFzKCBzeW1ib2xEYXRhICk7CisJCQkJfQorCisJCQkJaWYoIGl0ID09IGl0RW5kICkKKwkJCQl7CisJCQkJCXJldHVybiggc3ltYm9sRGF0YSApOworCQkJCX0KKworCQkJCWVsc2UgaWYoICgqaXQpLmlzRmllbGRJbnZva2FibGUoKSApCisJCQkJeworCQkJCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoICgqaXQpLmlzSWRlbnRpZmllcigpICkKKwkJCQkJCQk8PCAiVW5leHBlY3RlZCBhIG5vbi1JZGVudGlmaWVyIDw8ICIKKwkJCQkJCQk8PCAoKml0KS5zdHIoKSA8PCAiID4+IGFzIEludm9jYWJsZSAhISEiCisJCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJCU9wZXJhdG9yICogb3AgPSBBdm1PcGVyYXRpb25GYWN0b3J5OjpnZXQoCisJCQkJCQkJc3ltYm9sRGF0YSwgKCppdCkudG9JZGVudGlmaWVyKCkpOworCQkJCQlpZiggb3AgIT0gTlVMTCApCisJCQkJCXsKKwkJCQkJCUJGQ29kZSBuZXdDb2RlKG9wLCBzeW1ib2xEYXRhKTsKKwkJCQkJCUJGIGFyZzsKKwkJCQkJCWZvciggKytpdCA7IGl0ICE9IGl0RW5kIDsgKytpdCApCisJCQkJCQl7CisJCQkJCQkJaWYoICgqaXQpLmlzRmllbGRQYXJhbWV0ZXIoKSApCisJCQkJCQkJeworCQkJCQkJCQlhcmcgPSBjb21waWxlQXJnUnZhbHVlKGFDVFgsICppdCk7CisKKwkJCQkJCQkJaWYoIGFyZy52YWxpZCgpICkKKwkJCQkJCQkJeworCQkJCQkJCQkJbmV3Q29kZS0+YXBwZW5kKCBhcmcgKTsKKwkJCQkJCQkJfQorCQkJCQkJCQllbHNlCisJCQkJCQkJCXsKKwkJCQkJCQkJCWdldENvbXBpbGVyVGFibGUoKS5pbmNyRXJyb3JDb3VudCgpOworCQkJCQkJCQkJYUNUWC0+ZXJyb3JDb250ZXh0KCBBVk1fT1NfV0FSTiApCisJCQkJCQkJCQkJCTw8ICJBdm1Db2RlPCBzdGF0ZW1lbnQgPiAiCisJCQkJCQkJCQkJCQkiY29tcGlsYXRpb24gZXJyb3IgPDwgIgorCQkJCQkJCQkJCQk8PCAoKml0KS5zdHIoKSA8PCAiID4+IgorCQkJCQkJCQkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCisJCQkJCQkJCQluZXdDb2RlLT5hcHBlbmQoICppdCApOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWlmKCBpdCA9PSBpdEVuZCApCisJCQkJCQl7CisJCQkJCQkJcmV0dXJuKCBuZXdDb2RlICk7CisJCQkJCQl9CisKKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlnZXRDb21waWxlclRhYmxlKCkuaW5jckVycm9yQ291bnQoKTsKKwkJCQkJCQlhQ1RYLT5lcnJvckNvbnRleHQoIEFWTV9PU19XQVJOICkKKwkJCQkJCQkJCTw8ICJBdm1Db2RlPCBzdGF0ZW1lbnQgPiAiCisJCQkJCQkJCQkJCSJjb21waWxhdGlvbiBlcnJvciA8PCAoOiAiCisJCQkJCQkJCQk8PCBzeW1ib2xEYXRhLnN0cigpIDw8ICIgIgorCQkJCQkJCQkJPDwgKCppdCkuc3RyKCkgPDwgIiAuLi4pID4+IGZvciAiCisJCQkJCQkJCQk8PCB0aGVVRkkuc3RyKCkKKwkJCQkJCQkJCTw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisKKwkJCQkJCQlyZXR1cm4oIHN5bWJvbERhdGEgKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCWdldENvbXBpbGVyVGFibGUoKS5pbmNyRXJyb3JDb3VudCgpOworCQkJCQkJYUNUWC0+ZXJyb3JDb250ZXh0KCBBVk1fT1NfV0FSTiApCisJCQkJCQkJCTw8ICJBdm1Db2RlPCBzdGF0ZW1lbnQgPiAiCisJCQkJCQkJCQkiY29tcGlsYXRpb24gZXJyb3IgPDwgKDogIgorCQkJCQkJCQk8PCBzeW1ib2xEYXRhLnN0cigpIDw8ICIgIgorCQkJCQkJCQk8PCAoKml0KS5zdHIoKSA8PCAiIC4uLikgPj4gZm9yICIKKwkJCQkJCQkJPDwgdGhlVUZJLnN0cigpCisJCQkJCQkJCTw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisKKwkJCQkJCXJldHVybiggc3ltYm9sRGF0YSApOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWdldENvbXBpbGVyVGFibGUoKS5pbmNyRXJyb3JDb3VudCgpOworCQkJCQlhQ1RYLT5lcnJvckNvbnRleHQoIEFWTV9PU19XQVJOICkKKwkJCQkJCQk8PCAiVUZJIGNvbXBpbGF0aW9uIGVycm9yIDw8ICIKKwkJCQkJCQk8PCBzeW1ib2xEYXRhLnN0cigpIDw8ICIgPj4gZm9yICIKKwkJCQkJCQk8PCB0aGVVRkkuc3RyKCkKKwkJCQkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCisJCQkJCXJldHVybiggc3ltYm9sRGF0YSApOworCQkJCX0KKwkJCX0KKworCQkJZWxzZSBpZiggYVR5cGVTcGVjaWZpZXItPmlzVHlwZWRMYW1iZGEoKSAvKiYmICgqKGl0LTEpKS5pc0ZpZWxkSW52b2thYmxlKCkqLyApCisJCQl7CisJCQkJQkZDb2RlIGludm9rZUNvZGUoT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9JTlZPS0VfTEFNQkRBX0FQUExZLAorCQkJCQkJc3ltYm9sRGF0YSk7CisvLwkJCQkJKHRoZUluc3RhbmNlRGF0YS0+Z2V0TW9kaWZpZXIoKS5oYXNGZWF0dXJlRmluYWwoKSAmJiB0aGVJbnN0YW5jZURhdGEtPmhhc1ZhbHVlKCkpID8KKy8vCQkJCQkJCXRoZUluc3RhbmNlRGF0YS0+Z2V0VmFsdWUoKSA6IHRoZUluc3RhbmNlRGF0YSk7CisKKwkJCQlCRiBwYXJhbTsKKwkJCQlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwkJCQl7CisJCQkJCXBhcmFtID0gY29tcGlsZUFyZ1J2YWx1ZShhQ1RYLCAoKml0KSk7CisKKwkJCQkJaWYoIHBhcmFtLmludmFsaWQoKSApCisJCQkJCXsKKwkJCQkJCWdldENvbXBpbGVyVGFibGUoKS5pbmNyRXJyb3JDb3VudCgpOworCQkJCQkJQVZNX09TX1dBUk4gPDwgIkNvbXBpbGF0aW9uIEVycm9yIG9mIHRoZSBwYXJhbWV0ZXIgPCAiCisJCQkJCQkJCTw8ICgqaXQpLnN0cigpIDw8ICIgPiBvZiB0aGUgaW52b2thYmxlIDwgIgorCQkJCQkJCQk8PCBwdHJJbnN0YW5jZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiID4gaW4gdGhlIFVGSSA8ICIKKwkJCQkJCQkJPDwgdGhlVUZJLnN0cigpIDw8ICIgPiIgPDwgc3RkOjplbmRsOworCisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCisJCQkJCWludm9rZUNvZGUtPmFwcGVuZCggcGFyYW0gKTsKKwkJCQl9CisKKwkJCQlyZXR1cm4oIGludm9rZUNvZGUgKTsKKwkJCX0KKworCQkJZWxzZSBpZiggYVR5cGVTcGVjaWZpZXItPmlzVHlwZWRNYWNoaW5lKCkgKQorCQkJeworCisJCQl9CisKKwkJCWVsc2UKKwkJCXsKKwkJCQlnZXRDb21waWxlclRhYmxlKCkuaW5jckVycm9yQ291bnQoKTsKKwkJCQlBVk1fT1NfV0FSTiA8PCAiVW5leHBlY3RlZCB0eXBlIDwgIiA8PCBhVHlwZVNwZWNpZmllci0+c3RyKCkKKwkJCQkJCTw8ICIgPiBmb3IgaW5zdGFuY2Ugb2YgZGF0YSA8ICIgPDwgcHRySW5zdGFuY2UtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKwkJCQkJCTw8ICIgPiBpbnQgdGhlIFVGSSA8ICIgPDwgdGhlVUZJLnN0cigpIDw8ICIgPiIKKwkJCQkJCTw8IHN0ZDo6ZW5kbDsKKworCQkJCXJldHVybiggQkY6OlJFRl9OVUxMICk7CisJCQl9CisJCX0KKworCQkvLyBDQVNFIEZJUlNUIElOU1RBTkNFIGlzIGEgUE9SVAorCQllbHNlIGlmKCBiZkluc3RhbmNlLmlzPCBJbnN0YW5jZU9mUG9ydCA+KCkgKQorCQl7CisJCQlnZXRDb21waWxlclRhYmxlKCkuaW5jckVycm9yQ291bnQoKTsKKwkJCUFWTV9PU19XQVJOIDw8ICJVbmV4cGVjdGVkIGEgcG9ydCBpbnN0YW5jZSA8ICIKKwkJCQkJPDwgYmZJbnN0YW5jZS50b19wdHI8IEluc3RhbmNlT2ZQb3J0ID4oKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJCQk8PCAiID4gaW50IHRoZSBVRkkgPCAiIDw8IHRoZVVGSS5zdHIoKSA8PCAiID4iIDw8IHN0ZDo6ZW5kbDsKKworCQkJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKKwkJfQorCisJCWVsc2UKKwkJeworCQkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JFcnJvckNvdW50KCk7CisJCQlBVk1fT1NfV0FSTiA8PCAiVW5leHBlY3RlZCBhIGJhc2UgaW5zdGFuY2UgPCAiCisJCQkJCTw8IGJmSW5zdGFuY2UudG9fcHRyPCBCYXNlSW5zdGFuY2VGb3JtID4oKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJCQk8PCAiID4gaW50IHRoZSBVRkkgPCAiIDw8IHRoZVVGSS5zdHIoKSA8PCAiID4iIDw8IHN0ZDo6ZW5kbDsKKworCQkJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKKwkJfQorCX0KKworCWVsc2UKKwl7CisJCWNvbnN0IEJGICYgdG1wVHJhbnNpdGlvbiA9CisJCQkJZ2V0U3ltYm9sVGFibGUoKS5zZWFyY2hUcmFuc2l0aW9uKGFDVFgsIFRoZU1haW5PYmplY3RFbGVtZW50KTsKKwkJaWYoIHRtcFRyYW5zaXRpb24udmFsaWQoKSAmJiAoaXQgPT0gaXRFbmQpICkKKwkJeworCQkJcmV0dXJuKCB0bXBUcmFuc2l0aW9uICk7CisJCX0KKworCQljb25zdCBCRiAmIHRtcFByb2dyYW0gPQorCQkJCWdldFN5bWJvbFRhYmxlKCkuc2VhcmNoUHJvZ3JhbShhQ1RYLCBUaGVNYWluT2JqZWN0RWxlbWVudCk7CisJCWlmKCB0bXBQcm9ncmFtLnZhbGlkKCkgJiYgKGl0ID09IGl0RW5kKSApCisJCXsKKwkJCXJldHVybiggdG1wUHJvZ3JhbSApOworCQl9CisKKworCQljb25zdCBCRiAmIGFUeXBlID0gU3ltYm9sVGFibGU6OnNlYXJjaFR5cGVTcGVjaWZpZXIoCisJCQkJQVZNQ09ERV9DT01QSUxFUi5nZXRDb25maWd1cmF0aW9uKCkuZ2V0RXhlY3V0YWJsZVN5c3RlbSgpLAorCQkJCWFDVFgsIFRoZU1haW5PYmplY3RFbGVtZW50KTsKKwkJaWYoIGFUeXBlLnZhbGlkKCkgKQorCQl7CisJCQlpZiggaXQgPT0gaXRFbmQgKQorCQkJeworCQkJCXJldHVybiggYVR5cGUgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlFbnVtVHlwZVNwZWNpZmllciAqIGFuRW51bVRTOworCisJCQkJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApCisJCQkJeworCQkJCQlpZiggYVR5cGUuaXM8IEVudW1UeXBlU3BlY2lmaWVyID4oKSApCisJCQkJCXsKKwkJCQkJCWFuRW51bVRTID0gYVR5cGUudG9fcHRyPCBFbnVtVHlwZVNwZWNpZmllciA+KCk7CisKKwkJCQkJCWlmKCAoKml0KS5pc0lkZW50aWZpZXIoKSApCisJCQkJCQl7CisJCQkJCQkJb3NzVUZJLnN0cigiIik7CisJCQkJCQkJb3NzVUZJIDw8IGFuRW51bVRTLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8ICcuJyA8PCAoKml0KS5zdHIoKTsKKworCQkJCQkJCWJmSW5zdGFuY2UgPSBhbkVudW1UUy0+Z2V0U3ltYm9sRGF0YShvc3NVRkkuc3RyKCkpOworCisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiggYmZJbnN0YW5jZS52YWxpZCgpICYmIChpdCA9PSBpdEVuZCkgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCBiZkluc3RhbmNlICk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJZ2V0Q29tcGlsZXJUYWJsZSgpLmluY3JFcnJvckNvdW50KCk7CisJCUFWTV9PU19XQVJOIDw8ICJVbmZvdW5kIGEgcnVudGltZSBzeW1ib2wgZm9yIHRoZSBmb3JtIDwgIgorCQkJCTw8IFRoZU1haW5PYmplY3RFbGVtZW50LT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQkJPDwgIiA+IGluIHRoZSBVRkkgPCAiIDw8IHRoZVVGSS5zdHIoKSA8PCAiID4iCisJCQkJPDwgc3RkOjplbmRsOworCisJCXJldHVybiggQkY6OlJFRl9OVUxMICk7CisJfQorCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKK30KKworCisKKworCitCRiBBdm1jb2RlVWZpRXhwcmVzc2lvbkNvbXBpbGVyOjpjb21waWxlRXhwcmVzc2lvbigKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJVW5pRm9ybUlkZW50aWZpZXIgKiBydW50aW1lVUZJID0gbmV3IFVuaUZvcm1JZGVudGlmaWVyKGZhbHNlKTsKKwlCRiBiZlJ1bnRpbWVVRkkoIHJ1bnRpbWVVRkkgKTsKKworCUJGIGFyZzsKKworCUNPTVBJTEVfQ09OVEVYVCAqIGNvbnRhaW5lckNUWCA9IGFDVFgtPmNsb25lKCk7CisKKwlBdm1Db2RlOjppdGVyYXRvciBpdEFyZyA9IGFDb2RlLT5iZWdpbigpOworCUF2bUNvZGU6Oml0ZXJhdG9yIGl0RW5kQXJnID0gYUNvZGUtPmVuZCgpOworCisJZm9yKCA7IGl0QXJnICE9IGl0RW5kQXJnIDsgKytpdEFyZyApCisJeworCQlhcmcgPSBjb21waWxlQXJnUnZhbHVlKGNvbnRhaW5lckNUWCwgKml0QXJnKTsKKworCQlpZiggYXJnLmludmFsaWQoKSApCisJCXsKKwkJCWdldENvbXBpbGVyVGFibGUoKS5pbmNyRXJyb3JDb3VudCgpOworCQkJQVZNX09TX1dBUk4gPDwgIkNvbXBpbGF0aW9uIEVycm9yIG9mICA8ICIgPDwgKCppdEFyZykuc3RyKCkKKwkJCQkJPDwgIiA+IGluIHRoZSBVRkkgPCAiIDw8IGFDb2RlLT5zdHIoKSA8PCAiID4iIDw8IHN0ZDo6ZW5kbDsKKworCQkJY29udGludWU7CisJCX0KKworCQlydW50aW1lVUZJLT5hcHBlbmRVbmRlZihhcmcpOworCisJCWNvbnRhaW5lckNUWC0+bUNvbXBpbGVDdHggPSBhQ1RYLT5tQ29tcGlsZUN0eDsKKworCQlpZiggRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc0N0b3IoYXJnKSAmJiAoaXRBcmcgIT0gaXRFbmRBcmcpICkKKwkJeworCQkJY29uc3QgQkYgJiBhQ2FzdFR5cGUgPSBhcmcudG9fcHRyPCBBdm1Db2RlID4oKS0+Zmlyc3QoKTsKKwkJCWlmKCBhQ2FzdFR5cGUuaXM8IEJhc2VBdm1Qcm9ncmFtID4oKSApCisJCQl7CisJCQkJY29udGFpbmVyQ1RYLT5tQ29tcGlsZUN0eCA9IGFDYXN0VHlwZS50b19wdHI8IEJhc2VBdm1Qcm9ncmFtID4oKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiggYmZSdW50aW1lVUZJICk7CisKK30KKworQkZDb2RlIEF2bWNvZGVVZmlFeHByZXNzaW9uQ29tcGlsZXI6OmNvbXBpbGVTdGF0ZW1lbnQoCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQk8PCAiVW5leHBlY3RlZCBVRkkgRVhQUkVTU0lPTiBhcyBzdGF0ZW1lbnQgISEhIgorCQkJPDwgU0VORF9FWElUOworCisJcmV0dXJuKCBhQ29kZSApOworfQorCisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZVVmaUNhc3RFeHByZXNzaW9uQ29tcGlsZXIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVVZmlDYXN0RXhwcmVzc2lvbkNvbXBpbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE3Y2I4OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVVZmlDYXN0RXhwcmVzc2lvbkNvbXBpbGVyLmgKQEAgLTAsMCArMSw0MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDQgbWFpIDIwMTEKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBBVk1DT0RFVUZJQ0FTVEVYUFJFU1NJT05DT01QSUxFUl9IXworI2RlZmluZSBBVk1DT0RFVUZJQ0FTVEVYUFJFU1NJT05DT01QSUxFUl9IXworCisjaW5jbHVkZSA8YnVpbGRlci9wcmltaXRpdmUvQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXIuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworY2xhc3MgQ29tcGlsYXRpb25FbnZpcm9ubWVudDsKK2NsYXNzIFVuaUZvcm1JZGVudGlmaWVyOworCisKK0FWTUNPREVfQ09NUElMRVJfQ0xBU1NfSEVBREVSKFVmaUV4cHJlc3Npb24sIEFic3RyYWN0QXZtY29kZUNvbXBpbGVyKQorcHVibGljOgorCUJGIGNvbXBpbGVVZmlFeHByZXNzaW9uKENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsCisJCQljb25zdCBVbmlGb3JtSWRlbnRpZmllciAmIHRoZVVGSSk7Cit9OworCisKKworfQorCisjZW5kaWYgLyogQVZNQ09ERVVGSUNBU1RFWFBSRVNTSU9OQ09NUElMRVJfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVWYXJpYWJsZVN0YXR1c0NvbXBpbGVyLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0F2bWNvZGVWYXJpYWJsZVN0YXR1c0NvbXBpbGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2ZkMDEwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZVZhcmlhYmxlU3RhdHVzQ29tcGlsZXIuY3BwCkBAIC0wLDAgKzEsMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxIG1haSAyMDExCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJBdm1jb2RlVmFyaWFibGVTdGF0dXNDb21waWxlci5oIgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQXZtQ29kZS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQVZNQ09ERSBWQVJJQUJMRSBTVEFUVVMgRVhQUkVTU0lPTiBDT01QSUxBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkYgQXZtY29kZVZhcmlhYmxlU3RhdHVzRXhwcmVzc2lvbkNvbXBpbGVyOjpjb21waWxlRXhwcmVzc2lvbigKKwkJQ09NUElMRV9DT05URVhUICogYUNUWCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJcmV0dXJuKCBBYnN0cmFjdEF2bWNvZGVDb21waWxlcjo6Y29tcGlsZVN0YXRlbWVudChhQ1RYLCBhQ29kZSkgKTsKK30KKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Bdm1jb2RlVmFyaWFibGVTdGF0dXNDb21waWxlci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZVZhcmlhYmxlU3RhdHVzQ29tcGlsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTEzNzc0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQXZtY29kZVZhcmlhYmxlU3RhdHVzQ29tcGlsZXIuaApAQCAtMCwwICsxLDMyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMSBtYWkgMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEFWTUNPREVWQVJJQUJMRVNUQVRVU0NPTVBJTEVSX0hfCisjZGVmaW5lIEFWTUNPREVWQVJJQUJMRVNUQVRVU0NPTVBJTEVSX0hfCisKKyNpbmNsdWRlIDxidWlsZGVyL3ByaW1pdGl2ZS9BYnN0cmFjdEF2bWNvZGVDb21waWxlci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitBVk1DT0RFX0NPTVBJTEVSX0VYUFJFU1NJT05fQ0xBU1MoIlZBUklBQkxFIFNUQVRVUyIsIFZhcmlhYmxlU3RhdHVzRXhwcmVzc2lvbiwgQWJzdHJhY3RBdm1jb2RlQ29tcGlsZXIpCisKKworCit9CisKKyNlbmRpZiAvKiBBVk1DT0RFVkFSSUFCTEVTVEFUVVNDT01QSUxFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQ29tcGlsYXRpb25FbnZpcm9ubWVudC5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9idWlsZGVyL3ByaW1pdGl2ZS9Db21waWxhdGlvbkVudmlyb25tZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2ZjYTE2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQ29tcGlsYXRpb25FbnZpcm9ubWVudC5jcHAKQEAgLTAsMCArMSwzMTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULg0KKyAqDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENyZWF0ZWQgb246IDE0IGbDqXZyLiAyMDEzDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnINCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSAiQ29tcGlsYXRpb25FbnZpcm9ubWVudC5oIg0KKw0KKw0KK25hbWVzcGFjZSBzZXANCit7DQorDQorDQorLyoqDQorICogU1RBVElDDQorICogQVRUUklCVVRFUw0KKyAqLw0KK2Jvb2wgQ09NUElMRV9DT05URVhUOjpERUZBVUxfVFlQRV9DSEVDS0lOR19NQVNLID0gdHJ1ZTsNCisNCitib29sIENPTVBJTEVfQ09OVEVYVDo6SU5MSU5FX0RJU0FCTEVfTUFTSyA9IGZhbHNlOw0KKw0KK2Jvb2wgQ09NUElMRV9DT05URVhUOjpJTkxJTkVfRU5BQkxFX01BU0sgPSBmYWxzZTsNCisNCitib29sIENPTVBJTEVfQ09OVEVYVDo6SU5MSU5FX1BST0NFRFVSRV9NQVNLID0gdHJ1ZTsNCisNCisNCisNCisvKioNCisgKiByZXBvcnQgZGVidWcgQ29udGV4dA0KKyAqLw0KK091dFN0cmVhbSAmIENPTVBJTEVfQ09OVEVYVDo6ZGVidWdDb250ZXh0KE91dFN0cmVhbSAmIG9zKQ0KK3sNCisJb3MgPDwgVEFCIDw8ICJDb250ZXh0Oj4gIg0KKwkJCTw8IG1Db21waWxlQ3R4LT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbDsNCisNCisJaWYoIGlzU3BlY2lmaWNSdW50aW1lQ3R4KCkgKQ0KKwl7DQorCQlvcyA8PCBUQUIgPDwgIlJ1bnRpbWU6PiAiDQorCQkJCTw8IG1SdW50aW1lQ3R4LT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbDsNCisJfQ0KKw0KKwlpZiggbVZhcmlhYmxlQ3R4ICE9IE5VTEwgKQ0KKwl7DQorCQlvcyA8PCBUQUIgPDwgIkRhdGFWYXI6PiAiDQorCQkJCTw8IG1WYXJpYWJsZUN0eC0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCBzdGQ6OmVuZGw7DQorCX0NCisNCisJcmV0dXJuKCBvcyApOw0KK30NCisNCisNCisvKioNCisgKiByZXBvcnQgZXJyb3IgQ29udGV4dCAmIExvY2F0aW9uDQorICovDQorT3V0U3RyZWFtICYgQ09NUElMRV9DT05URVhUOjplcnJvckNvbnRleHQoT3V0U3RyZWFtICYgb3MpDQorew0KK0FWTV9JRl9ERUJVR19GTEFHKCBDT01QSUxJTkcgKQ0KKwlvcyA8PCAiY3R4Oj4gIiA8PCBtQ29tcGlsZUN0eC0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCBzdGQ6OmVuZGw7DQorQVZNX0VORElGX0RFQlVHX0ZMQUcoIENPTVBJTElORyApDQorDQorCUJhc2VBdm1Qcm9ncmFtICogZXJyb3JDdHggPQ0KKwkJCSggbUNvbXBpbGVDdHggPT0gbVJ1bnRpbWVDdHggKT8gbUNvbXBpbGVDdHggOiBtUnVudGltZUN0eDsNCisJZXJyb3JDdHgtPmdldEFzdEVsZW1lbnQoKS0+ZXJyb3JMb2NhdGlvbihvcywNCisJCQllcnJvckN0eC0+aGFzQ29udGFpbmVyKCkgPw0KKwkJCQkJZXJyb3JDdHgtPmdldENvbnRhaW5lcigpLT5nZXRBc3RFbGVtZW50KCkgOiBOVUxMKTsNCisNCisJcmV0dXJuKCBvcyApOw0KK30NCisNCitQYWlyT3V0U3RyZWFtICYgQ09NUElMRV9DT05URVhUOjplcnJvckNvbnRleHQoUGFpck91dFN0cmVhbSAmIG9zKQ0KK3sNCitBVk1fSUZfREVCVUdfRkxBRyggQ09NUElMSU5HICkNCisJb3MgPDwgImN0eDo+ICIgPDwgbUNvbXBpbGVDdHgtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgc3RkOjplbmRsOw0KK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBDT01QSUxJTkcgKQ0KKw0KKwlCYXNlQXZtUHJvZ3JhbSAqIGVycm9yQ3R4ID0NCisJCQkoIG1Db21waWxlQ3R4ID09IG1SdW50aW1lQ3R4ICk/IG1Db21waWxlQ3R4IDogbVJ1bnRpbWVDdHg7DQorCWVycm9yQ3R4LT5nZXRBc3RFbGVtZW50KCktPmVycm9yTG9jYXRpb24ob3MsDQorCQkJZXJyb3JDdHgtPmhhc0NvbnRhaW5lcigpID8NCisJCQkJCWVycm9yQ3R4LT5nZXRDb250YWluZXIoKS0+Z2V0QXN0RWxlbWVudCgpIDogTlVMTCk7DQorDQorCXJldHVybiggb3MgKTsNCit9DQorDQorVHJpcGxlT3V0U3RyZWFtICYgQ09NUElMRV9DT05URVhUOjplcnJvckNvbnRleHQoVHJpcGxlT3V0U3RyZWFtICYgb3MpDQorew0KK0FWTV9JRl9ERUJVR19GTEFHKCBDT01QSUxJTkcgKQ0KKwlvcyA8PCAiY3R4Oj4gIiA8PCBtQ29tcGlsZUN0eC0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCBzdGQ6OmVuZGw7DQorQVZNX0VORElGX0RFQlVHX0ZMQUcoIENPTVBJTElORyApDQorDQorCUJhc2VBdm1Qcm9ncmFtICogZXJyb3JDdHggPQ0KKwkJCSggbUNvbXBpbGVDdHggPT0gbVJ1bnRpbWVDdHggKT8gbUNvbXBpbGVDdHggOiBtUnVudGltZUN0eDsNCisJZXJyb3JDdHgtPmdldEFzdEVsZW1lbnQoKS0+ZXJyb3JMb2NhdGlvbihvcywNCisJCQllcnJvckN0eC0+aGFzQ29udGFpbmVyKCkgPw0KKwkJCQkJZXJyb3JDdHgtPmdldENvbnRhaW5lcigpLT5nZXRBc3RFbGVtZW50KCkgOiBOVUxMKTsNCisNCisJcmV0dXJuKCBvcyApOw0KK30NCisNCisNCisvKioNCisgKiByZXBvcnQgd2FybmluZyBDb250ZXh0ICYgTG9jYXRpb24NCisgKi8NCitPdXRTdHJlYW0gJiBDT01QSUxFX0NPTlRFWFQ6Ondhcm5pbmdDb250ZXh0KE91dFN0cmVhbSAmIG9zKQ0KK3sNCitBVk1fSUZfREVCVUdfRkxBRyggQ09NUElMSU5HICkNCisJb3MgPDwgImN0eDo+ICIgPDwgbUNvbXBpbGVDdHgtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgc3RkOjplbmRsOw0KK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBDT01QSUxJTkcgKQ0KKw0KKwlCYXNlQXZtUHJvZ3JhbSAqIHdhcm5pbmdDdHggPQ0KKwkJCSggbUNvbXBpbGVDdHggPT0gbVJ1bnRpbWVDdHggKT8gbUNvbXBpbGVDdHggOiBtUnVudGltZUN0eDsNCisJd2FybmluZ0N0eC0+Z2V0QXN0RWxlbWVudCgpLT53YXJuaW5nTG9jYXRpb24ob3MsDQorCQkJd2FybmluZ0N0eC0+aGFzQ29udGFpbmVyKCkgPw0KKwkJCQkJd2FybmluZ0N0eC0+Z2V0Q29udGFpbmVyKCktPmdldEFzdEVsZW1lbnQoKSA6IE5VTEwpOw0KKw0KKwlyZXR1cm4oIG9zICk7DQorfQ0KKw0KK1BhaXJPdXRTdHJlYW0gJiBDT01QSUxFX0NPTlRFWFQ6Ondhcm5pbmdDb250ZXh0KFBhaXJPdXRTdHJlYW0gJiBvcykNCit7DQorQVZNX0lGX0RFQlVHX0ZMQUcoIENPTVBJTElORyApDQorCW9zIDw8ICJjdHg6PiAiIDw8IG1Db21waWxlQ3R4LT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbDsNCitBVk1fRU5ESUZfREVCVUdfRkxBRyggQ09NUElMSU5HICkNCisNCisJQmFzZUF2bVByb2dyYW0gKiB3YXJuaW5nQ3R4ID0NCisJCQkoIG1Db21waWxlQ3R4ID09IG1SdW50aW1lQ3R4ICk/IG1Db21waWxlQ3R4IDogbVJ1bnRpbWVDdHg7DQorCXdhcm5pbmdDdHgtPmdldEFzdEVsZW1lbnQoKS0+d2FybmluZ0xvY2F0aW9uKG9zLA0KKwkJCXdhcm5pbmdDdHgtPmhhc0NvbnRhaW5lcigpID8NCisJCQkJCXdhcm5pbmdDdHgtPmdldENvbnRhaW5lcigpLT5nZXRBc3RFbGVtZW50KCkgOiBOVUxMKTsNCisNCisJcmV0dXJuKCBvcyApOw0KK30NCisNCitUcmlwbGVPdXRTdHJlYW0gJiBDT01QSUxFX0NPTlRFWFQ6Ondhcm5pbmdDb250ZXh0KFRyaXBsZU91dFN0cmVhbSAmIG9zKQ0KK3sNCitBVk1fSUZfREVCVUdfRkxBRyggQ09NUElMSU5HICkNCisJb3MgPDwgImN0eDo+ICIgPDwgbUNvbXBpbGVDdHgtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgc3RkOjplbmRsOw0KK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBDT01QSUxJTkcgKQ0KKw0KKwlCYXNlQXZtUHJvZ3JhbSAqIHdhcm5pbmdDdHggPQ0KKwkJCSggbUNvbXBpbGVDdHggPT0gbVJ1bnRpbWVDdHggKT8gbUNvbXBpbGVDdHggOiBtUnVudGltZUN0eDsNCisJd2FybmluZ0N0eC0+Z2V0QXN0RWxlbWVudCgpLT53YXJuaW5nTG9jYXRpb24ob3MsDQorCQkJd2FybmluZ0N0eC0+aGFzQ29udGFpbmVyKCkgPw0KKwkJCQkJd2FybmluZ0N0eC0+Z2V0Q29udGFpbmVyKCktPmdldEFzdEVsZW1lbnQoKSA6IE5VTEwpOw0KKw0KKwlyZXR1cm4oIG9zICk7DQorfQ0KKw0KKw0KKy8qKg0KKyAqIFNlcmlhbGl6YXRpb24NCisgKi8NCit2b2lkIENPTVBJTEVfQ09OVEVYVDo6c3RySGVhZGVyKE91dFN0cmVhbSAmIG9zKSBjb25zdA0KK3sNCisJb3MgPDwgVEFCIDw8ICggaGFzTW9kaWZpZXIoKSA/IGdldE1vZGlmaWVyKCkudG9TdHJpbmcoKSA6ICIiICkNCisJCQk8PCAiQ09NUElMRVI8IGN0eDogIiA8PCBtQ29tcGlsZUN0eC0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsNCisJaWYoIG1Db21waWxlQ3R4ICE9IG1SdW50aW1lQ3R4ICkNCisJew0KKwkJb3MgPDwgIiAsIHJ1bjogIiA8PCBtUnVudGltZUN0eC0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsNCisJfQ0KKwlpZiggKG1UeXBlICE9IE5VTEwpICYmIChtVHlwZSAhPSBUeXBlTWFuYWdlcjo6VU5JVkVSU0FMKSApDQorCXsNCisJCW9zIDw8ICIgLCB0eXBlICIgPDwgKCBtTmVlZFR5cGVDaGVja2luZyA/ICI/OiIgOiAiOiIgKQ0KKwkJCQk8PCBzdHJfaGVhZGVyKCBtVHlwZSApOw0KKwl9DQorCW9zIDw8ICIgPiI7DQorfQ0KKw0KKw0KK3ZvaWQgQ09NUElMRV9DT05URVhUOjp0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QNCit7DQorCW9zIDw8IFRBQiA8PCAoIGhhc01vZGlmaWVyKCkgPyBnZXRNb2RpZmllcigpLnRvU3RyaW5nKCkgOiAiIiApDQorCQkJPDwgImNvbXBpbGVyIHsiIDw8IEVPTA0KKwkJCTw8IFRBQjIgPDwgImNvbnRleHQgPSAiIDw8IHN0cl9oZWFkZXIoIG1Db21waWxlQ3R4ICkgPDwgRU9MDQorCQkJPDwgVEFCMiA8PCAicnVudGltZSA9ICIgPDwgc3RyX2hlYWRlciggbVJ1bnRpbWVDdHggKSA8PCBFT0w7DQorDQorCWlmKCBtVHlwZSAhPSBOVUxMICkNCisJew0KKwkJb3MgPDwgVEFCMiA8PCAoIG1OZWVkVHlwZUNoZWNraW5nID8gImNoZWNrXyIgOiAiIiApDQorCQkJCTw8ICJ0eXBlID0gIiA8PCBzdHJfaGVhZGVyKCBtVHlwZSApIDw8IEVPTDsNCisJfQ0KKw0KKwlvcyA8PCBUQUIgPDwgIn0iIDw8IEVPTDsNCit9DQorDQorDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gQ0FDSEUgTUFOQUdFUg0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKw0KK0xpc3Q8IENPTVBJTEVfQ09OVEVYVCAqID4gQ29tcGlsYXRpb25FbnZpcm9ubWVudDo6Q09NUElMRV9DT05URVhUX0NBQ0hFOw0KKw0KKw0KK3ZvaWQgQ29tcGlsYXRpb25FbnZpcm9ubWVudDo6aW5pdENhY2hlKCkNCit7DQorCWZvciggYXZtX3NpemVfdCBpID0gMCA7IGkgPCBDT01QSUxFX0NPTlRFWFRfSU5JVElBTF9DT1VOVCA7ICsraSApDQorCXsNCisJCUNPTVBJTEVfQ09OVEVYVF9DQUNIRS5hcHBlbmQoDQorCQkJCW5ldyBDT01QSUxFX0NPTlRFWFQoTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCkgKTsNCisJfQ0KK30NCisNCit2b2lkIENvbXBpbGF0aW9uRW52aXJvbm1lbnQ6OmZpbmFsaXplQ2FjaGUoKQ0KK3sNCisJYXZtX3NpemVfdCBmaW5hbENhY2hlU2l6ZSA9IDA7DQorDQorCXdoaWxlKCBDT01QSUxFX0NPTlRFWFRfQ0FDSEUubm9uZW1wdHkoKSApDQorCXsNCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIENPTVBJTElORyApDQorCQlBVk1fT1NfVFJBQ0UgPDwgIkNPTVBJTEVfQ09OVEVYVDo6ZmluYWxpemU6PiBAIg0KKwkJCQk8PCBhdm1fYWRkcmVzc190KCBDT01QSUxFX0NPTlRFWFRfQ0FDSEUubGFzdCgpICkgPDwgc3RkOjplbmRsOw0KK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgQ09NUElMSU5HICkNCisNCisJCSsrZmluYWxDYWNoZVNpemU7DQorCQlkZWxldGUoIENPTVBJTEVfQ09OVEVYVF9DQUNIRS5wb3BfbGFzdCgpICk7DQorCX0NCisNCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIENPTVBJTElORyApDQorCUFWTV9PU19UUkFDRSA8PCAiQ09NUElMRV9DT05URVhUOjpmaW5hbGl6ZSNjYWNoZTo+IGNvdW50ID0gIg0KKwkJCTw8IGZpbmFsQ2FjaGVTaXplIDw8IHN0ZDo6ZW5kbDsNCitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIENPTVBJTElORyApDQorfQ0KKw0KKw0KKw0KK0NPTVBJTEVfQ09OVEVYVCAqIENvbXBpbGF0aW9uRW52aXJvbm1lbnQ6Om5ld0NUWChDT01QSUxFX0NPTlRFWFQgKiBQUkVWLA0KKwkJQmFzZUF2bVByb2dyYW0gKiBhQ29tcGlsZUN0eCwgRXhlY3V0YWJsZUZvcm0gKiBhUnVudGltZUN0eCwNCisJCUluc3RhbmNlT2ZEYXRhICogYVZhcmlhYmxlQ3R4LCBCYXNlVHlwZVNwZWNpZmllciAqIGFUeXBlLA0KKwkJYm9vbCBuZWVkVHlwZUNoZWNraW5nLCBjb25zdCBNb2RpZmllciAmIGFNb2RpZmllcikNCit7DQorCUNPTVBJTEVfQ09OVEVYVCAqIG5ld0NUWCA9IE5VTEw7DQorDQorCWlmKCBDT01QSUxFX0NPTlRFWFRfQ0FDSEUubm9uZW1wdHkoKSApDQorCXsNCisJCUNPTVBJTEVfQ09OVEVYVF9DQUNIRS5wb3BfbGFzdF90byggbmV3Q1RYICk7DQorDQorCQluZXdDVFgtPlBSRVYgPSBQUkVWOw0KKw0KKwkJLy8gVXNlZCBmb3Igc2FmZSBtZW1vcnkgbWFuYWdlbWVudCAhISENCisJCWlmKCBQUkVWICE9IE5VTEwgKQ0KKwkJew0KKwkJCW5ld0NUWC0+TkVYVCA9IFBSRVYtPk5FWFQ7DQorCQkJUFJFVi0+TkVYVCAgID0gbmV3Q1RYOw0KKwkJfQ0KKwkJZWxzZQ0KKwkJew0KKwkJCW5ld0NUWC0+TkVYVCA9IE5VTEw7DQorCQl9DQorDQorCQluZXdDVFgtPm1Db21waWxlQ3R4ICA9IGFDb21waWxlQ3R4Ow0KKwkJbmV3Q1RYLT5tUnVudGltZUN0eCAgPSBhUnVudGltZUN0eDsNCisJCW5ld0NUWC0+bVZhcmlhYmxlQ3R4ID0gYVZhcmlhYmxlQ3R4Ow0KKw0KKwkJbmV3Q1RYLT5tVHlwZSA9IGFUeXBlOw0KKwkJbmV3Q1RYLT5tTmVlZFR5cGVDaGVja2luZyA9IG5lZWRUeXBlQ2hlY2tpbmc7DQorDQorCQluZXdDVFgtPnNldE1vZGlmaWVyKCBhTW9kaWZpZXIgKTsNCisJfQ0KKwllbHNlDQorCXsNCisJCW5ld0NUWCA9IG5ldyBDT01QSUxFX0NPTlRFWFQoUFJFViwNCisJCQkJYUNvbXBpbGVDdHgsIGFSdW50aW1lQ3R4LCBhVmFyaWFibGVDdHgsIGFUeXBlLCBhTW9kaWZpZXIpOw0KKw0KKwkJQVZNX09TX0FTU0VSVF9PVVRfT0ZfTUVNT1JZX0VYSVQoIG5ld0NUWCApDQorCQkJCTw8ICJDb21waWxhdGlvbkVudmlyb25tZW50OjpuZXdDVFggISEhIg0KKwkJCQk8PCBTRU5EX0VYSVQ7DQorCX0NCisNCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIENPTVBJTElORyApDQorCUFWTV9PU19UUkFDRSA8PCAiQ09NUElMRV9DT05URVhUOjpuZXc6PiBAIiA8PCBhdm1fYWRkcmVzc190KCBuZXdDVFggKQ0KKwkJCTw8IHN0ZDo6ZW5kbDsNCitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIENPTVBJTElORyApDQorDQorCXJldHVybiggbmV3Q1RYICk7DQorfQ0KKw0KKw0KK3ZvaWQgQ29tcGlsYXRpb25FbnZpcm9ubWVudDo6ZnJlZUNUWChDT01QSUxFX0NPTlRFWFQgKiAmIENUWCkNCit7DQorCWlmKCBDVFgtPk5FWFQgPT0gTlVMTCApDQorCXsNCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIENPTVBJTElORyApDQorCQlBVk1fT1NfVFJBQ0UgPDwgIkNPTVBJTEVfQ09OVEVYVDo6ZnJlZTo+IEAiDQorCQkJCTw8IGF2bV9hZGRyZXNzX3QoIENUWCApIDw8IHN0ZDo6ZW5kbDsNCitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIENPTVBJTElORyApDQorCQlDT01QSUxFX0NPTlRFWFRfQ0FDSEUuYXBwZW5kKCBDVFggKTsNCisNCisJCUNUWCA9IE5VTEw7DQorCX0NCisJZWxzZQ0KKwl7DQorCQlmb3IoIENPTVBJTEVfQ09OVEVYVCAqIG5leHRDVFggPSBDVFggOyBDVFggIT0gTlVMTCA7IENUWCA9IG5leHRDVFggKQ0KKwkJew0KK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgQ09NUElMSU5HICkNCisJCQlBVk1fT1NfVFJBQ0UgPDwgIkNPTVBJTEVfQ09OVEVYVDo6ZnJlZTo+IEAiDQorCQkJCQk8PCBhdm1fYWRkcmVzc190KCBDVFggKSA8PCBzdGQ6OmVuZGw7DQorQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBDT01QSUxJTkcgKQ0KKw0KKwkJCW5leHRDVFggPSBDVFgtPk5FWFQ7DQorLy8JCQlDVFgtPk5FWFQgPSBOVUxMOw0KKwkJCUNPTVBJTEVfQ09OVEVYVF9DQUNIRS5hcHBlbmQoIENUWCApOw0KKwkJfQ0KKwl9DQorfQ0KKw0KKw0KKw0KK30gLyogbmFtZXNwYWNlIHNlcCAqLw0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0NvbXBpbGF0aW9uRW52aXJvbm1lbnQuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2J1aWxkZXIvcHJpbWl0aXZlL0NvbXBpbGF0aW9uRW52aXJvbm1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWQxN2ZkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvYnVpbGRlci9wcmltaXRpdmUvQ29tcGlsYXRpb25FbnZpcm9ubWVudC5oCkBAIC0wLDAgKzEsNDQxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4NCisgKg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDcmVhdGVkIG9uOiAxNCBmw6l2ci4gMjAxMw0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyDQorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2lmbmRlZiBDT01QSUxBVElPTkVOVklST05NRU5UX0hfDQorI2RlZmluZSBDT01QSUxBVElPTkVOVklST05NRU5UX0hfDQorDQorI2luY2x1ZGUgPGNvbW1vbi9CRi5oPg0KKw0KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9Bdm1Db2RlLmg+DQorDQorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0F2bVByb2dyYW0uaD4NCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvQmFzZUF2bVByb2dyYW0uaD4NCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZUZvcm0uaD4NCisNCisjaW5jbHVkZSA8Zm1sL3R5cGUvQmFzZVR5cGVTcGVjaWZpZXIuaD4NCisjaW5jbHVkZSA8Zm1sL3R5cGUvVHlwZU1hbmFnZXIuaD4NCisNCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL01hY2hpbmUuaD4NCisNCisjaW5jbHVkZSA8Y29sbGVjdGlvbi9MaXN0Lmg+DQorDQorDQorI2RlZmluZSBDT01QSUxFX0NPTlRFWFRfSU5JVElBTF9DT1VOVCAgICAgMTYNCisNCisNCituYW1lc3BhY2Ugc2VwDQorew0KKw0KK2NsYXNzIEJhc2VBdm1Qcm9ncmFtOw0KK2NsYXNzIEV4ZWN1dGFibGVGb3JtOw0KK2NsYXNzIEluc3RhbmNlT2ZEYXRhOw0KKw0KK2NsYXNzIENPTVBJTEVfQ09OVEVYVDsNCisNCisNCitjbGFzcyBDb21waWxhdGlvbkVudmlyb25tZW50DQorew0KK3B1YmxpYzoNCisJLyoqDQorCSAqIENPTlNUUlVDVE9SDQorCSAqIERlZmF1bHQNCisJICovDQorCUNvbXBpbGF0aW9uRW52aXJvbm1lbnQoQ09NUElMRV9DT05URVhUICogYUNUWCwNCisJCQlCYXNlQXZtUHJvZ3JhbSAqIGFDb21waWxlQ3R4LCBFeGVjdXRhYmxlRm9ybSAqIGFSdW50aW1lQ3R4KQ0KKwk6IG1DVFgoIG5ld0NUWChhQ1RYLCBhQ29tcGlsZUN0eCwgYVJ1bnRpbWVDdHgpICkNCisJew0KKwkJLy8hISBOT1RISU5HDQorCX0NCisNCisvLwlDb21waWxhdGlvbkVudmlyb25tZW50KENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIEJhc2VBdm1Qcm9ncmFtICogYUNvbXBpbGVDdHgpDQorLy8JOiBtQ1RYKCBuZXdDVFgoYUNUWCwgYUNvbXBpbGVDdHgsIGFDb21waWxlQ3R4LT5nZXRFeGVjdXRhYmxlKCkpICkNCisvLwl7DQorLy8JCS8vISEgTk9USElORw0KKy8vCX0NCisNCisJQ29tcGlsYXRpb25FbnZpcm9ubWVudChDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBFeGVjdXRhYmxlRm9ybSAqIGFDb21waWxlQ3R4KQ0KKwk6IG1DVFgoIG5ld0NUWChhQ1RYLCBhQ29tcGlsZUN0eCwgYUNvbXBpbGVDdHgpICkNCisJew0KKwkJLy8hISBOT1RISU5HDQorCX0NCisNCisNCisJQ29tcGlsYXRpb25FbnZpcm9ubWVudChBdm1Qcm9ncmFtICogYUNvbXBpbGVDdHgsDQorCQkJSW5zdGFuY2VPZkRhdGEgKiBhVmFyaWFibGVDdHggPSBOVUxMKQ0KKwk6IG1DVFgoIG5ld0NUWChOVUxMLCBhQ29tcGlsZUN0eCwNCisJCQlhQ29tcGlsZUN0eC0+Z2V0RXhlY3V0YWJsZSgpLCBhVmFyaWFibGVDdHgpICkNCisJew0KKwkJLy8hISBOT1RISU5HDQorCX0NCisNCisJQ29tcGlsYXRpb25FbnZpcm9ubWVudChFeGVjdXRhYmxlRm9ybSAqIGFDb21waWxlQ3R4KQ0KKwk6IG1DVFgoIG5ld0NUWChOVUxMLCBhQ29tcGlsZUN0eCwgYUNvbXBpbGVDdHgpICkNCisJew0KKwkJLy8hISBOT1RISU5HDQorCX0NCisNCisNCisJLyoqDQorCSAqIERFU1RSVUNUT1INCisJICovDQorCXZpcnR1YWwgfkNvbXBpbGF0aW9uRW52aXJvbm1lbnQoKQ0KKwl7DQorCQlmcmVlQ1RYKCBtQ1RYICk7DQorCX0NCisNCisNCisNCitwdWJsaWM6DQorCS8qQVRUUklCVVRFUyovDQorDQorCUNPTVBJTEVfQ09OVEVYVCAqIG1DVFg7DQorDQorDQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwkvLyBDQUNIRSBNQU5BR0VSDQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwlzdGF0aWMgTGlzdDwgQ09NUElMRV9DT05URVhUICogPiAgQ09NUElMRV9DT05URVhUX0NBQ0hFOw0KKw0KKwlzdGF0aWMgdm9pZCBpbml0Q2FjaGUoKTsNCisNCisJc3RhdGljIHZvaWQgZmluYWxpemVDYWNoZSgpOw0KKw0KKw0KKwlzdGF0aWMgQ09NUElMRV9DT05URVhUICogbmV3Q1RYKENPTVBJTEVfQ09OVEVYVCAqIFBSRVYsDQorCQkJQmFzZUF2bVByb2dyYW0gKiBhQ29tcGlsZUN0eCwgRXhlY3V0YWJsZUZvcm0gKiBhUnVudGltZUN0eCwNCisJCQlJbnN0YW5jZU9mRGF0YSAqIGFWYXJpYWJsZUN0eCA9IE5VTEwsDQorCQkJQmFzZVR5cGVTcGVjaWZpZXIgKiBhVHlwZSA9IFR5cGVNYW5hZ2VyOjpVTklWRVJTQUwsDQorCQkJYm9vbCBuZWVkVHlwZUNoZWNraW5nID0gdHJ1ZSwNCisJCQljb25zdCBNb2RpZmllciAmIGFNb2RpZmllciA9IE1vZGlmaWVyOjpQUk9QRVJUWV9VTkRFRklORURfTU9ESUZJRVIpOw0KKw0KKw0KKwlzdGF0aWMgdm9pZCBmcmVlQ1RYKENPTVBJTEVfQ09OVEVYVCAqICYgQ1RYKTsNCisNCit9Ow0KKw0KKw0KKw0KK3N0cnVjdCBDT01QSUxFX0NPTlRFWFQgIDogIHB1YmxpYyBNb2RpZmllckltcGwNCit7DQorDQorcHVibGljOg0KKwkvKioNCisJICogU1RBVElDDQorCSAqIEFUVFJJQlVURVMNCisJICovDQorCXN0YXRpYyBib29sIERFRkFVTF9UWVBFX0NIRUNLSU5HX01BU0s7DQorDQorCXN0YXRpYyBib29sIElOTElORV9ESVNBQkxFX01BU0s7DQorDQorCXN0YXRpYyBib29sIElOTElORV9FTkFCTEVfTUFTSzsNCisNCisJc3RhdGljIGJvb2wgSU5MSU5FX1BST0NFRFVSRV9NQVNLOw0KKw0KKwkvKioNCisJICogQVRUUklCVVRFUw0KKwkgKi8NCisJQ09NUElMRV9DT05URVhUICogUFJFVjsNCisJQ09NUElMRV9DT05URVhUICogTkVYVDsNCisNCisJQmFzZUF2bVByb2dyYW0gKiBtQ29tcGlsZUN0eDsNCisJRXhlY3V0YWJsZUZvcm0gKiBtUnVudGltZUN0eDsNCisNCisJSW5zdGFuY2VPZkRhdGEgKiBtVmFyaWFibGVDdHg7DQorDQorCUJhc2VUeXBlU3BlY2lmaWVyICogbVR5cGU7DQorDQorCWJvb2wgbU5lZWRUeXBlQ2hlY2tpbmc7DQorDQorDQorcHVibGljOg0KKwkvKioNCisJICogQ09OU1RSVUNUT1INCisJICogRGVmYXVsdA0KKwkgKi8NCisJQ09NUElMRV9DT05URVhUKENPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIEJhc2VBdm1Qcm9ncmFtICogYUNvbXBpbGVDdHgsDQorCQkJRXhlY3V0YWJsZUZvcm0gKiBhUnVudGltZUN0eCwgSW5zdGFuY2VPZkRhdGEgKiBhVmFyaWFibGVDdHgsDQorCQkJQmFzZVR5cGVTcGVjaWZpZXIgKiBhVHlwZSA9IFR5cGVNYW5hZ2VyOjpVTklWRVJTQUwsDQorCQkJY29uc3QgTW9kaWZpZXIgJiBhTW9kaWZpZXIgPSBNb2RpZmllcjo6UFJPUEVSVFlfVU5ERUZJTkVEX01PRElGSUVSKQ0KKwk6IE1vZGlmaWVySW1wbCggYU1vZGlmaWVyICksDQorCVBSRVYoIGFDVFggKSwgTkVYVCggTlVMTCApLA0KKw0KKwltQ29tcGlsZUN0eCAoIGFDb21waWxlQ3R4ICApLA0KKwltUnVudGltZUN0eCAoIGFSdW50aW1lQ3R4ICApLA0KKwltVmFyaWFibGVDdHgoIGFWYXJpYWJsZUN0eCApLA0KKw0KKwltVHlwZSggYVR5cGUgKSwNCisJbU5lZWRUeXBlQ2hlY2tpbmcoIHRydWUgKQ0KKwl7DQorCQkvLyEhIE5PVEhJTkcNCisJfQ0KKw0KKw0KKwkvKioNCisJICogREVTVFJVQ1RPUg0KKwkgKi8NCisJdmlydHVhbCB+Q09NUElMRV9DT05URVhUKCkNCisJew0KKwkJLy8hISBOT1RISU5HDQorCX0NCisNCisNCisJQ09NUElMRV9DT05URVhUICogbmV3Q1RYKEJhc2VBdm1Qcm9ncmFtICogYUNvbXBpbGVDdHgsDQorCQkJRXhlY3V0YWJsZUZvcm0gKiBhUnVudGltZUN0eCwgSW5zdGFuY2VPZkRhdGEgKiBhVmFyaWFibGVDdHggPSBOVUxMKQ0KKwl7DQorCQlyZXR1cm4oIENvbXBpbGF0aW9uRW52aXJvbm1lbnQ6Om5ld0NUWCh0aGlzLA0KKwkJCQlhQ29tcGlsZUN0eCwgYVJ1bnRpbWVDdHgsIGFWYXJpYWJsZUN0eCwNCisJCQkJbVR5cGUsIG1OZWVkVHlwZUNoZWNraW5nLCBnZXRNb2RpZmllcigpKSApOw0KKwl9DQorDQorCUNPTVBJTEVfQ09OVEVYVCAqIG5ld0NUWChCYXNlQXZtUHJvZ3JhbSAqIGFDb21waWxlQ3R4KQ0KKwl7DQorCQlyZXR1cm4oIENvbXBpbGF0aW9uRW52aXJvbm1lbnQ6Om5ld0NUWCh0aGlzLA0KKwkJCQlhQ29tcGlsZUN0eCwgYUNvbXBpbGVDdHgtPmdldEV4ZWN1dGFibGUoKSwgbVZhcmlhYmxlQ3R4LA0KKwkJCQltVHlwZSwgbU5lZWRUeXBlQ2hlY2tpbmcsIGdldE1vZGlmaWVyKCkpICk7DQorCX0NCisNCisJQ09NUElMRV9DT05URVhUICogbmV3Q29tcGlsZUNUWChCYXNlQXZtUHJvZ3JhbSAqIGFDb21waWxlQ3R4KQ0KKwl7DQorCQlyZXR1cm4oIENvbXBpbGF0aW9uRW52aXJvbm1lbnQ6Om5ld0NUWCh0aGlzLA0KKwkJCQlhQ29tcGlsZUN0eCwgbVJ1bnRpbWVDdHgsIG1WYXJpYWJsZUN0eCwNCisJCQkJbVR5cGUsIG1OZWVkVHlwZUNoZWNraW5nLCBnZXRNb2RpZmllcigpKSApOw0KKwl9DQorDQorDQorCUNPTVBJTEVfQ09OVEVYVCAqIG5ld0NUWChFeGVjdXRhYmxlRm9ybSAqIGFSdW50aW1lQ3R4KQ0KKwl7DQorCQlyZXR1cm4oIENvbXBpbGF0aW9uRW52aXJvbm1lbnQ6Om5ld0NUWCh0aGlzLA0KKwkJCQltQ29tcGlsZUN0eCwgYVJ1bnRpbWVDdHgsIG1WYXJpYWJsZUN0eCwNCisJCQkJbVR5cGUsIG1OZWVkVHlwZUNoZWNraW5nLCBnZXRNb2RpZmllcigpKSApOw0KKwl9DQorDQorDQorCUNPTVBJTEVfQ09OVEVYVCAqIG5ld0NUWChFeGVjdXRhYmxlRm9ybSAqIGFSdW50aW1lQ3R4LA0KKwkJCWNvbnN0IE1vZGlmaWVyICYgYU1vZGlmaWVyKQ0KKwl7DQorCQlyZXR1cm4oIENvbXBpbGF0aW9uRW52aXJvbm1lbnQ6Om5ld0NUWCh0aGlzLA0KKwkJCQltQ29tcGlsZUN0eCwgYVJ1bnRpbWVDdHgsIG1WYXJpYWJsZUN0eCwNCisJCQkJbVR5cGUsIG1OZWVkVHlwZUNoZWNraW5nLCBhTW9kaWZpZXIpICk7DQorCX0NCisNCisJQ09NUElMRV9DT05URVhUICogbmV3Q1RYKGNvbnN0IE1vZGlmaWVyICYgYU1vZGlmaWVyKQ0KKwl7DQorCQlyZXR1cm4oIENvbXBpbGF0aW9uRW52aXJvbm1lbnQ6Om5ld0NUWCh0aGlzLA0KKwkJCQltQ29tcGlsZUN0eCwgbVJ1bnRpbWVDdHgsIG1WYXJpYWJsZUN0eCwNCisJCQkJbVR5cGUsIG1OZWVkVHlwZUNoZWNraW5nLCBhTW9kaWZpZXIpICk7DQorCX0NCisNCisNCisJQ09NUElMRV9DT05URVhUICogY2xvbmUoKQ0KKwl7DQorCQlyZXR1cm4oIENvbXBpbGF0aW9uRW52aXJvbm1lbnQ6Om5ld0NUWCh0aGlzLA0KKwkJCQltQ29tcGlsZUN0eCwgbVJ1bnRpbWVDdHgsIG1WYXJpYWJsZUN0eCwNCisJCQkJbVR5cGUsIG1OZWVkVHlwZUNoZWNraW5nLCBnZXRNb2RpZmllcigpKSApOw0KKwl9DQorDQorCUNPTVBJTEVfQ09OVEVYVCAqIGNsb25lKGNvbnN0IFR5cGVTcGVjaWZpZXIgJiBhVHlwZSkNCisJew0KKwkJcmV0dXJuKCBDb21waWxhdGlvbkVudmlyb25tZW50OjpuZXdDVFgodGhpcywNCisJCQkJbUNvbXBpbGVDdHgsIG1SdW50aW1lQ3R4LCBtVmFyaWFibGVDdHgsDQorCQkJCWFUeXBlLnJhd1R5cGUoKSwgbU5lZWRUeXBlQ2hlY2tpbmcsIGdldE1vZGlmaWVyKCkpICk7DQorCX0NCisNCisJQ09NUElMRV9DT05URVhUICogY2xvbmUoQmFzZVR5cGVTcGVjaWZpZXIgKiBhVHlwZSkNCisJew0KKwkJcmV0dXJuKCBDb21waWxhdGlvbkVudmlyb25tZW50OjpuZXdDVFgodGhpcywNCisJCQkJbUNvbXBpbGVDdHgsIG1SdW50aW1lQ3R4LCBtVmFyaWFibGVDdHgsDQorCQkJCWFUeXBlLCBtTmVlZFR5cGVDaGVja2luZywgZ2V0TW9kaWZpZXIoKSkgKTsNCisJfQ0KKw0KKw0KKwkvKioNCisJICogbVR5cGUNCisJICovDQorCWlubGluZSBib29sIGhhc1R5cGUoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIChtVHlwZSAhPSBOVUxMKSAmJiAobVR5cGUgIT0gVHlwZU1hbmFnZXI6OlVOSVZFUlNBTCkgKTsNCisJfQ0KKw0KKw0KKwlpbmxpbmUgYXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCBnZXRUeXBlRmFtaWx5KCkgY29uc3QNCisJew0KKwkJcmV0dXJuKCAoIG1UeXBlICE9IE5VTEwgKSA/DQorCQkJCW1UeXBlLT5nZXRUeXBlU3BlY2lmaWVyS2luZCgpIDogVFlQRV9VTkRFRklORURfU1BFQ0lGSUVSICk7DQorCX0NCisNCisNCisJaW5saW5lIGJvb2wgdHlwZU11c3RCZU1hY2hpbmVGYW1pbHkoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIChtVHlwZSA9PSBOVUxMKQ0KKwkJCQl8fCBtVHlwZS0+aGFzVHlwZVNwZWNpZmllcktpbmQoVFlQRV9NQUNISU5FX1NQRUNJRklFUiwNCisJCQkJCQlUWVBFX1VOSVZFUlNBTF9TUEVDSUZJRVIsIFRZUEVfVU5ERUZJTkVEX1NQRUNJRklFUikgKTsNCisJfQ0KKw0KKwlpbmxpbmUgYm9vbCB0eXBlTXVzdEJlUG9ydEZhbWlseSgpIGNvbnN0DQorCXsNCisJCXJldHVybiggKG1UeXBlID09IE5VTEwpDQorCQkJCXx8IG1UeXBlLT5oYXNUeXBlU3BlY2lmaWVyS2luZChUWVBFX1BPUlRfU1BFQ0lGSUVSLA0KKwkJCQkJCVRZUEVfU0lHTkFMX1NQRUNJRklFUixUWVBFX01FU1NBR0VfU1BFQ0lGSUVSKQ0KKwkJCQl8fCBtVHlwZS0+aGFzVHlwZVNwZWNpZmllcktpbmQoVFlQRV9VTklWRVJTQUxfU1BFQ0lGSUVSLA0KKwkJCQkJCVRZUEVfVU5ERUZJTkVEX1NQRUNJRklFUikgKTsNCisJfQ0KKw0KKwlpbmxpbmUgYm9vbCB0eXBlTXVzdEJlQ2hhbm5lbEZhbWlseSgpIGNvbnN0DQorCXsNCisJCXJldHVybiggKG1UeXBlID09IE5VTEwpDQorCQkJCXx8IG1UeXBlLT5oYXNUeXBlU3BlY2lmaWVyS2luZChUWVBFX0NIQU5ORUxfU1BFQ0lGSUVSLA0KKwkJCQkJCVRZUEVfVU5JVkVSU0FMX1NQRUNJRklFUiwgVFlQRV9VTkRFRklORURfU1BFQ0lGSUVSKSApOw0KKwl9DQorDQorCWlubGluZSBib29sIHR5cGVNdXN0QmVCdWZmZXJGYW1pbHkoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIChtVHlwZSA9PSBOVUxMKQ0KKwkJCQl8fCBtVHlwZS0+aGFzVHlwZVNwZWNpZmllcktpbmQoVFlQRV9CVUZGRVJfU1BFQ0lGSUVSLA0KKwkJCQkJCVRZUEVfVU5JVkVSU0FMX1NQRUNJRklFUiwgVFlQRV9VTkRFRklORURfU1BFQ0lGSUVSKSApOw0KKwl9DQorDQorCWlubGluZSBib29sIHR5cGVNdXN0QmVDb25uZWN0b3JGYW1pbHkoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIChtVHlwZSA9PSBOVUxMKQ0KKwkJCQl8fCBtVHlwZS0+aGFzVHlwZVNwZWNpZmllcktpbmQoVFlQRV9DT05ORUNUT1JfU1BFQ0lGSUVSLA0KKwkJCQkJCVRZUEVfVU5JVkVSU0FMX1NQRUNJRklFUiwgVFlQRV9VTkRFRklORURfU1BFQ0lGSUVSKSApOw0KKwl9DQorDQorDQorCWlubGluZSBib29sIHR5cGVDb3VsZEJlT2hlckZhbWlseSgpIGNvbnN0DQorCXsNCisJCWlmKCBtVHlwZSAhPSBOVUxMICkNCisJCXsNCisJCQlzd2l0Y2goIG1UeXBlLT5nZXRUeXBlU3BlY2lmaWVyS2luZCgpICkNCisJCQl7DQorCQkJCWNhc2UgVFlQRV9NQUNISU5FX1NQRUNJRklFUjoNCisJCQkJY2FzZSBUWVBFX1BPUlRfU1BFQ0lGSUVSOg0KKwkJCQljYXNlIFRZUEVfU0lHTkFMX1NQRUNJRklFUjoNCisJCQkJY2FzZSBUWVBFX01FU1NBR0VfU1BFQ0lGSUVSOg0KKwkJCQljYXNlIFRZUEVfQ0hBTk5FTF9TUEVDSUZJRVI6DQorCQkJCWNhc2UgVFlQRV9CVUZGRVJfU1BFQ0lGSUVSOg0KKwkJCQljYXNlIFRZUEVfQ09OTkVDVE9SX1NQRUNJRklFUjoNCisJCQkJCXJldHVybiggZmFsc2UgKTsNCisNCisJCQkJZGVmYXVsdDoNCisJCQkJCXJldHVybiggdHJ1ZSApOw0KKwkJCX0NCisJCX0NCisNCisJCXJldHVybiggdHJ1ZSApOw0KKwl9DQorDQorCWlubGluZSBib29sIHR5cGVDb3VsZEJlVHlwZVNwZWNpZmllckZhbWlseSgpIGNvbnN0DQorCXsNCisJCXJldHVybiggdHlwZUNvdWxkQmVPaGVyRmFtaWx5KCkgKTsNCisJfQ0KKw0KKwlpbmxpbmUgYm9vbCB0eXBlQ291bGRCZVRyYW5zaXRpb25GYW1pbHkoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIHR5cGVDb3VsZEJlT2hlckZhbWlseSgpICk7DQorCX0NCisNCisJaW5saW5lIGJvb2wgdHlwZUNvdWxkQmVHZW5lcmljUHJvZ3JhbUZhbWlseSgpIGNvbnN0DQorCXsNCisJCXJldHVybiggdHlwZUNvdWxkQmVPaGVyRmFtaWx5KCkgKTsNCisJfQ0KKw0KKw0KKw0KKwkvKioNCisJICogbU5lZWRUeXBlQ2hlY2tpbmcNCisJICovDQorCWlubGluZSBib29sIGlzU3Ryb25nTmVlZFR5cGVDaGVja2luZyhib29sIGxvY2FsVHlwZUNoZWNraW5nTWFzayA9IHRydWUgKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIGxvY2FsVHlwZUNoZWNraW5nTWFzaw0KKwkJCQkmJiBERUZBVUxfVFlQRV9DSEVDS0lOR19NQVNLDQorCQkJCSYmIG1OZWVkVHlwZUNoZWNraW5nICk7DQorCX0NCisNCisJaW5saW5lIGJvb2wgaXNXZWFrTmVlZFR5cGVDaGVja2luZyhib29sIGxvY2FsVHlwZUNoZWNraW5nTWFzayA9IHRydWUgKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIERFRkFVTF9UWVBFX0NIRUNLSU5HX01BU0sNCisJCQkJJiYgKGxvY2FsVHlwZUNoZWNraW5nTWFzaw0KKwkJCQkJfHwgbU5lZWRUeXBlQ2hlY2tpbmcpICk7DQorCX0NCisNCisJaW5saW5lIGJvb2wgaXNOZWVkVHlwZUNoZWNraW5nKGJvb2wgbG9jYWxUeXBlQ2hlY2tpbmdNYXNrID0gdHJ1ZSApIGNvbnN0DQorCXsNCisJCXJldHVybiggaXNTdHJvbmdOZWVkVHlwZUNoZWNraW5nKGxvY2FsVHlwZUNoZWNraW5nTWFzaykgKTsNCisJfQ0KKw0KKw0KKwkvKioNCisJICogbUNvbXBpbGVDdHgNCisJICovDQorCWJvb2wgaXNDb21waWxlVHJhbnNpdGlvbkN0eCgpDQorCXsNCisJCXJldHVybiggbUNvbXBpbGVDdHgtPmlzPCBBdm1UcmFuc2l0aW9uID4oKSApOw0KKwl9DQorDQorCWJvb2wgaXNJbmxpbmVFbmFibGUoRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGUpDQorCXsNCisJCXJldHVybiggSU5MSU5FX0VOQUJMRV9NQVNLDQorCQkJCSYmIGlzQ29tcGlsZVRyYW5zaXRpb25DdHgoKQ0KKwkJCQkmJiBhbkV4ZWN1dGFibGUtPmlzSW5saW5hYmxlRW5hYmxlKCkgKTsNCisJfQ0KKw0KKw0KKwlib29sIGlzSW5saW5lUHJvY2VkdXJlKEV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlKQ0KKwl7DQorCQlyZXR1cm4oIElOTElORV9QUk9DRURVUkVfTUFTSw0KKwkJCQkmJiBpc0NvbXBpbGVUcmFuc2l0aW9uQ3R4KCkNCisJCQkJJiYgYW5FeGVjdXRhYmxlLT5pc0lubGluYWJsZVByb2NlZHVyZSgpICk7DQorCX0NCisNCisJLyoqDQorCSAqIG1Db21waWxlQ3R4DQorCSAqLw0KKwlib29sIGlzU3BlY2lmaWNSdW50aW1lQ3R4KCkNCisJew0KKwkJcmV0dXJuKCAobVJ1bnRpbWVDdHggIT0gbUNvbXBpbGVDdHgpDQorCQkJCSYmIChtUnVudGltZUN0eCAhPSBtQ29tcGlsZUN0eC0+Z2V0Q29udGFpbmVyKCkpICk7DQorCX0NCisNCisNCisJLyoqDQorCSAqIHJlcG9ydCBkZWJ1ZyBDb250ZXh0DQorCSAqLw0KKwlPdXRTdHJlYW0gJiBkZWJ1Z0NvbnRleHQoT3V0U3RyZWFtICYgb3MpOw0KKw0KKwkvKioNCisJICogcmVwb3J0IGVycm9yIENvbnRleHQgJiBMb2NhdGlvbg0KKwkgKi8NCisJT3V0U3RyZWFtICYgZXJyb3JDb250ZXh0KE91dFN0cmVhbSAmIG9zKTsNCisJUGFpck91dFN0cmVhbSAmIGVycm9yQ29udGV4dChQYWlyT3V0U3RyZWFtICYgb3MpOw0KKwlUcmlwbGVPdXRTdHJlYW0gJiBlcnJvckNvbnRleHQoVHJpcGxlT3V0U3RyZWFtICYgb3MpOw0KKw0KKwlPdXRTdHJlYW0gJiB3YXJuaW5nQ29udGV4dChPdXRTdHJlYW0gJiBvcyk7DQorCVBhaXJPdXRTdHJlYW0gJiB3YXJuaW5nQ29udGV4dChQYWlyT3V0U3RyZWFtICYgb3MpOw0KKwlUcmlwbGVPdXRTdHJlYW0gJiB3YXJuaW5nQ29udGV4dChUcmlwbGVPdXRTdHJlYW0gJiBvcyk7DQorDQorCS8qKg0KKwkgKiBTZXJpYWxpemF0aW9uDQorCSAqLw0KKwl2aXJ0dWFsIHZvaWQgc3RySGVhZGVyKE91dFN0cmVhbSAmIG9zKSBjb25zdDsNCisNCisJdmlydHVhbCB2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdDsNCisNCit9Ow0KKw0KKw0KKw0KK30gLyogbmFtZXNwYWNlIHNlcCAqLw0KKyNlbmRpZiAvKiBDT01QSUxBVElPTkVOVklST05NRU5UX0hfICovDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY21ha2UvRGVmaW5lU3ltYmV4UHJvamVjdC5jbWFrZSBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NtYWtlL0RlZmluZVN5bWJleFByb2plY3QuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ2MTcwNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NtYWtlL0RlZmluZVN5bWJleFByb2plY3QuY21ha2UKQEAgLTAsMCArMSw0MiBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgICAgICAgICAgICAgICAgQ01ha2UgbW9kdWxlIGRlZmluaW5nIHRoZSBTeW1iZXggcHJvamVjdAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKK21lc3NhZ2UgKFNUQVRVUyAiKioqKioqIERlZmluaW5nIHByb2plY3QqKioqKioiKQorCisjIERlZmluaXRpb24gb2YgcHJvamVjdCBuYW1lIGFuZCBzdXBwb3J0ZWQgbGFuZ3VhZ2VzCitwcm9qZWN0IChTeW1iZXggQ1hYIEMpCisKKyMgUHJvamVjdCBzdHJ1Y3R1cmUgOiBvbmx5IGFkZCBkaXJlY3RvcmllcyBhc3NvY2lhdGVkIHdpdGggdGhlIGJ1aWxkIG9mIGFuCisjIGludGVybmFsIGxpYnJhcnkgKGkuZS4gY29udGFpbmluZyBhIENNYWtlTGlzdHMudHh0IGRlZmluaW5nIGEgdGFyZ2V0KQorIyBTb3VyY2VzIHdpdGhpbiBzdWJkaXJlY3RvcmllcyBhcmUgdGFrZW4gaW50byBhY2NvdW50IGJ5IHRoZSByZWN1cnNpdmUKKyMgbG9vay11cCAoc2VlIHRoZSBzcGVjaWZpYyBDTWFrZUxpc3RzLnR4dCkKK2FkZF9zdWJkaXJlY3RvcnkgKGJhc2UpCithZGRfc3ViZGlyZWN0b3J5IChidWlsZGVyKQorYWRkX3N1YmRpcmVjdG9yeSAoY29sbGVjdGlvbikKK2FkZF9zdWJkaXJlY3RvcnkgKGNvbW1vbikKK2FkZF9zdWJkaXJlY3RvcnkgKGNvbXB1dGVyKQorYWRkX3N1YmRpcmVjdG9yeSAoZmFtKQorYWRkX3N1YmRpcmVjdG9yeSAoZm1sKQorYWRkX3N1YmRpcmVjdG9yeSAocGFyc2VyKQorYWRkX3N1YmRpcmVjdG9yeSAocHJpbnRlcikKK2FkZF9zdWJkaXJlY3RvcnkgKHNldykKK2FkZF9zdWJkaXJlY3RvcnkgKHNvbHZlcikKK2FkZF9zdWJkaXJlY3RvcnkgKHV0aWwpCisKKworCisjIE1haW4gdGFyZ2V0IEMrKyBzb3VyY2UgZmlsZXMgIChhbGwgZmlsZXMgbWF0Y2hpbmcgcGF0dGVybnMpCitmaWxlIChHTE9CX1JFQ1VSU0UgTUFJTl9DWFhfU1JDX0ZJTEVTIG1haW4vKi5jcHAgbWFpbi8qLmgpCisKKyMgTWFpbiB0YXJnZXQgZGVmaW5pdGlvbiAoYXNzb2NpYXRpb24gdG8gaXRzIHNvdXJjZXMpCithZGRfZXhlY3V0YWJsZSAoc3ltYmV4ICR7TUFJTl9DWFhfU1JDX0ZJTEVTfSkKKworIyBBZGhvYyBkZXBlbmRlbmNpZXMgdG8gZm9yY2UgYnVpbGRzIGZyb20gc291cmNlcyAoaWYgYSBwcmVyZXF1aXNpdGUgaXMgbm90IGZvdW5kKQorYWRkX2RlcGVuZGVuY2llcyhzeW1iZXggcmVzY2FuX2N2YzQpCithZGRfZGVwZW5kZW5jaWVzKHN5bWJleCByZXNjYW5fYW50bHIyKQorCisjIE1haW4gdGFyZ2V0IGxpbmsgLSBGSVhNRSA6IGR1cGxpY2F0ZSBmbWwgYW5kIGZhbSBuZWVkZWQgdG8gbGluayBzdWNlc3NmdWxseQordGFyZ2V0X2xpbmtfbGlicmFyaWVzIChzeW1iZXggc2V3IHBhcnNlciBmYW0gZm1sIGZhbSBidWlsZGVyIHNvbHZlciBjb21wdXRlciBmbWwgY29tbW9uIGJhc2UgY29sbGVjdGlvbiBwcmludGVyIHV0aWwgJHtBTlRMUjJfTElCUkFSSUVTfSAke0FOVExSM19MSUJSQVJJRVN9ICR7Qm9vc3RfTElCUkFSSUVTfSAke0NWQzRfTElCUkFSSUVTfSAke2xpYl9nbXBfY30gJHtsaWJfZ21wX2N4eH0pCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NtYWtlL0dlbmVyYXRlSW5mb0hlYWRlcnMuY21ha2UgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jbWFrZS9HZW5lcmF0ZUluZm9IZWFkZXJzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4N2JhOWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jbWFrZS9HZW5lcmF0ZUluZm9IZWFkZXJzLmNtYWtlCkBAIC0wLDAgKzEsMTMgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisjICAgICAgIENNYWtlIG1vZHVsZSBnZW5lcmF0aW5nIHNvdXJjZSBmaWxlcyB3aXRoIHVzZWZ1bCBpbmZvcm1hdGlvbiANCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorDQorDQorbWVzc2FnZSAoU1RBVFVTICIqKioqKiogR2VuZXJhdGluZyBpbmZvcm1hdGl2ZSBoZWFkZXJzICoqKioqKiIpDQorDQorDQorY29uZmlndXJlX2ZpbGUgKCR7UFJPSkVDVF9TT1VSQ0VfRElSfS9zcmMvbWFpbi92ZXJzaW9uLmguaW4gJHtQUk9KRUNUX0JJTkFSWV9ESVJ9L21haW4vdmVyc2lvbi5oKQ0KK2NvbmZpZ3VyZV9maWxlICgke1BST0pFQ1RfU09VUkNFX0RJUn0vc3JjL3V0aWwvY29uZnMuaC5pbiAgICR7UFJPSkVDVF9CSU5BUllfRElSfS91dGlsL2NvbmZzLmgpDQorDQoraW5jbHVkZV9kaXJlY3Rvcmllcygke1BST0pFQ1RfQklOQVJZX0RJUn0vbWFpbikNCitpbmNsdWRlX2RpcmVjdG9yaWVzKCR7UFJPSkVDVF9CSU5BUllfRElSfS91dGlsKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NtYWtlL0lOU1RBTExfdG1wLXRvYy54bWwgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jbWFrZS9JTlNUQUxMX3RtcC10b2MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NDRlMTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jbWFrZS9JTlNUQUxMX3RtcC10b2MueG1sCkBAIC0wLDAgKzEsNDQgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J3V0Zi04JyA/PgorPCEtLQorICAgIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAgIAorICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgICAKKyAgICBDb250cmlidXRvcnM6CisgICAgIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAgICAgIC0gSW5pdGlhbCBBUEkgYW5kIEltcGxlbWVudGF0aW9uCisgLS0+CisKKzx0b2MgdG9waWM9InNyYy9jbWFrZS9JTlNUQUxMX3RtcC5odG1sIiBsYWJlbD0iSU5TVEFMTF90bXAiPgorCTx0b3BpYyBocmVmPSJzcmMvY21ha2UvSU5TVEFMTF90bXAuaHRtbCIgbGFiZWw9IkVGTS1TWU1CRVggOiBCdWlsZCBhbmQgSW5zdGFsbGF0aW9uIEluc3RydWN0aW9ucyI+CisJCTx0b3BpYyBocmVmPSJzcmMvY21ha2UvSU5TVEFMTF90bXAuaHRtbCNvdmVydmlldyIgbGFiZWw9Ik92ZXJ2aWV3Ij48L3RvcGljPgorCQk8dG9waWMgaHJlZj0ic3JjL2NtYWtlL0lOU1RBTExfdG1wLmh0bWwjcHJlcmVxdWlzaXRlcy1pbnN0YWxsYXRpb24iIGxhYmVsPSJQcmVyZXF1aXNpdGVzIGluc3RhbGxhdGlvbiI+CisJCQk8dG9waWMgaHJlZj0ic3JjL2NtYWtlL0lOU1RBTExfdG1wLmh0bWwjYmluYXJpZXMtYWxtb3N0LWluc3RhbGxhdGlvbi1vbi1saW51eCIgbGFiZWw9IkJpbmFyaWVzIChhbG1vc3QpIGluc3RhbGxhdGlvbiBvbiBMaW51eCI+CisJCQkJPHRvcGljIGhyZWY9InNyYy9jbWFrZS9JTlNUQUxMX3RtcC5odG1sI2NtYWtlIiBsYWJlbD0iQ01ha2UiPjwvdG9waWM+CisJCQkJPHRvcGljIGhyZWY9InNyYy9jbWFrZS9JTlNUQUxMX3RtcC5odG1sI2Jvb3N0IiBsYWJlbD0iQm9vc3QiPjwvdG9waWM+CisJCQkJPHRvcGljIGhyZWY9InNyYy9jbWFrZS9JTlNUQUxMX3RtcC5odG1sI2dtcCIgbGFiZWw9IkdNUCI+PC90b3BpYz4KKwkJCQk8dG9waWMgaHJlZj0ic3JjL2NtYWtlL0lOU1RBTExfdG1wLmh0bWwjYW50bHIyIiBsYWJlbD0iQU5UTFIyIj48L3RvcGljPgorCQkJCTx0b3BpYyBocmVmPSJzcmMvY21ha2UvSU5TVEFMTF90bXAuaHRtbCNhbnRscjMiIGxhYmVsPSJBTlRMUjMiPjwvdG9waWM+CisJCQkJPHRvcGljIGhyZWY9InNyYy9jbWFrZS9JTlNUQUxMX3RtcC5odG1sI2N2YzQiIGxhYmVsPSJDVkM0Ij48L3RvcGljPgorCQkJCTx0b3BpYyBocmVmPSJzcmMvY21ha2UvSU5TVEFMTF90bXAuaHRtbCNvbWVnYSIgbGFiZWw9Ik9tZWdhIj48L3RvcGljPgorCQkJPC90b3BpYz4KKwkJCTx0b3BpYyBocmVmPSJzcmMvY21ha2UvSU5TVEFMTF90bXAuaHRtbCNzb3VyY2VzLWluc3RhbGxhdGlvbi1vbi1saW51eCIgbGFiZWw9IlNvdXJjZXMgaW5zdGFsbGF0aW9uIG9uIExpbnV4Ij48L3RvcGljPgorCQkJPHRvcGljIGhyZWY9InNyYy9jbWFrZS9JTlNUQUxMX3RtcC5odG1sI3NvdXJjZXMtaW5zdGFsbGF0aW9uLW9uLXdpbmRvd3MtbWluZ3ctbXN5czIiIGxhYmVsPSJTb3VyY2VzIGluc3RhbGxhdGlvbiBvbiBXaW5kb3dzL01pbkdXL01TWVMyIj4KKwkJCQk8dG9waWMgaHJlZj0ic3JjL2NtYWtlL0lOU1RBTExfdG1wLmh0bWwjY21ha2UyIiBsYWJlbD0iQ01ha2UiPjwvdG9waWM+CisJCQkJPHRvcGljIGhyZWY9InNyYy9jbWFrZS9JTlNUQUxMX3RtcC5odG1sI21zeXMyIiBsYWJlbD0iTVNZUzIiPjwvdG9waWM+CisJCQkJPHRvcGljIGhyZWY9InNyYy9jbWFrZS9JTlNUQUxMX3RtcC5odG1sI2N2YzQyIiBsYWJlbD0iQ1ZDNCI+PC90b3BpYz4KKwkJCTwvdG9waWM+CisJCTwvdG9waWM+CisJCTx0b3BpYyBocmVmPSJzcmMvY21ha2UvSU5TVEFMTF90bXAuaHRtbCNzdGFuZGFyZC1idWlsZCIgbGFiZWw9IlN0YW5kYXJkIEJ1aWxkIj48L3RvcGljPgorCQk8dG9waWMgaHJlZj0ic3JjL2NtYWtlL0lOU1RBTExfdG1wLmh0bWwjYnVpbGQtY3VzdG9taXphdGlvbi1mb3ItZGV2ZWxvcGVycyIgbGFiZWw9IkJ1aWxkIEN1c3RvbWl6YXRpb24gKGZvciBkZXZlbG9wZXJzKSI+CisJCQk8dG9waWMgaHJlZj0ic3JjL2NtYWtlL0lOU1RBTExfdG1wLmh0bWwjc2V0LWNvbXBpbGF0aW9uLW9wdGlvbnMiIGxhYmVsPSJTZXQgY29tcGlsYXRpb24gb3B0aW9ucyI+PC90b3BpYz4KKwkJCTx0b3BpYyBocmVmPSJzcmMvY21ha2UvSU5TVEFMTF90bXAuaHRtbCNtb2RpZnktbGluay1jb21tYW5kLWxpbmUiIGxhYmVsPSJNb2RpZnkgbGluayBjb21tYW5kIGxpbmUiPjwvdG9waWM+CisJCQk8dG9waWMgaHJlZj0ic3JjL2NtYWtlL0lOU1RBTExfdG1wLmh0bWwjY2hhbmdlLXByZXJlcXVpc2l0ZXMtbG9vay11cC1hZGQtYS1uZXgtcHJlcmVxdWlzaXRlIiBsYWJlbD0iQ2hhbmdlIHByZXJlcXVpc2l0ZXMgbG9vay11cCAvIEFkZCBhIG5leCBwcmVyZXF1aXNpdGUiPjwvdG9waWM+CisJCQk8dG9waWMgaHJlZj0ic3JjL2NtYWtlL0lOU1RBTExfdG1wLmh0bWwjY2hhbmdlLXByb2plY3Qtc3RydWN0dXJlLXdpdGhvdXQtYWRkaW5nLWEtbmV3LXRhcmdldCIgbGFiZWw9IkNoYW5nZSBwcm9qZWN0IHN0cnVjdHVyZSB3aXRob3V0IGFkZGluZyBhIG5ldyB0YXJnZXQiPjwvdG9waWM+CisJCQk8dG9waWMgaHJlZj0ic3JjL2NtYWtlL0lOU1RBTExfdG1wLmh0bWwjYWRkLWEtbmV3LXRhcmdldCIgbGFiZWw9IkFkZCBhIG5ldyB0YXJnZXQiPjwvdG9waWM+CisJCTwvdG9waWM+CisJPC90b3BpYz4KKzwvdG9jPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NtYWtlL0lOU1RBTExfdG1wLmh0bWwgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jbWFrZS9JTlNUQUxMX3RtcC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYzI3MDAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jbWFrZS9JTlNUQUxMX3RtcC5odG1sCkBAIC0wLDAgKzEsMjMxIEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSd1dGYtOCcgPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CisJPGhlYWQ+CisJCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ii8+CisJPC9oZWFkPgorCTxib2R5PgorCQk8aDEgaWQ9ImVmbS1zeW1iZXgtYnVpbGQtYW5kLWluc3RhbGxhdGlvbi1pbnN0cnVjdGlvbnMiPkVGTS1TWU1CRVggOiBCdWlsZCBhbmQgSW5zdGFsbGF0aW9uIEluc3RydWN0aW9uczwvaDE+CisJCTxoMiBpZD0ib3ZlcnZpZXciPk92ZXJ2aWV3PC9oMj4KKwkJPHA+SW4gb3JkZXIgdG8gYnVpbGQgRUZNLVNZTUJFWCwgeW91J2xsIG5lZWQgOgorCQkJPGJyLz4KKwkJPC9wPgorCQk8dWw+CisJCQk8bGk+CisJCQkJPGEgaHJlZj0iaHR0cHM6Ly9jbWFrZS5vcmcvZG93bmxvYWQvIj5DTWFrZTwvYT4sIDIuOCBvciBoaWdoZXIKKwkJCTwvbGk+CisJCQk8bGk+CisJCQkJPGEgaHJlZj0iaHR0cDovL3d3dy5ib29zdC5vcmcvdXNlcnMvZG93bmxvYWQvIj5Cb29zdDwvYT4sIDEuNTMgb3IgaGlnaGVyCisJCQk8L2xpPgorCQkJPGxpPgorCQkJCTxhIGhyZWY9Imh0dHBzOi8vZ21wbGliLm9yZy8iPkdNUDwvYT4sIDIuNS4xLjMKKwkJCTwvbGk+CisJCQk8bGk+CisJCQkJPGEgaHJlZj0iaHR0cDovL3d3dy5hbnRscjIub3JnIj5BTlRMUjI8L2E+LCBDIGJpbmRpbmdzIGxpYnJhcnksIDIuNy43CisJCQk8L2xpPgorCQkJPGxpPgorCQkJCTxhIGhyZWY9Imh0dHA6Ly93d3cuYW50bHIzLm9yZyI+QU5UTFIzPC9hPiwgQyBiaW5kaW5ncyBsaWJyYXJ5LCAzLjQKKwkJCTwvbGk+CisJCQk8bGk+CisJCQkJPGEgaHJlZj0iaHR0cDovL2N2YzQuY3Mubnl1LmVkdSI+Q1ZDNDwvYT4sIDEuMy4xIG9yIGhpZ2hlcgorCQkJPC9saT4KKwkJCTxsaT4KKwkJCQk8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZGF2ZXdhdGhhdmVyZm9yZC90aGUtb21lZ2EtcHJvamVjdCI+T21lZ2E8L2E+CisJCQk8L2xpPgorCQk8L3VsPgorCQk8cD5FRk0tU1lNQkVYIGJ1aWxkIGlzIGRyaXZlbiBieSBDTWFrZSBhbmQgdGVzdGVkIHdpdGggdGhlIGZvbGxvd2luZyBnZW5lcmF0b3JzIDogPC9wPgorCQk8dWw+CisJCQk8bGk+VW5peCBNYWtlZmlsZXMgKG5hdGl2ZSBjb21waWxlcnMpPC9saT4KKwkJPC91bD4KKwkJPGgyIGlkPSJwcmVyZXF1aXNpdGVzLWluc3RhbGxhdGlvbiI+UHJlcmVxdWlzaXRlcyBpbnN0YWxsYXRpb248L2gyPgorCQk8aDMgaWQ9ImJpbmFyaWVzLWFsbW9zdC1pbnN0YWxsYXRpb24tb24tbGludXgiPkJpbmFyaWVzIChhbG1vc3QpIGluc3RhbGxhdGlvbiBvbiBMaW51eDwvaDM+CisJCTxwPkZvbGxvd2luZyBpbnN0cnVjdGlvbnMgYXJlIGdpdmVuIGZvciBkZWJpYW4tbGlrZSBkaXN0cmlidXRpb25zLiBZb3Ugc2hvdWxkIGFkYXB0IHRoZW0gdG8gdGhlIHBhY2thZ2UgbWFuYWdlciB1c2VkIGJ5IHlvdXIgZGlzdHJpYnV0aW9uLgorCQkJPGJyLz4KKwkJPC9wPgorCQk8aDQgaWQ9ImNtYWtlIj5DTWFrZTwvaDQ+CisJCTxwPgorCQkJPGNvZGU+c3VkbyBhcHQtZ2V0IGluc3RhbGwgY21ha2U8L2NvZGU+CisJCQk8YnIvPgorCisJCQk8Y29kZT5zdWRvIGFwdC1nZXQgaW5zdGFsbCBjbWFrZS1ndWk8L2NvZGU+CisJCQk8YnIvPgorCQk8L3A+CisJCTxoNCBpZD0iYm9vc3QiPkJvb3N0PC9oND4KKwkJPHA+CisJCQk8Y29kZT5zdWRvIGFwdC1nZXQgaW5zdGFsbCBib29zdC0xLjUzPC9jb2RlPgorCQkJPGJyLz4KKwkJPC9wPgorCQk8aDQgaWQ9ImdtcCI+R01QPC9oND4KKwkJPHA+CisJCQk8Y29kZT5zdWRvIGFwdC1nZXQgaW5zdGFsbCBsaWJnbXAtZGV2PC9jb2RlPgorCQkJPGJyLz4KKwkJPC9wPgorCQk8aDQgaWQ9ImFudGxyMiI+QU5UTFIyPC9oND4KKwkJPHA+CisJCQk8Y29kZT5zdWRvIGFwdC1nZXQgaW5zdGFsbCBsaWJhbnRsci1kZXY8L2NvZGU+CisJCQk8YnIvPgorCQk8L3A+CisJCTxoNCBpZD0iYW50bHIzIj5BTlRMUjM8L2g0PgorCQk8cD5BcyBubyBBTlRMUiAzLjQgcGFja2FnZSBzZWVtcyBhdmFpbGFibGUsIGl0IGlzIG5lY2Vzc2FyeSB0byBjb21waWxlIGEgc291cmNlIGRpc3RyaWJ1dGlvbiA6IAorCQkJRG93bmxvYWQgCisJCQk8YSBocmVmPSJodHRwOi8vd3d3LmFudGxyMy5vcmcvZG93bmxvYWQvQy9saWJhbnRscjNjLTMuNC50YXIuZ3oiPmxpYmFudGxyM2MtMy40LnRhci5nejwvYT4gdGhlbiA6CisJCQk8YnIvPgorCQk8L3A+CisJCTxwPgorCQkJPGNvZGU+dGFyIHp4dmYgbGliYW50bHIzYy0zLjQudGFyLmd6PC9jb2RlPgorCQkJPGJyLz4KKworCQkJPGNvZGU+Li9jb25maWd1cmUgLS1lbmFibGUtc3RhdGljPXRydWUgLS1lbmFibGUtc2hhcmVkPWZhbHNlPC9jb2RlPiwgYWRkIAorCQkJPGNvZGU+LS1lbmFibGUtNjRiaXQ8L2NvZGU+IGFjY29yZGluZyB0byB5b3VyIHN5c3RlbS4KKwkJCTxici8+CisKKwkJCTxjb2RlPm1ha2U8L2NvZGU+CisJCQk8YnIvPgorCisJCQk8Y29kZT5tYWtlIGNoZWNrPC9jb2RlPgorCQkJPGJyLz4KKworCQkJPGNvZGU+c3VkbyBtYWtlIGluc3RhbGw8L2NvZGU+CisJCQk8YnIvPgorCQk8L3A+CisJCTxwPkhlYWRlcnMgYW5kIGxpYnJhcnkgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgaW5zdGFsbGVkIGluIC91c3IvbG9jYWwuIFVzZSAKKwkJCTxjb2RlPi5cY29uZmlndXJlIC0tcHJlZml4PSZsdDt5b3VycGF0aCZndDs8L2NvZGU+IHRvIGluc3RhbGwgaW4gYW5vdGhlciBsb2NhdGlvbi4gSW4gdGhpcyBjYXNlLCB5b3UnbGwgbmVlZCB0byBzZXQgCisJCQk8Y29kZT5BTlRMUjNfUk9PVDwvY29kZT4gdmFyaWFibGUgdG8gdGhpcyBsb2NhdGlvbiBmb3IgQ01ha2UgdG8ga25vdyBhYm91dCBpdC4KKwkJCTxici8+CisJCTwvcD4KKwkJPGg0IGlkPSJjdmM0Ij5DVkM0PC9oND4KKwkJPHA+QWRkIHRoZSBmb2xsb3dpbmcgbGluZXMgaW4gCisJCQk8Y29kZT4vZXRjL2FwdC9zb3VyY2VzLmxpc3Q8L2NvZGU+IDoKKwkJCTxici8+CisJCTwvcD4KKwkJPHA+CisJCQk8Y29kZT5kZWIgaHR0cDovL2N2YzQuY3Mubnl1LmVkdS9kZWJpYW4vIHN0YWJsZS88L2NvZGU+CisKKwkJCTxjb2RlPmRlYiBodHRwOi8vY3ZjNC5jcy5ueXUuZWR1L2RlYmlhbiB1bnN0YWJsZS88L2NvZGU+CisKKwkJCTxjb2RlPmRlYl9zcmMgaHR0cDovL2N2YzQuY3Mubnl1LmVkdS9kZWJpYW4gdW5zdGFibGUvPC9jb2RlPgorCQkJPGJyLz4KKwkJPC9wPgorCQk8cD5UaGVuIGRvIDoKKwkJCTxici8+CisJCTwvcD4KKwkJPHA+CisJCQk8Y29kZT5zdWRvIGFwdC1nZXQgdXBkYXRlPC9jb2RlPgorCQkJPGJyLz4KKworCQkJPGNvZGU+c3VkbyBhcHQtZ2V0IGluc3RhbGwgY3ZjNCBsaWJjdmM0LWRldjwvY29kZT4KKwkJCTxici8+CisJCTwvcD4KKwkJPGg0IGlkPSJvbWVnYSI+T21lZ2E8L2g0PgorCQk8cD5ObyBwYWNrYWdlIGJlaW5nIGF2YWlsYWJsZSBmb3IgT21lZ2EsIGl0IGlzIG5lY2Vzc2FyeSB0byBjb21waWxlIGEgc291cmNlIGRpc3RyaWJ1dGlvbi4gQ2xvbmUgdGhlIHNvdXJjZSByZXBvc2l0b3J5IDoKKwkJCTxici8+CisJCTwvcD4KKwkJPHA+CisJCQk8Y29kZT5naXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL2RhdmV3YXRoYXZlcmZvcmQvdGhlLW9tZWdhLXByb2plY3QuZ2l0PC9jb2RlPgorCQkJPGJyLz4KKwkJPC9wPgorCQk8cD5UaGVuIGRvIDogPC9wPgorCQk8cD4KKwkJCTxjb2RlPm1ha2UgZGVwZW5kczwvY29kZT4KKwkJCTxici8+CisKKwkJCTxjb2RlPm1ha2UgbGlib21lZ2EuYTwvY29kZT4KKwkJCTxici8+CisKKwkJCTxjb2RlPnN1ZG8gbWFrZSBpbnN0YWxsPC9jb2RlPgorCQk8L3A+CisJCTxwPkhlYWRlcnMgYW5kIGxpYnJhcnkgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgaW5zdGFsbGVkIGluIC91c3IvbG9jYWwuIFVzZSAuXGNvbmZpZ3VyZSAtLXByZWZpeD0vdXNyL2xvY2FsIHRvIGluc3RhbGwgaW4gYW5vdGhlciBsb2NhdGlvbi4gSW4gdGhpcyBjYXNlLCB5b3UnbGwgbmVlZCB0byBzZXQgCisJCQk8Y29kZT5PTUVHQV9ST09UPC9jb2RlPiB2YXJpYWJsZSB0byB0aGlzIGxvY2F0aW9uIGZvciBDTWFrZSB0byBrbm93IGFib3V0IGl0LiAKKwkJPC9wPgorCQk8aDMgaWQ9InNvdXJjZXMtaW5zdGFsbGF0aW9uLW9uLWxpbnV4Ij5Tb3VyY2VzIGluc3RhbGxhdGlvbiBvbiBMaW51eDwvaDM+CisJCTxwPgorCQkJPHN0cm9uZz5UTyBCRSBET05FPC9zdHJvbmc+CisJCTwvcD4KKwkJPGgzIGlkPSJzb3VyY2VzLWluc3RhbGxhdGlvbi1vbi13aW5kb3dzLW1pbmd3LW1zeXMyIj5Tb3VyY2VzIGluc3RhbGxhdGlvbiBvbiBXaW5kb3dzL01pbkdXL01TWVMyPC9oMz4KKwkJPHA+CisJCQk8c3Ryb25nPldBUk5JTkcgOiBDdXJyZW50bHkgdW5kZXIgdGVzdDwvc3Ryb25nPgorCQk8L3A+CisJCTxoNCBpZD0iY21ha2UyIj5DTWFrZTwvaDQ+CisJCTxwPlVzZSB0aGUgV2luZG93cyBpbnN0YWxsZXIgZm91bmQgCisJCQk8YSBocmVmPSJodHRwczovL2NtYWtlLm9yZy9kb3dubG9hZC8iPmhlcmU8L2E+CisJCTwvcD4KKwkJPGg0IGlkPSJtc3lzMiI+TVNZUzI8L2g0PgorCQk8cD5Gb2xsb3cgdGhlIGluc3RydWN0aW9ucyBvZiBJTlNUQUxMX01TWVMubWQuPC9wPgorCQk8aDQgaWQ9ImN2YzQyIj5DVkM0PC9oND4KKwkJPHA+RG93bmxvYWQgdGhlIHNvdXJjZXMgYXJjaGl2ZSAKKwkJCTxhIGhyZWY9Imh0dHA6Ly9jdmM0LmNzLm55dS5lZHUvYnVpbGRzL3NyYy9jdmM0LTEuNC50YXIuZ3oiPmN2YzQtMS40LnRhci5nejwvYT4KKwkJPC9wPgorCQk8cD4KKwkJCTxzdHJvbmc+VE8gQkUgQ09OVElOVUVEPC9zdHJvbmc+CisJCTwvcD4KKwkJPGgyIGlkPSJzdGFuZGFyZC1idWlsZCI+U3RhbmRhcmQgQnVpbGQ8L2gyPgorCQk8cD5MYXVuY2ggY21ha2UgKG9yIGNNYWtlLWd1aSksIHNldCB0aGUgc291cmNlIGRpcmVjdG9yeSBhbmQgdGhlIGRlc2lyZWQgYnVpbGQgZGlyZWN0b3J5LgorCQkJQ2hvb3NlIGEgdmFsaWQgZ2VuZXJhdG9yLCBzZWxlY3QgeW91ciBjb21waWxlcnMgKG5hdGl2ZSBjb21waWxlcnMgYXJlIHJlY29tbWVuZGVkKSwgY29uZmlndXJlIGFuZCBnZW5lcmF0ZS4KKwkJCUlmIHlvdXIgcHJlcmVxdWlzaXRlcyBhcmUgaW5zdGFsbGVkIGluIG5vbi1zdGFuZGFyZCBsb2NhdGlvbnMsIHlvdSdsbCBoYXZlIHRvIHNldCAKKwkJCTxjb2RlPiZsdDtQUkVSRVFVSVNJVEUmZ3Q7X1JPT1Q8L2NvZGU+IHZhcmlhYmxlKHMpIGluIHRoZSBDTWFrZSBjYWNoZSBlZGl0b3IuCisJCQk8YnIvPgorCQk8L3A+CisJCTxwPlRoZW4gYnVpbGQgdGhlIHByb2plY3QgdXNpbmcgdGhlIGJ1aWx0LWluIGNvbW1hbmRzIG9mIHRoZSBnZW5lcmF0b3IgOgorCQkJPGJyLz4KKwkJPC9wPgorCQk8dWw+CisJCQk8bGk+V2l0aCAiVW5peCBNYWtlZmlsZXMiLCBzaW1wbHkgZG8gCisJCQkJPGNvZGU+bWFrZTwvY29kZT4gaW4gdGhlIGJ1aWxkIGRpcmVjdG9yeS4KKwkJCTwvbGk+CisJCTwvdWw+CisJCTxwPkEgdGhlIGVuZCBvZiB0aGUgcHJvY2VzcywgdGhlIHN5bWJleCBleGVjdXRhYmxlIGlzIGJ1aWx0IGFuZCBjYW4gYmUgY2hlY2tlZCB1c2luZworCQkJPGJyLz4KKwkJCTxjb2RlPnN5bWJleCAtdGVzdDwvY29kZT4uCisJCTwvcD4KKwkJPGgyIGlkPSJidWlsZC1jdXN0b21pemF0aW9uLWZvci1kZXZlbG9wZXJzIj5CdWlsZCBDdXN0b21pemF0aW9uIChmb3IgZGV2ZWxvcGVycyk8L2gyPgorCQk8cD5UbyBjdXN0b21pemUgdGhlIGJ1aWxkLCB5b3UnbGwgaGF2ZSB0byBtb2RpZnkgQ01ha2UgRmlsZXMuIEFsbCBDTWFrZSBmaWxlcyBhcmUgCisJCQk8Y29kZT5DTWFrZUxpc3RzLnR4dDwvY29kZT4gb3IgCisJCQk8Y29kZT4qLmNtYWtlPC9jb2RlPi4KKwkJCUVhY2ggcHJvamVjdCB0YXJnZXQgKG1haW4gZXhlY3V0YWJsZSBhbmQgaW50ZXJuYWwgbGlicmFyaWVzKSBpcyBhc3NvY2lhdGVkIHdpdGggYSAKKwkJCTxjb2RlPkNNYWtlTGlzdHMudHh0PC9jb2RlPiBpbiB3aGljaCBldmVyeSB0aGluZyBzcGVjaWZpYyB0byB0aGlzIHRhcmdldCBhcmUgZGVmaW5lZC4gQWxsIHRoaW5ncyByZWxhdGl2ZSB0byB0aGUgcHJvamVjdCBhcyBhIHdob2xlIChwcmVyZXF1aXNpdGVzLCBjbWFrZSBkZXRlY3Rpb24gbW9kdWxlLCAuLi4pIGFyZSBzdG9yZWQgc3RvcmVkIGluIHRoZSBjbWFrZSBkaXJlY3RvcnkuCisJCTwvcD4KKwkJPGgzIGlkPSJzZXQtY29tcGlsYXRpb24tb3B0aW9ucyI+U2V0IGNvbXBpbGF0aW9uIG9wdGlvbnM8L2gzPgorCQk8cD5PcHRpb25zIHdoaWNoIGhvbGQgZm9yIGFsbCB0YXJnZXQgYW5kIHdoYXRldmVyIHRoZSBwbGF0Zm9ybSBhcmUgc2V0IGluIAorCQkJPGNvZGU+RGVmaW5lR2VuZXJpYy5jbWFrZTwvY29kZT4KKwkJCU9wdGlvbnMgd2hpY2ggaG9sZCBmb3IgYWxsIHRhcmdldCBhbmQgYXJlIHBsYXRmb3JtLXNwZWNpZmljIGFyZSBzZXQgaW4gCisJCQk8Y29kZT4mbHQ7UGxhdGZvcm0mZ3Q7U3BlY2lmaWMuY21ha2U8L2NvZGU+LgorCQkJT3B0aW9ucyB3aGljaCBob2xkIGZvciBvbmUgdGFyZ2V0IGFuZCB3aGF0ZXZlciB0aGUgcGxhdGZvcm0gYXJlIHNldCBpbiB0aGUgCisJCQk8Y29kZT5DTWFrZUxpc3RzLnR4dDwvY29kZT4gb2YgdGhpcyB0YXJnZXQuCisJCTwvcD4KKwkJPGgzIGlkPSJtb2RpZnktbGluay1jb21tYW5kLWxpbmUiPk1vZGlmeSBsaW5rIGNvbW1hbmQgbGluZTwvaDM+CisJCTxwPk1haW4gdGFyZ2V0IGxpbmsgaXMgZGVmaW5lZCBpbiAKKwkJCTxjb2RlPkxpbmtNYWluVGFyZ2V0LmNtYWtlPC9jb2RlPgorCQk8L3A+CisJCTxoMyBpZD0iY2hhbmdlLXByZXJlcXVpc2l0ZXMtbG9vay11cC1hZGQtYS1uZXgtcHJlcmVxdWlzaXRlIj5DaGFuZ2UgcHJlcmVxdWlzaXRlcyBsb29rLXVwIC8gQWRkIGEgbmV4IHByZXJlcXVpc2l0ZTwvaDM+CisJCTxwPlByZXJlcXVpc2l0ZXMgYXJlIGRlZmluZWQgYW5kIHNlYXJjaGVkIGZvciBpbiAKKwkJCTxjb2RlPkxvb2tGb3JNYW5kYXRvcnlQcmVyZXF1aXNpdGVzLmNtYWtlPC9jb2RlPi4KKwkJCTxici8+CisJCQlIZXJlIHlvdSBjYW4gYWRkIGEgbmV3IHByZXJlcXVpc2l0ZSBvciBjaGFuZ2UgdGhlIHdheSBhbiBleGlzdGluZyBwcmVyZXF1aXNpdGUgaXMgc2VhcmNoIGZvci4KKwkJPC9wPgorCQk8aDMgaWQ9ImNoYW5nZS1wcm9qZWN0LXN0cnVjdHVyZS13aXRob3V0LWFkZGluZy1hLW5ldy10YXJnZXQiPkNoYW5nZSBwcm9qZWN0IHN0cnVjdHVyZSB3aXRob3V0IGFkZGluZyBhIG5ldyB0YXJnZXQ8L2gzPgorCQk8cD5TaW1wbHkgYWRkIGEgbmV3IHN1YmRpcmVjdG9yeShpZXMpIGludG8gZXhpc3RpbmcgdGFyZ2V0KHMpIHNvdXJjZSBoaWVyYXJjaHkuPC9wPgorCQk8aDMgaWQ9ImFkZC1hLW5ldy10YXJnZXQiPkFkZCBhIG5ldyB0YXJnZXQ8L2gzPgorCQk8cD5UbyBhZGQgYSBuZXcgCisJCQk8Y29kZT5uZXd0YXJnZXQ8L2NvZGU+IHRvIHRoZSBwcm9qZWN0LCB5b3UgaGF2ZSB0byA6CisJCQk8YnIvPgorCQk8L3A+CisJCTxvbD4KKwkJCTxsaT5DcmVhdGUgdGhlIAorCQkJCTxjb2RlPm5ld3RhcmdldDwvY29kZT4gc291cmNlIGhpZXJhcmNoeSBpbiAKKwkJCQk8Y29kZT5zcmMvbmV3dGFyZ2V0LzwvY29kZT4KKwkJCTwvbGk+CisJCQk8bGk+QWRkIGEgCisJCQkJPGNvZGU+Q01ha2VMaXN0cy50eHQ8L2NvZGU+IGludG8gdGFyZ2V0IHJvb3QgZGlyZWN0b3J5IAorCQkJCTxjb2RlPm5ld3RhcmdldC88L2NvZGU+IChpdCBpcyBlYXN5IHRvIGFkYXB0IGEgCisJCQkJPGNvZGU+Q01ha2VMaXN0cy50eHQ8L2NvZGU+IGZyb20gb3RoZXIgdGFyZ2V0cykKKwkJCTwvbGk+CisJCQk8bGk+QWRkIGEgbmV3IAorCQkJCTxjb2RlPmFkZF9zdWJkaXJlY3RvcnkgKG5ld3RhcmdldCk8L2NvZGU+IGluIAorCQkJCTxjb2RlPkRlZmluZVByb2plY3RTdHJ1Y3R1cmUuY21ha2U8L2NvZGU+IHRvIG1ha2UgQ01ha2UgYXdhcmUgdG8gdGhlIG5ldyBzb3VyY2VzCisJCQk8L2xpPgorCQkJPGxpPkNvbXBsZXRlIAorCQkJCTxjb2RlPkxpbmtNYWluVGFyZ2V0LmNtYWtlPC9jb2RlPiBieSBhZGRpbmcgCisJCQkJPGNvZGU+bmV3dGFyZ2V0PC9jb2RlPiB0byB0aGUgbGluayBsaW5lLgorCQkJPC9saT4KKwkJPC9vbD4KKwk8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY21ha2UvSU5TVEFMTF90bXAubWQgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jbWFrZS9JTlNUQUxMX3RtcC5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmYzYzU4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY21ha2UvSU5TVEFMTF90bXAubWQKQEAgLTAsMCArMSwxMzUgQEAKKyMgRUZNLVNZTUJFWCA6IEJ1aWxkIGFuZCBJbnN0YWxsYXRpb24gSW5zdHJ1Y3Rpb25zCisKKyMjIE92ZXJ2aWV3CitJbiBvcmRlciB0byBidWlsZCBFRk0tU1lNQkVYLCB5b3UnbGwgbmVlZCA6ICAKKyogW0NNYWtlXShodHRwczovL2NtYWtlLm9yZy9kb3dubG9hZC8pLCAyLjggb3IgaGlnaGVyCisqIFtCb29zdF0oaHR0cDovL3d3dy5ib29zdC5vcmcvdXNlcnMvZG93bmxvYWQvKSwgMS41MyBvciBoaWdoZXIKKyogW0dNUF0oaHR0cHM6Ly9nbXBsaWIub3JnLyksIDIuNS4xLjMKKyogW0FOVExSMl0oaHR0cDovL3d3dy5hbnRscjIub3JnKSwgQyBiaW5kaW5ncyBsaWJyYXJ5LCAyLjcuNworKiBbQU5UTFIzXShodHRwOi8vd3d3LmFudGxyMy5vcmcpLCBDIGJpbmRpbmdzIGxpYnJhcnksIDMuNAorKiBbQ1ZDNF0oaHR0cDovL2N2YzQuY3Mubnl1LmVkdSksIDEuMy4xIG9yIGhpZ2hlcgorKiBbT21lZ2FdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXZld2F0aGF2ZXJmb3JkL3RoZS1vbWVnYS1wcm9qZWN0KQorIAorRUZNLVNZTUJFWCBidWlsZCBpcyBkcml2ZW4gYnkgQ01ha2UgYW5kIHRlc3RlZCB3aXRoIHRoZSBmb2xsb3dpbmcgZ2VuZXJhdG9ycyA6IAorCisqIFVuaXggTWFrZWZpbGVzIChuYXRpdmUgY29tcGlsZXJzKQorCisjIyBQcmVyZXF1aXNpdGVzIGluc3RhbGxhdGlvbgorCisjIyMgQmluYXJpZXMgKGFsbW9zdCkgaW5zdGFsbGF0aW9uIG9uIExpbnV4CisKK0ZvbGxvd2luZyBpbnN0cnVjdGlvbnMgYXJlIGdpdmVuIGZvciBkZWJpYW4tbGlrZSBkaXN0cmlidXRpb25zLiBZb3Ugc2hvdWxkIGFkYXB0IHRoZW0gdG8gdGhlIHBhY2thZ2UgbWFuYWdlciB1c2VkIGJ5IHlvdXIgZGlzdHJpYnV0aW9uLiAgIAorCisjIyMjIENNYWtlIAorYHN1ZG8gYXB0LWdldCBpbnN0YWxsIGNtYWtlYCAgCitgc3VkbyBhcHQtZ2V0IGluc3RhbGwgY21ha2UtZ3VpYCAgCisKKyMjIyMgQm9vc3QKK2BzdWRvIGFwdC1nZXQgaW5zdGFsbCBib29zdC0xLjUzYCAgCisKKyMjIyMgR01QCitgc3VkbyBhcHQtZ2V0IGluc3RhbGwgbGliZ21wLWRldmAgICAKKworIyMjIyBBTlRMUjIgIAorYHN1ZG8gYXB0LWdldCBpbnN0YWxsIGxpYmFudGxyLWRldmAgICAKKworIyMjIyBBTlRMUjMKK0FzIG5vIEFOVExSIDMuNCBwYWNrYWdlIHNlZW1zIGF2YWlsYWJsZSwgaXQgaXMgbmVjZXNzYXJ5IHRvIGNvbXBpbGUgYSBzb3VyY2UgZGlzdHJpYnV0aW9uIDogCitEb3dubG9hZCBbbGliYW50bHIzYy0zLjQudGFyLmd6XShodHRwOi8vd3d3LmFudGxyMy5vcmcvZG93bmxvYWQvQy9saWJhbnRscjNjLTMuNC50YXIuZ3opIHRoZW4gOiAgCisgCitgdGFyIHp4dmYgbGliYW50bHIzYy0zLjQudGFyLmd6YCAgCitgLi9jb25maWd1cmUgLS1lbmFibGUtc3RhdGljPXRydWUgLS1lbmFibGUtc2hhcmVkPWZhbHNlYCwgYWRkIGAtLWVuYWJsZS02NGJpdGAgYWNjb3JkaW5nIHRvIHlvdXIgc3lzdGVtLiAgCitgbWFrZWAgIAorYG1ha2UgY2hlY2tgICAKK2BzdWRvIG1ha2UgaW5zdGFsbGAgIAorICAgIAorSGVhZGVycyBhbmQgbGlicmFyeSBzaG91bGQgYmUgYXV0b21hdGljYWxseSBpbnN0YWxsZWQgaW4gL3Vzci9sb2NhbC4gVXNlIGAuXGNvbmZpZ3VyZSAtLXByZWZpeD08eW91cnBhdGg+YCB0byBpbnN0YWxsIGluIGFub3RoZXIgbG9jYXRpb24uIEluIHRoaXMgY2FzZSwgeW91J2xsIG5lZWQgdG8gc2V0IGBBTlRMUjNfUk9PVGAgdmFyaWFibGUgdG8gdGhpcyBsb2NhdGlvbiBmb3IgQ01ha2UgdG8ga25vdyBhYm91dCBpdC4gIAorCisjIyMjIENWQzQKK0FkZCB0aGUgZm9sbG93aW5nIGxpbmVzIGluIGAvZXRjL2FwdC9zb3VyY2VzLmxpc3RgIDogIAorCitgZGViIGh0dHA6Ly9jdmM0LmNzLm55dS5lZHUvZGViaWFuLyBzdGFibGUvYAorYGRlYiBodHRwOi8vY3ZjNC5jcy5ueXUuZWR1L2RlYmlhbiB1bnN0YWJsZS9gCitgZGViX3NyYyBodHRwOi8vY3ZjNC5jcy5ueXUuZWR1L2RlYmlhbiB1bnN0YWJsZS9gICAKKworVGhlbiBkbyA6ICAKKworYHN1ZG8gYXB0LWdldCB1cGRhdGVgICAKK2BzdWRvIGFwdC1nZXQgaW5zdGFsbCBjdmM0IGxpYmN2YzQtZGV2YCAgCisKKyMjIyMgT21lZ2EKK05vIHBhY2thZ2UgYmVpbmcgYXZhaWxhYmxlIGZvciBPbWVnYSwgaXQgaXMgbmVjZXNzYXJ5IHRvIGNvbXBpbGUgYSBzb3VyY2UgZGlzdHJpYnV0aW9uLiBDbG9uZSB0aGUgc291cmNlIHJlcG9zaXRvcnkgOiAgCisKK2BnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL2RhdmV3YXRoYXZlcmZvcmQvdGhlLW9tZWdhLXByb2plY3QuZ2l0YCAgCisKK1RoZW4gZG8gOiAKKworYG1ha2UgZGVwZW5kc2AgIAorYG1ha2UgbGlib21lZ2EuYWAgIAorYHN1ZG8gbWFrZSBpbnN0YWxsYAorICAKK0hlYWRlcnMgYW5kIGxpYnJhcnkgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgaW5zdGFsbGVkIGluIC91c3IvbG9jYWwuIFVzZSAuXGNvbmZpZ3VyZSAtLXByZWZpeD0vdXNyL2xvY2FsIHRvIGluc3RhbGwgaW4gYW5vdGhlciBsb2NhdGlvbi4gSW4gdGhpcyBjYXNlLCB5b3UnbGwgbmVlZCB0byBzZXQgYE9NRUdBX1JPT1RgIHZhcmlhYmxlIHRvIHRoaXMgbG9jYXRpb24gZm9yIENNYWtlIHRvIGtub3cgYWJvdXQgaXQuIAorCisjIyMgU291cmNlcyBpbnN0YWxsYXRpb24gb24gTGludXgKKyoqVE8gQkUgRE9ORSoqCisKKyMjIyBTb3VyY2VzIGluc3RhbGxhdGlvbiBvbiBXaW5kb3dzL01pbkdXL01TWVMyIAorKipXQVJOSU5HIDogQ3VycmVudGx5IHVuZGVyIHRlc3QqKgorCisjIyMjIENNYWtlCitVc2UgdGhlIFdpbmRvd3MgaW5zdGFsbGVyIGZvdW5kIFtoZXJlXShodHRwczovL2NtYWtlLm9yZy9kb3dubG9hZC8pCisKKyMjIyMgTVNZUzIKK0ZvbGxvdyBpbnN0cnVjdGlvbnMgb2YgSU5TVEFMTF9NU1lTLm1kLgorCisjIyMjIENWQzQKK0Rvd25sb2FkIHRoZSBzb3VyY2VzIGFyY2hpdmUgW2N2YzQtMS40LnRhci5nel0oaHR0cDovL2N2YzQuY3Mubnl1LmVkdS9idWlsZHMvc3JjL2N2YzQtMS40LnRhci5neikKKworKipUTyBCRSBDT05USU5VRUQqKgorCisjIyBTdGFuZGFyZCBCdWlsZCAKK0xhdW5jaCBjbWFrZSAob3IgY01ha2UtZ3VpKSwgc2V0IHRoZSBzb3VyY2UgZGlyZWN0b3J5IGFuZCB0aGUgZGVzaXJlZCBidWlsZCBkaXJlY3RvcnkuCitDaG9vc2UgYSB2YWxpZCBnZW5lcmF0b3IsIHNlbGVjdCB5b3VyIGNvbXBpbGVycyAobmF0aXZlIGNvbXBpbGVycyBhcmUgcmVjb21tZW5kZWQpLCBjb25maWd1cmUgYW5kIGdlbmVyYXRlLgorSWYgeW91ciBwcmVyZXF1aXNpdGVzIGFyZSBpbnN0YWxsZWQgaW4gbm9uLXN0YW5kYXJkIGxvY2F0aW9ucywgeW91J2xsIGhhdmUgdG8gc2V0IGA8UFJFUkVRVUlTSVRFPl9ST09UYCB2YXJpYWJsZShzKSBpbiB0aGUgQ01ha2UgY2FjaGUgZWRpdG9yLiAgCisKK1RoZW4gYnVpbGQgdGhlIHByb2plY3QgdXNpbmcgdGhlIGJ1aWx0LWluIGNvbW1hbmRzIG9mIHRoZSBnZW5lcmF0b3IgOiAgCisqIFdpdGggIlVuaXggTWFrZWZpbGVzIiwgc2ltcGx5IGRvIGBtYWtlYCBpbiB0aGUgYnVpbGQgZGlyZWN0b3J5LgorCitBIHRoZSBlbmQgb2YgdGhlIHByb2Nlc3MsIHRoZSBzeW1iZXggZXhlY3V0YWJsZSBpcyBidWlsdCBhbmQgY2FuIGJlIGNoZWNrZWQgdXNpbmcgIGBzeW1iZXggLXRlc3QgYC4KKworIyMgQ3VzdG9taXplIHRoZSBCdWlsZCAoZm9yIGRldmVsb3BlcnMpCitUbyBjdXN0b21pemUgdGhlIGJ1aWxkLCB5b3UnbGwgaGF2ZSB0byBtb2RpZnkgQ01ha2UgRmlsZXMuIEFsbCBDTWFrZSBmaWxlcyBhcmUgYENNYWtlTGlzdHMudHh0YCBvciBgKi5jbWFrZWAuCitFYWNoIHByb2plY3QgdGFyZ2V0IChtYWluIGV4ZWN1dGFibGUgYW5kIGludGVybmFsIGxpYnJhcmllcykgaXMgYXNzb2NpYXRlZCB3aXRoIGEgYENNYWtlTGlzdHMudHh0YCBpbiB3aGljaCBldmVyeSB0aGluZyBzcGVjaWZpYyB0byB0aGlzIHRhcmdldCBhcmUgZGVmaW5lZC4gQWxsIHRoaW5ncyByZWxhdGl2ZSB0byB0aGUgcHJvamVjdCBhcyBhIHdob2xlIChwcmVyZXF1aXNpdGVzLCBjbWFrZSBkZXRlY3Rpb24gbW9kdWxlLCAuLi4pIGFyZSBzdG9yZWQgc3RvcmVkIGluIHRoZSBjbWFrZSBkaXJlY3RvcnkuCisKKyMjIyBTZXQgY29tcGlsYXRpb24gb3B0aW9ucworT3B0aW9ucyB3aGljaCBob2xkIGZvciBhbGwgdGFyZ2V0IGFuZCB3aGF0ZXZlciB0aGUgcGxhdGZvcm0gYXJlIHNldCBpbiBgRGVmaW5lR2VuZXJpYy5jbWFrZWAKK09wdGlvbnMgd2hpY2ggaG9sZCBmb3IgYWxsIHRhcmdldCBhbmQgYXJlIHBsYXRmb3JtLXNwZWNpZmljIGFyZSBzZXQgaW4gYDxQbGF0Zm9ybT5TcGVjaWZpYy5jbWFrZWAuCitPcHRpb25zIHdoaWNoIGhvbGQgZm9yIG9uZSB0YXJnZXQgYW5kIHdoYXRldmVyIHRoZSBwbGF0Zm9ybSBhcmUgc2V0IGluIHRoZSBgQ01ha2VMaXN0cy50eHRgIG9mIHRoaXMgdGFyZ2V0LgorCisjIyMgTW9kaWZ5IGxpbmsgY29tbWFuZCBsaW5lCitNYWluIHRhcmdldCBsaW5rIGlzIGRlZmluZWQgaW4gYExpbmtNYWluVGFyZ2V0LmNtYWtlYAorCisjIyMgQ2hhbmdlIHByZXJlcXVpc2l0ZXMgbG9vay11cCAvIEFkZCBhIG5leCBwcmVyZXF1aXNpdGUKK1ByZXJlcXVpc2l0ZXMgYXJlIGRlZmluZWQgYW5kIHNlYXJjaGVkIGZvciBpbiBgTG9va0Zvck1hbmRhdG9yeVByZXJlcXVpc2l0ZXMuY21ha2VgLiAgCitIZXJlIHlvdSBjYW4gYWRkIGEgbmV3IHByZXJlcXVpc2l0ZSBvciBjaGFuZ2UgdGhlIHdheSBhbiBleGlzdGluZyBwcmVyZXF1aXNpdGUgaXMgc2VhcmNoIGZvci4KKworIyMjIENoYW5nZSBwcm9qZWN0IHN0cnVjdHVyZSB3aXRob3V0IGFkZGluZyBhIG5ldyB0YXJnZXQKK1NpbXBseSBhZGQgYSBuZXcgc3ViZGlyZWN0b3J5KGllcykgaW50byBleGlzdGluZyB0YXJnZXQocykgc291cmNlIGhpZXJhcmNoeS4KKworIyMjIEFkZCBhIG5ldyB0YXJnZXQKK1RvIGFkZCBhIG5ldyBgbmV3dGFyZ2V0YCB0byB0aGUgcHJvamVjdCwgeW91IGhhdmUgdG8gOiAgCisxLiBDcmVhdGUgdGhlIGBuZXd0YXJnZXRgIHNvdXJjZSBoaWVyYXJjaHkgaW4gYHNyYy9uZXd0YXJnZXQvYAorMS4gQWRkIGEgYENNYWtlTGlzdHMudHh0YCBpbnRvIHRhcmdldCByb290IGRpcmVjdG9yeSBgbmV3dGFyZ2V0L2AgKGl0IGlzIGVhc3kgdG8gYWRhcHQgYSBgQ01ha2VMaXN0cy50eHRgIGZyb20gb3RoZXIgdGFyZ2V0cykKKzIuIEFkZCBhIG5ldyBgYWRkX3N1YmRpcmVjdG9yeSAobmV3dGFyZ2V0KWAgaW4gYERlZmluZVByb2plY3RTdHJ1Y3R1cmUuY21ha2VgIHRvIG1ha2UgQ01ha2UgYXdhcmUgdG8gdGhlIG5ldyBzb3VyY2VzCiszLiBDb21wbGV0ZSBgTGlua01haW5UYXJnZXQuY21ha2VgIGJ5IGFkZGluZyBgbmV3dGFyZ2V0YCB0byB0aGUgbGluayBsaW5lLgorCisKKworCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NtYWtlL0lOU1RBTExfdG1wLnhtbCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NtYWtlL0lOU1RBTExfdG1wLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDk4ZDk1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY21ha2UvSU5TVEFMTF90bXAueG1sCkBAIC0wLDAgKzEsMzA4IEBACis8P3htbCB2ZXJzaW9uPScxLjAnID8+Cis8IS0tCisgICAgQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICAgCisgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAgIAorICAgIENvbnRyaWJ1dG9yczoKKyAgICAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICAgICAgLSBJbml0aWFsIEFQSSBhbmQgSW1wbGVtZW50YXRpb24KKyAtLT4KKzwhRE9DVFlQRSBib29rIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBEb2NCb29rIFhNTCBWNC41Ly9FTiIgImh0dHA6Ly93d3cub2FzaXMtb3Blbi5vcmcvZG9jYm9vay94bWwvNC41L2RvY2Jvb2t4LmR0ZCI+Cis8Ym9vaz4KKwk8dGl0bGU+SU5TVEFMTF90bXA8L3RpdGxlPgorCTxjaGFwdGVyIGlkPSJlZm0tc3ltYmV4LWJ1aWxkLWFuZC1pbnN0YWxsYXRpb24taW5zdHJ1Y3Rpb25zIj4KKwkJPHRpdGxlPkVGTS1TWU1CRVggOiBCdWlsZCBhbmQgSW5zdGFsbGF0aW9uIEluc3RydWN0aW9uczwvdGl0bGU+CisJCTxzZWN0aW9uIGlkPSJvdmVydmlldyI+CisJCQk8dGl0bGU+T3ZlcnZpZXc8L3RpdGxlPgorCQkJPHBhcmE+SW4gb3JkZXIgdG8gYnVpbGQgRUZNLVNZTUJFWCwgeW91J2xsIG5lZWQgOgorPC9wYXJhPgorCQkJPGl0ZW1pemVkbGlzdD4KKwkJCQk8bGlzdGl0ZW0+CisJCQkJCTxwYXJhPgorCQkJCQkJPHVsaW5rIHVybD0iaHR0cHM6Ly9jbWFrZS5vcmcvZG93bmxvYWQvIj5DTWFrZTwvdWxpbms+LCAyLjggb3IgaGlnaGVyCisJCQkJCTwvcGFyYT4KKwkJCQk8L2xpc3RpdGVtPgorCQkJCTxsaXN0aXRlbT4KKwkJCQkJPHBhcmE+CisJCQkJCQk8dWxpbmsgdXJsPSJodHRwOi8vd3d3LmJvb3N0Lm9yZy91c2Vycy9kb3dubG9hZC8iPkJvb3N0PC91bGluaz4sIDEuNTMgb3IgaGlnaGVyCisJCQkJCTwvcGFyYT4KKwkJCQk8L2xpc3RpdGVtPgorCQkJCTxsaXN0aXRlbT4KKwkJCQkJPHBhcmE+CisJCQkJCQk8dWxpbmsgdXJsPSJodHRwczovL2dtcGxpYi5vcmcvIj5HTVA8L3VsaW5rPiwgMi41LjEuMworCQkJCQk8L3BhcmE+CisJCQkJPC9saXN0aXRlbT4KKwkJCQk8bGlzdGl0ZW0+CisJCQkJCTxwYXJhPgorCQkJCQkJPHVsaW5rIHVybD0iaHR0cDovL3d3dy5hbnRscjIub3JnIj5BTlRMUjI8L3VsaW5rPiwgQyBiaW5kaW5ncyBsaWJyYXJ5LCAyLjcuNworCQkJCQk8L3BhcmE+CisJCQkJPC9saXN0aXRlbT4KKwkJCQk8bGlzdGl0ZW0+CisJCQkJCTxwYXJhPgorCQkJCQkJPHVsaW5rIHVybD0iaHR0cDovL3d3dy5hbnRscjMub3JnIj5BTlRMUjM8L3VsaW5rPiwgQyBiaW5kaW5ncyBsaWJyYXJ5LCAzLjQKKwkJCQkJPC9wYXJhPgorCQkJCTwvbGlzdGl0ZW0+CisJCQkJPGxpc3RpdGVtPgorCQkJCQk8cGFyYT4KKwkJCQkJCTx1bGluayB1cmw9Imh0dHA6Ly9jdmM0LmNzLm55dS5lZHUiPkNWQzQ8L3VsaW5rPiwgMS4zLjEgb3IgaGlnaGVyCisJCQkJCTwvcGFyYT4KKwkJCQk8L2xpc3RpdGVtPgorCQkJCTxsaXN0aXRlbT4KKwkJCQkJPHBhcmE+CisJCQkJCQk8dWxpbmsgdXJsPSJodHRwczovL2dpdGh1Yi5jb20vZGF2ZXdhdGhhdmVyZm9yZC90aGUtb21lZ2EtcHJvamVjdCI+T21lZ2E8L3VsaW5rPgorCQkJCQk8L3BhcmE+CisJCQkJPC9saXN0aXRlbT4KKwkJCTwvaXRlbWl6ZWRsaXN0PgorCQkJPHBhcmE+RUZNLVNZTUJFWCBidWlsZCBpcyBkcml2ZW4gYnkgQ01ha2UgYW5kIHRlc3RlZCB3aXRoIHRoZSBmb2xsb3dpbmcgZ2VuZXJhdG9ycyA6IDwvcGFyYT4KKwkJCTxpdGVtaXplZGxpc3Q+CisJCQkJPGxpc3RpdGVtPgorCQkJCQk8cGFyYT5Vbml4IE1ha2VmaWxlcyAobmF0aXZlIGNvbXBpbGVycyk8L3BhcmE+CisJCQkJPC9saXN0aXRlbT4KKwkJCTwvaXRlbWl6ZWRsaXN0PgorCQk8L3NlY3Rpb24+CisJCTxzZWN0aW9uIGlkPSJwcmVyZXF1aXNpdGVzLWluc3RhbGxhdGlvbiI+CisJCQk8dGl0bGU+UHJlcmVxdWlzaXRlcyBpbnN0YWxsYXRpb248L3RpdGxlPgorCQkJPHNlY3Rpb24gaWQ9ImJpbmFyaWVzLWFsbW9zdC1pbnN0YWxsYXRpb24tb24tbGludXgiPgorCQkJCTx0aXRsZT5CaW5hcmllcyAoYWxtb3N0KSBpbnN0YWxsYXRpb24gb24gTGludXg8L3RpdGxlPgorCQkJCTxwYXJhPkZvbGxvd2luZyBpbnN0cnVjdGlvbnMgYXJlIGdpdmVuIGZvciBkZWJpYW4tbGlrZSBkaXN0cmlidXRpb25zLiBZb3Ugc2hvdWxkIGFkYXB0IHRoZW0gdG8gdGhlIHBhY2thZ2UgbWFuYWdlciB1c2VkIGJ5IHlvdXIgZGlzdHJpYnV0aW9uLgorPC9wYXJhPgorCQkJCTxzZWN0aW9uIGlkPSJjbWFrZSI+CisJCQkJCTx0aXRsZT5DTWFrZTwvdGl0bGU+CisJCQkJCTxwYXJhPgorCisJCQkJCQk8Y29kZT5zdWRvIGFwdC1nZXQgaW5zdGFsbCBjbWFrZTwvY29kZT4KKworCisKKwkJCQkJCTxjb2RlPnN1ZG8gYXB0LWdldCBpbnN0YWxsIGNtYWtlLWd1aTwvY29kZT4KKworCQkJCQk8L3BhcmE+CisJCQkJPC9zZWN0aW9uPgorCQkJCTxzZWN0aW9uIGlkPSJib29zdCI+CisJCQkJCTx0aXRsZT5Cb29zdDwvdGl0bGU+CisJCQkJCTxwYXJhPgorCisJCQkJCQk8Y29kZT5zdWRvIGFwdC1nZXQgaW5zdGFsbCBib29zdC0xLjUzPC9jb2RlPgorCisJCQkJCTwvcGFyYT4KKwkJCQk8L3NlY3Rpb24+CisJCQkJPHNlY3Rpb24gaWQ9ImdtcCI+CisJCQkJCTx0aXRsZT5HTVA8L3RpdGxlPgorCQkJCQk8cGFyYT4KKworCQkJCQkJPGNvZGU+c3VkbyBhcHQtZ2V0IGluc3RhbGwgbGliZ21wLWRldjwvY29kZT4KKworCQkJCQk8L3BhcmE+CisJCQkJPC9zZWN0aW9uPgorCQkJCTxzZWN0aW9uIGlkPSJhbnRscjIiPgorCQkJCQk8dGl0bGU+QU5UTFIyPC90aXRsZT4KKwkJCQkJPHBhcmE+CisKKwkJCQkJCTxjb2RlPnN1ZG8gYXB0LWdldCBpbnN0YWxsIGxpYmFudGxyLWRldjwvY29kZT4KKworCQkJCQk8L3BhcmE+CisJCQkJPC9zZWN0aW9uPgorCQkJCTxzZWN0aW9uIGlkPSJhbnRscjMiPgorCQkJCQk8dGl0bGU+QU5UTFIzPC90aXRsZT4KKwkJCQkJPHBhcmE+QXMgbm8gQU5UTFIgMy40IHBhY2thZ2Ugc2VlbXMgYXZhaWxhYmxlLCBpdCBpcyBuZWNlc3NhcnkgdG8gY29tcGlsZSBhIHNvdXJjZSBkaXN0cmlidXRpb24gOiAKKwkJCQkJCURvd25sb2FkIAorCQkJCQkJPHVsaW5rIHVybD0iaHR0cDovL3d3dy5hbnRscjMub3JnL2Rvd25sb2FkL0MvbGliYW50bHIzYy0zLjQudGFyLmd6Ij5saWJhbnRscjNjLTMuNC50YXIuZ3o8L3VsaW5rPiB0aGVuIDoKKworCisKKwkJCQkJCTxjb2RlPnRhciB6eHZmIGxpYmFudGxyM2MtMy40LnRhci5nejwvY29kZT4KKworCisKKwkJCQkJCTxjb2RlPi4vY29uZmlndXJlIC0tZW5hYmxlLXN0YXRpYz10cnVlIC0tZW5hYmxlLXNoYXJlZD1mYWxzZTwvY29kZT4sIGFkZCAKKwkJCQkJCTxjb2RlPi0tZW5hYmxlLTY0Yml0PC9jb2RlPiBhY2NvcmRpbmcgdG8geW91ciBzeXN0ZW0uCisKKworCisJCQkJCQk8Y29kZT5tYWtlPC9jb2RlPgorCisKKworCQkJCQkJPGNvZGU+bWFrZSBjaGVjazwvY29kZT4KKworCisKKwkJCQkJCTxjb2RlPnN1ZG8gbWFrZSBpbnN0YWxsPC9jb2RlPgorCisJCQkJCTwvcGFyYT4KKwkJCQkJPHBhcmE+SGVhZGVycyBhbmQgbGlicmFyeSBzaG91bGQgYmUgYXV0b21hdGljYWxseSBpbnN0YWxsZWQgaW4gL3Vzci9sb2NhbC4gVXNlIAorCQkJCQkJPGNvZGU+Llxjb25maWd1cmUgLS1wcmVmaXg9Jmx0O3lvdXJwYXRoJmd0OzwvY29kZT4gdG8gaW5zdGFsbCBpbiBhbm90aGVyIGxvY2F0aW9uLiBJbiB0aGlzIGNhc2UsIHlvdSdsbCBuZWVkIHRvIHNldCAKKwkJCQkJCTxjb2RlPkFOVExSM19ST09UPC9jb2RlPiB2YXJpYWJsZSB0byB0aGlzIGxvY2F0aW9uIGZvciBDTWFrZSB0byBrbm93IGFib3V0IGl0LgorCisJCQkJCTwvcGFyYT4KKwkJCQk8L3NlY3Rpb24+CisJCQkJPHNlY3Rpb24gaWQ9ImN2YzQiPgorCQkJCQk8dGl0bGU+Q1ZDNDwvdGl0bGU+CisJCQkJCTxwYXJhPkFkZCB0aGUgZm9sbG93aW5nIGxpbmVzIGluIAorCQkJCQkJPGNvZGU+L2V0Yy9hcHQvc291cmNlcy5saXN0PC9jb2RlPiA6CisKKworCisJCQkJCQk8Y29kZT5kZWIgaHR0cDovL2N2YzQuY3Mubnl1LmVkdS9kZWJpYW4vIHN0YWJsZS88L2NvZGU+CisKKworCQkJCQkJPGNvZGU+ZGViIGh0dHA6Ly9jdmM0LmNzLm55dS5lZHUvZGViaWFuIHVuc3RhYmxlLzwvY29kZT4KKworCisKKwkJCQkJCTxjb2RlPmRlYl9zcmMgaHR0cDovL2N2YzQuY3Mubnl1LmVkdS9kZWJpYW4gdW5zdGFibGUvPC9jb2RlPgorCisJCQkJCQlUaGVuIGRvIDoKKworCisKKwkJCQkJCTxjb2RlPnN1ZG8gYXB0LWdldCB1cGRhdGU8L2NvZGU+CisKKworCisJCQkJCQk8Y29kZT5zdWRvIGFwdC1nZXQgaW5zdGFsbCBjdmM0IGxpYmN2YzQtZGV2PC9jb2RlPgorCisJCQkJCTwvcGFyYT4KKwkJCQk8L3NlY3Rpb24+CisJCQkJPHNlY3Rpb24gaWQ9Im9tZWdhIj4KKwkJCQkJPHRpdGxlPk9tZWdhPC90aXRsZT4KKwkJCQkJPHBhcmE+Tm8gcGFja2FnZSBiZWluZyBhdmFpbGFibGUgZm9yIE9tZWdhLCBpdCBpcyBuZWNlc3NhcnkgdG8gY29tcGlsZSBhIHNvdXJjZSBkaXN0cmlidXRpb24uCisKKwkJCQkJCUNsb25lIHRoZSBzb3VyY2UgcmVwb3NpdG9yeSA6CisKKworCisJCQkJCQk8Y29kZT5naXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL2RhdmV3YXRoYXZlcmZvcmQvdGhlLW9tZWdhLXByb2plY3QuZ2l0PC9jb2RlPgorCisJCQkJCQlUaGVuIGRvIDogCisKKworCQkJCQkJPGNvZGU+bWFrZSBkZXBlbmRzPC9jb2RlPgorCisKKworCQkJCQkJPGNvZGU+bWFrZSBsaWJvbWVnYS5hPC9jb2RlPgorCisKKworCQkJCQkJPGNvZGU+c3VkbyBtYWtlIGluc3RhbGw8L2NvZGU+CisJCQkJCTwvcGFyYT4KKwkJCQkJPHBhcmE+SGVhZGVycyBhbmQgbGlicmFyeSBzaG91bGQgYmUgYXV0b21hdGljYWxseSBpbnN0YWxsZWQgaW4gL3Vzci9sb2NhbC4gVXNlIC5cY29uZmlndXJlIC0tcHJlZml4PS91c3IvbG9jYWwgdG8gaW5zdGFsbCBpbiBhbm90aGVyIGxvY2F0aW9uLiBJbiB0aGlzIGNhc2UsIHlvdSdsbCBuZWVkIHRvIHNldCAKKwkJCQkJCTxjb2RlPk9NRUdBX1JPT1Q8L2NvZGU+IHZhcmlhYmxlIHRvIHRoaXMgbG9jYXRpb24gZm9yIENNYWtlIHRvIGtub3cgYWJvdXQgaXQuIAorCQkJCQk8L3BhcmE+CisJCQkJPC9zZWN0aW9uPgorCQkJPC9zZWN0aW9uPgorCQkJPHNlY3Rpb24gaWQ9InNvdXJjZXMtaW5zdGFsbGF0aW9uLW9uLWxpbnV4Ij4KKwkJCQk8dGl0bGU+U291cmNlcyBpbnN0YWxsYXRpb24gb24gTGludXg8L3RpdGxlPgorCQkJCTxwYXJhPgorCQkJCQk8ZW1waGFzaXMgcm9sZT0iYm9sZCI+VE8gQkUgRE9ORTwvZW1waGFzaXM+CisJCQkJPC9wYXJhPgorCQkJPC9zZWN0aW9uPgorCQkJPHNlY3Rpb24gaWQ9InNvdXJjZXMtaW5zdGFsbGF0aW9uLW9uLXdpbmRvd3MtbWluZ3ctbXN5czIiPgorCQkJCTx0aXRsZT5Tb3VyY2VzIGluc3RhbGxhdGlvbiBvbiBXaW5kb3dzL01pbkdXL01TWVMyPC90aXRsZT4KKwkJCQk8cGFyYT4KKwkJCQkJPGVtcGhhc2lzIHJvbGU9ImJvbGQiPldBUk5JTkcgOiBDdXJyZW50bHkgdW5kZXIgdGVzdDwvZW1waGFzaXM+CisJCQkJPC9wYXJhPgorCQkJCTxzZWN0aW9uIGlkPSJjbWFrZTIiPgorCQkJCQk8dGl0bGU+Q01ha2U8L3RpdGxlPgorCQkJCQk8cGFyYT5Vc2UgdGhlIFdpbmRvd3MgaW5zdGFsbGVyIGZvdW5kIAorCQkJCQkJPHVsaW5rIHVybD0iaHR0cHM6Ly9jbWFrZS5vcmcvZG93bmxvYWQvIj5oZXJlPC91bGluaz4KKwkJCQkJPC9wYXJhPgorCQkJCTwvc2VjdGlvbj4KKwkJCQk8c2VjdGlvbiBpZD0ibXN5czIiPgorCQkJCQk8dGl0bGU+TVNZUzI8L3RpdGxlPgorCQkJCQk8cGFyYT5Gb2xsb3cgdGhlIGluc3RydWN0aW9ucyBvZiBJTlNUQUxMX01TWVMubWQuPC9wYXJhPgorCQkJCTwvc2VjdGlvbj4KKwkJCQk8c2VjdGlvbiBpZD0iY3ZjNDIiPgorCQkJCQk8dGl0bGU+Q1ZDNDwvdGl0bGU+CisJCQkJCTxwYXJhPkRvd25sb2FkIHRoZSBzb3VyY2VzIGFyY2hpdmUgCisJCQkJCQk8dWxpbmsgdXJsPSJodHRwOi8vY3ZjNC5jcy5ueXUuZWR1L2J1aWxkcy9zcmMvY3ZjNC0xLjQudGFyLmd6Ij5jdmM0LTEuNC50YXIuZ3o8L3VsaW5rPgorCQkJCQk8L3BhcmE+CisJCQkJCTxwYXJhPgorCQkJCQkJPGVtcGhhc2lzIHJvbGU9ImJvbGQiPlRPIEJFIENPTlRJTlVFRDwvZW1waGFzaXM+CisJCQkJCTwvcGFyYT4KKwkJCQk8L3NlY3Rpb24+CisJCQk8L3NlY3Rpb24+CisJCTwvc2VjdGlvbj4KKwkJPHNlY3Rpb24gaWQ9InN0YW5kYXJkLWJ1aWxkIj4KKwkJCTx0aXRsZT5TdGFuZGFyZCBCdWlsZDwvdGl0bGU+CisJCQk8cGFyYT5XaGF0ZXZlciB0aGUgcGxhdGZvcm0sIGxhdW5jaCBDTWFrZSAob3IgQ01ha2UtZ3VpKSwgc2V0IHRoZSBzb3VyY2VzIGRpcmVjdG9yeSBhbmQgdGhlIGRlc2lyZWQgYnVpbGQgZGlyZWN0b3J5LgorCQkJCUNob29zZSBhIHZhbGlkIGdlbmVyYXRvciwgc2VsZWN0IHlvdXIgY29tcGlsZXJzIChuYXRpdmUgY29tcGlsZXJzIGFyZSByZWNvbW1lbmRlZCksIGNvbmZpZ3VyZSBhbmQgZ2VuZXJhdGUuCisJCQkJSWYgeW91IGhhdmUgaW5zdGFsbGVkIHByZXJlcXVpc2l0ZXMgaW4gbm9uLXN0YW5kYXJkIGxvY2F0aW9ucywgeW91J2xsIGhhdmUgdG8gc2V0IDxQUkVSRVFVSVNJVEU+X1JPT1QgdmFyaWFibChzKWUgaW4gdGhlIENNYWtlIGNhY2hlIGVkaXRvci4KKzwvcGFyYT4KKwkJCTxwYXJhPlRoZW4gYnVpbGQgdGhlIHByb2plY3QgdXNpbmcgdGhlIGJ1aWx0LWluIGNvbW1hbmRzIG9mIHRoZSBnZW5lcmF0b3IgOgorPC9wYXJhPgorCQkJPGl0ZW1pemVkbGlzdD4KKwkJCQk8bGlzdGl0ZW0+CisJCQkJCTxwYXJhPldpdGggIlVuaXggTWFrZWZpbGVzIiwgc2ltcGx5IGRvIAorCQkJCQkJPGNvZGU+bWFrZTwvY29kZT4gaW4gdGhlIGJ1aWxkIGRpcmVjdG9yeS4KKwkJCQkJPC9wYXJhPgorCQkJCTwvbGlzdGl0ZW0+CisJCQk8L2l0ZW1pemVkbGlzdD4KKwkJCTxwYXJhPkEgdGhlIGVuZCBvZiB0aGUgcHJvY2VzcywgdGhlIHN5bWJleCBleGVjdXRhYmxlIGlzIGJ1aWx0IGFuZCBjYW4gYmUgY2hlY2tlZCB1c2luZworCisJCQkJPGNvZGU+c3ltYmV4IC10ZXN0PC9jb2RlPi4KKwkJCTwvcGFyYT4KKwkJPC9zZWN0aW9uPgorCQk8c2VjdGlvbiBpZD0iYnVpbGQtY3VzdG9taXphdGlvbi1mb3ItZGV2ZWxvcGVycyI+CisJCQk8dGl0bGU+QnVpbGQgQ3VzdG9taXphdGlvbiAoZm9yIGRldmVsb3BlcnMpPC90aXRsZT4KKwkJCTxwYXJhPlRvIGN1c3RvbWl6ZSB0aGUgYnVpbGQsIHlvdSdsbCBoYXZlIHRvIG1vZGlmeSBDTWFrZSBGaWxlcy4gQWxsIENNYWtlIGZpbGVzIGFyZSBDTWFrZUxpc3RzLnR4dCBvciAqLmNtYWtlLgorCQkJCUVhY2ggcHJvamVjdCB0YXJnZXQgKG1haW4gZXhlY3V0YWJsZSBhbmQgaW50ZXJuYWwgbGlicmFyaWVzKSBpcyBhc3NvY2lhdGVkIHdpdGggYSBDTWFrZUxpc3RzLnR4dCBpbiB3aGljaCBldmVyeSB0aGluZyBzcGVjaWZpYyB0byB0aGlzIHRhcmdldCBhcmUgZGVmaW5lZC4gQWxsIHRoaW5ncyByZWxhdGl2ZSB0byB0aGUgcHJvamVjdCBhcyBhIHdob2xlIChwcmVyZXF1aXNpdGVzLCBjbWFrZSBkZXRlY3Rpb24gbW9kdWxlLCAuLi4pIGFyZSBzdG9yZWQgc3RvcmVkIGluIHRoZSBzcmMvY21ha2UgZGlyZWN0b3J5LjwvcGFyYT4KKwkJCTxzZWN0aW9uIGlkPSJzZXQtY29tcGlsYXRpb24tb3B0aW9ucyI+CisJCQkJPHRpdGxlPlNldCBjb21waWxhdGlvbiBvcHRpb25zPC90aXRsZT4KKwkJCQk8cGFyYT5PcHRpb25zIHdoaWNoIGhvbGQgZm9yIGFsbCB0YXJnZXQgYW5kIHdoYXRldmVyIHRoZSBwbGF0Zm9ybSBhcmUgc2V0IGluIAorCQkJCQk8Y29kZT5EZWZpbmVHZW5lcmljLmNtYWtlPC9jb2RlPgorCQkJCQlPcHRpb25zIHdoaWNoIGhvbGQgZm9yIGFsbCB0YXJnZXQgYW5kIGFyZSBwbGF0Zm9ybS1zcGVjaWZpYyBhcmUgc2V0IGluIAorCQkJCQk8Y29kZT4mbHQ7UGxhdGZvcm0mZ3Q7U3BlY2lmaWMuY21ha2U8L2NvZGU+LgorCQkJCQlPcHRpb25zIHdoaWNoIGhvbGQgZm9yIG9uZSB0YXJnZXQgYW5kIHdoYXRldmVyIHRoZSBwbGF0Zm9ybSBhcmUgc2V0IGluIHRoZSAKKwkJCQkJPGNvZGU+Q01ha2VMaXN0cy50eHQ8L2NvZGU+IG9mIHRoaXMgdGFyZ2V0LgorCQkJCTwvcGFyYT4KKwkJCTwvc2VjdGlvbj4KKwkJCTxzZWN0aW9uIGlkPSJtb2RpZnktbGluay1jb21tYW5kLWxpbmUiPgorCQkJCTx0aXRsZT5Nb2RpZnkgbGluayBjb21tYW5kIGxpbmU8L3RpdGxlPgorCQkJCTxwYXJhPk1haW4gdGFyZ2V0IGxpbmsgaXMgZGVmaW5lZCBpbiAKKwkJCQkJPGNvZGU+TGlua01haW5UYXJnZXQuY21ha2U8L2NvZGU+CisJCQkJPC9wYXJhPgorCQkJPC9zZWN0aW9uPgorCQkJPHNlY3Rpb24gaWQ9ImNoYW5nZS1wcmVyZXF1aXNpdGVzLWxvb2stdXAtYWRkLWEtbmV4LXByZXJlcXVpc2l0ZSI+CisJCQkJPHRpdGxlPkNoYW5nZSBwcmVyZXF1aXNpdGVzIGxvb2stdXAgLyBBZGQgYSBuZXggcHJlcmVxdWlzaXRlPC90aXRsZT4KKwkJCQk8cGFyYT5QcmVyZXF1aXNpdGVzIGFyZSBkZWZpbmVkIGFuZCBzZWFyY2hlZCBmb3IgaW4gCisJCQkJCTxjb2RlPkxvb2tGb3JNYW5kYXRvcnlQcmVyZXF1aXNpdGVzLmNtYWtlPC9jb2RlPi4gSGVyZSB5b3UgYWRkIGEgbmV3IHByZXJlcXVpc2l0ZSBvciBjYW4gY2hhbmdlIHRoZSB3YXkgYW4gZXhpc3RpbmcgcHJlcmVxdWlzaXRlIGlzIHNlYXJjaCBmb3IuCisJCQkJPC9wYXJhPgorCQkJPC9zZWN0aW9uPgorCQkJPHNlY3Rpb24gaWQ9ImNoYW5nZS1wcm9qZWN0LXN0cnVjdHVyZS13aXRob3V0LWFkZGluZy1hLW5ldy10YXJnZXQiPgorCQkJCTx0aXRsZT5DaGFuZ2UgcHJvamVjdCBzdHJ1Y3R1cmUgd2l0aG91dCBhZGRpbmcgYSBuZXcgdGFyZ2V0PC90aXRsZT4KKwkJCQk8cGFyYT5TaW1wbHkgYWRkIGEgbmV3IHN1YmRpcmVjdG9yeShpZXMpIGludG8gZXhpc3RpbmcgdGFyZ2V0KHMpIHNvdXJjZSBoaWVyYXJjaHkuPC9wYXJhPgorCQkJPC9zZWN0aW9uPgorCQkJPHNlY3Rpb24gaWQ9ImFkZC1hLW5ldy10YXJnZXQiPgorCQkJCTx0aXRsZT5BZGQgYSBuZXcgdGFyZ2V0PC90aXRsZT4KKwkJCQk8cGFyYT5UbyBhZGQgYSBuZXcgdGFyZ2V0IDxuZXd0YXJnZXQ+LCB5b3UgbXVzdCA6Cis8L3BhcmE+CisJCQkJPG9yZGVyZWRsaXN0PgorCQkJCQk8bGlzdGl0ZW0+CisJCQkJCQk8cGFyYT5DcmVhdGUgdGhlIDxuZXd0YXJnZXQ+IHNvdXJjZSBoaWVyYXJjaHkgaW4gc3JjLzwvcGFyYT4KKwkJCQkJPC9saXN0aXRlbT4KKwkJCQkJPGxpc3RpdGVtPgorCQkJCQkJPHBhcmE+QWRkIGEgQ01ha2VMaXN0cy50eHQgaW50byA8bmV3dGFyZ2V0PiAoaXQgaXMgZWFzeSB0byBhZGFwdCBhIENNYWtlTGlzdHMudHh0IGZyb20gb3RoZXIgdGFyZ2V0cykgPC9wYXJhPgorCQkJCQk8L2xpc3RpdGVtPgorCQkJCQk8bGlzdGl0ZW0+CisJCQkJCQk8cGFyYT5BZGQgYSBuZXcgbGluZSAKKwkJCQkJCQk8Y29kZT5hZGRfc3ViZGlyZWN0b3J5ICgmbHQ7bmV3dGFyZ2V0Jmd0Oyk8L2NvZGU+IGluIAorCQkJCQkJCTxjb2RlPkRlZmluZVByb2plY3RTdHJ1Y3R1cmUuY21ha2U8L2NvZGU+CisJCQkJCQkJMy4KKwkJCQkJCTwvcGFyYT4KKwkJCQkJPC9saXN0aXRlbT4KKwkJCQkJPGxpc3RpdGVtPgorCQkJCQkJPHBhcmE+Q29tcGxldGUgCisJCQkJCQkJPGNvZGU+TGlua01haW5UYXJnZXQuY21ha2U8L2NvZGU+IGJ5IGFkZGluZyA8bmV3dGFyZ2V0PiB0byB0aGUgbGluayBsaW5lLgorCQkJCQkJPC9wYXJhPgorCQkJCQk8L2xpc3RpdGVtPgorCQkJCTwvb3JkZXJlZGxpc3Q+CisJCQk8L3NlY3Rpb24+CisJCTwvc2VjdGlvbj4KKwk8L2NoYXB0ZXI+Cis8L2Jvb2s+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY21ha2UvUHJpbnRCYW5uZXIuY21ha2UgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jbWFrZS9QcmludEJhbm5lci5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODliZjNmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY21ha2UvUHJpbnRCYW5uZXIuY21ha2UKQEAgLTAsMCArMSw3IEBACisjIEJhbm5lciANCisNCittZXNzYWdlIChTVEFUVVMgIlxuICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICANCisgLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXA0KKyB8ICAgICAgICBUaGlzIGlzIFN5bWJleCBidWlsZCBzeXN0ZW0gICAgICAgICAgICAgIHwNCisgXFxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fLw0KKyAiKQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbGxlY3Rpb24vQXJyYXkuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbGxlY3Rpb24vQXJyYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGQzODRmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29sbGVjdGlvbi9BcnJheS5oCkBAIC0wLDAgKzEsNTU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIENPTlRBSU5FUl9BUlJBWV9IXworI2RlZmluZSBDT05UQUlORVJfQVJSQVlfSF8KKworCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8dXRpbC9hdm1fYXNzZXJ0Lmg+CisjaW5jbHVkZSA8dXRpbC9hdm1fbnVtZXJpYy5oPgorI2luY2x1ZGUgPGJhc2UvU21hcnRQb2ludGVyVXRpbC5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CitjbGFzcyBBcnJheQoreworCitwcm90ZWN0ZWQ6CisJLyoKKwkgKiBBVFRSSUJVVEVTCisJICovCisJVCAqIG1UYWJsZTsKKworCWF2bV9zaXplX3QgbVNpemU7CisKKworcHVibGljOgorCS8qKgorCSAqIFRZUEVERUYKKwkgKiBpdGVyYXRvcgorCSAqIHJlZmVyZW5jZQorCSAqLworCXR5cGVkZWYgICAgICAgVCAqIGl0ZXJhdG9yOworCXR5cGVkZWYgY29uc3QgVCAqIGNvbnN0X2l0ZXJhdG9yOworCisJdHlwZWRlZiAgICAgICBUICYgcmVmZXJlbmNlOworCXR5cGVkZWYgY29uc3QgVCAmIGNvbnN0X3JlZmVyZW5jZTsKKworCXR5cGVkZWYgc3RkOjp2ZWN0b3I8IFQgPiAgQmFzZVZlY3RvcjsKKworCisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlBcnJheSgpCisJOiBtVGFibGUoIE5VTEwgKSwKKwltU2l6ZSggMCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlleHBsaWNpdCBBcnJheShhdm1fc2l6ZV90IGFTaXplKQorCTogbVRhYmxlKCBOVUxMICksCisJbVNpemUoIDAgKQorCXsKKwkJYWxsb2MoIGFTaXplICk7CisJfQorCisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIENvcHkKKwkgKi8KKwlBcnJheShjb25zdCBBcnJheSAmIGFuQXJyYXkpCisJOiBtVGFibGUoIE5VTEwgKSwKKwltU2l6ZSggMCApCisJeworCQlhbGxvYyggYW5BcnJheSApOworCX0KKworCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBPdGhlcnMKKwkgKi8KKwlleHBsaWNpdCBBcnJheShhdm1fc2l6ZV90IGFTaXplLCBjb25zdF9yZWZlcmVuY2UgZGVmYXVsdFZhbHVlKQorCTogbVRhYmxlKCBOVUxMICksCisJbVNpemUoIDAgKQorCXsKKwkJYWxsb2MoIGFTaXplICwgZGVmYXVsdFZhbHVlICk7CisJfQorCisJZXhwbGljaXQgQXJyYXkoY29uc3QgQmFzZVZlY3RvciAmIGFuQXJyYXkpCisJOiBtVGFibGUoIE5VTEwgKSwKKwltU2l6ZSggMCApCisJeworCQlhbGxvYyggYW5BcnJheSApOworCX0KKworCWV4cGxpY2l0IEFycmF5KGNvbnN0IEFycmF5ICYgYW5BcnJheSwKKwkJCWNvbnN0X3JlZmVyZW5jZSBsYXN0VmFsdWUpCisJOiBtVGFibGUoIE5VTEwgKSwKKwltU2l6ZSggMCApCisJeworCQlhbGxvYyggYW5BcnJheSAsIGxhc3RWYWx1ZSApOworCX0KKworCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+QXJyYXkoKQorCXsKKwkJZGVsZXRlW10gKCBtVGFibGUgKTsKKworCQltVGFibGUgPSBOVUxMOworCX0KKworCisJLyoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogUkVTRVQKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisKKwl2b2lkIHJlc2V0KFQgdmFsdWUpCisJeworCQlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMCA7IG9mZnNldCA8IG1TaXplIDsgKytvZmZzZXQgKQorCQl7CisJCQltVGFibGVbb2Zmc2V0XSA9IHZhbHVlOworCQl9CisJfQorCisKKwkvKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBBTExPQ0FUSU9OCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCisJaW5saW5lIHZvaWQgYWxsb2MoYXZtX3NpemVfdCBhU2l6ZSkKKwl7CisJCW1TaXplID0gYVNpemU7CisKKwkJbVRhYmxlID0gKCAobVNpemUgPiAwKT8gKG5ldyBUWyBtU2l6ZSBdKSA6IE5VTEwgKTsKKwl9CisKKworCWlubGluZSB2b2lkIGFsbG9jKGF2bV9zaXplX3QgYVNpemUsIFQgZGVmYXVsdFZhbHVlKQorCXsKKwkJYWxsb2MoIGFTaXplICk7CisKKwkJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDAgOyBvZmZzZXQgPCBtU2l6ZSA7ICsrb2Zmc2V0ICkKKwkJeworCQkJbVRhYmxlW29mZnNldF0gPSBkZWZhdWx0VmFsdWU7CisJCX0KKwl9CisKKworCWlubGluZSB2b2lkIGFsbG9jKGNvbnN0IEFycmF5ICYgYW5BcnJheSkKKwl7CisJCWFsbG9jKCBhbkFycmF5LnNpemUoKSApOworCisJCWZvciggYXZtX3NpemVfdCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgbVNpemUgOyArK29mZnNldCApCisJCXsKKwkJCW1UYWJsZVtvZmZzZXRdID0gYW5BcnJheVtvZmZzZXRdOworCQl9CisJfQorCisKKwlpbmxpbmUgdm9pZCBhbGxvYyhjb25zdCBBcnJheSAmIGFuQXJyYXksIFQgbGFzdFZhbHVlKQorCXsKKwkJYXZtX3NpemVfdCBhU2l6ZSA9IGFuQXJyYXkuc2l6ZSgpOworCQlhbGxvYyggYVNpemUgKyAxICk7CisKKwkJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDAgOyBvZmZzZXQgPCBhU2l6ZSA7ICsrb2Zmc2V0ICkKKwkJeworCQkJbVRhYmxlW29mZnNldF0gPSBhbkFycmF5W29mZnNldF07CisJCX0KKwkJbVRhYmxlW2FTaXplXSA9IGxhc3RWYWx1ZTsKKworCX0KKworCisJaW5saW5lIHZvaWQgYWxsb2MoY29uc3QgQmFzZVZlY3RvciAmIGFuQXJyYXkpCisJeworCQlhbGxvYyggYW5BcnJheS5zaXplKCkgKTsKKworCQlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMCA7IG9mZnNldCA8IG1TaXplIDsgKytvZmZzZXQgKQorCQl7CisJCQltVGFibGVbb2Zmc2V0XSA9IGFuQXJyYXlbb2Zmc2V0XTsKKwkJfQorCX0KKworCisKKwkvKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBSRS1BTExPQ0FUSU9OCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCisJaW5saW5lIHZvaWQgcmVhbGxvYyhhdm1fc2l6ZV90IGFTaXplKQorCXsKKwkJaWYoIG1TaXplICE9IGFTaXplICkKKwkJeworCQkJZGVsZXRlW10gKCBtVGFibGUgKTsKKworCQkJYWxsb2MoIGFTaXplICk7CisJCX0KKwl9CisKKworCWlubGluZSB2b2lkIHJlYWxsb2MoYXZtX3NpemVfdCBhU2l6ZSwgVCBkZWZhdWx0VmFsdWUpCisJeworCQlpZiggbVNpemUgIT0gYVNpemUgKQorCQl7CisJCQlkZWxldGVbXSAoIG1UYWJsZSApOworCisJCQlhbGxvYyggYVNpemUgKTsKKwkJfQorCisJCXJlc2V0KCBkZWZhdWx0VmFsdWUgKTsKKwl9CisKKworCWlubGluZSB2b2lkIHJlYWxsb2MoY29uc3QgQXJyYXkgJiBhbkFycmF5KQorCXsKKwkJaWYoIG1TaXplICE9IGFuQXJyYXkuc2l6ZSgpICkKKwkJeworCQkJZGVsZXRlW10gKCBtVGFibGUgKTsKKworCQkJYWxsb2MoIGFuQXJyYXkuc2l6ZSgpICk7CisJCX0KKworCQlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMCA7IG9mZnNldCA8IG1TaXplIDsgKytvZmZzZXQgKQorCQl7CisJCQltVGFibGVbb2Zmc2V0XSA9IGFuQXJyYXlbb2Zmc2V0XTsKKwkJfQorCX0KKworCisJaW5saW5lIHZvaWQgcmVhbGxvYyhjb25zdCBCYXNlVmVjdG9yICYgYW5BcnJheSkKKwl7CisJCWlmKCBtU2l6ZSAhPSBhbkFycmF5LnNpemUoKSApCisJCXsKKwkJCWRlbGV0ZVtdICggbVRhYmxlICk7CisKKwkJCWFsbG9jKCBhbkFycmF5LnNpemUoKSApOworCQl9CisKKwkJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDAgOyBvZmZzZXQgPCBtU2l6ZSA7ICsrb2Zmc2V0ICkKKwkJeworCQkJbVRhYmxlW29mZnNldF0gPSBhbkFycmF5W29mZnNldF07CisJCX0KKwl9CisKKworCS8qCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFJFLVNJWkUKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisKKwlpbmxpbmUgdm9pZCByZXNpemUoYXZtX3NpemVfdCBhU2l6ZSkKKwl7CisJCWlmKCBtU2l6ZSA+IDAgKQorCQl7CisJCQlhdm1fc2l6ZV90IG9sZFNpemUgPSBtU2l6ZTsKKwkJCVQgKiBvbGRUYWJsZSA9IG1UYWJsZTsKKworCQkJYWxsb2MoIGFTaXplICk7CisKKwkJCWlmKCBhU2l6ZSA+IG9sZFNpemUgKQorCQkJeworCQkJCWFTaXplID0gb2xkU2l6ZTsKKwkJCX0KKworCQkJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDAgOyBvZmZzZXQgPCBhU2l6ZSA7ICsrb2Zmc2V0ICkKKwkJCXsKKwkJCQltVGFibGVbb2Zmc2V0XSA9IG9sZFRhYmxlW29mZnNldF07CisJCQl9CisKKwkJCWRlbGV0ZSBbXSBvbGRUYWJsZTsKKwkJfQorCisJCWVsc2UKKwkJeworCQkJYWxsb2MoYVNpemUpOworCQl9CisJfQorCisJaW5saW5lIHZvaWQgcmVzaXplKGF2bV9zaXplX3QgYVNpemUsIFQgZGVmYXVsdFZhbHVlKQorCXsKKwkJaWYoIG1TaXplID4gMCApCisJCXsKKwkJCWF2bV9zaXplX3Qgb2xkU2l6ZSA9IG1TaXplOworCQkJVCAqIG9sZFRhYmxlID0gbVRhYmxlOworCisJCQlhbGxvYyggYVNpemUgKTsKKworCQkJaWYoIGFTaXplID4gb2xkU2l6ZSApCisJCQl7CisJCQkJYVNpemUgPSBvbGRTaXplOworCQkJfQorCisJCQlhdm1fc2l6ZV90IG9mZnNldCA9IDA7CisKKwkJCWZvciggOyBvZmZzZXQgPCBhU2l6ZSA7ICsrb2Zmc2V0ICkKKwkJCXsKKwkJCQltVGFibGVbb2Zmc2V0XSA9IG9sZFRhYmxlW29mZnNldF07CisJCQl9CisKKwkJCWZvciggOyBvZmZzZXQgPCBtU2l6ZSA7ICsrb2Zmc2V0ICkKKwkJCXsKKwkJCQltVGFibGVbb2Zmc2V0XSA9IGRlZmF1bHRWYWx1ZTsKKwkJCX0KKworCQkJZGVsZXRlIFtdIG9sZFRhYmxlOworCQl9CisKKwkJZWxzZQorCQl7CisJCQlhbGxvYyhhU2l6ZSwgZGVmYXVsdFZhbHVlKTsKKwkJfQorCX0KKworCisJLyoqCisJICogSVRFUkFUT1IKKwkgKi8KKworCWlubGluZSBpdGVyYXRvciBiZWdpbigpCisJeworCQlyZXR1cm4oIG1UYWJsZSApOworCX0KKworCWlubGluZSBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZSApOworCX0KKworCisJaW5saW5lIGl0ZXJhdG9yIHN1Y2NfYmVnaW4oKQorCXsKKwkJcmV0dXJuKCAobVNpemUgPiAwKT8gbVRhYmxlICsgIDEgOiBtVGFibGUgKTsKKwl9CisKKwlpbmxpbmUgY29uc3RfaXRlcmF0b3Igc3VjY19iZWdpbigpIGNvbnN0CisJeworCQlyZXR1cm4oIChtU2l6ZSA+IDApPyBtVGFibGUgKyAgMSA6IG1UYWJsZSApOworCX0KKworCisJaW5saW5lIGl0ZXJhdG9yIGVuZCgpCisJeworCQlyZXR1cm4oIG1UYWJsZSArIG1TaXplICk7CisJfQorCisJaW5saW5lIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZSArIG1TaXplICk7CisJfQorCisKKwlpbmxpbmUgaXRlcmF0b3IgcHJlZF9lbmQoKQorCXsKKwkJcmV0dXJuKCAobVNpemUgPiAwKT8gbVRhYmxlICsgbVNpemUgLSAxIDogbVRhYmxlICk7CisJfQorCisJaW5saW5lIGNvbnN0X2l0ZXJhdG9yIHByZWRfZW5kKCkgY29uc3QKKwl7CisJCXJldHVybiggKG1TaXplID4gMCk/IG1UYWJsZSArIG1TaXplIC0gMSA6IG1UYWJsZSApOworCX0KKworCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtVGFibGUKKwkgKi8KKwlpbmxpbmUgcmVmZXJlbmNlIGF0KGF2bV9zaXplX3Qgb2Zmc2V0KQorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9BUlJBWV9JTkRFWF9FWElUKCBvZmZzZXQgLCBtU2l6ZSApIDw8IFNFTkRfRVhJVDsKKworCQlyZXR1cm4oIG1UYWJsZVtvZmZzZXRdICk7CisJfQorCisJaW5saW5lIGNvbnN0X3JlZmVyZW5jZSBhdChhdm1fc2l6ZV90IG9mZnNldCkgY29uc3QKKwl7CisJCUFWTV9PU19BU1NFUlRfRkFUQUxfQVJSQVlfSU5ERVhfRVhJVCggb2Zmc2V0ICwgbVNpemUgKSA8PCBTRU5EX0VYSVQ7CisKKwkJcmV0dXJuKCBtVGFibGVbb2Zmc2V0XSApOworCX0KKworCWlubGluZSByZWZlcmVuY2UgZ2V0KGF2bV9zaXplX3Qgb2Zmc2V0KQorCXsKKwkJcmV0dXJuKCBtVGFibGVbb2Zmc2V0XSApOworCX0KKworCWlubGluZSBjb25zdF9yZWZlcmVuY2UgZ2V0KGF2bV9zaXplX3Qgb2Zmc2V0KSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVGFibGVbb2Zmc2V0XSApOworCX0KKworCisJaW5saW5lIHZvaWQgc2V0KGF2bV9zaXplX3Qgb2Zmc2V0LCBjb25zdCBUICYgYXJnKQorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9BUlJBWV9JTkRFWF9FWElUKCBvZmZzZXQgLCBtU2l6ZSApIDw8IFNFTkRfRVhJVDsKKworCQltVGFibGVbb2Zmc2V0XSA9IGFyZzsKKwl9CisKKworCS8vIG9wZXJhdG9yW10KKwlpbmxpbmUgcmVmZXJlbmNlIG9wZXJhdG9yW10oYXZtX3NpemVfdCBvZmZzZXQpCisJeworCQlyZXR1cm4oIG1UYWJsZVtvZmZzZXRdICk7CisJfQorCisJaW5saW5lIGNvbnN0X3JlZmVyZW5jZSBvcGVyYXRvcltdKGF2bV9zaXplX3Qgb2Zmc2V0KSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVGFibGVbb2Zmc2V0XSApOworCX0KKworCS8vIGZyb250KCkgYW5kIGJhY2soKQorCWlubGluZSByZWZlcmVuY2UgZnJvbnQoKQorCXsKKwkJcmV0dXJuIG1UYWJsZVswXTsKKwl9CisKKwlpbmxpbmUgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3QKKwl7CisJCXJldHVybiBtVGFibGVbMF07CisJfQorCisJaW5saW5lIHJlZmVyZW5jZSBiYWNrKCkKKwl7CisJCXJldHVybiBtVGFibGVbbVNpemUgLSAxXTsKKwl9CisKKwlpbmxpbmUgY29uc3RfcmVmZXJlbmNlIGJhY2soKSBjb25zdAorCXsKKwkJcmV0dXJuIG1UYWJsZVttU2l6ZSAtIDFdOworCX0KKworCS8vIHNpemUgaXMgY29uc3RhbnQKKwlpbmxpbmUgYXZtX3NpemVfdCBzaXplKCkgY29uc3QKKwl7CisJCXJldHVybiggbVNpemUgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBlbXB0eSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1TaXplID09IDAgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBub25lbXB0eSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1TaXplID4gMCApOworCX0KKworCWlubGluZSBib29sIHNpbmdsZXRvbigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1TaXplID09IDEgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBwb3B1bGF0ZWQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtU2l6ZSA+IDEgKTsKKwl9CisKKworCWlubGluZSByZWZlcmVuY2UgZmlyc3QoKQorCXsKKwkJcmV0dXJuKCBtVGFibGVbMF0gKTsKKwl9CisKKwlpbmxpbmUgY29uc3RfcmVmZXJlbmNlIGZpcnN0KCkgY29uc3QKKwl7CisJCXJldHVybiggbVRhYmxlWzBdICk7CisJfQorCisKKwlpbmxpbmUgcmVmZXJlbmNlIHNlY29uZCgpCisJeworCQlyZXR1cm4oIG1UYWJsZVsxXSApOworCX0KKworCWlubGluZSBjb25zdF9yZWZlcmVuY2Ugc2Vjb25kKCkgY29uc3QKKwl7CisJCXJldHVybiggbVRhYmxlWzFdICk7CisJfQorCisKKwlpbmxpbmUgcmVmZXJlbmNlIHRoaXJkKCkKKwl7CisJCXJldHVybiggbVRhYmxlWzJdICk7CisJfQorCisJaW5saW5lIGNvbnN0X3JlZmVyZW5jZSB0aGlyZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZVsyXSApOworCX0KKworCisJaW5saW5lIHJlZmVyZW5jZSBsYXN0KCkKKwl7CisJCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggbVNpemUgPiAwICkKKwkJCQk8PCAibGFzdCgpOj4gVW5leHBlY3RlZCBhbiBlbXB0eSBhcnJheSAhISEiCisJCQkJPDwgU0VORF9FWElUOworCisJCXJldHVybiggbVRhYmxlW21TaXplIC0gMV0gKTsKKwl9CisKKwlpbmxpbmUgY29uc3RfcmVmZXJlbmNlIGxhc3QoKSBjb25zdAorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKCBtU2l6ZSA+IDAgKQorCQkJCTw8ICJsYXN0KCk6PiBVbmV4cGVjdGVkIGFuIGVtcHR5IGFycmF5ICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJcmV0dXJuKCBtVGFibGVbbVNpemUgLSAxXSApOworCX0KKworCS8qKgorCSAqIGNvbnRhaW5zIGEgcGFydGljdWxhciBlbGVtZW50CisJICovCisJaW5saW5lIHZpcnR1YWwgYm9vbCBjb250YWlucyhjb25zdCBUICYgYXJnKSBjb25zdAorCXsKKwkJY29uc3RfaXRlcmF0b3IgaXRFbmQgPSBlbmQoKTsKKwkJZm9yKCBjb25zdF9pdGVyYXRvciBpdCA9IGJlZ2luKCkgOyBpdCAhPSBpdEVuZCA7ICsraXQgKQorCQl7CisJCQlpZiggKCppdCkgPT0gYXJnICkKKwkJCXsKKwkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKK307CisKKworfQorCisjZW5kaWYgLypDT05UQUlORVJfQVJSQVlfSF8qLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29sbGVjdGlvbi9CRkNvbnRhaW5lci5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb2xsZWN0aW9uL0JGQ29udGFpbmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzExMjg2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29sbGVjdGlvbi9CRkNvbnRhaW5lci5jcHAKQEAgLTAsMCArMSwyMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDEzIGphbnYuIDIwMTQKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkJGQ29udGFpbmVyLmgiCisKKworbmFtZXNwYWNlIHNlcAoreworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29sbGVjdGlvbi9CRkNvbnRhaW5lci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29sbGVjdGlvbi9CRkNvbnRhaW5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YjhkMTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb2xsZWN0aW9uL0JGQ29udGFpbmVyLmgKQEAgLTAsMCArMSw5NTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxMyBqYW52LiAyMDE0CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQkZDT05UQUlORVJfSF8KKyNkZWZpbmUgQkZDT05UQUlORVJfSF8KKworI2luY2x1ZGUgPGNvbW1vbi9Bdm1PYmplY3QuaD4KKyNpbmNsdWRlIDxjb21tb24vQXZtUG9pbnRlci5oPgorI2luY2x1ZGUgPGNvbW1vbi9CRi5oPgorI2luY2x1ZGUgPGNvbW1vbi9OYW1lZEVsZW1lbnQuaD4KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vQ29sbGVjdGlvbi5oPgorI2luY2x1ZGUgPGNvbGxlY3Rpb24vQXJyYXkuaD4KKyNpbmNsdWRlIDxjb2xsZWN0aW9uL0xpc3QuaD4KKyNpbmNsdWRlIDxjb2xsZWN0aW9uL011bHRpc2V0Lmg+CisjaW5jbHVkZSA8Y29sbGVjdGlvbi9QYWlyLmg+CisjaW5jbHVkZSA8Y29sbGVjdGlvbi9TZXQuaD4KKyNpbmNsdWRlIDxjb2xsZWN0aW9uL1ZlY3Rvci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjbGFzcyBPYmplY3RFbGVtZW50OworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBUWVBFREVGIEZPUiBDT0xMRUNUSU9OIDwgQkYgPgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordHlwZWRlZiBDb2xsZWN0aW9uIDwgQkYgPiBCRkNvbGxlY3Rpb247CisvL3R5cGVkZWYgICAgIExpc3QgPCBCRiA+IEJGTGlzdDsKK3R5cGVkZWYgICAgICBBcnJheSA8IEJGID4gQXJyYXlPZkJGOworLy90eXBlZGVmICAgVmVjdG9yIDwgQkYgPiBCRlZlY3RvcjsKK3R5cGVkZWYgICBNdWx0aXNldCA8IEJGID4gQkZNdWx0aXNldDsKK3R5cGVkZWYgICAgICAgIFNldCA8IEJGID4gQkZTZXQ7CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIExpc3Qgb2YgQkYKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjbGFzcyBCRkxpc3QgIDogIHB1YmxpYyBMaXN0IDwgQkYgPgoreworCitwdWJsaWM6CisJLyoqCisJICogVFlQRURFRgorCSAqLworCXR5cGVkZWYgTGlzdDwgQkYgPiAgICBCYXNlTGlzdE9mQkY7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUJGTGlzdCgpCisJOiBCYXNlTGlzdE9mQkYoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJQkZMaXN0KGNvbnN0IEJGTGlzdCAmIGFMaXN0KQorCTogQmFzZUxpc3RPZkJGKCBhTGlzdCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+QkZMaXN0KCkKKwl7CisJCUJhc2VMaXN0T2ZCRjo6Y2xlYXIoKTsKKwl9CisKKworCS8qKgorCSAqIFNBVkUKKwkgKi8KKwlpbmxpbmUgdm9pZCBzYXZlKCBFbGVtZW50ICogYW5FbGVtZW50ICkKKwl7CisJCUJhc2VMaXN0T2ZCRjo6YXBwZW5kKCBCRiggYW5FbGVtZW50KSApOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIHJhdyBpdGVyYXRvcgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXRlbXBsYXRlPCBjbGFzcyByYXdUID4KKwljbGFzcyByYXdfaXRlcmF0b3IgIDogIHB1YmxpYyBCRkxpc3Q6Oml0ZXJhdG9yCisJeworCXB1YmxpYzoKKwkJcmF3X2l0ZXJhdG9yKCkKKwkJOiBCRkxpc3Q6Oml0ZXJhdG9yKCApCisJCXsKKwkJCS8vISEgTk9USElORworCQl9CisKKwkJcmF3X2l0ZXJhdG9yKGNvbnN0IEJGTGlzdDo6aXRlcmF0b3IgJiBhbkl0ZXJhdG9yKQorCQk6IEJGTGlzdDo6aXRlcmF0b3IoIGFuSXRlcmF0b3IgKQorCQl7CisJCQkvLyEhIE5PVEhJTkcKKwkJfQorCisJCWlubGluZSBvcGVyYXRvciByYXdUICogKCkgY29uc3QKKwkJeworCQkJQkYgJiBjdXJyZW50ID0gQkZMaXN0OjppdGVyYXRvcjo6b3BlcmF0b3IqKCk7CisKKwkJCXJldHVybiggY3VycmVudC50b19wdHI8IHJhd1QgPigpICk7CisJCX0KKworCQlpbmxpbmUgcmF3VCAqIG9wZXJhdG9yLT4oKSBjb25zdAorCQl7CisJCQlCRiAmIGN1cnJlbnQgPSBCRkxpc3Q6Oml0ZXJhdG9yOjpvcGVyYXRvciooKTsKKworCQkJcmV0dXJuKCBjdXJyZW50LnRvX3B0cjwgcmF3VCA+KCkgKTsKKwkJfQorCisJfTsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIGNvbnN0IHJhdyBpdGVyYXRvcgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXRlbXBsYXRlPCBjbGFzcyByYXdUID4KKwljbGFzcyBjb25zdF9yYXdfaXRlcmF0b3IgIDogIHB1YmxpYyBCRkxpc3Q6OmNvbnN0X2l0ZXJhdG9yCisJeworCXB1YmxpYzoKKwkJY29uc3RfcmF3X2l0ZXJhdG9yKCkKKwkJOiBCRkxpc3Q6OmNvbnN0X2l0ZXJhdG9yKCApCisJCXsKKwkJCS8vISEgTk9USElORworCQl9CisKKwkJY29uc3RfcmF3X2l0ZXJhdG9yKGNvbnN0IEJGTGlzdDo6Y29uc3RfaXRlcmF0b3IgJiBhbkl0ZXJhdG9yKQorCQk6IEJGTGlzdDo6Y29uc3RfaXRlcmF0b3IoIGFuSXRlcmF0b3IgKQorCQl7CisJCQkvLyEhIE5PVEhJTkcKKwkJfQorCisJCWlubGluZSBvcGVyYXRvciByYXdUICogKCkgY29uc3QKKwkJeworCQkJY29uc3QgQkYgJiBjdXJyZW50ID0gQkZMaXN0Ojpjb25zdF9pdGVyYXRvcjo6b3BlcmF0b3IqKCk7CisKKwkJCXJldHVybiggY3VycmVudC50b19wdHI8IHJhd1QgPigpICk7CisJCX0KKworCQlpbmxpbmUgcmF3VCAqIG9wZXJhdG9yLT4oKSBjb25zdAorCQl7CisJCQljb25zdCBCRiAmIGN1cnJlbnQgPSBCRkxpc3Q6OmNvbnN0X2l0ZXJhdG9yOjpvcGVyYXRvciooKTsKKworCQkJcmV0dXJuKCBjdXJyZW50LnRvX3B0cjwgcmF3VCA+KCkgKTsKKwkJfQorCisJfTsKKworfTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFycmF5IG9mIEJGCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy9jbGFzcyBBcnJheU9mQkYgIDogIHB1YmxpYyBBcnJheSA8IEJGID4KKy8veworLy8KKy8vcHVibGljOgorLy8JLyoqCisvLwkgKiBUWVBFREVGCisvLwkgKi8KKy8vCXR5cGVkZWYgQXJyYXkgPCBCRiA+ICAgIEJhc2VBcnJheU9mQkY7CisvLworLy8KKy8vcHVibGljOgorLy8JLyoqCisvLwkgKiBDT05TVFJVQ1RPUgorLy8JICogRGVmYXVsdAorLy8JICovCisvLwlBcnJheU9mQkYoKQorLy8JOiBCYXNlQXJyYXlPZkJGKCkKKy8vCXsKKy8vCQkvLyEhIE5PVEhJTkcKKy8vCX0KKy8vCisvLwkvKioKKy8vCSAqIENPTlNUUlVDVE9SCisvLwkgKiBDb3B5CisvLwkgKi8KKy8vCUFycmF5T2ZCRihjb25zdCBBcnJheU9mQkYgJiBhbkFycmF5KQorLy8JOiBCYXNlQXJyYXlPZkJGKCBhbkFycmF5ICkKKy8vCXsKKy8vCQkvLyEhIE5PVEhJTkcKKy8vCX0KKy8vCisvLwkvKioKKy8vCSAqIENPTlNUUlVDVE9SCisvLwkgKiBPdGhlcnMKKy8vCSAqLworLy8JZXhwbGljaXQgQXJyYXlPZkJGKGF2bV9zaXplX3QgY291bnQpCisvLwk6IEJhc2VBcnJheU9mQkYoY291bnQpCisvLwl7CisvLwkJLy8hISBOT1RISU5HCisvLwl9CisvLworLy8JZXhwbGljaXQgQXJyYXlPZkJGKGF2bV9zaXplX3QgY291bnQsIGNvbnN0IEJGICYgYW5FbGVtZW50KQorLy8JOiBCYXNlQXJyYXlPZkJGKGNvdW50LCBhbkVsZW1lbnQpCisvLwl7CisvLwkJLy8hISBOT1RISU5HCisvLwl9CisvLworLy8JQXJyYXlPZkJGKGNvbnN0IEJhc2VWZWN0b3IgJiBhVmVjdG9yKQorLy8JOiBCYXNlQXJyYXlPZkJGKCBhVmVjdG9yICkKKy8vCXsKKy8vCQkvLyEhIE5PVEhJTkcKKy8vCX0KKy8vCisvLwlBcnJheU9mQkYoY29uc3QgQXJyYXlPZkJGICYgYW5BcnJheSwgY29uc3RfcmVmZXJlbmNlIGxhc3RWYWx1ZSkKKy8vCTogQmFzZUFycmF5T2ZCRiggYW5BcnJheSAsIGxhc3RWYWx1ZSkKKy8vCXsKKy8vCQkvLyEhIE5PVEhJTkcKKy8vCX0KKy8vCisvLworLy8JLyoqCisvLwkgKiBERVNUUlVDVE9SCisvLwkgKi8KKy8vCXZpcnR1YWwgfkFycmF5T2ZCRigpCisvLwl7CisvLwkJQmFzZUFycmF5T2ZCRjo6Y2xlYXIoKTsKKy8vCX0KKy8vCisvLworLy8JLyoqCisvLwkgKiBTQVZFCisvLwkgKi8KKy8vCWlubGluZSB2b2lkIHNhdmUoIEVsZW1lbnQgKiBhbkVsZW1lbnQgKQorLy8JeworLy8JCUJhc2VBcnJheU9mQkY6OmFwcGVuZCggQkYoIGFuRWxlbWVudCkgKTsKKy8vCX0KKy8vCisvLworLy8JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8JLy8gcmF3IGl0ZXJhdG9yCisvLwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdGVtcGxhdGU8IGNsYXNzIHJhd1QgPgorLy8JY2xhc3MgcmF3X2l0ZXJhdG9yICA6ICBwdWJsaWMgQXJyYXlPZkJGOjppdGVyYXRvcgorLy8JeworLy8JcHVibGljOgorLy8JCXJhd19pdGVyYXRvcigpCisvLwkJOiBBcnJheU9mQkY6Oml0ZXJhdG9yKCApCisvLwkJeworLy8JCQkvLyEhIE5PVEhJTkcKKy8vCQl9CisvLworLy8JCXJhd19pdGVyYXRvcihjb25zdCBBcnJheU9mQkY6Oml0ZXJhdG9yICYgYW5JdGVyYXRvcikKKy8vCQk6IEFycmF5T2ZCRjo6aXRlcmF0b3IoIGFuSXRlcmF0b3IgKQorLy8JCXsKKy8vCQkJLy8hISBOT1RISU5HCisvLwkJfQorLy8KKy8vCQlpbmxpbmUgb3BlcmF0b3IgcmF3VCAqICgpIGNvbnN0CisvLwkJeworLy8JCQlyZXR1cm4oIEFycmF5T2ZCRjo6aXRlcmF0b3I6Ol9NX2N1cnJlbnQtPnRvX3B0cjwgcmF3VCA+KCkgKTsKKy8vCQl9CisvLworLy8JCWlubGluZSByYXdUICogb3BlcmF0b3ItPigpIGNvbnN0CisvLwkJeworLy8JCQlyZXR1cm4oIEFycmF5T2ZCRjo6aXRlcmF0b3I6Ol9NX2N1cnJlbnQtPnRvX3B0cjwgcmF3VCA+KCkgKTsKKy8vCQl9CisvLworLy8JfTsKKy8vCisvLworLy8JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8JLy8gY29uc3QgcmF3IGl0ZXJhdG9yCisvLwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JdGVtcGxhdGU8IGNsYXNzIHJhd1QgPgorLy8JY2xhc3MgY29uc3RfcmF3X2l0ZXJhdG9yICA6ICBwdWJsaWMgQXJyYXlPZkJGOjpjb25zdF9pdGVyYXRvcgorLy8JeworLy8JcHVibGljOgorLy8JCWNvbnN0X3Jhd19pdGVyYXRvcigpCisvLwkJOiBBcnJheU9mQkY6OmNvbnN0X2l0ZXJhdG9yKCApCisvLwkJeworLy8JCQkvLyEhIE5PVEhJTkcKKy8vCQl9CisvLworLy8JCWNvbnN0X3Jhd19pdGVyYXRvcihjb25zdCBBcnJheU9mQkY6OmNvbnN0X2l0ZXJhdG9yICYgYW5JdGVyYXRvcikKKy8vCQk6IEFycmF5T2ZCRjo6Y29uc3RfaXRlcmF0b3IoIGFuSXRlcmF0b3IgKQorLy8JCXsKKy8vCQkJLy8hISBOT1RISU5HCisvLwkJfQorLy8KKy8vCQlpbmxpbmUgb3BlcmF0b3IgcmF3VCAqICgpIGNvbnN0CisvLwkJeworLy8JCQlyZXR1cm4oIEFycmF5T2ZCRjo6Y29uc3RfaXRlcmF0b3I6Ol9NX2N1cnJlbnQtPnRvX3B0cjwgcmF3VCA+KCkgKTsKKy8vCQl9CisvLworLy8JCWlubGluZSByYXdUICogb3BlcmF0b3ItPigpIGNvbnN0CisvLwkJeworLy8JCQlyZXR1cm4oIEFycmF5T2ZCRjo6Y29uc3RfaXRlcmF0b3I6Ol9NX2N1cnJlbnQtPnRvX3B0cjwgcmF3VCA+KCkgKTsKKy8vCQl9CisvLworLy8JfTsKKy8vCisvL307CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBWZWN0b3Igb2YgQkYKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjbGFzcyBCRlZlY3RvciAgOiAgcHVibGljIFZlY3RvciA8IEJGID4KK3sKKworcHVibGljOgorCS8qKgorCSAqIFRZUEVERUYKKwkgKi8KKwl0eXBlZGVmIFZlY3RvciA8IEJGID4gICAgQmFzZVZlY3Rvck9mQkY7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUJGVmVjdG9yKCkKKwk6IEJhc2VWZWN0b3JPZkJGKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCUJGVmVjdG9yKGNvbnN0IEJGVmVjdG9yICYgYVZlY3RvcikKKwk6IEJhc2VWZWN0b3JPZkJGKCBhVmVjdG9yICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogT3RoZXJzCisJICovCisJZXhwbGljaXQgQkZWZWN0b3IoYXZtX3NpemVfdCBjb3VudCkKKwk6IEJhc2VWZWN0b3JPZkJGKGNvdW50KQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJZXhwbGljaXQgQkZWZWN0b3IoYXZtX3NpemVfdCBjb3VudCwgY29uc3QgQkYgJiBlbGVtKQorCTogQmFzZVZlY3Rvck9mQkYoY291bnQsIGVsZW0pCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlleHBsaWNpdCBCRlZlY3Rvcihjb25zdCBCRiAmIGFyZykKKwk6IEJhc2VWZWN0b3JPZkJGKCBhcmcgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJZXhwbGljaXQgQkZWZWN0b3IoY29uc3QgQkYgJiBhcmcxLCBjb25zdCBCRiAmIGFyZzIpCisJOiBCYXNlVmVjdG9yT2ZCRiggYXJnMSwgYXJnMiApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlleHBsaWNpdCBCRlZlY3Rvcihjb25zdCBCRiAmIGFyZzEsIGNvbnN0IEJGICYgYXJnMiwgY29uc3QgQkYgJiBhcmczKQorCTogQmFzZVZlY3Rvck9mQkYoIGFyZzEsIGFyZzIsIGFyZzMgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJZXhwbGljaXQgQkZWZWN0b3IoY29uc3QgQkYgJiBhcmcxLCBjb25zdCBCRiAmIGFyZzIsCisJCQljb25zdCBCRiAmIGFyZzMsIGNvbnN0IEJGICYgYXJnNCkKKwk6IEJhc2VWZWN0b3JPZkJGKCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0ICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCWV4cGxpY2l0IEJGVmVjdG9yKGNvbnN0IEJGICYgYXJnMSwgY29uc3QgQkYgJiBhcmcyLAorCQkJY29uc3QgQkYgJiBhcmczLCBjb25zdCBCRiAmIGFyZzQsIGNvbnN0IEJGICYgYXJnNSkKKwk6IEJhc2VWZWN0b3JPZkJGKCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1ICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkJGVmVjdG9yKCkKKwl7CisJCUJhc2VWZWN0b3JPZkJGOjpjbGVhcigpOworCX0KKworCisJLyoqCisJICogU0FWRQorCSAqLworCWlubGluZSB2b2lkIHNhdmUoIEVsZW1lbnQgKiBhbkVsZW1lbnQgKQorCXsKKwkJQmFzZVZlY3Rvck9mQkY6OmFwcGVuZCggQkYoIGFuRWxlbWVudCkgKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyByYXcgaXRlcmF0b3IKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwl0ZW1wbGF0ZTwgY2xhc3MgcmF3VCA+CisJY2xhc3MgcmF3X2l0ZXJhdG9yICA6ICBwdWJsaWMgQkZWZWN0b3I6Oml0ZXJhdG9yCisJeworCXB1YmxpYzoKKwkJcmF3X2l0ZXJhdG9yKCkKKwkJOiBCRlZlY3Rvcjo6aXRlcmF0b3IoICkKKwkJeworCQkJLy8hISBOT1RISU5HCisJCX0KKworCQlyYXdfaXRlcmF0b3IoY29uc3QgQkZWZWN0b3I6Oml0ZXJhdG9yICYgYW5JdGVyYXRvcikKKwkJOiBCRlZlY3Rvcjo6aXRlcmF0b3IoIGFuSXRlcmF0b3IgKQorCQl7CisJCQkvLyEhIE5PVEhJTkcKKwkJfQorCisJCWlubGluZSBvcGVyYXRvciByYXdUICogKCkgY29uc3QKKwkJeworCQkJcmV0dXJuKCBCRlZlY3Rvcjo6aXRlcmF0b3I6Ol9NX2N1cnJlbnQtPnRvX3B0cjwgcmF3VCA+KCkgKTsKKwkJfQorCisJCWlubGluZSByYXdUICogb3BlcmF0b3ItPigpIGNvbnN0CisJCXsKKwkJCXJldHVybiggQkZWZWN0b3I6Oml0ZXJhdG9yOjpfTV9jdXJyZW50LT50b19wdHI8IHJhd1QgPigpICk7CisJCX0KKworCX07CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBjb25zdCByYXcgaXRlcmF0b3IKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwl0ZW1wbGF0ZTwgY2xhc3MgcmF3VCA+CisJY2xhc3MgY29uc3RfcmF3X2l0ZXJhdG9yICA6ICBwdWJsaWMgQkZWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yCisJeworCXB1YmxpYzoKKwkJY29uc3RfcmF3X2l0ZXJhdG9yKCkKKwkJOiBCRlZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IoICkKKwkJeworCQkJLy8hISBOT1RISU5HCisJCX0KKworCQljb25zdF9yYXdfaXRlcmF0b3IoY29uc3QgQkZWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yICYgYW5JdGVyYXRvcikKKwkJOiBCRlZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IoIGFuSXRlcmF0b3IgKQorCQl7CisJCQkvLyEhIE5PVEhJTkcKKwkJfQorCisJCWlubGluZSBvcGVyYXRvciByYXdUICogKCkgY29uc3QKKwkJeworCQkJcmV0dXJuKCBCRlZlY3Rvcjo6Y29uc3RfaXRlcmF0b3I6Ol9NX2N1cnJlbnQtPnRvX3B0cjwgcmF3VCA+KCkgKTsKKwkJfQorCisJCWlubGluZSByYXdUICogb3BlcmF0b3ItPigpIGNvbnN0CisJCXsKKwkJCXJldHVybiggQkZWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yOjpfTV9jdXJyZW50LT50b19wdHI8IHJhd1QgPigpICk7CisJCX0KKworCX07CisKK307CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBUYWJsZSBvZiBCRiB3aXRoIHJhd19wb2ludGVyIHVzaW5nIFsgWyBGdWxseSBdIFF1YWxpZmllZCBdIE5hbWUgSUQgLSBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit0ZW1wbGF0ZTwgY2xhc3MgQmFzZVQgPgorY2xhc3MgVGFibGVPZkJGX1QgOgorCQlwdWJsaWMgQXZtT2JqZWN0ICwKKwkJcHVibGljIEJGVmVjdG9yICwKKwkJQVZNX0lOSkVDVF9JTlNUQU5DRV9DT1VOVEVSX0NMQVNTKCBUYWJsZU9mQkZfVDwgQmFzZVQgPiApCit7CisKKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggVGFibGVPZkJGX1QgKQorCisKK3B1YmxpYzoKKwkvKioKKwkgKiBUWVBFREVGCisJICovCisJdHlwZWRlZiAgQmFzZVQgKiBQb2ludGVyQmFzZVQ7CisKKwl0eXBlZGVmICBCRlZlY3Rvcjo6cmF3X2l0ZXJhdG9yPCBCYXNlVCA+IHJhd19pdGVyYXRvcjsKKworCXR5cGVkZWYgIEJGVmVjdG9yOjpjb25zdF9yYXdfaXRlcmF0b3I8IEJhc2VUID4gY29uc3RfcmF3X2l0ZXJhdG9yOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlUYWJsZU9mQkZfVCgpCisJOiBBdm1PYmplY3QoICksCisJQkZWZWN0b3IoICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCVRhYmxlT2ZCRl9UKGF2bV9zaXplX3QgYVNpemUpCisJOiBBdm1PYmplY3QoICksCisJQkZWZWN0b3IoIGFTaXplICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCVRhYmxlT2ZCRl9UKGNvbnN0IFRhYmxlT2ZCRl9UICYgYVRhYmxlKQorCTogQXZtT2JqZWN0KCBhVGFibGUgKSwKKwlCRlZlY3RvciggYVRhYmxlICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCVRhYmxlT2ZCRl9UKGNvbnN0IEJGVmVjdG9yICYgYVZlY3RvcikKKwk6IEF2bU9iamVjdCggKSwKKwlCRlZlY3RvciggYVZlY3RvciApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5UYWJsZU9mQkZfVCgpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIEVsZW1lbnQgYXQgPG9mZnNldD4gcG9zaXRpb24KKwkgKi8KKwlpbmxpbmUgUG9pbnRlckJhc2VUIHJhd0F0KGF2bV9zaXplX3Qgb2Zmc2V0KSBjb25zdAorCXsKKwkJcmV0dXJuKCBCRlZlY3Rvcjo6YXQob2Zmc2V0KS50ZW1wbGF0ZSB0b19wdHI8IEJhc2VUID4oKSApOworCX0KKworCisJaW5saW5lIGNvbnN0IEJGICYgZ2V0KGF2bV9zaXplX3Qgb2Zmc2V0KSBjb25zdAorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9BUlJBWV9PRkZTRVRfRVhJVCggb2Zmc2V0ICwgQkZWZWN0b3I6OnNpemUoKSApCisJCQkJPDwgIlVuYm91bmQgRWxlbWVudCBhdCA8b2Zmc2V0PiBwb3NpdGlvbiAhISEiCisJCQkJPDwgU0VORF9FWElUOworCisJCXJldHVybiggQkZWZWN0b3I6OmF0KG9mZnNldCkgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIEVsZW1lbnQgYnkgcWxmTmFtZUlEIGFzIFF1YWxpZmllZE5hbWVJRCB3LnIudCBjb21wYXJlX29wCisJICovCisJaW5saW5lIGNvbnN0IEJGICYgZ2V0QnlRdWFsaWZpZWROYW1lSUQoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIHFsZk5hbWVJRCwKKwkJCU5hbWVkRWxlbWVudDo6b3BfY29tcGFyZXJfdCBvcCkgY29uc3QKKwl7CisJCWNvbnN0X2l0ZXJhdG9yIGl0ID0gYmVnaW4oKTsKKwkJY29uc3RfaXRlcmF0b3IgZW5kSXQgPSBlbmQoKTsKKwkJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJCXsKKwkJCWlmKCAoKml0KS50b19wdHI8IEJhc2VUID4oKS0+Y29tcGFyZShxbGZOYW1lSUQsIG9wKSApCisJCQl7CisJCQkJcmV0dXJuKCAqaXQgKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiggQkY6OlJFRl9OVUxMICk7CisJfQorCisJaW5saW5lIFBvaW50ZXJCYXNlVCByYXdCeVF1YWxpZmllZE5hbWVJRCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgcWxmTmFtZUlELAorCQkJTmFtZWRFbGVtZW50OjpvcF9jb21wYXJlcl90IG9wKSBjb25zdAorCXsKKwkJY29uc3RfaXRlcmF0b3IgaXQgPSBiZWdpbigpOworCQljb25zdF9pdGVyYXRvciBlbmRJdCA9IGVuZCgpOworCQlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJeworCQkJaWYoICgqaXQpLnRvX3B0cjwgQmFzZVQgPigpLT5jb21wYXJlSUQocWxmTmFtZUlELCBvcCkgKQorCQkJeworCQkJCXJldHVybiggKCppdCkudG9fcHRyPCBCYXNlVCA+KCkgKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiggTlVMTCApOworCX0KKworCisJLyoqCisJICogR0VUVEVSCisJICogRWxlbWVudCBieSBGdWxseSBRdWFsaWZpZWQgTmFtZUlECisJICovCisJaW5saW5lIGNvbnN0IEJGICYgZ2V0QnlGUU5hbWVJRCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEKSBjb25zdAorCXsKKwkJY29uc3RfcmF3X2l0ZXJhdG9yIGl0ID0gYmVnaW4oKTsKKwkJY29uc3RfcmF3X2l0ZXJhdG9yIGVuZEl0ID0gZW5kKCk7CisJCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCQl7CisJCQkvLyBTVFJJQ1Q6PiBjb21wYXJlIExPQ0FUT1IgJiBMT0NBVElPTiAodHJ1ZTotIHJldHJ5IG9ubHkgTE9DQVRJT04pCisJCQlpZiggKGl0KS0+ZnFuRXF1YWxzKCBhRnVsbHlRdWFsaWZpZWROYW1lSUQgLCB0cnVlICkgKQorCQkJeworCQkJCXJldHVybiggKml0ICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCX0KKworCWlubGluZSBQb2ludGVyQmFzZVQgcmF3QnlGUU5hbWVJRCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEKSBjb25zdAorCXsKKwkJY29uc3RfcmF3X2l0ZXJhdG9yIGl0ID0gYmVnaW4oKTsKKwkJY29uc3RfcmF3X2l0ZXJhdG9yIGVuZEl0ID0gZW5kKCk7CisJCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCQl7CisJCQkvLyBTVFJJQ1Q6PiBjb21wYXJlIExPQ0FUT1IgJiBMT0NBVElPTiAodHJ1ZTotIHJldHJ5IG9ubHkgTE9DQVRJT04pCisJCQlpZiggKGl0KS0+ZnFuRXF1YWxzKCBhRnVsbHlRdWFsaWZpZWROYW1lSUQgLCB0cnVlICkgKQorCQkJeworCQkJCXJldHVybiggaXQgKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiggTlVMTCApOworCX0KKworCisJLyoqCisJICogR0VUVEVSCisJICogRWxlbWVudCBieSBxbGZOYW1lSUQgYXMgUXVhbGlmaWVkTmFtZUlECisJICovCisJaW5saW5lIGNvbnN0IEJGICYgZ2V0QnlRdWFsaWZpZWROYW1lSUQoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpIGNvbnN0CisJeworCQljb25zdF9pdGVyYXRvciBpdCA9IGJlZ2luKCk7CisJCWNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gZW5kKCk7CisJCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCQl7CisJCQlpZiggKCppdCkudG9fcHRyPCBCYXNlVCA+KCktPmZxbkVuZHNXaXRoKGFRdWFsaWZpZWROYW1lSUQpICkKKwkJCXsKKwkJCQlyZXR1cm4oICppdCApOworCQkJfQorCQl9CisKKwkJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKKwl9CisKKwlpbmxpbmUgUG9pbnRlckJhc2VUIHJhd0J5UXVhbGlmaWVkTmFtZUlEKAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKSBjb25zdAorCXsKKwkJY29uc3RfaXRlcmF0b3IgaXQgPSBiZWdpbigpOworCQljb25zdF9pdGVyYXRvciBlbmRJdCA9IGVuZCgpOworCQlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJeworCQkJaWYoICgqaXQpLnRvX3B0cjwgQmFzZVQgPigpLT5mcW5FbmRzV2l0aChhUXVhbGlmaWVkTmFtZUlEKSApCisJCQl7CisJCQkJcmV0dXJuKCAoKml0KS50b19wdHI8IEJhc2VUID4oKSApOworCQkJfQorCQl9CisKKwkJcmV0dXJuKCBOVUxMICk7CisJfQorCisKKwlpbmxpbmUgYXZtX3NpemVfdCBnZXRCeVF1YWxpZmllZE5hbWVJRCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCwgQkZMaXN0ICYgbGlzdG9mRm91bmQpIGNvbnN0CisJeworCQlhdm1fc2l6ZV90IGNvdW50ID0gMDsKKworCQljb25zdF9pdGVyYXRvciBpdCA9IGJlZ2luKCk7CisJCWNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gZW5kKCk7CisJCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCQl7CisJCQlpZiggKCppdCkudG9fcHRyPCBCYXNlVCA+KCktPmZxbkVuZHNXaXRoKGFRdWFsaWZpZWROYW1lSUQpICkKKwkJCXsKKwkJCQlsaXN0b2ZGb3VuZC5hcHBlbmQoICppdCApOworCisJCQkJKytjb3VudDsKKwkJCX0KKwkJfQorCisJCXJldHVybiggY291bnQgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIEVsZW1lbnQgYnkgYU5hbWVJRAorCSAqLworCWlubGluZSBjb25zdCBCRiAmIGdldEJ5TmFtZUlEKGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkgY29uc3QKKwl7CisJCWNvbnN0X3Jhd19pdGVyYXRvciBpdCA9IGJlZ2luKCk7CisJCWNvbnN0X3Jhd19pdGVyYXRvciBlbmRJdCA9IGVuZCgpOworCQlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJeworCQkJaWYoIChpdCktPmdldE5hbWVJRCgpID09IGFOYW1lSUQgKQorCQkJeworCQkJCXJldHVybiggKml0ICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCX0KKworCWlubGluZSBQb2ludGVyQmFzZVQgcmF3QnlOYW1lSUQoY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKSBjb25zdAorCXsKKwkJY29uc3RfcmF3X2l0ZXJhdG9yIGl0ID0gYmVnaW4oKTsKKwkJY29uc3RfcmF3X2l0ZXJhdG9yIGVuZEl0ID0gZW5kKCk7CisJCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCQl7CisJCQlpZiggKGl0KS0+Z2V0TmFtZUlEKCkgPT0gYU5hbWVJRCApCisJCQl7CisJCQkJcmV0dXJuKCBpdCApOworCQkJfQorCQl9CisKKwkJcmV0dXJuKCBOVUxMICk7CisJfQorCisJaW5saW5lIGF2bV9zaXplX3QgZ2V0QnlOYW1lSUQoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsIEJGTGlzdCAmIGxpc3RvZkZvdW5kKSBjb25zdAorCXsKKwkJYXZtX3NpemVfdCBjb3VudCA9IDA7CisKKwkJY29uc3RfcmF3X2l0ZXJhdG9yIGl0ID0gYmVnaW4oKTsKKwkJY29uc3RfcmF3X2l0ZXJhdG9yIGVuZEl0ID0gZW5kKCk7CisJCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCQl7CisJCQlpZiggKGl0KS0+Z2V0TmFtZUlEKCkgPT0gYU5hbWVJRCApCisJCQl7CisJCQkJbGlzdG9mRm91bmQuYXBwZW5kKCAqaXQgKTsKKworCQkJCSsrY291bnQ7CisJCQl9CisJCX0KKworCQlyZXR1cm4oIGNvdW50ICk7CisJfQorCisKKwlpbmxpbmUgYXZtX29mZnNldF90IGdldE9mZnNldEJ5TmFtZUlEKGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkgY29uc3QKKwl7CisJCWNvbnN0X3Jhd19pdGVyYXRvciBpdCA9IGJlZ2luKCk7CisJCWNvbnN0X3Jhd19pdGVyYXRvciBlbmRJdCA9IGVuZCgpOworCQlmb3IoIGF2bV9vZmZzZXRfdCBvZmZzZXQgPSAwIDsgaXQgIT0gZW5kSXQgOyArK2l0ICwgKytvZmZzZXQgKQorCQl7CisJCQlpZiggKGl0KS0+Z2V0TmFtZUlEKCkgPT0gYU5hbWVJRCApCisJCQl7CisJCQkJcmV0dXJuKCBvZmZzZXQgKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4oIEFWTV9OT19PRkZTRVQgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIEVsZW1lbnQgYnkgY29tcGlsZWQgZm9ybQorCSAqLworCWlubGluZSBjb25zdCBCRiAmIGdldEJ5QXN0RWxlbWVudChjb25zdCBPYmplY3RFbGVtZW50ICogYXN0RWxlbWVudCkgY29uc3QKKwl7CisJCWNvbnN0X3Jhd19pdGVyYXRvciBpdCA9IGJlZ2luKCk7CisJCWNvbnN0X3Jhd19pdGVyYXRvciBlbmRJdCA9IGVuZCgpOworCQlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJeworCQkJaWYoIChpdCktPmlzQXN0RWxlbWVudCggYXN0RWxlbWVudCApICkKKwkJCXsKKwkJCQlyZXR1cm4oICppdCApOworCQkJfQorCQl9CisKKwkJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKKwl9CisKKworCS8qKgorCSAqIFNBVkUKKwkgKiBBUFBFTkQKKwkgKi8KKwlpbmxpbmUgY29uc3QgQkYgJiBzYXZlKFBvaW50ZXJCYXNlVCBhbkVsZW1lbnQpCisJeworCQlCRlZlY3Rvcjo6cHVzaF9iYWNrKCBCRihhbkVsZW1lbnQpICk7CisKKwkJcmV0dXJuKCBCRlZlY3Rvcjo6YmFjaygpICk7CisJfQorCisJaW5saW5lIHZvaWQgYXBwZW5kKGNvbnN0IEJGICYgYW5FbGVtZW50KQorCXsKKwkJQkZWZWN0b3I6OmFwcGVuZCggYW5FbGVtZW50ICk7CisJfQorCisJaW5saW5lIHZvaWQgYXBwZW5kKGNvbnN0IEJGTGlzdCAmIGFMaXN0KQorCXsKKwkJQkZWZWN0b3I6OmFwcGVuZCggYUxpc3QgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBhcHBlbmQoY29uc3QgQkZWZWN0b3IgJiBhVmVjdG9yKQorCXsKKwkJQkZWZWN0b3I6OmFwcGVuZCggYVZlY3RvciApOworCX0KKworCisJLyoqCisJICogU0VUVEVSCisJICovCisJaW5saW5lIHZvaWQgc2V0KGF2bV9vZmZzZXRfdCBvZmZzZXQsIGNvbnN0IEJGICYgYW5FbGVtZW50KQorCXsKKwkJQkZWZWN0b3I6OnNldChvZmZzZXQsIGFuRWxlbWVudCk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0KGF2bV9vZmZzZXRfdCBvZmZzZXQsIFBvaW50ZXJCYXNlVCBhbkVsZW1lbnQpCisJeworCQlCRlZlY3Rvcjo6c2V0KG9mZnNldCwgQkYoYW5FbGVtZW50KSk7CisJfQorCisKKwkvKioKKwkgKiBjb250YWlucyBhIHBhcnRpY3VsYXIgZWxlbWVudAorCSAqLworCWlubGluZSBib29sIGNvbnRhaW5zKFBvaW50ZXJCYXNlVCBhbkVsZW1lbnQpIGNvbnN0CisJeworCQlpZiggKGFuRWxlbWVudC0+Z2V0T2Zmc2V0KCkgPCBzaXplKCkpICYmCisJCQkocmF3QXQoYW5FbGVtZW50LT5nZXRPZmZzZXQoKSkgPT0gYW5FbGVtZW50KSApCisJCXsKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisJCWVsc2UKKwkJeworCQkJY29uc3RfcmF3X2l0ZXJhdG9yIGl0ID0gQmFzZVZlY3Rvcjo6YmVnaW4oKTsKKwkJCWNvbnN0X3Jhd19pdGVyYXRvciBlbmRJdCA9IEJhc2VWZWN0b3I6OmVuZCgpOworCQkJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJCQl7CisJCQkJaWYoIChpdCkgPT0gYW5FbGVtZW50ICkKKwkJCQl7CisJCQkJCXJldHVybiggdHJ1ZSApOworCQkJCX0KKwkJCX0KKworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorCisKKwlpbmxpbmUgYm9vbCBjb250YWlucyhjb25zdCBCRiAmIGFuRWxlbWVudCkgY29uc3QKKwl7CisJCXJldHVybiggYW5FbGVtZW50LmlzPCBCYXNlVCA+KCkKKwkJCQkmJiBjb250YWlucyggYW5FbGVtZW50LnRvX3B0cjwgQmFzZVQgPigpICkgKTsKKwl9CisKKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwlpbmxpbmUgdmlydHVhbCB2b2lkIHN0ckZRTihPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCWNvbnN0X3Jhd19pdGVyYXRvciBpdCA9IGJlZ2luKCk7CisJCWNvbnN0X3Jhd19pdGVyYXRvciBlbmRJdCA9IGVuZCgpOworCQlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJeworLy8JCQlvcyA8PCBUQUIgPDwgc3RyX2ZxbihpdCkgPDwgRU9MOworCQkJb3MgPDwgVEFCIDw8IChpdCktPnN0ckZRTigpIDw8IEVPTDsKKwkJfQorCX0KKworCisJaW5saW5lIHZpcnR1YWwgdm9pZCBzdHJIZWFkZXIoT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQljb25zdF9yYXdfaXRlcmF0b3IgaXQgPSBiZWdpbigpOworCQljb25zdF9yYXdfaXRlcmF0b3IgZW5kSXQgPSBlbmQoKTsKKwkJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJCXsKKy8vCQkJb3MgPDwgVEFCIDw8IHN0cl9oZWFkZXIoIGl0ICkgPDwgRU9MOworCQkJKGl0KS0+c3RySGVhZGVyKCBvcyA8PCBUQUIgKTsgb3MgPDwgRU9MOworCQl9CisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCWNvbnN0X3Jhd19pdGVyYXRvciBpdCA9IGJlZ2luKCk7CisJCWNvbnN0X3Jhd19pdGVyYXRvciBlbmRJdCA9IGVuZCgpOworCQlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJeworCQkJKGl0KS0+dG9TdHJlYW0ob3MpOworCQl9CisJfQorCit9OworCisKKy8qKgorICogb3BlcmF0b3IgPDwKKyAqLworQVZNX09TX1NUUkVBTV9DT0xMRUNUSU9OKCBCRkxpc3QgICAgICkKK0FWTV9PU19TVFJFQU1fQ09MTEVDVElPTiggQXJyYXlPZkJGICApCitBVk1fT1NfU1RSRUFNX0NPTExFQ1RJT04oIEJGVmVjdG9yICAgKQorQVZNX09TX1NUUkVBTV9DT0xMRUNUSU9OKCBCRk11bHRpc2V0ICkKK0FWTV9PU19TVFJFQU1fQ09MTEVDVElPTiggQkZTZXQgICAgICApCisKKworCit0eXBlZGVmICBMaXN0IDwgQkZMaXN0ICogPiBMaXN0T2ZCRkxpc3Q7CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKiBCRkNPTlRBSU5FUl9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29sbGVjdGlvbi9CaXRzZXQuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbGxlY3Rpb24vQml0c2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgxMTg2ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbGxlY3Rpb24vQml0c2V0LmgKQEAgLTAsMCArMSwxMjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyNiBub3YuIDIwMTAKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBBVk1CSVRTRVRfSF8KKyNkZWZpbmUgQVZNQklUU0VUX0hfCisKKyNpbmNsdWRlIDx1dGlsL2F2bV9pbmplY3Rvci5oPgorI2luY2x1ZGUgPGJvb3N0L2R5bmFtaWNfYml0c2V0LmhwcD4KKworI2luY2x1ZGUgPHV0aWwvYXZtX251bWVyaWMuaD4KKyNpbmNsdWRlIDxjb2xsZWN0aW9uL0FycmF5Lmg+CisjaW5jbHVkZSA8Y29sbGVjdGlvbi9WZWN0b3IuaD4KKworCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjbGFzcyBCaXRzZXQgOgorCQlwdWJsaWMgYm9vc3Q6OmR5bmFtaWNfYml0c2V0PD4sCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggQml0c2V0ICkKK3sKKworcHVibGljOgorCS8qKgorCSAqIFRZUEVERUYKKwkgKi8KKwl0eXBlZGVmIGJvb3N0OjpkeW5hbWljX2JpdHNldDw+ICBiYXNlX2JpdHNldF90OworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlCaXRzZXQoKQorCTogYmFzZV9iaXRzZXRfdCggKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJZXhwbGljaXQgQml0c2V0KGF2bV9zaXplX3QgbGVuZ3RoLCBib29sIGlzU2V0KQorCTogYmFzZV9iaXRzZXRfdCggbGVuZ3RoICkKKwl7CisJCWlmKCBpc1NldCApCisJCXsKKwkJCXNldCgpOworCQl9CisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJQml0c2V0KGNvbnN0IEJpdHNldCAmIGFCaXRzZXQpCisJOiBiYXNlX2JpdHNldF90KCBhQml0c2V0ICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJQml0c2V0KGNvbnN0IGJhc2VfYml0c2V0X3QgJiBhQml0c2V0KQorCTogYmFzZV9iaXRzZXRfdCggYUJpdHNldCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5CaXRzZXQoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwlpbmxpbmUgYm9vbCBhbGxUcnVlKCkgY29uc3QKKwl7CisJCXJldHVybiggYmFzZV9iaXRzZXRfdDo6Y291bnQoKSA9PSBiYXNlX2JpdHNldF90OjpzaXplKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBhbnlUcnVlKCkgY29uc3QKKwl7CisJCXJldHVybiggYmFzZV9iaXRzZXRfdDo6YW55KCkgKTsKKwl9CisKKworCWlubGluZSBib29sIGFsbEZhbHNlKCkgY29uc3QKKwl7CisJCXJldHVybiggYmFzZV9iaXRzZXRfdDo6bm9uZSgpICk7CisJfQorCisJaW5saW5lIGJvb2wgYW55RmFsc2UoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBiYXNlX2JpdHNldF90Ojpjb3VudCgpICE9IGJhc2VfYml0c2V0X3Q6OnNpemUoKSApOworCX0KKworfTsKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDT0xFRUNUSU9OIFRZUEUgREVGSU5JVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordHlwZWRlZiBBcnJheTwgQml0c2V0ICogPiAgQXJyYXlPZkJpdHNldDsKKwordHlwZWRlZiBWZWN0b3I8IEJpdHNldCAgPiAgVmVjdG9yT2ZCaXRzZXQ7CisKKworfQorCisjZW5kaWYgLyogQVZNQklUU0VUX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb2xsZWN0aW9uL0NNYWtlTGlzdHMudHh0IGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29sbGVjdGlvbi9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTY3ZTEyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29sbGVjdGlvbi9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDEzIEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorIyAgICAgICAgICAgICAgICAgICBDTWFrZSBmaWxlIGZvciB0aGUgQ09MTEVDIGxpYnJhcnkNCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorDQorIyBDKysgc291cmNlIGZpbGVzIHRvIHRha2UgaW50byBhY2NvdW50IChhbGwgZmlsZXMgbWF0Y2hpbmcgcGF0dGVybnMgcmVjdXJzaXZlbHkpDQorZmlsZSAoR0xPQl9SRUNVUlNFIENPTExFQ19DWFhfU1JDX0ZJTEVTICouY3BwICouaCkNCisNCisjIFRhcmdldCB0byBidWlsZA0KK2FkZF9saWJyYXJ5IChjb2xsZWN0aW9uIFNUQVRJQyAke0NPTExFQ19DWFhfU1JDX0ZJTEVTfSkNCisNCisjIEluY2x1ZGUgZGlyZWN0b3JpZXMgKGludGVybmFsKQ0KK3RhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzIChjb2xsZWN0aW9uIFBVQkxJQyAuLikgI8KgRklYTUUgOiBleHBsaWNpdCB0aGUgZGVwZW5kZW5jaWVzIGxpYiBieSBsaWINCisNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb2xsZWN0aW9uL0NvbGxlY3Rpb24uaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbGxlY3Rpb24vQ29sbGVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMDk3MGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb2xsZWN0aW9uL0NvbGxlY3Rpb24uaApAQCAtMCwwICsxLDE2NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBDT05UQUlORVJfQ09MTEVDVElPTl9IXworI2RlZmluZSBDT05UQUlORVJfQ09MTEVDVElPTl9IXworCisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBzZXAKK3sKKworCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CitjbGFzcyBDb2xsZWN0aW9uCit7CisKK3B1YmxpYzoKKworCS8qKgorCSAqIFRZUEVERUYKKwkgKiBpdGVyYXRvcgorCSAqIHJlZmVyZW5jZQorCSAqLworCXR5cGVkZWYgVCAgICAgICAmICByZWZlcmVuY2U7CisJdHlwZWRlZiBjb25zdCBUICYgIGNvbnN0X3JlZmVyZW5jZTsKKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkNvbGxlY3Rpb24oKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBTRVRURVIKKwkgKiBwdXNoIGJhY2sgJiBmcm9udAorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKi8KKwl2aXJ0dWFsIHZvaWQgcHVzaF9iYWNrKGNvbnN0IFQgJiBhcmcpID0gMDsKKworCXZpcnR1YWwgdm9pZCBwdXNoX2JhY2soY29uc3Qgc3RkOjpsaXN0PCBUID4gJiBhQ29sbGVjdGlvbikgPSAwOworCisJdmlydHVhbCB2b2lkIHB1c2hfYmFjayhjb25zdCBzdGQ6OnZlY3RvcjwgVCA+ICYgYUNvbGxlY3Rpb24pID0gMDsKKworCisJdmlydHVhbCB2b2lkIHB1c2hfZnJvbnQoY29uc3QgVCAmIGFyZykgPSAwOworCisJdmlydHVhbCB2b2lkIHB1c2hfZnJvbnQoY29uc3Qgc3RkOjpsaXN0PCBUID4gJiBhQ29sbGVjdGlvbikgPSAwOworCisJdmlydHVhbCB2b2lkIHB1c2hfZnJvbnQoY29uc3Qgc3RkOjp2ZWN0b3I8IFQgPiAmIGFDb2xsZWN0aW9uKSA9IDA7CisKKworCisJLyoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogR0VUVEVSCisJICogZW1wdGluZXNzCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCXZpcnR1YWwgYm9vbCBlbXB0eSgpIGNvbnN0ID0gMDsKKworCXZpcnR1YWwgYm9vbCBub25lbXB0eSgpIGNvbnN0ID0gMDsKKworCXZpcnR1YWwgYm9vbCBzaW5nbGV0b24oKSBjb25zdCA9IDA7CisKKwl2aXJ0dWFsIGJvb2wgcG9wdWxhdGVkKCkgY29uc3QgPSAwOworCisKKy8vCXZpcnR1YWwgYXZtX3NpemVfdCBzaXplKCkgY29uc3QgPSAwOworCisKKwkvKioKKwkgKiBjb250YWlucyBhIHBhcnRpY3VsYXIgZWxlbWVudAorCSAqLworCXZpcnR1YWwgYm9vbCBjb250YWlucyhjb25zdCBUICYgYXJnKSBjb25zdCA9IDA7CisKKworCS8qCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFNFVFRFUgorCSAqIGFwcGVuZAorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKi8KKwl2aXJ0dWFsIHZvaWQgYXBwZW5kKGNvbnN0IFQgJiBhcmcpID0gMDsKKworCXZpcnR1YWwgdm9pZCBhcHBlbmQoY29uc3QgVCAmIGFyZzEsIGNvbnN0IFQgJiBhcmcyKSA9IDA7CisKKwl2aXJ0dWFsIHZvaWQgYXBwZW5kKFQgKiBhbkFycmF5T2ZBcmd1bWVudCwgaW50IGFuQXJnU2l6ZSkgPSAwOworCisKKwkvKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBhZGRfdW5pb24KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJdmlydHVhbCB2b2lkIGFkZF91bmlvbihjb25zdCBUICYgYXJnKSA9IDA7CisKKwl2aXJ0dWFsIHZvaWQgYWRkX3VuaW9uKGNvbnN0IFQgJiBhcmcxLCBjb25zdCBUICYgYXJnMikgPSAwOworCisKKwl2aXJ0dWFsIHZvaWQgYWRkX3VuaW9uKGNvbnN0IHN0ZDo6bGlzdDwgVCA+ICYgYUNvbGxlY3Rpb24pID0gMDsKKworCXZpcnR1YWwgdm9pZCBhZGRfdW5pb24oY29uc3Qgc3RkOjp2ZWN0b3I8IFQgPiAmIGFDb2xsZWN0aW9uKSA9IDA7CisKKworCS8qCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIEdFVFRFUgorCSAqIGZpcnN0ICYgLi4uICYgbGFzdAorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKi8KKwl2aXJ0dWFsIHJlZmVyZW5jZSBmaXJzdCgpID0gMDsKKwl2aXJ0dWFsIGNvbnN0X3JlZmVyZW5jZSBmaXJzdCgpIGNvbnN0ID0gMDsKKworCXZpcnR1YWwgVCBwb3BfZmlyc3QoKSA9IDA7CisKKwl2aXJ0dWFsIHZvaWQgcG9wX2ZpcnN0X3RvKFQgJiB0aGVGaXJzdCkgPSAwOworCisJdmlydHVhbCByZWZlcmVuY2Ugc2Vjb25kKCkgPSAwOworCXZpcnR1YWwgY29uc3RfcmVmZXJlbmNlIHNlY29uZCgpIGNvbnN0ID0gMDsKKworCXZpcnR1YWwgcmVmZXJlbmNlIGxhc3QoKSA9IDA7CisJdmlydHVhbCBjb25zdF9yZWZlcmVuY2UgbGFzdCgpIGNvbnN0ID0gMDsKKworCXZpcnR1YWwgVCBwb3BfbGFzdCgpID0gMDsKKworCXZpcnR1YWwgdm9pZCBwb3BfbGFzdF90byhUICYgdGhlTGFzdCkgPSAwOworCisKKwkvKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBTRVRURVIKKwkgKiByZXNldAorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKi8KKwl2aXJ0dWFsIHZvaWQgcmVzZXQoY29uc3QgVCAmIGFyZykgPSAwOworCisJdmlydHVhbCB2b2lkIHJlc2V0KGNvbnN0IHN0ZDo6bGlzdDwgVCA+ICYgYUNvbGxlY3Rpb24pID0gMDsKKworCXZpcnR1YWwgdm9pZCByZXNldChjb25zdCBzdGQ6OnZlY3RvcjwgVCA+ICYgYUNvbGxlY3Rpb24pID0gMDsKKworCisKKy8vCXZpcnR1YWwgdm9pZCBtYWtlVW5pcXVlKCkgPSAwOworCit9OworCisKK30KKworI2VuZGlmIC8qQ09OVEFJTkVSX0NPTExFQ1RJT05fSF8qLworCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb2xsZWN0aW9uL0xpc3QuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbGxlY3Rpb24vTGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYjkwMTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb2xsZWN0aW9uL0xpc3QuaApAQCAtMCwwICsxLDc0OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBDT05UQUlORVJfTElTVF9IXworI2RlZmluZSBDT05UQUlORVJfTElTVF9IXworCisjaW5jbHVkZSA8bGlzdD4KKworI2luY2x1ZGUgPHV0aWwvYXZtX2Fzc2VydC5oPgorI2luY2x1ZGUgPHV0aWwvYXZtX251bWVyaWMuaD4KKyNpbmNsdWRlIDxiYXNlL1NtYXJ0UG9pbnRlclV0aWwuaD4KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vQ29sbGVjdGlvbi5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CitjbGFzcyBMaXN0IDoKKwkJcHVibGljIHN0ZDo6bGlzdDwgVCA+LAorCQlwdWJsaWMgQ29sbGVjdGlvbjwgVCA+Cit7CisKK3B1YmxpYzoKKwkvKioKKwkgKiBUWVBFREVGCisJICovCisJdHlwZWRlZiAgICAgICBUICYgICAgICAgICByZWZlcmVuY2U7CisJdHlwZWRlZiBjb25zdCBUICYgICAgICAgICBjb25zdF9yZWZlcmVuY2U7CisKKwl0eXBlZGVmIHN0ZDo6bGlzdDwgVCA+ICAgIEJhc2VMaXN0OworCXR5cGVkZWYgc3RkOjp2ZWN0b3I8IFQgPiAgQmFzZVZlY3RvcjsKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUxpc3QoKQorCTogQmFzZUxpc3QoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIENvcHkKKwkgKi8KKwlMaXN0KGNvbnN0IExpc3QgJiBhTGlzdCkKKwk6IEJhc2VMaXN0KCBhTGlzdCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogT3RoZXJzCisJICovCisJZXhwbGljaXQgTGlzdChjb25zdCBUICYgYXJnKQorCTogQmFzZUxpc3QoKQorCXsKKwkJYXBwZW5kKGFyZyk7CisJfQorCisJZXhwbGljaXQgTGlzdChjb25zdCBUICYgYXJnMSwgY29uc3QgVCAmIGFyZzIpCisJOiBCYXNlTGlzdCgpCisJeworCQlhcHBlbmQoYXJnMSwgYXJnMik7CisJfQorCisJZXhwbGljaXQgTGlzdChUIGFyZzEsIFQgYXJnMiwgVCBhcmczKQorCTogQmFzZUxpc3QoKQorCXsKKwkJYXBwZW5kKGFyZzEsIGFyZzIsIGFyZzMpOworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkxpc3QoKQorCXsKKwkJQmFzZUxpc3Q6OmNsZWFyKCk7CisJfQorCisKKwkvKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBTRVRURVIKKwkgKiBwb3AgfCBwdXNoICBiYWNrCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCisJaW5saW5lIHZpcnR1YWwgdm9pZCBwb3BfYmFjaygpCisJeworCQlCYXNlTGlzdDo6cG9wX2JhY2soKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBwb3BfYmFjayhhdm1fc2l6ZV90IGNvdW50KQorCXsKKwkJZm9yKCA7IChjb3VudCA+IDApICYmIG5vbmVtcHR5KCkgOyAtLWNvdW50ICkKKwkJeworCQkJQmFzZUxpc3Q6OnBvcF9iYWNrKCk7CisJCX0KKwl9CisKKworCWlubGluZSB2aXJ0dWFsIHZvaWQgcHVzaF9iYWNrKGNvbnN0IFQgJiBhcmcpCisJeworCQlCYXNlTGlzdDo6cHVzaF9iYWNrKGFyZyk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHB1c2hfYmFjayhjb25zdCBzdGQ6Omxpc3Q8IFQgPiAmIGFDb2xsZWN0aW9uKQorCXsKKwkJQmFzZUxpc3Q6Omluc2VydChCYXNlTGlzdDo6ZW5kKCksCisJCQkJYUNvbGxlY3Rpb24uYmVnaW4oKSwgYUNvbGxlY3Rpb24uZW5kKCkpOworCX0KKworCXRlbXBsYXRlPCB0eXBlbmFtZSBfVE9FID4KKwlpbmxpbmUgdm9pZCBwdXNoX2JhY2soY29uc3Qgc3RkOjpsaXN0PCBfVE9FID4gJiBhQ29sbGVjdGlvbikKKwl7CisJCUJhc2VMaXN0OjppbnNlcnQoQmFzZUxpc3Q6OmVuZCgpLAorCQkJCWFDb2xsZWN0aW9uLmJlZ2luKCksIGFDb2xsZWN0aW9uLmVuZCgpKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIHZvaWQgcHVzaF9iYWNrKGNvbnN0IHN0ZDo6dmVjdG9yPCBUID4gJiBhQ29sbGVjdGlvbikKKwl7CisJCUJhc2VMaXN0OjppbnNlcnQoQmFzZUxpc3Q6OmVuZCgpLAorCQkJCWFDb2xsZWN0aW9uLmJlZ2luKCksIGFDb2xsZWN0aW9uLmVuZCgpKTsKKwl9CisKKwl0ZW1wbGF0ZTwgdHlwZW5hbWUgX1RPRSA+CisJaW5saW5lIHZvaWQgcHVzaF9iYWNrKGNvbnN0IHN0ZDo6dmVjdG9yPCBfVE9FID4gJiBhQ29sbGVjdGlvbikKKwl7CisJCUJhc2VMaXN0OjppbnNlcnQoQmFzZUxpc3Q6OmVuZCgpLAorCQkJCWFDb2xsZWN0aW9uLmJlZ2luKCksIGFDb2xsZWN0aW9uLmVuZCgpKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIHZvaWQgcHVzaF9mcm9udChjb25zdCBUICYgYXJnKQorCXsKKwkJQmFzZUxpc3Q6OnB1c2hfZnJvbnQoYXJnKTsKKwl9CisKKworCS8qCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFNFVFRFUgorCSAqIHBvcCB8IHB1c2ggIGZyb250CisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCisJaW5saW5lIHZpcnR1YWwgdm9pZCBwb3BfZnJvbnQoKQorCXsKKwkJQmFzZUxpc3Q6OnBvcF9mcm9udCgpOworCX0KKworCWlubGluZSB2b2lkIHBvcF9mcm9udChhdm1fc2l6ZV90IGNvdW50KQorCXsKKwkJZm9yKCA7IChjb3VudCA+IDApICYmIG5vbmVtcHR5KCkgOyAtLWNvdW50ICkKKwkJeworCQkJQmFzZUxpc3Q6OnBvcF9mcm9udCgpOworCQl9CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHB1c2hfZnJvbnQoY29uc3Qgc3RkOjpsaXN0PCBUID4gJiBhQ29sbGVjdGlvbikKKwl7CisJCUJhc2VMaXN0OjppbnNlcnQoQmFzZUxpc3Q6OmJlZ2luKCksCisJCQkJYUNvbGxlY3Rpb24uYmVnaW4oKSwgYUNvbGxlY3Rpb24uZW5kKCkpOworCX0KKworCXRlbXBsYXRlPCB0eXBlbmFtZSBfVE9FID4KKwlpbmxpbmUgdm9pZCBwdXNoX2Zyb250KGNvbnN0IHN0ZDo6bGlzdDwgX1RPRSA+ICYgYUNvbGxlY3Rpb24pCisJeworCQlCYXNlTGlzdDo6aW5zZXJ0KEJhc2VMaXN0OjpiZWdpbigpLAorCQkJCWFDb2xsZWN0aW9uLmJlZ2luKCksIGFDb2xsZWN0aW9uLmVuZCgpKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIHZvaWQgcHVzaF9mcm9udChjb25zdCBzdGQ6OnZlY3RvcjwgVCA+ICYgYUNvbGxlY3Rpb24pCisJeworCQlCYXNlTGlzdDo6aW5zZXJ0KEJhc2VMaXN0OjpiZWdpbigpLAorCQkJCWFDb2xsZWN0aW9uLmJlZ2luKCksIGFDb2xsZWN0aW9uLmVuZCgpKTsKKwl9CisKKwl0ZW1wbGF0ZTwgdHlwZW5hbWUgX1RPRSA+CisJaW5saW5lIHZvaWQgcHVzaF9mcm9udChjb25zdCBzdGQ6OnZlY3RvcjwgX1RPRSA+ICYgYUNvbGxlY3Rpb24pCisJeworCQlCYXNlTGlzdDo6aW5zZXJ0KEJhc2VMaXN0OjpiZWdpbigpLAorCQkJCWFDb2xsZWN0aW9uLmJlZ2luKCksIGFDb2xsZWN0aW9uLmVuZCgpKTsKKwl9CisKKworCS8qCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIEdFVFRFUgorCSAqIGVtcHRpbmVzcworCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCBib29sIGVtcHR5KCkgY29uc3QKKwl7CisJCXJldHVybiggQmFzZUxpc3Q6OmVtcHR5KCkgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBib29sIG5vbmVtcHR5KCkgY29uc3QKKwl7CisJCXJldHVybiggbm90IEJhc2VMaXN0OjplbXB0eSgpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgYm9vbCBzaW5nbGV0b24oKSBjb25zdAorCXsKKwkJLy9yZXR1cm4oIHNpemUoKSA9PSAxICk7CisKKwkJdHlwZW5hbWUgQmFzZUxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gQmFzZUxpc3Q6OmJlZ2luKCk7CisJCXR5cGVuYW1lIEJhc2VMaXN0Ojpjb25zdF9pdGVyYXRvciBpdEVuZCA9IEJhc2VMaXN0OjplbmQoKTsKKwkJcmV0dXJuKCAoaXQgIT0gaXRFbmQpICYmICgoKytpdCkgPT0gaXRFbmQpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgYm9vbCBwb3B1bGF0ZWQoKSBjb25zdAorCXsKKwkJLy9yZXR1cm4oIHNpemUoKSA+IDEgKTsKKworCQl0eXBlbmFtZSBCYXNlTGlzdDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBCYXNlTGlzdDo6YmVnaW4oKTsKKwkJdHlwZW5hbWUgQmFzZUxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gQmFzZUxpc3Q6OmVuZCgpOworCQlyZXR1cm4oIChpdCAhPSBpdEVuZCkgJiYgKCgrK2l0KSAhPSBpdEVuZCkgKTsKKwl9CisKKworCS8vCWlubGluZSB2aXJ0dWFsIGF2bV9zaXplX3Qgc2l6ZSgpIGNvbnN0CisJLy8JeworCS8vCQlyZXR1cm4oIEJhc2VMaXN0OjpzaXplKCkgKTsKKwkvLwl9CisKKworCS8qKgorCSAqIGNvbnRhaW5zIGEgcGFydGljdWxhciBlbGVtZW50CisJICovCisJaW5saW5lIHZpcnR1YWwgYm9vbCBjb250YWlucyhjb25zdCBUICYgYXJnKSBjb25zdAorCXsKKwkJdHlwZW5hbWUgQmFzZUxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gQmFzZUxpc3Q6OmJlZ2luKCk7CisJCXR5cGVuYW1lIEJhc2VMaXN0Ojpjb25zdF9pdGVyYXRvciBpdEVuZCA9IEJhc2VMaXN0OjplbmQoKTsKKwkJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApCisJCXsKKwkJCWlmKCAoKml0KSA9PSBhcmcgKQorCQkJeworCQkJCXJldHVybiggdHJ1ZSApOworCQkJfQorCQl9CisKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCisJLyoqCisJICogaGFzIGFuIGludGVyc2VjdGlvbiB3aXRoIGFub3RoZXIgbGlzdAorCSAqLworCWlubGluZSB2aXJ0dWFsIGJvb2wgaW50ZXJzZWN0KGNvbnN0IHN0ZDo6bGlzdDwgVCA+ICYgYUNvbGxlY3Rpb24pIGNvbnN0CisJeworCQl0eXBlbmFtZSBzdGQ6Omxpc3Q8IFQgPjo6Y29uc3RfaXRlcmF0b3IgaXRDb2w7CisJCXR5cGVuYW1lIHN0ZDo6bGlzdDwgVCA+Ojpjb25zdF9pdGVyYXRvciBlbmRJdENvbCA9IGFDb2xsZWN0aW9uLmVuZCgpOworCisJCXR5cGVuYW1lIEJhc2VMaXN0Ojpjb25zdF9pdGVyYXRvciBpdCA9IEJhc2VMaXN0OjpiZWdpbigpOworCQl0eXBlbmFtZSBCYXNlTGlzdDo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBCYXNlTGlzdDo6ZW5kKCk7CisJCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQorCQl7CisJCQlmb3IoIGl0Q29sID0gYUNvbGxlY3Rpb24uYmVnaW4oKSA7IGl0Q29sICE9IGVuZEl0Q29sIDsgKytpdENvbCApCisJCQl7CisJCQkJaWYoICgqaXQpID09ICgqaXRDb2wpICkKKwkJCQl7CisJCQkJCXJldHVybiggdHJ1ZSApOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKworCS8qCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFNFVFRFUgorCSAqIGFwcGVuZAorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCB2b2lkIGFwcGVuZChjb25zdCBUICYgYXJnKQorCXsKKwkJQmFzZUxpc3Q6OnB1c2hfYmFjayhhcmcpOworCX0KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgYXBwZW5kKGNvbnN0IFQgJiBhcmcxLCBjb25zdCBUICYgYXJnMikKKwl7CisJCWFwcGVuZChhcmcxKTsKKwkJYXBwZW5kKGFyZzIpOworCX0KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgYXBwZW5kKGNvbnN0IFQgJiBhcmcxLCBjb25zdCBUICYgYXJnMiwgY29uc3QgVCAmIGFyZzMpCisJeworCQlhcHBlbmQoYXJnMSk7CisJCWFwcGVuZChhcmcyKTsKKwkJYXBwZW5kKGFyZzMpOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgdm9pZCBhcHBlbmQoVCAqIGFuQXJyYXlPZkFyZ3VtZW50LCBpbnQgYW5BcmdTaXplKQorCXsKKwkJZm9yIChpbnQgaSA9IDAgOyBpIDwgYW5BcmdTaXplIDsgKytpKQorCQl7CisJCQlwdXNoX2JhY2soYW5BcnJheU9mQXJndW1lbnRbaV0pOworCQl9CisJfQorCisJdGVtcGxhdGU8IHR5cGVuYW1lIF9UT0UgPgorCWlubGluZSB2b2lkIGFwcGVuZChjb25zdCBzdGQ6Omxpc3Q8IF9UT0UgPiAmIGFDb2xsZWN0aW9uKQorCXsKKwkJQmFzZUxpc3Q6Omluc2VydChCYXNlTGlzdDo6ZW5kKCksCisJCQkJYUNvbGxlY3Rpb24uYmVnaW4oKSwgYUNvbGxlY3Rpb24uZW5kKCkpOworCX0KKworCXRlbXBsYXRlPCB0eXBlbmFtZSBfVE9FID4KKwlpbmxpbmUgdm9pZCBzcGxpY2Uoc3RkOjpsaXN0PCBfVE9FID4gJiBhQ29sbGVjdGlvbikKKwl7CisJCUJhc2VMaXN0OjpzcGxpY2UoQmFzZUxpc3Q6OmVuZCgpLCBhQ29sbGVjdGlvbik7CisJfQorCisJdGVtcGxhdGU8IHR5cGVuYW1lIF9UT0UgPgorCWlubGluZSB2b2lkIGFwcGVuZChjb25zdCBzdGQ6OnZlY3RvcjwgX1RPRSA+ICYgYUNvbGxlY3Rpb24pCisJeworCQlCYXNlTGlzdDo6aW5zZXJ0KEJhc2VMaXN0OjplbmQoKSwKKwkJCQlhQ29sbGVjdGlvbi5iZWdpbigpLCBhQ29sbGVjdGlvbi5lbmQoKSk7CisJfQorCisKKwkvKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBTRVRURVIKKwkgKiBhZGRfdW5pb24KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJaW5saW5lIHZpcnR1YWwgdm9pZCBhZGRfdW5pb24oY29uc3QgVCAmIGFyZykKKwl7CisJCWlmKCBub3QgY29udGFpbnMoYXJnKSApCisJCXsKKwkJCUJhc2VMaXN0OjpwdXNoX2JhY2soYXJnKTsKKwkJfQorCX0KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgYWRkX3VuaW9uKGNvbnN0IFQgJiBhcmcxLCBjb25zdCBUICYgYXJnMikKKwl7CisJCWFkZF91bmlvbihhcmcxKTsKKwkJYWRkX3VuaW9uKGFyZzIpOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgdm9pZCBhZGRfdW5pb24oVCAqIGFuQXJyYXlPZkFyZ3VtZW50LCBpbnQgYW5BcmdTaXplKQorCXsKKwkJZm9yIChpbnQgaSA9IDAgOyBpIDwgYW5BcmdTaXplIDsgKytpKQorCQl7CisJCQlhZGRfdW5pb24oIGFuQXJyYXlPZkFyZ3VtZW50W2ldICk7CisJCX0KKwl9CisKKworCWlubGluZSB2aXJ0dWFsIHZvaWQgYWRkX3VuaW9uKGNvbnN0IHN0ZDo6bGlzdDwgVCA+ICYgYUNvbGxlY3Rpb24pCisJeworCQl0eXBlbmFtZSBzdGQ6Omxpc3Q8IFQgPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBhQ29sbGVjdGlvbi5iZWdpbigpOworCQlmb3IoIDsgaXQgIT0gYUNvbGxlY3Rpb24uZW5kKCkgOyArK2l0ICkKKwkJeworCQkJYWRkX3VuaW9uKCAoKml0KSApOworCQl9CisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCBhZGRfdW5pb24oY29uc3Qgc3RkOjpsaXN0PCBUID4gKiBhQ29sbGVjdGlvbikKKwl7CisJCXR5cGVuYW1lIHN0ZDo6bGlzdDwgVCA+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGFDb2xsZWN0aW9uLT5iZWdpbigpOworCQlmb3IoIDsgaXQgIT0gYUNvbGxlY3Rpb24tPmVuZCgpIDsgKytpdCApCisJCXsKKwkJCWFkZF91bmlvbiggKCppdCkgKTsKKwkJfQorCX0KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgYWRkX3VuaW9uKGNvbnN0IHN0ZDo6dmVjdG9yPCBUID4gJiBhQ29sbGVjdGlvbikKKwl7CisJCXR5cGVuYW1lIHN0ZDo6dmVjdG9yPCBUID46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYUNvbGxlY3Rpb24uYmVnaW4oKTsKKwkJZm9yKCA7IGl0ICE9IGFDb2xsZWN0aW9uLmVuZCgpIDsgKytpdCApCisJCXsKKwkJCWFkZF91bmlvbiggKCppdCkgKTsKKwkJfQorCX0KKworCisJLyoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogR0VUVEVSCisJICogZmlyc3QgJiAuLi4gJiBsYXN0CisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCWlubGluZSB2aXJ0dWFsIHJlZmVyZW5jZSBmaXJzdCgpCisJeworCQlyZXR1cm4oIEJhc2VMaXN0Ojpmcm9udCgpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgY29uc3RfcmVmZXJlbmNlIGZpcnN0KCkgY29uc3QKKwl7CisJCXJldHVybiggQmFzZUxpc3Q6OmZyb250KCkgKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIFQgcG9wX2ZpcnN0KCkKKwl7CisJCVQgdGhlRmlyc3QgPSBCYXNlTGlzdDo6ZnJvbnQoKTsKKworCQlCYXNlTGlzdDo6cG9wX2Zyb250KCk7CisKKwkJcmV0dXJuKCB0aGVGaXJzdCApOworCX0KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgcG9wX2ZpcnN0X3RvKFQgJiB0aGVGaXJzdCkKKwl7CisJCXRoZUZpcnN0ID0gQmFzZUxpc3Q6OmZyb250KCk7CisKKwkJQmFzZUxpc3Q6OnBvcF9mcm9udCgpOworCX0KKworCWlubGluZSB2b2lkIHJlbW92ZV9maXJzdCgpCisJeworCQlCYXNlTGlzdDo6cG9wX2Zyb250KCk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCByZWZlcmVuY2Ugc2Vjb25kKCkKKwl7CisJCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggcG9wdWxhdGVkKCkgKQorCQkJCTw8ICJFeHBlY3RlZCBhIExpc3Qgd2l0aCBzaXplKCkgPiAxICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJcmV0dXJuKCAqKCArKyhCYXNlTGlzdDo6YmVnaW4oKSkgKSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGNvbnN0X3JlZmVyZW5jZSBzZWNvbmQoKSBjb25zdAorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKCBwb3B1bGF0ZWQoKSApCisJCQkJPDwgIkV4cGVjdGVkIGEgTGlzdCB3aXRoIHNpemUoKSA+IDEgISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQlyZXR1cm4oICooICsrKEJhc2VMaXN0OjpiZWdpbigpKSApICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCByZWZlcmVuY2UgbGFzdCgpCisJeworCQlyZXR1cm4oICooIEJhc2VMaXN0OjpyYmVnaW4oKSApICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgY29uc3RfcmVmZXJlbmNlIGxhc3QoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAqKCBCYXNlTGlzdDo6cmJlZ2luKCkgKSApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgVCBwb3BfbGFzdCgpCisJeworCQlUIHRoZUxhc3QgPSBCYXNlTGlzdDo6YmFjaygpOworCisJCUJhc2VMaXN0Ojpwb3BfYmFjaygpOworCisJCXJldHVybiggdGhlTGFzdCApOworCX0KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgcG9wX2xhc3RfdG8oVCAmIHRoZUxhc3QpCisJeworCQl0aGVMYXN0ID0gQmFzZUxpc3Q6OmJhY2soKTsKKworCQlCYXNlTGlzdDo6cG9wX2JhY2soKTsKKwl9CisKKwlpbmxpbmUgdm9pZCByZW1vdmVfbGFzdCgpCisJeworCQlCYXNlTGlzdDo6cG9wX2JhY2soKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIHJlZmVyZW5jZSBhdChhdm1fc2l6ZV90IGluZGV4KQorCXsKKwkJdHlwZW5hbWUgQmFzZUxpc3Q6Oml0ZXJhdG9yIGl0ID0gQmFzZUxpc3Q6OmJlZ2luKCk7CisJCXR5cGVuYW1lIEJhc2VMaXN0OjppdGVyYXRvciBpdEVuZCA9IEJhc2VMaXN0OjplbmQoKTsKKwkJZm9yKCA7IChpbmRleCA+IDApICYmIChpdCAhPSBpdEVuZCkgOyArK2l0ICwgLS1pbmRleCApCisJCXsKKwkJCS8vISEhIE5PVEhJTkcKKwkJfQorCisJCXJldHVybiggKChpbmRleCA9PSAwKSAmJiAoaXQgIT0gaXRFbmQpKSA/ICppdCA6IGxhc3QoKSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGNvbnN0X3JlZmVyZW5jZSBhdChhdm1fc2l6ZV90IGluZGV4KSBjb25zdAorCXsKKwkJdHlwZW5hbWUgQmFzZUxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gQmFzZUxpc3Q6OmJlZ2luKCk7CisJCXR5cGVuYW1lIEJhc2VMaXN0Ojpjb25zdF9pdGVyYXRvciBpdEVuZCA9IEJhc2VMaXN0OjplbmQoKTsKKwkJZm9yKCA7IChpbmRleCA+IDApICYmIChpdCAhPSBpdEVuZCkgOyArK2l0ICwgLS1pbmRleCApCisJCXsKKwkJCS8vISEhIE5PVEhJTkcKKwkJfQorCisJCXJldHVybiggKChpbmRleCA9PSAwKSAmJiAoaXQgIT0gaXRFbmQpKSA/ICppdCA6IGxhc3QoKSApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgcmVmZXJlbmNlIGdldChhdm1fc2l6ZV90IGluZGV4KQorCXsKKwkJcmV0dXJuKCBhdChpbmRleCkgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBjb25zdF9yZWZlcmVuY2UgZ2V0KGF2bV9zaXplX3QgaW5kZXgpIGNvbnN0CisJeworCQlyZXR1cm4oIGF0KGluZGV4KSApOworCX0KKworCisJaW5saW5lIFQgcG9wX2luZGV4KGF2bV9zaXplX3QgaW5kZXgpCisJeworCQl0eXBlbmFtZSBCYXNlTGlzdDo6aXRlcmF0b3IgaXQgPSBCYXNlTGlzdDo6YmVnaW4oKTsKKwkJdHlwZW5hbWUgQmFzZUxpc3Q6Oml0ZXJhdG9yIGl0RW5kID0gQmFzZUxpc3Q6OmVuZCgpOworCQlmb3IoIDsgKGluZGV4ID4gMCkgJiYgKGl0ICE9IGl0RW5kKSA7ICsraXQgLCAtLWluZGV4ICkKKwkJeworCQkJLy8hISEgTk9USElORworCQl9CisKKwkJaWYoIChpbmRleCA9PSAwKSAmJiAoaXQgIT0gaXRFbmQpICkKKwkJeworCQkJVCB0aGVFbHQgPSAqaXQ7CisKKwkJCUJhc2VMaXN0OjplcmFzZSggaXQgKTsKKworCQkJcmV0dXJuKCB0aGVFbHQgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybiggcG9wX2xhc3QoKSApOworCQl9CisJfQorCisKKwkvKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBTRVRURVIKKwkgKiByZXNldAorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCB2b2lkIHJlc2V0KGNvbnN0IFQgJiBhcmcpCisJeworCQlCYXNlTGlzdDo6Y2xlYXIoKTsKKwkJcHVzaF9iYWNrKGFyZyk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHJlc2V0KGNvbnN0IHN0ZDo6bGlzdDwgVCA+ICYgYUNvbGxlY3Rpb24pCisJeworCQlCYXNlTGlzdDo6Y2xlYXIoKTsKKworCQlwdXNoX2JhY2soYUNvbGxlY3Rpb24pOworCX0KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgcmVzZXQoY29uc3Qgc3RkOjp2ZWN0b3I8IFQgPiAmIGFDb2xsZWN0aW9uKQorCXsKKwkJQmFzZUxpc3Q6OmNsZWFyKCk7CisKKwkJcHVzaF9iYWNrKGFDb2xsZWN0aW9uKTsKKwl9CisKKworCXRlbXBsYXRlPCB0eXBlbmFtZSBfVE9FID4KKwlpbmxpbmUgdm9pZCByZXNldChjb25zdCBzdGQ6Omxpc3Q8IF9UT0UgPiAmIGFDb2xsZWN0aW9uKQorCXsKKwkJQmFzZUxpc3Q6OmNsZWFyKCk7CisKKwkJcHVzaF9iYWNrKGFDb2xsZWN0aW9uKTsKKwl9CisKKwl0ZW1wbGF0ZTwgdHlwZW5hbWUgX1RPRSA+CisJaW5saW5lIHZvaWQgcmVzZXQoY29uc3Qgc3RkOjp2ZWN0b3I8IF9UT0UgPiAmIGFDb2xsZWN0aW9uKQorCXsKKwkJQmFzZUxpc3Q6OmNsZWFyKCk7CisKKwkJcHVzaF9iYWNrKGFDb2xsZWN0aW9uKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIHZvaWQgcmVtb3ZlKGNvbnN0IFQgJiBhcmcpCisJeworCQlCYXNlTGlzdDo6cmVtb3ZlKGFyZyk7CisJfQorCisJaW5saW5lIHZvaWQgcmVtb3ZlKGNvbnN0IHN0ZDo6bGlzdDwgVCA+ICYgYUNvbGxlY3Rpb24pCisJeworCQl0eXBlbmFtZSBzdGQ6Omxpc3Q8IFQgPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBhQ29sbGVjdGlvbi5iZWdpbigpOworCQlmb3IoIDsgaXQgIT0gYUNvbGxlY3Rpb24uZW5kKCkgOyArK2l0ICkKKwkJeworCQkJQmFzZUxpc3Q6OnJlbW92ZSggKCppdCkgKTsKKwkJfQorCX0KKworCisJaW5saW5lIHZpcnR1YWwgdm9pZCBtYWtlVW5pcXVlKCkKKwl7CisJCWlmKCBwb3B1bGF0ZWQoKSApCisJCXsKKwkJCXR5cGVuYW1lIEJhc2VMaXN0Ojpjb25zdF9pdGVyYXRvciBpdFRtcDsKKworCQkJdHlwZW5hbWUgQmFzZUxpc3Q6Oml0ZXJhdG9yIGl0ID0gQmFzZUxpc3Q6OmJlZ2luKCk7CisJCQlmb3IoICsraXQgOyBpdCAhPSBCYXNlTGlzdDo6ZW5kKCkgOyApCisJCQl7CisJCQkJZm9yKCBpdFRtcCA9IEJhc2VMaXN0OjpiZWdpbigpIDsgaXRUbXAgIT0gaXQgOyArK2l0VG1wICkKKwkJCQl7CisJCQkJCWlmKCAoKml0VG1wKSA9PSAoKml0KSApCisJCQkJCXsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCisJCQkJaWYoIGl0VG1wICE9IGl0ICkKKwkJCQl7CisJCQkJCWl0ID0gQmFzZUxpc3Q6OmVyYXNlKGl0KTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJKytpdDsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvLwkJQmFzZUxpc3Q6OnNvcnQoKTsKKwkJLy8JCUJhc2VMaXN0Ojp1bmlxdWUoKTsKKwl9CisKK307CisKKworCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CitjbGFzcyBBUExpc3QgOiBwdWJsaWMgTGlzdDwgVCA+Cit7CitwdWJsaWM6CisJLyoqCisJICogVFlQRURFRgorCSAqLworCXR5cGVkZWYgVCAgICAgICAmIHJlZmVyZW5jZTsKKwl0eXBlZGVmIGNvbnN0IFQgJiBjb25zdF9yZWZlcmVuY2U7CisKKwl0eXBlZGVmIExpc3Q8IFQgPiAgQmFzZUFQTGlzdDsKKworCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQVBMaXN0KCkKKwk6IEJhc2VBUExpc3QoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJQVBMaXN0KGNvbnN0IEFQTGlzdCAmIGFMaXN0KQorCTogQmFzZUFQTGlzdCggKQorCXsKKwkJdHlwZW5hbWUgQmFzZUFQTGlzdDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBhTGlzdC5iZWdpbigpOworCQl0eXBlbmFtZSBCYXNlQVBMaXN0Ojpjb25zdF9pdGVyYXRvciBpdEVuZCA9IGFMaXN0LmVuZCgpOworCQlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwkJeworCQkJQmFzZUFQTGlzdDo6cHVzaF9iYWNrKCBzZXA6OmluY3JSZWZlcmVuY2VDb3VudCggKml0ICkgKTsKKwkJfQorCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkFQTGlzdCgpCisJeworCQljbGVhcigpOworCX0KKworCS8qKgorCSAqIENMRUFSCisJICovCisJdm9pZCBjbGVhcigpCisJeworCQl3aGlsZSggQmFzZUFQTGlzdDo6bm9uZW1wdHkoKSApCisJCXsKKwkJCXNlcDo6ZGVzdHJveSggQmFzZUFQTGlzdDo6cG9wX2xhc3QoKSApOworCQl9CisKKwkJQmFzZUFQTGlzdDo6Y2xlYXIoKTsKKwl9CisKK307CisKKworCisvKioKKyAqIE1FTU9SWSBNQU5BR0VNRU5UCisgKiBERVNUUk9ZCisgKi8KKwordGVtcGxhdGU8IGNsYXNzIFQgPgordm9pZCBkZXN0cm95KExpc3Q8IFQgKiA+ICogYUxpc3QpCit7CisJd2hpbGUoIGFMaXN0LT5ub25lbXB0eSgpICkKKwl7CisJCXNlcDo6ZGVzdHJveSggYUxpc3QtPnBvcF9sYXN0KCkgKTsKKwl9CisKKwlkZWxldGUoIGFMaXN0ICk7CisKKwlhTGlzdCA9IE5VTEw7Cit9CisKKwordGVtcGxhdGU8IGNsYXNzIFQgPgordm9pZCBkZXN0cm95KExpc3Q8IFQgPiAqIGFMaXN0KQoreworCWRlbGV0ZSggYUxpc3QgKTsKKworCWFMaXN0ID0gTlVMTDsKK30KKworCisKK30KKworI2VuZGlmIC8qQ09OVEFJTkVSX0xJU1RfSF8qLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29sbGVjdGlvbi9NdWx0aXNldC5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29sbGVjdGlvbi9NdWx0aXNldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYmFjMGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb2xsZWN0aW9uL011bHRpc2V0LmgKQEAgLTAsMCArMSwyNzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgQ09OVEFJTkVSX01VTFRJU0VUX0hfCisjZGVmaW5lIENPTlRBSU5FUl9NVUxUSVNFVF9IXworCisjaW5jbHVkZSA8c2V0PgorCisjaW5jbHVkZSA8YmFzZS9TbWFydFBvaW50ZXJVdGlsLmg+CisKKyNpbmNsdWRlIDxjb2xsZWN0aW9uL0NvbGxlY3Rpb24uaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKwordGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorY2xhc3MgTXVsdGlzZXQgIDogIHB1YmxpYyBzdGQ6Om11bHRpc2V0PCBUID4KK3sKKworcHVibGljOgorCS8qKgorCSAqIFRZUEVERUYKKwkgKi8KKwl0eXBlZGVmICAgICAgIFQgJiAgICAgICAgIHJlZmVyZW5jZTsKKwl0eXBlZGVmIGNvbnN0IFQgJiAgICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKworCXR5cGVkZWYgc3RkOjptdWx0aXNldDwgVCA+ICBCYXNlTXVsdGlzZXQ7CisJdHlwZWRlZiBzdGQ6OnZlY3RvcjwgVCA+ICAgIEJhc2VWZWN0b3I7CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlNdWx0aXNldCgpCisJOiBCYXNlTXVsdGlzZXQoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIENvcHkKKwkgKi8KKwlNdWx0aXNldChjb25zdCBNdWx0aXNldCAmIGFNdWx0aXNldCkKKwk6IEJhc2VNdWx0aXNldCggYU11bHRpc2V0ICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBPdGhlcnMKKwkgKi8KKwlleHBsaWNpdCBNdWx0aXNldChjb25zdCBUICYgYXJnKQorCTogQmFzZU11bHRpc2V0KCkKKwl7CisJCWFwcGVuZChhcmcpOworCX0KKworCWV4cGxpY2l0IE11bHRpc2V0KGNvbnN0IFQgJiBhcmcxLCBjb25zdCBUICYgYXJnMikKKwk6IEJhc2VNdWx0aXNldCgpCisJeworCQlhcHBlbmQoYXJnMSwgYXJnMik7CisJfQorCisJZXhwbGljaXQgTXVsdGlzZXQoY29uc3QgVCAmIGFyZzEsIGNvbnN0IFQgJiBhcmcyLCBjb25zdCBUICYgYXJnMykKKwk6IEJhc2VNdWx0aXNldCgpCisJeworCQlhcHBlbmQoYXJnMSwgYXJnMiwgYXJnMyk7CisJfQorCisJZXhwbGljaXQgTXVsdGlzZXQoY29uc3QgVCAmIGFyZzEsIGNvbnN0IFQgJiBhcmcyLAorCQkJY29uc3QgVCAmIGFyZzMsIGNvbnN0IFQgJiBhcmc0KQorCTogQmFzZU11bHRpc2V0KCkKKwl7CisJCWFwcGVuZChhcmcxLCBhcmcyLCBhcmczLCBhcmc0KTsKKwl9CisKKwlleHBsaWNpdCBNdWx0aXNldChjb25zdCBUICYgYXJnMSwgY29uc3QgVCAmIGFyZzIsCisJCQljb25zdCBUICYgYXJnMywgY29uc3QgVCAmIGFyZzQsIGNvbnN0IFQgJiBhcmc1KQorCTogQmFzZU11bHRpc2V0KCkKKwl7CisJCWFwcGVuZChhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KTsKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5NdWx0aXNldCgpCisJeworCQlCYXNlTXVsdGlzZXQ6OmNsZWFyKCk7CisJfQorCisKKwkvKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBHRVRURVIKKwkgKiBlbXB0aW5lc3MKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJaW5saW5lIHZpcnR1YWwgYm9vbCBlbXB0eSgpIGNvbnN0CisJeworCQlyZXR1cm4oIEJhc2VNdWx0aXNldDo6ZW1wdHkoKSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGJvb2wgbm9uZW1wdHkoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBub3QgQmFzZU11bHRpc2V0OjplbXB0eSgpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgYm9vbCBzaW5nbGV0b24oKSBjb25zdAorCXsKKwkJdHlwZW5hbWUKKwkJQmFzZU11bHRpc2V0Ojpjb25zdF9pdGVyYXRvciBpdCA9IEJhc2VNdWx0aXNldDo6YmVnaW4oKTsKKwkJdHlwZW5hbWUKKwkJQmFzZU11bHRpc2V0Ojpjb25zdF9pdGVyYXRvciBpdEVuZCA9IEJhc2VNdWx0aXNldDo6ZW5kKCk7CisJCXJldHVybiggKGl0ICE9IGl0RW5kKSAmJiAoKCsraXQpID09IGl0RW5kKSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGJvb2wgcG9wdWxhdGVkKCkgY29uc3QKKwl7CisJCXR5cGVuYW1lCisJCUJhc2VNdWx0aXNldDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBCYXNlTXVsdGlzZXQ6OmJlZ2luKCk7CisJCXR5cGVuYW1lCisJCUJhc2VNdWx0aXNldDo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBCYXNlTXVsdGlzZXQ6OmVuZCgpOworCQlyZXR1cm4oIChpdCAhPSBpdEVuZCkgJiYgKCgrK2l0KSAhPSBpdEVuZCkgKTsKKwl9CisKKworCS8vCWlubGluZSB2aXJ0dWFsIGF2bV9zaXplX3Qgc2l6ZSgpIGNvbnN0CisJLy8JeworCS8vCQlyZXR1cm4oIEJhc2VNdWx0aXNldDo6c2l6ZSgpICk7CisJLy8JfQorCisKKwkvKioKKwkgKiBjb250YWlucyBhIHBhcnRpY3VsYXIgZWxlbWVudAorCSAqLworCWlubGluZSB2aXJ0dWFsIGJvb2wgY29udGFpbnMoY29uc3QgVCAmIGFyZykgY29uc3QKKwl7CisJCXR5cGVuYW1lCisJCUJhc2VNdWx0aXNldDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBCYXNlTXVsdGlzZXQ6OmJlZ2luKCk7CisJCXR5cGVuYW1lCisJCUJhc2VNdWx0aXNldDo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBCYXNlTXVsdGlzZXQ6OmVuZCgpOworCQlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwkJeworCQkJaWYoICgqaXQpID09IGFyZyApCisJCQl7CisJCQkJcmV0dXJuKCB0cnVlICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisKKwkvKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBTRVRURVIKKwkgKiBhcHBlbmQKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJaW5saW5lIHZpcnR1YWwgdm9pZCBhcHBlbmQoY29uc3QgVCAmIGFyZykKKwl7CisJCUJhc2VNdWx0aXNldDo6cHVzaF9iYWNrKGFyZyk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCBhcHBlbmQoY29uc3QgVCAmIGFyZzEsIGNvbnN0IFQgJiBhcmcyKQorCXsKKwkJYXBwZW5kKGFyZzEpOworCQlhcHBlbmQoYXJnMik7CisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCBhcHBlbmQoY29uc3QgVCAmIGFyZzEsIGNvbnN0IFQgJiBhcmcyLCBjb25zdCBUICYgYXJnMykKKwl7CisJCWFwcGVuZChhcmcxKTsKKwkJYXBwZW5kKGFyZzIpOworCQlhcHBlbmQoYXJnMyk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCBhcHBlbmQoY29uc3QgVCAmIGFyZzEsIGNvbnN0IFQgJiBhcmcyLAorCQkJY29uc3QgVCAmIGFyZzMsIGNvbnN0IFQgJiBhcmc0KQorCXsKKwkJYXBwZW5kKGFyZzEpOworCQlhcHBlbmQoYXJnMik7CisJCWFwcGVuZChhcmczKTsKKwkJYXBwZW5kKGFyZzQpOworCX0KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgYXBwZW5kKGNvbnN0IFQgJiBhcmcxLCBjb25zdCBUICYgYXJnMiwKKwkJCWNvbnN0IFQgJiBhcmczLCBjb25zdCBUICYgYXJnNCwgY29uc3QgVCAmIGFyZzUpCisJeworCQlhcHBlbmQoYXJnMSk7CisJCWFwcGVuZChhcmcyKTsKKwkJYXBwZW5kKGFyZzMpOworCQlhcHBlbmQoYXJnNCk7CisJCWFwcGVuZChhcmc1KTsKKwl9CisKKworCXRlbXBsYXRlPCB0eXBlbmFtZSBfVE9FID4KKwlpbmxpbmUgdm9pZCBhcHBlbmQoY29uc3Qgc3RkOjptdWx0aXNldDwgX1RPRSA+ICYgYUNvbGxlY3Rpb24pCisJeworCQlCYXNlTXVsdGlzZXQ6Omluc2VydChCYXNlTXVsdGlzZXQ6OmVuZCgpLAorCQkJCWFDb2xsZWN0aW9uLmJlZ2luKCksIGFDb2xsZWN0aW9uLmVuZCgpKTsKKwl9CisKKwl0ZW1wbGF0ZTwgdHlwZW5hbWUgX1RPRSA+CisJaW5saW5lIHZvaWQgc3BsaWNlKGNvbnN0IHN0ZDo6bXVsdGlzZXQ8IF9UT0UgPiAmIGFDb2xsZWN0aW9uKQorCXsKKwkJQmFzZU11bHRpc2V0OjpzcGxpY2UoCisJCQkJQmFzZU11bHRpc2V0OjplbmQoKSwgYUNvbGxlY3Rpb24pOworCX0KKworCXRlbXBsYXRlPCB0eXBlbmFtZSBfVE9FID4KKwlpbmxpbmUgdm9pZCBhcHBlbmQoY29uc3Qgc3RkOjp2ZWN0b3I8IF9UT0UgPiAmIGFDb2xsZWN0aW9uKQorCXsKKwkJQmFzZU11bHRpc2V0OjppbnNlcnQoQmFzZU11bHRpc2V0OjplbmQoKSwKKwkJCQlhQ29sbGVjdGlvbi5iZWdpbigpLCBhQ29sbGVjdGlvbi5lbmQoKSk7CisJfQorCit9OworCisKKy8qKgorICogTUVNT1JZIE1BTkFHRU1FTlQKKyAqIERFU1RST1kKKyAqLworCit0ZW1wbGF0ZTwgY2xhc3MgVCA+Cit2b2lkIGRlc3Ryb3koTXVsdGlzZXQ8IFQgKiA+ICogJiBhTXVsdGlzZXQpCit7CisJd2hpbGUoIGFNdWx0aXNldC0+bm9uZW1wdHkoKSApCisJeworCQlzZXA6OmRlc3Ryb3koIGFNdWx0aXNldC0+cG9wX2xhc3QoKSApOworCX0KKworCWRlbGV0ZSggYU11bHRpc2V0ICk7CisKKwlhTXVsdGlzZXQgPSBOVUxMOworfQorCisKK3RlbXBsYXRlPCBjbGFzcyBUID4KK3ZvaWQgZGVzdHJveShNdWx0aXNldDwgVCA+ICogJiBhTXVsdGlzZXQpCit7CisJd2hpbGUoIGFNdWx0aXNldC0+bm9uZW1wdHkoKSApCisJeworCQlzZXA6OmRlc3Ryb3koIGFNdWx0aXNldC0+cG9wX2xhc3QoKSApOworCX0KKworCWRlbGV0ZSggYU11bHRpc2V0ICk7CisKKwlhTXVsdGlzZXQgPSBOVUxMOworfQorCisKK30KKworI2VuZGlmIC8qQ09OVEFJTkVSX01VTFRJU0VUX0hfKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbGxlY3Rpb24vUGFpci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29sbGVjdGlvbi9QYWlyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM3Yzk1YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbGxlY3Rpb24vUGFpci5oCkBAIC0wLDAgKzEsMjE1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIENPTlRBSU5FUl9QQUlSX0hfCisjZGVmaW5lIENPTlRBSU5FUl9QQUlSX0hfCisKKyNpbmNsdWRlIDxiYXNlL1NtYXJ0UG9pbnRlclV0aWwuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKwordGVtcGxhdGU8IHR5cGVuYW1lIFQgLCB0eXBlbmFtZSBVID4KK2NsYXNzIFBhaXIKK3sKKworcHVibGljOgorCS8qKgorCSAqIFRZUEVERUYKKwkgKi8KKwl0eXBlZGVmICAgICAgIFQgJiByZWZlcmVuY2VUOworCXR5cGVkZWYgY29uc3QgVCAmIGNvbnN0X3JlZmVyZW5jZVQ7CisKKwl0eXBlZGVmICAgICAgIFUgJiByZWZlcmVuY2VVOworCXR5cGVkZWYgY29uc3QgVSAmIGNvbnN0X3JlZmVyZW5jZVU7CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlQYWlyKCkKKwk6IHRoZUZpcnN0KCApLAorCXRoZVNlY29uZCggKQorCXsKKwl9CisKKwlleHBsaWNpdCBQYWlyKFQgb25lKQorCTogdGhlRmlyc3QoIG9uZSApLAorCXRoZVNlY29uZCggKQorCXsKKwl9CisKKy8vCWV4cGxpY2l0IFBhaXIoVSB0d28pCisvLwk6IHRoZUZpcnN0KCApLAorLy8JdGhlU2Vjb25kKCB0d28gKQorLy8JeworLy8JfQorCisJZXhwbGljaXQgUGFpcihUIG9uZSwgVSB0d28pCisJOiB0aGVGaXJzdCggb25lICksCisJdGhlU2Vjb25kKCB0d28gKQorCXsKKwl9CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIENvcHkKKwkgKi8KKwlQYWlyKGNvbnN0IFBhaXIgJiBhUGFpcikKKwk6IHRoZUZpcnN0KCBhUGFpci50aGVGaXJzdCApLAorCXRoZVNlY29uZCggYVBhaXIudGhlU2Vjb25kICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgflBhaXIoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiB0aGVGaXJzdAorCSAqLworCXJlZmVyZW5jZVQgZmlyc3QoKQorCXsKKwkJcmV0dXJuKCB0aGVGaXJzdCApOworCX0KKworCWNvbnN0X3JlZmVyZW5jZVQgZmlyc3QoKSBjb25zdAorCXsKKwkJcmV0dXJuKCB0aGVGaXJzdCApOworCX0KKworCXZvaWQgc2V0Rmlyc3QoVCBvbmUpCisJeworCQl0aGVGaXJzdCA9IG9uZTsKKwl9CisKKwl2b2lkIHNldEZpcnN0KGNvbnN0X3JlZmVyZW5jZVQgb25lKQorCXsKKwkJdGhlRmlyc3QgPSBvbmU7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiB0aGVTZWNvbmQKKwkgKi8KKwlyZWZlcmVuY2VVIHNlY29uZCgpCisJeworCQlyZXR1cm4oIHRoZVNlY29uZCApOworCX0KKworCWNvbnN0X3JlZmVyZW5jZVUgc2Vjb25kKCkgY29uc3QKKwl7CisJCXJldHVybiggdGhlU2Vjb25kICk7CisJfQorCisJdm9pZCBzZXRTZWNvbmQoVSB0d28pCisJeworCQl0aGVTZWNvbmQgPSB0d287CisJfQorCisJdm9pZCBzZXRTZWNvbmQoY29uc3RfcmVmZXJlbmNlVSB0d28pCisJeworCQl0aGVTZWNvbmQgPSB0d287CisJfQorCisKKwkvKioKKwkgKiBDT01QQVJJU09OCisJICogT1BFUkFUT1IKKwkgKi8KKwlpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFBhaXIgJiBvdGhlcikgY29uc3QKKwl7CisJCXJldHVybiggKHRoZUZpcnN0ID09IG90aGVyLnRoZUZpcnN0KSAmJiAodGhlU2Vjb25kID09IG90aGVyLnRoZVNlY29uZCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFBhaXIgJiBvdGhlcikgY29uc3QKKwl7CisJCXJldHVybiggKHRoZUZpcnN0ICE9IG90aGVyLnRoZUZpcnN0KSB8fCAodGhlU2Vjb25kICE9IG90aGVyLnRoZVNlY29uZCkgKTsKKwl9CisKK3Byb3RlY3RlZDoKKwkvKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlUIHRoZUZpcnN0OworCisJVSB0aGVTZWNvbmQ7CisKKworfTsKKworCisKKy8qKgorICogTUVNT1JZIE1BTkFHRU1FTlQKKyAqIERFU1RST1kKKyAqLworCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCAsIHR5cGVuYW1lIFUgPgordm9pZCBkZXN0cm95KFBhaXI8IFQgKiAgLCBVICogPiAqIGFQYWlyKQoreworCXNlcDo6ZGVzdHJveSggYVBhaXItPmZpcnN0KCkgKTsKKwlzZXA6OmRlc3Ryb3koIGFQYWlyLT5zZWNvbmQoKSApOworCisJZGVsZXRlKCBhUGFpciApOworCisJYVBhaXIgPSBOVUxMOworfQorCisKK3RlbXBsYXRlPCB0eXBlbmFtZSBUICwgdHlwZW5hbWUgVSA+Cit2b2lkIGRlc3Ryb3koUGFpcjwgVCAqICAsIFUgPiAqIGFQYWlyKQoreworCXNlcDo6ZGVzdHJveSggYVBhaXItPmZpcnN0KCkgKTsKKworCWRlbGV0ZSggYVBhaXIgKTsKKworCWFQYWlyID0gTlVMTDsKK30KKworCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCAsIHR5cGVuYW1lIFUgPgordm9pZCBkZXN0cm95KFBhaXI8IFQgLCBVICogPiAqIGFQYWlyKQoreworCXNlcDo6ZGVzdHJveSggYVBhaXItPnNlY29uZCgpICk7CisKKwlkZWxldGUoIGFQYWlyICk7CisKKwlhUGFpciA9IE5VTEw7Cit9CisKKwordGVtcGxhdGU8IHR5cGVuYW1lIFQgLCB0eXBlbmFtZSBVID4KK3ZvaWQgZGVzdHJveShQYWlyPCBUICwgVSA+ICogYVBhaXIpCit7CisJZGVsZXRlKCBhUGFpciApOworCisJYVBhaXIgPSBOVUxMOworfQorCisKKworCit9CisKKyNlbmRpZiAvKkNPTlRBSU5FUl9QQUlSX0hfKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbGxlY3Rpb24vUkVBRE1FLm1kIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29sbGVjdGlvbi9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFiODczYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbGxlY3Rpb24vUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTYgQEAKKyMgRUZNLVNZTUJFWCA6IENvbnRhaW5lcgorCisjIyBTb3VyY2UgY29kZSBzdHJ1Y3R1cmUKKworIyMjIEludGVyZmFjZXMKKyogKipDb250YWluZXIqKgorCisjIyMgQ2xhc3NlcworKiAqKkxpc3QqKgorKiAqKlZlY3RvcioqCisqICoqTXVsdGlzZXQqKgorKiAqKlNldCoqCisKKyMjIyBGYWN0b3JpZXMKKyogKipDb2xsZWN0aW9uKioKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29sbGVjdGlvbi9TZXQuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbGxlY3Rpb24vU2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYzNDUzYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbGxlY3Rpb24vU2V0LmgKQEAgLTAsMCArMSwxOTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgQ09OVEFJTkVSX1NFVF9IXworI2RlZmluZSBDT05UQUlORVJfU0VUX0hfCisKKyNpbmNsdWRlIDxzZXQ+CisKKyNpbmNsdWRlIDxiYXNlL1NtYXJ0UG9pbnRlclV0aWwuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKwordGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorY2xhc3MgU2V0ICA6ICBwdWJsaWMgc3RkOjpzZXQ8IFQgPgoreworCitwdWJsaWM6CisJLyoqCisJICogVFlQRURFRgorCSAqLworCXR5cGVkZWYgICAgICAgVCAmICAgICAgICAgcmVmZXJlbmNlOworCXR5cGVkZWYgY29uc3QgVCAmICAgICAgICAgY29uc3RfcmVmZXJlbmNlOworCisJdHlwZWRlZiBzdGQ6OnNldDwgVCA+ICAgICBCYXNlU2V0OworCXR5cGVkZWYgc3RkOjp2ZWN0b3I8IFQgPiAgQmFzZVZlY3RvcjsKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCVNldCgpCisJOiBCYXNlU2V0KCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJU2V0KGNvbnN0IFNldCAmIGFTZXQpCisJOiBCYXNlU2V0KCBhU2V0ICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgflNldCgpCisJeworCQlCYXNlU2V0OjpjbGVhcigpOworCX0KKworCisJLyoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogR0VUVEVSCisJICogZW1wdGluZXNzCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCWlubGluZSB2aXJ0dWFsIGJvb2wgZW1wdHkoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBCYXNlU2V0OjplbXB0eSgpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgYm9vbCBub25lbXB0eSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG5vdCBCYXNlU2V0OjplbXB0eSgpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgYm9vbCBzaW5nbGV0b24oKSBjb25zdAorCXsKKwkJLy9yZXR1cm4oIHNpemUoKSA9PSAxICk7CisKKwkJdHlwZW5hbWUgQmFzZVNldDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBCYXNlU2V0OjpiZWdpbigpOworCQl0eXBlbmFtZSBCYXNlU2V0Ojpjb25zdF9pdGVyYXRvciBpdEVuZCA9IEJhc2VTZXQ6OmVuZCgpOworCQlyZXR1cm4oIChpdCAhPSBpdEVuZCkgJiYgKCgrK2l0KSA9PSBpdEVuZCkgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBib29sIHBvcHVsYXRlZCgpIGNvbnN0CisJeworCQkvL3JldHVybiggc2l6ZSgpID4gMSApOworCisJCXR5cGVuYW1lIEJhc2VTZXQ6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gQmFzZVNldDo6YmVnaW4oKTsKKwkJdHlwZW5hbWUgQmFzZVNldDo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBCYXNlU2V0OjplbmQoKTsKKwkJcmV0dXJuKCAoaXQgIT0gaXRFbmQpICYmICgoKytpdCkgIT0gaXRFbmQpICk7CisJfQorCisKKwkvKioKKwkgKiBjb250YWlucyBhIHBhcnRpY3VsYXIgZWxlbWVudAorCSAqLworCWlubGluZSB2aXJ0dWFsIGJvb2wgY29udGFpbnMoY29uc3QgVCAmIGFyZykgY29uc3QKKwl7CisJCXR5cGVuYW1lIEJhc2VTZXQ6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gQmFzZVNldDo6YmVnaW4oKTsKKwkJdHlwZW5hbWUgQmFzZVNldDo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBCYXNlU2V0OjplbmQoKTsKKwkJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApCisJCXsKKwkJCWlmKCAoKml0KSA9PSBhcmcgKQorCQkJeworCQkJCXJldHVybiggdHJ1ZSApOworCQkJfQorCQl9CisKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCisJLyoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogU0VUVEVSCisJICogYXBwZW5kCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCisJdGVtcGxhdGU8IHR5cGVuYW1lIF9UT0UgPgorCWlubGluZSB2b2lkIGFwcGVuZChjb25zdCBzdGQ6OnNldDwgX1RPRSA+ICYgYUNvbGxlY3Rpb24pCisJeworCQlCYXNlU2V0OjppbnNlcnQoQmFzZVNldDo6ZW5kKCksCisJCQkJYUNvbGxlY3Rpb24uYmVnaW4oKSwgYUNvbGxlY3Rpb24uZW5kKCkpOworCX0KKworCXRlbXBsYXRlPCB0eXBlbmFtZSBfVE9FID4KKwlpbmxpbmUgdm9pZCBzcGxpY2UoY29uc3Qgc3RkOjpzZXQ8IF9UT0UgPiAmIGFDb2xsZWN0aW9uKQorCXsKKwkJQmFzZVNldDo6c3BsaWNlKEJhc2VTZXQ6OmVuZCgpLAorCQkJCWFDb2xsZWN0aW9uKTsKKwl9CisKKwl0ZW1wbGF0ZTwgdHlwZW5hbWUgX1RPRSA+CisJaW5saW5lIHZvaWQgYXBwZW5kKGNvbnN0IHN0ZDo6dmVjdG9yPCBfVE9FID4gJiBhQ29sbGVjdGlvbikKKwl7CisJCUJhc2VTZXQ6Omluc2VydChCYXNlU2V0OjplbmQoKSwKKwkJCQlhQ29sbGVjdGlvbi5iZWdpbigpLCBhQ29sbGVjdGlvbi5lbmQoKSk7CisJfQorCit9OworCisKKy8qKgorICogTUVNT1JZIE1BTkFHRU1FTlQKKyAqIERFU1RST1kKKyAqLworCit0ZW1wbGF0ZTwgY2xhc3MgVCA+Cit2b2lkIGRlc3Ryb3koU2V0PCBUICogPiAqICYgYVNldCkKK3sKKwl3aGlsZSggYVNldC0+bm9uZW1wdHkoKSApCisJeworCQlzZXA6OmRlc3Ryb3koIGFTZXQtPnBvcF9sYXN0KCkgKTsKKwl9CisKKwlkZWxldGUoIGFTZXQgKTsKKworCWFTZXQgPSBOVUxMOworfQorCisKK3RlbXBsYXRlPCBjbGFzcyBUID4KK3ZvaWQgZGVzdHJveShTZXQ8IFQgPiAqICYgYVNldCkKK3sKKwl3aGlsZSggYVNldC0+bm9uZW1wdHkoKSApCisJeworCQlzZXA6OmRlc3Ryb3koIGFTZXQtPnBvcF9sYXN0KCkgKTsKKwl9CisKKwlkZWxldGUoIGFTZXQgKTsKKworCWFTZXQgPSBOVUxMOworfQorCisKK30KKworI2VuZGlmIC8qQ09OVEFJTkVSX1NFVF9IXyovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb2xsZWN0aW9uL1R5cGVkZWYuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbGxlY3Rpb24vVHlwZWRlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiOWFlMDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb2xsZWN0aW9uL1R5cGVkZWYuaApAQCAtMCwwICsxLDE4MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBDT05UQUlORVJfVFlQRURFRl9IXworI2RlZmluZSBDT05UQUlORVJfVFlQRURFRl9IXworCisKKyNpbmNsdWRlIDxjb2xsZWN0aW9uL0FycmF5Lmg+CisKKyNpbmNsdWRlIDxjb2xsZWN0aW9uL0NvbGxlY3Rpb24uaD4KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vTGlzdC5oPgorCisjaW5jbHVkZSA8Y29sbGVjdGlvbi9NdWx0aXNldC5oPgorCisjaW5jbHVkZSA8Y29sbGVjdGlvbi9QYWlyLmg+CisKKyNpbmNsdWRlIDxjb2xsZWN0aW9uL1NldC5oPgorCisjaW5jbHVkZSA8Y29sbGVjdGlvbi9WZWN0b3IuaD4KKworCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTUFDUk8gRk9SIFRZUEVERUYgREVGSU5JVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCisvLyBMSVNUCisjZGVmaW5lIERFRklORV9MSVNUX1JFRl9UKENsYXNzTmFtZSwgVHlwZWRlZk5hbWUpIFwKKwl0eXBlZGVmIExpc3QgPCBDbGFzc05hbWUgPiBMaXN0T2YjI1R5cGVkZWZOYW1lOworCisjZGVmaW5lIERFRklORV9MSVNUX1JFRihDbGFzc05hbWUpICAgICAgICAgICAgICBcCisJdHlwZWRlZiBMaXN0IDwgQ2xhc3NOYW1lID4gTGlzdE9mIyNDbGFzc05hbWU7CisKKyNkZWZpbmUgREVGSU5FX0xJU1RfUFRSX1QoQ2xhc3NOYW1lLCBUeXBlZGVmTmFtZSkgICBcCisJdHlwZWRlZiBMaXN0IDwgQ2xhc3NOYW1lICogPiBMaXN0T2YjI1R5cGVkZWZOYW1lOworCisjZGVmaW5lIERFRklORV9MSVNUX1BUUihDbGFzc05hbWUpICAgICAgICAgICAgICAgIFwKKwl0eXBlZGVmIExpc3QgPCBDbGFzc05hbWUgKiA+IExpc3RPZiMjQ2xhc3NOYW1lOworCisKKy8vIFZFQ1RPUgorI2RlZmluZSBERUZJTkVfVkVDVE9SX1JFRl9UKENsYXNzTmFtZSwgVHlwZWRlZk5hbWUpICAgXAorCXR5cGVkZWYgVmVjdG9yIDwgQ2xhc3NOYW1lID4gVmVjdG9yT2YjI1R5cGVkZWZOYW1lOworCisjZGVmaW5lIERFRklORV9WRUNUT1JfUkVGKENsYXNzTmFtZSkgICAgICAgICAgICAgICAgXAorCXR5cGVkZWYgVmVjdG9yIDwgQ2xhc3NOYW1lID4gVmVjdG9yT2YjI0NsYXNzTmFtZTsKKworI2RlZmluZSBERUZJTkVfVkVDVE9SX1BUUl9UKENsYXNzTmFtZSwgVHlwZWRlZk5hbWUpICAgICBcCisJdHlwZWRlZiBWZWN0b3IgPCBDbGFzc05hbWUgKiA+IFZlY3Rvck9mIyNUeXBlZGVmTmFtZTsKKworI2RlZmluZSBERUZJTkVfVkVDVE9SX1BUUihDbGFzc05hbWUpICAgICAgICAgICAgICAgICAgXAorCXR5cGVkZWYgVmVjdG9yIDwgQ2xhc3NOYW1lICogPiBWZWN0b3JPZiMjQ2xhc3NOYW1lOworCisjZGVmaW5lIERFRklORV9BUFZFQ1RPUl9QVFIoQ2xhc3NOYW1lKSAgICAgICAgICAgICAgICAgICAgXAorCXR5cGVkZWYgQVBWZWN0b3IgPCBDbGFzc05hbWUgKiA+IEFQVmVjdG9yT2YjI0NsYXNzTmFtZTsKKworCisKKy8vIFBBSVIKKyNkZWZpbmUgREVGSU5FX1BBSVJfUkVGKENsYXNzTmFtZUEsIENsYXNzTmFtZUIsIFR5cGVkZWZOYW1lKSBcCisJdHlwZWRlZiBQYWlyIDwgQ2xhc3NOYW1lQSAsIENsYXNzTmFtZUIgPiBUeXBlZGVmTmFtZTsKKworI2RlZmluZSBERUZJTkVfUEFJUl9QVFIoQ2xhc3NOYW1lQSwgQ2xhc3NOYW1lQiwgVHlwZWRlZk5hbWUpIFwKKwl0eXBlZGVmIFBhaXIgPCBDbGFzc05hbWVBICAqICwgQ2xhc3NOYW1lQiAqID4gVHlwZWRlZk5hbWU7CisKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDTEFTUworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCitjbGFzcyBCRkNvZGU7CitjbGFzcyBSdW50aW1lSUQ7CisKK2NsYXNzIEF2bVByb2dyYW07CitjbGFzcyBBdm1UcmFuc2l0aW9uOworCitjbGFzcyBFeGVjdXRhYmxlRm9ybTsKKworY2xhc3MgRm9ybTsKKworY2xhc3MgSW5zdGFuY2VPZkJ1ZmZlcjsKK2NsYXNzIEluc3RhbmNlT2ZEYXRhOworY2xhc3MgSW5zdGFuY2VPZk1hY2hpbmU7CitjbGFzcyBJbnN0YW5jZU9mUG9ydDsKKworY2xhc3MgTWFjaGluZTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVFlQRURFRiBGT1IgQ09MTEVDVElPTiA8IEJGQ29kZSA+CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit0eXBlZGVmIENvbGxlY3Rpb24gPCBCRkNvZGUgPiBCRkNvZGVDb2xsZWN0aW9uOwordHlwZWRlZiAgICAgICBMaXN0IDwgQkZDb2RlID4gQkZDb2RlTGlzdDsKK3R5cGVkZWYgICAgIFZlY3RvciA8IEJGQ29kZSA+IEJGQ29kZVZlY3RvcjsKKworCisvKioKKyAqIFRZUEUgTElTVCBERUNMQVJBVElPTlMKKyAqLworCitERUZJTkVfTElTVF9SRUZfVChpbnQgLCBJbnQpCisKK0RFRklORV9MSVNUX1JFRl9UKCBzdGQ6OnN0cmluZyAsIFN0cmluZyApCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIExpc3QKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0RFRklORV9MSVNUX1BUUiggTWFjaGluZSApCisKK0RFRklORV9MSVNUX1BUUiggQXZtUHJvZ3JhbSApCisKK0RFRklORV9MSVNUX1BUUiggQXZtVHJhbnNpdGlvbiApCisKK0RFRklORV9MSVNUX1BUUiggRXhlY3V0YWJsZUZvcm0gKQorCitERUZJTkVfTElTVF9QVFIoIEluc3RhbmNlT2ZCdWZmZXIgKQorREVGSU5FX0xJU1RfUFRSKCBJbnN0YW5jZU9mRGF0YSApCitERUZJTkVfTElTVF9QVFIoIEluc3RhbmNlT2ZNYWNoaW5lICkKK0RFRklORV9MSVNUX1BUUiggSW5zdGFuY2VPZlBvcnQgKQorCisKKy8qKgorICogVFlQRSBWRUNUT1IgREVDTEFSQVRJT05TCisgKi8KK0RFRklORV9WRUNUT1JfUkVGX1QoaW50ICwgSW50KQorCitERUZJTkVfVkVDVE9SX1JFRl9UKCBzdGQ6OnN0cmluZyAsIFN0cmluZyApCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFZlY3RvcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworREVGSU5FX1ZFQ1RPUl9QVFIoIEF2bVByb2dyYW0gKQorCitERUZJTkVfVkVDVE9SX1BUUiggQXZtVHJhbnNpdGlvbiApCisKK0RFRklORV9WRUNUT1JfUFRSKCBFeGVjdXRhYmxlRm9ybSApCisKK0RFRklORV9WRUNUT1JfUFRSKCBJbnN0YW5jZU9mRGF0YSApCisKK0RFRklORV9WRUNUT1JfUFRSKCBJbnN0YW5jZU9mTWFjaGluZSApCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNldCAmIE11bHRpc2V0CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKKyAqIFRZUEUgTUlYRUQgREVDTEFSQVRJT05TCisgKi8KKworREVGSU5FX1BBSVJfUkVGKCBSdW50aW1lSUQgLCBMaXN0T2ZJbnN0YW5jZU9mRGF0YSAsIFBhaXJNYWNoaW5lRGF0YSApCisKK0RFRklORV9MSVNUX1JFRiggUGFpck1hY2hpbmVEYXRhICkKKworCit9CisKKyNlbmRpZiAvKkNPTlRBSU5FUl9UWVBFREVGX0hfKi8KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29sbGVjdGlvbi9WZWN0b3IuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbGxlY3Rpb24vVmVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgyODBmNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbGxlY3Rpb24vVmVjdG9yLmgKQEAgLTAsMCArMSwxMDA4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIENPTlRBSU5FUl9WRUNUT1JfSF8KKyNkZWZpbmUgQ09OVEFJTkVSX1ZFQ1RPUl9IXworCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8dXRpbC9hdm1fYXNzZXJ0Lmg+CisjaW5jbHVkZSA8dXRpbC9hdm1fbnVtZXJpYy5oPgorI2luY2x1ZGUgPGJhc2UvU21hcnRQb2ludGVyVXRpbC5oPgorCisjaW5jbHVkZSA8Y29sbGVjdGlvbi9Db2xsZWN0aW9uLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBWZWN0b3IgOgorCQlwdWJsaWMgc3RkOjp2ZWN0b3I8IFQgPiwKKwkJcHVibGljIENvbGxlY3Rpb248IFQgPgoreworCitwdWJsaWM6CisJLyoqCisJICogVFlQRURFRgorCSAqLworCXR5cGVkZWYgVCAgICAgICAmICAgICAgICAgcmVmZXJlbmNlOworCXR5cGVkZWYgY29uc3QgVCAmICAgICAgICAgY29uc3RfcmVmZXJlbmNlOworCisJdHlwZWRlZiBzdGQ6Omxpc3Q8IFQgPiAgICBCYXNlTGlzdDsKKwl0eXBlZGVmIHN0ZDo6dmVjdG9yPCBUID4gIEJhc2VWZWN0b3I7CisKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCVZlY3RvcigpCisJOiBCYXNlVmVjdG9yKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJVmVjdG9yKGNvbnN0IFZlY3RvciAmIGFWZWMpCisJOiBCYXNlVmVjdG9yKCBhVmVjICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBPdGhlcnMKKwkgKi8KKwlleHBsaWNpdCBWZWN0b3IoYXZtX3NpemVfdCBjb3VudCkKKwk6IEJhc2VWZWN0b3IoY291bnQpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlleHBsaWNpdCBWZWN0b3IoYXZtX3NpemVfdCBjb3VudCwgY29uc3QgVCAmIGVsZW0pCisJOiBCYXNlVmVjdG9yKGNvdW50LCBlbGVtKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJZXhwbGljaXQgVmVjdG9yKGNvbnN0IFQgJiBhcmcpCisJOiBCYXNlVmVjdG9yKCkKKwl7CisJCWFwcGVuZChhcmcpOworCX0KKworCWV4cGxpY2l0IFZlY3Rvcihjb25zdCBUICYgYXJnMSwgY29uc3QgVCAmIGFyZzIpCisJOiBCYXNlVmVjdG9yKCkKKwl7CisJCWFwcGVuZChhcmcxLCBhcmcyKTsKKwl9CisKKwlleHBsaWNpdCBWZWN0b3IoY29uc3QgVCAmIGFyZzEsIGNvbnN0IFQgJiBhcmcyLCBjb25zdCBUICYgYXJnMykKKwk6IEJhc2VWZWN0b3IoKQorCXsKKwkJYXBwZW5kKGFyZzEsIGFyZzIsIGFyZzMpOworCX0KKworCWV4cGxpY2l0IFZlY3Rvcihjb25zdCBUICYgYXJnMSwgY29uc3QgVCAmIGFyZzIsCisJCQljb25zdCBUICYgYXJnMywgY29uc3QgVCAmIGFyZzQpCisJOiBCYXNlVmVjdG9yKCkKKwl7CisJCWFwcGVuZChhcmcxLCBhcmcyLCBhcmczLCBhcmc0KTsKKwl9CisKKwlleHBsaWNpdCBWZWN0b3IoY29uc3QgVCAmIGFyZzEsIGNvbnN0IFQgJiBhcmcyLAorCQkJY29uc3QgVCAmIGFyZzMsIGNvbnN0IFQgJiBhcmc0LCBjb25zdCBUICYgYXJnNSkKKwk6IEJhc2VWZWN0b3IoKQorCXsKKwkJYXBwZW5kKGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgflZlY3RvcigpCisJeworCQlCYXNlVmVjdG9yOjpjbGVhcigpOworCX0KKworCisJLyoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogU0VUVEVSCisJICogcHVzaCBiYWNrICYgZnJvbnQKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJaW5saW5lIHZpcnR1YWwgdm9pZCBwdXNoX2JhY2soY29uc3QgVCAmIGFyZykKKwl7CisJCUJhc2VWZWN0b3I6OnB1c2hfYmFjayhhcmcpOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgdm9pZCBwdXNoX2JhY2soY29uc3Qgc3RkOjpsaXN0PCBUID4gJiBhQ29sbGVjdGlvbikKKwl7CisJCUJhc2VWZWN0b3I6Omluc2VydChCYXNlVmVjdG9yOjplbmQoKSwKKwkJCQlhQ29sbGVjdGlvbi5iZWdpbigpLCBhQ29sbGVjdGlvbi5lbmQoKSk7CisJfQorCisJdGVtcGxhdGU8IHR5cGVuYW1lIF9UT0UgPgorCWlubGluZSB2b2lkIHB1c2hfYmFjayhjb25zdCBzdGQ6Omxpc3Q8IF9UT0UgPiAmIGFDb2xsZWN0aW9uKQorCXsKKwkJQmFzZVZlY3Rvcjo6aW5zZXJ0KEJhc2VWZWN0b3I6OmVuZCgpLAorCQkJCWFDb2xsZWN0aW9uLmJlZ2luKCksIGFDb2xsZWN0aW9uLmVuZCgpKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIHZvaWQgcHVzaF9iYWNrKGNvbnN0IHN0ZDo6dmVjdG9yPCBUID4gJiBhQ29sbGVjdGlvbikKKwl7CisJCUJhc2VWZWN0b3I6Omluc2VydChCYXNlVmVjdG9yOjplbmQoKSwKKwkJCQlhQ29sbGVjdGlvbi5iZWdpbigpLCBhQ29sbGVjdGlvbi5lbmQoKSk7CisJfQorCisJdGVtcGxhdGU8IHR5cGVuYW1lIF9UT0UgPgorCWlubGluZSB2b2lkIHB1c2hfYmFjayhjb25zdCBzdGQ6OnZlY3RvcjwgX1RPRSA+ICYgYUNvbGxlY3Rpb24pCisJeworCQlCYXNlVmVjdG9yOjppbnNlcnQoQmFzZVZlY3Rvcjo6ZW5kKCksCisJCQkJYUNvbGxlY3Rpb24uYmVnaW4oKSwgYUNvbGxlY3Rpb24uZW5kKCkpOworCX0KKworCisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHB1c2hfZnJvbnQoY29uc3QgVCAmIGFyZykKKwl7CisJCUJhc2VWZWN0b3I6Omluc2VydChCYXNlVmVjdG9yOjpiZWdpbigpLCBhcmcpOworCX0KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgcHVzaF9mcm9udChjb25zdCBzdGQ6Omxpc3Q8IFQgPiAmIGFDb2xsZWN0aW9uKQorCXsKKwkJQmFzZVZlY3Rvcjo6aW5zZXJ0KEJhc2VWZWN0b3I6OmJlZ2luKCksCisJCQkJYUNvbGxlY3Rpb24uYmVnaW4oKSwgYUNvbGxlY3Rpb24uZW5kKCkpOworCX0KKworCXRlbXBsYXRlPCB0eXBlbmFtZSBfVE9FID4KKwlpbmxpbmUgdm9pZCBwdXNoX2Zyb250KGNvbnN0IHN0ZDo6bGlzdDwgX1RPRSA+ICYgYUNvbGxlY3Rpb24pCisJeworCQlCYXNlVmVjdG9yOjppbnNlcnQoQmFzZVZlY3Rvcjo6YmVnaW4oKSwKKwkJCQlhQ29sbGVjdGlvbi5iZWdpbigpLCBhQ29sbGVjdGlvbi5lbmQoKSk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHB1c2hfZnJvbnQoY29uc3Qgc3RkOjp2ZWN0b3I8IFQgPiAmIGFDb2xsZWN0aW9uKQorCXsKKwkJQmFzZVZlY3Rvcjo6aW5zZXJ0KEJhc2VWZWN0b3I6OmJlZ2luKCksCisJCQkJYUNvbGxlY3Rpb24uYmVnaW4oKSwgYUNvbGxlY3Rpb24uZW5kKCkpOworCX0KKworCXRlbXBsYXRlPCB0eXBlbmFtZSBfVE9FID4KKwlpbmxpbmUgdm9pZCBwdXNoX2Zyb250KGNvbnN0IHN0ZDo6dmVjdG9yPCBfVE9FID4gJiBhQ29sbGVjdGlvbikKKwl7CisJCUJhc2VWZWN0b3I6Omluc2VydChCYXNlVmVjdG9yOjpiZWdpbigpLAorCQkJCWFDb2xsZWN0aW9uLmJlZ2luKCksIGFDb2xsZWN0aW9uLmVuZCgpKTsKKwl9CisKKworCS8qCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIEdFVFRFUgorCSAqIGVtcHRpbmVzcworCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCBib29sIGVtcHR5KCkgY29uc3QKKwl7CisJCXJldHVybiggQmFzZVZlY3Rvcjo6ZW1wdHkoKSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGJvb2wgbm9uZW1wdHkoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBub3QgQmFzZVZlY3Rvcjo6ZW1wdHkoKSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGJvb2wgc2luZ2xldG9uKCkgY29uc3QKKwl7CisJCXJldHVybiggQmFzZVZlY3Rvcjo6c2l6ZSgpID09IDEgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBib29sIHBvcHVsYXRlZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIEJhc2VWZWN0b3I6OnNpemUoKSA+IDEgKTsKKwl9CisKKworCS8qKgorCSAqIGNvbnRhaW5zIGEgcGFydGljdWxhciBlbGVtZW50CisJICovCisJaW5saW5lIHZpcnR1YWwgYm9vbCBjb250YWlucyhjb25zdCBUICYgYXJnKSBjb25zdAorCXsKKwkJdHlwZW5hbWUKKwkJQmFzZVZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBCYXNlVmVjdG9yOjpiZWdpbigpOworCQl0eXBlbmFtZQorCQlCYXNlVmVjdG9yOjpjb25zdF9pdGVyYXRvciBpdEVuZCA9IEJhc2VWZWN0b3I6OmVuZCgpOworCQlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwkJeworCQkJaWYoICgqaXQpID09IGFyZyApCisJCQl7CisJCQkJcmV0dXJuKCB0cnVlICk7CisJCQl9CisJCX0KKworCQkvLwkJZm9yKCBhdm1fc2l6ZV90IGl0ID0gMCA7IGl0ICE9IEJhc2VWZWN0b3I6OnNpemUoKSA7ICsraXQgKQorCQkvLwkJeworCQkvLwkJCWlmKCBCYXNlVmVjdG9yOjphdChpdCkgPT0gYXJnICkKKwkJLy8JCQl7CisJCS8vCQkJCXJldHVybiggdHJ1ZSApOworCQkvLwkJCX0KKwkJLy8JCX0KKworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBib29sIGNvbnRhaW5zKGNvbnN0IHN0ZDo6dmVjdG9yPCBUID4gJiBhQ29sbGVjdGlvbikKKwl7CisJCXR5cGVuYW1lCisJCXN0ZDo6dmVjdG9yPCBUID46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYUNvbGxlY3Rpb24uYmVnaW4oKTsKKwkJdHlwZW5hbWUKKwkJc3RkOjp2ZWN0b3I8IFQgPjo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBhQ29sbGVjdGlvbi5lbmQoKTsKKwkJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApCisJCXsKKwkJCWlmKCBub3QgY29udGFpbnMoICgqaXQpICkgKQorCQkJeworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJfQorCisJCWlmKGVtcHR5KCkgJiYgIWFDb2xsZWN0aW9uLmVtcHR5KCkpCisJCXsKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisJfQorCisKKwl0ZW1wbGF0ZTwgdHlwZW5hbWUgVSA+CisJaW5saW5lIGludCBmaW5kKFUgYXJnKSBjb25zdAorCXsKKwkJZm9yKCBhdm1fc2l6ZV90IGl0ID0gMCA7IGl0ICE9IEJhc2VWZWN0b3I6OnNpemUoKSA7ICsraXQgKQorCQl7CisJCQlpZiggQmFzZVZlY3Rvcjo6YXQoaXQpID09IGFyZyApCisJCQl7CisJCQkJcmV0dXJuKCBpdCApOworCQkJfQorCQl9CisKKworCQlyZXR1cm4oIC0xICk7CisJfQorCisKKwkvKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBTRVRURVIKKwkgKiBhcHBlbmQKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJaW5saW5lIHZpcnR1YWwgdm9pZCBhcHBlbmQoY29uc3QgVCAmIGFyZykKKwl7CisJCUJhc2VWZWN0b3I6OnB1c2hfYmFjayhhcmcpOworCX0KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgYXBwZW5kKGNvbnN0IFQgJiBhcmcxLCBjb25zdCBUICYgYXJnMikKKwl7CisJCWFwcGVuZChhcmcxKTsKKwkJYXBwZW5kKGFyZzIpOworCX0KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgYXBwZW5kKGNvbnN0IFQgJiBhcmcxLCBjb25zdCBUICYgYXJnMiwgY29uc3QgVCAmIGFyZzMpCisJeworCQlhcHBlbmQoYXJnMSk7CisJCWFwcGVuZChhcmcyKTsKKwkJYXBwZW5kKGFyZzMpOworCX0KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgYXBwZW5kKGNvbnN0IFQgJiBhcmcxLAorCQkJY29uc3QgVCAmIGFyZzIsIGNvbnN0IFQgJiBhcmczLCBjb25zdCBUICYgYXJnNCkKKwl7CisJCWFwcGVuZChhcmcxKTsKKwkJYXBwZW5kKGFyZzIpOworCQlhcHBlbmQoYXJnMyk7CisJCWFwcGVuZChhcmc0KTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIGFwcGVuZChjb25zdCBUICYgYXJnMSwgY29uc3QgVCAmIGFyZzIsCisJCQljb25zdCBUICYgYXJnMywgY29uc3QgVCAmIGFyZzQsIGNvbnN0IFQgJiBhcmc1KQorCXsKKwkJYXBwZW5kKGFyZzEpOworCQlhcHBlbmQoYXJnMik7CisJCWFwcGVuZChhcmczKTsKKwkJYXBwZW5kKGFyZzQpOworCQlhcHBlbmQoYXJnNSk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIGFwcGVuZChUICogYW5BcnJheU9mQXJndW1lbnQsIGludCBhbkFyZ1NpemUpCisJeworCQlmb3IgKGludCBpID0gMCA7IGkgPCBhbkFyZ1NpemUgOyArK2kpCisJCXsKKwkJCXB1c2hfYmFjayhhbkFycmF5T2ZBcmd1bWVudFtpXSk7CisJCX0KKwl9CisKKwl0ZW1wbGF0ZTwgdHlwZW5hbWUgX1RPRSA+CisJaW5saW5lIHZvaWQgYXBwZW5kKGNvbnN0IHN0ZDo6bGlzdDwgX1RPRSA+ICYgYUNvbGxlY3Rpb24pCisJeworCQlCYXNlVmVjdG9yOjppbnNlcnQoQmFzZVZlY3Rvcjo6ZW5kKCksCisJCQkJYUNvbGxlY3Rpb24uYmVnaW4oKSwgYUNvbGxlY3Rpb24uZW5kKCkpOworCX0KKworCXRlbXBsYXRlPCB0eXBlbmFtZSBfVE9FID4KKwlpbmxpbmUgdm9pZCBhcHBlbmQoY29uc3Qgc3RkOjp2ZWN0b3I8IF9UT0UgPiAmIGFDb2xsZWN0aW9uKQorCXsKKwkJQmFzZVZlY3Rvcjo6aW5zZXJ0KEJhc2VWZWN0b3I6OmVuZCgpLAorCQkJCWFDb2xsZWN0aW9uLmJlZ2luKCksIGFDb2xsZWN0aW9uLmVuZCgpKTsKKwl9CisKKwl0ZW1wbGF0ZTwgdHlwZW5hbWUgX1RPRSA+CisJaW5saW5lIHZvaWQgYXBwZW5kVGFpbChjb25zdCBzdGQ6OnZlY3RvcjwgX1RPRSA+ICYgYUNvbGxlY3Rpb24pCisJeworCQlCYXNlVmVjdG9yOjppbnNlcnQoQmFzZVZlY3Rvcjo6ZW5kKCksCisJCQkJYUNvbGxlY3Rpb24uYmVnaW4oKSArIDEsIGFDb2xsZWN0aW9uLmVuZCgpKTsKKwl9CisKKwl0ZW1wbGF0ZTwgdHlwZW5hbWUgX1RPRSA+CisJaW5saW5lIHZvaWQgc3BsaWNlKHN0ZDo6dmVjdG9yPCBfVE9FID4gJiBhQ29sbGVjdGlvbikKKwl7CisJCUJhc2VWZWN0b3I6Omluc2VydChCYXNlVmVjdG9yOjplbmQoKSwKKwkJCQlhQ29sbGVjdGlvbi5iZWdpbigpLCBhQ29sbGVjdGlvbi5lbmQoKSk7CisJCWFDb2xsZWN0aW9uLmNsZWFyKCk7CisJfQorCisKKwkvKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBTRVRURVIKKwkgKiBhZGRfdW5pb24KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJaW5saW5lIHZpcnR1YWwgdm9pZCBhZGRfdW5pb24oY29uc3QgVCAmIGFyZykKKwl7CisJCWlmKCBub3QgY29udGFpbnMoYXJnKSApCisJCXsKKwkJCUJhc2VWZWN0b3I6OnB1c2hfYmFjayhhcmcpOworCQl9CisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCBhZGRfdW5pb24oY29uc3QgVCAmIGFyZzEsIGNvbnN0IFQgJiBhcmcyKQorCXsKKwkJYWRkX3VuaW9uKGFyZzEpOworCQlhZGRfdW5pb24oYXJnMik7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIGFkZF91bmlvbihUICogYW5BcnJheU9mQXJndW1lbnQsIGludCBhbkFyZ1NpemUpCisJeworCQlmb3IgKGludCBpID0gMCA7IGkgPCBhbkFyZ1NpemUgOyArK2kpCisJCXsKKwkJCWFkZF91bmlvbiggYW5BcnJheU9mQXJndW1lbnRbaV0gKTsKKwkJfQorCX0KKworCisJaW5saW5lIHZpcnR1YWwgdm9pZCBhZGRfdW5pb24oY29uc3Qgc3RkOjpsaXN0PCBUID4gJiBhQ29sbGVjdGlvbikKKwl7CisJCXR5cGVuYW1lIHN0ZDo6bGlzdDwgVCA+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGFDb2xsZWN0aW9uLmJlZ2luKCk7CisJCWZvciggOyBpdCAhPSBhQ29sbGVjdGlvbi5lbmQoKSA7ICsraXQgKQorCQl7CisJCQlhZGRfdW5pb24oICgqaXQpICk7CisJCX0KKwl9CisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIGFkZF91bmlvbihjb25zdCBzdGQ6OnZlY3RvcjwgVCA+ICYgYUNvbGxlY3Rpb24pCisJeworCQl0eXBlbmFtZSBzdGQ6OnZlY3RvcjwgVCA+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGFDb2xsZWN0aW9uLmJlZ2luKCk7CisJCWZvciggOyBpdCAhPSBhQ29sbGVjdGlvbi5lbmQoKSA7ICsraXQgKQorCQl7CisJCQlhZGRfdW5pb24oICgqaXQpICk7CisJCX0KKwl9CisKKworCS8qCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIEdFVFRFUgorCSAqIGZpcnN0ICYgLi4uICYgbGFzdAorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCByZWZlcmVuY2UgZmlyc3QoKQorCXsKKwkJcmV0dXJuKCBCYXNlVmVjdG9yOjpmcm9udCgpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgY29uc3RfcmVmZXJlbmNlIGZpcnN0KCkgY29uc3QKKwl7CisJCXJldHVybiggQmFzZVZlY3Rvcjo6ZnJvbnQoKSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIHJlZmVyZW5jZSBnZXRBcmcxKCkKKwl7CisJCXJldHVybiAgZ2V0KDApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGNvbnN0X3JlZmVyZW5jZSBnZXRBcmcxKCkgY29uc3QKKwl7CisJCXJldHVybiAgZ2V0KDApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgdm9pZCBwb3BfZnJvbnQoKQorCXsKKwkJQmFzZVZlY3Rvcjo6ZXJhc2UoQmFzZVZlY3Rvcjo6YmVnaW4oKSk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBUIHBvcF9maXJzdCgpCisJeworCQlUIHRoZUZpcnN0ID0gQmFzZVZlY3Rvcjo6ZnJvbnQoKTsKKworCQlCYXNlVmVjdG9yOjplcmFzZSggQmFzZVZlY3Rvcjo6YmVnaW4oKSApOworCisJCXJldHVybiggdGhlRmlyc3QgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHBvcF9maXJzdF90byhUICYgdGhlRmlyc3QpCisJeworCQl0aGVGaXJzdCA9IEJhc2VWZWN0b3I6OmZyb250KCk7CisKKwkJQmFzZVZlY3Rvcjo6ZXJhc2UoIEJhc2VWZWN0b3I6OmJlZ2luKCkgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHJlbW92ZV9maXJzdCgpCisJeworCQlCYXNlVmVjdG9yOjplcmFzZSggQmFzZVZlY3Rvcjo6YmVnaW4oKSApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgcmVmZXJlbmNlIHNlY29uZCgpCisJeworCQlyZXR1cm4oIGdldCgxKSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGNvbnN0X3JlZmVyZW5jZSBzZWNvbmQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXQoMSkgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCByZWZlcmVuY2UgZ2V0QXJnMigpCisJeworCQlyZXR1cm4gIGdldCgxKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBjb25zdF9yZWZlcmVuY2UgZ2V0QXJnMigpIGNvbnN0CisJeworCQlyZXR1cm4gIGdldCgxKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIHJlZmVyZW5jZSB0aGlyZCgpCisJeworCQlyZXR1cm4oIGdldCgyKSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGNvbnN0X3JlZmVyZW5jZSB0aGlyZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldCgyKSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIHJlZmVyZW5jZSBnZXRBcmczKCkKKwl7CisJCXJldHVybiAgZ2V0KDIpOworCX0KKworCWlubGluZSB2aXJ0dWFsIGNvbnN0X3JlZmVyZW5jZSBnZXRBcmczKCkgY29uc3QKKwl7CisJCXJldHVybiAgZ2V0KDIpOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgcmVmZXJlbmNlIGZvdXJ0aCgpCisJeworCQlyZXR1cm4oIGdldCgzKSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGNvbnN0X3JlZmVyZW5jZSBmb3VydGgoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXQoMykgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCByZWZlcmVuY2UgZ2V0QXJnNCgpCisJeworCQlyZXR1cm4gIGdldCgzKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBjb25zdF9yZWZlcmVuY2UgZ2V0QXJnNCgpIGNvbnN0CisJeworCQlyZXR1cm4gIGdldCgzKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIHJlZmVyZW5jZSBmaWZ0aCgpCisJeworCQlyZXR1cm4oIGdldCg0KSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGNvbnN0X3JlZmVyZW5jZSBmaWZ0aCgpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldCg0KSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIHJlZmVyZW5jZSBnZXRBcmc1KCkKKwl7CisJCXJldHVybiAgZ2V0KDQpOworCX0KKworCWlubGluZSB2aXJ0dWFsIGNvbnN0X3JlZmVyZW5jZSBnZXRBcmc1KCkgY29uc3QKKwl7CisJCXJldHVybiAgZ2V0KDQpOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgcmVmZXJlbmNlIHNpeHRoKCkKKwl7CisJCXJldHVybiggZ2V0KDUpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgY29uc3RfcmVmZXJlbmNlIHNpeHRoKCkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0KDUpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgcmVmZXJlbmNlIGdldEFyZzYoKQorCXsKKwkJcmV0dXJuICBnZXQoNSk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgY29uc3RfcmVmZXJlbmNlIGdldEFyZzYoKSBjb25zdAorCXsKKwkJcmV0dXJuICBnZXQoNSk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCByZWZlcmVuY2Ugc2V2ZW50aCgpCisJeworCQlyZXR1cm4gIGdldCg2KTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBjb25zdF9yZWZlcmVuY2Ugc2V2ZW50aCgpIGNvbnN0CisJeworCQlyZXR1cm4gIGdldCg2KTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCByZWZlcmVuY2UgZ2V0QXJnNygpCisJeworCQlyZXR1cm4gIGdldCg2KTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBjb25zdF9yZWZlcmVuY2UgZ2V0QXJnNygpIGNvbnN0CisJeworCQlyZXR1cm4gIGdldCg2KTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIHJlZmVyZW5jZSBsYXN0KCkKKwl7CisJCXJldHVybiggQmFzZVZlY3Rvcjo6YmFjaygpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgY29uc3RfcmVmZXJlbmNlIGxhc3QoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBCYXNlVmVjdG9yOjpiYWNrKCkgKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIFQgcG9wX2xhc3QoKQorCXsKKwkJVCB0aGVMYXN0ID0gQmFzZVZlY3Rvcjo6YmFjaygpOworCisJCUJhc2VWZWN0b3I6OnBvcF9iYWNrKCk7CisKKwkJcmV0dXJuKCB0aGVMYXN0ICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCBwb3BfbGFzdF90byhUICYgdGhlTGFzdCkKKwl7CisJCXRoZUxhc3QgPSBCYXNlVmVjdG9yOjpiYWNrKCk7CisKKwkJQmFzZVZlY3Rvcjo6cG9wX2JhY2soKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHJlbW92ZV9sYXN0KCkKKwl7CisJCUJhc2VWZWN0b3I6OnBvcF9iYWNrKCk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgcmVmZXJlbmNlIGdldChhdm1fc2l6ZV90IGluZGV4KQorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9BUlJBWV9JTkRFWF9FWElUKGluZGV4LCBCYXNlVmVjdG9yOjpzaXplKCkpCisJCQkJPDwgU0VORF9FWElUOworCisJCXJldHVybiggQmFzZVZlY3Rvcjo6YXQoaW5kZXgpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgY29uc3RfcmVmZXJlbmNlIGdldChhdm1fc2l6ZV90IGluZGV4KSBjb25zdAorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9BUlJBWV9JTkRFWF9FWElUKGluZGV4LCBCYXNlVmVjdG9yOjpzaXplKCkpCisJCQkJPDwgU0VORF9FWElUOworCisJCXJldHVybiggQmFzZVZlY3Rvcjo6YXQoaW5kZXgpICk7CisJfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8gVU5DT01NRU5UIEZPUiA8PCB2ZWN0b3I6Ol9NX3JhbmdlX2NoZWNrID4+IEVYQ0VQVElPTiBERUJVR0dJTkcgLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8JaW5saW5lIHZpcnR1YWwgcmVmZXJlbmNlIGF0KGF2bV9zaXplX3QgaW5kZXgpCisvLwl7CisvLwkJQVZNX09TX0FTU0VSVF9GQVRBTF9BUlJBWV9JTkRFWF9FWElUKGluZGV4LCBCYXNlVmVjdG9yOjpzaXplKCkpCisvLwkJCQk8PCBTRU5EX0VYSVQ7CisvLworLy8JCXJldHVybiggQmFzZVZlY3Rvcjo6YXQoaW5kZXgpICk7CisvLwl9CisvLworLy8JaW5saW5lIHZpcnR1YWwgY29uc3RfcmVmZXJlbmNlIGF0KGF2bV9zaXplX3QgaW5kZXgpIGNvbnN0CisvLwl7CisvLwkJQVZNX09TX0FTU0VSVF9GQVRBTF9BUlJBWV9JTkRFWF9FWElUKGluZGV4LCBCYXNlVmVjdG9yOjpzaXplKCkpCisvLwkJCQk8PCBTRU5EX0VYSVQ7CisvLworLy8JCXJldHVybiggQmFzZVZlY3Rvcjo6YXQoaW5kZXgpICk7CisvLwl9CisvLworLy8KKy8vCWlubGluZSB2aXJ0dWFsIHJlZmVyZW5jZSBvcGVyYXRvcltdKGF2bV9zaXplX3QgaW5kZXgpCisvLwl7CisvLwkJQVZNX09TX0FTU0VSVF9GQVRBTF9BUlJBWV9JTkRFWF9FWElUKGluZGV4LCBCYXNlVmVjdG9yOjpzaXplKCkpCisvLwkJCQk8PCBTRU5EX0VYSVQ7CisvLworLy8JCXJldHVybiggQmFzZVZlY3Rvcjo6b3BlcmF0b3JbXShpbmRleCkgKTsKKy8vCX0KKy8vCisvLwlpbmxpbmUgdmlydHVhbCBjb25zdF9yZWZlcmVuY2Ugb3BlcmF0b3JbXShhdm1fc2l6ZV90IGluZGV4KSBjb25zdAorLy8JeworLy8JCUFWTV9PU19BU1NFUlRfRkFUQUxfQVJSQVlfSU5ERVhfRVhJVChpbmRleCwgQmFzZVZlY3Rvcjo6c2l6ZSgpKQorLy8JCQkJPDwgU0VORF9FWElUOworLy8KKy8vCQlyZXR1cm4oIEJhc2VWZWN0b3I6Om9wZXJhdG9yW10oaW5kZXgpICk7CisvLwl9CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHNldChhdm1fc2l6ZV90IGluZGV4LCBjb25zdCBUICYgYXJnKQorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9BUlJBWV9JTkRFWF9FWElUKGluZGV4LCBCYXNlVmVjdG9yOjpzaXplKCkpCisJCQkJPDwgU0VORF9FWElUOworCisJCSgqdGhpcylbaW5kZXhdID0gYXJnOworCX0KKworCisJLyoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogR0VUVEVSIC8gU0VUVEVSCisJICogcmV2ZXJzZSBhY2Nlc3MKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisKKwlpbmxpbmUgdmlydHVhbCByZWZlcmVuY2UgcmV2ZXJzZV9hdChhdm1fc2l6ZV90IGluZGV4KQorCXsKKy8vCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX0FSUkFZX0lOREVYX0VYSVQoaW5kZXgsIEJhc2VWZWN0b3I6OnNpemUoKSkKKy8vCQkJCTw8IFNFTkRfRVhJVDsKKworCQlyZXR1cm4oIEJhc2VWZWN0b3I6OgorCQkJCWF0KEJhc2VWZWN0b3I6OnNpemUoKSAtIDEgLSBpbmRleCkgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBjb25zdF9yZWZlcmVuY2UgcmV2ZXJzZV9hdChhdm1fc2l6ZV90IGluZGV4KSBjb25zdAorCXsKKy8vCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX0FSUkFZX0lOREVYX0VYSVQoaW5kZXgsIEJhc2VWZWN0b3I6OnNpemUoKSkKKy8vCQkJCTw8IFNFTkRfRVhJVDsKKworCQlyZXR1cm4oIEJhc2VWZWN0b3I6OgorCQkJCWF0KEJhc2VWZWN0b3I6OnNpemUoKSAtIDEgLSBpbmRleCkgKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIHJlZmVyZW5jZSByZXZlcnNlX2dldChhdm1fc2l6ZV90IGluZGV4KQorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9BUlJBWV9JTkRFWF9FWElUKGluZGV4LCBCYXNlVmVjdG9yOjpzaXplKCkpCisJCQkJPDwgU0VORF9FWElUOworCisJCXJldHVybiggQmFzZVZlY3Rvcjo6CisJCQkJYXQoQmFzZVZlY3Rvcjo6c2l6ZSgpIC0gMSAtIGluZGV4KSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGNvbnN0X3JlZmVyZW5jZSByZXZlcnNlX2dldChhdm1fc2l6ZV90IGluZGV4KSBjb25zdAorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9BUlJBWV9JTkRFWF9FWElUKGluZGV4LCBCYXNlVmVjdG9yOjpzaXplKCkpCisJCQkJPDwgU0VORF9FWElUOworCisJCXJldHVybiggQmFzZVZlY3Rvcjo6CisJCQkJYXQoQmFzZVZlY3Rvcjo6c2l6ZSgpIC0gMSAtIGluZGV4KSApOworCX0KKworCisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHJldmVyc2Vfc2V0KGF2bV9zaXplX3QgaW5kZXgsIGNvbnN0IFQgJiBhcmcpCisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX0FSUkFZX0lOREVYX0VYSVQoaW5kZXgsIEJhc2VWZWN0b3I6OnNpemUoKSkKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJKCp0aGlzKVtCYXNlVmVjdG9yOjpzaXplKCkgLSAxIC0gaW5kZXhdID0gYXJnOworCX0KKworCisKKwkvKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBTRVRURVIKKwkgKiByZXNldAorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCB2b2lkIHJlc2V0KGNvbnN0IFQgJiBhcmcpCisJeworCQlCYXNlVmVjdG9yOjpjbGVhcigpOworCisJCWFwcGVuZChhcmcpOworCX0KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgcmVzZXQoY29uc3QgVCAmIGFyZzEsIGNvbnN0IFQgJiBhcmcyKQorCXsKKwkJQmFzZVZlY3Rvcjo6Y2xlYXIoKTsKKworCQlhcHBlbmQoYXJnMSk7CisJCWFwcGVuZChhcmcyKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHJlc2V0KGNvbnN0IFQgJiBhcmcxLCBjb25zdCBUICYgYXJnMiwgY29uc3QgVCAmIGFyZzMpCisJeworCQlCYXNlVmVjdG9yOjpjbGVhcigpOworCisJCWFwcGVuZChhcmcxKTsKKwkJYXBwZW5kKGFyZzIpOworCQlhcHBlbmQoYXJnMyk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCByZXNldChjb25zdCBUICYgYXJnMSwKKwkJCWNvbnN0IFQgJiBhcmcyLCBjb25zdCBUICYgYXJnMywgY29uc3QgVCAmIGFyZzQpCisJeworCQlCYXNlVmVjdG9yOjpjbGVhcigpOworCisJCWFwcGVuZChhcmcxKTsKKwkJYXBwZW5kKGFyZzIpOworCQlhcHBlbmQoYXJnMyk7CisJCWFwcGVuZChhcmc0KTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHJlc2V0KGNvbnN0IFQgJiBhcmcxLCBjb25zdCBUICYgYXJnMiwKKwkJCWNvbnN0IFQgJiBhcmczLCBjb25zdCBUICYgYXJnNCwgY29uc3QgVCAmIGFyZzUpCisJeworCQlCYXNlVmVjdG9yOjpjbGVhcigpOworCisJCWFwcGVuZChhcmcxKTsKKwkJYXBwZW5kKGFyZzIpOworCQlhcHBlbmQoYXJnMyk7CisJCWFwcGVuZChhcmc0KTsKKwkJYXBwZW5kKGFyZzUpOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgdm9pZCByZXNldChUKiBhbkFycmF5T2ZBcmd1bWVudCwgaW50IGFuQXJnU2l6ZSkKKwl7CisJCUJhc2VWZWN0b3I6OmNsZWFyKCk7CisKKwkJZm9yIChpbnQgaSA9IDAgOyBpIDwgYW5BcmdTaXplIDsgKytpKQorCQl7CisJCQlwdXNoX2JhY2soYW5BcnJheU9mQXJndW1lbnRbaV0pOworCQl9CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHJlc2V0KGNvbnN0IHN0ZDo6bGlzdDwgVCA+ICYgYUNvbGxlY3Rpb24pCisJeworCQlCYXNlVmVjdG9yOjpjbGVhcigpOworCisJCXB1c2hfYmFjayhhQ29sbGVjdGlvbik7CisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCByZXNldChjb25zdCBzdGQ6OnZlY3RvcjwgVCA+ICYgYUNvbGxlY3Rpb24pCisJeworCQlCYXNlVmVjdG9yOjpjbGVhcigpOworCisJCXB1c2hfYmFjayhhQ29sbGVjdGlvbik7CisJfQorCisKKwl0ZW1wbGF0ZTwgdHlwZW5hbWUgX1RPRSA+CisJaW5saW5lIHZvaWQgcmVzZXQoY29uc3Qgc3RkOjpsaXN0PCBfVE9FID4gJiBhQ29sbGVjdGlvbikKKwl7CisJCUJhc2VWZWN0b3I6OmNsZWFyKCk7CisKKwkJcHVzaF9iYWNrKGFDb2xsZWN0aW9uKTsKKwl9CisKKwl0ZW1wbGF0ZTwgdHlwZW5hbWUgX1RPRSA+CisJaW5saW5lIHZvaWQgcmVzZXQoY29uc3Qgc3RkOjp2ZWN0b3I8IF9UT0UgPiAmIGFDb2xsZWN0aW9uKQorCXsKKwkJQmFzZVZlY3Rvcjo6Y2xlYXIoKTsKKworCQlwdXNoX2JhY2soYUNvbGxlY3Rpb24pOworCX0KKworCS8qKgorCSAqIGVyYXNlIC0gcmVtb3ZlICg8PT4gZXJhc2UgYWxsKQorCSAqCisJICovCisJaW5saW5lIHZpcnR1YWwgdm9pZCByZW1vdmUoY29uc3QgVCAmIGFyZykKKwl7CisJCXR5cGVuYW1lIEJhc2VWZWN0b3I6Oml0ZXJhdG9yIGl0ID0gQmFzZVZlY3Rvcjo6YmVnaW4oKTsKKwkJZm9yKCA7IGl0ICE9IEJhc2VWZWN0b3I6OmVuZCgpIDsgKytpdCApCisJCXsKKwkJCWlmKCAoKml0KSA9PSBhcmcgKQorCQkJeworCQkJCUJhc2VWZWN0b3I6OmVyYXNlKGl0KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisKKwkJLy8JCWZvciggYXZtX3NpemVfdCBpdCA9IDAgOyBpdCAhPSBCYXNlVmVjdG9yOjpzaXplKCkgOyArK2l0ICkKKwkJLy8JCXsKKwkJLy8JCQlpZiggQmFzZVZlY3Rvcjo6YXQoaXQpID09IGFyZyApCisJCS8vCQkJeworCQkvLwkJCQlCYXNlVmVjdG9yOjplcmFzZShCYXNlVmVjdG9yOjpiZWdpbigpICsgaXQpOworCQkvLwkJCQlicmVhazsKKwkJLy8JCQl9CisJCS8vCQl9CisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCBycmVtb3ZlKGNvbnN0IFQgJiBhcmcpCisJeworCQl0eXBlbmFtZQorCQlCYXNlVmVjdG9yOjpyZXZlcnNlX2l0ZXJhdG9yIGl0ID1CYXNlVmVjdG9yOjpyYmVnaW4oKTsKKwkJZm9yKCA7IGl0ICE9IEJhc2VWZWN0b3I6OnJlbmQoKSA7ICsraXQgKQorCQl7CisJCQlpZiggKCppdCkgPT0gYXJnICkKKwkJCXsKKwkJCQlCYXNlVmVjdG9yOjplcmFzZSggLS0oIGl0LmJhc2UoKSApICk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKK307CisKKworCisKKwordGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorY2xhc3MgQVBWZWN0b3IgIDogIHB1YmxpYyBWZWN0b3I8IFQgPgoreworcHVibGljOgorCS8qKgorCSAqIFRZUEVERUYKKwkgKi8KKwl0eXBlZGVmIFQgICAgICAgJiByZWZlcmVuY2U7CisJdHlwZWRlZiBjb25zdCBUICYgY29uc3RfcmVmZXJlbmNlOworCisJdHlwZWRlZiBWZWN0b3I8IFQgPiAgQmFzZUFQVmVjdG9yOworCisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlBUFZlY3RvcigpCisJOiBCYXNlQVBWZWN0b3IoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJQVBWZWN0b3IoY29uc3QgQVBWZWN0b3IgJiBhVmVjdG9yKQorCTogQmFzZUFQVmVjdG9yKCApCisJeworCQl0eXBlbmFtZSBCYXNlQVBWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYVZlY3Rvci5iZWdpbigpOworCQl0eXBlbmFtZSBCYXNlQVBWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gYVZlY3Rvci5lbmQoKTsKKwkJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApCisJCXsKKwkJCUJhc2VBUFZlY3Rvcjo6cHVzaF9iYWNrKCBzZXA6OmluY3JSZWZlcmVuY2VDb3VudCggKml0ICkgKTsKKwkJfQorCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkFQVmVjdG9yKCkKKwl7CisJCXR5cGVuYW1lCisJCUJhc2VBUFZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBCYXNlQVBWZWN0b3I6OmJlZ2luKCk7CisJCXR5cGVuYW1lCisJCUJhc2VBUFZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBCYXNlQVBWZWN0b3I6OmVuZCgpOworCQlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwkJeworCQkJc2VwOjpkZXN0cm95KCAqaXQgKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENMRUFSCisJICovCisJdm9pZCBjbGVhcigpCisJeworCQl3aGlsZSggQmFzZUFQVmVjdG9yOjpub25lbXB0eSgpICkKKwkJeworCQkJc2VwOjpkZXN0cm95KCBCYXNlQVBWZWN0b3I6OnBvcF9sYXN0KCkgKTsKKwkJfQorCisJCUJhc2VBUFZlY3Rvcjo6Y2xlYXIoKTsKKwl9CisKK307CisKKworCisvKioKKyAqIE1FTU9SWSBNQU5BR0VNRU5UCisgKiBERVNUUk9ZCisgKi8KKwordGVtcGxhdGU8IGNsYXNzIFQgPgordm9pZCBkZXN0cm95KFZlY3RvcjwgVCAqID4gKiAmIGFWZWN0b3IpCit7CisJdHlwZW5hbWUgVmVjdG9yPCBUICogPjo6aXRlcmF0b3IgaXQgPSBhVmVjdG9yLT5iZWdpbigpOworCXR5cGVuYW1lIFZlY3RvcjwgVCAqID46Oml0ZXJhdG9yIGl0RW5kID0gYVZlY3Rvci0+ZW5kKCk7CisJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApCisJeworCQlzZXA6OmRlc3Ryb3koICppdCApOworCX0KKworCWRlbGV0ZSggYVZlY3RvciApOworCisJYVZlY3RvciA9IE5VTEw7Cit9CisKKwordGVtcGxhdGU8IGNsYXNzIFQgPgordm9pZCBkZXN0cm95KFZlY3RvcjwgVCA+ICogJiBhVmVjdG9yKQoreworCWRlbGV0ZSggYVZlY3RvciApOworCisJYVZlY3RvciA9IE5VTEw7Cit9CisKKworCit9CisKKyNlbmRpZiAvKkNPTlRBSU5FUl9WRUNUT1JfSF8qLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tbW9uL0F2bU9iamVjdC5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21tb24vQXZtT2JqZWN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODk4ZjVkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tbW9uL0F2bU9iamVjdC5jcHAKQEAgLTAsMCArMSwyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDEwIGp1aWwuIDIwMDkKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkF2bU9iamVjdC5oIgorCituYW1lc3BhY2Ugc2VwCit7CisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tbW9uL0F2bU9iamVjdC5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tbW9uL0F2bU9iamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NjI3OTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21tb24vQXZtT2JqZWN0LmgKQEAgLTAsMCArMSwxODAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxMCBqdWlsLiAyMDA5CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgUkVGRVJFTkNFQ09VTlRFUl9IXworI2RlZmluZSBSRUZFUkVOQ0VDT1VOVEVSX0hfCisKKyNpbmNsdWRlIDx1dGlsL2F2bV9hc3NlcnQuaD4KKyNpbmNsdWRlIDx1dGlsL2F2bV9kZWJ1Zy5oPgorI2luY2x1ZGUgPHV0aWwvYXZtX2luamVjdG9yLmg+CisKKyNpbmNsdWRlIDxiYXNlL1JlZmVyZW5jZUNvdW50ZXIuaD4KKworI2luY2x1ZGUgPHByaW50ZXIvT3V0U3RyZWFtLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIEF2bU9iamVjdCA6CisJCXB1YmxpYyBSZWZlcmVuY2VDb3VudGVyLAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIEF2bU9iamVjdCApCit7CisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlBdm1PYmplY3QoICkKKwk6IFJlZmVyZW5jZUNvdW50ZXIoICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCUF2bU9iamVjdChjb25zdCBBdm1PYmplY3QgJiBhbk9iamVjdCkKKwk6IFJlZmVyZW5jZUNvdW50ZXIoICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5Bdm1PYmplY3QoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBBVk0gREVCVUcgUkVGIENPVU5URVIKKwkgKi8KKwlpbmxpbmUgdm9pZCBBVk1fREVCVUdfUkVGX0NPVU5URVIoT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworQVZNX0lGX0RFQlVHX0ZMQUcoIFJFRkVSRU5DRV9DT1VOVElORyApCisJCW9zIDw8ICIgLyogPCByZWY6ICIgPDwgZ2V0UmVmQ291bnQoKSA8PCAiID4gKi8iIDw8IHN0ZDo6Zmx1c2g7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggUkVGRVJFTkNFX0NPVU5USU5HICkKKwl9CisKKwlpbmxpbmUgc3RkOjpzdHJpbmcgQVZNX0RFQlVHX1JFRl9DT1VOVEVSKCkgY29uc3QKKwl7CisJCVN0cmluZ091dFN0cmVhbSBvc3M7CisKKwkJQVZNX0RFQlVHX1JFRl9DT1VOVEVSKG9zcyk7CisKKwkJcmV0dXJuKCBvc3Muc3RyKCkgKTsKKwl9CisKKwlpbmxpbmUgc3RkOjpzdHJpbmcgc3RyUmVmQ291bnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBPU1MoKSA8PCAiIC8qIDwgcmVmOiAiIDw8IGdldFJlZkNvdW50KCkgPDwgIiA+ICovIiApOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFNFUklBTElaQVRJT04gQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLwl0ZW1wbGF0ZTwgY2xhc3MgT1NfVCA+CisvLwlPU19UICYgb3NTdHJlYW0oT1NfVCAmIG9zKSBjb25zdAorLy8JeworLy8JCXRvU3RyZWFtKCBvcyApOworLy8KKy8vCQlyZXR1cm4oIG9zICk7CisvLwl9CisKKworCWlubGluZSB2aXJ0dWFsIE91dFN0cmVhbSAmIG9zU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJdG9TdHJlYW0oIG9zICk7CisKKwkJcmV0dXJuKCBvcyApOworCX0KKworCWlubGluZSB2aXJ0dWFsIFN0cmluZ091dFN0cmVhbSAmIG9zU3RyZWFtKFN0cmluZ091dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJdG9TdHJlYW0oIG9zICk7CisKKwkJcmV0dXJuKCBvcyApOworCX0KKworCWlubGluZSB2aXJ0dWFsIFBhaXJPdXRTdHJlYW0gJiBvc1N0cmVhbShQYWlyT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQl0b1N0cmVhbSggb3MgKTsKKworCQlyZXR1cm4oIG9zICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgVHJpcGxlT3V0U3RyZWFtICYgb3NTdHJlYW0oVHJpcGxlT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQl0b1N0cmVhbSggb3MgKTsKKworCQlyZXR1cm4oIG9zICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCB0b1N0cmVhbShQYWlyT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQl0b1N0cmVhbSggb3MuT1MxKTsKKwkJdG9TdHJlYW0ob3MuT1MyICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCB0b1N0cmVhbShUcmlwbGVPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCXRvU3RyZWFtKCBvcy5PUzEpOworCQl0b1N0cmVhbShvcy5PUzIpOworCQl0b1N0cmVhbShvcy5PUzMgKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKAorCQkJY29uc3QgQXZtSW5kZW50ICYgaW5kZW50ID0gQVZNX1RBQl9JTkRFTlQpIGNvbnN0CisJeworCQlTdHJpbmdPdXRTdHJlYW0gb3NzKGluZGVudCk7CisKKwkJdG9TdHJlYW0oIG9zcyApOworCisJCXJldHVybiggb3NzLnN0cigpICk7CisJfQorCisKKwkvKioKKwkgKiBUUkFDRSBvbiBERVNUUk9ZCisJICogZGJnRGVzdHJveQorCSAqLworCWlubGluZSB2b2lkIGRiZ0Rlc3Ryb3koKSBjb25zdAorCXsKKwkJQVZNX09TX1dBUk4gPDwgImRlc3Ryb3k8IEAgIiA8PCBhdm1fYWRkcmVzc190KCB0aGlzICkKKwkJCQk8PCAiICwgIiA8PCBzdGQ6OnNldHcoMTYpIDw8ICJBdm1PYmplY3QiIDw8ICIgPiA6IgorCQkJCTw8IHN0ZDo6Zmx1c2ggPDwgc3RyX2luZGVudCggdGhpcyApIDw8IHN0ZDo6ZW5kbDsKKwl9CisKK307CisKKworfQorCisjZW5kaWYgLyogUkVGRVJFTkNFQ09VTlRFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tbW9uL0F2bVBvaW50ZXIuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tbW9uL0F2bVBvaW50ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzOGE0MjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21tb24vQXZtUG9pbnRlci5jcHAKQEAgLTAsMCArMSwyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDIgZsOpdnIuIDIwMTIKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkF2bVBvaW50ZXIuaCIKKworbmFtZXNwYWNlIHNlcAoreworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tbW9uL0F2bVBvaW50ZXIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbW1vbi9Bdm1Qb2ludGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ2MDgyYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbW1vbi9Bdm1Qb2ludGVyLmgKQEAgLTAsMCArMSwzNTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyIGbDqXZyLiAyMDEyCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQVZNUE9JTlRFUl9IXworI2RlZmluZSBBVk1QT0lOVEVSX0hfCisKKyNpbmNsdWRlIDxiYXNlL1NtYXJ0UG9pbnRlci5oPgorCisKKyNpbmNsdWRlIDxjb21tb24vQkYuaD4KKworI2luY2x1ZGUgPHByaW50ZXIvT3V0U3RyZWFtLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK3RlbXBsYXRlPCBjbGFzcyBUICwgY2xhc3MgVGRlc3RydWN0b3IgPgorY2xhc3MgQXZtUG9pbnRlciAgOiAgcHVibGljIFNtYXJ0UG9pbnRlcjwgVCAsIFRkZXN0cnVjdG9yID4KK3sKKworcHJpdmF0ZToKKwkvKioKKwkgKiBUWVBFREVGCisJICovCisJdHlwZWRlZiAgICAgICBTbWFydFBvaW50ZXI8IFQgLCBUZGVzdHJ1Y3RvciA+ICBiYXNlX3RoaXNfdHlwZTsKKwl0eXBlZGVmICAgICAgICAgICAgQXZtUG9pbnRlcjwgVCAsIFRkZXN0cnVjdG9yID4gIHRoaXNfdHlwZTsKKworcHJvdGVjdGVkOgorCXR5cGVkZWYgICAgICAgVCAgICB2YWx1ZV90eXBlOworCisJdHlwZWRlZiAgICAgICBUICYgIHJlZmVyZW5jZTsKKwl0eXBlZGVmIGNvbnN0IFQgJiAgY29uc3RfcmVmZXJlbmNlOworCisKKwl0eXBlZGVmICAgICAgIFQgKiAgcG9pbnRlcjsKKwl0eXBlZGVmIGNvbnN0IFQgKiAgY29uc3RfcG9pbnRlcjsKKworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlBdm1Qb2ludGVyKCkKKwk6IGJhc2VfdGhpc190eXBlKCApCisJeworCQkvLyEhISBOT1RISU5HCisJfQorCisJZXhwbGljaXQgQXZtUG9pbnRlcihwb2ludGVyIHB0cikKKwk6IGJhc2VfdGhpc190eXBlKCBwdHIgKQorCXsKKwkJLy8hISEgTk9USElORworCX0KKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCUF2bVBvaW50ZXIoY29uc3QgQXZtUG9pbnRlciAmIG90aGVyKQorCTogYmFzZV90aGlzX3R5cGUoIG90aGVyICkKKwl7CisJCS8vISEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5Bdm1Qb2ludGVyKCkKKwl7CisJCS8vISEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIENBU1QKKwkgKi8KKwlpbmxpbmUgb3BlcmF0b3IgcG9pbnRlciAoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBiYXNlX3RoaXNfdHlwZTo6bVBUUiApOworCX0KKworCS8vIERlc2FjdGl2ZSBjYWxsIG9mIDw8IGRlbGV0ZSA+PiB1c2luZyBjb21waWxlciBhbWJpZ3VvdXMgbWVjYW5pc20KKwlpbmxpbmUgb3BlcmF0b3Igdm9pZCAqICgpIGNvbnN0CisJeworCQlyZXR1cm4oIHRoaXNfdHlwZTo6cmF3X3BvaW50ZXIoKSApOworCX0KKworCisJLyoqCisJICogT1BFUkFUT1JTCisJICovCisJaW5saW5lIHBvaW50ZXIgb3BlcmF0b3ItPiAoKSBjb25zdAorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggYmFzZV90aGlzX3R5cGU6Om1QVFIgKQorCQkJCTw8ICJyYXdfcG9pbnRlciBpbiBBdm1Qb2ludGVyICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJcmV0dXJuKCBiYXNlX3RoaXNfdHlwZTo6bVBUUiApOworCX0KKworCisJLyoqCisJICogQVNTSUdOTUVOVAorCSAqLworCWlubGluZSBBdm1Qb2ludGVyICYgb3BlcmF0b3I9KHBvaW50ZXIgYVB0cikKKwl7CisJCWlmKCBiYXNlX3RoaXNfdHlwZTo6bVBUUiAhPSBhUHRyICkKKwkJeworCQkJYmFzZV90aGlzX3R5cGU6OnJlbGVhc2UoIGFQdHIgKTsKKwkJfQorCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJaW5saW5lIEF2bVBvaW50ZXIgJiBvcGVyYXRvcj0oY29uc3QgQXZtUG9pbnRlciAmIG90aGVyKQorCXsKKwkJaWYoIGJhc2VfdGhpc190eXBlOjptUFRSICE9IG90aGVyLm1QVFIgKQorCQl7CisJCQliYXNlX3RoaXNfdHlwZTo6cmVsZWFzZV9hY3F1aXJlKCBvdGhlci5tUFRSICk7CisJCX0KKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCisJaW5saW5lIEF2bVBvaW50ZXIgJiBvcGVyYXRvcj0oY29uc3QgQkYgJiBvdGhlcikKKwl7CisJCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggb3RoZXIuaXNfd2Vha2x5PCB2YWx1ZV90eXBlID4oKSApCisJCQkJPDwgIkludmFsaWQgQXNzaWdubWVudCBDYXN0IG9mIGEgQkYgdG8gYSAiCisJCQkJCSJBdm1Qb2ludGVyPCBUICwgVGRlc3RydWN0b3IgPiAhISEiCisJCQkJPDwgU0VORF9FWElUOworCisJCWlmKCBiYXNlX3RoaXNfdHlwZTo6bVBUUiAhPSBvdGhlci5yYXdfcG9pbnRlcigpICkKKwkJeworCQkJYmFzZV90aGlzX3R5cGU6OnJlbGVhc2VfYWNxdWlyZSggY29uc3RfY2FzdDxwb2ludGVyPigKKwkJCQkJc3RhdGljX2Nhc3Q8IHBvaW50ZXIgPihvdGhlci5yYXdfcG9pbnRlcigpKSApICk7CisJCX0KKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCisJLyoqCisJICogQ09NUEFSSVNPTgorCSAqIE9QRVJBVE9SCisJICovCisKKwlpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0X3BvaW50ZXIgYVB0cikgY29uc3QKKwl7CisJCXJldHVybiggYmFzZV90aGlzX3R5cGU6Om1QVFIgPT0gYVB0ciApOworCX0KKworCXRlbXBsYXRlPCBjbGFzcyBVID4KKwlpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFUgKiBhUHRyKSBjb25zdAorCXsKKwkJcmV0dXJuKCBiYXNlX3RoaXNfdHlwZTo6bVBUUiA9PSBhUHRyICk7CisJfQorCisJaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBBdm1Qb2ludGVyICYgb3RoZXIpIGNvbnN0CisJeworCQlyZXR1cm4oIGJhc2VfdGhpc190eXBlOjptUFRSID09IG90aGVyLm1QVFIgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEJGICYgb3RoZXIpIGNvbnN0CisJeworCQlyZXR1cm4oIGJhc2VfdGhpc190eXBlOjptUFRSID09IG90aGVyLnJhd19wb2ludGVyKCkgKTsKKwl9CisKKworCWlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3RfcG9pbnRlciBhUHRyKSBjb25zdAorCXsKKwkJcmV0dXJuKCBiYXNlX3RoaXNfdHlwZTo6bVBUUiAhPSBhUHRyICk7CisJfQorCisJdGVtcGxhdGU8IGNsYXNzIFUgPgorCWlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgVSAqIGFQdHIpIGNvbnN0CisJeworCQlyZXR1cm4oIGJhc2VfdGhpc190eXBlOjptUFRSICE9IGFQdHIgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEF2bVBvaW50ZXIgJiBvdGhlcikgY29uc3QKKwl7CisJCXJldHVybiggYmFzZV90aGlzX3R5cGU6Om1QVFIgIT0gb3RoZXIubVBUUiApOworCX0KKworCWlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgQkYgJiBvdGhlcikgY29uc3QKKwl7CisJCXJldHVybiggYmFzZV90aGlzX3R5cGU6Om1QVFIgIT0gb3RoZXIucmF3X3BvaW50ZXIoKSApOworCX0KKworCisKKwkvKioKKwkgKiBDT01QQVJJU09OCisJICovCisJaW5saW5lIGJvb2wgaXNFUShjb25zdF9wb2ludGVyIGFQdHIpIGNvbnN0CisJeworCQlyZXR1cm4oIGJhc2VfdGhpc190eXBlOjptUFRSID09IGFQdHIgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc0VRKGNvbnN0IEF2bVBvaW50ZXIgJiBvdGhlcikgY29uc3QKKwl7CisJCXJldHVybiggYmFzZV90aGlzX3R5cGU6Om1QVFIgPT0gb3RoZXIubVBUUiApOworCX0KKworCisJaW5saW5lIGJvb2wgaXNORVEoY29uc3RfcG9pbnRlciBhUHRyKSBjb25zdAorCXsKKwkJcmV0dXJuKCBiYXNlX3RoaXNfdHlwZTo6bVBUUiAhPSBhUHRyICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNORVEoY29uc3QgQXZtUG9pbnRlciAmIG90aGVyKSBjb25zdAorCXsKKwkJcmV0dXJuKCBiYXNlX3RoaXNfdHlwZTo6bVBUUiAhPSBvdGhlci5tUFRSICk7CisJfQorCisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJaW5saW5lIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQlpZiggYmFzZV90aGlzX3R5cGU6Om1QVFIgIT0gTlVMTCApCisJCXsKKwkJCWJhc2VfdGhpc190eXBlOjptUFRSLT50b1N0cmVhbShvcyk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlvcyA8PCBUQUIgPDwgIkF2bVBvaW50ZXI8bnVsbD4iIDw8IEVPTF9GTFVTSDsKKwkJfQorCX0KKworCisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgdG9TdHJpbmcoCisJCQljb25zdCBBdm1JbmRlbnQgJiBpbmRlbnQgPSBBVk1fVEFCX0lOREVOVCkgY29uc3QKKwl7CisJCVN0cmluZ091dFN0cmVhbSBvc3MoaW5kZW50KTsKKworCQl0b1N0cmVhbShvc3MpOworCisJCXJldHVybiggb3NzLnN0cigpICk7CisJfQorCisKKwkvKioKKwkgKiBERUZBVUxUIE5VTEwKKwkgKi8KKwlzdGF0aWMgQXZtUG9pbnRlciAgUkVGX05VTEw7CisKK307CisKKwordGVtcGxhdGU8IGNsYXNzIFQgLCBjbGFzcyBUZGVzdHJ1Y3RvciA+CitBdm1Qb2ludGVyPCBUICwgVGRlc3RydWN0b3IgPiAgQXZtUG9pbnRlcjwgVCAsIFRkZXN0cnVjdG9yID46OlJFRl9OVUxMOworCisKKyNkZWZpbmUgQVBfUkVGX05VTEwoQ2xhc3NOYW1lKSAgQVAjI0NsYXNzTmFtZTo6UkVGX05VTEwKKworCisjZGVmaW5lIEFWTV9ERUZJTkVfQVBfQ0xBU1MoQ2xhc3NOYW1lKSAgIFwKKwkJdHlwZWRlZiBBdm1Qb2ludGVyPCBDbGFzc05hbWUgLCBEZXN0cm95T2JqZWN0UG9saWN5ID4gQVAjI0NsYXNzTmFtZTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCisjZGVmaW5lIElOQ1JfQkYoQSkgICBcCisJCXNlcDo6QkYoIHNlcDo6aW5jclJlZmVyZW5jZUNvdW50KEEpICkKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8gVFlQRSBERUZJTklUSU9OIGZvciBTTUFSVCBQT0lOVEVSLgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKworLy90ZW1wbGF0ZTwgY2xhc3MgVCA+CisvL2NsYXNzIEF2bUNsb25lYWJsZUNsYXNzCisvL3sKKy8vCisvL3B1YmxpYzoKKy8vCS8qKgorLy8JICogREVTVFJVQ1RPUgorLy8JICovCisvLwl2aXJ0dWFsIH5Bdm1DbG9uZWFibGVDbGFzcygpCisvLwl7CisvLwkJLy8hISBOT1RISU5HCisvLwl9CisvLworLy8JdmlydHVhbCBUICogY2xvbmUoKSBjb25zdAorLy8JeworLy8JCXJldHVybiggbmV3IFQoKnRoaXMpICk7CisvLwl9CisvL307CisKKworI2RlZmluZSBBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyhDbGFzc05hbWUpICBcCitwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl2aXJ0dWFsIENsYXNzTmFtZSAqIGNsb25lKCkgY29uc3QgICAgICAgICAgXAorCXsgcmV0dXJuKCBuZXcgQ2xhc3NOYW1lKCp0aGlzKSApOyB9ICAgICAgICBcCitwcml2YXRlOgorCisKKworLy90ZW1wbGF0ZTwgY2xhc3MgVCA+CisvL2NsYXNzIEF2bVVuY2xvbmVhYmxlQ2xhc3MKKy8veworLy8KKy8vcHVibGljOgorLy8JLyoqCisvLwkgKiBERVNUUlVDVE9SCisvLwkgKi8KKy8vCXZpcnR1YWwgfkF2bVVuY2xvbmVhYmxlQ2xhc3MoKQorLy8JeworLy8JCS8vISEgTk9USElORworLy8JfQorLy8KKy8vCXZpcnR1YWwgVCAqIGNsb25lKCkgY29uc3QKKy8vCXsKKy8vCQlyZXR1cm4oIGNvbnN0X2Nhc3Q8IFQgKiA+KHRoaXMpICk7CisvLwl9CisvL307CisKKworI2RlZmluZSBBVk1fREVDTEFSRV9VTkNMT05BQkxFX0NMQVNTKENsYXNzTmFtZSkgICAgIFwKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJdmlydHVhbCBDbGFzc05hbWUgKiBjbG9uZSgpIGNvbnN0ICAgICAgICAgICAgICAgXAorCXsgcmV0dXJuKCBjb25zdF9jYXN0PCBDbGFzc05hbWUgKiA+KHRoaXMpICk7IH0gIFwKK3ByaXZhdGU6CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisjZW5kaWYgLyogQVZNUE9JTlRFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tbW9uL0JGLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbW1vbi9CRi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRkYTg2YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbW1vbi9CRi5jcHAKQEAgLTAsMCArMSw1NjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxMCBqdWlsLiAyMDA5CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJCRi5oIgorCisjaW5jbHVkZSA8Zm1sL2NvbW1vbi9PYmplY3RFbGVtZW50Lmg+CisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9CYXNlQ29tcGlsZWRGb3JtLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZkRhdGEuaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0F2bUNvZGUuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29tcGFyZXIuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29uc3RhbnQuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29uc3RydWN0b3IuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uRmFjdG9yeS5oPgorCisvLyNpbmNsdWRlIDxmbWwvc3ltYm9sL1N5bWJvbC5oPgorLy8jaW5jbHVkZSA8Zm1sL3BvaW50ZXIvVHlwZS5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvUnVudGltZUlELmg+CisKKyNpbmNsdWRlIDxmbWwvd29ya2Zsb3cvVW5pRm9ybUlkZW50aWZpZXIuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoqCisgKiBJTlNUQU5DRSBDT1VOVEVSCisgKi8KK2F2bV91aW50NjRfdCBCRjo6SU5TVEFOQ0VfQ09VTlRFUl9BU1AgPSAwOworCisKKy8qCisgKiBTVEFUSUMKKyAqIEFUVFJJQlVURVMKKyAqLworCisvKioKKyAqIERFRkFVTFQgTlVMTAorICovCitCRiBCRjo6UkVGX05VTEw7CisKKworLyoqCisgKiBGaW5hbGl6ZQorICovCit2b2lkIEJGOjpmaW5hbGl6ZSgpCit7CisJaWYoIChtUFRSICE9IE5VTEwpICYmIChtUFRSLT5nZXRSZWZDb3VudCgpID4gMSkgKQorCXsKK0FWTV9JRl9ERUJVR19GTEFHKCBSRUZFUkVOQ0VfQ09VTlRJTkcgKQorCUVsZW1lbnQgKiBwYmYgPSAvKmR5bmFtaWNfY2FzdDwgRWxlbWVudCAqID4qLyggbVBUUiApOworCWlmKCBwYmYgIT0gTlVMTCApCisJeworCQlBVk1fT1NfTE9HIDw8ICJmaW5hbGl6ZTwgIiA8PCBwYmYtPmNsYXNzS2luZE5hbWUoKQorCQkJCTw8ICI+IEAgIiA8PCBhdm1fYWRkcmVzc190KCBwYmYgKQorCQkJCTw8ICIgeCAiIDw8IHBiZi0+Z2V0UmVmQ291bnQoKSA8PCAiIDogIiA8PCBwYmYtPnN0cigpCisJCQkJPDwgc3RkOjplbmRsOworCX0KK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBSRUZFUkVOQ0VfQ09VTlRJTkcgKQorCisJCW1QVFItPnNldFJlZkNvdW50KCAxICk7CisJfQorCisJcmVsZWFzZSggTlVMTCApOworfQorCisKKy8qKgorICogTlVNRVJJQyBvciBTSU1QTEUgVFlQRSBURVNUICYgQ0FTVAorICovCisKK2Jvb2wgQkY6OmlzQm9vbGVhbigpIGNvbnN0Cit7CisJcmV0dXJuKCBFeHByZXNzaW9uRmFjdG9yeTo6aXNCb29sZWFuKCp0aGlzKSApOworfQorCitib29sIEJGOjp0b0Jvb2xlYW4oKSBjb25zdAoreworCXJldHVybiggRXhwcmVzc2lvbkZhY3Rvcnk6OnRvQm9vbGVhbigqdGhpcykgKTsKK30KKworCitib29sIEJGOjppc0VxdWFsRmFsc2UoKSBjb25zdAoreworCXJldHVybiggdGhpcy0+aXNURVEoIEV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9GQUxTRSApIHx8CisJCQlFeHByZXNzaW9uRmFjdG9yeTo6aXNFcXVhbEZhbHNlKCp0aGlzKSApOworfQorCitib29sIEJGOjppc05vdEVxdWFsRmFsc2UoKSBjb25zdAoreworCXJldHVybiggRXhwcmVzc2lvbkZhY3Rvcnk6OmlzTm90RXF1YWxGYWxzZSgqdGhpcykgKTsKK30KKworCitib29sIEJGOjppc0VxdWFsVHJ1ZSgpIGNvbnN0Cit7CisJcmV0dXJuKCB0aGlzLT5pc1RFUSggRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX1RSVUUgKSB8fAorCQkJRXhwcmVzc2lvbkZhY3Rvcnk6OmlzRXF1YWxUcnVlKCp0aGlzKSApOworfQorCitib29sIEJGOjppc05vdEVxdWFsVHJ1ZSgpIGNvbnN0Cit7CisJcmV0dXJuKCBFeHByZXNzaW9uRmFjdG9yeTo6aXNOb3RFcXVhbFRydWUoKnRoaXMpICk7Cit9CisKKworCisKKworLyoqCisgKiBHRVRURVIKKyAqIGZvciBzaW1wbGUgb3IgbnVtZXJpYyBraW5kCisgKi8KK2Jvb2wgQkY6OmlzRXF1YWxaZXJvKCkgY29uc3QKK3sKKwlyZXR1cm4oIHRoaXMtPmlzVEVRKCBFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfWkVSTyApIHx8CisJCQkodGhpcy0+aXM8IE51bWJlciA+KCkgJiYgdGhpcy0+dG9fcHRyPCBOdW1iZXIgPigpLT5pc1plcm8oKSkgKTsKK30KKworYm9vbCBCRjo6aXNFcXVhbE9uZSgpIGNvbnN0Cit7CisJcmV0dXJuKCB0aGlzLT5pc1RFUSggRXhwcmVzc2lvbkNvbnN0YW50OjpJTlRFR0VSX09ORSApIHx8CisJCQkodGhpcy0+aXM8IE51bWJlciA+KCkgJiYgdGhpcy0+dG9fcHRyPCBOdW1iZXIgPigpLT5pc09uZSgpKSApOworfQorCisKK2Jvb2wgQkY6OmlzTnVtYmVyKCkgY29uc3QKK3sKKwlyZXR1cm4oIEV4cHJlc3Npb25GYWN0b3J5Ojppc051bWJlcigqdGhpcykgKTsKK30KKworYm9vbCBCRjo6aXNOdW1lcmljKCkgY29uc3QKK3sKKwlyZXR1cm4oIEV4cHJlc3Npb25GYWN0b3J5Ojppc051bWVyaWMoKnRoaXMpICk7Cit9CisKKworYm9vbCBCRjo6aXNFeHByZXNzaW9uKCkgY29uc3QKK3sKKwlyZXR1cm4oIHRoaXMtPmlzPCBBdm1Db2RlID4oKSApOworfQorCisKKworYm9vbCBCRjo6aXNJbnQzMigpIGNvbnN0Cit7CisJcmV0dXJuKCBFeHByZXNzaW9uRmFjdG9yeTo6aXNJbnQzMigqdGhpcykgKTsKK30KKworYXZtX2ludDMyX3QgQkY6OnRvSW50MzIoKSBjb25zdAoreworCXJldHVybiggRXhwcmVzc2lvbkZhY3Rvcnk6OnRvSW50MzIoKnRoaXMpICk7Cit9CisKKworYm9vbCBCRjo6aXNJbnQ2NCgpIGNvbnN0Cit7CisJcmV0dXJuKCBFeHByZXNzaW9uRmFjdG9yeTo6aXNJbnQ2NCgqdGhpcykgKTsKK30KKworYXZtX2ludDY0X3QgQkY6OnRvSW50NjQoKSBjb25zdAoreworCXJldHVybiggRXhwcmVzc2lvbkZhY3Rvcnk6OnRvSW50NjQoKnRoaXMpICk7Cit9CisKKworYm9vbCBCRjo6aXNJbnRlZ2VyKCkgY29uc3QKK3sKKwlyZXR1cm4oIEV4cHJlc3Npb25GYWN0b3J5Ojppc0ludGVnZXIoKnRoaXMpICk7Cit9CisKK2F2bV9pbnRlZ2VyX3QgQkY6OnRvSW50ZWdlcigpIGNvbnN0Cit7CisJcmV0dXJuKCBFeHByZXNzaW9uRmFjdG9yeTo6dG9JbnRlZ2VyKCp0aGlzKSApOworfQorCisKK2Jvb2wgQkY6OmlzUG9zSW50ZWdlcigpIGNvbnN0Cit7CisJcmV0dXJuKCBFeHByZXNzaW9uRmFjdG9yeTo6aXNQb3NJbnRlZ2VyKCp0aGlzKSApOworfQorCisKK2Jvb2wgQkY6OmlzVUludGVnZXIoKSBjb25zdAoreworCXJldHVybiggRXhwcmVzc2lvbkZhY3Rvcnk6OmlzVUludGVnZXIoKnRoaXMpICk7Cit9CisKK2F2bV91aW50ZWdlcl90IEJGOjp0b1VJbnRlZ2VyKCkgY29uc3QKK3sKKwlyZXR1cm4oIEV4cHJlc3Npb25GYWN0b3J5Ojp0b1VJbnRlZ2VyKCp0aGlzKSApOworfQorCitib29sIEJGOjppc1JhdGlvbmFsKCkgY29uc3QKK3sKKwlyZXR1cm4oIEV4cHJlc3Npb25GYWN0b3J5Ojppc1JhdGlvbmFsKCp0aGlzKSApOworfQorCithdm1faW50ZWdlcl90IEJGOjp0b0Rlbm9taW5hdG9yKCkgY29uc3QKK3sKKwlyZXR1cm4oIEV4cHJlc3Npb25GYWN0b3J5Ojp0b0Rlbm9taW5hdG9yKCp0aGlzKSApOworfQorYXZtX2ludGVnZXJfdCBCRjo6dG9OdW1lcmF0b3IoKSBjb25zdAoreworCXJldHVybiggRXhwcmVzc2lvbkZhY3Rvcnk6OnRvTnVtZXJhdG9yKCp0aGlzKSApOworfQorCisKK2Jvb2wgQkY6OmlzRmxvYXQoKSBjb25zdAoreworCXJldHVybiggRXhwcmVzc2lvbkZhY3Rvcnk6OmlzRmxvYXQoKnRoaXMpICk7Cit9CisKK2F2bV9mbG9hdF90IEJGOjp0b0Zsb2F0KCkgY29uc3QKK3sKKwlyZXR1cm4oIEV4cHJlc3Npb25GYWN0b3J5Ojp0b0Zsb2F0KCp0aGlzKSApOworfQorCisKK2Jvb2wgQkY6OmlzUmVhbCgpIGNvbnN0Cit7CisJcmV0dXJuKCBFeHByZXNzaW9uRmFjdG9yeTo6aXNSZWFsKCp0aGlzKSApOworfQorCithdm1fcmVhbF90IEJGOjp0b1JlYWwoKSBjb25zdAoreworCXJldHVybiggRXhwcmVzc2lvbkZhY3Rvcnk6OnRvUmVhbCgqdGhpcykgKTsKK30KKworCitib29sIEJGOjppc0NoYXJhY3RlcigpIGNvbnN0Cit7CisJcmV0dXJuKCBFeHByZXNzaW9uRmFjdG9yeTo6aXNDaGFyYWN0ZXIoKnRoaXMpICk7Cit9CisKK2NoYXIgQkY6OnRvQ2hhcmFjdGVyKCkgY29uc3QKK3sKKwlyZXR1cm4oIEV4cHJlc3Npb25GYWN0b3J5Ojp0b0NoYXJhY3RlcigqdGhpcykgKTsKK30KKworCitib29sIEJGOjppc0J1aWx0aW5TdHJpbmcoKSBjb25zdAoreworCXJldHVybiggRXhwcmVzc2lvbkZhY3Rvcnk6OmlzQnVpbHRpblN0cmluZygqdGhpcykgKTsKK30KKworc3RkOjpzdHJpbmcgQkY6OnRvQnVpbHRpblN0cmluZygpIGNvbnN0Cit7CisJcmV0dXJuKCBFeHByZXNzaW9uRmFjdG9yeTo6dG9CdWlsdGluU3RyaW5nKCp0aGlzKSApOworfQorCisKK2Jvb2wgQkY6OmlzSWRlbnRpZmllcigpIGNvbnN0Cit7CisJcmV0dXJuKCBFeHByZXNzaW9uRmFjdG9yeTo6aXNJZGVudGlmaWVyKCp0aGlzKSApOworfQorCitzdGQ6OnN0cmluZyBCRjo6dG9JZGVudGlmaWVyKCkgY29uc3QKK3sKKwlyZXR1cm4oIEV4cHJlc3Npb25GYWN0b3J5Ojp0b0lkZW50aWZpZXIoKnRoaXMpICk7Cit9CisKKworYm9vbCBCRjo6aXNVZmkoKSBjb25zdAoreworCXJldHVybiggRXhwcmVzc2lvbkZhY3Rvcnk6OmlzVWZpKCp0aGlzKSApOworfQorCitzdGQ6OnN0cmluZyBCRjo6dG9VZmkoKSBjb25zdAoreworCXJldHVybiggRXhwcmVzc2lvbkZhY3Rvcnk6OnRvVWZpKCp0aGlzKSApOworfQorCitzdGQ6OnN0cmluZyBCRjo6dG9VZmlkKCkgY29uc3QKK3sKKwlyZXR1cm4oIEV4cHJlc3Npb25GYWN0b3J5Ojp0b1VmaWQoKnRoaXMpICk7Cit9CisKKworYm9vbCBCRjo6aXNFbnVtU3ltYm9sKCkgY29uc3QKK3sKKwlyZXR1cm4oIEV4cHJlc3Npb25GYWN0b3J5Ojppc0VudW1TeW1ib2woKnRoaXMpICk7Cit9CisKK3N0ZDo6c3RyaW5nIEJGOjpzdHJFbnVtU3ltYm9sKCkgY29uc3QKK3sKKwlyZXR1cm4oIEV4cHJlc3Npb25GYWN0b3J5OjpzdHJFbnVtU3ltYm9sKCp0aGlzKSApOworfQorCisKK2Jvb2wgQkY6OmlzVUZJRCgpIGNvbnN0Cit7CisJcmV0dXJuKCBpc1VmaWQoKSB8fCBpczwgVW5pRm9ybUlkZW50aWZpZXIgPigpICk7Cit9CisKKworYm9vbCBCRjo6aXNCdWlsdGluVmFsdWUoKSBjb25zdAoreworCXJldHVybiggRXhwcmVzc2lvbkZhY3Rvcnk6OmlzQnVpbHRpblZhbHVlKCp0aGlzKSApOworfQorCisKK2Jvb2wgQkY6OmlzQ29uc3RWYWx1ZSgpIGNvbnN0Cit7CisJcmV0dXJuKCBFeHByZXNzaW9uRmFjdG9yeTo6aXNDb25zdFZhbHVlKCp0aGlzKSApOworfQorCisKKy8qKgorICogUkVGRVJFTkNFCisgKiBDQVNUCisgKi8KKworI2RlZmluZSBTVEFUSUNfQ0FTVF9CRl9UT19YQkZfVChCRkNsYXNzTmFtZSwgQ2xhc3NOYW1lLCBtZXRob2ROYW1lKSBcCitCRkNsYXNzTmFtZSAmIEJGOjptZXRob2ROYW1lKCkgICBcCit7ICAgXAorCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggaXM8IENsYXNzTmFtZSA+KCkgKSAgXAorCQkJPDwgIkludmFsaWQgPDwgQkY8IiAjQ2xhc3NOYW1lICI+ID4+IFR5cGUgPCIgIFwKKwkJCTw8IGNsYXNzS2luZE5hbWUoKSA8PCAiPiggIiA8PCBzdHIoKSA8PCAiICkgQ2FzdCAhISEiICBcCisJCQk8PCBTRU5EX0VYSVQ7ICBcCisJcmV0dXJuKCBzdGF0aWNfY2FzdDwgQkZDbGFzc05hbWUgJiA+KCAqdGhpcyApICk7ICBcCit9CisKKyNkZWZpbmUgU1RBVElDX0NBU1RfQkZfVE9fWEJGMihDbGFzc05hbWUsIE5hbWUpICAgXAorCQlTVEFUSUNfQ0FTVF9CRl9UT19YQkZfVChCRiMjTmFtZSwgQ2xhc3NOYW1lLCBiZiMjTmFtZSkKKworI2RlZmluZSBTVEFUSUNfQ0FTVF9CRl9UT19YQkYoQ2xhc3NOYW1lKSAgIFwKKwkJU1RBVElDX0NBU1RfQkZfVE9fWEJGX1QoQkYjI0NsYXNzTmFtZSwgQ2xhc3NOYW1lLCBiZiMjQ2xhc3NOYW1lKQorCisKKyNkZWZpbmUgU1RBVElDX0NDQVNUX0JGX1RPX1hCRl9UKEJGQ2xhc3NOYW1lLCBDbGFzc05hbWUsIG1ldGhvZE5hbWUpIFwKK2NvbnN0IEJGQ2xhc3NOYW1lICYgQkY6Om1ldGhvZE5hbWUoKSBjb25zdCAgIFwKK3sgICBcCisJQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKCBpczwgQ2xhc3NOYW1lID4oKSApIFwKKwkJCTw8ICJJbnZhbGlkIDw8IEJGPCIgI0NsYXNzTmFtZSAiPiA+PiBUeXBlIDwiICBcCisJCQk8PCBjbGFzc0tpbmROYW1lKCkgPDwgIj4oICIgPDwgc3RyKCkgPDwgIiApIENhc3QgISEhIiAgXAorCQkJPDwgU0VORF9FWElUOyAgXAorCXJldHVybiggc3RhdGljX2Nhc3Q8IGNvbnN0IEJGQ2xhc3NOYW1lICYgPiggKnRoaXMgKSApOyAgXAorfQorCisjZGVmaW5lIFNUQVRJQ19DQ0FTVF9CRl9UT19YQkYyKENsYXNzTmFtZSwgTmFtZSkgICBcCisJCVNUQVRJQ19DQ0FTVF9CRl9UT19YQkZfVChCRiMjTmFtZSwgQ2xhc3NOYW1lLCBiZiMjTmFtZSkKKworI2RlZmluZSBTVEFUSUNfQ0NBU1RfQkZfVE9fWEJGKENsYXNzTmFtZSkgICBcCisJCVNUQVRJQ19DQ0FTVF9CRl9UT19YQkZfVChCRiMjQ2xhc3NOYW1lLCBDbGFzc05hbWUsIGJmIyNDbGFzc05hbWUpCisKKworU1RBVElDX0NBU1RfQkZfVE9fWEJGMihBdm1Db2RlLCBDb2RlKQorCitTVEFUSUNfQ0NBU1RfQkZfVE9fWEJGMihBdm1Db2RlLCBDb2RlKQorCisKK1NUQVRJQ19DQ0FTVF9CRl9UT19YQkZfVCggUnVudGltZUlELCBSdW50aW1lSUQsIGJmUklEKQorCisKKworLyoqCisgKiBCVUlMRCBORVcgRVhQUkVTU0lPTgorICovCitCRiAmIEJGOjpvcEV4cHIoT3BlcmF0b3IgKiBhbk9wZXJhdG9yLCBjb25zdCBCRiAmIGFyZykKK3sKKwlyZXR1cm4oICp0aGlzID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlKGFuT3BlcmF0b3IsICp0aGlzLCBhcmcpICk7Cit9CisKKworQkYgJiBCRjo6ZXFFeHByKGNvbnN0IEJGICYgYXJnKQoreworCXJldHVybiggKnRoaXMgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6OmVxRXhwcigqdGhpcywgYXJnKSk7Cit9CisKK0JGICYgQkY6Om5lcUV4cHIoY29uc3QgQkYgJiBhcmcpCit7CisJcmV0dXJuKCAqdGhpcyA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmVxRXhwcigqdGhpcywgYXJnKSApOworfQorCisKK0JGICYgQkY6Omx0RXhwcihjb25zdCBCRiAmIGFyZykKK3sKKwlyZXR1cm4oICp0aGlzID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpsdEV4cHIoKnRoaXMsIGFyZykgKTsKK30KKworQkYgJiBCRjo6bHRlRXhwcihjb25zdCBCRiAmIGFyZykKK3sKKwlyZXR1cm4oICp0aGlzID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpsdGVFeHByKCp0aGlzLCBhcmcpICk7Cit9CisKKworQkYgJiBCRjo6Z3RFeHByKGNvbnN0IEJGICYgYXJnKQoreworCXJldHVybiggKnRoaXMgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Omd0RXhwcigqdGhpcywgYXJnKSApOworfQorCitCRiAmIEJGOjpndGVFeHByKGNvbnN0IEJGICYgYXJnKQoreworCXJldHVybiggKnRoaXMgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Omd0ZUV4cHIoKnRoaXMsIGFyZykgKTsKK30KKworCisKKworQkYgJiBCRjo6YW5kRXhwcihjb25zdCBCRiAmIGFyZykKK3sKKwlyZXR1cm4oICp0aGlzID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjphbmRFeHByKCp0aGlzLCBhcmcpICk7Cit9CisKK0JGICYgQkY6Om9yRXhwcihjb25zdCBCRiAmIGFyZykKK3sKKwlyZXR1cm4oICp0aGlzID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpvckV4cHIoKnRoaXMsIGFyZykgKTsKK30KKworQkYgJiBCRjo6bm90RXhwcigpCit7CisJcmV0dXJuKCAqdGhpcyA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bm90RXhwcigqdGhpcykgKTsKK30KKworCitCRiAmIEJGOjphZGRFeHByKGNvbnN0IEJGICYgYXJnKQoreworCXJldHVybiggKnRoaXMgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6OmFkZEV4cHIoKnRoaXMsIGFyZykgKTsKK30KKworQkYgJiBCRjo6aW5jckV4cHIoYXZtX3VpbnRlZ2VyX3QgdmFsKQoreworCXJldHVybiggKnRoaXMgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6OmFkZEV4cHIoKnRoaXMsIHZhbCkgKTsKK30KKworCitCRiAmIEJGOjptaW51c0V4cHIoY29uc3QgQkYgJiBhcmcpCit7CisJcmV0dXJuKCAqdGhpcyA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bWludXNFeHByKCp0aGlzLCBhcmcpICk7Cit9CisKK0JGICYgQkY6OnVtaW51c0V4cHIoKQoreworCXJldHVybiggKnRoaXMgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6OnVtaW51c0V4cHIoKnRoaXMpICk7Cit9CisKK0JGICYgQkY6OmRlY3JFeHByKGF2bV91aW50ZWdlcl90IHZhbCkKK3sKKwlyZXR1cm4oICp0aGlzID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjphZGRFeHByKCp0aGlzLCAoLSB2YWwpKSApOworfQorCisKK0JGICYgQkY6Om11bHRFeHByKGNvbnN0IEJGICYgYXJnKQoreworCXJldHVybiggKnRoaXMgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om11bHRFeHByKCp0aGlzLCBhcmcpICk7Cit9CisKK0JGICYgQkY6OnBvd0V4cHIoY29uc3QgQkYgJiBhcmcpCit7CisJcmV0dXJuKCAqdGhpcyA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6cG93RXhwcigqdGhpcywgYXJnKSApOworfQorCitCRiAmIEJGOjpkaXZFeHByKGNvbnN0IEJGICYgYXJnKQoreworCXJldHVybiggKnRoaXMgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6OmRpdkV4cHIoKnRoaXMsIGFyZykgKTsKK30KKworQkYgJiBCRjo6aW52RXhwcigpCit7CisJcmV0dXJuKCAqdGhpcyA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6ZGl2RXhwcigKKwkJCUV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3RXhwcigoYXZtX2ludGVnZXJfdCkgMSksICp0aGlzKSApOworfQorCisKKworLyoqCisgKiBDT01QQVJJU09OCisgKi8KK2ludCBCRjo6Y29tcGFyZShjb25zdCBCRiAmIG90aGVyKSBjb25zdAoreworCXJldHVybiggKG1QVFIgPT0gb3RoZXIubVBUUikgPyAwIDoKKwkJCUV4cHJlc3Npb25Db21wYXJlcjo6Y29tcGFyZSgqdGhpcywgb3RoZXIpICk7Cit9CisKK2ludCBCRjo6Y29tcGFyZV9zaGFyZShCRiAmIG90aGVyKQoreworCWlmKCBtUFRSID09IG90aGVyLm1QVFIgKQorCXsKKwkJcmV0dXJuKCAwICk7CisJfQorCWVsc2UKKwl7CisJCWludCBjbXBSZXN1bHQgPSBFeHByZXNzaW9uQ29tcGFyZXI6OmNvbXBhcmUoKnRoaXMsIG90aGVyKTsKKwkJaWYoIGNtcFJlc3VsdCA9PSAwICkKKwkJeworCQkJc2hhcmUoIG90aGVyICk7CisJCX0KKwkJcmV0dXJuKCBjbXBSZXN1bHQgKTsKKwl9Cit9CisKKworYm9vbCBCRjo6aXNFUShjb25zdCBCRiAmIG90aGVyKSBjb25zdAoreworCXJldHVybiBFeHByZXNzaW9uQ29tcGFyZXI6OmlzRVEoKnRoaXMsIG90aGVyKTsKK30KKworCisvLy8qKgorLy8gKiBBU1NJR05NRU5UCisvLyAqIFN5bWJvbAorLy8gKiBUeXBlCisvLyAqLworLy9pbmxpbmUgQkYgJiBCRjo6b3BlcmF0b3I9KGNvbnN0IFN5bWJvbCAmIGFTeW1ib2wpCisvL3sKKy8vCWlmKCBtUFRSICE9IGFTeW1ib2wucmF3U3ltYm9sKCkgKQorLy8JeworLy8JCUFWTV9BU1NJR05fREVCVUdfQkZfUFRSKCBhU3ltYm9sLnJhd19wb2ludGVyKCkgKQorLy8KKy8vCQlyZWxlYXNlKCBhU3ltYm9sLnJhd1N5bWJvbCgpICk7CisvLwl9CisvLwlyZXR1cm4oICp0aGlzICk7CisvL30KKy8vCisvLy8vIFR5cGUKKy8vQkYgJiBCRjo6b3BlcmF0b3I9KGNvbnN0IFR5cGUgJiBhVHlwZSkKKy8veworLy8JaWYoIG1QVFIgIT0gYVR5cGUucmF3VHlwZSgpICkKKy8vCXsKKy8vCQlBVk1fQVNTSUdOX0RFQlVHX0JGX1BUUiggYVR5cGUucmF3X3BvaW50ZXIoKSApCisvLworLy8JCXJlbGVhc2UoIGFUeXBlLnJhd1R5cGUoKSApOworLy8JfQorLy8JcmV0dXJuKCAqdGhpcyApOworLy99CisKKworCisvKioKKyAqIHN0ckhlYWRlcgorICovCit2b2lkIEJGOjpzdHJIZWFkZXIoT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJaWYoIHRoaXMtPmlzPCBPYmplY3RFbGVtZW50ID4oKSApCisJeworCQl0aGlzLT50b19wdHI8IE9iamVjdEVsZW1lbnQgPigpLT5zdHJIZWFkZXIoIG9zICk7CisJfQorCWVsc2UKKwl7CisJCW9zIDw8IHRoaXMtPnN0cigpOworCX0KK30KKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21tb24vQkYuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbW1vbi9CRi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MDJiZGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21tb24vQkYuaApAQCAtMCwwICsxLDk1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDEwIGp1aWwuIDIwMDkKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBCRl9IXworI2RlZmluZSBCRl9IXworCisjaW5jbHVkZSA8YmFzZS9DbGFzc0tpbmRJbmZvLmg+CisjaW5jbHVkZSA8YmFzZS9TbWFydFBvaW50ZXIuaD4KKyNpbmNsdWRlIDxjb21tb24vRWxlbWVudC5oPgorCisjaW5jbHVkZSA8dXRpbC9hdm1fYXNzZXJ0Lmg+CisjaW5jbHVkZSA8dXRpbC9hdm1fc3RyaW5nLmg+CisKKworI2RlZmluZSBBVk1fREVCVUdfQkZfUE9JTlRFUiAgdHJ1ZQorI3VuZGVmIEFWTV9ERUJVR19CRl9QT0lOVEVSCisKKyNpZiBkZWZpbmVkKEFWTV9ERUJVR19CRl9QT0lOVEVSKQorCisJI2RlZmluZSBBVk1fREVDTEFSRV9ERUJVR19CRl9QVFIgICAgICAgICBwdWJsaWM6IHN0ZDo6c3RyaW5nIGRiZ1BUUjsKKworCisJI2RlZmluZSBBVk1fU1RSX0JGX1BUUiggcHRyICkgICAoIChwdHIgIT0gTlVMTCkgPyBwdHItPnN0cigpIDogIkJGPG51bGw+IiApCisKKwkjZGVmaW5lIEFWTV9JTklUX0RFQlVHX0JGX1BUUl9OVUxMICAgICAgICwgZGJnUFRSKCAiQkY8bnVsbD4iICkKKworCSNkZWZpbmUgQVZNX0lOSVRfREVCVUdfQkZfUFRSKCBwdHIgKSAgICAgLCBkYmdQVFIoIEFWTV9TVFJfQkZfUFRSKHB0cikgKQorCisJI2RlZmluZSBBVk1fQ09QWV9ERUJVR19CRl9QVFIoIGJmICkgICAgICAsIGRiZ1BUUiggYmYuZGJnUFRSICkKKworCSNkZWZpbmUgQVZNX0FTU0lHTl9ERUJVR19CRl9QVFIoIHB0ciApICAgZGJnUFRSID0gQVZNX1NUUl9CRl9QVFIocHRyKTsKKworI2Vsc2UKKworCSNkZWZpbmUgQVZNX0lOSVRfREVCVUdfQkZfUFRSX05VTEwKKworCSNkZWZpbmUgQVZNX0RFQ0xBUkVfREVCVUdfQkZfUFRSCisKKwkjZGVmaW5lIEFWTV9JTklUX0RFQlVHX0JGX1BUUiggcHRyICkKKworCSNkZWZpbmUgQVZNX0NPUFlfREVCVUdfQkZfUFRSKCBwdHIgKQorCisJI2RlZmluZSBBVk1fQVNTSUdOX0RFQlVHX0JGX1BUUiggcHRyICkKKworI2VuZGlmCisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIEJGQ29kZTsKKworY2xhc3MgT3BlcmF0b3I7CisKK2NsYXNzIFJ1bnRpbWVJRDsKKworLy9jbGFzcyBTeW1ib2w7CisvL2NsYXNzIFR5cGU7CisKKworCitjbGFzcyBCRiA6CisJCXB1YmxpYyBTbWFydFBvaW50ZXI8IEVsZW1lbnQgLCBEZXN0cm95RWxlbWVudFBvbGljeSA+LAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIEJGICkKK3sKKworCitwcml2YXRlOgorCS8qKgorCSAqIFRZUEVERUYKKwkgKi8KKwl0eXBlZGVmIFNtYXJ0UG9pbnRlcjwgRWxlbWVudCAsIERlc3Ryb3lFbGVtZW50UG9saWN5ID4gIGJhc2VfdGhpc190eXBlOworCisJQVZNX0RFQ0xBUkVfREVCVUdfQkZfUFRSCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlCRigpIHRocm93KCkKKwk6IGJhc2VfdGhpc190eXBlKCkKKwlBVk1fSU5JVF9ERUJVR19CRl9QVFJfTlVMTAorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJZXhwbGljaXQgQkYoRWxlbWVudCAqIGFuRWxlbWVudCkKKwk6IGJhc2VfdGhpc190eXBlKCBhbkVsZW1lbnQgKQorCUFWTV9JTklUX0RFQlVHX0JGX1BUUiggYW5FbGVtZW50ICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJQkYoY29uc3QgQkYgJiBhbkVsZW1lbnQpCisJOiBiYXNlX3RoaXNfdHlwZSggYW5FbGVtZW50ICkKKwlBVk1fQ09QWV9ERUJVR19CRl9QVFIoIGFuRWxlbWVudCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCXN0YXRpYyBhdm1fdWludDY0X3QgSU5TVEFOQ0VfQ09VTlRFUl9BU1A7CisKKwl0ZW1wbGF0ZTwgY2xhc3MgVSA+CisJQkYoY29uc3QgU21hcnRQb2ludGVyPCBVICwgRGVzdHJveUVsZW1lbnRQb2xpY3kgPiAmIG90aGVyKQorCTogYmFzZV90aGlzX3R5cGUoIG90aGVyICkKKwl7CisJCS8vISEgTk9USElORworCQkrK0lOU1RBTkNFX0NPVU5URVJfQVNQOworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkJGKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJdm9pZCBmaW5hbGl6ZSgpOworCisKKwkvKioKKwkqIE5VTUVSSUMgb3IgU0lNUExFIFRZUEUgVEVTVCAmIENBU1QKKwkqLworCXZpcnR1YWwgYm9vbCBpc0Jvb2xlYW4oKSBjb25zdDsKKwl2aXJ0dWFsIGJvb2wgdG9Cb29sZWFuKCkgY29uc3Q7CisKKwkvKioKKwkgKiBDT01QQVJJU09OCisJICogd2l0aCBUUlVFICYgRkFMU0UKKwkgKi8KKwl2aXJ0dWFsIGJvb2wgaXNFcXVhbEZhbHNlKCkgY29uc3Q7CisJdmlydHVhbCBib29sIGlzTm90RXF1YWxGYWxzZSgpIGNvbnN0OworCisJdmlydHVhbCBib29sIGlzRXF1YWxUcnVlKCkgY29uc3Q7CisJdmlydHVhbCBib29sIGlzTm90RXF1YWxUcnVlKCljb25zdDsKKworCisJdmlydHVhbCBib29sIGlzRXF1YWxaZXJvKCkgY29uc3Q7CisJdmlydHVhbCBib29sIGlzRXF1YWxPbmUoKSBjb25zdDsKKworCXZpcnR1YWwgYm9vbCBpc051bWJlcigpIGNvbnN0OworCXZpcnR1YWwgYm9vbCBpc051bWVyaWMoKSBjb25zdDsKKworCXZpcnR1YWwgYm9vbCBpc0V4cHJlc3Npb24oKSBjb25zdDsKKworCisJdmlydHVhbCBib29sIGlzSW50MzIoKSBjb25zdDsKKwl2aXJ0dWFsIGF2bV9pbnQzMl90IHRvSW50MzIoKSBjb25zdDsKKworCXZpcnR1YWwgYm9vbCBpc0ludDY0KCkgY29uc3Q7CisJdmlydHVhbCBhdm1faW50NjRfdCB0b0ludDY0KCkgY29uc3Q7CisKKworCXZpcnR1YWwgYm9vbCBpc0ludGVnZXIoKSBjb25zdDsKKwl2aXJ0dWFsIGF2bV9pbnRlZ2VyX3QgdG9JbnRlZ2VyKCkgY29uc3Q7CisKKwl2aXJ0dWFsIGJvb2wgaXNXZWFrSW50ZWdlcigpIGNvbnN0CisJeworCQlyZXR1cm4oIGlzSW50ZWdlcigpICk7CisJfQorCisJdmlydHVhbCBib29sIGlzUG9zSW50ZWdlcigpIGNvbnN0OworCisJdmlydHVhbCBib29sIGlzVUludGVnZXIoKSBjb25zdDsKKwl2aXJ0dWFsIGF2bV91aW50ZWdlcl90IHRvVUludGVnZXIoKSBjb25zdDsKKworCisJdmlydHVhbCBib29sIGlzUmF0aW9uYWwoKSBjb25zdDsKKwl2aXJ0dWFsIGF2bV9pbnRlZ2VyX3QgdG9EZW5vbWluYXRvcigpIGNvbnN0OworCXZpcnR1YWwgYXZtX2ludGVnZXJfdCB0b051bWVyYXRvcigpIGNvbnN0OworCisJdmlydHVhbCBib29sIGlzV2Vha1JhdGlvbmFsKCkgY29uc3QKKwl7CisJCXJldHVybiggaXNSYXRpb25hbCgpIHx8IGlzV2Vha0ludGVnZXIoKSApOworCX0KKworCisJdmlydHVhbCBib29sIGlzRmxvYXQoKSBjb25zdDsKKwl2aXJ0dWFsIGF2bV9mbG9hdF90IHRvRmxvYXQoKSBjb25zdDsKKworCXZpcnR1YWwgYm9vbCBpc1dlYWtGbG9hdCgpIGNvbnN0CisJeworCQlyZXR1cm4oIGlzRmxvYXQoKSB8fCBpc1dlYWtSYXRpb25hbCgpICk7CisJfQorCisKKwl2aXJ0dWFsIGJvb2wgaXNSZWFsKCkgY29uc3Q7CisJdmlydHVhbCBhdm1fcmVhbF90IHRvUmVhbCgpIGNvbnN0OworCisJaW5saW5lIHZpcnR1YWwgYm9vbCBpc1dlYWtSZWFsKCkgY29uc3QKKwl7CisJCXJldHVybiggaXNSZWFsKCkgfHwgaXNXZWFrRmxvYXQoKSApOworCX0KKworCisKKwl2aXJ0dWFsIGJvb2wgaXNDaGFyYWN0ZXIoKSBjb25zdDsKKwl2aXJ0dWFsIGNoYXIgdG9DaGFyYWN0ZXIoKSBjb25zdDsKKworCXZpcnR1YWwgYm9vbCBpc0J1aWx0aW5TdHJpbmcoKSBjb25zdDsKKwl2aXJ0dWFsIHN0ZDo6c3RyaW5nIHRvQnVpbHRpblN0cmluZygpIGNvbnN0OworCisKKwl2aXJ0dWFsIGJvb2wgaXNJZGVudGlmaWVyKCkgY29uc3Q7CisJdmlydHVhbCBzdGQ6OnN0cmluZyB0b0lkZW50aWZpZXIoKSBjb25zdDsKKworCXZpcnR1YWwgYm9vbCBpc1VmaSgpIGNvbnN0OworCXZpcnR1YWwgc3RkOjpzdHJpbmcgdG9VZmkoKSBjb25zdDsKKworCXZpcnR1YWwgYm9vbCBpc1VmaWQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBpc1VmaSgpIHx8IGlzSWRlbnRpZmllcigpICk7CisJfQorCXZpcnR1YWwgc3RkOjpzdHJpbmcgdG9VZmlkKCkgY29uc3Q7CisKKwl2aXJ0dWFsIGJvb2wgaXNFbnVtU3ltYm9sKCkgY29uc3Q7CisJdmlydHVhbCBzdGQ6OnN0cmluZyBzdHJFbnVtU3ltYm9sKCkgY29uc3Q7CisKKwl2aXJ0dWFsIGJvb2wgaXNVRklEKCkgY29uc3Q7CisKKwlib29sIGlzQnVpbHRpblZhbHVlKCkgY29uc3Q7CisKKwl2aXJ0dWFsIGJvb2wgaXNDb25zdFZhbHVlKCkgY29uc3Q7CisKKworCisJLyoqCisJICogUkVGRVJFTkNFCisJICogQ0FTVAorCSAqLworCUJGQ29kZSAmIGJmQ29kZSgpIDsKKworCWNvbnN0IEJGQ29kZSAmIGJmQ29kZSgpIGNvbnN0OworCisJY29uc3QgUnVudGltZUlEICYgYmZSSUQoKSBjb25zdDsKKworCisKKwkvKioKKwkgKiBNRU1PUlkgTUFOQUdFTUVOVAorCSAqLworCisJdm9pZCBpbmNyUmVmQ291bnQoKSBjb25zdAorCXsKKwkJaWYoIG1QVFIgIT0gTlVMTCApCisJCXsKKwkJCW1QVFItPmluY3JSZWZDb3VudCgpOworCQl9CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBDbGFzc0tpbmRJbmZvCisJICovCisJaW5saW5lIGNsYXNzX2tpbmRfdCBjbGFzc0tpbmQoKSBjb25zdAorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggbVBUUiApCisJCQkJPDwgInJhd19wb2ludGVyIGluIEJGOjpjbGFzc0tpbmQoKSAhISEiCisJCQkJPDwgU0VORF9FWElUOworCisJCXJldHVybiggbVBUUi0+Y2xhc3NLaW5kKCkgKTsKKwl9CisKKwlpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcgJiBjbGFzc0tpbmROYW1lKCkgY29uc3QKKwl7CisJCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9QT0lOVEVSX0VYSVQoIG1QVFIgKQorCQkJCTw8ICJyYXdfcG9pbnRlciBpbiBCRjo6Y2xhc3NLaW5kTmFtZSgpICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJcmV0dXJuKCBtUFRSLT5jbGFzc0tpbmROYW1lKCkgKTsKKwl9CisKKwlpbmxpbmUgc3RkOjpzdHJpbmcgY2xhc3NLaW5kSW5mbygpIGNvbnN0CisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBtUFRSICkKKwkJCQk8PCAicmF3X3BvaW50ZXIgaW4gQkY6OmNsYXNzS2luZEluZm8oKSAhISEiCisJCQkJPDwgU0VORF9FWElUOworCisJCXJldHVybiggbVBUUi0+Y2xhc3NLaW5kSW5mbygpICk7CisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gVFlQRSBDSEVDS0VSCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJLy8gQ2hlY2sgaWYgQkYgaXMgYSBoYW5kbGUgdG8gYSBULCBpbmNsdWRpbmcgYmFzZSBjbGFzc2VzLgorCXRlbXBsYXRlPGNsYXNzIFQgPgorCWlubGluZSBib29sIGlzKCkgY29uc3QKKwl7CisvLwkJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggbVBUUiApCisvLwkJCQk8PCAicmF3X3BvaW50ZXIgaW4gQkY6OmlzPCBUID4oKSAhISEiCisvLwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJcmV0dXJuKCAobVBUUiAhPSBOVUxMKSAmJiBtUFRSLT5pczwgVCA+KCkgKTsKKwl9CisKKwl0ZW1wbGF0ZTxjbGFzcyBUID4KKwlpbmxpbmUgYm9vbCBpc25vdCgpIGNvbnN0CisJeworCQlyZXR1cm4oKCBtUFRSID09IE5VTEwpIHx8IG1QVFItPmlzbm90PCBUID4oKSApOworCX0KKworCS8vIENoZWNrIGlmIEJGIGlzIGEgaGFuZGxlIHRvIGEgVCwgbm90IGluY2x1ZGluZyBiYXNlIGNsYXNzZXMuCisJdGVtcGxhdGU8IGNsYXNzIFQgPgorCWlubGluZSBib29sIGlzX3dlYWtseSgpIGNvbnN0CisJeworCQlyZXR1cm4oIChtUFRSID09IE5VTEwpIHx8IG1QVFItPmlzPCBUID4oKSApOworCX0KKworCS8vIENoZWNrIGlmIEJGIGlzIGEgaGFuZGxlIHRvIGEgVCwgbm90IGluY2x1ZGluZyBiYXNlIGNsYXNzZXMuCisJdGVtcGxhdGU8IGNsYXNzIFQgPgorCWlubGluZSBib29sIGlzX2V4YWN0bHkoKSBjb25zdAorCXsKKy8vCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBtUFRSICkKKy8vCQkJCTw8ICJyYXdfcG9pbnRlciBpbiBCRjo6aXNfZXhhY3RseTwgVCA+KCkgISEhIgorLy8JCQkJPDwgU0VORF9FWElUOworCisJCXJldHVybiggKG1QVFIgIT0gTlVMTCkgJiYgbVBUUi0+aXNfZXhhY3RseTwgVCA+KCkgKTsKKwl9CisKKwl0ZW1wbGF0ZTwgY2xhc3MgVCA+CisJaW5saW5lIGJvb2wgaXNub3RfZXhhY3RseSgpIGNvbnN0CisJeworCQlyZXR1cm4oIChtUFRSID09IE5VTEwpIHx8IG1QVFItPmlzbm90X2V4YWN0bHk8IFQgPigpICk7CisJfQorCisJLy8gQ2hlY2sgaWYgQkYgaXMgYSBoYW5kbGUgdG8gYSBULCBub3QgaW5jbHVkaW5nIHNwZWNpZmljIGNsYXNzZXMuCisJdGVtcGxhdGU8IGNsYXNzIFQgPgorCWlubGluZSBib29sIGlzX3N0cmljdGx5KCkgY29uc3QKKwl7CisvLwkJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggbVBUUiApCisvLwkJCQk8PCAicmF3X3BvaW50ZXIgaW4gQkY6OmlzX3N0cmljdGx5PCBUID4oKSAhISEiCisvLwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJcmV0dXJuKCAobVBUUiAhPSBOVUxMKSAmJiBtUFRSLT5pc19zdHJpY3RseTwgVCA+KCkgKTsKKwl9CisKKwl0ZW1wbGF0ZTwgY2xhc3MgVCA+CisJaW5saW5lIGJvb2wgaXNub3Rfc3RyaWN0bHkoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobVBUUiA9PSBOVUxMKSB8fCBtUFRSLT5pc25vdF9zdHJpY3RseTwgVCA+KCkgKTsKKwl9CisKKworCS8vIGNhc3QgQkYgYXMgc3BlY2lmaWVkIHBvaW50ZXIKKwl0ZW1wbGF0ZTwgY2xhc3MgVCA+CisJaW5saW5lIFQgKiBhc19wdHIoKSBjb25zdAorCXsKKwkJLy8gcHJldmlvdXM6PiBBVk1fT1NfQVNTRVJUX1dBUk5JTkdfQUxFUlQKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggbVBUUiApCisJCQkJPDwgInJhd19wb2ludGVyIGluIEJGOjphc19wdHI8IFQgPigpICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJcmV0dXJuKCAobVBUUiAhPSBOVUxMKSA/IG1QVFItPmFzPCBUID4oKSA6IE5VTEwgKTsKKwl9CisKKwl0ZW1wbGF0ZTwgY2xhc3MgVCA+CisJaW5saW5lIFQgKiB0b19wdHIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUFRSLT50bzwgVCA+KCkgKTsKKwl9CisKKworCS8vIGNhc3QgQkYgYXMgc3BlY2lmaWVkIHJlZmVyZW5jZQorCXRlbXBsYXRlPCBjbGFzcyBUID4KKwlpbmxpbmUgVCAmIGFzX3JlZigpCisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBtUFRSICkKKwkJCQk8PCAicmF3X3BvaW50ZXIgaW4gQkY6OmFzX3JlZjwgVCA+KCkgISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQlyZXR1cm4oICooIG1QVFItPmFzPCBUID4oKSApICk7CisJfQorCisJdGVtcGxhdGU8IGNsYXNzIFQgPgorCWlubGluZSBjb25zdCBUICYgYXNfcmVmKCkgY29uc3QKKwl7CisJCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9QT0lOVEVSX0VYSVQoIG1QVFIgKQorCQkJCTw8ICJyYXdfcG9pbnRlciBpbiBCRjo6YXM8IFQgPigpICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJcmV0dXJuKCAqKCBtUFRSLT5hczwgVCA+KCkgKSApOworCX0KKworCXRlbXBsYXRlPCBjbGFzcyBUID4KKwlpbmxpbmUgY29uc3QgVCAmIHRvX3JlZigpIGNvbnN0CisJeworCQlyZXR1cm4oICooIG1QVFItPmFzPCBUID4oKSApICk7CisJfQorCisKKwkvLyBjYXN0IEJGIGFzIGRlcml2ZWQgQkYKKy8vCXRlbXBsYXRlPCBjbGFzcyBUID4KKy8vCWlubGluZSBUICYgYXNfYmYoKQorLy8JeworLy8JCXJldHVybiggc3RhdGljX2Nhc3Q8IFQgJiA+KCAqdGhpcyApICk7CisvLwl9CisKKwl0ZW1wbGF0ZTwgY2xhc3MgVCA+CisJaW5saW5lIGNvbnN0IFQgJiBhc19iZigpIGNvbnN0CisJeworCQlyZXR1cm4oIHN0YXRpY19jYXN0PCBjb25zdCBUICYgPiggKnRoaXMgKSApOworCX0KKworCisKKwkvKioKKwkgKiBDQVNUCisJICovCisvLwlpbmxpbmUgb3BlcmF0b3IgRWxlbWVudCAqICgpIGNvbnN0CisvLwl7CisvLwkJcmV0dXJuKCBtUFRSICk7CisvLwl9CisKKwkvLyBEZXNhY3RpdmUgY2FsbCBvZiA8PCBkZWxldGUgPj4gdXNpbmcgY29tcGlsZXIgYW1iaWd1b3VzIG1lY2FuaXNtCisvLwlpbmxpbmUgb3BlcmF0b3Igdm9pZCAqICgpIGNvbnN0CisvLwl7CisvLwkJcmV0dXJuKCBtUFRSICk7CisvLwl9CisKKworLy8JdGVtcGxhdGU8IGNsYXNzIFQgPgorLy8JaW5saW5lIG9wZXJhdG9yIFQgKiAoKQorLy8JeworLy8JCXJldHVybiggc3RhdGljX2Nhc3Q8IFQgKiA+KCBtUFRSICkgKTsKKy8vCX0KKy8vCisvLwkvKioKKy8vCSAqIE9QRVJBVE9SUworLy8JICovCisvLwl0ZW1wbGF0ZTwgY2xhc3MgVCA+CisvLwlpbmxpbmUgVCAqIG9wZXJhdG9yLT4gKCkKKy8vCXsKKy8vCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBtUFRSICkKKy8vCQkJCTw8ICJyYXdfcG9pbnRlciBpbiBCRjo6b3BlcmF0b3ItPjwgVCA+KCkgISEhIgorLy8JCQkJPDwgU0VORF9FWElUOworLy8KKy8vCQlyZXR1cm4oIHN0YXRpY19jYXN0PCBUICogPiggbVBUUiApICk7CisvLwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIGZvciBjb250YWluZXIgb2YgQkYKKwkgKi8KKwkvLyBHZW5lcmFsbHkgd2l0aCByYW5nZSBjaGVjaworCWlubGluZSBjb25zdCBCRiAmIGF0KGF2bV9zaXplX3Qgb2Zmc2V0KSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUFRSLT5hdChvZmZzZXQpICk7CisJfQorCisJaW5saW5lIEJGICYgYXQoYXZtX3NpemVfdCBvZmZzZXQpCisJeworCQlyZXR1cm4oIG1QVFItPmF0KG9mZnNldCkgKTsKKwl9CisKKwkvLyBtb3ZlIHRvIGNvbnRhaW5lZCBlbGVtZW50IGF0IHBvc2l0aW9uIDwgb2Zmc2V0ID4KKwlpbmxpbmUgdm9pZCBtb3ZlQXQoYXZtX3NpemVfdCBvZmZzZXQpCisJeworCQltUFRSLT5kZWNyUmVmQ291bnQoKTsKKworCQltUFRSID0gbVBUUi0+YXQoIG9mZnNldCApLm1QVFI7CisKKwkJbVBUUi0+aW5jclJlZkNvdW50KCk7CisJfQorCisKKwkvLyBHZW5lcmFsbHkgd2l0aG91dCByYW5nZSBjaGVjaworCWlubGluZSBCRiAmIG9wZXJhdG9yW10oYXZtX3NpemVfdCBvZmZzZXQpCisJeworCQlyZXR1cm4oIG1QVFItPm9wZXJhdG9yW10ob2Zmc2V0KSApOworCX0KKworCS8vIEdlbmVyYWxseSB3aXRob3V0IHJhbmdlIGNoZWNrCisJaW5saW5lIGNvbnN0IEJGICYgb3BlcmF0b3JbXShhdm1fc2l6ZV90IG9mZnNldCkgY29uc3QKKwl7CisJCXJldHVybiggbVBUUi0+b3BlcmF0b3JbXShvZmZzZXQpICk7CisJfQorCisKKwlpbmxpbmUgQkYgJiBnZXRXcml0YWJsZSgpCisJeworCQliYXNlX3RoaXNfdHlwZTo6bWFrZVdyaXRhYmxlKCk7CisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwlpbmxpbmUgQkYgJiBnZXRXcml0YWJsZShhdm1fc2l6ZV90IG9mZnNldCkKKwl7CisJCXJldHVybiggbVBUUi0+Z2V0V3JpdGFibGUob2Zmc2V0KSApOworCX0KKworCWlubGluZSB2b2lkIG1ha2VXcml0YWJsZSgpCisJeworCQliYXNlX3RoaXNfdHlwZTo6bWFrZVdyaXRhYmxlKCk7CisJfQorCisJaW5saW5lIHZvaWQgbWFrZVdyaXRhYmxlKGF2bV9zaXplX3Qgb2Zmc2V0KQorCXsKKwkJbVBUUi0+bWFrZVdyaXRhYmxlKCBvZmZzZXQgKTsKKwl9CisKKwkvLyBtb3ZlIHRvIHdyaXRhYmxlIGNvbnRhaW5lZCBlbGVtZW50IGF0IHBvc2l0aW9uIDwgb2Zmc2V0ID4KKwlpbmxpbmUgdm9pZCBtb3ZlQXRXcml0YWJsZShhdm1fc2l6ZV90IG9mZnNldCkKKwl7CisJCW1QVFItPmRlY3JSZWZDb3VudCgpOworCisJCW1QVFIgPSBtUFRSLT5nZXRXcml0YWJsZSggb2Zmc2V0ICkubVBUUjsKKworCQltUFRSLT5pbmNyUmVmQ291bnQoKTsKKwl9CisKKworCWlubGluZSB2b2lkIHNldChjb25zdCBCRiAmIGJmKQorCXsKKwkJYmFzZV90aGlzX3R5cGU6OnJlbGVhc2VfYWNxdWlyZSggYmYubVBUUiApOworCX0KKworCWlubGluZSB2b2lkIHNldChhdm1fc2l6ZV90IG9mZnNldCwgY29uc3QgQkYgJiBiZikKKwl7CisJCW1QVFItPnNldChvZmZzZXQsIGJmKTsKKwl9CisKKy8vCWlubGluZSB2b2lkIG13X3NldChhdm1fc2l6ZV90IG9mZnNldCwgY29uc3QgQkYgJiBiZikKKy8vCXsKKy8vCQliYXNlX3RoaXNfdHlwZTo6bWFrZVdyaXRhYmxlKCk7CisvLwkJbVBUUi0+c2V0KG9mZnNldCwgYmYpOworLy8JfQorCisKKwlpbmxpbmUgYXZtX3NpemVfdCBzaXplKCkgY29uc3QKKwl7CisJCXJldHVybiggbVBUUi0+c2l6ZSgpICk7CisJfQorCisKKwkvKioKKwkgKiBBU1NJR05NRU5UCisJICovCisvLwl0ZW1wbGF0ZTwgY2xhc3MgVSA+CisvLwlpbmxpbmUgQkYgJiBvcGVyYXRvcj0oCisvLwkJCWNvbnN0IFNtYXJ0UG9pbnRlcjwgVSAsIERlc3Ryb3lFbGVtZW50UG9saWN5ID4gJiBvdGhlcikKKy8vCXsKKy8vCQlpZiggbVBUUiAhPSBvdGhlci5yYXdfcG9pbnRlcigpICkKKy8vCQl7CisvLwkJCUFWTV9BU1NJR05fREVCVUdfQkZfUFRSKCBvdGhlci5yYXdfcG9pbnRlcigpICkKKy8vCisvLwkJCXJlbGVhc2VfYWNxdWlyZSggb3RoZXIucmF3X3BvaW50ZXIoKSApOworLy8JCX0KKy8vCQlyZXR1cm4oICp0aGlzICk7CisvLwl9CisvLworLy8JLy8gU3ltYm9sCisvLwlCRiAmIG9wZXJhdG9yPShjb25zdCBTeW1ib2wgJiBhU3ltYm9sKTsKKy8vCisvLwkvLyBUeXBlCisvLwlCRiAmIG9wZXJhdG9yPShjb25zdCBUeXBlICYgYVR5cGUpOworCisJaW5saW5lIEJGICYgb3BlcmF0b3I9KHBvaW50ZXIgYVB0cikKKwl7CisJCWlmKCBtUFRSICE9IGFQdHIgKQorCQl7CisJCQlBVk1fQVNTSUdOX0RFQlVHX0JGX1BUUiggYVB0ciApCisKKwkJCXJlbGVhc2UoIGFQdHIgKTsKKwkJfQorCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisKKwlpbmxpbmUgdm9pZCByZW5ldyhwb2ludGVyIGFQdHIpCisJeworCQlpZiggbVBUUiAhPSBhUHRyICkKKwkJeworCQkJcmVsZWFzZSggYVB0ciApOworCQl9CisJfQorCisJaW5saW5lIHZvaWQgbmV3aW5jcihwb2ludGVyIGFQdHIpCisJeworCQlpZiggbVBUUiAhPSBhUHRyICkKKwkJeworCQkJcmVsZWFzZV9hY3F1aXJlKCBhUHRyICk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDT01QQVJJU09OCisJICogT1BFUkFUT1IKKwkgKi8KKworCWlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgQkYgJiBvdGhlcikgY29uc3QKKwl7CisJCXJldHVybiggKG1QVFIgPT0gb3RoZXIubVBUUikgfHwgaXNFUShvdGhlcikgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEVsZW1lbnQgJiBhUHRyKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobVBUUiA9PSAmYVB0cikgfHwgbVBUUi0+aXNFUShhUHRyKSApOworCX0KKworCWlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgRWxlbWVudCAqIGFQdHIpIGNvbnN0CisJeworCQlyZXR1cm4oIChtUFRSID09IGFQdHIpIHx8CisJCQkJKChhUHRyICE9IE5VTEwpICYmIChtUFRSICE9IE5VTEwpICYmIG1QVFItPmlzRVEoKmFQdHIpKSApOworCX0KKworCisJaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBCRiAmIG90aGVyKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobVBUUiAhPSBvdGhlci5tUFRSKSB8fCBpc05FUShvdGhlcikgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEVsZW1lbnQgJiBhUHRyKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobVBUUiAhPSAmYVB0cikgJiYgbVBUUi0+aXNORVEoYVB0cikgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEVsZW1lbnQgKiBhUHRyKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobVBUUiAhPSBhUHRyKSAmJgorCQkJCSgobVBUUiA9PSBOVUxMKSB8fCAoYVB0ciA9PSBOVUxMKSB8fCBtUFRSLT5pc05FUSgqYVB0cikpICk7CisJfQorCisKKwkvKioKKwkgKiBQT0lOVEVSIFRSSVZJQUxMWSBFUVVBTCBDT01QQVJJU09OCisJICovCisJaW5saW5lIGJvb2wgaXNURVEoY29uc3QgRWxlbWVudCAqIGJmKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUFRSID09IGJmICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNURVEoY29uc3QgQkYgJiBvdGhlcikgY29uc3QKKwl7CisJCXJldHVybiggbVBUUiA9PSBvdGhlci5tUFRSICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBpc05URVEoY29uc3QgRWxlbWVudCAqIGJmKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUFRSICE9IGJmICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNOVEVRKGNvbnN0IEJGICYgb3RoZXIpIGNvbnN0CisJeworCQlyZXR1cm4oIG1QVFIgIT0gb3RoZXIubVBUUiApOworCX0KKworCisJLyoqCisJICogQ09NUEFSSVNPTgorCSAqLworCWludCBjb21wYXJlKGNvbnN0IEJGICYgb3RoZXIpIGNvbnN0OworCisJaW50IGNvbXBhcmVfc2hhcmUoQkYgJiBvdGhlcik7CisKKworCWJvb2wgaXNFUShjb25zdCBCRiAmIG90aGVyKSBjb25zdDsKKworCWlubGluZSBib29sIGlzTkVRKGNvbnN0IEJGICYgb3RoZXIpIGNvbnN0CisJeworCQlyZXR1cm4oIG5vdCBpc0VRKG90aGVyKSApOworCX0KKworCisJYm9vbCBzdHJFUShjb25zdCBCRiAmIG90aGVyKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobVBUUiA9PSBvdGhlci5tUFRSKQorCQkJCXx8ICgobVBUUiAhPSBOVUxMKSAmJiAob3RoZXIubVBUUiAhPSBOVUxMKQorCQkJCQkmJiAobVBUUi0+c3RyKCkgPT0gb3RoZXIubVBUUi0+c3RyKCkpKSApOworCX0KKworCWJvb2wgc3RyTkVRKGNvbnN0IEJGICYgb3RoZXIpIGNvbnN0CisJeworCQlyZXR1cm4oIChtUFRSICE9IG90aGVyLm1QVFIpCisJCQkJJiYgKChtUFRSID09IE5VTEwpIHx8IChvdGhlci5tUFRSID09IE5VTEwpCisJCQkJCXx8IChtUFRSLT5zdHIoKSAhPSBvdGhlci5tUFRSLT5zdHIoKSkpICk7CisJfQorCisKKworCS8qKgorCSAqIEJVSUxEIE5FVyBFWFBSRVNTSU9OCisJICovCisJQkYgJiBvcEV4cHIoT3BlcmF0b3IgKiBhbk9wZXJhdG9yLCBjb25zdCBCRiAmIGFyZyk7CisKKwlCRiAmIGVxRXhwcihjb25zdCBCRiAmIGFyZyk7CisJQkYgJiBuZXFFeHByKGNvbnN0IEJGICYgYXJnKTsKKworCUJGICYgbHRFeHByKGNvbnN0IEJGICYgYXJnKTsKKwlCRiAmIGx0ZUV4cHIoY29uc3QgQkYgJiBhcmcpOworCisJQkYgJiBndEV4cHIoY29uc3QgQkYgJiBhcmcpOworCUJGICYgZ3RlRXhwcihjb25zdCBCRiAmIGFyZyk7CisKKworCUJGICYgYW5kRXhwcihjb25zdCBCRiAmIGFyZyk7CisJQkYgJiBvckV4cHIoY29uc3QgQkYgJiBhcmcpOworCUJGICYgbm90RXhwcigpOworCisJQkYgJiBhZGRFeHByKGNvbnN0IEJGICYgYXJnKTsKKwlCRiAmIGluY3JFeHByKGF2bV91aW50ZWdlcl90IHZhbCA9IDEpOworCisJQkYgJiBtaW51c0V4cHIoY29uc3QgQkYgJiBhcmcpOworCUJGICYgdW1pbnVzRXhwcigpOworCUJGICYgZGVjckV4cHIoYXZtX3VpbnRlZ2VyX3QgdmFsID0gMSk7CisKKwlCRiAmIG11bHRFeHByKGNvbnN0IEJGICYgYXJnKTsKKwlCRiAmIHBvd0V4cHIoY29uc3QgQkYgJiBhcmcpOworCUJGICYgZGl2RXhwcihjb25zdCBCRiAmIGFyZyk7CisJQkYgJiBpbnZFeHByKCk7CisKKworCisJLyoqCisJICogREVGQVVMVCBOVUxMCisJICovCisJc3RhdGljIEJGIFJFRl9OVUxMOworCisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJdmlydHVhbCB2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJaWYoIG1QVFIgIT0gTlVMTCApCisJCXsKKwkJCW1QVFItPnRvU3RyZWFtKCBvcyApOworCQl9CisJCWVsc2UKKwkJeworCQkJb3MgPDwgVEFCIDw8ICJCRjxudWxsPiIgPDwgRU9MX0ZMVVNIOworCQl9CisJfQorCisJdmlydHVhbCB2b2lkIHRvU3RyZWFtKFBhaXJPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCWlmKCBtUFRSICE9IE5VTEwgKQorCQl7CisJCQltUFRSLT50b1N0cmVhbSggb3MuT1MxICk7CisJCQltUFRSLT50b1N0cmVhbSggb3MuT1MyICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlvcyA8PCBUQUIgPDwgIkJGPG51bGw+IiA8PCBFT0xfRkxVU0g7CisJCX0KKwl9CisKKwl2aXJ0dWFsIHZvaWQgdG9TdHJlYW0oVHJpcGxlT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQlpZiggbVBUUiAhPSBOVUxMICkKKwkJeworCQkJbVBUUi0+dG9TdHJlYW0oIG9zLk9TMSApOworCQkJbVBUUi0+dG9TdHJlYW0oIG9zLk9TMiApOworCQkJbVBUUi0+dG9TdHJlYW0oIG9zLk9TMyApOworCQl9CisJCWVsc2UKKwkJeworCQkJb3MgPDwgVEFCIDw8ICJCRjxudWxsPiIgPDwgRU9MX0ZMVVNIOworCQl9CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBzdGQ6OnN0cmluZyB0b1N0cmluZygKKwkJCWNvbnN0IEF2bUluZGVudCAmIGluZGVudCA9IEFWTV9UQUJfSU5ERU5UKSBjb25zdAorCXsKKwkJU3RyaW5nT3V0U3RyZWFtIG9zcyhpbmRlbnQpOworCisJCXRvU3RyZWFtKCBvc3MgKTsKKworCQlyZXR1cm4oIG9zcy5zdHIoKSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHdyYXBTdHJpbmcoCisJCQljb25zdCBXcmFwRGF0YSAmIHdyYXBEYXRhID0gREVGQVVMVF9XUkFQX0RBVEEsCisJCQljb25zdCBBdm1JbmRlbnQgJiBpbmRlbnQgPSBBVk1fVEFCX0lOREVOVCkgY29uc3QKKwl7CisJCVN0cmluZ091dFN0cmVhbSB3b3NzKHdyYXBEYXRhLCBpbmRlbnQpOworCisJCXRvU3RyZWFtKCB3b3NzICk7CisKKwkJcmV0dXJuKCB3b3NzLnN0cigpICk7CisJfQorCisKKwkvKioKKwkgKiBzdHJIZWFkZXIKKwkgKi8KKwl2aXJ0dWFsIHN0ZDo6c3RyaW5nIHN0ckhlYWRlcigpIGNvbnN0CisJeworCQlTdHJpbmdPdXRTdHJlYW0gb3NzOworCisJCXN0ckhlYWRlciggb3NzICk7CisKKwkJcmV0dXJuKCBvc3Muc3RyKCkgKTsKKwl9CisKKwl2aXJ0dWFsIHZvaWQgc3RySGVhZGVyKE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworCXZpcnR1YWwgdm9pZCBzdHJIZWFkZXIoUGFpck91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJc3RySGVhZGVyKCBvcy5PUzEgKTsKKwkJc3RySGVhZGVyKCBvcy5PUzIgKTsKKwl9CisKKwl2aXJ0dWFsIHZvaWQgc3RySGVhZGVyKFRyaXBsZU91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJdG9TdHJlYW0oIG9zLk9TMSApOworCQl0b1N0cmVhbSggb3MuT1MyICk7CisJCXRvU3RyZWFtKCBvcy5PUzMgKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHN0cigpIGNvbnN0CisJeworCQlyZXR1cm4oICggbVBUUiAhPSBOVUxMICkgPyBtUFRSLT5zdHIoKSA6ICgiQkY8bnVsbD4iKSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHdyYXBTdHIoCisJCQljb25zdCBXcmFwRGF0YSAmIHdyYXBEYXRhID0gREVGQVVMVF9XUkFQX0RBVEEpIGNvbnN0CisJeworCQlTdHJpbmdPdXRTdHJlYW0gd29zcyhERUZBVUxUX1dSQVBfREFUQSwgQVZNX1NUUl9JTkRFTlQpOworCisJCXRvU3RyZWFtKCB3b3NzIDw8IElHTk9SRV9GSVJTVF9UQUIgKTsKKworCQlyZXR1cm4oIHdvc3Muc3RyKCkgKTsKKwl9CisKKworCS8vIExFRlQgVFJJTSB0aGUgcmVzdWx0CisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgX3N0cigpIGNvbnN0CisJeworCQlpZiggbVBUUiAhPSBOVUxMICkKKwkJeworCQkJc3RkOjpzdHJpbmcgc3RyVG1wID0gbVBUUi0+c3RyKCk7CisKKwkJCXJldHVybiggU3RyaW5nVG9vbHM6Omx0cmltKHN0clRtcCkgKTsKKworCQl9CisKKwkJcmV0dXJuKCAiQkY8bnVsbD4iICk7CisJfQorCisJLy8gUklHVEggVFJJTSB0aGUgcmVzdWx0CisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgc3RyXygpIGNvbnN0CisJeworCQlpZiggbVBUUiAhPSBOVUxMICkKKwkJeworCQkJc3RkOjpzdHJpbmcgc3RyVG1wID0gbVBUUi0+c3RyKCk7CisKKwkJCXJldHVybiggU3RyaW5nVG9vbHM6OnJ0cmltKHN0clRtcCkgKTsKKworCQl9CisKKwkJcmV0dXJuKCAiQkY8bnVsbD4iICk7CisJfQorCisJLy8gTEVGVCAmIFJJR1RIIFRSSU0gdGhlIHJlc3VsdAorCWlubGluZSB2aXJ0dWFsIHN0ZDo6c3RyaW5nIF9zdHJfKCkgY29uc3QKKwl7CisJCWlmKCBtUFRSICE9IE5VTEwgKQorCQl7CisJCQlzdGQ6OnN0cmluZyBzdHJUbXAgPSBtUFRSLT5zdHIoKTsKKworCQkJcmV0dXJuKCBTdHJpbmdUb29sczo6dHJpbShzdHJUbXApICk7CisKKwkJfQorCisJCXJldHVybiggIkJGPG51bGw+IiApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgc3RyTnVtKAorCQkJdWludDhfdCBwcmVjaXNpb24gPSBBVk1fTVVNRVJJQ19QUkVDSVNJT04pIGNvbnN0CisJeworCQlyZXR1cm4oICggbVBUUiAhPSBOVUxMICkgPyBtUFRSLT5zdHJOdW0ocHJlY2lzaW9uKSA6ICJCRjxudWxsPiIgKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIHZvaWQgQVZNX0RFQlVHX1JFRl9DT1VOVEVSKE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJaWYoIG1QVFIgIT0gTlVMTCApCisJCXsKKwkJCW1QVFItPkFWTV9ERUJVR19SRUZfQ09VTlRFUihvcyk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlvcyA8PCAiQkY8bnVsbCwgcmVmOjA+IiA8PCBzdGQ6OmZsdXNoOworCQl9CisJfQorCisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgQVZNX0RFQlVHX1JFRl9DT1VOVEVSKCkgY29uc3QKKwl7CisJCXJldHVybiggKCBtUFRSICE9IE5VTEwgKSA/CisJCQkJbVBUUi0+QVZNX0RFQlVHX1JFRl9DT1VOVEVSKCkgOiAiQkY8bnVsbCwgcmVmOjA+IiApOworCX0KKworCitwcml2YXRlOgorCisJLyoqIFNoYXJlIGVxdWFsIG9iamVjdHMgYmV0d2VlbiBleHByZXNzaW9ucy4KKwkgKi8KKwlpbmxpbmUgdm9pZCBzaGFyZShCRiAmIG90aGVyKQorCXsKKwkJaWYoIGdldFJlZkNvdW50KCkgPD0gb3RoZXIuZ2V0UmVmQ291bnQoKSApCisJCXsKKwkJCWFjcXVpcmVQb2ludGVyKCBvdGhlci5tUFRSICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlvdGhlci5hY3F1aXJlUG9pbnRlciggbVBUUiApOworCQl9CisJfQorCit9OworCisKKy8qKgorICogb3BlcmF0b3I8PAorICovCitBVk1fT1NfU1RSRUFNKCBCRiApCisKKworfQorCisjZW5kaWYgLyogQkZfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbW1vbi9DTWFrZUxpc3RzLnR4dCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbW1vbi9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2FiOWMxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tbW9uL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTggQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisjICAgICAgICAgICAgICAgICAgICBDTWFrZSBmaWxlIGZvciB0aGUgQ09NTU9OIGxpYnJhcnkNCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorDQorIyBDKysgc291cmNlIGZpbGVzIHRvIHRha2UgaW50byBhY2NvdW50IChhbGwgZmlsZXMgbWF0Y2hpbmcgcGF0dGVybnMgcmVjdXJzaXZlbHkpDQorZmlsZSAoR0xPQl9SRUNVUlNFIENPTU1PTl9DWFhfU1JDX0ZJTEVTICouY3BwICouaCkNCisNCisjIFRhcmdldCB0byBidWlsZA0KK2FkZF9saWJyYXJ5IChjb21tb24gU1RBVElDICR7Q09NTU9OX0NYWF9TUkNfRklMRVN9KQ0KKw0KKyMgSW5jbHVkZSBkaXJlY3RvcmllcyAoaW50ZXJuYWwpDQordGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMgKGNvbW1vbiBQVUJMSUMgLi4pDQorDQorIyBUYXJnZXQgaW5jbHVkZSBkaXJlY3RvcmllcyAoZXh0ZXJuYWwpDQordGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMgKGNvbW1vbiBQVUJMSUMgJHtHTVBfSU5DTFVERV9ESVJ9ICR7R01QWFhfSU5DTFVERV9ESVJ9KQ0KK3RhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzIChjb21tb24gUFVCTElDICR7Qm9vc3RfSU5DTFVERV9ESVJTfSkNCisNCisNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21tb24vRWxlbWVudC5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21tb24vRWxlbWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA2MjAyNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbW1vbi9FbGVtZW50LmNwcApAQCAtMCwwICsxLDExMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiRWxlbWVudC5oIgorCisjaW5jbHVkZSA8Y29tbW9uL0JGLmg+CisKKyNpbmNsdWRlIDxleGNlcHRpb24+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorICogR0VUVEVSIC0gU0VUVEVSCisgKiBmb3IgY29udGFpbmVyIG9mIEJGCisgKi8KK0JGICYgRWxlbWVudDo6YXQoYXZtX3NpemVfdCBvZmZzZXQpCit7CisJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCTw8ICJJbGxlZ2FsIG1ldGhvZCBjYWxsIDw8IEVsZW1lbnQ6OmF0KCAiCisJCQk8PCBzdHIoKSA8PCAiICwgIiA8PCBvZmZzZXQgPDwgIiApID4+ICEhISIKKwkJCTw8IFNFTkRfRVhJVDsKKworCXRocm93KCBzdGQ6OmV4Y2VwdGlvbigpICk7Cit9CisKK2NvbnN0IEJGICYgRWxlbWVudDo6YXQoYXZtX3NpemVfdCBvZmZzZXQpIGNvbnN0Cit7CisJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCTw8ICJJbGxlZ2FsIG1ldGhvZCBjYWxsIDw8IEVsZW1lbnQ6OmF0KCAiCisJCQk8PCBzdHIoKSA8PCAiICwgIiA8PCBvZmZzZXQgPDwgIiApID4+ICEhISIKKwkJCTw8IFNFTkRfRVhJVDsKKworCXRocm93KCBzdGQ6OmV4Y2VwdGlvbigpICk7Cit9CisKKworQkYgJiBFbGVtZW50OjpvcGVyYXRvcltdKGF2bV9zaXplX3Qgb2Zmc2V0KQoreworCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQk8PCAiSWxsZWdhbCBtZXRob2QgY2FsbCA8PCBFbGVtZW50OjpvcGVyYXRvcltdKCAiCisJCQk8PCBzdHIoKSA8PCAiICwgIiA8PCBvZmZzZXQgPDwgIiApID4+ICEhISIKKwkJCTw8IFNFTkRfRVhJVDsKKworCXRocm93KCBzdGQ6OmV4Y2VwdGlvbigpICk7Cit9CisKK2NvbnN0IEJGICYgRWxlbWVudDo6b3BlcmF0b3JbXShhdm1fc2l6ZV90IG9mZnNldCkgY29uc3QKK3sKKwlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJPDwgIklsbGVnYWwgbWV0aG9kIGNhbGwgPDwgRWxlbWVudDo6b3BlcmF0b3JbXSggIgorCQkJPDwgc3RyKCkgPDwgIiAsICIgPDwgb2Zmc2V0IDw8ICIgKSA+PiAhISEiCisJCQk8PCBTRU5EX0VYSVQ7CisKKwl0aHJvdyggc3RkOjpleGNlcHRpb24oKSApOworfQorCisKK0JGICYgRWxlbWVudDo6Z2V0V3JpdGFibGUoYXZtX3NpemVfdCBvZmZzZXQpCit7CisJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCTw8ICJJbGxlZ2FsIG1ldGhvZCBjYWxsIDw8IEVsZW1lbnQ6OmdldFdyaXRhYmxlKCAiCisJCQk8PCBzdHIoKSA8PCAiICwgIiA8PCBvZmZzZXQgPDwgIiApID4+ICEhISIKKwkJCTw8IFNFTkRfRVhJVDsKKworCXRocm93KCBzdGQ6OmV4Y2VwdGlvbigpICk7Cit9CisKK3ZvaWQgRWxlbWVudDo6bWFrZVdyaXRhYmxlKGF2bV9zaXplX3Qgb2Zmc2V0KQoreworCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQk8PCAiSWxsZWdhbCBtZXRob2QgY2FsbCA8PCBFbGVtZW50OjptYWtlV3JpdGFibGUoICIKKwkJCTw8IHN0cigpIDw8ICIgLCAiIDw8IG9mZnNldCA8PCAiICkgPj4gISEhIgorCQkJPDwgU0VORF9FWElUOworCisJdGhyb3coIHN0ZDo6ZXhjZXB0aW9uKCkgKTsKK30KKwordm9pZCBFbGVtZW50OjpzZXQoYXZtX3NpemVfdCBvZmZzZXQsIGNvbnN0IEJGICYgYmYpCit7CisJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCTw8ICJJbGxlZ2FsIG1ldGhvZCBjYWxsIDw8IEVsZW1lbnQ6OnNldCggIgorCQkJPDwgc3RyKCkgPDwgIiAsICIgPDwgb2Zmc2V0IDw8ICIgKSA+PiAhISEiCisJCQk8PCBTRU5EX0VYSVQ7CisKKwl0aHJvdyggc3RkOjpleGNlcHRpb24oKSApOworfQorCithdm1fc2l6ZV90IEVsZW1lbnQ6OnNpemUoKSBjb25zdAoreworCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQk8PCAiSWxsZWdhbCBtZXRob2QgY2FsbCA8PCBFbGVtZW50OjpzaXplKCkgPj4gISEhIgorCQkJPDwgU0VORF9FWElUOworCisJdGhyb3coIHN0ZDo6ZXhjZXB0aW9uKCkgKTsKK30KKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21tb24vRWxlbWVudC5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tbW9uL0VsZW1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjY2ZjY0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tbW9uL0VsZW1lbnQuaApAQCAtMCwwICsxLDI2MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBDT01NT05fRUxFTUVOVF9IXworI2RlZmluZSBDT01NT05fRUxFTUVOVF9IXworCisjaW5jbHVkZSA8YmFzZS9DbGFzc0tpbmRJbmZvLmg+CisjaW5jbHVkZSA8Y29tbW9uL0F2bU9iamVjdC5oPgorCituYW1lc3BhY2Ugc2VwCit7CisKKworY2xhc3MgQkY7CisKKworY2xhc3MgRWxlbWVudCA6CisJCXB1YmxpYyBBdm1PYmplY3QsCisJCXB1YmxpYyBDbGFzc0tpbmRJbXBsLAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIEVsZW1lbnQgKQoreworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJRWxlbWVudChjbGFzc19raW5kX3QgYUNsYXNzS2luZCkKKwk6IEF2bU9iamVjdCggKSwKKwlDbGFzc0tpbmRJbXBsKCBhQ2xhc3NLaW5kICkKKwl7CisJCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIENvcHkKKwkgKiBBYnN0cmFjdCBwdXIKKwkgKi8KKwlFbGVtZW50KGNvbnN0IEVsZW1lbnQgJiBhbkVsZW1lbnQpCisJOiBBdm1PYmplY3QoIGFuRWxlbWVudCApLAorCUNsYXNzS2luZEltcGwoIGFuRWxlbWVudCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5FbGVtZW50KCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJaW5saW5lIGF2bV9hZGRyZXNzX3QgcmF3X2FkZHJlc3MoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBhdm1fYWRkcmVzc190KCB0aGlzICkgKTsKKwl9CisKKworCS8qKgorCSAqIENMT05FCisJICovCisJdmlydHVhbCBFbGVtZW50ICogY2xvbmUoKSBjb25zdCA9IDA7CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIGZvciBjb250YWluZXIgb2YgQkYKKwkgKi8KKwkvLyBHZW5lcmFsbHkgd2l0aCByYW5nZSBjaGVjaworCXZpcnR1YWwgQkYgJiBhdChhdm1fc2l6ZV90IG9mZnNldCk7CisJdmlydHVhbCBjb25zdCBCRiAmIGF0KGF2bV9zaXplX3Qgb2Zmc2V0KSBjb25zdDsKKworCS8vIEdlbmVyYWxseSB3aXRoIHJhbmdlIGNoZWNrCisJdmlydHVhbCBjb25zdCBCRiAmIG9wZXJhdG9yW10oYXZtX3NpemVfdCBvZmZzZXQpIGNvbnN0OworCXZpcnR1YWwgQkYgJiBvcGVyYXRvcltdKGF2bV9zaXplX3Qgb2Zmc2V0KTsKKworCXZpcnR1YWwgQkYgJiBnZXRXcml0YWJsZShhdm1fc2l6ZV90IG9mZnNldCk7CisKKwl2aXJ0dWFsIHZvaWQgbWFrZVdyaXRhYmxlKGF2bV9zaXplX3Qgb2Zmc2V0KTsKKworCXZpcnR1YWwgdm9pZCBzZXQoYXZtX3NpemVfdCBvZmZzZXQsIGNvbnN0IEJGICYgYmYpOworCisJdmlydHVhbCBhdm1fc2l6ZV90IHNpemUoKSBjb25zdDsKKworCisJLyoqCisJICogQ09NUEFSSVNPTgorCSAqIE9QRVJBVE9SCisJICovCisKKwlpbmxpbmUgdmlydHVhbCBib29sIGlzRVEoY29uc3QgRWxlbWVudCAmIGJmKSBjb25zdAorCXsKKwkJcmV0dXJuKCB0aGlzID09ICZiZiApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGJvb2wgaXNFUShjb25zdCBFbGVtZW50ICogYmYpIGNvbnN0CisJeworCQlyZXR1cm4oIChiZiAhPSBOVUxMKSAmJiBpc0VRKCogYmYpICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBib29sIGlzTkVRKGNvbnN0IEVsZW1lbnQgJiBiZikgY29uc3QKKwl7CisJCXJldHVybiggdGhpcyAhPSAmYmYgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBib29sIGlzTkVRKGNvbnN0IEVsZW1lbnQgKiBiZikgY29uc3QKKwl7CisJCXJldHVybiggKGJmID09IE5VTEwpIHx8IGlzTkVRKCogYmYpICk7CisJfQorCisKKwlib29sIHZpcnR1YWwgaXNURVEoY29uc3QgRWxlbWVudCAmIGJmKSBjb25zdAorCXsKKwkJcmV0dXJuKCB0aGlzID09ICZiZiApOworCX0KKworCWJvb2wgdmlydHVhbCBpc1RFUShjb25zdCBFbGVtZW50ICogYmYpIGNvbnN0CisJeworCQlyZXR1cm4oIHRoaXMgPT0gYmYgKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIGJvb2wgaXNOVEVRKGNvbnN0IEVsZW1lbnQgJiBiZikgY29uc3QKKwl7CisJCXJldHVybiggdGhpcyAhPSAmYmYgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBib29sIGlzTlRFUShjb25zdCBFbGVtZW50ICogYmYpIGNvbnN0CisJeworCQlyZXR1cm4oIHRoaXMgIT0gYmYgKTsKKwl9CisKKworCS8qKgorCSAqIFNFUklBTElaQVRJT04KKwkgKi8KKwl2aXJ0dWFsIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0ID0gMDsKKworCisJaW5saW5lIHZvaWQgc2VyaWFsaXplKE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJdG9TdHJlYW0oIG9zICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBzdGQ6OnN0cmluZyBzdHIoKSBjb25zdAorCXsKKwkJU3RyaW5nT3V0U3RyZWFtIG9zcyggQVZNX1NUUl9JTkRFTlQgKTsKKworCQl0b1N0cmVhbSggb3NzIDw8IElHTk9SRV9GSVJTVF9UQUIgKTsKKworCQlyZXR1cm4oIG9zcy5zdHIoKSApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgc3RyTnVtKAorCQkJdWludDhfdCBwcmVjaXNpb24gPSBBVk1fTVVNRVJJQ19QUkVDSVNJT04pIGNvbnN0CisJeworCQlyZXR1cm4oIHN0cigpICk7CisJfQorCisKKwkvKioKKwkgKiBUUkFDRSBvbiBERVNUUk9ZCisJICogZGJnRGVzdHJveQorCSAqLworCWlubGluZSB2b2lkIGRiZ0Rlc3Ryb3koKSBjb25zdAorCXsKKwkJQVZNX09TX1dBUk4gPDwgImRlc3Ryb3k8IEAgIiA8PCBhdm1fYWRkcmVzc190KCB0aGlzICkKKwkJCQk8PCAiICwgIiA8PCBzdGQ6OnNldHcoMTYpIDw8IGNsYXNzS2luZE5hbWUoKSA8PCAiID4gOiAiCisJCQkJPDwgc3RkOjpmbHVzaCA8PCBzdHIoKSA8PCBzdGQ6OmVuZGw7CisJfQorCit9OworCisKK3RlbXBsYXRlPCBjbGFzcyBUID4KK2NsYXNzIENsb25hYmxlRWxlbWVudCA6ICBwdWJsaWMgRWxlbWVudAoreworCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQ2xvbmFibGVFbGVtZW50KGNsYXNzX2tpbmRfdCBhQ2xhc3NLaW5kKQorCTogRWxlbWVudCggYUNsYXNzS2luZCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIENvcHkKKwkgKi8KKwlDbG9uYWJsZUVsZW1lbnQoY29uc3QgRWxlbWVudCAmIGFuRWxlbWVudCkKKwk6IEVsZW1lbnQoIGFuRWxlbWVudCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIENMT05FCisJICovCisJdmlydHVhbCBUICogY2xvbmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBuZXcgVCggKiBzdGF0aWNfY2FzdDwgY29uc3QgVCAqID4odGhpcykgKSApOworCX0KK307CisKKwordGVtcGxhdGU8IGNsYXNzIFQgPgorY2xhc3MgVW5jbG9uYWJsZUVsZW1lbnQgOiAgcHVibGljIEVsZW1lbnQKK3sKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCVVuY2xvbmFibGVFbGVtZW50KGNsYXNzX2tpbmRfdCBhQ2xhc3NLaW5kKQorCTogRWxlbWVudCggYUNsYXNzS2luZCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIENvcHkKKwkgKi8KKwlVbmNsb25hYmxlRWxlbWVudChjb25zdCBFbGVtZW50ICYgYW5FbGVtZW50KQorCTogRWxlbWVudCggYW5FbGVtZW50ICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogQ0xPTkUKKwkgKi8KKwl2aXJ0dWFsIFQgKiBjbG9uZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGNvbnN0X2Nhc3Q8IFQgKiA+KHRoaXMpICk7CisJfQorfTsKKworCit9CisKKyNlbmRpZiAvKkNPTU1PTl9FTEVNRU5UX0hfKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbW1vbi9OYW1lZEVsZW1lbnQuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tbW9uL05hbWVkRWxlbWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQyYjZkYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbW1vbi9OYW1lZEVsZW1lbnQuY3BwCkBAIC0wLDAgKzEsMjkzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjAgbWFycyAyMDE2CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJOYW1lZEVsZW1lbnQuaCIKKworI2luY2x1ZGUgPGJvb3N0L3Rva2VuaXplci5ocHA+CisKKworbmFtZXNwYWNlIHNlcAoreworCisvKioKKyAqIEFUVFJJQlVURVMKKyAqLworY29uc3Qgc3RkOjpzdHJpbmcgTmFtZWRFbGVtZW50OjpVTk5BTUVEX0lEID0gIjxuYW1lLWlkOj8+IjsKKworCisvKgorICogVVRJTAorICogcmV0dXJuIHN1ZmZpeCBvZiA8Y29udGFpbmVyLWlkPi48bmFtZS1pZD4gaS5lLiA8bmFtZS1pZD4KKyAqLworc3RkOjpzdHJpbmcgTmFtZWRFbGVtZW50OjpleHRyYWN0TmFtZUlEKGNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkKK3sKKwlpZiggbm90IGFRdWFsaWZpZWROYW1lSUQuZW1wdHkoKSApCisJeworCQlzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IGFRdWFsaWZpZWROYW1lSUQuZmluZF9sYXN0X29mKCcuJyk7CisKKwkJaWYoIHBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisJCXsKKwkJCXJldHVybiggYVF1YWxpZmllZE5hbWVJRC5zdWJzdHIocG9zICsgMSkgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBvcyA9IGFRdWFsaWZpZWROYW1lSUQuZmluZChGUU5fSURfUk9PVF9TRVBBUkFUT1IpOworCisJCQlpZiggcG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKwkJCXsKKwkJCQlyZXR1cm4oIGFRdWFsaWZpZWROYW1lSUQuc3Vic3RyKHBvcyArIDIpICk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4oIGFRdWFsaWZpZWROYW1lSUQgKTsKK30KKworCisvKioKKyAqIFVUSUwKKyAqIHJldHVybiA8Y29udGFpbmVyLWlkPi48bmFtZS1pZD4KKyAqIHJldHVybiA8ZnFuPiB3aXRob3V0IDxzeXN0ZW0taWQ+CisgKi8KK3N0ZDo6c3RyaW5nIE5hbWVkRWxlbWVudDo6bWFrZVF1YWxpZmllZE5hbWVJRCgKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKQoreworCXN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgcG9zTG9jYXRvciA9CisJCQlhUXVhbGlmaWVkTmFtZUlELmZpbmQoRlFOX0lEX1JPT1RfU0VQQVJBVE9SKTsKKworCWlmKCBwb3NMb2NhdG9yICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKwl7CisJCXN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgcG9zTG9jYXRpb24gPSBhUXVhbGlmaWVkTmFtZUlELmZpbmQoJy4nKTsKKworCQlpZiggKHBvc0xvY2F0aW9uICE9IHN0ZDo6c3RyaW5nOjpucG9zKSAmJiAocG9zTG9jYXRpb24gPiBwb3NMb2NhdG9yKSApCisJCXsKKwkJCXJldHVybiggT1NTKCkgPDwgYVF1YWxpZmllZE5hbWVJRC5zdWJzdHIoMCwgcG9zTG9jYXRvcikgPDwgIjoiCisJCQkJCTw8IGFRdWFsaWZpZWROYW1lSUQuc3Vic3RyKHBvc0xvY2F0aW9uICsgMSkgKTsKKwkJfQorCX0KKworCXJldHVybiggYVF1YWxpZmllZE5hbWVJRCApOworfQorCitzdGQ6OnN0cmluZyBOYW1lZEVsZW1lbnQ6Om1ha2VRdWFsaWZpZWROYW1lSUQoCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKQoreworCXN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgcG9zTG9jYXRvciA9CisJCQlhUXVhbGlmaWVkTmFtZUlELmZpbmQoRlFOX0lEX1JPT1RfU0VQQVJBVE9SKTsKKworCWlmKCBwb3NMb2NhdG9yICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKwl7CisJCXN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgcG9zTG9jYXRpb24gPSBhUXVhbGlmaWVkTmFtZUlELmZpbmRfbGFzdF9vZignLicsCisJCQkJKGFRdWFsaWZpZWROYW1lSUQuc2l6ZSgpIC0gYU5hbWVJRC5zaXplKCkgLSAyKSApOworCisJCWlmKCAocG9zTG9jYXRpb24gIT0gc3RkOjpzdHJpbmc6Om5wb3MpICYmIChwb3NMb2NhdGlvbiA+IHBvc0xvY2F0b3IpICkKKwkJeworCQkJcmV0dXJuKCBPU1MoKSA8PCBhUXVhbGlmaWVkTmFtZUlELnN1YnN0cigwLCBwb3NMb2NhdG9yKSA8PCAiOiIKKwkJCQkJPDwgYVF1YWxpZmllZE5hbWVJRC5zdWJzdHIocG9zTG9jYXRpb24gKyAxKSApOworCQl9CisJfQorCisJcmV0dXJuKCBhUXVhbGlmaWVkTmFtZUlEICk7Cit9CisKKworc3RkOjpzdHJpbmcgTmFtZWRFbGVtZW50OjpnZXRDb250YWluZXJRdWFsaWZpZWROYW1lSUQoCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkKK3sKKwlpZiggbm90IGFRdWFsaWZpZWROYW1lSUQuZW1wdHkoKSApCisJeworCQlzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IGFRdWFsaWZpZWROYW1lSUQuZmluZF9sYXN0X29mKCcuJyk7CisKKwkJaWYoIHBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisJCXsKKwkJCXJldHVybiggYVF1YWxpZmllZE5hbWVJRC5zdWJzdHIoMCwgcG9zKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJcG9zID0gYVF1YWxpZmllZE5hbWVJRC5maW5kKEZRTl9JRF9ST09UX1NFUEFSQVRPUik7CisKKwkJCWlmKCBwb3MgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorCQkJeworCQkJCXJldHVybiggYVF1YWxpZmllZE5hbWVJRC5zdWJzdHIocG9zICsgMikgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4oICIiICk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4oIGFRdWFsaWZpZWROYW1lSUQgKTsKK30KKworCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENPTVBBUkVSICBGT1IgIFFVQUxJRklFRCBOQU1FIElEICBTVFJJTkcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK2Jvb2wgTmFtZWRFbGVtZW50Ojpjb21wYXJlSUQoCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCwgb3BfY29tcGFyZXJfdCBvcCkgY29uc3QKK3sKKwlzd2l0Y2goIG9wICkKKwl7CisJCWNhc2UgT1BfU1RST05HX0NPTVBBUkVSICAgOgorCQkJcmV0dXJuKCAobUZ1bGx5UXVhbGlmaWVkTmFtZUlEID09IGFRdWFsaWZpZWROYW1lSUQpCisJCQkJCXx8IE5hbWVkRWxlbWVudDo6Y29tcGFyZUxvY2F0aW9uKAorCQkJCQkJCW1GdWxseVF1YWxpZmllZE5hbWVJRCwgYVF1YWxpZmllZE5hbWVJRCkgKTsKKworCQljYXNlIE9QX1NUUklDVF9DT01QQVJFUiAgIDoKKwkJCXJldHVybiggbUZ1bGx5UXVhbGlmaWVkTmFtZUlEID09IGFRdWFsaWZpZWROYW1lSUQgKTsKKworCQljYXNlIE9QX0FCU09MVVRFX0NPTVBBUkVSIDoKKwkJCXJldHVybiggTmFtZWRFbGVtZW50Ojpjb21wYXJlTG9jYXRpb24oCisJCQkJCW1GdWxseVF1YWxpZmllZE5hbWVJRCwgYVF1YWxpZmllZE5hbWVJRCkgKTsKKworCQljYXNlIE9QX1JFTEFUSVZFX0NPTVBBUkVSIDoKKwkJCXJldHVybiggdGhpcy0+ZnFuRW5kc1dpdGgoYVF1YWxpZmllZE5hbWVJRCkgKTsKKworCQljYXNlIE9QX05BTUVfSURfQ09NUEFSRVIgIDoKKwkJCXJldHVybiggbU5hbWVJRCA9PSBhUXVhbGlmaWVkTmFtZUlEICk7CisKKwkJY2FzZSBPUF9VTlJFU1RSSUNURURfTkFNRV9DT01QQVJFUiA6CisJCQlyZXR1cm4oIG1VbnJlc3RyaWN0ZWROYW1lID09IGFRdWFsaWZpZWROYW1lSUQgKTsKKworCQlkZWZhdWx0OgorCQl7CisJCQlpZiggKG9wICYgT1BfU1RSSUNUX0NPTVBBUkVSKQorCQkJCSYmIChtRnVsbHlRdWFsaWZpZWROYW1lSUQgPT0gYVF1YWxpZmllZE5hbWVJRCkgKQorCQkJeworCQkJCXJldHVybiggdHJ1ZSApOworCQkJfQorCQkJaWYoIChvcCAmIE9QX0FCU09MVVRFX0NPTVBBUkVSKQorCQkJCSYmIE5hbWVkRWxlbWVudDo6Y29tcGFyZUxvY2F0aW9uKAorCQkJCQkJbUZ1bGx5UXVhbGlmaWVkTmFtZUlELCBhUXVhbGlmaWVkTmFtZUlEKSApCisJCQl7CisJCQkJcmV0dXJuKCB0cnVlICk7CisJCQl9CisJCQlpZiggKG9wICYgT1BfUkVMQVRJVkVfQ09NUEFSRVIgKQorCQkJCSYmIHRoaXMtPmZxbkVuZHNXaXRoKGFRdWFsaWZpZWROYW1lSUQpICkKKwkJCXsKKwkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCX0KKwkJCWlmKCAob3AgJiBPUF9OQU1FX0lEX0NPTVBBUkVSKQorCQkJCSYmIChtTmFtZUlEID09IGFRdWFsaWZpZWROYW1lSUQpICkKKwkJCXsKKwkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCX0KKworCQkJaWYoIChvcCAmIE9QX1VOUkVTVFJJQ1RFRF9OQU1FX0NPTVBBUkVSKQorCQkJCSYmIChtTmFtZUlEID09IGFRdWFsaWZpZWROYW1lSUQpICkKKwkJCXsKKwkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCX0KKworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorfQorCisKKy8qCisgKiAhVU5VU0VEIQorYm9vbCBOYW1lZEVsZW1lbnQ6OmNvbXBhcmVJRCgKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQsCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCwgb3BfY29tcGFyZXJfdCBvcCkKK3sKKwlpZiggKG9wICYgT1BfU1RSSUNUX0NPTVBBUkVSKQorCQkmJiAoYUZ1bGx5UXVhbGlmaWVkTmFtZUlEID09IGFRdWFsaWZpZWROYW1lSUQpICkKKwl7CisJCXJldHVybiggdHJ1ZSApOworCX0KKwlpZiggKG9wICYgT1BfQUJTT0xVVEVfQ09NUEFSRVIpCisJCSYmIE5hbWVkRWxlbWVudDo6Y29tcGFyZUxvY2F0aW9uKAorCQkJCWFGdWxseVF1YWxpZmllZE5hbWVJRCwgYVF1YWxpZmllZE5hbWVJRCkgKQorCXsKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCWlmKCAob3AgJiBPUF9SRUxBVElWRV9DT01QQVJFUiApCisJCSYmIE5hbWVkRWxlbWVudDo6ZnFuRW5kc1dpdGgoYUZ1bGx5UXVhbGlmaWVkTmFtZUlELCBhUXVhbGlmaWVkTmFtZUlEKSApCisJeworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisJaWYoIChvcCAmIE9QX05BTUVfSURfQ09NUEFSRVIpCisJCSYmIChOYW1lZEVsZW1lbnQ6OmV4dHJhY3ROYW1lSUQoYUZ1bGx5UXVhbGlmaWVkTmFtZUlEKQorCQkJPT0gYVF1YWxpZmllZE5hbWVJRCkgKQorCXsKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisJaWYoIChvcCAmIE9QX1VOUkVTVFJJQ1RFRF9OQU1FX0NPTVBBUkVSKQorCQkmJiAoYUZ1bGx5UXVhbGlmaWVkTmFtZUlEID09IGFRdWFsaWZpZWROYW1lSUQpICkKKwl7CisJCXJldHVybiggdHJ1ZSApOworCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKyogIVVOVVNFRCEKKyovCisKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMSVNUIG9mIElEIG9mIFFVQUxJRklFRCBOQU1FIElECisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCithdm1fc2l6ZV90IE5hbWVkRWxlbWVudDo6Y29sbGVjdE5hbWVJRChDb2xsZWN0aW9uPCBzdGQ6OnN0cmluZyA+ICYgbGlzdE5hbWVJRCwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlELCBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIHBvcykKK3sKKwlBVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoIHBvcyA8IGFRdWFsaWZpZWROYW1lSUQuc2l6ZSgpICkKKwkJCTw8ICJCYWQgc3RyaW5nIHBvc2l0aW9uIGluIE5hbWVkRWxlbWVudDo6bGlzdG9mSUQoIgorCQkJPDwgYVF1YWxpZmllZE5hbWVJRCA8PCAiICwgIiA8PCBwb3MgPDwgIiApIgorCQkJPDwgU0VORF9FWElUOworCisJY29uc3Qgc3RkOjpzdHJpbmcgJiBzdWJRdWFsaWZpZWROYW1lSUQgPSBhUXVhbGlmaWVkTmFtZUlELnN1YnN0cihwb3MpOworCisJdHlwZWRlZiBib29zdDo6dG9rZW5pemVyPGJvb3N0OjpjaGFyX3NlcGFyYXRvcjxjaGFyPiA+IHRva2VuaXplcjsKKwlib29zdDo6Y2hhcl9zZXBhcmF0b3I8Y2hhcj4gc2VwKCIuIik7CisKKwl0b2tlbml6ZXIgdG9rZW5zKHN1YlF1YWxpZmllZE5hbWVJRCwgc2VwKTsKKwlhdm1fc2l6ZV90IGNvdW50ID0gMDsKKwl0b2tlbml6ZXI6Oml0ZXJhdG9yIGl0ID0gdG9rZW5zLmJlZ2luKCk7CisJZm9yKCA7IGl0ICE9IHRva2Vucy5lbmQoKSA7ICsraXQgLCArK2NvdW50ICkKKwl7CisJCWxpc3ROYW1lSUQuYXBwZW5kKChzdGQ6OnN0cmluZykgKCppdCkpOworCX0KKworCXJldHVybiggY291bnQgKTsKK30KKworCithdm1fc2l6ZV90IE5hbWVkRWxlbWVudDo6Y29sbGVjdE5hbWVJRChDb2xsZWN0aW9uPCBzdGQ6OnN0cmluZyA+ICYgbGlzdE5hbWVJRCwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKQoreworCXR5cGVkZWYgYm9vc3Q6OnRva2VuaXplcjxib29zdDo6Y2hhcl9zZXBhcmF0b3I8Y2hhcj4gPiB0b2tlbml6ZXI7CisJYm9vc3Q6OmNoYXJfc2VwYXJhdG9yPGNoYXI+IHNlcCgiLiIpOworCisJdG9rZW5pemVyIHRva2VucyhhUXVhbGlmaWVkTmFtZUlELCBzZXApOworCWF2bV9zaXplX3QgY291bnQgPSAwOworCXRva2VuaXplcjo6aXRlcmF0b3IgaXQgPSB0b2tlbnMuYmVnaW4oKTsKKwlmb3IoIDsgaXQgIT0gdG9rZW5zLmVuZCgpIDsgKytpdCAsICsrY291bnQgKQorCXsKKwkJbGlzdE5hbWVJRC5hcHBlbmQoKHN0ZDo6c3RyaW5nKSAoKml0KSk7CisJfQorCisJcmV0dXJuKCBjb3VudCApOworfQorCisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21tb24vTmFtZWRFbGVtZW50LmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21tb24vTmFtZWRFbGVtZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUzNWM5MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbW1vbi9OYW1lZEVsZW1lbnQuaApAQCAtMCwwICsxLDU4MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDIwIG1hcnMgMjAxNgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIENPTU1PTl9OQU1FREVMRU1FTlRfSF8KKyNkZWZpbmUgQ09NTU9OX05BTUVERUxFTUVOVF9IXworCisjaW5jbHVkZSA8Y29tbW9uL0VsZW1lbnQuaD4KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vQ29sbGVjdGlvbi5oPgorCisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorICogREVGQVVMVAorICogRnVsbHkgUXVhbGlmaWVkIE5hbWUgSUQgU2NoZW1lU2VwYXJhdG9yCisgKi8KKyNkZWZpbmUgRlFOX0lEX1NDSEVNRV9QQVRIX1NFUEFSQVRPUiAgIjovIgorCisjZGVmaW5lIEZRTl9JRF9ST09UX1NFUEFSQVRPUiAgICAgICAgICI6OiIKKworCitjbGFzcyBOYW1lZEVsZW1lbnQgOgorCQlwdWJsaWMgRWxlbWVudCAsCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggTmFtZWRFbGVtZW50ICkKK3sKKworcHVibGljOgorLyoqCisgKiBUWVBFREVGCisgKi8KKwl0eXBlZGVmIGF2bV91aW50OF90ICAgICAgICAgICAgICAgb3BfY29tcGFyZXJfdDsKKworCWVudW0geworCQlPUF9TVFJJQ1RfQ09NUEFSRVIgICAgICAgICAgICA9IDB4MDAxLAorCisJCU9QX0FCU09MVVRFX0NPTVBBUkVSICAgICAgICAgID0gMHgwMDIsIC8vIElnbm9yZSBMT0NBVE9SCisKKwkJT1BfUkVMQVRJVkVfQ09NUEFSRVIgICAgICAgICAgPSAweDAwNCwKKworCQlPUF9OQU1FX0lEX0NPTVBBUkVSICAgICAgICAgICA9IDB4MDA4LAorCisJCU9QX1VOUkVTVFJJQ1RFRF9OQU1FX0NPTVBBUkVSID0gMHgwMTAsCisKKwkJT1BfU1RST05HX0NPTVBBUkVSICAgICAgICAgICAgPSBPUF9TVFJJQ1RfQ09NUEFSRVIKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBPUF9BQlNPTFVURV9DT01QQVJFUiwKKworCQlPUF9RVUFMSUZJRURfTkFNRV9JRF9DT01QQVJFUiA9IE9QX1NUUklDVF9DT01QQVJFUgorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE9QX0FCU09MVVRFX0NPTVBBUkVSCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgT1BfUkVMQVRJVkVfQ09NUEFSRVIKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBPUF9OQU1FX0lEX0NPTVBBUkVSLAorCisJCU9QX1dFQUtfQ09NUEFSRVIgICAgICAgICAgICAgID0gT1BfUVVBTElGSUVEX05BTUVfSURfQ09NUEFSRVIKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBPUF9VTlJFU1RSSUNURURfTkFNRV9DT01QQVJFUiwKKworCQlPUF9BTllfQ09NUEFSRVIgICAgICAgICAgICAgICA9IE9QX1NUUk9OR19DT01QQVJFUgorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE9QX1dFQUtfQ09NUEFSRVIKKwl9OworCisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBBVFRSSUJVVEVTCisJICovCisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIFVOTkFNRURfSUQ7CisKKwlzdGQ6OnN0cmluZyBtRnVsbHlRdWFsaWZpZWROYW1lSUQ7CisJc3RkOjpzdHJpbmcgbU5hbWVJRDsKKwlzdGQ6OnN0cmluZyBtVW5yZXN0cmljdGVkTmFtZTsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJTmFtZWRFbGVtZW50KGNsYXNzX2tpbmRfdCBhQ2xhc3NLaW5kKQorCTogRWxlbWVudCggYUNsYXNzS2luZCApLAorCW1GdWxseVF1YWxpZmllZE5hbWVJRCggKSwKKwltTmFtZUlEKCApLAorCW1VbnJlc3RyaWN0ZWROYW1lKCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlOYW1lZEVsZW1lbnQoY2xhc3Nfa2luZF90IGFDbGFzc0tpbmQsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkKKwk6IEVsZW1lbnQoIGFDbGFzc0tpbmQgKSwKKwltRnVsbHlRdWFsaWZpZWROYW1lSUQoICksCisJbU5hbWVJRCggYU5hbWVJRCApLAorCW1VbnJlc3RyaWN0ZWROYW1lKCBhTmFtZUlEICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCU5hbWVkRWxlbWVudChjbGFzc19raW5kX3QgYUNsYXNzS2luZCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlELAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhblVucmVzdHJpY3RlZE5hbWUpCisJOiBFbGVtZW50KCBhQ2xhc3NLaW5kICksCisJbUZ1bGx5UXVhbGlmaWVkTmFtZUlEKCBhRnVsbHlRdWFsaWZpZWROYW1lSUQgKSwKKwltTmFtZUlEKCBhTmFtZUlEICksCisJbVVucmVzdHJpY3RlZE5hbWUoIGFuVW5yZXN0cmljdGVkTmFtZSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlOYW1lZEVsZW1lbnQoY2xhc3Nfa2luZF90IGFDbGFzc0tpbmQsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkKKwk6IEVsZW1lbnQoIGFDbGFzc0tpbmQgKSwKKwltRnVsbHlRdWFsaWZpZWROYW1lSUQoIGFGdWxseVF1YWxpZmllZE5hbWVJRCApLAorCW1OYW1lSUQoIGFOYW1lSUQgKSwKKwltVW5yZXN0cmljdGVkTmFtZSggYU5hbWVJRCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCU5hbWVkRWxlbWVudChjbGFzc19raW5kX3QgYUNsYXNzS2luZCwgY29uc3QgTmFtZWRFbGVtZW50ICYgYW5FbGVtZW50KQorCTogRWxlbWVudCggYUNsYXNzS2luZCApLAorCW1GdWxseVF1YWxpZmllZE5hbWVJRCggKSwKKwltTmFtZUlEKCApLAorCW1VbnJlc3RyaWN0ZWROYW1lKCApCisJeworCQlzZXRBbGxOYW1lKCBhbkVsZW1lbnQgKTsKKwl9CisKKwlOYW1lZEVsZW1lbnQoY2xhc3Nfa2luZF90IGFDbGFzc0tpbmQsIE5hbWVkRWxlbWVudCAqIGFuRWxlbWVudCkKKwk6IEVsZW1lbnQoIGFDbGFzc0tpbmQgKSwKKwltRnVsbHlRdWFsaWZpZWROYW1lSUQoICksCisJbU5hbWVJRCggKSwKKwltVW5yZXN0cmljdGVkTmFtZSggKQorCXsKKwkJc2V0QWxsTmFtZSggYW5FbGVtZW50ICk7CisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJTmFtZWRFbGVtZW50KGNvbnN0IE5hbWVkRWxlbWVudCAmIGFuRWxlbWVudCkKKwk6IEVsZW1lbnQoIGFuRWxlbWVudCApLAorCW1GdWxseVF1YWxpZmllZE5hbWVJRCggYW5FbGVtZW50Lm1GdWxseVF1YWxpZmllZE5hbWVJRCApLAorCW1OYW1lSUQoIGFuRWxlbWVudC5tTmFtZUlEICksCisJbVVucmVzdHJpY3RlZE5hbWUoIGFuRWxlbWVudC5tVW5yZXN0cmljdGVkTmFtZSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5OYW1lZEVsZW1lbnQoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtRnVsbHlRdWFsaWZpZWROYW1lSUQKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyAmIGdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgY29uc3QKKwl7CisJCXJldHVybiggbUZ1bGx5UXVhbGlmaWVkTmFtZUlEICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzRnVsbHlRdWFsaWZpZWROYW1lSUQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBub3QgbUZ1bGx5UXVhbGlmaWVkTmFtZUlELmVtcHR5KCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRGdWxseVF1YWxpZmllZE5hbWVJRCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEKQorCXsKKwkJbUZ1bGx5UXVhbGlmaWVkTmFtZUlEID0gYUZ1bGx5UXVhbGlmaWVkTmFtZUlEOworCisJCWV4dHJhY3RTZXROYW1lSUQoIGFGdWxseVF1YWxpZmllZE5hbWVJRCApOworCX0KKworCWlubGluZSB2b2lkIHNldEZ1bGx5UXVhbGlmaWVkTmFtZUNvbnRhaW5lciggTmFtZWRFbGVtZW50ICogYW5FbGVtZW50KQorCXsKKwkJbUZ1bGx5UXVhbGlmaWVkTmFtZUlEID0KKwkJCQkoIE9TUygpIDw8IGFuRWxlbWVudC0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJCQkJPDwgJy4nIDw8IGdldE5hbWVJRCgpICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtTmFtZUlECisJICovCisJaW5saW5lIHZpcnR1YWwgY29uc3Qgc3RkOjpzdHJpbmcgJiBnZXROYW1lSUQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtTmFtZUlEICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzTmFtZUlEKCkgY29uc3QKKwl7CisJCXJldHVybiggbm90IG1OYW1lSUQuZW1wdHkoKSApOworCX0KKworCWlubGluZSB2b2lkIHNldE5hbWVJRChjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpCisJeworCQltTmFtZUlEID0gYU5hbWVJRDsKKwl9CisKKwlpbmxpbmUgdm9pZCBleHRyYWN0U2V0TmFtZUlEKGNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkKKwl7CisJCW1OYW1lSUQgPSBOYW1lZEVsZW1lbnQ6OmV4dHJhY3ROYW1lSUQoIGFRdWFsaWZpZWROYW1lSUQgKTsKKwl9CisKKworCS8qCisJICogVVRJTAorCSAqIHJldHVybiBzdWZmaXggb2YgPGNvbnRhaW5lci1pZD4uPG5hbWUtaWQ+IGkuZS4gPG5hbWUtaWQ+CisJICovCisJc3RhdGljIHN0ZDo6c3RyaW5nIGV4dHJhY3ROYW1lSUQoY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKTsKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1GdWxseVF1YWxpZmllZE5hbWVJRAorCSAqLworCWlubGluZSB2b2lkIHNldEFsbE5hbWVJRChjb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkKKwl7CisJCW1GdWxseVF1YWxpZmllZE5hbWVJRCA9IGFGdWxseVF1YWxpZmllZE5hbWVJRDsKKworCQlzZXROYW1lSUQoIGFOYW1lSUQgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRBbGxOYW1lSUQoY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsIGNvbnN0IHN0ZDo6c3RyaW5nICYgbmFtZSkKKwl7CisJCW1GdWxseVF1YWxpZmllZE5hbWVJRCA9IGFGdWxseVF1YWxpZmllZE5hbWVJRDsKKworCQltTmFtZUlEID0gYU5hbWVJRDsKKworCQltVW5yZXN0cmljdGVkTmFtZSA9IG5hbWU7CisJfQorCisKKwkvKioKKwkgKiBVVElMCisJICovCisJaW5saW5lIGJvb2wgaXNOYW1lZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG5vdCBpc1VuYW1lZCgpICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNVbmFtZWQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRnVsbHlRdWFsaWZpZWROYW1lSUQuZW1wdHkoKSAmJgorCQkJCW1OYW1lSUQuZW1wdHkoKSAmJiBtVW5yZXN0cmljdGVkTmFtZS5lbXB0eSgpICk7CisJfQorCisKKwlpbmxpbmUgdm9pZCBzZXRBbGxOYW1lKGNvbnN0IE5hbWVkRWxlbWVudCAmIGFuRWxlbWVudCkKKwl7CisJCW1GdWxseVF1YWxpZmllZE5hbWVJRCA9IGFuRWxlbWVudC5tRnVsbHlRdWFsaWZpZWROYW1lSUQ7CisJCW1OYW1lSUQgPSBhbkVsZW1lbnQubU5hbWVJRDsKKwkJbVVucmVzdHJpY3RlZE5hbWUgPSBhbkVsZW1lbnQubVVucmVzdHJpY3RlZE5hbWU7CisJfQorCisJaW5saW5lIHZvaWQgc2V0QWxsTmFtZShOYW1lZEVsZW1lbnQgKiBhbkVsZW1lbnQpCisJeworCQlpZiggYW5FbGVtZW50ICE9IE5VTEwgKQorCQl7CisJCQltRnVsbHlRdWFsaWZpZWROYW1lSUQgPSBhbkVsZW1lbnQtPm1GdWxseVF1YWxpZmllZE5hbWVJRDsKKwkJCW1OYW1lSUQgPSBhbkVsZW1lbnQtPm1OYW1lSUQ7CisJCQltVW5yZXN0cmljdGVkTmFtZSA9IGFuRWxlbWVudC0+bVVucmVzdHJpY3RlZE5hbWU7CisJCX0KKwl9CisKKworCS8qKgorCSAqIENPTVBBUklTT04KKwkgKiBPUEVSQVRPUgorCSAqLworCWlubGluZSBpbnQgY29tcGFyZUZRTihjb25zdCBOYW1lZEVsZW1lbnQgJiBvdGhlcikgY29uc3QKKwl7CisJCXJldHVybiggbUZ1bGx5UXVhbGlmaWVkTmFtZUlELmNvbXBhcmUoIG90aGVyLm1GdWxseVF1YWxpZmllZE5hbWVJRCApICk7CisJfQorCisJLy8gU1RSSUNUOj4gY29tcGFyZSBMT0NBVE9SICYgTE9DQVRJT04gW3RydWU6LSByZXRyeSBvbmx5IG9ubHkgTE9DQVRJT05dCisJaW5saW5lIGJvb2wgZnFuRXF1YWxzKGNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlELAorCQkJYm9vbCBlbmFibGVkT25seUxvY2F0aW9uQ29tcGFyaXNvbkVsc2UgPSBmYWxzZSkgY29uc3QKKwl7CisJCXJldHVybiggKG1GdWxseVF1YWxpZmllZE5hbWVJRCA9PSBhRnVsbHlRdWFsaWZpZWROYW1lSUQpCisJCQkJfHwgKGVuYWJsZWRPbmx5TG9jYXRpb25Db21wYXJpc29uRWxzZQorCQkJCQkmJiBOYW1lZEVsZW1lbnQ6OmNvbXBhcmVMb2NhdGlvbigKKwkJCQkJCQl0aGlzLCBhRnVsbHlRdWFsaWZpZWROYW1lSUQpKSApOworCX0KKworCWlubGluZSBib29sIGZxbkVuZHNXaXRoKGNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkgY29uc3QKKwl7CisJCXJldHVybiggKG1OYW1lSUQgPT0gYVF1YWxpZmllZE5hbWVJRCkKKwkJCQl8fCBOYW1lZEVsZW1lbnQ6OmZxbkVuZHNXaXRoKAorCQkJCQkJbUZ1bGx5UXVhbGlmaWVkTmFtZUlELCBhUXVhbGlmaWVkTmFtZUlEKSApOworCX0KKworCWlubGluZSBib29sIGZxblN0YXJ0c1dpdGgoY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRnVsbHlRdWFsaWZpZWROYW1lSUQuZmluZChhUXVhbGlmaWVkTmFtZUlEKSA9PSAwICk7CisJfQorCisJLyoqCisJICogR0VUVEVSCisJICogUXVhbGlmaWVkIE5hbWUgSURlbnRpZmllcgorCSAqIFF1YWxpZmllZE5hbWVJRAorCSAqLworCWlubGluZSB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldFF1YWxpZmllZE5hbWVJRCgpIGNvbnN0CisJeworCQlyZXR1cm4oIE5hbWVkRWxlbWVudDo6bWFrZVF1YWxpZmllZE5hbWVJRCgKKwkJCQltRnVsbHlRdWFsaWZpZWROYW1lSUQgLCBtTmFtZUlEICkgKTsKKwl9CisKKworCWlubGluZSBib29sIGlzUmVsYXRpdmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBOYW1lZEVsZW1lbnQ6OmlzUmVsYXRpdmUobUZ1bGx5UXVhbGlmaWVkTmFtZUlEKSApOworCX0KKworCisJLyoqCisJICogVVRJTAorCSAqIHJldHVybiA8Y29udGFpbmVyLWlkPi48bmFtZS1pZD4KKwkgKi8KKwlzdGF0aWMgc3RkOjpzdHJpbmcgbWFrZVF1YWxpZmllZE5hbWVJRCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCk7CisKKwlzdGF0aWMgc3RkOjpzdHJpbmcgbWFrZVF1YWxpZmllZE5hbWVJRCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKTsKKworCXN0YXRpYyBzdGQ6OnN0cmluZyBnZXRDb250YWluZXJRdWFsaWZpZWROYW1lSUQoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpOworCisJLyoqCisJICogTG9hY2F0aW9uCisJICogTG9jYXRvcgorCSAqLworCWlubGluZSBzdGF0aWMgc3RkOjpzdHJpbmcgbG9jYXRpb24oY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKQorCXsKKwkJc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBwb3MgPQorCQkJCWFRdWFsaWZpZWROYW1lSUQuZmluZChGUU5fSURfUk9PVF9TRVBBUkFUT1IpOworCisJCXJldHVybiggKHBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcykgPworCQkJCWFRdWFsaWZpZWROYW1lSUQuc3Vic3RyKHBvcyArIDIgKSA6IGFRdWFsaWZpZWROYW1lSUQgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIHN0ZDo6c3RyaW5nIGxvY2F0b3IoY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKQorCXsKKwkJc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBwb3MgPQorCQkJCWFRdWFsaWZpZWROYW1lSUQuZmluZChGUU5fSURfUk9PVF9TRVBBUkFUT1IpOworCisJCXJldHVybiggKHBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcykgPworCQkJCWFRdWFsaWZpZWROYW1lSUQuc3Vic3RyKDAsIHBvcykgOiAiIiApOworCX0KKworCisJaW5saW5lIHN0YXRpYyBib29sIGNvbXBhcmVJRCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRF8xLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEXzIpCisJeworCQlyZXR1cm4oIGFRdWFsaWZpZWROYW1lSURfMSA9PSBhUXVhbGlmaWVkTmFtZUlEXzIgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIGJvb2wgY29tcGFyZUxvY2F0aW9uKAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEXzEsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSURfMikKKwl7CisJCXJldHVybiggTmFtZWRFbGVtZW50Ojpsb2NhdGlvbihhUXVhbGlmaWVkTmFtZUlEXzEpCisJCQkJPT0gTmFtZWRFbGVtZW50Ojpsb2NhdGlvbihhUXVhbGlmaWVkTmFtZUlEXzIpICk7CisJfQorCisJLyoqCisJICogaXNBYnNvbHV0ZQorCSAqIGlzUmVsYXRpdmUKKwkgKi8KKwlpbmxpbmUgc3RhdGljIGJvb2wgaXNBYnNvbHV0ZShjb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpCisJeworCQlyZXR1cm4oIGFRdWFsaWZpZWROYW1lSUQuZmluZChGUU5fSURfUk9PVF9TRVBBUkFUT1IpCisJCQkJIT0gc3RkOjpzdHJpbmc6Om5wb3MgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIGJvb2wgaXNSZWxhdGl2ZShjb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpCisJeworCQlyZXR1cm4oIGFRdWFsaWZpZWROYW1lSUQuZmluZChGUU5fSURfUk9PVF9TRVBBUkFUT1IpCisJCQkJPT0gc3RkOjpzdHJpbmc6Om5wb3MgKTsKKwl9CisKKworCWlubGluZSBzdGF0aWMgYm9vbCBpc051bGwoY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKQorCXsKKwkJcmV0dXJuKCAobm90IGFRdWFsaWZpZWROYW1lSUQuZW1wdHkoKSkKKwkJCQkmJiAoYVF1YWxpZmllZE5hbWVJRFsgMCBdID09ICc8JykKKwkJCQkmJiAoYVF1YWxpZmllZE5hbWVJRC5maW5kX2xhc3Rfb2YoIjpudWxsIikKKwkJCQkJCSE9IHN0ZDo6c3RyaW5nOjpucG9zKSApOworCX0KKworCWlubGluZSBzdGF0aWMgYm9vbCBpc1NpbXBsZW5hbWVJRChjb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpCisJeworCQlyZXR1cm4oIChhUXVhbGlmaWVkTmFtZUlELmZpbmRfbGFzdF9vZignLicpID09IHN0ZDo6c3RyaW5nOjpucG9zKQorCQkJCSYmIChhUXVhbGlmaWVkTmFtZUlELmZpbmQoRlFOX0lEX1JPT1RfU0VQQVJBVE9SKQorCQkJCQk9PSBzdGQ6OnN0cmluZzo6bnBvcykgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqICJuYW1lIiBvZiBhIFVTRVIgRk9STQorCSAqLworCWlubGluZSBjb25zdCBzdGQ6OnN0cmluZyAmIGdldFVucmVzdHJpY3RlZE5hbWUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVW5yZXN0cmljdGVkTmFtZSApOworCX0KKworCWlubGluZSBib29sIGhhc1VucmVzdHJpY3RlZE5hbWUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBub3QgbVVucmVzdHJpY3RlZE5hbWUuZW1wdHkoKSApOworCX0KKworCWlubGluZSBib29sIGhhc1JlYWxseVVucmVzdHJpY3RlZE5hbWUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobm90IG1VbnJlc3RyaWN0ZWROYW1lLmVtcHR5KCkpICYmCisJCQkJKG1VbnJlc3RyaWN0ZWROYW1lICE9IG1OYW1lSUQgKSApOworCX0KKworCWlubGluZSB2b2lkIHNldFVucmVzdHJpY3RlZE5hbWUoY29uc3Qgc3RkOjpzdHJpbmcgJiBuYW1lKQorCXsKKwkJbVVucmVzdHJpY3RlZE5hbWUgPSBuYW1lOworCX0KKworCisJLyoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogQ09NUEFSRVIgIEZPUiAgUVVBTElGSUVEIE5BTUUgSUQgIFNUUklORworCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKi8KKwlib29sIGNvbXBhcmVJRChjb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQsCisJCQlvcF9jb21wYXJlcl90IG9wKSBjb25zdDsKKworCS8qCisJICogIVVOVVNFRCEKKwlzdGF0aWMgYm9vbCBjb21wYXJlSUQoY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQsIG9wX2NvbXBhcmVyX3Qgb3ApOworCisJaW5saW5lIHN0YXRpYyBib29sIGNvbXBhcmVGdWxseVF1YWxpZmllZE5hbWVJRCgKKwkJCWNvbnN0IE5hbWVkRWxlbWVudCAqIGFuRWxlbWVudCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkKKwl7CisJCXJldHVybiggYW5FbGVtZW50LT5jb21wYXJlSUQoYVF1YWxpZmllZE5hbWVJRCwgT1BfU1RST05HX0NPTVBBUkVSKSApOworCX0KKwkqICFVTlVTRUQhCisJKi8KKworCWlubGluZSBzdGF0aWMgYm9vbCBjb21wYXJlTG9jYXRpb24oY29uc3QgTmFtZWRFbGVtZW50ICogYW5FbGVtZW50LAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKQorCXsKKwkJcmV0dXJuKCBhbkVsZW1lbnQtPmNvbXBhcmVJRChhUXVhbGlmaWVkTmFtZUlELCBPUF9BQlNPTFVURV9DT01QQVJFUikgKTsKKwl9CisKKwkvKgorCSAqICFVTlVTRUQhCisJaW5saW5lIHN0YXRpYyBib29sIGNvbXBhcmVRdWFsaWZpZWROYW1lSUQoCisJCQljb25zdCBOYW1lZEVsZW1lbnQgKiBhbkVsZW1lbnQsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpCisJeworCQlyZXR1cm4oIGNvbXBhcmVJRChhbkVsZW1lbnQsCisJCQkJYVF1YWxpZmllZE5hbWVJRCwgT1BfUVVBTElGSUVEX05BTUVfSURfQ09NUEFSRVIpICk7CisJfQorCSogIVVOVVNFRCEKKwkqLworCisJaW5saW5lIHN0YXRpYyBib29sIGZxblN0YXJ0c1dpdGgoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkKKwl7CisJCXJldHVybiggYUZ1bGx5UXVhbGlmaWVkTmFtZUlELmZpbmQoYVF1YWxpZmllZE5hbWVJRCkgPT0gMCApOworCX0KKworCWlubGluZSBzdGF0aWMgYm9vbCBmcW5FbmRzV2l0aCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlELAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKQorCXsKKwkJc3RkOjpzaXplX3QgcnBvcyA9IGFGdWxseVF1YWxpZmllZE5hbWVJRC5yZmluZChhUXVhbGlmaWVkTmFtZUlEKTsKKworCQlyZXR1cm4oIChycG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zKQorCQkJCSYmIChycG9zID09IChhRnVsbHlRdWFsaWZpZWROYW1lSUQubGVuZ3RoKCkKKwkJCQkJCS0gYVF1YWxpZmllZE5hbWVJRC5sZW5ndGgoKSkpCisJCQkJJiYgKCAocnBvcyA9PSAwKQorCQkJCQl8fCAoYUZ1bGx5UXVhbGlmaWVkTmFtZUlEW3Jwb3MtMV0gPT0gJy4nKQorCQkJCQl8fCAoYUZ1bGx5UXVhbGlmaWVkTmFtZUlEW3Jwb3MtMV0gPT0gJzonKSApICk7CisJfQorCisKKwkvKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBMSVNUIG9mIElEIG9mIFFVQUxJRklFRCBOQU1FIElECisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCXN0YXRpYyBhdm1fc2l6ZV90IGNvbGxlY3ROYW1lSUQoQ29sbGVjdGlvbjwgc3RkOjpzdHJpbmcgPiAmIGxpc3ROYW1lSUQsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQsIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgcG9zKTsKKworCWlubGluZSBzdGF0aWMgYXZtX3NpemVfdCBjb2xsZWN0TmFtZUlEKAorCQkJQ29sbGVjdGlvbjwgc3RkOjpzdHJpbmcgPiAmIGxpc3ROYW1lSUQsCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBpZ25vcmVQcmVmaXgpCisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoCisJCQkJYVF1YWxpZmllZE5hbWVJRC5maW5kKGlnbm9yZVByZWZpeCkgPT0gMCApCisJCQkJPDwgIkJhZCBwcmVmaXggc3RyaW5nIGluIE5hbWVkRWxlbWVudDo6bGlzdG9mSUQoIgorCQkJCTw8IGFRdWFsaWZpZWROYW1lSUQgPDwgIiwgIiA8PCBpZ25vcmVQcmVmaXggPDwgIikgISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQlyZXR1cm4gTmFtZWRFbGVtZW50Ojpjb2xsZWN0TmFtZUlEKGxpc3ROYW1lSUQsCisJCQkJYVF1YWxpZmllZE5hbWVJRCwgaWdub3JlUHJlZml4LnNpemUoKSk7CisJfQorCisJc3RhdGljIGF2bV9zaXplX3QgY29sbGVjdE5hbWVJRChDb2xsZWN0aW9uPCBzdGQ6OnN0cmluZyA+ICYgbGlzdE5hbWVJRCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCk7CisKKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwlpbmxpbmUgdmlydHVhbCBzdGQ6OnN0cmluZyBzdHJGUU4oCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGRlZmF1bHRGUU4gPSAiPHVuYW1lZC1lbGVtZW50PiIpIGNvbnN0CisJeworCQlyZXR1cm4oIGhhc0Z1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPyBtRnVsbHlRdWFsaWZpZWROYW1lSUQKKwkJCQk6ICggaGFzTmFtZUlEKCkgPyBtTmFtZUlECisJCQkJCTogKCBoYXNVbnJlc3RyaWN0ZWROYW1lKCkgPyAoIiciICsgbVVucmVzdHJpY3RlZE5hbWUgKyAiJyIpCisJCQkJCQk6IGRlZmF1bHRGUU4gKSApICk7CisKKwkJcmV0dXJuKCBkZWZhdWx0RlFOICk7CisJfQorCisJaW5saW5lIHZvaWQgdmlydHVhbCBzdHJGUU4oT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQlvcyA8PCBzdHJGUU4oKTsKKwl9CisKKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwlpbmxpbmUgdmlydHVhbCBzdGQ6OnN0cmluZyBzdHIoKSBjb25zdAorCXsKKwkJaWYoIG5vdCBnZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpLmVtcHR5KCkgKQorCQl7CisJCQlyZXR1cm4oIGdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgKTsKKwkJfQorCQllbHNlIGlmKCBub3QgZ2V0TmFtZUlEKCkuZW1wdHkoKSApCisJCXsKKwkJCXJldHVybiggZ2V0TmFtZUlEKCkgKTsKKwkJfQorCQlyZXR1cm4oIGdldFVucmVzdHJpY3RlZE5hbWUoKSApOworCX0KKworfTsKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qIENPTU1PTl9OQU1FREVMRU1FTlRfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbW1vbi9SRUFETUUubWQgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21tb24vUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYTlhMjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21tb24vUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTggQEAKKyMgRUZNLVNZTUJFWCA6IENvbW1vbgorCisjIyBTb3VyY2UgY29kZSBzdHJ1Y3R1cmUKKworIyMjIEludGVyZmFjZXMKKworIyMjIENsYXNzZXMKKyogKipSZWZlcmVuY2UgQ291bnRlcioqCisqICoqRWxlbWVudCoqCisqICoqTmFtZWRFbGVtZW50KioKKwktIE5hbWUgLyBJZGVudGlmaWVyCisJLSBVbnJlc3RyaWN0ZWROYW1lCisJLSBRdWFsaWZpZWROYW1lCisJLSBEZXNjcmlwdGlvbgorKiAqKlNtYXJ0IFBvaW50ZXIqKgorCisKKyMjIyBGYWN0b3JpZXMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbW1vbi9SdW5uYWJsZUVsZW1lbnQuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tbW9uL1J1bm5hYmxlRWxlbWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJmOWVhMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbW1vbi9SdW5uYWJsZUVsZW1lbnQuY3BwCkBAIC0wLDAgKzEsMjMxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMSBkw6ljLiAyMDExCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJSdW5uYWJsZUVsZW1lbnQuaCIKKworI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9RdWVyeS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvKioKKyAqIENPTlNUUlVDVE9SCisgKiBEZWZhdWx0CisgKi8KK1J1bm5hYmxlRWxlbWVudDo6UnVubmFibGVFbGVtZW50KFdPYmplY3QgKiB3ZlBhcmFtZXRlck9iamVjdCkKKzogTmFtZWRFbGVtZW50KCBDTEFTU19LSU5EX1QoIFJ1bm5hYmxlRWxlbWVudCApICwgd2ZQYXJhbWV0ZXJPYmplY3QgKSwKK1NlcmlhbGl6ZXJGZWF0dXJlKCApLAorbVBhcmFtZXRlcldPYmplY3QoIHdmUGFyYW1ldGVyT2JqZWN0ICksCittQ29uZmlnRmxhZyggZmFsc2UgKSwKKworbVJlcG9ydFByaW50RmxhZyggdHJ1ZSApLAorCittU3RhcnR1cExpZmVjeWNsZVN0YXR1cyggUlVOTkFCTEVfSURMRV9TVEFURSApLAorbVN0YXRpY0xpZmVjeWNsZVN0YXR1cyAoIFJVTk5BQkxFX1VOREVGSU5FRF9TVEFURSApLAorbUR5bmFtaWNMaWZlY3ljbGVTdGF0dXMoIFJVTk5BQkxFX1VOREVGSU5FRF9TVEFURSApCit7CisJLy8hISBOT1RISU5HCit9CisKK1J1bm5hYmxlRWxlbWVudDo6UnVubmFibGVFbGVtZW50KAorCQljbGFzc19raW5kX3QgYUNsYXNzS2luZCwgV09iamVjdCAqIHdmUGFyYW1ldGVyT2JqZWN0KQorOiBOYW1lZEVsZW1lbnQoIGFDbGFzc0tpbmQgLCB3ZlBhcmFtZXRlck9iamVjdCApLAorU2VyaWFsaXplckZlYXR1cmUoICksCittUGFyYW1ldGVyV09iamVjdCggd2ZQYXJhbWV0ZXJPYmplY3QgKSwKK21Db25maWdGbGFnKCBmYWxzZSApLAorCittUmVwb3J0UHJpbnRGbGFnKCB0cnVlICksCisKK21TdGFydHVwTGlmZWN5Y2xlU3RhdHVzKCBSVU5OQUJMRV9JRExFX1NUQVRFICksCittU3RhdGljTGlmZWN5Y2xlU3RhdHVzICggUlVOTkFCTEVfVU5ERUZJTkVEX1NUQVRFICksCittRHluYW1pY0xpZmVjeWNsZVN0YXR1cyggUlVOTkFCTEVfVU5ERUZJTkVEX1NUQVRFICkKK3sKKwkvLyEhIE5PVEhJTkcKK30KKworCisvKioKKyAqIFNFVFRFUgorICogbVBhcmFtZXRlcldPYmplY3QKKyAqLwordm9pZCBSdW5uYWJsZUVsZW1lbnQ6OnNldFBhcmFtZXRlcldPYmplY3QoV09iamVjdCAqIHdmUGFyYW1ldGVyT2JqZWN0KQoreworCW1QYXJhbWV0ZXJXT2JqZWN0ID0gd2ZQYXJhbWV0ZXJPYmplY3Q7CisKKwlpZiggKG1QYXJhbWV0ZXJXT2JqZWN0ICE9IFdPYmplY3Q6Ol9OVUxMXykKKwkJJiYgaXNVbmFtZWQoKSApCisJeworCQlzZXRBbGxOYW1lKCBtUGFyYW1ldGVyV09iamVjdCApOworCX0KK30KKworCisvKioKKyAqIENPTkZJR1VSRQorICovCitib29sIFJ1bm5hYmxlRWxlbWVudDo6Y29uZmlndXJlKCkKK3sKKwkvLyBJTklUSUFMSVpBVElPTgorCWNvbmZpZ3VyZURlYnVnKCk7CisKKwltQ29uZmlnRmxhZyA9IHRydWU7CisKKwlpZiggZ2V0UGFyYW1ldGVyV09iamVjdCgpICE9IFdPYmplY3Q6Ol9OVUxMXyApCisJeworCQltQ29uZmlnRmxhZyA9IFNlcmlhbGl6ZXJGZWF0dXJlOjpjb25maWd1cmUoIGdldFBhcmFtZXRlcldPYmplY3QoKSApOworCisJCW1SZXBvcnRQcmludEZsYWcgPSBRdWVyeTo6Z2V0V1Byb3BlcnR5Qm9vbGVhbigKKwkJCQlRdWVyeTo6Z2V0V1NlcXVlbmNlT3JFbHNlKAorCQkJCQkJZ2V0UGFyYW1ldGVyV09iamVjdCgpLCAiUFJPUEVSVFkiLCAiUkVQT1JUIiksCisJCQkJInJlcG9ydGluZyIsIHRydWUpOworCX0KKworCXJldHVybiggbUNvbmZpZ0ZsYWcgKTsKK30KKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorcHJvdG90eXBlIHByb2Nlc3M6Oi4uLiBhcyAmYXZtOjpwcm9jZXNzb3IuLi4gaXMKKwlzZWN0aW9uIFNDSEVEVUxJTkcKKwkJQHN0YXJ0dXAgPSAnd2FpdGluZyc7CisJZW5kc2VjdGlvbiBTQ0hFRFVMSU5HCitlbmRwcm90b3R5cGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK2Jvb2wgUnVubmFibGVFbGVtZW50Ojpjb25maWd1cmVMaWZlY3ljbGVTdGF0ZSgpCit7CisJbVN0YXJ0dXBMaWZlY3ljbGVTdGF0dXMgPSBSVU5OQUJMRV9JRExFX1NUQVRFOworCisJV09iamVjdCAqIHRoZUxJRkVDWUNMRSA9IFF1ZXJ5OjpnZXRSZWdleFdTZXF1ZW5jZShnZXRQYXJhbWV0ZXJXT2JqZWN0KCksCisJCQlPUl9XSUQ0KCJsaWZlY3ljbGUiLCAiTElGRUNZQ0xFIiwgInNjaGVkdWxpbmciLCAiU0NIRURVTElORyIpICk7CisKKwlpZiggdGhlTElGRUNZQ0xFICE9IFdPYmplY3Q6Ol9OVUxMXyApCisJeworCQlzdGQ6OnN0cmluZyBzdHJTdGFydHVwU3RhdHVzID0KKwkJCQlRdWVyeTo6Z2V0V1Byb3BlcnR5U3RyaW5nKHRoZUxJRkVDWUNMRSwgInN0YXJ0dXAiLCAicmVhZHkiKTsKKworCQltU3RhcnR1cExpZmVjeWNsZVN0YXR1cyA9CisJCQkJUnVubmFibGVFbGVtZW50Ojp0b0xpZmVjeWNsZShzdHJTdGFydHVwU3RhdHVzKTsKKworCQlTdHJpbmdUb29sczo6dG9sb3dlciggc3RyU3RhcnR1cFN0YXR1cyApOworCisJCWlmKCAobVN0YXJ0dXBMaWZlY3ljbGVTdGF0dXMgIT0gUlVOTkFCTEVfUkVBRFlfU1RBVEUpCisJCQkmJiAobVN0YXJ0dXBMaWZlY3ljbGVTdGF0dXMgIT0gUlVOTkFCTEVfU1RBTkRCWV9TVEFURSkgKQorCQl7CisJCQlBVk1fT1NfV0FSTiA8PCAiUnVubmFibGVFbGVtZW50Ojpjb25maWd1cmVMaWZlY3ljbGVTdGF0ZTo+ICIKKwkJCQkJIlVuZXhwZWN0ZWQgbGlmZWN5Y2xlIG90aGVyIHRoYW4gUkVBRFkgb3IgU1RBTkRCWSBzdGF0dXMgIgorCQkJCQkiZm9yIHN0YXJ0dXAgISEhIgorCQkJCQk8PCBzdGQ6OmVuZGw7CisKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KKworCW1EeW5hbWljTGlmZWN5Y2xlU3RhdHVzID0gbVN0YXJ0dXBMaWZlY3ljbGVTdGF0dXM7CisKKwltU3RhdGljTGlmZWN5Y2xlU3RhdHVzID0gUlVOTkFCTEVfQ09ORklHVVJFRF9TVEFURTsKKworCXJldHVybiggdHJ1ZSApOworfQorCisKK3ZvaWQgUnVubmFibGVFbGVtZW50Ojpjb25maWd1cmVEZWJ1ZygpCit7CitBVk1fSUZfREVCVUdfRkxBR19BTkQoIENPTkZJR1VSSU5HLCAoZ2V0UGFyYW1ldGVyV09iamVjdCgpICE9IFdPYmplY3Q6Ol9OVUxMXykgKQorCisJQVZNX09TX0xPRyA8PCBzdGQ6OmVuZGw7CisKKwlBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUEFSU0lORykKKworCQlnZXRQYXJhbWV0ZXJXT2JqZWN0KCktPnRvU3RyZWFtKEFWTV9PU19MT0cpOworCisJQVZNX0RFQlVHX0VMU0UKKworCQlBVk1fT1NfTE9HIDw8IHN0cl9oZWFkZXIoIGdldFBhcmFtZXRlcldPYmplY3QoKSApIDw8IHN0ZDo6ZW5kbDsKKworCUFWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQQVJTSU5HICkKKworQVZNX0VORElGX0RFQlVHX0ZMQUdfQU5EKCBDT05GSUdVUklORyApCit9CisKKworLyoqCisgKiBTRVJJQUxJWkFUSU9OIEFQSQorICovCitzdGQ6OnN0cmluZyBSdW5uYWJsZUVsZW1lbnQ6OnN0ckxpZmVjeWNsZShsaWZlY3ljbGVfc3RhdHVzX3QgYUxpZmVjeWNsZVN0YXR1cykKK3sKKwlzd2l0Y2goIGFMaWZlY3ljbGVTdGF0dXMpCisJeworCQljYXNlIFJVTk5BQkxFX0lETEVfU1RBVEUgICAgICAgIDogcmV0dXJuKCAiSURMRSIgICAgICAgICk7CisJCWNhc2UgUlVOTkFCTEVfUlVOTklOR19TVEFURSAgICAgOiByZXR1cm4oICJSVU5OSU5HIiAgICAgKTsKKworCQljYXNlIFJVTk5BQkxFX1dBSVRJTkdfU1RBVEUgICAgIDogcmV0dXJuKCAiV0FJVElORyIgICAgICk7CisJCWNhc2UgUlVOTkFCTEVfU1VTUEVOREVEX1NUQVRFICAgOiByZXR1cm4oICJTVVNQRU5ERUQiICAgKTsKKwkJY2FzZSBSVU5OQUJMRV9TVE9QUEVEX1NUQVRFICAgICA6IHJldHVybiggIlNUT1BQRUQiICAgICApOworCQljYXNlIFJVTk5BQkxFX0VYSVRFRF9TVEFURSAgICAgIDogcmV0dXJuKCAiRVhJVEVEIiAgICAgICk7CisKKwkJY2FzZSBSVU5OQUJMRV9DT05GSUdVUkVEX1NUQVRFICA6IHJldHVybiggIkNPTkZJR1VSRUQiICApOworCQljYXNlIFJVTk5BQkxFX0lOSVRJQUxJWkVEX1NUQVRFIDogcmV0dXJuKCAiSU5JVElBTElaRUQiICk7CisJCWNhc2UgUlVOTkFCTEVfU1RBUlRFRF9TVEFURSAgICAgOiByZXR1cm4oICJTVEFSVEVEIiAgICAgKTsKKwkJY2FzZSBSVU5OQUJMRV9SRUxFQVNFRF9TVEFURSAgICA6IHJldHVybiggIlJFTEVBU0VEIiAgICApOworCisJCWNhc2UgUlVOTkFCTEVfUkVBRFlfU1RBVEUgICAgICAgOiByZXR1cm4oICJSRUFEWSIgICAgICAgKTsKKwkJY2FzZSBSVU5OQUJMRV9TVEFOREJZX1NUQVRFICAgICA6IHJldHVybiggIlNUQU5EQlkiICAgICApOworCisJCWNhc2UgUlVOTkFCTEVfVU5ERUZJTkVEX1NUQVRFICAgOiByZXR1cm4oICJVTkRFRklORUQiICAgKTsKKworCQlkZWZhdWx0ICAgICAgICAgICAgICAgICAgICAgICAgIDogcmV0dXJuKCAiVU5LTk9XTiIgICAgICk7CisJfQorfQorCisKK1J1bm5hYmxlRWxlbWVudDo6bGlmZWN5Y2xlX3N0YXR1c190CitSdW5uYWJsZUVsZW1lbnQ6OnRvTGlmZWN5Y2xlKHN0ZDo6c3RyaW5nIGFMaWZlY3ljbGUpCit7CisJU3RyaW5nVG9vbHM6OnRvdXBwZXIoIGFMaWZlY3ljbGUgKTsKKworI2RlZmluZSBUT19MSUZFQ1lDTEUoIGxpZmVjeWNsZSApICBcCisJCWlmKCBhTGlmZWN5Y2xlID09ICNsaWZlY3ljbGUgKSAgcmV0dXJuKCBSVU5OQUJMRV8jI2xpZmVjeWNsZSMjX1NUQVRFICk7CisKKwlUT19MSUZFQ1lDTEUoIElETEUgICAgICAgICkKKwlUT19MSUZFQ1lDTEUoIFJVTk5JTkcgICAgICkKKworCVRPX0xJRkVDWUNMRSggV0FJVElORyAgICAgKQorCVRPX0xJRkVDWUNMRSggU1VTUEVOREVEICAgKQorCVRPX0xJRkVDWUNMRSggU1RPUFBFRCAgICAgKQorCVRPX0xJRkVDWUNMRSggRVhJVEVEICAgICAgKQorCisJVE9fTElGRUNZQ0xFKCBDT05GSUdVUkVEICApCisJVE9fTElGRUNZQ0xFKCBJTklUSUFMSVpFRCApCisJVE9fTElGRUNZQ0xFKCBTVEFSVEVEICAgICApCisJVE9fTElGRUNZQ0xFKCBSRUxFQVNFRCAgICApCisKKwlUT19MSUZFQ1lDTEUoIFJFQURZICAgICAgICkKKwlUT19MSUZFQ1lDTEUoIFNUQU5EQlkgICAgICkKKworCXJldHVybiggUlVOTkFCTEVfVU5ERUZJTkVEX1NUQVRFICk7Cit9CisKKworc3RkOjpzdHJpbmcgUnVubmFibGVFbGVtZW50OjpzdHJVbmlxSWQoKSBjb25zdAoreworCXJldHVybiggKG1QYXJhbWV0ZXJXT2JqZWN0ICE9IFdPYmplY3Q6Ol9OVUxMXykgPworCQkJbVBhcmFtZXRlcldPYmplY3QtPnN0clVuaXFJZCgpIDogIjxudWxsLXRocmVhZC1pZD4iICk7Cit9CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21tb24vUnVubmFibGVFbGVtZW50LmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21tb24vUnVubmFibGVFbGVtZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FhMTE2YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbW1vbi9SdW5uYWJsZUVsZW1lbnQuaApAQCAtMCwwICsxLDU4MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDEgZMOpYy4gMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIENPTU1PTl9SVU5OQUJMRUVMRU1FTlRfSF8KKyNkZWZpbmUgQ09NTU9OX1JVTk5BQkxFRUxFTUVOVF9IXworCisjaW5jbHVkZSA8Y29tbW9uL05hbWVkRWxlbWVudC5oPgorI2luY2x1ZGUgPGNvbW1vbi9TZXJpYWxpemVyRmVhdHVyZS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitlbnVtIEV4ZWNDbWRTdGF0dXMKK3sKKwlFWEVDX0NNRF9VTktOT1dOLAorCUVYRUNfQ01EX09LLAorCUVYRUNfQ01EX0VYSVQsCisJRVhFQ19DTURfRkFJTEVECit9OworCisKK2NsYXNzIFdPYmplY3Q7CisKKworY2xhc3MgUnVubmFibGVFbGVtZW50IDoKKwkJcHVibGljIE5hbWVkRWxlbWVudCwKKwkJcHVibGljIFNlcmlhbGl6ZXJGZWF0dXJlLAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIFJ1bm5hYmxlRWxlbWVudCApCit7CisKKworcHVibGljOgorCS8qKgorCSAqIFRZUEVERUYKKwkgKi8KKwl0eXBlZGVmIGF2bV91aW50MTZfdCAgICAgbGlmZWN5Y2xlX3N0YXR1c190OworCisJZW51bSB7CisJCVJVTk5BQkxFX1VOREVGSU5FRF9TVEFURSAgICAgICA9IDB4MDAwMCwKKworCisJCVJVTk5BQkxFX0NPTkZJR1VSRURfU1RBVEUgICAgICA9IDB4MDAwMSwKKworCQlSVU5OQUJMRV9JTklUSUFMSVpFRF9TVEFURSAgICAgPSAweDAwMDIsCisKKwkJUlVOTkFCTEVfU1RBUlRFRF9TVEFURSAgICAgICAgID0gMHgwMDA0LAorCisJCVJVTk5BQkxFX1JFTEVBU0VEX1NUQVRFICAgICAgICA9IDB4MDAwOCwKKworCisJCVJVTk5BQkxFX1JFQURZX1NUQVRFICAgICAgICAgICA9IDB4MDAxMCwKKworCQlSVU5OQUJMRV9TVEFOREJZX1NUQVRFICAgICAgICAgPSAweDAwMjAsCisKKworCQlSVU5OQUJMRV9JRExFX1NUQVRFICAgICAgICAgICAgPSAweDAwNDAsCisKKwkJUlVOTkFCTEVfUlVOTklOR19TVEFURSAgICAgICAgID0gMHgwMDgwLAorCisKKwkJUlVOTkFCTEVfV0FJVElOR19TVEFURSAgICAgICAgID0gMHgwMTAwLAorCisJCVJVTk5BQkxFX1NVU1BFTkRFRF9TVEFURSAgICAgICA9IDB4MDIwMCwKKworCisJCVJVTk5BQkxFX1NUT1BQRURfU1RBVEUgICAgICAgICA9IDB4MDQwMCwKKworCQlSVU5OQUJMRV9FWElURURfU1RBVEUgICAgICAgICAgPSAweDA4MDAsCisKKwkJLy8gQUxJQVNFUworCQlSVU5OQUJMRV9TVEFUSUNfUkVBRFlfU1RBVEUgICAgPSBSVU5OQUJMRV9JTklUSUFMSVpFRF9TVEFURQorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSVU5OQUJMRV9TVEFSVEVEX1NUQVRFCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJVTk5BQkxFX1JFQURZX1NUQVRFLAorCisJCVJVTk5BQkxFX0RZTkFNSUNfUkVBRFlfU1RBVEUgICA9IFJVTk5BQkxFX0lETEVfU1RBVEUKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUlVOTkFCTEVfUlVOTklOR19TVEFURSwKKworCQlSVU5OQUJMRV9BQ1RJVkVfU1RBVEUgICAgICAgICAgPSBSVU5OQUJMRV9TVEFSVEVEX1NUQVRFCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJVTk5BQkxFX1JFQURZX1NUQVRFCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJVTk5BQkxFX0lETEVfU1RBVEUKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUlVOTkFCTEVfUlVOTklOR19TVEFURQorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSVU5OQUJMRV9XQUlUSU5HX1NUQVRFCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJVTk5BQkxFX1NVU1BFTkRFRF9TVEFURSwKKworCQlSVU5OQUJMRV9JTkFDVElWRV9TVEFURSAgICAgICAgPSBSVU5OQUJMRV9TVEFOREJZX1NUQVRFCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJVTk5BQkxFX1NUT1BQRURfU1RBVEUKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUlVOTkFCTEVfUkVMRUFTRURfU1RBVEUKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUlVOTkFCTEVfRVhJVEVEX1NUQVRFCisJfTsKKworCisJc3RydWN0IEF1dG9SdW5uaW5nSWRsZVN3aXRjaGVyCisJeworCQlSdW5uYWJsZUVsZW1lbnQgJiBtUnVubmFibGVFbGVtZW50OworCisJCUF1dG9SdW5uaW5nSWRsZVN3aXRjaGVyKFJ1bm5hYmxlRWxlbWVudCAmIGFSdW5uYWJsZUVsZW1lbnQpCisJCTptUnVubmFibGVFbGVtZW50KCBhUnVubmFibGVFbGVtZW50ICkKKwkJeworCQkJbVJ1bm5hYmxlRWxlbWVudC5zZXRMaWZlY3ljbGVSdW5uaW5nKCk7CisJCX0KKworCQl+QXV0b1J1bm5pbmdJZGxlU3dpdGNoZXIoKQorCQl7CisJCQltUnVubmFibGVFbGVtZW50LnNldExpZmVjeWNsZUlkbGUoKTsKKwkJfQorCX07CisKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURQorCSAqLworCVdPYmplY3QgKiBtUGFyYW1ldGVyV09iamVjdDsKKworCS8vSW5kaWNhdGV1ciBkdSBib24gZMOpcm91bGVtZW50IGRlIGxhIHByb2PDqWR1cmUgPDwgY29uZmlndXJlKCkgPj4KKwlib29sIG1Db25maWdGbGFnOworCisJLy9JbmRpY2F0ZXVyIHBvdXIgYWZmaWNoZXIgdW4gcmFwcG9ydCBmaW5hbAorCWJvb2wgbVJlcG9ydFByaW50RmxhZzsKKworCWxpZmVjeWNsZV9zdGF0dXNfdCBtU3RhcnR1cExpZmVjeWNsZVN0YXR1czsKKworCWxpZmVjeWNsZV9zdGF0dXNfdCBtU3RhdGljTGlmZWN5Y2xlU3RhdHVzOworCisJbGlmZWN5Y2xlX3N0YXR1c190IG1EeW5hbWljTGlmZWN5Y2xlU3RhdHVzOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlSdW5uYWJsZUVsZW1lbnQoV09iamVjdCAqIHdmUGFyYW1ldGVyT2JqZWN0KTsKKworCVJ1bm5hYmxlRWxlbWVudChjbGFzc19raW5kX3QgYUNsYXNzS2luZCwgV09iamVjdCAqIHdmUGFyYW1ldGVyT2JqZWN0KTsKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqIEFic3RyYWN0IHB1cgorCSAqLworCVJ1bm5hYmxlRWxlbWVudChjb25zdCBSdW5uYWJsZUVsZW1lbnQgJiBhUnVubmFibGUpCisJOiBOYW1lZEVsZW1lbnQoIGFSdW5uYWJsZSApLAorCVNlcmlhbGl6ZXJGZWF0dXJlKCBhUnVubmFibGUgKSwKKwltUGFyYW1ldGVyV09iamVjdCggYVJ1bm5hYmxlLm1QYXJhbWV0ZXJXT2JqZWN0ICksCisJbUNvbmZpZ0ZsYWcoIGFSdW5uYWJsZS5tQ29uZmlnRmxhZyApLAorCisJbVJlcG9ydFByaW50RmxhZyggYVJ1bm5hYmxlLm1SZXBvcnRQcmludEZsYWcgKSwKKworCW1TdGFydHVwTGlmZWN5Y2xlU3RhdHVzKCBhUnVubmFibGUubVN0YXJ0dXBMaWZlY3ljbGVTdGF0dXMgKSwKKwltU3RhdGljTGlmZWN5Y2xlU3RhdHVzICggYVJ1bm5hYmxlLm1TdGF0aWNMaWZlY3ljbGVTdGF0dXMgICksCisJbUR5bmFtaWNMaWZlY3ljbGVTdGF0dXMoIGFSdW5uYWJsZS5tRHluYW1pY0xpZmVjeWNsZVN0YXR1cyApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+UnVubmFibGVFbGVtZW50KCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVBhcmFtZXRlcldPYmplY3QKKwkgKi8KKwlpbmxpbmUgV09iamVjdCAqIGdldFBhcmFtZXRlcldPYmplY3QoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUGFyYW1ldGVyV09iamVjdCApOworCX0KKworCWlubGluZSBib29sIGhhc1BhcmFtZXRlcldPYmplY3QoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUGFyYW1ldGVyV09iamVjdCAhPSBOVUxMIC8qV09iamVjdDo6X05VTExfKi8gKTsKKwl9CisKKwl2b2lkIHNldFBhcmFtZXRlcldPYmplY3QoV09iamVjdCAqIHdmUGFyYW1ldGVyT2JqZWN0KTsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFJVTk5BQkxFIExJRkVDWUNMRSBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtU3RhdGljTGlmZWN5Y2xlU3RhdHVzCisJICovCisJaW5saW5lIGJvb2wgaXNMaWZlY3ljbGVDb25maWd1cmVkKCkgY29uc3QKKwl7CisJCXJldHVybiggKG1TdGF0aWNMaWZlY3ljbGVTdGF0dXMgJiBSVU5OQUJMRV9DT05GSUdVUkVEX1NUQVRFKSAhPSAwICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0TGlmZWN5Y2xlQ29uZmlndXJlZCgpCisJeworCQltU3RhdGljTGlmZWN5Y2xlU3RhdHVzID0gUlVOTkFCTEVfQ09ORklHVVJFRF9TVEFURTsKKwl9CisKKworCWlubGluZSBib29sIGlzTGlmZWN5Y2xlSW5pdGlhbGl6ZWQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobVN0YXRpY0xpZmVjeWNsZVN0YXR1cyAmIFJVTk5BQkxFX0lOSVRJQUxJWkVEX1NUQVRFKSAhPSAwICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0TGlmZWN5Y2xlSW5pdGlhbGl6ZWQoKQorCXsKKwkJbVN0YXRpY0xpZmVjeWNsZVN0YXR1cyA9IFJVTk5BQkxFX0lOSVRJQUxJWkVEX1NUQVRFOworCX0KKworCisJaW5saW5lIGJvb2wgaXNMaWZlY3ljbGVTdGFydGVkKCkgY29uc3QKKwl7CisJCXJldHVybiggKG1TdGF0aWNMaWZlY3ljbGVTdGF0dXMgJiBSVU5OQUJMRV9TVEFSVEVEX1NUQVRFKSAhPSAwICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0TGlmZWN5Y2xlU3RhcnRlZCgpCisJeworCQltU3RhdGljTGlmZWN5Y2xlU3RhdHVzID0gUlVOTkFCTEVfU1RBUlRFRF9TVEFURTsKKwl9CisKKworCWlubGluZSBib29sIGlzTGlmZWN5Y2xlUmVsZWFzZWQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobVN0YXRpY0xpZmVjeWNsZVN0YXR1cyAmIFJVTk5BQkxFX1JFTEVBU0VEX1NUQVRFKSAhPSAwICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0TGlmZWN5Y2xlUmVsZWFzZWQoKQorCXsKKwkJbVN0YXRpY0xpZmVjeWNsZVN0YXR1cyA9IFJVTk5BQkxFX1JFTEVBU0VEX1NUQVRFOworCX0KKworCisJaW5saW5lIGJvb2wgaXNMaWZlY3ljbGVTdG9wcGVkKCkgY29uc3QKKwl7CisJCXJldHVybiggKG1TdGF0aWNMaWZlY3ljbGVTdGF0dXMgJiBSVU5OQUJMRV9TVE9QUEVEX1NUQVRFKSAhPSAwICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0TGlmZWN5Y2xlU3RvcHBlZCgpCisJeworCQltU3RhdGljTGlmZWN5Y2xlU3RhdHVzID0gUlVOTkFCTEVfU1RPUFBFRF9TVEFURTsKKwl9CisKKworCWlubGluZSBib29sIGlzTGlmZWN5Y2xlRXhpdGVkKCkgY29uc3QKKwl7CisJCXJldHVybiggKG1TdGF0aWNMaWZlY3ljbGVTdGF0dXMgJiBSVU5OQUJMRV9FWElURURfU1RBVEUpICE9IDAgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRMaWZlY3ljbGVFeGl0ZWQoKQorCXsKKwkJbVN0YXRpY0xpZmVjeWNsZVN0YXR1cyA9IFJVTk5BQkxFX0VYSVRFRF9TVEFURTsKKwl9CisKKworCWlubGluZSBib29sIGlzTGlmZWN5Y2xlUmVhZHkoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobVN0YXRpY0xpZmVjeWNsZVN0YXR1cyAmIFJVTk5BQkxFX1JFQURZX1NUQVRFKSAhPSAwICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0TGlmZWN5Y2xlUmVhZHkoKQorCXsKKwkJbVN0YXRpY0xpZmVjeWNsZVN0YXR1cyA9IFJVTk5BQkxFX1JFQURZX1NUQVRFOworCX0KKworCisJaW5saW5lIGJvb2wgaXNMaWZlY3ljbGVTdGFuZGJ5KCkgY29uc3QKKwl7CisJCXJldHVybiggKG1TdGF0aWNMaWZlY3ljbGVTdGF0dXMgJiBSVU5OQUJMRV9TVEFOREJZX1NUQVRFKSAhPSAwICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0TGlmZWN5Y2xlU3RhbmRieSgpCisJeworCQltU3RhdGljTGlmZWN5Y2xlU3RhdHVzID0gUlVOTkFCTEVfU1RBTkRCWV9TVEFURTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1TdGF0aWNMaWZlY3ljbGVTdGF0dXMKKwkgKi8KKwlpbmxpbmUgYm9vbCBpc0xpZmVjeWNsZUlkbGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobUR5bmFtaWNMaWZlY3ljbGVTdGF0dXMgJiBSVU5OQUJMRV9JRExFX1NUQVRFKSAhPSAwICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0TGlmZWN5Y2xlSWRsZSgpCisJeworCQltRHluYW1pY0xpZmVjeWNsZVN0YXR1cyA9IFJVTk5BQkxFX0lETEVfU1RBVEU7CisJfQorCisKKwlpbmxpbmUgYm9vbCBpc0xpZmVjeWNsZVJ1bm5pbmcoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobUR5bmFtaWNMaWZlY3ljbGVTdGF0dXMgJiBSVU5OQUJMRV9SVU5OSU5HX1NUQVRFKSAhPSAwICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0TGlmZWN5Y2xlUnVubmluZygpCisJeworCQltRHluYW1pY0xpZmVjeWNsZVN0YXR1cyA9IFJVTk5BQkxFX1JVTk5JTkdfU1RBVEU7CisJfQorCisKKwlpbmxpbmUgYm9vbCBpc0xpZmVjeWNsZVdhaXRpbmcoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobUR5bmFtaWNMaWZlY3ljbGVTdGF0dXMgJiBSVU5OQUJMRV9XQUlUSU5HX1NUQVRFKSAhPSAwICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0TGlmZWN5Y2xlV2FpdGluZygpCisJeworCQltRHluYW1pY0xpZmVjeWNsZVN0YXR1cyA9IFJVTk5BQkxFX1dBSVRJTkdfU1RBVEU7CisJfQorCisKKwlpbmxpbmUgYm9vbCBpc0xpZmVjeWNsZVN1c3BlbmRlZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIChtRHluYW1pY0xpZmVjeWNsZVN0YXR1cyAmIFJVTk5BQkxFX1NVU1BFTkRFRF9TVEFURSkgIT0gMCApOworCX0KKworCWlubGluZSB2b2lkIHNldExpZmVjeWNsZVN1c3BlbmRlZCgpCisJeworCQltRHluYW1pY0xpZmVjeWNsZVN0YXR1cyA9IFJVTk5BQkxFX1NVU1BFTkRFRF9TVEFURTsKKwl9CisKKworCS8qKgorCSAqIFRFU1RFUgorCSAqIExpZmVjeWNsZVN0YXR1cworCSAqLworCWlubGluZSBib29sIGlzTGlmZWN5Y2xlQWN0aXZlKCkgY29uc3QKKwl7CisJCXJldHVybiggKG1TdGF0aWNMaWZlY3ljbGVTdGF0dXMgJiBSVU5OQUJMRV9BQ1RJVkVfU1RBVEUpICE9IDAgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc0xpZmVjeWNsZUluYWN0aXZlKCkgY29uc3QKKwl7CisJCXJldHVybiggKG1TdGF0aWNMaWZlY3ljbGVTdGF0dXMgJiBSVU5OQUJMRV9JTkFDVElWRV9TVEFURSkgIT0gMCApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgYm9vbCBpc0xpZmVjeWNsZVJ1bm5hYmxlKCljb25zdAorCXsKKwkJcmV0dXJuKCAoKG1EeW5hbWljTGlmZWN5Y2xlU3RhdHVzICYgUlVOTkFCTEVfRFlOQU1JQ19SRUFEWV9TVEFURSkgIT0gMCkKKwkJCSYmICgobVN0YXRpY0xpZmVjeWNsZVN0YXR1cyAmIFJVTk5BQkxFX1NUQVRJQ19SRUFEWV9TVEFURSkgIT0gMCkgKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBTVEFSVCAvIFNUT1AgLyBLSUxMIC8gU1VTUEVORCAvIFJFU1VNRSAgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLwl2aXJ0dWFsIGludCBzdGFydCgpCisvLwl7CisvLwkJLy8hISBOT1RISU5HCisvLwkJcmV0dXJuKCB0cnVlICk7CisvLwl9CisKKwlpbmxpbmUgdmlydHVhbCBpbnQgc3RvcCgpCisJeworCQlzZXRMaWZlY3ljbGVTdG9wcGVkKCk7CisKKwkJLy8hISBOT1RISU5HCisJCXJldHVybiggMCApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgaW50IGtpbGwoKQorCXsKKwkJc2V0TGlmZWN5Y2xlU3RvcHBlZCgpOworCisJCS8vISEgTk9USElORworCQlyZXR1cm4oIDAgKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIGJvb2wgc3VzcGVuZCgpCisJeworCQlzZXRMaWZlY3ljbGVTdXNwZW5kZWQoKTsKKworCQkvLyEhIE5PVEhJTkcKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgYm9vbCByZXN1bWUoKQorCXsKKwkJc2V0TGlmZWN5Y2xlSWRsZSgpOworCisJCS8vISEgTk9USElORworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBDT05GSUdVUkUgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJdmlydHVhbCBib29sIGNvbmZpZ3VyZSgpOworCisJYm9vbCBjb25maWd1cmVMaWZlY3ljbGVTdGF0ZSgpOworCisJdmlydHVhbCB2b2lkIGNvbmZpZ3VyZURlYnVnKCk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBJTklUIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXZpcnR1YWwgYm9vbCBpbml0SW1wbCgpID0gMDsKKworCWlubGluZSB2aXJ0dWFsIGJvb2wgaW5pdCgpCisJeworCQlpZiggaW5pdEltcGwoKSApCisJCXsKKwkJCXNldExpZmVjeWNsZUluaXRpYWxpemVkKCk7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIEVYSVQgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJdmlydHVhbCBib29sIGV4aXRJbXBsKCkgPSAwOworCisJaW5saW5lIHZpcnR1YWwgYm9vbCBleGl0KCkKKwl7CisJCWlmKCBleGl0SW1wbCgpICkKKwkJeworCQkJc2V0TGlmZWN5Y2xlRXhpdGVkKCk7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFJFUE9SVCBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHJlcG9ydChPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCWlmKCBtUmVwb3J0UHJpbnRGbGFnICkKKwkJeworCQkJQVZNX1ZFUkJPU0lUWV9TV0lUQ0hfU0lMRU5UCisKKwkJCQlyZXBvcnRTaWxlbnQob3MpOworCisJCQlBVk1fVkVSQk9TSVRZX1NXSVRDSF9DQVNFX01JTklNVU0KKworCQkJCXJlcG9ydE1pbmltdW0ob3MpOworCisJCQlBVk1fVkVSQk9TSVRZX1NXSVRDSF9DQVNFX01FRElVTQorCisJCQkJcmVwb3J0TWVkaXVtKG9zKTsKKworCQkJQVZNX1ZFUkJPU0lUWV9TV0lUQ0hfQ0FTRV9NQVhJTVVNCisKKwkJCQlyZXBvcnRNYXhpbXVtKG9zKTsKKworCQkJQVZNX1ZFUkJPU0lUWV9TV0lUQ0hfRU5ECisJCX0KKwl9CisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHJlcG9ydChQYWlyT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQlyZXBvcnQoIG9zLk9TMSApOworCQlyZXBvcnQoIG9zLk9TMiApOworCX0KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgcmVwb3J0KFRyaXBsZU91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJcmVwb3J0KCBvcy5PUzEgKTsKKwkJcmVwb3J0KCBvcy5PUzIgKTsKKwkJcmVwb3J0KCBvcy5PUzMgKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIHZvaWQgcmVwb3J0U2lsZW50KE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJcmVwb3J0TWluaW11bShvcyk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCByZXBvcnRNaW5pbXVtKE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJcmVwb3J0RGVmYXVsdChvcyk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCByZXBvcnRNZWRpdW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQlyZXBvcnREZWZhdWx0KG9zKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHJlcG9ydE1heGltdW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQlyZXBvcnREZWZhdWx0KG9zKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHJlcG9ydERlZmF1bHQoT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFBST0NFU1MgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJaW5saW5lIHZpcnR1YWwgYm9vbCBwcmVwcm9jZXNzKCkKKwl7CisJCS8vISEgTk9USElORworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBib29sIHBvc3Rwcm9jZXNzKCkKKwl7CisJCS8vISEgTk9USElORworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBTRVJJQUxJWkFUSU9OIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXN0YXRpYyBzdGQ6OnN0cmluZyBzdHJMaWZlY3ljbGUobGlmZWN5Y2xlX3N0YXR1c190IGFMaWZlY3ljbGVTdGF0dXMpOworCisJc3RhdGljIGxpZmVjeWNsZV9zdGF0dXNfdCB0b0xpZmVjeWNsZShzdGQ6OnN0cmluZyBhTGlmZWN5Y2xlKTsKKworCWlubGluZSBzdGQ6OnN0cmluZyBzdHJEeW5hbWljTGlmZWN5Y2xlU3RhdHVzKCkgY29uc3QKKwl7CisJCXJldHVybiggc3RyTGlmZWN5Y2xlKG1EeW5hbWljTGlmZWN5Y2xlU3RhdHVzKSApOworCX0KKworCWlubGluZSBzdGQ6OnN0cmluZyBzdHJTdGF0aWNMaWZlY3ljbGVTdGF0dXMoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBzdHJMaWZlY3ljbGUobVN0YXRpY0xpZmVjeWNsZVN0YXR1cykgKTsKKwl9CisKKwlpbmxpbmUgT3V0U3RyZWFtICYgc3RyTGlmZWN5Y2xlU3RhdHVzKE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJb3MgPDwgIjwgZHluYW1pYzoiIDw8IHN0ckxpZmVjeWNsZShtU3RhdGljTGlmZWN5Y2xlU3RhdHVzKQorCQkJPDwgIiAsIHN0YXRpYzoiIDw8IHN0ckxpZmVjeWNsZShtRHluYW1pY0xpZmVjeWNsZVN0YXR1cykgPDwgIiA+IjsKKworCQlyZXR1cm4oIG9zICk7CisJfQorCisJdmlydHVhbCBzdGQ6OnN0cmluZyBzdHJVbmlxSWQoKSBjb25zdDsKKworCWlubGluZSB2aXJ0dWFsIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKK307CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKiBDT01NT05fUlVOTkFCTEVFTEVNRU5UX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21tb24vU2VyaWFsaXplckZlYXR1cmUuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tbW9uL1NlcmlhbGl6ZXJGZWF0dXJlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzY1YzUxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tbW9uL1NlcmlhbGl6ZXJGZWF0dXJlLmNwcApAQCAtMCwwICsxLDY3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDIzIG5vdi4gMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiU2VyaWFsaXplckZlYXR1cmUuaCIKKworI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9RdWVyeS5oPgorI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9XT2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx1dGlsL2F2bV92ZnMuaD4KKworI2luY2x1ZGUgPGJvb3N0L3Rva2VuaXplci5ocHA+CisKKworbmFtZXNwYWNlIHNlcAoreworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitwcm90b3R5cGUgZmlsdGVyOjpmaWx0ZXJfdWZpZCBhcyBhdm06OmNvcmUuZmlsdGVyLmZpbHRlcl90eXBlIGlzCisJc2VjdGlvbiBQUk9QRVJUWQorCQkuLi4KKwllbmRzZWN0aW9uIFBST1BFUlRZCisKKwlzZWN0aW9uIFJFUE9SVAorCQlAdXJpID0gc3RkICAgICAgIjoiICggImNvdXQiIHwgImNlcnIiICApCisJCSAgICAgfCBhdm0gICAgICAiOiIgKCAibG9nIiAgfCAidHJhY2UiICkKKwkJICAgICB8IGZvbGRlciAgICI6IiBwYXRoCisJCSAgICAgfCBmaWxlICAgICAiOiIgcGF0aAorCQkgICAgIHwgZmlsZW5hbWUgIjoiIHBhdGgKKwkJICAgICB8IHNvY2tldCAgICI6IiBob3N0ICI6IiBwb3J0CisJCSAgICAgOworCQlAdXJpID0gLi4uOworCisJCUB3aGVuID0gWyBpbml0IF1bOl0KKwkJICAgICAgICBbIG90ZiB8IChldmVyeSB8IGFmdGVyIHwgYmVmb3JlKSA/IHZhbHVlI3VuaXRdWzpdWyBleGl0IF07CisKKwllbmRzZWN0aW9uIFJFUE9SVAorCitlbmRwcm90b3R5cGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworCitzdGF0aWMgYm9vbCBzY2FuUGVyaW9kKHN0ZDo6c3RyaW5nIHBlcmlvZCwKKwkJYXZtX2RlbGF5X3ZhbHVlX3QgJiB2YWx1ZSwgYXZtX3VuaXRfdCAmIHVuaXQpCit7CisJaWYoIDo6aXNkaWdpdChwZXJpb2RbMF0pICkKKwl7CisJCXN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgcG9zID0gcGVyaW9kLmZpbmQoJyMnKTsKKworCQlpZiggcG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKwkJeworCQkJaWYoIG5vdCBzZXA6OmZyb21fc3RyaW5nPGF2bV9kZWxheV92YWx1ZV90PigKKwkJCQkJcGVyaW9kLnN1YnN0cigwLCBwb3MpLCB2YWx1ZSwgc3RkOjpkZWMpICkKKwkJCXsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlwZXJpb2QgPSBwZXJpb2Quc3Vic3RyKHBvcysxKTsKKworCQkJaWYoIHBlcmlvZCA9PSAibnMiICkKKwkJCXsKKwkJCQl1bml0ID0gQVZNX05BTk9fU0VDT05EX1VOSVQ7CisJCQl9CisJCQllbHNlIGlmKCBwZXJpb2QgPT0gIsK1cyIgKQorCQkJeworCQkJCXVuaXQgPSBBVk1fTUlDUk9fU0VDT05EX1VOSVQ7CisJCQl9CisJCQllbHNlIGlmKCBwZXJpb2QgPT0gIm1zIiApCisJCQl7CisJCQkJdW5pdCA9IEFWTV9NSUxMSV9TRUNPTkRfVU5JVDsKKwkJCX0KKwkJCWVsc2UgaWYoIHBlcmlvZCA9PSAicyIgKQorCQkJeworCQkJCXVuaXQgPSBBVk1fU0VDT05EX1VOSVQ7CisJCQl9CisJCQllbHNlIGlmKCBwZXJpb2QgPT0gIm1pbiIgKQorCQkJeworCQkJCXVuaXQgPSBBVk1fTUlOVVRFX1VOSVQ7CisJCQl9CisJCQllbHNlIGlmKCBwZXJpb2QgPT0gImgiICkKKwkJCXsKKwkJCQl1bml0ID0gQVZNX0hPVVJfVU5JVDsKKwkJCX0KKwkJCWVsc2UgaWYoIHBlcmlvZCA9PSAic3RlcCIgKQorCQkJeworCQkJCXVuaXQgPSBBVk1fU1RFUF9VTklUOworCQkJfQorCQkJZWxzZSBpZiggUkVHRVhfTUFUQ0gocGVyaW9kICwgQ09OU19XSUQyKCJtaWNybyIsICJzdGVwIikpICkKKwkJCXsKKwkJCQl1bml0ID0gQVZNX01JQ1JPX1NURVBfVU5JVDsKKwkJCX0KKwkJCWVsc2UgaWYoIFJFR0VYX01BVENIKHBlcmlvZCAsIENPTlNfV0lEMigibWFjcm8iLCAic3RlcCIpKSApCisJCQl7CisJCQkJdW5pdCA9IEFWTV9NQUNST19TVEVQX1VOSVQ7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKworCXJldHVybiBmYWxzZTsKK30KKworYm9vbCBTZXJpYWxpemVyRmVhdHVyZTo6Y29uZmlndXJlKFdPYmplY3QgKiB3ZlBhcmFtZXRlck9iamVjdCkKK3sKKwlib29sIGlzQ29uZmlnT0sgPSB0cnVlOworCisJV09iamVjdCAqIHRoZVZGUyA9IFF1ZXJ5OjpnZXRSZWdleFdTZXF1ZW5jZSgKKwkJCXdmUGFyYW1ldGVyT2JqZWN0LCBPUl9XSUQyKCJ2ZnMiLCAiVkZTIikpOworCisJaWYoIHRoZVZGUyA9PSBXT2JqZWN0OjpfTlVMTF8gKQorCXsKKwkJdGhlVkZTID0gUXVlcnk6OmdldFJlZ2V4V1NlcXVlbmNlKAorCQkJCXdmUGFyYW1ldGVyT2JqZWN0LCBPUl9XSUQyKCJyZXBvcnQiLCAiUkVQT1JUIikpOworCX0KKworCWlmKCB0aGVWRlMgIT0gV09iamVjdDo6X05VTExfICkKKwl7CisJCW1SZXBvcnREZXRhaWxzRmxhZyA9CisJCQkJUXVlcnk6OmdldFdQcm9wZXJ0eUJvb2xlYW4odGhlVkZTLCAiZGV0YWlscyIsIGZhbHNlKTsKKworCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkJLy8gVGhlIHJlcG9ydCBtVGFibGVPZlVSSSBBdHRyaWJ1dGVzCisJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQlsYXN0Rm9sZGVyLmxvY2F0aW9uID0gVkZTOjpQcm9qZWN0T3V0cHV0UGF0aDsKKworCQlzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIHBvczsKKwkJc3RkOjpzdHJpbmcgc2NoZW1lOworCQlzdGQ6OnN0cmluZyBhdHRySUQ7CisKKwkJV09iamVjdDo6Y29uc3RfaXRlcmF0b3IgaXRXZk8gPSB0aGVWRlMtPm93bmVkX2JlZ2luKCk7CisJCVdPYmplY3Q6OmNvbnN0X2l0ZXJhdG9yIGVuZFdmTyA9IHRoZVZGUy0+b3duZWRfZW5kKCk7CisJCWZvciggOyBpdFdmTyAhPSBlbmRXZk8gOyArK2l0V2ZPICkKKwkJeworCQkJaWYoICgqaXRXZk8pLT5pc1dQcm9wZXJ0eSgpICkKKwkJCXsKKwkJCQlzY2hlbWUgPSBhdHRySUQgPSAoKml0V2ZPKS0+Z2V0TmFtZUlEKCk7CisKKwkJCQlBdm1VcmkgJiB1cmkgPSBhcHBlbmRVcmkoICgqaXRXZk8pLT50b1N0cmluZ1ZhbHVlKCkgKTsKKworCQkJCWlmKCBTdHJpbmdUb29sczo6c3RhcnRzV2l0aChzY2hlbWUsICJ1cmkiKSApCisJCQkJeworCQkJCQlwb3MgPSB1cmkucmF3LmZpbmQoJzonKTsKKwkJCQkJaWYoIHBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisJCQkJCXsKKwkJCQkJCXNjaGVtZSA9IHVyaS5yYXcuc3Vic3RyKDAsIHBvcyk7CisJCQkJCQl1cmkubG9jYXRpb24gPSB1cmkucmF3LnN1YnN0cihwb3MrMSk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcG9zID0gc2NoZW1lLmZpbmQoJyMnKTsKKwkJCQkJaWYoIHBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisJCQkJCXsKKwkJCQkJCXNjaGVtZSA9IHNjaGVtZS5zdWJzdHIoMCwgcG9zKTsKKwkJCQkJfQorCQkJCQl1cmkubG9jYXRpb24gPSB1cmkucmF3OworCQkJCX0KKworCQkJCWlmKCBzY2hlbWUuZW1wdHkoKSApCisJCQkJeworCQkJCQl0aGVWRlMtPmVycm9yTG9jYXRpb24oQVZNX09TX1dBUk4pCisJCQkJCQkJPDwgIkV4cGVjdGVkIGFuIHVyaSBsaWtlOj4gIgorCQkJCQkJCTw8ICJzdGQ6c3RyZWFtIHwgZmlsZTpwYXRoIHwgc29ja2V0Omhvc3Q6cG9ydCAhISEiCisJCQkJCQkJPDwgc3RkOjplbmRsOworCisJCQkJCWRlc3Ryb3lMYXN0VXJpKCk7CisKKwkJCQkJaXNDb25maWdPSyA9IGZhbHNlOworCisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCisJCQkJaWYoIFN0cmluZ1Rvb2xzOjpzdGFydHNXaXRoKHNjaGVtZSwgInN0cmVhbSIpICkKKwkJCQl7CisJCQkJCWlmKCBjb25maWd1cmVTdHJlYW0odGhlVkZTLCB1cmkpICkKKwkJCQkJeworCQkJCQkJbWFwVXJpKGF0dHJJRCwgdXJpKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCWRlc3Ryb3lMYXN0VXJpKCk7CisKKwkJCQkJCWlzQ29uZmlnT0sgPSBmYWxzZTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWVsc2UgaWYoIFN0cmluZ1Rvb2xzOjpzdGFydHNXaXRoKHNjaGVtZSwgImZvbGRlciIpICkKKwkJCQl7CisJCQkJCWlmKCBjb25maWd1cmVGb2xkZXIodGhlVkZTLCB1cmkpICkKKwkJCQkJeworCQkJCQkJbWFwVXJpKGF0dHJJRCwgdXJpKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCWRlc3Ryb3lMYXN0VXJpKCk7CisKKwkJCQkJCWlzQ29uZmlnT0sgPSBmYWxzZTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWVsc2UgaWYoIFN0cmluZ1Rvb2xzOjpzdGFydHNXaXRoKHNjaGVtZSwgImZpbGUiKSApCisJCQkJeworCQkJCQlpZiggY29uZmlndXJlRmlsZSh0aGVWRlMsIHVyaSkgKQorCQkJCQl7CisJCQkJCQltYXBVcmkoYXR0cklELCB1cmkpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJZGVzdHJveUxhc3RVcmkoKTsKKworCQkJCQkJaXNDb25maWdPSyA9IGZhbHNlOworCQkJCQl9CisJCQkJfQorCisJCQkJZWxzZSBpZiggU3RyaW5nVG9vbHM6OnN0YXJ0c1dpdGgoc2NoZW1lLCAiZmlsZW5hbWUiKSApCisJCQkJeworCQkJCQlpZiggY29uZmlndXJlRmlsZW5hbWUodGhlVkZTLCB1cmkpICkKKwkJCQkJeworCQkJCQkJbWFwVXJpKGF0dHJJRCwgdXJpKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCWRlc3Ryb3lMYXN0VXJpKCk7CisKKwkJCQkJCWlzQ29uZmlnT0sgPSBmYWxzZTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWVsc2UgaWYoIFN0cmluZ1Rvb2xzOjpzdGFydHNXaXRoKHNjaGVtZSwgInNvY2tldCIpICkKKwkJCQl7CisJCQkJCWlmKCBjb25maWd1cmVTb2NrZXQodGhlVkZTLCB1cmkpICkKKwkJCQkJeworCQkJCQkJbWFwVXJpKGF0dHJJRCwgdXJpKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCWRlc3Ryb3lMYXN0VXJpKCk7CisKKwkJCQkJCWlzQ29uZmlnT0sgPSBmYWxzZTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWVsc2UKKwkJCQl7CisJCQkJCXRoZVZGUy0+ZXJyb3JMb2NhdGlvbihBVk1fT1NfV0FSTikKKwkJCQkJCQk8PCAiRXhwZWN0ZWQgYW4gdXJpIGxpa2U6PiAiCisJCQkJCQkJPDwgInN0ZDpzdHJlYW0gfCBmaWxlOnBhdGggfCBzb2NrZXQ6aG9zdDpwb3J0ICEhISIKKwkJCQkJCQk8PCBzdGQ6OmVuZGw7CisKKwkJCQkJZGVzdHJveUxhc3RVcmkoKTsKKworCQkJCQlpc0NvbmZpZ09LID0gZmFsc2U7CisJCQkJfQorCQkJfQorCQl9CisKKworCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkJLy8gVGhlIHJlcG9ydCBQRVJJT0QgQXR0cmlidXRlCisJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQlzdGQ6OnN0cmluZyBzdHJQZXJpb2QgPSBRdWVyeTo6Z2V0V1Byb3BlcnR5U3RyaW5nKHRoZVZGUywgIndoZW4iLCAiIik7CisJCWlmKCBub3Qgc3RyUGVyaW9kLmVtcHR5KCkgKQorCQl7CisJCQlpc0NvbmZpZ09LID0gY29uZmlndXJlUGVyaW9kKHRoZVZGUywgc3RyUGVyaW9kKQorCQkJCQkJJiYgaXNDb25maWdPSzsKKwkJfQorCisKKwkJaWYoIG1SZXBvcnREZXRhaWxzRmxhZyApCisJCXsKKwkJCVNlcmlhbGl6ZXJGZWF0dXJlOjp0b1N0cmVhbShBVk1fT1NfQ09VVCk7CisJCX0KKwl9CisJZWxzZQorCXsKKy8vCQl0aGVWRlMtPmVycm9yTG9jYXRpb24oQVZNX09TX1dBUk4pCisvLwkJCQk8PCAiRXhwZWN0ZWQgYSBSRVBPUlQgc2VjdGlvbiAhISEiIDw8IHN0ZDo6ZW5kbDsKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCitib29sIFNlcmlhbGl6ZXJGZWF0dXJlOjpjb25maWd1cmVTdHJlYW0oV09iamVjdCAqIHRoZVZGUywgQXZtVXJpICYgdXJpKQoreworCWlmKCB1cmkubG9jYXRpb24uZmluZCgic3RkOiIpID09IDAgKQorCXsKKwkJaWYoIHVyaS5sb2NhdGlvbiA9PSAic3RkOmNvdXQiICkKKwkJeworCQkJdXJpLmtpbmQgfD0gQVZNX1VSSV9TVFJFQU1fU1REX0NPVVRfS0lORDsKKwkJCXVyaS5vdXRTdHJlYW0uT1MgPSBBVk1fT1NfQ09VVC5PUzsKKwkJfQorCQllbHNlIGlmKCB1cmkubG9jYXRpb24gPT0gInN0ZDpjZXJyIiApCisJCXsKKwkJCXVyaS5raW5kIHw9IEFWTV9VUklfU1RSRUFNX1NURF9DRVJSX0tJTkQ7CisJCQl1cmkub3V0U3RyZWFtLk9TID0gQVZNX09TX0NFUlIuT1M7CisJCX0KKwkJZWxzZQorCQl7CisJCQl0aGVWRlMtPmVycm9yTG9jYXRpb24oQVZNX09TX1dBUk4pCisJCQkJCTw8ICJFeHBlY3RlZCBhbiB1cmkgbGlrZTo+ICIKKwkJCQkJPDwgInN0ZDooIGNvdXQgfCBjZXJyICkgISEhIiA8PCBzdGQ6OmVuZGw7CisKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCWVsc2UgaWYoIHVyaS5sb2NhdGlvbi5maW5kKCJhdm06IikgPT0gMCApCisJeworCQlpZiggdXJpLmxvY2F0aW9uID09ICJhdm06bG9nIiApCisJCXsKKwkJCXVyaS5raW5kIHw9IEFWTV9VUklfU1RSRUFNX0FWTV9MT0dfS0lORDsKKwkJCXVyaS5vdXRTdHJlYW0uT1MgPSBBVk1fT1NfTE9HLk9TOworCQl9CisJCWVsc2UgaWYoIHVyaS5sb2NhdGlvbiA9PSAiYXZtOnRyYWNlIiApCisJCXsKKwkJCXVyaS5raW5kIHw9IEFWTV9VUklfU1RSRUFNX0FWTV9UUkFDRV9LSU5EOworCQkJdXJpLm91dFN0cmVhbS5PUyA9IEFWTV9PU19UUkFDRS5PUzsKKwkJfQorCQllbHNlCisJCXsKKwkJCXRoZVZGUy0+ZXJyb3JMb2NhdGlvbihBVk1fT1NfV0FSTikKKwkJCQkJPDwgIkV4cGVjdGVkIGFuIHVyaSBsaWtlOj4gIgorCQkJCQk8PCAiYXZtOiggbG9nIHwgdHJhY2UgKSAhISEiIDw8IHN0ZDo6ZW5kbDsKKworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworYm9vbCBTZXJpYWxpemVyRmVhdHVyZTo6Y29uZmlndXJlRm9sZGVyKFdPYmplY3QgKiB0aGVWRlMsIEF2bVVyaSAmIHVyaSkKK3sKKwl1cmkua2luZCB8PSBBVk1fVVJJX0ZPTERFUl9LSU5EOworCisJaWYoIHVyaS5sb2NhdGlvbiA9PSAiYXZtOnByb2plY3QiICkKKwl7CisJCWxhc3RGb2xkZXIubG9jYXRpb24gPSB1cmkubG9jYXRpb24gPSBWRlM6OlByb2plY3RQYXRoOworCX0KKwllbHNlIGlmKCB1cmkubG9jYXRpb24gPT0gImF2bTpvdXRwdXQiICkKKwl7CisJCWxhc3RGb2xkZXIubG9jYXRpb24gPSB1cmkubG9jYXRpb24gPSBWRlM6OlByb2plY3RPdXRwdXRQYXRoOworCX0KKwllbHNlIGlmKCB1cmkubG9jYXRpb24gPT0gImF2bTpzb3VyY2UiICkKKwl7CisJCWxhc3RGb2xkZXIubG9jYXRpb24gPSB1cmkubG9jYXRpb24gPSBWRlM6OlByb2plY3RTb3VyY2VQYXRoOworCX0KKwllbHNlIGlmKCB1cmkubG9jYXRpb24gPT0gImF2bTpsb2ciICkKKwl7CisJCWxhc3RGb2xkZXIubG9jYXRpb24gPSB1cmkubG9jYXRpb24gPSBWRlM6OlByb2plY3RMb2dQYXRoOworCX0KKwllbHNlCisJeworCQlsYXN0Rm9sZGVyLmxvY2F0aW9uID0gdXJpLmxvY2F0aW9uID0KKwkJCQlWRlM6Om5hdGl2ZV9wYXRoKHVyaS5sb2NhdGlvbiwgbGFzdEZvbGRlci5sb2NhdGlvbik7CisKKwkJaWYgKCBub3QgVkZTOjpjaGVja1dyaXRpbmdGb2xkZXIodXJpLmxvY2F0aW9uKSApCisJCXsKKwkJCXRoZVZGUy0+ZXJyb3JMb2NhdGlvbihBVk1fT1NfV0FSTikKKwkJCQkJPDwgIlRoZSBmb2xkZXIgYCIgPDwgdXJpLmxvY2F0aW9uCisJCQkJCTw8ICInIC0tLT4gZG9lc24ndCBleGlzdCBvciAiCisJCQkJCSJpcyBub3Qgd3JpdGFibGUgISEhIiA8PCBzdGQ6OmVuZGw7CisKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKK2Jvb2wgU2VyaWFsaXplckZlYXR1cmU6OmNvbmZpZ3VyZUZpbGUoV09iamVjdCAqIHRoZVZGUywgQXZtVXJpICYgdXJpKQoreworCXVyaS5raW5kIHw9IEFWTV9VUklfRklMRV9LSU5EOworCisJdXJpLmxvY2F0aW9uID0gVkZTOjpuYXRpdmVfcGF0aCh1cmkubG9jYXRpb24sIGxhc3RGb2xkZXIubG9jYXRpb24pOworCisJdXJpLm91dFN0cmVhbSA9IG5ldyBzdGQ6Om9mc3RyZWFtKHVyaS5sb2NhdGlvbi5jX3N0cigpLCB1cmkubW9kZSk7CisKKwlpZiggdXJpLm91dFN0cmVhbS5nb29kKCkgKQorCXsKKwkJdXJpLmlzQWxsb2NhdGVkID0gdHJ1ZTsKKworCQlsYXN0RmlsZS5sb2NhdGlvbiA9IHVyaS5sb2NhdGlvbjsKKworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisJZWxzZQorCXsKKwkJdGhlVkZTLT5lcnJvckxvY2F0aW9uKEFWTV9PU19XQVJOKQorCQkJCTw8ICJGYWlsZWQgdG8gb3BlbiA8ICIgPDwgdXJpLmxvY2F0aW9uCisJCQkJPDwgIiA+IGZpbGUgaW4gd3JpdGUgbW9kZSAhISEiIDw8IHN0ZDo6ZW5kbDsKKworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorfQorCisKK2Jvb2wgU2VyaWFsaXplckZlYXR1cmU6OmNvbmZpZ3VyZUZpbGVuYW1lKFdPYmplY3QgKiB0aGVWRlMsIEF2bVVyaSAmIHVyaSkKK3sKKwl1cmkua2luZCB8PSBBVk1fVVJJX0ZJTEVOQU1FX0tJTkQ7CisKKwl1cmkubG9jYXRpb24gPSBWRlM6Om5hdGl2ZV9wYXRoKHVyaS5sb2NhdGlvbiwgbGFzdEZvbGRlci5sb2NhdGlvbik7CisKKwl1cmkub3V0U3RyZWFtID0gbmV3IHN0ZDo6b2ZzdHJlYW0odXJpLmxvY2F0aW9uLmNfc3RyKCksIHVyaS5tb2RlKTsKKworCWlmKCB1cmkub3V0U3RyZWFtLmdvb2QoKSApCisJeworCQl1cmkuaXNBbGxvY2F0ZWQgPSB0cnVlOworCisJCWxhc3RGaWxlbmFtZS5sb2NhdGlvbiA9IHVyaS5sb2NhdGlvbjsKKworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisJZWxzZQorCXsKKwkJdGhlVkZTLT5lcnJvckxvY2F0aW9uKEFWTV9PU19XQVJOKQorCQkJCTw8ICJGYWlsZWQgdG8gb3BlbiA8ICIgPDwgdXJpLmxvY2F0aW9uCisJCQkJPDwgIiA+IGZpbGVuYW1lIGluIHdyaXRlIG1vZGUgISEhIiA8PCBzdGQ6OmVuZGw7CisKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KK30KKworCitib29sIFNlcmlhbGl6ZXJGZWF0dXJlOjpjb25maWd1cmVTb2NrZXQoV09iamVjdCAqIHRoZVZGUywgQXZtVXJpICYgdXJpKQoreworCXVyaS5raW5kIHw9IEFWTV9VUklfU09DS0VUX0tJTkQ7CisKKwlzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IHVyaS5sb2NhdGlvbi5maW5kKCc6Jyk7CisKKwlpZiggcG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKwl7CisJCWlmKCBub3Qgc2VwOjpmcm9tX3N0cmluZzxhdm1fdWludDY0X3Q+KAorCQkJCXVyaS5sb2NhdGlvbi5zdWJzdHIocG9zKzEpLCB1cmkucG9ydCwgc3RkOjpkZWMpICkKKwkJeworCQkJdGhlVkZTLT5lcnJvckxvY2F0aW9uKEFWTV9PU19XQVJOKQorCQkJCQk8PCAiRXhwZWN0ZWQgYW4gdXJpPHNvY2tldD4gd2l0aCB2YWxpZCBwb3J0IG51bWJlciBsaWtlOj4gIgorCQkJCQk8PCAic29ja2V0Omhvc3Q6cG9ydCAhISEiIDw8IHN0ZDo6ZW5kbDsKKworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJdXJpLmxvY2F0aW9uID0gdXJpLmxvY2F0aW9uLnN1YnN0cigwLCBwb3MpOworCX0KKwllbHNlCisJeworCQl0aGVWRlMtPmVycm9yTG9jYXRpb24oQVZNX09TX1dBUk4pCisJCQkJPDwgIkV4cGVjdGVkIGFuIHVyaSBsaWtlOj4gIgorCQkJCTw8ICJzb2NrZXQ6aG9zdDpwb3J0ICEhISIgPDwgc3RkOjplbmRsOworCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCitib29sIFNlcmlhbGl6ZXJGZWF0dXJlOjpjb25maWd1cmVQZXJpb2QoCisJCVdPYmplY3QgKiB0aGVWRlMsIGNvbnN0IHN0ZDo6c3RyaW5nICYgc3RyUGVyaW9kKQoreworCXN0ZDo6c3RyaW5nIHBlcmlvZDsKKwlzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIHBvczsKKworCXR5cGVkZWYgYm9vc3Q6OnRva2VuaXplcjxib29zdDo6Y2hhcl9zZXBhcmF0b3I8Y2hhcj4gPiB0b2tlbml6ZXI7CisJYm9vc3Q6OmNoYXJfc2VwYXJhdG9yPGNoYXI+IHNlcCgiOiIpOworCisJdG9rZW5pemVyIHRva2VucyhzdHJQZXJpb2QsIHNlcCk7CisJdG9rZW5pemVyOjppdGVyYXRvciBlbmRJdCA9IHRva2Vucy5lbmQoKTsKKwlmb3IoIHRva2VuaXplcjo6aXRlcmF0b3IgaXQgPSB0b2tlbnMuYmVnaW4oKSA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJeworCQlwZXJpb2QgPSAqaXQ7CisKKwkJaWYoIHBlcmlvZCA9PSAiaW5pdCIgKQorCQl7CisJCQltUGVyaW9kS2luZCB8PSBBVk1fUEVSSU9EX0lOSVRfS0lORDsKKwkJfQorCQllbHNlIGlmKCBwZXJpb2QgPT0gImV4aXQiICkKKwkJeworCQkJbVBlcmlvZEtpbmQgfD0gQVZNX1BFUklPRF9FWElUX0tJTkQ7CisJCX0KKworCQllbHNlIGlmKCBwZXJpb2QgPT0gInByZXByb2Nlc3MiICkKKwkJeworCQkJbVBlcmlvZEtpbmQgfD0gQVZNX1BFUklPRF9QUkVQUk9DRVNTX0tJTkQ7CisJCX0KKwkJZWxzZSBpZiggcGVyaW9kID09ICJwb3N0cHJvY2VzcyIgKQorCQl7CisJCQltUGVyaW9kS2luZCB8PSBBVk1fUEVSSU9EX1BPU1RQUk9DRVNTX0tJTkQ7CisJCX0KKworCQllbHNlIGlmKCBwZXJpb2QgPT0gInByZWZpbHRlciIgKQorCQl7CisJCQltUGVyaW9kS2luZCB8PSBBVk1fUEVSSU9EX1BSRUZJTFRFUl9LSU5EOworCQl9CisJCWVsc2UgaWYoIHBlcmlvZCA9PSAicG9zdGZpbHRlciIgKQorCQl7CisJCQltUGVyaW9kS2luZCB8PSBBVk1fUEVSSU9EX1BPU1RGSUxURVJfS0lORDsKKwkJfQorCisJCWVsc2UgaWYoIHBlcmlvZCA9PSAib3RmIiApCisJCXsKKwkJCW1QZXJpb2RLaW5kIHw9IEFWTV9QRVJJT0RfT1RGX0tJTkQ7CisJCX0KKwkJZWxzZSBpZiggcGVyaW9kLmZpbmQoImV2ZXJ5IikgPT0gMCAgKQorCQl7CisJCQltUGVyaW9kS2luZCB8PSBBVk1fUEVSSU9EX0VWRVJZX0tJTkQ7CisKKwkJCXBvcyA9IHBlcmlvZC5maW5kKCc/Jyk7CisJCQlpZiggKHBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcykgJiYKKwkJCQkobm90IHNjYW5QZXJpb2QocGVyaW9kLnN1YnN0cihwb3MrMSksCisJCQkJCQltUGVyaW9kRXZlcnlWYWx1ZSwgbVBlcmlvZEV2ZXJ5VW5pdCkpICkKKwkJCXsKKwkJCQl0aGVWRlMtPmVycm9yTG9jYXRpb24oQVZNX09TX1dBUk4pCisJCQkJCQk8PCAiRXhwZWN0ZWQgYSBwZXJpb2QgbGlrZTo+ICIKKwkJCQkJCTw8ICJldmVyeT9kZWxheSN1bml0ICEhISIgPDwgc3RkOjplbmRsOworCisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisKKwkJZWxzZSBpZiggcGVyaW9kLmZpbmQoImFmdGVyIikgPT0gMCApCisJCXsKKwkJCW1QZXJpb2RLaW5kIHw9IEFWTV9QRVJJT0RfQUZURVJfS0lORDsKKworCQkJcG9zID0gcGVyaW9kLmZpbmQoJz8nKTsKKwkJCWlmKCAocG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zKSAmJgorCQkJCShub3Qgc2NhblBlcmlvZChwZXJpb2Quc3Vic3RyKHBvcysxKSwKKwkJCQkJCW1QZXJpb2RBZnRlclZhbHVlLCBtUGVyaW9kQWZ0ZXJVbml0KSkgKQorCQkJeworCQkJCXRoZVZGUy0+ZXJyb3JMb2NhdGlvbihBVk1fT1NfV0FSTikKKwkJCQkJCTw8ICJFeHBlY3RlZCBhIHBlcmlvZCBsaWtlOj4gIgorCQkJCQkJPDwgImFmdGVyP2RlbGF5I3VuaXQgISEhIiA8PCBzdGQ6OmVuZGw7CisKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKworCQllbHNlIGlmKCBwZXJpb2QuZmluZCgiYmVmb3JlIikgPT0gMCApCisJCXsKKwkJCW1QZXJpb2RLaW5kIHw9IEFWTV9QRVJJT0RfQkVGT1JFX0tJTkQ7CisKKwkJCXBvcyA9IHBlcmlvZC5maW5kKCc/Jyk7CisJCQlpZiggKHBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcykgJiYKKwkJCQkobm90IHNjYW5QZXJpb2QocGVyaW9kLnN1YnN0cihwb3MrMSksCisJCQkJCQltUGVyaW9kQmVmb3JlVmFsdWUsIG1QZXJpb2RCZWZvcmVVbml0KSkgKQorCQkJeworCQkJCXRoZVZGUy0+ZXJyb3JMb2NhdGlvbihBVk1fT1NfV0FSTikKKwkJCQkJCTw8ICJFeHBlY3RlZCBhIHBlcmlvZCBsaWtlOj4gIgorCQkJCQkJPDwgImJlZm9yZT9kZWxheSN1bml0ICEhISIgPDwgc3RkOjplbmRsOworCisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisKKwkJZWxzZQorCQl7CisJCQl0aGVWRlMtPmVycm9yTG9jYXRpb24oQVZNX09TX1dBUk4pCisJCQkJCTw8ICJFeHBlY3RlZCBhIHBlcmlvZCBsaWtlOj4gIgorCQkJCQk8PCAiWyBpbml0IF1bOl1bIG90ZiB8IChldmVyeSB8IGFmdGVyIHwgYmVmb3JlKT8iCisJCQkJCQkJInZhbHVlI3VuaXRdWzpdWyBleGl0IF0gISEhIiA8PCBzdGQ6OmVuZGw7CisKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU0VSSUFMSVpBVElPTgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCitzdGQ6OnN0cmluZyBTZXJpYWxpemVyRmVhdHVyZTo6c3RyUGVyaW9kS2luZChhdm1fcGVyaW9kX2tpbmRfdCBraW5kKQoreworCXN3aXRjaCAoIGtpbmQgKQorCXsKKwkJY2FzZSBBVk1fUEVSSU9EX0lOSVRfS0lORCAgICAgIDogcmV0dXJuKCAiaW5pdCIpOworCQljYXNlIEFWTV9QRVJJT0RfRVhJVF9LSU5EICAgICAgOiByZXR1cm4oICJleGl0Iik7CisKKwkJY2FzZSBBVk1fUEVSSU9EX09URl9LSU5EICAgICAgIDogcmV0dXJuKCAib3RmIik7CisKKwkJY2FzZSBBVk1fUEVSSU9EX0VWRVJZX0tJTkQgICAgIDogcmV0dXJuKCAiZXZlcnkiKTsKKwkJY2FzZSBBVk1fUEVSSU9EX0FGVEVSX0tJTkQgICAgIDogcmV0dXJuKCAiYWZ0ZXIiKTsKKwkJY2FzZSBBVk1fUEVSSU9EX0JFRk9SRV9LSU5EICAgIDogcmV0dXJuKCAiYmVmb3JlIik7CisKKwkJY2FzZSBBVk1fUEVSSU9EX1VOREVGSU5FRF9LSU5EIDogcmV0dXJuKCAidW5kZWZpbmVkPHBlcmlvZCNraW5kPiIpOworCisJCWRlZmF1bHQgICAgICAgICAgICAgICAgICAgICAgICA6IHJldHVybiggInVua25vd248cGVyaW9kI2tpbmQ+IiApOworCX0KK30KKworCit2b2lkIFNlcmlhbGl6ZXJGZWF0dXJlOjp0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlvcyA8PCBUQUIgPDwgInJlcG9ydDoiIDw8IEVPTDsKKworCW9zIDw8IFRBQjIgPDwgImRldGFpbHMgPSAiCisJCQk8PCAobVJlcG9ydERldGFpbHNGbGFnID8gInRydWUiIDogImZhbHNlIikgPDwgIjsiCisJCQk8PCBFT0xfSU5DUl9JTkRFTlQ7CisKKwlWZWN0b3JPZkF2bVVyaTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtVGFibGVPZlVSSS5iZWdpbigpOworCVZlY3Rvck9mQXZtVXJpOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IG1UYWJsZU9mVVJJLmVuZCgpOworCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCXsKKwkJKCppdCkudG9TdHJlYW0ob3MpOworCX0KKworCXN0ZDo6c3RyaW5nIHNlcCA9ICIiOworCW9zIDw8IERFQ1JfSU5ERU5UX1RBQjIgPDwgIndoZW4gPSAiOworCisJaWYoIElTX1BFUklPRF9JTklUX0tJTkQobVBlcmlvZEtpbmQpICkKKwl7CisJCW9zIDw8ICJpbml0IjsKKwkJc2VwID0gIjoiOworCX0KKworCWlmKCBJU19QRVJJT0RfQUZURVJfS0lORChtUGVyaW9kS2luZCkgKQorCXsKKwkJb3MgPDwgKHNlcCA9ICI6IikgPDwgImFmdGVyPyIgPDwgbVBlcmlvZEFmdGVyVmFsdWUKKwkJCQk8PCAiIyIgPDwgc3RyVW5pdChtUGVyaW9kQWZ0ZXJVbml0KTsKKwkJOworCX0KKworCWlmKCBJU19QRVJJT0RfT1RGX0tJTkQobVBlcmlvZEtpbmQpICkKKwl7CisJCW9zIDw8IChzZXAgPSAiOiIpIDw8ICJvdGYiOworCX0KKworCWlmKCBJU19QRVJJT0RfRVZFUllfS0lORChtUGVyaW9kS2luZCkgKQorCXsKKwkJb3MgPDwgKHNlcCA9ICI6IikgPDwgImV2ZXJ5PyIgPDwgbVBlcmlvZEV2ZXJ5VmFsdWUKKwkJCQk8PCAiIyIgPDwgc3RyVW5pdChtUGVyaW9kRXZlcnlVbml0KTsKKwl9CisKKwlpZiggSVNfUEVSSU9EX0JFRk9SRV9LSU5EKG1QZXJpb2RLaW5kKSApCisJeworCQlvcyA8PCAoc2VwID0gIjoiKSA8PCAiYmVmb3JlPyIgPDwgbVBlcmlvZEJlZm9yZVZhbHVlCisJCQkJPDwgIiMiIDw8IHN0clVuaXQobVBlcmlvZEJlZm9yZVVuaXQpOworCX0KKworCWlmKCBJU19QRVJJT0RfRVhJVF9LSU5EKG1QZXJpb2RLaW5kKSApCisJeworCQlvcyA8PCAoc2VwID0gIjoiKSA8PCAiZXhpdCI7CisJfQorCW9zIDw8ICI7IiA8PCBFT0w7Cit9CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21tb24vU2VyaWFsaXplckZlYXR1cmUuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbW1vbi9TZXJpYWxpemVyRmVhdHVyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMTg4NDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21tb24vU2VyaWFsaXplckZlYXR1cmUuaApAQCAtMCwwICsxLDUzNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDIzIG5vdi4gMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIENPTU1PTl9TRVJJQUxJWkVSRkVBVFVSRV9IXworI2RlZmluZSBDT01NT05fU0VSSUFMSVpFUkZFQVRVUkVfSF8KKworI2luY2x1ZGUgPHV0aWwvYXZtX251bWVyaWMuaD4KKyNpbmNsdWRlIDx1dGlsL2F2bV90eXBlcy5oPgorI2luY2x1ZGUgPHV0aWwvYXZtX3VyaS5oPgorCisjaW5jbHVkZSA8Y29sbGVjdGlvbi9WZWN0b3IuaD4KKworI2luY2x1ZGUgPHByaW50ZXIvT3V0U3RyZWFtLmg+CisKKyNpbmNsdWRlIDxtYXA+CisKKworbmFtZXNwYWNlIHNlcAoreworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFRoZSBQRVJJT0QgZm9yIHJlcG9ydGluZywgLi4uCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordHlwZWRlZiBhdm1fdWludDE2X3QgICAgICAgICAgICBhdm1fcGVyaW9kX2tpbmRfdDsKKworZW51bSB7CisJQVZNX1BFUklPRF9VTkRFRklORURfS0lORCAgICA9IDB4MDAwMCwKKworCUFWTV9QRVJJT0RfSU5JVF9LSU5EICAgICAgICAgPSAweDAwMDEsCisJQVZNX1BFUklPRF9FWElUX0tJTkQgICAgICAgICA9IDB4MDAwMiwKKworCUFWTV9QRVJJT0RfUFJFUFJPQ0VTU19LSU5EICAgPSAweDAwMDQsCisJQVZNX1BFUklPRF9QT1NUUFJPQ0VTU19LSU5EICA9IDB4MDAwOCwKKworCUFWTV9QRVJJT0RfUFJFRklMVEVSX0tJTkQgICAgPSAweDAwMTAsCisJQVZNX1BFUklPRF9QT1NURklMVEVSX0tJTkQgICA9IDB4MDAyMCwKKworCisJQVZNX1BFUklPRF9PVEZfS0lORCAgICAgICAgICA9IDB4MDA0MCwKKwlBVk1fUEVSSU9EX0VWRVJZX0tJTkQgICAgICAgID0gMHgwMDgwLAorCisJQVZNX1BFUklPRF9BRlRFUl9LSU5EICAgICAgICA9IDB4MDEwMCwKKwlBVk1fUEVSSU9EX0JFRk9SRV9LSU5EICAgICAgID0gMHgwMjAwLAorCit9OworCisjZGVmaW5lIElTX1BFUklPRF9VTkRFRklORURfS0lORChraW5kKSAgICAoa2luZCA9PSBBVk1fUEVSSU9EX1VOREVGSU5FRF9LSU5EKQorCisjZGVmaW5lIElTX1BFUklPRF9JTklUX0tJTkQoa2luZCkgICAgICAgICAoa2luZCAmIEFWTV9QRVJJT0RfSU5JVF9LSU5EKQorI2RlZmluZSBJU19QRVJJT0RfRVhJVF9LSU5EKGtpbmQpICAgICAgICAgKGtpbmQgJiBBVk1fUEVSSU9EX0VYSVRfS0lORCkKKworI2RlZmluZSBJU19QRVJJT0RfUFJFUFJPQ0VTU19LSU5EKGtpbmQpICAgKGtpbmQgJiBBVk1fUEVSSU9EX1BSRVBST0NFU1NfS0lORCkKKyNkZWZpbmUgSVNfUEVSSU9EX1BPU1RQUk9DRVNTX0tJTkQoa2luZCkgIChraW5kICYgQVZNX1BFUklPRF9QT1NUUFJPQ0VTU19LSU5EKQorCisjZGVmaW5lIElTX1BFUklPRF9QUkVGSUxURVJfS0lORChraW5kKSAgICAoa2luZCAmIEFWTV9QRVJJT0RfUFJFRklMVEVSX0tJTkQpCisjZGVmaW5lIElTX1BFUklPRF9QT1NURklMVEVSX0tJTkQoa2luZCkgICAoa2luZCAmIEFWTV9QRVJJT0RfUE9TVEZJTFRFUl9LSU5EKQorCisjZGVmaW5lIElTX1BFUklPRF9PVEZfS0lORChraW5kKSAgICAgICAgICAoa2luZCAmIEFWTV9QRVJJT0RfT1RGX0tJTkQpCisjZGVmaW5lIElTX1BFUklPRF9FVkVSWV9LSU5EKGtpbmQpICAgICAgICAoa2luZCAmIEFWTV9QRVJJT0RfRVZFUllfS0lORCkKKworI2RlZmluZSBJU19QRVJJT0RfQUZURVJfS0lORChraW5kKSAgICAgICAgKGtpbmQgJiBBVk1fUEVSSU9EX0FGVEVSX0tJTkQpCisjZGVmaW5lIElTX1BFUklPRF9CRUZPUkVfS0lORChraW5kKSAgICAgICAoa2luZCAmIEFWTV9QRVJJT0RfQkVGT1JFX0tJTkQpCisKKworY2xhc3MgV09iamVjdDsKKworCitjbGFzcyBTZXJpYWxpemVyRmVhdHVyZQoreworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogVFlQRURFRgorCSAqLworCXR5cGVkZWYgVmVjdG9yPCBBdm1VcmkgPiAgVmVjdG9yT2ZBdm1Vcmk7CisKKworCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlWZWN0b3JPZkF2bVVyaSBtVGFibGVPZlVSSTsKKworCUF2bVVyaSBsYXN0Rm9sZGVyOworCUF2bVVyaSBsYXN0RmlsZTsKKwlBdm1VcmkgbGFzdEZpbGVuYW1lOworCisJc3RkOjptYXA8IHN0ZDo6c3RyaW5nICwgQXZtVXJpICogPiBtVXJpTWFwOworCisJVmVjdG9yT2ZBdm1Vcmk6Oml0ZXJhdG9yIGl0VVJJOworCVZlY3Rvck9mQXZtVXJpOjppdGVyYXRvciBlbmRVUkk7CisJQXZtVXJpICogY3VycmVudFVSSTsKKworCWF2bV9wZXJpb2Rfa2luZF90IG1QZXJpb2RLaW5kOworCisJYXZtX2RlbGF5X3ZhbHVlX3QgIG1QZXJpb2RFdmVyeVZhbHVlOworCWF2bV91bml0X3QgICBtUGVyaW9kRXZlcnlVbml0OworCisJYXZtX2RlbGF5X3ZhbHVlX3QgIG1QZXJpb2RBZnRlclZhbHVlOworCWF2bV91bml0X3QgICBtUGVyaW9kQWZ0ZXJVbml0OworCisJYXZtX2RlbGF5X3ZhbHVlX3QgIG1QZXJpb2RCZWZvcmVWYWx1ZTsKKwlhdm1fdW5pdF90ICAgbVBlcmlvZEJlZm9yZVVuaXQ7CisKKwkvLyBPbmx5IGZvciBSVU5USU1FCisJYXZtX2RlbGF5X3ZhbHVlX3QgbVRpbWVJbml0VmFsdWU7CisJYXZtX2RlbGF5X3ZhbHVlX3QgbVRpbWVQcmV2aW91c1ZhbHVlOworCisKKwkvLyBERVRBSUxTIFJFUE9SVElORworCWJvb2wgbVJlcG9ydERldGFpbHNGbGFnOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlTZXJpYWxpemVyRmVhdHVyZSgpCisJOiBtVGFibGVPZlVSSSggKSwKKwlsYXN0Rm9sZGVyKCBBVk1fVVJJX0ZPTERFUl9LSU5EICwgIi4iICksCisJbGFzdEZpbGUoIEFWTV9VUklfRklMRV9LSU5EICwgIl8iICksCisJbGFzdEZpbGVuYW1lKCBBVk1fVVJJX0ZJTEVOQU1FX0tJTkQgLCAiXyIgKSwKKwltVXJpTWFwKCApLAorCWl0VVJJKCApLAorCWVuZFVSSSggKSwKKwljdXJyZW50VVJJKCBOVUxMICksCisKKwltUGVyaW9kS2luZCggQVZNX1BFUklPRF9FWElUX0tJTkQgKSwKKworCW1QZXJpb2RFdmVyeVZhbHVlKCAwICksCisJbVBlcmlvZEV2ZXJ5VW5pdCggQVZNX1VOREVGSU5FRF9VTklUICksCisKKwltUGVyaW9kQWZ0ZXJWYWx1ZSggMCApLAorCW1QZXJpb2RBZnRlclVuaXQoIEFWTV9VTkRFRklORURfVU5JVCApLAorCisJbVBlcmlvZEJlZm9yZVZhbHVlKCAwICksCisJbVBlcmlvZEJlZm9yZVVuaXQoIEFWTV9VTkRFRklORURfVU5JVCApLAorCisJbVRpbWVJbml0VmFsdWUoIDAgKSwKKwltVGltZVByZXZpb3VzVmFsdWUoIDAgKSwKKworCW1SZXBvcnREZXRhaWxzRmxhZyggdHJ1ZSApCisKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgflNlcmlhbGl6ZXJGZWF0dXJlKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogQ09ORklHVVJFCisJICovCisJYm9vbCBjb25maWd1cmUoV09iamVjdCAqIHdmUGFyYW1ldGVyT2JqZWN0KTsKKworCWJvb2wgY29uZmlndXJlU3RyZWFtKFdPYmplY3QgKiB0aGVWRlMsIEF2bVVyaSAmIHVyaSk7CisKKwlib29sIGNvbmZpZ3VyZUZvbGRlcihXT2JqZWN0ICogdGhlVkZTLCBBdm1VcmkgJiB1cmkpOworCisJYm9vbCBjb25maWd1cmVGaWxlKFdPYmplY3QgKiB0aGVWRlMsIEF2bVVyaSAmIHVyaSk7CisJYm9vbCBjb25maWd1cmVGaWxlbmFtZShXT2JqZWN0ICogdGhlVkZTLCBBdm1VcmkgJiB1cmkpOworCisJYm9vbCBjb25maWd1cmVTb2NrZXQoV09iamVjdCAqIHRoZVZGUywgQXZtVXJpICYgdXJpKTsKKworCWJvb2wgY29uZmlndXJlUGVyaW9kKFdPYmplY3QgKiB0aGVWRlMsIGNvbnN0IHN0ZDo6c3RyaW5nICYgc3RyUGVyaW9kKTsKKworCisJLyoqCisJICogU0NIRURVTEUgUkVQT1JUCisJICovCisJdmlydHVhbCBib29sIHNjaGVkdWxlUmVwb3J0KCkKKwl7CisJCXJldHVybiggdHJ1ZSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0tIFNFVFRFUgorCSAqIG1UYWJsZU9mVVJJCisJICovCisJaW5saW5lIEF2bVVyaSAmIGFwcGVuZFVyaSggY29uc3Qgc3RkOjpzdHJpbmcgJiByYXdMb2NhdGlvbiApCisJeworCQltVGFibGVPZlVSSS5wdXNoX2JhY2soIHJhd0xvY2F0aW9uICk7CisKKwkJcmV0dXJuKCBtVGFibGVPZlVSSS5iYWNrKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBkZXN0cm95TGFzdFVyaSgpCisJeworCQltVGFibGVPZlVSSS5wb3BfYmFjaygpOworCX0KKworCisKKwlpbmxpbmUgY29uc3QgVmVjdG9yT2ZBdm1VcmkgJiBnZXRVcmkoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVGFibGVPZlVSSSApOworCX0KKworCWlubGluZSBib29sIGhhc1VyaSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZU9mVVJJLmVtcHR5KCkgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQXZtVXJpICYgZ2V0Rm9sZGVyKCkgY29uc3QKKwl7CisJCXJldHVybiggbGFzdEZvbGRlciApOworCX0KKworCWlubGluZSBjb25zdCBBdm1VcmkgJiBnZXRMYXN0Rm9sZGVyKCkgY29uc3QKKwl7CisJCXJldHVybiggbGFzdEZvbGRlciApOworCX0KKworCWlubGluZSBjb25zdCBBdm1VcmkgJiBnZXRMYXN0RmlsZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGxhc3RGaWxlICk7CisJfQorCisJaW5saW5lIGNvbnN0IEF2bVVyaSAmIGdldExhc3RGaWxlbmFtZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGxhc3RGaWxlbmFtZSApOworCX0KKworCisJaW5saW5lIGJvb2wgb3BlblN0cmVhbSgpCisJeworCQllbmRVUkkgPSBtVGFibGVPZlVSSS5lbmQoKTsKKwkJZm9yKCBpdFVSSSA9IG1UYWJsZU9mVVJJLmJlZ2luKCkgOyBpdFVSSSAhPSBlbmRVUkkgOyArK2l0VVJJICkKKwkJeworCQkJaWYoIG5vdCAoKml0VVJJKS5vcGVuKCkgKQorCQkJeworCisJCQl9CisJCX0KKworCQlpdFVSSSA9IG1UYWJsZU9mVVJJLmJlZ2luKCk7CisJCXJldHVybiggdHJ1ZSApOworCX0KKworCWlubGluZSB2b2lkIGNsb3NlU3RyZWFtKCkKKwl7CisJCWVuZFVSSSA9IG1UYWJsZU9mVVJJLmVuZCgpOworCQlmb3IoIGl0VVJJID0gbVRhYmxlT2ZVUkkuYmVnaW4oKSA7IGl0VVJJICE9IGVuZFVSSSA7ICsraXRVUkkgKQorCQl7CisJCQkoKml0VVJJKS5jbG9zZSgpOworCQl9CisJfQorCisKKwlpbmxpbmUgdm9pZCBiZWdpblN0cmVhbSgpCisJeworCQlpdFVSSSA9IG1UYWJsZU9mVVJJLmJlZ2luKCk7CisJCWVuZFVSSSA9IG1UYWJsZU9mVVJJLmVuZCgpOworCX0KKworCWlubGluZSBib29sIGhhc1N0cmVhbSgpCisJeworCQl3aGlsZSggaXRVUkkgIT0gZW5kVVJJICkKKwkJeworCQkJY3VycmVudFVSSSA9ICYoICooaXRVUkkrKykgKTsKKwkJCWlmKCBjdXJyZW50VVJJLT5vdXRTdHJlYW0uZ29vZCgpICkKKwkJCXsKKwkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwlpbmxpbmUgT3V0U3RyZWFtICYgY3VycmVudFN0cmVhbSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGN1cnJlbnRVUkktPm91dFN0cmVhbSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0tIFNFVFRFUgorCSAqIG1UYWJsZU9mVVJJCisJICovCisJaW5saW5lIHZvaWQgbWFwVXJpKGNvbnN0IHN0ZDo6c3RyaW5nICYga2V5LCBBdm1VcmkgJiBhblVyaSkKKwl7CisJCW1VcmlNYXBbIGtleSBdID0gJiBhblVyaTsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBQRVJJT0QgS0lORAorCSAqLworCWlubGluZSBhdm1fcGVyaW9kX2tpbmRfdCBnZXRQZXJpb2RLaW5kKCkgY29uc3QKKwl7CisJCXJldHVybiggbVBlcmlvZEtpbmQgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNQZXJpb2RLaW5kKCkgY29uc3QKKwl7CisJCXJldHVybiggbVBlcmlvZEtpbmQgIT0gQVZNX1BFUklPRF9VTkRFRklORURfS0lORCApOworCX0KKworCWlubGluZSB2b2lkIHNldFBlcmlvZEtpbmQoYXZtX3BlcmlvZF9raW5kX3Qga2luZCkKKwl7CisJCW1QZXJpb2RLaW5kID0ga2luZDsKKwl9CisKKwlpbmxpbmUgdm9pZCB1bnNldFBlcmlvZEtpbmQoKQorCXsKKwkJbVBlcmlvZEtpbmQgPSBBVk1fUEVSSU9EX1VOREVGSU5FRF9LSU5EOworCX0KKworCisJLyoqCisJICogR0VUVEVSCisJICogUEVSSU9EIEVWRVJZIEtJTkQKKwkgKi8KKwlpbmxpbmUgYXZtX3VuaXRfdCBnZXRQZXJpb2RFdmVyeVVuaXQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUGVyaW9kRXZlcnlVbml0ICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzUGVyaW9kRXZlcnlVbml0KCkgY29uc3QKKwl7CisJCXJldHVybiggbVBlcmlvZEV2ZXJ5VW5pdCAhPSBBVk1fUEVSSU9EX1VOREVGSU5FRF9LSU5EICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0UGVyaW9kRXZlcnlVbml0KGF2bV91bml0X3QgdW5pdCkKKwl7CisJCW1QZXJpb2RFdmVyeVVuaXQgPSB1bml0OworCX0KKworCWlubGluZSB2b2lkIHVuc2V0UGVyaW9kRXZlcnlVbml0KCkKKwl7CisJCW1QZXJpb2RFdmVyeVVuaXQgPSBBVk1fUEVSSU9EX1VOREVGSU5FRF9LSU5EOworCX0KKworCisJLyoqCisJICogR0VUVEVSCisJICogUEVSSU9EIEVWRVJZIFZBTFVFCisJICovCisJaW5saW5lIGF2bV9kZWxheV92YWx1ZV90IGdldFBlcmlvZEV2ZXJ5VmFsdWUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUGVyaW9kRXZlcnlWYWx1ZSApOworCX0KKworCWlubGluZSBib29sIGhhc1BlcmlvZEV2ZXJ5VmFsdWUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUGVyaW9kRXZlcnlWYWx1ZSA+IDAgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRQZXJpb2RFdmVyeVZhbHVlKGF2bV9kZWxheV92YWx1ZV90IHZhbHVlKQorCXsKKwkJbVBlcmlvZEV2ZXJ5VmFsdWUgPSB2YWx1ZTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIFBFUklPRCBBRlRFUiBLSU5ECisJICovCisJaW5saW5lIGF2bV91bml0X3QgZ2V0UGVyaW9kQWZ0ZXJVbml0KCkgY29uc3QKKwl7CisJCXJldHVybiggbVBlcmlvZEFmdGVyVW5pdCApOworCX0KKworCWlubGluZSBib29sIGhhc1BlcmlvZEFmdGVyVW5pdCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1QZXJpb2RBZnRlclVuaXQgIT0gQVZNX1BFUklPRF9VTkRFRklORURfS0lORCApOworCX0KKworCWlubGluZSB2b2lkIHNldFBlcmlvZEFmdGVyVW5pdChhdm1fdW5pdF90IHVuaXQpCisJeworCQltUGVyaW9kQWZ0ZXJVbml0ID0gdW5pdDsKKwl9CisKKwlpbmxpbmUgdm9pZCB1bnNldFBlcmlvZEFmdGVyVW5pdCgpCisJeworCQltUGVyaW9kQWZ0ZXJVbml0ID0gQVZNX1BFUklPRF9VTkRFRklORURfS0lORDsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIFBFUklPRCBBRlRFUiBWQUxVRQorCSAqLworCWlubGluZSBhdm1fZGVsYXlfdmFsdWVfdCBnZXRQZXJpb2RBZnRlclZhbHVlKCkgY29uc3QKKwl7CisJCXJldHVybiggbVBlcmlvZEFmdGVyVmFsdWUgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNQZXJpb2RBZnRlclZhbHVlKCkgY29uc3QKKwl7CisJCXJldHVybiggbVBlcmlvZEFmdGVyVmFsdWUgPiAwICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0UGVyaW9kQWZ0ZXJWYWx1ZShhdm1fZGVsYXlfdmFsdWVfdCB2YWx1ZSkKKwl7CisJCW1QZXJpb2RBZnRlclZhbHVlID0gdmFsdWU7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBQRVJJT0QgQkVGT1JFIEtJTkQKKwkgKi8KKwlpbmxpbmUgYXZtX3VuaXRfdCBnZXRQZXJpb2RCZWZvcmVVbml0KCkgY29uc3QKKwl7CisJCXJldHVybiggbVBlcmlvZEJlZm9yZVVuaXQgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNQZXJpb2RCZWZvcmVVbml0KCkgY29uc3QKKwl7CisJCXJldHVybiggbVBlcmlvZEJlZm9yZVVuaXQgIT0gQVZNX1BFUklPRF9VTkRFRklORURfS0lORCApOworCX0KKworCWlubGluZSB2b2lkIHNldFBlcmlvZEJlZm9yZVVuaXQoYXZtX3VuaXRfdCB1bml0KQorCXsKKwkJbVBlcmlvZEJlZm9yZVVuaXQgPSB1bml0OworCX0KKworCWlubGluZSB2b2lkIHVuc2V0UGVyaW9kQmVmb3JlVW5pdCgpCisJeworCQltUGVyaW9kQmVmb3JlVW5pdCA9IEFWTV9QRVJJT0RfVU5ERUZJTkVEX0tJTkQ7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBQRVJJT0QgQkVGT1JFIFZBTFVFCisJICovCisJaW5saW5lIGF2bV9kZWxheV92YWx1ZV90IGdldFBlcmlvZEJlZm9yZVZhbHVlKCkgY29uc3QKKwl7CisJCXJldHVybiggbVBlcmlvZEJlZm9yZVZhbHVlICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzUGVyaW9kQmVmb3JlVmFsdWUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUGVyaW9kQmVmb3JlVmFsdWUgPiAwICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0UGVyaW9kQmVmb3JlVmFsdWUoYXZtX2RlbGF5X3ZhbHVlX3QgdmFsdWUpCisJeworCQltUGVyaW9kQmVmb3JlVmFsdWUgPSB2YWx1ZTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIFBFUklPRCBCRUdJTiBWQUxVRQorCSAqLworCWlubGluZSBhdm1fZGVsYXlfdmFsdWVfdCBnZXRUaW1lSW5pdFZhbHVlKCkgY29uc3QKKwl7CisJCXJldHVybiggbVRpbWVJbml0VmFsdWUgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNUaW1lSW5pdFZhbHVlKCkgY29uc3QKKwl7CisJCXJldHVybiggbVRpbWVJbml0VmFsdWUgPiAwICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0VGltZUluaXRWYWx1ZShhdm1fZGVsYXlfdmFsdWVfdCB2YWx1ZSkKKwl7CisJCW1UaW1lSW5pdFZhbHVlID0gdmFsdWU7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBQRVJJT0QgUFJFVklPVVMgVkFMVUUKKwkgKi8KKwlpbmxpbmUgYXZtX2RlbGF5X3ZhbHVlX3QgZ2V0VGltZVByZXZpb3VzVmFsdWUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVGltZVByZXZpb3VzVmFsdWUgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNUaW1lUHJldmlvdXNWYWx1ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UaW1lUHJldmlvdXNWYWx1ZSA+IDAgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRUaW1lUHJldmlvdXNWYWx1ZShhdm1fZGVsYXlfdmFsdWVfdCB2YWx1ZSkKKwl7CisJCW1UaW1lUHJldmlvdXNWYWx1ZSA9IHZhbHVlOworCX0KKworCisJLyoqCisJICogR0VUVEVSCisJICogbVJlcG9ydERldGFpbHNGbGFnCisJICovCisJaW5saW5lIGJvb2wgaXNSZXBvcnREZXRhaWxzKCkgY29uc3QKKwl7CisJCXJldHVybiggbVJlcG9ydERldGFpbHNGbGFnICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0UmVwb3J0RGV0YWlsc0ZsYWcoYm9vbCB2YWx1ZSkKKwl7CisJCW1SZXBvcnREZXRhaWxzRmxhZyA9IHZhbHVlOworCX0KKworCisJLyoqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFNFUklBTElaQVRJT04KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJc3RhdGljIHN0ZDo6c3RyaW5nIHN0clBlcmlvZEtpbmQoYXZtX3BlcmlvZF9raW5kX3Qga2luZCk7CisKKwl2aXJ0dWFsIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCit9OworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworCisjZW5kaWYgLyogQ09NTU9OX1NFUklBTElaRVJGRUFUVVJFX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9CYXNlRW52aXJvbm1lbnQuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvQmFzZUVudmlyb25tZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjMxMDJlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvQmFzZUVudmlyb25tZW50LmNwcApAQCAtMCwwICsxLDIxMTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiA2IGphbnYuIDIwMTIKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkJhc2VFbnZpcm9ubWVudC5oIgorCisjaW5jbHVkZSA8Y29sbGVjdGlvbi9CaXRzZXQuaD4KKworI2luY2x1ZGUgPGNvbXB1dGVyL0V4ZWN1dGlvbkVudmlyb25tZW50Lmg+CisjaW5jbHVkZSA8Y29tcHV0ZXIvRXZhbHVhdGlvbkVudmlyb25tZW50Lmg+CisjaW5jbHVkZSA8Y29tcHV0ZXIvUGF0aENvbmRpdGlvblByb2Nlc3Nvci5oPgorCisjaW5jbHVkZSA8Y29tcHV0ZXIvcHJpbWl0aXZlL0F2bVByaW1pdGl2ZVByb2Nlc3Nvci5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZUxpYi5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZEYXRhLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9CdWlsdGluQXJyYXkuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9CdWlsdGluQ29udGFpbmVyLmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkNvbnN0cnVjdG9yLmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvblR5cGVDaGVja2VyLmg+CisKKyNpbmNsdWRlIDxmbWwvc3ltYm9sL1RhYmxlT2ZTeW1ib2wuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkNvbmZpZ3VyYXRpb24uaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9Mb2NhbFJ1bnRpbWUuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lTGliLmg+CisKKyNpbmNsdWRlIDxmbWwvdHlwZS9CYXNlVHlwZVNwZWNpZmllci5oPgorI2luY2x1ZGUgPGZtbC90eXBlL0NsYXNzVHlwZVNwZWNpZmllci5oPgorI2luY2x1ZGUgPGZtbC90eXBlL0NvbnRhaW5lclR5cGVTcGVjaWZpZXIuaD4KKyNpbmNsdWRlIDxmbWwvdHlwZS9UeXBlQWxpYXNTcGVjaWZpZXIuaD4KKworI2luY2x1ZGUgPHNldy9Db25maWd1cmF0aW9uLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorICogSU5ERVggRk9SIE5FVyBTWU1CT0xJQyBQQVJBTUVURVIKKyAqLworYXZtX3VpbnQzMl90IEJhc2VFbnZpcm9ubWVudDo6TkVXX1BBUkFNX09GRlNFVCA9IDA7CisKKworLyoqCisgKiBHRVRURVIKKyAqIEJ1aWxkZXIKKyAqIENvbmZpZ3VyYXRpb24KKyAqIEV4ZWN1dGFibGVTeXN0ZW0KKyAqLworQnVpbGRlciAmIEJhc2VFbnZpcm9ubWVudDo6Z2V0QnVpbGRlcigpIGNvbnN0Cit7CisJcmV0dXJuKCBQUklNSVRJVkVfUFJPQ0VTU09SLmdldEJ1aWxkZXIoKSApOworfQorCitMb2FkZXIgJiBCYXNlRW52aXJvbm1lbnQ6OmdldExvYWRlcigpIGNvbnN0Cit7CisJcmV0dXJuKCBQUklNSVRJVkVfUFJPQ0VTU09SLmdldExvYWRlcigpICk7Cit9CisKK1N5bWJleEVuZ2luZSAmIEJhc2VFbnZpcm9ubWVudDo6Z2V0U3ltYmV4RW5naW5lKCkgY29uc3QKK3sKKwlyZXR1cm4oIFBSSU1JVElWRV9QUk9DRVNTT1IuZ2V0U3ltYmV4RW5naW5lKCkgKTsKK30KKworQ29uZmlndXJhdGlvbiAmIEJhc2VFbnZpcm9ubWVudDo6Z2V0Q29uZmlndXJhdGlvbigpIGNvbnN0Cit7CisJcmV0dXJuKCBQUklNSVRJVkVfUFJPQ0VTU09SLmdldENvbmZpZ3VyYXRpb24oKSApOworfQorCitFeGVjdXRhYmxlU3lzdGVtICYgQmFzZUVudmlyb25tZW50OjpnZXRFeGVjdXRhYmxlU3lzdGVtKCkgY29uc3QKK3sKKwlyZXR1cm4oIFBSSU1JVElWRV9QUk9DRVNTT1IuZ2V0Q29uZmlndXJhdGlvbigpLmdldEV4ZWN1dGFibGVTeXN0ZW0oKSApOworfQorCisKKworLyoqCisgKiBTZXJpYWxpemF0aW9uCisgKi8KK3ZvaWQgQmFzZUVudmlyb25tZW50Ojp0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlvcyA8PCBUQUIgPDwgImluRUMgOiAiOworCWluRUMtPnRyYWNlRGVmYXVsdChvcyA8PCBORVdfTFRSSU1fSU5ERU5UKG9zKSk7CisKKwlvcyA8PCBFTkRfSU5ERU5UIDw8IFRBQiA8PCAiaW5FRCA6ICI7CisJaW5FRC0+dG9TdHJlYW0ob3MgPDwgTkVXX0xUUklNX0lOREVOVChvcykpOworCisJb3MgPDwgRU5EX0lOREVOVCA8PCBUQUIgPDwgImluRk9STSA6ICIgPDwgaW5GT1JNLnN0cigpIDw8IEVPTDsKKwlvcyA8PCBUQUIgPDwgImluQ09ERSA6ICIgPDwgaW5DT0RFLnN0cigpIDw8IEVPTDsKKworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gU1lNQk9MSUMgUEFSQU1FVFJFIENSRUFUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworSW5zdGFuY2VPZkRhdGEgKiBCYXNlRW52aXJvbm1lbnQ6OmNyZWF0ZShjb25zdCBSdW50aW1lSUQgJiBhUklELAorCQlCYXNlVHlwZVNwZWNpZmllciAqIGFUeXBlU3BlY2lmaWVyLCBJbnN0YW5jZU9mRGF0YSAqIGx2YWx1ZSkKK3sKKwkvKgorCSAqIHByw6lmaXhhZ2UgZGUgbCdVRkkgZGUgbGEgY29uc3RhbnRlIHN5bWJvbGlxdWUKKwkgKiBwYXIgbGUgbm9tIGRlIGwnaW5zdGFuY2UgY29udGVuZXVyCisJICovCisJc3RkOjpvc3RyaW5nc3RyZWFtIG9zc1VmaTsKKwlzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzSWQ7CisKKy8vQVZNX0lGX0RFQlVHX0ZMQUcoIExPQURJTkcgKQorLy8Jb3NzVWZpIDw8IGFSSUQuZ2V0SW5zdGFuY2UoKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorLy8JCQk8PCBsdmFsdWUtPmdldEFzdEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkuc3Vic3RyKAorLy8JCQkJCWFSSUQuZ2V0RXhlY3V0YWJsZSgpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpLnNpemUoKSk7CisvL19BVk1fRUxTRV8KKwlvc3NVZmkgPDwgInBpZCMiIDw8IGFSSUQuZ2V0UmlkKCkgPDwgIjoiIDw8IGx2YWx1ZS0+Z2V0TmFtZUlEKCk7CisJb3NzSWQgIDw8IGx2YWx1ZS0+Z2V0TmFtZUlEKCk7CisvL0FWTV9FTkRJRl9ERUJVR19GTEFHKCBMT0FESU5HICkKKworCWF2bV91aW50MzJfdCBpbnN0TnVtYmVyID0gbHZhbHVlLT5pbnN0YW5jaWF0aW9uQ291bnRJbmNyKCk7CisJb3NzVWZpIDw8ICIjIiA8PCBpbnN0TnVtYmVyOworCW9zc0lkICA8PCAiIyIgPDwgaW5zdE51bWJlcjsKKworCUluc3RhbmNlT2ZEYXRhICogdGhlU3ltYm9saWNQYXJhbSA9IG5ldyBJbnN0YW5jZU9mRGF0YSgKKwkJCUlQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9TVEFOREFSRF9OQVRVUkUsCisJCQlhUklELmdldEV4ZWN1dGFibGUoKSwgbHZhbHVlLT5nZXRBc3RFbGVtZW50KCksCisJCQlhVHlwZVNwZWNpZmllciwgb3NzVWZpLnN0cigpLCAwLAorCQkJTW9kaWZpZXI6OlBBUkFNRVRFUl9QVUJMSUNfRklOQUxfU1RBVElDX01PRElGSUVSICk7CisJdGhlU3ltYm9saWNQYXJhbS0+c2V0Q3JlYXRvckNvbnRhaW5lclJJRCggYVJJRCApOworCXRoZVN5bWJvbGljUGFyYW0tPnNldE5hbWVJRCggb3NzSWQuc3RyKCkgKTsKKworCXJldHVybiggdGhlU3ltYm9saWNQYXJhbSApOworfQorCisKK0JGIEJhc2VFbnZpcm9ubWVudDo6ZXZhbEluaXRpYWwoCisJCUFQRXhlY3V0aW9uRGF0YSAmIGFuRUQsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsCisJCUluc3RhbmNlT2ZEYXRhICogbHZhbHVlLCBjb25zdCBCRiAmIGFuSW5pdGlhbFZhbHVlKQoreworCWlmKCBhbkluaXRpYWxWYWx1ZS5pbnZhbGlkKCkgKQorCXsKKwkJcmV0dXJuKCBhbkluaXRpYWxWYWx1ZSApOworCX0KKworCWVsc2UgaWYoIGFuSW5pdGlhbFZhbHVlLmlzPCBJbnN0YW5jZU9mRGF0YSA+KCkgKQorCXsKKwkJaWYoIGFuSW5pdGlhbFZhbHVlLmlzVEVRKEV4ZWN1dGFibGVMaWI6Ok1BQ0hJTkVfU0VMRikgKQorCQl7CisJCQlyZXR1cm4oIGFSSUQgKTsKKwkJfQorCQllbHNlIGlmKCBhbkluaXRpYWxWYWx1ZS5pc1RFUShFeGVjdXRhYmxlTGliOjpNQUNISU5FX1BBUkVOVCkgKQorCQl7CisJCQlyZXR1cm4oIGFSSUQuZ2V0UFJJRCgpICk7CisJCX0KKwl9CisKKwllbHNlIGlmKCBhbkluaXRpYWxWYWx1ZS5pczwgSW5zdGFuY2VPZk1hY2hpbmUgPigpICkKKwl7CisJCWlmKCBhbkluaXRpYWxWYWx1ZS5pc1RFUShFeGVjdXRhYmxlTGliOjpNQUNISU5FX0VOVklST05NRU5UKSApCisJCXsKKwkJCXJldHVybiggUnVudGltZUxpYjo6UklEX0VOVklST05NRU5UICk7CisJCX0KKwkJZWxzZSBpZiggYW5Jbml0aWFsVmFsdWUuaXNURVEoRXhlY3V0YWJsZUxpYjo6TUFDSElORV9OVUxMKSApCisJCXsKKwkJCXJldHVybiggUnVudGltZUxpYjo6UklEX05JTCApOworCQl9CisJfQorCisJZWxzZSBpZiggYW5Jbml0aWFsVmFsdWUuaXM8IEFycmF5QkYgPigpICkKKwl7CisJCUFycmF5QkYgKiBhbkluaXRpYWxCdWlsdGluQXJyYXkgPSBhbkluaXRpYWxWYWx1ZS50b19wdHI8IEFycmF5QkYgPigpOworCisJCWF2bV9zaXplX3QgYVNpemUgPSBhbkluaXRpYWxCdWlsdGluQXJyYXktPnNpemUoKTsKKwkJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDAgOyBvZmZzZXQgPCBhU2l6ZSA7ICsrb2Zmc2V0ICkKKwkJeworCQkJQkYgJiB2YWxPZmZzZXQgPSBhbkluaXRpYWxCdWlsdGluQXJyYXktPmF0KG9mZnNldCk7CisKKwkJCXZhbE9mZnNldCA9IGV2YWxJbml0aWFsKGFuRUQsIGFSSUQsIGx2YWx1ZSwgdmFsT2Zmc2V0KTsKKwkJfQorCisJCXJldHVybiggYW5Jbml0aWFsVmFsdWUgKTsKKwl9CisKKwllbHNlIGlmKCBhbkluaXRpYWxWYWx1ZS5pczwgQnVpbHRpbkFycmF5ID4oKSApCisJeworCQlyZXR1cm4oIGFuSW5pdGlhbFZhbHVlICk7CisJfQorCisJZWxzZSBpZiggYW5Jbml0aWFsVmFsdWUuaXM8IEJ1aWx0aW5Db250YWluZXIgPigpICkKKwl7CisJCUJ1aWx0aW5Db250YWluZXIgKiBhbkluaXRpYWxCdWlsdGluQ29udGFpbmVyID0KKwkJCQlhbkluaXRpYWxWYWx1ZS50b19wdHI8IEJ1aWx0aW5Db250YWluZXIgPigpOworCisJCWF2bV9zaXplX3QgYVNpemUgPSBhbkluaXRpYWxCdWlsdGluQ29udGFpbmVyLT5zaXplKCk7CisJCWZvciggYXZtX3NpemVfdCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgYVNpemUgOyArK29mZnNldCApCisJCXsKKwkJCUJGIHZhbE9mZnNldCA9IGFuSW5pdGlhbEJ1aWx0aW5Db250YWluZXItPmF0KG9mZnNldCk7CisKKwkJCXZhbE9mZnNldCA9IGV2YWxJbml0aWFsKGFuRUQsIGFSSUQsIGx2YWx1ZSwgdmFsT2Zmc2V0KTsKKwkJfQorCisJCXJldHVybiggYW5Jbml0aWFsVmFsdWUgKTsKKwl9CisKKwlyZXR1cm4oIGFuSW5pdGlhbFZhbHVlICk7Cit9CisKK0JGIEJhc2VFbnZpcm9ubWVudDo6Y3JlYXRlSW5pdGlhbChBUEV4ZWN1dGlvbkRhdGEgJiBhbkVELAorCQljb25zdCBSdW50aW1lSUQgJiBhUklELCBJbnN0YW5jZU9mRGF0YSAqIGx2YWx1ZSkKK3sKKwlCRiB0aGVJbml0aWFsVmFsdWUgPSBsdmFsdWUtPmdldFZhbHVlKCk7CisKKwlpZiggbHZhbHVlLT5nZXRNb2RpZmllcigpLmhhc05hdHVyZU1hY3JvKCkgKQorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1NNQVJUX1BPSU5URVJfRVhJVCggdGhlSW5pdGlhbFZhbHVlICkKKwkJCQk8PCAiQmFzZUVudmlyb25tZW50OjpjcmVhdGVJbml0aWFsOj4gIgorCQkJCQkiVW5leHBlY3RlZCBhbiBpbnN0YW5jZSBtYWNybyA8PCAiCisJCQkJPDwgbHZhbHVlLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8ICIgPj4gIHdpdGhvdXQgaW5pdGlhbCB2YWx1ZSAhISEiCisJCQkJPDwgU0VORF9FWElUOworCisJCXJldHVybiggdGhlSW5pdGlhbFZhbHVlICk7CisJfQorCWVsc2UgaWYoIGx2YWx1ZS0+Z2V0TW9kaWZpZXIoKS5oYXNOYXR1cmVSZWZlcmVuY2UoKSApCisJeworCQlpZiggdGhlSW5pdGlhbFZhbHVlLmlzPCBJbnN0YW5jZU9mRGF0YSA+KCkgKQorCQl7CisJCQlJbnN0YW5jZU9mRGF0YSAqIHRoZUluaXRpYWxJbnN0YW5jZSA9CisJCQkJCXRoZUluaXRpYWxWYWx1ZS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKTsKKworCQkJaWYoIHRoZUluaXRpYWxJbnN0YW5jZS0+Z2V0TW9kaWZpZXIoKS5oYXNGZWF0dXJlTXV0YWJsZSgpICkKKwkJCXsKKwkJCQlpZiggRXhwcmVzc2lvblR5cGVDaGVja2VyOjp3ZWFrbHlUeXBlZChsdmFsdWUtPmdldFR5cGVTcGVjaWZpZXIoKSwKKwkJCQkJCXRoZUluaXRpYWxJbnN0YW5jZS0+Z2V0VHlwZVNwZWNpZmllcigpKSkKKwkJCQl7CisJCQkJCXJldHVybiggdGhlSW5pdGlhbFZhbHVlICk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQk8PCAiQmFzZUVudmlyb25tZW50OjpjcmVhdGVJbml0aWFsOj4gIgorCQkJCQkJCSJVbmV4cGVjdGVkIGFuIGluc3RhbmNlIDw8ICIKKwkJCQkJCTw8IHN0cl9oZWFkZXIoIGx2YWx1ZSApCisJCQkJCQk8PCAiID4+IHdpdGggbm9uIG11dGFibGUgaW5pdGlhbCBpbnN0YW5jZSA8PCAiCisJCQkJCQk8PCBzdHJfaGVhZGVyKCB0aGVJbml0aWFsSW5zdGFuY2UgKSA8PCAiID4+ICEhISIKKwkJCQkJCTw8IFNFTkRfRVhJVDsKKwkJCX0KKwkJfQorCQllbHNlIGlmKCB0aGVJbml0aWFsVmFsdWUudmFsaWQoKSApCisJCXsKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCTw8ICJCYXNlRW52aXJvbm1lbnQ6OmNyZWF0ZUluaXRpYWw6PiAiCisJCQkJCQkiVW5leHBlY3RlZCBhbiBpbnN0YW5jZSA8PCAiCisJCQkJCTw8IHN0cl9oZWFkZXIoIGx2YWx1ZSApIDw8ICIgPj4gd2l0aCBpbml0aWFsIHZhbHVlIDw8IgorCQkJCQk8PCBzdHJfaW5kZW50KCB0aGVJbml0aWFsVmFsdWUgKSA8PCAiID4+ICEhISIKKwkJCQkJPDwgU0VORF9FWElUOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuKCBhbkVELnNhdmVQYXJhbWV0ZXIoIGNyZWF0ZShhUklELCBsdmFsdWUpICkgKTsKKwkJfQorCX0KKworCWVsc2UgaWYoIHRoZUluaXRpYWxWYWx1ZS5pczwgSW5zdGFuY2VPZkRhdGEgPigpICkKKwl7CisJCUluc3RhbmNlT2ZEYXRhICogdGhlSW5pdGlhbEluc3RhbmNlID0KKwkJCQl0aGVJbml0aWFsVmFsdWUudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCk7CisKKwkJaWYoIHRoZUluaXRpYWxJbnN0YW5jZS0+Z2V0TW9kaWZpZXIoKS4KKwkJCQkJaGFzTW9kaWZpZXJQdWJsaWNGaW5hbFN0YXRpY1BhcmFtZXRlcigpICkKKwkJeworCQkJaWYoIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6d2Vha2x5VHlwZWQobHZhbHVlLT5nZXRUeXBlU3BlY2lmaWVyKCksCisJCQkJCXRoZUluaXRpYWxJbnN0YW5jZS0+Z2V0VHlwZVNwZWNpZmllcigpKSkKKwkJCXsKKwkJCQlyZXR1cm4oIHRoZUluaXRpYWxWYWx1ZSApOworCQkJfQorCQl9CisJCWVsc2UgaWYoIHRoZUluaXRpYWxJbnN0YW5jZS0+aGFzVmFsdWUoKSApCisJCXsKKwkJCXRoZUluaXRpYWxWYWx1ZSA9IHRoZUluaXRpYWxJbnN0YW5jZS0+Z2V0VmFsdWUoKTsKKwkJfQorCQllbHNlIGlmKCB0aGVJbml0aWFsSW5zdGFuY2UtPmdldE1vZGlmaWVyKCkuaGFzRmVhdHVyZU11dGFibGUoKSApCisJCXsKKwkJCXRoZUluaXRpYWxWYWx1ZSA9IGdldFJ2YWx1ZShhbkVELCBhUklELCB0aGVJbml0aWFsSW5zdGFuY2UpOworCQkJaWYoIHRoZUluaXRpYWxWYWx1ZS5pbnZhbGlkKCkgKQorCQkJeworCQkJCXRoZUluaXRpYWxWYWx1ZSA9IGNyZWF0ZUluaXRpYWwoYW5FRCwgYVJJRCwgdGhlSW5pdGlhbEluc3RhbmNlKTsKKworCQkJCXRoZUluaXRpYWxJbnN0YW5jZS0+c2V0VmFsdWUodGhlSW5pdGlhbFZhbHVlKTsKKwkJCX0KKworCQkJaWYoIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6d2Vha2x5VHlwZWQobHZhbHVlLT5nZXRUeXBlU3BlY2lmaWVyKCksCisJCQkJCXRoZUluaXRpYWxJbnN0YW5jZS0+Z2V0VHlwZVNwZWNpZmllcigpKSkKKwkJCXsKKwkJCQlyZXR1cm4oIHRoZUluaXRpYWxWYWx1ZSApOworCQkJfQorCQl9CisJfQorCisJdGhlSW5pdGlhbFZhbHVlID0gZXZhbEluaXRpYWwoYW5FRCwgYVJJRCwgbHZhbHVlLCB0aGVJbml0aWFsVmFsdWUpOworCisKKwlpZiggbHZhbHVlLT5oYXNUeXBlU3BlY2lmaWVyKCkgKQorCXsKKwkJQmFzZVR5cGVTcGVjaWZpZXIgKiBhVHlwZVNwZWNpZmllciA9IGx2YWx1ZS0+Z2V0VHlwZVNwZWNpZmllcigpOworCQlpZiggYVR5cGVTcGVjaWZpZXItPmlzPCBUeXBlQWxpYXNTcGVjaWZpZXIgPigpICkKKwkJeworCQkJYVR5cGVTcGVjaWZpZXIgPSBhVHlwZVNwZWNpZmllci0+dG88IFR5cGVBbGlhc1NwZWNpZmllciA+KCktPgorCQkJCQl0YXJnZXRUeXBlU3BlY2lmaWVyKCk7CisJCX0KKworCQlpZiggYVR5cGVTcGVjaWZpZXItPmlzVHlwZWRBcnJheSgpICkKKwkJeworCQkJQ29udGFpbmVyVHlwZVNwZWNpZmllciAqIGNvbnRhaW5lclQgPQorCQkJCQlhVHlwZVNwZWNpZmllci0+YXM8IENvbnRhaW5lclR5cGVTcGVjaWZpZXIgPigpOworCQkJYXZtX3NpemVfdCBzaXplVCA9IGNvbnRhaW5lclQtPnNpemUoKTsKKworCQkJaWYoIHRoZUluaXRpYWxWYWx1ZS52YWxpZCgpICkKKwkJCXsKKwkJCQlpZiggdGhlSW5pdGlhbFZhbHVlLmlzPCBCdWlsdGluQXJyYXkgPigpICkKKwkJCQl7CisJCQkJCXJldHVybiggY3JlYXRlSW5pdGlhbChhbkVELCBhUklELCBsdmFsdWUsCisJCQkJCQkJdGhlSW5pdGlhbFZhbHVlLnRvX3B0cjwgQnVpbHRpbkFycmF5ID4oKSkgKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcmV0dXJuKCBCRiggbmV3IEFycmF5QkYoY29udGFpbmVyVCwgdGhlSW5pdGlhbFZhbHVlKSApKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQXJyYXlCRiAqIGFycmF5VmFsdWUgPSBuZXcgQXJyYXlCRihhVHlwZVNwZWNpZmllciwgc2l6ZVQpOworCisJCQkJVGFibGVPZlN5bWJvbDo6aXRlcmF0b3IgaXQgPSBsdmFsdWUtPmdldEF0dHJpYnV0ZSgpLT5iZWdpbigpOworCQkJCWZvciggYXZtX3NpemVfdCBpZHggPSAwIDsgaWR4IDwgc2l6ZVQgOyArK2lkeCAsICsraXQgKQorCQkJCXsKKwkJCQkJYXJyYXlWYWx1ZS0+c2V0KGlkeCwgY3JlYXRlSW5pdGlhbChhbkVELCBhUklELCAoKml0KSkpOworCQkJCX0KKworCQkJCXJldHVybiggQkYoYXJyYXlWYWx1ZSkgKTsKKwkJCX0KKwkJfQorCisJCWVsc2UgaWYoIGFUeXBlU3BlY2lmaWVyLT5oYXNUeXBlQ29sbGVjdGlvbigpICkKKwkJeworCQkJQnVpbHRpbkNvbnRhaW5lciAqIGNvbnRhaW5lclZhbHVlID0gQnVpbHRpbkNvbnRhaW5lcjo6Y3JlYXRlKAorCQkJCQlhVHlwZVNwZWNpZmllci0+YXM8IENvbnRhaW5lclR5cGVTcGVjaWZpZXIgPigpICk7CisKKwkJCWlmKCB0aGVJbml0aWFsVmFsdWUudmFsaWQoKSApCisJCQl7CisJCQkJaWYoIHRoZUluaXRpYWxWYWx1ZS5pczwgQnVpbHRpbkFycmF5ID4oKSApCisJCQkJeworCQkJCQlCdWlsdGluQXJyYXkgKiB0aGVJbml0aWFsQnVpbHRpbkFycmF5ID0KKwkJCQkJCQl0aGVJbml0aWFsVmFsdWUudG9fcHRyPCBCdWlsdGluQXJyYXkgPigpOworCisJCQkJCWNvbnRhaW5lclZhbHVlLT5jb3B5KCB0aGVJbml0aWFsQnVpbHRpbkFycmF5LAorCQkJCQkJCXN0ZDo6bWluKGNvbnRhaW5lclZhbHVlLT5jYXBhY2l0eSgpLAorCQkJCQkJCQkJdGhlSW5pdGlhbEJ1aWx0aW5BcnJheS0+c2l6ZSgpKSApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQljb250YWluZXJWYWx1ZS0+YWRkKCB0aGVJbml0aWFsVmFsdWUgKTsKKwkJCQl9CisJCQl9CisKKwkJCXJldHVybiggQkYoY29udGFpbmVyVmFsdWUpICk7CisJCX0KKworCQllbHNlIGlmKCBhVHlwZVNwZWNpZmllci0+aXNUeXBlZENsYXNzKCkgKQorCQl7CisJCQlhdm1fc2l6ZV90IHNpemVUID0gYVR5cGVTcGVjaWZpZXItPnNpemUoKTsKKworCQkJaWYoIHRoZUluaXRpYWxWYWx1ZS52YWxpZCgpICkKKwkJCXsKKwkJCQlpZiggdGhlSW5pdGlhbFZhbHVlLmlzPCBCdWlsdGluQXJyYXkgPigpICkKKwkJCQl7CisJCQkJCXJldHVybiggY3JlYXRlSW5pdGlhbChhbkVELCBhUklELCBsdmFsdWUsCisJCQkJCQkJdGhlSW5pdGlhbFZhbHVlLnRvX3B0cjwgQnVpbHRpbkFycmF5ID4oKSkgKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcmV0dXJuKCBCRiggbmV3IEFycmF5QkYoCisJCQkJCQkJYVR5cGVTcGVjaWZpZXIsIHNpemVULCB0aGVJbml0aWFsVmFsdWUgKSkpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlBcnJheUJGICogYXJyYXlWYWx1ZSA9IG5ldyBBcnJheUJGKGFUeXBlU3BlY2lmaWVyLCBzaXplVCk7CisKKwkJCQlUYWJsZU9mU3ltYm9sOjppdGVyYXRvciBpdCA9IGx2YWx1ZS0+Z2V0QXR0cmlidXRlKCktPmJlZ2luKCk7CisJCQkJZm9yKCBhdm1fc2l6ZV90IGlkeCA9IDAgOyBpZHggPCBzaXplVCA7ICsraWR4ICwgKytpdCApCisJCQkJeworCQkJCQlhcnJheVZhbHVlLT5zZXQoaWR4LCBjcmVhdGVJbml0aWFsKGFuRUQsIGFSSUQsICgqaXQpKSk7CisJCQkJfQorCisJCQkJcmV0dXJuKCBCRihhcnJheVZhbHVlKSApOworCQkJfQorCQl9CisKKwkJZWxzZSAvL2lmKCBhVHlwZVNwZWNpZmllci0+aXNUeXBlZFNpbXBsZSgpICkKKwkJeworCQkJaWYoIHRoZUluaXRpYWxWYWx1ZS52YWxpZCgpICkKKwkJCXsKKwkJCQlyZXR1cm4oIHRoZUluaXRpYWxWYWx1ZSApOworCQkJfQorCisvLwkJCWVsc2UgaWYoIGFUeXBlU3BlY2lmaWVyLT5pc1R5cGVkU3RyaW5nKCkgKQorLy8JCQl7CisvLwkJCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3U3RyaW5nKCIiKSApOworLy8JCQl9CisJCQllbHNlIGlmKCBhVHlwZVNwZWNpZmllci0+aXNUeXBlZE1hY2hpbmUoKSApCisJCQl7CisJCQkJcmV0dXJuKCBSdW50aW1lTGliOjpSSURfTklMICk7CisJCQl9CisJCQllbHNlIGlmKCBhVHlwZVNwZWNpZmllci0+aXNUeXBlZENoYW5uZWwoKSApCisJCQl7CisJCQkJcmV0dXJuKCBFeGVjdXRhYmxlTGliOjpDSEFOTkVMX05JTCApOworCQkJfQorCQkJZWxzZSBpZiggYVR5cGVTcGVjaWZpZXItPmlzVHlwZWRQb3J0KCkgKQorCQkJeworCQkJCXJldHVybiggRXhlY3V0YWJsZUxpYjo6UE9SVF9OSUwgKTsKKwkJCX0KKwkJCWVsc2UgaWYoIGFUeXBlU3BlY2lmaWVyLT5pc1R5cGVkQnVmZmVyKCkgKQorCQkJeworCQkJCXJldHVybiggRXhlY3V0YWJsZUxpYjo6QlVGRkVSX05JTCApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJldHVybiggYW5FRC5zYXZlUGFyYW1ldGVyKCBjcmVhdGUoYVJJRCwgbHZhbHVlKSApICk7CisJCQl9CisJCX0KKwl9CisJZWxzZQorCXsKKwkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQk8PCAiQmFzZUVudmlyb25tZW50OjpjcmVhdGVJbml0aWFsOj4gVW5leHBlY3RlZCBhbiBpbnN0YW5jZSA8PCAiCisJCQkJPDwgbHZhbHVlLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8ICIgPj4gIHdpdGhvdXQgdHlwZVNwZWNpZmllciAhISEiCisJCQkJPDwgU0VORF9FWElUOworCisJCXJldHVybiggQkY6OlJFRl9OVUxMICk7CisJfQorfQorCisKKworQkYgQmFzZUVudmlyb25tZW50OjpjcmVhdGVJbml0aWFsKAorCQlBUEV4ZWN1dGlvbkRhdGEgJiBhbkVELCBjb25zdCBSdW50aW1lSUQgJiBhUklELAorCQlJbnN0YW5jZU9mRGF0YSAqIGx2YWx1ZSwgQnVpbHRpbkFycmF5ICogaW5pdGlhbEFycmF5KQoreworCWF2bV9zaXplX3Qgc2l6ZVQgPSBsdmFsdWUtPmdldFR5cGVTcGVjaWZpZXIoKS0+c2l6ZSgpOworCisJQXJyYXlCRiAqIGJmVmFsdWUgPSBuZXcgQXJyYXlCRigKKwkJCSggaW5pdGlhbEFycmF5LT5oYXNUeXBlU3BlY2lmaWVyKCkgPworCQkJCQlpbml0aWFsQXJyYXktPmdldFR5cGVTcGVjaWZpZXIoKSA6CisJCQkJCWx2YWx1ZS0+Z2V0VHlwZVNwZWNpZmllcigpICksIHNpemVUKTsKKworCWlmKCBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzRmluYWxTeW1ib2xpY0NvbXBvc2l0ZVN5bWJvbChpbml0aWFsQXJyYXkpICkKKwl7CisJCWF2bV9zaXplX3QgaWR4ID0gaW5pdGlhbEFycmF5LT5zaXplKCk7CisKKwkJaWYoIGlkeCA8PSBzaXplVCApCisJCXsKKwkJCWJmVmFsdWUtPmNvcHkoaW5pdGlhbEFycmF5LCBpZHgpOworCisJCQlmb3IoIDsgaWR4IDwgc2l6ZVQgOyArK2lkeCApCisJCQl7CisJCQkJYmZWYWx1ZS0+c2V0KGlkeCwgY3JlYXRlSW5pdGlhbChhbkVELCBhUklELAorCQkJCQkJbHZhbHVlLT5nZXRBdHRyaWJ1dGUoKS0+YXQoaWR4KSkpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJYmZWYWx1ZS0+Y29weShpbml0aWFsQXJyYXksIHNpemVUKTsKKwkJfQorCX0KKwllbHNlIC8vaWYoIGluaXRpYWxBcnJheS0+aXM8IEFycmF5QkYgPigpICkKKwl7CisJCUFycmF5QkYgKiBiZkluaXRpYWxBcnJheSA9IGluaXRpYWxBcnJheS0+dG88IEFycmF5QkYgPigpOworCisJCWF2bV9zaXplX3QgaW5pdFNpemVUID0gYmZJbml0aWFsQXJyYXktPnNpemUoKTsKKworCQlpZiggaW5pdFNpemVUID4gc2l6ZVQgKQorCQl7CisJCQlpbml0U2l6ZVQgPSBzaXplVDsKKwkJfQorCisJCWZvciggYXZtX3NpemVfdCBpZHggPSAwIDsgaWR4IDwgaW5pdFNpemVUIDsgKytpZHggKQorCQl7CisJCQlpZiggRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc0ZpbmFsU3ltYm9saWNTeW1ib2woCisJCQkJCWJmSW5pdGlhbEFycmF5LT5hdChpZHgpKSApCisJCQl7CisJCQkJYmZWYWx1ZS0+c2V0KGlkeCwgYmZJbml0aWFsQXJyYXktPmF0KGlkeCkpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWJmVmFsdWUtPnNldChpZHgsIGNyZWF0ZUluaXRpYWwoYW5FRCwgYVJJRCwKKwkJCQkJCWx2YWx1ZS0+Z2V0QXR0cmlidXRlKCktPmF0KGlkeCkpKTsKKwkJCX0KKwkJfQorCisJCWZvciggYXZtX3NpemVfdCBpZHggPSBpbml0U2l6ZVQgOyBpZHggPCBzaXplVCA7ICsraWR4ICkKKwkJeworCQkJYmZWYWx1ZS0+c2V0KGlkeCwgY3JlYXRlSW5pdGlhbChhbkVELCBhUklELAorCQkJCQlsdmFsdWUtPmdldEF0dHJpYnV0ZSgpLT5hdChpZHgpKSk7CisJCX0KKwl9CisKKwlyZXR1cm4oIEJGKGJmVmFsdWUpICk7Cit9CisKKworQkYgQmFzZUVudmlyb25tZW50OjpjcmVhdGVOZXdGcmVzaFBhcmFtKGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsCisJCUJhc2VUeXBlU3BlY2lmaWVyICogYVR5cGVTcGVjaWZpZXIsCisJCUluc3RhbmNlT2ZEYXRhICogbHZhbHVlLCBCRkxpc3QgJiBwYXJhbUxpc3QpCit7CisJaWYoIGFUeXBlU3BlY2lmaWVyICE9IE5VTEwgKQorCXsKKwkJaWYoIGFUeXBlU3BlY2lmaWVyLT5pczwgVHlwZUFsaWFzU3BlY2lmaWVyID4oKSApCisJCXsKKwkJCWFUeXBlU3BlY2lmaWVyLT50bzwgVHlwZUFsaWFzU3BlY2lmaWVyID4oKS0+dGFyZ2V0VHlwZVNwZWNpZmllcigpOworCQl9CisKKwkJaWYoIGFUeXBlU3BlY2lmaWVyLT5pc1R5cGVkQXJyYXkoKSApCisJCXsKKwkJCUNvbnRhaW5lclR5cGVTcGVjaWZpZXIgKiBjb250YWluZXJUID0KKwkJCQkJYVR5cGVTcGVjaWZpZXItPmFzPCBDb250YWluZXJUeXBlU3BlY2lmaWVyID4oKTsKKwkJCWF2bV9zaXplX3Qgc2l6ZVQgPSBjb250YWluZXJULT5zaXplKCk7CisKKwkJCUFycmF5QkYgKiBhcnJheVZhbHVlID0gbmV3IEFycmF5QkYoY29udGFpbmVyVCwgc2l6ZVQpOworCisJCQlUYWJsZU9mU3ltYm9sOjppdGVyYXRvciBpdCA9IGx2YWx1ZS0+Z2V0QXR0cmlidXRlKCktPmJlZ2luKCk7CisJCQlmb3IoIGF2bV9zaXplX3QgaWR4ID0gMCA7IGlkeCA8IHNpemVUIDsgKytpZHggLCArK2l0ICkKKwkJCXsKKwkJCQlhcnJheVZhbHVlLT5zZXQoaWR4LAorCQkJCQkJY3JlYXRlTmV3RnJlc2hQYXJhbShhUklELCAoKml0KSwgcGFyYW1MaXN0KSk7CisJCQl9CisKKwkJCXJldHVybiggQkYoYXJyYXlWYWx1ZSkgKTsKKwkJfQorCisJCS8vVE9ETworCQllbHNlIGlmKCBhVHlwZVNwZWNpZmllci0+aGFzVHlwZUNvbGxlY3Rpb24oKSApCisJCXsKKwkJCUJ1aWx0aW5Db250YWluZXIgKiBjb250YWluZXJWYWx1ZSA9IEJ1aWx0aW5Db250YWluZXI6OmNyZWF0ZSgKKwkJCQkJYVR5cGVTcGVjaWZpZXItPmFzPCBDb250YWluZXJUeXBlU3BlY2lmaWVyID4oKSk7CisKKwkJCXJldHVybiggQkYoY29udGFpbmVyVmFsdWUpICk7CisJCX0KKworCQllbHNlIGlmKCBhVHlwZVNwZWNpZmllci0+aXNUeXBlZENsYXNzKCkgKQorCQl7CisJCQlDbGFzc1R5cGVTcGVjaWZpZXIgKiBjbGFzc1R5cGUgPQorCQkJCQlhVHlwZVNwZWNpZmllci0+YXM8IENsYXNzVHlwZVNwZWNpZmllciA+KCk7CisJCQlhdm1fc2l6ZV90IHNpemVUID0gY2xhc3NUeXBlLT5zaXplKCk7CisKKwkJCUFycmF5QkYgKiBhcnJheVZhbHVlID0gbmV3IEFycmF5QkYoYVR5cGVTcGVjaWZpZXIsIHNpemVUKTsKKworCQkJVGFibGVPZlN5bWJvbDo6aXRlcmF0b3IgaXQgPSBsdmFsdWUtPmdldEF0dHJpYnV0ZSgpLT5iZWdpbigpOworCQkJZm9yKCBhdm1fc2l6ZV90IGlkeCA9IDAgOyBpZHggPCBzaXplVCA7ICsraWR4ICwgKytpdCApCisJCQl7CisJCQkJYXJyYXlWYWx1ZS0+c2V0KGlkeCwKKwkJCQkJCWNyZWF0ZU5ld0ZyZXNoUGFyYW0oYVJJRCwgKCppdCksIHBhcmFtTGlzdCkpOworCQkJfQorCisJCQlyZXR1cm4oIEJGKGFycmF5VmFsdWUpICk7CisJCX0KKworCQllbHNlIC8vaWYoIGFUeXBlU3BlY2lmaWVyLT5pc1R5cGVkU2ltcGxlKCkgKQorCQl7CisvLwkJCWlmKCBhVHlwZVNwZWNpZmllci0+aXNUeXBlZFN0cmluZygpICkKKy8vCQkJeworLy8JCQkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld1N0cmluZygiIikgKTsKKy8vCQkJfQorLy8JCQllbHNlCisvLwkJCQlpZiggYVR5cGVTcGVjaWZpZXItPmlzVHlwZWRNYWNoaW5lKCkgKQorLy8JCQl7CisvLwkJCQlyZXR1cm4oIFJ1bnRpbWVMaWI6OlJJRF9OSUwgKTsKKy8vCQkJfQorLy8JCQllbHNlCisJCQl7CisJCQkJQkYgYU5ld0ZyZXNoUGFyYW0oIGNyZWF0ZShhUklELCBhVHlwZVNwZWNpZmllciwgbHZhbHVlKSApOworCisJCQkJcGFyYW1MaXN0LmFwcGVuZCggYU5ld0ZyZXNoUGFyYW0gKTsKKworCQkJCXJldHVybiggYU5ld0ZyZXNoUGFyYW0gKTsKKwkJCX0KKwkJfQorCX0KKwllbHNlCisJeworCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCTw8ICJnZXRJbml0aWFsVmFsdWU6PiBVbmV4cGVjdGVkIGFuIGluc3RhbmNlIDw8ICIKKwkJCQk8PCBsdmFsdWUtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIiA+PiAgd2l0aG91dCB0eXBlU3BlY2lmaWVyICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKKwl9CisKKwlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworfQorCisKK1N5bWJvbCBCYXNlRW52aXJvbm1lbnQ6OmNyZWF0ZSgKKwkJY29uc3QgUnVudGltZUlEICYgYVJJRCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBwYXJhbUlELAorCQljb25zdCBUeXBlU3BlY2lmaWVyICYgYVR5cGVTcGVjaWZpZXIsIGNvbnN0IEJGICYgYVZhbHVlKQoreworCXN0ZDo6b3N0cmluZ3N0cmVhbSBvc3NVZmk7CisKKwlvc3NVZmkgPDwgInBpZCMiIDw8IGFSSUQuZ2V0UmlkKCkKKwkJCTw8ICI6IiA8PCBwYXJhbUlEIDw8ICIjIiA8PCArK05FV19QQVJBTV9PRkZTRVQ7CisKKwlTeW1ib2wgdGhlU3ltYm9saWNQYXJhbSggbmV3IEluc3RhbmNlT2ZEYXRhKAorCQkJSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX1NUQU5EQVJEX05BVFVSRSwKKwkJCWFSSUQuZ2V0RXhlY3V0YWJsZSgpLCBOVUxMLCBhVHlwZVNwZWNpZmllciwgb3NzVWZpLnN0cigpLCAwLAorCQkJTW9kaWZpZXI6OlBBUkFNRVRFUl9QVUJMSUNfRklOQUxfU1RBVElDX01PRElGSUVSKSApOworCisJdGhlU3ltYm9saWNQYXJhbS5zZXRDcmVhdG9yQ29udGFpbmVyUklEKCBhUklEICk7CisJdGhlU3ltYm9saWNQYXJhbS5zZXROYW1lSUQoIG9zc1VmaS5zdHIoKSApOworCXRoZVN5bWJvbGljUGFyYW0uc2V0VmFsdWUoIGFWYWx1ZSApOworCisJdGhlU3ltYm9saWNQYXJhbS5zZXRJbnN0YW5jaWF0aW9uQ291bnQoTkVXX1BBUkFNX09GRlNFVCk7CisKKwlyZXR1cm4oIFN5bWJvbCggdGhlU3ltYm9saWNQYXJhbSApICk7Cit9CisKKworCitTeW1ib2wgQmFzZUVudmlyb25tZW50OjpjcmVhdGU0QXJyYXlBY2Nlc3MoQVBFeGVjdXRpb25EYXRhICYgYXBFRCwKKwkJY29uc3QgUnVudGltZUlEICYgYVJJRCwgY29uc3QgQkYgJiBhcnJheVZhbHVlLAorCQlJbnN0YW5jZU9mRGF0YSAqIGx2YWx1ZU9mSW5kZXgpCit7CisJc3RkOjpvc3RyaW5nc3RyZWFtIG9zc1VGSTsKKwlzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzSUQ7CisKKwlvc3NVRkkgPDwgInBpZCMiIDw8IGFSSUQuZ2V0UmlkKCkgPDwgIjoiOworCW9zc1VGSSA8PCBsdmFsdWVPZkluZGV4LT5nZXRDb250YWluZXIoKS0+CisJCQlnZXREYXRhKCkucmF3QXQobHZhbHVlT2ZJbmRleC0+Z2V0T2Zmc2V0KCkpLT5nZXRBc3ROYW1lSUQoKTsKKwlvc3NVRkkgPDwgIiMiIDw8ICsrTkVXX1BBUkFNX09GRlNFVDsKKwkvLyBsdmFsdWVPZkluZGV4LT5pbmNySW5zdGFuY2lhdGlvbkNvdW50KCk7CisJb3NzSUQgPDwgb3NzVUZJLnN0cigpOworCisJU3ltYm9sIG5ld1BhcmFtOworCVRhYmxlT2ZTeW1ib2wgYVJlbGF0aXZlRGF0YVBhdGg7CisKKwlUYWJsZU9mU3ltYm9sOjppdGVyYXRvciBpdEVuZCA9IGx2YWx1ZU9mSW5kZXgtPmdldERhdGFQYXRoKCktPmVuZCgpOworCVRhYmxlT2ZTeW1ib2w6Oml0ZXJhdG9yIGl0ID0gbHZhbHVlT2ZJbmRleC0+Z2V0RGF0YVBhdGgoKS0+YmVnaW4oKTsKKworCXN3aXRjaCggbHZhbHVlT2ZJbmRleC0+Z2V0UG9pbnRlck5hdHVyZSgpICkKKwl7CisJCWNhc2UgSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX1VGSV9PRkZTRVRfTkFUVVJFOgorCQl7CisJCQlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwkJCXsKKwkJCQlvc3NVRkkgPDwgIlsiIDw8ICgqaXQpLmdldE9mZnNldCgpIDw8ICJdIjsKKwkJCQlvc3NJRCAgPDwgIlsiIDw8ICgqaXQpLmdldE9mZnNldCgpIDw8ICJdIjsKKwkJCX0KKworCQkJbmV3UGFyYW0gPSBuZXcgSW5zdGFuY2VPZkRhdGEoCisJCQkJCWx2YWx1ZU9mSW5kZXgtPmdldFBvaW50ZXJOYXR1cmUoKSwgYVJJRC5nZXRFeGVjdXRhYmxlKCksCisJCQkJCWx2YWx1ZU9mSW5kZXgsICoobHZhbHVlT2ZJbmRleC0+Z2V0RGF0YVBhdGgoKSkgKTsKKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIElQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9VRklfUlVOVElNRV9OQVRVUkU6CisJCXsKKwkJCS8vIE5PICsxIGZvciA8PCB0aGlzID4+IHdoaWNoIGlzIHRoZSByb290IG9mIHRoZSBwYXRoCisJCQlhdm1fc2l6ZV90IHBhdGhMZW5ndGggPSBsdmFsdWVPZkluZGV4LT5nZXREYXRhUGF0aCgpLT5zaXplKCk7CisJCQlhdm1fc2l6ZV90ICogdGhlT2Zmc2V0UGF0aCA9IGx2YWx1ZU9mSW5kZXgtPmdldE9mZnNldFBhdGgoKTsKKworCQkJZm9yKCBhdm1fc2l6ZV90IGsgPSAxIDsgayA8IHBhdGhMZW5ndGggOyArK2sgKQorCQkJeworCQkJCW9zc1VGSSA8PCAiWyIgPDwgdGhlT2Zmc2V0UGF0aFtrXSA8PCAiXSI7CisJCQkJb3NzSUQgIDw8ICJbIiA8PCB0aGVPZmZzZXRQYXRoW2tdIDw8ICJdIjsKKwkJCX0KKworCQkJbmV3UGFyYW0gPSBuZXcgSW5zdGFuY2VPZkRhdGEoCisJCQkJCWx2YWx1ZU9mSW5kZXgtPmdldFBvaW50ZXJOYXR1cmUoKSwgYVJJRC5nZXRFeGVjdXRhYmxlKCksCisJCQkJCWx2YWx1ZU9mSW5kZXgsICoobHZhbHVlT2ZJbmRleC0+Z2V0RGF0YVBhdGgoKSkgKTsKKworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfVUZJX01JWEVEX05BVFVSRToKKwkJeworCQkJU3ltYm9sIHN5bWJvbGljSW5kZXg7CisJCQlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwkJCXsKKwkJCQlzd2l0Y2goICgqaXQpLmdldFBvaW50ZXJOYXR1cmUoKSApCisJCQkJeworCQkJCQljYXNlIElQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9GSUVMRF9DTEFTU19BVFRSSUJVVEVfTkFUVVJFOgorCQkJCQl7CisJCQkJCQlzeW1ib2xpY0luZGV4ID0gbmV3IEluc3RhbmNlT2ZEYXRhKAorCQkJCQkJCQlJUG9pbnRlckRhdGFOYXR1cmU6OgorCQkJCQkJCQkJCVBPSU5URVJfRklFTERfQVJSQVlfT0ZGU0VUX05BVFVSRSwKKwkJCQkJCQkJKCppdCkuZ2V0Q29udGFpbmVyKCksICgqaXQpLmdldEFzdEVsZW1lbnQoKSwKKwkJCQkJCQkJKCppdCkuZ2V0VHlwZVNwZWNpZmllcigpLCAoKml0KS5nZXRPZmZzZXQoKSApOworCisJCQkJCQlvc3NVRkkgPDwgIi4iIDw8IHN5bWJvbGljSW5kZXguc3RyKCk7CisJCQkJCQlvc3NJRCAgPDwgIi4iIDw8IHN5bWJvbGljSW5kZXguc3RyKCk7CisKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWNhc2UgSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX0ZJRUxEX0FSUkFZX09GRlNFVF9OQVRVUkU6CisJCQkJCXsKKwkJCQkJCXN5bWJvbGljSW5kZXggPSBuZXcgSW5zdGFuY2VPZkRhdGEoCisJCQkJCQkJCUlQb2ludGVyRGF0YU5hdHVyZTo6CisJCQkJCQkJCQkJUE9JTlRFUl9GSUVMRF9BUlJBWV9PRkZTRVRfTkFUVVJFLAorCQkJCQkJCQkoKml0KS5nZXRDb250YWluZXIoKSwgKCppdCkuZ2V0QXN0RWxlbWVudCgpLAorCQkJCQkJCQkoKml0KS5nZXRUeXBlU3BlY2lmaWVyKCksICgqaXQpLmdldE9mZnNldCgpICk7CisKKwkJCQkJCW9zc1VGSSA8PCAiWyIgPDwgc3ltYm9saWNJbmRleC5zdHIoKSA8PCAiXSI7CisJCQkJCQlvc3NJRCAgPDwgIlsiIDw8IHN5bWJvbGljSW5kZXguc3RyKCkgPDwgIl0iOworCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQljYXNlIElQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9GSUVMRF9BUlJBWV9JTkRFWF9OQVRVUkU6CisJCQkJCXsKKwkJCQkJCUV2YWx1YXRpb25FbnZpcm9ubWVudCBlRU5WKCp0aGlzLCBhcEVELCBhUklEKTsKKwkJCQkJCWlmKCBlRU5WLmV2YWwoKCppdCkuZ2V0VmFsdWUoKSkgKQorCQkJCQkJeworCQkJCQkJCWFwRUQgPSBlRU5WLm91dEVEOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQkJCQk8PCAiRmFpbGVkIHRvIGV2YWwgQVJSQVkgaW5kZXggPDwgIgorCQkJCQkJCQkJPDwgKCppdCkuc3RyVmFsdWUoKSA8PCAiID4+IGluIHZhcmlhYmxlIDw8ICIKKwkJCQkJCQkJCTw8IGx2YWx1ZU9mSW5kZXgtPnN0cigpCisJCQkJCQkJCQk8PCAiID4+IGZvciBpbml0aWFsaXppbmcgYSBWVlQgISEhIgorCQkJCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJCQkJcmV0dXJuKCBTeW1ib2w6OlJFRl9OVUxMICk7CisJCQkJCQl9CisKKwkJCQkJCWlmKCBlRU5WLm91dFZBTC5pc051bWVyaWMoKSApCisJCQkJCQl7CisJCQkJCQkJc3ltYm9saWNJbmRleCA9IG5ldyBJbnN0YW5jZU9mRGF0YSgKKwkJCQkJCQkJCUlQb2ludGVyRGF0YU5hdHVyZTo6CisJCQkJCQkJCQkJCVBPSU5URVJfRklFTERfQVJSQVlfT0ZGU0VUX05BVFVSRSwKKwkJCQkJCQkJCSgqaXQpLmdldENvbnRhaW5lcigpLCAoKml0KS5nZXRBc3RFbGVtZW50KCksCisJCQkJCQkJCQkoKml0KS5nZXRUeXBlU3BlY2lmaWVyKCksCisJCQkJCQkJCQllRU5WLm91dFZBTC50b0ludGVnZXIoKSApOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCXN5bWJvbGljSW5kZXggPSBuZXcgSW5zdGFuY2VPZkRhdGEoCisJCQkJCQkJCQlJUG9pbnRlckRhdGFOYXR1cmU6OgorCQkJCQkJCQkJCQlQT0lOVEVSX0ZJRUxEX0FSUkFZX0lOREVYX05BVFVSRSwKKwkJCQkJCQkJCSgqaXQpLmdldENvbnRhaW5lcigpLCAoKml0KS5nZXRBc3RFbGVtZW50KCksCisJCQkJCQkJCQkoKml0KS5nZXRUeXBlU3BlY2lmaWVyKCksIDAgKTsKKwkJCQkJCQlzeW1ib2xpY0luZGV4LnNldFZhbHVlKCBlRU5WLm91dFZBTCApOworCQkJCQkJfQorQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIERBVEEgKQorCUFWTV9PU19UUkFDRSA8PCAiaW5kZXhBcnJheTo+ICIgPDwgZUVOVi5vdXRWQUwudG9TdHJpbmcoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgREFUQSApCisKKwkJCQkJCW9zc1VGSSA8PCAiWyIgPDwgZUVOVi5vdXRWQUwuc3RyKCkgPDwgIl0iOworCQkJCQkJb3NzSUQgIDw8ICJbIiA8PCBlRU5WLm91dFZBTC5zdHIoKSA8PCAiXSI7CisKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWRlZmF1bHQ6CisJCQkJCXsKKwkJCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQkJCTw8ICJTeW1ib2xpY1BhcmFtZXRlckZhY3Rvcnk6OmNyZWF0ZTRBcnJheUFjY2Vzczo+ICIKKwkJCQkJCQkJCSJVbmV4cGVjdGVkIFBPSU5URVIgTkFUVVJFICIKKwkJCQkJCQkJCSJmb3IgdGhlIGluc3RhbmNlIG9mIGRhdGEgOj5cbiIKKwkJCQkJCQkJPDwgKCppdCkudG9TdHJpbmcoIEFWTV9UQUIxX0lOREVOVCApCisJCQkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCQkJcmV0dXJuKCBTeW1ib2w6OlJFRl9OVUxMICk7CisJCQkJCX0KKwkJCQl9CisJCQkJYVJlbGF0aXZlRGF0YVBhdGguYXBwZW5kKHN5bWJvbGljSW5kZXgpOworCQkJfQorCisJCQluZXdQYXJhbSA9IG5ldyBJbnN0YW5jZU9mRGF0YShsdmFsdWVPZkluZGV4LT5nZXRQb2ludGVyTmF0dXJlKCksCisJCQkJCWFSSUQuZ2V0RXhlY3V0YWJsZSgpLCBsdmFsdWVPZkluZGV4LCBhUmVsYXRpdmVEYXRhUGF0aCk7CisKKwkJCWJyZWFrOworCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJPDwgIlN5bWJvbGljUGFyYW1ldGVyRmFjdG9yeTo6Y3JlYXRlNEFycmF5QWNjZXNzOj4gIgorCQkJCQkJIlVuZXhwZWN0ZWQgUE9JTlRFUiBOQVRVUkUgIgorCQkJCQkJImZvciB0aGUgaW5zdGFuY2Ugb2YgaW5kZXggOj5cbiIKKwkJCQkJPDwgbHZhbHVlT2ZJbmRleC0+dG9TdHJpbmcoIEFWTV9UQUIxX0lOREVOVCApCisJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJcmV0dXJuKCBTeW1ib2w6OlJFRl9OVUxMICk7CisJCX0KKwl9CisKKwluZXdQYXJhbS5zZXRWYWx1ZSggYXJyYXlWYWx1ZSApOworCW5ld1BhcmFtLnVwZGF0ZUZ1bGx5UXVhbGlmaWVkTmFtZUlEKCBvc3NVRkkuc3RyKCkgLCBvc3NJRC5zdHIoKSApOworCisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBEQVRBICkKKwlBVk1fT1NfVFJBQ0UgPDwgbmV3UGFyYW0udG9TdHJpbmcoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgREFUQSApCisKKwlyZXR1cm4oIG5ld1BhcmFtICk7CisKK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gdGhlIERBVEEgQUNDRVNTIHN0YXRlbWVudAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogR0VUVEVSCisgKiBBc3NpZ25lZCBGbGFncworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCitib29sIEJhc2VFbnZpcm9ubWVudDo6aXNBc3NpZ25lZChjb25zdCBBUEV4ZWN1dGlvbkRhdGEgJiBhcEVELAorCQljb25zdCBSdW50aW1lSUQgJiBhUklELCBJbnN0YW5jZU9mRGF0YSAqIGx2YWx1ZSkKK3sKKwlpZiggbHZhbHVlLT5oYXNSdW50aW1lQ29udGFpbmVyUklEKCkgKQorCXsKKwkJcmV0dXJuKCBhcEVELT5pc0Fzc2lnbmVkKAorCQkJCWx2YWx1ZS0+Z2V0UnVudGltZUNvbnRhaW5lclJJRCgpLCBsdmFsdWUtPmdldE9mZnNldCgpKSApOworCX0KKwllbHNlCisJeworCQlSdW50aW1lSUQgYURhdGFSSUQ7CisKKwkJaWYoIGdldFJ1bnRpbWVGb3JtKGFwRUQsIGFSSUQsIGx2YWx1ZSwgYURhdGFSSUQpICkKKwkJeworCQkJcmV0dXJuKCBhcEVELT5pc0Fzc2lnbmVkKGFEYXRhUklELCBsdmFsdWUtPmdldE9mZnNldCgpKSApOworCQl9CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogR0VUVEVSCisgKiBydW50aW1lIGluc3RhbmNlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitib29sIEJhc2VFbnZpcm9ubWVudDo6Z2V0UnVudGltZUZvcm0oCisJCWNvbnN0IEFQRXhlY3V0aW9uRGF0YSAmIGFwRUQsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsCisJCUluc3RhbmNlT2ZEYXRhICogbHZhbHVlLCBSdW50aW1lSUQgJiBhRGF0YVJJRCkKK3sKKwlhRGF0YVJJRCA9IGFSSUQ7CisKKy8vCWlmKCBsdmFsdWUtPmhhc1J1bnRpbWVDb250YWluZXJSSUQoKSApCisvLwl7CisvLwkJYURhdGFSSUQgPSBsdmFsdWUtPmdldFJ1bnRpbWVDb250YWluZXJSSUQoKTsKKy8vCisvLwkJcmV0dXJuKCB0cnVlICk7CisvLwl9CisvLwllbHNlCisJaWYoIGx2YWx1ZS0+aXNBbGlhcygpICkKKwl7CisJCWlmKCBsdmFsdWUtPmhhc0FsaWFzVGFyZ2V0KCkgJiYKKwkJCQlsdmFsdWUtPmdldEFsaWFzVGFyZ2V0KCktPmhhc1J1bnRpbWVDb250YWluZXJSSUQoKSApCisJCXsKKwkJCWx2YWx1ZS0+c2V0UnVudGltZUNvbnRhaW5lclJJRCggYURhdGFSSUQgPQorCQkJCQlsdmFsdWUtPmdldEFsaWFzVGFyZ2V0KCktPmdldFJ1bnRpbWVDb250YWluZXJSSUQoKSApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCUFycmF5T2ZJbnN0YW5jZU9mTWFjaGluZTo6aXRlcmF0b3IgaXQgPQorCQkJCWx2YWx1ZS0+Z2V0TWFjaGluZVBhdGgoKS0+YmVnaW4oKTsKKworCQkvLyBTRUFSQ0ggb2YgdGhlIFJVTlRJTUUgRk9STSBjb250YWluZXIKKwkJLy8gd2hlcmUgdGhpcyBJTlNUQU5DRSBvZiB2YXJpYWJsZSB3YXMgZGVjbGFyZWQKKwkJLy8gU0VBUkNIIG9mIHRoZSBMQ0EoUklEKSBvZiB0aGUgY3VycmVudCBSSUQgYW4gdGhlIEFMSUFTIGNvbnRhaW5lcgorCQl3aGlsZSggYURhdGFSSUQudmFsaWQoKQorCQkJCSYmIChhRGF0YVJJRC5nZXRFeGVjdXRhYmxlKCkgIT0gKCppdCktPmdldENvbnRhaW5lcigpKSApCisJCXsKKwkJCWFEYXRhUklEID0gYURhdGFSSUQuZ2V0UFJJRCgpOworCQl9CisKKwkJaWYoIGFEYXRhUklELnZhbGlkKCkgKQorCQl7CisJCQkvLyBVc2Ugb2YgQWxpYXMgUEFUSCB0byBmaW5kIHRoZSBJTlNUQU5DRSBvZiB2YXJpYWJsZQorCQkJQXJyYXlPZkluc3RhbmNlT2ZNYWNoaW5lOjppdGVyYXRvciBpdEVuZCA9CisJCQkJCWx2YWx1ZS0+Z2V0TWFjaGluZVBhdGgoKS0+ZW5kKCk7CisJCQlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwkJCXsKKwkJCQlhRGF0YVJJRCA9IGFwRUQtPmdldFJ1bnRpbWVGb3JtQ2hpbGQoYURhdGFSSUQsICgqaXQpKTsKKwkJCX0KKworLy8JCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoIGFEYXRhUklELmdldFZhcmlhYmxlKAorLy8JCQkJbHZhbHVlLT5nZXRPZmZzZXQoKSApLT5pc0FzdEVsZW1lbnQoIGx2YWx1ZS0+Z2V0QXN0RWxlbWVudCgpICkgKQorLy8JCQkJCTw8ICJBc3NpZ24gZXJyb3IgIiA8PCBhRGF0YVJJRC5nZXRFeGVjdXRhYmxlKCkKKy8vCQkJCQkJCS0+Z2V0RGF0YShsdmFsdWUtPmdldE9mZnNldCgpKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorLy8JCQkJCTw8ICIgIT0gIiA8PCBsdmFsdWUtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIiAhISEiCisvLwkJCQkJPDwgU0VORF9FWElUOworLy8KKy8vQVZNX0lGX0RFQlVHX0ZMQUcoIERBVEEgKQorLy8JQVZNX09TX1RSQUNFIDw8IElOQ1JfSU5ERU5UX1RBQiA8PCAiYmVnaW4gQmFzZUVudmlyb25tZW50OjpnZXRSdmFsdWVcbiI7CisvLwlsdmFsdWUtPnRvU3RyZWFtKEFWTV9PU19UUkFDRSk7CisvLwlhcEVELT5nZXRSdW50aW1lKGFEYXRhUklEKS50b1N0cmVhbShBVk1fT1NfVFJBQ0UpOworLy8KKy8vCXJ2YWx1ZS0+dG9TdHJlYW0oQVZNX09TX1RSQUNFKTsKKy8vCUFWTV9PU19UUkFDRSA8PCBUQUJfREVDUl9JTkRFTlQgPDwgImVuZCBCYXNlRW52aXJvbm1lbnQ6OmdldFJ2YWx1ZVxuIjsKKy8vQVZNX0VORElGX0RFQlVHX0ZMQUcoIERBVEEgKQorCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCTw8ICJBY2Nlc3MgZXJyb3IgOiBVbmZvdW5kIFJ1bnRpbWUgRGF0YSBDb250YWluZXIgZm9yIDw8ICIKKwkJCQkJPDwgbHZhbHVlLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8ICIgPj4gISEhIgorCQkJCQk8PCBTRU5EX0VYSVQ7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCS8vIE5PUk1BTCBJTVBMRU1FTlRBVElPTgorCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCQkvLyBTRUFSQ0ggb2YgdGhlIFJVTlRJTUUgRk9STSBjb250YWluZXIKKwkJLy8gd2hlcmUgdGhpcyBJTlNUQU5DRSBvZiB2YXJpYWJsZSB3YXMgZGVjbGFyZWQKKwkJd2hpbGUoIGFEYXRhUklELnZhbGlkKCkgJiYKKwkJCQkoYURhdGFSSUQuZ2V0RXhlY3V0YWJsZSgpICE9IGx2YWx1ZS0+Z2V0Q29udGFpbmVyKCkpICkKKwkJeworCQkJYURhdGFSSUQgPSBhRGF0YVJJRC5nZXRQUklEKCk7CisJCX0KKworCQlpZiggYURhdGFSSUQudmFsaWQoKSApCisJCXsKKy8vCQkJQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKCBhRGF0YVJJRC5nZXRWYXJpYWJsZSgKKy8vCQkJCWx2YWx1ZS0+Z2V0T2Zmc2V0KCkgKS0+aXNBc3RFbGVtZW50KCBsdmFsdWUtPmdldEFzdEVsZW1lbnQoKSApICkKKy8vCQkJCQk8PCAiQXNzaWduIGVycm9yICIKKy8vCQkJCQk8PCBhRGF0YVJJRC5nZXRWYXJpYWJsZShsdmFsdWUtPmdldE9mZnNldCgpKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorLy8JCQkJCTw8ICIgIT0gIiA8PCBsdmFsdWUtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIiAhISEiCisvLwkJCQkJPDwgU0VORF9FWElUOworLy8KKy8vQVZNX0lGX0RFQlVHX0ZMQUcoIERBVEEgKQorLy8JQVZNX09TX1RSQUNFIDw8IElOQ1JfSU5ERU5UX1RBQiA8PCAiYmVnaW4gQmFzZUVudmlyb25tZW50OjpnZXRSdmFsdWVcbiI7CisvLwlsdmFsdWUtPnRvU3RyZWFtKEFWTV9PU19UUkFDRSk7CisvLwlhcEVELT5nZXRSdW50aW1lKGFEYXRhUklEKS50b1N0cmVhbShBVk1fT1NfVFJBQ0UpOworLy8KKy8vCXJ2YWx1ZS0+dG9TdHJlYW0oQVZNX09TX1RSQUNFKTsKKy8vCUFWTV9PU19UUkFDRSA8PCBUQUJfREVDUl9JTkRFTlQgPDwgImVuZCBCYXNlRW52aXJvbm1lbnQ6OmdldFJ2YWx1ZVxuIjsKKy8vQVZNX0VORElGX0RFQlVHX0ZMQUcoIERBVEEgKQorCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorLy8JCWVsc2UKKy8vCQl7CisvLwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisvLwkJCQkJPDwgIkFjY2VzcyBlcnJvciA6IFVuZm91bmQgUnVudGltZSBEYXRhIENvbnRhaW5lciBmb3IgOj4gIgorLy8JCQkJCTw8IGFSSUQuc3RyKCkgPDwgIiB8PT4gXG4iCisvLwkJCQkJPDwgc3RyX2hlYWRlciggbHZhbHVlICkKKy8vCQkJCQk8PCBTRU5EX0VYSVQ7CisvLwkJfQorCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKworCitib29sIEJhc2VFbnZpcm9ubWVudDo6Z2V0UnVudGltZUZvcm0oY29uc3QgQVBFeGVjdXRpb25EYXRhICYgYXBFRCwKKwkJSW5zdGFuY2VPZkRhdGEgKiBsdmFsdWUsIExvY2FsUnVudGltZSAmIGFMb2NhbFJ1bnRpbWUpCit7CisJaWYoIGFwRUQtPmhhc0xvY2FsUnVudGltZVN0YWNrKCkgKQorCXsKKwkJU3RhY2tPZkxvY2FsUnVudGltZTo6CisJCXJldmVyc2VfaXRlcmF0b3IgaXQgPSBhcEVELT5nZXRMb2NhbFJ1bnRpbWVzKCktPnJiZWdpbigpOworCQlTdGFja09mTG9jYWxSdW50aW1lOjoKKwkJcmV2ZXJzZV9pdGVyYXRvciBpdEVuZCA9IGFwRUQtPmdldExvY2FsUnVudGltZXMoKS0+cmVuZCgpOworCQlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwkJeworCQkJaWYoICgqaXQpLmdldFByb2dyYW0oKSA9PSBsdmFsdWUtPmdldENvbnRhaW5lcigpICkKKwkJCXsKKwkJCQlhTG9jYWxSdW50aW1lID0gKCppdCkgOworCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiggYUxvY2FsUnVudGltZS52YWxpZCgpICkKKwkJeworLy8JCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoIGFMb2NhbFJ1bnRpbWUuZ2V0UHJvZ3JhbSgpLT5nZXREYXRhKAorLy8JCQkJbHZhbHVlLT5nZXRPZmZzZXQoKSktPmlzQXN0RWxlbWVudCggbHZhbHVlLT5nZXRBc3RFbGVtZW50KCkgKSApCisvLwkJCQkJPDwgIkFzc2lnbiBlcnJvciAiCisvLwkJCQkJPDwgYUxvY2FsUnVudGltZS5nZXRQcm9ncmFtKCktPmdldERhdGEobHZhbHVlLT5nZXRPZmZzZXQoKSktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKy8vCQkJCQk8PCAiICE9ICIgKyBsdmFsdWUtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIiAhISEiCisvLwkJCQkJPDwgU0VORF9FWElUOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKworCisvKioKKyAqIEdlbmVyYXRlIG51bWVyaWMgb2Zmc2V0IGZvciBhcnJheSBhY2Nlc3MgdXNpbmcgc3ltYm9saWMgZXhwcmVzc2lvbgorICovCithdm1fc2l6ZV90IEJhc2VFbnZpcm9ubWVudDo6Z2VuTnVtZXJpY09mZnNldCgKKwkJQVBFeGVjdXRpb25EYXRhICYgYXBFRCwgY29uc3QgUnVudGltZUlEICYgYVJJRCwKKwkJY29uc3QgU3ltYm9sICYgbHZTeW1ib2xpY09mZnNldCwgY29uc3QgQkYgJiBydkV2YWx1YXRlZE9mZnNldCwKKwkJYXZtX3NpemVfdCBvZmZzZXRNaW4sIGF2bV9zaXplX3Qgb2Zmc2V0TWF4KQoreworCWF2bV9zaXplX3Qgb2Zmc2V0ID0gQVZNX05VTUVSSUNfTUFYX1NJWkVfVDsKKworCUJGIG9mZnNldEV4cHI7CisKKwlCaXRzZXQgdW51c2VkT2Zmc2V0Qml0c2V0KCBvZmZzZXRNYXggKyAxICwgdHJ1ZSApOworCisJYXZtX3NpemVfdCBpZHggPSBvZmZzZXRNaW47CisKKwlpZiggcnZFdmFsdWF0ZWRPZmZzZXQuaXM8IEluc3RhbmNlT2ZEYXRhID4oKSApCisJeworCQlvZmZzZXRFeHByID0gZ2V0UnZhbHVlKCBhcEVELCBhcEVELT5nZXRQYXJhbWV0ZXJzUklEKCksCisJCQkJcnZFdmFsdWF0ZWRPZmZzZXQudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCkgKTsKKworCQlpZiggb2Zmc2V0RXhwci5pc1VJbnRlZ2VyKCkgJiYKKwkJCSgob2Zmc2V0ID0gb2Zmc2V0RXhwci50b0ludGVnZXIoKSkgPD0gb2Zmc2V0TWF4KSApCisJCXsKKy8vCQkJQVZNX09TX0lORk8gPDwgIkJhc2VFbnZpcm9ubWVudDo6Z2VuTnVtZXJpY09mZnNldDo+ICIKKy8vCQkJCQkJIlRSWSBQUkVWSU9VUyBOVU1FUklDIEFSUkFZIElOREVYIGluIFsgIgorLy8JCQkJCTw8IG9mZnNldE1pbiA8PCAiICwgIiA8PCBvZmZzZXRNYXgKKy8vCQkJCQk8PCAiIF1cbiBmb3IgdGhlIGV4cHJlc3Npb246ICIKKy8vCQkJCQk8PCBsdlN5bWJvbGljT2Zmc2V0LnN0clZhbHVlKCkgPDwgIiB8PT4gIgorLy8JCQkJCTw8IG5vX2luZGVudCggcnZFdmFsdWF0ZWRPZmZzZXQgKSA8PCAiIHwtPiAiCisvLwkJCQkJPDwgb2Zmc2V0RXhwci5zdHIoKSA8PCAiXG4gd2l0aCBjb25zdHJhaW50Oj4gXG4iCisvLwkJCQkJPDwgYXBFRC0+Z2V0UGF0aENvbmRpdGlvbigpLndyYXBTdHIoKSA8PCAiICEhISIKKy8vCQkJCQk8PCBzdGQ6OmVuZGw7CisKKwkJCWlmKCBQYXRoQ29uZGl0aW9uUHJvY2Vzc29yOjphZGRQYXRoQ29uZGl0aW9uKGFwRUQsCisJCQkJRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjplcUV4cHIocnZFdmFsdWF0ZWRPZmZzZXQsIG9mZnNldEV4cHIpKSApCisJCQl7CisJCQkJLy8gZm9yY2VkIHRvIHVzZWQgPDwgcHJldmlvdXMgb2Zmc2V0ID4+CisJCQkJaWR4ID0gQVZNX05VTUVSSUNfTUFYX1NJWkVfVDsKKworLy8JCQkJQVZNX09TX0lORk8gPDwgIkJhc2VFbnZpcm9ubWVudDo6Z2VuTnVtZXJpY09mZnNldDo+ICIKKy8vCQkJCQkJCSJVU0VEIE9MRCBOVU1FUklDIEFSUkFZIElOREVYIGluIFsgIgorLy8JCQkJCQk8PCBvZmZzZXRNaW4gPDwgIiAsICIgPDwgb2Zmc2V0TWF4CisvLwkJCQkJCTw8ICIgXVxuIGZvciB0aGUgZXhwcmVzc2lvbjogIgorLy8JCQkJCQk8PCBsdlN5bWJvbGljT2Zmc2V0LnN0clZhbHVlKCkgPDwgIiB8PT4gIgorLy8JCQkJCQk8PCBub19pbmRlbnQoIHJ2RXZhbHVhdGVkT2Zmc2V0ICkgPDwgIiB8LT4gIgorLy8JCQkJCQk8PCBvZmZzZXQgPDwgIlxuIHdpdGggY29uc3RyYWludDo+IFxuIgorLy8JCQkJCQk8PCBhcEVELT5nZXRQYXRoQ29uZGl0aW9uKCkud3JhcFN0cigpIDw8ICIgISEhIgorLy8JCQkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCQkJfQorCQl9CisJfQorCisKKwlmb3IoIDsgaWR4IDw9IG9mZnNldE1heCA7ICsraWR4ICkKKwl7CisJCW9mZnNldCA9IFJBTkRPTTo6Z2VuX3VpbnRlZ2VyKG9mZnNldE1pbiwgb2Zmc2V0TWF4KTsKKworCQlpZiggdW51c2VkT2Zmc2V0Qml0c2V0WyBvZmZzZXQgXSApCisJCXsKKwkJCXVudXNlZE9mZnNldEJpdHNldFsgb2Zmc2V0IF0gPSBmYWxzZTsKKworCQkJb2Zmc2V0RXhwciA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3SW50ZWdlcihvZmZzZXQpOworCisJCQlpZiggUGF0aENvbmRpdGlvblByb2Nlc3Nvcjo6YWRkUGF0aENvbmRpdGlvbihhcEVELAorCQkJCUV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6ZXFFeHByKHJ2RXZhbHVhdGVkT2Zmc2V0LCBvZmZzZXRFeHByKSkgKQorCQkJeworCQkJCS8vIGZvcmNlZCB0byB1c2VkIHRoaXMgPDwgcmFuZG9tIG9mZnNldCA+PgorCQkJCWlkeCA9IEFWTV9OVU1FUklDX01BWF9TSVpFX1Q7CisKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmKCBpZHggIT0gQVZNX05VTUVSSUNfTUFYX1NJWkVfVCApCisJeworCQlmb3IoIG9mZnNldCA9IG9mZnNldE1pbiA7IG9mZnNldCA8PSBvZmZzZXRNYXggOyArK29mZnNldCApCisJCXsKKwkJCWlmKCB1bnVzZWRPZmZzZXRCaXRzZXRbIG9mZnNldCBdICkKKwkJCXsKKwkJCQlvZmZzZXRFeHByID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdJbnRlZ2VyKG9mZnNldCk7CisKKwkJCQlpZiggUGF0aENvbmRpdGlvblByb2Nlc3Nvcjo6YWRkUGF0aENvbmRpdGlvbigKKwkJCQkJCWFwRUQsIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6ZXFFeHByKAorCQkJCQkJCQlydkV2YWx1YXRlZE9mZnNldCwgb2Zmc2V0RXhwcikpICkKKwkJCQl7CisvLwkJCQkJQVZNX09TX0lORk8gPDwgIkJhc2VFbnZpcm9ubWVudDo6Z2VuTnVtZXJpY09mZnNldDo+ICIKKy8vCQkJCQkJCQkiRm91bmQgTlVNRVJJQzxSQU5ET00+IEFSUkFZIElOREVYIGluIFsgIgorLy8JCQkJCQkJPDwgb2Zmc2V0TWluIDw8ICIgLCAiIDw8IG9mZnNldE1heAorLy8JCQkJCQkJPDwgIiBdXG4gZm9yIHRoZSBleHByZXNzaW9uOiAiCisvLwkJCQkJCQk8PCBsdlN5bWJvbGljT2Zmc2V0LnN0clZhbHVlKCkgPDwgIiB8PT4gIgorLy8JCQkJCQkJPDwgbm9faW5kZW50KCBydkV2YWx1YXRlZE9mZnNldCApIDw8ICIgfC0+ICIKKy8vCQkJCQkJCTw8IG9mZnNldCA8PCAiXG4gd2l0aCBjb25zdHJhaW50Oj4gXG4iCisvLwkJCQkJCQk8PCBhcEVELT5nZXRQYXRoQ29uZGl0aW9uKCkud3JhcFN0cigpIDw8ICIgISEhIgorLy8JCQkJCQkJPDwgc3RkOjplbmRsOworCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmKCBvZmZzZXQgPD0gb2Zmc2V0TWF4ICkKKwl7CisJCWlmKCBsdlN5bWJvbGljT2Zmc2V0LmdldFZhbHVlKCkuaXM8IEluc3RhbmNlT2ZEYXRhID4oKSApCisJCXsKKwkJCUluc3RhbmNlT2ZEYXRhICogbHZJbmRleCA9CisJCQkJCWx2U3ltYm9saWNPZmZzZXQuZ2V0VmFsdWUoKS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKTsKKworCQkJaWYoIGx2SW5kZXgtPmdldE1vZGlmaWVyKCkuaGFzRmVhdHVyZU11dGFibGUoKSApCisJCQl7CisJCQkJaWYoIGx2SW5kZXgtPmdldE1vZGlmaWVyKCkuaGFzTmF0dXJlUmVmZXJlbmNlKCkgKQorCQkJCXsKKwkJCQkJbHZJbmRleCA9IGdldFJ2YWx1ZShhcEVELCBhUklELCBsdkluZGV4KS4KKwkJCQkJCQl0b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKTsKKwkJCQl9CisKKwkJCQlpZiggbHZJbmRleC0+Z2V0TW9kaWZpZXIoKS5hbnlOYXR1cmVSZWZlcmVuY2VNYWNybygpICkKKwkJCQl7CisJCQkJCXNldFJ2YWx1ZShhcEVELCBhUklELCBsdkluZGV4LCBvZmZzZXRFeHByKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmKCBydkV2YWx1YXRlZE9mZnNldC5pczwgSW5zdGFuY2VPZkRhdGEgPigpICkKKwkJCXsKKwkJCQlsdkluZGV4ID0gcnZFdmFsdWF0ZWRPZmZzZXQudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCk7CisJCQkJaWYoIG5vdCBsdkluZGV4LT5oYXNWYWx1ZSgpICkKKwkJCQl7CisJCQkJCXNldFJ2YWx1ZShhcEVELCBhcEVELT5nZXRQYXJhbWV0ZXJzUklEKCksIGx2SW5kZXgsIG9mZnNldEV4cHIpOworCisvLwkJCQkJQVZNX09TX0lORk8gPDwgIkJhc2VFbnZpcm9ubWVudDo6Z2VuTnVtZXJpY09mZnNldDo+ICIKKy8vCQkJCQkJCQkiU0FWRSBOVU1FUklDPFJBTkRPTT4gQVJSQVkgSU5ERVggaW4gWyAiCisvLwkJCQkJCQk8PCBvZmZzZXRNaW4gPDwgIiAsICIgPDwgb2Zmc2V0TWF4CisvLwkJCQkJCQk8PCAiIF1cbiBmb3IgdGhlIGV4cHJlc3Npb246ICIKKy8vCQkJCQkJCTw8IGx2U3ltYm9saWNPZmZzZXQuc3RyVmFsdWUoKSA8PCAiIHw9PiAiCisvLwkJCQkJCQk8PCBub19pbmRlbnQoIHJ2RXZhbHVhdGVkT2Zmc2V0ICkgPDwgIiB8LT4gIgorLy8JCQkJCQkJPDwgb2Zmc2V0IDw8ICJcbiB3aXRoIGNvbnN0cmFpbnQ6PiBcbiIKKy8vCQkJCQkJCTw8IGFwRUQtPmdldFBhdGhDb25kaXRpb24oKS53cmFwU3RyKCkgPDwgIiAhISEiCisvLwkJCQkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiggb2Zmc2V0ICk7CisJfQorCisKKy8vCWFwRUQubXdzZXRBRUVTKCBBRUVTX1NZTUJPTElDX0VYRUNVVElPTl9MSU1JVEFUSU9OICk7CisKKwlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJPDwgIkJhc2VFbnZpcm9ubWVudDo6Z2VuTnVtZXJpY09mZnNldDo+ICIKKwkJCQkiVW5mb3VuZCBOVU1FUklDPFJBTkRPTT4gQVJSQVkgSU5ERVggaW4gWyAiIDw8IG9mZnNldE1pbgorCQkJPDwgIiAsICIgPDwgb2Zmc2V0TWF4IDw8ICIgXVxuIGZvciB0aGUgZXhwcmVzc2lvbjogIgorCQkJPDwgbHZTeW1ib2xpY09mZnNldC5zdHJWYWx1ZSgpIDw8ICIgfD0+ICIKKwkJCTw8IG5vX2luZGVudCggcnZFdmFsdWF0ZWRPZmZzZXQgKSA8PCAiXG4gd2l0aCBjb25zdHJhaW50Oj4gXG4iCisJCQk8PCBhcEVELT5nZXRQYXRoQ29uZGl0aW9uKCkud3JhcFN0cigpIDw8ICIgISEhIgorCQkJPDwgU0VORF9FWElUOworCisJcmV0dXJuKCBBVk1fTlVNRVJJQ19NQVhfU0laRV9UICk7Cit9CisKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBHRVRURVIKKyAqIHJ2YWx1ZSBmb3IgYW4gbHZhbHVlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitCRiAmIEJhc2VFbnZpcm9ubWVudDo6Z2V0UnZhbHVlKAorCQlBUEV4ZWN1dGlvbkRhdGEgJiBhcEVELCBjb25zdCBSdW50aW1lSUQgJiBhUklELAorCQlJbnN0YW5jZU9mRGF0YSAqIGx2VUZJLCBCRiAmIHJ2YWx1ZSwgY29uc3QgU3ltYm9sICYgb2Zmc2V0VmFsdWUpCit7CisJc3dpdGNoKCBvZmZzZXRWYWx1ZS5nZXRQb2ludGVyTmF0dXJlKCkgKQorCXsKKwkJY2FzZSBJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfRklFTERfQ0xBU1NfQVRUUklCVVRFX05BVFVSRToKKwkJY2FzZSBJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfRklFTERfQVJSQVlfT0ZGU0VUX05BVFVSRToKKwkJY2FzZSBJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfRklFTERfQ0hPSUNFX0FUVFJJQlVURV9OQVRVUkU6CisJCWNhc2UgSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX0ZJRUxEX1VOSU9OX0FUVFJJQlVURV9OQVRVUkU6CisJCXsKKwkJCXJldHVybiggcnZhbHVlLmF0KCBvZmZzZXRWYWx1ZS5nZXRPZmZzZXQoKSApICk7CisJCX0KKwkJY2FzZSBJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfRklFTERfQVJSQVlfSU5ERVhfTkFUVVJFOgorCQl7CisJCQlFdmFsdWF0aW9uRW52aXJvbm1lbnQgZUVOVigqdGhpcywgYXBFRCwgYVJJRCk7CisJCQlpZiggZUVOVi5ldmFsT2Zmc2V0KG9mZnNldFZhbHVlLmdldFZhbHVlKCkpICkKKwkJCXsKKwkJCQlhcEVEID0gZUVOVi5vdXRFRDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJPDwgIkZhaWxlZCB0byBldmFsIEFSUkFZIGluZGV4IDw8ICIKKwkJCQkJCTw8IG9mZnNldFZhbHVlLnN0clZhbHVlKCkgPDwgIiA+PiBpbiBVRkkgPDwgIgorCQkJCQkJPDwgbHZVRkktPnN0cigpIDw8ICIgPj4gZm9yIHJlYWRpbmcgaW4gVlZUICEhISIKKwkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCXJldHVybiggQkY6OlJFRl9OVUxMICk7CisJCQl9CisKKworCQkJaWYoIGVFTlYub3V0VkFMLmlzTnVtZXJpYygpICkKKwkJCXsKKwkJCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX0FSUkFZX09GRlNFVF9FWElUKCBlRU5WLm91dFZBTC50b0ludGVnZXIoKSwKKwkJCQkJc3RhdGljX2Nhc3Q8IGF2bV9pbnRlZ2VyX3QgPihydmFsdWUuc2l6ZSgpKSApCisJCQkJCQk8PCAiRmFpbGVkIHRvIHJlYWQgaW4gVlZUIHdpdGggaW5kZXggPDwgIgorCQkJCQkJPDwgb2Zmc2V0VmFsdWUuc3RyVmFsdWUoKSA8PCAiID4+IHVzaW5nIFVGSSA8PCAiCisJCQkJCQk8PCBsdlVGSS0+c3RyKCkgPDwgIiA+PiAhISEiCisJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQlyZXR1cm4oIHJ2YWx1ZS5hdCggZUVOVi5vdXRWQUwudG9JbnRlZ2VyKCkgKSApOworCQkJfQorCQkJZWxzZSBpZiggcnZhbHVlLnNpemUoKSA+IDAgKQorCQkJeworCQkJCWF2bV9zaXplX3Qgb2Zmc2V0ID0gZ2VuTnVtZXJpY09mZnNldCggYXBFRCwgYVJJRCwKKwkJCQkJCW9mZnNldFZhbHVlLCBlRU5WLm91dFZBTCwgMCwgKHJ2YWx1ZS5zaXplKCkgLSAxKSApOworCisJCQkJaWYoIG9mZnNldCAhPSBBVk1fTlVNRVJJQ19NQVhfU0laRV9UICkKKwkJCQl7CisJCQkJCXJldHVybiggcnZhbHVlLmF0KCBvZmZzZXQgKSApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJPDwgIkJhc2VFbnZpcm9ubWVudDo6Z2V0UnZhbHVlOj4gIgorCQkJCQkJCSJVbmV4cGVjdGVkIHZhcmlhYmxlIDw8ICIgPDwgbHZVRkktPnN0cigpCisJCQkJCQk8PCAiID4+IHdpdGggZW1wdHkgcnZhbHVlIDw8ICIgPDwgcnZhbHVlLnN0cigpCisJCQkJCQk8PCAiID4+IGZvciB0aGUgaW5zdGFuY2Ugb2YgZGF0YSA6PlxuIgorCQkJCQkJPDwgb2Zmc2V0VmFsdWUudG9TdHJpbmcoIEFWTV9UQUIxX0lOREVOVCApCisJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCQkJfQorCQl9CisJCWRlZmF1bHQ6CisJCXsKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCTw8ICJCYXNlRW52aXJvbm1lbnQ6OmdldFJ2YWx1ZTo+ICIKKwkJCQkJCSJVbmV4cGVjdGVkIFBPSU5URVIgTkFUVVJFIGluIFVGSSA8PCAiCisJCQkJCTw8IGx2VUZJLT5zdHIoKSA8PCAiID4+IGZvciB0aGUgaW5zdGFuY2Ugb2YgZGF0YSA6PlxuIgorCQkJCQk8PCBvZmZzZXRWYWx1ZS50b1N0cmluZyggQVZNX1RBQjFfSU5ERU5UICkKKwkJCQkJPDwgU0VORF9FWElUOworCisJCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCQl9CisJfQorfQorCisKK0JGICYgQmFzZUVudmlyb25tZW50OjpnZXRSdmFsdWUoQVBFeGVjdXRpb25EYXRhICYgYXBFRCwKKwkJY29uc3QgUnVudGltZUlEICYgYVJJRCwgSW5zdGFuY2VPZkRhdGEgKiBsdmFsdWUpCit7CisJVGFibGVPZkRhdGEgKiBhRGF0YVRhYmxlID0gTlVMTDsKKworCWlmKCBsdmFsdWUtPmhhc1J1bnRpbWVDb250YWluZXJSSUQoKSApCisJeworCQlhRGF0YVRhYmxlID0gYXBFRC0+Z2V0UnVudGltZSgKKwkJCQlsdmFsdWUtPmdldFJ1bnRpbWVDb250YWluZXJSSUQoKSkuZ2V0RGF0YVRhYmxlKCk7CisJfQorCWVsc2UKKwl7CisJCVJ1bnRpbWVJRCBhRGF0YVJJRDsKKwkJaWYoIGdldFJ1bnRpbWVGb3JtKGFwRUQsIGFSSUQsIGx2YWx1ZSwgYURhdGFSSUQpICkKKwkJeworCQkJYURhdGFUYWJsZSA9IGFwRUQtPmdldFJ1bnRpbWUoYURhdGFSSUQpLmdldERhdGFUYWJsZSgpOworCQl9CisJCWVsc2UKKwkJeworCQkJTG9jYWxSdW50aW1lIGFMb2NhbFJ1bnRpbWU7CisJCQlpZiggZ2V0UnVudGltZUZvcm0oYXBFRCwgbHZhbHVlLCBhTG9jYWxSdW50aW1lKSApCisJCQl7CisJCQkJYURhdGFUYWJsZSA9ICYoIGFMb2NhbFJ1bnRpbWUuZ2V0RGF0YVRhYmxlKCkgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJPDwgIkJhc2VFbnZpcm9ubWVudDo6Z2V0UnZhbHVlOj4gRmFpbGVkIHRvIGZvdW5kICIKKwkJCQkJCQkiZGF0YSB0YWJsZSBmb3IgdGhlIGluc3RhbmNlIG9mIGRhdGE6XG5cdCIKKwkJCQkJCTw8IHN0cl9oZWFkZXIoIGx2YWx1ZSApCisJCQkJCQk8PCAiXG5pbiB0aGUgcnVudGltZSBjb250ZXh0OiAiIDw8IHN0cl9oZWFkZXIoIGFSSUQgKQorCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKKwkJCX0KKwkJfQorCX0KKworCXN3aXRjaCggbHZhbHVlLT5nZXRQb2ludGVyTmF0dXJlKCkgKQorCXsKKwkJY2FzZSBJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfU1RBTkRBUkRfTkFUVVJFOgorCQljYXNlIElQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9GSUVMRF9DSE9JQ0VfQVRUUklCVVRFX05BVFVSRToKKwkJY2FzZSBJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfRklFTERfVU5JT05fQVRUUklCVVRFX05BVFVSRToKKwkJeworCQkJcmV0dXJuKCBhRGF0YVRhYmxlLT5hdCggbHZhbHVlLT5nZXRPZmZzZXQoKSApICk7CisJCX0KKwkJY2FzZSBJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfVUZJX09GRlNFVF9OQVRVUkU6CisJCWNhc2UgSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX1VGSV9SVU5USU1FX05BVFVSRToKKwkJeworCQkJQkYgcnZhbHVlID0gYURhdGFUYWJsZS0+YXQoIGx2YWx1ZS0+Z2V0T2Zmc2V0KCkgKTsKKworCQkJLy8gTk8gKzEgZm9yIDw8IHRoaXMgPj4gd2hpY2ggaXMgdGhlIHJvb3Qgb2YgdGhlIHBhdGgKKwkJCWF2bV9zaXplX3QgcGF0aExlbmd0aCA9IGx2YWx1ZS0+Z2V0RGF0YVBhdGgoKS0+c2l6ZSgpOworCQkJYXZtX3NpemVfdCAqIHRoZU9mZnNldFBhdGggPSBsdmFsdWUtPmdldE9mZnNldFBhdGgoKTsKKworCQkJZm9yKCBhdm1fc2l6ZV90IGsgPSAxIDsgayA8IHBhdGhMZW5ndGggOyArK2sgKQorCQkJeworCQkJCWlmKCBydmFsdWUuaXM8IEJ1aWx0aW5Db2xsZWN0aW9uID4oKSApCisJCQkJeworCQkJCQlydmFsdWUubW92ZUF0KCB0aGVPZmZzZXRQYXRoW2tdICk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUJGICogdmFsdWUgPSBuZXcgQkYoIGNyZWF0ZTRBcnJheUFjY2VzcygKKwkJCQkJCQlhcEVELCBhUklELCBydmFsdWUsIGx2YWx1ZSkgKTsKKworCQkJCQlyZXR1cm4oICp2YWx1ZSApOworCQkJCX0KKwkJCX0KKworCQkJaWYoIHJ2YWx1ZS5pczwgQnVpbHRpbkNvbGxlY3Rpb24gPigpICkKKwkJCXsKKwkJCQlyZXR1cm4oIHJ2YWx1ZS5hdCggdGhlT2Zmc2V0UGF0aFtwYXRoTGVuZ3RoXSApICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQkYgKiB2YWx1ZSA9IG5ldyBCRiggY3JlYXRlNEFycmF5QWNjZXNzKAorCQkJCQkJYXBFRCwgYVJJRCwgcnZhbHVlLCBsdmFsdWUpICk7CisKKwkJCQlyZXR1cm4oICp2YWx1ZSApOworCQkJfQorCQl9CisJCWNhc2UgSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX1VGSV9NSVhFRF9OQVRVUkU6CisJCXsKKwkJCUJGIHJ2YWx1ZSA9IGFEYXRhVGFibGUtPmF0KCBsdmFsdWUtPmdldE9mZnNldCgpICk7CisKKwkJCVRhYmxlT2ZTeW1ib2w6Oml0ZXJhdG9yIGl0ID0gbHZhbHVlLT5nZXREYXRhUGF0aCgpLT5iZWdpbigpOworCQkJVGFibGVPZlN5bWJvbDo6aXRlcmF0b3IgaXRFbmQgPSBsdmFsdWUtPmdldERhdGFQYXRoKCktPnByZWRfZW5kKCk7CisKKwkJCWJvb2wgaXNTeW1ib2xpY0FjY2VzcyA9IGZhbHNlOworCisJCQlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwkJCXsKKwkJCQlpZiggcnZhbHVlLmlzPCBCdWlsdGluQ29sbGVjdGlvbiA+KCkgKQorCQkJCXsKKwkJCQkJcnZhbHVlID0gZ2V0UnZhbHVlKGFwRUQsIGFSSUQsIGx2YWx1ZSwgcnZhbHVlLCAoKml0KSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWlzU3ltYm9saWNBY2Nlc3MgPSB0cnVlOworCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJaWYoIHJ2YWx1ZS5pczwgQnVpbHRpbkNvbGxlY3Rpb24gPigpICkKKwkJCXsKKwkJCQlyZXR1cm4oIGdldFJ2YWx1ZShhcEVELCBhUklELCBsdmFsdWUsIHJ2YWx1ZSwgKCppdCkpICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaXNTeW1ib2xpY0FjY2VzcyA9IHRydWU7CisJCQl9CisKKwkJCWlmKCBpc1N5bWJvbGljQWNjZXNzICkKKwkJCXsKKwkJCQlCRiAqIHZhbHVlID0gbmV3IEJGKCBjcmVhdGU0QXJyYXlBY2Nlc3MoYXBFRCwgYVJJRCwKKwkJCQkJCWFEYXRhVGFibGUtPmF0KCBsdmFsdWUtPmdldE9mZnNldCgpICksCisJCQkJCQlsdmFsdWUpICk7CisKKwkJCQlyZXR1cm4oICp2YWx1ZSApOworCQkJfQorCisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OgorCQl7CisJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQk8PCAiQmFzZUVudmlyb25tZW50OjpnZXRSdmFsdWU6PiBVbmV4cGVjdGVkICIKKwkJCQkJCSJQT0lOVEVSIE5BVFVSRSBmb3IgdGhlIGluc3RhbmNlIG9mIGRhdGE6XG5cdCIKKwkJCQkJPDwgc3RyX2hlYWRlciggbHZhbHVlICkKKwkJCQkJPDwgIlxuaW4gdGhlIHJ1bnRpbWUgY29udGV4dDogIiA8PCBzdHJfaGVhZGVyKCBhUklEICkKKwkJCQkJPDwgU0VORF9FWElUOworCisJCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCQl9CisJfQorCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKK30KKworCisvKgorICogR0VUVEVSCisgKiB3cml0YWJsZSBydmFsdWUgZm9yIGFuIGx2YWx1ZQorICovCitCRiAmIEJhc2VFbnZpcm9ubWVudDo6Z2V0V3ZhbHVlKAorCQlBUEV4ZWN1dGlvbkRhdGEgJiBhcEVELCBjb25zdCBSdW50aW1lSUQgJiBhUklELAorCQlBcnJheUJGICogcnZBcnJheSwgY29uc3QgU3ltYm9sICYgbHZhbHVlKQoreworCXN3aXRjaCggbHZhbHVlLmdldFBvaW50ZXJOYXR1cmUoKSApCisJeworCQljYXNlIElQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9GSUVMRF9DTEFTU19BVFRSSUJVVEVfTkFUVVJFOgorCQljYXNlIElQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9GSUVMRF9BUlJBWV9PRkZTRVRfTkFUVVJFOgorCQljYXNlIElQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9GSUVMRF9DSE9JQ0VfQVRUUklCVVRFX05BVFVSRToKKwkJY2FzZSBJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfRklFTERfVU5JT05fQVRUUklCVVRFX05BVFVSRToKKwkJeworCQkJcmV0dXJuKCBydkFycmF5LT5nZXRXcml0YWJsZSggbHZhbHVlLmdldE9mZnNldCgpICkpOworCQl9CisJCWNhc2UgSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX0ZJRUxEX0FSUkFZX0lOREVYX05BVFVSRToKKwkJeworCQkJRXZhbHVhdGlvbkVudmlyb25tZW50IGVFTlYoKnRoaXMsIGFwRUQsIGFSSUQpOworCQkJaWYoIGVFTlYuZXZhbE9mZnNldChsdmFsdWUuZ2V0VmFsdWUoKSkgKQorCQkJeworCQkJCWFwRUQgPSBlRU5WLm91dEVEOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQk8PCAiRmFpbGVkIHRvIGV2YWwgQVJSQVkgaW5kZXggPDwgIgorCQkJCQkJPDwgbHZhbHVlLnN0clZhbHVlKCkgPDwgIiA+PiBpbiB2YXJpYWJsZSA8PCAiCisJCQkJCQk8PCBsdmFsdWUuc3RyKCkgPDwgIiA+PiBmb3IgcmVhZGluZyBpbiBWVlQgISEhIgorCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKKwkJCX0KKworCQkJaWYoIGVFTlYub3V0VkFMLmlzTnVtZXJpYygpICkKKwkJCXsKKwkJCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX0FSUkFZX09GRlNFVF9FWElUKCBlRU5WLm91dFZBTC50b0ludGVnZXIoKSwKKwkJCQkJc3RhdGljX2Nhc3Q8IGF2bV9pbnRlZ2VyX3QgPihydkFycmF5LT5zaXplKCkpICkKKwkJCQkJCTw8ICJGYWlsZWQgdG8gYWNjZXNzIHRvIGFuIEFSUkFZIHdpdGggaW5kZXggPDwgIgorCQkJCQkJPDwgbHZhbHVlLnN0clZhbHVlKCkgPDwgIiA+PiBmb3IgcmVhZGluZyBpbiBWVlQgISEhIgorCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJcmV0dXJuKCBydkFycmF5LT5nZXRXcml0YWJsZSggZUVOVi5vdXRWQUwudG9JbnRlZ2VyKCkgKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJCTw8ICJCYXNlRW52aXJvbm1lbnQ6OmdldFd2YWx1ZTo+ICIKKwkJCQkJCQkidW5leHBlY3RlZCBOT04tSU5URUdFUiBBUlJBWSBPRkZTRVQgPDwgIgorCQkJCQkJPDwgZUVOVi5vdXRWQUwuc3RyKCkgPDwgIiA+PiBpbiBpbnN0YW5jZSBGUU4tSUQgOj5cbiIKKwkJCQkJCTw8IGx2YWx1ZS50b1N0cmluZyggQVZNX1RBQjFfSU5ERU5UICkKKwkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCXJldHVybiggQkY6OlJFRl9OVUxMICk7CisJCQl9CisJCX0KKwkJZGVmYXVsdDoKKwkJeworCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJPDwgIkJhc2VFbnZpcm9ubWVudDo6Z2V0V3ZhbHVlOj4gVW5leHBlY3RlZCAiCisJCQkJCQkiUE9JTlRFUiBOQVRVUkUgZm9yIHRoZSBpbnN0YW5jZSBvZiBkYXRhIDo+XG4iCisJCQkJCTw8IGx2YWx1ZS50b1N0cmluZyggQVZNX1RBQjFfSU5ERU5UICkKKwkJCQkJPDwgU0VORF9FWElUOworCisJCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCQl9CisJfQorfQorCisKK0JGICYgQmFzZUVudmlyb25tZW50OjpnZXRXdmFsdWUoCisJCUFQRXhlY3V0aW9uRGF0YSAmIGFwRUQsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsCisJCUJ1aWx0aW5Db250YWluZXIgKiBydkFycmF5LCBjb25zdCBTeW1ib2wgJiBsdmFsdWUpCit7CisJc3dpdGNoKCBsdmFsdWUuZ2V0UG9pbnRlck5hdHVyZSgpICkKKwl7CisJCWNhc2UgSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX0ZJRUxEX0NMQVNTX0FUVFJJQlVURV9OQVRVUkU6CisJCWNhc2UgSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX0ZJRUxEX0FSUkFZX09GRlNFVF9OQVRVUkU6CisJCWNhc2UgSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX0ZJRUxEX0NIT0lDRV9BVFRSSUJVVEVfTkFUVVJFOgorCQljYXNlIElQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9GSUVMRF9VTklPTl9BVFRSSUJVVEVfTkFUVVJFOgorCQl7CisJCQlyZXR1cm4oIHJ2QXJyYXktPmdldFdyaXRhYmxlKCBsdmFsdWUuZ2V0T2Zmc2V0KCkgKSk7CisJCX0KKwkJY2FzZSBJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfRklFTERfQVJSQVlfSU5ERVhfTkFUVVJFOgorCQl7CisJCQlFdmFsdWF0aW9uRW52aXJvbm1lbnQgZUVOVigqdGhpcywgYXBFRCwgYVJJRCk7CisJCQlpZiggZUVOVi5ldmFsT2Zmc2V0KGx2YWx1ZS5nZXRWYWx1ZSgpKSApCisJCQl7CisJCQkJYXBFRCA9IGVFTlYub3V0RUQ7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJCTw8ICJGYWlsZWQgdG8gZXZhbCBBUlJBWSBpbmRleCA8PCAiCisJCQkJCQk8PCBsdmFsdWUuc3RyVmFsdWUoKSA8PCAiID4+IGluIHZhcmlhYmxlIDw8ICIKKwkJCQkJCTw8IGx2YWx1ZS5zdHIoKSA8PCAiID4+IGZvciByZWFkaW5nIGluIFZWVCAhISEiCisJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCQkJfQorCisJCQlpZiggZUVOVi5vdXRWQUwuaXNOdW1lcmljKCkgKQorCQkJeworCQkJCUFWTV9PU19BU1NFUlRfRkFUQUxfQVJSQVlfT0ZGU0VUX0VYSVQoIGVFTlYub3V0VkFMLnRvSW50ZWdlcigpLAorCQkJCQlzdGF0aWNfY2FzdDwgYXZtX2ludGVnZXJfdCA+KHJ2QXJyYXktPnNpemUoKSkgKQorCQkJCQkJPDwgIkZhaWxlZCB0byBhY2Nlc3MgdG8gYW4gQVJSQVkgd2l0aCBpbmRleCA8PCAiCisJCQkJCQk8PCBsdmFsdWUuc3RyVmFsdWUoKSA8PCAiID4+IGZvciByZWFkaW5nIGluIFZWVCAhISEiCisJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQlyZXR1cm4oIHJ2QXJyYXktPmdldFdyaXRhYmxlKCBlRU5WLm91dFZBTC50b0ludGVnZXIoKSApICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJCTw8ICJCYXNlRW52aXJvbm1lbnQ6OmdldFd2YWx1ZTo+ICIKKwkJCQkJCQkidW5leHBlY3RlZCBOT04tSU5URUdFUiBBUlJBWSBPRkZTRVQgPDwgIgorCQkJCQkJPDwgZUVOVi5vdXRWQUwuc3RyKCkgPDwgIiA+PiBpbiBpbnN0YW5jZSBGUU4tSUQgOj5cbiIKKwkJCQkJCTw8IGx2YWx1ZS50b1N0cmluZyggQVZNX1RBQjFfSU5ERU5UICkKKwkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCXJldHVybiggQkY6OlJFRl9OVUxMICk7CisJCQl9CisJCX0KKwkJZGVmYXVsdDoKKwkJeworCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJPDwgIkJhc2VFbnZpcm9ubWVudDo6Z2V0V3ZhbHVlOj4gVW5leHBlY3RlZCAiCisJCQkJCQkiUE9JTlRFUiBOQVRVUkUgZm9yIHRoZSBpbnN0YW5jZSBvZiBkYXRhIDo+XG4iCisJCQkJCTw8IGx2YWx1ZS50b1N0cmluZyggQVZNX1RBQjFfSU5ERU5UICkKKwkJCQkJPDwgU0VORF9FWElUOworCisJCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCQl9CisJfQorfQorCisKKworQkYgJiBCYXNlRW52aXJvbm1lbnQ6OmdldFd2YWx1ZShBUEV4ZWN1dGlvbkRhdGEgJiBhcEVELAorCQljb25zdCBSdW50aW1lSUQgJiBhUklELCBJbnN0YW5jZU9mRGF0YSAqIGx2YWx1ZSkKK3sKKwlUYWJsZU9mRGF0YSAqIGFEYXRhVGFibGUgPSBOVUxMOworCisJaWYoIGx2YWx1ZS0+aGFzUnVudGltZUNvbnRhaW5lclJJRCgpICkKKwl7CisJCWFEYXRhVGFibGUgPSBhcEVELmdldFdyaXRhYmxlUnVudGltZSgKKwkJCQlsdmFsdWUtPmdldFJ1bnRpbWVDb250YWluZXJSSUQoKSApLmdldFdyaXRhYmxlRGF0YVRhYmxlKCk7CisJfQorCWVsc2UKKwl7CisJCVJ1bnRpbWVJRCBhRGF0YVJJRDsKKwkJaWYoIGdldFJ1bnRpbWVGb3JtKGFwRUQsIGFSSUQsIGx2YWx1ZSwgYURhdGFSSUQpICkKKwkJeworCQkJYURhdGFUYWJsZSA9IGFwRUQuZ2V0V3JpdGFibGVSdW50aW1lKAorCQkJCQlhRGF0YVJJRCApLmdldFdyaXRhYmxlRGF0YVRhYmxlKCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlMb2NhbFJ1bnRpbWUgYUxvY2FsUnVudGltZTsKKwkJCWlmKCBnZXRSdW50aW1lRm9ybShhcEVELCBsdmFsdWUsIGFMb2NhbFJ1bnRpbWUpICkKKwkJCXsKKwkJCQlhcEVELm1ha2VNb2RpZmlhYmxlTG9jYWxSdW50aW1lKCBhTG9jYWxSdW50aW1lICk7CisKKwkJCQlhRGF0YVRhYmxlID0gJiggYUxvY2FsUnVudGltZS5nZXREYXRhVGFibGUoKSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQk8PCAiQmFzZUVudmlyb25tZW50OjpnZXRXdmFsdWU6PiBGYWlsZWQgdG8gZm91bmQgIgorCQkJCQkJCSJkYXRhIHRhYmxlIGZvciB0aGUgaW5zdGFuY2Ugb2YgZGF0YSA6PlxuIgorCQkJCQkJPDwgc3RyX2hlYWRlciggbHZhbHVlICkKKwkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCXJldHVybiggQkY6OlJFRl9OVUxMICk7CisJCQl9CisJCX0KKwl9CisKKwlzd2l0Y2goIGx2YWx1ZS0+Z2V0UG9pbnRlck5hdHVyZSgpICkKKwl7CisJCWNhc2UgSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX1NUQU5EQVJEX05BVFVSRToKKwkJY2FzZSBJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfRklFTERfQ0hPSUNFX0FUVFJJQlVURV9OQVRVUkU6CisJCWNhc2UgSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX0ZJRUxEX1VOSU9OX0FUVFJJQlVURV9OQVRVUkU6CisJCXsKKwkJCXJldHVybiggYURhdGFUYWJsZS0+Z2V0V3JpdGFibGUoIGx2YWx1ZS0+Z2V0T2Zmc2V0KCkgKSApOworCQl9CisJCWNhc2UgSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX1VGSV9PRkZTRVRfTkFUVVJFOgorCQljYXNlIElQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9VRklfUlVOVElNRV9OQVRVUkU6CisJCXsKKwkJCUJGIHJ2YWx1ZSA9IGFEYXRhVGFibGUtPmdldFdyaXRhYmxlKCBsdmFsdWUtPmdldE9mZnNldCgpICk7CisKKwkJCS8vIE5PICsxIGZvciA8PCB0aGlzID4+IHdoaWNoIGlzIHRoZSByb290IG9mIHRoZSBwYXRoCisJCQlhdm1fc2l6ZV90IHBhdGhMZW5ndGggPSBsdmFsdWUtPmdldERhdGFQYXRoKCktPnNpemUoKTsKKwkJCWF2bV9zaXplX3QgKiB0aGVPZmZzZXRQYXRoID0gbHZhbHVlLT5nZXRPZmZzZXRQYXRoKCk7CisKKwkJCWZvciggYXZtX3NpemVfdCBrID0gMSA7IGsgPCBwYXRoTGVuZ3RoIDsgKytrICkKKwkJCXsKKwkJCQlpZiggcnZhbHVlLmlzPCBCdWlsdGluQ29sbGVjdGlvbiA+KCkgKQorCQkJCXsKKwkJCQkJcnZhbHVlLm1vdmVBdFdyaXRhYmxlKCB0aGVPZmZzZXRQYXRoW2tdICk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJaWYoIHJ2YWx1ZS5pczwgQnVpbHRpbkNvbGxlY3Rpb24gPigpICkKKwkJCXsKKwkJCQlyZXR1cm4oIHJ2YWx1ZS5nZXRXcml0YWJsZSggdGhlT2Zmc2V0UGF0aFtwYXRoTGVuZ3RoXSApICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJCTw8ICJCYXNlRW52aXJvbm1lbnQ6OmdldFd2YWx1ZTo+IFVuZXhwZWN0ZWQgIgorCQkJCQkJCSJydmFsdWUgY29udGFpbmVyIGZvciB0aGUgaW5zdGFuY2Ugb2YgZGF0YTpcblx0IgorCQkJCQkJPDwgc3RyX2hlYWRlciggbHZhbHVlICkKKwkJCQkJCTw8ICJcbmluIHRoZSBydW50aW1lIGNvbnRleHQ6ICIgPDwgc3RyX2hlYWRlciggYVJJRCApCisJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCQkJfQorCQl9CisJCWNhc2UgSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX1VGSV9NSVhFRF9OQVRVUkU6CisJCXsKKwkJCUJGIHJ2YWx1ZSA9IGFEYXRhVGFibGUtPmdldFdyaXRhYmxlKCBsdmFsdWUtPmdldE9mZnNldCgpICk7CisKKwkJCVRhYmxlT2ZTeW1ib2w6Oml0ZXJhdG9yIGl0ID0gbHZhbHVlLT5nZXREYXRhUGF0aCgpLT5iZWdpbigpOworCQkJVGFibGVPZlN5bWJvbDo6aXRlcmF0b3IgaXRFbmQgPSBsdmFsdWUtPmdldERhdGFQYXRoKCktPnByZWRfZW5kKCk7CisKKwkJCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQorCQkJeworCQkJCWlmKCBydmFsdWUuaXM8IEFycmF5QkYgPigpICkKKwkJCQl7CisJCQkJCXJ2YWx1ZSA9IGdldFd2YWx1ZShhcEVELCBhUklELAorCQkJCQkJCXJ2YWx1ZS50b19wdHI8IEFycmF5QkYgPigpLCAoKml0KSk7CisJCQkJfQorCQkJCWVsc2UgaWYoIHJ2YWx1ZS5pczwgQnVpbHRpbkNvbnRhaW5lciA+KCkgKQorCQkJCXsKKwkJCQkJcnZhbHVlID0gZ2V0V3ZhbHVlKGFwRUQsIGFSSUQsCisJCQkJCQkJcnZhbHVlLnRvX3B0cjwgQnVpbHRpbkNvbnRhaW5lciA+KCksICgqaXQpKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlpZiggcnZhbHVlLmlzPCBBcnJheUJGID4oKSApCisJCQl7CisJCQkJcmV0dXJuKCBnZXRXdmFsdWUoYXBFRCwKKwkJCQkJCWFSSUQsIHJ2YWx1ZS50b19wdHI8IEFycmF5QkYgPigpLCAoKml0KSkgKTsKKwkJCX0KKwkJCWVsc2UgaWYoIHJ2YWx1ZS5pczwgQnVpbHRpbkNvbnRhaW5lciA+KCkgKQorCQkJeworCQkJCXJldHVybiggZ2V0V3ZhbHVlKGFwRUQsIGFSSUQsCisJCQkJCQlydmFsdWUudG9fcHRyPCBCdWlsdGluQ29udGFpbmVyID4oKSwgKCppdCkpICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJCTw8ICJCYXNlRW52aXJvbm1lbnQ6OmdldFd2YWx1ZTo+IFVuZXhwZWN0ZWQgIgorCQkJCQkJInJ2YWx1ZSBjb250YWluZXIgZm9yIHRoZSBpbnN0YW5jZSBvZiBkYXRhOlxuXHQiCisJCQkJCQk8PCBzdHJfaGVhZGVyKCBsdmFsdWUgKQorCQkJCQkJPDwgIlxuaW4gdGhlIHJ1bnRpbWUgY29udGV4dDogIiA8PCBzdHJfaGVhZGVyKCBhUklEICkKKwkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCXJldHVybiggQkY6OlJFRl9OVUxMICk7CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisJCWRlZmF1bHQ6CisJCXsKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCTw8ICJCYXNlRW52aXJvbm1lbnQ6OmdldFd2YWx1ZTo+IFVuZXhwZWN0ZWQgIgorCQkJCQkJIlBPSU5URVIgTkFUVVJFIGZvciB0aGUgaW5zdGFuY2Ugb2YgZGF0YTpcblx0IgorCQkJCQk8PCBzdHJfaGVhZGVyKCBsdmFsdWUgKQorCQkJCQk8PCAiXG5pbiB0aGUgcnVudGltZSBjb250ZXh0OiAiIDw8IHN0cl9oZWFkZXIoIGFSSUQgKQorCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCXJldHVybiggQkY6OlJFRl9OVUxMICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworfQorCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU0VUVEVSCisgKiBsdmFsdWUgOj0gcnZhbHVlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK2Jvb2wgQmFzZUVudmlyb25tZW50OjpzZXRSdmFsdWUoQVBFeGVjdXRpb25EYXRhICYgYXBFRCwKKwkJSW5zdGFuY2VPZkRhdGEgKiBsdmFsdWUsIGNvbnN0IEJGICYgcnZhbHVlKQoreworCWlmKCBsdmFsdWUtPmhhc1J1bnRpbWVDb250YWluZXJSSUQoKSApCisJeworCQlyZXR1cm4oIHdyaXRlRGF0YShhcEVELAorCQkJCWx2YWx1ZS0+Z2V0UnVudGltZUNvbnRhaW5lclJJRCgpLCBsdmFsdWUsIHJ2YWx1ZSkgKTsKKwl9CisJZWxzZQorCXsKKwkJUnVudGltZUlEIGFEYXRhUklEOworCQlpZiggZ2V0UnVudGltZUZvcm0oYXBFRCwgYXBFRC0+bVJJRCwgbHZhbHVlLCBhRGF0YVJJRCkgKQorCQl7CisJCQlyZXR1cm4oIHdyaXRlRGF0YShhcEVELCBhRGF0YVJJRCwgbHZhbHVlLCBydmFsdWUpICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlMb2NhbFJ1bnRpbWUgYUxvY2FsUnVudGltZTsKKwkJCWlmKCBnZXRSdW50aW1lRm9ybShhcEVELCBsdmFsdWUsIGFMb2NhbFJ1bnRpbWUpICkKKwkJCXsKKwkJCQlyZXR1cm4oIHNldExvY2FsUnVudGltZShhcEVELCBhTG9jYWxSdW50aW1lLCBsdmFsdWUsIHJ2YWx1ZSkgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJPDwgIkJhc2VFbnZpcm9ubWVudDo6c2V0UnZhbHVlOj4gRmFpbGVkIHRvIGZvdW5kICIKKwkJCQkJCQkiZGF0YSB0YWJsZSBmb3IgdGhlIGluc3RhbmNlIG9mIGRhdGE6XG5cdCIKKwkJCQkJCTw8IHN0cl9oZWFkZXIoIGx2YWx1ZSApCisJCQkJCQk8PCAiXG5pbiB0aGUgcnVudGltZSBjb250ZXh0OiAiCisJCQkJCQk8PCBzdHJfaGVhZGVyKCBhcEVELT5tUklEICkKKwkJCQkJCTw8IFNFTkRfRVhJVDsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKworCitib29sIEJhc2VFbnZpcm9ubWVudDo6aW52b2tlT25Xcml0ZVJvdXRpbmUoQVBFeGVjdXRpb25EYXRhICYgYXBFRCwKKwkJY29uc3QgUnVudGltZUlEICYgYVJJRCwgSW5zdGFuY2VPZkRhdGEgKiBsdmFsdWUsIGNvbnN0IEJGICYgcnZhbHVlKQoreworCWlmKCBsdmFsdWUtPmhhc09uV3JpdGVSb3V0aW5lKCkgKQorCXsKKwkJRXhlY3V0aW9uRW52aXJvbm1lbnQgdG1wRU5WKCp0aGlzLCBhcEVELCBhUklELCBCRkNvZGU6OlJFRl9OVUxMKTsKKwkJaWYoIG5vdCBQUklNSVRJVkVfUFJPQ0VTU09SLmludm9rZVJvdXRpbmUoCisJCQkJdG1wRU5WLCBsdmFsdWUtPmdldE9uV3JpdGVSb3V0aW5lKCksIHJ2YWx1ZSkgKQorCQl7CisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKworCQlpZiggdG1wRU5WLm91dEVEUy5ub25lbXB0eSgpICkKKwkJeworCQkJY29uc3QgUnVudGltZUlEICYgc2F2ZVJJRCA9IGFwRUQtPm1SSUQ7CisKKwkJCXRtcEVOVi5vdXRFRFMucG9wX2xhc3RfdG8oIGFwRUQgKTsKKworCQkJYXBFRC0+bVJJRCA9IHNhdmVSSUQ7CisKKwkJCWlmKCB0bXBFTlYub3V0RURTLm5vbmVtcHR5KCkgKQorCQkJeworCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQk8PCAiVW5zdXBwb3J0ZWQgPDwgb25Xcml0ZSA+PiBSb3V0aW5lIHdoaWNoIGV4ZWN1dGlvbiAiCisJCQkJCQkJImNyZWF0ZSBtb3JlIHRoYW4gb25lIEV4ZWN1dGlvbiBDb250ZXh0XG5cdCIKKwkJCQkJCTw8IHN0cl9oZWFkZXIoIGx2YWx1ZSApCisJCQkJCQk8PCAiXG5pbiB0aGUgcnVudGltZSBjb250ZXh0OiAiIDw8IHN0cl9oZWFkZXIoIGFSSUQgKQorCQkJCQkJPDwgU0VORF9FWElUOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworLyoqCisgKiBzZXREYXRhCisgKi8KK2Jvb2wgQmFzZUVudmlyb25tZW50OjpzZXREYXRhKAorCQlBUEV4ZWN1dGlvbkRhdGEgJiBhcEVELCBjb25zdCBSdW50aW1lSUQgJiBhUklELAorCQlJbnN0YW5jZU9mRGF0YSAqIGx2YWx1ZSwgY29uc3QgQkYgJiBydmFsdWUpCit7CisJYXBFRC5nZXRXcml0YWJsZVJ1bnRpbWUoIGFSSUQgKS5tYWtlV3JpdGFibGVEYXRhVGFibGUoKTsKKworCXN3aXRjaCggbHZhbHVlLT5nZXRQb2ludGVyTmF0dXJlKCkgKQorCXsKKwkJY2FzZSBJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfU1RBTkRBUkRfTkFUVVJFOgorCQljYXNlIElQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9GSUVMRF9DSE9JQ0VfQVRUUklCVVRFX05BVFVSRToKKwkJY2FzZSBJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfRklFTERfVU5JT05fQVRUUklCVVRFX05BVFVSRToKKwkJeworCQkJYXBFRC0+Z2V0UnVudGltZShhUklEKS5zZXREYXRhKGx2YWx1ZS0+Z2V0T2Zmc2V0KCksIHJ2YWx1ZSk7CisKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX1VGSV9PRkZTRVRfTkFUVVJFOgorCQljYXNlIElQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9VRklfUlVOVElNRV9OQVRVUkU6CisJCXsKKwkJCUJGIHJ2Q29udGFpbmVyID0gYXBFRC0+Z2V0UnVudGltZShhUklEKS4KKwkJCQkJZ2V0V3JpdGFibGVEYXRhKCBsdmFsdWUtPmdldE9mZnNldCgpICk7CisKKy8vCQkJVGFibGVPZlN5bWJvbDo6aXRlcmF0b3IgaXQgPSBsdmFsdWUtPmdldERhdGFQYXRoKCktPmJlZ2luKCk7CisvLwkJCVRhYmxlT2ZTeW1ib2w6Oml0ZXJhdG9yIGl0RW5kID0gbHZhbHVlLT5nZXREYXRhUGF0aCgpLT5wcmVkX2VuZCgpOworLy8JCQlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKy8vCQkJeworLy8JCQkJcnZDb250YWluZXIubW92ZUF0V3JpdGFibGUoICgqaXQpLT5nZXRPZmZzZXQoKSApOworLy8JCQl9CisvLwkJCXJ2Q29udGFpbmVyLT5zZXQoKCppdCktPmdldE9mZnNldCgpLCBydmFsdWUpOworCisJCQkvLyBOTyArMSBmb3IgPDwgdGhpcyA+PiB3aGljaCBpcyB0aGUgcm9vdCBvZiB0aGUgcGF0aAorCQkJYXZtX3NpemVfdCBwYXRoTGVuZ3RoID0gbHZhbHVlLT5nZXREYXRhUGF0aCgpLT5zaXplKCk7CisJCQlhdm1fc2l6ZV90ICogdGhlT2Zmc2V0UGF0aCA9IGx2YWx1ZS0+Z2V0T2Zmc2V0UGF0aCgpOworCisJCQlmb3IoIGF2bV9zaXplX3QgayA9IDEgOyBrIDwgcGF0aExlbmd0aCA7ICsrayApCisJCQl7CisJCQkJcnZDb250YWluZXIubW92ZUF0V3JpdGFibGUoIHRoZU9mZnNldFBhdGhba10gKTsKKwkJCX0KKworCQkJcnZDb250YWluZXIuc2V0KHRoZU9mZnNldFBhdGhbcGF0aExlbmd0aF0sIHJ2YWx1ZSk7CisKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX1VGSV9NSVhFRF9OQVRVUkU6CisJCXsKKwkJCUJGIHJ2Q29udGFpbmVyID0gYXBFRC0+Z2V0UnVudGltZShhUklEKS4KKwkJCQkJZ2V0V3JpdGFibGVEYXRhKCBsdmFsdWUtPmdldE9mZnNldCgpICk7CisKKwkJCVRhYmxlT2ZTeW1ib2w6Oml0ZXJhdG9yIGl0ID0gbHZhbHVlLT5nZXREYXRhUGF0aCgpLT5iZWdpbigpOworCQkJVGFibGVPZlN5bWJvbDo6aXRlcmF0b3IgaXRFbmQgPSBsdmFsdWUtPmdldERhdGFQYXRoKCktPnByZWRfZW5kKCk7CisJCQlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwkJCXsKKwkJCQlzd2l0Y2goICgqaXQpLmdldFBvaW50ZXJOYXR1cmUoKSApCisJCQkJeworCQkJCQljYXNlIElQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9GSUVMRF9DTEFTU19BVFRSSUJVVEVfTkFUVVJFOgorCQkJCQljYXNlIElQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9GSUVMRF9BUlJBWV9PRkZTRVRfTkFUVVJFOgorCQkJCQl7CisJCQkJCQlydkNvbnRhaW5lci5tb3ZlQXRXcml0YWJsZSggKCppdCkuZ2V0T2Zmc2V0KCkgKTsKKworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJY2FzZSBJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfRklFTERfQVJSQVlfSU5ERVhfTkFUVVJFOgorCQkJCQl7CisJCQkJCQlFdmFsdWF0aW9uRW52aXJvbm1lbnQgZUVOVigqdGhpcywgYXBFRCk7CisJCQkJCQlpZiggZUVOVi5ldmFsT2Zmc2V0KCAoKml0KS5nZXRWYWx1ZSgpICkgKQorCQkJCQkJeworCQkJCQkJCWFwRUQgPSBlRU5WLm91dEVEOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQkJCQk8PCAgIkZhaWxlZCB0byBldmFsIEFSUkFZIGluZGV4IDw8ICIKKwkJCQkJCQkJCTw8ICgqaXQpLnN0clZhbHVlKCkKKwkJCQkJCQkJCTw8ICIgPj4gaW4gdmFyaWFibGUgPDwgIiA8PCAoKml0KS5zdHIoKQorCQkJCQkJCQkJPDwgIiA+PiBmb3Igd3JpdGluZyBpbiBWVlQgISEhIgorCQkJCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCQkJfQorCisJCQkJCQlpZiggZUVOVi5vdXRWQUwuaXNOdW1lcmljKCkgKQorCQkJCQkJeworCQkJCQkJCUFWTV9PU19BU1NFUlRfRkFUQUxfQVJSQVlfT0ZGU0VUX0VYSVQoCisJCQkJCQkJCWVFTlYub3V0VkFMLnRvSW50ZWdlcigpLAorCQkJCQkJCQlzdGF0aWNfY2FzdDwgYXZtX2ludGVnZXJfdCA+KHJ2Q29udGFpbmVyLnNpemUoKSkgKQorCQkJCQkJCQkJPDwgIkZhaWxlZCB0byB3cml0ZSBpbiBBUlJBWSB3aXRoIGluZGV4IDw8ICIKKwkJCQkJCQkJCTw8IGVFTlYub3V0VkFMLnRvSW50ZWdlcigpCisJCQkJCQkJCQk8PCAiID4+IGluIHZhcmlhYmxlIDw8ICIgPDwgbHZhbHVlLT5zdHIoKQorCQkJCQkJCQkJPDwgIiA+PiBmb3Igd3JpdGluZyBpbiBWVlQgISEhIgorCQkJCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJCQkJcnZDb250YWluZXIubW92ZUF0V3JpdGFibGUoIGVFTlYub3V0VkFMLnRvSW50ZWdlcigpICk7CisKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKworCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCWF2bV9zaXplX3Qgb2Zmc2V0ID0gZ2VuTnVtZXJpY09mZnNldCgKKwkJCQkJCQkJCWFwRUQsIGFSSUQsICgqaXQpLCBlRU5WLm91dFZBTCwgMCwKKwkJCQkJCQkJCShydkNvbnRhaW5lci5zaXplKCkgLSAxKSApOworCisJCQkJCQkJaWYoIG9mZnNldCAhPSBBVk1fTlVNRVJJQ19NQVhfU0laRV9UICkKKwkJCQkJCQl7CisJCQkJCQkJCXJ2Q29udGFpbmVyLm1vdmVBdFdyaXRhYmxlKCBvZmZzZXQgKTsKKworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQl9CisKKwkJCQkJCWFwRUQubXdzZXRBRUVTKCBBRUVTX1NZTUJPTElDX0VYRUNVVElPTl9MSU1JVEFUSU9OICk7CisKKwkJCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQkJCTw8ICJCYXNlRW52aXJvbm1lbnQ6OnNldERhdGE6PiAiCisJCQkJCQkJCQkidW5leHBlY3RlZCBOT04tSU5URUdFUiBBUlJBWSBJTkRFWCA8PCAiCisJCQkJCQkJCTw8IGVFTlYub3V0VkFMLnN0cigpCisJCQkJCQkJCTw8ICIgPj4gaW4gaW5zdGFuY2UgRlFOLUlEIDo+XG4iCisJCQkJCQkJCTw8IHN0cl9oZWFkZXIoIGx2YWx1ZSApCisJCQkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCQl9CisJCQkJCWRlZmF1bHQ6CisJCQkJCXsKKwkJCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQkJCTw8ICJCYXNlRW52aXJvbm1lbnQ6OnNldERhdGE6PiBVbmV4cGVjdGVkICIKKwkJCQkJCQkJCSJQT0lOVEVSIE5BVFVSRSBmb3IgdGhlIGluc3RhbmNlIG9mIGRhdGEgOj5cbiIKKwkJCQkJCQkJPDwgc3RyX2hlYWRlciggbHZhbHVlICkKKwkJCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCXN3aXRjaCggKCppdCkuZ2V0UG9pbnRlck5hdHVyZSgpICkKKwkJCXsKKwkJCQljYXNlIElQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9GSUVMRF9DTEFTU19BVFRSSUJVVEVfTkFUVVJFOgorCQkJCWNhc2UgSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX0ZJRUxEX0FSUkFZX09GRlNFVF9OQVRVUkU6CisJCQkJY2FzZSBJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfRklFTERfQ0hPSUNFX0FUVFJJQlVURV9OQVRVUkU6CisJCQkJY2FzZSBJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfRklFTERfVU5JT05fQVRUUklCVVRFX05BVFVSRToKKwkJCQl7CisJCQkJCXJ2Q29udGFpbmVyLnNldCgoKml0KS5nZXRPZmZzZXQoKSwgcnZhbHVlKTsKKworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2FzZSBJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfRklFTERfQVJSQVlfSU5ERVhfTkFUVVJFOgorCQkJCXsKKwkJCQkJRXZhbHVhdGlvbkVudmlyb25tZW50IGVFTlYoKnRoaXMsIGFwRUQpOworCQkJCQlpZiggZUVOVi5ldmFsT2Zmc2V0KCgqaXQpLmdldFZhbHVlKCkpICkKKwkJCQkJeworCQkJCQkJYXBFRCA9IGVFTlYub3V0RUQ7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJCQk8PCAiRmFpbGVkIHRvIGV2YWwgQVJSQVkgaW5kZXggPDwgIgorCQkJCQkJCQk8PCAoKml0KS5zdHJWYWx1ZSgpIDw8ICIgPj4gaW4gdmFyaWFibGUgPDwgIgorCQkJCQkJCQk8PCAoKml0KS5zdHIoKSA8PCAiID4+IGZvciB3cml0aW5nIGluIFZWVCAhISEiCisJCQkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCQl9CisKKwkJCQkJaWYoIGVFTlYub3V0VkFMLmlzTnVtZXJpYygpICkKKwkJCQkJeworCQkJCQkJQVZNX09TX0FTU0VSVF9GQVRBTF9BUlJBWV9PRkZTRVRfRVhJVCgKKwkJCQkJCQllRU5WLm91dFZBTC50b0ludGVnZXIoKSwKKwkJCQkJCQlzdGF0aWNfY2FzdDwgYXZtX2ludGVnZXJfdCA+KHJ2Q29udGFpbmVyLnNpemUoKSkgKQorCQkJCQkJCQk8PCAiRmFpbGVkIHRvIGFjY2VzcyB0byBhbiBBUlJBWSB3aXRoIGluZGV4IDw8ICIKKwkJCQkJCQkJPDwgbHZhbHVlLT5zdHJWYWx1ZSgpCisJCQkJCQkJCTw8ICIgPj4gZm9yIHdyaXRpbmcgaW4gVlZUICEhISIKKwkJCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJCQlydkNvbnRhaW5lci5zZXQoZUVOVi5vdXRWQUwudG9JbnRlZ2VyKCksIHJ2YWx1ZSk7CisKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlhdm1fc2l6ZV90IG9mZnNldCA9IGdlbk51bWVyaWNPZmZzZXQoYXBFRCwgYVJJRCwgKCppdCksCisJCQkJCQkJCWVFTlYub3V0VkFMLCAwLCAocnZDb250YWluZXIuc2l6ZSgpIC0gMSkgKTsKKworCQkJCQkJaWYoIG9mZnNldCAhPSBBVk1fTlVNRVJJQ19NQVhfU0laRV9UICkKKwkJCQkJCXsKKwkJCQkJCQlydkNvbnRhaW5lci5zZXQob2Zmc2V0LCBydmFsdWUpOworCisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQkvLyBTWU1CT0xJQyBBQ0NFUyBFUlJPUgorCQkJCQlhcEVELm13c2V0QUVFUyggQUVFU19TWU1CT0xJQ19FWEVDVVRJT05fTElNSVRBVElPTiApOworCisJCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQkJPDwgIkJhc2VFbnZpcm9ubWVudDo6c2V0RGF0YTo+IFVuZXhwZWN0ZWQgIgorCQkJCQkJCQkiTk9OLUlOVEVHRVIgQVJSQVkgSU5ERVggPDwgIgorCQkJCQkJCTw8IGVFTlYub3V0VkFMLnN0cigpIDw8ICIgPj4gaW4gaW5zdGFuY2UgRlFOLUlEIDo+XG4iCisJCQkJCQkJPDwgc3RyX2hlYWRlciggbHZhbHVlICkKKwkJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCX0KKwkJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJCQk8PCAiQmFzZUVudmlyb25tZW50OjpzZXREYXRhOj4gIgorCQkJCQkJCQkiVW5leHBlY3RlZCBQT0lOVEVSIE5BVFVSRSAiCisJCQkJCQkJCSJmb3IgdGhlIGluc3RhbmNlIG9mIGRhdGEgOj5cbiIKKwkJCQkJCQk8PCBzdHJfaGVhZGVyKCBsdmFsdWUgKQorCQkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJfQorCQkJfQorCisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OgorCQl7CisJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQk8PCAiQmFzZUVudmlyb25tZW50OjpzZXREYXRhOj4gVW5leHBlY3RlZCAiCisJCQkJCQkiUE9JTlRFUiBOQVRVUkUgZm9yIHRoZSBpbnN0YW5jZSBvZiBkYXRhIDo+XG4iCisJCQkJCTw8IHN0cl9oZWFkZXIoIGx2YWx1ZSApCisJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorCisJYXBFRC0+bXdzZXRBc3NpZ25lZChhUklELCBsdmFsdWUtPmdldE9mZnNldCgpLCB0cnVlKTsKKworCXJldHVybiggdHJ1ZSApOworfQorCisKKy8qKgorICogc2V0TG9jYWxSdW50aW1lCisgKi8KK2Jvb2wgQmFzZUVudmlyb25tZW50OjpzZXRMb2NhbFJ1bnRpbWUoCisJCUFQRXhlY3V0aW9uRGF0YSAmIGFwRUQsIExvY2FsUnVudGltZSAmIGFMb2NhbFJ1bnRpbWUsCisJCUluc3RhbmNlT2ZEYXRhICogbHZhbHVlLCBjb25zdCBCRiAmIHJ2YWx1ZSkKK3sKKwlhcEVELm1ha2VNb2RpZmlhYmxlTG9jYWxSdW50aW1lKCBhTG9jYWxSdW50aW1lICk7CisKKwkvLyBUT0RPIHdoYXQgdG8gZG8gd2l0aCBtb25pdG9yIGluIHRoaXMgY2FzZQorCisJYUxvY2FsUnVudGltZS5zZXREYXRhKGx2YWx1ZS0+Z2V0T2Zmc2V0KCksIHJ2YWx1ZSk7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvKioKKyAqIFRPT0xTCisgKi8KK0JGQ29kZSBCYXNlRW52aXJvbm1lbnQ6OnNlYXJjaFRyYWNlSU8oY29uc3QgQkYgJiBhVHJhY2UsIEF2bUNvZGUgKiBpb0Zvcm11bGEpCit7CisJaWYoIGFUcmFjZS52YWxpZCgpICkKKwl7CisJCUJGQ29kZSBpb1RyYWNlOworCisJCWlmKCBhVHJhY2UuaXM8IEF2bUNvZGUgPigpICkKKwkJeworCQkJQXZtQ29kZTo6aXRlcmF0b3IgaXQgPSBhVHJhY2UudG9fcHRyPCBBdm1Db2RlID4oKS0+YmVnaW4oKTsKKwkJCUF2bUNvZGU6Oml0ZXJhdG9yIGl0RW5kID0gYVRyYWNlLnRvX3B0cjwgQXZtQ29kZSA+KCktPmVuZCgpOworCQkJZm9yKCAgOyBpdCAhPSBpdEVuZCA7ICsraXQgKQorCQkJeworCQkJCWlvVHJhY2UgPSBzZWFyY2hUcmFjZUlPKCgqaXQpLCBpb0Zvcm11bGEpOworCQkJCWlmKCBpb1RyYWNlLnZhbGlkKCkgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCBpb1RyYWNlICk7CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UgaWYoIGFUcmFjZS5pczwgRXhlY3V0aW9uQ29uZmlndXJhdGlvbiA+KCkgKQorCQl7CisJCQljb25zdCBCRiAmIGlvQXRvbWljVHJhY2UgPQorCQkJCQlhVHJhY2UudG9fcHRyPCBFeGVjdXRpb25Db25maWd1cmF0aW9uID4oKS0+Z2V0Q29kZSgpOworCisJCQlpZiggaW9BdG9taWNUcmFjZS5pczwgQXZtQ29kZSA+KCkgKQorCQkJeworCQkJCWlvVHJhY2UgPSBpb0F0b21pY1RyYWNlLmJmQ29kZSgpOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUE9SVCApCisJQVZNX09TX1RSQUNFCisJCQk8PCAiaW9UcmFjZSAgICA6ICIgPDwgaW9UcmFjZS5zdHIoKQk8PCBzdGQ6OmVuZGwKKwkJCTw8ICJpb0Zvcm11bGEgIDogIiA8PCBpb0Zvcm11bGEtPnN0cigpPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQT1JUICkKKworCQkJCWlmKCBpb1RyYWNlLT5zYW1lT3BlcmF0b3IoIGlvRm9ybXVsYSApICYmCisJCQkJCShpb1RyYWNlLT5zaXplKCkgPj0gaW9Gb3JtdWxhLT5zaXplKCkpICkKKwkJCQl7CisJCQkJCUJhc2VJbnN0YW5jZUZvcm0gKiBpb1RyYWNlSW5zdGFuY2UgPQorCQkJCQkJCWlvVHJhY2UtPmZpcnN0KCkuYXNfcHRyPCBCYXNlSW5zdGFuY2VGb3JtID4oKTsKKworCQkJCQlCYXNlSW5zdGFuY2VGb3JtICogaW9Gb3JtdWxhSW5zdGFuY2UgPQorCQkJCQkJCWlvRm9ybXVsYS0+Zmlyc3QoKS5hc19wdHI8IEJhc2VJbnN0YW5jZUZvcm0gPigpOworCisJCQkJCWlmKCBpb1RyYWNlSW5zdGFuY2UtPmVxdWFscyhpb0Zvcm11bGFJbnN0YW5jZSkgKQorCQkJCQl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUE9SVCApCisJQVZNX09TX1RSQUNFIDw8ICJGb3VuZCBtYXRjaCA6IFlFUyAhISEiIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQT1JUICkKKworCQkJCQkJcmV0dXJuKCBpb1RyYWNlICk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcmV0dXJuKCBCRkNvZGU6OlJFRl9OVUxMICk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuKCBCRkNvZGU6OlJFRl9OVUxMICk7Cit9CisKKworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvQmFzZUVudmlyb25tZW50LmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9CYXNlRW52aXJvbm1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmJmMzRhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvQmFzZUVudmlyb25tZW50LmgKQEAgLTAsMCArMSw1NTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiA2IGphbnYuIDIwMTIKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBCQVNFRU5WSVJPTk1FTlRfSF8KKyNkZWZpbmUgQkFTRUVOVklST05NRU5UX0hfCisKKyNpbmNsdWRlIDxjb21tb24vQXZtT2JqZWN0Lmg+CisKKyNpbmNsdWRlIDxjb21tb24vQkYuaD4KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vVHlwZWRlZi5oPgorCisjaW5jbHVkZSA8Zm1sL3N5bWJvbC9TeW1ib2wuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkNvbnRleHQuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25EYXRhLmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvUnVudGltZUlELmg+CisKKworCituYW1lc3BhY2Ugc2VwCit7CisKKworY2xhc3MgQVJHU19FTlY7CitjbGFzcyBBdm1QcmltaXRpdmVQcm9jZXNzb3I7CisKK2NsYXNzIEJ1aWx0aW5BcnJheTsKK2NsYXNzIEJ1aWxkZXI7CitjbGFzcyBCdWlsdGluQ29udGFpbmVyOworCitjbGFzcyBDb25maWd1cmF0aW9uOworCitjbGFzcyBFeGVjdXRhYmxlU3lzdGVtOworCitjbGFzcyBMb2FkZXI7CitjbGFzcyBMb2NhbFJ1bnRpbWU7CisKK2NsYXNzIFN5bWJleEVuZ2luZTsKKworY2xhc3MgVHlwZVNwZWNpZmllcjsKKworCitjbGFzcyBCYXNlRW52aXJvbm1lbnQgOgorCQlwdWJsaWMgQXZtT2JqZWN0LAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIEJhc2VFbnZpcm9ubWVudCApCit7CisKK3B1YmxpYyA6CisJLyoqCisJICogQVRUUklCVVRFUworCSAqLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBJTlBVVHMKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlBdm1QcmltaXRpdmVQcm9jZXNzb3IgJiBQUklNSVRJVkVfUFJPQ0VTU09SOworCisJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAqIGluRUM7CisKKwlCRiBpbkZPUk07CisKKwlCRkNvZGUgaW5DT0RFOworCisJQVBFeGVjdXRpb25EYXRhIGluRUQ7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBBUkdTIEVOVgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCUFSR1NfRU5WICogbUFSRzsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIEZBSUxFRCBFeGVjdXRpb24gRGF0YQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCUxpc3RPZkFQRXhlY3V0aW9uRGF0YSBmYWlsdXJlRURTOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlCYXNlRW52aXJvbm1lbnQoQXZtUHJpbWl0aXZlUHJvY2Vzc29yICYgYVByaW1pdGl2ZVByb2Nlc3NvcikKKwk6IEF2bU9iamVjdCggKSwKKwlQUklNSVRJVkVfUFJPQ0VTU09SKCBhUHJpbWl0aXZlUHJvY2Vzc29yICksCisJaW5FQyggTlVMTCApLAorCWluRk9STSggKSwKKwlpbkNPREUoICksCisJaW5FRCggKSwKKwltQVJHKCBOVUxMICksCisJZmFpbHVyZUVEUyggKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJQmFzZUVudmlyb25tZW50KEF2bVByaW1pdGl2ZVByb2Nlc3NvciAmIGFQcmltaXRpdmVQcm9jZXNzb3IsCisJCQljb25zdCBFeGVjdXRpb25Db250ZXh0ICogYW5FQykKKwk6IEF2bU9iamVjdCggKSwKKwlQUklNSVRJVkVfUFJPQ0VTU09SKCBhUHJpbWl0aXZlUHJvY2Vzc29yICksCisJaW5FQyggYW5FQyApLAorCWluRk9STSggKSwKKwlpbkNPREUoICksCisJaW5FRCggYW5FQy0+Z2V0QVBFeGVjdXRpb25EYXRhKCkgKSwKKwltQVJHKCBOVUxMICksCisJZmFpbHVyZUVEUyggKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJKiBDT05TVFJVQ1RPUgorCSogQ29weQorCSovCisJQmFzZUVudmlyb25tZW50KGNvbnN0IEJhc2VFbnZpcm9ubWVudCAmIGZvcm0pCisJOiBBdm1PYmplY3QoIGZvcm0gKSwKKwlQUklNSVRJVkVfUFJPQ0VTU09SKCBmb3JtLlBSSU1JVElWRV9QUk9DRVNTT1IgKSwKKwlpbkVDKCBmb3JtLmluRUMgKSwKKwlpbkZPUk0oIGZvcm0uaW5GT1JNICksCisJaW5DT0RFKCBmb3JtLmluQ09ERSApLAorCWluRUQoIGZvcm0uaW5FRCApLAorCW1BUkcoIE5VTEwgKSwKKwlmYWlsdXJlRURTKCBmb3JtLmZhaWx1cmVFRFMgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJQmFzZUVudmlyb25tZW50KGNvbnN0IEJhc2VFbnZpcm9ubWVudCAmIGZvcm0sIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQorCTogQXZtT2JqZWN0KCBmb3JtICksCisJUFJJTUlUSVZFX1BST0NFU1NPUiggZm9ybS5QUklNSVRJVkVfUFJPQ0VTU09SICksCisJaW5FQyggZm9ybS5pbkVDICksCisJaW5GT1JNKCBhQ29kZSApLAorCWluQ09ERSggYUNvZGUgKSwKKwlpbkVEKCBmb3JtLmluRUQgKSwKKwltQVJHKCBOVUxMICksCisJZmFpbHVyZUVEUyggKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJQmFzZUVudmlyb25tZW50KGNvbnN0IEJhc2VFbnZpcm9ubWVudCAmIGZvcm0sCisJCQljb25zdCBSdW50aW1lSUQgJiBhUklELCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKKwk6IEF2bU9iamVjdCggZm9ybSApLAorCVBSSU1JVElWRV9QUk9DRVNTT1IoIGZvcm0uUFJJTUlUSVZFX1BST0NFU1NPUiApLAorCWluRUMoIGZvcm0uaW5FQyApLAorCWluRk9STSggYUNvZGUgKSwKKwlpbkNPREUoIGFDb2RlICksCisJaW5FRCggZm9ybS5pbkVEICksCisJbUFSRyggTlVMTCApLAorCWZhaWx1cmVFRFMoICkKKwl7CisJCWluRUQubXdzZXRSSUQoYVJJRCk7CisJfQorCisKKwlCYXNlRW52aXJvbm1lbnQoY29uc3QgQmFzZUVudmlyb25tZW50ICYgZm9ybSwgY29uc3QgQVBFeGVjdXRpb25EYXRhICYgYXBFRCkKKwk6IEF2bU9iamVjdCggZm9ybSApLAorCVBSSU1JVElWRV9QUk9DRVNTT1IoIGZvcm0uUFJJTUlUSVZFX1BST0NFU1NPUiApLAorCWluRUMoIGZvcm0uaW5FQyApLAorCWluRk9STSggKSwKKwlpbkNPREUoICksCisJaW5FRCggYXBFRCApLAorCW1BUkcoIE5VTEwgKSwKKwlmYWlsdXJlRURTKCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlCYXNlRW52aXJvbm1lbnQoY29uc3QgQmFzZUVudmlyb25tZW50ICYgZm9ybSwKKwkJCWNvbnN0IEFQRXhlY3V0aW9uRGF0YSAmIGFwRUQsIGNvbnN0IEJGICYgYmYpCisJOiBBdm1PYmplY3QoIGZvcm0gKSwKKwlQUklNSVRJVkVfUFJPQ0VTU09SKCBmb3JtLlBSSU1JVElWRV9QUk9DRVNTT1IgKSwKKwlpbkVDKCBmb3JtLmluRUMgKSwKKwlpbkZPUk0oIGJmICksCisJaW5DT0RFKCAoYmYuaXM8IEF2bUNvZGUgPigpKSA/IGJmLmJmQ29kZSgpIDogQkZDb2RlOjpSRUZfTlVMTCApLAorCWluRUQoIGFwRUQgKSwKKwltQVJHKCBOVUxMICksCisJZmFpbHVyZUVEUyggKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJQmFzZUVudmlyb25tZW50KGNvbnN0IEJhc2VFbnZpcm9ubWVudCAmIGZvcm0sCisJCQljb25zdCBBUEV4ZWN1dGlvbkRhdGEgJiBhcEVELCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKKwk6IEF2bU9iamVjdCggZm9ybSApLAorCVBSSU1JVElWRV9QUk9DRVNTT1IoIGZvcm0uUFJJTUlUSVZFX1BST0NFU1NPUiApLAorCWluRUMoIGZvcm0uaW5FQyApLAorCWluRk9STSggYUNvZGUgKSwKKwlpbkNPREUoIGFDb2RlICksCisJaW5FRCggYXBFRCApLAorCW1BUkcoIE5VTEwgKSwKKwlmYWlsdXJlRURTKCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlCYXNlRW52aXJvbm1lbnQoY29uc3QgQmFzZUVudmlyb25tZW50ICYgZm9ybSwKKwkJCWNvbnN0IEFQRXhlY3V0aW9uRGF0YSAmIGFwRUQsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQpCisJOiBBdm1PYmplY3QoIGZvcm0gKSwKKwlQUklNSVRJVkVfUFJPQ0VTU09SKCBmb3JtLlBSSU1JVElWRV9QUk9DRVNTT1IgKSwKKwlpbkVDKCBmb3JtLmluRUMgKSwKKwlpbkZPUk0oIGZvcm0uaW5GT1JNICksCisJaW5DT0RFKCBmb3JtLmluQ09ERSApLAorCWluRUQoIGFwRUQgKSwKKwltQVJHKCBOVUxMICksCisJZmFpbHVyZUVEUyggKQorCXsKKwkJaW5FRC5td3NldFJJRChhUklEKTsKKwl9CisKKwlCYXNlRW52aXJvbm1lbnQoY29uc3QgQmFzZUVudmlyb25tZW50ICYgZm9ybSwgY29uc3QgQVBFeGVjdXRpb25EYXRhICYgYXBFRCwKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQorCTogQXZtT2JqZWN0KCBmb3JtICksCisJUFJJTUlUSVZFX1BST0NFU1NPUiggZm9ybS5QUklNSVRJVkVfUFJPQ0VTU09SICksCisJaW5FQyggZm9ybS5pbkVDICksCisJaW5GT1JNKCBhQ29kZSApLAorCWluQ09ERSggYUNvZGUgKSwKKwlpbkVEKCBhcEVEICksCisJbUFSRyggTlVMTCApLAorCWZhaWx1cmVFRFMoICkKKwl7CisJCWluRUQubXdzZXRSSUQoYVJJRCk7CisJfQorCisKKwlCYXNlRW52aXJvbm1lbnQoY29uc3QgQmFzZUVudmlyb25tZW50ICYgZm9ybSwgY29uc3QgQkYgJiBiZikKKwk6IEF2bU9iamVjdCggZm9ybSApLAorCVBSSU1JVElWRV9QUk9DRVNTT1IoIGZvcm0uUFJJTUlUSVZFX1BST0NFU1NPUiApLAorCWluRUMoIGZvcm0uaW5FQyApLAorCWluRk9STSggYmYgKSwKKwlpbkNPREUoIChiZi5pczwgQXZtQ29kZSA+KCkpID8gYmYuYmZDb2RlKCkgOiBCRkNvZGU6OlJFRl9OVUxMICksCisJaW5FRCggZm9ybS5pbkVEICksCisJbUFSRyggTlVMTCApLAorCWZhaWx1cmVFRFMoICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkJhc2VFbnZpcm9ubWVudCgpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIEJ1aWxkZXIKKwkgKiBDb25maWd1cmF0aW9uCisJICogRXhlY3V0YWJsZVN5c3RlbQorCSAqLworCUJ1aWxkZXIgJiBnZXRCdWlsZGVyKCkgY29uc3Q7CisKKwlMb2FkZXIgJiBnZXRMb2FkZXIoKSBjb25zdDsKKworCVN5bWJleEVuZ2luZSAmIGdldFN5bWJleEVuZ2luZSgpIGNvbnN0OworCisJQ29uZmlndXJhdGlvbiAmIGdldENvbmZpZ3VyYXRpb24oKSBjb25zdDsKKworCUV4ZWN1dGFibGVTeXN0ZW0gJiBnZXRFeGVjdXRhYmxlU3lzdGVtKCkgY29uc3Q7CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIFBST0dSQU0KKwkqLworCWlubGluZSB2b2lkIHNldENvZGUoY29uc3QgQkZDb2RlICYgYUNvZGUpCisJeworCQlpbkZPUk0gPSBpbkNPREUgPSBhQ29kZTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIElOUFVUIEVECisJKi8KKwlpbmxpbmUgYm9vbCBoYXNJbnB1dEVEKCkgY29uc3QKKwl7CisJCXJldHVybiggaW5FRC52YWxpZCgpICk7CisJfQorCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogT1VUUFVUIEVEUworCSovCisJdmlydHVhbCBib29sIGhhc091dHB1dCgpIGNvbnN0ID0gMDsKKworCXZpcnR1YWwgYm9vbCBoYXNudE91dHB1dCgpIGNvbnN0ID0gMDsKKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogRkFJTEVEIEVEUworCSAqLworCWlubGluZSB2b2lkIGFwcGVuZEZhaWx1cmUoY29uc3QgQVBFeGVjdXRpb25EYXRhICYgYW5FRCkKKwl7CisJCWZhaWx1cmVFRFMuYXBwZW5kKGFuRUQpOworCX0KKworCWlubGluZSB2b2lkIHNwbGljZUZhaWx1cmUoQmFzZUVudmlyb25tZW50ICYgRU5WKQorCXsKKwkJZmFpbHVyZUVEUy5zcGxpY2UoIEVOVi5mYWlsdXJlRURTICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzRmFpbHVyZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGZhaWx1cmVFRFMubm9uZW1wdHkoKSApOworCX0KKworCWlubGluZSBib29sIGlzRmFpbHVyZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGhhc250T3V0cHV0KCkgJiYgZmFpbHVyZUVEUy5ub25lbXB0eSgpICk7CisJfQorCisKKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwl2aXJ0dWFsIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8vLy8gU1lNQk9MSUMgUEFSQU1FVFJFIENSRUFUSU9OCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCUluc3RhbmNlT2ZEYXRhICogY3JlYXRlKGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsCisJCQlCYXNlVHlwZVNwZWNpZmllciAqIGFUeXBlU3BlY2lmaWVyLCBJbnN0YW5jZU9mRGF0YSAqIGx2YWx1ZSk7CisKKwlpbmxpbmUgSW5zdGFuY2VPZkRhdGEgKiBjcmVhdGUoCisJCQljb25zdCBSdW50aW1lSUQgJiBhUklELCBJbnN0YW5jZU9mRGF0YSAqIGx2YWx1ZSkKKwl7CisJCXJldHVybiggY3JlYXRlKGFSSUQsIGx2YWx1ZS0+Z2V0VHlwZVNwZWNpZmllcigpLCBsdmFsdWUpKTsKKwl9CisKKwlCRiBldmFsSW5pdGlhbChBUEV4ZWN1dGlvbkRhdGEgJiBhbkVELCBjb25zdCBSdW50aW1lSUQgJiBhUklELAorCQkJSW5zdGFuY2VPZkRhdGEgKiBsdmFsdWUsIGNvbnN0IEJGICYgYW5Jbml0aWFsVmFsdWUpOworCisJQkYgY3JlYXRlSW5pdGlhbChBUEV4ZWN1dGlvbkRhdGEgJiBhbkVELAorCQkJY29uc3QgUnVudGltZUlEICYgYVJJRCwgSW5zdGFuY2VPZkRhdGEgKiBsdmFsdWUpOworCisJaW5saW5lIEJGIGNyZWF0ZUluaXRpYWwoQVBFeGVjdXRpb25EYXRhICYgYW5FRCwKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsIGNvbnN0IFN5bWJvbCAmIGx2YWx1ZSkKKwl7CisJCXJldHVybiggY3JlYXRlSW5pdGlhbChhbkVELCBhUklELCBsdmFsdWUucmF3RGF0YSgpKSApOworCX0KKworCUJGIGNyZWF0ZUluaXRpYWwoQVBFeGVjdXRpb25EYXRhICYgYW5FRCwgY29uc3QgUnVudGltZUlEICYgYVJJRCwKKwkJCUluc3RhbmNlT2ZEYXRhICogbHZhbHVlLCBCdWlsdGluQXJyYXkgKiBpbml0aWFsQXJyYXkpOworCisKKwlCRiBjcmVhdGVOZXdGcmVzaFBhcmFtKGNvbnN0IFJ1bnRpbWVJRCAmIGFQUklELAorCQkJQmFzZVR5cGVTcGVjaWZpZXIgKiBhVHlwZVNwZWNpZmllciwKKwkJCUluc3RhbmNlT2ZEYXRhICogbHZhbHVlLCBCRkxpc3QgJiBwYXJhbUxpc3QpOworCisJaW5saW5lIEJGIGNyZWF0ZU5ld0ZyZXNoUGFyYW0oY29uc3QgUnVudGltZUlEICYgYVBSSUQsCisJCQlJbnN0YW5jZU9mRGF0YSAqIGx2YWx1ZSwgQkZMaXN0ICYgcGFyYW1MaXN0KQorCXsKKwkJcmV0dXJuKCBjcmVhdGVOZXdGcmVzaFBhcmFtKGFQUklELCBsdmFsdWUtPmdldFR5cGVTcGVjaWZpZXIoKSwKKwkJCQlsdmFsdWUsIHBhcmFtTGlzdCkgKTsKKwl9CisKKwlpbmxpbmUgQkYgY3JlYXRlTmV3RnJlc2hQYXJhbShjb25zdCBSdW50aW1lSUQgJiBhUFJJRCwKKwkJCUJhc2VUeXBlU3BlY2lmaWVyICogYVR5cGVTcGVjaWZpZXIsCisJCQljb25zdCBTeW1ib2wgJiBsdmFsdWUsIEJGTGlzdCAmIHBhcmFtTGlzdCkKKwl7CisJCXJldHVybiggY3JlYXRlTmV3RnJlc2hQYXJhbShhUFJJRCwgYVR5cGVTcGVjaWZpZXIsCisJCQkJbHZhbHVlLnJhd0RhdGEoKSwgcGFyYW1MaXN0KSApOworCX0KKworCWlubGluZSBCRiBjcmVhdGVOZXdGcmVzaFBhcmFtKGNvbnN0IFJ1bnRpbWVJRCAmIGFQUklELAorCQkJY29uc3QgU3ltYm9sICYgbHZhbHVlLCBCRkxpc3QgJiBwYXJhbUxpc3QpCisJeworCQlyZXR1cm4oIGNyZWF0ZU5ld0ZyZXNoUGFyYW0oYVBSSUQsIGx2YWx1ZS5yYXdEYXRhKCksIHBhcmFtTGlzdCkgKTsKKwl9CisKKworCVN5bWJvbCBjcmVhdGUoY29uc3QgUnVudGltZUlEICYgYVJJRCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBwYXJhbUlELAorCQkJY29uc3QgVHlwZVNwZWNpZmllciAmIGFUeXBlU3BlY2lmaWVyLCBjb25zdCBCRiAmIGFWYWx1ZSk7CisKKworCVN5bWJvbCBjcmVhdGU0QXJyYXlBY2Nlc3MoQVBFeGVjdXRpb25EYXRhICYgYW5FRCwKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsIGNvbnN0IEJGICYgYXJyYXlWYWx1ZSwKKwkJCUluc3RhbmNlT2ZEYXRhICogbHZhbHVlT2ZJbmRleCk7CisKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLyB0aGUgREFUQSBBQ0NFU1Mgc3RhdGVtZW50CisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCS8qCisJICogR0VUVEVSCisJICogQXNzaWduZWQgRmxhZ3MKKwkgKi8KKwlzdGF0aWMgYm9vbCBpc0Fzc2lnbmVkKGNvbnN0IEFQRXhlY3V0aW9uRGF0YSAmIGFwRUQsCisJCQljb25zdCBSdW50aW1lSUQgJiBhUklELCBJbnN0YW5jZU9mRGF0YSAqIGx2YWx1ZSk7CisKKworCS8qCisJICogR0VUVEVSCisJICogUnVudGltZSBpbnN0YW5jZQorCSAqLworCXN0YXRpYyBib29sIGdldFJ1bnRpbWVGb3JtKAorCQkJY29uc3QgQVBFeGVjdXRpb25EYXRhICYgYXBFRCwgY29uc3QgUnVudGltZUlEICYgYVJJRCwKKwkJCUluc3RhbmNlT2ZEYXRhICogbHZhbHVlLCBSdW50aW1lSUQgJiBhRGF0YVJJRCk7CisKKwlzdGF0aWMgYm9vbCBnZXRSdW50aW1lRm9ybShjb25zdCBBUEV4ZWN1dGlvbkRhdGEgJiBhcEVELAorCQkJSW5zdGFuY2VPZkRhdGEgKiBsdmFsdWUsIExvY2FsUnVudGltZSAmIGFMb2NhbFJ1bnRpbWUpOworCisKKwkvKioKKwkgKiBHZW5lcmF0ZSBudW1lcmljIG9mZnNldCBmb3IgYXJyYXkgYWNjZXNzIHVzaW5nIHN5bWJvbGljIGV4cHJlc3Npb24KKwkgKi8KKwlhdm1fc2l6ZV90IGdlbk51bWVyaWNPZmZzZXQoCisJCQlBUEV4ZWN1dGlvbkRhdGEgJiBhcEVELCBjb25zdCBSdW50aW1lSUQgJiBhUklELAorCQkJY29uc3QgU3ltYm9sICYgbHZTeW1ib2xpY09mZnNldCwgY29uc3QgQkYgJiBydkV2YWx1YXRlZE9mZnNldCwKKwkJCWF2bV9zaXplX3Qgb2Zmc2V0TWluLCBhdm1fc2l6ZV90IG9mZnNldE1heCk7CisKKwkvKgorCSAqIEdFVFRFUgorCSAqIHJ2YWx1ZSBmb3IgYW4gbHZhbHVlCisJICovCisJQkYgJiBnZXRSdmFsdWUoQVBFeGVjdXRpb25EYXRhICYgYXBFRCwgY29uc3QgUnVudGltZUlEICYgYVJJRCwKKwkJCUluc3RhbmNlT2ZEYXRhICogbHZVRkksIEJGICYgcnZhbHVlLCBjb25zdCBTeW1ib2wgJiBvZmZzZXRWYWx1ZSk7CisKKwlCRiAmIGdldFJ2YWx1ZShBUEV4ZWN1dGlvbkRhdGEgJiBhcEVELCBjb25zdCBSdW50aW1lSUQgJiBhUklELAorCQkJSW5zdGFuY2VPZkRhdGEgKiBsdmFsdWUpOworCisJaW5saW5lIEJGICYgZ2V0UnZhbHVlKEFQRXhlY3V0aW9uRGF0YSAmIGFwRUQsIEluc3RhbmNlT2ZEYXRhICogbHZhbHVlKQorCXsKKwkJcmV0dXJuKCBnZXRSdmFsdWUoYXBFRCwgYXBFRC0+bVJJRCwgbHZhbHVlKSApOworCX0KKworCWlubGluZSBCRiAmIGdldFJ2YWx1ZShJbnN0YW5jZU9mRGF0YSAqIGx2YWx1ZSkKKwl7CisJCXJldHVybiggZ2V0UnZhbHVlKGluRUQsIGluRUQtPm1SSUQsIGx2YWx1ZSkgKTsKKwl9CisKKwlpbmxpbmUgQkYgJiBnZXRSdmFsdWUoY29uc3QgUnVudGltZUlEICYgYVJJRCwgSW5zdGFuY2VPZkRhdGEgKiBsdmFsdWUpCisJeworCQlyZXR1cm4oIGdldFJ2YWx1ZShpbkVELCBhUklELCBsdmFsdWUpICk7CisJfQorCisKKwkvKgorCSAqIEdFVFRFUgorCSAqIHdyaXRhYmxlIHJ2YWx1ZSBmb3IgYW4gbHZhbHVlCisJICovCisJQkYgJiBnZXRXdmFsdWUoQVBFeGVjdXRpb25EYXRhICYgYXBFRCwgY29uc3QgUnVudGltZUlEICYgYVJJRCwKKwkJCUFycmF5QkYgKiBydkFycmF5LCBjb25zdCBTeW1ib2wgJiBsdmFsdWUpOworCisJQkYgJiBnZXRXdmFsdWUoQVBFeGVjdXRpb25EYXRhICYgYXBFRCwgY29uc3QgUnVudGltZUlEICYgYVJJRCwKKwkJCUJ1aWx0aW5Db250YWluZXIgKiBydkFycmF5LCBjb25zdCBTeW1ib2wgJiBsdmFsdWUpOworCisKKwlCRiAmIGdldFd2YWx1ZShBUEV4ZWN1dGlvbkRhdGEgJiBhcEVELAorCQkJY29uc3QgUnVudGltZUlEICYgYVJJRCwgSW5zdGFuY2VPZkRhdGEgKiBsdmFsdWUpOworCisJaW5saW5lIEJGICYgZ2V0V3ZhbHVlKEFQRXhlY3V0aW9uRGF0YSAmIGFwRUQsIEluc3RhbmNlT2ZEYXRhICogbHZhbHVlKQorCXsKKwkJcmV0dXJuKCBnZXRXdmFsdWUoYXBFRCwgYXBFRC0+bVJJRCwgbHZhbHVlKSApOworCX0KKworCisJLyoKKwkgKiBTRVRURVIKKwkgKiBsdmFsdWUgOj0gcnZhbHVlCisJICovCisJaW5saW5lIGJvb2wgc2V0UnZhbHVlKEluc3RhbmNlT2ZEYXRhICogbHZhbHVlLCBjb25zdCBCRiAmIHJ2YWx1ZSkKKwl7CisJCXJldHVybiggc2V0UnZhbHVlKGluRUQsIGx2YWx1ZSwgcnZhbHVlKSApOworCX0KKworCWJvb2wgc2V0UnZhbHVlKEFQRXhlY3V0aW9uRGF0YSAmIGFwRUQsCisJCQlJbnN0YW5jZU9mRGF0YSAqIGx2YWx1ZSwgY29uc3QgQkYgJiBydmFsdWUpOworCisJaW5saW5lIGJvb2wgc2V0UnZhbHVlKAorCQkJQVBFeGVjdXRpb25EYXRhICYgYXBFRCwgY29uc3QgUnVudGltZUlEICYgYVJJRCwKKwkJCUluc3RhbmNlT2ZEYXRhICogbHZhbHVlLCBjb25zdCBCRiAmIHJ2YWx1ZSkKKwl7CisJCWNvbnN0IFJ1bnRpbWVJRCBwcmV2UklEID0gYXBFRC0+bVJJRDsKKwkJYXBFRC0+bVJJRCA9IGFSSUQ7CisKKwkJYm9vbCBydCA9IHNldFJ2YWx1ZShhcEVELCBsdmFsdWUsIHJ2YWx1ZSk7CisKKwkJYXBFRC0+bVJJRCA9IHByZXZSSUQ7CisKKwkJcmV0dXJuKCBydCApOworCX0KKworCisJYm9vbCBpbnZva2VPbldyaXRlUm91dGluZSgKKwkJCUFQRXhlY3V0aW9uRGF0YSAmIGFwRUQsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsCisJCQlJbnN0YW5jZU9mRGF0YSAqIGx2YWx1ZSwgY29uc3QgQkYgJiBydmFsdWUpOworCisJaW5saW5lIGJvb2wgd3JpdGVEYXRhKAorCQkJQVBFeGVjdXRpb25EYXRhICYgYXBFRCwgY29uc3QgUnVudGltZUlEICYgYVJJRCwKKwkJCUluc3RhbmNlT2ZEYXRhICogbHZhbHVlLCBjb25zdCBCRiAmIHJ2YWx1ZSkKKwl7CisJCWlmKCBpbnZva2VPbldyaXRlUm91dGluZShhcEVELCBhUklELCBsdmFsdWUsIHJ2YWx1ZSkgKQorCQl7CisJCQlyZXR1cm4oIHNldERhdGEoYXBFRCwgYVJJRCwgbHZhbHVlLCBydmFsdWUpICk7CisJCX0KKworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisKKwkvKioKKwkgKiBzZXRbTG9jYWxdRGF0YQorCSAqLworCWJvb2wgc2V0RGF0YShBUEV4ZWN1dGlvbkRhdGEgJiBhcEVELCBjb25zdCBSdW50aW1lSUQgJiBhUklELAorCQkJSW5zdGFuY2VPZkRhdGEgKiBsdmFsdWUsIGNvbnN0IEJGICYgcnZhbHVlKTsKKworCWJvb2wgc2V0TG9jYWxSdW50aW1lKEFQRXhlY3V0aW9uRGF0YSAmIGFwRUQsIExvY2FsUnVudGltZSAmIGFMb2NhbFJ1bnRpbWUsCisJCQlJbnN0YW5jZU9mRGF0YSAqIGx2YWx1ZSwgY29uc3QgQkYgJiBydmFsdWUpOworCisKKwkvKioKKwkgKiBUT09MUworCSAqLworCUJGQ29kZSBzZWFyY2hUcmFjZUlPKGNvbnN0IEJGICYgYVRyYWNlLCBBdm1Db2RlICogaW9Gb3JtdWxhKTsKKworCisJLyoKKwkgKiBTVEFUSUMgQVRUUklCVVRFUworCSAqLworCXN0YXRpYyBhdm1fdWludDMyX3QgTkVXX1BBUkFNX09GRlNFVDsKKworfTsKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKyNlbmRpZiAvKiBCQVNFRU5WSVJPTk1FTlRfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL0NNYWtlTGlzdHMudHh0IGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzczYmE4NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMjAgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgICAgICAgICAgICAgICAgICAgICAgQ01ha2UgZmlsZSBmb3IgdGhlIENPTVBVVEVSIGxpYnJhcnkgCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworIyBDKysgc291cmNlIGZpbGVzIHRvIHRha2UgaW50byBhY2NvdW50IChhbGwgZmlsZXMgbWF0Y2hpbmcgcGF0dGVybnMsIHJlY3Vyc2l2ZWx5KQorZmlsZSAoR0xPQl9SRUNVUlNFIENPTVBVVEVSX0NYWF9TUkNfRklMRVMgKi5jcHAgKi5oKQorCisjIFRhcmdldCB0byBidWlsZAorYWRkX2xpYnJhcnkgKGNvbXB1dGVyIFNUQVRJQyAke0NPTVBVVEVSX0NYWF9TUkNfRklMRVN9KQorCisjIEluY2x1ZGUgZGlyZWN0b3JpZXMgKGludGVybmFsKQordGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMgKGNvbXB1dGVyIFBVQkxJQyAuLikgI8KgRklYTUUgOiBleHBsaWNpdCB0aGUgZGVwZW5kZW5jaWVzIGxpYiBieSBsaWIKKworICMgVGFyZ2V0IGluY2x1ZGUgZGlyZWN0b3JpZXMgKGV4dGVybmFsKQordGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMgKGNvbXB1dGVyIFBVQkxJQyAke0dNUF9JTkNMVURFX0RJUn0gJHtHTVBYWF9JTkNMVURFX0RJUn0pCit0YXJnZXRfaW5jbHVkZV9kaXJlY3RvcmllcyAoY29tcHV0ZXIgUFVCTElDICR7Qm9vc3RfSU5DTFVERV9ESVJTfSkKK3RhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzIChjb21wdXRlciBQVUJMSUMgJHtDVkM0X0lOQ0xVREVfRElSfSkKKworYWRkX2RlcGVuZGVuY2llcyhjb21wdXRlciByZXNjYW5fY3ZjNCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL0Vudmlyb25tZW50RmFjdG9yeS5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9FbnZpcm9ubWVudEZhY3RvcnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNzI1ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9FbnZpcm9ubWVudEZhY3RvcnkuY3BwCkBAIC0wLDAgKzEsNDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyMSBub3YuIDIwMTIKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkVudmlyb25tZW50RmFjdG9yeS5oIgorCisjaW5jbHVkZSA8Y29tcHV0ZXIvaW5zdHJ1Y3Rpb24vSW5zdHJ1Y3Rpb25FbnZpcm9ubWVudC5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTE9BREVSIC8gRElTUE9TRVIgIEFQSQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBFbnZpcm9ubWVudEZhY3Rvcnk6OmxvYWQoKQoreworCUluc3RydWN0aW9uRW52aXJvbm1lbnQ6OmluaXRDYWNoZSgpOworfQorCit2b2lkIEVudmlyb25tZW50RmFjdG9yeTo6ZGlzcG9zZSgpCit7CisJSW5zdHJ1Y3Rpb25FbnZpcm9ubWVudDo6ZmluYWxpemVDYWNoZSgpOworfQorCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvRW52aXJvbm1lbnRGYWN0b3J5LmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9FbnZpcm9ubWVudEZhY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmQ2Y2NjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvRW52aXJvbm1lbnRGYWN0b3J5LmgKQEAgLTAsMCArMSwzNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDIxIG5vdi4gMjAxMgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEVOVklST05NRU5URkFDVE9SWV9IXworI2RlZmluZSBFTlZJUk9OTUVOVEZBQ1RPUllfSF8KKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIEVudmlyb25tZW50RmFjdG9yeQoreworCitwdWJsaWM6CisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIExPQURFUiAvIERJU1BPU0VSICBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJc3RhdGljIHZvaWQgbG9hZCgpOworCXN0YXRpYyB2b2lkIGRpc3Bvc2UoKTsKKworfTsKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisjZW5kaWYgLyogRU5WSVJPTk1FTlRGQUNUT1JZX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9FdmFsdWF0aW9uRW52aXJvbm1lbnQuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvRXZhbHVhdGlvbkVudmlyb25tZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2Y3MmRlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvRXZhbHVhdGlvbkVudmlyb25tZW50LmNwcApAQCAtMCwwICsxLDMzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDI3IG1haSAyMDEwCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJFdmFsdWF0aW9uRW52aXJvbm1lbnQuaCIKKworI2luY2x1ZGUgPGJ1aWxkZXIvQnVpbGRlci5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZlBvcnQuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoqCisgKiBUT09MUworICovCitCRiBFdmFsdWF0aW9uRW52aXJvbm1lbnQ6OmlvU3Vic3QoCisJCWNvbnN0IEFQRXhlY3V0aW9uRGF0YSAmIGFwRUQsIEF2bVByb2dyYW0gKiBhUHJvZ3JhbSwKKwkJQXZtQ29kZSAqIHByb2dJTywgQXZtQ29kZSAqIHRyYWNlSU8sIGNvbnN0IEJGICYgYUNvZGUpCit7CisJQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKCB0cmFjZUlPLT5zYW1lT3BlcmF0b3IoIHByb2dJTyApCisJCSYmICh0cmFjZUlPLT5zaXplKCkgPj0gcHJvZ0lPLT5zaXplKCkpICkKKwkJCTw8ICIgVGhlIHRyYWNlSU8gYW5kIHByb2dJTyBhcmUgaW5jb21wYXRpYmxlICEhISIKKwkJCTw8IFNFTkRfRVhJVDsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0dUX0xPVworCUFWTV9PU19UUkFDRSA8PCBJTkNSX0lOREVOVF9UQUIgPDwgImlvU3Vic3Q6OiA8PCAiIDw8IGFDb2RlLnN0cigpIDw8ICIgPj4iCisJCQk8PCBzdGQ6OmVuZGwKKwkJCTw8IFRBQiA8PCAiIEluIHRoZSBjb250ZXh0IE9mIDw8ICIgPDwgdHJhY2VJTy0+c3RyKCkgPDwgIiA+PiIKKwkJCTw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9HVF9MT1cKKworCisJYm9vbCBkZXN0cm95TG9jYWxSdW50aW1lU3RhY2sgPSBmYWxzZTsKKworCWlmKCAoYVByb2dyYW0gIT0gTlVMTCkgJiYgYVByb2dyYW0tPmhhc0RhdGEoKSApCisJeworCQlpZiggbm90IGFwRUQtPmhhc0xvY2FsUnVudGltZVN0YWNrKCkgKQorCQl7CisJCQlkZXN0cm95TG9jYWxSdW50aW1lU3RhY2sgPSB0cnVlOworCQkJYXBFRC0+Y3JlYXRlTG9jYWxSdW50aW1lU3RhY2soKTsKKwkJfQorCisJCUxvY2FsUnVudGltZSBhTG9jYWxSdW50aW1lKCAqYVByb2dyYW0gKTsKKwkJYXBFRC0+Z2V0TG9jYWxSdW50aW1lcygpLT5wdXNoKCBhTG9jYWxSdW50aW1lICk7CisKKwkJQXZtQ29kZTo6aXRlcmF0b3IgdHJhY2VBcmcgPSB0cmFjZUlPLT5iZWdpbigpOworCQlBdm1Db2RlOjppdGVyYXRvciBpdEFyZyA9IHByb2dJTy0+YmVnaW4oKTsKKwkJQXZtQ29kZTo6aXRlcmF0b3IgaXRFbmRBcmcgPSBwcm9nSU8tPmVuZCgpOworCQlmb3IoICsraXRBcmcsICsrdHJhY2VBcmcgOyBpdEFyZyAhPSBpdEVuZEFyZyA7ICsraXRBcmcsICsrdHJhY2VBcmcgKQorCQl7CisJCQlhTG9jYWxSdW50aW1lLnNldERhdGEoaXRBcmctPmFzX3B0cjwKKwkJCQkJQmFzZUluc3RhbmNlRm9ybSA+KCktPmdldE9mZnNldCgpLCAoKnRyYWNlQXJnKSk7CisJCX0KKworCQlldmFsKGFwRUQsIGFwRUQtPmdldFN5c3RlbVJJRCgpLCBhQ29kZSk7CisKKwkJYXBFRC0+Z2V0TG9jYWxSdW50aW1lcygpLT5wb3AoKTsKKwkJaWYoIGRlc3Ryb3lMb2NhbFJ1bnRpbWVTdGFjayApCisJCXsKKwkJCWFwRUQtPmRlc3Ryb3lMb2NhbFJ1bnRpbWVTdGFjaygpOworCQl9CisJfQorCWVsc2UKKwl7CisJCWV2YWwoYXBFRCwgYXBFRC0+Z2V0U3lzdGVtUklEKCksIGFDb2RlKTsKKwl9CisKKwlCRiBzdWJzdENvZGUgPSBvdXRWQUw7CisKKworQVZNX0lGX0RFQlVHX0xFVkVMX0dUX0xPVworCUFWTV9PU19UUkFDRSA8PCBUQUJfREVDUl9JTkRFTlQgPDwgInJlc3VsdDo6IDw8ICIgPDwgc3Vic3RDb2RlLnN0cigpIDw8ICIgPj4iCisJCTw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfR1RfTE9XCisKKwlyZXR1cm4oIHN1YnN0Q29kZSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLyB0aGUgRVZBTCBzdGF0ZW1lbnQgZm9yIEZJTFRFUgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBFdmFsdWF0aW9uRW52aXJvbm1lbnQ6OmV2YWwoY29uc3QgQVBFeGVjdXRpb25EYXRhICYgYW5FRCwKKwkJY29uc3QgUnVudGltZUlEICYgYVJJRCwgY29uc3QgQkYgJiBiZikKK3sKKwlSdW50aW1lSUQgcHJldlJJRCA9IGFuRUQtPm1SSUQ7CisJYW5FRC0+bVJJRCA9IGFSSUQ7CisKKwlpbkVDID0gYW5FRC0+Z2V0RXhlY3V0aW9uQ29udGV4dCgpOworCisJb3V0RUQgPSBpbkVEID0gYW5FRDsKKworCWJvb2wgcnQgPSBmYWxzZTsKKworCWlmKCBiZi5pczwgQXZtQ29kZSA+KCkgKQorCXsKKwkJaW5GT1JNID0gaW5DT0RFID0gYmYuYmZDb2RlKCk7CisKKwkJcnQgPSBQUklNSVRJVkVfUFJPQ0VTU09SLnNldmFsKCp0aGlzKTsKKwl9CisJZWxzZQorCXsKKwkJaW5GT1JNID0gYmY7CisKKwkJcnQgPSBQUklNSVRJVkVfUFJPQ0VTU09SLmRlY29kZV9zZXZhbCgqdGhpcyk7CisJfQorCisJYW5FRC0+bVJJRCA9IHByZXZSSUQ7CisKKwlyZXR1cm4oIHJ0ICk7Cit9CisKKworYm9vbCBFdmFsdWF0aW9uRW52aXJvbm1lbnQ6OmV2YWwoY29uc3QgQVBFeGVjdXRpb25EYXRhICYgYW5FRCwKKwkJY29uc3QgUnVudGltZUlEICYgYVJJRCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJUnVudGltZUlEIHByZXZSSUQgPSBhbkVELT5tUklEOworCWFuRUQtPm1SSUQgPSBhUklEOworCisJaW5FQyA9IGFuRUQtPmdldEV4ZWN1dGlvbkNvbnRleHQoKTsKKworCW91dEVEID0gaW5FRCA9IGFuRUQ7CisKKwlpbkZPUk0gPSBpbkNPREUgPSBhQ29kZTsKKworCWJvb2wgcnQgPSBQUklNSVRJVkVfUFJPQ0VTU09SLnNldmFsKCp0aGlzKTsKKworCWFuRUQtPm1SSUQgPSBwcmV2UklEOworCisJcmV0dXJuKCBydCApOworfQorCisKKworLyoqCisgKiBTZXJpYWxpemF0aW9uCisgKi8KK3ZvaWQgRXZhbHVhdGlvbkVudmlyb25tZW50Ojp0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlpbkVDLT50cmFjZURlZmF1bHQob3MpOworCisJaW5FQy0+dHJhY2VEZWZhdWx0UG9zdEV2YWwoQVZNX09TX1RSQUNFKTsKKworCW91dEVELT50b1N0cmVhbShBVk1fT1NfVFJBQ0UpOworfQorCisKKworLyoqCisgKiBDSEVDSyBTQVRJU0ZJQUJJTElUWQorICovCitib29sIEV2YWx1YXRpb25FbnZpcm9ubWVudDo6ZXZhbEZvcm11bGEoY29uc3QgQVBFeGVjdXRpb25EYXRhICYgYW5FRCwKKwkJY29uc3QgUnVudGltZUlEICYgYVJJRCwgQXZtUHJvZ3JhbSAqIGFQcm9ncmFtLCBjb25zdCBCRiAmIGFuRXhwcikKK3sKKwlzd2l0Y2goIGFuRXhwci5jbGFzc0tpbmQoKSApCisJeworCQljYXNlIEZPUk1fQVZNQ09ERV9LSU5EOgorCQl7CisJCQlBdm1Db2RlICogYUZvcm11bGEgPSBhbkV4cHIudG9fcHRyPCBBdm1Db2RlID4oKTsKKworCQkJc3dpdGNoKCBhRm9ybXVsYS0+Z2V0QXZtT3BDb2RlKCkgKQorCQkJeworCQkJCWNhc2UgQVZNX09QQ09ERV9PQlMgOgorCQkJCXsKKy8vQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNPTFZJTkcgKQorLy8JQVZNX09TX1RSQUNFIDw8ICIgPT0+IGV2dEZvcm11bGE6PiAiCisvLwkJCTw8IGFGb3JtdWxhLT5zZWNvbmQoKS5zdHIoKSA8PCBzdGQ6OmVuZGw7CisvL0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTT0xWSU5HICkKKworCQkJCQljb25zdCBCRkNvZGUgJiBldnRGb3JtdWxhID0gYUZvcm11bGEtPnNlY29uZCgpLmJmQ29kZSgpOworCisJCQkJCUJGIGNvbnN0cmFpbnRGb3JtdWxhID0gYUZvcm11bGEtPnRoaXJkKCk7CisKKwkJCQkJc3dpdGNoKCBldnRGb3JtdWxhLT5nZXRBdm1PcENvZGUoKSApCisJCQkJCXsKKwkJCQkJCWNhc2UgQVZNX09QQ09ERV9JTlBVVCA6CisJCQkJCQljYXNlIEFWTV9PUENPREVfT1VUUFVUIDoKKwkJCQkJCXsKKwkJCQkJCQlpZiggZXZ0Rm9ybXVsYS0+Zmlyc3QoKS5pczwgQmFzZUluc3RhbmNlRm9ybSA+KCkgKQorCQkJCQkJCXsKKwkJCQkJCQkJQmFzZUluc3RhbmNlRm9ybSAqIGlvSW5zdGFuY2UgPSBldnRGb3JtdWxhLT4KKwkJCQkJCQkJCQlmaXJzdCgpLnRvX3B0cjwgQmFzZUluc3RhbmNlRm9ybSA+KCk7CisKKwkJCQkJCQkJaWYoIGlvSW5zdGFuY2UtPmlzPCBJbnN0YW5jZU9mUG9ydCA+KCkgKQorCQkJCQkJCQl7CisJCQkJCQkJCQlCRkNvZGUgaW9UcmFjZSA9IHNlYXJjaFRyYWNlSU8oCisJCQkJCQkJCQkJCWFuRUQtPmdldElPRWxlbWVudFRyYWNlKCksIGV2dEZvcm11bGEpOworCisJCQkJCQkJCQlpZiggaW9UcmFjZS52YWxpZCgpICkKKwkJCQkJCQkJCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTT0xWSU5HICkKKwlBVk1fT1NfVFJBQ0UgPDwgIiA9PT4gYUZvcm11bGE6PiAiCisJCQk8PCBjb25zdHJhaW50Rm9ybXVsYS5zdHIoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU09MVklORyApCisKKwkJCQkJCQkJCQlpZiggY29uc3RyYWludEZvcm11bGEuaXNFcXVhbFRydWUoKSApCisJCQkJCQkJCQkJeworCQkJCQkJCQkJCQlvdXRWQUwgPSBjb25zdHJhaW50Rm9ybXVsYTsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQkJZWxzZQorCQkJCQkJCQkJCXsKKwkJCQkJCQkJCQkJb3V0VkFMID0gaW9TdWJzdCggYW5FRCwgYVByb2dyYW0sCisJCQkJCQkJCQkJCQkJZXZ0Rm9ybXVsYSwgaW9UcmFjZSwKKwkJCQkJCQkJCQkJCQljb25zdHJhaW50Rm9ybXVsYSApOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU09MVklORyApCisJQVZNX09TX1RSQUNFIDw8ICIgPT0+IEVDPCIgPDwgaW5FQy0+Z2V0SWROdW1iZXIoKQorCQkJPDwgIj4gfD0/PSBhbkV4ZWNGb3JtdWxhOj4gIiA8PCBvdXRWQUwuc3RyKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNPTFZJTkcgKQorCQkJCQkJCQkJCX0KKworCQkJCQkJCQkJCXJldHVybiggdHJ1ZSApOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJCWVsc2UgaWYoIGlvSW5zdGFuY2UtPmlzPCBJbnN0YW5jZU9mRGF0YSA+KCkgKQorCQkJCQkJCQl7CisJCQkJCQkJCQlpZiggaXNBc3NpZ25lZChhbkVELCBhUklELAorCQkJCQkJCQkJCQlpb0luc3RhbmNlLT50bzwgSW5zdGFuY2VPZkRhdGEgPigpKSApCisJCQkJCQkJCQl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU09MVklORyApCisJQVZNX09TX1RSQUNFIDw8ICIgPT0+IGFGb3JtdWxhOj4gIgorCQkJPDwgY29uc3RyYWludEZvcm11bGEuc3RyKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNPTFZJTkcgKQorCisJCQkJCQkJCQkJaWYoIGV2YWwoYW5FRCwgYVJJRCwgY29uc3RyYWludEZvcm11bGEpICkKKwkJCQkJCQkJCQl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU09MVklORyApCisJQVZNX09TX1RSQUNFIDw8ICIgPT0+IEVDPCIgPDwgaW5FQy0+Z2V0SWROdW1iZXIoKQorCQkJPDwgIj4gfD0/PSBhbkV4ZWNGb3JtdWxhOj4gIiA8PCBvdXRWQUwuc3RyKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNPTFZJTkcgKQorCisJCQkJCQkJCQkJCXJldHVybiggdHJ1ZSApOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0KKworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCisJCQkJCQlkZWZhdWx0OgorCQkJCQkJeworCQkJCQkJCWlmKCBldmFsKGFuRUQsIGFSSUQsIGV2dEZvcm11bGEpICkKKwkJCQkJCQl7CisJCQkJCQkJCWlmKCBvdXRWQUwuaXNFcXVhbFRydWUoKSApCisJCQkJCQkJCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTT0xWSU5HICkKKwlBVk1fT1NfVFJBQ0UgPDwgIiA9PT4gQ29uc3RyYWludCBGb3JtdWxhOj4gIgorCQkJPDwgY29uc3RyYWludEZvcm11bGEuc3RyKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNPTFZJTkcgKQorCisJCQkJCQkJCQlpZiggZXZhbENvbmRpdGlvbihjb25zdHJhaW50Rm9ybXVsYSkgKQorCQkJCQkJCQkJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNPTFZJTkcgKQorCUFWTV9PU19UUkFDRSA8PCAiID09PiBFQzwiIDw8IGluRUMtPmdldElkTnVtYmVyKCkKKwkJCTw8ICI+IHw9Pz0gYW5FeGVjRm9ybXVsYTo+ICIgPDwgb3V0VkFMLnN0cigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTT0xWSU5HICkKKworCQkJCQkJCQkJCXJldHVybiggdHJ1ZSApOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlkZWZhdWx0OgorCQkJCXsKKy8vQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNPTFZJTkcgKQorLy8JQVZNX09TX1RSQUNFIDw8ICIgPT0+IGFGb3JtdWxhOj4gIiA8PCBhRm9ybXVsYS5zdHIoKSA8PCBzdGQ6OmVuZGw7CisvL0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTT0xWSU5HICkKKworCQkJCQlpZiggZXZhbChhbkVELCBhUklELCBhbkV4cHIuYmZDb2RlKCkpICkKKwkJCQkJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNPTFZJTkcgKQorCUFWTV9PU19UUkFDRSA8PCAiID09PiBFQzwiIDw8IGluRUMtPmdldElkTnVtYmVyKCkKKwkJCTw8ICI+IHw9Pz0gYW5FeGVjRm9ybXVsYTo+ICIgPDwgb3V0VkFMLnN0cigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTT0xWSU5HICkKKworCQkJCQkJcmV0dXJuKCB0cnVlICk7CisJCQkJCX0KKworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKy8vQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNPTFZJTkcgKQorLy8JQVZNX09TX1RSQUNFIDw8ICIgPT0+IGFGb3JtdWxhOj4gIiA8PCBhRkQtPmZvcm11bGEuc3RyKCkgPDwgc3RkOjplbmRsOworLy9BVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU09MVklORyApCisKKwkJCWlmKCBldmFsKGFuRUQsIGFSSUQsIGFuRXhwcikgKQorCQkJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNPTFZJTkcgKQorCUFWTV9PU19UUkFDRSA8PCAiID09PiBFQzwiIDw8IGluRUMtPmdldElkTnVtYmVyKCkKKwkJCTw8ICI+IHw9Pz0gYW5FeGVjRm9ybXVsYTo+ICIgPDwgb3V0VkFMLnN0cigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTT0xWSU5HICkKKworCQkJCXJldHVybiggdHJ1ZSApOworCQkJfQorCisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKworCisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvRXZhbHVhdGlvbkVudmlyb25tZW50LmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9FdmFsdWF0aW9uRW52aXJvbm1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDU3OTlhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvRXZhbHVhdGlvbkVudmlyb25tZW50LmgKQEAgLTAsMCArMSwyNzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyNyBtYWkgMjAxMAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEVWQUxVQVRJT05FTlZJUk9OTUVOVF9IXworI2RlZmluZSBFVkFMVUFUSU9ORU5WSVJPTk1FTlRfSF8KKworI2luY2x1ZGUgPGNvbXB1dGVyL0Jhc2VFbnZpcm9ubWVudC5oPgorCisjaW5jbHVkZSA8Y29tbW9uL0F2bVBvaW50ZXIuaD4KKworI2luY2x1ZGUgPGNvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1QcmltaXRpdmVQcm9jZXNzb3IuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkNvbnRleHQuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25EYXRhLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIEF2bUNvZGU7CitjbGFzcyBBdm1QcmltaXRpdmVQcm9jZXNzb3I7CitjbGFzcyBBdm1Qcm9ncmFtOworCitjbGFzcyBCRjsKK2NsYXNzIEJ1aWx0aW5Gb3JtOworCitjbGFzcyBSdW50aW1lSUQ7CisKK2NsYXNzIFVuaUZvcm1JZGVudGlmaWVyOworCisKK2NsYXNzIEV2YWx1YXRpb25FbnZpcm9ubWVudCA6CisJCXB1YmxpYyBCYXNlRW52aXJvbm1lbnQgLAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIEV2YWx1YXRpb25FbnZpcm9ubWVudCApCit7CisKK3B1YmxpYyA6CisJLyoqCisJICogQVRUUklCVVRFUworCSAqLworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIE9VVFBVVHMKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwlBUEV4ZWN1dGlvbkRhdGEgb3V0RUQ7CisKKwlCRiBvdXRWQUw7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUV2YWx1YXRpb25FbnZpcm9ubWVudChBdm1QcmltaXRpdmVQcm9jZXNzb3IgJiBhUHJpbWl0aXZlUHJvY2Vzc29yKQorCTogQmFzZUVudmlyb25tZW50KCBhUHJpbWl0aXZlUHJvY2Vzc29yICksCisJb3V0RUQoIGluRUQgKSwKKwlvdXRWQUwoICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJKiBDT05TVFJVQ1RPUgorCSogQ29weQorCSovCisJZXhwbGljaXQgRXZhbHVhdGlvbkVudmlyb25tZW50KGNvbnN0IEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIGZvcm0pCisJOiBCYXNlRW52aXJvbm1lbnQoIGZvcm0gKSwKKwlvdXRFRCggZm9ybS5vdXRFRCApLAorCW91dFZBTCggZm9ybS5vdXRWQUwgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkqIENPTlNUUlVDVE9SCisJKiBDb3B5IGZvciBldmFsCisJKi8KKwlFdmFsdWF0aW9uRW52aXJvbm1lbnQoQmFzZUVudmlyb25tZW50ICYgZm9ybSkKKwk6IEJhc2VFbnZpcm9ubWVudCggZm9ybSApLAorCW91dEVEKCBpbkVEICksCisJb3V0VkFMKCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlFdmFsdWF0aW9uRW52aXJvbm1lbnQoQmFzZUVudmlyb25tZW50ICYgZm9ybSwgY29uc3QgQkYgJiBiZikKKwk6IEJhc2VFbnZpcm9ubWVudCggZm9ybSAsIGJmICksCisJb3V0RUQoIGluRUQgKSwKKwlvdXRWQUwoICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCUV2YWx1YXRpb25FbnZpcm9ubWVudChCYXNlRW52aXJvbm1lbnQgJiBmb3JtLCBjb25zdCBBUEV4ZWN1dGlvbkRhdGEgJiBhbkVEKQorCTogQmFzZUVudmlyb25tZW50KCBmb3JtICwgYW5FRCApLAorCW91dEVEKCBhbkVEICksCisJb3V0VkFMKCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlFdmFsdWF0aW9uRW52aXJvbm1lbnQoQmFzZUVudmlyb25tZW50ICYgZm9ybSwgY29uc3QgQVBFeGVjdXRpb25EYXRhICYgYW5FRCwKKwkJCWNvbnN0IEJGQ29kZSAmIGFDb2RlKQorCTogQmFzZUVudmlyb25tZW50KGZvcm0gLCBhbkVEICwgYUNvZGUpLAorCW91dEVEKCBhbkVEICksCisJb3V0VkFMKCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlFdmFsdWF0aW9uRW52aXJvbm1lbnQoQmFzZUVudmlyb25tZW50ICYgZm9ybSwgY29uc3QgQVBFeGVjdXRpb25EYXRhICYgYW5FRCwKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQpCisJOiBCYXNlRW52aXJvbm1lbnQoIGZvcm0gLCBhbkVEICwgYVJJRCApLAorCW91dEVEKCBhbkVEICksCisJb3V0VkFMKCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5FdmFsdWF0aW9uRW52aXJvbm1lbnQoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBPVVRQVVRTCisJKi8KKwlpbmxpbmUgdmlydHVhbCBib29sIGhhc091dHB1dCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG91dEVELnZhbGlkKCkgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBib29sIGhhc250T3V0cHV0KCkgY29uc3QKKwl7CisJCXJldHVybiggb3V0RUQuaW52YWxpZCgpICYmIG91dFZBTC5pbnZhbGlkKCkgKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8vLy8gdGhlIEVWQUwgc3RhdGVtZW50CisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlubGluZSBib29sIGV2YWwoY29uc3QgQkYgJiBiZikKKwl7CisJCXJldHVybiggc2V2YWwoIGJmICkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBldmFsQ29uZGl0aW9uKGNvbnN0IEJGICYgYmYpCisJeworCQlyZXR1cm4oIHNldmFsKCBiZiApICk7CisJfQorCisJaW5saW5lIGJvb2wgZXZhbEJvb2xlYW4oY29uc3QgQkYgJiBiZikKKwl7CisJCXJldHVybiggc2V2YWwoIGJmICkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBldmFsT2Zmc2V0KGNvbnN0IEJGICYgYmYpCisJeworCQlyZXR1cm4oIHNldmFsKCBiZiApICk7CisJfQorCisKKwkvLyBGb3IgZmlsdGVycworCWJvb2wgZXZhbChjb25zdCBBUEV4ZWN1dGlvbkRhdGEgJiBhbkVELCBjb25zdCBSdW50aW1lSUQgJiBhUklELAorCQkJY29uc3QgQkYgJiBiZik7CisKKwlib29sIGV2YWwoY29uc3QgQVBFeGVjdXRpb25EYXRhICYgYW5FRCwgY29uc3QgUnVudGltZUlEICYgYVJJRCwKKwkJCWNvbnN0IEJGQ29kZSAmIGFDb2RlKTsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vLy8vIHRoZSBFVkFMIHN0YXRlbWVudAorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCisJaW5saW5lIGJvb2wgZGVjb2RlX3NldmFsKCkKKwl7CisJCXJldHVybiggUFJJTUlUSVZFX1BST0NFU1NPUi5kZWNvZGVfc2V2YWwoKnRoaXMpICk7CisJfQorCisJaW5saW5lIGJvb2wgc2V2YWwoKQorCXsKKwkJcmV0dXJuKCBQUklNSVRJVkVfUFJPQ0VTU09SLnNldmFsKCp0aGlzKSApOworCX0KKworCWlubGluZSBib29sIHNldmFsKEFSR1NfRU5WICogYW5BUkcpCisJeworCQltQVJHID0gYW5BUkc7CisKKwkJcmV0dXJuKCBQUklNSVRJVkVfUFJPQ0VTU09SLnNldmFsX3dydF9BUkcoKnRoaXMpICk7CisJfQorCisJaW5saW5lIGJvb2wgc2V2YWwoY29uc3QgQkYgJiBiZikKKwl7CisJCWluRk9STSA9IGJmOworCisJCXJldHVybiggUFJJTUlUSVZFX1BST0NFU1NPUi5kZWNvZGVfc2V2YWwoKnRoaXMpICk7CisJfQorCisJaW5saW5lIGJvb2wgc2V2YWxDaGFpbmVkKGNvbnN0IEJGICYgYmYpCisJeworCQlpbkVEID0gb3V0RUQ7CisKKwkJaW5GT1JNID0gYmY7CisKKwkJcmV0dXJuKCBQUklNSVRJVkVfUFJPQ0VTU09SLmRlY29kZV9zZXZhbCgqdGhpcykgKTsKKwl9CisKKworCS8qKgorCSAqIFRPT0xTCisJICovCisJQkYgaW9TdWJzdChjb25zdCBBUEV4ZWN1dGlvbkRhdGEgJiBhcEVELCBBdm1Qcm9ncmFtICogYVByb2dyYW0sCisJCQlBdm1Db2RlICogcHJvZ0lPLCBBdm1Db2RlICogdHJhY2VJTywgY29uc3QgQkYgJiBhQ29kZSk7CisKKworCS8qKgorCSAqIENIRUNLIFNBVElTRklBQklMSVRZCisJICovCisJYm9vbCBldmFsRm9ybXVsYShjb25zdCBBUEV4ZWN1dGlvbkRhdGEgJiBhbkVELCBjb25zdCBSdW50aW1lSUQgJiBhUklELAorCQkJQXZtUHJvZ3JhbSAqIGFQcm9ncmFtLCBjb25zdCBCRiAmIGFuRXhwcik7CisKKwlpbmxpbmUgYm9vbCBldmFsRm9ybXVsYShjb25zdCBBUEV4ZWN1dGlvbkRhdGEgJiBhbkVELAorCQkJY29uc3QgUnVudGltZUlEICYgYVJJRCwgY29uc3QgQkYgJiBhbkV4cHIpCisJeworCQlyZXR1cm4oIGV2YWxGb3JtdWxhKGFuRUQsIGFSSUQsIE5VTEwsIGFuRXhwcikgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBldmFsRm9ybXVsYShjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQywKKwkJCUF2bVByb2dyYW0gKiBhUHJvZ3JhbSwgY29uc3QgQkYgJiBhbkV4cHIpCisJeworCQlpbkVDID0gKCYgYW5FQyk7CisKKwkJaW5FRCA9IGFuRUMuZ2V0QVBFeGVjdXRpb25EYXRhKCk7CisKKwkJcmV0dXJuKCBldmFsRm9ybXVsYShpbkVELCBpbkVELT5nZXRTeXN0ZW1SSUQoKSwgYVByb2dyYW0sIGFuRXhwcikgKTsKKwl9CisKKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwl2aXJ0dWFsIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCit9OworCisKK30KKworI2VuZGlmIC8qIEVWQUxVQVRJT05FTlZJUk9OTUVOVF9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvRXhlY3V0aW9uRGF0YUZhY3RvcnkuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvRXhlY3V0aW9uRGF0YUZhY3RvcnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZDBjYmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9FeGVjdXRpb25EYXRhRmFjdG9yeS5jcHAKQEAgLTAsMCArMSwyMTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxMSBqYW52LiAyMDEyCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJFeGVjdXRpb25EYXRhRmFjdG9yeS5oIgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQXZtQ29kZS5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25Db21wYXJlci5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL1N0YXRlbWVudENvbnN0cnVjdG9yLmg+CisKKyNpbmNsdWRlIDxmbWwvb3BlcmF0b3IvT3BlcmF0b3JNYW5hZ2VyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qCisgKiBTRVRURVIKKyAqIFNjaGVkdWxlCisgKiBSdW5uYWJsZUVsZW1lbnRUcmFjZQorICogSU9FbGVtZW50VHJhY2UKKyAqLworCit2b2lkIEV4ZWN1dGlvbkRhdGFGYWN0b3J5OjphcHBlbmRSdW5uYWJsZUVsZW1lbnRUcmFjZSgKKwkJQVBFeGVjdXRpb25EYXRhICYgYXBFRCwgY29uc3QgQkYgJiBhUnVubmFibGVFbGVtZW50VHJhY2UpCit7CisJaWYoIGFwRUQtPmhhc1J1bm5hYmxlRWxlbWVudFRyYWNlKCkgKQorCXsKKwkJYXBFRC5tYWtlV3JpdGFibGUoKTsKKworCQlCRiAmIHRoZU5ld1J1bm5hYmxlRWxlbWVudFRyYWNlID0gYXBFRC0+Z2V0UnVubmFibGVFbGVtZW50VHJhY2UoKTsKKworLy9BVk1fT1NfREVCVUcgPDwgInRoZU5ld1J1bm5hYmxlRWxlbWVudFRyYWNlIGJlZzogIgorLy8JCTw8IGFwRUQtPmdldFJ1bm5hYmxlRWxlbWVudFRyYWNlKCkuc3RyKCIgIikgPDwgc3RkOjplbmRsOworCisJCWlmKCB0aGVOZXdSdW5uYWJsZUVsZW1lbnRUcmFjZS5pczwgQXZtQ29kZSA+KCkgJiYKKwkJCXRoZU5ld1J1bm5hYmxlRWxlbWVudFRyYWNlLnRvX3B0cjwKKwkJCQkJQXZtQ29kZSA+KCktPmlzT3BDb2RlKCBBVk1fT1BDT0RFX1NFUVVFTkNFICkgKQorCQl7CisJCQl0aGVOZXdSdW5uYWJsZUVsZW1lbnRUcmFjZS5tYWtlV3JpdGFibGUoKTsKKwkJCXRoZU5ld1J1bm5hYmxlRWxlbWVudFRyYWNlLnRvX3B0cjwKKwkJCQkJQXZtQ29kZSA+KCktPmFwcGVuZChhUnVubmFibGVFbGVtZW50VHJhY2UpOworCQl9CisJCWVsc2UKKwkJeworCQkJYXBFRC0+c2V0UnVubmFibGVFbGVtZW50VHJhY2UoIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NFUVVFTkNFLAorCQkJCQl0aGVOZXdSdW5uYWJsZUVsZW1lbnRUcmFjZSwgYVJ1bm5hYmxlRWxlbWVudFRyYWNlKSApOworCQl9CisKKy8vQVZNX09TX0RFQlVHIDw8ICJ0aGVOZXdSdW5uYWJsZUVsZW1lbnRUcmFjZSBlbmQ6ICIKKy8vCQk8PCBhcEVELT5nZXRSdW5uYWJsZUVsZW1lbnRUcmFjZSgpLnN0cigiICIpIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisJfQorCWVsc2UKKwl7CisJCWFwRUQubXdzZXRSdW5uYWJsZUVsZW1lbnRUcmFjZSggYVJ1bm5hYmxlRWxlbWVudFRyYWNlICk7CisKKy8vQVZNX09TX0RFQlVHIDw8ICJhUnVubmFibGVFbGVtZW50VHJhY2U6ICIgPDwgYVJ1bm5hYmxlRWxlbWVudFRyYWNlLnN0cigiICIpCisvLwkJPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKwl9Cit9CisKKwordm9pZCBFeGVjdXRpb25EYXRhRmFjdG9yeTo6YXBwZW5kSU9FbGVtZW50VHJhY2UoCisJCUFQRXhlY3V0aW9uRGF0YSAmIGFwRUQsIGNvbnN0IEJGICYgdGhlSU9FbGVtZW50VHJhY2UpCit7CisJaWYoIGFwRUQtPmhhc0lPRWxlbWVudFRyYWNlKCkgKQorCXsKKwkJYXBFRC5tYWtlV3JpdGFibGUoKTsKKworCQlCRiAmIHRoZU5ld0lPRWxlbWVudFRyYWNlID0gYXBFRC0+Z2V0SU9FbGVtZW50VHJhY2UoKTsKKworCQlpZiggdGhlTmV3SU9FbGVtZW50VHJhY2UuaXM8IEF2bUNvZGUgPigpICYmCisJCQl0aGVOZXdJT0VsZW1lbnRUcmFjZS50b19wdHI8IEF2bUNvZGUgPigpLT5pc09wQ29kZSggQVZNX09QQ09ERV9TRVFVRU5DRSApICkKKwkJeworCQkJdGhlTmV3SU9FbGVtZW50VHJhY2UubWFrZVdyaXRhYmxlKCk7CisJCQl0aGVOZXdJT0VsZW1lbnRUcmFjZS50b19wdHI8IEF2bUNvZGUgPigpLT5hcHBlbmQodGhlSU9FbGVtZW50VHJhY2UpOworCQl9CisJCWVsc2UKKwkJeworCQkJYXBFRC0+c2V0SU9FbGVtZW50VHJhY2UoIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NFUVVFTkNFLAorCQkJCQl0aGVOZXdJT0VsZW1lbnRUcmFjZSwgdGhlSU9FbGVtZW50VHJhY2UpICk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJYXBFRC5td3NldElPRWxlbWVudFRyYWNlKCB0aGVJT0VsZW1lbnRUcmFjZSApOworCX0KK30KKworCisKKworLyoqCisgKiBDT01QQVJJU09OCisgKi8KK2Jvb2wgRXhlY3V0aW9uRGF0YUZhY3Rvcnk6OmVxdWFsc1N0YXR1cygKKwkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIG9uZUVELCBjb25zdCBFeGVjdXRpb25EYXRhICYgb3RoZXJFRCkKK3sKKwlib29sIGlzRXF1YWxzID0gZmFsc2U7CisKKwlpZiggb25lRUQuZ2V0UnVudGltZUZvcm1TdGF0ZVRhYmxlKCkgPT0gb3RoZXJFRC5nZXRSdW50aW1lRm9ybVN0YXRlVGFibGUoKSApCisJeworCQlpc0VxdWFscyA9IG9uZUVELmdldFBhdGhDb25kaXRpb24oKS5zdHJFUSggb3RoZXJFRC5nZXRQYXRoQ29uZGl0aW9uKCkgKTsKKworCQlpZiggaXNFcXVhbHMgJiYgb25lRUQuZ2V0UnVudGltZUZvcm1TdGF0ZVRhYmxlKCktPmhhc0Fzc2lnbmVkKCkgKQorCQl7CisJCQlpc0VxdWFscyA9IGVxdWFsc0RhdGEob25lRUQsIG90aGVyRUQpOworCQl9CisJfQorCWVsc2UgaWYoIG9uZUVELmdldFJ1bnRpbWVGb3JtU3RhdGVUYWJsZSgpLT4KKwkJCWVxdWFsc1N0YXRlKG90aGVyRUQuZ2V0UnVudGltZUZvcm1TdGF0ZVRhYmxlKCkpICkKKwl7CisvLwkJaWYoIGdldFJ1bnRpbWVGb3JtU3RhdGVUYWJsZSgpLT5oYXNBc3NpZ25lZCgpICYmCisvLwkJCQlvdGhlckVELmdldFJ1bnRpbWVGb3JtU3RhdGVUYWJsZSgpLT5oYXNBc3NpZ25lZCgpICkKKy8vCQl7CisvLwkJCWlzRXF1YWxzID0gRXhwcmVzc2lvbkNvbXBhcmVyOjppc1NFUShnZXRQYXRoQ29uZGl0aW9uKCksCisvLwkJCQkJb3RoZXJFRC5nZXRQYXRoQ29uZGl0aW9uKCkpICYmIGVxdWFsc0RhdGEob25lLCBvdGhlcik7CisvLwkJfQorLy8JCWVsc2UgaWYoIGdldFJ1bnRpbWVGb3JtU3RhdGVUYWJsZSgpLT56ZXJvQXNzaWduZWQoKSAmJgorLy8JCQkJb3RoZXJFRC5nZXRSdW50aW1lRm9ybVN0YXRlVGFibGUoKS0+emVyb0Fzc2lnbmVkKCkgKQorLy8JCXsKKy8vCQkJaXNFcXVhbHMgPSBFeHByZXNzaW9uQ29tcGFyZXI6OmlzU0VRKAorLy8JCQkJCWdldFBhdGhDb25kaXRpb24oKSwgb3RoZXJFRC5nZXRQYXRoQ29uZGl0aW9uKCkpOworLy8JCX0KKworCQlpZiggKG9uZUVELmdldFNhdmVUYWJsZU9mQXNzaWduZWRGbGFnKCkgIT0gTlVMTCkgJiYKKwkJCQlvdGhlckVELmdldFJ1bnRpbWVGb3JtU3RhdGVUYWJsZSgpLT5oYXNBc3NpZ25lZCgpICkKKwkJeworCQkJaXNFcXVhbHMgPSBvbmVFRC5nZXRQYXRoQ29uZGl0aW9uKCkuc3RyRVEoIG90aGVyRUQuZ2V0UGF0aENvbmRpdGlvbigpICkKKwkJCQkJJiYgZXF1YWxzRGF0YShvbmVFRCwgb3RoZXJFRCk7CisJCX0KKwkJZWxzZSBpZiggKG9uZUVELmdldFNhdmVUYWJsZU9mQXNzaWduZWRGbGFnKCkgPT0gTlVMTCkgJiYKKwkJCQlvdGhlckVELmdldFJ1bnRpbWVGb3JtU3RhdGVUYWJsZSgpLT56ZXJvQXNzaWduZWQoKSApCisJCXsKKwkJCWlzRXF1YWxzID0gb25lRUQuZ2V0UGF0aENvbmRpdGlvbigpLnN0ckVRKCBvdGhlckVELmdldFBhdGhDb25kaXRpb24oKSApOworCQl9CisJfQorCisJcmV0dXJuKCBpc0VxdWFscyApOworfQorCisKK2Jvb2wgRXhlY3V0aW9uRGF0YUZhY3Rvcnk6OmVxdWFsc0RhdGEoCisJCWNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBvbmVFRCwgY29uc3QgRXhlY3V0aW9uRGF0YSAmIG90aGVyRUQpCit7CisJVGFibGVPZlJ1bnRpbWVGb3JtU3RhdGU6OlRhYmxlT2ZBc3NpZ25lZEZsYWcgYVRhYmxlT2ZBc3NpZ25lZEZsYWcgPQorCQkJb25lRUQuZ2V0U2F2ZVRhYmxlT2ZBc3NpZ25lZEZsYWcoKTsKKy8vCVRhYmxlT2ZSdW50aW1lRm9ybVN0YXRlOjpUYWJsZU9mQXNzaWduZWRGbGFnIGFUYWJsZU9mQXNzaWduZWRGbGFnID0KKy8vCQkJdGhlVGFibGVPZlJ1bnRpbWVGb3JtRmxhZ3MtPmdldFRhYmxlT2ZBc3NpZ25lZEZsYWcoKTsKKworCVRhYmxlT2ZSdW50aW1lRm9ybVN0YXRlOjpUYWJsZU9mQXNzaWduZWRGbGFnIG90aGVyVGFibGVPZkFzc2lnbmVkRmxhZyA9CisJCQlvdGhlckVELmdldFJ1bnRpbWVGb3JtU3RhdGVUYWJsZSgpLT5nZXRUYWJsZU9mQXNzaWduZWRGbGFnKCk7CisKKwlpZiggKGFUYWJsZU9mQXNzaWduZWRGbGFnICE9IE5VTEwpICYmIChvdGhlclRhYmxlT2ZBc3NpZ25lZEZsYWcgIT0gTlVMTCkgKQorCXsKKwkJYXZtX3NpemVfdCB2YXJDb3VudCA9IDA7CisJCWF2bV9zaXplX3QgcmZDb3VudCA9IG9uZUVELmdldFJ1bnRpbWVGb3JtU3RhdGVUYWJsZSgpLT5zaXplKCk7CisKKwkJZm9yKCBhdm1fc2l6ZV90IHJpZCA9IDAgOyByaWQgIT0gcmZDb3VudCA7ICsrcmlkICkKKwkJeworCQkJaWYoIChhVGFibGVPZkFzc2lnbmVkRmxhZ1tyaWRdICE9IE5VTEwpICYmCisJCQkJCShvdGhlclRhYmxlT2ZBc3NpZ25lZEZsYWdbcmlkXSAhPSBOVUxMKSApCisJCQl7CisJCQkJY29uc3QgUnVudGltZUZvcm0gJiBhUkYgPSBvbmVFRC5nZXRSdW50aW1lKHJpZCk7CisJCQkJdmFyQ291bnQgPSBhUkYuZ2V0RXhlY3V0YWJsZSgpLT5nZXRCYXNpY0RhdGFTaXplKCk7CisJCQkJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDAgOyBvZmZzZXQgPCB2YXJDb3VudCA7ICsrb2Zmc2V0ICkKKwkJCQl7CisJCQkJCWlmKCAoKihhVGFibGVPZkFzc2lnbmVkRmxhZ1tyaWRdKSlbb2Zmc2V0XSAhPQorCQkJCQkJCSgqKG90aGVyVGFibGVPZkFzc2lnbmVkRmxhZ1tyaWRdKSlbb2Zmc2V0XSApCisJCQkJCXsKKwkJCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCQkJfQorCQkJCQllbHNlIGlmKCAoKihhVGFibGVPZkFzc2lnbmVkRmxhZ1tyaWRdKSlbb2Zmc2V0XSApCisJCQkJCXsKKwkJCQkJCWlmKCBhUkYuZ2V0RGF0YShvZmZzZXQpLnN0ck5FUSgKKwkJCQkJCQkJb3RoZXJFRC5nZXRSdW50aW1lKHJpZCkuZ2V0RGF0YShvZmZzZXQpKSApCisJCQkJCQl7CisJCQkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiggYVRhYmxlT2ZBc3NpZ25lZEZsYWdbcmlkXSAhPSBvdGhlclRhYmxlT2ZBc3NpZ25lZEZsYWdbcmlkXSApCisJCQl7CisJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJfQorCQl9CisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiggYVRhYmxlT2ZBc3NpZ25lZEZsYWcgPT0gb3RoZXJUYWJsZU9mQXNzaWduZWRGbGFnICk7CisJfQorfQorCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvRXhlY3V0aW9uRGF0YUZhY3RvcnkuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL0V4ZWN1dGlvbkRhdGFGYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJlMzY0ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL0V4ZWN1dGlvbkRhdGFGYWN0b3J5LmgKQEAgLTAsMCArMSw2NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDExIGphbnYuIDIwMTIKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBFWEVDVVRJT05EQVRBRkFDVE9SWV9IXworI2RlZmluZSBFWEVDVVRJT05EQVRBRkFDVE9SWV9IXworCisjaW5jbHVkZSA8Y29tbW9uL0JGLmg+CisKKyNpbmNsdWRlIDxjb21wdXRlci9CYXNlRW52aXJvbm1lbnQuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkRhdGEuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworY2xhc3MgRXhlY3V0aW9uRGF0YUZhY3RvcnkKK3sKK3B1YmxpYzoKKworCisJLyoKKwkgKiBTRVRURVIKKwkgKiBSdW5uYWJsZUVsZW1lbnRUcmFjZQorCSAqIElPRWxlbWVudFRyYWNlCisJICovCisJc3RhdGljIHZvaWQgYXBwZW5kUnVubmFibGVFbGVtZW50VHJhY2UoCisJCQlBUEV4ZWN1dGlvbkRhdGEgJiBhcEVELCBjb25zdCBCRiAmIGFSdW5uYWJsZUVsZW1lbnRUcmFjZSk7CisKKwlzdGF0aWMgdm9pZCBhcHBlbmRJT0VsZW1lbnRUcmFjZSgKKwkJCUFQRXhlY3V0aW9uRGF0YSAmIGFwRUQsIGNvbnN0IEJGICYgdGhlSU9FbGVtZW50VHJhY2UpOworCisKKwkvKioKKwkgKiBDT01QQVJJU09OCisJICovCisJc3RhdGljIGJvb2wgZXF1YWxzU3RhdHVzKAorCQkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIG9uZUVELCBjb25zdCBFeGVjdXRpb25EYXRhICYgb3RoZXJFRCk7CisKKwlzdGF0aWMgYm9vbCBlcXVhbHNEYXRhKAorCQkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIG9uZUVELCBjb25zdCBFeGVjdXRpb25EYXRhICYgb3RoZXJFRCk7CisKKworCisKK307CisKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKyNlbmRpZiAvKiBFWEVDVVRJT05EQVRBRkFDVE9SWV9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvRXhlY3V0aW9uRW52aXJvbm1lbnQuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvRXhlY3V0aW9uRW52aXJvbm1lbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMjM0NGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9FeGVjdXRpb25FbnZpcm9ubWVudC5jcHAKQEAgLTAsMCArMSw0OTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxOSBmw6l2ci4gMjAxMAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiRXhlY3V0aW9uRW52aXJvbm1lbnQuaCIKKworI2luY2x1ZGUgPGNvbXB1dGVyL0V2YWx1YXRpb25FbnZpcm9ubWVudC5oPgorCisjaW5jbHVkZSA8Y29tcHV0ZXIvaW5zdHJ1Y3Rpb24vSW5zdHJ1Y3Rpb25FbnZpcm9ubWVudC5oPgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQnVpbHRpbkFycmF5Lmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vU3RhdGVtZW50Q29uc3RydWN0b3IuaD4KKworI2luY2x1ZGUgPGZtbC9vcGVyYXRvci9PcGVyYXRvck1hbmFnZXIuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL1J1bnRpbWVGb3JtLmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvUnVudGltZUlELmg+CisKKworI2RlZmluZSBFWEVDX0VOVl9JTklUSUFMX0NPVU5UICAgICAxNgorCisjZGVmaW5lIEVYRUNfRU5WX0RFRkFVTFRfQ0FQQUNJVFkgIDE2CisKKyNkZWZpbmUgRVhFQ19FTlZfSU5DUl9DQVBBQ0lUWSAgICAgIDgKKworCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENBQ0hFIE1BTkFHRVIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitMaXN0PCBFeGVjdXRpb25FbnZpcm9ubWVudDo6X0VYRUNfRU5WXyAqID4KK0V4ZWN1dGlvbkVudmlyb25tZW50OjpFWEVDX0VOVl9DQUNIRTsKKworCit2b2lkIEV4ZWN1dGlvbkVudmlyb25tZW50Ojppbml0RU5WUygpCit7CisJZm9yKCBhdm1fc2l6ZV90IGkgPSAwIDsgaSA8IEVYRUNfRU5WX0lOSVRJQUxfQ09VTlQgOyArK2kgKQorCXsKKwkJRVhFQ19FTlZfQ0FDSEUuYXBwZW5kKCBuZXcgX0VYRUNfRU5WXygpICk7CisJfQorfQorCit2b2lkIEV4ZWN1dGlvbkVudmlyb25tZW50OjpmaW5hbGl6ZUVOVlMoKQoreworCXdoaWxlKCBFWEVDX0VOVl9DQUNIRS5ub25lbXB0eSgpICkKKwl7CisJCWRlbGV0ZSggRVhFQ19FTlZfQ0FDSEUucG9wX2xhc3QoKSApOworCX0KK30KKworCisKK0V4ZWN1dGlvbkVudmlyb25tZW50OjpfRVhFQ19FTlZfICogRXhlY3V0aW9uRW52aXJvbm1lbnQ6Om5ld0VOVigpCit7CisJRXhlY3V0aW9uRW52aXJvbm1lbnQ6Ol9FWEVDX0VOVl8gKiBleGVjX2VudiA9IE5VTEw7CisKKwlpZiggRVhFQ19FTlZfQ0FDSEUubm9uZW1wdHkoKSApCisJeworCQlFWEVDX0VOVl9DQUNIRS5wb3BfbGFzdF90byggZXhlY19lbnYgKTsKKwl9CisJZWxzZQorCXsKKwkJZXhlY19lbnYgPSBuZXcgX0VYRUNfRU5WXygpOworCisJCUFWTV9PU19BU1NFUlRfT1VUX09GX01FTU9SWV9FWElUKCBleGVjX2VudiApCisJCQkJPDwgIkJhc2VFbnZpcm9ubWVudDo6bmV3RU5WICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisJfQorCisJcmV0dXJuKCBleGVjX2VudiApOworfQorCisKK3ZvaWQgRXhlY3V0aW9uRW52aXJvbm1lbnQ6OmZyZWVFTlYoX0VYRUNfRU5WXyAqICYgZXhlY19lbnYpCit7CisJZXhlY19lbnYtPlBSSU1JVElWRV9QUk9DRVNTT1IgPSBOVUxMOworCisJZXhlY19lbnYtPmluRUMgPSBOVUxMOworCWV4ZWNfZW52LT5pbkZPUk0uZGVzdHJveSgpOworCWV4ZWNfZW52LT5pbkNPREUuZGVzdHJveSgpOworCWV4ZWNfZW52LT5pbkVELmRlc3Ryb3koKTsKKworCUluc3RydWN0aW9uRW52aXJvbm1lbnQ6OmZyZWVBUkdTKCBleGVjX2Vudi0+YXJnICk7CisKKwlleGVjX2Vudi0+b3V0RURTLmNsZWFyKCk7CisKKwlleGVjX2Vudi0+c3luY0VEUy5jbGVhcigpOworCWV4ZWNfZW52LT5pcnFFRFMuY2xlYXIoKTsKKwlleGVjX2Vudi0+ZXhpdEVEUy5jbGVhcigpOworCWV4ZWNfZW52LT5mYWlsdXJlRURTLmNsZWFyKCk7CisKKwlFWEVDX0VOVl9DQUNIRS5hcHBlbmQoIGV4ZWNfZW52ICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vIHRoZSBSVU4gc3RhdGVtZW50CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisKK2Jvb2wgRXhlY3V0aW9uRW52aXJvbm1lbnQ6OnJ1bigKKwkJTGlzdE9mQVBFeGVjdXRpb25EYXRhICYgaW5FRFMsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCUxpc3RPZkFQRXhlY3V0aW9uRGF0YTo6aXRlcmF0b3IgaXRFRCA9IGluRURTLmJlZ2luKCk7CisJTGlzdE9mQVBFeGVjdXRpb25EYXRhOjppdGVyYXRvciBlbmRFRCA9IGluRURTLmVuZCgpOworCWZvciggOyBpdEVEICE9IGVuZEVEIDsgKytpdEVEICkKKwl7CisJCWluRUQgPSAoKml0RUQpOworCQlpbkZPUk0gPSBpbkNPREUgPSBhQ29kZTsKKwkJaWYoIG5vdCBQUklNSVRJVkVfUFJPQ0VTU09SLnJ1bihpbkNPREUtPmdldE9wT2Zmc2V0KCksICp0aGlzKSApCisJCXsKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KKwlyZXR1cm4oIHRydWUgKTsKK30KKworCitib29sIEV4ZWN1dGlvbkVudmlyb25tZW50OjpydW5Gcm9tT3V0cHV0cyhjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlpbkZPUk0gPSBpbkNPREUgPSBhQ29kZTsKKworCWlmKCBvdXRFRFMuc2luZ2xldG9uKCkgKQorCXsKKwkJb3V0RURTLnBvcF9maXJzdF90byggaW5FRCApOworCisJCXJldHVybiggUFJJTUlUSVZFX1BST0NFU1NPUi5ydW4oaW5DT0RFLT5nZXRPcE9mZnNldCgpLCAqdGhpcykgKTsKKwl9CisJZWxzZQorCXsKKwkJTGlzdE9mQVBFeGVjdXRpb25EYXRhIGluRURTOworCQlpbkVEUy5zcGxpY2UoIG91dEVEUyApOworCisJCUxpc3RPZkFQRXhlY3V0aW9uRGF0YTo6aXRlcmF0b3IgaXRFRCA9IGluRURTLmJlZ2luKCk7CisJCUxpc3RPZkFQRXhlY3V0aW9uRGF0YTo6aXRlcmF0b3IgZW5kRUQgPSBpbkVEUy5lbmQoKTsKKwkJZm9yKCA7IGl0RUQgIT0gZW5kRUQgOyArK2l0RUQgKQorCQl7CisJCQlpbkVEID0gKCppdEVEKTsKKwkJCWluRk9STSA9IGluQ09ERSA9IGFDb2RlOworCQkJaWYoIG5vdCBQUklNSVRJVkVfUFJPQ0VTU09SLnJ1bihpbkNPREUtPmdldE9wT2Zmc2V0KCksICp0aGlzKSApCisJCQl7CisJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJfQorCQl9CisJCXJldHVybiggdHJ1ZSApOworCX0KK30KKworCitib29sIEV4ZWN1dGlvbkVudmlyb25tZW50OjpydW5Gcm9tT3V0cHV0cyhPcGVyYXRvciAqIG9wLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKK3sKKwlpbkZPUk0gPSBpbkNPREUgPSBhQ29kZTsKKworCWlmKCBvdXRFRFMuc2luZ2xldG9uKCkgKQorCXsKKwkJb3V0RURTLnBvcF9maXJzdF90byggaW5FRCApOworCisJCXJldHVybiggUFJJTUlUSVZFX1BST0NFU1NPUi5ydW4ob3AtPmdldE9mZnNldCgpLCAqdGhpcykgKTsKKwl9CisJZWxzZQorCXsKKwkJTGlzdE9mQVBFeGVjdXRpb25EYXRhIGluRURTOworCQlpbkVEUy5zcGxpY2UoIG91dEVEUyApOworCisJCUxpc3RPZkFQRXhlY3V0aW9uRGF0YTo6aXRlcmF0b3IgaXRFRCA9IGluRURTLmJlZ2luKCk7CisJCUxpc3RPZkFQRXhlY3V0aW9uRGF0YTo6aXRlcmF0b3IgZW5kRUQgPSBpbkVEUy5lbmQoKTsKKwkJZm9yKCA7IGl0RUQgIT0gZW5kRUQgOyArK2l0RUQgKQorCQl7CisJCQlpbkVEID0gKCppdEVEKTsKKwkJCWluRk9STSA9IGluQ09ERSA9IGFDb2RlOworCQkJaWYoIG5vdCBQUklNSVRJVkVfUFJPQ0VTU09SLnJ1bihpbkNPREUtPmdldE9wT2Zmc2V0KCksICp0aGlzKSApCisJCQl7CisJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJfQorCQl9CisJCXJldHVybiggdHJ1ZSApOworCX0KK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gdGhlIFJFU1VNRSBzdGF0ZW1lbnQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgRXhlY3V0aW9uRW52aXJvbm1lbnQ6OnJlc3VtZSgKKwkJRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsIEFQRXhlY3V0aW9uRGF0YSAmIGFuRUQpCit7CisJaW5FQyA9IEVOVi5pbkVDOworCisJaW5FRCA9IGFuRUQ7CisKKwlpbkVELm1ha2VXcml0YWJsZSgpOworCisJaW5FRC0+bVNUQVRFTUVOVF9RVUVVRS5wb3BUbyggc2F2ZUVYRUNfTE9DQVRJT04gKTsKKwlpbkVYRUNfTE9DQVRJT04gPSBzYXZlRVhFQ19MT0NBVElPTi50b19wdHI8IEV4ZWN1dGlvbkxvY2F0aW9uID4oKTsKKworCWluRUQtPm1SSUQgPSBpbkVYRUNfTE9DQVRJT04tPm1SSUQ7CisKKwlpbkZPUk0gPSBpbkNPREUgPSBpbkVYRUNfTE9DQVRJT04tPm1DT0RFOworCisJcmV0dXJuIFBSSU1JVElWRV9QUk9DRVNTT1IucmVzdW1lKCp0aGlzKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gdGhlIE9VVFBVVCBtYW5hZ2VtZW50CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIEV4ZWN1dGlvbkVudmlyb25tZW50OjphcHBlbmRPdXRwdXQoRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCW91dEVEUy5hcHBlbmQoIEVOVi5vdXRFRCApOworCisJc3BsaWNlRmFpbHVyZSggRU5WICk7Cit9CisKK2Jvb2wgRXhlY3V0aW9uRW52aXJvbm1lbnQ6OmV4dHJhY3RPdGhlck91dHB1dEVEKAorCQljb25zdCBBUEV4ZWN1dGlvbkRhdGEgJiBhbkVELCBMaXN0T2ZBUEV4ZWN1dGlvbkRhdGEgJiBsaXN0RURTKQoreworCWF2bV91aW50OF90IGZsYWdzID0gMDsKKworCXdoaWxlKCBvdXRFRFMubm9uZW1wdHkoKSApCisJeworCQlpZiggb3V0RURTLmZpcnN0KCktPmlzVE5FUSggYW5FRCApICkKKwkJeworCQkJZmxhZ3MgPSBmbGFncyB8IDB4MDE7CisJCQlsaXN0RURTLmFwcGVuZCggb3V0RURTLnBvcF9maXJzdCgpICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlmbGFncyA9IGZsYWdzIHwgMHgwMjsKKwkJCW91dEVEUy5wb3BfZmlyc3QoKTsKKwkJfQorCX0KKworCXJldHVybiggZmxhZ3MgPT0gMHgwMiApOworfQorCisvKioKKyAqIGFwcGVuZE91dHB1dAorICogdy5yLnQuIEFWTV9FWEVDX0VORElOR19TVEFUVVMKKyAqLwordm9pZCBFeGVjdXRpb25FbnZpcm9ubWVudDo6YXBwZW5kT3V0cHV0X3dydEFFRVMoQVBFeGVjdXRpb25EYXRhICYgYW5FRCkKK3sKKwkvLyBWZXJpZmljYXRpb24gb2YgRVhFQ1VUSU9OIEVORElORyBTVEFUVVMKKwlzd2l0Y2goIGFuRUQtPmdldEFFRVMoKSApCisJeworCQljYXNlIEFFRVNfU1RNTlRfTk9USElORzoKKwkJY2FzZSBBRUVTX1NUTU5UX0JSRUFLOgorCQljYXNlIEFFRVNfU1RNTlRfQ09OVElOVUU6CisJCWNhc2UgQUVFU19TVE1OVF9SRVRVUk46CisJCXsKKwkJCWFuRUQubXdzZXRBRUVTKEFFRVNfT0spOworCisJCQlvdXRFRFMuYXBwZW5kKCBhbkVEICk7CisKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBBRUVTX09LOgorCQljYXNlIEFFRVNfU1RFUF9SRVNVTUU6CisJCWNhc2UgQUVFU19TVEVQX01BUks6CisJCXsKKwkJCW91dEVEUy5hcHBlbmQoIGFuRUQgKTsKKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEFFRVNfU1RNTlRfRVhJVDoKKwkJY2FzZSBBRUVTX1NUTU5UX0VYSVRfQUxMOgorCQljYXNlIEFFRVNfU1RNTlRfRkFUQUxfRVJST1I6CisJCWNhc2UgQUVFU19TWU1CT0xJQ19FWEVDVVRJT05fTElNSVRBVElPTjoKKwkJeworCQkJZXhpdEVEUy5hcHBlbmQoIGFuRUQgKTsKKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEFFRVNfRkFJTEVEOgorCQl7CisJCQlmYWlsdXJlRURTLmFwcGVuZCggYW5FRCApOworCisJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCTw8ICJVbmV4cGVjdGVkIEVORElORCBFWEVDVVRJT04gU1RBVFVTIDo+ICIKKwkJCQk8PCBSdW50aW1lRGVmOjpzdHJBRUVTKCBhbkVELT5tQUVFUyApIDw8ICIgISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJYnJlYWs7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCTw8ICJVbmV4cGVjdGVkIEVORElORCBFWEVDVVRJT04gU1RBVFVTIDo+ICIKKwkJCQk8PCBSdW50aW1lRGVmOjpzdHJBRUVTKCBhbkVELT5tQUVFUyApIDw8ICIgISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKworLyoqCisgKiBhcHBlbmRPdXRwdXQKKyAqIG13c2V0IFBST0NFU1NfRVZBTF9TVEFURQorICogbXdzZXQgQVZNX0VYRUNfRU5ESU5HX1NUQVRVUworICovCisKK2Jvb2wgRXhlY3V0aW9uRW52aXJvbm1lbnQ6Om13c2V0UEVTX213c2V0QUVFUygKKwkJQVBFeGVjdXRpb25EYXRhICYgYW5FRCwgY29uc3QgUnVudGltZUlEICYgYVJJRCwKKwkJUFJPQ0VTU19FVkFMX1NUQVRFIGFQRVMpCit7CisJYW5FRC5td3NldFJ1bnRpbWVGb3JtU3RhdGUoYVJJRCwgYVBFUyk7CisKKwlhbkVELT5zZXRBRUVTKCBSdW50aW1lRGVmOjpQRVNfdG9fQUVFUyhhUEVTLCBhbkVELT5nZXRBRUVTKCkpICk7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworYm9vbCBFeGVjdXRpb25FbnZpcm9ubWVudDo6YXBwZW5kT3V0cHV0X213c2V0UEVTX213c2V0QUVFUygKKwkJQVBFeGVjdXRpb25EYXRhICYgYW5FRCwgY29uc3QgUnVudGltZUlEICYgYVJJRCwKKwkJUFJPQ0VTU19FVkFMX1NUQVRFIGFQRVMpCit7CisJaWYoIG13c2V0UEVTX213c2V0QUVFUyhhbkVELCBhUklELCBhUEVTKSApCisJeworCQlvdXRFRFMuYXBwZW5kKCBhbkVEICk7CisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCitib29sIEV4ZWN1dGlvbkVudmlyb25tZW50OjphcHBlbmRPdXRwdXRfbXdzZXRQRVNfbXdzZXRBRUVTKAorCQlFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOViwgY29uc3QgUnVudGltZUlEICYgYVJJRCwKKwkJUFJPQ0VTU19FVkFMX1NUQVRFIGFQRVMpCit7CisJTGlzdE9mQVBFeGVjdXRpb25EYXRhOjppdGVyYXRvciBpdEVEID0gRU5WLm91dEVEUy5iZWdpbigpOworCUxpc3RPZkFQRXhlY3V0aW9uRGF0YTo6aXRlcmF0b3IgZW5kRUQgPSBFTlYub3V0RURTLmVuZCgpOworCWZvciggOyBpdEVEICE9IGVuZEVEIDsgKytpdEVEICkKKwl7CisJCWFwcGVuZE91dHB1dF9td3NldFBFU19td3NldEFFRVMoKCppdEVEKSwgYVJJRCwgYVBFUyk7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworCitib29sIEV4ZWN1dGlvbkVudmlyb25tZW50OjphcHBlbmRPdXRwdXRfbXdzZXRQRVNfbXdzZXRBRUVTKAorCQlBUEV4ZWN1dGlvbkRhdGEgJiBhbkVELCBjb25zdCBSdW50aW1lSUQgJiBhUklELAorCQlQUk9DRVNTX0VWQUxfU1RBVEUgb2xkUEVTLCBQUk9DRVNTX0VWQUxfU1RBVEUgYVBFUykKK3sKKwlpZiggYW5FRC0+Z2V0UnVudGltZUZvcm1TdGF0ZShhUklEKSA9PSBvbGRQRVMgKQorCXsKKwkJYW5FRC5td3NldFJ1bnRpbWVGb3JtU3RhdGUoYVJJRCwgYVBFUyk7CisKKwkJYW5FRC0+c2V0QUVFUyggUnVudGltZURlZjo6UEVTX3RvX0FFRVMoYVBFUywgYW5FRC0+Z2V0QUVFUygpKSApOworCX0KKworCW91dEVEUy5hcHBlbmQoIGFuRUQgKTsKKworCXJldHVybiggdHJ1ZSApOworfQorCitib29sIEV4ZWN1dGlvbkVudmlyb25tZW50OjphcHBlbmRPdXRwdXRfbXdzZXRQRVNfbXdzZXRBRUVTKAorCQlFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOViwgY29uc3QgUnVudGltZUlEICYgYVJJRCwKKwkJUFJPQ0VTU19FVkFMX1NUQVRFIG9sZFBFUywgUFJPQ0VTU19FVkFMX1NUQVRFIGFQRVMpCit7CisJTGlzdE9mQVBFeGVjdXRpb25EYXRhOjppdGVyYXRvciBpdEVEID0gRU5WLm91dEVEUy5iZWdpbigpOworCUxpc3RPZkFQRXhlY3V0aW9uRGF0YTo6aXRlcmF0b3IgZW5kRUQgPSBFTlYub3V0RURTLmVuZCgpOworCWZvciggOyBpdEVEICE9IGVuZEVEIDsgKytpdEVEICkKKwl7CisJCWFwcGVuZE91dHB1dF9td3NldFBFU19td3NldEFFRVMoICgqaXRFRCksIGFSSUQsIG9sZFBFUywgYVBFUyApOworCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKKworYm9vbCBFeGVjdXRpb25FbnZpcm9ubWVudDo6YXBwZW5kT3V0cHV0X213c2V0UEVTX213c2V0QUVFU19td3NldFJJRCgKKwkJQVBFeGVjdXRpb25EYXRhICYgYW5FRCwKKwkJY29uc3QgUnVudGltZUlEICYgY3VycmVudFJJRCwgY29uc3QgUnVudGltZUlEICYgbmV4dFJJRCwKKwkJUFJPQ0VTU19FVkFMX1NUQVRFIG9sZFBFUywgUFJPQ0VTU19FVkFMX1NUQVRFIGFQRVMpCit7CisJaWYoIGFuRUQtPmdldFJ1bnRpbWVGb3JtU3RhdGUoY3VycmVudFJJRCkgPT0gb2xkUEVTICkKKwl7CisJCWFuRUQubXdzZXRSdW50aW1lRm9ybVN0YXRlKGN1cnJlbnRSSUQsIGFQRVMpOworCisJCWFuRUQtPnNldEFFRVMoIFJ1bnRpbWVEZWY6OlBFU190b19BRUVTKGFQRVMsIGFuRUQtPmdldEFFRVMoKSkgKTsKKwl9CisKKwlhbkVELT5tUklEID0gbmV4dFJJRDsKKworCW91dEVEUy5hcHBlbmQoIGFuRUQgKTsKKworCXJldHVybiggdHJ1ZSApOworfQorCitib29sIEV4ZWN1dGlvbkVudmlyb25tZW50OjphcHBlbmRPdXRwdXRfbXdzZXRQRVNfbXdzZXRBRUVTX213c2V0UklEKAorCQlFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOViwKKwkJY29uc3QgUnVudGltZUlEICYgY3VycmVudFJJRCwgY29uc3QgUnVudGltZUlEICYgbmV4dFJJRCwKKwkJUFJPQ0VTU19FVkFMX1NUQVRFIG9sZFBFUywgUFJPQ0VTU19FVkFMX1NUQVRFIGFQRVMpCit7CisJTGlzdE9mQVBFeGVjdXRpb25EYXRhOjppdGVyYXRvciBpdEVEID0gRU5WLm91dEVEUy5iZWdpbigpOworCUxpc3RPZkFQRXhlY3V0aW9uRGF0YTo6aXRlcmF0b3IgZW5kRUQgPSBFTlYub3V0RURTLmVuZCgpOworCWZvciggOyBpdEVEICE9IGVuZEVEIDsgKytpdEVEICkKKwl7CisJCWFwcGVuZE91dHB1dF9td3NldFBFU19td3NldEFFRVNfbXdzZXRSSUQoCisJCQkJKCppdEVEKSwgY3VycmVudFJJRCwgbmV4dFJJRCwgb2xkUEVTLCBhUEVTICk7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworCisKKy8qKgorICogU2VyaWFsaXphdGlvbgorICovCit2b2lkIEV4ZWN1dGlvbkVudmlyb25tZW50Ojp0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlvcyA8PCBUQUIgPDwgImVudmlyb25tZW50IHsiIDw8IEVPTDsKKworCWluRUMtPnRyYWNlRGVmYXVsdChvcyk7CisKKwkvL2luRUMtPndyaXRlVHJhY2VBZnRlckV4ZWMob3MsIFRBQjIsIENIQVIsIEVPTCk7CisKKwlvcyA8PCBUQUIgPDwgIm91dEVEUzo+ICBjb3VudCA6ICIgPDwgb3V0RURTLnNpemUoKSA8PCBzdGQ6OmVuZGw7CisJTGlzdE9mQVBFeGVjdXRpb25EYXRhOjpjb25zdF9pdGVyYXRvciBpdEVEID0gb3V0RURTLmJlZ2luKCk7CisJTGlzdE9mQVBFeGVjdXRpb25EYXRhOjpjb25zdF9pdGVyYXRvciBlbmRFRCA9IG91dEVEUy5lbmQoKTsKKwlmb3IoIDsgaXRFRCAhPSBlbmRFRCA7ICsraXRFRCApCisJeworCQlvcyA8PCBUQUIyIDw8ICI9PT5FWz9dICIgPDwgKCppdEVEKS0+c3RyU3RhdGVDb25mKCkKKwkJCQk8PCAiICIgPDwgKCppdEVEKS0+Z2V0UnVubmFibGVFbGVtZW50VHJhY2UoKS5zdHIoKSA8PCBFT0w7CisJfQorCW9zIDw8IHN0ZDo6Zmx1c2g7CisKKwlvcyA8PCBUQUIgPDwgInN5bmNFRFM6PiBjb3VudCA6ICIgPDwgc3luY0VEUy5zaXplKCkgPDwgc3RkOjplbmRsOworCWl0RUQgPSBzeW5jRURTLmJlZ2luKCk7CisJZW5kRUQgPSBzeW5jRURTLmVuZCgpOworCWZvciggOyBpdEVEICE9IGVuZEVEIDsgKytpdEVEICkKKwl7CisJCW9zIDw8IFRBQjIgPDwgIj09PkVbP10gIiA8PCAoKml0RUQpLT5zdHJTdGF0ZUNvbmYoKQorCQkJCTw8ICIgIiA8PCAoKml0RUQpLT5nZXRSdW5uYWJsZUVsZW1lbnRUcmFjZSgpLnN0cigpIDw8IEVPTDsKKwl9CisJb3MgPDwgc3RkOjpmbHVzaDsKKworCW9zIDw8IFRBQiA8PCAiaXJxRURTOj4gIGNvdW50IDogIiA8PCBpcnFFRFMuc2l6ZSgpIDw8IHN0ZDo6ZW5kbDsKKwlpdEVEID0gaXJxRURTLmJlZ2luKCk7CisJZW5kRUQgPSBpcnFFRFMuZW5kKCk7CisJZm9yKCA7IGl0RUQgIT0gZW5kRUQgOyArK2l0RUQgKQorCXsKKwkJb3MgPDwgVEFCMiA8PCAiPT0+RVs/XSAiIDw8ICgqaXRFRCktPnN0clN0YXRlQ29uZigpCisJCQkJPDwgIiAiIDw8ICgqaXRFRCktPmdldFJ1bm5hYmxlRWxlbWVudFRyYWNlKCkuc3RyKCkgPDwgRU9MOworCX0KKwlvcyA8PCBzdGQ6OmZsdXNoOworCisJb3MgPDwgVEFCIDw8ICJmYWlsRURTOj4gY291bnQgOiAiIDw8IGZhaWx1cmVFRFMuc2l6ZSgpIDw8IHN0ZDo6ZW5kbDsKKwlpdEVEID0gZmFpbHVyZUVEUy5iZWdpbigpOworCWVuZEVEID0gZmFpbHVyZUVEUy5lbmQoKTsKKwlmb3IoIDsgaXRFRCAhPSBlbmRFRCA7ICsraXRFRCApCisJeworCQlvcyA8PCBUQUIyIDw8ICI9PT5FWz9dICIgPDwgKCppdEVEKS0+c3RyU3RhdGVDb25mKCkKKwkJCQk8PCAiICIgPDwgKCppdEVEKS0+Z2V0UnVubmFibGVFbGVtZW50VHJhY2UoKS5zdHIoKSA8PCBFT0w7CisJfQorCisJb3MgPDwgVEFCIDw8ICJ9IiA8PCBFT0xfRkxVU0g7CisKK30KKworCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL0V4ZWN1dGlvbkVudmlyb25tZW50LmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9FeGVjdXRpb25FbnZpcm9ubWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMWJhODQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9FeGVjdXRpb25FbnZpcm9ubWVudC5oCkBAIC0wLDAgKzEsNzYwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTkgZsOpdnIuIDIwMTAKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBFWEVDVVRJT05FTlZJUk9OTUVOVF9IXworI2RlZmluZSBFWEVDVVRJT05FTlZJUk9OTUVOVF9IXworCisjaW5jbHVkZSA8Y29tcHV0ZXIvQmFzZUVudmlyb25tZW50Lmg+CisKKyNpbmNsdWRlIDxjb21tb24vQXZtUG9pbnRlci5oPgorCisjaW5jbHVkZSA8Y29tcHV0ZXIvcHJpbWl0aXZlL0F2bVByaW1pdGl2ZVByb2Nlc3Nvci5oPgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQXZtQ29kZS5oPgorCisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yLmg+CisKKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25EYXRhLmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uTG9jYXRpb24uaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lRGVmLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBFdmFsdWF0aW9uRW52aXJvbm1lbnQ7CitjbGFzcyBBdm1QcmltaXRpdmVQcm9jZXNzb3I7CisKK2NsYXNzIFJ1bnRpbWVJRDsKKworCitjbGFzcyBFeGVjdXRpb25FbnZpcm9ubWVudCA6CisJCXB1YmxpYyBCYXNlRW52aXJvbm1lbnQgLAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIEV4ZWN1dGlvbkVudmlyb25tZW50ICkKK3sKKworcHVibGljIDoKKwkvKioKKwkgKiBBVFRSSUJVVEVTCisJICovCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIElOUFVUcworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwlCRiBzYXZlRVhFQ19MT0NBVElPTjsKKwlFeGVjdXRpb25Mb2NhdGlvbiAqIGluRVhFQ19MT0NBVElPTjsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIE9VVFBVVHMKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJTGlzdE9mQVBFeGVjdXRpb25EYXRhIG91dEVEUzsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFNZTkMgRXhlY3V0aW9uIERhdGEKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJTGlzdE9mQVBFeGVjdXRpb25EYXRhIHN5bmNFRFM7CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gSU5URVJSVVBUIFJFUVVFU1QgRXhlY3V0aW9uIERhdGEKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJTGlzdE9mQVBFeGVjdXRpb25EYXRhIGlycUVEUzsKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBJTlRFUlJVUFQgUkVRVUVTVCBFeGVjdXRpb24gRGF0YQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGEgZXhpdEVEUzsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJRXhlY3V0aW9uRW52aXJvbm1lbnQoQXZtUHJpbWl0aXZlUHJvY2Vzc29yICYgYVByaW1pdGl2ZVByb2Nlc3NvcikKKwk6IEJhc2VFbnZpcm9ubWVudCggYVByaW1pdGl2ZVByb2Nlc3NvciApLAorCXNhdmVFWEVDX0xPQ0FUSU9OKCApLAorCWluRVhFQ19MT0NBVElPTiggTlVMTCApLAorCW91dEVEUyggKSwKKwlzeW5jRURTKCApLAorCWlycUVEUyggKSwKKwlleGl0RURTKCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlFeGVjdXRpb25FbnZpcm9ubWVudChBdm1QcmltaXRpdmVQcm9jZXNzb3IgJiBhUHJpbWl0aXZlUHJvY2Vzc29yLAorCQkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAqIGFQYXJlbnRFQykKKwk6IEJhc2VFbnZpcm9ubWVudCggYVByaW1pdGl2ZVByb2Nlc3NvciAsIGFQYXJlbnRFQyApLAorCXNhdmVFWEVDX0xPQ0FUSU9OKCApLAorCWluRVhFQ19MT0NBVElPTiggTlVMTCApLAorCW91dEVEUyggKSwKKwlzeW5jRURTKCApLAorCWlycUVEUyggKSwKKwlleGl0RURTKCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSogQ09OU1RSVUNUT1IKKwkqIENvcHkKKwkqLworCWV4cGxpY2l0IEV4ZWN1dGlvbkVudmlyb25tZW50KGNvbnN0IEV4ZWN1dGlvbkVudmlyb25tZW50ICYgZm9ybSkKKwk6IEJhc2VFbnZpcm9ubWVudCggZm9ybSApLAorCXNhdmVFWEVDX0xPQ0FUSU9OKCBmb3JtLnNhdmVFWEVDX0xPQ0FUSU9OICksCisJaW5FWEVDX0xPQ0FUSU9OKCBmb3JtLmluRVhFQ19MT0NBVElPTiApLAorCW91dEVEUyggZm9ybS5vdXRFRFMgKSwKKwlzeW5jRURTKCBmb3JtLnN5bmNFRFMgKSwKKwlpcnFFRFMoIGZvcm0uaXJxRURTICksCisJZXhpdEVEUyggZm9ybS5leGl0RURTICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJRXhlY3V0aW9uRW52aXJvbm1lbnQoY29uc3QgQmFzZUVudmlyb25tZW50ICYgZm9ybSwgY29uc3QgQkYgJiBiZikKKwk6IEJhc2VFbnZpcm9ubWVudCggZm9ybSAsIGJmICksCisJc2F2ZUVYRUNfTE9DQVRJT04oICksCisJaW5FWEVDX0xPQ0FUSU9OKCBOVUxMICksCisJb3V0RURTKCApLAorCXN5bmNFRFMoICksCisJaXJxRURTKCApLAorCWV4aXRFRFMoICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCUV4ZWN1dGlvbkVudmlyb25tZW50KGNvbnN0IEJhc2VFbnZpcm9ubWVudCAmIGZvcm0sIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQorCTogQmFzZUVudmlyb25tZW50KCBmb3JtICwgYUNvZGUgKSwKKwlzYXZlRVhFQ19MT0NBVElPTiggKSwKKwlpbkVYRUNfTE9DQVRJT04oIE5VTEwgKSwKKwlvdXRFRFMoICksCisJc3luY0VEUyggKSwKKwlpcnFFRFMoICksCisJZXhpdEVEUyggKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJRXhlY3V0aW9uRW52aXJvbm1lbnQoY29uc3QgQmFzZUVudmlyb25tZW50ICYgZm9ybSwKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQorCTogQmFzZUVudmlyb25tZW50KCBmb3JtICwgYVJJRCAsIGFDb2RlICksCisJc2F2ZUVYRUNfTE9DQVRJT04oICksCisJaW5FWEVDX0xPQ0FUSU9OKCBOVUxMICksCisJb3V0RURTKCApLAorCXN5bmNFRFMoICksCisJaXJxRURTKCApLAorCWV4aXRFRFMoICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJRXhlY3V0aW9uRW52aXJvbm1lbnQoY29uc3QgQmFzZUVudmlyb25tZW50ICYgZm9ybSwKKwkJCWNvbnN0IEFQRXhlY3V0aW9uRGF0YSAmIGFuRUQpCisJOiBCYXNlRW52aXJvbm1lbnQoIGZvcm0gLCBhbkVEICksCisJc2F2ZUVYRUNfTE9DQVRJT04oICksCisJaW5FWEVDX0xPQ0FUSU9OKCBOVUxMICksCisJb3V0RURTKCApLAorCXN5bmNFRFMoICksCisJaXJxRURTKCApLAorCWV4aXRFRFMoICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJRXhlY3V0aW9uRW52aXJvbm1lbnQoY29uc3QgQmFzZUVudmlyb25tZW50ICYgZm9ybSwKKwkJCWNvbnN0IEFQRXhlY3V0aW9uRGF0YSAmIGFuRUQsIGNvbnN0IEJGICYgYmYpCisJOiBCYXNlRW52aXJvbm1lbnQoIGZvcm0gLCBhbkVEICwgYmYgKSwKKwlzYXZlRVhFQ19MT0NBVElPTiggKSwKKwlpbkVYRUNfTE9DQVRJT04oIE5VTEwgKSwKKwlvdXRFRFMoICksCisJc3luY0VEUyggKSwKKwlpcnFFRFMoICksCisJZXhpdEVEUyggKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJRXhlY3V0aW9uRW52aXJvbm1lbnQoY29uc3QgQmFzZUVudmlyb25tZW50ICYgZm9ybSwKKwkJCWNvbnN0IEFQRXhlY3V0aW9uRGF0YSAmIGFuRUQsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQorCTogQmFzZUVudmlyb25tZW50KCBmb3JtICwgYW5FRCAsIGFDb2RlICksCisJc2F2ZUVYRUNfTE9DQVRJT04oICksCisJaW5FWEVDX0xPQ0FUSU9OKCBOVUxMICksCisJb3V0RURTKCApLAorCXN5bmNFRFMoICksCisJaXJxRURTKCApLAorCWV4aXRFRFMoICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJRXhlY3V0aW9uRW52aXJvbm1lbnQoY29uc3QgQmFzZUVudmlyb25tZW50ICYgZm9ybSwKKwkJCWNvbnN0IEFQRXhlY3V0aW9uRGF0YSAmIGFuRUQsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsCisJCQljb25zdCBCRkNvZGUgJiBhQ29kZSkKKwk6IEJhc2VFbnZpcm9ubWVudCggZm9ybSAsIGFuRUQgLCBhUklEICwgYUNvZGUgKSwKKwlzYXZlRVhFQ19MT0NBVElPTiggKSwKKwlpbkVYRUNfTE9DQVRJT04oIE5VTEwgKSwKKwlvdXRFRFMoICksCisJc3luY0VEUyggKSwKKwlpcnFFRFMoICksCisJZXhpdEVEUyggKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+RXhlY3V0aW9uRW52aXJvbm1lbnQoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBERVNUUk9ZIE9VVFBVVFMKKwkgKi8KKwlpbmxpbmUgdm9pZCBkZXN0cm95T3V0RUQoKQorCXsKKwkJb3V0RURTLmNsZWFyKCk7CisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8vLy8gdGhlIE9VVFBVVCBtYW5hZ2VtZW50CisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJaW5saW5lIHZvaWQgYXBwZW5kT3V0cHV0KGNvbnN0IEFQRXhlY3V0aW9uRGF0YSAmIGFuRUQpCisJeworCQlvdXRFRFMuYXBwZW5kKGFuRUQpOworCX0KKworCXZvaWQgYXBwZW5kT3V0cHV0KEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOVik7CisKKworCWlubGluZSB2aXJ0dWFsIGJvb2wgaGFzT3V0cHV0KCkgY29uc3QKKwl7CisJCXJldHVybiggb3V0RURTLm5vbmVtcHR5KCkgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBib29sIGhhc250T3V0cHV0KCkgY29uc3QKKwl7CisJCXJldHVybiggb3V0RURTLmVtcHR5KCkgKTsKKwl9CisKKwlib29sIGV4dHJhY3RPdGhlck91dHB1dEVEKGNvbnN0IEFQRXhlY3V0aW9uRGF0YSAmIGFuRUQsCisJCQlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGEgJiBsaXN0RURTKTsKKworCisJLyoqCisJICogYXBwZW5kT3V0cHV0CisJICogdy5yLnQuIEFWTV9FWEVDX0VORElOR19TVEFUVVMKKwkgKi8KKwl2b2lkIGFwcGVuZE91dHB1dF93cnRBRUVTKEFQRXhlY3V0aW9uRGF0YSAmIGFuRUQpOworCisKKwkvKioKKwkgKiBhcHBlbmRPdXRwdXQKKwkgKiBtd3NldCBQUk9DRVNTX0VWQUxfU1RBVEUKKwkgKi8KKwlpbmxpbmUgYm9vbCBhcHBlbmRPdXRwdXRfbXdzZXRQRVMoQVBFeGVjdXRpb25EYXRhICYgYW5FRCwKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsIFBST0NFU1NfRVZBTF9TVEFURSBhUEVTKQorCXsKKwkJYW5FRC5td3NldFJ1bnRpbWVGb3JtU3RhdGUoYVJJRCwgYVBFUyk7CisKKwkJb3V0RURTLmFwcGVuZCggYW5FRCApOworCisJCXJldHVybiggdHJ1ZSApOworCX0KKworCisJLyoqCisJICogYXBwZW5kT3V0cHV0CisJICogbXdzZXQgUFJPQ0VTU19FVkFMX1NUQVRFCisJICogbXdzZXQgQVZNX0VYRUNfRU5ESU5HX1NUQVRVUworCSAqLworCWJvb2wgbXdzZXRQRVNfbXdzZXRBRUVTKEFQRXhlY3V0aW9uRGF0YSAmIGFuRUQsCisJCQljb25zdCBSdW50aW1lSUQgJiBhUklELCBQUk9DRVNTX0VWQUxfU1RBVEUgYVBFUyk7CisKKwlib29sIGFwcGVuZE91dHB1dF9td3NldFBFU19td3NldEFFRVMoQVBFeGVjdXRpb25EYXRhICYgYW5FRCwKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsIFBST0NFU1NfRVZBTF9TVEFURSBhUEVTKTsKKworCWJvb2wgYXBwZW5kT3V0cHV0X213c2V0UEVTX213c2V0QUVFUyhFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOViwKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsIFBST0NFU1NfRVZBTF9TVEFURSBhUEVTKTsKKworCisJYm9vbCBhcHBlbmRPdXRwdXRfbXdzZXRQRVNfbXdzZXRBRUVTKEFQRXhlY3V0aW9uRGF0YSAmIGFuRUQsCisJCQljb25zdCBSdW50aW1lSUQgJiBhUklELAorCQkJUFJPQ0VTU19FVkFMX1NUQVRFIG9sZFBFUywgUFJPQ0VTU19FVkFMX1NUQVRFIGFQRVMpOworCisJYm9vbCBhcHBlbmRPdXRwdXRfbXdzZXRQRVNfbXdzZXRBRUVTKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WLAorCQkJY29uc3QgUnVudGltZUlEICYgYVJJRCwKKwkJCVBST0NFU1NfRVZBTF9TVEFURSBvbGRQRVMsIFBST0NFU1NfRVZBTF9TVEFURSBhUEVTKTsKKworCisJYm9vbCBhcHBlbmRPdXRwdXRfbXdzZXRQRVNfbXdzZXRBRUVTX213c2V0UklEKEFQRXhlY3V0aW9uRGF0YSAmIGFuRUQsCisJCQljb25zdCBSdW50aW1lSUQgJiBjdXJyZW50UklELCBjb25zdCBSdW50aW1lSUQgJiBuZXh0UklELAorCQkJUFJPQ0VTU19FVkFMX1NUQVRFIG9sZFBFUywgUFJPQ0VTU19FVkFMX1NUQVRFIGFQRVMpOworCisJYm9vbCBhcHBlbmRPdXRwdXRfbXdzZXRQRVNfbXdzZXRBRUVTX213c2V0UklEKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WLAorCQkJY29uc3QgUnVudGltZUlEICYgY3VycmVudFJJRCwgY29uc3QgUnVudGltZUlEICYgbmV4dFJJRCwKKwkJCVBST0NFU1NfRVZBTF9TVEFURSBvbGRQRVMsIFBST0NFU1NfRVZBTF9TVEFURSBhUEVTKTsKKworCS8qKgorCSAqIHNwbGljZQorCSAqIE9VVFBVVCBFeGVjdXRpb25EYXRhCisJICovCisKKwlpbmxpbmUgdm9pZCBzcGxpY2VPdXRwdXQoRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCisJeworCQlvdXRFRFMuc3BsaWNlKCBFTlYub3V0RURTICk7CisKKwkJc3BsaWNlTm90T3V0cHV0KCBFTlYgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzcGxpY2VOb3RPdXRwdXQoRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCisJeworCQlzcGxpY2VFeGl0KCBFTlYgKTsKKwkJc3BsaWNlSXJxKCBFTlYgKTsKKwkJc3BsaWNlRmFpbHVyZSggRU5WICk7CisJCXNwbGljZVN5bmMoIEVOViApOworCX0KKworCWlubGluZSB2b2lkIHNwbGljZU5vdE91dHB1dEV4aXQoRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCisJeworCQlzcGxpY2VJcnEoIEVOViApOworCQlzcGxpY2VGYWlsdXJlKCBFTlYgKTsKKwkJc3BsaWNlU3luYyggRU5WICk7CisJfQorCisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLyB0aGUgU1lOQyBtYW5hZ2VtZW50CisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIFNZTkMgRURTCisJICovCisJaW5saW5lIHZvaWQgYXBwZW5kU3luYyhjb25zdCBBUEV4ZWN1dGlvbkRhdGEgJiBhbkVEKQorCXsKKwkJc3luY0VEUy5hcHBlbmQoYW5FRCk7CisJfQorCisJaW5saW5lIHZvaWQgc3BsaWNlU3luYyhFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikKKwl7CisJCXN5bmNFRFMuc3BsaWNlKCBFTlYuc3luY0VEUyApOworCX0KKworCWlubGluZSBib29sIGhhc1N5bmMoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBzeW5jRURTLm5vbmVtcHR5KCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc1N5bmMoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBoYXNudE91dHB1dCgpICYmIHN5bmNFRFMubm9uZW1wdHkoKSApOworCX0KKworCisJLyoqCisJICogYXBwZW5kT3V0cHV0CisJICogbXdzZXQgUFJPQ0VTU19FVkFMX1NUQVRFCisJICovCisJaW5saW5lIGJvb2wgYXBwZW5kU3luY19td3NldEFFRVMoQVBFeGVjdXRpb25EYXRhICYgYW5FRCwKKwkJCUFWTV9FWEVDX0VORElOR19TVEFUVVMgYW5BRUVTKQorCXsKKwkJYW5FRC5td3NldEFFRVMoYW5BRUVTKTsKKworCQlzeW5jRURTLmFwcGVuZCggYW5FRCApOworCisJCXJldHVybiggdHJ1ZSApOworCX0KKworCisJLyoqCisJICogYXBwZW5kIFNZTkMKKwkgKiB3LnIudC4gQVZNX0VYRUNfRU5ESU5HX1NUQVRVUworCSAqCisJICogY2FzZSBBRUVTX1NURVBfTUFSSzoKKwkgKiBjYXNlIEFFRVNfV0FJVElOR19JTkNPTV9SRFY6CisJICogY2FzZSBBRUVTX1dBSVRJTkdfT1VUQ09NX1JEVjoKKwkgKiBjYXNlIEFFRVNfV0FJVElOR19KT0lOX0ZPUks6CisJICoKKwkgKiBzdG9yZSBzdGF0ZW1lbnQgcG9zaXRpb24KKwkgKi8KKwlpbmxpbmUgYm9vbCBhcHBlbmRTeW5jX213U3RvcmVQb3MoQVBFeGVjdXRpb25EYXRhIGFuRUQpCisJeworCQlhbkVELm1ha2VXcml0YWJsZSgpOworCQlhbkVELT5tU1RBVEVNRU5UX1FVRVVFLnB1c2goYW5FRC0+bVJJRCwgaW5DT0RFKTsKKworCQlzeW5jRURTLmFwcGVuZCggYW5FRCApOworCisJCXJldHVybiggdHJ1ZSApOworCX0KKworCWlubGluZSBib29sIGFwcGVuZFN5bmNfbXdTdG9yZVBvcyhBUEV4ZWN1dGlvbkRhdGEgYW5FRCwKKwkJCWNvbnN0IEF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yICYgaXQsCisJCQljb25zdCBBdm1Db2RlOjpjb25zdF9pdGVyYXRvciAmIGVuZEl0KQorCXsKKwkJYW5FRC5tYWtlV3JpdGFibGUoKTsKKwkJYW5FRC0+bVNUQVRFTUVOVF9RVUVVRS5wdXNoKGFuRUQtPm1SSUQsIGluQ09ERSwgaXQsIGVuZEl0KTsKKworCQlzeW5jRURTLmFwcGVuZCggYW5FRCApOworCisJCXJldHVybiggdHJ1ZSApOworCX0KKworCisJLyoqCisJICogc3BsaWNlIFNZTkMKKwkgKiB3LnIudC4gQVZNX0VYRUNfRU5ESU5HX1NUQVRVUworCSAqCisJICogY2FzZSBBRUVTX1NURVBfTUFSSzoKKwkgKiBjYXNlIEFFRVNfV0FJVElOR19JTkNPTV9SRFY6CisJICogY2FzZSBBRUVTX1dBSVRJTkdfT1VUQ09NX1JEVjoKKwkgKiBjYXNlIEFFRVNfV0FJVElOR19KT0lOX0ZPUks6CisJICoKKwkgKiBzdG9yZSBzdGF0ZW1lbnQgcG9zaXRpb24KKwkgKi8KKwlpbmxpbmUgdm9pZCBzcGxpY2VTeW5jX213U3RvcmVQb3MoRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCisJeworCQl3aGlsZSggRU5WLnN5bmNFRFMubm9uZW1wdHkoKSApCisJCXsKKwkJCWFwcGVuZFN5bmNfbXdTdG9yZVBvcyggRU5WLnN5bmNFRFMucG9wX2ZpcnN0KCkgKTsKKwkJfQorCX0KKworCWlubGluZSB2b2lkIHNwbGljZVN5bmNfbXdTdG9yZVBvcyhFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOViwKKwkJCWNvbnN0IEF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yICYgaXQsCisJCQljb25zdCBBdm1Db2RlOjpjb25zdF9pdGVyYXRvciAmIGVuZEl0KQorCXsKKwkJd2hpbGUoIEVOVi5zeW5jRURTLm5vbmVtcHR5KCkgKQorCQl7CisJCQlhcHBlbmRTeW5jX213U3RvcmVQb3MoRU5WLnN5bmNFRFMucG9wX2ZpcnN0KCksIGl0LCBlbmRJdCk7CisJCX0KKwl9CisKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vLy8vIHRoZSBJUlEgbWFuYWdlbWVudAorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBJTlRFUlJVUFQgUkVRVUVTVCBFRFMKKwkgKi8KKwlpbmxpbmUgdm9pZCBhcHBlbmRJcnEoY29uc3QgQVBFeGVjdXRpb25EYXRhICYgYW5FRCkKKwl7CisJCWlycUVEUy5hcHBlbmQoYW5FRCk7CisJfQorCisJaW5saW5lIHZvaWQgc3BsaWNlSXJxKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQorCXsKKwkJaXJxRURTLnNwbGljZSggRU5WLmlycUVEUyApOworCX0KKworCWlubGluZSBib29sIGhhc0lycSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGlycUVEUy5ub25lbXB0eSgpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzbnRJcnEoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBpcnFFRFMuZW1wdHkoKSApOworCX0KKworCWlubGluZSBib29sIGlzSXJxKCkgY29uc3QKKwl7CisJCXJldHVybiggaGFzbnRPdXRwdXQoKSAmJiBpcnFFRFMubm9uZW1wdHkoKSApOworCX0KKworCisJLyoqCisJICogYXBwZW5kT3V0cHV0CisJICogbXdzZXQgUFJPQ0VTU19FVkFMX1NUQVRFCisJICovCisJaW5saW5lIGJvb2wgYXBwZW5kSXJxX213c2V0QUVFUyhBUEV4ZWN1dGlvbkRhdGEgJiBhbkVELAorCQkJQVZNX0VYRUNfRU5ESU5HX1NUQVRVUyBhbkFFRVMpCisJeworCQlhbkVELm13c2V0QUVFUyhhbkFFRVMpOworCisJCWlycUVEUy5hcHBlbmQoIGFuRUQgKTsKKworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vLy8vIHRoZSBFWElUIG1hbmFnZW1lbnQKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogRVhJVCBSRVFVRVNUIEVEUworCSAqLworCWlubGluZSB2b2lkIGFwcGVuZEV4aXQoY29uc3QgQVBFeGVjdXRpb25EYXRhICYgYW5FRCkKKwl7CisJCWV4aXRFRFMuYXBwZW5kKGFuRUQpOworCX0KKworCWlubGluZSB2b2lkIHNwbGljZUV4aXQoRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCisJeworCQlleGl0RURTLnNwbGljZSggRU5WLmV4aXRFRFMgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNFeGl0KCkgY29uc3QKKwl7CisJCXJldHVybiggZXhpdEVEUy5ub25lbXB0eSgpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzbnRFeGl0KCkgY29uc3QKKwl7CisJCXJldHVybiggZXhpdEVEUy5lbXB0eSgpICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNFeGl0KCkgY29uc3QKKwl7CisJCXJldHVybiggaGFzbnRPdXRwdXQoKSAmJiBleGl0RURTLm5vbmVtcHR5KCkgKTsKKwl9CisKKworCS8qKgorCSAqIGFwcGVuZE91dHB1dAorCSAqIG13c2V0IFBST0NFU1NfRVZBTF9TVEFURQorCSAqLworCWlubGluZSBib29sIGFwcGVuZEV4aXRfbXdzZXRBRUVTKEFQRXhlY3V0aW9uRGF0YSAmIGFuRUQsCisJCQlBVk1fRVhFQ19FTkRJTkdfU1RBVFVTIGFuQUVFUykKKwl7CisJCWFuRUQubXdzZXRBRUVTKGFuQUVFUyk7CisKKwkJZXhpdEVEUy5hcHBlbmQoIGFuRUQgKTsKKworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vLy8vIEFMTCBPVVRQVVQgRUQgbWFuYWdlbWVudAorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlubGluZSBib29sIGhhc1N5bmNJcnEoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBzeW5jRURTLm5vbmVtcHR5KCkgfHwgaXJxRURTLm5vbmVtcHR5KCkgKTsKKwl9CisKKworCWlubGluZSBib29sIGhhc091dHB1dFN5bmNJcnEoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBvdXRFRFMubm9uZW1wdHkoKSB8fCBzeW5jRURTLm5vbmVtcHR5KCkgfHwgaXJxRURTLm5vbmVtcHR5KCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNudE91dHB1dFN5bmNJcnEoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBvdXRFRFMuZW1wdHkoKSAmJiBzeW5jRURTLmVtcHR5KCkgJiYgaXJxRURTLmVtcHR5KCkgKTsKKwl9CisKKworCWlubGluZSBib29sIGhhc05vbmVPdXRwdXQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBvdXRFRFMuZW1wdHkoKSAmJiBzeW5jRURTLmVtcHR5KCkgJiYKKwkJCQlpcnFFRFMuZW1wdHkoKSAmJiBmYWlsdXJlRURTLmVtcHR5KCkgKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLyB0aGUgUlVOIHN0YXRlbWVudAorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlubGluZSBib29sIHJ1bigpCisJeworCQlyZXR1cm4oIFBSSU1JVElWRV9QUk9DRVNTT1IucnVuKGluQ09ERS0+Z2V0T3BPZmZzZXQoKSwgKnRoaXMpICk7CisJfQorCisJaW5saW5lIGJvb2wgcnVuKFBST0NFU1NfRVZBTF9TVEFURSBhUEVTKQorCXsKKwkJaW5FRC5td3NldFJ1bnRpbWVGb3JtU3RhdGUoYVBFUyk7CisKKwkJcmV0dXJuKCBQUklNSVRJVkVfUFJPQ0VTU09SLnJ1bihpbkNPREUtPmdldE9wT2Zmc2V0KCksICp0aGlzKSApOworCX0KKworCWlubGluZSBib29sIHJ1bihPcGVyYXRvciAqIG9wLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKKwl7CisJCWluRk9STSA9IGluQ09ERSA9IGFDb2RlOworCisJCXJldHVybiggUFJJTUlUSVZFX1BST0NFU1NPUi5ydW4ob3AtPmdldE9mZnNldCgpLCAqdGhpcykgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBydW4oY29uc3QgQkZDb2RlICYgYUNvZGUpCisJeworCQlpbkZPUk0gPSBpbkNPREUgPSBhQ29kZTsKKworCQlyZXR1cm4oIFBSSU1JVElWRV9QUk9DRVNTT1IucnVuKGluQ09ERS0+Z2V0T3BPZmZzZXQoKSwgKnRoaXMpICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBydW4oY29uc3QgQkYgJiBiZikKKwl7CisJCWluRk9STSA9IGluQ09ERSA9IGJmLmJmQ29kZSgpOworCisJCXJldHVybiggUFJJTUlUSVZFX1BST0NFU1NPUi5ydW4oaW5DT0RFLT5nZXRPcE9mZnNldCgpLCAqdGhpcykgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBydW4oQVBFeGVjdXRpb25EYXRhICYgYW5FRCwgY29uc3QgQkZDb2RlICYgYUNvZGUpCisJeworCQlpbkVDID0gYW5FRC0+Z2V0RXhlY3V0aW9uQ29udGV4dCgpOworCisJCWluRUQgPSBhbkVEOworCisJCWluRk9STSA9IGluQ09ERSA9IGFDb2RlOworCisJCXJldHVybiggUFJJTUlUSVZFX1BST0NFU1NPUi5ydW4oaW5DT0RFLT5nZXRPcE9mZnNldCgpLCAqdGhpcykgKTsKKwl9CisKKwlib29sIHJ1bihMaXN0T2ZBUEV4ZWN1dGlvbkRhdGEgJiBpbkVEUywgY29uc3QgQkZDb2RlICYgYUNvZGUpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8vLy8gcnVuIGZyb20gT1VUIEVEUworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWJvb2wgcnVuRnJvbU91dHB1dHMoY29uc3QgQkZDb2RlICYgYUNvZGUpOworCisJYm9vbCBydW5Gcm9tT3V0cHV0cyhPcGVyYXRvciAqIG9wLCBjb25zdCBCRkNvZGUgJiBhQ29kZSk7CisKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vLy8vIHRoZSBSRVNVTUUgc3RhdGVtZW50CisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJYm9vbCByZXN1bWUoRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsIEFQRXhlY3V0aW9uRGF0YSAmIGFuRUQpOworCisJaW5saW5lIGJvb2wgZGVjb2RlX3Jlc3VtZSgpCisJeworCQlyZXR1cm4oIFBSSU1JVElWRV9QUk9DRVNTT1IuZGVjb2RlX3Jlc3VtZSgqdGhpcykgKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLyB0aGUgUkVTVE9SRSBDT05URVhUCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCWlubGluZSB2b2lkIHJlc3RvcmVDb250ZXh0KGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQpCisJeworCQlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGE6Oml0ZXJhdG9yIGl0RUQgPSBvdXRFRFMuYmVnaW4oKTsKKwkJTGlzdE9mQVBFeGVjdXRpb25EYXRhOjppdGVyYXRvciBlbmRFRCA9IG91dEVEUy5lbmQoKTsKKwkJZm9yKCA7IGl0RUQgIT0gZW5kRUQgOyArK2l0RUQgKQorCQl7CisJCQkoKml0RUQpLT5tUklEID0gYVJJRDsKKwkJfQorCX0KKworCisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJdmlydHVhbCB2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQ0FDSEUgTUFOQUdFUgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJc3RydWN0IF9FWEVDX0VOVl8KKwl7CisJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQkvLyBJTlBVVHMKKwkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCUF2bVByaW1pdGl2ZVByb2Nlc3NvciAqIFBSSU1JVElWRV9QUk9DRVNTT1I7CisKKwkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAqIGluRUM7CisKKwkJQkYgaW5GT1JNOworCisJCUJGQ29kZSBpbkNPREU7CisKKwkJQVBFeGVjdXRpb25EYXRhIGluRUQ7CisKKworCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkJLy8gQVJHUyBFTlYKKwkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkJQVJHU19FTlYgKiBhcmc7CisKKworCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkJLy8gT1VUUFVUcworCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkJTGlzdE9mQVBFeGVjdXRpb25EYXRhIG91dEVEUzsKKworCisJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQkvLyBTWU5DIEV4ZWN1dGlvbiBEYXRhCisJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGEgc3luY0VEUzsKKworCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkJLy8gSU5URVJSVVBUIFJFUVVFU1QgRXhlY3V0aW9uIERhdGEKKwkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCUxpc3RPZkFQRXhlY3V0aW9uRGF0YSBpcnFFRFM7CisKKwkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCS8vIElOVEVSUlVQVCBSRVFVRVNUIEV4ZWN1dGlvbiBEYXRhCisJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGEgZXhpdEVEUzsKKworCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkJLy8gRkFJTEVEIEV4ZWN1dGlvbiBEYXRhCisJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJCUxpc3RPZkFQRXhlY3V0aW9uRGF0YSBmYWlsdXJlRURTOworCisJfTsKKworCS8qKgorCSAqIENBQ0hFCisJICovCisJc3RhdGljIExpc3Q8IF9FWEVDX0VOVl8gKiA+ICBFWEVDX0VOVl9DQUNIRTsKKworCXN0YXRpYyB2b2lkIGluaXRFTlZTKCk7CisKKwlzdGF0aWMgdm9pZCBmaW5hbGl6ZUVOVlMoKTsKKworCisJaW5saW5lIHN0YXRpYyBfRVhFQ19FTlZfICogbmV3RU5WKCk7CisKKwlpbmxpbmUgc3RhdGljIHZvaWQgZnJlZUVOVihfRVhFQ19FTlZfICogJiBleGVjX2Vudik7CisKKworfTsKKworCisKKworCisKKworfQorCisjZW5kaWYgLyogRVhFQ1VUSU9ORU5WSVJPTk1FTlRfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL1BhdGhDb25kaXRpb25Qcm9jZXNzb3IuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvUGF0aENvbmRpdGlvblByb2Nlc3Nvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA2NjI1YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL1BhdGhDb25kaXRpb25Qcm9jZXNzb3IuY3BwCkBAIC0wLDAgKzEsNjE1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjEganVpbiAyMDEwCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJQYXRoQ29uZGl0aW9uUHJvY2Vzc29yLmgiCisKKyNpbmNsdWRlIDxjb21tb24vQkYuaD4KKworI2luY2x1ZGUgPGNvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1QcmltaXRpdmVQcm9jZXNzb3IuaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0F2bUNvZGUuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uU2ltcGxpZmllci5oPgorCisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yTWFuYWdlci5oPgorCisjaW5jbHVkZSA8c29sdmVyL2FwaS9Tb2x2ZXJGYWN0b3J5Lmg+CisKKworCituYW1lc3BhY2Ugc2VwCit7CisKKy8qCisgKiBBVFRSSUJVVEUKKyAqLworLy8gdHJ1ZTo+IFV0aWxpc2UgbGVzIFNBVC1TT0xWRVIgcG91ciBjaGVja2VyIGxlcyBjb25kaXRpb25zCitib29sIFBhdGhDb25kaXRpb25Qcm9jZXNzb3I6OmNoZWNrUGF0aGNvbmRTYXQgPSBmYWxzZTsKKworLy8gZmFsc2U6PiBQYXMgZGUgc2VwYXJhdGlvbiBzdXIgbGVzIE9SIGRhbnMgbGVzIFBDcworYm9vbCBQYXRoQ29uZGl0aW9uUHJvY2Vzc29yOjpzZXBhcmF0aW9uT2ZQY0Rpc2p1bmN0aW9uID0gZmFsc2U7CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gQ0hFQ0sgU0FUSVNGSUFCSUxJVFkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgUGF0aENvbmRpdGlvblByb2Nlc3Nvcjo6aXNXZWFrU2F0aXNmaWFibGUoY29uc3QgQkYgJiBhQ29uZGl0aW9uKQoreworCXJldHVybiggU29sdmVyRmFjdG9yeTo6aXNXZWFrU2F0aXNmaWFibGUoYUNvbmRpdGlvbiwKKwkJCVBhdGhDb25kaXRpb25Qcm9jZXNzb3I6OmNoZWNrUGF0aGNvbmRTYXQpICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLyBGSVJFRCBDT05ESVRJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIFBhdGhDb25kaXRpb25Qcm9jZXNzb3I6OnNldE5vZGVDb25kaXRpb24oCisJCUFQRXhlY3V0aW9uRGF0YSAmIGFwRUQsIGNvbnN0IEJGICYgdGhlQ29uZGl0aW9uKQoreworCWFwRUQubWFrZVdyaXRhYmxlKCk7CisKKy8vCVJ1bnRpbWVGb3JtICogYVJGID0gYXBFRC5tYWtlV3JpdGFibGVSdW50aW1lRm9ybSggYXBFRC0+bVJJRCApOworCisJYXBFRC0+c2V0Tm9kZUNvbmRpdGlvbiggdGhlQ29uZGl0aW9uICk7CisKKy8vCWFSRi0+c2V0Tm9kZUNvbmRpdGlvbiggdGhlQ29uZGl0aW9uICk7CisKK0FWTV9JRl9ERUJVR19GTEFHKCBURVNUX0RFQ0lTSU9OICkKKwlBVk1fT1NfVFJBQ0UgPDwgREVGQVVMVF9XUkFQX0RBVEEgPDwgIlNFVCBGSVJFRCBDT05ESVRJT04gOiIKKwkJCTw8IHN0cl9pbmRlbnQoIHRoZUNvbmRpdGlvbiApIDw8IEVORF9XUkFQX0VPTDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBURVNUX0RFQ0lTSU9OICkKKworCXJldHVybiggdHJ1ZSApOworfQorCisKK2Jvb2wgUGF0aENvbmRpdGlvblByb2Nlc3Nvcjo6YWRkTm9kZUNvbmRpdGlvbigKKwkJQVBFeGVjdXRpb25EYXRhICYgYXBFRCwgY29uc3QgQkYgJiB0aGVDb25kaXRpb24pCit7CitBVk1fSUZfREVCVUdfRkxBRyggVEVTVF9ERUNJU0lPTiApCisJQVZNX09TX1RSQUNFIDw8IERFRkFVTFRfV1JBUF9EQVRBIDw8ICJBREQgRklSRUQgQ09ORElUSU9OIDpiZWdpbj4iCisJCQk8PCBzdHJfaW5kZW50KCB0aGVDb25kaXRpb24gKSA8PCAiIHdpdGggRkM6IgorCQkJPDwgc3RyX2luZGVudCggYXBFRC0+Z2V0Tm9kZUNvbmRpdGlvbigpICkgPDwgRU5EX1dSQVBfRU9MOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFRFU1RfREVDSVNJT04gKQorCisJaWYoIHRoZUNvbmRpdGlvbi5pc0VxdWFsVHJ1ZSgpICkKKwl7CisJCS8vISEhIE5PVEhJTkcKKwl9CisJZWxzZSBpZiggdGhlQ29uZGl0aW9uLmlzRXF1YWxGYWxzZSgpIHx8CisJCQlhcEVELT5nZXROb2RlQ29uZGl0aW9uKCkuaXNFcXVhbEZhbHNlKCkgKQorCXsKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKwllbHNlCisJeworCQlhcEVELm1ha2VXcml0YWJsZSgpOworCisvLwkJUnVudGltZUZvcm0gKiBhUkYgPSBhcEVELm1ha2VXcml0YWJsZVJ1bnRpbWVGb3JtKCBhcEVELT5tUklEICk7CisKKwkJaWYoIGFwRUQtPmdldE5vZGVDb25kaXRpb24oKS5pc0VxdWFsVHJ1ZSgpICkKKwkJeworLy8JCQlhUkYtPnNldE5vZGVDb25kaXRpb24oIHRoZUNvbmRpdGlvbiApOworCisJCQlhcEVELT5zZXROb2RlQ29uZGl0aW9uKCB0aGVDb25kaXRpb24gKTsKKworCQl9CisJCWVsc2UKKwkJeworLy8JCQlhUkYtPnNldE5vZGVDb25kaXRpb24oCisvLwkJCQkJRXhwcmVzc2lvblNpbXBsaWZpZXI6OnNpbXBsaWZfYW5kKAorLy8JCQkJCQkJYVJGLT5nZXROb2RlQ29uZGl0aW9uKCksIHRoZUNvbmRpdGlvbikgKTsKKworCQkJYXBFRC0+c2V0Tm9kZUNvbmRpdGlvbigKKwkJCQkJRXhwcmVzc2lvblNpbXBsaWZpZXI6OnNpbXBsaWZfYW5kKAorCQkJCQkJCWFwRUQtPmdldE5vZGVDb25kaXRpb24oKSwgdGhlQ29uZGl0aW9uKSApOworCQl9CisJfQorCitBVk1fSUZfREVCVUdfRkxBRyggVEVTVF9ERUNJU0lPTiApCisJQVZNX09TX1RSQUNFIDw8IERFRkFVTFRfV1JBUF9EQVRBIDw8ICJBREQgRklSRUQgQ09ORElUSU9OIDplbmQ+IgorCQkJPDwgc3RyX2luZGVudCggYXBFRC0+Z2V0Tm9kZUNvbmRpdGlvbigpICkgPDwgRU5EX1dSQVBfRU9MOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFRFU1RfREVDSVNJT04gKQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLyBGSVJFRCBUSU1FRCBDT05ESVRJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIFBhdGhDb25kaXRpb25Qcm9jZXNzb3I6OnNldE5vZGVUaW1lZENvbmRpdGlvbigKKwkJQVBFeGVjdXRpb25EYXRhICYgYXBFRCwgY29uc3QgQkYgJiB0aGVUaW1lZENvbmRpdGlvbikKK3sKKwlhcEVELm1ha2VXcml0YWJsZSgpOworCisvLwlSdW50aW1lRm9ybSAqIGFSRiA9IGFwRUQubWFrZVdyaXRhYmxlUnVudGltZUZvcm0oIGFwRUQtPm1SSUQgKTsKKworCWFwRUQtPnNldE5vZGVUaW1lZENvbmRpdGlvbiggdGhlVGltZWRDb25kaXRpb24gKTsKKworLy8JYVJGLT5zZXROb2RlVGltZWRDb25kaXRpb24oIHRoZVRpbWVkQ29uZGl0aW9uICk7CisKK0FWTV9JRl9ERUJVR19GTEFHKCBURVNUX0RFQ0lTSU9OICkKKwlBVk1fT1NfVFJBQ0UgPDwgREVGQVVMVF9XUkFQX0RBVEEgPDwgIlNFVCBGSVJFRCBUSU1FRCBDT05ESVRJT04gOiIKKwkJCTw8IHN0cl9pbmRlbnQoIHRoZVRpbWVkQ29uZGl0aW9uICkgPDwgRU5EX1dSQVBfRU9MOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFRFU1RfREVDSVNJT04gKQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworYm9vbCBQYXRoQ29uZGl0aW9uUHJvY2Vzc29yOjphZGROb2RlVGltZWRDb25kaXRpb24oCisJCUFQRXhlY3V0aW9uRGF0YSAmIGFwRUQsIGNvbnN0IEJGICYgdGhlVGltZWRDb25kaXRpb24pCit7CitBVk1fSUZfREVCVUdfRkxBRyggVEVTVF9ERUNJU0lPTiApCisJQVZNX09TX1RSQUNFIDw8IERFRkFVTFRfV1JBUF9EQVRBIDw8ICJBREQgRklSRUQgVElNRUQgQ09ORElUSU9OIDpiZWdpbj4iCisJCQk8PCBzdHJfaW5kZW50KCB0aGVUaW1lZENvbmRpdGlvbiApIDw8ICIgd2l0aCBGdEM6IgorCQkJPDwgc3RyX2luZGVudCggYXBFRC0+Z2V0Tm9kZVRpbWVkQ29uZGl0aW9uKCkgKSA8PCBFTkRfV1JBUF9FT0w7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggVEVTVF9ERUNJU0lPTiApCisKKwlpZiggdGhlVGltZWRDb25kaXRpb24uaXNFcXVhbFRydWUoKSApCisJeworCQkvLyEhISBOT1RISU5HCisJfQorCWVsc2UgaWYoIHRoZVRpbWVkQ29uZGl0aW9uLmlzRXF1YWxGYWxzZSgpIHx8CisJCQlhcEVELT5nZXROb2RlVGltZWRDb25kaXRpb24oKS5pc0VxdWFsRmFsc2UoKSApCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCWVsc2UKKwl7CisJCWFwRUQubWFrZVdyaXRhYmxlKCk7CisKKy8vCQlSdW50aW1lRm9ybSAqIGFSRiA9IGFwRUQubWFrZVdyaXRhYmxlUnVudGltZUZvcm0oIGFwRUQtPm1SSUQgKTsKKworCQlpZiggYXBFRC0+Z2V0Tm9kZUNvbmRpdGlvbigpLmlzRXF1YWxUcnVlKCkgKQorCQl7CisvLwkJCWFSRi0+c2V0Tm9kZVRpbWVkQ29uZGl0aW9uKCB0aGVUaW1lZENvbmRpdGlvbiApOworCisJCQlhcEVELT5zZXROb2RlVGltZWRDb25kaXRpb24oIHRoZVRpbWVkQ29uZGl0aW9uICk7CisKKwkJfQorCQllbHNlCisJCXsKKy8vCQkJYVJGLT5zZXROb2RlVGltZWRDb25kaXRpb24oCisvLwkJCQkJRXhwcmVzc2lvblNpbXBsaWZpZXI6OnNpbXBsaWZfYW5kKAorLy8JCQkJCQkJYVJGLT5nZXROb2RlVGltZWRDb25kaXRpb24oKSwgdGhlVGltZWRDb25kaXRpb24pICk7CisKKwkJCWFwRUQtPnNldE5vZGVUaW1lZENvbmRpdGlvbigKKwkJCQkJRXhwcmVzc2lvblNpbXBsaWZpZXI6OnNpbXBsaWZfYW5kKAorCQkJCQkJCWFwRUQtPmdldE5vZGVDb25kaXRpb24oKSwgdGhlVGltZWRDb25kaXRpb24pICk7CisJCX0KKwl9CisKK0FWTV9JRl9ERUJVR19GTEFHKCBURVNUX0RFQ0lTSU9OICkKKwlBVk1fT1NfVFJBQ0UgPDwgREVGQVVMVF9XUkFQX0RBVEEgPDwgIkFERCBGSVJFRCBUSU1FRCBDT05ESVRJT04gOmVuZD4iCisJCQk8PCBzdHJfaW5kZW50KCBhcEVELT5nZXROb2RlVGltZWRDb25kaXRpb24oKSApIDw8IEVORF9XUkFQX0VPTDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBURVNUX0RFQ0lTSU9OICkKKworCXJldHVybiggdHJ1ZSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gUEFUSCBDT05ESVRJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIFBhdGhDb25kaXRpb25Qcm9jZXNzb3I6OmFkZFBhdGhDb25kaXRpb24oQVBFeGVjdXRpb25EYXRhICYgYXBFRCwKKwkJY29uc3QgQkYgJiB0aGVDb25kaXRpb24sIGJvb2wgY29uc2lkZXJGaXJlZENvbmRpdG9uKQoreworQVZNX0lGX0RFQlVHX0ZMQUcoIFRFU1RfREVDSVNJT04gKQorCUFWTV9PU19UUkFDRSA8PCBERUZBVUxUX1dSQVBfREFUQSA8PCAiQUREIFBBVEggQ09ORElUSU9OIDpiZWdpbj4iCisJCQk8PCBzdHJfaW5kZW50KCB0aGVDb25kaXRpb24gKSA8PCAiIHdpdGggUEM6IgorCQkJPDwgc3RyX2luZGVudCggYXBFRC0+Z2V0UGF0aENvbmRpdGlvbigpICkgPDwgRU5EX1dSQVBfRU9MOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFRFU1RfREVDSVNJT04gKQorCisKKwlpZiggdGhlQ29uZGl0aW9uLmlzRXF1YWxGYWxzZSgpIHx8IGFwRUQtPmdldFBhdGhDb25kaXRpb24oKS5pc0VxdWFsRmFsc2UoKSApCisJeworQVZNX0lGX0RFQlVHX0ZMQUcoIFRFU1RfREVDSVNJT04gKQorCUFWTV9PU19UUkFDRSA8PCAiQUREIFBBVEggQ09ORElUSU9OIDplbmQ+IGZhbHNlIiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggVEVTVF9ERUNJU0lPTiApCisKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCWVsc2UgaWYoIG5vdCB0aGVDb25kaXRpb24uaXNFcXVhbFRydWUoKSApCisJeworCQlCRiB0aGVQYXRoQ29uZGl0aW9uID0gKCBhcEVELT5nZXRQYXRoQ29uZGl0aW9uKCkuaXNFcXVhbFRydWUoKSApID8KKwkJCQl0aGVDb25kaXRpb24gOiBFeHByZXNzaW9uU2ltcGxpZmllcjo6c2ltcGxpZl9hbmQoCisJCQkJCQlhcEVELT5nZXRQYXRoQ29uZGl0aW9uKCksIHRoZUNvbmRpdGlvbik7CisKK0FWTV9JRl9ERUJVR19GTEFHKCBURVNUX0RFQ0lTSU9OICkKKwlBVk1fT1NfVFJBQ0UgPDwgREVGQVVMVF9XUkFQX0RBVEEgPDwgIkFERCBQQVRIIENPTkRJVElPTiA6aXNTYXQ/PiIKKwkJCTw8IHN0cl9pbmRlbnQoIHRoZVBhdGhDb25kaXRpb24gKSA8PCBFTkRfV1JBUF9FT0w7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggVEVTVF9ERUNJU0lPTiApCisKKwkJaWYoIFBhdGhDb25kaXRpb25Qcm9jZXNzb3I6OmlzV2Vha1NhdGlzZmlhYmxlKHRoZVBhdGhDb25kaXRpb24pICkKKwkJeworCQkJYXBFRC5tYWtlV3JpdGFibGUoKTsKKworCQkJaWYoIGNvbnNpZGVyRmlyZWRDb25kaXRvbiAmJiBhcEVELT5pc0VuYWJsZWROb2RlQ29uZGl0aW9uKCkgKQorCQkJeworCQkJCWlmKCBub3QgYWRkTm9kZUNvbmRpdGlvbihhcEVELCB0aGVDb25kaXRpb24pICkKKwkJCQl7CisJCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCQl9CisJCQl9CisKKwkJCWFwRUQtPnNldFBhdGhDb25kaXRpb24oIHRoZVBhdGhDb25kaXRpb24gKTsKKwkJfQorCQllbHNlCisJCXsKKy8vCQkJYXBFRC0+c2V0UGF0aENvbmRpdGlvbiggRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX0ZBTFNFICk7CisKK0FWTV9JRl9ERUJVR19GTEFHKCBURVNUX0RFQ0lTSU9OICkKKwlBVk1fT1NfVFJBQ0UgPDwgIkFERCBQQVRIIENPTkRJVElPTiA6ZW5kPiBmYWxzZSIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFRFU1RfREVDSVNJT04gKQorCisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKwl9CisKK0FWTV9JRl9ERUJVR19GTEFHKCBURVNUX0RFQ0lTSU9OICkKKwlBVk1fT1NfVFJBQ0UgPDwgREVGQVVMVF9XUkFQX0RBVEEgPDwgIkFERCBQQVRIIENPTkRJVElPTiA6ZW5kPiIKKwkJCTw8IHN0cl9pbmRlbnQoIGFwRUQtPmdldFBhdGhDb25kaXRpb24oKSApIDw8IEVORF9XUkFQX0VPTDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBURVNUX0RFQ0lTSU9OICkKKworCXJldHVybiggdHJ1ZSApOworfQorCisKK2Jvb2wgUGF0aENvbmRpdGlvblByb2Nlc3Nvcjo6YXBwZW5kUGF0aENvbmRpdGlvbigKKwkJQVBFeGVjdXRpb25EYXRhICYgYXBFRCwgQkYgJiB0aGVDb25kaXRpb24sCisJCUNvbGxlY3Rpb25PZkFQRXhlY3V0aW9uRGF0YSAmIGxpc3RPZk91dHB1dEVEKQoreworQVZNX0lGX0RFQlVHX0ZMQUcoIFRFU1RfREVDSVNJT04gKQorCUFWTV9PU19UUkFDRSA8PCBERUZBVUxUX1dSQVBfREFUQSA8PCAiQVBQRU5EIFBBVEggQ09ORElUSU9OIDpiZWdpbj4iCisJCQk8PCBzdHJfaW5kZW50KCB0aGVDb25kaXRpb24gKSA8PCAiIHdpdGggUEM6IgorCQkJPDwgc3RyX2luZGVudCggYXBFRC0+Z2V0UGF0aENvbmRpdGlvbigpICkgPDwgRU5EX1dSQVBfRU9MOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFRFU1RfREVDSVNJT04gKQorCisKKwlpZiggdGhlQ29uZGl0aW9uLmlzRXF1YWxGYWxzZSgpIHx8IGFwRUQtPmdldFBhdGhDb25kaXRpb24oKS5pc0VxdWFsRmFsc2UoKSApCisJeworQVZNX0lGX0RFQlVHX0ZMQUcoIFRFU1RfREVDSVNJT04gKQorCUFWTV9PU19UUkFDRSA8PCAiQVBQRU5EIFBBVEggQ09ORElUSU9OIDogZmFsc2UiIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBURVNUX0RFQ0lTSU9OICkKKworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJZWxzZSBpZiggdGhlQ29uZGl0aW9uLmlzRXF1YWxUcnVlKCkgKQorCXsKKwkJbGlzdE9mT3V0cHV0RUQuYXBwZW5kKCBhcEVEICk7CisKK0FWTV9JRl9ERUJVR19GTEFHKCBURVNUX0RFQ0lTSU9OICkKKwlBVk1fT1NfVFJBQ0UgPDwgREVGQVVMVF9XUkFQX0RBVEEgPDwgIkFQUEVORCBQQVRIIENPTkRJVElPTiA6ZW5kPiIKKwkJCTw8IHN0cl9pbmRlbnQoIGFwRUQtPmdldFBhdGhDb25kaXRpb24oKSApIDw8IEVORF9XUkFQX0VPTDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBURVNUX0RFQ0lTSU9OICkKKworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKwllbHNlIGlmKCBQYXRoQ29uZGl0aW9uUHJvY2Vzc29yOjpzZXBhcmF0aW9uT2ZQY0Rpc2p1bmN0aW9uICYmCisJCQl0aGVDb25kaXRpb24uaXM8IEF2bUNvZGUgPigpICYmCisJCQl0aGVDb25kaXRpb24udG9fcHRyPCBBdm1Db2RlID4oKS0+aXNPcENvZGUoIEFWTV9PUENPREVfT1IgKSApCisJeworCQlBUEV4ZWN1dGlvbkRhdGEgbmV3RUQ7CisJCWF2bV9zaXplX3QgY291bnQgPSAwOworCisJCUF2bUNvZGU6Oml0ZXJhdG9yIGl0RW5kID0gdGhlQ29uZGl0aW9uLnRvX3B0cjwgQXZtQ29kZSA+KCktPmVuZCgpOworCQlBdm1Db2RlOjppdGVyYXRvciBpdCA9IHRoZUNvbmRpdGlvbi50b19wdHI8IEF2bUNvZGUgPigpLT5iZWdpbigpOworCisJCWlmKCBhcEVELT5nZXRQYXRoQ29uZGl0aW9uKCkuaXNFcXVhbFRydWUoKSApCisJCXsKKwkJCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQorCQkJeworCQkJCW5ld0VEID0gYXBFRDsKKwkJCQluZXdFRC5tYWtlV3JpdGFibGUoKTsKKworCQkJCWlmKCBzZXRDb25kaXRpb24obmV3RUQsICgqaXQpLCAoKml0KSkgKQorCQkJCXsKKwkJCQkJbGlzdE9mT3V0cHV0RUQuYXBwZW5kKCBuZXdFRCApOworCQkJCQkrK2NvdW50OworCQkJCX0KKwkJCX0KKwkJfQorCisJCWVsc2UKKwkJeworCQkJQkYgdGhlUGF0aENvbmRpdGlvbjsKKworCQkJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApCisJCQl7CisJCQkJbmV3RUQgPSBhcEVEOworCQkJCW5ld0VELm1ha2VXcml0YWJsZSgpOworCisJCQkJdGhlUGF0aENvbmRpdGlvbiA9IEV4cHJlc3Npb25TaW1wbGlmaWVyOjpzaW1wbGlmX2FuZCgKKwkJCQkJCW5ld0VELT5nZXRQYXRoQ29uZGl0aW9uKCksICgqaXQpKTsKKwkJCQlpZiggc2V0Q29uZGl0aW9uKG5ld0VELCAoKml0KSwgdGhlUGF0aENvbmRpdGlvbikgKQorCQkJCXsKKwkJCQkJbGlzdE9mT3V0cHV0RUQuYXBwZW5kKCBuZXdFRCApOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiggY291bnQgPiAwICk7CisJfQorCWVsc2UKKwl7CisJCUJGIHRoZVBhdGhDb25kaXRpb247CisJCWlmKCBhcEVELT5nZXRQYXRoQ29uZGl0aW9uKCkuaXNFcXVhbFRydWUoKSApCisJCXsKKwkJCXRoZVBhdGhDb25kaXRpb24gPSB0aGVDb25kaXRpb247CisJCX0KKwkJZWxzZQorCQl7CisJCQl0aGVQYXRoQ29uZGl0aW9uID0gRXhwcmVzc2lvblNpbXBsaWZpZXI6OnNpbXBsaWZfYW5kKAorCQkJCQlhcEVELT5nZXRQYXRoQ29uZGl0aW9uKCksIHRoZUNvbmRpdGlvbik7CisJCX0KKworCQlpZiggc2V0Q29uZGl0aW9uKGFwRUQsIHRoZUNvbmRpdGlvbiwgdGhlUGF0aENvbmRpdGlvbikgKQorCQl7CisJCQlsaXN0T2ZPdXRwdXRFRC5hcHBlbmQoIGFwRUQgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorfQorCisKK2Jvb2wgUGF0aENvbmRpdGlvblByb2Nlc3Nvcjo6c2V0Q29uZGl0aW9uKAorCQlBUEV4ZWN1dGlvbkRhdGEgJiBhcEVELCBjb25zdCBCRiAmIHRoZU5vZGVDb25kaXRpb24sCisJCWNvbnN0IEJGICYgdGhlUGF0aENvbmRpdGlvbiwgYm9vbCBjb25zaWRlckZpcmVkQ29uZGl0b24pCit7CisJLy8gVmVyaWZpY2F0aW9uIGRlIGxhIHNhdGlzZmlhYmlsaXRlIGRlcyBnYXJkZXMKKwkvLyBjb21wdGUgdGVudSBkdSBwYXJhbWV0cmFnZSBkYW5zIGZhdm0KKwlpZiggUGF0aENvbmRpdGlvblByb2Nlc3Nvcjo6aXNXZWFrU2F0aXNmaWFibGUodGhlUGF0aENvbmRpdGlvbikgKQorCXsKKwkJYXBFRC5tYWtlV3JpdGFibGUoKTsKKworCQlpZiggY29uc2lkZXJGaXJlZENvbmRpdG9uICYmIGFwRUQtPmlzRW5hYmxlZE5vZGVDb25kaXRpb24oKSApCisJCXsKKwkJCWlmKCBub3QgYWRkTm9kZUNvbmRpdGlvbihhcEVELCB0aGVOb2RlQ29uZGl0aW9uKSApCisJCQl7CisJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJfQorCQl9CisKKwkJYXBFRC0+c2V0UGF0aENvbmRpdGlvbiggdGhlUGF0aENvbmRpdGlvbiApOworCitBVk1fSUZfREVCVUdfRkxBRyggVEVTVF9ERUNJU0lPTiApCisJQVZNX09TX1RSQUNFIDw8IERFRkFVTFRfV1JBUF9EQVRBIDw8ICJTRVQgUEFUSCBDT05ESVRJT04gOmVuZD4iCisJCQk8PCBzdHJfaW5kZW50KCB0aGVQYXRoQ29uZGl0aW9uICkgPDwgRU5EX1dSQVBfRU9MOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFRFU1RfREVDSVNJT04gKQorCisJCXJldHVybiggdHJ1ZSApOworCX0KKwllbHNlCisJeworQVZNX0lGX0RFQlVHX0ZMQUcoIFRFU1RfREVDSVNJT04gKQorCUFWTV9PU19UUkFDRSA8PCAiU0VUIFBBVEggQ09ORElUSU9OIDplbmQ+IGZhbHNlIiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggVEVTVF9ERUNJU0lPTiApCisKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vIFRJTUVEIENPTkRJVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgUGF0aENvbmRpdGlvblByb2Nlc3Nvcjo6YWRkUGF0aFRpbWVkQ29uZGl0aW9uKAorCQlBUEV4ZWN1dGlvbkRhdGEgJiBhcEVELCBjb25zdCBCRiAmIHRoZVRpbWVkQ29uZGl0aW9uKQoreworQVZNX0lGX0RFQlVHX0ZMQUcoIFRFU1RfREVDSVNJT04gKQorCUFWTV9PU19UUkFDRSA8PCBERUZBVUxUX1dSQVBfREFUQSA8PCAiQVBQRU5EIFBBVEggVElNRUQgQ09ORElUSU9OIDpiZWdpbj4iCisJCQk8PCBzdHJfaW5kZW50KCB0aGVUaW1lZENvbmRpdGlvbiApIDw8ICIgd2l0aCBQQzogIgorCQkJPDwgc3RyX2luZGVudCggYXBFRC0+Z2V0UGF0aFRpbWVkQ29uZGl0aW9uKCkgKSA8PCBFTkRfV1JBUF9FT0w7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggVEVTVF9ERUNJU0lPTiApCisKKworCWlmKCB0aGVUaW1lZENvbmRpdGlvbi5pc0VxdWFsRmFsc2UoKSB8fAorCQlhcEVELT5nZXRQYXRoVGltZWRDb25kaXRpb24oKS5pc0VxdWFsRmFsc2UoKSApCisJeworQVZNX0lGX0RFQlVHX0ZMQUcoIFRFU1RfREVDSVNJT04gKQorCUFWTV9PU19UUkFDRSA8PCAiQVBQRU5EIFBBVEggVElNRUQgQ09ORElUSU9OIDplbmQ+IGZhbHNlIiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggVEVTVF9ERUNJU0lPTiApCisKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCWVsc2UgaWYoIG5vdCB0aGVUaW1lZENvbmRpdGlvbi5pc0VxdWFsVHJ1ZSgpICkKKwl7CisJCWFwRUQubWFrZVdyaXRhYmxlKCk7CisKKwkJaWYoIGFwRUQtPmlzRW5hYmxlZE5vZGVDb25kaXRpb24oKSApCisJCXsKKwkJCWlmKCBub3QgYWRkTm9kZVRpbWVkQ29uZGl0aW9uKGFwRUQsIHRoZVRpbWVkQ29uZGl0aW9uKSApCisJCQl7CisJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJfQorCQl9CisKKwkJaWYoIGFwRUQtPmdldFBhdGhUaW1lZENvbmRpdGlvbigpLmlzRXF1YWxUcnVlKCkgKQorCQl7CisJCQlhcEVELT5zZXRQYXRoVGltZWRDb25kaXRpb24oIHRoZVRpbWVkQ29uZGl0aW9uICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlhcEVELT5zZXRQYXRoVGltZWRDb25kaXRpb24oIEV4cHJlc3Npb25TaW1wbGlmaWVyOjpzaW1wbGlmX2FuZCgKKwkJCQkJYXBFRC0+Z2V0UGF0aFRpbWVkQ29uZGl0aW9uKCksIHRoZVRpbWVkQ29uZGl0aW9uKSApOworCQl9CisKK0FWTV9JRl9ERUJVR19GTEFHKCBURVNUX0RFQ0lTSU9OICkKKwlBVk1fT1NfVFJBQ0UgPDwgREVGQVVMVF9XUkFQX0RBVEEgPDwgIkFQUEVORCBQQVRIIFRJTUVEIENPTkRJVElPTiA6ZW5kPiIKKwkJCTw8IHN0cl9pbmRlbnQoIGFwRUQtPmdldFBhdGhUaW1lZENvbmRpdGlvbigpICkgPDwgRU5EX1dSQVBfRU9MOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFRFU1RfREVDSVNJT04gKQorCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKK2Jvb2wgUGF0aENvbmRpdGlvblByb2Nlc3Nvcjo6YXBwZW5kUGF0aFRpbWVkQ29uZGl0aW9uKAorCQlBUEV4ZWN1dGlvbkRhdGEgJiBhcEVELCBCRiAmIHRoZVRpbWVkQ29uZGl0aW9uLAorCQlDb2xsZWN0aW9uT2ZBUEV4ZWN1dGlvbkRhdGEgJiBsaXN0T2ZPdXRwdXRFRCkKK3sKKwlpZiggdGhlVGltZWRDb25kaXRpb24uaXNFcXVhbEZhbHNlKCkgfHwKKwkJCWFwRUQtPmdldFBhdGhUaW1lZENvbmRpdGlvbigpLmlzRXF1YWxGYWxzZSgpICkKKwl7CitBVk1fSUZfREVCVUdfRkxBRyggVEVTVF9ERUNJU0lPTiApCisJQVZNX09TX1RSQUNFIDw8ICJBUFBFTkQgUEFUSCBUSU1FRCBDT05ESVRJT04gOiBmYWxzZSIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFRFU1RfREVDSVNJT04gKQorCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwllbHNlIGlmKCB0aGVUaW1lZENvbmRpdGlvbi5pc0VxdWFsVHJ1ZSgpICkKKwl7CisJCWxpc3RPZk91dHB1dEVELmFwcGVuZCggYXBFRCApOworCitBVk1fSUZfREVCVUdfRkxBRyggVEVTVF9ERUNJU0lPTiApCisJQVZNX09TX1RSQUNFIDw8IERFRkFVTFRfV1JBUF9EQVRBIDw8ICJBUFBFTkQgUEFUSCBUSU1FRCBDT05ESVRJT04gOiIKKwkJCTw8IHN0cl9pbmRlbnQoIGFwRUQtPmdldFBhdGhUaW1lZENvbmRpdGlvbigpICkgPDwgRU5EX1dSQVBfRU9MOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFRFU1RfREVDSVNJT04gKQorCisJCXJldHVybiggdHJ1ZSApOworCX0KKworCWVsc2UgaWYoIFBhdGhDb25kaXRpb25Qcm9jZXNzb3I6OnNlcGFyYXRpb25PZlBjRGlzanVuY3Rpb24gJiYKKwkJCXRoZVRpbWVkQ29uZGl0aW9uLmlzPCBBdm1Db2RlID4oKSAmJgorCQkJdGhlVGltZWRDb25kaXRpb24udG9fcHRyPCBBdm1Db2RlID4oKS0+aXNPcENvZGUoIEFWTV9PUENPREVfT1IgKSApCisJeworCQlBUEV4ZWN1dGlvbkRhdGEgbmV3RUQ7CisJCWF2bV9zaXplX3QgY291bnQgPSAwOworCisJCUF2bUNvZGU6Oml0ZXJhdG9yIGl0RW5kID0gdGhlVGltZWRDb25kaXRpb24udG9fcHRyPCBBdm1Db2RlID4oKS0+ZW5kKCk7CisJCUF2bUNvZGU6Oml0ZXJhdG9yIGl0ID0gdGhlVGltZWRDb25kaXRpb24udG9fcHRyPCBBdm1Db2RlID4oKS0+YmVnaW4oKTsKKworCQlpZiggYXBFRC0+Z2V0UGF0aFRpbWVkQ29uZGl0aW9uKCkuaXNFcXVhbFRydWUoKSApCisJCXsKKwkJCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQorCQkJeworCQkJCW5ld0VEID0gYXBFRDsKKwkJCQluZXdFRC5tYWtlV3JpdGFibGUoKTsKKworCQkJCWlmKCBzZXRUaW1lZENvbmRpdGlvbihuZXdFRCwgKCppdCksICgqaXQpKSApCisJCQkJeworCQkJCQlsaXN0T2ZPdXRwdXRFRC5hcHBlbmQoIG5ld0VEICk7CisJCQkJCSsrY291bnQ7CisJCQkJfQorCQkJfQorCQl9CisKKwkJZWxzZQorCQl7CisJCQlCRiB0aGVQYXRoVGltZWRDb25kaXRpb247CisKKwkJCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQorCQkJeworCQkJCW5ld0VEID0gYXBFRDsKKwkJCQluZXdFRC5tYWtlV3JpdGFibGUoKTsKKworCQkJCXRoZVBhdGhUaW1lZENvbmRpdGlvbiA9IEV4cHJlc3Npb25TaW1wbGlmaWVyOjpzaW1wbGlmX2FuZCgKKwkJCQkJCW5ld0VELT5nZXRQYXRoVGltZWRDb25kaXRpb24oKSwgKCppdCkpOworCQkJCWlmKCBzZXRUaW1lZENvbmRpdGlvbihuZXdFRCwgKCppdCksIHRoZVBhdGhUaW1lZENvbmRpdGlvbikgKQorCQkJCXsKKwkJCQkJbGlzdE9mT3V0cHV0RUQuYXBwZW5kKCBuZXdFRCApOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiggY291bnQgPiAwICk7CisJfQorCWVsc2UKKwl7CisJCUJGIHRoZVBhdGhUaW1lZENvbmRpdGlvbjsKKwkJaWYoIGFwRUQtPmdldFBhdGhUaW1lZENvbmRpdGlvbigpLmlzRXF1YWxUcnVlKCkgKQorCQl7CisJCQl0aGVQYXRoVGltZWRDb25kaXRpb24gPSB0aGVUaW1lZENvbmRpdGlvbjsKKwkJfQorCQllbHNlCisJCXsKKwkJCXRoZVBhdGhUaW1lZENvbmRpdGlvbiA9IEV4cHJlc3Npb25TaW1wbGlmaWVyOjpzaW1wbGlmX2FuZCgKKwkJCQkJYXBFRC0+Z2V0UGF0aFRpbWVkQ29uZGl0aW9uKCksIHRoZVRpbWVkQ29uZGl0aW9uKTsKKwkJfQorCisJCWlmKCBzZXRUaW1lZENvbmRpdGlvbihhcEVELCB0aGVUaW1lZENvbmRpdGlvbiwgdGhlUGF0aFRpbWVkQ29uZGl0aW9uKSApCisJCXsKKwkJCWxpc3RPZk91dHB1dEVELmFwcGVuZCggYXBFRCApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCXJldHVybiggZmFsc2UgKTsKKwl9Cit9CisKKworYm9vbCBQYXRoQ29uZGl0aW9uUHJvY2Vzc29yOjpzZXRUaW1lZENvbmRpdGlvbihBUEV4ZWN1dGlvbkRhdGEgJiBhcEVELAorCQljb25zdCBCRiAmIHRoZU5vZGVUaW1lZENvbmRpdGlvbiwgY29uc3QgQkYgJiB0aGVQYXRoVGltZWRDb25kaXRpb24pCit7CisJLy8gVmVyaWZpY2F0aW9uIGRlIGxhIHNhdGlzZmlhYmlsaXRlIGRlcyBnYXJkZXMKKwkvLyBjb21wdGUgdGVudSBkdSBwYXJhbWV0cmFnZSBkYW5zIGZhdm0KKwlpZiggUGF0aENvbmRpdGlvblByb2Nlc3Nvcjo6aXNXZWFrU2F0aXNmaWFibGUoCisJCQlhcEVELT5hbmRQYXRoVGltZWRDb25kaXRpb24odGhlUGF0aFRpbWVkQ29uZGl0aW9uKSkgKQorCXsKKwkJYXBFRC5tYWtlV3JpdGFibGUoKTsKKworCQlpZiggYXBFRC0+aXNFbmFibGVkTm9kZUNvbmRpdGlvbigpICkKKwkJeworCQkJaWYoIG5vdCBhZGROb2RlVGltZWRDb25kaXRpb24oYXBFRCwgdGhlTm9kZVRpbWVkQ29uZGl0aW9uKSApCisJCQl7CisJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJfQorCQl9CisKKwkJYXBFRC0+c2V0UGF0aFRpbWVkQ29uZGl0aW9uKCB0aGVQYXRoVGltZWRDb25kaXRpb24gKTsKKworQVZNX0lGX0RFQlVHX0ZMQUcoIFRFU1RfREVDSVNJT04gKQorCUFWTV9PU19UUkFDRSA8PCBERUZBVUxUX1dSQVBfREFUQSA8PCAiU0VUIFBBVEggVElNRUQgQ09ORElUSU9OIDoiCisJCQk8PCBzdHJfaW5kZW50KCB0aGVQYXRoVGltZWRDb25kaXRpb24gKSA8PCBFTkRfV1JBUF9FT0w7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggVEVTVF9ERUNJU0lPTiApCisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCWVsc2UKKwl7CitBVk1fSUZfREVCVUdfRkxBRyggVEVTVF9ERUNJU0lPTiApCisJQVZNX09TX1RSQUNFIDw8ICJTRVQgUEFUSCBUSU1FRCBDT05ESVRJT04gOmVuZD4gZmFsc2UiIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBURVNUX0RFQ0lTSU9OICkKKworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorfQorCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL1BhdGhDb25kaXRpb25Qcm9jZXNzb3IuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL1BhdGhDb25kaXRpb25Qcm9jZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWYzNWNlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvUGF0aENvbmRpdGlvblByb2Nlc3Nvci5oCkBAIC0wLDAgKzEsMTI3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjEganVpbiAyMDEwCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgUEFUSENPTkRJVElPTlBST0NFU1NPUl9IXworI2RlZmluZSBQQVRIQ09ORElUSU9OUFJPQ0VTU09SX0hfCisKKyNpbmNsdWRlIDxjb21wdXRlci9FeGVjdXRpb25FbnZpcm9ubWVudC5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uRGF0YS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjbGFzcyBCRjsKK2NsYXNzIEV4ZWN1dGlvbkVudmlyb25tZW50OworCitjbGFzcyBQYXRoQ29uZGl0aW9uUHJvY2Vzc29yCit7CisKK3B1YmxpYzoKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLyBDSEVDSyBTQVRJU0ZJQUJJTElUWQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwlzdGF0aWMgYm9vbCBpc1dlYWtTYXRpc2ZpYWJsZShjb25zdCBCRiAmIGFDb25kaXRpb24pOworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vLy8vIEZJUkVEIFRJTUVEIENPTkRJVElPTgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXN0YXRpYyBib29sIHNldE5vZGVDb25kaXRpb24oQVBFeGVjdXRpb25EYXRhICYgYXBFRCwKKwkJCWNvbnN0IEJGICYgdGhlQ29uZGl0aW9uKTsKKwlzdGF0aWMgYm9vbCBhZGROb2RlQ29uZGl0aW9uKEFQRXhlY3V0aW9uRGF0YSAmIGFwRUQsCisJCQljb25zdCBCRiAmIHRoZUNvbmRpdGlvbik7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLyBGSVJFRCBUSU1FRCBDT05ESVRJT04KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlzdGF0aWMgYm9vbCBzZXROb2RlVGltZWRDb25kaXRpb24oQVBFeGVjdXRpb25EYXRhICYgYXBFRCwKKwkJCWNvbnN0IEJGICYgdGhlVGltZWRDb25kaXRpb24pOworCXN0YXRpYyBib29sIGFkZE5vZGVUaW1lZENvbmRpdGlvbihBUEV4ZWN1dGlvbkRhdGEgJiBhcEVELAorCQkJY29uc3QgQkYgJiB0aGVUaW1lZENvbmRpdGlvbik7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLyBQQVRIIENPTkRJVElPTgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXN0YXRpYyBib29sIGFkZFBhdGhDb25kaXRpb24oQVBFeGVjdXRpb25EYXRhICYgYXBFRCwKKwkJCWNvbnN0IEJGICYgdGhlQ29uZGl0aW9uLCBib29sIGNvbnNpZGVyRmlyZWRDb25kaXRvbiA9IHRydWUpOworCisKKwlzdGF0aWMgYm9vbCBhcHBlbmRQYXRoQ29uZGl0aW9uKEFQRXhlY3V0aW9uRGF0YSAmIGFwRUQsIEJGICYgdGhlQ29uZGl0aW9uLAorCQkJQ29sbGVjdGlvbk9mQVBFeGVjdXRpb25EYXRhICYgbGlzdE9mT3V0cHV0RUQpOworCisJaW5saW5lIHN0YXRpYyBib29sIGFwcGVuZFBhdGhDb25kaXRpb24oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsCisJCQlBUEV4ZWN1dGlvbkRhdGEgJiBhcEVELCBCRiAmIHRoZUNvbmRpdGlvbikKKwl7CisJCXJldHVybiggYXBwZW5kUGF0aENvbmRpdGlvbihhcEVELCB0aGVDb25kaXRpb24sIEVOVi5vdXRFRFMpICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBib29sIGFwcGVuZFBhdGhDb25kaXRpb24oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCisJeworCQlyZXR1cm4oIGFwcGVuZFBhdGhDb25kaXRpb24oRU5WLmluRUQsIEVOVi5pbkZPUk0sIEVOVi5vdXRFRFMpICk7CisJfQorCisKKwlzdGF0aWMgYm9vbCBzZXRDb25kaXRpb24oCisJCQlBUEV4ZWN1dGlvbkRhdGEgJiBhcEVELCBjb25zdCBCRiAmIHRoZU5vZGVDb25kaXRpb24sCisJCQljb25zdCBCRiAmIHRoZVBhdGhDb25kaXRpb24sIGJvb2wgY29uc2lkZXJGaXJlZENvbmRpdG9uID0gdHJ1ZSk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gUEFUSCBUSU1FRCBDT05ESVRJT04KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlzdGF0aWMgYm9vbCBhZGRQYXRoVGltZWRDb25kaXRpb24oQVBFeGVjdXRpb25EYXRhICYgYXBFRCwKKwkJCWNvbnN0IEJGICYgdGhlVGltZWRDb25kaXRpb24pOworCisJaW5saW5lIHN0YXRpYyBib29sIGFwcGVuZFBhdGhUaW1lZENvbmRpdGlvbihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOViwKKwkJCUFQRXhlY3V0aW9uRGF0YSAmIGFwRUQsIEJGICYgdGhlVGltZWRDb25kaXRpb24pCisJeworCQlyZXR1cm4oIGFwcGVuZFBhdGhUaW1lZENvbmRpdGlvbihhcEVELAorCQkJCXRoZVRpbWVkQ29uZGl0aW9uLCBFTlYub3V0RURTKSApOworCX0KKworCXN0YXRpYyBib29sIGFwcGVuZFBhdGhUaW1lZENvbmRpdGlvbihBUEV4ZWN1dGlvbkRhdGEgJiBhcEVELAorCQkJQkYgJiB0aGVUaW1lZENvbmRpdGlvbiwKKwkJCUNvbGxlY3Rpb25PZkFQRXhlY3V0aW9uRGF0YSAmIGxpc3RPZk91dHB1dEVEKTsKKworCXN0YXRpYyBib29sIHNldFRpbWVkQ29uZGl0aW9uKEFQRXhlY3V0aW9uRGF0YSAmIGFwRUQsCisJCQljb25zdCBCRiAmIHRoZU5vZGVUaW1lZENvbmRpdGlvbiwKKwkJCWNvbnN0IEJGICYgdGhlUGF0aFRpbWVkQ29uZGl0aW9uKTsKKworCisKK3B1YmxpYzoKKwkvKgorCSAqIEFUVFJJQlVURQorCSAqLworCXN0YXRpYyBib29sIGNoZWNrUGF0aGNvbmRTYXQ7CisJc3RhdGljIGJvb2wgc2VwYXJhdGlvbk9mUGNEaXNqdW5jdGlvbjsKKworCisKK307CisKKworfQorCisjZW5kaWYgLyogUEFUSENPTkRJVElPTlBST0NFU1NPUl9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvaW5zdHJ1Y3Rpb24vQXZtQnl0ZWNvZGUuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvaW5zdHJ1Y3Rpb24vQXZtQnl0ZWNvZGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZDliODQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9pbnN0cnVjdGlvbi9Bdm1CeXRlY29kZS5jcHAKQEAgLTAsMCArMSw0OTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxIG1hcnMgMjAxMworICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQXZtQnl0ZWNvZGUuaCIKKworI2luY2x1ZGUgPGNvbW1vbi9CRi5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZUxpYi5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZEYXRhLmg+CisKKyNpbmNsdWRlIDxmbWwvdHlwZS9CYXNlVHlwZVNwZWNpZmllci5oPgorI2luY2x1ZGUgPGZtbC90eXBlL1R5cGVNYW5hZ2VyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK0F2bUJ5dGVjb2RlIEF2bUJ5dGVjb2RlOjpBUkdfVU5ERUZJTkVEX0NPREUoCisJCS8qY29udGV4dCAgKi8gQVZNX0FSR19VTkRFRklORURfQ09OVEVYVCwKKwkJLypwcm9jZXNzb3IqLyBBVk1fQVJHX1VOREVGSU5FRF9QUk9DRVNTT1IsCisJCS8qb3BlcmF0aW9uKi8gQVZNX0FSR19VTkRFRklORURfT1BFUkFUSU9OLAorCQkvKm9wZXJhbmQgICovIEFWTV9BUkdfVU5ERUZJTkVEX09QRVJBTkQsCisJCS8qZHR5cGUgICAgKi8gTlVMTCk7CisKKworQXZtQnl0ZWNvZGUgQXZtQnl0ZWNvZGU6OkFSR19OT1BTX0NPREUoQVZNX0FSR19OT1BTKTsKKworQXZtQnl0ZWNvZGUgQXZtQnl0ZWNvZGU6OkFSR19TRVZBTF9DT0RFKEFWTV9BUkdfU0VWQUwpOworCitBdm1CeXRlY29kZSBBdm1CeXRlY29kZTo6QVJHX01FVkFMX0NPREUoQVZNX0FSR19NRVZBTCk7CisKKworLyoqCisgKiBDT05TVFJVQ1RPUgorICogRGVmYXVsdAorICovCitBdm1CeXRlY29kZTo6QXZtQnl0ZWNvZGUoCisJCWF2bV9hcmdfY29udGV4dF90IGFDb250ZXh0LCBhdm1fYXJnX3Byb2Nlc3Nvcl90IGFQcm9jZXNzb3IsCisJCWF2bV9hcmdfb3BlcmF0aW9uX3QgYW5PcGVyYXRpb24sIGF2bV9hcmdfb3BlcmFuZF90IGFuT3BlcmFuZCwKKwkJQmFzZVR5cGVTcGVjaWZpZXIgKiBhVHlwZSkKKzogY29udGV4dCggYUNvbnRleHQgKSwKK3Byb2Nlc3NvciggYVByb2Nlc3NvciApLAorbnVtZXJpYyggZmFsc2UgKSwKK29wZXJhdGlvbiggYW5PcGVyYXRpb24gKSwKK29wZXJhbmQoIGFuT3BlcmFuZCApLAorb2Zmc2V0KCBBVk1fTlVNRVJJQ19NQVhfU0laRV9UICksCitkdHlwZSggYVR5cGUgKSwKKworcm91dGluZV9kZWNvZGVfZXZhbCggTlVMTCApLAorcm91dGluZV9ldmFsKCBOVUxMICksCityb3V0aW5lX2RlY29kZV9ydW4oIE5VTEwgKSwKK3JvdXRpbmVfcnVuKCBOVUxMICkKK3sKKwkvLyEhICBOT1RISU5HCit9CisKK0F2bUJ5dGVjb2RlOjpBdm1CeXRlY29kZSgKKwkJYXZtX2FyZ19jb250ZXh0X3QgYUNvbnRleHQsIGF2bV9hcmdfcHJvY2Vzc29yX3QgYVByb2Nlc3NvciwKKwkJYXZtX2FyZ19vcGVyYXRpb25fdCBhbk9wZXJhdGlvbiwgYXZtX2FyZ19vcGVyYW5kX3QgYW5PcGVyYW5kKQorOiBjb250ZXh0KCBhQ29udGV4dCApLAorcHJvY2Vzc29yKCBhUHJvY2Vzc29yICksCitudW1lcmljKCBmYWxzZSApLAorb3BlcmF0aW9uKCBhbk9wZXJhdGlvbiApLAorb3BlcmFuZCggYW5PcGVyYW5kICksCitvZmZzZXQoIEFWTV9OVU1FUklDX01BWF9TSVpFX1QgKSwKK2R0eXBlKCBUeXBlTWFuYWdlcjo6VU5JVkVSU0FMICksCisKK3JvdXRpbmVfZGVjb2RlX2V2YWwoIE5VTEwgKSwKK3JvdXRpbmVfZXZhbCggTlVMTCApLAorcm91dGluZV9kZWNvZGVfcnVuKCBOVUxMICksCityb3V0aW5lX3J1biggTlVMTCApCit7CisJLy8hISAgTk9USElORworfQorCitBdm1CeXRlY29kZTo6QXZtQnl0ZWNvZGUoIGF2bV9hcmdfY29udGV4dF90IGFDb250ZXh0LAorCQlhdm1fYXJnX29wZXJhdGlvbl90IGFuT3BlcmF0aW9uLCBhdm1fYXJnX29wZXJhbmRfdCBhbk9wZXJhbmQpCis6IGNvbnRleHQoIGFDb250ZXh0ICksCitwcm9jZXNzb3IoIEFWTV9BUkdfVU5ERUZJTkVEX1BST0NFU1NPUiApLAorbnVtZXJpYyggZmFsc2UgKSwKK29wZXJhdGlvbiggYW5PcGVyYXRpb24gKSwKK29wZXJhbmQoIGFuT3BlcmFuZCApLAorb2Zmc2V0KCBBVk1fTlVNRVJJQ19NQVhfU0laRV9UICksCitkdHlwZSggVHlwZU1hbmFnZXI6OlVOSVZFUlNBTCApLAorCityb3V0aW5lX2RlY29kZV9ldmFsKCBOVUxMICksCityb3V0aW5lX2V2YWwoIE5VTEwgKSwKK3JvdXRpbmVfZGVjb2RlX3J1biggTlVMTCApLAorcm91dGluZV9ydW4oIE5VTEwgKQoreworCS8vISEgIE5PVEhJTkcKK30KKworQXZtQnl0ZWNvZGU6OkF2bUJ5dGVjb2RlKAorCQlhdm1fYXJnX29wZXJhdGlvbl90IGFuT3BlcmF0aW9uLCBhdm1fYXJnX29wZXJhbmRfdCBhbk9wZXJhbmQpCis6IGNvbnRleHQoIEFWTV9BUkdfU1RBTkRBUkRfQ1RYICksCitwcm9jZXNzb3IoIEFWTV9BUkdfVU5ERUZJTkVEX1BST0NFU1NPUiApLAorbnVtZXJpYyggZmFsc2UgKSwKK29wZXJhdGlvbiggYW5PcGVyYXRpb24gKSwKK29wZXJhbmQoIGFuT3BlcmFuZCApLAorb2Zmc2V0KCBBVk1fTlVNRVJJQ19NQVhfU0laRV9UICksCitkdHlwZSggVHlwZU1hbmFnZXI6OlVOSVZFUlNBTCApLAorCityb3V0aW5lX2RlY29kZV9ldmFsKCBOVUxMICksCityb3V0aW5lX2V2YWwoIE5VTEwgKSwKK3JvdXRpbmVfZGVjb2RlX3J1biggTlVMTCApLAorcm91dGluZV9ydW4oIE5VTEwgKQoreworCS8vISEgIE5PVEhJTkcKK30KKworCisvKioKKyAqIGR0eXBlCisgKi8KK2Jvb2wgQXZtQnl0ZWNvZGU6Omhhc1R5cGUoKSBjb25zdAoreworCXJldHVybiggKGR0eXBlICE9IE5VTEwpICYmIChkdHlwZSAhPSBUeXBlTWFuYWdlcjo6VU5JVkVSU0FMKSApOworfQorCisKKy8qKgorICogU2VyaWFsaXphdGlvbgorICovCitzdGQ6OnN0cmluZyBBdm1CeXRlY29kZTo6c3RyQ29udGV4dChhdm1fYXJnX2NvbnRleHRfdCBjb250ZXh0KQoreworCXN3aXRjaCggY29udGV4dCApCisJeworCQljYXNlIEFWTV9BUkdfU1RBTkRBUkRfQ1RYOgorCQl7CisJCQlyZXR1cm4oICJzdGQiICk7CisJCX0KKworCQljYXNlIEFWTV9BUkdfQVJHVU1FTlRfQ1RYOgorCQl7CisJCQlyZXR1cm4oICJhcmciICk7CisJCX0KKworCQljYXNlIEFWTV9BUkdfUEFSQU1FVEVSX0NUWDoKKwkJeworCQkJcmV0dXJuKCAicGFyYW0iICk7CisJCX0KKworCQljYXNlIEFWTV9BUkdfUkVUVVJOX0NUWDoKKwkJeworCQkJcmV0dXJuKCAicmV0IiApOworCQl9CisKKwkJY2FzZSBBVk1fQVJHX1VOREVGSU5FRF9DT05URVhUOgorCQlkZWZhdWx0OgorCQl7CisJCQlyZXR1cm4oICI/Y3R4IiApOworCQl9CisJfQorfQorCisKK3N0ZDo6c3RyaW5nIEF2bUJ5dGVjb2RlOjpzdHJQcm9jZXNzb3IoYXZtX2FyZ19wcm9jZXNzb3JfdCBwcm9jZXNzb3IpCit7CisJc3dpdGNoKCBwcm9jZXNzb3IgKQorCXsKKwkJY2FzZSBBVk1fQVJHX05PUF9DUFU6CisJCXsKKwkJCXJldHVybiggIm5vcCIgKTsKKwkJfQorCQljYXNlIEFWTV9BUkdfTk9QU19DUFU6CisJCXsKKwkJCXJldHVybiggIm5vcHMiICk7CisJCX0KKworCQljYXNlIEFWTV9BUkdfTUVNT1JZX0xWQUxVRV9DUFU6CisJCXsKKwkJCXJldHVybiggImRtYTpsdiIgKTsKKwkJfQorCQljYXNlIEFWTV9BUkdfTUVNT1JZX1dWQUxVRV9DUFU6CisJCXsKKwkJCXJldHVybiggImRtYTp3diIgKTsKKwkJfQorCQljYXNlIEFWTV9BUkdfTUVNT1JZX1JWQUxVRV9DUFU6CisJCXsKKwkJCXJldHVybiggImRtYTpydiIgKTsKKwkJfQorCQljYXNlIEFWTV9BUkdfTUVNT1JZX01BQ0hJTkVfQ1BVOgorCQl7CisJCQlyZXR1cm4oICJkbWE6cmlkIiApOworCQl9CisKKwkJY2FzZSBBVk1fQVJHX0FSSVRITUVUSUNfTE9HSUNfQ1BVOgorCQl7CisJCQlyZXR1cm4oICJhbHUiICk7CisJCX0KKworCQljYXNlIEFWTV9BUkdfQ0hBUkFDVEVSX0NQVToKKwkJeworCQkJcmV0dXJuKCAiY2hhciIgKTsKKwkJfQorCQljYXNlIEFWTV9BUkdfU1RSSU5HX0NQVToKKwkJeworCQkJcmV0dXJuKCAic3RyaW5nIiApOworCQl9CisKKwkJY2FzZSBBVk1fQVJHX0FSUkFZX0xWQUxVRV9DUFU6CisJCXsKKwkJCXJldHVybiggImFycmF5Omx2IiApOworCQl9CisJCWNhc2UgQVZNX0FSR19BUlJBWV9SVkFMVUVfQ1BVOgorCQl7CisJCQlyZXR1cm4oICJhcnJheTpydiIgKTsKKwkJfQorCisJCWNhc2UgQVZNX0FSR19WRUNUT1JfQ1BVOgorCQl7CisJCQlyZXR1cm4oICJ2ZWN0b3IiICk7CisJCX0KKworCQljYXNlIEFWTV9BUkdfUVVFVUVfQ1BVOgorCQl7CisJCQlyZXR1cm4oICJxdWV1ZSIgKTsKKwkJfQorCQljYXNlIEFWTV9BUkdfTElTVF9DUFU6CisJCXsKKwkJCXJldHVybiggImxpc3QiICk7CisJCX0KKwkJY2FzZSBBVk1fQVJHX0NPTExFQ1RJT05fQ1BVOgorCQl7CisJCQlyZXR1cm4oICJjb2xsZWN0aW9uIiApOworCQl9CisKKwkJY2FzZSBBVk1fQVJHX0JVRkZFUl9DUFU6CisJCXsKKwkJCXJldHVybiggImJ1ZmZlciIgKTsKKwkJfQorCisJCWNhc2UgQVZNX0FSR19TVEFURU1FTlRfQ1BVOgorCQl7CisJCQlyZXR1cm4oICJzdG0iICk7CisJCX0KKworCQljYXNlIEFWTV9BUkdfVU5ERUZJTkVEX1BST0NFU1NPUjoKKwkJZGVmYXVsdDoKKwkJeworCQkJcmV0dXJuKCAiP3Byb2Nlc3NvciIgKTsKKwkJfQorCX0KK30KKworCitzdGQ6OnN0cmluZyBBdm1CeXRlY29kZTo6c3RyTm9wQ29kZShhdm1fYXJnX29wZXJhdGlvbl90IG9wZXJhdGlvbikKK3sKKwlzd2l0Y2goIG9wZXJhdGlvbiAmIEFWTV9BUkdfT1BFUkFUSU9OX05PUF9NQVNLICkKKwl7CisJCWNhc2UgQVZNX0FSR19OT1A6CisJCXsKKwkJCXJldHVybiggIm5vcCIgKTsKKwkJfQorCQljYXNlIEFWTV9BUkdfTk9QUzoKKwkJeworCQkJcmV0dXJuKCAibm9wcyIgKTsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCXJldHVybiggIiIgKTsKKwkJfQorCX0KK30KKworc3RkOjpzdHJpbmcgQXZtQnl0ZWNvZGU6OnN0ckV2YWxDb2RlKGF2bV9hcmdfb3BlcmF0aW9uX3Qgb3BlcmF0aW9uKQoreworCXN3aXRjaCggb3BlcmF0aW9uICYgQVZNX0FSR19PUEVSQVRJT05fRVZBTF9NQVNLICkKKwl7CisJCWNhc2UgQVZNX0FSR19TRVZBTDoKKwkJeworCQkJcmV0dXJuKCAic2V2YWwiICk7CisJCX0KKworCQljYXNlIEFWTV9BUkdfTUVWQUw6CisJCXsKKwkJCXJldHVybiggIm1ldmFsIiApOworCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJcmV0dXJuKCAiIiApOworCQl9CisJfQorfQorCisKK3N0ZDo6c3RyaW5nIEF2bUJ5dGVjb2RlOjpzdHJWYWx1ZUNvZGUoYXZtX2FyZ19vcGVyYXRpb25fdCBvcGVyYXRpb24pCit7CisJc3dpdGNoKCBvcGVyYXRpb24gJiBBVk1fQVJHX09QRVJBVElPTl9WQUxVRV9NQVNLICkKKwl7CisJCWNhc2UgQVZNX0FSR19SVkFMVUU6CisJCXsKKwkJCXJldHVybiggInJ2YWx1ZSIgKTsKKwkJfQorCQljYXNlIEFWTV9BUkdfTFZBTFVFOgorCQl7CisJCQlyZXR1cm4oICJsdmFsdWUiICk7CisJCX0KKwkJY2FzZSBBVk1fQVJHX1dWQUxVRToKKwkJeworCQkJcmV0dXJuKCAid3ZhbHVlIiApOworCQl9CisKKwkJY2FzZSBBVk1fQVJHX1ZBTFVFOgorCQl7CisJCQlyZXR1cm4oICJ2YWx1ZSIgKTsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCXJldHVybiggIj92YWx1ZSIgKTsKKwkJfQorCX0KK30KKworCitzdGQ6OnN0cmluZyBBdm1CeXRlY29kZTo6c3RyT3BlcmFuZChhdm1fYXJnX29wZXJhbmRfdCBvcGVyYW5kKQoreworCXN3aXRjaCggb3BlcmFuZCApCisJeworCQljYXNlIEFWTV9BUkdfREFUQV9LSU5EOgorCQl7CisJCQlyZXR1cm4oICJkYXRhIiApOworCQl9CisJCWNhc2UgQVZNX0FSR19EQVRBX0NTVF9LSU5EOgorCQl7CisJCQlyZXR1cm4oICJjb25zdCIgKTsKKwkJfQorCQljYXNlIEFWTV9BUkdfREFUQV9SRUZfS0lORDoKKwkJeworCQkJcmV0dXJuKCAicmVmIiApOworCQl9CisJCWNhc2UgQVZNX0FSR19EQVRBX01BQ1JPX0tJTkQ6CisJCXsKKwkJCXJldHVybiggIm1hY3JvIiApOworCQl9CisJCWNhc2UgQVZNX0FSR19EQVRBX1VGSV9LSU5EOgorCQl7CisJCQlyZXR1cm4oICJ1ZmkiICk7CisJCX0KKworCQljYXNlIEFWTV9BUkdfUE9SVF9LSU5EOgorCQl7CisJCQlyZXR1cm4oICJwb3J0IiApOworCQl9CisJCWNhc2UgQVZNX0FSR19CVUZGRVJfS0lORDoKKwkJeworCQkJcmV0dXJuKCAiYnVmZmVyIiApOworCQl9CisJCWNhc2UgQVZNX0FSR19DT05ORUNUT1JfS0lORDoKKwkJeworCQkJcmV0dXJuKCAiY29ubmVjdG9yIiApOworCQl9CisKKwkJY2FzZSBBVk1fQVJHX0JVSUxUSU5fS0lORDoKKwkJeworCQkJcmV0dXJuKCAiYnVpbHRpbiIgKTsKKwkJfQorCQljYXNlIEFWTV9BUkdfQlVJTFRJTl9BUlJBWV9LSU5EOgorCQl7CisJCQlyZXR1cm4oICJidWlsdCNhcnJheSIgKTsKKwkJfQorCQljYXNlIEFWTV9BUkdfQlVJTFRJTl9DT05UQUlORVJfS0lORDoKKwkJeworCQkJcmV0dXJuKCAiYnVpbHQjY29sbGVjdGlvbiIgKTsKKwkJfQorCisJCWNhc2UgQVZNX0FSR19CT09MRUFOX0tJTkQ6CisJCXsKKwkJCXJldHVybiggImJvb2xlYW4iICk7CisJCX0KKwkJY2FzZSBBVk1fQVJHX0lOVEVHRVJfS0lORDoKKwkJeworCQkJcmV0dXJuKCAiaW50ZWdlciIgKTsKKwkJfQorCQljYXNlIEFWTV9BUkdfUkFUSU9OQUxfS0lORDoKKwkJeworCQkJcmV0dXJuKCAicmF0aW9uYWwiICk7CisJCX0KKwkJY2FzZSBBVk1fQVJHX0ZMT0FUX0tJTkQ6CisJCXsKKwkJCXJldHVybiggImZsb2F0IiApOworCQl9CisJCWNhc2UgQVZNX0FSR19DSEFSQUNURVJfS0lORDoKKwkJeworCQkJcmV0dXJuKCAiY2hhciIgKTsKKwkJfQorCQljYXNlIEFWTV9BUkdfU1RSSU5HX0tJTkQ6CisJCXsKKwkJCXJldHVybiggInN0cmluZyIgKTsKKwkJfQorCisJCWNhc2UgQVZNX0FSR19PUEVSQVRPUl9LSU5EOgorCQl7CisJCQlyZXR1cm4oICJvcGVyYXRvciIgKTsKKwkJfQorCisJCWNhc2UgQVZNX0FSR19FWFBSRVNTSU9OX0tJTkQ6CisJCXsKKwkJCXJldHVybiggImV4cHJlc3Npb24iICk7CisJCX0KKwkJY2FzZSBBVk1fQVJHX0FSUkFZX0tJTkQ6CisJCXsKKwkJCXJldHVybiggImFycmF5IiApOworCQl9CisJCWNhc2UgQVZNX0FSR19DT0xMRUNUSU9OX0tJTkQ6CisJCXsKKwkJCXJldHVybiggImNvbGxlY3Rpb24iICk7CisJCX0KKworCQljYXNlIEFWTV9BUkdfU1RBVEVNRU5UX0tJTkQ6CisJCXsKKwkJCXJldHVybiggInN0YXRlbWVudCIgKTsKKwkJfQorCisJCWNhc2UgQVZNX0FSR19DVE9SX1RZUEVfS0lORDoKKwkJeworCQkJcmV0dXJuKCAiY3RvciN0eXBlIiApOworCQl9CisKKworCQljYXNlIEFWTV9BUkdfTUFDSElORV9SSUQ6CisJCXsKKwkJCXJldHVybiggIm1hY2hpbmUjcmlkIiApOworCQl9CisKKwkJY2FzZSBBVk1fQVJHX0VYUFJFU1NJT05fUklEOgorCQl7CisJCQlyZXR1cm4oICJleHByI3JpZCIgKTsKKwkJfQorCisJCWNhc2UgQVZNX0FSR19TRUxGX1JJRDoKKwkJeworCQkJcmV0dXJuKCAic2VsZiNyaWQiICk7CisJCX0KKwkJY2FzZSBBVk1fQVJHX1BBUkVOVF9SSUQ6CisJCXsKKwkJCXJldHVybiggInBhcmVudCNyaWQiICk7CisJCX0KKwkJY2FzZSBBVk1fQVJHX0NPTU1VTklDQVRPUl9SSUQ6CisJCXsKKwkJCXJldHVybiggImNvbSNyaWQiICk7CisJCX0KKwkJY2FzZSBBVk1fQVJHX1NZU1RFTV9SSUQ6CisJCXsKKwkJCXJldHVybiggInN5c3RlbSNyaWQiICk7CisJCX0KKwkJY2FzZSBBVk1fQVJHX0VOVklST05NRU5UX1JJRDoKKwkJeworCQkJcmV0dXJuKCAiZW52I3JpZCIgKTsKKwkJfQorCQljYXNlIEFWTV9BUkdfQ09NUE9ORU5UX1NFTEZfUklEOgorCQl7CisJCQlyZXR1cm4oICJjb21wb25lbnQjc2VsZiNyaWQiICk7CisJCX0KKwkJY2FzZSBBVk1fQVJHX0NPTVBPTkVOVF9QQVJFTlRfUklEOgorCQl7CisJCQlyZXR1cm4oICJjb21wb25lbnQjcGFyZW50I3JpZCIgKTsKKwkJfQorCQljYXNlIEFWTV9BUkdfQ09NUE9ORU5UX0NPTU1VTklDQVRPUl9SSUQ6CisJCXsKKwkJCXJldHVybiggImNvbXBvbmVudCNjb20jcmlkIiApOworCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJcmV0dXJuKCAiP2V4cHJlc3Npb24iICk7CisJCX0KKwl9Cit9CisKKworc3RkOjpzdHJpbmcgQXZtQnl0ZWNvZGU6OnN0clR5cGUoKSBjb25zdAoreworCXJldHVybiggKGR0eXBlICE9IE5VTEwpID8gZHR5cGUtPnN0clQoKSA6ICJudWxsPGR0eXBlPiIgKTsKK30KKworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvaW5zdHJ1Y3Rpb24vQXZtQnl0ZWNvZGUuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL2luc3RydWN0aW9uL0F2bUJ5dGVjb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdmYWM3OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL2luc3RydWN0aW9uL0F2bUJ5dGVjb2RlLmgKQEAgLTAsMCArMSw2MjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxIG1hcnMgMjAxMworICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEFWTUJZVEVDT0RFX0hfCisjZGVmaW5lIEFWTUJZVEVDT0RFX0hfCisKKyNpbmNsdWRlIDxwcmludGVyL091dFN0cmVhbS5oPgorCisjaW5jbHVkZSA8dXRpbC9hdm1fbnVtZXJpYy5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworLyoqCisgKiBFdmFsdWF0aW9uIGNvbnRleHQKKyAqLworZW51bSBBVk1fQVJHX0NPTlRFWFQKK3sKKwlBVk1fQVJHX1VOREVGSU5FRF9DT05URVhUID0gMHgwMDAwLAorCisJQVZNX0FSR19TVEFOREFSRF9DVFgsCisKKwlBVk1fQVJHX0FSR1VNRU5UX0NUWCwKKworCUFWTV9BUkdfUEFSQU1FVEVSX0NUWCwKKworCUFWTV9BUkdfUkVUVVJOX0NUWCwKKworfTsKKworLy90eXBlZGVmIGF2bV91aW50OF90ICAgICAgICAgYXZtX2FyZ19jb250ZXh0X3Q7Cit0eXBlZGVmIEFWTV9BUkdfQ09OVEVYVCAgICAgICBhdm1fYXJnX2NvbnRleHRfdDsKKworCisvKioKKyAqIEV2YWx1YXRpb24gY28tcHJvY2Vzc29yIHVuaXQgKENQVSkKKyAqLworZW51bSBBVk1fQVJHX1BST0NFU1NPUgoreworCUFWTV9BUkdfVU5ERUZJTkVEX1BST0NFU1NPUiA9IDB4MDAwMCwKKworCUFWTV9BUkdfTk9QX0NQVSwKKwlBVk1fQVJHX05PUFNfQ1BVLAorCisJQVZNX0FSR19NRU1PUllfTFZBTFVFX0NQVSwKKwlBVk1fQVJHX01FTU9SWV9XVkFMVUVfQ1BVLAorCUFWTV9BUkdfTUVNT1JZX1JWQUxVRV9DUFUsCisJQVZNX0FSR19NRU1PUllfTUFDSElORV9DUFUsCisKKwlBVk1fQVJHX0FSSVRITUVUSUNfTE9HSUNfQ1BVLAorCisJQVZNX0FSR19DSEFSQUNURVJfQ1BVLAorCisJQVZNX0FSR19TVFJJTkdfQ1BVLAorCisJQVZNX0FSR19BUlJBWV9MVkFMVUVfQ1BVLAorCUFWTV9BUkdfQVJSQVlfUlZBTFVFX0NQVSwKKworCUFWTV9BUkdfVkVDVE9SX0NQVSwKKworCUFWTV9BUkdfUVVFVUVfQ1BVLAorCUFWTV9BUkdfTElTVF9DUFUsCisJQVZNX0FSR19DT0xMRUNUSU9OX0NQVSwKKworCUFWTV9BUkdfQlVGRkVSX0NQVSwKKworCUFWTV9BUkdfU1RBVEVNRU5UX0NQVSwKKworfTsKKworLy90eXBlZGVmIGF2bV91aW50OF90ICAgICAgICAgYXZtX2FyZ19wcm9jZXNzb3JfdDsKK3R5cGVkZWYgQVZNX0FSR19QUk9DRVNTT1IgICAgIGF2bV9hcmdfcHJvY2Vzc29yX3Q7CisKKworLyoqCisgKiBFdmFsdWF0aW9uIG9wZXJhdGlvbgorICovCitlbnVtIEFWTV9BUkdfT1BFUkFUSU9OCit7CisJQVZNX0FSR19VTkRFRklORURfT1BFUkFUSU9OID0gMHgwMDAwLAorCisJLy8gNCBiaXRzIDo+IFBSRUZJWCAgQ09ERQorCS8vIDogMDAwMTpub3AKKwkvLyA6IDAwMTE6bm9wcworCUFWTV9BUkdfTk9QICAgICAgICAgICAgICAgICA9IDB4MDAwMSwKKworCUFWTV9BUkdfTk9QX0FMTCAgICAgICAgICAgICA9IDB4MDAwMiwKKwlBVk1fQVJHX05PUFMgICAgICAgICAgICAgICAgPSBBVk1fQVJHX05PUF9BTEwgfCBBVk1fQVJHX05PUCwKKwkvLyA6IDAxMDA6c3JvdXRpbmVfZXZhbAorCS8vIDogMTAwMDptcm91dGluZV9ldmFsCisJQVZNX0FSR19TRVZBTCAgICAgICAgICAgICAgID0gMHgwMDA0LAorCUFWTV9BUkdfTUVWQUwgICAgICAgICAgICAgICA9IDB4MDAwOCwKKworCS8vIDQgYml0cyA6PiBMUi1WQUxVRSAgQ09ERQorCS8vIHwgMDAwMTpsdmFsdWUKKwkvLyB8IDAwMTA6cnZhbHVlCisJLy8gfCAwMTAwOnd2YWx1ZQorCS8vIHwgMTAwMDpscl92YWx1ZQorCUFWTV9BUkdfTFZBTFVFICAgICAgICAgICAgICA9IDB4MDAxMCwKKwlBVk1fQVJHX1dWQUxVRSAgICAgICAgICAgICAgPSAweDAwMjAsCisJQVZNX0FSR19SVkFMVUUgICAgICAgICAgICAgID0gMHgwMDQwLAorCisJQVZNX0FSR19WQUxVRSAgICAgICAgICAgICAgID0gQVZNX0FSR19MVkFMVUUKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBVk1fQVJHX1dWQUxVRQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFWTV9BUkdfUlZBTFVFLAorCisKKwkvLyBDb21iaW5haXNvbiBbU3xNXUVWQUwgd2l0aCBWQUxVRQorCUFWTV9BUkdfU0VWQUxfTFZBTFVFICAgICAgICA9IEFWTV9BUkdfU0VWQUwgfCBBVk1fQVJHX0xWQUxVRSwKKwlBVk1fQVJHX1NFVkFMX1dWQUxVRSAgICAgICAgPSBBVk1fQVJHX1NFVkFMIHwgQVZNX0FSR19XVkFMVUUsCisJQVZNX0FSR19TRVZBTF9SVkFMVUUgICAgICAgID0gQVZNX0FSR19TRVZBTCB8IEFWTV9BUkdfUlZBTFVFLAorCisJQVZNX0FSR19TRVZBTF9WQUxVRSAgICAgICAgID0gQVZNX0FSR19TRVZBTCB8IEFWTV9BUkdfVkFMVUUsCisKKwlBVk1fQVJHX01FVkFMX0xWQUxVRSAgICAgICAgPSBBVk1fQVJHX01FVkFMIHwgQVZNX0FSR19MVkFMVUUsCisJQVZNX0FSR19NRVZBTF9XVkFMVUUgICAgICAgID0gQVZNX0FSR19NRVZBTCB8IEFWTV9BUkdfV1ZBTFVFLAorCUFWTV9BUkdfTUVWQUxfUlZBTFVFICAgICAgICA9IEFWTV9BUkdfTUVWQUwgfCBBVk1fQVJHX1JWQUxVRSwKKworCUFWTV9BUkdfTUVWQUxfVkFMVUUgICAgICAgICA9IEFWTV9BUkdfTUVWQUwgfCBBVk1fQVJHX1ZBTFVFLAorCisJLy8gQ29tYmluYWlzb24gTk9QIHdpdGggW1N8TV1FVkFMIHdpdGggVkFMVUUKKwlBVk1fQVJHX05PUF9MVkFMVUUgICAgICAgICAgPSBBVk1fQVJHX05PUCAgfCBBVk1fQVJHX0xWQUxVRSwKKwlBVk1fQVJHX05PUF9SVkFMVUUgICAgICAgICAgPSBBVk1fQVJHX05PUCAgfCBBVk1fQVJHX1JWQUxVRSwKKworCUFWTV9BUkdfTk9QX1ZBTFVFICAgICAgICAgICA9IEFWTV9BUkdfTk9QICB8IEFWTV9BUkdfVkFMVUUsCisKKwkvLyBDb21iaW5haXNvbiBOT1BTIHdpdGggW1N8TV1FVkFMIHdpdGggVkFMVUUKKwlBVk1fQVJHX05PUFNfTFZBTFVFICAgICAgICAgPSBBVk1fQVJHX05PUFMgfCBBVk1fQVJHX0xWQUxVRSwKKwlBVk1fQVJHX05PUFNfUlZBTFVFICAgICAgICAgPSBBVk1fQVJHX05PUFMgfCBBVk1fQVJHX1JWQUxVRSwKKworCUFWTV9BUkdfTk9QU19WQUxVRSAgICAgICAgICA9IEFWTV9BUkdfTk9QUyB8IEFWTV9BUkdfVkFMVUUsCisKK307CisKKy8vdHlwZWRlZiBhdm1fdWludDhfdCAgICAgICAgICAgYXZtX2FyZ19vcGVyYXRpb25fdDsKK3R5cGVkZWYgQVZNX0FSR19PUEVSQVRJT04gICAgICAgYXZtX2FyZ19vcGVyYXRpb25fdDsKKworCisjZGVmaW5lIEFWTV9BUkdfT1BFUkFUSU9OX05PUF9NQVNLICAgICAoQVZNX0FSR19OT1AgfCBBVk1fQVJHX05PUFMpCisKKyNkZWZpbmUgSVNfQVJHX09QRVJBVElPTl9OT1Aob3ApICAgICAgIChvcCAmIEFWTV9BUkdfTk9QKQorI2RlZmluZSBJU19BUkdfT1BFUkFUSU9OX05PUFMob3ApICAgICAgKG9wICYgQVZNX0FSR19OT1BfQUxMKQorCisKKyNkZWZpbmUgQVZNX0FSR19PUEVSQVRJT05fRVZBTF9NQVNLICAgIChBVk1fQVJHX1NFVkFMIHwgQVZNX0FSR19NRVZBTCkKKworI2RlZmluZSBJU19BUkdfT1BFUkFUSU9OX0VWQUwob3ApICAgICAgKChvcCAmIEFWTV9BUkdfTk9QKSA9PSAwKQorI2RlZmluZSBJU19BUkdfT1BFUkFUSU9OX1NFVkFMKG9wKSAgICAgKElTX0FSR19PUEVSQVRJT05fRVZBTChvcCkgJiYgKG9wICYgQVZNX0FSR19TRVZBTCkgKQorI2RlZmluZSBJU19BUkdfT1BFUkFUSU9OX01FVkFMKG9wKSAgICAgKElTX0FSR19PUEVSQVRJT05fRVZBTChvcCkgJiYgKG9wICYgQVZNX0FSR19NRVZBTCkgKQorCisKKyNkZWZpbmUgQVZNX0FSR19PUEVSQVRJT05fUFJFRklYX01BU0sgIChBVk1fQVJHX09QRVJBVElPTl9OT1BfTUFTSyB8IEFWTV9BUkdfT1BFUkFUSU9OX0VWQUxfTUFTSykKKworI2RlZmluZSBIQVNfQVJHX09QRVJBVElPTl9QUkVGSVgob3ApICAgKChvcCAmIEFWTV9BUkdfT1BFUkFUSU9OX1BSRUZJWF9NQVNLKSAhPSAwKQorCisKKyNkZWZpbmUgQVZNX0FSR19PUEVSQVRJT05fWF9TRVZBTF9NQVNLIChBVk1fQVJHX1NFVkFMIHwgKH4gQVZNX0FSR19PUEVSQVRJT05fUFJFRklYX01BU0spKQorI2RlZmluZSBBVk1fQVJHX09QRVJBVElPTl9YX01FVkFMX01BU0sgKEFWTV9BUkdfTUVWQUwgfCAofiBBVk1fQVJHX09QRVJBVElPTl9QUkVGSVhfTUFTSykpCisKKworI2RlZmluZSBBVk1fQVJHX09QRVJBVElPTl9WQUxVRV9NQVNLICAgKCBBVk1fQVJHX0xWQUxVRSAgfCBBVk1fQVJHX1dWQUxVRSAgfCBBVk1fQVJHX1JWQUxVRSApCisKKworLyoqCisgKiBFdmFsdWF0aW9uIG9wZXJhbmQKKyAqLworZW51bSBBVk1fQVJHX09QRVJBTkQKK3sKKwlBVk1fQVJHX1VOREVGSU5FRF9PUEVSQU5EID0gMHgwMDAwLAorCisJLy8gNCBiaXQgOj4gYXJndW1lbnQga2luZAorCS8vIHwgMDAwMTpkYXRhCisJLy8gfCAwMDExOmRhdGEjcmVmCisJLy8gfCAwMTAxOmRhdGEjbWFjcm8KKwkvLyB8IDAxMDA6ZXhwcmVzc2lvbgorCS8vIDogMTAwMDpidWlsdGluCisJQVZNX0FSR19EQVRBX0tJTkQsCisJQVZNX0FSR19EQVRBX0NTVF9LSU5ELAorCUFWTV9BUkdfREFUQV9SRUZfS0lORCwKKwlBVk1fQVJHX0RBVEFfTUFDUk9fS0lORCwKKwlBVk1fQVJHX0RBVEFfVUZJX0tJTkQsCisKKwlBVk1fQVJHX1BPUlRfS0lORCwKKwlBVk1fQVJHX0JVRkZFUl9LSU5ELAorCUFWTV9BUkdfQ09OTkVDVE9SX0tJTkQsCisKKwlBVk1fQVJHX0JVSUxUSU5fS0lORCwKKwlBVk1fQVJHX0JVSUxUSU5fQVJSQVlfS0lORCwKKwlBVk1fQVJHX0JVSUxUSU5fQ09OVEFJTkVSX0tJTkQsCisKKwlBVk1fQVJHX0JPT0xFQU5fS0lORCwKKworCUFWTV9BUkdfSU5URUdFUl9LSU5ELAorCUFWTV9BUkdfUkFUSU9OQUxfS0lORCwKKwlBVk1fQVJHX0ZMT0FUX0tJTkQsCisKKwlBVk1fQVJHX0NIQVJBQ1RFUl9LSU5ELAorCUFWTV9BUkdfU1RSSU5HX0tJTkQsCisKKwlBVk1fQVJHX0FSUkFZX0tJTkQsCisJQVZNX0FSR19DT0xMRUNUSU9OX0tJTkQsCisKKwlBVk1fQVJHX01BQ0hJTkVfUklELAorCUFWTV9BUkdfRVhQUkVTU0lPTl9SSUQsCisKKwlBVk1fQVJHX1NFTEZfUklELAorCUFWTV9BUkdfUEFSRU5UX1JJRCwKKwlBVk1fQVJHX0NPTU1VTklDQVRPUl9SSUQsCisJQVZNX0FSR19TWVNURU1fUklELAorCUFWTV9BUkdfRU5WSVJPTk1FTlRfUklELAorCisJQVZNX0FSR19DT01QT05FTlRfU0VMRl9SSUQsCisJQVZNX0FSR19DT01QT05FTlRfUEFSRU5UX1JJRCwKKwlBVk1fQVJHX0NPTVBPTkVOVF9DT01NVU5JQ0FUT1JfUklELAorCisJQVZNX0FSR19PUEVSQVRPUl9LSU5ELAorCisJQVZNX0FSR19FWFBSRVNTSU9OX0tJTkQsCisKKwlBVk1fQVJHX1NUQVRFTUVOVF9LSU5ELAorCisJQVZNX0FSR19DVE9SX1RZUEVfS0lORCwKKworfTsKKworLy90eXBlZGVmIGF2bV91aW50OF90ICAgICAgICAgICBhdm1fYXJnX29wZXJhbmRfdDsKK3R5cGVkZWYgQVZNX0FSR19PUEVSQU5EICAgICAgICAgYXZtX2FyZ19vcGVyYW5kX3Q7CisKKworLyoqCisgKiBBdm0gYnl0ZWNvZGUgZGVmaW5pdGlvbgorICovCisKK2NsYXNzIEFSR1NfRU5WOworY2xhc3MgQXZtQ29kZTsKK2NsYXNzIEJhc2VUeXBlU3BlY2lmaWVyOworY2xhc3MgQkY7CisKKworc3RydWN0IEF2bUJ5dGVjb2RlCit7CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlBdm1CeXRlY29kZShhdm1fYXJnX2NvbnRleHRfdCBhQ29udGV4dCwgYXZtX2FyZ19wcm9jZXNzb3JfdCBhUHJvY2Vzc29yLAorCQkJYXZtX2FyZ19vcGVyYXRpb25fdCBhbk9wZXJhdGlvbiwgYXZtX2FyZ19vcGVyYW5kX3QgYW5PcGVyYW5kLAorCQkJQmFzZVR5cGVTcGVjaWZpZXIgKiBhVHlwZSk7CisKKwlBdm1CeXRlY29kZShhdm1fYXJnX2NvbnRleHRfdCBhQ29udGV4dCwgYXZtX2FyZ19wcm9jZXNzb3JfdCBhUHJvY2Vzc29yLAorCQkJYXZtX2FyZ19vcGVyYXRpb25fdCBhbk9wZXJhdGlvbiA9IEFWTV9BUkdfVU5ERUZJTkVEX09QRVJBVElPTiwKKwkJCWF2bV9hcmdfb3BlcmFuZF90IGFuT3BlcmFuZCA9IEFWTV9BUkdfVU5ERUZJTkVEX09QRVJBTkQpOworCisJQXZtQnl0ZWNvZGUoYXZtX2FyZ19jb250ZXh0X3QgYUNvbnRleHQsCisJCQlhdm1fYXJnX29wZXJhdGlvbl90IGFuT3BlcmF0aW9uID0gQVZNX0FSR19VTkRFRklORURfT1BFUkFUSU9OLAorCQkJYXZtX2FyZ19vcGVyYW5kX3QgYW5PcGVyYW5kID0gQVZNX0FSR19VTkRFRklORURfT1BFUkFORCk7CisKKwlBdm1CeXRlY29kZShhdm1fYXJnX29wZXJhdGlvbl90IGFuT3BlcmF0aW9uID0gQVZNX0FSR19VTkRFRklORURfT1BFUkFUSU9OLAorCQkJYXZtX2FyZ19vcGVyYW5kX3QgYW5PcGVyYW5kID0gQVZNX0FSR19VTkRFRklORURfT1BFUkFORCk7CisKKworLy8JLyoqCisvLwkgKiBDT05TVFJVQ1RPUgorLy8JICogQ29weQorLy8JICovCisvLwlBdm1CeXRlY29kZShjb25zdCBBdm1CeXRlY29kZSAmIGFCeXRlY29kZSkKKy8vCTogY29udGV4dCggYUJ5dGVjb2RlLmNvbnRleHQgKSwKKy8vCXByb2Nlc3NvciggYUJ5dGVjb2RlLnByb2Nlc3NvciApLAorLy8JbnVtZXJpYyggYUJ5dGVjb2RlLm51bWVyaWMgKSwKKy8vCW9wZXJhdGlvbiggYUJ5dGVjb2RlLm9wZXJhdGlvbiApLAorLy8Jb3BlcmFuZCggYUJ5dGVjb2RlLm9wZXJhbmQgKSwKKy8vCW9mZnNldCggYUJ5dGVjb2RlLm9mZnNldCApLAorLy8JZHR5cGUoIGFCeXRlY29kZS5kdHlwZSApLAorLy8KKy8vCXJvdXRpbmVfZGVjb2RlX2V2YWwoIGFCeXRlY29kZS5yb3V0aW5lX2RlY29kZV9ldmFsICksCisvLwlyb3V0aW5lX2V2YWwoIGFCeXRlY29kZS5yb3V0aW5lX2V2YWwgKSwKKy8vCXJvdXRpbmVfZGVjb2RlX3J1biggYUJ5dGVjb2RlLnJvdXRpbmVfZGVjb2RlX3J1biApLAorLy8Jcm91dGluZV9ydW4oIGFCeXRlY29kZS5yb3V0aW5lX3J1biApCisvLwl7CisvLwkJLy8hISBOT1RISU5HCisvLwl9CisKKworCS8qKgorCSAqIG9wZXJhdGlvbgorCSAqIG9wZXJhbmQKKwkgKiByZXN1bHQKKwkgKi8KKwl2b2lkIHNldChhdm1fYXJnX2NvbnRleHRfdCBhQ29udGV4dCwKKwkJCWF2bV9hcmdfcHJvY2Vzc29yX3QgYVByb2Nlc3NvciwgYXZtX2FyZ19vcGVyYXRpb25fdCBhbk9wZXJhdGlvbiwKKwkJCWF2bV9hcmdfb3BlcmFuZF90IGFuT3BlcmFuZCwgQmFzZVR5cGVTcGVjaWZpZXIgKiBhVHlwZSA9IE5VTEwpCisJeworCQljb250ZXh0ICAgPSBhQ29udGV4dDsKKwkJcHJvY2Vzc29yID0gYVByb2Nlc3NvcjsKKwkJb3BlcmF0aW9uID0gYW5PcGVyYXRpb247CisJCW9wZXJhbmQgICA9IGFuT3BlcmFuZDsKKwkJZHR5cGUgICAgID0gYVR5cGU7CisJfQorCisKKwl2b2lkIHNldChhdm1fYXJnX29wZXJhdGlvbl90IGFuT3BlcmF0aW9uLCBhdm1fYXJnX29wZXJhbmRfdCBhbk9wZXJhbmQpCisJeworCQlvcGVyYXRpb24gPSBhbk9wZXJhdGlvbjsKKwkJb3BlcmFuZCAgID0gYW5PcGVyYW5kOworCX0KKworCisJLyoqCisJICogZHR5cGUKKwkgKi8KKwlib29sIGhhc1R5cGUoKSBjb25zdDsKKworCS8qKgorCSAqIE5PUAorCSAqIE5PUFMKKwkgKiBFVkFMUworCSAqLworCWlubGluZSBib29sIGlzTm9wQ3B1KCkgY29uc3QKKwl7CisJCXJldHVybiggKHByb2Nlc3NvciA9PSBBVk1fQVJHX05PUF9DUFUpIHx8CisJCQkJKHByb2Nlc3NvciA9PSBBVk1fQVJHX05PUFNfQ1BVKSApOworCX0KKworCWlubGluZSB2b2lkIHNldE5vcENwdSgKKwkJCWF2bV9hcmdfb3BlcmF0aW9uX3Qgb3BNYXNrID0gQVZNX0FSR19VTkRFRklORURfT1BFUkFUSU9OKQorCXsKKwkJcHJvY2Vzc29yID0gQVZNX0FSR19OT1BfQ1BVOworCisJCW9wZXJhdGlvbiA9IGF2bV9hcmdfb3BlcmF0aW9uX3Qob3BlcmF0aW9uIHwgb3BNYXNrIHwgQVZNX0FSR19OT1ApOworCisJCW9wZXJhdGlvbiA9IGF2bV9hcmdfb3BlcmF0aW9uX3Qob3BlcmF0aW9uICYKKwkJCQkofkFWTV9BUkdfT1BFUkFUSU9OX0VWQUxfTUFTSykpOworCX0KKworCisJaW5saW5lIGJvb2wgaXNOb3BPcGVyYXRpb24oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBJU19BUkdfT1BFUkFUSU9OX05PUChvcGVyYXRpb24pICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0Tm9wT3BlcmF0aW9uKAorCQkJYXZtX2FyZ19vcGVyYXRpb25fdCBvcE1hc2sgPSBBVk1fQVJHX1VOREVGSU5FRF9PUEVSQVRJT04pCisJeworCQlvcGVyYXRpb24gPSBhdm1fYXJnX29wZXJhdGlvbl90KG9wZXJhdGlvbiB8IG9wTWFzayB8IEFWTV9BUkdfTk9QKTsKKworCQlvcGVyYXRpb24gPSBhdm1fYXJnX29wZXJhdGlvbl90KG9wZXJhdGlvbiAmCisJCQkJKH5BVk1fQVJHX09QRVJBVElPTl9FVkFMX01BU0spKTsKKwl9CisKKworCWlubGluZSBib29sIGlzTm9wc09wZXJhdGlvbigpIGNvbnN0CisJeworCQlyZXR1cm4oIElTX0FSR19PUEVSQVRJT05fTk9QUyhvcGVyYXRpb24pICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0Tm9wc09wZXJhdGlvbigKKwkJCWF2bV9hcmdfb3BlcmF0aW9uX3Qgb3BNYXNrID0gQVZNX0FSR19VTkRFRklORURfT1BFUkFUSU9OKQorCXsKKwkJb3BlcmF0aW9uID0gYXZtX2FyZ19vcGVyYXRpb25fdChvcGVyYXRpb24gfCBvcE1hc2sgfCBBVk1fQVJHX05PUFMpOworCisJCW9wZXJhdGlvbiA9IGF2bV9hcmdfb3BlcmF0aW9uX3QoIG9wZXJhdGlvbiAmCisJCQkJKH5BVk1fQVJHX09QRVJBVElPTl9FVkFMX01BU0spKTsKKwl9CisKKwlpbmxpbmUgdm9pZCB1bnNldE5vcHNPcGVyYXRpb24oYXZtX2FyZ19vcGVyYXRpb25fdCBvcE1hc2sgPSBBVk1fQVJHX1NFVkFMKQorCXsKKwkJb3BlcmF0aW9uID0gYXZtX2FyZ19vcGVyYXRpb25fdCggKG9wZXJhdGlvbiB8IG9wTWFzaykgJgorCQkJCSh+IEFWTV9BUkdfT1BFUkFUSU9OX05PUF9NQVNLKSk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBpc0V2YWwoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBJU19BUkdfT1BFUkFUSU9OX0VWQUwob3BlcmF0aW9uKSApOworCX0KKworCWlubGluZSB2b2lkIHVuc2V0RXZhbCgpCisJeworCQlvcGVyYXRpb24gPSBhdm1fYXJnX29wZXJhdGlvbl90KCBvcGVyYXRpb24gJgorCQkJCSh+IEFWTV9BUkdfT1BFUkFUSU9OX0VWQUxfTUFTSykgKTsKKwl9CisKKworCWlubGluZSBib29sIGlzU2V2YWwoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBJU19BUkdfT1BFUkFUSU9OX1NFVkFMKG9wZXJhdGlvbikgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRTZXZhbChhdm1fYXJnX29wZXJhdGlvbl90IG9wTWFzayA9IEFWTV9BUkdfVU5ERUZJTkVEX09QRVJBVElPTikKKwl7CisJCW9wZXJhdGlvbiA9IGF2bV9hcmdfb3BlcmF0aW9uX3Qob3BlcmF0aW9uIHwgb3BNYXNrIHwgQVZNX0FSR19TRVZBTCk7CisJfQorCisJLy8gZVhjbHVzaXZlIFBSRUZJWCBiaXQgc2V0dGluZworCWlubGluZSB2b2lkIHhzZXRTZXZhbChhdm1fYXJnX29wZXJhdGlvbl90IG9wTWFzayA9IEFWTV9BUkdfVU5ERUZJTkVEX09QRVJBVElPTikKKwl7CisJCW9wZXJhdGlvbiA9IGF2bV9hcmdfb3BlcmF0aW9uX3QoIChvcGVyYXRpb24gfCBvcE1hc2spICYKKwkJCQlBVk1fQVJHX09QRVJBVElPTl9YX1NFVkFMX01BU0sgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCB1bnNldFNldmFsKCkKKwl7CisJCW9wZXJhdGlvbiA9IGF2bV9hcmdfb3BlcmF0aW9uX3QoIG9wZXJhdGlvbiAmICh+IEFWTV9BUkdfU0VWQUwpICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBpc01ldmFsKCkgY29uc3QKKwl7CisJCXJldHVybiggSVNfQVJHX09QRVJBVElPTl9NRVZBTChvcGVyYXRpb24pICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0TWV2YWwoYXZtX2FyZ19vcGVyYXRpb25fdCBvcE1hc2sgPSBBVk1fQVJHX1VOREVGSU5FRF9PUEVSQVRJT04pCisJeworCQlvcGVyYXRpb24gPSBhdm1fYXJnX29wZXJhdGlvbl90KG9wZXJhdGlvbiB8IG9wTWFzayB8IEFWTV9BUkdfTUVWQUwpOworCX0KKworCS8vIGVYY2x1c2l2ZSBQUkVGSVggYml0IHNldHRpbmcKKwlpbmxpbmUgdm9pZCB4c2V0TWV2YWwoYXZtX2FyZ19vcGVyYXRpb25fdCBvcE1hc2sgPSBBVk1fQVJHX1VOREVGSU5FRF9PUEVSQVRJT04pCisJeworCQlvcGVyYXRpb24gPSBhdm1fYXJnX29wZXJhdGlvbl90KCAob3BlcmF0aW9uIHwgb3BNYXNrKSAmCisJCQkJQVZNX0FSR19PUEVSQVRJT05fWF9NRVZBTF9NQVNLICk7CisJfQorCisJaW5saW5lIHZvaWQgdW5zZXRNZXZhbCgpCisJeworCQlvcGVyYXRpb24gPSBhdm1fYXJnX29wZXJhdGlvbl90KCBvcGVyYXRpb24gJiAofiBBVk1fQVJHX01FVkFMKSApOworCX0KKworCisJc3RhdGljIEF2bUJ5dGVjb2RlIEFSR19VTkRFRklORURfQ09ERTsKKworCXN0YXRpYyBBdm1CeXRlY29kZSBBUkdfTk9QU19DT0RFOworCXN0YXRpYyBBdm1CeXRlY29kZSBBUkdfU0VWQUxfQ09ERTsKKwlzdGF0aWMgQXZtQnl0ZWNvZGUgQVJHX01FVkFMX0NPREU7CisKKworCS8qKgorCSAqIENPTVBBUklTT04KKwkgKiBPUEVSQVRPUgorCSAqLworCisJaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBBdm1CeXRlY29kZSAmIG90aGVyKSBjb25zdAorCXsKKwkJcmV0dXJuKCAoY29udGV4dCAgID09IG90aGVyLmNvbnRleHQgICkgJiYKKwkJCQkocHJvY2Vzc29yID09IG90aGVyLnByb2Nlc3NvcikgJiYKKwkJCQkobnVtZXJpYyAgID09IG90aGVyLm51bWVyaWMgICkgJiYKKwkJCQkob3BlcmF0aW9uID09IG90aGVyLm9wZXJhdGlvbikgJiYKKwkJCQkob3BlcmFuZCAgID09IG90aGVyLm9wZXJhbmQgICkgJiYKKwkJCQkob2Zmc2V0ICAgID09IG90aGVyLm9mZnNldCAgICkgJiYKKwkJCQkoZHR5cGUgICAgID09IG90aGVyLmR0eXBlKSAgICk7CisJfQorCisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJc3RhdGljIHN0ZDo6c3RyaW5nIHN0ckNvbnRleHQoYXZtX2FyZ19jb250ZXh0X3QgY29udGV4dCk7CisKKwlzdGF0aWMgc3RkOjpzdHJpbmcgc3RyUHJvY2Vzc29yKGF2bV9hcmdfcHJvY2Vzc29yX3QgcHJvY2Vzc29yKTsKKworCisJc3RhdGljIHN0ZDo6c3RyaW5nIHN0ck5vcENvZGUoYXZtX2FyZ19vcGVyYXRpb25fdCBvcGVyYXRpb24pOworCisJc3RhdGljIHN0ZDo6c3RyaW5nIHN0ckV2YWxDb2RlKGF2bV9hcmdfb3BlcmF0aW9uX3Qgb3BlcmF0aW9uKTsKKworCWlubGluZSBzdGF0aWMgc3RkOjpzdHJpbmcgc3RyUHJlZml4Q29kZShhdm1fYXJnX29wZXJhdGlvbl90IG9wZXJhdGlvbikKKwl7CisJCWlmKCBIQVNfQVJHX09QRVJBVElPTl9QUkVGSVgob3BlcmF0aW9uKSApCisJCXsKKwkJCXN0ZDo6c3RyaW5nIG5vcCAgPSBzdHJOb3BDb2RlKG9wZXJhdGlvbik7CisJCQlzdGQ6OnN0cmluZyByb3V0aW5lX2V2YWwgPSBzdHJFdmFsQ29kZShvcGVyYXRpb24pOworCisJCQlyZXR1cm4oIG5vcC5lbXB0eSgpID8gcm91dGluZV9ldmFsIDoKKwkJCQkJKHJvdXRpbmVfZXZhbC5lbXB0eSgpID8gbm9wIDoKKwkJCQkJCQkoT1NTKCkgPDwgbm9wIDw8ICIjIiA8PCByb3V0aW5lX2V2YWwpLnN0cigpKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuKCAiP3JvdXRpbmVfZXZhbCIgKTsKKwkJfQorCX0KKworCisJc3RhdGljIHN0ZDo6c3RyaW5nIHN0clZhbHVlQ29kZShhdm1fYXJnX29wZXJhdGlvbl90IG9wZXJhdGlvbik7CisKKwlpbmxpbmUgc3RhdGljIHN0ZDo6c3RyaW5nIHN0ck9wZXJhdGlvbihhdm1fYXJnX29wZXJhdGlvbl90IG9wZXJhdGlvbikKKwl7CisJCXJldHVybiggT1NTKCkgPDwgc3RyUHJlZml4Q29kZShvcGVyYXRpb24pIDw8ICI6IgorCQkJCTw8IHN0clZhbHVlQ29kZShvcGVyYXRpb24pICk7CisJfQorCisKKwlzdGF0aWMgc3RkOjpzdHJpbmcgc3RyT3BlcmFuZChhdm1fYXJnX29wZXJhbmRfdCBvcGVyYW5kKTsKKworCisJaW5saW5lIHN0YXRpYyBzdGQ6OnN0cmluZyBzdHJDb2RlKAorCQkJYXZtX2FyZ19jb250ZXh0X3QgY29udGV4dCwgYXZtX2FyZ19wcm9jZXNzb3JfdCBwcm9jZXNzb3IsCisJCQlhdm1fYXJnX29wZXJhdGlvbl90IG9wZXJhdGlvbiwgYXZtX2FyZ19vcGVyYW5kX3Qgb3BlcmFuZCkKKwl7CisJCXN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisKKwkJb3NzIDw8IHN0ckNvbnRleHQoY29udGV4dCkgPDwgIlsiIDw8IHN0clByb2Nlc3Nvcihwcm9jZXNzb3IpIDw8ICJdOj4iCisJCQk8PCBzdHJPcGVyYXRpb24ob3BlcmF0aW9uKSA8PCAiOiIgPDwgc3RyT3BlcmFuZChvcGVyYW5kKTsKKworCQlyZXR1cm4oIG9zcy5zdHIoKSApOworCX0KKworCisJaW5saW5lIHN0ZDo6c3RyaW5nIHN0clByZWZpeENvZGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBBdm1CeXRlY29kZTo6c3RyUHJlZml4Q29kZShvcGVyYXRpb24pICk7CisJfQorCisJaW5saW5lIHN0ZDo6c3RyaW5nIHN0clZhbHVlQ29kZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIEF2bUJ5dGVjb2RlOjpzdHJWYWx1ZUNvZGUob3BlcmF0aW9uKSApOworCX0KKworCWlubGluZSBzdGQ6OnN0cmluZyBzdHJFeHByZXNzaW9uQ29kZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIEF2bUJ5dGVjb2RlOjpzdHJPcGVyYW5kKG9wZXJhbmQpICk7CisJfQorCisJaW5saW5lIHN0ZDo6c3RyaW5nIHN0ckNvZGUoKSBjb25zdAorCXsKKwkJc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKworCQlvc3MgPDwgQXZtQnl0ZWNvZGU6OnN0ckNvZGUoY29udGV4dCwgcHJvY2Vzc29yLCBvcGVyYXRpb24sIG9wZXJhbmQpOworCQlpZiggb2Zmc2V0ICE9IEFWTV9OVU1FUklDX01BWF9TSVpFX1QgKQorCQl7CisJCQlvc3MgPDwgIjw8IiA8PCBvZmZzZXQ7CisJCX0KKworCQlyZXR1cm4oIG9zcy5zdHIoKSApOworCX0KKworCXN0ZDo6c3RyaW5nIHN0clR5cGUoKSBjb25zdDsKKworCisJLyoKKwkgKiBBVFRSSUJVVEVTCisJICovCisJLy8gY29udGV4dAorCWF2bV9hcmdfY29udGV4dF90IGNvbnRleHQ7CisKKwkvLyByb3V0aW5lX2V2YWx1YXRpb24gcHJvY2Vzc29yCisJYXZtX2FyZ19wcm9jZXNzb3JfdCBwcm9jZXNzb3I7CisKKwkvLyBpcyBudW1lcmljIHZhbHVhdGlvbiBmbGFnCisJYm9vbCBudW1lcmljOworCisJLy8gb3BlcmF0aW9uCisJYXZtX2FyZ19vcGVyYXRpb25fdCBvcGVyYXRpb247CisKKwkvLyBvcGVyYW5kPG5hdHVyZT4gdXNlZCBieSB0aGUgb3BlcmF0aW9uCisJYXZtX2FyZ19vcGVyYW5kX3Qgb3BlcmFuZDsKKworCS8vIG9mZnNldCBvZiBvcGVyYW5kIGluIGlucHV0IHRhYmxlCisJYXZtX3NpemVfdCBvZmZzZXQ7CisKKwkvLyB0eXBlIG9mIG9wZXJhbmQKKwlCYXNlVHlwZVNwZWNpZmllciAqIGR0eXBlOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gb3B0aW1pemUgQVBJIGZvciA8PCBbZGVjb2RlXSBldmFsID4+IHJvdXRpbmUKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlib29sICgqIHJvdXRpbmVfZGVjb2RlX2V2YWwpKEF2bUJ5dGVjb2RlICosIEFSR1NfRU5WICYsIGNvbnN0IEJGICYpOworCisJaW5saW5lIGJvb2wgZGVjb2RlX2V2YWwoQVJHU19FTlYgJiBhcmdFTlYsIGNvbnN0IEJGICYgYXJnKQorCXsKKwkJcmV0dXJuKCByb3V0aW5lX2RlY29kZV9ldmFsKHRoaXMsIGFyZ0VOViwgYXJnKSApOworCX0KKworCisJYm9vbCAoKiByb3V0aW5lX2V2YWwpKEF2bUJ5dGVjb2RlICosIEFSR1NfRU5WICYsIEF2bUNvZGUgKik7CisKKwlpbmxpbmUgYm9vbCBldmFsKEFSR1NfRU5WICYgYXJnRU5WLCBBdm1Db2RlICogYUNvZGUpCisJeworCQlyZXR1cm4oIHJvdXRpbmVfZXZhbCh0aGlzLCBhcmdFTlYsIGFDb2RlKSApOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIG9wdGltaXplIEFQSSBmb3IgPDwgW2RlY29kZV0gcnVuID4+IHJvdXRpbmUKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlib29sICgqIHJvdXRpbmVfZGVjb2RlX3J1bikoQXZtQnl0ZWNvZGUgKiwgQVJHU19FTlYgJiwgY29uc3QgQkYgJik7CisKKwlpbmxpbmUgYm9vbCBkZWNvZGVfcnVuKEFSR1NfRU5WICYgYXJnRU5WLCBjb25zdCBCRiAmIGFyZykKKwl7CisJCXJldHVybiggcm91dGluZV9kZWNvZGVfcnVuKHRoaXMsIGFyZ0VOViwgYXJnKSApOworCX0KKworCisJYm9vbCAoKiByb3V0aW5lX3J1bikoQXZtQnl0ZWNvZGUgKiwgQVJHU19FTlYgJiwgQXZtQ29kZSAqKTsKKworCWlubGluZSBib29sIHJ1bihBUkdTX0VOViAmIGFyZ0VOViwgQXZtQ29kZSAqIGFDb2RlKQorCXsKKwkJcmV0dXJuKCByb3V0aW5lX3J1bih0aGlzLCBhcmdFTlYsIGFDb2RlKSApOworCX0KKworCit9OworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworI2VuZGlmIC8qIEFWTUJZVEVDT0RFX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9pbnN0cnVjdGlvbi9Bdm1JbnN0cnVjdGlvbi5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9pbnN0cnVjdGlvbi9Bdm1JbnN0cnVjdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRiZDU3MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL2luc3RydWN0aW9uL0F2bUluc3RydWN0aW9uLmNwcApAQCAtMCwwICsxLDE4MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDIzIGphbnYuIDIwMTQKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkF2bUluc3RydWN0aW9uLmgiCisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9Bdm1Db2RlLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisvKioKKyAqIGNvbXB1dGUgbWFpbiBieXRlY29kZQorICogTk9QUyBvciBFVkFMUworICovCit2b2lkIEF2bUluc3RydWN0aW9uOjpjb21wdXRlTWFpbkJ5dGVjb2RlKAorCQlib29sIHVwZGF0ZU1haW5CeXRlQ29kZUlmTk9QUywgYXZtX2FyZ19vcGVyYXRpb25fdCBvcE1hc2spCit7CisJYm9vbCBpc1Vuc2V0Tm9wcyA9IHRydWU7CisJZm9yKCBpbnQgcGMgPSBpbnQodGhlU2l6ZSkgLSAxIDsgcGMgPj0gMCA7IC0tcGMgKQorCXsKKwkJaWYoIGlzVW5zZXROb3BzICYmIHRoZUFyZ0J5dGVjb2RlW3BjXS5pc0V2YWwoKSApCisJCXsKKwkJCWlzVW5zZXROb3BzID0gZmFsc2U7CisKKwkJCWlmKCBwYyA8IChpbnQodGhlU2l6ZSkgLSAyKSApCisJCQl7CisJCQkJdGhlQXJnQnl0ZWNvZGVbcGMrMV0uc2V0Tm9wc09wZXJhdGlvbigpOworCQkJfQorCQl9CisKKwkJaWYoIHRoZUFyZ0J5dGVjb2RlW3BjXS5pc1NldmFsKCkgKQorCQl7CisJCQl0aGVNYWluQnl0ZWNvZGUueHNldFNldmFsKG9wTWFzayk7CisJCX0KKwkJZWxzZSBpZiggdGhlQXJnQnl0ZWNvZGVbcGNdLmlzTWV2YWwoKSApCisJCXsKKwkJCXRoZU1haW5CeXRlY29kZS54c2V0TWV2YWwob3BNYXNrKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYoIGlzVW5zZXROb3BzICkKKwl7CisJCXRoZUFyZ0J5dGVjb2RlWzBdLnNldE5vcHNPcGVyYXRpb24oQVZNX0FSR19WQUxVRSk7CisKKwkJaWYoIHVwZGF0ZU1haW5CeXRlQ29kZUlmTk9QUyApCisJCXsKKwkJCXRoZU1haW5CeXRlY29kZS5zZXROb3BzT3BlcmF0aW9uKG9wTWFzayk7CisJCX0KKwl9CisJZWxzZQorCXsKKy8vCQl0aGVNYWluQnl0ZWNvZGUudW5zZXROb3BzKCk7CisJfQorfQorCisKK3ZvaWQgQXZtSW5zdHJ1Y3Rpb246OmNvbXB1dGVCeXRlY29kZShib29sIHVwZGF0ZU1haW5CeXRlQ29kZUlmTk9QUywKKwkJCWNvbnN0IFZlY3RvcjwgQXZtQnl0ZWNvZGUgPiAmIHZlY3Rvck9mQXJnT3Bjb2RlKQoreworCUFWTV9PU19BU1NFUlRfV0FSTklOR19BTEVSVCggdmVjdG9yT2ZBcmdPcGNvZGUubm9uZW1wdHkoKSApCisJCQk8PCAiQXZtQnl0ZWNvZGU6OmNvbXB1dGVBcmdDb2RlIDo+ICIKKwkJCQkiVW5leHBlY3RlZCBhbiBlbXB0eSB2ZWN0b3Igb2YgQXJnT3Bjb2RlICEhISIKKwkJCTw8IFNFTkRfQUxFUlQ7CisKKwl0aGVTaXplID0gdmVjdG9yT2ZBcmdPcGNvZGUuc2l6ZSgpOworCisJaWYoIHRoZUFyZ0J5dGVjb2RlICE9IE5VTEwgKQorCXsKKwkJZGVsZXRlIHRoZUFyZ0J5dGVjb2RlOworCX0KKworCWlmKCB0aGVTaXplID4gMCApCisJeworCQl0aGVBcmdCeXRlY29kZSA9IG5ldyBBdm1CeXRlY29kZVt0aGVTaXplXTsKKworLy8JCWZvciggYXZtX3NpemVfdCBwYyA9IDAgOyBwYyA8IGNvdW50IDsgKytwYyApCisvLwkJeworLy8JCQl0aGVBcmdCeXRlY29kZVtwY10gPSB2ZWN0b3JPZkFyZ09wY29kZVtwY107CisvLwkJfQorCisJCWJvb2wgaXNVbnNldE5vcHMgPSB0cnVlOworCQlmb3IoIGludCBwYyA9IGludCh0aGVTaXplKSAtIDEgOyBwYyA+PSAwIDsgLS1wYyApCisJCXsKKwkJCXRoZUFyZ0J5dGVjb2RlW3BjXSA9IHZlY3Rvck9mQXJnT3Bjb2RlW3BjXTsKKworCQkJaWYoIGlzVW5zZXROb3BzICYmIHRoZUFyZ0J5dGVjb2RlW3BjXS5pc0V2YWwoKSApCisJCQl7CisJCQkJaXNVbnNldE5vcHMgPSBmYWxzZTsKKworCQkJCWlmKCBwYyA8IChpbnQodGhlU2l6ZSkgLSAyKSApCisJCQkJeworCQkJCQl0aGVBcmdCeXRlY29kZVtwYysxXS5zZXROb3BzT3BlcmF0aW9uKCk7CisJCQkJfQorCQkJfQorCisJCQlpZiggdGhlQXJnQnl0ZWNvZGVbcGNdLmlzU2V2YWwoKSApCisJCQl7CisJCQkJaWYoIG5vdCB0aGVNYWluQnl0ZWNvZGUuaXNNZXZhbCgpICkKKwkJCQl7CisJCQkJCXRoZU1haW5CeXRlY29kZS54c2V0U2V2YWwoKTsKKwkJCQl9CisJCQl9CisJCQllbHNlIGlmKCB0aGVBcmdCeXRlY29kZVtwY10uaXNNZXZhbCgpICYmCisJCQkJCShub3QgdGhlTWFpbkJ5dGVjb2RlLmlzTWV2YWwoKSkgKQorCQkJeworCQkJCXRoZU1haW5CeXRlY29kZS54c2V0TWV2YWwoKTsKKwkJCX0KKwkJfQorCisJCWlmKCBpc1Vuc2V0Tm9wcyApCisJCXsKKwkJCXRoZUFyZ0J5dGVjb2RlWzBdLnNldE5vcHNPcGVyYXRpb24oQVZNX0FSR19WQUxVRSk7CisKKwkJCWlmKCB1cGRhdGVNYWluQnl0ZUNvZGVJZk5PUFMgKQorCQkJeworCQkJCXRoZU1haW5CeXRlY29kZS5zZXROb3BzT3BlcmF0aW9uKCk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisvLwkJCXRoZU1haW5CeXRlY29kZS51bnNldE5vcHMoKTsKKwkJfQorCX0KKwllbHNlCisJeworCQl0aGVNYWluQnl0ZWNvZGUuc2V0Tm9wc09wZXJhdGlvbigpOworCX0KK30KKworCisvKioKKyAqIG5vcHMgYnl0ZWNvZGUKKyAqLworQXZtSW5zdHJ1Y3Rpb24gKiBBdm1JbnN0cnVjdGlvbjo6bm9wc1VuYXJ5Q29kZShhdm1fYXJnX29wZXJhbmRfdCBvcGVyYW5kKQoreworCUF2bUluc3RydWN0aW9uICogbm9wc0luc3RydWN0aW9uID0gbmV3IEF2bUluc3RydWN0aW9uKDEpOworCisJbm9wc0luc3RydWN0aW9uLT5zZXRNYWluQnl0ZWNvZGUoCisJCQkvKnByb2Nlc3NvciovIEFWTV9BUkdfTk9QX0NQVSwKKwkJCS8qb3BlcmF0aW9uKi8gQVZNX0FSR19OT1BTX1ZBTFVFLAorCQkJLypvcGVyYW5kICAqLyBvcGVyYW5kKTsKKworCW5vcHNJbnN0cnVjdGlvbi0+c2V0KDAsCisJCQkvKnByb2Nlc3NvciovIEFWTV9BUkdfTk9QX0NQVSwKKwkJCS8qb3BlcmF0aW9uKi8gQVZNX0FSR19OT1BTX1ZBTFVFLAorCQkJLypvcGVyYW5kICAqLyBvcGVyYW5kKTsKKworCXJldHVybiggbm9wc0luc3RydWN0aW9uICk7CisKK30KKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNFUklBTElaQVRJT04KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLwordm9pZCBBdm1JbnN0cnVjdGlvbjo6dG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJb3MgPDwgVEFCIDw8ICIjeyIgPDwgRU9MOworCWZvciggYXZtX3NpemVfdCBpZHggPSAwIDsgaWR4IDwgdGhlU2l6ZSA7ICsraWR4ICkKKwl7CisJCW9zIDw8IFRBQjIgPDwgaWR4IDw8ICI6IiA8PCB0aGVBcmdCeXRlY29kZVtpZHhdLnN0ckNvZGUoKSA8PCBFT0w7CisJfQorCW9zIDw8IFRBQiA8PCAifSIgPDwgRU9MX0ZMVVNIOworfQorCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvaW5zdHJ1Y3Rpb24vQXZtSW5zdHJ1Y3Rpb24uaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL2luc3RydWN0aW9uL0F2bUluc3RydWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFiOTgxZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL2luc3RydWN0aW9uL0F2bUluc3RydWN0aW9uLmgKQEAgLTAsMCArMSw2MzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyMyBqYW52LiAyMDE0CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQVZNSU5TVFJVQ1RJT05fSF8KKyNkZWZpbmUgQVZNSU5TVFJVQ1RJT05fSF8KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vVmVjdG9yLmg+CisKKyNpbmNsdWRlIDxjb21wdXRlci9pbnN0cnVjdGlvbi9Bdm1CeXRlY29kZS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjbGFzcyBBUkdTX0VOVjsKK2NsYXNzIEF2bUNvZGU7CitjbGFzcyBCRjsKKworY2xhc3MgQXZtSW5zdHJ1Y3Rpb24KK3sKKworcHVibGljOgorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQXZtSW5zdHJ1Y3Rpb24oKQorCTogdGhlU2l6ZSggMCApLAorCXRoZU1haW5CeXRlY29kZSggKSwKKwl0aGVBcmdCeXRlY29kZSggTlVMTCApLAorCisJcm91dGluZV9kZWNvZGVfZXZhbCggTlVMTCApLAorCXJvdXRpbmVfZXZhbCggTlVMTCApLAorCXJvdXRpbmVfZGVjb2RlX3J1biggTlVMTCApLAorCXJvdXRpbmVfcnVuKCBOVUxMICkKKwl7CisJCS8vISEhIE5PVEhJTkcKKwl9CisKKwlBdm1JbnN0cnVjdGlvbihhdm1fc2l6ZV90IGFTaXplKQorCTogdGhlU2l6ZSggYVNpemUgKSwKKwl0aGVNYWluQnl0ZWNvZGUoICksCisJdGhlQXJnQnl0ZWNvZGUoIChhU2l6ZSA+IDApID8gbmV3IEF2bUJ5dGVjb2RlW2FTaXplXSA6IE5VTEwgKSwKKworCXJvdXRpbmVfZGVjb2RlX2V2YWwoIE5VTEwgKSwKKwlyb3V0aW5lX2V2YWwoIE5VTEwgKSwKKwlyb3V0aW5lX2RlY29kZV9ydW4oIE5VTEwgKSwKKwlyb3V0aW5lX3J1biggTlVMTCApCisJeworCQkvLyEhISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJZXhwbGljaXQgQXZtSW5zdHJ1Y3Rpb24oY29uc3QgQXZtSW5zdHJ1Y3Rpb24gJiBhbkluc3RydWN0aW9uKQorCTogdGhlU2l6ZSggYW5JbnN0cnVjdGlvbi50aGVTaXplICksCisJdGhlTWFpbkJ5dGVjb2RlKCBhbkluc3RydWN0aW9uLnRoZU1haW5CeXRlY29kZSApLAorCXRoZUFyZ0J5dGVjb2RlKCAodGhlU2l6ZSA+IDApID8gbmV3IEF2bUJ5dGVjb2RlW3RoZVNpemVdIDogTlVMTCApLAorCisJcm91dGluZV9kZWNvZGVfZXZhbCggYW5JbnN0cnVjdGlvbi5yb3V0aW5lX2RlY29kZV9ldmFsICksCisJcm91dGluZV9ldmFsKCBhbkluc3RydWN0aW9uLnJvdXRpbmVfZXZhbCApLAorCXJvdXRpbmVfZGVjb2RlX3J1biggYW5JbnN0cnVjdGlvbi5yb3V0aW5lX2RlY29kZV9ydW4gKSwKKwlyb3V0aW5lX3J1biggYW5JbnN0cnVjdGlvbi5yb3V0aW5lX3J1biApCisJeworCQljb3B5KCBhbkluc3RydWN0aW9uLnRoZUFyZ0J5dGVjb2RlICk7CisJfQorCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+QXZtSW5zdHJ1Y3Rpb24oKQorCXsKKwkJZGVsZXRlICggdGhlQXJnQnl0ZWNvZGUgKTsKKwl9CisKKworCS8qKgorCSAqIGNvcHkKKwkgKi8KKwlpbmxpbmUgdm9pZCBjb3B5KEF2bUJ5dGVjb2RlICogYXJnQnl0ZWNvZGUpCisJeworCQlmb3IoIGF2bV9zaXplX3QgaWR4ID0gMCA7IGlkeCA8IHRoZVNpemUgOyArK2lkeCApCisJCXsKKwkJCXRoZUFyZ0J5dGVjb2RlW2lkeF0gPSBhcmdCeXRlY29kZVtpZHhdOworCQl9CisJfQorCisJaW5saW5lIHZvaWQgY29weShjb25zdCBhdm1fc2l6ZV90IHNyY09mZnNldCwgY29uc3QgYXZtX3NpemVfdCB0Z3RPZmZzZXQpCisJeworCQl0aGVBcmdCeXRlY29kZVt0Z3RPZmZzZXRdID0gdGhlQXJnQnl0ZWNvZGVbc3JjT2Zmc2V0XTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIHRoZVNpemUKKwkgKi8KKwlpbmxpbmUgYXZtX3NpemVfdCBzaXplKCkgY29uc3QKKwl7CisJCXJldHVybiggdGhlU2l6ZSApOworCX0KKworCWlubGluZSBib29sIGVtcHR5KCkgY29uc3QKKwl7CisJCXJldHVybiggdGhlU2l6ZSA9PSAwICk7CisJfQorCisJaW5saW5lIGJvb2wgbm9uZW1wdHkoKSBjb25zdAorCXsKKwkJcmV0dXJuKCB0aGVTaXplID4gMCApOworCX0KKworCWlubGluZSBib29sIHNpbmdsZXRvbigpIGNvbnN0CisJeworCQlyZXR1cm4oIHRoZVNpemUgPT0gMSApOworCX0KKworCWlubGluZSBib29sIHBvcHVsYXRlZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHRoZVNpemUgPiAxICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBmb3IgdGhlTWFpbkJ5dGVjb2RlCisJICovCisJaW5saW5lIEF2bUJ5dGVjb2RlICYgZ2V0TWFpbkJ5dGVjb2RlKCkKKwl7CisJCXJldHVybiggdGhlTWFpbkJ5dGVjb2RlICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0TWFpbkJ5dGVjb2RlKEF2bUJ5dGVjb2RlICYgYUJ5dGVDb2RlKQorCXsKKwkJdGhlTWFpbkJ5dGVjb2RlID0gYUJ5dGVDb2RlOworCX0KKworCisJaW5saW5lIHZvaWQgc2V0TWFpbkJ5dGVjb2RlKAorCQkJYXZtX2FyZ19jb250ZXh0X3QgY29udGV4dCwgYXZtX2FyZ19wcm9jZXNzb3JfdCBwcm9jZXNzb3IsCisJCQlhdm1fYXJnX29wZXJhdGlvbl90IG9wZXJhdGlvbiwgYXZtX2FyZ19vcGVyYW5kX3Qgb3BlcmFuZCwKKwkJCUJhc2VUeXBlU3BlY2lmaWVyICogZHR5cGUgPSBOVUxMKQorCXsKKwkJdGhlTWFpbkJ5dGVjb2RlLmNvbnRleHQgICA9IGNvbnRleHQ7CisJCXRoZU1haW5CeXRlY29kZS5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7CisJCXRoZU1haW5CeXRlY29kZS5vcGVyYXRpb24gPSBvcGVyYXRpb247CisJCXRoZU1haW5CeXRlY29kZS5vcGVyYW5kICAgPSBvcGVyYW5kOworCQl0aGVNYWluQnl0ZWNvZGUuZHR5cGUgICAgID0gZHR5cGU7CisJfQorCisJaW5saW5lIHZvaWQgc2V0TWFpbkJ5dGVjb2RlKAorCQkJYXZtX2FyZ19jb250ZXh0X3QgY29udGV4dCwgYXZtX2FyZ19vcGVyYXRpb25fdCBvcGVyYXRpb24sCisJCQlhdm1fYXJnX29wZXJhbmRfdCBvcGVyYW5kLCBCYXNlVHlwZVNwZWNpZmllciAqIGR0eXBlID0gTlVMTCkKKwl7CisJCXRoZU1haW5CeXRlY29kZS5jb250ZXh0ICAgPSBjb250ZXh0OworCQl0aGVNYWluQnl0ZWNvZGUub3BlcmF0aW9uID0gb3BlcmF0aW9uOworCQl0aGVNYWluQnl0ZWNvZGUub3BlcmFuZCAgID0gb3BlcmFuZDsKKwkJdGhlTWFpbkJ5dGVjb2RlLmR0eXBlICAgICA9IGR0eXBlOworCX0KKworCWlubGluZSB2b2lkIHNldE1haW5CeXRlY29kZSgKKwkJCWF2bV9hcmdfcHJvY2Vzc29yX3QgcHJvY2Vzc29yLCBhdm1fYXJnX29wZXJhdGlvbl90IG9wZXJhdGlvbiwKKwkJCWF2bV9hcmdfb3BlcmFuZF90IG9wZXJhbmQsIEJhc2VUeXBlU3BlY2lmaWVyICogZHR5cGUgPSBOVUxMKQorCXsKKwkJdGhlTWFpbkJ5dGVjb2RlLnByb2Nlc3NvciA9IHByb2Nlc3NvcjsKKwkJdGhlTWFpbkJ5dGVjb2RlLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjsKKwkJdGhlTWFpbkJ5dGVjb2RlLm9wZXJhbmQgICA9IG9wZXJhbmQ7CisJCXRoZU1haW5CeXRlY29kZS5kdHlwZSAgICAgPSBkdHlwZTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRNYWluQnl0ZWNvZGUoYXZtX2FyZ19vcGVyYXRpb25fdCBvcGVyYXRpb24sCisJCQlhdm1fYXJnX29wZXJhbmRfdCBvcGVyYW5kLCBCYXNlVHlwZVNwZWNpZmllciAqIGR0eXBlID0gTlVMTCkKKwl7CisJCXRoZU1haW5CeXRlY29kZS5vcGVyYXRpb24gPSBvcGVyYXRpb247CisJCXRoZU1haW5CeXRlY29kZS5vcGVyYW5kICAgPSBvcGVyYW5kOworCQl0aGVNYWluQnl0ZWNvZGUuZHR5cGUgICAgID0gZHR5cGU7CisJfQorCisKKwlpbmxpbmUgYXZtX2FyZ19jb250ZXh0X3QgZ2V0TWFpbkNvbnRleHQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCB0aGVNYWluQnl0ZWNvZGUuY29udGV4dCAgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRNYWluQ29udGV4dChhdm1fYXJnX2NvbnRleHRfdCBjb250ZXh0KQorCXsKKwkJdGhlTWFpbkJ5dGVjb2RlLmNvbnRleHQgPSBjb250ZXh0OworCX0KKworCisJaW5saW5lIGF2bV9hcmdfcHJvY2Vzc29yX3QgZ2V0TWFpblByb2Nlc3NvcigpIGNvbnN0CisJeworCQlyZXR1cm4oIHRoZU1haW5CeXRlY29kZS5wcm9jZXNzb3IgICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0TWFpblByb2Nlc3Nvcihhdm1fYXJnX3Byb2Nlc3Nvcl90IHByb2Nlc3NvcikKKwl7CisJCXRoZU1haW5CeXRlY29kZS5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7CisJfQorCisKKwlpbmxpbmUgYXZtX2FyZ19vcGVyYXRpb25fdCBnZXRNYWluT3BlcmF0aW9uKCkgY29uc3QKKwl7CisJCXJldHVybiggdGhlTWFpbkJ5dGVjb2RlLm9wZXJhdGlvbiAgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRNYWluT3BlcmF0aW9uKGF2bV9hcmdfb3BlcmF0aW9uX3Qgb3BlcmF0aW9uKQorCXsKKwkJdGhlTWFpbkJ5dGVjb2RlLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjsKKwl9CisKKworCWlubGluZSBhdm1fYXJnX29wZXJhbmRfdCBnZXRNYWluT3BlcmFuZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHRoZU1haW5CeXRlY29kZS5vcGVyYW5kICApOworCX0KKworCWlubGluZSB2b2lkIHNldE1haW5PcGVyYW5kKGF2bV9hcmdfb3BlcmFuZF90IG9wZXJhbmQpCisJeworCQl0aGVNYWluQnl0ZWNvZGUub3BlcmFuZCA9IG9wZXJhbmQ7CisJfQorCisKKwkvKioKKwkgKiB0aGVNYWluQnl0ZWNvZGUKKwkgKiBOT1AKKwkgKi8KKwlpbmxpbmUgYm9vbCBpc05vcCgpIGNvbnN0CisJeworCQlyZXR1cm4oIElTX0FSR19PUEVSQVRJT05fTk9QKHRoZU1haW5CeXRlY29kZS5vcGVyYXRpb24pICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0Tm9wKGF2bV9hcmdfb3BlcmF0aW9uX3Qgb3BNYXNrID0gQVZNX0FSR19VTkRFRklORURfT1BFUkFUSU9OKQorCXsKKwkJdGhlTWFpbkJ5dGVjb2RlLm9wZXJhdGlvbiA9IGF2bV9hcmdfb3BlcmF0aW9uX3QoCisJCQkJdGhlTWFpbkJ5dGVjb2RlLm9wZXJhdGlvbiB8IG9wTWFzayB8IEFWTV9BUkdfTk9QICk7CisKKwkJdGhlTWFpbkJ5dGVjb2RlLm9wZXJhdGlvbiA9IGF2bV9hcmdfb3BlcmF0aW9uX3QoCisJCQkJdGhlTWFpbkJ5dGVjb2RlLm9wZXJhdGlvbiAmICh+QVZNX0FSR19PUEVSQVRJT05fRVZBTF9NQVNLKSApOworCX0KKworCisJLyoqCisJICogdGhlTWFpbkJ5dGVjb2RlCisJICogTk9QUworCSAqLworCWlubGluZSBib29sIGlzTm9wQ1BVKCkgY29uc3QKKwl7CisJCXJldHVybiggdGhlTWFpbkJ5dGVjb2RlLnByb2Nlc3NvciA9PSBBVk1fQVJHX05PUF9DUFUgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc05vcHMoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBJU19BUkdfT1BFUkFUSU9OX05PUFModGhlTWFpbkJ5dGVjb2RlLm9wZXJhdGlvbikgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXROb3BzKGF2bV9hcmdfb3BlcmF0aW9uX3Qgb3BNYXNrID0gQVZNX0FSR19VTkRFRklORURfT1BFUkFUSU9OKQorCXsKKwkJdGhlTWFpbkJ5dGVjb2RlLm9wZXJhdGlvbiA9IGF2bV9hcmdfb3BlcmF0aW9uX3QoCisJCQkJdGhlTWFpbkJ5dGVjb2RlLm9wZXJhdGlvbiB8IG9wTWFzayB8IEFWTV9BUkdfTk9QUyApOworCisJCXRoZU1haW5CeXRlY29kZS5vcGVyYXRpb24gPSBhdm1fYXJnX29wZXJhdGlvbl90KAorCQkJCXRoZU1haW5CeXRlY29kZS5vcGVyYXRpb24gJiAofkFWTV9BUkdfT1BFUkFUSU9OX0VWQUxfTUFTSykgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCB1bnNldE5vcHMoYXZtX2FyZ19vcGVyYXRpb25fdCBvcE1hc2sgPSBBVk1fQVJHX1NFVkFMKQorCXsKKwkJdGhlTWFpbkJ5dGVjb2RlLm9wZXJhdGlvbiA9IGF2bV9hcmdfb3BlcmF0aW9uX3QoCisJCQkJKHRoZU1haW5CeXRlY29kZS5vcGVyYXRpb24gfCBvcE1hc2spICYKKwkJCQkofiBBVk1fQVJHX09QRVJBVElPTl9OT1BfTUFTSykgKTsKKwl9CisKKworCS8qKgorCSAqIHRoZU1haW5CeXRlY29kZQorCSAqIEVWQUwKKwkgKiBFVkFMCisJICovCisJaW5saW5lIGJvb2wgaXNFdmFsKCkgY29uc3QKKwl7CisJCXJldHVybiggSVNfQVJHX09QRVJBVElPTl9FVkFMKHRoZU1haW5CeXRlY29kZS5vcGVyYXRpb24pICk7CisJfQorCisJaW5saW5lIHZvaWQgdW5zZXRFdmFsKCkKKwl7CisJCXRoZU1haW5CeXRlY29kZS5vcGVyYXRpb24gPSBhdm1fYXJnX29wZXJhdGlvbl90KAorCQkJCXRoZU1haW5CeXRlY29kZS5vcGVyYXRpb24gJiAofiBBVk1fQVJHX09QRVJBVElPTl9FVkFMX01BU0spICk7CisJfQorCisKKwkvKioKKwkgKiB0aGVNYWluQnl0ZWNvZGUKKwkgKiBTRVZBTAorCSAqLworCWlubGluZSBib29sIGlzU2V2YWwoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBJU19BUkdfT1BFUkFUSU9OX1NFVkFMKHRoZU1haW5CeXRlY29kZS5vcGVyYXRpb24pICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0U2V2YWwoYXZtX2FyZ19vcGVyYXRpb25fdCBvcE1hc2sgPSBBVk1fQVJHX1VOREVGSU5FRF9PUEVSQVRJT04pCisJeworCQl0aGVNYWluQnl0ZWNvZGUub3BlcmF0aW9uID0gYXZtX2FyZ19vcGVyYXRpb25fdCgKKwkJCQl0aGVNYWluQnl0ZWNvZGUub3BlcmF0aW9uIHwgb3BNYXNrIHwgQVZNX0FSR19TRVZBTCk7CisJfQorCisJLy8gZVhjbHVzaXZlIFBSRUZJWCBiaXQgc2V0dGluZworCWlubGluZSB2b2lkIHhzZXRTZXZhbChhdm1fYXJnX29wZXJhdGlvbl90IG9wTWFzayA9IEFWTV9BUkdfVU5ERUZJTkVEX09QRVJBVElPTikKKwl7CisJCXRoZU1haW5CeXRlY29kZS5vcGVyYXRpb24gPSBhdm1fYXJnX29wZXJhdGlvbl90KAorCQkJCSh0aGVNYWluQnl0ZWNvZGUub3BlcmF0aW9uIHwgb3BNYXNrKSAmCisJCQkJQVZNX0FSR19PUEVSQVRJT05fWF9TRVZBTF9NQVNLICk7CisJfQorCisJaW5saW5lIHZvaWQgdW5zZXRTZXZhbCgpCisJeworCQl0aGVNYWluQnl0ZWNvZGUub3BlcmF0aW9uID0gYXZtX2FyZ19vcGVyYXRpb25fdCgKKwkJCQl0aGVNYWluQnl0ZWNvZGUub3BlcmF0aW9uICYgKH4gQVZNX0FSR19TRVZBTCkgKTsKKwl9CisKKworCS8qKgorCSAqIHRoZU1haW5CeXRlY29kZQorCSAqIE1FVkFMCisJICovCisJaW5saW5lIGJvb2wgaXNNZXZhbCgpIGNvbnN0CisJeworCQlyZXR1cm4oIElTX0FSR19PUEVSQVRJT05fTUVWQUwodGhlTWFpbkJ5dGVjb2RlLm9wZXJhdGlvbikgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRNZXZhbChhdm1fYXJnX29wZXJhdGlvbl90IG9wTWFzayA9IEFWTV9BUkdfVU5ERUZJTkVEX09QRVJBVElPTikKKwl7CisJCXRoZU1haW5CeXRlY29kZS5vcGVyYXRpb24gPSBhdm1fYXJnX29wZXJhdGlvbl90KAorCQkJCXRoZU1haW5CeXRlY29kZS5vcGVyYXRpb24gfCBvcE1hc2sgfCBBVk1fQVJHX01FVkFMKTsKKwl9CisKKwkvLyBlWGNsdXNpdmUgUFJFRklYIGJpdCBzZXR0aW5nCisJaW5saW5lIHZvaWQgeHNldE1ldmFsKGF2bV9hcmdfb3BlcmF0aW9uX3Qgb3BNYXNrID0gQVZNX0FSR19VTkRFRklORURfT1BFUkFUSU9OKQorCXsKKwkJdGhlTWFpbkJ5dGVjb2RlLm9wZXJhdGlvbiA9IGF2bV9hcmdfb3BlcmF0aW9uX3QoCisJCQkJKHRoZU1haW5CeXRlY29kZS5vcGVyYXRpb24gfCBvcE1hc2spICYKKwkJCQlBVk1fQVJHX09QRVJBVElPTl9YX01FVkFMX01BU0sgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCB1bnNldE1ldmFsKCkKKwl7CisJCXRoZU1haW5CeXRlY29kZS5vcGVyYXRpb24gPSBhdm1fYXJnX29wZXJhdGlvbl90KAorCQkJCXRoZU1haW5CeXRlY29kZS5vcGVyYXRpb24gJiAofiBBVk1fQVJHX01FVkFMKSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogZm9yIHRoZUFyZ0J5dGVjb2RlCisJICovCisJaW5saW5lIEF2bUJ5dGVjb2RlICogZ2V0Qnl0ZWNvZGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCB0aGVBcmdCeXRlY29kZSApOworCX0KKworCWlubGluZSBib29sIGhhc0J5dGVjb2RlKCkgY29uc3QKKwl7CisJCXJldHVybiggdGhlQXJnQnl0ZWNvZGUgIT0gTlVMTCApOworCX0KKworCWlubGluZSB2b2lkIHNldEJ5dGVjb2RlKEF2bUJ5dGVjb2RlICogYW5CeXRlY29kZSkKKwl7CisJCXRoZUFyZ0J5dGVjb2RlID0gYW5CeXRlY29kZTsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBmb3IgdGhlQXJnQnl0ZWNvZGUgdy5yLnQuIGFuIGlkeAorCSAqLworCWlubGluZSBBdm1CeXRlY29kZSAmIG9wZXJhdG9yW10oYXZtX3NpemVfdCBpZHgpCisJeworCQlyZXR1cm4oIHRoZUFyZ0J5dGVjb2RlW2lkeF0gKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQXZtQnl0ZWNvZGUgJiBvcGVyYXRvcltdKGF2bV9zaXplX3QgaWR4KSBjb25zdAorCXsKKwkJcmV0dXJuKCB0aGVBcmdCeXRlY29kZVtpZHhdICk7CisJfQorCisKKwlpbmxpbmUgQXZtQnl0ZWNvZGUgJiBhdChjb25zdCBhdm1fc2l6ZV90IGlkeCkKKwl7CisJCXJldHVybiggdGhlQXJnQnl0ZWNvZGVbaWR4XSApOworCX0KKworCWlubGluZSBjb25zdCBBdm1CeXRlY29kZSAmIGF0KGNvbnN0IGF2bV9zaXplX3QgaWR4KSBjb25zdAorCXsKKwkJcmV0dXJuKCB0aGVBcmdCeXRlY29kZVtpZHhdICk7CisJfQorCisJaW5saW5lIEF2bUJ5dGVjb2RlICYgZ2V0KGNvbnN0IGF2bV9zaXplX3QgaWR4KQorCXsKKwkJcmV0dXJuKCB0aGVBcmdCeXRlY29kZVtpZHhdICk7CisJfQorCisJaW5saW5lIGNvbnN0IEF2bUJ5dGVjb2RlICYgZ2V0KGNvbnN0IGF2bV9zaXplX3QgaWR4KSBjb25zdAorCXsKKwkJcmV0dXJuKCB0aGVBcmdCeXRlY29kZVtpZHhdICk7CisJfQorCisKKwkvKioKKwkgKiBTRVRURVIKKwkgKiBmb3IgdGhlQXJnQnl0ZWNvZGUgdy5yLnQuIGFuIGlkeAorCSAqLworCWlubGluZSB2b2lkIHNldChjb25zdCBhdm1fc2l6ZV90IGlkeCwgQXZtQnl0ZWNvZGUgJiBhQnl0ZUNvZGUpCisJeworCQl0aGVBcmdCeXRlY29kZVtpZHhdID0gYUJ5dGVDb2RlOworCX0KKworCWlubGluZSB2b2lkIHNldChjb25zdCBhdm1fc2l6ZV90IGlkeCwgYXZtX2FyZ19jb250ZXh0X3QgY29udGV4dCwKKwkJCWF2bV9hcmdfcHJvY2Vzc29yX3QgcHJvY2Vzc29yLCBhdm1fYXJnX29wZXJhdGlvbl90IG9wZXJhdGlvbiwKKwkJCWF2bV9hcmdfb3BlcmFuZF90IG9wZXJhbmQsIEJhc2VUeXBlU3BlY2lmaWVyICogZHR5cGUgPSBOVUxMKQorCXsKKwkJdGhlQXJnQnl0ZWNvZGVbaWR4XS5jb250ZXh0ICAgPSBjb250ZXh0OworCQl0aGVBcmdCeXRlY29kZVtpZHhdLnByb2Nlc3NvciA9IHByb2Nlc3NvcjsKKwkJdGhlQXJnQnl0ZWNvZGVbaWR4XS5vcGVyYXRpb24gPSBvcGVyYXRpb247CisJCXRoZUFyZ0J5dGVjb2RlW2lkeF0ub3BlcmFuZCAgID0gb3BlcmFuZDsKKwkJdGhlQXJnQnl0ZWNvZGVbaWR4XS5kdHlwZSAgICAgPSBkdHlwZTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXQoY29uc3QgYXZtX3NpemVfdCBpZHgsCisJCQlhdm1fYXJnX3Byb2Nlc3Nvcl90IHByb2Nlc3NvciwgYXZtX2FyZ19vcGVyYXRpb25fdCBvcGVyYXRpb24sCisJCQlhdm1fYXJnX29wZXJhbmRfdCBvcGVyYW5kLCBCYXNlVHlwZVNwZWNpZmllciAqIGR0eXBlID0gTlVMTCkKKwl7CisJCXRoZUFyZ0J5dGVjb2RlW2lkeF0ucHJvY2Vzc29yID0gcHJvY2Vzc29yOworCQl0aGVBcmdCeXRlY29kZVtpZHhdLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjsKKwkJdGhlQXJnQnl0ZWNvZGVbaWR4XS5vcGVyYW5kICAgPSBvcGVyYW5kOworCQl0aGVBcmdCeXRlY29kZVtpZHhdLmR0eXBlICAgICA9IGR0eXBlOworCX0KKworCWlubGluZSB2b2lkIHNldChjb25zdCBhdm1fc2l6ZV90IGlkeCwgYXZtX2FyZ19vcGVyYXRpb25fdCBvcGVyYXRpb24sCisJCQlhdm1fYXJnX29wZXJhbmRfdCBvcGVyYW5kLCBCYXNlVHlwZVNwZWNpZmllciAqIGR0eXBlID0gTlVMTCkKKwl7CisJCXRoZUFyZ0J5dGVjb2RlW2lkeF0ub3BlcmF0aW9uID0gb3BlcmF0aW9uOworCQl0aGVBcmdCeXRlY29kZVtpZHhdLm9wZXJhbmQgICA9IG9wZXJhbmQ7CisJCXRoZUFyZ0J5dGVjb2RlW2lkeF0uZHR5cGUgICAgID0gZHR5cGU7CisJfQorCisKKwlpbmxpbmUgYXZtX2FyZ19jb250ZXh0X3QgY29udGV4dChjb25zdCBhdm1fc2l6ZV90IGlkeCkKKwl7CisJCXJldHVybiggdGhlQXJnQnl0ZWNvZGVbaWR4XS5jb250ZXh0ICk7CisJfQorCisJaW5saW5lIHZvaWQgY29udGV4dChjb25zdCBhdm1fc2l6ZV90IGlkeCwgYXZtX2FyZ19jb250ZXh0X3QgY29udGV4dCkKKwl7CisJCXRoZUFyZ0J5dGVjb2RlW2lkeF0uY29udGV4dCA9IGNvbnRleHQ7CisJfQorCisKKwlpbmxpbmUgYXZtX2FyZ19wcm9jZXNzb3JfdCBwcm9jZXNzb3IoY29uc3QgYXZtX3NpemVfdCBpZHgpCisJeworCQlyZXR1cm4oIHRoZUFyZ0J5dGVjb2RlW2lkeF0ucHJvY2Vzc29yICk7CisJfQorCisJaW5saW5lIHZvaWQgcHJvY2Vzc29yKGNvbnN0IGF2bV9zaXplX3QgaWR4LCBhdm1fYXJnX3Byb2Nlc3Nvcl90IHByb2Nlc3NvcikKKwl7CisJCXRoZUFyZ0J5dGVjb2RlW2lkeF0ucHJvY2Vzc29yID0gcHJvY2Vzc29yOworCX0KKworCisJaW5saW5lIGF2bV9hcmdfb3BlcmF0aW9uX3Qgb3BlcmF0aW9uKGNvbnN0IGF2bV9zaXplX3QgaWR4KQorCXsKKwkJcmV0dXJuKCB0aGVBcmdCeXRlY29kZVtpZHhdLm9wZXJhdGlvbiApOworCX0KKworCWlubGluZSB2b2lkIG9wZXJhdGlvbihjb25zdCBhdm1fc2l6ZV90IGlkeCwgYXZtX2FyZ19vcGVyYXRpb25fdCBvcGVyYXRpb24pCisJeworCQl0aGVBcmdCeXRlY29kZVtpZHhdLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjsKKwl9CisKKworCWlubGluZSBhdm1fYXJnX29wZXJhbmRfdCBvcGVyYW5kKGNvbnN0IGF2bV9zaXplX3QgaWR4KQorCXsKKwkJcmV0dXJuKCB0aGVBcmdCeXRlY29kZVtpZHhdLm9wZXJhbmQgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBvcGVyYW5kKGNvbnN0IGF2bV9zaXplX3QgaWR4LCBhdm1fYXJnX29wZXJhbmRfdCBvcGVyYW5kKQorCXsKKwkJdGhlQXJnQnl0ZWNvZGVbaWR4XS5vcGVyYW5kID0gb3BlcmFuZDsKKwl9CisKKworCisJaW5saW5lIGF2bV9zaXplX3Qgb2Zmc2V0KGNvbnN0IGF2bV9zaXplX3QgaWR4KQorCXsKKwkJcmV0dXJuKCB0aGVBcmdCeXRlY29kZVtpZHhdLm9mZnNldCApOworCX0KKworCWlubGluZSB2b2lkIG9mZnNldChjb25zdCBhdm1fc2l6ZV90IGlkeCwgYXZtX3NpemVfdCBvZmZzZXQpCisJeworCQl0aGVBcmdCeXRlY29kZVtpZHhdLm9mZnNldCA9IG9mZnNldDsKKwl9CisKKworCWlubGluZSBCYXNlVHlwZVNwZWNpZmllciAqIGR0eXBlKGNvbnN0IGF2bV9zaXplX3QgaWR4KQorCXsKKwkJcmV0dXJuKCB0aGVBcmdCeXRlY29kZVtpZHhdLmR0eXBlICk7CisJfQorCisJaW5saW5lIHZvaWQgZHR5cGUoY29uc3QgYXZtX3NpemVfdCBpZHgsIEJhc2VUeXBlU3BlY2lmaWVyICogZHR5cGUpCisJeworCQl0aGVBcmdCeXRlY29kZVtpZHhdLmR0eXBlID0gZHR5cGU7CisJfQorCisKKwkvKioKKwkgKiBjb21wdXRlIG1haW4gYnl0ZWNvZGUKKwkgKiBOT1BTIG9yIEVWQUxTCisJICovCisJdm9pZCBjb21wdXRlTWFpbkJ5dGVjb2RlKAorCQkJYm9vbCB1cGRhdGVNYWluQnl0ZUNvZGVJZk5PUFMsIGF2bV9hcmdfb3BlcmF0aW9uX3Qgb3BNYXNrKTsKKworCWlubGluZSB2b2lkIGNvbXB1dGVNYWluQnl0ZWNvZGUoYXZtX2FyZ19jb250ZXh0X3QgYUNvbnRleHQsCisJCQlhdm1fYXJnX3Byb2Nlc3Nvcl90IGFQcm9jZXNzb3IsIGF2bV9hcmdfb3BlcmF0aW9uX3QgYW5PcGVyYXRpb24sCisJCQlhdm1fYXJnX29wZXJhbmRfdCBhbk9wZXJhbmQsIEJhc2VUeXBlU3BlY2lmaWVyICogYVR5cGUgPSBOVUxMKQorCXsKKwkJdGhlTWFpbkJ5dGVjb2RlLmNvbnRleHQgICA9IGFDb250ZXh0OworCQl0aGVNYWluQnl0ZWNvZGUucHJvY2Vzc29yID0gYVByb2Nlc3NvcjsKKwkJdGhlTWFpbkJ5dGVjb2RlLm9wZXJhdGlvbiA9IGFuT3BlcmF0aW9uOworCQl0aGVNYWluQnl0ZWNvZGUub3BlcmFuZCAgID0gYW5PcGVyYW5kOworCQl0aGVNYWluQnl0ZWNvZGUuZHR5cGUgICAgID0gYVR5cGU7CisKKwkJY29tcHV0ZU1haW5CeXRlY29kZSh0cnVlLCBBVk1fQVJHX1VOREVGSU5FRF9PUEVSQVRJT04pOworCX0KKworCWlubGluZSB2b2lkIGNvbXB1dGVNYWluQnl0ZWNvZGUoYXZtX3NpemVfdCByZWZCeXRlY29kZU9mZnNldCkKKwl7CisJCXRoZU1haW5CeXRlY29kZSA9IHRoZUFyZ0J5dGVjb2RlWyByZWZCeXRlY29kZU9mZnNldCBdOworCisJCWNvbXB1dGVNYWluQnl0ZWNvZGUodHJ1ZSwgQVZNX0FSR19VTkRFRklORURfT1BFUkFUSU9OKTsKKwl9CisKKworCXZvaWQgY29tcHV0ZUJ5dGVjb2RlKGJvb2wgdXBkYXRlTWFpbkJ5dGVDb2RlSWZOT1BTLAorCQkJY29uc3QgVmVjdG9yPCBBdm1CeXRlY29kZSA+ICYgdmVjdG9yT2ZBcmdPcGNvZGUpOworCisKKwkvKioKKwkgKiBub3BzIGJ5dGVjb2RlCisJICovCisJc3RhdGljIEF2bUluc3RydWN0aW9uICogbm9wc1VuYXJ5Q29kZShhdm1fYXJnX29wZXJhbmRfdCBvcGVyYW5kKTsKKworCisJLyoqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFNFUklBTElaQVRJT04KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlhdm1fc2l6ZV90IHRoZVNpemU7CisKKwlBdm1CeXRlY29kZSB0aGVNYWluQnl0ZWNvZGU7CisKKwlBdm1CeXRlY29kZSAqIHRoZUFyZ0J5dGVjb2RlOworCisKK3B1YmxpYzoKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gb3B0aW1pemUgQVBJIGZvciA8PCBbZGVjb2RlXSBldmFsID4+IHJvdXRpbmUKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlib29sICgqIHJvdXRpbmVfZGVjb2RlX2V2YWwpKEF2bUluc3RydWN0aW9uICosIEFSR1NfRU5WICYsIGNvbnN0IEJGICYpOworCisJaW5saW5lIGJvb2wgZGVjb2RlX2V2YWwoQVJHU19FTlYgJiBhcmdFTlYsIGNvbnN0IEJGICYgYXJnKQorCXsKKwkJcmV0dXJuKCByb3V0aW5lX2RlY29kZV9ldmFsKHRoaXMsIGFyZ0VOViwgYXJnKSApOworCX0KKworCisJYm9vbCAoKiByb3V0aW5lX2V2YWwpKEF2bUluc3RydWN0aW9uICosIEFSR1NfRU5WICYsIEF2bUNvZGUgKik7CisKKwlpbmxpbmUgYm9vbCBldmFsKEFSR1NfRU5WICYgYXJnRU5WLCBBdm1Db2RlICogYUNvZGUpCisJeworCQlyZXR1cm4oIHJvdXRpbmVfZXZhbCh0aGlzLCBhcmdFTlYsIGFDb2RlKSApOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIG9wdGltaXplIEFQSSBmb3IgPDwgW2RlY29kZV0gcnJ1biA+PiByb3V0aW5lCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJYm9vbCAoKiByb3V0aW5lX2RlY29kZV9ydW4pKEF2bUluc3RydWN0aW9uICosIEFSR1NfRU5WICYsIGNvbnN0IEJGICYpOworCisJaW5saW5lIGJvb2wgZGVjb2RlX3J1bihBUkdTX0VOViAmIGFyZ0VOViwgY29uc3QgQkYgJiBhcmcpCisJeworCQlyZXR1cm4oIHJvdXRpbmVfZGVjb2RlX3J1bih0aGlzLCBhcmdFTlYsIGFyZykgKTsKKwl9CisKKworCWJvb2wgKCogcm91dGluZV9ydW4pKEF2bUluc3RydWN0aW9uICosIEFSR1NfRU5WICYgYXJnRU5WLCBBdm1Db2RlICopOworCisJaW5saW5lIGJvb2wgcnVuKEFSR1NfRU5WICYgYXJnRU5WLCBBdm1Db2RlICogYUNvZGUpCisJeworCQlyZXR1cm4oIHJvdXRpbmVfcnVuKHRoaXMsIGFyZ0VOViwgYUNvZGUpICk7CisJfQorCisKK307CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKiBBVk1JTlNUUlVDVElPTl9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvaW5zdHJ1Y3Rpb24vSW5zdHJ1Y3Rpb25FbnZpcm9ubWVudC5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9pbnN0cnVjdGlvbi9JbnN0cnVjdGlvbkVudmlyb25tZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjViNTg4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvaW5zdHJ1Y3Rpb24vSW5zdHJ1Y3Rpb25FbnZpcm9ubWVudC5jcHAKQEAgLTAsMCArMSw0NTcwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTYgYXZyLiAyMDEyCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJJbnN0cnVjdGlvbkVudmlyb25tZW50LmgiCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSA8YnVpbGRlci9CdWlsZGVyLmg+CisKKyNpbmNsdWRlIDxjb21wdXRlci9CYXNlRW52aXJvbm1lbnQuaD4KKyNpbmNsdWRlIDxjb21wdXRlci9FdmFsdWF0aW9uRW52aXJvbm1lbnQuaD4KKyNpbmNsdWRlIDxjb21wdXRlci9FeGVjdXRpb25EYXRhRmFjdG9yeS5oPgorCisjaW5jbHVkZSA8Y29tcHV0ZXIvaW5zdHJ1Y3Rpb24vQXZtSW5zdHJ1Y3Rpb24uaD4KKworI2luY2x1ZGUgPGZtbC9idWZmZXIvQmFzZUJ1ZmZlckZvcm0uaD4KKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVMaWIuaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mQnVmZmVyLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZkNvbm5lY3QuaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mRGF0YS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZNYWNoaW5lLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZlBvcnQuaD4KKworI2luY2x1ZGUgPGZtbC9vcGVyYXRvci9PcGVyYXRvci5oPgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQXZtQ29kZS5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0J1aWx0aW5BcnJheS5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0J1aWx0aW5RdWV1ZS5oPgorI2luY2x1ZGUgPGZtbC9idWlsdGluL0NoYXJhY3Rlci5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25Db21wYXJlci5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25Db25zdHJ1Y3Rvci5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25Db25zdHJ1Y3RvckltcGwuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9TdGF0ZW1lbnRGYWN0b3J5Lmg+CisjaW5jbHVkZSA8Zm1sL2J1aWx0aW4vU3RyaW5nLmg+CisKKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25Db25maWd1cmF0aW9uLmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvTG9jYWxSdW50aW1lLmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvUnVudGltZUxpYi5oPgorCisjaW5jbHVkZSA8Zm1sL3R5cGUvQ29udGFpbmVyVHlwZVNwZWNpZmllci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvKioKKyAqIENPTlNUUlVDVE9SCisgKiBEZWZhdWx0CisgKi8KK0luc3RydWN0aW9uRW52aXJvbm1lbnQ6Okluc3RydWN0aW9uRW52aXJvbm1lbnQoQmFzZUVudmlyb25tZW50ICYgRU5WKQorOiBBdm1PYmplY3QoICksCittQVJHKCBuZXdBUkdTKCZFTlYsIEVOVi5pbkVELCBFTlYuaW5DT0RFLT5zaXplKCkpICksCitpdEFSRyggbUFSRyApCit7CisJLy8hISBOT1RISU5HCit9CisKK0luc3RydWN0aW9uRW52aXJvbm1lbnQ6Okluc3RydWN0aW9uRW52aXJvbm1lbnQoCisJCUJhc2VFbnZpcm9ubWVudCAmIEVOViwgYXZtX3NpemVfdCBjb3VudCkKKzogQXZtT2JqZWN0KCApLAorbUFSRyggbmV3QVJHUygmRU5WLCBFTlYuaW5FRCwgY291bnQpICksCitpdEFSRyggbUFSRyApCit7CisJLy8hISBOT1RISU5HCit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDQUNIRSBNQU5BR0VSCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworTGlzdDwgQVJHU19FTlYgKiA+ICBJbnN0cnVjdGlvbkVudmlyb25tZW50OjpBUkdTX0VOVl9DQUNIRTsKKworCit2b2lkIEluc3RydWN0aW9uRW52aXJvbm1lbnQ6OmluaXRDYWNoZSgpCit7CisJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDAgOworCQkJb2Zmc2V0IDwgQVJHU19FTlZfSU5JVElBTF9DQUNIRV9DT1VOVCA7ICsrb2Zmc2V0ICkKKwl7CisJCUFSR1NfRU5WX0NBQ0hFLmFwcGVuZCggbmV3IEFSR1NfRU5WKE5VTEwsIEFQRXhlY3V0aW9uRGF0YTo6UkVGX05VTEwsCisJCQkJQVJHU19FTlZfREVGQVVMVF9DQVBBQ0lUWSwgMCkgKTsKKwl9Cit9CisKKwordm9pZCBJbnN0cnVjdGlvbkVudmlyb25tZW50OjpmaW5hbGl6ZUNhY2hlKCkKK3sKKwlhdm1fc2l6ZV90IGZpbmFsQ2FjaGVTaXplID0gMDsKKworCXdoaWxlKCBBUkdTX0VOVl9DQUNIRS5ub25lbXB0eSgpICkKKwl7CisvL0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIENPTVBVVElORyAsIFNUQVRFTUVOVCApCisvLwkJQVZNX09TX1RSQUNFIDw8ICJBUkdTX0VOVjo6ZmluYWxpemU6PiBAIgorLy8JCQkJPDwgYXZtX2FkZHJlc3NfdCggQVJHU19FTlZfQ0FDSEUubGFzdCgpICkgPDwgc3RkOjplbmRsOworLy9BVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBDT01QVVRJTkcgLCBTVEFURU1FTlQgKQorCisJCSsrZmluYWxDYWNoZVNpemU7CisJCWRlbGV0ZSggQVJHU19FTlZfQ0FDSEUucG9wX2xhc3QoKSApOworCX0KKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNUQVRFTUVOVCApCisJQVZNX09TX1RSQUNFIDw8ICJBUkdTX0VOVjo6ZmluYWxpemUjY2FjaGU6PiBjb3VudCA9ICIgPDwgZmluYWxDYWNoZVNpemUKKwkJCTw8IHN0ZDo6ZW5kbDsKKworCUFWTV9PU19UUkFDRSA8PCAiQVJHU19FTlY6OkNBTEw6PiBjb3VudCA9ICIKKwkJCTw8IEFSR1NfRU5WOjpDQUxMX0NPVU5UIDw8IHN0ZDo6ZW5kbAorCQkJPDwgIkFSR1NfRU5WOjpDQUxMPEdpTmFDOj4gY291bnQgPSAiCisJCQk8PCBBUkdTX0VOVjo6Q0FMTF9DT1VOVF9HSU5BQyA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU1RBVEVNRU5UICkKK30KKworCitBUkdTX0VOViAqIEluc3RydWN0aW9uRW52aXJvbm1lbnQ6Om5ld0FSR1MoQmFzZUVudmlyb25tZW50ICogRU5WLAorCQljb25zdCBBUEV4ZWN1dGlvbkRhdGEgJiBhbkVELCBhdm1fc2l6ZV90IGNvdW50KQoreworCUFSR1NfRU5WICogYXJnID0gTlVMTDsKKworCWlmKCBBUkdTX0VOVl9DQUNIRS5ub25lbXB0eSgpICYmCisJCShBUkdTX0VOVl9DQUNIRS5sYXN0KCktPmNhcGFjaXR5ID4gY291bnQpICkKKwl7CisJCUFSR1NfRU5WX0NBQ0hFLnBvcF9sYXN0X3RvKCBhcmcgKTsKKworCQlhcmctPkVOViA9IEVOVjsKKwkJYXJnLT5vdXRFRCA9IGFuRUQ7CisKKwkJYXJnLT50YWJsZS5yZXNpemUoIGFyZy0+Y291bnQgPSBjb3VudCApOworCQlhcmctPnZhbHVlcyA9ICYgKCBhcmctPnRhYmxlICk7CisKKwkJYXJnLT5pZHggPSAwOworCQlhcmctPk5FWFQgPSBOVUxMOworCX0KKwllbHNlCisJeworCQlhcmcgPSBuZXcgQVJHU19FTlYoRU5WLCBhbkVELCBjb3VudCArIEFSR1NfRU5WX0lOQ1JfQ0FQQUNJVFksIGNvdW50KTsKKworCQlBVk1fT1NfQVNTRVJUX09VVF9PRl9NRU1PUllfRVhJVCggYXJnICkKKwkJCQk8PCAiQmFzZUVudmlyb25tZW50OjpuZXdBUkdTICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisJfQorCisvL0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIENPTVBVVElORyAsIFNUQVRFTUVOVCApCisvLwlBVk1fT1NfVFJBQ0UgPDwgIkFSR1NfRU5WOjpuZXc6PiBAIiA8PCBhdm1fYWRkcmVzc190KCBhcmcgKQorLy8JCQk8PCBzdGQ6OmVuZGw7CisvL0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIENPTVBVVElORyAsIFNUQVRFTUVOVCApCisKKwlyZXR1cm4oIGFyZyApOworfQorCisKK3ZvaWQgSW5zdHJ1Y3Rpb25FbnZpcm9ubWVudDo6ZnJlZUFSR1MoQVJHU19FTlYgKiAmIGFyZykKK3sKKwlpZiggYXJnLT5ORVhUID09IE5VTEwgKQorCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIENPTVBVVElORyAsIFNUQVRFTUVOVCApCisJCUFWTV9PU19UUkFDRSA8PCAiQVJHU19FTlY6OmZyZWU6PiBAIiA8PCBhdm1fYWRkcmVzc190KCBhcmcgKQorCQkJCTw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIENPTVBVVElORyAsIFNUQVRFTUVOVCApCisJCUFSR1NfRU5WX0NBQ0hFLmFwcGVuZCggYXJnICk7CisJfQorCWVsc2UKKwl7CisJCWZvciggQVJHU19FTlYgKiBuZXh0QXJnID0gYXJnIDsgYXJnICE9IE5VTEwgOyBhcmcgPSBuZXh0QXJnICkKKwkJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgQ09NUFVUSU5HICwgU1RBVEVNRU5UICkKKwkJCUFWTV9PU19UUkFDRSA8PCAiQVJHU19FTlY6OmZyZWU6PiBAIiA8PCBhdm1fYWRkcmVzc190KCBhcmcgKQorCQkJCQk8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBDT01QVVRJTkcgLCBTVEFURU1FTlQgKQorCisJCQluZXh0QXJnID0gYXJnLT5ORVhUOworCQkJYXJnLT5ORVhUID0gTlVMTDsKKwkJCUFSR1NfRU5WX0NBQ0hFLmFwcGVuZCggYXJnICk7CisJCX0KKwl9CisKKwlhcmcgPSBOVUxMOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gCSBERUNPREUgRVZBTAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2F2bV9zaXplX3QgIEFSR1NfRU5WOjpDQUxMX0NPVU5UID0gMDsKKworYXZtX3NpemVfdCAgQVJHU19FTlY6OkNBTExfQ09VTlRfR0lOQUMgPSAwOworCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLyAJIERFQ09ERSBFVkFMIENPTlRFWFQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIEFSR1NfRU5WOjptYWluX2RlY29kZV9ldmFsKEJGQ29kZSAmIGluQ09ERSkKK3sKKwlBVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoIGluQ09ERS0+aGFzSW5zdHJ1Y3Rpb24oKSApCisJCQk8PCAiQVJHU19FTlY6Om1haW5fZGVjb2RlX2V2YWwgOj4gIgorCQkJIlVuZXhwZWN0ZWQgYSBjb2RlIHdpdGhvdXQgaW5zdHJ1Y3Rpb24gISEhIgorCQkJPDwgU0VORF9FWElUOworCisJaWYoIChhcmdzSW5zdHJ1Y3Rpb24gPSBpbkNPREUtPmdldEluc3RydWN0aW9uKCkpLT5pc05vcENQVSgpICkKKwl7CisJCWN1cnJlbnQoIGluQ09ERSApOworCisJCXJldHVybiggdHJ1ZSApOworCX0KKwllbHNlCisJeworCQlhcmdzQnl0ZWNvZGUgPSBhcmdzSW5zdHJ1Y3Rpb24tPmdldEJ5dGVjb2RlKCk7CisKKwkJcmV0dXJuKCBkZWNvZGVfZXZhbF9wcm9jZXNzb3IoIGFyZ3NJbnN0cnVjdGlvbi0+Z2V0TWFpbkJ5dGVjb2RlKCksCisJCQkJaW5DT0RFLT50bzwgQXZtQ29kZSA+KCkgKSApOworCX0KK30KKworCitib29sIEFSR1NfRU5WOjptYWluX2RlY29kZV9ldmFsX2FyZ3MoQXZtQ29kZSAqIGluQ09ERSkKK3sKKwlBVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoIGNvdW50ID09IGluQ09ERS0+c2l6ZSgpICkKKwkJCTw8ICJJbnZhbGlkIHN0YXRlbWVudCBBUkdVTUVOVFMgaW5pdGlhbGl6YXRpb24gISEhXG4iCisJCQk8PCBpbkNPREUtPnRvU3RyaW5nKCBBVk1fVEFCMV9JTkRFTlQgKQorCQkJPDwgU0VORF9FWElUOworCisJYXJnc0luc3RydWN0aW9uID0gaW5DT0RFLT5nZXRJbnN0cnVjdGlvbigpOworCWlmKCAoYXJnc0luc3RydWN0aW9uID09IE5VTEwpIHx8IGFyZ3NJbnN0cnVjdGlvbi0+aXNOb3BzKCkgfHwKKwkJKGFyZ3NCeXRlY29kZSA9IGFyZ3NJbnN0cnVjdGlvbi0+Z2V0Qnl0ZWNvZGUoKSlbMF0uaXNOb3BzT3BlcmF0aW9uKCkgKQorCXsKKwkJdmFsdWVzID0gJiggaW5DT0RFLT5nZXRBcmdzKCkgKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgQ09NUFVUSU5HICwgU1RBVEVNRU5UICkKKwlBVk1fT1NfVFJBQ0UgPDwgImFyZ3Nbbm9wc106Pj4iIDw8IEFWTV9TVFJfSU5ERU5UOworCWFyZ3NTdHJlYW0oQVZNX09TX1RSQUNFKTsKKwlBVk1fT1NfVFJBQ0UgPDwgRU5EX0lOREVOVF9FT0w7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBDT01QVVRJTkcgLCBTVEFURU1FTlQgKQorCisJCXJldHVybiggdHJ1ZSApOworCX0KKworCWVsc2Ugc3dpdGNoKCBhcmdzSW5zdHJ1Y3Rpb24tPmdldE1haW5Db250ZXh0KCkgKQorCXsKKwkJY2FzZSBBVk1fQVJHX1NUQU5EQVJEX0NUWDoKKwkJeworCQkJcmV0dXJuKCBkZWNvZGVfZXZhbF9hcmdzX3Byb2Nlc3NvcigKKwkJCQkJYXJnc0luc3RydWN0aW9uLT5nZXRNYWluQnl0ZWNvZGUoKSwgaW5DT0RFKSApOworCQl9CisKKwkJY2FzZSBBVk1fQVJHX0FSR1VNRU5UX0NUWDoKKwkJY2FzZSBBVk1fQVJHX1BBUkFNRVRFUl9DVFg6CisJCWNhc2UgQVZNX0FSR19SRVRVUk5fQ1RYOgorCQl7CisJCQlyZXR1cm4oIGRlY29kZV9ldmFsX2FyZ3NfcHJvY2Vzc29yKAorCQkJCQlhcmdzSW5zdHJ1Y3Rpb24tPmdldE1haW5CeXRlY29kZSgpLCBpbkNPREUpICk7CisJCX0KKworCQljYXNlIEFWTV9BUkdfVU5ERUZJTkVEX0NPTlRFWFQ6CisJCWRlZmF1bHQ6CisJCXsKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KK30KKworCitib29sIEFSR1NfRU5WOjpkZWNvZGVfZXZhbF9hcmdzX2NvbnRleHQoCisJCUF2bUJ5dGVjb2RlICYgYnl0ZWNvZGUsIEF2bUNvZGUgKiBpbkNPREUpCit7CisvLwlBVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoIGNvdW50ID09IGluQ09ERS0+c2l6ZSgpICkKKy8vCQkJPDwgIkludmFsaWQgc3RhdGVtZW50IEFSR1VNRU5UUyBpbml0aWFsaXphdGlvbiAhISFcbiIKKy8vCQkJPDwgaW5DT0RFLT50b1N0cmluZyggQVZNX1RBQjFfSU5ERU5UICkKKy8vCQkJPDwgU0VORF9FWElUOworLy8KKy8vCWFyZ3NJbnN0cnVjdGlvbiA9IGluQ09ERS0+Z2V0SW5zdHJ1Y3Rpb24oKTsKKy8vCWlmKCAoYXJnc0luc3RydWN0aW9uID09IE5VTEwpIHx8IGFyZ3NJbnN0cnVjdGlvbi0+aXNOb3BzKCkgfHwKKy8vCQkoYXJnc0J5dGVjb2RlID0gYXJnc0luc3RydWN0aW9uLT5nZXRCeXRlY29kZSgpKVswXS5pc05vcHMoKSApCisvLwl7CisvLwkJdmFsdWVzID0gJiggaW5DT0RFLT5nZXRBcmdzKCkgKTsKKy8vCisvLwkJcmV0dXJuKCB0cnVlICk7CisvLwl9CisKKwlzd2l0Y2goIGJ5dGVjb2RlLmNvbnRleHQgKQorCXsKKwkJY2FzZSBBVk1fQVJHX1NUQU5EQVJEX0NUWDoKKwkJeworCQkJcmV0dXJuKCBkZWNvZGVfZXZhbF9hcmdzX3Byb2Nlc3NvcihieXRlY29kZSwgaW5DT0RFKSApOworCQl9CisKKwkJY2FzZSBBVk1fQVJHX0FSR1VNRU5UX0NUWDoKKwkJY2FzZSBBVk1fQVJHX1BBUkFNRVRFUl9DVFg6CisJCWNhc2UgQVZNX0FSR19SRVRVUk5fQ1RYOgorCQl7CisJCQlyZXR1cm4oIGRlY29kZV9ldmFsX2FyZ3NfcHJvY2Vzc29yKGJ5dGVjb2RlLCBpbkNPREUpICk7CisJCX0KKworCQljYXNlIEFWTV9BUkdfVU5ERUZJTkVEX0NPTlRFWFQ6CisJCWRlZmF1bHQ6CisJCXsKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vIAkgREVDT0RFIEVWQUwgUFJPQ0VTU09SCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBBUkdTX0VOVjo6ZGVjb2RlX2V2YWxfYXJnc19wcm9jZXNzb3IoCisJCUF2bUJ5dGVjb2RlICYgYnl0ZWNvZGUsIEF2bUNvZGUgKiBpbkNPREUpCit7CisJYXZtX3NpemVfdCBDVVJSRU5UX0NBTExfQ09VTlQ7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIENPTVBVVElORyAsIFNUQVRFTUVOVCApCisJQ1VSUkVOVF9DQUxMX0NPVU5UID0gKytBUkdTX0VOVjo6Q0FMTF9DT1VOVDsKKworCUFWTV9PU19UUkFDRSA8PCAiYXJnc1siIDw8IENVUlJFTlRfQ0FMTF9DT1VOVCA8PCAiXTo8PCAiOworCWluQ09ERS0+dG9EZWJ1ZyggQVZNX09TX1RSQUNFIDw8IEFWTV9TUENfSU5ERU5UICkgPDwgRU5EX0lOREVOVF9FT0w7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBDT01QVVRJTkcgLCBTVEFURU1FTlQgKQorCisJYXJnc0J5dGVjb2RlID0gKGFyZ3NJbnN0cnVjdGlvbiA9IGluQ09ERS0+Z2V0SW5zdHJ1Y3Rpb24oKSktPmdldEJ5dGVjb2RlKCk7CisKKwlpZiggYXJnc0luc3RydWN0aW9uLT5pc05vcHMoKSB8fCBhcmdzQnl0ZWNvZGVbMF0uaXNOb3BzT3BlcmF0aW9uKCkgKQorCXsKKwkJdmFsdWVzID0gJiggaW5DT0RFLT5nZXRBcmdzKCkgKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgQ09NUFVUSU5HICwgU1RBVEVNRU5UICkKKwlBVk1fT1NfVFJBQ0UgPDwgImFyZ3Nbbm9wczoiIDw8IENVUlJFTlRfQ0FMTF9DT1VOVCA8PCAiPl06Pj4iOworCWFyZ3NTdHJlYW0oIEFWTV9PU19UUkFDRSA8PCBBVk1fU1RSX0lOREVOVCApOworCUFWTV9PU19UUkFDRSA8PCBFTkRfSU5ERU5UX0VPTDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIENPTVBVVElORyAsIFNUQVRFTUVOVCApCisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisJQXZtQ29kZTo6aXRlcmF0b3IgaXQgPSBpbkNPREUtPmJlZ2luKCk7CisJZm9yKCBiZWdpbigpIDsgaGFzTmV4dCgpIDsgKytpdCAsIG5leHQoKSApCisJeworCQlzd2l0Y2goIGFyZ3NCeXRlY29kZVtpZHhdLnByb2Nlc3NvciApCisJCXsKKwkJCWNhc2UgQVZNX0FSR19OT1BfQ1BVOgorCQkJeworCQkJCWN1cnJlbnQoICppdCApOworCisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIEFWTV9BUkdfTk9QU19DUFU6CisJCQl7CisJCQkJY3VycmVudF9uZXh0KCAqaXQgKTsKKwkJCQlmb3IoICsraXQgOyBoYXNOZXh0KCkgOyArK2l0ICkKKwkJCQl7CisJCQkJCWN1cnJlbnRfbmV4dCggKml0ICk7CisJCQkJfQorCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNhc2UgQVZNX0FSR19NRU1PUllfTFZBTFVFX0NQVToKKwkJCXsKKwkJCQlpZiggZXZhbF9wcm9jZXNzb3JfZG1hX2x2YWx1ZShhcmdzQnl0ZWNvZGVbaWR4XSwgKml0KSApCisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCX0KKwkJCX0KKworCQkJY2FzZSBBVk1fQVJHX01FTU9SWV9XVkFMVUVfQ1BVOgorCQkJeworCQkJCWlmKCBldmFsX3Byb2Nlc3Nvcl9kbWFfd3ZhbHVlKGFyZ3NCeXRlY29kZVtpZHhdLCAqaXQpICkKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJfQorCQkJfQorCisJCQljYXNlIEFWTV9BUkdfTUVNT1JZX1JWQUxVRV9DUFU6CisJCQl7CisJCQkJaWYoIGV2YWxfcHJvY2Vzc29yX2RtYV9ydmFsdWUoYXJnc0J5dGVjb2RlW2lkeF0sICppdCkgKQorCQkJCXsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCQl9CisJCQl9CisKKwkJCWNhc2UgQVZNX0FSR19NRU1PUllfTUFDSElORV9DUFU6CisJCQl7CisJCQkJaWYoIGV2YWxfcHJvY2Vzc29yX2RtYV9tYWNoaW5lKGFyZ3NCeXRlY29kZVtpZHhdLCAqaXQpICkKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJfQorCQkJfQorCisJCQljYXNlIEFWTV9BUkdfQVJJVEhNRVRJQ19MT0dJQ19DUFU6CisJCQl7CisJCQkJaWYoIGV2YWxfcHJvY2Vzc29yX2FsdShhcmdzQnl0ZWNvZGVbaWR4XSwgKml0KSApCisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCX0KKwkJCX0KKworCisJCQljYXNlIEFWTV9BUkdfQ0hBUkFDVEVSX0NQVToKKwkJCXsKKwkJCQlpZiggZXZhbF9wcm9jZXNzb3JfY2hhcmFjdGVyKGFyZ3NCeXRlY29kZVtpZHhdLCAqaXQpICkKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJfQorCQkJfQorCisJCQljYXNlIEFWTV9BUkdfU1RSSU5HX0NQVToKKwkJCXsKKwkJCQlpZiggZXZhbF9wcm9jZXNzb3Jfc3RyaW5nKGFyZ3NCeXRlY29kZVtpZHhdLCAqaXQpICkKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJfQorCQkJfQorCisJCQljYXNlIEFWTV9BUkdfQVJSQVlfTFZBTFVFX0NQVToKKwkJCXsKKwkJCQlpZiggZXZhbF9wcm9jZXNzb3JfYXJyYXlfbHZhbHVlKGFyZ3NCeXRlY29kZVtpZHhdLCAqaXQpICkKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJfQorCQkJfQorCQkJY2FzZSBBVk1fQVJHX0FSUkFZX1JWQUxVRV9DUFU6CisJCQl7CisJCQkJaWYoIGV2YWxfcHJvY2Vzc29yX2FycmF5X3J2YWx1ZShhcmdzQnl0ZWNvZGVbaWR4XSwgKml0KSApCisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCX0KKwkJCX0KKworCQkJY2FzZSBBVk1fQVJHX1ZFQ1RPUl9DUFU6CisJCQl7CisJCQkJaWYoIGV2YWxfcHJvY2Vzc29yX3ZlY3RvcihhcmdzQnl0ZWNvZGVbaWR4XSwgKml0KSApCisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCX0KKwkJCX0KKworCQkJY2FzZSBBVk1fQVJHX1FVRVVFX0NQVToKKwkJCWNhc2UgQVZNX0FSR19MSVNUX0NQVToKKwkJCWNhc2UgQVZNX0FSR19DT0xMRUNUSU9OX0NQVToKKwkJCXsKKwkJCQlpZiggZXZhbF9wcm9jZXNzb3JfY29sbGVjdGlvbihhcmdzQnl0ZWNvZGVbaWR4XSwgKml0KSApCisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCX0KKwkJCX0KKworCQkJY2FzZSBBVk1fQVJHX0JVRkZFUl9DUFU6CisJCQl7CisJCQkJaWYoIGV2YWxfcHJvY2Vzc29yX2J1ZmZlcihhcmdzQnl0ZWNvZGVbaWR4XSwgKml0KSApCisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCX0KKwkJCX0KKworCQkJY2FzZSBBVk1fQVJHX1NUQVRFTUVOVF9DUFU6CisJCQl7CisJCQkJaWYoIGV2YWxfcHJvY2Vzc29yX3N0YXRlbWVudCgKKwkJCQkJCWFyZ3NCeXRlY29kZVtpZHhdLCAoKml0KS50b19wdHI8IEF2bUNvZGUgPigpKSApCisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCX0KKwkJCX0KKworCQkJY2FzZSBBVk1fQVJHX1VOREVGSU5FRF9QUk9DRVNTT1I6CisJCQlkZWZhdWx0OgorCQkJeworCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQk8PCAiQVJHU19FTlY6OmRlY29kZV9ldmFsX3Byb2Nlc3NvciA6PiAiCisJCQkJCQkJIlVuZXhwZWN0ZWQgYnl0ZWNvZGU8cHJvY2Vzc29yPiA8PCAiCisJCQkJCQk8PCBhcmdzQnl0ZWNvZGVbaWR4XS5zdHJDb2RlKCkKKwkJCQkJCTw8ICIgPj4gZm9yIDogIiA8PCAoKml0KS5zdHIoKSA8PCAiICEhISIKKwkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBDT01QVVRJTkcgLCBTVEFURU1FTlQgKQorCUFWTV9PU19UUkFDRSA8PCAiYXJnc1siIDw8IENVUlJFTlRfQ0FMTF9DT1VOVCA8PCAiXTo+PiIgPDwgQVZNX1NUUl9JTkRFTlQ7CisJYXJnc1N0cmVhbShBVk1fT1NfVFJBQ0UpOworCUFWTV9PU19UUkFDRSA8PCBFTkRfSU5ERU5UX0VPTDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIENPTVBVVElORyAsIFNUQVRFTUVOVCApCisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCitib29sIEFSR1NfRU5WOjpkZWNvZGVfZXZhbF9wcm9jZXNzb3IoCisJCUF2bUJ5dGVjb2RlICYgYnl0ZWNvZGUsIEF2bUNvZGUgKiBpbkNPREUpCit7CisJc3dpdGNoKCBieXRlY29kZS5wcm9jZXNzb3IgKQorCXsKKy8vCQljYXNlIEFWTV9BUkdfTk9fT1BFUkFUSU9OX0NQVToKKy8vCQl7CisvLwkJCWN1cnJlbnQoIGluQ09ERSApOworLy8KKy8vCQkJcmV0dXJuKCB0cnVlICk7CisvLwkJfQorLy8KKy8vCQljYXNlIEFWTV9BUkdfTUVNT1JZX0xWQUxVRV9DUFU6CisvLwkJeworLy8JCQlyZXR1cm4oIGV2YWxfcHJvY2Vzc29yX2RtYV9sdmFsdWUoYnl0ZWNvZGUsIGluQ09ERSkgKTsKKy8vCQl9CisvLworLy8JCWNhc2UgQVZNX0FSR19NRU1PUllfV1ZBTFVFX0NQVToKKy8vCQl7CisvLwkJCXJldHVybiggZXZhbF9wcm9jZXNzb3JfZG1hX3d2YWx1ZShieXRlY29kZSwgaW5DT0RFKSApOworLy8JCX0KKworCQljYXNlIEFWTV9BUkdfTUVNT1JZX1JWQUxVRV9DUFU6CisJCXsKKwkJCXJldHVybiggZXZhbF9wcm9jZXNzb3JfZG1hX3J2YWx1ZShieXRlY29kZSwgaW5DT0RFKSApOworCQl9CisKKwkJY2FzZSBBVk1fQVJHX01FTU9SWV9NQUNISU5FX0NQVToKKwkJeworCQkJcmV0dXJuKCBldmFsX3Byb2Nlc3Nvcl9kbWFfbWFjaGluZShieXRlY29kZSwgaW5DT0RFKSApOworCQl9CisKKwkJY2FzZSBBVk1fQVJHX0FSSVRITUVUSUNfTE9HSUNfQ1BVOgorCQl7CisJCQlyZXR1cm4oIGV2YWxfcHJvY2Vzc29yX2FsdShieXRlY29kZSwgaW5DT0RFKSApOworCQl9CisKKworCQljYXNlIEFWTV9BUkdfQ0hBUkFDVEVSX0NQVToKKwkJeworCQkJcmV0dXJuKCBldmFsX3Byb2Nlc3Nvcl9jaGFyYWN0ZXIoYnl0ZWNvZGUsIGluQ09ERSkgKTsKKwkJfQorCisJCWNhc2UgQVZNX0FSR19TVFJJTkdfQ1BVOgorCQl7CisJCQlyZXR1cm4oIGV2YWxfcHJvY2Vzc29yX3N0cmluZyhieXRlY29kZSwgaW5DT0RFKSApOworCQl9CisKKy8vCQljYXNlIEFWTV9BUkdfQVJSQVlfTFZBTFVFX0NQVToKKy8vCQl7CisvLwkJCXJldHVybiggZXZhbF9wcm9jZXNzb3JfYXJyYXlfbHZhbHVlKGJ5dGVjb2RlLCBpbkNPREUpICk7CisvLwkJfQorLy8JCWNhc2UgQVZNX0FSR19BUlJBWV9SVkFMVUVfQ1BVOgorLy8JCXsKKy8vCQkJcmV0dXJuKCBldmFsX3Byb2Nlc3Nvcl9hcnJheV9ydmFsdWUoYnl0ZWNvZGUsIGluQ09ERSkgKTsKKy8vCQl9CisKKwkJY2FzZSBBVk1fQVJHX1ZFQ1RPUl9DUFU6CisJCXsKKwkJCXJldHVybiggZXZhbF9wcm9jZXNzb3JfdmVjdG9yKGJ5dGVjb2RlLCBpbkNPREUpICk7CisJCX0KKworCQljYXNlIEFWTV9BUkdfUVVFVUVfQ1BVOgorCQljYXNlIEFWTV9BUkdfTElTVF9DUFU6CisJCWNhc2UgQVZNX0FSR19DT0xMRUNUSU9OX0NQVToKKwkJeworCQkJcmV0dXJuKCBldmFsX3Byb2Nlc3Nvcl9jb2xsZWN0aW9uKGJ5dGVjb2RlLCBpbkNPREUpICk7CisJCX0KKworCQljYXNlIEFWTV9BUkdfQlVGRkVSX0NQVToKKwkJeworCQkJcmV0dXJuKCBldmFsX3Byb2Nlc3Nvcl9idWZmZXIoYnl0ZWNvZGUsIGluQ09ERSkgKTsKKwkJfQorCisJCWNhc2UgQVZNX0FSR19TVEFURU1FTlRfQ1BVOgorCQl7CisJCQlyZXR1cm4oIGV2YWxfcHJvY2Vzc29yX3N0YXRlbWVudChieXRlY29kZSwgaW5DT0RFKSApOworCQl9CisKKwkJY2FzZSBBVk1fQVJHX1VOREVGSU5FRF9QUk9DRVNTT1I6CisJCWRlZmF1bHQ6CisJCXsKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCTw8ICJBUkdTX0VOVjo6ZGVjb2RlX2V2YWxfcHJvY2Vzc29yIDo+ICIKKwkJCQkJCSJVbmV4cGVjdGVkIGJ5dGVjb2RlPHByb2Nlc3Nvcj4gPDwgIgorCQkJCQk8PCBieXRlY29kZS5zdHJDb2RlKCkgPDwgIiA+PiBmb3IgOiAiCisJCQkJCTw8IGluQ09ERS0+c3RyRGVidWcoKSA8PCAiICEhISIKKwkJCQkJPDwgU0VORF9FWElUOworCisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKwl9Cit9CisKKworYm9vbCBBUkdTX0VOVjo6ZGVjb2RlX2V2YWxfcHJvY2Vzc29yKEF2bUJ5dGVjb2RlICYgYnl0ZWNvZGUsIEJGICYgYXJnKQoreworCXN3aXRjaCggYnl0ZWNvZGUucHJvY2Vzc29yICkKKwl7CisJCWNhc2UgQVZNX0FSR19OT1BfQ1BVOgorCQljYXNlIEFWTV9BUkdfTk9QU19DUFU6CisJCXsKKwkJCWN1cnJlbnQoIGFyZyApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWNhc2UgQVZNX0FSR19NRU1PUllfTFZBTFVFX0NQVToKKwkJeworCQkJcmV0dXJuKCBldmFsX3Byb2Nlc3Nvcl9kbWFfbHZhbHVlKGJ5dGVjb2RlLCBhcmcpICk7CisJCX0KKworCQljYXNlIEFWTV9BUkdfTUVNT1JZX1dWQUxVRV9DUFU6CisJCXsKKwkJCXJldHVybiggZXZhbF9wcm9jZXNzb3JfZG1hX3d2YWx1ZShieXRlY29kZSwgYXJnKSApOworCQl9CisKKwkJY2FzZSBBVk1fQVJHX01FTU9SWV9SVkFMVUVfQ1BVOgorCQl7CisJCQlyZXR1cm4oIGV2YWxfcHJvY2Vzc29yX2RtYV9ydmFsdWUoYnl0ZWNvZGUsIGFyZykgKTsKKwkJfQorCisJCWNhc2UgQVZNX0FSR19NRU1PUllfTUFDSElORV9DUFU6CisJCXsKKwkJCXJldHVybiggZXZhbF9wcm9jZXNzb3JfZG1hX21hY2hpbmUoYnl0ZWNvZGUsIGFyZykgKTsKKwkJfQorCisJCWNhc2UgQVZNX0FSR19BUklUSE1FVElDX0xPR0lDX0NQVToKKwkJeworCQkJcmV0dXJuKCBldmFsX3Byb2Nlc3Nvcl9hbHUoYnl0ZWNvZGUsIGFyZykgKTsKKwkJfQorCisKKwkJY2FzZSBBVk1fQVJHX0NIQVJBQ1RFUl9DUFU6CisJCXsKKwkJCXJldHVybiggZXZhbF9wcm9jZXNzb3JfY2hhcmFjdGVyKGJ5dGVjb2RlLCBhcmcpICk7CisJCX0KKworCQljYXNlIEFWTV9BUkdfU1RSSU5HX0NQVToKKwkJeworCQkJcmV0dXJuKCBldmFsX3Byb2Nlc3Nvcl9zdHJpbmcoYnl0ZWNvZGUsIGFyZykgKTsKKwkJfQorCisJCWNhc2UgQVZNX0FSR19BUlJBWV9MVkFMVUVfQ1BVOgorCQl7CisJCQlyZXR1cm4oIGV2YWxfcHJvY2Vzc29yX2FycmF5X2x2YWx1ZShieXRlY29kZSwgYXJnKSApOworCQl9CisJCWNhc2UgQVZNX0FSR19BUlJBWV9SVkFMVUVfQ1BVOgorCQl7CisJCQlyZXR1cm4oIGV2YWxfcHJvY2Vzc29yX2FycmF5X3J2YWx1ZShieXRlY29kZSwgYXJnKSApOworCQl9CisKKwkJY2FzZSBBVk1fQVJHX1ZFQ1RPUl9DUFU6CisJCXsKKwkJCXJldHVybiggZXZhbF9wcm9jZXNzb3JfdmVjdG9yKGJ5dGVjb2RlLCBhcmcpICk7CisJCX0KKworCQljYXNlIEFWTV9BUkdfUVVFVUVfQ1BVOgorCQljYXNlIEFWTV9BUkdfTElTVF9DUFU6CisJCWNhc2UgQVZNX0FSR19DT0xMRUNUSU9OX0NQVToKKwkJeworCQkJcmV0dXJuKCBldmFsX3Byb2Nlc3Nvcl9jb2xsZWN0aW9uKGJ5dGVjb2RlLCBhcmcpICk7CisJCX0KKworCQljYXNlIEFWTV9BUkdfQlVGRkVSX0NQVToKKwkJeworCQkJcmV0dXJuKCBldmFsX3Byb2Nlc3Nvcl9idWZmZXIoYnl0ZWNvZGUsIGFyZykgKTsKKwkJfQorCisJCWNhc2UgQVZNX0FSR19TVEFURU1FTlRfQ1BVOgorCQl7CisJCQlyZXR1cm4oIGV2YWxfcHJvY2Vzc29yX3N0YXRlbWVudCgKKwkJCQkJYnl0ZWNvZGUsIChhcmcpLnRvX3B0cjwgQXZtQ29kZSA+KCkpICk7CisJCX0KKworCQljYXNlIEFWTV9BUkdfVU5ERUZJTkVEX1BST0NFU1NPUjoKKwkJZGVmYXVsdDoKKwkJeworCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJPDwgIkFSR1NfRU5WOjpkZWNvZGVfZXZhbF9wcm9jZXNzb3IgOj4gIgorCQkJCQkJIlVuZXhwZWN0ZWQgYnl0ZWNvZGU8cHJvY2Vzc29yPiA8PCAiCisJCQkJCTw8IGJ5dGVjb2RlLnN0ckNvZGUoKSA8PCAiID4+IGZvciA6ICIKKwkJCQkJPDwgYXJnLnN0cigpIDw8ICIgISEhIgorCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KK30KKworCitCRiBBUkdTX0VOVjo6cmV0dXJuX2RlY29kZV9ldmFsX3Byb2Nlc3NvcihBdm1CeXRlY29kZSAmIGJ5dGVjb2RlLCBCRiAmIGFyZykKK3sKKwlJbnN0cnVjdGlvbkVudmlyb25tZW50IEVWQUxfQVJHKEVOViwgb3V0RUQsIDEpOworCWlmKCBFVkFMX0FSRy5tQVJHLT5kZWNvZGVfZXZhbF9wcm9jZXNzb3IoYnl0ZWNvZGUsIGFyZykgKQorCXsKKwkJcmV0dXJuKCBFVkFMX0FSRy5tQVJHLT5hdCgwKSApOworCX0KKwllbHNlCisJeworCQlyZXR1cm4oIGFyZyApOworCX0KK30KKworYm9vbCBBUkdTX0VOVjo6ZGVjb2RlX2V2YWxfcHJvY2Vzc29yKEJGQ29kZSAmIGFDb2RlKQoreworCWlmKCBub3QgYUNvZGUtPmhhc0luc3RydWN0aW9uKCkgKQorCXsKKwkJaWYoIG5vdCBFTlYtPmdldEJ1aWxkZXIoKS5nZXRBdm1jb2RlQ29tcGlsZXIoKS5vcHRpbWl6ZUV2YWxFeHByZXNzaW9uKAorCQkJCUVOVi0+aW5FRC0+Z2V0UGFyYW1ldGVyc1JJRCgpLmdldEV4ZWN1dGFibGUoKSwgYUNvZGUpICkKKwkJeworCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJPDwgIkFSR1NfRU5WOjpkZWNvZGVfZXZhbF9wcm9jZXNzb3IgOj4gIgorCQkJCQkJIlVuZXhwZWN0ZWQgYSBjb2RlIHdpdGhvdXQgaW5zdHJ1Y3Rpb24gPDwgIgorCQkJCQk8PCBhQ29kZS0+c3RyKCkgPDwgIiA+PiAhISEiCisJCQkJCTw8IFNFTkRfRVhJVDsKKwkJfQorCX0KKworCXJldHVybiggZGVjb2RlX2V2YWxfcHJvY2Vzc29yKAorCQkJYUNvZGUtPmdldEluc3RydWN0aW9uKCktPmdldE1haW5CeXRlY29kZSgpLCBhQ29kZSkgKTsKK30KKworQkYgQVJHU19FTlY6OnJldHVybl9kZWNvZGVfZXZhbF9wcm9jZXNzb3IoQkZDb2RlICYgYUNvZGUpCit7CisJSW5zdHJ1Y3Rpb25FbnZpcm9ubWVudCBFVkFMX0FSRyhFTlYsIG91dEVELCAxKTsKKwlpZiggRVZBTF9BUkcubUFSRy0+ZGVjb2RlX2V2YWxfcHJvY2Vzc29yKGFDb2RlKSApCisJeworCQlyZXR1cm4oIEVWQUxfQVJHLm1BUkctPmF0KDApICk7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiggQkY6OlJFRl9OVUxMICk7CisJfQorfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gRVZBTCBQUk9DRVNTT1IgTUVNT1JZIFVGSSBQT0lOVEVSCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCisgKiBFVkFMIFBST0NFU1NPUiA8IEFWTV9BUkdfTUVNT1JZX1VGSV9QT0lOVEVSX0NQVSA+CisgKi8KK2Jvb2wgQVJHU19FTlY6OmV2YWxfcHJvY2Vzc29yX2RtYV9sdmFsdWVfdWZpX3BvaW50ZXIoCisJCUF2bUJ5dGVjb2RlICYgYnl0ZWNvZGUsIEJGICYgYXJnKQoreworCUluc3RhbmNlT2ZEYXRhICogbHZhbHVlID0gYXJnLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpOworCisJYXZtX3NpemVfdCAqIGFSZWxhdGl2ZU9mZnNldFBhdGggPQorCQkJbmV3IGF2bV9zaXplX3RbIGx2YWx1ZS0+Z2V0RGF0YVBhdGgoKS0+c2l6ZSgpICsgMSBdOworCisJSW5zdGFuY2VPZkRhdGEgKiBhUm9vdCA9IGx2YWx1ZTsKKwlpZiggbHZhbHVlLT5nZXRNb2RpZmllcigpLmhhc05hdHVyZVJlZmVyZW5jZSgpICkKKwl7CisJCWFSb290ID0gRU5WLT5nZXRSdmFsdWUob3V0RUQsIGx2YWx1ZS0+Z2V0QWxpYXNUYXJnZXQoKS0+dG88CisJCQkJSW5zdGFuY2VPZkRhdGEgPigpKS5hc19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKTsKKwl9CisKKwlhUmVsYXRpdmVPZmZzZXRQYXRoWzBdID0gYVJvb3QtPmdldE9mZnNldCgpOworCisJSW5zdGFuY2VPZkRhdGEgKiBwdHJWYWx1ZSA9CisJCQluZXcgSW5zdGFuY2VPZkRhdGEobHZhbHVlLCBhUm9vdCwgYVJlbGF0aXZlT2Zmc2V0UGF0aCk7CisKKwljdXJyZW50KCBCRiggcHRyVmFsdWUgKSApOworCisJLy8gRm9yIEFycmF5IFZhbHVlIFNpemUKKwlCRiBydmFsdWU7CisKKwlpZiggcHRyVmFsdWUtPmhhc1J1bnRpbWVDb250YWluZXJSSUQoKSApCisJeworCQlydmFsdWUgPSBvdXRFRC0+Z2V0UnVudGltZSggcHRyVmFsdWUtPmdldFJ1bnRpbWVDb250YWluZXJSSUQoKSApLgorCQkJCWdldERhdGEoIHB0clZhbHVlLT5nZXRPZmZzZXQoKSApOworCX0KKwllbHNlCisJeworCQlSdW50aW1lSUQgYURhdGFSSUQ7CisKKwkJaWYoIEVOVi0+Z2V0UnVudGltZUZvcm0ob3V0RUQsIG91dEVELT5tUklELCBwdHJWYWx1ZSwgYURhdGFSSUQpICkKKwkJeworCQkJcHRyVmFsdWUtPnNldFJ1bnRpbWVDb250YWluZXJSSUQoIGFEYXRhUklEICk7CisKKwkJCXJ2YWx1ZSA9IG91dEVELT5nZXRSdW50aW1lKGFEYXRhUklEKS5nZXREYXRhKCBwdHJWYWx1ZS0+Z2V0T2Zmc2V0KCkgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCUxvY2FsUnVudGltZSBhTG9jYWxSdW50aW1lOworCQkJaWYoIEVOVi0+Z2V0UnVudGltZUZvcm0ob3V0RUQsIGx2YWx1ZSwgYUxvY2FsUnVudGltZSkgKQorCQkJeworCQkJCXJ2YWx1ZSA9IGFMb2NhbFJ1bnRpbWUuZ2V0RGF0YVRhYmxlKCkuYXQoIHB0clZhbHVlLT5nZXRPZmZzZXQoKSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQk8PCAiQVJHU19FTlY6OmV2YWxfcHJvY2Vzc29yX2RtYV9sdmFsdWVfdWZpX3BvaW50ZXI6PiAiCisJCQkJCQkJIkZhaWxlZCB0byBmb3VuZCBkYXRhIHRhYmxlIGZvciB0aGUgIgorCQkJCQkJCSJpbnN0YW5jZSBvZiBkYXRhIDo+XG4iCisJCQkJCQk8PCBwdHJWYWx1ZS0+dG9TdHJpbmcoIEFWTV9UQUIxX0lOREVOVCApCisJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQljdXJyZW50KCBhcmcgKTsKKworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJfQorCX0KKworCVRhYmxlT2ZTeW1ib2w6Oml0ZXJhdG9yIGl0UGF0aCA9IGx2YWx1ZS0+Z2V0RGF0YVBhdGgoKS0+YmVnaW4oKTsKKwlUYWJsZU9mU3ltYm9sOjppdGVyYXRvciBlbmRQYXRoID0gbHZhbHVlLT5nZXREYXRhUGF0aCgpLT5lbmQoKTsKKwlmb3IoIGF2bV9zaXplX3QgayA9IDEgOyBpdFBhdGggIT0gZW5kUGF0aCA7ICsraywgKytpdFBhdGggKQorCXsKKwkJc3dpdGNoKCAoKml0UGF0aCkuZ2V0UG9pbnRlck5hdHVyZSgpICkKKwkJeworCQkJY2FzZSBJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfRklFTERfQ0xBU1NfQVRUUklCVVRFX05BVFVSRToKKwkJCWNhc2UgSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX0ZJRUxEX0FSUkFZX09GRlNFVF9OQVRVUkU6CisJCQl7CisJCQkJYVJlbGF0aXZlT2Zmc2V0UGF0aFtrXSA9ICgqaXRQYXRoKS5nZXRPZmZzZXQoKTsKKworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfRklFTERfQVJSQVlfSU5ERVhfTkFUVVJFOgorCQkJeworCQkJCUJGIGJmT2Zmc2V0ID0gcmV0dXJuX2RlY29kZV9ldmFsX3J2YWx1ZSggKCppdFBhdGgpLmdldFZhbHVlKCkgKTsKKwkJCQlpZiggYmZPZmZzZXQuaW52YWxpZCgpICkKKwkJCQl7CisJCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQkJPDwgICJGYWlsZWQgdG8gZXZhbCBBUlJBWSBpbmRleCA8PCAiCisJCQkJCQkJPDwgKCppdFBhdGgpLnN0clZhbHVlKCkKKwkJCQkJCQk8PCAiID4+IGluIHZhcmlhYmxlIDw8ICIgPDwgKCppdFBhdGgpLnN0cigpCisJCQkJCQkJPDwgIiA+PiBmb3Igd3JpdGluZyBpbiBWVlQgISEhIgorCQkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJfQorCisJCQkJaWYoIGJmT2Zmc2V0LmlzTnVtZXJpYygpICkKKwkJCQl7CisJCQkJCUFWTV9PU19BU1NFUlRfRkFUQUxfQVJSQVlfT0ZGU0VUX0VYSVQoIGJmT2Zmc2V0LnRvSW50ZWdlcigpLAorCQkJCQkJc3RhdGljX2Nhc3Q8IGF2bV9pbnRlZ2VyX3QgPihydmFsdWUuc2l6ZSgpKSApCisJCQkJCQkJPDwgIkZhaWxlZCB0byB3cml0ZSBpbiBBUlJBWSB3aXRoIGluZGV4IDw8ICIKKwkJCQkJCQk8PCBiZk9mZnNldC50b0ludGVnZXIoKSA8PCAiID4+IGluIHZhcmlhYmxlIDw8ICIKKwkJCQkJCQk8PCBsdmFsdWUtPnN0cigpIDw8ICIgPj4gZm9yIHdyaXRpbmcgaW4gVlZUICEhISIKKwkJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQkJYVJlbGF0aXZlT2Zmc2V0UGF0aFtrXSA9IGJmT2Zmc2V0LnRvSW50ZWdlcigpOworCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWVsc2UKKwkJCQl7CisJCQkJCWF2bV9zaXplX3Qgb2Zmc2V0ID0gRU5WLT5nZW5OdW1lcmljT2Zmc2V0KAorCQkJCQkJCW91dEVELCBvdXRFRC0+bVJJRCwgKCppdFBhdGgpLAorCQkJCQkJCWJmT2Zmc2V0LCAwLCAocnZhbHVlLnNpemUoKSAtIDEpICk7CisKKwkJCQkJaWYoIG9mZnNldCAhPSBBVk1fTlVNRVJJQ19NQVhfU0laRV9UICkKKwkJCQkJeworCQkJCQkJYVJlbGF0aXZlT2Zmc2V0UGF0aFtrXSA9IG9mZnNldDsKKworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlvdXRFRC5td3NldEFFRVMoIEFFRVNfU1lNQk9MSUNfRVhFQ1VUSU9OX0xJTUlUQVRJT04gKTsKKworCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQk8PCAiQmFzZUVudmlyb25tZW50OjpzZXREYXRhOj4gIgorCQkJCQkJCSJ1bmV4cGVjdGVkIE5PTi1JTlRFR0VSIEFSUkFZIElOREVYIDw8ICIKKwkJCQkJCTw8IGJmT2Zmc2V0LnN0cigpIDw8ICIgPj4gaW4gaW5zdGFuY2UgRlFOLUlEIDo+XG4iCisJCQkJCQk8PCBsdmFsdWUtPnRvU3RyaW5nKCBBVk1fVEFCMV9JTkRFTlQgKQorCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJfQorCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJPDwgIkFSR1NfRU5WOjpldmFsX3Byb2Nlc3Nvcl9kbWFfbHZhbHVlX3VmaV9wb2ludGVyOj4gIgorCQkJCQkJIlVuZXhwZWN0ZWQgUE9JTlRFUiBOQVRVUkUgZm9yIHRoZSBpbnN0YW5jZSBvZiBkYXRhIDo+XG4iCisJCQkJCQk8PCBsdmFsdWUtPnRvU3RyaW5nKCBBVk1fVEFCMV9JTkRFTlQgKQorCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJfQorCQl9CisKKwkJcnZhbHVlLm1vdmVBdCggYVJlbGF0aXZlT2Zmc2V0UGF0aFtrXSApOworCisJCWlmKCAoKml0UGF0aCkuZ2V0TW9kaWZpZXIoKS5oYXNOYXR1cmVSZWZlcmVuY2UoKSApCisJCXsKKwkJCXJ2YWx1ZSA9IEVOVi0+Z2V0UnZhbHVlKG91dEVELCBydmFsdWUuYXNfcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCkgKTsKKwkJfQorCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKK2Jvb2wgQVJHU19FTlY6OmV2YWxfcHJvY2Vzc29yX2RtYV93dmFsdWVfdWZpX3BvaW50ZXIoCisJCUF2bUJ5dGVjb2RlICYgYnl0ZWNvZGUsIEJGICYgYXJnKQoreworCUluc3RhbmNlT2ZEYXRhICogbHZhbHVlID0gYXJnLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpOworCisJVGFibGVPZlN5bWJvbDo6aXRlcmF0b3IgaXRQYXRoID0gbHZhbHVlLT5nZXREYXRhUGF0aCgpLT5iZWdpbigpOworCVRhYmxlT2ZTeW1ib2w6Oml0ZXJhdG9yIGVuZFBhdGggPSBsdmFsdWUtPmdldERhdGFQYXRoKCktPmVuZCgpOworCisJaWYoIGx2YWx1ZS0+Z2V0TW9kaWZpZXIoKS5oYXNOYXR1cmVSZWZlcmVuY2UoKSApCisJeworCQlsdmFsdWUgPSBFTlYtPmdldFJ2YWx1ZShvdXRFRCwgbHZhbHVlLT5nZXRBbGlhc1RhcmdldCgpLT50bzwKKwkJCQlJbnN0YW5jZU9mRGF0YSA+KCkpLmFzX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpOworCX0KKworCS8vIEZvciBBcnJheSBWYWx1ZSBTaXplCisJQkYgcnZhbHVlOworCisJaWYoIGx2YWx1ZS0+aGFzUnVudGltZUNvbnRhaW5lclJJRCgpICkKKwl7CisJCXJ2YWx1ZSA9IG91dEVELmdldFdyaXRhYmxlUnVudGltZSgKKwkJCQlsdmFsdWUtPmdldFJ1bnRpbWVDb250YWluZXJSSUQoKSApLgorCQkJCQkJZ2V0V3JpdGFibGVEYXRhKCBsdmFsdWUtPmdldE9mZnNldCgpICk7CisJfQorCWVsc2UKKwl7CisJCVJ1bnRpbWVJRCBhRGF0YVJJRDsKKworCQlpZiggRU5WLT5nZXRSdW50aW1lRm9ybShvdXRFRCwgb3V0RUQtPm1SSUQsIGx2YWx1ZSwgYURhdGFSSUQpICkKKwkJeworCQkJcnZhbHVlID0gb3V0RUQuZ2V0V3JpdGFibGVSdW50aW1lRGF0YVRhYmxlKGFEYXRhUklEKS0+CisJCQkJCWdldFdyaXRhYmxlKCBsdmFsdWUtPmdldE9mZnNldCgpICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlMb2NhbFJ1bnRpbWUgYUxvY2FsUnVudGltZTsKKwkJCWlmKCBFTlYtPmdldFJ1bnRpbWVGb3JtKG91dEVELCBsdmFsdWUsIGFMb2NhbFJ1bnRpbWUpICkKKwkJCXsKKwkJCQlvdXRFRC5tYWtlTW9kaWZpYWJsZUxvY2FsUnVudGltZSggYUxvY2FsUnVudGltZSApOworCisJCQkJcnZhbHVlID0gYUxvY2FsUnVudGltZS5nZXREYXRhVGFibGUoKS4KKwkJCQkJCWdldFdyaXRhYmxlKCBsdmFsdWUtPmdldE9mZnNldCgpICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJCTw8ICJBUkdTX0VOVjo6ZXZhbF9wcm9jZXNzb3JfZG1hX3J2YWx1ZV91ZmlfcG9pbnRlcjo+ICIKKwkJCQkJCQkiRmFpbGVkIHRvIGZvdW5kIGRhdGEgdGFibGUgZm9yIHRoZSAiCisJCQkJCQkJImluc3RhbmNlIG9mIGRhdGEgOj5cbiIKKwkJCQkJCTw8IGx2YWx1ZS0+dG9TdHJpbmcoIEFWTV9UQUIxX0lOREVOVCApCisJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQljdXJyZW50KCBhcmcgKTsKKworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJfQorCX0KKworCWZvciggYXZtX3NpemVfdCBvZmZzZXQgPSAwOyBpdFBhdGggIT0gZW5kUGF0aCA7ICsraXRQYXRoICkKKwl7CisJCXN3aXRjaCggKCppdFBhdGgpLmdldFBvaW50ZXJOYXR1cmUoKSApCisJCXsKKwkJCWNhc2UgSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX0ZJRUxEX0NMQVNTX0FUVFJJQlVURV9OQVRVUkU6CisJCQljYXNlIElQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9GSUVMRF9BUlJBWV9PRkZTRVRfTkFUVVJFOgorCQkJeworCQkJCW9mZnNldCA9ICgqaXRQYXRoKS5nZXRPZmZzZXQoKTsKKworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfRklFTERfQVJSQVlfSU5ERVhfTkFUVVJFOgorCQkJeworCQkJCUJGIGJmT2Zmc2V0ID0gcmV0dXJuX2RlY29kZV9ldmFsX3J2YWx1ZSggKCppdFBhdGgpLmdldFZhbHVlKCkgKTsKKwkJCQlpZiggYmZPZmZzZXQuaW52YWxpZCgpICkKKwkJCQl7CisJCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQkJPDwgICJGYWlsZWQgdG8gZXZhbCBBUlJBWSBpbmRleCA8PCAiCisJCQkJCQkJPDwgKCppdFBhdGgpLnN0clZhbHVlKCkKKwkJCQkJCQk8PCAiID4+IGluIHZhcmlhYmxlIDw8ICIgPDwgKCppdFBhdGgpLnN0cigpCisJCQkJCQkJPDwgIiA+PiBmb3Igd3JpdGluZyBpbiBWVlQgISEhIgorCQkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJfQorCisJCQkJaWYoIGJmT2Zmc2V0LmlzTnVtZXJpYygpICkKKwkJCQl7CisJCQkJCUFWTV9PU19BU1NFUlRfRkFUQUxfQVJSQVlfT0ZGU0VUX0VYSVQoIGJmT2Zmc2V0LnRvSW50ZWdlcigpLAorCQkJCQkJc3RhdGljX2Nhc3Q8IGF2bV9pbnRlZ2VyX3QgPihydmFsdWUuc2l6ZSgpKSApCisJCQkJCQkJPDwgIkZhaWxlZCB0byB3cml0ZSBpbiBBUlJBWSB3aXRoIGluZGV4IDw8ICIKKwkJCQkJCQk8PCBiZk9mZnNldC50b0ludGVnZXIoKSA8PCAiID4+IGluIHZhcmlhYmxlIDw8ICIKKwkJCQkJCQk8PCBsdmFsdWUtPnN0cigpIDw8ICIgPj4gZm9yIHdyaXRpbmcgaW4gVlZUICEhISIKKwkJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQkJb2Zmc2V0ID0gYmZPZmZzZXQudG9JbnRlZ2VyKCk7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJZWxzZQorCQkJCXsKKwkJCQkJb2Zmc2V0ID0gRU5WLT5nZW5OdW1lcmljT2Zmc2V0KCBvdXRFRCwgb3V0RUQtPm1SSUQsCisJCQkJCQkJKCppdFBhdGgpLCBiZk9mZnNldCwgMCwgKHJ2YWx1ZS5zaXplKCkgLSAxKSApOworCisJCQkJCWlmKCBvZmZzZXQgIT0gQVZNX05VTUVSSUNfTUFYX1NJWkVfVCApCisJCQkJCXsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCisJCQkJb3V0RUQubXdzZXRBRUVTKCBBRUVTX1NZTUJPTElDX0VYRUNVVElPTl9MSU1JVEFUSU9OICk7CisKKwkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJPDwgIkJhc2VFbnZpcm9ubWVudDo6c2V0RGF0YTo+ICIKKwkJCQkJCQkidW5leHBlY3RlZCBOT04tSU5URUdFUiBBUlJBWSBJTkRFWCA8PCAiCisJCQkJCQk8PCBiZk9mZnNldC5zdHIoKSA8PCAiID4+IGluIGluc3RhbmNlIEZRTi1JRCA6PlxuIgorCQkJCQkJPDwgbHZhbHVlLT50b1N0cmluZyggQVZNX1RBQjFfSU5ERU5UICkKKwkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJCTw8ICJBUkdTX0VOVjo6ZXZhbF9wcm9jZXNzb3JfZG1hX3d2YWx1ZV91ZmlfcG9pbnRlcjo+ICIKKwkJCQkJCSJVbmV4cGVjdGVkIFBPSU5URVIgTkFUVVJFIGZvciB0aGUgaW5zdGFuY2Ugb2YgZGF0YSA6PlxuIgorCQkJCQkJPDwgbHZhbHVlLT50b1N0cmluZyggQVZNX1RBQjFfSU5ERU5UICkKKwkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJfQorCisJCXJ2YWx1ZS5tb3ZlQXRXcml0YWJsZSggb2Zmc2V0ICk7CisKKwkJaWYoICgqaXRQYXRoKS5nZXRNb2RpZmllcigpLmhhc05hdHVyZVJlZmVyZW5jZSgpICkKKwkJeworCQkJcnZhbHVlID0gRU5WLT5nZXRXdmFsdWUob3V0RUQsIHJ2YWx1ZS5hc19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSApOworCQl9CisJfQorCisJY3VycmVudCggcnZhbHVlICk7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCitib29sIEFSR1NfRU5WOjpldmFsX3Byb2Nlc3Nvcl9kbWFfcnZhbHVlX3VmaV9wb2ludGVyKAorCQlBdm1CeXRlY29kZSAmIGJ5dGVjb2RlLCBCRiAmIGFyZykKK3sKKwlJbnN0YW5jZU9mRGF0YSAqIGx2YWx1ZSA9IGFyZy50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKTsKKworCVRhYmxlT2ZTeW1ib2w6Oml0ZXJhdG9yIGl0UGF0aCA9IGx2YWx1ZS0+Z2V0RGF0YVBhdGgoKS0+YmVnaW4oKTsKKwlUYWJsZU9mU3ltYm9sOjppdGVyYXRvciBlbmRQYXRoID0gbHZhbHVlLT5nZXREYXRhUGF0aCgpLT5lbmQoKTsKKworCWlmKCBsdmFsdWUtPmdldE1vZGlmaWVyKCkuaGFzTmF0dXJlUmVmZXJlbmNlKCkgKQorCXsKKwkJbHZhbHVlID0gRU5WLT5nZXRSdmFsdWUob3V0RUQsIGx2YWx1ZS0+Z2V0QWxpYXNUYXJnZXQoKS0+dG88CisJCQkJSW5zdGFuY2VPZkRhdGEgPigpKS5hc19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKTsKKwl9CisKKwkvLyBGb3IgQXJyYXkgVmFsdWUgU2l6ZQorCUJGIHJ2YWx1ZTsKKworCWlmKCBsdmFsdWUtPmhhc1J1bnRpbWVDb250YWluZXJSSUQoKSApCisJeworCQlydmFsdWUgPSBvdXRFRC0+Z2V0UnVudGltZSggbHZhbHVlLT5nZXRSdW50aW1lQ29udGFpbmVyUklEKCkgKS4KKwkJCQkJCWdldERhdGEoIGx2YWx1ZS0+Z2V0T2Zmc2V0KCkgKTsKKwl9CisJZWxzZQorCXsKKwkJUnVudGltZUlEIGFEYXRhUklEOworCisJCWlmKCBFTlYtPmdldFJ1bnRpbWVGb3JtKG91dEVELCBvdXRFRC0+bVJJRCwgbHZhbHVlLCBhRGF0YVJJRCkgKQorCQl7CisJCQlydmFsdWUgPSBvdXRFRC0+Z2V0UnVudGltZShhRGF0YVJJRCkuZ2V0RGF0YSggbHZhbHVlLT5nZXRPZmZzZXQoKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJTG9jYWxSdW50aW1lIGFMb2NhbFJ1bnRpbWU7CisJCQlpZiggRU5WLT5nZXRSdW50aW1lRm9ybShvdXRFRCwgbHZhbHVlLCBhTG9jYWxSdW50aW1lKSApCisJCQl7CisJCQkJcnZhbHVlID0gYUxvY2FsUnVudGltZS5nZXREYXRhVGFibGUoKS5hdCggbHZhbHVlLT5nZXRPZmZzZXQoKSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQk8PCAiQVJHU19FTlY6OmV2YWxfcHJvY2Vzc29yX2RtYV9ydmFsdWVfdWZpX3BvaW50ZXI6PiAiCisJCQkJCQkJIkZhaWxlZCB0byBmb3VuZCBkYXRhIHRhYmxlIGZvciB0aGUgIgorCQkJCQkJCSJpbnN0YW5jZSBvZiBkYXRhIDo+XG4iCisJCQkJCQk8PCBsdmFsdWUtPnRvU3RyaW5nKCBBVk1fVEFCMV9JTkRFTlQgKQorCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJY3VycmVudCggYXJnICk7CisKKwkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQl9CisJCX0KKwl9CisKKwlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMDsgaXRQYXRoICE9IGVuZFBhdGggOyArK2l0UGF0aCApCisJeworCQlzd2l0Y2goICgqaXRQYXRoKS5nZXRQb2ludGVyTmF0dXJlKCkgKQorCQl7CisJCQljYXNlIElQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9GSUVMRF9DTEFTU19BVFRSSUJVVEVfTkFUVVJFOgorCQkJY2FzZSBJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfRklFTERfQVJSQVlfT0ZGU0VUX05BVFVSRToKKwkJCXsKKwkJCQlvZmZzZXQgPSAoKml0UGF0aCkuZ2V0T2Zmc2V0KCk7CisKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX0ZJRUxEX0FSUkFZX0lOREVYX05BVFVSRToKKwkJCXsKKwkJCQlCRiBiZk9mZnNldCA9IHJldHVybl9kZWNvZGVfZXZhbF9ydmFsdWUoICgqaXRQYXRoKS5nZXRWYWx1ZSgpICk7CisJCQkJaWYoIGJmT2Zmc2V0LmludmFsaWQoKSApCisJCQkJeworCQkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJCTw8ICAiRmFpbGVkIHRvIGV2YWwgQVJSQVkgaW5kZXggPDwgIgorCQkJCQkJCTw8ICgqaXRQYXRoKS5zdHJWYWx1ZSgpCisJCQkJCQkJPDwgIiA+PiBpbiB2YXJpYWJsZSA8PCAiIDw8ICgqaXRQYXRoKS5zdHIoKQorCQkJCQkJCTw8ICIgPj4gZm9yIHdyaXRpbmcgaW4gVlZUICEhISIKKwkJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCX0KKworCQkJCWlmKCBiZk9mZnNldC5pc051bWVyaWMoKSApCisJCQkJeworCQkJCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX0FSUkFZX09GRlNFVF9FWElUKCBiZk9mZnNldC50b0ludGVnZXIoKSwKKwkJCQkJCXN0YXRpY19jYXN0PCBhdm1faW50ZWdlcl90ID4ocnZhbHVlLnNpemUoKSkgKQorCQkJCQkJCTw8ICJGYWlsZWQgdG8gd3JpdGUgaW4gQVJSQVkgd2l0aCBpbmRleCA8PCAiCisJCQkJCQkJPDwgYmZPZmZzZXQudG9JbnRlZ2VyKCkgPDwgIiA+PiBpbiB2YXJpYWJsZSA8PCAiCisJCQkJCQkJPDwgbHZhbHVlLT5zdHIoKSA8PCAiID4+IGZvciB3cml0aW5nIGluIFZWVCAhISEiCisJCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJCW9mZnNldCA9IGJmT2Zmc2V0LnRvSW50ZWdlcigpOworCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWVsc2UKKwkJCQl7CisJCQkJCW9mZnNldCA9IEVOVi0+Z2VuTnVtZXJpY09mZnNldChvdXRFRCwgb3V0RUQtPm1SSUQsCisJCQkJCQkJKCppdFBhdGgpLCBiZk9mZnNldCwgMCwgKHJ2YWx1ZS5zaXplKCkgLSAxKSApOworCisJCQkJCWlmKCBvZmZzZXQgIT0gQVZNX05VTUVSSUNfTUFYX1NJWkVfVCApCisJCQkJCXsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCisJCQkJb3V0RUQubXdzZXRBRUVTKCBBRUVTX1NZTUJPTElDX0VYRUNVVElPTl9MSU1JVEFUSU9OICk7CisKKwkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJPDwgIkJhc2VFbnZpcm9ubWVudDo6c2V0RGF0YTo+ICIKKwkJCQkJCQkidW5leHBlY3RlZCBOT04tSU5URUdFUiBBUlJBWSBJTkRFWCA8PCAiCisJCQkJCQk8PCBiZk9mZnNldC5zdHIoKSA8PCAiID4+IGluIGluc3RhbmNlIEZRTi1JRCA6PlxuIgorCQkJCQkJPDwgbHZhbHVlLT50b1N0cmluZyggQVZNX1RBQjFfSU5ERU5UICkKKwkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJCTw8ICJBUkdTX0VOVjo6ZXZhbF9wcm9jZXNzb3JfZG1hX3J2YWx1ZV91ZmlfcG9pbnRlcjo+ICIKKwkJCQkJCSJVbmV4cGVjdGVkIFBPSU5URVIgTkFUVVJFIGZvciB0aGUgaW5zdGFuY2Ugb2YgZGF0YSA6PlxuIgorCQkJCQkJPDwgbHZhbHVlLT50b1N0cmluZyggQVZNX1RBQjFfSU5ERU5UICkKKwkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJfQorCisJCXJ2YWx1ZS5tb3ZlQXQoIG9mZnNldCApOworCisJCWlmKCAoKml0UGF0aCkuZ2V0TW9kaWZpZXIoKS5oYXNOYXR1cmVSZWZlcmVuY2UoKSApCisJCXsKKwkJCXJ2YWx1ZSA9IEVOVi0+Z2V0UnZhbHVlKG91dEVELCBydmFsdWUuYXNfcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCkgKTsKKwkJfQorCX0KKworCWN1cnJlbnQoIHJ2YWx1ZSApOworCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLyBFVkFMIFBST0NFU1NPUiBNRU1PUlkgTFZBTFVFCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCisgKiBFVkFMIFBST0NFU1NPUiA8IEFWTV9BUkdfTUVNT1JZX0xWQUxVRV9DUFUgPgorICovCitib29sIEFSR1NfRU5WOjpldmFsX3Byb2Nlc3Nvcl9kbWFfbHZhbHVlKEF2bUJ5dGVjb2RlICYgYnl0ZWNvZGUsIEJGICYgYXJnKQoreworCXN3aXRjaCggYnl0ZWNvZGUub3BlcmFuZCApCisJeworCQljYXNlIEFWTV9BUkdfREFUQV9LSU5EOgorCQl7CisJCQljdXJyZW50KCBhcmcgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQljYXNlIEFWTV9BUkdfREFUQV9SRUZfS0lORDoKKwkJeworCQkJY3VycmVudCggRU5WLT5nZXRSdmFsdWUob3V0RUQsIGFyZy50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSkgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQljYXNlIEFWTV9BUkdfREFUQV9NQUNST19LSU5EOgorCQl7CisJCQljb25zdCBCRiAmIGx2YWx1ZSA9CisJCQkJCUVOVi0+Z2V0UnZhbHVlKG91dEVELCBhcmcudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCkpOworCisJCQlpZiggbHZhbHVlLmlzPCBJbnN0YW5jZU9mRGF0YSA+KCkgKQorCQkJeworCQkJCWN1cnJlbnQoIGx2YWx1ZSApOworCisJCQkJcmV0dXJuKCB0cnVlICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJCTw8ICJVbmV4cGVjdGVkIHRvIGV2YWxfcHJvY2Vzc29yX2RtYV9sdmFsdWUgPDwgIgorCQkJCQkJPDwgbHZhbHVlLnN0cigpIDw8ICIgPj4gZm9yIDogIiA8PCBhcmcuc3RyKCkgPDwgIiAhISEiCisJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQl9CisJCX0KKworCQljYXNlIEFWTV9BUkdfREFUQV9VRklfS0lORDoKKwkJeworCQkJcmV0dXJuKCBldmFsX3Byb2Nlc3Nvcl9kbWFfbHZhbHVlX3VmaV9wb2ludGVyKGJ5dGVjb2RlLCBhcmcpICk7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQk8PCAiQVJHU19FTlY6OmV2YWxfcHJvY2Vzc29yX2RtYV9sdmFsdWUgOj4gIgorCQkJCQkJIlVuZXhwZWN0ZWQgYXJnY29kZSA8PCAiIDw8IGJ5dGVjb2RlLnN0ckNvZGUoKQorCQkJCQk8PCAiID4+IGZvciA6ICIgPDwgYXJnLnN0cigpIDw8ICIgISEhIgorCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCWN1cnJlbnQoIGFyZyApOworCisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKwl9Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLyBFVkFMIFBST0NFU1NPUiBNRU1PUlkgV1ZBTFVFCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCisgKiBFVkFMIFBST0NFU1NPUiA8IEFWTV9BUkdfTUVNT1JZX1dWQUxVRV9DUFUgPgorICovCitib29sIEFSR1NfRU5WOjpldmFsX3Byb2Nlc3Nvcl9kbWFfd3ZhbHVlKEF2bUJ5dGVjb2RlICYgYnl0ZWNvZGUsIEJGICYgYXJnKQoreworCXN3aXRjaCggYnl0ZWNvZGUub3BlcmFuZCApCisJeworCQljYXNlIEFWTV9BUkdfREFUQV9LSU5EOgorCQl7CisJCQljdXJyZW50KCBFTlYtPmdldFd2YWx1ZShvdXRFRCwgYXJnLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpKSApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWNhc2UgQVZNX0FSR19EQVRBX1JFRl9LSU5EOgorCQl7CisJCQljdXJyZW50KCBFTlYtPmdldFd2YWx1ZShvdXRFRCwKKwkJCQkJRU5WLT5nZXRSdmFsdWUob3V0RUQsIGFyZy50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSkuCisJCQkJCWFzX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpICkpOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWNhc2UgQVZNX0FSR19EQVRBX01BQ1JPX0tJTkQ6CisJCXsKKwkJCWNvbnN0IEJGICYgbHZhbHVlID0gRU5WLT5nZXRSdmFsdWUob3V0RUQsCisJCQkJCWFyZy50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSk7CisKKwkJCWlmKCBsdmFsdWUuaXM8IEluc3RhbmNlT2ZEYXRhID4oKSApCisJCQl7CisJCQkJY3VycmVudCggRU5WLT5nZXRXdmFsdWUob3V0RUQsCisJCQkJCQlsdmFsdWUudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCkgKSk7CisKKwkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJPDwgIlVuZXhwZWN0ZWQgdG8gZXZhbF9wcm9jZXNzb3JfZG1hX3d2YWx1ZSA8PCAiCisJCQkJCQk8PCBsdmFsdWUuc3RyKCkgPDwgIiA+PiBmb3IgOiAiIDw8IGFyZy5zdHIoKSA8PCAiICEhISIKKwkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJfQorCisJCWNhc2UgQVZNX0FSR19EQVRBX1VGSV9LSU5EOgorCQl7CisJCQlyZXR1cm4oIGV2YWxfcHJvY2Vzc29yX2RtYV93dmFsdWVfdWZpX3BvaW50ZXIoYnl0ZWNvZGUsIGFyZykgKTsKKwkJfQorCisKKwkJY2FzZSBBVk1fQVJHX0JVRkZFUl9LSU5EOgorCQl7CisJCQljb25zdCBSdW50aW1lSUQgJiBhUklEID0gb3V0RUQtPmdldFJ1bnRpbWVDb250YWluZXJSSUQoCisJCQkJCWFyZy50b19wdHI8IEluc3RhbmNlT2ZCdWZmZXIgPigpKTsKKworCQkJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1NNQVJUX1BPSU5URVJfRVhJVCggYVJJRCApCisJCQkJCTw8ICJSSUQgY29udGFpbmVyIGZvciB0aGUgYnVmZmVyPCAiCisJCQkJCTw8IGFyZy50b19wdHI8IEluc3RhbmNlT2ZCdWZmZXIgPigpLT5zdHIoKSA8PCAiID4gISEhIgorCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCWN1cnJlbnQoIG91dEVELmdldFdyaXRhYmxlUnVudGltZSggYVJJRCApLmJmV3JpdGFibGVCdWZmZXIoCisJCQkJCWFyZy50b19wdHI8IEluc3RhbmNlT2ZCdWZmZXIgPigpICkgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQljYXNlIEFWTV9BUkdfQlVJTFRJTl9DT05UQUlORVJfS0lORDoKKwkJeworCQkJYXJnLm1ha2VXcml0YWJsZSgpOworCisJCQljdXJyZW50KCBhcmcgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQk8PCAiQVJHU19FTlY6OmV2YWxfcHJvY2Vzc29yX2RtYV93dmFsdWUgOj4gIgorCQkJCQkJIlVuZXhwZWN0ZWQgYXJnY29kZSA8PCAiIDw8IGJ5dGVjb2RlLnN0ckNvZGUoKQorCQkJCQk8PCAiID4+IGZvciA6ICIgPDwgYXJnLnN0cigpIDw8ICIgISEhIgorCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCWN1cnJlbnQoIGFyZyApOworCisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKwl9Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLyBFVkFMIFBST0NFU1NPUiBNRU1PUlkgUlZBTFVFCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCisgKiBFVkFMIFBST0NFU1NPUiA8IEFWTV9BUkdfTUVNT1JZX1JWQUxVRV9DUFUgPgorICovCitib29sIEFSR1NfRU5WOjpldmFsX3Byb2Nlc3Nvcl9kbWFfcnZhbHVlKEF2bUJ5dGVjb2RlICYgYnl0ZWNvZGUsIEJGICYgYXJnKQoreworCXN3aXRjaCggYnl0ZWNvZGUub3BlcmFuZCApCisJeworCQljYXNlIEFWTV9BUkdfREFUQV9LSU5EOgorCQl7CisJCQljdXJyZW50KCBFTlYtPmdldFJ2YWx1ZShvdXRFRCwgYXJnLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpKSApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWNhc2UgQVZNX0FSR19EQVRBX0NTVF9LSU5EOgorCQl7CisJCQljdXJyZW50KCBhcmcgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQljYXNlIEFWTV9BUkdfREFUQV9SRUZfS0lORDoKKwkJeworCQkJY3VycmVudCggRU5WLT5nZXRSdmFsdWUob3V0RUQsCisJCQkJCUVOVi0+Z2V0UnZhbHVlKG91dEVELCBhcmcudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCkpLgorCQkJCQlhc19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSkgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQljYXNlIEFWTV9BUkdfREFUQV9NQUNST19LSU5EOgorCQl7CisJCQlCRiAmIHJ2YWx1ZSAgPSBFTlYtPmdldFJ2YWx1ZShvdXRFRCwKKwkJCQkJYXJnLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpKTsKKworCQkJaWYoIHJ2YWx1ZS5pczwgSW5zdGFuY2VPZkRhdGEgPigpICkKKwkJCXsKKwkJCQljdXJyZW50KCBFTlYtPmdldFJ2YWx1ZShvdXRFRCwKKwkJCQkJCXJ2YWx1ZS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSApKTsKKworCQkJCXJldHVybiggdHJ1ZSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJldHVybiggZGVjb2RlX2V2YWxfcnZhbHVlKCBydmFsdWUgKSApOworCQkJfQorCQl9CisKKwkJY2FzZSBBVk1fQVJHX0RBVEFfVUZJX0tJTkQ6CisJCXsKKwkJCXJldHVybiggZXZhbF9wcm9jZXNzb3JfZG1hX3J2YWx1ZV91ZmlfcG9pbnRlcihieXRlY29kZSwgYXJnKSApOworCQl9CisKKwkJY2FzZSBBVk1fQVJHX0VYUFJFU1NJT05fS0lORDoKKwkJeworCQkJcmV0dXJuKCBldmFsX3Byb2Nlc3Nvcl9kbWFfcnZhbHVlKAorCQkJCQlieXRlY29kZSwgYXJnLnRvX3B0cjwgQXZtQ29kZSA+KCkpICk7CisJCX0KKworCQljYXNlIEFWTV9BUkdfQlVJTFRJTl9DT05UQUlORVJfS0lORDoKKwkJeworCQkJY3VycmVudCggYXJnICk7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJPDwgIkFSR1NfRU5WOjpldmFsX3Byb2Nlc3Nvcl9kbWFfcnZhbHVlIDo+ICIKKwkJCQkJCSJVbmV4cGVjdGVkIGFyZ2NvZGUgPDwgIiA8PCBieXRlY29kZS5zdHJDb2RlKCkKKwkJCQkJPDwgIiA+PiBmb3IgOiAiIDw8IGFyZy5zdHIoKSA8PCAiICEhISIKKwkJCQkJPDwgU0VORF9FWElUOworCisJCQljdXJyZW50KCBhcmcgKTsKKworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorfQorCisKK2Jvb2wgQVJHU19FTlY6OmV2YWxfcHJvY2Vzc29yX2RtYV9ydmFsdWUoQXZtQnl0ZWNvZGUgJiBieXRlY29kZSwgQXZtQ29kZSAqIGFDb2RlKQoreworCUluc3RydWN0aW9uRW52aXJvbm1lbnQgRVZBTF9BUkcoRU5WLCBvdXRFRCwgYUNvZGUtPnNpemUoKSk7CisJaWYoIEVWQUxfQVJHLm1BUkctPmRlY29kZV9ldmFsX2FyZ3NfcHJvY2Vzc29yKGJ5dGVjb2RlLCBhQ29kZSkgKQorCXsKKwkJb3V0RUQgPSBFVkFMX0FSRy5tQVJHLT5vdXRFRDsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCXN3aXRjaCggYUNvZGUtPmdldEF2bU9wQ29kZSgpICkKKwl7CisJCWNhc2UgQVZNX09QQ09ERV9BU1NJR046CisJCXsKKwkJCWN1cnJlbnQoIEVWQUxfQVJHLm1BUkctPmF0KDEpICk7CisKK0FWTV9JRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfQVNTSUdOTUVOVCApCitBVk1fT1NfVFJBQ0UgPDwgImRtYTpsdmFsdWU6PiAiCisJCTw8IHN0cl9oZWFkZXIoIEVWQUxfQVJHLm1BUkctPmF0KDApLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpICkKKwkJPDwgc3RkOjplbmRsCisJCTw8ICJkbWE6cnZhbHVlOj4gIiA8PCBFVkFMX0FSRy5tQVJHLT5hdCgxKS5zdHIoKQorCQk8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX0FTU0lHTk1FTlQgKQorCisJCQlyZXR1cm4oIEVOVi0+c2V0UnZhbHVlKCBvdXRFRCwKKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMCkudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCksCisJCQkJCUVWQUxfQVJHLm1BUkctPmF0KDEpICkpOworCQl9CisKKwkJY2FzZSBBVk1fT1BDT0RFX0FTU0lHTl9BRlRFUjoKKwkJeworCQkJY3VycmVudCggRU5WLT5nZXRSdmFsdWUoIG91dEVELAorCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgwKS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSApKTsKKworQVZNX0lGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9BU1NJR05NRU5UICkKK0FWTV9PU19UUkFDRSA8PCAiZG1hOmx2YWx1ZTo+ICIKKwkJPDwgc3RyX2hlYWRlciggRVZBTF9BUkcubUFSRy0+YXQoMCkudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCkgKQorCQk8PCBzdGQ6OmVuZGwKKwkJPDwgImRtYTpydmFsdWU6PiAiIDw8IEVWQUxfQVJHLm1BUkctPmF0KDEpLnN0cigpCisJCTw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfQVNTSUdOTUVOVCApCisKKwkJCWN1cnJlbnQoIEVWQUxfQVJHLm1BUkctPmF0KDEpICk7CisKKwkJCXJldHVybiggRU5WLT5zZXRSdmFsdWUoIG91dEVELAorCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgwKS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSwKKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMikgKSk7CisJCX0KKworCisJCWNhc2UgQVZNX09QQ09ERV9BU1NJR05fTkVXRlJFU0g6CisJCXsKKwkJCUJGTGlzdCBwYXJhbUxpc3Q7CisJCQlCRiBhTmV3U3ltYm9saWNDb25zdGFudCA9IEVOVi0+Y3JlYXRlTmV3RnJlc2hQYXJhbShvdXRFRC0+bVJJRCwKKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMCkudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCksIHBhcmFtTGlzdCApOworCisJCQljdXJyZW50KCBhTmV3U3ltYm9saWNDb25zdGFudCApOworCitBVk1fSUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX0FTU0lHTk1FTlQgKQorQVZNX09TX1RSQUNFIDw8ICJkbWE6bHZhbHVlOj4gIgorCQk8PCBzdHJfaGVhZGVyKCBFVkFMX0FSRy5tQVJHLT5hdCgwKS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSApCisJCTw8IHN0ZDo6ZW5kbAorCQk8PCAiZG1hOnJ2YWx1ZTo+ICIgPDwgYU5ld1N5bWJvbGljQ29uc3RhbnQuc3RyKCkKKwkJPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9BU1NJR05NRU5UICkKKworCQkJaWYoIEVOVi0+c2V0UnZhbHVlKG91dEVELCBFVkFMX0FSRy5tQVJHLT5hdCgwKS4KKwkJCQkJdG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCksIGFOZXdTeW1ib2xpY0NvbnN0YW50KSApCisJCQl7CisJCQkJRXhlY3V0aW9uRGF0YUZhY3Rvcnk6OmFwcGVuZElPRWxlbWVudFRyYWNlKG91dEVELAorCQkJCQlCRihuZXcgRXhlY3V0aW9uQ29uZmlndXJhdGlvbihvdXRFRC0+bVJJRCwKKwkJCQkJCVN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQVNTSUdOX05FV0ZSRVNILAorCQkJCQkJCUVWQUxfQVJHLm1BUkctPmF0KDApLCBhTmV3U3ltYm9saWNDb25zdGFudCkpKSk7CisKKwkJCQlvdXRFRC5hcHBlbmRQYXJhbWV0ZXJzKCBwYXJhbUxpc3QgKTsKKworCQkJCXJldHVybiggdHJ1ZSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJfQorCisvLwkJY2FzZSBBVk1fT1BDT0RFX0FTU0lHTl9SRVNFVDoKKworCQljYXNlIEFWTV9PUENPREVfQ1RPUjoKKwkJeworCQkJY3VycmVudCggRVZBTF9BUkcubUFSRy0+YXQoMCkgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQk8PCAiQVJHU19FTlY6OmV2YWxfcHJvY2Vzc29yX2RtYV9ydmFsdWUgOj4gIgorCQkJCQkiVW5leHBlY3RlZCBvcGNvZGUgPDwgIiA8PCBhQ29kZS0+c3RyRGVidWcoKSA8PCAiID4+ICEhISIKKwkJCQkJPDwgU0VORF9FWElUOworCisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKwl9Cit9CisKKworYm9vbCBBUkdTX0VOVjo6ZGVjb2RlX2V2YWxfcnZhbHVlKEJGICYgYXJnKQoreworCXN3aXRjaCggYXJnLmNsYXNzS2luZCgpICkKKwl7CisJCWNhc2UgRk9STV9BVk1DT0RFX0tJTkQ6CisJCXsKKwkJCXJldHVybiggZGVjb2RlX2V2YWxfcHJvY2Vzc29yKCBhcmcudG9fcHRyPCBBdm1Db2RlID4oKQorCQkJCQktPmdldEluc3RydWN0aW9uKCktPmdldE1haW5CeXRlY29kZSgpLAorCQkJCQlhcmcudG9fcHRyPCBBdm1Db2RlID4oKSkgKTsKKwkJfQorCisJCWNhc2UgRk9STV9JTlNUQU5DRV9EQVRBX0tJTkQ6CisJCXsKKwkJCUluc3RhbmNlT2ZEYXRhICogYW5JbnN0YW5jZSA9IGFyZy50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKTsKKworCQkJaWYoIGFuSW5zdGFuY2UtPmdldE1vZGlmaWVyKCkuaGFzTmF0dXJlUmVmZXJlbmNlKCkgKQorCQkJeworCQkJCWN1cnJlbnQoIEVOVi0+Z2V0UnZhbHVlKG91dEVELCBFTlYtPmdldFJ2YWx1ZShvdXRFRCwKKwkJCQkJCWFuSW5zdGFuY2UpLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpICkpOworCQkJfQorCQkJZWxzZSBpZiggYW5JbnN0YW5jZS0+Z2V0TW9kaWZpZXIoKS5oYXNOYXR1cmVNYWNybygpICkKKwkJCXsKKwkJCQlyZXR1cm4oIGRlY29kZV9ldmFsX3J2YWx1ZSggRU5WLT5nZXRSdmFsdWUob3V0RUQsIGFuSW5zdGFuY2UpICkpOworCQkJfQorCQkJZWxzZSBpZiggYW5JbnN0YW5jZS0+Z2V0TW9kaWZpZXIoKS5oYXNGZWF0dXJlTXV0YWJsZSgpICkKKwkJCXsKKwkJCQljdXJyZW50KCBFTlYtPmdldFJ2YWx1ZShvdXRFRCwgYW5JbnN0YW5jZSkgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQljdXJyZW50KCBhcmcgKTsKKwkJCX0KKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQljYXNlIEZPUk1fQlVJTFRJTl9CT09MRUFOX0tJTkQ6CisJCWNhc2UgRk9STV9CVUlMVElOX0lOVEVHRVJfS0lORDoKKwkJY2FzZSBGT1JNX0JVSUxUSU5fUkFUSU9OQUxfS0lORDoKKwkJY2FzZSBGT1JNX0JVSUxUSU5fRkxPQVRfS0lORDoKKworCQljYXNlIEZPUk1fQlVJTFRJTl9DSEFSQUNURVJfS0lORDoKKwkJY2FzZSBGT1JNX0JVSUxUSU5fU1RSSU5HX0tJTkQ6CisJCWNhc2UgRk9STV9CVUlMVElOX0lERU5USUZJRVJfS0lORDoKKwkJY2FzZSBGT1JNX0JVSUxUSU5fUVVBTElGSUVEX0lERU5USUZJRVJfS0lORDoKKworCQljYXNlIEZPUk1fQVJSQVlfQk9PTEVBTl9LSU5EOgorCQljYXNlIEZPUk1fQVJSQVlfQ0hBUkFDVEVSX0tJTkQ6CisJCWNhc2UgRk9STV9BUlJBWV9JTlRFR0VSX0tJTkQ6CisJCWNhc2UgRk9STV9BUlJBWV9SQVRJT05BTF9LSU5EOgorCQljYXNlIEZPUk1fQVJSQVlfRkxPQVRfS0lORDoKKwkJY2FzZSBGT1JNX0FSUkFZX1NUUklOR19LSU5EOgorCQljYXNlIEZPUk1fQVJSQVlfSURFTlRJRklFUl9LSU5EOgorCQljYXNlIEZPUk1fQVJSQVlfUVVBTElGSUVEX0lERU5USUZJRVJfS0lORDoKKworCQljYXNlIEZPUk1fUlVOVElNRV9JRF9LSU5EOgorCisJCWNhc2UgRk9STV9JTlNUQU5DRV9QT1JUX0tJTkQ6CisJCWNhc2UgRk9STV9JTlNUQU5DRV9CVUZGRVJfS0lORDoKKwkJY2FzZSBGT1JNX0lOU1RBTkNFX0NPTk5FQ1RPUl9LSU5EOgorCisJCWNhc2UgRk9STV9PUEVSQVRPUl9LSU5EOgorCQljYXNlIEZPUk1fQVZNTEFNQkRBX0tJTkQ6CisJCWNhc2UgRk9STV9BVk1QUk9HUkFNX0tJTkQ6CisJCWNhc2UgRk9STV9BVk1UUkFOU0lUSU9OX0tJTkQ6CisJCWNhc2UgRk9STV9FWEVDVVRBQkxFX01BQ0hJTkVfS0lORDoKKwkJY2FzZSBGT1JNX0VYRUNVVEFCTEVfU1lTVEVNX0tJTkQ6CisJCXsKKwkJCWN1cnJlbnQoIGFyZyApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCTw8ICJGYWlsZWQgdG8gZGVjb2RlX2V2YWxfcnZhbHVlIDw8ICIKKwkJCQkJPDwgYXJnLnN0cigpIDw8ICIgPj4gYXMgVmFsdWUgYXJndW1lbnQgISEhIgorCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KK30KKworCitCRiBBUkdTX0VOVjo6cmV0dXJuX2RlY29kZV9ldmFsX3J2YWx1ZShCRiAmIGFyZykKK3sKKwlzd2l0Y2goIGFyZy5jbGFzc0tpbmQoKSApCisJeworCQljYXNlIEZPUk1fQVZNQ09ERV9LSU5EOgorCQl7CisJCQlyZXR1cm4oIHJldHVybl9kZWNvZGVfZXZhbF9wcm9jZXNzb3IoYXJnLmJmQ29kZSgpKSApOworCQl9CisKKwkJY2FzZSBGT1JNX0lOU1RBTkNFX0RBVEFfS0lORDoKKwkJeworCQkJSW5zdGFuY2VPZkRhdGEgKiBhbkluc3RhbmNlID0gYXJnLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpOworCisJCQlpZiggYW5JbnN0YW5jZS0+Z2V0TW9kaWZpZXIoKS5oYXNOYXR1cmVSZWZlcmVuY2UoKSApCisJCQl7CisJCQkJcmV0dXJuKCBFTlYtPmdldFJ2YWx1ZShvdXRFRCwgRU5WLT5nZXRSdmFsdWUob3V0RUQsCisJCQkJCQlhbkluc3RhbmNlKS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSApKTsKKwkJCX0KKwkJCWVsc2UgaWYoIGFuSW5zdGFuY2UtPmdldE1vZGlmaWVyKCkuaGFzTmF0dXJlTWFjcm8oKSApCisJCQl7CisJCQkJcmV0dXJuKCByZXR1cm5fZGVjb2RlX2V2YWxfcnZhbHVlKAorCQkJCQkJRU5WLT5nZXRSdmFsdWUob3V0RUQsIGFuSW5zdGFuY2UpICkpOworCQkJfQorCQkJZWxzZSBpZiggYW5JbnN0YW5jZS0+Z2V0TW9kaWZpZXIoKS5oYXNGZWF0dXJlTXV0YWJsZSgpICkKKwkJCXsKKwkJCQlyZXR1cm4oIEVOVi0+Z2V0UnZhbHVlKG91dEVELCBhbkluc3RhbmNlKSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJldHVybiggYXJnICk7CisJCQl9CisJCX0KKworCQljYXNlIEZPUk1fQlVJTFRJTl9CT09MRUFOX0tJTkQ6CisJCWNhc2UgRk9STV9CVUlMVElOX0lOVEVHRVJfS0lORDoKKwkJY2FzZSBGT1JNX0JVSUxUSU5fUkFUSU9OQUxfS0lORDoKKwkJY2FzZSBGT1JNX0JVSUxUSU5fRkxPQVRfS0lORDoKKworCQljYXNlIEZPUk1fQlVJTFRJTl9DSEFSQUNURVJfS0lORDoKKwkJY2FzZSBGT1JNX0JVSUxUSU5fU1RSSU5HX0tJTkQ6CisJCWNhc2UgRk9STV9CVUlMVElOX0lERU5USUZJRVJfS0lORDoKKwkJY2FzZSBGT1JNX0JVSUxUSU5fUVVBTElGSUVEX0lERU5USUZJRVJfS0lORDoKKworCQljYXNlIEZPUk1fQVJSQVlfQk9PTEVBTl9LSU5EOgorCQljYXNlIEZPUk1fQVJSQVlfQ0hBUkFDVEVSX0tJTkQ6CisJCWNhc2UgRk9STV9BUlJBWV9JTlRFR0VSX0tJTkQ6CisJCWNhc2UgRk9STV9BUlJBWV9SQVRJT05BTF9LSU5EOgorCQljYXNlIEZPUk1fQVJSQVlfRkxPQVRfS0lORDoKKwkJY2FzZSBGT1JNX0FSUkFZX1NUUklOR19LSU5EOgorCQljYXNlIEZPUk1fQVJSQVlfSURFTlRJRklFUl9LSU5EOgorCQljYXNlIEZPUk1fQVJSQVlfUVVBTElGSUVEX0lERU5USUZJRVJfS0lORDoKKworCQljYXNlIEZPUk1fUlVOVElNRV9JRF9LSU5EOgorCisJCWNhc2UgRk9STV9JTlNUQU5DRV9QT1JUX0tJTkQ6CisJCWNhc2UgRk9STV9JTlNUQU5DRV9CVUZGRVJfS0lORDoKKwkJY2FzZSBGT1JNX0lOU1RBTkNFX0NPTk5FQ1RPUl9LSU5EOgorCisJCWNhc2UgRk9STV9PUEVSQVRPUl9LSU5EOgorCQljYXNlIEZPUk1fQVZNTEFNQkRBX0tJTkQ6CisJCWNhc2UgRk9STV9BVk1QUk9HUkFNX0tJTkQ6CisJCWNhc2UgRk9STV9BVk1UUkFOU0lUSU9OX0tJTkQ6CisJCWNhc2UgRk9STV9FWEVDVVRBQkxFX01BQ0hJTkVfS0lORDoKKwkJY2FzZSBGT1JNX0VYRUNVVEFCTEVfU1lTVEVNX0tJTkQ6CisJCXsKKwkJCXJldHVybiggYXJnICk7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQk8PCAiRmFpbGVkIHRvIHJldHVybl9kZWNvZGVfZXZhbF9ydmFsdWUgPDwgIgorCQkJCQk8PCBhcmcuc3RyKCkgPDwgIiA+PiBhcyBWYWx1ZSBhcmd1bWVudCAhISEiCisJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKKwkJfQorCX0KK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vIEVWQUwgUFJPQ0VTU09SIE1FTU9SWSBNQUNISU5FIGFzIFJJRAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICogRVZBTCBQUk9DRVNTT1IgPCBBVk1fQVJHX01FTU9SWV9NQUNISU5FX0NQVSA+CisgKi8KK2Jvb2wgQVJHU19FTlY6OmV2YWxfcHJvY2Vzc29yX2RtYV9tYWNoaW5lKEF2bUJ5dGVjb2RlICYgYnl0ZWNvZGUsIEJGICYgYXJnKQoreworCXN3aXRjaCggYnl0ZWNvZGUub3BlcmFuZCApCisJeworCQljYXNlIEFWTV9BUkdfU0VMRl9SSUQ6CisJCXsKKwkJCWN1cnJlbnQoIG91dEVELT5tUklEICk7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisJCWNhc2UgQVZNX0FSR19QQVJFTlRfUklEOgorCQl7CisJCQljdXJyZW50KCBvdXRFRC0+bVJJRC5nZXRQUklEKCkgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwkJY2FzZSBBVk1fQVJHX0NPTU1VTklDQVRPUl9SSUQ6CisJCXsKKwkJCWN1cnJlbnQoIG91dEVELT5tUklELmdldENvbW11bmljYXRvcigpICk7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisJCWNhc2UgQVZNX0FSR19TWVNURU1fUklEOgorCQl7CisJCQljdXJyZW50KCBvdXRFRC0+Z2V0U3lzdGVtUklEKCkgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQljYXNlIEFWTV9BUkdfRU5WSVJPTk1FTlRfUklEOgorCQl7CisJCQljdXJyZW50KCBSdW50aW1lTGliOjpSSURfRU5WSVJPTk1FTlQgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQljYXNlIEFWTV9BUkdfQ09NUE9ORU5UX1NFTEZfUklEOgorCQl7CisJCQljdXJyZW50KCBvdXRFRC0+bVJJRC5nZXRDb21wb25lbnRTZWxmKCkgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwkJY2FzZSBBVk1fQVJHX0NPTVBPTkVOVF9QQVJFTlRfUklEOgorCQl7CisJCQljdXJyZW50KCBvdXRFRC0+bVJJRC5nZXRDb21wb25lbnRQYXJlbnQoKSApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCQljYXNlIEFWTV9BUkdfQ09NUE9ORU5UX0NPTU1VTklDQVRPUl9SSUQ6CisJCXsKKwkJCWN1cnJlbnQoIG91dEVELT5tUklELmdldENvbXBvbmVudENvbW11bmljYXRvcigpICk7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisKKwkJY2FzZSBBVk1fQVJHX01BQ0hJTkVfUklEOgorCQl7CisJCQlJbnN0YW5jZU9mTWFjaGluZSAqIGFNYWNoaW5lID0gYXJnLnRvX3B0cjwgSW5zdGFuY2VPZk1hY2hpbmUgPigpOworCisJCQlpZiggYU1hY2hpbmUtPmdldEV4ZWN1dGFibGUoKS0+aGFzU2luZ2xlUnVudGltZUluc3RhbmNlKCkgKQorCQkJeworCQkJCWJ5dGVjb2RlLnNldE5vcENwdSgpOworCQkJCWlmKCAoY291bnQgPT0gMSkgJiYgKGlkeCA9PSAwKSApCisJCQkJeworCQkJCQlieXRlY29kZS5zZXROb3BzT3BlcmF0aW9uKCk7CisJCQkJfQorCisJCQkJY3VycmVudCggYXJnID0gb3V0RUQtPmdldFJ1bnRpbWVJRCggYU1hY2hpbmUgKSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWN1cnJlbnQoIG91dEVELT5nZXRSdW50aW1lSUQoIGFNYWNoaW5lICkgKTsKKwkJCX0KKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQljYXNlIEFWTV9BUkdfREFUQV9LSU5EOgorCQl7CisJCQljdXJyZW50KCBFTlYtPmdldFJ2YWx1ZShvdXRFRCwgYXJnLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpKSApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWNhc2UgQVZNX0FSR19EQVRBX1JFRl9LSU5EOgorCQl7CisJCQljdXJyZW50KCBFTlYtPmdldFJ2YWx1ZSggb3V0RUQsCisJCQkJCUVOVi0+Z2V0UnZhbHVlKG91dEVELCBhcmcudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCkpLgorCQkJCQlhc19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSApKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwkJY2FzZSBBVk1fQVJHX0RBVEFfTUFDUk9fS0lORDoKKwkJeworCQkJY3VycmVudCggcmV0dXJuX2RlY29kZV9ldmFsX21hY2hpbmUoCisJCQkJCUVOVi0+Z2V0UnZhbHVlKG91dEVELCBhcmcudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCkpICkpOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWNhc2UgQVZNX0FSR19EQVRBX1VGSV9LSU5EOgorCQl7CisJCQlpZiggbm90IGV2YWxfcHJvY2Vzc29yX2RtYV9ydmFsdWVfdWZpX3BvaW50ZXIoYnl0ZWNvZGUsIGFyZykgKQorCQkJeworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJCWVsc2UgaWYoIGN1cnJlbnQoKS5pczwgUnVudGltZUlEID4oKSApCisJCQl7CisJCQkJcmV0dXJuKCB0cnVlICk7CisJCQl9CisJCQllbHNlIGlmKCBjdXJyZW50KCkuaXM8IEluc3RhbmNlT2ZNYWNoaW5lID4oKSApCisJCQl7CisJCQkJSW5zdGFuY2VPZk1hY2hpbmUgKiBhTWFjaGluZSA9CisJCQkJCQljdXJyZW50KCkudG9fcHRyPCBJbnN0YW5jZU9mTWFjaGluZSA+KCk7CisKKwkJCQlpZiggYU1hY2hpbmUtPmdldEV4ZWN1dGFibGUoKS0+aGFzU2luZ2xlUnVudGltZUluc3RhbmNlKCkgKQorCQkJCXsKKwkJCQkJYnl0ZWNvZGUuc2V0Tm9wQ3B1KCk7CisJCQkJCWlmKCAoY291bnQgPT0gMSkgJiYgKGlkeCA9PSAwKSApCisJCQkJCXsKKwkJCQkJCWJ5dGVjb2RlLnNldE5vcHNPcGVyYXRpb24oKTsKKwkJCQkJfQorCisJCQkJCWN1cnJlbnQoIGFyZyA9IG91dEVELT5nZXRSdW50aW1lSUQoIGFNYWNoaW5lICkgKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJY3VycmVudCggb3V0RUQtPmdldFJ1bnRpbWVJRCggYU1hY2hpbmUgKSApOworCQkJCX0KKworCQkJCXJldHVybiggdHJ1ZSApOworCQkJfQorCisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKworCQljYXNlIEFWTV9BUkdfRVhQUkVTU0lPTl9SSUQ6CisJCXsKKwkJCWN1cnJlbnQoIHJldHVybl9kZWNvZGVfZXZhbF9tYWNoaW5lKGFyZykgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQljYXNlIEFWTV9BUkdfRVhQUkVTU0lPTl9LSU5EOgorCQl7CisJCQlyZXR1cm4oIGV2YWxfcHJvY2Vzc29yX2RtYV9tYWNoaW5lKAorCQkJCQlieXRlY29kZSwgYXJnLnRvX3B0cjwgQXZtQ29kZSA+KCkgKSk7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQk8PCAiQVJHU19FTlY6OmV2YWxfcHJvY2Vzc29yX2RtYV9tYWNoaW5lIDo+ICIKKwkJCQkJCSJVbmV4cGVjdGVkIGFyZ2NvZGUgPDwgIiA8PCBieXRlY29kZS5zdHJDb2RlKCkKKwkJCQkJPDwgIiA+PiBmb3IgOiAiIDw8IGFyZy5zdHIoKSA8PCAiICEhISIKKwkJCQkJPDwgU0VORF9FWElUOworCisJCQljdXJyZW50KCBhcmcgKTsKKworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorfQorCisKK2Jvb2wgQVJHU19FTlY6OmV2YWxfcHJvY2Vzc29yX2RtYV9tYWNoaW5lKEF2bUJ5dGVjb2RlICYgYnl0ZWNvZGUsIEF2bUNvZGUgKiBhQ29kZSkKK3sKKwlJbnN0cnVjdGlvbkVudmlyb25tZW50IEVWQUxfQVJHKEVOViwgb3V0RUQsIGFDb2RlLT5zaXplKCkpOworCWlmKCBFVkFMX0FSRy5tQVJHLT5kZWNvZGVfZXZhbF9hcmdzX3Byb2Nlc3NvcihieXRlY29kZSwgYUNvZGUpICkKKwl7CisJCW91dEVEID0gRVZBTF9BUkcubUFSRy0+b3V0RUQ7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwlzd2l0Y2goIGFDb2RlLT5nZXRBdm1PcENvZGUoKSApCisJeworCQljYXNlIEFWTV9PUENPREVfU0NIRURVTEVfSU46CisJCXsKKwkJCWNvbnN0IEJGQ29kZSAmIHNjaGVkdWxlQ29kZSA9IG91dEVELT5nZXRSdW50aW1lRm9ybU9uU2NoZWR1bGUoCisJCQkJCUVWQUxfQVJHLm1BUkctPmF0KDEpLmJmUklEKCkgKTsKKworCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKAorCQkJCQlTdGF0ZW1lbnRGYWN0b3J5Ojpjb250YWluc09wZXJhdGlvbk9uUklEKAorCQkJCQkJCXNjaGVkdWxlQ29kZSwgQVZNX09QQ09ERV9SVU4sCisJCQkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMCkuYmZSSUQoKSkpICk7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisKKwkJY2FzZSBBVk1fT1BDT0RFX1NUQVRVU19CRUlORzoKKwkJY2FzZSBBVk1fT1BDT0RFX1NUQVRVU19JUzoKKwkJY2FzZSBBVk1fT1BDT0RFX1NUQVRVU19XQVM6CisJCWNhc2UgQVZNX09QQ09ERV9TVEFUVVNfV0lMTDoKKworCQljYXNlIEFWTV9PUENPREVfSU5WT0tFX05FVzoKKwkJeworCQkJRXZhbHVhdGlvbkVudmlyb25tZW50IGVFTlYoKkVOViwgb3V0RUQsIElOQ1JfQkYoYUNvZGUpLmJmQ29kZSgpKTsKKwkJCWlmKCBlRU5WLnNldmFsKEVWQUxfQVJHLm1BUkcpICkKKwkJCXsKKwkJCQlvdXRFRCA9IGVFTlYub3V0RUQ7CisKKwkJCQljdXJyZW50KCBlRU5WLm91dFZBTCApOworCisJCQkJcmV0dXJuKCB0cnVlICk7CisJCQl9CisKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCTw8ICJBUkdTX0VOVjo6ZXZhbF9wcm9jZXNzb3JfZG1hX21hY2hpbmUgOj4gIgorCQkJCQkiVW5leHBlY3RlZCBvcGNvZGUgPDwgIiA8PCBhQ29kZS0+c3RyRGVidWcoKSA8PCAiID4+ICEhISIKKwkJCQkJPDwgU0VORF9FWElUOworCisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKwl9Cit9CisKKworY29uc3QgUnVudGltZUlEICYgQVJHU19FTlY6OnJldHVybl9kZWNvZGVfZXZhbF9tYWNoaW5lKGNvbnN0IEJGICYgYW5FbGVtZW50KQoreworCXN3aXRjaCggYW5FbGVtZW50LmNsYXNzS2luZCgpICkKKwl7CisJCWNhc2UgRk9STV9SVU5USU1FX0lEX0tJTkQ6CisJCXsKKwkJCXJldHVybiggYW5FbGVtZW50LmJmUklEKCkgKTsKKwkJfQorCisJCWNhc2UgRk9STV9JTlNUQU5DRV9NQUNISU5FX0tJTkQ6CisJCXsKKwkJCXJldHVybiggb3V0RUQtPmdldFJ1bnRpbWVJRChhbkVsZW1lbnQudG9fcHRyPCBJbnN0YW5jZU9mTWFjaGluZSA+KCkpICk7CisJCX0KKworCQljYXNlIEZPUk1fSU5TVEFOQ0VfREFUQV9LSU5EOgorCQl7CisJCQlJbnN0YW5jZU9mRGF0YSAqIGFuSW5zdGFuY2UgPSBhbkVsZW1lbnQudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCk7CisKKwkJCWlmKCBhbkluc3RhbmNlLT5pc1R5cGVkTWFjaGluZSgpICkKKwkJCXsKKwkJCQlpZiggYW5JbnN0YW5jZS0+Z2V0TW9kaWZpZXIoKS5oYXNGZWF0dXJlTXV0YWJsZSgpICkKKwkJCQl7CisJCQkJCWNvbnN0IEJGICYgYmZJbnN0YW5jZSA9IEVOVi0+Z2V0UnZhbHVlKG91dEVELCBhbkluc3RhbmNlKTsKKworCQkJCQlpZiggYmZJbnN0YW5jZS5pczwgUnVudGltZUlEID4oKSApCisJCQkJCXsKKwkJCQkJCXJldHVybiggYmZJbnN0YW5jZS5iZlJJRCgpICk7CisJCQkJCX0KKwkJCQkJZWxzZSBpZiggYmZJbnN0YW5jZS5pczwgSW5zdGFuY2VPZk1hY2hpbmUgPigpICkKKwkJCQkJeworCQkJCQkJcmV0dXJuKCBvdXRFRC0+Z2V0UnVudGltZUlEKAorCQkJCQkJCQliZkluc3RhbmNlLnRvX3B0cjwgSW5zdGFuY2VPZk1hY2hpbmUgPigpKSApOworCQkJCQl9CisJCQkJCWVsc2UgaWYoIGFuSW5zdGFuY2UtPmdldE1vZGlmaWVyKCkuYW55TmF0dXJlUmVmZXJlbmNlTWFjcm8oKQorCQkJCQkJCSYmIGJmSW5zdGFuY2UuaXM8IEluc3RhbmNlT2ZEYXRhID4oKQorCQkJCQkJCSYmIChiZkluc3RhbmNlICE9IGFuSW5zdGFuY2UpICkKKwkJCQkJeworCQkJCQkJcmV0dXJuKCByZXR1cm5fZGVjb2RlX2V2YWxfbWFjaGluZShFTlYtPmdldFJ2YWx1ZShvdXRFRCwKKwkJCQkJCQkJYmZJbnN0YW5jZS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSkpICk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlBVk1fT1NfV0FSTiA8PCAiVW5leHBlY3RlZCIgPDwgc3RyX2hlYWRlciggYW5JbnN0YW5jZSApCisJCQkJCQkJPDwgIiBhcyBSdW50aW1lSUQgYXJndW1lbnQgISEhIiA8PCBzdGQ6OmVuZGw7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZiggYW5JbnN0YW5jZS0+Z2V0TW9kaWZpZXIoKS4KKwkJCQkJCQloYXNNb2RpZmllclB1YmxpY0ZpbmFsU3RhdGljKCkgKQorCQkJCXsKKwkJCQkJQVZNX09TX1dBUk4gPDwgIlVuZXhwZWN0ZWQgIiA8PCBzdHJfaGVhZGVyKCBhbkluc3RhbmNlICkKKwkJCQkJCQk8PCAiIGFzIFJ1bnRpbWVJRCBhcmd1bWVudCAhISEiIDw8IHN0ZDo6ZW5kbDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJQVZNX09TX1dBUk4gPDwgIlVuZXhwZWN0ZWQgIiA8PCBzdHJfaGVhZGVyKCBhbkluc3RhbmNlICkKKwkJCQkJCQk8PCAiIGFzIFJ1bnRpbWVJRCBhcmd1bWVudCA6PiBiYWQgdHlwZSBkYXRhICEhISIKKwkJCQkJCQk8PCBzdGQ6OmVuZGw7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUFWTV9PU19XQVJOIDw8ICJVbmV4cGVjdGVkICIgPDwgc3RyX2hlYWRlciggYW5JbnN0YW5jZSApCisJCQkJCQk8PCAiIGFzIFJ1bnRpbWVJRCBhcmd1bWVudCA6PiBiYWQgdHlwZSBkYXRhICEhISIKKwkJCQkJCTw8IHN0ZDo6ZW5kbDsKKwkJCX0KKworCQkJcmV0dXJuKCBSdW50aW1lSUQ6OlJFRl9OVUxMICk7CisJCX0KKworCQljYXNlIEZPUk1fQVZNQ09ERV9LSU5EOgorCQl7CisJCQlFdmFsdWF0aW9uRW52aXJvbm1lbnQgZUVOVigqRU5WLCBvdXRFRCwgYW5FbGVtZW50LmJmQ29kZSgpKTsKKwkJCWlmKCBlRU5WLnNldmFsKCkgKQorCQkJeworCQkJCWlmKCBlRU5WLm91dFZBTC5pczwgUnVudGltZUlEID4oKSApCisJCQkJeworCQkJCQlvdXRFRCA9IGVFTlYub3V0RUQ7CisKKwkJCQkJcmV0dXJuKCBlRU5WLm91dFZBTC5iZlJJRCgpICk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUFWTV9PU19XQVJOIDw8ICJVbmV4cGVjdGVkICIgPDwgZUVOVi5vdXRWQUwuc3RyKCkKKwkJCQkJCTw8ICIgYXMgUnVudGltZUlEIGFyZ3VtZW50ICEhISIgPDwgc3RkOjplbmRsOworCQkJCX0KKwkJCX0KKworCQkJcmV0dXJuKCBSdW50aW1lSUQ6OlJFRl9OVUxMICk7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlBVk1fT1NfRVhJVCggRkFJTEVEICkKKwkJCQkJPDwgIkVOVjo6ZXZhbE1hY2hpbmU6PiBVbmV4cGVjdGVkIGZvcm0gS0lORFxuIgorCQkJCQk8PCBhbkVsZW1lbnQudG9TdHJpbmcoKQorCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCXJldHVybiggUnVudGltZUlEOjpSRUZfTlVMTCApOworCQl9CisJfQorfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gRVZBTCBQUk9DRVNTT1IgQVJJVEhNRVRJQyAvIExPR0lDCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCisgKiBFVkFMIFBST0NFU1NPUiA8IEFWTV9BUkdfQVJJVEhNRVRJQ19MT0dJQ19DUFUgPgorICovCitib29sIEFSR1NfRU5WOjpldmFsX3Byb2Nlc3Nvcl9hbHUoQXZtQnl0ZWNvZGUgJiBieXRlY29kZSwgQkYgJiBhcmcpCit7CisJc3dpdGNoKCBieXRlY29kZS5vcGVyYW5kICkKKwl7CisJCWNhc2UgQVZNX0FSR19FWFBSRVNTSU9OX0tJTkQ6CisJCXsKKwkJCXJldHVybiggZXZhbF9wcm9jZXNzb3JfYWx1KGJ5dGVjb2RlLCBhcmcudG9fcHRyPCBBdm1Db2RlID4oKSkgKTsKKwkJfQorCisJCWNhc2UgQVZNX0FSR19TVEFURU1FTlRfS0lORDoKKwkJeworCQkJRXZhbHVhdGlvbkVudmlyb25tZW50IGVFTlYoKkVOViwgb3V0RUQsIGFyZy5iZkNvZGUoKSk7CisJCQlpZiggZUVOVi5zZXZhbCgpICkKKwkJCXsKKwkJCQlvdXRFRCA9IGVFTlYub3V0RUQ7CisKKwkJCQljdXJyZW50KCBlRU5WLm91dFZBTCApOworCisJCQkJcmV0dXJuKCB0cnVlICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJfQorCQl9CisKKwkJY2FzZSBBVk1fQVJHX0JPT0xFQU5fS0lORDoKKwkJY2FzZSBBVk1fQVJHX0lOVEVHRVJfS0lORDoKKwkJY2FzZSBBVk1fQVJHX1JBVElPTkFMX0tJTkQ6CisJCWNhc2UgQVZNX0FSR19GTE9BVF9LSU5EOgorCisJCWNhc2UgQVZNX0FSR19EQVRBX0NTVF9LSU5EOgorCisJCWNhc2UgQVZNX0FSR19CVUlMVElOX0tJTkQ6CisJCWNhc2UgQVZNX0FSR19CVUlMVElOX0FSUkFZX0tJTkQ6CisJCWNhc2UgQVZNX0FSR19DSEFSQUNURVJfS0lORDoKKwkJY2FzZSBBVk1fQVJHX1NUUklOR19LSU5EOgorCisJCWNhc2UgQVZNX0FSR19QT1JUX0tJTkQ6CisJCWNhc2UgQVZNX0FSR19CVUZGRVJfS0lORDoKKwkJY2FzZSBBVk1fQVJHX0NPTk5FQ1RPUl9LSU5EOgorCQl7CisJCQljdXJyZW50KCBhcmcgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQk8PCAiQVJHU19FTlY6OmV2YWxfcHJvY2Vzc29yX2FsdSA6PiBVbmV4cGVjdGVkIGFyZ2NvZGUgPDwgIgorCQkJCQk8PCBhcmdzQnl0ZWNvZGVbaWR4XS5zdHJDb2RlKCkgPDwgIiA+PiBmb3IgOiAiCisJCQkJCTw8IGFyZy5zdHIoKSA8PCAiICEhISIKKwkJCQkJPDwgU0VORF9FWElUOworCisJCQljdXJyZW50KCBhcmcgKTsKKworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorfQorCisKK2Jvb2wgQVJHU19FTlY6OmV2YWxfcHJvY2Vzc29yX2FsdShBdm1CeXRlY29kZSAmIGJ5dGVjb2RlLCBBdm1Db2RlICogYUNvZGUpCit7CisJSW5zdHJ1Y3Rpb25FbnZpcm9ubWVudCBFVkFMX0FSRyhFTlYsIG91dEVELCBhQ29kZS0+c2l6ZSgpKTsKKwlpZiggRVZBTF9BUkcubUFSRy0+ZGVjb2RlX2V2YWxfYXJnc19wcm9jZXNzb3IoYnl0ZWNvZGUsIGFDb2RlKSApCisJeworCQlvdXRFRCA9IEVWQUxfQVJHLm1BUkctPm91dEVEOworCX0KKwllbHNlCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJc3dpdGNoKCBhQ29kZS0+Z2V0QXZtT3BDb2RlKCkgKQorCXsKKwkJY2FzZSBBVk1fT1BDT0RFX1BMVVM6CisJCXsKKwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6YWRkRXhwcigKKwkJCQkJKihFVkFMX0FSRy5tQVJHLT52YWx1ZXMpKSApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCQljYXNlIEFWTV9PUENPREVfTUlOVVM6CisJCXsKKwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6bWludXNFeHByKAorCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgwKSwgRVZBTF9BUkcubUFSRy0+YXQoMSkpICk7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisJCWNhc2UgQVZNX09QQ09ERV9VTUlOVVM6CisJCXsKKwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6dW1pbnVzRXhwcigKKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMCkgKSApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9NVUxUOgorCQl7CisJCQljdXJyZW50KCBFeHByZXNzaW9uQ29uc3RydWN0b3JOYXRpdmU6Om11bHRFeHByKAorCQkJCQkqKEVWQUxfQVJHLm1BUkctPnZhbHVlcykpICk7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisJCWNhc2UgQVZNX09QQ09ERV9QT1c6CisJCXsKKwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6cG93RXhwcigKKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMCksIEVWQUxfQVJHLm1BUkctPmF0KDEpKSApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9ESVY6CisJCXsKKwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6ZGl2RXhwcigKKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMCksIEVWQUxfQVJHLm1BUkctPmF0KDEpKSApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisvLwkJY2FzZSBBVk1fT1BDT0RFX01PRDoKKy8vCQljYXNlIEFWTV9PUENPREVfTUlOOgorLy8JCWNhc2UgQVZNX09QQ09ERV9NQVg6CisKKwkJY2FzZSBBVk1fT1BDT0RFX0VROgorCQl7CisJCQljdXJyZW50KCBFeHByZXNzaW9uQ29uc3RydWN0b3JOYXRpdmU6OmVxRXhwcigKKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMCksIEVWQUxfQVJHLm1BUkctPmF0KDEpKSApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCQljYXNlIEFWTV9PUENPREVfTkVROgorCQl7CisJCQljdXJyZW50KCBFeHByZXNzaW9uQ29uc3RydWN0b3JOYXRpdmU6Om5lcUV4cHIoCisJCQkJCUVWQUxfQVJHLm1BUkctPmF0KDApLCBFVkFMX0FSRy5tQVJHLT5hdCgxKSkgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfU0VROgorCQl7CisJCQljdXJyZW50KCBFeHByZXNzaW9uQ29uc3RydWN0b3JOYXRpdmU6OnNlcUV4cHIoCisJCQkJCUVWQUxfQVJHLm1BUkctPmF0KDApLCBFVkFMX0FSRy5tQVJHLT5hdCgxKSkgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwkJY2FzZSBBVk1fT1BDT0RFX05TRVE6CisJCXsKKwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6bnNlcUV4cHIoCisJCQkJCUVWQUxfQVJHLm1BUkctPmF0KDApLCBFVkFMX0FSRy5tQVJHLT5hdCgxKSkgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfTFQ6CisJCXsKKwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6bHRFeHByKAorCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgwKSwgRVZBTF9BUkcubUFSRy0+YXQoMSkpICk7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisJCWNhc2UgQVZNX09QQ09ERV9MVEU6CisJCXsKKwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6bHRlRXhwcigKKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMCksIEVWQUxfQVJHLm1BUkctPmF0KDEpKSApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCQljYXNlIEFWTV9PUENPREVfR1Q6CisJCXsKKwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6Z3RFeHByKAorCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgwKSwgRVZBTF9BUkcubUFSRy0+YXQoMSkpICk7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisJCWNhc2UgQVZNX09QQ09ERV9HVEU6CisJCXsKKwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6Z3RlRXhwcigKKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMCksIEVWQUxfQVJHLm1BUkctPmF0KDEpKSApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisKKworCQljYXNlIEFWTV9PUENPREVfTk9UOgorCQl7CisJCQljdXJyZW50KCBFeHByZXNzaW9uQ29uc3RydWN0b3JOYXRpdmU6Om5vdEV4cHIoCisJCQkJCUVWQUxfQVJHLm1BUkctPmF0KDApICkgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfQU5EOgorCQl7CisJCQljdXJyZW50KCBFeHByZXNzaW9uQ29uc3RydWN0b3JOYXRpdmU6OmFuZEV4cHIoCisJCQkJCSooRVZBTF9BUkcubUFSRy0+dmFsdWVzKSkgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwkJY2FzZSBBVk1fT1BDT0RFX05BTkQ6CisJCXsKKwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6bm90RXhwcigKKwkJCQkJRXhwcmVzc2lvbkNvbnN0cnVjdG9yTmF0aXZlOjphbmRFeHByKAorCQkJCQkJCSooRVZBTF9BUkcubUFSRy0+dmFsdWVzKSkgKSk7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisKKy8vCQljYXNlIEFWTV9PUENPREVfWEFORDoKKy8vCQl7CisvLwkJCXJldHVybiggdHJ1ZSApOworLy8JCX0KKworCQljYXNlIEFWTV9PUENPREVfT1I6CisJCXsKKwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6b3JFeHByKAorCQkJCQkqKEVWQUxfQVJHLm1BUkctPnZhbHVlcykpICk7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisJCWNhc2UgQVZNX09QQ09ERV9OT1I6CisJCXsKKwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6bm90RXhwcigKKwkJCQkJRXhwcmVzc2lvbkNvbnN0cnVjdG9yTmF0aXZlOjpvckV4cHIoCisJCQkJCQkJKihFVkFMX0FSRy5tQVJHLT52YWx1ZXMpKSApKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworLy8JCWNhc2UgQVZNX09QQ09ERV9YT1I6CisvLwkJY2FzZSBBVk1fT1BDT0RFX1hOT1I6CisKKwkJLy8gUkFORE9NCisJCWNhc2UgQVZNX09QQ09ERV9SQU5ET006CisJCXsKKwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6bmV3SW50ZWdlcigKKwkJCQkJUkFORE9NOjpnZW5faW50ZWdlcigKKwkJCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgwKS50b0ludGVnZXIoKSwKKwkJCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgxKS50b0ludGVnZXIoKSApICkgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworLy8JCS8vIFJPVU5ESU5HCisvLwkJY2FzZSBBVk1fT1BDT0RFX0FCUzoKKy8vCQljYXNlIEFWTV9PUENPREVfQ0VJTDoKKy8vCQljYXNlIEFWTV9PUENPREVfRkxPT1I6CisvLwkJY2FzZSBBVk1fT1BDT0RFX1JPVU5EOgorLy8JCWNhc2UgQVZNX09QQ09ERV9UUlVOQ0FURToKKy8vCisvLwkJLy8gRVhQIC0gTE9HCisvLwkJY2FzZSBBVk1fT1BDT0RFX1NRUlQ6CisvLwkJY2FzZSBBVk1fT1BDT0RFX0VYUDoKKy8vCQljYXNlIEFWTV9PUENPREVfTE46CisvLwkJY2FzZSBBVk1fT1BDT0RFX0xPRzoKKy8vCisvLwkJLy8gVFJJR09OT01FVFJJQworLy8JCWNhc2UgQVZNX09QQ09ERV9TSU46CisvLwkJY2FzZSBBVk1fT1BDT0RFX0NPUzoKKy8vCQljYXNlIEFWTV9PUENPREVfVEFOOgorLy8KKy8vCQljYXNlIEFWTV9PUENPREVfU0lOSDoKKy8vCQljYXNlIEFWTV9PUENPREVfQ09TSDoKKy8vCQljYXNlIEFWTV9PUENPREVfVEFOSDoKKy8vCisvLwkJY2FzZSBBVk1fT1BDT0RFX0FTSU46CisvLwkJY2FzZSBBVk1fT1BDT0RFX0FDT1M6CisvLwkJY2FzZSBBVk1fT1BDT0RFX0FUQU46CisvLwkJY2FzZSBBVk1fT1BDT0RFX0FUQU4yOgorLy8KKy8vCQljYXNlIEFWTV9PUENPREVfQVNJTkg6CisvLwkJY2FzZSBBVk1fT1BDT0RFX0FDT1NIOgorLy8JCWNhc2UgQVZNX09QQ09ERV9BVEFOSDoKKworCQljYXNlIEFWTV9PUENPREVfQ1RPUjoKKwkJeworCQkJc3dpdGNoKCBhQ29kZS0+Z2V0SW5zdHJ1Y3Rpb24oKS0+Z2V0TWFpbk9wZXJhbmQoKSApCisJCQl7CisJCQkJY2FzZSBBVk1fQVJHX1NUUklOR19LSU5EOgorCQkJCXsKKwkJCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdTdHJpbmcoCisJCQkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMSkuc3RyKCkpICk7CisKKwkJCQkJcmV0dXJuKCB0cnVlICk7CisJCQkJfQorCQkJCWNhc2UgQVZNX0FSR19DSEFSQUNURVJfS0lORDoKKwkJCQljYXNlIEFWTV9BUkdfQk9PTEVBTl9LSU5EOgorCQkJCWNhc2UgQVZNX0FSR19JTlRFR0VSX0tJTkQ6CisJCQkJY2FzZSBBVk1fQVJHX1JBVElPTkFMX0tJTkQ6CisJCQkJY2FzZSBBVk1fQVJHX0ZMT0FUX0tJTkQ6CisKKwkJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJY3VycmVudCggRVZBTF9BUkcubUFSRy0+YXQoMSkgKTsKKworCQkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCQl9CisJCQl9CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yTmF0aXZlOjpuZXdFeHByKAorCQkJCQlhQ29kZS0+Z2V0T3BlcmF0b3IoKSwgKihFVkFMX0FSRy5tQVJHLT52YWx1ZXMpKSApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKworLy8JCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorLy8JCQkJCTw8ICJBUkdTX0VOVjo6ZXZhbF9wcm9jZXNzb3JfYWx1IDo+ICIKKy8vCQkJCQkJIlVuZXhwZWN0ZWQgb3Bjb2RlIDw8ICIgPDwgYUNvZGUtPnN0ckRlYnVnKCkKKy8vCQkJCQk8PCAiID4+IGZvciA6ICIgPDwgYUNvZGUtPnN0ckRlYnVnKCkgPDwgIiAhISEiCisvLwkJCQkJPDwgU0VORF9FWElUOworLy8KKy8vCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gRVZBTCBQUk9DRVNTT1IgU1RBVEVNRU5UCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCisgKiBFVkFMIFBST0NFU1NPUiA8IEFWTV9BUkdfU1RBVEVNRU5UX0NQVSA+CisgKi8KK2Jvb2wgQVJHU19FTlY6OmV2YWxfcHJvY2Vzc29yX3N0YXRlbWVudChBdm1CeXRlY29kZSAmIGJ5dGVjb2RlLCBBdm1Db2RlICogYUNvZGUpCit7CisJSW5zdHJ1Y3Rpb25FbnZpcm9ubWVudCBFVkFMX0FSRyhFTlYsIG91dEVELCBhQ29kZS0+c2l6ZSgpKTsKKwlpZiggRVZBTF9BUkcubUFSRy0+bWFpbl9kZWNvZGVfZXZhbF9hcmdzKGFDb2RlKSApCisJeworCQlvdXRFRCA9IEVWQUxfQVJHLm1BUkctPm91dEVEOworCX0KKwllbHNlCisJeworCQlyZXR1cm4oIGFDb2RlICk7CisJfQorCisJc3dpdGNoKCBhQ29kZS0+Z2V0QXZtT3BDb2RlKCkgKQorCXsKKwkJY2FzZSBBVk1fT1BDT0RFX09CUzoKKwkJeworCQkJY3VycmVudCggRVZBTF9BUkcubUFSRy0+YXQoMikgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCisJCWNhc2UgQVZNX09QQ09ERV9JTlBVVDoKKwkJY2FzZSBBVk1fT1BDT0RFX09VVFBVVDoKKwkJeworCQkJQkZDb2RlIGlvVHJhY2UgPSBFTlYtPnNlYXJjaFRyYWNlSU8ob3V0RUQtPmdldElPRWxlbWVudFRyYWNlKCksIGFDb2RlKTsKKworCQkJaWYoIGlvVHJhY2UudmFsaWQoKSApCisJCQl7CisJCQkJY3VycmVudCggaW9UcmFjZSApOworCisJCQkJQXZtQ29kZTo6aXRlcmF0b3IgdHJhY2VBcmcgPSBpb1RyYWNlLT5iZWdpbigpOworCQkJCUVWQUxfQVJHLm1BUkctPmJlZ2luKDEpOworCQkJCWZvciggKyt0cmFjZUFyZyA7IEVWQUxfQVJHLm1BUkctPmhhc05leHQoKSA7CisJCQkJCQlFVkFMX0FSRy5tQVJHLT5uZXh0KCkgLCArK3RyYWNlQXJnICkKKwkJCQl7CisJCQkJCWlmKCBub3QgRU5WLT5zZXRSdmFsdWUoIG91dEVELCBFVkFMX0FSRy5tQVJHLT5jdXJyZW50KCkuCisJCQkJCQkJYXNfcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCksICgqdHJhY2VBcmcpKSApCisJCQkJCXsKKwkJCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCXJldHVybiggdHJ1ZSApOworCQkJfQorCisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQk8PCAiQVJHU19FTlY6OmV2YWxfcHJvY2Vzc29yX3N0YXRlbWVudCA6PiAiCisJCQkJCQkiVW5leHBlY3RlZCBieXRlY29kZSA8PCAiIDw8IGJ5dGVjb2RlLnN0ckNvZGUoKQorCQkJCQk8PCAiID4+IGZvciA6ICIgPDwgYUNvZGUtPnN0ckRlYnVnKCkgPDwgIiAhISEiCisJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gRVZBTCBQUk9DRVNTT1IgQ0hBUkFDVEVSCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCisgKiBFVkFMIFBST0NFU1NPUiA8IEFWTV9BUkdfQ0hBUkFDVEVSX0NQVSA+CisgKi8KK2Jvb2wgQVJHU19FTlY6OmV2YWxfcHJvY2Vzc29yX2NoYXJhY3RlcihBdm1CeXRlY29kZSAmIGJ5dGVjb2RlLCBCRiAmIGFyZykKK3sKKwlzd2l0Y2goIGJ5dGVjb2RlLm9wZXJhbmQgKQorCXsKKwkJY2FzZSBBVk1fQVJHX0VYUFJFU1NJT05fS0lORDoKKwkJeworCQkJcmV0dXJuKCBldmFsX3Byb2Nlc3Nvcl9jaGFyYWN0ZXIoIGJ5dGVjb2RlLCBhcmcudG9fcHRyPCBBdm1Db2RlID4oKSApICk7CisJCX0KKworCQljYXNlIEFWTV9BUkdfQ0hBUkFDVEVSX0tJTkQ6CisJCXsKKwkJCWN1cnJlbnQoIGFyZyApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCTw8ICJBUkdTX0VOVjo6ZXZhbF9wcm9jZXNzb3JfY2hhcmFjdGVyIDo+ICIKKwkJCQkJCSJVbmV4cGVjdGVkIGFyZ2NvZGUgPDwgIiA8PCBieXRlY29kZS5zdHJDb2RlKCkKKwkJCQkJPDwgIiA+PiBmb3IgOiAiIDw8IGFyZy5zdHIoKSA8PCAiICEhISIKKwkJCQkJPDwgU0VORF9FWElUOworCisJCQljdXJyZW50KCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld1N0cmluZyhhcmcuc3RyKCkpICk7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisJfQorfQorCisKK2Jvb2wgQVJHU19FTlY6OmV2YWxfcHJvY2Vzc29yX2NoYXJhY3RlcihBdm1CeXRlY29kZSAmIGJ5dGVjb2RlLCBBdm1Db2RlICogYUNvZGUpCit7CisJSW5zdHJ1Y3Rpb25FbnZpcm9ubWVudCBFVkFMX0FSRyhFTlYsIG91dEVELCBhQ29kZS0+c2l6ZSgpKTsKKwlpZiggRVZBTF9BUkcubUFSRy0+bWFpbl9kZWNvZGVfZXZhbF9hcmdzKGFDb2RlKSApCisJeworCQlvdXRFRCA9IEVWQUxfQVJHLm1BUkctPm91dEVEOworCX0KKwllbHNlCisJeworCQlyZXR1cm4oIGFDb2RlICk7CisJfQorCisJc3dpdGNoKCBhQ29kZS0+Z2V0QXZtT3BDb2RlKCkgKQorCXsKKwkJY2FzZSBBVk1fT1BDT0RFX0NUT1I6CisJCXsKKwkJCXN3aXRjaCggYUNvZGUtPmdldEluc3RydWN0aW9uKCktPmdldE1haW5PcGVyYW5kKCkgKQorCQkJeworCQkJCWNhc2UgQVZNX0FSR19TVFJJTkdfS0lORDoKKwkJCQl7CisJCQkJCWlmKCBFVkFMX0FSRy5tQVJHLT5hdCgxKS5pczwgQ2hhcmFjdGVyID4oKSApCisJCQkJCXsKKwkJCQkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3U3RyaW5nKAorCQkJCQkJCQl0b19zdHJpbmcoRVZBTF9BUkcubUFSRy0+YXQoMSkudG9fcHRyPAorCQkJCQkJCQkJCUNoYXJhY3RlciA+KCktPmdldFZhbHVlKCkpKSApOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdTdHJpbmcoCisJCQkJCQkJCUVWQUxfQVJHLm1BUkctPmF0KDEpLnN0cigpKSApOworCQkJCQl9CisKKwkJCQkJcmV0dXJuKCB0cnVlICk7CisJCQkJfQorCQkJCWNhc2UgQVZNX0FSR19DSEFSQUNURVJfS0lORDoKKwkJCQl7CisJCQkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q2hhcigKKwkJCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgxKS5zdHIoKS5hdCgwKSApICk7CisKKwkJCQkJcmV0dXJuKCB0cnVlICk7CisJCQkJfQorCisJCQkJY2FzZSBBVk1fQVJHX0JPT0xFQU5fS0lORDoKKwkJCQljYXNlIEFWTV9BUkdfSU5URUdFUl9LSU5EOgorCQkJCWNhc2UgQVZNX0FSR19SQVRJT05BTF9LSU5EOgorCQkJCWNhc2UgQVZNX0FSR19GTE9BVF9LSU5EOgorCisKKwkJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdTdHJpbmcoCisJCQkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMSkuc3RyKCkgKSk7CisKKwkJCQkJcmV0dXJuKCB0cnVlICk7CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisvLwkJY2FzZSBBVk1fT1BDT0RFX0VNUFRZOgorLy8JCXsKKy8vCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKCBmYWxzZSApICk7CisvLworLy8JCQlyZXR1cm4oIHRydWUgKTsKKy8vCQl9CisvLworLy8JCWNhc2UgQVZNX09QQ09ERV9OT05FTVBUWToKKy8vCQl7CisvLwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbiggdHJ1ZSApICk7CisvLworLy8JCQlyZXR1cm4oIHRydWUgKTsKKy8vCQl9CisvLwkJY2FzZSBBVk1fT1BDT0RFX1NJTkdMRVRPTjoKKy8vCQl7CisvLwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbiggdHJ1ZSApICk7CisvLworLy8JCQlyZXR1cm4oIHRydWUgKTsKKy8vCQl9CisvLwkJY2FzZSBBVk1fT1BDT0RFX1BPUFVMQVRFRDoKKy8vCQl7CisvLwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbiggZmFsc2UgKSApOworLy8KKy8vCQkJcmV0dXJuKCB0cnVlICk7CisvLwkJfQorLy8KKy8vCQljYXNlIEFWTV9PUENPREVfU0laRToKKy8vCQl7CisvLwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6SU5URUdFUl9PTkUgKTsKKy8vCisvLwkJCXJldHVybiggdHJ1ZSApOworLy8JCX0KKworCQljYXNlIEFWTV9PUENPREVfRVE6CisJCWNhc2UgQVZNX09QQ09ERV9TRVE6CisJCXsKKwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbigKKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMCkudG9fcHRyPCBDaGFyYWN0ZXIgPigpLT5nZXRWYWx1ZSgpID09CisJCQkJCUVWQUxfQVJHLm1BUkctPmF0KDEpLnRvX3B0cjwgQ2hhcmFjdGVyID4oKS0+Z2V0VmFsdWUoKSApKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwkJY2FzZSBBVk1fT1BDT0RFX05FUToKKwkJY2FzZSBBVk1fT1BDT0RFX05TRVE6CisJCXsKKwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbigKKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMCkudG9fcHRyPCBDaGFyYWN0ZXIgPigpLT5nZXRWYWx1ZSgpICE9CisJCQkJCUVWQUxfQVJHLm1BUkctPmF0KDEpLnRvX3B0cjwgQ2hhcmFjdGVyID4oKS0+Z2V0VmFsdWUoKSApKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfTFQ6CisJCXsKKwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbigKKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMCkudG9fcHRyPCBDaGFyYWN0ZXIgPigpLT5nZXRWYWx1ZSgpIDwKKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMSkudG9fcHRyPCBDaGFyYWN0ZXIgPigpLT5nZXRWYWx1ZSgpICkpOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCQljYXNlIEFWTV9PUENPREVfTFRFOgorCQl7CisJCQljdXJyZW50KCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oCisJCQkJCUVWQUxfQVJHLm1BUkctPmF0KDApLnRvX3B0cjwgQ2hhcmFjdGVyID4oKS0+Z2V0VmFsdWUoKSA8PQorCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgxKS50b19wdHI8IENoYXJhY3RlciA+KCktPmdldFZhbHVlKCkgKSk7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisJCWNhc2UgQVZNX09QQ09ERV9HVDoKKwkJeworCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKAorCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgwKS50b19wdHI8IENoYXJhY3RlciA+KCktPmdldFZhbHVlKCkgPgorCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgxKS50b19wdHI8IENoYXJhY3RlciA+KCktPmdldFZhbHVlKCkgKSk7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisJCWNhc2UgQVZNX09QQ09ERV9HVEU6CisJCXsKKwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbigKKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMCkudG9fcHRyPCBDaGFyYWN0ZXIgPigpLT5nZXRWYWx1ZSgpID49CisJCQkJCUVWQUxfQVJHLm1BUkctPmF0KDEpLnRvX3B0cjwgQ2hhcmFjdGVyID4oKS0+Z2V0VmFsdWUoKSApKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCisJCWRlZmF1bHQ6CisJCXsKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCTw8ICJBUkdTX0VOVjo6ZXZhbF9wcm9jZXNzb3JfY2hhcmFjdGVyIDo+ICIKKwkJCQkJCSJVbmV4cGVjdGVkIGJ5dGVjb2RlIDw8ICIgPDwgYnl0ZWNvZGUuc3RyQ29kZSgpCisJCQkJCTw8ICIgPj4gZm9yIDogIiA8PCBhQ29kZS0+c3RyRGVidWcoKSA8PCAiICEhISIKKwkJCQkJPDwgU0VORF9FWElUOworCisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKwl9Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLyBFVkFMIFBST0NFU1NPUiBTVFJJTkcKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKKyAqIEVWQUwgUFJPQ0VTU09SIDwgQVZNX0FSR19TVFJJTkdfQ1BVID4KKyAqLworYm9vbCBBUkdTX0VOVjo6ZXZhbF9wcm9jZXNzb3Jfc3RyaW5nKEF2bUJ5dGVjb2RlICYgYnl0ZWNvZGUsIEJGICYgYXJnKQoreworCXN3aXRjaCggYnl0ZWNvZGUub3BlcmFuZCApCisJeworCQljYXNlIEFWTV9BUkdfRVhQUkVTU0lPTl9LSU5EOgorCQl7CisJCQlyZXR1cm4oIGV2YWxfcHJvY2Vzc29yX3N0cmluZyggYnl0ZWNvZGUsIGFyZy50b19wdHI8IEF2bUNvZGUgPigpICkgKTsKKwkJfQorCisJCWNhc2UgQVZNX0FSR19TVFJJTkdfS0lORDoKKwkJeworCQkJY3VycmVudCggYXJnICk7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisKKwkJY2FzZSBBVk1fQVJHX0NIQVJBQ1RFUl9LSU5EOgorCQl7CisJCQljdXJyZW50KCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld1N0cmluZygKKwkJCQkJdG9fc3RyaW5nKGFyZy50b19wdHI8IENoYXJhY3RlciA+KCktPmdldFZhbHVlKCkpKSApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWNhc2UgQVZNX0FSR19CT09MRUFOX0tJTkQ6CisJCWNhc2UgQVZNX0FSR19JTlRFR0VSX0tJTkQ6CisJCWNhc2UgQVZNX0FSR19SQVRJT05BTF9LSU5EOgorCQljYXNlIEFWTV9BUkdfRkxPQVRfS0lORDoKKwkJY2FzZSBBVk1fQVJHX09QRVJBVE9SX0tJTkQ6CisJCWNhc2UgQVZNX0FSR19CVUlMVElOX0tJTkQ6CisJCXsKKwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3U3RyaW5nKCBhcmcuc3RyKCkgKSApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisKKwkJZGVmYXVsdDoKKwkJeworCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJPDwgIkFSR1NfRU5WOjpldmFsX3Byb2Nlc3Nvcl9zdHJpbmcgOj4gIgorCQkJCQkJIlVuZXhwZWN0ZWQgYXJnY29kZSA8PCAiIDw8IGJ5dGVjb2RlLnN0ckNvZGUoKQorCQkJCQk8PCAiID4+IGZvciA6ICIgPDwgYXJnLnN0cigpIDw8ICIgISEhIgorCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3U3RyaW5nKGFyZy5zdHIoKSkgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwl9Cit9CisKKworYm9vbCBBUkdTX0VOVjo6ZXZhbF9wcm9jZXNzb3Jfc3RyaW5nKEF2bUJ5dGVjb2RlICYgYnl0ZWNvZGUsIEF2bUNvZGUgKiBhQ29kZSkKK3sKKwlJbnN0cnVjdGlvbkVudmlyb25tZW50IEVWQUxfQVJHKEVOViwgb3V0RUQsIGFDb2RlLT5zaXplKCkpOworCWlmKCBFVkFMX0FSRy5tQVJHLT5tYWluX2RlY29kZV9ldmFsX2FyZ3MoYUNvZGUpICkKKwl7CisJCW91dEVEID0gRVZBTF9BUkcubUFSRy0+b3V0RUQ7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiggYUNvZGUgKTsKKwl9CisKKwlzd2l0Y2goIGFDb2RlLT5nZXRBdm1PcENvZGUoKSApCisJeworCQljYXNlIEFWTV9PUENPREVfUExVUzoKKwkJY2FzZSBBVk1fT1BDT0RFX0NPTkNBVDoKKwkJeworCQkJc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKwkJCWZvciggRVZBTF9BUkcubUFSRy0+YmVnaW4oKSA7IEVWQUxfQVJHLm1BUkctPmhhc05leHQoKSA7CisJCQkJCUVWQUxfQVJHLm1BUkctPm5leHQoKSApCisJCQl7CisJCQkJb3NzIDw8IEVWQUxfQVJHLm1BUkctPmN1cnJlbnQoKS50b19wdHI8IFN0cmluZyA+KCktPmdldFZhbHVlKCk7CisJCQl9CisKKwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3U3RyaW5nKG9zcy5zdHIoKSkgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfUkVNT1ZFOgorCQl7CisJCQlzdGQ6OnN0cmluZyB2YWwgPSBFVkFMX0FSRy5tQVJHLT5hdCgwKS50b19wdHI8IFN0cmluZyA+KCktPmdldFZhbHVlKCk7CisKKwkJCVN0cmluZ1Rvb2xzOjpyZXBsYWNlQWxsKHZhbCwKKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMSkudG9fcHRyPCBTdHJpbmcgPigpLT5nZXRWYWx1ZSgpLCAiIik7CisKKwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3U3RyaW5nKCB2YWwgKSApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9DVE9SOgorCQl7CisJCQlzd2l0Y2goIGFDb2RlLT5nZXRJbnN0cnVjdGlvbigpLT5nZXRNYWluT3BlcmFuZCgpICkKKwkJCXsKKwkJCQljYXNlIEFWTV9BUkdfU1RSSU5HX0tJTkQ6CisJCQkJeworCQkJCQljdXJyZW50KCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld1N0cmluZygKKwkJCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgxKS5zdHIoKSkgKTsKKworCQkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCQl9CisJCQkJY2FzZSBBVk1fQVJHX0NIQVJBQ1RFUl9LSU5EOgorCQkJCXsKKwkJCQkJaWYoIEVWQUxfQVJHLm1BUkctPmF0KDEpLnRvX3B0cjwgU3RyaW5nID4oKQorCQkJCQkJCS0+Z2V0VmFsdWUoKS5lbXB0eSgpICkKKwkJCQkJeworCQkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCQl9CisKKwkJCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDaGFyKCBFVkFMX0FSRy5tQVJHCisJCQkJCQkJLT5hdCgxKS50b19wdHI8IFN0cmluZyA+KCktPmdldFZhbHVlKCkuYXQoMCkpICk7CisKKwkJCQkJcmV0dXJuKCB0cnVlICk7CisJCQkJfQorCisJCQkJY2FzZSBBVk1fQVJHX0JPT0xFQU5fS0lORDoKKwkJCQl7CisJCQkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbiggRVZBTF9BUkcubUFSRworCQkJCQkJCS0+YXQoMSkudG9fcHRyPCBTdHJpbmcgPigpLT5nZXRWYWx1ZSgpKSApOworCisJCQkJCXJldHVybiggdHJ1ZSApOworCQkJCX0KKwkJCQljYXNlIEFWTV9BUkdfSU5URUdFUl9LSU5EOgorCQkJCXsKKwkJCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdJbnRlZ2VyKCBFVkFMX0FSRy5tQVJHCisJCQkJCQkJLT5hdCgxKS50b19wdHI8IFN0cmluZyA+KCktPmdldFZhbHVlKCkpICk7CisKKwkJCQkJcmV0dXJuKCB0cnVlICk7CisJCQkJfQorCQkJCWNhc2UgQVZNX0FSR19SQVRJT05BTF9LSU5EOgorCQkJCXsKKwkJCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdSYXRpb25hbCggRVZBTF9BUkcubUFSRworCQkJCQkJCS0+YXQoMSkudG9fcHRyPCBTdHJpbmcgPigpLT5nZXRWYWx1ZSgpKSApOworCisJCQkJCXJldHVybiggdHJ1ZSApOworCQkJCX0KKwkJCQljYXNlIEFWTV9BUkdfRkxPQVRfS0lORDoKKwkJCQl7CisJCQkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3RmxvYXQoIEVWQUxfQVJHLm1BUkcKKwkJCQkJCQktPmF0KDEpLnRvX3B0cjwgU3RyaW5nID4oKS0+Z2V0VmFsdWUoKSkgKTsKKworCQkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCQl9CisKKwkJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdTdHJpbmcoCisJCQkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMSkuc3RyKCkgKSk7CisKKwkJCQkJcmV0dXJuKCB0cnVlICk7CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9DT05UQUlOUzoKKwkJeworCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKAorCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgwKS50b19wdHI8IFN0cmluZyA+KCktPmdldFZhbHVlKCkuZmluZCgKKwkJCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgxKS50b19wdHI8IFN0cmluZyA+KCkKKwkJCQkJCQkJCS0+Z2V0VmFsdWUoKSApICE9IHN0ZDo6c3RyaW5nOjpucG9zICApKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfSU46CisJCXsKKwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbigKKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMSkudG9fcHRyPCBTdHJpbmcgPigpLT5nZXRWYWx1ZSgpLmZpbmQoCisJCQkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMCkudG9fcHRyPCBTdHJpbmcgPigpCisJCQkJCQkJCQktPmdldFZhbHVlKCkgKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyAgKSk7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisJCWNhc2UgQVZNX09QQ09ERV9OT1RJTjoKKwkJeworCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKAorCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgxKS50b19wdHI8IFN0cmluZyA+KCktPmdldFZhbHVlKCkuZmluZCgKKwkJCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgwKS50b19wdHI8IFN0cmluZyA+KCkKKwkJCQkJCQkJCS0+Z2V0VmFsdWUoKSApID09IHN0ZDo6c3RyaW5nOjpucG9zICApKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfU1RBUlRTX1dJVEg6CisJCXsKKwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbiggU3RyaW5nVG9vbHM6OnN0YXJ0c1dpdGgoCisJCQkJCUVWQUxfQVJHLm1BUkctPmF0KDApLnRvX3B0cjwgU3RyaW5nID4oKS0+Z2V0VmFsdWUoKSwKKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMSkudG9fcHRyPCBTdHJpbmcgPigpLT5nZXRWYWx1ZSgpICkpKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwkJY2FzZSBBVk1fT1BDT0RFX0VORFNfV0lUSDoKKwkJeworCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKCBTdHJpbmdUb29sczo6ZW5kc1dpdGgoCisJCQkJCUVWQUxfQVJHLm1BUkctPmF0KDApLnRvX3B0cjwgU3RyaW5nID4oKS0+Z2V0VmFsdWUoKSwKKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMSkudG9fcHRyPCBTdHJpbmcgPigpLT5nZXRWYWx1ZSgpICkpKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfRU1QVFk6CisJCXsKKwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbigKKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMCkKKwkJCQkJCS50b19wdHI8IFN0cmluZyA+KCktPmdldFZhbHVlKCkuZW1wdHkoKSApICk7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisKKwkJY2FzZSBBVk1fT1BDT0RFX05PTkVNUFRZOgorCQl7CisJCQljdXJyZW50KCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oCisJCQkJCW5vdCBFVkFMX0FSRy5tQVJHLT5hdCgwKQorCQkJCQkJLnRvX3B0cjwgU3RyaW5nID4oKS0+Z2V0VmFsdWUoKS5lbXB0eSgpICkgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwkJY2FzZSBBVk1fT1BDT0RFX1NJTkdMRVRPTjoKKwkJeworCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKAorCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgwKQorCQkJCQkJLnRvX3B0cjwgU3RyaW5nID4oKS0+Z2V0VmFsdWUoKS5zaXplKCkgPT0gMSApICk7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisJCWNhc2UgQVZNX09QQ09ERV9QT1BVTEFURUQ6CisJCXsKKwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbigKKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMCkKKwkJCQkJCS50b19wdHI8IFN0cmluZyA+KCktPmdldFZhbHVlKCkuc2l6ZSgpID4gMSApICk7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisKKwkJY2FzZSBBVk1fT1BDT0RFX1NJWkU6CisJCXsKKwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3VUludGVnZXIoCisJCQkJCUVWQUxfQVJHLm1BUkctPmF0KDApCisJCQkJCQkudG9fcHRyPCBTdHJpbmcgPigpLT5nZXRWYWx1ZSgpLnNpemUoKSApICk7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisKKwkJY2FzZSBBVk1fT1BDT0RFX0VROgorCQljYXNlIEFWTV9PUENPREVfU0VROgorCQl7CisJCQljdXJyZW50KCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oCisJCQkJCUVWQUxfQVJHLm1BUkctPmF0KDApLnRvX3B0cjwgU3RyaW5nID4oKS0+Z2V0VmFsdWUoKS5jb21wYXJlKAorCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgxKS50b19wdHI8IFN0cmluZyA+KCktPmdldFZhbHVlKCkpID09IDAgKSk7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisJCWNhc2UgQVZNX09QQ09ERV9ORVE6CisJCWNhc2UgQVZNX09QQ09ERV9OU0VROgorCQl7CisJCQljdXJyZW50KCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oCisJCQkJCUVWQUxfQVJHLm1BUkctPmF0KDApLnRvX3B0cjwgU3RyaW5nID4oKS0+Z2V0VmFsdWUoKS5jb21wYXJlKAorCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgxKS50b19wdHI8IFN0cmluZyA+KCktPmdldFZhbHVlKCkpICE9IDAgKSApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9MVDoKKwkJeworCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKAorCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgwKS50b19wdHI8IFN0cmluZyA+KCktPmdldFZhbHVlKCkuY29tcGFyZSgKKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMSkudG9fcHRyPCBTdHJpbmcgPigpLT5nZXRWYWx1ZSgpKSA8IDAgKSApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCQljYXNlIEFWTV9PUENPREVfTFRFOgorCQl7CisJCQljdXJyZW50KCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oCisJCQkJCUVWQUxfQVJHLm1BUkctPmF0KDApLnRvX3B0cjwgU3RyaW5nID4oKS0+Z2V0VmFsdWUoKS5jb21wYXJlKAorCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgxKS50b19wdHI8IFN0cmluZyA+KCktPmdldFZhbHVlKCkpIDw9IDAgKSApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCQljYXNlIEFWTV9PUENPREVfR1Q6CisJCXsKKwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbigKKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMCkudG9fcHRyPCBTdHJpbmcgPigpLT5nZXRWYWx1ZSgpLmNvbXBhcmUoCisJCQkJCUVWQUxfQVJHLm1BUkctPmF0KDEpLnRvX3B0cjwgU3RyaW5nID4oKS0+Z2V0VmFsdWUoKSkgPiAwICkgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwkJY2FzZSBBVk1fT1BDT0RFX0dURToKKwkJeworCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKAorCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgwKS50b19wdHI8IFN0cmluZyA+KCktPmdldFZhbHVlKCkuY29tcGFyZSgKKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMSkudG9fcHRyPCBTdHJpbmcgPigpLT5nZXRWYWx1ZSgpKSA+PSAwICkgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCisJCWRlZmF1bHQ6CisJCXsKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCTw8ICJBUkdTX0VOVjo6ZXZhbF9wcm9jZXNzb3Jfc3RyaW5nIDo+ICIKKwkJCQkJCSJVbmV4cGVjdGVkIGJ5dGVjb2RlIDw8ICIgPDwgYnl0ZWNvZGUuc3RyQ29kZSgpCisJCQkJCTw8ICIgPj4gZm9yIDogIiA8PCBhQ29kZS0+c3RyRGVidWcoKSA8PCAiICEhISIKKwkJCQkJPDwgU0VORF9FWElUOworCisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKwl9Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLyBFVkFMIFBST0NFU1NPUiBBUlJBWQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICogRVZBTCBQUk9DRVNTT1IgPCBBVk1fQVJHX0FSUkFZX1tMfFZdX0NQVSA+CisgKi8KK2Jvb2wgQVJHU19FTlY6OmV2YWxfcHJvY2Vzc29yX2FycmF5X2x2YWx1ZShBdm1CeXRlY29kZSAmIGJ5dGVjb2RlLCBCRiAmIGFyZykKK3sKKwlzd2l0Y2goIGJ5dGVjb2RlLm9wZXJhbmQgKQorCXsKKwkJY2FzZSBBVk1fQVJHX0FSUkFZX0tJTkQ6CisJCXsKKwkJCUFycmF5QkYgJiBhcmdBcnJheSA9IGFyZy5hc19yZWY8IEFycmF5QkYgPigpOworCisJCQlBcnJheUJGICogb3V0QXJyYXkgPSBuZXcgQXJyYXlCRigKKwkJCQkJYXJnQXJyYXkuZ2V0VHlwZVNwZWNpZmllcigpLCBhcmdBcnJheS5zaXplKCkpOworCisJCQlpZiggYXJnQXJyYXkuaGFzSW5zdHJ1Y3Rpb24oKSApCisJCQl7CisJCQkJQXZtSW5zdHJ1Y3Rpb24gKiBpbnN0cnVjdGlvbiA9IGFyZ0FycmF5LmdldEluc3RydWN0aW9uKCk7CisJCQkJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDAgOyBvZmZzZXQgPCBhcmdBcnJheS5zaXplKCkgOyArK29mZnNldCApCisJCQkJeworCQkJCQlvdXRBcnJheS0+c2V0KG9mZnNldCwgcmV0dXJuX2RlY29kZV9ldmFsX3Byb2Nlc3NvcigKKwkJCQkJCQlpbnN0cnVjdGlvbi0+YXQob2Zmc2V0KSwgYXJnQXJyYXlbb2Zmc2V0XSkpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJPDwgIkFSR1NfRU5WOjpldmFsX3Byb2Nlc3Nvcl9hcnJheV9sdmFsdWUgOj4gIgorCQkJCQkJCSJVbmV4cGVjdGVkIGFycmF5IHdpdGhvdXQgaW5zdHJ1Y3Rpb24gPDwgIgorCQkJCQkJPDwgYnl0ZWNvZGUuc3RyQ29kZSgpIDw8ICIgPj4gZm9yIDogPDwgIgorCQkJCQkJPDwgYXJnLnN0cigpIDw8ICIgISEhIgorCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJfQorCisJCQljdXJyZW50KCBCRiggb3V0QXJyYXkgKSApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWNhc2UgQVZNX0FSR19CVUlMVElOX0FSUkFZX0tJTkQ6CisJCXsKKwkJCWN1cnJlbnQoIGFyZyApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWNhc2UgQVZNX0FSR19FWFBSRVNTSU9OX0tJTkQ6CisJCXsKKwkJCUJGIHZhbHVlID0gcmV0dXJuX2RlY29kZV9ldmFsX3Byb2Nlc3NvcigKKwkJCQkJYXJnLnRvX3B0cjwgQXZtQ29kZSA+KCkKKwkJCQkJCS0+Z2V0SW5zdHJ1Y3Rpb24oKS0+Z2V0TWFpbkJ5dGVjb2RlKCksIGFyZyk7CisKKwkJCWN1cnJlbnQoIGdlbkFycmF5KAorCQkJCQlieXRlY29kZS5kdHlwZS0+YXM8IENvbnRhaW5lclR5cGVTcGVjaWZpZXIgPigpLCB2YWx1ZSkgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQk8PCAiQVJHU19FTlY6OmV2YWxfcHJvY2Vzc29yX2FycmF5X2x2YWx1ZSA6PiAiCisJCQkJCQkiVW5leHBlY3RlZCBhcmdjb2RlIDw8ICIgPDwgYnl0ZWNvZGUuc3RyQ29kZSgpCisJCQkJCTw8ICIgPj4gZm9yIDogPDwgIiA8PCBhcmcuc3RyKCkgPDwgIiAhISEiCisJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJY3VycmVudCggZ2VuQXJyYXkoCisJCQkJCWJ5dGVjb2RlLmR0eXBlLT5hczwgQ29udGFpbmVyVHlwZVNwZWNpZmllciA+KCksIGFyZykgKTsKKworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorfQorCisKK2Jvb2wgQVJHU19FTlY6OmV2YWxfcHJvY2Vzc29yX2FycmF5X3J2YWx1ZShBdm1CeXRlY29kZSAmIGJ5dGVjb2RlLCBCRiAmIGFyZykKK3sKKwlzd2l0Y2goIGJ5dGVjb2RlLm9wZXJhbmQgKQorCXsKKwkJY2FzZSBBVk1fQVJHX0FSUkFZX0tJTkQ6CisJCXsKKwkJCUFycmF5QkYgJiBhcmdBcnJheSA9IGFyZy5hc19yZWY8IEFycmF5QkYgPigpOworCisJCQlBcnJheUJGICogb3V0QXJyYXkgPSBuZXcgQXJyYXlCRigKKwkJCQkJYXJnQXJyYXkuZ2V0VHlwZVNwZWNpZmllcigpLCBhcmdBcnJheS5zaXplKCkpOworCisJCQlpZiggYXJnQXJyYXkuaGFzSW5zdHJ1Y3Rpb24oKSApCisJCQl7CisJCQkJQXZtSW5zdHJ1Y3Rpb24gKiBpbnN0cnVjdGlvbiA9IGFyZ0FycmF5LmdldEluc3RydWN0aW9uKCk7CisJCQkJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDAgOyBvZmZzZXQgPCBhcmdBcnJheS5zaXplKCkgOyArK29mZnNldCApCisJCQkJeworCQkJCQlvdXRBcnJheS0+c2V0KG9mZnNldCwgcmV0dXJuX2RlY29kZV9ldmFsX3Byb2Nlc3NvcigKKwkJCQkJCQlpbnN0cnVjdGlvbi0+YXQob2Zmc2V0KSwgYXJnQXJyYXlbb2Zmc2V0XSkpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJPDwgIkFSR1NfRU5WOjpldmFsX3Byb2Nlc3Nvcl9hcnJheV9ydmFsdWUgOj4gIgorCQkJCQkJCSJVbmV4cGVjdGVkIGFycmF5IHdpdGhvdXQgaW5zdHJ1Y3Rpb24gPDwgIgorCQkJCQkJPDwgYnl0ZWNvZGUuc3RyQ29kZSgpIDw8ICIgPj4gZm9yIDogPDwgIgorCQkJCQkJPDwgYXJnLnN0cigpIDw8ICIgISEhIgorCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJfQorCisJCQljdXJyZW50KCBCRiggb3V0QXJyYXkgKSApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWNhc2UgQVZNX0FSR19CVUlMVElOX0FSUkFZX0tJTkQ6CisJCXsKKwkJCWN1cnJlbnQoIGFyZyApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWNhc2UgQVZNX0FSR19CT09MRUFOX0tJTkQ6CisJCWNhc2UgQVZNX0FSR19JTlRFR0VSX0tJTkQ6CisJCWNhc2UgQVZNX0FSR19SQVRJT05BTF9LSU5EOgorCQljYXNlIEFWTV9BUkdfRkxPQVRfS0lORDoKKworCQljYXNlIEFWTV9BUkdfQlVJTFRJTl9LSU5EOgorCQljYXNlIEFWTV9BUkdfQ0hBUkFDVEVSX0tJTkQ6CisJCWNhc2UgQVZNX0FSR19TVFJJTkdfS0lORDoKKworCQljYXNlIEFWTV9BUkdfUE9SVF9LSU5EOgorCQljYXNlIEFWTV9BUkdfQlVGRkVSX0tJTkQ6CisJCWNhc2UgQVZNX0FSR19DT05ORUNUT1JfS0lORDoKKworCQljYXNlIEFWTV9BUkdfREFUQV9DU1RfS0lORDoKKwkJeworCQkJY3VycmVudCggZ2VuQXJyYXkoCisJCQkJCWJ5dGVjb2RlLmR0eXBlLT5hczwgQ29udGFpbmVyVHlwZVNwZWNpZmllciA+KCksIGFyZykgKTsKKworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWNhc2UgQVZNX0FSR19EQVRBX0tJTkQ6CisJCXsKKwkJCWN1cnJlbnQoIGdlbkFycmF5KCBieXRlY29kZS5kdHlwZS0+YXM8IENvbnRhaW5lclR5cGVTcGVjaWZpZXIgPigpLAorCQkJCQlFTlYtPmdldFJ2YWx1ZShvdXRFRCwgYXJnLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpKSApKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQljYXNlIEFWTV9BUkdfREFUQV9SRUZfS0lORDoKKwkJeworCQkJY3VycmVudCggZ2VuQXJyYXkoIGJ5dGVjb2RlLmR0eXBlLT5hczwgQ29udGFpbmVyVHlwZVNwZWNpZmllciA+KCksCisJCQkJCUVOVi0+Z2V0UnZhbHVlKG91dEVELCBFTlYtPmdldFJ2YWx1ZShvdXRFRCwgYXJnLnRvX3B0cjwKKwkJCQkJCQlJbnN0YW5jZU9mRGF0YSA+KCkpLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpKSApKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQljYXNlIEFWTV9BUkdfREFUQV9NQUNST19LSU5EOgorCQl7CisJCQlCRiBydmFsdWUgID0gRU5WLT5nZXRSdmFsdWUob3V0RUQsIGFyZy50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSk7CisKKwkJCWlmKCBydmFsdWUuaXM8IEluc3RhbmNlT2ZEYXRhID4oKSApCisJCQl7CisJCQkJcnZhbHVlID0gRU5WLT5nZXRSdmFsdWUob3V0RUQsIHJ2YWx1ZS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYoIGRlY29kZV9ldmFsX3J2YWx1ZSggcnZhbHVlICkgKQorCQkJCXsKKwkJCQkJcnZhbHVlID0gY3VycmVudCgpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJfQorCQkJfQorCisJCQljdXJyZW50KCBnZW5BcnJheSgKKwkJCQkJYnl0ZWNvZGUuZHR5cGUtPmFzPCBDb250YWluZXJUeXBlU3BlY2lmaWVyID4oKSwgcnZhbHVlICkpOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWNhc2UgQVZNX0FSR19EQVRBX1VGSV9LSU5EOgorCQl7CisJCQlpZiggZXZhbF9wcm9jZXNzb3JfZG1hX3J2YWx1ZV91ZmlfcG9pbnRlcihieXRlY29kZSwgYXJnKSApCisJCQl7CisJCQkJY3VycmVudCggZ2VuQXJyYXkoIGJ5dGVjb2RlLmR0eXBlLT5hczwKKwkJCQkJCUNvbnRhaW5lclR5cGVTcGVjaWZpZXIgPigpLCBjdXJyZW50KCkgKSApOworCisJCQkJcmV0dXJuKCB0cnVlICk7CisJCQl9CisKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCisJCWNhc2UgQVZNX0FSR19NQUNISU5FX1JJRDoKKwkJY2FzZSBBVk1fQVJHX0VYUFJFU1NJT05fUklEOgorCQljYXNlIEFWTV9BUkdfU0VMRl9SSUQ6CisJCWNhc2UgQVZNX0FSR19QQVJFTlRfUklEOgorCQljYXNlIEFWTV9BUkdfQ09NTVVOSUNBVE9SX1JJRDoKKwkJY2FzZSBBVk1fQVJHX1NZU1RFTV9SSUQ6CisJCWNhc2UgQVZNX0FSR19FTlZJUk9OTUVOVF9SSUQ6CisJCWNhc2UgQVZNX0FSR19DT01QT05FTlRfU0VMRl9SSUQ6CisJCWNhc2UgQVZNX0FSR19DT01QT05FTlRfUEFSRU5UX1JJRDoKKwkJY2FzZSBBVk1fQVJHX0NPTVBPTkVOVF9DT01NVU5JQ0FUT1JfUklEOgorCQl7CisJCQljdXJyZW50KCBnZW5BcnJheSggYnl0ZWNvZGUuZHR5cGUtPmFzPCBDb250YWluZXJUeXBlU3BlY2lmaWVyID4oKSwKKwkJCQkJcmV0dXJuX2RlY29kZV9ldmFsX21hY2hpbmUoIGFyZyApICkpOworCisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisKKworCQljYXNlIEFWTV9BUkdfRVhQUkVTU0lPTl9LSU5EOgorCQl7CisJCQlyZXR1cm4oIGV2YWxfcHJvY2Vzc29yX2FycmF5X3J2YWx1ZSgKKwkJCQkJYnl0ZWNvZGUsIGFyZy50b19wdHI8IEF2bUNvZGUgPigpICkgKTsKKwkJfQorCisKKwkJZGVmYXVsdDoKKwkJeworCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJPDwgIkFSR1NfRU5WOjpldmFsX3Byb2Nlc3Nvcl9hcnJheV9ydmFsdWUgOj4gIgorCQkJCQkJIlVuZXhwZWN0ZWQgYXJnY29kZSA8PCAiIDw8IGJ5dGVjb2RlLnN0ckNvZGUoKQorCQkJCQk8PCAiID4+IGZvciA6ICIgPDwgYXJnLnN0cigpIDw8ICIgISEhIgorCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCWN1cnJlbnQoIGdlbkFycmF5KAorCQkJCQlieXRlY29kZS5kdHlwZS0+YXM8IENvbnRhaW5lclR5cGVTcGVjaWZpZXIgPigpLCBhcmcpICk7CisKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KK30KKworCitCRiBBUkdTX0VOVjo6Z2VuQXJyYXkoQ29udGFpbmVyVHlwZVNwZWNpZmllciAqIGFycmF5VCwgY29uc3QgQkYgJiBhcmcpCit7CisJQkYgdmFsdWUgPSAoIGFycmF5VC0+Z2V0Q29udGVudHNUeXBlU3BlY2lmaWVyKCkuaXNUeXBlZEFycmF5KCkgKT8KKwkJCWdlbkFycmF5KCBhcnJheVQtPmdldENvbnRlbnRzVHlwZVNwZWNpZmllcigpLnJhd0NvbnRhaW5lcigpLCBhcmcgKQorCQkJOiBhcmc7CisKKwlyZXR1cm4oIEJGKCBuZXcgQXJyYXlCRihhcnJheVQsIHZhbHVlKSApICk7Cit9CisKKworCitib29sIEFSR1NfRU5WOjpldmFsX3Byb2Nlc3Nvcl9hcnJheV9ydmFsdWUoQXZtQnl0ZWNvZGUgJiBieXRlY29kZSwgQXZtQ29kZSAqIGFDb2RlKQoreworCUluc3RydWN0aW9uRW52aXJvbm1lbnQgRVZBTF9BUkcoRU5WLCBvdXRFRCwgYUNvZGUtPnNpemUoKSk7CisJaWYoIEVWQUxfQVJHLm1BUkctPm1haW5fZGVjb2RlX2V2YWxfYXJncyhhQ29kZSkgKQorCXsKKwkJb3V0RUQgPSBFVkFMX0FSRy5tQVJHLT5vdXRFRDsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuKCBhQ29kZSApOworCX0KKworCXN3aXRjaCggYUNvZGUtPmdldEF2bU9wQ29kZSgpICkKKwl7CisJCWNhc2UgQVZNX09QQ09ERV9DT05DQVQ6CisJCXsKKwkJCWNvbnN0IEFycmF5QkYgJiBhcmcxQXJyYXkgPSBFVkFMX0FSRy5tQVJHLT5hdCgwKS5hc19yZWY8IEFycmF5QkYgPigpOworCQkJY29uc3QgQXJyYXlCRiAmIGFyZzJBcnJheSA9IEVWQUxfQVJHLm1BUkctPmF0KDEpLmFzX3JlZjwgQXJyYXlCRiA+KCk7CisKKwkJCUFycmF5QkYgKiBvdXRBcnJheSA9IG5ldyBBcnJheUJGKCBhcmcxQXJyYXkuZ2V0VHlwZVNwZWNpZmllcigpLAorCQkJCQlhcmcxQXJyYXkuc2l6ZSgpICsgYXJnMkFycmF5LnNpemUoKSApOworCisJCQlhdm1fc2l6ZV90IG9mZnNldCA9IDA7CisJCQlmb3IoIDsgb2Zmc2V0IDwgYXJnMUFycmF5LnNpemUoKSA7ICsrb2Zmc2V0ICkKKwkJCXsKKwkJCQlvdXRBcnJheS0+c2V0KG9mZnNldCwgYXJnMUFycmF5W29mZnNldF0pOworCQkJfQorCisJCQlmb3IoIGF2bV9zaXplX3QgcG9zID0gMCA7IHBvcyA8IGFyZzJBcnJheS5zaXplKCkgOyArK3BvcyAsICsrb2Zmc2V0ICkKKwkJCXsKKwkJCQlvdXRBcnJheS0+c2V0KG9mZnNldCwgYXJnMkFycmF5W3Bvc10pOworCQkJfQorCisJCQljdXJyZW50KCBCRiggb3V0QXJyYXkgKSApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9SRU1PVkU6CisJCXsKKwkJCWNvbnN0IEFycmF5QkYgJiBhcmcxQXJyYXkgPSBFVkFMX0FSRy5tQVJHLT5hdCgwKS5hc19yZWY8IEFycmF5QkYgPigpOworCisJCQlBcnJheUJGICogb3V0QXJyYXkgPSBuZXcgQXJyYXlCRigKKwkJCQkJYXJnMUFycmF5LmdldFR5cGVTcGVjaWZpZXIoKSwgYXJnMUFycmF5LnNpemUoKSApOworCisJCQlhdm1fc2l6ZV90IG9mZnNldCA9IDA7CisJCQlmb3IoIGF2bV9zaXplX3QgcG9zID0gMCA7IHBvcyA8IGFyZzFBcnJheS5zaXplKCkgOyArK3BvcyApCisJCQl7CisJCQkJaWYoIGFyZzFBcnJheVtwb3NdID09IEVWQUxfQVJHLm1BUkctPmF0KDEpICkKKwkJCQl7CisJCQkJCW91dEFycmF5LT5zZXQob2Zmc2V0LCBhcmcxQXJyYXlbb2Zmc2V0XSk7CisJCQkJCSsrb2Zmc2V0OworCQkJCX0KKwkJCX0KKwkJCW91dEFycmF5LT5yZXNpemUoIG9mZnNldCApOworCisJCQljdXJyZW50KCBCRiggb3V0QXJyYXkgKSApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisvLwkJY2FzZSBBVk1fT1BDT0RFX0NUT1I6CisvLwkJeworLy8JCQlCRiB2YWx1ZSA9IHJldHVybl9kZWNvZGVfZXZhbF9wcm9jZXNzb3IoCisvLwkJCQkJYUNvZGUtPmdldEluc3RydWN0aW9uKCktPmdldE1haW5CeXRlY29kZSgpLCBhcmcpOworLy8KKy8vCQkJY3VycmVudCggZ2VuQXJyYXkoCisvLwkJCQkJYnl0ZWNvZGUuZHR5cGUtPmFzPCBDb250YWluZXJUeXBlU3BlY2lmaWVyID4oKSwgdmFsdWUpICk7CisvLworLy8JCQlyZXR1cm4oIHRydWUgKTsKKy8vCQl9CisKKwkJY2FzZSBBVk1fT1BDT0RFX0NPTlRBSU5TOgorCQl7CisJCQljdXJyZW50KCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oCisJCQkJCUVWQUxfQVJHLm1BUkctPmF0KDApLmFzX3JlZjwgQXJyYXlCRiA+KCkuY29udGFpbnMoCisJCQkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMSkpICkpOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9JTjoKKwkJeworCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKAorCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgxKS5hc19yZWY8IEFycmF5QkYgPigpLmNvbnRhaW5zKAorCQkJCQkJCUVWQUxfQVJHLm1BUkctPmF0KDApKSApKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwkJY2FzZSBBVk1fT1BDT0RFX05PVElOOgorCQl7CisJCQljdXJyZW50KCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oIG5vdAorCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgxKS5hc19yZWY8IEFycmF5QkYgPigpLmNvbnRhaW5zKAorCQkJCQkJCUVWQUxfQVJHLm1BUkctPmF0KDApKSApKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfU1RBUlRTX1dJVEg6CisJCXsKKwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbigKKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMCkuYXNfcmVmPCBBcnJheUJGID4oKS5zdGFydHNXaXRoKAorCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgxKS5hc19yZWY8IEFycmF5QkYgPigpKSApKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwkJY2FzZSBBVk1fT1BDT0RFX0VORFNfV0lUSDoKKwkJeworCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKAorCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgwKS5hc19yZWY8IEFycmF5QkYgPigpLmVuZHNXaXRoKAorCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgxKS5hc19yZWY8IEFycmF5QkYgPigpKSApKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfRU1QVFk6CisJCXsKKwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbigKKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMCkuYXNfcmVmPCBBcnJheUJGID4oKS5lbXB0eSgpICkgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfTk9ORU1QVFk6CisJCXsKKwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbigKKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMCkuYXNfcmVmPCBBcnJheUJGID4oKS5ub25lbXB0eSgpICkgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwkJY2FzZSBBVk1fT1BDT0RFX1NJTkdMRVRPTjoKKwkJeworCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKAorCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgwKS5hc19yZWY8IEFycmF5QkYgPigpLnNpbmdsZXRvbigpICkgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwkJY2FzZSBBVk1fT1BDT0RFX1BPUFVMQVRFRDoKKwkJeworCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKAorCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgwKS5hc19yZWY8IEFycmF5QkYgPigpLnBvcHVsYXRlZCgpICkgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfU0laRToKKwkJeworCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdVSW50ZWdlcigKKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMCkuYXNfcmVmPCBBcnJheUJGID4oKS5zaXplKCkgKSApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisKKwkJY2FzZSBBVk1fT1BDT0RFX0VROgorCQl7CisJCQljdXJyZW50KCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oCisJCQkJCUVWQUxfQVJHLm1BUkctPmF0KDApLmFzX3JlZjwgQXJyYXlCRiA+KCkuaXNFUSgKKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMSkuYXNfcmVmPCBBcnJheUJGID4oKSkgKSk7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisJCWNhc2UgQVZNX09QQ09ERV9TRVE6CisJCXsKKwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbigKKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMCkuYXNfcmVmPCBBcnJheUJGID4oKS5pc1NFUSgKKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMSkuYXNfcmVmPCBBcnJheUJGID4oKSkgKSk7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisKKworCQljYXNlIEFWTV9PUENPREVfTkVROgorCQl7CisJCQljdXJyZW50KCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oCisJCQkJCUVWQUxfQVJHLm1BUkctPmF0KDApLmFzX3JlZjwgQXJyYXlCRiA+KCkuaXNORVEoCisJCQkJCUVWQUxfQVJHLm1BUkctPmF0KDEpLmFzX3JlZjwgQXJyYXlCRiA+KCkpICkpOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCQljYXNlIEFWTV9PUENPREVfTlNFUToKKwkJeworCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKAorCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgwKS5hc19yZWY8IEFycmF5QkYgPigpLmlzTlNFUSgKKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMSkuYXNfcmVmPCBBcnJheUJGID4oKSkgKSk7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisKKy8vCQljYXNlIEFWTV9PUENPREVfTFQ6CisvLwkJeworLy8JCQljdXJyZW50KCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oCisvLwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMCkuYXNfcmVmPCBBcnJheUJGID4oKS5pc0xUKAorLy8JCQkJCUVWQUxfQVJHLm1BUkctPmF0KDEpLmFzX3JlZjwgQXJyYXlCRiA+KCkpICkpOworLy8KKy8vCQkJcmV0dXJuKCB0cnVlICk7CisvLwkJfQorLy8JCWNhc2UgQVZNX09QQ09ERV9MVEU6CisvLwkJeworLy8JCQljdXJyZW50KCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oCisvLwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMCkuYXNfcmVmPCBBcnJheUJGID4oKS5pc0xURSgKKy8vCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgxKS5hc19yZWY8IEFycmF5QkYgPigpKSApKTsKKy8vCisvLwkJCXJldHVybiggdHJ1ZSApOworLy8JCX0KKy8vCisvLwkJY2FzZSBBVk1fT1BDT0RFX0dUOgorLy8JCXsKKy8vCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKAorLy8JCQkJCUVWQUxfQVJHLm1BUkctPmF0KDApLmFzX3JlZjwgQXJyYXlCRiA+KCkuaXNHVCgKKy8vCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgxKS5hc19yZWY8IEFycmF5QkYgPigpKSApKTsKKy8vCisvLwkJCXJldHVybiggdHJ1ZSApOworLy8JCX0KKy8vCQljYXNlIEFWTV9PUENPREVfR1RFOgorLy8JCXsKKy8vCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKAorLy8JCQkJCUVWQUxfQVJHLm1BUkctPmF0KDApLmFzX3JlZjwgQXJyYXlCRiA+KCkuaXNHVEUoCisvLwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMSkuYXNfcmVmPCBBcnJheUJGID4oKSkgKSk7CisvLworLy8JCQlyZXR1cm4oIHRydWUgKTsKKy8vCQl9CisKKworCQlkZWZhdWx0OgorCQl7CisJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQk8PCAiQVJHU19FTlY6OmV2YWxfcHJvY2Vzc29yX3N0cmluZyA6PiAiCisJCQkJCQkiVW5leHBlY3RlZCBieXRlY29kZSA8PCAiIDw8IGJ5dGVjb2RlLnN0ckNvZGUoKQorCQkJCQk8PCAiID4+IGZvciA6ICIgPDwgYUNvZGUtPnN0ckRlYnVnKCkgPDwgIiAhISEiCisJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorfQorCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLyBFVkFMIFBST0NFU1NPUiBRVUVVRQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICogRVZBTCBQUk9DRVNTT1IgPCBBVk1fQVJHX0NPTExFQ1RJT05fQ1BVID4KKyAqLworYm9vbCBBUkdTX0VOVjo6ZXZhbF9wcm9jZXNzb3JfdmVjdG9yKEF2bUJ5dGVjb2RlICYgYnl0ZWNvZGUsIEJGICYgYXJnKQoreworCXN3aXRjaCggYnl0ZWNvZGUub3BlcmFuZCApCisJeworCQljYXNlIEFWTV9BUkdfRVhQUkVTU0lPTl9LSU5EOgorCQl7CisJCQlyZXR1cm4oIGV2YWxfcHJvY2Vzc29yX3ZlY3RvcigKKwkJCQkJYnl0ZWNvZGUsIGFyZy50b19wdHI8IEF2bUNvZGUgPigpICkpOworCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJPDwgIkFSR1NfRU5WOjpldmFsX3Byb2Nlc3Nvcl9xdWV1ZSA6PiAiCisJCQkJCQkiVW5leHBlY3RlZCBieXRlY29kZSA8PCAiIDw8IGJ5dGVjb2RlLnN0ckNvZGUoKQorCQkJCQk8PCAiID4+IGZvciA6ICIgPDwgYXJnLnN0cigpIDw8ICIgISEhIgorCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCWN1cnJlbnQoIGFyZyApOworCisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKwl9Cit9CisKKworYm9vbCBBUkdTX0VOVjo6ZXZhbF9wcm9jZXNzb3JfdmVjdG9yKEF2bUJ5dGVjb2RlICYgYnl0ZWNvZGUsIEF2bUNvZGUgKiBhQ29kZSkKK3sKKwlJbnN0cnVjdGlvbkVudmlyb25tZW50IEVWQUxfQVJHKEVOViwgb3V0RUQsIGFDb2RlLT5zaXplKCkpOworCWlmKCBFVkFMX0FSRy5tQVJHLT5tYWluX2RlY29kZV9ldmFsX2FyZ3MoYUNvZGUpICkKKwl7CisJCW91dEVEID0gRVZBTF9BUkcubUFSRy0+b3V0RUQ7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiggYUNvZGUgKTsKKwl9CisKKwlzd2l0Y2goIGFDb2RlLT5nZXRBdm1PcENvZGUoKSApCisJeworCQljYXNlIEFWTV9PUENPREVfQ09OVEFJTlM6CisJCXsKKwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbigKKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMCkudG9fcHRyPCBCdWlsdGluVmVjdG9yID4oKQorCQkJCQktPmNvbnRhaW5zKCBFVkFMX0FSRy5tQVJHLT5hdCgxKSApICkpOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9JTjoKKwkJeworCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKAorCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgxKS50b19wdHI8IEJ1aWx0aW5WZWN0b3IgPigpCisJCQkJCS0+Y29udGFpbnMoIEVWQUxfQVJHLm1BUkctPmF0KDApICkgKSk7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisJCWNhc2UgQVZNX09QQ09ERV9OT1RJTjoKKwkJeworCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKCBub3QKKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMSkudG9fcHRyPCBCdWlsdGluVmVjdG9yID4oKQorCQkJCQktPmNvbnRhaW5zKCBFVkFMX0FSRy5tQVJHLT5hdCgwKSApICkpOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisvLwkJY2FzZSBBVk1fT1BDT0RFX1NUQVJUU19XSVRIOgorLy8JCXsKKy8vCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKCBTdHJpbmdUb29sczo6c3RhcnRzV2l0aCgKKy8vCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgwKS50b19wdHI8IEJ1aWx0aW5WZWN0b3IgPigpLT5nZXRWYWx1ZSgpLAorLy8JCQkJCUVWQUxfQVJHLm1BUkctPmF0KDEpLnRvX3B0cjwgQnVpbHRpblZlY3RvciA+KCktPmdldFZhbHVlKCkgKSkpOworLy8KKy8vCQkJcmV0dXJuKCB0cnVlICk7CisvLwkJfQorLy8JCWNhc2UgQVZNX09QQ09ERV9FTkRTX1dJVEg6CisvLwkJeworLy8JCQljdXJyZW50KCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oIFN0cmluZ1Rvb2xzOjplbmRzV2l0aCgKKy8vCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgwKS50b19wdHI8IEJ1aWx0aW5WZWN0b3IgPigpLT5nZXRWYWx1ZSgpLAorLy8JCQkJCUVWQUxfQVJHLm1BUkctPmF0KDEpLnRvX3B0cjwgQnVpbHRpblZlY3RvciA+KCktPmdldFZhbHVlKCkgKSkpOworLy8KKy8vCQkJcmV0dXJuKCB0cnVlICk7CisvLwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9FTVBUWToKKwkJeworCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKAorCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgwKQorCQkJCQkJLnRvX3B0cjwgQnVpbHRpblZlY3RvciA+KCktPmVtcHR5KCkgKSApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9OT05FTVBUWToKKwkJeworCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKAorCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgwKQorCQkJCQkJLnRvX3B0cjwgQnVpbHRpblZlY3RvciA+KCktPm5vbmVtcHR5KCkgKSApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCQljYXNlIEFWTV9PUENPREVfU0lOR0xFVE9OOgorCQl7CisJCQljdXJyZW50KCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oCisJCQkJCUVWQUxfQVJHLm1BUkctPmF0KDApCisJCQkJCQkudG9fcHRyPCBCdWlsdGluVmVjdG9yID4oKS0+c2luZ2xldG9uKCkgKSApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCQljYXNlIEFWTV9PUENPREVfUE9QVUxBVEVEOgorCQl7CisJCQljdXJyZW50KCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oCisJCQkJCUVWQUxfQVJHLm1BUkctPmF0KDApCisJCQkJCQkudG9fcHRyPCBCdWlsdGluVmVjdG9yID4oKS0+cG9wdWxhdGVkKCkgKSApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9TSVpFOgorCQl7CisJCQljdXJyZW50KCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld1VJbnRlZ2VyKAorCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgwKQorCQkJCQkJLnRvX3B0cjwgQnVpbHRpblZlY3RvciA+KCktPnNpemUoKSApICk7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisKKy8vCQljYXNlIEFWTV9PUENPREVfRVE6CisvLwkJY2FzZSBBVk1fT1BDT0RFX1NFUToKKy8vCQl7CisvLwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbigKKy8vCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgwKS50b19wdHI8IEJ1aWx0aW5WZWN0b3IgPigpLT5nZXRWYWx1ZSgpLmNvbXBhcmUoCisvLwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMSkudG9fcHRyPCBCdWlsdGluVmVjdG9yID4oKS0+Z2V0VmFsdWUoKSkgPT0gMCApKTsKKy8vCisvLwkJCXJldHVybiggdHJ1ZSApOworLy8JCX0KKy8vCQljYXNlIEFWTV9PUENPREVfTkVROgorLy8JCWNhc2UgQVZNX09QQ09ERV9OU0VROgorLy8JCXsKKy8vCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKAorLy8JCQkJCUVWQUxfQVJHLm1BUkctPmF0KDApLnRvX3B0cjwgQnVpbHRpblZlY3RvciA+KCktPmdldFZhbHVlKCkuY29tcGFyZSgKKy8vCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgxKS50b19wdHI8IEJ1aWx0aW5WZWN0b3IgPigpLT5nZXRWYWx1ZSgpKSAhPSAwICkgKTsKKy8vCisvLwkJCXJldHVybiggdHJ1ZSApOworLy8JCX0KKy8vCisvLwkJY2FzZSBBVk1fT1BDT0RFX1BPUDoKKy8vCQljYXNlIEFWTV9PUENPREVfUFVTSDoKKy8vCQljYXNlIEFWTV9PUENPREVfQVNTSUdOX1RPUDoKKy8vCQl7CisvLwkJCXN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisvLwkJCWZvciggYmVnaW4oKSA7IGhhc05leHQoKSA7IG5leHQoKSApCisvLwkJCXsKKy8vCQkJCW9zcyA8PCBjdXJyZW50KCkudG9fcHRyPCBCdWlsdGluVmVjdG9yID4oKS0+Z2V0VmFsdWUoKTsKKy8vCQkJfQorLy8KKy8vCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdTdHJpbmcob3NzLnN0cigpKSApOworLy8KKy8vCQkJcmV0dXJuKCB0cnVlICk7CisvLwkJfQorCisKKwkJY2FzZSBBVk1fT1BDT0RFX0FQUEVORDoKKwkJeworCQkJQnVpbHRpblZlY3RvciAqIGJWZWN0b3IgPQorCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgwKS50b19wdHI8IEJ1aWx0aW5WZWN0b3IgPigpOworCQkJZm9yKCBFVkFMX0FSRy5tQVJHLT5iZWdpbigxKSA7IEVWQUxfQVJHLm1BUkctPmhhc05leHQoKSA7CisJCQkJCUVWQUxfQVJHLm1BUkctPm5leHQoKSApCisJCQl7CisJCQkJaWYoIG5vdCBiVmVjdG9yLT5hZGQoIEVWQUxfQVJHLm1BUkctPmN1cnJlbnQoKSApICkKKwkJCQl7CitBVk1fSUZfREVCVUdfRkxBRyggU1RBVEVNRU5UKQorCUFWTV9PU19UUkFDRSA8PCAiVEhST1cgVU5TQVRJU0ZJRUQgPDwgQVBQRU5EID4+IDogIgorCQkJPDwgIG91dEVELT5tUklELnN0clVuaXFJZCgpIDw8ICIgfD0+ICIKKwkJCTw8IGFDb2RlLT5zdHIoKSA8PCBzdGQ6OmVuZGw7CisJQVZNX09TX1RSQUNFIDw8ICJcdCIgPDwgIjxjYXBhY2l0eToiIDw8IGJWZWN0b3ItPmNhcGFjaXR5KCkKKwkJCTw8ICI+ICIgPDwgYlZlY3Rvci0+c3RyKCkgPDwgIiA8PTwgIgorCQkJPDwgRVZBTF9BUkcubUFSRy0+Y3VycmVudCgpLnN0cigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTVEFURU1FTlQpCisKKwkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCX0KKwkJCX0KKworCQkJY3VycmVudCggRVZBTF9BUkcubUFSRy0+YXQoMCkgKTsKKworQVZNX0lGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9BU1NJR05NRU5UICkKKwkJCUFWTV9PU19UUkFDRSA8PCAicnZhbHVlOj4gIiA8PCBiVmVjdG9yLT5zdHIoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX0FTU0lHTk1FTlQgKQorCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9SRU1PVkU6CisJCXsKKwkJCUJ1aWx0aW5WZWN0b3IgKiBiVmVjdG9yID0KKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMCkudG9fcHRyPCBCdWlsdGluVmVjdG9yID4oKTsKKwkJCWZvciggRVZBTF9BUkcubUFSRy0+YmVnaW4oMSkgOyBFVkFMX0FSRy5tQVJHLT5oYXNOZXh0KCkgOworCQkJCQlFVkFMX0FSRy5tQVJHLT5uZXh0KCkgKQorCQkJeworCQkJCWJWZWN0b3ItPnJlbW92ZSggRVZBTF9BUkcubUFSRy0+Y3VycmVudCgpICk7CisJCQl9CisKKwkJCWN1cnJlbnQoIEVWQUxfQVJHLm1BUkctPmF0KDApICk7CisKK0FWTV9JRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfQVNTSUdOTUVOVCApCisJQVZNX09TX1RSQUNFIDw8ICJydmFsdWU6PiAiIDw8IGJWZWN0b3ItPnN0cigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfQVNTSUdOTUVOVCApCisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisKKworCQljYXNlIEFWTV9PUENPREVfQ1RPUjoKKwkJeworCQkJQnVpbHRpbkNvbnRhaW5lciAqIGNvbnRhaW5lclZhbHVlID0gQnVpbHRpbkNvbnRhaW5lcjo6Y3JlYXRlKAorCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgwKS5hc19wdHI8IENvbnRhaW5lclR5cGVTcGVjaWZpZXIgPigpICk7CisKKwkJCUFycmF5QkYgKiBhcnJheVZhbHVlID0gRVZBTF9BUkcubUFSRy0+YXQoMSkuYXNfcHRyPCBBcnJheUJGID4oKTsKKworCQkJY29udGFpbmVyVmFsdWUtPmNvcHkoIGFycmF5VmFsdWUsIHN0ZDo6bWluKAorCQkJCQljb250YWluZXJWYWx1ZS0+Y2FwYWNpdHkoKSwgYXJyYXlWYWx1ZS0+c2l6ZSgpKSApOworCisJCQljdXJyZW50KCBCRiggY29udGFpbmVyVmFsdWUgKSApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCTw8ICJBUkdTX0VOVjo6ZXZhbF9wcm9jZXNzb3JfcXVldWUgOj4gIgorCQkJCQkJIlVuZXhwZWN0ZWQgYnl0ZWNvZGUgPDwgIiA8PCBieXRlY29kZS5zdHJDb2RlKCkKKwkJCQkJPDwgIiA+PiBmb3IgOiAiIDw8IGFDb2RlLT5zdHJEZWJ1ZygpIDw8ICIgISEhIgorCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vIEVWQUwgUFJPQ0VTU09SIENPTExFQ1RJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKKyAqIEVWQUwgUFJPQ0VTU09SIDwgQVZNX0FSR19DT0xMRUNUSU9OX0NQVSA+CisgKi8KK2Jvb2wgQVJHU19FTlY6OmV2YWxfcHJvY2Vzc29yX2NvbGxlY3Rpb24oQXZtQnl0ZWNvZGUgJiBieXRlY29kZSwgQkYgJiBhcmcpCit7CisJc3dpdGNoKCBieXRlY29kZS5vcGVyYW5kICkKKwl7CisJCWNhc2UgQVZNX0FSR19FWFBSRVNTSU9OX0tJTkQ6CisJCXsKKwkJCXJldHVybiggZXZhbF9wcm9jZXNzb3JfY29sbGVjdGlvbigKKwkJCQkJYnl0ZWNvZGUsIGFyZy50b19wdHI8IEF2bUNvZGUgPigpICkpOworCQl9CisKKwkJY2FzZSBBVk1fQVJHX0JVSUxUSU5fQ09OVEFJTkVSX0tJTkQ6CisJCXsKKwkJCWN1cnJlbnQoIGFyZyApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCTw8ICJBUkdTX0VOVjo6ZXZhbF9wcm9jZXNzb3JfY29sbGVjdGlvbiA6PiAiCisJCQkJCQkiVW5leHBlY3RlZCBieXRlY29kZSA8PCAiIDw8IGJ5dGVjb2RlLnN0ckNvZGUoKQorCQkJCQk8PCAiID4+IGZvciA6ICIgPDwgYXJnLnN0cigpIDw8ICIgISEhIgorCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCWN1cnJlbnQoIGFyZyApOworCisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKwl9Cit9CisKKworYm9vbCBBUkdTX0VOVjo6ZXZhbF9wcm9jZXNzb3JfY29sbGVjdGlvbihBdm1CeXRlY29kZSAmIGJ5dGVjb2RlLCBBdm1Db2RlICogYUNvZGUpCit7CisJSW5zdHJ1Y3Rpb25FbnZpcm9ubWVudCBFVkFMX0FSRyhFTlYsIG91dEVELCBhQ29kZS0+c2l6ZSgpKTsKKwlpZiggRVZBTF9BUkcubUFSRy0+bWFpbl9kZWNvZGVfZXZhbF9hcmdzKGFDb2RlKSApCisJeworCQlvdXRFRCA9IEVWQUxfQVJHLm1BUkctPm91dEVEOworCX0KKwllbHNlCisJeworCQlyZXR1cm4oIGFDb2RlICk7CisJfQorCisJc3dpdGNoKCBhQ29kZS0+Z2V0QXZtT3BDb2RlKCkgKQorCXsKKwkJY2FzZSBBVk1fT1BDT0RFX0NPTlRBSU5TOgorCQl7CisJCQlCdWlsdGluQ29sbGVjdGlvbiAqIGFDb2xsZWN0aW9uID0KKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMCkudG9fcHRyPCBCdWlsdGluQ29sbGVjdGlvbiA+KCk7CisKKwkJCWlmKCBhQ29sbGVjdGlvbi0+Y29udGFpbnMoIEVWQUxfQVJHLm1BUkctPmF0KDEpICkgKQorCQkJeworCQkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbih0cnVlKSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmKCBhQ29sbGVjdGlvbi0+c2luZ2xldG9uKCkgKQorCQkJCXsKKwkJCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjplcUV4cHIoCisJCQkJCQkJYUNvbGxlY3Rpb24tPmF0KDApLCBFVkFMX0FSRy5tQVJHLT5hdCgxKSkgKTsKKwkJCQl9CisJCQkJZWxzZSBpZiggYUNvbGxlY3Rpb24tPnBvcHVsYXRlZCgpICkKKwkJCQl7CisJCQkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3RXhwcigKKwkJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0NPTlRBSU5TLAorCQkJCQkJCUVWQUxfQVJHLm1BUkctPmF0KDApLCBFVkFMX0FSRy5tQVJHLT5hdCgxKSkgKTsKKwkJCQl9CisKKwkJCQllbHNlCisJCQkJeworCQkJCQljdXJyZW50KCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oZmFsc2UpICk7CisJCQkJfQorCQkJfQorCisvLwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbigKKy8vCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgwKS50b19wdHI8IEJ1aWx0aW5Db2xsZWN0aW9uID4oKQorLy8JCQkJCS0+Y29udGFpbnMoIEVWQUxfQVJHLm1BUkctPmF0KDEpICkgKSk7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisKKwkJY2FzZSBBVk1fT1BDT0RFX0lOOgorCQl7CisJCQlCdWlsdGluQ29sbGVjdGlvbiAqIGFDb2xsZWN0aW9uID0KKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMSkudG9fcHRyPCBCdWlsdGluQ29sbGVjdGlvbiA+KCk7CisKKwkJCWlmKCBhQ29sbGVjdGlvbi0+Y29udGFpbnMoIEVWQUxfQVJHLm1BUkctPmF0KDApICkgKQorCQkJeworCQkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbih0cnVlKSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmKCBhQ29sbGVjdGlvbi0+c2luZ2xldG9uKCkgKQorCQkJCXsKKwkJCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjplcUV4cHIoCisJCQkJCQkJYUNvbGxlY3Rpb24tPmF0KDApLCBFVkFMX0FSRy5tQVJHLT5hdCgwKSkgKTsKKwkJCQl9CisJCQkJZWxzZSBpZiggYUNvbGxlY3Rpb24tPnBvcHVsYXRlZCgpICkKKwkJCQl7CisJCQkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3RXhwcigKKwkJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0NPTlRBSU5TLAorCQkJCQkJCUVWQUxfQVJHLm1BUkctPmF0KDEpLCBFVkFMX0FSRy5tQVJHLT5hdCgwKSkgKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKGZhbHNlKSApOworCQkJCX0KKwkJCX0KKworLy8JCQljdXJyZW50KCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oCisvLwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMSkudG9fcHRyPCBCdWlsdGluQ29sbGVjdGlvbiA+KCkKKy8vCQkJCQktPmNvbnRhaW5zKCBFVkFMX0FSRy5tQVJHLT5hdCgwKSApICkpOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCQljYXNlIEFWTV9PUENPREVfTk9USU46CisJCXsKKwkJCUJ1aWx0aW5Db2xsZWN0aW9uICogYUNvbGxlY3Rpb24gPQorCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgxKS50b19wdHI8IEJ1aWx0aW5Db2xsZWN0aW9uID4oKTsKKworCQkJaWYoIGFDb2xsZWN0aW9uLT5jb250YWlucyggRVZBTF9BUkcubUFSRy0+YXQoMCkgKSApCisJCQl7CisJCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKGZhbHNlKSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmKCBhQ29sbGVjdGlvbi0+c2luZ2xldG9uKCkgKQorCQkJCXsKKwkJCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXFFeHByKAorCQkJCQkJCWFDb2xsZWN0aW9uLT5hdCgwKSwgRVZBTF9BUkcubUFSRy0+YXQoMCkpICk7CisJCQkJfQorCQkJCWVsc2UgaWYoIGFDb2xsZWN0aW9uLT5wb3B1bGF0ZWQoKSApCisJCQkJeworCQkJCQljdXJyZW50KCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5vdEV4cHIoCisJCQkJCQkJRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdFeHByKAorCQkJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0NPTlRBSU5TLAorCQkJCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgxKSwgRVZBTF9BUkcubUFSRy0+YXQoMCkpICkpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQljdXJyZW50KCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4odHJ1ZSkgKTsKKwkJCQl9CisJCQl9CisKKy8vCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKCBub3QKKy8vCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgxKS50b19wdHI8IEJ1aWx0aW5Db2xsZWN0aW9uID4oKQorLy8JCQkJCS0+Y29udGFpbnMoIEVWQUxfQVJHLm1BUkctPmF0KDApICkgKSk7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisKKwkJY2FzZSBBVk1fT1BDT0RFX0lOVEVSU0VDVDoKKwkJeworCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKAorCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgwKS50b19wdHI8IEJ1aWx0aW5MaXN0ID4oKS0+aW50ZXJzZWN0KAorCQkJCQkJCUVWQUxfQVJHLm1BUkctPmF0KDEpLmFzX3JlZjwgQnVpbHRpbkxpc3QgPigpICkpKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworLy8JCWNhc2UgQVZNX09QQ09ERV9TVEFSVFNfV0lUSDoKKy8vCQl7CisvLwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbiggU3RyaW5nVG9vbHM6OnN0YXJ0c1dpdGgoCisvLwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMCkudG9fcHRyPCBCdWlsdGluQ29sbGVjdGlvbiA+KCktPmdldFZhbHVlKCksCisvLwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMSkudG9fcHRyPCBCdWlsdGluQ29sbGVjdGlvbiA+KCktPmdldFZhbHVlKCkgKSkpOworLy8KKy8vCQkJcmV0dXJuKCB0cnVlICk7CisvLwkJfQorLy8JCWNhc2UgQVZNX09QQ09ERV9FTkRTX1dJVEg6CisvLwkJeworLy8JCQljdXJyZW50KCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oIFN0cmluZ1Rvb2xzOjplbmRzV2l0aCgKKy8vCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgwKS50b19wdHI8IEJ1aWx0aW5Db2xsZWN0aW9uID4oKS0+Z2V0VmFsdWUoKSwKKy8vCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgxKS50b19wdHI8IEJ1aWx0aW5Db2xsZWN0aW9uID4oKS0+Z2V0VmFsdWUoKSApKSk7CisvLworLy8JCQlyZXR1cm4oIHRydWUgKTsKKy8vCQl9CisKKwkJY2FzZSBBVk1fT1BDT0RFX0VNUFRZOgorCQl7CisJCQljdXJyZW50KCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oCisJCQkJCUVWQUxfQVJHLm1BUkctPmF0KDApCisJCQkJCQkudG9fcHRyPCBCdWlsdGluQ29sbGVjdGlvbiA+KCktPmVtcHR5KCkgKSApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9OT05FTVBUWToKKwkJeworCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKAorCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgwKQorCQkJCQkJLnRvX3B0cjwgQnVpbHRpbkNvbGxlY3Rpb24gPigpLT5ub25lbXB0eSgpICkgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwkJY2FzZSBBVk1fT1BDT0RFX1NJTkdMRVRPTjoKKwkJeworCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKAorCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgwKQorCQkJCQkJLnRvX3B0cjwgQnVpbHRpbkNvbGxlY3Rpb24gPigpLT5zaW5nbGV0b24oKSApKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwkJY2FzZSBBVk1fT1BDT0RFX1BPUFVMQVRFRDoKKwkJeworCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKAorCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgwKQorCQkJCQkJLnRvX3B0cjwgQnVpbHRpbkNvbGxlY3Rpb24gPigpLT5wb3B1bGF0ZWQoKSkgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwkJY2FzZSBBVk1fT1BDT0RFX0ZVTEw6CisJCXsKKwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbigKKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMCkKKwkJCQkJCS50b19wdHI8IEJ1aWx0aW5Db2xsZWN0aW9uID4oKS0+ZnVsbCgpICkgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfU0laRToKKwkJeworCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdVSW50ZWdlcigKKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMCkKKwkJCQkJCS50b19wdHI8IEJ1aWx0aW5Db2xsZWN0aW9uID4oKS0+c2l6ZSgpICkgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworLy8JCWNhc2UgQVZNX09QQ09ERV9FUToKKy8vCQljYXNlIEFWTV9PUENPREVfU0VROgorLy8JCXsKKy8vCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKAorLy8JCQkJCUVWQUxfQVJHLm1BUkctPmF0KDApLnRvX3B0cjwgQnVpbHRpbkNvbGxlY3Rpb24gPigpLT5nZXRWYWx1ZSgpLmNvbXBhcmUoCisvLwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMSkudG9fcHRyPCBCdWlsdGluQ29sbGVjdGlvbiA+KCktPmdldFZhbHVlKCkpID09IDAgKSk7CisvLworLy8JCQlyZXR1cm4oIHRydWUgKTsKKy8vCQl9CisvLwkJY2FzZSBBVk1fT1BDT0RFX05FUToKKy8vCQljYXNlIEFWTV9PUENPREVfTlNFUToKKy8vCQl7CisvLwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbigKKy8vCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgwKS50b19wdHI8IEJ1aWx0aW5Db2xsZWN0aW9uID4oKS0+Z2V0VmFsdWUoKS5jb21wYXJlKAorLy8JCQkJCUVWQUxfQVJHLm1BUkctPmF0KDEpLnRvX3B0cjwgQnVpbHRpbkNvbGxlY3Rpb24gPigpLT5nZXRWYWx1ZSgpKSAhPSAwICkgKTsKKy8vCisvLwkJCXJldHVybiggdHJ1ZSApOworLy8JCX0KKworCisJCWNhc2UgQVZNX09QQ09ERV9UT1A6CisJCXsKKwkJCWN1cnJlbnQoIEVWQUxfQVJHLm1BUkctPmF0KDApLmFzX3B0cjwgQnVpbHRpblF1ZXVlID4oKS0+dG9wKCkgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfUE9QOgorCQl7CisJCQljdXJyZW50KCBFVkFMX0FSRy5tQVJHLT5hdCgwKS5hc19wdHI8IEJ1aWx0aW5RdWV1ZSA+KCktPnBvcCgpICk7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisKKwkJY2FzZSBBVk1fT1BDT0RFX1BPUF9GUk9NOgorCQl7CisJCQljdXJyZW50KCBFVkFMX0FSRy5tQVJHLT5hdCgwKS5hc19wdHI8IEJ1aWx0aW5RdWV1ZSA+KCktPnBvcF9mcm9tKAorCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgxKS5hc19yZWY8IEJ1aWx0aW5MaXN0ID4oKSkgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfUFVTSDoKKwkJeworCQkJQnVpbHRpbkNvbnRhaW5lciAqIHF1ZXVlID0KKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMCkuYXNfcHRyPCBCdWlsdGluQ29udGFpbmVyID4oKTsKKwkJCWZvciggRVZBTF9BUkcubUFSRy0+YmVnaW4oMSkgOyBFVkFMX0FSRy5tQVJHLT5oYXNOZXh0KCkgOworCQkJCQlFVkFMX0FSRy5tQVJHLT5uZXh0KCkgKQorCQkJeworCQkJCWlmKCBub3QgcXVldWUtPnB1c2goIEVWQUxfQVJHLm1BUkctPmN1cnJlbnQoKSApICkKKwkJCQl7CitBVk1fSUZfREVCVUdfRkxBRyggU1RBVEVNRU5UKQorCUFWTV9PU19UUkFDRSA8PCAiVEhST1cgVU5TQVRJU0ZJRUQgPDwgUFVTSCA+PiA6ICIKKwkJCTw8ICBvdXRFRC0+bVJJRC5zdHJVbmlxSWQoKSA8PCAiIHw9PiAiCisJCQk8PCBhQ29kZS0+c3RyKCkgPDwgc3RkOjplbmRsOworCUFWTV9PU19UUkFDRSA8PCAiXHQiIDw8ICI8Y2FwYWNpdHk6IiA8PCBxdWV1ZS0+Y2FwYWNpdHkoKQorCQkJPDwgIj4gIiA8PCBxdWV1ZS0+c3RyKCkgPDwgIiA8PTwgIgorCQkJPDwgRVZBTF9BUkcubUFSRy0+Y3VycmVudCgpLnN0cigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTVEFURU1FTlQpCisKKwkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCX0KKwkJCX0KKworCQkJY3VycmVudCggRVZBTF9BUkcubUFSRy0+YXQoMCkgKTsKKworQVZNX0lGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9BU1NJR05NRU5UICkKKwlBVk1fT1NfVFJBQ0UgPDwgInJ2YWx1ZTo+ICIgPDwgcXVldWUtPnN0cigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfQVNTSUdOTUVOVCApCisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisKKwkJY2FzZSBBVk1fT1BDT0RFX0FQUEVORDoKKwkJeworCQkJQnVpbHRpbkNvbnRhaW5lciAqIHF1ZXVlID0KKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMCkudG9fcHRyPCBCdWlsdGluQ29udGFpbmVyID4oKTsKKwkJCWZvciggRVZBTF9BUkcubUFSRy0+YmVnaW4oMSkgOyBFVkFMX0FSRy5tQVJHLT5oYXNOZXh0KCkgOworCQkJCQlFVkFMX0FSRy5tQVJHLT5uZXh0KCkgKQorCQkJeworCQkJCWlmKCBub3QgcXVldWUtPmFkZCggRVZBTF9BUkcubUFSRy0+Y3VycmVudCgpICkgKQorCQkJCXsKK0FWTV9JRl9ERUJVR19GTEFHKCBTVEFURU1FTlQpCisJQVZNX09TX1RSQUNFIDw8ICJUSFJPVyBVTlNBVElTRklFRCA8PCBBUFBFTkQgPj4gOiAiCisJCQk8PCAgb3V0RUQtPm1SSUQuc3RyVW5pcUlkKCkgPDwgIiB8PT4gIgorCQkJPDwgYUNvZGUtPnN0cigpIDw8IHN0ZDo6ZW5kbDsKKwlBVk1fT1NfVFJBQ0UgPDwgIlx0IiA8PCAiPGNhcGFjaXR5OiIgPDwgcXVldWUtPmNhcGFjaXR5KCkKKwkJCTw8ICI+ICIgPDwgcXVldWUtPnN0cigpIDw8ICIgPD08ICIKKwkJCTw8IEVWQUxfQVJHLm1BUkctPmN1cnJlbnQoKS5zdHIoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggU1RBVEVNRU5UKQorCisJCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCQl9CisJCQl9CisKKwkJCWN1cnJlbnQoIEVWQUxfQVJHLm1BUkctPmF0KDApICk7CisKK0FWTV9JRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfQVNTSUdOTUVOVCApCisJCQlBVk1fT1NfVFJBQ0UgPDwgInJ2YWx1ZTo+ICIgPDwgcXVldWUtPnN0cigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfQVNTSUdOTUVOVCApCisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisKKwkJY2FzZSBBVk1fT1BDT0RFX1JFTU9WRToKKwkJeworCQkJQnVpbHRpbkNvbnRhaW5lciAqIHF1ZXVlID0KKwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMCkudG9fcHRyPCBCdWlsdGluQ29udGFpbmVyID4oKTsKKwkJCWZvciggRVZBTF9BUkcubUFSRy0+YmVnaW4oMSkgOyBFVkFMX0FSRy5tQVJHLT5oYXNOZXh0KCkgOworCQkJCQlFVkFMX0FSRy5tQVJHLT5uZXh0KCkgKQorCQkJeworCQkJCXF1ZXVlLT5yZW1vdmUoIEVWQUxfQVJHLm1BUkctPmN1cnJlbnQoKSApOworCQkJfQorCisJCQljdXJyZW50KCBFVkFMX0FSRy5tQVJHLT5hdCgwKSApOworCitBVk1fSUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX0FTU0lHTk1FTlQgKQorCUFWTV9PU19UUkFDRSA8PCAicnZhbHVlOj4gIiA8PCBxdWV1ZS0+c3RyKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9BU1NJR05NRU5UICkKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfQVNTSUdOX1RPUDoKKwkJeworCQkJQnVpbHRpblF1ZXVlICogcXVldWUgPSBFVkFMX0FSRy5tQVJHLT5hdCgwKS50b19wdHI8IEJ1aWx0aW5RdWV1ZSA+KCk7CisJCQlpZiggcXVldWUtPm5vbmVtcHR5KCkgKQorCQkJeworQVZNX0lGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9BU1NJR05NRU5UICkKKwlBVk1fT1NfVFJBQ0UgPDwgImx2YWx1ZTpxdWV1ZT4gIiA8PCBxdWV1ZS0+c3RyKCkgPDwgc3RkOjplbmRsOworCUFWTV9PU19UUkFDRSA8PCAicnZhbHVlOj4gIiA8PCBFVkFMX0FSRy5tQVJHLT5hdCgxKS5zdHIoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX0FTU0lHTk1FTlQgKQorCisJCQkJaWYoIHF1ZXVlLT50b3AoIEVWQUxfQVJHLm1BUkctPmF0KDEpICkgKQorCQkJCXsKK0FWTV9JRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfQVNTSUdOTUVOVCApCisJQVZNX09TX1RSQUNFIDw8ICJxdWV1ZT4gIiA8PCBxdWV1ZS0+c3RyKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9BU1NJR05NRU5UICkKKworCQkJCQljdXJyZW50KCBFVkFMX0FSRy5tQVJHLT5hdCgxKSApOworCisJCQkJCXJldHVybiggdHJ1ZSApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworQVZNX0lGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVCkKKwlBVk1fT1NfVFJBQ0UgPDwgIlRIUk9XIFVOU0FUSVNGSUVEIDw8IEFTU0lORyNUT1AgPj4gOiAiCisJCQk8PCAgb3V0RUQtPm1SSUQuc3RyVW5pcUlkKCkgPDwgIiB8PT4gIgorCQkJPDwgYUNvZGUtPnN0cigpIDw8IHN0ZDo6ZW5kbDsKKwlBVk1fT1NfVFJBQ0UgPDwgIlx0IiA8PCAiYXNzaWduI3RvcCBpbiBxdWV1ZSA8PCAiCisJCQk8PCBFVkFMX0FSRy5tQVJHLT5hdCgwKS5zdHIoKSA8PCAiID4+IGZhaWxlZCAhISEiCisJCQk8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggU1RBVEVNRU5UKQorCisJCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CitBVk1fSUZfREVCVUdfRkxBRyggU1RBVEVNRU5UKQorCUFWTV9PU19UUkFDRSA8PCAiVEhST1cgVU5TQVRJU0ZJRUQgPDwgQVNTSU5HI1RPUCA+PiA6ICIKKwkJCTw8ICBvdXRFRC0+bVJJRC5zdHJVbmlxSWQoKSA8PCAiIHw9PiAiCisJCQk8PCBhQ29kZS0+c3RyKCkgPDwgc3RkOjplbmRsOworCUFWTV9PU19UUkFDRSA8PCAiXHQiIDw8ICJVbmV4cGVjdGVkIGFuIGVtcHR5IHF1ZXVlIDw8ICIKKwkJCTw8IEVWQUxfQVJHLm1BUkctPmF0KDApLnN0cigpIDw8ICIgPj4iIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTVEFURU1FTlQpCisKKwkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQl9CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfQ1RPUjoKKwkJeworCQkJQnVpbHRpbkNvbnRhaW5lciAqIGNvbnRhaW5lclZhbHVlID0gQnVpbHRpbkNvbnRhaW5lcjo6Y3JlYXRlKAorCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgwKS5hc19wdHI8IENvbnRhaW5lclR5cGVTcGVjaWZpZXIgPigpICk7CisKKwkJCUFycmF5QkYgKiBhcnJheVZhbHVlID0gRVZBTF9BUkcubUFSRy0+YXQoMSkuYXNfcHRyPCBBcnJheUJGID4oKTsKKworCQkJY29udGFpbmVyVmFsdWUtPmNvcHkoIGFycmF5VmFsdWUsIHN0ZDo6bWluKAorCQkJCQljb250YWluZXJWYWx1ZS0+Y2FwYWNpdHkoKSwgYXJyYXlWYWx1ZS0+c2l6ZSgpKSApOworCisJCQljdXJyZW50KCBCRiggY29udGFpbmVyVmFsdWUgKSApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCTw8ICJBUkdTX0VOVjo6ZXZhbF9wcm9jZXNzb3JfY29sbGVjdGlvbiA6PiAiCisJCQkJCQkiVW5leHBlY3RlZCBieXRlY29kZSA8PCAiIDw8IGJ5dGVjb2RlLnN0ckNvZGUoKQorCQkJCQk8PCAiID4+IGZvciA6ICIgPDwgYUNvZGUtPnN0ckRlYnVnKCkgPDwgIiAhISEiCisJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gRVZBTCBQUk9DRVNTT1IgQlVGRkVSCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCisgKiBFVkFMIFBST0NFU1NPUiA8IEFWTV9BUkdfQ09MTEVDVElPTl9DUFUgPgorICovCitib29sIEFSR1NfRU5WOjpldmFsX3Byb2Nlc3Nvcl9idWZmZXIoQXZtQnl0ZWNvZGUgJiBieXRlY29kZSwgQkYgJiBhcmcpCit7CisJc3dpdGNoKCBieXRlY29kZS5vcGVyYW5kICkKKwl7CisJCWNhc2UgQVZNX0FSR19FWFBSRVNTSU9OX0tJTkQ6CisJCXsKKwkJCXJldHVybiggZXZhbF9wcm9jZXNzb3JfYnVmZmVyKAorCQkJCQlieXRlY29kZSwgYXJnLnRvX3B0cjwgQXZtQ29kZSA+KCkgKSk7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQk8PCAiQVJHU19FTlY6OmV2YWxfcHJvY2Vzc29yX2J1ZmZlciA6PiAiCisJCQkJCQkiVW5leHBlY3RlZCBieXRlY29kZSA8PCAiIDw8IGJ5dGVjb2RlLnN0ckNvZGUoKQorCQkJCQk8PCAiID4+IGZvciA6ICIgPDwgYXJnLnN0cigpIDw8ICIgISEhIgorCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCWN1cnJlbnQoIGFyZyApOworCisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKwl9Cit9CisKKworYm9vbCBBUkdTX0VOVjo6ZXZhbF9wcm9jZXNzb3JfYnVmZmVyKEF2bUJ5dGVjb2RlICYgYnl0ZWNvZGUsIEF2bUNvZGUgKiBhQ29kZSkKK3sKKwlJbnN0cnVjdGlvbkVudmlyb25tZW50IEVWQUxfQVJHKEVOViwgb3V0RUQsIGFDb2RlLT5zaXplKCkpOworCWlmKCBFVkFMX0FSRy5tQVJHLT5tYWluX2RlY29kZV9ldmFsX2FyZ3MoYUNvZGUpICkKKwl7CisJCW91dEVEID0gRVZBTF9BUkcubUFSRy0+b3V0RUQ7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiggYUNvZGUgKTsKKwl9CisKKwlzd2l0Y2goIGFDb2RlLT5nZXRBdm1PcENvZGUoKSApCisJeworLy8JCWNhc2UgQVZNX09QQ09ERV9DT05UQUlOUzoKKy8vCQl7CisvLwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbigKKy8vCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgwKS50b19wdHI8IEJhc2VCdWZmZXJGb3JtID4oKQorLy8JCQkJCS0+Y29udGFpbnMoIEVWQUxfQVJHLm1BUkctPmF0KDEpICkgKSk7CisvLworLy8JCQlyZXR1cm4oIHRydWUgKTsKKy8vCQl9CisvLworLy8JCWNhc2UgQVZNX09QQ09ERV9JTjoKKy8vCQl7CisvLwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbigKKy8vCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgxKS50b19wdHI8IEJhc2VCdWZmZXJGb3JtID4oKQorLy8JCQkJCS0+Y29udGFpbnMoIEVWQUxfQVJHLm1BUkctPmF0KDApICkgKSk7CisvLworLy8JCQlyZXR1cm4oIHRydWUgKTsKKy8vCQl9CisvLwkJY2FzZSBBVk1fT1BDT0RFX05PVElOOgorLy8JCXsKKy8vCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKCBub3QKKy8vCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgxKS50b19wdHI8IEJhc2VCdWZmZXJGb3JtID4oKQorLy8JCQkJCS0+Y29udGFpbnMoIEVWQUxfQVJHLm1BUkctPmF0KDApICkgKSk7CisvLworLy8JCQlyZXR1cm4oIHRydWUgKTsKKy8vCQl9CisvLworLy8vLwkJY2FzZSBBVk1fT1BDT0RFX1NUQVJUU19XSVRIOgorLy8vLwkJeworLy8vLwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbiggU3RyaW5nVG9vbHM6OnN0YXJ0c1dpdGgoCisvLy8vCQkJCUVWQUxfQVJHLm1BUkctPmF0KDApLnRvX3B0cjwgQmFzZUJ1ZmZlckZvcm0gPigpLT5nZXRWYWx1ZSgpLAorLy8vLwkJCQlFVkFMX0FSRy5tQVJHLT5hdCgxKS50b19wdHI8IEJhc2VCdWZmZXJGb3JtID4oKS0+Z2V0VmFsdWUoKSApKSk7CisvLy8vCisvLy8vCQkJcmV0dXJuKCB0cnVlICk7CisvLy8vCQl9CisvLy8vCQljYXNlIEFWTV9PUENPREVfRU5EU19XSVRIOgorLy8vLwkJeworLy8vLwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbiggU3RyaW5nVG9vbHM6OmVuZHNXaXRoKAorLy8vLwkJCQlFVkFMX0FSRy5tQVJHLT5hdCgwKS50b19wdHI8IEJhc2VCdWZmZXJGb3JtID4oKS0+Z2V0VmFsdWUoKSwKKy8vLy8JCQkJRVZBTF9BUkcubUFSRy0+YXQoMSkudG9fcHRyPCBCYXNlQnVmZmVyRm9ybSA+KCktPmdldFZhbHVlKCkgKSkpOworLy8vLworLy8vLwkJCXJldHVybiggdHJ1ZSApOworLy8vLwkJfQorLy8KKy8vCQljYXNlIEFWTV9PUENPREVfRU1QVFk6CisvLwkJeworLy8JCQljdXJyZW50KCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oCisvLwkJCQkJRVZBTF9BUkcubUFSRy0+YXQoMCkKKy8vCQkJCQkJLnRvX3B0cjwgQmFzZUJ1ZmZlckZvcm0gPigpLT5lbXB0eSgpICkgKTsKKy8vCisvLwkJCXJldHVybiggdHJ1ZSApOworLy8JCX0KKy8vCisvLwkJY2FzZSBBVk1fT1BDT0RFX05PTkVNUFRZOgorLy8JCXsKKy8vCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKAorLy8JCQkJCUVWQUxfQVJHLm1BUkctPmF0KDApCisvLwkJCQkJCS50b19wdHI8IEJhc2VCdWZmZXJGb3JtID4oKS0+bm9uZW1wdHkoKSApICk7CisvLworLy8JCQlyZXR1cm4oIHRydWUgKTsKKy8vCQl9CisvLwkJY2FzZSBBVk1fT1BDT0RFX1NJTkdMRVRPTjoKKy8vCQl7CisvLwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbigKKy8vCQkJCQlFVkFMX0FSRy5tQVJHLT5hdCgwKQorLy8JCQkJCQkudG9fcHRyPCBCYXNlQnVmZmVyRm9ybSA+KCktPnNpbmdsZXRvbigpICkgKTsKKy8vCisvLwkJCXJldHVybiggdHJ1ZSApOworLy8JCX0KKy8vCQljYXNlIEFWTV9PUENPREVfUE9QVUxBVEVEOgorLy8JCXsKKy8vCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKAorLy8JCQkJCUVWQUxfQVJHLm1BUkctPmF0KDApCisvLwkJCQkJCS50b19wdHI8IEJhc2VCdWZmZXJGb3JtID4oKS0+cG9wdWxhdGVkKCkgKSApOworLy8KKy8vCQkJcmV0dXJuKCB0cnVlICk7CisvLwkJfQorLy8JCWNhc2UgQVZNX09QQ09ERV9GVUxMOgorLy8JCXsKKy8vCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKAorLy8JCQkJCUVWQUxfQVJHLm1BUkctPmF0KDApCisvLwkJCQkJCS50b19wdHI8IEJhc2VCdWZmZXJGb3JtID4oKS0+ZnVsbCgpICkgKTsKKy8vCisvLwkJCXJldHVybiggdHJ1ZSApOworLy8JCX0KKy8vCisvLwkJY2FzZSBBVk1fT1BDT0RFX1NJWkU6CisvLwkJeworLy8JCQljdXJyZW50KCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld1VJbnRlZ2VyKAorLy8JCQkJCUVWQUxfQVJHLm1BUkctPmF0KDApCisvLwkJCQkJCS50b19wdHI8IEJhc2VCdWZmZXJGb3JtID4oKS0+c2l6ZSgpICkgKTsKKy8vCisvLwkJCXJldHVybiggdHJ1ZSApOworLy8JCX0KKy8vCisvLy8vCQljYXNlIEFWTV9PUENPREVfRVE6CisvLy8vCQljYXNlIEFWTV9PUENPREVfU0VROgorLy8vLwkJeworLy8vLwkJCWN1cnJlbnQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbigKKy8vLy8JCQkJRVZBTF9BUkcubUFSRy0+YXQoMCkudG9fcHRyPCBCYXNlQnVmZmVyRm9ybSA+KCktPmdldFZhbHVlKCkuY29tcGFyZSgKKy8vLy8JCQkJRVZBTF9BUkcubUFSRy0+YXQoMSkudG9fcHRyPCBCYXNlQnVmZmVyRm9ybSA+KCktPmdldFZhbHVlKCkpID09IDAgKSk7CisvLy8vCisvLy8vCQkJcmV0dXJuKCB0cnVlICk7CisvLy8vCQl9CisvLy8vCQljYXNlIEFWTV9PUENPREVfTkVROgorLy8vLwkJY2FzZSBBVk1fT1BDT0RFX05TRVE6CisvLy8vCQl7CisvLy8vCQkJY3VycmVudCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKAorLy8vLwkJCQlFVkFMX0FSRy5tQVJHLT5hdCgwKS50b19wdHI8IEJhc2VCdWZmZXJGb3JtID4oKS0+Z2V0VmFsdWUoKS5jb21wYXJlKAorLy8vLwkJCQlFVkFMX0FSRy5tQVJHLT5hdCgxKS50b19wdHI8IEJhc2VCdWZmZXJGb3JtID4oKS0+Z2V0VmFsdWUoKSkgIT0gMCApICk7CisvLy8vCisvLy8vCQkJcmV0dXJuKCB0cnVlICk7CisvLy8vCQl9CisvLworLy8KKy8vCQljYXNlIEFWTV9PUENPREVfVE9QOgorLy8JCXsKKy8vCQkJY3VycmVudCggRVZBTF9BUkcubUFSRy0+YXQoMCkudG9fcHRyPCBCYXNlQnVmZmVyRm9ybSA+KCktPnRvcCgpICk7CisvLworLy8JCQlyZXR1cm4oIHRydWUgKTsKKy8vCQl9CisvLwkJY2FzZSBBVk1fT1BDT0RFX1BPUDoKKy8vCQl7CisvLwkJCWN1cnJlbnQoIEVWQUxfQVJHLm1BUkctPmF0KDApLnRvX3B0cjwgQmFzZUJ1ZmZlckZvcm0gPigpLT5wb3AoKSApOworLy8KKy8vCQkJcmV0dXJuKCB0cnVlICk7CisvLwkJfQorLy8KKy8vCQljYXNlIEFWTV9PUENPREVfUFVTSDoKKy8vCQl7CisvLwkJCUJhc2VCdWZmZXJGb3JtICogcXVldWUgPSBFVkFMX0FSRy5tQVJHLT5hdCgwKS50b19wdHI8IEJhc2VCdWZmZXJGb3JtID4oKTsKKy8vCQkJZm9yKCBFVkFMX0FSRy5tQVJHLT5iZWdpbigxKSA7IEVWQUxfQVJHLm1BUkctPmhhc05leHQoKSA7IEVWQUxfQVJHLm1BUkctPm5leHQoKSApCisvLwkJCXsKKy8vCQkJCWlmKCBub3QgcXVldWUtPnB1c2goIEVWQUxfQVJHLm1BUkctPmN1cnJlbnQoKSApICkKKy8vCQkJCXsKKy8vQVZNX0lGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVCkKKy8vCUFWTV9PU19UUkFDRSA8PCAiVEhST1cgVU5TQVRJU0ZJRUQgPDwgUFVTSCA+PiA6ICIKKy8vCQkJPDwgIG91dEVELT5tUklELnN0clVuaXFJZCgpIDw8ICIgfD0+ICIKKy8vCQkJPDwgYUNvZGUtPnN0cigpIDw8IHN0ZDo6ZW5kbDsKKy8vCUFWTV9PU19UUkFDRSA8PCAiXHQiIDw8ICI8Y2FwYWNpdHk6IiA8PCBxdWV1ZS0+Y2FwYWNpdHkoKQorLy8JCQk8PCAiPiAiIDw8IHF1ZXVlLT5zdHIoKSA8PCAiIDw9PCAiCisvLwkJCTw8IEVWQUxfQVJHLm1BUkctPmN1cnJlbnQoKS5zdHIoKSA8PCBzdGQ6OmVuZGw7CisvL0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTVEFURU1FTlQpCisvLworLy8JCQkJCXJldHVybiggZmFsc2UgKTsKKy8vCQkJCX0KKy8vCQkJfQorLy9BVk1fSUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX0FTU0lHTk1FTlQgKQorLy8JQVZNX09TX1RSQUNFIDw8ICJydmFsdWU6PiAiIDw8IHF1ZXVlLT5zdHIoKSA8PCBzdGQ6OmVuZGw7CisvL0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfQVNTSUdOTUVOVCApCisvLworLy8JCQlyZXR1cm4oIHRydWUgKTsKKy8vCQl9CisvLworLy8JCWNhc2UgQVZNX09QQ09ERV9BUFBFTkQ6CisvLwkJeworLy8JCQlCYXNlQnVmZmVyRm9ybSAqIHF1ZXVlID0gRVZBTF9BUkcubUFSRy0+YXQoMCkudG9fcHRyPCBCYXNlQnVmZmVyRm9ybSA+KCk7CisvLwkJCWZvciggRVZBTF9BUkcubUFSRy0+YmVnaW4oMSkgOyBFVkFMX0FSRy5tQVJHLT5oYXNOZXh0KCkgOyBFVkFMX0FSRy5tQVJHLT5uZXh0KCkgKQorLy8JCQl7CisvLwkJCQlpZiggbm90IHF1ZXVlLT5hcHBlbmQoIEVWQUxfQVJHLm1BUkctPmN1cnJlbnQoKSApICkKKy8vCQkJCXsKKy8vQVZNX0lGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVCkKKy8vCUFWTV9PU19UUkFDRSA8PCAiVEhST1cgVU5TQVRJU0ZJRUQgPDwgQVBQRU5EID4+IDogIgorLy8JCQk8PCAgb3V0RUQtPm1SSUQuc3RyVW5pcUlkKCkgPDwgIiB8PT4gIgorLy8JCQk8PCBhQ29kZS0+c3RyKCkgPDwgc3RkOjplbmRsOworLy8JQVZNX09TX1RSQUNFIDw8ICJcdCIgPDwgIjxjYXBhY2l0eToiIDw8IHF1ZXVlLT5jYXBhY2l0eSgpCisvLwkJCTw8ICI+ICIgPDwgcXVldWUtPnN0cigpIDw8ICIgPD08ICIKKy8vCQkJPDwgRVZBTF9BUkcubUFSRy0+Y3VycmVudCgpLnN0cigpIDw8IHN0ZDo6ZW5kbDsKKy8vQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVCkKKy8vCisvLwkJCQkJcmV0dXJuKCBmYWxzZSApOworLy8JCQkJfQorLy8JCQl9CisvL0FWTV9JRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfQVNTSUdOTUVOVCApCisvLwlBVk1fT1NfVFJBQ0UgPDwgInJ2YWx1ZTo+ICIgPDwgcXVldWUtPnN0cigpIDw8IHN0ZDo6ZW5kbDsKKy8vQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9BU1NJR05NRU5UICkKKy8vCisvLwkJCXJldHVybiggdHJ1ZSApOworLy8JCX0KKworCQljYXNlIEFWTV9PUENPREVfUkVNT1ZFOgorCQl7CisJCQlCYXNlQnVmZmVyRm9ybSAqIGJiZiA9IEVWQUxfQVJHLm1BUkctPmF0KDApLnRvX3B0cjwgQmFzZUJ1ZmZlckZvcm0gPigpOworCQkJaWYoIEVWQUxfQVJHLm1BUkctPmF0KDEpLmlzPCBJbnN0YW5jZU9mUG9ydCA+KCkgKQorCQkJeworCQkJCWJiZi0+cmVtb3ZlKCBFVkFMX0FSRy5tQVJHLT5hdCgxKS50b19wdHI8IEluc3RhbmNlT2ZQb3J0ID4oKSApOworCitBVk1fSUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX0FTU0lHTk1FTlQgKQorCQkJQVZNX09TX1RSQUNFIDw8ICJydmFsdWU6PiAiIDw8IGJiZi0+c3RyKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9BU1NJR05NRU5UICkKKworCQkJCXJldHVybiggdHJ1ZSApOworCQkJfQorCisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKworLy8JCWNhc2UgQVZNX09QQ09ERV9BU1NJR05fVE9QOgorLy8JCXsKKy8vCQkJQmFzZUJ1ZmZlckZvcm0gKiBxdWV1ZSA9IEVWQUxfQVJHLm1BUkctPmF0KDApLnRvX3B0cjwgQmFzZUJ1ZmZlckZvcm0gPigpOworLy8JCQlpZiggcXVldWUtPm5vbmVtcHR5KCkgKQorLy8JCQl7CisvL0FWTV9JRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfQVNTSUdOTUVOVCApCisvLwlBVk1fT1NfVFJBQ0UgPDwgImx2YWx1ZTpxdWV1ZT4gIiA8PCBxdWV1ZS0+c3RyKCkgPDwgc3RkOjplbmRsOworLy8JQVZNX09TX1RSQUNFIDw8ICJydmFsdWU6PiAiIDw8IEVWQUxfQVJHLm1BUkctPmF0KDEpLnN0cigpIDw8IHN0ZDo6ZW5kbDsKKy8vQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9BU1NJR05NRU5UICkKKy8vCisvLwkJCQlpZiggcXVldWUtPnRvcCggRVZBTF9BUkcubUFSRy0+YXQoMSkgKSApCisvLwkJCQl7CisvL0FWTV9JRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfQVNTSUdOTUVOVCApCisvLwlBVk1fT1NfVFJBQ0UgPDwgInF1ZXVlPiAiIDw8IHF1ZXVlLT5zdHIoKSA8PCBzdGQ6OmVuZGw7CisvL0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfQVNTSUdOTUVOVCApCisvLworLy8JCQkJCWN1cnJlbnQoIEVWQUxfQVJHLm1BUkctPmF0KDEpICk7CisvLworLy8JCQkJCXJldHVybiggdHJ1ZSApOworLy8JCQkJfQorLy8JCQkJZWxzZQorLy8JCQkJeworLy9BVk1fSUZfREVCVUdfRkxBRyggU1RBVEVNRU5UKQorLy8JQVZNX09TX1RSQUNFIDw8ICJUSFJPVyBVTlNBVElTRklFRCA8PCBBU1NJTkcjVE9QID4+IDogIgorLy8JCQk8PCAgb3V0RUQtPm1SSUQuc3RyVW5pcUlkKCkgPDwgIiB8PT4gIgorLy8JCQk8PCBhQ29kZS0+c3RyKCkgPDwgc3RkOjplbmRsOworLy8JQVZNX09TX1RSQUNFIDw8ICJcdCIgPDwgImFzc2lnbiN0b3AgaW4gcXVldWUgPDwgIgorLy8JCQk8PCBFVkFMX0FSRy5tQVJHLT5hdCgwKS5zdHIoKSA8PCAiID4+IGZhaWxlZCAhISEiCisvLwkJCTw8IHN0ZDo6ZW5kbDsKKy8vQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVCkKKy8vCisvLwkJCQkJcmV0dXJuKCBmYWxzZSApOworLy8JCQkJfQorLy8JCQl9CisvLwkJCWVsc2UKKy8vCQkJeworLy9BVk1fSUZfREVCVUdfRkxBRyggU1RBVEVNRU5UKQorLy8JQVZNX09TX1RSQUNFIDw8ICJUSFJPVyBVTlNBVElTRklFRCA8PCBBU1NJTkcjVE9QID4+IDogIgorLy8JCQk8PCAgb3V0RUQtPm1SSUQuc3RyVW5pcUlkKCkgPDwgIiB8PT4gIgorLy8JCQk8PCBhQ29kZS0+c3RyKCkgPDwgc3RkOjplbmRsOworLy8JQVZNX09TX1RSQUNFIDw8ICJcdCIgPDwgIlVuZXhwZWN0ZWQgYW4gZW1wdHkgcXVldWUgPDwgIgorLy8JCQk8PCBFVkFMX0FSRy5tQVJHLT5hdCgwKS5zdHIoKSA8PCAiID4+IiA8PCBzdGQ6OmVuZGw7CisvL0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTVEFURU1FTlQpCisvLworLy8JCQkJcmV0dXJuKCBmYWxzZSApOworLy8JCQl9CisvLwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCTw8ICJBUkdTX0VOVjo6ZXZhbF9wcm9jZXNzb3JfY29sbGVjdGlvbiA6PiAiCisJCQkJCQkiVW5leHBlY3RlZCBieXRlY29kZSA8PCAiIDw8IGJ5dGVjb2RlLnN0ckNvZGUoKQorCQkJCQk8PCAiID4+IGZvciA6ICIgPDwgYUNvZGUtPnN0ckRlYnVnKCkgPDwgIiAhISEiCisJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICogU2VyaWFsaXphdGlvbgorICovCit2b2lkIEFSR1NfRU5WOjphcmdzU3RyZWFtKE91dFN0cmVhbSAmIG9zKQoreworCWJlZ2luKCk7CisKKwlpZiggaGFzTmV4dCgpICkKKwl7CisJCW9zIDw8IFRBQiA8PCAiJFsiIDw8IEVPTF9UQUIyIDw8IGN1cnJlbnQoKS5zdHIoKTsKKworCQlmb3IoIG5leHQoKSA7IGhhc05leHQoKSA7IG5leHQoKSApCisJCXsKKwkJCW9zIDw8ICIgLCIgPDwgRU9MX1RBQjIgPDwgY3VycmVudCgpLnN0cigpOworCQl9CisKKwkJb3MgPDwgRU9MX1RBQiA8PCAiXSIgPDwgRU9MX0ZMVVNIOworCX0KK30KKworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvaW5zdHJ1Y3Rpb24vSW5zdHJ1Y3Rpb25FbnZpcm9ubWVudC5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvaW5zdHJ1Y3Rpb24vSW5zdHJ1Y3Rpb25FbnZpcm9ubWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkN2MyMTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9pbnN0cnVjdGlvbi9JbnN0cnVjdGlvbkVudmlyb25tZW50LmgKQEAgLTAsMCArMSw0MzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxNiBhdnIuIDIwMTIKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBJTlNUUlVDVElPTkVOVklST05NRU5UX0hfCisjZGVmaW5lIElOU1RSVUNUSU9ORU5WSVJPTk1FTlRfSF8KKworI2luY2x1ZGUgPGNvbW1vbi9Bdm1PYmplY3QuaD4KKyNpbmNsdWRlIDxjb21tb24vQkYuaD4KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vTGlzdC5oPgorI2luY2x1ZGUgPGNvbGxlY3Rpb24vVmVjdG9yLmg+CisKKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25EYXRhLmg+CisKKworI2RlZmluZSBBUkdTX0VOVl9JTklUSUFMX0NBQ0hFX0NPVU5UICAgICAzMgorCisjZGVmaW5lIEFSR1NfRU5WX0RFRkFVTFRfQ0FQQUNJVFkgICAgICAgIDE2CisKKyNkZWZpbmUgQVJHU19FTlZfSU5DUl9DQVBBQ0lUWSAgICAgICAgICAgOAorCisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBBdm1Db2RlOworY2xhc3MgQXJyYXlCRjsKK2NsYXNzIEJhc2VFbnZpcm9ubWVudDsKK2NsYXNzIENvbnRhaW5lclR5cGVTcGVjaWZpZXI7CisKKworc3RydWN0IEFSR1NfRU5WCit7CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQVJHU19FTlYoQmFzZUVudmlyb25tZW50ICogYUVOViwKKwkJCWNvbnN0IEFQRXhlY3V0aW9uRGF0YSAmIG91dEVELAorCQkJYXZtX3NpemVfdCBhQ2FwYWNpdHksIGF2bV9zaXplX3QgYUNvdW50KQorCTogTkVYVCggTlVMTCApLAorCUVOViggYUVOViApLAorCW91dEVEKCBvdXRFRCApLAorCXRhYmxlKCBhQ291bnQgKSwKKwl2YWx1ZXMoICYgdGFibGUgKSwKKworCWFyZ3NJbnN0cnVjdGlvbiggTlVMTCApLAorCWFyZ3NCeXRlY29kZSggTlVMTCApLAorCisJY2FwYWNpdHkoIGFDYXBhY2l0eSApLAorCWNvdW50KCBhQ291bnQgKSwKKwlpZHgoIDAgKQorCXsKKwkJdGFibGUucmVzZXJ2ZSggYUNhcGFjaXR5ICk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIENPTVBVVElORyAsIFNUQVRFTUVOVCApCisJQVZNX09TX1RSQUNFIDw8ICJuZXcgQVJHU19FTlYgOj4iCisJCQk8PCAiIGNhcGFjaXR5ID0gIiA8PCBzdGQ6OnNldHcoNCkgPDwgY2FwYWNpdHkKKwkJCTw8ICIgOiBjb3VudCA9ICIgPDwgc3RkOjpzZXR3KDQpIDw8IGNvdW50CisJCQk8PCAiIEAiIDw8IGF2bV9hZGRyZXNzX3QoIHRoaXMgKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBDT01QVVRJTkcgLCBTVEFURU1FTlQgKQorCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkFSR1NfRU5WKCkKKwl7CisJCXZhbHVlcyA9IE5VTEw7CisJCXRhYmxlLmNsZWFyKCk7CisJCWNhcGFjaXR5ID0gY291bnQgPSBpZHggPSAwOworCX0KKworCisJLyoqCisJICogRU1QVFlORVNTCisJICovCisJaW5saW5lIGJvb2wgZW1wdHkoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBjb3VudCA9PSAwICk7CisJfQorCisJaW5saW5lIGJvb2wgbm9uZW1wdHkoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBjb3VudCA+IDAgKTsKKwl9CisKKworCS8qKgorCSAqIElURVJBVE9SCisJICovCisJaW5saW5lIHZvaWQgYmVnaW4oYXZtX3NpemVfdCBvZmZzZXQgPSAwKQorCXsKKwkJaWR4ID0gb2Zmc2V0OworCX0KKworCWlubGluZSBib29sIGhhc05leHQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBpZHggPCBjb3VudCApOworCX0KKworCWlubGluZSBCRiAmIGN1cnJlbnQoKQorCXsKKwkJcmV0dXJuKCAoKnZhbHVlcylbIGlkeCBdICk7CisJfQorCisJaW5saW5lIEJGICYgY3VycmVudChhdm1fc2l6ZV90IG9mZnNldCkKKwl7CisJCXJldHVybiggKCp2YWx1ZXMpWyBvZmZzZXQgXSApOworCX0KKworCWlubGluZSB2b2lkIGN1cnJlbnQoY29uc3QgQkYgJiB2YWwpCisJeworCQkoKnZhbHVlcylbIGlkeCBdID0gdmFsOworCX0KKworCWlubGluZSB2b2lkIGN1cnJlbnRfbmV4dChjb25zdCBCRiAmIHZhbCkKKwl7CisJCSgqdmFsdWVzKVsgaWR4IF0gPSB2YWw7CisJCSsraWR4OworCX0KKworCWlubGluZSB2b2lkIG5leHQoKQorCXsKKwkJKytpZHg7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIKKwkgKi8KKwlpbmxpbmUgQkYgJiBvcGVyYXRvcltdKGF2bV9zaXplX3Qgb2Zmc2V0KQorCXsKKwkJcmV0dXJuKCAoKnZhbHVlcylbIG9mZnNldCBdICk7CisJfQorCisJaW5saW5lIGNvbnN0IEJGICYgb3BlcmF0b3JbXShhdm1fc2l6ZV90IG9mZnNldCkgY29uc3QKKwl7CisJCXJldHVybiggKCp2YWx1ZXMpWyBvZmZzZXQgXSApOworCX0KKworCisJaW5saW5lIEJGICYgYXQoYXZtX3NpemVfdCBvZmZzZXQpCisJeworCQlyZXR1cm4oICgqdmFsdWVzKVsgb2Zmc2V0IF0gKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQkYgJiBhdChhdm1fc2l6ZV90IG9mZnNldCkgY29uc3QKKwl7CisJCXJldHVybiggKCp2YWx1ZXMpWyBvZmZzZXQgXSApOworCX0KKworCisKKwkvKioKKwkgKiBERUNPREUgRVZBTCBDT05URVhUCisJICovCisJYm9vbCBtYWluX2RlY29kZV9ldmFsKEJGQ29kZSAmIGluQ09ERSk7CisKKwlib29sIG1haW5fZGVjb2RlX2V2YWxfYXJncyhBdm1Db2RlICogaW5DT0RFKTsKKworCisJYm9vbCBkZWNvZGVfZXZhbF9hcmdzX2NvbnRleHQoQXZtQnl0ZWNvZGUgJiBieXRlY29kZSwgQXZtQ29kZSAqIGluQ09ERSk7CisKKwkvKioKKwkgKiBERUNPREUgRVZBTCBQUk9DRVNTT1IKKwkgKi8KKwlib29sIGRlY29kZV9ldmFsX2FyZ3NfcHJvY2Vzc29yKEF2bUJ5dGVjb2RlICYgYnl0ZWNvZGUsIEF2bUNvZGUgKiBpbkNPREUpOworCisJYm9vbCBkZWNvZGVfZXZhbF9wcm9jZXNzb3IoQXZtQnl0ZWNvZGUgJiBieXRlY29kZSwgQXZtQ29kZSAqIGluQ09ERSk7CisJYm9vbCBkZWNvZGVfZXZhbF9wcm9jZXNzb3IoQXZtQnl0ZWNvZGUgJiBieXRlY29kZSwgQkYgJiBhcmcpOworCisJQkYgcmV0dXJuX2RlY29kZV9ldmFsX3Byb2Nlc3NvcihBdm1CeXRlY29kZSAmIGJ5dGVjb2RlLCBCRiAmIGFyZyk7CisKKworCWJvb2wgZGVjb2RlX2V2YWxfcHJvY2Vzc29yKEJGQ29kZSAmIGFDb2RlKTsKKwlCRiByZXR1cm5fZGVjb2RlX2V2YWxfcHJvY2Vzc29yKEJGQ29kZSAmIGFDb2RlKTsKKworCS8qKgorCSAqIEVWQUwgUFJPQ0VTU09SIDwgQVZNX0FSR19NRU1PUllfVUZJX1BPSU5URVJfQ1BVID4KKwkgKi8KKwlib29sIGV2YWxfcHJvY2Vzc29yX2RtYV9sdmFsdWVfdWZpX3BvaW50ZXIoQXZtQnl0ZWNvZGUgJiBieXRlY29kZSwgQkYgJiBhcmcpOworCisJYm9vbCBldmFsX3Byb2Nlc3Nvcl9kbWFfd3ZhbHVlX3VmaV9wb2ludGVyKEF2bUJ5dGVjb2RlICYgYnl0ZWNvZGUsIEJGICYgYXJnKTsKKworCWJvb2wgZXZhbF9wcm9jZXNzb3JfZG1hX3J2YWx1ZV91ZmlfcG9pbnRlcihBdm1CeXRlY29kZSAmIGJ5dGVjb2RlLCBCRiAmIGFyZyk7CisKKwkvKioKKwkgKiBFVkFMIFBST0NFU1NPUiA8IEFWTV9BUkdfTUVNT1JZX0xWQUxVRV9DUFUgPgorCSAqLworCWJvb2wgZXZhbF9wcm9jZXNzb3JfZG1hX2x2YWx1ZShBdm1CeXRlY29kZSAmIGJ5dGVjb2RlLCBCRiAmIGFyZyk7CisKKwkvKioKKwkgKiBFVkFMIFBST0NFU1NPUiA8IEFWTV9BUkdfTUVNT1JZX1dWQUxVRV9DUFUgPgorCSAqLworCWJvb2wgZXZhbF9wcm9jZXNzb3JfZG1hX3d2YWx1ZShBdm1CeXRlY29kZSAmIGJ5dGVjb2RlLCBCRiAmIGFyZyk7CisKKwkvKioKKwkgKiBFVkFMIFBST0NFU1NPUiA8IEFWTV9BUkdfTUVNT1JZX1JWQUxVRV9DUFUgPgorCSAqLworCWJvb2wgZXZhbF9wcm9jZXNzb3JfZG1hX3J2YWx1ZShBdm1CeXRlY29kZSAmIGJ5dGVjb2RlLCBCRiAmIGFyZyk7CisJYm9vbCBldmFsX3Byb2Nlc3Nvcl9kbWFfcnZhbHVlKEF2bUJ5dGVjb2RlICYgYnl0ZWNvZGUsIEF2bUNvZGUgKiBhQ29kZSk7CisKKwlib29sIGRlY29kZV9ldmFsX3J2YWx1ZShCRiAmIGFyZyk7CisKKwlCRiByZXR1cm5fZGVjb2RlX2V2YWxfcnZhbHVlKEJGICYgYXJnKTsKKworCS8qKgorCSAqIEVWQUwgUFJPQ0VTU09SIDwgQVZNX0FSR19NRU1PUllfTUFDSElORV9DUFUgPgorCSAqLworCWJvb2wgZXZhbF9wcm9jZXNzb3JfZG1hX21hY2hpbmUoQXZtQnl0ZWNvZGUgJiBieXRlY29kZSwgQkYgJiBhcmcpOworCWJvb2wgZXZhbF9wcm9jZXNzb3JfZG1hX21hY2hpbmUoQXZtQnl0ZWNvZGUgJiBieXRlY29kZSwgQXZtQ29kZSAqIGFDb2RlKTsKKworCWNvbnN0IFJ1bnRpbWVJRCAmIHJldHVybl9kZWNvZGVfZXZhbF9tYWNoaW5lKGNvbnN0IEJGICYgYW5FbGVtZW50KTsKKworCS8qKgorCSAqIEVWQUwgUFJPQ0VTU09SIDwgQVZNX0FSR19BUklUSE1FVElDX0xPR0lDX0NQVSA+CisJICovCisJYm9vbCBldmFsX3Byb2Nlc3Nvcl9hbHUoQXZtQnl0ZWNvZGUgJiBieXRlY29kZSwgQkYgJiBhcmcpOworCWJvb2wgZXZhbF9wcm9jZXNzb3JfYWx1KEF2bUJ5dGVjb2RlICYgYnl0ZWNvZGUsIEF2bUNvZGUgKiBhQ29kZSk7CisKKwkvKioKKwkgKiBFVkFMIFBST0NFU1NPUiA8IEFWTV9BUkdfU1RBVEVNRU5UX0NQVSA+CisJICovCisJYm9vbCBldmFsX3Byb2Nlc3Nvcl9zdGF0ZW1lbnQoQXZtQnl0ZWNvZGUgJiBieXRlY29kZSwgQXZtQ29kZSAqIGFDb2RlKTsKKworCS8qKgorCSAqIEVWQUwgUFJPQ0VTU09SIDwgQVZNX0FSR19DSEFSQUNURVJfQ1BVID4KKwkgKi8KKwlib29sIGV2YWxfcHJvY2Vzc29yX2NoYXJhY3RlcihBdm1CeXRlY29kZSAmIGJ5dGVjb2RlLCBCRiAmIGFyZyk7CisJYm9vbCBldmFsX3Byb2Nlc3Nvcl9jaGFyYWN0ZXIoQXZtQnl0ZWNvZGUgJiBieXRlY29kZSwgQXZtQ29kZSAqIGFDb2RlKTsKKworCS8qKgorCSAqIEVWQUwgUFJPQ0VTU09SIDwgQVZNX0FSR19TVFJJTkdfQ1BVID4KKwkgKi8KKwlib29sIGV2YWxfcHJvY2Vzc29yX3N0cmluZyhBdm1CeXRlY29kZSAmIGJ5dGVjb2RlLCBCRiAmIGFyZyk7CisJYm9vbCBldmFsX3Byb2Nlc3Nvcl9zdHJpbmcoQXZtQnl0ZWNvZGUgJiBieXRlY29kZSwgQXZtQ29kZSAqIGFDb2RlKTsKKworCS8qKgorCSAqIEVWQUwgUFJPQ0VTU09SIDwgQVZNX0FSR19BUlJBWV9bTHxWXV9DUFUgPgorCSAqLworCWJvb2wgZXZhbF9wcm9jZXNzb3JfYXJyYXlfbHZhbHVlKEF2bUJ5dGVjb2RlICYgYnl0ZWNvZGUsIEJGICYgYXJnKTsKKworCWJvb2wgZXZhbF9wcm9jZXNzb3JfYXJyYXlfcnZhbHVlKEF2bUJ5dGVjb2RlICYgYnl0ZWNvZGUsIEJGICYgYXJnKTsKKworCUJGIGdlbkFycmF5KENvbnRhaW5lclR5cGVTcGVjaWZpZXIgKiBhcnJheVQsIGNvbnN0IEJGICYgYXJnKTsKKworCWJvb2wgZXZhbF9wcm9jZXNzb3JfYXJyYXlfcnZhbHVlKEF2bUJ5dGVjb2RlICYgYnl0ZWNvZGUsIEF2bUNvZGUgKiBhQ29kZSk7CisKKworCS8qKgorCSAqIEVWQUwgUFJPQ0VTU09SIDwgQVZNX0FSR19WRUNUT1JfQ1BVID4KKwkgKi8KKwlib29sIGV2YWxfcHJvY2Vzc29yX3ZlY3RvcihBdm1CeXRlY29kZSAmIGJ5dGVjb2RlLCBCRiAmIGFyZyk7CisJYm9vbCBldmFsX3Byb2Nlc3Nvcl92ZWN0b3IoQXZtQnl0ZWNvZGUgJiBieXRlY29kZSwgQXZtQ29kZSAqIGFDb2RlKTsKKworCisJLyoqCisJICogRVZBTCBQUk9DRVNTT1IgPCBBVk1fQVJHX1FVRVVFX0NQVSA+CisJICogRVZBTCBQUk9DRVNTT1IgPCBBVk1fQVJHX0xJU1RfQ1BVID4KKwkgKiBFVkFMIFBST0NFU1NPUiA8IEFWTV9BUkdfQ09MTEVDVElPTl9DUFUgPgorCSAqLworCWJvb2wgZXZhbF9wcm9jZXNzb3JfY29sbGVjdGlvbihBdm1CeXRlY29kZSAmIGJ5dGVjb2RlLCBCRiAmIGFyZyk7CisJYm9vbCBldmFsX3Byb2Nlc3Nvcl9jb2xsZWN0aW9uKEF2bUJ5dGVjb2RlICYgYnl0ZWNvZGUsIEF2bUNvZGUgKiBhQ29kZSk7CisKKworCS8qKgorCSAqIEVWQUwgUFJPQ0VTU09SIDwgQVZNX0FSR19CVUZGRVJfQ1BVID4KKwkgKi8KKwlib29sIGV2YWxfcHJvY2Vzc29yX2J1ZmZlcihBdm1CeXRlY29kZSAmIGJ5dGVjb2RlLCBCRiAmIGFyZyk7CisJYm9vbCBldmFsX3Byb2Nlc3Nvcl9idWZmZXIoQXZtQnl0ZWNvZGUgJiBieXRlY29kZSwgQXZtQ29kZSAqIGFDb2RlKTsKKworCisJLyoqCisJICogREVDT0RFIEVWQUwgUlZBTFVFCisJICovCisJQkYgZ2luYWNfcmV0dXJuX2RlY29kZV9ldmFsX3J2YWx1ZShCRiAmIGFyZyk7CisKKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwl2b2lkIGFyZ3NTdHJlYW0oT3V0U3RyZWFtICYgb3MpOworCisKKwkvLyBBdHRyaWJ1dGUKKwlBUkdTX0VOViAqIE5FWFQ7CisKKwlCYXNlRW52aXJvbm1lbnQgKiBFTlY7CisKKwlBUEV4ZWN1dGlvbkRhdGEgb3V0RUQ7CisKKwlSdW50aW1lSUQgbUNUWDsKKworCVZlY3RvcjwgQkYgPiB0YWJsZTsKKwlWZWN0b3I8IEJGID4gKiB2YWx1ZXM7CisKKwkvLyBBdHRyaWJ1dGVzCisJQXZtSW5zdHJ1Y3Rpb24gKiBhcmdzSW5zdHJ1Y3Rpb247CisJQXZtQnl0ZWNvZGUgKiBhcmdzQnl0ZWNvZGU7CisKKwlhdm1fc2l6ZV90IGNhcGFjaXR5OworCWF2bV9zaXplX3QgY291bnQ7CisJYXZtX3NpemVfdCBpZHg7CisKKworCXN0YXRpYyBhdm1fc2l6ZV90IENBTExfQ09VTlQ7CisKKwlzdGF0aWMgYXZtX3NpemVfdCBDQUxMX0NPVU5UX0dJTkFDOworCit9OworCisKKworY2xhc3MgSW5zdHJ1Y3Rpb25FbnZpcm9ubWVudCA6CisJCXB1YmxpYyBBdm1PYmplY3QsCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggSW5zdHJ1Y3Rpb25FbnZpcm9ubWVudCApCit7CisKKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggSW5zdHJ1Y3Rpb25FbnZpcm9ubWVudCApCisKKworcHVibGljOgorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJSW5zdHJ1Y3Rpb25FbnZpcm9ubWVudChCYXNlRW52aXJvbm1lbnQgJiBFTlYpOworCisJSW5zdHJ1Y3Rpb25FbnZpcm9ubWVudChCYXNlRW52aXJvbm1lbnQgJiBFTlYsIGF2bV9zaXplX3QgY291bnQpOworCisJSW5zdHJ1Y3Rpb25FbnZpcm9ubWVudChCYXNlRW52aXJvbm1lbnQgKiBFTlYsCisJCQljb25zdCBBUEV4ZWN1dGlvbkRhdGEgJiBvdXRFRCwgYXZtX3NpemVfdCBjb3VudCkKKwk6IEF2bU9iamVjdCggKSwKKwltQVJHKCBuZXdBUkdTKEVOViwgb3V0RUQsIGNvdW50KSApLAorCWl0QVJHKCBtQVJHICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5JbnN0cnVjdGlvbkVudmlyb25tZW50KCkKKwl7CisJCWZyZWVBUkdTKCBtQVJHICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLS0gU0VUVEVSCisJICogdmFsdWUKKwkgKi8KKy8vCWlubGluZSBjb25zdCBCRiAmIGdldCgpIGNvbnN0CisvLwl7CisvLwkJcmV0dXJuKCB0aGVBcmctPnZhbHVlc1sgaWR4IF0gKTsKKy8vCX0KKy8vCisvLwlpbmxpbmUgY29uc3QgQkYgJiBnZXQoY29uc3QgYXZtX3NpemVfdCBvZmZzZXQpIGNvbnN0CisvLwl7CisvLwkJcmV0dXJuKCB0aGVBcmctPnZhbHVlc1sgb2Zmc2V0IF0gKTsKKy8vCX0KKy8vCisvLwlpbmxpbmUgdm9pZCBzZXQoY29uc3QgQkYgJiBiZikKKy8vCXsKKy8vCQl0aGVBcmctPnZhbHVlc1t0aGVBcmctPmlkeCBdID0gYmY7CisvLwl9CisvLworLy8JaW5saW5lIHZvaWQgc2V0KGNvbnN0IGF2bV9zaXplX3Qgb2Zmc2V0LCBjb25zdCBCRiAmIGJmKQorLy8JeworLy8JCXRoZUFyZy0+dmFsdWVzWyBvZmZzZXQgXSA9IGJmOworLy8JfQorCisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJaW5saW5lIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIEF0dHJpYnV0ZXMKKwkgKi8KKworCUFSR1NfRU5WICogbUFSRzsKKworCUFSR1NfRU5WICogaXRBUkc7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIENBQ0hFIE1BTkFHRVIKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwlzdGF0aWMgTGlzdDwgQVJHU19FTlYgKiA+ICBBUkdTX0VOVl9DQUNIRTsKKworCXN0YXRpYyB2b2lkIGluaXRDYWNoZSgpOworCisJc3RhdGljIHZvaWQgZmluYWxpemVDYWNoZSgpOworCisKKwlzdGF0aWMgQVJHU19FTlYgKiBuZXdBUkdTKEJhc2VFbnZpcm9ubWVudCAqIEVOViwKKwkJCWNvbnN0IEFQRXhlY3V0aW9uRGF0YSAmIGFuRUQsIGF2bV9zaXplX3QgY291bnQpOworCisJc3RhdGljIHZvaWQgZnJlZUFSR1MoQVJHU19FTlYgKiAmIGFyZyk7CisKKworCit9OworCisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisjZW5kaWYgLyogSU5TVFJVQ1RJT05FTlZJUk9OTUVOVF9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bUFjdGl2aXR5UHJpbWl0aXZlLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1BY3Rpdml0eVByaW1pdGl2ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFjMDQyYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1BY3Rpdml0eVByaW1pdGl2ZS5jcHAKQEAgLTAsMCArMSwyMDQyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjAgbWFpIDIwMTAKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkF2bUFjdGl2aXR5UHJpbWl0aXZlLmgiCisKKyNpbmNsdWRlIDxidWlsZGVyL0xvYWRlci5oPgorCisjaW5jbHVkZSA8Y29tcHV0ZXIvcHJpbWl0aXZlL0F2bVN5bmNocm9uaXphdGlvbkZhY3RvcnkuaD4KKworI2luY2x1ZGUgPGNvbXB1dGVyL0V4ZWN1dGlvbkVudmlyb25tZW50Lmg+CisjaW5jbHVkZSA8Y29tcHV0ZXIvRXhlY3V0aW9uRGF0YUZhY3RvcnkuaD4KKworI2luY2x1ZGUgPGZtbC9idWZmZXIvQmFzZUJ1ZmZlckZvcm0uaD4KKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVMaWIuaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0F2bUNvZGUuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29uc3RydWN0b3IuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9TdGF0ZW1lbnRGYWN0b3J5Lmg+CisKKyNpbmNsdWRlIDxmbWwvb3BlcmF0b3IvT3BlcmF0b3JNYW5hZ2VyLmg+CisKKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25EYXRhLmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uQ29uZmlndXJhdGlvbi5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvblN5bmNocm9uaXphdGlvblBvaW50Lmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvUnVudGltZURlZi5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL1J1bnRpbWVJRC5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV4ZWN1dGlvbiBvZiBhbiBDT05URVhUX1NXSVRDSEVSIHByb2dyYW0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworYm9vbCBBdm1QcmltaXRpdmVfQ29udGV4dFN3aXRjaGVyOjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJUnVudGltZUlEIHNhdmVSSUQgPSBFTlYubUFSRy0+b3V0RUQtPm1SSUQ7CisKKwlFeGVjdXRpb25FbnZpcm9ubWVudCB0bXBFTlYoRU5WLCBFTlYubUFSRy0+b3V0RUQsCisJCQlFTlYubUFSRy0+YXQoMCkuYmZSSUQoKSwgRU5WLm1BUkctPmF0KDEpLmJmQ29kZSgpICk7CisKKwlpZiggdG1wRU5WLnJ1bigpICkKKwl7CisJCWlmKCB0bXBFTlYub3V0RURTLm5vbmVtcHR5KCkgKQorCQl7CisJCQl0bXBFTlYucmVzdG9yZUNvbnRleHQoIHNhdmVSSUQgKTsKKworCQkJRU5WLnNwbGljZU91dHB1dCggdG1wRU5WICk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXhlY3V0aW9uIG9mIGFuIElOSVQgcHJvZ3JhbQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitib29sIEF2bVByaW1pdGl2ZV9Jbml0OjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJY29uc3QgUnVudGltZUlEICYgdG1wUklEID0gRU5WLm1BUkctPmF0KDApLmJmUklEKCk7CisKKwlpZiggRU5WLm1BUkctPm91dEVELT5pc0Rlc3Ryb3llZCggdG1wUklEICkgKQorCXsKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCWVsc2UgaWYoIEVOVi5tQVJHLT5vdXRFRC0+aXNSdW5uYWJsZSggdG1wUklEICkgKQorCXsKKwkJaWYoIHRtcFJJRC5nZXRFeGVjdXRhYmxlKCktPmhhc09uSW5pdCgpICkKKwkJeworCQkJRXhlY3V0aW9uRW52aXJvbm1lbnQgdG1wRU5WKEVOViwgRU5WLm1BUkctPm91dEVELAorCQkJCQl0bXBSSUQsIHRtcFJJRC5nZXRFeGVjdXRhYmxlKCktPmdldE9uSW5pdCgpKTsKKworCQkJaWYoIHRtcEVOVi5ydW4oUFJPQ0VTU19JTklUSU5HX1NUQVRFKSApCisJCQl7CisJCQkJRU5WLnNwbGljZU5vdE91dHB1dCh0bXBFTlYpOworCisJCQkJaWYoIG5vdCBFTlYuYXBwZW5kT3V0cHV0X213c2V0UEVTX213c2V0QUVFUyh0bXBFTlYsIHRtcFJJRCwKKwkJCQkJCVBST0NFU1NfSU5JVElOR19TVEFURSwgUFJPQ0VTU19JRExFX1NUQVRFKSApCisJCQkJeworCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmKCBub3QgRU5WLmFwcGVuZE91dHB1dF9td3NldFBFUygKKwkJCQlFTlYubUFSRy0+b3V0RUQsIHRtcFJJRCwgUFJPQ0VTU19JRExFX1NUQVRFKSApCisJCXsKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlpZiggbm90IEVOVi5tQVJHLT5vdXRFRC0+aGFzUnVubmFibGVFbGVtZW50VHJhY2UoKSApCisvLwkJaWYoIEVOVi5tQVJHLT5vdXRFRC0+aXNDcmVhdGVkKCB0bXBSSUQgKSApCisJCXsKKwkJCUVOVi5tQVJHLT5vdXRFRC0+bUFFRVMgPSBBRUVTX1NUTU5UX05PVEhJTkc7CisJCX0KKworCQlFTlYub3V0RURTLmFwcGVuZCggRU5WLm1BUkctPm91dEVEICk7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBleGVjdXRpb24gb2YgYSBGSU5BTCBwcm9ncmFtCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK2Jvb2wgQXZtUHJpbWl0aXZlX0ZpbmFsOjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJY29uc3QgUnVudGltZUlEICYgdG1wUklEID0gRU5WLm1BUkctPmF0KDApLmJmUklEKCk7CisKKwlpZiggRU5WLm1BUkctPm91dEVELT5pc3VuUnVubmFibGUoIHRtcFJJRCApICkKKwl7CisJCXJldHVybiggdHJ1ZSApOworCX0KKwllbHNlIGlmKCBFTlYubUFSRy0+b3V0RUQtPmlzUnVubmFibGUoIHRtcFJJRCApICkKKwl7CisJCWlmKCB0bXBSSUQuZ2V0RXhlY3V0YWJsZSgpLT5oYXNPbkZpbmFsKCkgKQorCQl7CisJCQlFeGVjdXRpb25FbnZpcm9ubWVudCB0bXBFTlYoRU5WLCBFTlYubUFSRy0+b3V0RUQsIHRtcFJJRCwKKwkJCQkJdG1wUklELmdldEV4ZWN1dGFibGUoKS0+Z2V0T25GaW5hbCgpKTsKKworCQkJaWYoIHRtcEVOVi5ydW4oUFJPQ0VTU19GSU5BTElaSU5HX1NUQVRFKSApCisJCQl7CisJCQkJaWYoIGZpbmFsaXplZFBhcmVudChFTlYsIHRtcEVOViwgdG1wUklEKSApCisJCQkJeworCQkJCQlFTlYuc3BsaWNlTm90T3V0cHV0KHRtcEVOVik7CisKKwkJCQkJcmV0dXJuKCB0cnVlICk7CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJaWYoIGZpbmFsaXplZFBhcmVudChFTlYsIEVOVi5tQVJHLT5vdXRFRCwgdG1wUklEKSApCisJCQl7CisJCQkJcmV0dXJuKCB0cnVlICk7CisJCQl9CisJCX0KKwl9CisJZWxzZQorCXsKKwkJRU5WLm91dEVEUy5hcHBlbmQoIEVOVi5tQVJHLT5vdXRFRCApOworCisJCXJldHVybiggdHJ1ZSApOworCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKworCitib29sIEF2bVByaW1pdGl2ZV9GaW5hbDo6ZmluYWxpemVkUGFyZW50KEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WLAorCQlFeGVjdXRpb25FbnZpcm9ubWVudCAmIHRtcEVOViwgY29uc3QgUnVudGltZUlEICYgYVJJRCkKK3sKKwlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGE6Oml0ZXJhdG9yIGl0RUQgPSB0bXBFTlYub3V0RURTLmJlZ2luKCk7CisJTGlzdE9mQVBFeGVjdXRpb25EYXRhOjppdGVyYXRvciBlbmRFRCA9IHRtcEVOVi5vdXRFRFMuZW5kKCk7CisJZm9yKCA7IGl0RUQgIT0gZW5kRUQgOyArK2l0RUQgKQorCXsKKwkJaWYoIG5vdCBmaW5hbGl6ZWRQYXJlbnQoRU5WLCAoKml0RUQpLCBhUklEKSApCisJCXsKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKK2Jvb2wgQXZtUHJpbWl0aXZlX0ZpbmFsOjpmaW5hbGl6ZWRQYXJlbnQoRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsCisJCUFQRXhlY3V0aW9uRGF0YSAmIGFuRUQsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQpCit7CisJYW5FRC5td3NldFJ1bnRpbWVGb3JtU3RhdGUoYVJJRCwgUFJPQ0VTU19GSU5BTElaRURfU1RBVEUpOworCisJYW5FRC0+c2V0QUVFUyggUnVudGltZURlZjo6UEVTX3RvX0FFRVMoCisJCQlQUk9DRVNTX0ZJTkFMSVpFRF9TVEFURSwgYW5FRC0+Z2V0QUVFUygpKSApOworCisJTGlzdDwgUnVudGltZUlEID4gcnVubmFibGVSSUQ7CisKKwlSdW50aW1lSUQgdG1wUklEID0gYVJJRDsKKwlib29sIGZpbmFsaXplU2VsZjsKKworCXdoaWxlKCAodG1wUklEID0gdG1wUklELmdldFBSSUQoKSkudmFsaWQoKSApCisJeworCQljb25zdCBSdW50aW1lRm9ybSAmIHRtcFJGID0gYW5FRC0+Z2V0UnVudGltZSh0bXBSSUQpOworCQlmaW5hbGl6ZVNlbGYgPSBmYWxzZTsKKworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoIHRtcFJGLmhhc0NoaWxkKCkgKQorCQkJCTw8ICJVbmV4cGVjdGRlZCBQUklEIFJGIHdpdGggb3V0IGNoaWxkIDo+IFxuIgorCQkJCTw8IHRtcFJGLnRvU3RyaW5nKCBBVk1fVEFCMV9JTkRFTlQgKQorCQkJCTw8IFNFTkRfRVhJVDsKKworCQlpZiggdG1wUklELmdldFNwZWNpZmllcigpLmlzTW9jQ29tcG9zaXRlU3RydWN0dXJlKCkgKQorCQl7CisJCQlUYWJsZU9mUnVudGltZUlEOjpjb25zdF9pdGVyYXRvciBpdCA9IHRtcFJGLmJlZ2luQ2hpbGQoKTsKKwkJCVRhYmxlT2ZSdW50aW1lSUQ6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gdG1wUkYuZW5kQ2hpbGQoKTsKKwkJCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCQkJeworCQkJCWlmKCBub3QgYW5FRC0+aXNGaW5hbGl6ZWRPckRlc3Ryb3llZCgqaXQpICkKKwkJCQl7CisJCQkJCUVOVi5vdXRFRFMuYXBwZW5kKCBhbkVEICk7CisKKwkJCQkJcmV0dXJuKCB0cnVlICk7CisJCQkJfQorCQkJfQorCQkJZmluYWxpemVTZWxmID0gdHJ1ZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVN0YXRlbWVudEZhY3Rvcnk6OmNvbGxlY3RSSUQodG1wUkYuZ2V0T25TY2hlZHVsZSgpLCBydW5uYWJsZVJJRCk7CisKKwkJCUxpc3Q8IFJ1bnRpbWVJRCA+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHJ1bm5hYmxlUklELmJlZ2luKCk7CisJCQlMaXN0PCBSdW50aW1lSUQgPjo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBydW5uYWJsZVJJRC5lbmQoKTsKKwkJCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCQkJeworCQkJCWlmKCBub3QgYW5FRC0+aXNGaW5hbGl6ZWRPckRlc3Ryb3llZCgqaXQpICkKKwkJCQl7CisJCQkJCUVOVi5vdXRFRFMuYXBwZW5kKCBhbkVEICk7CisKKwkJCQkJcmV0dXJuKCB0cnVlICk7CisJCQkJfQorCQkJfQorCQkJZmluYWxpemVTZWxmID0gdHJ1ZTsKKwkJfQorCisJCWlmKCBmaW5hbGl6ZVNlbGYgKQorCQl7CisJCQlpZiggdG1wUklELmdldEV4ZWN1dGFibGUoKS0+aGFzT25GaW5hbCgpICkKKwkJCXsKKwkJCQlFeGVjdXRpb25FbnZpcm9ubWVudCB0bXBFTlYoRU5WLCBhbkVELCB0bXBSSUQsCisJCQkJCQl0bXBSSUQuZ2V0RXhlY3V0YWJsZSgpLT5nZXRPbkZpbmFsKCkpOworCisJCQkJaWYoIHRtcEVOVi5ydW4oUFJPQ0VTU19GSU5BTElaSU5HX1NUQVRFKSApCisJCQkJeworCQkJCQlpZiggZmluYWxpemVkUGFyZW50KEVOViwgdG1wRU5WLCB0bXBSSUQpICkKKwkJCQkJeworCQkJCQkJRU5WLnNwbGljZU5vdE91dHB1dCh0bXBFTlYpOworCisJCQkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlFTlYubXdzZXRQRVNfbXdzZXRBRUVTKGFuRUQsIHRtcFJJRCwgUFJPQ0VTU19GSU5BTElaRURfU1RBVEUpOworCQkJfQorCQl9CisJfQorCisJaWYoIHRtcFJJRC5pbnZhbGlkKCkgKQorCXsKKwkJaWYoIGFuRUQtPmlzdW5SdW5uYWJsZVN5c3RlbSgpICkKKwkJeworCQkJYW5FRC0+c2V0QUVFUyhBRUVTX1NUTU5UX0VYSVQpOworCQkJRU5WLmV4aXRFRFMuYXBwZW5kKCBhbkVEICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlFTlYub3V0RURTLmFwcGVuZCggYW5FRCApOworCQl9CisJfQorCWVsc2UKKwl7CisJCUVOVi5vdXRFRFMuYXBwZW5kKCBhbkVEICk7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV4ZWN1dGlvbiBvZiBhbiBERVNUUk9ZIHByb2dyYW0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworYm9vbCBBdm1QcmltaXRpdmVfRGVzdHJveTo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCWNvbnN0IFJ1bnRpbWVJRCAmIHRtcFJJRCA9IEVOVi5tQVJHLT5hdCgwKS5iZlJJRCgpOworCisJaWYoIEVOVi5tQVJHLT5vdXRFRC0+aXN1blJ1bm5hYmxlKCB0bXBSSUQgKSApCisJeworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisJZWxzZSBpZiggRU5WLm1BUkctPm91dEVELT5pc1J1bm5hYmxlKCB0bXBSSUQgKSApCisJeworCQlpZiggdG1wUklELmdldEV4ZWN1dGFibGUoKS0+aGFzT25GaW5hbCgpICkKKwkJeworCQkJRXhlY3V0aW9uRW52aXJvbm1lbnQgdG1wRU5WKEVOViwgRU5WLm1BUkctPm91dEVELCB0bXBSSUQsCisJCQkJCXRtcFJJRC5nZXRFeGVjdXRhYmxlKCktPmdldE9uRmluYWwoKSk7CisKKwkJCWlmKCB0bXBFTlYucnVuKFBST0NFU1NfRklOQUxJWklOR19TVEFURSkgKQorCQkJeworCQkJCWlmKCBkZXN0cm95ZWRQYXJlbnQoRU5WLCB0bXBFTlYsIHRtcFJJRCkgKQorCQkJCXsKKwkJCQkJRU5WLnNwbGljZU5vdE91dHB1dCh0bXBFTlYpOworCisJCQkJCXJldHVybiggdHJ1ZSApOworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWlmKCBkZXN0cm95ZWRQYXJlbnQoRU5WLCBFTlYubUFSRy0+b3V0RUQsIHRtcFJJRCkgKQorCQkJeworCQkJCXJldHVybiggdHJ1ZSApOworCQkJfQorCQl9CisJfQorCWVsc2UKKwl7CisJCUVOVi5vdXRFRFMuYXBwZW5kKCBFTlYubUFSRy0+b3V0RUQgKTsKKworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKworYm9vbCBBdm1QcmltaXRpdmVfRGVzdHJveTo6ZGVzdHJveWVkUGFyZW50KEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WLAorCQlFeGVjdXRpb25FbnZpcm9ubWVudCAmIHRtcEVOViwgY29uc3QgUnVudGltZUlEICYgYVJJRCkKK3sKKwlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGE6Oml0ZXJhdG9yIGl0RUQgPSB0bXBFTlYub3V0RURTLmJlZ2luKCk7CisJTGlzdE9mQVBFeGVjdXRpb25EYXRhOjppdGVyYXRvciBlbmRFRCA9IHRtcEVOVi5vdXRFRFMuZW5kKCk7CisJZm9yKCA7IGl0RUQgIT0gZW5kRUQgOyArK2l0RUQgKQorCXsKKwkJaWYoIG5vdCBkZXN0cm95ZWRQYXJlbnQoRU5WLCAoKml0RUQpLCBhUklEKSApCisJCXsKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKK2Jvb2wgQXZtUHJpbWl0aXZlX0Rlc3Ryb3k6OmRlc3Ryb3llZFBhcmVudChFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOViwKKwkJQVBFeGVjdXRpb25EYXRhICYgYW5FRCwgY29uc3QgUnVudGltZUlEICYgYVJJRCkKK3sKKwlhbkVELm13c2V0UnVudGltZUZvcm1TdGF0ZShhUklELCBQUk9DRVNTX0RFU1RST1lFRF9TVEFURSk7CisJaWYoIGFSSUQuaGFzTW9kZWwoKSApCisJeworCQlhbkVELT5nZXRXcml0YWJsZVJ1bnRpbWUoIGFSSUQuZ2V0TW9kZWwoKSApLmRlY3JJbnN0YW5jaWF0aW9uQ291bnQoKTsKKwl9CisKKwlhbkVELT5zZXRBRUVTKCBSdW50aW1lRGVmOjpQRVNfdG9fQUVFUygKKwkJCVBST0NFU1NfREVTVFJPWUVEX1NUQVRFLCBhbkVELT5nZXRBRUVTKCkpICk7CisKKwlSdW50aW1lSUQgdG1wUklEID0gYVJJRDsKKwlib29sIGF1dG9EZXN0cm95OworCisJd2hpbGUoICh0bXBSSUQgPSB0bXBSSUQuZ2V0UFJJRCgpKS52YWxpZCgpICkKKwl7CisJCWNvbnN0IFJ1bnRpbWVGb3JtICYgdG1wUkYgPSBhbkVELT5nZXRSdW50aW1lKHRtcFJJRCk7CisJCWF1dG9EZXN0cm95ID0gZmFsc2U7CisKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKCB0bXBSRi5oYXNDaGlsZCgpICkKKwkJCQk8PCAiVW5leHBlY3RkZWQgUFJJRCBSRiB3aXRoIG91dCBjaGlsZCA6PiBcbiIKKwkJCQk8PCB0bXBSRi50b1N0cmluZyggQVZNX1RBQjFfSU5ERU5UICkKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJaWYoIHRtcFJJRC5nZXRTcGVjaWZpZXIoKS5pc01vY0NvbXBvc2l0ZVN0cnVjdHVyZSgpICkKKwkJeworCQkJVGFibGVPZlJ1bnRpbWVJRDo6Y29uc3RfaXRlcmF0b3IgaXQgPSB0bXBSRi5iZWdpbkNoaWxkKCk7CisJCQlUYWJsZU9mUnVudGltZUlEOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IHRtcFJGLmVuZENoaWxkKCk7CisJCQlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJCXsKKwkJCQlpZiggbm90IGFuRUQtPmlzRmluYWxpemVkT3JEZXN0cm95ZWQoKml0KSApCisJCQkJeworCQkJCQlFTlYub3V0RURTLmFwcGVuZCggYW5FRCApOworCisJCQkJCXJldHVybiggdHJ1ZSApOworCQkJCX0KKwkJCX0KKwkJCWF1dG9EZXN0cm95ID0gdHJ1ZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWF1dG9EZXN0cm95ID0gdHJ1ZTsKKwkJfQorCisJCWlmKCBhdXRvRGVzdHJveSApCisJCXsKKwkJCWlmKCB0bXBSSUQuZ2V0RXhlY3V0YWJsZSgpLT5oYXNPbkZpbmFsKCkgKQorCQkJeworCQkJCUV4ZWN1dGlvbkVudmlyb25tZW50IHRtcEVOVihFTlYsIGFuRUQsIHRtcFJJRCwKKwkJCQkJCXRtcFJJRC5nZXRFeGVjdXRhYmxlKCktPmdldE9uRmluYWwoKSk7CisKKwkJCQlpZiggdG1wRU5WLnJ1bihQUk9DRVNTX0ZJTkFMSVpJTkdfU1RBVEUpICkKKwkJCQl7CisJCQkJCWlmKCBkZXN0cm95ZWRQYXJlbnQoRU5WLCB0bXBFTlYsIHRtcFJJRCkgKQorCQkJCQl7CisJCQkJCQlFTlYuc3BsaWNlTm90T3V0cHV0KHRtcEVOVik7CisKKwkJCQkJCXJldHVybiggdHJ1ZSApOworCQkJCQl9CisJCQkJfQorCisJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUVOVi5td3NldFBFU19td3NldEFFRVMoYW5FRCwgdG1wUklELCBQUk9DRVNTX0RFU1RST1lFRF9TVEFURSk7CisJCQkJaWYoIHRtcFJJRC5oYXNNb2RlbCgpICkKKwkJCQl7CisJCQkJCWFuRUQtPmdldFdyaXRhYmxlUnVudGltZSgKKwkJCQkJCQl0bXBSSUQuZ2V0TW9kZWwoKSApLmRlY3JJbnN0YW5jaWF0aW9uQ291bnQoKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZiggdG1wUklELmludmFsaWQoKSApCisJeworCQlpZiggYW5FRC0+aXN1blJ1bm5hYmxlU3lzdGVtKCkgKQorCQl7CisJCQlhbkVELT5zZXRBRUVTKEFFRVNfU1RNTlRfRVhJVCk7CisJCQlFTlYuZXhpdEVEUy5hcHBlbmQoIGFuRUQgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCUVOVi5vdXRFRFMuYXBwZW5kKCBhbkVEICk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJRU5WLm91dEVEUy5hcHBlbmQoIGFuRUQgKTsKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV4ZWN1dGlvbiBvZiBhIFNUQVJUIHByb2dyYW0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworYm9vbCBBdm1QcmltaXRpdmVfU3RhcnQ6OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwljb25zdCBSdW50aW1lSUQgJiB0bXBSSUQgPSBFTlYubUFSRy0+YXQoMCkuYmZSSUQoKTsKKworCWlmKCBFTlYubUFSRy0+b3V0RUQtPmlzRGVzdHJveWVkKCB0bXBSSUQgKSApCisJeworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisJZWxzZSBpZiggRU5WLm1BUkctPm91dEVELT5pc0NyZWF0ZWRPclJ1bm5hYmxlKCB0bXBSSUQgKSB8fAorCQkJRU5WLm1BUkctPm91dEVELT5pc0ZpbmFsaXplZCggdG1wUklEICkgKQorCXsKKwkJQkZDb2RlIGFQcm9ncmFtID0gdG1wUklELmdldE9uU3RhcnQoKTsKKwkJaWYoIGFQcm9ncmFtLmludmFsaWQoKSApCisJCXsKKwkJCWFQcm9ncmFtID0gdG1wUklELmdldEV4ZWN1dGFibGUoKS0+Z2V0T25TdGFydCgpOworCisJCQlpZiggYVByb2dyYW0uaW52YWxpZCgpICkKKwkJCXsKKwkJCQlhUHJvZ3JhbSA9IHRtcFJJRC5nZXRFeGVjdXRhYmxlKCktPmdldE9uSW5pdCgpOworCQkJfQorCQl9CisKKwkJaWYoIGFQcm9ncmFtLnZhbGlkKCkgKQorCQl7CisJCQlFeGVjdXRpb25FbnZpcm9ubWVudCB0bXBFTlYoRU5WLCBFTlYubUFSRy0+b3V0RUQsIHRtcFJJRCwgYVByb2dyYW0pOworCisJCQlpZiggdG1wRU5WLnJ1bihQUk9DRVNTX1NUQVJUSU5HX1NUQVRFKSApCisJCQl7CisJCQkJRU5WLnNwbGljZU5vdE91dHB1dCh0bXBFTlYpOworCisJCQkJaWYoIG5vdCBFTlYuYXBwZW5kT3V0cHV0X213c2V0UEVTX213c2V0QUVFUyh0bXBFTlYsIHRtcFJJRCwKKwkJCQkJCVBST0NFU1NfU1RBUlRJTkdfU1RBVEUsIFBST0NFU1NfSURMRV9TVEFURSkgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiggbm90IEVOVi5hcHBlbmRPdXRwdXRfbXdzZXRQRVMoCisJCQkJRU5WLm1BUkctPm91dEVELCB0bXBSSUQsIFBST0NFU1NfSURMRV9TVEFURSkgKQorCQl7CisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJRU5WLm91dEVEUy5hcHBlbmQoIEVOVi5tQVJHLT5vdXRFRCApOworCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXhlY3V0aW9uIG9mIGEgUkVTVEFSVCBwcm9ncmFtCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK2Jvb2wgQXZtUHJpbWl0aXZlX1Jlc3RhcnQ6OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlCRkNvZGUgYVByb2dyYW0gPSBFTlYuaW5DT0RFOworCisJRXhlY3V0aW9uRW52aXJvbm1lbnQgdG1wRU5WKEVOViwgYVByb2dyYW0pOworCisJaWYoIHRtcEVOVi5ydW4oT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TVE9QKSApCisJeworCQlpZiggdG1wRU5WLnJ1bkZyb21PdXRwdXRzKE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU1RBUlQsIGFQcm9ncmFtKSApCisJCXsKKwkJCUVOVi5zcGxpY2VPdXRwdXQoIHRtcEVOViApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV4ZWN1dGlvbiBvZiBhIFNUT1AgcHJvZ3JhbQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitib29sIEF2bVByaW1pdGl2ZV9TdG9wOjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJY29uc3QgUnVudGltZUlEICYgdG1wUklEID0gRU5WLm1BUkctPmF0KDApLmJmUklEKCk7CisKKwlpZiggRU5WLm1BUkctPm91dEVELT5pc3VuUnVubmFibGUoIHRtcFJJRCApICkKKwl7CisJCXJldHVybiggdHJ1ZSApOworCX0KKwllbHNlIGlmKCBFTlYubUFSRy0+b3V0RUQtPmlzUnVubmFibGUoIHRtcFJJRCApICkKKwl7CisJCWlmKCB0bXBSSUQuZ2V0RXhlY3V0YWJsZSgpLT5oYXNPblN0b3AoKSApCisJCXsKKwkJCUV4ZWN1dGlvbkVudmlyb25tZW50IHRtcEVOVihFTlYsIEVOVi5tQVJHLT5vdXRFRCwgdG1wUklELAorCQkJCQl0bXBSSUQuZ2V0RXhlY3V0YWJsZSgpLT5nZXRPblN0b3AoKSk7CisKKwkJCWlmKCB0bXBFTlYucnVuKFBST0NFU1NfU1RPUFBJTkdfU1RBVEUpICkKKwkJCXsKKwkJCQlFTlYuc3BsaWNlTm90T3V0cHV0KHRtcEVOVik7CisKKwkJCQlpZiggbm90IEVOVi5hcHBlbmRPdXRwdXRfbXdzZXRQRVNfbXdzZXRBRUVTKHRtcEVOViwgdG1wUklELAorCQkJCQkJUFJPQ0VTU19TVE9QUElOR19TVEFURSwgUFJPQ0VTU19TVE9QUEVEX1NUQVRFKSApCisJCQkJeworCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmKCBub3QgRU5WLmFwcGVuZE91dHB1dF9td3NldFBFUygKKwkJCQlFTlYubUFSRy0+b3V0RUQsIHRtcFJJRCwgUFJPQ0VTU19TVE9QUEVEX1NUQVRFKSApCisJCXsKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlFTlYub3V0RURTLmFwcGVuZCggRU5WLm1BUkctPm91dEVEICk7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV4ZWN1dGlvbiBvZiBhIFdBSVQgcHJvZ3JhbQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitib29sIEF2bVByaW1pdGl2ZV9XYWl0OjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJY29uc3QgUnVudGltZUlEICYgdG1wUklEID0gRU5WLm1BUkctPmF0KDApLmJmUklEKCk7CisKKwlFTlYubUFSRy0+b3V0RUQubXdzZXRSdW50aW1lRm9ybVN0YXRlKHRtcFJJRCwgUFJPQ0VTU19XQUlUSU5HX1NUQVRFKTsKKworCUVOVi5vdXRFRFMuYXBwZW5kKCBFTlYubUFSRy0+b3V0RUQgKTsKKworCXJldHVybiggdHJ1ZSApOworfQorCisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBleGVjdXRpb24gb2YgYSBTVVNQRU5EIHByb2dyYW0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCitib29sIEF2bVByaW1pdGl2ZV9TdXNwZW5kOjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJY29uc3QgUnVudGltZUlEICYgdG1wUklEID0gRU5WLm1BUkctPmF0KDApLmJmUklEKCk7CisKKwlpZiggRU5WLm1BUkctPm91dEVELT5pc3VuUnVubmFibGUoIHRtcFJJRCApICkKKwl7CisJCXJldHVybiggdHJ1ZSApOworCX0KKworCUVOVi5tQVJHLT5vdXRFRC5td3NldFJ1bnRpbWVGb3JtU3RhdGUodG1wUklELCBQUk9DRVNTX1NVU1BFTkRFRF9TVEFURSk7CisKKwlFTlYub3V0RURTLmFwcGVuZCggRU5WLm1BUkctPm91dEVEICk7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXhlY3V0aW9uIG9mIGEgUkVTVU1FIHByb2dyYW0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworYm9vbCBBdm1QcmltaXRpdmVfUmVzdW1lOjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJY29uc3QgUnVudGltZUlEICYgdG1wUklEID0gRU5WLm1BUkctPmF0KDApLmJmUklEKCk7CisKKwlpZiggRU5WLm1BUkctPm91dEVELT5pc1N1c3BlbmRlZCggdG1wUklEICkgKQorCXsKKwkJRU5WLm1BUkctPm91dEVELm13c2V0UnVudGltZUZvcm1TdGF0ZSh0bXBSSUQsIFBST0NFU1NfSURMRV9TVEFURSk7CisKKwkJRU5WLm91dEVEUy5hcHBlbmQoIEVOVi5tQVJHLT5vdXRFRCApOworCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBleGVjdXRpb24gb2YgYW4gSUVOQUJMRSBwcm9ncmFtCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK2Jvb2wgQXZtUHJpbWl0aXZlX0lFbmFibGVJbnZva2U6OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlFTlYubUFSRy0+b3V0RUQubWFrZVdyaXRhYmxlKCk7CisKKwlFTlYubUFSRy0+b3V0RUQtPm1SSUQgPSBFTlYubUFSRy0+YXQoMCkuYmZSSUQoKTsKKworCWNvbnN0IEJGQ29kZSAmIG9uSW52b2tlID0KKwkJCUVOVi5tQVJHLT5vdXRFRC0+bVJJRC5nZXRFeGVjdXRhYmxlKCktPmdldE9uSUVuYWJsZSgpOworCWlmKCBvbkludm9rZS52YWxpZCgpICkKKwl7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgQ09NUFVUSU5HICwgUFJPR1JBTSApCisJRXhlY3V0aW9uRGF0YUZhY3Rvcnk6OmFwcGVuZFJ1bm5hYmxlRWxlbWVudFRyYWNlKEVOVi5tQVJHLT5vdXRFRCwKKwkJCUJGKG5ldyBFeGVjdXRpb25Db25maWd1cmF0aW9uKEVOVi5tQVJHLT5vdXRFRC0+bVJJRCwKKwkJCQkJQ09OU1RfQkZfT1BFUkFUT1IoSUVOQUJMRV9JTlZPS0UpKSkpOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBDT01QVVRJTkcgLCBQUk9HUkFNICkKKworCQlyZXR1cm4oIEVOVi5ydW4oRU5WLm1BUkctPm91dEVELCBvbkludm9rZSkgKTsKKwl9CisJZWxzZQorCXsKKwkJRU5WLmFwcGVuZE91dHB1dCggRU5WLm1BUkctPm91dEVEICk7CisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorfQorCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXhlY3V0aW9uIG9mIGFuIEVOQUJMRSBwcm9ncmFtCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK2Jvb2wgQXZtUHJpbWl0aXZlX0VuYWJsZUludm9rZTo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCUVOVi5tQVJHLT5vdXRFRC5tYWtlV3JpdGFibGUoKTsKKwlFTlYubUFSRy0+b3V0RUQtPm1QcmVzZXJ2ZVJJRCA9IHRydWU7CisKKwlFTlYubUFSRy0+b3V0RUQtPm1SSUQgPSBFTlYubUFSRy0+YXQoMCkuYmZSSUQoKTsKKworLy8JRU5WLm1BUkctPm91dEVELm13c2V0UnVudGltZUZvcm1PblNjaGVkdWxlQW5kSWRsZShFTlYubUFSRy0+b3V0RUQtPm1SSUQpOworCisJY29uc3QgQkZDb2RlICYgb25JbnZva2UgPQorCQkJRU5WLm1BUkctPm91dEVELT5tUklELmdldEV4ZWN1dGFibGUoKS0+Z2V0T25FbmFibGUoKTsKKwlpZiggb25JbnZva2UudmFsaWQoKSApCisJeworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIENPTVBVVElORyAsIFBST0dSQU0gKQorCUV4ZWN1dGlvbkRhdGFGYWN0b3J5OjphcHBlbmRSdW5uYWJsZUVsZW1lbnRUcmFjZShFTlYubUFSRy0+b3V0RUQsCisJCQlCRihuZXcgRXhlY3V0aW9uQ29uZmlndXJhdGlvbihFTlYubUFSRy0+b3V0RUQtPm1SSUQsCisJCQkJCUNPTlNUX0JGX09QRVJBVE9SKEVOQUJMRV9JTlZPS0UpKSkpOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBDT01QVVRJTkcgLCBQUk9HUkFNICkKKworCQlyZXR1cm4oIEVOVi5ydW4oRU5WLm1BUkctPm91dEVELCBvbkludm9rZSkgKTsKKwl9CisJZWxzZQorCXsKKwkJRU5WLmFwcGVuZE91dHB1dCggRU5WLm1BUkctPm91dEVEICk7CisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorfQorCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXhlY3V0aW9uIG9mIGFuIEVOQUJMRSNTRVQgcHJvZ3JhbQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitib29sIEF2bVByaW1pdGl2ZV9FbmFibGVTZXQ6OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlFTlYubUFSRy0+b3V0RUQubWFrZVdyaXRhYmxlKCk7CisJRU5WLm1BUkctPm91dEVELT5tUHJlc2VydmVSSUQgPSB0cnVlOworCisJRU5WLm1BUkctPm91dEVELT5tUklEID0gRU5WLm1BUkctPmF0KDApLmJmUklEKCk7CisKKwlFTlYubUFSRy0+b3V0RUQubXdzZXRSdW50aW1lRm9ybU9uU2NoZWR1bGVBbmRJZGxlKEVOVi5tQVJHLT5vdXRFRC0+bVJJRCk7CisKKwlFTlYuYXBwZW5kT3V0cHV0KCBFTlYubUFSRy0+b3V0RUQgKTsKKworCXJldHVybiggdHJ1ZSApOworfQorCisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBleGVjdXRpb24gb2YgYSBHT1RPIHByb2dyYW0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworYm9vbCBBdm1QcmltaXRpdmVfR290bzo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQk8PCAiQXZtUHJpbWl0aXZlX0dvdG86OnJ1bjo+IFVuZXhwZWN0ZWQgR09UTzwgU1RBVEVNRU5UID4gISEhIgorCQkJPDwgU0VORF9FWElUOworCisvLwlpZiggRU5WLnJ1biggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisvLwkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfRElTQUJMRSwgRU5WLm1BUkctPm91dEVELT5tUklEKSApICkKKy8vCXsKKy8vCQlyZXR1cm4oIEVOVi5ydW5Gcm9tT3V0cHV0cyggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisvLwkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0VOQUJMRSwgRU5WLm1BUkctPmF0KDApKSApICk7CisvLwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV4ZWN1dGlvbiBvZiBhIElESVNBQkxFIHByb2dyYW0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworYm9vbCBBdm1QcmltaXRpdmVfSURpc2FibGVJbnZva2U6OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlFTlYubUFSRy0+b3V0RUQubWFrZVdyaXRhYmxlKCk7CisKKwlFTlYubUFSRy0+b3V0RUQtPm1SSUQgPSBFTlYubUFSRy0+YXQoMCkuYmZSSUQoKTsKKworCWNvbnN0IEJGQ29kZSAmIG9uSW52b2tlID0KKwkJCUVOVi5tQVJHLT5vdXRFRC0+bVJJRC5nZXRFeGVjdXRhYmxlKCktPmdldE9uSURpc2FibGUoKTsKKwlpZiggb25JbnZva2UudmFsaWQoKSApCisJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBDT01QVVRJTkcgLCBQUk9HUkFNICkKKwlFeGVjdXRpb25EYXRhRmFjdG9yeTo6YXBwZW5kUnVubmFibGVFbGVtZW50VHJhY2UoRU5WLm1BUkctPm91dEVELAorCQkJQkYobmV3IEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24oRU5WLm1BUkctPm91dEVELT5tUklELAorCQkJCQlDT05TVF9CRl9PUEVSQVRPUihJRElTQUJMRV9JTlZPS0UpKSkpOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBDT01QVVRJTkcgLCBQUk9HUkFNICkKKworCQlyZXR1cm4oIEVOVi5ydW4oRU5WLm1BUkctPm91dEVELCBvbkludm9rZSkgKTsKKwl9CisJZWxzZQorCXsKKwkJRU5WLm91dEVEUy5hcHBlbmQoIEVOVi5tQVJHLT5vdXRFRCApOworCisJCXJldHVybiggdHJ1ZSApOworCX0KK30KKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV4ZWN1dGlvbiBvZiBhIERJU0FCTEUgcHJvZ3JhbQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitib29sIEF2bVByaW1pdGl2ZV9EaXNhYmxlSW52b2tlOjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJRU5WLm1BUkctPm91dEVELm1ha2VXcml0YWJsZSgpOworCUVOVi5tQVJHLT5vdXRFRC0+bVByZXNlcnZlUklEID0gdHJ1ZTsKKworCUVOVi5tQVJHLT5vdXRFRC0+bVJJRCA9IEVOVi5tQVJHLT5hdCgwKS5iZlJJRCgpOworCisJY29uc3QgQkZDb2RlICYgb25JbnZva2UgPQorCQkJRU5WLm1BUkctPm91dEVELT5tUklELmdldEV4ZWN1dGFibGUoKS0+Z2V0T25EaXNhYmxlKCk7CisJaWYoIG9uSW52b2tlLnZhbGlkKCkgKQorCXsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBDT01QVVRJTkcgLCBQUk9HUkFNICkKKwlFeGVjdXRpb25EYXRhRmFjdG9yeTo6YXBwZW5kUnVubmFibGVFbGVtZW50VHJhY2UoRU5WLm1BUkctPm91dEVELAorCQkJQkYobmV3IEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24oRU5WLm1BUkctPm91dEVELT5tUklELAorCQkJCQlDT05TVF9CRl9PUEVSQVRPUihESVNBQkxFX0lOVk9LRSkpKSk7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIENPTVBVVElORyAsIFBST0dSQU0gKQorCisJCXJldHVybiggRU5WLnJ1bihFTlYubUFSRy0+b3V0RUQsIG9uSW52b2tlKSApOworCX0KKwllbHNlCisJeworCQlFTlYubUFSRy0+b3V0RUQubXdzZXRSdW50aW1lRm9ybVN0YXRlKFBST0NFU1NfRElTQUJMRURfU1RBVEUpOworCisJCUVOVi5tQVJHLT5vdXRFRC0+bVJJRCA9IEVOVi5tQVJHLT5vdXRFRC0+bVJJRC5nZXRQUklEKCk7CisKKwkJRU5WLm91dEVEUy5hcHBlbmQoIEVOVi5tQVJHLT5vdXRFRCApOworCisJCXJldHVybiggdHJ1ZSApOworCX0KK30KKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV4ZWN1dGlvbiBvZiBhIERJU0FCTEUjU0VUIHByb2dyYW0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworYm9vbCBBdm1QcmltaXRpdmVfRGlzYWJsZVNldDo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCUVOVi5tQVJHLT5vdXRFRC5tYWtlV3JpdGFibGUoKTsKKwlFTlYubUFSRy0+b3V0RUQtPm1QcmVzZXJ2ZVJJRCA9IHRydWU7CisKKwlFTlYubUFSRy0+b3V0RUQtPm1SSUQgPSBFTlYubUFSRy0+YXQoMCkuYmZSSUQoKTsKKworCUVOVi5tQVJHLT5vdXRFRC5td3NldFJ1bnRpbWVGb3JtU3RhdGUoUFJPQ0VTU19ESVNBQkxFRF9TVEFURSk7CisKKwlFTlYubUFSRy0+b3V0RUQtPm1SSUQgPSBFTlYubUFSRy0+b3V0RUQtPm1SSUQuZ2V0UFJJRCgpOworCisJRU5WLm91dEVEUy5hcHBlbmQoIEVOVi5tQVJHLT5vdXRFRCApOworCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV4ZWN1dGlvbiBvZiBhIERJU0FCTEUjQ0hJTEQgcHJvZ3JhbQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitib29sIEF2bVByaW1pdGl2ZV9EaXNhYmxlQ2hpbGQ6OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlBUEV4ZWN1dGlvbkRhdGEgb3V0RUQgPSBFTlYuaW5FRDsKKwlvdXRFRC5tYWtlV3JpdGFibGUoKTsKKwlvdXRFRC0+bVByZXNlcnZlUklEID0gdHJ1ZTsKKworLy8JY29uc3QgQkZDb2RlICYgb25EaXNhYmxlID0gRU5WLmluRUQtPm1SSUQuZ2V0RXhlY3V0YWJsZSgpLT5nZXRPbkRpc2FibGUoKTsKKy8vCWlmKCBvbkRpc2FibGUudmFsaWQoKSApCisvLwl7CisvL0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgQ09NUFVUSU5HICwgUFJPR1JBTSApCisvLwlFeGVjdXRpb25EYXRhRmFjdG9yeTo6YXBwZW5kUnVubmFibGVFbGVtZW50VHJhY2Uob3V0RUQsCisvLwkJQkYobmV3IEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24ob3V0RUQtPm1SSUQsIENPTlNUX0JGX09QRVJBVE9SKERJU0FCTEUpKSkpOworLy9BVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIENPTVBVVElORyAsIFBST0dSQU0gKQorLy8KKy8vCQlFeGVjdXRpb25FbnZpcm9ubWVudCB0bXBFTlYoRU5WLCBvdXRFRCwgb3V0RUQtPm1SSUQpOworLy8JCWlmKCB0bXBFTlYucnVuKG9uRGlzYWJsZSkgKQorLy8JCXsKKy8vCQkJd2hpbGUoIHRtcEVOVi5vdXRFRFMubm9uZW1wdHkoKSApCisvLwkJCXsKKy8vCQkJCXRtcEVOVi5vdXRFRFMucG9wX2ZpcnN0X3RvKCBvdXRFRCApOworLy8KKy8vCQkJCW91dEVELm13c2V0UnVudGltZUZvcm1TdGF0ZShFTlYuaW5FRC0+bVJJRCwKKy8vCQkJCQkJUFJPQ0VTU19ESVNBQkxFRF9TVEFURSk7CisvLworLy8JCQkJb3V0RUQtPm1SSUQgPSBFTlYuaW5FRC0+bVJJRC5nZXRQUklEKCk7CisvLworLy8JCQkJRU5WLm91dEVEUy5hcHBlbmQoIG91dEVEICk7CisvLwkJCX0KKy8vCisvLwkJCUVOVi5zcGxpY2VOb3RPdXRwdXQoIHRtcEVOViApOworLy8JCX0KKy8vCQllbHNlCisvLwkJeworLy8JCQlyZXR1cm4oIGZhbHNlICk7CisvLwkJfQorLy8JfQorLy8JZWxzZQorCXsKKwkJb3V0RUQubXdzZXRSdW50aW1lRm9ybVN0YXRlKFBST0NFU1NfRElTQUJMRURfU1RBVEUpOworCisvLwkJb3V0RUQtPm1SSUQgPSBFTlYuaW5FRC0+bVJJRC5nZXRQUklEKCk7CisKKwkJRU5WLm91dEVEUy5hcHBlbmQoIG91dEVEICk7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV4ZWN1dGlvbiBvZiBhIERJU0FCTEUjU0VMRiBwcm9ncmFtCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK2Jvb2wgQXZtUHJpbWl0aXZlX0Rpc2FibGVTZWxmOjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJQVBFeGVjdXRpb25EYXRhIG91dEVEID0gRU5WLmluRUQ7CisJb3V0RUQubWFrZVdyaXRhYmxlKCk7CisJb3V0RUQtPm1QcmVzZXJ2ZVJJRCA9IHRydWU7CisKKwlvdXRFRC5td3NldFJ1bnRpbWVGb3JtU3RhdGUoUFJPQ0VTU19ESVNBQkxFRF9TVEFURSk7CisKKwlvdXRFRC0+bVJJRCA9IEVOVi5pbkVELT5tUklELmdldFBSSUQoKTsKKworCUVOVi5vdXRFRFMuYXBwZW5kKCBvdXRFRCApOworCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV4ZWN1dGlvbiBvZiBhIERJU0FCTEUjU0VMVkVTIHByb2dyYW0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworYm9vbCBBdm1QcmltaXRpdmVfRGlzYWJsZVNlbHZlczo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCUVOVi5tQVJHLT5vdXRFRC5tYWtlV3JpdGFibGUoKTsKKwlFTlYubUFSRy0+b3V0RUQtPm1QcmVzZXJ2ZVJJRCA9IHRydWU7CisKKwlmb3IoIGF2bV91aW50ZWdlcl90IGxldmVsID0gRU5WLm1BUkctPmF0KDApLnRvSW50ZWdlcigpIDsKKwkJCWxldmVsID4gMCA7IC0tbGV2ZWwgKQorCXsKKwkJRU5WLm1BUkctPm91dEVELm13c2V0UnVudGltZUZvcm1TdGF0ZShQUk9DRVNTX0RJU0FCTEVEX1NUQVRFKTsKKworCQlFTlYubUFSRy0+b3V0RUQtPm1SSUQgPSBFTlYubUFSRy0+b3V0RUQtPm1SSUQuZ2V0UFJJRCgpOworCX0KKworCUVOVi5vdXRFRFMuYXBwZW5kKCBFTlYubUFSRy0+b3V0RUQgKTsKKworCXJldHVybiggdHJ1ZSApOworfQorCisKKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV4ZWN1dGlvbiBvZiBhIElBQk9SVCBwcm9ncmFtCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK2Jvb2wgQXZtUHJpbWl0aXZlX0lBYm9ydEludm9rZTo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCUVOVi5tQVJHLT5vdXRFRC5tYWtlV3JpdGFibGUoKTsKKworCUVOVi5tQVJHLT5vdXRFRC0+bVJJRCA9IEVOVi5tQVJHLT5hdCgwKS5iZlJJRCgpOworCisJY29uc3QgQkZDb2RlICYgb25JbnZva2UgPQorCQkJRU5WLm1BUkctPm91dEVELT5tUklELmdldEV4ZWN1dGFibGUoKS0+Z2V0T25JQWJvcnQoKTsKKwlpZiggb25JbnZva2UudmFsaWQoKSApCisJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBDT01QVVRJTkcgLCBQUk9HUkFNICkKKwlFeGVjdXRpb25EYXRhRmFjdG9yeTo6YXBwZW5kUnVubmFibGVFbGVtZW50VHJhY2UoRU5WLm1BUkctPm91dEVELAorCQkJQkYobmV3IEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24oRU5WLm1BUkctPm91dEVELT5tUklELAorCQkJCQlDT05TVF9CRl9PUEVSQVRPUihJQUJPUlRfSU5WT0tFKSkpKTsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgQ09NUFVUSU5HICwgUFJPR1JBTSApCisKKwkJcmV0dXJuKCBFTlYucnVuKEVOVi5tQVJHLT5vdXRFRCwgb25JbnZva2UpICk7CisJfQorCWVsc2UKKwl7CisJCUVOVi5vdXRFRFMuYXBwZW5kKCBFTlYubUFSRy0+b3V0RUQgKTsKKworCQlyZXR1cm4oIHRydWUgKTsKKwl9Cit9CisKKworYm9vbCBBdm1QcmltaXRpdmVfQWJvcnRJbnZva2U6OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlFTlYubUFSRy0+b3V0RUQubWFrZVdyaXRhYmxlKCk7CisJRU5WLm1BUkctPm91dEVELT5tUHJlc2VydmVSSUQgPSB0cnVlOworCisJRU5WLm1BUkctPm91dEVELT5tUklEID0gRU5WLm1BUkctPmF0KDApLmJmUklEKCk7CisKKwljb25zdCBCRkNvZGUgJiBvbkludm9rZSA9IEVOVi5tQVJHLT5vdXRFRC0+bVJJRC5nZXRFeGVjdXRhYmxlKCktPmdldE9uQWJvcnQoKTsKKwlpZiggb25JbnZva2UudmFsaWQoKSApCisJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBDT01QVVRJTkcgLCBQUk9HUkFNICkKKwlFeGVjdXRpb25EYXRhRmFjdG9yeTo6YXBwZW5kUnVubmFibGVFbGVtZW50VHJhY2UoRU5WLm1BUkctPm91dEVELAorCQkJQkYobmV3IEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24oRU5WLm1BUkctPm91dEVELT5tUklELAorCQkJCQlDT05TVF9CRl9PUEVSQVRPUihBQk9SVF9JTlZPS0UpKSkpOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBDT01QVVRJTkcgLCBQUk9HUkFNICkKKworCQlyZXR1cm4oIEVOVi5ydW4oRU5WLm1BUkctPm91dEVELCBvbkludm9rZSkgKTsKKwl9CisJZWxzZQorCXsKKwkJRU5WLm1BUkctPm91dEVELm13c2V0UnVudGltZUZvcm1TdGF0ZShQUk9DRVNTX0FCT1JURURfU1RBVEUpOworCisJCUVOVi5tQVJHLT5vdXRFRC0+bVJJRCA9IEVOVi5tQVJHLT5vdXRFRC0+bVJJRC5nZXRQUklEKCk7CisKKwkJRU5WLm91dEVEUy5hcHBlbmQoIEVOVi5tQVJHLT5vdXRFRCApOworCisJCXJldHVybiggdHJ1ZSApOworCX0KK30KKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV4ZWN1dGlvbiBvZiBhIEFCT1JUI1NFVCBwcm9ncmFtCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK2Jvb2wgQXZtUHJpbWl0aXZlX0Fib3J0U2V0OjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJUnVudGltZUlEIGFuQWN0aXZlSUQgPSBFTlYubUFSRy0+b3V0RUQtPm1SSUQ7CisKKwlFTlYubUFSRy0+b3V0RUQubWFrZVdyaXRhYmxlKCk7CisJRU5WLm1BUkctPm91dEVELT5tUHJlc2VydmVSSUQgPSB0cnVlOworCisJRU5WLm1BUkctPm91dEVELT5tUklEID0gRU5WLm1BUkctPmF0KDApLmJmUklEKCk7CisKKwlFTlYubUFSRy0+b3V0RUQubXdzZXRSdW50aW1lRm9ybVN0YXRlKFBST0NFU1NfQUJPUlRFRF9TVEFURSk7CisKKwlFTlYubUFSRy0+b3V0RUQtPm1SSUQgPSBFTlYubUFSRy0+b3V0RUQtPm1SSUQuZ2V0UFJJRCgpOworCisJRU5WLm91dEVEUy5hcHBlbmQoIEVOVi5tQVJHLT5vdXRFRCApOworCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV4ZWN1dGlvbiBvZiBhIEFCT1JUI0NISUxEIHByb2dyYW0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworYm9vbCBBdm1QcmltaXRpdmVfQWJvcnRDaGlsZDo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCUFQRXhlY3V0aW9uRGF0YSBvdXRFRCA9IEVOVi5pbkVEOworCW91dEVELm1ha2VXcml0YWJsZSgpOworCW91dEVELT5tUHJlc2VydmVSSUQgPSB0cnVlOworCisvLwljb25zdCBCRkNvZGUgJiBvbkFib3J0ID0gRU5WLmluRUQtPm1SSUQuZ2V0RXhlY3V0YWJsZSgpLT5nZXRPbkFib3J0KCk7CisvLwlpZiggb25BYm9ydC52YWxpZCgpICkKKy8vCXsKKy8vQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBDT01QVVRJTkcgLCBQUk9HUkFNICkKKy8vCUV4ZWN1dGlvbkRhdGFGYWN0b3J5OjphcHBlbmRSdW5uYWJsZUVsZW1lbnRUcmFjZShvdXRFRCwKKy8vCQlCRihuZXcgRXhlY3V0aW9uQ29uZmlndXJhdGlvbihvdXRFRC0+bVJJRCwgQ09OU1RfQkZfT1BFUkFUT1IoQUJPUlQpKSkpOworLy9BVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIENPTVBVVElORyAsIFBST0dSQU0gKQorLy8KKy8vCQlFeGVjdXRpb25FbnZpcm9ubWVudCB0bXBFTlYoRU5WLCBvdXRFRCwgb3V0RUQtPm1SSUQpOworLy8JCWlmKCB0bXBFTlYucnVuKG9uQWJvcnQpICkKKy8vCQl7CisvLwkJCXdoaWxlKCB0bXBFTlYub3V0RURTLm5vbmVtcHR5KCkgKQorLy8JCQl7CisvLwkJCQl0bXBFTlYub3V0RURTLnBvcF9maXJzdF90byggb3V0RUQgKTsKKy8vCisvLwkJCQlvdXRFRC5td3NldFJ1bnRpbWVGb3JtU3RhdGUoRU5WLmluRUQtPm1SSUQsCisvLwkJCQkJCVBST0NFU1NfQUJPUlRFRF9TVEFURSk7CisvLworLy8JCQkJb3V0RUQtPm1SSUQgPSBFTlYuaW5FRC0+bVJJRC5nZXRQUklEKCk7CisvLworLy8JCQkJRU5WLm91dEVEUy5hcHBlbmQoIG91dEVEICk7CisvLwkJCX0KKy8vCisvLwkJCUVOVi5zcGxpY2VOb3RPdXRwdXQodG1wRU5WKTsKKy8vCQl9CisvLwkJZWxzZQorLy8JCXsKKy8vCQkJcmV0dXJuKCBmYWxzZSApOworLy8JCX0KKy8vCX0KKy8vCWVsc2UKKwl7CisJCW91dEVELm13c2V0UnVudGltZUZvcm1TdGF0ZShQUk9DRVNTX0FCT1JURURfU1RBVEUpOworCisvLwkJb3V0RUQtPm1SSUQgPSBFTlYuaW5FRC0+bVJJRC5nZXRQUklEKCk7CisKKwkJRU5WLm91dEVEUy5hcHBlbmQoIG91dEVEICk7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBleGVjdXRpb24gb2YgYSBBQk9SVCNTRUxGIHByb2dyYW0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworYm9vbCBBdm1QcmltaXRpdmVfQWJvcnRTZWxmOjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJQVBFeGVjdXRpb25EYXRhIG91dEVEID0gRU5WLmluRUQ7CisJb3V0RUQubWFrZVdyaXRhYmxlKCk7CisJb3V0RUQtPm1QcmVzZXJ2ZVJJRCA9IHRydWU7CisKKwlvdXRFRC5td3NldFJ1bnRpbWVGb3JtU3RhdGUoUFJPQ0VTU19BQk9SVEVEX1NUQVRFKTsKKworCW91dEVELT5tUklEID0gRU5WLmluRUQtPm1SSUQuZ2V0UFJJRCgpOworCisJRU5WLm91dEVEUy5hcHBlbmQoIG91dEVEICk7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV4ZWN1dGlvbiBvZiBhIEFCT1JUI1NFTFZFUyBwcm9ncmFtCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK2Jvb2wgQXZtUHJpbWl0aXZlX0Fib3J0U2VsdmVzOjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJRU5WLm1BUkctPm91dEVELm1ha2VXcml0YWJsZSgpOworCUVOVi5tQVJHLT5vdXRFRC0+bVByZXNlcnZlUklEID0gdHJ1ZTsKKworCWZvciggYXZtX3VpbnRlZ2VyX3QgbGV2ZWwgPSBFTlYubUFSRy0+YXQoMCkudG9JbnRlZ2VyKCkgOworCQkJbGV2ZWwgPiAwIDsgLS1sZXZlbCApCisJeworCQlFTlYubUFSRy0+b3V0RUQubXdzZXRSdW50aW1lRm9ybVN0YXRlKFBST0NFU1NfQUJPUlRFRF9TVEFURSk7CisKKwkJRU5WLm1BUkctPm91dEVELT5tUklEID0gRU5WLm1BUkctPm91dEVELT5tUklELmdldFBSSUQoKTsKKwl9CisKKwlFTlYub3V0RURTLmFwcGVuZCggRU5WLm1BUkctPm91dEVEICk7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXhlY3V0aW9uIG9mIGFuIFJVTiBwcm9ncmFtCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK2Jvb2wgQXZtUHJpbWl0aXZlX05vcDo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCUVOVi5vdXRFRFMuYXBwZW5kKCBFTlYuaW5FRCApOworCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV4ZWN1dGlvbiBvZiBhIEhJU1RPUlkjQ0xFQVIgcHJvZ3JhbQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitib29sIEF2bVByaW1pdGl2ZV9IaXN0b3J5Q2xlYXI6OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlFTlYubUFSRy0+b3V0RUQtPm1SSUQgPSBFTlYubUFSRy0+YXQoMCkuYmZSSUQoKTsKKworCWlmKCBFTlYubUFSRy0+b3V0RUQtPm1SSUQuZ2V0U3BlY2lmaWVyKCkuaXNNb2NTdGF0ZVRyYW5zaXRpb25TdHJ1Y3R1cmUoKSApCisJeworCQlFTlYubUFSRy0+b3V0RUQubXdzZXRSdW50aW1lRm9ybU9uU2NoZWR1bGUoRU5WLm1BUkctPm91dEVELT5tUklELAorCQkJCUVOVi5tQVJHLT5vdXRFRC0+bVJJRC5nZXRFeGVjdXRhYmxlKCktPmdldE9uRW5hYmxlKCkpOworCX0KKworCUVOVi5vdXRFRFMuYXBwZW5kKCBFTlYubUFSRy0+b3V0RUQgKTsKKworCXJldHVybiggdHJ1ZSApOworfQorCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXhlY3V0aW9uIG9mIGEgREVFUF9ISVNUT1JZI0lOVk9LRSBwcm9ncmFtIDw9PiBTQ0hFRFVMRSNJTlZPS0UKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworYm9vbCBBdm1QcmltaXRpdmVfRGVlcEhpc3RvcnlJbnZva2U6OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlFTlYubUFSRy0+b3V0RUQtPm1SSUQgPSBFTlYubUFSRy0+YXQoMCkuYmZSSUQoKTsKKworCWlmKCBFTlYubUFSRy0+b3V0RUQtPmlzdW5SdW5uYWJsZSggRU5WLm1BUkctPm91dEVELT5tUklEICkgKQorCXsKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCWVsc2UKKwl7CisJCWNvbnN0IEJGQ29kZSAmIG9uSW52b2tlID0gRU5WLm1BUkctPm91dEVELT5nZXRSdW50aW1lRm9ybU9uU2NoZWR1bGUoCisJCQkJRU5WLm1BUkctPm91dEVELT5tUklEKTsKKworCQlpZiggb25JbnZva2UudmFsaWQoKSAmJgorCQkJCUVOVi5tQVJHLT5vdXRFRC0+aXNSdW5uYWJsZSggRU5WLm1BUkctPm91dEVELT5tUklEICkgKQorCQl7CisJCQlFeGVjdXRpb25FbnZpcm9ubWVudCB0bXBFTlYoRU5WLCBFTlYubUFSRy0+b3V0RUQsIG9uSW52b2tlKTsKKwkJCWlmKCB0bXBFTlYucnVuKFBST0NFU1NfUlVOTklOR19TVEFURSkgKQorCQkJeworCQkJCUVOVi5zcGxpY2VPdXRwdXQodG1wRU5WKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlFTlYub3V0RURTLmFwcGVuZCggRU5WLm1BUkctPm91dEVEICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKKworCisJRU5WLm91dEVEUy5hcHBlbmQoIEVOVi5tQVJHLT5vdXRFRCApOworCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBleGVjdXRpb24gb2YgYSBTSEFMTE9XX0hJU1RPUlkjSU5WT0tFIHByb2dyYW0gPD0+IFNDSEVEVUxFI0lOVk9LRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitib29sIEF2bVByaW1pdGl2ZV9TaGFsbG93SGlzdG9yeUludm9rZTo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCUVOVi5tQVJHLT5vdXRFRC0+bVJJRCA9IEVOVi5tQVJHLT5hdCgwKS5iZlJJRCgpOworCisJaWYoIEVOVi5tQVJHLT5vdXRFRC0+aXN1blJ1bm5hYmxlKCBFTlYubUFSRy0+b3V0RUQtPm1SSUQgKSApCisJeworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisJZWxzZQorCXsKKwkJY29uc3QgQkZDb2RlICYgb25JbnZva2UgPSBFTlYubUFSRy0+b3V0RUQtPmdldFJ1bnRpbWVGb3JtT25TY2hlZHVsZSgKKwkJCQlFTlYubUFSRy0+b3V0RUQtPm1SSUQpOworCisJCWlmKCBvbkludm9rZS52YWxpZCgpICYmCisJCQkJRU5WLm1BUkctPm91dEVELT5pc1J1bm5hYmxlKCBFTlYubUFSRy0+b3V0RUQtPm1SSUQgKSApCisJCXsKKwkJCUV4ZWN1dGlvbkVudmlyb25tZW50IHRtcEVOVihFTlYsIEVOVi5tQVJHLT5vdXRFRCwgb25JbnZva2UpOworCQkJaWYoIHRtcEVOVi5ydW4oUFJPQ0VTU19SVU5OSU5HX1NUQVRFKSApCisJCQl7CisJCQkJRU5WLnNwbGljZU91dHB1dCh0bXBFTlYpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCUVOVi5vdXRFRFMuYXBwZW5kKCBFTlYubUFSRy0+b3V0RUQgKTsKKwkJfQorCX0KKworCXJldHVybiggdHJ1ZSApOworCisKKwlFTlYub3V0RURTLmFwcGVuZCggRU5WLm1BUkctPm91dEVEICk7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV4ZWN1dGlvbiBvZiBhIElSVU4gcHJvZ3JhbQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitib29sIEF2bVByaW1pdGl2ZV9JUnVuOjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIENPTVBVVElORyAsIFBST0dSQU0gKQorCisvLwlpZiggRU5WLmluRUQtPmlzUnVubmFibGUoICkgKQorCXsKKwkJRXhlY3V0aW9uRGF0YUZhY3Rvcnk6OmFwcGVuZFJ1bm5hYmxlRWxlbWVudFRyYWNlKEVOVi5pbkVELAorCQkJCUJGKG5ldyBFeGVjdXRpb25Db25maWd1cmF0aW9uKEVOVi5pbkVELT5tUklELAorCQkJCQkJQ09OU1RfQkZfT1BFUkFUT1IoSVJVTikpKSk7CisKKwkJcmV0dXJuKCBFTlYucnVuKCkgKTsKKwl9CisvLwllbHNlCisvLwl7CisvLwkJRU5WLm91dEVEUy5hcHBlbmQoIEVOVi5pbkVEICk7CisvLwkJcmV0dXJuKCB0cnVlICk7CisvLwl9CitBVk1fRUxTRQorCisJcmV0dXJuKCBFTlYucnVuKCkgKTsKKworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBDT01QVVRJTkcgLCBQUk9HUkFNICkKK30KKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV4ZWN1dGlvbiBvZiBhIFJVTiBwcm9ncmFtCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK2Jvb2wgQXZtUHJpbWl0aXZlX1J1bjo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCWNvbnN0IFJ1bnRpbWVJRCAmIHRtcFJJRCA9IEVOVi5tQVJHLT5hdCgwKS5iZlJJRCgpOworCisJaWYoIEVOVi5tQVJHLT5vdXRFRC0+aXN1blJ1bm5hYmxlKCB0bXBSSUQgKSApCisJeworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisJZWxzZSBpZiggdG1wUklELmdldEV4ZWN1dGFibGUoKS0+aGFzT25SdW4oKSAmJgorCQkJRU5WLm1BUkctPm91dEVELT5pc1J1bm5hYmxlKCB0bXBSSUQgKSApCisJeworCQljb25zdCBCRkNvZGUgJiBhUnVuQ29kZSA9IHRtcFJJRC5nZXRFeGVjdXRhYmxlKCktPmdldE9uUnVuKCk7CisKKwkJRU5WLm1BUkctPm91dEVELm13c2V0UnVudGltZUZvcm1TdGF0ZShQUk9DRVNTX1JVTk5JTkdfU1RBVEUpOworCisJCUV4ZWN1dGlvbkVudmlyb25tZW50IHRtcEVOVihFTlYsIEVOVi5tQVJHLT5vdXRFRCwgdG1wUklELCBhUnVuQ29kZSk7CisKKy8vQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBDT01QVVRJTkcgLCBQUk9HUkFNICkKKwlFeGVjdXRpb25EYXRhRmFjdG9yeTo6YXBwZW5kUnVubmFibGVFbGVtZW50VHJhY2UodG1wRU5WLmluRUQsCisJCQlCRihuZXcgRXhlY3V0aW9uQ29uZmlndXJhdGlvbih0bXBSSUQsIENPTlNUX0JGX09QRVJBVE9SKFJVTikpKSk7CisKKy8vCUFWTV9PU19UUkFDRSA8PCAicnVuOj4gIiA8PCB0bXBSSUQuc3RyKCkgPDwgc3RkOjplbmRsOworLy9BVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIENPTVBVVElORyAsIFBST0dSQU0gKQorCisJCS8vIEV4ZWN1dGlvbiBvZiBJbnRlcm5hbCBSdW4KKwkJaWYoIHRtcFJJRC5nZXRFeGVjdXRhYmxlKCktPmhhc09uSVJ1bigpICkKKwkJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBDT01QVVRJTkcgLCBQUk9HUkFNICkKKwlFeGVjdXRpb25EYXRhRmFjdG9yeTo6YXBwZW5kUnVubmFibGVFbGVtZW50VHJhY2UodG1wRU5WLmluRUQsCisJCQlCRihuZXcgRXhlY3V0aW9uQ29uZmlndXJhdGlvbih0bXBSSUQsIENPTlNUX0JGX09QRVJBVE9SKElSVU4pKSkpOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBDT01QVVRJTkcgLCBQUk9HUkFNICkKKworCQkJaWYoIHRtcEVOVi5ydW4oLypPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0lSVU4sKi8KKwkJCQkJdG1wUklELmdldEV4ZWN1dGFibGUoKS0+Z2V0T25JUnVuKCkpICkKKwkJCXsKKwkJCQlFTlYuc3BsaWNlTm90T3V0cHV0KCB0bXBFTlYgKTsKKworCQkJCWlmKCB0bXBFTlYub3V0RURTLm5vbmVtcHR5KCkgKQorCQkJCXsKKwkJCQkJTGlzdE9mQVBFeGVjdXRpb25EYXRhIGlydW5FRFMoIHRtcEVOVi5vdXRFRFMgKTsKKworCQkJCQlpZiggdG1wRU5WLnJ1bkZyb21PdXRwdXRzKGFSdW5Db2RlKSApCisJCQkJCXsKKwkJCQkJCWlmKCB0bXBFTlYub3V0RURTLm5vbmVtcHR5KCkgKQorCQkJCQkJeworCQkJCQkJCUVOVi5zcGxpY2VPdXRwdXQodG1wRU5WKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgLy8gUHJlc2VydmUgSW50ZXJuYWwgUnVuIGVmZmVjdAorCQkJCQkJeworCQkJCQkJCUVOVi5vdXRFRFMuYXBwZW5kKCBpcnVuRURTICk7CisJCQkJCQl9CisKKwkJCQkJCUVOVi5zcGxpY2VOb3RPdXRwdXQoIHRtcEVOViApOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWlmKCB0bXBFTlYucnVuKGFSdW5Db2RlKSApCisJCQkJCXsKKwkJCQkJCUFQRXhlY3V0aW9uRGF0YSB0bXBFRDsKKworCQkJCQkJLy8gSVJRIEVEUyB0cmFpdGVtZW50CisJCQkJCQl3aGlsZSggdG1wRU5WLmlycUVEUy5ub25lbXB0eSgpICkKKwkJCQkJCXsKKwkJCQkJCQl0bXBFTlYuaXJxRURTLnBvcF9sYXN0X3RvKCB0bXBFRCApOworCisJCQkJCQkJLy8gVmVyaWZpY2F0aW9uIG9mIEVYRUNVVElPTiBFTkRJTkcgU1RBVFVTCisJCQkJCQkJc3dpdGNoKCB0bXBFRC0+Z2V0QUVFUygpICkKKwkJCQkJCQl7CisJCQkJCQkJCWNhc2UgQUVFU19TVE1OVF9CUkVBSzoKKwkJCQkJCQkJY2FzZSBBRUVTX1NUTU5UX0NPTlRJTlVFOgorCQkJCQkJCQljYXNlIEFFRVNfU1RNTlRfUkVUVVJOOgorCQkJCQkJCQl7CisJCQkJCQkJCQl0bXBFRC5td3NldEFFRVMoIEFFRVNfT0sgKTsKKworCQkJCQkJCQkJRU5WLm91dEVEUy5hcHBlbmQoIHRtcEVEICk7CisKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQl9CisKKwkJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJeworCQkJCQkJCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJCQkJCQkJPDwgIlVuZXhwZWN0ZWQgRU5ESU5EIEVYRUNVVElPTiAiCisJCQkJCQkJCQkJCQkiU1RBVFVTIGFzIGlycUVEUyA6PiAiCisJCQkJCQkJCQkJCTw8IFJ1bnRpbWVEZWY6OnN0ckFFRVMoIHRtcEVELT5tQUVFUyApCisJCQkJCQkJCQkJCTw8ICIgISEhIgorCQkJCQkJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCisJCQkJCQlFTlYuc3BsaWNlT3V0cHV0KHRtcEVOVik7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJaWYoIHRtcEVOVi5ydW4oKSApCisJCQl7CisJCQkJQVBFeGVjdXRpb25EYXRhIHRtcEVEOworCisJCQkJLy8gSVJRIEVEUyB0cmFpdGVtZW50CisJCQkJd2hpbGUoIHRtcEVOVi5pcnFFRFMubm9uZW1wdHkoKSApCisJCQkJeworCQkJCQl0bXBFTlYuaXJxRURTLnBvcF9sYXN0X3RvKCB0bXBFRCApOworCisJCQkJCS8vIFZlcmlmaWNhdGlvbiBvZiBFWEVDVVRJT04gRU5ESU5HIFNUQVRVUworCQkJCQlzd2l0Y2goIHRtcEVELT5nZXRBRUVTKCkgKQorCQkJCQl7CisJCQkJCQljYXNlIEFFRVNfU1RNTlRfQlJFQUs6CisJCQkJCQljYXNlIEFFRVNfU1RNTlRfQ09OVElOVUU6CisJCQkJCQljYXNlIEFFRVNfU1RNTlRfUkVUVVJOOgorCQkJCQkJeworCQkJCQkJCXRtcEVELm13c2V0QUVFUyggQUVFU19PSyApOworCisJCQkJCQkJRU5WLm91dEVEUy5hcHBlbmQoIHRtcEVEICk7CisKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKworCQkJCQkJZGVmYXVsdDoKKwkJCQkJCXsKKwkJCQkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJCQkJPDwgIlVuZXhwZWN0ZWQgRU5ESU5EIEVYRUNVVElPTiBTVEFUVVMgIgorCQkJCQkJCQkJCSJhcyBpcnFFRFMgOj4gIgorCQkJCQkJCQkJPDwgUnVudGltZURlZjo6c3RyQUVFUyggdG1wRUQtPm1BRUVTICkKKwkJCQkJCQkJCTw8ICIgISEhIgorCQkJCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisKKwkJCQlFTlYuc3BsaWNlT3V0cHV0KHRtcEVOVik7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJfQorCQl9CisJfQorCWVsc2UKKwl7CisJCWlmKCBub3QgRU5WLm1BUkctPm91dEVELT5oYXNSdW5uYWJsZUVsZW1lbnRUcmFjZSgpICkKKy8vCQlpZiggRU5WLm1BUkctPm91dEVELT5pc0NyZWF0ZWQoIHRtcFJJRCApICkKKwkJeworCQkJRU5WLm1BUkctPm91dEVELT5tQUVFUyA9IEFFRVNfU1RNTlRfTk9USElORzsKKwkJfQorCisJCUVOVi5hcHBlbmRPdXRwdXQoRU5WLm1BUkctPm91dEVEKTsKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXhlY3V0aW9uIG9mIGEgUlRDIHByb2dyYW0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworYm9vbCBBdm1QcmltaXRpdmVfUnRjOjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJY29uc3QgUnVudGltZUlEICYgcnRjUklEID0gRU5WLm1BUkctPmF0KDApLmJmUklEKCk7CisKKwlpZiggRU5WLm1BUkctPm91dEVELT5pc3VuUnVubmFibGUoIHJ0Y1JJRCApICkKKwl7CisJCXJldHVybiggdHJ1ZSApOworCX0KKwllbHNlIGlmKCBFTlYubUFSRy0+b3V0RUQtPmlzUnVubmFibGUoIHJ0Y1JJRCApICkKKwl7CisJCWNvbnN0IEJGQ29kZSByY3RDb2RlID0gcnRjUklELmdldEV4ZWN1dGFibGUoKS0+Z2V0T25SdGMoKTsKKworCQlFeGVjdXRpb25FbnZpcm9ubWVudCB0bXBFTlYoRU5WLCBFTlYubUFSRy0+b3V0RUQsIHJ0Y1JJRCwgcmN0Q29kZSk7CisKKy8vQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBDT01QVVRJTkcgLCBQUk9HUkFNICkKKwlFeGVjdXRpb25EYXRhRmFjdG9yeTo6YXBwZW5kUnVubmFibGVFbGVtZW50VHJhY2UodG1wRU5WLmluRUQsCisJCQlCRihuZXcgRXhlY3V0aW9uQ29uZmlndXJhdGlvbihydGNSSUQsIENPTlNUX0JGX09QRVJBVE9SKFJUQykpKSk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgQ09NUFVUSU5HICwgU1RBVEVNRU5UICkKKwlBVk1fT1NfVFJBQ0UgPDwgInJ0Yzo+ICIgPDwgcnRjUklELnN0cigpIDw8IHN0ZDo6ZW5kbDsKKwlBVk1fT1NfQ09VVCAgPDwgInJ0Yzo+ICIgPDwgcnRjUklELnN0cigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgQ09NUFVUSU5HICwgU1RBVEVNRU5UICkKKworLy9BVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIENPTVBVVElORyAsIFBST0dSQU0gKQorCisJCWlmKCBub3QgdG1wRU5WLnJ1bihQUk9DRVNTX1JUQ19TVEFURSkgKQorCQl7CisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKworCQlpZiggdG1wRU5WLmhhc091dHB1dCgpICkKKwkJeworCQkJTGlzdE9mQVBFeGVjdXRpb25EYXRhIG5leHRSVEM7CisJCQlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGEgcHJldlJUQzsKKworCQkJaWYoIHRtcEVOVi5leHRyYWN0T3RoZXJPdXRwdXRFRChFTlYubUFSRy0+b3V0RUQsIHByZXZSVEMpICkKKwkJCXsKKwkJCQlpZiggcHJldlJUQy5lbXB0eSgpICkKKwkJCQl7CisJCQkJCUVOVi5hcHBlbmRPdXRwdXRfd3J0QUVFUyggRU5WLm1BUkctPm91dEVEICk7CisJCQkJfQorCQkJfQorCisJCQlBUEV4ZWN1dGlvbkRhdGEgdG1wRUQ7CisKKwkJCXdoaWxlKCBwcmV2UlRDLm5vbmVtcHR5KCkgKQorCQkJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBDT01QVVRJTkcgLCBQUk9HUkFNICkKKwlBVk1fT1NfQ09VVCA8PCAicnRjOj4gbGVhZiBjb3VudDogIiA8PCBwcmV2UlRDLnNpemUoKSA8PCBzdGQ6OmVuZGw7CisKKwlBVk1fT1NfQ09VVCA8PCAiUFJFU1MgRU5URVIiIDw8IHN0ZDo6ZW5kbDsKKwlzdGQ6OmNpbi5nZXQoKTsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgQ09NUFVUSU5HICwgUFJPR1JBTSApCisKKy8vCQkJCWN1cnJlbnRFRC5wb3BfZmlyc3RfdG8oIHRtcEVEICk7CisJCQkJcHJldlJUQy5wb3BfbGFzdF90byggdG1wRUQgKTsKKworCQkJCXN3aXRjaCggdG1wRUQtPm1BRUVTICkKKwkJCQl7CisJCQkJCWNhc2UgQUVFU19TVE1OVF9OT1RISU5HOgorCQkJCQljYXNlIEFFRVNfU1RNTlRfQ09OVElOVUU6CisJCQkJCWNhc2UgQUVFU19TVE1OVF9GSU5BTDoKKwkJCQkJY2FzZSBBRUVTX1NUTU5UX0RFU1RST1k6CisJCQkJCXsKKwkJCQkJCXRtcEVELm13c2V0QUVFUyggQUVFU19PSyApOworCisJCQkJCQkvLyEhISBOTyA8PCBicmVhayA+PiBmb3IgdGhlc2Ugc3RhdGVtZW50CisJCQkJCX0KKworCQkJCQkvLyBFdmFsdWF0aW9uIG9mIE5FWFQgU0VRVUVOQ0lBTCBTVEFURU1FTlQKKwkJCQkJY2FzZSBBRUVTX09LOgorCQkJCQljYXNlIEFFRVNfU1RFUF9SRVNVTUU6CisJCQkJCXsKKwkJCQkJCXRtcEVELT5tUklEID0gcnRjUklEOworCisJCQkJCQlpZiggdG1wRU5WLnJ1bih0bXBFRCwgcmN0Q29kZSkgKQorCQkJCQkJeworCQkJCQkJCWlmKCB0bXBFTlYuaGFzT3V0cHV0KCkgKQorCQkJCQkJCXsKKwkJCQkJCQkJaWYoIHRtcEVOVi5leHRyYWN0T3RoZXJPdXRwdXRFRCh0bXBFRCwgbmV4dFJUQykgKQorCQkJCQkJCQl7CisJCQkJCQkJCQlpZiggbmV4dFJUQy5lbXB0eSgpCisJCQkJCQkJCQkJJiYgdG1wRUQtPmlzVE5FUSggRU5WLm1BUkctPm91dEVEICkgKQorCQkJCQkJCQkJeworCQkJCQkJCQkJCUVOVi5hcHBlbmRPdXRwdXRfd3J0QUVFUyggdG1wRUQgKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCQlwcmV2UlRDLnNwbGljZSggbmV4dFJUQyApOworCQkJCQkJCX0KKwkJCQkJCQllbHNlIGlmKCB0bXBFRCAhPSBFTlYubUFSRy0+b3V0RUQgKQorCQkJCQkJCXsKKwkJCQkJCQkJRU5WLmFwcGVuZE91dHB1dF93cnRBRUVTKCB0bXBFRCApOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJCQl9CisKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJY2FzZSBBRUVTX1NUTU5UX0JSRUFLOgorCQkJCQljYXNlIEFFRVNfU1RNTlRfUkVUVVJOOgorCQkJCQl7CisJCQkJCQlFTlYub3V0RURTLmFwcGVuZCggdG1wRUQgKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJZGVmYXVsdDoKKwkJCQkJeworCQkJCQkJRU5WLmRlc3Ryb3lPdXRFRCgpOworCisJCQkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJCQk8PCAiVW5leHBlY3RlZCBFTkRJTkQgRVhFQ1VUSU9OIFNUQVRVUyA6PiAiCisJCQkJCQkJCTw8IFJ1bnRpbWVEZWY6OnN0ckFFRVMoIHRtcEVELT5tQUVFUyApIDw8ICIgISEhIgorCQkJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlIGlmKCBub3QgRU5WLmFwcGVuZE91dHB1dF9td3NldFBFUyhFTlYubUFSRy0+b3V0RUQsIHJ0Y1JJRCwKKwkJCQlQUk9DRVNTX1JVTk5JTkdfU1RBVEUpICkKKwkJeworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQkvLyBTeW5jIEVEUyB0cmFpdGVtZW50CisJCUVOVi5zcGxpY2VTeW5jX213U3RvcmVQb3ModG1wRU5WKTsKKworCQkvLyBJUlEgRURTIHRyYWl0ZW1lbnQKKwkJRU5WLnNwbGljZU5vdE91dHB1dCh0bXBFTlYpOworCX0KKwllbHNlCisJeworCQlpZiggbm90IEVOVi5tQVJHLT5vdXRFRC0+aGFzUnVubmFibGVFbGVtZW50VHJhY2UoKSApCisvLwkJaWYoIEVOVi5tQVJHLT5vdXRFRC0+aXNDcmVhdGVkKCB0bXBSSUQgKSApCisJCXsKKwkJCUVOVi5tQVJHLT5vdXRFRC0+bUFFRVMgPSBBRUVTX1NUTU5UX05PVEhJTkc7CisJCX0KKworCQlFTlYub3V0RURTLmFwcGVuZCggRU5WLm1BUkctPm91dEVEICk7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworYm9vbCBBdm1QcmltaXRpdmVfUnRjOjpyZXN1bWUoRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJRU5WLm91dEVEUy5hcHBlbmQoIEVOVi5pbkVEICk7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV4ZWN1dGlvbiBvZiBhIFNDSEVEVUxFI0lOVk9LRSBwcm9ncmFtCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK2Jvb2wgQXZtUHJpbWl0aXZlX1NjaGVkdWxlSW52b2tlOjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJRU5WLm1BUkctPm91dEVELT5tUklEID0gRU5WLm1BUkctPmF0KDApLmJmUklEKCk7CisKKwlpZiggRU5WLm1BUkctPm91dEVELT5pc3VuUnVubmFibGUoIEVOVi5tQVJHLT5vdXRFRC0+bVJJRCApICkKKwl7CisJCXJldHVybiggdHJ1ZSApOworCX0KKwllbHNlCisJeworCQljb25zdCBCRkNvZGUgJiBvbkludm9rZSA9IEVOVi5tQVJHLT5vdXRFRC0+Z2V0UnVudGltZUZvcm1PblNjaGVkdWxlKAorCQkJCUVOVi5tQVJHLT5vdXRFRC0+bVJJRCk7CisKKwkJaWYoIG9uSW52b2tlLnZhbGlkKCkgJiYKKwkJCQlFTlYubUFSRy0+b3V0RUQtPmlzUnVubmFibGUoIEVOVi5tQVJHLT5vdXRFRC0+bVJJRCApICkKKwkJeworCQkJRXhlY3V0aW9uRW52aXJvbm1lbnQgdG1wRU5WKEVOViwgRU5WLm1BUkctPm91dEVELCBvbkludm9rZSk7CisJCQlpZiggdG1wRU5WLnJ1bihQUk9DRVNTX1JVTk5JTkdfU1RBVEUpICkKKwkJCXsKKwkJCQlFTlYuc3BsaWNlT3V0cHV0KHRtcEVOVik7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJaWYoIG5vdCBFTlYubUFSRy0+b3V0RUQtPmhhc1J1bm5hYmxlRWxlbWVudFRyYWNlKCkgKQorLy8JCQlpZiggRU5WLm1BUkctPm91dEVELT5pc0NyZWF0ZWQoIHRtcFJJRCApICkKKwkJCXsKKwkJCQlFTlYubUFSRy0+b3V0RUQtPm1BRUVTID0gQUVFU19TVE1OVF9OT1RISU5HOworCQkJfQorCisJCQlFTlYub3V0RURTLmFwcGVuZCggRU5WLm1BUkctPm91dEVEICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV4ZWN1dGlvbiBvZiBhIFNDSEVEVUxFI0dFVCBwcm9ncmFtCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK2Jvb2wgQXZtUHJpbWl0aXZlX1NjaGVkdWxlR2V0OjpzZXZhbChFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJRU5WLm91dFZBTCA9IEVOVi5tQVJHLT5vdXRFRC0+Z2V0UnVudGltZUZvcm1PblNjaGVkdWxlKEVOVi5tQVJHLT5hdCgwKS5iZlJJRCgpKTsKKworCXJldHVybiggdHJ1ZSApOworfQorCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXhlY3V0aW9uIG9mIGEgU0NIRURVTEUjSU4gcHJvZ3JhbQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitib29sIEF2bVByaW1pdGl2ZV9TY2hlZHVsZUluOjpzZXZhbChFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJY29uc3QgQkZDb2RlICYgc2NoZWR1bGVDb2RlID0gRU5WLm1BUkctPm91dEVELT5nZXRSdW50aW1lRm9ybU9uU2NoZWR1bGUoCisJCQlFTlYubUFSRy0+YXQoMSkuYmZSSUQoKSApOworCisJY29uc3QgUnVudGltZUlEICYgYVJJRCA9IEVOVi5tQVJHLT5hdCgwKS5iZlJJRCgpOworCisJaWYoIHNjaGVkdWxlQ29kZS52YWxpZCgpICYmIGFSSUQudmFsaWQoKSApCisJeworCQlFTlYub3V0VkFMID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKAorCQkJCVN0YXRlbWVudEZhY3Rvcnk6OmNvbnRhaW5zT3BlcmF0aW9uT25SSUQoCisJCQkJCQlzY2hlZHVsZUNvZGUsIEFWTV9PUENPREVfUlVOLCBhUklEKSk7CisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXhlY3V0aW9uIG9mIGEgU0NIRURVTEUjU0VUIHByb2dyYW0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworYm9vbCBBdm1QcmltaXRpdmVfU2NoZWR1bGVTZXQ6OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlFTlYubUFSRy0+b3V0RUQubXdzZXRSdW50aW1lRm9ybU9uU2NoZWR1bGUoCisJCQlFTlYubUFSRy0+YXQoMCkuYmZSSUQoKSwgRU5WLm1BUkctPmF0KDEpLmJmQ29kZSgpKTsKKworCUVOVi5vdXRFRFMuYXBwZW5kKCBFTlYubUFSRy0+b3V0RUQgKTsKKworCXJldHVybiggdHJ1ZSApOworfQorCisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBleGVjdXRpb24gb2YgYSBERUZFUiNJTlZPS0UgcHJvZ3JhbQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitib29sIEF2bVByaW1pdGl2ZV9EZWZlckludm9rZTo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCWNvbnN0IFJ1bnRpbWVJRCAmIGRlZmVyUklEID0gRU5WLm1BUkctPmF0KDApLmJmUklEKCk7CisKKwlpZiggRU5WLm1BUkctPm91dEVELT5pc3VuUnVubmFibGUoIGRlZmVyUklEICkgKQorCXsKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCWVsc2UKKwl7CisJCWNvbnN0IEJGQ29kZSAmIGFSdW5Db2RlID0gRU5WLm1BUkctPm91dEVELT5nZXRSdW50aW1lRm9ybU9uRGVmZXIoZGVmZXJSSUQpOworCisJCWlmKCBhUnVuQ29kZS52YWxpZCgpICYmIEVOVi5tQVJHLT5vdXRFRC0+aXNSdW5uYWJsZSggZGVmZXJSSUQgKSApCisJCXsKKwkJCUJGQ29kZSBhUnVuQ29kZSA9IEVOVi5tQVJHLT5vdXRFRC0+Z2V0UnVudGltZUZvcm1PbkRlZmVyKGRlZmVyUklEKTsKKworCQkJRXhlY3V0aW9uRW52aXJvbm1lbnQgdG1wRU5WKEVOViwgRU5WLm1BUkctPm91dEVELCBkZWZlclJJRCwgYVJ1bkNvZGUpOworCQkJaWYoIHRtcEVOVi5ydW4oUFJPQ0VTU19SVU5OSU5HX1NUQVRFKSApCisJCQl7CisJCQkJRU5WLnNwbGljZU91dHB1dCh0bXBFTlYpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCUVOVi5vdXRFRFMuYXBwZW5kKCBFTlYuaW5FRCApOworCQl9CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBleGVjdXRpb24gb2YgYSBERUZFUiNHRVQgcHJvZ3JhbQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitib29sIEF2bVByaW1pdGl2ZV9EZWZlckdldDo6c2V2YWwoRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCUVOVi5vdXRWQUwgPSBFTlYubUFSRy0+b3V0RUQtPmdldFJ1bnRpbWVGb3JtT25EZWZlcihFTlYubUFSRy0+YXQoMCkuYmZSSUQoKSk7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV4ZWN1dGlvbiBvZiBhIERFRkVSI1NFVCBwcm9ncmFtCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK2Jvb2wgQXZtUHJpbWl0aXZlX0RlZmVyU2V0OjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJRU5WLm1BUkctPm91dEVELm13c2V0UnVudGltZUZvcm1PbkRlZmVyKAorCQkJRU5WLm1BUkctPmF0KDApLmJmUklEKCksIEVOVi5tQVJHLT5hdCgxKS5iZkNvZGUoKSk7CisKKwlFTlYub3V0RURTLmFwcGVuZCggRU5WLm1BUkctPm91dEVEICk7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBleGVjdXRpb24gb2YgYSBGT1JLIHByb2dyYW0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworYm9vbCBBdm1QcmltaXRpdmVfRm9yazo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gRU5WLmluQ09ERS0+YmVnaW4oKTsKKwlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IEVOVi5pbkNPREUtPmVuZCgpOworCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCXsKKwkJRU5WLnJ1biggKml0ICk7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBleGVjdXRpb24gb2YgYSBKT0lOIHByb2dyYW0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENIRUNLIE1PQworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgQXZtUHJpbWl0aXZlX0pvaW46OmNoZWNrc2F0Sm9pbigKKwkJRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsIGNvbnN0IEJGICYgYUpvaW5TcGVjKQoreworCXN3aXRjaCggYUpvaW5TcGVjLmNsYXNzS2luZCgpICkKKwl7CisJCWNhc2UgRk9STV9BVk1DT0RFX0tJTkQ6CisJCXsKKwkJCWNvbnN0IEJGQ29kZSAmIGFDb2RlID0gYUpvaW5TcGVjLmJmQ29kZSgpOworCisJCQlzd2l0Y2ggKCBhQ29kZS0+Z2V0QXZtT3BDb2RlKCkgKQorCQkJeworCQkJCWNhc2UgQVZNX09QQ09ERV9OT1Q6CisJCQkJeworCQkJCQlyZXR1cm4oIG5vdCBjaGVja3NhdEpvaW4oRU5WLCBhQ29kZS0+Zmlyc3QoKSkgKTsKKwkJCQl9CisKKwkJCQljYXNlIEFWTV9PUENPREVfQU5EOgorCQkJCWNhc2UgQVZNX09QQ09ERV9TVFJPTkdfU1lOQ0hST05PVVM6CisJCQkJeworCQkJCQlBdm1Db2RlOjppdGVyYXRvciBpdEZvcm0gPSBhQ29kZS0+YmVnaW4oKTsKKwkJCQkJQXZtQ29kZTo6aXRlcmF0b3IgZW5kRm9ybSA9IGFDb2RlLT5lbmQoKTsKKwkJCQkJZm9yKCA7IGl0Rm9ybSAhPSBlbmRGb3JtIDsgKytpdEZvcm0gKQorCQkJCQl7CisJCQkJCQlpZiggbm90IGNoZWNrc2F0Sm9pbihFTlYsICppdEZvcm0pICkKKwkJCQkJCXsKKwkJCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJcmV0dXJuKCB0cnVlICk7CisJCQkJfQorCisJCQkJY2FzZSBBVk1fT1BDT0RFX09SOgorCQkJCWNhc2UgQVZNX09QQ09ERV9XRUFLX1NZTkNIUk9OT1VTOgorCQkJCXsKKwkJCQkJQXZtQ29kZTo6aXRlcmF0b3IgaXRGb3JtID0gYUNvZGUtPmJlZ2luKCk7CisJCQkJCUF2bUNvZGU6Oml0ZXJhdG9yIGVuZEZvcm0gPSBhQ29kZS0+ZW5kKCk7CisJCQkJCWZvciggOyBpdEZvcm0gIT0gZW5kRm9ybSA7ICsraXRGb3JtICkKKwkJCQkJeworCQkJCQkJaWYoIGNoZWNrc2F0Sm9pbihFTlYsICppdEZvcm0pICkKKwkJCQkJCXsKKwkJCQkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJfQorCisJCQkJY2FzZSBBVk1fT1BDT0RFX1hPUjoKKwkJCQljYXNlIEFWTV9PUENPREVfRVhDTFVTSVZFOgorCQkJCXsKKwkJCQkJYXZtX3NpemVfdCBuYlRydWUgPSAwOworCisJCQkJCUF2bUNvZGU6Oml0ZXJhdG9yIGl0Rm9ybSA9IGFDb2RlLT5iZWdpbigpOworCQkJCQlBdm1Db2RlOjppdGVyYXRvciBlbmRGb3JtID0gYUNvZGUtPmVuZCgpOworCQkJCQlmb3IoIDsgaXRGb3JtICE9IGVuZEZvcm0gOyArK2l0Rm9ybSApCisJCQkJCXsKKwkJCQkJCWlmKCBjaGVja3NhdEpvaW4oRU5WLCAqaXRGb3JtKSApCisJCQkJCQl7CisJCQkJCQkJKytuYlRydWU7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJcmV0dXJuKCBuYlRydWUgPT0gMSApOworCQkJCX0KKworCQkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisKKwkJY2FzZSBGT1JNX1JVTlRJTUVfSURfS0lORDoKKwkJeworCQkJcmV0dXJuKCBFTlYuaW5FRC0+aXNXYWl0aW5nSm9pbiggYUpvaW5TcGVjLmJmUklEKCkgKSApOworCQl9CisKKwkJY2FzZSBGT1JNX0lOU1RBTkNFX01BQ0hJTkVfS0lORDoKKwkJY2FzZSBGT1JNX0lOU1RBTkNFX0RBVEFfS0lORDoKKwkJeworCQkJLy9yZXR1cm4oIEVOVi5pbkVELT5pc1dhaXRpbmdKb2luKCBFTlYuZXZhbE1hY2hpbmUoYUpvaW5TcGVjKSApICk7CisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKwl9Cit9CisKKworYm9vbCBBdm1QcmltaXRpdmVfSm9pbjo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCUFQRXhlY3V0aW9uRGF0YSBvdXRFRCA9IEVOVi5pbkVEOworCW91dEVELm13c2V0QUVFUyggQUVFU19XQUlUSU5HX0pPSU5fRk9SSyApOworCisJaWYoIHRhYmxlT2ZXYWl0aW5nSm9pbi5lbXB0eSgpICkKKwl7CisJCXRhYmxlT2ZXYWl0aW5nSm9pbi5yZXNpemUoIEVOVi5pbkVELT5nZXRUYWJsZU9mUnVudGltZSgpLnNpemUoKSApOworCisJCW91dEVELm13c2V0UnVudGltZUZvcm1TdGF0ZShvdXRFRC0+bVJJRCwgUFJPQ0VTU19XQUlUSU5HX0pPSU5fU1RBVEUpOworCQl0YWJsZU9mV2FpdGluZ0pvaW5bIG91dEVELT5tUklELmdldE9mZnNldCgpIF0uYXBwZW5kKCBvdXRFRCApOworCX0KKwllbHNlIGlmKCB0YWJsZU9mV2FpdGluZ0pvaW5bIG91dEVELT5tUklELmdldE9mZnNldCgpIF0uZW1wdHkoKSApCisJeworCQlvdXRFRC5td3NldFJ1bnRpbWVGb3JtU3RhdGUob3V0RUQtPm1SSUQsIFBST0NFU1NfV0FJVElOR19KT0lOX1NUQVRFKTsKKwkJdGFibGVPZldhaXRpbmdKb2luWyBvdXRFRC0+bVJJRC5nZXRPZmZzZXQoKSBdLmFwcGVuZCggb3V0RUQgKTsKKwl9CisKKwllbHNlIGlmKCB0YWJsZU9mV2FpdGluZ0pvaW5bIG91dEVELT5tUklELmdldE9mZnNldCgpIF0uc2luZ2xldG9uKCkgKQorCXsKKwkJY29uc3QgQVBFeGVjdXRpb25EYXRhICYgb3RoZXJFRCA9CisJCQkJdGFibGVPZldhaXRpbmdKb2luWyBvdXRFRC0+bVJJRC5nZXRPZmZzZXQoKSBdLmZpcnN0KCk7CisKKwkJQVBFeGVjdXRpb25EYXRhIGpvaW5FRCA9IEF2bVN5bmNocm9uaXphdGlvbkZhY3Rvcnk6OmZ1c2lvbigKKwkJCQlvdXRFRC0+Z2V0RXhlY3V0aW9uQ29udGV4dCgpLT5MQ0EoCisJCQkJCW90aGVyRUQtPmdldEV4ZWN1dGlvbkNvbnRleHQoKSktPmdldEFQRXhlY3V0aW9uRGF0YSgpLAorCQkJCW91dEVELCBvdGhlckVEICk7CisJCWlmKCBqb2luRUQudmFsaWQoKSApCisJCXsKKwkJCWpvaW5FRC0+c2V0UnVudGltZUZvcm1TdGF0ZShvdXRFRC0+bVJJRCwgUFJPQ0VTU19JRExFX1NUQVRFKTsKKwkJCWpvaW5FRC5td3NldEFFRVMoIEFFRVNfT0sgKTsKKwkJCUVOVi5vdXRFRFMuYXBwZW5kKCBqb2luRUQgKTsKKworCQkJdGFibGVPZldhaXRpbmdKb2luWyBvdXRFRC0+bVJJRC5nZXRPZmZzZXQoKSBdLmNsZWFyKCk7CisJCX0KKwl9CisJZWxzZSBpZiggdGFibGVPZldhaXRpbmdKb2luWyBvdXRFRC0+bVJJRC5nZXRPZmZzZXQoKSBdLnBvcHVsYXRlZCgpICkKKwl7CisJCUFQRXhlY3V0aW9uRGF0YSBqb2luRUQgPSBvdXRFRDsKKworCQlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGE6OmNvbnN0X2l0ZXJhdG9yIGl0RUQgPQorCQkJCXRhYmxlT2ZXYWl0aW5nSm9pblsgb3V0RUQtPm1SSUQuZ2V0T2Zmc2V0KCkgXS5iZWdpbigpOworCQlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGE6OmNvbnN0X2l0ZXJhdG9yIGVuZEVEID0KKwkJCQl0YWJsZU9mV2FpdGluZ0pvaW5bIG91dEVELT5tUklELmdldE9mZnNldCgpIF0uZW5kKCk7CisJCWZvciggOyBpdEVEICE9IGVuZEVEIDsgKytpdEVEICkKKwkJeworCQkJam9pbkVEID0gQXZtU3luY2hyb25pemF0aW9uRmFjdG9yeTo6ZnVzaW9uKAorCQkJCQlvdXRFRC0+Z2V0RXhlY3V0aW9uQ29udGV4dCgpLT5MQ0EoCisJCQkJCQkoKml0RUQpLT5nZXRFeGVjdXRpb25Db250ZXh0KCkpLT5nZXRBUEV4ZWN1dGlvbkRhdGEoKSwKKwkJCQkJam9pbkVELCAqaXRFRCk7CisJCQlpZiggam9pbkVELmludmFsaWQoKSApCisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisJCQlqb2luRUQtPnNldFJ1bnRpbWVGb3JtU3RhdGUob3V0RUQtPm1SSUQsIFBST0NFU1NfSURMRV9TVEFURSk7CisJCX0KKworCQlpZiggam9pbkVELnZhbGlkKCkgKQorCQl7CisJCQlqb2luRUQubXdzZXRBRUVTKCBBRUVTX09LICk7CisJCQlFTlYub3V0RURTLmFwcGVuZCggam9pbkVEICk7CisKKwkJCXRhYmxlT2ZXYWl0aW5nSm9pblsgb3V0RUQtPm1SSUQuZ2V0T2Zmc2V0KCkgXS5jbGVhcigpOworCQl9CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBleGVjdXRpb24gb2YgYSBSRFYgcHJvZ3JhbQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitib29sIEF2bVByaW1pdGl2ZV9SZHY6OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKy8vCWNvbnN0IFJ1bnRpbWVJRCAmIHRtcFJJRCA9IEVOVi5tQVJHLT5hdCgwKS5iZlJJRCgpOworCisvLwlFTlYub3V0RURTLmFwcGVuZCggRU5WLm1BUkctPm91dEVEICk7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1BY3Rpdml0eVByaW1pdGl2ZS5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bUFjdGl2aXR5UHJpbWl0aXZlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEyYjRkMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1BY3Rpdml0eVByaW1pdGl2ZS5oCkBAIC0wLDAgKzEsMTUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjAgbWFpIDIwMTAKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBBVk1BQ1RJVklUWVBSSU1JVElWRV9IXworI2RlZmluZSBBVk1BQ1RJVklUWVBSSU1JVElWRV9IXworCisjaW5jbHVkZSA8Y29tcHV0ZXIvcHJpbWl0aXZlL0Jhc2VBdm1QcmltaXRpdmUuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkRhdGEuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9NZXNzYWdlLmg+CisKKworCituYW1lc3BhY2Ugc2VwCit7CisKKworY2xhc3MgSW5zdGFuY2VPZkJ1ZmZlcjsKK2NsYXNzIFJ1bnRpbWVJRDsKKworCitBVk1fUFJJTUlUSVZFX1JVTl9DTEFTUyhDb250ZXh0U3dpdGNoZXIsIEJhc2VBdm1QcmltaXRpdmUpCisKK0FWTV9QUklNSVRJVkVfUlVOX0NMQVNTKEluaXQsIEJhc2VBdm1QcmltaXRpdmUpCisKKworQVZNX1BSSU1JVElWRV9SVU5fQ0xBU1NfSEVBREVSKEZpbmFsLCBCYXNlQXZtUHJpbWl0aXZlKQorCWJvb2wgZmluYWxpemVkUGFyZW50KEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WLAorCQkJRXhlY3V0aW9uRW52aXJvbm1lbnQgJiB0bXBFTlYsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQpOworCisJYm9vbCBmaW5hbGl6ZWRQYXJlbnQoRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsIEFQRXhlY3V0aW9uRGF0YSAmIGFuRUQsCisJCQljb25zdCBSdW50aW1lSUQgJiBhUklEKTsKK307CisKKworQVZNX1BSSU1JVElWRV9SVU5fQ0xBU1NfSEVBREVSKERlc3Ryb3ksIEJhc2VBdm1QcmltaXRpdmUpCisJYm9vbCBkZXN0cm95ZWRQYXJlbnQoRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsCisJCQlFeGVjdXRpb25FbnZpcm9ubWVudCAmIHRtcEVOViwgY29uc3QgUnVudGltZUlEICYgYVJJRCk7CisKKwlib29sIGRlc3Ryb3llZFBhcmVudChFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOViwKKwkJCUFQRXhlY3V0aW9uRGF0YSAmIGFuRUQsCWNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQpOworfTsKKworCitBVk1fUFJJTUlUSVZFX1JVTl9DTEFTUyhTdGFydCwgQmFzZUF2bVByaW1pdGl2ZSkKKworQVZNX1BSSU1JVElWRV9SVU5fQ0xBU1MoUmVzdGFydCwgQmFzZUF2bVByaW1pdGl2ZSkKKworQVZNX1BSSU1JVElWRV9SVU5fQ0xBU1MoU3RvcCwgQmFzZUF2bVByaW1pdGl2ZSkKKworCitBVk1fUFJJTUlUSVZFX1JVTl9DTEFTUyhXYWl0LCBCYXNlQXZtUHJpbWl0aXZlKQorCisKK0FWTV9QUklNSVRJVkVfUlVOX0NMQVNTKFN1c3BlbmQsIEJhc2VBdm1QcmltaXRpdmUpCisKK0FWTV9QUklNSVRJVkVfUlVOX0NMQVNTKFJlc3VtZSwgQmFzZUF2bVByaW1pdGl2ZSkKKworCisvLyBFbmFibGUgZmFtaWx5CitBVk1fUFJJTUlUSVZFX1JVTl9DTEFTUyhJRW5hYmxlSW52b2tlICwgQmFzZUF2bVByaW1pdGl2ZSkKK0FWTV9QUklNSVRJVkVfUlVOX0NMQVNTKEVuYWJsZUludm9rZSAgLCBCYXNlQXZtUHJpbWl0aXZlKQorQVZNX1BSSU1JVElWRV9SVU5fQ0xBU1MoRW5hYmxlU2V0ICAgICAsIEJhc2VBdm1QcmltaXRpdmUpCisKKy8vIERpc2FibGUgZmFtaWx5CitBVk1fUFJJTUlUSVZFX1JVTl9DTEFTUyhJRGlzYWJsZUludm9rZSwgQmFzZUF2bVByaW1pdGl2ZSkKK0FWTV9QUklNSVRJVkVfUlVOX0NMQVNTKERpc2FibGVJbnZva2UgLCBCYXNlQXZtUHJpbWl0aXZlKQorQVZNX1BSSU1JVElWRV9SVU5fQ0xBU1MoRGlzYWJsZVNldCAgICAsIEJhc2VBdm1QcmltaXRpdmUpCisKK0FWTV9QUklNSVRJVkVfUlVOX0NMQVNTKERpc2FibGVDaGlsZCAgLCBCYXNlQXZtUHJpbWl0aXZlKQorQVZNX1BSSU1JVElWRV9SVU5fQ0xBU1MoRGlzYWJsZVNlbGYgICAsIEJhc2VBdm1QcmltaXRpdmUpCitBVk1fUFJJTUlUSVZFX1JVTl9DTEFTUyhEaXNhYmxlU2VsdmVzICwgQmFzZUF2bVByaW1pdGl2ZSkKKworLy8gQWJvcnQgZmFtaWx5CitBVk1fUFJJTUlUSVZFX1JVTl9DTEFTUyhJQWJvcnRJbnZva2UgICwgQmFzZUF2bVByaW1pdGl2ZSkKK0FWTV9QUklNSVRJVkVfUlVOX0NMQVNTKEFib3J0SW52b2tlICAgLCBCYXNlQXZtUHJpbWl0aXZlKQorQVZNX1BSSU1JVElWRV9SVU5fQ0xBU1MoQWJvcnRTZXQgICAgICAsIEJhc2VBdm1QcmltaXRpdmUpCisKK0FWTV9QUklNSVRJVkVfUlVOX0NMQVNTKEFib3J0Q2hpbGQgICAgLCBCYXNlQXZtUHJpbWl0aXZlKQorQVZNX1BSSU1JVElWRV9SVU5fQ0xBU1MoQWJvcnRTZWxmICAgICAsIEJhc2VBdm1QcmltaXRpdmUpCitBVk1fUFJJTUlUSVZFX1JVTl9DTEFTUyhBYm9ydFNlbHZlcyAgICwgQmFzZUF2bVByaW1pdGl2ZSkKKworCitBVk1fUFJJTUlUSVZFX1JVTl9DTEFTUyhOb3AsIEJhc2VBdm1QcmltaXRpdmUpCisKKworLy8gSGlzdG9yeSBmYW1pbHkKK0FWTV9QUklNSVRJVkVfUlVOX0NMQVNTKEhpc3RvcnlDbGVhciAgLCBCYXNlQXZtUHJpbWl0aXZlKQorCitBVk1fUFJJTUlUSVZFX1JVTl9DTEFTUyhEZWVwSGlzdG9yeUludm9rZSwgQmFzZUF2bVByaW1pdGl2ZSkKKworQVZNX1BSSU1JVElWRV9SVU5fQ0xBU1MoU2hhbGxvd0hpc3RvcnlJbnZva2UsIEJhc2VBdm1QcmltaXRpdmUpCisKKworLy8gUnVuIGZhbWlseQorQVZNX1BSSU1JVElWRV9SVU5fQ0xBU1MoSVJ1biwgQmFzZUF2bVByaW1pdGl2ZSkKKworQVZNX1BSSU1JVElWRV9SVU5fQ0xBU1MoUnVuLCBCYXNlQXZtUHJpbWl0aXZlKQorCitBVk1fUFJJTUlUSVZFX1JVTl9SRVNVTUVfQ0xBU1MoUnRjLCBCYXNlQXZtUHJpbWl0aXZlKQorCisKK0FWTV9QUklNSVRJVkVfUlVOX0NMQVNTKFNjaGVkdWxlSW52b2tlLCBCYXNlQXZtUHJpbWl0aXZlKQorCitBVk1fUFJJTUlUSVZFX0VWQUxfQ0xBU1MoU2NoZWR1bGVHZXQsIEJhc2VBdm1QcmltaXRpdmUpCisKK0FWTV9QUklNSVRJVkVfRVZBTF9DTEFTUyhTY2hlZHVsZUluLCBCYXNlQXZtUHJpbWl0aXZlKQorCitBVk1fUFJJTUlUSVZFX1JVTl9DTEFTUyhTY2hlZHVsZVNldCwgQmFzZUF2bVByaW1pdGl2ZSkKKworCitBVk1fUFJJTUlUSVZFX1JVTl9DTEFTUyhEZWZlckludm9rZSwgQmFzZUF2bVByaW1pdGl2ZSkKKworQVZNX1BSSU1JVElWRV9FVkFMX0NMQVNTKERlZmVyR2V0LCBCYXNlQXZtUHJpbWl0aXZlKQorCitBVk1fUFJJTUlUSVZFX1JVTl9DTEFTUyhEZWZlclNldCwgQmFzZUF2bVByaW1pdGl2ZSkKKworCitBVk1fUFJJTUlUSVZFX1JVTl9DTEFTUyhHb3RvLCBCYXNlQXZtUHJpbWl0aXZlKQorCisKK0FWTV9QUklNSVRJVkVfUlVOX0NMQVNTKEZvcmssIEJhc2VBdm1QcmltaXRpdmUpCisKK0FWTV9QUklNSVRJVkVfUlVOX0NMQVNTX0hFQURFUihKb2luLCBCYXNlQXZtUHJpbWl0aXZlKQorCWJvb2wgY2hlY2tzYXRKb2luKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WLCBjb25zdCBCRiAmIGFKb2luU3BlYyk7Citwcm90ZWN0ZWQ6CisJVmVjdG9yT2ZMaXN0T2ZBUEV4ZWN1dGlvbkRhdGEgdGFibGVPZldhaXRpbmdKb2luOworfTsKKworCitBVk1fUFJJTUlUSVZFX1JVTl9DTEFTUyhSZHYsIEJhc2VBdm1QcmltaXRpdmUpCisKKworCisKK30KKworI2VuZGlmIC8qIEFWTUFDVElWSVRZUFJJTUlUSVZFX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtQXNzaWduUHJpbWl0aXZlLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1Bc3NpZ25QcmltaXRpdmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYTRiZDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtQXNzaWduUHJpbWl0aXZlLmNwcApAQCAtMCwwICsxLDQ1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDIwIG1haSAyMDEwCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJBdm1Bc3NpZ25QcmltaXRpdmUuaCIKKworI2luY2x1ZGUgPGNvbXB1dGVyL0V2YWx1YXRpb25FbnZpcm9ubWVudC5oPgorI2luY2x1ZGUgPGNvbXB1dGVyL0V4ZWN1dGlvbkRhdGFGYWN0b3J5Lmg+CisjaW5jbHVkZSA8Y29tcHV0ZXIvRXhlY3V0aW9uRW52aXJvbm1lbnQuaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0F2bUNvZGUuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29uc3RydWN0b3IuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uU2ltcGxpZmllci5oPgorCisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yLmg+CisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yTWFuYWdlci5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uQ29uZmlndXJhdGlvbi5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkRhdGEuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lSUQuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBleGVjdXRpb24gb2YgYW4gQVNTSUdOIHByb2dyYW0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvLyBsdmFsdWUgPTogcnZhbHVlOyAgPT0+ICBbIGx2YWx1ZSAsIHJ2YWx1ZSBdCitib29sIEF2bVByaW1pdGl2ZV9Bc3NpZ25tZW50OjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CitBVk1fSUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX0FTU0lHTk1FTlQgKQorCUFWTV9PU19UUkFDRSA8PCAibHZhbHVlOj4+ICIKKwkJCTw8IHN0cl9oZWFkZXIoIEVOVi5tQVJHLT5hdCgwKS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSApCisJCQk8PCBzdGQ6OmVuZGwKKwkJCTw8ICJydmFsdWU6Pj4gIiA8PCBFTlYubUFSRy0+YXQoMSkuc3RyKCkKKwkJCTw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfQVNTSUdOTUVOVCApCisKKwlpZiggRU5WLnNldFJ2YWx1ZShFTlYubUFSRy0+b3V0RUQsCisJCQlFTlYubUFSRy0+YXQoMCkudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCksIEVOVi5tQVJHLT5hdCgxKSkgKQorCXsKKwkJRU5WLmFwcGVuZE91dHB1dCggRU5WLm1BUkctPm91dEVEICk7CisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKKy8vIGx2YWx1ZSA9OiBydmFsdWU7ICA9PT4gIFsgbHZhbHVlICwgcnZhbHVlIF0KKworYm9vbCBBdm1QcmltaXRpdmVfQXNzaWdubWVudDo6c2V2YWwoRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WKQoreworQVZNX0lGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9BU1NJR05NRU5UICkKKwlBVk1fT1NfVFJBQ0UgPDwgImx2YWx1ZTo+ICIKKwkJCTw8IHN0cl9oZWFkZXIoIEVOVi5tQVJHLT5hdCgwKS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSApCisJCQk8PCBzdGQ6OmVuZGwKKwkJCTw8ICJydmFsdWU6PiAiIDw8IEVOVi5tQVJHLT5hdCgxKS5zdHIoKQorCQkJPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9BU1NJR05NRU5UICkKKworCWlmKCBFTlYuc2V0UnZhbHVlKEVOVi5tQVJHLT5vdXRFRCwKKwkJCUVOVi5tQVJHLT5hdCgwKS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSwgRU5WLm1BUkctPmF0KDEpKSApCisJeworCQlFTlYub3V0RUQgPSBFTlYubUFSRy0+b3V0RUQ7CisJCUVOVi5vdXRWQUwgPSBFTlYubUFSRy0+YXQoMSk7CisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXhlY3V0aW9uIG9mIGFuIEFTU0lHTiBSREVDUiBwcm9ncmFtCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLy8gbHZhbHVlID06IHJ2YWx1ZTsgID09PiAgWyBsdmFsdWUgLCBydmFsdWUgXQorYm9vbCBBdm1QcmltaXRpdmVfQXNzaWdubWVudEFmdGVyOjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CitBVk1fSUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX0FTU0lHTk1FTlQgKQorCUFWTV9PU19UUkFDRSA8PCAibHZhbHVlOj4+ICIKKwkJCTw8IHN0cl9oZWFkZXIoIEVOVi5tQVJHLT5hdCgwKS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSApCisJCQk8PCBzdGQ6OmVuZGwKKwkJCTw8ICJydmFsdWU6Pj4gIiA8PCBFTlYubUFSRy0+YXQoMSkuc3RyKCkKKwkJCTw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfQVNTSUdOTUVOVCApCisKKwlpZiggRU5WLnNldFJ2YWx1ZShFTlYubUFSRy0+b3V0RUQsCisJCQlFTlYubUFSRy0+YXQoMCkudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCksIEVOVi5tQVJHLT5hdCgxKSkgKQorCXsKKwkJRU5WLmFwcGVuZE91dHB1dCggRU5WLm1BUkctPm91dEVEICk7CisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKKy8vIGx2YWx1ZSA9OiBydmFsdWU7ICA9PT4gIFsgbHZhbHVlICwgcnZhbHVlIF0KK2Jvb2wgQXZtUHJpbWl0aXZlX0Fzc2lnbm1lbnRBZnRlcjo6c2V2YWwoRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WKQoreworQVZNX0lGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9BU1NJR05NRU5UICkKKwlBVk1fT1NfVFJBQ0UgPDwgImx2YWx1ZTo+ICIKKwkJCTw8IHN0cl9oZWFkZXIoIEVOVi5tQVJHLT5hdCgwKS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSApCisJCQk8PCBzdGQ6OmVuZGwKKwkJCTw8ICJydmFsdWU6PiAiIDw8IEVOVi5tQVJHLT5hdCgyKS5zdHIoKQorCQkJPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9BU1NJR05NRU5UICkKKworCUVOVi5vdXRWQUwgPSBFTlYubUFSRy0+YXQoMSk7CisKKwlpZiggRU5WLnNldFJ2YWx1ZShFTlYubUFSRy0+b3V0RUQsCisJCQlFTlYubUFSRy0+YXQoMCkudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCksIEVOVi5tQVJHLT5hdCgyKSkgKQorCXsKKwkJRU5WLm91dEVEID0gRU5WLm1BUkctPm91dEVEOworCisJCXJldHVybiggdHJ1ZSApOworCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKworCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXhlY3V0aW9uIG9mIGFuIEFTU0lHTiBSREVDUiBwcm9ncmFtCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLy8gbHZhbHVlID06IG9wIHJ2YWx1ZTsgID09PiAgWyBsdmFsdWUgLCAoVkFMW2x2YWx1ZV0gb3AgcnZhbHVlKSBdCitib29sIEF2bVByaW1pdGl2ZV9Bc3NpZ25tZW50T3BBZnRlcjo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworQVZNX0lGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9BU1NJR05NRU5UICkKKwlBVk1fT1NfVFJBQ0UgPDwgImx2YWx1ZTo+PiAiCisJCQk8PCBzdHJfaGVhZGVyKCBFTlYubUFSRy0+YXQoMCkudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCkgKQorCQkJPDwgc3RkOjplbmRsCisJCQk8PCAicnZhbHVlOj4+ICIgPDwgRU5WLm1BUkctPmF0KDEpLnN0cigpCisJCQk8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX0FTU0lHTk1FTlQgKQorCisJaWYoIEVOVi5zZXRSdmFsdWUoRU5WLm1BUkctPm91dEVELAorCQkJRU5WLm1BUkctPmF0KDApLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpLCBFTlYubUFSRy0+YXQoMSkpICkKKwl7CisvLworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKworLy8gbHZhbHVlID06IG9wIHJ2YWx1ZTsgID09PiAgWyBsdmFsdWUgLCBWQUxbbHZhbHVlXSAsIChWQUxbbHZhbHVlXSBvcCBydmFsdWUpIF0KK2Jvb2wgQXZtUHJpbWl0aXZlX0Fzc2lnbm1lbnRPcEFmdGVyOjpzZXZhbChFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CitBVk1fSUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX0FTU0lHTk1FTlQgKQorCUFWTV9PU19UUkFDRSA8PCAibHZhbHVlOj4gIgorCQkJPDwgc3RyX2hlYWRlciggRU5WLm1BUkctPmF0KDApLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpICkKKwkJCTw8IHN0ZDo6ZW5kbAorCQkJPDwgInJ2YWx1ZTo+ICIgPDwgRU5WLm1BUkctPmF0KDIpLnN0cigpCisJCQk8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX0FTU0lHTk1FTlQgKQorCisJRU5WLm91dFZBTCA9IEVOVi5tQVJHLT5hdCgxKTsKKworCWlmKCBFTlYuc2V0UnZhbHVlKEVOVi5tQVJHLT5vdXRFRCwKKwkJCUVOVi5tQVJHLT5hdCgwKS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSwgRU5WLm1BUkctPmF0KDIpKSApCisJeworCQlFTlYub3V0RUQgPSBFTlYubUFSRy0+b3V0RUQ7CisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBleGVjdXRpb24gb2YgYW4gQVNTSUdOIFJFRkVSRU5DRSBwcm9ncmFtCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK2Jvb2wgQXZtUHJpbWl0aXZlX0Fzc2lnbm1lbnRSZWY6OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKK0FWTV9JRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfQVNTSUdOTUVOVCApCisJQVZNX09TX1RSQUNFIDw8ICJsdmFsdWU6Pj4gIgorCQkJPDwgc3RyX2hlYWRlciggRU5WLm1BUkctPmF0KDApLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpICkKKwkJCTw8IHN0ZDo6ZW5kbAorCQkJPDwgInJ2YWx1ZTpsdmFsdWU+PiAiIDw8IEVOVi5tQVJHLT5hdCgxKS5zdHIoKQorCQkJPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9BU1NJR05NRU5UICkKKworCWlmKCBFTlYuc2V0UnZhbHVlKEVOVi5tQVJHLT5vdXRFRCwKKwkJCUVOVi5tQVJHLT5hdCgwKS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSwgRU5WLm1BUkctPmF0KDEpKSApCisJeworCQlFTlYuYXBwZW5kT3V0cHV0KCBFTlYubUFSRy0+b3V0RUQgKTsKKworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKworYm9vbCBBdm1QcmltaXRpdmVfQXNzaWdubWVudFJlZjo6c2V2YWwoRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WKQoreworQVZNX0lGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9BU1NJR05NRU5UICkKKwlBVk1fT1NfVFJBQ0UgPDwgImx2YWx1ZTo+ICIKKwkJCTw8IHN0cl9oZWFkZXIoIEVOVi5tQVJHLT5hdCgwKS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSApCisJCQk8PCBzdGQ6OmVuZGwKKwkJCTw8ICJydmFsdWU6bHZhbHVlPj4gIiA8PCBFTlYubUFSRy0+YXQoMSkuc3RyKCkKKwkJCTw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfQVNTSUdOTUVOVCApCisKKwlpZiggRU5WLnNldFJ2YWx1ZShFTlYubUFSRy0+b3V0RUQsCisJCQlFTlYubUFSRy0+YXQoMCkudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCksIEVOVi5tQVJHLT5hdCgxKSkgKQorCXsKKwkJRU5WLm91dEVEID0gRU5WLm1BUkctPm91dEVEOworCQlFTlYub3V0VkFMID0gRU5WLm1BUkctPmF0KDEpOworCisJCXJldHVybiggdHJ1ZSApOworCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKworCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXhlY3V0aW9uIG9mIGFuIEFTU0lHTiBNQUNSTyBwcm9ncmFtCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK2Jvb2wgQXZtUHJpbWl0aXZlX0Fzc2lnbm1lbnRNYWNybzo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworQVZNX0lGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9BU1NJR05NRU5UICkKKwlBVk1fT1NfVFJBQ0UgPDwgImx2YWx1ZTo+PiAiCisJCQk8PCBzdHJfaGVhZGVyKCBFTlYubUFSRy0+YXQoMCkudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCkgKQorCQkJPDwgc3RkOjplbmRsCisJCQk8PCAicnZhbHVlPj4gIiA8PCBFTlYubUFSRy0+YXQoMSkuc3RyKCkKKwkJCTw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfQVNTSUdOTUVOVCApCisKKwlpZiggRU5WLnNldFJ2YWx1ZShFTlYubUFSRy0+b3V0RUQsCisJCQlFTlYubUFSRy0+YXQoMCkudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCksIEVOVi5tQVJHLT5hdCgxKSkgKQorCXsKKwkJRU5WLmFwcGVuZE91dHB1dCggRU5WLm1BUkctPm91dEVEICk7CisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKK2Jvb2wgQXZtUHJpbWl0aXZlX0Fzc2lnbm1lbnRNYWNybzo6c2V2YWwoRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WKQoreworQVZNX0lGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9BU1NJR05NRU5UICkKKwlBVk1fT1NfVFJBQ0UgPDwgImx2YWx1ZTo+ICIKKwkJCTw8IHN0cl9oZWFkZXIoIEVOVi5tQVJHLT5hdCgwKS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSApCisJCQk8PCBzdGQ6OmVuZGwKKwkJCTw8ICJydmFsdWU+PiAiIDw8IEVOVi5tQVJHLT5hdCgxKS5zdHIoKQorCQkJPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9BU1NJR05NRU5UICkKKworCWlmKCBFTlYuc2V0UnZhbHVlKEVOVi5tQVJHLT5vdXRFRCwKKwkJCUVOVi5tQVJHLT5hdCgwKS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSwgRU5WLm1BUkctPmF0KDEpKSApCisJeworCQlFTlYub3V0RUQgPSBFTlYubUFSRy0+b3V0RUQ7CisJCUVOVi5vdXRWQUwgPSBFTlYubUFSRy0+YXQoMSk7CisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV4ZWN1dGlvbiBvZiBhbiBORVcgRlJFU0ggcHJvZ3JhbQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitib29sIEF2bVByaW1pdGl2ZV9Bc3NpZ25OZXdGcmVzaDo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCUJGTGlzdCBwYXJhbUxpc3Q7CisJQkYgYU5ld1N5bWJvbGljQ29uc3RhbnQgPSBFTlYuY3JlYXRlTmV3RnJlc2hQYXJhbShFTlYubUFSRy0+b3V0RUQtPm1SSUQsCisJCQlFTlYubUFSRy0+YXQoMCkudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCksIHBhcmFtTGlzdCApOworCitBVk1fSUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX0FTU0lHTk1FTlQgKQorCUFWTV9PU19UUkFDRSA8PCAibHZhbHVlOj4+ICIKKwkJCTw8IHN0cl9oZWFkZXIoIEVOVi5tQVJHLT5hdCgwKS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSApCisJCQk8PCBzdGQ6OmVuZGwKKwkJCTw8ICJydmFsdWU6Pj4gIiA8PCBhTmV3U3ltYm9saWNDb25zdGFudC5zdHIoKQorCQkJPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9BU1NJR05NRU5UICkKKworCWlmKCBFTlYuc2V0UnZhbHVlKEVOVi5tQVJHLT5vdXRFRCwKKwkJCUVOVi5tQVJHLT5hdCgwKS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSwgYU5ld1N5bWJvbGljQ29uc3RhbnQpICkKKwl7CisJCUV4ZWN1dGlvbkRhdGFGYWN0b3J5OjphcHBlbmRJT0VsZW1lbnRUcmFjZShFTlYubUFSRy0+b3V0RUQsCisJCQkJQkYobmV3IEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24oRU5WLm1BUkctPm91dEVELT5tUklELAorCQkJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQVNTSUdOX05FV0ZSRVNILAorCQkJCQkJCQlFTlYubUFSRy0+YXQoMCksIGFOZXdTeW1ib2xpY0NvbnN0YW50KSkpKTsKKworCQlFTlYubUFSRy0+b3V0RUQuYXBwZW5kUGFyYW1ldGVycyggcGFyYW1MaXN0ICk7CisKKwkJRU5WLmFwcGVuZE91dHB1dCggRU5WLm1BUkctPm91dEVEICk7CisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKK2Jvb2wgQXZtUHJpbWl0aXZlX0Fzc2lnbk5ld0ZyZXNoOjpzZXZhbChFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJQkZMaXN0IHBhcmFtTGlzdDsKKwlCRiBhTmV3U3ltYm9saWNDb25zdGFudCA9IEVOVi5jcmVhdGVOZXdGcmVzaFBhcmFtKEVOVi5tQVJHLT5vdXRFRC0+bVJJRCwKKwkJCUVOVi5tQVJHLT5hdCgwKS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSwgcGFyYW1MaXN0ICk7CisKK0FWTV9JRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfQVNTSUdOTUVOVCApCisJQVZNX09TX1RSQUNFIDw8ICJsdmFsdWU6Pj4gIgorCQkJPDwgc3RyX2hlYWRlciggRU5WLm1BUkctPmF0KDApLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpICkKKwkJCTw8IHN0ZDo6ZW5kbAorCQkJPDwgInJ2YWx1ZTo+PiAiIDw8IGFOZXdTeW1ib2xpY0NvbnN0YW50LnN0cigpCisJCQk8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX0FTU0lHTk1FTlQgKQorCisJaWYoIEVOVi5zZXRSdmFsdWUoRU5WLm1BUkctPm91dEVELAorCQkJRU5WLm1BUkctPmF0KDApLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpLCBhTmV3U3ltYm9saWNDb25zdGFudCkgKQorCXsKKwkJRU5WLm91dFZBTCA9IGFOZXdTeW1ib2xpY0NvbnN0YW50OworCisJCUV4ZWN1dGlvbkRhdGFGYWN0b3J5OjphcHBlbmRJT0VsZW1lbnRUcmFjZShFTlYubUFSRy0+b3V0RUQsCisJCQkJQkYobmV3IEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24oRU5WLm1BUkctPm91dEVELT5tUklELAorCQkJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQVNTSUdOX05FV0ZSRVNILAorCQkJCQkJCQlFTlYubUFSRy0+YXQoMCksIGFOZXdTeW1ib2xpY0NvbnN0YW50KSkpKTsKKworCQlFTlYubUFSRy0+b3V0RUQuYXBwZW5kUGFyYW1ldGVycyggcGFyYW1MaXN0ICk7CisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBleGVjdXRpb24gb2YgYW4gUkVTRVQgcHJvZ3JhbQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitib29sIEF2bVByaW1pdGl2ZV9Bc3NpZ25SZXNldDo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCUJGTGlzdCBwYXJhbUxpc3Q7CisJQkYgYU5ld1N5bWJvbGljQ29uc3RhbnQgPSBFTlYuY3JlYXRlTmV3RnJlc2hQYXJhbShFTlYubUFSRy0+b3V0RUQtPm1SSUQsCisJCQlFTlYubUFSRy0+YXQoMCkudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCksIHBhcmFtTGlzdCApOworCitBVk1fSUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX0FTU0lHTk1FTlQgKQorCUFWTV9PU19UUkFDRSA8PCAibHZhbHVlOj4+ICIKKwkJCTw8IHN0cl9oZWFkZXIoIEVOVi5tQVJHLT5hdCgwKS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSApCisJCQk8PCBzdGQ6OmVuZGwKKwkJCTw8ICJydmFsdWU6Pj4gIiA8PCBhTmV3U3ltYm9saWNDb25zdGFudC5zdHIoKQorCQkJPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9BU1NJR05NRU5UICkKKworCWlmKCBFTlYuc2V0UnZhbHVlKEVOVi5tQVJHLT5vdXRFRCwKKwkJCUVOVi5tQVJHLT5hdCgwKS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSwgYU5ld1N5bWJvbGljQ29uc3RhbnQpICkKKwl7CisJCUV4ZWN1dGlvbkRhdGFGYWN0b3J5OjphcHBlbmRJT0VsZW1lbnRUcmFjZShFTlYubUFSRy0+b3V0RUQsCisJCQkJQkYobmV3IEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24oRU5WLm1BUkctPm91dEVELT5tUklELAorCQkJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQVNTSUdOX1JFU0VULAorCQkJCQkJCQlFTlYubUFSRy0+YXQoMCksIGFOZXdTeW1ib2xpY0NvbnN0YW50KSkpKTsKKworCQlFTlYubUFSRy0+b3V0RUQuYXBwZW5kUGFyYW1ldGVycyggcGFyYW1MaXN0ICk7CisKKwkJRU5WLmFwcGVuZE91dHB1dCggRU5WLm1BUkctPm91dEVEICk7CisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKK2Jvb2wgQXZtUHJpbWl0aXZlX0Fzc2lnblJlc2V0OjpzZXZhbChFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJQkZMaXN0IHBhcmFtTGlzdDsKKwlCRiBhTmV3U3ltYm9saWNDb25zdGFudCA9IEVOVi5jcmVhdGVOZXdGcmVzaFBhcmFtKEVOVi5tQVJHLT5vdXRFRC0+bVJJRCwKKwkJCUVOVi5tQVJHLT5hdCgwKS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSwgcGFyYW1MaXN0ICk7CisKK0FWTV9JRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfQVNTSUdOTUVOVCApCisJQVZNX09TX1RSQUNFIDw8ICJsdmFsdWU6Pj4gIgorCQkJPDwgc3RyX2hlYWRlciggRU5WLm1BUkctPmF0KDApLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpICkKKwkJCTw8IHN0ZDo6ZW5kbDw8ICJydmFsdWU6Pj4gIiA8PCBhTmV3U3ltYm9saWNDb25zdGFudC5zdHIoKQorCQkJPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9BU1NJR05NRU5UICkKKworCWlmKCBFTlYuc2V0UnZhbHVlKEVOVi5tQVJHLT5vdXRFRCwKKwkJCUVOVi5tQVJHLT5hdCgwKS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSwgYU5ld1N5bWJvbGljQ29uc3RhbnQpICkKKwl7CisJCUVOVi5vdXRWQUwgPSBhTmV3U3ltYm9saWNDb25zdGFudDsKKworCQlFeGVjdXRpb25EYXRhRmFjdG9yeTo6YXBwZW5kSU9FbGVtZW50VHJhY2UoRU5WLm1BUkctPm91dEVELAorCQkJCUJGKG5ldyBFeGVjdXRpb25Db25maWd1cmF0aW9uKEVOVi5tQVJHLT5vdXRFRC0+bVJJRCwKKwkJCQkJCVN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FTU0lHTl9SRVNFVCwKKwkJCQkJCQkJRU5WLm1BUkctPmF0KDApLCBhTmV3U3ltYm9saWNDb25zdGFudCkpKSk7CisKKwkJRU5WLm1BUkctPm91dEVELmFwcGVuZFBhcmFtZXRlcnMoIHBhcmFtTGlzdCApOworCisJCXJldHVybiggdHJ1ZSApOworCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKworCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1Bc3NpZ25QcmltaXRpdmUuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1Bc3NpZ25QcmltaXRpdmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWVkMjA0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bUFzc2lnblByaW1pdGl2ZS5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyMCBtYWkgMjAxMAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEFWTUFTU0lHTlBSSU1JVElWRV9IXworI2RlZmluZSBBVk1BU1NJR05QUklNSVRJVkVfSF8KKworI2luY2x1ZGUgPGNvbXB1dGVyL3ByaW1pdGl2ZS9CYXNlQXZtUHJpbWl0aXZlLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK0FWTV9QUklNSVRJVkVfUlVOX0VWQUxfQ0xBU1MoQXNzaWdubWVudCwgQmFzZUF2bVByaW1pdGl2ZSkKKworLy9BVk1fUFJJTUlUSVZFX1JVTl9FVkFMX0NMQVNTKEFzc2lnbm1lbnRPciwgQmFzZUF2bVByaW1pdGl2ZSkKKworQVZNX1BSSU1JVElWRV9SVU5fRVZBTF9DTEFTUyhBc3NpZ25tZW50QWZ0ZXIsIEJhc2VBdm1QcmltaXRpdmUpCisKK0FWTV9QUklNSVRJVkVfUlVOX0VWQUxfQ0xBU1MoQXNzaWdubWVudE9wQWZ0ZXIsIEJhc2VBdm1QcmltaXRpdmUpCisKKworQVZNX1BSSU1JVElWRV9SVU5fRVZBTF9DTEFTUyhBc3NpZ25tZW50UmVmLCBCYXNlQXZtUHJpbWl0aXZlKQorCitBVk1fUFJJTUlUSVZFX1JVTl9FVkFMX0NMQVNTKEFzc2lnbm1lbnRNYWNybywgQmFzZUF2bVByaW1pdGl2ZSkKKworCitBVk1fUFJJTUlUSVZFX1JVTl9FVkFMX0NMQVNTKEFzc2lnbk5ld0ZyZXNoLCBCYXNlQXZtUHJpbWl0aXZlKQorCitBVk1fUFJJTUlUSVZFX1JVTl9FVkFMX0NMQVNTKEFzc2lnblJlc2V0LCBCYXNlQXZtUHJpbWl0aXZlKQorCisKK30KKworI2VuZGlmIC8qIEFWTUFTU0lHTlBSSU1JVElWRV9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bUJhc2VDb25jdXJyZW5jeVByaW1pdGl2ZS5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtQmFzZUNvbmN1cnJlbmN5UHJpbWl0aXZlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzllZWU3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bUJhc2VDb25jdXJyZW5jeVByaW1pdGl2ZS5jcHAKQEAgLTAsMCArMSwxNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyMCBtYWkgMjAxMAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQXZtQmFzZUNvbmN1cnJlbmN5UHJpbWl0aXZlLmgiCisKKyNpbmNsdWRlIDxjb21wdXRlci9QYXRoQ29uZGl0aW9uUHJvY2Vzc29yLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9Bdm1Db2RlLmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkNvbnN0cnVjdG9yLmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvblNpbXBsaWZpZXIuaD4KKworI2luY2x1ZGUgPGZtbC9vcGVyYXRvci9PcGVyYXRvck1hbmFnZXIuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkRhdGEuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lSUQuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEVWQUwgRVhDTFVTSVZFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworCisvLyBDb21wdXRlIEVWQUwgd2hlcmUgTk9UIE9USEVSCitib29sIEF2bUJhc2VDb25jdXJyZW5jeVByaW1pdGl2ZTo6ZXZhbEV4Y2x1c2l2ZShBUEV4ZWN1dGlvbkRhdGEgJiBhbklucHV0RUQsCisJCUFQRXhlY3V0aW9uRGF0YSAmIGV2YWxFRCwgQVBFeGVjdXRpb25EYXRhICYgb3RoZXJFRCwKKwkJQ29sbGVjdGlvbk9mQVBFeGVjdXRpb25EYXRhICYgbGlzdE9mT3V0cHV0RUQpCit7CisJQkYgdGhlTm9kZUNvbmRpdGlvbiA9IG90aGVyRUQtPmdldE5vZGVDb25kaXRpb24oKTsKKworCWlmKCB0aGVOb2RlQ29uZGl0aW9uLmlzRXF1YWxUcnVlKCkgKQorCXsKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKwllbHNlIGlmKCB0aGVOb2RlQ29uZGl0aW9uLmlzRXF1YWxGYWxzZSgpICkKKwl7CisJCWxpc3RPZk91dHB1dEVELmFwcGVuZCggZXZhbEVEICk7CisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCWVsc2UKKwl7CisJCXRoZU5vZGVDb25kaXRpb24gPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5vdEV4cHIodGhlTm9kZUNvbmRpdGlvbik7CisKKwkJcmV0dXJuKCBQYXRoQ29uZGl0aW9uUHJvY2Vzc29yOjphcHBlbmRQYXRoQ29uZGl0aW9uKAorCQkJCWV2YWxFRCwgdGhlTm9kZUNvbmRpdGlvbiwgbGlzdE9mT3V0cHV0RUQpICk7CisJfQorfQorCisKKy8vIENvbXB1dGUgRVZBTCB3aGVyZSBOT1QgT1RIRVJTCitib29sIEF2bUJhc2VDb25jdXJyZW5jeVByaW1pdGl2ZTo6ZXZhbEV4Y2x1c2l2ZShBUEV4ZWN1dGlvbkRhdGEgJiBhbklucHV0RUQsCisJCUFQRXhlY3V0aW9uRGF0YSAmIGV2YWxFRCwgTGlzdE9mQVBFeGVjdXRpb25EYXRhICYgbGlzdE9mT3RoZXJFRCwKKwkJQ29sbGVjdGlvbk9mQVBFeGVjdXRpb25EYXRhICYgbGlzdE9mT3V0cHV0RUQpCit7CisJaWYoIGxpc3RPZk90aGVyRUQuZW1wdHkoKSApCisJeworCQlsaXN0T2ZPdXRwdXRFRC5hcHBlbmQoIGV2YWxFRCApOworCisJCXJldHVybiggdHJ1ZSApOworCX0KKworCWVsc2UgaWYoIGxpc3RPZk90aGVyRUQuc2luZ2xldG9uKCkgKQorCXsKKwkJcmV0dXJuKCBldmFsRXhjbHVzaXZlKGFuSW5wdXRFRCwgZXZhbEVELAorCQkJCWxpc3RPZk90aGVyRUQubGFzdCgpLCBsaXN0T2ZPdXRwdXRFRCkgKTsKKwl9CisKKwllbHNlCisJeworCQlCRkNvZGUgdGhlTm9kZUNvbmRpdGlvbnMoT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9PUik7CisKKwkJTGlzdE9mQVBFeGVjdXRpb25EYXRhOjppdGVyYXRvciBpdCA9IGxpc3RPZk90aGVyRUQuYmVnaW4oKTsKKwkJTGlzdE9mQVBFeGVjdXRpb25EYXRhOjppdGVyYXRvciBpdEVuZCA9IGxpc3RPZk90aGVyRUQuZW5kKCk7CisJCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQorCQl7CisJCQl0aGVOb2RlQ29uZGl0aW9ucy0+YXBwZW5kKCAoKml0KS0+Z2V0Tm9kZUNvbmRpdGlvbigpICk7CisJCX0KKworCQlCRiB0aGVOb2RlQ29uZGl0aW9uID0KKwkJCQlFeHByZXNzaW9uU2ltcGxpZmllcjo6c2ltcGxpZiggdGhlTm9kZUNvbmRpdGlvbnMgKTsKKworCisJCWlmKCB0aGVOb2RlQ29uZGl0aW9uLmlzRXF1YWxUcnVlKCkgKQorCQl7CisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKwkJZWxzZSBpZiggdGhlTm9kZUNvbmRpdGlvbi5pc0VxdWFsRmFsc2UoKSApCisJCXsKKwkJCWxpc3RPZk91dHB1dEVELmFwcGVuZCggZXZhbEVEICk7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisJCWVsc2UKKwkJeworCQkJdGhlTm9kZUNvbmRpdGlvbiA9CisJCQkJCUV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bm90RXhwcih0aGVOb2RlQ29uZGl0aW9uKTsKKworCQkJcmV0dXJuKCBQYXRoQ29uZGl0aW9uUHJvY2Vzc29yOjphcHBlbmRQYXRoQ29uZGl0aW9uKAorCQkJCQlldmFsRUQsIHRoZU5vZGVDb25kaXRpb24sIGxpc3RPZk91dHB1dEVEKSApOworCQl9CisJfQorfQorCisKK2Jvb2wgQXZtQmFzZUNvbmN1cnJlbmN5UHJpbWl0aXZlOjpldmFsRXhjbHVzaXZlKEFQRXhlY3V0aW9uRGF0YSAmIGFuSW5wdXRFRCwKKwkJTGlzdE9mQVBFeGVjdXRpb25EYXRhICYgb25lTGlzdE9mRUQsIEFQRXhlY3V0aW9uRGF0YSAmIG90aGVyRUQsCisJCUNvbGxlY3Rpb25PZkFQRXhlY3V0aW9uRGF0YSAmIGxpc3RPZk91dHB1dEVEKQoreworCUxpc3RPZkFQRXhlY3V0aW9uRGF0YTo6aXRlcmF0b3IgaXRPbmU7CisJTGlzdE9mQVBFeGVjdXRpb25EYXRhOjppdGVyYXRvciBlbmRPbmUgPSBvbmVMaXN0T2ZFRC5lbmQoKTsKKworCS8vIENvbXB1dGUgT1RIRVIgd2hlcmUgTk9UIE9ORQorCWZvciggaXRPbmUgPSBvbmVMaXN0T2ZFRC5iZWdpbigpIDsgaXRPbmUgIT0gZW5kT25lIDsgKytpdE9uZSApCisJeworCQlpZiggbm90IGV2YWxFeGNsdXNpdmUoYW5JbnB1dEVELCAqaXRPbmUsIG90aGVyRUQsIGxpc3RPZk91dHB1dEVEKSApCisJCXsKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bUJhc2VDb25jdXJyZW5jeVByaW1pdGl2ZS5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bUJhc2VDb25jdXJyZW5jeVByaW1pdGl2ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YWJlYTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtQmFzZUNvbmN1cnJlbmN5UHJpbWl0aXZlLmgKQEAgLTAsMCArMSw0MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDIwIG1haSAyMDEwCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQVZNQkFTRVNDSEVEVUxJTkdQUklNSVRJVkVfSF8KKyNkZWZpbmUgQVZNQkFTRVNDSEVEVUxJTkdQUklNSVRJVkVfSF8KKworI2luY2x1ZGUgPGNvbXB1dGVyL3ByaW1pdGl2ZS9CYXNlQXZtUHJpbWl0aXZlLmg+CisKKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25EYXRhLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCitBVk1fUFJJTUlUSVZFX0NMQVNTX0hFQURFUihBdm1CYXNlQ29uY3VycmVuY3lQcmltaXRpdmUsIEJhc2VBdm1QcmltaXRpdmUpCisKKwlib29sIGV2YWxFeGNsdXNpdmUoQVBFeGVjdXRpb25EYXRhICYgYW5JbnB1dEVELCBBUEV4ZWN1dGlvbkRhdGEgJiBldmFsRUQsCisJCQlBUEV4ZWN1dGlvbkRhdGEgJiBvdGhlckVELCBDb2xsZWN0aW9uT2ZBUEV4ZWN1dGlvbkRhdGEgJiBsaXN0T2ZPdXRwdXRFRCk7CisKKwlib29sIGV2YWxFeGNsdXNpdmUoQVBFeGVjdXRpb25EYXRhICYgYW5JbnB1dEVELCBBUEV4ZWN1dGlvbkRhdGEgJiBldmFsRUQsCisJCQlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGEgJiBsaXN0T2ZPdGhlckVELCBDb2xsZWN0aW9uT2ZBUEV4ZWN1dGlvbkRhdGEgJiBsaXN0T2ZPdXRwdXRFRCk7CisKKwlib29sIGV2YWxFeGNsdXNpdmUoQVBFeGVjdXRpb25EYXRhICYgYW5JbnB1dEVELCBMaXN0T2ZBUEV4ZWN1dGlvbkRhdGEgJiBvbmVMaXN0T2ZFRCwKKwkJCUFQRXhlY3V0aW9uRGF0YSAmIG90aGVyRUQsIENvbGxlY3Rpb25PZkFQRXhlY3V0aW9uRGF0YSAmIGxpc3RPZk91dHB1dEVEKTsKKworfTsKKworCit9CisKKyNlbmRpZiAvKiBBVk1CQVNFU0NIRURVTElOR1BSSU1JVElWRV9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bUJpdHdpc2VQcmltaXRpdmUuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bUJpdHdpc2VQcmltaXRpdmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NGIxZGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtQml0d2lzZVByaW1pdGl2ZS5jcHAKQEAgLTAsMCArMSwzMDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyMCBtYWkgMjAxMAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQXZtQml0d2lzZVByaW1pdGl2ZS5oIgorCisjaW5jbHVkZSA8Y29tbW9uL0JGLmg+CisKKyNpbmNsdWRlIDxjb21wdXRlci9FdmFsdWF0aW9uRW52aXJvbm1lbnQuaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0F2bUNvZGUuaD4KKworI2luY2x1ZGUgPGZtbC9vcGVyYXRvci9PcGVyYXRvci5oPgorI2luY2x1ZGUgPGZtbC9vcGVyYXRvci9PcGVyYXRvck1hbmFnZXIuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLyBCSVRXSVNFIEZPUk1BVAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIElOVkFSSUFOVDo+IG9ubHkgPDwgc2Vjb25kID4+ICBjb3VsZCBiZSA8PCBudW1lcmljPGludGVnZXI+ID4+CisKK3N0YXRpYyB2b2lkIGZvcm10YXRCaXR3aXNlRXhwcmVzc2lvbihFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBFTlYsCisJCU9wZXJhdG9yICogb3AsIGNvbnN0IEJGICYgZmlyc3QsIGNvbnN0IEJGICYgc2Vjb25kKQoreworCWlmKCBzZWNvbmQuaXNJbnRlZ2VyKCkgJiYgZmlyc3QuaXM8IEF2bUNvZGUgPigpICYmCisJCQlmaXJzdC50b19wdHI8IEF2bUNvZGUgPigpLT5pc09wQ29kZShvcCkgJiYKKwkJCWZpcnN0LnRvX3B0cjwgQXZtQ29kZSA+KCktPnNlY29uZCgpLmlzSW50ZWdlcigpICkKKwl7CisJCUJGIGJyZXN1bHQ7CisJCXN3aXRjaCggb3AtPmdldEF2bU9wQ29kZSgpICkKKwkJeworCQkJY2FzZSBBVk1fT1BDT0RFX0JBTkQ6IC8vICh4ICYgbSApICYgbiAgPT0gIHggJiAobSAmIG4pCisJCQl7CisJCQkJYnJlc3VsdCA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3SW50ZWdlcihzZWNvbmQuaXNJbnRlZ2VyKCkgJgorCQkJCQkJZmlyc3QudG9fcHRyPCBBdm1Db2RlID4oKS0+c2Vjb25kKCkuaXNJbnRlZ2VyKCkpOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBBVk1fT1BDT0RFX0JPUjogLy8gKHggfCBtICkgfCBuICA9PSAgeCB8IChtIHwgbikKKwkJCXsKKwkJCQlicmVzdWx0ID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdJbnRlZ2VyKHNlY29uZC5pc0ludGVnZXIoKSB8CisJCQkJCQlmaXJzdC50b19wdHI8IEF2bUNvZGUgPigpLT5zZWNvbmQoKS5pc0ludGVnZXIoKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIEFWTV9PUENPREVfQlhPUjogLy8gKHggXiBtICkgXiBuICA9PSAgeCBeIChtIF4gbikKKwkJCXsKKwkJCQlicmVzdWx0ID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdJbnRlZ2VyKHNlY29uZC5pc0ludGVnZXIoKSBeCisJCQkJCQlmaXJzdC50b19wdHI8IEF2bUNvZGUgPigpLT5zZWNvbmQoKS5pc0ludGVnZXIoKSk7CisKKwkJCQlicmVhazsKKwkJCX0KKworCQkJY2FzZSBBVk1fT1BDT0RFX0xTSElGVDogLy8gKHggPDwgbSApIDw8IG4gID09ICB4IDw8IChtICsgbikKKwkJCWNhc2UgQVZNX09QQ09ERV9SU0hJRlQ6IC8vICh4ID4+IG0gKSA+PiBuICA9PSAgeCA+PiAobSArIG4pCisJCQl7CisJCQkJYnJlc3VsdCA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3SW50ZWdlcihzZWNvbmQuaXNJbnRlZ2VyKCkgKworCQkJCQkJZmlyc3QudG9fcHRyPCBBdm1Db2RlID4oKS0+c2Vjb25kKCkuaXNJbnRlZ2VyKCkpOworCisJCQkJYnJlYWs7CisJCQl9CisJCQlkZWZhdWx0IDoKKwkJCXsKKwkJCQlBVk1fT1NfRVhJVCggRkFJTEVEICkKKwkJCQkJCTw8ICJVbmV4cGVjdGVkIGEgYml0d2lzZSBvcGVyYXRpb24gPDwgIgorCQkJCQkJPDwgZmlyc3Quc3RyKCkgPDwgIiAiIDw8IG9wLT5nZXRVbnJlc3RyaWN0ZWROYW1lKCkKKwkJCQkJCTw8ICIgIiA8PCBzZWNvbmQuc3RyKCkgPDwgIiA+PiIKKwkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJRU5WLm91dFZBTCA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q29kZShvcCwKKwkJCQlmaXJzdC50b19wdHI8IEF2bUNvZGUgPigpLT5maXJzdCgpLCBicmVzdWx0KTsKKwl9CisJZWxzZQorCXsKKwkJRU5WLm91dFZBTCA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q29kZShvcCwgZmlyc3QsIHNlY29uZCk7CisJfQorCisvLwlFTlYub3V0VkFMID0gRU5WLmNyZWF0ZSgKKy8vCQkJRU5WLm91dEVELT5tUklELCBvcC0+Z2V0VW5yZXN0cmljdGVkTmFtZSgpLCBUeXBlTWFuYWdlcjo6SU5URUdFUiwgRU5WLm91dFZBTCk7Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vIEJJVFdJU0UgTk9UCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBBdm1QcmltaXRpdmVfQk5PVDo6c2V2YWwoRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCS8vIEFGQSA6IHNpIGxlIHBhcmFtZXRyZSBuZSBzZSByZWR1aXQgcGFzIGEgdW5lIHZhbGV1ciBudW1lcmlxdWUKKwkvLyBhbG9ycyBvbiBjcmVlIHVuZSBub3V2ZWxsZSB2YWxldXIgc3ltYm9saXF1ZSBCTk9UI24gYSBsYXF1ZWxsZSBvbiBhc3NvY2llCisJLy8gdW4gQXZtQ29kZSBjb3JyZXNwb25kYW50IGF1IEJOT1QgZGUgbGEgdmFsZXVyIHN5bWJvbGlxdWUKKworCWlmKCBFTlYubUFSRy0+YXQoMCkuaXNJbnRlZ2VyKCkgKQorCXsKKwkJLy8gTk9UIE9QRVJBVElPTgorCQlFTlYub3V0VkFMID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdJbnRlZ2VyKAorCQkJCX4gKEVOVi5tQVJHLT5hdCgwKS50b0ludGVnZXIoKSkgKTsKKwl9CisJZWxzZSBpZiggRU5WLm1BUkctPmF0KDApLmlzPCBBdm1Db2RlID4oKSAmJgorCQkJRU5WLm1BUkctPmF0KDApLnRvX3B0cjwgQXZtQ29kZSA+KCktPmlzT3BDb2RlKCBBVk1fT1BDT0RFX0JOT1QgKSApCisJeworCQlFTlYub3V0VkFMID0gRU5WLm1BUkctPmF0KDApLnRvX3B0cjwgQXZtQ29kZSA+KCktPmZpcnN0KCk7CisJfQorCWVsc2UKKwl7CisJCUVOVi5vdXRWQUwgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9CTk9ULCBFTlYubUFSRy0+YXQoMCkpOworLy8JCQlFTlYub3V0VkFMID0gRU5WLmNyZWF0ZShFTlYubUFSRy0+b3V0RUQtPm1SSUQsICJCTk9UIiwKKy8vCQkJCQlUeXBlTWFuYWdlcjo6SU5URUdFUiwgRU5WLm1BUkctPmF0KDApKTsKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gQklUV0lTRSBBTkQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIEF2bVByaW1pdGl2ZV9CQU5EOjpzZXZhbChFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJLy8gQUZBIDogc2kgbCfDqXZhbHVhdGlvbiBuZSBzZSByZWR1aXQgcGFzIGEgdW5lIHZhbGV1ciBudW1lcmlxdWUKKwkvLyBhbG9ycyBvbiBjcmVlIHVuZSBub3V2ZWxsZSB2YWxldXIgc3ltYm9saXF1ZSBCQU5EI24gYSBsYXF1ZWxsZQorCS8vIG9uIGFzc29jaWUgdW4gQXZtQ29kZSBjb3JyZXNwb25kYW50IGF1IEJBTkQgZGVzIHBhcmFtw6h0cmVzIMOpdmFsdcOpZXMKKworCWlmICggRU5WLm1BUkctPmF0KDApLmlzSW50ZWdlcigpICkKKwl7CisJCWlmICggRU5WLm1BUkctPmF0KDEpLmlzSW50ZWdlcigpICkKKwkJeworCQkJRU5WLm91dFZBTCA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3SW50ZWdlcigKKwkJCQkJRU5WLm1BUkctPmF0KDApLnRvSW50ZWdlcigpICYgRU5WLm1BUkctPmF0KDEpLnRvSW50ZWdlcigpICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlmb3JtdGF0Qml0d2lzZUV4cHJlc3Npb24oRU5WLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0JBTkQsCisJCQkJCUVOVi5tQVJHLT5hdCgxKSwgRU5WLm1BUkctPmF0KDApKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlmb3JtdGF0Qml0d2lzZUV4cHJlc3Npb24oRU5WLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0JBTkQsCisJCQkJRU5WLm1BUkctPmF0KDApLCBFTlYubUFSRy0+YXQoMSkpOworCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLyBCSVRXSVNFIE9SCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBBdm1QcmltaXRpdmVfQk9SOjpzZXZhbChFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJLy8gQUZBIDogc2kgbCfDqXZhbHVhdGlvbiBuZSBzZSByZWR1aXQgcGFzIGEgdW5lIHZhbGV1ciBudW1lcmlxdWUKKwkvLyBhbG9ycyBvbiBjcmVlIHVuZSBub3V2ZWxsZSB2YWxldXIgc3ltYm9saXF1ZSBCT1IjbiBhIGxhcXVlbGxlCisJLy8gb24gYXNzb2NpZSB1biBBdm1Db2RlIGNvcnJlc3BvbmRhbnQgYXUgQk9SIGRlcyBwYXJhbcOodHJlcyDDqXZhbHXDqWVzCisKKwlpZiAoIEVOVi5tQVJHLT5hdCgwKS5pc0ludGVnZXIoKSApCisJeworCQlpZiAoIEVOVi5tQVJHLT5hdCgxKS5pc0ludGVnZXIoKSApCisJCXsKKwkJCUVOVi5vdXRWQUwgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0ludGVnZXIoCisJCQkJCUVOVi5tQVJHLT5hdCgwKS50b0ludGVnZXIoKSB8IEVOVi5tQVJHLT5hdCgxKS50b0ludGVnZXIoKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJZm9ybXRhdEJpdHdpc2VFeHByZXNzaW9uKEVOViwgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9CT1IsCisJCQkJCUVOVi5tQVJHLT5hdCgxKSwgRU5WLm1BUkctPmF0KDApKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlmb3JtdGF0Qml0d2lzZUV4cHJlc3Npb24oRU5WLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0JPUiwKKwkJCQlFTlYubUFSRy0+YXQoMCksIEVOVi5tQVJHLT5hdCgxKSk7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vIEJJVFdJU0UgWE9SCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBBdm1QcmltaXRpdmVfQlhPUjo6c2V2YWwoRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCS8vIEFGQSA6IHNpIGwnw6l2YWx1YXRpb24gbmUgc2UgcmVkdWl0IHBhcyBhIHVuZSB2YWxldXIgbnVtZXJpcXVlCisJLy8gYWxvcnMgb24gY3JlZSB1bmUgbm91dmVsbGUgdmFsZXVyIHN5bWJvbGlxdWUgQlhPUiNuIGEgbGFxdWVsbGUKKwkvLyBvbiBhc3NvY2llIHVuIEF2bUNvZGUgY29ycmVzcG9uZGFudCBhdSBCWE9SIGRlcyBwYXJhbcOodHJlcyDDqXZhbHXDqWVzCisKKwlpZiAoIEVOVi5tQVJHLT5hdCgwKS5pc0ludGVnZXIoKSApCisJeworCQlpZiAoIEVOVi5tQVJHLT5hdCgxKS5pc0ludGVnZXIoKSApCisJCXsKKwkJCUVOVi5vdXRWQUwgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0ludGVnZXIoCisJCQkJCUVOVi5tQVJHLT5hdCgwKS50b0ludGVnZXIoKSBeIEVOVi5tQVJHLT5hdCgxKS50b0ludGVnZXIoKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJZm9ybXRhdEJpdHdpc2VFeHByZXNzaW9uKEVOViwgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9CWE9SLAorCQkJCQlFTlYubUFSRy0+YXQoMSksIEVOVi5tQVJHLT5hdCgwKSk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJZm9ybXRhdEJpdHdpc2VFeHByZXNzaW9uKEVOViwgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9CWE9SLAorCQkJCUVOVi5tQVJHLT5hdCgwKSwgRU5WLm1BUkctPmF0KDEpKTsKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gQklUV0lTRSBMU0hJRlQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIEF2bVByaW1pdGl2ZV9MU0hJRlQ6OnNldmFsKEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwkvLyBBRkEgOiBzaSBsJ8OpdmFsdWF0aW9uIG5lIHNlIHJlZHVpdCBwYXMgYSB1bmUgdmFsZXVyIG51bWVyaXF1ZQorCS8vIGFsb3JzIG9uIGNyZWUgdW5lIG5vdXZlbGxlIHZhbGV1ciBzeW1ib2xpcXVlIExTSElGVCNuIGEgbGFxdWVsbGUKKwkvLyBvbiBhc3NvY2llIHVuIEF2bUNvZGUgY29ycmVzcG9uZGFudCBhdSBMU0hJRlQgZGVzIHBhcmFtw6h0cmVzIMOpdmFsdcOpZXMKKworCWlmICggRU5WLm1BUkctPmF0KDApLmlzSW50ZWdlcigpICYmIEVOVi5tQVJHLT5hdCgxKS5pc0ludGVnZXIoKSApCisJeworCQlFTlYub3V0VkFMID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdJbnRlZ2VyKAorCQkJCUVOVi5tQVJHLT5hdCgwKS50b0ludGVnZXIoKSA8PCBFTlYubUFSRy0+YXQoMSkudG9JbnRlZ2VyKCkgKTsKKwl9CisJZWxzZQorCXsKKwkJZm9ybXRhdEJpdHdpc2VFeHByZXNzaW9uKEVOViwgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9MU0hJRlQsCisJCQkJRU5WLm1BUkctPmF0KDApLCBFTlYubUFSRy0+YXQoMSkpOworCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gQklUV0lTRSBSU0hJRlQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIEF2bVByaW1pdGl2ZV9SU0hJRlQ6OnNldmFsKEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwkvLyBBRkEgOiBzaSBsJ8OpdmFsdWF0aW9uIG5lIHNlIHJlZHVpdCBwYXMgYSB1bmUgdmFsZXVyIG51bWVyaXF1ZQorCS8vIGFsb3JzIG9uIGNyZWUgdW5lIG5vdXZlbGxlIHZhbGV1ciBzeW1ib2xpcXVlIFJTSElGVCNuIGEgbGFxdWVsbGUKKwkvLyBvbiBhc3NvY2llIHVuIEF2bUNvZGUgY29ycmVzcG9uZGFudCBhdSBSU0hJRlQgZGVzIHBhcmFtw6h0cmVzIMOpdmFsdcOpZXMKKworCWlmICggRU5WLm1BUkctPmF0KDApLmlzSW50ZWdlcigpICYmIEVOVi5tQVJHLT5hdCgxKS5pc0ludGVnZXIoKSApCisJeworCQlFTlYub3V0VkFMID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdJbnRlZ2VyKAorCQkJCUVOVi5tQVJHLT5hdCgwKS50b0ludGVnZXIoKSA+PiBFTlYubUFSRy0+YXQoMSkudG9JbnRlZ2VyKCkgKTsKKwl9CisJZWxzZQorCXsKKwkJZm9ybXRhdEJpdHdpc2VFeHByZXNzaW9uKEVOViwgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9SU0hJRlQsCisJCQkJRU5WLm1BUkctPmF0KDApLCBFTlYubUFSRy0+YXQoMSkpOworCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bUJpdHdpc2VQcmltaXRpdmUuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1CaXR3aXNlUHJpbWl0aXZlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAyYWI3NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1CaXR3aXNlUHJpbWl0aXZlLmgKQEAgLTAsMCArMSwzOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDIwIG1haSAyMDEwCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQVZNQklUV0lTRVBSSU1JVElWRV9IXworI2RlZmluZSBBVk1CSVRXSVNFUFJJTUlUSVZFX0hfCisKKyNpbmNsdWRlIDxjb21wdXRlci9wcmltaXRpdmUvQmFzZUF2bVByaW1pdGl2ZS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitBVk1fUFJJTUlUSVZFX0VWQUxfQ0xBU1MoQk5PVCwgICBCYXNlQXZtUHJpbWl0aXZlKQorCitBVk1fUFJJTUlUSVZFX0VWQUxfQ0xBU1MoQkFORCwgICBCYXNlQXZtUHJpbWl0aXZlKQorQVZNX1BSSU1JVElWRV9FVkFMX0NMQVNTKEJPUiwgICAgQmFzZUF2bVByaW1pdGl2ZSkKK0FWTV9QUklNSVRJVkVfRVZBTF9DTEFTUyhCWE9SLCAgIEJhc2VBdm1QcmltaXRpdmUpCisKK0FWTV9QUklNSVRJVkVfRVZBTF9DTEFTUyhMU0hJRlQsIEJhc2VBdm1QcmltaXRpdmUpCitBVk1fUFJJTUlUSVZFX0VWQUxfQ0xBU1MoUlNISUZULCBCYXNlQXZtUHJpbWl0aXZlKQorCisKKworfQorCisjZW5kaWYgLyogQVZNQklUV0lTRVBSSU1JVElWRV9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bUJ1ZmZlclByaW1pdGl2ZS5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtQnVmZmVyUHJpbWl0aXZlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTg2MjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bUJ1ZmZlclByaW1pdGl2ZS5jcHAKQEAgLTAsMCArMSwxMjE1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjUgamFudi4gMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQXZtQnVmZmVyUHJpbWl0aXZlLmgiCisKKyNpbmNsdWRlIDxjb21wdXRlci9FdmFsdWF0aW9uRW52aXJvbm1lbnQuaD4KKyNpbmNsdWRlIDxjb21wdXRlci9FeGVjdXRpb25EYXRhRmFjdG9yeS5oPgorI2luY2x1ZGUgPGNvbXB1dGVyL0V4ZWN1dGlvbkVudmlyb25tZW50Lmg+CisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mQnVmZmVyLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9Bdm1Db2RlLmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQnVpbHRpblF1ZXVlLmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkNvbnN0cnVjdG9yLmg+CisKKyNpbmNsdWRlIDxmbWwvcnVudGltZS9NZXNzYWdlLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gQlVGRkVSIEFQUEVORAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgQXZtUHJpbWl0aXZlX0FQUEVORDo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCWlmKCBFTlYubUFSRy0+YXQoMCkuaXM8IEJhc2VCdWZmZXJGb3JtID4oKSApCisJeworCQkvLyBnZXQgdGhlIG9wdGlvbmFsIHBvcnQgcGFyYW1ldGVyCisJCU1lc3NhZ2UgYU1zZzsKKwkJaWYoIEVOVi5tQVJHLT5hdCgxKS5pczwgTWVzc2FnZSA+KCkgKQorCQl7CisJCQlhTXNnID0gRU5WLm1BUkctPmF0KDEpOworCQl9CisJCWVsc2UKKwkJeworCQkJQkYgYVBvcnQ7CisJCQlpZiggRU5WLm1BUkctPmF0KDEpLmlzPCBJbnN0YW5jZU9mUG9ydCA+KCkgKQorCQkJeworCQkJCWFQb3J0ID0gRU5WLm1BUkctPmF0KDEpOworCQkJCUVOVi5tQVJHLT5iZWdpbigyKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlFTlYubUFSRy0+YmVnaW4oMSk7CisJCQl9CisJCQlhTXNnID0gTWVzc2FnZShFTlYubUFSRy0+b3V0RUQtPm1SSUQsIGFQb3J0KTsKKworCQkJLy8gZ2V0IG90aGVyIHBhcmFtZXRlcnMKKwkJCWZvciggOyBFTlYubUFSRy0+aGFzTmV4dCgpIDsgRU5WLm1BUkctPm5leHQoKSApCisJCQl7CisJCQkJYU1zZy5hcHBlbmRQYXJhbWV0ZXIoIEVOVi5tQVJHLT5jdXJyZW50KCkgKTsKKwkJCX0KKworQVZNX0lGX0RFQlVHX0ZMQUcyKCBCVUZGRVIgLCBDT01NVU5JQ0FUSU9OICkKKwlBVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICJPdXRwdXQgTWVzc2FnZSB0byBhcHBlbmQgaW4gYnVmZmVyIiA8PCBzdGQ6OmVuZGw7CisJYU1zZy50b1N0cmVhbShBVk1fT1NfVFJBQ0UpOworQVZNX0VORElGX0RFQlVHX0ZMQUcyKCBCVUZGRVIgLCBDT01NVU5JQ0FUSU9OICkKKwkJfQorCisJCS8vIGFwcGVuZCB0aGUgbWVzc2FnZSBpbiB0aGUgYnVmZmVyCisJCWlmKCBFTlYubUFSRy0+YXQoMCkudG9fcHRyPCBCYXNlQnVmZmVyRm9ybSA+KCktPnB1c2goYU1zZykgKQorCQl7CisJCQlFTlYuYXBwZW5kT3V0cHV0KCBFTlYubUFSRy0+b3V0RUQgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwl9CisKKwllbHNlIGlmKCBFTlYubUFSRy0+YXQoMCkuaXM8IEJ1aWx0aW5Db250YWluZXIgPigpICkKKwl7CisJCUJ1aWx0aW5Db250YWluZXIgKiBiYyA9IEVOVi5tQVJHLT5hdCgwKS50b19wdHI8IEJ1aWx0aW5Db250YWluZXIgPigpOworCisJCWJvb2wgaXNBcHBlbmQgPSBmYWxzZTsKKwkJZm9yKCBFTlYubUFSRy0+YmVnaW4oMSkgOyBFTlYubUFSRy0+aGFzTmV4dCgpIDsgRU5WLm1BUkctPm5leHQoKSApCisJCXsKKwkJCWlmKCBiYy0+YWRkKCBFTlYubUFSRy0+Y3VycmVudCgpICkgKQorCQkJeworCQkJCWlzQXBwZW5kID0gdHJ1ZTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKK0FWTV9JRl9ERUJVR19GTEFHKCBTVEFURU1FTlQpCisJQVZNX09TX1RSQUNFIDw8ICJUSFJPVyBVTlNBVElTRklFRCA8PCBBUFBFTkQgPj4gOiAiCisJCQk8PCAgRU5WLm1BUkctPm91dEVELT5tUklELnN0clVuaXFJZCgpIDw8ICIgfD0+ICIKKwkJCTw8IEVOVi5pbkNPREUtPnN0cigpIDw8IHN0ZDo6ZW5kbDsKKwlBVk1fT1NfVFJBQ0UgPDwgIlx0IiA8PCAiPGNhcGFjaXR5OiIgPDwgYmMtPmNhcGFjaXR5KCkKKwkJCTw8ICI+ICIgPDwgYmMtPnN0cigpIDw8ICIgPD08ICIKKwkJCTw8IEVOVi5tQVJHLT5jdXJyZW50KCkuc3RyKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVCkKKworCQkJCWJyZWFrOworCQkJfQorCQl9CisKK0FWTV9JRl9ERUJVR19GTEFHKCBBU1NJR05NRU5UICkKKwlBVk1fT1NfVFJBQ0UgPDwgInJ2YWx1ZTo+ICIgPDwgYmMtPnN0cigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBBU1NJR05NRU5UICkKKworCQlpZiggaXNBcHBlbmQgKQorCQl7CisJCQlFTlYuYXBwZW5kT3V0cHV0KCBFTlYubUFSRy0+b3V0RUQgKTsKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gQlVGRkVSIFJFTU9WRQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgQXZtUHJpbWl0aXZlX1JFTU9WRTo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCWlmKCBFTlYubUFSRy0+YXQoMCkuaXM8IEJhc2VCdWZmZXJGb3JtID4oKSApCisJeworCQlCYXNlQnVmZmVyRm9ybSAqIGJiZiA9IEVOVi5tQVJHLT5hdCgwKS50b19wdHI8IEJhc2VCdWZmZXJGb3JtID4oKTsKKworCQlpZiggRU5WLm1BUkctPmF0KDEpLmlzPCBJbnN0YW5jZU9mUG9ydCA+KCkgKQorCQl7CitBVk1fSUZfREVCVUdfRkxBRzIoIEJVRkZFUiAsIENPTU1VTklDQVRJT04gKQorCUFWTV9PU19UUkFDRSA8PCBUQUIgPDwgIk91dHB1dCBNZXNzYWdlIHRvIHJlbW92ZSBpbiBidWZmZXI6PiIKKwkJCTw8IHN0ZDo6ZW5kbCA8PCBUQUIyIDw8ICJidWZmZXI6ICIgPDwgc3RyX2hlYWRlciggYmJmLT5nZXRJbnN0YW5jZSgpICkKKwkJCTw8IHN0ZDo6ZW5kbCA8PCBUQUIyIDw8ICJwb3J0ICA6ICIKKwkJCTw8IHN0cl9oZWFkZXIoIEVOVi5tQVJHLT5hdCgxKS50b19wdHI8IEluc3RhbmNlT2ZQb3J0ID4oKSApCisJCQk8PCBzdGQ6OmVuZGwgPDwgVEFCMiA8PCAiYnVmZmVyOmF2PiIgPDwgYmJmLT5zdHIoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRzIoIEJVRkZFUiAsIENPTU1VTklDQVRJT04gKQorCisJCQliYmYtPnJlbW92ZSggRU5WLm1BUkctPmF0KDEpLnRvX3B0cjwgSW5zdGFuY2VPZlBvcnQgPigpICk7CisKK0FWTV9JRl9ERUJVR19GTEFHMiggQlVGRkVSICwgQ09NTVVOSUNBVElPTiApCisJQVZNX09TX1RSQUNFIDw8IFRBQjIgPDwgImJ1ZmZlcjphcD4iIDw8IGJiZi0+c3RyKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcyKCBCVUZGRVIgLCBDT01NVU5JQ0FUSU9OICkKKworCQl9CisKKwkJRU5WLmFwcGVuZE91dHB1dCggRU5WLm1BUkctPm91dEVEICk7CisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisJZWxzZSBpZiggRU5WLm1BUkctPmF0KDApLmlzPCBCdWlsdGluQ29udGFpbmVyID4oKSApCisJeworCQlCdWlsdGluQ29udGFpbmVyICogYmMgPSBFTlYubUFSRy0+YXQoMCkudG9fcHRyPCBCdWlsdGluQ29udGFpbmVyID4oKTsKKworCQlmb3IoIEVOVi5tQVJHLT5iZWdpbigxKSA7IEVOVi5tQVJHLT5oYXNOZXh0KCkgOyBFTlYubUFSRy0+bmV4dCgpICkKKwkJeworCQkJYmMtPnJlbW92ZSggRU5WLm1BUkctPmN1cnJlbnQoKSApOworCQl9CisKK0FWTV9JRl9ERUJVR19GTEFHKCBBU1NJR05NRU5UICkKKwlBVk1fT1NfVFJBQ0UgPDwgInJ2YWx1ZTo+ICIgPDwgYmMtPnN0cigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBBU1NJR05NRU5UICkKKworCQlFTlYuYXBwZW5kT3V0cHV0KCBFTlYubUFSRy0+b3V0RUQgKTsKKworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLyBCVUZGRVIgQ0xFQVIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIEF2bVByaW1pdGl2ZV9DTEVBUjo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCWlmKCBFTlYubUFSRy0+YXQoMCkuaXM8IEJhc2VCdWZmZXJGb3JtID4oKSApCisJeworCQlFTlYubUFSRy0+YXQoMCkudG9fcHRyPCBCYXNlQnVmZmVyRm9ybSA+KCktPmNsZWFyKCk7CisJfQorCisJZWxzZSBpZiggRU5WLm1BUkctPmF0KDApLmlzPCBCdWlsdGluQ29udGFpbmVyID4oKSApCisJeworCQlFTlYubUFSRy0+YXQoMCkudG9fcHRyPCBCdWlsdGluQ29udGFpbmVyID4oKS0+Y2xlYXIoKTsKKwl9CisKKwlFTlYuYXBwZW5kT3V0cHV0KCBFTlYubUFSRy0+b3V0RUQgKTsKKworCXJldHVybiggdHJ1ZSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gQlVGRkVSIFJFU0laRQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgQXZtUHJpbWl0aXZlX1JFU0laRTo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCWlmKCBFTlYubUFSRy0+YXQoMCkuaXM8IEJhc2VCdWZmZXJGb3JtID4oKSApCisJeworCQlFTlYubUFSRy0+YXQoMCkudG9fcHRyPCBCYXNlQnVmZmVyRm9ybSA+KCktPnJlc2l6ZSgKKwkJCQlFTlYubUFSRy0+YXQoMSkudG9JbnRlZ2VyKCkpOworCX0KKworCWVsc2UgaWYoIEVOVi5tQVJHLT5hdCgwKS5pczwgQnVpbHRpbkNvbGxlY3Rpb24gPigpICkKKwl7CisJCUVOVi5tQVJHLT5hdCgwKS50b19wdHI8IEJ1aWx0aW5Db2xsZWN0aW9uID4oKS0+cmVzaXplKAorCQkJCUVOVi5tQVJHLT5hdCgxKS50b0ludGVnZXIoKSk7CisJfQorCisJRU5WLmFwcGVuZE91dHB1dCggRU5WLm1BUkctPm91dEVEICk7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vIEJVRkZFUiBQVVNICisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBBdm1QcmltaXRpdmVfUFVTSDo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCWlmKCBFTlYubUFSRy0+YXQoMCkuaXM8IEJhc2VCdWZmZXJGb3JtID4oKSApCisJeworCQkvLyBnZXQgdGhlIG9wdGlvbmFsIHBvcnQgcGFyYW1ldGVyCisJCU1lc3NhZ2UgYU1zZzsKKwkJaWYoIEVOVi5tQVJHLT5hdCgxKS5pczwgTWVzc2FnZSA+KCkgKQorCQl7CisJCQlhTXNnID0gRU5WLm1BUkctPmF0KDEpOworCQl9CisJCWVsc2UKKwkJeworCQkJQkYgYVBvcnQ7CisJCQlpZiggRU5WLm1BUkctPmF0KDEpLmlzPCBJbnN0YW5jZU9mUG9ydCA+KCkgKQorCQkJeworCQkJCWFQb3J0ID0gRU5WLm1BUkctPmF0KDEpOworCQkJCUVOVi5tQVJHLT5iZWdpbigyKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlFTlYubUFSRy0+YmVnaW4oMSk7CisJCQl9CisJCQlhTXNnID0gTWVzc2FnZShFTlYubUFSRy0+b3V0RUQtPm1SSUQsIGFQb3J0KTsKKworCQkJLy8gZ2V0IG90aGVyIHBhcmFtZXRlcnMKKwkJCWZvciggOyBFTlYubUFSRy0+aGFzTmV4dCgpIDsgRU5WLm1BUkctPm5leHQoKSApCisJCQl7CisJCQkJYU1zZy5hcHBlbmRQYXJhbWV0ZXIoIEVOVi5tQVJHLT5jdXJyZW50KCkgKTsKKwkJCX0KKworQVZNX0lGX0RFQlVHX0ZMQUcyKCBCVUZGRVIgLCBDT01NVU5JQ0FUSU9OICkKKwlBVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICJPdXRwdXQgTWVzc2FnZSB0byBhcHBlbmQgaW4gYnVmZmVyIiA8PCBzdGQ6OmVuZGw7CisJYU1zZy50b1N0cmVhbShBVk1fT1NfVFJBQ0UpOworQVZNX0VORElGX0RFQlVHX0ZMQUcyKCBCVUZGRVIgLCBDT01NVU5JQ0FUSU9OICkKKwkJfQorCisJCS8vIGFwcGVuZCB0aGUgbWVzc2FnZSBpbiB0aGUgYnVmZmVyCisJCWlmKCBFTlYubUFSRy0+YXQoMCkudG9fcHRyPCBCYXNlQnVmZmVyRm9ybSA+KCktPnB1c2goYU1zZykgKQorCQl7CisJCQlFTlYuYXBwZW5kT3V0cHV0KCBFTlYubUFSRy0+b3V0RUQgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwl9CisKKwllbHNlIGlmKCBFTlYubUFSRy0+YXQoMCkuaXM8IEJ1aWx0aW5RdWV1ZSA+KCkgKQorCXsKKwkJQnVpbHRpblF1ZXVlICogcXVldWUgPSBFTlYubUFSRy0+YXQoMCkudG9fcHRyPCBCdWlsdGluUXVldWUgPigpOworCQlpZiggcXVldWUgIT0gTlVMTCApCisJCXsKKwkJCWJvb2wgaXNBcHBlbmQgPSBmYWxzZTsKKwkJCWZvciggRU5WLm1BUkctPmJlZ2luKDEpIDsgRU5WLm1BUkctPmhhc05leHQoKSA7IEVOVi5tQVJHLT5uZXh0KCkgKQorCQkJeworCQkJCWlmKCBxdWV1ZS0+cHVzaCggRU5WLm1BUkctPmN1cnJlbnQoKSApICkKKwkJCQl7CisJCQkJCWlzQXBwZW5kID0gdHJ1ZTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKK0FWTV9JRl9ERUJVR19GTEFHKCBTVEFURU1FTlQpCisJQVZNX09TX1RSQUNFIDw8ICJUSFJPVyBVTlNBVElTRklFRCA8PCBQVVNIID4+IDogIgorCQkJPDwgIEVOVi5tQVJHLT5vdXRFRC0+bVJJRC5zdHJVbmlxSWQoKSA8PCAiIHw9PiAiCisJCQk8PCBFTlYuaW5DT0RFLT5zdHIoKSA8PCBzdGQ6OmVuZGw7CisJQVZNX09TX1RSQUNFIDw8ICJcdCIgPDwgIjxjYXBhY2l0eToiIDw8IHF1ZXVlLT5jYXBhY2l0eSgpCisJCQk8PCAiPiAiIDw8IHF1ZXVlLT5zdHIoKSA8PCAiIDw9PCAiCisJCQk8PCBFTlYubUFSRy0+Y3VycmVudCgpLnN0cigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTVEFURU1FTlQpCisKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCitBVk1fSUZfREVCVUdfRkxBRyggQVNTSUdOTUVOVCApCisJQVZNX09TX1RSQUNFIDw8ICJydmFsdWU6PiAiIDw8IHF1ZXVlLT5zdHIoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggQVNTSUdOTUVOVCApCisKKwkJCWlmKCBpc0FwcGVuZCApCisJCQl7CisJCQkJRU5WLmFwcGVuZE91dHB1dCggRU5WLm1BUkctPm91dEVEICk7CisJCQkJcmV0dXJuKCB0cnVlICk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CitBVk1fSUZfREVCVUdfRkxBRyggU1RBVEVNRU5UKQorCUFWTV9PU19UUkFDRSA8PCAiVEhST1cgVU5TQVRJU0ZJRUQgPDwgUFVTSCA+PiA6ICIKKwkJCTw8ICBFTlYubUFSRy0+b3V0RUQtPm1SSUQuc3RyVW5pcUlkKCkgPDwgIiB8PT4gIgorCQkJPDwgRU5WLmluQ09ERS0+c3RyKCkgPDwgc3RkOjplbmRsOworCUFWTV9PU19UUkFDRSA8PCAiXHQiIDw8ICJVbmZvdW5kIHF1ZXVlIGZvciA8PCAiCisJCQk8PCBFTlYubUFSRy0+YXQoMCkuc3RyKCkgPDwgIiA+PiIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVCkKKwkJfQorCX0KKworCWVsc2UgaWYoIEVOVi5tQVJHLT5hdCgwKS5pczwgQnVpbHRpbkNvbnRhaW5lciA+KCkgKQorCXsKKwkJQnVpbHRpbkNvbnRhaW5lciAqIGJjID0gRU5WLm1BUkctPmF0KDApLnRvX3B0cjwgQnVpbHRpbkNvbnRhaW5lciA+KCk7CisKKwkJYm9vbCBpc0FwcGVuZCA9IGZhbHNlOworCQlmb3IoIEVOVi5tQVJHLT5iZWdpbigxKSA7IEVOVi5tQVJHLT5oYXNOZXh0KCkgOyBFTlYubUFSRy0+bmV4dCgpICkKKwkJeworCQkJaWYoIGJjLT5hZGQoIEVOVi5tQVJHLT5jdXJyZW50KCkgKSApCisJCQl7CisJCQkJaXNBcHBlbmQgPSB0cnVlOworCQkJfQorCQkJZWxzZQorCQkJeworQVZNX0lGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVCkKKwlBVk1fT1NfVFJBQ0UgPDwgIlRIUk9XIFVOU0FUSVNGSUVEIDw8IFBVU0ggPj4gOiAiCisJCQk8PCAgRU5WLm1BUkctPm91dEVELT5tUklELnN0clVuaXFJZCgpIDw8ICIgfD0+ICIKKwkJCTw8IEVOVi5pbkNPREUtPnN0cigpIDw8IHN0ZDo6ZW5kbDsKKwlBVk1fT1NfVFJBQ0UgPDwgIlx0IiA8PCAiPGNhcGFjaXR5OiIgPDwgYmMtPmNhcGFjaXR5KCkKKwkJCTw8ICI+ICIgPDwgYmMtPnN0cigpIDw8ICIgPD08ICIKKwkJCTw8IEVOVi5tQVJHLT5jdXJyZW50KCkuc3RyKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVCkKKworCQkJCWJyZWFrOworCQkJfQorCQl9CisKK0FWTV9JRl9ERUJVR19GTEFHKCBBU1NJR05NRU5UICkKKwlBVk1fT1NfVFJBQ0UgPDwgInJ2YWx1ZTo+ICIgPDwgYmMtPnN0cigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBBU1NJR05NRU5UICkKKworCQlpZiggaXNBcHBlbmQgKQorCQl7CisJCQlFTlYuYXBwZW5kT3V0cHV0KCBFTlYubUFSRy0+b3V0RUQgKTsKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLyBCVUZGRVIgQVNTSUdOX1RPUAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgQXZtUHJpbWl0aXZlX0FTU0lHTl9UT1A6OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlpZiggRU5WLm1BUkctPmF0KDApLmlzPCBCYXNlQnVmZmVyRm9ybSA+KCkgKQorCXsKKwkJLy8gZ2V0IHRoZSBvcHRpb25hbCBwb3J0IHBhcmFtZXRlcgorCQlNZXNzYWdlIGFNc2c7CisJCWlmKCBFTlYubUFSRy0+YXQoMSkuaXM8IE1lc3NhZ2UgPigpICkKKwkJeworCQkJYU1zZyA9IEVOVi5tQVJHLT5hdCgxKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCUJGIGFQb3J0OworCQkJaWYoIEVOVi5tQVJHLT5hdCgxKS5pczwgSW5zdGFuY2VPZlBvcnQgPigpICkKKwkJCXsKKwkJCQlhUG9ydCA9IEVOVi5tQVJHLT5hdCgxKTsKKwkJCQlFTlYubUFSRy0+YmVnaW4oMik7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJRU5WLm1BUkctPmJlZ2luKDEpOworCQkJfQorCQkJYU1zZyA9IE1lc3NhZ2UoRU5WLm1BUkctPm91dEVELT5tUklELCBhUG9ydCk7CisKKwkJCS8vIGdldCBvdGhlciBwYXJhbWV0ZXJzCisJCQlmb3IoIDsgRU5WLm1BUkctPmhhc05leHQoKSA7IEVOVi5tQVJHLT5uZXh0KCkgKQorCQkJeworCQkJCWFNc2cuYXBwZW5kUGFyYW1ldGVyKCBFTlYubUFSRy0+Y3VycmVudCgpICk7CisJCQl9CisKK0FWTV9JRl9ERUJVR19GTEFHMiggQlVGRkVSICwgQ09NTVVOSUNBVElPTiApCisJQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiT3V0cHV0IE1lc3NhZ2UgdG8gYXNzaWduI3RvcCBpbiBidWZmZXIiIDw8IHN0ZDo6ZW5kbDsKKwlhTXNnLnRvU3RyZWFtKEFWTV9PU19UUkFDRSk7CitBVk1fRU5ESUZfREVCVUdfRkxBRzIoIEJVRkZFUiAsIENPTU1VTklDQVRJT04gKQorCQl9CisKKwkJLy8gYXBwZW5kIHRoZSBtZXNzYWdlIGluIHRoZSBidWZmZXIKKwkJaWYoIEVOVi5tQVJHLT5hdCgwKS50b19wdHI8IEJhc2VCdWZmZXJGb3JtID4oKS0+dG9wKCBhTXNnKSApCisJCXsKKwkJCUVOVi5hcHBlbmRPdXRwdXQoIEVOVi5tQVJHLT5vdXRFRCApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCX0KKwllbHNlIGlmKCBFTlYubUFSRy0+YXQoMCkuaXM8IEJ1aWx0aW5RdWV1ZSA+KCkgKQorCXsKKwkJQnVpbHRpblF1ZXVlICogcXVldWUgPSBFTlYubUFSRy0+YXQoMCkudG9fcHRyPCBCdWlsdGluUXVldWUgPigpOworCQlpZiggcXVldWUtPm5vbmVtcHR5KCkgKQorCQl7CitBVk1fSUZfREVCVUdfRkxBRyggQVNTSUdOTUVOVCApCisJQVZNX09TX1RSQUNFIDw8ICJsdmFsdWU6cXVldWU+ICIgPDwgcXVldWUtPnN0cigpIDw8IHN0ZDo6ZW5kbAorCQkJPDwgInJ2YWx1ZTo+ICIgPDwgRU5WLm1BUkctPmF0KDEpLnN0cigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBBU1NJR05NRU5UICkKKworCQkJaWYoIHF1ZXVlLT50b3AoIEVOVi5tQVJHLT5hdCgxKSApICkKKwkJCXsKK0FWTV9JRl9ERUJVR19GTEFHKCBBU1NJR05NRU5UICkKKwlBVk1fT1NfVFJBQ0UgPDwgInF1ZXVlPiAiIDw8IHF1ZXVlLT5zdHIoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggQVNTSUdOTUVOVCApCisKKwkJCQlFTlYuYXBwZW5kT3V0cHV0KCBFTlYubUFSRy0+b3V0RUQgKTsKKworCQkJCXJldHVybiggdHJ1ZSApOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKK2Jvb2wgQXZtUHJpbWl0aXZlX0FTU0lHTl9UT1A6OnNldmFsKEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlpZiggRU5WLm1BUkctPmF0KDApLmlzPCBCYXNlQnVmZmVyRm9ybSA+KCkgKQorCXsKKwkJLy8gZ2V0IHRoZSBvcHRpb25hbCBwb3J0IHBhcmFtZXRlcgorCQlNZXNzYWdlIGFNc2c7CisJCWlmKCBFTlYubUFSRy0+YXQoMSkuaXM8IE1lc3NhZ2UgPigpICkKKwkJeworCQkJYU1zZyA9IEVOVi5tQVJHLT5hdCgxKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCUJGIGFQb3J0OworCQkJaWYoIEVOVi5tQVJHLT5hdCgxKS5pczwgSW5zdGFuY2VPZlBvcnQgPigpICkKKwkJCXsKKwkJCQlhUG9ydCA9IEVOVi5tQVJHLT5hdCgxKTsKKwkJCX0KKwkJCWFNc2cgPSBNZXNzYWdlKEVOVi5tQVJHLT5vdXRFRC0+bVJJRCwgYVBvcnQpOworCisJCQkvLyBnZXQgb3RoZXIgcGFyYW1ldGVycworCQkJZm9yKCBFTlYubUFSRy0+YmVnaW4oMikgOyBFTlYubUFSRy0+aGFzTmV4dCgpIDsgRU5WLm1BUkctPm5leHQoKSApCisJCQl7CisJCQkJYU1zZy5hcHBlbmRQYXJhbWV0ZXIoIEVOVi5tQVJHLT5jdXJyZW50KCkgKTsKKwkJCX0KKworQVZNX0lGX0RFQlVHX0ZMQUcyKCBCVUZGRVIgLCBDT01NVU5JQ0FUSU9OICkKKwlBVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICJPdXRwdXQgTWVzc2FnZSB0byBhc3NpZ24jdG9wIGluIGJ1ZmZlciIgPDwgc3RkOjplbmRsOworCWFNc2cudG9TdHJlYW0oQVZNX09TX1RSQUNFKTsKK0FWTV9FTkRJRl9ERUJVR19GTEFHMiggQlVGRkVSICwgQ09NTVVOSUNBVElPTiApCisJCX0KKworCQkvLyBhcHBlbmQgdGhlIG1lc3NhZ2UgaW4gdGhlIGJ1ZmZlcgorCQlpZiggRU5WLm1BUkctPmF0KDApLnRvX3B0cjwgQmFzZUJ1ZmZlckZvcm0gPigpLT50b3AoIGFNc2cpICkKKwkJeworCQkJRU5WLm91dFZBTCA9IGFNc2c7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisJfQorCWVsc2UgaWYoIEVOVi5tQVJHLT5hdCgwKS5pczwgQnVpbHRpblF1ZXVlID4oKSApCisJeworCQlCdWlsdGluUXVldWUgKiBxdWV1ZSA9IEVOVi5tQVJHLT5hdCgwKS50b19wdHI8IEJ1aWx0aW5RdWV1ZSA+KCk7CisJCWlmKCAocXVldWUgIT0gTlVMTCkgJiYgcXVldWUtPm5vbmVtcHR5KCkgKQorCQl7CitBVk1fSUZfREVCVUdfRkxBRyggQVNTSUdOTUVOVCApCisJQVZNX09TX1RSQUNFIDw8ICJsdmFsdWU6cXVldWU+ICIgPDwgcXVldWUtPnN0cigpIDw8IHN0ZDo6ZW5kbAorCQkJPDwgInJ2YWx1ZTo+ICIgPDwgRU5WLm1BUkctPmF0KDEpLnN0cigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBBU1NJR05NRU5UICkKKworCQkJaWYoIHF1ZXVlLT50b3AoIEVOVi5tQVJHLT5hdCgxKSApICkKKwkJCXsKK0FWTV9JRl9ERUJVR19GTEFHKCBBU1NJR05NRU5UICkKKwlBVk1fT1NfVFJBQ0UgPDwgInF1ZXVlPiAiIDw8IHF1ZXVlLT5zdHIoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggQVNTSUdOTUVOVCApCisKKwkJCQlFTlYub3V0VkFMID0gRU5WLm1BUkctPmF0KDEpOworCisJCQkJcmV0dXJuKCB0cnVlICk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiggcXVldWUgPT0gTlVMTCApCisJCXsKK0FWTV9JRl9ERUJVR19GTEFHKCBTVEFURU1FTlQpCisJQVZNX09TX1RSQUNFIDw8ICJUSFJPVyBVTlNBVElTRklFRCA8PCBBU1NJTkcjVE9QID4+IDogIgorCQkJPDwgIEVOVi5pbkVELT5tUklELnN0clVuaXFJZCgpIDw8ICIgfD0+ICIKKwkJCTw8IEVOVi5pbkNPREUtPnN0cigpIDw8IHN0ZDo6ZW5kbDsKKwlBVk1fT1NfVFJBQ0UgPDwgIlx0IiA8PCAiVW5mb3VuZCBidWlsdGluIHF1ZXVlIGZvciA8PCAiCisJCQk8PCBFTlYubUFSRy0+YXQoMCkuc3RyKCkgPDwgIiA+PiIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVCkKKwkJfQorCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gQlVGRkVSIFRPUAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgQXZtUHJpbWl0aXZlX1RPUDo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCWlmKCBFTlYubUFSRy0+YXQoMCkuaXM8IEJhc2VCdWZmZXJGb3JtID4oKSApCisJeworCQlNZXNzYWdlIGFNc2cgPSBFTlYubUFSRy0+YXQoMCkudG9fcHRyPCBCYXNlQnVmZmVyRm9ybSA+KCktPnRvcCgpOworCisJCWlmKCBhTXNnLnZhbGlkKCkgJiYgKEVOVi5tQVJHLT5jb3VudCA+IDEpICkKKwkJeworCQkJaWYoIEVOVi5tQVJHLT5hdCgxKS5pczwgSW5zdGFuY2VPZkRhdGEgPigpICYmCisJCQkJCUVOVi5tQVJHLT5hdCgxKS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKS0+aXNUeXBlZE1lc3NhZ2UoKSApCisJCQl7CitBVk1fSUZfREVCVUdfRkxBRyggQVNTSUdOTUVOVCApCisJQVZNX09TX1RSQUNFIDw8ICJydmFsdWU6bXNnPiAiIDw8IGFNc2cuc3RyKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIEFTU0lHTk1FTlQgKQorCisJCQkJaWYoIG5vdCBFTlYuc2V0UnZhbHVlKEVOVi5tQVJHLT5vdXRFRCwKKwkJCQkJCUVOVi5tQVJHLT5hdCgxKS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSwgYU1zZykgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBXZSBoYXZlIHRvIGlnbm9yZSB0aGUgPDwgQnVmZmVyID4+CisJCQkJTWVzc2FnZTo6Y29uc3RfaXRlcmF0b3IgaXRWYWx1ZSA9IGFNc2cuYmVnaW5QYXJhbWV0ZXJzKCk7CisJCQkJTWVzc2FnZTo6Y29uc3RfaXRlcmF0b3IgZW5kVmFsdWUgPSBhTXNnLmVuZFBhcmFtZXRlcnMoKTsKKwkJCQlFTlYubUFSRy0+YmVnaW4oMSk7CisJCQkJZm9yKCA7IEVOVi5tQVJHLT5oYXNOZXh0KCkgJiYgKGl0VmFsdWUgIT0gZW5kVmFsdWUpIDsKKwkJCQkJCUVOVi5tQVJHLT5uZXh0KCkgLCArK2l0VmFsdWUgKQorCQkJCXsKK0FWTV9JRl9ERUJVR19GTEFHKCBBU1NJR05NRU5UICkKKwlBVk1fT1NfVFJBQ0UgPDwgImx2YWx1ZTo+ICIgPDwgRU5WLm1BUkctPmN1cnJlbnQoKS5zdHIoKSA8PCBzdGQ6OmVuZGwKKwkJCTw8ICJydmFsdWU6PiAiIDw8ICgqaXRWYWx1ZSkuc3RyKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIEFTU0lHTk1FTlQgKQorCisJCQkJCWlmKCBub3QgRU5WLnNldFJ2YWx1ZShFTlYubUFSRy0+b3V0RUQsIEVOVi5tQVJHLT5jdXJyZW50KCkuCisJCQkJCQkJdG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCksICgqaXRWYWx1ZSkpICkKKwkJCQkJeworCQkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlFTlYuYXBwZW5kT3V0cHV0KCBFTlYubUFSRy0+b3V0RUQgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQlyZXR1cm4oIGFNc2cudmFsaWQoKSApOworCX0KKwllbHNlIC8vaWYoIEVOVi5tQVJHLT5hdCgwKS5pczwgQnVpbHRpblF1ZXVlID4oKSApCisJeworCQlCdWlsdGluUXVldWUgKiBxdWV1ZSA9IEVOVi5tQVJHLT5hdCgwKS50b19wdHI8IEJ1aWx0aW5RdWV1ZSA+KCk7CisJCWlmKCBFTlYubUFSRy0+Y291bnQgPiAxICkKKwkJeworCQkJQkYgcG9wVmFsdWU7CisJCQlmb3IoIEVOVi5tQVJHLT5iZWdpbigxKSA7IEVOVi5tQVJHLT5oYXNOZXh0KCkgOyBFTlYubUFSRy0+bmV4dCgpICkKKwkJCXsKKwkJCQlwb3BWYWx1ZSA9IHF1ZXVlLT50b3AoKTsKKworCQkJCWlmKCBwb3BWYWx1ZS5pbnZhbGlkKCkgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworQVZNX0lGX0RFQlVHX0ZMQUcoIEFTU0lHTk1FTlQgKQorCUFWTV9PU19UUkFDRSA8PCAicnZhbHVlOj4gIiA8PCBwb3BWYWx1ZS5zdHIoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggQVNTSUdOTUVOVCApCisKKwkJCQkJaWYoIG5vdCBFTlYuc2V0UnZhbHVlKEVOVi5tQVJHLT5vdXRFRCwgRU5WLm1BUkctPmN1cnJlbnQoKS4KKwkJCQkJCQl0b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSwgcG9wVmFsdWUpICkKKwkJCQkJeworCQkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCQl9CisJCQkJfQorCQkJfQorCitBVk1fSUZfREVCVUdfRkxBRyggQVNTSUdOTUVOVCApCisJQVZNX09TX1RSQUNFIDw8ICJydmFsdWU6cXVldWU+ICIgPDwgcXVldWUtPnN0cigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBBU1NJR05NRU5UICkKKworCQkJRU5WLmFwcGVuZE91dHB1dCggRU5WLm1BUkctPm91dEVEICk7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKK2Jvb2wgQXZtUHJpbWl0aXZlX1RPUDo6c2V2YWwoRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCWlmKCBFTlYubUFSRy0+YXQoMCkuaXM8IEJhc2VCdWZmZXJGb3JtID4oKSApCisJeworCQlFTlYub3V0VkFMID0gRU5WLm1BUkctPmF0KDApLnRvX3B0cjwgQmFzZUJ1ZmZlckZvcm0gPigpLT50b3AoKTsKKwl9CisKKwllbHNlIGlmKCBFTlYubUFSRy0+YXQoMCkuaXM8IEJ1aWx0aW5RdWV1ZSA+KCkgKQorCXsKKy8vCQlBVk1fT1NfVFJBQ0UgPDwgInF1ZXVlLT50b3AgOj4gIiA8PCBFTlYubUFSRy0+YXQoMCkuc3RyKCkKKy8vCQkJCTw8ICIgPSAiIDw8IEVOVi5nZXRXcml0YWJsZVF1ZXVlKEVOVi5tQVJHLT5vdXRFRCwKKy8vCQkJCQkJRU5WLm1BUkctPmF0KDApKS5zdHIoKSA8PCBzdGQ6OmVuZGw7CisKKwkJRU5WLm91dFZBTCA9IEVOVi5tQVJHLT5hdCgwKS50b19wdHI8IEJ1aWx0aW5RdWV1ZSA+KCktPnRvcCgpOworCX0KKworCXJldHVybiggRU5WLm91dFZBTC52YWxpZCgpICk7Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vIEJVRkZFUiBQT1AKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIEF2bVByaW1pdGl2ZV9QT1A6OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlpZiggRU5WLm1BUkctPmF0KDApLmlzPCBCYXNlQnVmZmVyRm9ybSA+KCkgKQorCXsKKwkJTWVzc2FnZSBhTXNnID0gRU5WLm1BUkctPmF0KDApLnRvX3B0cjwgQmFzZUJ1ZmZlckZvcm0gPigpLT5wb3AoKTsKKworCQlpZiggYU1zZy52YWxpZCgpICYmIChFTlYubUFSRy0+Y291bnQgPiAxKSApCisJCXsKKwkJCWlmKCBFTlYubUFSRy0+YXQoMSkuaXM8IEluc3RhbmNlT2ZEYXRhID4oKSAmJgorCQkJCQlFTlYubUFSRy0+YXQoMSkudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCktPmlzVHlwZWRNZXNzYWdlKCkgKQorCQkJeworQVZNX0lGX0RFQlVHX0ZMQUcoIEFTU0lHTk1FTlQgKQorCUFWTV9PU19UUkFDRSA8PCAicnZhbHVlOm1zZz4gIiA8PCBhTXNnLnN0cigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBBU1NJR05NRU5UICkKKworCQkJCWlmKCBub3QgRU5WLnNldFJ2YWx1ZShFTlYubUFSRy0+b3V0RUQsCisJCQkJCQlFTlYubUFSRy0+YXQoMSkudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCksIGFNc2cpICkKKwkJCQl7CisJCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gV2UgaGF2ZSB0byBpZ25vcmUgdGhlIDw8IEJ1ZmZlciA+PgorCQkJCU1lc3NhZ2U6OmNvbnN0X2l0ZXJhdG9yIGl0VmFsdWUgPSBhTXNnLmJlZ2luUGFyYW1ldGVycygpOworCQkJCU1lc3NhZ2U6OmNvbnN0X2l0ZXJhdG9yIGVuZFZhbHVlID0gYU1zZy5lbmRQYXJhbWV0ZXJzKCk7CisJCQkJRU5WLm1BUkctPmJlZ2luKDEpOworCQkJCWZvciggOyBFTlYubUFSRy0+aGFzTmV4dCgpICYmIChpdFZhbHVlICE9IGVuZFZhbHVlKSA7CisJCQkJCQlFTlYubUFSRy0+bmV4dCgpICwgKytpdFZhbHVlICkKKwkJCQl7CitBVk1fSUZfREVCVUdfRkxBRyggQVNTSUdOTUVOVCApCisJQVZNX09TX1RSQUNFIDw8ICJsdmFsdWU6PiAiIDw8IEVOVi5tQVJHLT5jdXJyZW50KCkuc3RyKCkgPDwgc3RkOjplbmRsCisJCQk8PCAicnZhbHVlOj4gIiA8PCAoKml0VmFsdWUpLnN0cigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBBU1NJR05NRU5UICkKKworCQkJCQlpZiggbm90IEVOVi5zZXRSdmFsdWUoRU5WLm1BUkctPm91dEVELCBFTlYubUFSRy0+Y3VycmVudCgpLgorCQkJCQkJCXRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpLCAoKml0VmFsdWUpKSApCisJCQkJCXsKKwkJCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJRU5WLmFwcGVuZE91dHB1dCggRU5WLm1BUkctPm91dEVEICk7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisKKwkJcmV0dXJuKCBhTXNnLnZhbGlkKCkgKTsKKwl9CisJZWxzZSBpZiggRU5WLm1BUkctPmF0KDApLmlzPCBCdWlsdGluUXVldWUgPigpICkKKwl7CisJCUJ1aWx0aW5RdWV1ZSAqIHF1ZXVlID0gRU5WLm1BUkctPmF0KDApLnRvX3B0cjwgQnVpbHRpblF1ZXVlID4oKTsKKwkJaWYoIEVOVi5tQVJHLT5jb3VudCA9PSAxICkKKwkJeworCQkJcXVldWUtPnBvcCgpOworCQl9CisJCWVsc2UgLy9pZiggRU5WLm1BUkctPmNvdW50ID4gMSApCisJCXsKKwkJCUJGIHBvcFZhbHVlOworCQkJZm9yKCBFTlYubUFSRy0+YmVnaW4oMSkgOyBFTlYubUFSRy0+aGFzTmV4dCgpIDsgRU5WLm1BUkctPm5leHQoKSApCisJCQl7CisJCQkJcG9wVmFsdWUgPSBxdWV1ZS0+cG9wKCk7CisKKwkJCQlpZiggcG9wVmFsdWUuaW52YWxpZCgpICkKKwkJCQl7CisJCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKK0FWTV9JRl9ERUJVR19GTEFHKCBBU1NJR05NRU5UICkKKwlBVk1fT1NfVFJBQ0UgPDwgImx2YWx1ZTo+ICIKKwkJCTw8IHN0cl9oZWFkZXIoIEVOVi5tQVJHLT5jdXJyZW50KCkudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCkgKQorCQkJPDwgc3RkOjplbmRsCisJCQk8PCAicnZhbHVlOj4gIiA8PCBwb3BWYWx1ZS5zdHIoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggQVNTSUdOTUVOVCApCisKKwkJCQkJaWYoIG5vdCBFTlYuc2V0UnZhbHVlKEVOVi5tQVJHLT5vdXRFRCwgRU5WLm1BUkctPmN1cnJlbnQoKS4KKwkJCQkJCQl0b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSwgcG9wVmFsdWUpICkKKwkJCQkJeworCQkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKK0FWTV9JRl9ERUJVR19GTEFHKCBBU1NJR05NRU5UICkKKwlBVk1fT1NfVFJBQ0UgPDwgInJ2YWx1ZTpxdWV1ZT4gIiA8PCBxdWV1ZS0+c3RyKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIEFTU0lHTk1FTlQgKQorCisJCUVOVi5hcHBlbmRPdXRwdXQoIEVOVi5tQVJHLT5vdXRFRCApOworCisJCXJldHVybiggdHJ1ZSApOworCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKworCitib29sIEF2bVByaW1pdGl2ZV9QT1A6OnNldmFsKEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlpZiggRU5WLm1BUkctPmF0KDApLmlzPCBCYXNlQnVmZmVyRm9ybSA+KCkgKQorCXsKKwkJRU5WLm91dFZBTCA9IEVOVi5tQVJHLT5hdCgwKS50b19wdHI8IEJhc2VCdWZmZXJGb3JtID4oKS0+cG9wKCk7CisJfQorCisJZWxzZSBpZiggRU5WLm1BUkctPmF0KDApLmlzPCBCdWlsdGluUXVldWUgPigpICkKKwl7CisvLwkJQVZNX09TX1RSQUNFIDw8ICJxdWV1ZSA6PiAiIDw8IEVOVi5tQVJHLT5hdCgwKS5zdHIoKSA8PCBzdGQ6OmVuZGw7CisKKwkJRU5WLm91dFZBTCA9IEVOVi5tQVJHLT5hdCgwKS50b19wdHI8IEJ1aWx0aW5RdWV1ZSA+KCktPnBvcCgpOworCisvLwkJQVZNX09TX1RSQUNFIDw8ICJxdWV1ZS0+cG9wIDo+ICIgPDwgRU5WLm1BUkctPmF0KDApLnN0cigpIDw8IHN0ZDo6ZW5kbDsKKwl9CisKKwlyZXR1cm4oIEVOVi5vdXRWQUwudmFsaWQoKSApOworfQorCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLyBCVUZGRVIgUE9QIEZST00KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIEF2bVByaW1pdGl2ZV9QT1BfRlJPTTo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCWlmKCBFTlYubUFSRy0+YXQoMCkuaXM8IEJhc2VCdWZmZXJGb3JtID4oKSApCisJeworCQlNZXNzYWdlIGFNc2cgPSBFTlYubUFSRy0+YXQoMCkudG9fcHRyPCBCYXNlQnVmZmVyRm9ybSA+KCktPnBvcCgpOworCisJCWlmKCBhTXNnLnZhbGlkKCkgJiYgKEVOVi5tQVJHLT5jb3VudCA+IDEpICkKKwkJeworCQkJaWYoIEVOVi5tQVJHLT5hdCgxKS5pczwgSW5zdGFuY2VPZkRhdGEgPigpICYmCisJCQkJCUVOVi5tQVJHLT5hdCgxKS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKS0+aXNUeXBlZE1lc3NhZ2UoKSApCisJCQl7CitBVk1fSUZfREVCVUdfRkxBRyggQVNTSUdOTUVOVCApCisJQVZNX09TX1RSQUNFIDw8ICJydmFsdWU6bXNnPiAiIDw8IGFNc2cuc3RyKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIEFTU0lHTk1FTlQgKQorCisJCQkJaWYoIG5vdCBFTlYuc2V0UnZhbHVlKEVOVi5tQVJHLT5vdXRFRCwKKwkJCQkJCUVOVi5tQVJHLT5hdCgxKS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSwgYU1zZykgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBXZSBoYXZlIHRvIGlnbm9yZSB0aGUgPDwgQnVmZmVyID4+CisJCQkJTWVzc2FnZTo6Y29uc3RfaXRlcmF0b3IgaXRWYWx1ZSA9IGFNc2cuYmVnaW5QYXJhbWV0ZXJzKCk7CisJCQkJTWVzc2FnZTo6Y29uc3RfaXRlcmF0b3IgZW5kVmFsdWUgPSBhTXNnLmVuZFBhcmFtZXRlcnMoKTsKKwkJCQlFTlYubUFSRy0+YmVnaW4oMSk7CisJCQkJZm9yKCA7IEVOVi5tQVJHLT5oYXNOZXh0KCkgJiYgKGl0VmFsdWUgIT0gZW5kVmFsdWUpIDsKKwkJCQkJCUVOVi5tQVJHLT5uZXh0KCkgLCArK2l0VmFsdWUgKQorCQkJCXsKK0FWTV9JRl9ERUJVR19GTEFHKCBBU1NJR05NRU5UICkKKwlBVk1fT1NfVFJBQ0UgPDwgImx2YWx1ZTo+ICIgPDwgRU5WLm1BUkctPmN1cnJlbnQoKS5zdHIoKSA8PCBzdGQ6OmVuZGwKKwkJCTw8ICJydmFsdWU6PiAiIDw8ICgqaXRWYWx1ZSkuc3RyKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIEFTU0lHTk1FTlQgKQorCisJCQkJCWlmKCBub3QgRU5WLnNldFJ2YWx1ZShFTlYubUFSRy0+b3V0RUQsIEVOVi5tQVJHLT5jdXJyZW50KCkuCisJCQkJCQkJdG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCksICgqaXRWYWx1ZSkpICkKKwkJCQkJeworCQkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlFTlYuYXBwZW5kT3V0cHV0KCBFTlYubUFSRy0+b3V0RUQgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQlyZXR1cm4oIGFNc2cudmFsaWQoKSApOworCX0KKwllbHNlIGlmKCBFTlYubUFSRy0+YXQoMCkuaXM8IEJ1aWx0aW5RdWV1ZSA+KCkgKQorCXsKKwkJQnVpbHRpblF1ZXVlICogcXVldWUgPSBFTlYubUFSRy0+YXQoMCkudG9fcHRyPCBCdWlsdGluUXVldWUgPigpOworCQlpZiggRU5WLm1BUkctPmNvdW50ID09IDEgKQorCQl7CisJCQlxdWV1ZS0+cG9wKCk7CisJCX0KKwkJZWxzZSAvL2lmKCBFTlYubUFSRy0+Y291bnQgPiAxICkKKwkJeworCQkJQkYgcG9wVmFsdWU7CisJCQlmb3IoIEVOVi5tQVJHLT5iZWdpbigxKSA7IEVOVi5tQVJHLT5oYXNOZXh0KCkgOyBFTlYubUFSRy0+bmV4dCgpICkKKwkJCXsKKwkJCQlwb3BWYWx1ZSA9IHF1ZXVlLT5wb3AoKTsKKworCQkJCWlmKCBwb3BWYWx1ZS5pbnZhbGlkKCkgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworQVZNX0lGX0RFQlVHX0ZMQUcoIEFTU0lHTk1FTlQgKQorCUFWTV9PU19UUkFDRSA8PCAicnZhbHVlOj4gIiA8PCBwb3BWYWx1ZS5zdHIoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggQVNTSUdOTUVOVCApCisKKwkJCQkJaWYoIG5vdCBFTlYuc2V0UnZhbHVlKEVOVi5tQVJHLT5vdXRFRCwgRU5WLm1BUkctPmN1cnJlbnQoKS4KKwkJCQkJCQl0b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSwgcG9wVmFsdWUpICkKKwkJCQkJeworCQkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKK0FWTV9JRl9ERUJVR19GTEFHKCBBU1NJR05NRU5UICkKKwlBVk1fT1NfVFJBQ0UgPDwgInJ2YWx1ZTpxdWV1ZT4gIiA8PCBxdWV1ZS0+c3RyKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIEFTU0lHTk1FTlQgKQorCisJCUVOVi5hcHBlbmRPdXRwdXQoIEVOVi5tQVJHLT5vdXRFRCApOworCisJCXJldHVybiggdHJ1ZSApOworCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKworCitib29sIEF2bVByaW1pdGl2ZV9QT1BfRlJPTTo6c2V2YWwoRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCWlmKCBFTlYubUFSRy0+YXQoMCkuaXM8IEJhc2VCdWZmZXJGb3JtID4oKSApCisJeworCQlFTlYub3V0VkFMID0gRU5WLm1BUkctPmF0KDApLnRvX3B0cjwgQmFzZUJ1ZmZlckZvcm0gPigpLT5wb3AoKTsKKwl9CisKKwllbHNlIGlmKCBFTlYubUFSRy0+YXQoMCkuaXM8IEJ1aWx0aW5RdWV1ZSA+KCkgKQorCXsKKy8vCQlBVk1fT1NfVFJBQ0UgPDwgInF1ZXVlIDo+ICIgPDwgRU5WLm1BUkctPmF0KDApLnN0cigpIDw8IHN0ZDo6ZW5kbDsKKworCQlFTlYub3V0VkFMID0gRU5WLm1BUkctPmF0KDApLnRvX3B0cjwgQnVpbHRpblF1ZXVlID4oKS0+cG9wKCk7CisKKy8vCQlBVk1fT1NfVFJBQ0UgPDwgInF1ZXVlLT5wb3AgOj4gIiA8PCBFTlYubUFSRy0+YXQoMCkuc3RyKCkgPDwgc3RkOjplbmRsOworCX0KKworCXJldHVybiggRU5WLm91dFZBTC52YWxpZCgpICk7Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vIEJVRkZFUiBFTVBUWQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgQXZtUHJpbWl0aXZlX0VNUFRZOjpzZXZhbChFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJaWYoIEVOVi5tQVJHLT5hdCgwKS5pczwgQmFzZUJ1ZmZlckZvcm0gPigpICkKKwl7CisJCUVOVi5vdXRWQUwgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oCisJCQkJRU5WLm1BUkctPmF0KDApLnRvX3B0cjwgQmFzZUJ1ZmZlckZvcm0gPigpLT5lbXB0eSgpICk7CisJfQorCisJZWxzZSBpZiggRU5WLm1BUkctPmF0KDApLmlzPCBCdWlsdGluQ29sbGVjdGlvbiA+KCkgKQorCXsKKwkJRU5WLm91dFZBTCA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbigKKwkJCQlFTlYubUFSRy0+YXQoMCkudG9fcHRyPCBCdWlsdGluQ29sbGVjdGlvbiA+KCktPmVtcHR5KCkgKTsKKwl9CisKKwllbHNlCisJeworCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCTw8ICJVbmV4cGVjdGVkIGEgTk9OLUJVSUxUSU4tQ09MTEVDVElPTiBmb3IgdGhlIHZhbHVlIDw8ICIKKwkJCQk8PCBFTlYubUFSRy0+YXQoMCkuc3RyKCkgPDwgIiA+PiAhISEiCisJCQkJPDwgU0VORF9FWElUOworCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gQlVGRkVSIE5PTkVNUFRZCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBBdm1QcmltaXRpdmVfTk9ORU1QVFk6OnNldmFsKEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlpZiggRU5WLm1BUkctPmF0KDApLmlzPCBCYXNlQnVmZmVyRm9ybSA+KCkgKQorCXsKKwkJRU5WLm91dFZBTCA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbigKKwkJCQlFTlYubUFSRy0+YXQoMCkudG9fcHRyPCBCYXNlQnVmZmVyRm9ybSA+KCktPm5vbmVtcHR5KCkgKTsKKwl9CisKKwllbHNlIGlmKCBFTlYubUFSRy0+YXQoMCkuaXM8IEJ1aWx0aW5Db2xsZWN0aW9uID4oKSApCisJeworCQlFTlYub3V0VkFMID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKAorCQkJCUVOVi5tQVJHLT5hdCgwKS50b19wdHI8IEJ1aWx0aW5Db2xsZWN0aW9uID4oKS0+bm9uZW1wdHkoKSApOworCX0KKworCWVsc2UKKwl7CisJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJPDwgIlVuZXhwZWN0ZWQgYSBOT04tQlVJTFRJTi1DT0xMRUNUSU9OIGZvciB0aGUgdmFsdWUgPDwgIgorCQkJCTw8IEVOVi5tQVJHLT5hdCgwKS5zdHIoKSA8PCAiID4+ICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLyBCVUZGRVIgU0lOR0xFVE9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBBdm1QcmltaXRpdmVfU0lOR0xFVE9OOjpzZXZhbChFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJaWYoIEVOVi5tQVJHLT5hdCgwKS5pczwgQmFzZUJ1ZmZlckZvcm0gPigpICkKKwl7CisJCUVOVi5vdXRWQUwgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oCisJCQkJRU5WLm1BUkctPmF0KDApLnRvX3B0cjwgQmFzZUJ1ZmZlckZvcm0gPigpLT5zaW5nbGV0b24oKSApOworCX0KKworCWVsc2UgaWYoIEVOVi5tQVJHLT5hdCgwKS5pczwgQnVpbHRpbkNvbGxlY3Rpb24gPigpICkKKwl7CisJCUVOVi5vdXRWQUwgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oCisJCQkJRU5WLm1BUkctPmF0KDApLnRvX3B0cjwgQnVpbHRpbkNvbGxlY3Rpb24gPigpLT5zaW5nbGV0b24oKSApOworCX0KKworCWVsc2UKKwl7CisJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJPDwgIlVuZXhwZWN0ZWQgYSBOT04tQlVJTFRJTi1DT0xMRUNUSU9OIGZvciB0aGUgdmFsdWUgPDwgIgorCQkJCTw8IEVOVi5tQVJHLT5hdCgwKS5zdHIoKSA8PCAiID4+ICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLyBCVUZGRVIgUE9QVUxBVEVECisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBBdm1QcmltaXRpdmVfUE9QVUxBVEVEOjpzZXZhbChFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJaWYoIEVOVi5tQVJHLT5hdCgwKS5pczwgQmFzZUJ1ZmZlckZvcm0gPigpICkKKwl7CisJCUVOVi5vdXRWQUwgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oCisJCQkJRU5WLm1BUkctPmF0KDApLnRvX3B0cjwgQmFzZUJ1ZmZlckZvcm0gPigpLT5wb3B1bGF0ZWQoKSApOworCX0KKworCWVsc2UgaWYoIEVOVi5tQVJHLT5hdCgwKS5pczwgQnVpbHRpbkNvbGxlY3Rpb24gPigpICkKKwl7CisJCUVOVi5vdXRWQUwgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oCisJCQkJRU5WLm1BUkctPmF0KDApLnRvX3B0cjwgQnVpbHRpbkNvbGxlY3Rpb24gPigpLT5wb3B1bGF0ZWQoKSApOworCX0KKworCWVsc2UKKwl7CisJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJPDwgIlVuZXhwZWN0ZWQgYSBOT04tQlVJTFRJTi1DT0xMRUNUSU9OIGZvciB0aGUgdmFsdWUgPDwgIgorCQkJCTw8IEVOVi5tQVJHLT5hdCgwKS5zdHIoKSA8PCAiID4+ICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLyBCVUZGRVIgRlVMTAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgQXZtUHJpbWl0aXZlX0ZVTEw6OnNldmFsKEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlpZiggRU5WLm1BUkctPmF0KDApLmlzPCBCYXNlQnVmZmVyRm9ybSA+KCkgKQorCXsKKwkJRU5WLm91dFZBTCA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbigKKwkJCQlFTlYubUFSRy0+YXQoMCkudG9fcHRyPCBCYXNlQnVmZmVyRm9ybSA+KCktPmZ1bGwoKSApOworCX0KKworCWVsc2UgaWYoIEVOVi5tQVJHLT5hdCgwKS5pczwgQnVpbHRpbkNvbGxlY3Rpb24gPigpICkKKwl7CisJCUVOVi5vdXRWQUwgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oCisJCQkJRU5WLm1BUkctPmF0KDApLnRvX3B0cjwgQnVpbHRpbkNvbGxlY3Rpb24gPigpLT5mdWxsKCkgKTsKKwl9CisKKwllbHNlCisJeworCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCTw8ICJVbmV4cGVjdGVkIGEgTk9OLUJVSUxUSU4tQ09MTEVDVElPTiBmb3IgdGhlIHZhbHVlIDw8ICIKKwkJCQk8PCBFTlYubUFSRy0+YXQoMCkuc3RyKCkgPDwgIiA+PiAhISEiCisJCQkJPDwgU0VORF9FWElUOworCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vIEJVRkZFUiBTSVpFCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBBdm1QcmltaXRpdmVfU0laRTo6c2V2YWwoRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCWlmKCBFTlYubUFSRy0+YXQoMCkuaXM8IEJhc2VCdWZmZXJGb3JtID4oKSApCisJeworCQlFTlYub3V0VkFMID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdJbnRlZ2VyKAorCQkJCUVOVi5tQVJHLT5hdCgwKS50b19wdHI8IEJhc2VCdWZmZXJGb3JtID4oKS0+c2l6ZSgpICk7CisJfQorCisJZWxzZSBpZiggRU5WLm1BUkctPmF0KDApLmlzPCBCdWlsdGluQ29sbGVjdGlvbiA+KCkgKQorCXsKKwkJRU5WLm91dFZBTCA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3SW50ZWdlcigKKwkJCQlFTlYubUFSRy0+YXQoMCkudG9fcHRyPCBCdWlsdGluQ29sbGVjdGlvbiA+KCktPnNpemUoKSApOworCX0KKworCWVsc2UKKwl7CisJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJPDwgIlVuZXhwZWN0ZWQgYSBOT04tQlVJTFRJTi1DT0xMRUNUSU9OIGZvciB0aGUgdmFsdWUgPDwgIgorCQkJCTw8IEVOVi5tQVJHLT5hdCgwKS5zdHIoKSA8PCAiID4+ICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gQlVGRkVSIENPTlRBSU5TCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBBdm1QcmltaXRpdmVfQ09OVEFJTlM6OnNldmFsKEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwkvKmlmKCBjb250YWluZXIuaXM8IEJhc2VCdWZmZXJGb3JtID4oKSApCisJeworCQlFTlYub3V0VkFMID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKAorCQkJCUVOVi5tQVJHLT5hdCgwKS50b19wdHI8IEJhc2VCdWZmZXJGb3JtID4oKS0+CisJCQkJCQljb250YWlucyggRU5WLm1BUkctPmF0KDEpICkgKTsKKwl9CisKKwllbHNlKi8gaWYoIEVOVi5tQVJHLT5hdCgwKS5pczwgQnVpbHRpbkNvbGxlY3Rpb24gPigpICkKKwl7CisJCUVOVi5vdXRWQUwgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oIEVOVi5tQVJHLT5hdCgwKS4KKwkJCQl0b19wdHI8IEJ1aWx0aW5Db2xsZWN0aW9uID4oKS0+Y29udGFpbnMoIEVOVi5tQVJHLT5hdCgxKSApICk7CisJfQorCisJZWxzZQorCXsKKwkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQk8PCAiVW5leHBlY3RlZCBhIE5PTi1CVUlMVElOLUNPTExFQ1RJT04gZm9yIHRoZSB2YWx1ZSA8PCAiCisJCQkJPDwgRU5WLm1BUkctPmF0KDApLnN0cigpIDw8ICIgPj4gISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vIEJVRkZFUiBJTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgQXZtUHJpbWl0aXZlX0lOOjpzZXZhbChFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJLyppZiggY29udGFpbmVyLmlzPCBCYXNlQnVmZmVyRm9ybSA+KCkgKQorCXsKKwkJRU5WLm91dFZBTCA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbigKKwkJCQlFTlYubUFSRy0+YXQoMSkudG9fcHRyPCBCYXNlQnVmZmVyRm9ybSA+KCktPgorCQkJCQkJY29udGFpbnMoIEVOVi5tQVJHLT5hdCgwKSApICk7CisJfQorCisJZWxzZSovIGlmKCBFTlYubUFSRy0+YXQoMSkuaXM8IEJ1aWx0aW5Db2xsZWN0aW9uID4oKSApCisJeworCQlFTlYub3V0VkFMID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKCBFTlYubUFSRy0+YXQoMSkuCisJCQkJdG9fcHRyPCBCdWlsdGluQ29sbGVjdGlvbiA+KCktPmNvbnRhaW5zKCBFTlYubUFSRy0+YXQoMCkgKSApOworCX0KKworCWVsc2UKKwl7CisJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJPDwgIlVuZXhwZWN0ZWQgYSBOT04tQlVJTFRJTi1DT0xMRUNUSU9OIGZvciB0aGUgdmFsdWUgPDwgIgorCQkJCTw8IEVOVi5tQVJHLT5hdCgxKS5zdHIoKSA8PCAiID4+ICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLyBCVUZGRVIgTk9USU4KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIEF2bVByaW1pdGl2ZV9OT1RJTjo6c2V2YWwoRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCS8qaWYoIGNvbnRhaW5lci5pczwgQmFzZUJ1ZmZlckZvcm0gPigpICkKKwl7CisJCUVOVi5vdXRWQUwgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oCisJCQkJISBFTlYubUFSRy0+YXQoMSkudG9fcHRyPCBCYXNlQnVmZmVyRm9ybSA+KCktPgorCQkJCQkJY29udGFpbnMoIEVOVi5tQVJHLT5hdCgwKSApICk7CisJfQorCisJZWxzZSovIGlmKCBFTlYubUFSRy0+YXQoMSkuaXM8IEJ1aWx0aW5Db2xsZWN0aW9uID4oKSApCisJeworCQlFTlYub3V0VkFMID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKCBub3QgRU5WLm1BUkctPmF0KDEpLgorCQkJCXRvX3B0cjwgQnVpbHRpbkNvbGxlY3Rpb24gPigpLT5jb250YWlucyggRU5WLm1BUkctPmF0KDApICkgKTsKKwl9CisKKwllbHNlCisJeworCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCTw8ICJVbmV4cGVjdGVkIGEgTk9OLUJVSUxUSU4tQ09MTEVDVElPTiBmb3IgdGhlIHZhbHVlIDw8ICIKKwkJCQk8PCBFTlYubUFSRy0+YXQoMSkuc3RyKCkgPDwgIiA+PiAhISEiCisJCQkJPDwgU0VORF9FWElUOworCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bUJ1ZmZlclByaW1pdGl2ZS5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bUJ1ZmZlclByaW1pdGl2ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ODMzYmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtQnVmZmVyUHJpbWl0aXZlLmgKQEAgLTAsMCArMSw1MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDI1IGphbnYuIDIwMTEKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBBVk1CVUZGRVJQUklNSVRJVkVfSF8KKyNkZWZpbmUgQVZNQlVGRkVSUFJJTUlUSVZFX0hfCisKKyNpbmNsdWRlIDxjb21wdXRlci9wcmltaXRpdmUvQmFzZUF2bVByaW1pdGl2ZS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworLy8gQlVGRkVSIE1BTkFHRU1FTlQKK0FWTV9QUklNSVRJVkVfUlVOX0NMQVNTKEFQUEVORCwgIEJhc2VBdm1QcmltaXRpdmUpCitBVk1fUFJJTUlUSVZFX1JVTl9DTEFTUyhSRU1PVkUsICBCYXNlQXZtUHJpbWl0aXZlKQorQVZNX1BSSU1JVElWRV9SVU5fQ0xBU1MoQ0xFQVIsICAgQmFzZUF2bVByaW1pdGl2ZSkKK0FWTV9QUklNSVRJVkVfUlVOX0NMQVNTKFJFU0laRSwgIEJhc2VBdm1QcmltaXRpdmUpCisKK0FWTV9QUklNSVRJVkVfUlVOX0NMQVNTKFBVU0gsICAgICAgICAgICAgQmFzZUF2bVByaW1pdGl2ZSkKK0FWTV9QUklNSVRJVkVfUlVOX0VWQUxfQ0xBU1MoQVNTSUdOX1RPUCwgQmFzZUF2bVByaW1pdGl2ZSkKK0FWTV9QUklNSVRJVkVfUlVOX0VWQUxfQ0xBU1MoVE9QLCAgICAgICAgQmFzZUF2bVByaW1pdGl2ZSkKK0FWTV9QUklNSVRJVkVfUlVOX0VWQUxfQ0xBU1MoUE9QLCAgICAgICAgQmFzZUF2bVByaW1pdGl2ZSkKK0FWTV9QUklNSVRJVkVfUlVOX0VWQUxfQ0xBU1MoUE9QX0ZST00sICAgQmFzZUF2bVByaW1pdGl2ZSkKKworCitBVk1fUFJJTUlUSVZFX0VWQUxfQ0xBU1MoRU1QVFksICAgICBCYXNlQXZtUHJpbWl0aXZlKQorQVZNX1BSSU1JVElWRV9FVkFMX0NMQVNTKE5PTkVNUFRZLCAgQmFzZUF2bVByaW1pdGl2ZSkKK0FWTV9QUklNSVRJVkVfRVZBTF9DTEFTUyhTSU5HTEVUT04sIEJhc2VBdm1QcmltaXRpdmUpCitBVk1fUFJJTUlUSVZFX0VWQUxfQ0xBU1MoUE9QVUxBVEVELCBCYXNlQXZtUHJpbWl0aXZlKQorQVZNX1BSSU1JVElWRV9FVkFMX0NMQVNTKEZVTEwsICAgICAgQmFzZUF2bVByaW1pdGl2ZSkKKworQVZNX1BSSU1JVElWRV9FVkFMX0NMQVNTKENPTlRBSU5TLCAgQmFzZUF2bVByaW1pdGl2ZSkKK0FWTV9QUklNSVRJVkVfRVZBTF9DTEFTUyhJTiwgIAkJIEJhc2VBdm1QcmltaXRpdmUpCitBVk1fUFJJTUlUSVZFX0VWQUxfQ0xBU1MoTk9USU4sICAgICBCYXNlQXZtUHJpbWl0aXZlKQorCitBVk1fUFJJTUlUSVZFX0VWQUxfQ0xBU1MoU0laRSwgICAgICBCYXNlQXZtUHJpbWl0aXZlKQorCisKK30KKworI2VuZGlmIC8qIEFWTUJVRkZFUlBSSU1JVElWRV9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bUNvbW11bmljYXRpb25GYWN0b3J5LmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1Db21tdW5pY2F0aW9uRmFjdG9yeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAyMjFiYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1Db21tdW5pY2F0aW9uRmFjdG9yeS5jcHAKQEAgLTAsMCArMSwxNTMyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4NCisgKg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDcmVhdGVkIG9uOiAyNyBvY3QuIDIwMTANCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcg0KKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlICJBdm1Db21tdW5pY2F0aW9uRmFjdG9yeS5oIg0KKw0KKyNpbmNsdWRlIDxmbWwvY29tbW9uL01vZGlmaWVyRWxlbWVudC5oPg0KKw0KKyNpbmNsdWRlIDxjb21wdXRlci9FdmFsdWF0aW9uRW52aXJvbm1lbnQuaD4NCisjaW5jbHVkZSA8Y29tcHV0ZXIvRXhlY3V0aW9uRGF0YUZhY3RvcnkuaD4NCisjaW5jbHVkZSA8Y29tcHV0ZXIvRXhlY3V0aW9uRW52aXJvbm1lbnQuaD4NCisNCisjaW5jbHVkZSA8Y29tcHV0ZXIvaW5zdHJ1Y3Rpb24vSW5zdHJ1Y3Rpb25FbnZpcm9ubWVudC5oPg0KKw0KKyNpbmNsdWRlIDxmbWwvYnVmZmVyL0Jhc2VCdWZmZXJGb3JtLmg+DQorI2luY2x1ZGUgPGZtbC9idWZmZXIvQnJvYWRjYXN0QnVmZmVyLmg+DQorDQorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVMaWIuaD4NCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZkJ1ZmZlci5oPg0KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mQ29ubmVjdC5oPg0KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mRGF0YS5oPg0KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mTWFjaGluZS5oPg0KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mUG9ydC5oPg0KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9Sb3V0ZXIuaD4NCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvUm91dGluZ0RhdGEuaD4NCisNCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQXZtQ29kZS5oPg0KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9TdGF0ZW1lbnRDb25zdHJ1Y3Rvci5oPg0KKw0KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvQ29tUHJvdG9jb2wuaD4NCisNCisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yTWFuYWdlci5oPg0KKw0KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25Db25maWd1cmF0aW9uLmg+DQorI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkRhdGEuaD4NCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uU3luY2hyb25pemF0aW9uUG9pbnQuaD4NCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvTWVzc2FnZS5oPg0KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lTGliLmg+DQorI2luY2x1ZGUgPGZtbC9ydW50aW1lL1J1bnRpbWVJRC5oPg0KKw0KKyNpbmNsdWRlIDxmbWwvd29ya2Zsb3cvVW5pRm9ybUlkZW50aWZpZXIuaD4NCisNCisNCituYW1lc3BhY2Ugc2VwDQorew0KKw0KKw0KKy8qKg0KKyAqIFNFQVJDSCBST1VUSU5HIERBVEENCisgKi8NCitjb25zdCBSb3V0aW5nRGF0YSAmIEF2bUNvbW11bmljYXRpb25GYWN0b3J5OjpzZWFyY2hJbnB1dFJvdXRpbmdEYXRhKA0KKwkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQsIEluc3RhbmNlT2ZQb3J0ICAqIGFQb3J0LA0KKwkJUnVudGltZUlEICYgYVJvdXRpbmdSSUQpDQorew0KKwlBVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoIGFQb3J0LT5nZXRNb2RpZmllcigpLmhhc0RpcmVjdGlvbklucHV0KCkgKQ0KKwkJCTw8ICJBdm1Db21tdW5pY2F0aW9uRmFjdG9yeTo6c2VhcmNoSW5wdXRSb3V0aW5nRGF0YSA6PiAiDQorCQkJCSJVbmV4cGVjdGVkIG5vbi1JTlBVVCBwb3J0ICINCisJCQk8PCBhUG9ydC0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiICEhISINCisJCQk8PCBTRU5EX0VYSVQ7DQorDQorCWlmKCBhUG9ydC0+aGFzSW5wdXRSb3V0aW5nRGF0YSgpICkNCisJew0KKwkJYVJvdXRpbmdSSUQgPSBhUG9ydC0+Z2V0SW5wdXRSb3V0aW5nRGF0YSgpLmdldFJ1bnRpbWVSSUQoKTsNCisNCisJCXJldHVybiggYVBvcnQtPmdldElucHV0Um91dGluZ0RhdGEoKSApOw0KKwl9DQorCWVsc2UgaWYoIGFQb3J0LT5pc1BvcnQoKSApDQorCXsNCisJCWlmKCBhUG9ydC0+aGFzUnVudGltZUNvbnRhaW5lclJJRCgpICkNCisJCXsNCisJCQlhUm91dGluZ1JJRCA9IGFQb3J0LT5nZXRSdW50aW1lQ29udGFpbmVyUklEKCk7DQorCQl9DQorCQllbHNlIGlmKCBhUm91dGluZ1JJRC52YWxpZCgpICkNCisJCXsNCisJCQlhUm91dGluZ1JJRCA9IGFSb3V0aW5nUklELmdldENvbW11bmljYXRvcihhUG9ydCk7DQorCQl9DQorCX0NCisJZWxzZSBpZiggYVBvcnQtPmlzU2lnbmFsKCkgKQ0KKwl7DQorCQl3aGlsZSggYVJvdXRpbmdSSUQudmFsaWQoKQ0KKwkJCSYmIChub3QgYW5FRC5nZXRSdW50aW1lKGFSb3V0aW5nUklEKS5oYXNSb3V0ZXIoKSkgKQ0KKwkJew0KKwkJCWFSb3V0aW5nUklEID0gYVJvdXRpbmdSSUQuZ2V0UFJJRCgpOw0KKwkJfQ0KKwl9DQorDQorCWlmKCBhUm91dGluZ1JJRC52YWxpZCgpICkNCisJew0KKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKA0KKwkJCWFuRUQuZ2V0UnVudGltZShhUm91dGluZ1JJRCkuaGFzUm91dGVyKCkgKQ0KKwkJCQk8PCAiU2VhcmNoaW5nIElucHV0IFJvdXRpbmdEYXRhIG1lc3NhZ2UgZXJyb3IgOiA8PCAiDQorCQkJCTw8IGFSb3V0aW5nUklELmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkNCisJCQkJPDwgIiA+PiBkb2Vzbid0IGhhdmUgcm91dGVyICEhISINCisJCQkJPDwgU0VORF9FWElUOw0KKw0KKw0KKwkJY29uc3QgUm91dGluZ0RhdGEgJiBhUm91dGluZ0RhdGEgPSBhbkVELmdldFJ1bnRpbWUoYVJvdXRpbmdSSUQpLg0KKwkJCQlnZXRSb3V0ZXIoKS5nZXRJbnB1dFJvdXRpbmcoIGFQb3J0LT5nZXRSb3V0ZU9mZnNldCgpICk7DQorCQlpZiggYVJvdXRpbmdEYXRhICE9IE5VTEwgKQ0KKwkJew0KKy8vCQkJYVJvdXRpbmdSSUQgPSAoIGFQb3J0LT5pc1Zpc2liaWxpdHlQdWJsaWMoKSApPw0KKy8vCQkJCQlhUm91dGluZ1JJRC5nZXRQUklEKCkgOiBhUm91dGluZ1JJRDsNCisJCQlhUm91dGluZ1JJRCA9IGFSb3V0aW5nUklELmdldENvbW11bmljYXRvcigNCisJCQkJCWFSb3V0aW5nRGF0YS5nZXRNYWNoaW5lKCkgKTsNCisJCX0NCisNCisJCXJldHVybiggYVJvdXRpbmdEYXRhICk7DQorCX0NCisNCisJcmV0dXJuKCBSb3V0aW5nRGF0YTo6X05VTExfICk7DQorfQ0KKw0KKw0KK2NvbnN0IFJvdXRpbmdEYXRhICYgQXZtQ29tbXVuaWNhdGlvbkZhY3Rvcnk6OnNlYXJjaE91dHB1dFJvdXRpbmdEYXRhKA0KKwkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQsIEluc3RhbmNlT2ZQb3J0ICAqIGFQb3J0LA0KKwkJUnVudGltZUlEICYgYVJvdXRpbmdSSUQpDQorew0KKwlBVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoIGFQb3J0LT5nZXRNb2RpZmllcigpLmhhc0RpcmVjdGlvbk91dHB1dCgpICkNCisJCQk8PCAiQXZtQ29tbXVuaWNhdGlvbkZhY3Rvcnk6OnNlYXJjaE91dHB1dFJvdXRpbmdEYXRhIDo+ICINCisJCQkJIlVuZXhwZWN0ZWQgbm9uLU9VVFBVVCBwb3J0ICINCisJCQk8PCBhUG9ydC0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiICEhISINCisJCQk8PCBTRU5EX0VYSVQ7DQorDQorCWlmKCBhUG9ydC0+aGFzT3V0cHV0Um91dGluZ0RhdGEoKSApDQorCXsNCisJCWFSb3V0aW5nUklEID0gYVBvcnQtPmdldE91dHB1dFJvdXRpbmdEYXRhKCkuZ2V0UnVudGltZVJJRCgpOw0KKwkJcmV0dXJuKCBhUG9ydC0+Z2V0T3V0cHV0Um91dGluZ0RhdGEoKSApOw0KKwl9DQorCWVsc2UgaWYoIGFQb3J0LT5pc1BvcnQoKSApDQorCXsNCisJCWlmKCBhUG9ydC0+aGFzUnVudGltZUNvbnRhaW5lclJJRCgpICkNCisJCXsNCisJCQlhUm91dGluZ1JJRCA9IGFQb3J0LT5nZXRSdW50aW1lQ29udGFpbmVyUklEKCk7DQorCQl9DQorCQllbHNlIGlmKCBhUm91dGluZ1JJRC52YWxpZCgpICkNCisJCXsNCisJCQlhUm91dGluZ1JJRCA9IGFSb3V0aW5nUklELmdldENvbW11bmljYXRvcihhUG9ydCk7DQorCQl9DQorCX0NCisJZWxzZSBpZiggYVBvcnQtPmlzU2lnbmFsKCkgKQ0KKwl7DQorCQl3aGlsZSggYVJvdXRpbmdSSUQudmFsaWQoKQ0KKwkJCSYmIChub3QgYW5FRC5nZXRSdW50aW1lKGFSb3V0aW5nUklEKS5oYXNSb3V0ZXIoKSkgKQ0KKwkJew0KKwkJCWFSb3V0aW5nUklEID0gYVJvdXRpbmdSSUQuZ2V0UFJJRCgpOw0KKwkJfQ0KKwl9DQorDQorCWlmKCBhUm91dGluZ1JJRC52YWxpZCgpICkNCisJew0KKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKA0KKwkJCWFuRUQuZ2V0UnVudGltZShhUm91dGluZ1JJRCkuaGFzUm91dGVyKCkgKQ0KKwkJCQk8PCAiU2VhcmNoaW5nIE91dHB1dCBSb3V0aW5nRGF0YSBtZXNzYWdlIGVycm9yIDogPDwgIg0KKwkJCQk8PCBhUm91dGluZ1JJRC5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpDQorCQkJCTw8ICIgPj4gZG9lc24ndCBoYXZlIHJvdXRlciAhISEiDQorCQkJCTw8IFNFTkRfRVhJVDsNCisNCisNCisJCWNvbnN0IFJvdXRpbmdEYXRhICYgYVJvdXRpbmdEYXRhID0gYW5FRC5nZXRSdW50aW1lKGFSb3V0aW5nUklEKS4NCisJCQkJZ2V0Um91dGVyKCkuZ2V0T3V0cHV0Um91dGluZyggYVBvcnQtPmdldFJvdXRlT2Zmc2V0KCkgKTsNCisJCWlmKCBhUm91dGluZ0RhdGEgIT0gTlVMTCApDQorCQl7DQorLy8JCQlhUm91dGluZ1JJRCA9ICggYVBvcnQtPmlzVmlzaWJpbGl0eVB1YmxpYygpICk/DQorLy8JCQkJCWFSb3V0aW5nUklELmdldFBSSUQoKSA6IGFSb3V0aW5nUklEOw0KKwkJCWFSb3V0aW5nUklEID0gYVJvdXRpbmdSSUQuZ2V0Q29tbXVuaWNhdG9yKA0KKwkJCQkJYVJvdXRpbmdEYXRhLmdldE1hY2hpbmUoKSApOw0KKwkJfQ0KKw0KKwkJcmV0dXJuKCBhUm91dGluZ0RhdGEgKTsNCisJfQ0KKw0KKwlyZXR1cm4oIFJvdXRpbmdEYXRhOjpfTlVMTF8gKTsNCit9DQorDQorDQorLyoNCisgKiBDSEVDSyBST1VUSU5HIElORk9STUFUSU9ODQorICovDQorYm9vbCBBdm1Db21tdW5pY2F0aW9uRmFjdG9yeTo6aXNSb3V0aW5nUHJvdG9jb2xFbnYoDQorCQlDT01QSUxFX0NPTlRFWFQgKiBhQ1RYLCBJbnN0YW5jZU9mUG9ydCAqIGFQb3J0KQ0KK3sNCisJcmV0dXJuKCBmYWxzZSApOw0KK30NCisNCitib29sIEF2bUNvbW11bmljYXRpb25GYWN0b3J5Ojppc1JvdXRpbmdQcm90b2NvbFJkdigNCisJCUNPTVBJTEVfQ09OVEVYVCAqIGFDVFgsIEluc3RhbmNlT2ZQb3J0ICogYVBvcnQpDQorew0KKwlyZXR1cm4oIGZhbHNlICk7DQorfQ0KKw0KKw0KKy8qDQorICogUE9QIE1FU1NBR0UNCisgKi8NCitib29sIEF2bUNvbW11bmljYXRpb25GYWN0b3J5Ojpwb3BNZXNzYWdlKA0KKwkJRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsIEluc3RhbmNlT2ZQb3J0ICogYVBvcnQpDQorew0KKwlSdW50aW1lSUQgYVJvdXRpbmdSSUQgPSBFTlYubUFSRy0+b3V0RUQtPm1SSUQ7DQorDQorCWNvbnN0IFJvdXRpbmdEYXRhICYgYVJvdXRpbmdEYXRhID0NCisJCQlzZWFyY2hJbnB1dFJvdXRpbmdEYXRhKEVOVi5tQVJHLT5vdXRFRCwgYVBvcnQsIGFSb3V0aW5nUklEKTsNCisNCisJaWYoIGFSb3V0aW5nRGF0YSAhPSBOVUxMICkNCisJew0KKwkJc3dpdGNoKCBhUm91dGluZ0RhdGEuZ2V0UHJvdG9jb2woKSApDQorCQl7DQorCQkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfRU5WSVJPTk1FTlRfS0lORDoNCisJCQl7DQorCQkJCWlmKCBFTlYubUFSRy0+b3V0RUQtPmdldFJ1bnRpbWUoYVJvdXRpbmdSSUQpLg0KKwkJCQkJCWlzRW52aXJvbm1lbnRFbmFibGVkQ29tbXVuaWNhdGlvbigpICkNCisJCQkJew0KKwkJCQkJcmV0dXJuKCBwb3BNZXNzYWdlX2Vudmlyb25tZW50KEVOViwgYVJvdXRpbmdSSUQsIGFSb3V0aW5nRGF0YSkgKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4oIGZhbHNlICk7DQorCQkJfQ0KKw0KKwkJCWNhc2UgQ29tUHJvdG9jb2w6OlBST1RPQ09MX1RSQU5TRkVSVF9LSU5EOiAvLyBpblJELT5oYXNBdHRhY2goKSApDQorCQkJew0KKwkJCQlyZXR1cm4oIHBvcE1lc3NhZ2VfdHJhbnNmZXJ0KEVOViwgYVJvdXRpbmdSSUQsIGFSb3V0aW5nRGF0YSkgKTsNCisJCQl9DQorDQorCQkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfQlVGRkVSX0tJTkQ6DQorCQkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfQlJPQURDQVNUX0tJTkQ6DQorCQkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfTVVMVElDQVNUX0tJTkQ6DQorCQkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfVU5JQ0FTVF9LSU5EOg0KKwkJCWNhc2UgQ29tUHJvdG9jb2w6OlBST1RPQ09MX0FOWUNBU1RfS0lORDoNCisJCQl7DQorCQkJCXJldHVybiggcG9wTWVzc2FnZV9idWZmZXIoRU5WLCBhUm91dGluZ1JJRCwgYVJvdXRpbmdEYXRhKSApOw0KKwkJCX0NCisNCisJCQljYXNlIENvbVByb3RvY29sOjpQUk9UT0NPTF9SRFZfS0lORDoNCisJCQljYXNlIENvbVByb3RvY29sOjpQUk9UT0NPTF9NVUxUSVJEVl9LSU5EOg0KKwkJCXsNCisJCQkJcmV0dXJuKCBwb3BNZXNzYWdlX3JkdihFTlYsIGFSb3V0aW5nUklELCBhUm91dGluZ0RhdGEpICk7DQorCQkJfQ0KKw0KKwkJCWNhc2UgQ29tUHJvdG9jb2w6OlBST1RPQ09MX1VOREVGSU5FRF9LSU5EOg0KKwkJCWRlZmF1bHQ6DQorCQkJew0KKwkJCQlBVk1fT1NfRVhJVCggRkFJTEVEICkNCisJCQkJCQk8PCAicG9wTWVzc2FnZSA6PiBVbmtub3duIFByb3RvY29sIGZvciBpbnRlcmFjdGlvbiA8PCAiDQorCQkJCQkJPDwgYVBvcnQtPnN0ckNvbVBvaW50TmF0dXJlKCkgPDwgIjogIg0KKwkJCQkJCTw8IGFQb3J0LT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8ICIgPj4gJiA8PCBtYWNoaW5lOiAiDQorCQkJCQkJPDwgYVJvdXRpbmdSSUQuZ2V0SW5zdGFuY2UoKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQ0KKwkJCQkJCTw8ICIgPj4gaW4gcnVubmluZyBjb250ZXh0OiA8PCAiDQorCQkJCQkJPDwgRU5WLm1BUkctPm91dEVELT5tUklELmdldEluc3RhbmNlKCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkNCisJCQkJCQk8PCAiID4+ICEhISINCisJCQkJCQk8PCBTRU5EX0VYSVQ7DQorDQorCQkJCXJldHVybiggZmFsc2UgKTsNCisJCQl9DQorCQl9DQorCX0NCisJZWxzZQ0KKwl7DQorCQlBVk1fT1NfRVhJVCggRkFJTEVEICkNCisJCQkJPDwgInBvcE1lc3NhZ2UgOj4gVW5mb3VuZCBSb3V0aW5nRGF0YSBmb3IgaW50ZXJhY3Rpb24gPDwgIg0KKwkJCQk8PCBhUG9ydC0+c3RyQ29tUG9pbnROYXR1cmUoKSA8PCAiOiAiDQorCQkJCTw8IGFQb3J0LT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8ICIgPj4gJiA8PCBtYWNoaW5lOiAiDQorCQkJCTw8IGFSb3V0aW5nUklELmdldEluc3RhbmNlKCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkNCisJCQkJPDwgIiA+PiBpbiBydW5uaW5nIGNvbnRleHQ6IDw8ICINCisJCQkJPDwgRU5WLm1BUkctPm91dEVELT5tUklELmdldEluc3RhbmNlKCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkNCisJCQkJPDwgIiA+PiAhISEiDQorCQkJCTw8IFNFTkRfRVhJVDsNCisJfQ0KKw0KKwlyZXR1cm4oIGZhbHNlICk7DQorfQ0KKw0KKw0KK2Jvb2wgQXZtQ29tbXVuaWNhdGlvbkZhY3Rvcnk6OnBvcE1lc3NhZ2VfZW52aXJvbm1lbnQoRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsDQorCQljb25zdCBSdW50aW1lSUQgJiBhUm91dGluZ1JJRCwgY29uc3QgUm91dGluZ0RhdGEgJiBhUm91dGluZ0RhdGEsDQorCQlhdm1fc2l6ZV90IGZpcnN0UGFyYW1ldGVyT2Zmc2V0IC8qPSAxKi8pDQorew0KKwlCRkNvZGUgYVRyYWNlSW5wdXQoT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9JTlBVVF9FTlYsIEVOVi5tQVJHLT5hdCgwKSk7DQorDQorCWJvb2wgYWxsU3VjY2VzcyA9IHRydWU7DQorDQorCWlmKCBFTlYuaW5DT0RFLT5wb3B1bGF0ZWQoKSApDQorCXsNCisJCUVOVi5tQVJHLT5vdXRFRC5tYWtlTW9kaWZpYWJsZVBhcmFtVGFibGUoKTsNCisNCisJCUluc3RhbmNlT2ZQb3J0ICogYVBvcnQgPSBFTlYubUFSRy0+YXQoMCkudG9fcHRyPCBJbnN0YW5jZU9mUG9ydCA+KCk7DQorCQlhdm1fc2l6ZV90IG9mZnNldCA9IDA7DQorDQorCQlJbnN0YW5jZU9mRGF0YSAqIGFWYXIgPSBOVUxMOw0KKwkJQkYgYU5ld1N5bWJvbGljQ29uc3RhbnQ7DQorCQlCRkxpc3QgcGFyYW1MaXN0Ow0KKw0KKwkJZm9yKCBFTlYubUFSRy0+YmVnaW4oZmlyc3RQYXJhbWV0ZXJPZmZzZXQpIDsgRU5WLm1BUkctPmhhc05leHQoKSA7DQorCQkJCUVOVi5tQVJHLT5uZXh0KCkgLCArK29mZnNldCApDQorCQl7DQorCQkJcGFyYW1MaXN0LmNsZWFyKCk7DQorDQorCQkJYVZhciA9IEVOVi5tQVJHLT5jdXJyZW50KCkudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCk7DQorDQorCQkJYU5ld1N5bWJvbGljQ29uc3RhbnQgPSBFTlYuY3JlYXRlTmV3RnJlc2hQYXJhbSgNCisJCQkJCUVOVi5tQVJHLT5vdXRFRC0+bVJJRCwNCisJCQkJCWFQb3J0LT5nZXRQYXJhbWV0ZXJUeXBlKG9mZnNldCksDQorCQkJCQlhVmFyLCBwYXJhbUxpc3QpOw0KKw0KKwkJCWlmKCBub3QgRU5WLnNldFJ2YWx1ZShFTlYubUFSRy0+b3V0RUQsIGFWYXIsIGFOZXdTeW1ib2xpY0NvbnN0YW50KSApDQorCQkJew0KKwkJCQlhbGxTdWNjZXNzID0gZmFsc2U7DQorDQorCQkJCWJyZWFrOw0KKwkJCX0NCisNCisJCQlFTlYubUFSRy0+b3V0RUQuYXBwZW5kUGFyYW1ldGVycyggcGFyYW1MaXN0ICk7DQorDQorCQkJYVRyYWNlSW5wdXQtPmFwcGVuZCggYU5ld1N5bWJvbGljQ29uc3RhbnQgKTsNCisJCX0NCisJfQ0KKw0KKwlpZiggYWxsU3VjY2VzcyApDQorCXsNCisJCUV4ZWN1dGlvbkRhdGFGYWN0b3J5OjphcHBlbmRJT0VsZW1lbnRUcmFjZShFTlYubUFSRy0+b3V0RUQsDQorCQkJCUJGKCBuZXcgRXhlY3V0aW9uQ29uZmlndXJhdGlvbigNCisJCQkJCQlFTlYubUFSRy0+b3V0RUQtPm1SSUQsIGFUcmFjZUlucHV0KSApICk7DQorDQorCQlFTlYub3V0RURTLmFwcGVuZCggRU5WLm1BUkctPm91dEVEICk7DQorDQorCQlyZXR1cm4oIHRydWUgKTsNCisJfQ0KKwllbHNlDQorCXsNCisJCXJldHVybiggZmFsc2UgKTsNCisJfQ0KK30NCisNCisNCitib29sIEF2bUNvbW11bmljYXRpb25GYWN0b3J5Ojpwb3BNZXNzYWdlX3RyYW5zZmVydChFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOViwNCisJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSb3V0aW5nUklELCBjb25zdCBSb3V0aW5nRGF0YSAmIGFSb3V0aW5nRGF0YSkNCit7DQorCXJldHVybiggZmFsc2UgKTsNCit9DQorDQorDQorYm9vbCBBdm1Db21tdW5pY2F0aW9uRmFjdG9yeTo6cG9wTWVzc2FnZV9idWZmZXIoRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsDQorCQljb25zdCBSdW50aW1lSUQgJiBhUm91dGluZ1JJRCwgY29uc3QgUm91dGluZ0RhdGEgJiBhUm91dGluZ0RhdGEpDQorew0KK0FWTV9JRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfQ09NTVVOSUNBVElPTiApDQorCUFWTV9PU19UUkFDRSA8PCBUQUIgPDwgImJlZ2luICINCisJCQkiQXZtQ29tbXVuaWNhdGlvbkZhY3Rvcnk6OnBvcE1lc3NhZ2VfYnVmZmVyIiA8PCBzdGQ6OmVuZGw7DQorDQorCUVOVi5tQVJHLT5vdXRFRC0+Z2V0UnVudGltZShhUm91dGluZ1JJRCkudG9TdHJlYW1EYXRhKA0KKwkJCUVOVi5tQVJHLT5vdXRFRCwgQVZNX09TX1RSQUNFIDw8IElOQ1IyX0lOREVOVCk7DQorCUFWTV9PU19UUkFDRSA8PCBERUNSMl9JTkRFTlQ7DQorQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9DT01NVU5JQ0FUSU9OICkNCisNCisJTWVzc2FnZSBwb3BNc2c7DQorDQorCVJ1bnRpbWVJRCBidWZmZXJEZWNsUklEID0gYVJvdXRpbmdSSUQ7DQorDQorCUxpc3RPZkluc3RhbmNlT2ZCdWZmZXI6OmNvbnN0X2l0ZXJhdG9yIGl0QnVmZmVyID0NCisJCQlhUm91dGluZ0RhdGEuZ2V0QnVmZmVySW5zdGFuY2UoKS5iZWdpbigpOw0KKwlMaXN0T2ZJbnN0YW5jZU9mQnVmZmVyOjpjb25zdF9pdGVyYXRvciBlbmRCdWZmZXIgPQ0KKwkJCWFSb3V0aW5nRGF0YS5nZXRCdWZmZXJJbnN0YW5jZSgpLmVuZCgpOw0KKwlmb3IoIDsgaXRCdWZmZXIgIT0gZW5kQnVmZmVyIDsgKytpdEJ1ZmZlciApDQorCXsNCisJCWJ1ZmZlckRlY2xSSUQgPSBFTlYubUFSRy0+b3V0RUQtPmdldFJ1bnRpbWVDb250YWluZXJSSUQoDQorCQkJCUVOVi5tQVJHLT5vdXRFRC0+bVJJRCwgKCppdEJ1ZmZlcikgKTsNCisNCisJCWlmKCBidWZmZXJEZWNsUklELnZhbGlkKCkgKQ0KKwkJew0KKwkJCWlmKCBFTlYubUFSRy0+b3V0RUQtPmdldFJ1bnRpbWUoYnVmZmVyRGVjbFJJRCkuDQorCQkJCQlnZXRCdWZmZXIoICppdEJ1ZmZlciApLm5vbmVtcHR5KCkgKQ0KKwkJCXsNCisJCQkJQmFzZUJ1ZmZlckZvcm0gJiBiYmYgPSBFTlYubUFSRy0+b3V0RUQuZ2V0V3JpdGFibGVSdW50aW1lKA0KKwkJCQkJCWJ1ZmZlckRlY2xSSUQgKS5nZXRXcml0YWJsZUJ1ZmZlciggKml0QnVmZmVyKTsNCisNCisJCQkJcG9wTXNnID0gYmJmLnBvcChhUm91dGluZ0RhdGEuZ2V0TUlEKCksIEVOVi5tQVJHLT5vdXRFRC0+bVJJRCk7DQorDQorCQkJCWlmKCBwb3BNc2cudmFsaWQoKSApDQorCQkJCXsNCisJCQkJCWJyZWFrOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCWlmKCBwb3BNc2cudmFsaWQoKSApDQorCXsNCisJCUJGQ29kZSBhVHJhY2VJbnB1dChPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0lOUFVULCBFTlYubUFSRy0+YXQoMCkpOw0KKw0KKwkJTWVzc2FnZTo6Y29uc3RfaXRlcmF0b3IgaXRWYWwgPSBwb3BNc2cuZ2V0UGFyYW1ldGVycygpLmJlZ2luKCk7DQorCQlNZXNzYWdlOjpjb25zdF9pdGVyYXRvciBlbmRWYWwgPSBwb3BNc2cuZ2V0UGFyYW1ldGVycygpLmVuZCgpOw0KKw0KKwkJLy8gV2UgaGF2ZSB0byBpZ25vcmUgdGhlIDw8IFBvcnQgPj4gSW5zdGFuY2VPZlBvcnQNCisJCWZvciggRU5WLm1BUkctPmJlZ2luKDEpIDsgKGl0VmFsICE9IGVuZFZhbCkgJiYgRU5WLm1BUkctPmhhc05leHQoKSA7DQorCQkJCUVOVi5tQVJHLT5uZXh0KCkgLCArK2l0VmFsICkNCisJCXsNCisJCQlpZiggRU5WLnNldFJ2YWx1ZShFTlYubUFSRy0+b3V0RUQsDQorCQkJCQlFTlYubUFSRy0+Y3VycmVudCgpLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpLCAqaXRWYWwpICkNCisJCQl7DQorCQkJCWFUcmFjZUlucHV0LT5hcHBlbmQoICppdFZhbCApOw0KKw0KKwkJCX0NCisJCQllbHNlDQorCQkJew0KKwkJCQlyZXR1cm4oIGZhbHNlICk7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJRXhlY3V0aW9uRGF0YUZhY3Rvcnk6OmFwcGVuZElPRWxlbWVudFRyYWNlKEVOVi5tQVJHLT5vdXRFRCwNCisJCQkJQkYoIG5ldyBFeGVjdXRpb25Db25maWd1cmF0aW9uKA0KKwkJCQkJCUVOVi5tQVJHLT5vdXRFRC0+bVJJRCwgYVRyYWNlSW5wdXQsIHBvcE1zZykgKSApOw0KKw0KKwkJRU5WLm91dEVEUy5hcHBlbmQoIEVOVi5tQVJHLT5vdXRFRCApOw0KKw0KK0FWTV9JRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfQ09NTVVOSUNBVElPTiApDQorCUVOVi5tQVJHLT5vdXRFRC0+Z2V0UnVudGltZShhUm91dGluZ1JJRCkudG9TdHJlYW1EYXRhKA0KKwkJCUVOVi5tQVJHLT5vdXRFRCwgQVZNX09TX1RSQUNFIDw8IElOQ1IyX0lOREVOVCk7DQorCUFWTV9PU19UUkFDRSA8PCBERUNSMl9JTkRFTlRfVEFCIDw8ICJlbmQgIg0KKwkJCSJBdm1Db21tdW5pY2F0aW9uRmFjdG9yeTo6cG9wTWVzc2FnZV9idWZmZXIiIDw8IHN0ZDo6ZW5kbDsNCitBVk1fRU5ESUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX0NPTU1VTklDQVRJT04gKQ0KKw0KKwkJcmV0dXJuKCB0cnVlICk7DQorCX0NCisJZWxzZQ0KKwl7DQorCQlyZXR1cm4oIGZhbHNlICk7DQorCX0NCit9DQorDQorDQorYm9vbCBBdm1Db21tdW5pY2F0aW9uRmFjdG9yeTo6cG9wTWVzc2FnZV9yZHYoRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsDQorCQljb25zdCBSdW50aW1lSUQgJiBhUm91dGluZ1JJRCwgY29uc3QgUm91dGluZ0RhdGEgJiBhUm91dGluZ0RhdGEpDQorew0KKwlNZXNzYWdlIGluTXNnKCBSdW50aW1lSUQ6OlJFRl9OVUxMLA0KKwkJCUVOVi5tQVJHLT5vdXRFRC0+bVJJRCwgYVJvdXRpbmdEYXRhLmdldFBvcnQoKSApOw0KKwlpbk1zZy5zZXRNSUQoIGFSb3V0aW5nRGF0YS5nZXRNSUQoKSApOw0KKw0KKwkvLyBXZSBoYXZlIHRvIGlnbm9yZSB0aGUgPDwgUG9ydCA+PiBJbnN0YW5jZU9mUG9ydA0KKwlmb3IoIEVOVi5tQVJHLT5iZWdpbigxKSA7IEVOVi5tQVJHLT5oYXNOZXh0KCkgOyBFTlYubUFSRy0+bmV4dCgpICkNCisJew0KKwkJaW5Nc2cuYXBwZW5kUGFyYW1ldGVyKCBFTlYubUFSRy0+Y3VycmVudCgpICk7DQorCX0NCisNCisJRU5WLm1BUkctPm91dEVELnB1c2hFeGVjU3luY1BvaW50KCBuZXcgRXhlY3V0aW9uU3luY2hyb25pemF0aW9uUG9pbnQoDQorCQkJQVdBSVRJTkdfUE9JTlRfSU5QVVRfTkFUVVJFLCBhUm91dGluZ1JJRCwgYVJvdXRpbmdEYXRhLCBpbk1zZykgKTsNCisNCisJRU5WLmFwcGVuZFN5bmNfbXdzZXRBRUVTKEVOVi5tQVJHLT5vdXRFRCwgQUVFU19XQUlUSU5HX0lOQ09NX1JEVik7DQorDQorCXJldHVybiggdHJ1ZSApOw0KK30NCisNCisNCisvKg0KKyAqIFBPUCBNRVNTQUdFIEZST00NCisgKi8NCisNCitib29sIEF2bUNvbW11bmljYXRpb25GYWN0b3J5Ojpwb3BNZXNzYWdlRnJvbShFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikNCit7DQorCVJ1bnRpbWVJRCBhUm91dGluZ1JJRCA9IEVOVi5tQVJHLT5vdXRFRC0+bVJJRDsNCisJSW5zdGFuY2VPZlBvcnQgKiBhUG9ydCA9IEVOVi5tQVJHLT5hdCgwKS50b19wdHI8IEluc3RhbmNlT2ZQb3J0ID4oKTsNCisNCisJY29uc3QgUm91dGluZ0RhdGEgJiBhUm91dGluZ0RhdGEgPQ0KKwkJCXNlYXJjaElucHV0Um91dGluZ0RhdGEoRU5WLm1BUkctPm91dEVELCBhUG9ydCwgYVJvdXRpbmdSSUQpOw0KKw0KKwlSdW50aW1lSUQgYVNlbmRlclJJRCA9IEVOVi5tQVJHLT5hdCgxKS5iZlJJRCgpOw0KKw0KKwlpZiggYVJvdXRpbmdEYXRhICE9IE5VTEwgKQ0KKwl7DQorCQlzd2l0Y2goIGFSb3V0aW5nRGF0YS5nZXRQcm90b2NvbCgpICkNCisJCXsNCisJCQljYXNlIENvbVByb3RvY29sOjpQUk9UT0NPTF9FTlZJUk9OTUVOVF9LSU5EOg0KKwkJCXsNCisJCQkJaWYoIEVOVi5tQVJHLT5vdXRFRC0+Z2V0UnVudGltZShhUm91dGluZ1JJRCkuDQorCQkJCQkJaXNFbnZpcm9ubWVudEVuYWJsZWRDb21tdW5pY2F0aW9uKCkgKQ0KKwkJCQl7DQorCQkJCQlyZXR1cm4oIHBvcE1lc3NhZ2VfZW52aXJvbm1lbnQoRU5WLA0KKwkJCQkJCQlhUm91dGluZ1JJRCwgYVJvdXRpbmdEYXRhKSApOw0KKwkJCQl9DQorCQkJCXJldHVybiggZmFsc2UgKTsNCisJCQl9DQorDQorCQkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfVFJBTlNGRVJUX0tJTkQ6IC8vIGluUkQtPmhhc0F0dGFjaCgpICkNCisJCQl7DQorCQkJCXJldHVybiggcG9wTWVzc2FnZUZyb21fdHJhbnNmZXJ0KEVOViwNCisJCQkJCQlhU2VuZGVyUklELCBhUm91dGluZ1JJRCwgYVJvdXRpbmdEYXRhKSApOw0KKwkJCX0NCisNCisJCQljYXNlIENvbVByb3RvY29sOjpQUk9UT0NPTF9CVUZGRVJfS0lORDoNCisJCQljYXNlIENvbVByb3RvY29sOjpQUk9UT0NPTF9CUk9BRENBU1RfS0lORDoNCisJCQljYXNlIENvbVByb3RvY29sOjpQUk9UT0NPTF9NVUxUSUNBU1RfS0lORDoNCisJCQljYXNlIENvbVByb3RvY29sOjpQUk9UT0NPTF9VTklDQVNUX0tJTkQ6DQorCQkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfQU5ZQ0FTVF9LSU5EOg0KKwkJCXsNCisJCQkJcmV0dXJuKCBwb3BNZXNzYWdlRnJvbV9idWZmZXIoRU5WLA0KKwkJCQkJCWFTZW5kZXJSSUQsIGFSb3V0aW5nUklELCBhUm91dGluZ0RhdGEpICk7DQorCQkJfQ0KKw0KKwkJCWNhc2UgQ29tUHJvdG9jb2w6OlBST1RPQ09MX1JEVl9LSU5EOg0KKwkJCWNhc2UgQ29tUHJvdG9jb2w6OlBST1RPQ09MX01VTFRJUkRWX0tJTkQ6DQorCQkJew0KKwkJCQlyZXR1cm4oIHBvcE1lc3NhZ2VGcm9tX3JkdihFTlYsDQorCQkJCQkJYVNlbmRlclJJRCwgYVJvdXRpbmdSSUQsIGFSb3V0aW5nRGF0YSkgKTsNCisJCQl9DQorCQkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfVU5ERUZJTkVEX0tJTkQ6DQorCQkJZGVmYXVsdDoNCisJCQl7DQorCQkJCUFWTV9PU19FWElUKCBGQUlMRUQgKQ0KKwkJCQkJCTw8ICJwb3BNZXNzYWdlRnJvbSA6PiBVbmtub3duIFByb3RvY29sIGZvciBpbnRlcmFjdGlvbiA8PCAiDQorCQkJCQkJPDwgYVBvcnQtPnN0ckNvbVBvaW50TmF0dXJlKCkgPDwgIjogIg0KKwkJCQkJCTw8IGFQb3J0LT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8ICIgPj4gJiA8PCBtYWNoaW5lOiAiDQorCQkJCQkJPDwgYVJvdXRpbmdSSUQuZ2V0SW5zdGFuY2UoKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQ0KKwkJCQkJCTw8ICIgPj4gaW4gcnVubmluZyBjb250ZXh0OiA8PCAiDQorCQkJCQkJPDwgRU5WLm1BUkctPm91dEVELT5tUklELmdldEluc3RhbmNlKCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkNCisJCQkJCQk8PCAiID4+ICEhISINCisJCQkJCQk8PCBTRU5EX0VYSVQ7DQorDQorCQkJCXJldHVybiggZmFsc2UgKTsNCisJCQl9DQorCQl9DQorCX0NCisJZWxzZQ0KKwl7DQorCQlBVk1fT1NfRVhJVCggRkFJTEVEICkNCisJCQkJPDwgInBvcE1lc3NhZ2VGcm9tIDo+IFVuZm91bmQgUm91dGluZ0RhdGEgZm9yIGludGVyYWN0aW9uIDw8ICINCisJCQkJPDwgYVBvcnQtPnN0ckNvbVBvaW50TmF0dXJlKCkgPDwgIjogIg0KKwkJCQk8PCBhUG9ydC0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiID4+ICYgPDwgbWFjaGluZTogIg0KKwkJCQk8PCBhUm91dGluZ1JJRC5nZXRJbnN0YW5jZSgpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpDQorCQkJCTw8ICIgPj4gaW4gcnVubmluZyBjb250ZXh0OiA8PCAiDQorCQkJCTw8IEVOVi5tQVJHLT5vdXRFRC0+bVJJRC5nZXRJbnN0YW5jZSgpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpDQorCQkJCTw8ICIgPj4gISEhIg0KKwkJCQk8PCBTRU5EX0VYSVQ7DQorCX0NCisNCisJcmV0dXJuKCBmYWxzZSApOw0KKw0KK30NCisNCisNCitib29sIEF2bUNvbW11bmljYXRpb25GYWN0b3J5Ojpwb3BNZXNzYWdlRnJvbV90cmFuc2ZlcnQoDQorCQlFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOViwgY29uc3QgUnVudGltZUlEICYgYVNlbmRlclJJRCwNCisJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSb3V0aW5nUklELCBjb25zdCBSb3V0aW5nRGF0YSAmIGFSb3V0aW5nRGF0YSkNCit7DQorCXJldHVybiggZmFsc2UgKTsNCit9DQorDQorDQorYm9vbCBBdm1Db21tdW5pY2F0aW9uRmFjdG9yeTo6cG9wTWVzc2FnZUZyb21fYnVmZmVyKA0KKwkJRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsIGNvbnN0IFJ1bnRpbWVJRCAmIGFTZW5kZXJSSUQsDQorCQljb25zdCBSdW50aW1lSUQgJiBhUm91dGluZ1JJRCwgY29uc3QgUm91dGluZ0RhdGEgJiBhUm91dGluZ0RhdGEpDQorew0KK0FWTV9JRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfQ09NTVVOSUNBVElPTiApDQorCUFWTV9PU19UUkFDRSA8PCBUQUIgPDwgImJlZ2luICINCisJCQkiQXZtQ29tbXVuaWNhdGlvbkZhY3Rvcnk6OnBvcE1lc3NhZ2VGcm9tX2J1ZmZlciIgPDwgc3RkOjplbmRsOw0KKw0KKwlFTlYubUFSRy0+b3V0RUQtPmdldFJ1bnRpbWUoYVJvdXRpbmdSSUQpLnRvU3RyZWFtRGF0YSgNCisJCQlFTlYubUFSRy0+b3V0RUQsIEFWTV9PU19UUkFDRSA8PCBJTkNSMl9JTkRFTlQpOw0KKwlBVk1fT1NfVFJBQ0UgPDwgREVDUjJfSU5ERU5UOw0KK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfQ09NTVVOSUNBVElPTiApDQorDQorCU1lc3NhZ2UgcG9wTXNnOw0KKw0KKwlSdW50aW1lSUQgYnVmZmVyRGVjbFJJRCA9IGFSb3V0aW5nUklEOw0KKw0KKwlMaXN0T2ZJbnN0YW5jZU9mQnVmZmVyOjpjb25zdF9pdGVyYXRvciBpdEJ1ZmZlciA9DQorCQkJYVJvdXRpbmdEYXRhLmdldEJ1ZmZlckluc3RhbmNlKCkuYmVnaW4oKTsNCisJTGlzdE9mSW5zdGFuY2VPZkJ1ZmZlcjo6Y29uc3RfaXRlcmF0b3IgZW5kQnVmZmVyID0NCisJCQlhUm91dGluZ0RhdGEuZ2V0QnVmZmVySW5zdGFuY2UoKS5lbmQoKTsNCisJZm9yKCA7IGl0QnVmZmVyICE9IGVuZEJ1ZmZlciA7ICsraXRCdWZmZXIgKQ0KKwl7DQorCQlidWZmZXJEZWNsUklEID0gRU5WLm1BUkctPm91dEVELT5nZXRSdW50aW1lQ29udGFpbmVyUklEKA0KKwkJCQlFTlYubUFSRy0+b3V0RUQtPm1SSUQsICgqaXRCdWZmZXIpKTsNCisNCisJCWlmKCBidWZmZXJEZWNsUklELnZhbGlkKCkgKQ0KKwkJew0KKwkJCUJhc2VCdWZmZXJGb3JtICYgYmJmID0gRU5WLm1BUkctPm91dEVELmdldFdyaXRhYmxlUnVudGltZSgNCisJCQkJCWJ1ZmZlckRlY2xSSUQgKS5nZXRXcml0YWJsZUJ1ZmZlciggKml0QnVmZmVyICk7DQorDQorCQkJcG9wTXNnID0gYmJmLnRvcCgpOw0KKwkJCWlmKCBwb3BNc2cudmFsaWQoKSAmJiBwb3BNc2cuaXNTZW5kZXIoYVNlbmRlclJJRCkgKQ0KKwkJCXsNCisJCQkJcG9wTXNnID0gYmJmLnBvcChhUm91dGluZ0RhdGEuZ2V0TUlEKCksIEVOVi5tQVJHLT5vdXRFRC0+bVJJRCk7DQorCQkJfQ0KKw0KKwkJCWlmKCBwb3BNc2cudmFsaWQoKSApDQorCQkJew0KKwkJCQlicmVhazsNCisJCQl9DQorCQl9DQorCX0NCisNCitBVk1fSUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX0NPTU1VTklDQVRJT04gKQ0KKwlFTlYubUFSRy0+b3V0RUQtPmdldFJ1bnRpbWUoYVJvdXRpbmdSSUQpLnRvU3RyZWFtRGF0YSgNCisJCQlFTlYubUFSRy0+b3V0RUQsIEFWTV9PU19UUkFDRSA8PCBJTkNSMl9JTkRFTlQpOw0KKwlBVk1fT1NfVFJBQ0UgPDwgREVDUjJfSU5ERU5UX1RBQiA8PCAiZW5kICINCisJCQkiQXZtQ29tbXVuaWNhdGlvbkZhY3Rvcnk6OnBvcE1lc3NhZ2VGcm9tX2J1ZmZlciIgPDwgc3RkOjplbmRsOw0KK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfQ09NTVVOSUNBVElPTiApDQorDQorCWlmKCBwb3BNc2cudmFsaWQoKSApDQorCXsNCisJCUJGQ29kZSBhVHJhY2VJbnB1dChPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0lOUFVULCBFTlYubUFSRy0+YXQoMCkpOw0KKw0KKwkJTWVzc2FnZTo6Y29uc3RfaXRlcmF0b3IgaXRWYWwgPSBwb3BNc2cuYmVnaW5QYXJhbWV0ZXJzKCk7DQorCQlNZXNzYWdlOjpjb25zdF9pdGVyYXRvciBlbmRWYWwgPSBwb3BNc2cuZW5kUGFyYW1ldGVycygpOw0KKw0KKwkJLy8gV2UgaGF2ZSB0byBpZ25vcmUgdGhlIDw8IFBvcnQgPj4gSW5zdGFuY2VPZlBvcnQgYW5kIHRoZSA8PCBTZW5kZXIgPj4NCisJCWZvciggRU5WLm1BUkctPmJlZ2luKDIpIDsgKGl0VmFsICE9IGVuZFZhbCkgJiYgRU5WLm1BUkctPmhhc05leHQoKSA7DQorCQkJCUVOVi5tQVJHLT5uZXh0KCkgLCArK2l0VmFsICkNCisJCXsNCisJCQlpZiggRU5WLnNldFJ2YWx1ZShFTlYubUFSRy0+b3V0RUQsDQorCQkJCQlFTlYubUFSRy0+Y3VycmVudCgpLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpLCAqaXRWYWwpICkNCisJCQl7DQorCQkJCWFUcmFjZUlucHV0LT5hcHBlbmQoICppdFZhbCApOw0KKw0KKwkJCX0NCisJCQllbHNlDQorCQkJew0KKwkJCQlyZXR1cm4oIGZhbHNlICk7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJRXhlY3V0aW9uRGF0YUZhY3Rvcnk6OmFwcGVuZElPRWxlbWVudFRyYWNlKEVOVi5tQVJHLT5vdXRFRCwNCisJCQkJQkYoIG5ldyBFeGVjdXRpb25Db25maWd1cmF0aW9uKA0KKwkJCQkJCUVOVi5tQVJHLT5vdXRFRC0+bVJJRCwgYVRyYWNlSW5wdXQsIHBvcE1zZykgKSApOw0KKw0KKwkJRU5WLm91dEVEUy5hcHBlbmQoIEVOVi5tQVJHLT5vdXRFRCApOw0KKw0KK0FWTV9JRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfQ09NTVVOSUNBVElPTiApDQorCUVOVi5tQVJHLT5vdXRFRC0+Z2V0UnVudGltZShhUm91dGluZ1JJRCkudG9TdHJlYW1EYXRhKA0KKwkJCUVOVi5tQVJHLT5vdXRFRCwgQVZNX09TX1RSQUNFIDw8IElOQ1IyX0lOREVOVCk7DQorCUFWTV9PU19UUkFDRSA8PCBERUNSMl9JTkRFTlRfVEFCIDw8ICJlbmQgIg0KKwkJCSJBdm1Db21tdW5pY2F0aW9uRmFjdG9yeTo6cG9wTWVzc2FnZUZyb21fYnVmZmVyIg0KKwkJCTw8IHN0ZDo6ZW5kbDsNCitBVk1fRU5ESUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX0NPTU1VTklDQVRJT04gKQ0KKw0KKwkJcmV0dXJuKCB0cnVlICk7DQorCX0NCisJZWxzZQ0KKwl7DQorCQlyZXR1cm4oIGZhbHNlICk7DQorCX0NCit9DQorDQorDQorYm9vbCBBdm1Db21tdW5pY2F0aW9uRmFjdG9yeTo6cG9wTWVzc2FnZUZyb21fcmR2KA0KKwkJRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsIGNvbnN0IFJ1bnRpbWVJRCAmIGFTZW5kZXJSSUQsDQorCQljb25zdCBSdW50aW1lSUQgJiBhUm91dGluZ1JJRCwgY29uc3QgUm91dGluZ0RhdGEgJiBhUm91dGluZ0RhdGEpDQorew0KKwlNZXNzYWdlIGluTXNnKCBhU2VuZGVyUklELCBFTlYubUFSRy0+b3V0RUQtPm1SSUQsIGFSb3V0aW5nRGF0YS5nZXRQb3J0KCkgKTsNCisJaW5Nc2cuc2V0TUlEKCBhUm91dGluZ0RhdGEuZ2V0TUlEKCkgKTsNCisNCisJLy8gV2UgaGF2ZSB0byBpZ25vcmUgdGhlIDw8IFBvcnQgPj4gSW5zdGFuY2VPZlBvcnQgYW5kIHRoZSA8PCBTZW5kZXIgPj4NCisJZm9yKCBFTlYubUFSRy0+YmVnaW4oMikgOyBFTlYubUFSRy0+aGFzTmV4dCgpIDsgRU5WLm1BUkctPm5leHQoKSApDQorCXsNCisJCWluTXNnLmFwcGVuZFBhcmFtZXRlciggRU5WLm1BUkctPmN1cnJlbnQoKSApOw0KKwl9DQorDQorCUVOVi5tQVJHLT5vdXRFRC5wdXNoRXhlY1N5bmNQb2ludCggbmV3IEV4ZWN1dGlvblN5bmNocm9uaXphdGlvblBvaW50KA0KKwkJCUFXQUlUSU5HX1BPSU5UX0lOUFVUX05BVFVSRSwgYVJvdXRpbmdSSUQsIGFSb3V0aW5nRGF0YSwgaW5Nc2cpICk7DQorDQorCUVOVi5hcHBlbmRTeW5jX213c2V0QUVFUyhFTlYubUFSRy0+b3V0RUQsIEFFRVNfV0FJVElOR19JTkNPTV9SRFYpOw0KKw0KKwlyZXR1cm4oIHRydWUgKTsNCit9DQorDQorDQorLyoNCisgKiBQVVNIIE1FU1NBR0UNCisgKi8NCitib29sIEF2bUNvbW11bmljYXRpb25GYWN0b3J5OjpwdXNoTWVzc2FnZShFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOViwNCisJCWNvbnN0IE1lc3NhZ2UgJiBhbk91dHB1dE1zZywgUnVudGltZUlEIGFSb3V0aW5nUklEKQ0KK3sNCisJSW5zdGFuY2VPZlBvcnQgKiBhUG9ydCA9IGFuT3V0cHV0TXNnLmdldFBvcnQoKTsNCisNCisJY29uc3QgUm91dGluZ0RhdGEgJiBhUm91dGluZ0RhdGEgPQ0KKwkJCXNlYXJjaE91dHB1dFJvdXRpbmdEYXRhKEVOVi5tQVJHLT5vdXRFRCwgYVBvcnQsIGFSb3V0aW5nUklEKTsNCisNCisJaWYoIGFSb3V0aW5nRGF0YSAhPSBOVUxMICkNCisJew0KKwkJYW5PdXRwdXRNc2cuc2V0TUlEKCBhUm91dGluZ0RhdGEuZ2V0TUlEKCkgKTsNCisNCisJCXN3aXRjaCggYVJvdXRpbmdEYXRhLmdldFByb3RvY29sKCkgKQ0KKwkJew0KKwkJCWNhc2UgQ29tUHJvdG9jb2w6OlBST1RPQ09MX0VOVklST05NRU5UX0tJTkQ6DQorCQkJew0KKwkJCQlyZXR1cm4oIHB1c2hNZXNzYWdlX2Vudmlyb25tZW50KEVOViwNCisJCQkJCQlhUm91dGluZ1JJRCwgYVJvdXRpbmdEYXRhLCBhbk91dHB1dE1zZykgKTsNCisJCQl9DQorDQorCQkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfVFJBTlNGRVJUX0tJTkQ6IC8vIGFSb3V0aW5nRGF0YS5oYXNBdHRhY2goKQ0KKwkJCXsNCisJCQkJcmV0dXJuKCBwdXNoTWVzc2FnZV90cmFuc2ZlcnQoRU5WLA0KKwkJCQkJCWFSb3V0aW5nUklELCBhUm91dGluZ0RhdGEsIGFuT3V0cHV0TXNnKSApOw0KKwkJCX0NCisNCisJCQljYXNlIENvbVByb3RvY29sOjpQUk9UT0NPTF9CVUZGRVJfS0lORDoNCisJCQl7DQorCQkJCXJldHVybiggcHVzaE1lc3NhZ2VfYnVmZmVyKEVOViwNCisJCQkJCQlhUm91dGluZ1JJRCwgYVJvdXRpbmdEYXRhLCBhbk91dHB1dE1zZykgKTsNCisJCQl9DQorDQorCQkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfUkRWX0tJTkQ6DQorCQkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfTVVMVElSRFZfS0lORDoNCisJCQl7DQorCQkJCXJldHVybiggcHVzaE1lc3NhZ2VfcmR2KEVOViwNCisJCQkJCQlhUm91dGluZ1JJRCwgYVJvdXRpbmdEYXRhLCBhbk91dHB1dE1zZykgKTsNCisJCQl9DQorDQorCQkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfQlJPQURDQVNUX0tJTkQ6DQorCQkJew0KKwkJCQlyZXR1cm4oIHB1c2hNZXNzYWdlX2Jyb2FkY2FzdChFTlYsDQorCQkJCQkJYVJvdXRpbmdSSUQsIGFSb3V0aW5nRGF0YSwgYW5PdXRwdXRNc2cpICk7DQorCQkJfQ0KKw0KKwkJCWNhc2UgQ29tUHJvdG9jb2w6OlBST1RPQ09MX01VTFRJQ0FTVF9LSU5EOg0KKwkJCXsNCisJCQkJcmV0dXJuKCBwdXNoTWVzc2FnZV9tdWx0aWNhc3QoRU5WLA0KKwkJCQkJCWFSb3V0aW5nUklELCBhUm91dGluZ0RhdGEsIGFuT3V0cHV0TXNnKSApOw0KKwkJCX0NCisJCQljYXNlIENvbVByb3RvY29sOjpQUk9UT0NPTF9VTklDQVNUX0tJTkQ6DQorCQkJew0KKwkJCQlyZXR1cm4oIHB1c2hNZXNzYWdlX3VuaWNhc3QoRU5WLA0KKwkJCQkJCWFSb3V0aW5nUklELCBhUm91dGluZ0RhdGEsIGFuT3V0cHV0TXNnKSApOw0KKwkJCX0NCisNCisJCQljYXNlIENvbVByb3RvY29sOjpQUk9UT0NPTF9BTllDQVNUX0tJTkQ6DQorCQkJew0KKwkJCQlyZXR1cm4oIHB1c2hNZXNzYWdlX2FueWNhc3QoRU5WLA0KKwkJCQkJCWFSb3V0aW5nUklELCBhUm91dGluZ0RhdGEsIGFuT3V0cHV0TXNnKSApOw0KKwkJCX0NCisNCisJCQljYXNlIENvbVByb3RvY29sOjpQUk9UT0NPTF9VTkRFRklORURfS0lORDoNCisJCQlkZWZhdWx0Og0KKwkJCXsNCisvLwkJCQlyZXR1cm4oIHB1c2hNZXNzYWdlX2Vudmlyb25tZW50KGFuRUQsIEVOVi5tQVJHLT5vdXRFRC0+bVJJRCwNCisvLwkJCQkJCWFSb3V0aW5nUkYsIGFSb3V0aW5nRGF0YSwgYW5PdXRwdXRNc2csIGxpc3RPZk91dHB1dEVEKSApOw0KKwkJCQlyZXR1cm4oIGZhbHNlICk7DQorCQkJfQ0KKwkJfQ0KKwl9DQorCWVsc2UNCisJew0KKwkJQVZNX09TX0VYSVQoIEZBSUxFRCApDQorCQkJPDwgIlB1c2ggbWVzc2FnZSBlcnJvciA6IFVuZm91bmQgUm91dGluZ0RhdGEgZm9yIGludGVyYWN0aW9uIDw8ICINCisJCQk8PCAgYVBvcnQtPnN0ckNvbVBvaW50TmF0dXJlKCkgPDwgIjogIg0KKwkJCTw8IGFSb3V0aW5nUklELmdldEluc3RhbmNlKCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkNCisJCQk8PCAiID4+IGluIHJ1bm5pbmcgY29udGV4dDogPDwgIg0KKwkJCTw8IGFQb3J0LT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8ICIgPj4gJiA8PCBtYWNoaW5lOiAiDQorCQkJPDwgRU5WLm1BUkctPm91dEVELT5tUklELmdldEluc3RhbmNlKCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkNCisJCQk8PCAiID4+ICEhISINCisJCQk8PCBTRU5EX0VYSVQ7DQorCX0NCisNCisJcmV0dXJuKCBmYWxzZSApOw0KK30NCisNCisNCitib29sIEF2bUNvbW11bmljYXRpb25GYWN0b3J5OjpwdXNoTWVzc2FnZV9lbnZpcm9ubWVudCgNCisJCUV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WLCBjb25zdCBSdW50aW1lSUQgJiBhUm91dGluZ1JJRCwNCisJCWNvbnN0IFJvdXRpbmdEYXRhICYgYVJvdXRpbmdEYXRhLCBjb25zdCBNZXNzYWdlICYgYW5PdXRwdXRNc2cpDQorew0KKwlCRkNvZGUgYVRyYWNlT3V0cHV0KE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfT1VUUFVUX0VOViwNCisJCQlhbk91dHB1dE1zZy5iZlBvcnQoKSk7DQorDQorCWFUcmFjZU91dHB1dC0+YXBwZW5kKCBhbk91dHB1dE1zZy5nZXRQYXJhbWV0ZXJzKCkgKTsNCisNCisJRXhlY3V0aW9uRGF0YUZhY3Rvcnk6OmFwcGVuZElPRWxlbWVudFRyYWNlKEVOVi5tQVJHLT5vdXRFRCwNCisJCQlCRiggbmV3IEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24oDQorCQkJCQlFTlYubUFSRy0+b3V0RUQtPm1SSUQsIGFUcmFjZU91dHB1dCwgYW5PdXRwdXRNc2cpICkgKTsNCisNCisJRU5WLm91dEVEUy5hcHBlbmQoIEVOVi5tQVJHLT5vdXRFRCApOw0KKw0KKwlyZXR1cm4oIHRydWUgKTsNCit9DQorDQorDQorYm9vbCBBdm1Db21tdW5pY2F0aW9uRmFjdG9yeTo6cHVzaE1lc3NhZ2VfdHJhbnNmZXJ0KA0KKwkJRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSb3V0aW5nUklELA0KKwkJY29uc3QgUm91dGluZ0RhdGEgJiBhUm91dGluZ0RhdGEsIGNvbnN0IE1lc3NhZ2UgJiBhbk91dHB1dE1zZykNCit7DQorCXJldHVybiggdHJ1ZSApOw0KK30NCisNCitib29sIEF2bUNvbW11bmljYXRpb25GYWN0b3J5OjpwdXNoTWVzc2FnZV9idWZmZXIoDQorCQlFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOViwgY29uc3QgUnVudGltZUlEICYgYVJvdXRpbmdSSUQsDQorCQljb25zdCBSb3V0aW5nRGF0YSAmIGFSb3V0aW5nRGF0YSwgY29uc3QgTWVzc2FnZSAmIGFuT3V0cHV0TXNnKQ0KK3sNCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFNUQVRFTUVOVF9DT01NVU5JQ0FUSU9OICkNCisJQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiYmVnaW4gIg0KKwkJCSJBdm1Db21tdW5pY2F0aW9uRmFjdG9yeTo6cHVzaE1lc3NhZ2VfYnVmZmVyIiA8PCBzdGQ6OmVuZGw7DQorDQorCUVOVi5tQVJHLT5vdXRFRC0+Z2V0UnVudGltZShhUm91dGluZ1JJRCkudG9TdHJlYW0oDQorCQkJQVZNX09TX1RSQUNFIDw8IElOQ1IyX0lOREVOVCApOw0KKwlBVk1fT1NfVFJBQ0UgPDwgREVDUjJfSU5ERU5UOw0KK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgU1RBVEVNRU5UX0NPTU1VTklDQVRJT04gKQ0KKw0KKwlib29sIG9uZVN1Y2Nlc3MgPSBmYWxzZTsNCisNCisJUnVudGltZUlEIGJ1ZmZlckRlY2xSSUQgPSBhUm91dGluZ1JJRDsNCisNCisJTGlzdE9mSW5zdGFuY2VPZkJ1ZmZlcjo6Y29uc3RfaXRlcmF0b3IgaXRCdWZmZXIgPQ0KKwkJCWFSb3V0aW5nRGF0YS5nZXRCdWZmZXJJbnN0YW5jZSgpLmJlZ2luKCk7DQorCUxpc3RPZkluc3RhbmNlT2ZCdWZmZXI6OmNvbnN0X2l0ZXJhdG9yIGVuZEJ1ZmZlciA9DQorCQkJYVJvdXRpbmdEYXRhLmdldEJ1ZmZlckluc3RhbmNlKCkuZW5kKCk7DQorCWZvciggOyBpdEJ1ZmZlciAhPSBlbmRCdWZmZXIgOyArK2l0QnVmZmVyICkNCisJew0KKwkJYnVmZmVyRGVjbFJJRCA9IEVOVi5tQVJHLT5vdXRFRC0+Z2V0UnVudGltZUNvbnRhaW5lclJJRCgNCisJCQkJYVJvdXRpbmdSSUQsICgqaXRCdWZmZXIpKTsNCisNCisJCWlmKCBidWZmZXJEZWNsUklELnZhbGlkKCkgKQ0KKwkJew0KKwkJCUFQRXhlY3V0aW9uRGF0YSBvdXRFRCA9IEVOVi5tQVJHLT5vdXRFRDsNCisNCisJCQlCYXNlQnVmZmVyRm9ybSAmIGJiZiA9IG91dEVELmdldFdyaXRhYmxlUnVudGltZSgNCisJCQkJCWJ1ZmZlckRlY2xSSUQgKS5nZXRXcml0YWJsZUJ1ZmZlciggKml0QnVmZmVyICk7DQorDQorCQkJaWYoIGJiZi5wdXNoKCBhbk91dHB1dE1zZyApICkNCisJCQl7DQorCQkJCW9uZVN1Y2Nlc3MgPSB0cnVlOw0KKw0KKwkJCQlCRkNvZGUgYVRyYWNlT3V0cHV0KE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfT1VUUFVULA0KKwkJCQkJCWFuT3V0cHV0TXNnLmJmUG9ydCgpKTsNCisNCisJCQkJYVRyYWNlT3V0cHV0LT5hcHBlbmQoIGFuT3V0cHV0TXNnLmdldFBhcmFtZXRlcnMoKSApOw0KKw0KKwkJCQlFeGVjdXRpb25EYXRhRmFjdG9yeTo6YXBwZW5kSU9FbGVtZW50VHJhY2Uob3V0RUQsDQorCQkJCQkJQkYoIG5ldyBFeGVjdXRpb25Db25maWd1cmF0aW9uKA0KKwkJCQkJCQkJb3V0RUQtPm1SSUQsIGFUcmFjZU91dHB1dCwgYW5PdXRwdXRNc2cpICkgKTsNCisNCisJCQkJRU5WLm91dEVEUy5hcHBlbmQoIG91dEVEICk7DQorDQorDQorQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBTVEFURU1FTlRfQ09NTVVOSUNBVElPTiApDQorCW91dEVELT5nZXRSdW50aW1lKGFSb3V0aW5nUklEKS50b1N0cmVhbSggQVZNX09TX1RSQUNFIDw8IElOQ1IyX0lOREVOVCApOw0KKwlBVk1fT1NfVFJBQ0UgPDwgREVDUjJfSU5ERU5UX1RBQg0KKwkJCTw8ICJlbmQgQXZtQ29tbXVuaWNhdGlvbkZhY3Rvcnk6OnB1c2hNZXNzYWdlX2J1ZmZlciIgPDwgc3RkOjplbmRsOw0KK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgU1RBVEVNRU5UX0NPTU1VTklDQVRJT04gKQ0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwlyZXR1cm4oIG9uZVN1Y2Nlc3MgKTsNCit9DQorDQorDQorYm9vbCBBdm1Db21tdW5pY2F0aW9uRmFjdG9yeTo6cHVzaE1lc3NhZ2VfcmR2KA0KKwkJRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSb3V0aW5nUklELA0KKwkJY29uc3QgUm91dGluZ0RhdGEgJiBhUm91dGluZ0RhdGEsIGNvbnN0IE1lc3NhZ2UgJiBhbk91dHB1dE1zZykNCit7DQorCUVOVi5tQVJHLT5vdXRFRC5wdXNoRXhlY1N5bmNQb2ludChuZXcgRXhlY3V0aW9uU3luY2hyb25pemF0aW9uUG9pbnQoDQorCQlBV0FJVElOR19QT0lOVF9PVVRQVVRfTkFUVVJFLCBhUm91dGluZ1JJRCwgYVJvdXRpbmdEYXRhLCBhbk91dHB1dE1zZykgKTsNCisNCisJRU5WLmFwcGVuZFN5bmNfbXdzZXRBRUVTKEVOVi5tQVJHLT5vdXRFRCwgQUVFU19XQUlUSU5HX09VVENPTV9SRFYpOw0KKw0KKwlyZXR1cm4oIHRydWUgKTsNCit9DQorDQorDQorYm9vbCBBdm1Db21tdW5pY2F0aW9uRmFjdG9yeTo6cHVzaE1lc3NhZ2VfYnJvYWRjYXN0KA0KKwkJRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSb3V0aW5nUklELA0KKwkJY29uc3QgUm91dGluZ0RhdGEgJiBhUm91dGluZ0RhdGEsIGNvbnN0IE1lc3NhZ2UgJiBhbk91dHB1dE1zZykNCit7DQorCXJldHVybiggdHJ1ZSApOw0KK30NCisNCisNCitib29sIEF2bUNvbW11bmljYXRpb25GYWN0b3J5OjpwdXNoTWVzc2FnZV9tdWx0aWNhc3QoDQorCQlFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOViwgY29uc3QgUnVudGltZUlEICYgYVJvdXRpbmdSSUQsDQorCQljb25zdCBSb3V0aW5nRGF0YSAmIGFSb3V0aW5nRGF0YSwgY29uc3QgTWVzc2FnZSAmIGFuT3V0cHV0TXNnKQ0KK3sNCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFNUQVRFTUVOVF9DT01NVU5JQ0FUSU9OICkNCisJQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiYmVnaW4gIg0KKwkJCSJBdm1Db21tdW5pY2F0aW9uRmFjdG9yeTo6cHVzaE1lc3NhZ2VfbXVsdGljYXN0IiA8PCBzdGQ6OmVuZGw7DQorDQorCUVOVi5tQVJHLT5vdXRFRC0+Z2V0UnVudGltZShhUm91dGluZ1JJRCkudG9TdHJlYW0oDQorCQkJQVZNX09TX1RSQUNFIDw8IElOQ1IyX0lOREVOVCApOw0KKwlBVk1fT1NfVFJBQ0UgPDwgREVDUjJfSU5ERU5UOw0KK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgU1RBVEVNRU5UX0NPTU1VTklDQVRJT04gKQ0KKw0KKwlib29sIG9uZVN1Y2Nlc3MgPSBmYWxzZTsNCisNCisJUnVudGltZUlEIGJ1ZmZlckRlY2xSSUQgPSBhUm91dGluZ1JJRDsNCisNCisJTGlzdE9mSW5zdGFuY2VPZkJ1ZmZlcjo6Y29uc3RfaXRlcmF0b3IgaXRCdWZmZXIgPQ0KKwkJCWFSb3V0aW5nRGF0YS5nZXRCdWZmZXJJbnN0YW5jZSgpLmJlZ2luKCk7DQorCUxpc3RPZkluc3RhbmNlT2ZCdWZmZXI6OmNvbnN0X2l0ZXJhdG9yIGVuZEJ1ZmZlciA9DQorCQkJYVJvdXRpbmdEYXRhLmdldEJ1ZmZlckluc3RhbmNlKCkuZW5kKCk7DQorCWZvciggOyBpdEJ1ZmZlciAhPSBlbmRCdWZmZXIgOyArK2l0QnVmZmVyICkNCisJew0KKwkJYnVmZmVyRGVjbFJJRCA9IEVOVi5tQVJHLT5vdXRFRC0+Z2V0UnVudGltZUNvbnRhaW5lclJJRCgNCisJCQkJYVJvdXRpbmdSSUQsICgqaXRCdWZmZXIpKTsNCisNCisJCWlmKCBidWZmZXJEZWNsUklELnZhbGlkKCkgKQ0KKwkJew0KKwkJCUJhc2VCdWZmZXJGb3JtICYgYmJmID0gRU5WLm1BUkctPm91dEVELmdldFdyaXRhYmxlUnVudGltZSgNCisJCQkJCWJ1ZmZlckRlY2xSSUQgKS5nZXRXcml0YWJsZUJ1ZmZlciggKml0QnVmZmVyICk7DQorDQorCQkJaWYoIGJiZi5wdXNoKCBhbk91dHB1dE1zZyApICkNCisJCQl7DQorCQkJCW9uZVN1Y2Nlc3MgPSB0cnVlOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwlpZiggb25lU3VjY2VzcyApDQorCXsNCisJCUJGQ29kZSBhVHJhY2VPdXRwdXQoT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9PVVRQVVQsDQorCQkJCWFuT3V0cHV0TXNnLmJmUG9ydCgpKTsNCisNCisJCWFUcmFjZU91dHB1dC0+YXBwZW5kKCBhbk91dHB1dE1zZy5nZXRQYXJhbWV0ZXJzKCkgKTsNCisNCisJCUV4ZWN1dGlvbkRhdGFGYWN0b3J5OjphcHBlbmRJT0VsZW1lbnRUcmFjZShFTlYubUFSRy0+b3V0RUQsDQorCQkJCUJGKCBuZXcgRXhlY3V0aW9uQ29uZmlndXJhdGlvbigNCisJCQkJCQlFTlYubUFSRy0+b3V0RUQtPm1SSUQsIGFUcmFjZU91dHB1dCwgYW5PdXRwdXRNc2cpICkgKTsNCisNCisJCUVOVi5vdXRFRFMuYXBwZW5kKCBFTlYubUFSRy0+b3V0RUQgKTsNCisNCisNCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFNUQVRFTUVOVF9DT01NVU5JQ0FUSU9OICkNCisJRU5WLm1BUkctPm91dEVELT5nZXRSdW50aW1lKGFSb3V0aW5nUklEKS50b1N0cmVhbSgNCisJCQlBVk1fT1NfVFJBQ0UgPDwgSU5DUjJfSU5ERU5UICk7DQorCUFWTV9PU19UUkFDRSA8PCBERUNSMl9JTkRFTlRfVEFCDQorCQkJPDwgImVuZCBBdm1Db21tdW5pY2F0aW9uRmFjdG9yeTo6cHVzaE1lc3NhZ2VfYnVmZmVyIg0KKwkJCTw8IHN0ZDo6ZW5kbDsNCitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFNUQVRFTUVOVF9DT01NVU5JQ0FUSU9OICkNCisNCisJCXJldHVybiggdHJ1ZSApOw0KKwl9DQorCWVsc2UNCisJew0KKwkJcmV0dXJuKCBmYWxzZSApOw0KKwl9DQorfQ0KKw0KKw0KK2Jvb2wgQXZtQ29tbXVuaWNhdGlvbkZhY3Rvcnk6OnB1c2hNZXNzYWdlX3VuaWNhc3QoDQorCQlFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOViwgY29uc3QgUnVudGltZUlEICYgYVJvdXRpbmdSSUQsDQorCQljb25zdCBSb3V0aW5nRGF0YSAmIGFSb3V0aW5nRGF0YSwgY29uc3QgTWVzc2FnZSAmIGFuT3V0cHV0TXNnKQ0KK3sNCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFNUQVRFTUVOVF9DT01NVU5JQ0FUSU9OICkNCisJQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiYmVnaW4gIg0KKwkJCSJBdm1Db21tdW5pY2F0aW9uRmFjdG9yeTo6cHVzaE1lc3NhZ2VfbXVsdGljYXN0IiA8PCBzdGQ6OmVuZGw7DQorDQorCUVOVi5tQVJHLT5vdXRFRC0+Z2V0UnVudGltZShhUm91dGluZ1JJRCkudG9TdHJlYW0oDQorCQkJQVZNX09TX1RSQUNFIDw8IElOQ1IyX0lOREVOVCApOw0KKwlBVk1fT1NfVFJBQ0UgPDwgREVDUjJfSU5ERU5UOw0KK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgU1RBVEVNRU5UX0NPTU1VTklDQVRJT04gKQ0KKw0KKwlib29sIG9uZVN1Y2Nlc3MgPSBmYWxzZTsNCisNCisJUnVudGltZUlEIGJ1ZmZlckRlY2xSSUQgPSBhUm91dGluZ1JJRDsNCisNCisJTGlzdE9mSW5zdGFuY2VPZkJ1ZmZlcjo6Y29uc3RfaXRlcmF0b3IgaXRCdWZmZXIgPQ0KKwkJCWFSb3V0aW5nRGF0YS5nZXRCdWZmZXJJbnN0YW5jZSgpLmJlZ2luKCk7DQorCUxpc3RPZkluc3RhbmNlT2ZCdWZmZXI6OmNvbnN0X2l0ZXJhdG9yIGVuZEJ1ZmZlciA9DQorCQkJYVJvdXRpbmdEYXRhLmdldEJ1ZmZlckluc3RhbmNlKCkuZW5kKCk7DQorCWZvciggOyBpdEJ1ZmZlciAhPSBlbmRCdWZmZXIgOyArK2l0QnVmZmVyICkNCisJew0KKwkJYnVmZmVyRGVjbFJJRCA9IEVOVi5tQVJHLT5vdXRFRC0+Z2V0UnVudGltZUNvbnRhaW5lclJJRCgNCisJCQkJYVJvdXRpbmdSSUQsICgqaXRCdWZmZXIpKTsNCisNCisJCWlmKCBidWZmZXJEZWNsUklELnZhbGlkKCkgKQ0KKwkJew0KKwkJCUJhc2VCdWZmZXJGb3JtICYgYmJmID0gRU5WLm1BUkctPm91dEVELmdldFdyaXRhYmxlUnVudGltZSgNCisJCQkJCWJ1ZmZlckRlY2xSSUQgKS5nZXRXcml0YWJsZUJ1ZmZlciggKml0QnVmZmVyICk7DQorDQorCQkJaWYoIGJiZi5wdXNoKCBhbk91dHB1dE1zZyApICkNCisJCQl7DQorCQkJCW9uZVN1Y2Nlc3MgPSB0cnVlOw0KKw0KKwkJCQlCRkNvZGUgYVRyYWNlT3V0cHV0KE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfT1VUUFVULA0KKwkJCQkJCWFuT3V0cHV0TXNnLmJmUG9ydCgpKTsNCisNCisJCQkJYVRyYWNlT3V0cHV0LT5hcHBlbmQoIGFuT3V0cHV0TXNnLmdldFBhcmFtZXRlcnMoKSApOw0KKw0KKwkJCQlFeGVjdXRpb25EYXRhRmFjdG9yeTo6YXBwZW5kSU9FbGVtZW50VHJhY2UoRU5WLm1BUkctPm91dEVELA0KKwkJCQkJQkYoIG5ldyBFeGVjdXRpb25Db25maWd1cmF0aW9uKA0KKwkJCQkJCUVOVi5tQVJHLT5vdXRFRC0+bVJJRCwgYVRyYWNlT3V0cHV0LCBhbk91dHB1dE1zZykgKSApOw0KKw0KKwkJCQlFTlYub3V0RURTLmFwcGVuZCggRU5WLm1BUkctPm91dEVEICk7DQorDQorQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBTVEFURU1FTlRfQ09NTVVOSUNBVElPTiApDQorCUVOVi5tQVJHLT5vdXRFRC0+Z2V0UnVudGltZShhUm91dGluZ1JJRCkudG9TdHJlYW0oDQorCQkJQVZNX09TX1RSQUNFIDw8IElOQ1IyX0lOREVOVCApOw0KKwlBVk1fT1NfVFJBQ0UgPDwgREVDUjJfSU5ERU5UX1RBQg0KKwkJCTw8ICJlbmQgQXZtQ29tbXVuaWNhdGlvbkZhY3Rvcnk6OnB1c2hNZXNzYWdlX2J1ZmZlciINCisJCQk8PCBzdGQ6OmVuZGw7DQorQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBTVEFURU1FTlRfQ09NTVVOSUNBVElPTiApDQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCXJldHVybiggb25lU3VjY2VzcyApOw0KK30NCisNCisNCitib29sIEF2bUNvbW11bmljYXRpb25GYWN0b3J5OjpwdXNoTWVzc2FnZV9hbnljYXN0KA0KKwkJRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSb3V0aW5nUklELA0KKwkJY29uc3QgUm91dGluZ0RhdGEgJiBhUm91dGluZ0RhdGEsIGNvbnN0IE1lc3NhZ2UgJiBhbk91dHB1dE1zZykNCit7DQorCXJldHVybiggcHVzaE1lc3NhZ2VfYnVmZmVyKEVOViwgYVJvdXRpbmdSSUQsIGFSb3V0aW5nRGF0YSwgYW5PdXRwdXRNc2cpICk7DQorLy8JcmV0dXJuKCB0cnVlICk7DQorfQ0KKw0KKw0KKw0KKy8qDQorICogUFVTSCBNRVNTQUdFIFRPDQorICovDQorDQorYm9vbCBBdm1Db21tdW5pY2F0aW9uRmFjdG9yeTo6cHVzaE1lc3NhZ2VUbygNCisJCUV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WLCBjb25zdCBNZXNzYWdlICYgYW5PdXRwdXRNc2cpDQorew0KKwlSdW50aW1lSUQgYVJvdXRpbmdSSUQgPSBFTlYubUFSRy0+b3V0RUQtPm1SSUQ7DQorCUluc3RhbmNlT2ZQb3J0ICogYVBvcnQgPSBhbk91dHB1dE1zZy5nZXRQb3J0KCk7DQorDQorCWNvbnN0IFJvdXRpbmdEYXRhICYgYVJvdXRpbmdEYXRhID0NCisJCQlzZWFyY2hPdXRwdXRSb3V0aW5nRGF0YShFTlYubUFSRy0+b3V0RUQsIGFQb3J0LCBhUm91dGluZ1JJRCk7DQorDQorCWlmKCBhUm91dGluZ0RhdGEgIT0gTlVMTCApDQorCXsNCisJCWFuT3V0cHV0TXNnLnNldE1JRCggYVJvdXRpbmdEYXRhLmdldE1JRCgpICk7DQorDQorCQlpZiggKGFuT3V0cHV0TXNnLmdldFJlY2VpdmVyUklEKCkgPT0gUnVudGltZUxpYjo6UklEX0VOVklST05NRU5UKSB8fA0KKwkJCQkoYW5PdXRwdXRNc2cuZ2V0UmVjZWl2ZXJSSUQoKSA9PSBSdW50aW1lTGliOjpSSURfTklMKSApDQorCQl7DQorCQkJcmV0dXJuKCBwdXNoTWVzc2FnZV9lbnZpcm9ubWVudChFTlYsDQorCQkJCQlhUm91dGluZ1JJRCwgYVJvdXRpbmdEYXRhLCBhbk91dHB1dE1zZykgKTsNCisJCX0NCisNCisJCXN3aXRjaCggYVJvdXRpbmdEYXRhLmdldFByb3RvY29sKCkgKQ0KKwkJew0KKwkJCWNhc2UgQ29tUHJvdG9jb2w6OlBST1RPQ09MX0VOVklST05NRU5UX0tJTkQ6DQorCQkJew0KKwkJCQlyZXR1cm4oIHB1c2hNZXNzYWdlX2Vudmlyb25tZW50KEVOViwNCisJCQkJCQlhUm91dGluZ1JJRCwgYVJvdXRpbmdEYXRhLCBhbk91dHB1dE1zZykgKTsNCisJCQl9DQorDQorCQkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfVFJBTlNGRVJUX0tJTkQ6DQorCQkJey8vIGFSb3V0aW5nRGF0YS5oYXNBdHRhY2goKSApDQorCQkJCXJldHVybiggcHVzaE1lc3NhZ2VUb190cmFuc2ZlcnQoRU5WLA0KKwkJCQkJCWFSb3V0aW5nUklELCBhUm91dGluZ0RhdGEsIGFuT3V0cHV0TXNnKSApOw0KKwkJCX0NCisNCisJCQljYXNlIENvbVByb3RvY29sOjpQUk9UT0NPTF9CVUZGRVJfS0lORDoNCisJCQl7DQorCQkJCXJldHVybiggcHVzaE1lc3NhZ2VUb19idWZmZXIoRU5WLA0KKwkJCQkJCWFSb3V0aW5nUklELCBhUm91dGluZ0RhdGEsIGFuT3V0cHV0TXNnKSApOw0KKwkJCX0NCisNCisJCQljYXNlIENvbVByb3RvY29sOjpQUk9UT0NPTF9SRFZfS0lORDoNCisJCQljYXNlIENvbVByb3RvY29sOjpQUk9UT0NPTF9NVUxUSVJEVl9LSU5EOg0KKwkJCXsNCisJCQkJcmV0dXJuKCBwdXNoTWVzc2FnZVRvX3JkdihFTlYsDQorCQkJCQkJYVJvdXRpbmdSSUQsIGFSb3V0aW5nRGF0YSwgYW5PdXRwdXRNc2cpICk7DQorCQkJfQ0KKw0KKwkJCWNhc2UgQ29tUHJvdG9jb2w6OlBST1RPQ09MX0JST0FEQ0FTVF9LSU5EOg0KKwkJCXsNCisJCQkJcmV0dXJuKCBwdXNoTWVzc2FnZVRvX2Jyb2FkY2FzdChFTlYsDQorCQkJCQkJYVJvdXRpbmdSSUQsIGFSb3V0aW5nRGF0YSwgYW5PdXRwdXRNc2cpICk7DQorCQkJfQ0KKw0KKwkJCWNhc2UgQ29tUHJvdG9jb2w6OlBST1RPQ09MX01VTFRJQ0FTVF9LSU5EOg0KKwkJCXsNCisJCQkJcmV0dXJuKCBwdXNoTWVzc2FnZVRvX211bHRpY2FzdChFTlYsDQorCQkJCQkJYVJvdXRpbmdSSUQsIGFSb3V0aW5nRGF0YSwgYW5PdXRwdXRNc2cpICk7DQorCQkJfQ0KKwkJCWNhc2UgQ29tUHJvdG9jb2w6OlBST1RPQ09MX1VOSUNBU1RfS0lORDoNCisJCQl7DQorCQkJCXJldHVybiggcHVzaE1lc3NhZ2VUb191bmljYXN0KEVOViwNCisJCQkJCQlhUm91dGluZ1JJRCwgYVJvdXRpbmdEYXRhLCBhbk91dHB1dE1zZykgKTsNCisJCQl9DQorDQorCQkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfQU5ZQ0FTVF9LSU5EOg0KKwkJCXsNCisJCQkJcmV0dXJuKCBwdXNoTWVzc2FnZVRvX2FueWNhc3QoRU5WLA0KKwkJCQkJCWFSb3V0aW5nUklELCBhUm91dGluZ0RhdGEsIGFuT3V0cHV0TXNnKSApOw0KKwkJCX0NCisNCisJCQljYXNlIENvbVByb3RvY29sOjpQUk9UT0NPTF9VTkRFRklORURfS0lORDoNCisJCQlkZWZhdWx0Og0KKwkJCXsNCisJCQkJQVZNX09TX0VYSVQoIEZBSUxFRCApDQorCQkJCQkJPDwgInB1c2hNZXNzYWdlVG8gOj4gVW5rbm93biBQcm90b2NvbCBmb3IgaW50ZXJhY3Rpb24gPDwgIg0KKwkJCQkJCTw8IGFQb3J0LT5zdHJDb21Qb2ludE5hdHVyZSgpIDw8ICI6ICINCisJCQkJCQk8PCBhUG9ydC0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiID4+ICYgPDwgbWFjaGluZTogIg0KKwkJCQkJCTw8IEVOVi5tQVJHLT5vdXRFRC0+bVJJRC5nZXRJbnN0YW5jZSgpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpDQorCQkJCQkJPDwgIiA+PiAhISEiDQorCQkJCQkJPDwgU0VORF9FWElUOw0KKw0KKwkJCQlyZXR1cm4oIGZhbHNlICk7DQorCQkJfQ0KKwkJfQ0KKwl9DQorCWVsc2UNCisJew0KKwkJQVZNX09TX0VYSVQoIEZBSUxFRCApDQorCQkJCTw8ICJwdXNoTWVzc2FnZVRvIDo+IFVuZm91bmQgUm91dGluZ0RhdGEgZm9yIGludGVyYWN0aW9uIDw8ICINCisJCQkJPDwgYVBvcnQtPnN0ckNvbVBvaW50TmF0dXJlKCkgPDwgIjogIg0KKwkJCQk8PCBhUG9ydC0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiID4+ICYgPDwgbWFjaGluZTogIg0KKwkJCQk8PCBhUm91dGluZ1JJRC5nZXRJbnN0YW5jZSgpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpDQorCQkJCTw8ICIgPj4gaW4gcnVubmluZyBjb250ZXh0OiA8PCAiDQorCQkJCTw8IEVOVi5tQVJHLT5vdXRFRC0+bVJJRC5nZXRJbnN0YW5jZSgpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpDQorCQkJCTw8ICIgPj4gISEhIg0KKwkJCQk8PCBTRU5EX0VYSVQ7DQorCX0NCisNCisJcmV0dXJuKCBmYWxzZSApOw0KK30NCisNCisNCitib29sIEF2bUNvbW11bmljYXRpb25GYWN0b3J5OjpwdXNoTWVzc2FnZVRvX3RyYW5zZmVydCgNCisJCUV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WLCBjb25zdCBSdW50aW1lSUQgJiBhUm91dGluZ1JJRCwNCisJCWNvbnN0IFJvdXRpbmdEYXRhICYgYVJvdXRpbmdEYXRhLCBjb25zdCBNZXNzYWdlICYgYW5PdXRwdXRNc2cpDQorew0KKwlyZXR1cm4oIHRydWUgKTsNCit9DQorDQorDQorYm9vbCBBdm1Db21tdW5pY2F0aW9uRmFjdG9yeTo6cHVzaE1lc3NhZ2VUb19idWZmZXIoDQorCQlFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOViwgY29uc3QgUnVudGltZUlEICYgYVJvdXRpbmdSSUQsDQorCQljb25zdCBSb3V0aW5nRGF0YSAmIGFSb3V0aW5nRGF0YSwgY29uc3QgTWVzc2FnZSAmIGFuT3V0cHV0TXNnKQ0KK3sNCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFNUQVRFTUVOVF9DT01NVU5JQ0FUSU9OICkNCisJQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiYmVnaW4gIg0KKwkJCSJBdm1Db21tdW5pY2F0aW9uRmFjdG9yeTo6cHVzaE1lc3NhZ2VUb19idWZmZXIiIDw8IHN0ZDo6ZW5kbDsNCisNCisJRU5WLm1BUkctPm91dEVELT5nZXRSdW50aW1lKGFSb3V0aW5nUklEKS50b1N0cmVhbSgNCisJCQlBVk1fT1NfVFJBQ0UgPDwgSU5DUjJfSU5ERU5UICk7DQorCUFWTV9PU19UUkFDRSA8PCBERUNSMl9JTkRFTlQ7DQorQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBTVEFURU1FTlRfQ09NTVVOSUNBVElPTiApDQorDQorCS8vIFNlYXJjaCByZWNlaXZlciBtYWNoaW5lIGluIHRoZSBJTlBVVCBNQUNISU5FLVBPUlQgY29ubmVjdGVkIGxpc3QNCisJYm9vbCBvbmVTdWNjZXNzID0gZmFsc2U7DQorDQorCUxpc3RPZkluc3RhbmNlT2ZCdWZmZXI6OmNvbnN0X2l0ZXJhdG9yIGl0YkluOw0KKwlMaXN0T2ZJbnN0YW5jZU9mQnVmZmVyOjpjb25zdF9pdGVyYXRvciBpdGJJbkVuZDsNCisNCisJTGlzdE9mSW5zdGFuY2VPZkJ1ZmZlcjo6Y29uc3RfaXRlcmF0b3IgaXRiT3V0Ow0KKwlMaXN0T2ZJbnN0YW5jZU9mQnVmZmVyOjpjb25zdF9pdGVyYXRvciBpdGJPdXRFbmQ7DQorDQorCWNvbnN0IFZlY3Rvck9mUGFpck1hY2hpbmVQb3J0ICYgdGhlQ29ubmVjdGVkUG9ydCA9DQorCQkJYVJvdXRpbmdSSUQuZ2V0RXhlY3V0YWJsZSgpLT5nZXRDb25uZWN0KCkuYXQoDQorCQkJCQlhUm91dGluZ0RhdGEuZ2V0Q29ubmVjdCgpLT5nZXRPZmZzZXQoKSApLg0KKwkJCQkJCQlnZXRJbnB1dENvbVJvdXRlRGF0YSgpLmdldE1hY2hpbmVQb3J0cygpOw0KKw0KKwlSdW50aW1lSUQgYnVmZmVyRGVjbFJJRCA9IGFSb3V0aW5nUklEOw0KKw0KKwlWZWN0b3JPZlBhaXJNYWNoaW5lUG9ydDo6Y29uc3RfaXRlcmF0b3IgaXRNUCA9IHRoZUNvbm5lY3RlZFBvcnQuYmVnaW4oKTsNCisJVmVjdG9yT2ZQYWlyTWFjaGluZVBvcnQ6OmNvbnN0X2l0ZXJhdG9yIGVuZE1QID0gdGhlQ29ubmVjdGVkUG9ydC5lbmQoKTsNCisJZm9yKCA7IGl0TVAgIT0gZW5kTVAgOyArK2l0TVAgKQ0KKwl7DQorCQlpZiggYW5PdXRwdXRNc2cuaXNSZWNlaXZlck1hY2hpbmUoICgqaXRNUCktPmZpcnN0KCkgKSApDQorCQl7DQorCQkJLy8gZ2V0IFJvdXRpbmcgRGF0YSBvZiB0aGUgY29ubmVjdG9yIGlucHV0IHJlY2VpdmVyIGNhbmRpZGF0ZQ0KKwkJCWNvbnN0IFJvdXRpbmdEYXRhICYgY29ubmVjdElucHV0UkQgPQ0KKwkJCQkJRU5WLm1BUkctPm91dEVELT5nZXRSdW50aW1lKA0KKwkJCQkJCWFuT3V0cHV0TXNnLmdldFJlY2VpdmVyUklEKCkgKS5nZXRSb3V0ZXIoKS4NCisJCQkJCQlnZXRJbnB1dFJvdXRpbmcoICgqaXRNUCktPnNlY29uZCgpLT5nZXRSb3V0ZU9mZnNldCgpICk7DQorDQorCQkJLy8gUHVzaCB0aGUgbWVzc2FnZSBpbiBhbGwgQ09NTU9OIGJ1ZmZlciB3aXRoIHRoZSBPVVRQVVQgUE9SVCENCisJCQlpdGJJbiA9IGNvbm5lY3RJbnB1dFJELmdldEJ1ZmZlckluc3RhbmNlKCkuYmVnaW4oKTsNCisJCQlpdGJJbkVuZCA9IGNvbm5lY3RJbnB1dFJELmdldEJ1ZmZlckluc3RhbmNlKCkuZW5kKCk7DQorCQkJZm9yKCAgOyBpdGJJbiAhPSBpdGJJbkVuZCA7ICsraXRiSW4gKQ0KKwkJCXsNCisJCQkJaXRiT3V0ID0gYVJvdXRpbmdEYXRhLmdldEJ1ZmZlckluc3RhbmNlKCkuYmVnaW4oKTsNCisJCQkJaXRiT3V0RW5kID0gYVJvdXRpbmdEYXRhLmdldEJ1ZmZlckluc3RhbmNlKCkuZW5kKCk7DQorCQkJCWZvciggIDsgaXRiT3V0ICE9IGl0Yk91dEVuZCA7ICsraXRiT3V0ICkNCisJCQkJew0KKwkJCQkJaWYoICgqaXRiSW4pID09ICgqaXRiT3V0KSApICAvLyBDT01NT04gQlVGRkVSIGZvdW5kDQorCQkJCQl7DQorCQkJCQkJYnVmZmVyRGVjbFJJRCA9IEVOVi5tQVJHLT5vdXRFRC0+Z2V0UnVudGltZUNvbnRhaW5lclJJRCgNCisJCQkJCQkJCWFuT3V0cHV0TXNnLmdldFJlY2VpdmVyUklEKCksICgqaXRiT3V0KSApOw0KKw0KKwkJCQkJCUJhc2VCdWZmZXJGb3JtICYgYmJmID0NCisJCQkJCQkJRU5WLm1BUkctPm91dEVELmdldFdyaXRhYmxlUnVudGltZSgNCisJCQkJCQkJCWJ1ZmZlckRlY2xSSUQgKS5nZXRXcml0YWJsZUJ1ZmZlciggKml0Yk91dCApOw0KKw0KKwkJCQkJCWlmKCBiYmYucHVzaCggYW5PdXRwdXRNc2cgKSApDQorCQkJCQkJew0KKwkJCQkJCQlvbmVTdWNjZXNzID0gdHJ1ZTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQl9DQorCX0NCisNCisJaWYoIG9uZVN1Y2Nlc3MgKQ0KKwl7DQorCQlCRkNvZGUgYVRyYWNlT3V0cHV0KE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfT1VUUFVULA0KKwkJCQlhbk91dHB1dE1zZy5iZlBvcnQoKSk7DQorDQorCQlhVHJhY2VPdXRwdXQtPmFwcGVuZCggYW5PdXRwdXRNc2cuZ2V0UGFyYW1ldGVycygpICk7DQorDQorCQlFeGVjdXRpb25EYXRhRmFjdG9yeTo6YXBwZW5kSU9FbGVtZW50VHJhY2UoRU5WLm1BUkctPm91dEVELA0KKwkJCQlCRiggbmV3IEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24oDQorCQkJCQkJRU5WLm1BUkctPm91dEVELT5tUklELCBhVHJhY2VPdXRwdXQsIGFuT3V0cHV0TXNnKSApICk7DQorDQorCQlFTlYub3V0RURTLmFwcGVuZCggRU5WLm1BUkctPm91dEVEICk7DQorDQorDQorQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBTVEFURU1FTlRfQ09NTVVOSUNBVElPTiApDQorCUVOVi5tQVJHLT5vdXRFRC0+Z2V0UnVudGltZShhUm91dGluZ1JJRCkudG9TdHJlYW0oDQorCQkJQVZNX09TX1RSQUNFIDw8IElOQ1IyX0lOREVOVCApOw0KKwlBVk1fT1NfVFJBQ0UgPDwgREVDUjJfSU5ERU5UX1RBQg0KKwkJCTw8ICJlbmQgQXZtQ29tbXVuaWNhdGlvbkZhY3Rvcnk6OnB1c2hNZXNzYWdlVG9fYnVmZmVyIg0KKwkJCTw8IHN0ZDo6ZW5kbDsNCitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFNUQVRFTUVOVF9DT01NVU5JQ0FUSU9OICkNCisNCisJCXJldHVybiggdHJ1ZSApOw0KKwl9DQorCWVsc2UNCisJew0KKwkJcmV0dXJuKCBmYWxzZSApOw0KKwl9DQorfQ0KKw0KKw0KK2Jvb2wgQXZtQ29tbXVuaWNhdGlvbkZhY3Rvcnk6OnB1c2hNZXNzYWdlVG9fcmR2KA0KKwkJRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSb3V0aW5nUklELA0KKwkJY29uc3QgUm91dGluZ0RhdGEgJiBhUm91dGluZ0RhdGEsIGNvbnN0IE1lc3NhZ2UgJiBhbk91dHB1dE1zZykNCit7DQorCUVOVi5tQVJHLT5vdXRFRC5wdXNoRXhlY1N5bmNQb2ludCggbmV3IEV4ZWN1dGlvblN5bmNocm9uaXphdGlvblBvaW50KA0KKwkJCUFXQUlUSU5HX1BPSU5UX09VVFBVVF9OQVRVUkUsDQorCQkJYVJvdXRpbmdSSUQsIGFSb3V0aW5nRGF0YSwgYW5PdXRwdXRNc2cpICk7DQorDQorCUVOVi5hcHBlbmRTeW5jX213c2V0QUVFUyhFTlYubUFSRy0+b3V0RUQsIEFFRVNfV0FJVElOR19PVVRDT01fUkRWKTsNCisNCisJcmV0dXJuKCB0cnVlICk7DQorfQ0KKw0KKw0KK2Jvb2wgQXZtQ29tbXVuaWNhdGlvbkZhY3Rvcnk6OnB1c2hNZXNzYWdlVG9fYnJvYWRjYXN0KA0KKwkJRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSb3V0aW5nUklELA0KKwkJY29uc3QgUm91dGluZ0RhdGEgJiBhUm91dGluZ0RhdGEsIGNvbnN0IE1lc3NhZ2UgJiBhbk91dHB1dE1zZykNCit7DQorCXJldHVybiggdHJ1ZSApOw0KK30NCisNCisNCitib29sIEF2bUNvbW11bmljYXRpb25GYWN0b3J5OjpwdXNoTWVzc2FnZVRvX211bHRpY2FzdCgNCisJCUV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WLCBjb25zdCBSdW50aW1lSUQgJiBhUm91dGluZ1JJRCwNCisJCWNvbnN0IFJvdXRpbmdEYXRhICYgYVJvdXRpbmdEYXRhLCBjb25zdCBNZXNzYWdlICYgYW5PdXRwdXRNc2cpDQorew0KK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgU1RBVEVNRU5UX0NPTU1VTklDQVRJT04gKQ0KKwlBVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICJiZWdpbiAiDQorCQkJIkF2bUNvbW11bmljYXRpb25GYWN0b3J5OjpwdXNoTWVzc2FnZVRvX2J1ZmZlciIgPDwgc3RkOjplbmRsOw0KKw0KKwlFTlYubUFSRy0+b3V0RUQtPmdldFJ1bnRpbWUoYVJvdXRpbmdSSUQpLnRvU3RyZWFtKA0KKwkJCUFWTV9PU19UUkFDRSA8PCBJTkNSMl9JTkRFTlQgKTsNCisJQVZNX09TX1RSQUNFIDw8IERFQ1IyX0lOREVOVDsNCitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFNUQVRFTUVOVF9DT01NVU5JQ0FUSU9OICkNCisNCisJLy8gU2VhcmNoIHJlY2VpdmVyIG1hY2hpbmUgaW4gdGhlIElOUFVUIE1BQ0hJTkUtUE9SVCBjb25uZWN0ZWQgbGlzdA0KKwlib29sIG9uZVN1Y2Nlc3MgPSBmYWxzZTsNCisNCisJTGlzdE9mSW5zdGFuY2VPZkJ1ZmZlcjo6Y29uc3RfaXRlcmF0b3IgaXRiSW47DQorCUxpc3RPZkluc3RhbmNlT2ZCdWZmZXI6OmNvbnN0X2l0ZXJhdG9yIGl0YkluRW5kOw0KKw0KKwlMaXN0T2ZJbnN0YW5jZU9mQnVmZmVyOjpjb25zdF9pdGVyYXRvciBpdGJPdXQ7DQorCUxpc3RPZkluc3RhbmNlT2ZCdWZmZXI6OmNvbnN0X2l0ZXJhdG9yIGl0Yk91dEVuZDsNCisNCisJY29uc3QgVmVjdG9yT2ZQYWlyTWFjaGluZVBvcnQgJiB0aGVDb25uZWN0ZWRQb3J0ID0NCisJCQlhUm91dGluZ1JJRC5nZXRFeGVjdXRhYmxlKCktPmdldENvbm5lY3QoKS5hdCgNCisJCQkJCWFSb3V0aW5nRGF0YS5nZXRDb25uZWN0KCktPmdldE9mZnNldCgpICkuDQorCQkJCQkJCWdldElucHV0Q29tUm91dGVEYXRhKCkuZ2V0TWFjaGluZVBvcnRzKCk7DQorDQorCVJ1bnRpbWVJRCBidWZmZXJEZWNsUklEID0gYVJvdXRpbmdSSUQ7DQorDQorCVZlY3Rvck9mUGFpck1hY2hpbmVQb3J0Ojpjb25zdF9pdGVyYXRvciBpdE1QID0gdGhlQ29ubmVjdGVkUG9ydC5iZWdpbigpOw0KKwlWZWN0b3JPZlBhaXJNYWNoaW5lUG9ydDo6Y29uc3RfaXRlcmF0b3IgZW5kTVAgPSB0aGVDb25uZWN0ZWRQb3J0LmVuZCgpOw0KKwlmb3IoIDsgaXRNUCAhPSBlbmRNUCA7ICsraXRNUCApDQorCXsNCisJCWlmKCBhbk91dHB1dE1zZy5pc1JlY2VpdmVyTWFjaGluZSggKCppdE1QKS0+Zmlyc3QoKSApICkNCisJCXsNCisJCQkvLyBnZXQgUm91dGluZyBEYXRhIG9mIHRoZSBjb25uZWN0b3IgaW5wdXQgcmVjZWl2ZXIgY2FuZGlkYXRlDQorCQkJY29uc3QgUm91dGluZ0RhdGEgJiBjb25uZWN0SW5wdXRSRCA9DQorCQkJCQlFTlYubUFSRy0+b3V0RUQtPmdldFJ1bnRpbWUoDQorCQkJCQkJYW5PdXRwdXRNc2cuZ2V0UmVjZWl2ZXJSSUQoKSApLmdldFJvdXRlcigpLg0KKwkJCQkJCWdldElucHV0Um91dGluZyggKCppdE1QKS0+c2Vjb25kKCktPmdldFJvdXRlT2Zmc2V0KCkgKTsNCisNCisJCQkvLyBQdXNoIHRoZSBtZXNzYWdlIGluIGFsbCBDT01NT04gYnVmZmVyIHdpdGggdGhlIE9VVFBVVCBQT1JUIQ0KKwkJCWl0YkluID0gY29ubmVjdElucHV0UkQuZ2V0QnVmZmVySW5zdGFuY2UoKS5iZWdpbigpOw0KKwkJCWl0YkluRW5kID0gY29ubmVjdElucHV0UkQuZ2V0QnVmZmVySW5zdGFuY2UoKS5lbmQoKTsNCisJCQlmb3IoICA7IGl0YkluICE9IGl0YkluRW5kIDsgKytpdGJJbiApDQorCQkJew0KKwkJCQlpdGJPdXQgPSBhUm91dGluZ0RhdGEuZ2V0QnVmZmVySW5zdGFuY2UoKS5iZWdpbigpOw0KKwkJCQlpdGJPdXRFbmQgPSBhUm91dGluZ0RhdGEuZ2V0QnVmZmVySW5zdGFuY2UoKS5lbmQoKTsNCisJCQkJZm9yKCAgOyBpdGJPdXQgIT0gaXRiT3V0RW5kIDsgKytpdGJPdXQgKQ0KKwkJCQl7DQorCQkJCQlpZiggKCppdGJJbikgPT0gKCppdGJPdXQpICkgIC8vIENPTU1PTiBCVUZGRVIgZm91bmQNCisJCQkJCXsNCisJCQkJCQlidWZmZXJEZWNsUklEID0gRU5WLm1BUkctPm91dEVELT5nZXRSdW50aW1lQ29udGFpbmVyUklEKA0KKwkJCQkJCQkJYW5PdXRwdXRNc2cuZ2V0UmVjZWl2ZXJSSUQoKSwgKCppdGJPdXQpICk7DQorDQorCQkJCQkJQmFzZUJ1ZmZlckZvcm0gJiBiYmYgPQ0KKwkJCQkJCQlFTlYubUFSRy0+b3V0RUQuZ2V0V3JpdGFibGVSdW50aW1lKA0KKwkJCQkJCQkJYnVmZmVyRGVjbFJJRCApLmdldFdyaXRhYmxlQnVmZmVyKCAqaXRiT3V0ICk7DQorDQorCQkJCQkJaWYoIGJiZi5wdXNoKCBhbk91dHB1dE1zZyApICkNCisJCQkJCQl7DQorCQkJCQkJCW9uZVN1Y2Nlc3MgPSB0cnVlOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwlpZiggb25lU3VjY2VzcyApDQorCXsNCisJCUJGQ29kZSBhVHJhY2VPdXRwdXQoT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9PVVRQVVQsDQorCQkJCWFuT3V0cHV0TXNnLmJmUG9ydCgpKTsNCisNCisJCWFUcmFjZU91dHB1dC0+YXBwZW5kKCBhbk91dHB1dE1zZy5nZXRQYXJhbWV0ZXJzKCkgKTsNCisNCisJCUV4ZWN1dGlvbkRhdGFGYWN0b3J5OjphcHBlbmRJT0VsZW1lbnRUcmFjZShFTlYubUFSRy0+b3V0RUQsDQorCQkJCUJGKG5ldyBFeGVjdXRpb25Db25maWd1cmF0aW9uKA0KKwkJCQkJCUVOVi5tQVJHLT5vdXRFRC0+bVJJRCwgYVRyYWNlT3V0cHV0LCBhbk91dHB1dE1zZykgKSApOw0KKw0KKwkJRU5WLm91dEVEUy5hcHBlbmQoIEVOVi5tQVJHLT5vdXRFRCApOw0KKw0KKw0KK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgU1RBVEVNRU5UX0NPTU1VTklDQVRJT04gKQ0KKwlFTlYubUFSRy0+b3V0RUQtPmdldFJ1bnRpbWUoYVJvdXRpbmdSSUQpLnRvU3RyZWFtKA0KKwkJCUFWTV9PU19UUkFDRSA8PCBJTkNSMl9JTkRFTlQgKTsNCisJQVZNX09TX1RSQUNFIDw8IERFQ1IyX0lOREVOVF9UQUINCisJCQk8PCAiZW5kIEF2bUNvbW11bmljYXRpb25GYWN0b3J5OjpwdXNoTWVzc2FnZVRvX2J1ZmZlciINCisJCQk8PCBzdGQ6OmVuZGw7DQorQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBTVEFURU1FTlRfQ09NTVVOSUNBVElPTiApDQorDQorCQlyZXR1cm4oIHRydWUgKTsNCisJfQ0KKwllbHNlDQorCXsNCisJCXJldHVybiggZmFsc2UgKTsNCisJfQ0KK30NCisNCisNCitib29sIEF2bUNvbW11bmljYXRpb25GYWN0b3J5OjpwdXNoTWVzc2FnZVRvX3VuaWNhc3QoDQorCQlFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOViwgY29uc3QgUnVudGltZUlEICYgYVJvdXRpbmdSSUQsDQorCQljb25zdCBSb3V0aW5nRGF0YSAmIGFSb3V0aW5nRGF0YSwgY29uc3QgTWVzc2FnZSAmIGFuT3V0cHV0TXNnKQ0KK3sNCisJcmV0dXJuKCB0cnVlICk7DQorfQ0KKw0KKw0KK2Jvb2wgQXZtQ29tbXVuaWNhdGlvbkZhY3Rvcnk6OnB1c2hNZXNzYWdlVG9fYW55Y2FzdCgNCisJCUV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WLCBjb25zdCBSdW50aW1lSUQgJiBhUm91dGluZ1JJRCwNCisJCWNvbnN0IFJvdXRpbmdEYXRhICYgYVJvdXRpbmdEYXRhLCBjb25zdCBNZXNzYWdlICYgYW5PdXRwdXRNc2cpDQorew0KKwlyZXR1cm4oIHB1c2hNZXNzYWdlVG9fYnVmZmVyKEVOViwgYVJvdXRpbmdSSUQsIGFSb3V0aW5nRGF0YSwgYW5PdXRwdXRNc2cpICk7DQorLy8JcmV0dXJuKCB0cnVlICk7DQorfQ0KKw0KKw0KKy8qDQorICogVVBEQVRFIEJVRkZFUg0KKyAqLw0KK2Jvb2wgQXZtQ29tbXVuaWNhdGlvbkZhY3Rvcnk6OnVwZGF0ZUJ1ZmZlcihBUEV4ZWN1dGlvbkRhdGEgJiBhbkVEKQ0KK3sNCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFNUQVRFTUVOVF9DT01NVU5JQ0FUSU9OICkNCisJYW5FRC0+Z2V0UnVudGltZSgxKS50b1N0cmVhbShBVk1fT1NfVFJBQ0UpOw0KK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgU1RBVEVNRU5UX0NPTU1VTklDQVRJT04gKQ0KKw0KKwlUYWJsZU9mQnVmZmVyVCAmIHdyQnVmZmVyVGFibGUgPSBhbkVELmdldFdyaXRhYmxlUnVudGltZSgNCisJCQlhbkVELT5tUklEICkuZ2V0V3JpdGFibGVCdWZmZXJUYWJsZSgpOw0KKw0KKwlUYWJsZU9mQnVmZmVyVDo6Y29uc3RfaXRlcmF0b3IgaXQgPSB3ckJ1ZmZlclRhYmxlLmJlZ2luKCk7DQorCVRhYmxlT2ZCdWZmZXJUOjpjb25zdF9pdGVyYXRvciBpdEVuZCA9IHdyQnVmZmVyVGFibGUuZW5kKCk7DQorCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQ0KKwl7DQorCQlzd2l0Y2goICgqaXQpLT5jbGFzc0tpbmQoKSApDQorCQl7DQorCQkJY2FzZSBGT1JNX0JVRkZFUl9CUk9BRENBU1RfS0lORDoNCisJCQl7DQorCQkJCUJyb2FkY2FzdEJ1ZmZlciAqIHRoZUJ1ZmZlciA9ICgqaXQpLT50bzwgQnJvYWRjYXN0QnVmZmVyID4oKTsNCisJCQkJdGhlQnVmZmVyLT5wdXNoKCBNZXNzYWdlOjpfTlVMTF8gKTsNCisJCQkJdGhlQnVmZmVyLT51cGRhdGUoKTsNCisNCisJCQkJYnJlYWs7DQorCQkJfQ0KKw0KKwkJCWRlZmF1bHQ6DQorCQkJew0KKwkJCQlicmVhazsNCisJCQl9DQorCQl9DQorCX0NCisNCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFNUQVRFTUVOVF9DT01NVU5JQ0FUSU9OICkNCisJYW5FRC0+Z2V0UnVudGltZSgxKS50b1N0cmVhbShBVk1fT1NfVFJBQ0UpOw0KK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgU1RBVEVNRU5UX0NPTU1VTklDQVRJT04gKQ0KKw0KKwlyZXR1cm4oIHRydWUgKTsNCit9DQorDQorDQorLyoNCisgKiBQUkVTRU5DRSAvIEFCU0VOQ0Ugc3RhdHVzDQorICovDQorYm9vbCBBdm1Db21tdW5pY2F0aW9uRmFjdG9yeTo6Y29tcHV0ZVByZXNlbmNlKGNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVELA0KKwkJY29uc3QgUnVudGltZUlEICYgYVJlY2VpdmVyUklELCBJbnN0YW5jZU9mUG9ydCAqIGFQb3J0KQ0KK3sNCisJUnVudGltZUlEIGFSb3V0aW5nUklEID0gYVJlY2VpdmVyUklEOw0KKw0KKwljb25zdCBSb3V0aW5nRGF0YSAmIGFSb3V0aW5nRGF0YSA9DQorCQkJc2VhcmNoSW5wdXRSb3V0aW5nRGF0YShhbkVELCBhUG9ydCwgYVJvdXRpbmdSSUQpOw0KKw0KKwlpZiggYVJvdXRpbmdEYXRhICE9IE5VTEwgKQ0KKwl7DQorCQlzd2l0Y2goIGFSb3V0aW5nRGF0YS5nZXRQcm90b2NvbCgpICkNCisJCXsNCisJCQljYXNlIENvbVByb3RvY29sOjpQUk9UT0NPTF9FTlZJUk9OTUVOVF9LSU5EOg0KKwkJCXsNCisJCQkJcmV0dXJuKCB0cnVlICk7DQorCQkJfQ0KKw0KKwkJCWNhc2UgQ29tUHJvdG9jb2w6OlBST1RPQ09MX1RSQU5TRkVSVF9LSU5EOiAvLyBpblJELT5oYXNBdHRhY2goKSApDQorCQkJew0KKwkJCQlyZXR1cm4oIGZhbHNlICk7DQorCQkJfQ0KKw0KKwkJCWNhc2UgQ29tUHJvdG9jb2w6OlBST1RPQ09MX0JVRkZFUl9LSU5EOg0KKwkJCWNhc2UgQ29tUHJvdG9jb2w6OlBST1RPQ09MX0JST0FEQ0FTVF9LSU5EOg0KKwkJCWNhc2UgQ29tUHJvdG9jb2w6OlBST1RPQ09MX01VTFRJQ0FTVF9LSU5EOg0KKwkJCWNhc2UgQ29tUHJvdG9jb2w6OlBST1RPQ09MX1VOSUNBU1RfS0lORDoNCisJCQljYXNlIENvbVByb3RvY29sOjpQUk9UT0NPTF9BTllDQVNUX0tJTkQ6DQorCQkJew0KKwkJCQlSdW50aW1lSUQgYnVmZmVyRGVjbFJJRCA9IGFSb3V0aW5nUklEOw0KKw0KKwkJCQlMaXN0T2ZJbnN0YW5jZU9mQnVmZmVyOjpjb25zdF9pdGVyYXRvciBpdEJ1ZmZlciA9DQorCQkJCQkJYVJvdXRpbmdEYXRhLmdldEJ1ZmZlckluc3RhbmNlKCkuYmVnaW4oKTsNCisJCQkJTGlzdE9mSW5zdGFuY2VPZkJ1ZmZlcjo6Y29uc3RfaXRlcmF0b3IgZW5kQnVmZmVyID0NCisJCQkJCQlhUm91dGluZ0RhdGEuZ2V0QnVmZmVySW5zdGFuY2UoKS5lbmQoKTsNCisJCQkJZm9yKCA7IGl0QnVmZmVyICE9IGVuZEJ1ZmZlciA7ICsraXRCdWZmZXIgKQ0KKwkJCQl7DQorCQkJCQlidWZmZXJEZWNsUklEID0gYW5FRC5nZXRSdW50aW1lQ29udGFpbmVyUklEKA0KKwkJCQkJCQlhUmVjZWl2ZXJSSUQsICgqaXRCdWZmZXIpICk7DQorDQorCQkJCQlpZiggYnVmZmVyRGVjbFJJRC52YWxpZCgpICkNCisJCQkJCXsNCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU1RBVEVNRU5UX0NPTU1VTklDQVRJT04gKQ0KKwlBVk1fT1NfVFJBQ0UgPDwgImNvbXB1dGVQcmVzZW5jZSA6PiAiDQorCQkJPDwgc3RyX2hlYWRlciggYVBvcnQgKSA8PCBzdGQ6OmVuZGwNCisJCQk8PCAiUm91dGluZ1JJRCAgOiAiIDw8IGFSb3V0aW5nUklELmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkNCisJCQk8PCBzdGQ6OmVuZGwNCisJCQk8PCAiQnVmZmVyUklEICAgOiAiIDw8IGJ1ZmZlckRlY2xSSUQuZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQ0KKwkJCTw8IHN0ZDo6ZW5kbA0KKwkJCTw8ICJSZWNlaXZlclJJRCA6ICIgPDwgYVJlY2VpdmVyUklELmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkNCisJCQk8PCBzdGQ6OmVuZGw7DQorCWFSb3V0aW5nRGF0YS50b1N0cmVhbShBVk1fT1NfVFJBQ0UpOw0KKwlhbkVELmdldFJ1bnRpbWUoYnVmZmVyRGVjbFJJRCkudG9TdHJlYW0oQVZNX09TX1RSQUNFKTsNCitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU1RBVEVNRU5UX0NPTU1VTklDQVRJT04gKQ0KKw0KKwkJCQkJCWNvbnN0IEJhc2VCdWZmZXJGb3JtICYgYmJmID0gYW5FRC5nZXRSdW50aW1lKA0KKwkJCQkJCQkJYnVmZmVyRGVjbFJJRCApLmdldEJ1ZmZlcigqaXRCdWZmZXIpOw0KKw0KKwkJCQkJCWlmKCBiYmYubm9uZW1wdHkoKSApDQorCQkJCQkJew0KKwkJCQkJCQlpZiggYVJvdXRpbmdSSUQuZ2V0RXhlY3V0YWJsZSgpLT4NCisJCQkJCQkJCQlnZXRTcGVjaWZpZXIoKS5oYXNGZWF0dXJlSW5wdXRFbmFibGVkKCkgKQ0KKwkJCQkJCQl7DQorCQkJCQkJCQlpZiggYmJmLmNvbnRhaW5zKA0KKwkJCQkJCQkJCQlhUm91dGluZ0RhdGEuZ2V0TUlEKCksIGFSZWNlaXZlclJJRCkgKQ0KKwkJCQkJCQkJew0KKwkJCQkJCQkJCXJldHVybiggdHJ1ZSApOw0KKwkJCQkJCQkJfQ0KKwkJCQkJCQl9DQorCQkJCQkJCWVsc2UgaWYoIGJiZi5pc1RvcChhUm91dGluZ0RhdGEuZ2V0TUlEKCksDQorCQkJCQkJCQkJYVJlY2VpdmVyUklEKSApDQorCQkJCQkJCXsNCisJCQkJCQkJCXJldHVybiggdHJ1ZSApOw0KKwkJCQkJCQl9DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCXJldHVybiggZmFsc2UgKTsNCisJCQl9DQorDQorCQkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfUkRWX0tJTkQ6DQorCQkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfTVVMVElSRFZfS0lORDoNCisNCisJCQljYXNlIENvbVByb3RvY29sOjpQUk9UT0NPTF9VTkRFRklORURfS0lORDoNCisJCQlkZWZhdWx0Og0KKwkJCXsNCisJCQkJcmV0dXJuKCBmYWxzZSApOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwlyZXR1cm4oIGZhbHNlICk7DQorfQ0KKw0KKw0KKy8qDQorICogQ29sbGVjdCBidWZmZXIgbWVzc2FnZQ0KKyAqLw0KK3ZvaWQgQXZtQ29tbXVuaWNhdGlvbkZhY3Rvcnk6OmNvbGxlY3RCdWZmZXJNZXNzYWdlKA0KKwkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQsIEJhc2VCdWZmZXJGb3JtICYgYUJ1ZmZlcikNCit7DQorCVRhYmxlT2ZCdWZmZXJUOjpjb25zdF9pdGVyYXRvciBpdEJ1ZmZlcjsNCisJVGFibGVPZkJ1ZmZlclQ6OmNvbnN0X2l0ZXJhdG9yIGVuZEJ1ZmZlcjsNCisNCisJVGFibGVPZlJ1bnRpbWVUOjpjb25zdF9pdGVyYXRvciBpdFJGID0gYW5FRC5nZXRUYWJsZU9mUnVudGltZSgpLmJlZ2luKCk7DQorCVRhYmxlT2ZSdW50aW1lVDo6Y29uc3RfaXRlcmF0b3IgZW5kUkYgPSBhbkVELmdldFRhYmxlT2ZSdW50aW1lKCkuZW5kKCk7DQorCWZvciggOyBpdFJGICE9IGVuZFJGIDsgKytpdFJGICkNCisJew0KKwkJaWYoICgqaXRSRiktPmhhc0J1ZmZlclRhYmxlKCkgKQ0KKwkJew0KKwkJCWl0QnVmZmVyID0gKCppdFJGKS0+Z2V0QnVmZmVyVGFibGUoKS5iZWdpbigpOw0KKwkJCWVuZEJ1ZmZlciA9ICgqaXRSRiktPmdldEJ1ZmZlclRhYmxlKCkuZW5kKCk7DQorCQkJZm9yKCA7IGl0QnVmZmVyICE9IGVuZEJ1ZmZlciA7ICsraXRCdWZmZXIgKQ0KKwkJCXsNCisJCQkJKCppdEJ1ZmZlciktPmNvcHlUbyggYUJ1ZmZlciApOw0KKwkJCX0NCisJCX0NCisJfQ0KK30NCisNCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bUNvbW11bmljYXRpb25GYWN0b3J5LmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtQ29tbXVuaWNhdGlvbkZhY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGFiZjc1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bUNvbW11bmljYXRpb25GYWN0b3J5LmgKQEAgLTAsMCArMSwyNzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULg0KKyAqDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENyZWF0ZWQgb246IDI3IG9jdC4gMjAxMA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyDQorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2lmbmRlZiBBVk1DT01NVU5JQ0FUSU9ORkFDVE9SWV9IXw0KKyNkZWZpbmUgQVZNQ09NTVVOSUNBVElPTkZBQ1RPUllfSF8NCisNCisNCisjaW5jbHVkZSA8Y29sbGVjdGlvbi9UeXBlZGVmLmg+DQorDQorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZQb3J0Lmg+DQorDQorI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkRhdGEuaD4NCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvUnVudGltZUlELmg+DQorDQorDQorbmFtZXNwYWNlIHNlcA0KK3sNCisNCitjbGFzcyBDT01QSUxFX0NPTlRFWFQ7DQorDQorY2xhc3MgQXZtQ29kZTsNCisNCitjbGFzcyBFdmFsdWF0aW9uRW52aXJvbm1lbnQ7DQorY2xhc3MgRXhlY3V0aW9uRW52aXJvbm1lbnQ7DQorDQorY2xhc3MgSW5zdGFuY2VPZkJ1ZmZlcjsNCisNCitjbGFzcyBNZXNzYWdlOw0KKw0KK2NsYXNzIFJvdXRpbmdEYXRhOw0KK2NsYXNzIFJ1bnRpbWVJRDsNCisNCisNCitjbGFzcyBBdm1Db21tdW5pY2F0aW9uRmFjdG9yeQ0KK3sNCisNCitwcml2YXRlOg0KKw0KKwkvKioNCisJICogQ09OU1RSVUNUT1INCisJICogRGVmYXVsdA0KKwkgKi8NCisJQXZtQ29tbXVuaWNhdGlvbkZhY3RvcnkoKQ0KKwl7DQorCQkvLyEhIE5PVEhJTkcNCisJfQ0KKw0KKwkvKioNCisJICogREVTVFJVQ1RPUg0KKwkgKi8NCisJdmlydHVhbCB+QXZtQ29tbXVuaWNhdGlvbkZhY3RvcnkoKQ0KKwl7DQorCQkvLyEhIE5PVEhJTkcNCisJfQ0KKw0KKw0KK3B1YmxpYzoNCisNCisJLyoqDQorCSAqIFNFQVJDSCBST1VUSU5HIERBVEENCisJICovDQorCXN0YXRpYyBjb25zdCBSb3V0aW5nRGF0YSAmIHNlYXJjaElucHV0Um91dGluZ0RhdGEoDQorCQkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQsIEluc3RhbmNlT2ZQb3J0ICogYVBvcnQsDQorCQkJUnVudGltZUlEICYgYVJvdXRpbmdSSUQgKTsNCisNCisJaW5saW5lIHN0YXRpYyBjb25zdCBSb3V0aW5nRGF0YSAmIHNlYXJjaElucHV0Um91dGluZ0RhdGEoDQorCQkJY29uc3QgQVBFeGVjdXRpb25EYXRhICYgYW5FRCwgSW5zdGFuY2VPZlBvcnQgKiBhUG9ydCwNCisJCQlSdW50aW1lSUQgJiBhUm91dGluZ1JJRCApDQorCXsNCisJCXJldHVybiggc2VhcmNoSW5wdXRSb3V0aW5nRGF0YSggKCogYW5FRCkgLCBhUG9ydCAsIGFSb3V0aW5nUklEICkgKTsNCisJfQ0KKw0KKw0KKwlzdGF0aWMgY29uc3QgUm91dGluZ0RhdGEgJiBzZWFyY2hPdXRwdXRSb3V0aW5nRGF0YSgNCisJCQljb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwgSW5zdGFuY2VPZlBvcnQgKiBhUG9ydCwNCisJCQlSdW50aW1lSUQgJiBhUm91dGluZ1JJRCApOw0KKw0KKwlpbmxpbmUgc3RhdGljIGNvbnN0IFJvdXRpbmdEYXRhICYgc2VhcmNoT3V0cHV0Um91dGluZ0RhdGEoDQorCQkJY29uc3QgQVBFeGVjdXRpb25EYXRhICYgYW5FRCwgSW5zdGFuY2VPZlBvcnQgKiBhUG9ydCwNCisJCQlSdW50aW1lSUQgJiBhUm91dGluZ1JJRCApDQorCXsNCisJCXJldHVybiggc2VhcmNoT3V0cHV0Um91dGluZ0RhdGEoICgqIGFuRUQpICwgYVBvcnQgLCBhUm91dGluZ1JJRCApICk7DQorCX0NCisNCisNCisJLyoNCisJICogQ0hFQ0sgUk9VVElORyBJTkZPUk1BVElPTg0KKwkgKi8NCisJc3RhdGljIGJvb2wgaXNSb3V0aW5nUHJvdG9jb2xFbnYoQ09NUElMRV9DT05URVhUICogYUNUWCwNCisJCQlJbnN0YW5jZU9mUG9ydCAqIGFQb3J0KTsNCisNCisJc3RhdGljIGJvb2wgaXNSb3V0aW5nUHJvdG9jb2xSZHYoQ09NUElMRV9DT05URVhUICogYUNUWCwNCisJCQlJbnN0YW5jZU9mUG9ydCAqIGFQb3J0KTsNCisNCisNCisJLyoNCisJICogUE9QIE1FU1NBR0UNCisJICovDQorCXN0YXRpYyBib29sIHBvcE1lc3NhZ2UoRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsDQorCQkJSW5zdGFuY2VPZlBvcnQgKiBhUG9ydCk7DQorDQorCXN0YXRpYyBib29sIHBvcE1lc3NhZ2VfZW52aXJvbm1lbnQoRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsDQorCQkJY29uc3QgUnVudGltZUlEICYgYVJvdXRpbmdSSUQsIGNvbnN0IFJvdXRpbmdEYXRhICYgYVJvdXRpbmdEYXRhLA0KKwkJCWF2bV9zaXplX3QgZmlyc3RQYXJhbWV0ZXJPZmZzZXQgPSAxKTsNCisNCisJc3RhdGljIGJvb2wgcG9wTWVzc2FnZV90cmFuc2ZlcnQoRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsDQorCQkJY29uc3QgUnVudGltZUlEICYgYVJvdXRpbmdSSUQsIGNvbnN0IFJvdXRpbmdEYXRhICYgYVJvdXRpbmdEYXRhKTsNCisNCisJc3RhdGljIGJvb2wgcG9wTWVzc2FnZV9idWZmZXIoRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsDQorCQkJY29uc3QgUnVudGltZUlEICYgYVJvdXRpbmdSSUQsIGNvbnN0IFJvdXRpbmdEYXRhICYgYVJvdXRpbmdEYXRhKTsNCisNCisJc3RhdGljIGJvb2wgcG9wTWVzc2FnZV9yZHYoRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsDQorCQkJY29uc3QgUnVudGltZUlEICYgYVJvdXRpbmdSSUQsIGNvbnN0IFJvdXRpbmdEYXRhICYgYVJvdXRpbmdEYXRhKTsNCisNCisNCisJLyoNCisJICogUE9QIE1FU1NBR0UgRlJPTQ0KKwkgKi8NCisJc3RhdGljIGJvb2wgcG9wTWVzc2FnZUZyb20oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpOw0KKw0KKwlzdGF0aWMgYm9vbCBwb3BNZXNzYWdlRnJvbV90cmFuc2ZlcnQoDQorCQlFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOViwgY29uc3QgUnVudGltZUlEICYgYVNlbmRlclJJRCwNCisJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSb3V0aW5nUklELCBjb25zdCBSb3V0aW5nRGF0YSAmIGFSb3V0aW5nRGF0YSk7DQorDQorCXN0YXRpYyBib29sIHBvcE1lc3NhZ2VGcm9tX2J1ZmZlcigNCisJCUV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WLCBjb25zdCBSdW50aW1lSUQgJiBhU2VuZGVyUklELA0KKwkJY29uc3QgUnVudGltZUlEICYgYVJvdXRpbmdSSUQsIGNvbnN0IFJvdXRpbmdEYXRhICYgYVJvdXRpbmdEYXRhKTsNCisNCisJc3RhdGljIGJvb2wgcG9wTWVzc2FnZUZyb21fcmR2KA0KKwkJRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsIGNvbnN0IFJ1bnRpbWVJRCAmIGFTZW5kZXJSSUQsDQorCQljb25zdCBSdW50aW1lSUQgJiBhUm91dGluZ1JJRCwgY29uc3QgUm91dGluZ0RhdGEgJiBhUm91dGluZ0RhdGEpOw0KKw0KKw0KKwkvKg0KKwkgKiBQVVNIIE1FU1NBR0UNCisJICovDQorCXN0YXRpYyBib29sIHB1c2hNZXNzYWdlKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WLA0KKwkJCWNvbnN0IE1lc3NhZ2UgJiBhbk91dHB1dE1zZywgUnVudGltZUlEIGFSb3V0aW5nUklEKTsNCisNCisJc3RhdGljIGJvb2wgcHVzaE1lc3NhZ2VfZW52aXJvbm1lbnQoDQorCQkJRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSb3V0aW5nUklELA0KKwkJCWNvbnN0IFJvdXRpbmdEYXRhICYgYVJvdXRpbmdEYXRhLCBjb25zdCBNZXNzYWdlICYgYW5PdXRwdXRNc2cpOw0KKw0KKwlzdGF0aWMgYm9vbCBwdXNoTWVzc2FnZV90cmFuc2ZlcnQoDQorCQkJRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSb3V0aW5nUklELA0KKwkJCWNvbnN0IFJvdXRpbmdEYXRhICYgYVJvdXRpbmdEYXRhLCBjb25zdCBNZXNzYWdlICYgYW5PdXRwdXRNc2cpOw0KKw0KKwlzdGF0aWMgYm9vbCBwdXNoTWVzc2FnZV9idWZmZXIoDQorCQkJRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSb3V0aW5nUklELA0KKwkJCWNvbnN0IFJvdXRpbmdEYXRhICYgYVJvdXRpbmdEYXRhLCBjb25zdCBNZXNzYWdlICYgYW5PdXRwdXRNc2cpOw0KKw0KKwlzdGF0aWMgYm9vbCBwdXNoTWVzc2FnZV9yZHYoDQorCQkJRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSb3V0aW5nUklELA0KKwkJCWNvbnN0IFJvdXRpbmdEYXRhICYgYVJvdXRpbmdEYXRhLCBjb25zdCBNZXNzYWdlICYgYW5PdXRwdXRNc2cpOw0KKw0KKwlzdGF0aWMgYm9vbCBwdXNoTWVzc2FnZV9icm9hZGNhc3QoDQorCQkJRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSb3V0aW5nUklELA0KKwkJCWNvbnN0IFJvdXRpbmdEYXRhICYgYVJvdXRpbmdEYXRhLCBjb25zdCBNZXNzYWdlICYgYW5PdXRwdXRNc2cpOw0KKw0KKwlzdGF0aWMgYm9vbCBwdXNoTWVzc2FnZV9tdWx0aWNhc3QoDQorCQkJRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsDQorCQkJY29uc3QgUnVudGltZUlEICYgYVJvdXRpbmdSSUQsDQorCQkJY29uc3QgUm91dGluZ0RhdGEgJiBhUm91dGluZ0RhdGEsDQorCQkJY29uc3QgTWVzc2FnZSAmIGFuT3V0cHV0TXNnKTsNCisNCisJc3RhdGljIGJvb2wgcHVzaE1lc3NhZ2VfdW5pY2FzdCgNCisJCQlFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOViwgY29uc3QgUnVudGltZUlEICYgYVJvdXRpbmdSSUQsDQorCQkJY29uc3QgUm91dGluZ0RhdGEgJiBhUm91dGluZ0RhdGEsIGNvbnN0IE1lc3NhZ2UgJiBhbk91dHB1dE1zZyk7DQorDQorCXN0YXRpYyBib29sIHB1c2hNZXNzYWdlX2FueWNhc3QoDQorCQkJRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSb3V0aW5nUklELA0KKwkJCWNvbnN0IFJvdXRpbmdEYXRhICYgYVJvdXRpbmdEYXRhLCBjb25zdCBNZXNzYWdlICYgYW5PdXRwdXRNc2cpOw0KKw0KKw0KKwkvKg0KKwkgKiBQVVNIIE1FU1NBR0UgVE8NCisJICovDQorCXN0YXRpYyBib29sIHB1c2hNZXNzYWdlVG8oDQorCQkJRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsIGNvbnN0IE1lc3NhZ2UgJiBhbk91dHB1dE1zZyk7DQorDQorCXN0YXRpYyBib29sIHB1c2hNZXNzYWdlVG9fdHJhbnNmZXJ0KA0KKwkJCUV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WLCBjb25zdCBSdW50aW1lSUQgJiBhUm91dGluZ1JJRCwNCisJCQljb25zdCBSb3V0aW5nRGF0YSAmIGFSb3V0aW5nRGF0YSwgY29uc3QgTWVzc2FnZSAmIGFuT3V0cHV0TXNnKTsNCisNCisJc3RhdGljIGJvb2wgcHVzaE1lc3NhZ2VUb19idWZmZXIoDQorCQkJRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSb3V0aW5nUklELA0KKwkJCWNvbnN0IFJvdXRpbmdEYXRhICYgYVJvdXRpbmdEYXRhLCBjb25zdCBNZXNzYWdlICYgYW5PdXRwdXRNc2cpOw0KKw0KKwlzdGF0aWMgYm9vbCBwdXNoTWVzc2FnZVRvX3JkdigNCisJCQlFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOViwgY29uc3QgUnVudGltZUlEICYgYVJvdXRpbmdSSUQsDQorCQkJY29uc3QgUm91dGluZ0RhdGEgJiBhUm91dGluZ0RhdGEsIGNvbnN0IE1lc3NhZ2UgJiBhbk91dHB1dE1zZyk7DQorDQorCXN0YXRpYyBib29sIHB1c2hNZXNzYWdlVG9fYnJvYWRjYXN0KA0KKwkJCUV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WLCBjb25zdCBSdW50aW1lSUQgJiBhUm91dGluZ1JJRCwNCisJCQljb25zdCBSb3V0aW5nRGF0YSAmIGFSb3V0aW5nRGF0YSwgY29uc3QgTWVzc2FnZSAmIGFuT3V0cHV0TXNnKTsNCisNCisJc3RhdGljIGJvb2wgcHVzaE1lc3NhZ2VUb19tdWx0aWNhc3QoDQorCQkJRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSb3V0aW5nUklELA0KKwkJCWNvbnN0IFJvdXRpbmdEYXRhICYgYVJvdXRpbmdEYXRhLCBjb25zdCBNZXNzYWdlICYgYW5PdXRwdXRNc2cpOw0KKw0KKwlzdGF0aWMgYm9vbCBwdXNoTWVzc2FnZVRvX3VuaWNhc3QoDQorCQkJRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSb3V0aW5nUklELA0KKwkJCWNvbnN0IFJvdXRpbmdEYXRhICYgYVJvdXRpbmdEYXRhLCBjb25zdCBNZXNzYWdlICYgYW5PdXRwdXRNc2cpOw0KKw0KKwlzdGF0aWMgYm9vbCBwdXNoTWVzc2FnZVRvX2FueWNhc3QoDQorCQkJRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSb3V0aW5nUklELA0KKwkJCWNvbnN0IFJvdXRpbmdEYXRhICYgYVJvdXRpbmdEYXRhLCBjb25zdCBNZXNzYWdlICYgYW5PdXRwdXRNc2cpOw0KKw0KKw0KKwkvKg0KKwkgKiBVUERBVEUgQlVGRkVSDQorCSAqLw0KKwlzdGF0aWMgYm9vbCB1cGRhdGVCdWZmZXIoQVBFeGVjdXRpb25EYXRhICYgYW5FRCk7DQorDQorDQorCS8qDQorCSAqIFBSRVNFTkNFIC8gQUJTRU5DRSBzdGF0dXMNCisJICovDQorCXN0YXRpYyBib29sIGNvbXB1dGVQcmVzZW5jZShjb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwNCisJCQljb25zdCBSdW50aW1lSUQgJiBhUmVjZWl2ZXJSSUQsIEluc3RhbmNlT2ZQb3J0ICogYVBvcnQpOw0KKw0KKwlpbmxpbmUgc3RhdGljIGJvb2wgY29tcHV0ZVByZXNlbmNlKA0KKwkJCWNvbnN0IEFQRXhlY3V0aW9uRGF0YSAmIGFuRUQsIEluc3RhbmNlT2ZQb3J0ICogYVBvcnQpDQorCXsNCisJCXJldHVybiggY29tcHV0ZVByZXNlbmNlKCgqIGFuRUQpLCBhbkVELT5tUklELCBhUG9ydCkgKTsNCisJfQ0KKw0KKw0KKwlpbmxpbmUgc3RhdGljIGJvb2wgY29tcHV0ZUFic2VuY2UoY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQsDQorCQkJY29uc3QgUnVudGltZUlEICYgYVJlY2VpdmVyUklELCBJbnN0YW5jZU9mUG9ydCAqIGFQb3J0KQ0KKwl7DQorCQlyZXR1cm4oIG5vdCBjb21wdXRlUHJlc2VuY2UoYW5FRCwgYVJlY2VpdmVyUklELCBhUG9ydCkgKTsNCisJfQ0KKw0KKwlpbmxpbmUgc3RhdGljIGJvb2wgY29tcHV0ZUFic2VuY2UoDQorCQkJY29uc3QgQVBFeGVjdXRpb25EYXRhICYgYW5FRCwgSW5zdGFuY2VPZlBvcnQgKiBhUG9ydCkNCisJew0KKwkJcmV0dXJuKCBub3QgY29tcHV0ZVByZXNlbmNlKCgqIGFuRUQpLCBhbkVELT5tUklELCBhUG9ydCkgKTsNCisJfQ0KKw0KKw0KKwkvKg0KKwkgKiBDb2xsZWN0IGJ1ZmZlciBtZXNzYWdlDQorCSAqLw0KKwlzdGF0aWMgdm9pZCBjb2xsZWN0QnVmZmVyTWVzc2FnZSgNCisJCQljb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwgQmFzZUJ1ZmZlckZvcm0gJiBhQnVmZmVyKTsNCisNCisJaW5saW5lIHN0YXRpYyB2b2lkIGNvbGxlY3RCdWZmZXJNZXNzYWdlKA0KKwkJCWNvbnN0IEFQRXhlY3V0aW9uRGF0YSAmIGFuRUQsIEJhc2VCdWZmZXJGb3JtICYgYUJ1ZmZlcikNCisJew0KKwkJY29sbGVjdEJ1ZmZlck1lc3NhZ2UoICgqIGFuRUQpICwgYUJ1ZmZlciApOw0KKwl9DQorDQorfTsNCisNCisNCit9DQorDQorI2VuZGlmIC8qIEFWTUNPTU1VTklDQVRJT05GQUNUT1JZX0hfICovDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bUNvbW11bmljYXRpb25QcmltaXRpdmUuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bUNvbW11bmljYXRpb25QcmltaXRpdmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYTM3ODYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtQ29tbXVuaWNhdGlvblByaW1pdGl2ZS5jcHAKQEAgLTAsMCArMSw4NTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULg0KKyAqDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENyZWF0ZWQgb246IDIwIG1haSAyMDEwDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnINCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSAiQXZtQ29tbXVuaWNhdGlvblByaW1pdGl2ZS5oIg0KKw0KKyNpbmNsdWRlIDxidWlsZGVyL0J1aWxkZXIuaD4NCisNCisjaW5jbHVkZSA8Y29tcHV0ZXIvRXZhbHVhdGlvbkVudmlyb25tZW50Lmg+DQorI2luY2x1ZGUgPGNvbXB1dGVyL0V4ZWN1dGlvbkRhdGFGYWN0b3J5Lmg+DQorI2luY2x1ZGUgPGNvbXB1dGVyL0V4ZWN1dGlvbkVudmlyb25tZW50Lmg+DQorI2luY2x1ZGUgPGNvbXB1dGVyL1BhdGhDb25kaXRpb25Qcm9jZXNzb3IuaD4NCisNCisjaW5jbHVkZSA8Y29tcHV0ZXIvcHJpbWl0aXZlL0F2bUNvbW11bmljYXRpb25GYWN0b3J5Lmg+DQorI2luY2x1ZGUgPGNvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1Bc3NpZ25QcmltaXRpdmUuaD4NCisNCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQXZtQ29kZS5oPg0KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29uc3RhbnQuaD4NCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvblNpbXBsaWZpZXIuaD4NCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vU3RhdGVtZW50Q29uc3RydWN0b3IuaD4NCisNCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uQ29uZmlndXJhdGlvbi5oPg0KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25EYXRhLmg+DQorI2luY2x1ZGUgPGZtbC9ydW50aW1lL1J1bnRpbWVMaWIuaD4NCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvUnVudGltZUlELmg+DQorDQorDQorbmFtZXNwYWNlIHNlcA0KK3sNCisNCisNCisvKioNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogZXhlY3V0aW9uIG9mIGFuIElOUFVUIHByb2dyYW0NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICovDQorDQorYm9vbCBBdm1QcmltaXRpdmVfSW5wdXQ6OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikNCit7DQorQVZNX0lGX0RFQlVHX0ZMQUdfQU5EX05PVF9GTEFHKCBDT01NVU5JQ0FUSU9OICwgU1RBVEVNRU5UICkNCisJQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiSW5wdXQgTWVzc2FnZSB0byByZWNlaXZlOiAiDQorCQkJPDwgRU5WLmluQ09ERS0+c3RyKCkgPDwgc3RkOjplbmRsOw0KK0FWTV9FTkRJRl9ERUJVR19GTEFHX0FORF9OT1RfRkxBRyggQ09NTVVOSUNBVElPTiAsIFNUQVRFTUVOVCApDQorDQorCWlmKCBub3QgQXZtQ29tbXVuaWNhdGlvbkZhY3Rvcnk6OnBvcE1lc3NhZ2UoRU5WLA0KKwkJCUVOVi5tQVJHLT5hdCgwKS50b19wdHI8IEluc3RhbmNlT2ZQb3J0ID4oKSkgKQ0KKwl7DQorQVZNX0lGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVCkNCisJQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiVEhST1cgVU5TQVRJU0ZJRUQgPDwgSU5QVVQgPj4gOj4gIg0KKwkJCTw8IEVOVi5tQVJHLT5vdXRFRC0+bVJJRC5zdHJVbmlxSWQoKQ0KKwkJCTw8ICIgfD0+ICIgPDwgRU5WLmluQ09ERS0+c3RyKCkgPDwgc3RkOjplbmRsOw0KK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTVEFURU1FTlQpDQorCX0NCisNCisJcmV0dXJuKCB0cnVlICk7DQorfQ0KKw0KKw0KK2Jvb2wgQXZtUHJpbWl0aXZlX0lucHV0VmFyOjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpDQorew0KKwlJbnN0YW5jZU9mRGF0YSAqIGFuSW5zdGFuY2UgPSBFTlYubUFSRy0+YXQoMCkudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCk7DQorDQorCUJGTGlzdCBwYXJhbUxpc3Q7DQorCUJGIGFOZXdTeW1ib2xpY0NvbnN0YW50KCBFTlYuY3JlYXRlTmV3RnJlc2hQYXJhbShFTlYubUFSRy0+b3V0RUQtPm1SSUQsDQorCQkJYW5JbnN0YW5jZSwgcGFyYW1MaXN0KSApOw0KKw0KKwlFeGVjdXRpb25EYXRhRmFjdG9yeTo6YXBwZW5kSU9FbGVtZW50VHJhY2UoRU5WLm1BUkctPm91dEVELA0KKwkJCUJGKCBuZXcgRXhlY3V0aW9uQ29uZmlndXJhdGlvbihFTlYubUFSRy0+b3V0RUQtPm1SSUQsDQorCQkJCQlCRkNvZGUoT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9JTlBVVCwNCisJCQkJCQkJCUVOVi5tQVJHLT5hdCgwKSwgYU5ld1N5bWJvbGljQ29uc3RhbnQpKSApICk7DQorDQorCWlmKCBFTlYuc2V0UnZhbHVlKEVOVi5tQVJHLT5vdXRFRCwgYW5JbnN0YW5jZSwgYU5ld1N5bWJvbGljQ29uc3RhbnQpICkNCisJew0KKwkJRU5WLm1BUkctPm91dEVELmFwcGVuZFBhcmFtZXRlcnMoIHBhcmFtTGlzdCApOw0KKw0KKwkJRU5WLmFwcGVuZE91dHB1dCggRU5WLm1BUkctPm91dEVEICk7DQorDQorCQlyZXR1cm4oIHRydWUgKTsNCisJfQ0KKw0KKwlyZXR1cm4oIGZhbHNlICk7DQorfQ0KKw0KKw0KK2Jvb2wgQXZtUHJpbWl0aXZlX0lucHV0RW52OjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpDQorew0KKwlCRkNvZGUgYVRyYWNlSW5wdXQoT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9JTlBVVF9FTlYsIEVOVi5tQVJHLT5hdCgwKSk7DQorDQorCWJvb2wgYWxsU3VjY2VzcyA9IHRydWU7DQorDQorCWlmKCBFTlYuaW5DT0RFLT5wb3B1bGF0ZWQoKSApDQorCXsNCisJCUVOVi5tQVJHLT5vdXRFRC5tYWtlTW9kaWZpYWJsZVBhcmFtVGFibGUoKTsNCisNCisJCUluc3RhbmNlT2ZQb3J0ICogYVBvcnQgPSBFTlYubUFSRy0+YXQoMCkudG9fcHRyPCBJbnN0YW5jZU9mUG9ydCA+KCk7DQorCQlhdm1fc2l6ZV90IG9mZnNldCA9IDA7DQorDQorCQlJbnN0YW5jZU9mRGF0YSAqIGFWYXIgPSBOVUxMOw0KKwkJQkYgYU5ld1N5bWJvbGljQ29uc3RhbnQ7DQorCQlCRkxpc3QgcGFyYW1MaXN0Ow0KKw0KKwkJZm9yKCBFTlYubUFSRy0+YmVnaW4oMSkgOyBFTlYubUFSRy0+aGFzTmV4dCgpIDsNCisJCQkJRU5WLm1BUkctPm5leHQoKSAsICsrb2Zmc2V0ICkNCisJCXsNCisJCQlwYXJhbUxpc3QuY2xlYXIoKTsNCisNCisJCQlhVmFyID0gRU5WLm1BUkctPmN1cnJlbnQoKS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKTsNCisNCisJCQlhTmV3U3ltYm9saWNDb25zdGFudCA9IEVOVi5jcmVhdGVOZXdGcmVzaFBhcmFtKA0KKwkJCQkJRU5WLm1BUkctPm91dEVELT5tUklELCBhUG9ydC0+Z2V0UGFyYW1ldGVyVHlwZShvZmZzZXQpLA0KKwkJCQkJYVZhciwgcGFyYW1MaXN0KTsNCisNCisJCQlpZiggbm90IEVOVi5zZXRSdmFsdWUoRU5WLm1BUkctPm91dEVELCBhVmFyLCBhTmV3U3ltYm9saWNDb25zdGFudCkgKQ0KKwkJCXsNCisJCQkJYWxsU3VjY2VzcyA9IGZhbHNlOw0KKw0KKwkJCQlicmVhazsNCisJCQl9DQorDQorCQkJRU5WLm1BUkctPm91dEVELmFwcGVuZFBhcmFtZXRlcnMoIHBhcmFtTGlzdCApOw0KKw0KKwkJCWFUcmFjZUlucHV0LT5hcHBlbmQoIGFOZXdTeW1ib2xpY0NvbnN0YW50ICk7DQorCQl9DQorCX0NCisNCisJaWYoIGFsbFN1Y2Nlc3MgKQ0KKwl7DQorCQlFeGVjdXRpb25EYXRhRmFjdG9yeTo6YXBwZW5kSU9FbGVtZW50VHJhY2UoRU5WLm1BUkctPm91dEVELA0KKwkJCQlCRiggbmV3IEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24oDQorCQkJCQkJRU5WLm1BUkctPm91dEVELT5tUklELCBhVHJhY2VJbnB1dCkgKSApOw0KKw0KKwkJRU5WLm91dEVEUy5hcHBlbmQoIEVOVi5tQVJHLT5vdXRFRCApOw0KKw0KKwkJcmV0dXJuKCB0cnVlICk7DQorCX0NCisJZWxzZQ0KKwl7DQorCQlyZXR1cm4oIGZhbHNlICk7DQorCX0NCit9DQorDQorDQorYm9vbCBBdm1QcmltaXRpdmVfSW5wdXRCdWZmZXI6OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikNCit7DQorQVZNX0lGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9DT01NVU5JQ0FUSU9OICkNCisJQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiYmVnaW4gQXZtUHJpbWl0aXZlX0lucHV0QnVmZmVyOjpydW4iIDw8IHN0ZDo6ZW5kbDsNCisNCisJRU5WLm1BUkctPm91dEVELT5nZXRSdW50aW1lKDEpLnRvU3RyZWFtRGF0YSgNCisJCQlFTlYubUFSRy0+b3V0RUQsIEFWTV9PU19UUkFDRSA8PCBJTkNSMl9JTkRFTlRfVEFCKTsNCisJQVZNX09TX1RSQUNFIDw8IERFQ1IyX0lOREVOVDsNCitBVk1fRU5ESUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX0NPTU1VTklDQVRJT04gKQ0KKw0KKw0KKwljb25zdCBSb3V0aW5nRGF0YSAmIGFSb3V0aW5nRGF0YSA9DQorCQkJRU5WLm1BUkctPmF0KDApLnRvX3B0cjwgSW5zdGFuY2VPZlBvcnQgPigpLT5nZXRJbnB1dFJvdXRpbmdEYXRhKCk7DQorDQorCWNvbnN0IFJ1bnRpbWVJRCAmIGFSb3V0aW5nUklEID0gYVJvdXRpbmdEYXRhLmdldFJ1bnRpbWVSSUQoKTsNCisNCisJUnVudGltZUlEIGJ1ZmZlckRlY2xSSUQgPSBhUm91dGluZ1JJRDsNCisNCisJSW5zdGFuY2VPZkJ1ZmZlciAqIGFCdWZmZXIgPSBhUm91dGluZ0RhdGEuZ2V0QnVmZmVySW5zdGFuY2UoKS5maXJzdCgpOw0KKw0KKwlidWZmZXJEZWNsUklEID0gRU5WLm1BUkctPm91dEVELT5nZXRSdW50aW1lQ29udGFpbmVyUklEKA0KKwkJCUVOVi5tQVJHLT5vdXRFRC0+bVJJRCwgYUJ1ZmZlcik7DQorCWlmKCBidWZmZXJEZWNsUklELnZhbGlkKCkgKQ0KKwl7DQorCQlCYXNlQnVmZmVyRm9ybSAmIGJiZiA9DQorCQkJCUVOVi5tQVJHLT5vdXRFRC5nZXRXcml0YWJsZVJ1bnRpbWUoDQorCQkJCQkJYnVmZmVyRGVjbFJJRCApLmdldFdyaXRhYmxlQnVmZmVyKCBhQnVmZmVyICk7DQorDQorCQlNZXNzYWdlIHBvcE1zZzsNCisvKiEhSU5QVVQjRU5BQkxFRCEhDQorCQlpZiggRU5WLm1BUkctPm91dEVELT5nZXRSdW50aW1lKEVOVi5tQVJHLT5vdXRFRC0+bVJJRCkuaXNJbnB1dEVuYWJsZWQoKQ0KKwkJCXx8IEVOVi5tQVJHLT5vdXRFRC0+Z2V0UnVudGltZShhUm91dGluZ1JJRCkuaXNJbnB1dEVuYWJsZWQoKQ0KKwkJCXx8IGFSb3V0aW5nRGF0YS5pc0lucHV0RW5hYmxlZCgpIHx8IGJiZi0+aXNJbnB1dEVuYWJsZWQoKSApDQorCQl7DQorCQkJcG9wTXNnID0gYmJmLT5wb3BVbnRpbChhUm91dGluZ0RhdGEuZ2V0TUlEKCkpOw0KKwkJfQ0KKwkJZWxzZSovDQorCQl7DQorCQkJcG9wTXNnID0gYmJmLnBvcChhUm91dGluZ0RhdGEuZ2V0TUlEKCksIEVOVi5tQVJHLT5vdXRFRC0+bVJJRCk7DQorCQl9DQorDQorCQlpZiggcG9wTXNnLnZhbGlkKCkgKQ0KKwkJew0KKwkJCUJGQ29kZSBhVHJhY2VJbnB1dChPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0lOUFVULCBFTlYubUFSRy0+YXQoMCkpOw0KKw0KKwkJCU1lc3NhZ2U6OmNvbnN0X2l0ZXJhdG9yIGl0VmFsID0gcG9wTXNnLmJlZ2luUGFyYW1ldGVycygpOw0KKwkJCU1lc3NhZ2U6OmNvbnN0X2l0ZXJhdG9yIGVuZFZhbCA9IHBvcE1zZy5lbmRQYXJhbWV0ZXJzKCk7DQorDQorCQkJLy8gV2UgaGF2ZSB0byBpZ25vcmUgdGhlIDw8IFBvcnQgPj4gSW5zdGFuY2VPZlBvcnQNCisJCQlmb3IoIEVOVi5tQVJHLT5iZWdpbigxKSA7IChpdFZhbCAhPSBlbmRWYWwpICYmIEVOVi5tQVJHLT5oYXNOZXh0KCkgOw0KKwkJCQkJRU5WLm1BUkctPm5leHQoKSAsICsraXRWYWwgKQ0KKwkJCXsNCisJCQkJaWYoIEVOVi5zZXRSdmFsdWUoRU5WLm1BUkctPm91dEVELA0KKwkJCQkJCUVOVi5tQVJHLT5jdXJyZW50KCkudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCksICppdFZhbCkgKQ0KKwkJCQl7DQorCQkJCQlhVHJhY2VJbnB1dC0+YXBwZW5kKCAqaXRWYWwgKTsNCisNCisJCQkJfQ0KKwkJCQllbHNlDQorCQkJCXsNCisJCQkJCXJldHVybiggZmFsc2UgKTsNCisJCQkJfQ0KKwkJCX0NCisNCisJCQlFeGVjdXRpb25EYXRhRmFjdG9yeTo6YXBwZW5kSU9FbGVtZW50VHJhY2UoRU5WLm1BUkctPm91dEVELA0KKwkJCQkJQkYoIG5ldyBFeGVjdXRpb25Db25maWd1cmF0aW9uKA0KKwkJCQkJCQlFTlYubUFSRy0+b3V0RUQtPm1SSUQsIGFUcmFjZUlucHV0LCBwb3BNc2cpICkgKTsNCisNCisJCQlFTlYub3V0RURTLmFwcGVuZCggRU5WLm1BUkctPm91dEVEICk7DQorDQorQVZNX0lGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9DT01NVU5JQ0FUSU9OICkNCisJRU5WLm1BUkctPm91dEVELT5nZXRSdW50aW1lKDEpLnRvU3RyZWFtRGF0YSgNCisJCQlFTlYubUFSRy0+b3V0RUQsIEFWTV9PU19UUkFDRSA8PCBJTkNSMl9JTkRFTlRfVEFCKTsNCisNCisJQVZNX09TX1RSQUNFIDw8IERFQ1IyX0lOREVOVF9UQUINCisJCQk8PCAiZW5kIEF2bVByaW1pdGl2ZV9JbnB1dEJ1ZmZlcjo6cnVuIg0KKwkJCTw8IHN0ZDo6ZW5kbDsNCitBVk1fRU5ESUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX0NPTU1VTklDQVRJT04gKQ0KKw0KKwkJCXJldHVybiggdHJ1ZSApOw0KKwkJfQ0KKwl9DQorDQorCXJldHVybiggZmFsc2UgKTsNCit9DQorDQorDQorYm9vbCBBdm1QcmltaXRpdmVfSW5wdXRSZHY6OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikNCit7DQorCWNvbnN0IEJGICYgYVBvcnQgPSBFTlYubUFSRy0+YXQoMCk7DQorDQorCWNvbnN0IFJvdXRpbmdEYXRhICYgYVJvdXRpbmdEYXRhID0NCisJCQlhUG9ydC50b19wdHI8IEluc3RhbmNlT2ZQb3J0ID4oKS0+Z2V0SW5wdXRSb3V0aW5nRGF0YSgpOw0KKw0KKwljb25zdCBSdW50aW1lSUQgJiBhUm91dGluZ1JJRCA9IGFSb3V0aW5nRGF0YS5nZXRSdW50aW1lUklEKCk7DQorDQorCU1lc3NhZ2UgaW5Nc2coIGFSb3V0aW5nRGF0YS5nZXRNSUQoKSwNCisJCQlSdW50aW1lSUQ6OlJFRl9OVUxMLCBFTlYubUFSRy0+b3V0RUQtPm1SSUQsIGFQb3J0ICk7DQorDQorCS8vIFdlIGhhdmUgdG8gaWdub3JlIHRoZSA8PCBQb3J0ID4+IEluc3RhbmNlT2ZQb3J0DQorCWZvciggRU5WLm1BUkctPmJlZ2luKDEpIDsgRU5WLm1BUkctPmhhc05leHQoKSA7IEVOVi5tQVJHLT5uZXh0KCkgKQ0KKwl7DQorCQlpbk1zZy5hcHBlbmRQYXJhbWV0ZXIoIEVOVi5tQVJHLT5jdXJyZW50KCkgKTsNCisJfQ0KKw0KKwlFTlYubUFSRy0+b3V0RUQucHVzaEV4ZWNTeW5jUG9pbnQoIG5ldyBFeGVjdXRpb25TeW5jaHJvbml6YXRpb25Qb2ludCgNCisJCQlBV0FJVElOR19QT0lOVF9JTlBVVF9OQVRVUkUsIGFSb3V0aW5nUklELCBhUm91dGluZ0RhdGEsIGluTXNnKSApOw0KKw0KKwlFTlYuYXBwZW5kU3luY19td3NldEFFRVMoRU5WLm1BUkctPm91dEVELCBBRUVTX1dBSVRJTkdfSU5DT01fUkRWKTsNCisNCisJcmV0dXJuKCB0cnVlICk7DQorfQ0KKw0KKw0KKw0KKy8qKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBleGVjdXRpb24gb2YgYW4gSU5QVVRfRlJPTSBwcm9ncmFtDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqLw0KK2Jvb2wgQXZtUHJpbWl0aXZlX0lucHV0RnJvbTo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQ0KK3sNCitBVk1fSUZfREVCVUdfRkxBR19BTkRfTk9UX0ZMQUcoIENPTU1VTklDQVRJT04gLCBTVEFURU1FTlQgKQ0KKwlBVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICJJbnB1dCBNZXNzYWdlIHRvIHJlY2VpdmU6ICINCisJCQk8PCBFTlYuaW5DT0RFLT5zdHIoKSA8PCBzdGQ6OmVuZGw7DQorQVZNX0VORElGX0RFQlVHX0ZMQUdfQU5EX05PVF9GTEFHKCBDT01NVU5JQ0FUSU9OICwgU1RBVEVNRU5UICkNCisNCisJaWYoIChSdW50aW1lTGliOjpSSURfRU5WSVJPTk1FTlQgPT0gRU5WLm1BUkctPmF0KDEpKQ0KKwkJfHwgKFJ1bnRpbWVMaWI6OlJJRF9OSUwgPT0gRU5WLm1BUkctPmF0KDEpKSApDQorCXsNCisJCUF2bUNvbW11bmljYXRpb25GYWN0b3J5Ojpwb3BNZXNzYWdlX2Vudmlyb25tZW50KEVOViwNCisJCQkJRU5WLm1BUkctPmF0KDEpLmJmUklEKCksIFJvdXRpbmdEYXRhOjpfTlVMTF8sIDIpOw0KKwl9DQorCWVsc2UgaWYoIG5vdCBBdm1Db21tdW5pY2F0aW9uRmFjdG9yeTo6cG9wTWVzc2FnZUZyb20oRU5WKSApDQorCXsNCitBVk1fSUZfREVCVUdfRkxBRyggU1RBVEVNRU5UKQ0KKwlBVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICJUSFJPVyBVTlNBVElTRklFRCA8PCBJTlBVVCNGUk9NID4+IDo+ID8hPyB8PT4gIg0KKwkJCTw8IEVOVi5pbkNPREUtPnN0cigpIDw8IHN0ZDo6ZW5kbDsNCitBVk1fRU5ESUZfREVCVUdfRkxBRyggU1RBVEVNRU5UKQ0KKwl9DQorDQorCXJldHVybiggdHJ1ZSApOw0KK30NCisNCisNCisvKioNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogZXhlY3V0aW9uIG9mIGFuIE9VVFBVVCBwcm9ncmFtDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqLw0KKw0KK2Jvb2wgQXZtUHJpbWl0aXZlX091dHB1dDo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQ0KK3sNCitBVk1fSUZfREVCVUdfRkxBR19BTkRfTk9UX0ZMQUcoIENPTU1VTklDQVRJT04gLCBTVEFURU1FTlQgKQ0KKwlBVk1fT1NfVFJBQ0UgPDwgSU5DUl9JTkRFTlRfVEFCDQorCQkJPDwgIjwhPyEiIDw8IEVOVi5pbkVELT5tUklELnN0clVuaXFJZCgpDQorCQkJPDwgIiB8PT4gIiA8PCBFTlYuaW5DT0RFLT5zdHIoKSA8PCBzdGQ6OmVuZGw7DQorQVZNX0VORElGX0RFQlVHX0ZMQUdfQU5EX05PVF9GTEFHKCBDT01NVU5JQ0FUSU9OICwgU1RBVEVNRU5UICkNCisNCisJTWVzc2FnZSBhbk91dHB1dE1zZyhFTlYubUFSRy0+b3V0RUQtPm1SSUQsIEVOVi5tQVJHLT5hdCgwKSApOw0KKw0KK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTVEFURU1FTlRfQ09NTVVOSUNBVElPTiApDQorCUFWTV9PU19UUkFDRSA8PCBUQUIgPDwgIk91dHB1dCBNZXNzYWdlIHRvIGJ1aWxkIiA8PCBzdGQ6OmVuZGw7DQorCWFuT3V0cHV0TXNnLnRvU3RyZWFtKEFWTV9PU19UUkFDRSk7DQorQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNUQVRFTUVOVF9DT01NVU5JQ0FUSU9OICkNCisNCisNCisJZm9yKCBFTlYubUFSRy0+YmVnaW4oMSkgOyBFTlYubUFSRy0+aGFzTmV4dCgpIDsgRU5WLm1BUkctPm5leHQoKSApDQorCXsNCisJCWFuT3V0cHV0TXNnLmFwcGVuZFBhcmFtZXRlciggRU5WLm1BUkctPmN1cnJlbnQoKSApOw0KKwl9DQorDQorDQorQVZNX0lGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9DT01NVU5JQ0FUSU9OICkNCisJQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiT3V0cHV0IE1lc3NhZ2UgdG8gcHVzaCIgPDwgc3RkOjplbmRsOw0KKwlhbk91dHB1dE1zZy50b1N0cmVhbShBVk1fT1NfVFJBQ0UpOw0KK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfQ09NTVVOSUNBVElPTiApDQorDQorDQorCWlmKCBub3QgQXZtQ29tbXVuaWNhdGlvbkZhY3Rvcnk6OnB1c2hNZXNzYWdlKEVOViwNCisJCQlhbk91dHB1dE1zZywgRU5WLm1BUkctPm91dEVELT5tUklEKSApDQorCXsNCitBVk1fSUZfREVCVUdfRkxBRyggU1RBVEVNRU5UKQ0KKwlBVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICJUSFJPVyBVTlNBVElTRklFRCA8PCBPVVRQVVQgPj4gOiA8PDwgIg0KKwkJCTw8IEVOVi5tQVJHLT5vdXRFRC0+bVJJRC5zdHJVbmlxSWQoKQ0KKwkJCTw8ICIgfD0+ICIgPDwgRU5WLmluQ09ERS0+c3RyKCkgPDwgc3RkOjplbmRsOw0KK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTVEFURU1FTlQpDQorCX0NCisNCisNCitBVk1fSUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX0NPTU1VTklDQVRJT04gKQ0KKwlBVk1fT1NfVFJBQ0UgPDwgVEFCX0RFQ1JfSU5ERU5UDQorCQkJPDwgIiE/IT4gIiA8PCBFTlYuaW5FRC0+bVJJRC5zdHJVbmlxSWQoKQ0KKwkJCTw8ICIgfD0+ICIgPDwgIEVOVi5pbkNPREUtPnN0cigpIDw8IHN0ZDo6ZW5kbDsNCitBVk1fRU5ESUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX0NPTU1VTklDQVRJT04gKQ0KKw0KKwlyZXR1cm4oIHRydWUgKTsNCit9DQorDQorDQorYm9vbCBBdm1QcmltaXRpdmVfT3V0cHV0VmFyOjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpDQorew0KKwlFeGVjdXRpb25EYXRhRmFjdG9yeTo6YXBwZW5kSU9FbGVtZW50VHJhY2UoRU5WLm1BUkctPm91dEVELA0KKwkJCUJGKCBuZXcgRXhlY3V0aW9uQ29uZmlndXJhdGlvbihFTlYubUFSRy0+b3V0RUQtPm1SSUQsDQorCQkJCQlCRkNvZGUoT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9PVVRQVVQsDQorCQkJCQkJCUVOVi5tQVJHLT5hdCgwKSwgRU5WLm1BUkctPmF0KDEpKSkgKSApOw0KKw0KKwlFTlYuYXBwZW5kT3V0cHV0KCBFTlYubUFSRy0+b3V0RUQgKTsNCisNCisJcmV0dXJuKCB0cnVlICk7DQorfQ0KKw0KKw0KK2Jvb2wgQXZtUHJpbWl0aXZlX091dHB1dEVudjo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQ0KK3sNCisJQkZDb2RlIGFUcmFjZU91dHB1dChPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX09VVFBVVF9FTlYsIEVOVi5tQVJHLT5hdCgwKSk7DQorDQorCWZvciggRU5WLm1BUkctPmJlZ2luKDEpIDsgRU5WLm1BUkctPmhhc05leHQoKSA7IEVOVi5tQVJHLT5uZXh0KCkgKQ0KKwl7DQorCQlhVHJhY2VPdXRwdXQtPmFwcGVuZCggRU5WLm1BUkctPmN1cnJlbnQoKSApOw0KKwl9DQorDQorCUV4ZWN1dGlvbkRhdGFGYWN0b3J5OjphcHBlbmRJT0VsZW1lbnRUcmFjZShFTlYubUFSRy0+b3V0RUQsDQorCQkJQkYoIG5ldyBFeGVjdXRpb25Db25maWd1cmF0aW9uKA0KKwkJCQkJRU5WLm1BUkctPm91dEVELT5tUklELCBhVHJhY2VPdXRwdXQpICkgKTsNCisNCisJRU5WLm91dEVEUy5hcHBlbmQoIEVOVi5tQVJHLT5vdXRFRCApOw0KKw0KKwlyZXR1cm4oIHRydWUgKTsNCit9DQorDQorDQorYm9vbCBBdm1QcmltaXRpdmVfT3V0cHV0QnVmZmVyOjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpDQorew0KK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgU1RBVEVNRU5UX0NPTU1VTklDQVRJT04gKQ0KKwlBVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICJiZWdpbiBBdm1QcmltaXRpdmVfT3V0cHV0QnVmZmVyOjpydW4iIDw8IHN0ZDo6ZW5kbDsNCisNCisJRU5WLm1BUkctPm91dEVELT5nZXRSdW50aW1lKDEpLnRvU3RyZWFtKA0KKwkJCUFWTV9PU19UUkFDRSA8PCBJTkNSMl9JTkRFTlRfVEFCKTsNCisJQVZNX09TX1RSQUNFIDw8IERFQ1IyX0lOREVOVDsNCitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFNUQVRFTUVOVF9DT01NVU5JQ0FUSU9OICkNCisNCisJY29uc3QgQkYgJiBhUG9ydCA9IEVOVi5tQVJHLT5hdCgwKTsNCisNCisJY29uc3QgUm91dGluZ0RhdGEgJiBhUm91dGluZ0RhdGEgPQ0KKwkJCWFQb3J0LnRvX3B0cjwgSW5zdGFuY2VPZlBvcnQgPigpLT5nZXRPdXRwdXRSb3V0aW5nRGF0YSgpOw0KKw0KKwljb25zdCBSdW50aW1lSUQgJiBhUm91dGluZ1JJRCA9IGFSb3V0aW5nRGF0YS5nZXRSdW50aW1lUklEKCk7DQorDQorCVJ1bnRpbWVJRCBidWZmZXJEZWNsUklEID0gYVJvdXRpbmdSSUQ7DQorDQorCUluc3RhbmNlT2ZCdWZmZXIgKiBhQnVmZmVyID0gYVJvdXRpbmdEYXRhLmdldEJ1ZmZlckluc3RhbmNlKCkuZmlyc3QoKTsNCisNCisJYnVmZmVyRGVjbFJJRCA9IEVOVi5tQVJHLT5vdXRFRC0+Z2V0UnVudGltZUNvbnRhaW5lclJJRCgNCisJCQlFTlYubUFSRy0+b3V0RUQtPm1SSUQsIGFCdWZmZXIpOw0KKw0KKwlpZiggYnVmZmVyRGVjbFJJRC52YWxpZCgpICkNCisJew0KKwkJQmFzZUJ1ZmZlckZvcm0gJiBiYmYgPQ0KKwkJCQlFTlYubUFSRy0+b3V0RUQuZ2V0V3JpdGFibGVSdW50aW1lKA0KKwkJCQkJCWJ1ZmZlckRlY2xSSUQgKS5nZXRXcml0YWJsZUJ1ZmZlciggYUJ1ZmZlciApOw0KKw0KKwkJTWVzc2FnZSBvdXRNc2coIGFSb3V0aW5nRGF0YS5nZXRNSUQoKSwNCisJCQkJRU5WLm1BUkctPm91dEVELT5tUklELCBFTlYubUFSRy0+b3V0RUQtPm1SSUQsIGFQb3J0ICk7DQorDQorCQkvLyBXZSBoYXZlIHRvIGlnbm9yZSB0aGUgPDwgUG9ydCA+PiBJbnN0YW5jZU9mUG9ydA0KKwkJZm9yKCBFTlYubUFSRy0+YmVnaW4oMSkgOyBFTlYubUFSRy0+aGFzTmV4dCgpIDsgRU5WLm1BUkctPm5leHQoKSApDQorCQl7DQorCQkJb3V0TXNnLmFwcGVuZFBhcmFtZXRlciggRU5WLm1BUkctPmN1cnJlbnQoKSApOw0KKwkJfQ0KKw0KKwkJaWYoIGJiZi5wdXNoKCBvdXRNc2cgKSApDQorCQl7DQorCQkJQkZDb2RlIGFUcmFjZU91dHB1dChPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX09VVFBVVCwgYVBvcnQpOw0KKw0KKwkJCWFUcmFjZU91dHB1dC0+YXBwZW5kKCBvdXRNc2cuZ2V0UGFyYW1ldGVycygpICk7DQorDQorCQkJRXhlY3V0aW9uRGF0YUZhY3Rvcnk6OmFwcGVuZElPRWxlbWVudFRyYWNlKEVOVi5tQVJHLT5vdXRFRCwNCisJCQkJCUJGKCBuZXcgRXhlY3V0aW9uQ29uZmlndXJhdGlvbigNCisJCQkJCQkJRU5WLm1BUkctPm91dEVELT5tUklELCBhVHJhY2VPdXRwdXQsIG91dE1zZykgKSApOw0KKw0KKwkJCUVOVi5vdXRFRFMuYXBwZW5kKCBFTlYubUFSRy0+b3V0RUQgKTsNCisNCisNCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFNUQVRFTUVOVF9DT01NVU5JQ0FUSU9OICkNCisJRU5WLm1BUkctPm91dEVELT5nZXRSdW50aW1lKDEpLnRvU3RyZWFtKA0KKwkJCUFWTV9PU19UUkFDRSA8PCBJTkNSMl9JTkRFTlRfVEFCKTsNCisNCisJQVZNX09TX1RSQUNFIDw8IERFQ1IyX0lOREVOVF9UQUINCisJCQk8PCAiZW5kIEF2bVByaW1pdGl2ZV9PdXRwdXRCdWZmZXI6OnJ1biINCisJCQk8PCBzdGQ6OmVuZGw7DQorQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBTVEFURU1FTlRfQ09NTVVOSUNBVElPTiApDQorDQorCQkJcmV0dXJuKCB0cnVlICk7DQorCQl9DQorCX0NCisNCisJcmV0dXJuKCBmYWxzZSApOw0KK30NCisNCisNCitib29sIEF2bVByaW1pdGl2ZV9PdXRwdXRSZHY6OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikNCit7DQorCWNvbnN0IEJGICYgYVBvcnQgPSBFTlYubUFSRy0+YXQoMCk7DQorDQorCWNvbnN0IFJvdXRpbmdEYXRhICYgYVJvdXRpbmdEYXRhID0NCisJCQlhUG9ydC50b19wdHI8IEluc3RhbmNlT2ZQb3J0ID4oKS0+Z2V0T3V0cHV0Um91dGluZ0RhdGEoKTsNCisNCisJY29uc3QgUnVudGltZUlEICYgYVJvdXRpbmdSSUQgPSBhUm91dGluZ0RhdGEuZ2V0UnVudGltZVJJRCgpOw0KKw0KKwlNZXNzYWdlIG91dE1zZyggYVJvdXRpbmdEYXRhLmdldE1JRCgpLA0KKwkJCUVOVi5tQVJHLT5vdXRFRC0+bVJJRCwgRU5WLm1BUkctPm91dEVELT5tUklELCBhUG9ydCApOw0KKw0KKwkvLyBXZSBoYXZlIHRvIGlnbm9yZSB0aGUgPDwgUG9ydCA+PiBJbnN0YW5jZU9mUG9ydA0KKwlmb3IoIEVOVi5tQVJHLT5iZWdpbigxKSA7IEVOVi5tQVJHLT5oYXNOZXh0KCkgOyBFTlYubUFSRy0+bmV4dCgpICkNCisJew0KKwkJb3V0TXNnLmFwcGVuZFBhcmFtZXRlciggRU5WLm1BUkctPmN1cnJlbnQoKSApOw0KKwl9DQorDQorCUVOVi5tQVJHLT5vdXRFRC5wdXNoRXhlY1N5bmNQb2ludChuZXcgRXhlY3V0aW9uU3luY2hyb25pemF0aW9uUG9pbnQoDQorCQkJQVdBSVRJTkdfUE9JTlRfT1VUUFVUX05BVFVSRSwgYVJvdXRpbmdSSUQsIGFSb3V0aW5nRGF0YSwgb3V0TXNnKSApOw0KKw0KKwlFTlYuYXBwZW5kU3luY19td3NldEFFRVMoRU5WLm1BUkctPm91dEVELCBBRUVTX1dBSVRJTkdfT1VUQ09NX1JEVik7DQorDQorCXJldHVybiggdHJ1ZSApOw0KK30NCisNCisNCisvKioNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogZXhlY3V0aW9uIG9mIGFuIE9VVFBVVF9UTyBwcm9ncmFtDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqLw0KK2Jvb2wgQXZtUHJpbWl0aXZlX091dHB1dFRvOjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpDQorew0KK0FWTV9JRl9ERUJVR19GTEFHX0FORF9OT1RfRkxBRyggQ09NTVVOSUNBVElPTiAsIFNUQVRFTUVOVCApDQorCUFWTV9PU19UUkFDRSA8PCBJTkNSX0lOREVOVF9UQUINCisJCQk8PCAiPCE/ISIgPDwgRU5WLmluRUQtPm1SSUQuc3RyVW5pcUlkKCkNCisJCQk8PCAiIHw9PiAiIDw8IEVOVi5pbkNPREUtPnN0cigpIDw8IHN0ZDo6ZW5kbDsNCitBVk1fRU5ESUZfREVCVUdfRkxBR19BTkRfTk9UX0ZMQUcoIENPTU1VTklDQVRJT04gLCBTVEFURU1FTlQgKQ0KKw0KKwlNZXNzYWdlIGFuT3V0cHV0TXNnKCBFTlYubUFSRy0+b3V0RUQtPm1SSUQsDQorCQkJRU5WLm1BUkctPmF0KDEpLmJmUklEKCksIEVOVi5tQVJHLT5hdCgwKSApOw0KKw0KK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTVEFURU1FTlRfQ09NTVVOSUNBVElPTiApDQorCUFWTV9PU19UUkFDRSA8PCBUQUIgPDwgIk91dHB1dCBNZXNzYWdlIHRvIGJ1aWxkIiA8PCBzdGQ6OmVuZGw7DQorCWFuT3V0cHV0TXNnLnRvU3RyZWFtKEFWTV9PU19UUkFDRSk7DQorQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNUQVRFTUVOVF9DT01NVU5JQ0FUSU9OICkNCisNCisNCisJZm9yKCBFTlYubUFSRy0+YmVnaW4oMikgOyBFTlYubUFSRy0+aGFzTmV4dCgpIDsgRU5WLm1BUkctPm5leHQoKSApDQorCXsNCisJCWFuT3V0cHV0TXNnLmFwcGVuZFBhcmFtZXRlciggRU5WLm1BUkctPmN1cnJlbnQoKSApOw0KKwl9DQorDQorDQorQVZNX0lGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9DT01NVU5JQ0FUSU9OICkNCisJQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiT3V0cHV0IE1lc3NhZ2UgdG8gcHVzaCIgPDwgc3RkOjplbmRsOw0KKwlhbk91dHB1dE1zZy50b1N0cmVhbShBVk1fT1NfVFJBQ0UpOw0KK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfQ09NTVVOSUNBVElPTiApDQorDQorDQorCWlmKCBFTlYubUFSRy0+YXQoMCkudG9fcHRyPCBJbnN0YW5jZU9mUG9ydCA+KCktPmlzUG9ydCgpICkNCisJew0KKwkJaWYoIG5vdCBBdm1Db21tdW5pY2F0aW9uRmFjdG9yeTo6cHVzaE1lc3NhZ2VUbyhFTlYsIGFuT3V0cHV0TXNnKSApDQorCQl7DQorQVZNX0lGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVCkNCisJQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiVEhST1cgVU5TQVRJU0ZJRUQgPDwgT1VUUFVUID4+IDogPDw8ICINCisJCQk8PCBFTlYubUFSRy0+b3V0RUQtPm1SSUQuc3RyVW5pcUlkKCkNCisJCQk8PCAiIHw9PiAiIDw8IEVOVi5pbkNPREUtPnN0cigpIDw8IHN0ZDo6ZW5kbDsNCitBVk1fRU5ESUZfREVCVUdfRkxBRyggU1RBVEVNRU5UKQ0KKwkJfQ0KKwl9DQorCWVsc2UvLyBpZiggRU5WLm1BUkctPmF0KDApLnRvX3B0cjwgSW5zdGFuY2VPZlBvcnQgPigpLT5pc1NpZ25hbCgpICkNCisJew0KKwkJaWYoIEVOVi5tQVJHLT5hdCgxKS5iZlJJRCgpLnZhbGlkKCkgKQ0KKwkJew0KKwkJCWlmKCAoUnVudGltZUxpYjo6UklEX0VOVklST05NRU5UID09IEVOVi5tQVJHLT5hdCgxKSkNCisJCQkJfHwgKFJ1bnRpbWVMaWI6OlJJRF9OSUwgPT0gRU5WLm1BUkctPmF0KDEpKSApDQorCQkJew0KKwkJCQlBdm1Db21tdW5pY2F0aW9uRmFjdG9yeTo6cHVzaE1lc3NhZ2VfZW52aXJvbm1lbnQoRU5WLA0KKwkJCQkJRU5WLm1BUkctPmF0KDEpLmJmUklEKCksIFJvdXRpbmdEYXRhOjpfTlVMTF8sIGFuT3V0cHV0TXNnKTsNCisJCQl9DQorCQkJZWxzZSBpZiggbm90IEF2bUNvbW11bmljYXRpb25GYWN0b3J5OjpwdXNoTWVzc2FnZShFTlYsDQorCQkJCQlhbk91dHB1dE1zZywgRU5WLm1BUkctPmF0KDEpLmJmUklEKCkpICkNCisJCQl7DQorQVZNX0lGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVCkNCisJQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiVEhST1cgVU5TQVRJU0ZJRUQgPDwgT1VUUFVUI1RPPCINCisJCQk8PCBFTlYubUFSRy0+YXQoMSkuYmZSSUQoKS5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8ICI+ID4+IDogPDw8ICINCisJCQk8PCBFTlYubUFSRy0+b3V0RUQtPm1SSUQuc3RyVW5pcUlkKCkNCisJCQk8PCAiIHw9PiAiIDw8IEVOVi5pbkNPREUtPnN0cigpIDw8IHN0ZDo6ZW5kbDsNCitBVk1fRU5ESUZfREVCVUdfRkxBRyggU1RBVEVNRU5UKQ0KKwkJCX0NCisJCX0NCisJCWVsc2UNCisJCXsNCitBVk1fSUZfREVCVUdfRkxBRyggU1RBVEVNRU5UKQ0KKwlBVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICJUSFJPVyBVTktOT1dOIFJFQ0VJVkVSIDw8IE9VVFBVVCNUTzwiDQorCQkJPDwgRU5WLm1BUkctPmF0KDEpLmJmUklEKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiPz4gPj4gOiA8PDwgIg0KKwkJCTw8IEVOVi5tQVJHLT5vdXRFRC0+bVJJRC5zdHJVbmlxSWQoKQ0KKwkJCTw8ICIgfD0+ICIgPDwgRU5WLmluQ09ERS0+c3RyKCkgPDwgc3RkOjplbmRsOw0KK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTVEFURU1FTlQpDQorDQorCQkJcmV0dXJuKCBmYWxzZSApOw0KKwkJfQ0KKwl9DQorDQorQVZNX0lGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9DT01NVU5JQ0FUSU9OICkNCisJQVZNX09TX1RSQUNFIDw8IFRBQl9ERUNSX0lOREVOVA0KKwkJCTw8ICIhPyE+ICIgPDwgRU5WLmluRUQtPm1SSUQuc3RyVW5pcUlkKCkNCisJCQk8PCAiIHw9PiAiIDw8ICBFTlYuaW5DT0RFLT5zdHIoKSA8PCBzdGQ6OmVuZGw7DQorQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9DT01NVU5JQ0FUSU9OICkNCisNCisJcmV0dXJuKCB0cnVlICk7DQorfQ0KKw0KKw0KKy8qKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBleGVjdXRpb24gb2YgYSBQUkVTRU5UIHByb2dyYW0NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICovDQorYm9vbCBBdm1QcmltaXRpdmVfUHJlc2VudDo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQ0KK3sNCisJaWYoIEF2bUNvbW11bmljYXRpb25GYWN0b3J5Ojpjb21wdXRlUHJlc2VuY2UoRU5WLm1BUkctPm91dEVELA0KKwkJCUVOVi5tQVJHLT5hdCgwKS50b19wdHI8IEluc3RhbmNlT2ZQb3J0ID4oKSkgKQ0KKwl7DQorCQlFTlYub3V0RURTLmFwcGVuZCggRU5WLm1BUkctPm91dEVEICk7DQorCX0NCisJZWxzZQ0KKwl7DQorQVZNX0lGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVCkNCisJQVZNX09TX1RSQUNFIDw8ICJUSFJPVyBVTlNBVElTRklFRCA8PCBQUkVTRU5DRSA+PiA6PiA/IT8gPCAiDQorCQkJPDwgRU5WLmluQ09ERS0+c3RyKCkgPDwgIiA+fD0+ICINCisJCQk8PCBFTlYubUFSRy0+YXQoMCkuc3RyKCkgPDwgc3RkOjplbmRsOw0KK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTVEFURU1FTlQpDQorCX0NCisNCisJcmV0dXJuKCB0cnVlICk7DQorfQ0KKw0KKw0KK2Jvb2wgQXZtUHJpbWl0aXZlX1ByZXNlbnQ6OnNldmFsKEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOVikNCit7DQorCUVOVi5vdXRWQUwgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oDQorCQkJQXZtQ29tbXVuaWNhdGlvbkZhY3Rvcnk6OmNvbXB1dGVQcmVzZW5jZShFTlYubUFSRy0+b3V0RUQsDQorCQkJCQlFTlYubUFSRy0+YXQoMCkudG9fcHRyPCBJbnN0YW5jZU9mUG9ydCA+KCkpICk7DQorDQorCXJldHVybiggdHJ1ZSApOw0KK30NCisNCisNCisNCisvKioNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogZXhlY3V0aW9uIG9mIGFuIEFCU0VOVCBwcm9ncmFtDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqLw0KK2Jvb2wgQXZtUHJpbWl0aXZlX0Fic2VudDo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQ0KK3sNCisJaWYoIEF2bUNvbW11bmljYXRpb25GYWN0b3J5Ojpjb21wdXRlQWJzZW5jZShFTlYubUFSRy0+b3V0RUQsDQorCQkJRU5WLm1BUkctPmF0KDApLnRvX3B0cjwgSW5zdGFuY2VPZlBvcnQgPigpKSApDQorCXsNCisJCUVOVi5vdXRFRFMuYXBwZW5kKCBFTlYubUFSRy0+b3V0RUQgKTsNCisJfQ0KKwllbHNlDQorCXsNCitBVk1fSUZfREVCVUdfRkxBRyggU1RBVEVNRU5UKQ0KKwlBVk1fT1NfVFJBQ0UgPDwgIlRIUk9XIFVOU0FUSVNGSUVEIDw8IEFCU0VOQ0UgPj4gOj4gPyE/IDwgIg0KKwkJCTw8IEVOVi5pbkNPREUtPnN0cigpIDw8ICIgPnw9PiAiDQorCQkJPDwgRU5WLm1BUkctPmF0KDApLnN0cigpIDw8IHN0ZDo6ZW5kbDsNCitBVk1fRU5ESUZfREVCVUdfRkxBRyggU1RBVEVNRU5UKQ0KKwl9DQorDQorCXJldHVybiggdHJ1ZSApOw0KK30NCisNCisNCitib29sIEF2bVByaW1pdGl2ZV9BYnNlbnQ6OnNldmFsKEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOVikNCit7DQorCUVOVi5vdXRWQUwgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oDQorCQkJQXZtQ29tbXVuaWNhdGlvbkZhY3Rvcnk6OmNvbXB1dGVBYnNlbmNlKEVOVi5tQVJHLT5vdXRFRCwNCisJCQkJCUVOVi5tQVJHLT5hdCgwKS50b19wdHI8IEluc3RhbmNlT2ZQb3J0ID4oKSkgKTsNCisNCisJcmV0dXJuKCB0cnVlICk7DQorfQ0KKw0KKw0KKw0KKy8qKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBleGVjdXRpb24gb2YgYSBVUERBVEUgQlVGRkVSIHByb2dyYW0NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICovDQorYm9vbCBBdm1QcmltaXRpdmVfVXBkYXRlQnVmZmVyOjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpDQorew0KKwlpZiggRU5WLmluQ09ERS0+c2l6ZSgpID09IDEgKQ0KKwl7DQorCQlzd2l0Y2goIEVOVi5pbkNPREUtPmZpcnN0KCkuY2xhc3NLaW5kKCkgKQ0KKwkJew0KKwkJCWNhc2UgRk9STV9BVk1DT0RFX0tJTkQ6DQorCQkJew0KKwkJCQlFeGVjdXRpb25FbnZpcm9ubWVudCB0bXBFTlYoRU5WLCBFTlYuaW5DT0RFLT5maXJzdCgpKTsNCisJCQkJaWYoIHRtcEVOVi5ydW4oKSApDQorCQkJCXsNCisJCQkJCUFQRXhlY3V0aW9uRGF0YSB0bXBFRDsNCisJCQkJCXdoaWxlKCB0bXBFTlYub3V0RURTLm5vbmVtcHR5KCkgKQ0KKwkJCQkJew0KKwkJCQkJCXRtcEVOVi5vdXRFRFMucG9wX2ZpcnN0X3RvKCB0bXBFRCApOw0KKw0KKwkJCQkJCWlmKCBBdm1Db21tdW5pY2F0aW9uRmFjdG9yeTo6dXBkYXRlQnVmZmVyKHRtcEVEKSApDQorCQkJCQkJew0KKwkJCQkJCQlFTlYub3V0RURTLmFwcGVuZCggdG1wRUQgKTsNCisJCQkJCQl9DQorCQkJCQl9DQorDQorCQkJCQlFTlYuc3BsaWNlT3V0cHV0KHRtcEVOVik7DQorDQorCQkJCQlyZXR1cm4oIHRydWUgKTsNCisJCQkJfQ0KKw0KKwkJCQlicmVhazsNCisJCQl9DQorDQorCQkJZGVmYXVsdDoNCisJCQl7DQorCQkJCUFWTV9PU19XQVJOSU5HX0FMRVJUDQorCQkJCQkJPDwgIlVuZXhwZWN0ZWQgYXJndW1lbnQgS0lORCBmb3IgYW4gU1lOQ0hST05JWkUgcHJvZ3JhbVxuIg0KKwkJCQkJCTw8IEVOVi5pbkNPREUtPnRvU3RyaW5nKCBBVk1fVEFCMV9JTkRFTlQgKQ0KKwkJCQkJCTw8IFNFTkRfQUxFUlQ7DQorDQorCQkJCXJldHVybiggZmFsc2UgKTsNCisJCQl9DQorCQl9DQorCX0NCisJZWxzZQ0KKwl7DQorCQlBUEV4ZWN1dGlvbkRhdGEgYW5PdXRwdXRFRCA9IEVOVi5pbkVEOw0KKwkJaWYoIEF2bUNvbW11bmljYXRpb25GYWN0b3J5Ojp1cGRhdGVCdWZmZXIoYW5PdXRwdXRFRCkgKQ0KKwkJew0KKwkJCUVOVi5vdXRFRFMuYXBwZW5kKCBhbk91dHB1dEVEICk7DQorDQorCQkJcmV0dXJuKCB0cnVlICk7DQorCQl9DQorCX0NCisNCisJcmV0dXJuKCBmYWxzZSApOw0KK30NCisNCisNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8vLy8gTUFUSCBNSU4NCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorYm9vbCBBdm1QcmltaXRpdmVfT0JTOjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpDQorew0KKwlpZiggRU5WLm1BUkctPmF0KDIpLmlzRXF1YWxUcnVlKCkgICkNCisJew0KKwkJLy8hISBOTyBORUVEIFBBVEggQ09ORElUSU9OIFVQREFURQ0KKwkJRU5WLmFwcGVuZE91dHB1dCggRU5WLm1BUkctPm91dEVEICk7DQorCX0NCisNCisJZWxzZSBpZiggRU5WLm1BUkctPmF0KDIpLmlzRXF1YWxGYWxzZSgpICApDQorCXsNCitBVk1fSUZfREVCVUdfRkxBRyggU1RBVEVNRU5UKQ0KKwlBVk1fT1NfVFJBQ0UgPDwgIlRIUk9XIFVOU0FUSVNGSUVEIDw8IE9CUyA+PiA6ICINCisJCQk8PCBFTlYubUFSRy0+b3V0RUQtPm1SSUQuc3RyVW5pcUlkKCkgPDwgIiB8PT4gIg0KKwkJCTw8IEVOVi5pbkNPREUtPnN0cigpIDw8IHN0ZDo6ZW5kbDsNCisvLwlBVk1fT1NfVFJBQ0UgPDwgIlRIUk9XIFVOU0FUSVNGSUVEIDw8IEdVQVJEID4+IDogIg0KKy8vCQkJPDwgRU5WLm1BUkctPm91dEVELT5tUklELnN0clVuaXFJZCgpIDw8ICIgLCAiOw0KKy8vCUFWTV9PU19UUkFDRSA8PCBFTlYuaW5DT0RFLT5zdHIoKSAgPDwgIiB8PT4gIg0KKy8vCQkJPDwgRU5WLm1BUkctPmF0KDIpLnN0cigpIDw8IHN0ZDo6ZW5kbDsNCitBVk1fRU5ESUZfREVCVUdfRkxBRyggU1RBVEVNRU5UKQ0KKwl9DQorDQorCWVsc2UNCisJew0KKwkJQVZNX09TX1RSQUNFIDw8ICJPQlMgOj4gIiA8PCBFTlYubUFSRy0+YXQoMikuc3RyKCkgPDwgc3RkOjplbmRsOw0KKw0KKwkJaWYoIG5vdCBQYXRoQ29uZGl0aW9uUHJvY2Vzc29yOjphcHBlbmRQYXRoQ29uZGl0aW9uKA0KKwkJCQlFTlYsIEVOVi5tQVJHLT5vdXRFRCwgRU5WLm1BUkctPmF0KDIpKSApDQorCQl7DQorQVZNX0lGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVCkNCisJQVZNX09TX1RSQUNFIDw8ICJUSFJPVyBVTlNBVElTRklFRCA8PCBPQlMgPj4gOiAiDQorCQkJPDwgRU5WLm1BUkctPm91dEVELT5tUklELnN0clVuaXFJZCgpIDw8ICIgfD0+ICINCisJCQk8PCBFTlYuaW5DT0RFLT5zdHIoKSA8PCBzdGQ6OmVuZGw7DQorLy8JQVZNX09TX1RSQUNFIDw8ICJUSFJPVyBVTlNBVElTRklFRCA8PCBHVUFSRCA+PiA6ICINCisvLwkJCTw8IEVOVi5tQVJHLT5vdXRFRC0+bVJJRC5zdHJVbmlxSWQoKSA8PCAiICwgIjsNCisvLwlBVk1fT1NfVFJBQ0UgPDwgRU5WLmluQ09ERS0+c3RyKCkgIDw8ICIgfD0+ICINCisvLwkJCTw8IEVOVi5tQVJHLT5hdCgyKS5zdHIoKSA8PCBzdGQ6OmVuZGw7DQorQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVCkNCisJCX0NCisJfQ0KKw0KKwlyZXR1cm4oIHRydWUgKTsNCit9DQorDQorYm9vbCBBdm1QcmltaXRpdmVfT0JTOjpzZXZhbChFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBFTlYpDQorew0KKwlpZiggRU5WLm1BUkctPmF0KDApLmlzPCBBdm1Db2RlID4oKSApDQorCXsNCisJCWNvbnN0IEJGQ29kZSAmIGV2dENvbmRpdGlvbiA9IEVOVi5tQVJHLT5hdCgwKS5iZkNvZGUoKTsNCisNCisJCXN3aXRjaCggZXZ0Q29uZGl0aW9uLT5nZXRBdm1PcENvZGUoKSApDQorCQl7DQorCQkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUOg0KKwkJCWNhc2UgQVZNX09QQ09ERV9PVVRQVVQ6DQorCQkJew0KKwkJCQlpZiggZXZ0Q29uZGl0aW9uLT5maXJzdCgpLmlzPCBCYXNlSW5zdGFuY2VGb3JtID4oKSApDQorCQkJCXsNCisJCQkJCUJhc2VJbnN0YW5jZUZvcm0gKiBpb0luc3RhbmNlID0NCisJCQkJCQkJZXZ0Q29uZGl0aW9uLT5maXJzdCgpLnRvX3B0cjwgQmFzZUluc3RhbmNlRm9ybSA+KCk7DQorDQorCQkJCQlpZiggaW9JbnN0YW5jZS0+aXM8IEluc3RhbmNlT2ZQb3J0ID4oKSApDQorCQkJCQl7DQorCQkJCQkJQXZtQ29kZSAqIGlvVHJhY2UgPSBOVUxMOw0KKw0KKwkJCQkJCWlvVHJhY2UgPSBFTlYuc2VhcmNoVHJhY2VJTygNCisJCQkJCQkJCUVOVi5vdXRFRC0+Z2V0SU9FbGVtZW50VHJhY2UoKSwgZXZ0Q29uZGl0aW9uKTsNCisNCisJCQkJCQlpZiggaW9UcmFjZSAhPSBOVUxMICkNCisJCQkJCQl7DQorCQkJCQkJCUVOVi5vdXRWQUwgPSBFTlYuaW9TdWJzdCggRU5WLm91dEVELA0KKwkJCQkJCQkJCUVOVi5vdXRFRC0+bVJJRC5nZXRFeGVjdXRhYmxlKCksDQorCQkJCQkJCQkJZXZ0Q29uZGl0aW9uLCBpb1RyYWNlLCBFTlYubUFSRy0+YXQoMSkgKTsNCisJCQkJCQl9DQorCQkJCQkJZWxzZQ0KKwkJCQkJCXsNCisJCQkJCQkJRU5WLm91dFZBTCA9IEV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9GQUxTRTsNCisJCQkJCQl9DQorDQorCQkJCQkJcmV0dXJuKCB0cnVlICk7DQorCQkJCQl9DQorCQkJCQllbHNlIGlmKCBpb0luc3RhbmNlLT5pczwgSW5zdGFuY2VPZkRhdGEgPigpICkNCisJCQkJCXsNCisJCQkJCQlpZiggRU5WLmlzQXNzaWduZWQoRU5WLm91dEVELCBFTlYub3V0RUQtPm1SSUQsDQorCQkJCQkJCQlpb0luc3RhbmNlLT50bzwgSW5zdGFuY2VPZkRhdGEgPigpKSApDQorCQkJCQkJew0KKwkJCQkJCQlpZiggbm90IEVOVi5zZXZhbChFTlYubUFSRy0+YXQoMSkpICkNCisJCQkJCQkJew0KKwkJCQkJCQkJcmV0dXJuKCBmYWxzZSApOw0KKwkJCQkJCQl9DQorCQkJCQkJfQ0KKwkJCQkJCWVsc2UNCisJCQkJCQl7DQorCQkJCQkJCUVOVi5vdXRWQUwgPSBFeHByZXNzaW9uQ29uc3RhbnQ6OkJPT0xFQU5fRkFMU0U7DQorCQkJCQkJfQ0KKw0KKwkJCQkJCXJldHVybiggdHJ1ZSApOw0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCUVOVi5vdXRWQUwgPSBFeHByZXNzaW9uQ29uc3RhbnQ6OkJPT0xFQU5fRkFMU0U7DQorDQorCQkJCXJldHVybiggdHJ1ZSApOw0KKwkJCX0NCisNCisJCQlkZWZhdWx0Og0KKwkJCXsNCisJCQkJQkYgZXZ0Q29uZCA9IEVOVi5vdXRWQUw7DQorDQorCQkJCWlmKCBFTlYuc2V2YWwoRU5WLm1BUkctPmF0KDEpKSApDQorCQkJCXsNCisJCQkJCUVOVi5vdXRWQUwgPSBFeHByZXNzaW9uU2ltcGxpZmllcjo6QU5EKA0KKwkJCQkJCQlFTlYubUFSRy0+YXQoMCksIGV2dENvbmQpOw0KKw0KKwkJCQkJcmV0dXJuKCB0cnVlICk7DQorCQkJCX0NCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCWVsc2UgaWYoIEVOVi5tQVJHLT5hdCgwKS5pc0VxdWFsVHJ1ZSgpICkNCisJew0KKwkJcmV0dXJuKCBFTlYuc2V2YWwoRU5WLm1BUkctPmF0KDEpKSApOw0KKwl9DQorCWVsc2UgaWYoIEVOVi5tQVJHLT5hdCgwKS5pc05vdEVxdWFsRmFsc2UoKSApDQorCXsNCisJCUJGIGV2dENvbmQgPSBFTlYub3V0VkFMOw0KKwkJaWYoIEVOVi5zZXZhbChFTlYubUFSRy0+YXQoMSkpICkNCisJCXsNCisJCQlFTlYub3V0VkFMID0gRXhwcmVzc2lvblNpbXBsaWZpZXI6OkFORChFTlYubUFSRy0+YXQoMCksIGV2dENvbmQpOw0KKw0KKwkJCXJldHVybiggdHJ1ZSApOw0KKwkJfQ0KKwl9DQorDQorCXJldHVybiggZmFsc2UgKTsNCit9DQorDQorDQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1Db21tdW5pY2F0aW9uUHJpbWl0aXZlLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtQ29tbXVuaWNhdGlvblByaW1pdGl2ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMzllYjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtQ29tbXVuaWNhdGlvblByaW1pdGl2ZS5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyMCBtYWkgMjAxMAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEFWTUNPTU1VTklDQVRJT05QUklNSVRJVkVfSF8KKyNkZWZpbmUgQVZNQ09NTVVOSUNBVElPTlBSSU1JVElWRV9IXworCisjaW5jbHVkZSA8Y29tcHV0ZXIvcHJpbWl0aXZlL0Jhc2VBdm1QcmltaXRpdmUuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworQVZNX1BSSU1JVElWRV9SVU5fQ0xBU1MoSW5wdXQsIEJhc2VBdm1QcmltaXRpdmUpCisKK0FWTV9QUklNSVRJVkVfUlVOX0NMQVNTKElucHV0VmFyLCBCYXNlQXZtUHJpbWl0aXZlKQorCitBVk1fUFJJTUlUSVZFX1JVTl9DTEFTUyhJbnB1dEVudiwgQmFzZUF2bVByaW1pdGl2ZSkKKworQVZNX1BSSU1JVElWRV9SVU5fQ0xBU1MoSW5wdXRCdWZmZXIsIEJhc2VBdm1QcmltaXRpdmUpCisKK0FWTV9QUklNSVRJVkVfUlVOX0NMQVNTKElucHV0UmR2LCBCYXNlQXZtUHJpbWl0aXZlKQorCisKK0FWTV9QUklNSVRJVkVfUlVOX0NMQVNTKElucHV0RnJvbSwgQmFzZUF2bVByaW1pdGl2ZSkKKworCisKK0FWTV9QUklNSVRJVkVfUlVOX0NMQVNTKE91dHB1dCwgQmFzZUF2bVByaW1pdGl2ZSkKKworQVZNX1BSSU1JVElWRV9SVU5fQ0xBU1MoT3V0cHV0VG8sIEJhc2VBdm1QcmltaXRpdmUpCisKKworQVZNX1BSSU1JVElWRV9SVU5fQ0xBU1MoT3V0cHV0VmFyLCBCYXNlQXZtUHJpbWl0aXZlKQorCitBVk1fUFJJTUlUSVZFX1JVTl9DTEFTUyhPdXRwdXRFbnYsIEJhc2VBdm1QcmltaXRpdmUpCisKK0FWTV9QUklNSVRJVkVfUlVOX0NMQVNTKE91dHB1dEJ1ZmZlciwgQmFzZUF2bVByaW1pdGl2ZSkKKworQVZNX1BSSU1JVElWRV9SVU5fQ0xBU1MoT3V0cHV0UmR2LCBCYXNlQXZtUHJpbWl0aXZlKQorCisKK0FWTV9QUklNSVRJVkVfUlVOX0VWQUxfQ0xBU1MoUHJlc2VudCwgQmFzZUF2bVByaW1pdGl2ZSkKKworQVZNX1BSSU1JVElWRV9SVU5fRVZBTF9DTEFTUyhBYnNlbnQsIEJhc2VBdm1QcmltaXRpdmUpCisKKworQVZNX1BSSU1JVElWRV9SVU5fRVZBTF9DTEFTUyhPQlMsIEJhc2VBdm1QcmltaXRpdmUpCisKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFWTSBCVUZGRVIgTUFOQUdJTkcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworQVZNX1BSSU1JVElWRV9SVU5fQ0xBU1MoVXBkYXRlQnVmZmVyLCBCYXNlQXZtUHJpbWl0aXZlKQorCisKKworfQorCisjZW5kaWYgLyogQVZNQ09NTVVOSUNBVElPTlBSSU1JVElWRV9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bUNvbW11bmljYXRpb25SZHZQcmltaXRpdmUuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bUNvbW11bmljYXRpb25SZHZQcmltaXRpdmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNTg5NjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtQ29tbXVuaWNhdGlvblJkdlByaW1pdGl2ZS5jcHAKQEAgLTAsMCArMSwxODAyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogOCBub3YuIDIwMTAKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkF2bUNvbW11bmljYXRpb25SZHZQcmltaXRpdmUuaCIKKworI2luY2x1ZGUgPGNvbXB1dGVyL0V4ZWN1dGlvbkRhdGFGYWN0b3J5Lmg+CisjaW5jbHVkZSA8Y29tcHV0ZXIvRXhlY3V0aW9uRW52aXJvbm1lbnQuaD4KKworI2luY2x1ZGUgPGNvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1TeW5jaHJvbml6YXRpb25GYWN0b3J5Lmg+CisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mQ29ubmVjdC5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZNYWNoaW5lLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZlBvcnQuaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9Sb3V0aW5nRGF0YS5oPgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vU3RhdGVtZW50Q29uc3RydWN0b3IuaD4KKworI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Db21Qcm90b2NvbC5oPgorCisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yTWFuYWdlci5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uQ29uZmlndXJhdGlvbi5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvblN5bmNocm9uaXphdGlvblBvaW50Lmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvTWVzc2FnZS5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL1J1bnRpbWVEZWYuaD4KKworCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitzdGF0aWMgdm9pZCBwcmludF90cmFjZShjb25zdCBBUEV4ZWN1dGlvbkRhdGEgJiBhbkVELCBPdXRTdHJlYW0gJiBvcykKK3sKKwlpZiggYW5FRC5pbnZhbGlkKCkgKQorCXsKKwkJcmV0dXJuOworCX0KKworCW9zIDw8IFRBQiA8PCAiRURAIiA8PCBhbkVELnJhd19hZGRyZXNzKCk7CisKKwlpZiggYW5FRC0+bUVYRUNfU1lOQ19QT0lOVCAhPSBOVUxMICkKKwl7CisJCW9zIDw8ICIgUkRfIiA8PCBhbkVELT5tRVhFQ19TWU5DX1BPSU5ULT5tUm91dGluZ0RhdGEucmF3X2FkZHJlc3MoKQorCQkJPDwgIiBDXyIgPDwgYXZtX2FkZHJlc3NfdCgKKwkJCQkJYW5FRC0+bUVYRUNfU1lOQ19QT0lOVC0+bVJvdXRpbmdEYXRhLmdldENvbm5lY3QoKSkKKwkJCTw8ICI8IG1pZDoiIDw8IGFuRUQtPm1FWEVDX1NZTkNfUE9JTlQtPm1Sb3V0aW5nRGF0YS5nZXRNSUQoKQorCQkJPDwgIiA+ICIgPDwgYW5FRC0+bUVYRUNfU1lOQ19QT0lOVC0+bVJvdXRpbmdEYXRhCisJCQkJCS5nZXRNYWNoaW5lKCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKwkJCTw8ICggKGFuRUQtPm1FWEVDX1NZTkNfUE9JTlQtPmlzSW5wdXQoKSk/ICIgPD09ICIgOiAiID09PiAiICkKKwkJCTw8IGFuRUQtPm1FWEVDX1NZTkNfUE9JTlQtPm1Sb3V0aW5nRGF0YQorCQkJCQkuZ2V0UG9ydCgpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisKKwkJCTw8ICIgIiA8PCBhbkVELT5nZXRSdW5uYWJsZUVsZW1lbnRUcmFjZSgpLnN0cigpOworCX0KKwllbHNlCisJeworCQlvcyA8PCAiICIgPDwgYW5FRC0+Z2V0SU9FbGVtZW50VHJhY2UoKS5zdHIoKTsKKwl9CisKKwlvcyA8PCBFT0xfRkxVU0g7Cit9CisKKworc3RhdGljIHZvaWQgcHJpbnRfdHJhY2UoY29uc3QgTGlzdE9mQVBFeGVjdXRpb25EYXRhICYgbGlzdG9mV2FpdGluZ1JEViwKKwkJT3V0U3RyZWFtICYgb3MpCit7CisJTGlzdE9mQVBFeGVjdXRpb25EYXRhOjpjb25zdF9pdGVyYXRvciBpdEVEID0gbGlzdG9mV2FpdGluZ1JEVi5iZWdpbigpOworCUxpc3RPZkFQRXhlY3V0aW9uRGF0YTo6Y29uc3RfaXRlcmF0b3IgZW5kRUQgPSBsaXN0b2ZXYWl0aW5nUkRWLmVuZCgpOworCisJZm9yKCA7IGl0RUQgIT0gZW5kRUQgOyArK2l0RUQgKQorCXsKKwkJcHJpbnRfdHJhY2UoKCppdEVEKSwgb3MpOworCisvLwkJKCppdEVEKS0+bUVYRUNfU1lOQ19QT0lOVC0+dG9TdHJlYW0oQVZNX09TX1RSQUNFLCBUQUIgKyAiXHQiLCAiXHQiLCAiXG4iKTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgcHJpbnRfdHJhY2UoY29uc3QgVmVjdG9yT2ZBUEV4ZWN1dGlvbkRhdGEgJiB0YWJsZW9mV2FpdGluZ1JEViwKKwkJT3V0U3RyZWFtICYgb3MpCit7CisJVmVjdG9yT2ZBUEV4ZWN1dGlvbkRhdGE6OmNvbnN0X2l0ZXJhdG9yIGl0RUQgPSB0YWJsZW9mV2FpdGluZ1JEVi5iZWdpbigpOworCVZlY3Rvck9mQVBFeGVjdXRpb25EYXRhOjpjb25zdF9pdGVyYXRvciBlbmRFRCA9IHRhYmxlb2ZXYWl0aW5nUkRWLmVuZCgpOworCisJZm9yKCA7IGl0RUQgIT0gZW5kRUQgOyArK2l0RUQgKQorCXsKKwkJcHJpbnRfdHJhY2UoKCppdEVEKSwgb3MpOworCisvLwkJKCppdEVEKS0+bUVYRUNfU1lOQ19QT0lOVC0+dG9TdHJlYW0oQVZNX09TX1RSQUNFLCBUQUIgKyAiXHQiLCAiXHQiLCAiXG4iKTsKKwl9Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRlVTSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitSZHZDb25maWd1cmF0aW9uRGF0YSAqIFJkdkNvbmZpZ3VyYXRpb25EYXRhOjpmdXNpb24oUmR2Q29uZmlndXJhdGlvbkRhdGEgKiBhUmR2Q29uZikKK3sKKwlSZHZDb25maWd1cmF0aW9uRGF0YSAqIGFGdXNpb25SZHZDb25mID0gbmV3IFJkdkNvbmZpZ3VyYXRpb25EYXRhKCp0aGlzLCBhUmR2Q29uZik7CisKKwlmb3IoIGF2bV9zaXplX3QgaWR4ID0gMCA7IGlkeCA8IG1NYWNoaW5lQ291bnQgOyArK2lkeCApCisJeworCQlJTl9FRF9SRFZbIGlkeCBdLmFwcGVuZCggYVJkdkNvbmYtPklOX0VEX1JEVlsgaWR4IF0gKTsKKwkJT1VUX0VEX1JEVlsgaWR4IF0uYXBwZW5kKCBhUmR2Q29uZi0+T1VUX0VEX1JEVlsgaWR4IF0gKTsKKworCQlFRF9NVUxUSVJEVlsgaWR4IF0uYXBwZW5kKCBhUmR2Q29uZi0+RURfTVVMVElSRFZbIGlkeCBdICk7CisKKwkJUkRWU1sgaWR4IF0uYXBwZW5kKCBhUmR2Q29uZi0+UkRWU1sgaWR4IF0gKTsKKworCQlpZiggbUF3YWl0aW5nTXVsdGlSZHZFRFNbIGlkeCBdLmludmFsaWQoKSAmJgorCQkJCWFSZHZDb25mLT5tQXdhaXRpbmdNdWx0aVJkdkVEU1sgaWR4IF0udmFsaWQoKSApCisJCXsKKwkJCW1Bd2FpdGluZ011bHRpUmR2RURTIFsgaWR4IF0gPSBhUmR2Q29uZi0+bUF3YWl0aW5nTXVsdGlSZHZFRFNbIGlkeCBdOworCQkJbUF3YWl0aW5nTXVsdGlSZHZGbGFnWyBpZHggXSA9IHRydWU7CisJCX0KKwl9CisKKwlyZXR1cm4oIGFGdXNpb25SZHZDb25mICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFJFU0laRQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBSZHZDb25maWd1cmF0aW9uRGF0YTo6cmVzaXplKGF2bV9zaXplX3QgbmV3U2l6ZSkKK3sKKwlBVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoIG5ld1NpemUgPD0gbU1hY2hpbmVDb3VudCApCisJCQk8PCAiVW5leHBlY3RlZCBtYWNoaW5lIGNvdW50IGZvciBSRFYgQ29uZmlndXJhdGlvbiBEYXRhICEhISIKKwkJCTw8IFNFTkRfRVhJVDsKKworCWlmKCBuZXdTaXplIDwgbU1hY2hpbmVDb3VudCApCisJeworCQlJTl9FRF9SRFYucmVzaXplKCBuZXdTaXplICk7CisJCU9VVF9FRF9SRFYucmVzaXplKCBuZXdTaXplICk7CisKKwkJRURfTVVMVElSRFYucmVzaXplKCBuZXdTaXplICk7CisKKwkJbVVzZWRNYWNoaW5lRmxhZy5yZXNpemUoIG5ld1NpemUgLCBmYWxzZSApOworCisJCW1Bd2FpdGluZ0lucHV0UmR2RmxhZy5yZXNpemUoIG5ld1NpemUgLCBmYWxzZSApOworCQltQXdhaXRpbmdPdXRwdXRSZHZGbGFnLnJlc2l6ZSggbmV3U2l6ZSAsIGZhbHNlICk7CisJCW1Bd2FpdGluZ011bHRpUmR2RmxhZy5yZXNpemUoIG5ld1NpemUgLCBmYWxzZSApOworCisJCW1Bd2FpdGluZ011bHRpUmR2RURTLnJlc2l6ZSggbmV3U2l6ZSApOworCisJCW1NYWNoaW5lQ291bnQgPSBuZXdTaXplOworCX0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEZMQUdTIE9QRVJBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBSZHZDb25maWd1cmF0aW9uRGF0YTo6aXNNdWx0aVJkdkNvbXBsZXRlKCkKK3sKKwlhdm1fc2l6ZV90IGluQ291bnQgPSAwOworCWF2bV9zaXplX3Qgb3V0Q291bnQgPSAwOworCisJQVBFeGVjdXRpb25EYXRhIGFuRUQ7CisKKwlmb3IoIGF2bV9zaXplX3QgaWR4ID0gMCA7IGlkeCA8IG1NYWNoaW5lQ291bnQ7ICsraWR4ICkKKwl7CisJCWlmKCBtQXdhaXRpbmdNdWx0aVJkdkVEU1sgaWR4IF0udmFsaWQoKSApCisJCXsKKwkJCWFuRUQgPSBtQXdhaXRpbmdNdWx0aVJkdkVEU1sgaWR4IF07CisKKwkJCWlmKCBhbkVELT5tRVhFQ19TWU5DX1BPSU5ULT5pc091dHB1dCgpICkKKwkJCXsKKwkJCQkrK291dENvdW50OworCQkJfQorCQkJZWxzZSAvL2lmKCBhbkVELT5tRVhFQ19TWU5DX1BPSU5ULT5pc0lucHV0KCkgKQorCQkJeworCQkJCSsraW5Db3VudDsKKwkJCX0KKwkJfQorCX0KKworCisJQ29tUm91dGVEYXRhICYgb3V0cHV0Q29tUm91dGUgPSBhbkVELT5tRVhFQ19TWU5DX1BPSU5ULT4KKwkJCW1Sb3V0aW5nRGF0YS5nZXRDb25uZWN0KCktPmdldE91dHB1dENvbVJvdXRlRGF0YSgpOworCisJc3dpdGNoKCBvdXRwdXRDb21Sb3V0ZS5nZXRDYXN0KCkgKQorCXsKKwkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfVU5JQ0FTVF9LSU5EOgorCQl7CisJCQlpZiggb3V0Q291bnQgIT0gMSApCisJCQl7CisJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCisJCWNhc2UgQ29tUHJvdG9jb2w6OlBST1RPQ09MX01VTFRJQ0FTVF9LSU5EOgorCQl7CisJCQlpZiggb3V0Q291bnQgIT0gb3V0cHV0Q29tUm91dGUuZ2V0TWFjaGluZVBvcnRzKCkuc2l6ZSgpICkKKwkJCXsKKwkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgQ29tUHJvdG9jb2w6OlBST1RPQ09MX0JST0FEQ0FTVF9LSU5EOgorCisJCWNhc2UgQ29tUHJvdG9jb2w6OlBST1RPQ09MX1VOREVGSU5FRF9LSU5EOgorCQlkZWZhdWx0OgorCQl7CisJCQlpZiggb3V0Q291bnQgPT0gMCApCisJCQl7CisJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlDb21Sb3V0ZURhdGEgJiBpbnB1dENvbVJvdXRlID0gYW5FRC0+bUVYRUNfU1lOQ19QT0lOVC0+CisJCQltUm91dGluZ0RhdGEuZ2V0Q29ubmVjdCgpLT5nZXRJbnB1dENvbVJvdXRlRGF0YSgpOworCisJc3dpdGNoKCBpbnB1dENvbVJvdXRlLmdldENhc3QoKSApCisJeworCQljYXNlIENvbVByb3RvY29sOjpQUk9UT0NPTF9VTklDQVNUX0tJTkQ6CisJCXsKKwkJCWlmKCBpbkNvdW50ICE9IDEgKQorCQkJeworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfTVVMVElDQVNUX0tJTkQ6CisJCXsKKwkJCWlmKCBpbkNvdW50ICE9IGlucHV0Q29tUm91dGUuZ2V0TWFjaGluZVBvcnRzKCkuc2l6ZSgpICkKKwkJCXsKKwkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgQ29tUHJvdG9jb2w6OlBST1RPQ09MX0JST0FEQ0FTVF9LSU5EOgorCisJCWNhc2UgQ29tUHJvdG9jb2w6OlBST1RPQ09MX1VOREVGSU5FRF9LSU5EOgorCQlkZWZhdWx0OgorCQl7CisJCQlpZiggaW5Db3VudCA9PSAwICkKKwkJCXsKKwkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KKworLy8JcmV0dXJuKCAob3V0Q291bnQgPT0gMSkgJiYgKGluQ291bnQgPiAwKSAmJgorLy8JCQlhbkVELT5tRVhFQ19TWU5DX1BPSU5ULT5tUm91dGluZ0RhdGEuZ2V0Q29ubmVjdCgpLT4KKy8vCQkJCWdldElucHV0Q29tUm91dGVEYXRhKCkuZ2V0TWFjaGluZVBvcnRzKCkuc2l6ZSgpID09ICgxICsgaW5Db3VudCkgKTsKKworLy8JcmV0dXJuKCAoYW5FRC0+bUVYRUNfU1lOQ19QT0lOVC0+bVJvdXRpbmdEYXRhLmdldENvbm5lY3QoKS0+Z2V0T3V0cHV0UG9ydCgpLnNpemUoKQorLy8JCQkrIGFuRUQtPm1FWEVDX1NZTkNfUE9JTlQtPm1Sb3V0aW5nRGF0YS5nZXRDb25uZWN0KCktPgorLy8JCQkJZ2V0SW5wdXRDb21Sb3V0ZURhdGEoKS5nZXRNYWNoaW5lUG9ydHMoKS5zaXplKCkpID09IGNvdW50ICk7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU0VSSUFMSVpBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBSZHZDb25maWd1cmF0aW9uRGF0YTo6dG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisvLwlvcyA8PCBzdGQ6OmVuZGw7CisJb3MgPDwgUkVQRUFUKCItLS0tLS0tLS0tIiwgMTApIDw8IHN0ZDo6ZW5kbDsKKwlvcyA8PCAiVXNlZE1hY2hpbmVGbGFnICAgIDo+ICIgPDwgbVVzZWRNYWNoaW5lRmxhZyA8PCBzdGQ6OmVuZGw7CisJb3MgPDwgIkF3YWl0aW5nSW5wdXQgICAgICA6PiAiIDw8IG1Bd2FpdGluZ0lucHV0UmR2RmxhZyA8PCBzdGQ6OmVuZGw7CisJb3MgPDwgIkF3YWl0aW5nT3V0cHV0ICAgICA6PiAiIDw8IG1Bd2FpdGluZ091dHB1dFJkdkZsYWcgPDwgc3RkOjplbmRsOworCisJb3MgPDwgIkF3YWl0aW5nTXVsdGkgICAgICA6PiAiIDw8IG1Bd2FpdGluZ011bHRpUmR2RmxhZyA8PCBzdGQ6OmVuZGw7CisJb3MgPDwgIkF3YWl0aW5nSW5wdXRNdWx0aSA6PiAiIDw8IG1Bd2FpdGluZ0lucHV0TXVsdGlSZHZGbGFnIDw8IHN0ZDo6ZW5kbDsKKwlvcyA8PCAiQXdhaXRpbmdPdXRwdU11bHRpIDo+ICIgPDwgbUF3YWl0aW5nT3V0cHV0TXVsdGlSZHZGbGFnIDw8IHN0ZDo6ZW5kbDsKKworCW9zIDw8ICJQZXJtZm9ybWVkIFJEVj8gICAgOj4gIiA8PCBoYXNQZXJmb3JtZWRSZHZGbGFnIDw8IHN0ZDo6ZW5kbDsKKwlvcyA8PCAiSW50ZXJuYWwgUkRWPyAgICAgIDo+ICIgPDwgaGFzUG9zc2libGVJbnRlcm5hbFJkdkZsYWcgPDwgc3RkOjplbmRsOworCW9zIDw8ICJJbnRlcm5hbCBNVUxUST8gICAgOj4gIiA8PCBoYXNQb3NzaWJsZUludGVybmFsTXVsdGlSZHZGbGFnIDw8IHN0ZDo6ZW5kbDsKKworCWZvciggYXZtX3NpemVfdCBpZHggPSAwIDsgaWR4IDwgbU1hY2hpbmVDb3VudCA7ICsraWR4ICkKKwl7CisJCWlmKCBJTl9FRF9SRFZbIGlkeCBdLm5vbmVtcHR5KCkgfHwgT1VUX0VEX1JEVlsgaWR4IF0ubm9uZW1wdHkoKSB8fAorCQkJCUVEX01VTFRJUkRWWyBpZHggXS5ub25lbXB0eSgpIHx8IFJEVlNbIGlkeCBdLm5vbmVtcHR5KCkgKQorCQl7CisJCQlvcyA8PCBSRVBFQVQoIi0tLS0tLS0tLS0iLCAxMCkgPDwgc3RkOjplbmRsOworCQl9CisKKy8vCQlvcyA8PCAiZnJlZSA6PiAiIDw8IG1GcmVlT2Zmc2V0RmxhZ1tpZHhdIDw8IHN0ZDo6ZW5kbDsKKworCQlvcyA8PCBJTkNSX0lOREVOVDsKKwkJaWYoIElOX0VEX1JEVlsgaWR4IF0ubm9uZW1wdHkoKSApCisJCXsKKwkJCW9zIDw8ICJJTlBVVFNfUkRWWyAiIDw8IGlkeCA8PCAiIF0gOj4iIDw8IEVPTDsKKwkJCXByaW50X3RyYWNlKElOX0VEX1JEVlsgaWR4IF0sIG9zKTsKKwkJfQorCisJCWlmKCBPVVRfRURfUkRWWyBpZHggXS5ub25lbXB0eSgpICkKKwkJeworCQkJb3MgPDwgIk9VVFBVVFNfUkRWWyAiIDw8IGlkeCA8PCAiIF0gOj4iIDw8IEVPTDsKKwkJCXByaW50X3RyYWNlKE9VVF9FRF9SRFZbIGlkeCBdLCBvcyk7CisJCX0KKworCQlpZiggRURfTVVMVElSRFZbIGlkeCBdLm5vbmVtcHR5KCkgKQorCQl7CisJCQlvcyA8PCAiRURfTVVMVElSRFZbICIgPDwgaWR4IDw8ICIgXSA6PiIgPDwgRU9MOworCQkJcHJpbnRfdHJhY2UoRURfTVVMVElSRFZbIGlkeCBdLCBvcyk7CisJCX0KKworCQlpZiggUkRWU1sgaWR4IF0ubm9uZW1wdHkoKSApCisJCXsKKwkJCW9zIDw8ICJSRFZTWyAiIDw8IGlkeCA8PCAiIF0gOj4iIDw8IEVPTDsKKwkJCXByaW50X3RyYWNlKFJEVlNbIGlkeCBdLCBvcyk7CisJCX0KKwl9CisKKwlpZiggbUF3YWl0aW5nTXVsdGlSZHZGbGFnLmFueSgpICkKKwl7CisJCW9zIDw8IFJFUEVBVCgiLS0tLS0tLS0tLSIsIDEwKSA8PCBzdGQ6OmVuZGw7CisJCW9zIDw8ICJBV0FJVElOR19NVUxUSV9SRFYgOj4iIDw8IEVPTDsKKwkJcHJpbnRfdHJhY2UobUF3YWl0aW5nTXVsdGlSZHZFRFMsIG9zKTsKKwl9CisKKwlvcyA8PCBERUNSX0lOREVOVDsKKworCisJb3MgPDwgUkVQRUFUKCI9PT09PT09PT09IiwgMTApIDw8IHN0ZDo6ZW5kbDsKKworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vIHRoZSBSRVNVTUUgUkRWIHN0YXRlbWVudAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vIEdMT0JBTCBFRkZFQ1RJVkUgUkRWIENPVU5UCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCithdm1fc2l6ZV90IEF2bUNvbW11bmljYXRpb25SZHZQcmltaXRpdmU6OkdMT0JBTF9FRkZFQ1RJVkVfUkRWX0NPVU5UID0gMDsKKworYXZtX3NpemVfdCBBdm1Db21tdW5pY2F0aW9uUmR2UHJpbWl0aXZlOjpHTE9CQUxfRUZGRUNUSVZFX01VTFRJX1JEVl9DT1VOVCA9IDA7CisKKwordm9pZCBBdm1Db21tdW5pY2F0aW9uUmR2UHJpbWl0aXZlOjpyZXBvcnRHbG9iYWxTdGF0aXN0aWNzKE91dFN0cmVhbSAmIG9zKQoreworCWlmKCBHTE9CQUxfRUZGRUNUSVZFX1JEVl9DT1VOVCA+IDAgKQorCXsKKwkJb3MgPDwgRU9MX1RBQjIgPDwgIkVmZmVjdGl2ZSBSRFYgOiAiIDw8IEdMT0JBTF9FRkZFQ1RJVkVfUkRWX0NPVU5UOworCisJCWlmKCBHTE9CQUxfRUZGRUNUSVZFX01VTFRJX1JEVl9DT1VOVCA+IDAgKQorCQl7CisJCQlvcyA8PCAiICAmICBNVUxUSV9SRFYgOiAiIDw8IEdMT0JBTF9FRkZFQ1RJVkVfTVVMVElfUkRWX0NPVU5UOworCQl9CisJCW9zIDw8IEVPTDsKKwl9CisJZWxzZSBpZiggR0xPQkFMX0VGRkVDVElWRV9NVUxUSV9SRFZfQ09VTlQgPiAwICkKKwl7CisJCW9zIDw8IEVPTF9UQUIyIDw8ICJFZmZlY3RpdmUgTVVMVElfUkRWIDogIgorCQkJCTw8IEdMT0JBTF9FRkZFQ1RJVkVfTVVMVElfUkRWX0NPVU5UCisJCQkJPDwgRU9MOworCX0KK30KKworLyoqCisgKiBDT01QVVRFIEFMTCBSRFYKKyAqLworYm9vbCBBdm1Db21tdW5pY2F0aW9uUmR2UHJpbWl0aXZlOjpjb21wdXRlUmR2KAorCQlBdm1QcmltaXRpdmVQcm9jZXNzb3IgJiBhUHJvY2Vzc29yLAorCQlzdGQ6OnZlY3RvcjwgRXhlY3V0aW9uRW52aXJvbm1lbnQgPiAmIHRhYk9mRU5WKQoreworCXJldHVybiggZmFsc2UgKTsKK30KKworCisvKioKKyAqIHRoZSBSRVNVTUUgUkRWIGluc3RydWN0aW9uCisgKi8KKworYm9vbCBBdm1Db21tdW5pY2F0aW9uUmR2UHJpbWl0aXZlOjpoYXZlUkRWKEFQRXhlY3V0aW9uRGF0YSAmIG91dEVELAorCQlBUEV4ZWN1dGlvbkRhdGEgJiBpbkVEKQoreworCWlmKCBpbkVELT5tRVhFQ19TWU5DX1BPSU5ULT5tUm91dGluZ0RhdGEuZ2V0Q29ubmVjdCgpID09CisJCQlvdXRFRC0+bUVYRUNfU1lOQ19QT0lOVC0+bVJvdXRpbmdEYXRhLmdldENvbm5lY3QoKSApCisJeworCQlyZXR1cm4oIGluRUQtPm1FWEVDX1NZTkNfUE9JTlQtPm1NZXNzYWdlLm5lZWRTZW5kZXIoCisJCQkJb3V0RUQtPm1FWEVDX1NZTkNfUE9JTlQtPm1NZXNzYWdlLmdldFNlbmRlclJJRCgpKSApOworCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKworc3RhdGljIGJvb2wgaXNBZGRSdmRDb25mKFJkdkNvbmZpZ3VyYXRpb25EYXRhICogYVJkdkNvbmYsCisJCWF2bV9zaXplX3QgaWR4LCBBUEV4ZWN1dGlvbkRhdGEgJiBhbkVEKQoreworCWlmKCBhUmR2Q29uZi0+bUNvbm5lY3RvcgorCQk9PSBhbkVELT5tRVhFQ19TWU5DX1BPSU5ULT5tUm91dGluZ0RhdGEuZ2V0Q29ubmVjdCgpICkKKwl7CisJCWJvb2wgcmV0dXJuRmxhZyA9IHRydWU7CisKKwkJc3dpdGNoKCBhbkVELT5tRVhFQ19TWU5DX1BPSU5ULT5tQXdhaXRpbmdQb2ludE5hdHVyZSApCisJCXsKKwkJCWNhc2UgQVdBSVRJTkdfUE9JTlRfT1VUUFVUX05BVFVSRToKKwkJCXsKKwkJCQlzd2l0Y2goIGFuRUQtPm1FWEVDX1NZTkNfUE9JTlQtPm1Sb3V0aW5nRGF0YS4KKwkJCQkJCWdldENvbm5lY3QoKS0+Z2V0T3V0cHV0Q29tUm91dGVEYXRhKCkuZ2V0Q2FzdCgpICkKKwkJCQl7CisJCQkJCWNhc2UgQ29tUHJvdG9jb2w6OlBST1RPQ09MX1VOSUNBU1RfS0lORDoKKwkJCQkJeworCQkJCQkJaWYoIGFSZHZDb25mLT5tQXdhaXRpbmdPdXRwdXRNdWx0aVJkdkZsYWdbaWR4XSApCisJCQkJCQl7CisJCQkJCQkJYVJkdkNvbmYtPm1Bd2FpdGluZ091dHB1dE11bHRpUmR2RmxhZ1tpZHhdID0gZmFsc2U7CisJCQkJCQkJcmV0dXJuRmxhZyA9IGFSZHZDb25mLT5tQXdhaXRpbmdPdXRwdXRNdWx0aVJkdkZsYWcubm9uZSgpOworCQkJCQkJCWFSZHZDb25mLT5tQXdhaXRpbmdPdXRwdXRNdWx0aVJkdkZsYWdbaWR4XSA9IHRydWU7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJcmV0dXJuRmxhZyA9IGFSZHZDb25mLT5tQXdhaXRpbmdPdXRwdXRNdWx0aVJkdkZsYWcubm9uZSgpOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJZGVmYXVsdDoKKwkJCQkJeworCQkJCQkJLy8gTk9USElORworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIEFXQUlUSU5HX1BPSU5UX0lOUFVUX05BVFVSRToKKwkJCXsKKwkJCQlzd2l0Y2goIGFuRUQtPm1FWEVDX1NZTkNfUE9JTlQtPm1Sb3V0aW5nRGF0YS4KKwkJCQkJCWdldENvbm5lY3QoKS0+Z2V0SW5wdXRDb21Sb3V0ZURhdGEoKS5nZXRDYXN0KCkgKQorCQkJCXsKKwkJCQkJY2FzZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfVU5JQ0FTVF9LSU5EOgorCQkJCQl7CisJCQkJCQlpZiggYVJkdkNvbmYtPm1Bd2FpdGluZ0lucHV0TXVsdGlSZHZGbGFnW2lkeF0gKQorCQkJCQkJeworCQkJCQkJCWFSZHZDb25mLT5tQXdhaXRpbmdJbnB1dE11bHRpUmR2RmxhZ1tpZHhdID0gZmFsc2U7CisJCQkJCQkJcmV0dXJuRmxhZyA9IGFSZHZDb25mLT5tQXdhaXRpbmdJbnB1dE11bHRpUmR2RmxhZy5ub25lKCk7CisJCQkJCQkJYVJkdkNvbmYtPm1Bd2FpdGluZ0lucHV0TXVsdGlSZHZGbGFnW2lkeF0gPSB0cnVlOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCXJldHVybkZsYWcgPSBhUmR2Q29uZi0+bUF3YWl0aW5nSW5wdXRNdWx0aVJkdkZsYWcubm9uZSgpOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJZGVmYXVsdDoKKwkJCQkJeworCQkJCQkJLy8gTk9USElORworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCQlkZWZhdWx0OgorCQkJeworCQkJCS8vIE5PVEhJTkcKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmV0dXJuRmxhZzsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKKworCitzdGF0aWMgdm9pZCBhZGRSdmRDb25mKGJvb2wgaXNJbml0aWFsLAorCQlMaXN0T2ZSZHZDb25maWd1cmF0aW9uRGF0YSAmIG11bHRpUmR2Q29uZiwKKwkJUmR2Q29uZmlndXJhdGlvbkRhdGEgKiByZWZSZHZDb25mLAorCQlhdm1fc2l6ZV90IGlkeCwgTGlzdE9mQVBFeGVjdXRpb25EYXRhICYgdGhlRUQpCit7CisJTGlzdE9mQVBFeGVjdXRpb25EYXRhOjppdGVyYXRvciBpdEVEOworCUxpc3RPZkFQRXhlY3V0aW9uRGF0YTo6aXRlcmF0b3IgZW5kRUQgPSB0aGVFRC5lbmQoKTsKKworCWF2bV9zaXplX3QgZWR4OworCWF2bV9zaXplX3QgZWRDb3VudCA9IHRoZUVELnNpemUoKTsKKwlCaXRzZXQgaXNub3RGb3VuZChlZENvdW50LCB0cnVlKTsKKworCVJkdkNvbmZpZ3VyYXRpb25EYXRhICogYVJkdkNvbmYgPSBOVUxMOworCisJTGlzdE9mUmR2Q29uZmlndXJhdGlvbkRhdGE6Oml0ZXJhdG9yIGl0Q29uZiA9IG11bHRpUmR2Q29uZi5iZWdpbigpOworCUxpc3RPZlJkdkNvbmZpZ3VyYXRpb25EYXRhOjppdGVyYXRvciBlbmRDb25mID0gbXVsdGlSZHZDb25mLmVuZCgpOworCWZvciggOyBpdENvbmYgIT0gZW5kQ29uZiA7ICsraXRDb25mICkKKwl7CisvLwkJQVZNX09TX1RSQUNFIDw8IFJFUEVBVCgiKysrKysrKysrKyIsIDEwKSA8PCBzdGQ6OmVuZGw7CisvLwkJQVZNX09TX1RSQUNFIDw8IFJFUEVBVCgiKysrKysrKysrKyIsIDEwKSA8PCBzdGQ6OmVuZGw7CisvLwkJKCppdENvbmYpLT50b1N0cmVhbShBVk1fT1NfVFJBQ0UpOworCisJCWZvciggaXRFRCA9IHRoZUVELmJlZ2luKCkgLCBlZHggPSAwIDsgaXRFRCAhPSBlbmRFRCA7ICsraXRFRCAsICsrZWR4KQorCQl7CisvLwkJCUFWTV9PU19UUkFDRSA8PCAiOj0+ICI7CisvLwkJCXByaW50X3RyYWNlKCppdEVELCBBVk1fT1NfVFJBQ0UsICIiKTsKKworCQkJaWYoIGlzQWRkUnZkQ29uZigqaXRDb25mLCBpZHgsICppdEVEKSApCisJCQl7CisJCQkJaXNub3RGb3VuZFtlZHhdID0gZmFsc2U7CisKKwkJCQlhUmR2Q29uZiA9ICgqaXRDb25mKTsKKwkJCQlpZiggYVJkdkNvbmYtPm1Bd2FpdGluZ011bHRpUmR2RURTW2lkeF0udmFsaWQoKSApCisJCQkJeworCQkJCQltdWx0aVJkdkNvbmYuaW5zZXJ0KGl0Q29uZiAsIGFSZHZDb25mID0KKwkJCQkJCQluZXcgUmR2Q29uZmlndXJhdGlvbkRhdGEoKmFSZHZDb25mKSk7CisJCQkJfQorCQkJCWFSZHZDb25mLT5tQXdhaXRpbmdNdWx0aVJkdkVEUyBbIGlkeCBdID0gKCppdEVEKTsKKwkJCQlhUmR2Q29uZi0+bUF3YWl0aW5nTXVsdGlSZHZGbGFnWyBpZHggXSA9IHRydWU7CisKKwkJCQlhUmR2Q29uZi0+bUF3YWl0aW5nSW5wdXRNdWx0aVJkdkZsYWcgWyBpZHggXSA9CisJCQkJCQkoKml0RUQpLT5tRVhFQ19TWU5DX1BPSU5ULT5pc0lucHV0KCk7CisKKwkJCQlhUmR2Q29uZi0+bUF3YWl0aW5nT3V0cHV0TXVsdGlSZHZGbGFnWyBpZHggXSA9CisJCQkJCQkoKml0RUQpLT5tRVhFQ19TWU5DX1BPSU5ULT5pc091dHB1dCgpOworCQkJCWFSZHZDb25mLT5tVXNlZE1hY2hpbmVGbGFnWyBpZHggXSA9IHRydWU7CisKKy8vCQkJCUFWTV9PU19UUkFDRSA8PCBSRVBFQVQoIisrKysrKysrKysiLCAxMCkgPDwgc3RkOjplbmRsOworLy8JCQkJYVJkdkNvbmYtPnRvU3RyZWFtKEFWTV9PU19UUkFDRSk7CisJCQl9CisJCQllbHNlIGlmKCBpc25vdEZvdW5kW2VkeF0gKQorCQkJeworCQkJCWlzbm90Rm91bmRbZWR4XSA9ICgoKml0Q29uZiktPm1Db25uZWN0b3IgIT0KKwkJCQkJKCppdEVEKS0+bUVYRUNfU1lOQ19QT0lOVC0+bVJvdXRpbmdEYXRhLmdldENvbm5lY3QoKSk7CisJCQl9CisJCX0KKwl9CisKKwlpZiggaXNub3RGb3VuZC5hbnkoKSApCisJeworCQlmb3IoIGl0RUQgPSB0aGVFRC5iZWdpbigpICwgZWR4ID0gMCA7IGl0RUQgIT0gZW5kRUQgOyArK2l0RUQgLCArK2VkeCkKKwkJeworCQkJaWYoIGlzbm90Rm91bmRbZWR4XSApCisJCQl7CisvLwkJCQlBVk1fT1NfVFJBQ0UgPDwgInw9PiAiOworLy8JCQkJcHJpbnRfdHJhY2UoKml0RUQsIEFWTV9PU19UUkFDRSwgIiIpOworCisJCQkJaWYoIGlzSW5pdGlhbCApCisJCQkJeworCQkJCQlhUmR2Q29uZiA9IG5ldyBSZHZDb25maWd1cmF0aW9uRGF0YShyZWZSZHZDb25mKTsKKwkJCQkJYVJkdkNvbmYtPm1Db25uZWN0b3IgPQorCQkJCQkJKCppdEVEKS0+bUVYRUNfU1lOQ19QT0lOVC0+bVJvdXRpbmdEYXRhLmdldENvbm5lY3QoKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJYVJkdkNvbmYgPSBuZXcgUmR2Q29uZmlndXJhdGlvbkRhdGEoKnJlZlJkdkNvbmYpOworCisvLwkJCQkJaWYoIGFSZHZDb25mLT5tQ29ubmVjdG9yICE9CisvLwkJCQkJCSgqaXRFRCktPm1FWEVDX1NZTkNfUE9JTlQtPm1Sb3V0aW5nRGF0YS5nZXRDb25uZWN0KCkgKQorLy8JCQkJCXsKKy8vCQkJCQkJYVJkdkNvbmYtPm1Bd2FpdGluZ011bHRpUmR2RmxhZy5yZXNldCgpOworLy8JCQkJCQlmb3IoIGF2bV9zaXplX3QgaSA9IDAgOyBpIDwgYVJkdkNvbmYtPm1NYWNoaW5lQ291bnQ7ICsraSApCisvLwkJCQkJCXsKKy8vCQkJCQkJCWFSZHZDb25mLT5tQXdhaXRpbmdNdWx0aVJkdkVEU1sgaSBdID0gTlVMTDsKKy8vCQkJCQkJfQorLy8JCQkJCX0KKwkJCQkJYVJkdkNvbmYtPklOX0VEX1JEVlsgaWR4IF0uY2xlYXIoKTsKKwkJCQkJYVJkdkNvbmYtPk9VVF9FRF9SRFZbIGlkeCBdLmNsZWFyKCk7CisJCQkJCWFSZHZDb25mLT5FRF9NVUxUSVJEVlsgaWR4IF0uY2xlYXIoKTsKKwkJCQl9CisKKwkJCQltdWx0aVJkdkNvbmYuYXBwZW5kKCBhUmR2Q29uZiApOworCisJCQkJYVJkdkNvbmYtPm1Bd2FpdGluZ011bHRpUmR2RURTIFsgaWR4IF0gPSAoKml0RUQpOworCQkJCWFSZHZDb25mLT5tQXdhaXRpbmdNdWx0aVJkdkZsYWdbIGlkeCBdID0gdHJ1ZTsKKworCQkJCWFSZHZDb25mLT5tQXdhaXRpbmdJbnB1dE11bHRpUmR2RmxhZyBbIGlkeCBdID0KKwkJCQkJCSgqaXRFRCktPm1FWEVDX1NZTkNfUE9JTlQtPmlzSW5wdXQoKTsKKworCQkJCWFSZHZDb25mLT5tQXdhaXRpbmdPdXRwdXRNdWx0aVJkdkZsYWdbIGlkeCBdID0KKwkJCQkJCSgqaXRFRCktPm1FWEVDX1NZTkNfUE9JTlQtPmlzT3V0cHV0KCk7CisKKwkJCQlhUmR2Q29uZi0+bVVzZWRNYWNoaW5lRmxhZ1sgaWR4IF0gPSB0cnVlOworCisvLwkJCQlBVk1fT1NfVFJBQ0UgPDwgUkVQRUFUKCIrKysrKysrKysrIiwgMTApIDw8IHN0ZDo6ZW5kbDsKKy8vCQkJCWFSZHZDb25mLT50b1N0cmVhbShBVk1fT1NfVFJBQ0UpOworCQkJfQorCQl9CisJfQorfQorCisKK2Jvb2wgQXZtQ29tbXVuaWNhdGlvblJkdlByaW1pdGl2ZTo6cmVzdW1lX3JkdihMaXN0T2ZBUEV4ZWN1dGlvbkRhdGEgJiBhUkRWKQoreworCS8vIFRSQUNFCitBVk1fSUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX0NPTU1VTklDQVRJT04gKQorCUFWTV9PU19UUkFDRSA8PCBSRVBFQVQoIj09PT09PT09PT0iLCAxMCkgPDwgc3RkOjplbmRsOworCUFWTV9PU19UUkFDRSA8PCAiPT0+IEJFR0lOIiA8PCBzdGQ6OmVuZGw7CisJQVZNX09TX1RSQUNFIDw8IFJFUEVBVCgiPT09PT09PT09PSIsIDEwKSA8PCBzdGQ6OmVuZGw7CisJbUJhc2VSZHZDb25mLnRvU3RyZWFtKEFWTV9PU19UUkFDRSk7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX0NPTU1VTklDQVRJT04gKQorCisJbUVmZmVjdGl2ZVJkdkNvdW50ID0gMDsKKwltRWZmZWN0aXZlTXVsdGlSZHZDb3VudCA9IDA7CisKKwlpZiggY29tcHV0ZUFsbFJkdigpICkKKwl7CisJCWFSRFYuc3BsaWNlKCBSRFYgKTsKKworCQlHTE9CQUxfRUZGRUNUSVZFX1JEVl9DT1VOVCArPSBtRWZmZWN0aXZlUmR2Q291bnQ7CisJCUdMT0JBTF9FRkZFQ1RJVkVfTVVMVElfUkRWX0NPVU5UICs9IG1FZmZlY3RpdmVNdWx0aVJkdkNvdW50OworCitBVk1fSUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX0NPTU1VTklDQVRJT04gKQorCUFWTV9PU19UUkFDRSA8PCBSRVBFQVQoIj09PT09PT09PT0iLCAxMCkgPDwgc3RkOjplbmRsOworCUFWTV9PU19UUkFDRSA8PCAiPT0+IEVORCA6PiBjb3VudCI7CisJaWYoIGNoZWNrUmR2RmxhZyApCisJeworCQlBVk1fT1NfVFJBQ0UgPDwgIiA6IFJEVlsgIiA8PCBtRWZmZWN0aXZlUmR2Q291bnQgPDwgIiBdIjsKKwl9CisJaWYoIGNoZWNrTXVsdGlSZHZGbGFnICkKKwl7CisJCUFWTV9PU19UUkFDRSA8PCAiIDogTVVMVElfUkRWWyAiIDw8IG1FZmZlY3RpdmVNdWx0aVJkdkNvdW50IDw8ICIgXSI7CisJfQorCUFWTV9PU19UUkFDRSA8PCAiICEhISIgPDwgc3RkOjplbmRsOworCUFWTV9PU19UUkFDRSA8PCBSRVBFQVQoIj09PT09PT09PT0iLCAxMCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9DT01NVU5JQ0FUSU9OICkKKworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKK0FWTV9JRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfQ09NTVVOSUNBVElPTiApCisJQVZNX09TX1RSQUNFIDw8IFJFUEVBVCgiPT09PT09PT09PSIsIDEwKSA8PCBzdGQ6OmVuZGw7CisJQVZNX09TX1RSQUNFIDw8ICI9PT4gRU5EIDo+IFJEViBjb3VudCA6IFpFUk8gISEhIiA8PCBzdGQ6OmVuZGw7CisJQVZNX09TX1RSQUNFIDw8IFJFUEVBVCgiPT09PT09PT09PSIsIDEwKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX0NPTU1VTklDQVRJT04gKQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKKworYm9vbCBBdm1Db21tdW5pY2F0aW9uUmR2UHJpbWl0aXZlOjpjb21wdXRlQWxsUmR2KCkKK3sKK0FWTV9JRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfQ09NTVVOSUNBVElPTiApCisJQVZNX09TX1RSQUNFIDw8ICI9PT4gQ0hFQ0sgSU4gSU5JVElBTCIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9DT01NVU5JQ0FUSU9OICkKKworCS8vIENoZWNrIElOSVRJQUwgUkRWCisJaWYoIGNoZWNrUmR2RmxhZyApCisJeworCQlpZiggbm90IGNoZWNrSW50ZXJuYWxSZHYodHJ1ZSwgJm1CYXNlUmR2Q29uZikgKQorCQl7CisJCQkvLyBUT0RPIEVSUkVVUgorCQl9CisJfQorCisJLy8gQ2hlY2sgSU5JVElBTCBNVUxUSSBSRFYKKwlpZiggY2hlY2tNdWx0aVJkdkZsYWcgKQorCXsKKwkJaWYoIG5vdCBjaGVja0ludGVybmFsTXVsdGlSRFYodHJ1ZSwgJm1CYXNlUmR2Q29uZikgKQorCQl7CisJCQkvLyBUT0RPIEVSUkVVUgorCQl9CisJfQorCitBVk1fSUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX0NPTU1VTklDQVRJT04gKQorCUFWTV9PU19JTkZPIDw8ICJmbGFnOj4gIFJkdiA9ICIgPDwgY2hlY2tSZHZGbGFnIDw8ICIgIE11bHRpUmR2ICA9ICIKKwkJCTw8IGNoZWNrTXVsdGlSZHZGbGFnIDw8IHN0ZDo6ZW5kbAorCQkJPDwgImluaXQ6PiAgUmR2ID0gIiA8PCBtRWZmZWN0aXZlUmR2Q291bnQgPDwgIiAgTXVsdGlSZHYgID0gIgorCQkJPDwgbUVmZmVjdGl2ZU11bHRpUmR2Q291bnQgPDwgc3RkOjplbmRsCisJCQk8PCAiTkVYVF9SRFZfQ09ORjo+ICIgPDwgTkVYVF9SRFZfQ09ORi5zaXplKCkgPDwgc3RkOjplbmRsCisJCQk8PCAiY29uZjo+ICIgPDwgSW5zdGFuY2VDb3VudGVyPAorCQkJCQlSZHZDb25maWd1cmF0aW9uRGF0YSA+OjpJTlNUQU5DRV9BTElWRSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX0NPTU1VTklDQVRJT04gKQorCisKKwl3aGlsZSggTkVYVF9SRFZfQ09ORi5ub25lbXB0eSgpICkKKwl7CisJCUNVUlJFTlRfUkRWX0NPTkYuc3BsaWNlKCBORVhUX1JEVl9DT05GICk7CisKKwkJaWYoIG5vdCBjb21wbGV0ZUFsbFJkdigpICkKKwkJeworCQkJLy8gVE9ETyBFUlJFVVIKKwkJfQorCisJCVBSRVZJT1VTX1JEVl9DT05GLnNwbGljZSggQ1VSUkVOVF9SRFZfQ09ORiApOworCitBVk1fSUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX0NPTU1VTklDQVRJT04gKQorCUFWTV9PU19JTkZPIDw8ICJ3aGlsZTo+IFJkdiA9ICIgPDwgbUVmZmVjdGl2ZVJkdkNvdW50IDw8ICIgIE11bHRpUmR2ICA9ICIKKwkJCTw8IG1FZmZlY3RpdmVNdWx0aVJkdkNvdW50IDw8IHN0ZDo6ZW5kbAorCQkJPDwgIk5FWFRfUkRWX0NPTkY6PiAiIDw8IE5FWFRfUkRWX0NPTkYuc2l6ZSgpIDw8IHN0ZDo6ZW5kbAorCQkJPDwgImNvbmY6PiAiIDw8IEluc3RhbmNlQ291bnRlcjwKKwkJCQkJUmR2Q29uZmlndXJhdGlvbkRhdGEgPjo6SU5TVEFOQ0VfQUxJVkUgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9DT01NVU5JQ0FUSU9OICkKKwl9CisKKwlyZXR1cm4oIFJEVi5ub25lbXB0eSgpICk7Cit9CisKKworYm9vbCBBdm1Db21tdW5pY2F0aW9uUmR2UHJpbWl0aXZlOjpjb21wbGV0ZUFsbFJkdigpCit7CisJTGlzdE9mUmR2Q29uZmlndXJhdGlvbkRhdGE6Oml0ZXJhdG9yIGl0UmR2Q29uZjsKKwlMaXN0T2ZSZHZDb25maWd1cmF0aW9uRGF0YTo6aXRlcmF0b3IgZW5kSXRSZHZDb25mID0gQ1VSUkVOVF9SRFZfQ09ORi5lbmQoKTsKKworCUxpc3RPZlJkdkNvbmZpZ3VyYXRpb25EYXRhOjppdGVyYXRvciBpdFJkdkNvbmYyOworCUxpc3RPZlJkdkNvbmZpZ3VyYXRpb25EYXRhOjppdGVyYXRvciBlbmRJdFJkdkNvbmYyID0gUFJFVklPVVNfUkRWX0NPTkYuZW5kKCk7CisKKwlpdFJkdkNvbmYgPSBDVVJSRU5UX1JEVl9DT05GLmJlZ2luKCk7CisJZm9yKCA7IGl0UmR2Q29uZiAhPSBlbmRJdFJkdkNvbmYgOyArKyBpdFJkdkNvbmYgKQorCXsKK0FWTV9JRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfQ09NTVVOSUNBVElPTiApCisJQVZNX09TX1RSQUNFIDw8IHN0ZDo6ZW5kbAorCQkJPDwgImNvbXBsZXRlQWxsUmR2ID09PiBCRUdJTiBDSEVDS0lORyA6PiIgPDwgc3RkOjplbmRsOworCisJKCppdFJkdkNvbmYpLT50b1N0cmVhbShBVk1fT1NfVFJBQ0UpOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9DT01NVU5JQ0FUSU9OICkKKworCQlpZiggKCppdFJkdkNvbmYpLT5oYXNQZXJmb3JtZWRSZHZGbGFnICApCisJCXsKKworQVZNX0lGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9DT01NVU5JQ0FUSU9OICkKKwlBVk1fT1NfVFJBQ0UgPDwgIj09PiBDSEVDSyBJTiBJTlRFUk5BTCIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9DT01NVU5JQ0FUSU9OICkKKworCQkJLy8gQ0hFQ0sgZm9yIElOVEVSTkFMIFJEViBpbiBDVVJSRU5UIENPTkYKKwkJCWlmKCAoKml0UmR2Q29uZiktPmhhc1Bvc3NpYmxlSW50ZXJuYWxSZHZGbGFnICkKKwkJCXsKKwkJCQlpZiggbm90IGNoZWNrSW50ZXJuYWxSZHYoZmFsc2UsICgqaXRSZHZDb25mKSkgKQorCQkJCXsKKwkJCQkJLy8gVE9ETyBFUlJFVVIKKwkJCQl9CisJCQl9CisKKwkJCS8vIENoZWNrIGludGVybmFsIE1VTFRJX1JEVgorCQkJaWYoICgqaXRSZHZDb25mKS0+aGFzUG9zc2libGVJbnRlcm5hbE11bHRpUmR2RmxhZyApCisJCQl7CisJCQkJaWYoIG5vdCBjaGVja0ludGVybmFsTXVsdGlSRFYoZmFsc2UsICppdFJkdkNvbmYpICkKKwkJCQl7CisJCQkJCS8vIFRPRE8gRVJSRVVSCisJCQkJfQorCQkJfQorCisKK0FWTV9JRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfQ09NTVVOSUNBVElPTiApCisJQVZNX09TX1RSQUNFIDw8ICI9PT4gQ0hFQ0sgV0lUSCBJTklUSUFMIiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX0NPTU1VTklDQVRJT04gKQorCisJCQkvLyBDSEVDSyBmb3IgUkRWIHdpdGggSU5JVElBTCBDT05GCisJCQlpZiggY2hlY2tSZHZGbGFnCisJCQkJJiYgKCgqaXRSZHZDb25mKS0+bUF3YWl0aW5nSW5wdXRSZHZGbGFnLmFueSgpCisJCQkJCXx8ICgqaXRSZHZDb25mKS0+bUF3YWl0aW5nT3V0cHV0UmR2RmxhZy5hbnkoKSkKKwkJCQkmJiAoKCgqaXRSZHZDb25mKS0+bUF3YWl0aW5nSW5wdXRSZHZGbGFnIF4KKwkJCQkJCW1CYXNlUmR2Q29uZi5tQXdhaXRpbmdPdXRwdXRSZHZGbGFnKS5hbnkoKQorCQkJCQl8fCAobUJhc2VSZHZDb25mLm1Bd2FpdGluZ0lucHV0UmR2RmxhZyBeCisJCQkJCQkoKml0UmR2Q29uZiktPm1Bd2FpdGluZ091dHB1dFJkdkZsYWcpLmFueSgpKSApCisJCQl7CisJCQkJaWYoIG5vdCBjaGVja1dpdGhJbml0aWFsUmR2KCppdFJkdkNvbmYpICkKKwkJCQl7CisJCQkJCS8vIFRPRE8gRVJSRVVSCisJCQkJfQorCQkJfQorCisJCQlpZiggY2hlY2tNdWx0aVJkdkZsYWcKKwkJCQkmJiAoKml0UmR2Q29uZiktPm1Bd2FpdGluZ011bHRpUmR2RmxhZy5hbnkoKQorCQkJCSYmICgobUJhc2VSZHZDb25mLm1Bd2FpdGluZ091dHB1dFJkdkZsYWcuYW55KCkKKwkJCQkJCSYmICgoKml0UmR2Q29uZiktPm1Bd2FpdGluZ011bHRpUmR2RmxhZyBeCisJCQkJCQkJbUJhc2VSZHZDb25mLm1Bd2FpdGluZ091dHB1dFJkdkZsYWcpLmFueSgpKQorCQkJCQl8fCAobUJhc2VSZHZDb25mLm1Bd2FpdGluZ0lucHV0UmR2RmxhZy5hbnkoKQorCQkJCQkJJiYgKCgqaXRSZHZDb25mKS0+bUF3YWl0aW5nTXVsdGlSZHZGbGFnIF4KKwkJCQkJCQltQmFzZVJkdkNvbmYubUF3YWl0aW5nSW5wdXRSZHZGbGFnKS5hbnkoKSkpICkKKwkJCXsKKwkJCQlpZiggbm90IGNoZWNrV2l0aEluaXRpYWxNdWx0aVJkdigqaXRSZHZDb25mKSApCisJCQkJeworCQkJCQkvLyBUT0RPIEVSUkVVUgorCQkJCX0KKwkJCX0KKwkJfQorCitBVk1fSUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX0NPTU1VTklDQVRJT04gKQorCUFWTV9PU19UUkFDRSA8PCAiPT0+IENIRUNLIFdJVEggRVhURVJOQUwiIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfQ09NTVVOSUNBVElPTiApCisKKwkJLy8gQ0hFQ0sgZm9yIFJEViBiZXR3ZWVuIENVUlJFTlQgQ09ORgorCQlpdFJkdkNvbmYyID0gQ1VSUkVOVF9SRFZfQ09ORi5iZWdpbigpOworCQlmb3IoIDsgaXRSZHZDb25mMiAhPSBlbmRJdFJkdkNvbmYgOyArKyBpdFJkdkNvbmYyICkKKwkJeworCQkJaWYoIGl0UmR2Q29uZiAhPSBpdFJkdkNvbmYyICkKKwkJCXsKKwkJCQlpZiggY2hlY2tSZHZGbGFnCisJCQkJCSYmICgqaXRSZHZDb25mKS0+aGFzUG9zc2libGVFeHRlcm5hbFJkdigqaXRSZHZDb25mMikgKQorCQkJCXsKKwkJCQkJaWYoIG5vdCBjaGVja1dpdGhFeHRlcm5hbFJkdigoKml0UmR2Q29uZiksICgqaXRSZHZDb25mMikpICkKKwkJCQkJeworCQkJCQkJLy8gVE9ETyBFUlJFVVIKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmKCBjaGVja011bHRpUmR2RmxhZyAmJiAoKml0UmR2Q29uZiktPm1Bd2FpdGluZ011bHRpUmR2RmxhZy5hbnkoKQorCQkJCQkmJiAoKml0UmR2Q29uZiktPmhhc1Bvc3NpYmxlRXh0ZXJuYWxNdWx0aVJkdigqaXRSZHZDb25mMikgKQorCQkJCXsKKwkJCQkJaWYoIG5vdCBjaGVja1dpdGhFeHRlcm5hbE11bHRpUmR2KCgqaXRSZHZDb25mKSwgKCppdFJkdkNvbmYyKSkgKQorCQkJCQl7CisJCQkJCQkvLyBUT0RPIEVSUkVVUgorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gQ0hFQ0sgZm9yIFJEViB3aXRoIFBSRVZJT1VTIENPTkYKKwkJaXRSZHZDb25mMiA9IFBSRVZJT1VTX1JEVl9DT05GLmJlZ2luKCk7CisJCWZvciggOyBpdFJkdkNvbmYyICE9IGVuZEl0UmR2Q29uZjIgOyArKyBpdFJkdkNvbmYyICkKKwkJeworCQkJaWYoIGl0UmR2Q29uZiAhPSBpdFJkdkNvbmYyICkKKwkJCXsKKwkJCQlpZiggY2hlY2tSZHZGbGFnICYmICgqaXRSZHZDb25mKS0+aGFzUG9zc2libGVFeHRlcm5hbFJkdigqaXRSZHZDb25mMikgKQorCQkJCXsKKwkJCQkJaWYoIG5vdCBjaGVja1dpdGhFeHRlcm5hbFJkdigoKml0UmR2Q29uZiksICgqaXRSZHZDb25mMikpICkKKwkJCQkJeworCQkJCQkJLy8gVE9ETyBFUlJFVVIKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmKCBjaGVja011bHRpUmR2RmxhZyAmJiAoKml0UmR2Q29uZiktPm1Bd2FpdGluZ011bHRpUmR2RmxhZy5hbnkoKQorCQkJCQkJJiYgKCppdFJkdkNvbmYpLT5oYXNQb3NzaWJsZUV4dGVybmFsTXVsdGlSZHYoKml0UmR2Q29uZjIpICkKKwkJCQl7CisJCQkJCWlmKCBub3QgY2hlY2tXaXRoRXh0ZXJuYWxNdWx0aVJkdigoKml0UmR2Q29uZiksICgqaXRSZHZDb25mMikpICkKKwkJCQkJeworCQkJCQkJLy8gVE9ETyBFUlJFVVIKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKKworYm9vbCBBdm1Db21tdW5pY2F0aW9uUmR2UHJpbWl0aXZlOjpjaGVja0ludGVybmFsUmR2KAorCQlib29sIGlzSW5pdGlhbCwgUmR2Q29uZmlndXJhdGlvbkRhdGEgKiBhUmR2Q29uZikKK3sKKwlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGE6Oml0ZXJhdG9yIGl0T3V0RUQ7CisJTGlzdE9mQVBFeGVjdXRpb25EYXRhOjppdGVyYXRvciBlbmRPdXRFRDsKKworCUxpc3RPZkFQRXhlY3V0aW9uRGF0YTo6aXRlcmF0b3IgaXRJbkVEOworCUxpc3RPZkFQRXhlY3V0aW9uRGF0YTo6aXRlcmF0b3IgZW5kSW5FRDsKKworCVJkdkNvbmZpZ3VyYXRpb25EYXRhICogbmV3UmR2Q29uZiA9IE5VTEw7CisKKwlmb3IoIGF2bV9zaXplX3Qgb3V0SWR4ID0gMCA7IG91dElkeCA8IGFSZHZDb25mLT5tTWFjaGluZUNvdW50OyArK291dElkeCApCisJeworCQlpZiggYVJkdkNvbmYtPk9VVF9FRF9SRFZbIG91dElkeCBdLmVtcHR5KCkgKQorCQl7CisJCQljb250aW51ZTsKKwkJfQorCisJCWl0T3V0RUQgPSBhUmR2Q29uZi0+T1VUX0VEX1JEVlsgb3V0SWR4IF0uYmVnaW4oKTsKKwkJZW5kT3V0RUQgPSBhUmR2Q29uZi0+T1VUX0VEX1JEVlsgb3V0SWR4IF0uZW5kKCk7CisJCWZvciggOyBpdE91dEVEICE9IGVuZE91dEVEIDsgKytpdE91dEVEICkKKwkJeworCQkJZm9yKCBhdm1fc2l6ZV90IGluSWR4ID0gMCA7IGluSWR4IDwgYVJkdkNvbmYtPm1NYWNoaW5lQ291bnQgOyArK2luSWR4ICkKKwkJCXsKKwkJCQlpZiggKGluSWR4ID09IG91dElkeCkgfHwgYVJkdkNvbmYtPklOX0VEX1JEVlsgaW5JZHggXS5lbXB0eSgpICkKKwkJCQl7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCWl0SW5FRCA9IGFSZHZDb25mLT5JTl9FRF9SRFZbIGluSWR4IF0uYmVnaW4oKTsKKwkJCQllbmRJbkVEID0gYVJkdkNvbmYtPklOX0VEX1JEVlsgaW5JZHggXS5lbmQoKTsKKwkJCQlmb3IoIDsgaXRJbkVEICE9IGVuZEluRUQgOyArK2l0SW5FRCApCisJCQkJeworCQkJCQlpZiggaGF2ZVJEVigoKml0T3V0RUQpLCAoKml0SW5FRCkpICkKKwkJCQkJeworCQkJCQkJaWYoIGlzSW5pdGlhbCApCisJCQkJCQl7CisJCQkJCQkJbmV3UmR2Q29uZiA9IG5ldyBSZHZDb25maWd1cmF0aW9uRGF0YSggYVJkdkNvbmYgKTsKKworCQkJCQkJCW5ld1JkdkNvbmYtPm1Vc2VkTWFjaGluZUZsYWdbIG91dElkeCBdID0gdHJ1ZTsKKwkJCQkJCQluZXdSZHZDb25mLT5tVXNlZE1hY2hpbmVGbGFnWyBpbklkeCAgXSA9IHRydWU7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJbmV3UmR2Q29uZiA9IG5ldyBSZHZDb25maWd1cmF0aW9uRGF0YSggKmFSZHZDb25mICk7CisKKwkJCQkJCQluZXdSZHZDb25mLT5JTl9FRF9SRFZbIGluSWR4IF0uY2xlYXIoKTsKKwkJCQkJCQluZXdSZHZDb25mLT5PVVRfRURfUkRWWyBvdXRJZHggXS5jbGVhcigpOworCisJCQkJCQkJbmV3UmR2Q29uZi0+RURfTVVMVElSRFZbIGluSWR4IF0uY2xlYXIoKTsKKwkJCQkJCX0KKworCQkJCQkJbmV3UmR2Q29uZi0+bUF3YWl0aW5nSW5wdXRSZHZGbGFnWyBvdXRJZHggXSA9IGZhbHNlOworCQkJCQkJbmV3UmR2Q29uZi0+bUF3YWl0aW5nT3V0cHV0UmR2RmxhZ1sgaW5JZHggXSA9IGZhbHNlOworCisvLwkJCQkJCW5ld1JkdkNvbmYtPnVwZGF0ZVBvc3NpYmxlSW50ZXJuYWxSZHZGbGFnKCk7CisvLwkJCQkJCW5ld1JkdkNvbmYtPnVwZGF0ZVBvc3NpYmxlSW50ZXJuYWxNdWx0aVJkdkZsYWcoKTsKKworCQkJCQkJaWYoIGNvbXB1dGVfcmR2KG5ld1JkdkNvbmYsCisJCQkJCQkJCW91dElkeCwgKCppdE91dEVEKSwgaW5JZHgsICgqaXRJbkVEKSkgKQorCQkJCQkJeworCQkJCQkJCWNvbXBsZXRlX3JkdihuZXdSZHZDb25mKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQkvLyBUT0RPIEVSUkVVUgorCQkJCQkJCWRlbGV0ZSggbmV3UmR2Q29uZiApOworCQkJCQkJCW5ld1JkdkNvbmYgPSBOVUxMOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworYm9vbCBBdm1Db21tdW5pY2F0aW9uUmR2UHJpbWl0aXZlOjpjaGVja0ludGVybmFsTXVsdGlSRFYoCisJCWJvb2wgaXNJbml0aWFsLCBSZHZDb25maWd1cmF0aW9uRGF0YSAqIGFSZHZDb25mKQoreworCUxpc3RPZlJkdkNvbmZpZ3VyYXRpb25EYXRhIG11bHRpUmR2Q29uZjsKKworQVZNX0lGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9DT01NVU5JQ0FUSU9OICkKKwlBVk1fT1NfSU5GTyA8PCAiY2hlY2tJbnRlcm5hbE11bHRpUkRWOj4gIgorCQkJPDwgSW5zdGFuY2VDb3VudGVyPCBSZHZDb25maWd1cmF0aW9uRGF0YSA+OjpJTlNUQU5DRV9BTElWRQorCQkJPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9DT01NVU5JQ0FUSU9OICkKKworCWZvciggYXZtX3NpemVfdCBpZHggPSAwIDsgaWR4IDwgYVJkdkNvbmYtPm1NYWNoaW5lQ291bnQ7ICsraWR4ICkKKwl7CisJCWFkZFJ2ZENvbmYoaXNJbml0aWFsLCBtdWx0aVJkdkNvbmYsCisJCQkJYVJkdkNvbmYsIGlkeCwgYVJkdkNvbmYtPkVEX01VTFRJUkRWW2lkeF0pOworCitBVk1fSUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX0NPTU1VTklDQVRJT04gKQorCUFWTV9PU19JTkZPIDw8ICJjaGVja0ludGVybmFsTXVsdGlSRFY6IiA8PCBpZHggPDwgIj4gIgorCQkJPDwgSW5zdGFuY2VDb3VudGVyPCBSZHZDb25maWd1cmF0aW9uRGF0YSA+OjpJTlNUQU5DRV9BTElWRQorCQkJPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9DT01NVU5JQ0FUSU9OICkKKwl9CisKKwlpZiggbm90IGNvbXB1dGVfbXVsdGlyZHYobXVsdGlSZHZDb25mKSApCisJeworCQkvLyBUT0RPIEVSUkVVUgorCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKKworCitib29sIEF2bUNvbW11bmljYXRpb25SZHZQcmltaXRpdmU6OmNoZWNrV2l0aEluaXRpYWxSZHYoCisJCVJkdkNvbmZpZ3VyYXRpb25EYXRhICogYVJkdkNvbmYpCit7CisJTGlzdE9mQVBFeGVjdXRpb25EYXRhOjppdGVyYXRvciBpdEluRUQ7CisJTGlzdE9mQVBFeGVjdXRpb25EYXRhOjppdGVyYXRvciBlbmRJbkVEOworCisJTGlzdE9mQVBFeGVjdXRpb25EYXRhOjppdGVyYXRvciBpdE91dEVEOworCUxpc3RPZkFQRXhlY3V0aW9uRGF0YTo6aXRlcmF0b3IgZW5kT3V0RUQ7CisKKwlSZHZDb25maWd1cmF0aW9uRGF0YSAqIG5ld1JkdkNvbmYgPSBOVUxMOworCisJYXZtX3NpemVfdCBvdXRJZHggPSAwOworCWF2bV9zaXplX3QgaW5JZHggPSAwOworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIENPTVBMRVRFIE9VVFBVVCBXSVRIIElOSVRJQUwgSU5QVVQKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJaWYoIGFSZHZDb25mLT5tQXdhaXRpbmdJbnB1dFJkdkZsYWcuYW55KCkKKwkJJiYgbUJhc2VSZHZDb25mLm1Bd2FpdGluZ091dHB1dFJkdkZsYWcuYW55KCkgKQorCXsKKwkJZm9yKCBpbklkeCA9IDAgOyBpbklkeCA8IGFSZHZDb25mLT5tTWFjaGluZUNvdW50IDsgKytpbklkeCApCisJCXsKKwkJCWlmKCBtQmFzZVJkdkNvbmYuSU5fRURfUkRWWyBpbklkeCBdLmVtcHR5KCkKKwkJCQl8fCBhUmR2Q29uZi0+bVVzZWRNYWNoaW5lRmxhZ1sgaW5JZHggXSApCisJCQl7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWl0SW5FRCA9IG1CYXNlUmR2Q29uZi5JTl9FRF9SRFZbIGluSWR4IF0uYmVnaW4oKTsKKwkJCWVuZEluRUQgPSBtQmFzZVJkdkNvbmYuSU5fRURfUkRWWyBpbklkeCBdLmVuZCgpOworCQkJZm9yKCA7IGl0SW5FRCAhPSBlbmRJbkVEIDsgKytpdEluRUQgKQorCQkJeworCQkJCWZvciggb3V0SWR4ID0gMCA7IChvdXRJZHggPCBhUmR2Q29uZi0+bU1hY2hpbmVDb3VudCkgOyArK291dElkeCApCisJCQkJeworCQkJCQlpZiggKGluSWR4ID09IG91dElkeCkKKwkJCQkJCXx8IGFSZHZDb25mLT5PVVRfRURfUkRWWyBvdXRJZHggXS5lbXB0eSgpICkKKwkJCQkJeworCQkJCQkJY29udGludWU7CisJCQkJCX0KKworCQkJCQlpdE91dEVEID0gYVJkdkNvbmYtPk9VVF9FRF9SRFZbIG91dElkeCBdLmJlZ2luKCk7CisJCQkJCWVuZE91dEVEID0gYVJkdkNvbmYtPk9VVF9FRF9SRFZbIG91dElkeCBdLmVuZCgpOworCQkJCQlmb3IoIDsgaXRPdXRFRCAhPSBlbmRPdXRFRCA7ICsraXRPdXRFRCApCisJCQkJCXsKKwkJCQkJCWlmKCBoYXZlUkRWKCgqaXRPdXRFRCksICgqaXRJbkVEKSkgKQorCQkJCQkJeworCQkJCQkJCW5ld1JkdkNvbmYgPSBuZXcgUmR2Q29uZmlndXJhdGlvbkRhdGEoICphUmR2Q29uZiApOworCisJCQkJCQkJbmV3UmR2Q29uZi0+SU5fRURfUkRWWyBpbklkeCBdLmNsZWFyKCk7CisJCQkJCQkJbmV3UmR2Q29uZi0+T1VUX0VEX1JEVlsgb3V0SWR4IF0uY2xlYXIoKTsKKwkJCQkJCQluZXdSZHZDb25mLT5FRF9NVUxUSVJEVlsgaW5JZHggXS5jbGVhcigpOworCisJCQkJCQkJbmV3UmR2Q29uZi0+bUF3YWl0aW5nSW5wdXRSZHZGbGFnWyBvdXRJZHggXSA9IGZhbHNlOworCQkJCQkJCW5ld1JkdkNvbmYtPm1Bd2FpdGluZ091dHB1dFJkdkZsYWdbIGluSWR4IF0gPSBmYWxzZTsKKworCQkJCQkJCW5ld1JkdkNvbmYtPm1Vc2VkTWFjaGluZUZsYWdbIGluSWR4ICBdID0gdHJ1ZTsKKworCQkJCQkJCWlmKCBjb21wdXRlX3JkdihuZXdSZHZDb25mLAorCQkJCQkJCQkJb3V0SWR4LCAoKml0T3V0RUQpLCBpbklkeCwgKCppdEluRUQpKSApCisJCQkJCQkJeworCQkJCQkJCQljb21wbGV0ZV9yZHYobmV3UmR2Q29uZik7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCS8vIFRPRE8gRVJSRVVSCisJCQkJCQkJCWRlbGV0ZSggbmV3UmR2Q29uZiApOworCQkJCQkJCQluZXdSZHZDb25mID0gTlVMTDsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQ09NUExFVEUgSU5QVVQgV0lUSCBJTklUSUFMIE9VVFBVVAorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwlpZiggYVJkdkNvbmYtPm1Bd2FpdGluZ091dHB1dFJkdkZsYWcuYW55KCkKKwkJJiYgbUJhc2VSZHZDb25mLm1Bd2FpdGluZ0lucHV0UmR2RmxhZy5hbnkoKSkKKwl7CisJCWZvciggb3V0SWR4ID0gMCA7IChvdXRJZHggPCBhUmR2Q29uZi0+bU1hY2hpbmVDb3VudCkgOyArK291dElkeCApCisJCXsKKwkJCWlmKCBtQmFzZVJkdkNvbmYuT1VUX0VEX1JEVlsgb3V0SWR4IF0uZW1wdHkoKQorCQkJCXx8IGFSZHZDb25mLT5tVXNlZE1hY2hpbmVGbGFnWyBvdXRJZHggXSApCisJCQl7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWl0T3V0RUQgPSBtQmFzZVJkdkNvbmYuT1VUX0VEX1JEVlsgb3V0SWR4IF0uYmVnaW4oKTsKKwkJCWVuZE91dEVEID0gbUJhc2VSZHZDb25mLk9VVF9FRF9SRFZbIG91dElkeCBdLmVuZCgpOworCQkJZm9yKCA7IGl0T3V0RUQgIT0gZW5kT3V0RUQgOyArK2l0T3V0RUQgKQorCQkJeworCQkJCWZvciggaW5JZHggPSAwIDsgaW5JZHggPCBhUmR2Q29uZi0+bU1hY2hpbmVDb3VudCA7ICsraW5JZHggKQorCQkJCXsKKwkJCQkJaWYoIChpbklkeCA9PSBvdXRJZHgpIHx8IGFSZHZDb25mLT5JTl9FRF9SRFZbIGluSWR4IF0uZW1wdHkoKSApCisJCQkJCXsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisKKwkJCQkJaXRJbkVEID0gYVJkdkNvbmYtPklOX0VEX1JEVlsgaW5JZHggXS5iZWdpbigpOworCQkJCQllbmRJbkVEID0gYVJkdkNvbmYtPklOX0VEX1JEVlsgaW5JZHggXS5lbmQoKTsKKwkJCQkJZm9yKCA7IGl0SW5FRCAhPSBlbmRJbkVEIDsgKytpdEluRUQgKQorCQkJCQl7CisJCQkJCQlpZiggaGF2ZVJEVigoKml0T3V0RUQpLCAoKml0SW5FRCkpICkKKwkJCQkJCXsKKwkJCQkJCQluZXdSZHZDb25mID0gbmV3IFJkdkNvbmZpZ3VyYXRpb25EYXRhKCAqYVJkdkNvbmYgKTsKKworCQkJCQkJCW5ld1JkdkNvbmYtPklOX0VEX1JEVlsgaW5JZHggXS5jbGVhcigpOworCQkJCQkJCW5ld1JkdkNvbmYtPk9VVF9FRF9SRFZbIG91dElkeCBdLmNsZWFyKCk7CisJCQkJCQkJbmV3UmR2Q29uZi0+RURfTVVMVElSRFZbIGluSWR4IF0uY2xlYXIoKTsKKworCQkJCQkJCW5ld1JkdkNvbmYtPm1Bd2FpdGluZ0lucHV0UmR2RmxhZ1sgb3V0SWR4IF0gPSBmYWxzZTsKKwkJCQkJCQluZXdSZHZDb25mLT5tQXdhaXRpbmdPdXRwdXRSZHZGbGFnWyBpbklkeCBdID0gZmFsc2U7CisKKwkJCQkJCQluZXdSZHZDb25mLT5tVXNlZE1hY2hpbmVGbGFnWyBvdXRJZHggXSA9IHRydWU7CisKKwkJCQkJCQlpZiggbm90IGNvbXB1dGVfcmR2KG5ld1JkdkNvbmYsCisJCQkJCQkJCQlvdXRJZHgsICgqaXRPdXRFRCksIGluSWR4LCAoKml0SW5FRCkpICkKKwkJCQkJCQl7CisJCQkJCQkJCS8vIFRPRE8gRVJSRVVSCisJCQkJCQkJfQorCisJCQkJCQkJY29tcGxldGVfcmR2KG5ld1JkdkNvbmYpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworYm9vbCBBdm1Db21tdW5pY2F0aW9uUmR2UHJpbWl0aXZlOjpjaGVja1dpdGhJbml0aWFsTXVsdGlSZHYoCisJCVJkdkNvbmZpZ3VyYXRpb25EYXRhICogYVJkdkNvbmYpCit7CisJTGlzdE9mUmR2Q29uZmlndXJhdGlvbkRhdGEgbXVsdGlSZHZDb25mOworCisvLwkoKCppdFJkdkNvbmYpLT5tQXdhaXRpbmdNdWx0aVJkdkZsYWcgXiBtQmFzZVJkdkNvbmYubUF3YWl0aW5nT3V0cHV0UmR2RmxhZykuYW55KCkgfHwKKy8vCSgoKml0UmR2Q29uZiktPm1Bd2FpdGluZ011bHRpUmR2RmxhZyBeIG1CYXNlUmR2Q29uZi5tQXdhaXRpbmdJbnB1dFJkdkZsYWcpLmFueSgpCisKKwlmb3IoIGF2bV9zaXplX3QgaWR4ID0gMCA7IGlkeCA8IGFSZHZDb25mLT5tTWFjaGluZUNvdW50OyArK2lkeCApCisJeworCQlpZiggbm90IGFSZHZDb25mLT5tQXdhaXRpbmdNdWx0aVJkdkZsYWdbIGlkeCBdICkKKwkJeworCQkJYWRkUnZkQ29uZihmYWxzZSwgbXVsdGlSZHZDb25mLAorCQkJCQlhUmR2Q29uZiwgaWR4LCBtQmFzZVJkdkNvbmYuRURfTVVMVElSRFZbaWR4XSk7CisJCX0KKwl9CisKKwlpZiggbm90IGNvbXB1dGVfbXVsdGlyZHYobXVsdGlSZHZDb25mKSApCisJeworCQkvLyBUT0RPIEVSUkVVUgorCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKKworYm9vbCBBdm1Db21tdW5pY2F0aW9uUmR2UHJpbWl0aXZlOjpjaGVja1dpdGhFeHRlcm5hbFJkdigKKwkJUmR2Q29uZmlndXJhdGlvbkRhdGEgKiBhUmR2Q29uZiwgUmR2Q29uZmlndXJhdGlvbkRhdGEgKiBvdGhlclJkdkNvbmYpCit7CisJTGlzdE9mQVBFeGVjdXRpb25EYXRhOjppdGVyYXRvciBpdEluRUQ7CisJTGlzdE9mQVBFeGVjdXRpb25EYXRhOjppdGVyYXRvciBlbmRJbkVEOworCisJTGlzdE9mQVBFeGVjdXRpb25EYXRhOjppdGVyYXRvciBpdE91dEVEOworCUxpc3RPZkFQRXhlY3V0aW9uRGF0YTo6aXRlcmF0b3IgZW5kT3V0RUQ7CisKKwlSZHZDb25maWd1cmF0aW9uRGF0YSAqIG5ld1JkdkNvbmYgPSBOVUxMOworCisJYXZtX3NpemVfdCBvdXRJZHggPSAwOworCWF2bV9zaXplX3QgaW5JZHggPSAwOworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIENPTVBMRVRFIE9VVFBVVCBXSVRIIE9USEVSIElOQ09NUExFVEUgUkRWX0NPTkYgSU5QVVQKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJaWYoIGFSZHZDb25mLT5tQXdhaXRpbmdJbnB1dFJkdkZsYWcuYW55KCkKKwkJJiYgb3RoZXJSZHZDb25mLT5tQXdhaXRpbmdPdXRwdXRSZHZGbGFnLmFueSgpKQorCXsKKwkJZm9yKCBvdXRJZHggPSAwIDsgb3V0SWR4IDwgYVJkdkNvbmYtPm1NYWNoaW5lQ291bnQgOyArK291dElkeCApCisJCXsKKwkJCWlmKCBvdGhlclJkdkNvbmYtPklOX0VEX1JEVlsgaW5JZHggXS5lbXB0eSgpCisJCQkJfHwgYVJkdkNvbmYtPm1Vc2VkTWFjaGluZUZsYWdbIGluSWR4IF0gKQorCQkJeworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpdEluRUQgPSBvdGhlclJkdkNvbmYtPklOX0VEX1JEVlsgaW5JZHggXS5iZWdpbigpOworCQkJZW5kSW5FRCA9IG90aGVyUmR2Q29uZi0+SU5fRURfUkRWWyBpbklkeCBdLmVuZCgpOworCQkJZm9yKCA7IGl0SW5FRCAhPSBlbmRJbkVEIDsgKytpdEluRUQgKQorCQkJeworCQkJCWZvciggb3V0SWR4ID0gMCA7IChvdXRJZHggPCBhUmR2Q29uZi0+bU1hY2hpbmVDb3VudCkgOyArK291dElkeCApCisJCQkJeworCQkJCQlpZiggKGluSWR4ID09IG91dElkeCkgfHwgYVJkdkNvbmYtPk9VVF9FRF9SRFZbIG91dElkeCBdLmVtcHR5KCkgKQorCQkJCQl7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCisJCQkJCWl0T3V0RUQgPSBhUmR2Q29uZi0+T1VUX0VEX1JEVlsgb3V0SWR4IF0uYmVnaW4oKTsKKwkJCQkJZW5kT3V0RUQgPSBhUmR2Q29uZi0+T1VUX0VEX1JEVlsgb3V0SWR4IF0uZW5kKCk7CisJCQkJCWZvciggOyBpdE91dEVEICE9IGVuZE91dEVEIDsgKytpdE91dEVEICkKKwkJCQkJeworCQkJCQkJaWYoIGhhdmVSRFYoKCppdE91dEVEKSwgKCppdEluRUQpKSApCisJCQkJCQl7CisJCQkJCQkJbmV3UmR2Q29uZiA9IGFSZHZDb25mLT5mdXNpb24oIG90aGVyUmR2Q29uZiApOworCisJCQkJCQkJbmV3UmR2Q29uZi0+SU5fRURfUkRWWyBpbklkeCBdLmNsZWFyKCk7CisJCQkJCQkJbmV3UmR2Q29uZi0+T1VUX0VEX1JEVlsgb3V0SWR4IF0uY2xlYXIoKTsKKwkJCQkJCQluZXdSZHZDb25mLT5FRF9NVUxUSVJEVlsgaW5JZHggXS5jbGVhcigpOworCisJCQkJCQkJbmV3UmR2Q29uZi0+bUF3YWl0aW5nSW5wdXRSZHZGbGFnWyBvdXRJZHggXSA9IGZhbHNlOworCQkJCQkJCW5ld1JkdkNvbmYtPm1Bd2FpdGluZ091dHB1dFJkdkZsYWdbIGluSWR4IF0gPSBmYWxzZTsKKworCQkJCQkJCW5ld1JkdkNvbmYtPm1Vc2VkTWFjaGluZUZsYWdbIGluSWR4IF0gPSB0cnVlOworCisJCQkJCQkJaWYoIGNvbXB1dGVfcmR2KG5ld1JkdkNvbmYsCisJCQkJCQkJCQlvdXRJZHgsICgqaXRPdXRFRCksIGluSWR4LCAoKml0SW5FRCkpICkKKwkJCQkJCQl7CisJCQkJCQkJCWNvbXBsZXRlX3JkdihuZXdSZHZDb25mKTsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZQorCQkJCQkJCXsKKwkJCQkJCQkJLy8gVE9ETyBFUlJFVVIKKwkJCQkJCQkJZGVsZXRlKCBuZXdSZHZDb25mICk7CisJCQkJCQkJCW5ld1JkdkNvbmYgPSBOVUxMOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBDT01QTEVURSBJTlBVVCBXSVRIIE9USEVSIElOQ09NUExFVEUgUkRWX0NPTkYgT1VUUFVUCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCWlmKCBhUmR2Q29uZi0+bUF3YWl0aW5nT3V0cHV0UmR2RmxhZy5hbnkoKQorCQkmJiBvdGhlclJkdkNvbmYtPm1Bd2FpdGluZ0lucHV0UmR2RmxhZy5hbnkoKSkKKwl7CisJCWZvciggb3V0SWR4ID0gMCA7IChvdXRJZHggPCBhUmR2Q29uZi0+bU1hY2hpbmVDb3VudCkgOyArK291dElkeCApCisJCXsKKwkJCWlmKCBvdGhlclJkdkNvbmYtPk9VVF9FRF9SRFZbIG91dElkeCBdLmVtcHR5KCkKKwkJCQl8fCBhUmR2Q29uZi0+bVVzZWRNYWNoaW5lRmxhZ1sgb3V0SWR4IF0gKQorCQkJeworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpdE91dEVEID0gb3RoZXJSZHZDb25mLT5PVVRfRURfUkRWWyBvdXRJZHggXS5iZWdpbigpOworCQkJZW5kT3V0RUQgPSBvdGhlclJkdkNvbmYtPk9VVF9FRF9SRFZbIG91dElkeCBdLmVuZCgpOworCQkJZm9yKCA7IGl0T3V0RUQgIT0gZW5kT3V0RUQgOyArK2l0T3V0RUQgKQorCQkJeworCQkJCWlmKCBub3QgKCppdE91dEVEKS0+bUVYRUNfU1lOQ19QT0lOVC0+bVJvdXRpbmdEYXRhLmlzUHJvdG9jb2xSRFYoKSApCisJCQkJeworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlmb3IoIGluSWR4ID0gMCA7IGluSWR4IDwgYVJkdkNvbmYtPm1NYWNoaW5lQ291bnQgOyArK2luSWR4ICkKKwkJCQl7CisJCQkJCWlmKCAoaW5JZHggPT0gb3V0SWR4KSB8fCBhUmR2Q29uZi0+SU5fRURfUkRWWyBpbklkeCBdLmVtcHR5KCkgKQorCQkJCQl7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCisJCQkJCWl0SW5FRCA9IGFSZHZDb25mLT5JTl9FRF9SRFZbIGluSWR4IF0uYmVnaW4oKTsKKwkJCQkJZW5kSW5FRCA9IGFSZHZDb25mLT5JTl9FRF9SRFZbIGluSWR4IF0uZW5kKCk7CisJCQkJCWZvciggOyBpdEluRUQgIT0gZW5kSW5FRCA7ICsraXRJbkVEICkKKwkJCQkJeworCQkJCQkJaWYoIGhhdmVSRFYoKCppdE91dEVEKSwgKCppdEluRUQpKSApCisJCQkJCQl7CisJCQkJCQkJbmV3UmR2Q29uZiA9IGFSZHZDb25mLT5mdXNpb24oIG90aGVyUmR2Q29uZiApOworCisJCQkJCQkJbmV3UmR2Q29uZi0+SU5fRURfUkRWWyBpbklkeCBdLmNsZWFyKCk7CisJCQkJCQkJbmV3UmR2Q29uZi0+T1VUX0VEX1JEVlsgb3V0SWR4IF0uY2xlYXIoKTsKKwkJCQkJCQluZXdSZHZDb25mLT5FRF9NVUxUSVJEVlsgaW5JZHggXS5jbGVhcigpOworCisJCQkJCQkJbmV3UmR2Q29uZi0+bUF3YWl0aW5nSW5wdXRSZHZGbGFnWyBvdXRJZHggXSA9IGZhbHNlOworCQkJCQkJCW5ld1JkdkNvbmYtPm1Bd2FpdGluZ091dHB1dFJkdkZsYWdbIGluSWR4IF0gPSBmYWxzZTsKKworCQkJCQkJCW5ld1JkdkNvbmYtPm1Vc2VkTWFjaGluZUZsYWdbIG91dElkeCBdID0gdHJ1ZTsKKworCQkJCQkJCWlmKCBub3QgY29tcHV0ZV9yZHYobmV3UmR2Q29uZiwKKwkJCQkJCQkJCW91dElkeCwgKCppdE91dEVEKSwgaW5JZHgsICgqaXRJbkVEKSkgKQorCQkJCQkJCXsKKwkJCQkJCQkJLy8gVE9ETyBFUlJFVVIKKwkJCQkJCQl9CisKKwkJCQkJCQljb21wbGV0ZV9yZHYobmV3UmR2Q29uZik7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCitib29sIEF2bUNvbW11bmljYXRpb25SZHZQcmltaXRpdmU6OmNoZWNrV2l0aEV4dGVybmFsTXVsdGlSZHYoCisJCVJkdkNvbmZpZ3VyYXRpb25EYXRhICogYVJkdkNvbmYsCisJCVJkdkNvbmZpZ3VyYXRpb25EYXRhICogb3RoZXJSZHZDb25mKQoreworCVZlY3Rvck9mQVBFeGVjdXRpb25EYXRhOjppdGVyYXRvciBpdEVEOworCVZlY3Rvck9mQVBFeGVjdXRpb25EYXRhOjppdGVyYXRvciBlbmRFRDsKKworCUxpc3RPZkFQRXhlY3V0aW9uRGF0YTo6aXRlcmF0b3IgZW5kaW9FRDsKKworCUxpc3RPZlJkdkNvbmZpZ3VyYXRpb25EYXRhIG11bHRpUmR2Q29uZjsKKworCWZvciggYXZtX3NpemVfdCBpZHggPSAwIDsgaWR4IDwgYVJkdkNvbmYtPm1NYWNoaW5lQ291bnQ7ICsraWR4ICkKKwl7CisJCWlmKCBub3Qgb3RoZXJSZHZDb25mLT5tQXdhaXRpbmdNdWx0aVJkdkZsYWdbIGlkeCBdICkKKwkJeworCQkJaWYoIGFSZHZDb25mLT5tQXdhaXRpbmdNdWx0aVJkdkZsYWcuYW55KCkgKQorCQkJeworCQkJCUxpc3RPZkFQRXhlY3V0aW9uRGF0YSBsaXN0RUQ7CisKKwkJCQlpdEVEID0gYVJkdkNvbmYtPm1Bd2FpdGluZ011bHRpUmR2RURTLmJlZ2luKCk7CisJCQkJZW5kRUQgPSBhUmR2Q29uZi0+bUF3YWl0aW5nTXVsdGlSZHZFRFMuZW5kKCk7CisJCQkJZm9yKCA7IGl0RUQgIT0gZW5kRUQgOyArK2l0RUQgKQorCQkJCXsKKwkJCQkJaWYoICgqaXRFRCkudmFsaWQoKSApCisJCQkJCXsKKwkJCQkJCWxpc3RFRC5hcHBlbmQoICppdEVEICk7CisJCQkJCX0KKworCQkJCX0KKwkJCQlhZGRSdmRDb25mKGZhbHNlLCBtdWx0aVJkdkNvbmYsIG90aGVyUmR2Q29uZiwgaWR4LCBsaXN0RUQpOworCisJCQl9CisJCQlhZGRSdmRDb25mKGZhbHNlLCBtdWx0aVJkdkNvbmYsCisJCQkJCW90aGVyUmR2Q29uZiwgaWR4LCBhUmR2Q29uZi0+RURfTVVMVElSRFZbaWR4XSk7CisJCX0KK30KKworCWlmKCBub3QgY29tcHV0ZV9tdWx0aXJkdihtdWx0aVJkdkNvbmYpICkKKwl7CisJCS8vIFRPRE8gRVJSRVVSCisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworCisKK2Jvb2wgQXZtQ29tbXVuaWNhdGlvblJkdlByaW1pdGl2ZTo6cmVzdW1lX3JkdihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOViwKKwkJUmR2Q29uZmlndXJhdGlvbkRhdGEgKiBhUmR2Q29uZiwgYXZtX29mZnNldF90IG9mZnNldCkKK3sKKwlpZiggbm90IHJlc3VtZV9yZHYoRU5WKSApCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJQVBFeGVjdXRpb25EYXRhIHRtcEVEOworCisJd2hpbGUoIEVOVi5vdXRFRFMubm9uZW1wdHkoKSApCisJeworCQlFTlYub3V0RURTLnBvcF9sYXN0X3RvKCB0bXBFRCApOworCisJCXN3aXRjaCggdG1wRUQtPmdldEFFRVMoKSApCisJCXsKKwkJCWNhc2UgQUVFU19PSzoKKwkJCWNhc2UgQUVFU19TVE1OVF9OT1RISU5HOgorCQkJY2FzZSBBRUVTX1NUTU5UX1JFVFVSTjoKKwkJCXsKKwkJCQlhUmR2Q29uZi0+UkRWU1sgb2Zmc2V0IF0uYXBwZW5kKCB0bXBFRCApOworCQkJCWJyZWFrOworCQkJfQorCisJCQlkZWZhdWx0OgorCQkJeworCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQk8PCAiVW5leHBlY3RlZCBFTkRJTkQgRVhFQ1VUSU9OIFNUQVRVUyBhcyBvdXRFRFMgOj4gIgorCQkJCQkJPDwgUnVudGltZURlZjo6c3RyQUVFUyggdG1wRUQtPm1BRUVTICkgPDwgIiAhISEiCisJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQl9CisJCX0KKwl9CisKKwl3aGlsZSggRU5WLmV4aXRFRFMubm9uZW1wdHkoKSApCisJeworCQlFTlYuZXhpdEVEUy5wb3BfbGFzdF90byggdG1wRUQgKTsKKworCQlzd2l0Y2goIHRtcEVELT5nZXRBRUVTKCkgKQorCQl7CisJCQljYXNlIEFFRVNfU1RNTlRfRVhJVDoKKwkJCWNhc2UgQUVFU19TVE1OVF9FWElUX0FMTDoKKwkJCWNhc2UgQUVFU19TVE1OVF9GQVRBTF9FUlJPUjoKKwkJCWNhc2UgQUVFU19TWU1CT0xJQ19FWEVDVVRJT05fTElNSVRBVElPTjoKKwkJCXsKKwkJCQlhUmR2Q29uZi0+UkRWU1sgb2Zmc2V0IF0uYXBwZW5kKCB0bXBFRCApOworCQkJCWJyZWFrOworCQkJfQorCisJCQlkZWZhdWx0OgorCQkJeworCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQk8PCAiVW5leHBlY3RlZCBFTkRJTkQgRVhFQ1VUSU9OIFNUQVRVUyBhcyBleGl0RURTIDo+ICIKKwkJCQkJCTw8IFJ1bnRpbWVEZWY6OnN0ckFFRVMoIHRtcEVELT5tQUVFUyApIDw8ICIgISEhIgorCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJfQorCQl9CisJfQorCisJd2hpbGUoIEVOVi5zeW5jRURTLm5vbmVtcHR5KCkgKQorCXsKKwkJRU5WLnN5bmNFRFMucG9wX2xhc3RfdG8oIHRtcEVEICk7CisKKwkJc3dpdGNoKCB0bXBFRC0+Z2V0QUVFUygpICkKKwkJeworCQkJY2FzZSBBRUVTX1dBSVRJTkdfSU5DT01fUkRWOgorCQkJeworCQkJCWlmKCB0bXBFRC0+bUVYRUNfU1lOQ19QT0lOVC0+bVJvdXRpbmdEYXRhLmlzUHJvdG9jb2xSRFYoKSApCisJCQkJeworCQkJCQlhUmR2Q29uZi0+SU5fRURfUkRWWyBvZmZzZXQgXS5hcHBlbmQoIHRtcEVEICk7CisJCQkJCWFSZHZDb25mLT5tQXdhaXRpbmdPdXRwdXRSZHZGbGFnWyBvZmZzZXQgXSA9IHRydWU7CisJCQkJfQorCQkJCWVsc2UgaWYoIHRtcEVELT5tRVhFQ19TWU5DX1BPSU5ULT5tUm91dGluZ0RhdGEuaXNQcm90b2NvbE1VTFRJX1JEVigpICkKKwkJCQl7CisJCQkJCWFSZHZDb25mLT5FRF9NVUxUSVJEVlsgb2Zmc2V0IF0uYXBwZW5kKCB0bXBFRCApOworCQkJCQlhUmR2Q29uZi0+bUF3YWl0aW5nT3V0cHV0TXVsdGlSZHZGbGFnWyBvZmZzZXQgXSA9IHRydWU7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCQljYXNlIEFFRVNfV0FJVElOR19PVVRDT01fUkRWOgorCQkJeworCQkJCWlmKCB0bXBFRC0+bUVYRUNfU1lOQ19QT0lOVC0+bVJvdXRpbmdEYXRhLmlzUHJvdG9jb2xSRFYoKSApCisJCQkJeworCQkJCQlhUmR2Q29uZi0+T1VUX0VEX1JEVlsgb2Zmc2V0IF0uYXBwZW5kKCB0bXBFRCApOworCQkJCQlhUmR2Q29uZi0+bUF3YWl0aW5nSW5wdXRSZHZGbGFnWyBvZmZzZXQgXSA9IHRydWU7CisJCQkJfQorCQkJCWVsc2UgaWYoIHRtcEVELT5tRVhFQ19TWU5DX1BPSU5ULT5tUm91dGluZ0RhdGEuaXNQcm90b2NvbE1VTFRJX1JEVigpICkKKwkJCQl7CisJCQkJCWFSZHZDb25mLT5FRF9NVUxUSVJEVlsgb2Zmc2V0IF0uYXBwZW5kKCB0bXBFRCApOworCQkJCQlhUmR2Q29uZi0+bUF3YWl0aW5nSW5wdXRNdWx0aVJkdkZsYWdbIG9mZnNldCBdID0gdHJ1ZTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKworCQkJY2FzZSBBRUVTX1dBSVRJTkdfSk9JTl9GT1JLOgorCQkJeworCQkJCWFSZHZDb25mLT5SRFZTWyBvZmZzZXQgXS5hcHBlbmQoIHRtcEVEICk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJCTw8ICJVbmV4cGVjdGVkIEVORElORCBFWEVDVVRJT04gU1RBVFVTIGFzIHN5bmNFRFMgOj4gIgorCQkJCQkJPDwgUnVudGltZURlZjo6c3RyQUVFUyggdG1wRUQtPm1BRUVTICkgPDwgIiAhISEiCisJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQl9CisJCX0KKwl9CisKKwlhUmR2Q29uZi0+aGFzUGVyZm9ybWVkUmR2RmxhZyA9IHRydWU7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisKK2Jvb2wgQXZtQ29tbXVuaWNhdGlvblJkdlByaW1pdGl2ZTo6Y29tcHV0ZV9yZHYoUmR2Q29uZmlndXJhdGlvbkRhdGEgKiBhUmR2Q29uZiwKKwkJYXZtX29mZnNldF90IG91dE9mZnNldCwgQVBFeGVjdXRpb25EYXRhICYgb3V0RUQsCisJCWF2bV9vZmZzZXRfdCBpbk9mZnNldCwgQVBFeGVjdXRpb25EYXRhICYgaW5FRCkKK3sKK0FWTV9JRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfQ09NTVVOSUNBVElPTiApCisJQVZNX09TX1RSQUNFIDw8IHN0ZDo6ZW5kbCA8PCAiQ2hlY2tpbmcgUkRWIDo+IgorCQkJPDwgIiAgUmR2ID0gIiA8PCBtRWZmZWN0aXZlUmR2Q291bnQKKwkJCTw8ICIgIE11bHRpUmR2ICA9ICIgPDwgbUVmZmVjdGl2ZU11bHRpUmR2Q291bnQKKwkJCTw8ICIgIGNvbmYgPSAgIgorCQkJPDwgSW5zdGFuY2VDb3VudGVyPCBSZHZDb25maWd1cmF0aW9uRGF0YSA+OjpJTlNUQU5DRV9BTElWRQorCQkJPDwgc3RkOjplbmRsOworCWFSZHZDb25mLT50b1N0cmVhbSggQVZNX09TX1RSQUNFICk7CisJcHJpbnRfdHJhY2Uob3V0RUQsIEFWTV9PU19UUkFDRSk7CisJcHJpbnRfdHJhY2UoaW5FRCwgQVZNX09TX1RSQUNFKTsKKwlBVk1fT1NfVFJBQ0UgPDwgUkVQRUFUKCJfX19fX19fX19fIiwgMTApIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfQ09NTVVOSUNBVElPTiApCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gSU5QVVQgUkRWCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCUV4ZWN1dGlvbkVudmlyb25tZW50IGluRU5WKGFSZHZDb25mLT5FTlYsIGluRUQpOworCisJQkZDb2RlIGFUcmFjZUlucHV0KE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfSU5QVVRfUkRWLAorCQkJaW5FRC0+bUVYRUNfU1lOQ19QT0lOVC0+bU1lc3NhZ2UuYmZQb3J0KCkpOworCisJQkZDb2RlIGFUcmFjZU91dHB1dChPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX09VVFBVVF9SRFYsCisJCQlvdXRFRC0+bUVYRUNfU1lOQ19QT0lOVC0+bU1lc3NhZ2UuYmZQb3J0KCkpOworCisJTWVzc2FnZTo6Y29uc3RfaXRlcmF0b3IgaXRWYXIgPQorCQkJaW5FRC0+bUVYRUNfU1lOQ19QT0lOVC0+bU1lc3NhZ2UuYmVnaW5QYXJhbWV0ZXJzKCk7CisJTWVzc2FnZTo6Y29uc3RfaXRlcmF0b3IgZW5kVmFyID0KKwkJCWluRUQtPm1FWEVDX1NZTkNfUE9JTlQtPm1NZXNzYWdlLmVuZFBhcmFtZXRlcnMoKTsKKwlNZXNzYWdlOjpjb25zdF9pdGVyYXRvciBpdFZhbHVlID0KKwkJCW91dEVELT5tRVhFQ19TWU5DX1BPSU5ULT5tTWVzc2FnZS5iZWdpblBhcmFtZXRlcnMoKTsKKworCWZvciggOyBpdFZhciAhPSBlbmRWYXIgOyArK2l0VmFyICwgKytpdFZhbHVlICkKKwl7CisJCWluRU5WLmluRUQubXdzZXRBRUVTKCBBRUVTX09LICk7CisJCWlmKCBub3QgaW5FTlYuc2V0UnZhbHVlKCgqaXRWYXIpLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpLCAoKml0VmFsdWUpKSApCisJCXsKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCisJCWFUcmFjZUlucHV0LT5hcHBlbmQoICppdFZhbHVlICk7CisJCWFUcmFjZU91dHB1dC0+YXBwZW5kKCAqaXRWYWx1ZSApOworCX0KKworCUV4ZWN1dGlvbkRhdGFGYWN0b3J5OjphcHBlbmRJT0VsZW1lbnRUcmFjZShpbkVOVi5pbkVELAorCQkJQkYoIG5ldyBFeGVjdXRpb25Db25maWd1cmF0aW9uKGluRU5WLmluRUQtPm1SSUQsCisJCQkJCWFUcmFjZUlucHV0LCBvdXRFRC0+bUVYRUNfU1lOQ19QT0lOVC0+bU1lc3NhZ2UpICkgKTsKKworCisJaWYoIG5vdCByZXN1bWVfcmR2KGluRU5WLCBhUmR2Q29uZiwgaW5PZmZzZXQpICkKKwl7CisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gT1VUUFVUIFJEVgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwlFeGVjdXRpb25FbnZpcm9ubWVudCBvdXRFTlYoYVJkdkNvbmYtPkVOViwgb3V0RUQpOworCisJRXhlY3V0aW9uRGF0YUZhY3Rvcnk6OmFwcGVuZElPRWxlbWVudFRyYWNlKG91dEVOVi5pbkVELAorCQkJQkYoIG5ldyBFeGVjdXRpb25Db25maWd1cmF0aW9uKG91dEVOVi5pbkVELT5tUklELAorCQkJCQlhVHJhY2VPdXRwdXQsIG91dEVELT5tRVhFQ19TWU5DX1BPSU5ULT5tTWVzc2FnZSkgKSApOworCisJaWYoIG5vdCByZXN1bWVfcmR2KG91dEVOViwgYVJkdkNvbmYsIG91dE9mZnNldCkgKQorCXsKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCisJdXBkYXRlUG9zc2libGVJbnRlcm5hbFJkdkZsYWdzKGFSZHZDb25mKTsKKworQVZNX0lGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9DT01NVU5JQ0FUSU9OICkKKwkvLyBUUkFDRQorCWFSZHZDb25mLT50b1N0cmVhbShBVk1fT1NfVFJBQ0UpOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9DT01NVU5JQ0FUSU9OICkKKworCXJldHVybiggdHJ1ZSApOworfQorCisKK2Jvb2wgQXZtQ29tbXVuaWNhdGlvblJkdlByaW1pdGl2ZTo6Y29tcHV0ZV9tdWx0aXJkdigKKwkJTGlzdE9mUmR2Q29uZmlndXJhdGlvbkRhdGEgJiBtdWx0aVJkdkNvbmYpCit7CisJUmR2Q29uZmlndXJhdGlvbkRhdGEgKiBhUmR2Q29uZiA9IE5VTEw7CisKK0FWTV9JRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfQ09NTVVOSUNBVElPTiApCisJQVZNX09TX0lORk8gPDwgImNvbXB1dGVfbXVsdGlyZHY6Yj4gIgorCQkJPDwgSW5zdGFuY2VDb3VudGVyPCBSZHZDb25maWd1cmF0aW9uRGF0YSA+OjpJTlNUQU5DRV9BTElWRQorCQkJPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9DT01NVU5JQ0FUSU9OICkKKworCXdoaWxlKCBtdWx0aVJkdkNvbmYubm9uZW1wdHkoKSApCisJeworCQltdWx0aVJkdkNvbmYucG9wX2ZpcnN0X3RvKCBhUmR2Q29uZiApOworLy8JCWFSZHZDb25mLT51cGRhdGVQb3NzaWJsZUludGVybmFsUmR2RmxhZygpOworLy8JCWFSZHZDb25mLT51cGRhdGVQb3NzaWJsZUludGVybmFsTXVsdGlSZHZGbGFnKCk7CisKKwkJaWYoIGFSZHZDb25mLT5pc011bHRpUmR2Q29tcGxldGUoKSApCisJCXsKKwkJCWlmKCBub3QgY29tcHV0ZV9tdWx0aXJkdihhUmR2Q29uZikgKQorCQkJeworCQkJCWRlbGV0ZSggYVJkdkNvbmYgKTsKKwkJCQlhUmR2Q29uZiA9IE5VTEw7CisKKwkJCQljb250aW51ZTsKKwkJCQkvLyBUT0RPIEVSUkVVUgorCQkJfQorCQl9CisKKwkJY29tcGxldGVfcmR2KGFSZHZDb25mLCB0cnVlKTsKKwl9CisKK0FWTV9JRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfQ09NTVVOSUNBVElPTiApCisJQVZNX09TX0lORk8gPDwgImNvbXB1dGVfbXVsdGlyZHY6ZT4gIgorCQkJPDwgSW5zdGFuY2VDb3VudGVyPCBSZHZDb25maWd1cmF0aW9uRGF0YSA+OjpJTlNUQU5DRV9BTElWRQorCQkJPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9DT01NVU5JQ0FUSU9OICkKKworCXJldHVybiggdHJ1ZSApOworfQorCitib29sIEF2bUNvbW11bmljYXRpb25SZHZQcmltaXRpdmU6OmNvbXB1dGVfbXVsdGlyZHYoCisJCVJkdkNvbmZpZ3VyYXRpb25EYXRhICogYVJkdkNvbmYpCit7CitBVk1fSUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX0NPTU1VTklDQVRJT04gKQorCUFWTV9PU19UUkFDRSA8PCBzdGQ6OmVuZGwgPDwgIkNoZWNraW5nIE1VTFRJX1JEViA6PiIKKwkJCTw8ICIgIFJkdiA9ICIgPDwgbUVmZmVjdGl2ZVJkdkNvdW50CisJCQk8PCAiICBNdWx0aVJkdiAgPSAiIDw8IG1FZmZlY3RpdmVNdWx0aVJkdkNvdW50CisJCQk8PCAiICBjb25mID0gICIKKwkJCTw8IEluc3RhbmNlQ291bnRlcjwgUmR2Q29uZmlndXJhdGlvbkRhdGEgPjo6SU5TVEFOQ0VfQUxJVkUKKwkJCTw8IHN0ZDo6ZW5kbDsKKwlhUmR2Q29uZi0+dG9TdHJlYW0oIEFWTV9PU19UUkFDRSApOworCXByaW50X3RyYWNlKGFSZHZDb25mLT5tQXdhaXRpbmdNdWx0aVJkdkVEUywgQVZNX09TX1RSQUNFKTsKKwlBVk1fT1NfVFJBQ0UgPDwgUkVQRUFUKCJfX19fX19fX19fIiwgMTApIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfQ09NTVVOSUNBVElPTiApCisKKwlNZXNzYWdlIGFuT3V0cHV0TXNnOworCU1lc3NhZ2UgYW5JbnB1dE1zZzsKKwlCRkNvZGUgYVRyYWNlSU87CisKKwlNZXNzYWdlOjpjb25zdF9pdGVyYXRvciBpdFZhcjsKKwlNZXNzYWdlOjpjb25zdF9pdGVyYXRvciBlbmRWYXI7CisJTWVzc2FnZTo6Y29uc3RfaXRlcmF0b3IgaXRWYWx1ZTsKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBPVVRQVVQgUkRWCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCWZvciggYXZtX3NpemVfdCBpZHggPSAwIDsgaWR4IDwgYVJkdkNvbmYtPm1NYWNoaW5lQ291bnQ7ICsraWR4ICkKKwl7CisJCWlmKCBhUmR2Q29uZi0+bUF3YWl0aW5nTXVsdGlSZHZFRFNbIGlkeCBdLmludmFsaWQoKSApCisJCXsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmKCBhUmR2Q29uZi0+bUF3YWl0aW5nTXVsdGlSZHZFRFNbIGlkeCBdLT5tRVhFQ19TWU5DX1BPSU5ULT5pc0lucHV0KCkgKQorCQl7CisJCQljb250aW51ZTsKKwkJfQorCQlhUmR2Q29uZi0+bUF3YWl0aW5nTXVsdGlSZHZGbGFnWyBpZHggXSA9IGZhbHNlOworCQlhUmR2Q29uZi0+bUF3YWl0aW5nSW5wdXRNdWx0aVJkdkZsYWdbIGlkeCBdID0gZmFsc2U7CisKKwkJRXhlY3V0aW9uRW52aXJvbm1lbnQgb3V0RU5WKAorCQkJCWFSZHZDb25mLT5FTlYsIGFSZHZDb25mLT5tQXdhaXRpbmdNdWx0aVJkdkVEU1sgaWR4IF0pOworCQlhUmR2Q29uZi0+bUF3YWl0aW5nTXVsdGlSZHZFRFNbIGlkeCBdLmRlc3Ryb3koKTsKKworCQlhbk91dHB1dE1zZyA9IG91dEVOVi5pbkVELT5tRVhFQ19TWU5DX1BPSU5ULT5tTWVzc2FnZTsKKworCQlhVHJhY2VJTyA9IFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfT1VUUFVUX1JEViwgYW5PdXRwdXRNc2cuYmZQb3J0KCkpOworCisJCWFUcmFjZUlPLT5hcHBlbmQoIGFuT3V0cHV0TXNnLmdldFBhcmFtZXRlcnMoKSApOworCisJCUV4ZWN1dGlvbkRhdGFGYWN0b3J5OjphcHBlbmRJT0VsZW1lbnRUcmFjZShvdXRFTlYuaW5FRCwKKwkJCQlCRiggbmV3IEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24oCisJCQkJCQlvdXRFTlYuaW5FRC0+bVJJRCwgYVRyYWNlSU8sIGFuT3V0cHV0TXNnKSApICk7CisKKwkJaWYoIG5vdCByZXN1bWVfcmR2KG91dEVOViwgYVJkdkNvbmYsIGlkeCkgKQorCQl7CisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKworCQlpZiggYW5PdXRwdXRNc2cuaGFzUGFyYW1ldGVyKCkgKQorCQl7CisJCQlicmVhazsgLy8gT25seSBvbmUgc2VuZGVyIHdpdGggdmFsdWVzIG9uIE1VTFRJIFJEVgorCQl9CisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gSU5QVVQgUkRWCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJZm9yKCBhdm1fc2l6ZV90IGlkeCA9IDAgOyBpZHggPCBhUmR2Q29uZi0+bU1hY2hpbmVDb3VudDsgKytpZHggKQorCXsKKwkJaWYoIGFSZHZDb25mLT5tQXdhaXRpbmdNdWx0aVJkdkVEU1sgaWR4IF0uaW52YWxpZCgpICkKKwkJeworCQkJY29udGludWU7CisJCX0KKwkJaWYoIGFSZHZDb25mLT5tQXdhaXRpbmdNdWx0aVJkdkVEU1sgaWR4IF0tPm1FWEVDX1NZTkNfUE9JTlQtPmlzT3V0cHV0KCkgKQorCQl7CisJCQljb250aW51ZTsKKwkJfQorCisJCWFSZHZDb25mLT5tQXdhaXRpbmdNdWx0aVJkdkZsYWdbIGlkeCBdID0gZmFsc2U7CisJCWFSZHZDb25mLT5tQXdhaXRpbmdPdXRwdXRNdWx0aVJkdkZsYWdbIGlkeCBdID0gZmFsc2U7CisKKwkJRXhlY3V0aW9uRW52aXJvbm1lbnQgaW5FTlYoCisJCQkJYVJkdkNvbmYtPkVOViwgYVJkdkNvbmYtPm1Bd2FpdGluZ011bHRpUmR2RURTWyBpZHggXSk7CisJCWFSZHZDb25mLT5tQXdhaXRpbmdNdWx0aVJkdkVEU1sgaWR4IF0uZGVzdHJveSgpOworCisJCWFuSW5wdXRNc2cgPSBpbkVOVi5pbkVELT5tRVhFQ19TWU5DX1BPSU5ULT5tTWVzc2FnZTsKKworCQlhVHJhY2VJTyA9IFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfSU5QVVRfUkRWLCBhbklucHV0TXNnLmJmUG9ydCgpKTsKKworCQlpZiggYW5PdXRwdXRNc2cuaGFzUGFyYW1ldGVyKCkgKQorCQl7CisJCQlpdFZhciA9IGFuSW5wdXRNc2cuYmVnaW5QYXJhbWV0ZXJzKCk7CisJCQllbmRWYXIgPSBhbklucHV0TXNnLmVuZFBhcmFtZXRlcnMoKTsKKwkJCWl0VmFsdWUgPSBhbk91dHB1dE1zZy5iZWdpblBhcmFtZXRlcnMoKTsKKwkJCWZvciggOyBpdFZhciAhPSBlbmRWYXIgOyArK2l0VmFyICwgKytpdFZhbHVlICkKKwkJCXsKKwkJCQlhVHJhY2VJTy0+YXBwZW5kKCAqaXRWYWx1ZSApOworCisJCQkJaW5FTlYuaW5FRC5td3NldEFFRVMoIEFFRVNfT0sgKTsKKwkJCQlpZiggbm90IGluRU5WLnNldFJ2YWx1ZSgKKwkJCQkJCSgqaXRWYXIpLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpLCAoKml0VmFsdWUpKSApCisJCQkJeworCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJRXhlY3V0aW9uRGF0YUZhY3Rvcnk6OmFwcGVuZElPRWxlbWVudFRyYWNlKGluRU5WLmluRUQsCisJCQkJQkYoIG5ldyBFeGVjdXRpb25Db25maWd1cmF0aW9uKAorCQkJCQkJaW5FTlYuaW5FRC0+bVJJRCwgYVRyYWNlSU8sIGFuSW5wdXRNc2cpICkgKTsKKworCQlpZiggbm90IHJlc3VtZV9yZHYoaW5FTlYsIGFSZHZDb25mLCBpZHgpICkKKwkJeworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorCisJdXBkYXRlUG9zc2libGVJbnRlcm5hbFJkdkZsYWdzKGFSZHZDb25mKTsKKworQVZNX0lGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9DT01NVU5JQ0FUSU9OICkKKwkvLyBUUkFDRQorCWFSZHZDb25mLT50b1N0cmVhbShBVk1fT1NfVFJBQ0UpOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9DT01NVU5JQ0FUSU9OICkKKworCXJldHVybiggdHJ1ZSApOworfQorCisKK3ZvaWQgQXZtQ29tbXVuaWNhdGlvblJkdlByaW1pdGl2ZTo6Y29tcGxldGVfcmR2KAorCQlSZHZDb25maWd1cmF0aW9uRGF0YSAqICYgYVJkdkNvbmYsIGJvb2wgaXNNdWx0aSkKK3sKKwlpZiggYVJkdkNvbmYtPmlzQ29tcGxldGUoKSApCisJeworCQlpZiggbm90IGNvbXBsZXRlZF9yZHYoYVJkdkNvbmYsIGlzTXVsdGkpICkKKwkJeworCQkJLy8gVE9ETyBFUlJFVVIKKwkJfQorCisJCWRlbGV0ZSggYVJkdkNvbmYgKTsKKwkJYVJkdkNvbmYgPSBOVUxMOworCX0KKwllbHNlCisJeworCQlORVhUX1JEVl9DT05GLmFwcGVuZCggYVJkdkNvbmYgKTsKKwl9Cit9CisKKworYm9vbCBBdm1Db21tdW5pY2F0aW9uUmR2UHJpbWl0aXZlOjpjb21wbGV0ZWRfcmR2KAorCQlSZHZDb25maWd1cmF0aW9uRGF0YSAqIGFSZHZDb25mLCBib29sIGlzTXVsdGkpCit7CisJTGlzdE9mQVBFeGVjdXRpb25EYXRhIHRtcExpc3RPZkVEOworCUFQRXhlY3V0aW9uRGF0YSB0bXBFRDsKKworCUxpc3RPZkFQRXhlY3V0aW9uRGF0YTo6aXRlcmF0b3IgaXRFRDsKKwlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGE6Oml0ZXJhdG9yIGVuZEl0RUQ7CisKKwlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGEgZnVzaW9uTGlzdE9mRUQ7CisJQVBFeGVjdXRpb25EYXRhIGFuRUQ7CisKKwlhdm1fc2l6ZV90IGlkeCA9IDA7CisKKwlmb3IoIGlkeCA9IDAgOyBpZHggPCBhUmR2Q29uZi0+bU1hY2hpbmVDb3VudDsgKytpZHggKQorCXsKKwkJaWYoIGFSZHZDb25mLT5SRFZTWyBpZHggXS5ub25lbXB0eSgpICkKKwkJeworCQkJdG1wTGlzdE9mRUQuc3BsaWNlKCBhUmR2Q29uZi0+UkRWU1sgaWR4IF0gKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJZm9yKCArK2lkeCA7IGlkeCA8IGFSZHZDb25mLT5tTWFjaGluZUNvdW50OyArK2lkeCApCisJeworCQlpZiggYVJkdkNvbmYtPlJEVlNbIGlkeCBdLm5vbmVtcHR5KCkgKQorCQl7CisJCQl3aGlsZSggdG1wTGlzdE9mRUQubm9uZW1wdHkoKSApCisJCQl7CisJCQkJdG1wTGlzdE9mRUQucG9wX2xhc3RfdG8oIHRtcEVEICk7CisKKwkJCQlpdEVEID0gYVJkdkNvbmYtPlJEVlNbIGlkeCBdLmJlZ2luKCk7CisJCQkJZW5kSXRFRCA9IGFSZHZDb25mLT5SRFZTWyBpZHggXS5lbmQoKTsKKwkJCQlmb3IoIDsgaXRFRCAhPSBlbmRJdEVEIDsgKytpdEVEICkKKwkJCQl7CisJCQkJCWFuRUQgPSBBdm1TeW5jaHJvbml6YXRpb25GYWN0b3J5OjpmdXNpb24oCisJCQkJCQkJYVJkdkNvbmYtPkVOVi5pbkVELCB0bXBFRCwgKCppdEVEKSk7CisJCQkJCWlmKCBhbkVELnZhbGlkKCkgKQorCQkJCQl7CisJCQkJCQlmdXNpb25MaXN0T2ZFRC5hcHBlbmQoIGFuRUQgKTsKKwkJCQkJfQorCQkJCX0KKworCQkJfQorCisJCQl0bXBMaXN0T2ZFRC5zcGxpY2UoZnVzaW9uTGlzdE9mRUQpOworCQl9CisJfQorCisJaWYoIGlzTXVsdGkgKQorCXsKKwkJbUVmZmVjdGl2ZU11bHRpUmR2Q291bnQgKz0gdG1wTGlzdE9mRUQuc2l6ZSgpOworCX0KKwllbHNlCisJeworCQltRWZmZWN0aXZlUmR2Q291bnQgKz0gdG1wTGlzdE9mRUQuc2l6ZSgpOworCX0KKwlSRFYuc3BsaWNlKCB0bXBMaXN0T2ZFRCApOworCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworCitib29sICBBdm1Db21tdW5pY2F0aW9uUmR2UHJpbWl0aXZlOjpyZXN1bWVfcmR2KEV4ZWN1dGlvbkVudmlyb25tZW50ICYgdG1wRU5WKQoreworCXRtcEVOVi5pbkVELm13c2V0QUVFUyggQUVFU19TVEVQX1JFU1VNRSApOworCisJc2VwOjpkZXN0cm95KCB0bXBFTlYuaW5FRC0+bUVYRUNfU1lOQ19QT0lOVCApOworCXRtcEVOVi5pbkVELT5tRVhFQ19TWU5DX1BPSU5UID0gTlVMTDsKKworCXRtcEVOVi5pbkVELT5tU1RBVEVNRU5UX1FVRVVFLnB1c2hDYWNoZSgpOworCisJaWYoIHRtcEVOVi5kZWNvZGVfcmVzdW1lKCkgKQorCXsKKwkJcmV0dXJuKCB0bXBFTlYuaGFzT3V0cHV0U3luY0lycSgpICk7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiggZmFsc2UgKTsKKwl9Cit9CisKKworCisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bUNvbW11bmljYXRpb25SZHZQcmltaXRpdmUuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1Db21tdW5pY2F0aW9uUmR2UHJpbWl0aXZlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM4ZTg2MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1Db21tdW5pY2F0aW9uUmR2UHJpbWl0aXZlLmgKQEAgLTAsMCArMSw0MzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiA4IG5vdi4gMjAxMAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEFWTUNPTU1VTklDQVRJT05SRFZQUklNSVRJVkVfSF8KKyNkZWZpbmUgQVZNQ09NTVVOSUNBVElPTlJEVlBSSU1JVElWRV9IXworCisjaW5jbHVkZSA8Y29tbW9uL0F2bU9iamVjdC5oPgorCisjaW5jbHVkZSA8Y29sbGVjdGlvbi9CaXRzZXQuaD4KKworI2luY2x1ZGUgPGNvbXB1dGVyL3ByaW1pdGl2ZS9CYXNlQXZtUHJpbWl0aXZlLmg+CisKKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25EYXRhLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBFeGVjdXRpb25FbnZpcm9ubWVudDsKK2NsYXNzIEluc3RhbmNlT2ZDb25uZWN0OworY2xhc3MgT3V0U3RyZWFtOworCisKK2NsYXNzIFJkdkNvbmZpZ3VyYXRpb25EYXRhIDoKKwkJcHVibGljIEF2bU9iamVjdCwKKwkJQVZNX0lOSkVDVF9JTlNUQU5DRV9DT1VOVEVSX0NMQVNTKCBSZHZDb25maWd1cmF0aW9uRGF0YSApCit7CisKK3B1YmxpYzoKKwkvKioKKwkgKiBBVFRSSUJVVEVTCisJICovCisJRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlY7CisKKwlhdm1fc2l6ZV90IG1NYWNoaW5lQ291bnQ7CisKKwlWZWN0b3JPZkxpc3RPZkFQRXhlY3V0aW9uRGF0YSBJTl9FRF9SRFY7CisJVmVjdG9yT2ZMaXN0T2ZBUEV4ZWN1dGlvbkRhdGEgT1VUX0VEX1JEVjsKKworCVZlY3Rvck9mTGlzdE9mQVBFeGVjdXRpb25EYXRhIEVEX01VTFRJUkRWOworCisJVmVjdG9yT2ZMaXN0T2ZBUEV4ZWN1dGlvbkRhdGEgUkRWUzsKKwlib29sIGhhc1BlcmZvcm1lZFJkdkZsYWc7CisKKwlCaXRzZXQgbVVzZWRNYWNoaW5lRmxhZzsKKworCUJpdHNldCBtQXdhaXRpbmdJbnB1dFJkdkZsYWc7CisJQml0c2V0IG1Bd2FpdGluZ091dHB1dFJkdkZsYWc7CisKKwlCaXRzZXQgbUF3YWl0aW5nTXVsdGlSZHZGbGFnOworCUJpdHNldCBtQXdhaXRpbmdJbnB1dE11bHRpUmR2RmxhZzsKKwlCaXRzZXQgbUF3YWl0aW5nT3V0cHV0TXVsdGlSZHZGbGFnOworCisJSW5zdGFuY2VPZkNvbm5lY3QgKiBtQ29ubmVjdG9yOworCVZlY3Rvck9mQVBFeGVjdXRpb25EYXRhIG1Bd2FpdGluZ011bHRpUmR2RURTOworCisJYm9vbCBoYXNQb3NzaWJsZUludGVybmFsUmR2RmxhZzsKKwlib29sIGhhc1Bvc3NpYmxlSW50ZXJuYWxNdWx0aVJkdkZsYWc7CisKKworcHVibGljOgorCVJkdkNvbmZpZ3VyYXRpb25EYXRhKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgYUVOViwgYXZtX3NpemVfdCBtYWNoaW5lQ291bnQpCisJOiBBdm1PYmplY3QoKSwKKwlFTlYoIGFFTlYgKSwKKwltTWFjaGluZUNvdW50KCBtYWNoaW5lQ291bnQgKSwKKworCUlOX0VEX1JEViggbU1hY2hpbmVDb3VudCApLAorCU9VVF9FRF9SRFYoIG1NYWNoaW5lQ291bnQgKSwKKworCUVEX01VTFRJUkRWKCBtTWFjaGluZUNvdW50ICksCisKKwlSRFZTKCBtTWFjaGluZUNvdW50ICksCisJaGFzUGVyZm9ybWVkUmR2RmxhZyggZmFsc2UgKSwKKworCW1Vc2VkTWFjaGluZUZsYWcoIG1NYWNoaW5lQ291bnQgLCBmYWxzZSApLAorCisJbUF3YWl0aW5nSW5wdXRSZHZGbGFnKCBtTWFjaGluZUNvdW50ICwgZmFsc2UgKSwKKwltQXdhaXRpbmdPdXRwdXRSZHZGbGFnKCBtTWFjaGluZUNvdW50ICwgZmFsc2UgICksCisKKwltQXdhaXRpbmdNdWx0aVJkdkZsYWcoIG1NYWNoaW5lQ291bnQgLCBmYWxzZSApLAorCW1Bd2FpdGluZ0lucHV0TXVsdGlSZHZGbGFnKCBtTWFjaGluZUNvdW50ICwgZmFsc2UgKSwKKwltQXdhaXRpbmdPdXRwdXRNdWx0aVJkdkZsYWcoIG1NYWNoaW5lQ291bnQgLCBmYWxzZSApLAorCisJbUNvbm5lY3RvciggTlVMTCApLAorCW1Bd2FpdGluZ011bHRpUmR2RURTKCBtTWFjaGluZUNvdW50ICksCisKKwloYXNQb3NzaWJsZUludGVybmFsUmR2RmxhZyggZmFsc2UgKSwKKwloYXNQb3NzaWJsZUludGVybmFsTXVsdGlSZHZGbGFnKCBmYWxzZSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCVJkdkNvbmZpZ3VyYXRpb25EYXRhKFJkdkNvbmZpZ3VyYXRpb25EYXRhICogYVJkdkNvbmYpCisJOiBBdm1PYmplY3QoKSwKKwlFTlYoIGFSZHZDb25mLT5FTlYgKSwKKwltTWFjaGluZUNvdW50KCBhUmR2Q29uZi0+bU1hY2hpbmVDb3VudCApLAorCisJSU5fRURfUkRWKCBtTWFjaGluZUNvdW50ICksCisJT1VUX0VEX1JEViggbU1hY2hpbmVDb3VudCApLAorCisJRURfTVVMVElSRFYoIG1NYWNoaW5lQ291bnQgKSwKKworCVJEVlMoIG1NYWNoaW5lQ291bnQgKSwKKwloYXNQZXJmb3JtZWRSZHZGbGFnKCBmYWxzZSApLAorCisJbVVzZWRNYWNoaW5lRmxhZyggbU1hY2hpbmVDb3VudCAsIGZhbHNlICksCisKKwltQXdhaXRpbmdJbnB1dFJkdkZsYWcoIG1NYWNoaW5lQ291bnQgLCBmYWxzZSApLAorCW1Bd2FpdGluZ091dHB1dFJkdkZsYWcoIG1NYWNoaW5lQ291bnQgLCBmYWxzZSAgKSwKKworCW1Bd2FpdGluZ011bHRpUmR2RmxhZyggbU1hY2hpbmVDb3VudCAsIGZhbHNlICksCisJbUF3YWl0aW5nSW5wdXRNdWx0aVJkdkZsYWcoIG1NYWNoaW5lQ291bnQgLCBmYWxzZSApLAorCW1Bd2FpdGluZ091dHB1dE11bHRpUmR2RmxhZyggbU1hY2hpbmVDb3VudCAsIGZhbHNlICksCisKKwltQ29ubmVjdG9yKCBOVUxMICksCisJbUF3YWl0aW5nTXVsdGlSZHZFRFMoIG1NYWNoaW5lQ291bnQgKSwKKworCWhhc1Bvc3NpYmxlSW50ZXJuYWxSZHZGbGFnKCBmYWxzZSApLAorCWhhc1Bvc3NpYmxlSW50ZXJuYWxNdWx0aVJkdkZsYWcoIGZhbHNlICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJUmR2Q29uZmlndXJhdGlvbkRhdGEoY29uc3QgUmR2Q29uZmlndXJhdGlvbkRhdGEgJiBhUmR2Q29uZkRhdGEpCisJOiBBdm1PYmplY3QoIGFSZHZDb25mRGF0YSApLAorCUVOViggYVJkdkNvbmZEYXRhLkVOViApLAorCW1NYWNoaW5lQ291bnQoIGFSZHZDb25mRGF0YS5tTWFjaGluZUNvdW50ICksCisKKwlJTl9FRF9SRFYoIGFSZHZDb25mRGF0YS5JTl9FRF9SRFYgKSwKKwlPVVRfRURfUkRWKCBhUmR2Q29uZkRhdGEuT1VUX0VEX1JEViApLAorCisJRURfTVVMVElSRFYoIGFSZHZDb25mRGF0YS5FRF9NVUxUSVJEViApLAorCisJUkRWUyggYVJkdkNvbmZEYXRhLlJEVlMgKSwKKwloYXNQZXJmb3JtZWRSZHZGbGFnKCBhUmR2Q29uZkRhdGEuaGFzUGVyZm9ybWVkUmR2RmxhZyApLAorCisJbVVzZWRNYWNoaW5lRmxhZyggYVJkdkNvbmZEYXRhLm1Vc2VkTWFjaGluZUZsYWcgKSwKKworCW1Bd2FpdGluZ0lucHV0UmR2RmxhZyggYVJkdkNvbmZEYXRhLm1Bd2FpdGluZ0lucHV0UmR2RmxhZyApLAorCW1Bd2FpdGluZ091dHB1dFJkdkZsYWcoIGFSZHZDb25mRGF0YS5tQXdhaXRpbmdPdXRwdXRSZHZGbGFnICksCisKKwltQXdhaXRpbmdNdWx0aVJkdkZsYWcoIGFSZHZDb25mRGF0YS5tQXdhaXRpbmdNdWx0aVJkdkZsYWcgKSwKKwltQXdhaXRpbmdJbnB1dE11bHRpUmR2RmxhZyggYVJkdkNvbmZEYXRhLm1Bd2FpdGluZ0lucHV0TXVsdGlSZHZGbGFnICksCisJbUF3YWl0aW5nT3V0cHV0TXVsdGlSZHZGbGFnKCBhUmR2Q29uZkRhdGEubUF3YWl0aW5nT3V0cHV0TXVsdGlSZHZGbGFnICksCisKKwltQ29ubmVjdG9yKCBhUmR2Q29uZkRhdGEubUNvbm5lY3RvciApLAorCW1Bd2FpdGluZ011bHRpUmR2RURTKCBhUmR2Q29uZkRhdGEubUF3YWl0aW5nTXVsdGlSZHZFRFMgKSwKKworCWhhc1Bvc3NpYmxlSW50ZXJuYWxSZHZGbGFnKCBhUmR2Q29uZkRhdGEuaGFzUG9zc2libGVJbnRlcm5hbFJkdkZsYWcgKSwKKwloYXNQb3NzaWJsZUludGVybmFsTXVsdGlSZHZGbGFnKAorCQkJYVJkdkNvbmZEYXRhLmhhc1Bvc3NpYmxlSW50ZXJuYWxNdWx0aVJkdkZsYWcgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwlSZHZDb25maWd1cmF0aW9uRGF0YShjb25zdCBSZHZDb25maWd1cmF0aW9uRGF0YSAmIGFSZHZDb25mRGF0YSwKKwkJCVJkdkNvbmZpZ3VyYXRpb25EYXRhICogYVJkdkNvbmYpCisJOiBBdm1PYmplY3QoIGFSZHZDb25mRGF0YSApLAorCUVOViggYVJkdkNvbmZEYXRhLkVOViApLAorCW1NYWNoaW5lQ291bnQoIGFSZHZDb25mRGF0YS5tTWFjaGluZUNvdW50ICksCisKKwlJTl9FRF9SRFYoIGFSZHZDb25mRGF0YS5JTl9FRF9SRFYgKSwKKwlPVVRfRURfUkRWKCBhUmR2Q29uZkRhdGEuT1VUX0VEX1JEViApLAorCisJRURfTVVMVElSRFYoIGFSZHZDb25mRGF0YS5FRF9NVUxUSVJEViApLAorCisJUkRWUyggYVJkdkNvbmZEYXRhLlJEVlMgKSwKKwloYXNQZXJmb3JtZWRSZHZGbGFnKAorCQkJYVJkdkNvbmZEYXRhLmhhc1BlcmZvcm1lZFJkdkZsYWcKKwkJCXwgYVJkdkNvbmYtPmhhc1BlcmZvcm1lZFJkdkZsYWcgKSwKKworCW1Vc2VkTWFjaGluZUZsYWcoCisJCQlhUmR2Q29uZkRhdGEubUF3YWl0aW5nSW5wdXRSZHZGbGFnCisJCQl8IGFSZHZDb25mLT5tQXdhaXRpbmdJbnB1dFJkdkZsYWcgKSwKKworCW1Bd2FpdGluZ0lucHV0UmR2RmxhZygKKwkJCWFSZHZDb25mRGF0YS5tQXdhaXRpbmdJbnB1dFJkdkZsYWcKKwkJCXwgYVJkdkNvbmYtPm1Bd2FpdGluZ0lucHV0UmR2RmxhZyApLAorCisJbUF3YWl0aW5nT3V0cHV0UmR2RmxhZygKKwkJCWFSZHZDb25mRGF0YS5tQXdhaXRpbmdPdXRwdXRSZHZGbGFnCisJCQl8IGFSZHZDb25mLT5tQXdhaXRpbmdPdXRwdXRSZHZGbGFnICksCisKKwltQXdhaXRpbmdNdWx0aVJkdkZsYWcoCisJCQlhUmR2Q29uZkRhdGEubUF3YWl0aW5nTXVsdGlSZHZGbGFnCisJCQl8IGFSZHZDb25mLT5tQXdhaXRpbmdNdWx0aVJkdkZsYWcgKSwKKworCW1Bd2FpdGluZ0lucHV0TXVsdGlSZHZGbGFnKAorCQkJYVJkdkNvbmZEYXRhLm1Bd2FpdGluZ0lucHV0TXVsdGlSZHZGbGFnCisJCQl8IGFSZHZDb25mLT5tQXdhaXRpbmdJbnB1dE11bHRpUmR2RmxhZyApLAorCisJbUF3YWl0aW5nT3V0cHV0TXVsdGlSZHZGbGFnKAorCQkJYVJkdkNvbmZEYXRhLm1Bd2FpdGluZ091dHB1dE11bHRpUmR2RmxhZworCQkJfCBhUmR2Q29uZi0+bUF3YWl0aW5nT3V0cHV0TXVsdGlSZHZGbGFnICksCisKKwltQ29ubmVjdG9yKCBhUmR2Q29uZkRhdGEubUNvbm5lY3RvciApLAorCW1Bd2FpdGluZ011bHRpUmR2RURTKCBhUmR2Q29uZkRhdGEubUF3YWl0aW5nTXVsdGlSZHZFRFMgKSwKKworCWhhc1Bvc3NpYmxlSW50ZXJuYWxSZHZGbGFnKCBmYWxzZSApLAorCWhhc1Bvc3NpYmxlSW50ZXJuYWxNdWx0aVJkdkZsYWcoIGZhbHNlICkKKwl7CisJCXVwZGF0ZVBvc3NpYmxlSW50ZXJuYWxSZHZGbGFnKCk7CisJCXVwZGF0ZVBvc3NpYmxlSW50ZXJuYWxNdWx0aVJkdkZsYWcoKTsKKwl9CisKKworCXZpcnR1YWwgflJkdkNvbmZpZ3VyYXRpb25EYXRhKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJUmR2Q29uZmlndXJhdGlvbkRhdGEgKiBmdXNpb24oUmR2Q29uZmlndXJhdGlvbkRhdGEgKiBhUmR2Q29uZik7CisKKwl2b2lkIHJlc2l6ZShhdm1fc2l6ZV90IG5ld1NpemUpOworCisKKwlpbmxpbmUgYm9vbCBpc0NvbXBsZXRlKCkKKwl7CisJCXJldHVybiggbUF3YWl0aW5nSW5wdXRSZHZGbGFnLm5vbmUoKQorCQkJCSYmIG1Bd2FpdGluZ091dHB1dFJkdkZsYWcubm9uZSgpCisJCQkJJiYgbUF3YWl0aW5nTXVsdGlSZHZGbGFnLm5vbmUoKSApOworCX0KKworCWlubGluZSB2b2lkIHVwZGF0ZVBvc3NpYmxlSW50ZXJuYWxSZHZGbGFnKCkKKwl7CisJCWhhc1Bvc3NpYmxlSW50ZXJuYWxSZHZGbGFnID0KKwkJCQkoIG1Bd2FpdGluZ0lucHV0UmR2RmxhZy5hbnkoKSAmJiBtQXdhaXRpbmdPdXRwdXRSZHZGbGFnLmFueSgpICk7CisJfQorCisJaW5saW5lIHZvaWQgdXBkYXRlUG9zc2libGVJbnRlcm5hbE11bHRpUmR2RmxhZygpCisJeworCQloYXNQb3NzaWJsZUludGVybmFsTXVsdGlSZHZGbGFnID0KKwkJCQkoIG1Bd2FpdGluZ0lucHV0TXVsdGlSZHZGbGFnLmFueSgpCisJCQkJCQl8fCBtQXdhaXRpbmdPdXRwdXRNdWx0aVJkdkZsYWcuYW55KCkgKTsKKwl9CisKKworCWlubGluZSBib29sIGhhc1Bvc3NpYmxlRXh0ZXJuYWxSZHYoUmR2Q29uZmlndXJhdGlvbkRhdGEgKiBhUmR2Q29uZikKKwl7CisJCXJldHVybiggKGhhc1BlcmZvcm1lZFJkdkZsYWcKKwkJCQkJfHwgYVJkdkNvbmYtPmhhc1BlcmZvcm1lZFJkdkZsYWcpCisJCQkJJiYgKG1Vc2VkTWFjaGluZUZsYWcgJiBhUmR2Q29uZi0+bVVzZWRNYWNoaW5lRmxhZykubm9uZSgpCisJCQkJJiYgKCAobUF3YWl0aW5nSW5wdXRSZHZGbGFnLmFueSgpCisJCQkJCQkmJiBhUmR2Q29uZi0+bUF3YWl0aW5nT3V0cHV0UmR2RmxhZy5hbnkoKSkKKwkJCQkJfHwgKGFSZHZDb25mLT5tQXdhaXRpbmdJbnB1dFJkdkZsYWcuYW55KCkKKwkJCQkJCSYmIG1Bd2FpdGluZ091dHB1dFJkdkZsYWcuYW55KCkpICkgKTsKKwl9CisKKworCWlubGluZSBib29sIGhhc1Bvc3NpYmxlRXh0ZXJuYWxNdWx0aVJkdihSZHZDb25maWd1cmF0aW9uRGF0YSAqIGFSZHZDb25mKQorCXsKKwkJcmV0dXJuKCAoaGFzUGVyZm9ybWVkUmR2RmxhZyB8fCBhUmR2Q29uZi0+aGFzUGVyZm9ybWVkUmR2RmxhZykgJiYKKwkJCQkobVVzZWRNYWNoaW5lRmxhZyAmIGFSZHZDb25mLT5tVXNlZE1hY2hpbmVGbGFnKS5ub25lKCkgKTsKKwl9CisKKworCWJvb2wgaXNNdWx0aVJkdkNvbXBsZXRlKCk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBTRVJJQUxJWkFUSU9OCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCXZpcnR1YWwgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKK307CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFRZUEVERUYgZm9yIENPTExFQ1RJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0RFRklORV9MSVNUX1BUUihSZHZDb25maWd1cmF0aW9uRGF0YSk7CisKK0RFRklORV9WRUNUT1JfUFRSKFJkdkNvbmZpZ3VyYXRpb25EYXRhKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKworCisKK2NsYXNzIEF2bUNvbW11bmljYXRpb25SZHZQcmltaXRpdmUgOiAgcHVibGljIEJhc2VBdm1QcmltaXRpdmUKK3sKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlSZHZDb25maWd1cmF0aW9uRGF0YSAmIG1CYXNlUmR2Q29uZjsKKworCWJvb2wgY2hlY2tSZHZGbGFnOworCWJvb2wgY2hlY2tNdWx0aVJkdkZsYWc7CisKKworCUxpc3RPZlJkdkNvbmZpZ3VyYXRpb25EYXRhIFBSRVZJT1VTX1JEVl9DT05GOworCUxpc3RPZlJkdkNvbmZpZ3VyYXRpb25EYXRhIENVUlJFTlRfUkRWX0NPTkY7CisJTGlzdE9mUmR2Q29uZmlndXJhdGlvbkRhdGEgTkVYVF9SRFZfQ09ORjsKKworCUxpc3RPZkFQRXhlY3V0aW9uRGF0YSBSRFY7CisKKwlhdm1fdWludDY0X3QgbUVmZmVjdGl2ZVJkdkNvdW50OworCWF2bV91aW50NjRfdCBtRWZmZWN0aXZlTXVsdGlSZHZDb3VudDsKKworCitwdWJsaWM6CisJQXZtQ29tbXVuaWNhdGlvblJkdlByaW1pdGl2ZShBdm1QcmltaXRpdmVQcm9jZXNzb3IgJiBhUHJvY2Vzc29yLAorCQkJUmR2Q29uZmlndXJhdGlvbkRhdGEgJiBhUmR2Q29uZiwgYm9vbCBjaGVja1JkdiwgYm9vbCBjaGVja011bHRpUmR2KQorCTogQmFzZUF2bVByaW1pdGl2ZSggYVByb2Nlc3NvciApLAorCW1CYXNlUmR2Q29uZiggYVJkdkNvbmYgKSwKKwljaGVja1JkdkZsYWcoIGNoZWNrUmR2ICksCisJY2hlY2tNdWx0aVJkdkZsYWcoIGNoZWNrTXVsdGlSZHYgKSwKKwlQUkVWSU9VU19SRFZfQ09ORiggKSwKKwlDVVJSRU5UX1JEVl9DT05GKCApLAorCU5FWFRfUkRWX0NPTkYoICksCisJUkRWKCApLAorCisJbUVmZmVjdGl2ZVJkdkNvdW50KCAwICksCisJbUVmZmVjdGl2ZU11bHRpUmR2Q291bnQoIDAgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwl2aXJ0dWFsIH5Bdm1Db21tdW5pY2F0aW9uUmR2UHJpbWl0aXZlKCkKKwl7CisJCXdoaWxlKCBQUkVWSU9VU19SRFZfQ09ORi5ub25lbXB0eSgpICkKKwkJeworCQkJZGVsZXRlKCBQUkVWSU9VU19SRFZfQ09ORi5wb3BfbGFzdCgpICk7CisJCX0KKworCQl3aGlsZSggQ1VSUkVOVF9SRFZfQ09ORi5ub25lbXB0eSgpICkKKwkJeworCQkJZGVsZXRlKCBDVVJSRU5UX1JEVl9DT05GLnBvcF9sYXN0KCkgKTsKKwkJfQorCisJCXdoaWxlKCBORVhUX1JEVl9DT05GLm5vbmVtcHR5KCkgKQorCQl7CisJCQlkZWxldGUoIE5FWFRfUkRWX0NPTkYucG9wX2xhc3QoKSApOworCQl9CisJfQorCisKKwkvKioKKwkgKiBDT01QVVRFIEFMTCBSRFYKKwkgKi8KKwlzdGF0aWMgYm9vbCBjb21wdXRlUmR2KEF2bVByaW1pdGl2ZVByb2Nlc3NvciAmIGFQcm9jZXNzb3IsCisJCQlzdGQ6OnZlY3RvcjwgRXhlY3V0aW9uRW52aXJvbm1lbnQgPiAmIHRhYk9mRU5WKTsKKworCS8qKgorCSAqIHRoZSBSRVNVTUUgUkRWIGluc3RydWN0aW9uCisJICovCisKKwlib29sIGhhdmVSRFYoQVBFeGVjdXRpb25EYXRhICYgb3V0RUQsIEFQRXhlY3V0aW9uRGF0YSAmIGluRUQpOworCisJaW5saW5lIHZvaWQgdXBkYXRlUG9zc2libGVJbnRlcm5hbFJkdkZsYWdzKFJkdkNvbmZpZ3VyYXRpb25EYXRhICogYVJkdkNvbmYpCisJeworCQlpZiggY2hlY2tSZHZGbGFnICkKKwkJeworCQkJYVJkdkNvbmYtPnVwZGF0ZVBvc3NpYmxlSW50ZXJuYWxSZHZGbGFnKCk7CisJCX0KKwkJaWYoIGNoZWNrTXVsdGlSZHZGbGFnICkKKwkJeworCQkJYVJkdkNvbmYtPnVwZGF0ZVBvc3NpYmxlSW50ZXJuYWxNdWx0aVJkdkZsYWcoKTsKKwkJfQorCX0KKworCWJvb2wgcmVzdW1lX3JkdihMaXN0T2ZBUEV4ZWN1dGlvbkRhdGEgJiBhUkRWKTsKKworCWJvb2wgY29tcHV0ZUFsbFJkdigpOworCisJYm9vbCBjb21wbGV0ZUFsbFJkdigpOworCisJYm9vbCBjaGVja0ludGVybmFsUmR2KGJvb2wgaXNJbml0aWFsLCBSZHZDb25maWd1cmF0aW9uRGF0YSAqIGFSZHZDb25mKTsKKwlib29sIGNoZWNrSW50ZXJuYWxNdWx0aVJEVihib29sIGlzSW5pdGlhbCwgUmR2Q29uZmlndXJhdGlvbkRhdGEgKiBhUmR2Q29uZik7CisKKwlib29sIGNoZWNrV2l0aEluaXRpYWxSZHYoUmR2Q29uZmlndXJhdGlvbkRhdGEgKiBhUmR2Q29uZik7CisJYm9vbCBjaGVja1dpdGhJbml0aWFsTXVsdGlSZHYoUmR2Q29uZmlndXJhdGlvbkRhdGEgKiBhUmR2Q29uZik7CisKKwlib29sIGNoZWNrV2l0aEV4dGVybmFsUmR2KFJkdkNvbmZpZ3VyYXRpb25EYXRhICogYVJkdkNvbmYsCisJCQlSZHZDb25maWd1cmF0aW9uRGF0YSAqIG90aGVyUmR2Q29uZik7CisJYm9vbCBjaGVja1dpdGhFeHRlcm5hbE11bHRpUmR2KFJkdkNvbmZpZ3VyYXRpb25EYXRhICogYVJkdkNvbmYsCisJCQlSZHZDb25maWd1cmF0aW9uRGF0YSAqIG90aGVyUmR2Q29uZik7CisKKworCWJvb2wgY29tcHV0ZV9yZHYoUmR2Q29uZmlndXJhdGlvbkRhdGEgKiBhUmR2Q29uZiwKKwkJCWF2bV9vZmZzZXRfdCBvdXRPZmZzZXQsIEFQRXhlY3V0aW9uRGF0YSAmIG91dEVELAorCQkJYXZtX29mZnNldF90IGluT2Zmc2V0LCBBUEV4ZWN1dGlvbkRhdGEgJiBpbkVEKTsKKworCWJvb2wgY29tcHV0ZV9tdWx0aXJkdihMaXN0T2ZSZHZDb25maWd1cmF0aW9uRGF0YSAmIG11bHRpUmR2Q29uZik7CisJYm9vbCBjb21wdXRlX211bHRpcmR2KFJkdkNvbmZpZ3VyYXRpb25EYXRhICogYVJkdkNvbmYpOworCisKKwl2b2lkIGNvbXBsZXRlX3JkdihSZHZDb25maWd1cmF0aW9uRGF0YSAqICYgYVJkdkNvbmYsIGJvb2wgaXNNdWx0aSA9IGZhbHNlKTsKKwl2b2lkIGNvbXBsZXRlX211bHRpcmR2KFJkdkNvbmZpZ3VyYXRpb25EYXRhICogJiBhUmR2Q29uZik7CisKKwlib29sIGNvbXBsZXRlZF9yZHYoUmR2Q29uZmlndXJhdGlvbkRhdGEgKiBhUmR2Q29uZiwgYm9vbCBpc011bHRpKTsKKworCisJYm9vbCByZXN1bWVfcmR2KEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WLAorCQkJUmR2Q29uZmlndXJhdGlvbkRhdGEgKiBhUmR2Q29uZiwgYXZtX29mZnNldF90IG9mZnNldCk7CisKKwlib29sIHJlc3VtZV9yZHYoRXhlY3V0aW9uRW52aXJvbm1lbnQgJiB0bXBFTlYpOworCisKKwkvKioKKwkgKiBHTE9CQUxTCisJICovCisJc3RhdGljIGF2bV9zaXplX3QgR0xPQkFMX0VGRkVDVElWRV9SRFZfQ09VTlQ7CisJc3RhdGljIGF2bV9zaXplX3QgR0xPQkFMX0VGRkVDVElWRV9NVUxUSV9SRFZfQ09VTlQ7CisKKwlzdGF0aWMgdm9pZCByZXBvcnRHbG9iYWxTdGF0aXN0aWNzKE91dFN0cmVhbSAmIG9zKTsKKworfTsKKworCisKK30KKworI2VuZGlmIC8qIEFWTUNPTU1VTklDQVRJT05SRFZQUklNSVRJVkVfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1Db25jdXJyZW5jeVByaW1pdGl2ZS5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtQ29uY3VycmVuY3lQcmltaXRpdmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNTU2ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtQ29uY3VycmVuY3lQcmltaXRpdmUuY3BwCkBAIC0wLDAgKzEsMTE5MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDIwIG1haSAyMDEwCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJBdm1Db25jdXJyZW5jeVByaW1pdGl2ZS5oIgorCisjaW5jbHVkZSA8Y29tcHV0ZXIvRXhlY3V0aW9uRW52aXJvbm1lbnQuaD4KKworI2luY2x1ZGUgPGNvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1Db21tdW5pY2F0aW9uUmR2UHJpbWl0aXZlLmg+CisjaW5jbHVkZSA8Y29tcHV0ZXIvcHJpbWl0aXZlL0F2bVN5bmNocm9uaXphdGlvbkZhY3RvcnkuaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0F2bUNvZGUuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL1J1bnRpbWVJRC5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV4ZWN1dGlvbiBvZiBhbiBJTlRFUkxFQVZJTkcgcHJvZ3JhbQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitib29sIEF2bVByaW1pdGl2ZV9JbnRlcmxlYXZpbmc6OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdCA9IEVOVi5pbkNPREUtPmJlZ2luKCk7CisJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBFTlYuaW5DT0RFLT5lbmQoKTsKKwlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwl7CisJCUVOVi5ydW4oICppdCApOworCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCitib29sIEF2bVByaW1pdGl2ZV9SZHZJbnRlcmxlYXZpbmc6OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlFeGVjdXRpb25FbnZpcm9ubWVudCB0bXBFTlYoRU5WLCBCRkNvZGU6OlJFRl9OVUxMKTsKKwlBUEV4ZWN1dGlvbkRhdGEgdG1wRUQ7CisKKwlSZHZDb25maWd1cmF0aW9uRGF0YSBhUmR2Q29uZihFTlYsIEVOVi5pbkNPREUtPnNpemUoKSk7CisJYm9vbCBjaGVja1JkdiA9IGZhbHNlOworCWJvb2wgY2hlY2tNdWx0aVJkdiA9IGZhbHNlOworCisJYm9vbCBoYXNDb20gPSBmYWxzZTsKKworCWF2bV9vZmZzZXRfdCBpZHggPSAwOworCisJTGlzdE9mQVBFeGVjdXRpb25EYXRhIGxpc3RvZlJEVjsKKworCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gRU5WLmluQ09ERS0+YmVnaW4oKTsKKwlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IEVOVi5pbkNPREUtPmVuZCgpOworCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCXsKKwkJaWYoIG5vdCB0bXBFTlYucnVuKCppdCkgKQorCQl7CisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKworLy8JCUFWTV9PU19DT1VUIDw8ICJBdm1QcmltaXRpdmVfUmR2SW50ZXJsZWF2aW5nOjpydW4gOj4iIDw8IHN0ZDo6ZW5kbDsKKy8vCQl0bXBFTlYudG9TdHJlYW0oQVZNX09TX0NPVVQpOworCisJCXdoaWxlKCB0bXBFTlYuc3luY0VEUy5ub25lbXB0eSgpICkKKwkJeworCQkJdG1wRU5WLnN5bmNFRFMucG9wX2ZpcnN0X3RvKCB0bXBFRCApOworCisJCQlzd2l0Y2goIHRtcEVELT5tQUVFUyApCisJCQl7CisJCQkJY2FzZSBBRUVTX1dBSVRJTkdfSU5DT01fUkRWOgorCQkJCXsKKwkJCQkJaGFzQ29tID0gdHJ1ZTsKKworCQkJCQlpZiggdG1wRUQtPm1FWEVDX1NZTkNfUE9JTlQtPm1Sb3V0aW5nRGF0YS5pc1Byb3RvY29sUkRWKCkgKQorCQkJCQl7CisJCQkJCQlhUmR2Q29uZi5JTl9FRF9SRFZbIGlkeCBdLmFwcGVuZCggdG1wRUQgKTsKKwkJCQkJCWFSZHZDb25mLm1Bd2FpdGluZ091dHB1dFJkdkZsYWdbIGlkeCBdID0gdHJ1ZTsKKwkJCQkJCWNoZWNrUmR2ID0gdHJ1ZTsKKwkJCQkJfQorCQkJCQllbHNlIGlmKCB0bXBFRC0+bUVYRUNfU1lOQ19QT0lOVC0+bVJvdXRpbmdEYXRhLgorCQkJCQkJCWlzUHJvdG9jb2xNVUxUSV9SRFYoKSApCisJCQkJCXsKKwkJCQkJCWFSZHZDb25mLkVEX01VTFRJUkRWWyBpZHggXS5hcHBlbmQoIHRtcEVEICk7CisJCQkJCQlhUmR2Q29uZi5tQXdhaXRpbmdPdXRwdXRNdWx0aVJkdkZsYWdbIGlkeCBdID0gdHJ1ZTsKKwkJCQkJCWNoZWNrTXVsdGlSZHYgPSB0cnVlOworCQkJCQl9CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJY2FzZSBBRUVTX1dBSVRJTkdfT1VUQ09NX1JEVjoKKwkJCQl7CisJCQkJCWhhc0NvbSA9IHRydWU7CisKKwkJCQkJaWYoIHRtcEVELT5tRVhFQ19TWU5DX1BPSU5ULT5tUm91dGluZ0RhdGEuaXNQcm90b2NvbFJEVigpICkKKwkJCQkJeworCQkJCQkJYVJkdkNvbmYuT1VUX0VEX1JEVlsgaWR4IF0uYXBwZW5kKCB0bXBFRCApOworCQkJCQkJYVJkdkNvbmYubUF3YWl0aW5nSW5wdXRSZHZGbGFnWyBpZHggXSA9IHRydWU7CisJCQkJCQljaGVja1JkdiA9IHRydWU7CisJCQkJCX0KKwkJCQkJZWxzZSBpZiggdG1wRUQtPm1FWEVDX1NZTkNfUE9JTlQtPm1Sb3V0aW5nRGF0YS4KKwkJCQkJCQlpc1Byb3RvY29sTVVMVElfUkRWKCkgKQorCQkJCQl7CisJCQkJCQlhUmR2Q29uZi5FRF9NVUxUSVJEVlsgaWR4IF0uYXBwZW5kKCB0bXBFRCApOworCQkJCQkJYVJkdkNvbmYubUF3YWl0aW5nSW5wdXRNdWx0aVJkdkZsYWdbIGlkeCBdID0gdHJ1ZTsKKwkJCQkJCWNoZWNrTXVsdGlSZHYgPSB0cnVlOworCQkJCQl9CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQkJPDwgIlVuZXhwZWN0ZWQgRU5ESU5EIEVYRUNVVElPTiBTVEFUVVMgOj4gIgorCQkJCQkJCTw8IFJ1bnRpbWVEZWY6OnN0ckFFRVMoIHRtcEVELT5tQUVFUyApIDw8ICIgISEhIgorCQkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYoIGhhc0NvbSApCisJCXsKKwkJCWlkeCA9IGlkeCArIDE7CisKKwkJCWhhc0NvbSA9IGZhbHNlOworCQl9CisJfQorCisJLy8gb3V0cHV0IEVEUyB0cmFpdGVtZW50CisJRU5WLnNwbGljZU91dHB1dCh0bXBFTlYpOworCisJLy8gU3luYyBFRFMgdHJhaXRlbWVudAorCWlmKCBpZHggPiAxICkKKwl7CisJCWFSZHZDb25mLnJlc2l6ZSggaWR4ICk7CisKKwkJaWYoIGNoZWNrUmR2ICkKKwkJeworCQkJYVJkdkNvbmYudXBkYXRlUG9zc2libGVJbnRlcm5hbFJkdkZsYWcoKTsKKwkJfQorCQlpZiggY2hlY2tNdWx0aVJkdiApCisJCXsKKwkJCWFSZHZDb25mLnVwZGF0ZVBvc3NpYmxlSW50ZXJuYWxNdWx0aVJkdkZsYWcoKTsKKwkJfQorCisJCWlmKCBhUmR2Q29uZi5oYXNQb3NzaWJsZUludGVybmFsUmR2RmxhZyB8fCBhUmR2Q29uZi5oYXNQb3NzaWJsZUludGVybmFsTXVsdGlSZHZGbGFnICkKKwkJeworCQkJQXZtQ29tbXVuaWNhdGlvblJkdlByaW1pdGl2ZSByZHZDb21wdXRlcihQUklNSVRJVkVfUFJPQ0VTU09SLCBhUmR2Q29uZiwgY2hlY2tSZHYsIGNoZWNrTXVsdGlSZHYpOworCisJCQlpZiggcmR2Q29tcHV0ZXIucmVzdW1lX3JkdihsaXN0b2ZSRFYpICkKKwkJCXsKKwkJCQlFTlYub3V0RURTLnNwbGljZSggbGlzdG9mUkRWICk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXhlY3V0aW9uIG9mIGFuIEFTWU5DSFJPTk9VUyBwcm9ncmFtCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK2Jvb2wgQXZtUHJpbWl0aXZlX0FzeW5jaHJvbm91czo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQk8PCAiVE9ETyBQcmltaXRpdmU8IHxhfCA+OjpydW4oIEVOViApIgorCQkJCSIgYS5rLmEgQVN5bmNocm9ub3VzOjpydW4oIEVOViApICEhISIKKwkJCTw8IFNFTkRfRVhJVDsKKworCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gRU5WLmluQ09ERS0+ZW5kKCk7CisJZm9yKCBBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdCA9IEVOVi5pbkNPREUtPmJlZ2luKCkgOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCXsKKwkJRU5WLnJ1biggKml0ICk7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworYm9vbCBBdm1QcmltaXRpdmVfUmR2QXN5bmNocm9ub3VzOjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCTw8ICJUT0RPIFByaW1pdGl2ZTwgfHxhfHwgPjo6cnVuKCBFTlYgKSIKKwkJCQkiIGEuay5hIFJEVjwgQVN5bmNocm9ub3VzID46OnJ1biggRU5WICkgISEhIgorCQkJPDwgU0VORF9FWElUOworCisJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBFTlYuaW5DT0RFLT5lbmQoKTsKKwlmb3IoIEF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gRU5WLmluQ09ERS0+YmVnaW4oKSA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJeworCQlFTlYucnVuKCAqaXQgKTsKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXhlY3V0aW9uIG9mIGEgU1RST05HIFNZTkNIUk9OT1VTIHByb2dyYW0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworYm9vbCBBdm1QcmltaXRpdmVfU3Ryb25nU3luY2hyb25vdXM6OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGEgdG1wTGlzdE9mRUQ7CisKKwlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGEgZnVzaW9uTGlzdE9mT3V0cHV0RUQ7CisKKwlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGE6Oml0ZXJhdG9yIGl0RUQ7CisJTGlzdE9mQVBFeGVjdXRpb25EYXRhOjppdGVyYXRvciBlbmRJdEVEOworCisJQVBFeGVjdXRpb25EYXRhIHRtcEVEOworCUFQRXhlY3V0aW9uRGF0YSBhbkVEOworCisJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBFTlYuaW5DT0RFLT5lbmQoKTsKKwlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdCA9IEVOVi5pbkNPREUtPmJlZ2luKCk7CisKKwkvLyBJbml0aWFsaXNhdGlvbiBkdSBwcm9jZXNzCisJRXhlY3V0aW9uRW52aXJvbm1lbnQgdG1wRU5WKEVOViwgKml0KTsKKwlpZiggbm90IHRtcEVOVi5ydW4oKSApCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJaWYoIHRtcEVOVi5vdXRFRFMubm9uZW1wdHkoKSApCisJeworCQl0bXBMaXN0T2ZFRC5zcGxpY2UoIHRtcEVOVi5vdXRFRFMgKTsKKwl9CisJZWxzZQorCXsKKwkJLy8gaWYgYW4gZXhlY3V0aW9uIGZhaWwsIHRoaXMgZXhlY3V0aW9uIGZhaWwgdG8hISEhIQorCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJZm9yKCArK2l0IDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwl7CisJCWlmKCBub3QgdG1wRU5WLnJ1bigqaXQpICkKKwkJeworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisKKwkJaWYoIHRtcEVOVi5vdXRFRFMuZW1wdHkoKSApCisJCXsKKwkJCS8vIGlmIGEgbG9jYWwgZXhlY3V0aW9uIGZhaWwsIHRoaXMgZ2xvYmFsIGV4ZWN1dGlvbiBmYWlsIHRvISEhISEKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCisKKwkJLy8gQ09NUFVURSBTVFJPTkcgRlVTSU9OCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBDT01QVVRJTkcgLCBTVEFURU1FTlQgKQorCQlBVk1fT1NfVFJBQ0UgPDwgIjw8ICIgPDwgRU5WLmluRUQtPm1SSUQuc3RyVW5pcUlkKCkKKwkJCQk8PCAiIHw9PiBzdHJvbmcgZnVzaW9uIGZvciBFRCA6PiAiCisJCQkJPDwgImZyc3RMaXN0KCAiIDw8IHRtcEVOVi5vdXRFRFMuc2l6ZSgpIDw8ICIgKSIgPDwgIiB3aXRoICIKKwkJCQk8PCAic2NuZExpc3QoICIgPDwgdG1wTGlzdE9mRUQuc2l6ZSgpIDw8ICIgKSIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgQ09NUFVUSU5HICwgU1RBVEVNRU5UICkKKworCQlpZiggdG1wTGlzdE9mRUQuZW1wdHkoKSApCisJCXsKKwkJCXRtcExpc3RPZkVELnNwbGljZSh0bXBFTlYub3V0RURTKTsKKwkJfQorCQllbHNlIGlmKCB0bXBFTlYub3V0RURTLm5vbmVtcHR5KCkgKQorCQl7CisJCQlkbworCQkJeworCQkJCXRtcEVOVi5vdXRFRFMucG9wX2ZpcnN0X3RvKCB0bXBFRCApOworCisJCQkJZW5kSXRFRCA9IHRtcExpc3RPZkVELmVuZCgpOworCQkJCWZvciAoIGl0RUQgPSB0bXBMaXN0T2ZFRC5iZWdpbigpIDsgaXRFRCAhPSBlbmRJdEVEIDsgKytpdEVEICkKKwkJCQl7CisJCQkJCWFuRUQgPSBBdm1TeW5jaHJvbml6YXRpb25GYWN0b3J5OjpmdXNpb24oCisJCQkJCQkJRU5WLmluRUQsIHRtcEVELCAoKml0RUQpKTsKKwkJCQkJaWYoIGFuRUQudmFsaWQoKSApCisJCQkJCXsKKwkJCQkJCWZ1c2lvbkxpc3RPZk91dHB1dEVELmFwcGVuZCggYW5FRCApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJd2hpbGUoIHRtcEVOVi5vdXRFRFMubm9uZW1wdHkoKSApOworCisJCQl0bXBMaXN0T2ZFRC5jbGVhcigpOworCQkJdG1wTGlzdE9mRUQuc3BsaWNlKGZ1c2lvbkxpc3RPZk91dHB1dEVEKTsKKwkJfQorCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBDT01QVVRJTkcgLCBTVEFURU1FTlQgKQorCQlBVk1fT1NfVFJBQ0UgPDwgIj4+ICIgPDwgRU5WLmluRUQtPm1SSUQuc3RyVW5pcUlkKCkKKwkJPDwgIiB8PT4gcmVzdWx0KCAiIDw8IHRtcExpc3RPZkVELnNpemUoKSA8PCAiICkiIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIENPTVBVVElORyAsIFNUQVRFTUVOVCApCisJfQorCisJRU5WLm91dEVEUy5zcGxpY2UoIHRtcExpc3RPZkVEICk7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCitib29sIEF2bVByaW1pdGl2ZV9SZHZTdHJvbmdTeW5jaHJvbm91czo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQk8PCAiVE9ETyBQcmltaXRpdmU8IHx8YW5kfHwgPjo6cnVuKCBFTlYgKSIKKwkJCQkiIGEuay5hIFJEVjwgU3Ryb25nU3luY2hyb25vdXMgPjo6cnVuKCBFTlYgKSAhISEiCisJCQk8PCBTRU5EX0VYSVQ7CisKKwlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IEVOVi5pbkNPREUtPmVuZCgpOworCWZvciggQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBFTlYuaW5DT0RFLT5iZWdpbigpIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwl7CisJCUVOVi5ydW4oICppdCApOworCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBleGVjdXRpb24gb2YgYSBXRUFLIFNZTkNIUk9OT1VTIHByb2dyYW0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworYm9vbCBBdm1QcmltaXRpdmVfV2Vha1N5bmNocm9ub3VzOjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJRU5WLmluRUQtPnNldEVuYWJsZWRMb2NhbE5vZGVDb25kaXRpb24oIHRydWUgKTsKKworCUxpc3RPZkFQRXhlY3V0aW9uRGF0YSBvbmVMaXN0T2ZFRDsKKwlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGEgb3RoZXJMaXN0T2ZFRDsKKwlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGEgcmVzdWx0TGlzdE9mRUQ7CisKKwlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdCA9IEVOVi5pbkNPREUtPmJlZ2luKCk7CisJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBFTlYuaW5DT0RFLT5lbmQoKTsKKworCS8vIEluaXRpYWxpc2F0aW9uIGR1IHByb2Nlc3MKKwlFeGVjdXRpb25FbnZpcm9ubWVudCB0bXBFTlYoRU5WLCAqaXQpOworCWlmKCBub3QgdG1wRU5WLnJ1bigpICkKKwl7CisJCXJldHVybiggZmFsc2UgKTsKKwl9CisJb25lTGlzdE9mRUQuc3BsaWNlKCB0bXBFTlYub3V0RURTICk7CisKKwkvLyBSZWN1cnJlbmNlCisJZm9yKCArK2l0IDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwl7CisJCWlmKCBub3QgdG1wRU5WLnJ1bigqaXQpICkKKwkJeworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisKKwkJY29tcHV0ZVdlYWtTeW5jaHJvbm91cyhFTlYuaW5FRCwKKwkJCQlvbmVMaXN0T2ZFRCwgdG1wRU5WLm91dEVEUywgcmVzdWx0TGlzdE9mRUQpOworCisJCW9uZUxpc3RPZkVELmNsZWFyKCk7CisJCW90aGVyTGlzdE9mRUQuY2xlYXIoKTsKKwkJd2hpbGUoIHJlc3VsdExpc3RPZkVELm5vbmVtcHR5KCkgKQorCQl7CisJCQlyZXN1bHRMaXN0T2ZFRC5sYXN0KCktPnNldEVuYWJsZWRMb2NhbE5vZGVDb25kaXRpb24oIGZhbHNlICk7CisKKwkJCW9uZUxpc3RPZkVELmFwcGVuZCggcmVzdWx0TGlzdE9mRUQucG9wX2xhc3QoKSApOworCQl9CisJfQorCisJRU5WLmluRUQtPnNldEVuYWJsZWRMb2NhbE5vZGVDb25kaXRpb24oIGZhbHNlICk7CisKKwlFTlYub3V0RURTLnNwbGljZSggb25lTGlzdE9mRUQgKTsKKworCXJldHVybiggdHJ1ZSApOworfQorCisKKworYm9vbCBBdm1QcmltaXRpdmVfV2Vha1N5bmNocm9ub3VzOjpjb21wdXRlV2Vha1N5bmNocm9ub3VzKAorCQlBUEV4ZWN1dGlvbkRhdGEgJiBhbklucHV0RUQsIExpc3RPZkFQRXhlY3V0aW9uRGF0YSAmIG9uZUxpc3RPZkVELAorCQlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGEgJiBvdGhlckxpc3RPZkVELAorCQlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGEgJiByZXN1bHRMaXN0T2ZFRCkKK3sKKwlpZiggb3RoZXJMaXN0T2ZFRC5lbXB0eSgpICkKKwl7CisJCXJlc3VsdExpc3RPZkVELnNwbGljZSggb25lTGlzdE9mRUQgKTsKKwl9CisKKwllbHNlIGlmKCBvbmVMaXN0T2ZFRC5lbXB0eSgpICkKKwl7CisJCXJlc3VsdExpc3RPZkVELnNwbGljZSggb3RoZXJMaXN0T2ZFRCApOworCX0KKworCWVsc2UKKwl7CisJCUxpc3RPZkFQRXhlY3V0aW9uRGF0YTo6aXRlcmF0b3IgaXRPdGhlciA9IG90aGVyTGlzdE9mRUQuYmVnaW4oKTsKKwkJTGlzdE9mQVBFeGVjdXRpb25EYXRhOjppdGVyYXRvciBlbmRPdGhlciA9IG90aGVyTGlzdE9mRUQuZW5kKCk7CisJCWZvciggOyBpdE90aGVyICE9IGVuZE90aGVyIDsgKytpdE90aGVyICkKKwkJeworCQkJaWYoIG5vdCBjb21wdXRlV2Vha1N5bmNocm9ub3VzKGFuSW5wdXRFRCwKKwkJCQkJKml0T3RoZXIsIG9uZUxpc3RPZkVELCByZXN1bHRMaXN0T2ZFRCkgKQorCQkJeworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJfQorCX0KKworCXJlc3VsdExpc3RPZkVELm1ha2VVbmlxdWUoKTsKKworCXJldHVybiggdHJ1ZSApOworfQorCisKK2Jvb2wgQXZtUHJpbWl0aXZlX1dlYWtTeW5jaHJvbm91czo6Y29tcHV0ZVdlYWtTeW5jaHJvbm91cygKKwkJQVBFeGVjdXRpb25EYXRhICYgYW5JbnB1dEVELCBBUEV4ZWN1dGlvbkRhdGEgJiBvbmVFRCwKKwkJTGlzdE9mQVBFeGVjdXRpb25EYXRhICYgbGlzdE9mT3RoZXJFRCwKKwkJQ29sbGVjdGlvbk9mQVBFeGVjdXRpb25EYXRhICYgbGlzdE9mT3V0cHV0RUQpCit7CisJQVBFeGVjdXRpb25EYXRhIGFuRUQ7CisKKwlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGE6Oml0ZXJhdG9yIGl0T3RoZXI7CisJTGlzdE9mQVBFeGVjdXRpb25EYXRhOjppdGVyYXRvciBlbmRPdGhlciA9IGxpc3RPZk90aGVyRUQuZW5kKCk7CisKKwkvLyBGdXNpb24gd2l0aCBPVEhFUlMKKwlmb3IoIGl0T3RoZXIgPSBsaXN0T2ZPdGhlckVELmJlZ2luKCkgOyBpdE90aGVyICE9IGVuZE90aGVyIDsgKytpdE90aGVyICkKKwl7CisJCWFuRUQgPSBBdm1TeW5jaHJvbml6YXRpb25GYWN0b3J5OjpmdXNpb24oYW5JbnB1dEVELCBvbmVFRCwgKml0T3RoZXIpOworCQlpZiggYW5FRCAhPSBOVUxMICkKKwkJeworCQkJbGlzdE9mT3V0cHV0RUQuYXBwZW5kKCBhbkVEICk7CisJCX0KKwl9CisKKwkvLyBDb21wdXRlIE9USEVSIHdoZXJlIE5PVCBPTkUKKwlpZiggbm90IGV2YWxFeGNsdXNpdmUoYW5JbnB1dEVELCBsaXN0T2ZPdGhlckVELCBvbmVFRCwgbGlzdE9mT3V0cHV0RUQpICkKKwl7CisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKworCS8vIENvbXB1dGUgT05FIHdoZXJlIE5PVCBPVEhFUlMKKwlyZXR1cm4oIGV2YWxFeGNsdXNpdmUoYW5JbnB1dEVELCBvbmVFRCwgbGlzdE9mT3RoZXJFRCwgbGlzdE9mT3V0cHV0RUQpICk7Cit9CisKKworYm9vbCBBdm1QcmltaXRpdmVfV2Vha1N5bmNocm9ub3VzOjpjb21wdXRlV2Vha1N5bmNocm9ub3VzKAorCQlBUEV4ZWN1dGlvbkRhdGEgJiBhbklucHV0RUQsIEFQRXhlY3V0aW9uRGF0YSAmIG9uZUVELAorCQlBUEV4ZWN1dGlvbkRhdGEgJiBvdGhlckVELAorCQlDb2xsZWN0aW9uT2ZBUEV4ZWN1dGlvbkRhdGEgJiBsaXN0T2ZPdXRwdXRFRCkKK3sKKwlBUEV4ZWN1dGlvbkRhdGEgYW5FRCA9IEF2bVN5bmNocm9uaXphdGlvbkZhY3Rvcnk6OmZ1c2lvbigKKwkJCWFuSW5wdXRFRCwgb25lRUQsIG90aGVyRUQpOworCWlmKCBhbkVELnZhbGlkKCkgKQorCXsKKwkJbGlzdE9mT3V0cHV0RUQuYXBwZW5kKCBhbkVEICk7CisJfQorCisJLy8gQ29tcHV0ZSBPVEhFUiB3aGVyZSBOT1QgT05FCisJaWYoIG5vdCBldmFsRXhjbHVzaXZlKGFuSW5wdXRFRCwgb3RoZXJFRCwgb25lRUQsIGxpc3RPZk91dHB1dEVEKSApCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJLy8gQ29tcHV0ZSBPTkUgd2hlcmUgTk9UIE9USEVSUworCXJldHVybiggZXZhbEV4Y2x1c2l2ZShhbklucHV0RUQsIG9uZUVELCBvdGhlckVELCBsaXN0T2ZPdXRwdXRFRCkgKTsKK30KKworCitib29sIEF2bVByaW1pdGl2ZV9SZHZXZWFrU3luY2hyb25vdXM6OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJPDwgIlRPRE8gUHJpbWl0aXZlPCB8fG9yfHwgPjo6cnVuKCBFTlYgKSIKKwkJCQkiIGEuay5hIFJEVjwgV2Vha1N5bmNocm9ub3VzID46OnJ1biggRU5WICkgISEhIgorCQkJPDwgU0VORF9FWElUOworCisJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBFTlYuaW5DT0RFLT5lbmQoKTsKKwlmb3IoIEF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gRU5WLmluQ09ERS0+YmVnaW4oKSA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJeworCQlFTlYucnVuKCAqaXQgKTsKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisKKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV4ZWN1dGlvbiBvZiBhIFBBUkFMTEVMIHByb2dyYW0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworYm9vbCBBdm1QcmltaXRpdmVfUGFyYWxsZWw6OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKy8vCWF2bV9vZmZzZXRfdCBpZHg7CisvLworLy8Jc3RkOjp2ZWN0b3I8IEV4ZWN1dGlvbkVudmlyb25tZW50ID4gdGFiT2ZFTlYoCisvLwkJCUVOVi5pbkNPREUtPnNpemUoKSwgRXhlY3V0aW9uRW52aXJvbm1lbnQoRU5WLCBFTlYuaW5FRCkgKTsKKy8vCisvLwlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdCA9IEVOVi5pbkNPREUtPmJlZ2luKCk7CisvLwlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdEVuZCA9IEVOVi5pbkNPREUtPmVuZCgpOworLy8KKy8vCS8vIENhcyBkZSBsJ8OpdmVudHVlbCBwcmVtaWVyIGV4aXRFRFMKKy8vCWZvciggaWR4ID0gMCA7IGl0ICE9IGl0RW5kIDsgKytpdCwgKytpZHggKQorLy8JeworLy8JCWlmKCBub3QgdGFiT2ZFTlZbaWR4XS5ydW4oKml0KSApCisvLwkJeworLy8JCQlyZXR1cm4oIGZhbHNlICk7CisvLwkJfQorLy8JfQorCisJTGlzdE9mQVBFeGVjdXRpb25EYXRhIGZ1c2lvbkxpc3RPZk91dHB1dEVEOworCUxpc3RPZkFQRXhlY3V0aW9uRGF0YSBwYXJhbGxlbE91dHB1dEVEOworCisJTGlzdE9mQVBFeGVjdXRpb25EYXRhIGZ1c2lvbkxpc3RPZkV4aXRFRDsKKwlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGEgcGFyYWxsZWxFeGl0RUQ7CisKKwlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdCA9IEVOVi5pbkNPREUtPmJlZ2luKCk7CisJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBFTlYuaW5DT0RFLT5lbmQoKTsKKworCS8vIENhcyBkZSBsJ8OpdmVudHVlbCBwcmVtaWVyIGV4aXRFRFMKKwlmb3IoIDsgKGl0ICE9IGl0RW5kKSAmJiBwYXJhbGxlbEV4aXRFRC5lbXB0eSgpIDsgKytpdCApCisJeworCQlFeGVjdXRpb25FbnZpcm9ubWVudCB0bXBFTlYoRU5WLCAqaXQpOworCQlpZiggdG1wRU5WLnJ1bigpICkKKwkJeworCQkJRU5WLnNwbGljZU5vdE91dHB1dEV4aXQodG1wRU5WKTsKKworCQkJaWYoIHRtcEVOVi5leGl0RURTLm5vbmVtcHR5KCkgKQorCQkJeworCQkJCWNvbXB1dGVQYXJhbGxlbChFTlYuaW5FRCwgdG1wRU5WLmV4aXRFRFMsCisJCQkJCQlwYXJhbGxlbE91dHB1dEVELCBwYXJhbGxlbEV4aXRFRCk7CisJCQl9CisKKwkJCWlmKCB0bXBFTlYub3V0RURTLm5vbmVtcHR5KCkgKQorCQkJeworCQkJCWNvbXB1dGVQYXJhbGxlbChFTlYuaW5FRCwgdG1wRU5WLm91dEVEUywKKwkJCQkJCXBhcmFsbGVsT3V0cHV0RUQsIGZ1c2lvbkxpc3RPZk91dHB1dEVEKTsKKworCQkJCXBhcmFsbGVsT3V0cHV0RUQuY2xlYXIoKTsKKwkJCQlwYXJhbGxlbE91dHB1dEVELnNwbGljZShmdXNpb25MaXN0T2ZPdXRwdXRFRCk7CisJCQl9CisJCQllbHNlIGlmKCB0bXBFTlYuZXhpdEVEUy5ub25lbXB0eSgpICkKKwkJCXsKKwkJCQlwYXJhbGxlbE91dHB1dEVELmNsZWFyKCk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKwl9CisKKwkvLyBDYXMgZGUgY29oYWJpdGF0aW9uIG91dEVEUyBldCBleGl0RURTCisJZm9yKCA7IChpdCAhPSBpdEVuZCkgJiYgcGFyYWxsZWxPdXRwdXRFRC5ub25lbXB0eSgpIDsgKytpdCApCisJeworCQlFeGVjdXRpb25FbnZpcm9ubWVudCB0bXBFTlYoRU5WLCAqaXQpOworCQlpZiggdG1wRU5WLnJ1bigpICkKKwkJeworCQkJRU5WLnNwbGljZU5vdE91dHB1dEV4aXQodG1wRU5WKTsKKworCQkJaWYoIHRtcEVOVi5vdXRFRFMubm9uZW1wdHkoKSApCisJCQl7CisJCQkJLy8gQ29tcG9zaXRpb24gZW50cmUgPDwgcHVycyBPdXRwdXQgPj4KKwkJCQljb21wdXRlUGFyYWxsZWwoRU5WLmluRUQsIHRtcEVOVi5vdXRFRFMsCisJCQkJCQlwYXJhbGxlbE91dHB1dEVELCBmdXNpb25MaXN0T2ZPdXRwdXRFRCk7CisKKwkJCQkvLyBDb21wb3NpdGlvbiBhdmVjIGxlcyA8PCBFeGl0IHByw6ljw6lkZW50cyA+PgorCQkJCWNvbXB1dGVQYXJhbGxlbChFTlYuaW5FRCwgdG1wRU5WLm91dEVEUywKKwkJCQkJCXBhcmFsbGVsRXhpdEVELCBmdXNpb25MaXN0T2ZFeGl0RUQpOworCQkJfQorCisJCQlpZiggdG1wRU5WLmV4aXRFRFMubm9uZW1wdHkoKSApCisJCQl7CisJCQkJLy8gQ29tcG9zaXRpb24gYXZlYyBsZXMgPDwgT3V0cHV0IHByw6ljw6lkZW50cyA+PgorCQkJCWNvbXB1dGVQYXJhbGxlbChFTlYuaW5FRCwgdG1wRU5WLmV4aXRFRFMsCisJCQkJCQlwYXJhbGxlbE91dHB1dEVELCBmdXNpb25MaXN0T2ZFeGl0RUQpOworCisJCQkJLy8gQ29tcG9zaXRpb24gZW50cmUgPDwgcHVycyBFeGl0ID4+CisJCQkJY29tcHV0ZVBhcmFsbGVsKEVOVi5pbkVELCB0bXBFTlYuZXhpdEVEUywKKwkJCQkJCXBhcmFsbGVsRXhpdEVELCBmdXNpb25MaXN0T2ZFeGl0RUQpOworCisJCQl9CisKKwkJCWlmKCB0bXBFTlYub3V0RURTLm5vbmVtcHR5KCkgfHwgdG1wRU5WLmV4aXRFRFMubm9uZW1wdHkoKSApCisJCQl7CisJCQkJcGFyYWxsZWxPdXRwdXRFRC5jbGVhcigpOworCQkJCXBhcmFsbGVsT3V0cHV0RUQuc3BsaWNlKGZ1c2lvbkxpc3RPZk91dHB1dEVEKTsKKworCQkJCXBhcmFsbGVsRXhpdEVELmNsZWFyKCk7CisJCQkJcGFyYWxsZWxFeGl0RUQuc3BsaWNlKGZ1c2lvbkxpc3RPZkV4aXRFRCk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKwl9CisKKwkvLyBDYXMgb3UgdG91dCBsZSBtb25kZSBlc3QgY29udGFtaW7DqSBwYXIgZXhpdEVEUworCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQorCXsKKwkJRXhlY3V0aW9uRW52aXJvbm1lbnQgdG1wRU5WKEVOViwgKml0KTsKKwkJaWYoIHRtcEVOVi5ydW4oKSApCisJCXsKKwkJCUVOVi5zcGxpY2VOb3RPdXRwdXRFeGl0KHRtcEVOVik7CisKKwkJCWlmKCB0bXBFTlYub3V0RURTLm5vbmVtcHR5KCkgKQorCQkJeworCQkJCWNvbXB1dGVQYXJhbGxlbChFTlYuaW5FRCwgdG1wRU5WLm91dEVEUywKKwkJCQkJCXBhcmFsbGVsRXhpdEVELCBmdXNpb25MaXN0T2ZFeGl0RUQpOworCQkJfQorCQkJaWYoIHRtcEVOVi5leGl0RURTLm5vbmVtcHR5KCkgKQorCQkJeworCQkJCWNvbXB1dGVQYXJhbGxlbChFTlYuaW5FRCwgdG1wRU5WLmV4aXRFRFMsCisJCQkJCQlwYXJhbGxlbEV4aXRFRCwgZnVzaW9uTGlzdE9mRXhpdEVEKTsKKwkJCX0KKworCQkJaWYoIHRtcEVOVi5vdXRFRFMubm9uZW1wdHkoKSB8fCB0bXBFTlYuZXhpdEVEUy5ub25lbXB0eSgpICkKKwkJCXsKKwkJCQlwYXJhbGxlbEV4aXRFRC5jbGVhcigpOworCQkJCXBhcmFsbGVsRXhpdEVELnNwbGljZShmdXNpb25MaXN0T2ZFeGl0RUQpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorCisKKwlFTlYub3V0RURTLnNwbGljZSggcGFyYWxsZWxPdXRwdXRFRCApOworCUVOVi5leGl0RURTLnNwbGljZSggcGFyYWxsZWxFeGl0RUQgKTsKKworCXJldHVybiggdHJ1ZSApOworfQorCisKK3ZvaWQgQXZtUHJpbWl0aXZlX1BhcmFsbGVsOjpjb21wdXRlUGFyYWxsZWwoQVBFeGVjdXRpb25EYXRhICYgcmVmRUQsCisJCUxpc3RPZkFQRXhlY3V0aW9uRGF0YSAmIG91dEVEUywKKwkJTGlzdE9mQVBFeGVjdXRpb25EYXRhICYgcHJldlBhcmFsbGVsTGlzdE9mT3V0cHV0RUQsCisJCUxpc3RPZkFQRXhlY3V0aW9uRGF0YSAmIGxpc3RPZk91dHB1dEVEKQoreworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgQ09NUFVUSU5HICwgU1RBVEVNRU5UICkKKwlBVk1fT1NfVFJBQ0UgPDwgIjw8ICIgPDwgcmVmRUQtPm1SSUQuc3RyVW5pcUlkKCkKKwkJCTw8ICIgfD0+IHBhcmFsbGVsIGZ1c2lvbiBmb3IgRUQgOj4gIgorCQkJPDwgImZyc3RMaXN0KCAiIDw8IG91dEVEUy5zaXplKCkgPDwgIiApIHdpdGggIgorCQkJPDwgInNjbmRMaXN0KCAiIDw8IHByZXZQYXJhbGxlbExpc3RPZk91dHB1dEVELnNpemUoKQorCQkJPDwgIiApIiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBDT01QVVRJTkcgLCBTVEFURU1FTlQgKQorCisJaWYoIHByZXZQYXJhbGxlbExpc3RPZk91dHB1dEVELmVtcHR5KCkgKQorCXsKKwkJbGlzdE9mT3V0cHV0RUQuc3BsaWNlKG91dEVEUyk7CisJfQorCWVsc2UgaWYoIG91dEVEUy5lbXB0eSgpICkKKwl7CisJCWxpc3RPZk91dHB1dEVELnNwbGljZShwcmV2UGFyYWxsZWxMaXN0T2ZPdXRwdXRFRCk7CisJfQorCWVsc2UKKwl7CisJCUxpc3RPZkFQRXhlY3V0aW9uRGF0YTo6aXRlcmF0b3IgaXRPdXRFRDsKKwkJTGlzdE9mQVBFeGVjdXRpb25EYXRhOjppdGVyYXRvciBlbmRPdXRFRDsKKworCQlBUEV4ZWN1dGlvbkRhdGEgYW5FRDsKKworCQlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGE6Oml0ZXJhdG9yIGl0UGFyYWxsZWxFRCA9CisJCQkJcHJldlBhcmFsbGVsTGlzdE9mT3V0cHV0RUQuYmVnaW4oKTsKKwkJTGlzdE9mQVBFeGVjdXRpb25EYXRhOjppdGVyYXRvciBlbmRQYXJhbGxlbEVEID0KKwkJCQlwcmV2UGFyYWxsZWxMaXN0T2ZPdXRwdXRFRC5lbmQoKTsKKwkJZW5kT3V0RUQgPSBvdXRFRFMuZW5kKCk7CisJCWZvciggOyBpdFBhcmFsbGVsRUQgIT0gZW5kUGFyYWxsZWxFRCA7ICsraXRQYXJhbGxlbEVEICkKKwkJeworCQkJZm9yKCBpdE91dEVEID0gb3V0RURTLmJlZ2luKCkgOyBpdE91dEVEICE9IGVuZE91dEVEIDsgKytpdE91dEVEICkKKwkJCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIENPTVBVVElORyAsIFNUQVRFTUVOVCApCisJCQkJQVZNX09TX1RSQUNFIDw8ICJFRDxmcnN0PiAiCisJCQkJCQk8PCAoKml0UGFyYWxsZWxFRCktPmdldFJ1bm5hYmxlRWxlbWVudFRyYWNlKCkuc3RyKCkKKwkJCQkJCTw8IHN0ZDo6ZW5kbCA8PCAiRUQ8c2NuZD4gIgorCQkJCQkJPDwgKCppdE91dEVEKS0+Z2V0UnVubmFibGVFbGVtZW50VHJhY2UoKS5zdHIoKQorCQkJCQkJPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgQ09NUFVUSU5HICwgU1RBVEVNRU5UICkKKwkJCQlhbkVEID0gQXZtU3luY2hyb25pemF0aW9uRmFjdG9yeTo6ZnVzaW9uKAorCQkJCQkJcmVmRUQsICppdFBhcmFsbGVsRUQsICppdE91dEVEKTsKKwkJCQlpZiggYW5FRC52YWxpZCgpICkKKwkJCQl7CisJCQkJCWxpc3RPZk91dHB1dEVELmFwcGVuZCggYW5FRCApOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgQ09NUFVUSU5HICwgU1RBVEVNRU5UICkKKwlBVk1fT1NfVFJBQ0UgPDwgIj4+ICIgPDwgcmVmRUQtPm1SSUQuc3RyVW5pcUlkKCkgPDwgIiB8PT4gcmVzdWx0KCAiCisJCQk8PCBsaXN0T2ZPdXRwdXRFRC5zaXplKCkgPDwgIiApIiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBDT01QVVRJTkcgLCBTVEFURU1FTlQgKQorfQorCisKKworCitib29sIEF2bVByaW1pdGl2ZV9SZHZQYXJhbGxlbDo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworLy8JYXZtX29mZnNldF90IGlkeDsKKy8vCisvLwlzdGQ6OnZlY3RvcjwgRXhlY3V0aW9uRW52aXJvbm1lbnQgPiB0YWJPZkVOVigKKy8vCQkJRU5WLmluQ09ERS0+c2l6ZSgpLCBFeGVjdXRpb25FbnZpcm9ubWVudChFTlYsIEVOVi5pbkVEKSApOworLy8KKy8vCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gRU5WLmluQ09ERS0+YmVnaW4oKTsKKy8vCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gRU5WLmluQ09ERS0+ZW5kKCk7CisvLworLy8JLy8gQ2FzIGRlIGwnw6l2ZW50dWVsIHByZW1pZXIgZXhpdEVEUworLy8JZm9yKCBpZHggPSAwIDsgaXQgIT0gaXRFbmQgOyArK2l0LCArK2lkeCApCisvLwl7CisvLwkJaWYoIG5vdCB0YWJPZkVOVltpZHhdLnJ1bigqaXQpICkKKy8vCQl7CisvLwkJCXJldHVybiggZmFsc2UgKTsKKy8vCQl9CisvLwl9CisvLworLy8JaWYoIEF2bUNvbW11bmljYXRpb25SZHZQcmltaXRpdmU6OmNvbXB1dGVSZHYoUFJJTUlUSVZFX1BST0NFU1NPUiwgdGFiT2ZFTlYpICkKKy8vCXsKKy8vCQljb21wdXRlUGFyYWxsZWwoRU5WLmluRUQsIGxpc3RvZlJEViwKKy8vCQkJCXBhcmFsbGVsT3V0cHV0RUQsIGZ1c2lvbkxpc3RPZk91dHB1dEVEKTsKKy8vCisvLwkJcGFyYWxsZWxPdXRwdXRFRC5jbGVhcigpOworLy8JCXBhcmFsbGVsT3V0cHV0RUQuc3BsaWNlKGZ1c2lvbkxpc3RPZk91dHB1dEVEKTsKKy8vCX0KKy8vCWVsc2UKKy8vCXsKKy8vCQlyZXR1cm4oIGZhbHNlICk7CisvLwl9CisKKworCUxpc3RPZkFQRXhlY3V0aW9uRGF0YSBmdXNpb25MaXN0T2ZPdXRwdXRFRDsKKwlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGEgcGFyYWxsZWxPdXRwdXRFRDsKKworCUxpc3RPZkFQRXhlY3V0aW9uRGF0YSBmdXNpb25MaXN0T2ZFeGl0RUQ7CisJTGlzdE9mQVBFeGVjdXRpb25EYXRhIHBhcmFsbGVsRXhpdEVEOworCisJUmR2Q29uZmlndXJhdGlvbkRhdGEgYVJkdkNvbmYoRU5WLCBFTlYuaW5DT0RFLT5zaXplKCkpOworCWJvb2wgY2hlY2tSZHYgPSBmYWxzZTsKKwlib29sIGNoZWNrTXVsdGlSZHYgPSBmYWxzZTsKKworCWJvb2wgaGFzQ29tID0gZmFsc2U7CisKKwlhdm1fb2Zmc2V0X3QgaWR4ID0gMDsKKworCUxpc3RPZkFQRXhlY3V0aW9uRGF0YSBsaXN0b2ZSRFY7CisKKworCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gRU5WLmluQ09ERS0+YmVnaW4oKTsKKwlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdEVuZCA9IEVOVi5pbkNPREUtPmVuZCgpOworCisJLy8gQ2FzIGRlIGwnw6l2ZW50dWVsIHByZW1pZXIgZXhpdEVEUworCWZvciggOyAoaXQgIT0gaXRFbmQpICYmIHBhcmFsbGVsRXhpdEVELmVtcHR5KCkgOyArK2l0ICkKKwl7CisJCUV4ZWN1dGlvbkVudmlyb25tZW50IHRtcEVOVihFTlYsICppdCk7CisJCWlmKCB0bXBFTlYucnVuKCkgKQorCQl7CisJCQlpZiggdG1wRU5WLmV4aXRFRFMubm9uZW1wdHkoKSApCisJCQl7CisJCQkJY29tcHV0ZVBhcmFsbGVsKEVOVi5pbkVELCB0bXBFTlYuZXhpdEVEUywKKwkJCQkJCXBhcmFsbGVsT3V0cHV0RUQsIHBhcmFsbGVsRXhpdEVEKTsKKwkJCX0KKworCQkJaWYoIHRtcEVOVi5vdXRFRFMubm9uZW1wdHkoKSApCisJCQl7CisJCQkJY29tcHV0ZVBhcmFsbGVsKEVOVi5pbkVELCB0bXBFTlYub3V0RURTLAorCQkJCQkJcGFyYWxsZWxPdXRwdXRFRCwgZnVzaW9uTGlzdE9mT3V0cHV0RUQpOworCisJCQkJcGFyYWxsZWxPdXRwdXRFRC5jbGVhcigpOworCQkJCXBhcmFsbGVsT3V0cHV0RUQuc3BsaWNlKGZ1c2lvbkxpc3RPZk91dHB1dEVEKTsKKwkJCX0KKwkJCWVsc2UgaWYoIHRtcEVOVi5leGl0RURTLm5vbmVtcHR5KCkgKQorCQkJeworCQkJCXBhcmFsbGVsT3V0cHV0RUQuY2xlYXIoKTsKKwkJCX0KKworCQkJaWYoIHRtcEVOVi5zeW5jRURTLm5vbmVtcHR5KCkgKQorCQkJeworCQkJCWNvbmZpZ3VyZVJkdihhUmR2Q29uZiwgdG1wRU5WLnN5bmNFRFMsCisJCQkJCQljaGVja1JkdiwgY2hlY2tNdWx0aVJkdiwgaGFzQ29tLCBpZHgpOworCQkJfQorCisJCQlFTlYuc3BsaWNlTm90T3V0cHV0RXhpdCh0bXBFTlYpOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorCisJLy8gQ2FzIGRlIGNvaGFiaXRhdGlvbiBvdXRFRFMgZXQgZXhpdEVEUworCWZvciggOyAoaXQgIT0gaXRFbmQpICYmIHBhcmFsbGVsT3V0cHV0RUQubm9uZW1wdHkoKSA7ICsraXQgKQorCXsKKwkJRXhlY3V0aW9uRW52aXJvbm1lbnQgdG1wRU5WKEVOViwgKml0KTsKKwkJaWYoIHRtcEVOVi5ydW4oKSApCisJCXsKKwkJCWlmKCB0bXBFTlYub3V0RURTLm5vbmVtcHR5KCkgKQorCQkJeworCQkJCS8vIENvbXBvc2l0aW9uIGVudHJlIDw8IHB1cnMgT3V0cHV0ID4+CisJCQkJY29tcHV0ZVBhcmFsbGVsKEVOVi5pbkVELCB0bXBFTlYub3V0RURTLAorCQkJCQkJcGFyYWxsZWxPdXRwdXRFRCwgZnVzaW9uTGlzdE9mT3V0cHV0RUQpOworCisJCQkJLy8gQ29tcG9zaXRpb24gYXZlYyBsZXMgPDwgRXhpdCBwcsOpY8OpZGVudHMgPj4KKwkJCQljb21wdXRlUGFyYWxsZWwoRU5WLmluRUQsIHRtcEVOVi5vdXRFRFMsCisJCQkJCQlwYXJhbGxlbEV4aXRFRCwgZnVzaW9uTGlzdE9mRXhpdEVEKTsKKwkJCX0KKworCQkJaWYoIHRtcEVOVi5leGl0RURTLm5vbmVtcHR5KCkgKQorCQkJeworCQkJCS8vIENvbXBvc2l0aW9uIGF2ZWMgbGVzIDw8IE91dHB1dCBwcsOpY8OpZGVudHMgPj4KKwkJCQljb21wdXRlUGFyYWxsZWwoRU5WLmluRUQsIHRtcEVOVi5vdXRFRFMsCisJCQkJCQlwYXJhbGxlbE91dHB1dEVELCBmdXNpb25MaXN0T2ZFeGl0RUQpOworCisJCQkJLy8gQ29tcG9zaXRpb24gZW50cmUgPDwgcHVycyBFeGl0ID4+CisJCQkJY29tcHV0ZVBhcmFsbGVsKEVOVi5pbkVELCB0bXBFTlYuZXhpdEVEUywKKwkJCQkJCXBhcmFsbGVsRXhpdEVELCBmdXNpb25MaXN0T2ZFeGl0RUQpOworCisJCQl9CisKKwkJCWlmKCB0bXBFTlYub3V0RURTLm5vbmVtcHR5KCkgfHwgdG1wRU5WLmV4aXRFRFMubm9uZW1wdHkoKSApCisJCQl7CisJCQkJcGFyYWxsZWxPdXRwdXRFRC5jbGVhcigpOworCQkJCXBhcmFsbGVsT3V0cHV0RUQuc3BsaWNlKGZ1c2lvbkxpc3RPZk91dHB1dEVEKTsKKworCQkJCXBhcmFsbGVsRXhpdEVELmNsZWFyKCk7CisJCQkJcGFyYWxsZWxFeGl0RUQuc3BsaWNlKGZ1c2lvbkxpc3RPZkV4aXRFRCk7CisJCQl9CisKKwkJCWlmKCB0bXBFTlYuc3luY0VEUy5ub25lbXB0eSgpICkKKwkJCXsKKwkJCQljb25maWd1cmVSZHYoYVJkdkNvbmYsIHRtcEVOVi5zeW5jRURTLAorCQkJCQkJY2hlY2tSZHYsIGNoZWNrTXVsdGlSZHYsIGhhc0NvbSwgaWR4KTsKKwkJCX0KKworCQkJRU5WLnNwbGljZU5vdE91dHB1dEV4aXQodG1wRU5WKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KKworCS8vIENhcyBvdSB0b3V0IGxlIG1vbmRlIGVzdCBjb250YW1pbsOpIHBhciBleGl0RURTCisJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApCisJeworCQlFeGVjdXRpb25FbnZpcm9ubWVudCB0bXBFTlYoRU5WLCAqaXQpOworCQlpZiggdG1wRU5WLnJ1bigpICkKKwkJeworCQkJaWYoIHRtcEVOVi5vdXRFRFMubm9uZW1wdHkoKSApCisJCQl7CisJCQkJY29tcHV0ZVBhcmFsbGVsKEVOVi5pbkVELCB0bXBFTlYub3V0RURTLAorCQkJCQkJcGFyYWxsZWxFeGl0RUQsIGZ1c2lvbkxpc3RPZkV4aXRFRCk7CisJCQl9CisJCQlpZiggdG1wRU5WLmV4aXRFRFMubm9uZW1wdHkoKSApCisJCQl7CisJCQkJY29tcHV0ZVBhcmFsbGVsKEVOVi5pbkVELCB0bXBFTlYuZXhpdEVEUywKKwkJCQkJCXBhcmFsbGVsRXhpdEVELCBmdXNpb25MaXN0T2ZFeGl0RUQpOworCQkJfQorCisJCQlpZiggdG1wRU5WLm91dEVEUy5ub25lbXB0eSgpIHx8IHRtcEVOVi5leGl0RURTLm5vbmVtcHR5KCkgKQorCQkJeworCQkJCXBhcmFsbGVsRXhpdEVELmNsZWFyKCk7CisJCQkJcGFyYWxsZWxFeGl0RUQuc3BsaWNlKGZ1c2lvbkxpc3RPZkV4aXRFRCk7CisJCQl9CisKKwkJCWlmKCB0bXBFTlYuc3luY0VEUy5ub25lbXB0eSgpICkKKwkJCXsKKwkJCQljb25maWd1cmVSZHYoYVJkdkNvbmYsIHRtcEVOVi5zeW5jRURTLAorCQkJCQkJY2hlY2tSZHYsIGNoZWNrTXVsdGlSZHYsIGhhc0NvbSwgaWR4KTsKKwkJCX0KKworCQkJRU5WLnNwbGljZU5vdE91dHB1dEV4aXQodG1wRU5WKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KKworCisJaWYoIGlkeCA+IDEgKQorCXsKKwkJYVJkdkNvbmYucmVzaXplKCBpZHggKTsKKworCQlpZiggY2hlY2tSZHYgKQorCQl7CisJCQlhUmR2Q29uZi51cGRhdGVQb3NzaWJsZUludGVybmFsUmR2RmxhZygpOworCQl9CisJCWlmKCBjaGVja011bHRpUmR2ICkKKwkJeworCQkJYVJkdkNvbmYudXBkYXRlUG9zc2libGVJbnRlcm5hbE11bHRpUmR2RmxhZygpOworCQl9CisKKwkJaWYoIGFSZHZDb25mLmhhc1Bvc3NpYmxlSW50ZXJuYWxSZHZGbGFnIHx8CisJCQkJYVJkdkNvbmYuaGFzUG9zc2libGVJbnRlcm5hbE11bHRpUmR2RmxhZyApCisJCXsKKwkJCUF2bUNvbW11bmljYXRpb25SZHZQcmltaXRpdmUgcmR2Q29tcHV0ZXIoUFJJTUlUSVZFX1BST0NFU1NPUiwKKwkJCQkJYVJkdkNvbmYsIGNoZWNrUmR2LCBjaGVja011bHRpUmR2KTsKKworCQkJaWYoIHJkdkNvbXB1dGVyLnJlc3VtZV9yZHYobGlzdG9mUkRWKSApCisJCQl7CisJCQkJY29tcHV0ZVBhcmFsbGVsKEVOVi5pbkVELCBsaXN0b2ZSRFYsCisJCQkJCQlwYXJhbGxlbE91dHB1dEVELCBmdXNpb25MaXN0T2ZPdXRwdXRFRCk7CisKKwkJCQlwYXJhbGxlbE91dHB1dEVELmNsZWFyKCk7CisJCQkJcGFyYWxsZWxPdXRwdXRFRC5zcGxpY2UoZnVzaW9uTGlzdE9mT3V0cHV0RUQpOworCQkJfQorCQl9CisJfQorCisKKwlFTlYub3V0RURTLnNwbGljZSggcGFyYWxsZWxPdXRwdXRFRCApOworCUVOVi5leGl0RURTLnNwbGljZSggcGFyYWxsZWxFeGl0RUQgKTsKKworCXJldHVybiggdHJ1ZSApOworfQorCisKK3ZvaWQgQXZtUHJpbWl0aXZlX1JkdlBhcmFsbGVsOjpjb25maWd1cmVSZHYoUmR2Q29uZmlndXJhdGlvbkRhdGEgJiBhUmR2Q29uZiwKKwkJTGlzdE9mQVBFeGVjdXRpb25EYXRhICYgc3luY0VEUywgYm9vbCAmIGNoZWNrUmR2LAorCQlib29sICYgY2hlY2tNdWx0aVJkdiwgYm9vbCAmIGhhc0NvbSwgYXZtX29mZnNldF90ICYgaWR4KQoreworCUFQRXhlY3V0aW9uRGF0YSB0bXBFRDsKKworCXdoaWxlKCBzeW5jRURTLm5vbmVtcHR5KCkgKQorCXsKKwkJc3luY0VEUy5wb3BfZmlyc3RfdG8oIHRtcEVEICk7CisKKwkJc3dpdGNoKCB0bXBFRC0+bUFFRVMgKQorCQl7CisJCQljYXNlIEFFRVNfV0FJVElOR19JTkNPTV9SRFY6CisJCQl7CisJCQkJaGFzQ29tID0gdHJ1ZTsKKworCQkJCWlmKCB0bXBFRC0+bUVYRUNfU1lOQ19QT0lOVC0+bVJvdXRpbmdEYXRhLmlzUHJvdG9jb2xSRFYoKSApCisJCQkJeworCQkJCQlhUmR2Q29uZi5JTl9FRF9SRFZbIGlkeCBdLmFwcGVuZCggdG1wRUQgKTsKKwkJCQkJYVJkdkNvbmYubUF3YWl0aW5nT3V0cHV0UmR2RmxhZ1sgaWR4IF0gPSB0cnVlOworCQkJCQljaGVja1JkdiA9IHRydWU7CisJCQkJfQorCQkJCWVsc2UgaWYoIHRtcEVELT5tRVhFQ19TWU5DX1BPSU5ULT5tUm91dGluZ0RhdGEuaXNQcm90b2NvbE1VTFRJX1JEVigpICkKKwkJCQl7CisJCQkJCWFSZHZDb25mLkVEX01VTFRJUkRWWyBpZHggXS5hcHBlbmQoIHRtcEVEICk7CisJCQkJCWFSZHZDb25mLm1Bd2FpdGluZ091dHB1dE11bHRpUmR2RmxhZ1sgaWR4IF0gPSB0cnVlOworCQkJCQljaGVja011bHRpUmR2ID0gdHJ1ZTsKKwkJCQl9CisKKwkJCQlicmVhazsKKwkJCX0KKworCQkJY2FzZSBBRUVTX1dBSVRJTkdfT1VUQ09NX1JEVjoKKwkJCXsKKwkJCQloYXNDb20gPSB0cnVlOworCisJCQkJaWYoIHRtcEVELT5tRVhFQ19TWU5DX1BPSU5ULT5tUm91dGluZ0RhdGEuaXNQcm90b2NvbFJEVigpICkKKwkJCQl7CisJCQkJCWFSZHZDb25mLk9VVF9FRF9SRFZbIGlkeCBdLmFwcGVuZCggdG1wRUQgKTsKKwkJCQkJYVJkdkNvbmYubUF3YWl0aW5nSW5wdXRSZHZGbGFnWyBpZHggXSA9IHRydWU7CisJCQkJCWNoZWNrUmR2ID0gdHJ1ZTsKKwkJCQl9CisJCQkJZWxzZSBpZiggdG1wRUQtPm1FWEVDX1NZTkNfUE9JTlQtPm1Sb3V0aW5nRGF0YS5pc1Byb3RvY29sTVVMVElfUkRWKCkgKQorCQkJCXsKKwkJCQkJYVJkdkNvbmYuRURfTVVMVElSRFZbIGlkeCBdLmFwcGVuZCggdG1wRUQgKTsKKwkJCQkJYVJkdkNvbmYubUF3YWl0aW5nSW5wdXRNdWx0aVJkdkZsYWdbIGlkeCBdID0gdHJ1ZTsKKwkJCQkJY2hlY2tNdWx0aVJkdiA9IHRydWU7CisJCQkJfQorCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJCTw8ICJVbmV4cGVjdGVkIEVORElORCBFWEVDVVRJT04gU1RBVFVTIDo+ICIKKwkJCQkJCTw8IFJ1bnRpbWVEZWY6OnN0ckFFRVMoIHRtcEVELT5tQUVFUyApIDw8ICIgISEhIgorCQkJCQkJPDwgU0VORF9FWElUOworCQkJfQorCQl9CisJfQorCisJaWYoIGhhc0NvbSApCisJeworCQlpZHggPSBpZHggKyAxOworCisJCWhhc0NvbSA9IGZhbHNlOworCX0KK30KKworCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXhlY3V0aW9uIG9mIGEgUFJPRFVDVCBwcm9ncmFtCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK2Jvb2wgQXZtUHJpbWl0aXZlX1Byb2R1Y3Q6OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlFTlYuaW5FRC0+c2V0RW5hYmxlZExvY2FsTm9kZUNvbmRpdGlvbiggdHJ1ZSApOworCisJTGlzdE9mQVBFeGVjdXRpb25EYXRhIG9uZUxpc3RPZkVEOworCUxpc3RPZkFQRXhlY3V0aW9uRGF0YSBvdGhlckxpc3RPZkVEOworCUxpc3RPZkFQRXhlY3V0aW9uRGF0YSByZXN1bHRMaXN0T2ZFRDsKKworCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gRU5WLmluQ09ERS0+YmVnaW4oKTsKKwlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdEVuZCA9IEVOVi5pbkNPREUtPmVuZCgpOworCisJLy8gSW5pdGlhbGlzYXRpb24gZHUgcHJvY2VzcworCUV4ZWN1dGlvbkVudmlyb25tZW50IHRtcEVOVihFTlYsICppdCk7CisJaWYoIG5vdCB0bXBFTlYucnVuKCkgKQorCXsKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKwlvbmVMaXN0T2ZFRC5zcGxpY2UoIHRtcEVOVi5vdXRFRFMgKTsKKworCS8vIFJlY3VycmVuY2UKKwlmb3IoICsraXQgOyBpdCAhPSBpdEVuZCA7ICsraXQgKQorCXsKKwkJaWYoIG5vdCB0bXBFTlYucnVuKCppdCkgKQorCQl7CisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKworCQljb21wdXRlUHJvZHVjdChFTlYuaW5FRCwgb25lTGlzdE9mRUQsIHRtcEVOVi5vdXRFRFMsIHJlc3VsdExpc3RPZkVEKTsKKworCQlvbmVMaXN0T2ZFRC5jbGVhcigpOworCQlvdGhlckxpc3RPZkVELmNsZWFyKCk7CisJCXdoaWxlKCByZXN1bHRMaXN0T2ZFRC5ub25lbXB0eSgpICkKKwkJeworCQkJcmVzdWx0TGlzdE9mRUQubGFzdCgpLT5zZXRFbmFibGVkTG9jYWxOb2RlQ29uZGl0aW9uKCBmYWxzZSApOworCisJCQlvbmVMaXN0T2ZFRC5hcHBlbmQoIHJlc3VsdExpc3RPZkVELnBvcF9sYXN0KCkgKTsKKwkJfQorCX0KKworCUVOVi5pbkVELT5zZXRFbmFibGVkTG9jYWxOb2RlQ29uZGl0aW9uKCBmYWxzZSApOworCisJRU5WLm91dEVEUy5zcGxpY2UoIG9uZUxpc3RPZkVEICk7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisKK2Jvb2wgQXZtUHJpbWl0aXZlX1Byb2R1Y3Q6OmNvbXB1dGVQcm9kdWN0KEFQRXhlY3V0aW9uRGF0YSAmIGFuSW5wdXRFRCwKKwkJTGlzdE9mQVBFeGVjdXRpb25EYXRhICYgb25lTGlzdE9mRUQsCisJCUxpc3RPZkFQRXhlY3V0aW9uRGF0YSAmIG90aGVyTGlzdE9mRUQsCisJCUxpc3RPZkFQRXhlY3V0aW9uRGF0YSAmIHJlc3VsdExpc3RPZkVEKQoreworCWlmKCBvdGhlckxpc3RPZkVELmVtcHR5KCkgKQorCXsKKwkJcmVzdWx0TGlzdE9mRUQuc3BsaWNlKCBvbmVMaXN0T2ZFRCApOworCX0KKworCWVsc2UgaWYoIG9uZUxpc3RPZkVELmVtcHR5KCkgKQorCXsKKwkJcmVzdWx0TGlzdE9mRUQuc3BsaWNlKCBvdGhlckxpc3RPZkVEICk7CisJfQorCisJZWxzZQorCXsKKwkJTGlzdE9mQVBFeGVjdXRpb25EYXRhOjppdGVyYXRvciBpdE90aGVyID0gb3RoZXJMaXN0T2ZFRC5iZWdpbigpOworCQlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGE6Oml0ZXJhdG9yIGVuZE90aGVyID0gb3RoZXJMaXN0T2ZFRC5lbmQoKTsKKwkJZm9yKCA7IGl0T3RoZXIgIT0gZW5kT3RoZXIgOyArK2l0T3RoZXIgKQorCQl7CisJCQlpZiggbm90IGNvbXB1dGVQcm9kdWN0KGFuSW5wdXRFRCwKKwkJCQkJKml0T3RoZXIsIG9uZUxpc3RPZkVELCByZXN1bHRMaXN0T2ZFRCkgKQorCQkJeworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJfQorCX0KKworCXJlc3VsdExpc3RPZkVELm1ha2VVbmlxdWUoKTsKKworCXJldHVybiggdHJ1ZSApOworfQorCisKK2Jvb2wgQXZtUHJpbWl0aXZlX1Byb2R1Y3Q6OmNvbXB1dGVQcm9kdWN0KAorCQlBUEV4ZWN1dGlvbkRhdGEgJiBhbklucHV0RUQsIEFQRXhlY3V0aW9uRGF0YSAmIG9uZUVELAorCQlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGEgJiBsaXN0T2ZPdGhlckVELAorCQlDb2xsZWN0aW9uT2ZBUEV4ZWN1dGlvbkRhdGEgJiBsaXN0T2ZPdXRwdXRFRCkKK3sKKwlBUEV4ZWN1dGlvbkRhdGEgYW5FRDsKKworCUxpc3RPZkFQRXhlY3V0aW9uRGF0YTo6aXRlcmF0b3IgaXRPdGhlcjsKKwlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGE6Oml0ZXJhdG9yIGVuZE90aGVyID0gbGlzdE9mT3RoZXJFRC5lbmQoKTsKKworCS8vIEZ1c2lvbiB3aXRoIE9USEVSUworCWZvciggaXRPdGhlciA9IGxpc3RPZk90aGVyRUQuYmVnaW4oKSA7IGl0T3RoZXIgIT0gZW5kT3RoZXIgOyArK2l0T3RoZXIgKQorCXsKKwkJYW5FRCA9IEF2bVN5bmNocm9uaXphdGlvbkZhY3Rvcnk6OmZ1c2lvbihhbklucHV0RUQsIG9uZUVELCAqaXRPdGhlcik7CisJCWlmKCBhbkVELnZhbGlkKCkgKQorCQl7CisJCQlsaXN0T2ZPdXRwdXRFRC5hcHBlbmQoIGFuRUQgKTsKKwkJfQorCX0KKworCS8vIENvbXB1dGUgT1RIRVIgd2hlcmUgTk9UIE9ORQorCWlmKCBub3QgZXZhbEV4Y2x1c2l2ZShhbklucHV0RUQsIGxpc3RPZk90aGVyRUQsIG9uZUVELCBsaXN0T2ZPdXRwdXRFRCkgKQorCXsKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCisJLy8gQ29tcHV0ZSBPTkUgd2hlcmUgTk9UIE9USEVSUworCXJldHVybiggZXZhbEV4Y2x1c2l2ZShhbklucHV0RUQsIG9uZUVELCBsaXN0T2ZPdGhlckVELCBsaXN0T2ZPdXRwdXRFRCkgKTsKK30KKworCitib29sIEF2bVByaW1pdGl2ZV9Qcm9kdWN0Ojpjb21wdXRlUHJvZHVjdChBUEV4ZWN1dGlvbkRhdGEgJiBhbklucHV0RUQsCisJCUFQRXhlY3V0aW9uRGF0YSAmIG9uZUVELCBBUEV4ZWN1dGlvbkRhdGEgJiBvdGhlckVELAorCQlDb2xsZWN0aW9uT2ZBUEV4ZWN1dGlvbkRhdGEgJiBsaXN0T2ZPdXRwdXRFRCkKK3sKKwlBUEV4ZWN1dGlvbkRhdGEgYW5FRCA9IEF2bVN5bmNocm9uaXphdGlvbkZhY3Rvcnk6OmZ1c2lvbigKKwkJCWFuSW5wdXRFRCwgb25lRUQsIG90aGVyRUQpOworCWlmKCBhbkVELnZhbGlkKCkgKQorCXsKKwkJbGlzdE9mT3V0cHV0RUQuYXBwZW5kKCBhbkVEICk7CisJfQorCisJLy8gQ29tcHV0ZSBPVEhFUiB3aGVyZSBOT1QgT05FCisJaWYoIG5vdCBldmFsRXhjbHVzaXZlKGFuSW5wdXRFRCwgb3RoZXJFRCwgb25lRUQsIGxpc3RPZk91dHB1dEVEKSApCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJLy8gQ29tcHV0ZSBPTkUgd2hlcmUgTk9UIE9USEVSUworCXJldHVybiggZXZhbEV4Y2x1c2l2ZShhbklucHV0RUQsIG9uZUVELCBvdGhlckVELCBsaXN0T2ZPdXRwdXRFRCkgKTsKK30KKworCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXhlY3V0aW9uIG9mIGEgU1lOQ0hST05JWkUgcHJvZ3JhbQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitib29sIEF2bVByaW1pdGl2ZV9TeW5jaHJvbml6ZTo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCUV4ZWN1dGlvbkVudmlyb25tZW50IHRtcEVOVihFTlYsIEVOVi5pbkNPREUtPmZpcnN0KCkpOworCisJaWYoIG5vdCB0bXBFTlYucnVuKCBFTlYuaW5DT0RFLT5maXJzdCgpICkgKQorCXsKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCUFQRXhlY3V0aW9uRGF0YSB0bXBFRDsKKwl3aGlsZSggdG1wRU5WLnN5bmNFRFMubm9uZW1wdHkoKSApCisJeworCQl0bXBFTlYuc3luY0VEUy5wb3BfZmlyc3RfdG8oIHRtcEVEICk7CisKKwkJc3dpdGNoKCB0bXBFRC0+bUFFRVMgKQorCQl7CisJCQljYXNlIEFFRVNfV0FJVElOR19JTkNPTV9SRFY6CisJCQljYXNlIEFFRVNfV0FJVElOR19PVVRDT01fUkRWOgorCQkJY2FzZSBBRUVTX1dBSVRJTkdfSk9JTl9GT1JLOgorCQkJeworCQkJCWJyZWFrOworCQkJfQorCisJCQlkZWZhdWx0OgorCQkJeworCQkJCUVOVi5vdXRFRFMuYXBwZW5kKHRtcEVEKTsKKworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJRU5WLnNwbGljZU91dHB1dCh0bXBFTlYpOworCUVOVi5zcGxpY2VOb3RPdXRwdXQodG1wRU5WKTsKKworCXJldHVybiggdHJ1ZSApOworfQorCisKKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtQ29uY3VycmVuY3lQcmltaXRpdmUuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1Db25jdXJyZW5jeVByaW1pdGl2ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYmQ0MGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtQ29uY3VycmVuY3lQcmltaXRpdmUuaApAQCAtMCwwICsxLDEwMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDIwIG1haSAyMDEwCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQVZNQ09OQ1VSUkVOQ1lQUklNSVRJVkVfSF8KKyNkZWZpbmUgQVZNQ09OQ1VSUkVOQ1lQUklNSVRJVkVfSF8KKworI2luY2x1ZGUgPGNvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1CYXNlQ29uY3VycmVuY3lQcmltaXRpdmUuaD4KKyNpbmNsdWRlIDxjb21wdXRlci9wcmltaXRpdmUvQmFzZUF2bVByaW1pdGl2ZS5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uRGF0YS5oPgorCisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIFJkdkNvbmZpZ3VyYXRpb25EYXRhOworCisKK0FWTV9QUklNSVRJVkVfUlVOX0NMQVNTKEludGVybGVhdmluZywgQmFzZUF2bVByaW1pdGl2ZSkKK0FWTV9QUklNSVRJVkVfUlVOX0NMQVNTKFJkdkludGVybGVhdmluZywgQmFzZUF2bVByaW1pdGl2ZSkKKworQVZNX1BSSU1JVElWRV9SVU5fQ0xBU1MoQXN5bmNocm9ub3VzLCBCYXNlQXZtUHJpbWl0aXZlKQorQVZNX1BSSU1JVElWRV9SVU5fQ0xBU1MoUmR2QXN5bmNocm9ub3VzLCBCYXNlQXZtUHJpbWl0aXZlKQorCitBVk1fUFJJTUlUSVZFX1JVTl9DTEFTUyhTdHJvbmdTeW5jaHJvbm91cywgQmFzZUF2bVByaW1pdGl2ZSkKK0FWTV9QUklNSVRJVkVfUlVOX0NMQVNTKFJkdlN0cm9uZ1N5bmNocm9ub3VzLCBCYXNlQXZtUHJpbWl0aXZlKQorCisKK0FWTV9QUklNSVRJVkVfUlVOX0NMQVNTX0hFQURFUihXZWFrU3luY2hyb25vdXMsIEF2bUJhc2VDb25jdXJyZW5jeVByaW1pdGl2ZSkKKwlib29sIGNvbXB1dGVXZWFrU3luY2hyb25vdXMoQVBFeGVjdXRpb25EYXRhICYgYW5JbnB1dEVELAorCQkJQVBFeGVjdXRpb25EYXRhICYgb25lRUQsIEFQRXhlY3V0aW9uRGF0YSAmIG90aGVyRUQsCisJCQlDb2xsZWN0aW9uT2ZBUEV4ZWN1dGlvbkRhdGEgJiBsaXN0T2ZPdXRwdXRFRCk7CisKKwlib29sIGNvbXB1dGVXZWFrU3luY2hyb25vdXMoCisJCQlBUEV4ZWN1dGlvbkRhdGEgJiBhbklucHV0RUQsIEFQRXhlY3V0aW9uRGF0YSAmIG9uZUVELAorCQkJTGlzdE9mQVBFeGVjdXRpb25EYXRhICYgbGlzdE9mT3RoZXJFRCwKKwkJCUNvbGxlY3Rpb25PZkFQRXhlY3V0aW9uRGF0YSAmIGxpc3RPZk91dHB1dEVEKTsKKworCWJvb2wgY29tcHV0ZVdlYWtTeW5jaHJvbm91cyhBUEV4ZWN1dGlvbkRhdGEgJiBhbklucHV0RUQsCisJCQlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGEgJiBvbmVMaXN0T2ZFRCwKKwkJCUxpc3RPZkFQRXhlY3V0aW9uRGF0YSAmIG90aGVyTGlzdE9mRUQsCisJCQlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGEgJiByZXN1bHRMaXN0T2ZFRCk7Cit9OworCitBVk1fUFJJTUlUSVZFX1JVTl9DTEFTUyhSZHZXZWFrU3luY2hyb25vdXMsIEF2bVByaW1pdGl2ZV9XZWFrU3luY2hyb25vdXMpCisKKworCitBVk1fUFJJTUlUSVZFX1JVTl9DTEFTU19IRUFERVIoUGFyYWxsZWwsIEJhc2VBdm1QcmltaXRpdmUpCisJdm9pZCBjb21wdXRlUGFyYWxsZWwoQVBFeGVjdXRpb25EYXRhICYgcmVmRUQsCisJCQlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGEgJiBvdXRFRFMsCisJCQlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGEgJiBwYXJhbGxlbExpc3RPZk91dHB1dEVELAorCQkJTGlzdE9mQVBFeGVjdXRpb25EYXRhICYgbGlzdE9mT3V0cHV0RUQpOworfTsKKworQVZNX1BSSU1JVElWRV9SVU5fQ0xBU1NfSEVBREVSKFJkdlBhcmFsbGVsLCBBdm1QcmltaXRpdmVfUGFyYWxsZWwpCisJdm9pZCBjb25maWd1cmVSZHYoUmR2Q29uZmlndXJhdGlvbkRhdGEgJiBhUmR2Q29uZiwKKwkJCUxpc3RPZkFQRXhlY3V0aW9uRGF0YSAmIHN5bmNFRFMsIGJvb2wgJiBjaGVja1JkdiwKKwkJCWJvb2wgJiBjaGVja011bHRpUmR2LCBib29sICYgaGFzQ29tLCBhdm1fb2Zmc2V0X3QgJiBpZHgpOworfTsKKworCisKKworQVZNX1BSSU1JVElWRV9SVU5fQ0xBU1NfSEVBREVSKFByb2R1Y3QsIEF2bUJhc2VDb25jdXJyZW5jeVByaW1pdGl2ZSkKKwlib29sIGNvbXB1dGVQcm9kdWN0KEFQRXhlY3V0aW9uRGF0YSAmIGFuSW5wdXRFRCwgQVBFeGVjdXRpb25EYXRhICYgb25lRUQsCisJCQlBUEV4ZWN1dGlvbkRhdGEgJiBvdGhlckVELAorCQkJQ29sbGVjdGlvbk9mQVBFeGVjdXRpb25EYXRhICYgbGlzdE9mT3V0cHV0RUQpOworCisJYm9vbCBjb21wdXRlUHJvZHVjdChBUEV4ZWN1dGlvbkRhdGEgJiBhbklucHV0RUQsIEFQRXhlY3V0aW9uRGF0YSAmIG9uZUVELAorCQkJTGlzdE9mQVBFeGVjdXRpb25EYXRhICYgbGlzdE9mT3RoZXJFRCwKKwkJCUNvbGxlY3Rpb25PZkFQRXhlY3V0aW9uRGF0YSAmIGxpc3RPZk91dHB1dEVEKTsKKworCWJvb2wgY29tcHV0ZVByb2R1Y3QoQVBFeGVjdXRpb25EYXRhICYgYW5JbnB1dEVELAorCQkJTGlzdE9mQVBFeGVjdXRpb25EYXRhICYgb25lTGlzdE9mRUQsCisJCQlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGEgJiBvdGhlckxpc3RPZkVELAorCQkJTGlzdE9mQVBFeGVjdXRpb25EYXRhICYgcmVzdWx0TGlzdE9mRUQpOworfTsKKworCisKK0FWTV9QUklNSVRJVkVfUlVOX0NMQVNTKFN5bmNocm9uaXplLCBCYXNlQXZtUHJpbWl0aXZlKQorCisKKworfQorCisjZW5kaWYgLyogQVZNQ09OQ1VSUkVOQ1lQUklNSVRJVkVfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1DdG9yUHJpbWl0aXZlLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1DdG9yUHJpbWl0aXZlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWYwZWY4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bUN0b3JQcmltaXRpdmUuY3BwCkBAIC0wLDAgKzEsNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxMiBhdnIuIDIwMTMKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkF2bUN0b3JQcmltaXRpdmUuaCIKKworI2luY2x1ZGUgPGNvbXB1dGVyL0V2YWx1YXRpb25FbnZpcm9ubWVudC5oPgorCisjaW5jbHVkZSA8Zm1sL3R5cGUvQmFzZVR5cGVTcGVjaWZpZXIuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworYm9vbCBBdm1QcmltaXRpdmVfQ3Rvcjo6c2V2YWwoRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCXN3aXRjaCggRU5WLmluQ09ERS0+Zmlyc3QoKS50b19wdHI8CisJCQlCYXNlVHlwZVNwZWNpZmllciA+KCktPmdldFR5cGVTcGVjaWZpZXJLaW5kKCkgKQorCXsKKwkJY2FzZSBUWVBFX09QRVJBVE9SX1NQRUNJRklFUjoKKwkJY2FzZSBUWVBFX0FWTUNPREVfU1BFQ0lGSUVSOgorCQljYXNlIFRZUEVfUE9SVF9TUEVDSUZJRVI6CisJCWNhc2UgVFlQRV9CVUZGRVJfU1BFQ0lGSUVSOgorCQljYXNlIFRZUEVfQ09OTkVDVE9SX1NQRUNJRklFUjoKKwkJY2FzZSBUWVBFX01BQ0hJTkVfU1BFQ0lGSUVSOgorCQkJcmV0dXJuKCBmYWxzZSApOworCisJCWNhc2UgVFlQRV9NRVNTQUdFX1NQRUNJRklFUjoKKwkJCXJldHVybiggZmFsc2UgKTsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1DdG9yUHJpbWl0aXZlLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtQ3RvclByaW1pdGl2ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1OWFiMzAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtQ3RvclByaW1pdGl2ZS5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxMiBhdnIuIDIwMTMKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBBVk1DVE9SUFJJTUlUSVZFX0hfCisjZGVmaW5lIEFWTUNUT1JQUklNSVRJVkVfSF8KKworI2luY2x1ZGUgPGNvbXB1dGVyL3ByaW1pdGl2ZS9CYXNlQXZtUHJpbWl0aXZlLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK0FWTV9QUklNSVRJVkVfRVZBTF9DTEFTUyhDdG9yLCBCYXNlQXZtUHJpbWl0aXZlKQorCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworI2VuZGlmIC8qIEFWTUNUT1JQUklNSVRJVkVfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1FeHByZXNzaW9uUHJpbWl0aXZlLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1FeHByZXNzaW9uUHJpbWl0aXZlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmM5OGNkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bUV4cHJlc3Npb25QcmltaXRpdmUuY3BwCkBAIC0wLDAgKzEsMTE5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTEgc2VwdC4gMjAxNQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQXZtRXhwcmVzc2lvblByaW1pdGl2ZS5oIgorCisjaW5jbHVkZSA8Y29tbW9uL0JGLmg+CisKKyNpbmNsdWRlIDxjb21wdXRlci9FdmFsdWF0aW9uRW52aXJvbm1lbnQuaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25Db25zdHJ1Y3RvckltcGwuaD4KKworbmFtZXNwYWNlIHNlcAoreworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gQ09NUEFSSVNPTiBQTFVTCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBBdm1QcmltaXRpdmVfRXZhbEV4cHJlc3Npb25BTFU6OnNldmFsKEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlBdm1Db2RlICogaW5DT0RFID0gRU5WLmluQ09ERTsKKworCU9wZXJhdG9yICogaW5PcGVyYXRvciA9IGluQ09ERS0+Z2V0T3BlcmF0b3IoKTsKKworCXN3aXRjaCggaW5DT0RFLT5zaXplKCkgKQorCXsKKwkJY2FzZSAwOgorCQl7CisJCQlFTlYub3V0VkFMID0gRU5WLmluRk9STTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQljYXNlIDE6CisJCXsKKwkJCWlmKCBFTlYuc2V2YWwoIGluQ09ERS0+Zmlyc3QoKSApICkKKwkJCXsKKwkJCQlFTlYub3V0VkFMID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjoKKwkJCQkJCW5ld0V4cHIoaW5PcGVyYXRvciwgRU5WLm91dFZBTCk7CisKKwkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCX0KKworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisKKwkJY2FzZSAyOgorCQl7CisJCQlCRiBsZWZ0VkFMOworCisJCQlpZiggRU5WLnNldmFsKCBpbkNPREUtPmZpcnN0KCkgKSApCisJCQl7CisJCQkJbGVmdFZBTCA9IEVOVi5vdXRWQUw7CisKKwkJCQlpZiggRU5WLnNldmFsQ2hhaW5lZCggaW5DT0RFLT5zZWNvbmQoKSApICkKKwkJCQl7CisJCQkJCUVOVi5vdXRWQUwgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6OgorCQkJCQkJCW5ld0V4cHIoaW5PcGVyYXRvciwgbGVmdFZBTCwgRU5WLm91dFZBTCk7CisKKwkJCQkJcmV0dXJuKCB0cnVlICk7CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlCRlZlY3RvciBvdXRWQUxzOworCisJCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdEFyZyAgPSBpbkNPREUtPmJlZ2luKCk7CisJCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBlbmRBcmcgPSBpbkNPREUtPmVuZCgpOworCisJCQlpZiggRU5WLnNldmFsKCAqaXRBcmcgKSApCisJCQl7CisJCQkJb3V0VkFMcy5hcHBlbmQoIEVOVi5vdXRWQUwgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQl9CisJCQlmb3IoICsraXRBcmcgOyBpdEFyZyAhPSBlbmRBcmcgOyArK2l0QXJnICkKKwkJCXsKKwkJCQlpZiggRU5WLnNldmFsQ2hhaW5lZCggKml0QXJnICkgKQorCQkJCXsKKwkJCQkJb3V0VkFMcy5hcHBlbmQoIEVOVi5vdXRWQUwgKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCX0KKwkJCX0KKworCQkJRU5WLm91dFZBTCA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3RXhwcihpbk9wZXJhdG9yLCBvdXRWQUxzKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1FeHByZXNzaW9uUHJpbWl0aXZlLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtRXhwcmVzc2lvblByaW1pdGl2ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZTk3YjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtRXhwcmVzc2lvblByaW1pdGl2ZS5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxMSBzZXB0LiAyMDE1CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQVZNX0NPTVBVVEVfUFJJTUlUSVZFX0FWTUVYUFJFU1NJT05QUklNSVRJVkVfSF8KKyNkZWZpbmUgQVZNX0NPTVBVVEVfUFJJTUlUSVZFX0FWTUVYUFJFU1NJT05QUklNSVRJVkVfSF8KKworI2luY2x1ZGUgPGNvbXB1dGVyL3ByaW1pdGl2ZS9CYXNlQXZtUHJpbWl0aXZlLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK0FWTV9QUklNSVRJVkVfRVZBTF9DTEFTUyhFdmFsRXhwcmVzc2lvbkFMVSwgQmFzZUF2bVByaW1pdGl2ZSkKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qIEFWTV9DT01QVVRFX1BSSU1JVElWRV9BVk1FWFBSRVNTSU9OUFJJTUlUSVZFX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtR3VhcmRQcmltaXRpdmUuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bUd1YXJkUHJpbWl0aXZlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTg5ZDk2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bUd1YXJkUHJpbWl0aXZlLmNwcApAQCAtMCwwICsxLDI1MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDIwIG1haSAyMDEwCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJBdm1HdWFyZFByaW1pdGl2ZS5oIgorCisjaW5jbHVkZSA8Y29tcHV0ZXIvRXZhbHVhdGlvbkVudmlyb25tZW50Lmg+CisjaW5jbHVkZSA8Y29tcHV0ZXIvRXhlY3V0aW9uRW52aXJvbm1lbnQuaD4KKworI2luY2x1ZGUgPGNvbXB1dGVyL1BhdGhDb25kaXRpb25Qcm9jZXNzb3IuaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0F2bUNvZGUuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkRhdGEuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lSUQuaD4KKworI2luY2x1ZGUgPHNvbHZlci9hcGkvU29sdmVyRGVmLmg+CisjaW5jbHVkZSA8c29sdmVyL2FwaS9Tb2x2ZXJGYWN0b3J5Lmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXhlY3V0aW9uIG9mIGEgR1VBUkQgcHJvZ3JhbQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitib29sIEF2bVByaW1pdGl2ZV9HdWFyZDo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworQVZNX0lGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9URVNUX0RFQ0lTSU9OICkKKwlBVk1fT1NfVFJBQ0UgPDwgImd1YXJkIDo+ICIgPDwgRU5WLm1BUkctPmF0KDApLnN0cigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfVEVTVF9ERUNJU0lPTiApCisKKwlpZiggRU5WLm1BUkctPmF0KDApLmlzRXF1YWxUcnVlKCkgICkKKwl7CisJCS8vISEgTk8gTkVFRCBQQVRIIENPTkRJVElPTiBVUERBVEUKKwkJRU5WLmFwcGVuZE91dHB1dCggRU5WLm1BUkctPm91dEVEICk7CisJfQorCisJZWxzZSBpZiggRU5WLm1BUkctPmF0KDApLmlzRXF1YWxGYWxzZSgpICApCisJeworQVZNX0lGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVCkKKwlBVk1fT1NfVFJBQ0UgPDwgIlRIUk9XIFVOU0FUSVNGSUVEIDw8IEdVQVJEID4+IDo+IGN0eDogIgorCQkJPDwgRU5WLm1BUkctPm91dEVELT5tUklELnN0cigpIDw8IEVPTAorCQkJPDwgVEFCIDw8ICJjb25kaXRpb246ICIgPDwgRU5WLmluQ09ERS0+c3RyKCkKKwkJCTw8ICIgfD0+ICIgPDwgRU5WLm1BUkctPmF0KDApLnN0cigpIDw8IEVPTF9GTFVTSDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTVEFURU1FTlQpCisJfQorCisJZWxzZQorCXsKKwkJaWYoIG5vdCBQYXRoQ29uZGl0aW9uUHJvY2Vzc29yOjphcHBlbmRQYXRoQ29uZGl0aW9uKAorCQkJCUVOViwgRU5WLm1BUkctPm91dEVELCBFTlYubUFSRy0+YXQoMCkpICkKKwkJeworQVZNX0lGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVCkKKwlBVk1fT1NfVFJBQ0UgPDwgIlRIUk9XIFVOU0FUSVNGSUVEIDw8IEdVQVJEID4+IDo+IGN0eDogIgorCQkJPDwgRU5WLm1BUkctPm91dEVELT5tUklELnN0cigpIDw8IEVPTAorCQkJPDwgVEFCIDw8ICIgICAgICAgUEM6ICIKKwkJCTw8IEVOVi5tQVJHLT5vdXRFRC0+Z2V0QWxsUGF0aENvbmRpdGlvbigpLnN0cigpIDw8IEVPTAorCQkJPDwgVEFCIDw8ICJjb25kaXRpb246ICIgPDwgRU5WLmluQ09ERS0+c3RyKCkgPDwgRU9MCisJCQk8PCBUQUIgPDwgIiAgICAgICB8PT4gIiA8PCBFTlYubUFSRy0+YXQoMCkuc3RyKCkKKwkJCTw8IEVPTF9GTFVTSDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTVEFURU1FTlQpCisJCX0KKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXhlY3V0aW9uIG9mIGEgVElNRUQgR1VBUkQgcHJvZ3JhbQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitib29sIEF2bVByaW1pdGl2ZV9UaW1lZEd1YXJkOjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CitBVk1fSUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX1RFU1RfREVDSVNJT04gKQorCUFWTV9PU19UUkFDRSA8PCAidGd1YXJkIDo+ICIgPDwgRU5WLm1BUkctPmF0KDApLnN0cigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfVEVTVF9ERUNJU0lPTiApCisKKwlpZiggRU5WLm1BUkctPmF0KDApLmlzRXF1YWxUcnVlKCkgICkKKwl7CisJCS8vISEgTk8gTkVFRCBQQVRIIENPTkRJVElPTiBVUERBVEUKKwkJRU5WLm91dEVEUy5hcHBlbmQoIEVOVi5tQVJHLT5vdXRFRCApOworCX0KKworCWVsc2UgaWYoIEVOVi5tQVJHLT5hdCgwKS5pc0VxdWFsRmFsc2UoKSAgKQorCXsKK0FWTV9JRl9ERUJVR19GTEFHKCBTVEFURU1FTlQpCisJQVZNX09TX1RSQUNFIDw8ICJUSFJPVyBVTlNBVElTRklFRCA8PCBHVUFSRCA+PiA6PiBjdHg6ICIKKwkJCTw8IEVOVi5tQVJHLT5vdXRFRC0+bVJJRC5zdHIoKSA8PCBFT0wKKwkJCTw8IFRBQiA8PCAiY29uZGl0aW9uOiAiIDw8IEVOVi5pbkNPREUtPnN0cigpCisJCQk8PCAiIHw9PiAiIDw8IEVOVi5tQVJHLT5hdCgwKS5zdHIoKSA8PCBFT0xfRkxVU0g7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggU1RBVEVNRU5UKQorCX0KKworCWVsc2UKKwl7CisJCWlmKCBub3QgUGF0aENvbmRpdGlvblByb2Nlc3Nvcjo6YXBwZW5kUGF0aFRpbWVkQ29uZGl0aW9uKAorCQkJCUVOViwgRU5WLm1BUkctPm91dEVELCBFTlYubUFSRy0+YXQoMCkpICkKKwkJeworQVZNX0lGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVCkKKwlBVk1fT1NfVFJBQ0UgPDwgIlRIUk9XIFVOU0FUSVNGSUVEIDw8IFRHVUFSRCA+PiA6PiBjdHg6ICIKKwkJCTw8IEVOVi5tQVJHLT5vdXRFRC0+bVJJRC5zdHIoKSA8PCBFT0wKKwkJCTw8IFRBQiA8PCAiICAgICAgIFBDOiAiCisJCQk8PCBFTlYubUFSRy0+b3V0RUQtPmdldEFsbFBhdGhDb25kaXRpb24oKS5zdHIoKSA8PCBFT0wKKwkJCTw8IFRBQiA8PCAiY29uZGl0aW9uOiAiIDw8IEVOVi5pbkNPREUtPnN0cigpIDw8IEVPTAorCQkJPDwgVEFCIDw8ICIgICAgICAgfD0+ICIgPDwgRU5WLm1BUkctPmF0KDApLnN0cigpCisJCQk8PCBFT0xfRkxVU0g7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggU1RBVEVNRU5UKQorCQl9CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV4ZWN1dGlvbiBvZiBhIEVWRU5UIHByb2dyYW0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworYm9vbCBBdm1QcmltaXRpdmVfRXZlbnQ6OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKK0FWTV9JRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfVEVTVF9ERUNJU0lPTiApCisJQVZNX09TX1RSQUNFIDw8ICJldmVudCA6PiAiIDw8IEVOVi5tQVJHLT5hdCgwKS5zdHIoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX1RFU1RfREVDSVNJT04gKQorCisJaWYoIEVOVi5tQVJHLT5hdCgwKS5pc0VxdWFsVHJ1ZSgpICApCisJeworCQkvLyEhIE5PIE5FRUQgUEFUSCBDT05ESVRJT04gVVBEQVRFCisJCUVOVi5hcHBlbmRPdXRwdXQoIEVOVi5tQVJHLT5vdXRFRCApOworCX0KKwllbHNlIGlmKCBFTlYubUFSRy0+YXQoMCkuaXNFcXVhbEZhbHNlKCkgKQorCXsKK0FWTV9JRl9ERUJVR19GTEFHKCBTVEFURU1FTlQpCisJQVZNX09TX1RSQUNFIDw8ICJUSFJPVyBVTlNBVElTRklFRCA8PCBFVkVOVCA+PiA6ICIKKwkJCTw8IEVOVi5tQVJHLT5vdXRFRC0+bVJJRC5zdHJVbmlxSWQoKSA8PCAiICwgIgorCQkJPDwgRU5WLmluQ09ERS0+Zmlyc3QoKS5zdHIoKSAgPDwgIiB8PT4gIgorCQkJPDwgRU5WLm1BUkctPmF0KDApLnN0cigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTVEFURU1FTlQpCisJfQorCWVsc2UKKwl7CitBVk1fSUZfREVCVUdfRkxBRyggU1RBVEVNRU5UKQorCUFWTV9PU19UUkFDRSA8PCAiVEhST1cgVU5LTk9XTiBTQVRJU0ZJQUJJTElUWSBPRiA8PCBFVkVOVCA+PiA6ICIKKwkJCTw8IEVOVi5tQVJHLT5vdXRFRC0+bVJJRC5zdHJVbmlxSWQoKSA8PCAiICwgIgorCQkJPDwgRU5WLmluQ09ERS0+Zmlyc3QoKS5zdHIoKSAgPDwgIiB8PT4gIgorCQkJPDwgRU5WLm1BUkctPmF0KDApLnN0cigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTVEFURU1FTlQpCisKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXhlY3V0aW9uIG9mIGEgQ0hFQ0tfU0FUIHByb2dyYW0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworYm9vbCBBdm1QcmltaXRpdmVfQ2hlY2tTYXQ6OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlpZiggRU5WLm1BUkctPmF0KDApLmlzQnVpbHRpblN0cmluZygpICkKKwl7CisJCXN0ZDo6c3RyaW5nIHRoZVNvbHZlciA9IEVOVi5tQVJHLT5hdCgwKS50b0J1aWx0aW5TdHJpbmcoKTsKKworQVZNX0lGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9URVNUX0RFQ0lTSU9OICkKKwlBVk1fT1NfVFJBQ0UgPDwgImNoZWNrU2F0PCAiIDw8IHRoZVNvbHZlciA8PCAiID4gIgorCQkJPDwgRU5WLm1BUkctPmF0KDEpLnN0cigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfVEVTVF9ERUNJU0lPTiApCisKKwkJaWYoIEVOVi5tQVJHLT5hdCgxKS5pc0VxdWFsVHJ1ZSgpICApCisJCXsKKwkJCS8vISEgTk8gTkVFRCBQQVRIIENPTkRJVElPTiBVUERBVEUKKwkJCUVOVi5hcHBlbmRPdXRwdXQoIEVOVi5tQVJHLT5vdXRFRCApOworCQl9CisKKwkJZWxzZSBpZiggRU5WLm1BUkctPmF0KDEpLmlzRXF1YWxGYWxzZSgpICApCisJCXsKK0FWTV9JRl9ERUJVR19GTEFHKCBTVEFURU1FTlQpCisJQVZNX09TX1RSQUNFIDw8ICJUSFJPVyBVTlNBVElTRklFRCA8PCBDSEVDSyNTQVQgPj4gOj4gY3R4OiAiCisJCQk8PCBFTlYubUFSRy0+b3V0RUQtPm1SSUQuc3RyKCkgPDwgRU9MCisJCQk8PCBUQUIgPDwgImNvbmRpdGlvbjogIiA8PCBFTlYuaW5DT0RFLT5zdHIoKQorCQkJPDwgIiB8PT4gIiA8PCBFTlYubUFSRy0+YXQoMCkuc3RyKCkKKwkJCTw8IEVPTF9GTFVTSDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTVEFURU1FTlQpCisJCX0KKworCQllbHNlIGlmKCBTb2x2ZXJGYWN0b3J5Ojppc1dlYWtTYXRpc2ZpYWJsZShTb2x2ZXJEZWY6OnRvU29sdmVyKAorCQkJCXRoZVNvbHZlciwgU29sdmVyRGVmOjpERUZBVUxUX1NPTFZFUl9LSU5EKSwgRU5WLm1BUkctPmF0KDEpKSApCisJCXsKKwkJCS8vISEgTk8gTkVFRCBQQVRIIENPTkRJVElPTiBVUERBVEUKKwkJCUVOVi5hcHBlbmRPdXRwdXQoIEVOVi5tQVJHLT5vdXRFRCApOworCQl9CisJCWVsc2UKKwkJeworQVZNX0lGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVCkKKwlBVk1fT1NfVFJBQ0UgPDwgIlRIUk9XIFVOU0FUSVNGSUVEIDw8IENIRUNLI1NBVCA+PiA6PiBjdHg6ICIKKwkJCTw8IEVOVi5tQVJHLT5vdXRFRC0+bVJJRC5zdHIoKSA8PCBFT0wKKwkJCTw8IFRBQiA8PCAiICAgICAgIFBDOiAiCisJCQk8PCBFTlYubUFSRy0+b3V0RUQtPmdldEFsbFBhdGhDb25kaXRpb24oKS5zdHIoKSA8PCBFT0wKKwkJCTw8IFRBQiA8PCAiY29uZGl0aW9uOiAiIDw8IEVOVi5pbkNPREUtPnN0cigpIDw8IEVPTAorCQkJPDwgVEFCIDw8ICIgICAgICAgfD0+ICIgPDwgRU5WLm1BUkctPmF0KDApLnN0cigpCisJCQk8PCBFT0xfRkxVU0g7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggU1RBVEVNRU5UKQorCQl9CisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisKKwllbHNlIGlmKCBTb2x2ZXJGYWN0b3J5Ojppc1dlYWtTYXRpc2ZpYWJsZShFTlYubUFSRy0+YXQoMCkpICkKKwl7CisJCS8vISEgTk8gTkVFRCBQQVRIIENPTkRJVElPTiBVUERBVEUKKwkJRU5WLmFwcGVuZE91dHB1dCggRU5WLm1BUkctPm91dEVEICk7CisJfQorCWVsc2UKKwl7CitBVk1fSUZfREVCVUdfRkxBRyggU1RBVEVNRU5UKQorCUFWTV9PU19UUkFDRSA8PCAiVEhST1cgVU5TQVRJU0ZJRUQgPDwgQ0hFQ0sjU0FUID4+IDo+IGN0eDogIgorCQkJPDwgRU5WLm1BUkctPm91dEVELT5tUklELnN0cigpIDw8IEVPTAorCQkJPDwgVEFCIDw8ICIgICAgICAgUEM6ICIKKwkJCTw8IEVOVi5tQVJHLT5vdXRFRC0+Z2V0QWxsUGF0aENvbmRpdGlvbigpLnN0cigpIDw8IEVPTAorCQkJPDwgVEFCIDw8ICJjb25kaXRpb246ICIgPDwgRU5WLmluQ09ERS0+c3RyKCkgPDwgRU9MCisJCQk8PCBUQUIgPDwgIiAgICAgICB8PT4gIiA8PCBFTlYubUFSRy0+YXQoMCkuc3RyKCkKKwkJCTw8IEVPTF9GTFVTSDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTVEFURU1FTlQpCisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bUd1YXJkUHJpbWl0aXZlLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtR3VhcmRQcmltaXRpdmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjI4MjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bUd1YXJkUHJpbWl0aXZlLmgKQEAgLTAsMCArMSwzNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDIwIG1haSAyMDEwCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQVZNR1VBUkRQUklNSVRJVkVfSF8KKyNkZWZpbmUgQVZNR1VBUkRQUklNSVRJVkVfSF8KKworI2luY2x1ZGUgPGNvbXB1dGVyL3ByaW1pdGl2ZS9CYXNlQXZtUHJpbWl0aXZlLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCitBVk1fUFJJTUlUSVZFX1JVTl9DTEFTUyhHdWFyZCwgQmFzZUF2bVByaW1pdGl2ZSkKKworQVZNX1BSSU1JVElWRV9SVU5fQ0xBU1MoVGltZWRHdWFyZCwgQmFzZUF2bVByaW1pdGl2ZSkKKworQVZNX1BSSU1JVElWRV9SVU5fQ0xBU1MoRXZlbnQsIEJhc2VBdm1QcmltaXRpdmUpCisKK0FWTV9QUklNSVRJVkVfUlVOX0NMQVNTKENoZWNrU2F0LCBCYXNlQXZtUHJpbWl0aXZlKQorCisKK30KKworI2VuZGlmIC8qIEFWTUdVQVJEUFJJTUlUSVZFX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtSW5wdXRFbmFibGVkUHJpbWl0aXZlLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1JbnB1dEVuYWJsZWRQcmltaXRpdmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYzMwZTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtSW5wdXRFbmFibGVkUHJpbWl0aXZlLmNwcApAQCAtMCwwICsxLDI5OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDI2IGbDqXZyLiAyMDE0CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJBdm1JbnB1dEVuYWJsZWRQcmltaXRpdmUuaCIKKworI2luY2x1ZGUgPGJ1aWxkZXIvYW5hbHlzaXMvQ29tbXVuaWNhdGlvbkRlcGVuZGVuY3kuaD4KKworI2luY2x1ZGUgPGNvbXB1dGVyL0V4ZWN1dGlvbkVudmlyb25tZW50Lmg+CisjaW5jbHVkZSA8Y29tcHV0ZXIvcHJpbWl0aXZlL0F2bUNvbW11bmljYXRpb25GYWN0b3J5Lmg+CisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9Sb3V0aW5nRGF0YS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBleGVjdXRpb24gb2YgYSBJTlBVVF9FTkFCTEVEIHByb2dyYW0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworYm9vbCBBdm1QcmltaXRpdmVfSW5wdXRFbmFibGVkOjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJQVBFeGVjdXRpb25EYXRhIG91dEVEID0gRU5WLmluRUQ7CisKKwlMaXN0T2ZJbnN0YW5jZU9mUG9ydCAqIGllQ29tcyAgPSBOVUxMOworCUxpc3RPZkluc3RhbmNlT2ZQb3J0ICogaWVTYXZlcyA9IE5VTEw7CisKKwlMaXN0T2ZJbnN0YW5jZU9mUG9ydCAgaWVNdXRhYmxlQ29tczsKKwlMaXN0T2ZJbnN0YW5jZU9mUG9ydCAgaWVNdXRhYmxlU2F2ZXM7CisKKwkvLyBjYXNlIG9mIGEgY29tcG9zaXRlIG1hY2hpbmUKKwlpZiggb3V0RUQtPm1SSUQuZ2V0RXhlY3V0YWJsZSgpLT5pc011dGFibGVDb21tdW5pY2F0aW9uKCkgKQorCXsKKwkJQ29tbXVuaWNhdGlvbkRlcGVuZGVuY3k6OmNvbXB1dGVJbnB1dEVuYWJsZWRDb20oKCogb3V0RUQpLCBvdXRFRC0+bVJJRCwKKwkJCQlpZU11dGFibGVDb21zLCBFTlYuaW5DT0RFLT5maXJzdCgpLnRvX3B0cjwgQXZtQ29kZSA+KCkgKTsKKworCQlpZiggaWVNdXRhYmxlQ29tcy5lbXB0eSgpICkKKwkJeworCQkJcmV0dXJuKCBFTlYucnVuKEVOVi5pbkNPREUtPmZpcnN0KCkuYmZDb2RlKCkpICk7CisJCX0KKworCQlDb21tdW5pY2F0aW9uRGVwZW5kZW5jeTo6Y29tcHV0ZUlucHV0RW5hYmxlZFNhdmUoKCogb3V0RUQpLCBvdXRFRC0+bVJJRCwKKwkJCQlpZU11dGFibGVTYXZlcywgRU5WLmluQ09ERS0+Zmlyc3QoKS50b19wdHI8IEF2bUNvZGUgPigpICk7CisKKwkJaWVDb21zICA9ICYgaWVNdXRhYmxlQ29tczsKKwkJaWVTYXZlcyA9ICYgaWVNdXRhYmxlU2F2ZXM7CisKKy8vISEhIERFQlVHIFRSQUNFCitBVk1fSUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX1NDSEVEVUxJTkcgKQorCUFWTV9PU19UUkFDRSA8PCBzdGQ6OmVuZGwgPDwgIklucHV0RW5hYmxlZDptdXRhYmxlPiAiIDw8IG91dEVELT5tUklELnN0cigpCisJCQk8PCBzdGQ6OmVuZGw7CisJb3V0RUQtPm1SSUQuZ2V0RXhlY3V0YWJsZSgpLT5nZXRPblJ1bigpLT50b1N0cmVhbShBVk1fT1NfVFJBQ0UpOworCisJb3V0RUQtPm1SSUQuZ2V0RXhlY3V0YWJsZSgpLT50b1N0cmVhbVN0YXRpY0NvbShBVk1fT1NfVFJBQ0UpOworCisJQVZNX09TX1RSQUNFIDw8ICJjb20jaW5wdXRfZW5hYmxlZHsiIDw8IHN0ZDo6ZW5kbDsKKwlCYXNlQ29tcGlsZWRGb3JtOjp0b1N0cmVhbVN0YXRpY0NvbShBVk1fT1NfVFJBQ0UsIGllTXV0YWJsZUNvbXMpOworCUFWTV9PU19UUkFDRSA8PCAifSIgPDwgc3RkOjplbmRsOworCisJaWYoIGllTXV0YWJsZVNhdmVzLm5vbmVtcHR5KCkgKQorCXsKKwkJQVZNX09TX1RSQUNFIDw8ICJjb20jaW5wdXRfZW5hYmxlZCNzYXZleyIgPDwgc3RkOjplbmRsOworCQlCYXNlQ29tcGlsZWRGb3JtOjp0b1N0cmVhbVN0YXRpY0NvbShBVk1fT1NfVFJBQ0UsIGllTXV0YWJsZVNhdmVzKTsKKwkJQVZNX09TX1RSQUNFIDw8ICJ9IiA8PCBzdGQ6OmVuZGw7CisJfQorQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9TQ0hFRFVMSU5HICkKKy8vISEhIEVORCBERUJVRyBUUkFDRQorCX0KKwllbHNlCisJeworCQkvLyB0aGUgZXhwZWN0ZWQgKGlucHV0KSBjb21tdW5pY2F0aW9uIGVsZW1lbnQKKwkJaWVDb21zID0gJigJb3V0RUQtPm1SSUQuZ2V0RXhlY3V0YWJsZSgpLT5nZXRJbnB1dEVuYWJsZWRDb20oKSApOworCisJCS8vIHRoZSBzYXZlIChpbnB1dCkgY29tbXVuaWNhdGlvbiBlbGVtZW50CisJCWllU2F2ZXMgPSAmKCBvdXRFRC0+bVJJRC5nZXRFeGVjdXRhYmxlKCktPmdldElucHV0RW5hYmxlZFNhdmUoKSApOworCisvLyEhISBERUJVRyBUUkFDRQorQVZNX0lGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9TQ0hFRFVMSU5HICkKKwlBVk1fT1NfVFJBQ0UgPDwgc3RkOjplbmRsIDw8ICJJbnB1dEVuYWJsZWQ6ZmluYWw+ICIgPDwgb3V0RUQtPm1SSUQuc3RyKCkKKwkJCTw8IHN0ZDo6ZW5kbDsKKwlvdXRFRC0+bVJJRC5nZXRFeGVjdXRhYmxlKCktPmdldE9uUnVuKCktPnRvU3RyZWFtKEFWTV9PU19UUkFDRSk7CisJb3V0RUQtPm1SSUQuZ2V0RXhlY3V0YWJsZSgpLT50b1N0cmVhbVN0YXRpY0NvbShBVk1fT1NfVFJBQ0UpOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9TQ0hFRFVMSU5HICkKKy8vISEhIEVORCBERUJVRyBUUkFDRQorCX0KKworCUxpc3RPZk1lc3NhZ2Ugc2F2ZU1lc3NhZ2VzOworCisJLy8gdGhlIEJ1ZmZlciBJbnN0YW5jZQorCUluc3RhbmNlT2ZCdWZmZXIgKiBpZUJ1ZmZlciA9CisJCQlvdXRFRC0+bVJJRC5nZXRFeGVjdXRhYmxlKCktPmdldElucHV0RW5hYmxlZEJ1ZmZlcigpLmZyb250KCk7CisKKwkvLyB0aGUgcnVudGltZSBidWZmZXIgbWFjaGluZSBSSUQKKwlSdW50aW1lSUQgdG1wUklEID0gb3V0RUQtPmdldFJ1bnRpbWVDb250YWluZXJSSUQoaWVCdWZmZXIpOworCisJLy8gdGhlIHJ1bnRpbWUgKHJlYWRpbmcpIGJ1ZmZlcgorCWNvbnN0IEJhc2VCdWZmZXJGb3JtICYgcmVhZGFibGVCdWZmZXIgPQorCQkJb3V0RUQtPmdldFJ1bnRpbWUodG1wUklEKS5nZXRCdWZmZXIoIGllQnVmZmVyICk7CisKKworLy8hISEgREVCVUcgVFJBQ0UKK0FWTV9JRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfU0NIRURVTElORyApCisJQVZNX09TX1RSQUNFIDw8IGllQnVmZmVyLT5nZXROYW1lSUQoKSA8PCAiOj4iIDw8IHN0ZDo6ZW5kbDsKKwlyZWFkYWJsZUJ1ZmZlci50b0ZzY24oQVZNX09TX1RSQUNFLCB0bXBSSUQpOworCUFWTV9PU19UUkFDRSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX1NDSEVEVUxJTkcgKQorLy8hISEgRU5EIERFQlVHIFRSQUNFCisKKworCWlmKCByZWFkYWJsZUJ1ZmZlci5ub25lbXB0eSgpICkKKwl7CisJCS8vIHRoZSBydW50aW1lIG5vbi1lbXB0eSAod3JpdGluZykgYnVmZmVyCisJCUJhc2VCdWZmZXJGb3JtICYgd3JpdGFibGVCdWZmZXIgPSBvdXRFRC5nZXRXcml0YWJsZVJ1bnRpbWUoCisJCQkJdG1wUklEICkuZ2V0V3JpdGFibGVCdWZmZXIoIGllQnVmZmVyICk7CisKKworLy8hISEgREVCVUcgVFJBQ0UKK0FWTV9JRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfU0NIRURVTElORyApCisJQVZNX09TX1RSQUNFIDw8IHN0ZDo6ZW5kbCA8PCAiSW5wdXRFbmFibGVkOmF2PiAiIDw8IG91dEVELT5tUklELnN0cigpCisJCQk8PCBzdGQ6OmVuZGw7CisJb3V0RUQtPm1SSUQuZ2V0RXhlY3V0YWJsZSgpLT5nZXRPblJ1bigpLT50b1N0cmVhbShBVk1fT1NfVFJBQ0UpOworCisJQVZNX09TX1RSQUNFIDw8ICJjb20jaW5wdXRfZW5hYmxlZDxtdXRhYmxlPnsiIDw8IHN0ZDo6ZW5kbDsKKwlCYXNlQ29tcGlsZWRGb3JtOjp0b1N0cmVhbVN0YXRpY0NvbShBVk1fT1NfVFJBQ0UsICppZUNvbXMpOworCUFWTV9PU19UUkFDRSA8PCAifSIgPDwgc3RkOjplbmRsOworCisJaWYoIGllU2F2ZXMtPm5vbmVtcHR5KCkgKQorCXsKKwkJQVZNX09TX1RSQUNFIDw8ICJjb20jaW5wdXRfZW5hYmxlZCNzYXZlPG11dGFibGU+eyIgPDwgc3RkOjplbmRsOworCQlCYXNlQ29tcGlsZWRGb3JtOjp0b1N0cmVhbVN0YXRpY0NvbShBVk1fT1NfVFJBQ0UsICppZVNhdmVzKTsKKwkJQVZNX09TX1RSQUNFIDw8ICJ9IiA8PCBzdGQ6OmVuZGw7CisJfQorCisJQVZNX09TX1RSQUNFIDw8IGllQnVmZmVyLT5nZXROYW1lSUQoKSA8PCAiOj4iIDw8IHN0ZDo6ZW5kbDsKKwl3cml0YWJsZUJ1ZmZlci50b0ZzY24oQVZNX09TX1RSQUNFLCB0bXBSSUQpOworCUFWTV9PU19UUkFDRSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX1NDSEVEVUxJTkcgKQorLy8hISEgRU5EIERFQlVHIFRSQUNFCisKKworCQlMaXN0T2ZTaXplVCBpZU1pZENvbXM7CisJCVJ1bnRpbWVJRCBhUm91dGluZ1JJRCA9IG91dEVELT5tUklEOworCisJCUxpc3RPZkluc3RhbmNlT2ZQb3J0Ojpjb25zdF9pdGVyYXRvciBpdFBvcnQgPSBpZUNvbXMtPmJlZ2luKCk7CisJCUxpc3RPZkluc3RhbmNlT2ZQb3J0Ojpjb25zdF9pdGVyYXRvciBlbkl0UG9ydCA9IGllQ29tcy0+ZW5kKCk7CisJCWZvciggOyBpdFBvcnQgIT0gZW5JdFBvcnQgOyArK2l0UG9ydCApCisJCXsKKwkJCWlmKCAoKml0UG9ydCktPmhhc0lucHV0Um91dGluZ0RhdGEoKSApCisJCQl7CisJCQkJaWVNaWRDb21zLmFwcGVuZCggKCppdFBvcnQpLT5nZXRJbnB1dFJvdXRpbmdEYXRhKCkuZ2V0TUlEKCkgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQljb25zdCBSb3V0aW5nRGF0YSAmIGFSb3V0aW5nRGF0YSA9IEF2bUNvbW11bmljYXRpb25GYWN0b3J5OjoKKwkJCQkJc2VhcmNoSW5wdXRSb3V0aW5nRGF0YSggb3V0RUQsICgqaXRQb3J0KSwgYVJvdXRpbmdSSUQgKTsKKwkJCQlpZiggYVJvdXRpbmdEYXRhLnZhbGlkKCkgKQorCQkJCXsKKwkJCQkJaWVNaWRDb21zLmFwcGVuZCggYVJvdXRpbmdEYXRhLmdldE1JRCgpICk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYoIGllU2F2ZXMtPmVtcHR5KCkgKQorCQl7CisJCQlpZiggaWVNaWRDb21zLm5vbmVtcHR5KCkgKQorCQkJeworCQkJCXdyaXRhYmxlQnVmZmVyLnBvcEJlZm9yZSggaWVNaWRDb21zICwgb3V0RUQtPm1SSUQpOworCQkJfQorCQkJZWxzZSBpZiggKCppZUNvbXMpLm5vbmVtcHR5KCkgKQorCQkJeworCQkJCXdyaXRhYmxlQnVmZmVyLnBvcEJlZm9yZSggKmllQ29tcyAsIG91dEVELT5tUklEKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQl3cml0YWJsZUJ1ZmZlci5wb3BCZWZvcmUoIG91dEVELT5tUklEKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCUxpc3RPZlNpemVUIGllTWlkU2F2ZXM7CisJCQllbkl0UG9ydCA9IGllU2F2ZXMtPmVuZCgpOworCQkJZm9yKCBpdFBvcnQgPSBpZVNhdmVzLT5iZWdpbigpIDsgaXRQb3J0ICE9IGVuSXRQb3J0IDsgKytpdFBvcnQgKQorCQkJeworCQkJCWlmKCAoKml0UG9ydCktPmhhc0lucHV0Um91dGluZ0RhdGEoKSApCisJCQkJeworCQkJCQlpZU1pZFNhdmVzLmFwcGVuZCgKKwkJCQkJCQkoKml0UG9ydCktPmdldElucHV0Um91dGluZ0RhdGEoKS5nZXRNSUQoKSApOworCQkJCX0KKwkJCX0KKworCQkJd2hpbGUoIHdyaXRhYmxlQnVmZmVyLm5vbmVtcHR5KCkgKQorCQkJeworCQkJCWlmKCBpZU1pZENvbXMubm9uZW1wdHkoKSApCisJCQkJeworCQkJCQlpZiggaWVNaWRDb21zLmNvbnRhaW5zKCB3cml0YWJsZUJ1ZmZlci50b3AoKS5nZXRNSUQoKSApICkKKwkJCQkJeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZiggaWVDb21zLT5jb250YWlucyggd3JpdGFibGVCdWZmZXIudG9wKCkuZ2V0UG9ydCgpICkgKQorCQkJCXsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJZWxzZSBpZiggaWVNaWRTYXZlcy5ub25lbXB0eSgpICkKKwkJCQl7CisJCQkJCWlmKCBpZU1pZFNhdmVzLmNvbnRhaW5zKCB3cml0YWJsZUJ1ZmZlci50b3AoKS5nZXRNSUQoKSApICkKKwkJCQkJeworCQkJCQkJc2F2ZU1lc3NhZ2VzLnB1c2hfYmFjayggd3JpdGFibGVCdWZmZXIucG9wKCkgKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXdyaXRhYmxlQnVmZmVyLnBvcCgpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWlmKCBpZVNhdmVzLT5jb250YWlucyggd3JpdGFibGVCdWZmZXIudG9wKCkuZ2V0UG9ydCgpICkgKQorCQkJCQl7CisJCQkJCQlzYXZlTWVzc2FnZXMucHVzaF9iYWNrKCB3cml0YWJsZUJ1ZmZlci5wb3AoKSApOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJd3JpdGFibGVCdWZmZXIucG9wKCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiggd3JpdGFibGVCdWZmZXIubm9uZW1wdHkoKSApCisJCXsKKy8vISEhIERFQlVHIFRSQUNFCitBVk1fSUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX1NDSEVEVUxJTkcgKQorCUFWTV9PU19UUkFDRSA8PCAiSW5wdXRFbmFibGVkOmFwPiBGT1VORCBDT00gISEhIiA8PCBzdGQ6OmVuZGw7CisKKwlBVk1fT1NfVFJBQ0UgPDwgaWVCdWZmZXItPmdldE5hbWVJRCgpIDw8ICI6PiIgPDwgc3RkOjplbmRsOworCXdyaXRhYmxlQnVmZmVyLnRvRnNjbihBVk1fT1NfVFJBQ0UsIHRtcFJJRCk7CisJQVZNX09TX1RSQUNFIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfU0NIRURVTElORyApCisvLyEhISBFTkQgREVCVUcgVFJBQ0UKKwkJfQorCisJCUV4ZWN1dGlvbkVudmlyb25tZW50IHRtcEVOVihFTlYsIG91dEVELCBFTlYuaW5DT0RFLT5maXJzdCgpLmJmQ29kZSgpKTsKKwkJaWYoIHRtcEVOVi5ydW4oKSApCisJCXsKKwkJCWlmKCBzYXZlTWVzc2FnZXMubm9uZW1wdHkoKSApCisJCQl7CisJCQkJcmVzdG9yZU1lc3NhZ2UodG1wUklELCBpZUJ1ZmZlciwgc2F2ZU1lc3NhZ2VzLCB0bXBFTlYub3V0RURTICk7CisJCQkJcmVzdG9yZU1lc3NhZ2UodG1wUklELCBpZUJ1ZmZlciwgc2F2ZU1lc3NhZ2VzLCB0bXBFTlYuc3luY0VEUyk7CisJCQkJcmVzdG9yZU1lc3NhZ2UodG1wUklELCBpZUJ1ZmZlciwgc2F2ZU1lc3NhZ2VzLCB0bXBFTlYuaXJxRURTICk7CisJCQkJcmVzdG9yZU1lc3NhZ2UodG1wUklELCBpZUJ1ZmZlciwgc2F2ZU1lc3NhZ2VzLCB0bXBFTlYuZXhpdEVEUyk7CisJCQl9CisKKwkJCUVOVi5zcGxpY2VPdXRwdXQoIHRtcEVOViApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlyZXR1cm4oIEVOVi5ydW4oRU5WLmluQ09ERS0+Zmlyc3QoKS5iZkNvZGUoKSkgKTsKKwl9Cit9CisKKwordm9pZCBBdm1QcmltaXRpdmVfSW5wdXRFbmFibGVkOjpyZXN0b3JlTWVzc2FnZSgKKwkJY29uc3QgUnVudGltZUlEICYgcmllUklELCBJbnN0YW5jZU9mQnVmZmVyICogaWVCdWZmZXIsCisJCUxpc3RPZk1lc3NhZ2UgJiBzYXZlTWVzc2FnZXMsIExpc3RPZkFQRXhlY3V0aW9uRGF0YSBFRFMpCit7CisJTGlzdE9mQVBFeGVjdXRpb25EYXRhOjppdGVyYXRvciBpdEVEID0gRURTLmJlZ2luKCk7CisJTGlzdE9mQVBFeGVjdXRpb25EYXRhOjppdGVyYXRvciBlbmRFRCA9IEVEUy5lbmQoKTsKKwlmb3IoIDsgaXRFRCAhPSBlbmRFRCA7ICsraXRFRCApCisJeworCQkoKml0RUQpLmdldFdyaXRhYmxlUnVudGltZSggcmllUklEICkuZ2V0V3JpdGFibGVCdWZmZXIoCisJCQkJaWVCdWZmZXIgKS5yZXN0b3JlKCBzYXZlTWVzc2FnZXMgKTsKKwl9Cit9CisKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1JbnB1dEVuYWJsZWRQcmltaXRpdmUuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1JbnB1dEVuYWJsZWRQcmltaXRpdmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDE2MmRmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bUlucHV0RW5hYmxlZFByaW1pdGl2ZS5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyNiBmw6l2ci4gMjAxNAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEFWTUlOUFVURU5BQkxFRFBSSU1JVElWRV9IXworI2RlZmluZSBBVk1JTlBVVEVOQUJMRURQUklNSVRJVkVfSF8KKworI2luY2x1ZGUgPGNvbXB1dGVyL3ByaW1pdGl2ZS9CYXNlQXZtUHJpbWl0aXZlLmg+CisKKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25EYXRhLmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvTWVzc2FnZS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitBVk1fUFJJTUlUSVZFX1JVTl9DTEFTU19IRUFERVIoSW5wdXRFbmFibGVkLCBCYXNlQXZtUHJpbWl0aXZlKQorCXZvaWQgcmVzdG9yZU1lc3NhZ2UoCisJCQljb25zdCBSdW50aW1lSUQgJiByaWVSSUQsIEluc3RhbmNlT2ZCdWZmZXIgKiBpZUJ1ZmZlciwKKwkJCUxpc3RPZk1lc3NhZ2UgJiBzYXZlTWVzc2FnZXMsIExpc3RPZkFQRXhlY3V0aW9uRGF0YSBFRFMpOworCit9OworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworCisjZW5kaWYgLyogQVZNSU5QVVRFTkFCTEVEUFJJTUlUSVZFX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtSW52b2tlUHJpbWl0aXZlLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1JbnZva2VQcmltaXRpdmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YWNkNDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtSW52b2tlUHJpbWl0aXZlLmNwcApAQCAtMCwwICsxLDE0NTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyIG5vdi4gMjAxMAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQXZtSW52b2tlUHJpbWl0aXZlLmgiCisKKworI2luY2x1ZGUgPGJ1aWxkZXIvTG9hZGVyLmg+CisKKyNpbmNsdWRlIDxjb21wdXRlci9FdmFsdWF0aW9uRW52aXJvbm1lbnQuaD4KKyNpbmNsdWRlIDxjb21wdXRlci9FeGVjdXRpb25EYXRhRmFjdG9yeS5oPgorI2luY2x1ZGUgPGNvbXB1dGVyL0V4ZWN1dGlvbkVudmlyb25tZW50Lmg+CisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9Bdm1MYW1iZGEuaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9Bdm1Qcm9ncmFtLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvQXZtVHJhbnNpdGlvbi5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZEYXRhLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZk1hY2hpbmUuaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0F2bUNvZGUuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9CdWlsdGluQXJyYXkuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkNvbmZpZ3VyYXRpb24uaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9Mb2NhbFJ1bnRpbWUuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lRm9ybS5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL1J1bnRpbWVMaWIuaD4KKworI2luY2x1ZGUgPGZtbC90eXBlL1R5cGVNYW5hZ2VyLmg+CisKKyNpbmNsdWRlIDxzZXcvU3ltYmV4RW5naW5lLmg+CisKKyNpbmNsdWRlIDx1dGlsL0V4ZWN1dGlvblRpbWUuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBleGVjdXRpb24gb2YgYSBJTlZPS0UgTkVXIG1ldGEgcHJvZ3JhbQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgQXZtUHJpbWl0aXZlX0ludm9rZU5ldzo6c2V2YWwoRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCUluc3RhbmNlT2ZNYWNoaW5lICogYW5JbnN0YW5jZUR5bmFtaWMgPQorCQkJRU5WLm1BUkctPmF0KDApLnRvX3B0cjwgSW5zdGFuY2VPZk1hY2hpbmUgPigpOworCisJRU5WLm91dEVEID0gRU5WLm1BUkctPm91dEVEOworCisJUnVudGltZUlEIGludm9rZXJSSUQgPSBFTlYub3V0RUQtPm1SSUQ7CisKKwlpZiggRU5WLm91dEVELT5jb3VsZEJlSW5zdGFuY2lhdGVkKCBhbkluc3RhbmNlRHluYW1pYyApICkKKwl7CisJCWNvbnN0IFJ1bnRpbWVJRCAmIGFDb21wb3NpdGVSSUQgPQorCQkJCUVOVi5vdXRFRC0+bVJJRC5nZXRDb21wb3NpdGVDb21wb25lbnRQYXJlbnQoKTsKKworCQlPcGVyYXRvciAqIGFTY2hlZHVsZU9wID0gYUNvbXBvc2l0ZVJJRC4KKwkJCQlnZXRFeGVjdXRhYmxlKCktPmdldE9uQ29uY3VycmVuY3lPcGVyYXRvcigpOworCisJCVJ1bnRpbWVGb3JtICogbmV3UkYgPQorCQkJCUVOVi5QUklNSVRJVkVfUFJPQ0VTU09SLmdldExvYWRlcigpLmR5bmFtaWNMb2FkTWFjaGluZSgKKwkJCQkJCUVOVi5vdXRFRCwgRU5WLm91dEVELT5tUklELCBhbkluc3RhbmNlRHluYW1pYywKKwkJCQkJCWFDb21wb3NpdGVSSUQsIGFTY2hlZHVsZU9wICk7CisKKwkJLy8gUlVOTklORyBvbkNSRUFURQorCQlpZiggbm90IEVOVi5QUklNSVRJVkVfUFJPQ0VTU09SLmdldExvYWRlcigpLgorCQkJCWZpbmFsaXplUnVubmluZ09uQ3JlYXRlKEVOViwgRU5WLm91dEVEKSApCisJCXsKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCTw8ICJJbnZva2VOZXc6IEZhaWxlZCB0byBmaW5hbGl6ZSBsb2FkaW5nIGJ5ICIKKwkJCQkJCQkicnVubmluZyA8PCBvbkNyZWF0ZSBQcmltaXRpdmUgPj4gISEhIgorCQkJCQk8PCBTRU5EX0VYSVQ7CisJCX0KKworCQljb25zdCBSdW50aW1lSUQgJiBuZXdSSUQgPSBuZXdSRi0+Z2V0UklEKCk7CisJCUVOVi5vdXRWQUwgPSBuZXdSSUQ7CisKKy8vW1JFR1JFU1NJT05dIVRPRE8KKwkJRXhlY3V0YWJsZUZvcm0gKiBtb2RlbEV4ZWN1dGFibGUgPSBuZXdSSUQuZ2V0RXhlY3V0YWJsZSgpOworCQlJbnN0YW5jZU9mRGF0YSAqIGFWYXIgPSBOVUxMOworCQlhdm1fc2l6ZV90IG9mZnNldCA9IDA7CisJCUVOVi5tQVJHLT5iZWdpbigxKTsKKwkJZm9yKCA7IEVOVi5tQVJHLT5oYXNOZXh0KCkgOyBFTlYubUFSRy0+bmV4dCgpICwgKytvZmZzZXQgKQorCQl7CisJCQlhVmFyID0gbW9kZWxFeGVjdXRhYmxlLT5yYXdQYXJhbURhdGEob2Zmc2V0KTsKKworLy9BVk1fT1NfQ09VVCA8PCBzdGQ6OmVuZGwgPDwgaW52b2tlclJJRC5zdHJVbmlxSWQoKQorLy8JCTw8ICIgLCAiIDw8IG5ld1JJRC5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisvLwkJPDwgIiB8PSAiIDw8IGFWYXItPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKy8vCQk8PCAiICIgPDwgRU5WLm1BUkctPmN1cnJlbnQoKS5zdHIoKSA8PCBzdGQ6OmVuZGw7CisKKwkJCWlmKCBub3QgRU5WLnNldFJ2YWx1ZShFTlYub3V0RUQsIG5ld1JJRCwgYVZhciwgRU5WLm1BUkctPmN1cnJlbnQoKSkgKQorCQkJeworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJfQorCisKKwkJQkZDb2RlIG9uU3RhcnRQcm9ncmFtID0gYW5JbnN0YW5jZUR5bmFtaWMtPmdldE9uU3RhcnQoKTsKKwkJaWYoIG9uU3RhcnRQcm9ncmFtLnZhbGlkKCkgKQorCQl7CisJCQlFeGVjdXRpb25FbnZpcm9ubWVudCB0bXBFTlYoRU5WLCBFTlYub3V0RUQsIG5ld1JJRCwgb25TdGFydFByb2dyYW0pOworCisJCQlpZiggdG1wRU5WLnJ1bihQUk9DRVNTX1NUQVJUSU5HX1NUQVRFKSApCisJCQl7CisJCQkJdG1wRU5WLm91dEVEUy5wb3BfbGFzdF90byggRU5WLm91dEVEICk7CisKKwkJCQlpZiggdG1wRU5WLm91dEVEUy5ub25lbXB0eSgpICkKKwkJCQl7CisJCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQkJPDwgIlVuc3VwcG9ydGVkIDw8IG5ldyA+PiBQcmltaXRpdmUgd2hpY2ggZXhlY3V0aW9uICIKKwkJCQkJCQkJImNyZWF0ZSBtb3JlIHRoYW4gb25lIEV4ZWN1dGlvbiBDb250ZXh0IDo+XG4iCisJCQkJCQkJPDwgRU5WLmluQ09ERS0+dG9TdHJpbmcoIEFWTV9UQUIxX0lOREVOVCApCisJCQkJCQkJPDwgU0VORF9FWElUOworCQkJCX0KKworCQkJCUVOVi5vdXRFRC5td3NldFJ1bnRpbWVGb3JtU3RhdGUobmV3UklELAorCQkJCQkJUFJPQ0VTU19TVEFSVElOR19TVEFURSwgIFBST0NFU1NfSURMRV9TVEFURSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJRU5WLm91dEVELm13c2V0UnVudGltZUZvcm1TdGF0ZShuZXdSSUQsIFBST0NFU1NfSURMRV9TVEFURSk7CisJCX0KKworCQlFTlYub3V0RUQtPm1SSUQgPSBpbnZva2VyUklEOworCisJCXJldHVybiggdHJ1ZSApOworCX0KKwllbHNlCisJeworCQlFTlYub3V0VkFMID0gUnVudGltZUxpYjo6UklEX05JTDsKKworCQlyZXR1cm4oIHRydWUgKTsKKwl9Cit9CisKKworYm9vbCBBdm1QcmltaXRpdmVfSW52b2tlTmV3OjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJSW5zdGFuY2VPZk1hY2hpbmUgKiBhbkluc3RhbmNlRHluYW1pYyA9CisJCQlFTlYubUFSRy0+YXQoMCkudG9fcHRyPCBJbnN0YW5jZU9mTWFjaGluZSA+KCk7CisKKwlBUEV4ZWN1dGlvbkRhdGEgb3V0RUQgPSBFTlYubUFSRy0+b3V0RUQ7CisKKwlSdW50aW1lSUQgaW52b2tlclJJRCA9IG91dEVELT5tUklEOworCisJaWYoIG91dEVELT5jb3VsZEJlSW5zdGFuY2lhdGVkKCBhbkluc3RhbmNlRHluYW1pYyApICkKKwl7CisJCWNvbnN0IFJ1bnRpbWVJRCAmIGFDb21wb3NpdGVSSUQgPQorCQkJCW91dEVELT5tUklELmdldENvbXBvc2l0ZUNvbXBvbmVudFBhcmVudCgpOworCisJCU9wZXJhdG9yICogYVNjaGVkdWxlT3AgPSBhQ29tcG9zaXRlUklELgorCQkJCWdldEV4ZWN1dGFibGUoKS0+Z2V0T25Db25jdXJyZW5jeU9wZXJhdG9yKCk7CisKKwkJUnVudGltZUZvcm0gKiBuZXdSRiA9IEVOVi5nZXRMb2FkZXIoKS5keW5hbWljTG9hZE1hY2hpbmUob3V0RUQsCisJCQkJb3V0RUQtPm1SSUQsIGFuSW5zdGFuY2VEeW5hbWljLCBhQ29tcG9zaXRlUklELCBhU2NoZWR1bGVPcCApOworCisJCS8vIFJVTk5JTkcgb25DUkVBVEUKKwkJaWYoIG5vdCBFTlYuUFJJTUlUSVZFX1BST0NFU1NPUi5nZXRMb2FkZXIoKS4KKwkJCQlmaW5hbGl6ZVJ1bm5pbmdPbkNyZWF0ZShFTlYsIG91dEVEKSApCisJCXsKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCTw8ICJJbnZva2VOZXc6IEZhaWxlZCB0byBmaW5hbGl6ZSBsb2FkaW5nIGJ5ICIKKwkJCQkJCQkicnVubmluZyA8PCBvbkNyZWF0ZSBQcmltaXRpdmUgPj4gISEhIgorCQkJCQk8PCBTRU5EX0VYSVQ7CisJCX0KKworCQljb25zdCBSdW50aW1lSUQgJiBuZXdSSUQgPSBuZXdSRi0+Z2V0UklEKCk7CisKKworCQlCRkNvZGUgb25TdGFydFByb2dyYW0gPSBhbkluc3RhbmNlRHluYW1pYy0+Z2V0T25TdGFydCgpOworCQlpZiggb25TdGFydFByb2dyYW0udmFsaWQoKSApCisJCXsKKwkJCUV4ZWN1dGlvbkVudmlyb25tZW50IHRtcEVOVihFTlYsIG91dEVELCBuZXdSSUQsIG9uU3RhcnRQcm9ncmFtKTsKKworCQkJaWYoIHRtcEVOVi5ydW4oUFJPQ0VTU19TVEFSVElOR19TVEFURSkgKQorCQkJeworCQkJCUVOVi5zcGxpY2VOb3RPdXRwdXQoIHRtcEVOViApOworCisJCQkJTGlzdE9mQVBFeGVjdXRpb25EYXRhOjppdGVyYXRvciBpdEVEID0gdG1wRU5WLm91dEVEUy5iZWdpbigpOworCQkJCUxpc3RPZkFQRXhlY3V0aW9uRGF0YTo6aXRlcmF0b3IgZW5kRUQgPSB0bXBFTlYub3V0RURTLmVuZCgpOworCQkJCWZvciggOyBpdEVEICE9IGVuZEVEIDsgKytpdEVEICkKKwkJCQl7CisJCQkJCSgqaXRFRCkubXdzZXRSdW50aW1lRm9ybVN0YXRlKG5ld1JJRCwKKwkJCQkJCQlQUk9DRVNTX1NUQVJUSU5HX1NUQVRFLCAgUFJPQ0VTU19JRExFX1NUQVRFKTsKKworCQkJCQkoKml0RUQpLT5tUklEID0gaW52b2tlclJJRDsKKworCQkJCQlFTlYuYXBwZW5kT3V0cHV0KCAqaXRFRCApOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiggbm90IEVOVi5hcHBlbmRPdXRwdXRfbXdzZXRQRVMoCisJCQkJCW91dEVELCBuZXdSSUQsIFBST0NFU1NfSURMRV9TVEFURSkgKQorCQl7CisJCQlvdXRFRC0+bVJJRCA9IGludm9rZXJSSUQ7CisKKwkJCWlmKCBub3QgRU5WLmFwcGVuZE91dHB1dF9td3NldFBFUygKKwkJCQkJb3V0RUQsIG5ld1JJRCwgUFJPQ0VTU19JRExFX1NUQVRFKSApCisJCQl7CisJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJfQorCQl9CisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiggdHJ1ZSApOworCX0KK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIGV4ZWN1dGlvbiBvZiBhIElOVk9LRSBST1VUSU5FIHByb2dyYW0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIEF2bUJhc2VJbnZva2VQcmltaXRpdmU6OnB1c2hMb2NhbFZhcnMoCisJCUV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WLCBjb25zdCBCYXNlQXZtUHJvZ3JhbSAmIGFQcm9ncmFtKQoreworCUVOVi5pbkVELm1ha2VXcml0YWJsZSgpOworCUVOVi5pbkVELT5tYWtlV3JpdGFibGVMb2NhbFJ1bnRpbWVTdGFjaygpOworCisJTG9jYWxSdW50aW1lIGFMb2NhbFJ1bnRpbWUoIGFQcm9ncmFtICk7CisJRU5WLmluRUQtPmdldExvY2FsUnVudGltZXMoKS0+cHVzaCggYUxvY2FsUnVudGltZSApOworCisJRXZhbHVhdGlvbkVudmlyb25tZW50IGVFTlYoIEVOViApOworCisJVGFibGVPZkluc3RhbmNlT2ZEYXRhOjpjb25zdF9yYXdfaXRlcmF0b3IgaXREYXRhID0gYVByb2dyYW0uZ2V0RGF0YSgpLmJlZ2luKCk7CisJVGFibGVPZkluc3RhbmNlT2ZEYXRhOjpjb25zdF9yYXdfaXRlcmF0b3IgZW5kRGF0YSA9IGFQcm9ncmFtLmdldERhdGEoKS5lbmQoKTsKKwlmb3IoIGF2bV9zaXplX3QgaSA9IDAgOyBpdERhdGEgIT0gZW5kRGF0YSA7ICsraXREYXRhICwgKytpICkKKwl7CisJCWlmKCAoaXREYXRhKS0+aGFzVmFsdWUoKSApCisJCXsKKwkJCWVFTlYuc2V2YWwoIChpdERhdGEpLT5nZXRWYWx1ZSgpICk7CisJCQlhTG9jYWxSdW50aW1lLnNldERhdGEoaSwgZUVOVi5vdXRWQUwpOworCQl9CisJCWVsc2UKKwkJeworCQkJQkZMaXN0IHBhcmFtTGlzdDsKKworCQkJYUxvY2FsUnVudGltZS5zZXREYXRhKGksIEVOVi5jcmVhdGVOZXdGcmVzaFBhcmFtKAorCQkJCQlFTlYuaW5FRC0+bVJJRCwgKGl0RGF0YSksIHBhcmFtTGlzdCkgKTsKKworCQkJRU5WLmluRUQuYXBwZW5kUGFyYW1ldGVycyggcGFyYW1MaXN0ICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCitib29sIEF2bUJhc2VJbnZva2VQcmltaXRpdmU6OnB1c2hMb2NhbFZhcjEoRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsCisJCWNvbnN0IEJhc2VBdm1Qcm9ncmFtICYgYVByb2dyYW0sIGNvbnN0IEJGICYgYVBhcmFtKQoreworCUVOVi5pbkVELm1ha2VXcml0YWJsZSgpOworCUVOVi5pbkVELT5tYWtlV3JpdGFibGVMb2NhbFJ1bnRpbWVTdGFjaygpOworCisJTG9jYWxSdW50aW1lIGFMb2NhbFJ1bnRpbWUoIGFQcm9ncmFtICk7CisJRU5WLmluRUQtPmdldExvY2FsUnVudGltZXMoKS0+cHVzaCggYUxvY2FsUnVudGltZSApOworCisJYUxvY2FsUnVudGltZS5zZXREYXRhKHN0YXRpY19jYXN0PCBhdm1fc2l6ZV90ID4oMCksIGFQYXJhbSk7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCitib29sIEF2bUJhc2VJbnZva2VQcmltaXRpdmU6OnB1c2hMb2NhbFZhcnMoRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsCisJCWNvbnN0IEJhc2VBdm1Qcm9ncmFtICYgYVByb2dyYW0sIEFycmF5QkYgKiBwYXJhbXMpCit7CisJRU5WLmluRUQubWFrZVdyaXRhYmxlKCk7CisJRU5WLmluRUQtPm1ha2VXcml0YWJsZUxvY2FsUnVudGltZVN0YWNrKCk7CisKKwlMb2NhbFJ1bnRpbWUgYUxvY2FsUnVudGltZSggYVByb2dyYW0gKTsKKwlFTlYuaW5FRC0+Z2V0TG9jYWxSdW50aW1lcygpLT5wdXNoKCBhTG9jYWxSdW50aW1lICk7CisKKwlFdmFsdWF0aW9uRW52aXJvbm1lbnQgZUVOViggRU5WICk7CisKKwlUYWJsZU9mSW5zdGFuY2VPZkRhdGE6OmNvbnN0X3Jhd19pdGVyYXRvciBpdERhdGEgPSBhUHJvZ3JhbS5nZXREYXRhKCkuYmVnaW4oKTsKKwlUYWJsZU9mSW5zdGFuY2VPZkRhdGE6OmNvbnN0X3Jhd19pdGVyYXRvciBlbmREYXRhID0gYVByb2dyYW0uZ2V0RGF0YSgpLmVuZCgpOworCWZvciggYXZtX3NpemVfdCBpID0gMCA7IGl0RGF0YSAhPSBlbmREYXRhIDsgKytpdERhdGEgLCArK2kgKQorCXsKKwkJaWYoIHBhcmFtcy0+YXQoaSkudmFsaWQoKSApCisJCXsKKy8vCQkJZUVOVi5zZXZhbCggcGFyYW1zLT5nZXQoaSkgKTsKKy8vCQkJYUxvY2FsUnVudGltZS5zZXREYXRhKGksIGVFTlYub3V0VkFMKTsKKwkJCWFMb2NhbFJ1bnRpbWUuc2V0RGF0YShpLCBwYXJhbXMtPmF0KGkpKTsKKwkJfQorCQllbHNlIGlmKCAoaXREYXRhKS0+aGFzVmFsdWUoKSApCisJCXsKKwkJCWVFTlYuc2V2YWwoIChpdERhdGEpLT5nZXRWYWx1ZSgpICk7CisJCQlhTG9jYWxSdW50aW1lLnNldERhdGEoaSwgZUVOVi5vdXRWQUwpOworCQl9CisJCWVsc2UKKwkJeworCQkJQkZMaXN0IHBhcmFtTGlzdDsKKworCQkJYUxvY2FsUnVudGltZS5zZXREYXRhKGksIEVOVi5jcmVhdGVOZXdGcmVzaFBhcmFtKAorCQkJCQlFTlYuaW5FRC0+bVJJRCwgKGl0RGF0YSksIHBhcmFtTGlzdCkgKTsKKworCQkJRU5WLmluRUQuYXBwZW5kUGFyYW1ldGVycyggcGFyYW1MaXN0ICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisKK2Jvb2wgQXZtQmFzZUludm9rZVByaW1pdGl2ZTo6cG9wTG9jYWxWYXJzKEFQRXhlY3V0aW9uRGF0YSAmIGFuRUQpCit7CisJYW5FRC5tYWtlV3JpdGFibGUoKTsKKwlhbkVELT5tYWtlV3JpdGFibGVMb2NhbFJ1bnRpbWVTdGFjaygpOworCisJYW5FRC0+Z2V0TG9jYWxSdW50aW1lcygpLT5wb3AoKTsKKworCWlmKCBub3QgYW5FRC0+aGFzTG9jYWxSdW50aW1lKCkgKQorCXsKKwkJYW5FRC0+ZGVzdHJveUxvY2FsUnVudGltZVN0YWNrKCk7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gZXhlY3V0aW9uIG9mIGEgSU5WT0tFIEVYRUNVVEFCTEUgcm91dGluZQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKworYm9vbCBBdm1QcmltaXRpdmVfSW52b2tlUm91dGluZTo6cnVuKAorCQlFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOViwgY29uc3QgQXZtUHJvZ3JhbSAmIGFuQXZtUHJvZ3JhbSkKK3sKKwlFeGVjdXRpb25UaW1lIHRoZUV4ZWN1dGlvblRpbWVNYW5hZ2VyKGZhbHNlKTsKK0FWTV9JRl9ERUJVR19GTEFHKCBUSU1FICkKKwl0aGVFeGVjdXRpb25UaW1lTWFuYWdlci5zdGFydF90aW1lKCk7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggVElNRSApCisKKworCUV4ZWN1dGlvbkVudmlyb25tZW50IHRtcEVOVihFTlYsIGFuQXZtUHJvZ3JhbS5nZXRDb2RlKCkpOworCisJdG1wRU5WLmluRUQubWFrZVdyaXRhYmxlKCk7CisKKy8vCUV4ZWN1dGlvbkRhdGFGYWN0b3J5OjphcHBlbmRSdW5uYWJsZUVsZW1lbnRUcmFjZSh0bXBFTlYuaW5FRCwKKy8vCQkJQkYobmV3IEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24odG1wRU5WLmluRUQtPm1SSUQsIGFuQXZtUHJvZ3JhbSkpKTsKKworCWlmKCBub3QgdG1wRU5WLnJ1bigpICkKKwl7CisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwlBUEV4ZWN1dGlvbkRhdGEgdG1wRUQ7CisKKwkvLyBPVVRQVVQgRURTIHRyYWl0ZW1lbnQKKwl3aGlsZSggdG1wRU5WLm91dEVEUy5ub25lbXB0eSgpICkKKwl7CisJCXRtcEVOVi5vdXRFRFMucG9wX2ZpcnN0X3RvKCB0bXBFRCApOworCisJCS8vIFZlcmlmaWNhdGlvbiBvZiBFWEVDVVRJT04gRU5ESU5HIFNUQVRVUworCQlzd2l0Y2goIHRtcEVELT5nZXRBRUVTKCkgKQorCQl7CisJCQljYXNlIEFFRVNfU1RNTlRfTk9USElORzoKKwkJCWNhc2UgQUVFU19TVE1OVF9GSU5BTDoKKwkJCWNhc2UgQUVFU19TVE1OVF9ERVNUUk9ZOgorCQkJeworCQkJCXRtcEVELm13c2V0QUVFUyggQUVFU19PSyApOworCisJCQkJRU5WLm91dEVEUy5hcHBlbmQoIHRtcEVEICk7CisKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgQUVFU19PSzoKKwkJCXsKKwkJCQlFTlYub3V0RURTLmFwcGVuZCggdG1wRUQgKTsKKworCQkJCWJyZWFrOworCQkJfQorCisJCQljYXNlIEFFRVNfU1RNTlRfRVhJVDoKKwkJCWNhc2UgQUVFU19TVE1OVF9FWElUX0FMTDoKKwkJCWNhc2UgQUVFU19TVE1OVF9GQVRBTF9FUlJPUjoKKwkJCWNhc2UgQUVFU19TWU1CT0xJQ19FWEVDVVRJT05fTElNSVRBVElPTjoKKwkJCXsKKwkJCQlFTlYuZXhpdEVEUy5hcHBlbmQoIHRtcEVEICk7CisKKwkJCQlicmVhazsKKwkJCX0KKworCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJPDwgIlVuZXhwZWN0ZWQgRU5ESU5EIEVYRUNVVElPTiBTVEFUVVMgYXMgb3V0RURTIDo+ICIKKwkJCQkJCTw8IFJ1bnRpbWVEZWY6OnN0ckFFRVMoIHRtcEVELT5tQUVFUyApIDw8ICIgISEhIgorCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvLyBJUlEgRURTIHRyYWl0ZW1lbnQKKwl3aGlsZSggdG1wRU5WLmlycUVEUy5ub25lbXB0eSgpICkKKwl7CisJCXRtcEVOVi5pcnFFRFMucG9wX2xhc3RfdG8oIHRtcEVEICk7CisKKwkJLy8gVmVyaWZpY2F0aW9uIG9mIEVYRUNVVElPTiBFTkRJTkcgU1RBVFVTCisJCXN3aXRjaCggdG1wRUQtPmdldEFFRVMoKSApCisJCXsKKwkJCWNhc2UgQUVFU19TVE1OVF9CUkVBSzoKKwkJCWNhc2UgQUVFU19TVE1OVF9DT05USU5VRToKKwkJCWNhc2UgQUVFU19TVE1OVF9SRVRVUk46CisJCQl7CisJCQkJdG1wRUQubXdzZXRBRUVTKCBBRUVTX09LICk7CisKKwkJCQlFTlYub3V0RURTLmFwcGVuZCggdG1wRUQgKTsKKworCQkJCWJyZWFrOworCQkJfQorCisJCQlkZWZhdWx0OgorCQkJeworCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQk8PCAiVW5leHBlY3RlZCBFTkRJTkQgRVhFQ1VUSU9OIFNUQVRVUyBhcyBpcnFFRFMgOj4gIgorCQkJCQkJPDwgUnVudGltZURlZjo6c3RyQUVFUyggdG1wRUQtPm1BRUVTICkgPDwgIiAhISEiCisJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8vIEVYSVQgRURTIHRyYWl0ZW1lbnQKKwlFTlYuc3BsaWNlRXhpdCh0bXBFTlYpOworCisJLy8gU3luYyBFRFMgdHJhaXRlbWVudAorCUVOVi5zcGxpY2VTeW5jX213U3RvcmVQb3ModG1wRU5WKTsKKworQVZNX0lGX0RFQlVHX0ZMQUcoIFRJTUUgKQorCXRoZUV4ZWN1dGlvblRpbWVNYW5hZ2VyLmZpbmlzaF90aW1lKCk7CisJQVZNX09TX1RSQUNFIDw8IHRoZUV4ZWN1dGlvblRpbWVNYW5hZ2VyLnRpbWVfc3RhdCgpOy8vIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBUSU1FICkKKworCXJldHVybiggdHJ1ZSApOworfQorCisKK2Jvb2wgQXZtUHJpbWl0aXZlX0ludm9rZVJvdXRpbmU6OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOViwKKwkJY29uc3QgQXZtUHJvZ3JhbSAmIGFuQXZtUHJvZ3JhbSwgY29uc3QgQkYgJiBhUGFyYW0pCit7CisJRXhlY3V0aW9uVGltZSB0aGVFeGVjdXRpb25UaW1lTWFuYWdlcihmYWxzZSk7CitBVk1fSUZfREVCVUdfRkxBRyggVElNRSApCisJdGhlRXhlY3V0aW9uVGltZU1hbmFnZXIuc3RhcnRfdGltZSgpOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFRJTUUgKQorCisKKwlFeGVjdXRpb25FbnZpcm9ubWVudCB0bXBFTlYoRU5WLCBhbkF2bVByb2dyYW0uZ2V0Q29kZSgpKTsKKworCXRtcEVOVi5pbkVELm1ha2VXcml0YWJsZSgpOworCisvLwlFeGVjdXRpb25EYXRhRmFjdG9yeTo6YXBwZW5kUnVubmFibGVFbGVtZW50VHJhY2UodG1wRU5WLmluRUQsCisvLwkJCUJGKG5ldyBFeGVjdXRpb25Db25maWd1cmF0aW9uKHRtcEVOVi5pbkVELT5tUklELCBhbkF2bVByb2dyYW0pKSk7CisKKwkvLyBBbGxvY2F0ZWQgbG9jYWwgZGF0YSB0YWJsZQorCXB1c2hMb2NhbFZhcjEodG1wRU5WLCBhbkF2bVByb2dyYW0sIGFQYXJhbSk7CisKKwlpZiggbm90IHRtcEVOVi5ydW4oKSApCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJQVBFeGVjdXRpb25EYXRhIHRtcEVEOworCisJLy8gT1VUUFVUIEVEUyB0cmFpdGVtZW50CisJd2hpbGUoIHRtcEVOVi5vdXRFRFMubm9uZW1wdHkoKSApCisJeworCQl0bXBFTlYub3V0RURTLnBvcF9maXJzdF90byggdG1wRUQgKTsKKworCQkvLyBWZXJpZmljYXRpb24gb2YgRVhFQ1VUSU9OIEVORElORyBTVEFUVVMKKwkJc3dpdGNoKCB0bXBFRC0+Z2V0QUVFUygpICkKKwkJeworCQkJY2FzZSBBRUVTX1NUTU5UX05PVEhJTkc6CisJCQljYXNlIEFFRVNfU1RNTlRfRklOQUw6CisJCQljYXNlIEFFRVNfU1RNTlRfREVTVFJPWToKKwkJCXsKKwkJCQl0bXBFRC5td3NldEFFRVMoIEFFRVNfT0sgKTsKKworCQkJCS8vIEZyZWUgbG9jYWwgZGF0YSB0YWJsZQorCQkJCXBvcExvY2FsVmFycyh0bXBFRCk7CisKKwkJCQlFTlYub3V0RURTLmFwcGVuZCggdG1wRUQgKTsKKworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBBRUVTX09LOgorCQkJeworCQkJCS8vIEZyZWUgbG9jYWwgZGF0YSB0YWJsZQorCQkJCXBvcExvY2FsVmFycyh0bXBFRCk7CisKKwkJCQlFTlYub3V0RURTLmFwcGVuZCggdG1wRUQgKTsKKworCQkJCWJyZWFrOworCQkJfQorCisJCQljYXNlIEFFRVNfU1RNTlRfRVhJVDoKKwkJCWNhc2UgQUVFU19TVE1OVF9FWElUX0FMTDoKKwkJCWNhc2UgQUVFU19TVE1OVF9GQVRBTF9FUlJPUjoKKwkJCWNhc2UgQUVFU19TWU1CT0xJQ19FWEVDVVRJT05fTElNSVRBVElPTjoKKwkJCXsKKwkJCQlFTlYuZXhpdEVEUy5hcHBlbmQoIHRtcEVEICk7CisKKwkJCQlicmVhazsKKwkJCX0KKworCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJPDwgIlVuZXhwZWN0ZWQgRU5ESU5EIEVYRUNVVElPTiBTVEFUVVMgYXMgb3V0RURTIDo+ICIKKwkJCQkJCTw8IFJ1bnRpbWVEZWY6OnN0ckFFRVMoIHRtcEVELT5tQUVFUyApIDw8ICIgISEhIgorCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvLyBJUlEgRURTIHRyYWl0ZW1lbnQKKwl3aGlsZSggdG1wRU5WLmlycUVEUy5ub25lbXB0eSgpICkKKwl7CisJCXRtcEVOVi5pcnFFRFMucG9wX2xhc3RfdG8oIHRtcEVEICk7CisKKwkJLy8gVmVyaWZpY2F0aW9uIG9mIEVYRUNVVElPTiBFTkRJTkcgU1RBVFVTCisJCXN3aXRjaCggdG1wRUQtPmdldEFFRVMoKSApCisJCXsKKwkJCWNhc2UgQUVFU19TVE1OVF9CUkVBSzoKKwkJCWNhc2UgQUVFU19TVE1OVF9DT05USU5VRToKKwkJCWNhc2UgQUVFU19TVE1OVF9SRVRVUk46CisJCQl7CisJCQkJdG1wRUQubXdzZXRBRUVTKCBBRUVTX09LICk7CisKKwkJCQkvLyBGcmVlIGxvY2FsIGRhdGEgdGFibGUKKwkJCQlwb3BMb2NhbFZhcnModG1wRUQpOworCisJCQkJRU5WLm91dEVEUy5hcHBlbmQoIHRtcEVEICk7CisKKwkJCQlicmVhazsKKwkJCX0KKworCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJPDwgIlVuZXhwZWN0ZWQgRU5ESU5EIEVYRUNVVElPTiBTVEFUVVMgYXMgaXJxRURTIDo+ICIKKwkJCQkJCTw8IFJ1bnRpbWVEZWY6OnN0ckFFRVMoIHRtcEVELT5tQUVFUyApIDw8ICIgISEhIgorCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvLyBFWElUIEVEUyB0cmFpdGVtZW50CisJd2hpbGUoIHRtcEVOVi5leGl0RURTLm5vbmVtcHR5KCkgKQorCXsKKwkJdG1wRU5WLmV4aXRFRFMucG9wX2xhc3RfdG8oIHRtcEVEICk7CisKKwkJLy8gRnJlZSBsb2NhbCBkYXRhIHRhYmxlCisJCXBvcExvY2FsVmFycyh0bXBFRCk7CisKKwkJRU5WLmV4aXRFRFMuYXBwZW5kKCB0bXBFRCApOworCX0KKworCisJLy8gU3luYyBFRFMgdHJhaXRlbWVudAorCUVOVi5zcGxpY2VTeW5jX213U3RvcmVQb3ModG1wRU5WKTsKKworQVZNX0lGX0RFQlVHX0ZMQUcoIFRJTUUgKQorCXRoZUV4ZWN1dGlvblRpbWVNYW5hZ2VyLmZpbmlzaF90aW1lKCk7CisJQVZNX09TX1RSQUNFIDw8IHRoZUV4ZWN1dGlvblRpbWVNYW5hZ2VyLnRpbWVfc3RhdCgpOy8vIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBUSU1FICkKKworCXJldHVybiggdHJ1ZSApOworfQorCisKK2Jvb2wgQXZtUHJpbWl0aXZlX0ludm9rZVJvdXRpbmU6OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwljb25zdCBCRiAmIGFDb2RlID0gRU5WLmluQ09ERS0+Zmlyc3QoKTsKKwljb25zdCBBdm1Qcm9ncmFtICYgYW5Bdm1Qcm9ncmFtID0gYUNvZGUudG9fcmVmPCBBdm1Qcm9ncmFtID4oKTsKKworCUV4ZWN1dGlvblRpbWUgdGhlRXhlY3V0aW9uVGltZU1hbmFnZXIoZmFsc2UpOworQVZNX0lGX0RFQlVHX0ZMQUcoIFRJTUUgKQorCXRoZUV4ZWN1dGlvblRpbWVNYW5hZ2VyLnN0YXJ0X3RpbWUoKTsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBUSU1FICkKKworCisJRXhlY3V0aW9uRW52aXJvbm1lbnQgdG1wRU5WKEVOViwgYW5Bdm1Qcm9ncmFtLmdldENvZGUoKSk7CisKKwl0bXBFTlYuaW5FRC5tYWtlV3JpdGFibGUoKTsKKworCUV4ZWN1dGlvbkRhdGFGYWN0b3J5OjphcHBlbmRSdW5uYWJsZUVsZW1lbnRUcmFjZSh0bXBFTlYuaW5FRCwKKwkJCUJGKG5ldyBFeGVjdXRpb25Db25maWd1cmF0aW9uKHRtcEVOVi5pbkVELT5tUklELCBhQ29kZSkpKTsKKworCWlmKCBhbkF2bVByb2dyYW0uaGFzRGF0YSgpICkKKwl7CisJCWlmKCBFTlYuaW5DT0RFLT5wb3B1bGF0ZWQoKSApCisJCXsKKwkJCXB1c2hMb2NhbFZhcnModG1wRU5WLCBhbkF2bVByb2dyYW0sCisJCQkJCUVOVi5pbkNPREUtPnNlY29uZCgpLnRvX3B0cjwgQXJyYXlCRiA+KCkpOworCQl9CisJCWVsc2UKKwkJeworCQkJcHVzaExvY2FsVmFycyh0bXBFTlYsIGFuQXZtUHJvZ3JhbSk7CisJCX0KKwl9CisKKwlpZiggbm90IHRtcEVOVi5ydW4oKSApCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJQVBFeGVjdXRpb25EYXRhIHRtcEVEOworCisJLy8gT1VUUFVUIEVEUyB0cmFpdGVtZW50CisJd2hpbGUoIHRtcEVOVi5vdXRFRFMubm9uZW1wdHkoKSApCisJeworCQl0bXBFTlYub3V0RURTLnBvcF9maXJzdF90byggdG1wRUQgKTsKKworCQkvLyBWZXJpZmljYXRpb24gb2YgRVhFQ1VUSU9OIEVORElORyBTVEFUVVMKKwkJc3dpdGNoKCB0bXBFRC0+Z2V0QUVFUygpICkKKwkJeworCQkJY2FzZSBBRUVTX1NUTU5UX05PVEhJTkc6CisJCQljYXNlIEFFRVNfU1RNTlRfRklOQUw6CisJCQljYXNlIEFFRVNfU1RNTlRfREVTVFJPWToKKwkJCXsKKwkJCQl0bXBFRC5td3NldEFFRVMoIEFFRVNfT0sgKTsKKworCQkJCS8vIEZyZWUgbG9jYWwgZGF0YSB0YWJsZQorCQkJCWlmKCBhbkF2bVByb2dyYW0uaGFzRGF0YSgpICkKKwkJCQl7CisJCQkJCXBvcExvY2FsVmFycyh0bXBFRCk7CisJCQkJfQorCisJCQkJRU5WLm91dEVEUy5hcHBlbmQoIHRtcEVEICk7CisKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgQUVFU19PSzoKKwkJCXsKKwkJCQkvLyBGcmVlIGxvY2FsIGRhdGEgdGFibGUKKwkJCQlpZiggYW5Bdm1Qcm9ncmFtLmhhc0RhdGEoKSApCisJCQkJeworCQkJCQlwb3BMb2NhbFZhcnModG1wRUQpOworCQkJCX0KKworCQkJCUVOVi5vdXRFRFMuYXBwZW5kKCB0bXBFRCApOworCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJCTw8ICJVbmV4cGVjdGVkIEVORElORCBFWEVDVVRJT04gU1RBVFVTIGFzIG91dEVEUyA6PiAiCisJCQkJCQk8PCBSdW50aW1lRGVmOjpzdHJBRUVTKCB0bXBFRC0+bUFFRVMgKSA8PCAiICEhISIKKwkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJLy8gSVJRIEVEUyB0cmFpdGVtZW50CisJd2hpbGUoIHRtcEVOVi5pcnFFRFMubm9uZW1wdHkoKSApCisJeworCQl0bXBFTlYuaXJxRURTLnBvcF9sYXN0X3RvKCB0bXBFRCApOworCisJCS8vIFZlcmlmaWNhdGlvbiBvZiBFWEVDVVRJT04gRU5ESU5HIFNUQVRVUworCQlzd2l0Y2goIHRtcEVELT5nZXRBRUVTKCkgKQorCQl7CisJCQljYXNlIEFFRVNfU1RNTlRfQlJFQUs6CisJCQljYXNlIEFFRVNfU1RNTlRfQ09OVElOVUU6CisJCQljYXNlIEFFRVNfU1RNTlRfUkVUVVJOOgorCQkJeworCQkJCXRtcEVELm13c2V0QUVFUyggQUVFU19PSyApOworCisJCQkJaWYoIGFuQXZtUHJvZ3JhbS5oYXNEYXRhKCkgKQorCQkJCXsKKwkJCQkJcG9wTG9jYWxWYXJzKHRtcEVEKTsKKwkJCQl9CisKKwkJCQlFTlYub3V0RURTLmFwcGVuZCggdG1wRUQgKTsKKworCQkJCWJyZWFrOworCQkJfQorCisJCQlkZWZhdWx0OgorCQkJeworCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQk8PCAiVW5leHBlY3RlZCBFTkRJTkQgRVhFQ1VUSU9OIFNUQVRVUyBhcyBpcnFFRFMgOj4gIgorCQkJCQkJPDwgUnVudGltZURlZjo6c3RyQUVFUyggdG1wRUQtPm1BRUVTICkgPDwgIiAhISEiCisJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8vIEVYSVQgRURTIHRyYWl0ZW1lbnQKKwl3aGlsZSggdG1wRU5WLmV4aXRFRFMubm9uZW1wdHkoKSApCisJeworCQl0bXBFTlYuZXhpdEVEUy5wb3BfbGFzdF90byggdG1wRUQgKTsKKworCQlpZiggYW5Bdm1Qcm9ncmFtLmhhc0RhdGEoKSApCisJCXsKKwkJCXBvcExvY2FsVmFycyh0bXBFRCk7CisJCX0KKworCQlFTlYuZXhpdEVEUy5hcHBlbmQoIHRtcEVEICk7CisJfQorCisKKwkvLyBTeW5jIEVEUyB0cmFpdGVtZW50CisJRU5WLnNwbGljZVN5bmNfbXdTdG9yZVBvcyh0bXBFTlYpOworCitBVk1fSUZfREVCVUdfRkxBRyggVElNRSApCisJdGhlRXhlY3V0aW9uVGltZU1hbmFnZXIuZmluaXNoX3RpbWUoKTsKKwlBVk1fT1NfVFJBQ0UgPDwgdGhlRXhlY3V0aW9uVGltZU1hbmFnZXIudGltZV9zdGF0KCk7Ly8gPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFRJTUUgKQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworYm9vbCBBdm1QcmltaXRpdmVfSW52b2tlUm91dGluZTo6cmVzdW1lKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCWNvbnN0IEF2bVByb2dyYW0gJiBhbkF2bVByb2dyYW0gPSBFTlYuaW5DT0RFLT5maXJzdCgpLnRvX3JlZjwgQXZtUHJvZ3JhbSA+KCk7CisKKwlBUEV4ZWN1dGlvbkRhdGEgb3V0RUQgPSBFTlYuaW5FRDsKKworCS8vIFZlcmlmaWNhdGlvbiBvZiBFWEVDVVRJT04gRU5ESU5HIFNUQVRVUworCXN3aXRjaCggb3V0RUQtPmdldEFFRVMoKSApCisJeworCQljYXNlIEFFRVNfU1RNTlRfQlJFQUs6CisJCWNhc2UgQUVFU19TVE1OVF9DT05USU5VRToKKwkJY2FzZSBBRUVTX1NUTU5UX1JFVFVSTjoKKworCQljYXNlIEFFRVNfU1RNTlRfTk9USElORzoKKwkJY2FzZSBBRUVTX1NUTU5UX0ZJTkFMOgorCQljYXNlIEFFRVNfU1RNTlRfREVTVFJPWToKKwkJeworCQkJb3V0RUQubXdzZXRBRUVTKCBBRUVTX09LICk7CisKKwkJCS8vIEZyZWUgbG9jYWwgZGF0YSB0YWJsZQorCQkJaWYoIGFuQXZtUHJvZ3JhbS5oYXNEYXRhKCkgKQorCQkJeworCQkJCXBvcExvY2FsVmFycyhvdXRFRCk7CisJCQl9CisKKwkJCUVOVi5vdXRFRFMuYXBwZW5kKCBvdXRFRCApOworCisJCQlicmVhazsKKwkJfQorCQljYXNlIEFFRVNfT0s6CisJCWNhc2UgQUVFU19TVEVQX1JFU1VNRToKKwkJeworCQkJaWYoIGFuQXZtUHJvZ3JhbS5oYXNEYXRhKCkgKQorCQkJeworCQkJCXBvcExvY2FsVmFycyhvdXRFRCk7CisJCQl9CisKKwkJCUVOVi5vdXRFRFMuYXBwZW5kKCBvdXRFRCApOworCisJCQlicmVhazsKKwkJfQorCisJCS8vIFN5bmMgRURTIHRyYWl0ZW1lbnQKKwkJY2FzZSBBRUVTX1NURVBfTUFSSzoKKwkJY2FzZSBBRUVTX1dBSVRJTkdfSU5DT01fUkRWOgorCQljYXNlIEFFRVNfV0FJVElOR19PVVRDT01fUkRWOgorCQljYXNlIEFFRVNfV0FJVElOR19KT0lOX0ZPUks6CisJCXsKKwkJCUVOVi5hcHBlbmRTeW5jX213U3RvcmVQb3Mob3V0RUQpOworCisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgQUVFU19TVE1OVF9FWElUOgorCQljYXNlIEFFRVNfU1RNTlRfRVhJVF9BTEw6CisJCWNhc2UgQUVFU19TVE1OVF9GQVRBTF9FUlJPUjoKKwkJY2FzZSBBRUVTX1NZTUJPTElDX0VYRUNVVElPTl9MSU1JVEFUSU9OOgorCQl7CisJCQlpZiggYW5Bdm1Qcm9ncmFtLmhhc0RhdGEoKSApCisJCQl7CisJCQkJcG9wTG9jYWxWYXJzKG91dEVEKTsKKwkJCX0KKworCQkJRU5WLmV4aXRFRFMuYXBwZW5kKCBvdXRFRCApOworCisJCQlicmVhazsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCTw8ICJVbmV4cGVjdGVkIEVORElORCBFWEVDVVRJT04gU1RBVFVTIDo+ICIKKwkJCQkJPDwgUnVudGltZURlZjo6c3RyQUVFUyggb3V0RUQtPm1BRUVTICkgPDwgIiAhISEiCisJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIGV4ZWN1dGlvbiBvZiBhIElOVk9LRSBUUkFOU0lUSU9OIHRyYW5zaXRpb24KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIEF2bVByaW1pdGl2ZV9JbnZva2VUcmFuc2l0aW9uOjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJY29uc3QgQkYgJiBhQ29kZSA9IEVOVi5pbkNPREUtPmZpcnN0KCk7CisJY29uc3QgQXZtUHJvZ3JhbSAmIGFuQXZtUHJvZ3JhbSA9IGFDb2RlLnRvX3JlZjwgQXZtVHJhbnNpdGlvbiA+KCk7CisKKwlFeGVjdXRpb25UaW1lIHRoZUV4ZWN1dGlvblRpbWVNYW5hZ2VyKGZhbHNlKTsKK0FWTV9JRl9ERUJVR19GTEFHKCBUSU1FICkKKwl0aGVFeGVjdXRpb25UaW1lTWFuYWdlci5zdGFydF90aW1lKCk7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggVElNRSApCisKKworCUV4ZWN1dGlvbkVudmlyb25tZW50IHRtcEVOVihFTlYsIGFuQXZtUHJvZ3JhbS5nZXRDb2RlKCkpOworCisJdG1wRU5WLmluRUQubWFrZVdyaXRhYmxlKCk7CisKKwlFeGVjdXRpb25EYXRhRmFjdG9yeTo6YXBwZW5kUnVubmFibGVFbGVtZW50VHJhY2UodG1wRU5WLmluRUQsCisJCQlCRihuZXcgRXhlY3V0aW9uQ29uZmlndXJhdGlvbih0bXBFTlYuaW5FRC0+bVJJRCwgYUNvZGUpKSk7CisKKwlpZiggbm90IHRtcEVOVi5ydW4oKSApCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJQVBFeGVjdXRpb25EYXRhIHRtcEVEOworCisJLy8gT1VUUFVUIEVEUyB0cmFpdGVtZW50CisJd2hpbGUoIHRtcEVOVi5vdXRFRFMubm9uZW1wdHkoKSApCisJeworCQl0bXBFTlYub3V0RURTLnBvcF9maXJzdF90byggdG1wRUQgKTsKKworCQkvLyBWZXJpZmljYXRpb24gb2YgRVhFQ1VUSU9OIEVORElORyBTVEFUVVMKKwkJc3dpdGNoKCB0bXBFRC0+Z2V0QUVFUygpICkKKwkJeworCQkJY2FzZSBBRUVTX1NUTU5UX05PVEhJTkc6CisJCQljYXNlIEFFRVNfU1RNTlRfRklOQUw6CisJCQljYXNlIEFFRVNfU1RNTlRfREVTVFJPWToKKwkJCXsKKwkJCQl0bXBFRC5td3NldEFFRVMoIEFFRVNfT0sgKTsKKworCQkJCUVOVi5vdXRFRFMuYXBwZW5kKCB0bXBFRCApOworCisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIEFFRVNfT0s6CisJCQljYXNlIEFFRVNfU1RFUF9SRVNVTUU6CisJCQl7CisJCQkJRU5WLm91dEVEUy5hcHBlbmQoIHRtcEVEICk7CisKKwkJCQlicmVhazsKKwkJCX0KKworCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJPDwgIlVuZXhwZWN0ZWQgRU5ESU5EIEVYRUNVVElPTiBTVEFUVVMgYXMgb3V0RURTIDo+ICIKKwkJCQkJCTw8IFJ1bnRpbWVEZWY6OnN0ckFFRVMoIHRtcEVELT5tQUVFUyApIDw8ICIgISEhIgorCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvLyBJUlEgRURTIHRyYWl0ZW1lbnQKKwl3aGlsZSggdG1wRU5WLmlycUVEUy5ub25lbXB0eSgpICkKKwl7CisJCXRtcEVOVi5pcnFFRFMucG9wX2xhc3RfdG8oIHRtcEVEICk7CisKKwkJLy8gVmVyaWZpY2F0aW9uIG9mIEVYRUNVVElPTiBFTkRJTkcgU1RBVFVTCisJCXN3aXRjaCggdG1wRUQtPmdldEFFRVMoKSApCisJCXsKKwkJCWNhc2UgQUVFU19TVE1OVF9CUkVBSzoKKwkJCWNhc2UgQUVFU19TVE1OVF9DT05USU5VRToKKwkJCWNhc2UgQUVFU19TVE1OVF9SRVRVUk46CisJCQl7CisJCQkJdG1wRUQubXdzZXRBRUVTKCBBRUVTX09LICk7CisKKwkJCQlFTlYub3V0RURTLmFwcGVuZCggdG1wRUQgKTsKKworCQkJCWJyZWFrOworCQkJfQorCisJCQlkZWZhdWx0OgorCQkJeworCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQk8PCAiVW5leHBlY3RlZCBFTkRJTkQgRVhFQ1VUSU9OIFNUQVRVUyBhcyBpcnFFRFMgOj4gIgorCQkJCQkJPDwgUnVudGltZURlZjo6c3RyQUVFUyggdG1wRUQtPm1BRUVTICkgPDwgIiAhISEiCisJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8vIEVYSVQgRURTIHRyYWl0ZW1lbnQKKwlFTlYuc3BsaWNlRXhpdCh0bXBFTlYpOworCisJLy8gU3luYyBFRFMgdHJhaXRlbWVudAorCUVOVi5zcGxpY2VTeW5jX213U3RvcmVQb3ModG1wRU5WKTsKKworQVZNX0lGX0RFQlVHX0ZMQUcoIFRJTUUgKQorCXRoZUV4ZWN1dGlvblRpbWVNYW5hZ2VyLmZpbmlzaF90aW1lKCk7CisJQVZNX09TX1RSQUNFIDw8IHRoZUV4ZWN1dGlvblRpbWVNYW5hZ2VyLnRpbWVfc3RhdCgpOy8vIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBUSU1FICkKKworCXJldHVybiggdHJ1ZSApOworfQorCisKK2Jvb2wgQXZtUHJpbWl0aXZlX0ludm9rZVRyYW5zaXRpb246OnJlc3VtZShFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlBUEV4ZWN1dGlvbkRhdGEgb3V0RUQgPSBFTlYuaW5FRDsKKworCS8vIFZlcmlmaWNhdGlvbiBvZiBFWEVDVVRJT04gRU5ESU5HIFNUQVRVUworCXN3aXRjaCggb3V0RUQtPmdldEFFRVMoKSApCisJeworCQljYXNlIEFFRVNfU1RNTlRfQlJFQUs6CisJCWNhc2UgQUVFU19TVE1OVF9DT05USU5VRToKKwkJY2FzZSBBRUVTX1NUTU5UX1JFVFVSTjoKKworCQljYXNlIEFFRVNfU1RNTlRfTk9USElORzoKKwkJY2FzZSBBRUVTX1NUTU5UX0ZJTkFMOgorCQljYXNlIEFFRVNfU1RNTlRfREVTVFJPWToKKwkJeworCQkJb3V0RUQubXdzZXRBRUVTKCBBRUVTX09LICk7CisKKwkJCUVOVi5vdXRFRFMuYXBwZW5kKCBvdXRFRCApOworCisJCQlicmVhazsKKwkJfQorCQljYXNlIEFFRVNfT0s6CisJCWNhc2UgQUVFU19TVEVQX1JFU1VNRToKKwkJeworCQkJRU5WLm91dEVEUy5hcHBlbmQoIG91dEVEICk7CisKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gU3luYyBFRFMgdHJhaXRlbWVudAorCQljYXNlIEFFRVNfU1RFUF9NQVJLOgorCQljYXNlIEFFRVNfV0FJVElOR19JTkNPTV9SRFY6CisJCWNhc2UgQUVFU19XQUlUSU5HX09VVENPTV9SRFY6CisJCWNhc2UgQUVFU19XQUlUSU5HX0pPSU5fRk9SSzoKKwkJeworCQkJRU5WLmFwcGVuZFN5bmNfbXdTdG9yZVBvcyhvdXRFRCk7CisKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBBRUVTX1NUTU5UX0VYSVQ6CisJCWNhc2UgQUVFU19TVE1OVF9FWElUX0FMTDoKKwkJY2FzZSBBRUVTX1NUTU5UX0ZBVEFMX0VSUk9SOgorCQljYXNlIEFFRVNfU1lNQk9MSUNfRVhFQ1VUSU9OX0xJTUlUQVRJT046CisJCXsKKwkJCUVOVi5leGl0RURTLmFwcGVuZCggb3V0RUQgKTsKKworCQkJYnJlYWs7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQk8PCAiVW5leHBlY3RlZCBFTkRJTkQgRVhFQ1VUSU9OIFNUQVRVUyA6PiAiCisJCQkJCTw8IFJ1bnRpbWVEZWY6OnN0ckFFRVMoIG91dEVELT5tQUVFUyApIDw8ICIgISEhIgorCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIGV4ZWN1dGlvbiBvZiBhIElOVk9LRSBFWEVDVVRBQkxFIHByb2dyYW0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIEF2bVByaW1pdGl2ZV9JbnZva2VNZXRob2Q6OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKK2Jvb2wgQXZtUHJpbWl0aXZlX0ludm9rZU1ldGhvZDo6c2V2YWwoRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCXJldHVybiggZmFsc2UgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIGV4ZWN1dGlvbiBvZiBhIElOVk9LRSBGVU5DVElPTiBwcm9ncmFtCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBBdm1QcmltaXRpdmVfSW52b2tlRnVuY3Rpb246OnNldmFsKEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBleGVjdXRpb24gb2YgYSBJTlZPS0UgUFJPR1JBTSBwcm9ncmFtCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBBdm1QcmltaXRpdmVfSW52b2tlUHJvZ3JhbTo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCWNvbnN0IEJGICYgYUNvZGUgPSBFTlYuaW5DT0RFLT5maXJzdCgpOworCWNvbnN0IEF2bVByb2dyYW0gJiBhbkF2bVByb2dyYW0gPSBhQ29kZS50b19yZWY8IEF2bVByb2dyYW0gPigpOworCisJRXhlY3V0aW9uVGltZSB0aGVFeGVjdXRpb25UaW1lTWFuYWdlcihmYWxzZSk7CitBVk1fSUZfREVCVUdfRkxBRyggVElNRSApCisJCXRoZUV4ZWN1dGlvblRpbWVNYW5hZ2VyLnN0YXJ0X3RpbWUoKTsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBUSU1FICkKKworCisJRXhlY3V0aW9uRW52aXJvbm1lbnQgdG1wRU5WKEVOViwgYW5Bdm1Qcm9ncmFtLmdldENvZGUoKSk7CisKKwl0bXBFTlYuaW5FRC5tYWtlV3JpdGFibGUoKTsKKworCUV4ZWN1dGlvbkRhdGFGYWN0b3J5OjphcHBlbmRSdW5uYWJsZUVsZW1lbnRUcmFjZSh0bXBFTlYuaW5FRCwKKwkJCUJGKG5ldyBFeGVjdXRpb25Db25maWd1cmF0aW9uKHRtcEVOVi5pbkVELT5tUklELCBhQ29kZSkpKTsKKworCWlmKCBhbkF2bVByb2dyYW0uaGFzRGF0YSgpICkKKwl7CisJCWlmKCBFTlYuaW5DT0RFLT5wb3B1bGF0ZWQoKSApCisJCXsKKwkJCXB1c2hMb2NhbFZhcnModG1wRU5WLCBhbkF2bVByb2dyYW0sCisJCQkJCUVOVi5pbkNPREUtPnNlY29uZCgpLnRvX3B0cjwgQXJyYXlCRiA+KCkpOworCQl9CisJCWVsc2UKKwkJeworCQkJcHVzaExvY2FsVmFycyh0bXBFTlYsIGFuQXZtUHJvZ3JhbSk7CisJCX0KKwl9CisKKwlpZiggbm90IHRtcEVOVi5ydW4oKSApCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJQVBFeGVjdXRpb25EYXRhIHRtcEVEOworCisJLy8gT1VUUFVUIEVEUyB0cmFpdGVtZW50CisJd2hpbGUoIHRtcEVOVi5vdXRFRFMubm9uZW1wdHkoKSApCisJeworCQl0bXBFTlYub3V0RURTLnBvcF9maXJzdF90byggdG1wRUQgKTsKKworCQkvLyBWZXJpZmljYXRpb24gb2YgRVhFQ1VUSU9OIEVORElORyBTVEFUVVMKKwkJc3dpdGNoKCB0bXBFRC0+Z2V0QUVFUygpICkKKwkJeworCQkJY2FzZSBBRUVTX1NUTU5UX05PVEhJTkc6CisJCQljYXNlIEFFRVNfU1RNTlRfRklOQUw6CisJCQljYXNlIEFFRVNfU1RNTlRfREVTVFJPWToKKwkJCXsKKwkJCQl0bXBFRC5td3NldEFFRVMoIEFFRVNfT0sgKTsKKworCQkJCS8vIEZyZWUgbG9jYWwgZGF0YSB0YWJsZQorCQkJCWlmKCBhbkF2bVByb2dyYW0uaGFzRGF0YSgpICkKKwkJCQl7CisJCQkJCXBvcExvY2FsVmFycyh0bXBFRCk7CisJCQkJfQorCisJCQkJRU5WLm91dEVEUy5hcHBlbmQoIHRtcEVEICk7CisKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgQUVFU19PSzoKKwkJCXsKKwkJCQlpZiggYW5Bdm1Qcm9ncmFtLmhhc0RhdGEoKSApCisJCQkJeworCQkJCQlwb3BMb2NhbFZhcnModG1wRUQpOworCQkJCX0KKworCQkJCUVOVi5vdXRFRFMuYXBwZW5kKCB0bXBFRCApOworCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJCTw8ICJVbmV4cGVjdGVkIEVORElORCBFWEVDVVRJT04gU1RBVFVTIGFzIG91dEVEUyA6PiAiCisJCQkJCQk8PCBSdW50aW1lRGVmOjpzdHJBRUVTKCB0bXBFRC0+bUFFRVMgKSA8PCAiICEhISIKKwkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJLy8gSVJRIEVEUyB0cmFpdGVtZW50CisJd2hpbGUoIHRtcEVOVi5pcnFFRFMubm9uZW1wdHkoKSApCisJeworCQl0bXBFTlYuaXJxRURTLnBvcF9sYXN0X3RvKCB0bXBFRCApOworCisJCS8vIFZlcmlmaWNhdGlvbiBvZiBFWEVDVVRJT04gRU5ESU5HIFNUQVRVUworCQlzd2l0Y2goIHRtcEVELT5nZXRBRUVTKCkgKQorCQl7CisJCQljYXNlIEFFRVNfU1RNTlRfQlJFQUs6CisJCQljYXNlIEFFRVNfU1RNTlRfQ09OVElOVUU6CisJCQljYXNlIEFFRVNfU1RNTlRfUkVUVVJOOgorCQkJeworCQkJCXRtcEVELm13c2V0QUVFUyggQUVFU19PSyApOworCisJCQkJaWYoIGFuQXZtUHJvZ3JhbS5oYXNEYXRhKCkgKQorCQkJCXsKKwkJCQkJcG9wTG9jYWxWYXJzKHRtcEVEKTsKKwkJCQl9CisKKwkJCQlFTlYub3V0RURTLmFwcGVuZCggdG1wRUQgKTsKKworCQkJCWJyZWFrOworCQkJfQorCisJCQlkZWZhdWx0OgorCQkJeworCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQk8PCAiVW5leHBlY3RlZCBFTkRJTkQgRVhFQ1VUSU9OIFNUQVRVUyBhcyBpcnFFRFMgOj4gIgorCQkJCQkJPDwgUnVudGltZURlZjo6c3RyQUVFUyggdG1wRUQtPm1BRUVTICkgPDwgIiAhISEiCisJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8vIEVYSVQgRURTIHRyYWl0ZW1lbnQKKwl3aGlsZSggdG1wRU5WLmV4aXRFRFMubm9uZW1wdHkoKSApCisJeworCQl0bXBFTlYuZXhpdEVEUy5wb3BfbGFzdF90byggdG1wRUQgKTsKKworCQlpZiggYW5Bdm1Qcm9ncmFtLmhhc0RhdGEoKSApCisJCXsKKwkJCXBvcExvY2FsVmFycyh0bXBFRCk7CisJCX0KKworCQlFTlYuZXhpdEVEUy5hcHBlbmQoIHRtcEVEICk7CisJfQorCisKKwkvLyBTeW5jIEVEUyB0cmFpdGVtZW50CisJRU5WLnNwbGljZVN5bmNfbXdTdG9yZVBvcyh0bXBFTlYpOworCitBVk1fSUZfREVCVUdfRkxBRyggVElNRSApCisJdGhlRXhlY3V0aW9uVGltZU1hbmFnZXIuZmluaXNoX3RpbWUoKTsKKwlBVk1fT1NfVFJBQ0UgPDwgdGhlRXhlY3V0aW9uVGltZU1hbmFnZXIudGltZV9zdGF0KCk7Ly8gPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFRJTUUgKQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworYm9vbCBBdm1QcmltaXRpdmVfSW52b2tlUHJvZ3JhbTo6cmVzdW1lKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCWNvbnN0IEF2bVByb2dyYW0gJiBhbkF2bVByb2dyYW0gPSBFTlYuaW5DT0RFLT5maXJzdCgpLnRvX3JlZjwgQXZtUHJvZ3JhbSA+KCk7CisKKwlBUEV4ZWN1dGlvbkRhdGEgb3V0RUQgPSBFTlYuaW5FRDsKKworCS8vIFZlcmlmaWNhdGlvbiBvZiBFWEVDVVRJT04gRU5ESU5HIFNUQVRVUworCXN3aXRjaCggb3V0RUQtPmdldEFFRVMoKSApCisJeworCQljYXNlIEFFRVNfU1RNTlRfQlJFQUs6CisJCWNhc2UgQUVFU19TVE1OVF9DT05USU5VRToKKwkJY2FzZSBBRUVTX1NUTU5UX1JFVFVSTjoKKworCQljYXNlIEFFRVNfU1RNTlRfTk9USElORzoKKwkJY2FzZSBBRUVTX1NUTU5UX0ZJTkFMOgorCQljYXNlIEFFRVNfU1RNTlRfREVTVFJPWToKKwkJeworCQkJb3V0RUQubXdzZXRBRUVTKCBBRUVTX09LICk7CisKKwkJCS8vIEZyZWUgbG9jYWwgZGF0YSB0YWJsZQorCQkJaWYoIGFuQXZtUHJvZ3JhbS5oYXNEYXRhKCkgKQorCQkJeworCQkJCXBvcExvY2FsVmFycyhvdXRFRCk7CisJCQl9CisKKwkJCUVOVi5vdXRFRFMuYXBwZW5kKCBvdXRFRCApOworCisJCQlicmVhazsKKwkJfQorCQljYXNlIEFFRVNfT0s6CisJCWNhc2UgQUVFU19TVEVQX1JFU1VNRToKKwkJeworCQkJaWYoIGFuQXZtUHJvZ3JhbS5oYXNEYXRhKCkgKQorCQkJeworCQkJCXBvcExvY2FsVmFycyhvdXRFRCk7CisJCQl9CisKKwkJCUVOVi5vdXRFRFMuYXBwZW5kKCBvdXRFRCApOworCisJCQlicmVhazsKKwkJfQorCisJCS8vIFN5bmMgRURTIHRyYWl0ZW1lbnQKKwkJY2FzZSBBRUVTX1NURVBfTUFSSzoKKwkJY2FzZSBBRUVTX1dBSVRJTkdfSU5DT01fUkRWOgorCQljYXNlIEFFRVNfV0FJVElOR19PVVRDT01fUkRWOgorCQljYXNlIEFFRVNfV0FJVElOR19KT0lOX0ZPUks6CisJCXsKKwkJCUVOVi5hcHBlbmRTeW5jX213U3RvcmVQb3Mob3V0RUQpOworCisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgQUVFU19TVE1OVF9FWElUOgorCQljYXNlIEFFRVNfU1RNTlRfRVhJVF9BTEw6CisJCWNhc2UgQUVFU19TVE1OVF9GQVRBTF9FUlJPUjoKKwkJY2FzZSBBRUVTX1NZTUJPTElDX0VYRUNVVElPTl9MSU1JVEFUSU9OOgorCQl7CisJCQlpZiggYW5Bdm1Qcm9ncmFtLmhhc0RhdGEoKSApCisJCQl7CisJCQkJcG9wTG9jYWxWYXJzKG91dEVEKTsKKwkJCX0KKworCQkJRU5WLmV4aXRFRFMuYXBwZW5kKCBvdXRFRCApOworCisJCQlicmVhazsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCTw8ICJVbmV4cGVjdGVkIEVORElORCBFWEVDVVRJT04gU1RBVFVTIDo+ICIKKwkJCQkJPDwgUnVudGltZURlZjo6c3RyQUVFUyggb3V0RUQtPm1BRUVTICkgPDwgIiAhISEiCisJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gZXhlY3V0aW9uIG9mIGEgSU5WT0tFIExBTUJEQSBBUFBMWSBwcm9ncmFtCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBBdm1QcmltaXRpdmVfSW52b2tlTGFtYmRhQXBwbHk6OnNldmFsKEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlib29sIHJ0Q29kZSA9IHRydWU7CisKKwljb25zdCBBdm1Db2RlICogYXBwbHlDb2RlID0gRU5WLmluQ09ERTsKKworCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0QXJnID0gYXBwbHlDb2RlLT5iZWdpbigpOworCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGVuZEFyZyA9IGFwcGx5Q29kZS0+ZW5kKCk7CisKKwkvLyBGaXJzdCBhcmcgaXMgdGhlIGxhbWJkYSBmdW5jdGlvbgorCUJGIHRoZUZ1bmN0aW9uID0gKCppdEFyZyk7CisJaWYoIHRoZUZ1bmN0aW9uLmlzbm90PCBBdm1MYW1iZGEgPigpICkKKwl7CisJCWlmKCBub3QgRU5WLnNldmFsKHRoZUZ1bmN0aW9uKSApCisJCXsKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCQl0aGVGdW5jdGlvbiA9IEVOVi5vdXRWQUw7CisJfQorCisJaWYoIHRoZUZ1bmN0aW9uLmlzPCBBdm1MYW1iZGEgPigpICkKKwl7CisJCS8vIEZpcnN0IHBhcmFtYXRlciBpcyBpbiBzZWNvbmQgcG9zaXRpb24sCisJCSsraXRBcmc7CisKKwkJY29uc3QgQXZtTGFtYmRhICYgYUxhbWJkYUZ1biA9IHRoZUZ1bmN0aW9uLnRvX3JlZjwgQXZtTGFtYmRhID4oKTsKKworCQkvLyBDUkVBVEUgTE9DQUwgVkFSSUFCTEUgVEFCTEUKKwkJaWYoIG5vdCBFTlYuaW5FRC0+aGFzTG9jYWxSdW50aW1lU3RhY2soKSkKKwkJeworCQkJRU5WLmluRUQtPmNyZWF0ZUxvY2FsUnVudGltZVN0YWNrKCk7CisJCX0KKwkJTG9jYWxSdW50aW1lIGFMb2NhbFJ1bnRpbWUoIGFMYW1iZGFGdW4gKTsKKworCisJCS8vIENPTVBMRVRFIFJFRFVDVElPTiA6PiB0aGUgcmVzdWx0IGlzIGEgVEVSTQorCQlpZiggYUxhbWJkYUZ1bi5ib3VuZFZhckNvdW50KCkgPCBhcHBseUNvZGUtPnNpemUoKSApCisJCXsKKwkJCS8vIElOSVRJQUxJWkUgTE9DQUwgVkFSSUFCTEUgVEFCTEUKKwkJCWF2bV9zaXplX3Qgb2Zmc2V0ID0gMDsKKwkJCWF2bV9zaXplX3QgZW5kT2Zmc2V0ID0gYUxhbWJkYUZ1bi5nZXREYXRhKCkuc2l6ZSgpOworCQkJZm9yKCA7IG9mZnNldCA8IGVuZE9mZnNldCA7ICsraXRBcmcgLCArK29mZnNldCApCisJCQl7CisJCQkJaWYoIG5vdCBFTlYuc2V2YWwoKml0QXJnICkgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCX0KKwkJCQlhTG9jYWxSdW50aW1lLnNldERhdGEob2Zmc2V0LCBFTlYub3V0VkFMKTsKKwkJCX0KKworCQkJLy8gTE9BRCBMT0NBTCBWQVJJQUJMRSBUQUJMRQorCQkJRU5WLmluRUQtPmdldExvY2FsUnVudGltZXMoKS0+cHVzaCggYUxvY2FsUnVudGltZSApOworCisJCQkvLyBSRURVQ1RJT04KKwkJCXJ0Q29kZSA9IEVOVi5zZXZhbChhTGFtYmRhRnVuLmdldEV4cHJlc3Npb24oKSk7CisJCX0KKworCQkvLyBQQVJUSUFMIFJFRFVDVElPTiA6PiB0aGUgcmVzdWx0IGlzIGEgTGFtYmRhIEZ1bmN0aW9uCisJCWVsc2UKKwkJeworCQkJLy8gTkVXIExBTUJBIEVYUFJFU1NJT04KKwkJCWF2bV9zaXplX3QgbmV3Qm91bmRWYXJpYWJsZUNvdW50ID0KKwkJCQkJYUxhbWJkYUZ1bi5nZXREYXRhKCkuc2l6ZSgpIC0gYXBwbHlDb2RlLT5zaXplKCkgKyAxOworCisJCQlBdm1MYW1iZGEgKiBzdWJzdExhbWJkYSA9IG5ldyBBdm1MYW1iZGEoYUxhbWJkYUZ1bi5nZXRDb250YWluZXIoKSwKKwkJCQkJbmV3Qm91bmRWYXJpYWJsZUNvdW50LCBhTGFtYmRhRnVuLmdldE5hdHVyZSgpKTsKKworCQkJRU5WLm91dFZBTC5yZW5ldyggc3Vic3RMYW1iZGEgKTsKKworCQkJLy8gSU5JVElBTElaRSBMT0NBTCBWQVJJQUJMRSBUQUJMRQorCQkJYXZtX3NpemVfdCBvZmZzZXQgPSAwOworCQkJZm9yKCA7IGl0QXJnICE9IGVuZEFyZyA7ICsraXRBcmcgLCArK29mZnNldCApCisJCQl7CisJCQkJaWYoIG5vdCBFTlYuc2V2YWwoKml0QXJnICkgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCX0KKwkJCQlhTG9jYWxSdW50aW1lLnNldERhdGEob2Zmc2V0LCBFTlYub3V0VkFMKTsKKwkJCX0KKworCQkJLy8gU0VUIE5FVyBCT1VORCBWQVJJQUJMRQorCQkJVGFibGVPZkluc3RhbmNlT2ZEYXRhOjpjb25zdF9yYXdfaXRlcmF0b3IgaXREYXRhID0KKwkJCQkJYUxhbWJkYUZ1bi5nZXREYXRhKCkuYmVnaW4oKTsKKwkJCVRhYmxlT2ZJbnN0YW5jZU9mRGF0YTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGVuZERhdGEgPQorCQkJCQlhTGFtYmRhRnVuLmdldERhdGEoKS5lbmQoKTsKKwkJCWF2bV9vZmZzZXRfdCBuZXdPZmZzZXQgPSAwOworCQkJZm9yKCA7IGl0RGF0YSAhPSBlbmREYXRhIDsgKytpdERhdGEgLCArK29mZnNldCAsICsrbmV3T2Zmc2V0ICkKKwkJCXsKKwkJCQlTeW1ib2wgbGFtYmRhVmFyKCBuZXcgSW5zdGFuY2VPZkRhdGEoCisJCQkJCQlJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfU1RBTkRBUkRfTkFUVVJFLAorCQkJCQkJc3Vic3RMYW1iZGEsIChpdERhdGEpLT5nZXRBc3RFbGVtZW50KCksCisJCQkJCQlUeXBlTWFuYWdlcjo6VU5JVkVSU0FMLCBuZXdPZmZzZXQpICk7CisKKwkJCQlzdWJzdExhbWJkYS0+c2V0RGF0YShuZXdPZmZzZXQsIGxhbWJkYVZhcik7CisKKwkJCQlhTG9jYWxSdW50aW1lLnNldERhdGEob2Zmc2V0LCBsYW1iZGFWYXIpOworCQkJfQorCisJCQkvLyBMT0FEIExPQ0FMIFZBUklBQkxFIFRBQkxFCisJCQlFTlYuaW5FRC0+Z2V0TG9jYWxSdW50aW1lcygpLT5wdXNoKCBhTG9jYWxSdW50aW1lICk7CisKKwkJCS8vIFJFRFVDVElPTgorCQkJaWYoIChydENvZGUgPSBFTlYuc2V2YWwoYUxhbWJkYUZ1bi5nZXRFeHByZXNzaW9uKCkpKSApCisJCQl7CisJCQkJc3Vic3RMYW1iZGEtPnNldEV4cHJlc3Npb24oIEVOVi5vdXRWQUwgKTsKKwkJCX0KKwkJfQorCisJCS8vIFVOTE9BRCAmIERFU1RST1kgTE9DQUwgVkFSSUFCTEUgVEFCTEUKKwkJaWYoIEVOVi5pbkVELT5oYXNMb2NhbFJ1bnRpbWUoKSApCisJCXsKKwkJCUVOVi5pbkVELT5nZXRMb2NhbFJ1bnRpbWVzKCktPnBvcCgpOworCisJCQlpZiggbm90IEVOVi5pbkVELT5oYXNMb2NhbFJ1bnRpbWUoKSApCisJCQl7CisJCQkJRU5WLmluRUQtPmRlc3Ryb3lMb2NhbFJ1bnRpbWVTdGFjaygpOworCQkJfQorCQl9CisJfQorCisJZWxzZQorCXsKKwkJQkZDb2RlIHRoZVN1YnN0Q29kZSggYXBwbHlDb2RlLT5nZXRPcGVyYXRvcigpICwgdGhlRnVuY3Rpb24gKTsKKworCQlmb3IgKCArK2l0QXJnIDsgaXRBcmcgIT0gZW5kQXJnIDsgKytpdEFyZyApCisJCXsKKwkJCWlmKCBub3QgRU5WLnNldmFsKCppdEFyZyApICkKKwkJCXsKKwkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQl9CisJCQl0aGVTdWJzdENvZGUtPmFwcGVuZCggRU5WLm91dFZBTCApOworCQl9CisKKwkJRU5WLm91dFZBTCA9IHRoZVN1YnN0Q29kZTsKKwl9CisKKwlyZXR1cm4oIHJ0Q29kZSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gZXhlY3V0aW9uIG9mIGEgSU5WT0tFIExBTUJEQSBMRVQgcHJvZ3JhbQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgQXZtUHJpbWl0aXZlX0ludm9rZUxhbWJkYUxldDo6c2V2YWwoRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCXJldHVybiggZmFsc2UgKTsKK30KKworCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1JbnZva2VQcmltaXRpdmUuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1JbnZva2VQcmltaXRpdmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTgyMDM0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bUludm9rZVByaW1pdGl2ZS5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyIG5vdi4gMjAxMAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEFWTUlOVk9LRVBSSU1JVElWRV9IXworI2RlZmluZSBBVk1JTlZPS0VQUklNSVRJVkVfSF8KKworI2luY2x1ZGUgPGNvbXB1dGVyL3ByaW1pdGl2ZS9CYXNlQXZtUHJpbWl0aXZlLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIEF2bVByb2dyYW07CitjbGFzcyBBUEV4ZWN1dGlvbkRhdGE7CitjbGFzcyBBcnJheUJGOworY2xhc3MgQkY7CitjbGFzcyBCYXNlQXZtUHJvZ3JhbTsKKworCitBVk1fUFJJTUlUSVZFX1JVTl9FVkFMX0NMQVNTKEludm9rZU5ldywgQmFzZUF2bVByaW1pdGl2ZSkKKworCitBVk1fUFJJTUlUSVZFX0NMQVNTX0hFQURFUihBdm1CYXNlSW52b2tlUHJpbWl0aXZlLCBCYXNlQXZtUHJpbWl0aXZlKQorCWJvb2wgcHVzaExvY2FsVmFyMShFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOViwKKwkJCWNvbnN0IEJhc2VBdm1Qcm9ncmFtICYgYVByb2dyYW0sIGNvbnN0IEJGICYgYVBhcmFtKTsKKworCWJvb2wgcHVzaExvY2FsVmFycyhFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOViwKKwkJCWNvbnN0IEJhc2VBdm1Qcm9ncmFtICYgYVByb2dyYW0sIEFycmF5QkYgKiBwYXJhbXMpOworCisJYm9vbCBwdXNoTG9jYWxWYXJzKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WLAorCQkJY29uc3QgQmFzZUF2bVByb2dyYW0gJiBhUHJvZ3JhbSk7CisKKwlib29sIHBvcExvY2FsVmFycyhBUEV4ZWN1dGlvbkRhdGEgJiBhbkVEKTsKK307CisKKworQVZNX1BSSU1JVElWRV9SVU5fUkVTVU1FX0NMQVNTX0hFQURFUihJbnZva2VSb3V0aW5lLCBBdm1CYXNlSW52b2tlUHJpbWl0aXZlKQorCQlib29sIHJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOViwgY29uc3QgQXZtUHJvZ3JhbSAmIGFuQXZtUHJvZ3JhbSk7CisKKwkJYm9vbCBydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsCisJCQkJY29uc3QgQXZtUHJvZ3JhbSAmIGFuQXZtUHJvZ3JhbSwgY29uc3QgQkYgJiBhUGFyYW0pOworfTsKKworQVZNX1BSSU1JVElWRV9SVU5fUkVTVU1FX0NMQVNTKEludm9rZVRyYW5zaXRpb24sIEJhc2VBdm1QcmltaXRpdmUpCisKKworQVZNX1BSSU1JVElWRV9SVU5fRVZBTF9DTEFTUyhJbnZva2VNZXRob2QsIEJhc2VBdm1QcmltaXRpdmUpCisKK0FWTV9QUklNSVRJVkVfRVZBTF9DTEFTUyhJbnZva2VGdW5jdGlvbiwgQmFzZUF2bVByaW1pdGl2ZSkKKworCitBVk1fUFJJTUlUSVZFX1JVTl9SRVNVTUVfQ0xBU1MoSW52b2tlUHJvZ3JhbSwgQXZtQmFzZUludm9rZVByaW1pdGl2ZSkKKworCitBVk1fUFJJTUlUSVZFX0VWQUxfQ0xBU1MoSW52b2tlTGFtYmRhQXBwbHksIEJhc2VBdm1QcmltaXRpdmUpCisKK0FWTV9QUklNSVRJVkVfRVZBTF9DTEFTUyhJbnZva2VMYW1iZGFMZXQsIEJhc2VBdm1QcmltaXRpdmUpCisKKworCisKK30KKworI2VuZGlmIC8qIEFWTUlOVk9LRVBSSU1JVElWRV9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bUl0ZVByaW1pdGl2ZS5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtSXRlUHJpbWl0aXZlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmNkNjI3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bUl0ZVByaW1pdGl2ZS5jcHAKQEAgLTAsMCArMSwxNzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyMCBtYWkgMjAxMAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQXZtSXRlUHJpbWl0aXZlLmgiCisKKyNpbmNsdWRlIDxjb21wdXRlci9FdmFsdWF0aW9uRW52aXJvbm1lbnQuaD4KKyNpbmNsdWRlIDxjb21wdXRlci9FeGVjdXRpb25FbnZpcm9ubWVudC5oPgorCisjaW5jbHVkZSA8Y29tcHV0ZXIvUGF0aENvbmRpdGlvblByb2Nlc3Nvci5oPgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQXZtQ29kZS5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25Db25zdHJ1Y3Rvci5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uRGF0YS5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL1J1bnRpbWVJRC5oPgorCisjaW5jbHVkZSA8c29sdmVyL2FwaS9Tb2x2ZXJGYWN0b3J5Lmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXhlY3V0aW9uIG9mIGFuIElGIHByb2dyYW0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworYm9vbCBBdm1QcmltaXRpdmVfSWY6OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlpZiggRU5WLm1BUkctPmF0KDApLmlzRXF1YWxUcnVlKCkgKQorCXsKKwkJLy8gVEhFTiBTVEFURU1FTlQKKwkJRXhlY3V0aW9uRW52aXJvbm1lbnQgdG1wRU5WKEVOViwgRU5WLm1BUkctPm91dEVELCBFTlYubUFSRy0+YXQoMSkuYmZDb2RlKCkpOworCQlpZiggdG1wRU5WLnJ1bigpICkKKwkJeworCQkJRU5WLnNwbGljZU91dHB1dCggdG1wRU5WICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKwl9CisJZWxzZSBpZiggRU5WLm1BUkctPmF0KDApLmlzRXF1YWxGYWxzZSgpICkKKwl7CisJCUVOVi5hcHBlbmRPdXRwdXQoIEVOVi5tQVJHLT5vdXRFRCApOworLy8JCUVOVi54YXBwZW5kT3V0RUQoIEVOVi5tQVJHLT5vdXRFRCAsIGFQcm9ncmFtICk7CisJfQorCisJZWxzZQorCXsKKwkJLy8gVEhFTiBTVEFURU1FTlQKKwkJRXhlY3V0aW9uRW52aXJvbm1lbnQgdG1wRU5WKEVOViwgRU5WLm1BUkctPm91dEVELCBFTlYubUFSRy0+YXQoMCkpOworCQlpZiggUGF0aENvbmRpdGlvblByb2Nlc3Nvcjo6YXBwZW5kUGF0aENvbmRpdGlvbih0bXBFTlYpICkKKwkJeworCQkJaWYoIHRtcEVOVi5ydW5Gcm9tT3V0cHV0cyhFTlYubUFSRy0+YXQoMSkuYmZDb2RlKCkpICkKKwkJCXsKKwkJCQlFTlYuc3BsaWNlT3V0cHV0KCB0bXBFTlYgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQl9CisKKwkJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkJCS8vIENBU0UgRUxTRSB7IE5PUCB9CisJCQlCRiBlbHNlQ29uZCA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bm90RXhwcihFTlYubUFSRy0+YXQoMCkpOworCQkJaWYoIG5vdCBQYXRoQ29uZGl0aW9uUHJvY2Vzc29yOjphcHBlbmRQYXRoQ29uZGl0aW9uKAorCQkJCQlFTlYsIEVOVi5tQVJHLT5vdXRFRCwgZWxzZUNvbmQpICkKKwkJCXsKKwkJCQkvLyBOT1RISU5HCisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCQkvLyBDQVNFIEVMU0UgeyBOT1AgfQorCQkJRU5WLmFwcGVuZE91dHB1dCggRU5WLmluRUQgKTsKKwkJfQorCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXhlY3V0aW9uIG9mIGFuIElGRSBwcm9ncmFtCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK2Jvb2wgQXZtUHJpbWl0aXZlX0lmZTo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCWlmKCBFTlYubUFSRy0+YXQoMCkuaXNFcXVhbFRydWUoKSApCisJeworCQkvLyBUSEVOIFNUQVRFTUVOVAorCQlFeGVjdXRpb25FbnZpcm9ubWVudCB0bXBFTlYoRU5WLCBFTlYubUFSRy0+b3V0RUQsIEVOVi5tQVJHLT5hdCgxKS5iZkNvZGUoKSk7CisJCWlmKCB0bXBFTlYucnVuKCkgKQorCQl7CisJCQlFTlYuc3BsaWNlT3V0cHV0KCB0bXBFTlYgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KKwllbHNlIGlmKCBFTlYubUFSRy0+YXQoMCkuaXNFcXVhbEZhbHNlKCkgKQorCXsKKwkJLy8gRUxTRSBTVEFURU1FTlQKKwkJRXhlY3V0aW9uRW52aXJvbm1lbnQgdG1wRU5WKEVOViwgRU5WLm1BUkctPmF0KDIpLmJmQ29kZSgpKTsKKwkJaWYoIHRtcEVOVi5ydW4oKSApCisJCXsKKwkJCUVOVi5zcGxpY2VPdXRwdXQoIHRtcEVOViApOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorCisJZWxzZQorCXsKKwkJLy8gVEhFTiBTVEFURU1FTlQKKwkJRXhlY3V0aW9uRW52aXJvbm1lbnQgdGhlbkVOVihFTlYsIEVOVi5tQVJHLT5vdXRFRCwgRU5WLm1BUkctPmF0KDApKTsKKwkJaWYoIFBhdGhDb25kaXRpb25Qcm9jZXNzb3I6OmFwcGVuZFBhdGhDb25kaXRpb24odGhlbkVOVikgKQorCQl7CisJCQlpZiggdGhlbkVOVi5ydW5Gcm9tT3V0cHV0cyhFTlYubUFSRy0+YXQoMSkuYmZDb2RlKCkpICkKKwkJCXsKKwkJCQlFTlYuc3BsaWNlT3V0cHV0KCB0aGVuRU5WICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJfQorCQl9CisKKwkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQkvLyBFTFNFIFNUQVRFTUVOVAorCQlCRiBlbHNlQ29uZCA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bm90RXhwcihFTlYubUFSRy0+YXQoMCkpOworCQlFeGVjdXRpb25FbnZpcm9ubWVudCBlbHNlRU5WKEVOViwgRU5WLm1BUkctPm91dEVELCBlbHNlQ29uZCk7CisJCWlmKCBQYXRoQ29uZGl0aW9uUHJvY2Vzc29yOjphcHBlbmRQYXRoQ29uZGl0aW9uKGVsc2VFTlYpICkKKwkJeworCQkJaWYoIGVsc2VFTlYucnVuRnJvbU91dHB1dHMoRU5WLm1BUkctPmF0KDIpLmJmQ29kZSgpKSApCisJCQl7CisJCQkJRU5WLnNwbGljZU91dHB1dCggZWxzZUVOViApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtSXRlUHJpbWl0aXZlLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtSXRlUHJpbWl0aXZlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIxZmQ4OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1JdGVQcmltaXRpdmUuaApAQCAtMCwwICsxLDMyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjAgbWFpIDIwMTAKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBBVk1JVEVQUklNSVRJVkVfSF8KKyNkZWZpbmUgQVZNSVRFUFJJTUlUSVZFX0hfCisKKyNpbmNsdWRlIDxjb21wdXRlci9wcmltaXRpdmUvQmFzZUF2bVByaW1pdGl2ZS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworQVZNX1BSSU1JVElWRV9SVU5fQ0xBU1MoSWYsIEJhc2VBdm1QcmltaXRpdmUpCisKK0FWTV9QUklNSVRJVkVfUlVOX0NMQVNTKElmZSwgQmFzZUF2bVByaW1pdGl2ZSkKKworCit9CisKKyNlbmRpZiAvKiBBVk1JVEVQUklNSVRJVkVfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1JdGVyYXRpb25QcmltaXRpdmUuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bUl0ZXJhdGlvblByaW1pdGl2ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVmNzNkYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1JdGVyYXRpb25QcmltaXRpdmUuY3BwCkBAIC0wLDAgKzEsODY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjAgbWFpIDIwMTAKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkF2bUl0ZXJhdGlvblByaW1pdGl2ZS5oIgorCisjaW5jbHVkZSA8Y29tcHV0ZXIvRXZhbHVhdGlvbkVudmlyb25tZW50Lmg+CisjaW5jbHVkZSA8Y29tcHV0ZXIvRXhlY3V0aW9uRW52aXJvbm1lbnQuaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0F2bUNvZGUuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkRhdGEuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lSUQuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBleGVjdXRpb24gb2YgYSBGT1IgcHJvZ3JhbQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitib29sIEF2bVByaW1pdGl2ZV9Gb3I6OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlyZXR1cm4oIHJ1bihFTlYsIEVOVi5pbkNPREUtPmZpcnN0KCkpICk7Cit9CisKKworYm9vbCBBdm1QcmltaXRpdmVfRm9yOjpyZXN1bWUoRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJcmV0dXJuKCBydW4oRU5WLCBFTlYuaW5DT0RFLT50aGlyZCgpKSApOworfQorCisKK2Jvb2wgQXZtUHJpbWl0aXZlX0Zvcjo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WLCBjb25zdCBCRiAmIGluaXRTdG1udCkKK3sKKwljb25zdCBCRiAmICAgICBmb3JDb25kID0gRU5WLmluQ09ERS0+c2Vjb25kKCk7CisJY29uc3QgQkZDb2RlICYgZm9ySW5jciA9IEVOVi5pbkNPREUtPnRoaXJkKCkuYmZDb2RlKCk7CisJY29uc3QgQkZDb2RlICYgZm9yU3RtbnQgPSBFTlYuaW5DT0RFLT5mb3VydGgoKS5iZkNvZGUoKTsKKworCUV4ZWN1dGlvbkVudmlyb25tZW50IHN0bW50RU5WKEVOViwgQkZDb2RlOjpSRUZfTlVMTCk7CisKKwlFeGVjdXRpb25FbnZpcm9ubWVudCBpdGVyRU5WKEVOViwgaW5pdFN0bW50KTsKKworCS8vIElOSVRJQUxJU0FUSU9OCisJaWYoIG5vdCBpdGVyRU5WLnJ1bigpICkKKwl7CisJCUFWTV9PU19FWElUKCBGQUlMRUQgKQorCQkJCTw8ICJGYWlsZWQgdG8gUlVOIEZPUjwgSU5JVCA+ICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCUFQRXhlY3V0aW9uRGF0YSB0bXBFRDsKKworCXdoaWxlKCBpdGVyRU5WLm91dEVEUy5ub25lbXB0eSgpICkKKwl7CisJCWl0ZXJFTlYub3V0RURTLnBvcF9maXJzdF90byggdG1wRUQgKTsKKworCQkvLyBFdmFsdWF0aW9uIG9mIEZPUiBDT05ESVRJT04KKwkJRXZhbHVhdGlvbkVudmlyb25tZW50IGNvbmRFTlYoRU5WLCB0bXBFRCk7CisJCWlmKCBub3QgY29uZEVOVi5ldmFsQm9vbGVhbihmb3JDb25kKSApCisJCXsKKwkJCUFWTV9PU19FWElUKCBGQUlMRUQgKQorCQkJCQk8PCAiRmFpbGVkIHRvIEVWQUwgRk9SPCBDT05ESVRJT04gPiAhISEiCisJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisKKwkJRU5WLnNwbGljZUZhaWx1cmUoY29uZEVOVik7CisKKworCQlpZiggY29uZEVOVi5vdXRWQUwuaXNFcXVhbFRydWUoKSApCisJCXsKKwkJCS8vIEV2YWx1YXRpb24gb2YgRk9SIFNUQVRFTUVOVAorCQkJaWYoIG5vdCBzdG1udEVOVi5ydW4oY29uZEVOVi5vdXRFRCwgZm9yU3RtbnQpICkKKwkJCXsKKwkJCQlBVk1fT1NfRVhJVCggRkFJTEVEICkKKwkJCQkJCTw8ICJGYWlsZWQgdG8gUlVOIEZPUjwgU1RBVEVNRU5UID4gISEhIgorCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJfQorCQl9CisJCWVsc2UgaWYoIGNvbmRFTlYub3V0VkFMLmlzRXF1YWxGYWxzZSgpICkKKwkJeworCQkJRU5WLm91dEVEUy5hcHBlbmQoIHRtcEVEICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQk8PCAiVGhyb3cgdW5leHBlY3RlZCAiCisJCQkJCQkiTk9OIENPTkNSRVRFIEJPT0xFQU4gVkFMVUUgRk9SIENPTkRJVElPTiA6ICIKKwkJCQkJPDwgdG1wRUQtPm1SSUQuc3RyVW5pcUlkKCkKKwkJCQkJPDwgIiAsIiA8PCBzdHJfaW5kZW50KCBjb25kRU5WLm91dFZBTCApCisJCQkJCTw8ICIgfD0+IiA8PCBmb3JDb25kLnN0cigpIDw8ICIgISEhIgorCQkJCQk8PCBTRU5EX0VYSVQ7CisJCX0KKworCQkvLyBPVVRQVVQgRURTIHRyYWl0ZW1lbnQKKwkJd2hpbGUoIHN0bW50RU5WLm91dEVEUy5ub25lbXB0eSgpICkKKwkJeworCQkJc3RtbnRFTlYub3V0RURTLnBvcF9sYXN0X3RvKCB0bXBFRCApOworCisJCQlzd2l0Y2goIHRtcEVELT5nZXRBRUVTKCkgKQorCQkJeworCQkJCWNhc2UgQUVFU19TVE1OVF9OT1RISU5HOgorCQkJCWNhc2UgQUVFU19TVE1OVF9GSU5BTDoKKwkJCQljYXNlIEFFRVNfU1RNTlRfREVTVFJPWToKKwkJCQl7CisJCQkJCXRtcEVELm13c2V0QUVFUyggQUVFU19PSyApOworCisJCQkJCS8vIEV2YWx1YXRpb24gb2YgRk9SIElOQ1JFTUVOVCBzdGF0ZW1lbnQKKwkJCQkJaWYoIG5vdCBpdGVyRU5WLnJ1bih0bXBFRCwgZm9ySW5jcikgKQorCQkJCQl7CisJCQkJCQlBVk1fT1NfRVhJVCggRkFJTEVEICkKKwkJCQkJCQkJPDwgIkZhaWxlZCB0byBSVU4gRk9SPCBJTkNSRU1FTlQgPiAhISEiCisJCQkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCQl9CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJY2FzZSBBRUVTX09LOgorCQkJCWNhc2UgQUVFU19TVEVQX1JFU1VNRToKKwkJCQl7CisJCQkJCS8vIEV2YWx1YXRpb24gb2YgRk9SIElOQ1JFTUVOVCBzdGF0ZW1lbnQKKwkJCQkJaWYoIG5vdCBpdGVyRU5WLnJ1bih0bXBFRCwgZm9ySW5jcikgKQorCQkJCQl7CisJCQkJCQlBVk1fT1NfRVhJVCggRkFJTEVEICkKKwkJCQkJCQkJPDwgIkZhaWxlZCB0byBSVU4gRk9SPCBJTkNSRU1FTlQgPiAhISEiCisJCQkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCQl9CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQkJPDwgIlVuZXhwZWN0ZWQgRU5ESU5EIEVYRUNVVElPTiBTVEFUVVMgYXMgb3V0RURTIDo+ICIKKwkJCQkJCQk8PCBSdW50aW1lRGVmOjpzdHJBRUVTKCB0bXBFRC0+bUFFRVMgKSA8PCAiICEhISIKKwkJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8vIElSUSBFRFMgdHJhaXRlbWVudAorCQl3aGlsZSggc3RtbnRFTlYuaXJxRURTLm5vbmVtcHR5KCkgKQorCQl7CisJCQlzdG1udEVOVi5pcnFFRFMucG9wX2xhc3RfdG8oIHRtcEVEICk7CisKKwkJCXN3aXRjaCggdG1wRUQtPmdldEFFRVMoKSApCisJCQl7CisJCQkJY2FzZSBBRUVTX1NUTU5UX0JSRUFLOgorCQkJCXsKKwkJCQkJdG1wRUQubXdzZXRBRUVTKCBBRUVTX09LICk7CisKKwkJCQkJRU5WLm91dEVEUy5hcHBlbmQoIHRtcEVEICk7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWNhc2UgQUVFU19TVE1OVF9SRVRVUk46CisJCQkJeworCQkJCQlFTlYuaXJxRURTLmFwcGVuZCggdG1wRUQgKTsKKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQljYXNlIEFFRVNfU1RNTlRfQ09OVElOVUU6CisJCQkJeworCQkJCQl0bXBFRC5td3NldEFFRVMoIEFFRVNfT0sgKTsKKworCQkJCQkvLyBFdmFsdWF0aW9uIG9mIEZPUiBJTkNSRU1FTlQgc3RhdGVtZW50CisJCQkJCWlmKCBub3QgaXRlckVOVi5ydW4odG1wRUQsIGZvckluY3IpICkKKwkJCQkJeworCQkJCQkJQVZNX09TX0VYSVQoIEZBSUxFRCApCisJCQkJCQkJCTw8ICJGYWlsZWQgdG8gUlVOIEZPUjwgSU5DUkVNRU5UID4gISEhIgorCQkJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCQkJfQorCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJCTw8ICJVbmV4cGVjdGVkIEVORElORCBFWEVDVVRJT04gU1RBVFVTIGFzIGlycUVEUyA6PiAiCisJCQkJCQkJPDwgUnVudGltZURlZjo6c3RyQUVFUyggdG1wRUQtPm1BRUVTICkgPDwgIiAhISEiCisJCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBTeW5jIEVEUyB0cmFpdGVtZW50CisJCUVOVi5zcGxpY2VTeW5jX213U3RvcmVQb3Moc3RtbnRFTlYpOworCX0KKworCUVOVi5zcGxpY2VOb3RPdXRwdXQoc3RtbnRFTlYpOworCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBleGVjdXRpb24gb2YgYSBGT1IgcHJvZ3JhbQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitib29sIEF2bVByaW1pdGl2ZV9Gb3JlYWNoOjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJSW5zdGFuY2VPZkRhdGEgKiBmb3JJdGVyYXRvciA9IEVOVi5tQVJHLT5hdCgwKS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKTsKKwljb25zdCBCRiAgICAgJiBmb3JDb2xsZWN0aW9uID0gRU5WLm1BUkctPmF0KDEpOworCWNvbnN0IEJGQ29kZSAmIGZvclN0YXRlbWVudCAgPSBFTlYubUFSRy0+YXQoMikuYmZDb2RlKCk7CisKKwlFeGVjdXRpb25FbnZpcm9ubWVudCBzdG1udEVOVihFTlYsIEJGQ29kZTo6UkVGX05VTEwpOworCisJRXhlY3V0aW9uRW52aXJvbm1lbnQgaXRlckVOVihFTlYsIEJGQ29kZTo6UkVGX05VTEwpOworCWl0ZXJFTlYuYXBwZW5kT3V0cHV0KCBFTlYubUFSRy0+b3V0RUQgKTsKKworCUFQRXhlY3V0aW9uRGF0YSB0bXBFRDsKKworCWF2bV9zaXplX3QgZW5kT2Zmc2V0ID0gZm9yQ29sbGVjdGlvbi5zaXplKCk7CisJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDAgOyBvZmZzZXQgPCBlbmRPZmZzZXQgOyArK29mZnNldCApCisJeworCQl3aGlsZSggaXRlckVOVi5vdXRFRFMubm9uZW1wdHkoKSApCisJCXsKKwkJCWl0ZXJFTlYub3V0RURTLnBvcF9maXJzdF90byggdG1wRUQgKTsKKworCQkJaWYoIEVOVi5zZXRSdmFsdWUodG1wRUQsIGZvckl0ZXJhdG9yLCBmb3JDb2xsZWN0aW9uLmF0KG9mZnNldCkpICkKKwkJCXsKKwkJCQlzdG1udEVOVi5hcHBlbmRPdXRwdXQoIHRtcEVEICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQVZNX09TX0VYSVQoIEZBSUxFRCApCisJCQkJCQk8PCAiRmFpbGVkIHRvIElOQ1JFTUVOVCBGT1JFQUNIPCBJVEVSQVRPUiA+ICEhISIKKwkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJfQorCisJCWlmKCBub3Qgc3RtbnRFTlYucnVuRnJvbU91dHB1dHMoZm9yU3RhdGVtZW50KSApCisJCXsKKwkJCUFWTV9PU19FWElUKCBGQUlMRUQgKQorCQkJCQk8PCAiRmFpbGVkIHRvIFJVTiBGT1JFQUNIPCBTVEFURU1FTlQgPiAhISEiCisJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisKKwkJRU5WLnNwbGljZUZhaWx1cmUoIHN0bW50RU5WICk7CisKKworCQkvLyBPVVRQVVQgRURTIHRyYWl0ZW1lbnQKKwkJd2hpbGUoIHN0bW50RU5WLm91dEVEUy5ub25lbXB0eSgpICkKKwkJeworCQkJc3RtbnRFTlYub3V0RURTLnBvcF9sYXN0X3RvKCB0bXBFRCApOworCisJCQlzd2l0Y2goIHRtcEVELT5nZXRBRUVTKCkgKQorCQkJeworCQkJCWNhc2UgQUVFU19TVE1OVF9OT1RISU5HOgorCQkJCWNhc2UgQUVFU19TVE1OVF9GSU5BTDoKKwkJCQljYXNlIEFFRVNfU1RNTlRfREVTVFJPWToKKwkJCQl7CisJCQkJCXRtcEVELm13c2V0QUVFUyggQUVFU19PSyApOworCisJCQkJCWl0ZXJFTlYub3V0RURTLmFwcGVuZCggdG1wRUQgKTsKKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQljYXNlIEFFRVNfT0s6CisJCQkJY2FzZSBBRUVTX1NURVBfUkVTVU1FOgorCQkJCXsKKwkJCQkJaXRlckVOVi5vdXRFRFMuYXBwZW5kKCB0bXBFRCApOworCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJCTw8ICJVbmV4cGVjdGVkIEVORElORCBFWEVDVVRJT04gU1RBVFVTIGFzIG91dEVEUyA6PiAiCisJCQkJCQkJPDwgUnVudGltZURlZjo6c3RyQUVFUyggdG1wRUQtPm1BRUVTICkgPDwgIiAhISEiCisJCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBJUlEgRURTIHRyYWl0ZW1lbnQKKwkJd2hpbGUoIHN0bW50RU5WLmlycUVEUy5ub25lbXB0eSgpICkKKwkJeworCQkJc3RtbnRFTlYuaXJxRURTLnBvcF9sYXN0X3RvKCB0bXBFRCApOworCisJCQlzd2l0Y2goIHRtcEVELT5nZXRBRUVTKCkgKQorCQkJeworCQkJCWNhc2UgQUVFU19TVE1OVF9CUkVBSzoKKwkJCQl7CisJCQkJCXRtcEVELm13c2V0QUVFUyggQUVFU19PSyApOworCisJCQkJCUVOVi5vdXRFRFMuYXBwZW5kKCB0bXBFRCApOworCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljYXNlIEFFRVNfU1RNTlRfUkVUVVJOOgorCQkJCXsKKwkJCQkJRU5WLmlycUVEUy5hcHBlbmQoIHRtcEVEICk7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJY2FzZSBBRUVTX1NUTU5UX0NPTlRJTlVFOgorCQkJCXsKKwkJCQkJdG1wRUQubXdzZXRBRUVTKCBBRUVTX09LICk7CisKKwkJCQkJaXRlckVOVi5vdXRFRFMuYXBwZW5kKCB0bXBFRCApOworCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJCTw8ICJVbmV4cGVjdGVkIEVORElORCBFWEVDVVRJT04gU1RBVFVTIGFzIGlycUVEUyA6PiAiCisJCQkJCQkJPDwgUnVudGltZURlZjo6c3RyQUVFUyggdG1wRUQtPm1BRUVTICkgPDwgIiAhISEiCisJCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBTeW5jIEVEUyB0cmFpdGVtZW50CisJCUVOVi5zcGxpY2VTeW5jX213U3RvcmVQb3Moc3RtbnRFTlYpOworCX0KKworCUVOVi5zcGxpY2VPdXRwdXQoaXRlckVOVik7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXhlY3V0aW9uIG9mIGEgV0hJTEUgcHJvZ3JhbQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK2Jvb2wgQXZtUHJpbWl0aXZlX1doaWxlRG86OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwljb25zdCBCRiAmICAgd2hpbGVDb25kID0gRU5WLmluQ09ERS0+Zmlyc3QoKTsKKwljb25zdCBCRkNvZGUgJiBkb1N0bW50ID0gRU5WLmluQ09ERS0+c2Vjb25kKCkuYmZDb2RlKCk7CisKKwlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGEgdG1wTGlzdE9mSW5wdXRFRCggRU5WLmluRUQgKTsKKworCUV4ZWN1dGlvbkVudmlyb25tZW50IHN0bW50RU5WKEVOViwgQkZDb2RlOjpSRUZfTlVMTCk7CisKKwlBUEV4ZWN1dGlvbkRhdGEgdG1wRUQ7CisKKwl3aGlsZSggdG1wTGlzdE9mSW5wdXRFRC5ub25lbXB0eSgpICkKKwl7CisJCXRtcExpc3RPZklucHV0RUQucG9wX2ZpcnN0X3RvKCB0bXBFRCApOworCisJCS8vIEV2YWx1YXRpb24gb2YgV0hJTEVfRE8gQ09ORElUSU9OCisJCUV2YWx1YXRpb25FbnZpcm9ubWVudCBjb25kRU5WKEVOViwgdG1wRUQpOworCQlpZiggbm90IGNvbmRFTlYuZXZhbEJvb2xlYW4od2hpbGVDb25kKSApCisJCXsKKwkJCUFWTV9PU19FWElUKCBGQUlMRUQgKQorCQkJCQk8PCAiRmFpbGVkIHRvIEVWQUwgV0hJTEVfRE88IENPTkRJVElPTiA+ICEhISIKKwkJCQkJPDwgU0VORF9FWElUOworCisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKworCQlFTlYuc3BsaWNlRmFpbHVyZShjb25kRU5WKTsKKworCisJCWlmKCBjb25kRU5WLm91dFZBTC5pc0VxdWFsVHJ1ZSgpICkKKwkJeworCQkJLy8gRXZhbHVhdGlvbiBvZiBXSElMRV9ETyBTVEFURU1FTlQKKwkJCWlmKCBub3Qgc3RtbnRFTlYucnVuKGNvbmRFTlYub3V0RUQsIGRvU3RtbnQpICkKKwkJCXsKKwkJCQlBVk1fT1NfRVhJVCggRkFJTEVEICkKKwkJCQkJCTw8ICJGYWlsZWQgdG8gUlVOIFdISUxFX0RPPCBTVEFURU1FTlQgPiAhISEiCisJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiggY29uZEVOVi5vdXRWQUwuaXNFcXVhbEZhbHNlKCkgKQorCQl7CisJCQlFTlYub3V0RURTLmFwcGVuZCggdG1wRUQgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCTw8ICJUaHJvdyB1bmV4cGVjdGVkICIKKwkJCQkJCSJOT04gQ09OQ1JFVEUgQk9PTEVBTiBWQUxVRSBGT1IgQ09ORElUSU9OIDogIgorCQkJCQk8PCB0bXBFRC0+bVJJRC5zdHJVbmlxSWQoKQorCQkJCQk8PCAiICwiIDw8IHN0cl9pbmRlbnQoIGNvbmRFTlYub3V0VkFMICkKKwkJCQkJPDwgIiB8PT4iIDw8IHdoaWxlQ29uZC5zdHIoKSA8PCAiICEhISIKKwkJCQkJPDwgU0VORF9FWElUOworCQl9CisKKwkJLy8gT1VUUFVUIEVEUyB0cmFpdGVtZW50CisJCXdoaWxlKCBzdG1udEVOVi5vdXRFRFMubm9uZW1wdHkoKSApCisJCXsKKwkJCXN0bW50RU5WLm91dEVEUy5wb3BfbGFzdF90byggdG1wRUQgKTsKKworCQkJc3dpdGNoKCB0bXBFRC0+Z2V0QUVFUygpICkKKwkJCXsKKwkJCQljYXNlIEFFRVNfU1RNTlRfTk9USElORzoKKwkJCQljYXNlIEFFRVNfU1RNTlRfRklOQUw6CisJCQkJY2FzZSBBRUVTX1NUTU5UX0RFU1RST1k6CisJCQkJeworCQkJCQl0bXBFRC5td3NldEFFRVMoIEFFRVNfT0sgKTsKKworCQkJCQl0bXBMaXN0T2ZJbnB1dEVELmFwcGVuZCggdG1wRUQgKTsKKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQljYXNlIEFFRVNfT0s6CisJCQkJY2FzZSBBRUVTX1NURVBfUkVTVU1FOgorCQkJCXsKKwkJCQkJdG1wTGlzdE9mSW5wdXRFRC5hcHBlbmQoIHRtcEVEICk7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQkJPDwgIlVuZXhwZWN0ZWQgRU5ESU5EIEVYRUNVVElPTiBTVEFUVVMgYXMgb3V0RURTIDo+ICIKKwkJCQkJCQk8PCBSdW50aW1lRGVmOjpzdHJBRUVTKCB0bXBFRC0+bUFFRVMgKSA8PCAiICEhISIKKwkJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8vIElSUSBFRFMgdHJhaXRlbWVudAorCQl3aGlsZSggc3RtbnRFTlYuaXJxRURTLm5vbmVtcHR5KCkgKQorCQl7CisJCQlzdG1udEVOVi5pcnFFRFMucG9wX2xhc3RfdG8oIHRtcEVEICk7CisKKwkJCXN3aXRjaCggdG1wRUQtPmdldEFFRVMoKSApCisJCQl7CisJCQkJY2FzZSBBRUVTX1NUTU5UX0JSRUFLOgorCQkJCXsKKwkJCQkJdG1wRUQubXdzZXRBRUVTKCBBRUVTX09LICk7CisKKwkJCQkJRU5WLm91dEVEUy5hcHBlbmQoIHRtcEVEICk7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWNhc2UgQUVFU19TVE1OVF9SRVRVUk46CisJCQkJeworCQkJCQlFTlYuaXJxRURTLmFwcGVuZCggdG1wRUQgKTsKKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQljYXNlIEFFRVNfU1RNTlRfQ09OVElOVUU6CisJCQkJeworCQkJCQl0bXBFRC5td3NldEFFRVMoIEFFRVNfT0sgKTsKKworCQkJCQkvLyBFdmFsdWF0aW9uIG9mIEZPUiBJTkNSRU1FTlQgc3RhdGVtZW50CisJCQkJCXRtcExpc3RPZklucHV0RUQuYXBwZW5kKCB0bXBFRCApOworCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJCTw8ICJVbmV4cGVjdGVkIEVORElORCBFWEVDVVRJT04gU1RBVFVTIGFzIGlycUVEUyA6PiAiCisJCQkJCQkJPDwgUnVudGltZURlZjo6c3RyQUVFUyggdG1wRUQtPm1BRUVTICkgPDwgIiAhISEiCisJCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCQl9CisJCQl9CisJCX0KKworCisJCS8vIFN5bmMgRURTIHRyYWl0ZW1lbnQKKwkJRU5WLnNwbGljZVN5bmNfbXdTdG9yZVBvcyhzdG1udEVOVik7CisJfQorCisJRU5WLnNwbGljZU5vdE91dHB1dChzdG1udEVOVik7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCitib29sIEF2bVByaW1pdGl2ZV9XaGlsZURvOjpyZXN1bWUoRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJcmV0dXJuKCBydW4oIEVOViApICk7Cit9CisKKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV4ZWN1dGlvbiBvZiBhIFdISUxFIHByb2dyYW0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworYm9vbCBBdm1QcmltaXRpdmVfRG9XaGlsZTo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCWNvbnN0IEJGQ29kZSAmIGRvU3RtbnQgPSBFTlYuaW5DT0RFLT5maXJzdCgpLmJmQ29kZSgpOworCWNvbnN0IEJGICYgICAgd2hpbGVDb25kID0gRU5WLmluQ09ERS0+c2Vjb25kKCk7CisKKwlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGEgdG1wTGlzdE9mSW5wdXRFRCggRU5WLmluRUQgKTsKKworCUV4ZWN1dGlvbkVudmlyb25tZW50IHN0bW50RU5WKEVOViwgQkZDb2RlOjpSRUZfTlVMTCk7CisKKwlBUEV4ZWN1dGlvbkRhdGEgdG1wRUQ7CisKKwl3aGlsZSggdG1wTGlzdE9mSW5wdXRFRC5ub25lbXB0eSgpICkKKwl7CisJCS8vIEV2YWx1YXRpb24gb2YgRE9fV0hJTEUgU1RBVEVNRU5UCisJCWlmKCBub3Qgc3RtbnRFTlYucnVuKHRtcExpc3RPZklucHV0RUQsIGRvU3RtbnQpICkKKwkJeworCQkJQVZNX09TX0VYSVQoIEZBSUxFRCApCisJCQkJCTw8ICJGYWlsZWQgdG8gUlVOIERPX1dISUxFPCBTVEFURU1FTlQgPiAhISEiCisJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisKKwkJdG1wTGlzdE9mSW5wdXRFRC5jbGVhcigpOworCisJCS8vIE9VVFBVVCBFRFMgdHJhaXRlbWVudAorCQl3aGlsZSggc3RtbnRFTlYub3V0RURTLm5vbmVtcHR5KCkgKQorCQl7CisJCQlzdG1udEVOVi5vdXRFRFMucG9wX2xhc3RfdG8oIHRtcEVEICk7CisKKwkJCXN3aXRjaCggdG1wRUQtPmdldEFFRVMoKSApCisJCQl7CisJCQkJY2FzZSBBRUVTX1NUTU5UX05PVEhJTkc6CisJCQkJY2FzZSBBRUVTX1NUTU5UX0ZJTkFMOgorCQkJCWNhc2UgQUVFU19TVE1OVF9ERVNUUk9ZOgorCQkJCXsKKwkJCQkJdG1wRUQubXdzZXRBRUVTKCBBRUVTX09LICk7CisKKwkJCQkJLy8hISEgTk8gPDwgYnJlYWsgPj4gZm9yIHRoZXNlIHN0YXRlbWVudAorCQkJCX0KKwkJCQljYXNlIEFFRVNfT0s6CisJCQkJY2FzZSBBRUVTX1NURVBfUkVTVU1FOgorCQkJCXsKKwkJCQkJLy8gRXZhbHVhdGlvbiBvZiBET19XSElMRSBDT05ESVRJT04KKwkJCQkJRXZhbHVhdGlvbkVudmlyb25tZW50IGNvbmRFTlYoRU5WLCB0bXBFRCk7CisJCQkJCWlmKCBub3QgY29uZEVOVi5ldmFsQm9vbGVhbih3aGlsZUNvbmQpICkKKwkJCQkJeworCQkJCQkJQVZNX09TX0VYSVQoIEZBSUxFRCApCisJCQkJCQkJCTw8ICJGYWlsZWQgdG8gRVZBTCBXSElMRV9ETzwgQ09ORElUSU9OID4gISEhIgorCQkJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCQkJfQorCisJCQkJCUVOVi5zcGxpY2VGYWlsdXJlKGNvbmRFTlYpOworCisKKworCQkJCQlpZiggY29uZEVOVi5vdXRWQUwuaXNFcXVhbFRydWUoKSApCisJCQkJCXsKKwkJCQkJCXRtcExpc3RPZklucHV0RUQuYXBwZW5kKCBjb25kRU5WLm91dEVEICk7CisJCQkJCX0KKwkJCQkJZWxzZSBpZiggY29uZEVOVi5vdXRWQUwuaXNFcXVhbEZhbHNlKCkgKQorCQkJCQl7CisJCQkJCQlFTlYub3V0RURTLmFwcGVuZCggdG1wRUQgKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXRtcExpc3RPZklucHV0RUQuY2xlYXIoKTsKKworCQkJCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJCQkJPDwgIlRocm93IHVuZXhwZWN0ZWQgIgorCQkJCQkJCQkiTk9OIENPTkNSRVRFIEJPT0xFQU4gVkFMVUUgRk9SIENPTkRJVElPTiA6ICIKKwkJCQkJCQkJPDwgdG1wRUQtPm1SSUQuc3RyVW5pcUlkKCkKKwkJCQkJCQkJPDwgIiAsIiA8PCBzdHJfaW5kZW50KCBjb25kRU5WLm91dFZBTCApCisJCQkJCQkJCTw8ICIgfD0+IiA8PCB3aGlsZUNvbmQuc3RyKCkgPDwgIiAhISEiCisJCQkJCQkJCTw8IFNFTkRfRVhJVDsKKwkJCQkJfQorCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJCTw8ICJVbmV4cGVjdGVkIEVORElORCBFWEVDVVRJT04gU1RBVFVTIGFzIG91dEVEUyA6PiAiCisJCQkJCQkJPDwgUnVudGltZURlZjo6c3RyQUVFUyggdG1wRUQtPm1BRUVTICkgPDwgIiAhISEiCisJCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBJUlEgRURTIHRyYWl0ZW1lbnQKKwkJd2hpbGUoIHN0bW50RU5WLmlycUVEUy5ub25lbXB0eSgpICkKKwkJeworCQkJc3RtbnRFTlYuaXJxRURTLnBvcF9sYXN0X3RvKCB0bXBFRCApOworCisJCQlzd2l0Y2goIHRtcEVELT5nZXRBRUVTKCkgKQorCQkJeworCQkJCWNhc2UgQUVFU19TVE1OVF9CUkVBSzoKKwkJCQl7CisJCQkJCXRtcEVELm13c2V0QUVFUyggQUVFU19PSyApOworCisJCQkJCUVOVi5vdXRFRFMuYXBwZW5kKCB0bXBFRCApOworCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljYXNlIEFFRVNfU1RNTlRfUkVUVVJOOgorCQkJCXsKKwkJCQkJRU5WLmlycUVEUy5hcHBlbmQoIHRtcEVEICk7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJY2FzZSBBRUVTX1NUTU5UX0NPTlRJTlVFOgorCQkJCXsKKwkJCQkJdG1wRUQubXdzZXRBRUVTKCBBRUVTX09LICk7CisKKwkJCQkJLy8gRXZhbHVhdGlvbiBvZiBET19XSElMRSBDT05ESVRJT04KKwkJCQkJRXZhbHVhdGlvbkVudmlyb25tZW50IGNvbmRFTlYoRU5WLCB0bXBFRCk7CisJCQkJCWlmKCBub3QgY29uZEVOVi5ldmFsQm9vbGVhbih3aGlsZUNvbmQpICkKKwkJCQkJeworCQkJCQkJQVZNX09TX0VYSVQoIEZBSUxFRCApCisJCQkJCQkJCTw8ICJGYWlsZWQgdG8gRVZBTCBXSElMRV9ETzwgQ09ORElUSU9OID4gISEhIgorCQkJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCQkJfQorCisJCQkJCUVOVi5zcGxpY2VGYWlsdXJlKGNvbmRFTlYpOworCisKKwkJCQkJaWYoIGNvbmRFTlYub3V0VkFMLmlzRXF1YWxUcnVlKCkgKQorCQkJCQl7CisJCQkJCQl0bXBMaXN0T2ZJbnB1dEVELmFwcGVuZCggY29uZEVOVi5vdXRFRCApOworCQkJCQl9CisJCQkJCWVsc2UgaWYoIGNvbmRFTlYub3V0VkFMLmlzRXF1YWxGYWxzZSgpICkKKwkJCQkJeworCQkJCQkJRU5WLm91dEVEUy5hcHBlbmQoIHRtcEVEICk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQl0bXBMaXN0T2ZJbnB1dEVELmNsZWFyKCk7CisKKwkJCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQkJCTw8ICJUaHJvdyB1bmV4cGVjdGVkICIKKwkJCQkJCQkJIk5PTiBDT05DUkVURSBCT09MRUFOIFZBTFVFIEZPUiBDT05ESVRJT04gOiAiCisJCQkJCQkJCTw8IHRtcEVELT5tUklELnN0clVuaXFJZCgpCisJCQkJCQkJCTw8ICIgLCIgPDwgc3RyX2luZGVudCggY29uZEVOVi5vdXRWQUwgKQorCQkJCQkJCQk8PCAiIHw9PiIgPDwgd2hpbGVDb25kLnN0cigpIDw8ICIgISEhIgorCQkJCQkJCQk8PCBTRU5EX0VYSVQ7CisJCQkJCX0KKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJCQk8PCAiVW5leHBlY3RlZCBFTkRJTkQgRVhFQ1VUSU9OIFNUQVRVUyBhcyBpcnFFRFMgOj4gIgorCQkJCQkJCTw8IFJ1bnRpbWVEZWY6OnN0ckFFRVMoIHRtcEVELT5tQUVFUyApIDw8ICIgISEhIgorCQkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gU3luYyBFRFMgdHJhaXRlbWVudAorCQlFTlYuc3BsaWNlU3luY19td1N0b3JlUG9zKHN0bW50RU5WKTsKKwl9CisKKwlFTlYuc3BsaWNlTm90T3V0cHV0KHN0bW50RU5WKTsKKworCXJldHVybiggdHJ1ZSApOworfQorCisKK2Jvb2wgQXZtUHJpbWl0aXZlX0RvV2hpbGU6OnJlc3VtZShFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwljb25zdCBCRkNvZGUgJiAgZG9TdG1udCA9IEVOVi5pbkNPREUtPmZpcnN0KCkuYmZDb2RlKCk7CisJY29uc3QgQkYgJiAgICB3aGlsZUNvbmQgPSBFTlYuaW5DT0RFLT5zZWNvbmQoKTsKKworCUxpc3RPZkFQRXhlY3V0aW9uRGF0YSB0bXBMaXN0T2ZJbnB1dEVEKCBFTlYuaW5FRCApOworCisJRXhlY3V0aW9uRW52aXJvbm1lbnQgc3RtbnRFTlYoRU5WLCBCRkNvZGU6OlJFRl9OVUxMKTsKKworCUFQRXhlY3V0aW9uRGF0YSB0bXBFRDsKKworCXdoaWxlKCB0bXBMaXN0T2ZJbnB1dEVELm5vbmVtcHR5KCkgKQorCXsKKwkJdG1wTGlzdE9mSW5wdXRFRC5wb3BfZmlyc3RfdG8oIHRtcEVEICk7CisKKwkJLy8gRXZhbHVhdGlvbiBvZiBXSElMRV9ETyBDT05ESVRJT04KKwkJRXZhbHVhdGlvbkVudmlyb25tZW50IGNvbmRFTlYoRU5WLCB0bXBFRCk7CisJCWlmKCBub3QgY29uZEVOVi5ldmFsQm9vbGVhbih3aGlsZUNvbmQpICkKKwkJeworCQkJQVZNX09TX0VYSVQoIEZBSUxFRCApCisJCQkJCTw8ICJGYWlsZWQgdG8gRVZBTCBXSElMRV9ETzwgQ09ORElUSU9OID4gISEhIgorCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCisJCUVOVi5zcGxpY2VGYWlsdXJlKGNvbmRFTlYpOworCisKKwkJaWYoIGNvbmRFTlYub3V0VkFMLmlzRXF1YWxUcnVlKCkgKQorCQl7CisJCQkvLyBFdmFsdWF0aW9uIG9mIFdISUxFX0RPIFNUQVRFTUVOVAorCQkJaWYoIG5vdCBzdG1udEVOVi5ydW4oY29uZEVOVi5vdXRFRCwgZG9TdG1udCkgKQorCQkJeworCQkJCUFWTV9PU19FWElUKCBGQUlMRUQgKQorCQkJCQkJPDwgIkZhaWxlZCB0byBSVU4gV0hJTEVfRE88IFNUQVRFTUVOVCA+ICEhISIKKwkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmKCBjb25kRU5WLm91dFZBTC5pc0VxdWFsRmFsc2UoKSApCisJCXsKKwkJCUVOVi5vdXRFRFMuYXBwZW5kKCB0bXBFRCApOworCQl9CisJCWVsc2UKKwkJeworCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJPDwgIlRocm93IHVuZXhwZWN0ZWQgIgorCQkJCQkJIk5PTiBDT05DUkVURSBCT09MRUFOIFZBTFVFIEZPUiBDT05ESVRJT04gOiAiCisJCQkJCTw8IHRtcEVELT5tUklELnN0clVuaXFJZCgpCisJCQkJCTw8ICIgLCIgPDwgc3RyX2luZGVudCggY29uZEVOVi5vdXRWQUwgKQorCQkJCQk8PCAiIHw9PiIgPDwgd2hpbGVDb25kLnN0cigpIDw8ICIgISEhIgorCQkJCQk8PCBTRU5EX0VYSVQ7CisJCX0KKworCQkvLyBPVVRQVVQgRURTIHRyYWl0ZW1lbnQKKwkJd2hpbGUoIHN0bW50RU5WLm91dEVEUy5ub25lbXB0eSgpICkKKwkJeworCQkJc3RtbnRFTlYub3V0RURTLnBvcF9sYXN0X3RvKCB0bXBFRCApOworCisJCQlzd2l0Y2goIHRtcEVELT5nZXRBRUVTKCkgKQorCQkJeworCQkJCWNhc2UgQUVFU19TVE1OVF9OT1RISU5HOgorCQkJCWNhc2UgQUVFU19TVE1OVF9GSU5BTDoKKwkJCQljYXNlIEFFRVNfU1RNTlRfREVTVFJPWToKKwkJCQl7CisJCQkJCXRtcEVELm13c2V0QUVFUyggQUVFU19PSyApOworCisJCQkJCXRtcExpc3RPZklucHV0RUQuYXBwZW5kKCB0bXBFRCApOworCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWNhc2UgQUVFU19PSzoKKwkJCQljYXNlIEFFRVNfU1RFUF9SRVNVTUU6CisJCQkJeworCQkJCQl0bXBMaXN0T2ZJbnB1dEVELmFwcGVuZCggdG1wRUQgKTsKKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJCQk8PCAiVW5leHBlY3RlZCBFTkRJTkQgRVhFQ1VUSU9OIFNUQVRVUyBhcyBvdXRFRFMgOj4gIgorCQkJCQkJCTw8IFJ1bnRpbWVEZWY6OnN0ckFFRVMoIHRtcEVELT5tQUVFUyApIDw8ICIgISEhIgorCQkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gSVJRIEVEUyB0cmFpdGVtZW50CisJCXdoaWxlKCBzdG1udEVOVi5pcnFFRFMubm9uZW1wdHkoKSApCisJCXsKKwkJCXN0bW50RU5WLmlycUVEUy5wb3BfbGFzdF90byggdG1wRUQgKTsKKworCQkJc3dpdGNoKCB0bXBFRC0+Z2V0QUVFUygpICkKKwkJCXsKKwkJCQljYXNlIEFFRVNfU1RNTlRfQlJFQUs6CisJCQkJeworCQkJCQl0bXBFRC5td3NldEFFRVMoIEFFRVNfT0sgKTsKKworCQkJCQlFTlYub3V0RURTLmFwcGVuZCggdG1wRUQgKTsKKworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2FzZSBBRUVTX1NUTU5UX1JFVFVSTjoKKwkJCQl7CisJCQkJCUVOVi5pcnFFRFMuYXBwZW5kKCB0bXBFRCApOworCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWNhc2UgQUVFU19TVE1OVF9DT05USU5VRToKKwkJCQl7CisJCQkJCXRtcEVELm13c2V0QUVFUyggQUVFU19PSyApOworCisJCQkJCS8vIEV2YWx1YXRpb24gb2YgRk9SIElOQ1JFTUVOVCBzdGF0ZW1lbnQKKwkJCQkJdG1wTGlzdE9mSW5wdXRFRC5hcHBlbmQoIHRtcEVEICk7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQkJPDwgIlVuZXhwZWN0ZWQgRU5ESU5EIEVYRUNVVElPTiBTVEFUVVMgYXMgaXJxRURTICA6PiAiCisJCQkJCQkJPDwgUnVudGltZURlZjo6c3RyQUVFUyggdG1wRUQtPm1BRUVTICkgPDwgIiAhISEiCisJCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBTeW5jIEVEUyB0cmFpdGVtZW50CisJCUVOVi5zcGxpY2VTeW5jX213U3RvcmVQb3Moc3RtbnRFTlYpOworCX0KKworCUVOVi5zcGxpY2VOb3RPdXRwdXQoc3RtbnRFTlYpOworCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtSXRlcmF0aW9uUHJpbWl0aXZlLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtSXRlcmF0aW9uUHJpbWl0aXZlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ1NGJkZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1JdGVyYXRpb25QcmltaXRpdmUuaApAQCAtMCwwICsxLDQzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjAgbWFpIDIwMTAKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBBVk1JVEVSQVRJT05QUklNSVRJVkVfSF8KKyNkZWZpbmUgQVZNSVRFUkFUSU9OUFJJTUlUSVZFX0hfCisKKyNpbmNsdWRlIDxjb21tb24vQkYuaD4KKyNpbmNsdWRlIDxjb21wdXRlci9wcmltaXRpdmUvQmFzZUF2bVByaW1pdGl2ZS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitBVk1fUFJJTUlUSVZFX1JVTl9SRVNVTUVfQ0xBU1NfSEVBREVSKEZvciwgQmFzZUF2bVByaW1pdGl2ZSkKKwlib29sIHJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOViwgY29uc3QgQkYgJiBpbml0U3RtbnQpOworfTsKKworCitBVk1fUFJJTUlUSVZFX1JVTl9DTEFTUyhGb3JlYWNoLCBCYXNlQXZtUHJpbWl0aXZlKQorCisKK0FWTV9QUklNSVRJVkVfUlVOX1JFU1VNRV9DTEFTUyhXaGlsZURvLCBCYXNlQXZtUHJpbWl0aXZlKQorCisKK0FWTV9QUklNSVRJVkVfUlVOX1JFU1VNRV9DTEFTUyhEb1doaWxlLCBCYXNlQXZtUHJpbWl0aXZlKQorCisKK30KKworI2VuZGlmIC8qIEFWTUlURVJBVElPTlBSSU1JVElWRV9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bUp1bXBQcmltaXRpdmUuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bUp1bXBQcmltaXRpdmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ODBhYjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtSnVtcFByaW1pdGl2ZS5jcHAKQEAgLTAsMCArMSwxNDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyMCBtYWkgMjAxMAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQXZtSnVtcFByaW1pdGl2ZS5oIgorCisjaW5jbHVkZSA8Y29tcHV0ZXIvRXhlY3V0aW9uRGF0YUZhY3RvcnkuaD4KKworI2luY2x1ZGUgPGNvbXB1dGVyL0V2YWx1YXRpb25FbnZpcm9ubWVudC5oPgorI2luY2x1ZGUgPGNvbXB1dGVyL0V4ZWN1dGlvbkVudmlyb25tZW50Lmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9Bdm1Db2RlLmg+CisjaW5jbHVkZSA8Zm1sL2J1aWx0aW4vU3RyaW5nLmg+CisKKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25Db250ZXh0Lmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uRGF0YS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV4ZWN1dGlvbiBvZiBhIEJSRUFLIHByb2dyYW0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworYm9vbCBBdm1QcmltaXRpdmVfQnJlYWs6OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlBUEV4ZWN1dGlvbkRhdGEgb3V0RUQgPSBFTlYuaW5FRDsKKworCUVOVi5hcHBlbmRJcnFfbXdzZXRBRUVTKG91dEVELCBBRUVTX1NUTU5UX0JSRUFLKTsKKworCXJldHVybiggdHJ1ZSApOworfQorCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXhlY3V0aW9uIG9mIGEgQ09OVElOVUUgcHJvZ3JhbQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitib29sIEF2bVByaW1pdGl2ZV9Db250aW51ZTo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCUFQRXhlY3V0aW9uRGF0YSBvdXRFRCA9IEVOVi5pbkVEOworCisJRU5WLmFwcGVuZElycV9td3NldEFFRVMob3V0RUQsIEFFRVNfU1RNTlRfQ09OVElOVUUpOworCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBleGVjdXRpb24gb2YgYSBSRVRVUk4gcHJvZ3JhbQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitib29sIEF2bVByaW1pdGl2ZV9SZXR1cm46OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlpZiggRU5WLmluQ09ERS0+bm9uZW1wdHkoKSApCisJeworCQlFTlYubUFSRy0+b3V0RUQtPm1WQUxVRSA9IEVOVi5tQVJHLT5hdCgwKTsKKworCQlFTlYuYXBwZW5kSXJxX213c2V0QUVFUyhFTlYubUFSRy0+b3V0RUQsIEFFRVNfU1RNTlRfUkVUVVJOKTsKKwl9CisJZWxzZQorCXsKKwkJQVBFeGVjdXRpb25EYXRhIG91dEVEID0gRU5WLmluRUQ7CisKKwkJRU5WLmFwcGVuZElycV9td3NldEFFRVMob3V0RUQsIEFFRVNfU1RNTlRfUkVUVVJOKTsKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV4ZWN1dGlvbiBvZiBhIEVYSVQgcHJvZ3JhbQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitib29sIEF2bVByaW1pdGl2ZV9FeGl0OjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJQVBFeGVjdXRpb25EYXRhIG91dEVEID0gRU5WLmluRUQ7CisKKwlpZiggRU5WLmluQ09ERS0+ZW1wdHkoKSApCisJeworCQlFTlYuYXBwZW5kRXhpdF9td3NldEFFRVMob3V0RUQsIEFFRVNfU1RNTlRfRVhJVCk7CisJfQorCWVsc2UKKwl7CisJCUVOVi5hcHBlbmRFeGl0X213c2V0QUVFUyhvdXRFRCwgQUVFU19TVE1OVF9FWElUX0FMTCk7CisKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV4ZWN1dGlvbiBvZiBhIFRSQUNFIFNURVAgcHJvZ3JhbQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitib29sIEF2bVByaW1pdGl2ZV9TdGVwTWFyazo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCUFQRXhlY3V0aW9uRGF0YSBvdXRFRCA9IEVOVi5pbkVEOworCisJaWYoIEVOVi5pbkNPREUtPm5vbmVtcHR5KCkgKQorCXsKKwkJaWYoIEVOVi5pbkNPREUtPmZpcnN0KCkuaXNCdWlsdGluU3RyaW5nKCkgKQorCQl7CisJCQlFeGVjdXRpb25EYXRhRmFjdG9yeTo6YXBwZW5kSU9FbGVtZW50VHJhY2Uob3V0RUQsIEVOVi5pbkNPREUtPmZpcnN0KCkpOworCQl9CisJCWVsc2UKKwkJeworCQkJRXhlY3V0aW9uRGF0YUZhY3Rvcnk6OmFwcGVuZElPRWxlbWVudFRyYWNlKG91dEVELAorCQkJCQlCRiggbmV3IFN0cmluZyggRU5WLmluQ09ERS0+Zmlyc3QoKS5zdHIoKSApKSApOworCQl9CisJfQorCisJRU5WLmFwcGVuZFN5bmNfbXdzZXRBRUVTKG91dEVELCBBRUVTX1NURVBfTUFSSyk7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1KdW1wUHJpbWl0aXZlLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtSnVtcFByaW1pdGl2ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NTBjNzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtSnVtcFByaW1pdGl2ZS5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyMCBtYWkgMjAxMAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEFWTUpVTVBQUklNSVRJVkVfSF8KKyNkZWZpbmUgQVZNSlVNUFBSSU1JVElWRV9IXworCisjaW5jbHVkZSA8Y29tcHV0ZXIvcHJpbWl0aXZlL0Jhc2VBdm1QcmltaXRpdmUuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKK0FWTV9QUklNSVRJVkVfUlVOX0NMQVNTKEJyZWFrLCBCYXNlQXZtUHJpbWl0aXZlKQorCitBVk1fUFJJTUlUSVZFX1JVTl9DTEFTUyhDb250aW51ZSwgQmFzZUF2bVByaW1pdGl2ZSkKKworQVZNX1BSSU1JVElWRV9SVU5fQ0xBU1MoUmV0dXJuLCBCYXNlQXZtUHJpbWl0aXZlKQorCitBVk1fUFJJTUlUSVZFX1JVTl9DTEFTUyhFeGl0LCBCYXNlQXZtUHJpbWl0aXZlKQorCisKK0FWTV9QUklNSVRJVkVfUlVOX0NMQVNTKFN0ZXBNYXJrLCBCYXNlQXZtUHJpbWl0aXZlKQorCisKKworfQorCisjZW5kaWYgLyogQVZNSlVNUFBSSU1JVElWRV9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bUxvb2t1cFByaW1pdGl2ZS5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtTG9va3VwUHJpbWl0aXZlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmNkNWM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bUxvb2t1cFByaW1pdGl2ZS5jcHAKQEAgLTAsMCArMSw2MzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAzIGp1aW4gMjAxMAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQXZtTG9va3VwUHJpbWl0aXZlLmgiCisKKyNpbmNsdWRlIDxjb21wdXRlci9FdmFsdWF0aW9uRW52aXJvbm1lbnQuaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0F2bUNvZGUuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9CdWlsdGluQXJyYXkuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29uc3RydWN0b3IuaD4KKyNpbmNsdWRlIDxmbWwvbnVtZXJpYy9GbG9hdC5oPgorI2luY2x1ZGUgPGZtbC9udW1lcmljL0ludGVnZXIuaD4KKworI2luY2x1ZGUgPGZtbC90eXBlL1R5cGVNYW5hZ2VyLmg+CisKKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLyBMT09LVVAgTUFDUk8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjZGVmaW5lIGxpbmVhckludGVycG9sYXRpb24xRCh4LCB4YSwgeGIsIHlhLCB5YikgCVwKKwkoIHlhICsgKCB4IC0geGEgKSAqICh5YiAtIHlhKSAvICh4YiAtIHhhKSApCisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vIExPT0tVUCBJbnQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitkb3VibGUgQXZtUHJpbWl0aXZlX0xvb2t1cF9JbnQ6Omxvb2t1cChkb3VibGUgYW5JbnB1dCwKKwkJQXJyYXlGbG9hdCAqIGFuSW5wdXRUYWJsZSwgQXJyYXlGbG9hdCAqIGFuT3V0cHV0VGFibGUpCit7CisJYXZtX29mZnNldF90IGluZGV4ID0gMDsKKworCWZvciggOyBpbmRleCA8IGFuSW5wdXRUYWJsZS0+c2l6ZSgpIDsgKytpbmRleCApCisJeworCQlpZiggYW5JbnB1dFRhYmxlLT5nZXQoaW5kZXgpID49IGFuSW5wdXQgKQorCQl7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmKCBpbmRleCA9PSBhbklucHV0VGFibGUtPnNpemUoKSApCisJeworCQlyZXR1cm4gYW5PdXRwdXRUYWJsZS0+Z2V0KGluZGV4LTEpOworCX0KKwllbHNlIGlmKCBpbmRleCA9PSAwICkKKwl7CisJCXJldHVybiBhbk91dHB1dFRhYmxlLT5nZXQoMCk7CisJfQorCWVsc2UgaWYoIGFuSW5wdXQgPT0gYW5JbnB1dFRhYmxlLT5nZXQoaW5kZXgpICkKKwl7CisJCXJldHVybiBhbk91dHB1dFRhYmxlLT5nZXQoaW5kZXgpOworCX0KKwllbHNlCisJeworCQlyZXR1cm4gbGluZWFySW50ZXJwb2xhdGlvbjFEKGFuSW5wdXQsIGFuSW5wdXRUYWJsZS0+Z2V0KGluZGV4LTEpLAorCQkJCWFuSW5wdXRUYWJsZS0+Z2V0KGluZGV4KSwgYW5PdXRwdXRUYWJsZS0+Z2V0KGluZGV4LTEpLAorCQkJCWFuT3V0cHV0VGFibGUtPmdldChpbmRleCkpOworCX0KK30KKworCitib29sIEF2bVByaW1pdGl2ZV9Mb29rdXBfSW50OjpzZXZhbChFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJQkYgaW5wdXRWYWx1ZSA9IEVOVi5tQVJHLT5hdCgwKTsKKworCWNvbnN0IEJGICYgaW5wdXRUYWJsZSA9IEVOVi5tQVJHLT5hdCgxKTsKKwljb25zdCBCRiAmIG91dHB1dFRhYmxlID0gRU5WLm1BUkctPmF0KDIpOworCisJLy8gQ0FTRSBvZiBOVU1FUklDIFZBTFVFCisJaWYoIGlucHV0VmFsdWUuaXNJbnRlZ2VyKCkgKQorCXsKKwkJRU5WLm91dFZBTCA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3RXhwcigKKwkJCQlsb29rdXAoaW5wdXRWYWx1ZS50b0ludGVnZXIoKSwKKwkJCQkJCWlucHV0VGFibGUudG9fcHRyPCBBcnJheUZsb2F0ID4oKSwKKwkJCQkJCW91dHB1dFRhYmxlLnRvX3B0cjwgQXJyYXlGbG9hdCA+KCkpICk7CisJfQorCWVsc2UgaWYoIGlucHV0VmFsdWUuaXNGbG9hdCgpICkKKwl7CisJCUVOVi5vdXRWQUwgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0V4cHIoCisJCQkJbG9va3VwKGlucHV0VmFsdWUudG9GbG9hdCgpLAorCQkJCQkJaW5wdXRUYWJsZS50b19wdHI8IEFycmF5RmxvYXQgPigpLAorCQkJCQkJb3V0cHV0VGFibGUudG9fcHRyPCBBcnJheUZsb2F0ID4oKSkgKTsKKwl9CisJLy8gQ0FTRSBvZiBTWU1CT0xJQyBWQUxVRQorCWVsc2UgaWYoIGlucHV0VmFsdWUuaXM8IEluc3RhbmNlT2ZEYXRhID4oKSApCisJeworCQlFTlYub3V0VkFMID0gRU5WLmNyZWF0ZShFTlYub3V0RUQtPm1SSUQsCisJCQkJImxvb2t1cEludCIsIFR5cGVNYW5hZ2VyOjpGTE9BVCwKKwkJCQlFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NvZGUoRU5WLmluQ09ERS0+Z2V0T3BlcmF0b3IoKSwKKwkJCQkJCWlucHV0VmFsdWUsIGlucHV0VGFibGUsIG91dHB1dFRhYmxlKSk7CisJfQorCS8vIENBU0Ugb2YgU1lNQk9MSUMgRVhQUkVTU0lPTgorCWVsc2UKKwl7CisJCUVOVi5vdXRWQUwgPSBFTlYuY3JlYXRlKEVOVi5vdXRFRC0+bVJJRCwKKwkJCQkibG9va3VwSW50IiwgVHlwZU1hbmFnZXI6OkZMT0FULAorCQkJCUV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q29kZShFTlYuaW5DT0RFLT5nZXRPcGVyYXRvcigpLAorCQkJCQkJaW5wdXRWYWx1ZSwgaW5wdXRUYWJsZSwgb3V0cHV0VGFibGUpKTsKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gTE9PS1VQIEludEV4dAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2RvdWJsZSBBdm1QcmltaXRpdmVfTG9va3VwX0ludEV4dDo6bG9va3VwKGRvdWJsZSBhbklucHV0LAorCQlBcnJheUZsb2F0ICogYW5JbnB1dFRhYmxlLCBBcnJheUZsb2F0ICogYW5PdXRwdXRUYWJsZSkKK3sKKwlhdm1fb2Zmc2V0X3QgaW5kZXggPSAwOworCisJZm9yKCA7IGluZGV4IDwgYW5JbnB1dFRhYmxlLT5zaXplKCkgOyArK2luZGV4ICkKKwl7CisJCWlmKCBhbklucHV0VGFibGUtPmdldChpbmRleCkgPj0gYW5JbnB1dCApCisJCXsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYoIGluZGV4ID09IGFuSW5wdXRUYWJsZS0+c2l6ZSgpICkKKwl7CisJCXJldHVybiBsaW5lYXJJbnRlcnBvbGF0aW9uMUQoYW5JbnB1dCwgYW5JbnB1dFRhYmxlLT5nZXQoaW5kZXgtMiksCisJCQkJYW5JbnB1dFRhYmxlLT5nZXQoaW5kZXgtMSksIGFuT3V0cHV0VGFibGUtPmdldChpbmRleC0yKSwKKwkJCQlhbk91dHB1dFRhYmxlLT5nZXQoaW5kZXgtMSkpOworCX0KKwllbHNlIGlmKCBhbklucHV0ID09IGFuSW5wdXRUYWJsZS0+Z2V0KGluZGV4KSApCisJeworCQlyZXR1cm4gYW5PdXRwdXRUYWJsZS0+Z2V0KGluZGV4KTsKKwl9CisJZWxzZSBpZiggaW5kZXggPT0gMCApCisJeworCQlyZXR1cm4gbGluZWFySW50ZXJwb2xhdGlvbjFEKGFuSW5wdXQsIGFuSW5wdXRUYWJsZS0+Z2V0KDApLAorCQkJCWFuSW5wdXRUYWJsZS0+Z2V0KDEpLCBhbk91dHB1dFRhYmxlLT5nZXQoMCksCisJCQkJYW5PdXRwdXRUYWJsZS0+Z2V0KDEpKTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuIGxpbmVhckludGVycG9sYXRpb24xRChhbklucHV0LCBhbklucHV0VGFibGUtPmdldChpbmRleC0xKSwKKwkJCQlhbklucHV0VGFibGUtPmdldChpbmRleCksIGFuT3V0cHV0VGFibGUtPmdldChpbmRleC0xKSwKKwkJCQlhbk91dHB1dFRhYmxlLT5nZXQoaW5kZXgpKTsKKwl9Cit9CisKKworYm9vbCBBdm1QcmltaXRpdmVfTG9va3VwX0ludEV4dDo6c2V2YWwoRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCUJGIGlucHV0VmFsdWUgPSBFTlYubUFSRy0+YXQoMCk7CisKKwljb25zdCBCRiAmIGlucHV0VGFibGUgPSBFTlYubUFSRy0+YXQoMSk7CisJY29uc3QgQkYgJiBvdXRwdXRUYWJsZSA9IEVOVi5tQVJHLT5hdCgyKTsKKworCS8vIENBU0Ugb2YgTlVNRVJJQyBWQUxVRQorCWlmKCBpbnB1dFZhbHVlLmlzSW50ZWdlcigpICkKKwl7CisJCUVOVi5vdXRWQUwgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0V4cHIoCisJCQkJbG9va3VwKGlucHV0VmFsdWUudG9JbnRlZ2VyKCksCisJCQkJCQlpbnB1dFRhYmxlLnRvX3B0cjwgQXJyYXlGbG9hdCA+KCksCisJCQkJCQlvdXRwdXRUYWJsZS50b19wdHI8IEFycmF5RmxvYXQgPigpKSApOworCX0KKwllbHNlIGlmKCBpbnB1dFZhbHVlLmlzRmxvYXQoKSApCisJeworCQlFTlYub3V0VkFMID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdFeHByKAorCQkJCWxvb2t1cChpbnB1dFZhbHVlLnRvRmxvYXQoKSwKKwkJCQkJCWlucHV0VGFibGUudG9fcHRyPCBBcnJheUZsb2F0ID4oKSwKKwkJCQkJCW91dHB1dFRhYmxlLnRvX3B0cjwgQXJyYXlGbG9hdCA+KCkpICk7CisJfQorCS8vIENBU0Ugb2YgU1lNQk9MSUMgVkFMVUUKKwllbHNlIGlmKCBpbnB1dFZhbHVlLmlzPCBJbnN0YW5jZU9mRGF0YSA+KCkgKQorCXsKKwkJRU5WLm91dFZBTCA9IEVOVi5jcmVhdGUoRU5WLm91dEVELT5tUklELAorCQkJCSJsb29rdXBJbnRFeHQiLCBUeXBlTWFuYWdlcjo6RkxPQVQsCisJCQkJRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlKEVOVi5pbkNPREUtPmdldE9wZXJhdG9yKCksCisJCQkJCQlpbnB1dFZhbHVlLCBpbnB1dFRhYmxlLCBvdXRwdXRUYWJsZSkpOworCX0KKwkvLyBDQVNFIG9mIFNZTUJPTElDIEVYUFJFU1NJT04KKwllbHNlCisJeworCQlFTlYub3V0VkFMID0gRU5WLmNyZWF0ZShFTlYub3V0RUQtPm1SSUQsCisJCQkJImxvb2t1cEludEV4dCIsIFR5cGVNYW5hZ2VyOjpGTE9BVCwKKwkJCQlFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NvZGUoRU5WLmluQ09ERS0+Z2V0T3BlcmF0b3IoKSwKKwkJCQkJCWlucHV0VmFsdWUsIGlucHV0VGFibGUsIG91dHB1dFRhYmxlKSk7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vIExPT0tVUCBOZWFyZXN0CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworZG91YmxlIEF2bVByaW1pdGl2ZV9Mb29rdXBfTmVhcmVzdDo6bG9va3VwKGRvdWJsZSBhbklucHV0LAorCQlBcnJheUZsb2F0ICogYW5JbnB1dFRhYmxlLCBBcnJheUZsb2F0ICogYW5PdXRwdXRUYWJsZSkKK3sKKwlhdm1fb2Zmc2V0X3QgaW5kZXggPSAwOworCisJZm9yKCA7IGluZGV4IDwgYW5JbnB1dFRhYmxlLT5zaXplKCkgOyArK2luZGV4ICkKKwl7CisJCWlmKCBhbklucHV0VGFibGUtPmdldChpbmRleCkgPj0gYW5JbnB1dCApCisJCXsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYoIGluZGV4ID09IGFuSW5wdXRUYWJsZS0+c2l6ZSgpICkKKwl7CisJCWluZGV4ID0gaW5kZXggLSAxOworCX0KKwllbHNlIGlmKCBpbmRleCA+IDAgKQorCXsKKwkJaWYoIChhbklucHV0IC0gYW5JbnB1dFRhYmxlLT5nZXQoaW5kZXggLSAxKSkgPAorCQkJCShhbklucHV0VGFibGUtPmdldChpbmRleCkgLSBhbklucHV0KSApCisJCXsKKwkJCWluZGV4ID0gaW5kZXggLSAxOworCQl9CisJfQorCisJcmV0dXJuKCBhbk91dHB1dFRhYmxlLT5nZXQoaW5kZXgpICk7Cit9CisKKworYm9vbCBBdm1QcmltaXRpdmVfTG9va3VwX05lYXJlc3Q6OnNldmFsKEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlCRiBpbnB1dFZhbHVlID0gRU5WLm1BUkctPmF0KDApOworCisJY29uc3QgQkYgJiBpbnB1dFRhYmxlID0gRU5WLm1BUkctPmF0KDEpOworCWNvbnN0IEJGICYgb3V0cHV0VGFibGUgPSBFTlYubUFSRy0+YXQoMik7CisKKwkvLyBDQVNFIG9mIE5VTUVSSUMgVkFMVUUKKwlpZiggaW5wdXRWYWx1ZS5pc0ludGVnZXIoKSApCisJeworCQlFTlYub3V0VkFMID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdFeHByKAorCQkJCWxvb2t1cChpbnB1dFZhbHVlLnRvSW50ZWdlcigpLAorCQkJCQkJaW5wdXRUYWJsZS50b19wdHI8IEFycmF5RmxvYXQgPigpLAorCQkJCQkJb3V0cHV0VGFibGUudG9fcHRyPCBBcnJheUZsb2F0ID4oKSkgKTsKKwl9CisJZWxzZSBpZiggaW5wdXRWYWx1ZS5pc0Zsb2F0KCkgKQorCXsKKwkJRU5WLm91dFZBTCA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3RXhwcigKKwkJCQlsb29rdXAoaW5wdXRWYWx1ZS50b0Zsb2F0KCksCisJCQkJCQlpbnB1dFRhYmxlLnRvX3B0cjwgQXJyYXlGbG9hdCA+KCksCisJCQkJCQlvdXRwdXRUYWJsZS50b19wdHI8IEFycmF5RmxvYXQgPigpKSApOworCX0KKwkvLyBDQVNFIG9mIFNZTUJPTElDIFZBTFVFCisJZWxzZSBpZiggaW5wdXRWYWx1ZS5pczwgSW5zdGFuY2VPZkRhdGEgPigpICkKKwl7CisJCUVOVi5vdXRWQUwgPSBFTlYuY3JlYXRlKEVOVi5vdXRFRC0+bVJJRCwKKwkJCQkibG9va3VwTmVhcmVzdCIsIFR5cGVNYW5hZ2VyOjpGTE9BVCwKKwkJCQlFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NvZGUoRU5WLmluQ09ERS0+Z2V0T3BlcmF0b3IoKSwKKwkJCQkJCWlucHV0VmFsdWUsIGlucHV0VGFibGUsIG91dHB1dFRhYmxlKSk7CisJfQorCS8vIENBU0Ugb2YgU1lNQk9MSUMgRVhQUkVTU0lPTgorCWVsc2UKKwl7CisJCUVOVi5vdXRWQUwgPSBFTlYuY3JlYXRlKEVOVi5vdXRFRC0+bVJJRCwKKwkJCQkibG9va3VwTmVhcmVzdCIsIFR5cGVNYW5hZ2VyOjpGTE9BVCwKKwkJCQlFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NvZGUoRU5WLmluQ09ERS0+Z2V0T3BlcmF0b3IoKSwKKwkJCQkJCWlucHV0VmFsdWUsIGlucHV0VGFibGUsIG91dHB1dFRhYmxlKSk7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vIExPT0tVUCBCZWxvdworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2RvdWJsZSBBdm1QcmltaXRpdmVfTG9va3VwX0JlbG93Ojpsb29rdXAoZG91YmxlIGFuSW5wdXQsCisJCUFycmF5RmxvYXQgKiBhbklucHV0VGFibGUsIEFycmF5RmxvYXQgKiBhbk91dHB1dFRhYmxlKQoreworCWF2bV9vZmZzZXRfdCBpbmRleCA9IDA7CisKKwlmb3IoIDsgaW5kZXggPCBhbklucHV0VGFibGUtPnNpemUoKSA7ICsraW5kZXggKQorCXsKKwkJaWYoIGFuSW5wdXRUYWJsZS0+Z2V0KGluZGV4KSA+PSBhbklucHV0ICkKKwkJeworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiggKGluZGV4ID4gMCkgJiYgKGFuSW5wdXRUYWJsZS0+Z2V0KGluZGV4KSAhPSBhbklucHV0KSkKKwl7CisJCWluZGV4ID0gaW5kZXggLSAxOworCX0KKworCXJldHVybiggYW5PdXRwdXRUYWJsZS0+Z2V0KGluZGV4KSApOworfQorCisKK2Jvb2wgQXZtUHJpbWl0aXZlX0xvb2t1cF9CZWxvdzo6c2V2YWwoRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCUJGIGlucHV0VmFsdWUgPSBFTlYubUFSRy0+YXQoMCk7CisKKwljb25zdCBCRiAmIGlucHV0VGFibGUgPSBFTlYubUFSRy0+YXQoMSk7CisJY29uc3QgQkYgJiBvdXRwdXRUYWJsZSA9IEVOVi5tQVJHLT5hdCgyKTsKKworCS8vIENBU0Ugb2YgTlVNRVJJQyBWQUxVRQorCWlmKCBpbnB1dFZhbHVlLmlzSW50ZWdlcigpICkKKwl7CisJCUVOVi5vdXRWQUwgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0V4cHIoCisJCQkJbG9va3VwKGlucHV0VmFsdWUudG9JbnRlZ2VyKCksCisJCQkJCQlpbnB1dFRhYmxlLnRvX3B0cjwgQXJyYXlGbG9hdCA+KCksCisJCQkJCQlvdXRwdXRUYWJsZS50b19wdHI8IEFycmF5RmxvYXQgPigpKSApOworCX0KKwllbHNlIGlmKCBpbnB1dFZhbHVlLmlzRmxvYXQoKSApCisJeworCQlFTlYub3V0VkFMID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdFeHByKAorCQkJCWxvb2t1cChpbnB1dFZhbHVlLnRvRmxvYXQoKSwKKwkJCQkJCWlucHV0VGFibGUudG9fcHRyPCBBcnJheUZsb2F0ID4oKSwKKwkJCQkJCW91dHB1dFRhYmxlLnRvX3B0cjwgQXJyYXlGbG9hdCA+KCkpICk7CisJfQorCS8vIENBU0Ugb2YgU1lNQk9MSUMgVkFMVUUKKwllbHNlIGlmKCBpbnB1dFZhbHVlLmlzPCBJbnN0YW5jZU9mRGF0YSA+KCkgKQorCXsKKwkJRU5WLm91dFZBTCA9IEVOVi5jcmVhdGUoRU5WLm91dEVELT5tUklELAorCQkJCSJsb29rdXBCZWxvdyIsIFR5cGVNYW5hZ2VyOjpGTE9BVCwKKwkJCQlFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NvZGUoRU5WLmluQ09ERS0+Z2V0T3BlcmF0b3IoKSwKKwkJCQkJCWlucHV0VmFsdWUsIGlucHV0VGFibGUsIG91dHB1dFRhYmxlKSk7CisJfQorCS8vIENBU0Ugb2YgU1lNQk9MSUMgRVhQUkVTU0lPTgorCWVsc2UKKwl7CisJCUVOVi5vdXRWQUwgPSBFTlYuY3JlYXRlKEVOVi5vdXRFRC0+bVJJRCwKKwkJCQkibG9va3VwQmVsb3ciLCBUeXBlTWFuYWdlcjo6RkxPQVQsCisJCQkJRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlKEVOVi5pbkNPREUtPmdldE9wZXJhdG9yKCksCisJCQkJCQlpbnB1dFZhbHVlLCBpbnB1dFRhYmxlLCBvdXRwdXRUYWJsZSkpOworCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLyBMT09LVVAgQWJvdmUKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitkb3VibGUgQXZtUHJpbWl0aXZlX0xvb2t1cF9BYm92ZTo6bG9va3VwKGRvdWJsZSBhbklucHV0LAorCQlBcnJheUZsb2F0ICogYW5JbnB1dFRhYmxlLCBBcnJheUZsb2F0ICogYW5PdXRwdXRUYWJsZSkKK3sKKwlhdm1fb2Zmc2V0X3QgaW5kZXggPSAwOworCisJZm9yKCA7IGluZGV4IDwgYW5JbnB1dFRhYmxlLT5zaXplKCkgOyArK2luZGV4ICkKKwl7CisJCWlmKCBhbklucHV0VGFibGUtPmdldChpbmRleCkgPj0gYW5JbnB1dCApCisJCXsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYoIChpbmRleCA9PSBhbklucHV0VGFibGUtPnNpemUoKSkgJiYKKwkJCShhbklucHV0VGFibGUtPmdldChpbmRleCkgIT0gYW5JbnB1dCkpCisJeworCQlpbmRleCA9IGluZGV4IC0gMTsKKwl9CisKKwlyZXR1cm4oIGFuT3V0cHV0VGFibGUtPmdldChpbmRleCkgKTsKK30KKworCitib29sIEF2bVByaW1pdGl2ZV9Mb29rdXBfQWJvdmU6OnNldmFsKEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlCRiBpbnB1dFZhbHVlID0gRU5WLm1BUkctPmF0KDApOworCisJY29uc3QgQkYgJiBpbnB1dFRhYmxlID0gRU5WLm1BUkctPmF0KDEpOworCWNvbnN0IEJGICYgb3V0cHV0VGFibGUgPSBFTlYubUFSRy0+YXQoMik7CisKKwkvLyBDQVNFIG9mIE5VTUVSSUMgVkFMVUUKKwlpZiggaW5wdXRWYWx1ZS5pc0ludGVnZXIoKSApCisJeworCQlFTlYub3V0VkFMID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdFeHByKAorCQkJCWxvb2t1cChpbnB1dFZhbHVlLnRvSW50ZWdlcigpLAorCQkJCQkJaW5wdXRUYWJsZS50b19wdHI8IEFycmF5RmxvYXQgPigpLAorCQkJCQkJb3V0cHV0VGFibGUudG9fcHRyPCBBcnJheUZsb2F0ID4oKSkgKTsKKwl9CisJZWxzZSBpZiggaW5wdXRWYWx1ZS5pc0Zsb2F0KCkgKQorCXsKKwkJRU5WLm91dFZBTCA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3RXhwcigKKwkJCQlsb29rdXAoaW5wdXRWYWx1ZS50b0Zsb2F0KCksCisJCQkJCQlpbnB1dFRhYmxlLnRvX3B0cjwgQXJyYXlGbG9hdCA+KCksCisJCQkJCQlvdXRwdXRUYWJsZS50b19wdHI8IEFycmF5RmxvYXQgPigpKSApOworCX0KKwkvLyBDQVNFIG9mIFNZTUJPTElDIFZBTFVFCisJZWxzZSBpZiggaW5wdXRWYWx1ZS5pczwgSW5zdGFuY2VPZkRhdGEgPigpICkKKwl7CisJCUVOVi5vdXRWQUwgPSBFTlYuY3JlYXRlKEVOVi5vdXRFRC0+bVJJRCwKKwkJCQkibG9va3VwQWJvdmUiLCBUeXBlTWFuYWdlcjo6RkxPQVQsCisJCQkJRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlKEVOVi5pbkNPREUtPmdldE9wZXJhdG9yKCksCisJCQkJCQlpbnB1dFZhbHVlLCBpbnB1dFRhYmxlLCBvdXRwdXRUYWJsZSkpOworCX0KKwkvLyBDQVNFIG9mIFNZTUJPTElDIEVYUFJFU1NJT04KKwllbHNlCisJeworCQlFTlYub3V0VkFMID0gRU5WLmNyZWF0ZShFTlYub3V0RUQtPm1SSUQsCisJCQkJImxvb2t1cEFib3ZlIiwgVHlwZU1hbmFnZXI6OkZMT0FULAorCQkJCUV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q29kZShFTlYuaW5DT0RFLT5nZXRPcGVyYXRvcigpLAorCQkJCQkJaW5wdXRWYWx1ZSwgaW5wdXRUYWJsZSwgb3V0cHV0VGFibGUpKTsKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gTE9PS1VQMkQgSW50RXh0CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworZG91YmxlIEF2bVByaW1pdGl2ZV9Mb29rdXAyRF9JbnRFeHQ6Omxvb2t1cDJEKAorCQlkb3VibGUgYW5JbnB1dDEsIGRvdWJsZSBhbklucHV0MiwKKwkJQXJyYXlGbG9hdCAqIGFuSW5wdXRUYWJsZTEsIEFycmF5RmxvYXQgKiBhbklucHV0VGFibGUyLAorCQlBcnJheUJGICogYW5PdXRwdXRUYWJsZSkKK3sKKwkvLyBSZWNoZXJjaGUgaWMxIGV0IGljMiAoaW5kZXggZGVzIGNvbG9ubmVzIMOgIGNvbnNpZMOpcmVyKQorCWF2bV9vZmZzZXRfdCBpbmRleCA9IDA7CisJZm9yKCA7IGluZGV4IDwgYW5JbnB1dFRhYmxlMi0+c2l6ZSgpIDsgKytpbmRleCApCisJeworCQlpZiggYW5JbnB1dFRhYmxlMi0+Z2V0KGluZGV4KSA+PSBhbklucHV0MiApCisJCXsKKwkJCWJyZWFrOworCQl9CisJfQorCisJYXZtX29mZnNldF90IGlsMTsKKwlhdm1fb2Zmc2V0X3QgaWwyOworCWF2bV9vZmZzZXRfdCBpYzE7CisJYXZtX29mZnNldF90IGljMjsKKworCWlmKCBpbmRleCA9PSBhbklucHV0VGFibGUyLT5zaXplKCkgKQorCXsKKwkJaWMxID0gaW5kZXgtMjsKKwkJaWMyID0gaW5kZXgtMTsKKwl9CisJZWxzZSBpZiggYW5JbnB1dDIgPT0gYW5JbnB1dFRhYmxlMi0+Z2V0KGluZGV4KSApCisJeworCQlpYzEgPSBpbmRleDsKKwkJaWMyID0gaW5kZXg7CisJfQorCWVsc2UgaWYoIGluZGV4ID09IDAgKQorCXsKKwkJaWMxID0gMDsKKwkJaWMyID0gMTsKKwl9CisJZWxzZQorCXsKKwkJaWMxID0gaW5kZXgtMTsKKwkJaWMyID0gaW5kZXg7CisJfQorCisJLy8gSW50ZXJwb2xhdGlvbiBsaW7DqWFpcmUgZGUgYW5JbnB1dDEgc3VyIGlsMSBwdWlzIHN1ciBpbDIKKwlpbmRleCA9IDA7CisJZm9yKCA7IGluZGV4IDwgYW5JbnB1dFRhYmxlMS0+c2l6ZSgpIDsgKytpbmRleCApCisJeworCQlpZiggYW5JbnB1dFRhYmxlMS0+Z2V0KGluZGV4KSA+PSBhbklucHV0MSApCisJCXsKKwkJCWJyZWFrOworCQl9CisJfQorCisJZG91YmxlIGludGVybWVkaWF0ZVJlc3VsdDE7CisJZG91YmxlIGludGVybWVkaWF0ZVJlc3VsdDI7CisJaWYoIGluZGV4ID09IGFuSW5wdXRUYWJsZTEtPnNpemUoKSApCisJeworCQlpbDEgPSBpbmRleCAtIDI7CisJCWlsMiA9IGluZGV4IC0gMTsKKworCQlpbnRlcm1lZGlhdGVSZXN1bHQxID0gbGluZWFySW50ZXJwb2xhdGlvbjFEKGFuSW5wdXQxLAorCQkJCWFuSW5wdXRUYWJsZTEtPmdldChpbDEpLGFuSW5wdXRUYWJsZTEtPmdldChpbDIpLAorCQkJCWFuT3V0cHV0VGFibGUtPmF0KGlsMSkudG9fcHRyPCBBcnJheUZsb2F0ID4oKS0+Z2V0KGljMSksCisJCQkJYW5PdXRwdXRUYWJsZS0+YXQoaWwxKS50b19wdHI8IEFycmF5RmxvYXQgPigpLT5nZXQoaWMyKSk7CisKKwkJaW50ZXJtZWRpYXRlUmVzdWx0MiA9IGxpbmVhckludGVycG9sYXRpb24xRChhbklucHV0MSwKKwkJCQlhbklucHV0VGFibGUxLT5nZXQoaWwxKSxhbklucHV0VGFibGUxLT5nZXQoaWwyKSwKKwkJCQlhbk91dHB1dFRhYmxlLT5hdChpbDIpLnRvX3B0cjwgQXJyYXlGbG9hdCA+KCktPmdldChpYzEpLAorCQkJCWFuT3V0cHV0VGFibGUtPmF0KGlsMikudG9fcHRyPCBBcnJheUZsb2F0ID4oKS0+Z2V0KGljMikpOworCX0KKwllbHNlIGlmKCBhbklucHV0MSA9PSBhbklucHV0VGFibGUxLT5nZXQoaW5kZXgpICkKKwl7CisJCWludGVybWVkaWF0ZVJlc3VsdDEgPQorCQkJCWFuT3V0cHV0VGFibGUtPmF0KGluZGV4KS50b19wdHI8IEFycmF5RmxvYXQgPigpLT5nZXQoaWMxKTsKKworCQlpbnRlcm1lZGlhdGVSZXN1bHQyID0KKwkJCQlhbk91dHB1dFRhYmxlLT5hdChpbmRleCkudG9fcHRyPCBBcnJheUZsb2F0ID4oKS0+Z2V0KGljMik7CisJfQorCWVsc2UgaWYoIGluZGV4ID09IDAgKQorCXsKKwkJaW50ZXJtZWRpYXRlUmVzdWx0MSA9IGxpbmVhckludGVycG9sYXRpb24xRChhbklucHV0MSwKKwkJCQlhbklucHV0VGFibGUxLT5nZXQoMCksYW5JbnB1dFRhYmxlMS0+Z2V0KDEpLAorCQkJCWFuT3V0cHV0VGFibGUtPmF0KDApLnRvX3B0cjwgQXJyYXlGbG9hdCA+KCktPmdldChpYzEpLAorCQkJCWFuT3V0cHV0VGFibGUtPmF0KDEpLnRvX3B0cjwgQXJyYXlGbG9hdCA+KCktPmdldChpYzEpKTsKKworCQlpbnRlcm1lZGlhdGVSZXN1bHQyID0gbGluZWFySW50ZXJwb2xhdGlvbjFEKGFuSW5wdXQxLAorCQkJCWFuSW5wdXRUYWJsZTEtPmdldCgwKSxhbklucHV0VGFibGUxLT5nZXQoMSksCisJCQkJYW5PdXRwdXRUYWJsZS0+YXQoMCkudG9fcHRyPCBBcnJheUZsb2F0ID4oKS0+Z2V0KGljMiksCisJCQkJYW5PdXRwdXRUYWJsZS0+YXQoMSkudG9fcHRyPCBBcnJheUZsb2F0ID4oKS0+Z2V0KGljMikpOworCX0KKwllbHNlCisJeworCQlpbnRlcm1lZGlhdGVSZXN1bHQxID0gbGluZWFySW50ZXJwb2xhdGlvbjFEKGFuSW5wdXQxLAorCQkJCWFuSW5wdXRUYWJsZTEtPmdldChpbmRleC0xKSxhbklucHV0VGFibGUxLT5nZXQoaW5kZXgpLAorCQkJCWFuT3V0cHV0VGFibGUtPmF0KGluZGV4LTEpLnRvX3B0cjwgQXJyYXlGbG9hdCA+KCktPmdldChpYzEpLAorCQkJCWFuT3V0cHV0VGFibGUtPmF0KGluZGV4KS50b19wdHI8IEFycmF5RmxvYXQgPigpLT5nZXQoaWMxKSk7CisKKwkJaW50ZXJtZWRpYXRlUmVzdWx0MiA9IGxpbmVhckludGVycG9sYXRpb24xRChhbklucHV0MSwKKwkJCQlhbklucHV0VGFibGUxLT5nZXQoaW5kZXgtMSksYW5JbnB1dFRhYmxlMS0+Z2V0KGluZGV4KSwKKwkJCQlhbk91dHB1dFRhYmxlLT5hdChpbmRleC0xKS50b19wdHI8IEFycmF5RmxvYXQgPigpLT5nZXQoaWMyKSwKKwkJCQlhbk91dHB1dFRhYmxlLT5hdChpbmRleCkudG9fcHRyPCBBcnJheUZsb2F0ID4oKS0+Z2V0KGljMikpOworCX0KKworCWlmICggaWMxID09IGljMiApCisJeworCQlyZXR1cm4oIGludGVybWVkaWF0ZVJlc3VsdDEgKTsKKwl9CisKKwlyZXR1cm4oICgoYW5JbnB1dFRhYmxlMi0+Z2V0KGljMikgLSBhbklucHV0MikgLworCQkJCShhbklucHV0VGFibGUyLT5nZXQoaWMyKSAtIGFuSW5wdXRUYWJsZTItPmdldChpYzEpKSAqIGludGVybWVkaWF0ZVJlc3VsdDEpICsKKwkJCSgoYW5JbnB1dDIgLSBhbklucHV0VGFibGUyLT5nZXQoaWMxKSkgLworCQkJCShhbklucHV0VGFibGUyLT5nZXQoaWMyKSAtIGFuSW5wdXRUYWJsZTItPmdldChpYzEpKSAqIGludGVybWVkaWF0ZVJlc3VsdDIpICk7Cit9CisKKworYm9vbCBBdm1QcmltaXRpdmVfTG9va3VwMkRfSW50RXh0OjpzZXZhbChFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJQkYgaW5wdXRWYWx1ZTEgPSBFTlYubUFSRy0+YXQoMCk7CisJQkYgaW5wdXRWYWx1ZTIgPSBFTlYubUFSRy0+YXQoMSk7CisKKwljb25zdCBCRiAmIGlucHV0VGFibGUxID0gRU5WLm1BUkctPmF0KDIpOworCWNvbnN0IEJGICYgaW5wdXRUYWJsZTIgPSBFTlYubUFSRy0+YXQoMyk7CisJY29uc3QgQkYgJiBvdXRwdXRUYWJsZSA9IEVOVi5tQVJHLT5hdCg0KTsKKworCisJZG91YmxlIGZJbnB1dDE7CisJLy8gQ0FTRSBvZiBOVU1FUklDIFZBTFVFCisJaWYoIGlucHV0VmFsdWUxLmlzSW50ZWdlcigpICkKKwl7CisJCWZJbnB1dDEgPSBpbnB1dFZhbHVlMS50b0ludGVnZXIoKTsKKwl9CisJZWxzZSBpZiggaW5wdXRWYWx1ZTEuaXNGbG9hdCgpICkKKwl7CisJCWZJbnB1dDEgPSBpbnB1dFZhbHVlMS50b0Zsb2F0KCk7CisJfQorCS8vIENBU0Ugb2YgU1lNQk9MSUMgVkFMVUUKKwllbHNlIGlmKCBpbnB1dFZhbHVlMS5pczwgSW5zdGFuY2VPZkRhdGEgPigpIHx8CisJCQlpbnB1dFZhbHVlMi5pczwgSW5zdGFuY2VPZkRhdGEgPigpICkKKwl7CisJCUVOVi5vdXRWQUwgPSBFTlYuY3JlYXRlKEVOVi5vdXRFRC0+bVJJRCwgImxvb2t1cDJESW50RXh0IiwKKwkJCQlUeXBlTWFuYWdlcjo6RkxPQVQsIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQkJCUVOVi5pbkNPREUtPmdldE9wZXJhdG9yKCksIGlucHV0VmFsdWUxLCBpbnB1dFZhbHVlMiwKKwkJCQkJCWlucHV0VGFibGUxLCBpbnB1dFRhYmxlMiwgb3V0cHV0VGFibGUgKSApOworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisJLy8gQ0FTRSBvZiBTWU1CT0xJQyBFWFBSRVNTSU9OCisJZWxzZQorCXsKKwkJRU5WLm91dFZBTCA9IEVOVi5jcmVhdGUoRU5WLm91dEVELT5tUklELCAibG9va3VwMkRJbnRFeHQiLAorCQkJCVR5cGVNYW5hZ2VyOjpGTE9BVCwgRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQkJRU5WLmluQ09ERS0+Z2V0T3BlcmF0b3IoKSwgaW5wdXRWYWx1ZTEsIGlucHV0VmFsdWUyLAorCQkJCQkJaW5wdXRUYWJsZTEsIGlucHV0VGFibGUyLCBvdXRwdXRUYWJsZSApICk7CisJCXJldHVybiggdHJ1ZSApOworCX0KKworCS8vIENBU0Ugb2YgTlVNRVJJQyBWQUxVRQorCWlmKCBpbnB1dFZhbHVlMi5pc0ludGVnZXIoKSApCisJeworCQlFTlYub3V0VkFMID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdFeHByKAorCQkJCWxvb2t1cDJEKGZJbnB1dDEsIGlucHV0VmFsdWUyLnRvSW50ZWdlcigpLAorCQkJCQkJaW5wdXRUYWJsZTEudG9fcHRyPCBBcnJheUZsb2F0ID4oKSwKKwkJCQkJCWlucHV0VGFibGUyLnRvX3B0cjwgQXJyYXlGbG9hdCA+KCksCisJCQkJCQlvdXRwdXRUYWJsZS50b19wdHI8IEFycmF5QkYgPigpKSApOworCX0KKwllbHNlIGlmKCBpbnB1dFZhbHVlMi5pc0Zsb2F0KCkgKQorCXsKKwkJRU5WLm91dFZBTCA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3RXhwcigKKwkJCQlsb29rdXAyRChmSW5wdXQxLCBpbnB1dFZhbHVlMi50b0Zsb2F0KCksCisJCQkJCQlpbnB1dFRhYmxlMS50b19wdHI8IEFycmF5RmxvYXQgPigpLAorCQkJCQkJaW5wdXRUYWJsZTIudG9fcHRyPCBBcnJheUZsb2F0ID4oKSwKKwkJCQkJCW91dHB1dFRhYmxlLnRvX3B0cjwgQXJyYXlCRiA+KCkpICk7CisJfQorCS8vIENBU0Ugb2YgU1lNQk9MSUMgRVhQUkVTU0lPTgorCWVsc2UKKwl7CisJCUVOVi5vdXRWQUwgPSBFTlYuY3JlYXRlKEVOVi5vdXRFRC0+bVJJRCwgImxvb2t1cDJESW50RXh0IiwKKwkJCQlUeXBlTWFuYWdlcjo6RkxPQVQsIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQkJCUVOVi5pbkNPREUtPmdldE9wZXJhdG9yKCksIGlucHV0VmFsdWUxLCBpbnB1dFZhbHVlMiwKKwkJCQkJCWlucHV0VGFibGUxLCBpbnB1dFRhYmxlMiwgb3V0cHV0VGFibGUgKSApOworCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bUxvb2t1cFByaW1pdGl2ZS5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bUxvb2t1cFByaW1pdGl2ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkOGQ1MzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtTG9va3VwUHJpbWl0aXZlLmgKQEAgLTAsMCArMSw2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDMganVpbiAyMDEwCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQVZNTE9PS1VQUFJJTUlUSVZFX0hfCisjZGVmaW5lIEFWTUxPT0tVUFBSSU1JVElWRV9IXworCisjaW5jbHVkZSA8Y29tcHV0ZXIvcHJpbWl0aXZlL0Jhc2VBdm1QcmltaXRpdmUuaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0J1aWx0aW5BcnJheS5oPgorCisKKworbmFtZXNwYWNlIHNlcAoreworCisKK0FWTV9QUklNSVRJVkVfRVZBTF9DTEFTU19IRUFERVIoTG9va3VwX0ludCwgIEJhc2VBdm1QcmltaXRpdmUpCisJCXN0YXRpYyBkb3VibGUgbG9va3VwKGRvdWJsZSBhbklucHV0LAorCQkJCUFycmF5RmxvYXQgKiBhbklucHV0VGFibGUsIEFycmF5RmxvYXQgKiBhbk91dHB1dFRhYmxlKTsKK307CisKKworQVZNX1BSSU1JVElWRV9FVkFMX0NMQVNTX0hFQURFUihMb29rdXBfSW50RXh0LCAgQmFzZUF2bVByaW1pdGl2ZSkKKwlzdGF0aWMgZG91YmxlIGxvb2t1cChkb3VibGUgYW5JbnB1dCwKKwkJCUFycmF5RmxvYXQgKiBhbklucHV0VGFibGUsIEFycmF5RmxvYXQgKiBhbk91dHB1dFRhYmxlKTsKK307CisKKworQVZNX1BSSU1JVElWRV9FVkFMX0NMQVNTX0hFQURFUihMb29rdXBfTmVhcmVzdCwgIEJhc2VBdm1QcmltaXRpdmUpCisJc3RhdGljIGRvdWJsZSBsb29rdXAoZG91YmxlIGFuSW5wdXQsCisJCQlBcnJheUZsb2F0ICogYW5JbnB1dFRhYmxlLCBBcnJheUZsb2F0ICogYW5PdXRwdXRUYWJsZSk7Cit9OworCisKK0FWTV9QUklNSVRJVkVfRVZBTF9DTEFTU19IRUFERVIoTG9va3VwX0JlbG93LCBCYXNlQXZtUHJpbWl0aXZlKQorCXN0YXRpYyBkb3VibGUgbG9va3VwKGRvdWJsZSBhbklucHV0LAorCQkJQXJyYXlGbG9hdCAqIGFuSW5wdXRUYWJsZSwgQXJyYXlGbG9hdCAqIGFuT3V0cHV0VGFibGUpOworfTsKKworCitBVk1fUFJJTUlUSVZFX0VWQUxfQ0xBU1NfSEVBREVSKExvb2t1cF9BYm92ZSwgQmFzZUF2bVByaW1pdGl2ZSkKKwlzdGF0aWMgZG91YmxlIGxvb2t1cChkb3VibGUgYW5JbnB1dCwKKwkJCUFycmF5RmxvYXQgKiBhbklucHV0VGFibGUsIEFycmF5RmxvYXQgKiBhbk91dHB1dFRhYmxlKTsKK307CisKKworQVZNX1BSSU1JVElWRV9FVkFMX0NMQVNTX0hFQURFUihMb29rdXAyRF9JbnRFeHQsIEJhc2VBdm1QcmltaXRpdmUpCisJc3RhdGljIGRvdWJsZSBsb29rdXAyRChkb3VibGUgYW5JbnB1dDEsIGRvdWJsZSBhbklucHV0MiwKKwkJCUFycmF5RmxvYXQgKiBhbklucHV0VGFibGUxLCBBcnJheUZsb2F0ICogYW5JbnB1dFRhYmxlMiwKKwkJCUFycmF5QkYgKiBhbk91dHB1dFRhYmxlKTsKK307CisKKworCit9CisKKyNlbmRpZiAvKiBBVk1MT09LVVBQUklNSVRJVkVfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1NYXRoUHJpbWl0aXZlLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1NYXRoUHJpbWl0aXZlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDliOGJkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bU1hdGhQcmltaXRpdmUuY3BwCkBAIC0wLDAgKzEsMzc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMyBqdWluIDIwMTAKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkF2bU1hdGhQcmltaXRpdmUuaCIKKworI2luY2x1ZGUgPGNvbXB1dGVyL0V2YWx1YXRpb25FbnZpcm9ubWVudC5oPgorI2luY2x1ZGUgPGNvbXB1dGVyL0V4ZWN1dGlvbkVudmlyb25tZW50Lmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9Bdm1Db2RlLmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkV2YWwuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gTUFUSCBNSU4KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIEF2bVByaW1pdGl2ZV9NSU46OnNldmFsKEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlFTlYub3V0VkFMID0gRXhwcmVzc2lvbkV2YWw6Om1pbiggRU5WLm1BUkctPmF0KDApLmJmQ29kZSgpICk7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vIE1BVEggTUFYCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBBdm1QcmltaXRpdmVfTUFYOjpzZXZhbChFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJRU5WLm91dFZBTCA9IEV4cHJlc3Npb25FdmFsOjptYXgoIEVOVi5tQVJHLT5hdCgwKS5iZkNvZGUoKSApOworCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLyBNQVRIIFJBTkRPTQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgQXZtUHJpbWl0aXZlX1JBTkRPTTo6c2V2YWwoRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCUVOVi5vdXRWQUwgPSBFeHByZXNzaW9uRXZhbDo6cmFuZG9tKCBFTlYubUFSRy0+YXQoMCkgKTsKKworCXJldHVybiggdHJ1ZSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gTUFUSCBBQlMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIEF2bVByaW1pdGl2ZV9BQlM6OnNldmFsKEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlFTlYub3V0VkFMID0gRXhwcmVzc2lvbkV2YWw6OmFicyggRU5WLm1BUkctPmF0KDApICk7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vIE1BVEggQ0VJTAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgQXZtUHJpbWl0aXZlX0NFSUw6OnNldmFsKEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlFTlYub3V0VkFMID0gRXhwcmVzc2lvbkV2YWw6OmNlaWwoIEVOVi5tQVJHLT5hdCgwKSApOworCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLyBNQVRIIEZMT09SCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBBdm1QcmltaXRpdmVfRkxPT1I6OnNldmFsKEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlFTlYub3V0VkFMID0gRXhwcmVzc2lvbkV2YWw6OmZsb29yKCBFTlYubUFSRy0+YXQoMCkgKTsKKworCXJldHVybiggdHJ1ZSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gTUFUSCBST1VORAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgQXZtUHJpbWl0aXZlX1JPVU5EOjpzZXZhbChFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJRU5WLm91dFZBTCA9IEV4cHJlc3Npb25FdmFsOjpyb3VuZCggRU5WLm1BUkctPmF0KDApICk7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vIE1BVEggVFJVTkNBVEUKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIEF2bVByaW1pdGl2ZV9UUlVOQ0FURTo6c2V2YWwoRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCUVOVi5vdXRWQUwgPSBFeHByZXNzaW9uRXZhbDo6dHJ1bmNhdGUoIEVOVi5tQVJHLT5hdCgwKSApOworCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLyBNQVRIIE1PRAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgQXZtUHJpbWl0aXZlX01PRDo6c2V2YWwoRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCUVOVi5vdXRWQUwgPSBFeHByZXNzaW9uRXZhbDo6bW9kKEVOVi5tQVJHLT5hdCgwKSwgRU5WLm1BUkctPmF0KDEpKTsKKworCXJldHVybiggdHJ1ZSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gTUFUSCBTUVJUCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBBdm1QcmltaXRpdmVfU1FSVDo6c2V2YWwoRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCUVOVi5vdXRWQUwgPSBFeHByZXNzaW9uRXZhbDo6c3FydCggRU5WLm1BUkctPmF0KDApICk7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vIE1BVEggRVhQCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBBdm1QcmltaXRpdmVfRVhQOjpzZXZhbChFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJRU5WLm91dFZBTCA9IEV4cHJlc3Npb25FdmFsOjpleHAoIEVOVi5tQVJHLT5hdCgwKSApOworCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLyBNQVRIIExPRworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgQXZtUHJpbWl0aXZlX0xPRzo6c2V2YWwoRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCUVOVi5vdXRWQUwgPSBFeHByZXNzaW9uRXZhbDo6bG9nKCBFTlYubUFSRy0+YXQoMCkgKTsKKworCXJldHVybiggdHJ1ZSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gTUFUSCBTSU4KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIEF2bVByaW1pdGl2ZV9TSU46OnNldmFsKEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlFTlYub3V0VkFMID0gRXhwcmVzc2lvbkV2YWw6OnNpbiggRU5WLm1BUkctPmF0KDApICk7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vIE1BVEggQ09TCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBBdm1QcmltaXRpdmVfQ09TOjpzZXZhbChFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJRU5WLm91dFZBTCA9IEV4cHJlc3Npb25FdmFsOjpjb3MoIEVOVi5tQVJHLT5hdCgwKSApOworCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLyBNQVRIIFRBTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgQXZtUHJpbWl0aXZlX1RBTjo6c2V2YWwoRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCUVOVi5vdXRWQUwgPSBFeHByZXNzaW9uRXZhbDo6dGFuKCBFTlYubUFSRy0+YXQoMCkgKTsKKworCXJldHVybiggdHJ1ZSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gTUFUSCBTSU5ICisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBBdm1QcmltaXRpdmVfU0lOSDo6c2V2YWwoRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCUVOVi5vdXRWQUwgPSBFeHByZXNzaW9uRXZhbDo6c2luaCggRU5WLm1BUkctPmF0KDApICk7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vIE1BVEggQ09TSAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgQXZtUHJpbWl0aXZlX0NPU0g6OnNldmFsKEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlFTlYub3V0VkFMID0gRXhwcmVzc2lvbkV2YWw6OmNvc2goIEVOVi5tQVJHLT5hdCgwKSApOworCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLyBNQVRIIFRBTkgKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIEF2bVByaW1pdGl2ZV9UQU5IOjpzZXZhbChFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJRU5WLm91dFZBTCA9IEV4cHJlc3Npb25FdmFsOjp0YW5oKCBFTlYubUFSRy0+YXQoMCkgKTsKKworCXJldHVybiggdHJ1ZSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gTUFUSCBBU0lOCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBBdm1QcmltaXRpdmVfQVNJTjo6c2V2YWwoRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCUVOVi5vdXRWQUwgPSBFeHByZXNzaW9uRXZhbDo6YXNpbiggRU5WLm1BUkctPmF0KDApICk7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vIE1BVEggQUNPUworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgQXZtUHJpbWl0aXZlX0FDT1M6OnNldmFsKEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlFTlYub3V0VkFMID0gRXhwcmVzc2lvbkV2YWw6OmFjb3MoIEVOVi5tQVJHLT5hdCgwKSApOworCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLyBNQVRIIEFUQU4KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIEF2bVByaW1pdGl2ZV9BVEFOOjpzZXZhbChFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJRU5WLm91dFZBTCA9IEV4cHJlc3Npb25FdmFsOjphdGFuKCBFTlYubUFSRy0+YXQoMCkgKTsKKworCXJldHVybiggdHJ1ZSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gTUFUSCBBVEFOMgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgQXZtUHJpbWl0aXZlX0FUQU4yOjpzZXZhbChFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJRU5WLm91dFZBTCA9IEV4cHJlc3Npb25FdmFsOjphdGFuMihFTlYubUFSRy0+YXQoMSksIEVOVi5tQVJHLT5hdCgxKSk7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vIE1BVEggQVNJTkgKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIEF2bVByaW1pdGl2ZV9BU0lOSDo6c2V2YWwoRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCUVOVi5vdXRWQUwgPSBFeHByZXNzaW9uRXZhbDo6YXNpbmgoIEVOVi5tQVJHLT5hdCgwKSApOworCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLyBNQVRIIEFDT1NICisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBBdm1QcmltaXRpdmVfQUNPU0g6OnNldmFsKEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlFTlYub3V0VkFMID0gRXhwcmVzc2lvbkV2YWw6OmFjb3NoKCBFTlYubUFSRy0+YXQoMCkgKTsKKworCXJldHVybiggdHJ1ZSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gTUFUSCBBVEFOSAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgQXZtUHJpbWl0aXZlX0FUQU5IOjpzZXZhbChFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJRU5WLm91dFZBTCA9IEV4cHJlc3Npb25FdmFsOjphdGFuaCggRU5WLm1BUkctPmF0KDApICk7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1NYXRoUHJpbWl0aXZlLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtTWF0aFByaW1pdGl2ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNjU5YzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtTWF0aFByaW1pdGl2ZS5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAzIGp1aW4gMjAxMAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEFWTU1BVEhQUklNSVRJVkVfSF8KKyNkZWZpbmUgQVZNTUFUSFBSSU1JVElWRV9IXworCisjaW5jbHVkZSA8Y29tcHV0ZXIvcHJpbWl0aXZlL0Jhc2VBdm1QcmltaXRpdmUuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLy8gTUlOIC0gTUFYCitBVk1fUFJJTUlUSVZFX0VWQUxfQ0xBU1MoTUlOLCAgQmFzZUF2bVByaW1pdGl2ZSkKK0FWTV9QUklNSVRJVkVfRVZBTF9DTEFTUyhNQVgsICBCYXNlQXZtUHJpbWl0aXZlKQorCisvLyBSQU5ET00KK0FWTV9QUklNSVRJVkVfRVZBTF9DTEFTUyhSQU5ET00sICBCYXNlQXZtUHJpbWl0aXZlKQorCisvLyBBQlMKK0FWTV9QUklNSVRJVkVfRVZBTF9DTEFTUyhBQlMsICBCYXNlQXZtUHJpbWl0aXZlKQorCisvLyBST1VORElORworQVZNX1BSSU1JVElWRV9FVkFMX0NMQVNTKENFSUwsICAgICBCYXNlQXZtUHJpbWl0aXZlKQorQVZNX1BSSU1JVElWRV9FVkFMX0NMQVNTKEZMT09SLCAgICBCYXNlQXZtUHJpbWl0aXZlKQorQVZNX1BSSU1JVElWRV9FVkFMX0NMQVNTKFJPVU5ELCAgICBCYXNlQXZtUHJpbWl0aXZlKQorQVZNX1BSSU1JVElWRV9FVkFMX0NMQVNTKFRSVU5DQVRFLCBCYXNlQXZtUHJpbWl0aXZlKQorCisKKy8vIE1PRAorQVZNX1BSSU1JVElWRV9FVkFMX0NMQVNTKE1PRCwgICBCYXNlQXZtUHJpbWl0aXZlKQorCisvLyBFWFAgLSBMT0cKK0FWTV9QUklNSVRJVkVfRVZBTF9DTEFTUyhTUVJULCAgQmFzZUF2bVByaW1pdGl2ZSkKKworQVZNX1BSSU1JVElWRV9FVkFMX0NMQVNTKEVYUCwgICBCYXNlQXZtUHJpbWl0aXZlKQorQVZNX1BSSU1JVElWRV9FVkFMX0NMQVNTKExPRywgICBCYXNlQXZtUHJpbWl0aXZlKQorCisvLyBUUklHT05PTUVUUklDCitBVk1fUFJJTUlUSVZFX0VWQUxfQ0xBU1MoU0lOLCAgIEJhc2VBdm1QcmltaXRpdmUpCitBVk1fUFJJTUlUSVZFX0VWQUxfQ0xBU1MoQ09TLCAgIEJhc2VBdm1QcmltaXRpdmUpCitBVk1fUFJJTUlUSVZFX0VWQUxfQ0xBU1MoVEFOLCAgIEJhc2VBdm1QcmltaXRpdmUpCisKK0FWTV9QUklNSVRJVkVfRVZBTF9DTEFTUyhTSU5ILCAgQmFzZUF2bVByaW1pdGl2ZSkKK0FWTV9QUklNSVRJVkVfRVZBTF9DTEFTUyhDT1NILCAgQmFzZUF2bVByaW1pdGl2ZSkKK0FWTV9QUklNSVRJVkVfRVZBTF9DTEFTUyhUQU5ILCAgQmFzZUF2bVByaW1pdGl2ZSkKKworQVZNX1BSSU1JVElWRV9FVkFMX0NMQVNTKEFTSU4sICBCYXNlQXZtUHJpbWl0aXZlKQorQVZNX1BSSU1JVElWRV9FVkFMX0NMQVNTKEFDT1MsICBCYXNlQXZtUHJpbWl0aXZlKQorQVZNX1BSSU1JVElWRV9FVkFMX0NMQVNTKEFUQU4sICBCYXNlQXZtUHJpbWl0aXZlKQorQVZNX1BSSU1JVElWRV9FVkFMX0NMQVNTKEFUQU4yLCBCYXNlQXZtUHJpbWl0aXZlKQorCitBVk1fUFJJTUlUSVZFX0VWQUxfQ0xBU1MoQVNJTkgsIEJhc2VBdm1QcmltaXRpdmUpCitBVk1fUFJJTUlUSVZFX0VWQUxfQ0xBU1MoQUNPU0gsIEJhc2VBdm1QcmltaXRpdmUpCitBVk1fUFJJTUlUSVZFX0VWQUxfQ0xBU1MoQVRBTkgsIEJhc2VBdm1QcmltaXRpdmUpCisKKworCit9CisKKyNlbmRpZiAvKiBBVk1NQVRIUFJJTUlUSVZFX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtTWV0YVByaW1pdGl2ZS5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtTWV0YVByaW1pdGl2ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTliN2UzMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1NZXRhUHJpbWl0aXZlLmNwcApAQCAtMCwwICsxLDMwMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDE0IG1hcnMgMjAxMgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQXZtTWV0YVByaW1pdGl2ZS5oIgorCisjaW5jbHVkZSA8Y29tcHV0ZXIvRXZhbHVhdGlvbkVudmlyb25tZW50Lmg+CisjaW5jbHVkZSA8Y29tcHV0ZXIvRXhlY3V0aW9uRGF0YUZhY3RvcnkuaD4KKyNpbmNsdWRlIDxjb21wdXRlci9FeGVjdXRpb25FbnZpcm9ubWVudC5oPgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQXZtQ29kZS5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uQ29uZmlndXJhdGlvbi5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV4ZWN1dGlvbiBvZiBhbiBJTkZPUk1BTCBwcm9ncmFtCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK2Jvb2wgQXZtUHJpbWl0aXZlX0luZm9ybWFsOjpzZXZhbChFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJRXhlY3V0aW9uRGF0YUZhY3Rvcnk6OmFwcGVuZElPRWxlbWVudFRyYWNlKEVOVi5vdXRFRCwKKwkJCUJGKG5ldyBFeGVjdXRpb25Db25maWd1cmF0aW9uKEVOVi5vdXRFRC0+bVJJRCwgRU5WLmluQ09ERSkpICk7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCitib29sIEF2bVByaW1pdGl2ZV9JbmZvcm1hbDo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCUFQRXhlY3V0aW9uRGF0YSBvdXRFRCA9IEVOVi5pbkVEOworCisJRXhlY3V0aW9uRGF0YUZhY3Rvcnk6OmFwcGVuZElPRWxlbWVudFRyYWNlKG91dEVELAorCQkJQkYobmV3IEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24ob3V0RUQtPm1SSUQsIEVOVi5pbkNPREUpKSApOworCisJRU5WLm91dEVEUy5hcHBlbmQob3V0RUQpOworCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBleGVjdXRpb24gb2YgYW4gVFJBQ0UgcHJvZ3JhbQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitib29sIEF2bVByaW1pdGl2ZV9UcmFjZTo6c2V2YWwoRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCUV4ZWN1dGlvbkRhdGFGYWN0b3J5OjphcHBlbmRJT0VsZW1lbnRUcmFjZShFTlYub3V0RUQsCisJCQlCRihuZXcgRXhlY3V0aW9uQ29uZmlndXJhdGlvbihFTlYub3V0RUQtPm1SSUQsIEVOVi5pbkNPREUpKSApOworCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworYm9vbCBBdm1QcmltaXRpdmVfVHJhY2U6OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlBUEV4ZWN1dGlvbkRhdGEgb3V0RUQgPSBFTlYuaW5FRDsKKworCUV4ZWN1dGlvbkRhdGFGYWN0b3J5OjphcHBlbmRJT0VsZW1lbnRUcmFjZShvdXRFRCwKKwkJCUJGKG5ldyBFeGVjdXRpb25Db25maWd1cmF0aW9uKG91dEVELT5tUklELCBFTlYuaW5DT0RFKSkgKTsKKworCUVOVi5vdXRFRFMuYXBwZW5kKG91dEVEKTsKKworCXJldHVybiggdHJ1ZSApOworfQorCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXhlY3V0aW9uIG9mIGFuIERFQlVHIHByb2dyYW0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworYm9vbCBBdm1QcmltaXRpdmVfRGVidWc6OnNldmFsKEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlpZiggRU5WLmluQ09ERS0+ZW1wdHkoKSApCisJeworCQlFeGVjdXRpb25EYXRhRmFjdG9yeTo6YXBwZW5kSU9FbGVtZW50VHJhY2UoRU5WLm91dEVELAorCQkJCUJGKG5ldyBFeGVjdXRpb25Db25maWd1cmF0aW9uKEVOVi5vdXRFRC0+bVJJRCwgRU5WLmluQ09ERSkpICk7CisJfQorCWVsc2UKKwl7CisJCUV4ZWN1dGlvbkRhdGFGYWN0b3J5OjphcHBlbmRJT0VsZW1lbnRUcmFjZShFTlYub3V0RUQsCisJCQkJQkYobmV3IEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24oRU5WLm91dEVELT5tUklELAorCQkJCQkJRU5WLm1BUkctPmF0KDApKSkgKTsKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCitib29sIEF2bVByaW1pdGl2ZV9EZWJ1Zzo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCWlmKCBFTlYuaW5DT0RFLT5lbXB0eSgpICkKKwl7CisJCUFQRXhlY3V0aW9uRGF0YSBvdXRFRCA9IEVOVi5pbkVEOworCisJCUV4ZWN1dGlvbkRhdGFGYWN0b3J5OjphcHBlbmRJT0VsZW1lbnRUcmFjZShvdXRFRCwKKwkJCQlCRihuZXcgRXhlY3V0aW9uQ29uZmlndXJhdGlvbihvdXRFRC0+bVJJRCwgRU5WLmluQ09ERSkpICk7CisKKwkJRU5WLm91dEVEUy5hcHBlbmQob3V0RUQpOworCX0KKwllbHNlCisJeworCQlFeGVjdXRpb25EYXRhRmFjdG9yeTo6YXBwZW5kSU9FbGVtZW50VHJhY2UoRU5WLm1BUkctPm91dEVELAorCQkJCUJGKG5ldyBFeGVjdXRpb25Db25maWd1cmF0aW9uKEVOVi5tQVJHLT5vdXRFRC0+bVJJRCwKKwkJCQkJCUVOVi5tQVJHLT5hdCgwKSkpICk7CisKKwkJRU5WLm91dEVEUy5hcHBlbmQoRU5WLm1BUkctPm91dEVEKTsKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV4ZWN1dGlvbiBvZiBhbiBDT01NRU5UIHByb2dyYW0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworYm9vbCBBdm1QcmltaXRpdmVfQ29tbWVudDo6c2V2YWwoRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCUVOVi5vdXRWQUwgPSBFTlYuaW5DT0RFOworCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworYm9vbCBBdm1QcmltaXRpdmVfQ29tbWVudDo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCUVOVi5vdXRFRFMuYXBwZW5kKCBFTlYuaW5FRCApOworCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV4ZWN1dGlvbiBvZiBhbiBRVU9URSBwcm9ncmFtCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK2Jvb2wgQXZtUHJpbWl0aXZlX1F1b3RlOjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJRU5WLm91dEVEUy5hcHBlbmQoIEVOVi5pbkVEICk7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCitib29sIEF2bVByaW1pdGl2ZV9RdW90ZTo6c2V2YWwoRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCUVOVi5vdXRWQUwgPSBFTlYuaW5DT0RFLT5maXJzdCgpOworCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBleGVjdXRpb24gb2YgYW4gTUVUQV9FVkFMIHByb2dyYW0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworYm9vbCBBdm1QcmltaXRpdmVfTWV0YUV2YWw6OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlCRiBjb2RlVG9FdmFsID0gRU5WLmluQ09ERS0+Zmlyc3QoKTsKKworCXN3aXRjaCggY29kZVRvRXZhbC5jbGFzc0tpbmQoKSApCisJeworCQljYXNlIEZPUk1fSU5TVEFOQ0VfREFUQV9LSU5EOgorCQl7CisJCQljb2RlVG9FdmFsID0gRU5WLmdldFJ2YWx1ZSggY29kZVRvRXZhbC50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSApOworCisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgRk9STV9BVk1DT0RFX0tJTkQ6CisJCXsKKwkJCWJyZWFrOworCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJQVZNX09TX0VYSVQoIEZBSUxFRCApCisJCQkJCTw8ICJBdm1QcmltaXRpdmVfTWV0YUV2YWw6OnJ1bjo+IFVuZXhwZWN0ZWQgYSBmb3JtIEtJTkQ8ICIKKwkJCQkJPDwgY29kZVRvRXZhbC5jbGFzc0tpbmROYW1lKCkgPDwgIiA+XG4iIDw8IGNvZGVUb0V2YWwudG9TdHJpbmcoKQorCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KKworCisJRXZhbHVhdGlvbkVudmlyb25tZW50IGVFTlYoRU5WLCBjb2RlVG9FdmFsKTsKKwlpZiggZUVOVi5kZWNvZGVfc2V2YWwoKSApCisJeworCQlFTlYub3V0RURTLmFwcGVuZChlRU5WLm91dEVEKTsKKworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKworYm9vbCBBdm1QcmltaXRpdmVfTWV0YUV2YWw6OnNldmFsKEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlCRiBjb2RlVG9FdmFsID0gRU5WLmluQ09ERS0+Zmlyc3QoKTsKKworCXN3aXRjaCggY29kZVRvRXZhbC5jbGFzc0tpbmQoKSApCisJeworCQljYXNlIEZPUk1fSU5TVEFOQ0VfREFUQV9LSU5EOgorCQl7CisJCQljb2RlVG9FdmFsID0gRU5WLmdldFJ2YWx1ZSggY29kZVRvRXZhbC50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSApOworCisJCQlyZXR1cm4oIEVOVi5zZXZhbChjb2RlVG9FdmFsKSApOworCQl9CisKKwkJY2FzZSBGT1JNX0FWTUNPREVfS0lORDoKKwkJeworCQkJRU5WLnNldENvZGUoIGNvZGVUb0V2YWwuYmZDb2RlKCkgKTsKKworCQkJcmV0dXJuKCBzZXZhbHgyKEVOVikgKTsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCUFWTV9PU19FWElUKCBGQUlMRUQgKQorCQkJCQk8PCAiQXZtUHJpbWl0aXZlX01ldGFFdmFsOjpydW46PiBVbmV4cGVjdGVkIGEgZm9ybSBLSU5EPCAiCisJCQkJCTw8IGNvZGVUb0V2YWwuY2xhc3NLaW5kTmFtZSgpIDw8ICIgPlxuIiA8PCBjb2RlVG9FdmFsLnRvU3RyaW5nKCkKKwkJCQkJPDwgU0VORF9FWElUOworCisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKwl9Cit9CisKKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV4ZWN1dGlvbiBvZiBhbiBNRVRBX1JVTiBwcm9ncmFtCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK2Jvb2wgQXZtUHJpbWl0aXZlX01ldGFSdW46OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlCRiBjb2RlVG9SdW4gPSBFTlYuaW5DT0RFLT5maXJzdCgpOworCisJc3dpdGNoKCBjb2RlVG9SdW4uY2xhc3NLaW5kKCkgKQorCXsKKwkJY2FzZSBGT1JNX0lOU1RBTkNFX0RBVEFfS0lORDoKKwkJeworCQkJY29kZVRvUnVuID0gRU5WLmdldFJ2YWx1ZSggY29kZVRvUnVuLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpICk7CisKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBGT1JNX0FWTUNPREVfS0lORDoKKwkJeworCQkJYnJlYWs7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlBVk1fT1NfRVhJVCggRkFJTEVEICkKKwkJCQkJPDwgIkF2bVByaW1pdGl2ZV9NZXRhRXZhbDo6cnVuOj4gVW5leHBlY3RlZCBhIGZvcm0gS0lORDwgIgorCQkJCQk8PCBjb2RlVG9SdW4uY2xhc3NLaW5kTmFtZSgpIDw8ICIgPlxuIiA8PCBjb2RlVG9SdW4udG9TdHJpbmcoKQorCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KKworCWlmKCBjb2RlVG9SdW4uaXM8IEF2bUNvZGUgPigpICkKKwl7CisJCXJldHVybiggRU5WLnJ1bihjb2RlVG9SdW4pICk7CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKKworCisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtTWV0YVByaW1pdGl2ZS5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bU1ldGFQcmltaXRpdmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjRlNjViCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bU1ldGFQcmltaXRpdmUuaApAQCAtMCwwICsxLDQ0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTQgbWFycyAyMDEyCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQVZNTUVUQVBSSU1JVElWRV9IXworI2RlZmluZSBBVk1NRVRBUFJJTUlUSVZFX0hfCisKKyNpbmNsdWRlIDxjb21wdXRlci9wcmltaXRpdmUvQmFzZUF2bVByaW1pdGl2ZS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitBVk1fUFJJTUlUSVZFX1JVTl9FVkFMX0NMQVNTKEluZm9ybWFsLCBCYXNlQXZtUHJpbWl0aXZlKQorCitBVk1fUFJJTUlUSVZFX1JVTl9FVkFMX0NMQVNTKFRyYWNlLCBCYXNlQXZtUHJpbWl0aXZlKQorCitBVk1fUFJJTUlUSVZFX1JVTl9FVkFMX0NMQVNTKERlYnVnLCBCYXNlQXZtUHJpbWl0aXZlKQorCitBVk1fUFJJTUlUSVZFX1JVTl9FVkFMX0NMQVNTKENvbW1lbnQsIEJhc2VBdm1QcmltaXRpdmUpCisKK0FWTV9QUklNSVRJVkVfUlVOX0VWQUxfQ0xBU1MoUXVvdGUsIEJhc2VBdm1QcmltaXRpdmUpCisKKworQVZNX1BSSU1JVElWRV9SVU5fRVZBTF9DTEFTUyhNZXRhRXZhbCwgQmFzZUF2bVByaW1pdGl2ZSkKKworQVZNX1BSSU1JVElWRV9SVU5fQ0xBU1MoTWV0YVJ1biwgQmFzZUF2bVByaW1pdGl2ZSkKKworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworI2VuZGlmIC8qIEFWTU1FVEFQUklNSVRJVkVfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1QcmltaXRpdmVQcm9jZXNzb3IuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bVByaW1pdGl2ZVByb2Nlc3Nvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZhNzkwNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1QcmltaXRpdmVQcm9jZXNzb3IuY3BwCkBAIC0wLDAgKzEsMTc2NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuDQorICoNCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ3JlYXRlZCBvbjogMTggbWFpIDIwMTANCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcg0KKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlICJBdm1QcmltaXRpdmVQcm9jZXNzb3IuaCINCisNCisjaW5jbHVkZSA8Y29tcHV0ZXIvRXhlY3V0aW9uRW52aXJvbm1lbnQuaD4NCisNCisjaW5jbHVkZSA8Y29tcHV0ZXIvcHJpbWl0aXZlL0Jhc2VBdm1QcmltaXRpdmUuaD4NCisNCisjaW5jbHVkZSA8Y29tcHV0ZXIvcHJpbWl0aXZlL0F2bUFjdGl2aXR5UHJpbWl0aXZlLmg+DQorI2luY2x1ZGUgPGNvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1Bc3NpZ25QcmltaXRpdmUuaD4NCisjaW5jbHVkZSA8Y29tcHV0ZXIvcHJpbWl0aXZlL0F2bUJpdHdpc2VQcmltaXRpdmUuaD4NCisjaW5jbHVkZSA8Y29tcHV0ZXIvcHJpbWl0aXZlL0F2bUJ1ZmZlclByaW1pdGl2ZS5oPg0KKyNpbmNsdWRlIDxjb21wdXRlci9wcmltaXRpdmUvQXZtQ29tbXVuaWNhdGlvblByaW1pdGl2ZS5oPg0KKyNpbmNsdWRlIDxjb21wdXRlci9wcmltaXRpdmUvQXZtQ29uY3VycmVuY3lQcmltaXRpdmUuaD4NCisjaW5jbHVkZSA8Y29tcHV0ZXIvcHJpbWl0aXZlL0F2bUN0b3JQcmltaXRpdmUuaD4NCisjaW5jbHVkZSA8Y29tcHV0ZXIvcHJpbWl0aXZlL0F2bUV4cHJlc3Npb25QcmltaXRpdmUuaD4NCisjaW5jbHVkZSA8Y29tcHV0ZXIvcHJpbWl0aXZlL0F2bUd1YXJkUHJpbWl0aXZlLmg+DQorI2luY2x1ZGUgPGNvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1JbnB1dEVuYWJsZWRQcmltaXRpdmUuaD4NCisjaW5jbHVkZSA8Y29tcHV0ZXIvcHJpbWl0aXZlL0F2bUludm9rZVByaW1pdGl2ZS5oPg0KKyNpbmNsdWRlIDxjb21wdXRlci9wcmltaXRpdmUvQXZtSXRlUHJpbWl0aXZlLmg+DQorI2luY2x1ZGUgPGNvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1JdGVyYXRpb25QcmltaXRpdmUuaD4NCisjaW5jbHVkZSA8Y29tcHV0ZXIvcHJpbWl0aXZlL0F2bUp1bXBQcmltaXRpdmUuaD4NCisjaW5jbHVkZSA8Y29tcHV0ZXIvcHJpbWl0aXZlL0F2bUxvb2t1cFByaW1pdGl2ZS5oPg0KKyNpbmNsdWRlIDxjb21wdXRlci9wcmltaXRpdmUvQXZtTWF0aFByaW1pdGl2ZS5oPg0KKyNpbmNsdWRlIDxjb21wdXRlci9wcmltaXRpdmUvQXZtTWV0YVByaW1pdGl2ZS5oPg0KKyNpbmNsdWRlIDxjb21wdXRlci9wcmltaXRpdmUvQXZtU2NoZWR1bGluZ1ByaW1pdGl2ZS5oPg0KKyNpbmNsdWRlIDxjb21wdXRlci9wcmltaXRpdmUvQXZtU2VxdWVuY2VQcmltaXRpdmUuaD4NCisjaW5jbHVkZSA8Y29tcHV0ZXIvcHJpbWl0aXZlL0F2bVN0YXR1c1ByaW1pdGl2ZS5oPg0KKw0KKyNpbmNsdWRlIDxjb21wdXRlci9FdmFsdWF0aW9uRW52aXJvbm1lbnQuaD4NCisjaW5jbHVkZSA8Y29tcHV0ZXIvRXhlY3V0aW9uRW52aXJvbm1lbnQuaD4NCisNCisjaW5jbHVkZSA8Y29tcHV0ZXIvaW5zdHJ1Y3Rpb24vSW5zdHJ1Y3Rpb25FbnZpcm9ubWVudC5oPg0KKw0KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlTGliLmg+DQorDQorI2luY2x1ZGUgPGZtbC9vcGVyYXRvci9PcGVyYXRvci5oPg0KKyNpbmNsdWRlIDxmbWwvb3BlcmF0b3IvT3BlcmF0b3JNYW5hZ2VyLmg+DQorDQorI2luY2x1ZGUgPGZtbC9ydW50aW1lL1J1bnRpbWVEZWYuaD4NCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvUnVudGltZUxpYi5oPg0KKw0KKyNpbmNsdWRlIDxzZXcvU3ltYmV4RW5naW5lLmg+DQorDQorDQorbmFtZXNwYWNlIHNlcA0KK3sNCisNCisNCisvKioNCisgKiBERVNUUlVDVE9SDQorICovDQorQXZtUHJpbWl0aXZlUHJvY2Vzc29yOjp+QXZtUHJpbWl0aXZlUHJvY2Vzc29yKCkNCit7DQorCVZlY3Rvck9mQXZtUHJpbWl0aXZlOjppdGVyYXRvciBpdCA9IEFWTV9QUklNSVRJVkVfVEFCTEUuYmVnaW4oKTsNCisJVmVjdG9yT2ZBdm1QcmltaXRpdmU6Oml0ZXJhdG9yIGVuZEl0ID0gQVZNX1BSSU1JVElWRV9UQUJMRS5lbmQoKTsNCisJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApDQorCXsNCisJCWlmKCAoKCppdCkgIT0gREVGQVVMVF9BVk1fUFJJTUlUSVZFKSAmJg0KKwkJCSgoKml0KSAhPSBERUZBVUxUX0lOVk9LRV9ST1VUSU5FKSAmJg0KKwkJCSgoKml0KSAhPSBERUZBVUxUX0VWQUxfRVhQUkVTU0lPTl9BTFUpICkNCisJCXsNCisJCQlkZWxldGUoICppdCApOw0KKwkJfQ0KKwl9DQorDQorCWRlbGV0ZSggREVGQVVMVF9BVk1fUFJJTUlUSVZFICk7DQorCWRlbGV0ZSggREVGQVVMVF9JTlZPS0VfUk9VVElORSApOw0KKwlkZWxldGUoIERFRkFVTFRfRVZBTF9FWFBSRVNTSU9OX0FMVSApOw0KK30NCisNCisNCisvKioNCisgKiBHRVRURVINCisgKiBCdWlsZGVyDQorICogTG9hZGVyDQorICovDQorQnVpbGRlciAmIEF2bVByaW1pdGl2ZVByb2Nlc3Nvcjo6Z2V0QnVpbGRlcigpDQorew0KKwlyZXR1cm4oIG1TeW1iZXhFbmdpbmUuZ2V0QnVpbGRlcigpICk7DQorfQ0KKw0KK0xvYWRlciAmIEF2bVByaW1pdGl2ZVByb2Nlc3Nvcjo6Z2V0TG9hZGVyKCkNCit7DQorCXJldHVybiggbVN5bWJleEVuZ2luZS5nZXRMb2FkZXIoKSApOw0KK30NCisNCisNCisNCisvKioNCisgKiBDT05GSUdVUkUNCisgKi8NCitib29sIEF2bVByaW1pdGl2ZVByb2Nlc3Nvcjo6Y29uZmlndXJlKCkNCit7DQorCURFRkFVTFRfQVZNX1BSSU1JVElWRSA9IG5ldyBCYXNlQXZtUHJpbWl0aXZlKCAqdGhpcyApOw0KKw0KKwlERUZBVUxUX0lOVk9LRV9ST1VUSU5FID0gbmV3IEF2bVByaW1pdGl2ZV9JbnZva2VSb3V0aW5lKCAqdGhpcyApOw0KKw0KKwlERUZBVUxUX0VWQUxfRVhQUkVTU0lPTl9BTFUgPSBuZXcgQXZtUHJpbWl0aXZlX0V2YWxFeHByZXNzaW9uQUxVKCAqdGhpcyApOw0KKw0KKwlBVk1fUFJJTUlUSVZFX1RBQkxFLnJlc2l6ZSgNCisJCQlPcGVyYXRvck1hbmFnZXI6OlRBQkxFX09GX09QRVJBVE9SLnNpemUoKSwNCisJCQlERUZBVUxUX0FWTV9QUklNSVRJVkUpOw0KKw0KKwlpZiggbm90IGNvbmZpZ3VyZU90aGVyKCkgKQ0KKwl7DQorCQlyZXR1cm4oIGZhbHNlICk7DQorCX0NCisNCisJaWYoIG5vdCBjb25maWd1cmVNZXRhKCkgKQ0KKwl7DQorCQlyZXR1cm4oIGZhbHNlICk7DQorCX0NCisNCisJaWYoIG5vdCBjb25maWd1cmVMYW1iZGFQcmltaXRpdmUoKSApDQorCXsNCisJCXJldHVybiggZmFsc2UgKTsNCisJfQ0KKw0KKwlpZiggbm90IGNvbmZpZ3VyZUFjdGl2aXR5UHJpbWl0aXZlKCkgKQ0KKwl7DQorCQlyZXR1cm4oIGZhbHNlICk7DQorCX0NCisNCisJaWYoIG5vdCBjb25maWd1cmVTdGF0dXNQcmltaXRpdmUoKSApDQorCXsNCisJCXJldHVybiggZmFsc2UgKTsNCisJfQ0KKw0KKwlpZiggbm90IGNvbmZpZ3VyZUNvbmN1cnJlbmN5UHJpbWl0aXZlKCkgKQ0KKwl7DQorCQlyZXR1cm4oIGZhbHNlICk7DQorCX0NCisJaWYoIG5vdCBjb25maWd1cmVCYXNpY1ByaW1pdGl2ZSgpICkNCisJew0KKwkJcmV0dXJuKCBmYWxzZSApOw0KKwl9DQorDQorCWlmKCBub3QgY29uZmlndXJlQXJpdGhtZXRpY1ByaW1pdGl2ZSgpICkNCisJew0KKwkJcmV0dXJuKCBmYWxzZSApOw0KKwl9DQorCWlmKCBub3QgY29uZmlndXJlQml0d2lzZVByaW1pdGl2ZSgpICkNCisJew0KKwkJcmV0dXJuKCBmYWxzZSApOw0KKwl9DQorCWlmKCBub3QgY29uZmlndXJlTG9naWNQcmltaXRpdmUoKSApDQorCXsNCisJCXJldHVybiggZmFsc2UgKTsNCisJfQ0KKw0KKwlpZiggbm90IGNvbmZpZ3VyZUxvb2t1cFByaW1pdGl2ZSgpICkNCisJew0KKwkJcmV0dXJuKCBmYWxzZSApOw0KKwl9DQorCWlmKCBub3QgY29uZmlndXJlTWF0aGVtYXRpY1ByaW1pdGl2ZSgpICkNCisJew0KKwkJcmV0dXJuKCBmYWxzZSApOw0KKwl9DQorDQorCWlmKCBub3QgY29uZmlndXJlU3RyaW5nUHJpbWl0aXZlKCkgKQ0KKwl7DQorCQlyZXR1cm4oIGZhbHNlICk7DQorCX0NCisNCisJaWYoIG5vdCBjb25maWd1cmVJb2x0UHJpbWl0aXZlKCkgKQ0KKwl7DQorCQlyZXR1cm4oIGZhbHNlICk7DQorCX0NCisNCisJcmV0dXJuKCB0cnVlICk7DQorfQ0KKw0KKw0KKw0KKyNkZWZpbmUgT1BDT0RFX0NPTVBVVEVSKCBPUElEICkgICBcDQorCQlBVk1fUFJJTUlUSVZFX1RBQkxFWyBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SXyMjT1BJRC0+Z2V0T2Zmc2V0KCkgXQ0KKw0KKyNkZWZpbmUgU0VUX09QQ09ERV9DT01QVVRFUiggT1BJRCAsIENMQVNTICkgICBcDQorCQlBVk1fUFJJTUlUSVZFX1RBQkxFWyBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SXyMjT1BJRC0+Z2V0T2Zmc2V0KCkgXSA9IG5ldyBDTEFTUygqdGhpcykNCisNCisNCisNCisNCitib29sIEF2bVByaW1pdGl2ZVByb2Nlc3Nvcjo6Y29uZmlndXJlT3RoZXIoKQ0KK3sNCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwkvLyBBVk0gTk9QIFNUQVRFTUVOVA0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorCU9QQ09ERV9DT01QVVRFUiggTk9QICkgPSBuZXcgQXZtUHJpbWl0aXZlX05vcCggKnRoaXMgKTsNCisNCisNCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwkvLyBBVk0gVUZJIFNUQVRFTUVOVA0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8JT1BDT0RFX0NPTVBVVEVSKCBVRkkgKSA9IG1Bdm1VZmlQcmltaXRpdmUgPSBuZXcgQXZtUHJpbWl0aXZlX1VmaSggKnRoaXMgKTsNCisNCisNCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwkvLyBBVk0gRk9STSBDT05TVFJVQ1RPUiBTVEFURU1FTlQNCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwlPUENPREVfQ09NUFVURVIoIENUT1IgKSA9IG5ldyBBdm1QcmltaXRpdmVfQ3RvciggKnRoaXMgKTsNCisNCisNCisJcmV0dXJuKCB0cnVlICk7DQorfQ0KKw0KKw0KK2Jvb2wgQXZtUHJpbWl0aXZlUHJvY2Vzc29yOjpjb25maWd1cmVNZXRhKCkNCit7DQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisJLy8gQVZNIE1FVEEgU1RBVEVNRU5UDQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisJT1BDT0RFX0NPTVBVVEVSKCBJTkZPUk1BTCAgKSA9IG5ldyBBdm1QcmltaXRpdmVfSW5mb3JtYWwoICp0aGlzICk7DQorDQorCU9QQ09ERV9DT01QVVRFUiggVFJBQ0UgICAgICkgPSBuZXcgQXZtUHJpbWl0aXZlX1RyYWNlKCAqdGhpcyApOw0KKw0KKwlPUENPREVfQ09NUFVURVIoIERFQlVHICAgICApID0gbmV3IEF2bVByaW1pdGl2ZV9EZWJ1ZyggKnRoaXMgKTsNCisNCisJT1BDT0RFX0NPTVBVVEVSKCBDT01NRU5UICAgKSA9IG5ldyBBdm1QcmltaXRpdmVfQ29tbWVudCggKnRoaXMgKTsNCisNCisJT1BDT0RFX0NPTVBVVEVSKCBRVU9URSAgICAgKSA9IG5ldyBBdm1QcmltaXRpdmVfUXVvdGUoICp0aGlzICk7DQorDQorCU9QQ09ERV9DT01QVVRFUiggTUVUQV9FVkFMICkgPSBuZXcgQXZtUHJpbWl0aXZlX01ldGFFdmFsKCAqdGhpcyApOw0KKwlPUENPREVfQ09NUFVURVIoIE1FVEFfUlVOICApID0gbmV3IEF2bVByaW1pdGl2ZV9NZXRhUnVuKCAqdGhpcyApOw0KKw0KKw0KKwlyZXR1cm4oIHRydWUgKTsNCit9DQorDQorDQorYm9vbCBBdm1QcmltaXRpdmVQcm9jZXNzb3I6OmNvbmZpZ3VyZUxhbWJkYVByaW1pdGl2ZSgpDQorew0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorCS8vIExBTUJEQSBTVEFURU1FTlQNCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwlPUENPREVfQ09NUFVURVIoIEFQUExZICApID0gREVGQVVMVF9BVk1fUFJJTUlUSVZFOw0KKw0KKwlPUENPREVfQ09NUFVURVIoIExBTUJEQSApID0gREVGQVVMVF9BVk1fUFJJTUlUSVZFOw0KKw0KKw0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorCS8vIExFVCBTVEFURU1FTlQNCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwlPUENPREVfQ09NUFVURVIoIExFVCAgICApID0gREVGQVVMVF9BVk1fUFJJTUlUSVZFOw0KKw0KKw0KKwlyZXR1cm4oIHRydWUgKTsNCit9DQorDQorDQorYm9vbCBBdm1QcmltaXRpdmVQcm9jZXNzb3I6OmNvbmZpZ3VyZUFjdGl2aXR5UHJpbWl0aXZlKCkNCit7DQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisJLy8gQVZNIE1BQ0hJTkUgTUFOQUdJTkcNCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwlPUENPREVfQ09NUFVURVIoIENPTlRFWFRfU1dJVENIRVIgKSA9IG5ldyBBdm1QcmltaXRpdmVfQ29udGV4dFN3aXRjaGVyKCAqdGhpcyApOw0KKw0KKwlPUENPREVfQ09NUFVURVIoIElOSVQgICAgICAgICkgPSBuZXcgQXZtUHJpbWl0aXZlX0luaXQoICp0aGlzICk7DQorCU9QQ09ERV9DT01QVVRFUiggRklOQUwgICAgICAgKSA9IG5ldyBBdm1QcmltaXRpdmVfRmluYWwoICp0aGlzICk7DQorCU9QQ09ERV9DT01QVVRFUiggREVTVFJPWSAgICAgKSA9IG5ldyBBdm1QcmltaXRpdmVfRGVzdHJveSggKnRoaXMgKTsNCisNCisJT1BDT0RFX0NPTVBVVEVSKCBTVEFSVCAgICAgICApID0gbmV3IEF2bVByaW1pdGl2ZV9TdGFydCggKnRoaXMgKTsNCisJT1BDT0RFX0NPTVBVVEVSKCBSRVNUQVJUICAgICApID0gbmV3IEF2bVByaW1pdGl2ZV9SZXN0YXJ0KCAqdGhpcyApOw0KKwlPUENPREVfQ09NUFVURVIoIFNUT1AgICAgICAgICkgPSBuZXcgQXZtUHJpbWl0aXZlX1N0b3AoICp0aGlzICk7DQorDQorCU9QQ09ERV9DT01QVVRFUiggV0FJVCAgICAgICAgKSA9IG5ldyBBdm1QcmltaXRpdmVfV2FpdCggKnRoaXMgKTsNCisNCisJT1BDT0RFX0NPTVBVVEVSKCBTVVNQRU5EICAgICApID0gbmV3IEF2bVByaW1pdGl2ZV9TdXNwZW5kKCAqdGhpcyApOw0KKwlPUENPREVfQ09NUFVURVIoIFJFU1VNRSAgICAgICkgPSBuZXcgQXZtUHJpbWl0aXZlX1Jlc3VtZSggKnRoaXMgKTsNCisNCisNCisJT1BDT0RFX0NPTVBVVEVSKCBJRU5BQkxFX0lOVk9LRSAgKSA9IG5ldyBBdm1QcmltaXRpdmVfSUVuYWJsZUludm9rZSggKnRoaXMgKTsNCisJT1BDT0RFX0NPTVBVVEVSKCBFTkFCTEVfSU5WT0tFICAgKSA9IG5ldyBBdm1QcmltaXRpdmVfRW5hYmxlSW52b2tlKCAqdGhpcyApOw0KKwlPUENPREVfQ09NUFVURVIoIEVOQUJMRV9TRVQgICAgICApID0gbmV3IEF2bVByaW1pdGl2ZV9FbmFibGVTZXQoICp0aGlzICk7DQorDQorCU9QQ09ERV9DT01QVVRFUiggSURJU0FCTEVfSU5WT0tFICkgPSBuZXcgQXZtUHJpbWl0aXZlX0lEaXNhYmxlSW52b2tlKCAqdGhpcyApOw0KKwlPUENPREVfQ09NUFVURVIoIERJU0FCTEVfSU5WT0tFICApID0gbmV3IEF2bVByaW1pdGl2ZV9EaXNhYmxlSW52b2tlKCAqdGhpcyApOw0KKwlPUENPREVfQ09NUFVURVIoIERJU0FCTEVfU0VUICAgICApID0gbmV3IEF2bVByaW1pdGl2ZV9EaXNhYmxlU2V0KCAqdGhpcyApOw0KKwlPUENPREVfQ09NUFVURVIoIERJU0FCTEVfQ0hJTEQgICApID0gbmV3IEF2bVByaW1pdGl2ZV9EaXNhYmxlQ2hpbGQoICp0aGlzICk7DQorCU9QQ09ERV9DT01QVVRFUiggRElTQUJMRV9TRUxGICAgICkgPSBuZXcgQXZtUHJpbWl0aXZlX0Rpc2FibGVTZWxmKCAqdGhpcyApOw0KKwlPUENPREVfQ09NUFVURVIoIERJU0FCTEVfU0VMVkVTICApID0gbmV3IEF2bVByaW1pdGl2ZV9EaXNhYmxlU2VsdmVzKCAqdGhpcyApOw0KKw0KKwlPUENPREVfQ09NUFVURVIoIElBQk9SVF9JTlZPS0UgICApID0gbmV3IEF2bVByaW1pdGl2ZV9JQWJvcnRJbnZva2UoICp0aGlzICk7DQorCU9QQ09ERV9DT01QVVRFUiggQUJPUlRfSU5WT0tFICAgICkgPSBuZXcgQXZtUHJpbWl0aXZlX0Fib3J0SW52b2tlKCAqdGhpcyApOw0KKwlPUENPREVfQ09NUFVURVIoIEFCT1JUX1NFVCAgICAgICApID0gbmV3IEF2bVByaW1pdGl2ZV9BYm9ydFNldCggKnRoaXMgKTsNCisJT1BDT0RFX0NPTVBVVEVSKCBBQk9SVF9DSElMRCAgICAgKSA9IG5ldyBBdm1QcmltaXRpdmVfQWJvcnRDaGlsZCggKnRoaXMgKTsNCisJT1BDT0RFX0NPTVBVVEVSKCBBQk9SVF9TRUxGICAgICAgKSA9IG5ldyBBdm1QcmltaXRpdmVfQWJvcnRTZWxmKCAqdGhpcyApOw0KKwlPUENPREVfQ09NUFVURVIoIEFCT1JUX1NFTFZFUyAgICApID0gbmV3IEF2bVByaW1pdGl2ZV9BYm9ydFNlbHZlcyggKnRoaXMgKTsNCisNCisJT1BDT0RFX0NPTVBVVEVSKCBISVNUT1JZX0NMRUFSICAgICAgICAgICkgPSBuZXcgQXZtUHJpbWl0aXZlX0hpc3RvcnlDbGVhciggKnRoaXMgKTsNCisJT1BDT0RFX0NPTVBVVEVSKCBERUVQX0hJU1RPUllfSU5WT0tFICAgICkgPSBuZXcgQXZtUHJpbWl0aXZlX0RlZXBIaXN0b3J5SW52b2tlKCAqdGhpcyApOw0KKwlPUENPREVfQ09NUFVURVIoIFNIQUxMT1dfSElTVE9SWV9JTlZPS0UgKSA9IG5ldyBBdm1QcmltaXRpdmVfU2hhbGxvd0hpc3RvcnlJbnZva2UoICp0aGlzICk7DQorDQorCU9QQ09ERV9DT01QVVRFUiggSVJVTiAgKSA9IG5ldyBBdm1QcmltaXRpdmVfSVJ1biggKnRoaXMgKTsNCisJT1BDT0RFX0NPTVBVVEVSKCBSVU4gICApID0gbmV3IEF2bVByaW1pdGl2ZV9SdW4oICp0aGlzICk7DQorDQorCU9QQ09ERV9DT01QVVRFUiggUlRDICAgKSA9IG5ldyBBdm1QcmltaXRpdmVfUnRjKCAqdGhpcyApOw0KKw0KKw0KKwlPUENPREVfQ09NUFVURVIoIElOVk9LRV9ORVcgICAgICAgICApID0gbmV3IEF2bVByaW1pdGl2ZV9JbnZva2VOZXcoICp0aGlzICk7DQorDQorCU9QQ09ERV9DT01QVVRFUiggSU5WT0tFX1JPVVRJTkUgICAgICkgPSBERUZBVUxUX0lOVk9LRV9ST1VUSU5FOw0KKw0KKwlPUENPREVfQ09NUFVURVIoIElOVk9LRV9UUkFOU0lUSU9OICApID0gbmV3IEF2bVByaW1pdGl2ZV9JbnZva2VUcmFuc2l0aW9uKCAqdGhpcyApOw0KKw0KKwlPUENPREVfQ09NUFVURVIoIElOVk9LRV9NRVRIT0QgICApID0gbmV3IEF2bVByaW1pdGl2ZV9JbnZva2VNZXRob2QoICp0aGlzICk7DQorCU9QQ09ERV9DT01QVVRFUiggSU5WT0tFX1BST0dSQU0gICkgPSBuZXcgQXZtUHJpbWl0aXZlX0ludm9rZVByb2dyYW0oICp0aGlzICk7DQorCU9QQ09ERV9DT01QVVRFUiggSU5WT0tFX0ZVTkNUSU9OICkgPSBuZXcgQXZtUHJpbWl0aXZlX0ludm9rZUZ1bmN0aW9uKCAqdGhpcyApOw0KKw0KKwlPUENPREVfQ09NUFVURVIoIElOVk9LRV9MQU1CREFfQVBQTFkgKSA9IG5ldyBBdm1QcmltaXRpdmVfSW52b2tlTGFtYmRhQXBwbHkoICp0aGlzICk7DQorCU9QQ09ERV9DT01QVVRFUiggSU5WT0tFX0xBTUJEQV9MRVQgICApID0gbmV3IEF2bVByaW1pdGl2ZV9JbnZva2VMYW1iZGFMZXQoICp0aGlzICk7DQorDQorDQorCU9QQ09ERV9DT01QVVRFUiggU0NIRURVTEVfSU5WT0tFICkgPSBuZXcgQXZtUHJpbWl0aXZlX1NjaGVkdWxlSW52b2tlKCAqdGhpcyApOw0KKwlPUENPREVfQ09NUFVURVIoIFNDSEVEVUxFX0dFVCAgICApID0gbmV3IEF2bVByaW1pdGl2ZV9TY2hlZHVsZUdldCggKnRoaXMgKTsNCisJT1BDT0RFX0NPTVBVVEVSKCBTQ0hFRFVMRV9JTiAgICAgKSA9IG5ldyBBdm1QcmltaXRpdmVfU2NoZWR1bGVJbiggKnRoaXMgKTsNCisJT1BDT0RFX0NPTVBVVEVSKCBTQ0hFRFVMRV9TRVQgICAgKSA9IG5ldyBBdm1QcmltaXRpdmVfU2NoZWR1bGVTZXQoICp0aGlzICk7DQorDQorCU9QQ09ERV9DT01QVVRFUiggREVGRVJfSU5WT0tFICkgPSBuZXcgQXZtUHJpbWl0aXZlX0RlZmVySW52b2tlKCAqdGhpcyApOw0KKwlPUENPREVfQ09NUFVURVIoIERFRkVSX0dFVCAgICApID0gbmV3IEF2bVByaW1pdGl2ZV9EZWZlckdldCggKnRoaXMgKTsNCisJT1BDT0RFX0NPTVBVVEVSKCBERUZFUl9TRVQgICAgKSA9IG5ldyBBdm1QcmltaXRpdmVfRGVmZXJTZXQoICp0aGlzICk7DQorDQorCU9QQ09ERV9DT01QVVRFUiggR09UTyApID0gbmV3IEF2bVByaW1pdGl2ZV9Hb3RvKCAqdGhpcyApOw0KKw0KKwlPUENPREVfQ09NUFVURVIoIEZPUksgKSA9IG5ldyBBdm1QcmltaXRpdmVfRm9yayggKnRoaXMgKTsNCisJT1BDT0RFX0NPTVBVVEVSKCBKT0lOICkgPSBuZXcgQXZtUHJpbWl0aXZlX0pvaW4oICp0aGlzICk7DQorDQorCU9QQ09ERV9DT01QVVRFUiggSU5QVVRfRU5BQkxFRCApID0gbmV3IEF2bVByaW1pdGl2ZV9JbnB1dEVuYWJsZWQoICp0aGlzICk7DQorDQorCU9QQ09ERV9DT01QVVRFUiggUkRWICApID0gbmV3IEF2bVByaW1pdGl2ZV9SZHYoICp0aGlzICk7DQorDQorCU9QQ09ERV9DT01QVVRFUiggU1lOQ0hST05JWkUgKSA9IG5ldyBBdm1QcmltaXRpdmVfU3luY2hyb25pemUoICp0aGlzICk7DQorDQorDQorCXJldHVybiggdHJ1ZSApOw0KK30NCisNCisNCitib29sIEF2bVByaW1pdGl2ZVByb2Nlc3Nvcjo6Y29uZmlndXJlU3RhdHVzUHJpbWl0aXZlKCkNCit7DQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisJLy8gQVZNIE1BQ0hJTkUgU1RBVFVTDQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisJT1BDT0RFX0NPTVBVVEVSKCBTVEFUVVNfV0FTICAgKSA9IG5ldyBBdm1QcmltaXRpdmVfU3RhdHVzV2FzKCAqdGhpcyApOw0KKwlPUENPREVfQ09NUFVURVIoIFNUQVRVU19JUyAgICApID0gbmV3IEF2bVByaW1pdGl2ZV9TdGF0dXNJcyggKnRoaXMgKTsNCisJT1BDT0RFX0NPTVBVVEVSKCBTVEFUVVNfQkVJTkcgKSA9IG5ldyBBdm1QcmltaXRpdmVfU3RhdHVzQmVpbmcoICp0aGlzICk7DQorCU9QQ09ERV9DT01QVVRFUiggU1RBVFVTX1dJTEwgICkgPSBuZXcgQXZtUHJpbWl0aXZlX1N0YXR1c1dpbGwoICp0aGlzICk7DQorDQorCU9QQ09ERV9DT01QVVRFUiggQ0hBTkdFRCAgICAgICkgPSBuZXcgQXZtUHJpbWl0aXZlX0NoYW5nZWQoICp0aGlzICk7DQorCU9QQ09ERV9DT01QVVRFUiggQ0hBTkdFRF9UTyAgICkgPSBuZXcgQXZtUHJpbWl0aXZlX0NoYW5nZWRUbyggKnRoaXMgKTsNCisNCisJcmV0dXJuKCB0cnVlICk7DQorfQ0KKw0KKw0KK2Jvb2wgQXZtUHJpbWl0aXZlUHJvY2Vzc29yOjpjb25maWd1cmVDb25jdXJyZW5jeVByaW1pdGl2ZSgpDQorew0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorCS8vIEFWTSBQUk9HUkFNIFNDSEVEVUxJTkcNCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwlPUENPREVfQ09NUFVURVIoIEFTWU5DSFJPTk9VUyAgICAgICApID0gbmV3IEF2bVByaW1pdGl2ZV9Bc3luY2hyb25vdXMoICp0aGlzICk7DQorCU9QQ09ERV9DT01QVVRFUiggU1RST05HX1NZTkNIUk9OT1VTICkgPSBuZXcgQXZtUHJpbWl0aXZlX1N0cm9uZ1N5bmNocm9ub3VzKCAqdGhpcyApOw0KKwlPUENPREVfQ09NUFVURVIoIFdFQUtfU1lOQ0hST05PVVMgICApID0gbmV3IEF2bVByaW1pdGl2ZV9XZWFrU3luY2hyb25vdXMoICp0aGlzICk7DQorCU9QQ09ERV9DT01QVVRFUiggSU5URVJMRUFWSU5HICAgICAgICkgPSBuZXcgQXZtUHJpbWl0aXZlX0ludGVybGVhdmluZyggKnRoaXMgKTsNCisJT1BDT0RFX0NPTVBVVEVSKCBQQVJBTExFTCAgICAgICAgICAgKSA9IG5ldyBBdm1QcmltaXRpdmVfUGFyYWxsZWwoICp0aGlzICk7DQorDQorCU9QQ09ERV9DT01QVVRFUiggUkRWX0FTWU5DSFJPTk9VUyAgICAgICApID0gbmV3IEF2bVByaW1pdGl2ZV9SZHZBc3luY2hyb25vdXMoICp0aGlzICk7DQorCU9QQ09ERV9DT01QVVRFUiggUkRWX1NUUk9OR19TWU5DSFJPTk9VUyApID0gbmV3IEF2bVByaW1pdGl2ZV9SZHZTdHJvbmdTeW5jaHJvbm91cyggKnRoaXMgKTsNCisJT1BDT0RFX0NPTVBVVEVSKCBSRFZfV0VBS19TWU5DSFJPTk9VUyAgICkgPSBuZXcgQXZtUHJpbWl0aXZlX1JkdldlYWtTeW5jaHJvbm91cyggKnRoaXMgKTsNCisJT1BDT0RFX0NPTVBVVEVSKCBSRFZfSU5URVJMRUFWSU5HICAgICAgICkgPSBuZXcgQXZtUHJpbWl0aXZlX1JkdkludGVybGVhdmluZyggKnRoaXMgKTsNCisJT1BDT0RFX0NPTVBVVEVSKCBSRFZfUEFSQUxMRUwgICAgICAgICAgICkgPSBuZXcgQXZtUHJpbWl0aXZlX1JkdlBhcmFsbGVsKCAqdGhpcyApOw0KKw0KKw0KKwlPUENPREVfQ09NUFVURVIoIEVYQ0xVU0lWRSAgICAgICkgPSBuZXcgQXZtUHJpbWl0aXZlX0V4Y2x1c2l2ZSggKnRoaXMgKTsNCisJT1BDT0RFX0NPTVBVVEVSKCBOT05ERVRFUk1JTklTTSApID0gbmV3IEF2bVByaW1pdGl2ZV9Ob25kZXRlcm1pbmlzbSggKnRoaXMgKTsNCisNCisJT1BDT0RFX0NPTVBVVEVSKCBQUklPUl9HVCAgICAgICApID0gbmV3IEF2bVByaW1pdGl2ZV9QcmlvciggKnRoaXMgKTsNCisJT1BDT0RFX0NPTVBVVEVSKCBQUklPUl9MVCAgICAgICApID0gbmV3IEF2bVByaW1pdGl2ZV9QcmlvciggKnRoaXMgKTsNCisNCisJT1BDT0RFX0NPTVBVVEVSKCBTQ0hFRFVMRV9BTkRfVEhFTiApID0gbmV3IEF2bVByaW1pdGl2ZV9TY2hlZHVsZUFuZFRoZW4oICp0aGlzICk7DQorCU9QQ09ERV9DT01QVVRFUiggU0NIRURVTEVfT1JfRUxTRSAgKSA9IG5ldyBBdm1QcmltaXRpdmVfU2NoZWR1bGVPckVsc2UoICp0aGlzICk7DQorDQorCU9QQ09ERV9DT01QVVRFUiggQVRPTUlDX1NFUVVFTkNFICkgPSBuZXcgQXZtUHJpbWl0aXZlX0F0b21pY1NlcXVlbmNlKCAqdGhpcyApOw0KKwlPUENPREVfQ09NUFVURVIoIFNFUVVFTkNFICAgICAgICApID0gbmV3IEF2bVByaW1pdGl2ZV9TZXF1ZW5jZSggKnRoaXMgKTsNCisJT1BDT0RFX0NPTVBVVEVSKCBTRVFVRU5DRV9TSURFICAgKSA9IG5ldyBBdm1QcmltaXRpdmVfU2lkZVNlcXVlbmNlKCAqdGhpcyApOw0KKwlPUENPREVfQ09NUFVURVIoIFNFUVVFTkNFX1dFQUsgICApID0gbmV3IEF2bVByaW1pdGl2ZV9XZWFrU2VxdWVuY2UoICp0aGlzICk7DQorDQorCU9QQ09ERV9DT01QVVRFUiggUFJPRFVDVCAgICAgICAgICkgPSBuZXcgQXZtUHJpbWl0aXZlX1Byb2R1Y3QoICp0aGlzICk7DQorDQorDQorCXJldHVybiggdHJ1ZSApOw0KK30NCisNCisNCitib29sIEF2bVByaW1pdGl2ZVByb2Nlc3Nvcjo6Y29uZmlndXJlQmFzaWNQcmltaXRpdmUoKQ0KK3sNCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwkvLyBBVk0gQlVGRkVSIE1BTkFHSU5HDQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisJT1BDT0RFX0NPTVBVVEVSKCBVUERBVEVfQlVGRkVSICkgPSBuZXcgQXZtUHJpbWl0aXZlX1VwZGF0ZUJ1ZmZlciggKnRoaXMgKTsNCisNCisNCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwkvLyBBVk0gUFJJTUlUSVZFIFNUQVRFTUVOVA0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorCU9QQ09ERV9DT01QVVRFUiggQVNTSUdOICAgICAgICApID0gbmV3IEF2bVByaW1pdGl2ZV9Bc3NpZ25tZW50KCAqdGhpcyApOw0KKwlPUENPREVfQ09NUFVURVIoIEFTU0lHTl9BRlRFUiAgKSA9IG5ldyBBdm1QcmltaXRpdmVfQXNzaWdubWVudEFmdGVyKCAqdGhpcyApOw0KKwlPUENPREVfQ09NUFVURVIoIEFTU0lHTl9PUF9BRlRFUiApID0gbmV3IEF2bVByaW1pdGl2ZV9Bc3NpZ25tZW50T3BBZnRlciggKnRoaXMgKTsNCisNCisJT1BDT0RFX0NPTVBVVEVSKCBBU1NJR05fUkVGICAgICkgPSBuZXcgQXZtUHJpbWl0aXZlX0Fzc2lnbm1lbnRSZWYoICp0aGlzICk7DQorCU9QQ09ERV9DT01QVVRFUiggQVNTSUdOX01BQ1JPICApID0gbmV3IEF2bVByaW1pdGl2ZV9Bc3NpZ25tZW50TWFjcm8oICp0aGlzICk7DQorDQorCU9QQ09ERV9DT01QVVRFUiggQVNTSUdOX05FV0ZSRVNIICkgPSBuZXcgQXZtUHJpbWl0aXZlX0Fzc2lnbk5ld0ZyZXNoKCAqdGhpcyApOw0KKw0KKwlPUENPREVfQ09NUFVURVIoIEFTU0lHTl9SRVNFVCAgICApID0gbmV3IEF2bVByaW1pdGl2ZV9Bc3NpZ25SZXNldCggKnRoaXMgKTsNCisNCisJT1BDT0RFX0NPTVBVVEVSKCBHVUFSRCAgICAgICAgICkgPSBuZXcgQXZtUHJpbWl0aXZlX0d1YXJkKCAqdGhpcyApOw0KKwlPUENPREVfQ09NUFVURVIoIFRJTUVEX0dVQVJEICAgKSA9IG5ldyBBdm1QcmltaXRpdmVfVGltZWRHdWFyZCggKnRoaXMgKTsNCisNCisJT1BDT0RFX0NPTVBVVEVSKCBFVkVOVCAgICAgICAgICkgPSBuZXcgQXZtUHJpbWl0aXZlX0V2ZW50KCAqdGhpcyApOw0KKwlPUENPREVfQ09NUFVURVIoIENIRUNLX1NBVCAgICAgKSA9IG5ldyBBdm1QcmltaXRpdmVfQ2hlY2tTYXQoICp0aGlzICk7DQorDQorDQorCU9QQ09ERV9DT01QVVRFUiggSU5QVVQgICAgICAgICAgICApID0gbmV3IEF2bVByaW1pdGl2ZV9JbnB1dCggKnRoaXMgKTsNCisJT1BDT0RFX0NPTVBVVEVSKCBJTlBVVF9GUk9NICAgICAgICkgPSBuZXcgQXZtUHJpbWl0aXZlX0lucHV0RnJvbSggKnRoaXMgKTsNCisJLy8gT3B0aW1pemVkIHZlcnNpb24gb2YgSU5QVVQNCisJT1BDT0RFX0NPTVBVVEVSKCBJTlBVVF9WQVIgICAgICAgICkgPSBuZXcgQXZtUHJpbWl0aXZlX0lucHV0VmFyKCAqdGhpcyApOw0KKwlPUENPREVfQ09NUFVURVIoIElOUFVUX0VOViAgICAgICAgKSA9IG5ldyBBdm1QcmltaXRpdmVfSW5wdXRFbnYoICp0aGlzICk7DQorCU9QQ09ERV9DT01QVVRFUiggSU5QVVRfQlVGRkVSICAgICApID0gbmV3IEF2bVByaW1pdGl2ZV9JbnB1dEJ1ZmZlciggKnRoaXMgKTsNCisJT1BDT0RFX0NPTVBVVEVSKCBJTlBVVF9SRFYgICAgICAgICkgPSBuZXcgQXZtUHJpbWl0aXZlX0lucHV0UmR2KCAqdGhpcyApOw0KKw0KKwlPUENPREVfQ09NUFVURVIoIElOUFVUX0ZMT1cgICAgICAgKSA9IG5ldyBBdm1QcmltaXRpdmVfSW5wdXQoICp0aGlzICk7DQorCU9QQ09ERV9DT01QVVRFUiggSU5QVVRfQlJPQURDQVNUICApID0gbmV3IEF2bVByaW1pdGl2ZV9JbnB1dCggKnRoaXMgKTsNCisJT1BDT0RFX0NPTVBVVEVSKCBJTlBVVF9ERUxFR0FURSAgICkgPSBuZXcgQXZtUHJpbWl0aXZlX0lucHV0KCAqdGhpcyApOw0KKw0KKw0KKwlPUENPREVfQ09NUFVURVIoIE9VVFBVVCAgICAgICAgICAgKSA9IG5ldyBBdm1QcmltaXRpdmVfT3V0cHV0KCAqdGhpcyApOw0KKwlPUENPREVfQ09NUFVURVIoIE9VVFBVVF9UTyAgICAgICAgKSA9IG5ldyBBdm1QcmltaXRpdmVfT3V0cHV0VG8oICp0aGlzICk7DQorCS8vIE9wdGltaXplZCB2ZXJzaW9uIG9mIE9VVFBVVA0KKwlPUENPREVfQ09NUFVURVIoIE9VVFBVVF9WQVIgICAgICAgKSA9IG5ldyBBdm1QcmltaXRpdmVfT3V0cHV0VmFyKCAqdGhpcyApOw0KKwlPUENPREVfQ09NUFVURVIoIE9VVFBVVF9FTlYgICAgICAgKSA9IG5ldyBBdm1QcmltaXRpdmVfT3V0cHV0RW52KCAqdGhpcyApOw0KKwlPUENPREVfQ09NUFVURVIoIE9VVFBVVF9CVUZGRVIgICAgKSA9IG5ldyBBdm1QcmltaXRpdmVfT3V0cHV0QnVmZmVyKCAqdGhpcyApOw0KKwlPUENPREVfQ09NUFVURVIoIE9VVFBVVF9SRFYgICAgICAgKSA9IG5ldyBBdm1QcmltaXRpdmVfT3V0cHV0UmR2KCAqdGhpcyApOw0KKw0KKwlPUENPREVfQ09NUFVURVIoIE9VVFBVVF9GTE9XICAgICAgKSA9IG5ldyBBdm1QcmltaXRpdmVfT3V0cHV0KCAqdGhpcyApOw0KKwlPUENPREVfQ09NUFVURVIoIE9VVFBVVF9CUk9BRENBU1QgKSA9IG5ldyBBdm1QcmltaXRpdmVfT3V0cHV0KCAqdGhpcyApOw0KKwlPUENPREVfQ09NUFVURVIoIE9VVFBVVF9ERUxFR0FURSAgKSA9IG5ldyBBdm1QcmltaXRpdmVfT3V0cHV0KCAqdGhpcyApOw0KKw0KKw0KKwlPUENPREVfQ09NUFVURVIoIFBSRVNFTlQgICAgICAgKSA9IG5ldyBBdm1QcmltaXRpdmVfUHJlc2VudCggKnRoaXMgKTsNCisJT1BDT0RFX0NPTVBVVEVSKCBBQlNFTlQgICAgICAgICkgPSBuZXcgQXZtUHJpbWl0aXZlX0Fic2VudCggKnRoaXMgKTsNCisNCisJT1BDT0RFX0NPTVBVVEVSKCBJRiAgICAgICAgICAgICkgPSBuZXcgQXZtUHJpbWl0aXZlX0lmKCAqdGhpcyApOw0KKwlPUENPREVfQ09NUFVURVIoIElGRSAgICAgICAgICAgKSA9IG5ldyBBdm1QcmltaXRpdmVfSWZlKCAqdGhpcyApOw0KKw0KKwlPUENPREVfQ09NUFVURVIoIEZPUiAgICAgICAgICAgKSA9IG5ldyBBdm1QcmltaXRpdmVfRm9yKCAqdGhpcyApOw0KKwlPUENPREVfQ09NUFVURVIoIEZPUkVBQ0ggICAgICAgKSA9IG5ldyBBdm1QcmltaXRpdmVfRm9yZWFjaCggKnRoaXMgKTsNCisJT1BDT0RFX0NPTVBVVEVSKCBXSElMRV9ETyAgICAgICkgPSBuZXcgQXZtUHJpbWl0aXZlX1doaWxlRG8oICp0aGlzICk7DQorCU9QQ09ERV9DT01QVVRFUiggRE9fV0hJTEUgICAgICApID0gbmV3IEF2bVByaW1pdGl2ZV9Eb1doaWxlKCAqdGhpcyApOw0KKw0KKwlPUENPREVfQ09NUFVURVIoIEJSRUFLICAgICAgICAgKSA9IG5ldyBBdm1QcmltaXRpdmVfQnJlYWsoICp0aGlzICk7DQorCU9QQ09ERV9DT01QVVRFUiggQ09OVElOVUUgICAgICApID0gbmV3IEF2bVByaW1pdGl2ZV9Db250aW51ZSggKnRoaXMgKTsNCisJT1BDT0RFX0NPTVBVVEVSKCBSRVRVUk4gICAgICAgICkgPSBuZXcgQXZtUHJpbWl0aXZlX1JldHVybiggKnRoaXMgKTsNCisJT1BDT0RFX0NPTVBVVEVSKCBFWElUICAgICAgICAgICkgPSBuZXcgQXZtUHJpbWl0aXZlX0V4aXQoICp0aGlzICk7DQorDQorCU9QQ09ERV9DT01QVVRFUiggU1RFUF9NQVJLICAgICApID0gbmV3IEF2bVByaW1pdGl2ZV9TdGVwTWFyayggKnRoaXMgKTsNCisNCisNCisJcmV0dXJuKCB0cnVlICk7DQorfQ0KKw0KKw0KK2Jvb2wgQXZtUHJpbWl0aXZlUHJvY2Vzc29yOjpjb25maWd1cmVCaXR3aXNlUHJpbWl0aXZlKCkNCit7DQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisJLy8gQVZNIEJJVFdJU0UgRVhQUkVTU0lPTg0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorCU9QQ09ERV9DT01QVVRFUiggQk5PVCAgICkgPSBuZXcgQXZtUHJpbWl0aXZlX0JOT1QoICp0aGlzICk7DQorDQorCU9QQ09ERV9DT01QVVRFUiggQkFORCAgICkgPSBuZXcgQXZtUHJpbWl0aXZlX0JBTkQoICp0aGlzICk7DQorCU9QQ09ERV9DT01QVVRFUiggQk9SICAgICkgPSBuZXcgQXZtUHJpbWl0aXZlX0JPUiggKnRoaXMgKTsNCisJT1BDT0RFX0NPTVBVVEVSKCBCWE9SICAgKSA9IG5ldyBBdm1QcmltaXRpdmVfQlhPUiggKnRoaXMgKTsNCisNCisJT1BDT0RFX0NPTVBVVEVSKCBMU0hJRlQgKSA9IG5ldyBBdm1QcmltaXRpdmVfTFNISUZUKCAqdGhpcyApOw0KKwlPUENPREVfQ09NUFVURVIoIFJTSElGVCApID0gbmV3IEF2bVByaW1pdGl2ZV9SU0hJRlQoICp0aGlzICk7DQorDQorDQorCXJldHVybiggdHJ1ZSApOw0KK30NCisNCisNCitib29sIEF2bVByaW1pdGl2ZVByb2Nlc3Nvcjo6Y29uZmlndXJlTG9naWNQcmltaXRpdmUoKQ0KK3sNCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwkvLyBBVk0gUFJFRElDQVQgRVhQUkVTU0lPTg0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorCU9QQ09ERV9DT01QVVRFUiggTk9UICAgICAgKSA9IERFRkFVTFRfRVZBTF9FWFBSRVNTSU9OX0FMVTsNCisNCisJT1BDT0RFX0NPTVBVVEVSKCBBTkQgICAgICApID0gREVGQVVMVF9FVkFMX0VYUFJFU1NJT05fQUxVOw0KKwlPUENPREVfQ09NUFVURVIoIEFORF9USEVOICkgPSBERUZBVUxUX0VWQUxfRVhQUkVTU0lPTl9BTFU7DQorCU9QQ09ERV9DT01QVVRFUiggTkFORCAgICAgKSA9IERFRkFVTFRfRVZBTF9FWFBSRVNTSU9OX0FMVTsNCisNCisJT1BDT0RFX0NPTVBVVEVSKCBYQU5EICAgICApID0gREVGQVVMVF9FVkFMX0VYUFJFU1NJT05fQUxVOw0KKw0KKwlPUENPREVfQ09NUFVURVIoIE9SICAgICAgICkgPSBERUZBVUxUX0VWQUxfRVhQUkVTU0lPTl9BTFU7DQorCU9QQ09ERV9DT01QVVRFUiggT1JfRUxTRSAgKSA9IERFRkFVTFRfRVZBTF9FWFBSRVNTSU9OX0FMVTsNCisJT1BDT0RFX0NPTVBVVEVSKCBOT1IgICAgICApID0gREVGQVVMVF9FVkFMX0VYUFJFU1NJT05fQUxVOw0KKw0KKwlPUENPREVfQ09NUFVURVIoIFhPUiAgICAgICkgPSBERUZBVUxUX0VWQUxfRVhQUkVTU0lPTl9BTFU7DQorCU9QQ09ERV9DT01QVVRFUiggWE5PUiAgICAgKSA9IERFRkFVTFRfRVZBTF9FWFBSRVNTSU9OX0FMVTsNCisNCisNCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwkvLyBBVk0gQ09NUEFSSVNPTiBFWFBSRVNTSU9ODQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisNCisJT1BDT0RFX0NPTVBVVEVSKCBFUSAgICkgPSBERUZBVUxUX0VWQUxfRVhQUkVTU0lPTl9BTFU7DQorCU9QQ09ERV9DT01QVVRFUiggTkVRICApID0gREVGQVVMVF9FVkFMX0VYUFJFU1NJT05fQUxVOw0KKw0KKwlPUENPREVfQ09NUFVURVIoIFNFUSAgKSA9IERFRkFVTFRfRVZBTF9FWFBSRVNTSU9OX0FMVTsNCisJT1BDT0RFX0NPTVBVVEVSKCBOU0VRICkgPSBERUZBVUxUX0VWQUxfRVhQUkVTU0lPTl9BTFU7DQorDQorCU9QQ09ERV9DT01QVVRFUiggTFQgICApID0gREVGQVVMVF9FVkFMX0VYUFJFU1NJT05fQUxVOw0KKwlPUENPREVfQ09NUFVURVIoIExURSAgKSA9IERFRkFVTFRfRVZBTF9FWFBSRVNTSU9OX0FMVTsNCisNCisJT1BDT0RFX0NPTVBVVEVSKCBHVCAgICkgPSBERUZBVUxUX0VWQUxfRVhQUkVTU0lPTl9BTFU7DQorCU9QQ09ERV9DT01QVVRFUiggR1RFICApID0gREVGQVVMVF9FVkFMX0VYUFJFU1NJT05fQUxVOw0KKw0KKw0KKwlyZXR1cm4oIHRydWUgKTsNCit9DQorDQorDQorYm9vbCBBdm1QcmltaXRpdmVQcm9jZXNzb3I6OmNvbmZpZ3VyZUFyaXRobWV0aWNQcmltaXRpdmUoKQ0KK3sNCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwkvLyBBVk0gQVJJVEhNRVRJQyBFWFBSRVNTSU9ODQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisNCisJT1BDT0RFX0NPTVBVVEVSKCBQTFVTICAgKSA9IERFRkFVTFRfRVZBTF9FWFBSRVNTSU9OX0FMVTsNCisJT1BDT0RFX0NPTVBVVEVSKCBNSU5VUyAgKSA9IERFRkFVTFRfRVZBTF9FWFBSRVNTSU9OX0FMVTsNCisJT1BDT0RFX0NPTVBVVEVSKCBVTUlOVVMgKSA9IERFRkFVTFRfRVZBTF9FWFBSRVNTSU9OX0FMVTsNCisNCisJT1BDT0RFX0NPTVBVVEVSKCBNVUxUICAgKSA9IERFRkFVTFRfRVZBTF9FWFBSRVNTSU9OX0FMVTsNCisJT1BDT0RFX0NPTVBVVEVSKCBQT1cgICAgKSA9IERFRkFVTFRfRVZBTF9FWFBSRVNTSU9OX0FMVTsNCisNCisJT1BDT0RFX0NPTVBVVEVSKCBESVYgICAgKSA9IERFRkFVTFRfRVZBTF9FWFBSRVNTSU9OX0FMVTsNCisNCisJT1BDT0RFX0NPTVBVVEVSKCBNT0QgICAgKSA9IG5ldyBBdm1QcmltaXRpdmVfTU9EKCAqdGhpcyApOw0KKw0KKw0KKwlyZXR1cm4oIHRydWUgKTsNCit9DQorDQorDQorYm9vbCBBdm1QcmltaXRpdmVQcm9jZXNzb3I6OmNvbmZpZ3VyZUxvb2t1cFByaW1pdGl2ZSgpDQorew0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorCS8vIExPT0tVUCBTVEFURU1FTlQNCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwlPUENPREVfQ09NUFVURVIoIExPT0tVUF9JTlQgICAgICAgKSA9IG5ldyBBdm1QcmltaXRpdmVfTG9va3VwX0ludCggKnRoaXMgKTsNCisNCisJT1BDT0RFX0NPTVBVVEVSKCBMT09LVVBfSU5UX0VYVCAgICkgPSBuZXcgQXZtUHJpbWl0aXZlX0xvb2t1cF9JbnRFeHQoICp0aGlzICk7DQorDQorCU9QQ09ERV9DT01QVVRFUiggTE9PS1VQX05FQVJFU1QgICApID0gbmV3IEF2bVByaW1pdGl2ZV9Mb29rdXBfTmVhcmVzdCggKnRoaXMgKTsNCisNCisJT1BDT0RFX0NPTVBVVEVSKCBMT09LVVBfQkVMT1cgICAgICkgPSBuZXcgQXZtUHJpbWl0aXZlX0xvb2t1cF9CZWxvdyggKnRoaXMgKTsNCisNCisJT1BDT0RFX0NPTVBVVEVSKCBMT09LVVBfQUJPVkUgICAgICkgPSBuZXcgQXZtUHJpbWl0aXZlX0xvb2t1cF9BYm92ZSggKnRoaXMgKTsNCisNCisNCisJT1BDT0RFX0NPTVBVVEVSKCBMT09LVVAyRF9JTlRfRVhUICkgPSBuZXcgQXZtUHJpbWl0aXZlX0xvb2t1cDJEX0ludEV4dCggKnRoaXMgKTsNCisNCisNCisJcmV0dXJuKCB0cnVlICk7DQorfQ0KKw0KKw0KK2Jvb2wgQXZtUHJpbWl0aXZlUHJvY2Vzc29yOjpjb25maWd1cmVNYXRoZW1hdGljUHJpbWl0aXZlKCkNCit7DQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisJLy8gQVZNIE1BVEhFTUFUSUNBTCBGVU5DVElPTg0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorCS8vIE1JTiAtIE1BWA0KKwlPUENPREVfQ09NUFVURVIoIE1JTiApID0gbmV3IEF2bVByaW1pdGl2ZV9NSU4oICp0aGlzICk7DQorCU9QQ09ERV9DT01QVVRFUiggTUFYICkgPSBuZXcgQXZtUHJpbWl0aXZlX01BWCggKnRoaXMgKTsNCisNCisJLy8gUkFORE9NDQorCU9QQ09ERV9DT01QVVRFUiggUkFORE9NICkgPSBuZXcgQXZtUHJpbWl0aXZlX1JBTkRPTSggKnRoaXMgKTsNCisNCisJLy8gQUJTDQorCU9QQ09ERV9DT01QVVRFUiggQUJTICkgPSBuZXcgQXZtUHJpbWl0aXZlX0FCUyggKnRoaXMgKTsNCisNCisJLy8gUk9VTkRJTkcNCisJT1BDT0RFX0NPTVBVVEVSKCBDRUlMICAgICApID0gbmV3IEF2bVByaW1pdGl2ZV9DRUlMKCAqdGhpcyApOw0KKwlPUENPREVfQ09NUFVURVIoIEZMT09SICAgICkgPSBuZXcgQXZtUHJpbWl0aXZlX0ZMT09SKCAqdGhpcyApOw0KKwlPUENPREVfQ09NUFVURVIoIFJPVU5EICAgICkgPSBuZXcgQXZtUHJpbWl0aXZlX1JPVU5EKCAqdGhpcyApOw0KKwlPUENPREVfQ09NUFVURVIoIFRSVU5DQVRFICkgPSBuZXcgQXZtUHJpbWl0aXZlX1RSVU5DQVRFKCAqdGhpcyApOw0KKw0KKw0KKwkvLyBFWFAgLSBMT0cNCisJT1BDT0RFX0NPTVBVVEVSKCBTUVJUICkgPSBuZXcgQXZtUHJpbWl0aXZlX1NRUlQoICp0aGlzICk7DQorDQorCU9QQ09ERV9DT01QVVRFUiggRVhQICApID0gbmV3IEF2bVByaW1pdGl2ZV9FWFAoICp0aGlzICk7DQorCU9QQ09ERV9DT01QVVRFUiggTE9HICApID0gbmV3IEF2bVByaW1pdGl2ZV9MT0coICp0aGlzICk7DQorDQorCS8vIFRSSUdPTk9NRVRSSUMNCisJT1BDT0RFX0NPTVBVVEVSKCBTSU4gKSA9IG5ldyBBdm1QcmltaXRpdmVfU0lOKCAqdGhpcyApOw0KKwlPUENPREVfQ09NUFVURVIoIENPUyApID0gbmV3IEF2bVByaW1pdGl2ZV9DT1MoICp0aGlzICk7DQorCU9QQ09ERV9DT01QVVRFUiggVEFOICkgPSBuZXcgQXZtUHJpbWl0aXZlX1RBTiggKnRoaXMgKTsNCisNCisJT1BDT0RFX0NPTVBVVEVSKCBTSU5IICkgPSBuZXcgQXZtUHJpbWl0aXZlX1NJTkgoICp0aGlzICk7DQorCU9QQ09ERV9DT01QVVRFUiggQ09TSCApID0gbmV3IEF2bVByaW1pdGl2ZV9DT1NIKCAqdGhpcyApOw0KKwlPUENPREVfQ09NUFVURVIoIFRBTkggKSA9IG5ldyBBdm1QcmltaXRpdmVfVEFOSCggKnRoaXMgKTsNCisNCisJT1BDT0RFX0NPTVBVVEVSKCBBU0lOICApID0gbmV3IEF2bVByaW1pdGl2ZV9BU0lOKCAqdGhpcyApOw0KKwlPUENPREVfQ09NUFVURVIoIEFDT1MgICkgPSBuZXcgQXZtUHJpbWl0aXZlX0FDT1MoICp0aGlzICk7DQorCU9QQ09ERV9DT01QVVRFUiggQVRBTiAgKSA9IG5ldyBBdm1QcmltaXRpdmVfQVRBTiggKnRoaXMgKTsNCisJT1BDT0RFX0NPTVBVVEVSKCBBVEFOMiApID0gbmV3IEF2bVByaW1pdGl2ZV9BVEFOMiggKnRoaXMgKTsNCisNCisJT1BDT0RFX0NPTVBVVEVSKCBBU0lOSCApID0gbmV3IEF2bVByaW1pdGl2ZV9BU0lOSCggKnRoaXMgKTsNCisJT1BDT0RFX0NPTVBVVEVSKCBBQ09TSCApID0gbmV3IEF2bVByaW1pdGl2ZV9BQ09TSCggKnRoaXMgKTsNCisJT1BDT0RFX0NPTVBVVEVSKCBBVEFOSCApID0gbmV3IEF2bVByaW1pdGl2ZV9BVEFOSCggKnRoaXMgKTsNCisNCisJcmV0dXJuKCB0cnVlICk7DQorfQ0KKw0KKw0KK2Jvb2wgQXZtUHJpbWl0aXZlUHJvY2Vzc29yOjpjb25maWd1cmVTdHJpbmdQcmltaXRpdmUoKQ0KK3sNCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwkvLyBBVk0gU1RSSU5HIC8gQ09MTEVDVElPTiBPUEVSQVRPUg0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorCU9QQ09ERV9DT01QVVRFUiggQ09OVEFJTlMgKSA9IG5ldyBBdm1QcmltaXRpdmVfQ09OVEFJTlMoICp0aGlzICk7DQorDQorCU9QQ09ERV9DT01QVVRFUiggSU4gICAgKSA9IG5ldyBBdm1QcmltaXRpdmVfSU4oICp0aGlzICk7DQorCU9QQ09ERV9DT01QVVRFUiggTk9USU4gKSA9IG5ldyBBdm1QcmltaXRpdmVfTk9USU4oICp0aGlzICk7DQorDQorCU9QQ09ERV9DT01QVVRFUiggU1VCU0VUICAgICkgPSBERUZBVUxUX0FWTV9QUklNSVRJVkU7DQorCU9QQ09ERV9DT01QVVRFUiggU1VCU0VURVEgICkgPSBERUZBVUxUX0FWTV9QUklNSVRJVkU7DQorDQorCU9QQ09ERV9DT01QVVRFUiggSU5URVJTRUNUICkgPSBERUZBVUxUX0FWTV9QUklNSVRJVkU7DQorDQorCU9QQ09ERV9DT01QVVRFUiggU1RBUlRTX1dJVEggKSA9IERFRkFVTFRfQVZNX1BSSU1JVElWRTsNCisJT1BDT0RFX0NPTVBVVEVSKCBFTkRTX1dJVEggICApID0gREVGQVVMVF9BVk1fUFJJTUlUSVZFOw0KKwlPUENPREVfQ09NUFVURVIoIENPTkNBVCAgICAgICkgPSBERUZBVUxUX0FWTV9QUklNSVRJVkU7DQorDQorDQorCU9QQ09ERV9DT01QVVRFUiggQVBQRU5EICkgPSBuZXcgQXZtUHJpbWl0aXZlX0FQUEVORCggKnRoaXMgKTsNCisJT1BDT0RFX0NPTVBVVEVSKCBSRU1PVkUgKSA9IG5ldyBBdm1QcmltaXRpdmVfUkVNT1ZFKCAqdGhpcyApOw0KKwlPUENPREVfQ09NUFVURVIoIENMRUFSICApID0gbmV3IEF2bVByaW1pdGl2ZV9DTEVBUiggKnRoaXMgKTsNCisJT1BDT0RFX0NPTVBVVEVSKCBSRVNJWkUgKSA9IG5ldyBBdm1QcmltaXRpdmVfUkVTSVpFKCAqdGhpcyApOw0KKw0KKwlPUENPREVfQ09NUFVURVIoIFBVU0ggICAgICAgKSA9IG5ldyBBdm1QcmltaXRpdmVfUFVTSCggKnRoaXMgKTsNCisJT1BDT0RFX0NPTVBVVEVSKCBBU1NJR05fVE9QICkgPSBuZXcgQXZtUHJpbWl0aXZlX0FTU0lHTl9UT1AoICp0aGlzICk7DQorCU9QQ09ERV9DT01QVVRFUiggVE9QICAgICAgICApID0gbmV3IEF2bVByaW1pdGl2ZV9UT1AoICp0aGlzICk7DQorCU9QQ09ERV9DT01QVVRFUiggUE9QICAgICAgICApID0gbmV3IEF2bVByaW1pdGl2ZV9QT1AoICp0aGlzICk7DQorCU9QQ09ERV9DT01QVVRFUiggUE9QX0ZST00gICApID0gbmV3IEF2bVByaW1pdGl2ZV9QT1BfRlJPTSggKnRoaXMgKTsNCisNCisJT1BDT0RFX0NPTVBVVEVSKCBFTVBUWSAgICAgKSA9IG5ldyBBdm1QcmltaXRpdmVfRU1QVFkoICp0aGlzICk7DQorCU9QQ09ERV9DT01QVVRFUiggTk9ORU1QVFkgICkgPSBuZXcgQXZtUHJpbWl0aXZlX05PTkVNUFRZKCAqdGhpcyApOw0KKwlPUENPREVfQ09NUFVURVIoIFNJTkdMRVRPTiApID0gbmV3IEF2bVByaW1pdGl2ZV9TSU5HTEVUT04oICp0aGlzICk7DQorCU9QQ09ERV9DT01QVVRFUiggUE9QVUxBVEVEICkgPSBuZXcgQXZtUHJpbWl0aXZlX1BPUFVMQVRFRCggKnRoaXMgKTsNCisJT1BDT0RFX0NPTVBVVEVSKCBGVUxMICAgICAgKSA9IG5ldyBBdm1QcmltaXRpdmVfRlVMTCggKnRoaXMgKTsNCisNCisJT1BDT0RFX0NPTVBVVEVSKCBTSVpFICAgICAgKSA9IG5ldyBBdm1QcmltaXRpdmVfU0laRSggKnRoaXMgKTsNCisNCisNCisJcmV0dXJuKCB0cnVlICk7DQorfQ0KKw0KKw0KK2Jvb2wgQXZtUHJpbWl0aXZlUHJvY2Vzc29yOjpjb25maWd1cmVJb2x0UHJpbWl0aXZlKCkNCit7DQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisJLy8gSU9MVEwgQkVIQVZJT1JBTCBQUkVESUNBVA0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorCU9QQ09ERV9DT01QVVRFUiggR0xPQkFMTFkgICApID0gREVGQVVMVF9BVk1fUFJJTUlUSVZFOw0KKwlPUENPREVfQ09NUFVURVIoIFVOVElMICAgICAgKSA9IERFRkFVTFRfQVZNX1BSSU1JVElWRTsNCisJT1BDT0RFX0NPTVBVVEVSKCBORVhUICAgICAgICkgPSBERUZBVUxUX0FWTV9QUklNSVRJVkU7DQorCU9QQ09ERV9DT01QVVRFUiggRVZFTlRVQUxMWSApID0gREVGQVVMVF9BVk1fUFJJTUlUSVZFOw0KKwlPUENPREVfQ09NUFVURVIoIFJFTEVBU0VTICAgKSA9IERFRkFVTFRfQVZNX1BSSU1JVElWRTsNCisNCisJT1BDT0RFX0NPTVBVVEVSKCBPQlMgICAgICAgICkgPSBuZXcgQXZtUHJpbWl0aXZlX09CUyggKnRoaXMgKTsNCisNCisNCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwkvLyBJT0xUTCBMT0dJQ0FMIFBSRURJQ0FUDQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisJT1BDT0RFX0NPTVBVVEVSKCBBTkRfVCApID0gREVGQVVMVF9BVk1fUFJJTUlUSVZFOw0KKwlPUENPREVfQ09NUFVURVIoIE9SX1QgICkgPSBERUZBVUxUX0FWTV9QUklNSVRJVkU7DQorCU9QQ09ERV9DT01QVVRFUiggTk9UX1QgKSA9IERFRkFVTFRfQVZNX1BSSU1JVElWRTsNCisJT1BDT0RFX0NPTVBVVEVSKCBJTVBfVCApID0gREVGQVVMVF9BVk1fUFJJTUlUSVZFOw0KKw0KKw0KKwlyZXR1cm4oIHRydWUgKTsNCit9DQorDQorDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vLy8gVE9PTFMgZm9yIFBPU1QtUlVODQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKw0KKw0KK3ZvaWQgQXZtUHJpbWl0aXZlUHJvY2Vzc29yOjpwb3N0UnVuKA0KKwkJRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMsIExpc3RPZkFQRXhlY3V0aW9uRGF0YSAmIHJ1bkVEUykNCit7DQorCWlmKCBydW5FRFMubm9uZW1wdHkoKSApDQorCXsNCisJCWF2bV91aW50MzJfdCBuSGVpZ2h0ID0gYW5FQy5nZXRIZWlnaHQoKSArIDE7DQorCQlhdm1fdWludDMyX3QgYVdpZHRoICA9IGFuRUMuZ2V0V2lkdGgoKTsNCisNCisJCUxpc3RPZkFQRXhlY3V0aW9uRGF0YTo6aXRlcmF0b3IgaXRFRCA9IHJ1bkVEUy5iZWdpbigpOw0KKwkJTGlzdE9mQVBFeGVjdXRpb25EYXRhOjppdGVyYXRvciBlbmRFRCA9IHJ1bkVEUy5lbmQoKTsNCisJCWZvciggOyBpdEVEICE9IGVuZEVEIDsgKytpdEVEICkNCisJCXsNCisJCQlzd2l0Y2goICgqaXRFRCktPm1BRUVTICkNCisJCQl7DQorCQkJCWNhc2UgQUVFU19TVE1OVF9OT1RISU5HOg0KKwkJCQl7DQorCQkJCQlpZiggbm90ICgqaXRFRCktPmhhc1J1bm5hYmxlRWxlbWVudFRyYWNlKCkgKQ0KKwkJCQkJew0KKwkJCQkJCS8vISEgTk9USElORw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKw0KKwkJCQkJLy8hISBOTyBCUkVBaw0KKwkJCQl9DQorDQorCQkJCWRlZmF1bHQ6DQorCQkJCXsNCisvLwkJCQkJaWYoICgoKml0RUQpLT5nZXRFeGVjdXRpb25Db250ZXh0KCkgPT0NCisvLwkJCQkJCQkJCQl0aGVFRC0+Z2V0RXhlY3V0aW9uQ29udGV4dCgpKQ0KKy8vCQkJCQkJCS8qIHx8IChub3QgKCppdEVEKS0+aGFzRXhlY3V0aW9uQ29udGV4dCgpKSAqLyApDQorCQkJCQl7DQorCQkJCQkJYW5FQy5hcHBlbmRDaGlsZENvbnRleHQoDQorCQkJCQkJCW5ldyBFeGVjdXRpb25Db250ZXh0KGFuRUMsICppdEVELCBuSGVpZ2h0LCBhV2lkdGgpICk7DQorCQkJCQl9DQorCQkJCQlicmVhazsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJfQ0KK30NCisNCit2b2lkIEF2bVByaW1pdGl2ZVByb2Nlc3Nvcjo6cG9zdFJ1bigNCisJCUV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDLCBFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikNCit7DQorCXBvc3RSdW4oYW5FQywgRU5WLm91dEVEUyk7DQorDQorCXBvc3RSdW4oYW5FQywgRU5WLmV4aXRFRFMpOw0KKw0KKwlwb3N0UnVuKGFuRUMsIEVOVi5pcnFFRFMpOw0KK30NCisNCisNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8vLyB0aGUgSU5JVCBzdGF0ZW1lbnQNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQordm9pZCBBdm1QcmltaXRpdmVQcm9jZXNzb3I6OmluaXQoRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpDQorew0KK0FWTV9JRl9ERUJVR19OT1RfRkxBRyggUVVBTElGSUVEX05BTUVfSUQgKQ0KKwlCYXNlQ29tcGlsZWRGb3JtOjpVU0VfT05MWV9JRCA9IHRydWU7DQorQVZNX0VORElGX0RFQlVHX05PVF9GTEFHKCBRVUFMSUZJRURfTkFNRV9JRCApDQorDQorLy8JYW5FQy53cml0ZVRyYWNlQmVmb3JlRXhlYyhBVk1fT1NfVFJBQ0UpOw0KKy8vCWFuRUMud3JpdGVUcmFjZUJlZm9yZUV4ZWMoQVZNX09TX0NPVVQpOw0KKw0KKwkvLyBTQVZFIEFORCBVTlNFVCBUSEUgQVNTSUdOIFRBQkxFDQorCWFuRUMucmVzZXREYXRhQmVmb3JlRXZhbHVhdGlvbigpOw0KKw0KKwlFeGVjdXRpb25FbnZpcm9ubWVudCBFTlYoKnRoaXMsICgmIGFuRUMpKTsNCisNCisJaWYoIEVOVi5ydW4oRU5WLmluRUQtPmdldE9uSW5pdCgpKSApDQorCXsNCisJfQ0KKw0KKwkvLyBQT1NULVJVTg0KKwlwb3N0UnVuKGFuRUMsIEVOVik7DQorDQorCS8vIFJFU1RPUkUgVEhFIEFTU0lHTiBUQUJMRQ0KKwlhbkVDLnJlc3RvcmVEYXRhQWZ0ZXJFdmFsdWF0aW9uKCk7DQorDQorDQorLy8JYW5FQy53cml0ZVRyYWNlQWZ0ZXJFeGVjKEFWTV9PU19UUkFDRSk7DQorLy8JYW5FQy53cml0ZVRyYWNlQWZ0ZXJFeGVjKEFWTV9PU19DT1VUKTsNCisNCitBVk1fSUZfREVCVUdfTk9UX0ZMQUcoIFFVQUxJRklFRF9OQU1FX0lEICkNCisJQmFzZUNvbXBpbGVkRm9ybTo6VVNFX09OTFlfSUQgPSBmYWxzZTsNCitBVk1fRU5ESUZfREVCVUdfTk9UX0ZMQUcoIFFVQUxJRklFRF9OQU1FX0lEICkNCisNCit9DQorDQorDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vLy8gdGhlIFJVTiBzdGF0ZW1lbnQNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorLyoqDQorICogdGhlIFJVTiBzdGF0ZW1lbnQNCisgKi8NCit2b2lkIEF2bVByaW1pdGl2ZVByb2Nlc3Nvcjo6cnVuKEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKQ0KK3sNCitBVk1fSUZfREVCVUdfTk9UX0ZMQUcoIFFVQUxJRklFRF9OQU1FX0lEICkNCisJQmFzZUNvbXBpbGVkRm9ybTo6VVNFX09OTFlfSUQgPSB0cnVlOw0KK0FWTV9FTkRJRl9ERUJVR19OT1RfRkxBRyggUVVBTElGSUVEX05BTUVfSUQgKQ0KKw0KKy8vCWFuRUMud3JpdGVUcmFjZUJlZm9yZUV4ZWMoQVZNX09TX1RSQUNFKTsNCisvLwlhbkVDLndyaXRlVHJhY2VCZWZvcmVFeGVjKEFWTV9PU19DT1VUKTsNCisNCisJLy8gU0FWRSBBTkQgVU5TRVQgVEhFIEFTU0lHTiBUQUJMRQ0KKwlhbkVDLnJlc2V0RGF0YUJlZm9yZUV2YWx1YXRpb24oKTsNCisNCisNCisJRXhlY3V0aW9uRW52aXJvbm1lbnQgRU5WKCp0aGlzLCAoJiBhbkVDKSk7DQorDQorCXN3aXRjaCggRU5WLmluRUQtPm1BRUVTICkNCisJew0KKwkJY2FzZSBBRUVTX1NURVBfTUFSSzoNCisJCXsNCisJCQlFTlYuaW5FRC5td3NldEFFRVMoQUVFU19TVEVQX1JFU1VNRSk7DQorDQorCQkJaWYoIGRlY29kZV9yZXN1bWUoIEVOViApICkNCisJCQl7DQorCQkJfQ0KKw0KKwkJCWJyZWFrOw0KKwkJfQ0KKw0KKwkJY2FzZSBBRUVTX1NUTU5UX05PVEhJTkc6DQorCQljYXNlIEFFRVNfU1RNTlRfRklOQUw6DQorCQljYXNlIEFFRVNfU1RNTlRfREVTVFJPWToNCisJCXsNCisJCQlpZiggbm90IEVOVi5pbkVELT5pc0ZpbmFsaXplZE9yRGVzdHJveWVkKEVOVi5pbkVELT5nZXRTeXN0ZW1SSUQoKSkgKQ0KKwkJCXsNCisJCQkJRU5WLmluRUQubXdzZXRBRUVTKEFFRVNfT0spOw0KKwkJCX0NCisJCQkvLyEhIE5PIEJSRUFrDQorCQl9DQorDQorCQljYXNlIEFFRVNfT0s6DQorCQl7DQorCQkJRU5WLmluRUQtPnNldFN5c3RlbVJJRCgpOw0KKwkJCWlmKCBFTlYuaW5FRC0+Z2V0T25TY2hlZHVsZSgpLT5lbXB0eSgpICYmDQorCQkJCShFTlYuaW5FRC0+Z2V0T25TY2hlZHVsZSgpLT5pc09wQ29kZShBVk1fT1BDT0RFX1NDSEVEVUxFX0lOVk9LRSkpICkNCisJCQl7DQorCQkJCWlmKCBFTlYucnVuKEVOVi5pbkVELT5nZXRTeXN0ZW1SdW50aW1lKCkuZ2V0T25TY2hlZHVsZSgpKSApDQorCQkJCXsNCisJCQkJfQ0KKwkJCX0NCisJCQllbHNlIGlmKCBFTlYucnVuKEVOVi5pbkVELT5nZXRPblNjaGVkdWxlKCkpICkNCisJCQl7DQorCQkJfQ0KKw0KKwkJCWJyZWFrOw0KKwkJfQ0KKw0KKwkJY2FzZSBBRUVTX1dBSVRJTkdfSk9JTl9GT1JLOg0KKwkJY2FzZSBBRUVTX1NUTU5UX0VYSVQ6DQorCQljYXNlIEFFRVNfU1RNTlRfRVhJVF9BTEw6DQorCQljYXNlIEFFRVNfU1RNTlRfRkFUQUxfRVJST1I6DQorCQljYXNlIEFFRVNfU1lNQk9MSUNfRVhFQ1VUSU9OX0xJTUlUQVRJT046DQorCQl7DQorCQkJYnJlYWs7DQorCQl9DQorDQorCQljYXNlIEFFRVNfU1RNTlRfQlJFQUs6DQorCQljYXNlIEFFRVNfU1RNTlRfQ09OVElOVUU6DQorCQljYXNlIEFFRVNfU1RNTlRfUkVUVVJOOg0KKwkJY2FzZSBBRUVTX1NURVBfUkVTVU1FOg0KKw0KKwkJZGVmYXVsdDoNCisJCXsNCisJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVA0KKwkJCQkJPDwgIlVuZXhwZWN0ZWQgYW4gaW5wdXQgRXhlY3V0aW9uIENvbnRleHQgZm9yIHJ1bm5pbmciDQorCQkJCQkJIiB3aXRoIHRoZSBBVk0gRVhFQ0VDVVRJT04gRU5ESU5HIFNUQVRVUyA8PCAiDQorCQkJCQk8PCBSdW50aW1lRGVmOjpzdHJBRUVTKCBFTlYuaW5FRC0+bUFFRVMgKSA8PCAiID4+ICEhISINCisJCQkJCTw8IFNFTkRfRVhJVDsNCisJCQlicmVhazsNCisJCX0NCisJfQ0KKw0KKwkvLyBQT1NULVJVTg0KKwlwb3N0UnVuKGFuRUMsIEVOVik7DQorDQorCS8vIFJFU1RPUkUgVEhFIEFTU0lHTiBUQUJMRQ0KKwlhbkVDLnJlc3RvcmVEYXRhQWZ0ZXJFdmFsdWF0aW9uKCk7DQorDQorDQorLy8JYW5FQy53cml0ZVRyYWNlQWZ0ZXJFeGVjKEFWTV9PU19UUkFDRSk7DQorLy8JYW5FQy53cml0ZVRyYWNlQWZ0ZXJFeGVjKEFWTV9PU19DT1VUKTsNCisNCisNCitBVk1fSUZfREVCVUdfTk9UX0ZMQUcoIFFVQUxJRklFRF9OQU1FX0lEICkNCisJQmFzZUNvbXBpbGVkRm9ybTo6VVNFX09OTFlfSUQgPSBmYWxzZTsNCitBVk1fRU5ESUZfREVCVUdfTk9UX0ZMQUcoIFFVQUxJRklFRF9OQU1FX0lEICkNCit9DQorDQorDQorDQorc3RhdGljIGJvb2wgaXNEZWJ1Z1Byb2dyYW0oY29uc3QgT3BlcmF0b3IgKiBhbk9wZXJhdG9yKQ0KK3sNCisJc3dpdGNoKCBhbk9wZXJhdG9yLT5nZXRBdm1PcENvZGUoKSApDQorCXsNCisJCS8qDQorCQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJCSAqIEFWTSBNQUNISU5FIEFDVElWSVRZDQorCQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJCSAqLw0KKwkJY2FzZSBBVk1fT1BDT0RFX0NPTlRFWFRfU1dJVENIRVI6DQorDQorCQljYXNlIEFWTV9PUENPREVfSU5JVDoNCisJCWNhc2UgQVZNX09QQ09ERV9GSU5BTDoNCisJCWNhc2UgQVZNX09QQ09ERV9ERVNUUk9ZOg0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX1NUQVJUOg0KKwkJY2FzZSBBVk1fT1BDT0RFX1JFU1RBUlQ6DQorCQljYXNlIEFWTV9PUENPREVfU1RPUDoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9XQUlUOg0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX1NVU1BFTkQ6DQorCQljYXNlIEFWTV9PUENPREVfUkVTVU1FOg0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX0lFTkFCTEVfSU5WT0tFOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0VOQUJMRV9JTlZPS0U6DQorCQljYXNlIEFWTV9PUENPREVfRU5BQkxFX1NFVDoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9JRElTQUJMRV9JTlZPS0U6DQorCQljYXNlIEFWTV9PUENPREVfRElTQUJMRV9JTlZPS0U6DQorCQljYXNlIEFWTV9PUENPREVfRElTQUJMRV9TRVQ6DQorDQorCQljYXNlIEFWTV9PUENPREVfRElTQUJMRV9DSElMRDoNCisJCWNhc2UgQVZNX09QQ09ERV9ESVNBQkxFX1NFTEY6DQorCQljYXNlIEFWTV9PUENPREVfRElTQUJMRV9TRUxWRVM6DQorDQorCQljYXNlIEFWTV9PUENPREVfSUFCT1JUX0lOVk9LRToNCisJCWNhc2UgQVZNX09QQ09ERV9BQk9SVF9JTlZPS0U6DQorCQljYXNlIEFWTV9PUENPREVfQUJPUlRfU0VUOg0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX0FCT1JUX0NISUxEOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0FCT1JUX1NFTEY6DQorCQljYXNlIEFWTV9PUENPREVfQUJPUlRfU0VMVkVTOg0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX0hJU1RPUllfQ0xFQVI6DQorCQljYXNlIEFWTV9PUENPREVfREVFUF9ISVNUT1JZX0lOVk9LRToNCisJCWNhc2UgQVZNX09QQ09ERV9TSEFMTE9XX0hJU1RPUllfSU5WT0tFOg0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX0lSVU46DQorCQljYXNlIEFWTV9PUENPREVfUlVOOg0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX1JUQzoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9TQ0hFRFVMRV9JTlZPS0U6DQorCQljYXNlIEFWTV9PUENPREVfU0NIRURVTEVfR0VUOg0KKwkJY2FzZSBBVk1fT1BDT0RFX1NDSEVEVUxFX1NFVDoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9ERUZFUl9JTlZPS0U6DQorCQljYXNlIEFWTV9PUENPREVfREVGRVJfR0VUOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0RFRkVSX1NFVDoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9GT1JLOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0pPSU46DQorDQorCQljYXNlIEFWTV9PUENPREVfUkRWOg0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUX0VOQUJMRUQ6DQorDQorCQljYXNlIEFWTV9PUENPREVfU1lOQ0hST05JWkU6DQorDQorCQljYXNlIEFWTV9PUENPREVfSU5WT0tFX05FVzoNCisNCisNCisJCS8qDQorCQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJCSAqIEFWTSBQUk9HUkFNIFNDSEVEVUxJTkcNCisJCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkJICovDQorCQljYXNlIEFWTV9PUENPREVfQVNZTkNIUk9OT1VTOg0KKwkJY2FzZSBBVk1fT1BDT0RFX1NUUk9OR19TWU5DSFJPTk9VUzoNCisJCWNhc2UgQVZNX09QQ09ERV9XRUFLX1NZTkNIUk9OT1VTOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0lOVEVSTEVBVklORzoNCisJCWNhc2UgQVZNX09QQ09ERV9QQVJBTExFTDoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9FWENMVVNJVkU6DQorDQorCQljYXNlIEFWTV9PUENPREVfTk9OREVURVJNSU5JU006DQorDQorDQorCQljYXNlIEFWTV9PUENPREVfUFJJT1JfR1Q6DQorCQljYXNlIEFWTV9PUENPREVfUFJJT1JfTFQ6DQorDQorLy8JCWNhc2UgQVZNX09QQ09ERV9BVE9NSUNfU0VRVUVOQ0U6DQorLy8NCisvLwkJY2FzZSBBVk1fT1BDT0RFX1NFUVVFTkNFOg0KKy8vCQljYXNlIEFWTV9PUENPREVfU0VRVUVOQ0VfU0lERToNCisvLwkJY2FzZSBBVk1fT1BDT0RFX1NFUVVFTkNFX1dFQUs6DQorLy8NCisvLwkJY2FzZSBBVk1fT1BDT0RFX1BST0RVQ1Q6DQorDQorCQkvKg0KKwkJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCQkgKiBMQU1CREEgU1RBVEVNRU5UDQorCQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJCSAqLw0KKy8vCQljYXNlIEFWTV9PUENPREVfQVBQTFk6DQorLy8NCisvLwkJY2FzZSBBVk1fT1BDT0RFX0xBTUJEQToNCisvLw0KKy8vCQljYXNlIEFWTV9PUENPREVfSU5WT0tFX1JPVVRJTkU6DQorDQorCQljYXNlIEFWTV9PUENPREVfSU5WT0tFX1RSQU5TSVRJT046DQorDQorCQljYXNlIEFWTV9PUENPREVfSU5WT0tFX01FVEhPRDoNCisJCWNhc2UgQVZNX09QQ09ERV9JTlZPS0VfUFJPR1JBTToNCisJCWNhc2UgQVZNX09QQ09ERV9JTlZPS0VfRlVOQ1RJT046DQorDQorLy8JCWNhc2UgQVZNX09QQ09ERV9JTlZPS0VfTEFNQkRBX0FQUExZOg0KKy8vCQljYXNlIEFWTV9PUENPREVfSU5WT0tFX0xBTUJEQV9MRVQ6DQorDQorCQl7DQorCQkJcmV0dXJuKCB0cnVlICk7DQorCQl9DQorDQorCQlkZWZhdWx0Og0KKwkJew0KKwkJCXJldHVybiggZmFsc2UgKTsNCisJCX0NCisJfQ0KK30NCisNCisNCisNCisNCisNCisNCitib29sIEF2bVByaW1pdGl2ZVByb2Nlc3Nvcjo6cnVuKGF2bV9vZmZzZXRfdCBvcE9mZnNldCwgRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpDQorew0KKwljb25zdCBBdm1Db2RlICogYUNvZGUgPSBFTlYuaW5DT0RFOw0KKw0KKwlpZiggYUNvZGUgPT0gTlVMTCApDQorCXsNCisJCXJldHVybiggZmFsc2UgKTsNCisJfQ0KKw0KK0FWTV9JRl9ERUJVR19GTEFHX0FORCggQ09NUFVUSU5HICwgQVZNX0RFQlVHX0ZMQUdfT1IoIFNUQVRFTUVOVCwNCisJCUFWTV9ERUJVR19GTEFHX0FORCggUFJPR1JBTSAsDQorCQkJCWlzRGVidWdQcm9ncmFtKGFDb2RlLT5nZXRPcGVyYXRvcigpKSApICkgKQ0KKw0KKwkJQVZNX09TX1RSQUNFIDw8IElOQ1JfSU5ERU5UX1RBQiA8PCAiPDwgIg0KKwkJCQk8PCBFTlYuaW5FRC0+bVJJRC5zdHJVbmlxSWQoKSA8PCAiIHw9PiAiOw0KKwkJYUNvZGUtPnRvU3RyZWFtKCBBVk1fT1NfVFJBQ0UgPDwgSUdOT1JFX0ZJUlNUX1RBQiApOw0KKw0KKwlBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIERBVEEgKQ0KKwkJRU5WLmluRUQtPnRvU3RyZWFtRGF0YShBVk1fT1NfVFJBQ0UpOw0KKwlBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIERBVEEgKQ0KKw0KKwlBVk1fSUZfREVCVUdfTEVWRUxfR1RfSElHSA0KKwkJQVZNX09TX0NPVVQgPDwgQVZNX09TX1RSQUNFLklOREVOVC5UQUJTIDw8ICI8PCAiDQorCQkJCTw8IEVOVi5pbkVELT5tUklELnN0clVuaXFJZCgpIDw8ICIgfD0+ICI7DQorCQlhQ29kZS0+dG9TdHJlYW0oIEFWTV9PU19DT1VUIDw8IElHTk9SRV9GSVJTVF9UQUIgKTsNCisJQVZNX0VORElGX0RFQlVHX0xFVkVMX0dUX0hJR0gNCisNCisJQVZNX09TX1RSQUNFIDw8IHN0ZDo6Zmx1c2g7DQorQVZNX0VORElGX0RFQlVHX0ZMQUdfQU5EKCBDT01QVVRJTkcgICkNCisNCisNCisJYm9vbCBydENvZGUgPSBmYWxzZTsNCisNCisJdHJ5DQorCXsNCisJCWlmKCBFTlYuaW5DT0RFLT5oYXNJbnN0cnVjdGlvbigpICkNCisJCXsNCisJCQlJbnN0cnVjdGlvbkVudmlyb25tZW50IElOU1RSVUNUSU9OX0VOVihFTlYpOw0KKwkJCWlmKCAoRU5WLm1BUkcgPSBJTlNUUlVDVElPTl9FTlYuaXRBUkcpLT5tYWluX2RlY29kZV9ldmFsX2FyZ3MoRU5WLmluQ09ERSkgKQ0KKwkJCXsNCisvLwkJCQl3aGlsZSggRU5WLm1BUkcgIT0gTlVMTCApDQorCQkJCXsNCisJCQkJCUVOVi5pbkVEID0gRU5WLm1BUkctPm91dEVEOw0KKw0KKwkJCQkJcnRDb2RlID0gQVZNX1BSSU1JVElWRV9UQUJMRVsgb3BPZmZzZXQgXS0+cnVuKEVOVikgfHwgcnRDb2RlOw0KKw0KKy8vCQkJCUVOVi5tQVJHID0gSU5TVFJVQ1RJT05fRU5WLml0QVJHID0gSU5TVFJVQ1RJT05fRU5WLml0QVJHLT5ORVhUOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJZWxzZQ0KKwkJew0KKwkJCXJ0Q29kZSA9IEFWTV9QUklNSVRJVkVfVEFCTEVbIG9wT2Zmc2V0IF0tPnJ1bihFTlYpOw0KKwkJfQ0KKwl9DQorCWNhdGNoKCBjb25zdCBBdm1FeGl0RXhjZXB0aW9uICYgYWVlICkNCisJew0KKwkJLy8gVE9ETyAhISENCisvLwkJYXZtX3NldF9leGl0X2NvZGUoIGFlZS5tRXhpdENvZGUgKTsNCisJfQ0KKwljYXRjaCggY29uc3Qgc3RkOjpleGNlcHRpb24gJiBlICkNCisJew0KKwkJQVZNX09TX1dBUk4gPDwgc3RkOjplbmRsIDw8IEVNUEhBU0lTKA0KKwkJCQkiQXZtUHJpbWl0aXZlUHJvY2Vzc29yOjpydW48IHN0ZDo6ZXhjZXB0aW9uID4iLA0KKwkJCQllLndoYXQoKSwgJyonLCA4MCk7DQorCX0NCisJY2F0Y2goIC4uLiApDQorCXsNCisJCUFWTV9PU19XQVJOIDw8IHN0ZDo6ZW5kbCA8PCBFTVBIQVNJUyggIkF2bVByaW1pdGl2ZVByb2Nlc3Nvcjo6Ig0KKwkJCQkicnVuPCB1bmtub3duOjpleGNlcHRpb24gPiAhISEiLCAnKicsIDgwKTsNCisJfQ0KKw0KKw0KK0FWTV9JRl9ERUJVR19GTEFHX0FORCggQ09NUFVUSU5HICwgQVZNX0RFQlVHX0ZMQUdfT1IoIFNUQVRFTUVOVCwNCisJCUFWTV9ERUJVR19GTEFHX0FORCggUFJPR1JBTSAsDQorCQkJCWlzRGVidWdQcm9ncmFtKGFDb2RlLT5nZXRPcGVyYXRvcigpKSApICkgKQ0KKw0KKwlBVk1fSUZfREVCVUdfTEVWRUxfR1RFX0hJR0gNCisNCisJCUFWTV9PU19UUkFDRSA8PCBUQUJfREVDUl9JTkRFTlQNCisJCQkJPDwgIj4+ICIgPDwgRU5WLmluRUQtPm1SSUQuc3RyVW5pcUlkKCkNCisJCQkJPDwgIiB8PT4gIiA8PCAgYUNvZGUtPnN0cigpIDw8IHN0ZDo6ZW5kbDsNCisNCisJCUFWTV9JRl9ERUJVR19GTEFHKCBEQVRBICkNCisJCQlFTlYuaW5FRC0+dG9TdHJlYW1EYXRhKEFWTV9PU19UUkFDRSk7DQorCQlBVk1fRU5ESUZfREVCVUdfRkxBRyggREFUQSApDQorDQorCQlBVk1fSUZfREVCVUdfTEVWRUxfR1RfSElHSA0KKwkJCUFWTV9PU19DT1VUIDw8IEFWTV9PU19UUkFDRS5JTkRFTlQuVEFCUyA8PCAiICA+PiAiDQorCQkJCQk8PCBFTlYuaW5FRC0+bVJJRC5zdHJVbmlxSWQoKQ0KKwkJCQkJPDwgIiB8PT4gIiA8PCBhQ29kZS0+c3RyKCkgPDwgc3RkOjplbmRsOw0KKwkJQVZNX0VORElGX0RFQlVHX0xFVkVMX0dUX0hJR0gNCisNCisJCUFWTV9PU19UUkFDRSA8PCBzdGQ6OmZsdXNoOw0KKw0KKwlBVk1fREVCVUdfRUxTRQ0KKw0KKwkJQVZNX09TX1RSQUNFIDw8IERFQ1JfSU5ERU5UOw0KKw0KKwlBVk1fRU5ESUZfREVCVUdfTEVWRUxfR1RFX0hJR0gNCitBVk1fRU5ESUZfREVCVUdfRkxBR19BTkQoIENPTVBVVElORyApDQorDQorCXJldHVybiggcnRDb2RlICk7DQorfQ0KKw0KKw0KK2Jvb2wgQXZtUHJpbWl0aXZlUHJvY2Vzc29yOjppbnZva2VSb3V0aW5lKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WLA0KKwkJQXZtUHJvZ3JhbSAqIGFSb3V0aW5lLCBjb25zdCBCRiAmIGFQYXJhbSkNCit7DQorQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBDT01QVVRJTkcgLCBTVEFURU1FTlQgKQ0KKwlBVk1fT1NfVFJBQ0UgPDwgSU5DUl9JTkRFTlRfVEFCIDw8ICI8PCAiDQorCQkJPDwgRU5WLmluRUQtPm1SSUQuc3RyVW5pcUlkKCkgPDwgIiB8PT4gaW52b2tlI3JvdXRpbmUgIg0KKwkJCTw8IGFSb3V0aW5lLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8ICIgIiA8PCBhUGFyYW0uc3RyKCkgPDwgc3RkOjplbmRsOw0KKw0KK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgREFUQSApDQorCQlFTlYuaW5FRC0+dG9TdHJlYW1EYXRhKEFWTV9PU19UUkFDRSk7DQorQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBEQVRBICkNCisNCitBVk1fSUZfREVCVUdfTEVWRUxfR1RfSElHSA0KKwkJQVZNX09TX0NPVVQgPDwgQVZNX09TX1RSQUNFLklOREVOVC5UQUJTIDw8ICI8PCAiDQorCQkJCTw8IEVOVi5pbkVELT5tUklELnN0clVuaXFJZCgpDQorCQkJCTw8ICIgfD0+IGludm9rZSNyb3V0aW5lICIgPDwgYVJvdXRpbmUtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkNCisJCQkJPDwgIiAiIDw8IGFQYXJhbS5zdHIoKSA8PCBzdGQ6OmZsdXNoOw0KK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9HVF9ISUdIDQorDQorCUFWTV9PU19UUkFDRSA8PCBzdGQ6OmZsdXNoOw0KK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgQ09NUFVUSU5HICwgU1RBVEVNRU5UICkNCisNCisJYm9vbCBydENvZGUgPSAoIGFSb3V0aW5lLT5oYXNQYXJhbSgpICkNCisJCQk/IERFRkFVTFRfSU5WT0tFX1JPVVRJTkUtPnJ1bihFTlYsICphUm91dGluZSwgYVBhcmFtKQ0KKwkJCTogREVGQVVMVF9JTlZPS0VfUk9VVElORS0+cnVuKEVOViwgKmFSb3V0aW5lKTsNCisNCisNCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIENPTVBVVElORyAsIFNUQVRFTUVOVCApDQorQVZNX0lGX0RFQlVHX0xFVkVMX0dURV9ISUdIDQorCQlBVk1fT1NfVFJBQ0UgPDwgVEFCX0RFQ1JfSU5ERU5UIDw8ICI+PiAiDQorCQkJCTw8IEVOVi5pbkVELT5tUklELnN0clVuaXFJZCgpIDw8ICIgfD0+IGludm9rZSNyb3V0aW5lICINCisJCQkJPDwgIGFSb3V0aW5lLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8ICIgIiA8PCBhUGFyYW0uc3RyKCkgPDwgc3RkOjplbmRsOw0KKw0KK0FWTV9JRl9ERUJVR19GTEFHKCBEQVRBICkNCisJCQlFTlYuaW5FRC0+dG9TdHJlYW1EYXRhKEFWTV9PU19UUkFDRSk7DQorQVZNX0VORElGX0RFQlVHX0ZMQUcoIERBVEEgKQ0KKw0KK0FWTV9JRl9ERUJVR19MRVZFTF9HVF9ISUdIDQorCQkJQVZNX09TX0NPVVQgPDwgQVZNX09TX1RSQUNFLklOREVOVC5UQUJTIDw8ICIgID4+ICINCisJCQkJCTw8IEVOVi5pbkVELT5tUklELnN0clVuaXFJZCgpDQorCQkJCQk8PCAiIHw9PiBpbnZva2Ujcm91dGluZSAiIDw8IGFSb3V0aW5lLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpDQorCQkJCQk8PCAiICIgPDwgYVBhcmFtLnN0cigpIDw8IHN0ZDo6ZW5kbDsNCitBVk1fRU5ESUZfREVCVUdfTEVWRUxfR1RfSElHSA0KKw0KKwkJQVZNX09TX1RSQUNFIDw8IHN0ZDo6Zmx1c2g7DQorDQorQVZNX0RFQlVHX0VMU0UNCisNCisJCUFWTV9PU19UUkFDRSA8PCBERUNSX0lOREVOVDsNCisNCitBVk1fRU5ESUZfREVCVUdfTEVWRUxfR1RFX0hJR0gNCitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIENPTVBVVElORyAsIFNUQVRFTUVOVCApDQorDQorCXJldHVybiggcnRDb2RlICk7DQorfQ0KKw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLy8vLyB0aGUgUkVTVU1FICYgRVZBTCBzdGF0ZW1lbnQNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorYm9vbCBBdm1QcmltaXRpdmVQcm9jZXNzb3I6OnJlc3VtZShFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikNCit7DQorCWNvbnN0IEF2bUNvZGUgKiBhQ29kZSA9IEVOVi5pbkNPREU7DQorDQorCWlmKCBhQ29kZSA9PSBOVUxMICkNCisJew0KKwkJcmV0dXJuKCBmYWxzZSApOw0KKwl9DQorDQorQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBDT01QVVRJTkcgLCBTVEFURU1FTlQgKQ0KKwlBVk1fT1NfVFJBQ0UgPDwgSU5DUl9JTkRFTlRfVEFCIDw8ICI8PHx8IHBvczoiDQorCQkJPDwgc3RhdGljX2Nhc3Q8IGF2bV9zaXplX3QgPigNCisJCQkJCUVOVi5pbkVYRUNfTE9DQVRJT04tPml0Q29kZSAtIGFDb2RlLT5iZWdpbigpKQ0KKy8vCQkJPDwgIiA/IT8gfD0+ICIgPDwgYVByb2dyYW0tPi0+c3RyKCkgPDwgc3RkOjplbmRsDQorCQkJPDwgIiAiIDw8IEVOVi5pbkVELT5tUklELnN0clVuaXFJZCgpIDw8ICIgfD0+ICI7DQorCWFDb2RlLT50b1N0cmVhbSggQVZNX09TX1RSQUNFIDw8IElHTk9SRV9GSVJTVF9UQUIgKTsNCisNCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIERBVEEgKQ0KKwkJRU5WLmluRUQtPnRvU3RyZWFtRGF0YShBVk1fT1NfVFJBQ0UpOw0KK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgREFUQSApDQorDQorQVZNX0lGX0RFQlVHX0xFVkVMX0dUX0hJR0gNCisJCUFWTV9PU19DT1VUIDw8IEFWTV9PU19UUkFDRS5JTkRFTlQuVEFCUyA8PCAiPDx8fCAiDQorCQkJCTw8IEVOVi5pbkVELT5tUklELnN0clVuaXFJZCgpIDw8ICIgfD0+ICI7DQorCQlhQ29kZS0+dG9TdHJlYW0oIEFWTV9PU19DT1VUIDw8IElHTk9SRV9GSVJTVF9UQUIgKTsNCitBVk1fRU5ESUZfREVCVUdfTEVWRUxfR1RfSElHSA0KKw0KKwlBVk1fT1NfVFJBQ0UgPDwgc3RkOjpmbHVzaDsNCitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIENPTVBVVElORyAsIFNUQVRFTUVOVCApDQorDQorDQorCWJvb2wgcnRDb2RlID0gQVZNX1BSSU1JVElWRV9UQUJMRVsgYUNvZGUtPmdldE9wT2Zmc2V0KCkgXS0+cmVzdW1lKEVOVik7DQorDQorDQorQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBDT01QVVRJTkcgLCBTVEFURU1FTlQgKQ0KK0FWTV9JRl9ERUJVR19MRVZFTF9HVEVfSElHSA0KKwkJQVZNX09TX1RSQUNFIDw8IFRBQl9ERUNSX0lOREVOVCA8PCAifHw+PiAiDQorCQkJCTw8IEVOVi5pbkVELT5tUklELnN0clVuaXFJZCgpDQorCQkJCTw8ICIgfD0+ICIgPDwgIGFDb2RlLT5zdHIoKSA8PCBzdGQ6OmVuZGw7DQorDQorQVZNX0lGX0RFQlVHX0ZMQUcoIERBVEEgKQ0KKwkJCUVOVi5pbkVELT50b1N0cmVhbURhdGEoQVZNX09TX1RSQUNFKTsNCitBVk1fRU5ESUZfREVCVUdfRkxBRyggREFUQSApDQorDQorQVZNX0lGX0RFQlVHX0xFVkVMX0dUX0hJR0gNCisJCQlBVk1fT1NfQ09VVCA8PCBBVk1fT1NfVFJBQ0UuSU5ERU5ULlRBQlMgPDwgIiAgfHw+PiAiDQorCQkJCQk8PCBFTlYuaW5FRC0+bVJJRC5zdHJVbmlxSWQoKQ0KKwkJCQkJPDwgIiB8PT4gIiA8PCBhQ29kZS0+c3RyKCkgPDwgc3RkOjplbmRsOw0KK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9HVF9ISUdIDQorDQorCQlBVk1fT1NfVFJBQ0UgPDwgc3RkOjpmbHVzaDsNCisNCitBVk1fREVCVUdfRUxTRQ0KKw0KKwkJQVZNX09TX1RSQUNFIDw8IERFQ1JfSU5ERU5UOw0KKw0KK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9HVEVfSElHSA0KK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgQ09NUFVUSU5HICwgU1RBVEVNRU5UICkNCisNCisJcmV0dXJuKCBydENvZGUgKTsNCit9DQorDQorDQorYm9vbCBBdm1QcmltaXRpdmVQcm9jZXNzb3I6OmRlY29kZV9yZXN1bWUoRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpDQorew0KKwlBUEV4ZWN1dGlvbkRhdGEgdG1wRUQgPSBFTlYuaW5FRDsNCisJdG1wRUQubWFrZVdyaXRhYmxlKCk7DQorCXRtcEVELT5tU1RBVEVNRU5UX1FVRVVFLnB1c2hDYWNoZSgpOw0KKw0KKwlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGEgdG1wTGlzdE9mSW5wdXRFRCggdG1wRUQgKTsNCisNCisJRXhlY3V0aW9uRW52aXJvbm1lbnQgdG1wRU5WKEVOVi5QUklNSVRJVkVfUFJPQ0VTU09SKTsNCisNCisJd2hpbGUoIHRtcExpc3RPZklucHV0RUQubm9uZW1wdHkoKSApDQorCXsNCisJCXRtcExpc3RPZklucHV0RUQucG9wX2ZpcnN0X3RvKCB0bXBFRCApOw0KKw0KKwkJaWYoIG5vdCB0bXBFTlYucmVzdW1lKEVOViwgdG1wRUQpICkNCisJCXsNCisJCQlBVk1fT1NfRVhJVCggRkFJTEVEICkNCisJCQkJCTw8ICJGYWlsZWQgdG8gUkVTVU1FPCBTVEFURU1FTlQgPiEhISINCisJCQkJCTw8IFNFTkRfRVhJVDsNCisNCisJCQlyZXR1cm4oIGZhbHNlICk7DQorCQl9DQorDQorCQl3aGlsZSggdG1wRU5WLm91dEVEUy5ub25lbXB0eSgpICkNCisJCXsNCisJCQl0bXBFTlYub3V0RURTLnBvcF9sYXN0X3RvKCB0bXBFRCApOw0KKw0KKwkJCXN3aXRjaCggdG1wRUQtPmdldEFFRVMoKSApDQorCQkJew0KKwkJCQljYXNlIEFFRVNfU1RNTlRfTk9USElORzoNCisJCQkJY2FzZSBBRUVTX1NUTU5UX0ZJTkFMOg0KKwkJCQljYXNlIEFFRVNfU1RNTlRfREVTVFJPWToNCisJCQkJew0KKwkJCQkJdG1wRUQubXdzZXRBRUVTKCBBRUVTX09LICk7DQorDQorCQkJCQkvLyEhISBOTyA8PCBicmVhayA+PiBmb3IgdGhlc2Ugc3RhdGVtZW50DQorCQkJCX0NCisNCisJCQkJY2FzZSBBRUVTX1NURVBfUkVTVU1FOg0KKwkJCQl7DQorCQkJCQlpZiggdG1wRUQtPm1TVEFURU1FTlRfUVVFVUUubm9uZW1wdHkoKSApDQorCQkJCQl7DQorCQkJCQkJdG1wTGlzdE9mSW5wdXRFRC5hcHBlbmQoIHRtcEVEICk7DQorCQkJCQl9DQorCQkJCQllbHNlDQorCQkJCQl7DQorCQkJCQkJdG1wRUQubXdzZXRBRUVTKCBBRUVTX09LICk7DQorCQkJCQkJRU5WLm91dEVEUy5hcHBlbmQoIHRtcEVEICk7DQorCQkJCQl9DQorDQorCQkJCQlicmVhazsNCisJCQkJfQ0KKw0KKwkJCQljYXNlIEFFRVNfT0s6DQorCQkJCWNhc2UgQUVFU19TVE1OVF9SRVRVUk46DQorCQkJCXsNCisJCQkJCWlmKCB0bXBFRC0+bVNUQVRFTUVOVF9RVUVVRS5ub25lbXB0eSgpICkNCisJCQkJCXsNCisJCQkJCQl0bXBMaXN0T2ZJbnB1dEVELmFwcGVuZCggdG1wRUQgKTsNCisJCQkJCX0NCisJCQkJCWVsc2UNCisJCQkJCXsNCisJCQkJCQlFTlYub3V0RURTLmFwcGVuZCggdG1wRUQgKTsNCisJCQkJCX0NCisNCisJCQkJCWJyZWFrOw0KKwkJCQl9DQorDQorCQkJCWRlZmF1bHQ6DQorCQkJCXsNCisJCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUDQorCQkJCQkJCTw8ICJVbmV4cGVjdGVkIEVORElORCBFWEVDVVRJT04gU1RBVFVTIDo+ICINCisJCQkJCQkJPDwgUnVudGltZURlZjo6c3RyQUVFUyggdG1wRUQtPm1BRUVTICkgPDwgIiAhISEiDQorCQkJCQkJCTw8IFNFTkRfRVhJVDsNCisNCisJCQkJCXJldHVybiggZmFsc2UgKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvLyBTeW5jIEVEUyB0cmFpdGVtZW50DQorCXdoaWxlKCB0bXBFTlYuc3luY0VEUy5ub25lbXB0eSgpICkNCisJew0KKwkJdG1wRU5WLnN5bmNFRFMuZmlyc3QoKS0+bVNUQVRFTUVOVF9RVUVVRS5wdXNoQ2FjaGUoKTsNCisNCisJCUVOVi5hcHBlbmRTeW5jKCB0bXBFTlYuc3luY0VEUy5wb3BfZmlyc3QoKSApOw0KKwl9DQorDQorCS8vIElSUSBFRFMgdHJhaXRlbWVudA0KKw0KKwlFTlYuc3BsaWNlTm90T3V0cHV0KHRtcEVOVik7DQorDQorCXJldHVybiggdHJ1ZSApOw0KK30NCisNCisNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8vLy8gdGhlIERFQ09ERSAmIEVWQUwgc3RhdGVtZW50DQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKw0KKy8qKg0KKyAqIHRoZSBFVkFMIGluc3RydWN0aW9uDQorICovDQorDQorYm9vbCBBdm1QcmltaXRpdmVQcm9jZXNzb3I6OnNldmFsKEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOVikNCit7DQorCWNvbnN0IEF2bUNvZGUgKiBhbkV4cHJlc3Npb24gPSBFTlYuaW5DT0RFOw0KKw0KK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgQ09NUFVUSU5HICwgU1RBVEVNRU5UICkNCisJQVZNX09TX1RSQUNFIDw8IElOQ1JfSU5ERU5UX1RBQiA8PCAiPDwgIg0KKwkJCTw8IEVOVi5pbkVELT5tUklELnN0clVuaXFJZCgpIDw8ICIgLCBFRCB8LT4gIjsNCisJYW5FeHByZXNzaW9uLT50b1N0cmVhbSggQVZNX09TX1RSQUNFIDw8IElHTk9SRV9GSVJTVF9UQUIgKTsNCisNCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIERBVEEgKQ0KKwkJRU5WLm91dEVELT50b1N0cmVhbURhdGEoQVZNX09TX1RSQUNFKTsNCitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIERBVEEgKQ0KKw0KK0FWTV9JRl9ERUJVR19MRVZFTF9HVF9ISUdIDQorCQlBVk1fT1NfQ09VVCA8PCBBVk1fT1NfVFJBQ0UuSU5ERU5ULlRBQlMgPDwgIjw8IEVEIHwtPiAiOw0KKwkJYW5FeHByZXNzaW9uLT50b1N0cmVhbSggQVZNX09TX0NPVVQgPDwgSUdOT1JFX0ZJUlNUX1RBQiApOw0KK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9HVF9ISUdIDQorDQorCUFWTV9PU19UUkFDRSA8PCBzdGQ6OmZsdXNoOw0KK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgQ09NUFVUSU5HICwgU1RBVEVNRU5UICkNCisNCisNCisJYm9vbCBydENvZGUgPSBmYWxzZTsNCisJaWYoIEVOVi5pbkNPREUtPmhhc0luc3RydWN0aW9uKCkgKQ0KKwl7DQorCQlzd2l0Y2goIEVOVi5pbkNPREUtPmdldEluc3RydWN0aW9uKCktPmdldE1haW5Db250ZXh0KCkgKQ0KKwkJew0KKwkJCWNhc2UgQVZNX0FSR19TVEFOREFSRF9DVFg6DQorCQkJew0KKwkJCQlJbnN0cnVjdGlvbkVudmlyb25tZW50IElOU1RSVUNUSU9OX0VOVihFTlYpOw0KKw0KKwkJCQlpZiggKEVOVi5tQVJHID0gSU5TVFJVQ1RJT05fRU5WLml0QVJHKQ0KKwkJCQkJCS0+bWFpbl9kZWNvZGVfZXZhbF9hcmdzKEVOVi5pbkNPREUpICkNCisJCQkJew0KKwkJCQkJRU5WLm91dEVEID0gRU5WLm1BUkctPm91dEVEOw0KKw0KKwkJCQkJcnRDb2RlID0gQVZNX1BSSU1JVElWRV9UQUJMRQ0KKwkJCQkJCQlbYW5FeHByZXNzaW9uLT5nZXRPcE9mZnNldCgpXS0+c2V2YWwoRU5WKTsNCisJCQkJfQ0KKwkJCQlicmVhazsNCisJCQl9DQorDQorCQkJY2FzZSBBVk1fQVJHX0FSR1VNRU5UX0NUWDoNCisJCQljYXNlIEFWTV9BUkdfUEFSQU1FVEVSX0NUWDoNCisJCQljYXNlIEFWTV9BUkdfUkVUVVJOX0NUWDoNCisJCQl7DQorCQkJCUluc3RydWN0aW9uRW52aXJvbm1lbnQgSU5TVFJVQ1RJT05fRU5WKEVOViwgMSk7DQorDQorCQkJCWlmKCAoRU5WLm1BUkcgPSBJTlNUUlVDVElPTl9FTlYuaXRBUkcpDQorCQkJCQkJLT5tYWluX2RlY29kZV9ldmFsKEVOVi5pbkNPREUpICkNCisJCQkJew0KKwkJCQkJRU5WLm91dEVEID0gRU5WLm1BUkctPm91dEVEOw0KKwkJCQkJRU5WLm91dFZBTCA9IEVOVi5tQVJHLT5hdCgwKTsNCisNCisJCQkJCXJ0Q29kZSA9IHRydWU7DQorCQkJCX0NCisJCQkJYnJlYWs7DQorCQkJfQ0KKw0KKwkJCWNhc2UgQVZNX0FSR19VTkRFRklORURfQ09OVEVYVDoNCisJCQlkZWZhdWx0Og0KKwkJCXsNCisJCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQNCisJCQkJCQk8PCAiQXZtUHJpbWl0aXZlUHJvY2Vzc29yOjpzZXZhbCA6PiBVbmV4cGVjdGVkICINCisJCQkJCQkJIm9wY29kZSA8PCAiIDw8IEVOVi5pbkNPREUtPnN0ckRlYnVnKCkgPDwgIiA+PiAhISEiDQorCQkJCQkJPDwgU0VORF9FWElUOw0KKw0KKwkJCQlyZXR1cm4oIGZhbHNlICk7DQorCQkJfQ0KKwkJfQ0KKwl9DQorCWVsc2UNCisJew0KKwkJcnRDb2RlID0gQVZNX1BSSU1JVElWRV9UQUJMRVsgYW5FeHByZXNzaW9uLT5nZXRPcE9mZnNldCgpIF0tPnNldmFsKEVOVik7DQorCX0NCisNCisNCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIENPTVBVVElORyAsIFNUQVRFTUVOVCApDQorQVZNX0lGX0RFQlVHX0xFVkVMX0dURV9ISUdIDQorCQlBVk1fT1NfVFJBQ0UgPDwgVEFCX0RFQ1JfSU5ERU5UIDw8ICI+PiAiDQorCQkJCTw8IEVOVi5pbkVELT5tUklELnN0clVuaXFJZCgpIDw8ICIgLCBFRCB8LT4gIg0KKwkJCQk8PCAgYW5FeHByZXNzaW9uLT5zdHIoKSA8PCBzdGQ6OmVuZGw7DQorDQorQVZNX0lGX0RFQlVHX0ZMQUcoIERBVEEgKQ0KKwkJCUVOVi5pbkVELT50b1N0cmVhbURhdGEoQVZNX09TX1RSQUNFKTsNCitBVk1fRU5ESUZfREVCVUdfRkxBRyggREFUQSApDQorDQorQVZNX0lGX0RFQlVHX0xFVkVMX0dUX0hJR0gNCisJCQlBVk1fT1NfQ09VVCA8PCBBVk1fT1NfVFJBQ0UuSU5ERU5ULlRBQlMgPDwgIiAgPj4gIiA8PA0KKwkJCQkJRU5WLmluRUQtPm1SSUQuc3RyVW5pcUlkKCkgPDwgIiAsIEVEIHwtPiAiDQorCQkJCQk8PCBhbkV4cHJlc3Npb24tPnN0cigpIDw8IHN0ZDo6ZW5kbDsNCitBVk1fRU5ESUZfREVCVUdfTEVWRUxfR1RfSElHSA0KKw0KKwkJQVZNX09TX1RSQUNFIDw8IHN0ZDo6Zmx1c2g7DQorDQorQVZNX0RFQlVHX0VMU0UNCisNCisJCUFWTV9PU19UUkFDRSA8PCBERUNSX0lOREVOVDsNCisNCitBVk1fRU5ESUZfREVCVUdfTEVWRUxfR1RFX0hJR0gNCitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIENPTVBVVElORyAsIFNUQVRFTUVOVCApDQorDQorCXJldHVybiggcnRDb2RlICk7DQorfQ0KKw0KKw0KK2Jvb2wgQXZtUHJpbWl0aXZlUHJvY2Vzc29yOjpzZXZhbF93cnRfQVJHKEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOVikNCit7DQorCXJldHVybiggQVZNX1BSSU1JVElWRV9UQUJMRVsgRU5WLmluQ09ERS0+Z2V0T3BPZmZzZXQoKSBdLT5zZXZhbChFTlYpICk7DQorfQ0KKw0KKw0KKy8qKg0KKyAqIHRoZSBERUNPREUgRVZBTCBpbnN0cnVjdGlvbg0KKyAqLw0KKw0KK2Jvb2wgQXZtUHJpbWl0aXZlUHJvY2Vzc29yOjpkZWNvZGVfc2V2YWwoRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WKQ0KK3sNCisJc3dpdGNoKCBFTlYuaW5GT1JNLmNsYXNzS2luZCgpICkNCisJew0KKwkJY2FzZSBGT1JNX0FWTUNPREVfS0lORDoNCisJCXsNCisJCQlFTlYuaW5DT0RFID0gRU5WLmluRk9STS5iZkNvZGUoKTsNCisNCisJCQlyZXR1cm4oIHNldmFsKEVOVikgKTsNCisJCX0NCisNCisNCisJCWNhc2UgRk9STV9JTlNUQU5DRV9EQVRBX0tJTkQ6DQorCQl7DQorCQkJSW5zdGFuY2VPZkRhdGEgKiBhbkluc3RhbmNlID0gRU5WLmluRk9STS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKTsNCisNCisJCQlpZiggKGFuSW5zdGFuY2UtPmdldE1vZGlmaWVyKCkuaGFzTmF0dXJlUmVmZXJlbmNlKCkpICkNCisJCQl7DQorCQkJCUVOVi5vdXRWQUwgPSBFTlYuZ2V0UnZhbHVlKEVOVi5vdXRFRCwgRU5WLmdldFJ2YWx1ZSgNCisJCQkJCQlFTlYub3V0RUQsIGFuSW5zdGFuY2UpLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpICk7DQorCQkJfQ0KKwkJCWVsc2UgaWYoIChhbkluc3RhbmNlLT5nZXRNb2RpZmllcigpLmhhc05hdHVyZU1hY3JvKCkpICkNCisJCQl7DQorCQkJCUVOVi5pbkZPUk0gPSBFTlYuZ2V0UnZhbHVlKEVOVi5vdXRFRCwgYW5JbnN0YW5jZSk7DQorDQorCQkJCXJldHVybiggZGVjb2RlX3NldmFsKEVOVikgKTsNCisJCQl9DQorCQkJZWxzZSBpZiggYW5JbnN0YW5jZS0+Z2V0TW9kaWZpZXIoKS5oYXNGZWF0dXJlTXV0YWJsZSgpICkNCisJCQl7DQorCQkJCUVOVi5vdXRWQUwgPSBFTlYuZ2V0UnZhbHVlKEVOVi5vdXRFRCwgYW5JbnN0YW5jZSk7DQorCQkJfQ0KKw0KKwkJCWVsc2UgaWYoIGFuSW5zdGFuY2UtPmlzRW51bVN5bWJvbFBvaW50ZXIoKSApDQorCQkJew0KKwkJCQlFTlYub3V0VkFMID0gKCBhbkluc3RhbmNlLT5oYXNWYWx1ZSgpICYmDQorCQkJCQkJKG5vdCBhbkluc3RhbmNlLT5nZXRNb2RpZmllcigpLmhhc0ZlYXR1cmVVbnNhZmUoKSkgKQ0KKwkJCQkJCT8gYW5JbnN0YW5jZS0+Z2V0VmFsdWUoKSA6IEVOVi5pbkZPUk07DQorCQkJfQ0KKw0KKwkJCWVsc2UgaWYoIEV4ZWN1dGFibGVMaWI6Ok1BQ0hJTkVfU0VMRiA9PSBhbkluc3RhbmNlICkNCisJCQl7DQorCQkJCUVOVi5vdXRWQUwgPSBFTlYuaW5FRC0+bVJJRDsNCisJCQl9DQorDQorCQkJZWxzZSBpZiggRXhlY3V0YWJsZUxpYjo6TUFDSElORV9QQVJFTlQgPT0gYW5JbnN0YW5jZSApDQorCQkJew0KKwkJCQlFTlYub3V0VkFMID0gRU5WLmluRUQtPm1SSUQuZ2V0UFJJRCgpOw0KKwkJCX0NCisNCisJCQllbHNlDQorCQkJew0KKwkJCQlFTlYub3V0VkFMID0gRU5WLmluRk9STTsNCisJCQl9DQorDQorCQkJcmV0dXJuKCB0cnVlICk7DQorCQl9DQorDQorDQorCQljYXNlIEZPUk1fQlVJTFRJTl9CT09MRUFOX0tJTkQ6DQorCQljYXNlIEZPUk1fQlVJTFRJTl9DSEFSQUNURVJfS0lORDoNCisJCWNhc2UgRk9STV9CVUlMVElOX0lOVEVHRVJfS0lORDoNCisJCWNhc2UgRk9STV9CVUlMVElOX1JBVElPTkFMX0tJTkQ6DQorCQljYXNlIEZPUk1fQlVJTFRJTl9GTE9BVF9LSU5EOg0KKwkJY2FzZSBGT1JNX0JVSUxUSU5fU1RSSU5HX0tJTkQ6DQorCQljYXNlIEZPUk1fQlVJTFRJTl9JREVOVElGSUVSX0tJTkQ6DQorCQljYXNlIEZPUk1fQlVJTFRJTl9RVUFMSUZJRURfSURFTlRJRklFUl9LSU5EOg0KKw0KKwkJY2FzZSBGT1JNX09QRVJBVE9SX0tJTkQ6DQorDQorCQljYXNlIEZPUk1fQVZNTEFNQkRBX0tJTkQ6DQorCQljYXNlIEZPUk1fQVZNUFJPR1JBTV9LSU5EOg0KKwkJY2FzZSBGT1JNX0FWTVRSQU5TSVRJT05fS0lORDoNCisJCWNhc2UgRk9STV9FWEVDVVRBQkxFX01BQ0hJTkVfS0lORDoNCisJCWNhc2UgRk9STV9FWEVDVVRBQkxFX1NZU1RFTV9LSU5EOg0KKwkJew0KKwkJCUVOVi5vdXRWQUwgPSBFTlYuaW5GT1JNOw0KKw0KKwkJCXJldHVybiggdHJ1ZSApOw0KKwkJfQ0KKw0KKw0KKy8vCQljYXNlIEZPUk1fVUZJX0tJTkQ6DQorLy8JCXsNCisvLwkJCXJldHVybiggbUF2bVVmaVByaW1pdGl2ZS0+c19ldmFsVWZpKEVOViwgRU5WLmluRk9STS5iZlVGSSgpKSApOw0KKy8vCQl9DQorDQorCQljYXNlIEZPUk1fSU5TVEFOQ0VfTUFDSElORV9LSU5EOg0KKwkJew0KKwkJCUluc3RhbmNlT2ZNYWNoaW5lICogYW5JbnN0YW5jZSA9DQorCQkJCQlFTlYuaW5GT1JNLnRvX3B0cjwgSW5zdGFuY2VPZk1hY2hpbmUgPigpOw0KKw0KKwkJCWlmKCBhbkluc3RhbmNlLT5oYXNSdW50aW1lUklEKCkgKQ0KKwkJCXsNCisJCQkJRU5WLm91dFZBTCA9IGFuSW5zdGFuY2UtPmdldFJ1bnRpbWVSSUQoKTsNCisJCQl9DQorDQorCQkJZWxzZSBpZiggRXhlY3V0YWJsZUxpYjo6TUFDSElORV9OVUxMID09IGFuSW5zdGFuY2UgKQ0KKwkJCXsNCisJCQkJRU5WLm91dFZBTCA9IFJ1bnRpbWVMaWI6OlJJRF9OSUw7DQorCQkJfQ0KKw0KKwkJCWVsc2UgaWYoIEV4ZWN1dGFibGVMaWI6Ok1BQ0hJTkVfRU5WSVJPTk1FTlQgPT0gYW5JbnN0YW5jZSApDQorCQkJew0KKwkJCQlFTlYub3V0VkFMID0gUnVudGltZUxpYjo6UklEX0VOVklST05NRU5UOw0KKwkJCX0NCisNCisJCQllbHNlDQorCQkJew0KKwkJCQlFTlYub3V0VkFMID0gRU5WLm91dEVELT5nZXRSdW50aW1lSUQoYW5JbnN0YW5jZSk7DQorCQkJfQ0KKw0KKwkJCXJldHVybiggdHJ1ZSApOw0KKwkJfQ0KKw0KKwkJY2FzZSBGT1JNX1JVTlRJTUVfSURfS0lORDoNCisNCisJCWNhc2UgRk9STV9JTlNUQU5DRV9QT1JUX0tJTkQ6DQorCQljYXNlIEZPUk1fSU5TVEFOQ0VfQlVGRkVSX0tJTkQ6DQorCQljYXNlIEZPUk1fSU5TVEFOQ0VfQ09OTkVDVE9SX0tJTkQ6DQorCQl7DQorCQkJRU5WLm91dFZBTCA9IEVOVi5pbkZPUk07DQorDQorCQkJcmV0dXJuKCB0cnVlICk7DQorCQl9DQorDQorDQorCQljYXNlIEZPUk1fQVJSQVlfQk9PTEVBTl9LSU5EOg0KKwkJY2FzZSBGT1JNX0FSUkFZX0lOVEVHRVJfS0lORDoNCisJCWNhc2UgRk9STV9BUlJBWV9SQVRJT05BTF9LSU5EOg0KKwkJY2FzZSBGT1JNX0FSUkFZX0ZMT0FUX0tJTkQ6DQorDQorCQljYXNlIEZPUk1fQVJSQVlfQ0hBUkFDVEVSX0tJTkQ6DQorCQljYXNlIEZPUk1fQVJSQVlfSURFTlRJRklFUl9LSU5EOg0KKwkJY2FzZSBGT1JNX0FSUkFZX1NUUklOR19LSU5EOg0KKwkJY2FzZSBGT1JNX0FSUkFZX1FVQUxJRklFRF9JREVOVElGSUVSX0tJTkQ6DQorCQl7DQorCQkJRU5WLm91dFZBTC5yZW5ldyggRU5WLmluRk9STS50b19wdHI8IEJ1aWx0aW5BcnJheSA+KCktPmdldEFycmF5QkYoKSApOw0KKw0KKwkJCXJldHVybiggdHJ1ZSApOw0KKwkJfQ0KKw0KKw0KKwkJY2FzZSBGT1JNX0FSUkFZX0JGX0tJTkQ6DQorCQl7DQorCQkJQXJyYXlCRiAqIGluQXJyYXkgPSBFTlYuaW5GT1JNLnRvX3B0cjwgQXJyYXlCRiA+KCk7DQorDQorCQkJQXJyYXlCRiAqIG91dEFycmF5QkYgPSBuZXcgQXJyYXlCRigNCisJCQkJCWluQXJyYXktPmdldFR5cGVTcGVjaWZpZXIoKSwgaW5BcnJheS0+c2l6ZSgpKTsNCisNCisJCQlmb3IoIGF2bV9zaXplX3QgaSA9IDAgOyBpIDwgaW5BcnJheS0+c2l6ZSgpIDsgKytpICkNCisJCQl7DQorCQkJCWlmKCBFTlYuc2V2YWwoIGluQXJyYXktPmF0KGkpICkgKQ0KKwkJCQl7DQorCQkJCQlvdXRBcnJheUJGLT5zZXQoaSwgRU5WLm91dFZBTCk7DQorCQkJCX0NCisJCQkJZWxzZQ0KKwkJCQl7DQorCQkJCQlFTlYub3V0VkFMLnJlbmV3KCBvdXRBcnJheUJGICk7DQorDQorCQkJCQlyZXR1cm4oIGZhbHNlICk7DQorCQkJCX0NCisJCQl9DQorDQorCQkJRU5WLm91dFZBTC5yZW5ldyggb3V0QXJyYXlCRiApOw0KKw0KKwkJCXJldHVybiggdHJ1ZSApOw0KKwkJfQ0KKw0KKw0KKwkJZGVmYXVsdDoNCisJCXsNCisJCQlpZiggRU5WLmluRk9STS5pczwgQnVpbHRpbkxpc3QgPigpICkNCisJCQl7DQorCQkJCUJ1aWx0aW5MaXN0ICogaW5Db250YWluZXIgPSBFTlYuaW5GT1JNLnRvX3B0cjwgQnVpbHRpbkxpc3QgPigpOw0KKw0KKwkJCQlCdWlsdGluTGlzdCAqIG91dENvbnRhaW5lciA9IG5ldyBCdWlsdGluTGlzdCgNCisJCQkJCQlpbkNvbnRhaW5lci0+Y2xhc3NLaW5kKCksIGluQ29udGFpbmVyLT5jYXBhY2l0eSgpKTsNCisNCisJCQkJQnVpbHRpbkxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gaW5Db250YWluZXItPmJlZ2luKCk7DQorCQkJCUJ1aWx0aW5MaXN0Ojpjb25zdF9pdGVyYXRvciBlbmRJdCA9IGluQ29udGFpbmVyLT5lbmQoKTsNCisJCQkJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApDQorCQkJCXsNCisJCQkJCWlmKCBFTlYuc2V2YWwoICppdCApICkNCisJCQkJCXsNCisJCQkJCQlvdXRDb250YWluZXItPnB1c2goRU5WLm91dFZBTCk7DQorCQkJCQl9DQorCQkJCQllbHNlDQorCQkJCQl7DQorCQkJCQkJRU5WLm91dFZBTC5yZW5ldyggb3V0Q29udGFpbmVyICk7DQorDQorCQkJCQkJcmV0dXJuKCBmYWxzZSApOw0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCUVOVi5vdXRWQUwucmVuZXcoIG91dENvbnRhaW5lciApOw0KKw0KKwkJCQlyZXR1cm4oIHRydWUgKTsNCisJCQl9DQorDQorCQkJZWxzZSBpZiggRU5WLmluRk9STS5pczwgQnVpbHRpblZlY3RvciA+KCkgKQ0KKwkJCXsNCisJCQkJQnVpbHRpblZlY3RvciAqIGluQ29udGFpbmVyID0gRU5WLmluRk9STS50b19wdHI8IEJ1aWx0aW5WZWN0b3IgPigpOw0KKw0KKwkJCQlCdWlsdGluVmVjdG9yICogb3V0Q29udGFpbmVyID0gbmV3IEJ1aWx0aW5WZWN0b3IoDQorCQkJCQkJaW5Db250YWluZXItPmNsYXNzS2luZCgpLA0KKwkJCQkJCSgoQnVpbHRpbkNvbnRhaW5lciAqKWluQ29udGFpbmVyKS0+Y2FwYWNpdHkoKSk7DQorDQorCQkJCWZvciggYXZtX3NpemVfdCBpID0gMCA7IGkgPCBpbkNvbnRhaW5lci0+c2l6ZSgpIDsgKytpICkNCisJCQkJew0KKwkJCQkJaWYoIEVOVi5zZXZhbCggaW5Db250YWluZXItPmF0KGkpICkgKQ0KKwkJCQkJew0KKwkJCQkJCW91dENvbnRhaW5lci0+cHVzaChFTlYub3V0VkFMKTsNCisJCQkJCX0NCisJCQkJCWVsc2UNCisJCQkJCXsNCisJCQkJCQlFTlYub3V0VkFMLnJlbmV3KCBvdXRDb250YWluZXIgKTsNCisNCisJCQkJCQlyZXR1cm4oIGZhbHNlICk7DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJRU5WLm91dFZBTC5yZW5ldyggb3V0Q29udGFpbmVyICk7DQorDQorCQkJCXJldHVybiggdHJ1ZSApOw0KKwkJCX0NCisNCisJCQkvLyBUT0RPDQorCQkJQVZNX09TX1dBUk5JTkdfQUxFUlQNCisJCQkJCTw8ICJBdm1QcmltaXRpdmVQcm9jZXNzb3IgaXMgdHJ5aW5nICINCisJCQkJCQkidG8gZGVjb2RlX3NldmFsIHRoZSBFeHByZXNzaW9uXG4iDQorCQkJCQk8PCBFTlYuaW5GT1JNLnRvU3RyaW5nKCBBVk1fVEFCMV9JTkRFTlQgKQ0KKwkJCQkJPDwgU0VORF9BTEVSVDsNCisNCisJCQlFTlYub3V0VkFMID0gRU5WLmluRk9STTsNCisNCisJCQlyZXR1cm4oIGZhbHNlICk7DQorCQl9DQorCX0NCisNCisJcmV0dXJuKCB0cnVlICk7DQorfQ0KKw0KKw0KKw0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtUHJpbWl0aXZlUHJvY2Vzc29yLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtUHJpbWl0aXZlUHJvY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhhZDhjNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1QcmltaXRpdmVQcm9jZXNzb3IuaApAQCAtMCwwICsxLDE5NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDE4IG1haSAyMDEwCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQVZNUFJJTUlUSVZFUFJPQ0VTU09SX0hfCisjZGVmaW5lIEFWTVBSSU1JVElWRVBST0NFU1NPUl9IXworCisjaW5jbHVkZSA8Y29sbGVjdGlvbi9UeXBlZGVmLmg+CisKKyNpbmNsdWRlIDxmbWwvb3BlcmF0b3IvT3BlcmF0b3IuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkRhdGEuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworY2xhc3MgQXZtUHJpbWl0aXZlX0V2YWxFeHByZXNzaW9uQUxVOworY2xhc3MgQXZtUHJpbWl0aXZlX0ludm9rZVJvdXRpbmU7CitjbGFzcyBBdm1Qcm9ncmFtOworCitjbGFzcyBCYXNlQXZtUHJpbWl0aXZlOworY2xhc3MgQnVpbGRlcjsKKworY2xhc3MgQ29uZmlndXJhdGlvbjsKKworY2xhc3MgRXZhbHVhdGlvbkVudmlyb25tZW50OworY2xhc3MgRXhlY3V0aW9uRW52aXJvbm1lbnQ7CisKK2NsYXNzIExvYWRlcjsKKworY2xhc3MgU3ltYmV4RW5naW5lOworCisKK2NsYXNzIEF2bVByaW1pdGl2ZVByb2Nlc3NvcgoreworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogVFlQRURFRgorCSAqLworCXR5cGVkZWYgVmVjdG9yPCBCYXNlQXZtUHJpbWl0aXZlICogPiAgVmVjdG9yT2ZBdm1QcmltaXRpdmU7CisKKwkvKioKKwkgKiBBVFRSSUJVVEVTCisJICovCisJU3ltYmV4RW5naW5lICYgbVN5bWJleEVuZ2luZTsKKworCUNvbmZpZ3VyYXRpb24gJiBtQ29uZmlndXJhdGlvbjsKKworCVZlY3Rvck9mQXZtUHJpbWl0aXZlIEFWTV9QUklNSVRJVkVfVEFCTEU7CisKKwlBdm1QcmltaXRpdmVfRXZhbEV4cHJlc3Npb25BTFUgKiBERUZBVUxUX0VWQUxfRVhQUkVTU0lPTl9BTFU7CisKKwlBdm1QcmltaXRpdmVfSW52b2tlUm91dGluZSAqIERFRkFVTFRfSU5WT0tFX1JPVVRJTkU7CisKKwlCYXNlQXZtUHJpbWl0aXZlICogREVGQVVMVF9BVk1fUFJJTUlUSVZFOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlBdm1QcmltaXRpdmVQcm9jZXNzb3IoCisJCQlTeW1iZXhFbmdpbmUgJiBhU3ltYmV4RW5naW5lLCBDb25maWd1cmF0aW9uICYgYUNvbmZpZ3VyYXRpb24pCisJOiBtU3ltYmV4RW5naW5lKCBhU3ltYmV4RW5naW5lICksCisJbUNvbmZpZ3VyYXRpb24oIGFDb25maWd1cmF0aW9uICksCisKKwlBVk1fUFJJTUlUSVZFX1RBQkxFKCApLAorCURFRkFVTFRfRVZBTF9FWFBSRVNTSU9OX0FMVSggTlVMTCApLAorCURFRkFVTFRfSU5WT0tFX1JPVVRJTkUoIE5VTEwgKSwKKwlERUZBVUxUX0FWTV9QUklNSVRJVkUoIE5VTEwgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkF2bVByaW1pdGl2ZVByb2Nlc3NvcigpOworCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtQ29uZmlndXJhdGlvbgorCSAqIG1TeW1iZXhFbmdpbmUKKwkgKi8KKwlpbmxpbmUgU3ltYmV4RW5naW5lICYgZ2V0U3ltYmV4RW5naW5lKCkKKwl7CisJCXJldHVybiggbVN5bWJleEVuZ2luZSApOworCX0KKworCWlubGluZSBDb25maWd1cmF0aW9uICYgZ2V0Q29uZmlndXJhdGlvbigpCisJeworCQlyZXR1cm4oIG1Db25maWd1cmF0aW9uICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBCdWlsZGVyCisJICogTG9hZGVyCisJICovCisJQnVpbGRlciAmIGdldEJ1aWxkZXIoKTsKKworCUxvYWRlciAmIGdldExvYWRlcigpOworCisKKwkvKioKKwkgKiBDT05GSUdVUkUKKwkgKi8KKwlib29sIGNvbmZpZ3VyZSgpOworCisJYm9vbCBjb25maWd1cmVPdGhlcigpOworCisJYm9vbCBjb25maWd1cmVNZXRhKCk7CisKKwlib29sIGNvbmZpZ3VyZUxhbWJkYVByaW1pdGl2ZSgpOworCisJYm9vbCBjb25maWd1cmVBY3Rpdml0eVByaW1pdGl2ZSgpOworCisJYm9vbCBjb25maWd1cmVTdGF0dXNQcmltaXRpdmUoKTsKKworCWJvb2wgY29uZmlndXJlQ29uY3VycmVuY3lQcmltaXRpdmUoKTsKKwlib29sIGNvbmZpZ3VyZUJhc2ljUHJpbWl0aXZlKCk7CisKKwlib29sIGNvbmZpZ3VyZUFyaXRobWV0aWNQcmltaXRpdmUoKTsKKwlib29sIGNvbmZpZ3VyZUJpdHdpc2VQcmltaXRpdmUoKTsKKwlib29sIGNvbmZpZ3VyZUxvZ2ljUHJpbWl0aXZlKCk7CisKKwlib29sIGNvbmZpZ3VyZUxvb2t1cFByaW1pdGl2ZSgpOworCWJvb2wgY29uZmlndXJlTWF0aGVtYXRpY1ByaW1pdGl2ZSgpOworCisJYm9vbCBjb25maWd1cmVTdHJpbmdQcmltaXRpdmUoKTsKKworCWJvb2wgY29uZmlndXJlSW9sdFByaW1pdGl2ZSgpOworCisKKworCS8qKgorCSAqIHRoZSBSVU4gc3RhdGVtZW50CisJICovCisKKwl2b2lkIHBvc3RSdW4oRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMsIExpc3RPZkFQRXhlY3V0aW9uRGF0YSAmIHJ1bkVEUyk7CisJdm9pZCBwb3N0UnVuKEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDLCBFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVik7CisKKworCXZvaWQgaW5pdChFeGVjdXRpb25Db250ZXh0ICYgYW5FQyk7CisKKworCXZvaWQgcnVuKEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKTsKKworCWJvb2wgcnVuKGF2bV9vZmZzZXRfdCBvcE9mZnNldCwgRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpOworCisKKwlib29sIGludm9rZVJvdXRpbmUoRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsCisJCQlBdm1Qcm9ncmFtICogYVByb2dyYW0sIGNvbnN0IEJGICYgYVBhcmFtKTsKKworCisJLyoqCisJICogdGhlIFJFU1VNRSBpbnN0cnVjdGlvbgorCSAqLworCWJvb2wgcmVzdW1lKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKTsKKworCWJvb2wgZGVjb2RlX3Jlc3VtZShFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVik7CisKKworCS8qKgorCSAqIHRoZSBERUNPREUgRVZBTCBpbnN0cnVjdGlvbgorCSAqLworCWJvb2wgc2V2YWwoRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WKTsKKworCWJvb2wgc2V2YWxfd3J0X0FSRyhFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBFTlYpOworCisKKwlib29sIGRlY29kZV9zZXZhbChFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBFTlYpOworCit9OworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworCisjZW5kaWYgLyogQVZNUFJJTUlUSVZFUFJPQ0VTU09SX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtU2NoZWR1bGluZ1ByaW1pdGl2ZS5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtU2NoZWR1bGluZ1ByaW1pdGl2ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThlNzdmYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1TY2hlZHVsaW5nUHJpbWl0aXZlLmNwcApAQCAtMCwwICsxLDM3OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDIwIG1haSAyMDEwCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJBdm1TY2hlZHVsaW5nUHJpbWl0aXZlLmgiCisKKyNpbmNsdWRlIDxjb21wdXRlci9FeGVjdXRpb25FbnZpcm9ubWVudC5oPgorI2luY2x1ZGUgPGNvbXB1dGVyL1BhdGhDb25kaXRpb25Qcm9jZXNzb3IuaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0F2bUNvZGUuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29uc3RhbnQuaD4KKworI2luY2x1ZGUgPGZtbC9vcGVyYXRvci9PcGVyYXRvck1hbmFnZXIuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkRhdGEuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lSUQuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBleGVjdXRpb24gb2YgYW4gRVhDTFVTSVZFIHByb2dyYW0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworYm9vbCBBdm1QcmltaXRpdmVfRXhjbHVzaXZlOjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJRU5WLmluRUQtPnNldEVuYWJsZWRMb2NhbE5vZGVDb25kaXRpb24oIHRydWUgKTsKKworCUxpc3RPZkFQRXhlY3V0aW9uRGF0YSBvbmVMaXN0T2ZFRDsKKwlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGEgcmVzdWx0TGlzdE9mRUQ7CisKKwlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdCA9IEVOVi5pbkNPREUtPmJlZ2luKCk7CisJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBFTlYuaW5DT0RFLT5lbmQoKTsKKworCS8vIEluaXRpYWxpc2F0aW9uIGR1IHByb2Nlc3MKKwlFeGVjdXRpb25FbnZpcm9ubWVudCB0bXBFTlYoRU5WLCAqaXQpOworCWlmKCBub3QgdG1wRU5WLnJ1bigpICkKKwl7CisJCXJldHVybiggZmFsc2UgKTsKKwl9CisJb25lTGlzdE9mRUQuc3BsaWNlKCB0bXBFTlYub3V0RURTICk7CisKKwkvLyBSZWN1cnJlbmNlCisJZm9yKCArK2l0IDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwl7CisJCWlmKCBub3QgdG1wRU5WLnJ1bigqaXQpICkKKwkJeworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisKKwkJLy8gQ09NUFVURSBTVFJPTkcgRlVTSU9OCisJCWlmKCBvbmVMaXN0T2ZFRC5lbXB0eSgpICkKKwkJeworCQkJcmVzdWx0TGlzdE9mRUQuc3BsaWNlKCB0bXBFTlYub3V0RURTICk7CisJCX0KKwkJZWxzZSBpZiggdG1wRU5WLm91dEVEUy5lbXB0eSgpICkKKwkJeworCQkJcmVzdWx0TGlzdE9mRUQuc3BsaWNlKCBvbmVMaXN0T2ZFRCApOworCQl9CisKKwkJZWxzZQorCQl7CisJCQlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGE6Oml0ZXJhdG9yIGl0T3RoZXIgPSB0bXBFTlYub3V0RURTLmJlZ2luKCk7CisJCQlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGE6Oml0ZXJhdG9yIGVuZE90aGVyID0gdG1wRU5WLm91dEVEUy5lbmQoKTsKKwkJCWZvciggOyBpdE90aGVyICE9IGVuZE90aGVyIDsgKytpdE90aGVyICkKKwkJCXsKKwkJCQkvLyBDb21wdXRlIE9USEVSIHdoZXJlIE5PVCBPTkUKKwkJCQlpZiggbm90IGV2YWxFeGNsdXNpdmUoRU5WLmluRUQsCisJCQkJCQlvbmVMaXN0T2ZFRCwgKCppdE90aGVyKSwgcmVzdWx0TGlzdE9mRUQpICkKKwkJCQl7CisJCQkJCS8vcmV0dXJuKCBmYWxzZSApOworCQkJCX0KKworCQkJCS8vIENvbXB1dGUgT05FIHdoZXJlIE5PVCBPVEhFUlMKKwkJCQlpZiggbm90IGV2YWxFeGNsdXNpdmUoRU5WLmluRUQsCisJCQkJCQkoKml0T3RoZXIpLCBvbmVMaXN0T2ZFRCwgcmVzdWx0TGlzdE9mRUQpICkKKwkJCQl7CisJCQkJCS8vcmV0dXJuKCBmYWxzZSApOworCQkJCX0KKwkJCX0KKworCQkJb25lTGlzdE9mRUQuY2xlYXIoKTsKKwkJCXJlc3VsdExpc3RPZkVELm1ha2VVbmlxdWUoKTsKKwkJfQorCisJCXdoaWxlKCByZXN1bHRMaXN0T2ZFRC5ub25lbXB0eSgpICkKKwkJeworCQkJcmVzdWx0TGlzdE9mRUQubGFzdCgpLT5zZXRFbmFibGVkTG9jYWxOb2RlQ29uZGl0aW9uKCBmYWxzZSApOworCisJCQlvbmVMaXN0T2ZFRC5hcHBlbmQoIHJlc3VsdExpc3RPZkVELnBvcF9sYXN0KCkgKTsKKwkJfQorCX0KKworCUVOVi5pbkVELT5zZXRFbmFibGVkTG9jYWxOb2RlQ29uZGl0aW9uKCBmYWxzZSApOworCisJRU5WLm91dEVEUy5zcGxpY2UoIG9uZUxpc3RPZkVEICk7CisKKwlFTlYuc3BsaWNlTm90T3V0cHV0KCB0bXBFTlYgKTsKKworCXJldHVybiggdHJ1ZSApOworfQorCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXhlY3V0aW9uIG9mIGFuIE5PTkRFVEVSTUlOSVNNIHByb2dyYW0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworYm9vbCBBdm1QcmltaXRpdmVfTm9uZGV0ZXJtaW5pc206OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IEVOVi5pbkNPREUtPmVuZCgpOworCWZvciggQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBFTlYuaW5DT0RFLT5iZWdpbigpIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwl7CisJCUVOVi5ydW4oICppdCApOworCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXhlY3V0aW9uIG9mIGEgUFJJT1IgcHJvZ3JhbQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitib29sIEF2bVByaW1pdGl2ZV9Qcmlvcjo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCUFQRXhlY3V0aW9uRGF0YSB0bXBFRDsKKworCUJGIGFQYXRoQ29uZGl0aW9uOworCUJGIGFQcmlvcml0eUNvbmRpdGlvbiA9IEV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9UUlVFOworCisJQkZDb2RlIHRoZU5vZGVDb25kaXRpb24oIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfT1IgKTsKKworCUJGIHNhdmVQYXJhbXNSRiA9IEVOVi5pbkVELT5iZlBhcmFtZXRlcnNSdW50aW1lRm9ybSgpOworCisJQkYgYmZVcGRhdGVQYXJhbXNSRiA9IHNhdmVQYXJhbXNSRjsKKwliZlVwZGF0ZVBhcmFtc1JGLm1ha2VXcml0YWJsZSgpOworCVBhcmFtZXRlcnNSdW50aW1lRm9ybSAqIHVwZGF0ZVBhcmFtc1JGID0KKwkJCWJmVXBkYXRlUGFyYW1zUkYudG9fcHRyPCBQYXJhbWV0ZXJzUnVudGltZUZvcm0gPigpOworCisJLy8gUmVjdXJyZW5jZQorCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gRU5WLmluQ09ERS0+ZW5kKCk7CisJZm9yKCBBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdCA9IEVOVi5pbkNPREUtPmJlZ2luKCkgOyBpdCAhPSBpdEVuZCA7ICsraXQgKQorCXsKKwkJRU5WLmluRUQtPmFzc2lnblBhcmFtZXRlcnNSdW50aW1lRm9ybSggYmZVcGRhdGVQYXJhbXNSRiApOworCisJCUV4ZWN1dGlvbkVudmlyb25tZW50IHRtcEVOVihFTlYsICppdCk7CisJCXRtcEVOVi5pbkVELT5zZXRFbmFibGVkTG9jYWxOb2RlQ29uZGl0aW9uKCB0cnVlICk7CisKKwkJdG1wRU5WLnJ1bigpOworCisJCWlmKCB0bXBFTlYub3V0RURTLm5vbmVtcHR5KCkgfHwgdG1wRU5WLmV4aXRFRFMubm9uZW1wdHkoKSApCisJCXsKKwkJCXdoaWxlKCB0bXBFTlYub3V0RURTLm5vbmVtcHR5KCkgKQorCQkJeworCQkJCXRtcEVOVi5vdXRFRFMucG9wX2xhc3RfdG8oIHRtcEVEICk7CisKKwkJCQlpZiggYVByaW9yaXR5Q29uZGl0aW9uLmlzRXF1YWxUcnVlKCkgKQorCQkJCXsKKwkJCQkJYVBhdGhDb25kaXRpb24gPSB0bXBFRC0+Z2V0UGF0aENvbmRpdGlvbigpOworCQkJCX0KKwkJCQllbHNlIGlmKCB0bXBFRC0+Z2V0UGF0aENvbmRpdGlvbigpLmlzRXF1YWxUcnVlKCkgKQorCQkJCXsKKwkJCQkJYVBhdGhDb25kaXRpb24gPSBhUHJpb3JpdHlDb25kaXRpb247CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWFQYXRoQ29uZGl0aW9uID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjphbmRFeHByKAorCQkJCQkJCWFQcmlvcml0eUNvbmRpdGlvbiwgdG1wRUQtPmdldFBhdGhDb25kaXRpb24oKSk7CisKKwkJCQkJaWYoIG5vdCBQYXRoQ29uZGl0aW9uUHJvY2Vzc29yOjppc1dlYWtTYXRpc2ZpYWJsZSgKKwkJCQkJCQlhUGF0aENvbmRpdGlvbikgKQorCQkJCQl7CisJCQkJCQlhUGF0aENvbmRpdGlvbiA9IEV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9GQUxTRTsKKworQVZNX0lGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9URVNUX0RFQ0lTSU9OICkKKwlBVk1fT1NfVFJBQ0UgPDwgIlBBVEggQ09ORElUSU9OIDogIgorCQkJPDwgdG1wRUQtPmdldFBhdGhDb25kaXRpb24oKS5zdHIoKSA8PCBzdGQ6OmVuZGwKKwkJCTw8ICJQUklPUklUWSBDT05ESVRJT04gOiAiIDw8IGFQcmlvcml0eUNvbmRpdGlvbi5zdHIoKSA8PCBzdGQ6OmVuZGwKKwkJCTw8ICJGSVJFQUJMRSBDT05ESVRJT04gOiAiIDw8IGFQYXRoQ29uZGl0aW9uLnN0cigpICAgICA8PCBzdGQ6OmVuZGwKKwkJCTw8ICJUSFJPVyBVTlNBVElTRklFRCA8PCBQUklPUiBDT05ESVRJT04gPj4gOiAiCisJCQk8PCB0bXBFRC0+bVJJRC5zdHJVbmlxSWQoKSA8PCAiIHw9PiAiIDw8ICgqaXQpLnN0cigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfVEVTVF9ERUNJU0lPTiApCisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiggYVBhdGhDb25kaXRpb24uaXNOb3RFcXVhbEZhbHNlKCkgKQorCQkJCXsKKwkJCQkJaWYoIHRtcEVELT5nZXRBbGxOb2RlQ29uZGl0aW9uKCkuaXNOb3RFcXVhbFRydWUoKSApCisJCQkJCXsKKwkJCQkJCXRoZU5vZGVDb25kaXRpb24tPmFwcGVuZCggdG1wRUQtPmdldEFsbE5vZGVDb25kaXRpb24oKSApOworCisJCQkJCQl1cGRhdGVQYXJhbXNSRi0+dXBkYXRlKCB0bXBFRC0+Z2V0QWxsTm9kZUNvbmRpdGlvbigpICk7CisJCQkJCX0KKworCQkJCQl0bXBFRC0+c2V0UGF0aENvbmRpdGlvbiggYVBhdGhDb25kaXRpb24gKTsKKwkJCQkJdG1wRUQtPnNldEVuYWJsZWRMb2NhbE5vZGVDb25kaXRpb24oIGZhbHNlICk7CisKKwkJCQkJRU5WLm91dEVEUy5hcHBlbmQoIHRtcEVEICk7CisJCQkJfQorCQkJfQorCisJCQl3aGlsZSggdG1wRU5WLmV4aXRFRFMubm9uZW1wdHkoKSApCisJCQl7CisJCQkJdG1wRU5WLmV4aXRFRFMucG9wX2xhc3RfdG8oIHRtcEVEICk7CisKKwkJCQlpZiggYVByaW9yaXR5Q29uZGl0aW9uLmlzRXF1YWxUcnVlKCkgKQorCQkJCXsKKwkJCQkJYVBhdGhDb25kaXRpb24gPSB0bXBFRC0+Z2V0UGF0aENvbmRpdGlvbigpOworCQkJCX0KKwkJCQllbHNlIGlmKCB0bXBFRC0+Z2V0UGF0aENvbmRpdGlvbigpLmlzRXF1YWxUcnVlKCkgKQorCQkJCXsKKwkJCQkJYVBhdGhDb25kaXRpb24gPSBhUHJpb3JpdHlDb25kaXRpb247CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWFQYXRoQ29uZGl0aW9uID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjphbmRFeHByKAorCQkJCQkJCWFQcmlvcml0eUNvbmRpdGlvbiwgdG1wRUQtPmdldFBhdGhDb25kaXRpb24oKSk7CisKKwkJCQkJaWYoIG5vdCBQYXRoQ29uZGl0aW9uUHJvY2Vzc29yOjppc1dlYWtTYXRpc2ZpYWJsZSgKKwkJCQkJCQlhUGF0aENvbmRpdGlvbikgKQorCQkJCQl7CisJCQkJCQlhUGF0aENvbmRpdGlvbiA9IEV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9GQUxTRTsKKworQVZNX0lGX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9URVNUX0RFQ0lTSU9OICkKKwlBVk1fT1NfVFJBQ0UgPDwgIlBBVEggQ09ORElUSU9OIDogIgorCQkJPDwgdG1wRUQtPmdldFBhdGhDb25kaXRpb24oKS5zdHIoKSA8PCBzdGQ6OmVuZGwKKwkJCTw8ICJQUklPUklUWSBDT05ESVRJT04gOiAiIDw8IGFQcmlvcml0eUNvbmRpdGlvbi5zdHIoKSA8PCBzdGQ6OmVuZGwKKwkJCTw8ICJGSVJFQUJMRSBDT05ESVRJT04gOiAiIDw8IGFQYXRoQ29uZGl0aW9uLnN0cigpICAgICA8PCBzdGQ6OmVuZGwKKwkJCTw8ICJUSFJPVyBVTlNBVElTRklFRCA8PCBQUklPUiBDT05ESVRJT04gPj4gOiAiCisJCQk8PCB0bXBFRC0+bVJJRC5zdHJVbmlxSWQoKSA8PCAiIHw9PiAiIDw8ICgqaXQpLnN0cigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfVEVTVF9ERUNJU0lPTiApCisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiggYVBhdGhDb25kaXRpb24uaXNOb3RFcXVhbEZhbHNlKCkgKQorCQkJCXsKKwkJCQkJaWYoIHRtcEVELT5nZXRBbGxOb2RlQ29uZGl0aW9uKCkuaXNOb3RFcXVhbFRydWUoKSApCisJCQkJCXsKKwkJCQkJCXRoZU5vZGVDb25kaXRpb24tPmFwcGVuZCggdG1wRUQtPmdldEFsbE5vZGVDb25kaXRpb24oKSApOworCisJCQkJCQl1cGRhdGVQYXJhbXNSRi0+dXBkYXRlKCB0bXBFRC0+Z2V0QWxsTm9kZUNvbmRpdGlvbigpICk7CisJCQkJCX0KKworCQkJCQl0bXBFRC0+c2V0UGF0aENvbmRpdGlvbiggYVBhdGhDb25kaXRpb24gKTsKKwkJCQkJdG1wRUQtPnNldEVuYWJsZWRMb2NhbE5vZGVDb25kaXRpb24oIGZhbHNlICk7CisKKwkJCQkJRU5WLmV4aXRFRFMuYXBwZW5kKCB0bXBFRCApOworCQkJCX0KKwkJCX0KKworCisJCQlpZiggdGhlTm9kZUNvbmRpdGlvbi0+ZW1wdHkoKSApCisJCQl7CisJCQkJLy9hUHJpb3JpdHlDb25kaXRpb24gPSBFeHByZXNzaW9uQ29uc3RhbnQ6OkJPT0xFQU5fRkFMU0U7IC8vIDw9PiBub3QgdHJ1ZQorCQkJCWJyZWFrOworCQkJfQorCisJCQllbHNlIGlmKCB0aGVOb2RlQ29uZGl0aW9uLT5wb3B1bGF0ZWQoKSApCisJCQl7CisJCQkJYVByaW9yaXR5Q29uZGl0aW9uID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpub3RFeHByKAorCQkJCQkJdGhlTm9kZUNvbmRpdGlvbiApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWFQcmlvcml0eUNvbmRpdGlvbiA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bm90RXhwcigKKwkJCQkJCXRoZU5vZGVDb25kaXRpb24tPnBvcF9sYXN0KCkgKTsKKwkJCX0KKworCQkJaWYoIG5vdCBQYXRoQ29uZGl0aW9uUHJvY2Vzc29yOjppc1dlYWtTYXRpc2ZpYWJsZSgKKwkJCQkJYVByaW9yaXR5Q29uZGl0aW9uKSApCisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisKK0FWTV9JRl9ERUJVR19GTEFHKCBTVEFURU1FTlRfVEVTVF9ERUNJU0lPTiApCisJQVZNX09TX1RSQUNFIDw8ICJQUklPUklUWSBDT05ESVRJT04gOiAiIDw8IGFQcmlvcml0eUNvbmRpdGlvbi5zdHIoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggU1RBVEVNRU5UX1RFU1RfREVDSVNJT04gKQorCQl9CisKKwkJRU5WLnNwbGljZU5vdE91dHB1dCggdG1wRU5WICk7CisJfQorCisJRU5WLmluRUQtPmFzc2lnblBhcmFtZXRlcnNSdW50aW1lRm9ybSggc2F2ZVBhcmFtc1JGICk7CisKKworCXJldHVybiggdHJ1ZSApOworfQorCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXhlY3V0aW9uIG9mIGFuIEFORCNUSEVOIHByb2dyYW0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworYm9vbCBBdm1QcmltaXRpdmVfU2NoZWR1bGVBbmRUaGVuOjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJRXhlY3V0aW9uRW52aXJvbm1lbnQgdG1wRU5WKEVOViwgQkY6OlJFRl9OVUxMKTsKKworCXRtcEVOVi5vdXRFRFMuYXBwZW5kKHRtcEVOVi5pbkVEKTsKKworCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0QXJnID0gRU5WLmluQ09ERS0+YmVnaW4oKTsKKwlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBlbmRBcmcgPSBFTlYuaW5DT0RFLT5lbmQoKTsKKwlmb3IoIDsgaXRBcmcgIT0gZW5kQXJnIDsgKytpdEFyZyApCisJeworCQlpZiggdG1wRU5WLnJ1bkZyb21PdXRwdXRzKCAoKml0QXJnKS5iZkNvZGUoKSApICkKKwkJeworCQkJaWYoIHRtcEVOVi5vdXRFRFMuZW1wdHkoKSAgJiYgdG1wRU5WLmV4aXRFRFMuZW1wdHkoKSAmJgorCQkJCXRtcEVOVi5zeW5jRURTLmVtcHR5KCkgJiYgdG1wRU5WLmlycUVEUy5lbXB0eSgpICkKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBUSEVOIGNhc2UKKwkJCX0KKwkJfQorCX0KKworCUVOVi5zcGxpY2VPdXRwdXQoIHRtcEVOViApOworCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBleGVjdXRpb24gb2YgYW4gT1IjRUxTRSBwcm9ncmFtCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK2Jvb2wgQXZtUHJpbWl0aXZlX1NjaGVkdWxlT3JFbHNlOjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJRXhlY3V0aW9uRW52aXJvbm1lbnQgdG1wRU5WKEVOViwgQkY6OlJFRl9OVUxMKTsKKworCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0QXJnID0gRU5WLmluQ09ERS0+YmVnaW4oKTsKKwlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBlbmRBcmcgPSBFTlYuaW5DT0RFLT5lbmQoKTsKKwlmb3IoIDsgaXRBcmcgIT0gZW5kQXJnIDsgKytpdEFyZyApCisJeworCQlpZiggdG1wRU5WLnJ1biggKCppdEFyZykuYmZDb2RlKCkgKSApCisJCXsKKwkJCWlmKCB0bXBFTlYub3V0RURTLm5vbmVtcHR5KCkgIHx8IHRtcEVOVi5leGl0RURTLm5vbmVtcHR5KCkgfHwKKwkJCQl0bXBFTlYuc3luY0VEUy5ub25lbXB0eSgpIHx8IHRtcEVOVi5pcnFFRFMubm9uZW1wdHkoKSApCisJCQl7CisJCQkJRU5WLnNwbGljZU91dHB1dCggdG1wRU5WICk7CisKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBFTFNFIGNhc2UKKwkJCX0KKwkJfQorCisJCUVOVi5zcGxpY2VPdXRwdXQoIHRtcEVOViApOworCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtU2NoZWR1bGluZ1ByaW1pdGl2ZS5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bVNjaGVkdWxpbmdQcmltaXRpdmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGIwNGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bVNjaGVkdWxpbmdQcmltaXRpdmUuaApAQCAtMCwwICsxLDQyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjAgbWFpIDIwMTAKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBBVk1TQ0hFRFVMSU5HUFJJTUlUSVZFX0hfCisjZGVmaW5lIEFWTVNDSEVEVUxJTkdQUklNSVRJVkVfSF8KKworI2luY2x1ZGUgPGNvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1CYXNlQ29uY3VycmVuY3lQcmltaXRpdmUuaD4KKyNpbmNsdWRlIDxjb21wdXRlci9wcmltaXRpdmUvQmFzZUF2bVByaW1pdGl2ZS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworQVZNX1BSSU1JVElWRV9SVU5fQ0xBU1MoRXhjbHVzaXZlLCBzZXA6OkF2bUJhc2VDb25jdXJyZW5jeVByaW1pdGl2ZSkKKworCitBVk1fUFJJTUlUSVZFX1JVTl9DTEFTUyhOb25kZXRlcm1pbmlzbSwgQmFzZUF2bVByaW1pdGl2ZSkKKworCitBVk1fUFJJTUlUSVZFX1JVTl9DTEFTUyhQcmlvciwgQmFzZUF2bVByaW1pdGl2ZSkKKworCitBVk1fUFJJTUlUSVZFX1JVTl9DTEFTUyhTY2hlZHVsZUFuZFRoZW4sIEJhc2VBdm1QcmltaXRpdmUpCisKK0FWTV9QUklNSVRJVkVfUlVOX0NMQVNTKFNjaGVkdWxlT3JFbHNlLCBCYXNlQXZtUHJpbWl0aXZlKQorCisKK30KKworI2VuZGlmIC8qIEFWTVNDSEVEVUxJTkdQUklNSVRJVkVfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1TZXF1ZW5jZVByaW1pdGl2ZS5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtU2VxdWVuY2VQcmltaXRpdmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMjc4OGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtU2VxdWVuY2VQcmltaXRpdmUuY3BwCkBAIC0wLDAgKzEsNjEyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjAgbWFpIDIwMTAKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkF2bVNlcXVlbmNlUHJpbWl0aXZlLmgiCisKKyNpbmNsdWRlIDxjb21wdXRlci9FeGVjdXRpb25FbnZpcm9ubWVudC5oPgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQXZtQ29kZS5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uRGF0YS5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL1J1bnRpbWVJRC5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV4ZWN1dGlvbiBvZiBhbiBBVE9NSUMgU0VRVUVOQ0UgcHJvZ3JhbQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK2Jvb2wgQXZtUHJpbWl0aXZlX0F0b21pY1NlcXVlbmNlOjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXRQcm9nID0gRU5WLmluQ09ERS0+YmVnaW4oKTsKKwlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdEVuZCA9IEVOVi5pbkNPREUtPmVuZCgpOworCisJQVBFeGVjdXRpb25EYXRhIHRtcEVEOworCisJLy8gRXZhbHVhdGlvbiBvZiBGSVJTVCBTRVFVRU5DSUFMIFNUQVRFTUVOVAorCUV4ZWN1dGlvbkVudmlyb25tZW50IHRtcEVOVihFTlYsICgqaXRQcm9nKS5iZkNvZGUoKSk7CisJaWYoIG5vdCB0bXBFTlYucnVuKCkgKQorCXsKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCWZvciggKytpdFByb2cgOyBpdFByb2cgIT0gaXRFbmQgOyArK2l0UHJvZyApCisJeworQVZNX0lGX0RFQlVHX0xFVkVMX09SX0ZMQUcyKCBISUdIICwgQ09NUFVUSU5HICwgU1RBVEVNRU5UICkKKwkJc3RhdGljIGF2bV91aW50MzJfdCBlY0NvdW50ID0gODsKKwkJaWYoIHRtcEVOVi5vdXRFRFMuc2l6ZSgpID4gZWNDb3VudCApCisJCXsKKwkJCWVjQ291bnQgPSAoYXZtX3VpbnQzMl90KSggZWNDb3VudCAqIDEuNSApOworCQkJQVZNX09TX1RSQUNFIDw8IFJFUEVBVCgiPT09PT09PT09PSIsIDUpIDw8IHN0ZDo6ZW5kbAorCQkJCQk8PCAiPj4+PiBFeGVjdXRpb24gZnJvbSAiIDw8IHRtcEVOVi5vdXRFRFMuc2l6ZSgpCisJCQkJCTw8ICIgRUNzIiA8PCBzdGQ6OmVuZGw7CisJCX0KK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9PUl9GTEFHMiggSElHSCAsIENPTVBVVElORyAsIFNUQVRFTUVOVCApCisKKwkJLy8gZm9yIG91dHB1dCBFRAorCQlpZiggdG1wRU5WLm91dEVEUy5ub25lbXB0eSgpICkKKwkJeworCQkJaWYoIG5vdCB0bXBFTlYucnVuRnJvbU91dHB1dHMoKCppdFByb2cpLmJmQ29kZSgpKSApCisJCQl7CisJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlFTlYuc3BsaWNlT3V0cHV0KCB0bXBFTlYgKTsKKworCXJldHVybiggdHJ1ZSApOworfQorCisKKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV4ZWN1dGlvbiBvZiBhIFNFUVVFTkNFIHByb2dyYW0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCitib29sIEF2bVByaW1pdGl2ZV9TZXF1ZW5jZTo6cnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WLAorCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdFByb2csIEF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kKQoreworCUFQRXhlY3V0aW9uRGF0YSB0bXBFRDsKKwlSdW50aW1lSUQgdG1wUklEID0gRU5WLmluRUQtPm1SSUQ7CisKKwlMaXN0T2ZBUEV4ZWN1dGlvbkRhdGEgbGlzdE9mQ3VycmVudEVEOworCisJLy8gRXZhbHVhdGlvbiBvZiBGSVJTVCBTRVFVRU5DSUFMIFNUQVRFTUVOVAorCUV4ZWN1dGlvbkVudmlyb25tZW50IHRtcEVOVihFTlYsICgqaXRQcm9nKS5iZkNvZGUoKSk7CisJaWYoIHRtcEVOVi5ydW4oKSApCisJeworCQlsaXN0T2ZDdXJyZW50RUQuc3BsaWNlKCB0bXBFTlYub3V0RURTICk7CisKKwkJLy8gU3luYyBFRFMgdHJhaXRlbWVudAorCQlFTlYuc3BsaWNlU3luY19td1N0b3JlUG9zKHRtcEVOViwgKGl0UHJvZyArIDEpLCBpdEVuZCk7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwlmb3IoICsraXRQcm9nIDsgaXRQcm9nICE9IGl0RW5kIDsgKytpdFByb2cgKQorCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9PUl9GTEFHMiggSElHSCAsIENPTVBVVElORyAsIFNUQVRFTUVOVCApCisJCXN0YXRpYyBhdm1fdWludDMyX3QgZWNDb3VudCA9IDg7CisJCWlmKCBsaXN0T2ZDdXJyZW50RUQuc2l6ZSgpID4gZWNDb3VudCApCisJCXsKKwkJCWVjQ291bnQgPSAoYXZtX3VpbnQzMl90KSggZWNDb3VudCAqIDEuNSApOworCQkJQVZNX09TX1RSQUNFIDw8IFJFUEVBVCgiPT09PT09PT09PSIsIDUpIDw8IHN0ZDo6ZW5kbAorCQkJCQk8PCAiPj4+PiBFeGVjdXRpb24gZnJvbSAiIDw8IGxpc3RPZkN1cnJlbnRFRC5zaXplKCkKKwkJCQkJPDwgIiBFQ3MiIDw8IHN0ZDo6ZW5kbDsKKwkJfQorQVZNX0VORElGX0RFQlVHX0xFVkVMX09SX0ZMQUcyKCBISUdIICwgQ09NUFVUSU5HICwgU1RBVEVNRU5UICkKKworCQl3aGlsZSggbGlzdE9mQ3VycmVudEVELm5vbmVtcHR5KCkgKQorCQl7CisvLwkJCWN1cnJlbnRFRC5wb3BfZmlyc3RfdG8oIHRtcEVEICk7CisJCQlsaXN0T2ZDdXJyZW50RUQucG9wX2xhc3RfdG8oIHRtcEVEICk7CisKKwkJCXN3aXRjaCggdG1wRUQtPm1BRUVTICkKKwkJCXsKKwkJCQljYXNlIEFFRVNfU1RNTlRfTk9USElORzoKKwkJCQljYXNlIEFFRVNfU1RNTlRfRklOQUw6CisJCQkJY2FzZSBBRUVTX1NUTU5UX0RFU1RST1k6CisJCQkJeworCQkJCQl0bXBFRC5td3NldEFFRVMoIEFFRVNfT0sgKTsKKworCQkJCQkvLyEhISBOTyA8PCBicmVhayA+PiBmb3IgdGhlc2Ugc3RhdGVtZW50CisJCQkJfQorCisJCQkJLy8gRXZhbHVhdGlvbiBvZiBORVhUIFNFUVVFTkNJQUwgU1RBVEVNRU5UCisJCQkJY2FzZSBBRUVTX09LOgorCQkJCWNhc2UgQUVFU19TVEVQX1JFU1VNRToKKwkJCQl7CisJCQkJCWlmKCB0bXBFRC0+bVByZXNlcnZlUklEICkKKwkJCQkJeworCQkJCQkJdG1wRUQtPm1QcmVzZXJ2ZVJJRCA9IGZhbHNlOworCQkJCQkJdG1wUklEID0gdG1wRUQtPm1SSUQ7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQl0bXBFRC0+bVJJRCA9IHRtcFJJRDsKKwkJCQkJfQorCisJCQkJCWlmKCB0bXBFTlYucnVuKHRtcEVELCAoKml0UHJvZykuYmZDb2RlKCkpICkKKwkJCQkJeworCQkJCQkJLy8gU3luYyBFRFMgdHJhaXRlbWVudAorCQkJCQkJRU5WLnNwbGljZVN5bmNfbXdTdG9yZVBvcyh0bXBFTlYsIChpdFByb2cgKyAxKSwgaXRFbmQpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCQl9CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCUVOVi5kZXN0cm95T3V0RUQoKTsKKworCQkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJCTw8ICJVbmV4cGVjdGVkIEVORElORCBFWEVDVVRJT04gU1RBVFVTIGFzIG91dEVEUzo+ICIKKwkJCQkJCQk8PCBSdW50aW1lRGVmOjpzdHJBRUVTKCB0bXBFRC0+bUFFRVMgKSA8PCAiICEhISIKKwkJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWxpc3RPZkN1cnJlbnRFRC5zcGxpY2UoICB0bXBFTlYub3V0RURTICApOworCX0KKworCUVOVi5vdXRFRFMuc3BsaWNlKCBsaXN0T2ZDdXJyZW50RUQgKTsKKworCUVOVi5zcGxpY2VOb3RPdXRwdXQodG1wRU5WKTsKKworCXJldHVybiggdHJ1ZSApOworfQorCisKK2Jvb2wgQXZtUHJpbWl0aXZlX1NlcXVlbmNlOjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXRQcm9nID0gRU5WLmluQ09ERS0+YmVnaW4oKTsKKwlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdEVuZCA9IEVOVi5pbkNPREUtPmVuZCgpOworCisJQVBFeGVjdXRpb25EYXRhIHRtcEVEOworCVJ1bnRpbWVJRCB0bXBSSUQgPSBFTlYuaW5FRC0+bVJJRDsKKworCUxpc3RPZkFQRXhlY3V0aW9uRGF0YSBsaXN0T2ZDdXJyZW50RUQ7CisKKwkvLyBFdmFsdWF0aW9uIG9mIEZJUlNUIFNFUVVFTkNJQUwgU1RBVEVNRU5UCisJRXhlY3V0aW9uRW52aXJvbm1lbnQgdG1wRU5WKEVOViwgKCppdFByb2cpLmJmQ29kZSgpKTsKKwlpZiggdG1wRU5WLnJ1bigpICkKKwl7CisJCWxpc3RPZkN1cnJlbnRFRC5zcGxpY2UoIHRtcEVOVi5vdXRFRFMgKTsKKworCQkvLyBTeW5jIEVEUyB0cmFpdGVtZW50CisJCUVOVi5zcGxpY2VTeW5jX213U3RvcmVQb3ModG1wRU5WLCAoaXRQcm9nICsgMSksIGl0RW5kKTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCWZvciggKytpdFByb2cgOyBpdFByb2cgIT0gaXRFbmQgOyArK2l0UHJvZyApCisJeworQVZNX0lGX0RFQlVHX0xFVkVMX09SX0ZMQUcyKCBISUdIICwgQ09NUFVUSU5HICwgU1RBVEVNRU5UICkKKwkJc3RhdGljIGF2bV91aW50MzJfdCBlY0NvdW50ID0gODsKKwkJaWYoIGxpc3RPZkN1cnJlbnRFRC5zaXplKCkgPiBlY0NvdW50ICkKKwkJeworCQkJZWNDb3VudCA9IChhdm1fdWludDMyX3QpKCBlY0NvdW50ICogMS41ICk7CisJCQlBVk1fT1NfVFJBQ0UgPDwgUkVQRUFUKCI9PT09PT09PT09IiwgNSkgPDwgc3RkOjplbmRsCisJCQkJCTw8ICI+Pj4+IEV4ZWN1dGlvbiBmcm9tICIgPDwgbGlzdE9mQ3VycmVudEVELnNpemUoKQorCQkJCQk8PCAiIEVDcyIgPDwgc3RkOjplbmRsOworCQl9CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfT1JfRkxBRzIoIEhJR0ggLCBDT01QVVRJTkcgLCBTVEFURU1FTlQgKQorCisJCXdoaWxlKCBsaXN0T2ZDdXJyZW50RUQubm9uZW1wdHkoKSApCisJCXsKKy8vCQkJY3VycmVudEVELnBvcF9maXJzdF90byggdG1wRUQgKTsKKwkJCWxpc3RPZkN1cnJlbnRFRC5wb3BfbGFzdF90byggdG1wRUQgKTsKKworCQkJc3dpdGNoKCB0bXBFRC0+bUFFRVMgKQorCQkJeworCQkJCWNhc2UgQUVFU19TVE1OVF9OT1RISU5HOgorCQkJCWNhc2UgQUVFU19TVE1OVF9GSU5BTDoKKwkJCQljYXNlIEFFRVNfU1RNTlRfREVTVFJPWToKKwkJCQl7CisJCQkJCXRtcEVELm13c2V0QUVFUyggQUVFU19PSyApOworCisJCQkJCS8vISEhIE5PIDw8IGJyZWFrID4+IGZvciB0aGVzZSBzdGF0ZW1lbnQKKwkJCQl9CisKKwkJCQkvLyBFdmFsdWF0aW9uIG9mIE5FWFQgU0VRVUVOQ0lBTCBTVEFURU1FTlQKKwkJCQljYXNlIEFFRVNfT0s6CisJCQkJY2FzZSBBRUVTX1NURVBfUkVTVU1FOgorCQkJCXsKKwkJCQkJaWYoIHRtcEVELT5tUHJlc2VydmVSSUQgKQorCQkJCQl7CisJCQkJCQl0bXBFRC0+bVByZXNlcnZlUklEID0gZmFsc2U7CisJCQkJCQl0bXBSSUQgPSB0bXBFRC0+bVJJRDsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXRtcEVELT5tUklEID0gdG1wUklEOworCQkJCQl9CisKKwkJCQkJaWYoIHRtcEVOVi5ydW4odG1wRUQsICgqaXRQcm9nKS5iZkNvZGUoKSkgKQorCQkJCQl7CisJCQkJCQkvLyBTeW5jIEVEUyB0cmFpdGVtZW50CisJCQkJCQlFTlYuc3BsaWNlU3luY19td1N0b3JlUG9zKHRtcEVOViwgKGl0UHJvZyArIDEpLCBpdEVuZCk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJCX0KKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJRU5WLmRlc3Ryb3lPdXRFRCgpOworCisJCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQkJPDwgIlVuZXhwZWN0ZWQgRU5ESU5EIEVYRUNVVElPTiBTVEFUVVMgYXMgb3V0RURTOj4gIgorCQkJCQkJCTw8IFJ1bnRpbWVEZWY6OnN0ckFFRVMoIHRtcEVELT5tQUVFUyApIDw8ICIgISEhIgorCQkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJbGlzdE9mQ3VycmVudEVELnNwbGljZSggIHRtcEVOVi5vdXRFRFMgICk7CisJfQorCisKKwlFTlYub3V0RURTLnNwbGljZSggbGlzdE9mQ3VycmVudEVEICk7CisKKwlFTlYuc3BsaWNlTm90T3V0cHV0KHRtcEVOVik7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCitib29sIEF2bVByaW1pdGl2ZV9TZXF1ZW5jZTo6cmVzdW1lKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCWlmKCBFTlYuaW5FWEVDX0xPQ0FUSU9OLT5pdENvZGUgIT0gRU5WLmluRVhFQ19MT0NBVElPTi0+ZW5kQ29kZSApCisJeworCQlyZXR1cm4oIHJ1bihFTlYsIEVOVi5pbkVYRUNfTE9DQVRJT04tPml0Q29kZSwKKwkJCQlFTlYuaW5FWEVDX0xPQ0FUSU9OLT5lbmRDb2RlKSApOworCX0KKwllbHNlCisJeworCQlFTlYub3V0RURTLmFwcGVuZCggRU5WLmluRUQgKTsKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorfQorCisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBleGVjdXRpb24gb2YgYSBTSURFX1NFUVVFTkNFIHByb2dyYW0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworYm9vbCBBdm1QcmltaXRpdmVfU2lkZVNlcXVlbmNlOjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsCisJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0UHJvZywgQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXRFbmQpCit7CisJQVBFeGVjdXRpb25EYXRhIHRtcEVEOworCVJ1bnRpbWVJRCB0bXBSSUQgPSBFTlYuaW5FRC0+bVJJRDsKKworCUxpc3RPZkFQRXhlY3V0aW9uRGF0YSBsaXN0T2ZDdXJyZW50RUQ7CisJTGlzdE9mQVBFeGVjdXRpb25EYXRhIGxpc3RPZk5leHRFRDsKKworCS8vIEV2YWx1YXRpb24gb2YgRklSU1QgU0VRVUVOQ0lBTCBTVEFURU1FTlQKKwlFeGVjdXRpb25FbnZpcm9ubWVudCB0bXBFTlYoRU5WLCAoKml0UHJvZykuYmZDb2RlKCkpOworCWlmKCB0bXBFTlYucnVuKCkgKQorCXsKKwkJbGlzdE9mQ3VycmVudEVELnNwbGljZSggdG1wRU5WLm91dEVEUyApOworCisJCS8vIFN5bmMgRURTIHRyYWl0ZW1lbnQKKwkJRU5WLnNwbGljZVN5bmNfbXdTdG9yZVBvcyh0bXBFTlYsIChpdFByb2cgKyAxKSwgaXRFbmQpOworCX0KKwllbHNlCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJZm9yKCArK2l0UHJvZyA7IGl0UHJvZyAhPSBpdEVuZCA7ICsraXRQcm9nICkKKwl7CitBVk1fSUZfREVCVUdfTEVWRUxfT1JfRkxBRzIoIEhJR0ggLCBDT01QVVRJTkcgLCBTVEFURU1FTlQgKQorCQlzdGF0aWMgYXZtX3VpbnQzMl90IGVjQ291bnQgPSA4OworCQlpZiggbGlzdE9mQ3VycmVudEVELnNpemUoKSA+IGVjQ291bnQgKQorCQl7CisJCQllY0NvdW50ID0gKGF2bV91aW50MzJfdCkoIGVjQ291bnQgKiAxLjUgKTsKKwkJCUFWTV9PU19UUkFDRSA8PCBSRVBFQVQoIj09PT09PT09PT0iLCA1KSA8PCBzdGQ6OmVuZGwKKwkJCQkJPDwgIj4+Pj4gRXhlY3V0aW9uIGZyb20gIiA8PCBsaXN0T2ZDdXJyZW50RUQuc2l6ZSgpCisJCQkJCTw8ICIgRUNzIiA8PCBzdGQ6OmVuZGw7CisJCX0KK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9PUl9GTEFHMiggSElHSCAsIENPTVBVVElORyAsIFNUQVRFTUVOVCApCisKKwkJd2hpbGUoIGxpc3RPZkN1cnJlbnRFRC5ub25lbXB0eSgpICkKKwkJeworLy8JCQljdXJyZW50RUQucG9wX2ZpcnN0X3RvKCB0bXBFRCApOworCQkJbGlzdE9mQ3VycmVudEVELnBvcF9sYXN0X3RvKCB0bXBFRCApOworCisJCQlzd2l0Y2goIHRtcEVELT5tQUVFUyApCisJCQl7CisJCQkJY2FzZSBBRUVTX1NUTU5UX05PVEhJTkc6CisJCQkJY2FzZSBBRUVTX1NUTU5UX0ZJTkFMOgorCQkJCWNhc2UgQUVFU19TVE1OVF9ERVNUUk9ZOgorCQkJCXsKKwkJCQkJdG1wRUQubXdzZXRBRUVTKCBBRUVTX09LICk7CisKKwkJCQkJLy8hISEgTk8gPDwgYnJlYWsgPj4gZm9yIHRoZXNlIHN0YXRlbWVudAorCQkJCX0KKworCQkJCS8vIEV2YWx1YXRpb24gb2YgTkVYVCBTRVFVRU5DSUFMIFNUQVRFTUVOVAorCQkJCWNhc2UgQUVFU19PSzoKKwkJCQljYXNlIEFFRVNfU1RFUF9SRVNVTUU6CisJCQkJeworCQkJCQlpZiggdG1wRUQtPm1QcmVzZXJ2ZVJJRCApCisJCQkJCXsKKwkJCQkJCXRtcEVELT5tUHJlc2VydmVSSUQgPSBmYWxzZTsKKwkJCQkJCXRtcFJJRCA9IHRtcEVELT5tUklEOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJdG1wRUQtPm1SSUQgPSB0bXBSSUQ7CisJCQkJCX0KKworCQkJCQlpZiggdG1wRU5WLnJ1bih0bXBFRCwgKCppdFByb2cpLmJmQ29kZSgpKSApCisJCQkJCXsKKwkJCQkJCS8vIFN5bmMgRURTIHRyYWl0ZW1lbnQKKwkJCQkJCUVOVi5zcGxpY2VTeW5jX213U3RvcmVQb3ModG1wRU5WLCAoaXRQcm9nICsgMSksIGl0RW5kKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCQkJfQorCisJCQkJCWlmKCB0bXBFTlYub3V0RURTLm5vbmVtcHR5KCkgKQorCQkJCQl7CisJCQkJCQlsaXN0T2ZOZXh0RUQuc3BsaWNlKHRtcEVOVi5vdXRFRFMpOworCQkJCQl9CisJCQkJCWVsc2UgaWYoIHRtcEVOVi5leGl0RURTLmVtcHR5KCkgJiYgdG1wRU5WLnN5bmNFRFMuZW1wdHkoKSApCisJCQkJCXsKKwkJCQkJCUVOVi5vdXRFRFMuYXBwZW5kKCB0bXBFRCApOworCQkJCQl9CisKKwkJCQkJRU5WLnNwbGljZU5vdE91dHB1dCh0bXBFTlYpOworCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlFTlYuZGVzdHJveU91dEVEKCk7CisKKwkJCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJCQk8PCAiVW5leHBlY3RlZCBFTkRJTkQgRVhFQ1VUSU9OIFNUQVRVUyBhcyBvdXRFRFM6PiAiCisJCQkJCQkJPDwgUnVudGltZURlZjo6c3RyQUVFUyggdG1wRUQtPm1BRUVTICkgPDwgIiAhISEiCisJCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlsaXN0T2ZDdXJyZW50RUQuc3BsaWNlKCBsaXN0T2ZOZXh0RUQgKTsKKwl9CisKKwlFTlYub3V0RURTLnNwbGljZSggbGlzdE9mQ3VycmVudEVEICk7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCitib29sIEF2bVByaW1pdGl2ZV9TaWRlU2VxdWVuY2U6OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlyZXR1cm4oIHJ1bihFTlYsIEVOVi5pbkNPREUtPmJlZ2luKCksIEVOVi5pbkNPREUtPmVuZCgpKSApOworfQorCisKK2Jvb2wgQXZtUHJpbWl0aXZlX1NpZGVTZXF1ZW5jZTo6cmVzdW1lKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCWlmKCBFTlYuaW5FWEVDX0xPQ0FUSU9OLT5pdENvZGUgIT0gRU5WLmluRVhFQ19MT0NBVElPTi0+ZW5kQ29kZSApCisJeworCQlyZXR1cm4oIHJ1bihFTlYsIEVOVi5pbkVYRUNfTE9DQVRJT04tPml0Q29kZSwKKwkJCQlFTlYuaW5FWEVDX0xPQ0FUSU9OLT5lbmRDb2RlKSApOworCX0KKwllbHNlCisJeworCQlFTlYub3V0RURTLmFwcGVuZCggRU5WLmluRUQgKTsKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorfQorCisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBleGVjdXRpb24gb2YgYSBXRUFLX1NFUVVFTkNFIHByb2dyYW0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworYm9vbCBBdm1QcmltaXRpdmVfV2Vha1NlcXVlbmNlOjpydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsCisJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0UHJvZywgQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXRFbmQpCit7CisJQVBFeGVjdXRpb25EYXRhIHRtcEVEOworCVJ1bnRpbWVJRCB0bXBSSUQgPSBFTlYuaW5FRC0+bVJJRDsKKworCUxpc3RPZkFQRXhlY3V0aW9uRGF0YSBsaXN0T2ZDdXJyZW50RUQ7CisJTGlzdE9mQVBFeGVjdXRpb25EYXRhIGxpc3RPZk5leHRFRDsKKworCS8vIEV2YWx1YXRpb24gb2YgRklSU1QgU0VRVUVOQ0lBTCBTVEFURU1FTlQKKwlFeGVjdXRpb25FbnZpcm9ubWVudCB0bXBFTlYoRU5WLCAoKml0UHJvZykuYmZDb2RlKCkpOworCWlmKCB0bXBFTlYucnVuKCkgKQorCXsKKwkJaWYoIHRtcEVOVi5vdXRFRFMubm9uZW1wdHkoKSApCisJCXsKKwkJCWxpc3RPZkN1cnJlbnRFRC5zcGxpY2UoIHRtcEVOVi5vdXRFRFMgKTsKKwkJfQorCQllbHNlIGlmKCB0bXBFTlYuZXhpdEVEUy5lbXB0eSgpICYmIHRtcEVOVi5zeW5jRURTLmVtcHR5KCkgKQorCQl7CisJCQlsaXN0T2ZDdXJyZW50RUQuYXBwZW5kKCBFTlYuaW5FRCApOworCQl9CisJCWVsc2UKKwkJeworCQkJRU5WLnNwbGljZU91dHB1dCh0bXBFTlYpOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCS8vIFN5bmMgRURTIHRyYWl0ZW1lbnQKKwkJRU5WLnNwbGljZVN5bmNfbXdTdG9yZVBvcyh0bXBFTlYsIChpdFByb2cgKyAxKSwgaXRFbmQpOworCX0KKwllbHNlCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJZm9yKCArK2l0UHJvZyA7IGl0UHJvZyAhPSBpdEVuZCA7ICsraXRQcm9nICkKKwl7CitBVk1fSUZfREVCVUdfTEVWRUxfT1JfRkxBRzIoIEhJR0ggLCBDT01QVVRJTkcgLCBTVEFURU1FTlQgKQorCQlzdGF0aWMgYXZtX3VpbnQzMl90IGVjQ291bnQgPSA4OworCQlpZiggbGlzdE9mQ3VycmVudEVELnNpemUoKSA+IGVjQ291bnQgKQorCQl7CisJCQllY0NvdW50ID0gKGF2bV91aW50MzJfdCkoIGVjQ291bnQgKiAxLjUgKTsKKwkJCUFWTV9PU19UUkFDRSA8PCBSRVBFQVQoIj09PT09PT09PT0iLCA1KSA8PCBzdGQ6OmVuZGwKKwkJCQkJPDwgIj4+Pj4gRXhlY3V0aW9uIGZyb20gIiA8PCBsaXN0T2ZDdXJyZW50RUQuc2l6ZSgpCisJCQkJCTw8ICIgRUNzIiA8PCBzdGQ6OmVuZGw7CisJCX0KK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9PUl9GTEFHMiggSElHSCAsIENPTVBVVElORyAsIFNUQVRFTUVOVCApCisKKwkJd2hpbGUoIGxpc3RPZkN1cnJlbnRFRC5ub25lbXB0eSgpICkKKwkJeworLy8JCQljdXJyZW50RUQucG9wX2ZpcnN0X3RvKCB0bXBFRCApOworCQkJbGlzdE9mQ3VycmVudEVELnBvcF9sYXN0X3RvKCB0bXBFRCApOworCisJCQlzd2l0Y2goIHRtcEVELT5tQUVFUyApCisJCQl7CisJCQkJY2FzZSBBRUVTX1NUTU5UX05PVEhJTkc6CisJCQkJY2FzZSBBRUVTX1NUTU5UX0ZJTkFMOgorCQkJCWNhc2UgQUVFU19TVE1OVF9ERVNUUk9ZOgorCQkJCXsKKwkJCQkJdG1wRUQubXdzZXRBRUVTKCBBRUVTX09LICk7CisKKwkJCQkJLy8hISEgTk8gPDwgYnJlYWsgPj4gZm9yIHRoZXNlIHN0YXRlbWVudAorCQkJCX0KKworCQkJCS8vIEV2YWx1YXRpb24gb2YgTkVYVCBTRVFVRU5DSUFMIFNUQVRFTUVOVAorCQkJCWNhc2UgQUVFU19PSzoKKwkJCQljYXNlIEFFRVNfU1RFUF9SRVNVTUU6CisJCQkJeworCQkJCQl0bXBFRC0+bVJJRCA9IHRtcFJJRDsKKworCQkJCQlpZiggdG1wRU5WLnJ1bih0bXBFRCwgKCppdFByb2cpLmJmQ29kZSgpKSApCisJCQkJCXsKKwkJCQkJCS8vIFN5bmMgRURTIHRyYWl0ZW1lbnQKKwkJCQkJCUVOVi5zcGxpY2VTeW5jX213U3RvcmVQb3ModG1wRU5WLCAoaXRQcm9nICsgMSksIGl0RW5kKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCUVOVi5vdXRFRFMuYXBwZW5kKCB0bXBFRCApOworCQkJCQl9CisKKwkJCQkJaWYoIHRtcEVOVi5vdXRFRFMubm9uZW1wdHkoKSApCisJCQkJCXsKKwkJCQkJCWxpc3RPZk5leHRFRC5zcGxpY2UodG1wRU5WLm91dEVEUyk7CisJCQkJCX0KKwkJCQkJZWxzZSBpZiggdG1wRU5WLmV4aXRFRFMuZW1wdHkoKSAmJiB0bXBFTlYuc3luY0VEUy5lbXB0eSgpICkKKwkJCQkJeworCQkJCQkJbGlzdE9mTmV4dEVELmFwcGVuZCh0bXBFRCk7CisJCQkJCX0KKworCQkJCQlFTlYuc3BsaWNlTm90T3V0cHV0KHRtcEVOVik7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCUVOVi5kZXN0cm95T3V0RUQoKTsKKworCQkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJCTw8ICJVbmV4cGVjdGVkIEVORElORCBFWEVDVVRJT04gU1RBVFVTIGFzIG91dEVEUzo+ICIKKwkJCQkJCQk8PCBSdW50aW1lRGVmOjpzdHJBRUVTKCB0bXBFRC0+bUFFRVMgKSA8PCAiICEhISIKKwkJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWxpc3RPZkN1cnJlbnRFRC5zcGxpY2UoIGxpc3RPZk5leHRFRCApOworCX0KKworCisJaWYoIGxpc3RPZkN1cnJlbnRFRC5zaW5nbGV0b24oKSApCisJeworCQl0bXBFRCA9IGxpc3RPZkN1cnJlbnRFRC5iYWNrKCk7CisKKwkJaWYoIEVOVi5pbkVEID09IHRtcEVEICkKKwkJeworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwl9CisKKwlFTlYub3V0RURTLnNwbGljZSggbGlzdE9mQ3VycmVudEVEICk7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCitib29sIEF2bVByaW1pdGl2ZV9XZWFrU2VxdWVuY2U6OnJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlyZXR1cm4oIHJ1bihFTlYsIEVOVi5pbkNPREUtPmJlZ2luKCksIEVOVi5pbkNPREUtPmVuZCgpKSApOworfQorCisKK2Jvb2wgQXZtUHJpbWl0aXZlX1dlYWtTZXF1ZW5jZTo6cmVzdW1lKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCWlmKCBFTlYuaW5FWEVDX0xPQ0FUSU9OLT5pdENvZGUgIT0gRU5WLmluRVhFQ19MT0NBVElPTi0+ZW5kQ29kZSApCisJeworCQlyZXR1cm4oIHJ1bihFTlYsIEVOVi5pbkVYRUNfTE9DQVRJT04tPml0Q29kZSwKKwkJCQlFTlYuaW5FWEVDX0xPQ0FUSU9OLT5lbmRDb2RlKSApOworCX0KKwllbHNlCisJeworCQlFTlYub3V0RURTLmFwcGVuZCggRU5WLmluRUQgKTsKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorfQorCisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bVNlcXVlbmNlUHJpbWl0aXZlLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtU2VxdWVuY2VQcmltaXRpdmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjVmZjhiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bVNlcXVlbmNlUHJpbWl0aXZlLmgKQEAgLTAsMCArMSw1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDIwIG1haSAyMDEwCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQVZNU0VRVUVOQ0VQUklNSVRJVkVfSF8KKyNkZWZpbmUgQVZNU0VRVUVOQ0VQUklNSVRJVkVfSF8KKworI2luY2x1ZGUgPGNvbXB1dGVyL3ByaW1pdGl2ZS9CYXNlQXZtUHJpbWl0aXZlLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9Bdm1Db2RlLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK0FWTV9QUklNSVRJVkVfUlVOX0NMQVNTKEF0b21pY1NlcXVlbmNlLCBCYXNlQXZtUHJpbWl0aXZlKQorCisKK0FWTV9QUklNSVRJVkVfUlVOX1JFU1VNRV9DTEFTU19IRUFERVIoU2VxdWVuY2UsIEJhc2VBdm1QcmltaXRpdmUpCisJYm9vbCBydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsCisJCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdFByb2csIEF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kKTsKK307CisKKworQVZNX1BSSU1JVElWRV9SVU5fUkVTVU1FX0NMQVNTX0hFQURFUihTaWRlU2VxdWVuY2UsIEJhc2VBdm1QcmltaXRpdmUpCisJYm9vbCBydW4oRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYsCisJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0UHJvZywgQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXRFbmQpOworfTsKKworCitBVk1fUFJJTUlUSVZFX1JVTl9SRVNVTUVfQ0xBU1NfSEVBREVSKFdlYWtTZXF1ZW5jZSwgQmFzZUF2bVByaW1pdGl2ZSkKKwlib29sIHJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOViwKKwkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXRQcm9nLCBBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdEVuZCk7Cit9OworCisKKworfQorCisjZW5kaWYgLyogQVZNU0VRVUVOQ0VQUklNSVRJVkVfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1TdGF0dXNQcmltaXRpdmUuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0F2bVN0YXR1c1ByaW1pdGl2ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdkZWYzZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1TdGF0dXNQcmltaXRpdmUuY3BwCkBAIC0wLDAgKzEsNjE0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjAgbWFpIDIwMTAKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkF2bVN0YXR1c1ByaW1pdGl2ZS5oIgorCisjaW5jbHVkZSA8Y29tbW9uL0JGLmg+CisKKyNpbmNsdWRlIDxjb21wdXRlci9FdmFsdWF0aW9uRW52aXJvbm1lbnQuaD4KKyNpbmNsdWRlIDxjb21wdXRlci9FeGVjdXRpb25EYXRhRmFjdG9yeS5oPgorI2luY2x1ZGUgPGNvbXB1dGVyL0V4ZWN1dGlvbkVudmlyb25tZW50Lmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29tcGFyZXIuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29uc3RhbnQuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29uc3RydWN0b3IuaD4KKworI2luY2x1ZGUgPGZtbC9vcGVyYXRvci9PcGVyYXRvci5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uQ29uZmlndXJhdGlvbi5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkRhdGEuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lSUQuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLyBDT01QVVRFIFNUQVRVUyBTVEFURQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyBib29sIGZpcmVkVHJhY2VJc1J1bihjb25zdCBCRiAmIGFGaXJlZFRyYWNlLCBjb25zdCBSdW50aW1lSUQgJiBhUklEKQoreworCWlmKCBhRmlyZWRUcmFjZS5pbnZhbGlkKCkgKQorCXsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXN3aXRjaCggYUZpcmVkVHJhY2UuY2xhc3NLaW5kKCkgKQorCXsKKwkJY2FzZSBGT1JNX0FWTUNPREVfS0lORDoKKwkJeworCQkJY29uc3QgQXZtQ29kZSAqIGFuQXZtQ29kZSA9IGFGaXJlZFRyYWNlLnRvX3B0cjwgQXZtQ29kZSA+KCk7CisKKwkJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYW5Bdm1Db2RlLT5iZWdpbigpOworCQkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBhbkF2bUNvZGUtPmVuZCgpOworCQkJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApCisJCQl7CisJCQkJaWYoIGZpcmVkVHJhY2VJc1J1bigoKml0KSwgYVJJRCkgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCB0cnVlICk7CisJCQkJfQorCQkJfQorCisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgRk9STV9FWEVDVVRJT05fQ09ORklHVVJBVElPTl9LSU5EOgorCQl7CisJCQljb25zdCBFeGVjdXRpb25Db25maWd1cmF0aW9uICogYW5FeGVjQ29uZiA9CisJCQkJCWFGaXJlZFRyYWNlLnRvX3B0cjwgRXhlY3V0aW9uQ29uZmlndXJhdGlvbiA+KCk7CisKKwkJCWlmKCBhUklEID09IGFuRXhlY0NvbmYtPmdldFJ1bnRpbWVJRCgpICkKKwkJCXsKKwkJCQlyZXR1cm4oIGFuRXhlY0NvbmYtPmdldE9wZXJhdG9yKCktPgorCQkJCQkJaXNPcENvZGUoIEFWTV9PUENPREVfUlVOICkgKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBGT1JNX0VYRUNVVElPTl9DT05URVhUX0tJTkQ6CisJCXsKKwkJCXJldHVybiggZmlyZWRUcmFjZUlzUnVuKCBhRmlyZWRUcmFjZS50b19wdHI8CisJCQkJCUV4ZWN1dGlvbkNvbnRleHQgPigpLT5nZXRSdW5uYWJsZUVsZW1lbnRUcmFjZSgpLCBhUklEKSApOworCQl9CisKKwkJY2FzZSBGT1JNX0VYRUNVVElPTl9EQVRBX0tJTkQ6CisJCXsKKwkJCXJldHVybiggZmlyZWRUcmFjZUlzUnVuKGFGaXJlZFRyYWNlLnRvX3B0cjwKKwkJCQkJCUV4ZWN1dGlvbkRhdGEgPigpLT5nZXRSdW5uYWJsZUVsZW1lbnRUcmFjZSgpLCBhUklEKQorCQkJCXx8IGZpcmVkVHJhY2VJc1J1bihhRmlyZWRUcmFjZS50b19wdHI8IEV4ZWN1dGlvbkRhdGEgPigpLT4KKwkJCQkJCWdldEV4ZWN1dGlvbkNvbnRleHQoKS0+Z2V0UnVubmFibGVFbGVtZW50VHJhY2UoKSwgYVJJRCkgKTsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKKworc3RhdGljIGJvb2wgY29tcHV0ZVN0YXR1c1N0YXRlSXMoY29uc3QgQVBFeGVjdXRpb25EYXRhICYgYXBFRCwKKwkJY29uc3QgUnVudGltZUlEICYgYVJJRCwgY29uc3QgQVZNX09QQ09ERSBvcCkKK3sKKwlzd2l0Y2goIG9wICkKKwl7CisJCWNhc2UgQVZNX09QQ09ERV9SVU46CisJCXsKKwkJCXJldHVybiggYXBFRC0+aXNSdW5uaW5nKGFSSUQpIHx8IGZpcmVkVHJhY2VJc1J1bihhcEVELCBhUklEKSApOworCQl9CisKKwkJY2FzZSBBVk1fT1BDT0RFX1NDSEVEVUxFX0lOVk9LRToKKwkJeworCQkJcmV0dXJuKCBhcEVELT5pc0lkbGUoYVJJRCkgKTsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9TVEFSVDoKKwkJY2FzZSBBVk1fT1BDT0RFX1JFU1RBUlQ6CisJCXsKKwkJCXJldHVybiggICAgYXBFRC0+aXNEZWZpbmVkUEVTKGFSSUQpICYmCisJCQkJCSghIGFwRUQtPmlzTG9hZGVkKGFSSUQpKSAgICAmJgorCQkJCQkoISBhcEVELT5pc1N0YXJ0aW5nKGFSSUQpKSAgJiYKKwkJCQkJKCEgYXBFRC0+aXNGaW5hbGl6ZWQoYVJJRCkpICYmCisJCQkJCSghIGFwRUQtPmlzRGVzdHJveWVkKGFSSUQpKQorCQkJKTsKKwkJfQorCisKKwkJY2FzZSBBVk1fT1BDT0RFX0VOQUJMRV9JTlZPS0U6CisJCXsKKwkJCXJldHVybiggYXBFRC0+aXNJZGxlT3JSdW5uaW5nKGFSSUQpICk7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfRElTQUJMRV9JTlZPS0U6CisJCWNhc2UgQVZNX09QQ09ERV9BQk9SVF9JTlZPS0U6CisJCXsKKwkJCXJldHVybiggYXBFRC0+aXNEaXNhYmxlT3JBYm9ydGVkKGFSSUQpICk7CisJCX0KKworCisJCWNhc2UgQVZNX09QQ09ERV9GSU5BTDoKKwkJeworCQkJcmV0dXJuKCBhcEVELT5pc0ZpbmFsaXplZChhUklEKSApOworCQl9CisKKwkJY2FzZSBBVk1fT1BDT0RFX0RFU1RST1k6CisJCXsKKwkJCXJldHVybiggYXBFRC0+aXNEZXN0cm95ZWQoYVJJRCkgKTsKKwkJfQorCisKKwkJY2FzZSBBVk1fT1BDT0RFX1NVU1BFTkQ6CisJCXsKKwkJCXJldHVybiggYXBFRC0+aXNTdXNwZW5kZWQoYVJJRCkgKTsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9TVE9QOgorCQl7CisJCQlyZXR1cm4oIGFwRUQtPmlzU3RvcHBlZChhUklEKSApOworCQl9CisKKworCQljYXNlIEFWTV9PUENPREVfV0FJVDoKKwkJeworCQkJcmV0dXJuKCBhcEVELT5pc1dhaXRpbmcoYVJJRCkgKTsKKwkJfQorCisKKwkJZGVmYXVsdDoKKwkJeworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorfQorCisKKworc3RhdGljIGJvb2wgY29tcHV0ZVN0YXR1c0JlaW5nKGNvbnN0IEFQRXhlY3V0aW9uRGF0YSAmIHByZXZFRCwKKwkJY29uc3QgQVBFeGVjdXRpb25EYXRhICYgYW5FRCwgY29uc3QgUnVudGltZUlEICYgYVJJRCwgQVZNX09QQ09ERSBvcCkKK3sKKwlzd2l0Y2goIG9wICkKKwl7CisJCWNhc2UgQVZNX09QQ09ERV9SVU46CisJCXsKKwkJCWlmKCBwcmV2RUQudmFsaWQoKSApCisJCQl7CisJCQkJcmV0dXJuKCAoISBmaXJlZFRyYWNlSXNSdW4ocHJldkVELCBhUklEKSApICYmCisJCQkJCQkoYW5FRC0+aXNSdW5uaW5nKGFSSUQpIHx8IGZpcmVkVHJhY2VJc1J1bihhbkVELCBhUklEKSkgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4oIGFuRUQtPmlzUnVubmluZyhhUklEKSApOworCQkJfQorCQl9CisKKwkJY2FzZSBBVk1fT1BDT0RFX1NDSEVEVUxFX0lOVk9LRToKKwkJeworCQkJaWYoIHByZXZFRC52YWxpZCgpICkKKwkJCXsKKwkJCQlyZXR1cm4oICghIHByZXZFRC0+aXNJZGxlKGFSSUQpKSAmJiBhbkVELT5pc0lkbGUoYVJJRCkgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4oIGFuRUQtPmlzUnVubmluZyhhUklEKSApOworCQkJfQorCQl9CisKKwkJY2FzZSBBVk1fT1BDT0RFX1NUQVJUOgorCQljYXNlIEFWTV9PUENPREVfUkVTVEFSVDoKKwkJeworCQkJaWYoIHByZXZFRC52YWxpZCgpICkKKwkJCXsKKwkJCQlyZXR1cm4oICghIHByZXZFRC0+aXNTdGFydGluZyhhUklEKSkgJiYKKwkJCQkJCWFuRUQtPmlzU3RhcnRpbmcoYVJJRCkgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4oIGFuRUQtPmlzU3RhcnRpbmcoYVJJRCkgKTsKKwkJCX0KKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9GSU5BTDoKKwkJeworCQkJaWYoIHByZXZFRC52YWxpZCgpICkKKwkJCXsKKwkJCQlyZXR1cm4oICghIHByZXZFRC0+aXNGaW5hbGl6aW5nKGFSSUQpKSAmJgorCQkJCQkJYW5FRC0+aXNGaW5hbGl6aW5nKGFSSUQpICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuKCBhbkVELT5pc0ZpbmFsaXppbmcoYVJJRCkgKTsKKwkJCX0KKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9FTkFCTEVfSU5WT0tFOgorCQl7CisJCQlpZiggcHJldkVELnZhbGlkKCkgKQorCQkJeworCQkJCXJldHVybiggcHJldkVELT5pc0Rpc2FibGVPckFib3J0ZWQoYVJJRCkgJiYKKwkJCQkJCWFuRUQtPmlzSWRsZU9yUnVubmluZyhhUklEKSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJldHVybiggYW5FRC0+aXNJZGxlT3JSdW5uaW5nKGFSSUQpICk7CisJCQl9CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfRElTQUJMRV9JTlZPS0U6CisJCXsKKwkJCWlmKCBwcmV2RUQudmFsaWQoKSApCisJCQl7CisJCQkJcmV0dXJuKCBwcmV2RUQtPmlzSWRsZU9yUnVubmluZyhhUklEKSAmJgorCQkJCQkJYW5FRC0+aXNEaXNhYmxlKGFSSUQpICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuKCBhbkVELT5pc0lkbGVPclJ1bm5pbmcoYVJJRCkgKTsKKwkJCX0KKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9BQk9SVF9JTlZPS0U6CisJCXsKKwkJCWlmKCBwcmV2RUQudmFsaWQoKSApCisJCQl7CisJCQkJcmV0dXJuKCBwcmV2RUQtPmlzSWRsZU9yUnVubmluZyhhUklEKSAmJgorCQkJCQkJYW5FRC0+aXNBYm9ydGVkKGFSSUQpICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuKCBhbkVELT5pc0lkbGVPclJ1bm5pbmcoYVJJRCkgKTsKKwkJCX0KKwkJfQorCisKKwkJY2FzZSBBVk1fT1BDT0RFX1NVU1BFTkQ6CisJCXsKKwkJCWlmKCBwcmV2RUQudmFsaWQoKSApCisJCQl7CisJCQkJcmV0dXJuKCAoISBwcmV2RUQtPmlzU3VzcGVuZGVkKGFSSUQpKSAmJgorCQkJCQkJYW5FRC0+aXNTdXNwZW5kZWQoYVJJRCkgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4oIGFuRUQtPmlzU3VzcGVuZGVkKGFSSUQpICk7CisJCQl9CisJCX0KKworCisJCWNhc2UgQVZNX09QQ09ERV9XQUlUOgorCQl7CisJCQlpZiggcHJldkVELnZhbGlkKCkgKQorCQkJeworCQkJCXJldHVybiggKCEgcHJldkVELT5pc1dhaXRpbmcoYVJJRCkpICYmCisJCQkJCQlhbkVELT5pc1dhaXRpbmcoYVJJRCkgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4oIGFuRUQtPmlzV2FpdGluZyhhUklEKSApOworCQkJfQorCQl9CisKKworCQlkZWZhdWx0OgorCQl7CisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKwl9Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vIFNUQVRVUyBXQVMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIEF2bVByaW1pdGl2ZV9TdGF0dXNXYXM6OnNldmFsKEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlpZiggRU5WLmluRUMtPmhhc1ByZXZpb3VzKCkgKQorCXsKKwkJT3BlcmF0b3IgKiBhbk9wZXJhdG9yID0gRU5WLm1BUkctPmF0KDApLnRvX3B0cjwgT3BlcmF0b3IgPigpOworCisJCXN3aXRjaCggYW5PcGVyYXRvci0+Z2V0QXZtT3BDb2RlKCkgKQorCQl7CisJCQljYXNlIEFWTV9PUENPREVfQVNTSUdOOgorCQkJeworCQkJCUVOVi5vdXRWQUwgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oCisJCQkJCQlFTlYuaXNBc3NpZ25lZChFTlYubUFSRy0+b3V0RUQuZ2V0UHJldmlvdXMoKSwKKwkJCQkJCQkJRU5WLm1BUkctPm91dEVELT5tUklELAorCQkJCQkJCQlFTlYubUFSRy0+YXQoMSkudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCkpKTsKKwkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCX0KKworCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQljb25zdCBSdW50aW1lSUQgJiBhUklEID0gRU5WLm1BUkctPmF0KDEpLmJmUklEKCk7CisKKwkJCQlpZiggYVJJRC52YWxpZCgpICkKKwkJCQl7CisJCQkJCUVOVi5vdXRWQUwgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oCisJCQkJCQkJY29tcHV0ZVN0YXR1c1N0YXRlSXMoRU5WLm1BUkctPm91dEVELmdldFByZXZpb3VzKCksCisJCQkJCQkJCQlhUklELCBhbk9wZXJhdG9yLT5nZXRBdm1PcENvZGUoKSkpOworCQkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwllbHNlCisJeworCQlFTlYub3V0VkFMID0gRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX0ZBTFNFOworCisJCXJldHVybiggdHJ1ZSApOworCX0KK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gU1RBVFVTIElTCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBBdm1QcmltaXRpdmVfU3RhdHVzSXM6OnNldmFsKEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlPcGVyYXRvciAqIGFuT3BlcmF0b3IgPSBFTlYubUFSRy0+YXQoMCkudG9fcHRyPCBPcGVyYXRvciA+KCk7CisKKwlzd2l0Y2goIGFuT3BlcmF0b3ItPmdldEF2bU9wQ29kZSgpICkKKwl7CisJCWNhc2UgQVZNX09QQ09ERV9BU1NJR046CisJCXsKKwkJCUVOVi5vdXRWQUwgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oCisJCQkJCUVOVi5pc0Fzc2lnbmVkKEVOVi5tQVJHLT5vdXRFRCwKKwkJCQkJCQlFTlYubUFSRy0+b3V0RUQtPm1SSUQsCisJCQkJCQkJRU5WLm1BUkctPmF0KDEpLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpKSApOworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQljb25zdCBSdW50aW1lSUQgJiBhUklEID0gRU5WLm1BUkctPmF0KDEpLmJmUklEKCk7CisKKwkJCWlmKCBhUklELnZhbGlkKCkgKQorCQkJeworCQkJCUVOVi5vdXRWQUwgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oCisJCQkJCQljb21wdXRlU3RhdHVzU3RhdGVJcyhFTlYubUFSRy0+b3V0RUQsIGFSSUQsCisJCQkJCQkJCWFuT3BlcmF0b3ItPmdldEF2bU9wQ29kZSgpKSk7CisJCQkJcmV0dXJuKCB0cnVlICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJfQorCQl9CisJfQorfQorCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLyBTVEFUVVMgQkVJTkcKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIEF2bVByaW1pdGl2ZV9TdGF0dXNCZWluZzo6c2V2YWwoRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCWlmKCBFTlYuaW5FQy0+aGFzUHJldmlvdXMoKSApCisJeworCQlPcGVyYXRvciAqIGFuT3BlcmF0b3IgPSBFTlYubUFSRy0+YXQoMCkudG9fcHRyPCBPcGVyYXRvciA+KCk7CisKKwkJc3dpdGNoKCBhbk9wZXJhdG9yLT5nZXRBdm1PcENvZGUoKSApCisJCXsKKwkJCWNhc2UgQVZNX09QQ09ERV9BU1NJR046CisJCQl7CisJCQkJRU5WLm91dFZBTCA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbigKKwkJCQkJCUVOVi5pc0Fzc2lnbmVkKEVOVi5tQVJHLT5vdXRFRCwKKwkJCQkJCQkJRU5WLm1BUkctPm91dEVELT5tUklELAorCQkJCQkJCQlFTlYubUFSRy0+YXQoMSkudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCkpICk7CisJCQkJcmV0dXJuKCB0cnVlICk7CisJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJY29uc3QgUnVudGltZUlEICYgYVJJRCA9IEVOVi5tQVJHLT5hdCgxKS5iZlJJRCgpOworCisJCQkJaWYoIGFSSUQudmFsaWQoKSApCisJCQkJeworCQkJCQlFTlYub3V0VkFMID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKAorCQkJCQkJCWNvbXB1dGVTdGF0dXNCZWluZyhFTlYubUFSRy0+b3V0RUQuZ2V0UHJldmlvdXMoKSwKKwkJCQkJCQkJCUVOVi5tQVJHLT5vdXRFRCwgYVJJRCwKKwkJCQkJCQkJCWFuT3BlcmF0b3ItPmdldEF2bU9wQ29kZSgpKSk7CisJCQkJCXJldHVybiggdHJ1ZSApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWVsc2UKKwl7CisJCUVOVi5vdXRWQUwgPSBFeHByZXNzaW9uQ29uc3RhbnQ6OkJPT0xFQU5fRkFMU0U7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vIFNUQVRVUyBXSUxMCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCitib29sIEF2bVByaW1pdGl2ZV9TdGF0dXNXaWxsOjpzZXZhbChFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJT3BlcmF0b3IgKiBhbk9wZXJhdG9yID0gRU5WLm1BUkctPmF0KDApLnRvX3B0cjwgT3BlcmF0b3IgPigpOworCisJYm9vbCBldmFsU3RhdHVzRmxhZyA9IGZhbHNlOworCisJc3dpdGNoKCBhbk9wZXJhdG9yLT5nZXRBdm1PcENvZGUoKSApCisJeworCQljYXNlIEFWTV9PUENPREVfQVNTSUdOOgorCQl7CisJCQlJbnN0YW5jZU9mRGF0YSAqIGx2YWx1ZSA9IEVOVi5tQVJHLT5hdCgxKS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKTsKKworCQkJRXhlY3V0aW9uQ29udGV4dDo6Y2hpbGRfaXRlcmF0b3IgZW5kRUMgPSBFTlYuaW5FQy0+ZW5kKCk7CisJCQlFeGVjdXRpb25Db250ZXh0OjpjaGlsZF9pdGVyYXRvciBpdEVDOworCisJCQlldmFsU3RhdHVzRmxhZyA9IGZhbHNlOworCQkJZm9yKCBpdEVDID0gRU5WLmluRUMtPmJlZ2luKCkgOyBpdEVDICE9IGVuZEVDIDsgKytpdEVDICkKKwkJCXsKKwkJCQlpZiggRU5WLmlzQXNzaWduZWQoKCppdEVDKS0+Z2V0QVBFeGVjdXRpb25EYXRhKCksCisJCQkJCQlFTlYubUFSRy0+b3V0RUQtPm1SSUQsIGx2YWx1ZSkgKQorCQkJCXsKKwkJCQkJZXZhbFN0YXR1c0ZsYWcgPSB0cnVlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCUVOVi5vdXRWQUwgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oZXZhbFN0YXR1c0ZsYWcpOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQgPSBFTlYubUFSRy0+YXQoMSkuYmZSSUQoKTsKKworCQkJaWYoIGFSSUQudmFsaWQoKSApCisJCQl7CisJCQkJRXhlY3V0aW9uQ29udGV4dDo6Y2hpbGRfaXRlcmF0b3IgZW5kRUMgPSBFTlYuaW5FQy0+ZW5kKCk7CisJCQkJRXhlY3V0aW9uQ29udGV4dDo6Y2hpbGRfaXRlcmF0b3IgaXRFQzsKKworCQkJCWZvciggaXRFQyA9IEVOVi5pbkVDLT5iZWdpbigpIDsgaXRFQyAhPSBlbmRFQyA7ICsraXRFQyApCisJCQkJeworCQkJCQlpZiggY29tcHV0ZVN0YXR1c1N0YXRlSXMoKCppdEVDKS0+Z2V0QVBFeGVjdXRpb25EYXRhKCksCisJCQkJCQkJYVJJRCwgYW5PcGVyYXRvci0+Z2V0QXZtT3BDb2RlKCkpICkKKwkJCQkJeworCQkJCQkJZXZhbFN0YXR1c0ZsYWcgPSB0cnVlOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJRU5WLm91dFZBTCA9CisJCQkJCQlFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oCisJCQkJCQkJCWV2YWxTdGF0dXNGbGFnKTsKKwkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQl9CisJCX0KKwl9Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vIENIQU5HRUQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIEF2bVByaW1pdGl2ZV9DaGFuZ2VkOjpzZXZhbChFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJSW5zdGFuY2VPZkRhdGEgKiBsdmFsdWUgPSBFTlYubUFSRy0+YXQoMCkudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCk7CisKKwlib29sIGlzQ2hhbmdlZEZsYWcgPSB0cnVlOworCisJaWYoIEVOVi5pc0Fzc2lnbmVkKEVOVi5tQVJHLT5vdXRFRCwgRU5WLm1BUkctPm91dEVELT5tUklELCBsdmFsdWUpICkKKwl7CisJCWlzQ2hhbmdlZEZsYWcgPSB0cnVlOworCQljb25zdCBCRiAmIGN1cnJlbnRWYWx1ZSA9IEVOVi5nZXRSdmFsdWUoRU5WLm1BUkctPm91dEVELAorCQkJCUVOVi5tQVJHLT5vdXRFRC0+bVJJRCwgbHZhbHVlKTsKKworCQlpZiggRU5WLmluRUMtPmhhc1ByZXZpb3VzKCkgKQorCQl7CisJCQlpc0NoYW5nZWRGbGFnID0gY3VycmVudFZhbHVlLnN0ck5FUSgKKwkJCQkJRU5WLmdldFJ2YWx1ZShFTlYubUFSRy0+b3V0RUQuZ2V0UHJldmlvdXMoKSwKKwkJCQkJCQlFTlYubUFSRy0+b3V0RUQtPm1SSUQsIGx2YWx1ZSkpOworCQl9CisKKwkJaWYoICghIGlzQ2hhbmdlZEZsYWcpICYmIEVOVi5tQVJHLT5vdXRFRC0+aGFzRXhlY3V0aW9uQ29udGV4dCgpICYmCisJCQkJKEVOVi5tQVJHLT5vdXRFRC0+Z2V0RXhlY3V0aW9uQ29udGV4dCgpLT4KKwkJCQkJCWdldEFQRXhlY3V0aW9uRGF0YSgpICE9IEVOVi5tQVJHLT5vdXRFRCkgKQorCQl7CisJCQlpc0NoYW5nZWRGbGFnID0gY3VycmVudFZhbHVlLnN0ck5FUSgKKwkJCQkJRU5WLmdldFJ2YWx1ZShFTlYubUFSRy0+b3V0RUQtPmdldEV4ZWN1dGlvbkNvbnRleHQoKS0+CisJCQkJCQlnZXRBUEV4ZWN1dGlvbkRhdGEoKSwgRU5WLm1BUkctPm91dEVELT5tUklELCBsdmFsdWUpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlzQ2hhbmdlZEZsYWcgPSBmYWxzZTsKKwkJfQorCX0KKwllbHNlCisJeworCQlpc0NoYW5nZWRGbGFnID0gZmFsc2U7CisJfQorCisJRU5WLm91dFZBTCA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbiggaXNDaGFuZ2VkRmxhZyApOworCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vIENIQU5HRUQgVE8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyEhIFRPRE8gT1BUSU1JWkFUSU9OCitib29sIEF2bVByaW1pdGl2ZV9DaGFuZ2VkVG86OnNldmFsKEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlJbnN0YW5jZU9mRGF0YSAqIGx2YWx1ZSA9IEVOVi5tQVJHLT5hdCgwKS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKTsKKworCWlmKCBFTlYuaXNBc3NpZ25lZChFTlYubUFSRy0+b3V0RUQsIEVOVi5tQVJHLT5vdXRFRC0+bVJJRCwgbHZhbHVlKSApCisJeworCQljb25zdCBCRiAmIGN1cnJlbnRWYWx1ZSA9IEVOVi5nZXRSdmFsdWUoRU5WLm1BUkctPm91dEVELAorCQkJCUVOVi5tQVJHLT5vdXRFRC0+bVJJRCwgbHZhbHVlKTsKKworCQlFTlYub3V0VkFMID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKAorCQkJCWN1cnJlbnRWYWx1ZS5zdHJORVEoIEVOVi5tQVJHLT5hdCgxKSApICk7CisJfQorCWVsc2UKKwl7CisJCUVOVi5vdXRWQUwgPSBFeHByZXNzaW9uQ29uc3RhbnQ6OkJPT0xFQU5fRkFMU0U7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtU3RhdHVzUHJpbWl0aXZlLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtU3RhdHVzUHJpbWl0aXZlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGExODY3YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1TdGF0dXNQcmltaXRpdmUuaApAQCAtMCwwICsxLDM4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjAgbWFpIDIwMTAKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBBVk1TVEFUVVNQUklNSVRJVkVfSF8KKyNkZWZpbmUgQVZNU1RBVFVTUFJJTUlUSVZFX0hfCisKKyNpbmNsdWRlIDxjb21wdXRlci9wcmltaXRpdmUvQmFzZUF2bVByaW1pdGl2ZS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitBVk1fUFJJTUlUSVZFX0VWQUxfQ0xBU1MoU3RhdHVzV2FzLCAgICBCYXNlQXZtUHJpbWl0aXZlKQorQVZNX1BSSU1JVElWRV9FVkFMX0NMQVNTKFN0YXR1c0lzLCAgICAgQmFzZUF2bVByaW1pdGl2ZSkKK0FWTV9QUklNSVRJVkVfRVZBTF9DTEFTUyhTdGF0dXNCZWluZywgIEJhc2VBdm1QcmltaXRpdmUpCitBVk1fUFJJTUlUSVZFX0VWQUxfQ0xBU1MoU3RhdHVzV2lsbCwgICBCYXNlQXZtUHJpbWl0aXZlKQorCitBVk1fUFJJTUlUSVZFX0VWQUxfQ0xBU1MoQ2hhbmdlZCwgICAgQmFzZUF2bVByaW1pdGl2ZSkKK0FWTV9QUklNSVRJVkVfRVZBTF9DTEFTUyhDaGFuZ2VkVG8sICBCYXNlQXZtUHJpbWl0aXZlKQorCisKKworfQorCisjZW5kaWYgLyogQVZNU1RBVFVTUFJJTUlUSVZFX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtU3luY2hyb25pemF0aW9uRmFjdG9yeS5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtU3luY2hyb25pemF0aW9uRmFjdG9yeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk3ZjcxMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1TeW5jaHJvbml6YXRpb25GYWN0b3J5LmNwcApAQCAtMCwwICsxLDE1NTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiA1IG5vdi4gMjAxMAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQXZtU3luY2hyb25pemF0aW9uRmFjdG9yeS5oIgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZkRhdGEuaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9Sb3V0ZXIuaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0F2bUNvZGUuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9Bdm1Db2RlRmFjdG9yeS5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0J1aWx0aW5BcnJheS5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25TaW1wbGlmaWVyLmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vU3RhdGVtZW50Q29uc3RydWN0b3IuaD4KKworI2luY2x1ZGUgPGZtbC9vcGVyYXRvci9PcGVyYXRvck1hbmFnZXIuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkRhdGEuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lRm9ybS5oPgorCisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZVU0lPTgorICogRXhlY3V0aW9uRGF0YSAtLSBSdW50aW1lRm9ybQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworQkYgQXZtU3luY2hyb25pemF0aW9uRmFjdG9yeTo6YnVpbGRTY2hlZHVsZUZvcm0oT3BlcmF0b3IgKiBidWlsZE9wLAorCQljb25zdCBCRiAmIHJlZlNjaGVkdWxlRm9ybSwgY29uc3QgQkYgJiBmcnN0U2NoZWR1bGVGb3JtLAorCQljb25zdCBCRiAmIHNuZFNjaGVkdWxlRm9ybSkKK3sKKwlyZXR1cm4oIEF2bUNvZGVGYWN0b3J5OjpmbGF0dGVuQ29kZSggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQlidWlsZE9wLCBmcnN0U2NoZWR1bGVGb3JtLCBzbmRTY2hlZHVsZUZvcm0pICkgKTsKK30KKworCitBUEV4ZWN1dGlvbkRhdGEgQXZtU3luY2hyb25pemF0aW9uRmFjdG9yeTo6ZnVzaW9uKGNvbnN0IEV4ZWN1dGlvbkRhdGEgJiByZWZFRCwKKwkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIGZpcnN0RUQsIGNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBzbmRFRCkKK3sKKwlhdm1fc2l6ZV90IHJlZk1hY2hpbmVDb3VudCA9IHJlZkVELmdldFRhYmxlT2ZSdW50aW1lKCkuc2l6ZSgpOworCisJYXZtX3NpemVfdCBzeW5jTWFjaGluZUNvdW50ID0gc3RkOjptYXgoCisJCQlzbmRFRC5nZXRUYWJsZU9mUnVudGltZSgpLnNpemUoKSwKKwkJCWZpcnN0RUQuZ2V0VGFibGVPZlJ1bnRpbWUoKS5zaXplKCkgKTsKKworCUFQRXhlY3V0aW9uRGF0YSBuZXdFRCggbmV3IEV4ZWN1dGlvbkRhdGEoc3luY01hY2hpbmVDb3VudCkgKTsKKworCS8vIGZ1c2lvbiBvZiBFeGVjdXRpb25Db250ZXh0CisJQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKCBmaXJzdEVELmhhc0V4ZWN1dGlvbkNvbnRleHQoKSApCisJCQk8PCAiZmlyc3RFRCBtdXN0IGhhdmUgRXhlY3V0aW9uQ29udGV4dCBjb250YWluZXIgISEhIgorCQkJPDwgU0VORF9FWElUOworCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggc25kRUQuaGFzRXhlY3V0aW9uQ29udGV4dCgpICkKKwkJCTw8ICJzbmRFRCBtdXN0IGhhdmUgRXhlY3V0aW9uQ29udGV4dCBjb250YWluZXIgISEhIgorCQkJPDwgU0VORF9FWElUOworLy8JQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKAorLy8JCQlmaXJzdEVELmdldEV4ZWN1dGlvbkNvbnRleHQoKSA9PSBzbmRFRC5nZXRFeGVjdXRpb25Db250ZXh0KCkgKQorLy8JCQk8PCAiZmlyc3RFRCAmIHNuZEVEIG11c3QgaGF2ZSB0aGUgc2FtZSBFeGVjdXRpb25Db250ZXh0IGNvbnRhaW5lciAhISEiCisvLwkJCTw8IFNFTkRfRVhJVDsKKworCW5ld0VELT5zZXRFeGVjdXRpb25Db250ZXh0KCBmaXJzdEVELmdldEV4ZWN1dGlvbkNvbnRleHQoKSApOworCisKKwkvLyBmdXNpb24gb2YgbUFFRVMKKwluZXdFRC0+bUFFRVMgPSBSdW50aW1lRGVmOjpzeW5jQUVFUyhmaXJzdEVELm1BRUVTLCBzbmRFRC5tQUVFUyk7CisJaWYoIG5ld0VELT5tQUVFUyA9PSBBRUVTX1VOS05PV05fU1lOQyApCisJeworCQlBVk1fT1NfRVJST1JfQUxFUlQgPDwgIkV4ZWN1dGlvbkRhdGE6PiBmdXNpb24gb2YgQUVFUyBGQUlMRUQgOiAoICIKKwkJCQk8PCBSdW50aW1lRGVmOjpzdHJBRUVTKGZpcnN0RUQubUFFRVMpICA8PCAiIHxzeW5jfCAiCisJCQkJPDwgUnVudGltZURlZjo6c3RyQUVFUyhzbmRFRC5tQUVFUykgPDwgIiApICEhISIKKwkJCQk8PCBTRU5EX0FMRVJUOworCisJCXJldHVybiggQVBFeGVjdXRpb25EYXRhOjpSRUZfTlVMTCApOworCX0KKworCisJLy8gZnVzaW9uIG9mIG1SSUQKKwlpZiggZmlyc3RFRC5tUklEID09IHNuZEVELm1SSUQgKQorCXsKKwkJbmV3RUQtPm1SSUQgPSBmaXJzdEVELm1SSUQ7CisJfQorCWVsc2UKKwl7CisJCW5ld0VELT5tUklEID0gcmVmRUQubVJJRDsKKworLy8JCUFWTV9PU19XQVJOSU5HX0FMRVJUIDw8ICJFeGVjdXRpb25EYXRhOj4gZnVzaW9uIG9mIFJJRCBGQUlMRUQgOiAoIHJlZjwgIgorLy8JCQkJPDwgcmVmRUQtPm1SSUQuc3RyKCkgPDwgIiA+ICwgIiA8PCBmaXJzdEVELm1SSUQuc3RyKCkKKy8vCQkJCTw8ICIgIT0gIiA8PCBzbmRFRC5tUklELnN0cigpIDw8ICIgKSIKKy8vCQkJCTw8IFNFTkRfQUxFUlQ7CisvLworLy8JCXJldHVybiggQVBFeGVjdXRpb25EYXRhOjpSRUZfTlVMTCApOworCX0KKworCisJLy8gZnVzaW9uIG9mIG9uSW5pdAorCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggZmlyc3RFRC5oYXNPbkluaXQoKSApCisJCQk8PCAiZmlyc3RFRCBtdXN0IGhhdmUgb25Jbml0ICEhISIKKwkJCTw8IFNFTkRfRVhJVDsKKwlBVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoIHNuZEVELmhhc09uSW5pdCgpICkKKwkJCTw8ICJzbmRFRCBtdXN0IGhhdmUgb25Jbml0ICEhISIKKwkJCTw8IFNFTkRfRVhJVDsKKworCWlmKCByZWZFRC5nZXRPbkluaXQoKSA9PSBmaXJzdEVELmdldE9uSW5pdCgpICkKKwl7CisJCW5ld0VELT5zZXRPbkluaXQoIHNuZEVELmdldE9uSW5pdCgpICk7CisJfQorCWVsc2UgaWYoIHJlZkVELmdldE9uSW5pdCgpID09IHNuZEVELmdldE9uSW5pdCgpICkKKwl7CisJCW5ld0VELT5zZXRPbkluaXQoIGZpcnN0RUQuZ2V0T25Jbml0KCkgKTsKKwl9CisJZWxzZSBpZiggZmlyc3RFRC5nZXRPbkluaXQoKSA9PSBzbmRFRC5nZXRPbkluaXQoKSApCisJeworCQluZXdFRC0+c2V0T25Jbml0KCBmaXJzdEVELmdldE9uSW5pdCgpICk7CisJfQorLy8JZWxzZSBpZiggZmlyc3RFRC5oYXNPbkluaXQoKSAmJiBzbmRFRC5oYXNPbkluaXQoKSApCisvLwl7CisvLy8vCQlCRkNvZGUgb25Jbml0ID0gQXZtQ29kZUZhY3Rvcnk6OmZsYXR0ZW5Db2RlKAorLy8vLwkJCQlTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKy8vLy8JCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1BBUkFMTEVMLAorLy8vLwkJCQkJCWZpcnN0RUQuZ2V0T25Jbml0KCksIHNuZEVELmdldE9uSW5pdCgpKSApOworLy8vLwkJbmV3RUQtPnNldE9uSW5pdCggb25Jbml0ICk7CisvLworLy8JCUFWTV9PU19FUlJPUl9BTEVSVCA8PCAiRXhlY3V0aW9uRGF0YTo+IGZ1c2lvbiBvZiByb3V0aW5lIE9uSW5pdCBGQUlMRUQgOiIKKy8vCQkJCTw8ICJcblx0JDAgPSAiIDw8IHJlZkVELmdldE9uSW5pdCgpLnN0cigpCisvLwkJCQk8PCAiXG5cdCQxID0gIiA8PCBmaXJzdEVELmdldE9uSW5pdCgpLnN0cigpCisvLwkJCQk8PCAiXG5cdCQyID0gIiA8PCBzbmRFRC5nZXRPbkluaXQoKS5zdHIoKQorLy8JCQkJPDwgU0VORF9BTEVSVDsKKy8vCisvLwkJcmV0dXJuKCBBUEV4ZWN1dGlvbkRhdGE6OlJFRl9OVUxMICk7CisvLwl9CisJZWxzZQorCXsKKwkJQVZNX09TX0VSUk9SX0FMRVJUIDw8ICJFeGVjdXRpb25EYXRhOj4gZnVzaW9uIG9mIHJvdXRpbmUgT25Jbml0IEZBSUxFRCA6IgorCQkJCTw8ICJcblx0JDAgPSAiIDw8IHJlZkVELmdldE9uSW5pdCgpLnN0cigpCisJCQkJPDwgIlxuXHQkMSA9ICIgPDwgZmlyc3RFRC5nZXRPbkluaXQoKS5zdHIoKQorCQkJCTw8ICJcblx0JDIgPSAiIDw8IHNuZEVELmdldE9uSW5pdCgpLnN0cigpCisJCQkJPDwgU0VORF9BTEVSVDsKKworCQlyZXR1cm4oIEFQRXhlY3V0aW9uRGF0YTo6UkVGX05VTEwgKTsKKwl9CisKKwkvLyBmdXNpb24gb2Ygb25TY2hlZHVsZQorCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggZmlyc3RFRC5oYXNPblNjaGVkdWxlKCkgKQorCQkJPDwgImZpcnN0RUQgbXVzdCBoYXZlIG9uU2NoZWR1bGUgISEhIgorCQkJPDwgU0VORF9FWElUOworCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggc25kRUQuaGFzT25TY2hlZHVsZSgpICkKKwkJCTw8ICJzbmRFRCBtdXN0IGhhdmUgb25TY2hlZHVsZSAhISEiCisJCQk8PCBTRU5EX0VYSVQ7CisKKwlpZiggcmVmRUQuZ2V0T25TY2hlZHVsZSgpID09IGZpcnN0RUQuZ2V0T25TY2hlZHVsZSgpICkKKwl7CisJCW5ld0VELT5zZXRPblNjaGVkdWxlKCBzbmRFRC5nZXRPblNjaGVkdWxlKCkgKTsKKwl9CisJZWxzZSBpZiggcmVmRUQuZ2V0T25TY2hlZHVsZSgpID09IHNuZEVELmdldE9uU2NoZWR1bGUoKSApCisJeworCQluZXdFRC0+c2V0T25TY2hlZHVsZSggZmlyc3RFRC5nZXRPblNjaGVkdWxlKCkgKTsKKwl9CisJZWxzZSBpZiggZmlyc3RFRC5nZXRPblNjaGVkdWxlKCkgPT0gc25kRUQuZ2V0T25TY2hlZHVsZSgpICkKKwl7CisJCW5ld0VELT5zZXRPblNjaGVkdWxlKCBmaXJzdEVELmdldE9uU2NoZWR1bGUoKSApOworCX0KKy8vCWVsc2UgaWYoIGZpcnN0RUQuaGFzT25TY2hlZHVsZSgpICYmIHNuZEVELmhhc09uU2NoZWR1bGUoKSApCisvLwl7CisvLy8vCQlCRkNvZGUgb25TY2hlZHVsZSA9IEF2bUNvZGVGYWN0b3J5OjpmbGF0dGVuQ29kZSgKKy8vLy8JCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisvLy8vCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9QQVJBTExFTCwKKy8vLy8JCQkJCQlmaXJzdEVELmdldE9uU2NoZWR1bGUoKSwgc25kRUQuZ2V0T25TY2hlZHVsZSgpKSApOworLy8vLwkJbmV3RUQtPnNldE9uU2NoZWR1bGUoIG9uU2NoZWR1bGUgKTsKKy8vCisvLwkJQVZNX09TX0VSUk9SX0FMRVJUIDw8ICJFeGVjdXRpb25EYXRhOj4gZnVzaW9uIG9mIHJvdXRpbmUgT25TY2hlZHVsZSBGQUlMRUQgOiIKKy8vCQkJCTw8ICJcblx0JDAgPSAiIDw8IHJlZkVELmdldE9uU2NoZWR1bGUoKS5zdHIoKQorLy8JCQkJPDwgIlxuXHQkMSA9ICIgPDwgZmlyc3RFRC5nZXRPblNjaGVkdWxlKCkuc3RyKCkKKy8vCQkJCTw8ICJcblx0JDIgPSAiIDw8IHNuZEVELmdldE9uU2NoZWR1bGUoKS5zdHIoKQorLy8JCQkJPDwgU0VORF9BTEVSVDsKKy8vCisvLwkJcmV0dXJuKCBBUEV4ZWN1dGlvbkRhdGE6OlJFRl9OVUxMICk7CisvLwl9CisJZWxzZQorCXsKKwkJQVZNX09TX0VSUk9SX0FMRVJUIDw8ICJFeGVjdXRpb25EYXRhOj4gZnVzaW9uIG9mIHJvdXRpbmUgT25TY2hlZHVsZSBGQUlMRUQgOiIKKwkJCQk8PCAiXG5cdCQwID0gIiA8PCByZWZFRC5nZXRPblNjaGVkdWxlKCkuc3RyKCkKKwkJCQk8PCAiXG5cdCQxID0gIiA8PCBmaXJzdEVELmdldE9uU2NoZWR1bGUoKS5zdHIoKQorCQkJCTw8ICJcblx0JDIgPSAiIDw8IHNuZEVELmdldE9uU2NoZWR1bGUoKS5zdHIoKQorCQkJCTw8IFNFTkRfQUxFUlQ7CisKKwkJcmV0dXJuKCBBUEV4ZWN1dGlvbkRhdGE6OlJFRl9OVUxMICk7CisJfQorCisKKwkvLyBmdXNpb24gb2YgUnVubmFibGVFbGVtZW50VHJhY2UKKwlpZiggZmlyc3RFRC5oYXNSdW5uYWJsZUVsZW1lbnRUcmFjZSgpCisJCSYmIHNuZEVELmhhc1J1bm5hYmxlRWxlbWVudFRyYWNlKCkgKQorCXsKKwkJaWYoIGZpcnN0RUQuZ2V0UnVubmFibGVFbGVtZW50VHJhY2UoKSA9PQorCQkJCXNuZEVELmdldFJ1bm5hYmxlRWxlbWVudFRyYWNlKCkgKQorCQl7CisJCQluZXdFRC0+c2V0UnVubmFibGVFbGVtZW50VHJhY2UoCisJCQkJCWZpcnN0RUQuZ2V0UnVubmFibGVFbGVtZW50VHJhY2UoKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJbmV3RUQtPnNldFJ1bm5hYmxlRWxlbWVudFRyYWNlKCBidWlsZFJ1bm5hYmxlRWxlbWVudFRyYWNlKAorCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1BBUkFMTEVMLAorCQkJCQlyZWZFRC5nZXRSdW5uYWJsZUVsZW1lbnRUcmFjZSgpLAorCQkJCQlmaXJzdEVELmdldFJ1bm5hYmxlRWxlbWVudFRyYWNlKCksCisJCQkJCXNuZEVELmdldFJ1bm5hYmxlRWxlbWVudFRyYWNlKCkgKSApOworCQl9CisJfQorCWVsc2UgaWYoIGZpcnN0RUQuaGFzUnVubmFibGVFbGVtZW50VHJhY2UoKSApCisJeworCQluZXdFRC0+c2V0UnVubmFibGVFbGVtZW50VHJhY2UoIGZpcnN0RUQuZ2V0UnVubmFibGVFbGVtZW50VHJhY2UoKSApOworCX0KKwllbHNlIGlmKCAgc25kRUQuaGFzUnVubmFibGVFbGVtZW50VHJhY2UoKSApCisJeworCQluZXdFRC0+c2V0UnVubmFibGVFbGVtZW50VHJhY2UoIHNuZEVELmdldFJ1bm5hYmxlRWxlbWVudFRyYWNlKCkgKTsKKwl9CisJZWxzZQorCXsKKwkJbmV3RUQtPnNldFJ1bm5hYmxlRWxlbWVudFRyYWNlKCByZWZFRC5nZXRSdW5uYWJsZUVsZW1lbnRUcmFjZSgpICk7CisJfQorCisKKwkvLyBmdXNpb24gb2YgSU9FbGVtZW50VHJhY2UKKwlpZiggZmlyc3RFRC5oYXNJT0VsZW1lbnRUcmFjZSgpICYmICBzbmRFRC5oYXNJT0VsZW1lbnRUcmFjZSgpICkKKwl7CisJCWlmKCBmaXJzdEVELmdldElPRWxlbWVudFRyYWNlKCkgPT0gc25kRUQuZ2V0SU9FbGVtZW50VHJhY2UoKSApCisJCXsKKwkJCW5ld0VELT5zZXRJT0VsZW1lbnRUcmFjZSggZmlyc3RFRC5nZXRJT0VsZW1lbnRUcmFjZSgpICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQluZXdFRC0+c2V0SU9FbGVtZW50VHJhY2UoIGJ1aWxkSU9FbGVtZW50VHJhY2UoCisJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfUEFSQUxMRUwsIHJlZkVELmdldElPRWxlbWVudFRyYWNlKCksCisJCQkJCWZpcnN0RUQuZ2V0SU9FbGVtZW50VHJhY2UoKSwgc25kRUQuZ2V0SU9FbGVtZW50VHJhY2UoKSApICk7CisJCX0KKwl9CisJZWxzZSBpZiggZmlyc3RFRC5oYXNJT0VsZW1lbnRUcmFjZSgpICkKKwl7CisJCW5ld0VELT5zZXRJT0VsZW1lbnRUcmFjZSggZmlyc3RFRC5nZXRJT0VsZW1lbnRUcmFjZSgpICk7CisJfQorCWVsc2UgaWYoICBzbmRFRC5oYXNJT0VsZW1lbnRUcmFjZSgpICkKKwl7CisJCW5ld0VELT5zZXRJT0VsZW1lbnRUcmFjZSggc25kRUQuZ2V0SU9FbGVtZW50VHJhY2UoKSApOworCX0KKwllbHNlCisJeworCQluZXdFRC0+c2V0SU9FbGVtZW50VHJhY2UoIHJlZkVELmdldElPRWxlbWVudFRyYWNlKCkgKTsKKwl9CisKKworCS8vIGZ1c2lvbiBvZiBOb2RlQ29uZGl0aW9uCisJQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKCBmaXJzdEVELmhhc05vZGVDb25kaXRpb24oKSApCisJCQk8PCAiZmlyc3RFRCBtdXN0IGhhdmUgTm9kZUNvbmRpdGlvbiAhISEiCisJCQk8PCBTRU5EX0VYSVQ7CisJQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKCBzbmRFRC5oYXNOb2RlQ29uZGl0aW9uKCkgKQorCQkJPDwgInNuZEVEIG11c3QgaGF2ZSBOb2RlQ29uZGl0aW9uICEhISIKKwkJCTw8IFNFTkRfRVhJVDsKKworCUJGIHRoZU5vZGVDb25kaXRpb24gPSBFeHByZXNzaW9uU2ltcGxpZmllcjo6c2ltcGxpZl9hbmQoCisJCQlmaXJzdEVELmdldE5vZGVDb25kaXRpb24oKSwKKwkJCXNuZEVELmdldE5vZGVDb25kaXRpb24oKSk7CisKKwluZXdFRC0+c2V0Tm9kZUNvbmRpdGlvbiggdGhlTm9kZUNvbmRpdGlvbiApOworCisJaWYoIHRoZU5vZGVDb25kaXRpb24uaXNFcXVhbEZhbHNlKCkgKQorCXsKKwkJcmV0dXJuKCBBUEV4ZWN1dGlvbkRhdGE6OlJFRl9OVUxMICk7CisJfQorCisKKwkvLyBmdXNpb24gb2YgTm9kZVRpbWVkQ29uZGl0aW9uCisJQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKCBmaXJzdEVELmhhc05vZGVUaW1lZENvbmRpdGlvbigpICkKKwkJCTw8ICJmaXJzdEVEIG11c3QgaGF2ZSBOb2RlVGltZWRDb25kaXRpb24gISEhIgorCQkJPDwgU0VORF9FWElUOworCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggc25kRUQuaGFzTm9kZVRpbWVkQ29uZGl0aW9uKCkgKQorCQkJPDwgInNuZEVEIG11c3QgaGF2ZSBOb2RlVGltZWRDb25kaXRpb24gISEhIgorCQkJPDwgU0VORF9FWElUOworCisJQkYgdGhlTm9kZVRpbWVkQ29uZGl0aW9uID0gRXhwcmVzc2lvblNpbXBsaWZpZXI6OnNpbXBsaWZfYW5kKAorCQkJZmlyc3RFRC5nZXROb2RlVGltZWRDb25kaXRpb24oKSwKKwkJCXNuZEVELmdldE5vZGVUaW1lZENvbmRpdGlvbigpKTsKKworCW5ld0VELT5zZXROb2RlVGltZWRDb25kaXRpb24oIHRoZU5vZGVUaW1lZENvbmRpdGlvbiApOworCisJaWYoIHRoZU5vZGVUaW1lZENvbmRpdGlvbi5pc0VxdWFsRmFsc2UoKSApCisJeworCQlyZXR1cm4oIEFQRXhlY3V0aW9uRGF0YTo6UkVGX05VTEwgKTsKKwl9CisKKworCS8vIGZ1c2lvbiBvZiBQYXRoQ29uZGl0aW9uCisJQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKCBmaXJzdEVELmhhc1BhdGhDb25kaXRpb24oKSApCisJCQk8PCAiZmlyc3RFRCBtdXN0IGhhdmUgUGF0aENvbmRpdGlvbiAhISEiCisJCQk8PCBTRU5EX0VYSVQ7CisJQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKCBzbmRFRC5oYXNQYXRoQ29uZGl0aW9uKCkgKQorCQkJPDwgInNuZEVEIG11c3QgaGF2ZSBQYXRoQ29uZGl0aW9uICEhISIKKwkJCTw8IFNFTkRfRVhJVDsKKworCWlmKCBmaXJzdEVELmdldFBhdGhDb25kaXRpb24oKSA9PSBzbmRFRC5nZXRQYXRoQ29uZGl0aW9uKCkgKQorCXsKKwkJbmV3RUQtPnNldFBhdGhDb25kaXRpb24oIGZpcnN0RUQuZ2V0UGF0aENvbmRpdGlvbigpICk7CisJfQorCWVsc2UKKwl7CisJCUJGIHRoZVBhdGhDb25kaXRpb24gPSBFeHByZXNzaW9uU2ltcGxpZmllcjo6c2ltcGxpZl9hbmQoCisJCQkJZmlyc3RFRC5nZXRQYXRoQ29uZGl0aW9uKCksIHNuZEVELmdldFBhdGhDb25kaXRpb24oKSk7CisJCWlmKCB0aGVQYXRoQ29uZGl0aW9uLmlzRXF1YWxGYWxzZSgpICkKKwkJeworCQkJcmV0dXJuKCBBUEV4ZWN1dGlvbkRhdGE6OlJFRl9OVUxMICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQluZXdFRC0+c2V0UGF0aENvbmRpdGlvbiggdGhlUGF0aENvbmRpdGlvbiApOworCQl9CisJfQorCisKKwkvLyBmdXNpb24gb2YgUGF0aFRpbWVkQ29uZGl0aW9uCisJQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKCBmaXJzdEVELmhhc1BhdGhUaW1lZENvbmRpdGlvbigpICkKKwkJCTw8ICJmaXJzdEVEIG11c3QgaGF2ZSBQYXRoVGltZWRDb25kaXRpb24gISEhIgorCQkJPDwgU0VORF9FWElUOworCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggc25kRUQuaGFzUGF0aFRpbWVkQ29uZGl0aW9uKCkgKQorCQkJPDwgInNuZEVEIG11c3QgaGF2ZSBQYXRoVGltZWRDb25kaXRpb24gISEhIgorCQkJPDwgU0VORF9FWElUOworCisJaWYoIGZpcnN0RUQuZ2V0UGF0aFRpbWVkQ29uZGl0aW9uKCkgPT0gc25kRUQuZ2V0UGF0aFRpbWVkQ29uZGl0aW9uKCkgKQorCXsKKwkJbmV3RUQtPnNldFBhdGhUaW1lZENvbmRpdGlvbiggZmlyc3RFRC5nZXRQYXRoVGltZWRDb25kaXRpb24oKSApOworCX0KKwllbHNlCisJeworCQlCRiB0aGVQYXRoVGltZWRDb25kaXRpb24gPSBFeHByZXNzaW9uU2ltcGxpZmllcjo6c2ltcGxpZl9hbmQoCisJCQkJZmlyc3RFRC5nZXRQYXRoVGltZWRDb25kaXRpb24oKSwKKwkJCQlzbmRFRC5nZXRQYXRoVGltZWRDb25kaXRpb24oKSk7CisJCWlmKCB0aGVQYXRoVGltZWRDb25kaXRpb24uaXNFcXVhbEZhbHNlKCkgKQorCQl7CisJCQlyZXR1cm4oIEFQRXhlY3V0aW9uRGF0YTo6UkVGX05VTEwgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW5ld0VELT5zZXRQYXRoVGltZWRDb25kaXRpb24oIHRoZVBhdGhUaW1lZENvbmRpdGlvbiApOworCQl9CisJfQorCisKKwkvLyBFeGVjdXRpb25EYXRhOjpQQVJBTV9NQUNISU5FX1JVTlRJTUVfT0ZGU0VUID09PSAwCisJaWYoIG5vdCBmdXNpb24oKCogbmV3RUQpLCByZWZFRC5nZXRQYXJhbWV0ZXJzUnVudGltZUZvcm0oKSwKKwkJZmlyc3RFRC5nZXRQYXJhbWV0ZXJzUnVudGltZUZvcm0oKSwgc25kRUQuZ2V0UGFyYW1ldGVyc1J1bnRpbWVGb3JtKCkpICkKKwl7CisJCS8vIEF2bUNvbmN1cnJlbmN5U3RhdGVtZW50IEZhaWxlZAorCQlyZXR1cm4oIEFQRXhlY3V0aW9uRGF0YTo6UkVGX05VTEwgKTsKKwl9CisKKwkvLyBFeGVjdXRpb25EYXRhOjpTWVNURU1fUlVOVElNRV9PRkZTRVQgPT09IDEKKwlhdm1fc2l6ZV90IG9mZnNldCA9IEV4ZWN1dGlvbkRhdGE6OlNZU1RFTV9SVU5USU1FX09GRlNFVDsKKwlmb3IoIDsgb2Zmc2V0IDwgcmVmTWFjaGluZUNvdW50IDsgKytvZmZzZXQgKQorCXsKKwkJLy8gZnVzaW9uIG9mIFByb2Nlc3MgRXZhbCBTdGF0ZQorCQluZXdFRC0+c2V0UnVudGltZUZvcm1TdGF0ZSggb2Zmc2V0LAorCQkJCVJ1bnRpbWVEZWY6OnN5bmNQRVMoCisJCQkJCQlyZWZFRC5nZXRSdW50aW1lRm9ybVN0YXRlKG9mZnNldCksCisJCQkJCQlmaXJzdEVELmdldFJ1bnRpbWVGb3JtU3RhdGUob2Zmc2V0KSwKKwkJCQkJCXNuZEVELmdldFJ1bnRpbWVGb3JtU3RhdGUob2Zmc2V0KSApICk7CisKKwkJaWYoIG5ld0VELT5pc1VuZGVmaW5lZFBFUyhvZmZzZXQpICkKKwkJeworCQkJQVZNX09TX0VSUk9SX0FMRVJUIDw8ICJFeGVjdXRpb25EYXRhOj4gIgorCQkJCSJGdXNpb24gb2YgUnVudGltZSBTdGF0ZSBGQUlMRUQgOiAiCisJCQkJIihyZWYgIT0gZmlyc3QpICYmIChyZWYgIT0gc25kKSAmJiAoZmlyc3QgIT0gc25kKSIKKwkJCQkiXG5cdEV4ZWN1dGlvbkRhdGEgQ29udHJvbCBDb25maWd1cmF0aW9uOj4iCisJCQkJPDwgIlxuXHQkMDogIiA8PCByZWZFRC5zdHJTdGF0ZUNvbmYoKQorCQkJCTw8ICJcblx0JDE6ICIgPDwgZmlyc3RFRC5zdHJTdGF0ZUNvbmYoKQorCQkJCTw8ICJcblx0JDI6ICIgPDwgc25kRUQuc3RyU3RhdGVDb25mKCkKKworCQkJCTw8ICJcblx0RmlyaW5nIENvZGU6PiIKKwkJCQk8PCAiXG5cdCQxOiAiIDw8IHJlZkVELmdldFJ1bm5hYmxlRWxlbWVudFRyYWNlKCkuc3RyKCkKKwkJCQk8PCAiXG5cdCQxOiAiIDw8IGZpcnN0RUQuZ2V0UnVubmFibGVFbGVtZW50VHJhY2UoKS5zdHIoKQorCQkJCTw8ICJcblx0JDI6ICIgPDwgc25kRUQuZ2V0UnVubmFibGVFbGVtZW50VHJhY2UoKS5zdHIoKQorCisJCQkJPDwgIlxuXHRUcmFjZSBDb2RlOj4iCisJCQkJPDwgIlxuXHQkMDogIiA8PCByZWZFRC5nZXRJT0VsZW1lbnRUcmFjZSgpLnN0cigpCisJCQkJPDwgIlxuXHQkMTogIiA8PCBmaXJzdEVELmdldElPRWxlbWVudFRyYWNlKCkuc3RyKCkKKwkJCQk8PCAiXG5cdCQyOiAiIDw8IHNuZEVELmdldElPRWxlbWVudFRyYWNlKCkuc3RyKCkKKworCQkJCTw8ICJcblx0TWFjaGluZSBTdGF0dXM6PiAiIDw8IHJlZkVELmdldFJ1bnRpbWUob2Zmc2V0KS5zdHIoKQorCQkJCTw8ICJcblx0TWFjaGluZSBDb250cm9sIENvbmZpZ3VyYXRpb246PiIKKwkJCQk8PCAiXG5cdCQwOiAiIDw8IHJlZkVELnN0clN0YXRlQ29uZihyZWZFRC5nZXRSdW50aW1lKG9mZnNldCkpCisJCQkJPDwgIlxuXHQkMTogIiA8PCBmaXJzdEVELnN0clN0YXRlQ29uZihmaXJzdEVELmdldFJ1bnRpbWUob2Zmc2V0KSkKKwkJCQk8PCAiXG5cdCQyOiAiIDw8IHNuZEVELnN0clN0YXRlQ29uZihzbmRFRC5nZXRSdW50aW1lKG9mZnNldCkpCisKKwkJCQk8PCAiXG5cdCQwID0gIiA8PCBSdW50aW1lRGVmOjpzdHJQRVMocmVmRUQuZ2V0UnVudGltZUZvcm1TdGF0ZShvZmZzZXQpKQorCQkJCTw8ICJcblx0JDEgPSAiIDw8IFJ1bnRpbWVEZWY6OnN0clBFUyhmaXJzdEVELmdldFJ1bnRpbWVGb3JtU3RhdGUob2Zmc2V0KSkKKwkJCQk8PCAiXG5cdCQyID0gIiA8PCBSdW50aW1lRGVmOjpzdHJQRVMoc25kRUQuZ2V0UnVudGltZUZvcm1TdGF0ZShvZmZzZXQpKQorCQkJCTw8IFNFTkRfQUxFUlQ7CisKKwkJCXJldHVybiggQVBFeGVjdXRpb25EYXRhOjpSRUZfTlVMTCApOworCQl9CisKKy8vCQkvLyBQcm9wYWdhdGUgc3luY2hyb25pemVkIEVWQUwgU1RBVEUgZm9ybSBjaGlsZHMgdG8gcGFyZW50CisvLwkJaWYoIGZpcnN0RUQuaXNGaW5hbGl6ZWRPckRlc3Ryb3llZChvZmZzZXQpIHx8CisvLwkJCQlzbmRFRC5pc0ZpbmFsaXplZE9yRGVzdHJveWVkKG9mZnNldCkgKQorLy8JCXsKKy8vCQkJUnVudGltZUlEIGFSSUQgPSBuZXdFRC0+Z2V0UnVudGltZUlEKG9mZnNldCk7CisvLwkJCVJ1bnRpbWVGb3JtICogYVJGID0gTlVMTDsKKy8vCQkJd2hpbGUoIGFSSUQuaGFzUFJJRCgpICYmIGFSSUQuZ2V0UFJJRCgpLmhhc0tpbmRBTkQoKSApCisvLwkJCXsKKy8vCQkJCWFSRiA9IG5ld0VELT5nZXRSdW50aW1lRm9ybSggYVJJRCA9IGFSSUQuZ2V0UFJJRCgpICk7CisvLworLy8JCQkJLy8gVE9ETzo+IENoaWxkIG1heSBub3QgYmUgc3luY2hyb25pemVkID09PiBkZWZpbmVkCisvLwkJCQlUYWJsZU9mUnVudGltZUlEOjpjb25zdF9pdGVyYXRvciBpdCA9IGFSRi5iZWdpbkNoaWxkKCk7CisvLwkJCQlUYWJsZU9mUnVudGltZUlEOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IGFSRi5lbmRDaGlsZCgpOworLy8JCQkJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisvLwkJCQl7CisvLwkJCQkJaWYoIG5vdCBuZXdFRC0+aXNGaW5hbGl6ZWRPckRlc3Ryb3llZCgqaXQpICkKKy8vCQkJCQl7CisvLwkJCQkJCWJyZWFrOworLy8JCQkJCX0KKy8vCQkJCX0KKy8vCisvLwkJCQlpZiggaXQgPT0gZW5kSXQgKQorLy8JCQkJeworLy8JCQkJCW5ld0VELT5zZXRSdW50aW1lRm9ybVN0YXRlKCBhUklELAorLy8JCQkJCQkJKGZpcnN0RUQuaXNGaW5hbGl6ZWQob2Zmc2V0KSB8fAorLy8JCQkJCQkJCQlzbmRFRC5pc0ZpbmFsaXplZChvZmZzZXQpKSA/CisvLwkJCQkJCQkJCQkJUFJPQ0VTU19GSU5BTElaRURfU1RBVEUgOgorLy8JCQkJCQkJCQkJCVBST0NFU1NfREVTVFJPWUVEX1NUQVRFICk7CisvLwkJCQl9CisvLwkJCQllbHNlCisvLwkJCQl7CisvLwkJCQkJYnJlYWs7CisvLwkJCQl9CisvLwkJCX0KKy8vCisvLwkJCWlmKCBuZXdFRC0+aXN1blJ1bm5hYmxlU3lzdGVtKCkgKQorLy8JCQl7CisvLwkJCQluZXdFRC0+c2V0QUVFUyhBRUVTX1NUTU5UX0VYSVQpOworLy8JCQl9CisvLwkJfQorCisJCS8vIGZ1c2lvbiBvZiBBc3NpZ24gU3RhdGUKKwkJbmV3RUQtPmdldFJ1bnRpbWVGb3JtU3RhdGVUYWJsZSgpLT5zZXRBc3NpZ25lZFVuaW9uKG9mZnNldCwKKwkJCQlmaXJzdEVELmdldEFzc2lnbmVkKG9mZnNldCksIHNuZEVELmdldEFzc2lnbmVkKG9mZnNldCkpOworCisJCS8vIGZ1c2lvbiBvZiBSdW50aW1lRm9ybQorCQlpZiggbm90IGZ1c2lvbigoKiBuZXdFRCksIHJlZkVELmdldFJ1bnRpbWUob2Zmc2V0KSwKKwkJCWZpcnN0RUQuZ2V0UnVudGltZShvZmZzZXQpLCBzbmRFRC5nZXRSdW50aW1lKG9mZnNldCkpICkKKwkJeworCQkJLy8gQXZtQ29uY3VycmVuY3lTdGF0ZW1lbnQgRmFpbGVkCisJCQlyZXR1cm4oIEFQRXhlY3V0aW9uRGF0YTo6UkVGX05VTEwgKTsKKwkJfQorCX0KKworCisJaWYoIHJlZk1hY2hpbmVDb3VudCAhPSBzeW5jTWFjaGluZUNvdW50ICkKKwl7CisJCS8vIGZvciBuZXcgUnVudGltZUZvcm0gc2luY2UgcmVmRUQKKwkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIG1heEVEID0KKwkJCQkoIGZpcnN0RUQuZ2V0VGFibGVPZlJ1bnRpbWUoKS5zaXplKCkgPT0gc3luY01hY2hpbmVDb3VudCApCisJCQkJPyBmaXJzdEVEIDogc25kRUQ7CisKKwkJaWYoIGZpcnN0RUQuZ2V0VGFibGVPZlJ1bnRpbWUoKS5zaXplKCkgPT0gc3luY01hY2hpbmVDb3VudCApCisJCXsKKwkJCWlmKCBzbmRFRC5nZXRUYWJsZU9mUnVudGltZSgpLnNpemUoKSAhPSByZWZNYWNoaW5lQ291bnQgKQorCQkJeworCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQk8PCAic25kRUQgbXVzdCBoYXZlIHJlZk1hY2hpbmVDb3VudCBNYWNoaW5lICEhISIKKwkJCQkJCTw8IFNFTkRfRVhJVDsKKwkJCX0KKwkJfQorCQllbHNlLy8gaWYoIHNuZEVELmdldFRhYmxlT2ZSdW50aW1lKCkuc2l6ZSgpID09IHN5bmNNYWNoaW5lQ291bnQgKQorCQl7CisJCQlpZiggZmlyc3RFRC5nZXRUYWJsZU9mUnVudGltZSgpLnNpemUoKSAhPSByZWZNYWNoaW5lQ291bnQgKQorCQkJeworCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQk8PCAiZmlyc3RFRCBtdXN0IGhhdmUgcmVmTWFjaGluZUNvdW50IE1hY2hpbmUgISEhIgorCQkJCQkJPDwgU0VORF9FWElUOworCQkJfQorCQl9CisKKwkJZm9yKCA7IG9mZnNldCA8IHN5bmNNYWNoaW5lQ291bnQgOyArK29mZnNldCApCisJCXsKKwkJCS8vIGZ1c2lvbiBvZiBQcm9jZXNzIEV2YWwgU3RhdGUKKwkJCW5ld0VELT5zZXRSdW50aW1lRm9ybVN0YXRlKG9mZnNldCwKKwkJCQkJbWF4RUQuZ2V0UnVudGltZUZvcm1TdGF0ZShvZmZzZXQpKTsKKworCQkJLy8gZnVzaW9uIG9mIEFzc2lnbiBTdGF0ZQorCQkJbmV3RUQtPmdldFJ1bnRpbWVGb3JtU3RhdGVUYWJsZSgpLT4KKwkJCQkJc2V0QXNzaWduZWQob2Zmc2V0LCBtYXhFRC5nZXRBc3NpZ25lZChvZmZzZXQpKTsKKworCQkJLy8gZnVzaW9uIG9mIFJ1bnRpbWVGb3JtCisJCQluZXdFRC0+YXNzaWduUnVudGltZUZvcm0ob2Zmc2V0LAorCQkJCQljb25zdF9jYXN0PCBSdW50aW1lRm9ybSAqID4oIG1heEVELnB0clJ1bnRpbWUob2Zmc2V0KSApICk7CisKKy8vCQkJLy8gUHJvcGFnYXRlIHN5bmNocm9uaXplZCBFVkFMIFNUQVRFIGZvcm0gY2hpbGRzIHRvIHBhcmVudAorLy8JCQlpZiggbWF4RUQuaXNGaW5hbGl6ZWRPckRlc3Ryb3llZChvZmZzZXQpICkKKy8vCQkJeworLy8JCQkJUnVudGltZUlEIGFSSUQgPSBuZXdFRC0+Z2V0UnVudGltZUlEKG9mZnNldCk7CisvLwkJCQl3aGlsZSggYVJJRC5oYXNQUklEKCkgJiYgYVJJRC5nZXRQUklEKCkuaGFzS2luZEFORCgpICkKKy8vCQkJCXsKKy8vCQkJCQljb25zdCBSdW50aW1lRm9ybSAmIGFSRiA9CisvLwkJCQkJCQluZXdFRC0+Z2V0UnVudGltZSggYVJJRCA9IGFSSUQuZ2V0UFJJRCgpICk7CisvLworLy8JCQkJCS8vIFRPRE86PiBDaGlsZCBtYXkgbm90IGJlIHN5bmNocm9uaXplZCAvIGRlZmluZWQKKy8vCQkJCQlUYWJsZU9mUnVudGltZUlEOjpjb25zdF9pdGVyYXRvciBpdCA9IGFSRi5iZWdpbkNoaWxkKCk7CisvLwkJCQkJVGFibGVPZlJ1bnRpbWVJRDo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBhUkYuZW5kQ2hpbGQoKTsKKy8vCQkJCQlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKy8vCQkJCQl7CisvLwkJCQkJCWlmKCBub3QgbmV3RUQtPmlzRmluYWxpemVkT3JEZXN0cm95ZWQoKml0KSApCisvLwkJCQkJCXsKKy8vCQkJCQkJCWJyZWFrOworLy8JCQkJCQl9CisvLwkJCQkJfQorLy8KKy8vCQkJCQlpZiggaXQgPT0gZW5kSXQgKQorLy8JCQkJCXsKKy8vCQkJCQkJbmV3RUQtPnNldFJ1bnRpbWVGb3JtU3RhdGUoYVJJRCwKKy8vCQkJCQkJCQkoZmlyc3RFRC5pc0ZpbmFsaXplZChvZmZzZXQpIHx8CisvLwkJCQkJCQkJCQlzbmRFRC5pc0ZpbmFsaXplZChvZmZzZXQpKSA/CisvLwkJCQkJCQkJCQkJCVBST0NFU1NfRklOQUxJWkVEX1NUQVRFIDoKKy8vCQkJCQkJCQkJCQkJUFJPQ0VTU19ERVNUUk9ZRURfU1RBVEUpOworLy8JCQkJCX0KKy8vCQkJCQllbHNlCisvLwkJCQkJeworLy8JCQkJCQlicmVhazsKKy8vCQkJCQl9CisvLwkJCQl9CisvLworLy8JCQkJaWYoIG5ld0VELT5pc3VuUnVubmFibGVTeXN0ZW0oKSApCisvLwkJCQl7CisvLwkJCQkJbmV3RUQtPnNldEFFRVMoQUVFU19TVE1OVF9FWElUKTsKKy8vCQkJCX0KKy8vCQkJfQorCQl9CisJfQorCisKKwlyZXR1cm4oIG5ld0VEICk7Cit9CisKKworYm9vbCBBdm1TeW5jaHJvbml6YXRpb25GYWN0b3J5OjpmdXNpb24oY29uc3QgRXhlY3V0aW9uRGF0YSAmIG5ld0VELAorCQljb25zdCBQYXJhbWV0ZXJzUnVudGltZUZvcm0gJiByZWZQYXJhbXNSRiwKKwkJY29uc3QgUGFyYW1ldGVyc1J1bnRpbWVGb3JtICYgZmlyc3RQYXJhbXNSRiwKKwkJY29uc3QgUGFyYW1ldGVyc1J1bnRpbWVGb3JtICYgc25kUGFyYW1zUkYpCit7CisJaWYoICgoJiBmaXJzdFBhcmFtc1JGKSA9PSAoJiBzbmRQYXJhbXNSRikpCisJCXx8ICgoJiByZWZQYXJhbXNSRikgPT0gKCYgc25kUGFyYW1zUkYpKSApCisJeworCQluZXdFRC5hc3NpZ25QYXJhbWV0ZXJzUnVudGltZUZvcm0oCisJCQkJY29uc3RfY2FzdDwgUGFyYW1ldGVyc1J1bnRpbWVGb3JtICogPiggJiBmaXJzdFBhcmFtc1JGICkgKTsKKworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisJZWxzZSBpZiggKCYgcmVmUGFyYW1zUkYpID09ICgmIGZpcnN0UGFyYW1zUkYpICkKKwl7CisJCW5ld0VELmFzc2lnblBhcmFtZXRlcnNSdW50aW1lRm9ybSgKKwkJCQljb25zdF9jYXN0PCBQYXJhbWV0ZXJzUnVudGltZUZvcm0gKiA+KCAmIHNuZFBhcmFtc1JGICkgKTsKKworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisJZWxzZQorCXsKKwkJYXZtX3NpemVfdCByZWZQYXJhbXNDb3VudCA9IHJlZlBhcmFtc1JGLmdldFBhcmFtZXRlcnNTaXplKCk7CisKKwkJUGFyYW1ldGVyc1J1bnRpbWVGb3JtICogbmV3UGFyYW1zUkYgPQorCQkJCW5ldyBQYXJhbWV0ZXJzUnVudGltZUZvcm0ocmVmUGFyYW1zUkYuZ2V0UklEKCksIHJlZlBhcmFtc0NvdW50KTsKKworCQluZXdFRC5zYXZlUGFyYW1ldGVyc1J1bnRpbWVGb3JtKCBuZXdQYXJhbXNSRiApOworCisJCWF2bV9zaXplX3Qgb2Zmc2V0ID0gMDsKKwkJZm9yKCA7IG9mZnNldCA8IHJlZlBhcmFtc0NvdW50IDsgKytvZmZzZXQgKQorCQl7CisJCQkvLyBmdXNpb24gb2YgREFUQQorCQkJaWYoIHJlZlBhcmFtc1JGLnJhd1BhcmFtZXRlcihvZmZzZXQpLT5nZXRNb2RpZmllcigpLmhhc0ZlYXR1cmVUcmFuc2llbnQoKSApCisJCQl7CisJCQkJbmV3UGFyYW1zUkYtPnNldFBhcmFtZXRlcihvZmZzZXQsCisJCQkJCQlyZWZQYXJhbXNSRi5nZXRQYXJhbWV0ZXIob2Zmc2V0KSwKKwkJCQkJCXJlZlBhcmFtc1JGLmdldERhdGEob2Zmc2V0KSApOworCQkJfQorCisJCQllbHNlIGlmKCByZWZQYXJhbXNSRi5nZXREYXRhKG9mZnNldCkgPT0gZmlyc3RQYXJhbXNSRi5nZXREYXRhKG9mZnNldCkgKQorCQkJeworCQkJCW5ld1BhcmFtc1JGLT5zZXRQYXJhbWV0ZXIob2Zmc2V0LAorCQkJCQkJcmVmUGFyYW1zUkYuZ2V0UGFyYW1ldGVyKG9mZnNldCksCisJCQkJCQlzbmRQYXJhbXNSRi5nZXREYXRhKG9mZnNldCkgKTsKKwkJCX0KKwkJCWVsc2UgaWYoIHJlZlBhcmFtc1JGLmdldERhdGEob2Zmc2V0KSA9PSBzbmRQYXJhbXNSRi5nZXREYXRhKG9mZnNldCkgKQorCQkJeworCQkJCW5ld1BhcmFtc1JGLT5zZXRQYXJhbWV0ZXIob2Zmc2V0LAorCQkJCQkJcmVmUGFyYW1zUkYuZ2V0UGFyYW1ldGVyKG9mZnNldCksCisJCQkJCQlmaXJzdFBhcmFtc1JGLmdldERhdGEob2Zmc2V0KSApOworCQkJfQorCQkJLy8gVE9ETyBFcXVhbGl0eSBiZXR3ZWVuIEVsZW1lbnQKKwkJCWVsc2UgaWYoIGZpcnN0UGFyYW1zUkYuZ2V0RGF0YShvZmZzZXQpID09IHNuZFBhcmFtc1JGLmdldERhdGEob2Zmc2V0KSApCisJCQl7CisJCQkJbmV3UGFyYW1zUkYtPnNldFBhcmFtZXRlcihvZmZzZXQsCisJCQkJCQlyZWZQYXJhbXNSRi5nZXRQYXJhbWV0ZXIob2Zmc2V0KSwKKwkJCQkJCWZpcnN0UGFyYW1zUkYuZ2V0RGF0YShvZmZzZXQpICk7CisJCQl9CisJCQllbHNlIGlmKCAvL3JlZlBhcmFtc1JGLmdldFBhcmFtZXRlcihvZmZzZXQpLT5pc1R5cGVkQXJyYXlPclN0cnVjdHVyZSgpICYmCisJCQkJCXJlZlBhcmFtc1JGLmdldERhdGEob2Zmc2V0KS5pczwgQXJyYXlCRiA+KCkgJiYKKwkJCQkJZmlyc3RQYXJhbXNSRi5nZXREYXRhKG9mZnNldCkuaXM8IEFycmF5QkYgPigpICYmCisJCQkJCXNuZFBhcmFtc1JGLmdldERhdGEob2Zmc2V0KS5pczwgQXJyYXlCRiA+KCkgKQorCQkJeworCQkJCUJGIHN5bmNWYWx1ZSA9IGZ1c2lvbkFycmF5RGF0YShyZWZQYXJhbXNSRiwKKwkJCQkJCXJlZlBhcmFtc1JGLmdldERhdGEob2Zmc2V0KS50b19wdHI8IEFycmF5QkYgPigpLAorCQkJCQkJZmlyc3RQYXJhbXNSRi5nZXREYXRhKG9mZnNldCkudG9fcHRyPCBBcnJheUJGID4oKSwKKwkJCQkJCXNuZFBhcmFtc1JGLmdldERhdGEob2Zmc2V0KS50b19wdHI8IEFycmF5QkYgPigpICk7CisKKwkJCQlpZiggc3luY1ZhbHVlLnZhbGlkKCkgKQorCQkJCXsKKwkJCQkJbmV3UGFyYW1zUkYtPnNldFBhcmFtZXRlcihvZmZzZXQsCisJCQkJCQkJcmVmUGFyYW1zUkYuZ2V0UGFyYW1ldGVyKG9mZnNldCksIHN5bmNWYWx1ZSApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQkvLyBBdm1Db25jdXJyZW5jeVN0YXRlbWVudCBGYWlsZWQKKwkJCQkJQVZNX09TX0VSUk9SX0FMRVJUCisJCQkJCQkJPDwgIlJ1bnRpbWU8ICIgPDwgcmVmUGFyYW1zUkYuZ2V0UklEKCkuc3RyKCkKKwkJCQkJCQk8PCAiPiA6PiBmdXNpb24gb2YgRGF0YSBUYWJsZSBBUlJBWSBFbGVtZW50IEZBSUxFRCAiCisJCQkJCQkJCSI6IChpdEZpcnN0RGF0YSAhPSBpdFNuZERhdGEpIDoiCisJCQkJCQkJPDwgIlxuXHQkMCA9ICIgPDwgcmVmUGFyYW1zUkYuZ2V0RGF0YShvZmZzZXQpLnN0cigpCisJCQkJCQkJPDwgIlxuXHQkMSA9ICIgPDwgZmlyc3RQYXJhbXNSRi5nZXREYXRhKG9mZnNldCkuc3RyKCkKKwkJCQkJCQk8PCAiXG5cdCQyID0gIiA8PCBzbmRQYXJhbXNSRi5nZXREYXRhKG9mZnNldCkuc3RyKCkKKwkJCQkJCQk8PCBTRU5EX0FMRVJUOworCisJCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCQl9CisJCQl9CisJCQllbHNlIGlmKCByZWZQYXJhbXNSRi5yYXdQYXJhbWV0ZXIob2Zmc2V0KS0+CisJCQkJCWdldFR5cGVTcGVjaWZpZXIoKS0+aGFzVHlwZUNvbXBvc2l0ZSgpICkKKwkJCXsKKwkJCQkvLyBBdm1Db25jdXJyZW5jeVN0YXRlbWVudCBGYWlsZWQKKwkJCQlBVk1fT1NfV0FSTklOR19BTEVSVAorCQkJCQkJPDwgIlJ1bnRpbWU8ICIgPDwgcmVmUGFyYW1zUkYuZ2V0UklEKCkuc3RyKCkKKwkJCQkJCTw8ICI+IDo+IGZ1c2lvbiBvZiBEYXRhIFRhYmxlIEFSUkFZIEVsZW1lbnQgRkFJTEVEIDogIgorCQkJCQkJCSIoaXRGaXJzdERhdGE8YXJyYXk+ICE9IGl0U25kRGF0YTxhcnJheT4pIDoiCisJCQkJCQk8PCAiXG5cdCQwID0gIiA8PCByZWZQYXJhbXNSRi5nZXREYXRhKG9mZnNldCkuc3RyKCkKKwkJCQkJCTw8ICJcblx0JDEgPSAiIDw8IGZpcnN0UGFyYW1zUkYuZ2V0RGF0YShvZmZzZXQpLnN0cigpCisJCQkJCQk8PCAiXG5cdCQyID0gIiA8PCBzbmRQYXJhbXNSRi5nZXREYXRhKG9mZnNldCkuc3RyKCkKKwkJCQkJCTw8IFNFTkRfQUxFUlQ7CisKKwkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gQXZtQ29uY3VycmVuY3lTdGF0ZW1lbnQgRmFpbGVkCisJCQkJQVZNX09TX0VSUk9SX0FMRVJUCisJCQkJCQk8PCAiUnVudGltZTwgIiA8PCByZWZQYXJhbXNSRi5nZXRSSUQoKS5zdHIoKQorCQkJCQkJPDwgIj4gOj4gZnVzaW9uIG9mIERhdGEgVGFibGUgRWxlbWVudCBGQUlMRUQgOiAiCisJCQkJCQkJIihpdEZpcnN0RGF0YSAhPSBpdFNuZERhdGEpIDoiCisJCQkJCQk8PCAiXG5cdCQwID0gIiA8PCByZWZQYXJhbXNSRi5nZXREYXRhKG9mZnNldCkuc3RyKCkKKwkJCQkJCTw8ICJcblx0JDEgPSAiIDw8IGZpcnN0UGFyYW1zUkYuZ2V0RGF0YShvZmZzZXQpLnN0cigpCisJCQkJCQk8PCAiXG5cdCQyID0gIiA8PCBzbmRQYXJhbXNSRi5nZXREYXRhKG9mZnNldCkuc3RyKCkKKwkJCQkJCTw8IFNFTkRfQUxFUlQ7CisKKwkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQl9CisJCX0KKworCQlmb3IoIG9mZnNldCA9IHJlZlBhcmFtc0NvdW50IDsKKwkJCQlvZmZzZXQgPCBmaXJzdFBhcmFtc1JGLmdldFBhcmFtZXRlcnNTaXplKCkgOyArK29mZnNldCApCisJCXsKKwkJCW5ld1BhcmFtc1JGLT5hcHBlbmRQYXJhbWV0ZXIoIGZpcnN0UGFyYW1zUkYuZ2V0UGFyYW1ldGVyKG9mZnNldCksCisJCQkJCWZpcnN0UGFyYW1zUkYuZ2V0RGF0YShvZmZzZXQpICk7CisJCX0KKworCQlmb3IoIG9mZnNldCA9IHJlZlBhcmFtc0NvdW50IDsKKwkJCQlvZmZzZXQgPCBzbmRQYXJhbXNSRi5nZXRQYXJhbWV0ZXJzU2l6ZSgpIDsgKytvZmZzZXQgKQorCQl7CisJCQluZXdQYXJhbXNSRi0+YXBwZW5kUGFyYW1ldGVyKCBzbmRQYXJhbXNSRi5nZXRQYXJhbWV0ZXIob2Zmc2V0KSwKKwkJCQkJc25kUGFyYW1zUkYuZ2V0RGF0YShvZmZzZXQpICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCitib29sIEF2bVN5bmNocm9uaXphdGlvbkZhY3Rvcnk6OmZ1c2lvbigKKwkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIG5ld0VELCBjb25zdCBSdW50aW1lRm9ybSAmIHJlZlJGLAorCQljb25zdCBSdW50aW1lRm9ybSAmIGZpcnN0UkYsIGNvbnN0IFJ1bnRpbWVGb3JtICYgc25kUkYpCit7CisJaWYoICgoJiBmaXJzdFJGKSA9PSAoJiBzbmRSRikpIHx8ICgoJiByZWZSRikgPT0gKCYgc25kUkYpKSApCisJeworCQluZXdFRC5hc3NpZ25SdW50aW1lRm9ybSggZmlyc3RSRi5nZXRPZmZzZXQoKSAsCisJCQkJY29uc3RfY2FzdDwgUnVudGltZUZvcm0qID4oJiBmaXJzdFJGKSApOworCisJCXJldHVybiggdHJ1ZSApOworCX0KKwllbHNlIGlmKCAmcmVmUkYgPT0gJmZpcnN0UkYgKQorCXsKKwkJbmV3RUQuYXNzaWduUnVudGltZUZvcm0oIGZpcnN0UkYuZ2V0T2Zmc2V0KCkgLAorCQkJCWNvbnN0X2Nhc3Q8IFJ1bnRpbWVGb3JtKiA+KCYgc25kUkYpICk7CisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisJLy8gbmV3IHN5bmNocm9uaXplZCBSdW50aW1lRm9ybQorCVJ1bnRpbWVGb3JtICogbmV3UkYgPSBuZXcgUnVudGltZUZvcm0oIHJlZlJGLmdldFJJRCgpICk7CisKKwluZXdFRC5zYXZlUnVudGltZUZvcm0oIG5ld1JGLT5nZXRPZmZzZXQoKSAsIG5ld1JGICk7CisKKwkvLyBmdXNpb24gb2YgSW5zdGFuY2lhdGlvbkNvdW50CisJaWYoIHJlZlJGLmdldEluc3RhbmNpYXRpb25Db3VudCgpID09IGZpcnN0UkYuZ2V0SW5zdGFuY2lhdGlvbkNvdW50KCkgKQorCXsKKwkJbmV3UkYtPnNldEluc3RhbmNpYXRpb25Db3VudCggc25kUkYuZ2V0SW5zdGFuY2lhdGlvbkNvdW50KCkgKTsKKwl9CisJZWxzZSBpZiggcmVmUkYuZ2V0SW5zdGFuY2lhdGlvbkNvdW50KCkgPT0gc25kUkYuZ2V0SW5zdGFuY2lhdGlvbkNvdW50KCkgKQorCXsKKwkJbmV3UkYtPnNldEluc3RhbmNpYXRpb25Db3VudCggZmlyc3RSRi5nZXRJbnN0YW5jaWF0aW9uQ291bnQoKSApOworCX0KKwllbHNlIGlmKCBmaXJzdFJGLmdldEluc3RhbmNpYXRpb25Db3VudCgpICE9IHNuZFJGLmdldEluc3RhbmNpYXRpb25Db3VudCgpICkKKwl7CisJCW5ld1JGLT5zZXRJbnN0YW5jaWF0aW9uQ291bnQoCisJCQkJc3RkOjptYXgoZmlyc3RSRi5nZXRJbnN0YW5jaWF0aW9uQ291bnQoKSwKKwkJCQkJCXNuZFJGLmdldEluc3RhbmNpYXRpb25Db3VudCgpICkgKTsKKwl9CisKKwkvLyBmdXNpb24gb2YgQ2hpbGRUYWJsZQorCWlmKCByZWZSRi5nZXRDaGlsZFRhYmxlKCkgPT0gZmlyc3RSRi5nZXRDaGlsZFRhYmxlKCkgKQorCXsKKwkJbmV3UkYtPnNldENoaWxkVGFibGUoIHNuZFJGLmdldENoaWxkVGFibGUoKSApOworCX0KKwllbHNlIGlmKCByZWZSRi5nZXRDaGlsZFRhYmxlKCkgPT0gc25kUkYuZ2V0Q2hpbGRUYWJsZSgpICkKKwl7CisJCW5ld1JGLT5zZXRDaGlsZFRhYmxlKCBmaXJzdFJGLmdldENoaWxkVGFibGUoKSApOworCX0KKwllbHNlIGlmKCBmaXJzdFJGLmdldENoaWxkVGFibGUoKSAhPSBzbmRSRi5nZXRDaGlsZFRhYmxlKCkgKQorCXsKKwkJLy8gVE9ETyBBdm1Db25jdXJyZW5jeVN0YXRlbWVudCBvZiBDaGlsZCBUYWJsZQorCX0KKwllbHNlCisJeworCQlBVk1fT1NfRVJST1JfQUxFUlQKKwkJCQk8PCAiUnVudGltZTwgIiA8PCByZWZSRi5nZXRSSUQoKS5zdHIoKQorCQkJCTw8ICI+IDo+IGZ1c2lvbiBvZiBDaGlsZCBUYWJsZSBGQUlMRUQgOiAiCisJCQkJCSIocmVmICE9IGZpcnN0KSAmJiAocmVmICE9IHNuZCkgJiYgKGZpcnN0ID0gc25kKSA6XG4iCisJCQkJPDwgcmVmUkYuZ2V0Q2hpbGRUYWJsZSgpLT50b1N0cmluZyhBVk1fVEFCMV9JTkRFTlQpCisJCQkJPDwgZmlyc3RSRi5nZXRDaGlsZFRhYmxlKCktPnRvU3RyaW5nKEFWTV9UQUIxX0lOREVOVCkKKwkJCQk8PCBzbmRSRi5nZXRDaGlsZFRhYmxlKCktPnRvU3RyaW5nKEFWTV9UQUIxX0lOREVOVCkKKwkJCQk8PCBTRU5EX0FMRVJUOworCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwkvLyBmdXNpb24gb2YgREFUQQorCWlmKCBub3QgZnVzaW9uKCgqbmV3UkYpLCByZWZSRi5nZXREYXRhVGFibGUoKSwKKwkJCWZpcnN0UkYuZ2V0RGF0YVRhYmxlKCksIHNuZFJGLmdldERhdGFUYWJsZSgpKSApCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJLy8gZnVzaW9uIG9mIEJVRkZFUgorCWlmKCBub3QgZnVzaW9uKCgqbmV3UkYpLCByZWZSRi5nZXRCdWZmZXJUYWJsZSgpLCBmaXJzdFJGLmdldEJ1ZmZlclRhYmxlKCksCisJCQlzbmRSRi5nZXRCdWZmZXJUYWJsZSgpKSApCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJLy8gZnVzaW9uIG9mIFJPVVRFUgorCWlmKCBub3QgZnVzaW9uKCgqbmV3UkYpLCByZWZSRi5nZXRSb3V0ZXIoKSwKKwkJCWZpcnN0UkYuZ2V0Um91dGVyKCksIHNuZFJGLmdldFJvdXRlcigpKSApCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisKKy8vIT8hIENvZGUgcG91ciDDqXZvbHV0aW9uIGZ1dHVyZQorLy8JLy8gZnVzaW9uIG9mIE5vZGVDb25kaXRpb24KKy8vCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggZmlyc3RSRi5oYXNOb2RlQ29uZGl0aW9uKCkgKQorLy8JCQk8PCAiZmlyc3RSRiBtdXN0IGhhdmUgTm9kZUNvbmRpdGlvbiAhISEiCisvLwkJCTw8IFNFTkRfRVhJVDsKKy8vCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggc25kUkYuaGFzTm9kZUNvbmRpdGlvbigpICkKKy8vCQkJPDwgInNuZFJGIG11c3QgaGF2ZSBOb2RlQ29uZGl0aW9uICEhISIKKy8vCQkJPDwgU0VORF9FWElUOworLy8KKy8vCUJGIHRoZU5vZGVDb25kaXRpb24gPSBFeHByZXNzaW9uU2ltcGxpZmllcjo6c2ltcGxpZl9hbmQoCisvLwkJCWZpcnN0UkYuZ2V0Tm9kZUNvbmRpdGlvbigpLAorLy8JCQlzbmRSRi5nZXROb2RlQ29uZGl0aW9uKCkpOworLy8KKy8vCW5ld1JGLT5zZXROb2RlQ29uZGl0aW9uKCB0aGVOb2RlQ29uZGl0aW9uICk7CisvLworLy8KKy8vCS8vIGZ1c2lvbiBvZiBOb2RlVGltZWRDb25kaXRpb24KKy8vCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggZmlyc3RSRi5oYXNOb2RlVGltZWRDb25kaXRpb24oKSApCisvLwkJCTw8ICJmaXJzdFJGIG11c3QgaGF2ZSBOb2RlVGltZWRDb25kaXRpb24gISEhIgorLy8JCQk8PCBTRU5EX0VYSVQ7CisvLwlBVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoIHNuZFJGLmhhc05vZGVUaW1lZENvbmRpdGlvbigpICkKKy8vCQkJPDwgInNuZFJGIG11c3QgaGF2ZSBOb2RlVGltZWRDb25kaXRpb24gISEhIgorLy8JCQk8PCBTRU5EX0VYSVQ7CisvLworLy8JQkYgdGhlTm9kZVRpbWVkQ29uZGl0aW9uID0gRXhwcmVzc2lvblNpbXBsaWZpZXI6OnNpbXBsaWZfYW5kKAorLy8JCQlmaXJzdFJGLmdldE5vZGVUaW1lZENvbmRpdGlvbigpLAorLy8JCQlzbmRSRi5nZXROb2RlVGltZWRDb25kaXRpb24oKSk7CisvLworLy8JbmV3UkYtPnNldE5vZGVUaW1lZENvbmRpdGlvbiggdGhlTm9kZVRpbWVkQ29uZGl0aW9uICk7CisKKworCS8vIGZ1c2lvbiBvZiBvblNjaGVkdWxlCisJaWYoIHJlZlJGLmdldE9uU2NoZWR1bGUoKSA9PSBmaXJzdFJGLmdldE9uU2NoZWR1bGUoKSApCisJeworCQluZXdSRi0+c2V0T25TY2hlZHVsZSggc25kUkYuZ2V0T25TY2hlZHVsZSgpICk7CisJfQorCWVsc2UgaWYoIHJlZlJGLmdldE9uU2NoZWR1bGUoKSA9PSBzbmRSRi5nZXRPblNjaGVkdWxlKCkgKQorCXsKKwkJbmV3UkYtPnNldE9uU2NoZWR1bGUoIGZpcnN0UkYuZ2V0T25TY2hlZHVsZSgpICk7CisJfQorCWVsc2UgaWYoIGZpcnN0UkYuZ2V0T25TY2hlZHVsZSgpID09IHNuZFJGLmdldE9uU2NoZWR1bGUoKSApCisJeworCQluZXdSRi0+c2V0T25TY2hlZHVsZSggZmlyc3RSRi5nZXRPblNjaGVkdWxlKCkgKTsKKwl9CisvLwllbHNlIGlmKCBmaXJzdFJGLmhhc09uU2NoZWR1bGUoKSAmJiBzbmRSRi5oYXNPblNjaGVkdWxlKCkgKQorLy8JeworLy8vLwkJbmV3UkYtPnNldE9uU2NoZWR1bGUoIGJ1aWxkU2NoZWR1bGVGb3JtKAorLy8vLwkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1BBUkFMTEVMLCByZWZSRi5nZXRPblNjaGVkdWxlKCksCisvLy8vCQkJCWZpcnN0UkYuZ2V0T25TY2hlZHVsZSgpLCBzbmRSRi5nZXRPblNjaGVkdWxlKCkpICk7CisvLworLy8JCUFWTV9PU19FUlJPUl9BTEVSVAorLy8JCQkJPDwgIlJ1bnRpbWU8ICIgPDwgcmVmUkYuZ2V0UklEKCkuc3RyKCkKKy8vCQkJCTw8ICI+IDo+IGZ1c2lvbiBvZiByb3V0aW5lIE9uU2NoZWR1bGUgRkFJTEVEIDoiCisvLwkJCQk8PCAiXG5cdCQwID0gIiA8PCByZWZSRi5nZXRPblNjaGVkdWxlKCkuc3RyKCkKKy8vCQkJCTw8ICJcblx0JDEgPSAiIDw8IGZpcnN0UkYuZ2V0T25TY2hlZHVsZSgpLnN0cigpCisvLwkJCQk8PCAiXG5cdCQyID0gIiA8PCBzbmRSRi5nZXRPblNjaGVkdWxlKCkuc3RyKCkKKy8vCQkJCTw8IFNFTkRfQUxFUlQ7CisvLworLy8JCXJldHVybiggZmFsc2UgKTsKKy8vCX0KKwllbHNlCisJeworCQlBVk1fT1NfRVJST1JfQUxFUlQKKwkJCQk8PCAiUnVudGltZTwgIiA8PCByZWZSRi5nZXRSSUQoKS5zdHIoKQorCQkJCTw8ICI+IDo+IGZ1c2lvbiBvZiByb3V0aW5lIE9uU2NoZWR1bGUgRkFJTEVEIDoiCisJCQkJPDwgIlxuXHQkMCA9ICIgPDwgcmVmUkYuZ2V0T25TY2hlZHVsZSgpLnN0cigpCisJCQkJPDwgIlxuXHQkMSA9ICIgPDwgZmlyc3RSRi5nZXRPblNjaGVkdWxlKCkuc3RyKCkKKwkJCQk8PCAiXG5cdCQyID0gIiA8PCBzbmRSRi5nZXRPblNjaGVkdWxlKCkuc3RyKCkKKwkJCQk8PCBTRU5EX0FMRVJUOworCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKworCS8vIGZ1c2lvbiBvZiBvbkRlZmVyCisJaWYoIHJlZlJGLmdldE9uRGVmZXIoKSA9PSBmaXJzdFJGLmdldE9uRGVmZXIoKSApCisJeworCQluZXdSRi0+c2V0T25EZWZlciggc25kUkYuZ2V0T25EZWZlcigpICk7CisJfQorCWVsc2UgaWYoIHJlZlJGLmdldE9uRGVmZXIoKSA9PSBzbmRSRi5nZXRPbkRlZmVyKCkgKQorCXsKKwkJbmV3UkYtPnNldE9uRGVmZXIoIGZpcnN0UkYuZ2V0T25EZWZlcigpICk7CisJfQorCWVsc2UgaWYoIGZpcnN0UkYuZ2V0T25EZWZlcigpID09IHNuZFJGLmdldE9uRGVmZXIoKSApCisJeworCQluZXdSRi0+c2V0T25EZWZlciggZmlyc3RSRi5nZXRPbkRlZmVyKCkgKTsKKwl9CisvLwllbHNlIGlmKCBmaXJzdFJGLmhhc09uRGVmZXIoKSAmJiBzbmRSRi5oYXNPbkRlZmVyKCkgKQorLy8JeworLy8vLwkJbmV3UkYtPnNldE9uRGVmZXIoIGJ1aWxkU2NoZWR1bGVGb3JtKAorLy8vLwkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1BBUkFMTEVMLCByZWZSRi5nZXRPbkRlZmVyKCksCisvLy8vCQkJCWZpcnN0UkYuZ2V0T25EZWZlcigpLCBzbmRSRi5nZXRPbkRlZmVyKCkpICk7CisvLworLy8JCUFWTV9PU19FUlJPUl9BTEVSVAorLy8JCQkJPDwgIlJ1bnRpbWU8ICIgPDwgcmVmUkYuZ2V0UklEKCkuc3RyKCkKKy8vCQkJCTw8ICI+IDo+IGZ1c2lvbiBvZiByb3V0aW5lIE9uRGVmZXIgRkFJTEVEIDoiCisvLwkJCQk8PCAiXG5cdCQwID0gIiA8PCByZWZSRi5nZXRPbkRlZmVyKCkuc3RyKCkKKy8vCQkJCTw8ICJcblx0JDEgPSAiIDw8IGZpcnN0UkYuZ2V0T25EZWZlcigpLnN0cigpCisvLwkJCQk8PCAiXG5cdCQyID0gIiA8PCBzbmRSRi5nZXRPbkRlZmVyKCkuc3RyKCkKKy8vCQkJCTw8IFNFTkRfQUxFUlQ7CisvLworLy8JCXJldHVybiggZmFsc2UgKTsKKy8vCX0KKwllbHNlCisJeworCQlBVk1fT1NfRVJST1JfQUxFUlQKKwkJCQk8PCAiUnVudGltZTwgIiA8PCByZWZSRi5nZXRSSUQoKS5zdHIoKQorCQkJCTw8ICI+IDo+IGZ1c2lvbiBvZiByb3V0aW5lIE9uRGVmZXIgRkFJTEVEIDoiCisJCQkJPDwgIlxuXHQkMCA9ICIgPDwgcmVmUkYuZ2V0T25EZWZlcigpLnN0cigpCisJCQkJPDwgIlxuXHQkMSA9ICIgPDwgZmlyc3RSRi5nZXRPbkRlZmVyKCkuc3RyKCkKKwkJCQk8PCAiXG5cdCQyID0gIiA8PCBzbmRSRi5nZXRPbkRlZmVyKCkuc3RyKCkKKwkJCQk8PCBTRU5EX0FMRVJUOworCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKworLy8hPyEgQ29kZSBwb3VyIMOpdm9sdXRpb24gZnV0dXJlCisvLwkvLyBmdXNpb24gb2YgUnVubmFibGVFbGVtZW50VHJhY2UKKy8vCWlmKCBmaXJzdFJGLmhhc1J1bm5hYmxlRWxlbWVudFRyYWNlKCkKKy8vCQkmJiBzbmRSRi5oYXNSdW5uYWJsZUVsZW1lbnRUcmFjZSgpICkKKy8vCXsKKy8vCQlpZiggZmlyc3RSRi5nZXRSdW5uYWJsZUVsZW1lbnRUcmFjZSgpID09CisvLwkJCQlzbmRSRi5nZXRSdW5uYWJsZUVsZW1lbnRUcmFjZSgpICkKKy8vCQl7CisvLwkJCW5ld1JGLnNldFJ1bm5hYmxlRWxlbWVudFRyYWNlKAorLy8JCQkJCWZpcnN0UkYuZ2V0UnVubmFibGVFbGVtZW50VHJhY2UoKSApOworLy8JCX0KKy8vCQllbHNlCisvLwkJeworLy8JCQluZXdSRi0+c2V0UnVubmFibGVFbGVtZW50VHJhY2UoIGJ1aWxkUnVubmFibGVFbGVtZW50VHJhY2UoCisvLwkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9QQVJBTExFTCwKKy8vCQkJCQlyZWZSRi5nZXRSdW5uYWJsZUVsZW1lbnRUcmFjZSgpLAorLy8JCQkJCWZpcnNSRi4+Z2V0UnVubmFibGVFbGVtZW50VHJhY2UoKSwKKy8vCQkJCQlzbmRSRi5nZXRSdW5uYWJsZUVsZW1lbnRUcmFjZSgpICkgICk7CisvLwkJfQorLy8JfQorLy8JZWxzZSBpZiggZmlyc3RSRi5oYXNSdW5uYWJsZUVsZW1lbnRUcmFjZSgpICkKKy8vCXsKKy8vCQluZXdSRi0+c2V0UnVubmFibGVFbGVtZW50VHJhY2UoIGZpcnN0UkYuZ2V0UnVubmFibGVFbGVtZW50VHJhY2UoKSApOworLy8JfQorLy8JZWxzZSBpZiggIHNuZFJGLmhhc1J1bm5hYmxlRWxlbWVudFRyYWNlKCkgKQorLy8JeworLy8JCW5ld1JGLT5zZXRSdW5uYWJsZUVsZW1lbnRUcmFjZSggc25kUkYuZ2V0UnVubmFibGVFbGVtZW50VHJhY2UoKSApOworLy8JfQorCisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisKK2Jvb2wgQXZtU3luY2hyb25pemF0aW9uRmFjdG9yeTo6ZnVzaW9uKFJ1bnRpbWVGb3JtICYgYVJGLAorCQljb25zdCBBUFRhYmxlT2ZEYXRhICYgcmVmRGF0YVRhYmxlLAorCQljb25zdCBBUFRhYmxlT2ZEYXRhICYgZmlyc3REYXRhVGFibGUsCisJCWNvbnN0IEFQVGFibGVPZkRhdGEgJiBzbmREYXRhVGFibGUpCit7CisJLy8gZnVzaW9uIG9mIERBVEEKKwlpZiggZmlyc3REYXRhVGFibGUudmFsaWQoKSAmJiBzbmREYXRhVGFibGUudmFsaWQoKSApCisJeworCQlpZiggZmlyc3REYXRhVGFibGUgPT0gc25kRGF0YVRhYmxlICkKKwkJeworCQkJYVJGLnNldERhdGFUYWJsZSggZmlyc3REYXRhVGFibGUgKTsKKwkJfQorCQllbHNlIGlmKCByZWZEYXRhVGFibGUgPT0gZmlyc3REYXRhVGFibGUgKQorCQl7CisJCQlhUkYuc2V0RGF0YVRhYmxlKCBzbmREYXRhVGFibGUgKTsKKwkJfQorCQllbHNlIGlmKCByZWZEYXRhVGFibGUgPT0gc25kRGF0YVRhYmxlICkKKwkJeworCQkJYVJGLnNldERhdGFUYWJsZSggZmlyc3REYXRhVGFibGUgKTsKKwkJfQorCQllbHNlIGlmKCAocmVmRGF0YVRhYmxlLT5zaXplKCkgPT0gZmlyc3REYXRhVGFibGUtPnNpemUoKSkgJiYKKwkJCQkocmVmRGF0YVRhYmxlLT5zaXplKCkgPT0gc25kRGF0YVRhYmxlLT5zaXplKCkpICkKKwkJeworCQkJLy8gQ29tcGFyaXNvbiBiZXR3ZWVuIGFsbCBkYXRhCisJCQlUYWJsZU9mRGF0YSAqIGFEYXRhVGFibGUgPSBuZXcgVGFibGVPZkRhdGEoIHJlZkRhdGFUYWJsZS0+c2l6ZSgpICk7CisJCQlhUkYuc2V0RGF0YVRhYmxlKCBhRGF0YVRhYmxlICk7CisKKwkJCVRhYmxlT2ZEYXRhOjppdGVyYXRvciBpdFJlZiA9IHJlZkRhdGFUYWJsZS0+YmVnaW4oKTsKKwkJCVRhYmxlT2ZEYXRhOjppdGVyYXRvciBpdFJlZkVuZCA9IHJlZkRhdGFUYWJsZS0+ZW5kKCk7CisJCQlUYWJsZU9mRGF0YTo6aXRlcmF0b3IgaXRGaXJzdCA9IGZpcnN0RGF0YVRhYmxlLT5iZWdpbigpOworCQkJVGFibGVPZkRhdGE6Oml0ZXJhdG9yIGl0U25kID0gc25kRGF0YVRhYmxlLT5iZWdpbigpOworCisJCQlhdm1fc2l6ZV90IG9mZnNldCA9IDA7CisJCQlmb3IoIDsgaXRSZWYgIT0gaXRSZWZFbmQgOyArK2l0UmVmICwgKytpdEZpcnN0LCArK2l0U25kLCArK29mZnNldCApCisJCQl7CisvLwlBVk1fT1NfQ09VVCA8PCBzdHJfaGVhZGVyKCBhUkYucmF3VmFyaWFibGUob2Zmc2V0KSApIDw8IHN0ZDo6ZW5kbAorLy8JCQk8PCAicmVmOiIgPDwgKCppdFJlZikuc3RyKCIgIikgICA8PCBzdGQ6OmVuZGwKKy8vCQkJPDwgImZzdDoiIDw8ICgqaXRGaXJzdCkuc3RyKCIgIikgPDwgc3RkOjplbmRsCisvLwkJCTw8ICJzbmQ6IiA8PCAoKml0U25kKS5zdHIoIiAiKSAgIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisKKwkJCQlpZiggKCppdFJlZikgPT0gKCppdEZpcnN0KSApCisJCQkJeworCQkJCQlhRGF0YVRhYmxlLT5zZXQoIG9mZnNldCAsICgqaXRTbmQpICk7CisJCQkJfQorCQkJCWVsc2UgaWYoICgqaXRSZWYpID09ICgqaXRTbmQpICkKKwkJCQl7CisJCQkJCWFEYXRhVGFibGUtPnNldCggb2Zmc2V0ICwgKCppdEZpcnN0KSApOworCQkJCX0KKwkJCQllbHNlIGlmKCAoKml0Rmlyc3QpID09ICgqaXRTbmQpICkgLy8gVE9ETyBFcXVhbGl0eSBiZXR3ZWVuIEVsZW1lbnQKKwkJCQl7CisJCQkJCWFEYXRhVGFibGUtPnNldCggb2Zmc2V0ICwgKCppdEZpcnN0KSApOworCQkJCX0KKwkJCQllbHNlIGlmKCAvL2FSRi5nZXRWYXJpYWJsZShvZmZzZXQpLT5pc1R5cGVkQXJyYXlPclN0cnVjdHVyZSgpICYmCisJCQkJCQkoKml0UmVmKS5pczwgQXJyYXlCRiA+KCkgJiYKKwkJCQkJCSgqaXRGaXJzdCkuaXM8IEFycmF5QkYgPigpICYmCisJCQkJCQkoKml0U25kKS5pczwgQXJyYXlCRiA+KCkgKQorCQkJCXsKKwkJCQkJQkYgc3luY1ZhbHVlID0gZnVzaW9uQXJyYXlEYXRhKGFSRiwKKwkJCQkJCQkoKml0UmVmKS50b19wdHI8IEFycmF5QkYgPigpLAorCQkJCQkJCSgqaXRGaXJzdCkudG9fcHRyPCBBcnJheUJGID4oKSwKKwkJCQkJCQkoKml0U25kKS50b19wdHI8IEFycmF5QkYgPigpICk7CisKKwkJCQkJaWYoIHN5bmNWYWx1ZS52YWxpZCgpICkKKwkJCQkJeworCQkJCQkJYURhdGFUYWJsZS0+c2V0KCBvZmZzZXQgLCBzeW5jVmFsdWUgKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCS8vIEF2bUNvbmN1cnJlbmN5U3RhdGVtZW50IEZhaWxlZAorCQkJCQkJQVZNX09TX0VSUk9SX0FMRVJUCisJCQkJCQkJCTw8ICJSdW50aW1lPCAiIDw8IGFSRi5nZXRSSUQoKS5zdHIoKQorCQkJCQkJCQk8PCAiPiA6PiBmdXNpb24gb2YgRGF0YSBUYWJsZSBBUlJBWSBFbGVtZW50ICIKKwkJCQkJCQkJCSJGQUlMRUQgOiAoaXRGaXJzdERhdGEgIT0gaXRTbmREYXRhKSA6IgorCQkJCQkJCQk8PCAiXG5cdCIgPDwgc3RyX2hlYWRlciggYVJGLnJhd1ZhcmlhYmxlKG9mZnNldCkgKQorCQkJCQkJCQk8PCAiXG5cdCQwID0gIiA8PCAoKml0UmVmKS5zdHIoKQorCQkJCQkJCQk8PCAiXG5cdCQxID0gIiA8PCAoKml0Rmlyc3QpLnN0cigpCisJCQkJCQkJCTw8ICJcblx0JDIgPSAiIDw8ICgqaXRTbmQpLnN0cigpCisJCQkJCQkJCTw8IFNFTkRfQUxFUlQ7CisKKwkJCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmKCBhUkYucmF3VmFyaWFibGUob2Zmc2V0KS0+CisJCQkJCQlnZXRUeXBlU3BlY2lmaWVyKCktPmhhc1R5cGVDb21wb3NpdGUoKSApCisJCQkJeworCQkJCQkvLyBBdm1Db25jdXJyZW5jeVN0YXRlbWVudCBGYWlsZWQKKwkJCQkJQVZNX09TX1dBUk5JTkdfQUxFUlQKKwkJCQkJCQk8PCAiUnVudGltZTwgIiA8PCBhUkYuZ2V0UklEKCkuc3RyKCkKKwkJCQkJCQk8PCAiPiA6PiBmdXNpb24gb2YgRGF0YSBUYWJsZSBBUlJBWSBFbGVtZW50IEZBSUxFRCAiCisJCQkJCQkJCSI6IChpdEZpcnN0RGF0YTxhcnJheT4gIT0gaXRTbmREYXRhPGFycmF5PikgOiIKKwkJCQkJCQk8PCAiXG5cdCIgPDwgc3RyX2hlYWRlciggYVJGLnJhd1ZhcmlhYmxlKG9mZnNldCkgKQorCQkJCQkJCTw8ICJcblx0JDAgPSAiIDw8ICgqaXRSZWYpLnN0cigpCisJCQkJCQkJPDwgIlxuXHQkMSA9ICIgPDwgKCppdEZpcnN0KS5zdHIoKQorCQkJCQkJCTw8ICJcblx0JDIgPSAiIDw8ICgqaXRTbmQpLnN0cigpCisJCQkJCQkJPDwgU0VORF9BTEVSVDsKKworCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8vIEF2bUNvbmN1cnJlbmN5U3RhdGVtZW50IEZhaWxlZAorCQkJCQlBVk1fT1NfRVJST1JfQUxFUlQKKwkJCQkJCQk8PCAiUnVudGltZTwgIiA8PCBhUkYuZ2V0UklEKCkuc3RyKCkKKwkJCQkJCQk8PCAiPiA6PiBmdXNpb24gb2YgRGF0YSBUYWJsZSBFbGVtZW50IEZBSUxFRCA6ICIKKwkJCQkJCQkJIihpdEZpcnN0RGF0YSAhPSBpdFNuZERhdGEpIDoiCisJCQkJCQkJPDwgIlxuXHQiIDw8IHN0cl9oZWFkZXIoIGFSRi5yYXdWYXJpYWJsZShvZmZzZXQpICkKKwkJCQkJCQk8PCAiXG5cdCQwID0gIiA8PCAoKml0UmVmKS5zdHIoKQorCQkJCQkJCTw8ICJcblx0JDEgPSAiIDw8ICgqaXRGaXJzdCkuc3RyKCkKKwkJCQkJCQk8PCAiXG5cdCQyID0gIiA8PCAoKml0U25kKS5zdHIoKQorCQkJCQkJCTw8IFNFTkRfQUxFUlQ7CisKKwkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCX0KKworLy8JCQkJaWYoICgqaXRSZWYpLmlzPCBCdWlsdGluUXVldWUgPigpICkKKy8vCQkJCXsKKy8vCQkJCQlBVk1fT1NfVFJBQ0UKKy8vCQkJCQkJCTw8ICJSdW50aW1lPCAiIDw8IGFSRi5nZXRSSUQoKS5zdHIoKQorLy8JCQkJCQkJPDwgIiAsICIgPDwgc3RyX2hlYWRlciggYVJGLmdldFZhcmlhYmxlKG9mZnNldCkgKQorLy8JCQkJCQkJPDwgIiA+IDo+ICIgPDwgc3RkOjplbmRsCisvLwkJCQkJCQk8PCAiXG5cdCQwID0gIiA8PCAoKml0UmVmKS5zdHIoKQorLy8JCQkJCQkJPDwgIlxuXHQkMSA9ICIgPDwgKCppdEZpcnN0KS5zdHIoKQorLy8JCQkJCQkJPDwgIlxuXHQkMiA9ICIgPDwgKCppdFNuZCkuc3RyKCkKKy8vCQkJCQkJCTw8ICJcblx0JCQgPSAiIDw8IGFEYXRhVGFibGUtPmF0KG9mZnNldCkuc3RyKCkKKy8vCQkJCQkJCTw8IHN0ZDo6ZW5kbDsKKy8vCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIEF2bUNvbmN1cnJlbmN5U3RhdGVtZW50IEZhaWxlZAorCQkJQVZNX09TX0VSUk9SX0FMRVJUCisJCQkJCTw8ICJSdW50aW1lPCAiIDw8IGFSRi5nZXRSSUQoKS5zdHIoKQorCQkJCQk8PCAiPiA6PiBmdXNpb24gb2YgRGF0YSBUYWJsZSBTaXplIEZBSUxFRCA6ICIKKwkJCQkJCSIoKHJlZkRhdGFUYWJsZS0+c2l6ZSgpID09IGZpcnN0RGF0YVRhYmxlLT5zaXplKCkpICYmICIKKwkJCQkJCSIocmVmRGF0YVRhYmxlLT5zaXplKCkgPT0gc25kRGF0YVRhYmxlLT5zaXplKCkpKSA6XG4iCisJCQkJCTw8IHJlZkRhdGFUYWJsZS0+dG9TdHJpbmcoYVJGLmdldFZhcmlhYmxlcygpLCBBVk1fVEFCMV9JTkRFTlQpCisJCQkJCTw8IGZpcnN0RGF0YVRhYmxlLT50b1N0cmluZyhhUkYuZ2V0VmFyaWFibGVzKCksIEFWTV9UQUIxX0lOREVOVCkKKwkJCQkJPDwgc25kRGF0YVRhYmxlLT50b1N0cmluZyhhUkYuZ2V0VmFyaWFibGVzKCksIEFWTV9UQUIxX0lOREVOVCkKKwkJCQkJPDwgU0VORF9BTEVSVDsKKworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorCWVsc2UgaWYoIHJlZkRhdGFUYWJsZS52YWxpZCgpICkKKwl7CisJCS8vIEF2bUNvbmN1cnJlbmN5U3RhdGVtZW50IEZhaWxlZAorCQlBVk1fT1NfRVJST1JfQUxFUlQKKwkJCQk8PCAiUnVudGltZTwgIiA8PCBhUkYuZ2V0UklEKCkuc3RyKCkKKwkJCQk8PCAiPiA6PiBmdXNpb24gb2YgRGF0YSBUYWJsZSBGQUlMRUQgOiAocmVmRGF0YVRhYmxlICE9IE5VTEwpICIKKwkJCQkJIiYmICgoZmlyc3REYXRhVGFibGUgPT0gTlVMTCkgfHwgKHNuZERhdGFUYWJsZSA9PSBOVUxMKSkgOlxuIgorCQkJCTw8IHJlZkRhdGFUYWJsZS0+dG9TdHJpbmcoYVJGLmdldFZhcmlhYmxlcygpLCBBVk1fVEFCMV9JTkRFTlQpCisJCQkJPDwgZmlyc3REYXRhVGFibGUtPnRvU3RyaW5nKGFSRi5nZXRWYXJpYWJsZXMoKSwgQVZNX1RBQjFfSU5ERU5UKQorCQkJCTw8IHNuZERhdGFUYWJsZS0+dG9TdHJpbmcoYVJGLmdldFZhcmlhYmxlcygpLCBBVk1fVEFCMV9JTkRFTlQpCisJCQkJPDwgU0VORF9BTEVSVDsKKworCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCitCRiBBdm1TeW5jaHJvbml6YXRpb25GYWN0b3J5OjpmdXNpb25BcnJheURhdGEoY29uc3QgUnVudGltZUZvcm0gJiBhUkYsCisJCUFycmF5QkYgKiByZWZBcnJheSwgQXJyYXlCRiAqIGZpcnN0QXJyYXksIEFycmF5QkYgKiBzbmRBcnJheSkKK3sKKwlBcnJheUJGICogc3luY0FycmF5ID0KKwkJCW5ldyBBcnJheUJGKHJlZkFycmF5LT5nZXRUeXBlU3BlY2lmaWVyKCksIHJlZkFycmF5LT5zaXplKCkpOworCUJGIGJmQXJyYXkoIHN5bmNBcnJheSApOworCisJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDAgOyBvZmZzZXQgPCBzeW5jQXJyYXktPnNpemUoKSA7ICsrb2Zmc2V0ICkKKwl7CisJCS8vPz8/IFRBQkxFQVVYCisJCWlmKCByZWZBcnJheS0+YXQob2Zmc2V0KSA9PSBmaXJzdEFycmF5LT5hdChvZmZzZXQpICkKKwkJeworCQkJc3luY0FycmF5LT5zZXQoIG9mZnNldCAsIHNuZEFycmF5LT5hdChvZmZzZXQpICk7CisJCX0KKwkJZWxzZSBpZiggcmVmQXJyYXktPmF0KG9mZnNldCkgPT0gc25kQXJyYXktPmF0KG9mZnNldCkgKQorCQl7CisJCQlzeW5jQXJyYXktPnNldCggb2Zmc2V0ICwgZmlyc3RBcnJheS0+YXQob2Zmc2V0KSApOworCQl9CisJCS8vIFRPRE8gRXF1YWxpdHkgYmV0d2VlbiBFbGVtZW50CisJCWVsc2UgaWYoIGZpcnN0QXJyYXktPmF0KG9mZnNldCkgPT0gc25kQXJyYXktPmF0KG9mZnNldCkgKQorCQl7CisJCQlzeW5jQXJyYXktPnNldCggb2Zmc2V0ICwgZmlyc3RBcnJheS0+YXQob2Zmc2V0KSApOworCQl9CisJCWVsc2UgaWYoIHJlZkFycmF5LT5hdChvZmZzZXQpLmlzPCBBcnJheUJGID4oKSAmJgorCQkJCWZpcnN0QXJyYXktPmF0KG9mZnNldCkuaXM8IEFycmF5QkYgPigpICYmCisJCQkJc25kQXJyYXktPmF0KG9mZnNldCkuaXM8IEFycmF5QkYgPigpICkKKwkJeworCQkJQkYgc3luY1ZhbHVlID0gZnVzaW9uQXJyYXlEYXRhKGFSRiwKKwkJCQkJcmVmQXJyYXktPmF0KG9mZnNldCkudG9fcHRyPCBBcnJheUJGID4oKSwKKwkJCQkJZmlyc3RBcnJheS0+YXQob2Zmc2V0KS50b19wdHI8IEFycmF5QkYgPigpLAorCQkJCQlzbmRBcnJheS0+YXQob2Zmc2V0KS50b19wdHI8IEFycmF5QkYgPigpICk7CisKKwkJCWlmKCBzeW5jVmFsdWUudmFsaWQoKSApCisJCQl7CisJCQkJc3luY0FycmF5LT5zZXQoIG9mZnNldCAsIHN5bmNWYWx1ZSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIEF2bUNvbmN1cnJlbmN5U3RhdGVtZW50IEZhaWxlZAorCQkJCUFWTV9PU19FUlJPUl9BTEVSVAorCQkJCQkJPDwgIlJ1bnRpbWU8ICIgPDwgYVJGLmdldFJJRCgpLnN0cigpCisJCQkJCQk8PCAiPiA6PiBmdXNpb24gb2YgRGF0YSBUYWJsZSBBUlJBWSBFbGVtZW50IEZBSUxFRCA6ICIKKwkJCQkJCQkiKGl0Rmlyc3REYXRhWy4uLl0gIT0gaXRTbmREYXRhWy4uLl0pIDoiCisJCQkJCQk8PCAiXG5cdCQwID0gIiA8PCByZWZBcnJheS0+YXQob2Zmc2V0KS5zdHIoKQorCQkJCQkJPDwgIlxuXHQkMSA9ICIgPDwgZmlyc3RBcnJheS0+YXQob2Zmc2V0KS5zdHIoKQorCQkJCQkJPDwgIlxuXHQkMiA9ICIgPDwgc25kQXJyYXktPmF0KG9mZnNldCkuc3RyKCkKKwkJCQkJCTw8IFNFTkRfQUxFUlQ7CisKKwkJCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCQkJfQorCQl9CisvLwkJZWxzZSBpZiggYVJGLmdldFZhcmlhYmxlKGkpLT4KKy8vCQkJCWdldFR5cGVTcGVjaWZpZXIoKS0+aXNUeXBlZENvbXBvc2l0ZSgpICkKKy8vCQl7CisvLwkJCS8vIEF2bUNvbmN1cnJlbmN5U3RhdGVtZW50IEZhaWxlZAorLy8JCQlBVk1fT1NfV0FSTklOR19BTEVSVAorLy8JCQkJCTw8ICJSdW50aW1lPCAiIDw8IGFSRi5nZXRSSUQoKS5zdHIoKQorLy8JCQkJCTw8ICI+IDo+IGZ1c2lvbiBvZiBEYXRhIFRhYmxlIEVsZW1lbnQgRkFJTEVEIDogIgorLy8JCQkJCQkiKGl0Rmlyc3REYXRhWy4uLl0gIT0gaXRTbmREYXRhWy4uLl0pIDoiCisvLwkJCQkJPDwgIlxuXHQkMCA9ICIgPDwgcmVmQXJyYXktPmF0KG9mZnNldCkuc3RyKCkKKy8vCQkJCQk8PCAiXG5cdCQxID0gIiA8PCBmaXJzdEFycmF5LT5hdChvZmZzZXQpLnN0cigpCisvLwkJCQkJPDwgIlxuXHQkMiA9ICIgPDwgc25kQXJyYXktPmF0KG9mZnNldCkuc3RyKCkKKy8vCQkJCQk8PCBTRU5EX0FMRVJUOworLy8KKy8vCQkJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKKy8vCQl9CisJCWVsc2UKKwkJeworCQkJLy8gQXZtQ29uY3VycmVuY3lTdGF0ZW1lbnQgRmFpbGVkCisJCQlBVk1fT1NfRVJST1JfQUxFUlQKKwkJCQkJPDwgIlJ1bnRpbWU8ICIgPDwgYVJGLmdldFJJRCgpLnN0cigpCisJCQkJCTw8ICI+IDo+IGZ1c2lvbiBvZiBEYXRhIFRhYmxlIEVsZW1lbnQgRkFJTEVEIDogIgorCQkJCQkJIihpdEZpcnN0RGF0YVsuLi5dICE9IGl0U25kRGF0YVsuLi5dKSA6IgorCQkJCQk8PCAiXG5cdCQwID0gIiA8PCByZWZBcnJheS0+YXQob2Zmc2V0KS5zdHIoKQorCQkJCQk8PCAiXG5cdCQxID0gIiA8PCBmaXJzdEFycmF5LT5hdChvZmZzZXQpLnN0cigpCisJCQkJCTw8ICJcblx0JDIgPSAiIDw8IHNuZEFycmF5LT5hdChvZmZzZXQpLnN0cigpCisJCQkJCTw8IFNFTkRfQUxFUlQ7CisKKwkJCXJldHVybiggQkY6OlJFRl9OVUxMICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIGJmQXJyYXkgKTsKK30KKworCitib29sIEF2bVN5bmNocm9uaXphdGlvbkZhY3Rvcnk6OmZ1c2lvbihSdW50aW1lRm9ybSAmIGFSRiwKKwkJY29uc3QgVGFibGVPZkJ1ZmZlclQgJiByZWZCdWZmZXJUYWJsZSwKKwkJY29uc3QgVGFibGVPZkJ1ZmZlclQgJiBmaXJzdEJ1ZmZlclRhYmxlLAorCQljb25zdCBUYWJsZU9mQnVmZmVyVCAmIHNuZEJ1ZmZlclRhYmxlKQoreworCS8vIGZ1c2lvbiBvZiBCVUZGRVIKKwlpZiggZmlyc3RCdWZmZXJUYWJsZS52YWxpZCgpICYmIHNuZEJ1ZmZlclRhYmxlLnZhbGlkKCkgKQorCXsKKwkJaWYoIGZpcnN0QnVmZmVyVGFibGUgPT0gc25kQnVmZmVyVGFibGUgKQorCQl7CisJCQlhUkYuc2V0QnVmZmVyVGFibGUoIGZpcnN0QnVmZmVyVGFibGUgKTsKKwkJfQorCQllbHNlIGlmKCByZWZCdWZmZXJUYWJsZSA9PSBmaXJzdEJ1ZmZlclRhYmxlICkKKwkJeworCQkJYVJGLnNldEJ1ZmZlclRhYmxlKCBzbmRCdWZmZXJUYWJsZSApOworCQl9CisJCWVsc2UgaWYoIHJlZkJ1ZmZlclRhYmxlID09IHNuZEJ1ZmZlclRhYmxlICkKKwkJeworCQkJYVJGLnNldEJ1ZmZlclRhYmxlKCBmaXJzdEJ1ZmZlclRhYmxlICk7CisJCX0KKwkJZWxzZSBpZiggKHJlZkJ1ZmZlclRhYmxlLnNpemUoKSA9PSBmaXJzdEJ1ZmZlclRhYmxlLnNpemUoKSkgJiYKKwkJCQkocmVmQnVmZmVyVGFibGUuc2l6ZSgpID09IHNuZEJ1ZmZlclRhYmxlLnNpemUoKSkgKQorCQl7CisJCQkvLyBDb21wYXJpc29uIGJldHdlZW4gYWxsIGRhdGEKKwkJCVRhYmxlT2ZCdWZmZXJUIGFCdWZmZXJUYWJsZSggcmVmQnVmZmVyVGFibGUuc2l6ZSgpICk7CisKKwkJCVRhYmxlT2ZCdWZmZXJUOjpjb25zdF9pdGVyYXRvciBpdFJlZiA9IHJlZkJ1ZmZlclRhYmxlLmJlZ2luKCk7CisJCQlUYWJsZU9mQnVmZmVyVDo6Y29uc3RfaXRlcmF0b3IgaXRSZWZFbmQgPSByZWZCdWZmZXJUYWJsZS5lbmQoKTsKKwkJCVRhYmxlT2ZCdWZmZXJUOjpjb25zdF9pdGVyYXRvciBpdEZpcnN0ID0gZmlyc3RCdWZmZXJUYWJsZS5iZWdpbigpOworCQkJVGFibGVPZkJ1ZmZlclQ6OmNvbnN0X2l0ZXJhdG9yIGl0U25kID0gc25kQnVmZmVyVGFibGUuYmVnaW4oKTsKKworCQkJYXZtX3NpemVfdCBvZmZzZXQgPSAwOworCQkJZm9yKCA7IGl0UmVmICE9IGl0UmVmRW5kIDsgKytpdFJlZiAsICsraXRGaXJzdCwgKytpdFNuZCwgKytvZmZzZXQgKQorCQkJeworCQkJCWlmKCAoKml0UmVmKS0+ZXF1YWxzKCAqKCppdEZpcnN0KSApICkKKwkJCQl7CisJCQkJCWFCdWZmZXJUYWJsZS5hc3NpZ24oIG9mZnNldCAsICgqaXRTbmQpICk7CisJCQkJfQorCQkJCWVsc2UgaWYoICgqaXRSZWYpLT5lcXVhbHMoICooKml0U25kKSApICkKKwkJCQl7CisJCQkJCWFCdWZmZXJUYWJsZS5hc3NpZ24oIG9mZnNldCAsICgqaXRGaXJzdCkgKTsKKwkJCQl9CisJCQkJZWxzZSBpZiggKCppdEZpcnN0KS0+ZXF1YWxzKCAqKCppdFNuZCkgKSApIC8vIFRPRE8gRXF1YWxpdHkgYmV0d2VlbiBCdWZmZXIKKwkJCQl7CisJCQkJCWFCdWZmZXJUYWJsZS5hc3NpZ24oIG9mZnNldCAsICgqaXRGaXJzdCkgKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJLy8gQXZtQ29uY3VycmVuY3lTdGF0ZW1lbnQgRmFpbGVkCisJCQkJCUFWTV9PU19FUlJPUl9BTEVSVAorCQkJCQkJCTw8ICJSdW50aW1lPCAiIDw8IGFSRi5nZXRSSUQoKS5zdHIoKQorCQkJCQkJCTw8ICI+IDo+IGZ1c2lvbiBvZiBCdWZmZXIgVGFibGUgRWxlbWVudCBGQUlMRUQgOiAiCisJCQkJCQkJCSIoaXRGaXJzdEJ1ZmZlciAhPSBpdFNuZEJ1ZmZlcikgOlxuIgorCQkJCQkJCTw8ICgqaXRSZWYpLT50b1N0cmluZyhBVk1fVEFCMV9JTkRFTlQpCisJCQkJCQkJPDwgKCppdEZpcnN0KS0+dG9TdHJpbmcoQVZNX1RBQjFfSU5ERU5UKQorCQkJCQkJCTw8ICgqaXRTbmQpLT50b1N0cmluZyhBVk1fVEFCMV9JTkRFTlQpCisJCQkJCQkJPDwgU0VORF9BTEVSVDsKKworCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJfQorCQkJfQorCQkJYVJGLnNldEJ1ZmZlclRhYmxlKCBhQnVmZmVyVGFibGUgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIEF2bUNvbmN1cnJlbmN5U3RhdGVtZW50IEZhaWxlZAorCQkJQVZNX09TX0VSUk9SX0FMRVJUCisJCQkJCTw8ICJSdW50aW1lPCAiIDw8IGFSRi5nZXRSSUQoKS5zdHIoKQorCQkJCQk8PCAiPiA6PiBmdXNpb24gb2YgQnVmZmVyIFRhYmxlIFNpemUgRkFJTEVEIDogIgorCQkJCQkiKChyZWZCdWZmZXJUYWJsZS0+c2l6ZSgpID09IGZpcnN0QnVmZmVyVGFibGUtPnNpemUoKSkgJiYgIgorCQkJCQkiKHJlZkJ1ZmZlclRhYmxlLT5zaXplKCkgPT0gc25kQnVmZmVyVGFibGUtPnNpemUoKSkpIDpcbiIKKwkJCQkJPDwgcmVmQnVmZmVyVGFibGUudG9TdHJpbmcoQVZNX1RBQjFfSU5ERU5UKQorCQkJCQk8PCBmaXJzdEJ1ZmZlclRhYmxlLnRvU3RyaW5nKEFWTV9UQUIxX0lOREVOVCkKKwkJCQkJPDwgc25kQnVmZmVyVGFibGUudG9TdHJpbmcoQVZNX1RBQjFfSU5ERU5UKQorCQkJCQk8PCBTRU5EX0FMRVJUOworCisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKwl9CisJZWxzZSBpZiggcmVmQnVmZmVyVGFibGUudmFsaWQoKSApCisJeworCQkvLyBBdm1Db25jdXJyZW5jeVN0YXRlbWVudCBGYWlsZWQKKwkJQVZNX09TX0VSUk9SX0FMRVJUCisJCQkJPDwgIlJ1bnRpbWU8ICIgPDwgYVJGLmdldFJJRCgpLnN0cigpCisJCQkJPDwgIj4gOj4gZnVzaW9uIG9mIEJ1ZmZlciBUYWJsZSBGQUlMRUQgOiAocmVmQnVmZmVyVGFibGUgIT0gTlVMTCkgIgorCQkJCSImJiAoKGZpcnN0QnVmZmVyVGFibGUgPT0gTlVMTCkgfHwgKHNuZEJ1ZmZlclRhYmxlID09IE5VTEwpKSA6XG4iCisJCQkJPDwgcmVmQnVmZmVyVGFibGUudG9TdHJpbmcoQVZNX1RBQjFfSU5ERU5UKQorCQkJCTw8IGZpcnN0QnVmZmVyVGFibGUudG9TdHJpbmcoQVZNX1RBQjFfSU5ERU5UKQorCQkJCTw8IHNuZEJ1ZmZlclRhYmxlLnRvU3RyaW5nKEFWTV9UQUIxX0lOREVOVCkKKwkJCQk8PCBTRU5EX0FMRVJUOworCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvLyBUT0RPIGZ1c2lvbiBST1VURVIKK2Jvb2wgQXZtU3luY2hyb25pemF0aW9uRmFjdG9yeTo6ZnVzaW9uKFJ1bnRpbWVGb3JtICYgYVJGLAorCQljb25zdCBSb3V0ZXIgJiByZWZSb3V0ZXIsCisJCWNvbnN0IFJvdXRlciAmIGZpcnN0Um91dGVyLAorCQljb25zdCBSb3V0ZXIgJiBzbmRSb3V0ZXIpCit7CisJLy8gZnVzaW9uIG9mIEJVRkZFUgorCWlmKCBmaXJzdFJvdXRlci52YWxpZCgpICYmIHNuZFJvdXRlci52YWxpZCgpICkKKwl7CisJCWlmKCBmaXJzdFJvdXRlciA9PSBzbmRSb3V0ZXIgKQorCQl7CisJCQlhUkYuc2V0Um91dGVyKCBmaXJzdFJvdXRlciApOworCQl9CisJCWVsc2UgaWYoIHJlZlJvdXRlciA9PSBmaXJzdFJvdXRlciApCisJCXsKKwkJCWFSRi5zZXRSb3V0ZXIoIHNuZFJvdXRlciApOworCQl9CisJCWVsc2UgaWYoIHJlZlJvdXRlciA9PSBzbmRSb3V0ZXIgKQorCQl7CisJCQlhUkYuc2V0Um91dGVyKCBmaXJzdFJvdXRlciApOworCQl9CisJCWVsc2UKKwkJeworCQkJYVJGLnNldFJvdXRlciggcmVmUm91dGVyICk7CisJCX0KKwl9CisJZWxzZSBpZiggcmVmUm91dGVyLnZhbGlkKCkgKQorCXsKKwkJLy8gQXZtQ29uY3VycmVuY3lTdGF0ZW1lbnQgRmFpbGVkCisJCUFWTV9PU19FUlJPUl9BTEVSVAorCQkJCTw8ICJSdW50aW1lPCAiIDw8IGFSRi5nZXRSSUQoKS5zdHIoKQorCQkJCTw8ICI+IDo+IGZ1c2lvbiBvZiBSb3V0ZXIgRkFJTEVEIDogKHJlZlJvdXRlciAhPSBOVUxMKSAmJiAiCisJCQkJIigoZmlyc3RSb3V0ZXIgPT0gTlVMTCkgfHwgKHNuZFJvdXRlciA9PSBOVUxMKSkgOlxuIgorCQkJCTw8IHJlZlJvdXRlci50b1N0cmluZyhBVk1fVEFCMV9JTkRFTlQpCisJCQkJPDwgZmlyc3RSb3V0ZXIudG9TdHJpbmcoQVZNX1RBQjFfSU5ERU5UKQorCQkJCTw8IHNuZFJvdXRlci50b1N0cmluZyhBVk1fVEFCMV9JTkRFTlQpCisJCQkJPDwgU0VORF9BTEVSVDsKKworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworCisKKworCitCRiBBdm1TeW5jaHJvbml6YXRpb25GYWN0b3J5OjpzeW5jQkYoT3BlcmF0b3IgKiBidWlsZE9wLAorCQljb25zdCBCRiAmIHJlZkJGLCBjb25zdCBCRiAmIGZyc3RCRiwgY29uc3QgQkYgJiBzbmRCRikKK3sKKwlpZiggcmVmQkYuaW52YWxpZCgpICkKKwl7CisJCUJGQ29kZSBidWlsZENvZGUoYnVpbGRPcCwgZnJzdEJGLCBzbmRCRik7CisKKwkJcmV0dXJuKCBBdm1Db2RlRmFjdG9yeTo6ZmxhdHRlbkNvZGUoIGJ1aWxkQ29kZSApICk7CisJfQorCWVsc2UgaWYoIGZyc3RCRi5pc1RFUShzbmRCRikgfHwgcmVmQkYuaXNURVEoc25kQkYpICkKKwl7CisJCXJldHVybiggZnJzdEJGICk7CisJfQorCisJaWYoIHJlZkJGLmlzVEVRKGZyc3RCRikgKQorCXsKKwkJcmV0dXJuKCBzbmRCRiApOworCX0KKworCWVsc2UgaWYoIGZyc3RCRi5pczwgQXZtQ29kZSA+KCkgJiYgc25kQkYuaXM8IEF2bUNvZGUgPigpICYmCisJCQkoZnJzdEJGLnRvX3B0cjwgQXZtQ29kZSA+KCktPmdldE9wZXJhdG9yKCkgPT0KKwkJCQkJc25kQkYudG9fcHRyPCBBdm1Db2RlID4oKS0+Z2V0T3BlcmF0b3IoKSkgKQorCXsKKwkJQXZtQ29kZSAqIGZyc3RDb2RlID0gZnJzdEJGLnRvX3B0cjwgQXZtQ29kZSA+KCk7CisJCUF2bUNvZGUgKiBzbmRDb2RlICA9IHNuZEJGLnRvX3B0cjwgQXZtQ29kZSA+KCk7CisKKwkJYXZtX3NpemVfdCBmcnN0U2l6ZSA9IGZyc3RDb2RlLT5zaXplKCk7CisJCWF2bV9zaXplX3Qgc25kU2l6ZSAgPSBzbmRDb2RlLT5zaXplKCk7CisKKworCQlpZiggcmVmQkYudmFsaWQoKSAmJiByZWZCRi5pc0VRKGZyc3RDb2RlLT5maXJzdCgpKSAmJgorCQkJCXJlZkJGLmlzRVEoc25kQ29kZS0+Zmlyc3QoKSkgKQorCQl7CisJCQlCRkNvZGUgbmV3Q29kZShidWlsZE9wKTsKKwkJCUJGQ29kZSBidWlsZENvZGUoZnJzdENvZGUtPmdldE9wZXJhdG9yKCksIHJlZkJGLCBuZXdDb2RlKTsKKworCQkJaWYoIGZyc3RTaXplID09IDIgKQorCQkJeworCQkJCW5ld0NvZGUtPmFwcGVuZCggZnJzdENvZGUtPnNlY29uZCgpICk7CisJCQl9CisJCQllbHNlIGlmKCBmcnN0U2l6ZSA+IDIgKQorCQkJeworCQkJCUJGQ29kZSByZXN0Q29kZShmcnN0Q29kZS0+Z2V0T3BlcmF0b3IoKSk7CisKKwkJCQlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMSA7IG9mZnNldCA8IGZyc3RTaXplIDsgKytvZmZzZXQgKQorCQkJCXsKKwkJCQkJcmVzdENvZGUtPmFwcGVuZCggZnJzdENvZGUtPmF0KG9mZnNldCkgKTsKKwkJCQl9CisKKwkJCQluZXdDb2RlLT5hcHBlbmQoIHJlc3RDb2RlICk7CisJCQl9CisKKwkJCWlmKCBzbmRTaXplID09IDIgKQorCQkJeworCQkJCW5ld0NvZGUtPmFwcGVuZCggc25kQ29kZS0+c2Vjb25kKCkgKTsKKwkJCX0KKwkJCWVsc2UgaWYoIHNuZFNpemUgPiAyICkKKwkJCXsKKwkJCQlCRkNvZGUgcmVzdENvZGUoc25kQ29kZS0+Z2V0T3BlcmF0b3IoKSk7CisKKwkJCQlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMSA7IG9mZnNldCA8IHNuZFNpemUgOyArK29mZnNldCApCisJCQkJeworCQkJCQlyZXN0Q29kZS0+YXBwZW5kKCBzbmRDb2RlLT5hdChvZmZzZXQpICk7CisJCQkJfQorCisJCQkJbmV3Q29kZS0+YXBwZW5kKCByZXN0Q29kZSApOworCQkJfQorCisvL0FWTV9PU19ERUJVRyA8PCAic3luYzo+ICIgPDwgQXZtQ29kZUZhY3Rvcnk6OmZsYXR0ZW5Db2RlKCBidWlsZENvZGUgKS5zdHIoIiAiKQorLy8JCQk8PCBzdGQ6OmVuZGw7CisKKwkJCXJldHVybiggQXZtQ29kZUZhY3Rvcnk6OmZsYXR0ZW5Db2RlKCBidWlsZENvZGUgKSApOworCQl9CisJCWVsc2UgaWYoIHJlZkJGLmlzPCBBdm1Db2RlID4oKSApCisJCXsKKwkJCWNvbnN0IEJGQ29kZSAmIHJlZkNvZGUgID0gcmVmQkYuYmZDb2RlKCk7CisKKwkJCWlmKCByZWZDb2RlLT5nZXRPcGVyYXRvcigpID09IHNuZENvZGUtPmdldE9wZXJhdG9yKCkgKQorCQkJeworCQkJCWF2bV9zaXplX3QgcmVmU2l6ZSA9IHJlZkNvZGUtPnNpemUoKTsKKworCQkJCUJGQ29kZSBidWlsZENvZGUoIHJlZkNvZGUtPmdldE9wZXJhdG9yKCkgKTsKKworCQkJCWF2bV9zaXplX3QgayA9IDA7CisJCQkJZm9yKCA7IChrIDwgcmVmU2l6ZSkgJiYgKGsgPCBmcnN0U2l6ZSkgJiYgKGsgPCBzbmRTaXplKSA7ICsrayApCisJCQkJeworCQkJCQlpZiggZnJzdENvZGUtPmF0KGspLmlzRVEoc25kQ29kZS0+YXQoaykpICYmCisJCQkJCQkJcmVmQ29kZS0+YXQoaykuaXNFUShzbmRDb2RlLT5hdChrKSkpCisJCQkJCXsKKwkJCQkJCWJ1aWxkQ29kZS0+YXBwZW5kKCByZWZDb2RlLT5hdChrKSApOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlCRkNvZGUgbmV3Q29kZShidWlsZE9wKTsKKwkJCQlidWlsZENvZGUuYXBwZW5kKCBuZXdDb2RlICk7CisKKwkJCQlpZiggZnJzdFNpemUgPT0gKGsgKyAxKSApCisJCQkJeworCQkJCQluZXdDb2RlLT5hcHBlbmQoIGZyc3RDb2RlLT5sYXN0KCkgKTsKKwkJCQl9CisJCQkJZWxzZSBpZiggZnJzdFNpemUgIT0gayApCisJCQkJeworCQkJCQlCRkNvZGUgcmVzdENvZGUoZnJzdENvZGUtPmdldE9wZXJhdG9yKCkpOworCisJCQkJCWZvciggYXZtX3NpemVfdCBpZHggPSBrIDsgaWR4IDwgZnJzdFNpemUgOyArK2lkeCApCisJCQkJCXsKKwkJCQkJCXJlc3RDb2RlLT5hcHBlbmQoIGZyc3RDb2RlLT5hdChpZHgpICk7CisJCQkJCX0KKworCQkJCQluZXdDb2RlLT5hcHBlbmQoIHJlc3RDb2RlICk7CisJCQkJfQorCisJCQkJaWYoIHNuZFNpemUgPT0gKGsgKyAxKSApCisJCQkJeworCQkJCQluZXdDb2RlLT5hcHBlbmQoIHNuZENvZGUtPmxhc3QoKSApOworCQkJCX0KKwkJCQllbHNlIGlmKCBzbmRTaXplICE9IGsgKQorCQkJCXsKKwkJCQkJQkZDb2RlIHJlc3RDb2RlKHNuZENvZGUtPmdldE9wZXJhdG9yKCkpOworCisJCQkJCWZvciggYXZtX3NpemVfdCBpZHggPSBrIDsgaWR4IDwgc25kU2l6ZSA7ICsraWR4ICkKKwkJCQkJeworCQkJCQkJcmVzdENvZGUtPmFwcGVuZCggc25kQ29kZS0+YXQoaWR4KSApOworCQkJCQl9CisKKwkJCQkJbmV3Q29kZS0+YXBwZW5kKCByZXN0Q29kZSApOworCQkJCX0KKworLy9BVk1fT1NfREVCVUcgPDwgInN5bmM6PiAiIDw8IEF2bUNvZGVGYWN0b3J5OjpmbGF0dGVuQ29kZSggYnVpbGRDb2RlICkuc3RyKCIgIikKKy8vCQk8PCBzdGQ6OmVuZGw7CisKKwkJCQlyZXR1cm4oIEF2bUNvZGVGYWN0b3J5OjpmbGF0dGVuQ29kZSggYnVpbGRDb2RlICkgKTsKKwkJCX0KKwkJfQorCisJCWlmKCBmcnN0Q29kZS0+Zmlyc3QoKS5pc0VRKHNuZENvZGUtPmZpcnN0KCkpICkKKwkJeworCQkJQkZDb2RlIGJ1aWxkQ29kZShmcnN0Q29kZS0+Z2V0T3BlcmF0b3IoKSwKKwkJCQkJZnJzdENvZGUtPmZpcnN0KCkpOworCisJCQlhdm1fc2l6ZV90IGsgPSAxOworCQkJZm9yKCA7IChrIDwgZnJzdFNpemUpICYmIChrIDwgc25kU2l6ZSkgJiYKKwkJCQkJZnJzdENvZGUtPmF0KGspLmlzRVEoc25kQ29kZS0+YXQoaykpIDsgKytrICkKKwkJCXsKKwkJCQlidWlsZENvZGUtPmFwcGVuZCggZnJzdENvZGUtPmF0KGspICk7CisJCQl9CisKKwkJCUJGQ29kZSBuZXdDb2RlKGJ1aWxkT3ApOworCQkJYnVpbGRDb2RlLT5hcHBlbmQoIG5ld0NvZGUgKTsKKworCQkJaWYoIGZyc3RTaXplID09IChrICsgMSkgKQorCQkJeworCQkJCW5ld0NvZGUtPmFwcGVuZCggZnJzdENvZGUtPmxhc3QoKSApOworCQkJfQorCQkJZWxzZSBpZiggZnJzdFNpemUgIT0gayApCisJCQl7CisJCQkJQkZDb2RlIHJlc3RDb2RlKGZyc3RDb2RlLT5nZXRPcGVyYXRvcigpKTsKKworCQkJCWZvciggYXZtX3NpemVfdCBpZHggPSBrIDsgaWR4IDwgZnJzdFNpemUgOyArK2lkeCApCisJCQkJeworCQkJCQlyZXN0Q29kZS0+YXBwZW5kKCBmcnN0Q29kZS0+YXQoaWR4KSApOworCQkJCX0KKworCQkJCW5ld0NvZGUtPmFwcGVuZCggcmVzdENvZGUgKTsKKwkJCX0KKworCQkJaWYoIHNuZFNpemUgPT0gKGsgKyAxKSApCisJCQl7CisJCQkJbmV3Q29kZS0+YXBwZW5kKCBzbmRDb2RlLT5sYXN0KCkgKTsKKwkJCX0KKwkJCWVsc2UgaWYoIHNuZFNpemUgIT0gayApCisJCQl7CisJCQkJQkZDb2RlIHJlc3RDb2RlKHNuZENvZGUtPmdldE9wZXJhdG9yKCkpOworCisJCQkJZm9yKCBhdm1fc2l6ZV90IGlkeCA9IGsgOyBpZHggPCBzbmRTaXplIDsgKytpZHggKQorCQkJCXsKKwkJCQkJcmVzdENvZGUtPmFwcGVuZCggc25kQ29kZS0+YXQoaWR4KSApOworCQkJCX0KKworCQkJCW5ld0NvZGUtPmFwcGVuZCggcmVzdENvZGUgKTsKKwkJCX0KKworCQkJcmV0dXJuKCBBdm1Db2RlRmFjdG9yeTo6ZmxhdHRlbkNvZGUoIGJ1aWxkQ29kZSApICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIEF2bUNvZGVGYWN0b3J5OjpmbGF0dGVuQ29kZSggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQlidWlsZE9wLCBmcnN0QkYsIHNuZEJGKSApICk7Cit9CisKKworCisKK0JGIEF2bVN5bmNocm9uaXphdGlvbkZhY3Rvcnk6OmJ1aWxkUnVubmFibGVFbGVtZW50VHJhY2UoCisJCU9wZXJhdG9yICogYnVpbGRPcCwgY29uc3QgQkYgJiByZWZSdW5uYWJsZUVsZW1lbnRUcmFjZSwKKwkJY29uc3QgQkYgJiBmcnN0UnVubmFibGVFbGVtZW50VHJhY2UsIGNvbnN0IEJGICYgc25kUnVubmFibGVFbGVtZW50VHJhY2UpCit7CisJcmV0dXJuKCBzeW5jQkYoYnVpbGRPcCwgcmVmUnVubmFibGVFbGVtZW50VHJhY2UsCisJCQlmcnN0UnVubmFibGVFbGVtZW50VHJhY2UsIHNuZFJ1bm5hYmxlRWxlbWVudFRyYWNlKSApOworfQorCitCRiBBdm1TeW5jaHJvbml6YXRpb25GYWN0b3J5OjpidWlsZElPRWxlbWVudFRyYWNlKAorCQlPcGVyYXRvciAqIGJ1aWxkT3AsIGNvbnN0IEJGICYgcmVmSU9FbGVtZW50VHJhY2UsCisJCWNvbnN0IEJGICYgZnJzdElPRWxlbWVudFRyYWNlLCBjb25zdCBCRiAmIHNuZElPRWxlbWVudFRyYWNlKQoreworCXJldHVybiggc3luY0JGKGJ1aWxkT3AsIHJlZklPRWxlbWVudFRyYWNlLAorCQkJZnJzdElPRWxlbWVudFRyYWNlLCBzbmRJT0VsZW1lbnRUcmFjZSkgKTsKK30KKworCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1TeW5jaHJvbml6YXRpb25GYWN0b3J5LmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtU3luY2hyb25pemF0aW9uRmFjdG9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMTI2MWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQXZtU3luY2hyb25pemF0aW9uRmFjdG9yeS5oCkBAIC0wLDAgKzEsMTE4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogNSBub3YuIDIwMTAKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBBVk1TWU5DSFJPTklaQVRJT05GQUNUT1JZX0hfCisjZGVmaW5lIEFWTVNZTkNIUk9OSVpBVElPTkZBQ1RPUllfSF8KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0F2bUNvZGUuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkRhdGEuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lRm9ybS5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL1RhYmxlT2ZEYXRhLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBBcnJheUJGOworY2xhc3MgQkY7CitjbGFzcyBSb3V0ZXI7CisKK2NsYXNzIE9wZXJhdG9yOworCitjbGFzcyBSdW50aW1lRm9ybTsKKworCitjbGFzcyBBdm1TeW5jaHJvbml6YXRpb25GYWN0b3J5Cit7CisKK3ByaXZhdGU6CisJQXZtU3luY2hyb25pemF0aW9uRmFjdG9yeSgpCisJeworCQkvLyBOT1RISU5HCisJfQorCisJdmlydHVhbCB+QXZtU3luY2hyb25pemF0aW9uRmFjdG9yeSgpCisJeworCQkvLyBOT1RISU5HCisJfQorCisKK3B1YmxpYzoKKwkvKgorCSAqIEZVU0lPTgorCSAqIEV4ZWN1dGlvbkRhdGEgLS0gUnVudGltZUZvcm0KKwkgKi8KKwlzdGF0aWMgQVBFeGVjdXRpb25EYXRhIGZ1c2lvbihjb25zdCBFeGVjdXRpb25EYXRhICYgYVJlZkVELAorCQkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIGZpcnN0RUQsIGNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBzbmRFRCk7CisKKwlpbmxpbmUgc3RhdGljIEFQRXhlY3V0aW9uRGF0YSBmdXNpb24oY29uc3QgQVBFeGVjdXRpb25EYXRhICYgYVJlZkVELAorCQkJY29uc3QgQVBFeGVjdXRpb25EYXRhICYgZmlyc3RFRCwgY29uc3QgQVBFeGVjdXRpb25EYXRhICYgc25kRUQpCisJeworCQlyZXR1cm4oIGZ1c2lvbiggKCogYVJlZkVEKSAsICgqIGZpcnN0RUQpICwgKCogc25kRUQpICkgKTsKKwl9CisKKwlzdGF0aWMgYm9vbCBmdXNpb24oY29uc3QgRXhlY3V0aW9uRGF0YSAmIG5ld0VELAorCQkJY29uc3QgUGFyYW1ldGVyc1J1bnRpbWVGb3JtICYgcmVmUGFyYW1zUkYsCisJCQljb25zdCBQYXJhbWV0ZXJzUnVudGltZUZvcm0gJiBmaXJzdFBhcmFtc1JGLAorCQkJY29uc3QgUGFyYW1ldGVyc1J1bnRpbWVGb3JtICYgc25kUGFyYW1zUkYpOworCisJc3RhdGljIGJvb2wgZnVzaW9uKGNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBuZXdFRCwgY29uc3QgUnVudGltZUZvcm0gJiByZWZSRiwKKwkJCWNvbnN0IFJ1bnRpbWVGb3JtICYgZmlyc3RSRiwgY29uc3QgUnVudGltZUZvcm0gJiBzbmRSRik7CisKKwlzdGF0aWMgYm9vbCBmdXNpb24oUnVudGltZUZvcm0gJiBhUkYsCisJCQljb25zdCBBUFRhYmxlT2ZEYXRhICYgcmVmRGF0YVRhYmxlLAorCQkJY29uc3QgQVBUYWJsZU9mRGF0YSAmIGZpcnN0RGF0YVRhYmxlLAorCQkJY29uc3QgQVBUYWJsZU9mRGF0YSAmIHNuZERhdGFUYWJsZSk7CisKKwlzdGF0aWMgQkYgZnVzaW9uQXJyYXlEYXRhKAorCQkJY29uc3QgUnVudGltZUZvcm0gJiBhUkYsIEFycmF5QkYgKiByZWZBcnJheSwKKwkJCUFycmF5QkYgKiBmaXJzdEFycmF5LCBBcnJheUJGICogc25kQXJyYXkpOworCisJc3RhdGljIGJvb2wgZnVzaW9uKFJ1bnRpbWVGb3JtICYgYVJGLAorCQkJY29uc3QgVGFibGVPZkJ1ZmZlclQgJiByZWZCdWZmZXJUYWJsZSwKKwkJCWNvbnN0IFRhYmxlT2ZCdWZmZXJUICYgZmlyc3RCdWZmZXJUYWJsZSwKKwkJCWNvbnN0IFRhYmxlT2ZCdWZmZXJUICYgc25kQnVmZmVyVGFibGUpOworCisJc3RhdGljIGJvb2wgZnVzaW9uKFJ1bnRpbWVGb3JtICYgYVJGLCBjb25zdCBSb3V0ZXIgJiByZWZSb3V0ZXIsCisJCQljb25zdCBSb3V0ZXIgJiBmaXJzdFJvdXRlciwgY29uc3QgUm91dGVyICYgc25kUm91dGVyKTsKKworCisKKwlzdGF0aWMgQkYgc3luY0JGKE9wZXJhdG9yICogYnVpbGRPcCwgY29uc3QgQkYgJiByZWZCRiwKKwkJCWNvbnN0IEJGICYgZnJzdEJGLCBjb25zdCBCRiAmIHNuZEJGKTsKKworCXN0YXRpYyBCRiBidWlsZFNjaGVkdWxlRm9ybSgKKwkJCU9wZXJhdG9yICogYnVpbGRPcCwgY29uc3QgQkYgJiByZWZTY2hlZHVsZUZvcm0sCisJCQljb25zdCBCRiAmIGZyc3RTY2hlZHVsZUZvcm0sIGNvbnN0IEJGICYgc25kU2NoZWR1bGVGb3JtKTsKKworCXN0YXRpYyBCRiBidWlsZFJ1bm5hYmxlRWxlbWVudFRyYWNlKE9wZXJhdG9yICogYnVpbGRPcCwKKwkJCWNvbnN0IEJGICYgcmVmUnVubmFibGVFbGVtZW50VHJhY2UsCisJCQljb25zdCBCRiAmIGZyc3RSdW5uYWJsZUVsZW1lbnRUcmFjZSwKKwkJCWNvbnN0IEJGICYgc25kUnVubmFibGVFbGVtZW50VHJhY2UpOworCisJc3RhdGljIEJGIGJ1aWxkSU9FbGVtZW50VHJhY2UoCisJCQlPcGVyYXRvciAqIGJ1aWxkT3AsIGNvbnN0IEJGICYgcmVmSU9FbGVtZW50VHJhY2UsCisJCQljb25zdCBCRiAmIGZyc3RJT0VsZW1lbnRUcmFjZSwgY29uc3QgQkYgJiBzbmRJT0VsZW1lbnRUcmFjZSk7CisKKworCisKKworfTsKKworfQorCisjZW5kaWYgLyogQVZNU1lOQ0hST05JWkFUSU9ORkFDVE9SWV9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0Jhc2VBdm1QcmltaXRpdmUuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvY29tcHV0ZXIvcHJpbWl0aXZlL0Jhc2VBdm1QcmltaXRpdmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNjg4ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQmFzZUF2bVByaW1pdGl2ZS5jcHAKQEAgLTAsMCArMSwxMzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyMCBtYWkgMjAxMAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQmFzZUF2bVByaW1pdGl2ZS5oIgorCisKKyNpbmNsdWRlIDxjb21wdXRlci9wcmltaXRpdmUvQXZtUHJpbWl0aXZlUHJvY2Vzc29yLmg+CisKKyNpbmNsdWRlIDxjb21wdXRlci9FdmFsdWF0aW9uRW52aXJvbm1lbnQuaD4KKyNpbmNsdWRlIDxjb21wdXRlci9FeGVjdXRpb25FbnZpcm9ubWVudC5oPgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkNvbnN0cnVjdG9yLmg+CisKKworCituYW1lc3BhY2Ugc2VwCit7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gUkVTVU1FCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBCYXNlQXZtUHJpbWl0aXZlOjpyZXN1bWUoRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpCit7CisJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCTw8ICJVbmltcGxlbWVudGVkIHJlc3VtZSBpbnN0cnVjdGlvbiBmb3IgOj5cbiIKKwkJCTw8IEVOVi5pbkZPUk0udG9TdHJpbmcoIEFWTV9UQUIxX0lOREVOVCApCisJCQk8PCBTRU5EX0VYSVQ7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vIEVWQUwKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIEJhc2VBdm1QcmltaXRpdmU6OnNldmFsKEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlCRkNvZGUgcmVnRVhQUiggRU5WLmluQ09ERS0+Z2V0T3BlcmF0b3IoKSApOworCisJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXRBcmcgPSBFTlYuaW5DT0RFLT5iZWdpbigpOworCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGVuZEFyZyA9IEVOVi5pbkNPREUtPmVuZCgpOworCWZvciggOyBpdEFyZyAhPSBlbmRBcmcgOyArK2l0QXJnICkKKwl7CisJCUVOVi5zZXZhbCgqaXRBcmcpOworCisJCXJlZ0VYUFItPmFwcGVuZCggRU5WLm91dFZBTCApOworCX0KKworCUVOVi5vdXRWQUwgPSByZWdFWFBSOworCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKy8qCitib29sIEJhc2VBdm1QcmltaXRpdmU6Om1ldmFsKEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOVikKK3sKKwlsb25nIGlkeCA9IDA7CisJbG9uZyBlbmRJZHggPSBFTlYub3V0RURTLnNpemUoKTsKKwlCRkNvZGVWZWN0b3IgcmVnRVhQUiggZW5kSWR4ICk7CisJZm9yKCBpZHggPSAwIDsgaWR4IDwgZW5kSWR4IDsgKytpZHggKQorCXsKKwkJcmVnRVhQUlsgaWR4IF0gPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJRU5WLmluQ09ERS0+Z2V0T3BlcmF0b3IoKSApOworCX0KKworCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0QXJnID0gRU5WLmluQ09ERS0+YmVnaW4oKTsKKwlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBlbmRBcmcgPSBFTlYuaW5DT0RFLT5lbmQoKTsKKwlmb3IoIDsgaXRBcmcgIT0gZW5kQXJnIDsgKytpdEFyZyApCisJeworCQlFTlYubWV2YWwoKml0QXJnKTsKKworCQlpZiggKGxvbmcpKEVOVi5vdXRFRFMuc2l6ZSgpKSA+IGVuZElkeCApCisJCXsKKwkJCXJlZ0VYUFIucmVzaXplKCBFTlYub3V0RURTLnNpemUoKSApOworCQkJZm9yKCBpZHggPSBFTlYub3V0RURTLnNpemUoKSAtIDEgOyBpZHggPj0gZW5kSWR4IDsgLS1pZHggKQorCQkJeworCQkJCXJlZ0VYUFJbIGlkeCBdID0gcmVnRVhQUlsgRU5WLm1PZmZzZXRzWyBpZHggXSBdLT5jbG9uZSgpOworCisJCQkJcmVnRVhQUlsgaWR4IF0tPmFwcGVuZCggRU5WLm91dENPREVTWyBpZHggXSApOworCQkJfQorCisJCQllbmRJZHggPSBFTlYub3V0RURTLnNpemUoKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlkeCA9IGVuZElkeCAtIDE7CisJCX0KKworCQlmb3IoIDsgaWR4ID49IDAgOyAtLWlkeCApCisJCXsKKwkJCXJlZ0VYUFJbIGlkeCBdLT5hcHBlbmQoIEVOVi5vdXRDT0RFU1sgaWR4IF0gKTsKKwkJfQorCX0KKworCWZvciggaWR4ID0gMCA7IGlkeCA8IGVuZElkeCA7ICsraWR4ICkKKwl7CisJCUVOVi5vdXRDT0RFU1sgaWR4IF0gPSByZWdFWFBSWyBpZHggXTsKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKyovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gRVZBTCB4IDIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIEJhc2VBdm1QcmltaXRpdmU6OnNldmFseDIoRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WKQoreworCWlmKCBCYXNlQXZtUHJpbWl0aXZlOjpzZXZhbChFTlYpICkKKwl7CisJCXJldHVybiggRU5WLnNldmFsKEVOVi5vdXRWQUwpICk7CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2NvbXB1dGVyL3ByaW1pdGl2ZS9CYXNlQXZtUHJpbWl0aXZlLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQmFzZUF2bVByaW1pdGl2ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMjIzYjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9jb21wdXRlci9wcmltaXRpdmUvQmFzZUF2bVByaW1pdGl2ZS5oCkBAIC0wLDAgKzEsMTc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjAgbWFpIDIwMTAKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBCQVNFQVZNUFJJTUlUSVZFX0hfCisjZGVmaW5lIEJBU0VBVk1QUklNSVRJVkVfSF8KKworI2luY2x1ZGUgPGNvbW1vbi9Bdm1PYmplY3QuaD4KKworI2luY2x1ZGUgPGNvbXB1dGVyL2luc3RydWN0aW9uL0luc3RydWN0aW9uRW52aXJvbm1lbnQuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworY2xhc3MgQXZtQ29kZTsKK2NsYXNzIEF2bVByaW1pdGl2ZVByb2Nlc3NvcjsKKworY2xhc3MgRXhlY3V0aW9uRGF0YTsKK2NsYXNzIEV2YWx1YXRpb25FbnZpcm9ubWVudDsKK2NsYXNzIEV4ZWN1dGlvbkVudmlyb25tZW50OworCisKKworY2xhc3MgQmFzZUF2bVByaW1pdGl2ZSAgIDogICBwdWJsaWMgQXZtT2JqZWN0Cit7CisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlCYXNlQXZtUHJpbWl0aXZlKEF2bVByaW1pdGl2ZVByb2Nlc3NvciAmIGFQcm9jZXNzb3IpCisJOiBBdm1PYmplY3QoICksCisJUFJJTUlUSVZFX1BST0NFU1NPUiggYVByb2Nlc3NvciApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+QmFzZUF2bVByaW1pdGl2ZSgpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIHRoZSBSVU4gc3RhdGVtZW50CisJICovCisKKwlpbmxpbmUgdmlydHVhbCBib29sIHJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVikKKwl7CisJCS8vISEgTk9USElORworCisJCXJldHVybiggdHJ1ZSApOworCX0KKworCisJLyoqCisJICogdGhlIFJFU1VNRSBpbnN0cnVjdGlvbgorCSAqLworCXZpcnR1YWwgYm9vbCByZXN1bWUoRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpOworCisKKwkvKioKKwkgKiB0aGUgRVZBTCBpbnN0cnVjdGlvbgorCSAqLworCXZpcnR1YWwgYm9vbCBzZXZhbChFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBFTlYpOworCisJLyoqCisJICogdGhlIEVWQUwgeCAyIGluc3RydWN0aW9uCisJICovCisJdmlydHVhbCBib29sIHNldmFseDIoRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WKTsKKworCisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBBVFRSSUJVVEVTCisJICovCisJQXZtUHJpbWl0aXZlUHJvY2Vzc29yICYgUFJJTUlUSVZFX1BST0NFU1NPUjsKKworCit9OworCisKKworCisvKioKKyAqIE1hY3JvIGZvciBzbWFydCBwcmltaXRpdmUgZGVjbGFyYXRpb24uCisgKi8KKyNkZWZpbmUgQVZNX1BSSU1JVElWRV9DTEFTU19IRUFERVIoY2xhc3NuYW1lLCBzdXBlcm5hbWUpICAgICAgICAgICAgICAgICAgICAgICBcCitjbGFzcyBjbGFzc25hbWUgOiAgcHVibGljIHN1cGVybmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3B1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJY2xhc3NuYW1lKEF2bVByaW1pdGl2ZVByb2Nlc3NvciAmIGFQcm9jZXNzb3IpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCTogc3VwZXJuYW1lKCBhUHJvY2Vzc29yICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7IC8qISEgTk9USElORyAhISovIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJdmlydHVhbCB+Y2xhc3NuYW1lKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgLyohISBOT1RISU5HICEhKi8gfQorCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vIFBSSU1JVElWRTo+IFJVTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBBVk1fUFJJTUlUSVZFX1JVTl9DTEFTU19IRUFERVIoY2xhc3NuYW1lLCBzdXBlcm5hbWUpICAgICAgICAgICAgICAgICAgIFwKK0FWTV9QUklNSVRJVkVfQ0xBU1NfSEVBREVSKEF2bVByaW1pdGl2ZV8jI2NsYXNzbmFtZSwgc3VwZXJuYW1lKSAgICAgICAgICAgICAgICBcCisJdmlydHVhbCBib29sIHJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVik7CisKKworI2RlZmluZSBBVk1fUFJJTUlUSVZFX1JVTl9DTEFTUyhjbGFzc25hbWUsIHN1cGVybmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0FWTV9QUklNSVRJVkVfUlVOX0NMQVNTX0hFQURFUihjbGFzc25hbWUsIHN1cGVybmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9OworCisKKworI2RlZmluZSBBVk1fUFJJTUlUSVZFX1JVTl9SRVNVTUVfQ0xBU1NfSEVBREVSKGNsYXNzbmFtZSwgc3VwZXJuYW1lKSAgICAgICAgICAgIFwKK0FWTV9QUklNSVRJVkVfQ0xBU1NfSEVBREVSKEF2bVByaW1pdGl2ZV8jI2NsYXNzbmFtZSwgc3VwZXJuYW1lKSAgICAgICAgICAgICAgICBcCisJdmlydHVhbCBib29sIHJ1bihFeGVjdXRpb25FbnZpcm9ubWVudCAmIEVOVik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXZpcnR1YWwgYm9vbCByZXN1bWUoRXhlY3V0aW9uRW52aXJvbm1lbnQgJiBFTlYpOworCisKKyNkZWZpbmUgQVZNX1BSSU1JVElWRV9SVU5fUkVTVU1FX0NMQVNTKGNsYXNzbmFtZSwgc3VwZXJuYW1lKSAgICAgICAgICAgICAgICAgICBcCitBVk1fUFJJTUlUSVZFX1JVTl9SRVNVTUVfQ0xBU1NfSEVBREVSKGNsYXNzbmFtZSwgc3VwZXJuYW1lKSAgICAgICAgICAgICAgICAgICAgXAorfTsKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLyBQUklNSVRJVkU6PiBTRVZBTAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBBVk1fUFJJTUlUSVZFX0VWQUxfQ0xBU1NfSEVBREVSKGNsYXNzbmFtZSwgc3VwZXJuYW1lKSAgICAgICAgICAgICAgICAgIFwKK0FWTV9QUklNSVRJVkVfQ0xBU1NfSEVBREVSKEF2bVByaW1pdGl2ZV8jI2NsYXNzbmFtZSwgc3VwZXJuYW1lKSAgICAgICAgICAgICAgICBcCisJdmlydHVhbCBib29sIHNldmFsKEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOVik7CisKKworI2RlZmluZSBBVk1fUFJJTUlUSVZFX0VWQUxfQ0xBU1MoY2xhc3NuYW1lLCBzdXBlcm5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0FWTV9QUklNSVRJVkVfRVZBTF9DTEFTU19IRUFERVIoY2xhc3NuYW1lLCBzdXBlcm5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9OworCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vIFBSSU1JVElWRTo+IFJVTiAmIFNFVkFMCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjZGVmaW5lIEFWTV9QUklNSVRJVkVfUlVOX0VWQUxfQ0xBU1NfSEVBREVSKGNsYXNzbmFtZSwgc3VwZXJuYW1lKSAgICAgICAgICAgICAgXAorQVZNX1BSSU1JVElWRV9DTEFTU19IRUFERVIoQXZtUHJpbWl0aXZlXyMjY2xhc3NuYW1lLCBzdXBlcm5hbWUpICAgICAgICAgICAgICAgIFwKKwl2aXJ0dWFsIGJvb2wgcnVuKEV4ZWN1dGlvbkVudmlyb25tZW50ICYgRU5WKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJdmlydHVhbCBib29sIHNldmFsKEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOVik7CisKKworI2RlZmluZSBBVk1fUFJJTUlUSVZFX1JVTl9FVkFMX0NMQVNTKGNsYXNzbmFtZSwgc3VwZXJuYW1lKSAgICAgICAgICAgICAgICAgICAgIFwKK0FWTV9QUklNSVRJVkVfUlVOX0VWQUxfQ0xBU1NfSEVBREVSKGNsYXNzbmFtZSwgc3VwZXJuYW1lKSAgICAgICAgICAgICAgICAgICAgICBcCit9OworCisKKworCit9CisKKyNlbmRpZiAvKiBCQVNFQVZNUFJJTUlUSVZFX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vQ01ha2VMaXN0cy50eHQgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFhMjAwYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDIzIEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorIyAgICAgICAgICAgICAgICAgICAgICAgQ01ha2UgZmlsZSBmb3IgdGhlIEZBTSBsaWJyYXJ5DQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKw0KKyMgQysrIHNvdXJjZSBmaWxlcyB0byB0YWtlIGludG8gYWNjb3VudCAoYWxsIGZpbGVzIG1hdGNoaW5nIHBhdHRlcm5zLCByZWN1cnNpdmVseSkNCitmaWxlIChHTE9CX1JFQ1VSU0UgRkFNX0NYWF9TUkNfRklMRVMgKi5jcHAgKi5oKQ0KKw0KKyMgVGFyZ2V0IHRvIGJ1aWxkDQorYWRkX2xpYnJhcnkgKGZhbSBTVEFUSUMgJHtGQU1fQ1hYX1NSQ19GSUxFU30pDQorDQorIyBJbmNsdWRlIGRpcmVjdG9yaWVzIChpbnRlcm5hbCkNCit0YXJnZXRfaW5jbHVkZV9kaXJlY3RvcmllcyAoZmFtIFBVQkxJQyAuLikNCisjIFRPRE8gOiB0aGUgcHJldmlvdXMgZm9ybSBpcyBhbiAiYWxsLWNhdGNoIiA6IGV2ZXJ5IGhlYWRlciBvZiB0aGUgcHJvamVjdCBjYW4gYmUgYWNjZXNzZWQNCisjIEl0IGlzIHJlcXVpcmVkIGJlY2F1c2Ugc291cmNlcyB1c2UgcmVsYXRpdmUgcGF0aCB0byBzcmMgaW4gdGhlaXIgI2luY2x1ZGUNCisjIFRoaXMgcHJvYmFibHkgc2hvdWxkIGJlIHJlZmFjdG9yZWQgdG8gbWFrZSBidWlsZCBkZXBlbmRlbmNpZXMgZXhwbGljaXQgaW4gdGhlIENNYWtlTGlzdHMNCisNCisjIFRhcmdldCBpbmNsdWRlIGRpcmVjdG9yaWVzIChleHRlcm5hbCkNCit0YXJnZXRfaW5jbHVkZV9kaXJlY3RvcmllcyAoZmFtIFBVQkxJQyAke0dNUF9JTkNMVURFX0RJUn0gJHtHTVBYWF9JTkNMVURFX0RJUn0pDQordGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMgKGZhbSBQVUJMSUMgJHtCb29zdF9JTkNMVURFX0RJUlN9KQ0KK3RhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzIChmYW0gUFVCTElDICR7Q1ZDNF9JTkNMVURFX0RJUn0pDQorDQorDQorYWRkX2RlcGVuZGVuY2llcyhmYW0gcmVzY2FuX2N2YzQpDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL1JFQURNRS5tZCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI5MjgzNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9SRUFETUUubWQKQEAgLTAsMCArMSwxMzMgQEAKKyMgRUZNLVNZTUJFWDo6RkFNIC0gRm9ybWFsIEFuYWx5c2lzIE1vZHVsZQorCisjIyBTb3VyY2UgY29kZSBzdHJ1Y3R1cmUKKworIyMjIEludGVyZmFjZXMKKworIyMjIENsYXNzZXMKKworIyMjIEZhY3RvcmllcworCisjIyBvcmcuZWNsaXBzZS5lZm0uc2VwLmZhbQorTW9kdWxlIGQnQW5hbHlzZSBGb3JtZWxsZQorCisjIyMgUmVxdWlyZQorCisjIyMgSW1wb3J0CisqICoqb3JnLmVjbGlwc2UuZWZtLnNlcC5jb21tb24qKgorKiAqKm9yZy5lY2xpcHNlLmVmbS5zZXAuY29yZSoqCisgICsgU21hcnQtUG9pbnRlcgorCisjIyMgRXhwb3J0CisKKyMjIyMgSUZBTTogSW50ZXJmYWNlIG9mIEZvcm1hbCBBbmFseXNpcyBNb2R1bGUKK0MnZXN0IGwnaW50ZXJmYWNlIHF1ZSBkb2l0IGltcGzDqW1lbnRlciB0b3V0IE1vZHVsZSBkJ0FuYWx5c2UgRm9ybWVsbGUuCitJbCBmb3Vybml0IGRlcyBzZXJ2aWNlcyBwb3VyIGludGVydmVuaXIgZGFucyBsZXMgZGlmZsOpcmVudGVzIHBoYXNlcyBkdSBTRVcsIFN5bWJvbGljIEV4ZWN1dGlvbiBXb3JrZmxvdywgw6Agc2F2b2lyOgorCisqICoqY29uZmlndXJlKiosIE1BTkRBVE9SWQorCSsgRMOpZmluaXQgKGV0IHbDqXJpZmllPykgZGFucyBxdWVsbGUgcGhhc2UgZHUgKlNFLVdvcmtmbG93KiBpbCB2YSBpbnRlcnZlbmlyCisJKyBQcmlzZSBlbiBjb21wdGUgbGEgY29uZmlndXJhdGlvbiBmb3Vybml0IHBhciBsJ3V0aWxpc2F0ZXVyLCBkw6lmaW5pIGRhbnMgc29uICoqZmljaGllci5zZXcqKiAoYW5jaWVubW1lbnQgKmZpY2hpZXIuZmF2bSopCisKKyogKipwcmVwcm9jZXNzKiosIE9QVElPTkFMLCBzJ2lsIGEgdW4gdHJhaXRlbWVudCDDoCBlZmZlY3R1ZXIsIGVuICpwcmVwcm9jZXNzaW5nKiwgaS5lLiBhdmFudCBsYSBwaGFzZSBkeW5hbWlxdWUgZHUgcHJvY2Vzc3VzIERpdmVyc2l0eQorKiAqKnBvc3Rwcm9jZXNzKiosIE9QVElPTkFMLCBzJ2lsIGEgdW4gdHJhaXRlbWVudCDDoCBlZmZlY3R1ZXIsIGVuICpwb3N0cHJvY2Vzc2luZyosIGkuZS4gYXByw6hzIGxhIHBoYXNlIGR5bmFtaXF1ZSBkdSBwcm9jZXNzdXMgRGl2ZXJzaXR5CisKKyogKipwcmVmaWx0ZXIqKiwgT1BUSU9OQUwsIHMnaWwgYSB1biB0cmFpdGVtZW50IMOgIGVmZmVjdHVlciwgZW4gKnByZWZpbHRlcmluZyosIGkuZS4gcGVuZGFudCBsYSBwaGFzZSBkeW5hbWlxdWUgZHUgcHJvY2Vzc3VzIERpdmVyc2l0eSAsIG1haXMgYXZhbnQgbCdleMOpY3V0aW9uIHN5bWJvbGlxdWUgcHJvcHJlbWVudCBkaXRlCisKKyogKipwb3N0ZmlsdGVyKiosIE9QVElPTkFMLCBzJ2lsIGEgdW4gdHJhaXRlbWVudCDDoCBlZmZlY3R1ZXIsIGVuICpwb3N0ZmlsdGVyaW5nKiwgaS5lLiBwZW5kYW50IGxhIHBoYXNlIGR5bmFtaXF1ZSBkdSBwcm9jZXNzdXMgRGl2ZXJzaXR5ICwgbWFpcyBhcHLDqHMgbCdleMOpY3V0aW9uIHN5bWJvbGlxdWUgcHJvcHJlbWVudCBkaXRlCisKKworKiAqKnJlcG9ydCoqLCBPUFRJT05BTCwgcG91ciBwcm9wb3NlciB1biBiaWxhbiBkZSBsJ2FuYWx5c2UgZm9ybWVsbGUgZWZmZWN0dcOpZQorCitTb2l0IHBhciBleGVtcGxlOgorCitgYGBjcHAKK2NsYXNzIE15RkFNIDogcHVibGljIEF1dG9SZWdpc3RlcmVkRkFNPCBNeUZBTSA+LAoreworCS8vIE1BTkRBVE9SWSBmb3IgU21hcnQgUG9pbnRlciBzZXJ2aWNlcworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBNeUZBTSApCisKKwkvKioKKwkgKiBNeUZBTQorCSAqIGZvciBhdXRvbWF0aWMgcmVnaXN0cmF0aW9uIGluIHRoZSBGQU0gcmVwb3NpdG9yeQorCSAqIHRoZSBVRklEIGtleQorCSAqIG5lZWQgZm9yIGluc3RhbmNpYXRpb24gZnJvbSB0aGUgU0VXIHNwZWNpZmljYXRpb24gZmlsZQorCSAqLworCUFWTV9JTkpFQ1RfQVVUT19SRUdJU1RFUl9VRklEX0tFWSggIk15RkFNIiApCisJLy8gZW5kIHJlZ2lzdHJhdGlvbgorCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQVRUUklCVVRFCisJICovCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqLworCU15RkFNKENlbnRyYWxQcm9jZXNzb3JVbml0ICYgYU1hbmFnZXIsIEZvcm0gKiBhUGFyYW1ldGVyRm9ybSkKKwk6IEF1dG9SZWdpc3RlcmVkRkFNKGFNYW5hZ2VyLCBhUGFyYW1ldGVyRm9ybSwKKwkJQVZNX1BSRV9GSUxURVJJTkdfU1RBR0UgfCBBVk1fUE9TVF9GSUxURVJJTkdfU1RBR0UsIC4uLiksCisKKwkvKioKKwkgKiBDT05GSUdVUkUKKwkgKi8KKwlib29sIGNvbmZpZ3VyZUltcGwoKTsKKworCS8qKgorCSAqIFJFUE9SVCBUUkFDRQorCSAqLworCXZpcnR1YWwgdm9pZCByZXBvcnREZWZhdWx0KE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBQUk9DRVNTSU5HIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCS8qKgorCSAqIHByZVByb2Nlc3NpbmcKKwkgKi8KKwl2aXJ0dWFsIGJvb2wgcHJlcHJvY2VzcygpOworCisJLyoqCisJICogcG9zdHByb2Nlc3NpbmcKKwkgKi8KKwl2aXJ0dWFsIGJvb2wgcG9zdHByb2Nlc3MoKTsKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBGSUxURVJJTkcgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJLyoqCisJICogcHJlRmlsdGVyaW5nCisJICovCisJdmlydHVhbCBib29sIHByZWZpbHRlcihFeGVjdXRpb25Db250ZXh0ICogYW5FQyk7CisKKwkvKioKKwkgKiBwb3N0RmlsdGVyaW5nCisJICogRXZlcnkgcG9zdCBmaWx0ZXIgaGFzIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZAorCSAqLworCXZpcnR1YWwgYm9vbCBwb3N0ZmlsdGVyKEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDKTsKK307CisKK2BgYAorCisKKyMjIyMgQ1BVOiBDZW50cmFsIFByb2Nlc3NvciBVbml0CitDJ2VzdCBsZSBzY2hlZHVsZXIgcXVpIGfDqHJlIGwnYWN0aXZhdGlvbiBsZXMgRkFNcyBkYW5zIGxlcyBkaWZmw6lyZW50ZXMgcGhhc2VzIGRlIGwnZXjDqWN1dGlvbiAodm9pciAqc2VjdGlvbiBNT0UqIGRhbnMgbGUgKmZpY2hpZXIgU0VXL0ZBVk0qIGRlIHNww6ljaWZpY2F0aW9uIGR1IHdvcmtmbG93KQorCisjIyMjIE1QVTogTWFpbiBQcm9jZXNzb3IgVW5pdAorQydlc3QgbGUgRkFNIHByaW5jaXBhbCwgdG91am91cnMgYWN0aWYsIGF5YW50IGxhIGNoYXJnZSBkZQorCisqIGfDqXJlciBsZXMgImNyaXTDqHJzZSBkJ2FycsOqdHMiICh2b2lyICpmaWNoaWVyIFNFVy9GQVZNKiBkYW5zIGxlIGZpY2hpZXIKKyogZMOpdGVjdGVyIGxlcyAqZGVhZGxvY2tzKiBkJ2V4w6ljdXRpb24gKG5vZXVkIHNhbnMgZmlscyBlbiAqcG9zdHByZWZpbHRlcmluZyopCisqIGRpdmVyc2VzIHRyYWl0ZW1lbnRlbnRzIGludGVybmVzLCB0ZWwgbCdhdHRyaWJ1dGlvbiBkJ3VuIGlkZW50aWZpYW50IChudW3DqXJvKSBkZSBsYXJnZXVyIGRhbnMgbGUgZ3JhcGhlIGQnZXjDqWN1dGlvbgorKiAuLi4KKworCisjIyMjIFNvbWUgRkFNcworKiBGQU0gQ292ZXJhZ2UgKHN0YXRlIC8gdHJhbnNpdGlvbiAtLSBpbnB1dCAvIG91dHB1dCwgLi4uKSA6cG91ciBsZXMgYW5hbHlzZXMgZMOpZGnDqWVzIGNvdXZlcnR1cmVzIHN0cnVjdHVyZWxsZXMgZGVzIG1vZMOobGVzCisqIEZBTSBIaXQgb3IgSnVtcCA6IHBvdXIgbGEgc8OpbGVjdGlvbiBkZSBjb21wb3J0ZW1lbnQgw6AgcGFydGlyIGRlIHRyYWNlIGZvdXJuaWUgcGFyIGwndXRpbGlzYXRldXIKKyogRkFNIFRlc3RpbmcgKE9ubGluZSAvIE9mZmxpbmUpIDogcG91ciBjYWxjdWxlciB1biB2ZXJkaWN0IGFzc29jacOpIMOgIHVuICpvYmplY3RpZiBkZSB0ZXN0KiBlbiBtb2RlICpvbmxpbmUvb2ZmbGluZSoKKworIyMjIEludGVybmFsCitMZXMgZMOpdGFpbHMgZCdpbXBsw6ltZW50YXRpb24gaW50ZXJuZSAhCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9hcGkvQWJzdHJhY3RQcm9jZXNzb3JVbml0LmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9hcGkvQWJzdHJhY3RQcm9jZXNzb3JVbml0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzk0MWIxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2FwaS9BYnN0cmFjdFByb2Nlc3NvclVuaXQuY3BwCkBAIC0wLDAgKzEsOTU3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjggbm92LiAyMDExCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJBYnN0cmFjdFByb2Nlc3NvclVuaXQuaCIKKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVGb3JtLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZVN5c3RlbS5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uQ29udGV4dC5oPgorCisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1F1ZXJ5Lmg+CisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1dPYmplY3QuaD4KKworI2luY2x1ZGUgPGZhbS9xdWV1ZS9XYWl0aW5nU3RyYXRlZ3kuaD4KKworI2luY2x1ZGUgPHNldy9TeW1iZXhEaXNwYXRjaGVyLmg+CisjaW5jbHVkZSA8c2V3L1N5bWJleEVuZ2luZS5oPgorI2luY2x1ZGUgPHNldy9TeW1iZXhFdmVudE1hbmFnZXIuaD4KKworCisjaW5jbHVkZSA8Ym9vc3QvZm9ybWF0LmhwcD4KKworCisKK25hbWVzcGFjZSBzZXAKK3sKKworLyoKKyAqIFByZWNlZGVuY2UgZm9yIHByb2Nlc3NvciwgYmFzZWQgb24gcmVzb3VyY2UgY29uc3VtcHRpb24sCisgKiB1c2VkIHRvIG9yZGVyIHByb2Nlc3NvciBpbiB0aGUgRGl2ZXJzaXR5IHByb2Nlc3MgIQorICogRm9yIGluZm86IDAgZm9yIG1pbmltdW0gcmVzb3VyY2UgcmVxdWlyZW1lbnQgcmVzZXJ2ZWQgYnkgdGhlIG1haW4gcHJvY2Vzc29yLAorICogdGhlIFNUT1AgQ1JJVEVSSUEsIGFuZCBhIGdyZWF0IG51bWJlciBmb3IgZXhhbXBsZSBSRURVTkRBTkNZIHByb2Nlc3NvciAhCisgKiB7CisgKiAgIHByZVByb2Nlc3NpbmcgLCBwb3N0UHJvY2Vzc2luZyAsCisgKiAgIGZpbHRlcmluZ0luaXRpYWxpemUgLCBmaWx0ZXJpbmdGaW5hbGl6ZQorICogICBwcmVGaWx0ZXJpbmcgLCBwb3N0RmlsdGVyaW5nCisgKiB9CisgKi8KK2NvbnN0IGF2bV91aW50OF90IEFic3RyYWN0UHJvY2Vzc29yVW5pdDo6REVGQVVMVF9QUkVDRURFTkNFX09GX1BST0NFU1NPUls1XSA9CisJCXsgNTAgLCA1MCAsIDUwICwgNTAgLCA1MCB9OworCitjb25zdCBhdm1fdWludDhfdCBBYnN0cmFjdFByb2Nlc3NvclVuaXQ6OkRFRkFVTFRfUFJFQ0VERU5DRV9PRl9NQUlOX1BST0NFU1NPUls1XSA9CisJCXsgNDAgLCA0MCAsIDQwICwgNDAgLCA0MCB9OworCisKK2NvbnN0IGF2bV91aW50OF90IEFic3RyYWN0UHJvY2Vzc29yVW5pdDo6UFJFQ0VERU5DRV9PRl9BQ1RJVkVfQ09WRVJBR0VfUFJPQ0VTU09SWzVdID0KKwkJeyA0MCAsIDQwICwgNDAgLCA0MCAsIDQwIH07CisKK2NvbnN0IGF2bV91aW50OF90IEFic3RyYWN0UHJvY2Vzc29yVW5pdDo6UFJFQ0VERU5DRV9PRl9QQVNTSVZFX0NPVkVSQUdFX1BST0NFU1NPUls1XSA9CisJCXsgNjAgLCA2MCAsIDYwICwgNjAgLCA2MCB9OworCisKK2NvbnN0IGF2bV91aW50OF90IEFic3RyYWN0UHJvY2Vzc29yVW5pdDo6UFJFQ0VERU5DRV9PRl9NQUlOX1BST0NFU1NPUls1XSA9CisJCXsgMCAsIDAgLCAwICwgMCAsIDAgfTsKKworY29uc3QgYXZtX3VpbnQ4X3QgQWJzdHJhY3RQcm9jZXNzb3JVbml0OjpQUkVDRURFTkNFX09GX0VYVEVOREVSX1BST0NFU1NPUls1XSA9CisJCXsgMTAgLCAxMCAsIDEwICwgMTAgLCAxMCB9OworCitjb25zdCBhdm1fdWludDhfdCBBYnN0cmFjdFByb2Nlc3NvclVuaXQ6OlBSRUNFREVOQ0VfT0ZfUkVEVU5EQU5DWVs1XSA9CisJCXsgMTAwICwgMTAwICwgMTAwICwgMTAwICwgMTAwIH07CisKKworY29uc3QgYXZtX3VpbnQ4X3QgQWJzdHJhY3RQcm9jZXNzb3JVbml0OjpQUkVDRURFTkNFX09GX1RSQU5TSVRJT05fQ09WRVJBR0VbNV0gPQorCQl7IDQwICwgNDAgLCA0MCAsIDQwICwgNDAgfTsKKworY29uc3QgYXZtX3VpbnQ4X3QgQWJzdHJhY3RQcm9jZXNzb3JVbml0OjpQUkVDRURFTkNFX09GX0hJVF9PUl9KVU1QWzVdID0KKwkJeyA0MCAsIDQwICwgNDAgLCA0MCAsIDQwIH07CisKKworY29uc3QgYXZtX3VpbnQ4X3QgQWJzdHJhY3RQcm9jZXNzb3JVbml0OjpQUkVDRURFTkNFX09GX0ZPUk1VTEFfQ09WRVJBR0VbNV0gPQorCQl7IDYwICwgNjAgLCA2MCAsIDYwICwgNjAgfTsKKworY29uc3QgYXZtX3VpbnQ4X3QgQWJzdHJhY3RQcm9jZXNzb3JVbml0OjpQUkVDRURFTkNFX09GX01BQ0hJTkVfQ09WRVJBR0VbNV0gPQorCQl7IDYwICwgNjAgLCA2MCAsIDYwICwgNjAgfTsKKworCitjb25zdCBhdm1fdWludDhfdCBBYnN0cmFjdFByb2Nlc3NvclVuaXQ6OlBSRUNFREVOQ0VfT0ZfVEVTVF9PRkZMSU5FWzVdID0KKwkJeyA0MCAsIDQwICwgNDAgLCA0MCAsIDQwIH07CisKKworY29uc3QgYXZtX3VpbnQ4X3QgQWJzdHJhY3RQcm9jZXNzb3JVbml0OjpERUZBVUxUX1BSRUNFREVOQ0VfT0ZfU0VSSUFMSVpFUl9QUk9DRVNTT1JbNV0gPQorCQl7IDc1ICwgNzUgLCA3NSAsIDc1ICwgNzUgfTsKKworCisvKioKKyAqIENPTlNUUlVDVE9SCisgKiBEZWZhdWx0CisgKi8KK0Fic3RyYWN0UHJvY2Vzc29yVW5pdDo6QWJzdHJhY3RQcm9jZXNzb3JVbml0KFN5bWJleENvbnRyb2xsZXJVbml0TWFuYWdlciAmIGFNYW5hZ2VyLAorCQlXT2JqZWN0ICogd2ZQYXJhbWV0ZXJPYmplY3QsIGF2bV9jb21wdXRpbmdfcHJvY2Vzc19zdGFnZV90IHJlcXVpcmVkU3RhZ2UsCisJCWNvbnN0IGF2bV91aW50OF90ICogYVByZWNlZGVuY2UpCis6IFJ1bm5hYmxlRWxlbWVudCggQ0xBU1NfS0lORF9UKCBBYnN0cmFjdFByb2Nlc3NvclVuaXQgKSAsIHdmUGFyYW1ldGVyT2JqZWN0ICksCitJUHJvY2Vzc29yVW5pdFRlc3QoICp0aGlzICksCittQ29udHJvbGxlclVuaXRNYW5hZ2VyKCBhTWFuYWdlciApLAorRU5WKCBhTWFuYWdlci5nZXRQcmltaXRpdmVQcm9jZXNzb3IoKSApLAorCittQ29tcHV0aW5nU3RhZ2VSZXF1aXJlZCggcmVxdWlyZWRTdGFnZSApLAorbUNvbXB1dGluZ1N0YWdlRW5hYmxlZCggQVZNX1VOREVGSU5FRF9TVEFHRSApLAorCittQXV0b0NvbmZpZ3VyZSggZmFsc2UgKSwKK21BdXRvU3RhcnQoIGZhbHNlICksCisKK21QcmVjZWRlbmNlT2ZQcmVQcm9jZXNzKCBhUHJlY2VkZW5jZVswXSApLAorbVByZWNlZGVuY2VPZlBvc3RQcm9jZXNzKCBhUHJlY2VkZW5jZVsxXSApLAorCittUHJlY2VkZW5jZU9mSW5pdEZpbHRlciggYVByZWNlZGVuY2VbMl0gKSwKKworbVByZWNlZGVuY2VPZlByZUZpbHRlciggYVByZWNlZGVuY2VbM10gKSwKK21QcmVjZWRlbmNlT2ZQb3N0RmlsdGVyKCBhUHJlY2VkZW5jZVs0XSApLAorCittQmVnaW5uaW5nU3RlcFRpbW91dCggMCApLAorbVNsaWNlQ291bnQoIDAgKSwKKworbVByZUV2YWxUcmFjZUZvcm1hdHRlciggKSwKK21Qb3N0RXZhbFRyYWNlRm9ybWF0dGVyKCApLAorCittQm91bmRFdmFsVHJhY2VGb3JtYXR0ZXIoICksCittUmVwb3J0RXZhbFRyYWNlRm9ybWF0dGVyKCApLAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29tcHV0aW5nIFZhcmlhYmxlcworZWNRdWV1ZSggTlVMTCApLAorZWNRdWV1ZUl0KCApLAorZWNRdWV1ZUl0RW5kKCApLAorCitlY0NoaWxkSXQoICksCitlY0NoaWxkSXRFbmQoICkKK3sKKwkvLyEhIE5PVEhJTkcKK30KKworCitBYnN0cmFjdFByb2Nlc3NvclVuaXQ6OkFic3RyYWN0UHJvY2Vzc29yVW5pdChTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXIgJiBhTWFuYWdlciwKKwkJV09iamVjdCAqIHdmUGFyYW1ldGVyT2JqZWN0LCBjb25zdCBhdm1fdWludDhfdCAqIGFQcmVjZWRlbmNlKQorOiBSdW5uYWJsZUVsZW1lbnQoIENMQVNTX0tJTkRfVCggQWJzdHJhY3RQcm9jZXNzb3JVbml0ICkgLCB3ZlBhcmFtZXRlck9iamVjdCApLAorSVByb2Nlc3NvclVuaXRUZXN0KCAqdGhpcyApLAorbUNvbnRyb2xsZXJVbml0TWFuYWdlciggYU1hbmFnZXIgKSwKK0VOViggYU1hbmFnZXIuZ2V0UHJpbWl0aXZlUHJvY2Vzc29yKCkgKSwKKworbUNvbXB1dGluZ1N0YWdlUmVxdWlyZWQoIEFWTV9VTkRFRklORURfU1RBR0UgKSwKK21Db21wdXRpbmdTdGFnZUVuYWJsZWQoIEFWTV9VTkRFRklORURfU1RBR0UgKSwKKworbUF1dG9Db25maWd1cmUoIGZhbHNlICksCittQXV0b1N0YXJ0KCBmYWxzZSApLAorCittUHJlY2VkZW5jZU9mUHJlUHJvY2VzcyggYVByZWNlZGVuY2VbMF0gKSwKK21QcmVjZWRlbmNlT2ZQb3N0UHJvY2VzcyggYVByZWNlZGVuY2VbMV0gKSwKKworbVByZWNlZGVuY2VPZkluaXRGaWx0ZXIoIGFQcmVjZWRlbmNlWzJdICksCisKK21QcmVjZWRlbmNlT2ZQcmVGaWx0ZXIoIGFQcmVjZWRlbmNlWzNdICksCittUHJlY2VkZW5jZU9mUG9zdEZpbHRlciggYVByZWNlZGVuY2VbNF0gKSwKKworbUJlZ2lubmluZ1N0ZXBUaW1vdXQoIDAgKSwKK21TbGljZUNvdW50KCAwICksCisKK21QcmVFdmFsVHJhY2VGb3JtYXR0ZXIoICksCittUG9zdEV2YWxUcmFjZUZvcm1hdHRlciggKSwKKworbUJvdW5kRXZhbFRyYWNlRm9ybWF0dGVyKCApLAorbVJlcG9ydEV2YWxUcmFjZUZvcm1hdHRlciggKSwKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbXB1dGluZyBWYXJpYWJsZXMKK2VjUXVldWUoIE5VTEwgKSwKK2VjUXVldWVJdCggKSwKK2VjUXVldWVJdEVuZCggKSwKKworZWNDaGlsZEl0KCApLAorZWNDaGlsZEl0RW5kKCApCit7CisJLy8hISBOT1RISU5HCit9CisKKworCisvKioKKyAqIENPTlNUUlVDVE9SCisgKiBPdGhlcgorICovCitBYnN0cmFjdFByb2Nlc3NvclVuaXQ6OkFic3RyYWN0UHJvY2Vzc29yVW5pdChjbGFzc19raW5kX3QgYUNsYXNzS2luZCwKKwkJU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyICYgYU1hbmFnZXIsIFdPYmplY3QgKiB3ZlBhcmFtZXRlck9iamVjdCkKKzogUnVubmFibGVFbGVtZW50KCBhQ2xhc3NLaW5kICwgd2ZQYXJhbWV0ZXJPYmplY3QgKSwKK0lQcm9jZXNzb3JVbml0VGVzdCggKnRoaXMgKSwKK21Db250cm9sbGVyVW5pdE1hbmFnZXIoIGFNYW5hZ2VyICksCitFTlYoIGFNYW5hZ2VyLmdldFByaW1pdGl2ZVByb2Nlc3NvcigpICksCisKK21Db21wdXRpbmdTdGFnZVJlcXVpcmVkKCBBVk1fVU5ERUZJTkVEX1NUQUdFICksCittQ29tcHV0aW5nU3RhZ2VFbmFibGVkKCBBVk1fVU5ERUZJTkVEX1NUQUdFICksCisKK21BdXRvQ29uZmlndXJlKCBmYWxzZSApLAorbUF1dG9TdGFydCggZmFsc2UgKSwKKworbVByZWNlZGVuY2VPZlByZVByb2Nlc3MoIDAgKSwKK21QcmVjZWRlbmNlT2ZQb3N0UHJvY2VzcyggMCApLAorCittUHJlY2VkZW5jZU9mSW5pdEZpbHRlciggMCApLAorCittUHJlY2VkZW5jZU9mUHJlRmlsdGVyKCAwICksCittUHJlY2VkZW5jZU9mUG9zdEZpbHRlciggMCApLAorCittQmVnaW5uaW5nU3RlcFRpbW91dCggMCApLAorbVNsaWNlQ291bnQoIDAgKSwKKworbVByZUV2YWxUcmFjZUZvcm1hdHRlciggKSwKK21Qb3N0RXZhbFRyYWNlRm9ybWF0dGVyKCApLAorCittQm91bmRFdmFsVHJhY2VGb3JtYXR0ZXIoICksCittUmVwb3J0RXZhbFRyYWNlRm9ybWF0dGVyKCApLAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29tcHV0aW5nIFZhcmlhYmxlcworZWNRdWV1ZSggTlVMTCApLAorZWNRdWV1ZUl0KCApLAorZWNRdWV1ZUl0RW5kKCApLAorCitlY0NoaWxkSXQoICksCitlY0NoaWxkSXRFbmQoICkKK3sKKwkvLyEhIE5PVEhJTkcKK30KKworQWJzdHJhY3RQcm9jZXNzb3JVbml0OjpBYnN0cmFjdFByb2Nlc3NvclVuaXQoY2xhc3Nfa2luZF90IGFDbGFzc0tpbmQsCisJCVN5bWJleEVuZ2luZSAmIGFuRW5naW5lLCBTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXIgJiBhTWFuYWdlciwKKwkJV09iamVjdCAqIHdmUGFyYW1ldGVyT2JqZWN0KQorOiBSdW5uYWJsZUVsZW1lbnQoIGFDbGFzc0tpbmQsIHdmUGFyYW1ldGVyT2JqZWN0ICksCitJUHJvY2Vzc29yVW5pdFRlc3QoICp0aGlzICksCittQ29udHJvbGxlclVuaXRNYW5hZ2VyKCBhTWFuYWdlciApLAorRU5WKCBhbkVuZ2luZS5nZXRQcmltaXRpdmVQcm9jZXNzb3IoKSApLAorCittQ29tcHV0aW5nU3RhZ2VSZXF1aXJlZCggQVZNX1VOREVGSU5FRF9TVEFHRSApLAorbUNvbXB1dGluZ1N0YWdlRW5hYmxlZCggQVZNX1VOREVGSU5FRF9TVEFHRSApLAorCittQXV0b0NvbmZpZ3VyZSggZmFsc2UgKSwKK21BdXRvU3RhcnQoIGZhbHNlICksCisKK21QcmVjZWRlbmNlT2ZQcmVQcm9jZXNzKCAwICksCittUHJlY2VkZW5jZU9mUG9zdFByb2Nlc3MoIDAgKSwKKworbVByZWNlZGVuY2VPZkluaXRGaWx0ZXIoIDAgKSwKKworbVByZWNlZGVuY2VPZlByZUZpbHRlciggMCApLAorbVByZWNlZGVuY2VPZlBvc3RGaWx0ZXIoIDAgKSwKKworbUJlZ2lubmluZ1N0ZXBUaW1vdXQoIDAgKSwKK21TbGljZUNvdW50KCAwICksCisKK21QcmVFdmFsVHJhY2VGb3JtYXR0ZXIoICksCittUG9zdEV2YWxUcmFjZUZvcm1hdHRlciggKSwKKworbUJvdW5kRXZhbFRyYWNlRm9ybWF0dGVyKCApLAorbVJlcG9ydEV2YWxUcmFjZUZvcm1hdHRlciggKSwKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbXB1dGluZyBWYXJpYWJsZXMKK2VjUXVldWUoIE5VTEwgKSwKK2VjUXVldWVJdCggKSwKK2VjUXVldWVJdEVuZCggKSwKKworZWNDaGlsZEl0KCApLAorZWNDaGlsZEl0RW5kKCApCit7CisJLy8hISBOT1RISU5HCit9CisKKworLyoqCisgKiBHRVRURVIKKyAqIFN5bWJleEVuZ2luZQorICogQ29uZmlndXJhdGlvbgorICogU3ltYmV4RGlzcGF0Y2hlcgorICoKKyAqLworU3ltYmV4RW5naW5lICYgQWJzdHJhY3RQcm9jZXNzb3JVbml0OjpnZXRTeW1iZXhFbmdpbmUoKSBjb25zdAoreworCXJldHVybiggbUNvbnRyb2xsZXJVbml0TWFuYWdlci5nZXRTeW1iZXhFbmdpbmUoKSApOworfQorCitDb25maWd1cmF0aW9uICYgQWJzdHJhY3RQcm9jZXNzb3JVbml0OjpnZXRDb25maWd1cmF0aW9uKCkgY29uc3QKK3sKKwlyZXR1cm4oIG1Db250cm9sbGVyVW5pdE1hbmFnZXIuZ2V0U3ltYmV4RW5naW5lKCkuZ2V0Q29uZmlndXJhdGlvbigpICk7Cit9CisKK1N5bWJleERpc3BhdGNoZXIgJiBBYnN0cmFjdFByb2Nlc3NvclVuaXQ6OmdldFN5bWJleERpc3BhdGNoZXIoKSBjb25zdAoreworCXJldHVybiggbUNvbnRyb2xsZXJVbml0TWFuYWdlci5nZXRTeW1iZXhFbmdpbmUoKS5nZXRTeW1iZXhEaXNwYXRjaGVyKCkgKTsKK30KKworU3ltYmV4RXZlbnRNYW5hZ2VyICYgQWJzdHJhY3RQcm9jZXNzb3JVbml0OjpnZXRTeW1iZXhFdmVudE1hbmFnZXIoKSBjb25zdAoreworCXJldHVybiggZ2V0U3ltYmV4RGlzcGF0Y2hlcigpLmdldFN5bWJleEV2ZW50TWFuYWdlcigpICk7Cit9CisKK1N5bWJleENvbnRyb2xsZXJSZXF1ZXN0TWFuYWdlciAmCitBYnN0cmFjdFByb2Nlc3NvclVuaXQ6OmdldFN5bWJleFJlcXVlc3RNYW5hZ2VyKCkgY29uc3QKK3sKKwlyZXR1cm4oIGdldFN5bWJleERpc3BhdGNoZXIoKS5nZXRTeW1iZXhDb250cm9sbGVyUmVxdWVzdE1hbmFnZXIoKSApOworfQorCisvKioKKyAqIG5ldyBsb2NhbCBFeGVjdXRhYmxlRm9ybSBmb3IgUHJvY2Vzc29yIHVzYWdlCisgKi8KK0V4ZWN1dGFibGVGb3JtICogQWJzdHJhY3RQcm9jZXNzb3JVbml0OjpuZXdMb2NhbEV4ZWN1dGFibGVGb3JtKCkKK3sKKwlFeGVjdXRhYmxlRm9ybSAqIGxvY2FsRXhlYyA9IG5ldyBFeGVjdXRhYmxlRm9ybSgKKwkJCWdldENvbmZpZ3VyYXRpb24oKS5nZXRFeGVjdXRhYmxlU3lzdGVtKCkgLCAwICk7CisKKwlpZiggaGFzUGFyYW1ldGVyV09iamVjdCgpICkKKwl7CisJCWxvY2FsRXhlYy0+dXBkYXRlRnVsbHlRdWFsaWZpZWROYW1lSUQoCisJCQkJZ2V0UGFyYW1ldGVyV09iamVjdCgpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpICk7CisJfQorCisJcmV0dXJuKCBsb2NhbEV4ZWMgKTsKK30KKworLy8vKioKKy8vICogR0VUVEVSCisvLyAqIG1Qcm9jZXNzb3JNYW5hZ2VyCisvLyAqLworLy9NYWluUHJvY2Vzc29yVW5pdCAmIEFic3RyYWN0UHJvY2Vzc29yVW5pdDo6Z2V0TWFpblByb2Nlc3NvcigpCisvL3sKKy8vCXJldHVybiggbVByb2Nlc3Nvck1hbmFnZXIuZ2V0TWFpblByb2Nlc3NvcigpICk7CisvL30KKy8vCisvL2NvbnN0IE1haW5Qcm9jZXNzb3JVbml0ICYgQWJzdHJhY3RQcm9jZXNzb3JVbml0OjpnZXRNYWluUHJvY2Vzc29yKCkgY29uc3QKKy8veworLy8JcmV0dXJuKCBtUHJvY2Vzc29yTWFuYWdlci5nZXRNYWluUHJvY2Vzc29yKCkgKTsKKy8vfQorLy8KKy8vCisvLy8qKgorLy8gKiBHRVRURVIKKy8vICogdGhlIEJ1aWxkZXIKKy8vICovCisvL0J1aWxkZXIgJiBBYnN0cmFjdFByb2Nlc3NvclVuaXQ6OmdldEJ1aWxkZXIoKQorLy97CisvLwlyZXR1cm4oIG1Qcm9jZXNzb3JNYW5hZ2VyLmdldEJ1aWxkZXIoKSApOworLy99CisvLworLy8KKy8vLyoqCisvLyAqIEdFVFRFUgorLy8gKiBBdm1QcmltaXRpdmVQcm9jZXNzb3IKKy8vICovCisvL0F2bVByaW1pdGl2ZVByb2Nlc3NvciAmIEFic3RyYWN0UHJvY2Vzc29yVW5pdDo6Z2V0UHJpbWl0aXZlUHJvY2Vzc29yKCkKKy8veworLy8JcmV0dXJuKCBtUHJvY2Vzc29yTWFuYWdlci5nZXRQcmltaXRpdmVQcm9jZXNzb3IoKSApOworLy99CisKKy8qKgorICogR0VUVEVSCisgKiB0aGVFeGVjdXRpb25RdWV1ZQorICovCitFeGVjdXRpb25RdWV1ZSAmIEFic3RyYWN0UHJvY2Vzc29yVW5pdDo6Z2V0RXhlY3V0aW9uUXVldWUoKQoreworCXJldHVybiggbUNvbnRyb2xsZXJVbml0TWFuYWdlci5nZXRFeGVjdXRpb25RdWV1ZSgpICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENPTkZJR1VSRSBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgQWJzdHJhY3RQcm9jZXNzb3JVbml0OjpwcmVDb25maWd1cmUoKQoreworCVdPYmplY3QgKiB0aGVDT05GSUcgPSBnZXRQYXJhbWV0ZXJXT2JqZWN0KCk7CisKKwl0aGVDT05GSUcgPSBRdWVyeTo6Z2V0UmVnZXhXU2VxdWVuY2UodGhlQ09ORklHLAorCQkJCU9SX1dJRDIoIm1hbmlmZXN0IiwgIk1BTklGRVNUIiksIHRoZUNPTkZJRyk7CisKKwlpZiggdGhlQ09ORklHICE9IFdPYmplY3Q6Ol9OVUxMXyApCisJeworCQltQXV0b1N0YXJ0ID0gbUNvbnRyb2xsZXJVbml0TWFuYWdlci5pc0F1dG9TdGFydCgpCisJCQkJfHwgUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5Qm9vbGVhbih0aGVDT05GSUcsCisJCQkJCQlDT05TX1dJRDIoImF1dG8iLCAic3RhcnQiKSwgZmFsc2UpOworCisJCW1BdXRvQ29uZmlndXJlID0gbUF1dG9TdGFydAorCQkJCXx8IG1Db250cm9sbGVyVW5pdE1hbmFnZXIuaXNBdXRvQ29uZmlndXJlKCkKKwkJCQl8fCBRdWVyeTo6Z2V0UmVnZXhXUHJvcGVydHlCb29sZWFuKHRoZUNPTkZJRywKKwkJCQkJCUNPTlNfV0lEMigiYXV0byIsICJjb25mKGlndXJlKT8iKSwgZmFsc2UpOworCX0KKworCXJldHVybiggbUF1dG9Db25maWd1cmUgfHwgbUF1dG9TdGFydCB8fCBpc0VuYWJsZVBsdWdpbigpICk7Cit9CisKK2Jvb2wgQWJzdHJhY3RQcm9jZXNzb3JVbml0Ojpjb25maWd1cmUoKQoreworCS8vIElOSVRJQUxJWkFUSU9OCisJbUNvbmZpZ0ZsYWcgPSBSdW5uYWJsZUVsZW1lbnQ6OmNvbmZpZ3VyZSgpOworCisJLy8gRm9yIGNvbW1vbiBwYXJhbWV0ZXJzIGNvbmZpZ3VyYXRpb24KKwltQ29uZmlnRmxhZyA9IGNvbmZpZ3VyZUNvbW1vbigpICYmIG1Db25maWdGbGFnOworCisJLy8gc3RhbmRhcmQgcHJvY2Vzc29yIHVzZXIgY29uZmlndXJhdGlvbgorCW1Db25maWdGbGFnID0gY29uZmlndXJlSW1wbCgpICYmIG1Db25maWdGbGFnOworCisJLy8gYXV0byByZWdpc3RyYXRpb24KKwltQ29uZmlnRmxhZyA9IGF1dG9Db25maWd1cmVNT0UoKSAmJiBtQ29uZmlnRmxhZzsKKworCS8vIHNjaGVkdWxpbmcgY29uZmlndXJhdGlvbgorCW1Db25maWdGbGFnID0gY29uZmlndXJlTGlmZWN5Y2xlU3RhdGUoKSAmJiBtQ29uZmlnRmxhZzsKKworCXJldHVybiggbUNvbmZpZ0ZsYWcgKTsKK30KKworCitib29sIEFic3RyYWN0UHJvY2Vzc29yVW5pdDo6Y29uZmlndXJlQ29tbW9uKCkKK3sKKwlib29sIGlzT0sgPSB0cnVlOworCisJLy8gRm9yIEV2YWwgVHJhY2UgZm9ybWF0CisJaXNPSyA9IGNvbmZpZ3VyZUxvZygpICYmIGlzT0s7CisKKwlyZXR1cm4oIGlzT0sgKTsKK30KKworCitib29sIEFic3RyYWN0UHJvY2Vzc29yVW5pdDo6Y29uZmlndXJlTG9nKCkKK3sKKwlib29sIGlzT0sgPSB0cnVlOworCisJbVByZUV2YWxUcmFjZUZvcm1hdHRlciA9IGdldERlZmF1bHRQcmVFdmFsVHJhY2VGb3JtYXR0ZXIoKTsKKworCW1Qb3N0RXZhbFRyYWNlRm9ybWF0dGVyID0gZ2V0RGVmYXVsdFBvc3RFdmFsVHJhY2VGb3JtYXR0ZXIoKTsKKworCW1Cb3VuZEV2YWxUcmFjZUZvcm1hdHRlciA9IGdldERlZmF1bHRCb3VuZEV2YWxUcmFjZUZvcm1hdHRlcigpOworCisJbVJlcG9ydEV2YWxUcmFjZUZvcm1hdHRlciA9IGdldERlZmF1bHRSZXBvcnRFdmFsVHJhY2VGb3JtYXR0ZXIoKTsKKworCVdPYmplY3QgKiB0aGVMT0cgPSBRdWVyeTo6Z2V0V1NlcXVlbmNlT3JFbHNlKAorCQkJZ2V0UGFyYW1ldGVyV09iamVjdCgpLCAiY29uc29sZSIsICJMT0ciKTsKKwlpZiggdGhlTE9HICE9IFdPYmplY3Q6Ol9OVUxMXyApCisJeworCQltUHJlRXZhbFRyYWNlRm9ybWF0dGVyID0gUXVlcnk6OmdldFdQcm9wZXJ0eVN0cmluZ09yRWxzZSggdGhlTE9HLAorCQkJCSJzdGVwIiwgImV2YWwiLCBRdWVyeTo6Z2V0V1Byb3BlcnR5U3RyaW5nKCB0aGVMT0csICJmb3JtYXQiLAorCQkJCQkJbVByZUV2YWxUcmFjZUZvcm1hdHRlcikgKTsKKworCQlTdHJpbmdUb29sczo6cmVwbGFjZUFsbChtUHJlRXZhbFRyYWNlRm9ybWF0dGVyLCAiXFx0IiwgIlx0Iik7CisJCVN0cmluZ1Rvb2xzOjpyZXBsYWNlQWxsKG1QcmVFdmFsVHJhY2VGb3JtYXR0ZXIsICJcXG4iLCAiXG4iKTsKKworCisJCW1Qb3N0RXZhbFRyYWNlRm9ybWF0dGVyID0gUXVlcnk6OmdldFdQcm9wZXJ0eVN0cmluZ09yRWxzZSggdGhlTE9HLAorCQkJCSJyZXN1bHQiLCAiZm9ybWF0IiwgbVBvc3RFdmFsVHJhY2VGb3JtYXR0ZXIgKTsKKworCQlTdHJpbmdUb29sczo6cmVwbGFjZUFsbChtUG9zdEV2YWxUcmFjZUZvcm1hdHRlciwgIlxcdCIsICJcdCIpOworCQlTdHJpbmdUb29sczo6cmVwbGFjZUFsbChtUG9zdEV2YWxUcmFjZUZvcm1hdHRlciwgIlxcbiIsICJcbiIpOworCisKKwkJbUJvdW5kRXZhbFRyYWNlRm9ybWF0dGVyID0gUXVlcnk6OmdldFdQcm9wZXJ0eVN0cmluZ09yRWxzZSggdGhlTE9HLAorCQkJCSJib3VuZCIsICJmb3JtYXQiLCBtQm91bmRFdmFsVHJhY2VGb3JtYXR0ZXIgKTsKKworCQlTdHJpbmdUb29sczo6cmVwbGFjZUFsbChtQm91bmRFdmFsVHJhY2VGb3JtYXR0ZXIsICJcXHQiLCAiXHQiKTsKKwkJU3RyaW5nVG9vbHM6OnJlcGxhY2VBbGwobUJvdW5kRXZhbFRyYWNlRm9ybWF0dGVyLCAiXFxuIiwgIlxuIik7CisKKworCQltUmVwb3J0RXZhbFRyYWNlRm9ybWF0dGVyID0gUXVlcnk6OmdldFdQcm9wZXJ0eVN0cmluZ09yRWxzZSggdGhlTE9HLAorCQkJCSJyZXBvcnQiLCAiZm9ybWF0IiwgbVJlcG9ydEV2YWxUcmFjZUZvcm1hdHRlciApOworCisJCVN0cmluZ1Rvb2xzOjpyZXBsYWNlQWxsKG1SZXBvcnRFdmFsVHJhY2VGb3JtYXR0ZXIsICJcXHQiLCAiXHQiKTsKKwkJU3RyaW5nVG9vbHM6OnJlcGxhY2VBbGwobVJlcG9ydEV2YWxUcmFjZUZvcm1hdHRlciwgIlxcbiIsICJcbiIpOworCX0KKworCWlmKCB0aGVMT0cgPT0gTlVMTCApCisJeworCQl0aGVMT0cgPSBnZXRQYXJhbWV0ZXJXT2JqZWN0KCk7CisJfQorCisJdHJ5CisJeworCQlib29zdDo6Zm9ybWF0IGZvcm1hdHRlcihtUHJlRXZhbFRyYWNlRm9ybWF0dGVyKTsKKwl9CisJY2F0Y2goY29uc3QgYm9vc3Q6OmlvOjpiYWRfZm9ybWF0X3N0cmluZyAmIGJmcykKKwl7CisJCVF1ZXJ5OjpyZXBvcnRFcnJvckF0dHJpYnV0ZSggdGhlTE9HLCAiZXZhbCIsIGJmcy53aGF0KCkpOworCQlpc09LID0gZmFsc2U7CisJfQorCisJdHJ5CisJeworCQlib29zdDo6Zm9ybWF0IGZvcm1hdHRlcihtUHJlRXZhbFRyYWNlRm9ybWF0dGVyKTsKKwl9CisJY2F0Y2goY29uc3QgYm9vc3Q6OmlvOjpiYWRfZm9ybWF0X3N0cmluZyAmIGJmcykKKwl7CisJCVF1ZXJ5OjpyZXBvcnRFcnJvckF0dHJpYnV0ZSggdGhlTE9HLCAicmVzdWx0IiwgYmZzLndoYXQoKSk7CisJCWlzT0sgPSBmYWxzZTsKKwl9CisKKwl0cnkKKwl7CisJCWJvb3N0Ojpmb3JtYXQgZm9ybWF0dGVyKG1Cb3VuZEV2YWxUcmFjZUZvcm1hdHRlcik7CisJfQorCWNhdGNoKGNvbnN0IGJvb3N0Ojppbzo6YmFkX2Zvcm1hdF9zdHJpbmcgJiBiZnMpCisJeworCQlRdWVyeTo6cmVwb3J0RXJyb3JBdHRyaWJ1dGUoIHRoZUxPRywgImJvdW5kIiwgYmZzLndoYXQoKSk7CisJCWlzT0sgPSBmYWxzZTsKKwl9CisKKwl0cnkKKwl7CisJCWJvb3N0Ojpmb3JtYXQgZm9ybWF0dGVyKG1SZXBvcnRFdmFsVHJhY2VGb3JtYXR0ZXIpOworCX0KKwljYXRjaChjb25zdCBib29zdDo6aW86OmJhZF9mb3JtYXRfc3RyaW5nICYgYmZzKQorCXsKKwkJUXVlcnk6OnJlcG9ydEVycm9yQXR0cmlidXRlKCB0aGVMT0csICJyZXBvcnQiLCBiZnMud2hhdCgpKTsKKwkJaXNPSyA9IGZhbHNlOworCX0KKworCXJldHVybiggaXNPSyApOworfQorCisKK2Jvb2wgQWJzdHJhY3RQcm9jZXNzb3JVbml0OjpjaGVja2luZ0NvbmZpZ3VyYXRpb24oKQoreworCWlmKCByZXF1aXJlc1N0cm9uZ0VuYWJsZUZpbHRlcigpICYmIChub3QgaXNTdHJvbmdFbmFibGVGaWx0ZXIoKSkgKQorCXsKKwkJQVZNX09TX0NMT0cgPDwgc3RyVHlwZUlkKCkKKwkJCQk8PCAiOj4gRmFpbGVkIHRvIGNvbmZpZ3VyZSB0aGUgQ09OVFJPTExFUiBVTklUIDw8ICIKKwkJCQk8PCBzdHJVbmlxSWQoKSA8PCAiID4+ICIgPDwgc3RkOjplbmRsOworCisJCWlmKCBpc0VuYWJsZVByZWZpbHRlcigpICkKKwkJeworCQkJQVZNX09TX0NMT0cgPDwgIlRoaXMgQ09OVFJPTExFUiBVTklUIG11c3QgYmUgIgorCQkJCQkiaW4gdGhlIFBPU1QtRklMVEVSIHNjaGVkdWxlciBhbHNvICEiCisJCQkJCTw8IHN0ZDo6ZW5kbDsKKwkJfQorCQllbHNlCisJCXsKKwkJCUFWTV9PU19DTE9HIDw8ICJUaGlzIENPTlRST0xMRVIgVU5JVCBtdXN0IGJlICIKKwkJCQkJImluIHRoZSBQUkUtRklMVEVSIHNjaGVkdWxlciBhbHNvICEiCisJCQkJCTw8IHN0ZDo6ZW5kbDsKKwkJfQorCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworCisvKioKKyAqIEFQSQorICogQXV0byBjb25maWd1cmUgTW9kZWwgT2YgRXhlY3V0aW9uIGluIENQVQorICovCitib29sIEFic3RyYWN0UHJvY2Vzc29yVW5pdDo6YXV0b0NvbmZpZ3VyZU1PRSgpCit7CisJYm9vbCBpc09LID0gdHJ1ZTsKKworCWlmKCBtQXV0b0NvbmZpZ3VyZSApCisJeworCQlpc09LID0gYXV0b0NvbmZpZ3VyZU1PRUltcGwoKTsKKwl9CisKKwkvLyBjaGVja2luZyBvZiBtb2RlbCBvZiBleGVjdXRpb24gZm9yIHByb2Nlc3NvcgorCWlzT0sgPSBjaGVja2luZ0NvbmZpZ3VyYXRpb24oKSAmJiBpc09LOworCisJcmV0dXJuKCBpc09LICk7Cit9CisKK2Jvb2wgQWJzdHJhY3RQcm9jZXNzb3JVbml0OjphdXRvQ29uZmlndXJlTU9FSW1wbCgpCit7CisJYm9vbCBpc09LID0gdHJ1ZTsKKworCWlmKCBtQ29tcHV0aW5nU3RhZ2VSZXF1aXJlZCAhPSBBVk1fVU5ERUZJTkVEX1NUQUdFICkKKwl7CisJCW1Db21wdXRpbmdTdGFnZUVuYWJsZWQgPSBtQ29tcHV0aW5nU3RhZ2VSZXF1aXJlZDsKKworLy8hIVtERUJVR10KKy8vbVByb2Nlc3Nvck1hbmFnZXIudG9TdHJlYW0oCisvLwkJQVZNX09TX0RFQlVHIDw8ICJiZWZvcmUgYXV0b0NvbmZpZ3VyZU1PRUltcGw8ICIgPDwgdGhpcy0+c3RyVW5pcUlkKCkKKy8vCQkJCTw8ICIgPiIgPDwgc3RkOjplbmRsICk7CisKKwkJaWYoIChtQ29tcHV0aW5nU3RhZ2VSZXF1aXJlZCAmIEFWTV9QUkVfUFJPQ0VTU0lOR19TVEFHRSkgIT0gMCApCisJCXsKKwkJCWlmKCBub3QgbUNvbnRyb2xsZXJVbml0TWFuYWdlci5yZWdpc3RlclByZXByb2Nlc3NvciggdGhpcyApICkKKwkJCXsKKwkJCQlpc09LID0gZmFsc2U7CisJCQl9CisJCX0KKworCQlpZiggKG1Db21wdXRpbmdTdGFnZVJlcXVpcmVkICYgQVZNX1BPU1RfUFJPQ0VTU0lOR19TVEFHRSkgIT0gMCApCisJCXsKKwkJCWlmKCBub3QgbUNvbnRyb2xsZXJVbml0TWFuYWdlci5yZWdpc3RlclBvc3Rwcm9jZXNzb3IoIHRoaXMgKSApCisJCQl7CisJCQkJaXNPSyA9IGZhbHNlOworCQkJfQorCQl9CisKKwkJaWYoIChtQ29tcHV0aW5nU3RhZ2VSZXF1aXJlZCAmIEFWTV9QUkVfRklMVEVSSU5HX1NUQUdFKSAhPSAwICkKKwkJeworCQkJaWYoIG5vdCBtQ29udHJvbGxlclVuaXRNYW5hZ2VyLnJlZ2lzdGVyUHJlZmlsdGVyKCB0aGlzICkgKQorCQkJeworCQkJCWlzT0sgPSBmYWxzZTsKKwkJCX0KKwkJfQorCisJCWlmKCAobUNvbXB1dGluZ1N0YWdlUmVxdWlyZWQgJiBBVk1fUE9TVF9GSUxURVJJTkdfU1RBR0UpICE9IDAgKQorCQl7CisJCQlpZiggbm90IG1Db250cm9sbGVyVW5pdE1hbmFnZXIucmVnaXN0ZXJQb3N0ZmlsdGVyKCB0aGlzICkgKQorCQkJeworCQkJCWlzT0sgPSBmYWxzZTsKKwkJCX0KKwkJfQorCisvLyEhW0RFQlVHXQorLy9tUHJvY2Vzc29yTWFuYWdlci50b1N0cmVhbSgKKy8vCQlBVk1fT1NfREVCVUcgPDwgc3RkOjplbmRsIDw8ICJhZnRlciBhdXRvQ29uZmlndXJlTU9FSW1wbDwgIgorLy8JCQkJPDwgdGhpcy0+c3RyVW5pcUlkKCkgPDwgIiA+IiA8PCBzdGQ6OmVuZGwgKTsKKwl9CisJZWxzZQorCXsKKwkJQVZNX09TX0RFQlVHIDw8ICJUT0RPIGF1dG9Db25maWd1cmVNT0VJbXBsPCAiCisJCQkJPDwgdGhpcy0+c3RyVW5pcUlkKCkgPDwgIiA+IiA8PCBzdGQ6OmVuZGw7CisJfQorCisJcmV0dXJuKCBpc09LICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEVOQUJMRSAmIFJFR0lTVEVSICBQUk9DRVNTIFBMVUdJTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBBYnN0cmFjdFByb2Nlc3NvclVuaXQ6OmVuYWJsZVByZXByb2Nlc3MoQWJzdHJhY3RQcm9jZXNzb3JVbml0ICogYVByb2Nlc3NvcikKK3sKKwllbmFibGVQcmVwcm9jZXNzKCk7CisKKwltQ29udHJvbGxlclVuaXRNYW5hZ2VyLmFkZFByZXByb2Nlc3NvciggYVByb2Nlc3NvciApOworfQorCit2b2lkIEFic3RyYWN0UHJvY2Vzc29yVW5pdDo6ZW5hYmxlUG9zdHByb2Nlc3MoQWJzdHJhY3RQcm9jZXNzb3JVbml0ICogYVByb2Nlc3NvcikKK3sKKwllbmFibGVQb3N0cHJvY2VzcygpOworCisJbUNvbnRyb2xsZXJVbml0TWFuYWdlci5hZGRQb3N0cHJvY2Vzc29yKCBhUHJvY2Vzc29yICk7Cit9CisKKwordm9pZCBBYnN0cmFjdFByb2Nlc3NvclVuaXQ6OmVuYWJsZVByZWZpbHRlcihBYnN0cmFjdFByb2Nlc3NvclVuaXQgKiBhUHJvY2Vzc29yKQoreworCWVuYWJsZVByZWZpbHRlcigpOworCisJbUNvbnRyb2xsZXJVbml0TWFuYWdlci5hZGRQcmVmaWx0ZXIoIGFQcm9jZXNzb3IgKTsKK30KKwordm9pZCBBYnN0cmFjdFByb2Nlc3NvclVuaXQ6OmVuYWJsZVBvc3RmaWx0ZXIoQWJzdHJhY3RQcm9jZXNzb3JVbml0ICogYVByb2Nlc3NvcikKK3sKKwllbmFibGVQb3N0ZmlsdGVyKCk7CisKKwltQ29udHJvbGxlclVuaXRNYW5hZ2VyLmFkZFBvc3RmaWx0ZXIoIGFQcm9jZXNzb3IgKTsKK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBGSUxURVIgQVBJCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIEFic3RyYWN0UHJvY2Vzc29yVW5pdDo6cHJlZmlsdGVyKCkKK3sKKwllY1F1ZXVlID0gJiggZ2V0RXhlY3V0aW9uUXVldWUoKS5nZXRSZWFkeVF1ZXVlKCkgKTsKKwllY1F1ZXVlSXQgPSBlY1F1ZXVlLT5iZWdpbigpOworCWVjUXVldWVJdEVuZCA9IGVjUXVldWUtPmVuZCgpOworCWZvciggOyBlY1F1ZXVlSXQgIT0gZWNRdWV1ZUl0RW5kIDsgKQorCXsKKwkJaWYoIG5vdCBwcmVmaWx0ZXIoKiAoKmVjUXVldWVJdCkpICkKKwkJeworCQkJZ2V0RXhlY3V0aW9uUXVldWUoKS5hcHBlbmRGYWlsZWQoICplY1F1ZXVlSXQgKTsKKworCQkJZWNRdWV1ZUl0ID0gZWNRdWV1ZS0+ZXJhc2UoZWNRdWV1ZUl0KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCSsrZWNRdWV1ZUl0OworCQl9CisJfQorCisJcmV0dXJuKCBnZXRFeGVjdXRpb25RdWV1ZSgpLmhhc1JlYWR5KCkgKTsKK30KKworCitib29sIEFic3RyYWN0UHJvY2Vzc29yVW5pdDo6cG9zdGZpbHRlcigpCit7CisJZWNRdWV1ZSA9ICYoIGdldEV4ZWN1dGlvblF1ZXVlKCkuZ2V0UmVzdWx0UXVldWUoKSApOworCWVjUXVldWVJdCA9IGVjUXVldWUtPmJlZ2luKCk7CisJZWNRdWV1ZUl0RW5kID0gZWNRdWV1ZS0+ZW5kKCk7CisJZm9yKCA7IGVjUXVldWVJdCAhPSBlY1F1ZXVlSXRFbmQgOyApCisJeworCQlpZiggbUJlZ2lubmluZ1N0ZXBUaW1vdXQgPiAwICkKKwkJeworCQkJKytlY1F1ZXVlSXQ7CisKKwkJCS0tbUJlZ2lubmluZ1N0ZXBUaW1vdXQ7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiggbm90IHBvc3RmaWx0ZXIoKiAoKmVjUXVldWVJdCkpICkKKwkJCXsKKwkJCQlnZXRFeGVjdXRpb25RdWV1ZSgpLmFwcGVuZEZhaWxlZCggKmVjUXVldWVJdCApOworCisJCQkJZWNRdWV1ZUl0ID0gZWNRdWV1ZS0+ZXJhc2UoZWNRdWV1ZUl0KTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkrK2VjUXVldWVJdDsKKwkJCX0KKworCQl9CisJfQorCisJcmV0dXJuKCBnZXRFeGVjdXRpb25RdWV1ZSgpLmhhc1Jlc3VsdCgpICk7Cit9CisKKworLyoqCisgKiBSRVBPUlQKKyAqLwordm9pZCBBYnN0cmFjdFByb2Nlc3NvclVuaXQ6OnJlcG9ydEhlYWRlcigKKwkJT3V0U3RyZWFtICYgb3MsIGNvbnN0IHN0ZDo6c3RyaW5nICYgcHJvY2Vzc29yTmFtZSkgY29uc3QKK3sKKwlvcyA8PCBUQUIgPDwgcHJvY2Vzc29yTmFtZSA8PCAiIFBST0NFU1NPUiI7CisKK0FWTV9JRl9ERUJVR19GTEFHKCBDT05GSUdVUklORyApCisJaWYoIGlzV2Vha0VuYWJsZUZpbHRlcigpICkKKwl7CisJCW9zIDw8ICIgdXNpbmcgYXMgIjsKKworCQlpZiggaXNTdHJvbmdFbmFibGVGaWx0ZXIoKSApCisJCXsKKwkJCW9zIDw8ICIoUFJFICYgUE9TVCkiOworCQl9CisJCWlmKCBpc0VuYWJsZVByZWZpbHRlcigpICkKKwkJeworCQkJb3MgPDwgIlBSRSI7CisJCX0KKwkJZWxzZSBpZiggaXNFbmFibGVQb3N0ZmlsdGVyKCkgKQorCQl7CisJCQlvcyA8PCAiUE9TVCI7CisJCX0KKworCQlvcyA8PCAiLUZJTFRFUiI7CisJfQorCisJaWYoIGlzV2Vha0VuYWJsZVByb2Nlc3MoKSApCisJeworCQlvcyA8PCAoaXNXZWFrRW5hYmxlRmlsdGVyKCkgPyAiICYiIDogIiB1c2luZyIgKSA8PCAiIGFzICI7CisKKwkJaWYoIGlzU3Ryb25nRW5hYmxlUHJvY2VzcygpICkKKwkJeworCQkJb3MgPDwgIihQUkUgJiBQT1NUKSI7CisJCX0KKwkJZWxzZSBpZiggaXNFbmFibGVQcmVwcm9jZXNzKCkgKQorCQl7CisJCQlvcyA8PCAiUFJFIjsKKwkJfQorCQllbHNlIGlmKCBpc0VuYWJsZVBvc3Rwcm9jZXNzKCkgKQorCQl7CisJCQlvcyA8PCAiUE9TVCI7CisJCX0KKwkJb3MgPDwgIi1QUk9DRVNTIjsKKwl9CitBVk1fRU5ESUZfREVCVUdfRkxBR19BTkQoIENPTkZJR1VSSU5HICkKKworCW9zIDw8IEVPTDsKK30KKworCit2b2lkIEFic3RyYWN0UHJvY2Vzc29yVW5pdDo6cmVwb3J0RGVmYXVsdChPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlBVk1fT1NfVkVSQk9TSVRZX01FRElVTSggb3MgKQorCQkJPDwgVEFCIDw8ICJGT1JNQUwgTU9EVUxFIEFOQUxZU0lTPCAiCisJCQk8PCAoIGlzTmFtZWQoKSA/IHN0ckZRTigpIDogc3RyVW5pcUlkKCkgKQorCQkJPDwgIiA+IERPTkUgISEhIiAgPDwgRU9MX0ZMVVNIOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBQUk9DRVNTT1IgUkVRVUVTVCBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICogUkVRVUVVRV9SRVNFUlZFCisgKi8KK3ZvaWQgQWJzdHJhY3RQcm9jZXNzb3JVbml0OjpoYW5kbGVSZXF1ZXN0UmVxdWV1ZVJlc2VydmVUYWJsZSgKKwkJV2FpdGluZ1N0cmF0ZWd5ICYgYVdhaXRpbmdTdHJhdGVneSwKKwkJTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGFSZXNlcnZlUXVldWUsCisJCWF2bV91aW50OF90IGFXZWlnaHRNaW4sIGF2bV91aW50OF90IGFXZWlnaHRNYXgpCit7CisJYVdhaXRpbmdTdHJhdGVneS5wdXNoQ2hpbGQoIGFSZXNlcnZlUXVldWUgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUFJFRklMVEVSIFJFTU9WRSBFQyBUT09MUworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYXZtX3NpemVfdCBBYnN0cmFjdFByb2Nlc3NvclVuaXQ6OnJlbW92ZShFeGVjdXRpb25Db250ZXh0ICogYW5FQywKKwkJT3V0U3RyZWFtICYgbG9nZ2VyLCBjb25zdCBzdGQ6OnN0cmluZyAmIG1zZykKK3sKKwlhdm1fc2l6ZV90IGVjQ291bnQgPSAxOyAvLyAxIGZvciBzZXA6OmRlc3Ryb3lFbGVtZW50KCBhbkVDICk7CisKKwkvLyBGaXJzdCByZW1vdmUgY2hpbGQKKwlpZiggYW5FQy0+aGFzTmV4dCgpICkKKwl7CisJCUV4ZWN1dGlvbkNvbnRleHQ6OnJ3X2NoaWxkX2l0ZXJhdG9yIGl0RUMgPSBhbkVDLT5iZWdpbigpOworCQlmb3IoIEV4ZWN1dGlvbkNvbnRleHQgKiB0bXBFQyA9IE5VTEwgOyBpdEVDICE9IGFuRUMtPmVuZCgpIDsgKQorCQl7CisJCQl0bXBFQyA9ICgqaXRFQyk7CisKKwkJCXRtcEVDLT5zZXRDb250YWluZXIoIE5VTEwgKTsKKworCQkJaXRFQyA9IGFuRUMtPmVyYXNlQ2hpbGRDb250ZXh0KCBpdEVDICk7CisKKwkJCWVjQ291bnQgKz0gQWJzdHJhY3RQcm9jZXNzb3JVbml0OjpyZW1vdmUoIHRtcEVDICwgbG9nZ2VyICwgbXNnICk7CisJCX0KKworCQlhbkVDLT5jbGVhckNoaWxkQ29udGV4dCgpOworCX0KKworCS8vIEVmZmVjdGl2ZSByZW1vdmUKKwlpZiggYW5FQy0+aGFzUHJldmlvdXMoKSApCisJeworCQlhbkVDLT5nZXRQcmV2aW91cygpLT5yZW1vdmVDaGlsZENvbnRleHQoYW5FQyk7CisJfQorCisJZ2V0U3ltYmV4RXZlbnRNYW5hZ2VyKCkubm90aWZ5RXZlbnREZXN0cm95Q3R4KCBhbkVDICk7CisKKworQVZNX0lGX0RFQlVHX0xFVkVMX0dURV9NRURJVU0KKwlsb2dnZXIgPDwgKCggbXNnLmVtcHR5KCkgKSA/ICJBIFBsdWdpbiBQcm9jZXNzb3IgcmVtb3ZlIHRoZSIgOiBtc2cpCisJCQk8PCAiIEVDOj4gIiA8PCBhbkVDLT5zdHJfbWluKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0dURV9NRURJVU0KKworCXNlcDo6ZGVzdHJveUVsZW1lbnQoIGFuRUMgKTsKKworCXJldHVybiggZWNDb3VudCApOworfQorCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEZJTkFMIFNMSUNJTkcgVE9PTFMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgQWJzdHJhY3RQcm9jZXNzb3JVbml0Ojppc1NsaWNlYWJsZUNvbnRleHQoRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpIGNvbnN0Cit7CisJcmV0dXJuKCBhbkVDLm5vbmVJbmZvKCp0aGlzKSApOworfQorCisKK3ZvaWQgQWJzdHJhY3RQcm9jZXNzb3JVbml0Ojpjb21wdXRlTGVhZkVDKAorCQljb25zdCBMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgbGlzdE9mUm9vdEVDLAorCQlMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgbGlzdE9mTGVhZkVDKQoreworCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQgdG1wTGlzdE9mRUM7CisKKwlMaXN0T2ZFeGVjdXRpb25Db250ZXh0Ojpjb25zdF9pdGVyYXRvciBpdEVDID0gbGlzdE9mUm9vdEVDLmJlZ2luKCk7CisJTGlzdE9mRXhlY3V0aW9uQ29udGV4dDo6Y29uc3RfaXRlcmF0b3IgZW5kRUMgPSBsaXN0T2ZSb290RUMuZW5kKCk7CisJZm9yKCA7IGl0RUMgIT0gZW5kRUMgOyArK2l0RUMgKQorCXsKKwkJaWYoICgqaXRFQyktPmlzTGVhZk5vZGUoKSApCisJCXsKKwkJCWxpc3RPZkxlYWZFQy5hcHBlbmQoICppdEVDICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQl0bXBMaXN0T2ZFQy5hcHBlbmQoICgqaXRFQyktPmdldE5leHQoKSApOworCQl9CisJfQorCisJaWYoIHRtcExpc3RPZkVDLm5vbmVtcHR5KCkgKQorCXsKKwkJY29tcHV0ZUxlYWZFQyh0bXBMaXN0T2ZFQywgbGlzdE9mTGVhZkVDKTsKKwl9Cit9CisKKwordm9pZCBBYnN0cmFjdFByb2Nlc3NvclVuaXQ6OnNsaWNlKExpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBsaXN0T2ZMZWFmRUMpCit7CitBVk1fSUZfREVCVUdfRkxBRyggUFJPQ0VTU09SICkKKwlBVk1fT1NfVFJBQ0UgPDwgZ2V0UGFyYW1ldGVyV09iamVjdCgpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQk8PCAiIDo+IENVVCBCQUNLIiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggUFJPQ0VTU09SICkKKworCXdoaWxlKCBsaXN0T2ZMZWFmRUMubm9uZW1wdHkoKSApCisJeworCQlzbGljZShsaXN0T2ZMZWFmRUMsIGxpc3RPZkxlYWZFQy5wb3BfbGFzdCgpKTsKKwl9CisKK0FWTV9JRl9ERUJVR19GTEFHKCBQUk9DRVNTT1IgKQorCUFWTV9PU19UUkFDRSA8PCBnZXRQYXJhbWV0ZXJXT2JqZWN0KCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKwkJCTw8ICIgOj4gQ1VUIEJBQ0sgRU5EICggY291bnQ6ICIgPDwgbVNsaWNlQ291bnQgPDwgIiApIgorCQkJPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFBST0NFU1NPUiApCit9CisKK3ZvaWQgQWJzdHJhY3RQcm9jZXNzb3JVbml0OjpzbGljZSgKKwkJTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGxpc3RPZkxlYWZFQywKKwkJRXhlY3V0aW9uQ29udGV4dCAqIGxlYWZFQykKK3sKKwlpZiggKGxlYWZFQyAhPSBOVUxMKSAmJiBsZWFmRUMtPmlzTGVhZk5vZGUoKQorCQkmJiBpc1NsaWNlYWJsZUNvbnRleHQoKiBsZWFmRUMpICkKKwl7CisJCUV4ZWN1dGlvbkNvbnRleHQgKiBjb250YWluZXJFQyA9IGxlYWZFQy0+Z2V0Q29udGFpbmVyKCk7CisKKwkJaWYoIGNvbnRhaW5lckVDICE9IE5VTEwgKQorCQl7CisJCQlFeGVjdXRpb25Db250ZXh0ICogdG1wRUMgPSBOVUxMOworCisJCQkvLyBEZXN0cm95IGRlcyBmaWxzIGRlIHRoZUZhdGhlckVDIHNhdWYgdGFyZ2V0RUMKKwkJCUV4ZWN1dGlvbkNvbnRleHQ6OnJ3X2NoaWxkX2l0ZXJhdG9yIGl0ID0gY29udGFpbmVyRUMtPmJlZ2luKCk7CisJCQlmb3IoIDsgaXQgIT0gY29udGFpbmVyRUMtPmVuZCgpIDsgKQorCQkJeworCQkJCXRtcEVDID0gKCppdCk7CisJCQkJaWYoIHRtcEVDLT5pc0xlYWZOb2RlKCkgJiYgaXNTbGljZWFibGVDb250ZXh0KCogdG1wRUMpICkKKwkJCQl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFBST0NFU1NPUiApCisJdG1wRUMtPnRyYWNlTWluaW11bShBVk1fT1NfVFJBQ0UgPDwgIlx0Iik7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFBST0NFU1NPUiApCisKKwkJCQkJaXQgPSBjb250YWluZXJFQy0+ZXJhc2VDaGlsZENvbnRleHQoaXQpOworCQkJCQkrK21TbGljZUNvdW50OworCisJCQkJCWxpc3RPZkxlYWZFQy5yZW1vdmUodG1wRUMpOworCisJCQkJCWdldFN5bWJleEV2ZW50TWFuYWdlcigpLm5vdGlmeUV2ZW50RGVzdHJveUN0eCggdG1wRUMgKTsKKworCQkJCQlzZXA6OmRlc3Ryb3lFbGVtZW50KCB0bXBFQyApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQkrK2l0OworCQkJCX0KKwkJCX0KKworCQkJc2xpY2UobGlzdE9mTGVhZkVDLCBjb250YWluZXJFQyk7CisJCX0KKwl9CisJZWxzZQorCXsKKwl9Cit9CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vYXBpL0Fic3RyYWN0UHJvY2Vzc29yVW5pdC5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2FwaS9BYnN0cmFjdFByb2Nlc3NvclVuaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjJmZTliCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2FwaS9BYnN0cmFjdFByb2Nlc3NvclVuaXQuaApAQCAtMCwwICsxLDE0NTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyOCBub3YuIDIwMTEKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBBQlNUUkFDVFBST0NFU1NPUlVOSVRfSF8KKyNkZWZpbmUgQUJTVFJBQ1RQUk9DRVNTT1JVTklUX0hfCisKKyNpbmNsdWRlIDxjb21tb24vUnVubmFibGVFbGVtZW50Lmg+CisjaW5jbHVkZSA8ZmFtL2FwaS9JUHJvY2Vzc29yVW5pdFRlc3QuaD4KKyNpbmNsdWRlIDxmYW0vYXBpL1Byb2Nlc3NvclVuaXRBdXRvUmVnaXN0cmF0aW9uLmg+CisKKyNpbmNsdWRlIDxjb21wdXRlci9FdmFsdWF0aW9uRW52aXJvbm1lbnQuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkNvbnRleHQuaD4KKworI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9XT2JqZWN0Lmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK3R5cGVkZWYgYXZtX3VpbnQ4X3QgIGF2bV9jb21wdXRpbmdfcHJvY2Vzc19zdGFnZV90OworCitlbnVtIHsKKwlBVk1fVU5ERUZJTkVEX1NUQUdFICAgICAgICAgICAgPSAweDAwMDAsCisKKwlBVk1fUFJFX1BST0NFU1NJTkdfU1RBR0UgICAgICAgPSAweDAwMDEsCisJQVZNX1BPU1RfUFJPQ0VTU0lOR19TVEFHRSAgICAgID0gMHgwMDAyLAorCisJQVZNX1BSRVBPU1RfUFJPQ0VTU0lOR19TVEFHRSAgID0gQVZNX1BSRV9QUk9DRVNTSU5HX1NUQUdFCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQVZNX1BPU1RfUFJPQ0VTU0lOR19TVEFHRSwKKworCUFWTV9QUkVfRklMVEVSSU5HX1NUQUdFICAgICAgICA9IDB4MDAwNCwKKwlBVk1fUE9TVF9GSUxURVJJTkdfU1RBR0UgICAgICAgPSAweDAwMDgsCisKKwlBVk1fUFJFUE9TVF9GSUxURVJJTkdfU1RBR0UgICAgPSBBVk1fUFJFX0ZJTFRFUklOR19TVEFHRQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFWTV9QT1NUX0ZJTFRFUklOR19TVEFHRSwKKworCUFWTV9DT01QVVRJTkdfQUxMX1NUQUdFICAgICAgICA9IEFWTV9QUkVQT1NUX1BST0NFU1NJTkdfU1RBR0UKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBVk1fUFJFUE9TVF9GSUxURVJJTkdfU1RBR0UsCisKKwlBVk1fQ09NUFVUSU5HX0NPTVBPU0lURV9TVEFHRSAgPSAweDAwMTAsCisKK307CisKKworCitjbGFzcyBXYWl0aW5nU3RyYXRlZ3k7CitjbGFzcyBBdm1QcmltaXRpdmVQcm9jZXNzb3I7CisKK2NsYXNzIEJ1aWxkZXI7CisKK2NsYXNzIENvbmZpZ3VyYXRpb247CisKK2NsYXNzIEV4ZWN1dGFibGVGb3JtOworY2xhc3MgRXhlY3V0aW9uQ29udGV4dDsKK2NsYXNzIEV4ZWN1dGlvblF1ZXVlOworCitjbGFzcyBNYWluUHJvY2Vzc29yVW5pdDsKKworY2xhc3MgU3ltYmV4RGlzcGF0Y2hlcjsKK2NsYXNzIFN5bWJleENvbnRyb2xsZXJSZXF1ZXN0TWFuYWdlcjsKK2NsYXNzIFN5bWJleENvbnRyb2xsZXJVbml0TWFuYWdlcjsKK2NsYXNzIFN5bWJleEVuZ2luZTsKK2NsYXNzIFN5bWJleEV2ZW50TWFuYWdlcjsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRk9STUFMIEFOQUxZU0lTIE1PRFVMRSBQT0lOVEVSCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjbGFzcyBBYnN0cmFjdFByb2Nlc3NvclVuaXQgOgorCQlwdWJsaWMgUnVubmFibGVFbGVtZW50ICwKKwkJcHVibGljIElQcm9jZXNzb3JVbml0VGVzdCAsCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggQWJzdHJhY3RQcm9jZXNzb3JVbml0ICkKK3sKKworcHVibGljOgorCS8qKgorCSAqIFBST0NFU1NPUiBGQUNUT1JZCisJICogZm9yIGF1dG9tYXRpYyByZWdpc3RyYXRpb24gaW4gdGhlIHByb2Nlc3NvciByZXBvc2l0b3J5CisJICovCisJdmlydHVhbCBjb25zdCBJUHJvY2Vzc29yVW5pdFJlZ2lzdHJhdGlvbiAmIFJFR0lTVEVSX1RPT0woKSBjb25zdCA9IDA7CisKKwlpbmxpbmUgYm9vbCBpc1JlZ2lzdGVyVG9vbCgKKwkJCWNvbnN0IElQcm9jZXNzb3JVbml0UmVnaXN0cmF0aW9uICYgYVJlZ2lzdGVyVG9vbCkgY29uc3QKKwl7CisJCXJldHVybiggUkVHSVNURVJfVE9PTCgpLmlzRXF1YWxzKCBhUmVnaXN0ZXJUb29sICkgKTsKKwl9CisKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXIgJiBtQ29udHJvbGxlclVuaXRNYW5hZ2VyOworCisJRXZhbHVhdGlvbkVudmlyb25tZW50IEVOVjsKKworCWF2bV9jb21wdXRpbmdfcHJvY2Vzc19zdGFnZV90IG1Db21wdXRpbmdTdGFnZVJlcXVpcmVkOworCWF2bV9jb21wdXRpbmdfcHJvY2Vzc19zdGFnZV90IG1Db21wdXRpbmdTdGFnZUVuYWJsZWQ7CisKKwlib29sIG1BdXRvQ29uZmlndXJlOworCWJvb2wgbUF1dG9TdGFydDsKKworCWF2bV91aW50OF90IG1QcmVjZWRlbmNlT2ZQcmVQcm9jZXNzOworCWF2bV91aW50OF90IG1QcmVjZWRlbmNlT2ZQb3N0UHJvY2VzczsKKworCWF2bV91aW50OF90IG1QcmVjZWRlbmNlT2ZJbml0RmlsdGVyOworCisJYXZtX3VpbnQ4X3QgbVByZWNlZGVuY2VPZlByZUZpbHRlcjsKKwlhdm1fdWludDhfdCBtUHJlY2VkZW5jZU9mUG9zdEZpbHRlcjsKKworCWF2bV9zaXplX3QgbUJlZ2lubmluZ1N0ZXBUaW1vdXQ7CisKKwlhdm1fc2l6ZV90IG1TbGljZUNvdW50OworCisJLy8gRm9yIGV2YWwgLyByZXBvcnQgVHJhY2UgZm9ybWF0CisJc3RkOjpzdHJpbmcgbVByZUV2YWxUcmFjZUZvcm1hdHRlcjsKKwlzdGQ6OnN0cmluZyBtUG9zdEV2YWxUcmFjZUZvcm1hdHRlcjsKKworCXN0ZDo6c3RyaW5nIG1Cb3VuZEV2YWxUcmFjZUZvcm1hdHRlcjsKKwlzdGQ6OnN0cmluZyBtUmVwb3J0RXZhbFRyYWNlRm9ybWF0dGVyOworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIENvbXB1dGluZyBWYXJpYWJsZXMKKwlMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICogZWNRdWV1ZTsKKworCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQ6Oml0ZXJhdG9yIGVjUXVldWVJdDsKKwlMaXN0T2ZFeGVjdXRpb25Db250ZXh0OjppdGVyYXRvciBlY1F1ZXVlSXRFbmQ7CisKKwlFeGVjdXRpb25Db250ZXh0Ojpyd19jaGlsZF9pdGVyYXRvciBlY0NoaWxkSXQ7CisJRXhlY3V0aW9uQ29udGV4dDo6cndfY2hpbGRfaXRlcmF0b3IgZWNDaGlsZEl0RW5kOworCisKK3B1YmxpYzoKKwkvKgorCSAqIFByZWNlZGVuY2UgZm9yIHByb2Nlc3NvciwgYmFzZWQgb24gcmVzb3VyY2UgY29uc3VtcHRpb24sCisJICogdXNlZCB0byBvcmRlciBwcm9jZXNzb3IgaW4gdGhlIERpdmVyc2l0eSBwcm9jZXNzICEKKwkgKiBGb3IgaW5mbzogMCBmb3IgbWluaW11bSByZXNvdXJjZSByZXF1aXJlbWVudCByZXNlcnZlZCBieSBTVE9QIENSSVRFUklBIEZJTFRFUiwKKwkgKiBhbmQgMjU1IG1heGltdW0gdmFsdWUgZm9yIGV4YW1wbGUgUkVEVU5EQU5DWSBGSUxURVIKKwkgKiBEZWZhdWx0IHZhbHVlIGlzIHRoZSBtYXggIQorCSAqIFByb2Nlc3Npbmc6IHByZSAgPSAyNTUgICwgcG9zdCA9IDI1NQorCSAqIEZpbHRlcmluZyA6IGluaXQgPSAyNTUKKwkgKiBGaWx0ZXJpbmcgOiBwcmUgID0gMjU1ICAsIHBvc3QgPSAyNTUKKwkgKi8KKwlzdGF0aWMgY29uc3QgYXZtX3VpbnQ4X3QgREVGQVVMVF9QUkVDRURFTkNFX09GX1BST0NFU1NPUls1XTsKKworCXN0YXRpYyBjb25zdCBhdm1fdWludDhfdCBERUZBVUxUX1BSRUNFREVOQ0VfT0ZfTUFJTl9QUk9DRVNTT1JbNV07CisKKworCXN0YXRpYyBjb25zdCBhdm1fdWludDhfdCBQUkVDRURFTkNFX09GX0FDVElWRV9DT1ZFUkFHRV9QUk9DRVNTT1JbNV07CisKKwlzdGF0aWMgY29uc3QgYXZtX3VpbnQ4X3QgUFJFQ0VERU5DRV9PRl9QQVNTSVZFX0NPVkVSQUdFX1BST0NFU1NPUls1XTsKKworCisJc3RhdGljIGNvbnN0IGF2bV91aW50OF90IFBSRUNFREVOQ0VfT0ZfTUFJTl9QUk9DRVNTT1JbNV07CisKKwlzdGF0aWMgY29uc3QgYXZtX3VpbnQ4X3QgUFJFQ0VERU5DRV9PRl9FWFRFTkRFUl9QUk9DRVNTT1JbNV07CisKKwlzdGF0aWMgY29uc3QgYXZtX3VpbnQ4X3QgUFJFQ0VERU5DRV9PRl9SRURVTkRBTkNZWzVdOworCisKKwlzdGF0aWMgY29uc3QgYXZtX3VpbnQ4X3QgUFJFQ0VERU5DRV9PRl9UUkFOU0lUSU9OX0NPVkVSQUdFWzVdOworCisJc3RhdGljIGNvbnN0IGF2bV91aW50OF90IFBSRUNFREVOQ0VfT0ZfSElUX09SX0pVTVBbNV07CisKKworCXN0YXRpYyBjb25zdCBhdm1fdWludDhfdCBQUkVDRURFTkNFX09GX0ZPUk1VTEFfQ09WRVJBR0VbNV07CisKKwlzdGF0aWMgY29uc3QgYXZtX3VpbnQ4X3QgUFJFQ0VERU5DRV9PRl9NQUNISU5FX0NPVkVSQUdFWzVdOworCisJc3RhdGljIGNvbnN0IGF2bV91aW50OF90IFBSRUNFREVOQ0VfT0ZfVEVTVF9PRkZMSU5FWzVdOworCisKKwlzdGF0aWMgY29uc3QgYXZtX3VpbnQ4X3QgREVGQVVMVF9QUkVDRURFTkNFX09GX1NFUklBTElaRVJfUFJPQ0VTU09SWzVdOworCisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlBYnN0cmFjdFByb2Nlc3NvclVuaXQoCisJCQlTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXIgJiBhTWFuYWdlciwgV09iamVjdCAqIHdmUGFyYW1ldGVyT2JqZWN0LAorCQkJYXZtX2NvbXB1dGluZ19wcm9jZXNzX3N0YWdlX3QgcmVxdWlyZWRTdGFnZSwKKwkJCWNvbnN0IGF2bV91aW50OF90ICogYVByZWNlZGVuY2UgPSBERUZBVUxUX1BSRUNFREVOQ0VfT0ZfUFJPQ0VTU09SKTsKKworCUFic3RyYWN0UHJvY2Vzc29yVW5pdCgKKwkJCVN5bWJleENvbnRyb2xsZXJVbml0TWFuYWdlciAmIGFNYW5hZ2VyLCBXT2JqZWN0ICogd2ZQYXJhbWV0ZXJPYmplY3QsCisJCQljb25zdCBhdm1fdWludDhfdCAqIGFQcmVjZWRlbmNlID0gREVGQVVMVF9QUkVDRURFTkNFX09GX1BST0NFU1NPUik7CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIE90aGVyCisJICovCisJQWJzdHJhY3RQcm9jZXNzb3JVbml0KGNsYXNzX2tpbmRfdCBhQ2xhc3NLaW5kLAorCQkJU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyICYgYU1hbmFnZXIsIFdPYmplY3QgKiB3ZlBhcmFtZXRlck9iamVjdCk7CisKKwlBYnN0cmFjdFByb2Nlc3NvclVuaXQoY2xhc3Nfa2luZF90IGFDbGFzc0tpbmQsIFN5bWJleEVuZ2luZSAmIGFuRW5naW5lLAorCQkJU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyICYgYU1hbmFnZXIsIFdPYmplY3QgKiB3ZlBhcmFtZXRlck9iamVjdCk7CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5BYnN0cmFjdFByb2Nlc3NvclVuaXQoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBHRVRURVJTCisJICogbVByZWNlZGVuY2VPZlByZVByb2Nlc3MKKwkgKiBtUHJlY2VkZW5jZU9mUG9zdFByb2Nlc3MKKwkgKi8KKwlhdm1fdWludDhfdCBnZXRQcmVjZWRlbmNlT2ZQcmVQcm9jZXNzKCkgY29uc3QKKwl7CisJCXJldHVybiBtUHJlY2VkZW5jZU9mUHJlUHJvY2VzczsKKwl9CisKKwlhdm1fdWludDhfdCBnZXRQcmVjZWRlbmNlT2ZQb3N0UHJvY2VzcygpIGNvbnN0CisJeworCQlyZXR1cm4gbVByZWNlZGVuY2VPZlBvc3RQcm9jZXNzOworCX0KKworCS8qKgorCSAqIEdFVFRFUlMKKwkgKiBtUHJlY2VkZW5jZU9mSW5pdEZpbHRlcgorCSAqIG1QcmVjZWRlbmNlT2ZQcmVGaWx0ZXIKKwkgKiBtUHJlY2VkZW5jZU9mUG9zdEZpbHRlcgorCSAqLworCWF2bV91aW50OF90IGdldFByZWNlZGVuY2VPZkluaXRGaWx0ZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuIG1QcmVjZWRlbmNlT2ZJbml0RmlsdGVyOworCX0KKworCWF2bV91aW50OF90IGdldFByZWNlZGVuY2VPZlByZUZpbHRlcigpIGNvbnN0CisJeworCQlyZXR1cm4gbVByZWNlZGVuY2VPZlByZUZpbHRlcjsKKwl9CisKKwlhdm1fdWludDhfdCBnZXRQcmVjZWRlbmNlT2ZQb3N0RmlsdGVyKCkgY29uc3QKKwl7CisJCXJldHVybiBtUHJlY2VkZW5jZU9mUG9zdEZpbHRlcjsKKwl9CisKKworCS8qKgorCSAqIG5ldyBsb2NhbCBFeGVjdXRhYmxlRm9ybSBmb3IgUHJvY2Vzc29yVCB1c2FnZQorCSAqLworCUV4ZWN1dGFibGVGb3JtICogbmV3TG9jYWxFeGVjdXRhYmxlRm9ybSgpOworCisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBtUHJvY2Vzc29yTWFuYWdlcgorCSAqLworCWlubGluZSBTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXIgJiBnZXRDb250cm9sbGVyVW5pdE1hbmFnZXIoKQorCXsKKwkJcmV0dXJuKCBtQ29udHJvbGxlclVuaXRNYW5hZ2VyICk7CisJfQorCisJaW5saW5lIGNvbnN0IFN5bWJleENvbnRyb2xsZXJVbml0TWFuYWdlciAmIGdldENvbnRyb2xsZXJVbml0TWFuYWdlcigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Db250cm9sbGVyVW5pdE1hbmFnZXIgKTsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBTeW1iZXhFbmdpbmUKKwkgKiBDb25maWd1cmF0aW9uCisJICogU3ltYmV4RGlzcGF0Y2hlcgorCSAqCisJICovCisJU3ltYmV4RW5naW5lICYgZ2V0U3ltYmV4RW5naW5lKCkgY29uc3Q7CisKKwlDb25maWd1cmF0aW9uICYgZ2V0Q29uZmlndXJhdGlvbigpIGNvbnN0OworCisJU3ltYmV4RGlzcGF0Y2hlciAmIGdldFN5bWJleERpc3BhdGNoZXIoKSBjb25zdDsKKworCVN5bWJleEV2ZW50TWFuYWdlciAmIGdldFN5bWJleEV2ZW50TWFuYWdlcigpIGNvbnN0OworCisJU3ltYmV4Q29udHJvbGxlclJlcXVlc3RNYW5hZ2VyICYgZ2V0U3ltYmV4UmVxdWVzdE1hbmFnZXIoKSBjb25zdDsKKworCisvLwkvKioKKy8vCSAqIEdFVFRFUgorLy8JICogbVByb2Nlc3Nvck1hbmFnZXIKKy8vCSAqLworLy8JTWFpblByb2Nlc3NvclVuaXQgJiBnZXRNYWluUHJvY2Vzc29yKCk7CisvLworLy8JY29uc3QgTWFpblByb2Nlc3NvclVuaXQgJiBnZXRNYWluUHJvY2Vzc29yKCkgY29uc3Q7CisvLworLy8KKy8vCS8qKgorLy8JICogR0VUVEVSCisvLwkgKiB0aGUgQnVpbGRlcgorLy8JICovCisvLwlCdWlsZGVyICYgZ2V0QnVpbGRlcigpOworLy8KKy8vCS8qKgorLy8JICogR0VUVEVSCisvLwkgKiBBdm1QcmltaXRpdmVQcm9jZXNzb3IKKy8vCSAqLworLy8JQXZtUHJpbWl0aXZlUHJvY2Vzc29yICYgZ2V0UHJpbWl0aXZlUHJvY2Vzc29yKCk7CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIHRoZUV4ZWN1dGlvblF1ZXVlCisJICovCisJRXhlY3V0aW9uUXVldWUgJiBnZXRFeGVjdXRpb25RdWV1ZSgpOworCisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBFdmFsdWF0aW9uRW52aXJvbm1lbnQgRU5WCisJICovCisJaW5saW5lIEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIGdldEVOVigpCisJeworCQlyZXR1cm4oIEVOViApOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBQTFVHSU4gUFJPQ0VTU09SIEtJTkQKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJLyoqCisJICogR0VUVEVSCisJICogbUF1dG9Db25maWd1cmUKKwkgKi8KKwlpbmxpbmUgYm9vbCBpc0F1dG9Db25maWd1cmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQXV0b0NvbmZpZ3VyZSApOworCX0KKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1Db21wdXRpbmdTdGFnZUVuYWJsZWQKKwkgKi8KKyNkZWZpbmUgRElTQUJMRV9QTFVHSU4oIGtpbmQgLCBGTEFHICkgIGtpbmQgJj0gKCB+ICggRkxBRyApICkKKworI2RlZmluZSBFTkFCTEVfUExVR0lOKCBraW5kICwgRkxBRyApICAga2luZCB8PSAoIEZMQUcgKQorCisKKyNkZWZpbmUgSVNfRElTQUJMRV9QTFVHSU4oIGtpbmQgLCBGTEFHICkgICAgICAgICggKGtpbmQgJiAoIEZMQUcgKSkgPT0gMCApCisKKyNkZWZpbmUgSVNfRU5BQkxFX1BMVUdJTigga2luZCAsIEZMQUcgKSAgICAgICAgICggKGtpbmQgJiAoIEZMQUcgKSkgIT0gMCApCisKKyNkZWZpbmUgSVNfU1RST05HX0VOQUJMRV9QTFVHSU4oIGtpbmQgLCBGTEFHICkgICggKGtpbmQgJiAoIEZMQUcgKSkgPT0gKCBGTEFHICkgKQorCisKKwlpbmxpbmUgdm9pZCBlbmFibGVQbHVnaW4oYXZtX2NvbXB1dGluZ19wcm9jZXNzX3N0YWdlX3QgcmVxdWlyZWRTdGFnZSwKKwkJCWJvb2wgYkVuYWJsZWQgPSB0cnVlKQorCXsKKwkJaWYoIGJFbmFibGVkICkKKwkJeworCQkJRU5BQkxFX1BMVUdJTiggbUNvbXB1dGluZ1N0YWdlRW5hYmxlZCAsIHJlcXVpcmVkU3RhZ2UgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCURJU0FCTEVfUExVR0lOKCBtQ29tcHV0aW5nU3RhZ2VFbmFibGVkICwgcmVxdWlyZWRTdGFnZSApOworCQl9CisJfQorCisJaW5saW5lIGJvb2wgaXNEaXNhYmxlUGx1Z2luKCkgY29uc3QKKwl7CisJCXJldHVybiggbUNvbXB1dGluZ1N0YWdlRW5hYmxlZCA9PSBBVk1fVU5ERUZJTkVEX1NUQUdFICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNFbmFibGVQbHVnaW4oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQ29tcHV0aW5nU3RhZ2VFbmFibGVkICE9IEFWTV9VTkRFRklORURfU1RBR0UgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc0Rpc2FibGVQbHVnaW4oCisJCQlhdm1fY29tcHV0aW5nX3Byb2Nlc3Nfc3RhZ2VfdCByZXF1aXJlZFN0YWdlKSBjb25zdAorCXsKKwkJcmV0dXJuKCBJU19ESVNBQkxFX1BMVUdJTigKKwkJCQltQ29tcHV0aW5nU3RhZ2VFbmFibGVkLCByZXF1aXJlZFN0YWdlKSApOworCX0KKworCWlubGluZSBib29sIGlzRW5hYmxlUGx1Z2luKAorCQkJYXZtX2NvbXB1dGluZ19wcm9jZXNzX3N0YWdlX3QgcmVxdWlyZWRTdGFnZSkgY29uc3QKKwl7CisJCXJldHVybiggSVNfU1RST05HX0VOQUJMRV9QTFVHSU4oCisJCQkJbUNvbXB1dGluZ1N0YWdlRW5hYmxlZCwgcmVxdWlyZWRTdGFnZSkgKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBQUkUgUFJPQ0VTUworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlubGluZSB2b2lkIGVuYWJsZVByZXByb2Nlc3MoYm9vbCBiRW5hYmxlZCA9IHRydWUpCisJeworCQllbmFibGVQbHVnaW4oIEFWTV9QUkVfUFJPQ0VTU0lOR19TVEFHRSAsIGJFbmFibGVkICk7CisJfQorCisJdm9pZCBlbmFibGVQcmVwcm9jZXNzKEFic3RyYWN0UHJvY2Vzc29yVW5pdCAqIGFQcm9jZXNzb3IpOworCisJaW5saW5lIGJvb2wgaXNEaXNhYmxlUHJlcHJvY2VzcygpIGNvbnN0CisJeworCQlyZXR1cm4oIElTX0RJU0FCTEVfUExVR0lOKAorCQkJCW1Db21wdXRpbmdTdGFnZUVuYWJsZWQsIEFWTV9QUkVfUFJPQ0VTU0lOR19TVEFHRSkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc0VuYWJsZVByZXByb2Nlc3MoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBJU19TVFJPTkdfRU5BQkxFX1BMVUdJTigKKwkJCQltQ29tcHV0aW5nU3RhZ2VFbmFibGVkLCBBVk1fUFJFX1BST0NFU1NJTkdfU1RBR0UpICk7CisJfQorCisKKwkvLyBQT1NUIFBST0NFU1MKKwlpbmxpbmUgdm9pZCBlbmFibGVQb3N0cHJvY2Vzcyhib29sIGJFbmFibGVkID0gdHJ1ZSkKKwl7CisJCWVuYWJsZVBsdWdpbiggQVZNX1BPU1RfUFJPQ0VTU0lOR19TVEFHRSAsIGJFbmFibGVkICk7CisJfQorCisJdm9pZCBlbmFibGVQb3N0cHJvY2VzcyhBYnN0cmFjdFByb2Nlc3NvclVuaXQgKiBhUHJvY2Vzc29yKTsKKworCWlubGluZSBib29sIGlzRW5hYmxlUG9zdHByb2Nlc3MoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBJU19TVFJPTkdfRU5BQkxFX1BMVUdJTigKKwkJCQltQ29tcHV0aW5nU3RhZ2VFbmFibGVkLCBBVk1fUE9TVF9QUk9DRVNTSU5HX1NUQUdFKSApOworCX0KKworCWlubGluZSBib29sIGlzRGlzYWJsZVBvc3Rwcm9jZXNzKCkgY29uc3QKKwl7CisJCXJldHVybiggSVNfRElTQUJMRV9QTFVHSU4oCisJCQkJbUNvbXB1dGluZ1N0YWdlRW5hYmxlZCwgQVZNX1BPU1RfUFJPQ0VTU0lOR19TVEFHRSkgKTsKKwl9CisKKworCS8vIFBST0NFU1MKKwlpbmxpbmUgdm9pZCBlbmFibGVQcm9jZXNzKGJvb2wgYkVuYWJsZWQpCisJeworCQllbmFibGVQbHVnaW4oIEFWTV9QUkVQT1NUX1BST0NFU1NJTkdfU1RBR0UgLCBiRW5hYmxlZCApOworCX0KKworCWlubGluZSBib29sIGlzU3Ryb25nRGlzYWJsZVByb2Nlc3MoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBJU19ESVNBQkxFX1BMVUdJTigKKwkJCQltQ29tcHV0aW5nU3RhZ2VFbmFibGVkLCBBVk1fUFJFUE9TVF9QUk9DRVNTSU5HX1NUQUdFKSApOworCX0KKworCisJaW5saW5lIGJvb2wgaXNTdHJvbmdFbmFibGVQcm9jZXNzKCkgY29uc3QKKwl7CisJCXJldHVybiggSVNfU1RST05HX0VOQUJMRV9QTFVHSU4oCisJCQkJbUNvbXB1dGluZ1N0YWdlRW5hYmxlZCwgQVZNX1BSRVBPU1RfUFJPQ0VTU0lOR19TVEFHRSkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc1dlYWtFbmFibGVQcm9jZXNzKCkgY29uc3QKKwl7CisJCXJldHVybiggSVNfRU5BQkxFX1BMVUdJTigKKwkJCQltQ29tcHV0aW5nU3RhZ2VFbmFibGVkLCBBVk1fUFJFUE9TVF9QUk9DRVNTSU5HX1NUQUdFKSApOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFBSRSBGSUxURVIKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlpbmxpbmUgdm9pZCBlbmFibGVQcmVmaWx0ZXIoYm9vbCBiRW5hYmxlZCA9IHRydWUpCisJeworCQllbmFibGVQbHVnaW4oIEFWTV9QUkVfRklMVEVSSU5HX1NUQUdFICwgYkVuYWJsZWQgKTsKKwl9CisKKwl2b2lkIGVuYWJsZVByZWZpbHRlcihBYnN0cmFjdFByb2Nlc3NvclVuaXQgKiBhUHJvY2Vzc29yKTsKKworCWlubGluZSBib29sIGlzRGlzYWJsZVByZWZpbHRlcigpIGNvbnN0CisJeworCQlyZXR1cm4oIElTX0RJU0FCTEVfUExVR0lOKAorCQkJCW1Db21wdXRpbmdTdGFnZUVuYWJsZWQsIEFWTV9QUkVfRklMVEVSSU5HX1NUQUdFKSApOworCX0KKworCWlubGluZSBib29sIGlzRW5hYmxlUHJlZmlsdGVyKCkgY29uc3QKKwl7CisJCXJldHVybiggSVNfU1RST05HX0VOQUJMRV9QTFVHSU4oCisJCQkJbUNvbXB1dGluZ1N0YWdlRW5hYmxlZCwgQVZNX1BSRV9GSUxURVJJTkdfU1RBR0UpICk7CisJfQorCisKKworCS8vIFBPU1QgRklMVEVSCisJaW5saW5lIHZvaWQgZW5hYmxlUG9zdGZpbHRlcihib29sIGJFbmFibGVkID0gdHJ1ZSkKKwl7CisJCWVuYWJsZVBsdWdpbiggQVZNX1BPU1RfRklMVEVSSU5HX1NUQUdFICwgYkVuYWJsZWQgKTsKKwl9CisKKwl2b2lkIGVuYWJsZVBvc3RmaWx0ZXIoQWJzdHJhY3RQcm9jZXNzb3JVbml0ICogYVByb2Nlc3Nvcik7CisKKwlpbmxpbmUgYm9vbCBpc0VuYWJsZVBvc3RmaWx0ZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBJU19TVFJPTkdfRU5BQkxFX1BMVUdJTigKKwkJCQltQ29tcHV0aW5nU3RhZ2VFbmFibGVkLCBBVk1fUE9TVF9GSUxURVJJTkdfU1RBR0UpICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNEaXNhYmxlUG9zdGZpbHRlcigpIGNvbnN0CisJeworCQlyZXR1cm4oIElTX0RJU0FCTEVfUExVR0lOKAorCQkJCW1Db21wdXRpbmdTdGFnZUVuYWJsZWQsIEFWTV9QT1NUX0ZJTFRFUklOR19TVEFHRSkgKTsKKwl9CisKKworCisJLy8gRklMVEVSCisJaW5saW5lIHZvaWQgZW5hYmxlRmlsdGVyKGJvb2wgYkVuYWJsZWQpCisJeworCQllbmFibGVQbHVnaW4oIEFWTV9QUkVQT1NUX0ZJTFRFUklOR19TVEFHRSAsIGJFbmFibGVkICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNEaXNhYmxlRmlsdGVyKCkgY29uc3QKKwl7CisJCXJldHVybiggSVNfRElTQUJMRV9QTFVHSU4oCisJCQkJbUNvbXB1dGluZ1N0YWdlRW5hYmxlZCwgQVZNX1BSRVBPU1RfRklMVEVSSU5HX1NUQUdFKSApOworCX0KKworCWlubGluZSBib29sIGlzU3Ryb25nRW5hYmxlRmlsdGVyKCkgY29uc3QKKwl7CisJCXJldHVybiggSVNfU1RST05HX0VOQUJMRV9QTFVHSU4oCisJCQkJbUNvbXB1dGluZ1N0YWdlRW5hYmxlZCwgQVZNX1BSRVBPU1RfRklMVEVSSU5HX1NUQUdFKSApOworCX0KKworCWlubGluZSBib29sIHJlcXVpcmVzU3Ryb25nRW5hYmxlRmlsdGVyKCkgY29uc3QKKwl7CisJCXJldHVybiggSVNfU1RST05HX0VOQUJMRV9QTFVHSU4oCisJCQkJbUNvbXB1dGluZ1N0YWdlUmVxdWlyZWQsIEFWTV9QUkVQT1NUX0ZJTFRFUklOR19TVEFHRSkgKTsKKwl9CisKKworCWlubGluZSBib29sIGlzV2Vha0VuYWJsZUZpbHRlcigpIGNvbnN0CisJeworCQlyZXR1cm4oIElTX0VOQUJMRV9QTFVHSU4oCisJCQkJbUNvbXB1dGluZ1N0YWdlRW5hYmxlZCwgQVZNX1BSRVBPU1RfRklMVEVSSU5HX1NUQUdFKSApOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBQTFVHSU4gUFJPQ0VTU09SIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkvKioKKwkgKiBGT1JNQVRURVIKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXREZWZhdWx0UHJlRXZhbFRyYWNlRm9ybWF0dGVyKCkgY29uc3QKKwl7CisJCXJldHVybiggIiIgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXREZWZhdWx0UG9zdEV2YWxUcmFjZUZvcm1hdHRlcigpIGNvbnN0CisJeworCQlyZXR1cm4oICIiICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXREZWZhdWx0Qm91bmRFdmFsVHJhY2VGb3JtYXR0ZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAiIiApOworCX0KKworCWlubGluZSB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldERlZmF1bHRSZXBvcnRFdmFsVHJhY2VGb3JtYXR0ZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAiIiApOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIENPTkZJR1VSRSBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwl2aXJ0dWFsIGJvb2wgcHJlQ29uZmlndXJlKCk7CisKKwl2aXJ0dWFsIGJvb2wgY29uZmlndXJlKCk7CisKKwl2aXJ0dWFsIGJvb2wgY29uZmlndXJlSW1wbCgpID0gMDsKKworCisJYm9vbCBjb25maWd1cmVDb21tb24oKTsKKworCWJvb2wgY29uZmlndXJlTG9nKCk7CisKKwlib29sIGNoZWNraW5nQ29uZmlndXJhdGlvbigpOworCisJLyoqCisJICogQVBJCisJICogQXV0byBjb25maWd1cmUgTW9kZWwgT2YgRXhlY3V0aW9uIGluIENQVQorCSAqLworCXZpcnR1YWwgYm9vbCBhdXRvQ29uZmlndXJlTU9FKCk7CisKKwl2aXJ0dWFsIGJvb2wgYXV0b0NvbmZpZ3VyZU1PRUltcGwoKTsvLyA9IDA7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBJTklUIC8gRVhJVCAgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJdmlydHVhbCBib29sIGluaXRJbXBsKCkKKwl7CisJCS8vISEgTk9USElORworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwl2aXJ0dWFsIGJvb2wgZXhpdEltcGwoKQorCXsKKwkJLy8hISBOT1RISU5HCisJCXJldHVybiB0cnVlOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIEZJTFRFUklORyBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlpbmxpbmUgdmlydHVhbCBib29sIGZpbHRlcmluZ0luaXRpYWxpemUoKQorCXsKKwkJLy8hISBOT1RISU5HCisJCXJldHVybiggdHJ1ZSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGJvb2wgZmlsdGVyaW5nRmluYWxpemUoKQorCXsKKwkJLy8hISBOT1RISU5HCisJCXJldHVybiggdHJ1ZSApOworCX0KKworCisJdmlydHVhbCBib29sIHByZWZpbHRlcigpOworCWlubGluZSB2aXJ0dWFsIGJvb2wgcHJlZmlsdGVyKEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKQorCXsKKwkJLy8hISBOT1RISU5HCisJCXJldHVybiggdHJ1ZSApOworCX0KKworCXZpcnR1YWwgYm9vbCBwb3N0ZmlsdGVyKCk7CisJaW5saW5lIHZpcnR1YWwgYm9vbCBwb3N0ZmlsdGVyKEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKQorCXsKKwkJLy8hISBOT1RISU5HCisJCXJldHVybiggdHJ1ZSApOworCX0KKworCisJLyoqCisJICogUkVQT1JUCisJICovCisJdm9pZCByZXBvcnRIZWFkZXIoT3V0U3RyZWFtICYgb3MsIGNvbnN0IHN0ZDo6c3RyaW5nICYgcHJvY2Vzc29yTmFtZSkgY29uc3Q7CisKKwl2aXJ0dWFsIHZvaWQgcmVwb3J0RGVmYXVsdChPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKKworCS8qKgorCSAqIEVWQUwgVFJBQ0UKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCB2b2lkIHRyYWNlUHJlRXZhbCgKKwkJCU91dFN0cmVhbSAmIG9zLCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQykgY29uc3QKKwl7CisJCUFWTV9WRVJCT1NJVFlfU1dJVENIX1NJTEVOVAorCisJCQl0cmFjZVNpbGVudFByZUV2YWwob3MsIGFuRUMpOworCisJCUFWTV9WRVJCT1NJVFlfU1dJVENIX0NBU0VfTUlOSU1VTQorCisJCQl0cmFjZU1pbmltdW1QcmVFdmFsKG9zLCBhbkVDKTsKKworCQlBVk1fVkVSQk9TSVRZX1NXSVRDSF9DQVNFX01FRElVTQorCisJCQl0cmFjZU1lZGl1bVByZUV2YWwob3MsIGFuRUMpOworCisJCUFWTV9WRVJCT1NJVFlfU1dJVENIX0NBU0VfTUFYSU1VTQorCisJCQl0cmFjZU1heGltdW1QcmVFdmFsKG9zLCBhbkVDKTsKKworCQlBVk1fVkVSQk9TSVRZX1NXSVRDSF9FTkQKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIHZvaWQgdHJhY2VTaWxlbnRQcmVFdmFsKAorCQkJT3V0U3RyZWFtICYgb3MsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKSBjb25zdAorCXsKKwkJLy8gU0lMRU5UID0+IE5PVEhJTkcKKwl9CisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHRyYWNlTWluaW11bVByZUV2YWwoCisJCQlPdXRTdHJlYW0gJiBvcywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpIGNvbnN0CisJeworCQl0cmFjZURlZmF1bHRQcmVFdmFsKG9zLCBhbkVDKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHRyYWNlTWVkaXVtUHJlRXZhbCgKKwkJCU91dFN0cmVhbSAmIG9zLCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQykgY29uc3QKKwl7CisJCXRyYWNlRGVmYXVsdFByZUV2YWwob3MsIGFuRUMpOworCX0KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgdHJhY2VNYXhpbXVtUHJlRXZhbCgKKwkJCU91dFN0cmVhbSAmIG9zLCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQykgY29uc3QKKwl7CisJCXRyYWNlRGVmYXVsdFByZUV2YWwob3MsIGFuRUMpOworCX0KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgdHJhY2VEZWZhdWx0UHJlRXZhbCgKKwkJCU91dFN0cmVhbSAmIG9zLCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQykgY29uc3QKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJaW5saW5lIHZpcnR1YWwgdm9pZCB0cmFjZVBvc3RFdmFsKAorCQkJT3V0U3RyZWFtICYgb3MsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKSBjb25zdAorCXsKKwkJQVZNX1ZFUkJPU0lUWV9TV0lUQ0hfU0lMRU5UCisKKwkJCXRyYWNlU2lsZW50UG9zdEV2YWwob3MsIGFuRUMpOworCisJCUFWTV9WRVJCT1NJVFlfU1dJVENIX0NBU0VfTUlOSU1VTQorCisJCQl0cmFjZU1pbmltdW1Qb3N0RXZhbChvcywgYW5FQyk7CisKKwkJQVZNX1ZFUkJPU0lUWV9TV0lUQ0hfQ0FTRV9NRURJVU0KKworCQkJdHJhY2VNZWRpdW1Qb3N0RXZhbChvcywgYW5FQyk7CisKKwkJQVZNX1ZFUkJPU0lUWV9TV0lUQ0hfQ0FTRV9NQVhJTVVNCisKKwkJCXRyYWNlTWF4aW11bVBvc3RFdmFsKG9zLCBhbkVDKTsKKworCQlBVk1fVkVSQk9TSVRZX1NXSVRDSF9FTkQKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIHZvaWQgdHJhY2VTaWxlbnRQb3N0RXZhbCgKKwkJCU91dFN0cmVhbSAmIG9zLCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQykgY29uc3QKKwl7CisJCS8vIFNJTEVOVCA9PiBOT1RISU5HCisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCB0cmFjZU1pbmltdW1Qb3N0RXZhbCgKKwkJCU91dFN0cmVhbSAmIG9zLCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQykgY29uc3QKKwl7CisJCXRyYWNlRGVmYXVsdFBvc3RFdmFsKG9zLCBhbkVDKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHRyYWNlTWVkaXVtUG9zdEV2YWwoCisJCQlPdXRTdHJlYW0gJiBvcywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpIGNvbnN0CisJeworCQl0cmFjZURlZmF1bHRQb3N0RXZhbChvcywgYW5FQyk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCB0cmFjZU1heGltdW1Qb3N0RXZhbCgKKwkJCU91dFN0cmVhbSAmIG9zLCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQykgY29uc3QKKwl7CisJCXRyYWNlRGVmYXVsdFBvc3RFdmFsKG9zLCBhbkVDKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHRyYWNlRGVmYXVsdFBvc3RFdmFsKAorCQkJT3V0U3RyZWFtICYgb3MsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKSBjb25zdAorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHRyYWNlQm91bmRFdmFsKE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCByZXBvcnRFdmFsKE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gUFJPQ0VTU09SIFJFUVVFU1QgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJLyoqCisJICogU1RPUCAgfCBSRUxFQVNFCisJICogUkVTRVQgfCBSRVNUQVJUIHwgQ09OVElOVUUKKwkgKiBSRVFVRVVFX1dBSVRJTkcgfCBSRVFVRVVFX1JFU0VSVkUKKwkgKiBIRVVSSVNUSUMgfCBHT0FMX0FDSElFVkVECisJICovCisJaW5saW5lIHZpcnR1YWwgdm9pZCBoYW5kbGVSZXF1ZXN0U3RvcCgpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIGhhbmRsZVJlcXVlc3RSZWxlYXNlKCkKKwl7CisJCVJ1bm5hYmxlRWxlbWVudDo6c2V0TGlmZWN5Y2xlUmVsZWFzZWQoKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIHZvaWQgaGFuZGxlUmVxdWVzdFJlc2V0KCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgaGFuZGxlUmVxdWVzdFJlc3RhcnQoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCBoYW5kbGVSZXF1ZXN0Q29udGludWUoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvLyB0aGUgV2FpdGluZyBRdWV1ZSBUYWJsZQorCWlubGluZSB2aXJ0dWFsIHZvaWQgaGFuZGxlUmVxdWVzdFJlcXVldWVXYWl0aW5nVGFibGUoCisJCQlXYWl0aW5nU3RyYXRlZ3kgJiBhV2FpdGluZ1N0cmF0ZWd5LAorCQkJYXZtX3VpbnQ4X3QgYVdlaWdodE1pbiwgYXZtX3VpbnQ4X3QgYVdlaWdodE1heCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCXZpcnR1YWwgdm9pZCBoYW5kbGVSZXF1ZXN0UmVxdWV1ZVJlc2VydmVUYWJsZSgKKwkJCVdhaXRpbmdTdHJhdGVneSAmIGFXYWl0aW5nU3RyYXRlZ3ksCisJCQlMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgYVJlc2VydmVRdWV1ZSwKKwkJCWF2bV91aW50OF90IGFXZWlnaHRNaW4sIGF2bV91aW50OF90IGFXZWlnaHRNYXgpOworCisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIGhhbmRsZVJlcXVlc3RIZXVyaXN0aWMoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIGhhbmRsZVJlcXVlc3RHb2FsQWNoaWV2ZWQoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gUkVNT1ZFIEVDIFRPT0xTCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJYXZtX3NpemVfdCByZW1vdmUoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMsCisJCQlPdXRTdHJlYW0gJiBsb2dnZXIgPSBBVk1fT1NfVFJBQ0UsIGNvbnN0IHN0ZDo6c3RyaW5nICYgbXNnID0gIiIpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gRklOQUwgU0xJQ0lORyBUT09MUworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwl2aXJ0dWFsIGJvb2wgaXNTbGljZWFibGVDb250ZXh0KEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKSBjb25zdDsKKworCXZvaWQgY29tcHV0ZUxlYWZFQyhjb25zdCBMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgbGlzdE9mRUMsCisJCQlMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgbGlzdE9mTGVhZkVDKTsKKworCXZvaWQgc2xpY2UoTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGxpc3RPZkxlYWZFQyk7CisKKwl2b2lkIHNsaWNlKExpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBsaXN0T2ZMZWFmRUMsCisJCQlFeGVjdXRpb25Db250ZXh0ICogbGVhZkVDKTsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFNFUklBTElaQVRJT04gQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJdmlydHVhbCBzdGQ6OnN0cmluZyBzdHJUeXBlSWQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBPU1MoKSA8PCAiW3A6IiA8PCAoaW50KW1QcmVjZWRlbmNlT2ZQcmVQcm9jZXNzIDw8ICddJworCQkJCTw8ICggKG1QYXJhbWV0ZXJXT2JqZWN0ID09IFdPYmplY3Q6Ol9OVUxMXykKKwkJCQkJCT8gImZxbjxwcm9jZXNzI3Vua25vd24+IgorCQkJCQkJOiBtUGFyYW1ldGVyV09iamVjdC0+aGFzUXVhbGlmaWVkVHlwZU5hbWVJRCgpCisJCQkJCQkJCT8gbVBhcmFtZXRlcldPYmplY3QtPmdldFF1YWxpZmllZFR5cGVOYW1lSUQoKQorCQkJCQkJCQk6IG1QYXJhbWV0ZXJXT2JqZWN0LT5zdHJVbmlxSWQoKSApICk7CisJfQorCisJdmlydHVhbCBzdGQ6OnN0cmluZyBzdHJVbmlxSWQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBPU1MoKSA8PCAiW3A6IiA8PCAoaW50KW1QcmVjZWRlbmNlT2ZQcmVQcm9jZXNzIDw8ICddJworCQkJCTw8ICggKG1QYXJhbWV0ZXJXT2JqZWN0ID09IE5VTEwpCisJCQkJCQk/IHN0ckZRTigibnVsbDxXT2JqZWN0PiIpCisJCQkJCQk6IG1QYXJhbWV0ZXJXT2JqZWN0LT5zdHJGUU4oIjx1bmFtZWQtZmFtPiIpICkgKTsKKwl9CisKKwl2aXJ0dWFsIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQlpZiggbVBhcmFtZXRlcldPYmplY3QgIT0gTlVMTCApCisJCXsKKwkJCW1QYXJhbWV0ZXJXT2JqZWN0LT50b1N0cmVhbShvcyk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlvcyA8PCBUQUIgPDwgIm51bGw8V09iamVjdCBhcyBQYXJhbWV0ZXI+IiA8PCBFT0w7CisJCX0KKwl9CisKK307CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEZPUk1BTCBBTkFMWVNJUyBNT0RVTEUgU01BUlQgUE9JTlRFUgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY2xhc3MgRkFNIDoKKwkJcHVibGljIFNtYXJ0UG9pbnRlcjwgQWJzdHJhY3RQcm9jZXNzb3JVbml0ICwgRGVzdHJveUVsZW1lbnRQb2xpY3kgPiwKKwkJQVZNX0lOSkVDVF9JTlNUQU5DRV9DT1VOVEVSX0NMQVNTKCBGQU0gKQoreworCitwcml2YXRlOgorCS8qKgorCSAqIFRZUEVERUYKKwkgKi8KKwl0eXBlZGVmIFNtYXJ0UG9pbnRlcjwgQWJzdHJhY3RQcm9jZXNzb3JVbml0ICwKKwkJCQkJCQlEZXN0cm95RWxlbWVudFBvbGljeSA+ICBiYXNlX3RoaXNfdHlwZTsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJRkFNKCkKKwk6IGJhc2VfdGhpc190eXBlKCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlleHBsaWNpdCBGQU0oQWJzdHJhY3RQcm9jZXNzb3JVbml0ICogYUZBTSkKKwk6IGJhc2VfdGhpc190eXBlKCBhRkFNICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworcHVibGljOgorCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5GQU0oKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBDT01QVVRJTkcgU1RBR0UgRU5BQkxFRCBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlpbmxpbmUgdm9pZCBlbmFibGVQbHVnaW4oCisJCQlhdm1fY29tcHV0aW5nX3Byb2Nlc3Nfc3RhZ2VfdCByZXF1aXJlZFN0YWdlLAorCQkJYm9vbCBiRW5hYmxlZCA9IHRydWUpCisJeworCQltUFRSLT5lbmFibGVQbHVnaW4ocmVxdWlyZWRTdGFnZSwgYkVuYWJsZWQpOworCX0KKworCWlubGluZSBib29sIGlzRGlzYWJsZVBsdWdpbigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1QVFItPmlzRGlzYWJsZVBsdWdpbigpICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNFbmFibGVQbHVnaW4oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUFRSLT5pc0VuYWJsZVBsdWdpbigpICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBpc0VuYWJsZVByZXByb2Nlc3MoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUFRSLT5pc0VuYWJsZVByZXByb2Nlc3MoKSApOworCX0KKworCWlubGluZSBib29sIGlzRW5hYmxlUG9zdHByb2Nlc3MoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUFRSLT5pc0VuYWJsZVBvc3Rwcm9jZXNzKCkgKTsKKwl9CisKKworCWlubGluZSBib29sIGlzRW5hYmxlUHJlZmlsdGVyKCkgY29uc3QKKwl7CisJCXJldHVybiggbVBUUi0+aXNFbmFibGVQcmVmaWx0ZXIoKSApOworCX0KKworCWlubGluZSBib29sIGlzRW5hYmxlUG9zdGZpbHRlcigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1QVFItPmlzRW5hYmxlUG9zdGZpbHRlcigpICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBpc1dlYWtFbmFibGVGaWx0ZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUFRSLT5pc1dlYWtFbmFibGVGaWx0ZXIoKSApOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIENPTkZJR1VSRSAgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJaW5saW5lIFdPYmplY3QgKiBnZXRQYXJhbWV0ZXJXT2JqZWN0KCkgY29uc3QKKwl7CisJCXJldHVybiBtUFRSLT5nZXRQYXJhbWV0ZXJXT2JqZWN0KCk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBjb25maWd1cmUoKQorCXsKKwkJcmV0dXJuIG1QVFItPmNvbmZpZ3VyZSgpOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIElOSVQgLyBFWElUICBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlpbmxpbmUgYm9vbCBpbml0KCkKKwl7CisJCXJldHVybiBtUFRSLT5pbml0KCk7CisJfQorCisJaW5saW5lIGJvb2wgZXhpdCgpCisJeworCQlyZXR1cm4gbVBUUi0+ZXhpdCgpOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vICggUFJFIC8gUE9TVCApIFBST0NFU1MgIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlubGluZSBib29sIHByZXByb2Nlc3MoKQorCXsKKwkJcmV0dXJuIG1QVFItPnByZXByb2Nlc3MoKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBwb3N0cHJvY2VzcygpCisJeworCQlyZXR1cm4gbVBUUi0+cG9zdHByb2Nlc3MoKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBGSUxURVJJTkcgIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlubGluZSBib29sIGZpbHRlcmluZ0luaXRpYWxpemUoKQorCXsKKwkJcmV0dXJuIG1QVFItPmZpbHRlcmluZ0luaXRpYWxpemUoKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBmaWx0ZXJpbmdGaW5hbGl6ZSgpCisJeworCQlyZXR1cm4gbVBUUi0+ZmlsdGVyaW5nRmluYWxpemUoKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyAoIFBSRSAvIFBPU1QgKSBGSUxURVIgIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlubGluZSBib29sIHByZWZpbHRlcigpCisJeworCQlyZXR1cm4gbVBUUi0+cHJlZmlsdGVyKCk7CisJfQorCisJaW5saW5lIGJvb2wgcHJlZmlsdGVyKEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKQorCXsKKwkJcmV0dXJuIG1QVFItPnByZWZpbHRlciggYW5FQyApOworCX0KKworCisJaW5saW5lIGJvb2wgcG9zdGZpbHRlcigpCisJeworCQlyZXR1cm4gbVBUUi0+cG9zdGZpbHRlcigpOworCX0KKworCWlubGluZSBib29sIHBvc3RmaWx0ZXIoRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpCisJeworCQlyZXR1cm4gbVBUUi0+cG9zdGZpbHRlciggYW5FQyApOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFJFUE9SVCBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlpbmxpbmUgdm9pZCByZXBvcnQoT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQltUFRSLT5yZXBvcnQoIG9zICk7CisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gVU5JVCBURVNUIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlubGluZSB2b2lkIHRkZFVuaXRSZXBvcnQoT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQltUFRSLT50ZGRVbml0UmVwb3J0KCBvcyApOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIE5PTi1SRUdSRVNTSU9OIFRFU1QgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJaW5saW5lIHZvaWQgdGRkUmVncmVzc2lvblJlcG9ydChPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCW1QVFItPnRkZFJlZ3Jlc3Npb25SZXBvcnQoIG9zICk7CisJfQorCisKKwkvKioKKwkgKiBSRVBPUlQKKwkgKi8KKwlpbmxpbmUgdm9pZCByZXBvcnRIZWFkZXIoCisJCQlPdXRTdHJlYW0gJiBvcywgY29uc3Qgc3RkOjpzdHJpbmcgJiBwcm9jZXNzb3JOYW1lKSBjb25zdAorCXsKKwkJbVBUUi0+cmVwb3J0SGVhZGVyKG9zLCBwcm9jZXNzb3JOYW1lKTsKKwl9CisKKworCS8qKgorCSAqIEVWQUwgVFJBQ0UKKwkgKi8KKwlpbmxpbmUgdm9pZCB0cmFjZVByZUV2YWwoCisJCQlPdXRTdHJlYW0gJiBvcywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpIGNvbnN0CisJeworCQltUFRSLT50cmFjZVByZUV2YWwob3MsIGFuRUMpOworCX0KKworCisJaW5saW5lIHZvaWQgdHJhY2VTaWxlbnRQcmVFdmFsKAorCQkJT3V0U3RyZWFtICYgb3MsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKSBjb25zdAorCXsKKwkJbVBUUi0+dHJhY2VTaWxlbnRQcmVFdmFsKG9zLCBhbkVDKTsKKwl9CisKKwlpbmxpbmUgdm9pZCB0cmFjZU1pbmltdW1QcmVFdmFsKAorCQkJT3V0U3RyZWFtICYgb3MsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKSBjb25zdAorCXsKKwkJbVBUUi0+dHJhY2VNaW5pbXVtUHJlRXZhbChvcywgYW5FQyk7CisJfQorCisJaW5saW5lIHZvaWQgdHJhY2VNZWRpdW1QcmVFdmFsKAorCQkJT3V0U3RyZWFtICYgb3MsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKSBjb25zdAorCXsKKwkJbVBUUi0+dHJhY2VNZWRpdW1QcmVFdmFsKG9zLCBhbkVDKTsKKwl9CisKKwlpbmxpbmUgdm9pZCB0cmFjZU1heGltdW1QcmVFdmFsKAorCQkJT3V0U3RyZWFtICYgb3MsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKSBjb25zdAorCXsKKwkJbVBUUi0+dHJhY2VNYXhpbXVtUHJlRXZhbChvcywgYW5FQyk7CisJfQorCisJaW5saW5lIHZvaWQgdHJhY2VEZWZhdWx0UHJlRXZhbCgKKwkJCU91dFN0cmVhbSAmIG9zLCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQykgY29uc3QKKwl7CisJCW1QVFItPnRyYWNlRGVmYXVsdFByZUV2YWwob3MsIGFuRUMpOworCX0KKworCisKKwlpbmxpbmUgdm9pZCB0cmFjZVBvc3RFdmFsKAorCQkJT3V0U3RyZWFtICYgb3MsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKSBjb25zdAorCXsKKwkJbVBUUi0+dHJhY2VQb3N0RXZhbChvcywgYW5FQyk7CisJfQorCisKKwlpbmxpbmUgdm9pZCB0cmFjZVNpbGVudFBvc3RFdmFsKAorCQkJT3V0U3RyZWFtICYgb3MsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKSBjb25zdAorCXsKKwkJbVBUUi0+dHJhY2VTaWxlbnRQb3N0RXZhbChvcywgYW5FQyk7CisJfQorCisJaW5saW5lIHZvaWQgdHJhY2VNaW5pbXVtUG9zdEV2YWwoCisJCQlPdXRTdHJlYW0gJiBvcywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpIGNvbnN0CisJeworCQltUFRSLT50cmFjZU1pbmltdW1Qb3N0RXZhbChvcywgYW5FQyk7CisJfQorCisJaW5saW5lIHZvaWQgdHJhY2VNZWRpdW1Qb3N0RXZhbCgKKwkJCU91dFN0cmVhbSAmIG9zLCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQykgY29uc3QKKwl7CisJCW1QVFItPnRyYWNlTWVkaXVtUG9zdEV2YWwob3MsIGFuRUMpOworCX0KKworCWlubGluZSB2b2lkIHRyYWNlTWF4aW11bVBvc3RFdmFsKAorCQkJT3V0U3RyZWFtICYgb3MsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKSBjb25zdAorCXsKKwkJbVBUUi0+dHJhY2VNYXhpbXVtUG9zdEV2YWwob3MsIGFuRUMpOworCX0KKworCWlubGluZSB2b2lkIHRyYWNlRGVmYXVsdFBvc3RFdmFsKAorCQkJT3V0U3RyZWFtICYgb3MsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKSBjb25zdAorCXsKKwkJbVBUUi0+dHJhY2VEZWZhdWx0UG9zdEV2YWwob3MsIGFuRUMpOworCX0KKworCisJaW5saW5lIHZvaWQgdHJhY2VCb3VuZEV2YWwoT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQltUFRSLT50cmFjZUJvdW5kRXZhbCggb3MgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCByZXBvcnRFdmFsKE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJbVBUUi0+cmVwb3J0RXZhbCggb3MgKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBQUk9DRVNTT1IgUkVRVUVTVCBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkvKioKKwkgKiBTVE9QICB8IFJFTEVBU0UKKwkgKiBSRVNFVCB8IFJFU1RBUlQgfCBDT05USU5VRQorCSAqIFJFUVVFVUVfV0FJVElORyB8IFJFUVVFVUVfUkVTRVJWRQorCSAqIEhFVVJJU1RJQyB8IEdPQUxfQUNISUVWRUQKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCB2b2lkIGhhbmRsZVJlcXVlc3RTdG9wKCkKKwl7CisJCW1QVFItPmhhbmRsZVJlcXVlc3RTdG9wKCk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCBoYW5kbGVSZXF1ZXN0UmVsZWFzZSgpCisJeworCQltUFRSLT5oYW5kbGVSZXF1ZXN0UmVsZWFzZSgpOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgdm9pZCBoYW5kbGVSZXF1ZXN0UmVzZXQoKQorCXsKKwkJbVBUUi0+aGFuZGxlUmVxdWVzdFJlc2V0KCk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCBoYW5kbGVSZXF1ZXN0UmVzdGFydCgpCisJeworCQltUFRSLT5oYW5kbGVSZXF1ZXN0UmVzdGFydCgpOworCX0KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgaGFuZGxlUmVxdWVzdENvbnRpbnVlKCkKKwl7CisJCW1QVFItPmhhbmRsZVJlcXVlc3RDb250aW51ZSgpOworCX0KKworCisJLy8gdGhlIFdhaXRpbmcgUXVldWUgVGFibGUKKwlpbmxpbmUgdmlydHVhbCB2b2lkIGhhbmRsZVJlcXVlc3RSZXF1ZXVlV2FpdGluZ1RhYmxlKAorCQkJV2FpdGluZ1N0cmF0ZWd5ICYgYVdhaXRpbmdTdHJhdGVneSwKKwkJCWF2bV91aW50OF90IGFXZWlnaHRNaW4sIGF2bV91aW50OF90IGFXZWlnaHRNYXgpCisJeworCQltUFRSLT5oYW5kbGVSZXF1ZXN0UmVxdWV1ZVdhaXRpbmdUYWJsZSgKKwkJCQlhV2FpdGluZ1N0cmF0ZWd5LCBhV2VpZ2h0TWluLCBhV2VpZ2h0TWF4KTsKKwl9CisKKwl2aXJ0dWFsIHZvaWQgaGFuZGxlUmVxdWVzdFJlcXVldWVSZXNlcnZlVGFibGUoCisJCQlXYWl0aW5nU3RyYXRlZ3kgJiBhV2FpdGluZ1N0cmF0ZWd5LAorCQkJTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGFSZXNlcnZlUXVldWUsCisJCQlhdm1fdWludDhfdCBhV2VpZ2h0TWluLCBhdm1fdWludDhfdCBhV2VpZ2h0TWF4KQorCXsKKwkJbVBUUi0+aGFuZGxlUmVxdWVzdFJlcXVldWVSZXNlcnZlVGFibGUoCisJCQkJYVdhaXRpbmdTdHJhdGVneSwgYVJlc2VydmVRdWV1ZSwgYVdlaWdodE1pbiwgYVdlaWdodE1heCk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIGhhbmRsZVJlcXVlc3RIZXVyaXN0aWMoKQorCXsKKwkJbVBUUi0+aGFuZGxlUmVxdWVzdEhldXJpc3RpYygpOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgdm9pZCBoYW5kbGVSZXF1ZXN0R29hbEFjaGlldmVkKCkKKwl7CisJCW1QVFItPmhhbmRsZVJlcXVlc3RHb2FsQWNoaWV2ZWQoKTsKKwl9CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gU0VSSUFMSVpBVElPTiBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlpbmxpbmUgc3RkOjpzdHJpbmcgc3RyVHlwZUlkKCkgY29uc3QKKwl7CisJCXJldHVybiBtUFRSLT5zdHJUeXBlSWQoKTsKKwl9CisKKwlpbmxpbmUgc3RkOjpzdHJpbmcgc3RyVW5pcUlkKCkgY29uc3QKKwl7CisJCXJldHVybiBtUFRSLT5zdHJVbmlxSWQoKTsKKwl9CisKKwlpbmxpbmUgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCW1QVFItPnRvU3RyZWFtKCBvcyApOworCX0KKworfTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUFJPQ0VTU09SIFVOSVQgQVVUTyBSRUdJU1RSQVRJT04gRkFDVE9SWQorLy8gZm9yIGF1dG9tYXRpYyByZWdpc3RyYXRpb24gaW4gdGhlIHByb2Nlc3NvciByZXBvc2l0b3J5CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit0ZW1wbGF0ZTwgY2xhc3MgUHJvY2Vzc29yVCA+CitjbGFzcyBBdXRvUmVnaXN0ZXJlZFByb2Nlc3NvclVuaXQgOiAgcHVibGljICBBYnN0cmFjdFByb2Nlc3NvclVuaXQKK3sKKworcHVibGljOgorCS8qKgorCSAqIFRZUERFREVGCisJICovCisJdHlwZWRlZiBBdXRvUmVnaXN0ZXJlZFByb2Nlc3NvclVuaXQ8IFByb2Nlc3NvclQgPiAgUmVnaXN0ZXJlZFByb2Nlc3NvclVuaXQ7CisKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUF1dG9SZWdpc3RlcmVkUHJvY2Vzc29yVW5pdChTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXIgJiBhTWFuYWdlciwKKwkJCVdPYmplY3QgKiB3ZlBhcmFtZXRlck9iamVjdCwgYXZtX2NvbXB1dGluZ19wcm9jZXNzX3N0YWdlX3QgcmVxdWlyZWRTdGFnZSwKKwkJCWNvbnN0IGF2bV91aW50OF90ICogYVByZWNlZGVuY2UgPSBERUZBVUxUX1BSRUNFREVOQ0VfT0ZfUFJPQ0VTU09SKQorCTogQWJzdHJhY3RQcm9jZXNzb3JVbml0KGFNYW5hZ2VyLCB3ZlBhcmFtZXRlck9iamVjdCwgcmVxdWlyZWRTdGFnZSwgYVByZWNlZGVuY2UpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlBdXRvUmVnaXN0ZXJlZFByb2Nlc3NvclVuaXQoCisJCQlTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXIgJiBhTWFuYWdlciwgV09iamVjdCAqIHdmUGFyYW1ldGVyT2JqZWN0LAorCQkJY29uc3QgYXZtX3VpbnQ4X3QgKiBhUHJlY2VkZW5jZSA9IERFRkFVTFRfUFJFQ0VERU5DRV9PRl9QUk9DRVNTT1IpCisJOiBBYnN0cmFjdFByb2Nlc3NvclVuaXQoYU1hbmFnZXIsIHdmUGFyYW1ldGVyT2JqZWN0LCBhUHJlY2VkZW5jZSkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogT3RoZXIKKwkgKi8KKwlBdXRvUmVnaXN0ZXJlZFByb2Nlc3NvclVuaXQoY2xhc3Nfa2luZF90IGFDbGFzc0tpbmQsCisJCQlTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXIgJiBhTWFuYWdlciwgV09iamVjdCAqIHdmUGFyYW1ldGVyT2JqZWN0KQorCTogQWJzdHJhY3RQcm9jZXNzb3JVbml0KGFDbGFzc0tpbmQsIGFNYW5hZ2VyLCB3ZlBhcmFtZXRlck9iamVjdCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCUF1dG9SZWdpc3RlcmVkUHJvY2Vzc29yVW5pdChjbGFzc19raW5kX3QgYUNsYXNzS2luZCwgU3ltYmV4RW5naW5lICYgYW5FbmdpbmUsCisJCQlTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXIgJiBhTWFuYWdlciwgV09iamVjdCAqIHdmUGFyYW1ldGVyT2JqZWN0KQorCTogQWJzdHJhY3RQcm9jZXNzb3JVbml0KGFDbGFzc0tpbmQsIGFuRW5naW5lLCBhTWFuYWdlciwgd2ZQYXJhbWV0ZXJPYmplY3QpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+QXV0b1JlZ2lzdGVyZWRQcm9jZXNzb3JVbml0KCkKKwl7CisJCS8vIEZvcmNlIEluc3RhbmNpYXRlCisJCSh2b2lkKSAmIEFVVE9fUkVHSVNURVJfVE9PTDsKKwl9CisKKworCS8qKgorCSAqIFBST0NFU1NPUiBGQUNUT1JZCisJICogZm9yIGF1dG9tYXRpYyByZWdpc3RyYXRpb24gaW4gdGhlIHByb2Nlc3NvciByZXBvc2l0b3J5CisJICovCisJc3RhdGljIHN0cnVjdCBBdXRvUmVnaXN0ZXJQcm9jZXNzb3JGYWN0b3J5ICA6CisJCQlwdWJsaWMgUHJvY2Vzc29yVW5pdFJlZ2lzdHJhdGlvbkltcGw8IFByb2Nlc3NvclQgPgorCXsKKwkJQXV0b1JlZ2lzdGVyUHJvY2Vzc29yRmFjdG9yeSgpCisJCTogUHJvY2Vzc29yVW5pdFJlZ2lzdHJhdGlvbkltcGw8IFByb2Nlc3NvclQgPigKKwkJCQlQcm9jZXNzb3JUOjpRTklEKCkgLCBQcm9jZXNzb3JUOjpRTklEMSgpICwKKwkJCQlQcm9jZXNzb3JUOjpRTklEMigpLCBQcm9jZXNzb3JUOjpRTklEMygpICkKKwkJeworCQkJLy8hISBOT1RISU5HCisJCX0KKworCX0gIEFVVE9fUkVHSVNURVJfVE9PTDsKKwkvLyBlbmQgcmVnaXN0cmF0aW9uCisKKworCWlubGluZSB2aXJ0dWFsIElQcm9jZXNzb3JVbml0UmVnaXN0cmF0aW9uICYgUkVHSVNURVJfVE9PTCgpIGNvbnN0CisJeworCQlyZXR1cm4oIEFVVE9fUkVHSVNURVJfVE9PTCApOworCX0KKworCWlubGluZSBib29sIGlzUmVnaXN0ZXJUb29sKAorCQkJY29uc3QgSVByb2Nlc3NvclVuaXRSZWdpc3RyYXRpb24gJiBhUmVnaXN0ZXJUb29sKSBjb25zdAorCXsKKwkJcmV0dXJuKCBBVVRPX1JFR0lTVEVSX1RPT0wuaXNFcXVhbHMoIGFSZWdpc3RlclRvb2wgKSApOworCX0KKworfTsKKworCit0ZW1wbGF0ZTwgY2xhc3MgUHJvY2Vzc29yVCA+IHR5cGVuYW1lCitBdXRvUmVnaXN0ZXJlZFByb2Nlc3NvclVuaXQ8IFByb2Nlc3NvclQgPjo6QXV0b1JlZ2lzdGVyUHJvY2Vzc29yRmFjdG9yeQorQXV0b1JlZ2lzdGVyZWRQcm9jZXNzb3JVbml0PCBQcm9jZXNzb3JUID46OkFVVE9fUkVHSVNURVJfVE9PTDsKKworCisjZGVmaW5lIEFWTV9JTkpFQ1RfQVVUT19SRUdJU1RFUl9RVUFMSUZJRURfSURfS0VZKCBxbmlkICkgXAorCXB1YmxpYzogXAorCQlzdGF0aWMgc3RkOjpzdHJpbmcgUU5JRCAoKSB7IHJldHVybiggcW5pZCAgKTsgfSBcCisJCXN0YXRpYyBzdGQ6OnN0cmluZyBRTklEMSgpIHsgcmV0dXJuKCAiIiAgICApOyB9IFwKKwkJc3RhdGljIHN0ZDo6c3RyaW5nIFFOSUQyKCkgeyByZXR1cm4oICIiICAgICk7IH0gXAorCQlzdGF0aWMgc3RkOjpzdHJpbmcgUU5JRDMoKSB7IHJldHVybiggIiIgICAgKTsgfQorCisjZGVmaW5lIEFWTV9JTkpFQ1RfQVVUT19SRUdJU1RFUl9RVUFMSUZJRURfSURfS0VZXzIoIHFuaWQgLCBxbmlkMSApIFwKKwlwdWJsaWM6IFwKKwkJc3RhdGljIHN0ZDo6c3RyaW5nIFFOSUQgKCkgeyByZXR1cm4oIHFuaWQgICk7IH0gXAorCQlzdGF0aWMgc3RkOjpzdHJpbmcgUU5JRDEoKSB7IHJldHVybiggcW5pZDEgKTsgfSBcCisJCXN0YXRpYyBzdGQ6OnN0cmluZyBRTklEMigpIHsgcmV0dXJuKCAiIiAgICApOyB9IFwKKwkJc3RhdGljIHN0ZDo6c3RyaW5nIFFOSUQzKCkgeyByZXR1cm4oICIiICAgICk7IH0KKworI2RlZmluZSBBVk1fSU5KRUNUX0FVVE9fUkVHSVNURVJfUVVBTElGSUVEX0lEX0tFWV8zKCBxbmlkICwgcW5pZDEgLCBxbmlkMiApIFwKKwlwdWJsaWM6IFwKKwkJc3RhdGljIHN0ZDo6c3RyaW5nIFFOSUQgKCkgeyByZXR1cm4oIHFuaWQgICk7IH0gXAorCQlzdGF0aWMgc3RkOjpzdHJpbmcgUU5JRDEoKSB7IHJldHVybiggcW5pZDEgKTsgfSBcCisJCXN0YXRpYyBzdGQ6OnN0cmluZyBRTklEMigpIHsgcmV0dXJuKCBxbmlkMiApOyB9IFwKKwkJc3RhdGljIHN0ZDo6c3RyaW5nIFFOSUQzKCkgeyByZXR1cm4oICIiICAgICk7IH0KKworI2RlZmluZSBBVk1fSU5KRUNUX0FVVE9fUkVHSVNURVJfUVVBTElGSUVEX0lEX0tFWV80KHFuaWQsIHFuaWQxLCBxbmlkMiwgcW5pZDMpIFwKKwlwdWJsaWM6IFwKKwkJc3RhdGljIHN0ZDo6c3RyaW5nIFFOSUQgKCkgeyByZXR1cm4oIHFuaWQgICk7IH0gXAorCQlzdGF0aWMgc3RkOjpzdHJpbmcgUU5JRDEoKSB7IHJldHVybiggcW5pZDEgKTsgfSBcCisJCXN0YXRpYyBzdGQ6OnN0cmluZyBRTklEMigpIHsgcmV0dXJuKCBxbmlkMiApOyB9IFwKKwkJc3RhdGljIHN0ZDo6c3RyaW5nIFFOSUQzKCkgeyByZXR1cm4oIHFuaWQzICk7IH0KKworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworI2VuZGlmIC8qIEFCU1RSQUNUUFJPQ0VTU09SVU5JVF9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2FwaS9Db21wb3NpdGVDb250cm9sbGVyVW5pdC5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vYXBpL0NvbXBvc2l0ZUNvbnRyb2xsZXJVbml0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmUxN2VmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2FwaS9Db21wb3NpdGVDb250cm9sbGVyVW5pdC5jcHAKQEAgLTAsMCArMSw0NjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyOSBub3YuIDIwMTEKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkNvbXBvc2l0ZUNvbnRyb2xsZXJVbml0LmgiCisKKworI2luY2x1ZGUgPGZhbS9hcGkvTWFpblByb2Nlc3NvclVuaXQuaD4KKworI2luY2x1ZGUgPGZtbC9vcGVyYXRvci9PcGVyYXRvci5oPgorI2luY2x1ZGUgPGZtbC9vcGVyYXRvci9PcGVyYXRvck1hbmFnZXIuaD4KKworI2luY2x1ZGUgPHNldy9TeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXIuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoqCisgKiBQUk9DRVNTT1IgRkFDVE9SWQorICogZm9yIGF1dG9tYXRpYyByZWdpc3RyYXRpb24gaW4gdGhlIHByb2Nlc3NvciByZXBvc2l0b3J5CisgKiBBYnN0cmFjdFByb2Nlc3NvclVuaXQ6OlJFR0lTVEVSX1RPT0woKSBpcyBhIHB1cmUgdmlydHVhbCBtZXRob2QKKyAqLworSVByb2Nlc3NvclVuaXRSZWdpc3RyYXRpb24gJiBDb21wb3NpdGVDb250cm9sbGVyVW5pdDo6UkVHSVNURVJfVE9PTCgpIGNvbnN0Cit7CisJcmV0dXJuKCBNYWluUHJvY2Vzc29yVW5pdDo6QVVUT19SRUdJU1RFUl9UT09MICk7Cit9CisKKworLyoqCisgKiBDT05TVFJVQ1RPUgorICogRGVmYXVsdAorICovCitDb21wb3NpdGVDb250cm9sbGVyVW5pdDo6Q29tcG9zaXRlQ29udHJvbGxlclVuaXQoCisJCVN5bWJleENvbnRyb2xsZXJVbml0TWFuYWdlciAmIGFDb250cm9sbGVyVW5pdE1hbmFnZXIsCisJCVdPYmplY3QgKiB3ZlBhcmFtZXRlck9iamVjdCkKKzogQWJzdHJhY3RQcm9jZXNzb3JVbml0KENMQVNTX0tJTkRfVCggQ29tcG9zaXRlQ29udHJvbGxlclVuaXQgKSwKKwkJYUNvbnRyb2xsZXJVbml0TWFuYWdlciwgd2ZQYXJhbWV0ZXJPYmplY3QpLAorTGlzdE9mQ29udHJvbGxlclVuaXRzKCApLAordGhlT3BlcmF0b3IoIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU0VRVUVOQ0UgKSwKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29tcHV0aW5nIFZhcmlhYmxlcworcHJvY2Vzc29ySXQoICksCitwcm9jZXNzb3JJdEVuZCggKQoreworCW1Db21wdXRpbmdTdGFnZUVuYWJsZWQgfD0gQVZNX0NPTVBVVElOR19DT01QT1NJVEVfU1RBR0U7Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDT05GSUdVUkUgIEFQSQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIENvbXBvc2l0ZUNvbnRyb2xsZXJVbml0Ojpjb25maWd1cmVDb250cm9sbGVyVW5pdHMoKQoreworCXByb2Nlc3Nvckl0ID0gYmVnaW4oKTsKKwlwcm9jZXNzb3JJdEVuZCA9IGVuZCgpOworCWZvciggOyBwcm9jZXNzb3JJdCAhPSBwcm9jZXNzb3JJdEVuZCA7ICsrcHJvY2Vzc29ySXQgKQorCXsKKwkJaWYoICgqcHJvY2Vzc29ySXQpLT5wcmVDb25maWd1cmUoKSApCisJCXsKKwkJCWlmKCBub3QgKCpwcm9jZXNzb3JJdCktPmNvbmZpZ3VyZSgpICkKKwkJCXsKKwkJCQlBVk1fT1NfV0FSTiA8PCAiRmFpbGVkIHRvIGNvbmZpZ3VyaW5nIENvbnRyb2xsZXIgVW5pdCA8PCAiCisJCQkJCQk8PCAoKnByb2Nlc3Nvckl0KS0+Z2V0UGFyYW1ldGVyV09iamVjdCgpCisJCQkJCQkJCS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJCQkJPDwgIiA+PiAiIDw8IHN0ZDo6ZW5kbDsKKworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiB0cnVlOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFJFR0lTVEVSIEZPTUFMIEFOQUxZU0lTIE1PRFVMRSBhLmsuYS4gQ09OVFJPTExFUiBVTklUICBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQWJzdHJhY3RQcm9jZXNzb3JVbml0ICogQ29tcG9zaXRlQ29udHJvbGxlclVuaXQ6OmdldENvbnRyb2xsZXJVbml0KAorCQljb25zdCBJUHJvY2Vzc29yVW5pdFJlZ2lzdHJhdGlvbiAmIGFSZWdpc3RlclRvb2wpCit7CisJcHJvY2Vzc29ySXQgPSBiZWdpbigpOworCXByb2Nlc3Nvckl0RW5kID0gZW5kKCk7CisJZm9yKCA7IHByb2Nlc3Nvckl0ICE9IHByb2Nlc3Nvckl0RW5kIDsgKytwcm9jZXNzb3JJdCApCisJeworCQlpZiggKCpwcm9jZXNzb3JJdCktPmlzUmVnaXN0ZXJUb29sKCBhUmVnaXN0ZXJUb29sICkgKQorCQl7CisJCQlyZXR1cm4oICgqcHJvY2Vzc29ySXQpICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIE5VTEwgKTsKK30KKworCitBYnN0cmFjdFByb2Nlc3NvclVuaXQgKiBDb21wb3NpdGVDb250cm9sbGVyVW5pdDo6Z2V0Q29udHJvbGxlclVuaXQoCisJCVdPYmplY3QgKiB3ZlByb2Nlc3Nvck9iamVjdCkKK3sKKwlwcm9jZXNzb3JJdCA9IGJlZ2luKCk7CisJcHJvY2Vzc29ySXRFbmQgPSBlbmQoKTsKKwlmb3IoIDsgcHJvY2Vzc29ySXQgIT0gcHJvY2Vzc29ySXRFbmQgOyArK3Byb2Nlc3Nvckl0ICkKKwl7CisJCWlmKCAoKnByb2Nlc3Nvckl0KS0+Z2V0UGFyYW1ldGVyV09iamVjdCgpID09IHdmUHJvY2Vzc29yT2JqZWN0ICkKKwkJeworCQkJcmV0dXJuKCAoKnByb2Nlc3Nvckl0KSApOworCQl9CisJfQorCisJcmV0dXJuKCBOVUxMICk7Cit9CisKKworQWJzdHJhY3RQcm9jZXNzb3JVbml0ICogQ29tcG9zaXRlQ29udHJvbGxlclVuaXQ6OmdldENvbnRyb2xsZXJVbml0KAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCkKK3sKKwlwcm9jZXNzb3JJdCA9IGJlZ2luKCk7CisJcHJvY2Vzc29ySXRFbmQgPSBlbmQoKTsKKwlmb3IoIDsgcHJvY2Vzc29ySXQgIT0gcHJvY2Vzc29ySXRFbmQgOyArK3Byb2Nlc3Nvckl0ICkKKwl7CisJCWlmKCAoKnByb2Nlc3Nvckl0KS0+Z2V0UGFyYW1ldGVyV09iamVjdCgpCisJCQkJLT5mcW5FcXVhbHMoIGFGdWxseVF1YWxpZmllZE5hbWVJRCApICkKKwkJeworCQkJcmV0dXJuKCAoKnByb2Nlc3Nvckl0KSApOworCQl9CisJfQorCisJcmV0dXJuKCBOVUxMICk7Cit9CisKKworYm9vbCBDb21wb3NpdGVDb250cm9sbGVyVW5pdDo6cmVnaXN0ZXJQcmVwcm9jZXNzb3IoQWJzdHJhY3RQcm9jZXNzb3JVbml0ICogYUZBTSkKK3sKKwlwcm9jZXNzb3JJdCA9IGJlZ2luKCk7CisJcHJvY2Vzc29ySXRFbmQgPSBlbmQoKTsKKwlpdGVyYXRvciBwcm9jZXNzb3JQb3NpdGlvbiA9IHByb2Nlc3Nvckl0RW5kOworCWZvciggOyBwcm9jZXNzb3JJdCAhPSBwcm9jZXNzb3JJdEVuZCA7ICsrcHJvY2Vzc29ySXQgKQorCXsKKwkJaWYoICgqcHJvY2Vzc29ySXQpID09IGFGQU0gKQorCQl7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJZWxzZSBpZiggcHJvY2Vzc29yUG9zaXRpb24gPT0gcHJvY2Vzc29ySXRFbmQgKQorCQl7CisJCQlpZiggKCpwcm9jZXNzb3JJdCktPmdldFByZWNlZGVuY2VPZlByZVByb2Nlc3MoKSA+CisJCQkJCWFGQU0tPmdldFByZWNlZGVuY2VPZlByZVByb2Nlc3MoKSApCisJCQl7CisJCQkJcHJvY2Vzc29yUG9zaXRpb24gPSBwcm9jZXNzb3JJdDsKKwkJCX0KKwkJfQorCX0KKworCUxpc3RPZkNvbnRyb2xsZXJVbml0czo6aW5zZXJ0KHByb2Nlc3NvclBvc2l0aW9uLCBhRkFNKTsKKworCXJldHVybiB0cnVlOworfQorCisKK2Jvb2wgQ29tcG9zaXRlQ29udHJvbGxlclVuaXQ6OnJlZ2lzdGVyUG9zdHByb2Nlc3NvcihBYnN0cmFjdFByb2Nlc3NvclVuaXQgKiBhRkFNKQoreworCXByb2Nlc3Nvckl0ID0gYmVnaW4oKTsKKwlwcm9jZXNzb3JJdEVuZCA9IGVuZCgpOworCWl0ZXJhdG9yIHByb2Nlc3NvclBvc2l0aW9uID0gcHJvY2Vzc29ySXRFbmQ7CisJZm9yKCA7IHByb2Nlc3Nvckl0ICE9IHByb2Nlc3Nvckl0RW5kIDsgKytwcm9jZXNzb3JJdCApCisJeworCQlpZiggKCpwcm9jZXNzb3JJdCkgPT0gYUZBTSApCisJCXsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQllbHNlIGlmKCBwcm9jZXNzb3JQb3NpdGlvbiA9PSBwcm9jZXNzb3JJdEVuZCApCisJCXsKKwkJCWlmKCAoKnByb2Nlc3Nvckl0KS0+Z2V0UHJlY2VkZW5jZU9mUG9zdFByb2Nlc3MoKSA+CisJCQkJCWFGQU0tPmdldFByZWNlZGVuY2VPZlBvc3RQcm9jZXNzKCkgKQorCQkJeworCQkJCXByb2Nlc3NvclBvc2l0aW9uID0gcHJvY2Vzc29ySXQ7CisJCQl9CisJCX0KKwl9CisKKwlMaXN0T2ZDb250cm9sbGVyVW5pdHM6Omluc2VydChwcm9jZXNzb3JQb3NpdGlvbiwgYUZBTSk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworCitib29sIENvbXBvc2l0ZUNvbnRyb2xsZXJVbml0OjpyZWdpc3RlclByZWZpbHRlcihBYnN0cmFjdFByb2Nlc3NvclVuaXQgKiBhRkFNKQoreworCXByb2Nlc3Nvckl0ID0gYmVnaW4oKTsKKwlwcm9jZXNzb3JJdEVuZCA9IGVuZCgpOworCWl0ZXJhdG9yIHByb2Nlc3NvclBvc2l0aW9uID0gcHJvY2Vzc29ySXRFbmQ7CisJZm9yKCA7IHByb2Nlc3Nvckl0ICE9IHByb2Nlc3Nvckl0RW5kIDsgKytwcm9jZXNzb3JJdCApCisJeworCQlpZiggKCpwcm9jZXNzb3JJdCkgPT0gYUZBTSApCisJCXsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQllbHNlIGlmKCBwcm9jZXNzb3JQb3NpdGlvbiA9PSBwcm9jZXNzb3JJdEVuZCApCisJCXsKKwkJCWlmKCAoKnByb2Nlc3Nvckl0KS0+Z2V0UHJlY2VkZW5jZU9mUHJlRmlsdGVyKCkgPgorCQkJCQlhRkFNLT5nZXRQcmVjZWRlbmNlT2ZQcmVGaWx0ZXIoKSApCisJCQl7CisJCQkJcHJvY2Vzc29yUG9zaXRpb24gPSBwcm9jZXNzb3JJdDsKKwkJCX0KKwkJfQorCX0KKworCUxpc3RPZkNvbnRyb2xsZXJVbml0czo6aW5zZXJ0KHByb2Nlc3NvclBvc2l0aW9uLCBhRkFNKTsKKworCXJldHVybiB0cnVlOworfQorCisKK2Jvb2wgQ29tcG9zaXRlQ29udHJvbGxlclVuaXQ6OnJlZ2lzdGVyUG9zdGZpbHRlcihBYnN0cmFjdFByb2Nlc3NvclVuaXQgKiBhRkFNKQoreworCXByb2Nlc3Nvckl0ID0gYmVnaW4oKTsKKwlwcm9jZXNzb3JJdEVuZCA9IGVuZCgpOworCWl0ZXJhdG9yIHByb2Nlc3NvclBvc2l0aW9uID0gcHJvY2Vzc29ySXRFbmQ7CisJZm9yKCA7IHByb2Nlc3Nvckl0ICE9IHByb2Nlc3Nvckl0RW5kIDsgKytwcm9jZXNzb3JJdCApCisJeworCQlpZiggKCpwcm9jZXNzb3JJdCkgPT0gYUZBTSApCisJCXsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQllbHNlIGlmKCBwcm9jZXNzb3JQb3NpdGlvbiA9PSBwcm9jZXNzb3JJdEVuZCApCisJCXsKKwkJCWlmKCAoKnByb2Nlc3Nvckl0KS0+Z2V0UHJlY2VkZW5jZU9mUG9zdEZpbHRlcigpID4KKwkJCQkJYUZBTS0+Z2V0UHJlY2VkZW5jZU9mUG9zdEZpbHRlcigpICkKKwkJCXsKKwkJCQlwcm9jZXNzb3JQb3NpdGlvbiA9IHByb2Nlc3Nvckl0OworCQkJfQorCQl9CisJfQorCisJTGlzdE9mQ29udHJvbGxlclVuaXRzOjppbnNlcnQocHJvY2Vzc29yUG9zaXRpb24sIGFGQU0pOworCisJcmV0dXJuIHRydWU7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIElOSVQgLyBFWElUICBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgQ29tcG9zaXRlQ29udHJvbGxlclVuaXQ6OmluaXRJbXBsKCkKK3sKKwlwcm9jZXNzb3JJdCA9IGJlZ2luKCk7CisJcHJvY2Vzc29ySXRFbmQgPSBlbmQoKTsKKwlmb3IoIDsgcHJvY2Vzc29ySXQgIT0gcHJvY2Vzc29ySXRFbmQgOyArK3Byb2Nlc3Nvckl0ICkKKwl7CisJCWlmKCAoKnByb2Nlc3Nvckl0KS0+aXNFbmFibGVQbHVnaW4oKSApCisJCXsKKwkJCWlmKCBub3QgKCpwcm9jZXNzb3JJdCktPmluaXQoKSApCisJCQl7CisJCQkJQVZNX09TX0NMT0cgIDw8ICJGYWlsZWQgdG8gaW5pdGluZyBDb250cm9sbGVyIFVuaXQgPDwgIgorCQkJCQkJPDwgKCAqcHJvY2Vzc29ySXQpLT5nZXRQYXJhbWV0ZXJXT2JqZWN0KCkKKwkJCQkJCQkJLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQkJCQk8PCAiID4+ICIgPDwgc3RkOjplbmRsOworCisJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ29tcG9zaXRlQ29udHJvbGxlclVuaXQ6OmV4aXRJbXBsKCkKK3sKKwlwcm9jZXNzb3JJdCA9IGJlZ2luKCk7CisJcHJvY2Vzc29ySXRFbmQgPSBlbmQoKTsKKwlmb3IoIDsgcHJvY2Vzc29ySXQgIT0gcHJvY2Vzc29ySXRFbmQgOyArK3Byb2Nlc3Nvckl0ICkKKwl7CisJCWlmKCAoKnByb2Nlc3Nvckl0KS0+aXNFbmFibGVQbHVnaW4oKSApCisJCXsKKwkJCWlmKCBub3QgKCpwcm9jZXNzb3JJdCktPmV4aXQoKSApCisJCQl7CisJCQkJQVZNX09TX0NMT0cgIDw8ICJGYWlsZWQgdG8gZXhpdGluZyBDb250cm9sbGVyIFVuaXQgPDwgIgorCQkJCQkJPDwgKCAqcHJvY2Vzc29ySXQpLT5nZXRQYXJhbWV0ZXJXT2JqZWN0KCkKKwkJCQkJCQkJLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQkJCQk8PCAiID4+ICIgPDwgc3RkOjplbmRsOworCisJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAoIFBSRSAvIFBPU1QgKSBQUk9DRVNTICBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgQ29tcG9zaXRlQ29udHJvbGxlclVuaXQ6OnByZXByb2Nlc3MoKQoreworCXByb2Nlc3Nvckl0ID0gYmVnaW4oKTsKKwlwcm9jZXNzb3JJdEVuZCA9IGVuZCgpOworCWZvciggOyBwcm9jZXNzb3JJdCAhPSBwcm9jZXNzb3JJdEVuZCA7ICsrcHJvY2Vzc29ySXQgKQorCXsKKwkJaWYoICgqcHJvY2Vzc29ySXQpLT5pc0VuYWJsZVByZXByb2Nlc3MoKSAgKQorCQl7CisJCQlpZiggbm90ICgqcHJvY2Vzc29ySXQpLT5wcmVwcm9jZXNzKCkgKQorCQkJeworCQkJCUFWTV9PU19DTE9HICA8PCAiRmFpbGVkIHRvIHByZXByb2Nlc3NpbmcgQ29udHJvbGxlciBVbml0IDw8ICIKKwkJCQkJCTw8ICggKnByb2Nlc3Nvckl0KS0+Z2V0UGFyYW1ldGVyV09iamVjdCgpCisJCQkJCQkJCS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJCQkJPDwgIiA+PiAiIDw8IHN0ZDo6ZW5kbDsKKworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCitib29sIENvbXBvc2l0ZUNvbnRyb2xsZXJVbml0Ojpwb3N0cHJvY2VzcygpCit7CisJcHJvY2Vzc29ySXQgPSBiZWdpbigpOworCXByb2Nlc3Nvckl0RW5kID0gZW5kKCk7CisJZm9yKCA7IHByb2Nlc3Nvckl0ICE9IHByb2Nlc3Nvckl0RW5kIDsgKytwcm9jZXNzb3JJdCApCisJeworCQlpZiggKCpwcm9jZXNzb3JJdCktPmlzRW5hYmxlUG9zdHByb2Nlc3MoKSApCisJCXsKKwkJCWlmKCBub3QgKCpwcm9jZXNzb3JJdCktPnBvc3Rwcm9jZXNzKCkgKQorCQkJeworCQkJCUFWTV9PU19DTE9HICA8PCAiRmFpbGVkIHRvIHBvc3Rwcm9jZXNzaW5nIENvbnRyb2xsZXIgVW5pdCA8PCAiCisJCQkJCQk8PCAoICpwcm9jZXNzb3JJdCktPmdldFBhcmFtZXRlcldPYmplY3QoKQorCQkJCQkJCQktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKwkJCQkJCTw8ICIgPj4gIiA8PCBzdGQ6OmVuZGw7CisKKwkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRklMVEVSSU5HICBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgQ29tcG9zaXRlQ29udHJvbGxlclVuaXQ6OmZpbHRlcmluZ0luaXRpYWxpemUoKQoreworCXByb2Nlc3Nvckl0ID0gYmVnaW4oKTsKKwlwcm9jZXNzb3JJdEVuZCA9IGVuZCgpOworCWZvciggOyBwcm9jZXNzb3JJdCAhPSBwcm9jZXNzb3JJdEVuZCA7ICsrcHJvY2Vzc29ySXQgKQorCXsKKwkJaWYoICgqcHJvY2Vzc29ySXQpLT5pc1dlYWtFbmFibGVGaWx0ZXIoKSApCisJCXsKKwkJCWlmKCBub3QgKCpwcm9jZXNzb3JJdCktPmZpbHRlcmluZ0luaXRpYWxpemUoKSApCisJCQl7CisJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKK2Jvb2wgQ29tcG9zaXRlQ29udHJvbGxlclVuaXQ6OmZpbHRlcmluZ0ZpbmFsaXplKCkKK3sKKwlwcm9jZXNzb3JJdCA9IGJlZ2luKCk7CisJcHJvY2Vzc29ySXRFbmQgPSBlbmQoKTsKKwlmb3IoIDsgcHJvY2Vzc29ySXQgIT0gcHJvY2Vzc29ySXRFbmQgOyArK3Byb2Nlc3Nvckl0ICkKKwl7CisJCWlmKCAoKnByb2Nlc3Nvckl0KS0+aXNXZWFrRW5hYmxlRmlsdGVyKCkgKQorCQl7CisJCQlpZiggbm90ICgqcHJvY2Vzc29ySXQpLT5maWx0ZXJpbmdGaW5hbGl6ZSgpICkKKwkJCXsKKwkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gKCBQUkUgLyBQT1NUICkgRklMVEVSICBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgQ29tcG9zaXRlQ29udHJvbGxlclVuaXQ6OnByZWZpbHRlcigpCit7CisJcHJvY2Vzc29ySXQgPSBiZWdpbigpOworCXByb2Nlc3Nvckl0RW5kID0gZW5kKCk7CisJZm9yKCA7IHByb2Nlc3Nvckl0ICE9IHByb2Nlc3Nvckl0RW5kIDsgKytwcm9jZXNzb3JJdCApCisJeworCQlpZiggKCpwcm9jZXNzb3JJdCktPmlzRW5hYmxlUHJlZmlsdGVyKCkgJiYKKwkJCSgqcHJvY2Vzc29ySXQpLT5pc0xpZmVjeWNsZVJ1bm5hYmxlKCkgKQorCQl7CisJCQlpZiggbm90ICgqcHJvY2Vzc29ySXQpLT5wcmVmaWx0ZXIoKSApCisJCQl7CisJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuKCBtQ29udHJvbGxlclVuaXRNYW5hZ2VyLmdldEV4ZWN1dGlvblF1ZXVlKCkuaGFzUmVhZHkoKSApOworfQorCisKK2Jvb2wgQ29tcG9zaXRlQ29udHJvbGxlclVuaXQ6OnBvc3RmaWx0ZXIoKQoreworCXByb2Nlc3Nvckl0ID0gYmVnaW4oKTsKKwlwcm9jZXNzb3JJdEVuZCA9IGVuZCgpOworCWZvciggOyBwcm9jZXNzb3JJdCAhPSBwcm9jZXNzb3JJdEVuZCA7ICsrcHJvY2Vzc29ySXQgKQorCXsKKwkJaWYoICgqcHJvY2Vzc29ySXQpLT5pc0VuYWJsZVBvc3RmaWx0ZXIoKSAmJgorCQkJKCpwcm9jZXNzb3JJdCktPmlzTGlmZWN5Y2xlUnVubmFibGUoKSApCisJCXsKKwkJCWlmKCBub3QgKCpwcm9jZXNzb3JJdCktPnBvc3RmaWx0ZXIoKSApCisJCQl7CisJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuKCBtQ29udHJvbGxlclVuaXRNYW5hZ2VyLmdldEV4ZWN1dGlvblF1ZXVlKCkuaGFzUmVzdWx0KCkgICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNFUklBTElaQVRJT04gQVBJCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIENvbXBvc2l0ZUNvbnRyb2xsZXJVbml0Ojp0b1N0cmVhbSgKKwkJT3V0U3RyZWFtICYgb3MsIGNvbnN0IHN0ZDo6c3RyaW5nICYgaGVhZGVyKSBjb25zdAoreworLy8JaWYoIG1QYXJhbWV0ZXJXT2JqZWN0ICE9IFdPYmplY3Q6Ol9OVUxMXyApCisvLwl7CisvLwkJbVBhcmFtZXRlcldPYmplY3QtPnRvU3RyZWFtKG9zKTsKKy8vCX0KKworCW9zIDw8IFRBQiA8PCBoZWFkZXIgPDwgInsgIgorCQkJPDwgKCAodGhlT3BlcmF0b3IgIT0gTlVMTCkgPyB0aGVPcGVyYXRvci0+c3RyKCkgOiAiIiApCisJCQk8PCBFT0w7CisKKwljb25zdF9pdGVyYXRvciBwcm9jZXNzb3JJdCA9IGJlZ2luKCk7CisJY29uc3RfaXRlcmF0b3IgcHJvY2Vzc29ySXRFbmQgPSBlbmQoKTsKKwlmb3IoIDsgcHJvY2Vzc29ySXQgIT0gcHJvY2Vzc29ySXRFbmQgOyArK3Byb2Nlc3Nvckl0ICkKKwl7CisJCW9zIDw8IFRBQjIgPDwgKCpwcm9jZXNzb3JJdCktPnN0clVuaXFJZCgpIDw8IEVPTDsKKwl9CisJb3MgPDwgVEFCIDw8ICJ9IiA8PCBFT0xfRkxVU0g7Cit9CisKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9hcGkvQ29tcG9zaXRlQ29udHJvbGxlclVuaXQuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9hcGkvQ29tcG9zaXRlQ29udHJvbGxlclVuaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTU1YWIxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2FwaS9Db21wb3NpdGVDb250cm9sbGVyVW5pdC5oCkBAIC0wLDAgKzEsMjI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjkgbm92LiAyMDExCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRkFNX0FQSV9DT01QT1NJVEVfQ09OVFJPTExFUl9VTklUX0hfCisjZGVmaW5lIEZBTV9BUElfQ09NUE9TSVRFX0NPTlRST0xMRVJfVU5JVF9IXworCisjaW5jbHVkZSA8ZmFtL2FwaS9BYnN0cmFjdFByb2Nlc3NvclVuaXQuaD4KKyNpbmNsdWRlIDxjb2xsZWN0aW9uL0xpc3QuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKK2NsYXNzIEV4ZWN1dGlvbkNvbnRleHQ7CitjbGFzcyBJUHJvY2Vzc29yVW5pdFJlZ2lzdHJhdGlvbjsKK2NsYXNzIE9wZXJhdG9yOworY2xhc3MgU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyOworCisKK2NsYXNzIENvbXBvc2l0ZUNvbnRyb2xsZXJVbml0IDoKKwkJcHVibGljIEFic3RyYWN0UHJvY2Vzc29yVW5pdCAsCisJCXB1YmxpYyBMaXN0PCBBYnN0cmFjdFByb2Nlc3NvclVuaXQgKiA+Cit7CisKKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggQ29tcG9zaXRlQ29udHJvbGxlclVuaXQgKQorCisKK3ByaXZhdGU6CisJLyoqCisJICogUFJPQ0VTU09SIEZBQ1RPUlkKKwkgKiBmb3IgaW5zdGFudGlhdGlvbiByZWFzb24KKwkgKiBBYnN0cmFjdFByb2Nlc3NvclVuaXQ6OlJFR0lTVEVSX1RPT0woKSBpcyBhIHB1cmUgdmlydHVhbCBtZXRob2QKKwkgKi8KKwl2aXJ0dWFsIElQcm9jZXNzb3JVbml0UmVnaXN0cmF0aW9uICYgUkVHSVNURVJfVE9PTCgpIGNvbnN0OworCisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBUWVBFREVGCisJICovCisJdHlwZWRlZiBMaXN0PCBBYnN0cmFjdFByb2Nlc3NvclVuaXQgKiA+IExpc3RPZkNvbnRyb2xsZXJVbml0czsKKworCXR5cGVkZWYgTGlzdE9mQ29udHJvbGxlclVuaXRzOjppdGVyYXRvciAgICAgICAgaXRlcmF0b3I7CisJdHlwZWRlZiBMaXN0T2ZDb250cm9sbGVyVW5pdHM6OmNvbnN0X2l0ZXJhdG9yICBjb25zdF9pdGVyYXRvcjsKKworCS8qKgorCSAqIEFUVFJJQlVURQorCSAqLworCU9wZXJhdG9yICogdGhlT3BlcmF0b3I7CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQ29tcHV0aW5nIFZhcmlhYmxlcworCWl0ZXJhdG9yIHByb2Nlc3Nvckl0OworCWl0ZXJhdG9yIHByb2Nlc3Nvckl0RW5kOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlDb21wb3NpdGVDb250cm9sbGVyVW5pdCgKKwkJCVN5bWJleENvbnRyb2xsZXJVbml0TWFuYWdlciAmIGFDb250cm9sbGVyVW5pdE1hbmFnZXIsCisJCQlXT2JqZWN0ICogd2ZQYXJhbWV0ZXJPYmplY3QgPSBOVUxMKTsKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5Db21wb3NpdGVDb250cm9sbGVyVW5pdCgpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQ09ORklHVVJFICBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlpbmxpbmUgdmlydHVhbCBib29sIGNvbmZpZ3VyZSgpCisJeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBib29sIGNvbmZpZ3VyZUltcGwoKQorCXsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJYm9vbCBjb25maWd1cmVDb250cm9sbGVyVW5pdHMoKTsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFJFR0lTVEVSIEZPTUFMIEFOQUxZU0lTIE1PRFVMRSBhLmsuYS4gQ09OVFJPTExFUiBVTklUICBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlpbmxpbmUgdm9pZCBhZGRDb250cm9sbGVyVW5pdChBYnN0cmFjdFByb2Nlc3NvclVuaXQgKiBhUHJvY2Vzc29yKQorCXsKKwkJTGlzdE9mQ29udHJvbGxlclVuaXRzOjphZGRfdW5pb24oYVByb2Nlc3Nvcik7CisJfQorCisJaW5saW5lIHZvaWQgYXBwZW5kQ29udHJvbGxlclVuaXQoQWJzdHJhY3RQcm9jZXNzb3JVbml0ICogYVByb2Nlc3NvcikKKwl7CisJCUxpc3RPZkNvbnRyb2xsZXJVbml0czo6YXBwZW5kKGFQcm9jZXNzb3IpOworCX0KKworCisJQWJzdHJhY3RQcm9jZXNzb3JVbml0ICogZ2V0Q29udHJvbGxlclVuaXQoCisJCQljb25zdCBJUHJvY2Vzc29yVW5pdFJlZ2lzdHJhdGlvbiAmIGFSZWdpc3RlclRvb2wpOworCisJQWJzdHJhY3RQcm9jZXNzb3JVbml0ICogZ2V0Q29udHJvbGxlclVuaXQoV09iamVjdCAqIHdmUHJvY2Vzc29yT2JqZWN0KTsKKworCUFic3RyYWN0UHJvY2Vzc29yVW5pdCAqIGdldENvbnRyb2xsZXJVbml0KAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQpOworCisKKwlib29sIHJlZ2lzdGVyUHJlcHJvY2Vzc29yKEFic3RyYWN0UHJvY2Vzc29yVW5pdCAqIGFGQU0pOworCisJYm9vbCByZWdpc3RlclBvc3Rwcm9jZXNzb3IoQWJzdHJhY3RQcm9jZXNzb3JVbml0ICogYUZBTSk7CisKKwlib29sIHJlZ2lzdGVyUHJlZmlsdGVyKEFic3RyYWN0UHJvY2Vzc29yVW5pdCAqIGFGQU0pOworCisJYm9vbCByZWdpc3RlclBvc3RmaWx0ZXIoQWJzdHJhY3RQcm9jZXNzb3JVbml0ICogYUZBTSk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBJTklUIC8gRVhJVCAgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJdmlydHVhbCBib29sIGluaXRJbXBsKCk7CisKKwl2aXJ0dWFsIGJvb2wgZXhpdEltcGwoKTsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vICggUFJFIC8gUE9TVCApIFBST0NFU1MgIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXZpcnR1YWwgYm9vbCBwcmVwcm9jZXNzKCk7CisKKwl2aXJ0dWFsIGJvb2wgcG9zdHByb2Nlc3MoKTsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIEZJTFRFUklORyAgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJdmlydHVhbCBib29sIGZpbHRlcmluZ0luaXRpYWxpemUoKTsKKworCXZpcnR1YWwgYm9vbCBmaWx0ZXJpbmdGaW5hbGl6ZSgpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gKCBQUkUgLyBQT1NUICkgRklMVEVSICBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwl2aXJ0dWFsIGJvb2wgcHJlZmlsdGVyKCk7CisKKwl2aXJ0dWFsIGJvb2wgcG9zdGZpbHRlcigpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gUFJPQ0VTU09SIFJFUVVFU1QgQVBJIDo+IFJFTEVBU0UKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlpbmxpbmUgdm9pZCBoYW5kbGVSZXF1ZXN0UmVsZWFzZShBYnN0cmFjdFByb2Nlc3NvclVuaXQgKiBhUmVxdWVzdG9yKQorCXsKKwkJTGlzdE9mQ29udHJvbGxlclVuaXRzOjpyZW1vdmUoIGFSZXF1ZXN0b3IgKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBSRVBPUlQgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJaW5saW5lIHZpcnR1YWwgdm9pZCByZXBvcnQoT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBVTklUIFRFU1QgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJaW5saW5lIHZpcnR1YWwgdm9pZCB0ZGRVbml0UmVwb3J0KE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gTk9OLVJFR1JFU1NJT04gVEVTVCBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHRkZFJlZ3Jlc3Npb25SZXBvcnQoT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBTRVJJQUxJWkFUSU9OIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQl0b1N0cmVhbShvcywgIiIpOworCX0KKworCXZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MsIGNvbnN0IHN0ZDo6c3RyaW5nICYgaGVhZGVyKSBjb25zdDsKKworfTsKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qIEZBTV9BUElfQ09NUE9TSVRFX0NPTlRST0xMRVJfVU5JVF9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2FwaS9FeHRlbmRlclByb2Nlc3NvclVuaXQuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2FwaS9FeHRlbmRlclByb2Nlc3NvclVuaXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYWFkNjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vYXBpL0V4dGVuZGVyUHJvY2Vzc29yVW5pdC5jcHAKQEAgLTAsMCArMSwxNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxMCBtYXJzIDIwMDkKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkV4dGVuZGVyUHJvY2Vzc29yVW5pdC5oIgorCisjaW5jbHVkZSA8ZmFtL2FwaS9NYWluUHJvY2Vzc29yVW5pdC5oPgorCisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yTWFuYWdlci5oPgorCisjaW5jbHVkZSA8Zm1sL3RyYWNlL1RyYWNlRmFjdG9yeS5oPgorCisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1F1ZXJ5Lmg+CisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1dPYmplY3QuaD4KKworI2luY2x1ZGUgPHNldy9Db25maWd1cmF0aW9uLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK0V4dGVuZGVyUHJvY2Vzc29yVW5pdDo6RXh0ZW5kZXJQcm9jZXNzb3JVbml0KAorCQlTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXIgJiBhQ29udHJvbGxlclVuaXRNYW5hZ2VyLAorCQlXT2JqZWN0ICogd2ZQYXJhbWV0ZXJPYmplY3QpCis6IFJlZ2lzdGVyZWRQcm9jZXNzb3JVbml0KCBhQ29udHJvbGxlclVuaXRNYW5hZ2VyICwgd2ZQYXJhbWV0ZXJPYmplY3QgLAorCQlBVk1fUFJFX1BST0NFU1NJTkdfU1RBR0UgLCBQUkVDRURFTkNFX09GX0VYVEVOREVSX1BST0NFU1NPUiksCittTG9jYWxFeGVjdXRhYmxlRm9ybSggZ2V0Q29uZmlndXJhdGlvbigpLmdldEV4ZWN1dGFibGVTeXN0ZW0oKSAsIDAgKSwKK21UcmFjZU9iamVjdGl2ZSggT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9PUiApLAorbVRyYWNlQ2hlY2tlciggRU5WLCAmbUxvY2FsRXhlY3V0YWJsZUZvcm0gKQoreworCS8vISEgTk9USElORworfQorCisKKy8qKgorICogQ09ORklHVVJFCisgKi8KK2Jvb2wgRXh0ZW5kZXJQcm9jZXNzb3JVbml0Ojpjb25maWd1cmVJbXBsKCkKK3sKKwlBVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoIGhhc1BhcmFtZXRlcldPYmplY3QoKSApCisJCQk8PCAiVW5leHBlY3RlZCBOVUxMIEV4dGVuZGVyUHJvY2Vzc29yVW5pdCBXT2JqZWN0ICEhISIKKwkJCTw8IFNFTkRfRVhJVDsKKworCVdPYmplY3QgKiB0aGVUUkFDRSA9IFF1ZXJ5OjpnZXRSZWdleFdTZXF1ZW5jZSgKKwkJCWdldFBhcmFtZXRlcldPYmplY3QoKSwgT1JfV0lEMigidHJhY2UiLCAiVFJBQ0UiKSk7CisJaWYoICh0aGVUUkFDRSA9PSBXT2JqZWN0OjpfTlVMTF8pIHx8IHRoZVRSQUNFLT5oYXNub093bmVkRWxlbWVudCgpICkKKwl7CisJCXJldHVybiB0cnVlOworCX0KKworCS8vIENvbmZpZ3VyYXRpb24gb2YgVFJBQ0UKKwlUcmFjZUZhY3RvcnkgdHJhY2VGYWN0b3J5KGdldENvbmZpZ3VyYXRpb24oKSwgRU5WLAorCQkJZ2V0UGFyYW1ldGVyV09iamVjdCgpLCAmbUxvY2FsRXhlY3V0YWJsZUZvcm0pOworCisJaWYoIHRyYWNlRmFjdG9yeS5jb25maWd1cmUoJiBtVHJhY2VPYmplY3RpdmUpICkKKwl7CisvLwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKKy8qKgorICogUkVQT1JUIFRSQUNFCisgKi8KK3ZvaWQgRXh0ZW5kZXJQcm9jZXNzb3JVbml0OjpyZXBvcnREZWZhdWx0KE91dFN0cmVhbSAmIG9zKSBjb25zdAoreworCW9zIDw8IFRBQiA8PCAiRVhFQ1VUSU9OIENIQUlOIiA8PCBzdGQ6OmVuZGw7Cit9CisKKworLyoqCisgKiBQT1NUIFBST0NFU1MKKyAqLworYm9vbCBFeHRlbmRlclByb2Nlc3NvclVuaXQ6OnByZXByb2Nlc3MoKQoreworCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQgcG90ZW50aWFsSW5wdXRFQzsKKwlwb3RlbnRpYWxJbnB1dEVDLnNwbGljZSggZ2V0Q29uZmlndXJhdGlvbigpLmdldElucHV0Q29udGV4dCgpICk7CisKKwlMaXN0T2ZFeGVjdXRpb25Db250ZXh0Ojpjb25zdF9pdGVyYXRvciBpdCA9IHBvdGVudGlhbElucHV0RUMuYmVnaW4oKTsKKwlMaXN0T2ZFeGVjdXRpb25Db250ZXh0Ojpjb25zdF9pdGVyYXRvciBpdEVuZCA9IHBvdGVudGlhbElucHV0RUMuZW5kKCk7CisJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApCisJeworCQljb2xsZWN0Q29udGV4dChnZXRDb25maWd1cmF0aW9uKCkuZ2V0SW5wdXRDb250ZXh0KCksICooKml0KSk7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKwordm9pZCBFeHRlbmRlclByb2Nlc3NvclVuaXQ6OmNvbGxlY3RDb250ZXh0KAorCQlMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgaW5wdXRDb250ZXh0LCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQykKK3sKKwlpZiggYW5FQy5oYXNDaGlsZENvbnRleHQoKSApCisJeworCQlFeGVjdXRpb25Db250ZXh0OjpjaGlsZF9pdGVyYXRvciBpdCA9IGFuRUMuYmVnaW4oKTsKKwkJRXhlY3V0aW9uQ29udGV4dDo6Y2hpbGRfaXRlcmF0b3IgaXRFbmQgPSBhbkVDLmVuZCgpOworCQlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwkJeworCQkJY29sbGVjdENvbnRleHQoaW5wdXRDb250ZXh0LCAqKCppdCkpOworCQl9CisJfQorCS8vIGNhc2Ugb2YgbGVhZiBFQworCWVsc2UgaWYoIGFuRUMuaGFzRmxhZ3MoKSB8fCBhbkVDLmhhc0luZm8oKSApCisJeworCQlpZiggTWFpblByb2Nlc3NvclVuaXQ6OmNsZWFuRmxhZ3NJZlJlZXhlY3V0YWJsZShhbkVDKSApCisJCXsKKwkJCWFwcGVuZElmUmVxdWlyZWRFeHRlbnNpb24oaW5wdXRDb250ZXh0LCBhbkVDKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlhcHBlbmRJZlJlcXVpcmVkRXh0ZW5zaW9uKGlucHV0Q29udGV4dCwgYW5FQyk7CisJfQorfQorCisKK3ZvaWQgRXh0ZW5kZXJQcm9jZXNzb3JVbml0OjphcHBlbmRJZlJlcXVpcmVkRXh0ZW5zaW9uKAorCQlMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgaW5wdXRDb250ZXh0LCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQykKK3sKKwlpZiggbVRyYWNlT2JqZWN0aXZlLm5vbmVtcHR5KCkKKwkJJiYgbVRyYWNlQ2hlY2tlci5pc1NhdChhbkVDLCBtVHJhY2VPYmplY3RpdmUpICkKKwl7CisJCWFuRUMuZ2V0d0ZsYWdzKCkuYWRkQ292ZXJhZ2VFbGVtZW50VHJhY2UoKTsKKworLy8gVE9ETyBDcmVhdGUgSW5mbyB1c2luZyB0aGUgQXZtQ29kZSBvZiB0aGUgbVRyYWNlT2JqZWN0aXZlCisJCWFuRUMuYWRkSW5mbygqdGhpcywKKwkJCQltVHJhY2VPYmplY3RpdmUuc2luZ2xldG9uKCkKKwkJCQkJCT8gbVRyYWNlT2JqZWN0aXZlLmZpcnN0KCkKKwkJCQkJCTogbVRyYWNlT2JqZWN0aXZlLmZpcnN0KCkgKTsKKworCQlhbkVDLmdldHdGbGFncygpLmFkZE9iamVjdGl2ZUFjaGlldmVkVHJhY2UoKTsKKwl9CisJZWxzZQorCXsKKwkJaW5wdXRDb250ZXh0LmFwcGVuZCgmIGFuRUMpOworCX0KK30KKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vYXBpL0V4dGVuZGVyUHJvY2Vzc29yVW5pdC5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2FwaS9FeHRlbmRlclByb2Nlc3NvclVuaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjlmN2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2FwaS9FeHRlbmRlclByb2Nlc3NvclVuaXQuaApAQCAtMCwwICsxLDEwOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDEwIG1hcnMgMjAwOQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEVYVEVOREVSUFJPQ0VTU09SVU5JVF9IXworI2RlZmluZSBFWFRFTkRFUlBST0NFU1NPUlVOSVRfSF8KKworI2luY2x1ZGUgPGZhbS9hcGkvQWJzdHJhY3RQcm9jZXNzb3JVbml0Lmg+CisKKyNpbmNsdWRlIDxjb2xsZWN0aW9uL1R5cGVkZWYuaD4KKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVGb3JtLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9Bdm1Db2RlLmg+CisKKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25Db250ZXh0Lmg+CisKKyNpbmNsdWRlIDxmbWwvdHJhY2UvVHJhY2VDaGVja2VyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXI7CisKKworY2xhc3MgRXh0ZW5kZXJQcm9jZXNzb3JVbml0ICA6CisJCXB1YmxpYyBBdXRvUmVnaXN0ZXJlZFByb2Nlc3NvclVuaXQ8IEV4dGVuZGVyUHJvY2Vzc29yVW5pdCA+Cit7CisKKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggRXh0ZW5kZXJQcm9jZXNzb3JVbml0ICkKKworCisJLyoqCisJICogUFJPQ0VTU09SIEZBQ1RPUlkKKwkgKiBmb3IgYXV0b21hdGljIHJlZ2lzdHJhdGlvbiBpbiB0aGUgcHJvY2Vzc29yIHJlcG9zaXRvcnkKKwkgKiB0aGUgWyBbIEZVTExZIF0gUVVBTElGSUVEIF0gTkFNRSBJRAorCSAqLworCUFWTV9JTkpFQ1RfQVVUT19SRUdJU1RFUl9RVUFMSUZJRURfSURfS0VZXzMoCisJCQkic3ltYmV4LmV4dGVuZGVyIiwKKwkJCSJhdm06OnByb2Nlc3Nvci5FWEVDVVRJT05fQ0hBSU4iLAorCQkJImF2bTo6Y29yZS5wcm9jZXNzLkVYRUNVVElPTl9DSEFJTiIgKQorCS8vIGVuZCByZWdpc3RyYXRpb24KKworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQVRUUklCVVRFCisJICovCisJRXhlY3V0YWJsZUZvcm0gbUxvY2FsRXhlY3V0YWJsZUZvcm07CisKKwlBdm1Db2RlIG1UcmFjZU9iamVjdGl2ZTsKKworCVRyYWNlQ2hlY2tlciBtVHJhY2VDaGVja2VyOworCitwdWJsaWM6CisJRXh0ZW5kZXJQcm9jZXNzb3JVbml0KFN5bWJleENvbnRyb2xsZXJVbml0TWFuYWdlciAmIGFDb250cm9sbGVyVW5pdE1hbmFnZXIsCisJCQlXT2JqZWN0ICogd2ZQYXJhbWV0ZXJPYmplY3QpOworCisJdmlydHVhbCB+RXh0ZW5kZXJQcm9jZXNzb3JVbml0KCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogQ09ORklHVVJFCisJICovCisJdmlydHVhbCBib29sIGNvbmZpZ3VyZUltcGwoKTsKKworCisJLyoqCisJICogUkVQT1JUIFRSQUNFCisJICovCisJaW5saW5lIHZpcnR1YWwgdm9pZCByZXBvcnRTaWxlbnQoT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQkvLyBTSUxFTlQgPT4gTk9USElORworCX0KKworCXZpcnR1YWwgdm9pZCByZXBvcnREZWZhdWx0KE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworCisJLyoqCisJICogUE9TVCBQUk9DRVNTCisJICovCisJdmlydHVhbCBib29sIHByZXByb2Nlc3MoKTsKKworCXZvaWQgY29sbGVjdENvbnRleHQoCisJCQlMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgaW5wdXRDb250ZXh0LCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQyk7CisKKwl2b2lkIGFwcGVuZElmUmVxdWlyZWRFeHRlbnNpb24oCisJCQlMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgaW5wdXRDb250ZXh0LCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQyk7Cit9OworCisKK30KKworI2VuZGlmIC8qIEVYVEVOREVSUFJPQ0VTU09SVU5JVF9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2FwaS9JUHJvY2Vzc29yVW5pdFRlc3QuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2FwaS9JUHJvY2Vzc29yVW5pdFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZTc2NWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vYXBpL0lQcm9jZXNzb3JVbml0VGVzdC5jcHAKQEAgLTAsMCArMSwxMDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyNCBtYXJzIDIwMTUKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIklQcm9jZXNzb3JVbml0VGVzdC5oIgorCisjaW5jbHVkZSA8dXRpbC9hdm1fdmZzLmg+CisKKyNpbmNsdWRlIDxmYW0vYXBpL0Fic3RyYWN0UHJvY2Vzc29yVW5pdC5oPgorCisjaW5jbHVkZSA8c2V3L0NvbmZpZ3VyYXRpb24uaD4KKyNpbmNsdWRlIDxzZXcvV29ya2Zsb3cuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoqCisgKiBMT0NBTCBDT05GSUdVUkFUSU9OCisgKi8KKy8vIFRFU1QgRFJJVkVOIERFVkVMT1BNRU5UCisvL3NlY3Rpb24gVERECisvLwlAcmVwb3J0ID0gImF2bS50ZGQiOworLy8KKy8vCUByZWdyZXNzaW9uID0gdHJ1ZTsKKy8vCUB1bml0ID0gdHJ1ZTsKKy8vZW5kc2VjdGlvbiBUREQKKworYm9vbCBJUHJvY2Vzc29yVW5pdFRlc3Q6OnRkZENvbmZpZ3VyZUltcGwoKQoreworCVdPYmplY3QgKiB0aGVUREQgPSBRdWVyeTo6Z2V0UmVnZXhXU2VxdWVuY2UoCisJCQltUHJvY2Vzc29yVW5pdC5nZXRQYXJhbWV0ZXJXT2JqZWN0KCksIE9SX1dJRDIoInRkZCIsICJUREQiKSk7CisJaWYoIHRoZVRERCAhPSBXT2JqZWN0OjpfTlVMTF8gKQorCXsKKwkJLy8gTG9jYWxseSBlbmFibGUgb3Igbm90IG5vbi1yZWdyZXNzaW9uIHRlc3RpbmcKKwkJYm9vbCBpc1JlZ3Jlc3Npb25UZXN0aW5nID0gUXVlcnk6OmdldFdQcm9wZXJ0eUJvb2xlYW4oCisJCQkJbVByb2Nlc3NvclVuaXQuZ2V0Q29uZmlndXJhdGlvbigpLmdldFdvcmtmbG93KCkuZ2V0VEREKCksCisJCQkJInJlZ3Jlc3Npb24iLCBmYWxzZSk7CisKKwkJaXNSZWdyZXNzaW9uVGVzdGluZyA9IFF1ZXJ5OjpnZXRXUHJvcGVydHlCb29sZWFuKAorCQkJCXRoZVRERCwgInJlZ3Jlc3Npb24iLCBpc1JlZ3Jlc3Npb25UZXN0aW5nKTsKKworCQkvLyBMb2NhbGx5IGVuYWJsZSBvciBub3QgVW5pdCB0ZXN0aW5nCisJCWJvb2wgaXNVbml0VGVzdGluZyA9IFdvcmtmbG93OjpJTlNUQU5DRS0+aXNUZGRVbml0VGVzdGluZygpOworCQlpc1VuaXRUZXN0aW5nID0gUXVlcnk6OmdldFdQcm9wZXJ0eUJvb2xlYW4oCisJCQkJdGhlVERELCAidW5pdCIsIGlzVW5pdFRlc3RpbmcpOworCisJCS8vIExvY2FsbHkgcmVwb3J0IGZpbGUgbG9jYXRpb24KKwkJaWYoIGlzUmVncmVzc2lvblRlc3RpbmcgfHwgaXNVbml0VGVzdGluZyApCisJCXsKKwkJCXN0ZDo6c3RyaW5nIHRkZExvY2F0aW9uID0KKwkJCQkJUXVlcnk6OmdldFdQcm9wZXJ0eVN0cmluZyh0aGVUREQsICJyZXBvcnQiLCAiIik7CisJCQlpZiggbm90IHRkZExvY2F0aW9uLmVtcHR5KCkgKQorCQkJeworCQkJCXRkZExvY2F0aW9uID0gVkZTOjpuYXRpdmVfcGF0aCh0ZGRMb2NhdGlvbiwgVkZTOjpQcm9qZWN0VGRkUGF0aCk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworLyoqCisgKiBQcm9jZXNzb3JVbml0CisgKiByZXBvcnQgYmVnaW5uaW5nIC8gZW5kaW5nCisgKi8KK3ZvaWQgSVByb2Nlc3NvclVuaXRUZXN0Ojp0ZGRSZXBvcnRCZWdpbm5pbmcoT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJaWYoIG1Qcm9jZXNzb3JVbml0Lmhhc1BhcmFtZXRlcldPYmplY3QoKSApCisJeworCQlvcyA8PCBUQUIgPDwgInByb2Nlc3NvciAiCisJCQkJPDwgbVByb2Nlc3NvclVuaXQuZ2V0UGFyYW1ldGVyV09iamVjdCgpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQkJPDwgc3RkOjplbmRsOworCX0KK30KKwordm9pZCBJUHJvY2Vzc29yVW5pdFRlc3Q6OnRkZFJlcG9ydEVuZGluZyhPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlpZiggbVByb2Nlc3NvclVuaXQuaGFzUGFyYW1ldGVyV09iamVjdCgpICkKKwl7CisJCW9zIDw8IFRBQiA8PCAiLy8gZW5kIHByb2Nlc3NvciAiCisJCQkJPDwgbVByb2Nlc3NvclVuaXQuZ2V0UGFyYW1ldGVyV09iamVjdCgpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQkJPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKwl9Cit9CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vYXBpL0lQcm9jZXNzb3JVbml0VGVzdC5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2FwaS9JUHJvY2Vzc29yVW5pdFRlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGIxZTMyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2FwaS9JUHJvY2Vzc29yVW5pdFRlc3QuaApAQCAtMCwwICsxLDExOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDI0IG1hcnMgMjAxNQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIElQUk9DRVNTT1JVTklUVEVTVF9IXworI2RlZmluZSBJUFJPQ0VTU09SVU5JVFRFU1RfSF8KKworI2luY2x1ZGUgPHByaW50ZXIvT3V0U3RyZWFtLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBBYnN0cmFjdFByb2Nlc3NvclVuaXQ7CisKKworY2xhc3MgSVByb2Nlc3NvclVuaXRUZXN0Cit7CisKK3ByaXZhdGU6CisJLyoqCisJICogQVRUUklCVVRFUworCSAqLworCUFic3RyYWN0UHJvY2Vzc29yVW5pdCAmIG1Qcm9jZXNzb3JVbml0OworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJSVByb2Nlc3NvclVuaXRUZXN0KEFic3RyYWN0UHJvY2Vzc29yVW5pdCAmIGFQcm9jZXNzb3JVbml0KQorCTogbVByb2Nlc3NvclVuaXQoIGFQcm9jZXNzb3JVbml0ICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5JUHJvY2Vzc29yVW5pdFRlc3QoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBMT0NBTCBDT05GSUdVUkFUSU9OCisJICovCisJdmlydHVhbCBib29sIHRkZENvbmZpZ3VyZUltcGwoKTsKKworCisJLyoqCisJICogUHJvY2Vzc29yVW5pdAorCSAqIHJlcG9ydCBiZWdpbm5pbmcgLyBlbmRpbmcKKwkgKi8KKwl2aXJ0dWFsIHZvaWQgdGRkUmVwb3J0QmVnaW5uaW5nKE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworCXZpcnR1YWwgdm9pZCB0ZGRSZXBvcnRFbmRpbmcoT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gVU5JVCBURVNUIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXZpcnR1YWwgdm9pZCB0ZGRVbml0UmVwb3J0KE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJdGRkUmVwb3J0QmVnaW5uaW5nKG9zKTsKKworCQlvcyA8PCBJTkNSX0lOREVOVDsKKwkJdGRkVW5pdFJlcG9ydEltcGwob3MpOworCQlvcyA8PCBERUNSX0lOREVOVDsKKworCQl0ZGRSZXBvcnRFbmRpbmcob3MpOworCX0KKworCXZpcnR1YWwgdm9pZCB0ZGRVbml0UmVwb3J0SW1wbChPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCS8vISEgVE8gSU1QTEVNRU5UCisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gTk9OLVJFR1JFU1NJT04gVEVTVCBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwl2aXJ0dWFsIHZvaWQgdGRkUmVncmVzc2lvblJlcG9ydChPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCXRkZFJlcG9ydEJlZ2lubmluZyhvcyk7CisKKwkJb3MgPDwgSU5DUl9JTkRFTlQ7CisJCXRkZFJlZ3Jlc3Npb25SZXBvcnRJbXBsKG9zKTsKKwkJb3MgPDwgREVDUl9JTkRFTlQ7CisKKwkJdGRkUmVwb3J0RW5kaW5nKG9zKTsKKwl9CisKKwl2aXJ0dWFsIHZvaWQgdGRkUmVncmVzc2lvblJlcG9ydEltcGwoT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQkvLyEhIFRPIElNUExFTUVOVAorCX0KKworfTsKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qIElQUk9DRVNTT1JVTklUVEVTVF9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2FwaS9NYWluUHJvY2Vzc29yVW5pdC5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vYXBpL01haW5Qcm9jZXNzb3JVbml0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDAwNmVkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2FwaS9NYWluUHJvY2Vzc29yVW5pdC5jcHAKQEAgLTAsMCArMSwxMDc0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiTWFpblByb2Nlc3NvclVuaXQuaCIKKworI2luY2x1ZGUgPGZzdHJlYW0+CisKKyNpbmNsdWRlIDxjb21wdXRlci9wcmltaXRpdmUvQXZtQ29tbXVuaWNhdGlvblJkdlByaW1pdGl2ZS5oPgorCisjaW5jbHVkZSA8ZmFtL2FwaS9Qcm9jZXNzb3JVbml0UmVwb3NpdG9yeS5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uQ29udGV4dC5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkRhdGEuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25JbmZvcm1hdGlvbi5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL1J1bnRpbWVEZWYuaD4KKworI2luY2x1ZGUgPGZtbC90cmFjZS9UcmFjZUZhY3RvcnkuaD4KKworI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9RdWVyeS5oPgorI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9XT2JqZWN0Lmg+CisKKyNpbmNsdWRlIDxzZXcvQ29uZmlndXJhdGlvbi5oPgorI2luY2x1ZGUgPHNldy9TeW1iZXhEaXNwYXRjaGVyLmg+CisjaW5jbHVkZSA8c2V3L1N5bWJleENvbnRyb2xsZXJSZXF1ZXN0TWFuYWdlci5oPgorI2luY2x1ZGUgPHNldy9Xb3JrZmxvdy5oPgorCisjaW5jbHVkZSA8c29sdmVyL2FwaS9Tb2x2ZXJGYWN0b3J5Lmg+CisKKyNpbmNsdWRlIDx1dGlsL2F2bV92ZnMuaD4KKworI2luY2x1ZGUgPGJvb3N0L2Zvcm1hdC5ocHA+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorcHJvdG90eXBlIGZpbHRlcjo6c3RvcF9jcml0ZXJpYSBhcyBhdm06OnByb2Nlc3Nvci5NQUlOIGlzCisJc2VjdGlvbiBQUk9QRVJUWQorCQlAbm9kZSAgID0gNTA7CisKKwkJQHJlcG9ydCA9IDUwMDAwMDsKKwkJQHNhdmUgICA9IDUwMDAwMDsKKworCQlAZXZhbCAgID0gMTAwMDAwOworCisJCUBoZWlnaHQgPSAxMDAwOworCQlAd2lkdGggID0gMTAwOworCisJCUBsb29wI2RldGVjdGlvbiN0cml2aWFsID0gdHJ1ZTsKKwllbmRzZWN0aW9uIFBST1BFUlRZCisKKwlzZWN0aW9uIExPRworCQkvLyAlMSUgLS0+IGV2YWwgc3RlcCBjb3VudAorCQkvLyAlMiUgLS0+IGNvbnRleHQgY291bnQKKwkJLy8gJTMlIC0tPiBjb250ZXh0IGhlaWdodAorCQkvLyAlMyUgLS0+IGNvbnRleHQgd2lkdGgKKwkJQGV2YWwgICA9ICJzdGVwOiUxJSAsIGNvbnRleHQ6JTIlICwgaGVpZ2h0OiUzJSAsIHdpZHRoOiU0JSAiOworCQlAcmVzdWx0ID0gInN0ZXA6JTElICwgY29udGV4dDolMiUgLCBoZWlnaHQ6JTMlICwgd2lkdGg6JTQlICI7CisJCUByZXBvcnQgPSAic3RvcDolMSUgLCBjb250ZXh0OiUyJSAsIGhlaWdodDolMyUgLCB3aWR0aDolNCUgIjsKKwllbmRzZWN0aW9uIExPRworZW5kcHJvdG90eXBlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworCisKKy8qKgorICogQ09ORklHVVJFCisgKi8KK2Jvb2wgTWFpblByb2Nlc3NvclVuaXQ6OmNvbmZpZ3VyZUltcGwoKQoreworCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggaGFzUGFyYW1ldGVyV09iamVjdCgpICkKKwkJCTw8ICJVbmV4cGVjdGVkIGEgPG51bGw+IE1haW5Qcm9jZXNzb3JVbml0IFdPYmplY3QgISEhIgorCQkJPDwgU0VORF9FWElUOworCisJLy8gU2hlbGwgY29uZmlnCisJV09iamVjdCAqIGNvbmZpZ1NIRUxMID0gUXVlcnk6OmdldFJlZ2V4V1NlcXVlbmNlKAorCQkJZ2V0UGFyYW1ldGVyV09iamVjdCgpLCBXb3JrZmxvdzo6U0VDVElPTl9TSEVMTF9SRUdFWF9JRCk7CisKKwltSW5jb25kaXRpb25hbFN0b3BNYXJrZXJMb2NhdGlvbiA9CisJCQlRdWVyeTo6Z2V0V1Byb3BlcnR5U3RyaW5nKGNvbmZpZ1NIRUxMLCAic3RvcCIsICIiKTsKKwlpZiggbUluY29uZGl0aW9uYWxTdG9wTWFya2VyTG9jYXRpb24uZW1wdHkoKSApCisJeworCQltSW5jb25kaXRpb25hbFN0b3BNYXJrZXJMb2NhdGlvbiA9CisJCQkJZ2V0Q29uZmlndXJhdGlvbigpLmdldEluY29uZGl0aW9uYWxTdG9wTWFya2VyTG9jYXRpb24oKTsKKwl9CisJZWxzZQorCXsKKwkJbUluY29uZGl0aW9uYWxTdG9wTWFya2VyTG9jYXRpb24gPQorCQkJCVZGUzo6bmF0aXZlX3BhdGgobUluY29uZGl0aW9uYWxTdG9wTWFya2VyTG9jYXRpb24pOworCisJCW1JbmNvbmRpdGlvbmFsU3RvcE1hcmtlckxvY2F0aW9uID0gVkZTOjpuYXRpdmVfcGF0aCgKKwkJCQltSW5jb25kaXRpb25hbFN0b3BNYXJrZXJMb2NhdGlvbiwgVkZTOjpXb3Jrc3BhY2VMb2dQYXRoKTsKKwl9CisKKwltSW5jb25kaXRpb25hbFN0b3BNYXJrZXJDaGVja2luZ1BlcmlvZCA9IDEwMDA7CisJbUluY29uZGl0aW9uYWxTdG9wTWFya2VyRmxhZyA9IGZhbHNlOworCisKK0FWTV9JRl9ERUJVR19FTkFCTEVECisJbUNvbmZpZ0ZsYWcgPSBJRGVidWdQcm9jZXNzb3JQcm92aWRlcjo6ZGVidWdDb25maWd1cmVJbXBsKAorCQkJZ2V0UGFyYW1ldGVyV09iamVjdCgpICkgfHwgbUNvbmZpZ0ZsYWc7CitBVk1fRU5ESUZfREVCVUdfRU5BQkxFRAorCisKKwlpZiggbm90IGhhc1BhcmFtZXRlcldPYmplY3QoKSApCisJeworCQlyZXR1cm4oIG1Db25maWdGbGFnICk7CisJfQorCisKKwlXT2JqZWN0ICogdGhlUFJPUEVSVFkgPSBRdWVyeTo6Z2V0V1NlcXVlbmNlT3JFbHNlKAorCQkJZ2V0UGFyYW1ldGVyV09iamVjdCgpLCAibGltaXQiLCAiUFJPUEVSVFkiKTsKKwlpZiggdGhlUFJPUEVSVFkgIT0gV09iamVjdDo6X05VTExfICkKKwl7CisJCW1Ob2RlQ291bnRMaW1pdCA9IFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eVNpemVUKAorCQkJCXRoZVBST1BFUlRZLCBTVUZGSVhfV0lEKCJub2RlIiwgImNvdW50IiksCisJCQkJQVZNX05VTUVSSUNfTUFYX1NJWkVfVCwgQVZNX05VTUVSSUNfTUFYX1NJWkVfVCk7CisKKwkJbVJlcG9ydFBvaW50ID0gbVJlcG9ydEZyZXF1ZW5jeSA9CisJCQkJUXVlcnk6OmdldFdQcm9wZXJ0eVNpemVUKHRoZVBST1BFUlRZLCAicmVwb3J0IiwKKwkJCQkJCUFWTV9OVU1FUklDX01BWF9TSVpFX1QsIEFWTV9OVU1FUklDX01BWF9TSVpFX1QpOworCisJCW1TYXZlUG9pbnQgPSBtU2F2ZUZyZXF1ZW5jeSA9CisJCQkJUXVlcnk6OmdldFdQcm9wZXJ0eVNpemVUKHRoZVBST1BFUlRZLCAic2F2ZSIsCisJCQkJCQlBVk1fTlVNRVJJQ19NQVhfU0laRV9ULCBBVk1fTlVNRVJJQ19NQVhfU0laRV9UKTsKKy8vCQlpZiggbVNhdmVGcmVxdWVuY3kgPCAxMDAgKQorLy8JCXsKKy8vQVZNX0lGX0RFQlVHX0ZMQUcoIENPTkZJR1VSSU5HICkKKy8vCUFWTV9PU19MT0cgPDwgIkludmFsaWQgc2F2ZSBwZXJpb2QgPDwgIiA8PCBtU2F2ZUZyZXF1ZW5jeQorLy8JCQk8PCAiID4+ID0+IHJlcGxhY2UgYnkgPDwgIiA8PCAxMCAqIG1TYXZlRnJlcXVlbmN5IDw8ICIgPj4gISEhIgorLy8JCQk8PCBzdGQ6OmVuZGw7CisvL0FWTV9FTkRJRl9ERUJVR19GTEFHKCBDT05GSUdVUklORyApCisvLworLy8JCQltU2F2ZVBvaW50ID0gbVNhdmVGcmVxdWVuY3kgPSAxMCAqIG1TYXZlRnJlcXVlbmN5OworLy8JCX0KKworCQltRXZhbFN0ZXBMaW1pdCA9IFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eVNpemVUKHRoZVBST1BFUlRZLAorCQkJCU9SX1dJRDIoU1VGRklYX1dJRCgiKHJ1bnxldmFsKSIsICJzdGVwIiksICJzdGVwIiksCisJCQkJQVZNX05VTUVSSUNfTUFYX1NJWkVfVCwgQVZNX05VTUVSSUNfTUFYX1NJWkVfVCk7CisKKwkJbU5vZGVIZWlnaHRMaW1pdCA9IFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eVNpemVUKAorCQkJCXRoZVBST1BFUlRZLCBQUkVGSVhfV0lEKCJub2RlIiwgImhlaWdodCIpLAorCQkJCUFWTV9OVU1FUklDX01BWF9TSVpFX1QsIEFWTV9OVU1FUklDX01BWF9TSVpFX1QpOworCisJCW1Ob2RlV2lkdGhMaW1pdCA9IFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eVNpemVUKAorCQkJCXRoZVBST1BFUlRZLCBQUkVGSVhfV0lEKCJub2RlIiwgIndpZHRoIiksCisJCQkJQVZNX05VTUVSSUNfTUFYX1NJWkVfVCwgQVZNX05VTUVSSUNfTUFYX1NJWkVfVCk7CisJfQorCisKKwlXT2JqZWN0ICogdGhlRVhURU5ERVIgPSBRdWVyeTo6Z2V0UmVnZXhXU2VxdWVuY2UoCisJCQlnZXRQYXJhbWV0ZXJXT2JqZWN0KCksIE9SX1dJRDIoImV4dGVuZGVyIiwgIkVYVEVOREVSIikpOworCWlmKCAodGhlRVhURU5ERVIgIT0gV09iamVjdDo6X05VTExfKSAmJiB0aGVFWFRFTkRFUi0+aGFzT3duZWRFbGVtZW50KCkgKQorCXsKKwkJLy8gQ29uZmlndXJhdGlvbiBvZiBUUkFDRQorCQlUcmFjZUZhY3RvcnkgdHJhY2VGYWN0b3J5KGdldENvbmZpZ3VyYXRpb24oKSwgRU5WLAorCQkJCWdldFBhcmFtZXRlcldPYmplY3QoKSwgJm1Mb2NhbEV4ZWN1dGFibGVGb3JtKTsKKworCQlpZiggbm90IHRyYWNlRmFjdG9yeS5jb25maWd1cmUodGhlRVhURU5ERVIsICYgbVRyYWNlT2JqZWN0aXZlKSApCisJCXsKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KKworCXJldHVybiggbUNvbmZpZ0ZsYWcgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUFJPQ0VTU0lORyBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvKioKKyAqIFBPU1QgUFJPQ0VTUworICovCitib29sIE1haW5Qcm9jZXNzb3JVbml0Ojpjb2xsZWN0RXh0ZW5kZWRDb250ZXh0KCkKK3sKKwlMaXN0T2ZFeGVjdXRpb25Db250ZXh0IHBvdGVudGlhbElucHV0RUM7CisJcG90ZW50aWFsSW5wdXRFQy5zcGxpY2UoIGdldENvbmZpZ3VyYXRpb24oKS5nZXRJbnB1dENvbnRleHQoKSApOworCisJTGlzdE9mRXhlY3V0aW9uQ29udGV4dDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBwb3RlbnRpYWxJbnB1dEVDLmJlZ2luKCk7CisJTGlzdE9mRXhlY3V0aW9uQ29udGV4dDo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBwb3RlbnRpYWxJbnB1dEVDLmVuZCgpOworCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQorCXsKKwkJY29sbGVjdENvbnRleHQoZ2V0Q29uZmlndXJhdGlvbigpLmdldElucHV0Q29udGV4dCgpLCAqKCppdCkpOworCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKK3ZvaWQgTWFpblByb2Nlc3NvclVuaXQ6OmNvbGxlY3RDb250ZXh0KAorCQlMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgaW5wdXRDb250ZXh0LCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQykKK3sKKwlpZiggYW5FQy5oYXNDaGlsZENvbnRleHQoKSApCisJeworCQlFeGVjdXRpb25Db250ZXh0Ojpyd19jaGlsZF9pdGVyYXRvciBpdCA9IGFuRUMuYmVnaW4oKTsKKwkJRXhlY3V0aW9uQ29udGV4dDo6cndfY2hpbGRfaXRlcmF0b3IgaXRFbmQgPSBhbkVDLmVuZCgpOworCQlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwkJeworCQkJY29sbGVjdENvbnRleHQoaW5wdXRDb250ZXh0LCAqKCppdCkpOworCQl9CisJfQorCS8vIGNhc2Ugb2YgbGVhZiBFQworCWVsc2UgaWYoIGFuRUMuaGFzRmxhZ3MoKSB8fCBhbkVDLmhhc0luZm8oKSApCisJeworCQlpZiggTWFpblByb2Nlc3NvclVuaXQ6OmNsZWFuRmxhZ3NJZlJlZXhlY3V0YWJsZShhbkVDKSApCisJCXsKKwkJCWFwcGVuZElmUmVxdWlyZWRFeHRlbnNpb24oaW5wdXRDb250ZXh0LCBhbkVDKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlhcHBlbmRJZlJlcXVpcmVkRXh0ZW5zaW9uKGlucHV0Q29udGV4dCwgYW5FQyk7CisJfQorfQorCisKK3ZvaWQgTWFpblByb2Nlc3NvclVuaXQ6OmFwcGVuZElmUmVxdWlyZWRFeHRlbnNpb24oCisJCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBpbnB1dENvbnRleHQsIEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKQoreworCWlmKCBtVHJhY2VPYmplY3RpdmUubm9uZW1wdHkoKQorCQkmJiBtVHJhY2VDaGVja2VyLmlzU2F0KGFuRUMsIG1UcmFjZU9iamVjdGl2ZSkgKQorCXsKKwkJYW5FQy5nZXR3RmxhZ3MoKS5hZGRDb3ZlcmFnZUVsZW1lbnRUcmFjZSgpOworCisvLyBUT0RPIENyZWF0ZSBJbmZvIHVzaW5nIHRoZSBBdm1Db2RlIG9mIHRoZSBtVHJhY2VPYmplY3RpdmUKKwkJYW5FQy5hZGRJbmZvKCp0aGlzLAorCQkJCW1UcmFjZU9iamVjdGl2ZS5zaW5nbGV0b24oKQorCQkJCQkJPyBtVHJhY2VPYmplY3RpdmUuZmlyc3QoKQorCQkJCQkJOiBtVHJhY2VPYmplY3RpdmUuZmlyc3QoKSApOworCisJCWFuRUMuZ2V0d0ZsYWdzKCkuYWRkT2JqZWN0aXZlQWNoaWV2ZWRUcmFjZSgpOworCX0KKwllbHNlCisJeworCQlpbnB1dENvbnRleHQuYXBwZW5kKCYgYW5FQyk7CisJfQorfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBGSUxURVJJTkcgQVBJCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKKyAqIHByZUV2YWwgRmlsdGVyCisgKi8KK2Jvb2wgTWFpblByb2Nlc3NvclVuaXQ6OnByZWZpbHRlcigpCit7CisJZWNRdWV1ZSA9ICYoIGdldEV4ZWN1dGlvblF1ZXVlKCkuZ2V0UmVhZHlRdWV1ZSgpICk7CisJZWNRdWV1ZUl0RW5kID0gZWNRdWV1ZS0+ZW5kKCk7CisJZm9yKCBlY1F1ZXVlSXQgPSBlY1F1ZXVlLT5iZWdpbigpIDsgZWNRdWV1ZUl0ICE9IGVjUXVldWVJdEVuZCA7ICkKKwl7CisJCWlmKCBub3QgcHJlZmlsdGVyKCogKCplY1F1ZXVlSXQpKSApCisJCXsKKwkJCWdldEV4ZWN1dGlvblF1ZXVlKCkuYXBwZW5kRmFpbGVkKCAqZWNRdWV1ZUl0ICk7CisKKwkJCWVjUXVldWVJdCA9IGVjUXVldWUtPmVyYXNlKGVjUXVldWVJdCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkrK2VjUXVldWVJdDsKKwkJfQorCX0KKworCXJldHVybiggZ2V0RXhlY3V0aW9uUXVldWUoKS5oYXNSZWFkeSgpICk7Cit9CisKKworYm9vbCBNYWluUHJvY2Vzc29yVW5pdDo6cHJlZmlsdGVyKEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKQoreworCWF2bV91aW50MzJfdCB0aGVOZXh0RXZhbE51bWJlciA9IGdldFN5bWJleERpc3BhdGNoZXIoKS5nZXRFdmFsTnVtYmVyKCk7CisKKwlpZiggKG5vdCBtSW5jb25kaXRpb25hbFN0b3BNYXJrZXJGbGFnKQorCQkmJiAobm90IG1JbmNvbmRpdGlvbmFsU3RvcE1hcmtlckxvY2F0aW9uLmVtcHR5KCkpCisJCSYmICgodGhlTmV4dEV2YWxOdW1iZXIgJSBtSW5jb25kaXRpb25hbFN0b3BNYXJrZXJDaGVja2luZ1BlcmlvZCkgPT0gMCkgKQorCXsKKwkJY2hlY2tSZWFkRXZhbFN0b3BTY3JpcHQoKTsKKwl9CisKKwlpZiggbUluY29uZGl0aW9uYWxTdG9wTWFya2VyRmxhZyApCisJeworCQlhbkVDLmdldHdGbGFncygpLnNldEludGVycnVwdFVzZXJSZXF1ZXN0KCk7CisKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCisJaWYoIChtRXZhbFN0ZXBMaW1pdCAgID4gIHRoZU5leHRFdmFsTnVtYmVyKQorCisvLwkJJiYgKG1Ob2RlQ291bnRMaW1pdCAgPj0gYW5FQy5nZXRJZE51bWJlcigpKQorCQkmJiAobU5vZGVDb3VudExpbWl0ICA+PSBFeGVjdXRpb25Db250ZXh0SGVhZGVyOjpJRF9OVU1CRVIpCisKKwkJJiYgKG1Ob2RlSGVpZ2h0TGltaXQgPj0gYW5FQy5nZXRIZWlnaHQoKSkKKwkJJiYgKG1Ob2RlV2lkdGhMaW1pdCAgPj0gYW5FQy5nZXRXaWR0aCgpKSApCisJeworCQlpZiggdGhlTmV4dEV2YWxOdW1iZXIgPiBtUmVwb3J0UG9pbnQgKQorCQl7CisJCQlBVk1fT1NfSU5GTyA8PCBFT0wgPDwgRU1QSEFTSVMoIlJlcG9ydCBQb2ludCAuLi4iLCAnKicsIDgwKTsKKwkJCWdldENvbnRyb2xsZXJVbml0TWFuYWdlcigpLnJlcG9ydCggQVZNX09TX1RSQUNFICk7CisJCQlnZXRDb250cm9sbGVyVW5pdE1hbmFnZXIoKS5yZXBvcnQoIEFWTV9PU19DT1VUICApOworCQkJZ2V0Q29udHJvbGxlclVuaXRNYW5hZ2VyKCkucmVwb3J0KCBBVk1fT1NfTE9HICAgKTsKKworCQkJbVJlcG9ydFBvaW50ID0gbVJlcG9ydFBvaW50ICsgbVJlcG9ydEZyZXF1ZW5jeTsKKwkJfQorCisJCWlmKCB0aGVOZXh0RXZhbE51bWJlciA+IG1TYXZlUG9pbnQgKQorCQl7CisJCQlBVk1fT1NfV0FSTiAgPDwgRU1QSEFTSVMoIlNhdmUgUG9pbnQgLi4uIiwgJyonLCA4MCk7CisKKwkJCWdldENvbmZpZ3VyYXRpb24oKS5zZXJpYWxpemVDb21wdXRpbmdSZXN1bHQoKTsKKworCQkJbVNhdmVQb2ludCA9IG1TYXZlUG9pbnQgKyBtU2F2ZUZyZXF1ZW5jeTsKKwkJfQorCQlyZXR1cm4oIHRydWUgKTsKKwl9CisJZWxzZQorCXsKKwkJKyttU3RvcENvdW50OworCisJCWlmKCBtRXZhbFN0ZXBMaW1pdCA8PSB0aGVOZXh0RXZhbE51bWJlciApCisJCXsKKwkJCWFuRUMuZ2V0d0ZsYWdzKCkuYWRkUmVhY2hlZFN5bWJleFN0ZXBMaW1pdCgpOworCQl9CisKKy8vCQlpZiggbU5vZGVDb3VudExpbWl0IDwgYW5FQy5nZXRJZE51bWJlcigpICkKKwkJaWYoIG1Ob2RlQ291bnRMaW1pdCA8IEV4ZWN1dGlvbkNvbnRleHRIZWFkZXI6OklEX05VTUJFUiApCisJCXsKKwkJCWFuRUMuZ2V0d0ZsYWdzKCkuYWRkUmVhY2hlZE5vZGVDb3VudExpbWl0KCk7CisJCX0KKworCQlpZiggbU5vZGVIZWlnaHRMaW1pdCA8IGFuRUMuZ2V0SGVpZ2h0KCkgKQorCQl7CisJCQlhbkVDLmdldHdGbGFncygpLmFkZFJlYWNoZWROb2RlSGVpZ2h0TGltaXQoKTsKKwkJfQorCQlpZiggbU5vZGVXaWR0aExpbWl0IDwgYW5FQy5nZXRXaWR0aCgpICkKKwkJeworCQkJYW5FQy5nZXR3RmxhZ3MoKS5hZGRSZWFjaGVkTm9kZVdpZHRoTGltaXQoKTsKKwkJfQorCisJCXJldHVybiggZmFsc2UgKTsKKwl9Cit9CisKKworYm9vbCBNYWluUHJvY2Vzc29yVW5pdDo6ZmluYWxpemVQcmVmaWx0ZXJpbmcoKQoreworLy8JZWNRdWV1ZSA9ICYoIGdldEV4ZWN1dGlvblF1ZXVlKCkuZ2V0UmVhZHlRdWV1ZSgpICk7CisvLwllY1F1ZXVlSXRFbmQgPSBlY1F1ZXVlLT5lbmQoKTsKKy8vCWZvciggZWNRdWV1ZUl0ID0gZWNRdWV1ZS0+YmVnaW4oKSA7IGVjUXVldWVJdCAhPSBlY1F1ZXVlSXRFbmQgOyApCisvLwl7CisvLwkJc2V0Q29udGV4dFdpZHRoKCAqZWNRdWV1ZUl0ICk7CisvLworLy8JCWlmKCAoKmVjUXVldWVJdCktPmdldFdpZHRoKCkgPiBtTm9kZVdpZHRoTGltaXQgKQorLy8JCXsKKy8vCQkJKCplY1F1ZXVlSXQpLT5nZXR3RmxhZ3MoKS5hZGRSZWFjaGVkTm9kZVdpZHRoTGltaXQoKTsKKy8vCQkJKCplY1F1ZXVlSXQpLT5hZGRJbmZvKCp0aGlzLCBJTkZPX1NUT1BfV0lEVEhfREFUQSk7CisvLworLy8JCQlnZXRFeGVjdXRpb25RdWV1ZSgpLmFwcGVuZEZhaWxlZCggKmVjUXVldWVJdCApOworLy8KKy8vCQkJZWNRdWV1ZUl0ID0gZWNRdWV1ZS0+ZXJhc2UoZWNRdWV1ZUl0KTsKKy8vCQl9CisvLwkJZWxzZQorLy8JCXsKKy8vCQkJKytlY1F1ZXVlSXQ7CisvLwkJfQorLy8JfQorLy8KKy8vCXJldHVybiggZ2V0RXhlY3V0aW9uUXVldWUoKS5oYXNSZWFkeSgpICk7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvKioKKyAqIHBvc3RGaWx0ZXIKKyAqIEV2ZXJ5IHBvc3QgZmlsdGVyIGhhcyB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QKKyAqLworYm9vbCBNYWluUHJvY2Vzc29yVW5pdDo6cG9zdGZpbHRlcigpCit7CisJZWNRdWV1ZSA9ICYoIGdldEV4ZWN1dGlvblF1ZXVlKCkuZ2V0UmVzdWx0UXVldWUoKSApOworCWVjUXVldWVJdEVuZCA9IGVjUXVldWUtPmVuZCgpOworCWZvciggZWNRdWV1ZUl0ID0gZWNRdWV1ZS0+YmVnaW4oKSA7IGVjUXVldWVJdCAhPSBlY1F1ZXVlSXRFbmQgOyApCisJeworCQlpZiggcG9zdGZpbHRlcigqICgqZWNRdWV1ZUl0KSkgKQorCQl7CisJCQlwdHJFQyA9ICgqZWNRdWV1ZUl0KTsKKwkJCSsrZWNRdWV1ZUl0OworCisJCQlzd2l0Y2goIHB0ckVDLT5yZWZFeGVjdXRpb25EYXRhKCkuZ2V0QUVFUygpICkKKwkJCXsKKwkJCQljYXNlIEFFRVNfT0s6CisJCQkJY2FzZSBBRUVTX1NUTU5UX05PVEhJTkc6CisJCQkJY2FzZSBBRUVTX1NURVBfTUFSSzoKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWNhc2UgQUVFU19TVE1OVF9GSU5BTDoKKwkJCQl7CisJCQkJCUFQRXhlY3V0aW9uRGF0YSAmIGFwRUQgPSBwdHJFQy0+Z2V0QVBFeGVjdXRpb25EYXRhKCk7CisJCQkJCWlmKCBub3QgYXBFRC0+aXNGaW5hbGl6ZWQoYXBFRC0+Z2V0U3lzdGVtUklEKCkpICkKKwkJCQkJeworCQkJCQkJYXBFRC5td3NldEFFRVMoIEFFRVNfT0sgKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQljYXNlIEFFRVNfU1RNTlRfREVTVFJPWToKKwkJCQl7CisJCQkJCUFQRXhlY3V0aW9uRGF0YSAmIGFwRUQgPSBwdHJFQy0+Z2V0QVBFeGVjdXRpb25EYXRhKCk7CisJCQkJCWlmKCBub3QgYXBFRC0+aXNEZXN0cm95ZWQoYXBFRC0+Z2V0U3lzdGVtUklEKCkpICkKKwkJCQkJeworCQkJCQkJYXBFRC5td3NldEFFRVMoIEFFRVNfT0sgKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQljYXNlIEFFRVNfU1RNTlRfRVhJVDoKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWNhc2UgQUVFU19TVE1OVF9FWElUX0FMTDoKKwkJCQl7CisJCQkJCW1JbmNvbmRpdGlvbmFsU3RvcE1hcmtlckZsYWcgPSB0cnVlOworCisJCQkJCXB0ckVDLT5nZXR3RmxhZ3MoKS5zZXRJbnRlcnJ1cHRVc2VyUmVxdWVzdCgpOworCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWNhc2UgQUVFU19TVE1OVF9GQVRBTF9FUlJPUjoKKwkJCQl7CisJCQkJCW1JbmNvbmRpdGlvbmFsU3RvcE1hcmtlckZsYWcgPSB0cnVlOworCisJCQkJCXB0ckVDLT5nZXR3RmxhZ3MoKS5zZXRFeGVjdXRpb25GYXRhbEVycm9yVHJhY2UoKTsKKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQljYXNlIEFFRVNfU1lNQk9MSUNfRVhFQ1VUSU9OX0xJTUlUQVRJT046CisJCQkJeworCQkJCQlwdHJFQy0+Z2V0d0ZsYWdzKCkuc2V0RXhlY3V0aW9uU3ltYmV4TGltaXRhdGlvblRyYWNlKCk7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJY2FzZSBBRUVTX1dBSVRJTkdfSU5DT01fUkRWOgorCQkJCWNhc2UgQUVFU19XQUlUSU5HX09VVENPTV9SRFY6CisJCQkJeworCQkJCQkvLyBUT0RPICEhISBQQVMgTk9STUFMICEhIQorCQkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJCTw8ICJVbmV4cGVjdGVkIDw8IFdBSVRJTkdfPz9DT01fUkRWID4+ICIKKwkJCQkJCQkJIkVORElORCBFWEVDVVRJT04gU1RBVFVTICEhISIKKwkJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJY2FzZSBBRUVTX1dBSVRJTkdfSk9JTl9GT1JLOgorCQkJCXsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJY2FzZSBBRUVTX1NUTU5UX0JSRUFLOgorCQkJCWNhc2UgQUVFU19TVE1OVF9DT05USU5VRToKKwkJCQljYXNlIEFFRVNfU1RNTlRfUkVUVVJOOgorCQkJCXsKKwkJCQkJLy8gVE9ETyAhISEgUEFTIE5PUk1BTCAhISEKKwkJCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJCQk8PCAiVW5leHBlY3RlZCBFTkRJTkQgRVhFQ1VUSU9OIFNUQVRVUyA6PiAiCisJCQkJCQkJPDwgUnVudGltZURlZjo6c3RyQUVFUygKKwkJCQkJCQkJCXB0ckVDLT5nZXRFeGVjdXRpb25EYXRhKCktPm1BRUVTKSA8PCAiICEhISIKKwkJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQkJPDwgIlVuZXhwZWN0ZWQgRU5ESU5EIEVYRUNVVElPTiBTVEFUVVMgOj4gIgorCQkJCQkJCTw8IFJ1bnRpbWVEZWY6OnN0ckFFRVMoCisJCQkJCQkJCQlwdHJFQy0+Z2V0RXhlY3V0aW9uRGF0YSgpLT5tQUVFUykgPDwgIiAhISEiCisJCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWdldEV4ZWN1dGlvblF1ZXVlKCkuYXBwZW5kRmFpbGVkKCAqZWNRdWV1ZUl0ICk7CisKKwkJCWVjUXVldWVJdCA9IGVjUXVldWUtPmVyYXNlKGVjUXVldWVJdCk7CisJCX0KKwl9CisKKwlyZXR1cm4oIGdldEV4ZWN1dGlvblF1ZXVlKCkuaGFzUmVzdWx0KCkgKTsKK30KKworCitib29sIE1haW5Qcm9jZXNzb3JVbml0Ojpwb3N0ZmlsdGVyKEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKQoreworLy8JaWYoIFNvbHZlckZhY3Rvcnk6OnNvbHZlUGFyYW1ldGVycyhhbkVDLmdldEFQRXhlY3V0aW9uRGF0YSgpKSApCisvLwl7CisvLwkJQVZNX09TX1RSQUNFIDw8ICJTb2x2ZXJGYWN0b3J5Ojpzb2x2ZVBhcmFtZXRlcnMgZm9yICIKKy8vCQkJCTw8IGFuRUMuc3RyX21pbigpIDw8IHN0ZDo6ZW5kbCA8PCAiQ29uZGl0aW9uIDo+ICIKKy8vCQkJCTw8IGFuRUMuZ2V0QVBFeGVjdXRpb25EYXRhKCktPmdldEFsbFBhdGhDb25kaXRpb24oKS5zdHIoKQorLy8JCQkJPDwgc3RkOjplbmRsOworLy8JCWFuRUMuZ2V0QVBFeGVjdXRpb25EYXRhKCktPmdldFBhcmFtZXRlcnNSdW50aW1lRm9ybSgpLT50b1N0cmVhbURhdGEoCisvLwkJCQlhbkVDLmdldEFQRXhlY3V0aW9uRGF0YSgpLCBBVk1fT1NfVFJBQ0UsICJcdCIpOworLy8JfQorCisJLy8gU1RBVCBmb3IgYW4gRUZGRUNUSVZFIEVWQUwgQ09OVEVYVAorCWlmKCBhbkVDLmdldEhlaWdodCgpID4gbU1heFJlYWNoSGVpZ2h0ICkKKwl7CisJCW1NYXhSZWFjaEhlaWdodCA9IGFuRUMuZ2V0SGVpZ2h0KCk7CisJfQorCWlmKCBhbkVDLmdldFdpZHRoKCkgPiBtTWF4UmVhY2hXaWR0aCApCisJeworCQltTWF4UmVhY2hXaWR0aCA9IGFuRUMuZ2V0V2lkdGgoKTsKKwl9CisKKwkvLyBTVEFUIGZvciBhbiBFRkZFQ1RJVkUgQ09OU1RSVUNUIENPTlRFWFQKKy8vCWVjRW5kID0gYW5FQy5lbmQoKTsKKy8vCWZvciggZWNJdCA9IGFuRUMuYmVnaW4oKSA7IGVjSXQgIT0gZWNFbmQgOyArK2VjSXQgKQorLy8JeworLy8JCWlmKCAoKmVjSXQpLT5nZXRIZWlnaHQoKSA+IG1NYXhSZWFjaEhlaWdodCApCisvLwkJeworLy8JCQltTWF4UmVhY2hIZWlnaHQgPSAoKmVjSXQpLT5nZXRIZWlnaHQoKTsKKy8vCQl9CisvLwkJaWYoICgqZWNJdCktPmdldFdpZHRoKCkgPiBtTWF4UmVhY2hXaWR0aCApCisvLwkJeworLy8JCQltTWF4UmVhY2hXaWR0aCA9ICgqZWNJdCktPmdldFdpZHRoKCk7CisvLwkJfQorLy8JfQorCisJaWYoIGFuRUMubm9DaGlsZENvbnRleHQoKSApCisJeworCQkrK21EZWFkbG9ja0NvdW50OworCisJCWFuRUMuZ2V0d0ZsYWdzKCkuc2V0RXhlY3V0aW9uRGVhZGxvY2tUcmFjZSgpOworCX0KKwllbHNlIGlmKCBhbkVDLnNpbmdsZUNoaWxkQ29udGV4dCgpCisJCQkmJiAoYW5FQy5nZXRFeGVjdXRpb25EYXRhKCkKKwkJCQk9PSBhbkVDLmZpcnN0Q2hpbGRDb250ZXh0KCktPmdldEV4ZWN1dGlvbkRhdGEoKSkgKQorCXsKKwkJKyttTGl2ZWxvY2tDb3VudDsKKworCQlhbkVDLmdldHdGbGFncygpLnNldEV4ZWN1dGlvbkxpdmVsb2NrVHJhY2UoKTsKKwl9CisJZWxzZQorCXsKKwkJZWNDaGlsZEl0RW5kID0gYW5FQy5lbmQoKTsKKwkJZm9yKCBlY0NoaWxkSXQgPSBhbkVDLmJlZ2luKCkgOyBlY0NoaWxkSXQgIT0gZWNDaGlsZEl0RW5kIDsgKytlY0NoaWxkSXQgKQorCQl7CisJCQlwdHJFQyA9ICgqZWNDaGlsZEl0KTsKKworCQkJc3dpdGNoKCBwdHJFQy0+cmVmRXhlY3V0aW9uRGF0YSgpLmdldEFFRVMoKSApCisJCQl7CisJCQkJY2FzZSBBRUVTX1NURVBfTUFSSzoKKwkJCQl7CisJCQkJCXB0ckVDLT5nZXR3RmxhZ3MoKS5zZXRFeGVjdXRpb25TdGVwTWFya1RyYWNlKCk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCitib29sIE1haW5Qcm9jZXNzb3JVbml0OjpmaW5hbGl6ZVBvc3RmaWx0ZXJpbmcoKQoreworCWNoaWxkRUMuY2xlYXIoKTsKKworCWVjUXVldWUgPSAmKCBnZXRFeGVjdXRpb25RdWV1ZSgpLmdldFJlc3VsdFF1ZXVlKCkgKTsKKwl3aGlsZSggZWNRdWV1ZS0+bm9uZW1wdHkoKSApCisJeworCQllY1F1ZXVlLT5wb3BfZmlyc3RfdG8oIHB0ckVDICk7CisKKwkJZWNDaGlsZEl0ID0gcHRyRUMtPmJlZ2luKCk7CisJCWVjQ2hpbGRJdEVuZCA9IHB0ckVDLT5lbmQoKTsKKwkJZm9yKCA7IGVjQ2hpbGRJdCAhPSBlY0NoaWxkSXRFbmQgOyArK2VjQ2hpbGRJdCApCisJCXsKKwkJCXN3aXRjaCggKCplY0NoaWxkSXQpLT5yZWZFeGVjdXRpb25EYXRhKCkuZ2V0QUVFUygpICkKKwkJCXsKKwkJCQljYXNlIEFFRVNfT0s6CisJCQkJY2FzZSBBRUVTX1NURVBfTUFSSzoKKwkJCQljYXNlIEFFRVNfV0FJVElOR19KT0lOX0ZPUks6CisJCQkJeworCQkJCQlzZXRDb250ZXh0V2lkdGgoICplY0NoaWxkSXQgKTsKKworCQkJCQljaGlsZEVDLmFwcGVuZCggKmVjQ2hpbGRJdCApOworCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWNhc2UgQUVFU19TVE1OVF9OT1RISU5HOgorCQkJCXsKKwkJCQkJaWYoIGVjQ2hpbGRJdCA9PSBwdHJFQy0+YmVnaW4oKSApCisJCQkJCXsKKwkJCQkJCS8qZWNDaGlsZEl0ID0qLyBwdHJFQy0+ZXJhc2VDaGlsZENvbnRleHQoIGVjQ2hpbGRJdCApOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJZWNDaGlsZEl0ID0gcHRyRUMtPmVyYXNlQ2hpbGRDb250ZXh0KCBlY0NoaWxkSXQgKTsKKworCQkJCQkJLS1lY0NoaWxkSXQ7CisJCQkJCX0KKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQljYXNlIEFFRVNfU1RNTlRfRVhJVDoKKwkJCQl7CisJCQkJCSsrbVN0YXRlbWVudEV4aXRDb3VudDsKKworCQkJCQlzZXRDb250ZXh0V2lkdGgoICplY0NoaWxkSXQgKTsKKworCQkJCQkoKmVjQ2hpbGRJdCktPmdldHdGbGFncygpLnNldEV4ZWN1dGlvblN0YXRlbWVudEV4aXRUcmFjZSgpOworCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWNhc2UgQUVFU19TVE1OVF9FWElUX0FMTDoKKwkJCQl7CisJCQkJCSsrbVN0YXRlbWVudEV4aXRDb3VudDsKKwkJCQkJbUluY29uZGl0aW9uYWxTdG9wTWFya2VyRmxhZyA9IHRydWU7CisKKwkJCQkJc2V0Q29udGV4dFdpZHRoKCAqZWNDaGlsZEl0ICk7CisKKwkJCQkJcHRyRUMtPmdldHdGbGFncygpLnNldEludGVycnVwdFVzZXJSZXF1ZXN0KCk7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJY2FzZSBBRUVTX1NUTU5UX0ZBVEFMX0VSUk9SOgorCQkJCXsKKwkJCQkJKyttU3RhdGVtZW50RmF0YWxFcnJvckNvdW50OworCisJCQkJCXB0ckVDLT5nZXR3RmxhZ3MoKS5zZXRFeGVjdXRpb25GYXRhbEVycm9yVHJhY2UoKTsKKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQljYXNlIEFFRVNfU1lNQk9MSUNfRVhFQ1VUSU9OX0xJTUlUQVRJT046CisJCQkJeworCQkJCQkrK21TeW1ib2xpY0V4ZWN1dGlvbkxpbWl0YXRpb25Db3VudDsKKworCQkJCQlwdHJFQy0+Z2V0d0ZsYWdzKCkuc2V0RXhlY3V0aW9uU3ltYmV4TGltaXRhdGlvblRyYWNlKCk7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisKKwkJCQljYXNlIEFFRVNfV0FJVElOR19JTkNPTV9SRFY6CisJCQkJY2FzZSBBRUVTX1dBSVRJTkdfT1VUQ09NX1JEVjoKKworCQkJCWNhc2UgQUVFU19TVE1OVF9GSU5BTDoKKwkJCQljYXNlIEFFRVNfU1RNTlRfREVTVFJPWToKKworCQkJCWNhc2UgQUVFU19TVE1OVF9CUkVBSzoKKwkJCQljYXNlIEFFRVNfU1RNTlRfQ09OVElOVUU6CisJCQkJY2FzZSBBRUVTX1NUTU5UX1JFVFVSTjoKKwkJCQl7CisJCQkJCS8vIFRPRE8gISEhIFBBUyBOT1JNQUwgISEhCisJCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQkJPDwgIlVuZXhwZWN0ZWQgRU5ESU5EIEVYRUNVVElPTiBTVEFUVVMgOj4gIgorCQkJCQkJCTw8IFJ1bnRpbWVEZWY6OnN0ckFFRVMoICgqZWNDaGlsZEl0KS0+CisJCQkJCQkJCQlnZXRFeGVjdXRpb25EYXRhKCktPm1BRUVTICkgPDwgIiAhISEiCisJCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCQl9CisKKwkJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJCQk8PCAiVW5leHBlY3RlZCBFTkRJTkQgRVhFQ1VUSU9OIFNUQVRVUyA8PCAiCisJCQkJCQkJPDwgUnVudGltZURlZjo6c3RyQUVFUygJKCplY0NoaWxkSXQpLT4KKwkJCQkJCQkJCWdldEV4ZWN1dGlvbkRhdGEoKS0+bUFFRVMgKSA8PCAiID4+ICEhISIKKwkJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWdldEV4ZWN1dGlvblF1ZXVlKCkucHVzaFdhaXRpbmdDaGlsZCggY2hpbGRFQyApOworCisJCWNoaWxkRUMuY2xlYXIoKTsKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisKK3ZvaWQgTWFpblByb2Nlc3NvclVuaXQ6OnNldENvbnRleHRXaWR0aChFeGVjdXRpb25Db250ZXh0ICogYW5FQykKK3sKKwkvLyBTVEFUIGFmdGVyIEVWQUwgZm9yIFdJRFRICisJaWYoIGFuRUMtPmhhc0NvbnRhaW5lcigpICYmIGFuRUMtPmdldENvbnRhaW5lcigpLT5oYXNDaGlsZENvbnRleHQoKSApCisJeworCQlpZiggKGFuRUMtPmdldENvbnRhaW5lcigpLT5maXJzdENoaWxkQ29udGV4dCgpID09IGFuRUMpICkKKwkJeworCQkJYW5FQy0+c2V0V2lkdGgoIGFuRUMtPmdldENvbnRhaW5lcigpLT5nZXRXaWR0aCgpICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlhbkVDLT5zZXRXaWR0aCggZ2V0U3ltYmV4RGlzcGF0Y2hlcigpLm5leHRHbG9iYWxHcmFwaFdpZHRoKCkgKTsKKwkJfQorCX0KK30KKworCisKKy8qKgorICogTUFJTiBQUk9DRVNTT1IKKyAqIFJFUE9SVAorICovCit2b2lkIE1haW5Qcm9jZXNzb3JVbml0OjpyZXBvcnRTaWxlbnQoT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJaWYoIG1EZWFkbG9ja0NvdW50ID4gMCApCisJeworCQlvcyA8PCBFT0xfVEFCMiA8PCAiVGhlIERFQURMT0NLIGZvdW5kIDogIiA8PCBtRGVhZGxvY2tDb3VudCA8PCBFT0w7CisJfQorCWlmKCBtTGl2ZWxvY2tDb3VudCA+IDAgKQorCXsKKwkJb3MgPDwgVEFCMiA8PCAiVGhlIExJVkVMT0NLIGZvdW5kIDogIiA8PCBtTGl2ZWxvY2tDb3VudCA8PCBFT0w7CisJfQorCisJaWYoIG1TdGF0ZW1lbnRFeGl0Q291bnQgPiAwICkKKwl7CisJCW9zIDw8IFRBQjIgPDwgIlRoZSBSVU4jRVhJVCBjb3VudCA6ICIgPDwgbVN0YXRlbWVudEV4aXRDb3VudCA8PCBFT0w7CisJfQorCisJaWYoIG1TdGF0ZW1lbnRGYXRhbEVycm9yQ291bnQgPiAwICkKKwl7CisJCW9zIDw8IFRBQjIgPDwgIlRoZSBGQVRBTCNFUlJPUiBjb3VudCA6ICIKKwkJCQk8PCBtU3RhdGVtZW50RmF0YWxFcnJvckNvdW50IDw8IEVPTDsKKwl9CisJaWYoIG1TeW1ib2xpY0V4ZWN1dGlvbkxpbWl0YXRpb25Db3VudCA+IDAgKQorCXsKKwkJb3MgPDwgVEFCMiA8PCAiVGhlIFNZTUIjTElNSVQgY291bnQgIDogIgorCQkJCTw8IG1TeW1ib2xpY0V4ZWN1dGlvbkxpbWl0YXRpb25Db3VudCA8PCBFT0w7CisJfQorCisJb3MgPDwgc3RkOjpmbHVzaDsKK30KKwordm9pZCBNYWluUHJvY2Vzc29yVW5pdDo6cmVwb3J0TWluaW11bShPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlyZXBvcnRIZWFkZXIob3MsICJTVE9QIENSSVRFUklBICIpOworCisJb3MgPDwgVEFCMiA8PCAiVGhlIENPTlRFWFQgIGNvdW50IDogIgorCQkJPDwgRXhlY3V0aW9uQ29udGV4dEhlYWRlcjo6SURfTlVNQkVSIDw8IEVPTDsKKworCW9zIDw8IFRBQjIgPDwgIlRoZSBSVU4gU1RFUCBjb3VudCA6ICIKKwkJCTw8IGdldFN5bWJleERpc3BhdGNoZXIoKS5nZXRFdmFsTnVtYmVyKCkgPDwgRU9MIDw8IEVPTDsKKworCW9zIDw8IFRBQjIgPDwgIlRoZSBNYXggSEVJR0hUIHJlYWNoaW5nIDogIiA8PCBtTWF4UmVhY2hIZWlnaHQgPDwgRU9MOworCisJb3MgPDwgVEFCMiA8PCAiVGhlIE1heCBXSURUSCAgcmVhY2hpbmcgOiAiIDw8IG1NYXhSZWFjaFdpZHRoICA8PCBFT0w7CisKKwlpZiggbURlYWRsb2NrQ291bnQgPiAwICkKKwl7CisJCW9zIDw8IEVPTF9UQUIyIDw8ICJUaGUgREVBRExPQ0sgZm91bmQgOiAiIDw8IG1EZWFkbG9ja0NvdW50IDw8IEVPTDsKKwl9CisJaWYoIG1MaXZlbG9ja0NvdW50ID4gMCApCisJeworCQlvcyA8PCBUQUIyIDw8ICJUaGUgTElWRUxPQ0sgZm91bmQgOiAiIDw8IG1MaXZlbG9ja0NvdW50IDw8IEVPTDsKKwl9CisKKwlpZiggbVN0YXRlbWVudEV4aXRDb3VudCA+IDAgKQorCXsKKwkJb3MgPDwgVEFCMiA8PCAiVGhlIFJVTiNFWElUIGNvdW50IDogIiA8PCBtU3RhdGVtZW50RXhpdENvdW50IDw8IEVPTDsKKwl9CisKKwlpZiggbVN0YXRlbWVudEZhdGFsRXJyb3JDb3VudCA+IDAgKQorCXsKKwkJb3MgPDwgVEFCMiA8PCAiVGhlIEZBVEFMI0VSUk9SIGNvdW50IDogIgorCQkJCTw8IG1TdGF0ZW1lbnRGYXRhbEVycm9yQ291bnQgPDwgRU9MOworCX0KKwlpZiggbVN5bWJvbGljRXhlY3V0aW9uTGltaXRhdGlvbkNvdW50ID4gMCApCisJeworCQlvcyA8PCBUQUIyIDw8ICJUaGUgU1lNQiNMSU1JVCBjb3VudCAgOiAiCisJCQkJPDwgbVN5bWJvbGljRXhlY3V0aW9uTGltaXRhdGlvbkNvdW50IDw8IEVPTDsKKwl9CisKKwlvcyA8PCBzdGQ6OmZsdXNoOworfQorCisKK3ZvaWQgTWFpblByb2Nlc3NvclVuaXQ6OnJlcG9ydERlZmF1bHQoT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJcmVwb3J0SGVhZGVyKG9zLCAiU1RPUCBDUklURVJJQSAiKTsKKworCW9zIDw8IFRBQjIgPDwgIlRoZSBDT05URVhUICBjb3VudCA6ICIKKwkJCTw8IEV4ZWN1dGlvbkNvbnRleHRIZWFkZXI6OklEX05VTUJFUiA8PCBFT0wgPDwgRU9MOworCisJb3MgPDwgVEFCMiA8PCAiVGhlIFJVTiBTVEVQIGNvdW50IDogIgorCQkJPDwgZ2V0U3ltYmV4RGlzcGF0Y2hlcigpLmdldEV2YWxOdW1iZXIoKSA8PCBFT0w7CisKKwlvcyA8PCBUQUIyIDw8ICJUaGUgR0xPQkFMICBTVE9QIGNvdW50ICA6ICIgPDwgbVN0b3BDb3VudCA8PCBFT0wgPDwgRU9MOworCisJb3MgPDwgVEFCMiA8PCAiVGhlIE1heCBIRUlHSFQgcmVhY2hpbmcgOiAiIDw8IG1NYXhSZWFjaEhlaWdodCA8PCBFT0w7CisKKwlvcyA8PCBUQUIyIDw8ICJUaGUgTWF4IFdJRFRIICByZWFjaGluZyA6ICIgPDwgbU1heFJlYWNoV2lkdGggIDw8IEVPTDsKKworCWlmKCBtRGVhZGxvY2tDb3VudCA+IDAgKQorCXsKKwkJb3MgPDwgRU9MX1RBQjIgPDwgIlRoZSBERUFETE9DSyBmb3VuZCA6ICIgPDwgbURlYWRsb2NrQ291bnQgPDwgRU9MOworCX0KKwlpZiggbUxpdmVsb2NrQ291bnQgPiAwICkKKwl7CisJCW9zIDw8IFRBQjIgPDwgIlRoZSBMSVZFTE9DSyBmb3VuZCA6ICIgPDwgbUxpdmVsb2NrQ291bnQgPDwgRU9MOworCX0KKwlpZiggbVN0YXRlbWVudEV4aXRDb3VudCA+IDAgKQorCXsKKwkJb3MgPDwgVEFCMiA8PCAiVGhlIFJVTiNFWElUIGNvdW50IDogIiA8PCBtU3RhdGVtZW50RXhpdENvdW50IDw8IEVPTDsKKwl9CisKKwlpZiggbVN0YXRlbWVudEZhdGFsRXJyb3JDb3VudCA+IDAgKQorCXsKKwkJb3MgPDwgVEFCMiA8PCAiVGhlIEZBVEFMI0VSUk9SIGNvdW50IDogIgorCQkJCTw8IG1TdGF0ZW1lbnRGYXRhbEVycm9yQ291bnQgPDwgRU9MOworCX0KKwlpZiggbVN5bWJvbGljRXhlY3V0aW9uTGltaXRhdGlvbkNvdW50ID4gMCApCisJeworCQlvcyA8PCBUQUIyIDw8ICJUaGUgU1lNQiNMSU1JVCBjb3VudCAgOiAiCisJCQkJPDwgbVN5bWJvbGljRXhlY3V0aW9uTGltaXRhdGlvbkNvdW50IDw8IEVPTDsKKwl9CisKKwlBdm1Db21tdW5pY2F0aW9uUmR2UHJpbWl0aXZlOjpyZXBvcnRHbG9iYWxTdGF0aXN0aWNzKCBvcyApOworCisJb3MgPDwgc3RkOjpmbHVzaDsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIE5PTi1SRUdSRVNTSU9OIFRFU1QgQVBJCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIE1haW5Qcm9jZXNzb3JVbml0Ojp0ZGRSZWdyZXNzaW9uUmVwb3J0SW1wbChPdXRTdHJlYW0gJiBvcykKK3sKKy8vCW9zIDw8IFRBQiA8PCAiQ09OVEVYVCAgY291bnQgOiAiCisvLwkJCTw8IEV4ZWN1dGlvbkNvbnRleHRIZWFkZXI6OklEX05VTUJFUiA8PCBFT0w7CisKKwlvcyA8PCBUQUIgPDwgIlJVTiBTVEVQIGNvdW50IDogIiA8PCBnZXRTeW1iZXhEaXNwYXRjaGVyKCkuZ2V0RXZhbE51bWJlcigpCisJCQk8PCBFT0xfRkxVU0g7Cit9CisKKworLyoqCisgKiBFVkFMIFRSQUNFCisgKi8KKworc3RhdGljIGludCBFVkFMX1NURVBfQ1VSUkVOVF9XSURUSCAgID0gMzsKK3N0YXRpYyBpbnQgTk9ERV9DT1VOVF9DVVJSRU5UX1dJRFRIICA9IDM7CisKK3N0YXRpYyBpbnQgTk9ERV9IRUlHSFRfQ1VSUkVOVF9XSURUSCA9IDM7CitzdGF0aWMgaW50IE5PREVfV0lEVEhfQ1VSUkVOVF9XSURUSCAgPSAzOworCisKK3N0YXRpYyBpbmxpbmUgYXZtX3NpemVfdCBQT1cxMCggaW50IG4gKQoreworCXN3aXRjaCggbiApCisJeworCQljYXNlIDMgOiByZXR1cm4oIDEwMDAgICAgICk7CisJCWNhc2UgNCA6IHJldHVybiggMTAwMDAgICAgKTsKKwkJY2FzZSA1IDogcmV0dXJuKCAxMDAwMDAgICApOworCQljYXNlIDYgOiByZXR1cm4oIDEwMDAwMDAgICk7CisJCWNhc2UgNyA6IHJldHVybiggMTAwMDAwMDAgKTsKKwkJZGVmYXVsdDogcmV0dXJuKCBzdGF0aWNfY2FzdDxhdm1fc2l6ZV90Piggc3RkOjpwb3coMTAsIG4pICkgKTsKKwl9Cit9CisKKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0cmFjZUJvdW5kKGF2bV9zaXplX3QgbGltaXQsIGludCB3aWR0aCkKK3sKKwlzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworCWlmKCBsaW1pdCA8IEFWTV9OVU1FUklDX01BWF9TSVpFX1QgKQorCXsKKwkJKCAobGltaXQgPCBQT1cxMCh3aWR0aCkpPyBvc3MgPDwgc3RkOjpzZXR3KHdpZHRoKSA6IG9zcyApIDw8IGxpbWl0OworCX0KKwllbHNlCisJeworCQlvc3MgPDwgIitvbyI7CisJfQorCisJcmV0dXJuKCBvc3Muc3RyKCkgKTsKK30KKworCit2b2lkIE1haW5Qcm9jZXNzb3JVbml0Ojp0cmFjZUJvdW5kRXZhbChPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlib29zdDo6Zm9ybWF0IGZvcm1hdHRlcihtQm91bmRFdmFsVHJhY2VGb3JtYXR0ZXIpOworCWZvcm1hdHRlci5leGNlcHRpb25zKCBib29zdDo6aW86Om5vX2Vycm9yX2JpdHMgKTsKKworLy8JZm9ybWF0dGVyLmV4Y2VwdGlvbnMoIGJvb3N0Ojppbzo6YWxsX2Vycm9yX2JpdHMgXgorLy8JCQkoIGJvb3N0Ojppbzo6dG9vX21hbnlfYXJnc19iaXQgfCBib29zdDo6aW86OnRvb19mZXdfYXJnc19iaXQgKSApOworCisJb3MgPDwgVEFCIDw8IGZvcm1hdHRlcgorCQkJJSB0cmFjZUJvdW5kKG1FdmFsU3RlcExpbWl0ICAsIEVWQUxfU1RFUF9DVVJSRU5UX1dJRFRIKQorCQkJJSB0cmFjZUJvdW5kKG1Ob2RlQ291bnRMaW1pdCAsIE5PREVfQ09VTlRfQ1VSUkVOVF9XSURUSCkKKwkJCSUgdHJhY2VCb3VuZChtTm9kZUhlaWdodExpbWl0LCBOT0RFX0hFSUdIVF9DVVJSRU5UX1dJRFRIKQorCQkJJSB0cmFjZUJvdW5kKG1Ob2RlV2lkdGhMaW1pdCAsIE5PREVfV0lEVEhfQ1VSUkVOVF9XSURUSCkKKwkJCTw8IHN0ZDo6Zmx1c2g7Cit9CisKKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBjdXJyZW50VHJhY2UoYXZtX3NpemVfdCBjb3VudCwgaW50ICYgd2lkdGgpCit7CisJc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKworCW9zcyA8PCBzdGQ6OnNldHcoICggY291bnQgPCBQT1cxMCh3aWR0aCkgKT8gd2lkdGggOiArK3dpZHRoICkgPDwgY291bnQ7CisKKwlyZXR1cm4oIG9zcy5zdHIoKSApOworfQorCisKKy8vISEgV2FybmluZzogVW51c2VkIHN0YXRpYyBmdW5jdGlvbgorLy9zdGF0aWMgc3RkOjpzdHJpbmcgdHJhY2VFbGVtZW50KGF2bV9zaXplX3QgY291bnQsIGF2bV9zaXplX3QgbGltaXQsIGludCB3aWR0aCkKKy8veworLy8Jc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKy8vCW9zcyA8PCBzdGQ6OnNldHcoIHdpZHRoICkgPDwgY291bnQ7CisvLwlpZiggbGltaXQgPCBBVk1fTlVNRVJJQ19NQVhfU0laRV9UICkKKy8vCXsKKy8vCQlvc3MgPDwgIiAvICIgPDwgc3RkOjpzZXR3KCB3aWR0aCApIDw8IGxpbWl0OworLy8JfQorLy8KKy8vCXJldHVybiggb3NzLnN0cigpICk7CisvL30KKworCit2b2lkIE1haW5Qcm9jZXNzb3JVbml0Ojp0cmFjZU1pbmltdW1QcmVFdmFsKAorCQlPdXRTdHJlYW0gJiBvcywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpIGNvbnN0Cit7CisJYm9vc3Q6OmZvcm1hdCBmb3JtYXR0ZXIobVByZUV2YWxUcmFjZUZvcm1hdHRlcik7CisJZm9ybWF0dGVyLmV4Y2VwdGlvbnMoIGJvb3N0Ojppbzo6bm9fZXJyb3JfYml0cyApOworCisvLwlmb3JtYXR0ZXIuZXhjZXB0aW9ucyggYm9vc3Q6OmlvOjphbGxfZXJyb3JfYml0cyBeCisvLwkJCSggYm9vc3Q6OmlvOjp0b29fbWFueV9hcmdzX2JpdCB8IGJvb3N0Ojppbzo6dG9vX2Zld19hcmdzX2JpdCApICk7CisKKy8vCW9zIDw8IFRBQiA8PCBmb3JtYXR0ZXIKKy8vCQkJJSB0cmFjZUVsZW1lbnQoYW5FQy0+Z2V0RXZhbE51bWJlcigpLCBtRXZhbFN0ZXBMaW1pdCAgLCA1KQorLy8JCQklIHRyYWNlRWxlbWVudChhbkVDLT5nZXRJZE51bWJlcigpICAsIG1Ob2RlTm9kZUxpbWl0ICAsIDYpCisvLwkJCSUgdHJhY2VFbGVtZW50KGFuRUMtPmdldEhlaWdodCgpICAgICwgbU5vZGVIZWlnaHRMaW1pdCwgNSkKKy8vCQkJJSB0cmFjZUVsZW1lbnQoYW5FQy0+Z2V0V2lkdGgoKSAgICAgLCBtTm9kZVdpZHRoTGltaXQgLCA1KQorCisJb3MgPDwgVEFCIDw8IGZvcm1hdHRlcgorCQkJJSBjdXJyZW50VHJhY2UoYW5FQy5nZXRFdmFsTnVtYmVyKCksIEVWQUxfU1RFUF9DVVJSRU5UX1dJRFRIKQorCQkJJSBjdXJyZW50VHJhY2UoYW5FQy5nZXRJZE51bWJlcigpICAsIE5PREVfQ09VTlRfQ1VSUkVOVF9XSURUSCkKKwkJCSUgY3VycmVudFRyYWNlKGFuRUMuZ2V0SGVpZ2h0KCkgICAgLCBOT0RFX0hFSUdIVF9DVVJSRU5UX1dJRFRIKQorCQkJJSBjdXJyZW50VHJhY2UoYW5FQy5nZXRXaWR0aCgpICAgICAsIE5PREVfV0lEVEhfQ1VSUkVOVF9XSURUSCkKKwkJCTw8IHN0ZDo6Zmx1c2g7Cit9CisKKwordm9pZCBNYWluUHJvY2Vzc29yVW5pdDo6dHJhY2VEZWZhdWx0UHJlRXZhbCgKKwkJT3V0U3RyZWFtICYgb3MsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKSBjb25zdAoreworCW9zIDw8IFRBQiA8PCBERUZBVUxUX1dSQVBfREFUQSA8PCAiRVsiIDw8IHN0ZDo6c2V0dyg0KQorCQkJPDwgYW5FQy5nZXRFdmFsTnVtYmVyKCkgPDwgIl0gIiA8PCBhbkVDLnN0cl9taW4oKQorCQkJPDwgRU5EX1dSQVBfRU9MOworfQorCisKK3ZvaWQgTWFpblByb2Nlc3NvclVuaXQ6OnRyYWNlTWluaW11bVBvc3RFdmFsKAorCQlPdXRTdHJlYW0gJiBvcywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpIGNvbnN0Cit7CisJLy8hISBOT1RISU5HCit9CisKK3ZvaWQgTWFpblByb2Nlc3NvclVuaXQ6OnRyYWNlRGVmYXVsdFBvc3RFdmFsKAorCQlPdXRTdHJlYW0gJiBvcywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpIGNvbnN0Cit7CisJYW5FQy50cmFjZURlZmF1bHRQb3N0RXZhbCggb3MgPDwgREVGQVVMVF9XUkFQX0RBVEEgKTsKKworCW9zIDw8IEVORF9XUkFQOworfQorCisKK3ZvaWQgTWFpblByb2Nlc3NvclVuaXQ6OnJlcG9ydEV2YWwoT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJYm9vc3Q6OmZvcm1hdCBmb3JtYXR0ZXIobVJlcG9ydEV2YWxUcmFjZUZvcm1hdHRlcik7CisJZm9ybWF0dGVyLmV4Y2VwdGlvbnMoIGJvb3N0Ojppbzo6bm9fZXJyb3JfYml0cyApOworCisvLwlmb3JtYXR0ZXIuZXhjZXB0aW9ucyggYm9vc3Q6OmlvOjphbGxfZXJyb3JfYml0cyBeCisvLwkJCSggYm9vc3Q6OmlvOjp0b29fbWFueV9hcmdzX2JpdCB8IGJvb3N0Ojppbzo6dG9vX2Zld19hcmdzX2JpdCApICk7CisKKy8vCW9zIDw8IFRBQiA8PCBmb3JtYXR0ZXIKKy8vCQklIHRyYWNlRWxlbWVudChnZXRTeW1iZXhEaXNwYXRjaGVyKCkuZ2V0RXZhbE51bWJlcigpLCBtRXZhbFN0ZXBMaW1pdCwgNSkKKy8vCisvLwkJJSB0cmFjZUVsZW1lbnQoRXhlY3V0aW9uQ29udGV4dDo6Z2V0Q3JlYXRlQ291bnRlcigpLCBtTm9kZUNvdW50TGltaXQsIDYpCisvLworLy8JCSUgdHJhY2VFbGVtZW50KG1NYXhSZWFjaEhlaWdodCAsIG1IZWlnaHRMaW1pdCwgNikKKy8vCQklIHRyYWNlRWxlbWVudChtTWF4UmVhY2hXaWR0aCAgLCBtV2lkdGhMaW1pdCAsIDYpCisKKwlvcyA8PCBUQUIgPDwgZm9ybWF0dGVyCisJCSUgY3VycmVudFRyYWNlKCBnZXRTeW1iZXhEaXNwYXRjaGVyKCkuZ2V0RXZhbE51bWJlcigpLAorCQkJCUVWQUxfU1RFUF9DVVJSRU5UX1dJRFRIKQorCisJCSUgY3VycmVudFRyYWNlKEV4ZWN1dGlvbkNvbnRleHQ6OmdldENyZWF0ZUNvdW50ZXIoKSwKKwkJCQlOT0RFX0NPVU5UX0NVUlJFTlRfV0lEVEgpCisKKwkJJSBjdXJyZW50VHJhY2UobU1heFJlYWNoSGVpZ2h0LCBOT0RFX0hFSUdIVF9DVVJSRU5UX1dJRFRIKQorCQklIGN1cnJlbnRUcmFjZShtTWF4UmVhY2hXaWR0aCAsIE5PREVfV0lEVEhfQ1VSUkVOVF9XSURUSCkKKwkJPDwgc3RkOjpmbHVzaDsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gREVCVUcgUFJPQ0VTU0lORyBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgTWFpblByb2Nlc3NvclVuaXQ6OmRlYnVnRXZhbENvbW1hbmRJbXBsKCkKK3sKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKwordm9pZCBNYWluUHJvY2Vzc29yVW5pdDo6Y2hlY2tSZWFkRXZhbFN0b3BTY3JpcHQoKQoreworCXN0ZDo6aWZzdHJlYW0gYW5JbmNvbmRpdGlvbmFsU3RvcE1hcmtlclN0cmVhbSgKKwkJCW1JbmNvbmRpdGlvbmFsU3RvcE1hcmtlckxvY2F0aW9uLmNfc3RyKCkgKTsKKworCWlmKCBhbkluY29uZGl0aW9uYWxTdG9wTWFya2VyU3RyZWFtLmdvb2QoKSApCisJeworCQltSW5jb25kaXRpb25hbFN0b3BNYXJrZXJGbGFnID0gdHJ1ZTsKKworCQlpZiggaXNEZWJ1Z1NjcmlwdChhbkluY29uZGl0aW9uYWxTdG9wTWFya2VyU3RyZWFtKSApCisJCXsKKwkJCW1JbmNvbmRpdGlvbmFsU3RvcE1hcmtlckZsYWcgPSBmYWxzZTsKKworCQkJZGVidWdSZWFkRXZhbFNjcmlwdChhbkluY29uZGl0aW9uYWxTdG9wTWFya2VyU3RyZWFtKTsKKwkJfQorCX0KKworCWFuSW5jb25kaXRpb25hbFN0b3BNYXJrZXJTdHJlYW0uY2xvc2UoKTsKKworCWlmKCBtSW5jb25kaXRpb25hbFN0b3BNYXJrZXJGbGFnICkKKwl7CisJCUFWTV9PU19XQVJOIDw8IEVNUEhBU0lTKCJVTkNPTkRJVElPTkFMIFNUT1AgISEhIik7CisKKwkJKyttU3RvcENvdW50OworCisJCWdldFN5bWJleFJlcXVlc3RNYW5hZ2VyKCkucG9zdFJlcXVlc3RTdG9wKCB0aGlzICk7CisJfQorfQorCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9hcGkvTWFpblByb2Nlc3NvclVuaXQuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9hcGkvTWFpblByb2Nlc3NvclVuaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWQwYThiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2FwaS9NYWluUHJvY2Vzc29yVW5pdC5oCkBAIC0wLDAgKzEsMzEyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIE1BSU5QUk9DRVNTT1JVTklUX0hfCisjZGVmaW5lIE1BSU5QUk9DRVNTT1JVTklUX0hfCisKKyNpbmNsdWRlIDxmYW0vYXBpL0Fic3RyYWN0UHJvY2Vzc29yVW5pdC5oPgorI2luY2x1ZGUgPGZhbS9kZWJ1Zy9JRGVidWdQcm9jZXNzb3JQcm92aWRlci5oPgorCisjaW5jbHVkZSA8Y29tbW9uL0F2bVBvaW50ZXIuaD4KKyNpbmNsdWRlIDxjb21tb24vQkYuaD4KKworI2luY2x1ZGUgPGZtbC9idWlsdGluL0lkZW50aWZpZXIuaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlRm9ybS5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0F2bUNvZGUuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25Db250ZXh0Lmg+CisjaW5jbHVkZSA8Zm1sL3RyYWNlL1RyYWNlQ2hlY2tlci5oPgorCisjaW5jbHVkZSA8c2V3L0NvbmZpZ3VyYXRpb24uaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworY2xhc3MgTWFpblByb2Nlc3NvclVuaXQgIDoKKy8vCQlwdWJsaWMgQXZtQ2xvbmVhYmxlQ2xhc3M8IE1haW5Qcm9jZXNzb3JVbml0ID4sCisJCXB1YmxpYyBBdXRvUmVnaXN0ZXJlZFByb2Nlc3NvclVuaXQ8IE1haW5Qcm9jZXNzb3JVbml0ID4sCisJCXB1YmxpYyBJRGVidWdQcm9jZXNzb3JQcm92aWRlcgoreworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIE1haW5Qcm9jZXNzb3JVbml0ICkKKworCisJLyoqCisJICogTUFJTiBQUk9DRVNTT1IgRkFDVE9SWQorCSAqIGZvciBhdXRvbWF0aWMgcmVnaXN0cmF0aW9uIGluIHRoZSBwcm9jZXNzb3IgcmVwb3NpdG9yeQorCSAqIHRoZSBbIFsgRlVMTFkgXSBRVUFMSUZJRUQgXSBOQU1FIElECisJICovCisJQVZNX0lOSkVDVF9BVVRPX1JFR0lTVEVSX1FVQUxJRklFRF9JRF9LRVlfMygKKwkJCSJzdXBlcnZpc29yIiwKKwkJCSJhdm06OnByb2Nlc3Nvci5NQUlOIiwKKwkJCSJhdm06OmNvcmUuZmlsdGVyLlNUT1BfQ1JJVEVSSUEiICkKKwkvLyBlbmQgcmVnaXN0cmF0aW9uCisKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURQorCSAqLworCWF2bV9zaXplX3QgbU5vZGVDb3VudExpbWl0OworCWF2bV9zaXplX3QgbUV2YWxTdGVwTGltaXQ7CisJYXZtX3NpemVfdCBtTm9kZUhlaWdodExpbWl0OworCWF2bV9zaXplX3QgbU5vZGVXaWR0aExpbWl0OworCisJYXZtX3NpemVfdCBtUmVwb3J0RnJlcXVlbmN5OworCWF2bV9zaXplX3QgbVJlcG9ydFBvaW50OworCisJYXZtX3NpemVfdCBtU2F2ZUZyZXF1ZW5jeTsKKwlhdm1fc2l6ZV90IG1TYXZlUG9pbnQ7CisKKwlhdm1fc2l6ZV90IG1TdG9wQ291bnQ7CisKKwlhdm1fc2l6ZV90IG1EZWFkbG9ja0NvdW50OworCWF2bV9zaXplX3QgbUxpdmVsb2NrQ291bnQ7CisKKwlhdm1fc2l6ZV90IG1TdGF0ZW1lbnRFeGl0Q291bnQ7CisKKwlhdm1fc2l6ZV90IG1TdGF0ZW1lbnRGYXRhbEVycm9yQ291bnQ7CisJYXZtX3NpemVfdCBtU3ltYm9saWNFeGVjdXRpb25MaW1pdGF0aW9uQ291bnQ7CisKKwlhdm1fc2l6ZV90IG1NYXhSZWFjaEhlaWdodDsKKwlhdm1fc2l6ZV90IG1NYXhSZWFjaFdpZHRoOworCisJc3RkOjpzdHJpbmcgbUluY29uZGl0aW9uYWxTdG9wTWFya2VyTG9jYXRpb247CisJYXZtX3NpemVfdCBtSW5jb25kaXRpb25hbFN0b3BNYXJrZXJDaGVja2luZ1BlcmlvZDsKKworCWJvb2wgbUluY29uZGl0aW9uYWxTdG9wTWFya2VyRmxhZzsKKworCS8vIEV4ZWN1dGlvbiBleHRlbnNpb24gdHJhY2UgZmlsdGVyCisJRXhlY3V0YWJsZUZvcm0gbUxvY2FsRXhlY3V0YWJsZUZvcm07CisKKwlBdm1Db2RlIG1UcmFjZU9iamVjdGl2ZTsKKworCVRyYWNlQ2hlY2tlciBtVHJhY2VDaGVja2VyOworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIENvbXB1dGluZyBWYXJpYWJsZXMKKwlFeGVjdXRpb25Db250ZXh0ICogcHRyRUM7CisKKwlMaXN0T2ZFeGVjdXRpb25Db250ZXh0IGNoaWxkRUM7CisKKworcHVibGljOgorCisJTWFpblByb2Nlc3NvclVuaXQoU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyICYgYU1hbmFnZXIsCisJCQlXT2JqZWN0ICogd2ZQYXJhbWV0ZXJPYmplY3QgPSBOVUxMKQorCTogUmVnaXN0ZXJlZFByb2Nlc3NvclVuaXQoYU1hbmFnZXIsCisJCQl3ZlBhcmFtZXRlck9iamVjdCwgUFJFQ0VERU5DRV9PRl9NQUlOX1BST0NFU1NPUiksCisJSURlYnVnUHJvY2Vzc29yUHJvdmlkZXIoIHRoaXMgKSwKKworCW1Ob2RlQ291bnRMaW1pdCAoIEFWTV9OVU1FUklDX01BWF9TSVpFX1QgKSwKKwltRXZhbFN0ZXBMaW1pdCAgKCBBVk1fTlVNRVJJQ19NQVhfU0laRV9UICksCisJbU5vZGVIZWlnaHRMaW1pdCggQVZNX05VTUVSSUNfTUFYX1NJWkVfVCApLAorCW1Ob2RlV2lkdGhMaW1pdCAoIEFWTV9OVU1FUklDX01BWF9TSVpFX1QgKSwKKworCW1SZXBvcnRGcmVxdWVuY3koIEFWTV9OVU1FUklDX01BWF9TSVpFX1QgKSwKKwltUmVwb3J0UG9pbnQoIEFWTV9OVU1FUklDX01BWF9TSVpFX1QgKSwKKworCW1TYXZlRnJlcXVlbmN5KCBBVk1fTlVNRVJJQ19NQVhfU0laRV9UICksCisJbVNhdmVQb2ludCggQVZNX05VTUVSSUNfTUFYX1NJWkVfVCApLAorCisJbVN0b3BDb3VudCggMCApLAorCisJbURlYWRsb2NrQ291bnQoIDAgKSwKKwltTGl2ZWxvY2tDb3VudCggMCApLAorCisJbVN0YXRlbWVudEV4aXRDb3VudCggMCApLAorCisJbVN0YXRlbWVudEZhdGFsRXJyb3JDb3VudCggMCApLAorCW1TeW1ib2xpY0V4ZWN1dGlvbkxpbWl0YXRpb25Db3VudCggMCApLAorCisJbU1heFJlYWNoSGVpZ2h0KCAxICksCisJbU1heFJlYWNoV2lkdGgoIDEgKSwKKworCW1JbmNvbmRpdGlvbmFsU3RvcE1hcmtlckxvY2F0aW9uKCksCisJbUluY29uZGl0aW9uYWxTdG9wTWFya2VyQ2hlY2tpbmdQZXJpb2QoQVZNX05VTUVSSUNfTUFYX1NJWkVfVCksCisKKwltSW5jb25kaXRpb25hbFN0b3BNYXJrZXJGbGFnKCBmYWxzZSApLAorCisJLy8gRXhlY3V0aW9uIGV4dGVuc2lvbiB0cmFjZSBmaWx0ZXIKKwltTG9jYWxFeGVjdXRhYmxlRm9ybSggZ2V0Q29uZmlndXJhdGlvbigpLmdldEV4ZWN1dGFibGVTeXN0ZW0oKSAsIDAgKSwKKwltVHJhY2VPYmplY3RpdmUoIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfT1IgKSwKKwltVHJhY2VDaGVja2VyKCBFTlYsICZtTG9jYWxFeGVjdXRhYmxlRm9ybSApLAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gZm9yIGxvY2FsIHVzZWQKKwlwdHJFQyggTlVMTCApLAorCWNoaWxkRUMoICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCXZpcnR1YWwgfk1haW5Qcm9jZXNzb3JVbml0KCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogUmV0dXJuIHRydWUgaWYgdGhlIEVDIGlzIHJlLWV4ZWN1dGFibGUKKwkgKiBBbmQgY2xlYW4gdGhlIHN0cnVjdHVyYWwgc3RvcCBjcml0ZXJpYSBpbmZvCisJICogbGlrZSBFVkFMLCBOT0RFLCBIRUlHSFQsIFdJRFRILCBBQlNPTFVURV9TVE9QX01BUktFUgorCSAqLworCWlubGluZSBzdGF0aWMgYm9vbCBjbGVhbkZsYWdzSWZSZWV4ZWN1dGFibGUoRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpCisJeworCQlpZiggYW5FQy5nZXRGbGFncygpLmlzUmVleGVjdXRhYmxlKCkgKQorCQl7CisJCQlhbkVDLmdldHdGbGFncygpLnNldFJlZXhlY3V0YWJsZSgpOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKworCS8qKgorCSAqIENPTkZJR1VSRQorCSAqLworCWlubGluZSB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldERlZmF1bHRQcmVFdmFsVHJhY2VGb3JtYXR0ZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAiXG5zdGVwOiUxJSAsIGNvbnRleHQ6JTIlICwgaGVpZ2h0OiUzJSAsIHdpZHRoOiU0JSIgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXREZWZhdWx0UG9zdEV2YWxUcmFjZUZvcm1hdHRlcigpIGNvbnN0CisJeworCQlyZXR1cm4oICJcbnN0ZXA6JTElICwgY29udGV4dDolMiUgLCBoZWlnaHQ6JTMlICwgd2lkdGg6JTQlIiApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0RGVmYXVsdEJvdW5kRXZhbFRyYWNlRm9ybWF0dGVyKCkgY29uc3QKKwl7CisJCXJldHVybiggIlxuc3RlcDolMSUgLCBjb250ZXh0OiUyJSAsIGhlaWdodDolMyUgLCB3aWR0aDolNCUiICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0RGVmYXVsdFJlcG9ydEV2YWxUcmFjZUZvcm1hdHRlcigpIGNvbnN0CisJeworCQlyZXR1cm4oICJcbnN0b3A6JTElICwgY29udGV4dDolMiUgLCBoZWlnaHQ6JTMlICwgd2lkdGg6JTQlIiApOworCX0KKworCisJYm9vbCBjb25maWd1cmVJbXBsKCk7CisKKworCS8qKgorCSAqIFJFUE9SVCBUUkFDRQorCSAqLworCisJdmlydHVhbCB2b2lkIHJlcG9ydFNpbGVudChPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKKwl2aXJ0dWFsIHZvaWQgcmVwb3J0TWluaW11bShPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKKwl2aXJ0dWFsIHZvaWQgcmVwb3J0RGVmYXVsdChPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gTk9OLVJFR1JFU1NJT04gVEVTVCBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwl2aXJ0dWFsIHZvaWQgdGRkUmVncmVzc2lvblJlcG9ydEltcGwoT3V0U3RyZWFtICYgb3MpOworCisKKwkvKioKKwkgKiBFVkFMIFRSQUNFCisJICovCisJdmlydHVhbCB2b2lkIHRyYWNlTWluaW11bVByZUV2YWwoCisJCQlPdXRTdHJlYW0gJiBvcywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpIGNvbnN0OworCisJdmlydHVhbCB2b2lkIHRyYWNlRGVmYXVsdFByZUV2YWwoCisJCQlPdXRTdHJlYW0gJiBvcywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpIGNvbnN0OworCisKKwl2aXJ0dWFsIHZvaWQgdHJhY2VNaW5pbXVtUG9zdEV2YWwoCisJCQlPdXRTdHJlYW0gJiBvcywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpIGNvbnN0OworCisJdmlydHVhbCB2b2lkIHRyYWNlRGVmYXVsdFBvc3RFdmFsKAorCQkJT3V0U3RyZWFtICYgb3MsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKSBjb25zdDsKKworCisJdmlydHVhbCB2b2lkIHRyYWNlQm91bmRFdmFsKE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworCXZpcnR1YWwgdm9pZCByZXBvcnRFdmFsKE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFBST0NFU1NJTkcgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8qKgorCSAqIFBPU1QgUFJPQ0VTUworCSAqLworCWlubGluZSB2aXJ0dWFsIGJvb2wgcHJlcHJvY2VzcygpCisJeworCQlpZiggbVRyYWNlT2JqZWN0aXZlLm5vbmVtcHR5KCkgKQorCQl7CisJCQlyZXR1cm4oIGNvbGxlY3RFeHRlbmRlZENvbnRleHQoKSApOworCQl9CisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisKKwlib29sIGNvbGxlY3RFeHRlbmRlZENvbnRleHQoKTsKKworCXZvaWQgY29sbGVjdENvbnRleHQoCisJCQlMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgaW5wdXRDb250ZXh0LCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQyk7CisKKwl2b2lkIGFwcGVuZElmUmVxdWlyZWRFeHRlbnNpb24oCisJCQlMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgaW5wdXRDb250ZXh0LCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQyk7CisKKwlpbmxpbmUgdmlydHVhbCBib29sIHBvc3Rwcm9jZXNzKCkKKwl7CisJCXJldHVybiggdHJ1ZSApOworCX0KKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBGSUxURVJJTkcgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJLyoqCisJICogcHJlRXZhbCBGaWx0ZXIKKwkgKi8KKwl2aXJ0dWFsIGJvb2wgcHJlZmlsdGVyKCk7CisJdmlydHVhbCBib29sIHByZWZpbHRlcihFeGVjdXRpb25Db250ZXh0ICYgYW5FQyk7CisKKwlib29sIGZpbmFsaXplUHJlZmlsdGVyaW5nKCk7CisKKworCS8qKgorCSAqIHBvc3RGaWx0ZXIKKwkgKiBFdmVyeSBwb3N0IGZpbHRlciBoYXMgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kCisJICovCisJdmlydHVhbCBib29sIHBvc3RmaWx0ZXIoKTsKKwl2aXJ0dWFsIGJvb2wgcG9zdGZpbHRlcihFeGVjdXRpb25Db250ZXh0ICYgYW5FQyk7CisKKwlib29sIGZpbmFsaXplUG9zdGZpbHRlcmluZygpOworCisJdm9pZCBzZXRDb250ZXh0V2lkdGgoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gREVCVUcgUFJPQ0VTU0lORyBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwl2aXJ0dWFsIGJvb2wgZGVidWdFdmFsQ29tbWFuZEltcGwoKTsKKworCXZvaWQgY2hlY2tSZWFkRXZhbFN0b3BTY3JpcHQoKTsKKworfTsKKworCit9CisKKyNlbmRpZiAvKk1BSU5QUk9DRVNTT1JVTklUX0hfKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9hcGkvUHJvY2Vzc29yVW5pdEF1dG9SZWdpc3RyYXRpb24uY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2FwaS9Qcm9jZXNzb3JVbml0QXV0b1JlZ2lzdHJhdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJhZjJiZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9hcGkvUHJvY2Vzc29yVW5pdEF1dG9SZWdpc3RyYXRpb24uY3BwCkBAIC0wLDAgKzEsNjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAzIG1hcnMgMjAxNQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiUHJvY2Vzc29yVW5pdEF1dG9SZWdpc3RyYXRpb24uaCIKKworI2luY2x1ZGUgPGNvbW1vbi9CRi5oPgorCisjaW5jbHVkZSA8ZmFtL2FwaS9Qcm9jZXNzb3JVbml0UmVwb3NpdG9yeS5oPgorCisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1dPYmplY3QuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoqCisgKiBDT05TVFJVQ1RPUgorICogRGVmYXVsdAorICovCitJUHJvY2Vzc29yVW5pdFJlZ2lzdHJhdGlvbjo6SVByb2Nlc3NvclVuaXRSZWdpc3RyYXRpb24oCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU1haW5UeXBlSUQgICAsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYVR5cGVBbGlhc0lEXzEsCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVR5cGVBbGlhc0lEXzIsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYVR5cGVBbGlhc0lEXzMpCis6IG1Qcm9jZXNzb3JUeXBlSUQoIGFNYWluVHlwZUlEICksCisgIG1Qcm9jZXNzb3JUeXBlQWxpYXNJRF8xKCBhVHlwZUFsaWFzSURfMSApLAorICBtUHJvY2Vzc29yVHlwZUFsaWFzSURfMiggYVR5cGVBbGlhc0lEXzIgKSwKKyAgbVByb2Nlc3NvclR5cGVBbGlhc0lEXzMoIGFUeXBlQWxpYXNJRF8zICkKK3sKKwlQcm9jZXNzb3JVbml0UmVwb3NpdG9yeTo6cmVnaXN0ZXJQcm9jZXNzb3JGYWN0b3J5KGFNYWluVHlwZUlELCB0aGlzKTsKKworCWlmKCBub3QgYVR5cGVBbGlhc0lEXzEuZW1wdHkoKSApCisJeworCQlQcm9jZXNzb3JVbml0UmVwb3NpdG9yeTo6cmVnaXN0ZXJQcm9jZXNzb3JGYWN0b3J5KGFUeXBlQWxpYXNJRF8xLCB0aGlzKTsKKwl9CisJaWYoIG5vdCBhVHlwZUFsaWFzSURfMi5lbXB0eSgpICkKKwl7CisJCVByb2Nlc3NvclVuaXRSZXBvc2l0b3J5OjpyZWdpc3RlclByb2Nlc3NvckZhY3RvcnkoYVR5cGVBbGlhc0lEXzIsIHRoaXMpOworCX0KKwlpZiggbm90IGFUeXBlQWxpYXNJRF8zLmVtcHR5KCkgKQorCXsKKwkJUHJvY2Vzc29yVW5pdFJlcG9zaXRvcnk6OnJlZ2lzdGVyUHJvY2Vzc29yRmFjdG9yeShhVHlwZUFsaWFzSURfMywgdGhpcyk7CisJfQorfQorCisvLyBBUEkgZm9yIFByb2Nlc3NvclVuaXRSZXBvc2l0b3J5OjpyZWdpc3RlciguLi4pCitib29sIElQcm9jZXNzb3JVbml0UmVnaXN0cmF0aW9uOjppc1R5cGVJRChjb25zdCBXT2JqZWN0ICYgd2ZPYmplY3QpIGNvbnN0Cit7CisJcmV0dXJuKCBpc1R5cGVJRCggd2ZPYmplY3QuZ2V0UXVhbGlmaWVkVHlwZU5hbWVJRCgpICkgKTsKK30KKworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2FwaS9Qcm9jZXNzb3JVbml0QXV0b1JlZ2lzdHJhdGlvbi5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2FwaS9Qcm9jZXNzb3JVbml0QXV0b1JlZ2lzdHJhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMWI4ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vYXBpL1Byb2Nlc3NvclVuaXRBdXRvUmVnaXN0cmF0aW9uLmgKQEAgLTAsMCArMSwxNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAzIG1hcnMgMjAxNQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFBST0NFU1NPUlVOSVRBVVRPUkVHSVNUUkFUSU9OX0hfCisjZGVmaW5lIFBST0NFU1NPUlVOSVRBVVRPUkVHSVNUUkFUSU9OX0hfCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBPdXRTdHJlYW07CitjbGFzcyBCRjsKKworY2xhc3MgV09iamVjdDsKKworY2xhc3MgQWJzdHJhY3RQcm9jZXNzb3JVbml0OworY2xhc3MgU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyOworCisKK2NsYXNzIElQcm9jZXNzb3JVbml0UmVnaXN0cmF0aW9uCit7CisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBBVFRSSUJVVEUKKwkgKi8KKwlzdGQ6OnN0cmluZyBtUHJvY2Vzc29yVHlwZUlEOworCisJLy8gRm9yIGRlcHJlY2F0ZWQgVHlwZSBRdWFsaWZpZWQgTmFtZS9BbGlhcyBJRAorCXN0ZDo6c3RyaW5nIG1Qcm9jZXNzb3JUeXBlQWxpYXNJRF8xOworCXN0ZDo6c3RyaW5nIG1Qcm9jZXNzb3JUeXBlQWxpYXNJRF8yOworCXN0ZDo6c3RyaW5nIG1Qcm9jZXNzb3JUeXBlQWxpYXNJRF8zOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlJUHJvY2Vzc29yVW5pdFJlZ2lzdHJhdGlvbihjb25zdCBzdGQ6OnN0cmluZyAmIGFNYWluVHlwZUlELAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhVHlwZUFsaWFzSURfMSA9ICIiLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhVHlwZUFsaWFzSURfMiA9ICIiLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhVHlwZUFsaWFzSURfMyA9ICIiKTsKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5JUHJvY2Vzc29yVW5pdFJlZ2lzdHJhdGlvbigpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBBUEkgZm9yIFByb2Nlc3NvciBVbml0IFJlZ2lzdHJhdGlvbgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCS8vIEVxdWFscyBDb21wYXJpc29uCisJaW5saW5lIHZpcnR1YWwgYm9vbCBpc0VxdWFscygKKwkJCWNvbnN0IElQcm9jZXNzb3JVbml0UmVnaXN0cmF0aW9uICYgYVJlZ2lzdGVyVG9vbCkgY29uc3QKKwl7CisJCXJldHVybiggdGhpcyA9PSAoJiBhUmVnaXN0ZXJUb29sKSApOworCX0KKworCisJLy8gQVBJIGZvciBQcm9jZXNzb3JVbml0UmVwb3NpdG9yeTo6cmVnaXN0ZXIoLi4uKQorCWlubGluZSBjb25zdCBzdGQ6OnN0cmluZyAmIGdldFR5cGVJRCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Qcm9jZXNzb3JUeXBlSUQgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc1R5cGVJRChjb25zdCBzdGQ6OnN0cmluZyAmIGFUeXBlSUQpIGNvbnN0CisJeworCQlyZXR1cm4oIChub3QgYVR5cGVJRC5lbXB0eSgpKQorCQkJCSYmICggKG1Qcm9jZXNzb3JUeXBlSUQgID09IGFUeXBlSUQpCisJCQkJCXx8IChtUHJvY2Vzc29yVHlwZUFsaWFzSURfMSA9PSBhVHlwZUlEKQorCQkJCQl8fCAobVByb2Nlc3NvclR5cGVBbGlhc0lEXzIgPT0gYVR5cGVJRCkKKwkJCQkJfHwgKG1Qcm9jZXNzb3JUeXBlQWxpYXNJRF8zID09IGFUeXBlSUQpICkgKTsKKwl9CisKKworCWJvb2wgaXNUeXBlSUQoY29uc3QgV09iamVjdCAmIHdmT2JqZWN0KSBjb25zdDsKKworCS8vIEFQSSBmb3IgUHJvY2Vzc29yVW5pdFJlcG9zaXRvcnk6OmNyZWF0ZSguLi4pCisJdmlydHVhbCBBYnN0cmFjdFByb2Nlc3NvclVuaXQgKiBuZXdJbnN0YW5jZSgKKwkJCVN5bWJleENvbnRyb2xsZXJVbml0TWFuYWdlciAmIGFDb250cm9sbGVyVW5pdE1hbmFnZXIsCisJCQlXT2JqZWN0ICogd2ZQYXJhbWV0ZXJPYmplY3QpID0gMDsKKworfTsKKworCisKK3RlbXBsYXRlPCBjbGFzcyBQcm9jZXNzb3JUID4KK2NsYXNzIFByb2Nlc3NvclVuaXRSZWdpc3RyYXRpb25JbXBsICA6ICBwdWJsaWMgSVByb2Nlc3NvclVuaXRSZWdpc3RyYXRpb24KK3sKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCVByb2Nlc3NvclVuaXRSZWdpc3RyYXRpb25JbXBsKGNvbnN0IHN0ZDo6c3RyaW5nICYgYU1haW5UeXBlSUQsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFUeXBlQWxpYXNJRF8xID0gIiIsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFUeXBlQWxpYXNJRF8yID0gIiIsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFUeXBlQWxpYXNJRF8zID0gIiIpCisJOiBJUHJvY2Vzc29yVW5pdFJlZ2lzdHJhdGlvbihhTWFpblR5cGVJRCwKKwkJCWFUeXBlQWxpYXNJRF8xLCBhVHlwZUFsaWFzSURfMiwgYVR5cGVBbGlhc0lEXzMpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+UHJvY2Vzc29yVW5pdFJlZ2lzdHJhdGlvbkltcGwoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIEFQSSBmb3IgUHJvY2Vzc29yVW5pdFJlcG9zaXRvcnkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkvLyBBUEkgZm9yIFByb2Nlc3NvclVuaXRSZXBvc2l0b3J5OjpjcmVhdGUoLi4uKQorCXZpcnR1YWwgQWJzdHJhY3RQcm9jZXNzb3JVbml0ICogbmV3SW5zdGFuY2UoCisJCQlTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXIgJiBhQ29udHJvbGxlclVuaXRNYW5hZ2VyLAorCQkJV09iamVjdCAqIHdmUGFyYW1ldGVyT2JqZWN0KQorCXsKKwkJcmV0dXJuKCBuZXcgUHJvY2Vzc29yVChhQ29udHJvbGxlclVuaXRNYW5hZ2VyLCB3ZlBhcmFtZXRlck9iamVjdCkgKTsKKwl9CisKK307CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKiBQUk9DRVNTT1JVTklUQVVUT1JFR0lTVFJBVElPTl9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2FwaS9Qcm9jZXNzb3JVbml0RmFjdG9yeS5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vYXBpL1Byb2Nlc3NvclVuaXRGYWN0b3J5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWIwYjAwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2FwaS9Qcm9jZXNzb3JVbml0RmFjdG9yeS5jcHAKQEAgLTAsMCArMSwzNzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyOSBub3YuIDIwMTEKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlByb2Nlc3NvclVuaXRGYWN0b3J5LmgiCisKKyNpbmNsdWRlIDxmbWwvd29ya2Zsb3cvUXVlcnkuaD4KKyNpbmNsdWRlIDxmbWwvd29ya2Zsb3cvV09iamVjdC5oPgorCisjaW5jbHVkZSA8ZmFtL2FwaS9BYnN0cmFjdFByb2Nlc3NvclVuaXQuaD4KKyNpbmNsdWRlIDxmYW0vYXBpL1Byb2Nlc3NvclVuaXRSZXBvc2l0b3J5Lmg+CisKKyNpbmNsdWRlIDxmYW0vZGVidWcvQXZtRGVidWdQcm9jZXNzb3IuaD4KKworI2luY2x1ZGUgPHNldy9Xb3JrZmxvdy5oPgorI2luY2x1ZGUgPHNldy9TeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXIuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENSRUFUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitBYnN0cmFjdFByb2Nlc3NvclVuaXQgKiBQcm9jZXNzb3JVbml0RmFjdG9yeTo6Y3JlYXRlKAorCQlTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXIgJiBhTWFuYWdlciwgV09iamVjdCAqIHdmUHJvY2Vzc09iamVjdCkKK3sKKwlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCB3ZlByb2Nlc3NPYmplY3QgKQorCQkJPDwgIlVuZXhwZWN0ZWQgYSA8bnVsbD4gcHJvY2Vzc29yIHVuaXQgcGFyYW1ldGVyIFdPYmplY3QgISEhIgorCQkJPDwgU0VORF9FWElUOworCisJcmV0dXJuKCBQcm9jZXNzb3JVbml0UmVwb3NpdG9yeTo6Y3JlYXRlKGFNYW5hZ2VyLCB3ZlByb2Nlc3NPYmplY3QpICk7Cit9CisKKworYm9vbCBQcm9jZXNzb3JVbml0RmFjdG9yeTo6Y3JlYXRlTGlzdCgKKwkJU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyICYgYU1hbmFnZXIsCisJCUxpc3Q8IFdPYmplY3QgKiA+ICYgbGlzdE9mUHJvY2Vzc1dPYmplY3QpCit7CisJTGlzdDwgV09iamVjdCAqID46Oml0ZXJhdG9yIGl0ID0gbGlzdE9mUHJvY2Vzc1dPYmplY3QuYmVnaW4oKTsKKwlMaXN0PCBXT2JqZWN0ICogPjo6aXRlcmF0b3IgZW5kSXQgPSBsaXN0T2ZQcm9jZXNzV09iamVjdC5lbmQoKTsKKwlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwl7CisJCUFic3RyYWN0UHJvY2Vzc29yVW5pdCAqIHRtcFByb2Nlc3NvciA9IGNyZWF0ZShhTWFuYWdlciwgKCppdCkpOworCisJCWlmKCB0bXBQcm9jZXNzb3IgIT0gTlVMTCApCisJCXsKKwkJCWFNYW5hZ2VyLmFwcGVuZCggdG1wUHJvY2Vzc29yICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlBVk1fT1NfRVJST1JfQUxFUlQgPDwgIlByb2Nlc3NvclVuaXRGYWN0b3J5OjpjcmVhdGU6PiAiCisJCQkJCQkiVW5yZWdpc3RlcmVkIFByb2Nlc3NvciBXT2JqZWN0IFR5cGUgPyIgPDwgc3RkOjplbmRsCisJCQkJCTw8IHN0cl9oZWFkZXIoICppdCApCisJCQkJCTw8IFNFTkRfQUxFUlQ7CisKKwkJCUFWTV9PU19XQVJOIDw8IGluY3Jfc3RyZWFtKCAqaXQgKTsKKworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENPTkZJR1VSRSAgQVBJCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIFByb2Nlc3NvclVuaXRGYWN0b3J5Ojpjb25maWd1cmUoCisJCVN5bWJleENvbnRyb2xsZXJVbml0TWFuYWdlciAmIGFQbHVnaW5Qcm9jZXNzb3JNYW5hZ2VyLAorCQlXT2JqZWN0ICogd2ZEaXJlY3Rvck9iamVjdCwgV09iamVjdCAqIG1vZVByb2ZpbGUpCit7CisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFBST0NFU1NPUlMgQ1JFQVRJT04KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkvLyBzZWN0aW9uIHdvcmtlciAvIFBST0NFU1NPUgorCUxpc3Q8IFdPYmplY3QgKiA+IGxpc3RPZlByb2Nlc3NXT2JqZWN0OworCVF1ZXJ5OjpnZXRSZWdleFdPYmplY3RJblNlcXVlbmNlKHdmRGlyZWN0b3JPYmplY3QsCisJCQlXb3JrZmxvdzo6U0VDVElPTl9GQU1fQ09OVEFJTkVSU19SRUdFWF9JRCwgbGlzdE9mUHJvY2Vzc1dPYmplY3QpOworCisJaWYoIG5vdCBjcmVhdGVMaXN0KGFQbHVnaW5Qcm9jZXNzb3JNYW5hZ2VyLCBsaXN0T2ZQcm9jZXNzV09iamVjdCkgKQorCXsKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFdPUktGTE9XIFNDSEVEVUxFUiBJTklUSUFMSVpBVElPTgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlmKCBub3QgY29uZmlndXJlUHJvY2Vzc29yU2NoZWR1bGVyKEFWTV9QUkVfUFJPQ0VTU0lOR19TVEFHRSwKKwkJCWFQbHVnaW5Qcm9jZXNzb3JNYW5hZ2VyLmdldFByZXByb2Nlc3NvcigpLAorCQkJUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5VmFsdWUobW9lUHJvZmlsZSwKKwkJCQkJQ09OU19XSUQyKCJwcmUiLCAicHJvY2VzcyIpLCBCRjo6UkVGX05VTEwpKSApCisJeworCQlBVk1fT1NfRVJST1JfQUxFUlQKKwkJCQk8PCAiUHJlUHJvY2Vzc29yTWFuYWdlcjo+IENvbmZpZ3VyZSBwcmVwcm9jZXNzb3IgRmFpbGVkICEhISIKKwkJCQk8PCBTRU5EX0FMRVJUOworCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwlpZiggbm90IGNvbmZpZ3VyZVByb2Nlc3NvclNjaGVkdWxlcihBVk1fUFJFX0ZJTFRFUklOR19TVEFHRSwKKwkJCWFQbHVnaW5Qcm9jZXNzb3JNYW5hZ2VyLmdldFByZWZpbHRlcigpLAorCQkJUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5VmFsdWUobW9lUHJvZmlsZSwKKwkJCQkJQ09OU19XSUQyKCJwcmUiLCAiZmlsdGVyIiksIEJGOjpSRUZfTlVMTCkpICkKKwl7CisJCUFWTV9PU19FUlJPUl9BTEVSVCA8PCAiUHJvY2Vzc29yVW5pdEZhY3Rvcnk6OmNvbmZpZ3VyZTo+ICIKKwkJCQkJIkNvbmZpZ3VyZSBwcmVmaWx0ZXIgRmFpbGVkICEhISIKKwkJCQk8PCBTRU5EX0FMRVJUOworCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwlpZiggbm90IGNvbmZpZ3VyZVByb2Nlc3NvclNjaGVkdWxlcihBVk1fUE9TVF9GSUxURVJJTkdfU1RBR0UsCisJCQlhUGx1Z2luUHJvY2Vzc29yTWFuYWdlci5nZXRQb3N0ZmlsdGVyKCksCisJCQlRdWVyeTo6Z2V0UmVnZXhXUHJvcGVydHlWYWx1ZShtb2VQcm9maWxlLAorCQkJCQlDT05TX1dJRDIoInBvc3QiLCAiZmlsdGVyIiksIEJGOjpSRUZfTlVMTCkpICkKKwl7CisJCUFWTV9PU19FUlJPUl9BTEVSVCA8PCAiUHJvY2Vzc29yVW5pdEZhY3Rvcnk6OmNvbmZpZ3VyZTo+ICIKKwkJCQkJIkNvbmZpZ3VyZSBwb3N0ZmlsdGVyIEZhaWxlZCAhISEiCisJCQkJPDwgU0VORF9BTEVSVDsKKworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJaWYoIG5vdCBjb25maWd1cmVQcm9jZXNzb3JTY2hlZHVsZXIoQVZNX1BPU1RfUFJPQ0VTU0lOR19TVEFHRSwKKwkJCWFQbHVnaW5Qcm9jZXNzb3JNYW5hZ2VyLmdldFBvc3Rwcm9jZXNzb3IoKSwKKwkJCVF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eVZhbHVlKG1vZVByb2ZpbGUsCisJCQkJCUNPTlNfV0lEMigicG9zdCIsICJwcm9jZXNzIiksIEJGOjpSRUZfTlVMTCkpICkKKwl7CisJCUFWTV9PU19FUlJPUl9BTEVSVCA8PCAiUHJvY2Vzc29yVW5pdEZhY3Rvcnk6OmNvbmZpZ3VyZTo+ICIKKwkJCQkJIkNvbmZpZ3VyZSBwb3N0cHJvY2Vzc29yIEZhaWxlZCAhISEiCisJCQkJPDwgU0VORF9BTEVSVDsKKworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gUFJPQ0VTU09SUyBDT05GSUdVUkUKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlpZiggbm90IGFQbHVnaW5Qcm9jZXNzb3JNYW5hZ2VyLmNvbmZpZ3VyZUNvbnRyb2xsZXJVbml0cygpICkKKwl7CisJCUFWTV9PU19XQVJOIDw8ICJQcm9jZXNzb3JVbml0RmFjdG9yeTo6Y29uZmlndXJlOj4gRmFpbGVkICEhISIKKwkJCQk8PCBzdGQ6OmVuZGw7CisKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworLyoKKyAqIE5FVyBDT05TSVNFIFNZTlRBWAorc3VwZXJ2aXNvciB7CisJbGltaXQgJ29mIGdyYXBoIGV4cGxvcmF0aW9uJyBbCisJCWV2YWwgPSAxMAorCQkuLi4KKwldCisJcXVldWUgJ2ZvciBncmFwaCBleHBsb3JhdGlvbicgWworCQlzdHJhdGVneSA9ICdCRlMnCisJCS4uLgorCV0KKwljb25zb2xlIFsKKwkJZm9ybWF0ID0gIlxuc3RlcDolMSUgLCBjb250ZXh0OiUyJSAsIGhlaWdodDolMyUgLCB3aWR0aDolNCUiCisJCS4uLgorCV0KK30KKyovCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIE1BSU4gUFJPQ0VTU09SIENPTkZJR1VSRQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCU1haW5Qcm9jZXNzb3JVbml0ICYgdGhlTWFpblByb2Nlc3NvciA9CisJCQlhUGx1Z2luUHJvY2Vzc29yTWFuYWdlci5nZXRNYWluUHJvY2Vzc29yKCk7CisKKwlpZiggbm90IHRoZU1haW5Qcm9jZXNzb3IuaGFzUGFyYW1ldGVyV09iamVjdCgpICkKKwl7CisJCXRoZU1haW5Qcm9jZXNzb3Iuc2V0UGFyYW1ldGVyV09iamVjdCgKKwkJCQlRdWVyeTo6Z2V0UmVnaXN0ZXJXT2JqZWN0KHdmRGlyZWN0b3JPYmplY3QsCisJCQkJCQlNYWluUHJvY2Vzc29yVW5pdDo6QVVUT19SRUdJU1RFUl9UT09MKSApOworCX0KKworCWlmKCBub3QgdGhlTWFpblByb2Nlc3Nvci5jb25maWd1cmUoKSApCisJeworCQlBVk1fT1NfV0FSTiA8PCAiUHJvY2Vzc29yVW5pdEZhY3Rvcnk6OmNvbmZpZ3VyZTo+IEZhaWxlZCB0byAiCisJCQkiY29uZmlndXJlIHRoZSBkZWZhdWx0IHN0b3AgcHJvY2Vzc29yIDw8ICIKKwkJCTw8IHRoZU1haW5Qcm9jZXNzb3IuZ2V0UGFyYW1ldGVyV09iamVjdCgpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQk8PCAiID4+ICIgPDwgc3RkOjplbmRsOworCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBRVUVVRSBQUk9DRVNTT1IgQ09ORklHVVJFCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJRXhlY3V0aW9uUXVldWUgJiB0aGVRdWV1ZVByb2Nlc3NvciA9CisJCQlhUGx1Z2luUHJvY2Vzc29yTWFuYWdlci5nZXRFeGVjdXRpb25RdWV1ZSgpOworCisJV09iamVjdCAqIHF1ZXVlV09iamVjdCA9IFF1ZXJ5OjpnZXRSZWdleFdPYmplY3RCeU5hbWVJRCgKKwkJCXRoZU1haW5Qcm9jZXNzb3IuZ2V0UGFyYW1ldGVyV09iamVjdCgpLAorCQkJV29ya2Zsb3c6OlNFQ1RJT05fRkFNX1FVRVVFX1JFR0VYX0lELCBXT2JqZWN0OjpfTlVMTF8pOworCisJaWYoIHF1ZXVlV09iamVjdCAhPSBXT2JqZWN0OjpfTlVMTF8gKQorCXsKKwkJcXVldWVXT2JqZWN0ID0gdGhlTWFpblByb2Nlc3Nvci5nZXRQYXJhbWV0ZXJXT2JqZWN0KCk7CisJfQorCWVsc2UKKwl7CisJCXF1ZXVlV09iamVjdCA9IFF1ZXJ5OjpnZXRXUHJvcGVydHlXUmVmZXJlbmNlKAorCQkJCXRoZU1haW5Qcm9jZXNzb3IuZ2V0UGFyYW1ldGVyV09iamVjdCgpLAorCQkJCSJxdWV1ZSIsIFdPYmplY3Q6Ol9OVUxMXyk7CisJCWlmKCBxdWV1ZVdPYmplY3QgPT0gV09iamVjdDo6X05VTExfICkKKwkJeworCQkJLy8hISBERVBSRUNBVEVECisJCQlxdWV1ZVdPYmplY3QgPSBRdWVyeTo6Z2V0V1Byb3BlcnR5V1JlZmVyZW5jZSgKKwkJCQkJbW9lUHJvZmlsZSwgInF1ZXVlIiwgV09iamVjdDo6X05VTExfKTsKKwkJCWlmKCBxdWV1ZVdPYmplY3QgPT0gV09iamVjdDo6X05VTExfICkKKwkJCXsKKwkJCQlxdWV1ZVdPYmplY3QgPSBRdWVyeTo6Z2V0UmVnaXN0ZXJXT2JqZWN0KG1vZVByb2ZpbGUsCisJCQkJCQlFeGVjdXRpb25RdWV1ZTo6QVVUT19SRUdJU1RFUl9UT09MKTsKKwkJCX0KKwkJfQorCX0KKworCWlmKCBxdWV1ZVdPYmplY3QgIT0gV09iamVjdDo6X05VTExfICkKKwl7CisJCXRoZVF1ZXVlUHJvY2Vzc29yLnNldFBhcmFtZXRlcldPYmplY3QoIHF1ZXVlV09iamVjdCApOworCX0KKworCWlmKCB0aGVRdWV1ZVByb2Nlc3Nvci5oYXNQYXJhbWV0ZXJXT2JqZWN0KCkgKQorCXsKKwkJaWYoIG5vdCB0aGVRdWV1ZVByb2Nlc3Nvci5jb25maWd1cmVJbXBsKCkgKQorCQl7CisJCQlBVk1fT1NfV0FSTiA8PCAiUHJvY2Vzc29yVW5pdEZhY3Rvcnk6OmNvbmZpZ3VyZTo+IEZhaWxlZCB0byAiCisJCQkJCSJjb25maWd1cmUgdGhlIGRlZmF1bHQgcXVldWUgcHJvY2Vzc29yIDw8ICIKKwkJCQkJPDwgdGhlUXVldWVQcm9jZXNzb3IKKwkJCQkJCS5nZXRQYXJhbWV0ZXJXT2JqZWN0KCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKwkJCQkJPDwgIiA+PiAiIDw8IHN0ZDo6ZW5kbDsKKworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorCWVsc2UKKwl7CisJCUFWTV9PU19XQVJOIDw8ICJQcm9jZXNzb3JVbml0RmFjdG9yeTo6Y29uZmlndXJlOj4gRmFpbGVkIHRvICIKKwkJCQkiY29uZmlndXJlIHRoZSBkZWZhdWx0IHF1ZXVlIHByb2Nlc3NvciB3aXRoIGEgbnVsbCB3Zk9iamVjdCAhIgorCQkJCTw8IHN0ZDo6ZW5kbDsKKworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gUkVEVU5EQU5DWSBQUk9DRVNTT1IgQ09ORklHVVJFCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJUmVkdW5kYW5jeUZpbHRlciAmIHRoZVJlZHVuZGFuY3lQcm9jZXNzb3IgPQorCQkJYVBsdWdpblByb2Nlc3Nvck1hbmFnZXIuZ2V0UmVkdW5kYW5jeVByb2Nlc3NvcigpOworCisJaWYoIG5vdCB0aGVSZWR1bmRhbmN5UHJvY2Vzc29yLmhhc1BhcmFtZXRlcldPYmplY3QoKSApCisJeworCQl0aGVSZWR1bmRhbmN5UHJvY2Vzc29yLnNldFBhcmFtZXRlcldPYmplY3QoCisJCQkJdGhlTWFpblByb2Nlc3Nvci5nZXRQYXJhbWV0ZXJXT2JqZWN0KCkgKTsKKwl9CisKKwlpZiggbm90IHRoZVJlZHVuZGFuY3lQcm9jZXNzb3IuY29uZmlndXJlSW1wbCgpICkKKwl7CisJCUFWTV9PU19XQVJOIDw8ICJQcm9jZXNzb3JVbml0RmFjdG9yeTo6Y29uZmlndXJlOj4gRmFpbGVkIHRvICIKKwkJCQkiY29uZmlndXJlIHRoZSBkZWZhdWx0IHJlZHVuZGFuY3kgcHJvY2Vzc29yIDw8ICIKKwkJCQk8PCB0aGVSZWR1bmRhbmN5UHJvY2Vzc29yCisJCQkJCS5nZXRQYXJhbWV0ZXJXT2JqZWN0KCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKwkJCQk8PCAiID4+ICIgPDwgc3RkOjplbmRsOworCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKK0FWTV9JRl9ERUJVR19FTkFCTEVEX0FORCggYVBsdWdpblByb2Nlc3Nvck1hbmFnZXIuaXNBdXRvQ29uZmlndXJlKCkgKQorCUFWTV9PU19MT0cgPDwgIlByb2Nlc3NvclVuaXRGYWN0b3J5OjphdXRvY29uZmlndXJlIDwiCisJCQk8PCBhUGx1Z2luUHJvY2Vzc29yTWFuYWdlci5zdHJVbmlxSWQoKSA8PCAiPiIgPDwgc3RkOjplbmRsOworCWFQbHVnaW5Qcm9jZXNzb3JNYW5hZ2VyLnRvU3RyZWFtKCBBVk1fT1NfTE9HICk7CitBVk1fRU5ESUZfREVCVUdfRkxBR19BTkQoIENPTkZJR1VSSU5HICkKKworCXJldHVybiB0cnVlOworfQorCisKK2Jvb2wgUHJvY2Vzc29yVW5pdEZhY3Rvcnk6OmNvbmZpZ3VyZVByb2Nlc3NvclNjaGVkdWxlcigKKwkJYXZtX2NvbXB1dGluZ19wcm9jZXNzX3N0YWdlX3QgYVJlcXVpcmVtZW50LAorCQlDb21wb3NpdGVDb250cm9sbGVyVW5pdCAmIHByb2Nlc3NvclNjaGVkdWxlciwgY29uc3QgQkYgJiBhU2NoZWR1bGVyKQoreworCWlmKCBhU2NoZWR1bGVyLnZhbGlkKCkgKQorCXsKKwkJQWJzdHJhY3RQcm9jZXNzb3JVbml0ICogYVByb2Nlc3NvciA9IE5VTEw7CisKKwkJaWYoIFdPYmplY3RNYW5hZ2VyOjppcyggYVNjaGVkdWxlciApICkKKwkJeworCQkJYVByb2Nlc3NvciA9IHByb2Nlc3NvclNjaGVkdWxlci5nZXRDb250cm9sbGVyVW5pdE1hbmFnZXIoKS4KKwkJCQkJZ2V0Q29udHJvbGxlclVuaXQoIFdPYmplY3RNYW5hZ2VyOjpmcm9tKCBhU2NoZWR1bGVyICkgKTsKKworCQkJaWYoIGFQcm9jZXNzb3IgIT0gTlVMTCApCisJCQl7CisJCQkJYVByb2Nlc3Nvci0+ZW5hYmxlUGx1Z2luKGFSZXF1aXJlbWVudCk7CisKKwkJCQlwcm9jZXNzb3JTY2hlZHVsZXIuYXBwZW5kKCBhUHJvY2Vzc29yICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQVZNX09TX0VSUk9SX0FMRVJUCisJCQkJCQk8PCAiY29uZmlndXJlUG9zdHByb2Nlc3M6PiBVbkZvdW5kIFdPYmplY3QgPDwgIgorCQkJCQkJPDwgV09iamVjdE1hbmFnZXI6OmZyb20oIGFTY2hlZHVsZXIgKS0+c3RyVW5pcUlkKCkKKwkJCQkJCTw8ICIgPj4gUHJvY2Vzc29yIHVzaW5nIGFzIHByb2Nlc3NvciAhISEiCisJCQkJCQk8PCBTRU5EX0FMRVJUOworCisJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJfQorCQl9CisJCWVsc2UgaWYoIGFTY2hlZHVsZXIuaXM8IEF2bUNvZGUgPigpICkKKwkJeworCQkJQXZtQ29kZSAqIGFDb2RlID0gYVNjaGVkdWxlci50b19wdHI8IEF2bUNvZGUgPigpOworCisJCQlBdm1Db2RlOjppdGVyYXRvciBpdCA9IGFDb2RlLT5iZWdpbigpOworCQkJZm9yKCA7IGl0ICE9IGFDb2RlLT5lbmQoKSA7ICsraXQgKQorCQkJeworCQkJCWNvbmZpZ3VyZVByb2Nlc3NvclNjaGVkdWxlcigKKwkJCQkJCWFSZXF1aXJlbWVudCwgcHJvY2Vzc29yU2NoZWR1bGVyLCAoKml0KSk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlhUHJvY2Vzc29yID0gcHJvY2Vzc29yU2NoZWR1bGVyLmdldENvbnRyb2xsZXJVbml0TWFuYWdlcigpLgorCQkJCQlnZXRDb250cm9sbGVyVW5pdCggYVNjaGVkdWxlci5zdHIoKSApOworCisJCQlpZiggYVByb2Nlc3NvciAhPSBOVUxMICkKKwkJCXsKKwkJCQlhUHJvY2Vzc29yLT5lbmFibGVQbHVnaW4oYVJlcXVpcmVtZW50KTsKKworCQkJCXByb2Nlc3NvclNjaGVkdWxlci5hcHBlbmQoIGFQcm9jZXNzb3IgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlBVk1fT1NfRVJST1JfQUxFUlQKKwkJCQkJCTw8ICJjb25maWd1cmVQb3N0cHJvY2Vzczo+IFVuRm91bmQgV09iamVjdCA8PCAiCisJCQkJCQk8PCBXT2JqZWN0TWFuYWdlcjo6ZnJvbSggYVNjaGVkdWxlciApLT5zdHJVbmlxSWQoKQorCQkJCQkJPDwgIiA+PiBQcm9jZXNzb3IgdXNpbmcgYXMgcHJvY2Vzc29yICEhISIKKwkJCQkJCTw8IFNFTkRfQUxFUlQ7CisKKwkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2FwaS9Qcm9jZXNzb3JVbml0RmFjdG9yeS5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2FwaS9Qcm9jZXNzb3JVbml0RmFjdG9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYzBjM2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vYXBpL1Byb2Nlc3NvclVuaXRGYWN0b3J5LmgKQEAgLTAsMCArMSw2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDI5IG5vdi4gMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFBST0NFU1NPUlVOSVRGQUNUT1JZX0hfCisjZGVmaW5lIFBST0NFU1NPUlVOSVRGQUNUT1JZX0hfCisKKyNpbmNsdWRlIDxjb2xsZWN0aW9uL0xpc3QuaD4KKyNpbmNsdWRlIDxmYW0vYXBpL0Fic3RyYWN0UHJvY2Vzc29yVW5pdC5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworY2xhc3MgQ29tcG9zaXRlQ29udHJvbGxlclVuaXQ7CitjbGFzcyBTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXI7CitjbGFzcyBXT2JqZWN0OworCisKK2NsYXNzIFByb2Nlc3NvclVuaXRGYWN0b3J5Cit7CisKK3B1YmxpYzoKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBMT0FERVIgLyBESVNQT1NFUiAgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCXN0YXRpYyB2b2lkIGxvYWQoKTsKKwlzdGF0aWMgdm9pZCBkaXNwb3NlKCk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBDUkVBVElPTgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwlzdGF0aWMgQWJzdHJhY3RQcm9jZXNzb3JVbml0ICogY3JlYXRlKAorCQkJU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyICYgYU1hbmFnZXIsIFdPYmplY3QgKiB3ZlByb2Nlc3NPYmplY3QpOworCisJc3RhdGljIGJvb2wgY3JlYXRlTGlzdChTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXIgJiBhTWFuYWdlciwKKwkJCUxpc3Q8IFdPYmplY3QgKiA+ICYgbGlzdE9mUHJvY2Vzc1dPYmplY3QpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQ09ORklHVVJFICBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJc3RhdGljIGJvb2wgY29uZmlndXJlKFN5bWJleENvbnRyb2xsZXJVbml0TWFuYWdlciAmIGFQbHVnaW5Qcm9jZXNzb3JNYW5hZ2VyICwKKwkJCVdPYmplY3QgKiB3ZkRpcmVjdG9yT2JqZWN0LCBXT2JqZWN0ICogbW9lUHJvZmlsZSk7CisKKwlzdGF0aWMgYm9vbCBjb25maWd1cmVQcm9jZXNzb3JTY2hlZHVsZXIoCisJCQlhdm1fY29tcHV0aW5nX3Byb2Nlc3Nfc3RhZ2VfdCBhUmVxdWlyZW1lbnQsCisJCQlDb21wb3NpdGVDb250cm9sbGVyVW5pdCAmIHByb2Nlc3NvclNjaGVkdWxlciwKKwkJCWNvbnN0IEJGICYgYVNjaGVkdWxlcik7CisKK307CisKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKyNlbmRpZiAvKiBQUk9DRVNTT1JVTklURkFDVE9SWV9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2FwaS9Qcm9jZXNzb3JVbml0UmVwb3NpdG9yeS5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vYXBpL1Byb2Nlc3NvclVuaXRSZXBvc2l0b3J5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDg4OGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2FwaS9Qcm9jZXNzb3JVbml0UmVwb3NpdG9yeS5jcHAKQEAgLTAsMCArMSwyNDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiA0IGTDqWMuIDIwMTQKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlByb2Nlc3NvclVuaXRSZXBvc2l0b3J5LmgiCisKKyNpbmNsdWRlIDxjb2xsZWN0aW9uL0xpc3QuaD4KKworI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9XT2JqZWN0Lmg+CisKKyNpbmNsdWRlIDxmYW0vYXBpL0Fic3RyYWN0UHJvY2Vzc29yVW5pdC5oPgorI2luY2x1ZGUgPGZhbS9hcGkvUHJvY2Vzc29yVW5pdEF1dG9SZWdpc3RyYXRpb24uaD4KKyNpbmNsdWRlIDxmYW0vYXBpL01haW5Qcm9jZXNzb3JVbml0Lmg+CisKKworI2luY2x1ZGUgPGZhbS9hcGkvRXh0ZW5kZXJQcm9jZXNzb3JVbml0Lmg+CisjaW5jbHVkZSA8ZmFtL2FwaS9NYWluUHJvY2Vzc29yVW5pdC5oPgorCisjaW5jbHVkZSA8ZmFtL2NvdmVyYWdlL0F2bUNvdmVyYWdlUHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8ZmFtL2NvdmVyYWdlL0Zvcm11bGFDb3ZlcmFnZUZpbHRlci5oPgorI2luY2x1ZGUgPGZhbS9jb3ZlcmFnZS9UcmFuc2l0aW9uQ292ZXJhZ2VGaWx0ZXIuaD4KKworI2luY2x1ZGUgPGZhbS9kZWJ1Zy9Bdm1EZWJ1Z1Byb2Nlc3Nvci5oPgorCisjaW5jbHVkZSA8ZmFtL2hpdG9yanVtcC9Bdm1IaXRPckp1bXBQcm9jZXNzb3IuaD4KKworI2luY2x1ZGUgPGZhbS90ZXN0aW5nL09mZmxpbmVUZXN0UHJvY2Vzc29yLmg+CisKKyNpbmNsdWRlIDxmYW0vcXVldWUvRXhlY3V0aW9uUXVldWUuaD4KKworI2luY2x1ZGUgPGZhbS9yZWR1bmRhbmN5L1JlZHVuZGFuY3lGaWx0ZXIuaD4KKworI2luY2x1ZGUgPGZhbS9zZXJpYWxpemVyL0dyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyLmg+CisjaW5jbHVkZSA8ZmFtL3NlcmlhbGl6ZXIvR3JhcGhWaXpTdGF0ZW1hY2hpbmVTZXJpYWxpemVyLmg+CisKKyNpbmNsdWRlIDxmYW0vdHJhY2UvQXZtVHJhY2VHZW5lcmF0b3IuaD4KKworCisjaW5jbHVkZSA8c2V3L1N5bWJleENvbnRyb2xsZXJVbml0TWFuYWdlci5oPgorCisjaW5jbHVkZSA8dXRpbC9hdm1fc3RyaW5nLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBSRUdJU1RSWQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit0eXBlZGVmIHN0ZDo6bWFwPCBzdGQ6OnN0cmluZyAsCisJCUlQcm9jZXNzb3JVbml0UmVnaXN0cmF0aW9uICogPiBNYXBPZlByb2Nlc3NvckZhY3Rvcnk7CisKKwordm9pZCBQcm9jZXNzb3JVbml0UmVwb3NpdG9yeTo6dG9TdHJlYW1LZXlzKAorCQlPdXRTdHJlYW0gJiBvdXQsIGNvbnN0IHN0ZDo6c3RyaW5nICYgaGVhZGVyKQoreworCW91dCA8PCBUQUIgPDwgaGVhZGVyIDw8ICI8IGtleXM6ICIKKwkJPDwgZ2V0UmVwb3NpdG9yeSgpLnNpemUoKSA8PCAiID4geyIgPDwgRU9MOworCisJTWFwT2ZQcm9jZXNzb3JGYWN0b3J5Ojpjb25zdF9pdGVyYXRvciBpdFByb2MgPSBnZXRSZXBvc2l0b3J5KCkuYmVnaW4oKTsKKwlNYXBPZlByb2Nlc3NvckZhY3Rvcnk6OmNvbnN0X2l0ZXJhdG9yIGVuZFByb2MgPSBnZXRSZXBvc2l0b3J5KCkuZW5kKCk7CisJZm9yKCA7IGl0UHJvYyAhPSBlbmRQcm9jIDsgKytpdFByb2MgKQorCXsKKwkJb3V0IDw8IFRBQjIgPDwgKCppdFByb2MpLmZpcnN0IDw8IEVPTDsKKwl9CisJb3V0IDw8IFRBQiA8PCAifSIgPDwgRU9MX0ZMVVNIOworfQorCit2b2lkIFByb2Nlc3NvclVuaXRSZXBvc2l0b3J5Ojp0b1N0cmVhbUFsbCgKKwkJT3V0U3RyZWFtICYgb3V0LCBjb25zdCBzdGQ6OnN0cmluZyAmIGhlYWRlcikKK3sKKwlvdXQgPDwgVEFCIDw8IGhlYWRlciA8PCAiPCBrZXlzOiAiCisJCTw8IGdldFJlcG9zaXRvcnkoKS5zaXplKCkgPDwgIiA+IHsiIDw8IEVPTDsKKworCUxpc3Q8IElQcm9jZXNzb3JVbml0UmVnaXN0cmF0aW9uICogPiBhbHJlYWR5UHJpbnRlZDsKKworCU1hcE9mUHJvY2Vzc29yRmFjdG9yeTo6Y29uc3RfaXRlcmF0b3IgaXRQcm9jID0gZ2V0UmVwb3NpdG9yeSgpLmJlZ2luKCk7CisJTWFwT2ZQcm9jZXNzb3JGYWN0b3J5Ojpjb25zdF9pdGVyYXRvciBlbmRQcm9jID0gZ2V0UmVwb3NpdG9yeSgpLmVuZCgpOworCWZvciggOyBpdFByb2MgIT0gZW5kUHJvYyA7ICsraXRQcm9jICkKKwl7CisJCWlmKCBSRUdFWF9TVEFSVFMoICgqaXRQcm9jKS5zZWNvbmQtPmdldFR5cGVJRCgpICwKKwkJCQkiKHN5bWJleHxhdm06OnByb2Nlc3NvcikiICkgKQorCQl7CisJCQlpZiggbm90IGFscmVhZHlQcmludGVkLmNvbnRhaW5zKCAoKml0UHJvYykuc2Vjb25kICkgKQorCQkJeworCQkJCWFscmVhZHlQcmludGVkLmFwcGVuZCggKCppdFByb2MpLnNlY29uZCApOworCisJCQkJb3V0IDw8IFRBQjIgPDwgKCppdFByb2MpLnNlY29uZC0+Z2V0VHlwZUlEKCkgPDwgRU9MOworCQkJfQorCQl9CisJfQorCW91dCA8PCBUQUIgPDwgIn0iIDw8IEVPTF9GTFVTSDsKK30KKwordm9pZCBQcm9jZXNzb3JVbml0UmVwb3NpdG9yeTo6dG9TdHJlYW1FeHBvcnRlZCgKKwkJT3V0U3RyZWFtICYgb3V0LCBjb25zdCBzdGQ6OnN0cmluZyAmIGhlYWRlcikKK3sKKyNkZWZpbmUgUFJPQ0VTU09SX0ZBQ1RPUllfU0hPV19UWVBFX0lEKCBQcm9jZXNzb3IgKSAgXAorCW91dCA8PCBUQUIyIDw8IFByb2Nlc3Nvcjo6QVVUT19SRUdJU1RFUl9UT09MLmdldFR5cGVJRCgpIDw8IEVPTDsKKworCW91dCA8PCBUQUIxIDw8IGhlYWRlciA8PCAiPCBleHBvcnRlZCA+IHsiIDw8IEVPTDsKKworCVBST0NFU1NPUl9GQUNUT1JZX1NIT1dfVFlQRV9JRCggTWFpblByb2Nlc3NvclVuaXQgICAgICAgICkKKwlQUk9DRVNTT1JfRkFDVE9SWV9TSE9XX1RZUEVfSUQoIEV4ZWN1dGlvblF1ZXVlICAgICAgICAgICApCisJUFJPQ0VTU09SX0ZBQ1RPUllfU0hPV19UWVBFX0lEKCBSZWR1bmRhbmN5RmlsdGVyICAgICAgICAgKQorCVBST0NFU1NPUl9GQUNUT1JZX1NIT1dfVFlQRV9JRCggQXZtVHJhY2VHZW5lcmF0b3IgICAgICAgICkKKworCVBST0NFU1NPUl9GQUNUT1JZX1NIT1dfVFlQRV9JRCggQXZtRGVidWdQcm9jZXNzb3IgICAgICAgICkKKworCVBST0NFU1NPUl9GQUNUT1JZX1NIT1dfVFlQRV9JRCggQXZtQ292ZXJhZ2VQcm9jZXNzb3IgICAgICkKKwlQUk9DRVNTT1JfRkFDVE9SWV9TSE9XX1RZUEVfSUQoIEZvcm11bGFDb3ZlcmFnZUZpbHRlciAgICApCisJUFJPQ0VTU09SX0ZBQ1RPUllfU0hPV19UWVBFX0lEKCBUcmFuc2l0aW9uQ292ZXJhZ2VGaWx0ZXIgKQorCisJUFJPQ0VTU09SX0ZBQ1RPUllfU0hPV19UWVBFX0lEKCBBdm1IaXRPckp1bXBQcm9jZXNzb3IgICAgKQorCisJUFJPQ0VTU09SX0ZBQ1RPUllfU0hPV19UWVBFX0lEKCBPZmZsaW5lVGVzdFByb2Nlc3NvciAgICAgKQorCisJUFJPQ0VTU09SX0ZBQ1RPUllfU0hPV19UWVBFX0lEKCBFeHRlbmRlclByb2Nlc3NvclVuaXQgICAgKQorCisvLwlQUk9DRVNTT1JfRkFDVE9SWV9TSE9XX1RZUEVfSUQoIElucHV0T3V0cHV0RmlsdGVyICAgICAgICApCisvLworLy8JUFJPQ0VTU09SX0ZBQ1RPUllfU0hPV19UWVBFX0lEKCBHcmFwaFNsaWNlciAgICAgICAgICAgICAgKQorLy8KKy8vCVBST0NFU1NPUl9GQUNUT1JZX1NIT1dfVFlQRV9JRCggQXZtVHJhY2VEaXJlY3RvciAgICAgICAgICkKKworCVBST0NFU1NPUl9GQUNUT1JZX1NIT1dfVFlQRV9JRCggR3JhcGhWaXpFeGVjdXRpb25HcmFwaFNlcmlhbGl6ZXIgKQorCVBST0NFU1NPUl9GQUNUT1JZX1NIT1dfVFlQRV9JRCggR3JhcGhWaXpTdGF0ZW1hY2hpbmVTZXJpYWxpemVyICAgKQorCisJb3V0IDw8IFRBQjEgPDwgIn0iIDw8IEVPTF9GTFVTSDsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ1JFQVRJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0Fic3RyYWN0UHJvY2Vzc29yVW5pdCAqIFByb2Nlc3NvclVuaXRSZXBvc2l0b3J5OjpjcmVhdGUoCisJCVN5bWJleENvbnRyb2xsZXJVbml0TWFuYWdlciAmIGFNYW5hZ2VyLCBXT2JqZWN0ICogd2ZQcm9jZXNzT2JqZWN0KQoreworCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggbm90IGdldFJlcG9zaXRvcnkoKS5lbXB0eSgpICkKKwkJCTw8ICJVbmV4cGVjdGVkIGFuIGVtcHR5IHByb2Nlc3NvciB1bml0IHJlcG9zaXRvcnkgISEhIgorCQkJPDwgU0VORF9FWElUOworCisJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggd2ZQcm9jZXNzT2JqZWN0ICkKKwkJCSJwcm9jZXNzb3IgdW5pdCBwYXJhbWV0ZXIgV09iamVjdCAhISEiCisJCQk8PCBTRU5EX0VYSVQ7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgQ09ORklHVVJJTkcgKQorCUFWTV9PU19DT1VUIDw8ICJQcm9jZXNzb3IgVHlwZTo+ICIKKwkJCTw8IHdmUHJvY2Vzc09iamVjdC0+Z2V0UXVhbGlmaWVkVHlwZU5hbWVJRCgpIDw8IEVPTF9GTFVTSDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgQ09ORklHVVJJTkcgKQorCisKKwlJUHJvY2Vzc29yVW5pdFJlZ2lzdHJhdGlvbiAqIGFQcm9jZXNzb3JGYWN0b3J5ID0gUHJvY2Vzc29yVW5pdFJlcG9zaXRvcnk6OgorCQkJZ2V0UHJvY2Vzc29yRmFjdG9yeSggd2ZQcm9jZXNzT2JqZWN0LT5nZXRRdWFsaWZpZWRUeXBlTmFtZUlEKCkgKTsKKworCWlmKCBhUHJvY2Vzc29yRmFjdG9yeSAhPSBOVUxMICkKKwl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIENPTkZJR1VSSU5HICkKKwlBVk1fT1NfQ09VVCA8PCAiICAgID09PiBmb3VuZCA6PiAiCisJCQk8PCBhUHJvY2Vzc29yRmFjdG9yeS0+Z2V0VHlwZUlEKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBDT05GSUdVUklORyApCisKKwkJLy8gQ2FzZSBvZiBNYWluIHByb2Nlc3NvciBGYWN0b3J5CisJCWlmKCAmKE1haW5Qcm9jZXNzb3JVbml0OjpBVVRPX1JFR0lTVEVSX1RPT0wpID09IGFQcm9jZXNzb3JGYWN0b3J5ICkKKwkJeworCQkJaWYoIGFNYW5hZ2VyLmdldE1haW5Qcm9jZXNzb3IoKS5oYXNQYXJhbWV0ZXJXT2JqZWN0KCkgKQorCQkJeworCQkJCXJldHVybiggbmV3IE1haW5Qcm9jZXNzb3JVbml0KGFNYW5hZ2VyLCB3ZlByb2Nlc3NPYmplY3QpICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJYU1hbmFnZXIuZ2V0TWFpblByb2Nlc3NvcigpLgorCQkJCQkJc2V0UGFyYW1ldGVyV09iamVjdCh3ZlByb2Nlc3NPYmplY3QpOworCisJCQkJcmV0dXJuKCAmKCBhTWFuYWdlci5nZXRNYWluUHJvY2Vzc29yKCkgKSApOworCQkJfQorCQl9CisJCWVsc2UgaWYoICYoRXhlY3V0aW9uUXVldWU6OkFVVE9fUkVHSVNURVJfVE9PTCkgPT0gYVByb2Nlc3NvckZhY3RvcnkgKQorCQl7CisJCQlpZiggbm90IGFNYW5hZ2VyLmdldEV4ZWN1dGlvblF1ZXVlKCkuaGFzUGFyYW1ldGVyV09iamVjdCgpICkKKwkJCXsKKwkJCQlhTWFuYWdlci5nZXRFeGVjdXRpb25RdWV1ZSgpLgorCQkJCQkJc2V0UGFyYW1ldGVyV09iamVjdCh3ZlByb2Nlc3NPYmplY3QpOworCQkJfQorCisJCQlyZXR1cm4oICYoIGFNYW5hZ2VyLmdldEV4ZWN1dGlvblF1ZXVlKCkgKSApOworCQl9CisJCWVsc2UgaWYoICYoUmVkdW5kYW5jeUZpbHRlcjo6QVVUT19SRUdJU1RFUl9UT09MKSA9PSBhUHJvY2Vzc29yRmFjdG9yeSApCisJCXsKKwkJCWlmKCBub3QgYU1hbmFnZXIuZ2V0UmVkdW5kYW5jeVByb2Nlc3NvcigpLmhhc1BhcmFtZXRlcldPYmplY3QoKSApCisJCQl7CisJCQkJYU1hbmFnZXIuZ2V0UmVkdW5kYW5jeVByb2Nlc3NvcigpLgorCQkJCQkJc2V0UGFyYW1ldGVyV09iamVjdCh3ZlByb2Nlc3NPYmplY3QpOworCQkJfQorCisJCQlyZXR1cm4oICYoIGFNYW5hZ2VyLmdldEV4ZWN1dGlvblF1ZXVlKCkgKSApOworCQl9CisKKworLy8JCWVsc2UgaWYoICYoQXZtRGVidWdQcm9jZXNzb3I6OkFVVE9fUkVHSVNURVJfVE9PTCkgPT0gYVByb2Nlc3NvckZhY3RvcnkgKQorLy8JCXsKKy8vCQkJaWYoIGFNYW5hZ2VyLmdldERlYnVnUHJvY2Vzc29yKCkuaGFzUGFyYW1ldGVyV09iamVjdCgpICkKKy8vCQkJeworLy8JCQkJcmV0dXJuKCBuZXcgQXZtRGVidWdQcm9jZXNzb3IoYU1hbmFnZXIsIHdmUHJvY2Vzc09iamVjdCkgKTsKKy8vCQkJfQorLy8JCQllbHNlCisvLwkJCXsKKy8vCQkJCWFNYW5hZ2VyLmdldERlYnVnUHJvY2Vzc29yKCkuc2V0UGFyYW1ldGVyV09iamVjdCh3ZlByb2Nlc3NPYmplY3QpOworLy8KKy8vCQkJCXJldHVybiggJiggYU1hbmFnZXIuZ2V0RGVidWdQcm9jZXNzb3IoKSApICk7CisvLwkJCX0KKy8vCQl9CisKKworCQlyZXR1cm4oIGFQcm9jZXNzb3JGYWN0b3J5LT5uZXdJbnN0YW5jZSggYU1hbmFnZXIgLCB3ZlByb2Nlc3NPYmplY3QgKSApOworCX0KKwllbHNlCisJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBDT05GSUdVUklORyApCisJQVZNX09TX0NPVVQgPDwgIiAgICA9PT4gVW5mb3VuZCBpbiBSZXBwc2l0b3J5IG9mICIKKwkJPDwgZ2V0UmVwb3NpdG9yeSgpLnNpemUoKSA8PCAiIGVsZW1lbnRzIiA8PCBzdGQ6OmVuZGw7CisJdG9TdHJlYW1LZXlzKEFWTV9PU19DT1VUKTsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgQ09ORklHVVJJTkcgKQorCX0KKworCXJldHVybiggTlVMTCApOworfQorCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2FwaS9Qcm9jZXNzb3JVbml0UmVwb3NpdG9yeS5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2FwaS9Qcm9jZXNzb3JVbml0UmVwb3NpdG9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NTE5OWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vYXBpL1Byb2Nlc3NvclVuaXRSZXBvc2l0b3J5LmgKQEAgLTAsMCArMSw5MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDQgZMOpYy4gMjAxNAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFBST0NFU1NPUlVOSVRSRVBPU0lUT1JZX0hfCisjZGVmaW5lIFBST0NFU1NPUlVOSVRSRVBPU0lUT1JZX0hfCisKKyNpbmNsdWRlIDxtYXA+CisKKyNpbmNsdWRlIDxjb21tb24vQkYuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworY2xhc3MgQWJzdHJhY3RQcm9jZXNzb3JVbml0OworY2xhc3MgT3V0U3RyZWFtOworCitjbGFzcyBJUHJvY2Vzc29yVW5pdFJlZ2lzdHJhdGlvbjsKKworY2xhc3MgU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyOworCitjbGFzcyBXT2JqZWN0OworCitjbGFzcyBQcm9jZXNzb3JVbml0UmVwb3NpdG9yeQoreworCisKK3B1YmxpYzoKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBSRUdJU1RSWQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXR5cGVkZWYgc3RkOjptYXA8IHN0ZDo6c3RyaW5nICwKKwkJCQkJSVByb2Nlc3NvclVuaXRSZWdpc3RyYXRpb24gKiA+ICBNYXBPZlByb2Nlc3NvckZhY3Rvcnk7CisKKwlpbmxpbmUgc3RhdGljIE1hcE9mUHJvY2Vzc29yRmFjdG9yeSAmIGdldFJlcG9zaXRvcnkoKQorCXsKKwkJc3RhdGljIE1hcE9mUHJvY2Vzc29yRmFjdG9yeSBtUHJvY2Vzc29yUmVwb3NpdG9yeTsKKworCQlyZXR1cm4oIG1Qcm9jZXNzb3JSZXBvc2l0b3J5ICk7CisJfQorCisKKwlpbmxpbmUgc3RhdGljIHZvaWQgcmVnaXN0ZXJQcm9jZXNzb3JGYWN0b3J5KGNvbnN0IHN0ZDo6c3RyaW5nICYgYVR5cGVVRkksCisJCQlJUHJvY2Vzc29yVW5pdFJlZ2lzdHJhdGlvbiAqIGFQcm9jZXNzb3JSZWdpc3RyYXRpb24pCisJeworCQlnZXRSZXBvc2l0b3J5KClbIGFUeXBlVUZJIF0gPSBhUHJvY2Vzc29yUmVnaXN0cmF0aW9uOworCX0KKworCWlubGluZSBzdGF0aWMgSVByb2Nlc3NvclVuaXRSZWdpc3RyYXRpb24gKiBnZXRQcm9jZXNzb3JGYWN0b3J5KAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhVHlwZUlEKQorCXsKKwkJcmV0dXJuKCBnZXRSZXBvc2l0b3J5KClbIGFUeXBlSUQgXSApOworCX0KKworCXN0YXRpYyB2b2lkIHRvU3RyZWFtS2V5cyhPdXRTdHJlYW0gJiBvdXQsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGhlYWRlciA9ICJwcm9jZXNzb3JzIik7CisKKwlzdGF0aWMgdm9pZCB0b1N0cmVhbUFsbChPdXRTdHJlYW0gJiBvdXQsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGhlYWRlciA9ICJwcm9jZXNzb3JzIik7CisKKwlzdGF0aWMgdm9pZCB0b1N0cmVhbUV4cG9ydGVkKE91dFN0cmVhbSAmIG91dCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgaGVhZGVyID0gImV4cG9ydCBwcm9jZXNzb3JzIik7CisKKworCisJLyoqCisJICogQ1JFQVRJT04KKwkgKi8KKwlzdGF0aWMgQWJzdHJhY3RQcm9jZXNzb3JVbml0ICogY3JlYXRlKAorCQkJU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyICYgYU1hbmFnZXIsIFdPYmplY3QgKiB3ZlByb2Nlc3NPYmplY3QpOworCit9OworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworCisjZW5kaWYgLyogUFJPQ0VTU09SVU5JVFJFUE9TSVRPUllfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9jb3ZlcmFnZS9Bdm1Db3ZlcmFnZUFic3RyYWN0Vmlldy5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vY292ZXJhZ2UvQXZtQ292ZXJhZ2VBYnN0cmFjdFZpZXcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYWJmODkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vY292ZXJhZ2UvQXZtQ292ZXJhZ2VBYnN0cmFjdFZpZXcuY3BwCkBAIC0wLDAgKzEsNDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxOSBub3YuIDIwMTQKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkF2bUNvdmVyYWdlQWJzdHJhY3RWaWV3LmgiCisKKyNpbmNsdWRlICJBdm1Db3ZlcmFnZVByb2Nlc3Nvci5oIgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvKioKKyAqIENPTlNUUlVDVE9SCisgKiBEZWZhdWx0CisgKi8KK0F2bUNvdmVyYWdlQWJzdHJhY3RWaWV3OjpBdm1Db3ZlcmFnZUFic3RyYWN0VmlldygKKwkJQXZtQ292ZXJhZ2VQcm9jZXNzb3IgJiBhQ292ZXJhZ2VQcm9jZXNzb3IsIFdPYmplY3QgKiB3ZlBhcmFtZXRlck9iamVjdCkKKzogUnVubmFibGVFbGVtZW50KCBDTEFTU19LSU5EX1QoIEF2bUNvdmVyYWdlQWJzdHJhY3RWaWV3ICksIHdmUGFyYW1ldGVyT2JqZWN0ICksCitJSGV1cmlzdGljQ29udGV4dFdlaWdodCggKSwKKworbUNvdmVyYWdlUHJvY2Vzc29yKCBhQ292ZXJhZ2VQcm9jZXNzb3IgKSwKK21Db3ZlcmFnZVN0YXRpc3RpY3MoIGFDb3ZlcmFnZVByb2Nlc3Nvci5nZXRDb3ZlcmFnZVN0YXRpc3RpY3MoKSApLAorbUhldXJpc3RpY1Byb3BlcnR5KCBhQ292ZXJhZ2VQcm9jZXNzb3IubUhldXJpc3RpY1Byb3BlcnR5ICksCisKKy8vIENvbXB1dGluZyBkcml2ZSB2YXJpYWJsZQoraXRRdWV1ZSggKSwKK2VuZFF1ZXVlKCApLAorCitpdEVDKCApLAorZW5kRUMoICkKK3sKKwkvLyEhIE5PVEhJTkcKK30KKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9jb3ZlcmFnZS9Bdm1Db3ZlcmFnZUFic3RyYWN0Vmlldy5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2NvdmVyYWdlL0F2bUNvdmVyYWdlQWJzdHJhY3RWaWV3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQyZGFjZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9jb3ZlcmFnZS9Bdm1Db3ZlcmFnZUFic3RyYWN0Vmlldy5oCkBAIC0wLDAgKzEsMTUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTkgbm92LiAyMDE0CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQVZNQ09WRVJBR0VBQlNUUkFDVFZJRVdfSF8KKyNkZWZpbmUgQVZNQ09WRVJBR0VBQlNUUkFDVFZJRVdfSF8KKworI2luY2x1ZGUgPGNvbW1vbi9SdW5uYWJsZUVsZW1lbnQuaD4KKyNpbmNsdWRlIDxmYW0vY292ZXJhZ2UvQXZtQ292ZXJhZ2VIZXVyaXN0aWNQcm9wZXJ0eS5oPgorCisjaW5jbHVkZSA8Y29sbGVjdGlvbi9UeXBlZGVmLmg+CisKKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25Db250ZXh0Lmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBBdm1Db3ZlcmFnZVByb2Nlc3NvcjsKK2NsYXNzIE91dFN0cmVhbTsKKworY2xhc3MgQXZtQ292ZXJhZ2VTdGF0aXN0aWNzOworCitjbGFzcyBFeGVjdXRpb25Db250ZXh0OworCisKK2NsYXNzIEF2bUNvdmVyYWdlQWJzdHJhY3RWaWV3ICA6CisJCXB1YmxpYyBSdW5uYWJsZUVsZW1lbnQsCisJCXB1YmxpYyBJSGV1cmlzdGljQ29udGV4dFdlaWdodAoreworCisJLyoqCisJICogQVRUUklCVVRFUworCSAqLworcHJvdGVjdGVkOgorCUF2bUNvdmVyYWdlUHJvY2Vzc29yICYgbUNvdmVyYWdlUHJvY2Vzc29yOworCisJQXZtQ292ZXJhZ2VTdGF0aXN0aWNzICYgbUNvdmVyYWdlU3RhdGlzdGljczsKKworCUF2bUNvdmVyYWdlSGV1cmlzdGljUHJvcGVydHkgJiBtSGV1cmlzdGljUHJvcGVydHk7CisKKwkvLyBDb21wdXRpbmcgZHJpdmUgdmFyaWFibGUKKwlMaXN0T2ZFeGVjdXRpb25Db250ZXh0OjppdGVyYXRvciBpdFF1ZXVlOworCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQ6Oml0ZXJhdG9yIGVuZFF1ZXVlOworCisJRXhlY3V0aW9uQ29udGV4dDo6Y2hpbGRfaXRlcmF0b3IgaXRFQzsKKwlFeGVjdXRpb25Db250ZXh0OjpjaGlsZF9pdGVyYXRvciBlbmRFQzsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQXZtQ292ZXJhZ2VBYnN0cmFjdFZpZXcoCisJCQlBdm1Db3ZlcmFnZVByb2Nlc3NvciAmIGFDb3ZlcmFnZVByb2Nlc3NvciwgV09iamVjdCAqIHdmUGFyYW1ldGVyT2JqZWN0KTsKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5Bdm1Db3ZlcmFnZUFic3RyYWN0VmlldygpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQ09WRVJBR0UgUFJPQ0VTU09SIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQ09ORklHVVJFIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlubGluZSB2aXJ0dWFsIGJvb2wgY29uZmlndXJlKCkKKwl7CisJCS8vIElOSVRJQUxJWkFUSU9OCisJCW1Db25maWdGbGFnID0gUnVubmFibGVFbGVtZW50Ojpjb25maWd1cmUoKTsKKworCQkvLyBzdGFuZGFyZCBwcm9jZXNzb3IvdmlldyB1c2VyIGNvbmZpZ3VyYXRpb24KKwkJbUNvbmZpZ0ZsYWcgPSBjb25maWd1cmVJbXBsKCkgJiYgbUNvbmZpZ0ZsYWc7CisKKwkJcmV0dXJuKCBtQ29uZmlnRmxhZyApOworCX0KKworCXZpcnR1YWwgYm9vbCBjb25maWd1cmVJbXBsKCkgPSAwOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gSU5JVCAvIEVYSVQgIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXZpcnR1YWwgYm9vbCBpbml0SW1wbCgpCisJeworCQkvLyEhIE5PVEhJTkcKKwkJcmV0dXJuIHRydWU7CisJfQorCisJdmlydHVhbCBib29sIGV4aXRJbXBsKCkKKwl7CisJCS8vISEgTk9USElORworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCS8vIFJFUE9SVCBBUEkKKy8vCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCXZpcnR1YWwgdm9pZCByZXBvcnREZWZhdWx0KE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKy8vCisvLworLy8JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8JLy8gUFJPQ0VTU09SIFBST0NFU1NJTkcgQVBJCisvLwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLwl2aXJ0dWFsIGJvb2wgcHJlcHJvY2Vzc2luZygpOworLy8KKy8vCXZpcnR1YWwgYm9vbCBwb3N0cHJvY2Vzc2luZygpOworLy8KKy8vCisvLwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLwkvLyBQUk9DRVNTT1IgRklMVEVSSU5HIEFQSQorLy8JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8JdmlydHVhbCBib29sIHByZWZpbHRlcmluZyhMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgZWNRdWV1ZSk7CisvLworLy8JdmlydHVhbCBib29sIHBvc3RmaWx0ZXJpbmcoTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGVjUXVldWUpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gU0VSSUFMSVpBVElPTiBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJdmlydHVhbCB2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCit9OworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qIEFWTUNPVkVSQUdFQUJTVFJBQ1RWSUVXX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vY292ZXJhZ2UvQXZtQ292ZXJhZ2VEaXJlY3RpdmVUcmFjZUJ1aWxkZXIuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2NvdmVyYWdlL0F2bUNvdmVyYWdlRGlyZWN0aXZlVHJhY2VCdWlsZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDQxMjAwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2NvdmVyYWdlL0F2bUNvdmVyYWdlRGlyZWN0aXZlVHJhY2VCdWlsZGVyLmNwcApAQCAtMCwwICsxLDExMjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxNyBqYW52LiAyMDE1CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJBdm1Db3ZlcmFnZURpcmVjdGl2ZVRyYWNlQnVpbGRlci5oIgorCisjaW5jbHVkZSA8Y29tcHV0ZXIvcHJpbWl0aXZlL0F2bUNvbW11bmljYXRpb25GYWN0b3J5Lmg+CisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9Bdm1UcmFuc2l0aW9uLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9TdGF0ZW1lbnRUeXBlQ2hlY2tlci5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uQ29udGV4dC5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkRhdGEuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lRm9ybS5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL1J1bnRpbWVJRC5oPgorCisjaW5jbHVkZSA8ZmFtL2NvdmVyYWdlL0F2bUNvdmVyYWdlVHJhbnNpdGlvblZpZXcuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9NZXNzYWdlLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorICogVXRpbHMgZm9yIFRyYWNlU2VxdWVuY2UKKyAqLwordm9pZCBBdm1UcmFjZVByb3BlcnR5OjpjaGVja0RlY3JlbWVudGF0aW9uKEF2bVRyYW5zaXRpb24gKiBhVHJhbnNpdGlvbikKK3sKKwlpZiggKG1UcmFuc2l0aW9uQ292ZXJhZ2UgIT0gTlVMTCkgJiYKKwkJKG5vdCBtVHJhbnNpdGlvbkNvdmVyYWdlLT50ZXN0VHJhbnNpdGlvbkNvdmVyYWdlKGFUcmFuc2l0aW9uKSkgKQorCXsKKwkJLS1tVW5jb3ZlcmVkQ291bnQ7CisJfQorCisJaWYoIGFUcmFuc2l0aW9uLT5oYXNTdGF0ZW1lbnRHdWFyZEZhbWlseSgpICkKKwl7CisJCS0tbUd1YXJkQ291bnQ7CisJfQorCWVsc2UgaWYoIGFUcmFuc2l0aW9uLT5pc1VuY29uZGl0aW9uYWxTdGF0ZW1lbnRGYW1pbHkoKSApCisJeworCQktLW1VbmNvbmRpdGlvbmFsQ291bnQ7CisJfQorCisJaWYoIGFUcmFuc2l0aW9uLT5pc1Vuc3RhYmxlU291cmNlKCkgKQorCXsKKwkJLS1tVW5zdGFibGVDb3VudDsKKwl9Cit9CisKK3ZvaWQgQXZtVHJhY2VQcm9wZXJ0eTo6Y2hlY2tJbmNyZW1lbnRhdGlvbihBdm1UcmFuc2l0aW9uICogYVRyYW5zaXRpb24pCit7CisJaWYoIChtVHJhbnNpdGlvbkNvdmVyYWdlICE9IE5VTEwpICYmCisJCShub3QgbVRyYW5zaXRpb25Db3ZlcmFnZS0+dGVzdFRyYW5zaXRpb25Db3ZlcmFnZShhVHJhbnNpdGlvbikpICkKKwl7CisJCSsrbVVuY292ZXJlZENvdW50OworCX0KKworCWlmKCBhVHJhbnNpdGlvbi0+aGFzU3RhdGVtZW50R3VhcmRGYW1pbHkoKSApCisJeworCQkrK21HdWFyZENvdW50OworCX0KKwllbHNlIGlmKCBhVHJhbnNpdGlvbi0+aXNVbmNvbmRpdGlvbmFsU3RhdGVtZW50RmFtaWx5KCkgKQorCXsKKwkJKyttVW5jb25kaXRpb25hbENvdW50OworCX0KKworCWlmKCBhVHJhbnNpdGlvbi0+aXNVbnN0YWJsZVNvdXJjZSgpICkKKwl7CisJCSsrbVVuc3RhYmxlQ291bnQ7CisJfQorfQorCisKK3ZvaWQgQXZtVHJhY2VQcm9wZXJ0eTo6dXBkYWRlU2l6ZSgpCit7CisJbVNpemUgPSAwOworCW1VbmNvdmVyZWRDb3VudCA9IDA7CisJbUd1YXJkQ291bnQgPSAwOworCW1VbmNvbmRpdGlvbmFsQ291bnQgPSAwOworCW1VbnN0YWJsZUNvdW50ID0gMDsKKworCUJGTGlzdDo6Y29uc3RfaXRlcmF0b3IgaXRQb2ludCA9IHBvaW50cy5iZWdpbigpOworCUJGTGlzdDo6Y29uc3RfaXRlcmF0b3IgZW5kUG9pbnQgPSBwb2ludHMuZW5kKCk7CisJZm9yKCA7IGl0UG9pbnQgIT0gZW5kUG9pbnQgOyArK2l0UG9pbnQgKQorCXsKKwkJKyttU2l6ZTsKKworCQljaGVja0luY3JlbWVudGF0aW9uKCAoKml0UG9pbnQpLnRvX3B0cjwgVHJhY2VQb2ludCA+KCktPgorCQkJCW9iamVjdC0+YXM8IEF2bVRyYW5zaXRpb24gPigpICk7CisJfQorfQorCisKK2Jvb2wgQXZtVHJhY2VQcm9wZXJ0eTo6Y29tcGFyZSggYm9vbCAoKiBpc0NvbXApKGF2bV9zaXplX3QsIGF2bV9zaXplX3QpLAorCQljb25zdCBBdm1UcmFjZVByb3BlcnR5ICYgYVRyYWNlRWxlbWVudCApCit7CisJcmV0dXJuKCBpc0NvbXAoeFNpemUoKSwgYVRyYWNlRWxlbWVudC54U2l6ZSgpKSApOworfQorCisKKy8qKgorICogU2VyaWFsaXphdGlvbgorICovCit2b2lkIEF2bVRyYWNlUHJvcGVydHk6OnRvU3RyZWFtKE91dFN0cmVhbSAmIG9zLCBib29sIHZlcmJvc2UpIGNvbnN0Cit7CisJb3MgPDwgVEFCIDw8ICJ0cmFjZSMiIDw8IHRpZAorCQkJPDwgIjx4c2l6ZToiIDw8IHhTaXplKCkgPDwgIiwgc2l6ZToiIDw8IG1TaXplCisJCQk8PCAiLCB1bmNvdmVyZWQ6IiA8PCBtVW5jb3ZlcmVkQ291bnQKKwkJCTw8ICIsIGd1YXJkOiIgPDwgbUd1YXJkQ291bnQKKwkJCTw8ICIsIHVuY29uZGlvbmFsOiIgPDwgbVVuY29uZGl0aW9uYWxDb3VudAorCQkJPDwgIiwgdW5zdGFibGU6IiA8PCBtVW5zdGFibGVDb3VudCA8PCAiPiI7CisJaWYoIG1FQyAhPSBOVUxMICkKKwl7CisJCWlmKCB2ZXJib3NlICkKKwkJeworCQkJb3MgPDwgRU9MX1RBQiA8PCBBVk1fU1RSX0lOREVOVDsKKwkJCW1FQy0+dHJhY2VNaW5pbXVtKG9zKTsKKwkJCW9zIDw8IEVORF9JTkRFTlQ7CisJCX0KKwkJZWxzZQorCQl7CisJCQlvcyA8PCAiKCBjdHg6IiA8PCBtRUMtPmdldElkTnVtYmVyKCkgPDwgIiApIjsKKwkJfQorCX0KKwlpZiggcG9pbnRzLm5vbmVtcHR5KCkgKQorCXsKKwkJb3MgPDwgIiAtLT4gIiA8PCBiYWNrVHJhbnNpdGlvbigpLT5nZXROYW1lSUQoKTsKKwl9CisJb3MgPDwgIiB7ICIgPDwgY29tYmluYXRvci0+c3RyT3AoKSA8PCBFT0w7CisKKwlpZiggdmVyYm9zZSAgKQorCXsKKwkJb3MgPDwgSU5DUl9JTkRFTlQ7CisJCUJGTGlzdDo6Y29uc3RfaXRlcmF0b3IgaXRQb2ludCA9IHBvaW50cy5iZWdpbigpOworCQlCRkxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGVuZFBvaW50ID0gcG9pbnRzLmVuZCgpOworCQlmb3IoIEF2bVRyYW5zaXRpb24gKiBhVHJhbnNpdGlvbiA9IE5VTEwgOyBpdFBvaW50ICE9IGVuZFBvaW50IDsgKytpdFBvaW50ICkKKwkJeworCQkJYVRyYW5zaXRpb24gPSAoKml0UG9pbnQpLnRvX3B0cjwgVHJhY2VQb2ludCA+KCktPgorCQkJCQlvYmplY3QtPmFzPCBBdm1UcmFuc2l0aW9uID4oKTsKKworCQkJKCppdFBvaW50KS50b1N0cmVhbShvcyk7CisKKwkJCW9zIDw8IFRBQjIgPDwgIlx0XHRcdC0tPiAiIDw8IGFUcmFuc2l0aW9uLT5zdHJUYXJnZXRJZCgpOworCQkJb3MgPDwgIiBcdD09PiAiIDw8IGFUcmFuc2l0aW9uLT5zdHJTdGF0ZW1lbnRGYW1pbHkoKSA8PCBFT0w7CisJCQlpZiAoIGFUcmFuc2l0aW9uLT5oYXNJbnRlcm5hbENvbW11bmljYXRpb25Db2RlKCkgKQorCQkJeworCQkJCW9zIDw8IFRBQjIgPDwgIlx0XHRcdCI7CisJCQkJQmFzZUNvbXBpbGVkRm9ybTo6dG9TdHJlYW1TdGF0aWNDb20ob3MsCisJCQkJCQlhVHJhbnNpdGlvbi0+Z2V0SW50ZXJuYWxDb21tdW5pY2F0aW9uQ29kZSgpICk7CisJCQl9CisJCX0KKwkJb3MgPDwgREVDUl9JTkRFTlQ7CisJfQorCWVsc2UKKwl7CisJCW9zIDw8IElOQ1JfSU5ERU5UIDw8IHBvaW50cyA8PCBERUNSX0lOREVOVDsKKwl9CisKKwlvcyA8PCBUQUIgPDwgIn0iIDw8IEVPTF9GTFVTSDsKK30KKworCisvKioKKyAqIENPTlNUUlVDVE9SCisgKiBEZWZhdWx0CisgKi8KK0F2bUNvdmVyYWdlRGlyZWN0aXZlVHJhY2VCdWlsZGVyOjpBdm1Db3ZlcmFnZURpcmVjdGl2ZVRyYWNlQnVpbGRlcigKKwkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMsIFRyYWNlUG9pbnQgKiB0cFRyYW5zaXRpb24sCisJCUVOVU1fSEVVUklTVElDX0NMQVNTIGFuSGV1cmlzdGljQ2xhc3MsCisJCWF2bV9zaXplX3QgcGF0aENvdW50TGltaXQsIGF2bV9zaXplX3QgcGF0aFNpemVMaW1pdCkKKzogSUhldXJpc3RpY0NsYXNzKCBhbkhldXJpc3RpY0NsYXNzICksCisKK21FQyggYW5FQyApLAorbUVEKCBhbkVDLT5nZXRBUEV4ZWN1dGlvbkRhdGEoKSApLAorbVJJRCggdHBUcmFuc2l0aW9uLT5SSUQgKSwKKworbVRyYW5zaXRpb24oIHRwVHJhbnNpdGlvbi0+b2JqZWN0LT50bzwgQXZtVHJhbnNpdGlvbiA+KCkgKSwKK21UcmFuc2l0aW9uUG9pbnQoIHRwVHJhbnNpdGlvbiApLAorCittVHJhY2VFbGVtZW50KCApLAorCittQ29tcHV0aW5nUGF0aENvdW50TGltaXQoIHBhdGhDb3VudExpbWl0ICksCittQ29tcHV0aW5nUGF0aFNpemVMaW1pdCggcGF0aFNpemVMaW1pdCApLAorCittR29hbEFjaGlldmVkRmxhZyggZmFsc2UgKSwKKworLy9tVHJhbnNpdGlvblBhdGgoICksCisvL21FeHBlY3RlZElucHV0KCApLAorbVZpcnR1YWxCdWZmZXIobVRyYW5zaXRpb24sIE5VTEwsIDAsIFRZUEVfTVVMVElfTElGT19TUEVDSUZJRVIsIC0xKSwKK21FbWl0T3V0cHV0KCAmIG1WaXJ0dWFsQnVmZmVyICksCisKK21UYWJsZU9mUnVudGltZVN0YXR1cyggKiggbUVELT5nZXRSdW50aW1lRm9ybVN0YXRlVGFibGUoKSApICksCisKKy8vIGNvbXB1dGluZyB2YXJpYWJsZSBmb3IgbWV0aG9kIDw8IGNvbXB1dGVQYXRoVG9UcmFuc2l0aW9uID4+CithbnlUcmFuc2l0aW9uUGF0aHMoICksCitwcmVmaXhMb29wVHJhbnNpdGlvblBhdGhzKCApLAorCitvdXRnb2luZ1RyYW5zaXRpb25zKCApLAorYVRyYW5zaXRpb25QYXRoKCApLAoraXRUcmFucyggKSwKK2VuZFRyYW5zKCApLAorCit0Z3RJbnN0YW5jZSggTlVMTCApLAorZndkTWFjaGluZSggTlVMTCApLAordGd0TWFjaGluZSggTlVMTCApCit7CisJLy8hISBOT1RISU5HCit9CisKK0F2bUNvdmVyYWdlRGlyZWN0aXZlVHJhY2VCdWlsZGVyOjpBdm1Db3ZlcmFnZURpcmVjdGl2ZVRyYWNlQnVpbGRlcigKKwkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsCisJCUF2bVRyYW5zaXRpb24gKiBhVHJhbnNpdGlvbiwgRU5VTV9IRVVSSVNUSUNfQ0xBU1MgYW5IZXVyaXN0aWNDbGFzcywKKwkJYXZtX3NpemVfdCBwYXRoQ291bnRMaW1pdCwgYXZtX3NpemVfdCBwYXRoU2l6ZUxpbWl0KQorOiBJSGV1cmlzdGljQ2xhc3MoIGFuSGV1cmlzdGljQ2xhc3MgKSwKKworbUVDKCBhbkVDICksCittRUQoIGFuRUMtPmdldEFQRXhlY3V0aW9uRGF0YSgpICksCittUklEKCBhUklEICksCisKK21UcmFuc2l0aW9uKCBhVHJhbnNpdGlvbiApLAorbVRyYW5zaXRpb25Qb2ludCggTlVMTCApLAorCittVHJhY2VFbGVtZW50KCApLAorCittQ29tcHV0aW5nUGF0aENvdW50TGltaXQoIHBhdGhDb3VudExpbWl0ICksCittQ29tcHV0aW5nUGF0aFNpemVMaW1pdCggcGF0aFNpemVMaW1pdCApLAorCittR29hbEFjaGlldmVkRmxhZyggZmFsc2UgKSwKKworLy9tVHJhbnNpdGlvblBhdGgoICksCisvL21FeHBlY3RlZElucHV0KCApLAorbVZpcnR1YWxCdWZmZXIobVRyYW5zaXRpb24sIE5VTEwsIDAsIFRZUEVfTVVMVElfTElGT19TUEVDSUZJRVIsIC0xKSwKK21FbWl0T3V0cHV0KCAmIG1WaXJ0dWFsQnVmZmVyICksCisKK21UYWJsZU9mUnVudGltZVN0YXR1cyggKiggbUVELT5nZXRSdW50aW1lRm9ybVN0YXRlVGFibGUoKSApICksCisKKy8vIGNvbXB1dGluZyB2YXJpYWJsZSBmb3IgbWV0aG9kIDw8IGNvbXB1dGVQYXRoVG9UcmFuc2l0aW9uID4+CithbnlUcmFuc2l0aW9uUGF0aHMoICksCitwcmVmaXhMb29wVHJhbnNpdGlvblBhdGhzKCApLAorCitvdXRnb2luZ1RyYW5zaXRpb25zKCApLAorYVRyYW5zaXRpb25QYXRoKCApLAoraXRUcmFucyggKSwKK2VuZFRyYW5zKCApLAorCit0Z3RJbnN0YW5jZSggTlVMTCApLAorZndkTWFjaGluZSggTlVMTCApLAordGd0TWFjaGluZSggTlVMTCApCit7CisJLy8hISBOT1RISU5HCit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbmZpZ3VyZQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBBdm1Db3ZlcmFnZURpcmVjdGl2ZVRyYWNlQnVpbGRlcjo6Y29uZmlndXJlKAorCQlBdm1UcmFjZVByb3BlcnR5ICYgYVRyYWNlRWxlbWVudCwgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMsCisJCVRyYWNlUG9pbnQgKiB0cFRyYW5zaXRpb24sIEVOVU1fSEVVUklTVElDX0NMQVNTIGFuSGV1cmlzdGljQ2xhc3MsCisJCWF2bV9zaXplX3QgcGF0aENvdW50TGltaXQsIGF2bV9zaXplX3QgcGF0aFNpemVMaW1pdCkKK3sKKwltRUMgPSAgYW5FQywKKwltRUQgPSBhbkVDLT5nZXRBUEV4ZWN1dGlvbkRhdGEoKTsKKworCW1SSUQgPSB0cFRyYW5zaXRpb24tPlJJRDsKKwltVHJhbnNpdGlvbiA9IHRwVHJhbnNpdGlvbi0+b2JqZWN0LT50bzwgQXZtVHJhbnNpdGlvbiA+KCk7CisKKwltVHJhbnNpdGlvblBvaW50ID0gdHBUcmFuc2l0aW9uOworCisJbVRyYWNlRWxlbWVudC5jb25maWd1cmUoIGFUcmFjZUVsZW1lbnQgKTsKKworCW1IZXVyaXN0aWNDbGFzcyA9IGFuSGV1cmlzdGljQ2xhc3M7CisKKwltQ29tcHV0aW5nUGF0aENvdW50TGltaXQgPSBwYXRoQ291bnRMaW1pdDsKKwltQ29tcHV0aW5nUGF0aFNpemVMaW1pdCAgPSBwYXRoU2l6ZUxpbWl0OworCisJbVRhYmxlT2ZSdW50aW1lU3RhdHVzLnJlc2V0KAorCQkJKiggbUVELT5nZXRSdW50aW1lRm9ybVN0YXRlVGFibGUoKSApLCBmYWxzZSk7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworYm9vbCBBdm1Db3ZlcmFnZURpcmVjdGl2ZVRyYWNlQnVpbGRlcjo6Y29uZmlndXJlKAorCQlBdm1UcmFjZVByb3BlcnR5ICYgYVRyYWNlRWxlbWVudCwgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMsCisJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsIEF2bVRyYW5zaXRpb24gKiBhVHJhbnNpdGlvbiwKKwkJRU5VTV9IRVVSSVNUSUNfQ0xBU1MgYW5IZXVyaXN0aWNDbGFzcywKKwkJYXZtX3NpemVfdCBwYXRoQ291bnRMaW1pdCwgYXZtX3NpemVfdCBwYXRoU2l6ZUxpbWl0KQoreworCW1FQyA9ICBhbkVDLAorCW1FRCA9IGFuRUMtPmdldEFQRXhlY3V0aW9uRGF0YSgpOworCisJbVJJRCA9IGFSSUQ7CisJbVRyYW5zaXRpb24gPSBhVHJhbnNpdGlvbjsKKworCW1UcmFuc2l0aW9uUG9pbnQgPSBOVUxMOworCisJbVRyYWNlRWxlbWVudC5jb25maWd1cmUoIGFUcmFjZUVsZW1lbnQgKTsKKworCW1IZXVyaXN0aWNDbGFzcyA9IGFuSGV1cmlzdGljQ2xhc3M7CisKKwltQ29tcHV0aW5nUGF0aENvdW50TGltaXQgPSBwYXRoQ291bnRMaW1pdDsKKwltQ29tcHV0aW5nUGF0aFNpemVMaW1pdCAgPSBwYXRoU2l6ZUxpbWl0OworCisJbVRhYmxlT2ZSdW50aW1lU3RhdHVzLnJlc2V0KCAqKCBtRUQtPmdldFJ1bnRpbWVGb3JtU3RhdGVUYWJsZSgpICksIGZhbHNlKTsKKworCXJldHVybiggdHJ1ZSApOworfQorCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFQSQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBBdm1Db3ZlcmFnZURpcmVjdGl2ZVRyYWNlQnVpbGRlcjo6aW5pdGlhbGl6ZSgpCit7CisJbUdvYWxBY2hpZXZlZEZsYWcgPSBmYWxzZTsKKworCW1FbWl0T3V0cHV0LmNsZWFyKCk7CisKKwlpZiggbVJJRC5pbnZhbGlkKCkgKQorCXsKKwkJaWYoIG1FRC0+bVJJRC5nZXRFeGVjdXRhYmxlKCktPmdldFRyYW5zaXRpb24oKS5jb250YWlucyhtVHJhbnNpdGlvbikgKQorCQl7CisJCQltUklEID0gbUVELT5tUklEOworCQl9CisKKwkJaWYoIG1SSUQuaW52YWxpZCgpICkKKwkJeworCQkJaWYoIG1UcmFuc2l0aW9uUG9pbnQgIT0gTlVMTCApCisJCQl7CisJCQkJbVRyYW5zaXRpb25Qb2ludC0+dXBkYXRlUklEKCAoKiBtRUQpICk7CisKKwkJCQltUklEID0gbVRyYW5zaXRpb25Qb2ludC0+UklEOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW1SSUQgPSBtRUQtPmdldFJ1bnRpbWVJRCggbVRyYW5zaXRpb24tPmdldEV4ZWN1dGFibGUoKSApOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuKCBtUklELnZhbGlkKCkgKTsKK30KKworCitib29sIEF2bUNvdmVyYWdlRGlyZWN0aXZlVHJhY2VCdWlsZGVyOjpjb21wdXRlUGF0aCgpCit7CisJaWYoIGluaXRpYWxpemUoKSApCisJeworCQlBdm1Db21tdW5pY2F0aW9uRmFjdG9yeTo6Y29sbGVjdEJ1ZmZlck1lc3NhZ2UobUVELCBtRW1pdE91dHB1dCk7CisKKwkJcmV0dXJuKCBtR29hbEFjaGlldmVkRmxhZyA9IGNvbXB1dGVQYXRoKG1SSUQsIG1UcmFuc2l0aW9uKSApOworCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKworCitib29sIEF2bUNvdmVyYWdlRGlyZWN0aXZlVHJhY2VCdWlsZGVyOjpjb21wdXRlUGF0aCgKKwkJQXZtVHJhY2VQcm9wZXJ0eSAmIGFUcmFjZUVsZW1lbnQpCit7CisJaWYoIGluaXRpYWxpemUoKSApCisJeworCQlBdm1Db21tdW5pY2F0aW9uRmFjdG9yeTo6Y29sbGVjdEJ1ZmZlck1lc3NhZ2UobUVELCBtRW1pdE91dHB1dCk7CisKKwkJaWYoIGNvbXB1dGVQYXRoKG1SSUQsIG1UcmFuc2l0aW9uKSApCisJCXsKKwkJCWFUcmFjZUVsZW1lbnQuY29weVRyYWNlKCBtVHJhY2VFbGVtZW50ICk7CisKKwkJCW1Hb2FsQWNoaWV2ZWRGbGFnID0gdHJ1ZTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKworYm9vbCBBdm1Db3ZlcmFnZURpcmVjdGl2ZVRyYWNlQnVpbGRlcjo6Y29tcHV0ZVBhdGgoCisJCUF2bVRyYWNlUHJvcGVydHkgJiBhVHJhY2VFbGVtZW50LCBFeGVjdXRpb25Db250ZXh0ICogYW5FQywKKwkJY29uc3QgUnVudGltZUlEICYgYVJJRCwgQXZtVHJhbnNpdGlvbiAqIGFUcmFuc2l0aW9uLAorCQlFTlVNX0hFVVJJU1RJQ19DTEFTUyBhbkhldXJpc3RpY0NsYXNzLAorCQlhdm1fc2l6ZV90IHBhdGhDb3VudExpbWl0LCBhdm1fc2l6ZV90IHBhdGhTaXplTGltaXQpCit7CisJaWYoIGNvbmZpZ3VyZShhVHJhY2VFbGVtZW50LCBhbkVDLCBhUklELCBhVHJhbnNpdGlvbiwKKwkJCWFuSGV1cmlzdGljQ2xhc3MsIHBhdGhDb3VudExpbWl0LCBwYXRoU2l6ZUxpbWl0KSApCisJeworCQlpZiggaW5pdGlhbGl6ZSgpICkKKwkJeworCQkJQXZtQ29tbXVuaWNhdGlvbkZhY3Rvcnk6OmNvbGxlY3RCdWZmZXJNZXNzYWdlKG1FRCwgbUVtaXRPdXRwdXQpOworCisJCQlpZiggY29tcHV0ZVBhdGgobVJJRCwgbVRyYW5zaXRpb24pICkKKwkJCXsKKwkJCQlhVHJhY2VFbGVtZW50LmNvcHlUcmFjZSggbVRyYWNlRWxlbWVudCApOworCisJCQkJbUdvYWxBY2hpZXZlZEZsYWcgPSB0cnVlOworCisJCQkJcmV0dXJuKCB0cnVlICk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKworCit2b2lkIEF2bUNvdmVyYWdlRGlyZWN0aXZlVHJhY2VCdWlsZGVyOjpyZXBvcnQoT3V0U3RyZWFtICYgb3MpCit7CisJb3MgPDwgREVGQVVMVF9XUkFQX0RBVEE7CisKKwlpZiggbUVDICE9IE5VTEwgKQorCXsKKwkJb3MgPDwgImZyb20gIjsgIG1FQy0+dHJhY2VNaW5pbXVtKG9zKTsKKwl9CisJb3MgPDwgIlRyYWNlIHRvIHJlYWNoIChzaXplOiIgPDwgbVRyYWNlRWxlbWVudC5tU2l6ZSA8PCAiKSA6PiAiCisJCQk8PCBtVHJhbnNpdGlvbi0+c3RyVHJhbnNpdGlvbkhlYWRlcigpIDw8IHN0ZDo6ZW5kbDsKKwltVHJhY2VFbGVtZW50LnRvU3RyZWFtKG9zKTsKKworLy8Jb3MgPDwgIkV4cGVjdGVkIElucHV0IDo+ICIgPDwgc3RkOjplbmRsOworLy8JQmFzZUNvbXBpbGVkRm9ybTo6dG9TdHJlYW1TdGF0aWNDb20ob3MsIG1FeHBlY3RlZElucHV0KTsKKy8vCW9zIDw8IFRBQiA8PCAiRW1pdCBPdXRwdXQgOj4iOyBtRW1pdE91dHB1dC50b1N0cmVhbShBVk1fT1NfVFJBQ0UpOworCisJb3MgPDwgKCBtR29hbEFjaGlldmVkRmxhZyA/ICJORVciIDogIk5PIiApIDw8ICIgT0JKRUNUSVZFICEhISIKKwkJCTw8IEVORF9XUkFQIDw8IHN0ZDo6ZW5kbDsKK30KKworCisKK2Jvb2wgQXZtQ292ZXJhZ2VEaXJlY3RpdmVUcmFjZUJ1aWxkZXI6OmNvbXB1dGVQYXRoKAorCQljb25zdCBSdW50aW1lSUQgJiBhUklELCBBdm1UcmFuc2l0aW9uICogYVRyYW5zaXRpb24pCit7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwlBVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICJjb21wdXRlUGF0aCBmcm9tIDo+ICI7CisJbUVDLT50cmFjZU1pbmltdW0oQVZNX09TX1RSQUNFKTsKKwlBVk1fT1NfVFJBQ0UgPDwgVEFCMiA8PCBhUklELnN0clVuaXFJZCgpIDw8ICIgfD09PiAiOworCWFUcmFuc2l0aW9uLT50b1N0cmVhbUhlYWRlcihBVk1fT1NfVFJBQ0UpOyBBVk1fT1NfVFJBQ0UgPDwgc3RkOjplbmRsOworCWlmKCBhVHJhbnNpdGlvbi0+aGFzSW50ZXJuYWxDb21tdW5pY2F0aW9uQ29kZSgpICkKKwl7CisJCUFWTV9PU19UUkFDRSAgPDwgVEFCMiA8PCAiY29tIHw9PT4gIjsKKwkJQmFzZUNvbXBpbGVkRm9ybTo6dG9TdHJlYW1TdGF0aWNDb20oQVZNX09TX1RSQUNFLAorCQkJCWFUcmFuc2l0aW9uLT5nZXRJbnRlcm5hbENvbW11bmljYXRpb25Db2RlKCkpOworCX0KKy8vCUFWTV9PU19UUkFDRSA8PCBUQUIgPDwgIkV4cGVjdGVkIElucHV0IDo+ICIgPDwgc3RkOjplbmRsOworLy8JQmFzZUNvbXBpbGVkRm9ybTo6dG9TdHJlYW1TdGF0aWNDb20oQVZNX09TX1RSQUNFLCBtRXhwZWN0ZWRJbnB1dCk7CisJQVZNX09TX1RSQUNFIDw8IFRBQjIgPDwgIkVtaXQgT3V0cHV0IDo+IjsgbUVtaXRPdXRwdXQudG9TdHJlYW0oQVZNX09TX1RSQUNFKTsKKwlBVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICJlbmQgLy9jb21wdXRlUGF0aCIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisKKworCWlmKCBtRUQtPmlzSWRsZU9yUnVubmluZyhhUklEKSApCisJeworCQlyZXR1cm4oIGZpcmVUcmFuc2l0aW9uKGFSSUQsIGFUcmFuc2l0aW9uKSApOworCX0KKwllbHNlCisJeworCQlyZXR1cm4oIGNvbXB1dGVQYXRoVG9UcmFuc2l0aW9uKGFSSUQsIGFUcmFuc2l0aW9uKSApOworCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKworCitib29sIEF2bUNvdmVyYWdlRGlyZWN0aXZlVHJhY2VCdWlsZGVyOjpmaXJlVHJhbnNpdGlvbigKKwkJY29uc3QgUnVudGltZUlEICYgYVJJRCwgQXZtVHJhbnNpdGlvbiAqIGFUcmFuc2l0aW9uKQoreworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX1RSQUNFIDw8IHN0ZDo6ZW5kbAorCQkJPDwgVEFCIDw8ICJmaXJlVHJhbnNpdGlvbiA6PiAiIDw8IGFSSUQuc3RyVW5pcUlkKCkKKwkJCTw8ICIgfD09PiAiIDw8IGFUcmFuc2l0aW9uLT5zdHJUcmFuc2l0aW9uSGVhZGVyKCkgPDwgc3RkOjplbmRsOworLy8JQVZNX09TX1RSQUNFIDw8IFRBQjIgPDwgIkV4cGVjdGVkIElucHV0IDo+ICIgPDwgc3RkOjplbmRsOworLy8JQmFzZUNvbXBpbGVkRm9ybTo6dG9TdHJlYW1TdGF0aWNDb20oQVZNX09TX1RSQUNFLCBtRXhwZWN0ZWRJbnB1dCk7CisJQVZNX09TX1RSQUNFIDw8IFRBQjIgPDwgIkVtaXQgT3V0cHV0IDo+IjsgbUVtaXRPdXRwdXQudG9TdHJlYW0oQVZNX09TX1RSQUNFKTsKKwlBVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICJlbmQgLy9maXJlVHJhbnNpdGlvbiIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisKKworCW1UYWJsZU9mUnVudGltZVN0YXR1cy5zdGF0ZVNldChhUklELmdldE9mZnNldCgpLCBQUk9DRVNTX1NVU1BFTkRFRF9TVEFURSk7CisKKwlpZiggYVRyYW5zaXRpb24tPmhhc0lucHV0Q29tKCkgKQorCXsKKwkJTGlzdE9mSW5zdGFuY2VPZlBvcnQgYW5JbnB1dFRyYWNlKCBhVHJhbnNpdGlvbi0+Z2V0SW5wdXRDb20oKSApOworCQlpZiggbUVtaXRPdXRwdXQudW5jb250YWlucyggYW5JbnB1dFRyYWNlIC8qLCBhUklEKi8gKSApCisJCXsKKwkJCS8vIHRyb3V2ZXIgZGVzIMOpbWV0dGV1cnMgcG91ciBsZXMgSU5QVVQgYXR0ZW5kdSBhdSByZWdhcmQgZGUgRUQ8IFNDID4KKwkJCXdoaWxlKCBhbklucHV0VHJhY2Uubm9uZW1wdHkoKSApCisJCQl7CisJCQkJaWYoIGNvbXB1dGVQYXRoVG9JbnB1dChhUklELCBhbklucHV0VHJhY2UuZnJvbnQoKSkgKQorCQkJCXsKKwkJCQkJYW5JbnB1dFRyYWNlLnBvcF9mcm9udCgpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmKCBhbklucHV0VHJhY2UuZW1wdHkoKSApCisJCQl7CisJCQkJdHJhY2VUcmFuc2l0aW9uKGFSSUQsIGFUcmFuc2l0aW9uKTsKKworCQkJCXJldHVybiggdHJ1ZSApOworCQkJfQorCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJCWVsc2UKKwkJeworCQkJdHJhY2VUcmFuc2l0aW9uKGFSSUQsIGFUcmFuc2l0aW9uKTsKKwkJfQorCX0KKwllbHNlCisJeworCQl0cmFjZVRyYW5zaXRpb24oYVJJRCwgYVRyYW5zaXRpb24pOworCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKK3ZvaWQgQXZtQ292ZXJhZ2VEaXJlY3RpdmVUcmFjZUJ1aWxkZXI6OnRyYWNlVHJhbnNpdGlvbigKKwkJY29uc3QgUnVudGltZUlEICYgYVJJRCwgQXZtVHJhbnNpdGlvbiAqIGFUcmFuc2l0aW9uKQoreworCW1UcmFjZUVsZW1lbnQuYXBwZW5kKGFSSUQsIGFUcmFuc2l0aW9uKTsKKworCS8vIFZpcnR1YWwgRXZhbCBPZiBhVHJhbnNpdGlvbgorCWlmKCBhVHJhbnNpdGlvbi0+aGFzT3V0cHV0Q29tKCkgKQorCXsKKwkJTGlzdE9mSW5zdGFuY2VPZlBvcnQ6OmNvbnN0X2l0ZXJhdG9yIGl0T3V0cHV0ID0KKwkJCQlhVHJhbnNpdGlvbi0+Z2V0T3V0cHV0Q29tKCkuYmVnaW4oKTsKKwkJTGlzdE9mSW5zdGFuY2VPZlBvcnQ6OmNvbnN0X2l0ZXJhdG9yIGVuZE91dHB1dCA9CisJCQkJYVRyYW5zaXRpb24tPmdldE91dHB1dENvbSgpLmVuZCgpOworCQlmb3IoIDsgaXRPdXRwdXQgIT0gZW5kT3V0cHV0IDsgKytpdE91dHB1dCApCisJCXsKKwkJCW1FbWl0T3V0cHV0LnB1c2goIE1lc3NhZ2UoYVJJRCwgSU5DUl9CRigqaXRPdXRwdXQpKSApOworCQl9CisJfQorfQorCisKK2Jvb2wgQXZtQ292ZXJhZ2VEaXJlY3RpdmVUcmFjZUJ1aWxkZXI6OmNvbXB1dGVQYXRoVG9UcmFuc2l0aW9uKAorCQljb25zdCBSdW50aW1lSUQgJiBhUklELCBBdm1UcmFuc2l0aW9uICogYVRyYW5zaXRpb24pCit7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwlBVk1fT1NfVFJBQ0UgPDwgc3RkOjplbmRsCisJCQk8PCBUQUIgPDwgImNvbXB1dGVQYXRoVG9UcmFuc2l0aW9uIHVzaW5nIDo+ICIgPDwgYVJJRC5zdHJVbmlxSWQoKQorCQkJPDwgIiB8PT0+ICIgPDwgYVRyYW5zaXRpb24tPnN0clRyYW5zaXRpb25IZWFkZXIoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKworCisJUnVudGltZUlEIHRtcFJJRCA9IGFSSUQuZ2V0UFJJRCgpOworCWZvciggOyB0bXBSSUQudmFsaWQoKSA7IHRtcFJJRCA9IHRtcFJJRC5nZXRQUklEKCkgKQorCXsKKwkJaWYoIG1FRC0+aXNJZGxlT3JSdW5uaW5nKHRtcFJJRCkgKQorCQl7CisJCQlicmVhazsKKwkJfQorCX0KKworCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggdG1wUklELnZhbGlkKCkgKQorCQkJPDwgIlVuZm91bmQgYSBSdW5uYWJsZSBBbmNlc3RvciBTdGF0ZW1hY2hpbmUgISEhIgorCQkJPDwgU0VORF9FWElUOworCisJY29uc3QgUnVudGltZUZvcm0gJiB0bXBSRiA9IG1FRC0+Z2V0UnVudGltZSh0bXBSSUQpOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwlBVk1fT1NfVFJBQ0UgPDwgVEFCMiA8PCAiUnVubmFibGUgQW5jZXN0b3IgU3RhdGVtYWNoaW5lIDo+ICIKKwkJCTw8IHRtcFJJRC5zdHIoKSA8PCBzdGQ6OmVuZGwKKwkJCTw8IFRBQjIgPDwgIlJ1bm5hYmxlIEFuY2VzdG9yIFN0YXRlIFNjaGVkdWxlciA6PiB7IjsKKwl0bXBSRi5nZXRPblNjaGVkdWxlKCktPnRvU3RyZWFtUm91dGluZSggQVZNX09TX1RSQUNFICkKKwkJCTw8IFRBQjIgPDwgIn0iIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCisKKwlpZiggdG1wUkYuZ2V0T25TY2hlZHVsZSgpLT5pc09wQ29kZSggQVZNX09QQ09ERV9SVU4gKSAmJgorCQl0bXBSRi5nZXRPblNjaGVkdWxlKCktPmZpcnN0KCkuaXM8IFJ1bnRpbWVJRCA+KCkgKQorCXsKKwkJcmV0dXJuKCBjb21wdXRlUGF0aEZyb21SdW5uYWJsZSgKKwkJCQl0bXBSRi5nZXRPblNjaGVkdWxlKCktPmZpcnN0KCkuYmZSSUQoKSwgYVRyYW5zaXRpb24pICk7CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKK2Jvb2wgQXZtQ292ZXJhZ2VEaXJlY3RpdmVUcmFjZUJ1aWxkZXI6OmNvbXB1dGVCYXNpY1BhdGhGcm9tUnVubmFibGUoCisJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsIEF2bVRyYW5zaXRpb24gKiBhVHJhbnNpdGlvbikKK3sKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCUFWTV9PU19UUkFDRSA8PCBzdGQ6OmVuZGwKKwkJCTw8IFRBQiA8PCAiY29tcHV0ZUJhc2ljUGF0aEZyb21SdW5uYWJsZSB1c2luZyA6PiAiIDw8IGFSSUQuc3RyVW5pcUlkKCkKKwkJCTw8ICIgfD09PiAiIDw8IGFUcmFuc2l0aW9uLT5zdHJUcmFuc2l0aW9uSGVhZGVyKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisKKwlpZiggbm90IGFSSUQuZ2V0RXhlY3V0YWJsZSgpLT4KKwkJCWNvbnRhaW5zRm9yd2FyZFJlYWNoYWJsZVRyYW5zaXRpb24oYVRyYW5zaXRpb24pICkKKwl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwkJQVZNX09TX1RSQUNFIDw8IFRBQjIgPDwgIlVucmVhY2hhYmxlIHRyYW5zaXRpb24gOj4gIgorCQkJCTw8IG1UcmFuc2l0aW9uLT5zdHJUcmFuc2l0aW9uSGVhZGVyKCkgPDwgc3RkOjplbmRsCisJCQkJPDwgVEFCMiA8PCAiZnJvbSA6ICIgPDwgYVJJRC5zdHIoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCUFWTV9PU19UUkFDRSA8PCBUQUIgPDwgIkxvb2tpbmcgZm9yIGEgcGF0aCB0byA6PiAiIDw8IGFSSUQuc3RyKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisKKworCUxpc3RPZkF2bVRyYW5zaXRpb24gb25lVHJhbnNpdGlvblBhdGg7CisKKwlpZiggY29tcHV0ZVBhdGhUb1RyYW5zaXRpb24oYVJJRCwgYVRyYW5zaXRpb24sIG9uZVRyYW5zaXRpb25QYXRoKSApCisJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX1RSQUNFIDw8IElOQ1JfSU5ERU5UOworCUF2bVRyYW5zaXRpb246OnRvU3RyZWFtKEFWTV9PU19UUkFDRSwgb25lVHJhbnNpdGlvblBhdGgpOworCUFWTV9PU19UUkFDRSA8PCBERUNSX0lOREVOVCA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKworCQkvLyBBbGwgZm91bmQgcGF0aAorLy8JCUxpc3RPZkxpc3RPZkF2bVRyYW5zaXRpb24gYWxsVHJhbnNpdGlvblBhdGhzOworLy8JCWNvbXB1dGVQYXRoVG9UcmFuc2l0aW9uKGFSSUQsIGFUcmFuc2l0aW9uLCBhbGxUcmFuc2l0aW9uUGF0aHMpOworCisJCVJ1bnRpbWVJRCB0bXBSSUQgPSBhUklEOworCQlkbworCQl7CisJCQlhVHJhbnNpdGlvbiA9IG9uZVRyYW5zaXRpb25QYXRoLmZyb250KCk7CisKKwkJCWlmKCBmaXJlVHJhbnNpdGlvbih0bXBSSUQsIGFUcmFuc2l0aW9uKSApCisJCQl7CisJCQkJb25lVHJhbnNpdGlvblBhdGgucG9wX2Zyb250KCk7CisKKwkJCQljb21wdXRlVGFyZ2V0TWFjaGluZSh0bXBSSUQsIGFUcmFuc2l0aW9uLT5nZXRDb2RlKCkpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXdoaWxlKCBvbmVUcmFuc2l0aW9uUGF0aC5ub25lbXB0eSgpICk7CisKKwkJcmV0dXJuKCBvbmVUcmFuc2l0aW9uUGF0aC5lbXB0eSgpICk7CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKKworYm9vbCBBdm1Db3ZlcmFnZURpcmVjdGl2ZVRyYWNlQnVpbGRlcjo6Y29tcHV0ZVNtYXJ0UGF0aEZyb21SdW5uYWJsZSgKKwkJY29uc3QgUnVudGltZUlEICYgYVJJRCwgQXZtVHJhbnNpdGlvbiAqIGFUcmFuc2l0aW9uKQoreworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX1RSQUNFIDw8IHN0ZDo6ZW5kbAorCQkJPDwgVEFCIDw8ICJjb21wdXRlU21hcnRQYXRoRnJvbVJ1bm5hYmxlIHVzaW5nIDo+ICIgPDwgYVJJRC5zdHJVbmlxSWQoKQorCQkJPDwgIiB8PT0+ICIgPDwgYVRyYW5zaXRpb24tPnN0clRyYW5zaXRpb25IZWFkZXIoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKworCWlmKCBub3QgYVJJRC5nZXRFeGVjdXRhYmxlKCktPgorCQkJY29udGFpbnNGb3J3YXJkUmVhY2hhYmxlVHJhbnNpdGlvbihhVHJhbnNpdGlvbikgKQorCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCQlBVk1fT1NfVFJBQ0UgPDwgVEFCMiA8PCAiVW5yZWFjaGFibGUgdHJhbnNpdGlvbiA6PiAiCisJCQkJPDwgbVRyYW5zaXRpb24tPnN0clRyYW5zaXRpb25IZWFkZXIoKSA8PCBzdGQ6OmVuZGwKKwkJCQk8PCBUQUIyIDw8ICJmcm9tIDogIiA8PCBhUklELnN0cigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiTG9va2luZyBmb3IgYSBwYXRoIHRvIDo+ICIgPDwgYVJJRC5zdHIoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKworCisJYXZtX3NpemVfdCBzYXZlVHJhY2VFbGVtZW50U2l6ZSA9IG1UcmFjZUVsZW1lbnQubVNpemU7CisKKwlpZiggbUNvbXB1dGluZ1BhdGhTaXplTGltaXQgPD0gc2F2ZVRyYWNlRWxlbWVudFNpemUgKQorCXsKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCS8vIEFsbCBmb3VuZCBwYXRoCisJTGlzdE9mTGlzdE9mQXZtVHJhbnNpdGlvbiBhbGxUcmFuc2l0aW9uUGF0aHM7CisJY29tcHV0ZVBhdGhUb1RyYW5zaXRpb24oYVJJRCwgYVRyYW5zaXRpb24sIGFsbFRyYW5zaXRpb25QYXRocyk7CisKKwlMaXN0T2ZBdm1UcmFuc2l0aW9uIG9uZVRyYW5zaXRpb25QYXRoOworCVJ1bnRpbWVJRCB0bXBSSUQ7CisKKy8vCWlmKCBjb21wdXRlUGF0aFRvVHJhbnNpdGlvbihhUklELCBhVHJhbnNpdGlvbiwgb25lVHJhbnNpdGlvblBhdGgpICkKKwl3aGlsZSggYWxsVHJhbnNpdGlvblBhdGhzLm5vbmVtcHR5KCkgKQorCXsKKwkJb25lVHJhbnNpdGlvblBhdGguY2xlYXIoKTsKKwkJb25lVHJhbnNpdGlvblBhdGguc3BsaWNlKCBhbGxUcmFuc2l0aW9uUGF0aHMuZnJvbnQoKSApOworCQlhbGxUcmFuc2l0aW9uUGF0aHMucG9wX2Zyb250KCk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCUFWTV9PU19UUkFDRSA8PCBUQUIgPDwgIkZvdW5kIFBhdGggLS0+ICIKKwkJCTw8IGFUcmFuc2l0aW9uLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbCA8PCBJTkNSX0lOREVOVDsKKwlBdm1UcmFuc2l0aW9uOjp0b1N0cmVhbShBVk1fT1NfVFJBQ0UsIG9uZVRyYW5zaXRpb25QYXRoKTsKKwlBVk1fT1NfVFJBQ0UgPDwgREVDUl9JTkRFTlQgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisKKwkJdG1wUklEID0gYVJJRDsKKwkJZG8KKwkJeworCQkJYVRyYW5zaXRpb24gPSBvbmVUcmFuc2l0aW9uUGF0aC5mcm9udCgpOworCisJCQlpZiggZmlyZVRyYW5zaXRpb24odG1wUklELCBhVHJhbnNpdGlvbikgKQorCQkJeworCQkJCW9uZVRyYW5zaXRpb25QYXRoLnBvcF9mcm9udCgpOworCisJCQkJY29tcHV0ZVRhcmdldE1hY2hpbmUodG1wUklELCBhVHJhbnNpdGlvbi0+Z2V0Q29kZSgpKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQl3aGlsZSggb25lVHJhbnNpdGlvblBhdGgubm9uZW1wdHkoKSApOworCisJCWlmKCBvbmVUcmFuc2l0aW9uUGF0aC5lbXB0eSgpICkKKwkJeworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwkJZWxzZSBpZiggYWxsVHJhbnNpdGlvblBhdGhzLmVtcHR5KCkgKQorCQl7CisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKworCQkvLyBCQUNLVFJBQ0sKKwkJZWxzZQorCQl7CisJCQltVHJhY2VFbGVtZW50LnJlc2l6ZSggc2F2ZVRyYWNlRWxlbWVudFNpemUgKTsKKwkJfQorCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKworCitib29sIEF2bUNvdmVyYWdlRGlyZWN0aXZlVHJhY2VCdWlsZGVyOjpjb21wdXRlUGF0aFRvSW5wdXQoCisJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsIEluc3RhbmNlT2ZQb3J0ICogYW5JbnB1dFRyYWNlKQoreworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiY29tcHV0ZVBhdGhUb0lucHV0IDo+ICIgPDwgc3RkOjplbmRsOworCUFWTV9PU19UUkFDRSA8PCBUQUIyIDw8ICJFeHBlY3RlZCBJbnB1dCA6PiAiIDw8IGFuSW5wdXRUcmFjZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCBzdGQ6OmVuZGw7CisJQVZNX09TX1RSQUNFIDw8IFRBQjIgPDwgIkVtaXQgT3V0cHV0IDo+IjsgbUVtaXRPdXRwdXQudG9TdHJlYW0oQVZNX09TX1RSQUNFKTsKKwlBVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICJlbmQgLy9jb21wdXRlUGF0aFRvSW5wdXQiIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCisKKwlFeGVjdXRhYmxlRm9ybSAqIHRtcEV4ZWN1dGFibGUgPSBOVUxMOworCVJ1bnRpbWVJRCBzcmNSSUQ7CisKKwkvLyBQYXJjb3VyaXIgdG91cyBsZXMgw6l0YXRzIGV0IHJlcMOpcmVyIGNldXggY29udGVuYW50IGxlcyBib25zIG91dHB1dC9vdXRwdXRUbworCVRhYmxlT2ZSdW50aW1lVDo6Y29uc3RfaXRlcmF0b3IgaXRSRiA9IG1FRC0+Z2V0VGFibGVPZlJ1bnRpbWUoKS5iZWdpbigpOworCVRhYmxlT2ZSdW50aW1lVDo6Y29uc3RfaXRlcmF0b3IgZW5kUkYgPSBtRUQtPmdldFRhYmxlT2ZSdW50aW1lKCkuZW5kKCk7CisJZm9yKCA7IGl0UkYgIT0gZW5kUkYgOyArK2l0UkYgKQorCXsKKwkJc3JjUklEID0gKCppdFJGKS0+Z2V0UklEKCk7CisJCXRtcEV4ZWN1dGFibGUgPSBzcmNSSUQuZ2V0RXhlY3V0YWJsZSgpOworCisJCWlmKCBtVGFibGVPZlJ1bnRpbWVTdGF0dXMuaXNTdXNwZW5kZWQoc3JjUklELmdldE9mZnNldCgpKSApCisJCXsKKwkJCS8vISEgRXhjbHVkZSBtYWNoaW5lCisJCX0KKwkJZWxzZSBpZiggbUVELT5pc0lkbGVPclJ1bm5pbmcoIHNyY1JJRCApICYmCisJCQl0bXBFeGVjdXRhYmxlLT5nZXRGb3J3YXJkUmVhY2hhYmxlVHJhbnNpdGlvbigpLm5vbmVtcHR5KCkgKQorCQl7CisJCQlMaXN0T2ZBdm1UcmFuc2l0aW9uOjpjb25zdF9pdGVyYXRvciBpdFRyYW5zID0KKwkJCQkJdG1wRXhlY3V0YWJsZS0+Z2V0Rm9yd2FyZFJlYWNoYWJsZVRyYW5zaXRpb24oKS5iZWdpbigpOworCQkJTGlzdE9mQXZtVHJhbnNpdGlvbjo6Y29uc3RfaXRlcmF0b3IgZW5kVHJhbnMgPQorCQkJCQl0bXBFeGVjdXRhYmxlLT5nZXRGb3J3YXJkUmVhY2hhYmxlVHJhbnNpdGlvbigpLmVuZCgpOworCQkJZm9yKCA7IGl0VHJhbnMgIT0gZW5kVHJhbnMgOyArK2l0VHJhbnMgKQorCQkJeworCQkJCWlmKCAoKml0VHJhbnMpLT5nZXRPdXRwdXRDb20oKS5jb250YWlucyhhbklucHV0VHJhY2UpICkKKwkJCQl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwlBVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICJmb3VuZCBPdXRwdXQgaW4gOj4gIiA8PCBzcmNSSUQuc3RyVW5pcUlkKCkgPDwgIiB8PT0+ICIKKwkJCTw8ICgqaXRUcmFucyktPnN0clRyYW5zaXRpb25IZWFkZXIoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKworCQkJCQlpZiggdG1wRXhlY3V0YWJsZSAhPSAoKml0VHJhbnMpLT5nZXRFeGVjdXRhYmxlKCkgKQorCQkJCQl7CisJCQkJCQlpZiggY29tcHV0ZVBhdGhGcm9tUnVubmFibGUoc3JjUklELCAoKml0VHJhbnMpKSApCisJCQkJCQl7CisJCQkJCQkJcmV0dXJuKCB0cnVlICk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZSBpZiggZmlyZVRyYW5zaXRpb24oc3JjUklELCAoKml0VHJhbnMpKSApCisJCQkJCXsKKwkJCQkJCXJldHVybiggdHJ1ZSApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwlBVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICJVbmZvdW5kIElucHV0IDo+ICIgPDwgYW5JbnB1dFRyYWNlLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKK2Jvb2wgQXZtQ292ZXJhZ2VEaXJlY3RpdmVUcmFjZUJ1aWxkZXI6OmNvbXB1dGVQYXRoVG9UcmFuc2l0aW9uKAorCQljb25zdCBSdW50aW1lSUQgJiBhUklELCBBdm1UcmFuc2l0aW9uICogYVRyYW5zaXRpb24sCisJCUxpc3RPZkF2bVRyYW5zaXRpb24gJiBvbmVUcmFuc2l0aW9uUGF0aCkKK3sKKwlhbnlUcmFuc2l0aW9uUGF0aHMuY2xlYXIoKTsKKworCW91dGdvaW5nVHJhbnNpdGlvbnMuY2xlYXIoKTsKKwl0Z3RJbnN0YW5jZSA9IE5VTEw7CisKKwkvLyBJbml0aWFsaXphdGlvbiBzdGVwCisJZndkTWFjaGluZSA9IGFSSUQuZ2V0RXhlY3V0YWJsZSgpOworCWZ3ZE1hY2hpbmUtPmdldE91dGdvaW5nVHJhbnNpdGlvbiggb3V0Z29pbmdUcmFuc2l0aW9ucyApOworCisJdGd0TWFjaGluZSA9IGZ3ZE1hY2hpbmU7CisKKwlpdFRyYW5zID0gb3V0Z29pbmdUcmFuc2l0aW9ucy5iZWdpbigpOworCWVuZFRyYW5zID0gb3V0Z29pbmdUcmFuc2l0aW9ucy5lbmQoKTsKKwlmb3IoIDsgaXRUcmFucyAhPSBlbmRUcmFucyA7ICsraXRUcmFucyApCisJeworCQlpZiggKHRndEluc3RhbmNlID0gKCppdFRyYW5zKS0+Z2V0VHJhbnNpdGlvblRhcmdldCgpKSAhPSBOVUxMICkKKwkJeworCQkJdGd0TWFjaGluZSA9IHRndEluc3RhbmNlLT5nZXRFeGVjdXRhYmxlKCk7CisKKwkJCWlmKCB0Z3RNYWNoaW5lLT5jb250YWluc0ZvcndhcmRSZWFjaGFibGVUcmFuc2l0aW9uKGFUcmFuc2l0aW9uKSApCisJCQl7CisJCQkJYW55VHJhbnNpdGlvblBhdGhzLmFwcGVuZCggTGlzdE9mQXZtVHJhbnNpdGlvbigqaXRUcmFucykgKTsKKwkJCX0KKwkJfQorCX0KKworCisJYVRyYW5zaXRpb25QYXRoLmNsZWFyKCk7CisKKwkvLyBJdGVyYXRpdmUgc3RlcAorCXdoaWxlKCBhbnlUcmFuc2l0aW9uUGF0aHMubm9uZW1wdHkoKSApCisJeworCQlhVHJhbnNpdGlvblBhdGguY2xlYXIoKTsKKwkJYVRyYW5zaXRpb25QYXRoLnNwbGljZSggYW55VHJhbnNpdGlvblBhdGhzLmZyb250KCkgKTsKKwkJYW55VHJhbnNpdGlvblBhdGhzLnBvcF9mcm9udCgpOworCisJCXRndEluc3RhbmNlID0gYVRyYW5zaXRpb25QYXRoLmJhY2soKS0+Z2V0VHJhbnNpdGlvblRhcmdldCgpOworCQlpZiggdGd0SW5zdGFuY2UgPT0gTlVMTCApCisJCXsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZndkTWFjaGluZSA9IHRndEluc3RhbmNlLT5nZXRFeGVjdXRhYmxlKCk7CisJCWlmKCBmd2RNYWNoaW5lLT5nZXRUcmFuc2l0aW9uKCkuY29udGFpbnMoYVRyYW5zaXRpb24pICkKKwkJeworCQkJb25lVHJhbnNpdGlvblBhdGguc3BsaWNlKCBhVHJhbnNpdGlvblBhdGggKTsKKwkJCW9uZVRyYW5zaXRpb25QYXRoLnB1c2hfYmFjayggYVRyYW5zaXRpb24gKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlvdXRnb2luZ1RyYW5zaXRpb25zLmNsZWFyKCk7CisJCQlmd2RNYWNoaW5lLT5nZXRPdXRnb2luZ1RyYW5zaXRpb24oIG91dGdvaW5nVHJhbnNpdGlvbnMgKTsKKworCQkJaXRUcmFucyA9IG91dGdvaW5nVHJhbnNpdGlvbnMuYmVnaW4oKTsKKwkJCWVuZFRyYW5zID0gb3V0Z29pbmdUcmFuc2l0aW9ucy5lbmQoKTsKKwkJCWZvciggOyBpdFRyYW5zICE9IGVuZFRyYW5zIDsgKytpdFRyYW5zICkKKwkJCXsKKwkJCQlpZiggbm90IGFUcmFuc2l0aW9uUGF0aC5jb250YWlucyggKml0VHJhbnMgKSApCisJCQkJeworCQkJCQlpZiggKHRndEluc3RhbmNlID0gKCppdFRyYW5zKS0+Z2V0VHJhbnNpdGlvblRhcmdldCgpKSAhPSBOVUxMICkKKwkJCQkJeworCQkJCQkJdGd0TWFjaGluZSA9IHRndEluc3RhbmNlLT5nZXRFeGVjdXRhYmxlKCk7CisKKwkJCQkJCWlmKCB0Z3RNYWNoaW5lLT5jb250YWluc0ZvcndhcmRSZWFjaGFibGVUcmFuc2l0aW9uKGFUcmFuc2l0aW9uKSApCisJCQkJCQl7CisJCQkJCQkJaWYoIChhVHJhbnNpdGlvblBhdGguc2l6ZSgpIDwgbUNvbXB1dGluZ1BhdGhTaXplTGltaXQpICYmCisJCQkJCQkJCShhbnlUcmFuc2l0aW9uUGF0aHMuc2l6ZSgpIDwgbUNvbXB1dGluZ1BhdGhDb3VudExpbWl0KSApCisJCQkJCQkJeworCQkJCQkJCQlhbnlUcmFuc2l0aW9uUGF0aHMucHVzaF9iYWNrKCBhVHJhbnNpdGlvblBhdGggKTsKKwkJCQkJCQkJYW55VHJhbnNpdGlvblBhdGhzLmJhY2soKS5wdXNoX2JhY2soICppdFRyYW5zICk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKK2Jvb2wgQXZtQ292ZXJhZ2VEaXJlY3RpdmVUcmFjZUJ1aWxkZXI6OmNvbXB1dGVQYXRoVG9UcmFuc2l0aW9uKAorCQljb25zdCBSdW50aW1lSUQgJiBhUklELCBBdm1UcmFuc2l0aW9uICogYVRyYW5zaXRpb24sCisJCUxpc3RPZkxpc3RPZkF2bVRyYW5zaXRpb24gJiBhbGxUcmFuc2l0aW9uUGF0aHMpCit7CisJYW55VHJhbnNpdGlvblBhdGhzLmNsZWFyKCk7CisJcHJlZml4TG9vcFRyYW5zaXRpb25QYXRocy5jbGVhcigpOworCisJYVRyYW5zaXRpb25QYXRoLmNsZWFyKCk7CisKKwlvdXRnb2luZ1RyYW5zaXRpb25zLmNsZWFyKCk7CisJdGd0SW5zdGFuY2UgPSBOVUxMOworCisJLy8gSW5pdGlhbGl6YXRpb24gc3RlcAorCWZ3ZE1hY2hpbmUgPSBhUklELmdldEV4ZWN1dGFibGUoKTsKKwlmd2RNYWNoaW5lLT5nZXRPdXRnb2luZ1RyYW5zaXRpb24oIG91dGdvaW5nVHJhbnNpdGlvbnMgKTsKKworCXRndE1hY2hpbmUgPSBmd2RNYWNoaW5lOworCisJaXRUcmFucyA9IG91dGdvaW5nVHJhbnNpdGlvbnMuYmVnaW4oKTsKKwllbmRUcmFucyA9IG91dGdvaW5nVHJhbnNpdGlvbnMuZW5kKCk7CisJZm9yKCA7IGl0VHJhbnMgIT0gZW5kVHJhbnMgOyArK2l0VHJhbnMgKQorCXsKKwkJaWYoICh0Z3RJbnN0YW5jZSA9ICgqaXRUcmFucyktPmdldFRyYW5zaXRpb25UYXJnZXQoKSkgIT0gTlVMTCApCisJCXsKKwkJCXRndE1hY2hpbmUgPSB0Z3RJbnN0YW5jZS0+Z2V0RXhlY3V0YWJsZSgpOworCisJCQlpZiggdGd0TWFjaGluZS0+Y29udGFpbnNGb3J3YXJkUmVhY2hhYmxlVHJhbnNpdGlvbihhVHJhbnNpdGlvbikgKQorCQkJeworCQkJCWFueVRyYW5zaXRpb25QYXRocy5hcHBlbmQoIExpc3RPZkF2bVRyYW5zaXRpb24oKml0VHJhbnMpICk7CisJCQl9CisJCX0KKwl9CisKKwkvLyBJdGVyYXRpdmUgc3RlcAorCXdoaWxlKCBhbnlUcmFuc2l0aW9uUGF0aHMubm9uZW1wdHkoKSApCisJeworLy8JCUFWTV9PU19UUkFDRSA8PCBUQUIgPDwgIlRNUCBmb3VuZCBwYXRocyA6PiAiIDw8IHN0ZDo6ZW5kbDsKKy8vCQlMaXN0T2ZMaXN0T2ZBdm1UcmFuc2l0aW9uOjpjb25zdF9pdGVyYXRvciBpdExpc3QgPSBhbGxUcmFuc2l0aW9uUGF0aHMuYmVnaW4oKTsKKy8vCQlMaXN0T2ZMaXN0T2ZBdm1UcmFuc2l0aW9uOjpjb25zdF9pdGVyYXRvciBlbmRMaXN0ID0gYWxsVHJhbnNpdGlvblBhdGhzLmVuZCgpOworLy8JCWZvciggYXZtX3NpemVfdCBudW1iZXIgPSAwIDsgaXRMaXN0ICE9IGVuZExpc3QgOyArK2l0TGlzdCAsICsrbnVtYmVyICkKKy8vCQl7CisvLwkJCUFWTV9PU19UUkFDRSA8PCBUQUIgPDwgIlBhdGggbnVtYmVyIDoiIDw8IG51bWJlciA8PCAiPiIKKy8vCQkJCQk8PCBzdGQ6OmVuZGwgPDwgSU5DUl9JTkRFTlQ7CisvLwkJCUF2bVRyYW5zaXRpb246OnRvU3RyZWFtKEFWTV9PU19UUkFDRSwgKml0TGlzdCk7CisvLwkJCUFWTV9PU19UUkFDRSA8PCBzdGQ6OmVuZGwgPDwgREVDUl9JTkRFTlQ7CisvLwkJfQorLy8KKy8vCQlBVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICJUTVAgQ29tcHV0aW5nIHBhdGhzIDo+ICIgPDwgc3RkOjplbmRsOworLy8JCWl0TGlzdCA9IGFueVRyYW5zaXRpb25QYXRocy5iZWdpbigpOworLy8JCWVuZExpc3QgPSBhbnlUcmFuc2l0aW9uUGF0aHMuZW5kKCk7CisvLwkJZm9yKCBhdm1fc2l6ZV90IG51bWJlciA9IDAgOyBpdExpc3QgIT0gZW5kTGlzdCA7ICsraXRMaXN0ICwgKytudW1iZXIgKQorLy8JCXsKKy8vCQkJQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiUGF0aCBudW1iZXIgOiIgPDwgbnVtYmVyIDw8ICI+IgorLy8JCQkJCTw8IHN0ZDo6ZW5kbCA8PCBJTkNSX0lOREVOVDsKKy8vCQkJQXZtVHJhbnNpdGlvbjo6dG9TdHJlYW0oQVZNX09TX1RSQUNFLCAqaXRMaXN0KTsKKy8vCQkJQVZNX09TX1RSQUNFIDw8IERFQ1JfSU5ERU5UOworLy8JCX0KKy8vCQlBVk1fT1NfVFJBQ0UgPDwgc3RkOjplbmRsOworCisJCWFUcmFuc2l0aW9uUGF0aC5jbGVhcigpOworCQlhVHJhbnNpdGlvblBhdGguc3BsaWNlKCBhbnlUcmFuc2l0aW9uUGF0aHMuZnJvbnQoKSApOworCQlhbnlUcmFuc2l0aW9uUGF0aHMucG9wX2Zyb250KCk7CisKKwkJdGd0SW5zdGFuY2UgPSBhVHJhbnNpdGlvblBhdGguYmFjaygpLT5nZXRUcmFuc2l0aW9uVGFyZ2V0KCk7CisJCWlmKCB0Z3RJbnN0YW5jZSA9PSBOVUxMICkKKwkJeworCQkJY29udGludWU7CisJCX0KKworCQlmd2RNYWNoaW5lID0gdGd0SW5zdGFuY2UtPmdldEV4ZWN1dGFibGUoKTsKKwkJaWYoIGZ3ZE1hY2hpbmUtPmdldFRyYW5zaXRpb24oKS5jb250YWlucyhhVHJhbnNpdGlvbikgKQorCQl7CisJCQlhbGxUcmFuc2l0aW9uUGF0aHMucHVzaF9iYWNrKCBhVHJhbnNpdGlvblBhdGggKTsKKwkJCWFsbFRyYW5zaXRpb25QYXRocy5iYWNrKCkucHVzaF9iYWNrKCBhVHJhbnNpdGlvbiApOworCQl9CisJCWVsc2UKKwkJeworCQkJb3V0Z29pbmdUcmFuc2l0aW9ucy5jbGVhcigpOworCQkJZndkTWFjaGluZS0+Z2V0T3V0Z29pbmdUcmFuc2l0aW9uKCBvdXRnb2luZ1RyYW5zaXRpb25zICk7CisKKwkJCWl0VHJhbnMgPSBvdXRnb2luZ1RyYW5zaXRpb25zLmJlZ2luKCk7CisJCQllbmRUcmFucyA9IG91dGdvaW5nVHJhbnNpdGlvbnMuZW5kKCk7CisJCQlmb3IoIDsgaXRUcmFucyAhPSBlbmRUcmFucyA7ICsraXRUcmFucyApCisJCQl7CisJCQkJaWYoIGFUcmFuc2l0aW9uUGF0aC5jb250YWlucyggKml0VHJhbnMgKSApCisJCQkJeworCQkJCQlwcmVmaXhMb29wVHJhbnNpdGlvblBhdGhzLnB1c2hfYmFjayggYVRyYW5zaXRpb25QYXRoICk7CisJCQkJCXByZWZpeExvb3BUcmFuc2l0aW9uUGF0aHMuYmFjaygpLnB1c2hfYmFjayggKml0VHJhbnMgKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJaWYoICh0Z3RJbnN0YW5jZSA9ICgqaXRUcmFucyktPmdldFRyYW5zaXRpb25UYXJnZXQoKSkgIT0gTlVMTCApCisJCQkJCXsKKwkJCQkJCXRndE1hY2hpbmUgPSB0Z3RJbnN0YW5jZS0+Z2V0RXhlY3V0YWJsZSgpOworCisJCQkJCQlpZiggdGd0TWFjaGluZS0+Y29udGFpbnNGb3J3YXJkUmVhY2hhYmxlVHJhbnNpdGlvbihhVHJhbnNpdGlvbikgKQorCQkJCQkJeworCQkJCQkJCWlmKCAoYVRyYW5zaXRpb25QYXRoLnNpemUoKSA8IG1Db21wdXRpbmdQYXRoU2l6ZUxpbWl0KSAmJgorCQkJCQkJCQkoYW55VHJhbnNpdGlvblBhdGhzLnNpemUoKSA8IG1Db21wdXRpbmdQYXRoQ291bnRMaW1pdCkgKQorCQkJCQkJCXsKKwkJCQkJCQkJYW55VHJhbnNpdGlvblBhdGhzLnB1c2hfYmFjayggYVRyYW5zaXRpb25QYXRoICk7CisJCQkJCQkJCWFueVRyYW5zaXRpb25QYXRocy5iYWNrKCkucHVzaF9iYWNrKCAqaXRUcmFucyApOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiTGlzdCBvZiBmb3VuZCBwYXRocyA6PiAiIDw8IHN0ZDo6ZW5kbDsKKwlMaXN0T2ZMaXN0T2ZBdm1UcmFuc2l0aW9uOjpjb25zdF9pdGVyYXRvciBpdExpc3QgPSBhbGxUcmFuc2l0aW9uUGF0aHMuYmVnaW4oKTsKKwlMaXN0T2ZMaXN0T2ZBdm1UcmFuc2l0aW9uOjpjb25zdF9pdGVyYXRvciBlbmRMaXN0ID0gYWxsVHJhbnNpdGlvblBhdGhzLmVuZCgpOworCWZvciggYXZtX3NpemVfdCBudW1iZXIgPSAwIDsgaXRMaXN0ICE9IGVuZExpc3QgOyArK2l0TGlzdCAsICsrbnVtYmVyICkKKwl7CisJCUFWTV9PU19UUkFDRSA8PCBUQUIgPDwgIlBhdGggbnVtYmVyIDoiIDw8IG51bWJlciA8PCAiIC0tPiAiCisJCQkJPDwgYVRyYW5zaXRpb24tPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgc3RkOjplbmRsIDw8IElOQ1JfSU5ERU5UOworCQlBdm1UcmFuc2l0aW9uOjp0b1N0cmVhbShBVk1fT1NfVFJBQ0UsICppdExpc3QpOworCQlBVk1fT1NfVFJBQ0UgPDwgc3RkOjplbmRsIDw8IERFQ1JfSU5ERU5UOworCX0KKworLy8JQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiTGlzdCBvZiBmb3VuZCBwcmVmaXgtcGF0aHMgOj4gIiA8PCBzdGQ6OmVuZGw7CisvLwlpdExpc3QgPSBwcmVmaXhMb29wVHJhbnNpdGlvblBhdGhzLmJlZ2luKCk7CisvLwllbmRMaXN0ID0gcHJlZml4TG9vcFRyYW5zaXRpb25QYXRocy5lbmQoKTsKKy8vCWZvciggYXZtX3NpemVfdCBudW1iZXIgPSAwIDsgaXRMaXN0ICE9IGVuZExpc3QgOyArK2l0TGlzdCAsICsrbnVtYmVyICkKKy8vCXsKKy8vCQlBVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICJQcmVmaXggbnVtYmVyIDoiIDw8IG51bWJlciA8PCAiPiAiCisvLwkJCQk8PCBzdGQ6OmVuZGwgPDwgSU5DUl9JTkRFTlQ7CisvLwkJQXZtVHJhbnNpdGlvbjo6dG9TdHJlYW0oQVZNX09TX1RSQUNFLCAqaXRMaXN0KTsKKy8vCQlBVk1fT1NfVFJBQ0UgPDwgc3RkOjplbmRsIDw8IERFQ1JfSU5ERU5UOworLy8JfQorQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisKKwlyZXR1cm4oIGFsbFRyYW5zaXRpb25QYXRocy5ub25lbXB0eSgpICk7Cit9CisKKwordm9pZCBBdm1Db3ZlcmFnZURpcmVjdGl2ZVRyYWNlQnVpbGRlcjo6Y29tcHV0ZVRhcmdldE1hY2hpbmUoCisJCVJ1bnRpbWVJRCAmIGFSSUQsIEF2bUNvZGUgKiBhQ29kZSkKK3sKKworCXN3aXRjaCggYUNvZGUtPmdldEF2bU9wQ29kZSgpICkKKwl7CisJCWNhc2UgQVZNX09QQ09ERV9FTkFCTEVfSU5WT0tFOgorCQljYXNlIEFWTV9PUENPREVfRU5BQkxFX1NFVDoKKwkJeworCQkJY29uc3QgQkYgJiB0YXJnZXRNYWNoaW5lID0gYUNvZGUtPmZpcnN0KCk7CisKKwkJCWlmKCB0YXJnZXRNYWNoaW5lLmlzPCBJbnN0YW5jZU9mTWFjaGluZSA+KCkgKQorCQkJeworCQkJCWlmKCAodGFyZ2V0TWFjaGluZS50b19wdHI8IEluc3RhbmNlT2ZNYWNoaW5lID4oKSAhPQorCQkJCQlhUklELmdldEluc3RhbmNlKCkpICYmIG1FRC0+Z2V0UnVudGltZShhUklEKS5oYXNDaGlsZCgpICkKKwkJCQl7CisJCQkJCWFSSUQgPSBtRUQtPmdldFJ1bnRpbWVGb3JtQ2hpbGQoYVJJRCwKKwkJCQkJCQl0YXJnZXRNYWNoaW5lLnRvX3B0cjwgSW5zdGFuY2VPZk1hY2hpbmUgPigpICk7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiggdGFyZ2V0TWFjaGluZS5pczwgUnVudGltZUlEID4oKSApCisJCQl7CisJCQkJYVJJRCA9IHRhcmdldE1hY2hpbmUuYmZSSUQoKTsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBBVk1fT1BDT0RFX0RJU0FCTEVfU0VMRjoKKwkJeworCQkJYVJJRCA9IGFSSUQuZ2V0UFJJRCgpOworCisJCQlicmVhazsKKwkJfQorCQljYXNlIEFWTV9PUENPREVfRElTQUJMRV9TRUxWRVM6CisJCXsKKwkJCWlmKCBhQ29kZS0+Zmlyc3QoKS5pc0ludGVnZXIoKSApCisJCQl7CisJCQkJZm9yKCBhdm1fdWludGVnZXJfdCBsZXZlbCA9IGFDb2RlLT5maXJzdCgpLnRvSW50ZWdlcigpIDsKKwkJCQkJCWxldmVsID4gMCA7IC0tbGV2ZWwgKQorCQkJCXsKKwkJCQkJYVJJRCA9IGFSSUQuZ2V0UFJJRCgpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlhUklEID0gYVJJRC5nZXRQUklEKCk7CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisJCWRlZmF1bHQ6CisJCXsKKwkJCWlmKCBTdGF0ZW1lbnRUeXBlQ2hlY2tlcjo6aXNTY2hlZHVsZShhQ29kZSkgKQorCQkJeworCQkJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYUNvZGUtPmJlZ2luKCk7CisJCQkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBhQ29kZS0+ZW5kKCk7CisJCQkJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJCQkJeworCQkJCQlpZiggKCppdCkuaXM8IEF2bUNvZGUgPigpICkKKwkJCQkJeworCQkJCQkJY29tcHV0ZVRhcmdldE1hY2hpbmUoYVJJRCwgKCppdCkudG9fcHRyPCBBdm1Db2RlID4oKSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KK30KKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9jb3ZlcmFnZS9Bdm1Db3ZlcmFnZURpcmVjdGl2ZVRyYWNlQnVpbGRlci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2NvdmVyYWdlL0F2bUNvdmVyYWdlRGlyZWN0aXZlVHJhY2VCdWlsZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdlODQ5OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9jb3ZlcmFnZS9Bdm1Db3ZlcmFnZURpcmVjdGl2ZVRyYWNlQnVpbGRlci5oCkBAIC0wLDAgKzEsNTQ0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTcgamFudi4gMjAxNQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEFWTV9QUk9DRVNTX0NPVkVSQUdFX0FWTUNPVkVSQUdFRElSRUNUSVZFVFJBQ0VCVUlMREVSX0hfCisjZGVmaW5lIEFWTV9QUk9DRVNTX0NPVkVSQUdFX0FWTUNPVkVSQUdFRElSRUNUSVZFVFJBQ0VCVUlMREVSX0hfCisKKyNpbmNsdWRlIDxjb2xsZWN0aW9uL0xpc3QuaD4KKyNpbmNsdWRlIDxjb2xsZWN0aW9uL1R5cGVkZWYuaD4KKworI2luY2x1ZGUgPGZtbC9idWZmZXIvTGlmb0J1ZmZlci5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvQXZtVHJhbnNpdGlvbi5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZCdWZmZXIuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkRhdGEuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lSUQuaD4KKworI2luY2x1ZGUgPGZtbC90cmFjZS9UcmFjZVBvaW50Lmg+CisjaW5jbHVkZSA8Zm1sL3RyYWNlL1RyYWNlU2VxdWVuY2UuaD4KKworI2luY2x1ZGUgPGZhbS9jb3ZlcmFnZS9Bdm1Db3ZlcmFnZUhldXJpc3RpY1Byb3BlcnR5Lmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBBdm1Db3ZlcmFnZVRyYW5zaXRpb25WaWV3OworY2xhc3MgT3V0U3RyZWFtOworCitjbGFzcyBFeGVjdXRhYmxlRm9ybTsKK2NsYXNzIEV4ZWN1dGlvbkNvbnRleHQ7CitjbGFzcyBBUEV4ZWN1dGlvbkRhdGE7CisKK2NsYXNzIEluc3RhbmNlT2ZNYWNoaW5lOworY2xhc3MgSW5zdGFuY2VPZlBvcnQ7CisKK2NsYXNzIFJ1bnRpbWVGb3JtOworCisKK2NsYXNzIEF2bVRyYWNlUHJvcGVydHkgIDogIHB1YmxpYyBUcmFjZVNlcXVlbmNlCit7CisKK3B1YmxpYzoKKwkvKioKKwkgKiBBVFRSSUJVVEUKKwkgKi8KKwlBdm1Db3ZlcmFnZVRyYW5zaXRpb25WaWV3ICogbVRyYW5zaXRpb25Db3ZlcmFnZTsKKworCWF2bV9zaXplX3QgbVNpemU7CisKKwlhdm1fc2l6ZV90IG1VbmNvdmVyZWRDb3VudDsKKworCWF2bV9zaXplX3QgbUd1YXJkQ291bnQ7CisKKwlhdm1fc2l6ZV90IG1VbmNvbmRpdGlvbmFsQ291bnQ7CisKKwlhdm1fc2l6ZV90IG1VbnN0YWJsZUNvdW50OworCisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlBdm1UcmFjZVByb3BlcnR5KEF2bUNvdmVyYWdlVHJhbnNpdGlvblZpZXcgKiBhVHJhbnNpdGlvbkNvdmVyYWdlKQorCTogVHJhY2VTZXF1ZW5jZSggQ0xBU1NfS0lORF9UKCBBdm1UcmFjZVByb3BlcnR5ICkgKSwKKwltVHJhbnNpdGlvbkNvdmVyYWdlKCBhVHJhbnNpdGlvbkNvdmVyYWdlICksCisJbVNpemUoIDAgKSwKKwltVW5jb3ZlcmVkQ291bnQoIDAgKSwKKwltR3VhcmRDb3VudCggMCApLAorCW1VbmNvbmRpdGlvbmFsQ291bnQoIDAgKSwKKwltVW5zdGFibGVDb3VudCggMCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlBdm1UcmFjZVByb3BlcnR5KEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDID0gTlVMTCkKKwk6IFRyYWNlU2VxdWVuY2UoIGFuRUMgKSwKKwltVHJhbnNpdGlvbkNvdmVyYWdlKCBOVUxMICksCisJbVNpemUoIDAgKSwKKwltVW5jb3ZlcmVkQ291bnQoIDAgKSwKKwltR3VhcmRDb3VudCggMCApLAorCW1VbmNvbmRpdGlvbmFsQ291bnQoIDAgKSwKKwltVW5zdGFibGVDb3VudCggMCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIENvcHkKKwkgKi8KKwlBdm1UcmFjZVByb3BlcnR5KGNvbnN0IFRyYWNlU2VxdWVuY2UgJiBhVHJhY2UpCisJOiBUcmFjZVNlcXVlbmNlKCBhVHJhY2UgKSwKKwltVHJhbnNpdGlvbkNvdmVyYWdlKCBOVUxMICksCisJbVNpemUoIDAgKSwKKwltVW5jb3ZlcmVkQ291bnQoIDAgKSwKKwltR3VhcmRDb3VudCggMCApLAorCW1VbmNvbmRpdGlvbmFsQ291bnQoIDAgKSwKKwltVW5zdGFibGVDb3VudCggMCApCisJeworCQl1cGRhZGVTaXplKCk7CisJfQorCisJQXZtVHJhY2VQcm9wZXJ0eShjb25zdCBBdm1UcmFjZVByb3BlcnR5ICYgYVRyYWNlUHJvcGVydHkpCisJOiBUcmFjZVNlcXVlbmNlKCBhVHJhY2VQcm9wZXJ0eSApLAorCW1UcmFuc2l0aW9uQ292ZXJhZ2UoIGFUcmFjZVByb3BlcnR5Lm1UcmFuc2l0aW9uQ292ZXJhZ2UgKSwKKwltU2l6ZSggYVRyYWNlUHJvcGVydHkubVNpemUgKSwKKwltVW5jb3ZlcmVkQ291bnQoIGFUcmFjZVByb3BlcnR5Lm1VbmNvdmVyZWRDb3VudCApLAorCW1HdWFyZENvdW50KCBhVHJhY2VQcm9wZXJ0eS5tR3VhcmRDb3VudCApLAorCW1VbmNvbmRpdGlvbmFsQ291bnQoIGFUcmFjZVByb3BlcnR5Lm1VbmNvbmRpdGlvbmFsQ291bnQgKSwKKwltVW5zdGFibGVDb3VudCggYVRyYWNlUHJvcGVydHkubVVuc3RhYmxlQ291bnQgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkF2bVRyYWNlUHJvcGVydHkoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBDb25maWd1cmUKKwkgKi8KKwlpbmxpbmUgYm9vbCBjb25maWd1cmUoQXZtVHJhY2VQcm9wZXJ0eSAmIGFUcmFjZUVsZW1lbnQpCisJeworCQljbGVhcigpOworCisJCW1UcmFuc2l0aW9uQ292ZXJhZ2UgPSBhVHJhY2VFbGVtZW50Lm1UcmFuc2l0aW9uQ292ZXJhZ2U7CisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisKKwkvKioKKwkgKiBVdGlscyBmb3IgVHJhY2VTZXF1ZW5jZQorCSAqLworCXZvaWQgY2hlY2tEZWNyZW1lbnRhdGlvbihBdm1UcmFuc2l0aW9uICogYVRyYW5zaXRpb24pOworCisJdm9pZCBjaGVja0luY3JlbWVudGF0aW9uKEF2bVRyYW5zaXRpb24gKiBhVHJhbnNpdGlvbik7CisKKworCWlubGluZSB2b2lkIGFwcGVuZChjb25zdCBSdW50aW1lSUQgJiBhUklELCBBdm1UcmFuc2l0aW9uICogYVRyYW5zaXRpb24pCisJeworCQlwb2ludHMucHVzaF9iYWNrKCBCRiggbmV3IFRyYWNlUG9pbnQoCisJCQkJRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfVFJBTlNJVElPTl9OQVRVUkUsCisJCQkJQVZNX09QQ09ERV9JTlZPS0VfVFJBTlNJVElPTiwgYVJJRCwgYVRyYW5zaXRpb24pICkgKTsKKworCQkrK21TaXplOworCQljaGVja0luY3JlbWVudGF0aW9uKCBhVHJhbnNpdGlvbiApOworCX0KKworCWlubGluZSB2b2lkIGNsZWFyKCkKKwl7CisJCXBvaW50cy5jbGVhcigpOworCQltU2l6ZSA9IDA7CisJCW1VbmNvdmVyZWRDb3VudCA9IDA7CisJCW1HdWFyZENvdW50ID0gMDsKKwkJbVVuY29uZGl0aW9uYWxDb3VudCA9IDA7CisJCW1VbnN0YWJsZUNvdW50ID0gMDsKKwl9CisKKwlpbmxpbmUgdm9pZCBjb3B5VHJhY2UoQXZtVHJhY2VQcm9wZXJ0eSAmIGFUcmFjZUVsZW1lbnQpCisJeworCQlUcmFjZVNlcXVlbmNlOjpjb3B5VHJhY2UoIGFUcmFjZUVsZW1lbnQgKTsKKworCQltVHJhbnNpdGlvbkNvdmVyYWdlID0gYVRyYWNlRWxlbWVudC5tVHJhbnNpdGlvbkNvdmVyYWdlOworCisJCW1TaXplID0gYVRyYWNlRWxlbWVudC5tU2l6ZTsKKwkJbVVuY292ZXJlZENvdW50ID0gYVRyYWNlRWxlbWVudC5tVW5jb3ZlcmVkQ291bnQ7CisJCW1HdWFyZENvdW50ID0gYVRyYWNlRWxlbWVudC5tR3VhcmRDb3VudDsKKwkJbVVuY29uZGl0aW9uYWxDb3VudCA9IGFUcmFjZUVsZW1lbnQubVVuY29uZGl0aW9uYWxDb3VudDsKKwkJbVVuc3RhYmxlQ291bnQgPSBhVHJhY2VFbGVtZW50Lm1VbnN0YWJsZUNvdW50OworCX0KKworCisJaW5saW5lIGJvb2wgZW1wdHkoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtU2l6ZSA9PSAwICk7CisJfQorCisKKwlpbmxpbmUgdm9pZCBwb3BfYmFjayhhdm1fc2l6ZV90IHB0c0NvdW50KQorCXsKKwkJbVNpemUgPSBtU2l6ZSAtIHB0c0NvdW50OworCQlmb3IoIDsgcHRzQ291bnQgPiAwIDsgLS1wdHNDb3VudCApCisJCXsKKwkJCWNoZWNrRGVjcmVtZW50YXRpb24oIGJhY2tUcmFuc2l0aW9uKCkgKTsKKworCQkJcG9pbnRzLnBvcF9iYWNrKCk7CisJCX0KKwl9CisKKwlpbmxpbmUgdm9pZCBwb3BfZnJvbnQoYXZtX3NpemVfdCBwdHNDb3VudCkKKwl7CisJCW1TaXplID0gbVNpemUgLSBwdHNDb3VudDsKKwkJZm9yKCA7IHB0c0NvdW50ID4gMCA7IC0tcHRzQ291bnQgKQorCQl7CisJCQljaGVja0RlY3JlbWVudGF0aW9uKCBmcm9udFRyYW5zaXRpb24oKSApOworCisJCQlwb2ludHMucG9wX2Zyb250KCk7CisJCX0KKwl9CisKKwlpbmxpbmUgdm9pZCByZXNpemUoYXZtX3NpemVfdCBuZXdTaXplKQorCXsKKwkJaWYoIG5ld1NpemUgPT0gMCApCisJCXsKKwkJCWNsZWFyKCk7CisJCX0KKwkJZWxzZSBmb3IoIDsgbVNpemUgPiBuZXdTaXplIDsgLS1tU2l6ZSApCisJCXsKKwkJCWNoZWNrRGVjcmVtZW50YXRpb24oIGJhY2tUcmFuc2l0aW9uKCkgKTsKKworCQkJcG9pbnRzLnBvcF9iYWNrKCk7CisJCX0KKwl9CisKKworCS8qKgorCSAqIG1TaXplCisJICogbVVuY29uZGl0aW9uYWxDb3VudAorCSAqIG1VbnN0YWJsZUNvdW50CisJICovCisJdm9pZCB1cGRhZGVTaXplKCk7CisKKworCWlubGluZSBhdm1fc2l6ZV90IHhTaXplKCkgY29uc3QKKwl7CisvLwkJcmV0dXJuKCBtU2l6ZSApOworLy8JCXJldHVybiggbVNpemUgLSBtVW5jb25kaXRpb25hbENvdW50ICk7CisvLwkJcmV0dXJuKCBtU2l6ZSAtIG1VbmNvbmRpdGlvbmFsQ291bnQgLSBtVW5zdGFibGVDb3VudCApOworCisvLwkJaWYoIGJhY2tUcmFuc2l0aW9uKCktPmlzVW5zdGFibGVUYXJnZXQoKSApCisvLwkJeworLy8JCQlyZXR1cm4oIDIgKiBtU2l6ZSArIG1HdWFyZENvdW50IC0KKy8vCQkJCQltVW5jb3ZlcmVkQ291bnQgLSBtVW5jb25kaXRpb25hbENvdW50IC0gbVVuc3RhYmxlQ291bnQgKTsKKy8vCQl9CisvLwkJZWxzZQorCQl7CisJCQlyZXR1cm4oIG1TaXplICsgbUd1YXJkQ291bnQgLQorCQkJCQltVW5jb3ZlcmVkQ291bnQgLSBtVW5jb25kaXRpb25hbENvdW50IC0gbVVuc3RhYmxlQ291bnQgKTsKKwkJfQorCX0KKworCisJYm9vbCBjb21wYXJlKCBib29sICgqIGlzQ29tcCkoYXZtX3NpemVfdCwgYXZtX3NpemVfdCksCisJCQljb25zdCBBdm1UcmFjZVByb3BlcnR5ICYgYVRyYWNlRWxlbWVudCApOworCisJdGVtcGxhdGU8IGNsYXNzIENvbXBhcmUgPgorCWJvb2wgaXNJbmYoQ29tcGFyZSBpc0NvbXAsIGNvbnN0IEF2bVRyYWNlUHJvcGVydHkgJiBhVHJhY2VFbGVtZW50KQorCXsKKwkJcmV0dXJuKCBpc0NvbXAoeFNpemUoKSwgYVRyYWNlRWxlbWVudC54U2l6ZSgpKSApOworCX0KKworCXRlbXBsYXRlPCBjbGFzcyBDb21wYXJlID4KKwlib29sIGlzU3VwKENvbXBhcmUgaXNDb21wLCBjb25zdCBBdm1UcmFjZVByb3BlcnR5ICYgYVRyYWNlRWxlbWVudCkKKwl7CisJCXJldHVybiggaXNDb21wKHhTaXplKCksIGFUcmFjZUVsZW1lbnQueFNpemUoKSkgKTsKKwl9CisKKworCWlubGluZSBib29sIHNpemVFUShjb25zdCBBdm1UcmFjZVByb3BlcnR5ICYgYVRyYWNlRWxlbWVudCkgY29uc3QKKwl7CisJCXJldHVybiggeFNpemUoKSA9PSBhVHJhY2VFbGVtZW50LnhTaXplKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBzaXplR1QoY29uc3QgQXZtVHJhY2VQcm9wZXJ0eSAmIGFUcmFjZUVsZW1lbnQpIGNvbnN0CisJeworCQlyZXR1cm4oIHhTaXplKCkgPiBhVHJhY2VFbGVtZW50LnhTaXplKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBzaXplR1RFKGNvbnN0IEF2bVRyYWNlUHJvcGVydHkgJiBhVHJhY2VFbGVtZW50KSBjb25zdAorCXsKKwkJcmV0dXJuKCB4U2l6ZSgpID49IGFUcmFjZUVsZW1lbnQueFNpemUoKSApOworCX0KKworCWlubGluZSBib29sIHNpemVMVChjb25zdCBBdm1UcmFjZVByb3BlcnR5ICYgYVRyYWNlRWxlbWVudCkgY29uc3QKKwl7CisJCXJldHVybiggeFNpemUoKSA8IGFUcmFjZUVsZW1lbnQueFNpemUoKSApOworCX0KKworCWlubGluZSBib29sIHNpemVMVEUoY29uc3QgQXZtVHJhY2VQcm9wZXJ0eSAmIGFUcmFjZUVsZW1lbnQpIGNvbnN0CisJeworCQlyZXR1cm4oIHhTaXplKCkgPD0gYVRyYWNlRWxlbWVudC54U2l6ZSgpICk7CisJfQorCisKKwkvKioKKwkgKiBiYWNrIC8gZnJvbnQ7CisJICogQXZtVHJhbnNpdGlvbgorCSAqLworCWlubGluZSBBdm1UcmFuc2l0aW9uICogYmFja1RyYW5zaXRpb24oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBwb2ludHMuYmFjaygpLnRvX3B0cjwgVHJhY2VQb2ludCA+KCktPgorCQkJCW9iamVjdC0+dG88IEF2bVRyYW5zaXRpb24gPigpICk7CisJfQorCisJaW5saW5lIEF2bVRyYW5zaXRpb24gKiBmcm9udFRyYW5zaXRpb24oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBwb2ludHMuZnJvbnQoKS50b19wdHI8IFRyYWNlUG9pbnQgPigpLT4KKwkJCQlvYmplY3QtPnRvPCBBdm1UcmFuc2l0aW9uID4oKSApOworCX0KKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwl2aXJ0dWFsIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MsIGJvb2wgdmVyYm9zZSA9IGZhbHNlKSBjb25zdDsKKworfTsKKworCitERUZJTkVfTElTVF9SRUYoIEF2bVRyYWNlUHJvcGVydHkgKQorCisKKworY2xhc3MgQXZtQ292ZXJhZ2VEaXJlY3RpdmVUcmFjZUJ1aWxkZXIgIDogIHB1YmxpYyBJSGV1cmlzdGljQ2xhc3MKK3sKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIFRZUEVERUYKKwkgKi8KKwl0eXBlZGVmIExpc3Q8IExpc3RPZkF2bVRyYW5zaXRpb24gPiBMaXN0T2ZMaXN0T2ZBdm1UcmFuc2l0aW9uOworCisKKwkvKioKKwkgKiBBVFRSSUJVVEUKKwkgKi8KKwljb25zdCBFeGVjdXRpb25Db250ZXh0ICogbUVDOworCUFQRXhlY3V0aW9uRGF0YSBtRUQ7CisJUnVudGltZUlEIG1SSUQ7CisJQXZtVHJhbnNpdGlvbiAqIG1UcmFuc2l0aW9uOworCisJVHJhY2VQb2ludCAqIG1UcmFuc2l0aW9uUG9pbnQ7CisJQXZtVHJhY2VQcm9wZXJ0eSBtVHJhY2VFbGVtZW50OworCisJYXZtX3NpemVfdCBtQ29tcHV0aW5nUGF0aENvdW50TGltaXQ7CisJYXZtX3NpemVfdCBtQ29tcHV0aW5nUGF0aFNpemVMaW1pdDsKKworCWJvb2wgbUdvYWxBY2hpZXZlZEZsYWc7CisKKy8vCUxpc3RPZkF2bVRyYW5zaXRpb24gbVRyYW5zaXRpb25QYXRoOworLy8JTGlzdE9mSW5zdGFuY2VPZlBvcnQgbUV4cGVjdGVkSW5wdXQ7CisJSW5zdGFuY2VPZkJ1ZmZlciBtVmlydHVhbEJ1ZmZlcjsKKwlMaWZvQnVmZmVyIG1FbWl0T3V0cHV0OworCisJVGFibGVPZlJ1bnRpbWVGb3JtU3RhdGUgbVRhYmxlT2ZSdW50aW1lU3RhdHVzOworCisKKwkvLyBjb21wdXRpbmcgdmFyaWFibGUgZm9yIG1ldGhvZCA8PCBjb21wdXRlUGF0aFRvVHJhbnNpdGlvbiA+PgorCUxpc3RPZkxpc3RPZkF2bVRyYW5zaXRpb24gYW55VHJhbnNpdGlvblBhdGhzOworCUxpc3RPZkxpc3RPZkF2bVRyYW5zaXRpb24gcHJlZml4TG9vcFRyYW5zaXRpb25QYXRoczsKKworCUxpc3RPZkF2bVRyYW5zaXRpb24gb3V0Z29pbmdUcmFuc2l0aW9uczsKKwlMaXN0T2ZBdm1UcmFuc2l0aW9uIGFUcmFuc2l0aW9uUGF0aDsKKwlMaXN0T2ZBdm1UcmFuc2l0aW9uOjpjb25zdF9pdGVyYXRvciBpdFRyYW5zOworCUxpc3RPZkF2bVRyYW5zaXRpb246OmNvbnN0X2l0ZXJhdG9yIGVuZFRyYW5zOworCisJSW5zdGFuY2VPZk1hY2hpbmUgKiB0Z3RJbnN0YW5jZTsKKwlFeGVjdXRhYmxlRm9ybSAqIGZ3ZE1hY2hpbmU7CisJRXhlY3V0YWJsZUZvcm0gKiB0Z3RNYWNoaW5lOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlBdm1Db3ZlcmFnZURpcmVjdGl2ZVRyYWNlQnVpbGRlcigKKwkJCUVOVU1fSEVVUklTVElDX0NMQVNTIGFuSGV1cmlzdGljQ2xhc3MgPSBIRVVSSVNUSUNfU01BUlRfQ0xBU1MsCisJCQlhdm1fc2l6ZV90IHBhdGhDb3VudExpbWl0ID0gMzIsIGF2bV9zaXplX3QgcGF0aFNpemVMaW1pdCA9IDMyKQorCTogSUhldXJpc3RpY0NsYXNzKCBhbkhldXJpc3RpY0NsYXNzICksCisJbUVDKCBOVUxMICksCisJbUVEKCApLAorCW1SSUQoICksCisKKwltVHJhbnNpdGlvbiggTlVMTCApLAorCW1UcmFuc2l0aW9uUG9pbnQoIE5VTEwgKSwKKworCW1UcmFjZUVsZW1lbnQoICksCisKKwltQ29tcHV0aW5nUGF0aENvdW50TGltaXQoIHBhdGhDb3VudExpbWl0ICksCisJbUNvbXB1dGluZ1BhdGhTaXplTGltaXQoIHBhdGhTaXplTGltaXQgKSwKKworCW1Hb2FsQWNoaWV2ZWRGbGFnKCBmYWxzZSApLAorCisJLy9tVHJhbnNpdGlvblBhdGgoICksCisJLy9tRXhwZWN0ZWRJbnB1dCggKSwKKwltVmlydHVhbEJ1ZmZlcihOVUxMLCBOVUxMLCAwLCBUWVBFX01VTFRJX0xJRk9fU1BFQ0lGSUVSLCAtMSksCisJbUVtaXRPdXRwdXQoICYgbVZpcnR1YWxCdWZmZXIgKSwKKworCW1UYWJsZU9mUnVudGltZVN0YXR1cyggMCApLAorCisJLy8gY29tcHV0aW5nIHZhcmlhYmxlIGZvciBtZXRob2QgPDwgY29tcHV0ZVBhdGhUb1RyYW5zaXRpb24gPj4KKwlhbnlUcmFuc2l0aW9uUGF0aHMoICksCisJcHJlZml4TG9vcFRyYW5zaXRpb25QYXRocyggKSwKKworCW91dGdvaW5nVHJhbnNpdGlvbnMoICksCisJYVRyYW5zaXRpb25QYXRoKCApLAorCWl0VHJhbnMoICksCisJZW5kVHJhbnMoICksCisKKwl0Z3RJbnN0YW5jZSggTlVMTCApLAorCWZ3ZE1hY2hpbmUoIE5VTEwgKSwKKwl0Z3RNYWNoaW5lKCBOVUxMICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBPdGhlcgorCSAqLworCUF2bUNvdmVyYWdlRGlyZWN0aXZlVHJhY2VCdWlsZGVyKAorCQkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMsIFRyYWNlUG9pbnQgKiB0cFRyYW5zaXRpb24sCisJCQlFTlVNX0hFVVJJU1RJQ19DTEFTUyBhbkhldXJpc3RpY0NsYXNzID0gSEVVUklTVElDX1NNQVJUX0NMQVNTLAorCQkJYXZtX3NpemVfdCBwYXRoQ291bnRMaW1pdCA9IDY0LCBhdm1fc2l6ZV90IHBhdGhTaXplTGltaXQgPSA2NCk7CisKKwlBdm1Db3ZlcmFnZURpcmVjdGl2ZVRyYWNlQnVpbGRlcihjb25zdCBFeGVjdXRpb25Db250ZXh0ICogYW5FQywKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsIEF2bVRyYW5zaXRpb24gKiBhVHJhbnNpdGlvbiwKKwkJCUVOVU1fSEVVUklTVElDX0NMQVNTIGFuSGV1cmlzdGljQ2xhc3MgPSBIRVVSSVNUSUNfU01BUlRfQ0xBU1MsCisJCQlhdm1fc2l6ZV90IHBhdGhDb3VudExpbWl0ID0gMTYsIGF2bV9zaXplX3QgcGF0aFNpemVMaW1pdCA9IDE2KTsKKworCisJLyoqCisJICogbUNvbXB1dGluZ1BhdGhDb3VudExpbWl0CisJICogbUNvbXB1dGluZ1BhdGhTaXplTGltaXQKKwkgKi8KKwl2b2lkIHNldENvbXB1dGluZ0xpbWl0KGF2bV9zaXplX3QgcGF0aENvdW50TGltaXQsIGF2bV9zaXplX3QgcGF0aFNpemVMaW1pdCkKKwl7CisJCW1Db21wdXRpbmdQYXRoQ291bnRMaW1pdCA9IHBhdGhDb3VudExpbWl0OworCQltQ29tcHV0aW5nUGF0aFNpemVMaW1pdCAgPSBwYXRoU2l6ZUxpbWl0OworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIENvbmZpZ3VyZQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWJvb2wgY29uZmlndXJlKEF2bVRyYWNlUHJvcGVydHkgJiBhVHJhY2VFbGVtZW50LAorCQkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMsIFRyYWNlUG9pbnQgKiB0cFRyYW5zaXRpb24sCisJCQlFTlVNX0hFVVJJU1RJQ19DTEFTUyBhbkhldXJpc3RpY0NsYXNzID0gSEVVUklTVElDX1NNQVJUX0NMQVNTLAorCQkJYXZtX3NpemVfdCBwYXRoQ291bnRMaW1pdCA9IDY0LCBhdm1fc2l6ZV90IHBhdGhTaXplTGltaXQgPSA2NCk7CisKKwlib29sIGNvbmZpZ3VyZShBdm1UcmFjZVByb3BlcnR5ICYgYVRyYWNlRWxlbWVudCwKKwkJCWNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDLAorCQkJY29uc3QgUnVudGltZUlEICYgYVJJRCwgQXZtVHJhbnNpdGlvbiAqIGFUcmFuc2l0aW9uLAorCQkJRU5VTV9IRVVSSVNUSUNfQ0xBU1MgYW5IZXVyaXN0aWNDbGFzcyA9IEhFVVJJU1RJQ19TTUFSVF9DTEFTUywKKwkJCWF2bV9zaXplX3QgcGF0aENvdW50TGltaXQgPSAxNiwgYXZtX3NpemVfdCBwYXRoU2l6ZUxpbWl0ID0gMTYpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJYm9vbCBpbml0aWFsaXplKCk7CisKKwlib29sIGNvbXB1dGVQYXRoKCk7CisKKwlib29sIGNvbXB1dGVQYXRoKEF2bVRyYWNlUHJvcGVydHkgJiBhVHJhY2VFbGVtZW50KTsKKworCWJvb2wgY29tcHV0ZVBhdGgoQXZtVHJhY2VQcm9wZXJ0eSAmIGFUcmFjZUVsZW1lbnQsIEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDLAorCQkJY29uc3QgUnVudGltZUlEICYgYVJJRCwgQXZtVHJhbnNpdGlvbiAqIGFUcmFuc2l0aW9uLAorCQkJRU5VTV9IRVVSSVNUSUNfQ0xBU1MgYW5IZXVyaXN0aWNDbGFzcyA9IEhFVVJJU1RJQ19TTUFSVF9DTEFTUywKKwkJCWF2bV9zaXplX3QgcGF0aENvdW50TGltaXQgPSAxNiwgYXZtX3NpemVfdCBwYXRoU2l6ZUxpbWl0ID0gMTYpOworCisJdm9pZCByZXBvcnQoT3V0U3RyZWFtICYgb3MpOworCisKKwlib29sIGNvbXB1dGVQYXRoKGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsIEF2bVRyYW5zaXRpb24gKiBhVHJhbnNpdGlvbik7CisKKwlib29sIGZpcmVUcmFuc2l0aW9uKGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsIEF2bVRyYW5zaXRpb24gKiBhVHJhbnNpdGlvbik7CisKKwl2b2lkIHRyYWNlVHJhbnNpdGlvbihjb25zdCBSdW50aW1lSUQgJiBhUklELCBBdm1UcmFuc2l0aW9uICogYVRyYW5zaXRpb24pOworCisJYm9vbCBjb21wdXRlUGF0aFRvVHJhbnNpdGlvbigKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsIEF2bVRyYW5zaXRpb24gKiBhVHJhbnNpdGlvbik7CisKKworCWlubGluZSBib29sIGNvbXB1dGVQYXRoRnJvbVJ1bm5hYmxlKAorCQkJY29uc3QgUnVudGltZUlEICYgYVJJRCwgQXZtVHJhbnNpdGlvbiAqIGFUcmFuc2l0aW9uKQorCXsKKwkJc3dpdGNoKCBtSGV1cmlzdGljQ2xhc3MgKQorCQl7CisJCQljYXNlIElIZXVyaXN0aWNDbGFzczo6SEVVUklTVElDX0JBU0lDX0NMQVNTOgorCQkJeworCQkJCXJldHVybiggY29tcHV0ZUJhc2ljUGF0aEZyb21SdW5uYWJsZShhUklELCBhVHJhbnNpdGlvbikgKTsKKwkJCX0KKworCQkJY2FzZSBJSGV1cmlzdGljQ2xhc3M6OkhFVVJJU1RJQ19OQUlWRV9DTEFTUzoKKwkJCWNhc2UgSUhldXJpc3RpY0NsYXNzOjpIRVVSSVNUSUNfU01BUlRfQ0xBU1M6CisJCQljYXNlIElIZXVyaXN0aWNDbGFzczo6SEVVUklTVElDX0FHUkVTU0lWRV9DTEFTUzoKKwkJCWNhc2UgSUhldXJpc3RpY0NsYXNzOjpIRVVSSVNUSUNfTk9USElOR19FTFNFX0NMQVNTOgorCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQlyZXR1cm4oIGNvbXB1dGVTbWFydFBhdGhGcm9tUnVubmFibGUoYVJJRCwgYVRyYW5zaXRpb24pICk7CisJCQl9CisJCX0KKwl9CisKKwlib29sIGNvbXB1dGVCYXNpY1BhdGhGcm9tUnVubmFibGUoCisJCQljb25zdCBSdW50aW1lSUQgJiBhUklELCBBdm1UcmFuc2l0aW9uICogYVRyYW5zaXRpb24pOworCisJYm9vbCBjb21wdXRlU21hcnRQYXRoRnJvbVJ1bm5hYmxlKAorCQkJY29uc3QgUnVudGltZUlEICYgYVJJRCwgQXZtVHJhbnNpdGlvbiAqIGFUcmFuc2l0aW9uKTsKKworCisJYm9vbCBjb21wdXRlUGF0aFRvSW5wdXQoCisJCQljb25zdCBSdW50aW1lSUQgJiBhUklELCBJbnN0YW5jZU9mUG9ydCAqIGFuSW5wdXRUcmFjZSk7CisKKworCWJvb2wgY29tcHV0ZVBhdGhUb1RyYW5zaXRpb24oCisJCQljb25zdCBSdW50aW1lSUQgJiBhUklELCBBdm1UcmFuc2l0aW9uICogYVRyYW5zaXRpb24sCisJCQlMaXN0T2ZBdm1UcmFuc2l0aW9uICYgb25lVHJhbnNpdGlvblBhdGgpOworCisJYm9vbCBjb21wdXRlUGF0aFRvVHJhbnNpdGlvbigKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsIEF2bVRyYW5zaXRpb24gKiBhVHJhbnNpdGlvbiwKKwkJCUxpc3RPZkxpc3RPZkF2bVRyYW5zaXRpb24gJiBhbGxUcmFuc2l0aW9uUGF0aHMpOworCisJdm9pZCBjb21wdXRlVGFyZ2V0TWFjaGluZShSdW50aW1lSUQgJiBhUklELCBBdm1Db2RlICogYUNvZGUpOworCit9OworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworCisjZW5kaWYgLyogQVZNX1BST0NFU1NfQ09WRVJBR0VfQVZNQ09WRVJBR0VESVJFQ1RJVkVUUkFDRUJVSUxERVJfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9jb3ZlcmFnZS9Bdm1Db3ZlcmFnZUhldXJpc3RpY1Byb3BlcnR5LmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9jb3ZlcmFnZS9Bdm1Db3ZlcmFnZUhldXJpc3RpY1Byb3BlcnR5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGQyM2MwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2NvdmVyYWdlL0F2bUNvdmVyYWdlSGV1cmlzdGljUHJvcGVydHkuY3BwCkBAIC0wLDAgKzEsMzA1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTUgamFudi4gMjAxNQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQXZtQ292ZXJhZ2VIZXVyaXN0aWNQcm9wZXJ0eS5oIgorCisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1F1ZXJ5Lmg+CisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1dPYmplY3QuaD4KKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorICoKKyAqIHN0ckhldXJpc3RpY1dlaWdodAorICovCitzdGQ6OnN0cmluZyBJSGV1cmlzdGljQ29udGV4dFdlaWdodDo6c3RySGV1cmlzdGljV2VpZ2h0KGF2bV91aW50OF90IGFXZWlnaHQpCit7CisJc3dpdGNoKCBhV2VpZ2h0ICkKKwl7CisJCWNhc2UgV0VJR0hUX1NFTEVDVEVEX0FDSElFVkFCTEUgIDogcmV0dXJuKCAiU0VMRUNURURfQUNISUVWQUJMRSIgICk7CisKKwkJY2FzZSBXRUlHSFRfQ0VSVEFJTkxZX0FDSElFVkFCTEUgOiByZXR1cm4oICJDRVJUQUlOTFlfQUNISUVWQUJMRSIgKTsKKwkJY2FzZSBXRUlHSFRfU1RST05HTFlfQUNISUVWQUJMRSAgOiByZXR1cm4oICJTVFJPTkdMWV9BQ0hJRVZBQkxFIiAgKTsKKwkJY2FzZSBXRUlHSFRfV0VBS0xZX0FDSElFVkFCTEUgICAgOiByZXR1cm4oICJXRUFLTFlfQUNISUVWQUJMRSIgICAgKTsKKworCQljYXNlIFdFSUdIVF9OT05fUFJJT1JJVFkgICAgICAgICA6IHJldHVybiggIk5PTl9QUklPUklUWSIgICAgICAgICApOworCQljYXNlIFdFSUdIVF9VTktOT1dOX0FDSElFVkFCTEUgICA6IHJldHVybiggIlVOS05PV05fQUNISUVWQUJMRSIgICApOworCisJCWNhc2UgV0VJR0hUX05PTl9BQ0hJRVZBQkxFICAgICAgIDogcmV0dXJuKCAiVU5BQ0hJRVZBQkxFIiAgICAgICAgICk7CisKKwkJZGVmYXVsdDogcmV0dXJuKCB0b19zdHJpbmcoIHN0YXRpY19jYXN0PCBpbnQgPihhV2VpZ2h0KSApICk7CisJfQorfQorCisKKy8qKgorICogU0VUVEVSCisgKiBtSGV1cmlzdGljQ2xhc3MKKyAqLworSUhldXJpc3RpY0NsYXNzOjpFTlVNX0hFVVJJU1RJQ19DTEFTUworSUhldXJpc3RpY0NsYXNzOjppbmNySGV1cmlzdGljQ2xhc3MoRU5VTV9IRVVSSVNUSUNfQ0xBU1MgYW5IZXVyaXN0aWNDbGFzcykKK3sKKwlzd2l0Y2goIGFuSGV1cmlzdGljQ2xhc3MgKQorCXsKKwkJY2FzZSBIRVVSSVNUSUNfQkFTSUNfQ0xBU1M6CisJCXsKKwkJCXJldHVybiggSEVVUklTVElDX05BSVZFX0NMQVNTICk7CisJCX0KKworCQljYXNlIEhFVVJJU1RJQ19OQUlWRV9DTEFTUzoKKwkJeworCQkJcmV0dXJuKCBIRVVSSVNUSUNfU01BUlRfQ0xBU1MgKTsKKwkJfQorCisJCWNhc2UgSEVVUklTVElDX1NNQVJUX0NMQVNTOgorCQl7CisJCQlyZXR1cm4oIEhFVVJJU1RJQ19BR1JFU1NJVkVfQ0xBU1MgKTsKKwkJfQorCisJCWNhc2UgSEVVUklTVElDX0FHUkVTU0lWRV9DTEFTUzoKKwkJeworCQkJcmV0dXJuKCBIRVVSSVNUSUNfTk9USElOR19FTFNFX0NMQVNTICk7CisJCX0KKworCQljYXNlIEhFVVJJU1RJQ19OT1RISU5HX0VMU0VfQ0xBU1M6CisJCWRlZmF1bHQ6CisJCXsKKwkJCXJldHVybiggSEVVUklTVElDX05PVEhJTkdfRUxTRV9DTEFTUyApOworCQl9CisJfQorfQorCisKK3N0ZDo6c3RyaW5nIElIZXVyaXN0aWNDbGFzczo6c3RySGV1cmlzdGljQ2xhc3MoCisJCUVOVU1fSEVVUklTVElDX0NMQVNTIGFuSGV1cmlzdGljQ2xhc3MpCit7CisJc3dpdGNoKCBhbkhldXJpc3RpY0NsYXNzICkKKwl7CisJCWNhc2UgSEVVUklTVElDX0JBU0lDX0NMQVNTOgorCQl7CisJCQlyZXR1cm4oICJIRVVSSVNUSUNfQkFTSUNfQ0xBU1MiICk7CisJCX0KKworCQljYXNlIEhFVVJJU1RJQ19OQUlWRV9DTEFTUzoKKwkJeworCQkJcmV0dXJuKCAiSEVVUklTVElDX05BSVZFX0NMQVNTIiApOworCQl9CisKKwkJY2FzZSBIRVVSSVNUSUNfU01BUlRfQ0xBU1M6CisJCXsKKwkJCXJldHVybiggIkhFVVJJU1RJQ19TTUFSVF9DTEFTUyIgKTsKKwkJfQorCisJCWNhc2UgSEVVUklTVElDX0FHUkVTU0lWRV9DTEFTUzoKKwkJeworCQkJcmV0dXJuKCAiSEVVUklTVElDX0FHUkVTU0lWRV9DTEFTUyIgKTsKKwkJfQorCisJCWNhc2UgSEVVUklTVElDX05PVEhJTkdfRUxTRV9DTEFTUzoKKwkJeworCQkJcmV0dXJuKCAiSEVVUklTVElDX05PVEhJTkdfRUxTRV9DTEFTUyIgKTsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCXJldHVybiggIlVOS05PV048IEhFVVJJU1RJQ19DTEFTUyA+IiApOworCQl9CisJfQorfQorCisKK0lIZXVyaXN0aWNDbGFzczo6RU5VTV9IRVVSSVNUSUNfQ0xBU1MKK0lIZXVyaXN0aWNDbGFzczo6dG9IZXVyaXN0aWNDbGFzcyhjb25zdCBzdGQ6OnN0cmluZyAmIHN0ckhldXJpc3RpY0NsYXNzKQoreworCXN0ZDo6c3RyaW5nIGFIZXVyaXN0aWNDbGFzcyA9IHN0ckhldXJpc3RpY0NsYXNzOworCVN0cmluZ1Rvb2xzOjp0b2xvd2VyKGFIZXVyaXN0aWNDbGFzcyk7CisKKwlpZiggYUhldXJpc3RpY0NsYXNzID09ICJiYXNpYyIgKQorCXsKKwkJcmV0dXJuKCBIRVVSSVNUSUNfQkFTSUNfQ0xBU1MgKTsKKwl9CisJZWxzZSBpZiggYUhldXJpc3RpY0NsYXNzID09ICJuYWl2ZSIgKQorCXsKKwkJcmV0dXJuKCBIRVVSSVNUSUNfTkFJVkVfQ0xBU1MgKTsKKwl9CisJZWxzZSBpZiggYUhldXJpc3RpY0NsYXNzID09ICJzbWFydCIgKQorCXsKKwkJcmV0dXJuKCBIRVVSSVNUSUNfU01BUlRfQ0xBU1MgKTsKKworCX0KKwllbHNlIGlmKCBhSGV1cmlzdGljQ2xhc3MgPT0gImFncmVzc2l2ZSIgKQorCXsKKwkJcmV0dXJuKCBIRVVSSVNUSUNfQUdSRVNTSVZFX0NMQVNTICk7CisJfQorCisJcmV0dXJuKCBIRVVSSVNUSUNfQkFTSUNfQ0xBU1MgKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENPTkZJR1VSRSBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitwcm90b3R5cGUgcHJvY2Vzczo6cHJvY2Vzc0lEIGFzICZhdm06OnByb2Nlc3Nvci5QUk9DRVNTT1JfVFlQRV9JRCBpcworCXNlY3Rpb24gSEVVUklTVElDCisJCS8vIEFjdGl2ZSBsJ3V0aWxpc2F0aW9uIGQnaGV1cmlzdGlxdWUKKwkJQGhldXJpc3RpYyA9IHRydWU7CisKKwkJLy8gY2hvaXggZGUgbCdoZXVyaXN0aXF1ZSBkZSBkw6lwYXJ0CisJCS8vIGJhc2ljIHwgbmFpdmUgfCBzbWFydCB8IGFncmVzc2l2ZQorCQlAaGV1cmlzdGljI3N0YXJ0ID0gJ2Jhc2ljJzsKKworCQkvLyBOb21icmUgZCdlc3NhaXMgZCdoZXVyaXN0aXF1ZXMKKwkJQGhldXJpc3RpYyN0cmlhbHMgPSA3OworCisJCS8vIENyaXTDqHJlIGRlIHNhdGlzZmFjdGlvbiBkdSBzdWNjw6hzIGRlcyBoZXVyaXN0aXF1ZXMKKwkJLy8gdGF1eCBkZSBjb3V2ZXJ0ZSAvIG5vbWJyZSBkJ8OpbMOpbWVudCByZXN0YW50Li4uCisJCUBvYmplY3RpdmUjcmF0ZSA9IDk1OworCQlAb2JqZWN0aXZlI3Jlc3QgPSA1OworCisJCS8vIExpbWl0YXRpb24gZGUgbGEgdGFpbGxlIGRlcyBjaGVtaW5zL3RyYWNlcyBjb3V2cmFudHMgcmVjaGVyY2jDqXMKKwkJQGRpcmVjdGl2ZSN0cmFjZSNoZXVyaXN0aWMgPSAnc21hcnQnOworCQlAZGlyZWN0aXZlI3RyYWNlI2NvdW50I2xpbWl0ID0gODsKKwkJQGRpcmVjdGl2ZSN0cmFjZSNzaXplI2xpbWl0ICA9IDg7CisKKwkJLy8gQ2hvaXggZGVzIGNvbnRleHRlcyBhdmVjIGRlcyB0cmFuc2l0aW9ucworCQkvLyBbIGZvcnRlbWVudCB8IGZhaWJsZW1lbnQgfCBhdXRyZSBdIHRpcmFibGVzCisKKwkJLy8gTGltaXRhdGlvbnMgdGVtcG9yYWlyZSBkZSBsYSBwcm9mb25kZXVyIGQnZXhwbG9yYXRpb24KKwkJQGNvdmVyYWdlI2hlaWdodCA9IDc7CisKKwkJLy8gbm9tYnJlIGRlIGZvaXMgcXVlIGxhIGxpbWl0ZSBkb2l0IMOqdHJlIGF0dGVpbnQgYXZhbnQgZGUgbCdhdWdtZW50ZXIKKwkJQGNvdmVyYWdlI2hlaWdodCNyZWFjaGVkI2xpbWl0ID0gNDI7CisKKwkJQGhpdCNzdHJvbmdseSNyYW5kb20gPSBmYWxzZTsKKwkJQGhpdCNzdHJvbmdseSNjb3VudCA9IDE7CisKKwkJQGhpdCN3ZWFrbHkjcmFuZG9tID0gZmFsc2U7CisJCUBoaXQjd2Vha2x5I2NvdW50ID0gMTsKKworCQlAaGl0I290aGVyI3JhbmRvbSA9IGZhbHNlOworCQlAaGl0I290aGVyI2NvdW50ID0gMTsKKworCQlAc2NvcGUgPSAnREVUQUlMUyc7IAkvLyAnSU5TVEFOQ0UnIHwgJ0ZPUk0nIHwgJ0RFVEFJTFMnCisJZW5kc2VjdGlvbiBIRVVSSVNUSUMKK2VuZHByb3RvdHlwZQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitib29sIEF2bUNvdmVyYWdlSGV1cmlzdGljUHJvcGVydHk6OmNvbmZpZ3VyZShXT2JqZWN0ICogd2ZQYXJhbWV0ZXJPYmplY3QpCit7CisJbG9uZyBpbnRBdHRyaWJ1dGUgPSAwOworCisJV09iamVjdCAqIHRoZVBST1BFUlRZICA9IFF1ZXJ5OjpnZXRSZWdleFdTZXF1ZW5jZSgKKwkJCXdmUGFyYW1ldGVyT2JqZWN0LCBPUl9XSUQyKCJwcm9wZXJ0eSIsICJQUk9QRVJUWSIpKTsKKwlpZiggdGhlUFJPUEVSVFkgIT0gV09iamVjdDo6X05VTExfICkKKwl7CisJCW1TY29wZSA9IFNwZWNpZmllcjo6dG9EZXNpZ25LaW5kKAorCQkJCVF1ZXJ5OjpnZXRXUHJvcGVydHlTdHJpbmcodGhlUFJPUEVSVFksICJzY29wZSIsICJNT0RFTCIpICk7CisKKwkJbUhldXJpc3RpY0VuYWJsZWQgPSBRdWVyeTo6Z2V0V1Byb3BlcnR5Qm9vbGVhbigKKwkJCQl0aGVQUk9QRVJUWSwgImhldXJpc3RpYyIsIHRydWUpOworCX0KKworCisJV09iamVjdCAqIHRoZUhFVVJJU1RJQyA9IFF1ZXJ5OjpnZXRSZWdleFdTZXF1ZW5jZSh3ZlBhcmFtZXRlck9iamVjdCwKKwkJCU9SX1dJRDIoImhldXJpc3RpYyIsICJIRVVSSVNUSUMiKSwgdGhlUFJPUEVSVFkpOworCWlmKCB0aGVIRVVSSVNUSUMgIT0gV09iamVjdDo6X05VTExfICkKKwl7CisJCVNwZWNpZmllcjo6REVTSUdOX0tJTkQgYVNjb3BlID0gU3BlY2lmaWVyOjp0b0Rlc2lnbktpbmQoCisJCQkJUXVlcnk6OmdldFdQcm9wZXJ0eVN0cmluZyh0aGVIRVVSSVNUSUMsICJzY29wZSIsICJVTkRFRklORUQiKSApOworCQlpZiggYVNjb3BlICE9IFNwZWNpZmllcjo6REVTSUdOX1VOREVGSU5FRF9LSU5EICkKKwkJeworCQkJbVNjb3BlID0gYVNjb3BlOworCQl9CisKKwkJLy8gSGV1cmlzdGljIGVuYWJsaW5nCisJCW1IZXVyaXN0aWNFbmFibGVkID0gUXVlcnk6OmdldFdQcm9wZXJ0eUJvb2xlYW4oCisJCQkJdGhlSEVVUklTVElDLCAiaGV1cmlzdGljIiwgbUhldXJpc3RpY0VuYWJsZWQpOworCisJCS8vIEhldXJpc3RpYyBzdGFydCBjbGFzcyA6IGJhc2ljIHwgbmFpdmUgfCBzbWFydCB8IGFncmVzc2l2ZQorCQlzdGQ6OnN0cmluZyBzdHJIZXVyaXN0aWMgPSBRdWVyeTo6Z2V0UmVnZXhXUHJvcGVydHlTdHJpbmcoCisJCQkJdGhlSEVVUklTVElDLCBDT05TX1dJRDIoImhldXJpc3RpYyIsICJzdGFydCIpLCAiYmFzaWMiKTsKKwkJbUhldXJpc3RpY0NsYXNzID0gdG9IZXVyaXN0aWNDbGFzcyhzdHJIZXVyaXN0aWMpOworCisJCS8vIFRyaWFscyBsaW1pdAorCQltSGV1cmlzdGljVHJpYWxzTGltaXQgPSBRdWVyeTo6Z2V0UmVnZXhXUHJvcGVydHlTaXplVCgKKwkJCQl0aGVIRVVSSVNUSUMsIENPTlNfV0lEMigiaGV1cmlzdGljIiwgInRyaWFscyIpLAorCQkJCUFWTV9OVU1FUklDX01BWF9TSVpFX1QsIEFWTV9OVU1FUklDX01BWF9TSVpFX1QpOworCQltSGV1cmlzdGljVHJpYWxzQ291bnQgPSAwOworCisJCS8vIE9iamVjdGl2ZSAmIEdvYWwKKwkJaW50QXR0cmlidXRlID0gUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5SW50KAorCQkJCXRoZUhFVVJJU1RJQywgQ09OU19XSUQyKCJvYmplY3RpdmUiLCAicmF0ZSIpLCAxMDApOworCQltQ292ZXJhZ2VSYXRlR29hbCA9ICggKGludEF0dHJpYnV0ZSA+IDApICYmCisJCQkJKGludEF0dHJpYnV0ZSA8PSAxMDApICkgPyAgaW50QXR0cmlidXRlIDogMTAwOworCisJCW1Db3ZlcmFnZVJlc3RHb2FsID0gUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5U2l6ZVQoCisJCQkJdGhlSEVVUklTVElDLCBDT05TX1dJRDIoIm9iamVjdGl2ZSIsICJyZXN0IiksIDAsIDApOworCisJCS8vIERpcmVjdGl2ZSBIZXVyaXN0aWMKKwkJc3RySGV1cmlzdGljID0gUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5U3RyaW5nKHRoZUhFVVJJU1RJQywKKwkJCQlDT05TX1dJRDMoImRpcmVjdGl2ZSIsICJ0cmFjZSIsICJoZXVyaXN0aWMiKSwgInNtYXJ0Iik7CisJCW1EaXJlY3RpdmVUcmFjZUhldXJpc3RpY0NsYXNzID0gdG9IZXVyaXN0aWNDbGFzcyhzdHJIZXVyaXN0aWMpOworCisJCW1EaXJlY3RpdmVUcmFjZUNvdW50TGltaXQgPSBRdWVyeTo6Z2V0UmVnZXhXUHJvcGVydHlQb3NTaXplVCgKKwkJCQl0aGVIRVVSSVNUSUMsCisJCQkJQ09OU19XSUQ0KCJkaXJlY3RpdmUiLCAidHJhY2UiLCAiY291bnQiLCAibGltaXQiKSwKKwkJCQlBVk1fTlVNRVJJQ19NQVhfU0laRV9ULCBBVk1fTlVNRVJJQ19NQVhfU0laRV9UKTsKKworCQltRGlyZWN0aXZlVHJhY2VTaXplTGltaXQgPSBRdWVyeTo6Z2V0UmVnZXhXUHJvcGVydHlQb3NTaXplVCgKKwkJCQl0aGVIRVVSSVNUSUMsCisJCQkJQ09OU19XSUQ0KCJkaXJlY3RpdmUiLCAidHJhY2UiLCAic2l6ZSIsICJsaW1pdCIpLAorCQkJCUFWTV9OVU1FUklDX01BWF9TSVpFX1QsIEFWTV9OVU1FUklDX01BWF9TSVpFX1QpOworCisKKwkJbUNvdmVyYWdlSGVpZ2h0ID0gbUNvdmVyYWdlSGVpZ2h0UGVyaW9kID0KKwkJCQlRdWVyeTo6Z2V0UmVnZXhXUHJvcGVydHlTaXplVCh0aGVIRVVSSVNUSUMsCisJCQkJCQlDT05TX1dJRDIoImxvb2thaGVhZCIsICJkZXB0aCIpICJ8IgorCQkJCQkJQ09OU19XSUQyKCJjb3ZlcmFnZSIsICJoZWlnaHQiKSwgMCk7CisKKwkJbUNvdmVyYWdlSGVpZ2h0UmVhY2hlZExpbWl0ID0gUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5U2l6ZVQoCisJCQkJdGhlSEVVUklTVElDLCBDT05TX1dJRDIoImxvb2thaGVhZCIsICJ3aWR0aCIpICJ8IgorCQkJCUNPTlNfV0lENCgiY292ZXJhZ2UiLCAiaGVpZ2h0IiwgInJlYWNoZWQiLCAibGltaXQiKSwgMCk7CisKKwkJLy8gT3B0aW9ucyBwb3VyIGxlcyB0cmFuc2l0aW9ucyBmb3J0ZW1lbnQgdGlyYWJsZXMKKwkJbUhpdFN0cm9uZ2x5UmFuZG9tRmxhZyA9IFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eUJvb2xlYW4oCisJCQl0aGVIRVVSSVNUSUMsIENPTlNfV0lEMygiaGl0IiwgInN0cm9uZ2x5IiwgInJhbmRvbSIpLCBmYWxzZSk7CisKKwkJbUhpdFN0cm9uZ2x5Q291bnQgPSBRdWVyeTo6Z2V0UmVnZXhXUHJvcGVydHlQb3NTaXplVCgKKwkJCQl0aGVIRVVSSVNUSUMsIENPTlNfV0lEMygiaGl0IiwgInN0cm9uZ2x5IiwgImNvdW50IiksIDEpOworCisJCS8vIE9wdGlvbnMgcG91ciBsZXMgdHJhbnNpdGlvbnMgZmFpYmxlbWVudCB0aXJhYmxlcworCQltSGl0V2Vha2x5UmFuZG9tRmxhZyA9IFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eUJvb2xlYW4oCisJCQkJdGhlSEVVUklTVElDLCBDT05TX1dJRDMoImhpdCIsICJ3ZWFrbHkiLCAicmFuZG9tIiksIGZhbHNlKTsKKworCQltSGl0V2Vha2x5Q291bnQgPSBRdWVyeTo6Z2V0UmVnZXhXUHJvcGVydHlQb3NTaXplVCgKKwkJCQl0aGVIRVVSSVNUSUMsIENPTlNfV0lEMygiaGl0IiwgIndlYWtseSIsICJjb3VudCIpLCAxKTsKKworCQkvLyBPcHRpb25zIHBvdXIgbGVzIGF1dHJlcyB0cmFuc2l0aW9ucyB0aXJhYmxlcyA/CisJCW1IaXRPdGhlclJhbmRvbUZsYWcgPSBRdWVyeTo6Z2V0UmVnZXhXUHJvcGVydHlCb29sZWFuKAorCQkJCXRoZUhFVVJJU1RJQywgQ09OU19XSUQzKCJoaXQiLCAib3RoZXIiLCAicmFuZG9tIiksIGZhbHNlKTsKKworCQltSGl0T3RoZXJDb3VudCA9IFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eVBvc1NpemVUKAorCQkJCXRoZUhFVVJJU1RJQywgQ09OU19XSUQzKCJoaXQiLCAib3RoZXIiLCAiY291bnQiKSwgMSk7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vY292ZXJhZ2UvQXZtQ292ZXJhZ2VIZXVyaXN0aWNQcm9wZXJ0eS5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2NvdmVyYWdlL0F2bUNvdmVyYWdlSGV1cmlzdGljUHJvcGVydHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzIwY2VhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2NvdmVyYWdlL0F2bUNvdmVyYWdlSGV1cmlzdGljUHJvcGVydHkuaApAQCAtMCwwICsxLDMwNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDE1IGphbnYuIDIwMTUKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBBVk1DT1ZFUkFHRUhFVVJJU1RJQ1BST1BFUlRZX0hfCisjZGVmaW5lIEFWTUNPVkVSQUdFSEVVUklTVElDUFJPUEVSVFlfSF8KKworI2luY2x1ZGUgPHV0aWwvYXZtX251bWVyaWMuaD4KKyNpbmNsdWRlIDx1dGlsL2F2bV9zdHJpbmcuaD4KKworI2luY2x1ZGUgPGZtbC9jb21tb24vU3BlY2lmaWVyRWxlbWVudC5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworY2xhc3MgV09iamVjdDsKKworCisvKioKKyAqIEV4ZWN1dGlvbiBDb250ZXh0IEhldXJpc3RpYyBXZWlnaHQKKyAqLworY2xhc3MgSUhldXJpc3RpY0NvbnRleHRXZWlnaHQKK3sKKworcHVibGljOgorCWVudW0gRU5VTV9IRVVSSVNUSUNfQ0xBU1MKKwl7CisJCVdFSUdIVF9TRUxFQ1RFRF9BQ0hJRVZBQkxFICAgPSAwLAorCisJCVdFSUdIVF9DRVJUQUlOTFlfQUNISUVWQUJMRSAgPSAxLAorCQlXRUlHSFRfU1RST05HTFlfQUNISUVWQUJMRSAgID0gMiwKKwkJV0VJR0hUX1dFQUtMWV9BQ0hJRVZBQkxFICAgICA9IDMsCisKKwkJV0VJR0hUX05PTl9QUklPUklUWSAgICAgICAgICA9IDQsCisJCVdFSUdIVF9VTktOT1dOX0FDSElFVkFCTEUgICAgPSA1LAorCisJCVdFSUdIVF9OT05fQUNISUVWQUJMRSAgICAgICAgPSA2LAorCX07CisKKworCXN0YXRpYyBzdGQ6OnN0cmluZyBzdHJIZXVyaXN0aWNXZWlnaHQoYXZtX3VpbnQ4X3QgYVdlaWdodCk7CisKK307CisKKworLyoqCisgKiBIZXVyaXN0aWMgY2xhc3MKKyAqLworY2xhc3MgSUhldXJpc3RpY0NsYXNzCit7CisKK3B1YmxpYzoKKworCWVudW0gRU5VTV9IRVVSSVNUSUNfQ0xBU1MKKwl7CisJCUhFVVJJU1RJQ19CQVNJQ19DTEFTUywKKworCQlIRVVSSVNUSUNfTkFJVkVfQ0xBU1MsCisKKwkJSEVVUklTVElDX1NNQVJUX0NMQVNTLAorCisJCUhFVVJJU1RJQ19BR1JFU1NJVkVfQ0xBU1MsCisKKwkJSEVVUklTVElDX05PVEhJTkdfRUxTRV9DTEFTUworCX07CisKKworCS8qCisJICogQVRUUklCVVRFUworCSAqLworCUVOVU1fSEVVUklTVElDX0NMQVNTIG1IZXVyaXN0aWNDbGFzczsKKworCitwdWJsaWM6CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlJSGV1cmlzdGljQ2xhc3MoCisJCQlFTlVNX0hFVVJJU1RJQ19DTEFTUyBhbkhldXJpc3RpY0NsYXNzID0gSEVVUklTVElDX0JBU0lDX0NMQVNTKQorCTogbUhldXJpc3RpY0NsYXNzKCBhbkhldXJpc3RpY0NsYXNzICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCUlIZXVyaXN0aWNDbGFzcyhjb25zdCBJSGV1cmlzdGljQ2xhc3MgJiBhSGV1cmlzdGljKQorCTogbUhldXJpc3RpY0NsYXNzKCBhSGV1cmlzdGljLm1IZXVyaXN0aWNDbGFzcyApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5JSGV1cmlzdGljQ2xhc3MoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBTRVRURVIKKwkgKiBtSGV1cmlzdGljQ2xhc3MKKwkgKi8KKwlzdGF0aWMgRU5VTV9IRVVSSVNUSUNfQ0xBU1MgaW5jckhldXJpc3RpY0NsYXNzKAorCQkJRU5VTV9IRVVSSVNUSUNfQ0xBU1MgYW5IZXVyaXN0aWNDbGFzcyk7CisKKwlpbmxpbmUgdm9pZCBpbmNySGV1cmlzdGljQ2xhc3MoKQorCXsKKwkJbUhldXJpc3RpY0NsYXNzID0gaW5jckhldXJpc3RpY0NsYXNzKCBtSGV1cmlzdGljQ2xhc3MgKTsKKwl9CisKKworCWlubGluZSB2b2lkIHJlc2V0SGV1cmlzdGljQ2xhc3MoCisJCQlFTlVNX0hFVVJJU1RJQ19DTEFTUyBhbkhldXJpc3RpY0NsYXNzID0gSEVVUklTVElDX0JBU0lDX0NMQVNTKQorCXsKKwkJbUhldXJpc3RpY0NsYXNzID0gYW5IZXVyaXN0aWNDbGFzczsKKwl9CisKKworCXN0YXRpYyBzdGQ6OnN0cmluZyBzdHJIZXVyaXN0aWNDbGFzcyhFTlVNX0hFVVJJU1RJQ19DTEFTUyBhbkhldXJpc3RpY0NsYXNzKTsKKworCWlubGluZSBzdGQ6OnN0cmluZyBzdHJIZXVyaXN0aWNDbGFzcygpIGNvbnN0CisJeworCQlyZXR1cm4oIHN0ckhldXJpc3RpY0NsYXNzKG1IZXVyaXN0aWNDbGFzcykgKTsKKwl9CisKKwlzdGF0aWMgRU5VTV9IRVVSSVNUSUNfQ0xBU1MgdG9IZXVyaXN0aWNDbGFzcygKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgc3RySGV1cmlzdGljQ2xhc3MpOworCit9OworCisKKworLyoKKyAqIFRoZSBHZW5lcmFsIENvdmVyYWdlIEhldXJpc3RpYyBQcm9wZXJ0eQorICovCitjbGFzcyBBdm1Db3ZlcmFnZUhldXJpc3RpY1Byb3BlcnR5ICA6ICBwdWJsaWMgSUhldXJpc3RpY0NsYXNzCit7CisKK3B1YmxpYzoKKwkvKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlTcGVjaWZpZXI6OkRFU0lHTl9LSU5EIG1TY29wZTsKKworCWJvb2wgbUhldXJpc3RpY0VuYWJsZWQ7CisJYXZtX3NpemVfdCBtSGV1cmlzdGljVHJpYWxzTGltaXQ7CisJYXZtX3NpemVfdCBtSGV1cmlzdGljVHJpYWxzQ291bnQ7CisKKwlhdm1fc2l6ZV90IG1Db3ZlcmFnZVJhdGVHb2FsOworCWF2bV9zaXplX3QgbUNvdmVyYWdlUmVzdEdvYWw7CisKKwlFTlVNX0hFVVJJU1RJQ19DTEFTUyBtRGlyZWN0aXZlVHJhY2VIZXVyaXN0aWNDbGFzczsKKwlhdm1fc2l6ZV90IG1EaXJlY3RpdmVUcmFjZUNvdW50TGltaXQ7CisJYXZtX3NpemVfdCBtRGlyZWN0aXZlVHJhY2VTaXplTGltaXQ7CisKKwlhdm1fc2l6ZV90IG1Db3ZlcmFnZUhlaWdodFBlcmlvZDsKKwlhdm1fc2l6ZV90IG1Db3ZlcmFnZUhlaWdodDsKKworCWF2bV9zaXplX3QgbUNvdmVyYWdlSGVpZ2h0UmVhY2hlZENvdW50OworCWF2bV9zaXplX3QgbUNvdmVyYWdlSGVpZ2h0UmVhY2hlZExpbWl0OworCWJvb2wgICAgICAgbUNvdmVyYWdlSGVpZ2h0UmVhY2hlZEZsYWc7CisKKwlib29sICAgICAgIG1IaXRDZXJ0YWlubHlSYW5kb21GbGFnOworCWF2bV9zaXplX3QgbUhpdENlcnRhaW5seUNvdW50OworCisJYm9vbCAgICAgICBtSGl0U3Ryb25nbHlSYW5kb21GbGFnOworCWF2bV9zaXplX3QgbUhpdFN0cm9uZ2x5Q291bnQ7CisKKwlib29sICAgICAgIG1IaXRXZWFrbHlSYW5kb21GbGFnOworCWF2bV9zaXplX3QgbUhpdFdlYWtseUNvdW50OworCisJYm9vbCAgICAgICBtSGl0T3RoZXJSYW5kb21GbGFnOworCWF2bV9zaXplX3QgbUhpdE90aGVyQ291bnQ7CisKKworcHVibGljOgorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQXZtQ292ZXJhZ2VIZXVyaXN0aWNQcm9wZXJ0eSgKKwkJCUVOVU1fSEVVUklTVElDX0NMQVNTIGFuSGV1cmlzdGljQ2xhc3MgPSBIRVVSSVNUSUNfQkFTSUNfQ0xBU1MpCisJOiBJSGV1cmlzdGljQ2xhc3MoIGFuSGV1cmlzdGljQ2xhc3MgKSwKKworCW1TY29wZSggU3BlY2lmaWVyOjpERVNJR05fTU9ERUxfS0lORCApLAorCisJbUhldXJpc3RpY0VuYWJsZWQoIHRydWUgKSwKKworCW1IZXVyaXN0aWNUcmlhbHNMaW1pdCggNyApLAorCW1IZXVyaXN0aWNUcmlhbHNDb3VudCggMCApLAorCisJbUNvdmVyYWdlUmF0ZUdvYWwoIDEwMCApLAorCW1Db3ZlcmFnZVJlc3RHb2FsKCAwICksCisKKwltRGlyZWN0aXZlVHJhY2VIZXVyaXN0aWNDbGFzcyggSEVVUklTVElDX1NNQVJUX0NMQVNTICksCisJbURpcmVjdGl2ZVRyYWNlQ291bnRMaW1pdCggOCApLAorCW1EaXJlY3RpdmVUcmFjZVNpemVMaW1pdCggOCApLAorCisJbUNvdmVyYWdlSGVpZ2h0UGVyaW9kKCAwICksCisJbUNvdmVyYWdlSGVpZ2h0KCAwICksCisKKwltQ292ZXJhZ2VIZWlnaHRSZWFjaGVkQ291bnQoIDAgKSwKKwltQ292ZXJhZ2VIZWlnaHRSZWFjaGVkTGltaXQoIDEgKSwKKwltQ292ZXJhZ2VIZWlnaHRSZWFjaGVkRmxhZyggZmFsc2UgKSwKKworCW1IaXRDZXJ0YWlubHlSYW5kb21GbGFnKCBmYWxzZSApLAorCW1IaXRDZXJ0YWlubHlDb3VudCggMSApLAorCisJbUhpdFN0cm9uZ2x5UmFuZG9tRmxhZyggZmFsc2UgKSwKKwltSGl0U3Ryb25nbHlDb3VudCggMSApLAorCisJbUhpdFdlYWtseVJhbmRvbUZsYWcoIGZhbHNlICksCisJbUhpdFdlYWtseUNvdW50KCAxICksCisKKwltSGl0T3RoZXJSYW5kb21GbGFnKCBmYWxzZSApLAorCW1IaXRPdGhlckNvdW50KCAxICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJQXZtQ292ZXJhZ2VIZXVyaXN0aWNQcm9wZXJ0eShjb25zdCBBdm1Db3ZlcmFnZUhldXJpc3RpY1Byb3BlcnR5ICYgYUNIUCkKKwk6IElIZXVyaXN0aWNDbGFzcyggYUNIUCApLAorCisJbVNjb3BlKCBhQ0hQLm1TY29wZSApLAorCisJbUhldXJpc3RpY0VuYWJsZWQoIGFDSFAubUhldXJpc3RpY0VuYWJsZWQgKSwKKworCW1IZXVyaXN0aWNUcmlhbHNMaW1pdCggYUNIUC5tSGV1cmlzdGljVHJpYWxzTGltaXQgKSwKKwltSGV1cmlzdGljVHJpYWxzQ291bnQoIGFDSFAubUhldXJpc3RpY1RyaWFsc0NvdW50ICksCisKKwltQ292ZXJhZ2VSYXRlR29hbCggYUNIUC5tQ292ZXJhZ2VSYXRlR29hbCApLAorCW1Db3ZlcmFnZVJlc3RHb2FsKCBhQ0hQLm1Db3ZlcmFnZVJlc3RHb2FsICksCisKKwltRGlyZWN0aXZlVHJhY2VIZXVyaXN0aWNDbGFzcyggYUNIUC5tRGlyZWN0aXZlVHJhY2VIZXVyaXN0aWNDbGFzcyApLAorCW1EaXJlY3RpdmVUcmFjZUNvdW50TGltaXQoIGFDSFAubURpcmVjdGl2ZVRyYWNlQ291bnRMaW1pdCApLAorCW1EaXJlY3RpdmVUcmFjZVNpemVMaW1pdCggYUNIUC5tRGlyZWN0aXZlVHJhY2VTaXplTGltaXQgKSwKKworCW1Db3ZlcmFnZUhlaWdodFBlcmlvZCggYUNIUC5tQ292ZXJhZ2VIZWlnaHRQZXJpb2QgKSwKKwltQ292ZXJhZ2VIZWlnaHQoIGFDSFAubUNvdmVyYWdlSGVpZ2h0ICksCisKKwltQ292ZXJhZ2VIZWlnaHRSZWFjaGVkQ291bnQoIGFDSFAubUNvdmVyYWdlSGVpZ2h0UmVhY2hlZENvdW50ICksCisJbUNvdmVyYWdlSGVpZ2h0UmVhY2hlZExpbWl0KCBhQ0hQLm1Db3ZlcmFnZUhlaWdodFJlYWNoZWRMaW1pdCApLAorCW1Db3ZlcmFnZUhlaWdodFJlYWNoZWRGbGFnKCBhQ0hQLm1Db3ZlcmFnZUhlaWdodFJlYWNoZWRGbGFnICksCisKKwltSGl0Q2VydGFpbmx5UmFuZG9tRmxhZyggYUNIUC5tSGl0Q2VydGFpbmx5UmFuZG9tRmxhZyApLAorCW1IaXRDZXJ0YWlubHlDb3VudCggYUNIUC5tSGl0Q2VydGFpbmx5Q291bnQgKSwKKworCW1IaXRTdHJvbmdseVJhbmRvbUZsYWcoIGFDSFAubUhpdFN0cm9uZ2x5UmFuZG9tRmxhZyApLAorCW1IaXRTdHJvbmdseUNvdW50KCBhQ0hQLm1IaXRTdHJvbmdseUNvdW50ICksCisKKwltSGl0V2Vha2x5UmFuZG9tRmxhZyggYUNIUC5tSGl0V2Vha2x5UmFuZG9tRmxhZyApLAorCW1IaXRXZWFrbHlDb3VudCggYUNIUC5tSGl0V2Vha2x5Q291bnQgKSwKKworCW1IaXRPdGhlclJhbmRvbUZsYWcoIGFDSFAubUhpdE90aGVyUmFuZG9tRmxhZyApLAorCW1IaXRPdGhlckNvdW50KCBhQ0hQLm1IaXRPdGhlckNvdW50ICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkF2bUNvdmVyYWdlSGV1cmlzdGljUHJvcGVydHkoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQ09ORklHVVJFIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXZpcnR1YWwgYm9vbCBjb25maWd1cmUoV09iamVjdCAqIHdmUGFyYW1ldGVyT2JqZWN0KTsKKworfTsKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qIEFWTUNPVkVSQUdFSEVVUklTVElDUFJPUEVSVFlfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9jb3ZlcmFnZS9Bdm1Db3ZlcmFnZU9uZVRyYWNlRHJpdmVyLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9jb3ZlcmFnZS9Bdm1Db3ZlcmFnZU9uZVRyYWNlRHJpdmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDEwYzg0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2NvdmVyYWdlL0F2bUNvdmVyYWdlT25lVHJhY2VEcml2ZXIuY3BwCkBAIC0wLDAgKzEsNzc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTkgbm92LiAyMDE0CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJBdm1Db3ZlcmFnZU9uZVRyYWNlRHJpdmVyLmgiCisKKyNpbmNsdWRlICJBdm1Db3ZlcmFnZVByb2Nlc3Nvci5oIgorI2luY2x1ZGUgIkF2bUNvdmVyYWdlVHJhbnNpdGlvblZpZXcuaCIKKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0F2bVRyYW5zaXRpb24uaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkNvbnRleHQuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25EYXRhLmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvUnVudGltZUlELmg+CisKKyNpbmNsdWRlIDxmbWwvdHJhY2UvVHJhY2VQb2ludC5oPgorCisjaW5jbHVkZSA8ZmFtL2NvdmVyYWdlL0F2bUNvdmVyYWdlVHJhbnNpdGlvblZpZXcuaD4KKworI2luY2x1ZGUgPGZhbS9xdWV1ZS9XYWl0aW5nU3RyYXRlZ3kuaD4KKworI2luY2x1ZGUgPHNldy9TeW1iZXhDb250cm9sbGVyUmVxdWVzdE1hbmFnZXIuaD4KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorICogQ09OU1RSVUNUT1IKKyAqIERlZmF1bHQKKyAqLworQXZtQ292ZXJhZ2VPbmVUcmFjZURyaXZlcjo6QXZtQ292ZXJhZ2VPbmVUcmFjZURyaXZlcigKKwkJQXZtQ292ZXJhZ2VQcm9jZXNzb3IgJiBhQ292ZXJhZ2VQcm9jZXNzb3IsIEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIGFuRU5WLAorCQlJSGV1cmlzdGljQ2xhc3M6OkVOVU1fSEVVUklTVElDX0NMQVNTIGFuSGV1cmlzdGljQ2xhc3MsCisJCWF2bV9zaXplX3QgcGF0aENvdW50TGltaXQsIGF2bV9zaXplX3QgcGF0aFNpemVMaW1pdCkKKzogQXZtQ292ZXJhZ2VBYnN0cmFjdFZpZXcoIGFDb3ZlcmFnZVByb2Nlc3NvciAsIE5VTEwgKSwKK21UcmFuc2l0aW9uQ292ZXJhZ2UoIGFDb3ZlcmFnZVByb2Nlc3Nvci5tVHJhbnNpdGlvbkNvdmVyYWdlICksCitFTlYoIGFuRU5WICksCittVHJhY2VDaGVja2VyKCBhbkVOViApLAorCittQ29tcHV0aW5nUGF0aENvdW50TGltaXQoIHBhdGhDb3VudExpbWl0ICksCittQ29tcHV0aW5nUGF0aFNpemVMaW1pdCggcGF0aFNpemVMaW1pdCApLAorbVBhdGhDaGVja2VyKGFuSGV1cmlzdGljQ2xhc3MsIHBhdGhDb3VudExpbWl0LCBwYXRoU2l6ZUxpbWl0KSwKKworbVRyYW5zaXRpb25UYXJnZXRIaXN0b3J5KCApLAorCittQ2FjaGVGb3JEaXJlY3RpdmVUcmFjZXMoICksCittRGlyZWN0aXZlRUMoIE5VTEwgKSwKKworbURlZmF1bHRQZW5kaW5nVHJhY2VTaXplKCA0ICksCisKK21QZW5kaW5nVHJhY2UoICYgYUNvdmVyYWdlUHJvY2Vzc29yLm1UcmFuc2l0aW9uQ292ZXJhZ2UgKSwKKworbVdhaXRpbmdRdWV1ZSggKSwKKworbUdsb2JhbFVuY292ZXJlZFRyYW5zaXRpb25zKCApLAorbUxhc3RDb2xsZWN0ZWRDb3ZlckNvdW50KCAwICksCisKK21Mb2NhbFVuY292ZXJlZFRyYW5zaXRpb25zKCApLAorCisvLyBDb21wdXRpbmcgZHJpdmUgdmFyaWFibGUKK3NhdmVXZWlnaHRNaW4oIDAgKSwKKworY292ZXJhZ2VNYXgoIDAgKSwKK2NvdmVyYWdlQ291bnQoIDAgKSwKKwordG1wVHJhY2VQb2ludCggTlVMTCApLAoraXRUUCggKSwKK2VuZFRQKCApLAorCit0bXBUcmFuc2l0aW9uKCBOVUxMICksCitpdFRyYW5zaXRpb24oICksCitlbmRUcmFuc2l0aW9uKCApLAorCitpdFRyYWNlKCApLAorZW5kVHJhY2UoICkKK3sKKwkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKKworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDT05GSUdVUkUgQVBJCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIEF2bUNvdmVyYWdlT25lVHJhY2VEcml2ZXI6OmNvbmZpZ3VyZUltcGwoKQoreworCXJldHVybiggdHJ1ZSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBQUk9DRVNTT1IgRklMVEVSIEFQSQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBBdm1Db3ZlcmFnZU9uZVRyYWNlRHJpdmVyOjpwcmVmaWx0ZXJpbmcoTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGVjUXVldWUpCit7CisvLwllbmRRdWV1ZSA9IGVjUXVldWUuZW5kKCk7CisvLwlmb3IoIGl0UXVldWUgPSBlY1F1ZXVlLmJlZ2luKCkgOyBpdFF1ZXVlICE9IGVuZFF1ZXVlIDsgKytpdFF1ZXVlICkKKy8vCXsKKy8vCisvLwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworYm9vbCBBdm1Db3ZlcmFnZU9uZVRyYWNlRHJpdmVyOjpwb3N0ZmlsdGVyaW5nKExpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBlY1F1ZXVlKQoreworCWl0UXVldWUgPSBlY1F1ZXVlLmJlZ2luKCk7CisJZW5kUXVldWUgPSBlY1F1ZXVlLmVuZCgpOworCWZvciggOyBpdFF1ZXVlICE9IGVuZFF1ZXVlIDsgKytpdFF1ZXVlICkKKwl7CisJCWlmKCAoKml0UXVldWUpID09IG1EaXJlY3RpdmVFQyApCisJCXsKKwkJCWlmKCBkcml2ZSgpICkKKwkJCXsKKwkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCX0KKwkJfQorCX0KKworCW1Db3ZlcmFnZVByb2Nlc3Nvci5zZXRSZXF1ZXN0UmVxdWV1ZVdhaXRpbmcoKTsKKworCXJldHVybiggZmFsc2UgKTsKK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBQUk9DRVNTT1IgUkVRVUVTVCBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvKioKKyAqIFJFUVVFVUVfV0FJVElORworICovCitib29sIEF2bUNvdmVyYWdlT25lVHJhY2VEcml2ZXI6OnJlcXVldWVXYWl0aW5nVGFibGUoCisJCVdhaXRpbmdTdHJhdGVneSAmIGFXYWl0aW5nU3RyYXRlZ3ksCisJCWF2bV91aW50OF90IGFXZWlnaHRNaW4sIGF2bV91aW50OF90IGFXZWlnaHRNYXgpCit7CisJLy8gR2xvYmFsIFVwZGF0ZSBDYWNoZSBmb3IgRGlyZWN0aXZlIFRyYWNlcyAhISEKKwl1cGRhdGVDYWNoZUZvckRpcmVjdGl2ZVRyYWNlcygpOworCisKKwltV2FpdGluZ1F1ZXVlLmNsZWFyKCk7CisKKwlzYXZlV2VpZ2h0TWluID0gYVdlaWdodE1pbjsKKworCWFXZWlnaHRNaW4gPSBhV2FpdGluZ1N0cmF0ZWd5LnNwbGljZVByaW9yUXVldWVUYWJsZSgKKwkJCW1XYWl0aW5nUXVldWUsIHNhdmVXZWlnaHRNaW4sIGFXZWlnaHRNYXgpOworCisvLwl3aGlsZSggYVdlaWdodE1pbiA8PSBXRUlHSFRfV0VBS0xZX0FDSElFVkFCTEUgKQorCXdoaWxlKCBhV2VpZ2h0TWluIDw9IFdFSUdIVF9OT05fUFJJT1JJVFkgKQorCXsKKwkJaXRRdWV1ZSA9IG1XYWl0aW5nUXVldWUuYmVnaW4oKTsKKwkJZW5kUXVldWUgPSBtV2FpdGluZ1F1ZXVlLmVuZCgpOworCQlmb3IoIDsgaXRRdWV1ZSAhPSBlbmRRdWV1ZSA7ICsraXRRdWV1ZSApCisJCXsKKwkJCWlmKCBjaGVja0RpcmVjdGl2ZVRyYWNlKCogKCppdFF1ZXVlKSkgKQorCQkJeworCQkJCSgqaXRRdWV1ZSktPnNldFdlaWdodCggV0VJR0hUX1NFTEVDVEVEX0FDSElFVkFCTEUgKTsKKworCQkJCWFXYWl0aW5nU3RyYXRlZ3kucHVzaCggKml0UXVldWUgKTsKKworCQkJCWl0UXVldWUgPSBtV2FpdGluZ1F1ZXVlLmVyYXNlKCBpdFF1ZXVlICk7CisKKwkJCQlhV2FpdGluZ1N0cmF0ZWd5LnNwbGljZShhV2VpZ2h0TWluLCBtV2FpdGluZ1F1ZXVlKTsKKworCQkJCXJldHVybiggc2V0RGlyZWN0aXZlVHJhY2UoKSApOworCQkJfQorCQl9CisKKwkJYVdhaXRpbmdTdHJhdGVneS5zcGxpY2UoYVdlaWdodE1pbiwgbVdhaXRpbmdRdWV1ZSk7CisKKwkJYVdlaWdodE1pbiA9IGFXYWl0aW5nU3RyYXRlZ3kuc3BsaWNlUHJpb3JRdWV1ZVRhYmxlKAorCQkJCW1XYWl0aW5nUXVldWUsICsrYVdlaWdodE1pbiwgYVdlaWdodE1heCk7CisJfQorCisJYVdhaXRpbmdTdHJhdGVneS5zcGxpY2UoYVdlaWdodE1pbiwgbVdhaXRpbmdRdWV1ZSk7CisKKworCWlmKCBtR2xvYmFsVW5jb3ZlcmVkVHJhbnNpdGlvbnMuZW1wdHkoKSApCisJeworCQltTGFzdENvbGxlY3RlZENvdmVyQ291bnQgPSBtQ292ZXJhZ2VTdGF0aXN0aWNzLm1OdW1iZXJPZkNvdmVyZWQ7CisKKwkJbVRyYW5zaXRpb25Db3ZlcmFnZS5jb2xsZWN0VW5jb3ZlcmVkVHJhbnNpdGlvbigKKwkJCQltR2xvYmFsVW5jb3ZlcmVkVHJhbnNpdGlvbnMpOworCX0KKwllbHNlIGlmKCBtTGFzdENvbGxlY3RlZENvdmVyQ291bnQgPCBtQ292ZXJhZ2VTdGF0aXN0aWNzLm1OdW1iZXJPZkNvdmVyZWQgKQorCXsKKwkJbUxhc3RDb2xsZWN0ZWRDb3ZlckNvdW50ID0gbUNvdmVyYWdlU3RhdGlzdGljcy5tTnVtYmVyT2ZDb3ZlcmVkOworCisJCW1UcmFuc2l0aW9uQ292ZXJhZ2UudXBkYXRlVW5jb3ZlcmVkVHJhbnNpdGlvbigKKwkJCQltR2xvYmFsVW5jb3ZlcmVkVHJhbnNpdGlvbnMpOworCX0KKworCisJYVdlaWdodE1pbiA9IGFXYWl0aW5nU3RyYXRlZ3kuc3BsaWNlUHJpb3JRdWV1ZVRhYmxlKAorCQkJbVdhaXRpbmdRdWV1ZSwgc2F2ZVdlaWdodE1pbiwgYVdlaWdodE1heCk7CisKKwl3aGlsZSggYVdlaWdodE1pbiA8PSBXRUlHSFRfVU5LTk9XTl9BQ0hJRVZBQkxFICkKKwl7CisJCWl0UXVldWUgPSBtV2FpdGluZ1F1ZXVlLmJlZ2luKCk7CisJCWVuZFF1ZXVlID0gbVdhaXRpbmdRdWV1ZS5lbmQoKTsKKwkJZm9yKCA7IGl0UXVldWUgIT0gZW5kUXVldWUgOyArK2l0UXVldWUgKQorCQl7CisJCQlpZiggY2hlY2tEaXJlY3RpdmVUcmFjZSgqKCppdFF1ZXVlKSwgbUdsb2JhbFVuY292ZXJlZFRyYW5zaXRpb25zKSApCisJCQl7CisJCQkJKCppdFF1ZXVlKS0+c2V0V2VpZ2h0KCBXRUlHSFRfU0VMRUNURURfQUNISUVWQUJMRSApOworCisJCQkJYVdhaXRpbmdTdHJhdGVneS5wdXNoKCAqaXRRdWV1ZSApOworCisJCQkJaXRRdWV1ZSA9IG1XYWl0aW5nUXVldWUuZXJhc2UoIGl0UXVldWUgKTsKKworCQkJCWFXYWl0aW5nU3RyYXRlZ3kuc3BsaWNlKGFXZWlnaHRNaW4sIG1XYWl0aW5nUXVldWUpOworCisJCQkJcmV0dXJuKCBzZXREaXJlY3RpdmVUcmFjZSgpICk7CisJCQl9CisJCX0KKworCQlhV2FpdGluZ1N0cmF0ZWd5LnNwbGljZShhV2VpZ2h0TWluLCBtV2FpdGluZ1F1ZXVlKTsKKworCQlhV2VpZ2h0TWluID0gYVdhaXRpbmdTdHJhdGVneS5zcGxpY2VQcmlvclF1ZXVlVGFibGUoCisJCQkJbVdhaXRpbmdRdWV1ZSwgKythV2VpZ2h0TWluLCBhV2VpZ2h0TWF4KTsKKwl9CisKKwlhV2FpdGluZ1N0cmF0ZWd5LnNwbGljZShhV2VpZ2h0TWluLCBtV2FpdGluZ1F1ZXVlKTsKKworCWlmKCBzZWxlY3REaXJlY3RpdmVUcmFjZSgpICkKKwl7CisJCWFXYWl0aW5nU3RyYXRlZ3kucmVtb3ZlKCBtRGlyZWN0aXZlRUMgKTsKKworCQltRGlyZWN0aXZlRUMtPnNldFdlaWdodCggV0VJR0hUX1NFTEVDVEVEX0FDSElFVkFCTEUgKTsKKworCQlhV2FpdGluZ1N0cmF0ZWd5LnB1c2goIG1EaXJlY3RpdmVFQyApOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCQlBVk1fT1NfVFJBQ0UgPDwgInNlbGVjdERpcmVjdGl2ZVRyYWNlIDo+ICI7CisJCW1EaXJlY3RpdmVFQy0+dHJhY2VNaW5pbXVtKEFWTV9PU19UUkFDRSk7CisJCWFXYWl0aW5nU3RyYXRlZ3kudG9TdHJlYW0oQVZNX09TX1RSQUNFKTsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisKKwkJcmVzZXRGYWlsZWRUcmFuc2l0aW9uVGFyZ2V0SGlzdG9yeSgpOworCisJCXJldHVybiggc2V0RGlyZWN0aXZlVHJhY2UoKSApOworCX0KKworCXJlc2V0RmFpbGVkVHJhbnNpdGlvblRhcmdldEhpc3RvcnkoKTsKKworCW1Db3ZlcmFnZVByb2Nlc3Nvci5zZXRSZXF1ZXN0SGV1cmlzdGljKCk7CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFRSQUNFIERSSVZFUiBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICogVVBEQVRFCisgKiBtQ2FjaGVGb3JEaXJlY3RpdmVUcmFjZXMKKyAqLwordm9pZCBBdm1Db3ZlcmFnZU9uZVRyYWNlRHJpdmVyOjphcHBlbmREaXJlY3RpdmVUcmFjZXMoQXZtVHJhY2VQcm9wZXJ0eSAmIGFUcmFjZSkKK3sKKwlpZiggbUNhY2hlRm9yRGlyZWN0aXZlVHJhY2VzLmVtcHR5KCkgKQorCXsKKwkJbUNhY2hlRm9yRGlyZWN0aXZlVHJhY2VzLnB1c2hfYmFjayggYVRyYWNlICk7CisJfQorLy8JZWxzZSBpZiggYVRyYWNlLmlzSW5mKCBzdGQ6Omxlc3M8YXZtX3NpemVfdD4oKSwKKy8vCQkJbUNhY2hlRm9yRGlyZWN0aXZlVHJhY2VzLmZyb250KCkgKSApCisJZWxzZSBpZiggYVRyYWNlLnNpemVMVCggbUNhY2hlRm9yRGlyZWN0aXZlVHJhY2VzLmZyb250KCkgKSApCisJeworCQltQ2FjaGVGb3JEaXJlY3RpdmVUcmFjZXMucHVzaF9mcm9udCggYVRyYWNlICk7CisJfQorCWVsc2UgaWYoIGFUcmFjZS5zaXplR1QoIG1DYWNoZUZvckRpcmVjdGl2ZVRyYWNlcy5iYWNrKCkgKSApCisJeworCQltQ2FjaGVGb3JEaXJlY3RpdmVUcmFjZXMucHVzaF9iYWNrKCBhVHJhY2UgKTsKKwl9CisJZWxzZQorCXsKKwkJaXRUcmFjZSA9IG1DYWNoZUZvckRpcmVjdGl2ZVRyYWNlcy5iZWdpbigpOworCQllbmRUcmFjZSA9IG1DYWNoZUZvckRpcmVjdGl2ZVRyYWNlcy5lbmQoKTsKKwkJZm9yKCA7IGl0VHJhY2UgIT0gZW5kVHJhY2UgOyArK2l0VHJhY2UgKQorCQl7CisJCQlpZiggYVRyYWNlLnNpemVMVCggKml0VHJhY2UgKSApCisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJbUNhY2hlRm9yRGlyZWN0aXZlVHJhY2VzLmluc2VydChpdFRyYWNlLCBhVHJhY2UpOworCX0KK30KKworCitib29sIEF2bUNvdmVyYWdlT25lVHJhY2VEcml2ZXI6OmNoZWNrRGlyZWN0aXZlQ29udGV4dCgKKwkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFEaXJlY3RpdmVFQywgQXZtVHJhbnNpdGlvbiAqIGFUcmFuc2l0aW9uKQoreworCWl0VHJhY2UgPSBtQ2FjaGVGb3JEaXJlY3RpdmVUcmFjZXMuYmVnaW4oKTsKKwllbmRUcmFjZSA9IG1DYWNoZUZvckRpcmVjdGl2ZVRyYWNlcy5lbmQoKTsKKwlmb3IoIDsgaXRUcmFjZSAhPSBlbmRUcmFjZSA7ICsraXRUcmFjZSApCisJeworCQlpZiggKCgmIGFEaXJlY3RpdmVFQykgPT0gKCppdFRyYWNlKS5tRUMpICYmCisJCQkoYVRyYW5zaXRpb24gID09ICgqaXRUcmFjZSkuYmFja1RyYW5zaXRpb24oKSkgKQorCQl7CisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKworCitib29sIEF2bUNvdmVyYWdlT25lVHJhY2VEcml2ZXI6OmNvbXB1dGVEaXJlY3RpdmVUcmFjZSgKKwkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFEaXJlY3RpdmVFQywgQXZtVHJhbnNpdGlvbiAqIGFUcmFuc2l0aW9uKQoreworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiQXZtQ292ZXJhZ2VUcmFjZURyaXZlciA6PiIgPDwgQVZNX1NUUl9JTkRFTlQ7CisJYURpcmVjdGl2ZUVDLnRyYWNlTWluaW11bShBVk1fT1NfVFJBQ0UpOworCUFWTV9PU19UUkFDRSA8PCBFTkRfSU5ERU5UOworCUFWTV9PU19UUkFDRSA8PCAiIHw9ICIgOyBhVHJhbnNpdGlvbi0+dG9TdHJlYW1IZWFkZXIoQVZNX09TX1RSQUNFKTsKKwlBVk1fT1NfVFJBQ0UgPDwgc3RkOjplbmRsOy8vIDw8IElOQ1JfSU5ERU5UOworLy8JQXZtVHJhbnNpdGlvbjo6dG9TdHJlYW0oQVZNX09TX1RSQUNFLCBtVHJhbnNpdGlvblRhcmdldEhpc3RvcnkpOworLy8JQVZNX09TX1RSQUNFIDw8IERFQ1JfSU5ERU5UOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisKKworLy8JaWYoIG1UcmFuc2l0aW9uVGFyZ2V0SGlzdG9yeS5jb250YWlucyhhVHJhbnNpdGlvbikgKQorLy8JeworLy8JCXJldHVybiggZmFsc2UgKTsKKy8vCX0KKy8vCWVsc2UKKwkJaWYoIGNoZWNrRGlyZWN0aXZlQ29udGV4dChhRGlyZWN0aXZlRUMsIGFUcmFuc2l0aW9uKSApCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCWVsc2UKKwl7CisJCW1QZW5kaW5nVHJhY2UuY2xlYXIoKTsKKworCQltRGlyZWN0aXZlRUMgPSBjb25zdF9jYXN0PCBFeGVjdXRpb25Db250ZXh0ICo+KCAmIGFEaXJlY3RpdmVFQyApOworCisJCVJ1bnRpbWVJRCBhUklEID0gYURpcmVjdGl2ZUVDLnJlZkV4ZWN1dGlvbkRhdGEoKS5nZXRSdW50aW1lSUQoCisJCQkJYVRyYW5zaXRpb24tPmdldEV4ZWN1dGFibGUoKSApOworCisJCWlmKCBtUGF0aENoZWNrZXIuY29tcHV0ZVBhdGgobVBlbmRpbmdUcmFjZSwKKwkJCQltRGlyZWN0aXZlRUMsIGFSSUQsIGFUcmFuc2l0aW9uLAorCQkJCW1IZXVyaXN0aWNQcm9wZXJ0eS5tRGlyZWN0aXZlVHJhY2VIZXVyaXN0aWNDbGFzcywKKwkJCQltSGV1cmlzdGljUHJvcGVydHkubURpcmVjdGl2ZVRyYWNlQ291bnRMaW1pdCwKKwkJCQltSGV1cmlzdGljUHJvcGVydHkubURpcmVjdGl2ZVRyYWNlU2l6ZUxpbWl0KSApCisJCXsKKwkJCW1QZW5kaW5nVHJhY2UubUVDID0gKCYgYURpcmVjdGl2ZUVDKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwltUGF0aENoZWNrZXIucmVwb3J0KEFWTV9PU19DT1VUKTsKKwltUGF0aENoZWNrZXIucmVwb3J0KEFWTV9PU19UUkFDRSk7CisJQVZNX09TX1RSQUNFIDw8IFJFUEVBVCgiPj4+Pj4+Pj4+PiIsIDEwKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCXJldHVybiggZmFsc2UgKTsKKwl9Cit9CisKKworYm9vbCBBdm1Db3ZlcmFnZU9uZVRyYWNlRHJpdmVyOjpzZWxlY3REaXJlY3RpdmVUcmFjZSgpCit7CisJaWYoIG1DYWNoZUZvckRpcmVjdGl2ZVRyYWNlcy5ub25lbXB0eSgpICkKKwl7CisJCXRvU3RyZWFtQ2FjaGUoIEFWTV9PU19UUkFDRSAsICJzZWxlY3REaXJlY3RpdmVUcmFjZSIgICk7CisKKwkJbVBlbmRpbmdUcmFjZS5jbGVhcigpOworCQltUGVuZGluZ1RyYWNlLmNvcHlUcmFjZSggbUNhY2hlRm9yRGlyZWN0aXZlVHJhY2VzLmZyb250KCkgKTsKKworCQltRGlyZWN0aXZlRUMgPSBjb25zdF9jYXN0PCBFeGVjdXRpb25Db250ZXh0ICogPiggbVBlbmRpbmdUcmFjZS5tRUMgKTsKKworCQltQ2FjaGVGb3JEaXJlY3RpdmVUcmFjZXMucG9wX2Zyb250KCk7CisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCitib29sIEF2bUNvdmVyYWdlT25lVHJhY2VEcml2ZXI6OnNldERpcmVjdGl2ZVRyYWNlKCkKK3sKKwltVHJhbnNpdGlvblRhcmdldEhpc3RvcnkucHVzaF9mcm9udCggbVBlbmRpbmdUcmFjZS5iYWNrVHJhbnNpdGlvbigpICk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX1RSQUNFIDw8IHN0ZDo6ZW5kbCA8PCBSRVBFQVQoIisrKysrKysrKysiLCAxMCkgPDwgc3RkOjplbmRsOworCUFWTV9PU19UUkFDRSA8PCAiT2JqZWN0aXZlVHJhY2U6PiAiIDw8IG1EaXJlY3RpdmVFQy0+c3RyX21pbigpIDw8IHN0ZDo6ZW5kbDsKKwltUGVuZGluZ1RyYWNlLnRvU3RyZWFtKEFWTV9PU19UUkFDRSwgdHJ1ZSk7CisJQVZNX09TX1RSQUNFIDw8IFJFUEVBVCgiKysrKysrKysrKyIsIDEwKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworCisKK2Jvb2wgQXZtQ292ZXJhZ2VPbmVUcmFjZURyaXZlcjo6dXBkYXRlQ2FjaGVGb3JEaXJlY3RpdmVUcmFjZXMoCisJCWNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKQoreworCWJvb2wgaXNVcGRhdGVkID0gZmFsc2U7CisKKwlpZiggLy8obUxhc3RDb2xsZWN0ZWRDb3ZlckNvdW50ID09IG1Db3ZlcmFnZVN0YXRpc3RpY3MubU51bWJlck9mQ292ZXJlZCkgfHwKKwkJCW1DYWNoZUZvckRpcmVjdGl2ZVRyYWNlcy5lbXB0eSgpICkKKwl7CisJCXJldHVybiggaXNVcGRhdGVkICk7CisJfQorCisJZW5kVHJhY2UgPSBtQ2FjaGVGb3JEaXJlY3RpdmVUcmFjZXMuZW5kKCk7CisJZm9yKCBpdFRyYWNlID0gbUNhY2hlRm9yRGlyZWN0aXZlVHJhY2VzLmJlZ2luKCkgOyBpdFRyYWNlICE9IGVuZFRyYWNlIDsgKQorCXsKKwkJaWYoICgqaXRUcmFjZSkubUVDID09ICgmIGFuRUMpICkKKwkJeworCQkJaXNVcGRhdGVkID0gdHJ1ZTsKKworCQkJaXRUcmFjZSA9IG1DYWNoZUZvckRpcmVjdGl2ZVRyYWNlcy5lcmFzZSggaXRUcmFjZSApOworCQl9CisJCWVsc2UKKwkJeworCQkJKytpdFRyYWNlOworCQl9CisJfQorCisJcmV0dXJuKCBpc1VwZGF0ZWQgKTsKK30KKworCitib29sIEF2bUNvdmVyYWdlT25lVHJhY2VEcml2ZXI6OnVwZGF0ZUNhY2hlRm9yRGlyZWN0aXZlVHJhY2VzKAorCQlBdm1UcmFuc2l0aW9uICogYVRyYW5zaXRpb24pCit7CisJYm9vbCBpc1VwZGF0ZWQgPSBmYWxzZTsKKworCW1UcmFuc2l0aW9uVGFyZ2V0SGlzdG9yeS5yZW1vdmUoIGFUcmFuc2l0aW9uICk7CisKKwlpZiggLy8obUxhc3RDb2xsZWN0ZWRDb3ZlckNvdW50ID09IG1Db3ZlcmFnZVN0YXRpc3RpY3MubU51bWJlck9mQ292ZXJlZCkgfHwKKwkJCW1DYWNoZUZvckRpcmVjdGl2ZVRyYWNlcy5lbXB0eSgpICkKKwl7CisJCXJldHVybiggaXNVcGRhdGVkICk7CisJfQorCisJZW5kVHJhY2UgPSBtQ2FjaGVGb3JEaXJlY3RpdmVUcmFjZXMuZW5kKCk7CisJZm9yKCBpdFRyYWNlID0gbUNhY2hlRm9yRGlyZWN0aXZlVHJhY2VzLmJlZ2luKCkgOyBpdFRyYWNlICE9IGVuZFRyYWNlIDsgKQorCXsKKwkJdG1wVHJhbnNpdGlvbiA9ICgqaXRUcmFjZSkuYmFja1RyYW5zaXRpb24oKTsKKworCQlpZiggdG1wVHJhbnNpdGlvbiA9PSBhVHJhbnNpdGlvbiApCisJCXsKKwkJCWlzVXBkYXRlZCA9IHRydWU7CisKKwkJCWl0VHJhY2UgPSBtQ2FjaGVGb3JEaXJlY3RpdmVUcmFjZXMuZXJhc2UoIGl0VHJhY2UgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCSsraXRUcmFjZTsKKwkJfQorCX0KKworCXJldHVybiggaXNVcGRhdGVkICk7Cit9CisKKworYm9vbCBBdm1Db3ZlcmFnZU9uZVRyYWNlRHJpdmVyOjp1cGRhdGVDYWNoZUZvckRpcmVjdGl2ZVRyYWNlcygpCit7CisvLwltQ2FjaGVGb3JEaXJlY3RpdmVUcmFjZXMuY2xlYXIoKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwlBVk1fT1NfVFJBQ0UgPDwgInVwZGF0ZUNhY2hlRm9yRGlyZWN0aXZlVHJhY2VzOj4gc2l6ZTogIgorCQkJPDwgbUNhY2hlRm9yRGlyZWN0aXZlVHJhY2VzLnNpemUoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCisJdXBkYXRlVHJhbnNpdGlvblRhcmdldEhpc3RvcnkoKTsKKworCWJvb2wgaXNVcGRhdGVkID0gZmFsc2U7CisKKwlpZiggLy8obUxhc3RDb2xsZWN0ZWRDb3ZlckNvdW50ID09IG1Db3ZlcmFnZVN0YXRpc3RpY3MubU51bWJlck9mQ292ZXJlZCkgfHwKKwkJCW1DYWNoZUZvckRpcmVjdGl2ZVRyYWNlcy5lbXB0eSgpICkKKwl7CisJCXJldHVybiggaXNVcGRhdGVkICk7CisJfQorCisJZW5kVHJhY2UgPSBtQ2FjaGVGb3JEaXJlY3RpdmVUcmFjZXMuZW5kKCk7CisJZm9yKCBpdFRyYWNlID0gbUNhY2hlRm9yRGlyZWN0aXZlVHJhY2VzLmJlZ2luKCkgOyBpdFRyYWNlICE9IGVuZFRyYWNlIDsgKQorCXsKKwkJdG1wVHJhbnNpdGlvbiA9ICgqaXRUcmFjZSkuYmFja1RyYW5zaXRpb24oKTsKKworCQlpZiggKCppdFRyYWNlKS5tRUMtPmhhc05leHQoKSApCisJCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCUFWTV9PU19UUkFDRSA8PCAicmVtb3ZlPEVDPiI7CisJKCppdFRyYWNlKS5tRUMtPnRyYWNlTWluaW11bSggQVZNX09TX1RSQUNFICk7CisJQVZNX09TX1RSQUNFIDw8ICJcdHRyYW5zaXRpb246PiAiIDw8IHRtcFRyYW5zaXRpb24tPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisKKwkJCWlzVXBkYXRlZCA9IHRydWU7CisKKwkJCWl0VHJhY2UgPSBtQ2FjaGVGb3JEaXJlY3RpdmVUcmFjZXMuZXJhc2UoIGl0VHJhY2UgKTsKKwkJfQorCQllbHNlIGlmKCBtVHJhbnNpdGlvbkNvdmVyYWdlLnRlc3RUcmFuc2l0aW9uQ292ZXJhZ2UoIHRtcFRyYW5zaXRpb24gKSApCisJCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCUFWTV9PU19UUkFDRSA8PCAicmVtb3ZlPHRyYW5zaXRpb24+ICI7CisJKCppdFRyYWNlKS5tRUMtPnRyYWNlTWluaW11bSggQVZNX09TX1RSQUNFICk7CisJQVZNX09TX1RSQUNFIDw8ICJcdHRyYW5zaXRpb246PiAiIDw8IHRtcFRyYW5zaXRpb24tPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisKKwkJCWlzVXBkYXRlZCA9IHRydWU7CisKKwkJCWl0VHJhY2UgPSBtQ2FjaGVGb3JEaXJlY3RpdmVUcmFjZXMuZXJhc2UoIGl0VHJhY2UgKTsKKworCQkJbVRyYW5zaXRpb25UYXJnZXRIaXN0b3J5LnJlbW92ZSggdG1wVHJhbnNpdGlvbiApOworCQl9CisJCWVsc2UKKwkJeworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwlBVk1fT1NfVFJBQ0UgPDwgInByZXNlcnZlIDo+ICI7ICgqaXRUcmFjZSkubUVDLT50cmFjZU1pbmltdW0oIEFWTV9PU19UUkFDRSApOworCUFWTV9PU19UUkFDRSA8PCAiXHR0cmFuc2l0aW9uOj4gIiA8PCB0bXBUcmFuc2l0aW9uLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCisJCQkrK2l0VHJhY2U7CisJCX0KKwl9CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX1RSQUNFIDw8ICJ1cGRhdGVDYWNoZUZvckRpcmVjdGl2ZVRyYWNlczo+IHNpemU8dXBkYXRlPjogIgorCQkJPDwgbUNhY2hlRm9yRGlyZWN0aXZlVHJhY2VzLnNpemUoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCisJcmV0dXJuKCBpc1VwZGF0ZWQgKTsKK30KKworCitib29sIEF2bUNvdmVyYWdlT25lVHJhY2VEcml2ZXI6OnVwZGF0ZVRyYW5zaXRpb25UYXJnZXRIaXN0b3J5KCkKK3sKKwlib29sIGlzVXBkYXRlZCA9IGZhbHNlOworCisJTGlzdE9mQXZtVHJhbnNpdGlvbjo6aXRlcmF0b3IgaXRUcmFuc2l0aW9uID0gbVRyYW5zaXRpb25UYXJnZXRIaXN0b3J5LmJlZ2luKCk7CisJTGlzdE9mQXZtVHJhbnNpdGlvbjo6aXRlcmF0b3IgZW5kVHJhbnNpdGlvbiA9IG1UcmFuc2l0aW9uVGFyZ2V0SGlzdG9yeS5lbmQoKTsKKwlmb3IoIDsgaXRUcmFuc2l0aW9uICE9IGVuZFRyYW5zaXRpb24gOyApCisJeworCQlpZiggbVRyYW5zaXRpb25Db3ZlcmFnZS50ZXN0VHJhbnNpdGlvbkNvdmVyYWdlKCAqaXRUcmFuc2l0aW9uICkgKQorCQl7CisJCQlpdFRyYW5zaXRpb24gPSBtVHJhbnNpdGlvblRhcmdldEhpc3RvcnkuZXJhc2UoIGl0VHJhbnNpdGlvbiApOworCisJCQlpc1VwZGF0ZWQgPSB0cnVlOworCQl9CisJCWVsc2UKKwkJeworCQkJKytpdFRyYW5zaXRpb247CisJCX0KKwl9CisKKwlyZXR1cm4oIGlzVXBkYXRlZCApOworfQorCisvKioKKyAqIENvbXB1dGUgYSBkaXJlY3RpdmUgdHJhY2UKKyAqLworYm9vbCBBdm1Db3ZlcmFnZU9uZVRyYWNlRHJpdmVyOjpjaGVja0RpcmVjdGl2ZVRyYWNlKAorCQljb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQykKK3sKKwltTG9jYWxVbmNvdmVyZWRUcmFuc2l0aW9ucy5jbGVhcigpOworCisJbVRyYW5zaXRpb25Db3ZlcmFnZS5jb2xsZWN0VW5jb3ZlcmVkVHJhbnNpdGlvbigKKwkJCWFuRUMucmVmRXhlY3V0aW9uRGF0YSgpLCBtTG9jYWxVbmNvdmVyZWRUcmFuc2l0aW9ucyk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCUFWTV9PU19UUkFDRSA8PCAiY2hlY2tEaXJlY3RpdmVUcmFjZTo+IGxvY2FsIHVuY292ZXJlZCB0cmFuc2l0aW9ucyBjb3VudDogIgorCQkJPDwgbUxvY2FsVW5jb3ZlcmVkVHJhbnNpdGlvbnMuc2l6ZSgpIDw8IHN0ZDo6ZW5kbDsKKwlWZWN0b3JPZkF2bVRyYW5zaXRpb246OmNvbnN0X2l0ZXJhdG9yIGl0VHJhbnNpdGlvbiA9IG1Mb2NhbFVuY292ZXJlZFRyYW5zaXRpb25zLmJlZ2luKCk7CisJVmVjdG9yT2ZBdm1UcmFuc2l0aW9uOjpjb25zdF9pdGVyYXRvciBlbmRUcmFuc2l0aW9uID0gbUxvY2FsVW5jb3ZlcmVkVHJhbnNpdGlvbnMuZW5kKCk7CisJZm9yKCA7IGl0VHJhbnNpdGlvbiAhPSBlbmRUcmFuc2l0aW9uIDsgKytpdFRyYW5zaXRpb24gKQorCXsKKwkJQVZNX09TX1RSQUNFIDw8ICJcdCIgPDwgKCppdFRyYW5zaXRpb24pLT5zdHJUcmFuc2l0aW9uSGVhZGVyKCkgPDwgc3RkOjplbmRsOworCX0KK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCisJcmV0dXJuKCBjaGVja0RpcmVjdGl2ZVRyYWNlKGFuRUMsIG1Mb2NhbFVuY292ZXJlZFRyYW5zaXRpb25zKSApOworfQorCisKK2Jvb2wgQXZtQ292ZXJhZ2VPbmVUcmFjZURyaXZlcjo6Y2hlY2tEaXJlY3RpdmVUcmFjZSgKKwkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMsCisJCWNvbnN0IFZlY3Rvck9mQXZtVHJhbnNpdGlvbiAmIHRhYmxlb2ZUcmFuc2l0aW9ucykKK3sKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCUFWTV9PU19UUkFDRSA8PCBzdGQ6OmVuZGwgPDwgUkVQRUFUKCI8PDw8PDw8PDw8IiwgMTApIDw8IHN0ZDo6ZW5kbDsKKwlBVk1fT1NfVFJBQ0UgPDwgImNoZWNrRGlyZWN0aXZlVHJhY2U6PiAiOyAgYW5FQy50cmFjZU1pbmltdW0oQVZNX09TX1RSQUNFKTsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCisJaXRUcmFuc2l0aW9uID0gdGFibGVvZlRyYW5zaXRpb25zLmJlZ2luKCk7CisJZW5kVHJhbnNpdGlvbiA9IHRhYmxlb2ZUcmFuc2l0aW9ucy5lbmQoKTsKKwlmb3IoIDsgaXRUcmFuc2l0aW9uICE9IGVuZFRyYW5zaXRpb24gOyArK2l0VHJhbnNpdGlvbiApCisJeworCQlpZiggY29tcHV0ZURpcmVjdGl2ZVRyYWNlKGFuRUMsICppdFRyYW5zaXRpb24pICkKKwkJeworCQkJaWYoIG1QZW5kaW5nVHJhY2UubVNpemUgPCBtRGVmYXVsdFBlbmRpbmdUcmFjZVNpemUgKQorCQkJeworCQkJCXJldHVybiggdHJ1ZSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWFwcGVuZERpcmVjdGl2ZVRyYWNlcyggbVBlbmRpbmdUcmFjZSApOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKK2Jvb2wgQXZtQ292ZXJhZ2VPbmVUcmFjZURyaXZlcjo6ZHJpdmUoKQoreworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwlBVk1fT1NfVFJBQ0UgPDwgc3RkOjplbmRsIDw8IFJFUEVBVCgiPT09PT09PT09PSIsIDEwKSA8PCBzdGQ6OmVuZGw7CisJQVZNX09TX1RSQUNFIDw8ICJEaXJlY3RpdmVUcmFjZTo+ICIgPDwgbURpcmVjdGl2ZUVDLT5zdHJfbWluKCkgPDwgc3RkOjplbmRsOworCW1QZW5kaW5nVHJhY2UudG9TdHJlYW0oQVZNX09TX1RSQUNFKTsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisKKwljb3ZlcmFnZU1heCA9IDA7CisKKwllbmRUUCA9IG1QZW5kaW5nVHJhY2UucG9pbnRzLmVuZCgpOworCisJZW5kRUMgPSBtRGlyZWN0aXZlRUMtPmVuZCgpOworCWZvciggaXRFQyA9IG1EaXJlY3RpdmVFQy0+YmVnaW4oKSA7IGl0RUMgIT0gZW5kRUMgOyArK2l0RUMgKQorCXsKKwkJY292ZXJhZ2VDb3VudCA9IDA7CisKKwkJZm9yKCBpdFRQID0gbVBlbmRpbmdUcmFjZS5wb2ludHMuYmVnaW4oKSA7IGl0VFAgIT0gZW5kVFAgOyArK2l0VFAgKQorCQl7CisJCQl0bXBUcmFjZVBvaW50ID0gKCppdFRQKS50b19wdHI8IFRyYWNlUG9pbnQgPigpOworCisJCQlpZiggbVRyYWNlQ2hlY2tlci5pc1NhdFRyYW5zaXRpb24oKigqaXRFQyksCisJCQkJCXRtcFRyYWNlUG9pbnQsICgqaXRFQyktPmdldFJ1bm5hYmxlRWxlbWVudFRyYWNlKCkpICkKKwkJCXsKKwkJCQkrK2NvdmVyYWdlQ291bnQ7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYoIChjb3ZlcmFnZUNvdW50ID4gMCkgJiYgdG1wVHJhY2VQb2ludC0+b2JqZWN0LT4KKwkJCQkJCWFzPCBBdm1UcmFuc2l0aW9uID4oKS0+aXNVbnN0YWJsZVNvdXJjZSgpICkKKwkJCQl7CisJCQkJCWNvdmVyYWdlQ291bnQgPSAwOworCQkJCX0KKworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYoIGNvdmVyYWdlQ291bnQgPiBjb3ZlcmFnZU1heCApCisJCXsKKwkJCWNvdmVyYWdlTWF4ID0gY292ZXJhZ2VDb3VudDsKKworCQkJbURpcmVjdGl2ZUVDID0gKCppdEVDKTsKKworCQkJbURpcmVjdGl2ZUVDLT5zZXRXZWlnaHQoIFdFSUdIVF9TVFJPTkdMWV9BQ0hJRVZBQkxFICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQltVHJhbnNpdGlvbkNvdmVyYWdlLmNvbXB1dGVXZWlnaHQoICppdEVDICk7CisKKy8vCQkJKCppdEVDKS0+c2V0V2VpZ2h0KCBXRUlHSFRfTk9OX1BSSU9SSVRZICk7CisJCX0KKwl9CisKKwlpZiggY292ZXJhZ2VNYXggPiAwICkKKwl7CisJCWlmKCBjb3ZlcmFnZU1heCA8IG1QZW5kaW5nVHJhY2UubVNpemUgKQorCQl7CisJCQltUGVuZGluZ1RyYWNlLnBvcF9mcm9udCggY292ZXJhZ2VNYXggKTsKKworCQkJbURpcmVjdGl2ZUVDLT5zZXRXZWlnaHQoIFdFSUdIVF9TRUxFQ1RFRF9BQ0hJRVZBQkxFICk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX1RSQUNFIDw8ICJISVQgISBFQzo+ICI7IG1EaXJlY3RpdmVFQy0+dHJhY2VNaW5pbXVtKEFWTV9PU19UUkFDRSk7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCQl9CisJCWVsc2UKKwkJeworCQkJbVRyYW5zaXRpb25UYXJnZXRIaXN0b3J5LnBvcF9mcm9udCgpOworCisJCQltUGVuZGluZ1RyYWNlLmNsZWFyKCk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX1RSQUNFIDw8ICJHT0FMIEFDSElFVkVEICEhISIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwkJfQorCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCUFWTV9PU19UUkFDRSA8PCBSRVBFQVQoIj09PT09PT09PT0iLCAxMCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisJZWxzZQorCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX1RSQUNFIDw8ICJHT0FMIEZBSUxFRCAhISEiIDw8IHN0ZDo6ZW5kbDsKKwlBVk1fT1NfVFJBQ0UgPDwgUkVQRUFUKCI9PT09PT09PT09IiwgMTApIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU0VSSUFMSVpBVElPTiBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgQXZtQ292ZXJhZ2VPbmVUcmFjZURyaXZlcjo6dG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJb3MgPDwgIlRyYW5zaXRpb24gdG8gcmVhY2ggOj4gIjsKKworCUF2bVRyYW5zaXRpb24gKiBhVHJhbnNpdGlvbiA9IG1QZW5kaW5nVHJhY2UuYmFja1RyYW5zaXRpb24oKTsKKworCWFUcmFuc2l0aW9uLT50b1N0cmVhbUhlYWRlcihvcyk7CisJaWYoIGFUcmFuc2l0aW9uLT5oYXNJbnRlcm5hbENvbW11bmljYXRpb25Db2RlKCkgKQorCXsKKwkJb3MgPDwgIiAiOworCQlCYXNlQ29tcGlsZWRGb3JtOjp0b1N0cmVhbVN0YXRpY0NvbShvcywKKwkJCQlhVHJhbnNpdGlvbi0+Z2V0SW50ZXJuYWxDb21tdW5pY2F0aW9uQ29kZSgpKTsKKwl9CisJb3MgPDwgRU9MX0ZMVVNIOworCisJb3MgPDwgIkNvbXB1dGVkIHRyYWNlIHRvIHJlYWNoIGl0IDo+ICI7CisJbVBlbmRpbmdUcmFjZS50b1N0cmVhbShvcyk7CisKKwlBVk1fT1NfVFJBQ0UgPDwgIkdPQUwgIiA8PCAoIGdvYWxBY2hpZXZlZCgpID8gIkFDSElFVkVEIiA6ICJGQUlMRUQiICkKKwkJCTw8ICIgISEhIiA8PCBzdGQ6OmVuZGw7Cit9CisKKwordm9pZCBBdm1Db3ZlcmFnZU9uZVRyYWNlRHJpdmVyOjp0b1N0cmVhbUNhY2hlKAorCQlPdXRTdHJlYW0gJiBvcywgY29uc3Qgc3RkOjpzdHJpbmcgc3RyTWVzc2FnZSkgY29uc3QKK3sKKwlvcyA8PCBUQUIgPDwgc3RyTWVzc2FnZSA8PCAiPHNpemU6ICIgPDwgbUNhY2hlRm9yRGlyZWN0aXZlVHJhY2VzLnNpemUoKQorCQkJPDwgIj4geyIgPDwgRU9MX0lOQ1JfSU5ERU5UOworCisJTGlzdE9mQXZtVHJhY2VQcm9wZXJ0eTo6Y29uc3RfaXRlcmF0b3IgaXRUcmFjZSA9CisJCQltQ2FjaGVGb3JEaXJlY3RpdmVUcmFjZXMuYmVnaW4oKTsKKwlMaXN0T2ZBdm1UcmFjZVByb3BlcnR5Ojpjb25zdF9pdGVyYXRvciBlbmRUcmFjZSA9CisJCQltQ2FjaGVGb3JEaXJlY3RpdmVUcmFjZXMuZW5kKCk7CisJZm9yKCA7IGl0VHJhY2UgIT0gZW5kVHJhY2UgOyArK2l0VHJhY2UgKQorCXsKKwkJKCppdFRyYWNlKS50b1N0cmVhbShvcywgZmFsc2UpOworCX0KKworCW9zIDw8IFRBQiA8PCAibVRyYW5zaXRpb25UYXJnZXRIaXN0b3J5PHNpemU6ICIKKwkJCTw8IG1UcmFuc2l0aW9uVGFyZ2V0SGlzdG9yeS5zaXplKCkgPDwgIj4iIDw8IEVPTDsKKwlBdm1UcmFuc2l0aW9uOjp0b1N0cmVhbShvcywgbVRyYW5zaXRpb25UYXJnZXRIaXN0b3J5KTsKKworCW9zIDw8IERFQ1JfSU5ERU5UX1RBQiA8PCAifSIgPDwgRU9MX0ZMVVNIOworfQorCisKKworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2NvdmVyYWdlL0F2bUNvdmVyYWdlT25lVHJhY2VEcml2ZXIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9jb3ZlcmFnZS9Bdm1Db3ZlcmFnZU9uZVRyYWNlRHJpdmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ3ZGYwNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9jb3ZlcmFnZS9Bdm1Db3ZlcmFnZU9uZVRyYWNlRHJpdmVyLmgKQEAgLTAsMCArMSwyMzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxOSBub3YuIDIwMTQKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBBVk1DT1ZFUkFHRU9ORVRSQUNFRFJJVkVSX0hfCisjZGVmaW5lIEFWTUNPVkVSQUdFT05FVFJBQ0VEUklWRVJfSF8KKworI2luY2x1ZGUgIkF2bUNvdmVyYWdlQWJzdHJhY3RWaWV3LmgiCisKKyNpbmNsdWRlIDxjb2xsZWN0aW9uL1R5cGVkZWYuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkNvbnRleHQuaD4KKworI2luY2x1ZGUgPGZtbC90cmFjZS9UcmFjZUNoZWNrZXIuaD4KKworI2luY2x1ZGUgPGZhbS9jb3ZlcmFnZS9Bdm1Db3ZlcmFnZURpcmVjdGl2ZVRyYWNlQnVpbGRlci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworY2xhc3MgV2FpdGluZ1N0cmF0ZWd5OworY2xhc3MgQXZtVHJhbnNpdGlvbjsKK2NsYXNzIEF2bUNvdmVyYWdlVHJhbnNpdGlvblZpZXc7CitjbGFzcyBFdmFsdWF0aW9uRW52aXJvbm1lbnQ7CisKKworY2xhc3MgQXZtQ292ZXJhZ2VPbmVUcmFjZURyaXZlciAgOiAgcHVibGljIEF2bUNvdmVyYWdlQWJzdHJhY3RWaWV3Cit7CisKKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggQXZtQ292ZXJhZ2VPbmVUcmFjZURyaXZlciApCisKKworcHJvdGVjdGVkOgorCUF2bUNvdmVyYWdlVHJhbnNpdGlvblZpZXcgJiBtVHJhbnNpdGlvbkNvdmVyYWdlOworCisJRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WOworCVRyYWNlQ2hlY2tlciBtVHJhY2VDaGVja2VyOworCisJYXZtX3NpemVfdCBtQ29tcHV0aW5nUGF0aENvdW50TGltaXQ7CisJYXZtX3NpemVfdCBtQ29tcHV0aW5nUGF0aFNpemVMaW1pdDsKKwlBdm1Db3ZlcmFnZURpcmVjdGl2ZVRyYWNlQnVpbGRlciBtUGF0aENoZWNrZXI7CisKKwlMaXN0T2ZBdm1UcmFuc2l0aW9uIG1UcmFuc2l0aW9uVGFyZ2V0SGlzdG9yeTsKKworCUxpc3RPZkF2bVRyYWNlUHJvcGVydHkgbUNhY2hlRm9yRGlyZWN0aXZlVHJhY2VzOworCisJRXhlY3V0aW9uQ29udGV4dCAqIG1EaXJlY3RpdmVFQzsKKworCWF2bV9zaXplX3QgbURlZmF1bHRQZW5kaW5nVHJhY2VTaXplOworCisJQXZtVHJhY2VQcm9wZXJ0eSBtUGVuZGluZ1RyYWNlOworCisJTGlzdE9mRXhlY3V0aW9uQ29udGV4dCBtV2FpdGluZ1F1ZXVlOworCisJVmVjdG9yT2ZBdm1UcmFuc2l0aW9uIG1HbG9iYWxVbmNvdmVyZWRUcmFuc2l0aW9uczsKKwlhdm1fc2l6ZV90IG1MYXN0Q29sbGVjdGVkQ292ZXJDb3VudDsKKworCVZlY3Rvck9mQXZtVHJhbnNpdGlvbiBtTG9jYWxVbmNvdmVyZWRUcmFuc2l0aW9uczsKKworCS8vIENvbXB1dGluZyBkcml2ZSB2YXJpYWJsZQorCWF2bV91aW50OF90IHNhdmVXZWlnaHRNaW47CisKKwlhdm1fc2l6ZV90IGNvdmVyYWdlTWF4OworCWF2bV9zaXplX3QgY292ZXJhZ2VDb3VudDsKKworCVRyYWNlUG9pbnQgKiB0bXBUcmFjZVBvaW50OworCUJGTGlzdDo6Y29uc3RfaXRlcmF0b3IgaXRUUDsKKwlCRkxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGVuZFRQOworCisJQXZtVHJhbnNpdGlvbiAqIHRtcFRyYW5zaXRpb247CisJVmVjdG9yT2ZBdm1UcmFuc2l0aW9uOjpjb25zdF9pdGVyYXRvciBpdFRyYW5zaXRpb247CisJVmVjdG9yT2ZBdm1UcmFuc2l0aW9uOjpjb25zdF9pdGVyYXRvciBlbmRUcmFuc2l0aW9uOworCisJTGlzdE9mQXZtVHJhY2VQcm9wZXJ0eTo6aXRlcmF0b3IgaXRUcmFjZTsKKwlMaXN0T2ZBdm1UcmFjZVByb3BlcnR5OjppdGVyYXRvciBlbmRUcmFjZTsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQXZtQ292ZXJhZ2VPbmVUcmFjZURyaXZlcihBdm1Db3ZlcmFnZVByb2Nlc3NvciAmIGFDb3ZlcmFnZVByb2Nlc3NvciwKKwkJCUV2YWx1YXRpb25FbnZpcm9ubWVudCAmIGFuRU5WLAorCQkJSUhldXJpc3RpY0NsYXNzOjpFTlVNX0hFVVJJU1RJQ19DTEFTUworCQkJCQlhbkhldXJpc3RpY0NsYXNzID0gSUhldXJpc3RpY0NsYXNzOjpIRVVSSVNUSUNfU01BUlRfQ0xBU1MsCisJCQlhdm1fc2l6ZV90IHBhdGhDb3VudExpbWl0ID0gOCwgYXZtX3NpemVfdCBwYXRoU2l6ZUxpbWl0ID0gOCk7CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+QXZtQ292ZXJhZ2VPbmVUcmFjZURyaXZlcigpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIG1UcmFuc2l0aW9uVGFyZ2V0SGlzdG9yeQorCSAqLworCWlubGluZSBib29sIGNvdWxkUmV0cnkoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVHJhbnNpdGlvblRhcmdldEhpc3Rvcnkubm9uZW1wdHkoKSApOworCX0KKworCWlubGluZSBib29sIGhhc0ZhaWxlZFRyYW5zaXRpb25UYXJnZXRIaXN0b3J5KCljb25zdAorCXsKKwkJcmV0dXJuKCBtVHJhbnNpdGlvblRhcmdldEhpc3Rvcnkubm9uZW1wdHkoKSApOworCX0KKworCisJaW5saW5lIHZvaWQgcmVzZXRGYWlsZWRUcmFuc2l0aW9uVGFyZ2V0SGlzdG9yeSgpCisJeworCQltVHJhbnNpdGlvblRhcmdldEhpc3RvcnkuY2xlYXIoKTsKKwl9CisKKworCS8qKgorCSAqIFVQREFURQorCSAqIG1DYWNoZUZvckRpcmVjdGl2ZVRyYWNlcworCSAqLworCXZvaWQgYXBwZW5kRGlyZWN0aXZlVHJhY2VzKEF2bVRyYWNlUHJvcGVydHkgJiBhVHJhY2UpOworCisJYm9vbCBjaGVja0RpcmVjdGl2ZUNvbnRleHQoY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFEaXJlY3RpdmVFQyk7CisKKwlib29sIGNoZWNrRGlyZWN0aXZlQ29udGV4dCgKKwkJCWNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhRGlyZWN0aXZlRUMsCisJCQlBdm1UcmFuc2l0aW9uICogYVRyYW5zaXRpb24pOworCisJYm9vbCBjb21wdXRlRGlyZWN0aXZlVHJhY2UoCisJCQljb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYURpcmVjdGl2ZUVDLAorCQkJQXZtVHJhbnNpdGlvbiAqIGFUcmFuc2l0aW9uKTsKKworCWJvb2wgc2VsZWN0RGlyZWN0aXZlVHJhY2UoKTsKKwlib29sIHNldERpcmVjdGl2ZVRyYWNlKCk7CisKKwlib29sIHVwZGF0ZUNhY2hlRm9yRGlyZWN0aXZlVHJhY2VzKGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKTsKKworCWJvb2wgdXBkYXRlQ2FjaGVGb3JEaXJlY3RpdmVUcmFjZXMoQXZtVHJhbnNpdGlvbiAqIGFUcmFuc2l0aW9uKTsKKworCWJvb2wgdXBkYXRlQ2FjaGVGb3JEaXJlY3RpdmVUcmFjZXMoKTsKKworCWJvb2wgdXBkYXRlVHJhbnNpdGlvblRhcmdldEhpc3RvcnkoKTsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBDT1ZFUkFHRSBQUk9DRVNTT1IgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBDT05GSUdVUkUgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJaW5saW5lIHZpcnR1YWwgYm9vbCBjb25maWd1cmUoKQorCXsKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisJdmlydHVhbCBib29sIGNvbmZpZ3VyZUltcGwoKTsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFBST0NFU1MgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gRklMVEVSIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWJvb2wgcHJlZmlsdGVyaW5nKExpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBlY1F1ZXVlKTsKKworCWJvb2wgcG9zdGZpbHRlcmluZyhMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgZWNRdWV1ZSk7CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gUFJPQ0VTU09SIFJFUVVFU1QgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8qKgorCSAqIFJFUVVFVUVfV0FJVElORworCSAqLworCWJvb2wgcmVxdWV1ZVdhaXRpbmdUYWJsZShXYWl0aW5nU3RyYXRlZ3kgJiBhV2FpdGluZ1N0cmF0ZWd5LAorCQkJYXZtX3VpbnQ4X3QgYVdlaWdodE1pbiwgYXZtX3VpbnQ4X3QgYVdlaWdodE1heCk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBUUkFDRSBEUklWRVIgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJYm9vbCBjaGVja0RpcmVjdGl2ZVRyYWNlKGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKTsKKworCWJvb2wgY2hlY2tEaXJlY3RpdmVUcmFjZShjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQywKKwkJCWNvbnN0IFZlY3Rvck9mQXZtVHJhbnNpdGlvbiAmIHRhYmxlb2ZUcmFuc2l0aW9ucyk7CisKKwlpbmxpbmUgYm9vbCBnb2FsQWNoaWV2ZWQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUGVuZGluZ1RyYWNlLmVtcHR5KCkgKTsKKwl9CisKKwlib29sIGRyaXZlKCk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBTRVJJQUxJWkFUSU9OIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXZpcnR1YWwgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKKwl2aXJ0dWFsIHZvaWQgdG9TdHJlYW1DYWNoZShPdXRTdHJlYW0gJiBvcywKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nIHN0ck1lc3NhZ2UgPSAiVGhlIERpcmVjdGl2ZSBUcmFjZSBDYWNoZSIpIGNvbnN0OworCisKK307CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKiBBVk1DT1ZFUkFHRU9ORVRSQUNFRFJJVkVSX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vY292ZXJhZ2UvQXZtQ292ZXJhZ2VQcm9jZXNzb3IuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2NvdmVyYWdlL0F2bUNvdmVyYWdlUHJvY2Vzc29yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2QyYzY1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2NvdmVyYWdlL0F2bUNvdmVyYWdlUHJvY2Vzc29yLmNwcApAQCAtMCwwICsxLDY3MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDE5IG5vdi4gMjAxNAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQXZtQ292ZXJhZ2VQcm9jZXNzb3IuaCIKKworI2luY2x1ZGUgPGZhbS9xdWV1ZS9FeGVjdXRpb25RdWV1ZS5oPgorCisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1F1ZXJ5Lmg+CisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1dPYmplY3QuaD4KKworI2luY2x1ZGUgPHNldy9TeW1iZXhDb250cm9sbGVyUmVxdWVzdE1hbmFnZXIuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoKK3Byb3RvdHlwZSBwcm9jZXNzb3I6OmNvdmVyYWdlICJjb3ZlcmFnZSBwcm9jZXNzb3IiIGFzIGF2bTo6cHJvY2Vzc29yLkNPVkVSQUdFIGlzCisJc2VjdGlvbiBQUk9QRVJUWQorCQkvLyBOb21icmUgZGUgcGFzIGRlIGNhbGN1bCAiY3VtdWzDqXMiIGF2YW50IGRlIGTDqWJ1dGVyCisJCS8vIGxhIHbDqXJpZmljYXRpb24gZGUgbGEgY291dmVydHVyZQorCQlAYmVnaW5fc3RlcCA9IDA7CisKKwkJLy8gQXJyw6h0ZSBsJ2V4w6ljdXRpb24gZMOocyBxdWUgbGEgY291dmVydHVyZSBlc3QgY29tcGzDqHRlCisJCUBzdG9wID0gdHJ1ZTsKKworCQkvLyBBcnLDqHRlIGwnZXjDqWN1dGlvbiBhdSBwbHV0w7R0CisJCUBtaW5pbWl6ZSA9IHRydWU7CisKKwkJLy8gQXJyw6h0ZSBsJ2V4w6ljdXRpb24gZHUgY2hlbWluIGNvdXJhbnQgZMOocyBxdSd1biBvYmplY3RpZiBlc3QgYXR0ZWludAorCQlAYnJlYWsgPSB0cnVlOworCisJCS8vIEVsYWdhZ2UgZHUgZ3JhcGhlIGRlcyBzY8OpbmFyaW9zIMOgIGxhIGZpbiBkZSBsYSB2w6lyaWZpY2F0aW9uCisJCUBzbGljZSA9IHRydWU7CisKKwkJLy8gQWN0aXZlIGwndXRpbGlzYXRpb24gZCdoZXVyaXN0aXF1ZQorCQlAaGV1cmlzdGljID0gdHJ1ZTsKKworCQlAc2NvcGUgPSAnREVUQUlMUyc7IAkvLyAnSU5TVEFOQ0UnIHwgJ0ZPUk0nIHwgJ0RFVEFJTFMnCisJZW5kc2VjdGlvbiBQUk9QRVJUWQorCisKKwkvLyBVdGlsaXPDqSBwb3VyIHByw6ljaXNlciBsZXMgbWFjaGluZXMgb3UgbGVzIHRyYW5zaXRpb25zIHBhcnRpY3VsacOocmVzIMOgIGNvdXZyaXIhCisJc2VjdGlvbiBERVRBSUxTCisJCUBmb3JtID0gc3BlYzo6YXNjZW5zZXVyLmFzY2Vuc2V1ci5jb250cm9sZXI7CisJCUBpbnN0YW5jZSA9IHNwZWM6OmFzY2Vuc2V1ci5hc2NlbnNldXIuZW5yZWdpc3RyZXI7CisKKwkJQHRyYW5zaXRpb24gPSBzcGVjOjphc2NlbnNldXIuYXNjZW5zZXVyLmFsbGVyX2FfbF9ldGFnZS5hdHRlbnRlLnRyYW5zaXRpb24jNjsKKwllbmRzZWN0aW9uIERFVEFJTFMKKworCisJc2VjdGlvbiBIRVVSSVNUSUMKKwkJLy8gY2hvaXggZGUgbCdoZXVyaXN0aXF1ZSBkZSBkw6lwYXJ0CisJCS8vIGJhc2ljIHwgbmFpdmUgfCBzbWFydCB8IGFncmVzc2l2ZQorCQlAaGV1cmlzdGljI3N0YXJ0ID0gJ2Jhc2ljJzsKKworCQkvLyBOb21icmUgZCdlc3NhaXMgZCdoZXVyaXN0aXF1ZXMKKwkJQGhldXJpc3RpYyN0cmlhbHMgPSA3OworCisJCS8vIENyaXTDqHJlIGRlIHNhdGlzZmFjdGlvbiBkdSBzdWNjw6hzIGRlcyBoZXVyaXN0aXF1ZXMKKwkJLy8gdGF1eCBkZSBjb3V2ZXJ0ZSAvIG5vbWJyZSBkJ8OpbMOpbWVudCByZXN0YW50Li4uCisJCUBvYmplY3RpdmUjcmF0ZSA9IDk1OworCQlAb2JqZWN0aXZlI3Jlc3QgPSA1OworCisKKwkJLy8gQ2hvaXggZGVzIGNvbnRleHRlcyBhdmVjIGRlcyB0cmFuc2l0aW9ucworCQkvLyBbIGZvcnRlbWVudCB8IGZhaWJsZW1lbnQgfCBhdXRyZSBdIHRpcmFibGVzCisKKwkJLy8gTGltaXRhdGlvbnMgdGVtcG9yYWlyZSBkZSBsYSBwcm9mb25kZXVyIGQnZXhwbG9yYXRpb24KKwkJQGNvdmVyYWdlI2hlaWdodCA9IDc7CisKKwkJLy8gbm9tYnJlIGRlIGZvaXMgcXVlIGxhIGxpbWl0ZSBkb2l0IMOqdHJlIGF0dGVpbnQgYXZhbnQgZGUgbCdhdWdtZW50ZXIKKwkJQGNvdmVyYWdlI2hlaWdodCNyZWFjaGVkI2xpbWl0ID0gNDI7CisKKwkJQGhpdCNzdHJvbmdseSNyYW5kb20gPSBmYWxzZTsKKwkJQGhpdCNzdHJvbmdseSNjb3VudCA9IDE7CisKKwkJQGhpdCN3ZWFrbHkjcmFuZG9tID0gZmFsc2U7CisJCUBoaXQjd2Vha2x5I2NvdW50ID0gMTsKKworCQlAaGl0I290aGVyI3JhbmRvbSA9IGZhbHNlOworCQlAaGl0I290aGVyI2NvdW50ID0gMTsKKwllbmRzZWN0aW9uIEhFVVJJU1RJQworZW5kcHJvdG90eXBlCisqLworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDT05GSUdVUkUgQVBJCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIEF2bUNvdmVyYWdlUHJvY2Vzc29yOjpjb25maWd1cmVJbXBsKCkKK3sKKwkvLyBTVVBFUiBDT05GSUdVUkFUSU9OCisJbUNvbmZpZ0ZsYWcgPSBCYXNlQ292ZXJhZ2VGaWx0ZXI6OmNvbmZpZ3VyZUltcGwoKTsKKworCVdPYmplY3QgKiB0aGVQUk9QRVJUWSA9IFF1ZXJ5OjpnZXRSZWdleFdTZXF1ZW5jZSgKKwkJCWdldFBhcmFtZXRlcldPYmplY3QoKSwgT1JfV0lEMigicHJvcGVydHkiLCAiUFJPUEVSVFkiKSk7CisKKwlpZiggdGhlUFJPUEVSVFkgIT0gV09iamVjdDo6X05VTExfICkKKwl7CisJCW1TY29wZSA9IFNwZWNpZmllcjo6dG9EZXNpZ25LaW5kKAorCQkJCVF1ZXJ5OjpnZXRXUHJvcGVydHlTdHJpbmcodGhlUFJPUEVSVFksICJzY29wZSIsICJNT0RFTCIpICk7CisJfQorCisJbUNvbmZpZ0ZsYWcgPSBtSGV1cmlzdGljUHJvcGVydHkuY29uZmlndXJlKCBnZXRQYXJhbWV0ZXJXT2JqZWN0KCkgKQorCQkJJiYgbUNvbmZpZ0ZsYWc7CisKKwltQ29uZmlnRmxhZyA9IG1UcmFuc2l0aW9uQ292ZXJhZ2UuY29uZmlndXJlKCkKKwkJCSYmIG1Db25maWdGbGFnOworCisJbUNvbmZpZ0ZsYWcgPSBtT25lVHJhY2VEcml2ZXIuY29uZmlndXJlKCkKKwkJCSYmIG1Db25maWdGbGFnOworCisJZW5hYmxlUHJlcHJvY2VzcyggdGhpcyApOworCisJcmV0dXJuIG1Db25maWdGbGFnOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBSRVBPUlQgQVBJCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIEF2bUNvdmVyYWdlUHJvY2Vzc29yOjpyZXBvcnRNaW5pbXVtKE91dFN0cmVhbSAmIG9zKSBjb25zdAoreworCW9zIDw8IFRBQiA8PCAiQ09WRVJBR0UgUFJPQ0VTU09SIiA8PCBFT0xfRkxVU0g7CisKKwltVHJhbnNpdGlvbkNvdmVyYWdlLnJlcG9ydE1pbmltdW0ob3MpOworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFNFVCBFWElUIENPREUKKwltQ292ZXJhZ2VTdGF0aXN0aWNzLnNldEV4aXRDb2RlKCk7Cit9CisKK3ZvaWQgQXZtQ292ZXJhZ2VQcm9jZXNzb3I6OnJlcG9ydERlZmF1bHQoT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJcmVwb3J0SGVhZGVyKG9zLCAiVFJBTlNJVElPTiBDT1ZFUkFHRSAiKTsKKworCW1UcmFuc2l0aW9uQ292ZXJhZ2UucmVwb3J0RGVmYXVsdChvcyk7CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gU0VUIEVYSVQgQ09ERQorCW1Db3ZlcmFnZVN0YXRpc3RpY3Muc2V0RXhpdENvZGUoKTsKK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBQUk9DRVNTIEFQSQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBBdm1Db3ZlcmFnZVByb2Nlc3Nvcjo6cHJlcHJvY2VzcygpCit7CisJcmV0dXJuKCBCYXNlQ292ZXJhZ2VGaWx0ZXI6OnByZXByb2Nlc3MoKSApOworfQorCisKK2Jvb2wgQXZtQ292ZXJhZ2VQcm9jZXNzb3I6OnBvc3Rwcm9jZXNzKCkKK3sKKwlyZXR1cm4oIEJhc2VDb3ZlcmFnZUZpbHRlcjo6cG9zdHByb2Nlc3MoKSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBQUkUtRklMVEVSIEFQSQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBBdm1Db3ZlcmFnZVByb2Nlc3Nvcjo6cHJlZmlsdGVyKCkKK3sKKwllY1F1ZXVlID0gJiggZ2V0RXhlY3V0aW9uUXVldWUoKS5nZXRSZWFkeVF1ZXVlKCkgKTsKKworLy8JZWNRdWV1ZUl0ID0gZWNRdWV1ZS0+YmVnaW4oKTsKKy8vCWVjUXVldWVJdEVuZCA9IGVjUXVldWUtPmVuZCgpOworLy8JZm9yKCA7IGVjUXVldWVJdCAhPSBlY1F1ZXVlSXRFbmQgOyArK2VjUXVldWVJdCApCisvLwl7CisvLwkJcHJlZmlsdGVyKCplY1F1ZXVlSXQpOworLy8JfQorCisJaWYoIG1Db3ZlcmFnZVN0YXRpc3RpY3MuZ29hbEFjaGlldmVkKCkgJiYgbVN0b3BGbGFnICkKKwl7CisJCWdldFN5bWJleFJlcXVlc3RNYW5hZ2VyKCkucG9zdFJlcXVlc3RTdG9wKCB0aGlzICk7CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXN3aXRjaCggbUhldXJpc3RpY1Byb3BlcnR5Lm1IZXVyaXN0aWNDbGFzcyApCisJeworCQkvLyBTTUFSVCBQQVNTSVZFIFRSQU5TSVRJT04gQ09WRVJBR0UgSEVVUklTVElDCisJCS8vIFVzaW5nIDo+IEhJR0ggUFJJT1JJVFkgQ09OVEVYVAorCQkvLyB3LnIudC4gVFJBTlNJVElPTiBGSVJFQUJJTElUWQorCQljYXNlIElIZXVyaXN0aWNDbGFzczo6SEVVUklTVElDX0JBU0lDX0NMQVNTOgorCQl7CisJCQlyZXR1cm4oIG1UcmFuc2l0aW9uQ292ZXJhZ2UucHJlZmlsdGVyaW5nKCplY1F1ZXVlKSApOworCQl9CisKKwkJLy8gU01BUlQgQUNUSVZFIFRSQU5TSVRJT04gQ09WRVJBR0UgSEVVUklTVElDCisJCS8vIFVzaW5nIDo+IE9ORSBUUkFDRSBEUklWRU4KKwkJY2FzZSBJSGV1cmlzdGljQ2xhc3M6OkhFVVJJU1RJQ19OQUlWRV9DTEFTUzoKKwkJeworCQkJcmV0dXJuKCBtT25lVHJhY2VEcml2ZXIucHJlZmlsdGVyaW5nKCplY1F1ZXVlKSApOworCQl9CisKKwkJLy8gU01BUlQgQUNUSVZFIFRSQU5TSVRJT04gQ09WRVJBR0UgSEVVUklTVElDCisJCS8vIFVzaW5nIDo+IE1BTlkgVFJBQ0UgRFJJVkVOCisJCWNhc2UgSUhldXJpc3RpY0NsYXNzOjpIRVVSSVNUSUNfU01BUlRfQ0xBU1M6CisJCXsKKwkJCXJldHVybiggbU1hbnlUcmFjZURyaXZlci5wcmVmaWx0ZXJpbmcoKmVjUXVldWUpICk7CisJCX0KKworCisJCWNhc2UgSUhldXJpc3RpY0NsYXNzOjpIRVVSSVNUSUNfQUdSRVNTSVZFX0NMQVNTOgorCisJCS8vIFNNQVJUIFBBU1NJVkUgVFJBTlNJVElPTiBDT1ZFUkFHRSBIRVVSSVNUSUMKKwkJLy8gVXNpbmcgOj4gUFJJT1JJVFkgQ09OVEVYVAorCQkvLyB3LnIudC4gVFJBTlNJVElPTiBGSVJFQUJJTElUWQorCQljYXNlIElIZXVyaXN0aWNDbGFzczo6SEVVUklTVElDX05PVEhJTkdfRUxTRV9DTEFTUzoKKwkJZGVmYXVsdDoKKwkJeworCQkJcmV0dXJuKCBtVHJhbnNpdGlvbkNvdmVyYWdlLnByZWZpbHRlcmluZygqZWNRdWV1ZSkgKTsKKwkJfQorCX0KKworCXJldHVybiggZ2V0RXhlY3V0aW9uUXVldWUoKS5oYXNSZWFkeSgpICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFBPU1QtRklMVEVSIEFQSQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBBdm1Db3ZlcmFnZVByb2Nlc3Nvcjo6cG9zdGZpbHRlcigpCit7CisJZWNRdWV1ZSA9ICYoIGdldEV4ZWN1dGlvblF1ZXVlKCkuZ2V0UmVzdWx0UXVldWUoKSApOworCisJaWYoIG1Db3ZlcmFnZVN0YXRpc3RpY3MuaGFzVW5jb3ZlcmVkKCkgKQorCXsKKwkJbUNvdmVyYWdlU3RhdGlzdGljcy5iYWNrdXBDb3ZlcmVkKCk7CisKKwkJaWYoIG1UcmFuc2l0aW9uQ292ZXJhZ2UucG9zdGZpbHRlcmluZygqZWNRdWV1ZSkgKQorCQl7CisJCQlpZiggbUNvdmVyYWdlU3RhdGlzdGljcy5nb2FsQWNoaWV2ZWQoKSApCisJCQl7CisJCQkJZ2V0U3ltYmV4UmVxdWVzdE1hbmFnZXIoKS5wb3N0UmVxdWVzdEdvYWxBY2hpZXZlZCggdGhpcyApOworCisJCQkJcmV0dXJuKCBnZXRFeGVjdXRpb25RdWV1ZSgpLmhhc1Jlc3VsdCgpICk7CisJCQl9CisJCX0KKworCisJCS8vIENvdmVyYWdlIHdpdGhvdXQgaGV1cmlzdGljIHVzYWdlICEhIQorCQlpZiggbm90IG1IZXVyaXN0aWNQcm9wZXJ0eS5tSGV1cmlzdGljRW5hYmxlZCApCisJCXsKKwkJCXJldHVybiggZ2V0RXhlY3V0aW9uUXVldWUoKS5oYXNSZXN1bHQoKSApOworCQl9CisKKworCQlpZiggbUNvdmVyYWdlU3RhdGlzdGljcy51cGRhdGVGYWlsZWRTdGVwKCkgKQorCQl7CisJCQkvLyEhISBUT0RPIG9wdGltaXphdGlvbiBkZWNpc2lvbgorCQkJaWYoIG1Db3ZlcmFnZVN0YXRpc3RpY3MuaXNTZXJpb3VzbHlGYWlsZWRTdGVwKCkgKQorCQkJeworLy8JCQkJaW5jckhldXJpc3RpY0NsYXNzKCk7CisKKwkJCQlnZXRTeW1iZXhSZXF1ZXN0TWFuYWdlcigpLnBvc3RSZXF1ZXN0UmVxdWV1ZVdhaXRpbmcoIHRoaXMgKTsKKworCitBVk1fSUZfREVCVUdfRkxBRyggUFJPQ0VTU09SICkKKwlBVk1fT1NfQ09VVCAgPDwgRU1QSEFTSVMobUhldXJpc3RpY1Byb3BlcnR5LnN0ckhldXJpc3RpY0NsYXNzKCksICcqJywgODApOworCUFWTV9PU19UUkFDRSA8PCBFTVBIQVNJUyhtSGV1cmlzdGljUHJvcGVydHkuc3RySGV1cmlzdGljQ2xhc3MoKSwgJyonLCA4MCk7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggUFJPQ0VTU09SICkKKwkJCQl9CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJbUNvdmVyYWdlU3RhdGlzdGljcy50b1N0cmVhbUZhaWxlZFN0ZXAoQVZNX09TX0NPVVQsCisJCQkiTm8gbmV3IHRyYW5zaXRpb24gY292ZXJlZCBzaW5jZSA8PCAiLCAiIHN0ZXAiLCAiID4+ICEhIVxuIik7CisJbUNvdmVyYWdlU3RhdGlzdGljcy50b1N0cmVhbUZhaWxlZFN0ZXAoQVZNX09TX1RSQUNFLAorCQkJIk5vIG5ldyB0cmFuc2l0aW9uIGNvdmVyZWQgc2luY2UgPDwgIiwgIiBzdGVwIiwgIiA+PiAhISFcbiIpOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwkJfQorCQllbHNlCisJCXsKKwkJCW1Db3ZlcmFnZVN0YXRpc3RpY3MucmVzZXRGYWlsZWRTdGVwKCk7CisJCX0KKworCQlkaXNhYmxlUmVxdWVzdFN0YXR1cygpOworCitBVk1fSUZfREVCVUdfRkxBRyggUFJPQ0VTU09SICkKKwlBVk1fT1NfQ09VVCAgPDwgRU1QSEFTSVMoInBvc3RmaWx0ZXIgOj4gIiArCisJCQltSGV1cmlzdGljUHJvcGVydHkuc3RySGV1cmlzdGljQ2xhc3MoKSwgJyonLCA4MCk7CisJQVZNX09TX1RSQUNFIDw8IEVNUEhBU0lTKCJwb3N0ZmlsdGVyIDo+ICIgKworCQkJbUhldXJpc3RpY1Byb3BlcnR5LnN0ckhldXJpc3RpY0NsYXNzKCksICcqJywgODApOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFBST0NFU1NPUiApCisKKwkJc3dpdGNoKCBtSGV1cmlzdGljUHJvcGVydHkubUhldXJpc3RpY0NsYXNzICkKKwkJeworCQkJLy8gU01BUlQgUEFTU0lWRSBUUkFOU0lUSU9OIENPVkVSQUdFIEhFVVJJU1RJQworCQkJLy8gVXNpbmcgOj4gSElHSCBQUklPUklUWSBDT05URVhUCisJCQkvLyB3LnIudC4gVFJBTlNJVElPTiBGSVJFQUJJTElUWQorCQkJY2FzZSBJSGV1cmlzdGljQ2xhc3M6OkhFVVJJU1RJQ19CQVNJQ19DTEFTUzoKKwkJCXsKKwkJCQlpZiggbVRyYW5zaXRpb25Db3ZlcmFnZS5jb21wdXRlSGlnaFByaW9yaXR5Q29udGV4dCgKKwkJCQkJKCplY1F1ZXVlKSwgZ2V0RXhlY3V0aW9uUXVldWUoKS5yZWZXYWl0aW5nU3RyYXRlZ3koKSkgKQorCQkJCXsKKwkJCQkJLy8hISBOT1RISU5HCisJCQkJfQorCisJCQkJLy8hISBGQUlMRUQgQ0FTRQorCQkJCWVsc2UgaWYoIGlzUmVxdWVzdFN0YXR1cyggUkVRVUVTVF9SRVFVRVVFX1dBSVRJTkdfU1RBVFVTICkgKQorCQkJCXsKKwkJCQkJZ2V0U3ltYmV4UmVxdWVzdE1hbmFnZXIoKS5wb3N0UmVxdWVzdFJlcXVldWVXYWl0aW5nKCB0aGlzICk7CisJCQkJfQorCisJCQkJLy8gUmVxdWlyZSBjaGFuZ2luZyBoZXVyaXN0aWMKKwkJCQllbHNlIGlmKCBpc1JlcXVlc3RTdGF0dXMoIFJFUVVFU1RfSEVVUklTVElDX1NUQVRVUyApICkKKwkJCQl7CisJCQkJCW1IZXVyaXN0aWNQcm9wZXJ0eS5tSGV1cmlzdGljQ2xhc3MgPQorCQkJCQkJCUlIZXVyaXN0aWNDbGFzczo6SEVVUklTVElDX05BSVZFX0NMQVNTOworCisJCQkJCWdldFN5bWJleFJlcXVlc3RNYW5hZ2VyKCkucG9zdFJlcXVlc3RSZXF1ZXVlV2FpdGluZyggdGhpcyApOworCQkJCX0KKworCQkJCWJyZWFrOworCQkJfQorCisJCQkvLyBTTUFSVCBBQ1RJVkUgVFJBTlNJVElPTiBDT1ZFUkFHRSBIRVVSSVNUSUMKKwkJCS8vIFVzaW5nIDo+IE9ORSBUUkFDRSBEUklWRU4KKwkJCWNhc2UgSUhldXJpc3RpY0NsYXNzOjpIRVVSSVNUSUNfTkFJVkVfQ0xBU1M6CisJCQl7CisJCQkJaWYoIG1PbmVUcmFjZURyaXZlci5wb3N0ZmlsdGVyaW5nKCplY1F1ZXVlKSApCisJCQkJeworCQkJCQlpZiggbU9uZVRyYWNlRHJpdmVyLmdvYWxBY2hpZXZlZCgpICkKKwkJCQkJeworCQkJCQkJaWYoIG1Db3ZlcmFnZVN0YXRpc3RpY3MuaXNTdWNjZXNzZnVsU3RlcCgpIHx8CisJCQkJCQkJZ2V0RXhlY3V0aW9uUXVldWUoKS5nZXRXYWl0aW5nU3RyYXRlZ3koKS0+CisJCQkJCQkJCQloYXNXYWl0aW5nKFdFSUdIVF9TVFJPTkdMWV9BQ0hJRVZBQkxFKSApCisJCQkJCQl7CisJCQkJCQkJbUhldXJpc3RpY1Byb3BlcnR5Lm1IZXVyaXN0aWNDbGFzcyA9CisJCQkJCQkJCQlJSGV1cmlzdGljQ2xhc3M6OkhFVVJJU1RJQ19CQVNJQ19DTEFTUzsKKwkJCQkJCX0KKworCQkJCQkJZ2V0U3ltYmV4UmVxdWVzdE1hbmFnZXIoKS5wb3N0UmVxdWVzdFJlcXVldWVXYWl0aW5nKCB0aGlzICk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQkvLyEhIEZBSUxFRCBDQVNFCisJCQkJZWxzZSBpZiggaXNSZXF1ZXN0U3RhdHVzKCBSRVFVRVNUX1JFUVVFVUVfV0FJVElOR19TVEFUVVMgKSApCisJCQkJeworCQkJCQlpZiggbUNvdmVyYWdlU3RhdGlzdGljcy5pc1N1Y2Nlc3NmdWxTdGVwKCkgfHwKKwkJCQkJCWdldEV4ZWN1dGlvblF1ZXVlKCkuZ2V0V2FpdGluZ1N0cmF0ZWd5KCktPgorCQkJCQkJCQloYXNXYWl0aW5nKFdFSUdIVF9TVFJPTkdMWV9BQ0hJRVZBQkxFKSApCisJCQkJCXsKKwkJCQkJCW1IZXVyaXN0aWNQcm9wZXJ0eS5tSGV1cmlzdGljQ2xhc3MgPQorCQkJCQkJCQlJSGV1cmlzdGljQ2xhc3M6OkhFVVJJU1RJQ19CQVNJQ19DTEFTUzsKKwkJCQkJfQorCisJCQkJCWdldFN5bWJleFJlcXVlc3RNYW5hZ2VyKCkucG9zdFJlcXVlc3RSZXF1ZXVlV2FpdGluZyggdGhpcyApOworCQkJCX0KKworCQkJCS8vIFJlcXVpcmUgY2hhbmdpbmcgaGV1cmlzdGljCisJCQkJZWxzZSBpZiggaXNSZXF1ZXN0U3RhdHVzKCBSRVFVRVNUX0hFVVJJU1RJQ19TVEFUVVMgKSApCisJCQkJeworCQkJCQltSGV1cmlzdGljUHJvcGVydHkubUhldXJpc3RpY0NsYXNzID0KKy8vCQkJCQkJCUlIZXVyaXN0aWNDbGFzczo6SEVVUklTVElDX1NNQVJUX0NMQVNTOworCQkJCQkJCUlIZXVyaXN0aWNDbGFzczo6SEVVUklTVElDX05PVEhJTkdfRUxTRV9DTEFTUzsKKworCQkJCQlnZXRTeW1iZXhSZXF1ZXN0TWFuYWdlcigpLnBvc3RSZXF1ZXN0UmVxdWV1ZVdhaXRpbmcoIHRoaXMgKTsKKwkJCQl9CisKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLy8gU01BUlQgQUNUSVZFIFRSQU5TSVRJT04gQ09WRVJBR0UgSEVVUklTVElDCisJCQkvLyBVc2luZyA6PiBNQU5ZIFRSQUNFIERSSVZFTgorCQkJY2FzZSBJSGV1cmlzdGljQ2xhc3M6OkhFVVJJU1RJQ19TTUFSVF9DTEFTUzoKKwkJCXsKKwkJCQlpZiggbU1hbnlUcmFjZURyaXZlci5wb3N0ZmlsdGVyaW5nKCplY1F1ZXVlKSApCisJCQkJeworCQkJCQkvLyEhIE5PVEhJTkcKKwkJCQl9CisKKwkJCQkvLyEhIEZBSUxFRCBDQVNFCisJCQkJZWxzZSBpZiggaXNSZXF1ZXN0U3RhdHVzKCBSRVFVRVNUX1JFUVVFVUVfV0FJVElOR19TVEFUVVMgKSApCisJCQkJeworCQkJCQlnZXRTeW1iZXhSZXF1ZXN0TWFuYWdlcigpLnBvc3RSZXF1ZXN0UmVxdWV1ZVdhaXRpbmcoIHRoaXMgKTsKKwkJCQl9CisKKwkJCQkvLyBSZXF1aXJlIGNoYW5naW5nIGhldXJpc3RpYworCQkJCWVsc2UgaWYoIGlzUmVxdWVzdFN0YXR1cyggUkVRVUVTVF9IRVVSSVNUSUNfU1RBVFVTICkgKQorCQkJCXsKKwkJCQkJbUhldXJpc3RpY1Byb3BlcnR5Lm1IZXVyaXN0aWNDbGFzcyA9CisJCQkJCQkJSUhldXJpc3RpY0NsYXNzOjpIRVVSSVNUSUNfQUdSRVNTSVZFX0NMQVNTOworCisJCQkJCWdldFN5bWJleFJlcXVlc3RNYW5hZ2VyKCkucG9zdFJlcXVlc3RSZXF1ZXVlV2FpdGluZyggdGhpcyApOworCQkJCX0KKworCQkJCWJyZWFrOworCQkJfQorCisKKwkJCWNhc2UgSUhldXJpc3RpY0NsYXNzOjpIRVVSSVNUSUNfQUdSRVNTSVZFX0NMQVNTOgorCisJCQkvLyBTTUFSVCBQQVNTSVZFIFRSQU5TSVRJT04gQ09WRVJBR0UgSEVVUklTVElDCisJCQkvLyBVc2luZyA6PiBQUklPUklUWSBDT05URVhUCisJCQkvLyB3LnIudC4gVFJBTlNJVElPTiBGSVJFQUJJTElUWQorCQkJY2FzZSBJSGV1cmlzdGljQ2xhc3M6OkhFVVJJU1RJQ19OT1RISU5HX0VMU0VfQ0xBU1M6CisJCQlkZWZhdWx0OgorCQkJeworCQkJCWlmKCBtVHJhbnNpdGlvbkNvdmVyYWdlLmNvbXB1dGVQcmlvcml0eUNvbnRleHQoCisJCQkJCSgqZWNRdWV1ZSksIGdldEV4ZWN1dGlvblF1ZXVlKCkucmVmV2FpdGluZ1N0cmF0ZWd5KCkpICkKKwkJCQl7CisJCQkJCWlmKCBtQ292ZXJhZ2VTdGF0aXN0aWNzLmlzU3VjY2Vzc2Z1bFN0ZXAoKSB8fAorCQkJCQkJZ2V0RXhlY3V0aW9uUXVldWUoKS5nZXRXYWl0aW5nU3RyYXRlZ3koKS0+CisJCQkJCQkJCWhhc1dhaXRpbmcoV0VJR0hUX1NUUk9OR0xZX0FDSElFVkFCTEUpICkKKwkJCQkJeworCQkJCQkJbUhldXJpc3RpY1Byb3BlcnR5Lm1IZXVyaXN0aWNDbGFzcyA9CisJCQkJCQkJCUlIZXVyaXN0aWNDbGFzczo6SEVVUklTVElDX0JBU0lDX0NMQVNTOworCQkJCQl9CisJCQkJfQorCisJCQkJLy8hISBGQUlMRUQgQ0FTRQorCQkJCWVsc2UgaWYoIGlzUmVxdWVzdFN0YXR1cyggUkVRVUVTVF9SRVFVRVVFX1dBSVRJTkdfU1RBVFVTICkgKQorCQkJCXsKKwkJCQkJZ2V0U3ltYmV4UmVxdWVzdE1hbmFnZXIoKS5wb3N0UmVxdWVzdFJlcXVldWVXYWl0aW5nKCB0aGlzICk7CisJCQkJfQorCisJCQkJLy8gUmVxdWlyZSBjaGFuZ2luZyBoZXVyaXN0aWMKKwkJCQllbHNlIGlmKCBpc1JlcXVlc3RTdGF0dXMoIFJFUVVFU1RfSEVVUklTVElDX1NUQVRVUyApICkKKwkJCQl7CisJCQkJCWlmKCBtQ292ZXJhZ2VTdGF0aXN0aWNzLmlzU3VjY2Vzc2Z1bFN0ZXAoKSB8fAorCQkJCQkJZ2V0RXhlY3V0aW9uUXVldWUoKS5nZXRXYWl0aW5nU3RyYXRlZ3koKS0+CisJCQkJCQkJCWhhc1dhaXRpbmcoV0VJR0hUX1NUUk9OR0xZX0FDSElFVkFCTEUpICkKKwkJCQkJeworCQkJCQkJbUhldXJpc3RpY1Byb3BlcnR5Lm1IZXVyaXN0aWNDbGFzcyA9CisJCQkJCQkJCUlIZXVyaXN0aWNDbGFzczo6SEVVUklTVElDX0JBU0lDX0NMQVNTOworCQkJCQl9CisJCQkJfQorCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4oIGdldEV4ZWN1dGlvblF1ZXVlKCkuaGFzUmVzdWx0KCkgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUFJPQ0VTU09SIFJFUVVFU1QgQVBJCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLyoqCisgKiBTVE9QICB8IFJFTEVBU0UKKyAqIFJFU0VUIHwgUkVTVEFSVCB8IENPTlRJTlVFCisgKiBSRVFVRVVFX1dBSVRJTkcgfCBSRVFVRVVFX1JFU0VSVkUKKyAqIEhFVVJJU1RJQyB8IEdPQUxfQUNISUVWRUQKKyAqLwordm9pZCBBdm1Db3ZlcmFnZVByb2Nlc3Nvcjo6aGFuZGxlUmVxdWVzdFJlcXVldWVXYWl0aW5nVGFibGUoCisJCVdhaXRpbmdTdHJhdGVneSAmIGFXYWl0aW5nU3RyYXRlZ3ksCisJCWF2bV91aW50OF90IGFXZWlnaHRNaW4sIGF2bV91aW50OF90IGFXZWlnaHRNYXgpCit7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFFVRVVFICkKKwlBVk1fT1NfVFJBQ0UgPDwgIkF2bUNvdmVyYWdlUHJvY2Vzc29yOjpoYW5kbGVSZXF1ZXN0UmVxdWV1ZVdhaXRpbmdUYWJsZSA6PiIKKwkJCTw8IHN0ZDo6ZW5kbDsKKwlhV2FpdGluZ1N0cmF0ZWd5LnRvU3RyZWFtKEFWTV9PU19UUkFDRSk7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFFVRVVFICkKKworCisJd2hpbGUoIHRydWUgKQorCXsKKwkJZGlzYWJsZVJlcXVlc3RTdGF0dXMoKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwlBVk1fT1NfQ09VVCAgPDwgRU1QSEFTSVMoInJlcXVldWUgOj4gIiArCisJCQltSGV1cmlzdGljUHJvcGVydHkuc3RySGV1cmlzdGljQ2xhc3MoKSwgJyonLCA4MCk7CisJQVZNX09TX1RSQUNFIDw8IEVNUEhBU0lTKCJyZXF1ZXVlIDo+ICIgKworCQkJbUhldXJpc3RpY1Byb3BlcnR5LnN0ckhldXJpc3RpY0NsYXNzKCksICcqJywgODApOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKworCQlzd2l0Y2goIG1IZXVyaXN0aWNQcm9wZXJ0eS5tSGV1cmlzdGljQ2xhc3MgKQorCQl7CisJCQljYXNlIElIZXVyaXN0aWNDbGFzczo6SEVVUklTVElDX0JBU0lDX0NMQVNTOgorCQkJeworCQkJCWlmKCBtVHJhbnNpdGlvbkNvdmVyYWdlLmhpZ2hSZXF1ZXVlV2FpdGluZ1RhYmxlKAorCQkJCQkJYVdhaXRpbmdTdHJhdGVneSwgYVdlaWdodE1pbiwgYVdlaWdodE1heCkgKQorCQkJCXsKKwkJCQkJcmV0dXJuOworCQkJCX0KKworCQkJCS8vISEgRkFJTEVEIENBU0UKKwkJCQllbHNlIGlmKCBpc1JlcXVlc3RTdGF0dXMoIFJFUVVFU1RfUkVRVUVVRV9XQUlUSU5HX1NUQVRVUyApICkKKwkJCQl7CisJCQkJCXJldHVybjsKKwkJCQl9CisKKwkJCQkvLyBSZXF1aXJlIGNoYW5naW5nIGhldXJpc3RpYworCQkJCWVsc2UgaWYoIGlzUmVxdWVzdFN0YXR1cyggUkVRVUVTVF9IRVVSSVNUSUNfU1RBVFVTICkgKQorCQkJCXsKKwkJCQkJbUhldXJpc3RpY1Byb3BlcnR5Lm1IZXVyaXN0aWNDbGFzcyA9CisJCQkJCQkJSUhldXJpc3RpY0NsYXNzOjpIRVVSSVNUSUNfTkFJVkVfQ0xBU1M7CisKKwkJCQkJLy8hISBDT05USU5VRQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlyZXR1cm47CisJCQkJfQorCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNhc2UgSUhldXJpc3RpY0NsYXNzOjpIRVVSSVNUSUNfTkFJVkVfQ0xBU1M6CisJCQl7CisJCQkJaWYoIG1PbmVUcmFjZURyaXZlci5yZXF1ZXVlV2FpdGluZ1RhYmxlKAorCQkJCQkJYVdhaXRpbmdTdHJhdGVneSwgYVdlaWdodE1pbiwgYVdlaWdodE1heCkgKQorCQkJCXsKKwkJCQkJcmV0dXJuOworCQkJCX0KKworCQkJCS8vISEgRkFJTEVEIENBU0UKKwkJCQllbHNlIGlmKCBpc1JlcXVlc3RTdGF0dXMoIFJFUVVFU1RfUkVRVUVVRV9XQUlUSU5HX1NUQVRVUyApICkKKwkJCQl7CisJCQkJCW1IZXVyaXN0aWNQcm9wZXJ0eS5tSGV1cmlzdGljQ2xhc3MgPQorCQkJCQkJCUlIZXVyaXN0aWNDbGFzczo6SEVVUklTVElDX05PVEhJTkdfRUxTRV9DTEFTUzsKKworCQkJCQkvLyEhIENPTlRJTlVFCisJCQkJfQorCisJCQkJLy8gUmVxdWlyZSBjaGFuZ2luZyBoZXVyaXN0aWMKKwkJCQllbHNlIGlmKCBpc1JlcXVlc3RTdGF0dXMoIFJFUVVFU1RfSEVVUklTVElDX1NUQVRVUyApICkKKwkJCQl7CisJCQkJCW1IZXVyaXN0aWNQcm9wZXJ0eS5tSGV1cmlzdGljQ2xhc3MgPQorLy8JCQkJCQkJSUhldXJpc3RpY0NsYXNzOjpIRVVSSVNUSUNfU01BUlRfQ0xBU1M7CisJCQkJCQkJSUhldXJpc3RpY0NsYXNzOjpIRVVSSVNUSUNfTk9USElOR19FTFNFX0NMQVNTOworCisJCQkJCS8vISEgQ09OVElOVUUKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcmV0dXJuOworCQkJCX0KKworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBJSGV1cmlzdGljQ2xhc3M6OkhFVVJJU1RJQ19TTUFSVF9DTEFTUzoKKwkJCXsKKwkJCQlpZiggbU1hbnlUcmFjZURyaXZlci5yZXF1ZXVlV2FpdGluZ1RhYmxlKAorCQkJCQkJYVdhaXRpbmdTdHJhdGVneSwgYVdlaWdodE1pbiwgYVdlaWdodE1heCkgKQorCQkJCXsKKwkJCQkJcmV0dXJuOworCQkJCX0KKworCQkJCS8vISEgRkFJTEVEIENBU0UKKwkJCQllbHNlIGlmKCBpc1JlcXVlc3RTdGF0dXMoIFJFUVVFU1RfUkVRVUVVRV9XQUlUSU5HX1NUQVRVUyApICkKKwkJCQl7CisJCQkJCXJldHVybjsKKwkJCQl9CisKKwkJCQkvLyBSZXF1aXJlIGNoYW5naW5nIGhldXJpc3RpYworCQkJCWVsc2UgaWYoIGlzUmVxdWVzdFN0YXR1cyggUkVRVUVTVF9IRVVSSVNUSUNfU1RBVFVTICkgKQorCQkJCXsKKwkJCQkJbUhldXJpc3RpY1Byb3BlcnR5Lm1IZXVyaXN0aWNDbGFzcyA9CisJCQkJCQkJSUhldXJpc3RpY0NsYXNzOjpIRVVSSVNUSUNfQUdSRVNTSVZFX0NMQVNTOworCisJCQkJCS8vISEgQ09OVElOVUUKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcmV0dXJuOworCQkJCX0KKworCQkJCWJyZWFrOworCQkJfQorCisKKwkJCWNhc2UgSUhldXJpc3RpY0NsYXNzOjpIRVVSSVNUSUNfQUdSRVNTSVZFX0NMQVNTOgorCisJCQljYXNlIElIZXVyaXN0aWNDbGFzczo6SEVVUklTVElDX05PVEhJTkdfRUxTRV9DTEFTUzoKKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJaWYoIG1UcmFuc2l0aW9uQ292ZXJhZ2UuZWxzZVJlcXVldWVXYWl0aW5nVGFibGUoCisJCQkJCQlhV2FpdGluZ1N0cmF0ZWd5LCBhV2VpZ2h0TWluLCBhV2VpZ2h0TWF4KSApCisJCQkJeworCQkJCQlyZXR1cm47CisJCQkJfQorCisJCQkJLy8hISBGQUlMRUQgQ0FTRQorCQkJCWVsc2UgaWYoIGlzUmVxdWVzdFN0YXR1cyggUkVRVUVTVF9SRVFVRVVFX1dBSVRJTkdfU1RBVFVTICkgKQorCQkJCXsKKwkJCQkJcmV0dXJuOworCQkJCX0KKworCQkJCS8vIFJlcXVpcmUgY2hhbmdpbmcgaGV1cmlzdGljCisJCQkJZWxzZSBpZiggaXNSZXF1ZXN0U3RhdHVzKCBSRVFVRVNUX0hFVVJJU1RJQ19TVEFUVVMgKSApCisJCQkJeworCQkJCQlpZiggZ2V0RXhlY3V0aW9uUXVldWUoKS5nZXRXYWl0aW5nU3RyYXRlZ3koKS0+CisJCQkJCQkJaGFzV2FpdGluZyhXRUlHSFRfU1RST05HTFlfQUNISUVWQUJMRSkgKQorCQkJCQl7CisJCQkJCQltSGV1cmlzdGljUHJvcGVydHkubUhldXJpc3RpY0NsYXNzID0KKwkJCQkJCQkJSUhldXJpc3RpY0NsYXNzOjpIRVVSSVNUSUNfQkFTSUNfQ0xBU1M7CisJCQkJCX0KKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlyZXR1cm47CisJCQkJfQorCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERFQlVHIFBST0NFU1NJTkcgQVBJCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIEF2bUNvdmVyYWdlUHJvY2Vzc29yOjpkZWJ1Z0V2YWxDb21tYW5kSW1wbCgpCit7CisJaWYoIGRiZ0RlY29kZUNvbW1hbmQoIi0tPiIpICkKKwl7CisJCWRiZ0NvbW1hbmREaXJlY3RpdmVUcmFuc2l0aW9uKCk7CisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKK3ZvaWQgQXZtQ292ZXJhZ2VQcm9jZXNzb3I6OmRiZ0NvbW1hbmREaXJlY3RpdmVUcmFuc2l0aW9uKCkKK3sKKwlkYmdDb21tYW5kVHJhbnNpdGlvbigpOworCisJQXZtQ292ZXJhZ2VEaXJlY3RpdmVUcmFjZUJ1aWxkZXIgcGF0aENoZWNrZXIoCisJCQltRGVidWdTZWxlY3RlZENvbnRleHQsIG1EZWJ1Z1NlbGVjdGVkVHJhbnNpdGlvbiwKKwkJCUlIZXVyaXN0aWNDbGFzczo6SUhldXJpc3RpY0NsYXNzOjpIRVVSSVNUSUNfU01BUlRfQ0xBU1MsIDY0LCA2NCk7CisKKwlpZiggcGF0aENoZWNrZXIuY29tcHV0ZVBhdGgoKSApCisJeworCQlBVk1fT1NfQ09VVCA8PCAiR09BTCBBQ0hJRVZFRCAhISEiIDw8IHN0ZDo6ZW5kbDsKKwl9CisJZWxzZQorCXsKKwkJQVZNX09TX0NPVVQgPDwgIkZBSUxFRCAhISEiIDw8IHN0ZDo6ZW5kbDsKKwl9CisKKwlBVk1fT1NfQ09VVCA8PCBzdGQ6OmVuZGw7CisKKwlwYXRoQ2hlY2tlci5yZXBvcnQoQVZNX09TX0NPVVQpOworCisJQVZNX09TX0NPVVQgPDwgc3RkOjpmbHVzaDsKK30KKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9jb3ZlcmFnZS9Bdm1Db3ZlcmFnZVByb2Nlc3Nvci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2NvdmVyYWdlL0F2bUNvdmVyYWdlUHJvY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNiODgwNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9jb3ZlcmFnZS9Bdm1Db3ZlcmFnZVByb2Nlc3Nvci5oCkBAIC0wLDAgKzEsMjAwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTkgbm92LiAyMDE0CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQVZNQ09WRVJBR0VQUk9DRVNTT1JfSF8KKyNkZWZpbmUgQVZNQ09WRVJBR0VQUk9DRVNTT1JfSF8KKworI2luY2x1ZGUgPGZhbS9jb3ZlcmFnZS9CYXNlQ292ZXJhZ2VGaWx0ZXIuaD4KKyNpbmNsdWRlIDxmYW0vZGVidWcvSURlYnVnUHJvY2Vzc29yUHJvdmlkZXIuaD4KKworI2luY2x1ZGUgPGZhbS9jb3ZlcmFnZS9Bdm1Db3ZlcmFnZUhldXJpc3RpY1Byb3BlcnR5Lmg+CisjaW5jbHVkZSA8ZmFtL2NvdmVyYWdlL0F2bUNvdmVyYWdlT25lVHJhY2VEcml2ZXIuaD4KKyNpbmNsdWRlIDxmYW0vY292ZXJhZ2UvQXZtQ292ZXJhZ2VUcmFuc2l0aW9uVmlldy5oPgorCisjaW5jbHVkZSA8Zm1sL2NvbW1vbi9TcGVjaWZpZXJFbGVtZW50Lmg+CisKKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25Db250ZXh0Lmg+CisKKyNpbmNsdWRlIDxzZXcvU3ltYmV4Q29udHJvbGxlclJlcXVlc3RTdGF0dXMuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKK2NsYXNzIFN5bWJleENvbnRyb2xsZXJVbml0TWFuYWdlcjsKK2NsYXNzIFdhaXRpbmdTdHJhdGVneTsKKworCitjbGFzcyBBdm1Db3ZlcmFnZVByb2Nlc3NvciAgOgorCQlwdWJsaWMgQXV0b1JlZ2lzdGVyZWRDb3ZlcmFnZVByb2Nlc3NvclVuaXQ8IEF2bUNvdmVyYWdlUHJvY2Vzc29yID4sCisJCXB1YmxpYyBTeW1iZXhDb250cm9sbGVyUmVxdWVzdFN0YXR1cywKKwkJcHVibGljIElEZWJ1Z1Byb2Nlc3NvclByb3ZpZGVyCit7CisKKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggQXZtQ292ZXJhZ2VQcm9jZXNzb3IgKQorCisJLyoqCisJICogUFJPQ0VTU09SIEZBQ1RPUlkKKwkgKiBmb3IgYXV0b21hdGljIHJlZ2lzdHJhdGlvbiBpbiB0aGUgcHJvY2Vzc29yIHJlcG9zaXRvcnkKKwkgKiB0aGUgWyBbIEZVTExZIF0gUVVBTElGSUVEIF0gTkFNRSBJRAorCSAqLworCUFWTV9JTkpFQ1RfQVVUT19SRUdJU1RFUl9RVUFMSUZJRURfSURfS0VZXzIoCisJCQkiYXZtOjpwcm9jZXNzb3IuQ09WRVJBR0UiLAorCQkJImF2bTo6cHJvY2Vzc29yLkNPVkVSQUdFX1BST0NFU1NPUiIpCisJLy8gZW5kIHJlZ2lzdHJhdGlvbgorCisKKwkvKioKKwkgKiBBVFRSSUJVVEVTCisJICovCitwdWJsaWM6CisJU3BlY2lmaWVyOjpERVNJR05fS0lORCBtU2NvcGU7CisKKwlBdm1Db3ZlcmFnZUhldXJpc3RpY1Byb3BlcnR5IG1IZXVyaXN0aWNQcm9wZXJ0eTsKKworCUF2bUNvdmVyYWdlVHJhbnNpdGlvblZpZXcgIG1UcmFuc2l0aW9uQ292ZXJhZ2U7CisKKwlBdm1Db3ZlcmFnZU9uZVRyYWNlRHJpdmVyICBtT25lVHJhY2VEcml2ZXI7CisKKy8vCUF2bUNvdmVyYWdlTWFueVRyYWNlRHJpdmVyIG1NYW55VHJhY2VEcml2ZXI7CisJQXZtQ292ZXJhZ2VPbmVUcmFjZURyaXZlciAgbU1hbnlUcmFjZURyaXZlcjsKKworcHJvdGVjdGVkOgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBDb21wdXRpbmcgdmFyaWFibGUKKwlFeGVjdXRpb25Db250ZXh0OjpjaGlsZF9pdGVyYXRvciBpdENoaWxkRUM7CisJRXhlY3V0aW9uQ29udGV4dDo6Y2hpbGRfaXRlcmF0b3IgZW5kQ2hpbGRFQzsKKworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlBdm1Db3ZlcmFnZVByb2Nlc3NvcihTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXIgJiBhQ29udHJvbGxlclVuaXRNYW5hZ2VyLAorCQkJV09iamVjdCAqIHdmUGFyYW1ldGVyT2JqZWN0KQorCTogUmVnaXN0ZXJlZENvdmVyYWdlUHJvY2Vzc29yVW5pdCggYUNvbnRyb2xsZXJVbml0TWFuYWdlciAsIHdmUGFyYW1ldGVyT2JqZWN0LAorCQkJQVZNX1BSRVBPU1RfRklMVEVSSU5HX1NUQUdFLAorCQkJUFJFQ0VERU5DRV9PRl9BQ1RJVkVfQ09WRVJBR0VfUFJPQ0VTU09SICksCisJU3ltYmV4Q29udHJvbGxlclJlcXVlc3RTdGF0dXMoIFJFUVVFU1RfVU5ERUZJTkVEX1NUQVRVUyApLAorCUlEZWJ1Z1Byb2Nlc3NvclByb3ZpZGVyKCB0aGlzICksCisKKwltU2NvcGUoIFNwZWNpZmllcjo6REVTSUdOX01PREVMX0tJTkQgKSwKKworCW1IZXVyaXN0aWNQcm9wZXJ0eSggKSwKKworCW1UcmFuc2l0aW9uQ292ZXJhZ2UoICp0aGlzICwgd2ZQYXJhbWV0ZXJPYmplY3QgKSwKKwltT25lVHJhY2VEcml2ZXIgKCAqdGhpcyAsIEVOViApLAorCW1NYW55VHJhY2VEcml2ZXIoICp0aGlzICwgRU5WICksCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQ29tcHV0aW5nIHZhcmlhYmxlCisJaXRDaGlsZEVDKCApLAorCWVuZENoaWxkRUMoICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5Bdm1Db3ZlcmFnZVByb2Nlc3NvcigpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gUExVR0lOIFBST0NFU1NPUiBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIENPTkZJR1VSRSBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwl2aXJ0dWFsIGJvb2wgY29uZmlndXJlSW1wbCgpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gUkVQT1JUIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXZpcnR1YWwgdm9pZCByZXBvcnRNaW5pbXVtKE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworCXZpcnR1YWwgdm9pZCByZXBvcnREZWZhdWx0KE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFBST0NFU1MgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJdmlydHVhbCBib29sIHByZXByb2Nlc3MoKTsKKworCXZpcnR1YWwgYm9vbCBwb3N0cHJvY2VzcygpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gRklMVEVSIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXZpcnR1YWwgYm9vbCBwcmVmaWx0ZXIoKTsKKworCXZpcnR1YWwgYm9vbCBwb3N0ZmlsdGVyKCk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBQUk9DRVNTT1IgUkVRVUVTVCBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLyoqCisJICogU1RPUCAgfCBSRUxFQVNFCisJICogUkVTRVQgfCBSRVNUQVJUIHwgQ09OVElOVUUKKwkgKiBSRVFVRVVFX1dBSVRJTkcgfCBSRVFVRVVFX1JFU0VSVkUKKwkgKiBIRVVSSVNUSUMgfCBHT0FMX0FDSElFVkVECisJICovCisJdmlydHVhbCB2b2lkIGhhbmRsZVJlcXVlc3RSZXF1ZXVlV2FpdGluZ1RhYmxlKAorCQkJV2FpdGluZ1N0cmF0ZWd5ICYgYVdhaXRpbmdTdHJhdGVneSwKKwkJCWF2bV91aW50OF90IGFXZWlnaHRNaW4sIGF2bV91aW50OF90IGFXZWlnaHRNYXgpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gREVCVUcgUFJPQ0VTU0lORyBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwl2aXJ0dWFsIGJvb2wgZGVidWdFdmFsQ29tbWFuZEltcGwoKTsKKworCXZvaWQgZGJnQ29tbWFuZERpcmVjdGl2ZVRyYW5zaXRpb24oKTsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFNFUklBTElaQVRJT04gQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCXZpcnR1YWwgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCWlmKCBtUGFyYW1ldGVyV09iamVjdCAhPSBOVUxMICkKKwkJeworCQkJbVBhcmFtZXRlcldPYmplY3QtPnRvU3RyZWFtKG9zKTsKKwkJfQorCX0KKworCisKK307CisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworCisjZW5kaWYgLyogQVZNQ09WRVJBR0VQUk9DRVNTT1JfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9jb3ZlcmFnZS9Bdm1Db3ZlcmFnZVN0YXRpc3RpY3MuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9jb3ZlcmFnZS9Bdm1Db3ZlcmFnZVN0YXRpc3RpY3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDBhYmQyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2NvdmVyYWdlL0F2bUNvdmVyYWdlU3RhdGlzdGljcy5oCkBAIC0wLDAgKzEsNDQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogNSBmw6l2ci4gMjAxNQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEFWTUNPVkVSQUdFU1RBVElTVElDU19IXworI2RlZmluZSBBVk1DT1ZFUkFHRVNUQVRJU1RJQ1NfSF8KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vQml0c2V0Lmg+CisKKyNpbmNsdWRlIDx1dGlsL2F2bV9udW1lcmljLmg+CisjaW5jbHVkZSA8dXRpbC9hdm1fdXRpbC5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworY2xhc3MgT3V0U3RyZWFtOworCisKK2NsYXNzIEF2bUNvdmVyYWdlU3RhdGlzdGljcworeworCitwdWJsaWM6CisJLyoKKwkgKiBBVFRSSUJVVEVTCisJICovCisJQml0c2V0ICAgICBtQ292ZXJhZ2VCaXRzZXQ7CisKKwlhdm1fc2l6ZV90IG1OdW1iZXJPZkVsZW1lbnRzOworCWF2bV9zaXplX3QgbU51bWJlck9mQ292ZXJlZDsKKworCWF2bV9zaXplX3QgbUNvdmVyYWdlUmF0ZUdvYWw7CisJYXZtX3NpemVfdCBtQ292ZXJhZ2VSZXN0R29hbDsKKworCWF2bV9zaXplX3QgbUJhY2t1cE9mQ292ZXJlZDsKKworCWF2bV9zaXplX3QgbU51bWJlck9mQmFja3RyYWNrOworCisJYXZtX3NpemVfdCBtTnVtYmVyT2ZGYWlsZWRTdGVwOworCWF2bV9zaXplX3QgbU51bWJlck9mRmFpbGVkSGV1cmlzdGljOworCisJYXZtX3NpemVfdCBtTnVtYmVyT2ZCbGFja0hvbGU7CisJYXZtX3NpemVfdCBtTnVtYmVyT2ZCbGFja0hvbGVUZXN0OworCisKK3B1YmxpYzoKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUF2bUNvdmVyYWdlU3RhdGlzdGljcyhhdm1fc2l6ZV90IG9ialJhdGUgPSAxMDAsIGF2bV9zaXplX3Qgb2JqUmVzdCA9IDApCisJOiBtQ292ZXJhZ2VCaXRzZXQoIDAgLCBmYWxzZSApLAorCW1OdW1iZXJPZkVsZW1lbnRzKCAwICksCisJbU51bWJlck9mQ292ZXJlZCggMCApLAorCisJbUNvdmVyYWdlUmF0ZUdvYWwoIG9ialJhdGUgKSwKKwltQ292ZXJhZ2VSZXN0R29hbCggb2JqUmVzdCApLAorCisJbUJhY2t1cE9mQ292ZXJlZCggMCApLAorCisJbU51bWJlck9mQmFja3RyYWNrKCAwICksCisKKwltTnVtYmVyT2ZGYWlsZWRTdGVwKCAwICksCisJbU51bWJlck9mRmFpbGVkSGV1cmlzdGljKCAwICksCisKKwltTnVtYmVyT2ZCbGFja0hvbGUoIDAgKSwKKwltTnVtYmVyT2ZCbGFja0hvbGVUZXN0KCAwICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJQXZtQ292ZXJhZ2VTdGF0aXN0aWNzKGNvbnN0IEF2bUNvdmVyYWdlU3RhdGlzdGljcyAmIGFDb3ZlcmFnZVN0YXRpc3RpY3MpCisJOiBtQ292ZXJhZ2VCaXRzZXQoIGFDb3ZlcmFnZVN0YXRpc3RpY3MubUNvdmVyYWdlQml0c2V0ICksCisJbU51bWJlck9mRWxlbWVudHMoIGFDb3ZlcmFnZVN0YXRpc3RpY3MubU51bWJlck9mRWxlbWVudHMgKSwKKwltTnVtYmVyT2ZDb3ZlcmVkKCBhQ292ZXJhZ2VTdGF0aXN0aWNzLm1OdW1iZXJPZkNvdmVyZWQgKSwKKworCW1Db3ZlcmFnZVJhdGVHb2FsKCBhQ292ZXJhZ2VTdGF0aXN0aWNzLm1Db3ZlcmFnZVJhdGVHb2FsICksCisJbUNvdmVyYWdlUmVzdEdvYWwoIGFDb3ZlcmFnZVN0YXRpc3RpY3MubUNvdmVyYWdlUmVzdEdvYWwgKSwKKworCW1CYWNrdXBPZkNvdmVyZWQoIGFDb3ZlcmFnZVN0YXRpc3RpY3MubUJhY2t1cE9mQ292ZXJlZCApLAorCisJbU51bWJlck9mQmFja3RyYWNrKCBhQ292ZXJhZ2VTdGF0aXN0aWNzLm1OdW1iZXJPZkJhY2t0cmFjayApLAorCisJbU51bWJlck9mRmFpbGVkU3RlcCggYUNvdmVyYWdlU3RhdGlzdGljcy5tTnVtYmVyT2ZGYWlsZWRTdGVwICksCisJbU51bWJlck9mRmFpbGVkSGV1cmlzdGljKCBhQ292ZXJhZ2VTdGF0aXN0aWNzLm1OdW1iZXJPZkZhaWxlZEhldXJpc3RpYyApLAorCisJbU51bWJlck9mQmxhY2tIb2xlKCBhQ292ZXJhZ2VTdGF0aXN0aWNzLm1OdW1iZXJPZkJsYWNrSG9sZSApLAorCW1OdW1iZXJPZkJsYWNrSG9sZVRlc3QoIGFDb3ZlcmFnZVN0YXRpc3RpY3MubU51bWJlck9mQmxhY2tIb2xlVGVzdCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5Bdm1Db3ZlcmFnZVN0YXRpc3RpY3MoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ29weSBpZiBjb3ZlcmFnZSByYXRlIGlzIGJlc3QKKwkgKi8KKwlpbmxpbmUgZG91YmxlIGNvdmVyYWdlUmF0ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIChtTnVtYmVyT2ZFbGVtZW50cyA9PSAwKSA/ICAwLjAgIDoKKwkJCQkoc3RhdGljX2Nhc3Q8IGRvdWJsZSA+KG1OdW1iZXJPZkNvdmVyZWQpIC8gbU51bWJlck9mRWxlbWVudHMpICk7CisJfQorCisJaW5saW5lIHZvaWQgY29weUlmQmVzdENvdmVyYWdlUmF0ZShjb25zdCBBdm1Db3ZlcmFnZVN0YXRpc3RpY3MgJiBhU3RhdCkKKwl7CisJCWlmKCAoYVN0YXQubU51bWJlck9mRWxlbWVudHMgPiAwKSAmJiAoKG1OdW1iZXJPZkVsZW1lbnRzID09IDApIHx8CisJCQkodGhpcy0+Y292ZXJhZ2VSYXRlKCkgPCBhU3RhdC5jb3ZlcmFnZVJhdGUoKSkgfHwKKwkJCShtTnVtYmVyT2ZFbGVtZW50cyA8IGFTdGF0Lm1OdW1iZXJPZkVsZW1lbnRzKSkgKQorCQl7CisJCQltQ292ZXJhZ2VCaXRzZXQgPSBhU3RhdC5tQ292ZXJhZ2VCaXRzZXQ7CisKKwkJCW1OdW1iZXJPZkVsZW1lbnRzID0gYVN0YXQubU51bWJlck9mRWxlbWVudHM7CisJCQltTnVtYmVyT2ZDb3ZlcmVkICA9IGFTdGF0Lm1OdW1iZXJPZkNvdmVyZWQ7CisKKwkJCW1Db3ZlcmFnZVJhdGVHb2FsID0gYVN0YXQubUNvdmVyYWdlUmF0ZUdvYWw7CisJCQltQ292ZXJhZ2VSZXN0R29hbCA9IGFTdGF0Lm1Db3ZlcmFnZVJlc3RHb2FsOworCisJCQltQmFja3VwT2ZDb3ZlcmVkID0gYVN0YXQubUJhY2t1cE9mQ292ZXJlZDsKKworCQkJbU51bWJlck9mQmFja3RyYWNrID0gYVN0YXQubU51bWJlck9mQmFja3RyYWNrOworCisJCQltQmFja3VwT2ZDb3ZlcmVkID0gYVN0YXQubUJhY2t1cE9mQ292ZXJlZDsKKwkJCW1OdW1iZXJPZkZhaWxlZFN0ZXAgPSBhU3RhdC5tTnVtYmVyT2ZGYWlsZWRTdGVwOworCQkJbU51bWJlck9mRmFpbGVkSGV1cmlzdGljID0gYVN0YXQubU51bWJlck9mRmFpbGVkSGV1cmlzdGljOworCisJCQltTnVtYmVyT2ZCbGFja0hvbGUgPSBhU3RhdC5tTnVtYmVyT2ZCbGFja0hvbGU7CisJCQltTnVtYmVyT2ZCbGFja0hvbGVUZXN0ID0gYVN0YXQubU51bWJlck9mQmxhY2tIb2xlVGVzdDsKKwkJfQorCX0KKworCisJLyoqCisJICogUkVTRVRURVIKKwkgKi8KKwlpbmxpbmUgdm9pZCByZXNldENvdW50ZXIoKQorCXsKKwkJbUNvdmVyYWdlQml0c2V0LmNsZWFyKCk7CisKKwkJbU51bWJlck9mRWxlbWVudHMgID0gMDsKKwkJbU51bWJlck9mQ292ZXJlZCAgID0gMDsKKwkJbUJhY2t1cE9mQ292ZXJlZCAgID0gMDsKKwkJbU51bWJlck9mQmFja3RyYWNrID0gMDsKKworCQltTnVtYmVyT2ZGYWlsZWRTdGVwID0gMDsKKwkJbU51bWJlck9mRmFpbGVkSGV1cmlzdGljID0gMDsKKwl9CisKKwlpbmxpbmUgdm9pZCByZXNldENvdmVyYWdlQ291bnRlcigpCisJeworCQltQ292ZXJhZ2VCaXRzZXQucmVzZXQoKTsKKworCQltTnVtYmVyT2ZDb3ZlcmVkID0gMDsKKwkJbUJhY2t1cE9mQ292ZXJlZCA9IDA7CisKKwkJbU51bWJlck9mRmFpbGVkU3RlcCA9IDA7CisJCW1OdW1iZXJPZkZhaWxlZEhldXJpc3RpYyA9IDA7CisJfQorCisJaW5saW5lIHZvaWQgcmVzZXRGYWlsZWRTdGVwKCkKKwl7CisJCW1OdW1iZXJPZkZhaWxlZFN0ZXAgPSAwOworCQltTnVtYmVyT2ZGYWlsZWRIZXVyaXN0aWMgPSAwOworCX0KKworCWlubGluZSB2b2lkIHNldEZhaWxlZEhldXJpc3RpYygpCisJeworCQltTnVtYmVyT2ZGYWlsZWRIZXVyaXN0aWMgPSAxOworCX0KKworCisJLyoqCisJICogbU51bWJlck9mRWxlbWVudHMKKwkgKi8KKwlpbmxpbmUgdm9pZCBhZGRVbmNvdmVyZWRFbGVtZW50KCkKKwl7CisJCSsrbU51bWJlck9mRWxlbWVudHM7CisJfQorCisJaW5saW5lIHZvaWQgYWRkVW5jb3ZlcmVkRWxlbWVudChhdm1fc2l6ZV90IGNvdW50KQorCXsKKwkJbU51bWJlck9mRWxlbWVudHMgKz0gY291bnQ7CisJfQorCisKKwlpbmxpbmUgYXZtX3NpemVfdCBnZXROdW1iZXJPZkVsZW1lbnRzKCkgY29uc3QKKwl7CisJCXJldHVybiBtTnVtYmVyT2ZFbGVtZW50czsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXROdW1iZXJPZkVsZW1lbnRzKGF2bV9zaXplX3QgY291bnQpCisJeworCQltTnVtYmVyT2ZFbGVtZW50cyA9IGNvdW50OworCX0KKworCisJLyoqCisJICogbU51bWJlck9mQ292ZXJlZAorCSAqLworCWlubGluZSB2b2lkIGFkZENvdmVyZWRFbGVtZW50KCkKKwl7CisJCSsrbU51bWJlck9mQ292ZXJlZDsKKwl9CisKKwlpbmxpbmUgdm9pZCBhZGRDb3ZlcmVkRWxlbWVudChhdm1fc2l6ZV90IGNvdW50KQorCXsKKwkJbU51bWJlck9mQ292ZXJlZCArPSBjb3VudDsKKwl9CisKKworCWlubGluZSBhdm1fc2l6ZV90IGdldE51bWJlck9mQ292ZXJlZCgpIGNvbnN0CisJeworCQlyZXR1cm4gbU51bWJlck9mQ292ZXJlZDsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXROdW1iZXJPZkNvdmVyZWQoYXZtX3NpemVfdCBjb3VudCkKKwl7CisJCW1OdW1iZXJPZkNvdmVyZWQgPSBjb3VudDsKKwl9CisKKworCS8qKgorCSAqIG9iamVjdGl2ZVJhdGUKKwkgKiBvYmplY3RpdmVSZXN0CisJICovCisJaW5saW5lIHZvaWQgc2V0T2JqZWN0aXZlcyhhdm1fc2l6ZV90IG9ialJhdGUgPSAxMDAsIGF2bV9zaXplX3Qgb2JqUmVzdCA9IDApCisJeworCQltQ292ZXJhZ2VSYXRlR29hbCA9IG9ialJhdGU7CisJCW1Db3ZlcmFnZVJlc3RHb2FsID0gb2JqUmVzdDsKKwl9CisKKworCS8qKgorCSAqIG1CYWNrdXBPZkNvdmVyZWQKKwkgKiBtTnVtYmVyT2ZDb3ZlcmVkCisJICovCisJaW5saW5lIHZvaWQgYmFja3VwQ292ZXJlZCgpCisJeworCQltQmFja3VwT2ZDb3ZlcmVkID0gbU51bWJlck9mQ292ZXJlZDsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNOZXdseUNvdmVyZWQoKQorCXsKKwkJcmV0dXJuKCBtQmFja3VwT2ZDb3ZlcmVkIDwgbU51bWJlck9mQ292ZXJlZCApOworCX0KKworCWlubGluZSBib29sIGlzTmV3bHlGYWlsZWRTdGVwKCkKKwl7CisJCXJldHVybiggbUJhY2t1cE9mQ292ZXJlZCA9PSBtTnVtYmVyT2ZDb3ZlcmVkICk7CisJfQorCisKKwkvKioKKwkgKiBtTnVtYmVyT2ZFbGVtZW50cworCSAqIG1OdW1iZXJPZkNvdmVyZWQKKwkgKi8KKwlpbmxpbmUgYXZtX3NpemVfdCBnZXROdW1iZXJPZlVuY292ZXJlZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1OdW1iZXJPZkVsZW1lbnRzIC0gbU51bWJlck9mQ292ZXJlZCApOworCX0KKworCisJLyoqCisJICogbU51bWJlck9mRWxlbWVudHMKKwkgKiBtTnVtYmVyT2ZGYWlsZWRTdGVwCisJICovCisJaW5saW5lIGJvb2wgaGFzRmFpbGVkU3RlcCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1OdW1iZXJPZkZhaWxlZFN0ZXAgPiAwICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNTZXJpb3VzbHlGYWlsZWRTdGVwKCkgY29uc3QKKwl7CisJCXJldHVybiggKG1OdW1iZXJPZkZhaWxlZFN0ZXAgJSBtTnVtYmVyT2ZFbGVtZW50cykgPT0gMCApOworCX0KKworCWlubGluZSBib29sIGlzU3VjY2Vzc2Z1bFN0ZXAoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtTnVtYmVyT2ZGYWlsZWRTdGVwID09IDAgKTsKKwl9CisKKwkvKioKKwkgKiBtTnVtYmVyT2ZGYWlsZWRTdGVwCisJICogbUJhY2t1cE9mQ292ZXJlZAorCSAqIG1OdW1iZXJPZkNvdmVyZWQKKwkgKi8KKwlpbmxpbmUgYm9vbCB1cGRhdGVGYWlsZWRTdGVwKCkKKwl7CisJCWlmKCBtQmFja3VwT2ZDb3ZlcmVkID09IG1OdW1iZXJPZkNvdmVyZWQgKQorCQl7CisJCQkrK21OdW1iZXJPZkZhaWxlZFN0ZXA7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCisJLyoqCisJICogbU51bWJlck9mRmFpbGVkSGV1cmlzdGljCisJICogbU51bWJlck9mRmFpbGVkU3RlcAorCSAqIG1CYWNrdXBPZkNvdmVyZWQKKwkgKiBtTnVtYmVyT2ZDb3ZlcmVkCisJICovCisJaW5saW5lIGJvb2wgdXBkYXRlRmFpbGVkSGV1cmlzdGljKCkKKwl7CisJCWlmKCBtTnVtYmVyT2ZGYWlsZWRIZXVyaXN0aWMgPiAwICkKKwkJeworCQkJKyttTnVtYmVyT2ZGYWlsZWRIZXVyaXN0aWM7CisKKwkJCXJldHVybiggaXNTZXJpb3VzbHlGYWlsZWRTdGVwKCkgKTsKKwkJfQorCisJCXJldHVybiggdHJ1ZSApOworCX0KKworCisJLyoqCisJICogbU51bWJlck9mQmxhY2tIb2xlCisJICogbU51bWJlck9mQmxhY2tIb2xlVGVzdAorCSAqLworCWlubGluZSBzdGQ6OnN0cmluZyBzdHJCbGFja0hvbGVSYXRlKCkgY29uc3QKKwl7CisJCXJldHVybiggT1NTKCkgPDwgbU51bWJlck9mQmxhY2tIb2xlIDw8ICIvIiA8PCBtTnVtYmVyT2ZCbGFja0hvbGVUZXN0ICk7CisJfQorCisKKwkvKioKKwkgKiBDb3ZlcmFnZSBUZXN0CisJICovCisJaW5saW5lIGJvb2wgZ29hbEFjaGlldmVkKCkgY29uc3QKKwl7CisJCS8vIEFzc2VydFRydWUoIG1Db3ZlcmFnZUJpdHNldC5hbGxUcnVlKCkgKSA/CisJCXJldHVybiggbU51bWJlck9mQ292ZXJlZCA9PSBtTnVtYmVyT2ZFbGVtZW50cyApOworCX0KKworCWlubGluZSBib29sIGdvYWxBY2hpZXZlZFJhdGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAoKDEwMCAqIG1OdW1iZXJPZkNvdmVyZWQpIC8gbU51bWJlck9mRWxlbWVudHMpCisJCQkJPj0gbUNvdmVyYWdlUmF0ZUdvYWwgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBnb2FsQWNoaWV2ZWRSZXN0KCkgY29uc3QKKwl7CisJCXJldHVybiggKG1OdW1iZXJPZkVsZW1lbnRzIC0gbU51bWJlck9mQ292ZXJlZCkgPD0gbUNvdmVyYWdlUmVzdEdvYWwgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNDb3ZlcmVkKCkgY29uc3QKKwl7CisJCXJldHVybiggbU51bWJlck9mQ292ZXJlZCA+IDAgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNVbmNvdmVyZWQoKSBjb25zdAorCXsKKwkJLy8gQXNzZXJ0VHJ1ZSggbUNvdmVyYWdlQml0c2V0LmFueUZhbHNlKCkgKQorCQlyZXR1cm4oIG1OdW1iZXJPZkNvdmVyZWQgPCBtTnVtYmVyT2ZFbGVtZW50cyApOworCX0KKworCS8qKgorCSAqIHNldCBFWElUIENPREUKKwkgKi8KKwlpbmxpbmUgdm9pZCBzZXRFeGl0Q29kZSgpIGNvbnN0CisJeworCQlpZiggZ29hbEFjaGlldmVkKCkgKQorCQl7CisJCQlhdm1fc2V0X2V4aXRfY29kZSggQVZNX0VYSVRfQ09WRVJBR0VfR09BTF9BQ0hJRVZFRF9DT0RFKTsKKwkJfQorCQllbHNlIGlmKCAobU51bWJlck9mRWxlbWVudHMgPiAwKSAmJgorCQkJCSg5MCA8PSAoKDEwMCAqIG1OdW1iZXJPZkNvdmVyZWQpIC8gbU51bWJlck9mRWxlbWVudHMpKSApCisJCXsKKwkJCWF2bV9zZXRfZXhpdF9jb2RlKCBBVk1fRVhJVF9DT1ZFUkFHRV9HT0FMX0FMTU9TVF9BQ0hJRVZFRF9DT0RFKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWF2bV9zZXRfZXhpdF9jb2RlKCBBVk1fRVhJVF9DT1ZFUkFHRV9HT0FMX1VOQUNISUVWRURfQ09ERSk7CisJCX0KKwl9CisKKworCS8qKgorCSAqIHRvIHN0cmluZworCSAqLworCWlubGluZSBzdGQ6OnN0cmluZyBzdHJDb3ZlcmFnZVJhdGUoY29uc3Qgc3RkOjpzdHJpbmcgJiBzZXAgPSAiIC8gIikgY29uc3QKKwl7CisJCXJldHVybiggT1NTKCkgPDwgbU51bWJlck9mQ292ZXJlZCA8PCBzZXAgPDwgbU51bWJlck9mRWxlbWVudHMgKTsKKwl9CisKKwlpbmxpbmUgc3RkOjpzdHJpbmcgc3RyQ292ZXJhZ2VSYXRlKAorCQkJYm9vbCBpc0dvYWxBY2hpZXZlZCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBzZXAgPSAiIC8gIikgY29uc3QKKwl7CisJCXJldHVybiggT1NTKCkKKwkJCQk8PCAoaXNHb2FsQWNoaWV2ZWQgPyBtTnVtYmVyT2ZFbGVtZW50cyA6IG1OdW1iZXJPZkNvdmVyZWQpCisJCQkJPDwgc2VwIDw8IG1OdW1iZXJPZkVsZW1lbnRzICk7CisJfQorCisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJaW5saW5lIHZvaWQgdG9TdHJlYW1Db3ZlcmFnZVJhdGUoT3V0U3RyZWFtICYgb3MsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIHByb21wdCA9ICIiLCBjb25zdCBzdGQ6OnN0cmluZyAmIHNlcCA9ICIgLyAiLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBlb2wgPSAiXG4iKSBjb25zdAorCXsKKwkJb3MgPDwgcHJvbXB0IDw8IG1OdW1iZXJPZkNvdmVyZWQgPDwgc2VwIDw8IG1OdW1iZXJPZkVsZW1lbnRzCisJCQkJPDwgZW9sIDw8IHN0ZDo6Zmx1c2g7CisJfQorCisJaW5saW5lIHZvaWQgdG9TdHJlYW1GYWlsZWRTdGVwKE91dFN0cmVhbSAmIG9zLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBwcm9tcHQgPSAiIiwgY29uc3Qgc3RkOjpzdHJpbmcgJiBuYW1lID0gIiAvICIsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGVvbCA9ICJcbiIpIGNvbnN0CisJeworCQlvcyA8PCBwcm9tcHQgPDwgbU51bWJlck9mRmFpbGVkU3RlcCA8PCBuYW1lCisJCQkJPDwgKCAobU51bWJlck9mRmFpbGVkU3RlcCA+IDApID8gInMiIDogIiIgKQorCQkJCTw8IGVvbCA8PCBzdGQ6OmZsdXNoOworCX0KKworfTsKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qIEFWTUNPVkVSQUdFU1RBVElTVElDU19IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2NvdmVyYWdlL0F2bUNvdmVyYWdlVHJhY2VEcml2ZXIuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2NvdmVyYWdlL0F2bUNvdmVyYWdlVHJhY2VEcml2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiN2M4MGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vY292ZXJhZ2UvQXZtQ292ZXJhZ2VUcmFjZURyaXZlci5jcHAKQEAgLTAsMCArMSwyMTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxOSBub3YuIDIwMTQKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkF2bUNvdmVyYWdlVHJhY2VEcml2ZXIuaCIKKworI2luY2x1ZGUgPGJ1aWxkZXIvYW5hbHlzaXMvVHJhbnNpdGlvblJlYWNoYWJpbGl0eS5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvQXZtVHJhbnNpdGlvbi5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uQ29udGV4dC5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkRhdGEuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lSUQuaD4KKworI2luY2x1ZGUgPGZtbC90cmFjZS9UcmFjZVBvaW50Lmg+CisKKyNpbmNsdWRlIDxmYW0vY292ZXJhZ2UvQmFzZUNvdmVyYWdlRmlsdGVyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBUUkFDRSBEUklWRVIgQVBJCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIEF2bUNvdmVyYWdlVHJhY2VEcml2ZXI6OmluaXRpYWxpemUoCisJCUV4ZWN1dGlvbkNvbnRleHQgKiBhRGlyZWN0aXZlRUMsIEF2bVRyYW5zaXRpb24gKiBhVHJhbnNpdGlvbikKK3sKKwlpZiggbVRyYW5zaXRpb25UYXJnZXRIaXN0b3J5LmNvbnRhaW5zKCBhVHJhbnNpdGlvbiApICkKKwl7CisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwltVHJhbnNpdGlvblRhcmdldEhpc3RvcnkucHVzaF9mcm9udCggYVRyYW5zaXRpb24gKTsKKworCW1UcmFuc2l0aW9uVGFyZ2V0ID0gYVRyYW5zaXRpb247CisJbURpcmVjdGl2ZUVDID0gYURpcmVjdGl2ZUVDOworCisJbURpcmVjdGl2ZVRyYWNlLnBvaW50cy5jbGVhcigpOworCW1QZW5kaW5nVHJhY2UucG9pbnRzLmNsZWFyKCk7CisKKwlSdW50aW1lSUQgYVJJRCA9IG1EaXJlY3RpdmVFQy0+cmVmRXhlY3V0aW9uRGF0YSgpLmdldFJ1bnRpbWVJRCgKKwkJCW1UcmFuc2l0aW9uVGFyZ2V0LT5nZXRFeGVjdXRhYmxlKCkgKTsKKworCVRyYW5zaXRpb25SZWFjaGFiaWxpdHkgcGF0aENoZWNrZXIoKm1EaXJlY3RpdmVFQywgYVJJRCwgbVRyYW5zaXRpb25UYXJnZXQpOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCUFWTV9PU19DT1VUIDw8IHN0ZDo6ZW5kbCA8PCBSRVBFQVQoIjw8PDw8PDw8PDwiLCAxMCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKworCWlmKCAobUluaXRpYWxpemF0aW9uRmxhZyA9IHBhdGhDaGVja2VyLmNvbXB1dGVQYXRoKG1EaXJlY3RpdmVUcmFjZSkpICkKKwl7CisJCW1QZW5kaW5nVHJhY2UuY29weVRyYWNlKCBtRGlyZWN0aXZlVHJhY2UgKTsKKworCQltUGVuZGluZ1RyYWNlU2l6ZSA9IG1QZW5kaW5nVHJhY2UucG9pbnRzLnNpemUoKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwlwYXRoQ2hlY2tlci5yZXBvcnQoQVZNX09TX0NPVVQpOworCUFWTV9PU19DT1VUIDw8IFJFUEVBVCgiPj4+Pj4+Pj4+PiIsIDEwKSA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwl9CisKKwlyZXR1cm4oIG1Jbml0aWFsaXphdGlvbkZsYWcgKTsKK30KKworCitib29sIEF2bUNvdmVyYWdlVHJhY2VEcml2ZXI6OnByb2Nlc3MoY29uc3QgTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGFSZXN1bHRRdWV1ZSkKK3sKKwlMaXN0T2ZFeGVjdXRpb25Db250ZXh0Ojpjb25zdF9pdGVyYXRvciBlY1F1ZXVlSXQgPSBhUmVzdWx0UXVldWUuYmVnaW4oKTsKKwlMaXN0T2ZFeGVjdXRpb25Db250ZXh0Ojpjb25zdF9pdGVyYXRvciBlY1F1ZXVlSXRFbmQgPSBhUmVzdWx0UXVldWUuZW5kKCk7CisJZm9yKCA7IGVjUXVldWVJdCAhPSBlY1F1ZXVlSXRFbmQgOyArK2VjUXVldWVJdCApCisJeworCQlpZiggKCplY1F1ZXVlSXQpID09IG1EaXJlY3RpdmVFQyApCisJCXsKKwkJCXJldHVybiggZHJpdmUoKSApOworCQl9CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKK2Jvb2wgQXZtQ292ZXJhZ2VUcmFjZURyaXZlcjo6ZHJpdmUoKQoreworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwlBVk1fT1NfQ09VVCA8PCBzdGQ6OmVuZGwgPDwgUkVQRUFUKCI9PT09PT09PT09IiwgMTApIDw8IHN0ZDo6ZW5kbDsKKwlBVk1fT1NfQ09VVCA8PCAiRGlyZWN0aXZlIFRyYWNlOj4iIDw8IHN0ZDo6ZW5kbDsKKwltUGVuZGluZ1RyYWNlLnRvU3RyZWFtKEFWTV9PU19DT1VUKTsKKwlBVk1fT1NfQ09VVCA8PCAiRGlyZWN0aXZlIEVDOj4gIiA8PCBtRGlyZWN0aXZlRUMtPnN0cl9taW4oKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCisJRXhlY3V0aW9uQ29udGV4dDo6Y2hpbGRfaXRlcmF0b3IgaXRFQyA9IG1EaXJlY3RpdmVFQy0+YmVnaW4oKTsKKwlFeGVjdXRpb25Db250ZXh0OjpjaGlsZF9pdGVyYXRvciBlbmRFQyA9IG1EaXJlY3RpdmVFQy0+ZW5kKCk7CisKKwlhdm1fc2l6ZV90IGNvdmVyYWdlTWF4ID0gMDsKKwlhdm1fc2l6ZV90IGNvdmVyYWdlQ291bnQgPSAwOworCisJQkZMaXN0Ojpjb25zdF9pdGVyYXRvciBpdFRQOworCUJGTGlzdDo6Y29uc3RfaXRlcmF0b3IgZW5kVFAgPSBtUGVuZGluZ1RyYWNlLnBvaW50cy5lbmQoKTsKKworCWZvciggOyBpdEVDICE9IGVuZEVDIDsgKytpdEVDICkKKwl7CisJCWNvdmVyYWdlQ291bnQgPSAwOworCisJCWZvciggaXRUUCA9IG1QZW5kaW5nVHJhY2UucG9pbnRzLmJlZ2luKCkgOyBpdFRQICE9IGVuZFRQIDsgKytpdFRQICkKKwkJeworCQkJaWYoIG1UcmFjZUNoZWNrZXIuaXNTYXRUcmFuc2l0aW9uKCooKml0RUMpLAorCQkJCQkoKml0VFApLnRvX3B0cjwgVHJhY2VQb2ludCA+KCksCisJCQkJCSgqaXRFQyktPmdldFJ1bm5hYmxlRWxlbWVudFRyYWNlKCkpICkKKwkJCXsKKwkJCQkrK2NvdmVyYWdlQ291bnQ7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiggY292ZXJhZ2VDb3VudCA+IGNvdmVyYWdlTWF4ICkKKwkJeworCQkJY292ZXJhZ2VNYXggPSBjb3ZlcmFnZUNvdW50OworCisJCQltRGlyZWN0aXZlRUMgPSAoKml0RUMpOworCisJCQltRGlyZWN0aXZlRUMtPnNldFdlaWdodCggV0VJR0hUX1NUUk9OR0xZX0FDSElFVkFCTEUgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCSgqaXRFQyktPnNldFdlaWdodCggV0VJR0hUX05PTl9QUklPUklUWSApOworCQl9CisJfQorCisJaWYoIGNvdmVyYWdlTWF4ID4gMCApCisJeworCQlpZiggY292ZXJhZ2VNYXggPCBtUGVuZGluZ1RyYWNlU2l6ZSApCisJCXsKKwkJCWZvciggY292ZXJhZ2VDb3VudCA9IDAgOyBjb3ZlcmFnZUNvdW50IDwgY292ZXJhZ2VNYXggOyArK2NvdmVyYWdlQ291bnQgKQorCQkJeworCQkJCW1QZW5kaW5nVHJhY2UucG9pbnRzLnBvcF9mcm9udCgpOworCQkJfQorCQkJbVBlbmRpbmdUcmFjZVNpemUgPSBtUGVuZGluZ1RyYWNlU2l6ZSAtIGNvdmVyYWdlTWF4OworCisJCQltRGlyZWN0aXZlRUMtPnNldFdlaWdodCggV0VJR0hUX0NFUlRBSU5MWV9BQ0hJRVZBQkxFICk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX0NPVVQgPDwgIkhJVCAhIEVDOj4gIjsgbURpcmVjdGl2ZUVDLT50cmFjZURlZmF1bHQoQVZNX09TX0NPVVQpOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwkJfQorCQllbHNlCisJCXsKKwkJCW1UcmFuc2l0aW9uVGFyZ2V0SGlzdG9yeS5wb3BfZnJvbnQoKTsKKworCQkJbVBlbmRpbmdUcmFjZS5wb2ludHMuY2xlYXIoKTsKKwkJCW1QZW5kaW5nVHJhY2VTaXplID0gMDsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwlBVk1fT1NfQ09VVCA8PCAiR09BTCBBQ0hJRVZFRCAhISEiIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJCX0KKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwlBVk1fT1NfQ09VVCA8PCBSRVBFQVQoIj09PT09PT09PT0iLCAxMCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX0NPVVQgPDwgUkVQRUFUKCI9PT09PT09PT09IiwgMTApIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTRVJJQUxJWkFUSU9OIEFQSQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBBdm1Db3ZlcmFnZVRyYWNlRHJpdmVyOjp0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlvcyA8PCAiVHJhbnNpdGlvbiB0byByZWFjaCA6PiAiOworCW1UcmFuc2l0aW9uVGFyZ2V0LT50b1N0cmVhbUhlYWRlcihvcyk7CisJaWYoIG1UcmFuc2l0aW9uVGFyZ2V0LT5oYXNJbnRlcm5hbENvbW11bmljYXRpb25Db2RlKCkgKQorCXsKKwkJb3MgPDwgIiAiOworCQlCYXNlQ29tcGlsZWRGb3JtOjp0b1N0cmVhbVN0YXRpY0NvbShvcywKKwkJCQltVHJhbnNpdGlvblRhcmdldC0+Z2V0SW50ZXJuYWxDb21tdW5pY2F0aW9uQ29kZSgpKTsKKwl9CisJb3MgPDwgRU9MX0ZMVVNIOworCisJb3MgPDwgIkNvbXB1dGVkIHRyYWNlIHRvIHJlYWNoIGl0IDo+ICI7CisJbURpcmVjdGl2ZVRyYWNlLnRvU3RyZWFtKG9zKTsKKworCUFWTV9PU19DT1VUIDw8ICJHT0FMICIgPDwgKCBnb2FsQWNoaWV2ZWQoKSA/ICJBQ0hJRVZFRCIgOiAiRkFJTEVEIiApCisJCQk8PCAiICEhISIgPDwgc3RkOjplbmRsOworfQorCisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vY292ZXJhZ2UvQXZtQ292ZXJhZ2VUcmFjZURyaXZlci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2NvdmVyYWdlL0F2bUNvdmVyYWdlVHJhY2VEcml2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmJmYWIzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2NvdmVyYWdlL0F2bUNvdmVyYWdlVHJhY2VEcml2ZXIuaApAQCAtMCwwICsxLDE0MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDE5IG5vdi4gMjAxNAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEFWTUNPVkVSQUdFVFJBQ0VEUklWRVJfSF8KKyNkZWZpbmUgQVZNQ09WRVJBR0VUUkFDRURSSVZFUl9IXworCisjaW5jbHVkZSA8ZmFtL2NvdmVyYWdlL0F2bUNvdmVyYWdlSGV1cmlzdGljUHJvcGVydHkuaD4KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vVHlwZWRlZi5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uQ29udGV4dC5oPgorCisjaW5jbHVkZSA8Zm1sL3RyYWNlL1RyYWNlQ2hlY2tlci5oPgorI2luY2x1ZGUgPGZtbC90cmFjZS9UcmFjZVNlcXVlbmNlLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBBdm1UcmFuc2l0aW9uOworY2xhc3MgRXZhbHVhdGlvbkVudmlyb25tZW50OworCisKK2NsYXNzIEF2bUNvdmVyYWdlVHJhY2VEcml2ZXIgOiAgcHVibGljIElIZXVyaXN0aWNDb250ZXh0V2VpZ2h0Cit7CisKK3Byb3RlY3RlZDoKKwlFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBFTlY7CisJVHJhY2VDaGVja2VyIG1UcmFjZUNoZWNrZXI7CisKKwlib29sIG1Jbml0aWFsaXphdGlvbkZsYWc7CisJQXZtVHJhbnNpdGlvbiAqIG1UcmFuc2l0aW9uVGFyZ2V0OworCUxpc3RPZkF2bVRyYW5zaXRpb24gbVRyYW5zaXRpb25UYXJnZXRIaXN0b3J5OworCisJRXhlY3V0aW9uQ29udGV4dCAqIG1EaXJlY3RpdmVFQzsKKworCVRyYWNlU2VxdWVuY2UgbURpcmVjdGl2ZVRyYWNlOworCisJVHJhY2VTZXF1ZW5jZSBtUGVuZGluZ1RyYWNlOworCWF2bV9zaXplX3QgbVBlbmRpbmdUcmFjZVNpemU7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUF2bUNvdmVyYWdlVHJhY2VEcml2ZXIoRXZhbHVhdGlvbkVudmlyb25tZW50ICYgYW5FTlYpCisJOiBJSGV1cmlzdGljQ29udGV4dFdlaWdodCggKSwKKwlFTlYoIGFuRU5WICksCisJbVRyYWNlQ2hlY2tlciggYW5FTlYgKSwKKwltSW5pdGlhbGl6YXRpb25GbGFnKCBmYWxzZSApLAorCW1UcmFuc2l0aW9uVGFyZ2V0KCBOVUxMICksCisJbVRyYW5zaXRpb25UYXJnZXRIaXN0b3J5KCApLAorCisJbURpcmVjdGl2ZUVDKCBOVUxMICksCisJbURpcmVjdGl2ZVRyYWNlKCApLAorCW1QZW5kaW5nVHJhY2UoICksCisJbVBlbmRpbmdUcmFjZVNpemUoIDAgKQorCXsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCisKKwl9CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+QXZtQ292ZXJhZ2VUcmFjZURyaXZlcigpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBtRGlyZWN0aXZlRUMKKwkgKiBtVHJhbnNpdGlvblRhcmdldEhpc3RvcnkKKwkgKi8KKwlpbmxpbmUgRXhlY3V0aW9uQ29udGV4dCAqIGdldERpcmVjdGl2ZUVDKCkKKwl7CisJCXJldHVybiggbURpcmVjdGl2ZUVDICk7CisJfQorCisJaW5saW5lIGJvb2wgY291bGRSZXRyeSgpCisJeworCQlyZXR1cm4oIG1UcmFuc2l0aW9uVGFyZ2V0SGlzdG9yeS5ub25lbXB0eSgpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzRmFpbGVkVHJhbnNpdGlvblRhcmdldEhpc3RvcnkoKQorCXsKKwkJcmV0dXJuKCBtVHJhbnNpdGlvblRhcmdldEhpc3Rvcnkubm9uZW1wdHkoKSApOworCX0KKworCisJaW5saW5lIHZvaWQgcmVzZXRGYWlsZWRUcmFuc2l0aW9uVGFyZ2V0SGlzdG9yeSgpCisJeworCQltVHJhbnNpdGlvblRhcmdldEhpc3RvcnkuY2xlYXIoKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBUUkFDRSBEUklWRVIgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJYm9vbCBpbml0aWFsaXplKEV4ZWN1dGlvbkNvbnRleHQgKiBhRGlyZWN0aXZlRUMsIEF2bVRyYW5zaXRpb24gKiBhVHJhbnNpdGlvbik7CisKKwlpbmxpbmUgYm9vbCBnb2FsQWNoaWV2ZWQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUGVuZGluZ1RyYWNlLnBvaW50cy5lbXB0eSgpICk7CisJfQorCisKKwlib29sIHByb2Nlc3MoY29uc3QgTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGFSZXN1bHRRdWV1ZSk7CisKKwlib29sIGRyaXZlKCk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBTRVJJQUxJWkFUSU9OIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXZpcnR1YWwgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKKworfTsKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qIEFWTUNPVkVSQUdFVFJBQ0VEUklWRVJfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9jb3ZlcmFnZS9Bdm1Db3ZlcmFnZVRyYWNlVmlldy5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vY292ZXJhZ2UvQXZtQ292ZXJhZ2VUcmFjZVZpZXcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNTA0YjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vY292ZXJhZ2UvQXZtQ292ZXJhZ2VUcmFjZVZpZXcuY3BwCkBAIC0wLDAgKzEsMjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxOSBub3YuIDIwMTQKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkF2bUNvdmVyYWdlVHJhY2VWaWV3LmgiCisKK25hbWVzcGFjZSBzZXAKK3sKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9jb3ZlcmFnZS9Bdm1Db3ZlcmFnZVRyYWNlVmlldy5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2NvdmVyYWdlL0F2bUNvdmVyYWdlVHJhY2VWaWV3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFjMzZkYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9jb3ZlcmFnZS9Bdm1Db3ZlcmFnZVRyYWNlVmlldy5oCkBAIC0wLDAgKzEsMTAzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTkgbm92LiAyMDE0CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQVZNQ09WRVJBR0VUUkFDRVZJRVdfSF8KKyNkZWZpbmUgQVZNQ09WRVJBR0VUUkFDRVZJRVdfSF8KKworI2luY2x1ZGUgPGZhbS9jb3ZlcmFnZS9Bdm1Db3ZlcmFnZUFic3RyYWN0Vmlldy5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworY2xhc3MgQXZtQ292ZXJhZ2VQcm9jZXNzb3I7CitjbGFzcyBPdXRTdHJlYW07CitjbGFzcyBFeGVjdXRpb25Db250ZXh0OworCisKK2NsYXNzIEF2bUNvdmVyYWdlVHJhY2VWaWV3ICA6ICBwdWJsaWMgQXZtQ292ZXJhZ2VBYnN0cmFjdFZpZXcKK3sKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUF2bUNvdmVyYWdlVHJhY2VWaWV3KAorCQkJQXZtQ292ZXJhZ2VQcm9jZXNzb3IgJiBhQ292ZXJhZ2VQcm9jZXNzb3IsIFdPYmplY3QgKiB3ZlBhcmFtZXRlck9iamVjdCkKKwk6IEF2bUNvdmVyYWdlQWJzdHJhY3RWaWV3KCBhQ292ZXJhZ2VQcm9jZXNzb3IgLCB3ZlBhcmFtZXRlck9iamVjdCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+QXZtQ292ZXJhZ2VUcmFjZVZpZXcoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIENPVkVSQUdFIFBST0NFU1NPUiBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIENPTkZJR1VSRSBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwl2aXJ0dWFsIGJvb2wgY29uZmlndXJlSW1wbCgpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gUkVQT1JUIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwl2aXJ0dWFsIHZvaWQgcmVwb3J0RGVmYXVsdChPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBQUk9DRVNTIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwl2aXJ0dWFsIGJvb2wgcHJlcHJvY2VzcygpOworCisJdmlydHVhbCBib29sIHBvc3Rwcm9jZXNzKCk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBGSUxURVIgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCXZpcnR1YWwgYm9vbCBwcmVmaWx0ZXIoKTsKKwl2aXJ0dWFsIGJvb2wgcHJlZmlsdGVyKEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKTsKKworCXZpcnR1YWwgYm9vbCBwb3N0ZmlsdGVyKCk7CisJdmlydHVhbCBib29sIHBvc3RmaWx0ZXIoRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gU0VSSUFMSVpBVElPTiBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJdmlydHVhbCB2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCit9OworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qIEFWTUNPVkVSQUdFVFJBQ0VWSUVXX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vY292ZXJhZ2UvQXZtQ292ZXJhZ2VUcmFuc2l0aW9uVmlldy5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vY292ZXJhZ2UvQXZtQ292ZXJhZ2VUcmFuc2l0aW9uVmlldy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU3Y2RjOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9jb3ZlcmFnZS9Bdm1Db3ZlcmFnZVRyYW5zaXRpb25WaWV3LmNwcApAQCAtMCwwICsxLDM0NzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxOSBub3YuIDIwMTQKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkF2bUNvdmVyYWdlVHJhbnNpdGlvblZpZXcuaCIKKworI2luY2x1ZGUgIkF2bUNvdmVyYWdlUHJvY2Vzc29yLmgiCisKKyNpbmNsdWRlIDxjb21wdXRlci9wcmltaXRpdmUvQXZtQ29tbXVuaWNhdGlvbkZhY3RvcnkuaD4KKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVGb3JtLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZVF1ZXJ5Lmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZVN5c3RlbS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZNYWNoaW5lLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29uc3RydWN0b3IuaD4KKworI2luY2x1ZGUgPGZtbC9jb21tb24vU3BlY2lmaWVyRWxlbWVudC5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uQ29uZmlndXJhdGlvbi5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkRhdGEuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lRm9ybS5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL1J1bnRpbWVJRC5oPgorCisjaW5jbHVkZSA8ZmFtL2NvdmVyYWdlL0Jhc2VDb3ZlcmFnZUZpbHRlci5oPgorCisjaW5jbHVkZSA8ZmFtL3F1ZXVlL1dhaXRpbmdTdHJhdGVneS5oPgorI2luY2x1ZGUgPGZhbS9xdWV1ZS9FeGVjdXRpb25RdWV1ZS5oPgorCisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1F1ZXJ5Lmg+CisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1dPYmplY3QuaD4KKworI2luY2x1ZGUgPHNldy9Db25maWd1cmF0aW9uLmg+CisjaW5jbHVkZSA8c2V3L1N5bWJleENvbnRyb2xsZXJSZXF1ZXN0TWFuYWdlci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3Byb3RvdHlwZSBmaWx0ZXI6OnRyYW5zaXRpb25fY292ZXJhZ2UgYXMgJmF2bTo6Y29yZS5maWx0ZXIuUFJPR1JBTV9DT1ZFUkFHRSBpcworCXNlY3Rpb24gUFJPUEVSVFkKKwkJLy8gTm9tYnJlIGRlIHBhcyBkZSBjYWxjdWwgImN1bXVsw6lzIiBhdmFudCBkZSBkw6lidXRlcgorCQkvLyBsYSB2w6lyaWZpY2F0aW9uIGRlIGxhIGNvdXZlcnR1cmUKKwkJQGJlZ2luX3N0ZXAgPSAwOworCisJCS8vIEFycsOodGUgbCdleMOpY3V0aW9uIGTDqHMgcXVlIGxhIGNvdXZlcnR1cmUgZXN0IGNvbXBsw6h0ZQorCQlAc3RvcCA9IHRydWU7CisKKwkJLy8gQXJyw6h0ZSBsJ2V4w6ljdXRpb24gYXUgcGx1dMO0dAorCQlAbWluaW1pemUgPSB0cnVlOworCisJCS8vIEFycsOodGUgbCdleMOpY3V0aW9uIGR1IGNoZW1pbiBjb3VyYW50IGTDqHMgcXUndW4gb2JqZWN0aWYgZXN0IGF0dGVpbnQKKwkJQGJyZWFrID0gdHJ1ZTsKKworCQkvLyBFbGFnYWdlIGR1IGdyYXBoZSBkZXMgc2PDqW5hcmlvcyDDoCBsYSBmaW4gZGUgbGEgdsOpcmlmaWNhdGlvbgorCQlAc2xpY2UgPSB0cnVlOworCisJCS8vIEFjdGl2ZSBsJ3V0aWxpc2F0aW9uIGQnaGV1cmlzdGlxdWUKKwkJQGhldXJpc3RpYyA9IHRydWU7CisKKwkJLy8gY2hvaXggZGUgbCdoZXVyaXN0aXF1ZSBkZSBkw6lwYXJ0CisJCS8vIGJhc2ljIHwgbmFpdmUgfCBzbWFydCB8IGFncmVzc2l2ZQorCQlAaGV1cmlzdGljI3N0YXJ0ID0gJ2Jhc2ljJzsKKworCQkvLyBOb21icmUgZCdlc3NhaXMgZCdoZXVyaXN0aXF1ZXMKKwkJQGhldXJpc3RpYyN0cmlhbHMgPSA3OworCisJCS8vIENyaXTDqHJlIGRlIHNhdGlzZmFjdGlvbiBkdSBzdWNjw6hzIGRlcyBoZXVyaXN0aXF1ZXMKKwkJLy8gdGF1eCBkZSBjb3V2ZXJ0ZSAvIG5vbWJyZSBkJ8OpbMOpbWVudCByZXN0YW50Li4uCisJCUBvYmplY3RpdmUjcmF0ZSA9IDk1OworCQlAb2JqZWN0aXZlI3Jlc3QgPSA1OworCisKKwkJLy8gQ2hvaXggZGVzIGNvbnRleHRlcyBhdmVjIGRlcyB0cmFuc2l0aW9ucworCQkvLyBbIGZvcnRlbWVudCB8IGZhaWJsZW1lbnQgfCBhdXRyZSBdIHRpcmFibGVzCisKKwkJLy8gTGltaXRhdGlvbnMgdGVtcG9yYWlyZSBkZSBsYSBwcm9mb25kZXVyIGQnZXhwbG9yYXRpb24KKwkJQGNvdmVyYWdlI2hlaWdodCA9IDc7CisKKwkJLy8gbm9tYnJlIGRlIGZvaXMgcXVlIGxhIGxpbWl0ZSBkb2l0IMOqdHJlIGF0dGVpbnQgYXZhbnQgZGUgbCdhdWdtZW50ZXIKKwkJQGNvdmVyYWdlI2hlaWdodCNyZWFjaGVkI2xpbWl0ID0gNDI7CisKKwkJQGhpdCNzdHJvbmdseSNyYW5kb20gPSBmYWxzZTsKKwkJQGhpdCNzdHJvbmdseSNjb3VudCA9IDE7CisKKwkJQGhpdCN3ZWFrbHkjcmFuZG9tID0gZmFsc2U7CisJCUBoaXQjd2Vha2x5I2NvdW50ID0gMTsKKworCQlAaGl0I290aGVyI3JhbmRvbSA9IGZhbHNlOworCQlAaGl0I290aGVyI2NvdW50ID0gMTsKKworCQlAc2NvcGUgPSAnREVUQUlMUyc7IAkvLyAnSU5TVEFOQ0UnIHwgJ0ZPUk0nIHwgJ0RFVEFJTFMnCisJZW5kc2VjdGlvbiBQUk9QRVJUWQorCisJLy8gVXRpbGlzw6kgcG91ciBwcsOpY2lzZXIgbGVzIG1hY2hpbmVzIG91IGxlcyB0cmFuc2l0aW9ucyBwYXJ0aWN1bGnDqHJlcyDDoCBjb3V2cmlyIQorCXNlY3Rpb24gREVUQUlMUworCQlAZm9ybSA9IHNwZWM6OmFzY2Vuc2V1ci5hc2NlbnNldXIuY29udHJvbGVyOworCQlAaW5zdGFuY2UgPSBzcGVjOjphc2NlbnNldXIuYXNjZW5zZXVyLmVucmVnaXN0cmVyOworCisJCUB0cmFuc2l0aW9uID0gc3BlYzo6YXNjZW5zZXVyLmFzY2Vuc2V1ci5hbGxlcl9hX2xfZXRhZ2UuYXR0ZW50ZS50cmFuc2l0aW9uIzY7CisJZW5kc2VjdGlvbiBERVRBSUxTCitlbmRwcm90b3R5cGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisKKy8qKgorICogREVTVFJVQ1RPUgorICovCitBdm1Db3ZlcmFnZVRyYW5zaXRpb25WaWV3Ojp+QXZtQ292ZXJhZ2VUcmFuc2l0aW9uVmlldygpCit7CisJaWYoIG1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZSAhPSBOVUxMICkKKwl7CisJCWNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVEID0KKwkJCQltQ292ZXJhZ2VQcm9jZXNzb3IuZ2V0Q29uZmlndXJhdGlvbigpLmdldE1haW5FeGVjdXRpb25EYXRhKCk7CisKKwkJaWYoIG1UcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZSAhPSBOVUxMICkKKwkJeworCQkJYXZtX3NpemVfdCBlbmRPZmZzZXQgPSBtVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUtPnNpemUoKTsKKwkJCWZvciggYXZtX3NpemVfdCBpID0gMCA7IGkgPCBlbmRPZmZzZXQgOyArK2kgKQorCQkJeworCQkJCWlmKCBtVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUtPmF0KGkpCisJCQkJCSE9IG1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZS0+YXQoCisJCQkJCQlhbkVELmdldFJ1bnRpbWUoaSkuZ2V0RXhlY3V0YWJsZSgpLT5nZXRPZmZzZXQoKSkgKQorCQkJCXsKKwkJCQkJZGVsZXRlKCBtVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUtPmF0KGkpICk7CisJCQkJfQorCQkJfQorCisJCQlkZWxldGUoIG1UcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZSApOworCQl9CisKKwkJZW5kT2Zmc2V0ID0gbUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlLT5zaXplKCk7CisJCWZvciggYXZtX3NpemVfdCBpID0gMCA7IGkgPCBlbmRPZmZzZXQgOyArK2kgKQorCQl7CisJCQlpZiggbUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlLT5hdChpKSAhPSBOVUxMICkKKwkJCXsKKwkJCQlkZWxldGUoIG1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZS0+YXQoaSkgKTsKKwkJCX0KKwkJfQorCisJCWRlbGV0ZSggbUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlICk7CisJfQorCisJZWxzZSBpZiggbVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlICE9IE5VTEwgKQorCXsKKwkJYXZtX3NpemVfdCBlbmRPZmZzZXQgPSBtVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUtPnNpemUoKTsKKwkJZm9yKCBhdm1fc2l6ZV90IGkgPSAwIDsgaSA8IGVuZE9mZnNldCA7ICsraSApCisJCXsKKwkJCWlmKCBtVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUtPmF0KGkpICE9IE5VTEwgKQorCQkJeworCQkJCWRlbGV0ZSggbVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlLT5hdChpKSApOworCQkJfQorCQl9CisKKwkJZGVsZXRlKCBtVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUgKTsKKwl9Cit9CisKKworLyoqCisgKiBDT05GSUdVUkUKKyAqLworYm9vbCBBdm1Db3ZlcmFnZVRyYW5zaXRpb25WaWV3Ojpjb25maWd1cmVJbXBsKCkKK3sKKwlXT2JqZWN0ICogdGhlUFJPUEVSVFkgPSBRdWVyeTo6Z2V0UmVnZXhXU2VxdWVuY2UoCisJCQlnZXRQYXJhbWV0ZXJXT2JqZWN0KCksIE9SX1dJRDIoInByb3BlcnR5IiwgIlBST1BFUlRZIikpOworCisJaWYoIHRoZVBST1BFUlRZICE9IFdPYmplY3Q6Ol9OVUxMXyApCisJeworCQljb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCA9CisJCQkJbUNvdmVyYWdlUHJvY2Vzc29yLmdldENvbmZpZ3VyYXRpb24oKS5nZXRNYWluRXhlY3V0aW9uRGF0YSgpOworCisJCW1UcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZSA9CisJCQkJbmV3IEFycmF5T2ZCaXRzZXQoYW5FRC5nZXRUYWJsZU9mUnVudGltZSgpLnNpemUoKSwgTlVMTCk7CisKKwkJRXhlY3V0YWJsZVF1ZXJ5IFhRdWVyeSggbUNvdmVyYWdlUHJvY2Vzc29yLmdldENvbmZpZ3VyYXRpb24oKSApOworCisJCVhRdWVyeS5nZXRSdW50aW1lRXhlY3V0YWJsZSggbVRhYmxlb2ZSdW50aW1lRXhlY3V0YWJsZSApOworCisJCW1TY29wZSA9IFNwZWNpZmllcjo6dG9EZXNpZ25LaW5kKAorCQkJCVF1ZXJ5OjpnZXRXUHJvcGVydHlTdHJpbmcodGhlUFJPUEVSVFksICJzY29wZSIsICJNT0RFTCIpICk7CisKKwkJc3dpdGNoKCBtU2NvcGUgKQorCQl7CisJCQljYXNlIFNwZWNpZmllcjo6REVTSUdOX0lOU1RBTkNFX0tJTkQ6CisJCQl7CisJCQkJLy8gSU5JVElBTElTQVRJT04gZGUgbGEgdGFibGUgZGUgdG91cyBsZXMgUFJPR1JBTQorCQkJCS8vIGFzc29jacOpcyDDoCBjaGFjdW5lIGRlcyBJTlNUQU5DRS4uLgorCQkJCWNvbmZpZ3VyZUluc3RhbmNlQ292ZXJhZ2VUYWJsZUZsYWcoZmFsc2UpOworCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNhc2UgU3BlY2lmaWVyOjpERVNJR05fTU9ERUxfS0lORDoKKwkJCXsKKwkJCQkvLyBJTklUSUFMSVNBVElPTiBkZSBsYSB0YWJsZSBkZSB0b3VzIGxlcyBQUk9HUkFNCisJCQkJLy8gYXNzb2Npw6lzIMOgIGNoYWN1bmUgZGVzIEVYRUNVVEFCTEUuLi4KKwkJCQljb25maWd1cmVFeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZUZsYWcoZmFsc2UpOworCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWRlZmF1bHQ6IC8vIGZvciAgPDwgQHNjb3BlID0gJ0RFVEFJTFMnOyA+PgorCQkJeworCQkJCVdPYmplY3QgKiB0aGVERVRBSUxTID0gUXVlcnk6OmdldFJlZ2V4V1NlcXVlbmNlKAorCQkJCQkJZ2V0UGFyYW1ldGVyV09iamVjdCgpLCBPUl9XSUQyKCJkZXRhaWxzIiwgIkRFVEFJTFMiKSk7CisKKwkJCQlpZiggdGhlREVUQUlMUyAhPSBXT2JqZWN0OjpfTlVMTF8gKQorCQkJCXsKKwkJCQkJRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGUgPSBOVUxMOworCQkJCQlBdm1UcmFuc2l0aW9uICogYVRyYW5zaXRpb24gPSBOVUxMOworCisJCQkJCUxpc3RPZkV4ZWN1dGFibGVGb3JtIGxpc3RPZkV4ZWN1dGFibGU7CisJCQkJCUxpc3RPZkluc3RhbmNlT2ZNYWNoaW5lIGxpc3RPZkluc3RhbmNlOworCQkJCQlMaXN0T2ZBdm1UcmFuc2l0aW9uIGxpc3RPZlRyYW5zaXRpb247CisKKwkJCQkJV09iamVjdDo6Y29uc3RfaXRlcmF0b3IgaXRXZk8gPSB0aGVERVRBSUxTLT5vd25lZF9iZWdpbigpOworCQkJCQlXT2JqZWN0Ojpjb25zdF9pdGVyYXRvciBlbmRXZk8gPSB0aGVERVRBSUxTLT5vd25lZF9lbmQoKTsKKwkJCQkJZm9yKCA7IGl0V2ZPICE9IGVuZFdmTyA7ICsraXRXZk8gKQorCQkJCQl7CisJCQkJCQlpZiggKCppdFdmTyktPmlzV1Byb3BlcnR5KCkgKQorCQkJCQkJeworCQkJCQkJCWNvbnN0IHN0ZDo6c3RyaW5nICYga2luZCA9ICgqaXRXZk8pLT5nZXROYW1lSUQoKTsKKwkJCQkJCQljb25zdCBzdGQ6OnN0cmluZyAmIHFuaWQgPSAoKml0V2ZPKS0+dG9TdHJpbmdWYWx1ZSgpOworCisJCQkJCQkJaWYoIChraW5kID09ICJtb2RlbCIpIHx8IChraW5kID09ICJmb3JtIikgIHx8CisJCQkJCQkJCQkoa2luZCA9PSAiZXhlY3V0YWJsZSIpICkKKwkJCQkJCQl7CisJCQkJCQkJCWFuRXhlY3V0YWJsZSA9CisJCQkJCQkJCQlYUXVlcnkuZ2V0RXhlY3V0YWJsZUJ5UXVhbGlmaWVkTmFtZUlEKAorCQkJCQkJCQkJCQlxbmlkICkudG9fcHRyPCBFeGVjdXRhYmxlRm9ybSA+KCk7CisJCQkJCQkJCWlmKCBhbkV4ZWN1dGFibGUgIT0gTlVMTCApCisJCQkJCQkJCXsKKwkJCQkJCQkJCWxpc3RPZkV4ZWN1dGFibGUuYXBwZW5kKGFuRXhlY3V0YWJsZSk7CisJCQkJCQkJCX0KKwkJCQkJCQkJZWxzZQorCQkJCQkJCQl7CisJCQkJCQkJCQlBVk1fT1NfV0FSTiA8PCAiVW5mb3VuZCB0aGUgbWFjaGluZSAiCisJCQkJCQkJCQkJPDwga2luZCA8PCAiIDw8ICIgPDwgcW5pZAorCQkJCQkJCQkJCTw8ICIgPj4gYXMgY292ZXJhZ2UgcHJvY2Vzc29yIHBhcmFtZXRlcjo+ICIKKwkJCQkJCQkJCQk8PCBnZXRQYXJhbWV0ZXJXT2JqZWN0KCkKKwkJCQkJCQkJCQkJCS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJCQkJCQkJCTw8IHN0ZDo6ZW5kbDsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQllbHNlIGlmKCBraW5kID09ICJpbnN0YW5jZSIgKQorCQkJCQkJCXsKKwkJCQkJCQkJY29uc3QgQkYgJiBhbkluc3RhbmNlID0gWFF1ZXJ5LnNlYXJjaE1hY2hpbmUoCisJCQkJCQkJCQkJU3BlY2lmaWVyOjpERVNJR05fSU5TVEFOQ0VfS0lORCwgcW5pZCk7CisJCQkJCQkJCWlmKCBhbkluc3RhbmNlLnZhbGlkKCkgKQorCQkJCQkJCQl7CisJCQkJCQkJCQlsaXN0T2ZJbnN0YW5jZS5hcHBlbmQoCisJCQkJCQkJCQkJCWFuSW5zdGFuY2UudG9fcHRyPCBJbnN0YW5jZU9mTWFjaGluZSA+KCkpOworCQkJCQkJCQl9CisJCQkJCQkJCWVsc2UKKwkJCQkJCQkJeworCQkJCQkJCQkJQVZNX09TX1dBUk4gPDwgIlVuZm91bmQgdGhlIG1hY2hpbmUgIgorCQkJCQkJCQkJCTw8IGtpbmQgPDwgIiA8PCAiIDw8IHFuaWQKKwkJCQkJCQkJCQk8PCAiID4+IGFzIGNvdmVyYWdlIHByb2Nlc3NvciBwYXJhbWV0ZXI6PiAiCisJCQkJCQkJCQkJPDwgZ2V0UGFyYW1ldGVyV09iamVjdCgpCisJCQkJCQkJCQkJCQktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKwkJCQkJCQkJCQk8PCBzdGQ6OmVuZGw7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQkJZWxzZSBpZigga2luZCA9PSAidHJhbnNpdGlvbiIgKQorCQkJCQkJCXsKKwkJCQkJCQkJYVRyYW5zaXRpb24gPQorCQkJCQkJCQkJWFF1ZXJ5LmdldFRyYW5zaXRpb25CeVF1YWxpZmllZE5hbWVJRCgKKwkJCQkJCQkJCQkJcW5pZCApLnRvX3B0cjwgQXZtVHJhbnNpdGlvbiA+KCk7CisJCQkJCQkJCWlmKCBhVHJhbnNpdGlvbiAhPSBOVUxMICkKKwkJCQkJCQkJeworCQkJCQkJCQkJbGlzdE9mVHJhbnNpdGlvbi5hcHBlbmQoYVRyYW5zaXRpb24pOworCQkJCQkJCQl9CisJCQkJCQkJCWVsc2UKKwkJCQkJCQkJeworCQkJCQkJCQkJQVZNX09TX1dBUk4gIDw8ICJVbmZvdW5kIHRoZSAiCisJCQkJCQkJCQkJPDwga2luZCA8PCAiIDw8ICIgPDwgcW5pZAorCQkJCQkJCQkJCTw8ICIgPj4gYXMgY292ZXJhZ2UgcHJvY2Vzc29yIHBhcmFtZXRlcjo+ICIKKwkJCQkJCQkJCQk8PCBnZXRQYXJhbWV0ZXJXT2JqZWN0KCkKKwkJCQkJCQkJCQkJCS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJCQkJCQkJCTw8IHN0ZDo6ZW5kbDsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQllbHNlIGlmKCBraW5kID09ICJwcm9ncmFtIiApCisJCQkJCQkJeworCQkJCQkJCQlhVHJhbnNpdGlvbiA9CisJCQkJCQkJCQlYUXVlcnkuZ2V0VHJhbnNpdGlvbkJ5UXVhbGlmaWVkTmFtZUlEKAorCQkJCQkJCQkJCQlxbmlkICkudG9fcHRyPCBBdm1UcmFuc2l0aW9uID4oKTsKKwkJCQkJCQkJaWYoIGFUcmFuc2l0aW9uICE9IE5VTEwgKQorCQkJCQkJCQl7CisJCQkJCQkJCQlsaXN0T2ZUcmFuc2l0aW9uLmFwcGVuZChhVHJhbnNpdGlvbik7CisJCQkJCQkJCX0KKwkJCQkJCQkJZWxzZQorCQkJCQkJCQl7CisJCQkJCQkJCQlBVk1fT1NfV0FSTiAgPDwgIlVuZm91bmQgdGhlICIKKwkJCQkJCQkJCQk8PCBraW5kIDw8ICIgPDwgIiA8PCBxbmlkCisJCQkJCQkJCQkJPDwgIiA+PiBhcyBjb3ZlcmFnZSBwcm9jZXNzb3IgcGFyYW1ldGVyOj4gIgorCQkJCQkJCQkJCTw8IGdldFBhcmFtZXRlcldPYmplY3QoKQorCQkJCQkJCQkJCQkJLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQkJCQkJCQkJPDwgc3RkOjplbmRsOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCUFWTV9PU19XQVJOIDw8ICJVbmV4cGVjdGVkIGF0dHJpYnV0ZSA8PCAiCisJCQkJCQkJCQk8PCAoKml0V2ZPKS0+c3RyKCkKKwkJCQkJCQkJCTw8ICIgPj4gYXMgY292ZXJhZ2UgcHJvY2Vzc29yIHBhcmFtZXRlcjo+ICIKKwkJCQkJCQkJCTw8IGdldFBhcmFtZXRlcldPYmplY3QoKQorCQkJCQkJCQkJCQktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKwkJCQkJCQkJCTw8IHN0ZDo6ZW5kbDsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKworCisJCQkJCS8vIElOSVRJQUxJU0FUSU9OIGRlIGxhIHRhYmxlIGRlIHRvdXMgbGVzIFBST0dSQU0KKwkJCQkJLy8gYXNzb2Npw6lzIMOgIGNoYWN1biBkZXMgRVhFQ1VUQUJMRS4uLgorCQkJCQljb25maWd1cmVFeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZUZsYWcodHJ1ZSk7CisKKwkJCQkJTGlzdE9mRXhlY3V0YWJsZUZvcm06Oml0ZXJhdG9yIGl0RXhlYyA9IGxpc3RPZkV4ZWN1dGFibGUuYmVnaW4oKTsKKwkJCQkJTGlzdE9mRXhlY3V0YWJsZUZvcm06Oml0ZXJhdG9yIGVuZEV4ZWMgPSBsaXN0T2ZFeGVjdXRhYmxlLmVuZCgpOworCQkJCQlmb3IoIDsgaXRFeGVjICE9IGVuZEV4ZWMgOyArK2l0RXhlYyApCisJCQkJCXsKKwkJCQkJCWNvbmZpZ3VyZUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlRmxhZygoKml0RXhlYyksIGZhbHNlKTsKKwkJCQkJfQorCisKKwkJCQkJLy8gQ2FzIGRlcyBwcm9ncmFtbWVzCisJCQkJCWNvbmZpZ3VyZVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlRmxhZyhsaXN0T2ZUcmFuc2l0aW9uLCBmYWxzZSk7CisKKworCQkJCQkvLyBJTklUSUFMSVNBVElPTiBkZSBsYSB0YWJsZSBkZSB0b3VzIGxlcyBQUk9HUkFNCisJCQkJCS8vIGFzc29jacOpcyDDoCBjaGFjdW5lIGRlcyBJTlNUQU5DRS4uLgorCQkJCQlMaXN0T2ZJbnN0YW5jZU9mTWFjaGluZTo6aXRlcmF0b3IgaXRJbnN0ID0gbGlzdE9mSW5zdGFuY2UuYmVnaW4oKTsKKwkJCQkJTGlzdE9mSW5zdGFuY2VPZk1hY2hpbmU6Oml0ZXJhdG9yIGVuZEluc3QgPSBsaXN0T2ZJbnN0YW5jZS5lbmQoKTsKKwkJCQkJZm9yKCA7IGl0SW5zdCAhPSBlbmRJbnN0IDsgKytpdEluc3QgKQorCQkJCQl7CisJCQkJCQlpZiggKCppdEluc3QpLT5nZXRFeGVjdXRhYmxlKCktPmhhc1RyYW5zaXRpb24oKSApCisJCQkJCQl7CisJCQkJCQkJY29uZmlndXJlSW5zdGFuY2VDb3ZlcmFnZVRhYmxlRmxhZyhhbkVELAorCQkJCQkJCQkJYW5FRC5nZXRSdW50aW1lSUQoKml0SW5zdCksIGZhbHNlKTsKKwkJCQkJCX0KKwkJCQkJfQorCisKKwkJCQkJaWYoIG1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZSAhPSBOVUxMKQorCQkJCQl7CisJCQkJCQlpZiggbVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlICE9IE5VTEwpCisJCQkJCQl7CisJCQkJCQkJLy8gSU5JVElBTElTQVRJT04gZGUgbGEgdGFibGUgZGUgdG91cyBsZXMgUFJPR1JBTQorCQkJCQkJCS8vIGFzc29jacOpcyDDoCBjaGFjdW5lIGRlcyBJTlNUQU5DRS4uLgorCQkJCQkJCWNvbmZpZ3VyZUluc3RhbmNlQ292ZXJhZ2VUYWJsZUZsYWcoKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQltU2NvcGUgPSBTcGVjaWZpZXI6OkRFU0lHTl9NT0RFTF9LSU5EOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUFWTV9PU19XQVJOIDw8ICJVbmZvdW5kIHNlY3Rpb24gPDwgREVUQUlMUyA+PiAiCisJCQkJCQkJImFzIGNvdmVyYWdlIHByb2Nlc3NvciBwYXJhbWV0ZXI6PiAiCisJCQkJCQkJPDwgZ2V0UGFyYW1ldGVyV09iamVjdCgpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQkJCQkJPDwgc3RkOjplbmRsOworCQkJCX0KKworCQkJCWJyZWFrOworCQkJfQorCQl9CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBDT05GSUdVUklORyApCisJQVZNX09TX1RSQUNFIDw8ICJVbmNvdmVyZWQgVHJhbnNpdGlvbiBDb3VudCBhdCB0aGUgYmVnaW5uaW5nIDo+ICIKKwkJCTw8IG1Db3ZlcmFnZVN0YXRpc3RpY3MubU51bWJlck9mRWxlbWVudHMgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBDT05GSUdVUklORyApCisJfQorCisKKwlpZiggKG1IZXVyaXN0aWNQcm9wZXJ0eS5tQ292ZXJhZ2VIZWlnaHRQZXJpb2QgPT0gMCkgfHwKKwkJKG1IZXVyaXN0aWNQcm9wZXJ0eS5tQ292ZXJhZ2VIZWlnaHRQZXJpb2QgPT0gQVZNX05VTUVSSUNfTUFYX1NJWkVfVCkgKQorCXsKKwkJbUhldXJpc3RpY1Byb3BlcnR5Lm1Db3ZlcmFnZUhlaWdodCA9CisJCQkJbUhldXJpc3RpY1Byb3BlcnR5Lm1Db3ZlcmFnZUhlaWdodFBlcmlvZCA9IDc7CisvLwkJCQkJCW1Db3ZlcmFnZVN0YXRpc3RpY3MubU51bWJlck9mRWxlbWVudHM7CisJfQorCW1IZXVyaXN0aWNQcm9wZXJ0eS5tQ292ZXJhZ2VIZWlnaHRSZWFjaGVkQ291bnQgPSAwOworCW1IZXVyaXN0aWNQcm9wZXJ0eS5tQ292ZXJhZ2VIZWlnaHRSZWFjaGVkRmxhZyA9IGZhbHNlOworCisJaWYoIG1IZXVyaXN0aWNQcm9wZXJ0eS5tQ292ZXJhZ2VIZWlnaHRSZWFjaGVkTGltaXQgPT0gMCApCisJeworCQltSGV1cmlzdGljUHJvcGVydHkubUNvdmVyYWdlSGVpZ2h0UmVhY2hlZExpbWl0ID0KKwkJCQltQ292ZXJhZ2VTdGF0aXN0aWNzLm1OdW1iZXJPZkVsZW1lbnRzOworCX0KKworCisJcmV0dXJuIG1Db25maWdGbGFnOworfQorCisKK3ZvaWQgQXZtQ292ZXJhZ2VUcmFuc2l0aW9uVmlldzo6Y29uZmlndXJlRXhlY3V0YWJsZUNvdmVyYWdlVGFibGVGbGFnKGJvb2wgdmFsdWUpCit7CisJaWYoIG1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZSA9PSBOVUxMICkKKwl7CisJCW1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZSA9IG5ldyBBcnJheU9mQml0c2V0KG1Db3ZlcmFnZVByb2Nlc3Nvci4KKwkJCQlnZXRDb25maWd1cmF0aW9uKCkuZ2V0RXhlY3V0YWJsZVN5c3RlbSgpLnNpemUoKSwgTlVMTCk7CisJfQorCisJQml0c2V0ICogdGFibGVPZkZsYWcgPSBOVUxMOworCWF2bV9zaXplX3QgaXRUcmFuc2l0aW9uID0gMDsKKwlhdm1fc2l6ZV90IGVuZFRyYW5zaXRpb24gPSAwOworCisJVmVjdG9yT2ZFeGVjdXRhYmxlRm9ybTo6aXRlcmF0b3IgaXRFeGVjID0gbVRhYmxlb2ZSdW50aW1lRXhlY3V0YWJsZS5iZWdpbigpOworCVZlY3Rvck9mRXhlY3V0YWJsZUZvcm06Oml0ZXJhdG9yIGVuZEV4ZWMgPSBtVGFibGVvZlJ1bnRpbWVFeGVjdXRhYmxlLmVuZCgpOworCWZvciggOyBpdEV4ZWMgIT0gZW5kRXhlYyA7ICsraXRFeGVjICkKKwl7CisJCWlmKCAoKml0RXhlYyktPmhhc1RyYW5zaXRpb24oKSApCisJCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHX0FORCggTUVESVVNICwgQ09ORklHVVJJTkcgLCAoISB2YWx1ZSkgKQorCUFWTV9PU19UUkFDRSA8PCAiZXhlY3V0YWJsZSA6PiAiIDw8ICgqaXRFeGVjKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBR19BTkQoIE1FRElVTSAsIENPTkZJR1VSSU5HICkKKworCQkJdGFibGVPZkZsYWcgPSBtRXhlY3V0YWJsZUNvdmVyYWdlVGFibGUtPmF0KCAoKml0RXhlYyktPmdldE9mZnNldCgpICk7CisJCQlpZiggdGFibGVPZkZsYWcgPT0gTlVMTCApCisJCQl7CisJCQkJdGFibGVPZkZsYWcgPSBuZXcgQml0c2V0KCgqaXRFeGVjKS0+Z2V0VHJhbnNpdGlvbigpLnNpemUoKSwgdHJ1ZSk7CisKKwkJCQltRXhlY3V0YWJsZUNvdmVyYWdlVGFibGUtPnNldCgoKml0RXhlYyktPmdldE9mZnNldCgpLCB0YWJsZU9mRmxhZyk7CisJCQl9CisKKwkJCWVuZFRyYW5zaXRpb24gPSAoKml0RXhlYyktPmdldFRyYW5zaXRpb24oKS5zaXplKCk7CisJCQlmb3IoIGl0VHJhbnNpdGlvbiA9IDAgOyBpdFRyYW5zaXRpb24gPCBlbmRUcmFuc2l0aW9uIDsgKytpdFRyYW5zaXRpb24gKQorCQkJeworCQkJCWlmKCAoISB2YWx1ZSkgJiYgdGFibGVPZkZsYWctPnRlc3QoaXRUcmFuc2l0aW9uKSApCisJCQkJeworCQkJCQl0YWJsZU9mRmxhZy0+c2V0KGl0VHJhbnNpdGlvbiwgdmFsdWUpOworCisJCQkJCWlmKCBub3QgdmFsdWUgKQorCQkJCQl7CisJCQkJCQltQ292ZXJhZ2VTdGF0aXN0aWNzLmFkZFVuY292ZXJlZEVsZW1lbnQoKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIENPTkZJR1VSSU5HICkKKwlBVk1fT1NfVFJBQ0UgPDwgIlx0IiA8PCAicHJvZ3JhbSA6PiAiCisJCQk8PCAoKml0RXhlYyktPnJhd1RyYW5zaXRpb24oaXRUcmFuc2l0aW9uKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIENPTkZJR1VSSU5HICkKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUdfQU5EKCBNRURJVU0gLCBDT05GSUdVUklORyAsICghIHZhbHVlKSApCisJQVZNX09TX1RSQUNFIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHX0FORCggTUVESVVNICwgQ09ORklHVVJJTkcgKQorCQl9CisJCWVsc2UKKwkJeworCQkJbUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlLT5zZXQoKCppdEV4ZWMpLT5nZXRPZmZzZXQoKSwgTlVMTCk7CisJCX0KKwl9Cit9CisKKwordm9pZCBBdm1Db3ZlcmFnZVRyYW5zaXRpb25WaWV3Ojpjb25maWd1cmVFeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZUZsYWcoCisJCUV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlLCBib29sIHZhbHVlKQoreworCWlmKCBtRXhlY3V0YWJsZUNvdmVyYWdlVGFibGUgPT0gTlVMTCApCisJeworCQltRXhlY3V0YWJsZUNvdmVyYWdlVGFibGUgPSBuZXcgQXJyYXlPZkJpdHNldChtQ292ZXJhZ2VQcm9jZXNzb3IuCisJCQkJZ2V0Q29uZmlndXJhdGlvbigpLmdldEV4ZWN1dGFibGVTeXN0ZW0oKS5zaXplKCksIE5VTEwpOworCX0KKworCWlmKCBhbkV4ZWN1dGFibGUtPmhhc1RyYW5zaXRpb24oKSApCisJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUdfQU5EKCBNRURJVU0gLCBDT05GSUdVUklORyAsICghIHZhbHVlKSApCisJQVZNX09TX1RSQUNFIDw8ICJleGVjdXRhYmxlIDo+ICIgPDwgYW5FeGVjdXRhYmxlLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQk8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBR19BTkQoIE1FRElVTSAsIENPTkZJR1VSSU5HICkKKworCQlCaXRzZXQgKiB0YWJsZU9mRmxhZyA9CisJCQkJbUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlLT5hdCggYW5FeGVjdXRhYmxlLT5nZXRPZmZzZXQoKSApOworCQlpZiggdGFibGVPZkZsYWcgPT0gTlVMTCApCisJCXsKKwkJCXRhYmxlT2ZGbGFnID0gbmV3IEJpdHNldChhbkV4ZWN1dGFibGUtPmdldFRyYW5zaXRpb24oKS5zaXplKCksIHRydWUpOworCisJCQltRXhlY3V0YWJsZUNvdmVyYWdlVGFibGUtPnNldChhbkV4ZWN1dGFibGUtPmdldE9mZnNldCgpLCB0YWJsZU9mRmxhZyk7CisJCX0KKworCQlhdm1fc2l6ZV90IGVuZFRyYW5zaXRpb24gPSBhbkV4ZWN1dGFibGUtPmdldFRyYW5zaXRpb24oKS5zaXplKCk7CisJCWF2bV9zaXplX3QgaXRUcmFuc2l0aW9uID0gMDsKKwkJZm9yKCA7IGl0VHJhbnNpdGlvbiA8IGVuZFRyYW5zaXRpb24gOyArK2l0VHJhbnNpdGlvbiApCisJCXsKKwkJCWlmKCAoISB2YWx1ZSkgJiYgdGFibGVPZkZsYWctPnRlc3QoaXRUcmFuc2l0aW9uKSApCisJCQl7CisJCQkJdGFibGVPZkZsYWctPnNldChpdFRyYW5zaXRpb24sIHZhbHVlKTsKKworCQkJCW1Db3ZlcmFnZVN0YXRpc3RpY3MuYWRkVW5jb3ZlcmVkRWxlbWVudCgpOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgQ09ORklHVVJJTkcgKQorCUFWTV9PU19UUkFDRSA8PCAiXHQiIDw8ICJwcm9ncmFtIDo+ICIKKwkJCTw8IGFuRXhlY3V0YWJsZS0+cmF3VHJhbnNpdGlvbihpdFRyYW5zaXRpb24pLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQk8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgQ09ORklHVVJJTkcgKQorCQkJfQorCQl9CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHX0FORCggTUVESVVNICwgQ09ORklHVVJJTkcgLCAoISB2YWx1ZSkgKQorCQlBVk1fT1NfVFJBQ0UgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUdfQU5EKCBNRURJVU0gLCBDT05GSUdVUklORyApCisJfQorCisJLy8gQ2FzIGRlcyBzb3VzIG1hY2hpbmUgZXhlY3V0YWJsZQorCWlmKCBhbkV4ZWN1dGFibGUtPmhhc0luc3RhbmNlU3RhdGljKCkgKQorCXsKKwkJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBhbkV4ZWN1dGFibGUtPmluc3RhbmNlX3N0YXRpY19iZWdpbigpOworCQlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IGFuRXhlY3V0YWJsZS0+aW5zdGFuY2Vfc3RhdGljX2VuZCgpOworCQlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJeworCQkJY29uZmlndXJlRXhlY3V0YWJsZUNvdmVyYWdlVGFibGVGbGFnKCgqaXQpLmdldEV4ZWN1dGFibGUoKSwgdmFsdWUpOworCQl9CisJfQorfQorCisKK3ZvaWQgQXZtQ292ZXJhZ2VUcmFuc2l0aW9uVmlldzo6Y29uZmlndXJlSW5zdGFuY2VDb3ZlcmFnZVRhYmxlRmxhZygpCit7CisJaWYoIG1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZSAhPSBOVUxMKQorCXsKKwkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQgPQorCQkJCW1Db3ZlcmFnZVByb2Nlc3Nvci5nZXRDb25maWd1cmF0aW9uKCkuZ2V0TWFpbkV4ZWN1dGlvbkRhdGEoKTsKKworCQlSdW50aW1lSUQgYVJJRDsKKworCQlpZiggbVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlID09IE5VTEwgKQorCQl7CisJCQltVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUgPQorCQkJCQluZXcgQXJyYXlPZkJpdHNldChhbkVELmdldFRhYmxlT2ZSdW50aW1lKCkuc2l6ZSgpLCBOVUxMKTsKKwkJfQorCisJCWF2bV9zaXplX3QgZW5kTWFjaGluZSA9IG1UcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZS0+c2l6ZSgpOworCQlmb3IoIGF2bV9zaXplX3QgaXRNYWNoaW5lID0gMCA7IGl0TWFjaGluZSA8IGVuZE1hY2hpbmUgOyArK2l0TWFjaGluZSApCisJCXsKKwkJCWFSSUQgPSBhbkVELmdldFJ1bnRpbWVJRChpdE1hY2hpbmUpOworCQkJaWYoIGFSSUQuZ2V0RXhlY3V0YWJsZSgpLT5oYXNUcmFuc2l0aW9uKCkgJiYKKwkJCQkJKG1UcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZS0+YXQoaXRNYWNoaW5lKSA9PSBOVUxMKSApCisJCQl7CisJCQkJbVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlLT5zZXQoaXRNYWNoaW5lLAorCQkJCQkJbUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlLT5hdCgKKwkJCQkJCQkJYVJJRC5nZXRFeGVjdXRhYmxlKCktPmdldE9mZnNldCgpKSk7CisJCQl9CisJCX0KKwl9Cit9CisKKworCit2b2lkIEF2bUNvdmVyYWdlVHJhbnNpdGlvblZpZXc6OmNvbmZpZ3VyZUluc3RhbmNlQ292ZXJhZ2VUYWJsZUZsYWcoYm9vbCB2YWx1ZSkKK3sKKwljb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCA9CisJCQltQ292ZXJhZ2VQcm9jZXNzb3IuZ2V0Q29uZmlndXJhdGlvbigpLmdldE1haW5FeGVjdXRpb25EYXRhKCk7CisJUnVudGltZUlEIGFSSUQ7CisJQml0c2V0ICogdGFibGVPZkZsYWcgPSBOVUxMOworCisJYXZtX3NpemVfdCBpdFRyYW5zaXRpb24gPSAwOworCWF2bV9zaXplX3QgZW5kVHJhbnNpdGlvbiA9IDA7CisKKwlpZiggbVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlID09IE5VTEwgKQorCXsKKwkJbVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlID0KKwkJCQluZXcgQXJyYXlPZkJpdHNldChhbkVELmdldFRhYmxlT2ZSdW50aW1lKCkuc2l6ZSgpLCBOVUxMKTsKKwl9CisKKwlhdm1fc2l6ZV90IGVuZE1hY2hpbmUgPSBtVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUtPnNpemUoKTsKKwlmb3IoIGF2bV9zaXplX3QgaXRNYWNoaW5lID0gMCA7IGl0TWFjaGluZSA8IGVuZE1hY2hpbmUgOyArK2l0TWFjaGluZSApCisJeworCQlhUklEID0gYW5FRC5nZXRSdW50aW1lSUQoaXRNYWNoaW5lKTsKKwkJaWYoIGFSSUQuZ2V0RXhlY3V0YWJsZSgpLT5oYXNUcmFuc2l0aW9uKCkgKQorCQl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBR19BTkQoIE1FRElVTSAsIENPTkZJR1VSSU5HICwgKG5vdCB2YWx1ZSkgKQorCUFWTV9PU19UUkFDRSA8PCAibWFjaGluZSA6PiAiIDw8IGFSSUQuZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBR19BTkQoIE1FRElVTSAsIENPTkZJR1VSSU5HICkKKworCQkJdGFibGVPZkZsYWcgPSBtVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUtPmF0KCBpdE1hY2hpbmUgKTsKKwkJCWlmKCB0YWJsZU9mRmxhZyA9PSBOVUxMICkKKwkJCXsKKwkJCQl0YWJsZU9mRmxhZyA9IG5ldyBCaXRzZXQoCisJCQkJCQlhUklELmdldEV4ZWN1dGFibGUoKS0+Z2V0VHJhbnNpdGlvbigpLnNpemUoKSwgdHJ1ZSk7CisKKwkJCQltVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUtPnNldChpdE1hY2hpbmUsIHRhYmxlT2ZGbGFnKTsKKwkJCX0KKworCQkJZW5kVHJhbnNpdGlvbiA9IGFSSUQuZ2V0RXhlY3V0YWJsZSgpLT5nZXRUcmFuc2l0aW9uKCkuc2l6ZSgpOworCQkJZm9yKCBpdFRyYW5zaXRpb24gPSAwIDsgaXRUcmFuc2l0aW9uIDwgZW5kVHJhbnNpdGlvbiA7ICsraXRUcmFuc2l0aW9uICkKKwkJCXsKKwkJCQlpZiggKG5vdCB2YWx1ZSkgJiYgdGFibGVPZkZsYWctPnRlc3QoaXRUcmFuc2l0aW9uKSApCisJCQkJeworCQkJCQl0YWJsZU9mRmxhZy0+c2V0KGl0VHJhbnNpdGlvbiwgdmFsdWUpOworCisJCQkJCWlmKCBub3QgdmFsdWUgKQorCQkJCQl7CisJCQkJCQltQ292ZXJhZ2VTdGF0aXN0aWNzLmFkZFVuY292ZXJlZEVsZW1lbnQoKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIENPTkZJR1VSSU5HICkKKwlBVk1fT1NfVFJBQ0UgPDwgIlx0IiA8PCAicHJvZ3JhbSA6PiAiCisJCQk8PCBhUklELmdldEV4ZWN1dGFibGUoKS0+cmF3VHJhbnNpdGlvbihpdFRyYW5zaXRpb24pLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQk8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgQ09ORklHVVJJTkcgKQorCQkJCQl9CisJCQkJfQorCQkJfQorCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBR19BTkQoIE1FRElVTSAsIENPTkZJR1VSSU5HICwgKCEgdmFsdWUpICkKKwlBVk1fT1NfVFJBQ0UgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUdfQU5EKCBNRURJVU0gLCBDT05GSUdVUklORyApCisJCX0KKwkJZWxzZQorCQl7CisJCQltVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUtPnNldChpdE1hY2hpbmUsIE5VTEwpOworCQl9CisJfQorfQorCisKK3ZvaWQgQXZtQ292ZXJhZ2VUcmFuc2l0aW9uVmlldzo6Y29uZmlndXJlSW5zdGFuY2VDb3ZlcmFnZVRhYmxlRmxhZygKKwkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsIGJvb2wgdmFsdWUpCit7CisJaWYoIG1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZSA9PSBOVUxMICkKKwl7CisJCWNvbmZpZ3VyZUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlRmxhZyggdHJ1ZSApOworCX0KKworCWlmKCBtVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUgPT0gTlVMTCApCisJeworCQltVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUgPQorCQkJCW5ldyBBcnJheU9mQml0c2V0KGFuRUQuZ2V0VGFibGVPZlJ1bnRpbWUoKS5zaXplKCksIE5VTEwpOworCX0KKworCUV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlID0gYVJJRC5nZXRFeGVjdXRhYmxlKCk7CisKKwlpZiggKGFuRXhlY3V0YWJsZSAhPSBOVUxMKSAmJgorCQkJKG1UcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZS0+YXQoYVJJRC5nZXRPZmZzZXQoKSkgPT0gTlVMTCkgKQorCXsKKwkJaWYoIGFuRXhlY3V0YWJsZS0+aGFzVHJhbnNpdGlvbigpICYmCisJCQltRXhlY3V0YWJsZUNvdmVyYWdlVGFibGUtPmF0KGFuRXhlY3V0YWJsZS0+Z2V0T2Zmc2V0KCkpID09IE5VTEwgKQorCQl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBR19BTkQoIE1FRElVTSAsIENPTkZJR1VSSU5HICwgKCEgdmFsdWUpICkKKwlBVk1fT1NfVFJBQ0UgPDwgIm1hY2hpbmUgOj4gIiA8PCBhUklELmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUdfQU5EKCBNRURJVU0gLCBDT05GSUdVUklORyApCisKKwkJCUJpdHNldCAqIHRhYmxlT2ZGbGFnID0KKwkJCQkJbVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlLT5hdCggYVJJRC5nZXRPZmZzZXQoKSApOworCQkJaWYoIHRhYmxlT2ZGbGFnID09IE5VTEwgKQorCQkJeworCQkJCXRhYmxlT2ZGbGFnID0gbmV3IEJpdHNldCgKKwkJCQkJCWFuRXhlY3V0YWJsZS0+Z2V0VHJhbnNpdGlvbigpLnNpemUoKSwgdHJ1ZSk7CisKKwkJCQltVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUtPnNldChhUklELmdldE9mZnNldCgpLCB0YWJsZU9mRmxhZyk7CisJCQl9CisKKwkJCWF2bV9zaXplX3QgZW5kVHJhbnNpdGlvbiA9IGFuRXhlY3V0YWJsZS0+Z2V0VHJhbnNpdGlvbigpLnNpemUoKTsKKwkJCWF2bV9zaXplX3QgaXRUcmFuc2l0aW9uID0gMDsKKwkJCWZvciggOyBpdFRyYW5zaXRpb24gPCBlbmRUcmFuc2l0aW9uIDsgKytpdFRyYW5zaXRpb24gKQorCQkJeworCQkJCWlmKCAoISB2YWx1ZSkgJiYgdGFibGVPZkZsYWctPnRlc3QoaXRUcmFuc2l0aW9uKSApCisJCQkJeworCQkJCQl0YWJsZU9mRmxhZy0+c2V0KGl0VHJhbnNpdGlvbiwgdmFsdWUpOworCisJCQkJCW1Db3ZlcmFnZVN0YXRpc3RpY3MuYWRkVW5jb3ZlcmVkRWxlbWVudCgpOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgQ09ORklHVVJJTkcgKQorCUFWTV9PU19UUkFDRSA8PCAiXHQiIDw8ICJwcm9ncmFtIDo+ICIKKwkJCTw8IGFuRXhlY3V0YWJsZS0+cmF3VHJhbnNpdGlvbihpdFRyYW5zaXRpb24pLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQk8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgQ09ORklHVVJJTkcgKQorCQkJCX0KKwkJCX0KKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUdfQU5EKCBNRURJVU0gLCBDT05GSUdVUklORyAsICghIHZhbHVlKSApCisJQVZNX09TX1RSQUNFIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHX0FORCggTUVESVVNICwgQ09ORklHVVJJTkcgKQorCQl9CisJCWVsc2UgaWYoIGFuRXhlY3V0YWJsZS0+aGFzVHJhbnNpdGlvbigpICkKKwkJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUdfQU5EKCBNRURJVU0gLCBDT05GSUdVUklORyAsICghIHZhbHVlKSApCisJQVZNX09TX1RSQUNFIDw8ICJtYWNoaW5lIDo+ICIgPDwgYVJJRC5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHX0FORCggTUVESVVNICwgQ09ORklHVVJJTkcgKQorCisJCQlCaXRzZXQgKiB0YWJsZU9mRmxhZyA9CisJCQkJCW1UcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZS0+YXQoIGFSSUQuZ2V0T2Zmc2V0KCkgKTsKKwkJCWlmKCB0YWJsZU9mRmxhZyA9PSBOVUxMICkKKwkJCXsKKwkJCQl0YWJsZU9mRmxhZyA9IG5ldyBCaXRzZXQoCisJCQkJCQlhbkV4ZWN1dGFibGUtPmdldFRyYW5zaXRpb24oKS5zaXplKCksIHRydWUpOworCisJCQkJbVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlLT5zZXQoYVJJRC5nZXRPZmZzZXQoKSwgdGFibGVPZkZsYWcpOworCQkJfQorCisJCQlhdm1fc2l6ZV90IGVuZFRyYW5zaXRpb24gPSBhbkV4ZWN1dGFibGUtPmdldFRyYW5zaXRpb24oKS5zaXplKCk7CisJCQlhdm1fc2l6ZV90IGl0VHJhbnNpdGlvbiA9IDA7CisJCQlmb3IoIDsgaXRUcmFuc2l0aW9uIDwgZW5kVHJhbnNpdGlvbiA7ICsraXRUcmFuc2l0aW9uICkKKwkJCXsKKwkJCQl0YWJsZU9mRmxhZy0+c2V0KGl0VHJhbnNpdGlvbiwKKwkJCQkJCXZhbHVlICYmIG1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZS0+YXQoCisJCQkJCQkJCWFuRXhlY3V0YWJsZS0+Z2V0T2Zmc2V0KCkpLT50ZXN0KGl0VHJhbnNpdGlvbikgKTsKKworCQkJCWlmKCAoISB2YWx1ZSkgJiYgbUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlLT5hdCgKKwkJCQkJCWFuRXhlY3V0YWJsZS0+Z2V0T2Zmc2V0KCkpLT50ZXN0KGl0VHJhbnNpdGlvbikgKQorCQkJCXsKKwkJCQkJbUNvdmVyYWdlU3RhdGlzdGljcy5hZGRVbmNvdmVyZWRFbGVtZW50KCk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBDT05GSUdVUklORyApCisJQVZNX09TX1RSQUNFIDw8ICJcdCIgPDwgInByb2dyYW0gOj4gIgorCQkJPDwgYW5FeGVjdXRhYmxlLT5yYXdUcmFuc2l0aW9uKGl0VHJhbnNpdGlvbiktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKwkJCTw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBDT05GSUdVUklORyApCisJCQkJfQorCQkJfQorCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBR19BTkQoIE1FRElVTSAsIENPTkZJR1VSSU5HICwgKCEgdmFsdWUpICkKKwlBVk1fT1NfVFJBQ0UgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUdfQU5EKCBNRURJVU0gLCBDT05GSUdVUklORyApCisJCX0KKworCQkvLyBDYXMgZGVzIHNvdXMgbWFjaGluZSBpbnN0YW5jZQorCQlpZiggYW5FRC5nZXRSdW50aW1lKGFSSUQpLmhhc0NoaWxkKCkgKQorCQl7CisJCQlUYWJsZU9mUnVudGltZUlEOjpjb25zdF9pdGVyYXRvciBpdFN1Yk1hY2hpbmUgPQorCQkJCQlhbkVELmdldFJ1bnRpbWUoYVJJRCkuYmVnaW5DaGlsZCgpOworCQkJVGFibGVPZlJ1bnRpbWVJRDo6Y29uc3RfaXRlcmF0b3IgZW5kU3ViTWFjaGluZSA9CisJCQkJCWFuRUQuZ2V0UnVudGltZShhUklEKS5lbmRDaGlsZCgpOworCQkJZm9yKCA7IGl0U3ViTWFjaGluZSAhPSBlbmRTdWJNYWNoaW5lIDsgKytpdFN1Yk1hY2hpbmUgKQorCQkJeworCQkJCWNvbmZpZ3VyZUluc3RhbmNlQ292ZXJhZ2VUYWJsZUZsYWcoYW5FRCwgKCppdFN1Yk1hY2hpbmUpLCB2YWx1ZSk7CisJCQl9CisJCX0KKwl9Cit9CisKKwordm9pZCBBdm1Db3ZlcmFnZVRyYW5zaXRpb25WaWV3Ojpjb25maWd1cmVUcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZUZsYWcoCisJCUxpc3RPZkF2bVRyYW5zaXRpb24gJiBsaXN0T2ZUcmFuc2l0aW9uLCBib29sIHZhbHVlKQoreworCWlmKCBtRXhlY3V0YWJsZUNvdmVyYWdlVGFibGUgPT0gTlVMTCApCisJeworCQltRXhlY3V0YWJsZUNvdmVyYWdlVGFibGUgPSBuZXcgQXJyYXlPZkJpdHNldChtQ292ZXJhZ2VQcm9jZXNzb3IuCisJCQkJZ2V0Q29uZmlndXJhdGlvbigpLmdldEV4ZWN1dGFibGVTeXN0ZW0oKS5zaXplKCksIE5VTEwpOworCX0KKworCUJpdHNldCAqIHRhYmxlT2ZGbGFnID0gTlVMTDsKKwlhdm1fb2Zmc2V0X3QgY29udGFpbmVyRXhlY09mZnNldCA9IDA7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHX0FORCggTUVESVVNICwgQ09ORklHVVJJTkcgLAorCQkoISB2YWx1ZSkgJiYgbGlzdE9mVHJhbnNpdGlvbi5ub25lbXB0eSgpICkKKwlBVk1fT1NfVFJBQ0UgPDwgInByb2dyYW0gOj4gdXNlciBkZXRhaWxzIiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBR19BTkQoIE1FRElVTSAsIENPTkZJR1VSSU5HICkKKworCUxpc3RPZkF2bVRyYW5zaXRpb246Oml0ZXJhdG9yIGl0UHJvZyA9IGxpc3RPZlRyYW5zaXRpb24uYmVnaW4oKTsKKwlMaXN0T2ZBdm1UcmFuc2l0aW9uOjppdGVyYXRvciBlbmRQcm9nID0gbGlzdE9mVHJhbnNpdGlvbi5lbmQoKTsKKwlmb3IoIDsgaXRQcm9nICE9IGVuZFByb2cgOyArK2l0UHJvZyApCisJeworCQljb250YWluZXJFeGVjT2Zmc2V0ID0gKCppdFByb2cpLT5nZXRFeGVjdXRhYmxlQ29udGFpbmVyKCktPmdldE9mZnNldCgpOworCisJCXRhYmxlT2ZGbGFnID0gbUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlLT5hdChjb250YWluZXJFeGVjT2Zmc2V0KTsKKwkJaWYoIHRhYmxlT2ZGbGFnID09IE5VTEwgKQorCQl7CisJCQl0YWJsZU9mRmxhZyA9IG5ldyBCaXRzZXQoCisJCQkJCSgqaXRQcm9nKS0+Z2V0RXhlY3V0YWJsZUNvbnRhaW5lcigpLT5nZXRUcmFuc2l0aW9uKCkuc2l6ZSgpLCB0cnVlKTsKKworCQkJbUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlLT5zZXQoY29udGFpbmVyRXhlY09mZnNldCwgdGFibGVPZkZsYWcpOworCQl9CisJCWlmKCAoISB2YWx1ZSkgJiYgdGFibGVPZkZsYWctPnRlc3QoICgqaXRQcm9nKS0+Z2V0T2Zmc2V0KCkgKSApCisJCXsKKwkJCW1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZS0+YXQoIGNvbnRhaW5lckV4ZWNPZmZzZXQgKS0+c2V0KAorCQkJCQkoKml0UHJvZyktPmdldE9mZnNldCgpLCB2YWx1ZSk7CisKKwkJCW1Db3ZlcmFnZVN0YXRpc3RpY3MuYWRkVW5jb3ZlcmVkRWxlbWVudCgpOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgQ09ORklHVVJJTkcgKQorCUFWTV9PU19UUkFDRSA8PCAiXHQiIDw8ICJwcm9ncmFtIDo+ICIgPDwgKCppdFByb2cpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBDT05GSUdVUklORyApCisJCX0KKwl9CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHX0FORCggTUVESVVNICwgQ09ORklHVVJJTkcgLAorCQkoISB2YWx1ZSkgJiYgbGlzdE9mVHJhbnNpdGlvbi5ub25lbXB0eSgpICkKKwlBVk1fT1NfVFJBQ0UgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUdfQU5EKCBNRURJVU0gLCBDT05GSUdVUklORyApCit9CisKKworQml0c2V0ICogQXZtQ292ZXJhZ2VUcmFuc2l0aW9uVmlldzo6Z2V0Q292ZXJhZ2VUYWJsZUJpdHNldCgKKwkJY29uc3QgUnVudGltZUlEICYgYVJJRCkKK3sKKwlzd2l0Y2goIG1TY29wZSApCisJeworCQljYXNlIFNwZWNpZmllcjo6REVTSUdOX01PREVMX0tJTkQ6CisJCXsKKwkJCXJldHVybiggbUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlLT5hdCgKKwkJCQkJYVJJRC5nZXRFeGVjdXRhYmxlKCktPmdldE9mZnNldCgpICkgKTsKKwkJfQorCQljYXNlIFNwZWNpZmllcjo6REVTSUdOX0lOU1RBTkNFX0tJTkQ6CisJCWRlZmF1bHQ6CisJCXsKKwkJCXJldHVybiggbVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlLT5hdCggYVJJRC5nZXRPZmZzZXQoKSApICk7CisJCX0KKwl9Cit9CisKKworLyoKKyAqIFJFUE9SVAorICovCit2b2lkIEF2bUNvdmVyYWdlVHJhbnNpdGlvblZpZXc6OnJlcG9ydE1pbmltdW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJaWYoIG1Db3ZlcmFnZVN0YXRpc3RpY3MuZ29hbEFjaGlldmVkKCkgKQorCXsKKwkJb3MgPDwgVEFCMiA8PCAiQWxsIHRoZSA8PCAiIDw8IG1Db3ZlcmFnZVN0YXRpc3RpY3MubU51bWJlck9mRWxlbWVudHMKKwkJCQk8PCAiID4+IHRyYW5zaXRpb25zIGFyZSBjb3ZlcmVkICEiIDw8IEVPTDsKKwl9CisJZWxzZQorCXsKKwkJb3MgPDwgVEFCMiA8PCAiV2FybmluZzogYWxsIHRoZSB0cmFuc2l0aW9ucyBhcmUgbm90IGNvdmVyZWQgISIgPDwgRU9MOworCQltQ292ZXJhZ2VTdGF0aXN0aWNzLnRvU3RyZWFtQ292ZXJhZ2VSYXRlKCBvcyA8PCBUQUIyLAorCQkJCSJSZXN1bHRzOiA8PCAiLCAiIG9uICIsIiA+PiBhcmUgY292ZXJlZCAhXG4iICk7CisKKwkJaWYoIGlzUmVwb3J0RGV0YWlscygpICkKKwkJeworCQkJb3MgPDwgVEFCMiA8PCAiTGlzdCBvZiB0aGUgPDwgIgorCQkJCQk8PCBtQ292ZXJhZ2VTdGF0aXN0aWNzLmdldE51bWJlck9mVW5jb3ZlcmVkKCkKKwkJCQkJPDwgIiA+PiB0cmFuc2l0aW9ucyBub24gY292ZXJlZDoiIDw8IEVPTDI7CisKKwkJCWNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVEID0KKwkJCQltQ292ZXJhZ2VQcm9jZXNzb3IuZ2V0Q29uZmlndXJhdGlvbigpLmdldE1haW5FeGVjdXRpb25EYXRhKCk7CisKKwkJCVJ1bnRpbWVJRCBhUklEOworCisJCQlTdHJpbmdPdXRTdHJlYW0gb3NzKCBvcy5JTkRFTlQgKTsKKwkJCWJvb2wgaGFzT25lVW5jb3ZlcmRUcmFuc2l0aW9uID0gZmFsc2U7CisKKwkJCWF2bV9zaXplX3Qgb2Zmc2V0OworCQkJYXZtX3NpemVfdCBlbmRPZmZzZXQ7CisJCQlBdm1UcmFuc2l0aW9uICogaXRUcmFuc2l0aW9uOworCisJCQlzd2l0Y2goIG1TY29wZSApCisJCQl7CisJCQkJY2FzZSBTcGVjaWZpZXI6OkRFU0lHTl9JTlNUQU5DRV9LSU5EOgorCQkJCXsKKwkJCQkJaWYoIG1UcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZSA9PSBOVUxMICkKKwkJCQkJeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQlhdm1fc2l6ZV90IGVuZE1hY2hpbmUgPSBtVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUtPnNpemUoKTsKKwkJCQkJYXZtX3NpemVfdCBpdE1hY2hpbmUgPSAwOworCQkJCQlmb3IoIDsgaXRNYWNoaW5lIDwgZW5kTWFjaGluZSA7ICsraXRNYWNoaW5lICkKKwkJCQkJeworCQkJCQkJYVJJRCA9IGFuRUQuZ2V0UnVudGltZUlEKGl0TWFjaGluZSk7CisJCQkJCQlpZiggYVJJRC5nZXRFeGVjdXRhYmxlKCktPmhhc1RyYW5zaXRpb24oKSApCisJCQkJCQl7CisJCQkJCQkJb3NzLnN0cigiIik7CisKKy8vCQkJCQkJCW9zcyA8PCBUQUIyIDw8ICJpbnN0YW5jZSA6PiAiIDw8IGFSSUQuZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCBFT0w7CisJCQkJCQkJaWYoIG5vdCBhUklELmdldEV4ZWN1dGFibGUoKS0+aXNSZWFjaGFibGVTdGF0ZSgpICkKKwkJCQkJCQl7CisJCQkJCQkJCW9zcyA8PCBUQUIyIDw8ICJpbnN0YW5jZVsgTk8gSU5DT01JTkcgVFJBTlNJVElPTiBdIDo+ICIKKwkJCQkJCQkJCQk8PCBhUklELmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgRU9MOworCQkJCQkJCX0KKworCQkJCQkJCWhhc09uZVVuY292ZXJkVHJhbnNpdGlvbiA9IGZhbHNlOworCisJCQkJCQkJZW5kT2Zmc2V0ID0gYVJJRC5nZXRFeGVjdXRhYmxlKCktPmdldFRyYW5zaXRpb24oKS5zaXplKCk7CisJCQkJCQkJZm9yKCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgZW5kT2Zmc2V0IDsgKytvZmZzZXQgKQorCQkJCQkJCXsKKwkJCQkJCQkJaXRUcmFuc2l0aW9uID0gYVJJRC5nZXRFeGVjdXRhYmxlKCktPgorCQkJCQkJCQkJCWdldFRyYW5zaXRpb24oKS5yYXdBdChvZmZzZXQpOworCisJCQkJCQkJCWlmKCBub3QgbVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlLT4KKwkJCQkJCQkJCQlhdCggYVJJRC5nZXRPZmZzZXQoKSApLT50ZXN0KCBvZmZzZXQgKSApCisJCQkJCQkJCXsKKwkJCQkJCQkJCWhhc09uZVVuY292ZXJkVHJhbnNpdGlvbiA9IHRydWU7CisJCQkJCQkJCQlvc3MgPDwgVEFCMyA8PCBpdFRyYW5zaXRpb24tPgorCQkJCQkJCQkJCQlzdHJUcmFuc2l0aW9uSGVhZGVyKCkgPDwgRU9MOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCWlmKCBoYXNPbmVVbmNvdmVyZFRyYW5zaXRpb24gKQorCQkJCQkJCXsKKwkJCQkJCQkJb3MgPDwgb3NzLnN0cigpIDw8IEVPTDsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQljYXNlIFNwZWNpZmllcjo6REVTSUdOX01PREVMX0tJTkQ6CisJCQkJeworCQkJCQlpZiggbUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlID09IE5VTEwgKQorCQkJCQl7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCVZlY3Rvck9mRXhlY3V0YWJsZUZvcm06OmNvbnN0X2l0ZXJhdG9yIGl0RXhlYyA9CisJCQkJCQkJbVRhYmxlb2ZSdW50aW1lRXhlY3V0YWJsZS5iZWdpbigpOworCQkJCQlWZWN0b3JPZkV4ZWN1dGFibGVGb3JtOjpjb25zdF9pdGVyYXRvciBlbmRFeGVjID0KKwkJCQkJCQltVGFibGVvZlJ1bnRpbWVFeGVjdXRhYmxlLmVuZCgpOworCQkJCQlmb3IoIGF2bV9zaXplX3QgaW5kZXhFeGVjID0gMCA7IGl0RXhlYyAhPSBlbmRFeGVjIDsKKwkJCQkJCQkrK2l0RXhlYyAsICsraW5kZXhFeGVjICkKKwkJCQkJeworCQkJCQkJaWYoICgqaXRFeGVjKS0+aGFzVHJhbnNpdGlvbigpICkKKwkJCQkJCXsKKwkJCQkJCQlvc3Muc3RyKCIiKTsKKworLy8JCQkJCQkJb3NzIDw8IFRBQjIgPDwgIm1vZGVsIDo+ICIgPDwgKCppdEV4ZWMpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IEVPTDsKKwkJCQkJCQlpZiggbm90ICgqaXRFeGVjKS0+aXNSZWFjaGFibGVTdGF0ZSgpICkKKwkJCQkJCQl7CisJCQkJCQkJCW9zcyA8PCBUQUIyIDw8ICJtb2RlbFsgTk8gSU5DT01JTkcgVFJBTlNJVElPTiBdIDo+ICIKKwkJCQkJCQkJCQk8PCAoKml0RXhlYyktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgRU9MOworCQkJCQkJCX0KKworCQkJCQkJCWhhc09uZVVuY292ZXJkVHJhbnNpdGlvbiA9IGZhbHNlOworCisJCQkJCQkJZW5kT2Zmc2V0ID0gKCppdEV4ZWMpLT5nZXRUcmFuc2l0aW9uKCkuc2l6ZSgpOworCQkJCQkJCWZvciggb2Zmc2V0ID0gMCA7IG9mZnNldCA8IGVuZE9mZnNldCA7ICsrb2Zmc2V0ICkKKwkJCQkJCQl7CisJCQkJCQkJCWl0VHJhbnNpdGlvbiA9ICgqaXRFeGVjKS0+Z2V0VHJhbnNpdGlvbigpLnJhd0F0KG9mZnNldCk7CisKKwkJCQkJCQkJaWYoIG5vdCBtRXhlY3V0YWJsZUNvdmVyYWdlVGFibGUtPgorCQkJCQkJCQkJCWF0KCgqaXRFeGVjKS0+Z2V0T2Zmc2V0KCkpLT50ZXN0KCBvZmZzZXQgKSApCisJCQkJCQkJCXsKKwkJCQkJCQkJCWhhc09uZVVuY292ZXJkVHJhbnNpdGlvbiA9IHRydWU7CisJCQkJCQkJCQlvc3MgPDwgVEFCMyA8PCBpdFRyYW5zaXRpb24tPgorCQkJCQkJCQkJCQlzdHJUcmFuc2l0aW9uSGVhZGVyKCkgPDwgRU9MOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCWlmKCBoYXNPbmVVbmNvdmVyZFRyYW5zaXRpb24gKQorCQkJCQkJCXsKKwkJCQkJCQkJb3MgPDwgb3NzLnN0cigpIDw8IEVPTDsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJaWYoIG1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZSAhPSBOVUxMICkKKwkJCQkJeworCQkJCQkJVmVjdG9yT2ZFeGVjdXRhYmxlRm9ybTo6Y29uc3RfaXRlcmF0b3IgaXRFeGVjID0KKwkJCQkJCQkJbVRhYmxlb2ZSdW50aW1lRXhlY3V0YWJsZS5iZWdpbigpOworCQkJCQkJVmVjdG9yT2ZFeGVjdXRhYmxlRm9ybTo6Y29uc3RfaXRlcmF0b3IgZW5kRXhlYyA9CisJCQkJCQkJCW1UYWJsZW9mUnVudGltZUV4ZWN1dGFibGUuZW5kKCk7CisJCQkJCQlmb3IoIGF2bV9zaXplX3QgaW5kZXhFeGVjID0gMCA7IGl0RXhlYyAhPSBlbmRFeGVjIDsKKwkJCQkJCQkJKytpdEV4ZWMgLCArK2luZGV4RXhlYyApCisJCQkJCQl7CisJCQkJCQkJaWYoICgqaXRFeGVjKS0+aGFzVHJhbnNpdGlvbigpICkKKwkJCQkJCQl7CisJCQkJCQkJCW9zcy5zdHIoIiIpOworCisvLwkJCQkJCQkJb3NzIDw8IFRBQjIgPDwgIm1vZGVsIDo+ICIgPDwgKCppdEV4ZWMpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IEVPTDsKKwkJCQkJCQkJaWYoIG5vdCAoKml0RXhlYyktPmlzUmVhY2hhYmxlU3RhdGUoKSApCisJCQkJCQkJCXsKKwkJCQkJCQkJCW9zcyA8PCBUQUIyIDw8ICJtb2RlbFsgTk8gSU5DT01JTkcgVFJBTlNJVElPTiBdIDo+ICIKKwkJCQkJCQkJCQkJPDwgKCppdEV4ZWMpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IEVPTDsKKwkJCQkJCQkJfQorCisJCQkJCQkJCWhhc09uZVVuY292ZXJkVHJhbnNpdGlvbiA9IGZhbHNlOworCisJCQkJCQkJCWVuZE9mZnNldCA9ICgqaXRFeGVjKS0+Z2V0VHJhbnNpdGlvbigpLnNpemUoKTsKKwkJCQkJCQkJZm9yKCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgZW5kT2Zmc2V0IDsgKytvZmZzZXQgKQorCQkJCQkJCQl7CisJCQkJCQkJCQlpdFRyYW5zaXRpb24gPSAoKml0RXhlYyktPmdldFRyYW5zaXRpb24oKS5yYXdBdChvZmZzZXQpOworCisJCQkJCQkJCQlpZiggbm90IG1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZS0+CisJCQkJCQkJCQkJCWF0KCgqaXRFeGVjKS0+Z2V0T2Zmc2V0KCkpLT50ZXN0KCBvZmZzZXQgKSApCisJCQkJCQkJCQl7CisJCQkJCQkJCQkJaGFzT25lVW5jb3ZlcmRUcmFuc2l0aW9uID0gdHJ1ZTsKKwkJCQkJCQkJCQlvc3MgPDwgVEFCMyA8PCBpdFRyYW5zaXRpb24tPgorCQkJCQkJCQkJCQkJc3RyVHJhbnNpdGlvbkhlYWRlcigpIDw8IEVPTDsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCQlpZiggaGFzT25lVW5jb3ZlcmRUcmFuc2l0aW9uICkKKwkJCQkJCQkJeworCQkJCQkJCQkJb3MgPDwgb3NzLnN0cigpIDw8IEVPTDsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCWlmKCBtVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUgIT0gTlVMTCApCisJCQkJCXsKKwkJCQkJCWF2bV9zaXplX3QgZW5kTWFjaGluZSA9IG1UcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZS0+c2l6ZSgpOworCQkJCQkJYXZtX3NpemVfdCBpdE1hY2hpbmUgPSAwOworCQkJCQkJZm9yKCA7IGl0TWFjaGluZSA8IGVuZE1hY2hpbmUgOyArK2l0TWFjaGluZSApCisJCQkJCQl7CisJCQkJCQkJYVJJRCA9IGFuRUQuZ2V0UnVudGltZUlEKGl0TWFjaGluZSk7CisJCQkJCQkJaWYoIGFSSUQuZ2V0RXhlY3V0YWJsZSgpLT5oYXNUcmFuc2l0aW9uKCkgKQorCQkJCQkJCXsKKwkJCQkJCQkJb3NzLnN0cigiIik7CisKKy8vCQkJCQkJCQlvc3MgPDwgVEFCMiA8PCAiaW5zdGFuY2UgOj4gIiA8PCBhUklELmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgRU9MOworCQkJCQkJCQlpZiggbm90IGFSSUQuZ2V0RXhlY3V0YWJsZSgpLT5pc1JlYWNoYWJsZVN0YXRlKCkgKQorCQkJCQkJCQl7CisJCQkJCQkJCQlvc3MgPDwgVEFCMiA8PCAiaW5zdGFuY2VbIE5PIElOQ09NSU5HIFRSQU5TSVRJT04gXSA6PiAiCisJCQkJCQkJCQkJCTw8IGFSSUQuZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCBFT0w7CisJCQkJCQkJCX0KKworCQkJCQkJCQloYXNPbmVVbmNvdmVyZFRyYW5zaXRpb24gPSBmYWxzZTsKKworCQkJCQkJCQllbmRPZmZzZXQgPSBhUklELmdldEV4ZWN1dGFibGUoKS0+Z2V0VHJhbnNpdGlvbigpLnNpemUoKTsKKwkJCQkJCQkJZm9yKCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgZW5kT2Zmc2V0IDsgKytvZmZzZXQgKQorCQkJCQkJCQl7CisJCQkJCQkJCQlpdFRyYW5zaXRpb24gPSBhUklELmdldEV4ZWN1dGFibGUoKS0+CisJCQkJCQkJCQkJCWdldFRyYW5zaXRpb24oKS5yYXdBdChvZmZzZXQpOworCisJCQkJCQkJCQlpZiggKG5vdCBtVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUtPgorCQkJCQkJCQkJCQlhdChhUklELmdldE9mZnNldCgpKS0+dGVzdChvZmZzZXQpKQorCQkJCQkJCQkJCSYmIG1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZS0+CisJCQkJCQkJCQkJCWF0KGFSSUQuZ2V0RXhlY3V0YWJsZSgpLT5nZXRPZmZzZXQoKSktPgorCQkJCQkJCQkJCQkJdGVzdChvZmZzZXQpICkKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQloYXNPbmVVbmNvdmVyZFRyYW5zaXRpb24gPSB0cnVlOworCQkJCQkJCQkJCW9zcyA8PCBUQUIzIDw8IGl0VHJhbnNpdGlvbi0+CisJCQkJCQkJCQkJCQlzdHJUcmFuc2l0aW9uSGVhZGVyKCkgPDwgRU9MOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJCWlmKCBoYXNPbmVVbmNvdmVyZFRyYW5zaXRpb24gKQorCQkJCQkJCQl7CisJCQkJCQkJCQlvcyA8PCBvc3Muc3RyKCkgPDwgRU9MOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKCBpc1JlcG9ydERldGFpbHMoKSAmJiBtQ292ZXJhZ2VTdGF0aXN0aWNzLmhhc1VuY292ZXJlZCgpICkKKwkJeworCQkJbUNvdmVyYWdlU3RhdGlzdGljcy50b1N0cmVhbUNvdmVyYWdlUmF0ZSggb3MgPDwgVEFCMiwKKwkJCQkJIlJlc3VsdHM6IDw8ICIsICIgb24gIiwiID4+IGFyZSBjb3ZlcmVkICFcbiIgKTsKKwkJfQorCX0KKworLy8kCWlmKCBtU2xpY2VGbGFnICkKKy8vCXsKKy8vCQlvcyA8PCBUQUIyIDw8ICJOdW1iZXIgb2Ygbm9kZXMgY3V0IGJhY2s6ICIgPDwgbVNsaWNlQ291bnQgPDwgRU9MOworLy8kCX0KKworCW9zIDw8IHN0ZDo6Zmx1c2g7Cit9CisKKwordm9pZCBBdm1Db3ZlcmFnZVRyYW5zaXRpb25WaWV3OjpyZXBvcnREZWZhdWx0KE91dFN0cmVhbSAmIG9zKSBjb25zdAoreworLy8kCWlmKCBtSGV1cmlzdGljRmxhZyApCisJeworCQlvcyA8PCBzdGQ6OmJvb2xhbHBoYQorCQkJCTw8ICIgPCBjaDoiICAgPDwgbUhldXJpc3RpY1Byb3BlcnR5Lm1Db3ZlcmFnZUhlaWdodAorCQkJCTw8ICIgLCBjaHA6IiAgPDwgbUhldXJpc3RpY1Byb3BlcnR5Lm1Db3ZlcmFnZUhlaWdodFBlcmlvZAorCQkJCTw8ICIgLCBjaHJsOiIgPDwgbUhldXJpc3RpY1Byb3BlcnR5Lm1Db3ZlcmFnZUhlaWdodFJlYWNoZWRMaW1pdAorCisJCQkJPDwgIiA7IGhjcjoiICA8PCBtSGV1cmlzdGljUHJvcGVydHkubUhpdENlcnRhaW5seVJhbmRvbUZsYWcKKwkJCQk8PCAiICwgaGNjOiIgIDw8IG1IZXVyaXN0aWNQcm9wZXJ0eS5tSGl0Q2VydGFpbmx5Q291bnQKKworCQkJCTw8ICIgOyBoc3I6IiAgPDwgbUhldXJpc3RpY1Byb3BlcnR5Lm1IaXRTdHJvbmdseVJhbmRvbUZsYWcKKwkJCQk8PCAiICwgaHNjOiIgIDw8IG1IZXVyaXN0aWNQcm9wZXJ0eS5tSGl0U3Ryb25nbHlDb3VudAorCisJCQkJPDwgIiA7IGh3cjoiICA8PCBtSGV1cmlzdGljUHJvcGVydHkubUhpdFdlYWtseVJhbmRvbUZsYWcKKwkJCQk8PCAiICwgaHdjOiIgIDw8IG1IZXVyaXN0aWNQcm9wZXJ0eS5tSGl0V2Vha2x5Q291bnQKKworCQkJCTw8ICIgOyBob3I6IiAgPDwgbUhldXJpc3RpY1Byb3BlcnR5Lm1IaXRPdGhlclJhbmRvbUZsYWcKKwkJCQk8PCAiICwgaG9jOiIgIDw8IG1IZXVyaXN0aWNQcm9wZXJ0eS5tSGl0T3RoZXJDb3VudAorCQkJCTw8ICIgPiAiCisJCQkJPDwgc3RkOjpub2Jvb2xhbHBoYTsKKwl9CisKKwlvcyA8PCBFT0xfRkxVU0g7CisKKwlpZiggbUNvdmVyYWdlU3RhdGlzdGljcy5nb2FsQWNoaWV2ZWQoKSApCisJeworCQlvcyA8PCBUQUIyIDw8ICJBbGwgdGhlIDw8ICIgPDwgbUNvdmVyYWdlU3RhdGlzdGljcy5tTnVtYmVyT2ZFbGVtZW50cworCQkJCTw8ICIgPj4gdHJhbnNpdGlvbnMgYXJlIGNvdmVyZWQgISIgPDwgRU9MOworCX0KKwllbHNlCisJeworCQlvcyA8PCBUQUIyIDw8ICJXYXJuaW5nOiBhbGwgdGhlIHRyYW5zaXRpb25zIGFyZSBub3QgY292ZXJlZCAhIiA8PCBFT0w7CisJCW1Db3ZlcmFnZVN0YXRpc3RpY3MudG9TdHJlYW1Db3ZlcmFnZVJhdGUoIG9zIDw8IFRBQjIsCisJCQkJIlJlc3VsdHM6IDw8ICIsICIgb24gIiwiID4+IGFyZSBjb3ZlcmVkICFcbiIgKTsKKworCQlpZiggaXNSZXBvcnREZXRhaWxzKCkgKQorCQl7CisJCQlvcyA8PCBUQUIyIDw8ICJMaXN0IG9mIHRoZSA8PCAiCisJCQkJCTw8IG1Db3ZlcmFnZVN0YXRpc3RpY3MuZ2V0TnVtYmVyT2ZVbmNvdmVyZWQoKQorCQkJCQk8PCAgIiA+PiB0cmFuc2l0aW9ucyBub24gY292ZXJlZDoiIDw8IEVPTCA8PCBFT0w7CisKKwkJCWNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVEID0KKwkJCQltQ292ZXJhZ2VQcm9jZXNzb3IuZ2V0Q29uZmlndXJhdGlvbigpLmdldE1haW5FeGVjdXRpb25EYXRhKCk7CisKKwkJCVJ1bnRpbWVJRCBhUklEOworCisJCQlTdHJpbmdPdXRTdHJlYW0gb3NzKCBvcy5JTkRFTlQgKTsKKwkJCWJvb2wgaGFzT25lVW5jb3ZlcmRUcmFuc2l0aW9uID0gZmFsc2U7CisKKwkJCWF2bV9zaXplX3Qgb2Zmc2V0OworCQkJYXZtX3NpemVfdCBlbmRPZmZzZXQ7CisJCQlBdm1UcmFuc2l0aW9uICogaXRUcmFuc2l0aW9uOworCisJCQlzd2l0Y2goIG1TY29wZSApCisJCQl7CisJCQkJY2FzZSBTcGVjaWZpZXI6OkRFU0lHTl9JTlNUQU5DRV9LSU5EOgorCQkJCXsKKwkJCQkJaWYoIG1UcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZSA9PSBOVUxMICkKKwkJCQkJeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQlhdm1fc2l6ZV90IGVuZE1hY2hpbmUgPSBtVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUtPnNpemUoKTsKKwkJCQkJYXZtX3NpemVfdCBpdE1hY2hpbmUgPSAwOworCQkJCQlmb3IoIDsgaXRNYWNoaW5lIDwgZW5kTWFjaGluZSA7ICsraXRNYWNoaW5lICkKKwkJCQkJeworCQkJCQkJYVJJRCA9IGFuRUQuZ2V0UnVudGltZUlEKGl0TWFjaGluZSk7CisJCQkJCQlpZiggYVJJRC5nZXRFeGVjdXRhYmxlKCktPmhhc1RyYW5zaXRpb24oKSApCisJCQkJCQl7CisJCQkJCQkJb3NzLnN0cigiIik7CisKKwkJCQkJCQlvc3MgPDwgVEFCMiA8PCAiaW5zdGFuY2UiOworCQkJCQkJCWlmKCBub3QgYVJJRC5nZXRFeGVjdXRhYmxlKCktPmlzUmVhY2hhYmxlU3RhdGUoKSApCisJCQkJCQkJeworCQkJCQkJCQlvc3MgPDwgIlsgTk8gSU5DT01JTkcgVFJBTlNJVElPTiBdIjsKKwkJCQkJCQl9CisJCQkJCQkJb3NzIDw8ICIgOj4gIiA8PCBhUklELmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgRU9MOworCisJCQkJCQkJaGFzT25lVW5jb3ZlcmRUcmFuc2l0aW9uID0gZmFsc2U7CisKKwkJCQkJCQllbmRPZmZzZXQgPSBhUklELmdldEV4ZWN1dGFibGUoKS0+Z2V0VHJhbnNpdGlvbigpLnNpemUoKTsKKwkJCQkJCQlmb3IoIG9mZnNldCA9IDAgOyBvZmZzZXQgPCBlbmRPZmZzZXQgOyArK29mZnNldCApCisJCQkJCQkJeworCQkJCQkJCQlpdFRyYW5zaXRpb24gPSBhUklELmdldEV4ZWN1dGFibGUoKS0+CisJCQkJCQkJCQkJZ2V0VHJhbnNpdGlvbigpLnJhd0F0KG9mZnNldCk7CisKKwkJCQkJCQkJaWYoIG5vdCBtVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUtPgorCQkJCQkJCQkJCWF0KCBhUklELmdldE9mZnNldCgpICktPnRlc3QoIG9mZnNldCApICkKKwkJCQkJCQkJeworCQkJCQkJCQkJaGFzT25lVW5jb3ZlcmRUcmFuc2l0aW9uID0gdHJ1ZTsKKwkJCQkJCQkJCW9zcyA8PCBUQUIzIDw8IGl0VHJhbnNpdGlvbi0+CisJCQkJCQkJCQkJCXN0clRyYW5zaXRpb25IZWFkZXIoKSA8PCBFT0w7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQkJaWYoIGhhc09uZVVuY292ZXJkVHJhbnNpdGlvbiApCisJCQkJCQkJeworCQkJCQkJCQlvcyA8PCBvc3Muc3RyKCkgPDwgRU9MOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWNhc2UgU3BlY2lmaWVyOjpERVNJR05fTU9ERUxfS0lORDoKKwkJCQl7CisJCQkJCWlmKCBtRXhlY3V0YWJsZUNvdmVyYWdlVGFibGUgPT0gTlVMTCApCisJCQkJCXsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJVmVjdG9yT2ZFeGVjdXRhYmxlRm9ybTo6Y29uc3RfaXRlcmF0b3IgaXRFeGVjID0KKwkJCQkJCQltVGFibGVvZlJ1bnRpbWVFeGVjdXRhYmxlLmJlZ2luKCk7CisJCQkJCVZlY3Rvck9mRXhlY3V0YWJsZUZvcm06OmNvbnN0X2l0ZXJhdG9yIGVuZEV4ZWMgPQorCQkJCQkJCW1UYWJsZW9mUnVudGltZUV4ZWN1dGFibGUuZW5kKCk7CisJCQkJCWZvciggYXZtX3NpemVfdCBpbmRleEV4ZWMgPSAwIDsgaXRFeGVjICE9IGVuZEV4ZWMgOworCQkJCQkJCSsraXRFeGVjICwgKytpbmRleEV4ZWMgKQorCQkJCQl7CisJCQkJCQlpZiggKCppdEV4ZWMpLT5oYXNUcmFuc2l0aW9uKCkgKQorCQkJCQkJeworCQkJCQkJCW9zcy5zdHIoIiIpOworCisJCQkJCQkJb3NzIDw8IFRBQjIgPDwgIm1vZGVsIjsKKwkJCQkJCQlpZiggbm90ICgqaXRFeGVjKS0+aXNSZWFjaGFibGVTdGF0ZSgpICkKKwkJCQkJCQl7CisJCQkJCQkJCW9zcyA8PCAiWyBOTyBJTkNPTUlORyBUUkFOU0lUSU9OIF0iOworCQkJCQkJCX0KKwkJCQkJCQlvc3MgPDwgIiA6PiAiIDw8ICgqaXRFeGVjKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCBFT0w7CisKKwkJCQkJCQloYXNPbmVVbmNvdmVyZFRyYW5zaXRpb24gPSBmYWxzZTsKKworCQkJCQkJCWVuZE9mZnNldCA9ICgqaXRFeGVjKS0+Z2V0VHJhbnNpdGlvbigpLnNpemUoKTsKKwkJCQkJCQlmb3IoIG9mZnNldCA9IDAgOyBvZmZzZXQgPCBlbmRPZmZzZXQgOyArK29mZnNldCApCisJCQkJCQkJeworCQkJCQkJCQlpdFRyYW5zaXRpb24gPSAoKml0RXhlYyktPmdldFRyYW5zaXRpb24oKS5yYXdBdChvZmZzZXQpOworCisJCQkJCQkJCWlmKCBub3QgbUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlLT4KKwkJCQkJCQkJCQlhdCgoKml0RXhlYyktPmdldE9mZnNldCgpKS0+dGVzdCggb2Zmc2V0ICkgKQorCQkJCQkJCQl7CisJCQkJCQkJCQloYXNPbmVVbmNvdmVyZFRyYW5zaXRpb24gPSB0cnVlOworCQkJCQkJCQkJb3NzIDw8IFRBQjMgPDwgaXRUcmFuc2l0aW9uLT4KKwkJCQkJCQkJCQkJc3RyVHJhbnNpdGlvbkhlYWRlcigpIDw8IEVPTDsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQlpZiggaGFzT25lVW5jb3ZlcmRUcmFuc2l0aW9uICkKKwkJCQkJCQl7CisJCQkJCQkJCW9zIDw8IG9zcy5zdHIoKSA8PCBFT0w7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCWlmKCBtRXhlY3V0YWJsZUNvdmVyYWdlVGFibGUgIT0gTlVMTCApCisJCQkJCXsKKwkJCQkJCVZlY3Rvck9mRXhlY3V0YWJsZUZvcm06OmNvbnN0X2l0ZXJhdG9yIGl0RXhlYyA9CisJCQkJCQkJCW1UYWJsZW9mUnVudGltZUV4ZWN1dGFibGUuYmVnaW4oKTsKKwkJCQkJCVZlY3Rvck9mRXhlY3V0YWJsZUZvcm06OmNvbnN0X2l0ZXJhdG9yIGVuZEV4ZWMgPQorCQkJCQkJCQltVGFibGVvZlJ1bnRpbWVFeGVjdXRhYmxlLmVuZCgpOworCQkJCQkJYXZtX3NpemVfdCBpbmRleEV4ZWMgPSAwOworCQkJCQkJZm9yKCA7IGl0RXhlYyAhPSBlbmRFeGVjIDsgKytpdEV4ZWMgLCArK2luZGV4RXhlYyApCisJCQkJCQl7CisJCQkJCQkJaWYoICgqaXRFeGVjKS0+aGFzVHJhbnNpdGlvbigpICkKKwkJCQkJCQl7CisJCQkJCQkJCW9zcy5zdHIoIiIpOworCisJCQkJCQkJCW9zcyA8PCBUQUIyIDw8ICJtb2RlbCI7CisJCQkJCQkJCWlmKCBub3QgKCppdEV4ZWMpLT5pc1JlYWNoYWJsZVN0YXRlKCkgKQorCQkJCQkJCQl7CisJCQkJCQkJCQlvc3MgPDwgIlsgTk8gSU5DT01JTkcgVFJBTlNJVElPTiBdIjsKKwkJCQkJCQkJfQorCQkJCQkJCQlvc3MgPDwgIiA6PiAiIDw8ICgqaXRFeGVjKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCBFT0w7CisKKworCQkJCQkJCQloYXNPbmVVbmNvdmVyZFRyYW5zaXRpb24gPSBmYWxzZTsKKworCQkJCQkJCQllbmRPZmZzZXQgPSAoKml0RXhlYyktPmdldFRyYW5zaXRpb24oKS5zaXplKCk7CisJCQkJCQkJCWZvciggb2Zmc2V0ID0gMCA7IG9mZnNldCA8IGVuZE9mZnNldCA7ICsrb2Zmc2V0ICkKKwkJCQkJCQkJeworCQkJCQkJCQkJaXRUcmFuc2l0aW9uID0gKCppdEV4ZWMpLT5nZXRUcmFuc2l0aW9uKCkucmF3QXQob2Zmc2V0KTsKKworCQkJCQkJCQkJaWYoIG5vdCBtRXhlY3V0YWJsZUNvdmVyYWdlVGFibGUtPgorCQkJCQkJCQkJCQlhdCgoKml0RXhlYyktPmdldE9mZnNldCgpKS0+dGVzdCggb2Zmc2V0ICkgKQorCQkJCQkJCQkJeworCQkJCQkJCQkJCWhhc09uZVVuY292ZXJkVHJhbnNpdGlvbiA9IHRydWU7CisJCQkJCQkJCQkJb3NzIDw8IFRBQjMgPDwgaXRUcmFuc2l0aW9uLT4KKwkJCQkJCQkJCQkJCXN0clRyYW5zaXRpb25IZWFkZXIoKSA8PCBFT0w7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQkJaWYoIGhhc09uZVVuY292ZXJkVHJhbnNpdGlvbiApCisJCQkJCQkJCXsKKwkJCQkJCQkJCW9zIDw8IG9zcy5zdHIoKSA8PCBFT0w7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlpZiggbVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlICE9IE5VTEwgKQorCQkJCQl7CisJCQkJCQlhdm1fc2l6ZV90IGVuZE1hY2hpbmUgPSBtVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUtPnNpemUoKTsKKwkJCQkJCWF2bV9zaXplX3QgaXRNYWNoaW5lID0gMDsKKwkJCQkJCWZvciggOyBpdE1hY2hpbmUgPCBlbmRNYWNoaW5lIDsgKytpdE1hY2hpbmUgKQorCQkJCQkJeworCQkJCQkJCWFSSUQgPSBhbkVELmdldFJ1bnRpbWVJRChpdE1hY2hpbmUpOworCQkJCQkJCWlmKCBhUklELmdldEV4ZWN1dGFibGUoKS0+aGFzVHJhbnNpdGlvbigpICkKKwkJCQkJCQl7CisJCQkJCQkJCW9zcy5zdHIoIiIpOworCisJCQkJCQkJCW9zcyA8PCBUQUIyIDw8ICJpbnN0YW5jZSI7CisJCQkJCQkJCWlmKCBub3QgYVJJRC5nZXRFeGVjdXRhYmxlKCktPmlzUmVhY2hhYmxlU3RhdGUoKSApCisJCQkJCQkJCXsKKwkJCQkJCQkJCW9zcyA8PCAiWyBOTyBJTkNPTUlORyBUUkFOU0lUSU9OIF0iOworCQkJCQkJCQl9CisJCQkJCQkJCW9zcyA8PCAiIDo+ICIgPDwgYVJJRC5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IEVPTDsKKworCQkJCQkJCQloYXNPbmVVbmNvdmVyZFRyYW5zaXRpb24gPSBmYWxzZTsKKworCQkJCQkJCQllbmRPZmZzZXQgPSBhUklELmdldEV4ZWN1dGFibGUoKS0+Z2V0VHJhbnNpdGlvbigpLnNpemUoKTsKKwkJCQkJCQkJZm9yKCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgZW5kT2Zmc2V0IDsgKytvZmZzZXQgKQorCQkJCQkJCQl7CisJCQkJCQkJCQlpdFRyYW5zaXRpb24gPSBhUklELmdldEV4ZWN1dGFibGUoKS0+CisJCQkJCQkJCQkJCWdldFRyYW5zaXRpb24oKS5yYXdBdChvZmZzZXQpOworCisJCQkJCQkJCQlpZiggKG5vdCBtVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUtPgorCQkJCQkJCQkJCQlhdChhUklELmdldE9mZnNldCgpKS0+dGVzdChvZmZzZXQpKQorCQkJCQkJCQkJCSYmIG1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZS0+CisJCQkJCQkJCQkJCWF0KGFSSUQuZ2V0RXhlY3V0YWJsZSgpLT5nZXRPZmZzZXQoKSktPgorCQkJCQkJCQkJCQkJdGVzdChvZmZzZXQpICkKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQloYXNPbmVVbmNvdmVyZFRyYW5zaXRpb24gPSB0cnVlOworCQkJCQkJCQkJCW9zcyA8PCBUQUIzIDw8IGl0VHJhbnNpdGlvbi0+CisJCQkJCQkJCQkJCQlzdHJUcmFuc2l0aW9uSGVhZGVyKCkgPDwgRU9MOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJCWlmKCBoYXNPbmVVbmNvdmVyZFRyYW5zaXRpb24gKQorCQkJCQkJCQl7CisJCQkJCQkJCQlvcyA8PCBvc3Muc3RyKCkgPDwgRU9MOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKCBpc1JlcG9ydERldGFpbHMoKSAmJiBtQ292ZXJhZ2VTdGF0aXN0aWNzLmhhc1VuY292ZXJlZCgpICkKKwkJeworCQkJbUNvdmVyYWdlU3RhdGlzdGljcy50b1N0cmVhbUNvdmVyYWdlUmF0ZSggb3MgPDwgVEFCMiwKKwkJCQkJIlJlc3VsdHM6IDw8ICIsICIgb24gIiwiID4+IGFyZSBjb3ZlcmVkICFcbiIgKTsKKwkJfQorCX0KKworLy8kCWlmKCBtU2xpY2VGbGFnICkKKy8vCXsKKy8vCQlvcyA8PCBUQUIyIDw8ICJOdW1iZXIgb2Ygbm9kZXMgY3V0IGJhY2s6ICIgPDwgbVNsaWNlQ291bnQgPDwgRU9MOworLy8kCX0KKworCW9zIDw8IHN0ZDo6Zmx1c2g7Cit9CisKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBQUk9DRVNTT1IgRklMVEVSSU5HIEFQSQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBBdm1Db3ZlcmFnZVRyYW5zaXRpb25WaWV3OjpwcmVmaWx0ZXJpbmcoTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGVjUXVldWUpCit7CisJbURpcmVjdGl2ZUZhaWxlZEZsYWcgPSBmYWxzZTsKKwltRGlyZWN0aXZlSGl0RUMgPSBOVUxMOworCisJZW5kUXVldWUgPSBlY1F1ZXVlLmVuZCgpOworCWZvciggaXRRdWV1ZSA9IGVjUXVldWUuYmVnaW4oKSA7IGl0UXVldWUgIT0gZW5kUXVldWUgOyArK2l0UXVldWUgKQorCXsKKwkJaWYoICgqaXRRdWV1ZSktPmlzV2VpZ2h0KFdFSUdIVF9TRUxFQ1RFRF9BQ0hJRVZBQkxFKSApCisJCXsKKwkJCW1EaXJlY3RpdmVIaXRFQyA9ICgqaXRRdWV1ZSk7CisJCX0KKwkJZWxzZSBpZiggKG1EaXJlY3RpdmVIaXRFQyA9PSBOVUxMKSAmJiAoKml0UXVldWUpLT4KKwkJCQlpc1dlaWdodChXRUlHSFRfQ0VSVEFJTkxZX0FDSElFVkFCTEUpICkKKwkJeworCQkJbURpcmVjdGl2ZUhpdEVDID0gKCppdFF1ZXVlKTsKKwkJfQorCQllbHNlIGlmKCAobURpcmVjdGl2ZUhpdEVDID09IE5VTEwpICYmICgqaXRRdWV1ZSktPgorCQkJCWlzV2VpZ2h0KFdFSUdIVF9TVFJPTkdMWV9BQ0hJRVZBQkxFKSApCisJCXsKKwkJCW1EaXJlY3RpdmVIaXRFQyA9ICgqaXRRdWV1ZSk7CisJCX0KKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCitib29sIEF2bUNvdmVyYWdlVHJhbnNpdGlvblZpZXc6OnBvc3RmaWx0ZXJpbmcoTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGVjUXVldWUpCit7CisJZW5kUXVldWUgPSBlY1F1ZXVlLmVuZCgpOworCWZvciggaXRRdWV1ZSA9IGVjUXVldWUuYmVnaW4oKSA7IGl0UXVldWUgIT0gZW5kUXVldWUgOyArK2l0UXVldWUgKQorCXsKKwkJZW5kRUMgPSAoKml0UXVldWUpLT5lbmQoKTsKKwkJZm9yKCBpdEVDID0gKCppdFF1ZXVlKS0+YmVnaW4oKSA7IChpdEVDICE9IGVuZEVDKSA7ICsraXRFQyApCisJCXsKKy8vCQkJdXBkYXRlVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUoKCppdEVDKSwKKy8vCQkJCQkoKml0RUMpLT5nZXRSdW5uYWJsZUVsZW1lbnRUcmFjZSgpKTsKKwkJCXVwZGF0ZUNvdmVyYWdlVGFibGUoICppdEVDICk7CisKKwkJCWlmKCBtQ292ZXJhZ2VTdGF0aXN0aWNzLmdvYWxBY2hpZXZlZCgpICkKKwkJCXsKKwkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCX0KKwkJfQorCisJCWlmKCBtRGlyZWN0aXZlSGl0RUMgPT0gKCppdFF1ZXVlKSApCisJCXsKKwkJCW1EaXJlY3RpdmVGYWlsZWRGbGFnID0gbUNvdmVyYWdlU3RhdGlzdGljcy5pc05ld2x5RmFpbGVkU3RlcCgpOworCQl9CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKK3ZvaWQgQXZtQ292ZXJhZ2VUcmFuc2l0aW9uVmlldzo6dXBkYXRlQ292ZXJhZ2VUYWJsZShFeGVjdXRpb25Db250ZXh0ICogYW5FQykKK3sKKwl1cGRhdGVUcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZShhbkVDLCBhbkVDLT5nZXRSdW5uYWJsZUVsZW1lbnRUcmFjZSgpKTsKK30KKworCisKKy8qKgorICogSGV1cmlzdGljIDw8IEhpZ2ggUHJpb3JpdHkgQ29udGV4dCA+PiBpbXBsZW1lbnRhdGlvbgorICogUkVRVUVVRV9XQUlUSU5HIHBhcnQKKyAqLworYm9vbCBBdm1Db3ZlcmFnZVRyYW5zaXRpb25WaWV3Ojpjb21wdXRlSGlnaFByaW9yaXR5Q29udGV4dCgKKwkJTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGVjUXVldWUsCisJCVdhaXRpbmdTdHJhdGVneSAmIGFXYWl0aW5nU3RyYXRlZ3kpCit7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCW1Db3ZlcmFnZVN0YXRpc3RpY3MudG9TdHJlYW1Db3ZlcmFnZVJhdGUoQVZNX09TX0NPVVQgLAorCQkJIk51bWJlciBvZiBjb3ZlcmVkIHRyYW5zaXRpb25zID0gIiwgIiAvICIsICJcbiIpOworCisJbUNvdmVyYWdlU3RhdGlzdGljcy50b1N0cmVhbUNvdmVyYWdlUmF0ZShBVk1fT1NfVFJBQ0UsCisJCQkiTnVtYmVyIG9mIGNvdmVyZWQgdHJhbnNpdGlvbnMgPSAiLCAiIC8gIiwgIlxuIik7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCisJY29tcHV0ZVdlaWdodE9mUmVzdWx0KGVjUXVldWUpOworCisJaWYoIG1EaXJlY3RpdmVGYWlsZWRGbGFnICYmIG1Db3ZlcmFnZVN0YXRpc3RpY3MuaGFzRmFpbGVkU3RlcCgpICYmCisJCShtSGV1cmlzdGljUHJvcGVydHkubUhpdFN0cm9uZ2x5Q291bnQgPT0gMSkgKQorCXsKKwkJaWYoIGFXYWl0aW5nU3RyYXRlZ3kuaGFzV2FpdGluZyhXRUlHSFRfU1RST05HTFlfQUNISUVWQUJMRSkgKQorCQl7CisJCQkvLyEhIE5PVEhJTkcgaWYgV2FpdGluZyBRdWV1ZSBoYXMgQkZTIFN0cmF0ZWd5CisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIGdvdG8gZmFpbGVkQ2FzZToKKwkJfQorCX0KKworCS8vIGNhc2Ugb2YgZm91bmQgY2VydGFpbmx5IGhpdCBFQworCWVsc2UgaWYoIG1DZXJ0YWlubHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCA+IDAgKQorCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX0NPVVQgIDw8ICI9PT4gTmV4dCBbIENlcnRhaW5seSBdIEZpcmVhYmxlIENvdW50IDo+ICIKKwkJCTw8IG1DZXJ0YWlubHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudAorCQkJPDwgIiAgSGl0IENvdW50IDogIiA8PCBtQ2VydGFpbmx5SGl0RUMuc2l6ZSgpIDw8IHN0ZDo6ZW5kbDsKKwlBVk1fT1NfVFJBQ0UgPDwgIj09PiBOZXh0IFsgQ2VydGFpbmx5IF0gRmlyZWFibGUgQ291bnQgOj4gIgorCQkJPDwgbUNlcnRhaW5seUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50CisJCQk8PCAiICBIaXQgQ291bnQgOiAiIDw8IG1DZXJ0YWlubHlIaXRFQy5zaXplKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKworCQlzZXRIaXRXZWlnaHQobUNlcnRhaW5seUhpdEVDLCBXRUlHSFRfU0VMRUNURURfQUNISUVWQUJMRSwKKwkJCQltSGV1cmlzdGljUHJvcGVydHkubUhpdENlcnRhaW5seVJhbmRvbUZsYWcsCisJCQkJbUhldXJpc3RpY1Byb3BlcnR5Lm1IaXRDZXJ0YWlubHlDb3VudCk7CisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisJLy8gY2FzZSBvZiBmb3VuZCBzdHJvbmdseSBoaXQgRUMKKwllbHNlIGlmKCBtU3Ryb25nbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCA+IDAgKQorCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX0NPVVQgIDw8ICI9PT4gTmV4dCBbIFN0cm9uZ2x5IF0gRmlyZWFibGUgQ291bnQgOj4gIgorCQkJPDwgbVN0cm9uZ2x5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQKKwkJCTw8ICIgIEhpdCBDb3VudCA6ICIgPDwgbVN0cm9uZ2x5SGl0RUMuc2l6ZSgpIDw8IHN0ZDo6ZW5kbDsKKwlBVk1fT1NfVFJBQ0UgPDwgIj09PiBOZXh0IFsgU3Ryb25nbHkgXSBGaXJlYWJsZSBDb3VudCA6PiAiCisJCQk8PCBtU3Ryb25nbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudAorCQkJPDwgIiAgSGl0IENvdW50IDogIiA8PCBtU3Ryb25nbHlIaXRFQy5zaXplKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKworCQlzZXRIaXRXZWlnaHQobVN0cm9uZ2x5SGl0RUMsIFdFSUdIVF9TRUxFQ1RFRF9BQ0hJRVZBQkxFLAorCQkJCW1IZXVyaXN0aWNQcm9wZXJ0eS5tSGl0U3Ryb25nbHlSYW5kb21GbGFnLAorCQkJCW1IZXVyaXN0aWNQcm9wZXJ0eS5tSGl0U3Ryb25nbHlDb3VudCk7CisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisKKwkvLyBmYWlsZWRDYXNlOgorCWlmKCBhV2FpdGluZ1N0cmF0ZWd5Lmhhc1dhaXRpbmcoV0VJR0hUX1NUUk9OR0xZX0FDSElFVkFCTEUpICkKKwl7CisJCW1Db3ZlcmFnZVByb2Nlc3Nvci5zZXRSZXF1ZXN0UmVxdWV1ZVdhaXRpbmcoKTsKKwl9CisvLwllbHNlIGlmKCBhV2FpdGluZ1N0cmF0ZWd5Lmhhc1dhaXRpbmcoV0VJR0hUX05PTl9QUklPUklUWSkgKQorLy8JeworLy8JCW1Db3ZlcmFnZVByb2Nlc3Nvci5zZXRSZXF1ZXN0KAorLy8JCQkJU3ltYmV4Q29udHJvbGxlclJlcXVlc3RNYW5hZ2VyOjpBVk1fUkVRVUVVRV9XQUlUSU5HX1JFUVVFU1QpOworLy8JfQorCWVsc2UKKwl7CisJCW1Db3ZlcmFnZVByb2Nlc3Nvci5zZXRSZXF1ZXN0SGV1cmlzdGljKCk7CisJfQorCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCWlmKCAobUNlcnRhaW5seUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50ID09IDApICYmCisJCShtU3Ryb25nbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCA9PSAwKSAmJgorCQkobVdlYWtseUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50ID4gMCkgKQorCXsKKwkJQVZNX09TX0NPVVQgIDw8ICI9PT4gTmV4dCBbIFdlYWtseSBdIEZpcmVhYmxlIENvdW50IDo+ICIKKwkJCQk8PCBtV2Vha2x5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQKKwkJCQk8PCAiICBIaXQgQ291bnQgOiAiIDw8IG1XZWFrbHlIaXRFQy5zaXplKCkgPDwgc3RkOjplbmRsOworCQlBVk1fT1NfVFJBQ0UgPDwgIj09PiBOZXh0IFsgV2Vha2x5IF0gRmlyZWFibGUgQ291bnQgOj4gIgorCQkJCTw8IG1XZWFrbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudAorCQkJCTw8ICIgIEhpdCBDb3VudCA6ICIgPDwgbVdlYWtseUhpdEVDLnNpemUoKSA8PCBzdGQ6OmVuZGw7CisJfQorQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKworCXJldHVybiggZmFsc2UgKTsKK30KKworCitib29sIEF2bUNvdmVyYWdlVHJhbnNpdGlvblZpZXc6OmhpZ2hSZXF1ZXVlV2FpdGluZ1RhYmxlKAorCQlXYWl0aW5nU3RyYXRlZ3kgJiBhV2FpdGluZ1N0cmF0ZWd5LAorCQlhdm1fdWludDhfdCBhV2VpZ2h0TWluLCBhdm1fdWludDhfdCBhV2VpZ2h0TWF4KQoreworCW1Db3ZlcmFnZVN0YXRpc3RpY3Muc2V0RmFpbGVkSGV1cmlzdGljKCk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCUFWTV9PU19DT1VUICA8PCAiPj4+Pj4+PiBSRVFVRVNUIFJFUVVFVUUgPDw8PDw8PCIgPDwgc3RkOjplbmRsOworCUFWTV9PU19UUkFDRSA8PCAiPj4+Pj4+PiBSRVFVRVNUIFJFUVVFVUUgPDw8PDw8PCIgPDwgc3RkOjplbmRsOworCisJQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBUUkFOU0lUSU9OICkKKwkJcmVwb3J0KEFWTV9PU19DT1VUKTsKKwkJcmVwb3J0KEFWTV9PU19UUkFDRSk7CisJQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBUUkFOU0lUSU9OICkKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCisJZG8KKwl7CisJCW1XYWl0aW5nUXVldWUuY2xlYXIoKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgUVVFVUUgKQorCUFWTV9PU19UUkFDRSA8PCAiQXZtQ292ZXJhZ2VUcmFuc2l0aW9uVmlldzo6aGlnaFJlcXVldWVXYWl0aW5nVGFibGUgOj4iIDw8IHN0ZDo6ZW5kbDsKKwlhV2FpdGluZ1N0cmF0ZWd5LnRvU3RyZWFtKEFWTV9PU19DT1VUKTsKKwlhV2FpdGluZ1N0cmF0ZWd5LnRvU3RyZWFtKEFWTV9PU19UUkFDRSk7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBQUk9DRVNTT1IgLCBRVUVVRSApCisKKy8vCQlhV2FpdGluZ1N0cmF0ZWd5LnNwbGljZVF1ZXVlVGFibGUobVdhaXRpbmdRdWV1ZSwgYVdlaWdodE1heCk7CisKKwkJYVdlaWdodE1pbiA9IGFXYWl0aW5nU3RyYXRlZ3kuc3BsaWNlUHJpb3JRdWV1ZVRhYmxlKAorCQkJCW1XYWl0aW5nUXVldWUsIGFXZWlnaHRNaW4sIGFXZWlnaHRNYXgpOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCUFWTV9PU19DT1VUICA8PCAiUkVRVUVVRSBRVUVVRSA8PCAiCisJCQk8PCBJSGV1cmlzdGljQ29udGV4dFdlaWdodDo6c3RySGV1cmlzdGljV2VpZ2h0KGFXZWlnaHRNaW4pCisJCQk8PCAiID4+ICIgPDwgc3RkOjplbmRsOworCUFWTV9PU19UUkFDRSA8PCAiUkVRVUVVRSBRVUVVRSA8PCAiCisJCQk8PCBJSGV1cmlzdGljQ29udGV4dFdlaWdodDo6c3RySGV1cmlzdGljV2VpZ2h0KGFXZWlnaHRNaW4pCisJCQk8PCAiID4+ICIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKworCQltQ2VydGFpbmx5SGl0RUMuY2xlYXIoKTsKKwkJbUNlcnRhaW5seUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50ID0gMDsKKworCQltU3Ryb25nbHlIaXRFQy5jbGVhcigpOworCQltU3Ryb25nbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCA9IDA7CisKKwkJbVdlYWtseUhpdEVDLmNsZWFyKCk7CisJCW1XZWFrbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCA9IDA7CisKKwkJTGlzdE9mRXhlY3V0aW9uQ29udGV4dDo6aXRlcmF0b3IgZWNRdWV1ZUl0ID0gbVdhaXRpbmdRdWV1ZS5iZWdpbigpOworCQlMaXN0T2ZFeGVjdXRpb25Db250ZXh0OjppdGVyYXRvciBlY1F1ZXVlSXRFbmQgPSBtV2FpdGluZ1F1ZXVlLmVuZCgpOworCQlmb3IoIDsgZWNRdWV1ZUl0ICE9IGVjUXVldWVJdEVuZCA7ICsrZWNRdWV1ZUl0ICkKKwkJeworCQkJY29tcHV0ZVdlaWdodCggKmVjUXVldWVJdCApOworCisJCQlhV2FpdGluZ1N0cmF0ZWd5LnB1c2goICplY1F1ZXVlSXQgKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwlpZiggKCplY1F1ZXVlSXQpLT5nZXRXZWlnaHQoKSA8PSBXRUlHSFRfQ0VSVEFJTkxZX0FDSElFVkFCTEUgKQorCXsKKwkJQVZNX09TX0NPVVQgIDw8IERFRkFVTFRfV1JBUF9EQVRBIDw8ICJSRVFVRVVFIGNhbmRpZGF0ZSBbIDw9IENlcnRhaW5seSBdIDo+ICI7CisJCSgqZWNRdWV1ZUl0KS0+dHJhY2VNaW5pbXVtKEFWTV9PU19DT1VUKTsgQVZNX09TX0NPVVQgPDwgRU5EX1dSQVA7CisJCWZpcmVhYmxlVHJhbnNpdGlvblRyYWNlKEFWTV9PU19DT1VULCAoKmVjUXVldWVJdCktPnJlZkV4ZWN1dGlvbkRhdGEoKSk7CisKKwkJQVZNX09TX1RSQUNFIDw8IERFRkFVTFRfV1JBUF9EQVRBIDw8ICJSRVFVRVVFIGNhbmRpZGF0ZSBbIDw9IENlcnRhaW5seSBdIDo+ICI7CisJCSgqZWNRdWV1ZUl0KS0+dHJhY2VNaW5pbXVtKEFWTV9PU19UUkFDRSk7IEFWTV9PU19UUkFDRSA8PCBFTkRfV1JBUDsKKwkJZmlyZWFibGVUcmFuc2l0aW9uVHJhY2UoQVZNX09TX1RSQUNFLCAoKmVjUXVldWVJdCktPnJlZkV4ZWN1dGlvbkRhdGEoKSk7CisJfQorCisJZWxzZSBpZiggKCplY1F1ZXVlSXQpLT5nZXRXZWlnaHQoKSA8PSBXRUlHSFRfU1RST05HTFlfQUNISUVWQUJMRSApCisJeworCQlBVk1fT1NfQ09VVCAgPDwgREVGQVVMVF9XUkFQX0RBVEEgPDwgIlJFUVVFVUUgY2FuZGlkYXRlIFsgPD0gU3Ryb25nbHkgXSA6PiAiOworCQkoKmVjUXVldWVJdCktPnRyYWNlTWluaW11bShBVk1fT1NfQ09VVCk7IEFWTV9PU19DT1VUIDw8IEVORF9XUkFQOworCQlmaXJlYWJsZVRyYW5zaXRpb25UcmFjZShBVk1fT1NfQ09VVCwgKCplY1F1ZXVlSXQpLT5yZWZFeGVjdXRpb25EYXRhKCkpOworCisJCUFWTV9PU19UUkFDRSA8PCBERUZBVUxUX1dSQVBfREFUQSA8PCAiUkVRVUVVRSBjYW5kaWRhdGUgWyA8PSBTdHJvbmdseSBdIDo+ICI7CisJCSgqZWNRdWV1ZUl0KS0+dHJhY2VNaW5pbXVtKEFWTV9PU19UUkFDRSk7IEFWTV9PU19UUkFDRSA8PCBFTkRfV1JBUDsKKwkJZmlyZWFibGVUcmFuc2l0aW9uVHJhY2UoQVZNX09TX1RSQUNFLCAoKmVjUXVldWVJdCktPnJlZkV4ZWN1dGlvbkRhdGEoKSk7CisJfQorQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwkJfQorCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBQUk9DRVNTT1IgLCBRVUVVRSApCisJQVZNX09TX1RSQUNFIDw8ICJBdm1Db3ZlcmFnZVRyYW5zaXRpb25WaWV3OjpoaWdoUmVxdWV1ZVdhaXRpbmdUYWJsZSA6PiIgPDwgc3RkOjplbmRsOworCWFXYWl0aW5nU3RyYXRlZ3kudG9TdHJlYW0oQVZNX09TX0NPVVQpOworCWFXYWl0aW5nU3RyYXRlZ3kudG9TdHJlYW0oQVZNX09TX1RSQUNFKTsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIFBST0NFU1NPUiAsIFFVRVVFICkKKworCQkvLyBjYXNlIG9mIGZvdW5kIGNlcnRhaW5seSBoaXQgRUMKKwkJaWYoIG1DZXJ0YWlubHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCA+IDAgKQorCQl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCUFWTV9PU19DT1VUICA8PCAiPT0+IFJFUVVFVUUgY2FuZGlkYXRlIFsgQ2VydGFpbmx5IF0gRmlyZWFibGUgQ291bnQgOj4gIgorCQkJPDwgbUNlcnRhaW5seUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50CisJCQk8PCAiICBIaXQgQ291bnQgOiAiIDw8IG1DZXJ0YWlubHlIaXRFQy5zaXplKCkgPDwgc3RkOjplbmRsOworCUFWTV9PU19UUkFDRSA8PCAiPT0+IFJFUVVFVUUgY2FuZGlkYXRlIFsgQ2VydGFpbmx5IF0gRmlyZWFibGUgQ291bnQgOj4gIgorCQkJPDwgbUNlcnRhaW5seUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50CisJCQk8PCAiICBIaXQgQ291bnQgOiAiIDw8IG1DZXJ0YWlubHlIaXRFQy5zaXplKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwkJfQorCisJCS8vIGNhc2Ugb2YgZm91bmQgc3Ryb25nbHkgaGl0IEVDCisJCWlmKCBtU3Ryb25nbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCA+IDAgKQorCQl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCUFWTV9PU19DT1VUICA8PCAiPT0+IFJFUVVFVUUgY2FuZGlkYXRlIFsgU3Ryb25nbHkgXSBGaXJlYWJsZSBDb3VudCA6PiAiCisJCTw8IG1TdHJvbmdseUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50CisJCTw8ICIgIEhpdCBDb3VudCA6ICIgPDwgbVN0cm9uZ2x5SGl0RUMuc2l6ZSgpIDw8IHN0ZDo6ZW5kbDsKKwlBVk1fT1NfVFJBQ0UgPDwgIj09PiBSRVFVRVVFIGNhbmRpZGF0ZSBbIFN0cm9uZ2x5IF0gRmlyZWFibGUgQ291bnQgOj4gIgorCQk8PCBtU3Ryb25nbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudAorCQk8PCAiICBIaXQgQ291bnQgOiAiIDw8IG1TdHJvbmdseUhpdEVDLnNpemUoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCQl9CisKKwkJLy8gY2FzZSBvZiBmb3VuZCB3ZWFrbHkgaGl0IEVDCisJCWlmKCBtV2Vha2x5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQgPiAwICkKKwkJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwlBVk1fT1NfQ09VVCAgPDwgIj09PiBSRVFVRVVFIGNhbmRpZGF0ZSBbIFdlYWtseSBdIEZpcmVhYmxlIENvdW50IDo+ICIKKwkJCTw8IG1XZWFrbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudAorCQkJPDwgIiAgSGl0IENvdW50IDogIiA8PCBtV2Vha2x5SGl0RUMuc2l6ZSgpIDw8IHN0ZDo6ZW5kbDsKKwlBVk1fT1NfVFJBQ0UgPDwgIj09PiBSRVFVRVVFIGNhbmRpZGF0ZSBbIFdlYWtseSBdIEZpcmVhYmxlIENvdW50IDo+ICIKKwkJCTw8IG1XZWFrbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudAorCQkJPDwgIiAgSGl0IENvdW50IDogIiA8PCBtV2Vha2x5SGl0RUMuc2l6ZSgpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJCX0KKwl9CisvLwl3aGlsZSggKCgrK2FXZWlnaHRNaW4pIDw9IFdFSUdIVF9OT05fUFJJT1JJVFkpICYmCisJd2hpbGUoICgoKythV2VpZ2h0TWluKSA8PSBXRUlHSFRfU1RST05HTFlfQUNISUVWQUJMRSkgJiYKKy8vCXdoaWxlKCAoKCsrYVdlaWdodE1pbikgPD0gYVdlaWdodE1heCkgJiYKKwkJCShtQ2VydGFpbmx5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQgPT0gMCkgJiYKKwkJCShtU3Ryb25nbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCA9PSAwKSApOworCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworLyoqCisgKiBIZXVyaXN0aWMgPDwgQW55IFByaW9yaXR5IENvbnRleHQgPj4gaW1wbGVtZW50YXRpb24KKyAqIFJFUVVFVUVfV0FJVElORyBwYXJ0CisgKi8KK2Jvb2wgQXZtQ292ZXJhZ2VUcmFuc2l0aW9uVmlldzo6Y29tcHV0ZVByaW9yaXR5Q29udGV4dCgKKwkJTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGVjUXVldWUsCisJCVdhaXRpbmdTdHJhdGVneSAmIGFXYWl0aW5nU3RyYXRlZ3kpCit7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCW1Db3ZlcmFnZVN0YXRpc3RpY3MudG9TdHJlYW1Db3ZlcmFnZVJhdGUoQVZNX09TX0NPVVQgLAorCQkJIk51bWJlciBvZiBjb3ZlcmVkIHRyYW5zaXRpb25zID0gIiwgIiAvICIsICJcbiIpOworCisJbUNvdmVyYWdlU3RhdGlzdGljcy50b1N0cmVhbUNvdmVyYWdlUmF0ZShBVk1fT1NfVFJBQ0UsCisJCQkiTnVtYmVyIG9mIGNvdmVyZWQgdHJhbnNpdGlvbnMgPSAiLCAiIC8gIiwgIlxuIik7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCisJY29tcHV0ZVdlaWdodE9mUmVzdWx0KGVjUXVldWUpOworCisJLy8gY2FzZSBvZiBmb3VuZCBjZXJ0YWlubHkgaGl0IEVDCisJaWYoIG1DZXJ0YWlubHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCA+IDAgKQorCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX0NPVVQgIDw8ICI9PT4gTmV4dCBbIENlcnRhaW5seSBdIEZpcmVhYmxlIENvdW50IDo+ICIKKwkJCTw8IG1DZXJ0YWlubHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudAorCQkJPDwgIiAgSGl0IENvdW50IDogIiA8PCBtQ2VydGFpbmx5SGl0RUMuc2l6ZSgpIDw8IHN0ZDo6ZW5kbDsKKwlBVk1fT1NfVFJBQ0UgPDwgIj09PiBOZXh0IFsgQ2VydGFpbmx5IF0gRmlyZWFibGUgQ291bnQgOj4gIgorCQkJPDwgbUNlcnRhaW5seUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50CisJCQk8PCAiICBIaXQgQ291bnQgOiAiIDw8IG1DZXJ0YWlubHlIaXRFQy5zaXplKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKworCQlzZXRIaXRXZWlnaHQobUNlcnRhaW5seUhpdEVDLCBXRUlHSFRfU0VMRUNURURfQUNISUVWQUJMRSwKKwkJCQltSGV1cmlzdGljUHJvcGVydHkubUhpdENlcnRhaW5seVJhbmRvbUZsYWcsCisJCQkJbUhldXJpc3RpY1Byb3BlcnR5Lm1IaXRDZXJ0YWlubHlDb3VudCk7CisKKwkJbUNvdmVyYWdlUHJvY2Vzc29yLnNldFJlcXVlc3RIZXVyaXN0aWMoKTsKKworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKwkvLyBjYXNlIG9mIGZvdW5kIHN0cm9uZ2x5IGhpdCBFQworCWlmKCBtU3Ryb25nbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCA+IDAgKQorCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX0NPVVQgIDw8ICI9PT4gTmV4dCBbIFN0cm9uZ2x5IF0gRmlyZWFibGUgQ291bnQgOj4gIgorCQkJPDwgbVN0cm9uZ2x5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQKKwkJCTw8ICIgIEhpdCBDb3VudCA6ICIgPDwgbVN0cm9uZ2x5SGl0RUMuc2l6ZSgpIDw8IHN0ZDo6ZW5kbDsKKwlBVk1fT1NfVFJBQ0UgPDwgIj09PiBOZXh0IFsgU3Ryb25nbHkgXSBGaXJlYWJsZSBDb3VudCA6PiAiCisJCQk8PCBtU3Ryb25nbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudAorCQkJPDwgIiAgSGl0IENvdW50IDogIiA8PCBtU3Ryb25nbHlIaXRFQy5zaXplKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKworCQlzZXRIaXRXZWlnaHQobVN0cm9uZ2x5SGl0RUMsIFdFSUdIVF9TRUxFQ1RFRF9BQ0hJRVZBQkxFLAorCQkJCW1IZXVyaXN0aWNQcm9wZXJ0eS5tSGl0U3Ryb25nbHlSYW5kb21GbGFnLAorCQkJCW1IZXVyaXN0aWNQcm9wZXJ0eS5tSGl0U3Ryb25nbHlDb3VudCk7CisKKwkJbUNvdmVyYWdlUHJvY2Vzc29yLnNldFJlcXVlc3RIZXVyaXN0aWMoKTsKKworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKwkvLyBjYXNlIG9mIGZvdW5kIHdlYWtseSBoaXQgRUMKKwllbHNlIGlmKCBtV2Vha2x5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQgPiAwICkKKwl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCUFWTV9PU19DT1VUICA8PCAiPT0+IE5leHQgWyBXZWFrbHkgXSBGaXJlYWJsZSBDb3VudCA6PiAiCisJCQk8PCBtV2Vha2x5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQKKwkJCTw8ICIgIEhpdCBDb3VudCA6ICIgPDwgbVdlYWtseUhpdEVDLnNpemUoKSA8PCBzdGQ6OmVuZGw7CisJQVZNX09TX1RSQUNFIDw8ICI9PT4gTmV4dCBbIFdlYWtseSBdIEZpcmVhYmxlIENvdW50IDo+ICIKKwkJCTw8IG1XZWFrbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudAorCQkJPDwgIiAgSGl0IENvdW50IDogIiA8PCBtV2Vha2x5SGl0RUMuc2l6ZSgpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisKKwkJc2V0SGl0V2VpZ2h0KG1XZWFrbHlIaXRFQywgV0VJR0hUX1NFTEVDVEVEX0FDSElFVkFCTEUsCisJCQkJbUhldXJpc3RpY1Byb3BlcnR5Lm1IaXRXZWFrbHlSYW5kb21GbGFnLAorCQkJCW1IZXVyaXN0aWNQcm9wZXJ0eS5tSGl0V2Vha2x5Q291bnQpOworCisJCXJldHVybiggdHJ1ZSApOworCX0KKworCWVsc2UgaWYoIGFXYWl0aW5nU3RyYXRlZ3kuaGFzV2FpdGluZyggV0VJR0hUX1dFQUtMWV9BQ0hJRVZBQkxFKSApCisJeworCQltQ292ZXJhZ2VQcm9jZXNzb3Iuc2V0UmVxdWVzdFJlcXVldWVXYWl0aW5nKCk7CisJfQorCWVsc2UKKwl7CisJCW1Db3ZlcmFnZVByb2Nlc3Nvci5zZXRSZXF1ZXN0SGV1cmlzdGljKCk7CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKK2Jvb2wgQXZtQ292ZXJhZ2VUcmFuc2l0aW9uVmlldzo6ZWxzZVJlcXVldWVXYWl0aW5nVGFibGUoCisJCVdhaXRpbmdTdHJhdGVneSAmIGFXYWl0aW5nU3RyYXRlZ3ksCisJCWF2bV91aW50OF90IGFXZWlnaHRNaW4sIGF2bV91aW50OF90IGFXZWlnaHRNYXgpCit7CisJbUNvdmVyYWdlU3RhdGlzdGljcy5zZXRGYWlsZWRIZXVyaXN0aWMoKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisJQVZNX09TX0NPVVQgIDw8ICI+Pj4+Pj4+IFJFUVVFU1QgUkVRVUVVRSA8PDw8PDw8IiA8PCBzdGQ6OmVuZGw7CisJQVZNX09TX1RSQUNFIDw8ICI+Pj4+Pj4+IFJFUVVFU1QgUkVRVUVVRSA8PDw8PDw8IiA8PCBzdGQ6OmVuZGw7CisKKwlBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFRSQU5TSVRJT04gKQorCQlyZXBvcnQoQVZNX09TX0NPVVQpOworCQlyZXBvcnQoQVZNX09TX1RSQUNFKTsKKwlBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFRSQU5TSVRJT04gKQorQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisKKwlkbworCXsKKwkJbVdhaXRpbmdRdWV1ZS5jbGVhcigpOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBQUk9DRVNTT1IgLCBRVUVVRSApCisJQVZNX09TX1RSQUNFIDw8ICJBdm1Db3ZlcmFnZVRyYW5zaXRpb25WaWV3OjplbHNlUmVxdWV1ZVdhaXRpbmdUYWJsZSA6PiIgPDwgc3RkOjplbmRsOworCWFXYWl0aW5nU3RyYXRlZ3kudG9TdHJlYW0oQVZNX09TX0NPVVQpOworCWFXYWl0aW5nU3RyYXRlZ3kudG9TdHJlYW0oQVZNX09TX1RSQUNFKTsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIFBST0NFU1NPUiAsIFFVRVVFICkKKworLy8JCWFXYWl0aW5nU3RyYXRlZ3kuc3BsaWNlUXVldWVUYWJsZShtV2FpdGluZ1F1ZXVlLCBhV2VpZ2h0TWF4KTsKKworCQlhV2VpZ2h0TWluID0gYVdhaXRpbmdTdHJhdGVneS5zcGxpY2VQcmlvclF1ZXVlVGFibGUoCisJCQkJbVdhaXRpbmdRdWV1ZSwgYVdlaWdodE1pbiwgYVdlaWdodE1heCk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX0NPVVQgIDw8ICJSRVFVRVVFIFFVRVVFIDw8ICIKKwkJCTw8IElIZXVyaXN0aWNDb250ZXh0V2VpZ2h0OjpzdHJIZXVyaXN0aWNXZWlnaHQoYVdlaWdodE1pbikKKwkJCTw8ICIgPj4gIiA8PCBzdGQ6OmVuZGw7CisJQVZNX09TX1RSQUNFIDw8ICJSRVFVRVVFIFFVRVVFIDw8ICIKKwkJCTw8IElIZXVyaXN0aWNDb250ZXh0V2VpZ2h0OjpzdHJIZXVyaXN0aWNXZWlnaHQoYVdlaWdodE1pbikKKwkJCTw8ICIgPj4gIiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCisKKwkJbUNlcnRhaW5seUhpdEVDLmNsZWFyKCk7CisJCW1DZXJ0YWlubHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCA9IDA7CisKKwkJbVN0cm9uZ2x5SGl0RUMuY2xlYXIoKTsKKwkJbVN0cm9uZ2x5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQgPSAwOworCisJCW1XZWFrbHlIaXRFQy5jbGVhcigpOworCQltV2Vha2x5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQgPSAwOworCisJCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQ6Oml0ZXJhdG9yIGVjUXVldWVJdCA9IG1XYWl0aW5nUXVldWUuYmVnaW4oKTsKKwkJTGlzdE9mRXhlY3V0aW9uQ29udGV4dDo6aXRlcmF0b3IgZWNRdWV1ZUl0RW5kID0gbVdhaXRpbmdRdWV1ZS5lbmQoKTsKKwkJZm9yKCA7IGVjUXVldWVJdCAhPSBlY1F1ZXVlSXRFbmQgOyArK2VjUXVldWVJdCApCisJCXsKKwkJCWNvbXB1dGVXZWlnaHQoICplY1F1ZXVlSXQgKTsKKworCQkJYVdhaXRpbmdTdHJhdGVneS5wdXNoKCAqZWNRdWV1ZUl0ICk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJaWYoICgqZWNRdWV1ZUl0KS0+Z2V0V2VpZ2h0KCkgPD0gV0VJR0hUX0NFUlRBSU5MWV9BQ0hJRVZBQkxFICkKKwl7CisJCUFWTV9PU19DT1VUICA8PCAiUkVRVUVVRSBjYW5kaWRhdGUgWyA8PSBDZXJ0YWlubHkgXSA6PiAiOworCQkoKmVjUXVldWVJdCktPnRyYWNlTWluaW11bShBVk1fT1NfQ09VVCk7CisJCWZpcmVhYmxlVHJhbnNpdGlvblRyYWNlKEFWTV9PU19DT1VULCAoKmVjUXVldWVJdCktPnJlZkV4ZWN1dGlvbkRhdGEoKSk7CisKKwkJQVZNX09TX1RSQUNFIDw8ICJSRVFVRVVFIGNhbmRpZGF0ZSBbIDw9IENlcnRhaW5seSBdIDo+ICI7CisJCSgqZWNRdWV1ZUl0KS0+dHJhY2VNaW5pbXVtKEFWTV9PU19UUkFDRSk7CisJCWZpcmVhYmxlVHJhbnNpdGlvblRyYWNlKEFWTV9PU19UUkFDRSwgKCplY1F1ZXVlSXQpLT5yZWZFeGVjdXRpb25EYXRhKCkpOworCX0KKworCWVsc2UgaWYoICgqZWNRdWV1ZUl0KS0+Z2V0V2VpZ2h0KCkgPD0gV0VJR0hUX1NUUk9OR0xZX0FDSElFVkFCTEUgKQorCXsKKwkJQVZNX09TX0NPVVQgIDw8ICJSRVFVRVVFIGNhbmRpZGF0ZSBbIDw9IFN0cm9uZ2x5IF0gOj4gIjsKKwkJKCplY1F1ZXVlSXQpLT50cmFjZU1pbmltdW0oQVZNX09TX0NPVVQpOworCQlmaXJlYWJsZVRyYW5zaXRpb25UcmFjZShBVk1fT1NfQ09VVCwgKCplY1F1ZXVlSXQpLT5yZWZFeGVjdXRpb25EYXRhKCkpOworCisJCUFWTV9PU19UUkFDRSA8PCAiUkVRVUVVRSBjYW5kaWRhdGUgWyA8PSBTdHJvbmdseSBdIDo+ICI7CisJCSgqZWNRdWV1ZUl0KS0+dHJhY2VNaW5pbXVtKEFWTV9PU19UUkFDRSk7CisJCWZpcmVhYmxlVHJhbnNpdGlvblRyYWNlKEFWTV9PU19UUkFDRSwgKCplY1F1ZXVlSXQpLT5yZWZFeGVjdXRpb25EYXRhKCkpOworCX0KK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJCX0KKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgUVVFVUUgKQorCUFWTV9PU19UUkFDRSA8PCAiQXZtQ292ZXJhZ2VUcmFuc2l0aW9uVmlldzo6ZWxzZVJlcXVldWVXYWl0aW5nVGFibGUgOj4iIDw8IHN0ZDo6ZW5kbDsKKwlhV2FpdGluZ1N0cmF0ZWd5LnRvU3RyZWFtKEFWTV9PU19DT1VUKTsKKwlhV2FpdGluZ1N0cmF0ZWd5LnRvU3RyZWFtKEFWTV9PU19UUkFDRSk7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBQUk9DRVNTT1IgLCBRVUVVRSApCisKKwkJLy8gY2FzZSBvZiBmb3VuZCBjZXJ0YWlubHkgaGl0IEVDCisJCWlmKCBtQ2VydGFpbmx5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQgPiAwICkKKwkJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwlBVk1fT1NfQ09VVCAgPDwgIj09PiBSRVFVRVVFIGNhbmRpZGF0ZSBbIENlcnRhaW5seSBdIEZpcmVhYmxlIENvdW50IDo+ICIKKwkJCTw8IG1DZXJ0YWlubHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudAorCQkJPDwgIiAgSGl0IENvdW50IDogIiA8PCBtQ2VydGFpbmx5SGl0RUMuc2l6ZSgpIDw8IHN0ZDo6ZW5kbDsKKwlBVk1fT1NfVFJBQ0UgPDwgIj09PiBSRVFVRVVFIGNhbmRpZGF0ZSBbIENlcnRhaW5seSBdIEZpcmVhYmxlIENvdW50IDo+ICIKKwkJCTw8IG1DZXJ0YWlubHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudAorCQkJPDwgIiAgSGl0IENvdW50IDogIiA8PCBtQ2VydGFpbmx5SGl0RUMuc2l6ZSgpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJCX0KKworCQkvLyBjYXNlIG9mIGZvdW5kIHN0cm9uZ2x5IGhpdCBFQworCQlpZiggbVN0cm9uZ2x5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQgPiAwICkKKwkJeworCQlBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCQlBVk1fT1NfQ09VVCAgPDwgIj09PiBSRVFVRVVFIGNhbmRpZGF0ZSBbIFN0cm9uZ2x5IF0gRmlyZWFibGUgQ291bnQgOj4gIgorCQkJPDwgbVN0cm9uZ2x5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQKKwkJCTw8ICIgIEhpdCBDb3VudCA6ICIgPDwgbVN0cm9uZ2x5SGl0RUMuc2l6ZSgpIDw8IHN0ZDo6ZW5kbDsKKwkJQVZNX09TX1RSQUNFIDw8ICI9PT4gUkVRVUVVRSBjYW5kaWRhdGUgWyBTdHJvbmdseSBdIEZpcmVhYmxlIENvdW50IDo+ICIKKwkJCTw8IG1TdHJvbmdseUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50CisJCQk8PCAiICBIaXQgQ291bnQgOiAiIDw8IG1TdHJvbmdseUhpdEVDLnNpemUoKSA8PCBzdGQ6OmVuZGw7CisJCUFWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJCX0KKworCQkvLyBjYXNlIG9mIGZvdW5kIHdlYWtseSBoaXQgRUMKKwkJaWYoIG1XZWFrbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCA+IDAgKQorCQl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCUFWTV9PU19DT1VUICA8PCAiPT0+IFJFUVVFVUUgY2FuZGlkYXRlIFsgV2Vha2x5IF0gRmlyZWFibGUgQ291bnQgOj4gIgorCQkJPDwgbVdlYWtseUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50CisJCQk8PCAiICBIaXQgQ291bnQgOiAiIDw8IG1XZWFrbHlIaXRFQy5zaXplKCkgPDwgc3RkOjplbmRsOworCUFWTV9PU19UUkFDRSA8PCAiPT0+IFJFUVVFVUUgY2FuZGlkYXRlIFsgV2Vha2x5IF0gRmlyZWFibGUgQ291bnQgOj4gIgorCQkJPDwgbVdlYWtseUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50CisJCQk8PCAiICBIaXQgQ291bnQgOiAiIDw8IG1XZWFrbHlIaXRFQy5zaXplKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwkJfQorCX0KKwl3aGlsZSggKCgrK2FXZWlnaHRNaW4pIDw9IFdFSUdIVF9OT05fUFJJT1JJVFkpICYmCisvLwl3aGlsZSggKCgrK2FXZWlnaHRNaW4pIDw9IGFXZWlnaHRNYXgpICYmCisJCQkobUNlcnRhaW5seUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50ID09IDApICYmCisJCQkobVN0cm9uZ2x5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQgPT0gMCkgKTsKKworCWlmKCAobUhldXJpc3RpY1Byb3BlcnR5Lm1Db3ZlcmFnZUhlaWdodFJlYWNoZWRDb3VudCA+CisJCQkJbUhldXJpc3RpY1Byb3BlcnR5Lm1Db3ZlcmFnZUhlaWdodFJlYWNoZWRMaW1pdCkgJiYKKwkJKG1DZXJ0YWlubHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCA9PSAwKSAmJgorCQkobVN0cm9uZ2x5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQgPT0gMCkgKQorCXsKKwkJbUhldXJpc3RpY1Byb3BlcnR5Lm1Db3ZlcmFnZUhlaWdodFJlYWNoZWRDb3VudCA9IDA7CisJCW1IZXVyaXN0aWNQcm9wZXJ0eS5tQ292ZXJhZ2VIZWlnaHRSZWFjaGVkRmxhZyA9IGZhbHNlOworCisJCW1IZXVyaXN0aWNQcm9wZXJ0eS5tQ292ZXJhZ2VIZWlnaHQgKz0KKwkJCQltSGV1cmlzdGljUHJvcGVydHkubUNvdmVyYWdlSGVpZ2h0UGVyaW9kOworCisJCW1IZXVyaXN0aWNQcm9wZXJ0eS5tQ292ZXJhZ2VIZWlnaHRSZWFjaGVkQ291bnQgKz0KKwkJCQltSGV1cmlzdGljUHJvcGVydHkubUNvdmVyYWdlSGVpZ2h0UmVhY2hlZENvdW50OworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCUFWTV9PU19DT1VUIDw8ICJSRVFVRVVFIFsgY2hwOiAiIDw8IG1IZXVyaXN0aWNQcm9wZXJ0eS5tQ292ZXJhZ2VIZWlnaHRQZXJpb2QKKwkJCTw8ICIgXSA9PT4gTmV3IENvdmVyYWdlIEhlaWdodCA6PiAiCisJCQk8PCBtSGV1cmlzdGljUHJvcGVydHkubUNvdmVyYWdlSGVpZ2h0IDw8IHN0ZDo6ZW5kbDsKKworCUFWTV9PU19UUkFDRSA8PCAiUkVRVUVVRSBbIGNocDogIiA8PCBtSGV1cmlzdGljUHJvcGVydHkubUNvdmVyYWdlSGVpZ2h0UGVyaW9kCisJCQk8PCAiIF0gPT0+IE5ldyBDb3ZlcmFnZSBIZWlnaHQgOj4gIgorCQkJPDwgbUhldXJpc3RpY1Byb3BlcnR5Lm1Db3ZlcmFnZUhlaWdodCA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKKy8qKgorICogQ29tcHV0ZSBIaXQgV2VpZ3RoIGZvciBFeGVjdXRpb24gQ29udGV4dAorICovCit2b2lkIEF2bUNvdmVyYWdlVHJhbnNpdGlvblZpZXc6OnNldEhpdFdlaWdodChWZWN0b3JPZkV4ZWN1dGlvbkNvbnRleHQgJiBoaXRFQywKKwkJYXZtX3VpbnQ4X3QgaGl0V2VpZ2h0LCBib29sIHJhbmRvbUZsYWcsIGF2bV9zaXplX3QgaGl0Q291bnQpCit7CisJaWYoIHJhbmRvbUZsYWcgJiYgKGhpdENvdW50IDwgaGl0RUMuc2l6ZSgpKSApCisJeworCQltYXhSYW5kb21PZmZzZXQgPSBoaXRFQy5zaXplKCkgLSAxOworCQlyYW5kb21PZmZzZXRCaXRzZXQucmVzZXQoKTsKKwkJcmFuZG9tT2Zmc2V0Qml0c2V0LnJlc2l6ZShtYXhSYW5kb21PZmZzZXQgKyAxLCBmYWxzZSk7CisKKwkJZm9yKCA7IDAgPCBoaXRDb3VudCA7IC0taGl0Q291bnQgKQorCQl7CisJCQlkbworCQkJeworCQkJCW9mZnNldCA9IFJBTkRPTTo6Z2VuX3VpbnQoMCwgbWF4UmFuZG9tT2Zmc2V0KTsKKwkJCX0KKwkJCXdoaWxlKCByYW5kb21PZmZzZXRCaXRzZXRbb2Zmc2V0XSApOworCisJCQlyYW5kb21PZmZzZXRCaXRzZXRbb2Zmc2V0XSA9IHRydWU7CisKKwkJCWhpdEVDWyBvZmZzZXQgXS0+c2V0V2VpZ2h0KCBoaXRXZWlnaHQgKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwlBVk1fT1NfQ09VVCA8PCBzdGQ6OmVuZGwgPDwgREVGQVVMVF9XUkFQX0RBVEEgPDwgIkhJVCA6PiAiOworCWhpdEVDWyBvZmZzZXQgXS0+dHJhY2VNaW5pbXVtKEFWTV9PU19DT1VUKTsgQVZNX09TX0NPVVQgPDwgRU5EX1dSQVA7CisJZmlyZWFibGVUcmFuc2l0aW9uVHJhY2UoQVZNX09TX0NPVVQgLCBoaXRFQ1sgb2Zmc2V0IF0tPnJlZkV4ZWN1dGlvbkRhdGEoKSk7CisKKwlBVk1fT1NfVFJBQ0UgPDwgc3RkOjplbmRsIDw8IERFRkFVTFRfV1JBUF9EQVRBIDw8ICJISVQgOj4gIjsKKwloaXRFQ1sgb2Zmc2V0IF0tPnRyYWNlTWluaW11bShBVk1fT1NfVFJBQ0UpOyBBVk1fT1NfVFJBQ0UgPDwgRU5EX1dSQVA7CisJZmlyZWFibGVUcmFuc2l0aW9uVHJhY2UoQVZNX09TX1RSQUNFLCBoaXRFQ1sgb2Zmc2V0IF0tPnJlZkV4ZWN1dGlvbkRhdGEoKSk7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCQl9CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX0NPVVQgIDw8IHN0ZDo6ZW5kbDsKKwlBVk1fT1NfVFJBQ0UgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwl9CisKKwllbHNlCisJeworCQlpZiggaGl0Q291bnQgPiBoaXRFQy5zaXplKCkgKQorCQl7CisJCQloaXRDb3VudCA9IGhpdEVDLnNpemUoKTsKKwkJfQorCQlmb3IoIG9mZnNldCA9IDAgOyBvZmZzZXQgPCBoaXRDb3VudCA7ICsrb2Zmc2V0ICkKKwkJeworCQkJaGl0RUNbIG9mZnNldCBdLT5zZXRXZWlnaHQoIGhpdFdlaWdodCApOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCUFWTV9PU19DT1VUIDw8IHN0ZDo6ZW5kbCA8PCBERUZBVUxUX1dSQVBfREFUQSA8PCAiSElUIDo+ICI7CisJaGl0RUNbIG9mZnNldCBdLT50cmFjZU1pbmltdW0oQVZNX09TX0NPVVQpOyBBVk1fT1NfQ09VVCA8PCBFTkRfV1JBUDsKKwlmaXJlYWJsZVRyYW5zaXRpb25UcmFjZShBVk1fT1NfQ09VVCAsIGhpdEVDWyBvZmZzZXQgXS0+cmVmRXhlY3V0aW9uRGF0YSgpKTsKKworCUFWTV9PU19UUkFDRSA8PCBzdGQ6OmVuZGwgPDwgREVGQVVMVF9XUkFQX0RBVEEgPDwgIkhJVCA6PiAiOworCWhpdEVDWyBvZmZzZXQgXS0+dHJhY2VNaW5pbXVtKEFWTV9PU19UUkFDRSk7IEFWTV9PU19UUkFDRSA8PCBFTkRfV1JBUDsKKwlmaXJlYWJsZVRyYW5zaXRpb25UcmFjZShBVk1fT1NfVFJBQ0UsIGhpdEVDWyBvZmZzZXQgXS0+cmVmRXhlY3V0aW9uRGF0YSgpKTsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJCX0KKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwlBVk1fT1NfQ09VVCAgPDwgc3RkOjplbmRsOworCUFWTV9PU19UUkFDRSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCisJfQorfQorCisvKgorICogd2VpZ2h0OiAxICBpZiBzb21lIHRyYW5zaXRpb24gb2YgbGVhZiBFQyB3aWxsICBiZSBmaXJlZAorICogd2VpZ2h0OiAyICBpZiBzb21lIHRyYW5zaXRpb24gb2YgbGVhZiBFQyBjb3VsZCBiZSBmaXJlZAorICogd2VpZ2h0OiAzICBlbHNlCisgKi8KK3ZvaWQgQXZtQ292ZXJhZ2VUcmFuc2l0aW9uVmlldzo6Y29tcHV0ZVdlaWdodChFeGVjdXRpb25Db250ZXh0ICogYW5FQykKK3sKKwlzd2l0Y2goIG1IZXVyaXN0aWNQcm9wZXJ0eS5tSGV1cmlzdGljQ2xhc3MgKQorCXsKKwkJY2FzZSBJSGV1cmlzdGljQ2xhc3M6OkhFVVJJU1RJQ19CQVNJQ19DTEFTUzoKKwkJeworLy8JCQljb21wdXRlV2VpZ2h0TmFpdmUoIGFuRUMgKTsKKwkJCWNvbXB1dGVXZWlnaHRTbWFydCggYW5FQyApOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBJSGV1cmlzdGljQ2xhc3M6OkhFVVJJU1RJQ19OQUlWRV9DTEFTUzoKKwkJeworCQkJY29tcHV0ZVdlaWdodE5haXZlKCBhbkVDICk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIElIZXVyaXN0aWNDbGFzczo6SEVVUklTVElDX1NNQVJUX0NMQVNTOgorCQl7CisJCQljb21wdXRlV2VpZ2h0U21hcnQoIGFuRUMgKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBJSGV1cmlzdGljQ2xhc3M6OkhFVVJJU1RJQ19BR1JFU1NJVkVfQ0xBU1M6CisJCXsKKwkJCWNvbXB1dGVXZWlnaHRBZ3Jlc3NpdmUoIGFuRUMgKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBJSGV1cmlzdGljQ2xhc3M6OkhFVVJJU1RJQ19OT1RISU5HX0VMU0VfQ0xBU1M6CisJCWRlZmF1bHQ6CisJCXsKKwkJCWNvbXB1dGVXZWlnaHRTbWFydCggYW5FQyApOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKwordm9pZCBBdm1Db3ZlcmFnZVRyYW5zaXRpb25WaWV3Ojpjb21wdXRlV2VpZ2h0TmFpdmUoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpCit7CisJY29tcHV0ZVByaW9yaXR5V2VpZ2h0KGFuRUMpOworCisJaWYoIGNoZWNrQ2VydGFpbmx5UHJpb3JpdHlXZWlnaHQoYW5FQykgKQorCXsKKwkJcmV0dXJuOworCX0KKworCWVsc2UgaWYoIGNoZWNrTm9uUHJpb3JpdHlXZWlnaHQoYW5FQykgKQorCXsKKwkJcmV0dXJuOworCX0KKworCWVsc2UgaWYoIGNoZWNrU3Ryb25nbHlQcmlvcml0eVdlaWdodChhbkVDKSApCisJeworCQlyZXR1cm47CisJfQorCWVsc2UgaWYoIGNoZWNrV2Vha2x5UHJpb3JpdHlXZWlnaHQoYW5FQykgKQorCXsKKwkJcmV0dXJuOworCX0KKwllbHNlCisJeworCQlhbkVDLT5zZXRXZWlnaHQoIFdFSUdIVF9VTktOT1dOX0FDSElFVkFCTEUgKTsKKwl9Cit9CisKKwordm9pZCBBdm1Db3ZlcmFnZVRyYW5zaXRpb25WaWV3Ojpjb21wdXRlV2VpZ2h0U21hcnQoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpCit7CisJY29tcHV0ZVByaW9yaXR5V2VpZ2h0KGFuRUMpOworCisJaWYoIGNoZWNrQ2VydGFpbmx5UHJpb3JpdHlXZWlnaHQoYW5FQykgKQorCXsKKwkJcmV0dXJuOworCX0KKworCWlmKCBjaGVja1N0cm9uZ2x5UHJpb3JpdHlXZWlnaHQoYW5FQykgKQorCXsKKwkJcmV0dXJuOworCX0KKworCWVsc2UgaWYoIGNoZWNrTm9uUHJpb3JpdHlXZWlnaHQoYW5FQykgKQorCXsKKwkJcmV0dXJuOworCX0KKworCWVsc2UgaWYoIGNoZWNrV2Vha2x5UHJpb3JpdHlXZWlnaHQoYW5FQykgKQorCXsKKwkJcmV0dXJuOworCX0KKwllbHNlCisJeworCQlhbkVDLT5zZXRXZWlnaHQoIFdFSUdIVF9VTktOT1dOX0FDSElFVkFCTEUgKTsKKwl9Cit9CisKKwordm9pZCBBdm1Db3ZlcmFnZVRyYW5zaXRpb25WaWV3Ojpjb21wdXRlV2VpZ2h0QWdyZXNzaXZlKEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDKQoreworCWNvbXB1dGVQcmlvcml0eVdlaWdodChhbkVDKTsKKworCWlmKCBjaGVja0NlcnRhaW5seVByaW9yaXR5V2VpZ2h0KGFuRUMpICkKKwl7CisJCXJldHVybjsKKwl9CisKKwlpZiggY2hlY2tTdHJvbmdseVByaW9yaXR5V2VpZ2h0KGFuRUMpICkKKwl7CisJCXJldHVybjsKKwl9CisJZWxzZSBpZiggY2hlY2tXZWFrbHlQcmlvcml0eVdlaWdodChhbkVDKSApCisJeworCQlyZXR1cm47CisJfQorCWVsc2UKKwl7CisJCWFuRUMtPnNldFdlaWdodCggV0VJR0hUX1VOS05PV05fQUNISUVWQUJMRSApOworCX0KK30KKworCitib29sIEF2bUNvdmVyYWdlVHJhbnNpdGlvblZpZXc6OmNoZWNrTm9uUHJpb3JpdHlXZWlnaHQoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpCit7CisJaWYoIGFuRUMtPmdldEhlaWdodCgpID4gbUhldXJpc3RpY1Byb3BlcnR5Lm1Db3ZlcmFnZUhlaWdodCApCisJeworCQltSGV1cmlzdGljUHJvcGVydHkubUNvdmVyYWdlSGVpZ2h0UmVhY2hlZEZsYWcgPSB0cnVlOworCisJCWFuRUMtPnNldFdlaWdodCggV0VJR0hUX05PTl9QUklPUklUWSApOworCisJCXJldHVybiggdHJ1ZSApOworCX0KKwllbHNlIGlmKCBhbkVDLT5nZXRXZWlnaHQoKSAhPSBXRUlHSFRfTk9OX1BSSU9SSVRZICkKKwl7CisJCWlmKCBpc1RyaXZpYWxMb29wKGFuRUMpICkKKwkJeworCQkJYW5FQy0+c2V0V2VpZ2h0KCBXRUlHSFRfTk9OX0FDSElFVkFCTEUgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworLy8JCWlmKCBpc1N5bnRheGljTG9vcChhbkVDKSApCisvLwkJeworLy8JCQlhbkVDLT5zZXRXZWlnaHQoIFdFSUdIVF9OT05fQUNISUVWQUJMRSApOworLy8KKy8vCQkJcmV0dXJuKCB0cnVlICk7CisvLwkJfQorCisJCWVsc2UgaWYoIGlzQ29udHJvbExvb3AoYW5FQykgKQorCQl7CisJCQlhbkVDLT5zZXRXZWlnaHQoIFdFSUdIVF9OT05fUFJJT1JJVFkgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKwordm9pZCBBdm1Db3ZlcmFnZVRyYW5zaXRpb25WaWV3Ojpjb21wdXRlUHJpb3JpdHlXZWlnaHQoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpCit7CisJdG1wQ2VydGFpbmx5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQgPSAwOworCXRtcFN0cm9uZ2x5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQgPSAwOworCXRtcFdlYWtseUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50ID0gMDsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX0NPVVQgIDw8ICI6PiBmcm9tICI7ICBhbkVDLT50cmFjZU1pbmltdW0oQVZNX09TX0NPVVQpOworCUFWTV9PU19UUkFDRSA8PCAiOj4gZnJvbSAiOyAgYW5FQy0+dHJhY2VNaW5pbXVtKEFWTV9PU19UUkFDRSk7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKworCS8vIGNvbXB1dGUgOj4KKy8vCWZpcmVhYmxlVHJhbnNpdGlvbkNvdW50KCBhbkVDLT5nZXRBUEV4ZWN1dGlvbkRhdGEoKSApOworCWZpcmVhYmxlVHJhbnNpdGlvbkNvdW50KCBhbkVDLT5yZWZFeGVjdXRpb25EYXRhKCkgLAorCQkJYW5FQy0+cmVmRXhlY3V0aW9uRGF0YSgpLmdldFN5c3RlbVJ1bnRpbWUoKSApOworfQorCisKKworYm9vbCBBdm1Db3ZlcmFnZVRyYW5zaXRpb25WaWV3OjpjaGVja0NlcnRhaW5seVByaW9yaXR5V2VpZ2h0KAorCQlFeGVjdXRpb25Db250ZXh0ICogYW5FQykKK3sKKwlpZiggdG1wQ2VydGFpbmx5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQgPiAwICkKKwl7CisJCWFuRUMtPnNldFdlaWdodCggV0VJR0hUX1NFTEVDVEVEX0FDSElFVkFCTEUgKTsKKworCQlpZiggbUNlcnRhaW5seUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50IDwKKwkJCQl0bXBDZXJ0YWlubHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCApCisJCXsKKwkJCW1DZXJ0YWlubHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCA9CisJCQkJCXRtcENlcnRhaW5seUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50OworCisJCQltQ2VydGFpbmx5SGl0RUMuY2xlYXIoKTsKKwkJCW1DZXJ0YWlubHlIaXRFQy5hcHBlbmQoIGFuRUMgKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX0NPVVQgIDw8ICI9PT4gSElUIEVDIFsgQ2VydGFpbiA6ICIKKwkJCTw8IG1DZXJ0YWlubHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCA8PCAiIF06PiAiOworCWFuRUMtPnRyYWNlTWluaW11bShBVk1fT1NfQ09VVCk7CisJQVZNX09TX0NPVVQgPDwgc3RkOjpmbHVzaDsKKworCUFWTV9PU19UUkFDRSA8PCAiPT0+IEhJVCBFQyBbIENlcnRhaW4gOiAiCisJCQk8PCBtQ2VydGFpbmx5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQgPDwgIiBdOj4gIjsKKwlhbkVDLT50cmFjZU1pbmltdW0oQVZNX09TX1RSQUNFKTsKKwlBVk1fT1NfVFJBQ0UgPDwgc3RkOjpmbHVzaDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWVsc2UgaWYoIG1DZXJ0YWlubHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCA9PQorCQkJCXRtcENlcnRhaW5seUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50ICkKKwkJeworCQkJbUNlcnRhaW5seUhpdEVDLmFwcGVuZCggYW5FQyApOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwlBVk1fT1NfQ09VVCAgPDwgIj09PiBISVQgRUMgWyBDZXJ0YWluIDogIgorCQkJPDwgbUNlcnRhaW5seUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50IDw8ICIgXTo+ICI7CisJYW5FQy0+dHJhY2VNaW5pbXVtKEFWTV9PU19DT1VUKTsKKwlBVk1fT1NfQ09VVCA8PCBzdGQ6OmZsdXNoOworCisJQVZNX09TX1RSQUNFIDw8ICI9PT4gSElUIEVDIFsgQ2VydGFpbiA6ICIKKwkJCTw8IG1DZXJ0YWlubHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCA8PCAiIF06PiAiOworCWFuRUMtPnRyYWNlTWluaW11bShBVk1fT1NfVFJBQ0UpOworCUFWTV9PU19UUkFDRSA8PCBzdGQ6OmZsdXNoOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJCX0KKworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKworYm9vbCBBdm1Db3ZlcmFnZVRyYW5zaXRpb25WaWV3OjpjaGVja1N0cm9uZ2x5UHJpb3JpdHlXZWlnaHQoCisJCUV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDKQoreworCWlmKCB0bXBTdHJvbmdseUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50ID4gMCApCisJeworCQlhbkVDLT5zZXRXZWlnaHQoIFdFSUdIVF9TVFJPTkdMWV9BQ0hJRVZBQkxFICk7CisKKwkJaWYoIG1TdHJvbmdseUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50IDwKKwkJCQl0bXBTdHJvbmdseUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50ICkKKwkJeworCQkJbVN0cm9uZ2x5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQgPQorCQkJCQl0bXBTdHJvbmdseUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50OworCisJCQltU3Ryb25nbHlIaXRFQy5jbGVhcigpOworCQkJbVN0cm9uZ2x5SGl0RUMuYXBwZW5kKCBhbkVDICk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCUFWTV9PU19DT1VUICA8PCAiPT0+IEhJVCBFQyBbIFN0cm9uZyA6ICIKKwkJCTw8IG1TdHJvbmdseUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50IDw8ICIgXTo+ICI7CisJYW5FQy0+dHJhY2VNaW5pbXVtKEFWTV9PU19DT1VUKTsKKwlBVk1fT1NfQ09VVCA8PCBzdGQ6OmZsdXNoOworCisJQVZNX09TX1RSQUNFIDw8ICI9PT4gSElUIEVDIFsgU3Ryb25nIDogIgorCQkJPDwgbVN0cm9uZ2x5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQgPDwgIiBdOj4gIjsKKwlhbkVDLT50cmFjZU1pbmltdW0oQVZNX09TX1RSQUNFKTsKKwlBVk1fT1NfVFJBQ0UgPDwgc3RkOjpmbHVzaDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWVsc2UgaWYoIG1TdHJvbmdseUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50ID09CisJCQkJdG1wU3Ryb25nbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCApCisJCXsKKwkJCW1TdHJvbmdseUhpdEVDLmFwcGVuZCggYW5FQyApOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwlBVk1fT1NfQ09VVCAgPDwgIj09PiBISVQgRUMgWyBTdHJvbmcgOiAiCisJCQk8PCBtU3Ryb25nbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCA8PCAiIF06PiAiOworCWFuRUMtPnRyYWNlTWluaW11bShBVk1fT1NfQ09VVCk7CisJQVZNX09TX0NPVVQgPDwgc3RkOjpmbHVzaDsKKworCUFWTV9PU19UUkFDRSA8PCAiPT0+IEhJVCBFQyBbIFN0cm9uZyA6ICIKKwkJCTw8IG1TdHJvbmdseUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50IDw8ICIgXTo+ICI7CisJYW5FQy0+dHJhY2VNaW5pbXVtKEFWTV9PU19UUkFDRSk7CisJQVZNX09TX1RSQUNFIDw8IHN0ZDo6Zmx1c2g7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwkJfQorCisJCXJldHVybiggdHJ1ZSApOworCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKworCitib29sIEF2bUNvdmVyYWdlVHJhbnNpdGlvblZpZXc6OmNoZWNrV2Vha2x5UHJpb3JpdHlXZWlnaHQoCisJCUV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDKQoreworCWlmKCB0bXBXZWFrbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCA+IDAgKQorCXsKKwkJYW5FQy0+c2V0V2VpZ2h0KCBXRUlHSFRfV0VBS0xZX0FDSElFVkFCTEUgKTsKKworCQlpZiggbVdlYWtseUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50IDwKKwkJCQl0bXBXZWFrbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCApCisJCXsKKwkJCW1XZWFrbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCA9CisJCQkJCXRtcFdlYWtseUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50OworCisJCQltV2Vha2x5SGl0RUMuY2xlYXIoKTsKKwkJCW1XZWFrbHlIaXRFQy5hcHBlbmQoIGFuRUMgKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX0NPVVQgIDw8ICI9PT4gSElUIEVDIFsgV2VhayA6ICIKKwkJCTw8IG1XZWFrbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCA8PCAiIF06PiAiOworCWFuRUMtPnRyYWNlTWluaW11bShBVk1fT1NfQ09VVCk7CisJQVZNX09TX0NPVVQgPDwgc3RkOjpmbHVzaDsKKworCUFWTV9PU19UUkFDRSA8PCAiPT0+IEhJVCBFQyBbIFdlYWsgOiAiCisJCQk8PCBtV2Vha2x5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQgPDwgIiBdOj4gIjsKKwlhbkVDLT50cmFjZU1pbmltdW0oQVZNX09TX1RSQUNFKTsKKwlBVk1fT1NfVFJBQ0UgPDwgc3RkOjpmbHVzaDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWVsc2UgaWYoIG1XZWFrbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCA9PQorCQkJCXRtcFdlYWtseUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50ICkKKwkJeworCQkJbVdlYWtseUhpdEVDLmFwcGVuZCggYW5FQyApOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwlBVk1fT1NfQ09VVCAgPDwgIj09PiBISVQgRUMgWyBXZWFrIDogIgorCQkJPDwgbVdlYWtseUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50IDw8ICIgXTo+ICI7CisJYW5FQy0+dHJhY2VNaW5pbXVtKEFWTV9PU19DT1VUKTsKKwlBVk1fT1NfQ09VVCA8PCBzdGQ6OmZsdXNoOworCisJQVZNX09TX1RSQUNFIDw8ICI9PT4gSElUIEVDIFsgV2VhayA6ICIKKwkJCTw8IG1XZWFrbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCA8PCAiIF06PiAiOworCWFuRUMtPnRyYWNlTWluaW11bShBVk1fT1NfVFJBQ0UpOworCUFWTV9PU19UUkFDRSA8PCBzdGQ6OmZsdXNoOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJCX0KKworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKwordm9pZCBBdm1Db3ZlcmFnZVRyYW5zaXRpb25WaWV3Ojpjb21wdXRlV2VpZ2h0T2ZSZXN1bHQoCisJCWNvbnN0IExpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBlY1F1ZXVlKQoreworCW1DZXJ0YWlubHlIaXRFQy5jbGVhcigpOworCW1DZXJ0YWlubHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCA9IDA7CisKKwltU3Ryb25nbHlIaXRFQy5jbGVhcigpOworCW1TdHJvbmdseUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50ID0gMDsKKworCW1XZWFrbHlIaXRFQy5jbGVhcigpOworCW1XZWFrbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCA9IDA7CisKKwlMaXN0T2ZFeGVjdXRpb25Db250ZXh0Ojpjb25zdF9pdGVyYXRvciBlY1F1ZXVlSXQgPSBlY1F1ZXVlLmJlZ2luKCk7CisJTGlzdE9mRXhlY3V0aW9uQ29udGV4dDo6Y29uc3RfaXRlcmF0b3IgZWNRdWV1ZUl0RW5kID0gZWNRdWV1ZS5lbmQoKTsKKwlmb3IoIDsgZWNRdWV1ZUl0ICE9IGVjUXVldWVJdEVuZCA7ICsrZWNRdWV1ZUl0ICkKKwl7CisJCWVuZEVDID0gKCplY1F1ZXVlSXQpLT5lbmQoKTsKKwkJZm9yKCBpdEVDID0gKCplY1F1ZXVlSXQpLT5iZWdpbigpIDsgKGl0RUMgIT0gZW5kRUMpIDsgKytpdEVDICkKKwkJeworCQkJY29tcHV0ZVdlaWdodCggKml0RUMgKTsKKworLy9BVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorLy8JaWYoICgqaXRFQyktPmdldFdlaWdodCgpID09IFdFSUdIVF9DRVJUQUlOTFlfQUNISUVWQUJMRSApCisvLwl7CisvLwkJZmlyZWFibGVUcmFuc2l0aW9uVHJhY2UoQVZNX09TX0NPVVQgLCAoKml0RUMpLT5nZXRBUEV4ZWN1dGlvbkRhdGEoKSk7CisvLwkJZmlyZWFibGVUcmFuc2l0aW9uVHJhY2UoQVZNX09TX1RSQUNFLCAoKml0RUMpLT5nZXRBUEV4ZWN1dGlvbkRhdGEoKSk7CisvLwl9CisvL0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJCX0KKwl9CisKKwkvLyBDb3VudCBvbmUgdGltZSBwZXIgc3RlcCBDb3ZlcmFnZUhlaWdodFJlYWNoZWQKKwlpZiggbUhldXJpc3RpY1Byb3BlcnR5Lm1Db3ZlcmFnZUhlaWdodFJlYWNoZWRGbGFnICkKKwl7CisJCSsrbUhldXJpc3RpY1Byb3BlcnR5Lm1Db3ZlcmFnZUhlaWdodFJlYWNoZWRDb3VudDsKKworCQltSGV1cmlzdGljUHJvcGVydHkubUNvdmVyYWdlSGVpZ2h0UmVhY2hlZEZsYWcgPSBmYWxzZTsKKwl9Cit9CisKKworYXZtX3VpbnQ4X3QgQXZtQ292ZXJhZ2VUcmFuc2l0aW9uVmlldzo6Y2hlY2tGaXJlYWJpbGl0eSgKKwkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsCisJCUF2bVRyYW5zaXRpb24gKiBhVHJhbnNpdGlvbikKK3sKKwlpZiggYVRyYW5zaXRpb24tPmhhc0NvZGUoKSAmJiBhVHJhbnNpdGlvbi0+Z2V0Q29kZSgpLT5ub25lbXB0eSgpICYmCisJCQlhVHJhbnNpdGlvbi0+Z2V0Q29kZSgpLT5maXJzdCgpLmlzPCBBdm1Db2RlID4oKSApCisJeworCQljb25zdCBBdm1Db2RlICogZmlyc3RTdGF0ZW1lbnQgPQorCQkJCWFUcmFuc2l0aW9uLT5nZXRDb2RlKCktPmZpcnN0KCkudG9fcHRyPCBBdm1Db2RlID4oKTsKKworCQlzd2l0Y2goIGZpcnN0U3RhdGVtZW50LT5nZXRPcHRpbWl6ZWRPcENvZGUoKSApCisJCXsKKwkJCWNhc2UgQVZNX09QQ09ERV9JTlBVVF9FTlY6CisJCQljYXNlIEFWTV9PUENPREVfT1VUUFVUX0VOVjoKKwkJCXsKKwkJCQlpZiggYVRyYW5zaXRpb24tPmlzU3RhdGVtZW50QmFzaWNGYW1pbHkoKSApCisJCQkJeworCQkJCQlyZXR1cm4oIFdFSUdIVF9DRVJUQUlOTFlfQUNISUVWQUJMRSApOworCQkJCX0KKwkJCQllbHNlIGlmKCBhVHJhbnNpdGlvbi0+aGFzQ29uZGl0aW9uYWxDb21TdGF0ZW1lbnRGYW1pbHkoKSApCisJCQkJeworCQkJCQlyZXR1cm4oIFdFSUdIVF9XRUFLTFlfQUNISUVWQUJMRSApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlyZXR1cm4oIFdFSUdIVF9TVFJPTkdMWV9BQ0hJRVZBQkxFICk7CisJCQkJfQorCQkJfQorCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQlpZiggZmlyc3RTdGF0ZW1lbnQtPmlzT3BDb2RlKCBBVk1fT1BDT0RFX0lOUFVUICkgJiYKKwkJCQkJZmlyc3RTdGF0ZW1lbnQtPmZpcnN0KCkuaXM8IEluc3RhbmNlT2ZQb3J0ID4oKSApCisJCQkJeworCQkJCQlpZiggQXZtQ29tbXVuaWNhdGlvbkZhY3Rvcnk6OmNvbXB1dGVQcmVzZW5jZShhbkVELCBhUklELAorCQkJCQkJCWZpcnN0U3RhdGVtZW50LT5maXJzdCgpLnRvX3B0cjwgSW5zdGFuY2VPZlBvcnQgPigpKSApCisJCQkJCXsKKwkJCQkJCWlmKCBhVHJhbnNpdGlvbi0+aGFzU3RhdGVtZW50R3VhcmRGYW1pbHkoKSApCisJCQkJCQl7CisJCQkJCQkJcmV0dXJuKCBXRUlHSFRfU1RST05HTFlfQUNISUVWQUJMRSApOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCXJldHVybiggV0VJR0hUX0NFUlRBSU5MWV9BQ0hJRVZBQkxFICk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlyZXR1cm4oIFdFSUdIVF9XRUFLTFlfQUNISUVWQUJMRSApOworCQkJCQl9CisJCQkJfQorCisJCQkJZWxzZSBpZiggYVRyYW5zaXRpb24tPmlzU3RhdGVtZW50QmFzaWNGYW1pbHkoKSApCisJCQkJeworCQkJCQlyZXR1cm4oIFdFSUdIVF9DRVJUQUlOTFlfQUNISUVWQUJMRSApOworCQkJCX0KKwkJCQllbHNlIGlmKCBhVHJhbnNpdGlvbi0+aGFzQ29uZGl0aW9uYWxDb21TdGF0ZW1lbnRGYW1pbHkoKSApCisJCQkJeworCQkJCQlyZXR1cm4oIFdFSUdIVF9TVFJPTkdMWV9BQ0hJRVZBQkxFICk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuKCBXRUlHSFRfU0VMRUNURURfQUNISUVWQUJMRSApOworfQorCisKK3ZvaWQgQXZtQ292ZXJhZ2VUcmFuc2l0aW9uVmlldzo6Y29tcHV0ZUZpcmVhYmlsaXR5KGNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVELAorCQljb25zdCBSdW50aW1lSUQgJiBhUklELCBBdm1UcmFuc2l0aW9uICogYVRyYW5zaXRpb24pCit7CisJc3dpdGNoKCBjaGVja0ZpcmVhYmlsaXR5KGFuRUQsIGFSSUQsIGFUcmFuc2l0aW9uKSApCisJeworCQljYXNlIFdFSUdIVF9DRVJUQUlOTFlfQUNISUVWQUJMRToKKwkJeworCQkJdG1wQ2VydGFpbmx5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQgKz0gMTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX0NPVVQgIDw8ICI9PT4gRmlyZWFibGUgWyBDZXJ0YWlubHkgXSA6PiAiCisJCQk8PCBhVHJhbnNpdGlvbi0+c3RyVHJhbnNpdGlvbkhlYWRlcigpIDw8IHN0ZDo6ZW5kbDsKKwlBVk1fT1NfVFJBQ0UgPDwgIj09PiBGaXJlYWJsZSBbIENlcnRhaW5seSBdIDo+ICIKKwkJCTw8IGFUcmFuc2l0aW9uLT5zdHJUcmFuc2l0aW9uSGVhZGVyKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBXRUlHSFRfU1RST05HTFlfQUNISUVWQUJMRToKKwkJeworCQkJdG1wU3Ryb25nbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCArPSAxOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwlBVk1fT1NfQ09VVCAgPDwgIj09PiBGaXJlYWJsZSBbIFN0cm9uZ2x5IF0gOj4gIgorCQkJPDwgYVRyYW5zaXRpb24tPnN0clRyYW5zaXRpb25IZWFkZXIoKSA8PCBzdGQ6OmVuZGw7CisJQVZNX09TX1RSQUNFIDw8ICI9PT4gRmlyZWFibGUgWyBTdHJvbmdseSBdIDo+ICIKKwkJCTw8IGFUcmFuc2l0aW9uLT5zdHJUcmFuc2l0aW9uSGVhZGVyKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBXRUlHSFRfV0VBS0xZX0FDSElFVkFCTEU6CisJCWRlZmF1bHQ6CisJCXsKKwkJCXRtcFdlYWtseUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50ICs9IDE7CisJCX0KKwl9Cit9CisKKwordm9pZCBBdm1Db3ZlcmFnZVRyYW5zaXRpb25WaWV3Ojp0cmFjZUZpcmVhYmlsaXR5KAorCQlPdXRTdHJlYW0gJiBvcywgY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQsCisJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsIEF2bVRyYW5zaXRpb24gKiBhVHJhbnNpdGlvbikKK3sKKwlzd2l0Y2goIGNoZWNrRmlyZWFiaWxpdHkoYW5FRCwgYVJJRCwgYVRyYW5zaXRpb24pICkKKwl7CisJCWNhc2UgV0VJR0hUX0NFUlRBSU5MWV9BQ0hJRVZBQkxFOgorCQl7CisJCQlvcyA8PCAiPT0+IFsgQ2VydGFpbmx5IF0gRmlyZWFibGUgOj4gIgorCQkJCQk8PCBhVHJhbnNpdGlvbi0+c3RyVHJhbnNpdGlvbkhlYWRlcigpCisJCQkJCTw8IHN0ZDo6ZW5kbDsKKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFdFSUdIVF9TVFJPTkdMWV9BQ0hJRVZBQkxFOgorCQl7CisJCQlvcyA8PCAiPT0+IFsgU3Ryb25nbHkgXSBGaXJlYWJsZSA6PiAiCisJCQkJCTw8IGFUcmFuc2l0aW9uLT5zdHJUcmFuc2l0aW9uSGVhZGVyKCkKKwkJCQkJPDwgc3RkOjplbmRsOworCisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgV0VJR0hUX1dFQUtMWV9BQ0hJRVZBQkxFOgorCQlkZWZhdWx0OgorCQl7CisJCQlvcyA8PCAiPT0+IFsgV2Vha2x5IF0gRmlyZWFibGUgOj4gIgorCQkJCQk8PCBhVHJhbnNpdGlvbi0+c3RyVHJhbnNpdGlvbkhlYWRlcigpCisJCQkJCTw8IHN0ZDo6ZW5kbDsKKwkJfQorCX0KK30KKworCitib29sIEF2bUNvdmVyYWdlVHJhbnNpdGlvblZpZXc6OmlzQ29udHJvbExvb3AoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpCit7CisJZm9yKCB0bXBFQyA9IGFuRUMtPmdldFByZXZpb3VzKCkgOyB0bXBFQyAhPSBOVUxMIDsgdG1wRUMgPSB0bXBFQy0+Z2V0UHJldmlvdXMoKSApCisJeworCQlpZiggYW5FQy0+cmVmRXhlY3V0aW9uRGF0YSgpLmdldFJ1bnRpbWVGb3JtU3RhdGVUYWJsZSgpLT5lcXVhbHNTdGF0ZSgKKwkJCQl0bXBFQy0+cmVmRXhlY3V0aW9uRGF0YSgpLmdldFJ1bnRpbWVGb3JtU3RhdGVUYWJsZSgpICkgKQorCQl7CisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCX0KKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKworYm9vbCBBdm1Db3ZlcmFnZVRyYW5zaXRpb25WaWV3Ojppc1N5bnRheGljTG9vcChFeGVjdXRpb25Db250ZXh0ICogYW5FQykKK3sKKwl0bXBFQyA9IGFuRUMtPmdldFByZXZpb3VzKCk7CisJZm9yKCA7IHRtcEVDICE9IE5VTEwgOyB0bXBFQyA9IHRtcEVDLT5nZXRQcmV2aW91cygpICkKKwl7CisJCWlmKCBhbkVDLT5yZWZFeGVjdXRpb25EYXRhKCkuZ2V0UnVudGltZUZvcm1TdGF0ZVRhYmxlKCktPmVxdWFsc1N0YXRlKAorCQkJCXRtcEVDLT5yZWZFeGVjdXRpb25EYXRhKCkuZ2V0UnVudGltZUZvcm1TdGF0ZVRhYmxlKCkgKSApCisJCXsKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisJfQorCXJldHVybiggZmFsc2UgKTsKK30KKworCitib29sIEF2bUNvdmVyYWdlVHJhbnNpdGlvblZpZXc6OmlzVHJpdmlhbExvb3AoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpCit7CisJdG1wRUMgPSBhbkVDLT5nZXRQcmV2aW91cygpOworCWZvciggOyB0bXBFQyAhPSBOVUxMIDsgdG1wRUMgPSB0bXBFQy0+Z2V0UHJldmlvdXMoKSApCisJeworCQlpZiggYW5FQy0+cmVmRXhlY3V0aW9uRGF0YSgpLmlzVEVRKCB0bXBFQy0+Z2V0RXhlY3V0aW9uRGF0YSgpICkgKQorCQl7CisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCX0KKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKwordm9pZCBBdm1Db3ZlcmFnZVRyYW5zaXRpb25WaWV3OjpmaXJlYWJsZVRyYW5zaXRpb25Db3VudCgKKwkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQpCit7CisJdG1wRUYgPSBhUklELmdldEV4ZWN1dGFibGUoKTsKKworCXRtcFJ1bnRpbWVUcmFuc2l0aW9uQml0c2V0ID0gZ2V0Q292ZXJhZ2VUYWJsZUJpdHNldCggYVJJRCApOworCisJaWYoIHRtcFJ1bnRpbWVUcmFuc2l0aW9uQml0c2V0ID09IE5VTEwgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCS8vdG1wRUYtPmhhc1RyYW5zaXRpb24oKQorCWVsc2UgaWYoIHRtcFJ1bnRpbWVUcmFuc2l0aW9uQml0c2V0LT5hbnlGYWxzZSgpICkKKwl7CisJCUF2bVRyYW5zaXRpb24gKiBhVHJhbnNpdGlvbjsKKworCQlhdm1fc2l6ZV90IGVuZE9mZnNldCA9IHRtcEVGLT5nZXRUcmFuc2l0aW9uKCkuc2l6ZSgpOworCQlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMCA7IG9mZnNldCA8IGVuZE9mZnNldCA7ICsrb2Zmc2V0ICkKKwkJeworCQkJYVRyYW5zaXRpb24gPSB0bXBFRi0+Z2V0VHJhbnNpdGlvbigpLnJhd0F0KG9mZnNldCk7CisKKwkJCWlmKCBub3QgdG1wUnVudGltZVRyYW5zaXRpb25CaXRzZXQtPnRlc3QoYVRyYW5zaXRpb24tPmdldE9mZnNldCgpKSApCisJCQl7CisJCQkJY29tcHV0ZUZpcmVhYmlsaXR5KGFuRUQsIGFSSUQsIGFUcmFuc2l0aW9uKTsKKwkJCX0KKwkJfQorCX0KKworLy8JZWxzZSBpZiggdG1wUnVudGltZVRyYW5zaXRpb25CaXRzZXQtPmFsbFRydWUoKSApCisvLwl7CisvLwkJYW5FRC5zZXRSdW50aW1lRm9ybVN0YXRlKGl0UklELCBQUk9DRVNTX1NVU1BFTkRFRF9TVEFURSk7CisvLwl9Cit9CisKKwordm9pZCBBdm1Db3ZlcmFnZVRyYW5zaXRpb25WaWV3OjpmaXJlYWJsZVRyYW5zaXRpb25Db3VudCgKKwkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQpCit7CisJYXZtX3NpemVfdCBvZmZzZXQ7CisJYXZtX3NpemVfdCBlbmRPZmZzZXQ7CisJQXZtVHJhbnNpdGlvbiAqIGFUcmFuc2l0aW9uOworCisJaXRSRiA9IGFuRUQuZ2V0VGFibGVPZlJ1bnRpbWUoKS5iZWdpbigpOworCWVuZFJGID0gYW5FRC5nZXRUYWJsZU9mUnVudGltZSgpLmVuZCgpOworCWZvciggOyAoaXRSRiAhPSBlbmRSRikgOyArK2l0UkYgKQorCXsKKwkJaXRSSUQgPSAoKml0UkYpLT5nZXRSSUQoKTsKKworCQlpZiggbm90IGFuRUQuaXNJZGxlT3JSdW5uaW5nKCBpdFJJRCApICkKKwkJeworCQkJY29udGludWU7CisJCX0KKworCQl0bXBFRiA9IGl0UklELmdldEV4ZWN1dGFibGUoKTsKKworCQl0bXBSdW50aW1lVHJhbnNpdGlvbkJpdHNldCA9IGdldENvdmVyYWdlVGFibGVCaXRzZXQoIGl0UklEICk7CisKKwkJaWYoIHRtcFJ1bnRpbWVUcmFuc2l0aW9uQml0c2V0ID09IE5VTEwgKQorCQl7CisJCQkvLyEhIE5PVEhJTkcKKwkJfQorCQkvL3RtcEVGLT5oYXNUcmFuc2l0aW9uKCkKKwkJZWxzZSBpZiggYW5FRC5pc0lkbGVPclJ1bm5pbmcoIGl0UklEICkgJiYKKwkJCQl0bXBSdW50aW1lVHJhbnNpdGlvbkJpdHNldC0+YW55RmFsc2UoKSApCisJCXsKKwkJCWVuZE9mZnNldCA9IHRtcEVGLT5nZXRUcmFuc2l0aW9uKCkuc2l6ZSgpOworCQkJZm9yKCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgZW5kT2Zmc2V0IDsgKytvZmZzZXQgKQorCQkJeworCQkJCWFUcmFuc2l0aW9uID0gdG1wRUYtPmdldFRyYW5zaXRpb24oKS5yYXdBdChvZmZzZXQpOworCisJCQkJaWYoIG5vdCB0bXBSdW50aW1lVHJhbnNpdGlvbkJpdHNldC0+CisJCQkJCQl0ZXN0KGFUcmFuc2l0aW9uLT5nZXRPZmZzZXQoKSkgKQorCQkJCXsKKwkJCQkJY29tcHV0ZUZpcmVhYmlsaXR5KGFuRUQsIGl0UklELCBhVHJhbnNpdGlvbik7CisJCQkJfQorCQkJfQorCQl9CisKKy8vCQllbHNlIGlmKCB0bXBSdW50aW1lVHJhbnNpdGlvbkJpdHNldC0+YWxsVHJ1ZSgpICkKKy8vCQl7CisvLwkJCWFuRUQuc2V0UnVudGltZUZvcm1TdGF0ZShpdFJJRCwgUFJPQ0VTU19TVVNQRU5ERURfU1RBVEUpOworLy8JCX0KKworCX0KK30KKworCit2b2lkIEF2bUNvdmVyYWdlVHJhbnNpdGlvblZpZXc6OmZpcmVhYmxlVHJhbnNpdGlvbkNvdW50KAorCQljb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwgY29uc3QgUnVudGltZUZvcm0gJiBhUkYpCit7CisJaWYoIG5vdCBhbkVELmlzSWRsZU9yUnVubmluZyggYVJGLmdldFJJRCgpICkgKQorCXsKKwkJcmV0dXJuOworCX0KKworCXRtcEVGID0gYVJGLmdldFJJRCgpLmdldEV4ZWN1dGFibGUoKTsKKworCWlmKCB0bXBFRi0+aGFzVHJhbnNpdGlvbigpICkKKwl7CisJCXRtcFJ1bnRpbWVUcmFuc2l0aW9uQml0c2V0ID0gZ2V0Q292ZXJhZ2VUYWJsZUJpdHNldCggYVJGLmdldFJJRCgpICk7CisKKwkJaWYoIHRtcFJ1bnRpbWVUcmFuc2l0aW9uQml0c2V0LT5hbnlGYWxzZSgpICkKKwkJeworCQkJQXZtVHJhbnNpdGlvbiAqIGF0cmFuc2l0aW9uID0gTlVMTDsKKworCQkJYXZtX3NpemVfdCBlbmRPZmZzZXQgPSB0bXBFRi0+Z2V0VHJhbnNpdGlvbigpLnNpemUoKTsKKwkJCWZvciggYXZtX3NpemVfdCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgZW5kT2Zmc2V0IDsgKytvZmZzZXQgKQorCQkJeworCQkJCWF0cmFuc2l0aW9uID0gdG1wRUYtPmdldFRyYW5zaXRpb24oKS5yYXdBdChvZmZzZXQpOworCisJCQkJaWYoIG5vdCB0bXBSdW50aW1lVHJhbnNpdGlvbkJpdHNldC0+dGVzdChhdHJhbnNpdGlvbi0+Z2V0T2Zmc2V0KCkpICkKKwkJCQl7CisJCQkJCWNvbXB1dGVGaXJlYWJpbGl0eShhbkVELCAgYVJGLmdldFJJRCgpLCBhdHJhbnNpdGlvbik7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYoIGFSRi5oYXNDaGlsZCgpICkKKwl7CisJCVRhYmxlT2ZSdW50aW1lSUQ6OmNvbnN0X2l0ZXJhdG9yIGl0UklEID0gYVJGLmJlZ2luQ2hpbGQoKTsKKwkJVGFibGVPZlJ1bnRpbWVJRDo6Y29uc3RfaXRlcmF0b3IgaXRSSURFbmQgPSBhUkYuZW5kQ2hpbGQoKTsKKworCQlmb3IoIDsgaXRSSUQgIT0gaXRSSURFbmQgOyArK2l0UklEICkKKwkJeworCQkJaWYoIGFuRUQuaXNJZGxlT3JSdW5uaW5nKCAqaXRSSUQgKSApCisJCQl7CisJCQkJZmlyZWFibGVUcmFuc2l0aW9uQ291bnQoYW5FRCwgYW5FRC5nZXRSdW50aW1lKCppdFJJRCkpOworCQkJfQorCQl9CisJfQorfQorCisKKwordm9pZCBBdm1Db3ZlcmFnZVRyYW5zaXRpb25WaWV3OjpmaXJlYWJsZVRyYW5zaXRpb25UcmFjZSgKKwkJT3V0U3RyZWFtICYgb3MsIGNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVEKQoreworCWF2bV9zaXplX3Qgb2Zmc2V0OworCWF2bV9zaXplX3QgZW5kT2Zmc2V0OworCUF2bVRyYW5zaXRpb24gKiBhVHJhbnNpdGlvbiA9IE5VTEw7CisKKwlpdFJGID0gYW5FRC5nZXRUYWJsZU9mUnVudGltZSgpLmJlZ2luKCk7CisJZW5kUkYgPSBhbkVELmdldFRhYmxlT2ZSdW50aW1lKCkuZW5kKCk7CisJZm9yKCA7IChpdFJGICE9IGVuZFJGKSA7ICsraXRSRiApCisJeworCQlpdFJJRCA9ICgqaXRSRiktPmdldFJJRCgpOworCisJCXRtcEVGID0gaXRSSUQuZ2V0RXhlY3V0YWJsZSgpOworCisJCXRtcFJ1bnRpbWVUcmFuc2l0aW9uQml0c2V0ID0gZ2V0Q292ZXJhZ2VUYWJsZUJpdHNldCggaXRSSUQgKTsKKworCQlpZiggdG1wUnVudGltZVRyYW5zaXRpb25CaXRzZXQgPT0gTlVMTCApCisJCXsKKwkJCS8vISEgTk9USElOR2NsYXNzIEFQRXhlY3V0aW9uRGF0YTsKKworCQl9CisJCS8vdG1wRUYtPmhhc1RyYW5zaXRpb24oKQorCQllbHNlIGlmKCBhbkVELmlzSWRsZU9yUnVubmluZyggaXRSSUQgKSApCisJCXsKKwkJCWlmKCB0bXBSdW50aW1lVHJhbnNpdGlvbkJpdHNldC0+YW55RmFsc2UoKSApCisJCQl7CisJCQkJZW5kT2Zmc2V0ID0gdG1wRUYtPmdldFRyYW5zaXRpb24oKS5zaXplKCk7CisJCQkJZm9yKCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgZW5kT2Zmc2V0IDsgKytvZmZzZXQgKQorCQkJCXsKKwkJCQkJYVRyYW5zaXRpb24gPSB0bXBFRi0+Z2V0VHJhbnNpdGlvbigpLnJhd0F0KG9mZnNldCk7CisKKwkJCQkJaWYoIG5vdCB0bXBSdW50aW1lVHJhbnNpdGlvbkJpdHNldC0+CisJCQkJCQkJdGVzdChhVHJhbnNpdGlvbi0+Z2V0T2Zmc2V0KCkpICkKKwkJCQkJeworCQkJCQkJdHJhY2VGaXJlYWJpbGl0eShvcywKKwkJCQkJCQkJYW5FRCwgaXRSSUQsIGFUcmFuc2l0aW9uKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKy8vCQkJZWxzZSBpZiggdG1wUnVudGltZVRyYW5zaXRpb25CaXRzZXQtPmFsbFRydWUoKSApCisvLwkJCXsKKy8vCQkJCW9zIDw8ICI9PT4gWyBzdXNwZW5kZWQgISBdIG1hY2hpbmUgOj4gIgorLy8JCQkJCQk8PCAoKml0UkYpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbDsKKy8vCQkJfQorCQl9CisJfQorfQorCisKK3ZvaWQgQXZtQ292ZXJhZ2VUcmFuc2l0aW9uVmlldzo6ZmlyZWFibGVUcmFuc2l0aW9uVHJhY2UoT3V0U3RyZWFtICYgb3MsCisJCWNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVELCBjb25zdCBSdW50aW1lRm9ybSAmIGFSRikKK3sKKwl0bXBFRiA9IGFSRi5nZXRSSUQoKS5nZXRFeGVjdXRhYmxlKCk7CisKKwlpZiggdG1wRUYtPmhhc1RyYW5zaXRpb24oKSApCisJeworCQl0bXBSdW50aW1lVHJhbnNpdGlvbkJpdHNldCA9IGdldENvdmVyYWdlVGFibGVCaXRzZXQoIGFSRi5nZXRSSUQoKSApOworCisJCWlmKCB0bXBSdW50aW1lVHJhbnNpdGlvbkJpdHNldC0+YW55RmFsc2UoKSApCisJCXsKKwkJCUF2bVRyYW5zaXRpb24gKiBhVHJhbnNpdGlvbiA9IE5VTEw7CisKKwkJCWF2bV9zaXplX3QgZW5kT2Zmc2V0ID0gdG1wRUYtPmdldFRyYW5zaXRpb24oKS5zaXplKCk7CisJCQlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMCA7IG9mZnNldCA8IGVuZE9mZnNldCA7ICsrb2Zmc2V0ICkKKwkJCXsKKwkJCQlhVHJhbnNpdGlvbiA9IHRtcEVGLT5nZXRUcmFuc2l0aW9uKCkucmF3QXQob2Zmc2V0KTsKKworCQkJCWlmKCBub3QgdG1wUnVudGltZVRyYW5zaXRpb25CaXRzZXQtPnRlc3QoCisJCQkJCQlhVHJhbnNpdGlvbi0+Z2V0T2Zmc2V0KCkpICkKKwkJCQl7CisJCQkJCXRyYWNlRmlyZWFiaWxpdHkob3MsIGFuRUQsIGFSRi5nZXRSSUQoKSwgYVRyYW5zaXRpb24pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmKCBhUkYuaGFzQ2hpbGQoKSApCisJeworCQlUYWJsZU9mUnVudGltZUlEOjpjb25zdF9pdGVyYXRvciBpdFJJRCA9IGFSRi5iZWdpbkNoaWxkKCk7CisJCVRhYmxlT2ZSdW50aW1lSUQ6OmNvbnN0X2l0ZXJhdG9yIGl0UklERW5kID0gYVJGLmVuZENoaWxkKCk7CisKKwkJZm9yKCA7IGl0UklEICE9IGl0UklERW5kIDsgKytpdFJJRCApCisJCXsKKwkJCWlmKCBhbkVELmlzSWRsZU9yUnVubmluZyggKml0UklEICkgKQorCQkJeworCQkJCWZpcmVhYmxlVHJhbnNpdGlvblRyYWNlKG9zLCBhbkVELCBhbkVELmdldFJ1bnRpbWUoKml0UklEKSk7CisJCQl9CisJCX0KKwl9Cit9CisKKworLyoqCisgKiB1cGRhdGVUcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZSB1c2luZyBuZXcgZnJlc2ggRXhlY3V0aW9uIENvbnRleHQKKyAqLwordm9pZCBBdm1Db3ZlcmFnZVRyYW5zaXRpb25WaWV3Ojp1cGRhdGVUcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZSgKKwkJRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMsIGNvbnN0IEJGICYgYUZpcmVkQ29kZSkKK3sKKwlpZiggYUZpcmVkQ29kZS5pbnZhbGlkKCkgKQorCXsKKwkJcmV0dXJuOworCX0KKworCS8vIFbDqXJpZmljYXRpb24gZGUgbGEgY3LDqWF0aW9uIGRlIG5vdXZlbGxlIGluc3RhbmNlIGR5bmFtaXF1ZQorCS8vIHBhciBsYSBjb21tYW5kZSAkeyBORVcgLCBFWEVDIH0KKwlpZiggKG1TY29wZSAhPSBTcGVjaWZpZXI6OkRFU0lHTl9NT0RFTF9LSU5EKSAmJgorCQkJKGFuRUMtPnJlZkV4ZWN1dGlvbkRhdGEoKS5nZXRUYWJsZU9mUnVudGltZSgpLnNpemUoKSA+CisJCQkJCW1UcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZS0+c2l6ZSgpKSApCisJeworCQkvL1RPRE8KKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCggYUZpcmVkQ29kZS5jbGFzc0tpbmQoKSApCisJeworCQljYXNlIEZPUk1fQVZNQ09ERV9LSU5EOgorCQl7CisJCQljb25zdCBCRkNvZGUgJiBhbkF2bUNvZGUgPSBhRmlyZWRDb2RlLmJmQ29kZSgpOworCisJCQlBdm1Db2RlOjppdGVyYXRvciBpdEVuZCA9IGFuQXZtQ29kZS0+ZW5kKCk7CisJCQlmb3IoIEF2bUNvZGU6Oml0ZXJhdG9yIGl0ID0gYW5Bdm1Db2RlLT5iZWdpbigpIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwkJCXsKKwkJCQl1cGRhdGVUcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZShhbkVDLCAoKml0KSk7CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBGT1JNX0VYRUNVVElPTl9DT05GSUdVUkFUSU9OX0tJTkQ6CisJCXsKKwkJCUV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24gKiBhbkV4ZWNDb25mID0KKwkJCQkJYUZpcmVkQ29kZS50b19wdHI8IEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24gPigpOworCisJCQlpZiggYW5FeGVjQ29uZi0+aXNUcmFuc2l0aW9uKCkgKQorCQkJeworCQkJCXVwZGF0ZVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlKGFuRUMsCisJCQkJCQlhbkV4ZWNDb25mLT5nZXRSdW50aW1lSUQoKSwgYW5FeGVjQ29uZi0+Z2V0VHJhbnNpdGlvbigpKTsKKworLy8JCQkJQXZtVHJhbnNpdGlvbiAqIGZpcmVkVHJhbnNpdGlvbiA9IGFuRXhlY0NvbmYtPmdldFRyYW5zaXRpb24oKTsKKy8vCisvLwkJCQlpZiggbm90IG1UcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZS0+CisvLwkJCQkJCWF0KCBhbkV4ZWNDb25mLT5nZXRSdW50aW1lSUQoKS5nZXRPZmZzZXQoKSApLT4KKy8vCQkJCQkJdGVzdCggZmlyZWRUcmFuc2l0aW9uLT5nZXRPZmZzZXQoKSApICkKKy8vCQkJCXsKKy8vCQkJCQltQ292ZXJhZ2VTdGF0aXN0aWNzLmFkZENvdmVyZWRFbGVtZW50KCk7CisvLworLy8JCQkJCW1UcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZS0+YXQoCisvLwkJCQkJCQlhbkV4ZWNDb25mLT5nZXRSdW50aW1lSUQoKS5nZXRPZmZzZXQoKSApLT4KKy8vCQkJCQkJCQkJc2V0KGZpcmVkVHJhbnNpdGlvbi0+Z2V0T2Zmc2V0KCksIHRydWUpOworLy8KKy8vCQkJCQlpZiggbUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlICE9IE5VTEwgKQorLy8JCQkJCXsKKy8vCQkJCQkJbUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlLT5hdCggZmlyZWRUcmFuc2l0aW9uLT4KKy8vCQkJCQkJCQlnZXRFeGVjdXRhYmxlQ29udGFpbmVyKCktPmdldE9mZnNldCgpICktPgorLy8JCQkJCQkJCQkJc2V0KGZpcmVkVHJhbnNpdGlvbi0+Z2V0T2Zmc2V0KCksIHRydWUpOworLy8JCQkJCX0KKy8vCisvLwkJCQkJYW5FQy0+YWRkSW5mbyhtQ292ZXJhZ2VQcm9jZXNzb3IsCisvLwkJCQkJCQlFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld1N0cmluZygKKy8vCQkJCQkJCQkJZmlyZWRUcmFuc2l0aW9uLT5nZXROYW1lSUQoKSkgKTsKKy8vCisvLwkJCQkJbUxpc3RPZlBvc2l0aXZlRUMuYXBwZW5kKCBhbkVDICk7CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKwordm9pZCBBdm1Db3ZlcmFnZVRyYW5zaXRpb25WaWV3Ojp1cGRhdGVUcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZSgKKwkJRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsCisJCUF2bVRyYW5zaXRpb24gKiBmaXJlZFRyYW5zaXRpb24pCit7CisJYm9vbCBpc05ld2x5Q292ZXJlZCA9IGZhbHNlOworCisJc3dpdGNoKCBtU2NvcGUgKQorCXsKKwkJY2FzZSBTcGVjaWZpZXI6OkRFU0lHTl9NT0RFTF9LSU5EOgorCQl7CisJCQlpZiggbm90IG1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZS0+YXQoIGZpcmVkVHJhbnNpdGlvbi0+CisJCQkJCWdldEV4ZWN1dGFibGVDb250YWluZXIoKS0+Z2V0T2Zmc2V0KCkgKS0+CisJCQkJCQkJdGVzdChmaXJlZFRyYW5zaXRpb24tPmdldE9mZnNldCgpKSApCisJCQl7CisJCQkJaXNOZXdseUNvdmVyZWQgPSB0cnVlOworCisJCQkJbUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlLT5hdCggZmlyZWRUcmFuc2l0aW9uLT4KKwkJCQkJCWdldEV4ZWN1dGFibGVDb250YWluZXIoKS0+Z2V0T2Zmc2V0KCkgKS0+CisJCQkJCQkJCXNldChmaXJlZFRyYW5zaXRpb24tPmdldE9mZnNldCgpLCB0cnVlKTsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFNwZWNpZmllcjo6REVTSUdOX0lOU1RBTkNFX0tJTkQ6CisJCXsKKwkJCWlmKCBub3QgbVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlLT5hdCggYVJJRC5nZXRPZmZzZXQoKSApLT4KKwkJCQkJdGVzdCggZmlyZWRUcmFuc2l0aW9uLT5nZXRPZmZzZXQoKSApICkKKwkJCXsKKwkJCQlpc05ld2x5Q292ZXJlZCA9IHRydWU7CisKKwkJCQltVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUtPmF0KCBhUklELmdldE9mZnNldCgpICktPgorCQkJCQkJc2V0KGZpcmVkVHJhbnNpdGlvbi0+Z2V0T2Zmc2V0KCksIHRydWUpOworCQkJfQorCisJCQlicmVhazsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCWlmKCBub3QgbVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlLT5hdCggYVJJRC5nZXRPZmZzZXQoKSApLT4KKwkJCQkJdGVzdCggZmlyZWRUcmFuc2l0aW9uLT5nZXRPZmZzZXQoKSApICkKKwkJCXsKKwkJCQlpc05ld2x5Q292ZXJlZCA9IHRydWU7CisKKwkJCQltVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUtPmF0KCBhUklELmdldE9mZnNldCgpICktPgorCQkJCQkJc2V0KGZpcmVkVHJhbnNpdGlvbi0+Z2V0T2Zmc2V0KCksIHRydWUpOworCisJCQkJaWYoIG1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZSAhPSBOVUxMICkKKwkJCQl7CisJCQkJCW1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZS0+YXQoIGZpcmVkVHJhbnNpdGlvbi0+CisJCQkJCQkJZ2V0RXhlY3V0YWJsZUNvbnRhaW5lcigpLT5nZXRPZmZzZXQoKSApLT4KKwkJCQkJCQkJCXNldChmaXJlZFRyYW5zaXRpb24tPmdldE9mZnNldCgpLCB0cnVlKTsKKwkJCQl9CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisJfQorCisKKwlpZiggaXNOZXdseUNvdmVyZWQgKQorCXsKKwkJbUNvdmVyYWdlU3RhdGlzdGljcy5hZGRDb3ZlcmVkRWxlbWVudCgpOworCisJCWFuRUMtPmdldHdGbGFncygpLmFkZENvdmVyYWdlRWxlbWVudFRyYWNlKCk7CisKKwkJYW5FQy0+YWRkSW5mbyhtQ292ZXJhZ2VQcm9jZXNzb3IsCisJCQkJRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdTdHJpbmcoIGZpcmVkVHJhbnNpdGlvbi0+Z2V0TmFtZUlEKCkgKSk7CisKKy8vJAkJbUxpc3RPZlBvc2l0aXZlRUMuYXBwZW5kKCBhbkVDICk7CisJfQorfQorCisKK2Jvb2wgQXZtQ292ZXJhZ2VUcmFuc2l0aW9uVmlldzo6dGVzdFRyYW5zaXRpb25Db3ZlcmFnZSgKKwkJQXZtVHJhbnNpdGlvbiAqIGZpcmVkVHJhbnNpdGlvbikKK3sKKwlzd2l0Y2goIG1TY29wZSApCisJeworCQljYXNlIFNwZWNpZmllcjo6REVTSUdOX01PREVMX0tJTkQ6CisJCXsKKwkJCXJldHVybiggbUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlLT5hdCggZmlyZWRUcmFuc2l0aW9uLT4KKwkJCQkJZ2V0RXhlY3V0YWJsZUNvbnRhaW5lcigpLT5nZXRPZmZzZXQoKSApLT4KKwkJCQkJCQl0ZXN0KGZpcmVkVHJhbnNpdGlvbi0+Z2V0T2Zmc2V0KCkpICk7CisJCX0KKworCQljYXNlIFNwZWNpZmllcjo6REVTSUdOX0lOU1RBTkNFX0tJTkQ6CisJCXsKKy8vCQkJcmV0dXJuKCBtVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUtPmF0KCBhUklELmdldE9mZnNldCgpICktPgorLy8JCQkJCXRlc3QoIGZpcmVkVHJhbnNpdGlvbi0+Z2V0T2Zmc2V0KCkgKSApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCXJldHVybiggKG1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZSAhPSBOVUxMKSB8fAorCQkJCQltRXhlY3V0YWJsZUNvdmVyYWdlVGFibGUtPmF0KCBmaXJlZFRyYW5zaXRpb24tPgorCQkJCQlnZXRFeGVjdXRhYmxlQ29udGFpbmVyKCktPmdldE9mZnNldCgpICktPgorCQkJCQkJCXRlc3QoZmlyZWRUcmFuc2l0aW9uLT5nZXRPZmZzZXQoKSkgKTsKKwkJfQorCX0KK30KKworCisvKioKKyAqIFVwZGF0ZSB1bmNvdmVyZWQgdHJhbnNpdGlvbiB0YWJsZQorICovCit2b2lkIEF2bUNvdmVyYWdlVHJhbnNpdGlvblZpZXc6OnVwZGF0ZVVuY292ZXJlZFRyYW5zaXRpb24oCisJCVZlY3Rvck9mQXZtVHJhbnNpdGlvbiAmIGFUYWJsZW9mVW5jb3ZlcmVkVHJhbnNpdGlvbikKK3sKKwlhdm1fc2l6ZV90IGVuZFRyYW5zaXRpb24gPSBhVGFibGVvZlVuY292ZXJlZFRyYW5zaXRpb24uc2l6ZSgpOworCWF2bV9zaXplX3QgdW5jb3ZlcmVkT2Zmc2V0ID0gMDsKKworCWF2bV9zaXplX3Qgb2Zmc2V0ID0gMDsKKwlmb3IoIDsgb2Zmc2V0IDwgZW5kVHJhbnNpdGlvbiA7ICsrb2Zmc2V0ICkKKwl7CisJCWlmKCBub3QgdGVzdFRyYW5zaXRpb25Db3ZlcmFnZSggYVRhYmxlb2ZVbmNvdmVyZWRUcmFuc2l0aW9uW29mZnNldF0gKSApCisJCXsKKwkJCXVuY292ZXJlZE9mZnNldCA9IG9mZnNldDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJZm9yKCArK29mZnNldCA7IG9mZnNldCA8IGVuZFRyYW5zaXRpb24gOyArK29mZnNldCApCisJeworCQlpZiggbm90IHRlc3RUcmFuc2l0aW9uQ292ZXJhZ2UoYVRhYmxlb2ZVbmNvdmVyZWRUcmFuc2l0aW9uW29mZnNldF0pICkKKwkJeworCQkJYVRhYmxlb2ZVbmNvdmVyZWRUcmFuc2l0aW9uWyB1bmNvdmVyZWRPZmZzZXQrKyBdID0KKwkJCQkJYVRhYmxlb2ZVbmNvdmVyZWRUcmFuc2l0aW9uWyBvZmZzZXQgXTsKKwkJfQorCX0KKworCWFUYWJsZW9mVW5jb3ZlcmVkVHJhbnNpdGlvbi5yZXNpemUoIHVuY292ZXJlZE9mZnNldCApOworCisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX0NPVVQgIDw8ICJBdm1Db3ZlcmFnZVRyYW5zaXRpb25WaWV3Ojp1cGRhdGVVbmNvdmVyZWRUcmFuc2l0aW9uOj4gY291bnQ6ICIKKwkJCTw8IGFUYWJsZW9mVW5jb3ZlcmVkVHJhbnNpdGlvbi5zaXplKCkgPDwgc3RkOjplbmRsOworCUFWTV9PU19UUkFDRSA8PCAiQXZtQ292ZXJhZ2VUcmFuc2l0aW9uVmlldzo6dXBkYXRlVW5jb3ZlcmVkVHJhbnNpdGlvbjo+IGNvdW50OiAiCisJCQk8PCBhVGFibGVvZlVuY292ZXJlZFRyYW5zaXRpb24uc2l6ZSgpIDw8IHN0ZDo6ZW5kbDsKKworCVZlY3Rvck9mQXZtVHJhbnNpdGlvbjo6Y29uc3RfaXRlcmF0b3IgaXRUcmFuc2l0aW9uID0gYVRhYmxlb2ZVbmNvdmVyZWRUcmFuc2l0aW9uLmJlZ2luKCk7CisJVmVjdG9yT2ZBdm1UcmFuc2l0aW9uOjpjb25zdF9pdGVyYXRvciBlbmRUcmFuc2l0aW9uID0gYVRhYmxlb2ZVbmNvdmVyZWRUcmFuc2l0aW9uLmVuZCgpOworCWZvciggOyBpdFRyYW5zaXRpb24gIT0gZW5kVHJhbnNpdGlvbiA7ICsraXRUcmFuc2l0aW9uICkKKwl7CisJCUFWTV9PU19DT1VUIDw8ICJcdCIgIDw8ICgqaXRUcmFuc2l0aW9uKS0+c3RyVHJhbnNpdGlvbkhlYWRlcigpIDw8IHN0ZDo6ZW5kbDsKKworCQlBVk1fT1NfVFJBQ0UgPDwgIlx0IiA8PCAoKml0VHJhbnNpdGlvbiktPnN0clRyYW5zaXRpb25IZWFkZXIoKSA8PCBzdGQ6OmVuZGw7CisJfQorQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKK30KKworCisvKioKKyAqIENvbGxlY3QgYWxsIHVuY292ZXJlZCB0cmFuc2l0aW9uCisgKi8KKy8vdm9pZCBBdm1Db3ZlcmFnZVRyYW5zaXRpb25WaWV3Ojpjb2xsZWN0VW5jb3ZlcmVkVHJhbnNpdGlvbigKKy8vCQlWZWN0b3JPZkF2bVRyYW5zaXRpb24gJiBhVGFibGVvZlVuY292ZXJlZFRyYW5zaXRpb24pCisvL3sKKy8vCWNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVEID0KKy8vCQkJbUNvdmVyYWdlUHJvY2Vzc29yLmdldENvbmZpZ3VyYXRpb24oKS5nZXRNYWluRXhlY3V0aW9uRGF0YSgpOworLy8KKy8vCVJ1bnRpbWVJRCBhUklEOworLy8KKy8vCWF2bV9zaXplX3Qgb2Zmc2V0OworLy8JYXZtX3NpemVfdCBlbmRPZmZzZXQ7CisvLwlBdm1UcmFuc2l0aW9uICogaXRUcmFuc2l0aW9uOworLy8KKy8vCXN3aXRjaCggbVNjb3BlICkKKy8vCXsKKy8vCQljYXNlIFNwZWNpZmllcjo6REVTSUdOX0lOU1RBTkNFX0tJTkQ6CisvLwkJeworLy8JCQlpZiggbVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlID09IE5VTEwgKQorLy8JCQl7CisvLwkJCQlicmVhazsKKy8vCQkJfQorLy8KKy8vCQkJYXZtX3NpemVfdCBlbmRNYWNoaW5lID0gbVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlLT5zaXplKCk7CisvLwkJCWZvciggYXZtX3NpemVfdCBpdE1hY2hpbmUgPSAwIDsgaXRNYWNoaW5lIDwgZW5kTWFjaGluZSA7ICsraXRNYWNoaW5lICkKKy8vCQkJeworLy8JCQkJYVJJRCA9IGFuRUQuZ2V0UnVudGltZUlEKGl0TWFjaGluZSk7CisvLwkJCQlpZiggYVJJRC5nZXRFeGVjdXRhYmxlKCktPmhhc1RyYW5zaXRpb24oKSApCisvLwkJCQl7CisvLwkJCQkJZW5kT2Zmc2V0ID0gYVJJRC5nZXRFeGVjdXRhYmxlKCktPmdldFRyYW5zaXRpb24oKS5zaXplKCk7CisvLwkJCQkJZm9yKCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgZW5kT2Zmc2V0IDsgKytvZmZzZXQgKQorLy8JCQkJCXsKKy8vCQkJCQkJaXRUcmFuc2l0aW9uID0gYVJJRC5nZXRFeGVjdXRhYmxlKCktPmdldFRyYW5zaXRpb24oKS5yYXdBdChvZmZzZXQpOworLy8KKy8vCQkJCQkJaWYoIG5vdCBtVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUtPgorLy8JCQkJCQkJCWF0KCBhUklELmdldE9mZnNldCgpICktPnRlc3QoIG9mZnNldCApICkKKy8vCQkJCQkJeworLy8JCQkJCQkJYVRhYmxlb2ZVbmNvdmVyZWRUcmFuc2l0aW9uLmFwcGVuZCggaXRUcmFuc2l0aW9uICk7CisvLworLy8JCQkJCQkJaWYoIGFUYWJsZW9mVW5jb3ZlcmVkVHJhbnNpdGlvbi5zaXplKCkgPj0KKy8vCQkJCQkJCQltQ292ZXJhZ2VTdGF0aXN0aWNzLmdldE51bWJlck9mVW5jb3ZlcmVkKCkgKQorLy8JCQkJCQkJeworLy8vLwkJCQkJCQkJcmV0dXJuKCB0cnVlICk7CisvLwkJCQkJCQkJZ290byBlbmRDb21wdXRpbmc7CisvLwkJCQkJCQl9CisvLwkJCQkJCX0KKy8vCQkJCQl9CisvLwkJCQl9CisvLwkJCX0KKy8vCisvLwkJCWJyZWFrOworLy8JCX0KKy8vCisvLwkJY2FzZSBTcGVjaWZpZXI6OkRFU0lHTl9NT0RFTF9LSU5EOgorLy8JCXsKKy8vCQkJaWYoIG1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZSA9PSBOVUxMICkKKy8vCQkJeworLy8JCQkJYnJlYWs7CisvLwkJCX0KKy8vCisvLwkJCVZlY3Rvck9mRXhlY3V0YWJsZUZvcm06OmNvbnN0X2l0ZXJhdG9yIGl0RXhlYyA9CisvLwkJCQkJbVRhYmxlb2ZSdW50aW1lRXhlY3V0YWJsZS5iZWdpbigpOworLy8JCQlWZWN0b3JPZkV4ZWN1dGFibGVGb3JtOjpjb25zdF9pdGVyYXRvciBlbmRFeGVjID0KKy8vCQkJCQltVGFibGVvZlJ1bnRpbWVFeGVjdXRhYmxlLmVuZCgpOworLy8JCQlmb3IoIGF2bV9zaXplX3QgaW5kZXhFeGVjID0gMCA7IGl0RXhlYyAhPSBlbmRFeGVjIDsKKy8vCQkJCQkrK2l0RXhlYyAsICsraW5kZXhFeGVjICkKKy8vCQkJeworLy8JCQkJaWYoICgqaXRFeGVjKS0+aGFzVHJhbnNpdGlvbigpICkKKy8vCQkJCXsKKy8vCQkJCQllbmRPZmZzZXQgPSAoKml0RXhlYyktPmdldFRyYW5zaXRpb24oKS5zaXplKCk7CisvLwkJCQkJZm9yKCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgZW5kT2Zmc2V0IDsgKytvZmZzZXQgKQorLy8JCQkJCXsKKy8vCQkJCQkJaXRUcmFuc2l0aW9uID0gKCppdEV4ZWMpLT5nZXRUcmFuc2l0aW9uKCkucmF3QXQob2Zmc2V0KTsKKy8vCisvLwkJCQkJCWlmKCBub3QgbUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlLT4KKy8vCQkJCQkJCQlhdCgoKml0RXhlYyktPmdldE9mZnNldCgpKS0+dGVzdCggb2Zmc2V0ICkgKQorLy8JCQkJCQl7CisvLwkJCQkJCQlhVGFibGVvZlVuY292ZXJlZFRyYW5zaXRpb24uYXBwZW5kKCBpdFRyYW5zaXRpb24gKTsKKy8vCisvLwkJCQkJCQlpZiggYVRhYmxlb2ZVbmNvdmVyZWRUcmFuc2l0aW9uLnNpemUoKSA+PQorLy8JCQkJCQkJCW1Db3ZlcmFnZVN0YXRpc3RpY3MuZ2V0TnVtYmVyT2ZVbmNvdmVyZWQoKSApCisvLwkJCQkJCQl7CisvLy8vCQkJCQkJCQlyZXR1cm4oIHRydWUgKTsKKy8vCQkJCQkJCQlnb3RvIGVuZENvbXB1dGluZzsKKy8vCQkJCQkJCX0KKy8vCQkJCQkJfQorLy8JCQkJCX0KKy8vCQkJCX0KKy8vCQkJfQorLy8KKy8vCQkJYnJlYWs7CisvLwkJfQorLy8KKy8vCQlkZWZhdWx0OgorLy8JCXsKKy8vCQkJaWYoIG1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZSAhPSBOVUxMICkKKy8vCQkJeworLy8JCQkJVmVjdG9yT2ZFeGVjdXRhYmxlRm9ybTo6Y29uc3RfaXRlcmF0b3IgaXRFeGVjID0KKy8vCQkJCQkJbVRhYmxlb2ZSdW50aW1lRXhlY3V0YWJsZS5iZWdpbigpOworLy8JCQkJVmVjdG9yT2ZFeGVjdXRhYmxlRm9ybTo6Y29uc3RfaXRlcmF0b3IgZW5kRXhlYyA9CisvLwkJCQkJCW1UYWJsZW9mUnVudGltZUV4ZWN1dGFibGUuZW5kKCk7CisvLwkJCQlmb3IoIGF2bV9zaXplX3QgaW5kZXhFeGVjID0gMCA7IGl0RXhlYyAhPSBlbmRFeGVjIDsKKy8vCQkJCQkJKytpdEV4ZWMgLCArK2luZGV4RXhlYyApCisvLwkJCQl7CisvLwkJCQkJaWYoICgqaXRFeGVjKS0+aGFzVHJhbnNpdGlvbigpICkKKy8vCQkJCQl7CisvLwkJCQkJCWVuZE9mZnNldCA9ICgqaXRFeGVjKS0+Z2V0VHJhbnNpdGlvbigpLnNpemUoKTsKKy8vCQkJCQkJZm9yKCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgZW5kT2Zmc2V0IDsgKytvZmZzZXQgKQorLy8JCQkJCQl7CisvLwkJCQkJCQlpdFRyYW5zaXRpb24gPSAoKml0RXhlYyktPmdldFRyYW5zaXRpb24oKS5yYXdBdChvZmZzZXQpOworLy8KKy8vCQkJCQkJCWlmKCBub3QgbUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlLT4KKy8vCQkJCQkJCQkJYXQoKCppdEV4ZWMpLT5nZXRPZmZzZXQoKSktPnRlc3QoIG9mZnNldCApICkKKy8vCQkJCQkJCXsKKy8vCQkJCQkJCQlhVGFibGVvZlVuY292ZXJlZFRyYW5zaXRpb24uYXBwZW5kKCBpdFRyYW5zaXRpb24gKTsKKy8vCisvLwkJCQkJCQkJaWYoIGFUYWJsZW9mVW5jb3ZlcmVkVHJhbnNpdGlvbi5zaXplKCkgPj0KKy8vCQkJCQkJCQkJbUNvdmVyYWdlU3RhdGlzdGljcy5nZXROdW1iZXJPZlVuY292ZXJlZCgpICkKKy8vCQkJCQkJCQl7CisvLy8vCQkJCQkJCQkJcmV0dXJuKCB0cnVlICk7CisvLwkJCQkJCQkJCWdvdG8gZW5kQ29tcHV0aW5nOworLy8JCQkJCQkJCX0KKy8vCQkJCQkJCX0KKy8vCQkJCQkJfQorLy8JCQkJCX0KKy8vCQkJCX0KKy8vCQkJfQorLy8KKy8vCQkJaWYoIG1UcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZSAhPSBOVUxMICkKKy8vCQkJeworLy8JCQkJYXZtX3NpemVfdCBlbmRNYWNoaW5lID0gbVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlLT5zaXplKCk7CisvLwkJCQlmb3IoIGF2bV9zaXplX3QgaXRNYWNoaW5lID0gMCA7IGl0TWFjaGluZSA8IGVuZE1hY2hpbmUgOyArK2l0TWFjaGluZSApCisvLwkJCQl7CisvLwkJCQkJYVJJRCA9IGFuRUQuZ2V0UnVudGltZUlEKGl0TWFjaGluZSk7CisvLwkJCQkJaWYoIGFSSUQuZ2V0RXhlY3V0YWJsZSgpLT5oYXNUcmFuc2l0aW9uKCkgKQorLy8JCQkJCXsKKy8vCQkJCQkJZW5kT2Zmc2V0ID0gYVJJRC5nZXRFeGVjdXRhYmxlKCktPmdldFRyYW5zaXRpb24oKS5zaXplKCk7CisvLwkJCQkJCWZvciggb2Zmc2V0ID0gMCA7IG9mZnNldCA8IGVuZE9mZnNldCA7ICsrb2Zmc2V0ICkKKy8vCQkJCQkJeworLy8JCQkJCQkJaXRUcmFuc2l0aW9uID0gYVJJRC5nZXRFeGVjdXRhYmxlKCktPmdldFRyYW5zaXRpb24oKS5yYXdBdChvZmZzZXQpOworLy8KKy8vCQkJCQkJCWlmKCAobm90IG1UcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZS0+CisvLwkJCQkJCQkJCWF0KGFSSUQuZ2V0T2Zmc2V0KCkpLT50ZXN0KG9mZnNldCkpCisvLwkJCQkJCQkJJiYgbUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlLT4KKy8vCQkJCQkJCQkJYXQoYVJJRC5nZXRFeGVjdXRhYmxlKCktPmdldE9mZnNldCgpKS0+dGVzdChvZmZzZXQpICkKKy8vCQkJCQkJCXsKKy8vCQkJCQkJCQlhVGFibGVvZlVuY292ZXJlZFRyYW5zaXRpb24uYXBwZW5kKCBpdFRyYW5zaXRpb24gKTsKKy8vCisvLwkJCQkJCQkJaWYoIGFUYWJsZW9mVW5jb3ZlcmVkVHJhbnNpdGlvbi5zaXplKCkgPj0KKy8vCQkJCQkJCQkJbUNvdmVyYWdlU3RhdGlzdGljcy5nZXROdW1iZXJPZlVuY292ZXJlZCgpICkKKy8vCQkJCQkJCQl7CisvLy8vCQkJCQkJCQkJcmV0dXJuKCB0cnVlICk7CisvLwkJCQkJCQkJCWdvdG8gZW5kQ29tcHV0aW5nOworLy8JCQkJCQkJCX0KKy8vCQkJCQkJCX0KKy8vCQkJCQkJfQorLy8JCQkJCX0KKy8vCQkJCX0KKy8vCQkJfQorLy8KKy8vCQkJYnJlYWs7CisvLwkJfQorLy8JfQorLy8KKy8vCisvL2VuZENvbXB1dGluZzoKKy8vQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKy8vCUFWTV9PU19DT1VUICA8PCAiQXZtQ292ZXJhZ2VUcmFuc2l0aW9uVmlldzo6Y29sbGVjdFVuY292ZXJlZFRyYW5zaXRpb246PiBjb3VudDogIgorLy8JCQk8PCBhVGFibGVvZlVuY292ZXJlZFRyYW5zaXRpb24uc2l6ZSgpIDw8IHN0ZDo6ZW5kbDsKKy8vCUFWTV9PU19UUkFDRSA8PCAiQXZtQ292ZXJhZ2VUcmFuc2l0aW9uVmlldzo6Y29sbGVjdFVuY292ZXJlZFRyYW5zaXRpb246PiBjb3VudDogIgorLy8JCQk8PCBhVGFibGVvZlVuY292ZXJlZFRyYW5zaXRpb24uc2l6ZSgpIDw8IHN0ZDo6ZW5kbDsKKy8vCisvLwlWZWN0b3JPZkF2bVRyYW5zaXRpb246OmNvbnN0X2l0ZXJhdG9yIGl0VHJhbnNpdGlvbiA9IGFUYWJsZW9mVW5jb3ZlcmVkVHJhbnNpdGlvbi5iZWdpbigpOworLy8JVmVjdG9yT2ZBdm1UcmFuc2l0aW9uOjpjb25zdF9pdGVyYXRvciBlbmRUcmFuc2l0aW9uID0gYVRhYmxlb2ZVbmNvdmVyZWRUcmFuc2l0aW9uLmVuZCgpOworLy8JZm9yKCA7IGl0VHJhbnNpdGlvbiAhPSBlbmRUcmFuc2l0aW9uIDsgKytpdFRyYW5zaXRpb24gKQorLy8JeworLy8JCUFWTV9PU19DT1VUIDw8ICJcdCIgIDw8ICgqaXRUcmFuc2l0aW9uKS0+c3RyVHJhbnNpdGlvbkhlYWRlcigpIDw8IHN0ZDo6ZW5kbDsKKy8vCisvLwkJQVZNX09TX1RSQUNFIDw8ICJcdCIgPDwgKCppdFRyYW5zaXRpb24pLT5zdHJUcmFuc2l0aW9uSGVhZGVyKCkgPDwgc3RkOjplbmRsOworLy8JfQorLy9BVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorLy99CisKKworCitpbmxpbmUgc3RhdGljIGJvb2wgaXNQZXJ0aW5lbnQoQXZtVHJhbnNpdGlvbiAqIGFUcmFuc2l0aW9uKQoreworCWlmKCBhVHJhbnNpdGlvbi0+aGFzVGFyZ2V0KCkgKQorCXsKKwkJcmV0dXJuKCBub3QgYVRyYW5zaXRpb24tPmlzVW5zdGFibGVUYXJnZXQoKSApOworCX0KKworCXJldHVybiggbm90IGFUcmFuc2l0aW9uLT5pc1Vuc3RhYmxlU291cmNlKCkgKTsKK30KKworCit2b2lkIEF2bUNvdmVyYWdlVHJhbnNpdGlvblZpZXc6OmNvbGxlY3RVbmNvdmVyZWRUcmFuc2l0aW9uKAorCQlWZWN0b3JPZkF2bVRyYW5zaXRpb24gJiBhVGFibGVvZlVuY292ZXJlZFRyYW5zaXRpb24pCit7CisJY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQgPQorCQkJbUNvdmVyYWdlUHJvY2Vzc29yLmdldENvbmZpZ3VyYXRpb24oKS5nZXRNYWluRXhlY3V0aW9uRGF0YSgpOworCisJUnVudGltZUlEIGFSSUQ7CisKKwlhdm1fc2l6ZV90IG9mZnNldDsKKwlhdm1fc2l6ZV90IGVuZE9mZnNldDsKKwlBdm1UcmFuc2l0aW9uICogaXRUcmFuc2l0aW9uOworCisJYXZtX3NpemVfdCB1bmNvdmVyZWRDb3VudCA9IDA7CisKKwlWZWN0b3JPZkF2bVRyYW5zaXRpb24gbm9uUGVydGluZW50VHJhbnNpdGlvbjsKKworCXN3aXRjaCggbVNjb3BlICkKKwl7CisJCWNhc2UgU3BlY2lmaWVyOjpERVNJR05fSU5TVEFOQ0VfS0lORDoKKwkJeworCQkJaWYoIG1UcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZSA9PSBOVUxMICkKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJYXZtX3NpemVfdCBlbmRNYWNoaW5lID0gbVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlLT5zaXplKCk7CisJCQlmb3IoIGF2bV9zaXplX3QgaXRNYWNoaW5lID0gMCA7IGl0TWFjaGluZSA8IGVuZE1hY2hpbmUgOyArK2l0TWFjaGluZSApCisJCQl7CisJCQkJYVJJRCA9IGFuRUQuZ2V0UnVudGltZUlEKGl0TWFjaGluZSk7CisJCQkJaWYoIGFSSUQuZ2V0RXhlY3V0YWJsZSgpLT5oYXNUcmFuc2l0aW9uKCkgKQorCQkJCXsKKwkJCQkJZW5kT2Zmc2V0ID0gYVJJRC5nZXRFeGVjdXRhYmxlKCktPmdldFRyYW5zaXRpb24oKS5zaXplKCk7CisJCQkJCWZvciggb2Zmc2V0ID0gMCA7IG9mZnNldCA8IGVuZE9mZnNldCA7ICsrb2Zmc2V0ICkKKwkJCQkJeworCQkJCQkJaXRUcmFuc2l0aW9uID0gYVJJRC5nZXRFeGVjdXRhYmxlKCktPgorCQkJCQkJCQlnZXRUcmFuc2l0aW9uKCkucmF3QXQob2Zmc2V0KTsKKworCQkJCQkJaWYoIG5vdCBtVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUtPgorCQkJCQkJCQlhdCggYVJJRC5nZXRPZmZzZXQoKSApLT50ZXN0KCBvZmZzZXQgKSApCisJCQkJCQl7CisJCQkJCQkJKyt1bmNvdmVyZWRDb3VudDsKKworCQkJCQkJCWlmKCBpc1BlcnRpbmVudCggaXRUcmFuc2l0aW9uICkgKQorCQkJCQkJCXsKKwkJCQkJCQkJYVRhYmxlb2ZVbmNvdmVyZWRUcmFuc2l0aW9uLmFwcGVuZCggaXRUcmFuc2l0aW9uICk7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCW5vblBlcnRpbmVudFRyYW5zaXRpb24uYXBwZW5kKCBpdFRyYW5zaXRpb24gKTsKKwkJCQkJCQl9CisKKwkJCQkJCQlpZiggdW5jb3ZlcmVkQ291bnQgPj0KKwkJCQkJCQkJbUNvdmVyYWdlU3RhdGlzdGljcy5nZXROdW1iZXJPZlVuY292ZXJlZCgpICkKKwkJCQkJCQl7CisvLwkJCQkJCQkJcmV0dXJuKCB0cnVlICk7CisJCQkJCQkJCWdvdG8gZW5kQ29tcHV0aW5nOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFNwZWNpZmllcjo6REVTSUdOX01PREVMX0tJTkQ6CisJCXsKKwkJCWlmKCBtRXhlY3V0YWJsZUNvdmVyYWdlVGFibGUgPT0gTlVMTCApCisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCVZlY3Rvck9mRXhlY3V0YWJsZUZvcm06OmNvbnN0X2l0ZXJhdG9yIGl0RXhlYyA9CisJCQkJCW1UYWJsZW9mUnVudGltZUV4ZWN1dGFibGUuYmVnaW4oKTsKKwkJCVZlY3Rvck9mRXhlY3V0YWJsZUZvcm06OmNvbnN0X2l0ZXJhdG9yIGVuZEV4ZWMgPQorCQkJCQltVGFibGVvZlJ1bnRpbWVFeGVjdXRhYmxlLmVuZCgpOworCQkJZm9yKCBhdm1fc2l6ZV90IGluZGV4RXhlYyA9IDAgOyBpdEV4ZWMgIT0gZW5kRXhlYyA7CisJCQkJCSsraXRFeGVjICwgKytpbmRleEV4ZWMgKQorCQkJeworCQkJCWlmKCAoKml0RXhlYyktPmhhc1RyYW5zaXRpb24oKSApCisJCQkJeworCQkJCQllbmRPZmZzZXQgPSAoKml0RXhlYyktPmdldFRyYW5zaXRpb24oKS5zaXplKCk7CisJCQkJCWZvciggb2Zmc2V0ID0gMCA7IG9mZnNldCA8IGVuZE9mZnNldCA7ICsrb2Zmc2V0ICkKKwkJCQkJeworCQkJCQkJaXRUcmFuc2l0aW9uID0gKCppdEV4ZWMpLT5nZXRUcmFuc2l0aW9uKCkucmF3QXQob2Zmc2V0KTsKKworCQkJCQkJaWYoIG5vdCBtRXhlY3V0YWJsZUNvdmVyYWdlVGFibGUtPgorCQkJCQkJCQlhdCgoKml0RXhlYyktPmdldE9mZnNldCgpKS0+dGVzdCggb2Zmc2V0ICkgKQorCQkJCQkJeworCQkJCQkJCSsrdW5jb3ZlcmVkQ291bnQ7CisKKwkJCQkJCQlpZiggaXNQZXJ0aW5lbnQoIGl0VHJhbnNpdGlvbiApICkKKwkJCQkJCQl7CisJCQkJCQkJCWFUYWJsZW9mVW5jb3ZlcmVkVHJhbnNpdGlvbi5hcHBlbmQoIGl0VHJhbnNpdGlvbiApOworCQkJCQkJCX0KKwkJCQkJCQllbHNlCisJCQkJCQkJeworCQkJCQkJCQlub25QZXJ0aW5lbnRUcmFuc2l0aW9uLmFwcGVuZCggaXRUcmFuc2l0aW9uICk7CisJCQkJCQkJfQorCisJCQkJCQkJaWYoIHVuY292ZXJlZENvdW50ID49CisJCQkJCQkJCW1Db3ZlcmFnZVN0YXRpc3RpY3MuZ2V0TnVtYmVyT2ZVbmNvdmVyZWQoKSApCisJCQkJCQkJeworLy8JCQkJCQkJCXJldHVybiggdHJ1ZSApOworCQkJCQkJCQlnb3RvIGVuZENvbXB1dGluZzsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJaWYoIG1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZSAhPSBOVUxMICkKKwkJCXsKKwkJCQlWZWN0b3JPZkV4ZWN1dGFibGVGb3JtOjpjb25zdF9pdGVyYXRvciBpdEV4ZWMgPQorCQkJCQkJbVRhYmxlb2ZSdW50aW1lRXhlY3V0YWJsZS5iZWdpbigpOworCQkJCVZlY3Rvck9mRXhlY3V0YWJsZUZvcm06OmNvbnN0X2l0ZXJhdG9yIGVuZEV4ZWMgPQorCQkJCQkJbVRhYmxlb2ZSdW50aW1lRXhlY3V0YWJsZS5lbmQoKTsKKwkJCQlmb3IoIGF2bV9zaXplX3QgaW5kZXhFeGVjID0gMCA7IGl0RXhlYyAhPSBlbmRFeGVjIDsKKwkJCQkJCSsraXRFeGVjICwgKytpbmRleEV4ZWMgKQorCQkJCXsKKwkJCQkJaWYoICgqaXRFeGVjKS0+aGFzVHJhbnNpdGlvbigpICkKKwkJCQkJeworCQkJCQkJZW5kT2Zmc2V0ID0gKCppdEV4ZWMpLT5nZXRUcmFuc2l0aW9uKCkuc2l6ZSgpOworCQkJCQkJZm9yKCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgZW5kT2Zmc2V0IDsgKytvZmZzZXQgKQorCQkJCQkJeworCQkJCQkJCWl0VHJhbnNpdGlvbiA9ICgqaXRFeGVjKS0+Z2V0VHJhbnNpdGlvbigpLnJhd0F0KG9mZnNldCk7CisKKwkJCQkJCQlpZiggbm90IG1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZS0+CisJCQkJCQkJCQlhdCgoKml0RXhlYyktPmdldE9mZnNldCgpKS0+dGVzdCggb2Zmc2V0ICkgKQorCQkJCQkJCXsKKwkJCQkJCQkJKyt1bmNvdmVyZWRDb3VudDsKKworCQkJCQkJCQlpZiggaXNQZXJ0aW5lbnQoIGl0VHJhbnNpdGlvbiApICkKKwkJCQkJCQkJeworCQkJCQkJCQkJYVRhYmxlb2ZVbmNvdmVyZWRUcmFuc2l0aW9uLmFwcGVuZCggaXRUcmFuc2l0aW9uICk7CisJCQkJCQkJCX0KKwkJCQkJCQkJZWxzZQorCQkJCQkJCQl7CisJCQkJCQkJCQlub25QZXJ0aW5lbnRUcmFuc2l0aW9uLmFwcGVuZCggaXRUcmFuc2l0aW9uICk7CisJCQkJCQkJCX0KKworCQkJCQkJCQlpZiggdW5jb3ZlcmVkQ291bnQgPj0KKwkJCQkJCQkJCW1Db3ZlcmFnZVN0YXRpc3RpY3MuZ2V0TnVtYmVyT2ZVbmNvdmVyZWQoKSApCisJCQkJCQkJCXsKKy8vCQkJCQkJCQkJcmV0dXJuKCB0cnVlICk7CisJCQkJCQkJCQlnb3RvIGVuZENvbXB1dGluZzsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJaWYoIG1UcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZSAhPSBOVUxMICkKKwkJCXsKKwkJCQlhdm1fc2l6ZV90IGVuZE1hY2hpbmUgPSBtVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUtPnNpemUoKTsKKwkJCQlmb3IoIGF2bV9zaXplX3QgaXRNYWNoaW5lID0gMCA7IGl0TWFjaGluZSA8IGVuZE1hY2hpbmUgOyArK2l0TWFjaGluZSApCisJCQkJeworCQkJCQlhUklEID0gYW5FRC5nZXRSdW50aW1lSUQoaXRNYWNoaW5lKTsKKwkJCQkJaWYoIGFSSUQuZ2V0RXhlY3V0YWJsZSgpLT5oYXNUcmFuc2l0aW9uKCkgKQorCQkJCQl7CisJCQkJCQllbmRPZmZzZXQgPSBhUklELmdldEV4ZWN1dGFibGUoKS0+Z2V0VHJhbnNpdGlvbigpLnNpemUoKTsKKwkJCQkJCWZvciggb2Zmc2V0ID0gMCA7IG9mZnNldCA8IGVuZE9mZnNldCA7ICsrb2Zmc2V0ICkKKwkJCQkJCXsKKwkJCQkJCQlpdFRyYW5zaXRpb24gPSBhUklELmdldEV4ZWN1dGFibGUoKS0+CisJCQkJCQkJCQlnZXRUcmFuc2l0aW9uKCkucmF3QXQob2Zmc2V0KTsKKworCQkJCQkJCWlmKCAobm90IG1UcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZS0+CisJCQkJCQkJCQlhdChhUklELmdldE9mZnNldCgpKS0+dGVzdChvZmZzZXQpKQorCQkJCQkJCQkmJiBtRXhlY3V0YWJsZUNvdmVyYWdlVGFibGUtPgorCQkJCQkJCQkJYXQoYVJJRC5nZXRFeGVjdXRhYmxlKCktPmdldE9mZnNldCgpKS0+CisJCQkJCQkJCQl0ZXN0KG9mZnNldCkgKQorCQkJCQkJCXsKKwkJCQkJCQkJKyt1bmNvdmVyZWRDb3VudDsKKworCQkJCQkJCQlpZiggaXNQZXJ0aW5lbnQoIGl0VHJhbnNpdGlvbiApICkKKwkJCQkJCQkJeworCQkJCQkJCQkJYVRhYmxlb2ZVbmNvdmVyZWRUcmFuc2l0aW9uLmFwcGVuZCggaXRUcmFuc2l0aW9uICk7CisJCQkJCQkJCX0KKwkJCQkJCQkJZWxzZQorCQkJCQkJCQl7CisJCQkJCQkJCQlub25QZXJ0aW5lbnRUcmFuc2l0aW9uLmFwcGVuZCggaXRUcmFuc2l0aW9uICk7CisJCQkJCQkJCX0KKworCQkJCQkJCQlpZiggdW5jb3ZlcmVkQ291bnQgPj0KKwkJCQkJCQkJCW1Db3ZlcmFnZVN0YXRpc3RpY3MuZ2V0TnVtYmVyT2ZVbmNvdmVyZWQoKSApCisJCQkJCQkJCXsKKy8vCQkJCQkJCQkJcmV0dXJuKCB0cnVlICk7CisJCQkJCQkJCQlnb3RvIGVuZENvbXB1dGluZzsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKwl9CisKKworZW5kQ29tcHV0aW5nOgorCisJYVRhYmxlb2ZVbmNvdmVyZWRUcmFuc2l0aW9uLmFwcGVuZCggbm9uUGVydGluZW50VHJhbnNpdGlvbiApOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCUFWTV9PU19DT1VUICA8PCAiQXZtQ292ZXJhZ2VUcmFuc2l0aW9uVmlldzo6Y29sbGVjdFVuY292ZXJlZFRyYW5zaXRpb246PiBjb3VudDogIgorCQkJPDwgYVRhYmxlb2ZVbmNvdmVyZWRUcmFuc2l0aW9uLnNpemUoKSA8PCBzdGQ6OmVuZGw7CisJQVZNX09TX1RSQUNFIDw8ICJBdm1Db3ZlcmFnZVRyYW5zaXRpb25WaWV3Ojpjb2xsZWN0VW5jb3ZlcmVkVHJhbnNpdGlvbjo+IGNvdW50OiAiCisJCQk8PCBhVGFibGVvZlVuY292ZXJlZFRyYW5zaXRpb24uc2l6ZSgpIDw8IHN0ZDo6ZW5kbDsKKworCVZlY3Rvck9mQXZtVHJhbnNpdGlvbjo6Y29uc3RfaXRlcmF0b3IgaXRUcmFuc2l0aW9uID0gYVRhYmxlb2ZVbmNvdmVyZWRUcmFuc2l0aW9uLmJlZ2luKCk7CisJVmVjdG9yT2ZBdm1UcmFuc2l0aW9uOjpjb25zdF9pdGVyYXRvciBlbmRUcmFuc2l0aW9uID0gYVRhYmxlb2ZVbmNvdmVyZWRUcmFuc2l0aW9uLmVuZCgpOworCWZvciggOyBpdFRyYW5zaXRpb24gIT0gZW5kVHJhbnNpdGlvbiA7ICsraXRUcmFuc2l0aW9uICkKKwl7CisJCUFWTV9PU19DT1VUIDw8ICJcdCIgIDw8ICgqaXRUcmFuc2l0aW9uKS0+c3RyVHJhbnNpdGlvbkhlYWRlcigpIDw8IHN0ZDo6ZW5kbDsKKworCQlBVk1fT1NfVFJBQ0UgPDwgIlx0IiA8PCAoKml0VHJhbnNpdGlvbiktPnN0clRyYW5zaXRpb25IZWFkZXIoKSA8PCBzdGQ6OmVuZGw7CisJfQorQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKK30KKworCisvKioKKyAqIENvbGxlY3QgdW5jb3ZlcmVkIHRyYW5zaXRpb24gaW4gYSBnaXZlbiBjb250ZXh0CisgKi8KK3ZvaWQgQXZtQ292ZXJhZ2VUcmFuc2l0aW9uVmlldzo6Y29sbGVjdFVuY292ZXJlZFRyYW5zaXRpb24oCisJCWNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVELCBWZWN0b3JPZkF2bVRyYW5zaXRpb24gJiB0YWJsZW9mVHJhbnNpdGlvbnMpCit7CisJRXhlY3V0YWJsZUZvcm0gKiB0bXBFeGVjdXRhYmxlID0gTlVMTDsKKworCUxpc3RPZkF2bVRyYW5zaXRpb24gbGlzdE9mT3V0Z29pbmdUcmFuc2l0aW9uOworCUxpc3RPZkF2bVRyYW5zaXRpb246OmNvbnN0X2l0ZXJhdG9yIGl0VHJhbnM7CisJTGlzdE9mQXZtVHJhbnNpdGlvbjo6Y29uc3RfaXRlcmF0b3IgZW5kVHJhbnM7CisKKwlpdFJGID0gYW5FRC5nZXRUYWJsZU9mUnVudGltZSgpLmJlZ2luKCk7CisJZW5kUkYgPSBhbkVELmdldFRhYmxlT2ZSdW50aW1lKCkuZW5kKCk7CisJZm9yKCA7IGl0UkYgIT0gZW5kUkYgOyArK2l0UkYgKQorCXsKKwkJaXRSSUQgPSAoKml0UkYpLT5nZXRSSUQoKTsKKworCQl0bXBFeGVjdXRhYmxlID0gaXRSSUQuZ2V0RXhlY3V0YWJsZSgpOworCisJCWlmKCBhbkVELmlzSWRsZU9yUnVubmluZyggaXRSSUQgKSAmJiB0bXBFeGVjdXRhYmxlLT5oYXNUcmFuc2l0aW9uKCkgKQorCQl7CisJCQl0bXBFeGVjdXRhYmxlLT5nZXRPdXRnb2luZ1RyYW5zaXRpb24oIGxpc3RPZk91dGdvaW5nVHJhbnNpdGlvbiApOworCisJCQlpdFRyYW5zID0gbGlzdE9mT3V0Z29pbmdUcmFuc2l0aW9uLmJlZ2luKCk7CisJCQllbmRUcmFucyA9IGxpc3RPZk91dGdvaW5nVHJhbnNpdGlvbi5lbmQoKTsKKwkJCWZvciggOyBpdFRyYW5zICE9IGVuZFRyYW5zIDsgKytpdFRyYW5zICkKKwkJCXsKKwkJCQlpZiggbm90IHRlc3RUcmFuc2l0aW9uQ292ZXJhZ2UoKml0VHJhbnMpICkKKwkJCQl7CisJCQkJCXRhYmxlb2ZUcmFuc2l0aW9ucy5hcHBlbmQoICppdFRyYW5zICk7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2NvdmVyYWdlL0F2bUNvdmVyYWdlVHJhbnNpdGlvblZpZXcuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9jb3ZlcmFnZS9Bdm1Db3ZlcmFnZVRyYW5zaXRpb25WaWV3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUyOGQ0ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9jb3ZlcmFnZS9Bdm1Db3ZlcmFnZVRyYW5zaXRpb25WaWV3LmgKQEAgLTAsMCArMSwzMTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxOSBub3YuIDIwMTQKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBBVk1DT1ZFUkFHRVRSQU5TSVRJT05WSUVXX0hfCisjZGVmaW5lIEFWTUNPVkVSQUdFVFJBTlNJVElPTlZJRVdfSF8KKworI2luY2x1ZGUgIkF2bUNvdmVyYWdlQWJzdHJhY3RWaWV3LmgiCisKKyNpbmNsdWRlIDxjb2xsZWN0aW9uL0JpdHNldC5oPgorI2luY2x1ZGUgPGNvbGxlY3Rpb24vVHlwZWRlZi5oPgorCisjaW5jbHVkZSA8Zm1sL2NvbW1vbi9TcGVjaWZpZXJFbGVtZW50Lmg+CisKKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25Db250ZXh0Lmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBXYWl0aW5nU3RyYXRlZ3k7CitjbGFzcyBBdm1Db3ZlcmFnZVByb2Nlc3NvcjsKK2NsYXNzIE91dFN0cmVhbTsKK2NsYXNzIEF2bVRyYW5zaXRpb247CisKK2NsYXNzIEV4ZWN1dGlvbkNvbnRleHQ7CitjbGFzcyBFeGVjdXRpb25EYXRhOworCitjbGFzcyBSdW50aW1lRm9ybTsKK2NsYXNzIFJ1bnRpbWVJRDsKKworCitjbGFzcyBBdm1Db3ZlcmFnZVRyYW5zaXRpb25WaWV3ICA6ICBwdWJsaWMgQXZtQ292ZXJhZ2VBYnN0cmFjdFZpZXcKK3sKKworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBBdm1Db3ZlcmFnZVRyYW5zaXRpb25WaWV3ICkKKworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQVRUUklCVVRFUworCSAqLworCVNwZWNpZmllcjo6REVTSUdOX0tJTkQgbVNjb3BlOworCisJLy8gVGFibGUgZGVzIGZsYWcgZGUgY291dmVydHVyZSBkZSB0cmFuc2l0aW9uIHBvdXIgY2hhcXVlIElOU1RBTkNFIGRlIG1hY2hpbmUKKwlBcnJheU9mQml0c2V0ICogbUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlOworCUFycmF5T2ZCaXRzZXQgKiBtVHJhbnNpdGlvbkNvdmVyYWdlVGFibGU7CisKKwlWZWN0b3JPZkV4ZWN1dGFibGVGb3JtIG1UYWJsZW9mUnVudGltZUV4ZWN1dGFibGU7CisKKwkvLyBDb21wdXRpbmcgTG9jYWwgVmFyaWFibGVzCisJQml0c2V0ICogdG1wUnVudGltZVRyYW5zaXRpb25CaXRzZXQ7CisKKwlFeGVjdXRpb25Db250ZXh0ICogbURpcmVjdGl2ZUhpdEVDOworCWJvb2wgbURpcmVjdGl2ZUZhaWxlZEZsYWc7CisKKwlWZWN0b3JPZkV4ZWN1dGlvbkNvbnRleHQgbUNlcnRhaW5seUhpdEVDOworCWF2bV9zaXplX3QgbUNlcnRhaW5seUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50OworCWF2bV9zaXplX3QgdG1wQ2VydGFpbmx5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQ7CisKKwlWZWN0b3JPZkV4ZWN1dGlvbkNvbnRleHQgbVN0cm9uZ2x5SGl0RUM7CisJYXZtX3NpemVfdCBtU3Ryb25nbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudDsKKwlhdm1fc2l6ZV90IHRtcFN0cm9uZ2x5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQ7CisKKwlWZWN0b3JPZkV4ZWN1dGlvbkNvbnRleHQgbVdlYWtseUhpdEVDOworCWF2bV9zaXplX3QgbVdlYWtseUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50OworCWF2bV9zaXplX3QgdG1wV2Vha2x5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQ7CisKKwlMaXN0T2ZFeGVjdXRpb25Db250ZXh0IG1XYWl0aW5nUXVldWU7CisKKwlhdm1fb2Zmc2V0X3Qgb2Zmc2V0OworCWF2bV9vZmZzZXRfdCBlbmRPZmZzZXQ7CisKKwlhdm1fb2Zmc2V0X3QgbWF4UmFuZG9tT2Zmc2V0OworCUJpdHNldCByYW5kb21PZmZzZXRCaXRzZXQ7CisKKwlFeGVjdXRpb25Db250ZXh0ICogdG1wRUM7CisJRXhlY3V0YWJsZUZvcm0gKiB0bXBFRjsKKwlSdW50aW1lSUQgaXRSSUQ7CisJVGFibGVPZlJ1bnRpbWVUOjpjb25zdF9pdGVyYXRvciBpdFJGOworCVRhYmxlT2ZSdW50aW1lVDo6Y29uc3RfaXRlcmF0b3IgZW5kUkY7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUF2bUNvdmVyYWdlVHJhbnNpdGlvblZpZXcoQXZtQ292ZXJhZ2VQcm9jZXNzb3IgJiBhQ292ZXJhZ2VQcm9jZXNzb3IsCisJCQlXT2JqZWN0ICogd2ZQYXJhbWV0ZXJPYmplY3QpCisJOiBBdm1Db3ZlcmFnZUFic3RyYWN0VmlldyggYUNvdmVyYWdlUHJvY2Vzc29yICwgd2ZQYXJhbWV0ZXJPYmplY3QgKSwKKwltU2NvcGUoIFNwZWNpZmllcjo6REVTSUdOX01PREVMX0tJTkQgKSwKKworCW1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZSggTlVMTCApLAorCW1UcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZSggTlVMTCApLAorCW1UYWJsZW9mUnVudGltZUV4ZWN1dGFibGUoICksCisKKwkvLyBDb21wdXRpbmcgTG9jYWwgVmFyaWFibGVzCisJdG1wUnVudGltZVRyYW5zaXRpb25CaXRzZXQoIE5VTEwgKSwKKworCW1EaXJlY3RpdmVIaXRFQyggTlVMTCApLAorCW1EaXJlY3RpdmVGYWlsZWRGbGFnKCBmYWxzZSApLAorCisJbUNlcnRhaW5seUhpdEVDKCApLAorCW1DZXJ0YWlubHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCggMCApLAorCXRtcENlcnRhaW5seUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50KCAwICksCisKKwltU3Ryb25nbHlIaXRFQyggKSwKKwltU3Ryb25nbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCggMCApLAorCXRtcFN0cm9uZ2x5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQoIDAgKSwKKworCW1XZWFrbHlIaXRFQyggKSwKKwltV2Vha2x5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQoIDAgKSwKKwl0bXBXZWFrbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCggMCApLAorCisJbVdhaXRpbmdRdWV1ZSggKSwKKworCW9mZnNldCggMCApLAorCWVuZE9mZnNldCggMCApLAorCisJbWF4UmFuZG9tT2Zmc2V0KCAwICksCisJcmFuZG9tT2Zmc2V0Qml0c2V0KCApLAorCisJdG1wRUMoIE5VTEwgKSwKKwl0bXBFRiggTlVMTCApLAorCWl0UklEKCApLAorCWl0UkYoICksCisJZW5kUkYoICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5Bdm1Db3ZlcmFnZVRyYW5zaXRpb25WaWV3KCk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQ09WRVJBR0UgUFJPQ0VTU09SIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQ09ORklHVVJFIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXZpcnR1YWwgYm9vbCBjb25maWd1cmVJbXBsKCk7CisKKwl2b2lkIGNvbmZpZ3VyZUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlRmxhZyhib29sIHZhbHVlKTsKKwl2b2lkIGNvbmZpZ3VyZUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlRmxhZygKKwkJCUV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlLCBib29sIHZhbHVlKTsKKworCXZvaWQgY29uZmlndXJlSW5zdGFuY2VDb3ZlcmFnZVRhYmxlRmxhZygpOworCXZvaWQgY29uZmlndXJlSW5zdGFuY2VDb3ZlcmFnZVRhYmxlRmxhZyhib29sIHZhbHVlKTsKKwl2b2lkIGNvbmZpZ3VyZUluc3RhbmNlQ292ZXJhZ2VUYWJsZUZsYWcoCisJCQljb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwgY29uc3QgUnVudGltZUlEICYgYVJJRCwgYm9vbCB2YWx1ZSk7CisKKwl2b2lkIGNvbmZpZ3VyZVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlRmxhZygKKwkJCUxpc3RPZkF2bVRyYW5zaXRpb24gJiBsaXN0T2ZUcmFuc2l0aW9uLCBib29sIHZhbHVlKTsKKworCisJQml0c2V0ICogZ2V0Q292ZXJhZ2VUYWJsZUJpdHNldChjb25zdCBSdW50aW1lSUQgJiBhUklEKTsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFJFUE9SVCBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwl2aXJ0dWFsIHZvaWQgcmVwb3J0TWluaW11bShPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKKwl2aXJ0dWFsIHZvaWQgcmVwb3J0RGVmYXVsdChPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBQUk9DRVNTIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8kCXZpcnR1YWwgYm9vbCBwcmVwcm9jZXNzKCk7CisvLworLy8JdmlydHVhbCBib29sIHBvc3Rwcm9jZXNzKCk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBQUk9DRVNTT1IgRklMVEVSSU5HIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWJvb2wgcHJlZmlsdGVyaW5nKExpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBlY1F1ZXVlKTsKKworCWJvb2wgcG9zdGZpbHRlcmluZyhMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgZWNRdWV1ZSk7CisKKwl2aXJ0dWFsIHZvaWQgdXBkYXRlQ292ZXJhZ2VUYWJsZShFeGVjdXRpb25Db250ZXh0ICogYW5FQyk7CisKKworCS8qKgorCSAqIEhldXJpc3RpYyA8PCBIaWdoIFByaW9yaXR5IENvbnRleHQgPj4gaW1wbGVtZW50YXRpb24KKwkgKiBSRVFVRVVFX1dBSVRJTkcgcGFydAorCSAqLworCWJvb2wgY29tcHV0ZUhpZ2hQcmlvcml0eUNvbnRleHQoTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGVjUXVldWUsCisJCQlXYWl0aW5nU3RyYXRlZ3kgJiBhV2FpdGluZ1N0cmF0ZWd5KTsKKworCWJvb2wgaGlnaFJlcXVldWVXYWl0aW5nVGFibGUoV2FpdGluZ1N0cmF0ZWd5ICYgYVdhaXRpbmdTdHJhdGVneSwKKwkJCWF2bV91aW50OF90IGFXZWlnaHRNaW4sIGF2bV91aW50OF90IGFXZWlnaHRNYXgpOworCisJLyoqCisJICogSGV1cmlzdGljIDw8IEFueSBQcmlvcml0eSBDb250ZXh0ID4+IGltcGxlbWVudGF0aW9uCisJICogUkVRVUVVRV9XQUlUSU5HIHBhcnQKKwkgKi8KKwlib29sIGNvbXB1dGVQcmlvcml0eUNvbnRleHQoTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGVjUXVldWUsCisJCQlXYWl0aW5nU3RyYXRlZ3kgJiBhV2FpdGluZ1N0cmF0ZWd5KTsKKworCWJvb2wgZWxzZVJlcXVldWVXYWl0aW5nVGFibGUoV2FpdGluZ1N0cmF0ZWd5ICYgYVdhaXRpbmdTdHJhdGVneSwKKwkJCWF2bV91aW50OF90IGFXZWlnaHRNaW4sIGF2bV91aW50OF90IGFXZWlnaHRNYXgpOworCisKKwkvKioKKwkgKiBVVElMUworCSAqLworCXZvaWQgc2V0SGl0V2VpZ2h0KFZlY3Rvck9mRXhlY3V0aW9uQ29udGV4dCAmIGhpdEVDLAorCQkJYXZtX3VpbnQ4X3QgaGl0V2VpZ2h0LCBib29sIHJhbmRvbUZsYWcsIGF2bV9zaXplX3QgaGl0Q291bnQpOworCisJdm9pZCBjb21wdXRlV2VpZ2h0KEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDKTsKKwl2b2lkIGNvbXB1dGVXZWlnaHROYWl2ZShFeGVjdXRpb25Db250ZXh0ICogYW5FQyk7CisJdm9pZCBjb21wdXRlV2VpZ2h0U21hcnQoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpOworCXZvaWQgY29tcHV0ZVdlaWdodEFncmVzc2l2ZShFeGVjdXRpb25Db250ZXh0ICogYW5FQyk7CisKKworCWJvb2wgY2hlY2tOb25Qcmlvcml0eVdlaWdodChFeGVjdXRpb25Db250ZXh0ICogYW5FQyk7CisKKwl2b2lkIGNvbXB1dGVQcmlvcml0eVdlaWdodChFeGVjdXRpb25Db250ZXh0ICogYW5FQyk7CisKKwlib29sIGNoZWNrQ2VydGFpbmx5UHJpb3JpdHlXZWlnaHQoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpOworCWJvb2wgY2hlY2tTdHJvbmdseVByaW9yaXR5V2VpZ2h0KEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDKTsKKwlib29sIGNoZWNrV2Vha2x5UHJpb3JpdHlXZWlnaHQoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpOworCisKKwl2b2lkIGNvbXB1dGVXZWlnaHRPZlJlc3VsdChjb25zdCBMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgZWNRdWV1ZSk7CisKKworCWF2bV91aW50OF90IGNoZWNrRmlyZWFiaWxpdHkoY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQsCisJCQljb25zdCBSdW50aW1lSUQgJiBhUklELCBBdm1UcmFuc2l0aW9uICogYVRyYW5zaXRpb24pOworCisJdm9pZCBjb21wdXRlRmlyZWFiaWxpdHkoY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQsCisJCQljb25zdCBSdW50aW1lSUQgJiBhUklELCBBdm1UcmFuc2l0aW9uICogYVRyYW5zaXRpb24pOworCisJdm9pZCB0cmFjZUZpcmVhYmlsaXR5KE91dFN0cmVhbSAmIG9zLCBjb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsIEF2bVRyYW5zaXRpb24gKiBhVHJhbnNpdGlvbik7CisKKworCWJvb2wgaXNDb250cm9sTG9vcChFeGVjdXRpb25Db250ZXh0ICogYW5FQyk7CisJYm9vbCBpc1N5bnRheGljTG9vcChFeGVjdXRpb25Db250ZXh0ICogYW5FQyk7CisJYm9vbCBpc1RyaXZpYWxMb29wKEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDKTsKKworCXZvaWQgZmlyZWFibGVUcmFuc2l0aW9uQ291bnQoCisJCQljb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwgY29uc3QgUnVudGltZUlEICYgYVJJRCk7CisKKwl2b2lkIGZpcmVhYmxlVHJhbnNpdGlvbkNvdW50KGNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVEKTsKKworCXZvaWQgZmlyZWFibGVUcmFuc2l0aW9uQ291bnQoCisJCQljb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwgY29uc3QgUnVudGltZUZvcm0gJiBhUkYpOworCisJdm9pZCBmaXJlYWJsZVRyYW5zaXRpb25UcmFjZShPdXRTdHJlYW0gJiBvcywgY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQpOworCisJdm9pZCBmaXJlYWJsZVRyYW5zaXRpb25UcmFjZShPdXRTdHJlYW0gJiBvcywKKwkJCWNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVELCBjb25zdCBSdW50aW1lRm9ybSAmIGFSRik7CisKKwl2b2lkIHVwZGF0ZVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlKAorCQkJRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMsIGNvbnN0IEJGICYgYUZpcmVkQ29kZSk7CisKKwl2b2lkIHVwZGF0ZVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlKEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDLAorCQkJY29uc3QgUnVudGltZUlEICYgYVJJRCwgQXZtVHJhbnNpdGlvbiAqIGZpcmVkVHJhbnNpdGlvbik7CisKKwlib29sIHRlc3RUcmFuc2l0aW9uQ292ZXJhZ2UoQXZtVHJhbnNpdGlvbiAqIGZpcmVkVHJhbnNpdGlvbik7CisKKworCS8qKgorCSAqIENvbGxlY3QgdW5jb3ZlcmVkIHRyYW5zaXRpb24KKwkgKi8KKwkvLyBVcGRhdGUgdW5jb3ZlcmVkIHRhYmxlCisJdm9pZCB1cGRhdGVVbmNvdmVyZWRUcmFuc2l0aW9uKAorCQkJVmVjdG9yT2ZBdm1UcmFuc2l0aW9uICYgYVRhYmxlb2ZVbmNvdmVyZWRUcmFuc2l0aW9uKTsKKworCS8vIENvbGxlY3QgYWxsIHVuY292ZXJlZAorCXZvaWQgY29sbGVjdFVuY292ZXJlZFRyYW5zaXRpb24oCisJCQlWZWN0b3JPZkF2bVRyYW5zaXRpb24gJiBhVGFibGVvZlVuY292ZXJlZFRyYW5zaXRpb24pOworCisJLy8gQ29sbGVjdCB1bmNvdmVyZWQgaW4gYSBnaXZlbiBjb250ZXh0CisJdm9pZCBjb2xsZWN0VW5jb3ZlcmVkVHJhbnNpdGlvbihjb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwKKwkJCVZlY3Rvck9mQXZtVHJhbnNpdGlvbiAmIGxpc3RvZlRyYW5zaXRpb24pOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gU0VSSUFMSVpBVElPTiBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwl2aXJ0dWFsIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKK307CisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworCisjZW5kaWYgLyogQVZNQ09WRVJBR0VUUkFOU0lUSU9OVklFV19IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2NvdmVyYWdlL0Jhc2VDb3ZlcmFnZUZpbHRlci5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vY292ZXJhZ2UvQmFzZUNvdmVyYWdlRmlsdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2YzNWZjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2NvdmVyYWdlL0Jhc2VDb3ZlcmFnZUZpbHRlci5jcHAKQEAgLTAsMCArMSwzMjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyNiBqdWlsLiAyMDA4CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiQmFzZUNvdmVyYWdlRmlsdGVyLmgiCisKKyNpbmNsdWRlIDxmYW0vcXVldWUvRXhlY3V0aW9uUXVldWUuaD4KKworI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9RdWVyeS5oPgorI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9XT2JqZWN0Lmg+CisKKyNpbmNsdWRlIDxzZXcvQ29uZmlndXJhdGlvbi5oPgorI2luY2x1ZGUgPHNldy9Xb3JrZmxvdy5oPgorCisKKyNpbmNsdWRlIDxib29zdC9mb3JtYXQuaHBwPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitwcm90b3R5cGUgZmlsdGVyOjptYWNoaW5lX2NvdmVyYWdlIGFzICZhdm06OmNvcmUuZmlsdGVyLk1BQ0hJTkVfQ09WRVJBR0UgaXMKKwlzZWN0aW9uIFBST1BFUlRZCisJCS8vIE5vbWJyZSBkZSBwYXMgZGUgY2FsY3VsICJjdW11bMOpcyIgYXZhbnQgZGUgZMOpYnV0ZXIgbGEgdsOpcmlmaWNhdGlvbiBkZSBsYSBjb3V2ZXJ0dXJlCisJCUBiZWdpbl9zdGVwID0gMDsKKworCQkvLyBBcnLDqHRlIGwnZXjDqWN1dGlvbiBkw6hzIHF1ZSBsYSBjb3V2ZXJ0dXJlIGVzdCBjb21wbMOodGUKKwkJQHN0b3AgPSB0cnVlOworCisJCS8vIEFycsOodGUgbCdleMOpY3V0aW9uIGF1IHBsdXTDtHQKKwkJQG1pbmltaXplID0gdHJ1ZTsKKworCQkvLyBBcnLDqHRlIGwnZXjDqWN1dGlvbiBkdSBjaGVtaW4gY291cmFudCBkw6hzIHF1J3VuIG9iamVjdGlmIGVzdCBhdHRlaW50CisJCUBicmVhayA9IHRydWU7CisKKwkJLy8gRWxhZ2FnZSBkdSBncmFwaGUgZGVzIHNjw6luYXJpb3Mgw6AgbGEgZmluIGRlIGxhIHbDqXJpZmljYXRpb24KKwkJQHNsaWNlID0gdHJ1ZTsKKworCQkvLyBBY3RpdmUgbCd1dGlsaXNhdGlvbiBkJ2hldXJpc3RpcXVlCisJCUBoZXVyaXN0aWMgPSB0cnVlOworCisJCS8vIGNob2l4IGRlIGwnaGV1cmlzdGlxdWUgZGUgZMOpcGFydAorCQkvLyBiYXNpYyB8IG5haXZlIHwgc21hcnQgfCBhZ3Jlc3NpdmUKKwkJQGhldXJpc3RpYyNzdGFydCA9ICdiYXNpYyc7CisKKwkJLy8gTm9tYnJlIGQnZXNzYWlzIGQnaGV1cmlzdGlxdWVzCisJCUBoZXVyaXN0aWMjdHJpYWxzID0gNzsKKworCQkvLyBDcml0w6hyZSBkZSBzYXRpc2ZhY3Rpb24gZHUgc3VjY8OocyBkZXMgaGV1cmlzdGlxdWVzCisJCS8vIHRhdXggZGUgY291dmVydGUgLyBub21icmUgZCfDqWzDqW1lbnQgcmVzdGFudC4uLgorCQlAb2JqZWN0aXZlI3JhdGUgPSA5NTsKKwkJQG9iamVjdGl2ZSNyZXN0ID0gNTsKKwllbmRzZWN0aW9uIFBST1BFUlRZCisKKwlzZWN0aW9uIExPRworCQkvLyAlMSUgLS0+IG51bWJlciBvZiBDb3ZlcmVkIEVsZW1lbnRzCisJCS8vICUyJSAtLT4gbnVtYmVyIG9mIEVsZW1lbnRzCisJCUBldmFsICAgPSAiY292ZXJhZ2U6ICUxJSAvICUyJVxuIjsKKwkJQHJlc3VsdCA9ICJjb3ZlcmFnZTogJTElIC8gJTIlXG4iOworCQlAcmVwb3J0ID0gImNvdmVyYWdlOiAlMSUgLyAlMiVcbiI7CisJZW5kc2VjdGlvbiBMT0cKK2VuZHByb3RvdHlwZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKioKKyAqIENPTkZJR1VSRQorICovCitib29sIEJhc2VDb3ZlcmFnZUZpbHRlcjo6Y29uZmlndXJlSW1wbCgpCit7CisJbUNvdmVyYWdlU3RhdGlzdGljcy5yZXNldENvdW50ZXIoKTsKKworCWxvbmcgaW50UHJvcGVydHkgPSAwOworCisJLy8gR2xvYmFsIGNvbmZpZyBzY29wZQorCVdPYmplY3QgKiBzZWN0aW9uU1lNQkVYID0gZ2V0Q29uZmlndXJhdGlvbigpLmdldFdvcmtmbG93KCkuZ2V0U1lNQkVYKCk7CisKKwltQmFja3dhcmRBbmFseXNpc0xvb2thaGVhZERlcHRoID0KKwkJCVF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eVNpemVUKCBzZWN0aW9uU1lNQkVYLCBPUl9XSUQyKAorCQkJCQlDT05TX1dJRDQoImJhY2t3YXJkIiwgImFuYWx5c2lzIiwgImxvb2thaGVhZCIsICJkZXB0aCIpLAorCQkJCQlDT05TX1dJRDMoImJhY2t3YXJkIiwgImRlcHRoIiwgImFuYWx5emUiKSApLCAvLyBARGVwcmVjYXRlZAorCQkJCUFWTV9OVU1FUklDX01BWF9TSVpFX1QsIEFWTV9OVU1FUklDX01BWF9TSVpFX1QpOworCisJbUZvcndhcmRBbmFseXNpc0xvb2thaGVhZERlcHRoID0KKwkJCVF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eVNpemVUKCBzZWN0aW9uU1lNQkVYLAorCQkJCQlDT05TX1dJRDQoImZvcndhcmQiLCAiYW5hbHlzaXMiLCAibG9va2FoZWFkIiwgImRlcHRoIiksCisJCQkJQVZNX05VTUVSSUNfTUFYX1NJWkVfVCwgQVZNX05VTUVSSUNfTUFYX1NJWkVfVCk7CisKKworCVdPYmplY3QgKiB0aGVQUk9QRVJUWSA9IFF1ZXJ5OjpnZXRSZWdleFdTZXF1ZW5jZSgKKwkJCWdldFBhcmFtZXRlcldPYmplY3QoKSwgT1JfV0lEMigicHJvcGVydHkiLCAiUFJPUEVSVFkiKSk7CisKKwlpZiggdGhlUFJPUEVSVFkgIT0gV09iamVjdDo6X05VTExfICkKKwl7CisJCWludFByb3BlcnR5ID0gUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5SW50KAorCQkJCXRoZVBST1BFUlRZLCBDT05TX1dJRDIoIihzdGFydHxiZWdpbikiLCAic3RlcCIpLCAwKTsKKwkJaWYoIGludFByb3BlcnR5IDwgMCApCisJCXsKKwkJCUFWTV9PU19MT0cgPDwgIkludmFsaWQgZXZhbCBiZWdpbmluZyBzdGVwICEgPT4gcmVwbGFjZSBieSA8PCAiCisJCQkJCTw8IDEgPDwgIiA+PiIgPDwgc3RkOjplbmRsOworCisJCQltQmVnaW5uaW5nU3RlcFRpbW91dCA9IDA7CisJCX0KKwkJZWxzZQorCQl7CisJCQltQmVnaW5uaW5nU3RlcFRpbW91dCA9IGludFByb3BlcnR5OworCQl9CisKKwkJbVN0b3BGbGFnICA9IFF1ZXJ5OjpnZXRXUHJvcGVydHlCb29sZWFuKHRoZVBST1BFUlRZLCAic3RvcCIsIGZhbHNlKTsKKworCQltTWluaW1pemF0aW9uRmxhZyA9CisJCQkJUXVlcnk6OmdldFdQcm9wZXJ0eUJvb2xlYW4odGhlUFJPUEVSVFksICJtaW5pbWl6ZSIsIHRydWUpOworCisJCW1Ob3JtYWxpemF0aW9uRmxhZyA9CisJCQkJUXVlcnk6OmdldFdQcm9wZXJ0eUJvb2xlYW4odGhlUFJPUEVSVFksICJub3JtYWxpemUiLCB0cnVlKTsKKworCQltQnJlYWtGbGFnID0gUXVlcnk6OmdldFdQcm9wZXJ0eUJvb2xlYW4odGhlUFJPUEVSVFksICJicmVhayIsIGZhbHNlKTsKKworCQltU2xpY2VGbGFnID0gUXVlcnk6OmdldFdQcm9wZXJ0eUJvb2xlYW4odGhlUFJPUEVSVFksICJzbGljZSIsIGZhbHNlKTsKKwl9CisKKworCW1Db25maWdGbGFnID0gbUhldXJpc3RpY1Byb3BlcnR5LmNvbmZpZ3VyZSggZ2V0UGFyYW1ldGVyV09iamVjdCgpICkKKwkJCSYmIG1Db25maWdGbGFnOworCisJV09iamVjdCAqIHRoZUhFVVJJU1RJQyA9IFF1ZXJ5OjpnZXRSZWdleFdTZXF1ZW5jZShnZXRQYXJhbWV0ZXJXT2JqZWN0KCksCisJCQlPUl9XSUQyKCJoZXVyaXN0aWMiLCAiSEVVUklTVElDIiksIHRoZVBST1BFUlRZKTsKKwlpZiggKHRoZUhFVVJJU1RJQyAhPSBXT2JqZWN0OjpfTlVMTF8pIC8qJiYgbUhldXJpc3RpY0ZsYWcqLyApCisJeworCQltSGV1cmlzdGljUHJvcGVydHkubUhldXJpc3RpY0NsYXNzID0KKwkJCQlBdm1Db3ZlcmFnZUhldXJpc3RpY1Byb3BlcnR5Ojp0b0hldXJpc3RpY0NsYXNzKAorCQkJCQkJUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5U3RyaW5nKHRoZUhFVVJJU1RJQywKKwkJCQkJCQkJQ09OU19XSUQyKCJoZXVyaXN0aWMiLCAic3RhcnQiKSwgImJhc2ljIikgKTsKKworCQlpbnRQcm9wZXJ0eSA9IFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eUludCgKKwkJCQl0aGVIRVVSSVNUSUMsIENPTlNfV0lEMigib2JqZWN0aXZlIiwgInJhdGUiKSwgMTAwKTsKKwkJbUNvdmVyYWdlU3RhdGlzdGljcy5tQ292ZXJhZ2VSYXRlR29hbCA9ICggKGludFByb3BlcnR5ID4gMCkgJiYKKwkJCQkoaW50UHJvcGVydHkgPD0gMTAwKSApID8gIGludFByb3BlcnR5IDogMTAwOworCisJCW1Db3ZlcmFnZVN0YXRpc3RpY3MubUNvdmVyYWdlUmVzdEdvYWwgPQorCQkJCVF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eVNpemVUKAorCQkJCQkJdGhlSEVVUklTVElDLCBDT05TX1dJRDIoIm9iamVjdGl2ZSIsICJyZXN0IiksIDAsIDApOworCisJCS8vIExvY2FsIGNvbmZpZyBzY29wZQorCQltQmFja3dhcmRBbmFseXNpc0xvb2thaGVhZERlcHRoID0gUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5U2l6ZVQoCisJCQl0aGVIRVVSSVNUSUMsIE9SX1dJRDIoCisJCQkJQ09OU19XSUQ0KCJiYWNrd2FyZCIsICJhbmFseXNpcyIsICJsb29rYWhlYWQiLCAiZGVwdGgiKSwKKwkJCQlDT05TX1dJRDMoImJhY2t3YXJkIiwgImRlcHRoIiwgImFuYWx5emUiKSApLCAvLyBARGVwcmVjYXRlZAorCQkJbUJhY2t3YXJkQW5hbHlzaXNMb29rYWhlYWREZXB0aCwKKwkJCW1CYWNrd2FyZEFuYWx5c2lzTG9va2FoZWFkRGVwdGgpOworCisJCW1Gb3J3YXJkQW5hbHlzaXNMb29rYWhlYWREZXB0aCA9IFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eVNpemVUKAorCQkJdGhlSEVVUklTVElDLCBDT05TX1dJRDQoImZvcndhcmQiLCAiYW5hbHlzaXMiLCAibG9va2FoZWFkIiwgImRlcHRoIiksCisJCQltRm9yd2FyZEFuYWx5c2lzTG9va2FoZWFkRGVwdGgsIG1Gb3J3YXJkQW5hbHlzaXNMb29rYWhlYWREZXB0aCk7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKKworLyoqCisgKiBQUkUtUFJPQ0VTUworICovCitib29sIEJhc2VDb3ZlcmFnZUZpbHRlcjo6cHJlcHJvY2VzcygpCit7CisJaWYoIG1IZXVyaXN0aWNQcm9wZXJ0eS5tSGV1cmlzdGljRW5hYmxlZCApCisJeworCQlpZiggbm90IG1TdGF0ZW1hY2hpbmVSZWFjaGFiaWxpdHkuY29tcHV0ZVJlYWNoYWJsZUNvbXBvbmVudCgKKwkJCQlnZXRDb25maWd1cmF0aW9uKCksIG1CYWNrd2FyZEFuYWx5c2lzTG9va2FoZWFkRGVwdGgpICkKKwkJeworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisKK0FWTV9JRl9ERUJVR19GTEFHMiggUFJFX1BST0NFU1NJTkcgLCBFWEVDVVRBQkxFICkKKwlnZXRDb25maWd1cmF0aW9uKCkuc2VyaWFsaXplRGVidWdFeGVjdXRhYmxlKCAicHJlcHJvY2VzcyIgKTsKK0FWTV9FTkRJRl9ERUJVR19GTEFHMiggUFJFX1BST0NFU1NJTkcgLCBFWEVDVVRBQkxFICkKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvKioKKyAqIFBSRS1GSUxURVIKKyAqLworYm9vbCBCYXNlQ292ZXJhZ2VGaWx0ZXI6OnByZWZpbHRlcigpCit7CisJaWYoIG1Db3ZlcmFnZVN0YXRpc3RpY3MuZ29hbEFjaGlldmVkKCkgJiYgbVN0b3BGbGFnICkKKwl7CisJCWVjUXVldWUgPSAmKCBnZXRFeGVjdXRpb25RdWV1ZSgpLmdldFJlYWR5UXVldWUoKSApOworCisJCUV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDID0gTlVMTDsKKwkJd2hpbGUoIGVjUXVldWUtPm5vbmVtcHR5KCkgKQorCQl7CisJCQllY1F1ZXVlLT5wb3BfZmlyc3RfdG8oIGFuRUMgKTsKKworCQkJZ2V0RXhlY3V0aW9uUXVldWUoKS5hcHBlbmRGYWlsZWQoIGFuRUMgKTsKKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworCisvKioKKyAqIEZJTFRFUklORyBGSU5BTElaRQorICovCitib29sIEJhc2VDb3ZlcmFnZUZpbHRlcjo6ZmlsdGVyaW5nRmluYWxpemUoKQoreworCWlmKCBtU2xpY2VGbGFnICkKKwl7CisJCW1MaXN0T2ZMZWFmRUMuY2xlYXIoKTsKKworCQkvLyBFTEFHQUdFIERBTlMgVE9VVCBMRSBHUkFQSCEhISEhCisJCWNvbXB1dGVMZWFmRUMoZ2V0Q29uZmlndXJhdGlvbigpLmdldFRyYWNlKCksIG1MaXN0T2ZMZWFmRUMpOworCisJCXNsaWNlKG1MaXN0T2ZMZWFmRUMpOworCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBGSU5BTCBTTElDSU5HIFRPT0xTCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIEJhc2VDb3ZlcmFnZUZpbHRlcjo6aXNTbGljZWFibGVDb250ZXh0KEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKSBjb25zdAoreworCWlmKCBtTGlzdE9mUG9zaXRpdmVFQy5jb250YWlucygmIGFuRUMpICApCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiggQWJzdHJhY3RQcm9jZXNzb3JVbml0Ojppc1NsaWNlYWJsZUNvbnRleHQoYW5FQykgKTsKKwl9Cit9CisKKworLyoqCisgKiBHT0FMX0FDSElFVkVECisgKi8KK3ZvaWQgQmFzZUNvdmVyYWdlRmlsdGVyOjpoYW5kbGVSZXF1ZXN0R29hbEFjaGlldmVkKCkKK3sKKwkvLyEhIE5PVEhJTkcKK30KKworLyoqCisgKiBFVkFMIFRSQUNFCisgKi8KK3ZvaWQgQmFzZUNvdmVyYWdlRmlsdGVyOjp0cmFjZU1pbmltdW1QcmVFdmFsKAorCQlPdXRTdHJlYW0gJiBvcywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpIGNvbnN0Cit7CisJYm9vc3Q6OmZvcm1hdCBmb3JtYXR0ZXIobVByZUV2YWxUcmFjZUZvcm1hdHRlcik7CisJZm9ybWF0dGVyLmV4Y2VwdGlvbnMoIGJvb3N0Ojppbzo6bm9fZXJyb3JfYml0cyApOworCisvLwlmb3JtYXR0ZXIuZXhjZXB0aW9ucyggYm9vc3Q6OmlvOjphbGxfZXJyb3JfYml0cyBeCisvLwkJCSggYm9vc3Q6OmlvOjp0b29fbWFueV9hcmdzX2JpdCB8IGJvb3N0Ojppbzo6dG9vX2Zld19hcmdzX2JpdCApICk7CisKKwlvcyA8PCBmb3JtYXR0ZXIKKwkJCSUgbUNvdmVyYWdlU3RhdGlzdGljcy5tTnVtYmVyT2ZDb3ZlcmVkCisJCQklIG1Db3ZlcmFnZVN0YXRpc3RpY3MubU51bWJlck9mRWxlbWVudHMKKwkJCTw8IHN0ZDo6Zmx1c2g7Cit9CisKKwordm9pZCBCYXNlQ292ZXJhZ2VGaWx0ZXI6OnRyYWNlRGVmYXVsdFByZUV2YWwoCisJCU91dFN0cmVhbSAmIG9zLCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQykgY29uc3QKK3sKKwlvcyA8PCAiY292ZXJhZ2U8ICIgPDwgZ2V0UGFyYW1ldGVyV09iamVjdCgpLT5nZXROYW1lSUQoKSA8PCAiID46ICIKKwkJCTw8IG1Db3ZlcmFnZVN0YXRpc3RpY3MubU51bWJlck9mQ292ZXJlZCA8PCAiIC8gIgorCQkJPDwgbUNvdmVyYWdlU3RhdGlzdGljcy5tTnVtYmVyT2ZFbGVtZW50cyA8PCBzdGQ6OmVuZGw7Cit9CisKKwordm9pZCBCYXNlQ292ZXJhZ2VGaWx0ZXI6OnRyYWNlQm91bmRFdmFsKE91dFN0cmVhbSAmIG9zKSBjb25zdAoreworCWJvb3N0Ojpmb3JtYXQgZm9ybWF0dGVyKG1Cb3VuZEV2YWxUcmFjZUZvcm1hdHRlcik7CisJZm9ybWF0dGVyLmV4Y2VwdGlvbnMoIGJvb3N0Ojppbzo6bm9fZXJyb3JfYml0cyApOworCisvLwlmb3JtYXR0ZXIuZXhjZXB0aW9ucyggYm9vc3Q6OmlvOjphbGxfZXJyb3JfYml0cyBeCisvLwkJCSggYm9vc3Q6OmlvOjp0b29fbWFueV9hcmdzX2JpdCB8IGJvb3N0Ojppbzo6dG9vX2Zld19hcmdzX2JpdCApICk7CisKKwlvcyA8PCBmb3JtYXR0ZXIKKwkJCSUgbUNvdmVyYWdlU3RhdGlzdGljcy5tTnVtYmVyT2ZDb3ZlcmVkCisJCQklIG1Db3ZlcmFnZVN0YXRpc3RpY3MubU51bWJlck9mRWxlbWVudHMKKwkJCTw8IHN0ZDo6Zmx1c2g7Cit9CisKKwordm9pZCBCYXNlQ292ZXJhZ2VGaWx0ZXI6OnJlcG9ydEV2YWwoT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJYm9vc3Q6OmZvcm1hdCBmb3JtYXR0ZXIobVJlcG9ydEV2YWxUcmFjZUZvcm1hdHRlcik7CisJZm9ybWF0dGVyLmV4Y2VwdGlvbnMoIGJvb3N0Ojppbzo6bm9fZXJyb3JfYml0cyApOworCisvLwlmb3JtYXR0ZXIuZXhjZXB0aW9ucyggYm9vc3Q6OmlvOjphbGxfZXJyb3JfYml0cyBeCisvLwkJCSggYm9vc3Q6OmlvOjp0b29fbWFueV9hcmdzX2JpdCB8IGJvb3N0Ojppbzo6dG9vX2Zld19hcmdzX2JpdCApICk7CisKKwlvcyA8PCBmb3JtYXR0ZXIKKwkJCSUgbUNvdmVyYWdlU3RhdGlzdGljcy5tTnVtYmVyT2ZDb3ZlcmVkCisJCQklIG1Db3ZlcmFnZVN0YXRpc3RpY3MubU51bWJlck9mRWxlbWVudHMKKwkJCTw8IHN0ZDo6Zmx1c2g7Cit9CisKKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vY292ZXJhZ2UvQmFzZUNvdmVyYWdlRmlsdGVyLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vY292ZXJhZ2UvQmFzZUNvdmVyYWdlRmlsdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJkYmY5NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9jb3ZlcmFnZS9CYXNlQ292ZXJhZ2VGaWx0ZXIuaApAQCAtMCwwICsxLDMxNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDI2IGp1aWwuIDIwMDgKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBCQVNFQ09WRVJBR0VGSUxURVJfSF8KKyNkZWZpbmUgQkFTRUNPVkVSQUdFRklMVEVSX0hfCisKKyNpbmNsdWRlIDxmYW0vYXBpL0Fic3RyYWN0UHJvY2Vzc29yVW5pdC5oPgorCisjaW5jbHVkZSA8ZmFtL2NvdmVyYWdlL0F2bUNvdmVyYWdlSGV1cmlzdGljUHJvcGVydHkuaD4KKyNpbmNsdWRlIDxmYW0vY292ZXJhZ2UvQXZtQ292ZXJhZ2VTdGF0aXN0aWNzLmg+CisjaW5jbHVkZSA8ZmFtL2NvdmVyYWdlL1N0YXRlbWFjaGluZVJlYWNoYWJpbGl0eS5oPgorCisjaW5jbHVkZSA8Y29sbGVjdGlvbi9UeXBlZGVmLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIEJhc2VDb3ZlcmFnZUZpbHRlciA6CisJCXB1YmxpYyBBYnN0cmFjdFByb2Nlc3NvclVuaXQsCisJCXB1YmxpYyBJSGV1cmlzdGljQ29udGV4dFdlaWdodAoreworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQVRUUklCVVRFCisJICovCisJYm9vbCBtU3RvcEZsYWc7CisJYm9vbCBtTWluaW1pemF0aW9uRmxhZzsKKwlib29sIG1Ob3JtYWxpemF0aW9uRmxhZzsKKwlib29sIG1CcmVha0ZsYWc7CisJYm9vbCBtU2xpY2VGbGFnOworCisJYXZtX3NpemVfdCBtQmFja3dhcmRBbmFseXNpc0xvb2thaGVhZERlcHRoOworCWF2bV9zaXplX3QgbUZvcndhcmRBbmFseXNpc0xvb2thaGVhZERlcHRoOworCisJU3RhdGVtYWNoaW5lUmVhY2hhYmlsaXR5IG1TdGF0ZW1hY2hpbmVSZWFjaGFiaWxpdHk7CisKKwlBdm1Db3ZlcmFnZUhldXJpc3RpY1Byb3BlcnR5IG1IZXVyaXN0aWNQcm9wZXJ0eTsKKworCUF2bUNvdmVyYWdlU3RhdGlzdGljcyBtQ292ZXJhZ2VTdGF0aXN0aWNzOworCisJTGlzdE9mRXhlY3V0aW9uQ29udGV4dCBtTGlzdE9mTGVhZkVDOworCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQgbUxpc3RPZlBvc2l0aXZlRUM7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUJhc2VDb3ZlcmFnZUZpbHRlcihTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXIgJiBhTWFuYWdlciwgV09iamVjdCAqIHdmUGFyYW1ldGVyT2JqZWN0LAorCQkJYXZtX2NvbXB1dGluZ19wcm9jZXNzX3N0YWdlX3QgcmVxdWlyZWRTdGFnZSwKKwkJCWNvbnN0IGF2bV91aW50OF90ICogYVByZWNlZGVuY2UvKiA9IERFRkFVTFRfUFJFQ0VERU5DRV9PRl9QUk9DRVNTT1IqLykKKwk6IEFic3RyYWN0UHJvY2Vzc29yVW5pdChhTWFuYWdlciwgd2ZQYXJhbWV0ZXJPYmplY3QsIHJlcXVpcmVkU3RhZ2UsIGFQcmVjZWRlbmNlKSwKKwlJSGV1cmlzdGljQ29udGV4dFdlaWdodCggKSwKKworCW1TdG9wRmxhZyggZmFsc2UgKSwKKworCW1NaW5pbWl6YXRpb25GbGFnKCB0cnVlICksCisJbU5vcm1hbGl6YXRpb25GbGFnKCB0cnVlICksCisKKwltQnJlYWtGbGFnKCBmYWxzZSApLAorCW1TbGljZUZsYWcoIGZhbHNlICksCisKKwltQmFja3dhcmRBbmFseXNpc0xvb2thaGVhZERlcHRoKCBBVk1fTlVNRVJJQ19NQVhfU0laRV9UICksCisJbUZvcndhcmRBbmFseXNpc0xvb2thaGVhZERlcHRoICggQVZNX05VTUVSSUNfTUFYX1NJWkVfVCApLAorCisJbVN0YXRlbWFjaGluZVJlYWNoYWJpbGl0eSggKnRoaXMgKSwKKworCW1IZXVyaXN0aWNQcm9wZXJ0eSggSUhldXJpc3RpY0NsYXNzOjpIRVVSSVNUSUNfQkFTSUNfQ0xBU1MgKSwKKworCW1Db3ZlcmFnZVN0YXRpc3RpY3MoIDEwMCAsIDAgKSwKKworCW1MaXN0T2ZMZWFmRUMoKSwKKwltTGlzdE9mUG9zaXRpdmVFQygpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+QmFzZUNvdmVyYWdlRmlsdGVyKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogR0VUVEVSCisJICogbU1pbmltaXphdGlvbkZsYWcKKwkgKiBtTm9ybWFsaXphdGlvbkZsYWcKKwkgKi8KKwlib29sIGlzTWluaW1pemF0aW9uRmxhZygpCisJeworCQlyZXR1cm4oIG1NaW5pbWl6YXRpb25GbGFnICk7CisJfQorCisJYm9vbCBpc05vcm1hbGl6YXRpb25GbGFnKCkKKwl7CisJCXJldHVybiggbU5vcm1hbGl6YXRpb25GbGFnICk7CisJfQorCisKKwkvKioKKwkgKiBtQ292ZXJhZ2VTdGF0aXN0aWNzCisJICovCisJaW5saW5lIEF2bUNvdmVyYWdlU3RhdGlzdGljcyAmIGdldENvdmVyYWdlU3RhdGlzdGljcygpCisJeworCQlyZXR1cm4gbUNvdmVyYWdlU3RhdGlzdGljczsKKwl9CisKKwlpbmxpbmUgdm9pZCByZXNldENvdmVyYWdlU3RhdGlzdGljcygpCisJeworCQlyZXR1cm4gbUNvdmVyYWdlU3RhdGlzdGljcy5yZXNldENvdmVyYWdlQ291bnRlcigpOworCX0KKworCisJLyoqCisJICogQ09ORklHVVJFCisJICovCisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0RGVmYXVsdFByZUV2YWxUcmFjZUZvcm1hdHRlcigpIGNvbnN0CisJeworCQlyZXR1cm4oIE9TUygpIDw8ICIgIGNvdmVyYWdlPCAiCisJCQkJPDwgZ2V0UGFyYW1ldGVyV09iamVjdCgpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQkJPDwgIiA+OiAlMSUgLyAlMiUiICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0RGVmYXVsdFBvc3RFdmFsVHJhY2VGb3JtYXR0ZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBPU1MoKSA8PCAiICBjb3ZlcmFnZTwgIgorCQkJCTw8IGdldFBhcmFtZXRlcldPYmplY3QoKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJCTw8ICIgPjogJTElIC8gJTIlIiApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0RGVmYXVsdEJvdW5kRXZhbFRyYWNlRm9ybWF0dGVyKCkgY29uc3QKKwl7CisJCXJldHVybiggT1NTKCkgPDwgIiAgY292ZXJhZ2U8ICIKKwkJCQk8PCBnZXRQYXJhbWV0ZXJXT2JqZWN0KCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKwkJCQk8PCAiID46ICUxJSAvICUyJSIgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXREZWZhdWx0UmVwb3J0RXZhbFRyYWNlRm9ybWF0dGVyKCkgY29uc3QKKwl7CisJCXJldHVybiggT1NTKCkgPDwgIiAgY292ZXJhZ2U8ICIKKwkJCQk8PCBnZXRQYXJhbWV0ZXJXT2JqZWN0KCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKwkJCQk8PCAiID46ICUxJSAvICUyJSIgKTsKKwl9CisKKworCXZpcnR1YWwgYm9vbCBjb25maWd1cmVJbXBsKCk7CisKKworCS8qKgorCSAqIFBSRS1GSUxURVIKKwkgKi8KKwl2aXJ0dWFsIGJvb2wgcHJlZmlsdGVyKCk7CisKKworCS8qKgorCSAqIFBSRS1QUk9DRVNTCisJICovCisJdmlydHVhbCBib29sIHByZXByb2Nlc3MoKTsKKworCS8qKgorCSAqIEVYSVQgQVBJCisJICovCisJdmlydHVhbCBib29sIGV4aXRJbXBsKCkKKwl7CisJCS8vIFNFVCBFWElUIENPREUKKwkJbUNvdmVyYWdlU3RhdGlzdGljcy5zZXRFeGl0Q29kZSgpOworCisJCXJldHVybiB0cnVlOworCX0KKworCisJLyoqCisJICogRklMVEVSSU5HIEZJTkFMSVpFCisJICovCisJdmlydHVhbCBib29sIGZpbHRlcmluZ0ZpbmFsaXplKCk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBGSU5BTCBTTElDSU5HIFRPT0xTCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCXZpcnR1YWwgYm9vbCBpc1NsaWNlYWJsZUNvbnRleHQoRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpIGNvbnN0OworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gUFJPQ0VTU09SIFJFUVVFU1QgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJLyoqCisJICogR09BTF9BQ0hJRVZFRAorCSAqLworCXZpcnR1YWwgdm9pZCBoYW5kbGVSZXF1ZXN0R29hbEFjaGlldmVkKCk7CisKKworCS8qKgorCSAqIEVWQUwgVFJBQ0UKKwkgKi8KKwl2aXJ0dWFsIHZvaWQgdHJhY2VNaW5pbXVtUHJlRXZhbCgKKwkJCU91dFN0cmVhbSAmIG9zLCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQykgY29uc3Q7CisKKwl2aXJ0dWFsIHZvaWQgdHJhY2VEZWZhdWx0UHJlRXZhbCgKKwkJCU91dFN0cmVhbSAmIG9zLCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQykgY29uc3Q7CisKKworCXZpcnR1YWwgdm9pZCB0cmFjZUJvdW5kRXZhbChPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKKwl2aXJ0dWFsIHZvaWQgcmVwb3J0RXZhbChPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKK307CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUFJPQ0VTU09SIFVOSVQgQVVUTyBSRUdJU1RSQVRJT04gRkFDVE9SWQorLy8gZm9yIGF1dG9tYXRpYyByZWdpc3RyYXRpb24gaW4gdGhlIHByb2Nlc3NvciByZXBvc2l0b3J5CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit0ZW1wbGF0ZTwgY2xhc3MgUHJvY2Vzc29yVCA+CitjbGFzcyBBdXRvUmVnaXN0ZXJlZENvdmVyYWdlUHJvY2Vzc29yVW5pdCA6ICBwdWJsaWMgIEJhc2VDb3ZlcmFnZUZpbHRlcgoreworCitwdWJsaWM6CisJLyoqCisJICogVFlQREVERUYKKwkgKi8KKwl0eXBlZGVmIEF1dG9SZWdpc3RlcmVkQ292ZXJhZ2VQcm9jZXNzb3JVbml0PCBQcm9jZXNzb3JUID4KKwkJCQlSZWdpc3RlcmVkQ292ZXJhZ2VQcm9jZXNzb3JVbml0OworCisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlBdXRvUmVnaXN0ZXJlZENvdmVyYWdlUHJvY2Vzc29yVW5pdChTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXIgJiBhTWFuYWdlciwKKwkJCVdPYmplY3QgKiB3ZlBhcmFtZXRlck9iamVjdCwgYXZtX2NvbXB1dGluZ19wcm9jZXNzX3N0YWdlX3QgcmVxdWlyZWRTdGFnZSwKKwkJCWNvbnN0IGF2bV91aW50OF90ICogYVByZWNlZGVuY2UvKiA9IERFRkFVTFRfUFJFQ0VERU5DRV9PRl9QUk9DRVNTT1IqLykKKwk6IEJhc2VDb3ZlcmFnZUZpbHRlcihhTWFuYWdlciwgd2ZQYXJhbWV0ZXJPYmplY3QsIHJlcXVpcmVkU3RhZ2UsIGFQcmVjZWRlbmNlKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkF1dG9SZWdpc3RlcmVkQ292ZXJhZ2VQcm9jZXNzb3JVbml0KCkKKwl7CisJCS8vIEZvcmNlIEluc3RhbmNpYXRlCisJCSh2b2lkKSAmIEFVVE9fUkVHSVNURVJfVE9PTDsKKwl9CisKKworCS8qKgorCSAqIFBST0NFU1NPUiBGQUNUT1JZCisJICogZm9yIGF1dG9tYXRpYyByZWdpc3RyYXRpb24gaW4gdGhlIHByb2Nlc3NvciByZXBvc2l0b3J5CisJICovCisJc3RhdGljIHN0cnVjdCBBdXRvUmVnaXN0ZXJQcm9jZXNzb3JGYWN0b3J5ICA6CisJCQlwdWJsaWMgUHJvY2Vzc29yVW5pdFJlZ2lzdHJhdGlvbkltcGw8IFByb2Nlc3NvclQgPgorCXsKKwkJQXV0b1JlZ2lzdGVyUHJvY2Vzc29yRmFjdG9yeSgpCisJCTogUHJvY2Vzc29yVW5pdFJlZ2lzdHJhdGlvbkltcGw8IFByb2Nlc3NvclQgPigKKwkJCQlQcm9jZXNzb3JUOjpRTklEKCkgLCBQcm9jZXNzb3JUOjpRTklEMSgpICwKKwkJCQlQcm9jZXNzb3JUOjpRTklEMigpLCBQcm9jZXNzb3JUOjpRTklEMygpICkKKwkJeworCQkJLy8hISBOT1RISU5HCisJCX0KKworCX0gIEFVVE9fUkVHSVNURVJfVE9PTDsKKwkvLyBlbmQgcmVnaXN0cmF0aW9uCisKKworCS8qKgorCSAqIEFQSQorCSAqLworCWlubGluZSBjb25zdCBJUHJvY2Vzc29yVW5pdFJlZ2lzdHJhdGlvbiAmIFJFR0lTVEVSX1RPT0woKSBjb25zdAorCXsKKwkJcmV0dXJuKCBBVVRPX1JFR0lTVEVSX1RPT0wgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc1JlZ2lzdGVyVG9vbCgKKwkJCWNvbnN0IElQcm9jZXNzb3JVbml0UmVnaXN0cmF0aW9uICYgYVJlZ2lzdGVyVG9vbCkgY29uc3QKKwl7CisJCXJldHVybiggQVVUT19SRUdJU1RFUl9UT09MLmlzRXF1YWxzKCBhUmVnaXN0ZXJUb29sICkgKTsKKwl9CisKK307CisKKwordGVtcGxhdGU8IGNsYXNzIFByb2Nlc3NvclQgPiB0eXBlbmFtZQorQXV0b1JlZ2lzdGVyZWRDb3ZlcmFnZVByb2Nlc3NvclVuaXQ8IFByb2Nlc3NvclQgPjo6QXV0b1JlZ2lzdGVyUHJvY2Vzc29yRmFjdG9yeQorQXV0b1JlZ2lzdGVyZWRDb3ZlcmFnZVByb2Nlc3NvclVuaXQ8IFByb2Nlc3NvclQgPjo6QVVUT19SRUdJU1RFUl9UT09MOworCisKK30KKworI2VuZGlmIC8qIEJBU0VDT1ZFUkFHRUZJTFRFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2NvdmVyYWdlL0Zvcm11bGFDb3ZlcmFnZUZpbHRlci5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vY292ZXJhZ2UvRm9ybXVsYUNvdmVyYWdlRmlsdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDAyYThjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2NvdmVyYWdlL0Zvcm11bGFDb3ZlcmFnZUZpbHRlci5jcHAKQEAgLTAsMCArMSwxMjgzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjMganVpbC4gMjAwOAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiRm9ybXVsYUNvdmVyYWdlRmlsdGVyLmgiCisKKyNpbmNsdWRlIDxidWlsZGVyL0J1aWxkZXIuaD4KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vQml0c2V0Lmg+CisKKyNpbmNsdWRlIDxjb21wdXRlci9FdmFsdWF0aW9uRW52aXJvbm1lbnQuaD4KKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0F2bVByb2dyYW0uaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9CYXNlSW5zdGFuY2VGb3JtLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZkRhdGEuaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0F2bUNvZGUuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29uc3RydWN0b3IuaD4KKworI2luY2x1ZGUgPGZtbC90eXBlL1R5cGVTcGVjaWZpZXIuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkNvbmZpZ3VyYXRpb24uaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25Db250ZXh0Lmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uRGF0YS5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkluZm9ybWF0aW9uLmg+CisKKyNpbmNsdWRlIDxmYW0vcXVldWUvRXhlY3V0aW9uUXVldWUuaD4KKworI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9RdWVyeS5oPgorI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9XT2JqZWN0Lmg+CisKKyNpbmNsdWRlIDxzZXcvQ29uZmlndXJhdGlvbi5oPgorCisjaW5jbHVkZSA8c29sdmVyL2FwaS9Tb2x2ZXJGYWN0b3J5Lmg+CisKKyNpbmNsdWRlIDx1dGlsL0V4ZWN1dGlvblRpbWUuaD4KKworCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3Byb3RvdHlwZSBmaWx0ZXI6OmZvcm11bGFfY292ZXJhZ2UgYXMgYXZtOjpjb3JlLmZpbHRlci5GT1JNVUxBX0NPVkVSQUdFIGlzCisJc2VjdGlvbiBQUk9QRVJUWQorCQkvLyBOb21icmUgZGUgcGFzIGRlIGNhbGN1bCAiY3VtdWzDqXMiIGF2YW50IGRlIGTDqWJ1dGVyCisJCS8vIGxhIHbDqXJpZmljYXRpb24gZGUgbGEgY291dmVydHVyZQorCQlAYmVnaW5fc3RlcCA9IDA7CisKKwkJLy8gQXJyw6h0ZSBsJ2V4w6ljdXRpb24gZMOocyBxdWUgbGEgY291dmVydHVyZSBlc3QgY29tcGzDqHRlCisJCUBzdG9wID0gdHJ1ZTsKKworCQkvLyBBcnLDqHRlIGwnZXjDqWN1dGlvbiBhdSBwbHV0w7R0CisJCUBtaW5pbWl6ZSA9IHRydWU7CisKKwkJLy8gQXJyw6h0ZSBsJ2V4w6ljdXRpb24gZHUgY2hlbWluIGNvdXJhbnQgZMOocyBxdSd1biBvYmplY3RpZiBlc3QgYXR0ZWludAorCQlAYnJlYWsgPSB0cnVlOworCisJCS8vIEVsYWdhZ2UgZHUgZ3JhcGhlIGRlcyBzY8OpbmFyaW9zIMOgIGxhIGZpbiBkZSBsYSB2w6lyaWZpY2F0aW9uCisJCUBzbGljZSA9IHRydWU7CisKKwkJLy8gQWN0aXZlIGwndXRpbGlzYXRpb24gZCdoZXVyaXN0aXF1ZQorCQlAaGV1cmlzdGljID0gdHJ1ZTsKKworCQkvLyBjaG9peCBkZSBsJ2hldXJpc3RpcXVlIGRlIGTDqXBhcnQKKwkJLy8gYmFzaWMgfCBuYWl2ZSB8IHNtYXJ0IHwgYWdyZXNzaXZlCisJCUBoZXVyaXN0aWMjc3RhcnQgPSAnYmFzaWMnOworCisJCS8vIE5vbWJyZSBkJ2Vzc2FpcyBkJ2hldXJpc3RpcXVlcworCQlAaGV1cmlzdGljI3RyaWFscyA9IDc7CisKKwkJLy8gQ3JpdMOocmUgZGUgc2F0aXNmYWN0aW9uIGR1IHN1Y2PDqHMgZGVzIGhldXJpc3RpcXVlcworCQkvLyB0YXV4IGRlIGNvdXZlcnRlIC8gbm9tYnJlIGQnw6lsw6ltZW50IHJlc3RhbnQuLi4KKwkJQG9iamVjdGl2ZSNyYXRlID0gOTU7CisJCUBvYmplY3RpdmUjcmVzdCA9IDU7CisKKworCQlAc29sdmVyID0gJ0NWQzQnOwkvLyBPTUVHQSB8IENWQzQgfCBaMyB8IFlJQ0VTCisKKwllbmRzZWN0aW9uIFBST1BFUlRZCisKKwlzZWN0aW9uIERBVEEKKwkJKCA8IExvY2FsIFZhcmlhYmxlIGRlY2xhcmF0aW9uID47ICkqCisJZW5kc2VjdGlvbiBEQVRBCisKKwlzZWN0aW9uIEZPUk1VTEEKKwkJKCBAbGFiZWwgPSA8IEF2bUNvZGUgPjsgKSsKKwllbmRzZWN0aW9uIEZPUk1VTEEKKworCXNlY3Rpb24gTU9DCisJCSggQG1vYyA9IDwgQXZtQ29kZTwgbGFiZWwgPiA+OyApKworCWVuZHNlY3Rpb24gTU9DCitlbmRwcm90b3R5cGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCit2b2lkIHByaW50TGlua1RhYmxlKE91dFN0cmVhbSAmIG9zLCBjb25zdCBCRlZlY3RvciAmIGFGb3JtdWxhVGFibGUsCisJCVZlY3Rvck9mSW50ICYgYUxpbmtUYWJsZSwgY29uc3Qgc3RkOjpzdHJpbmcgJiB0aXRsZSkKK3sKKwlvcyA8PCB0aXRsZSA8PCAiXG4iOworCisJYXZtX3NpemVfdCBlbmRJZHggPSBhRm9ybXVsYVRhYmxlLnNpemUoKTsKKwlmb3IoIGF2bV9zaXplX3QgaWR4ID0gMDsgaWR4IDwgZW5kSWR4IDsgKytpZHggKQorCXsKKwkJb3MgPDwgIlx0IiA8PCBhTGlua1RhYmxlW2lkeF0gPDwgIjo+ICIKKwkJCQk8PCBhRm9ybXVsYVRhYmxlW2lkeF0udG9fcHRyPCBGb3JtdWxhRGF0YSA+KCktPmxhYmVsIDw8ICJcbiIKKwkJCQk8PCBzdGQ6OmZsdXNoOworCX0KK30KKwordm9pZCBwcmludFRydXRoVGFibGUoT3V0U3RyZWFtICYgb3MsIGNvbnN0IEJGVmVjdG9yICYgYUZvcm11bGFUYWJsZSwKKwkJQml0c2V0ICYgYVRydXRoVGFibGUsIGNvbnN0IHN0ZDo6c3RyaW5nICYgdGl0bGUpCit7CisJb3MgPDwgdGl0bGUgPDwgIlxuIjsKKworCWF2bV9zaXplX3QgZW5kSWR4ID0gYUZvcm11bGFUYWJsZS5zaXplKCk7CisJZm9yKCBhdm1fc2l6ZV90IGlkeCA9IDA7IGlkeCA8IGVuZElkeCA7ICsraWR4ICkKKwl7CisJCW9zIDw8ICJcdCIgPDwgYVRydXRoVGFibGVbaWR4XSA8PCAiOj4gIgorCQkJCTw8IGFGb3JtdWxhVGFibGVbaWR4XS50b19wdHI8IEZvcm11bGFEYXRhID4oKS0+bGFiZWwgPDwgIlxuIgorCQkJCTw8IHN0ZDo6Zmx1c2g7CisJfQorfQorCit2b2lkIHJlcG9ydFRhYmxlKE91dFN0cmVhbSAmIG9zLCBjb25zdCBCRlZlY3RvciAmIGFGb3JtdWxhVGFibGUsCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgdGl0bGUpCit7CisJb3MgPDwgVEFCIDw8IHRpdGxlIDw8IEVPTDsKKworCWF2bV9zaXplX3QgZW5kSWR4ID0gYUZvcm11bGFUYWJsZS5zaXplKCk7CisJZm9yKCBhdm1fc2l6ZV90IGlkeCA9IDA7IGlkeCA8IGVuZElkeCA7ICsraWR4ICkKKwl7CisJCWlmKCBhRm9ybXVsYVRhYmxlW2lkeF0udG9fcHRyPCBGb3JtdWxhRGF0YSA+KCktPnNhdEVDLm5vbmVtcHR5KCkgKQorCQl7CisJCQlhRm9ybXVsYVRhYmxlW2lkeF0udG9fcHRyPCBGb3JtdWxhRGF0YSA+KCktPnJlcG9ydChvcyk7CisJCX0KKwl9Cit9CisKKworCitib29sIEZvcm11bGFDb3ZlcmFnZUZpbHRlcjo6Y29uZmlndXJlSW1wbCgpCit7CisJLy8gU1VQRVIgQ09ORklHVVJBVElPTgorCW1Db25maWdGbGFnID0gQmFzZUNvdmVyYWdlRmlsdGVyOjpjb25maWd1cmVJbXBsKCk7CisKKwltTW9jQ292ZXJhZ2VTdGF0aXN0aWNzLnJlc2V0Q291bnRlcigpOworCisJV09iamVjdCAqIHRoZVBST1BFUlRZID0gUXVlcnk6OmdldFJlZ2V4V1NlcXVlbmNlKAorCQkJZ2V0UGFyYW1ldGVyV09iamVjdCgpLCBPUl9XSUQyKCJwcm9wZXJ0eSIsICJQUk9QRVJUWSIpKTsKKwlpZiggdGhlUFJPUEVSVFkgIT0gV09iamVjdDo6X05VTExfICkKKwl7CisJCXN0ZDo6c3RyaW5nIHRoZVNvbHZlck5hbWUgPSBRdWVyeTo6Z2V0V1Byb3BlcnR5U3RyaW5nKHRoZVBST1BFUlRZLAorCQkJCSJzb2x2ZXIiLCBTb2x2ZXJEZWY6OnN0clNvbHZlcihTb2x2ZXJEZWY6OlNPTFZFUl9DVkM0X0tJTkQpKTsKKwkJaWYoIHRoZVNvbHZlck5hbWUuZW1wdHkoKSApCisJCXsKKwkJCXRoZVBST1BFUlRZLT53YXJuaW5nTG9jYXRpb24oQVZNX09TX1dBUk4pCisJCQkJCTw8ICJVbmV4cGVjdGVkIGVtcHR5IHNvbHZlciBlbmdpbmUga2luZCAhIiA8PCBzdGQ6OmVuZGw7CisJCX0KKwkJbVNvbHZlcktpbmQgPSBTb2x2ZXJEZWY6OnRvU29sdmVyKAorCQkJCXRoZVNvbHZlck5hbWUsIFNvbHZlckRlZjo6REVGQVVMVF9TT0xWRVJfS0lORCk7CisJfQorCWVsc2UKKwl7CisJCW1Db25maWdGbGFnID0gZmFsc2U7CisJfQorCisKKwlXT2JqZWN0ICogdGhlREFUQSA9IFF1ZXJ5OjpnZXRSZWdleFdTZXF1ZW5jZSgKKwkJCWdldFBhcmFtZXRlcldPYmplY3QoKSwgT1JfV0lEMigiZGF0YSIsICJEQVRBIikpOworCWlmKCB0aGVEQVRBICE9IFdPYmplY3Q6Ol9OVUxMXyApCisJeworCQlnZXRDb25maWd1cmF0aW9uKCkuZ2V0RXhlY3V0YWJsZVN5c3RlbSgpLmluaXRQcm9jZXNzRXhlY3V0YWJsZUZvcm0oCisJCQkJbUxvY2FsRXhlY3V0YWJsZUZvcm0sIHRoZURBVEEtPm93bmVkU2l6ZSgpKTsKKworCQlMaXN0PCBXT2JqZWN0ICogPiBsaXN0T2ZMb2NhbFZhcjsKKwkJUXVlcnk6OmdldExpc3RXT2JqZWN0KHRoZURBVEEsIGxpc3RPZkxvY2FsVmFyKTsKKworCQlUeXBlU3BlY2lmaWVyIGFUeXBlU3BlY2lmaWVyOworCisJCUxpc3Q8IFdPYmplY3QgKiA+OjppdGVyYXRvciBpdCA9IGxpc3RPZkxvY2FsVmFyLmJlZ2luKCk7CisJCUxpc3Q8IFdPYmplY3QgKiA+OjppdGVyYXRvciBpdEVuZCA9IGxpc3RPZkxvY2FsVmFyLmVuZCgpOworCQlmb3IoIGF2bV9vZmZzZXRfdCBvZmZzZXQgPSAwIDsgaXQgIT0gaXRFbmQgOyArK2l0ICwgKytvZmZzZXQgKQorCQl7CisJCQlhVHlwZVNwZWNpZmllciA9IEVOVi5nZXRCdWlsZGVyKCkuZ2V0Q29tcGlsZXIoKS5jb21waWxlVHlwZVNwZWNpZmllcigKKwkJCQkJJm1Mb2NhbEV4ZWN1dGFibGVGb3JtLCAoKml0KS0+Z2V0UXVhbGlmaWVkVHlwZU5hbWVJRCgpICk7CisKKy8vISFbTUlHUkFUSU9OXQorCQkJQkYgYW5JbnN0YW5jZSggbmV3IEluc3RhbmNlT2ZEYXRhKAorCQkJCQlJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfU1RBTkRBUkRfTkFUVVJFLAorCQkJCQkmbUxvY2FsRXhlY3V0YWJsZUZvcm0sIC8qKCppdCkqLyBOVUxMLCBhVHlwZVNwZWNpZmllciwgb2Zmc2V0KSApOworCQkJbUxvY2FsRXhlY3V0YWJsZUZvcm0uc2V0RGF0YSggb2Zmc2V0ICwgYW5JbnN0YW5jZSApOworCQl9CisJfQorCWVsc2UKKwl7CisJCWdldENvbmZpZ3VyYXRpb24oKS5nZXRFeGVjdXRhYmxlU3lzdGVtKCkuCisJCQkJaW5pdFByb2Nlc3NFeGVjdXRhYmxlRm9ybShtTG9jYWxFeGVjdXRhYmxlRm9ybSwgMCk7CisJfQorCisKKwlhdm1fc2l6ZV90IGVycm9yQ291bnQgPSAwOworCisJV09iamVjdCAqIHRoZUZPUk1VTEEgPSBRdWVyeTo6Z2V0UmVnZXhXU2VxdWVuY2UoCisJCQlnZXRQYXJhbWV0ZXJXT2JqZWN0KCksIE9SX1dJRDIoImZvcm11bGEiLCAiRk9STVVMQSIpKTsKKworCWlmKCB0aGVGT1JNVUxBICE9IFdPYmplY3Q6Ol9OVUxMXyApCisJeworCQljb25zdCBCRiAmIGFUcmlnZ2VyID0gUXVlcnk6OmdldFdQcm9wZXJ0eVZhbHVlKAorCQkJCXRoZVBST1BFUlRZLCAidHJpZ2dlciIsIEJGOjpSRUZfTlVMTCk7CisJCWlmKCBhVHJpZ2dlci52YWxpZCgpICkKKwkJeworLy8JCQltVHJpZ2dlciA9IEVOVi5nZXRCdWlsZGVyKCkuYnVpbGQoCisvLwkJCQkJZ2V0Q29uZmlndXJhdGlvbigpLT5nZXRNYWluRXhlY3V0aW9uRGF0YSgpLAorLy8JCQkJCW1Mb2NhbEV4ZWN1dGFibGVGb3JtLCBhVHJpZ2dlcik7CisKKwkJCW1UcmlnZ2VyID0gRU5WLmdldEJ1aWxkZXIoKS4KKwkJCQkJY29tcGlsZUV4cHJlc3Npb24oJm1Mb2NhbEV4ZWN1dGFibGVGb3JtLCBhVHJpZ2dlcik7CisKK0FWTV9JRl9ERUJVR19GTEFHKCBDT05GSUdVUklORyApCisJQVZNX09TX0xPRyA8PCBUQUIgPDwgIiAtLT4gdHJpZ2dlciA6ICIgPDwgYVRyaWdnZXIuc3RyKCkgPDwgIiA8LS0gIiA8PCBFT0wKKwkJCTw8IFRBQiA8PCAiIC0tPiBidWlsZCB0cmlnZ2VyIDogIiA8PCBtVHJpZ2dlci5zdHIoKSA8PCAiIDwtLSAiCisJCQk8PCBFT0wgPDwgRU9MIDw8IHN0ZDo6Zmx1c2g7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggQ09ORklHVVJJTkcgKQorCQl9CisKKwkJV09iamVjdDo6Y29uc3RfaXRlcmF0b3IgaXRXZk8gPSB0aGVGT1JNVUxBLT5vd25lZF9iZWdpbigpOworCQlXT2JqZWN0Ojpjb25zdF9pdGVyYXRvciBlbmRXZk8gPSB0aGVGT1JNVUxBLT5vd25lZF9lbmQoKTsKKwkJZm9yKCA7IGl0V2ZPICE9IGVuZFdmTyA7ICsraXRXZk8gKQorCQl7CisJCQlpZiggKCppdFdmTyktPmlzV1Byb3BlcnR5KCkgKQorCQkJeworCQkJCWlmKCBhcHBlbmRGb3JtdWxhKCgqaXRXZk8pLT5nZXRWYWx1ZSgpLAorCQkJCQkJKCppdFdmTyktPmdldE5hbWVJRCgpLCAoKml0V2ZPKSkuaW52YWxpZCgpICkKKwkJCQl7CisJCQkJCSsrZXJyb3JDb3VudDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJZWxzZQorCXsKKwkJdGhlUFJPUEVSVFktPndhcm5pbmdMb2NhdGlvbihBVk1fT1NfV0FSTikKKwkJCQk8PCAiRk9STVVMQSBzZWN0aW9uIG5vdCBmb3VuZCBpbiBmaWx0ZXI8ICIgKworCQkJCWdldFBhcmFtZXRlcldPYmplY3QoKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSArICIgPiAhIiA8PCBzdGQ6OmVuZGw7CisKKwkJbUNvbmZpZ0ZsYWcgPSBmYWxzZTsKKwl9CisKKworCVdPYmplY3QgKiB0aGVNT0MgPSBRdWVyeTo6Z2V0UmVnZXhXU2VxdWVuY2UoCisJCQlnZXRQYXJhbWV0ZXJXT2JqZWN0KCksIE9SX1dJRDIoIm1vYyIsICJNT0MiKSk7CisKKwlpZiggdGhlTU9DICE9IFdPYmplY3Q6Ol9OVUxMXyApCisJeworCQlXT2JqZWN0Ojpjb25zdF9pdGVyYXRvciBpdFdmTyA9IHRoZU1PQy0+b3duZWRfYmVnaW4oKTsKKwkJV09iamVjdDo6Y29uc3RfaXRlcmF0b3IgZW5kV2ZPID0gdGhlTU9DLT5vd25lZF9lbmQoKTsKKwkJZm9yKCA7IGl0V2ZPICE9IGVuZFdmTyA7ICsraXRXZk8gKQorCQl7CisJCQlpZiggKCppdFdmTyktPmlzV1Byb3BlcnR5KCkgKQorCQkJeworCQkJCWlmKCBhcHBlbmRNb2MoKCppdFdmTyktPmdldFZhbHVlKCksCisJCQkJCQkoKml0V2ZPKS0+Z2V0TmFtZUlEKCksICgqaXRXZk8pKS5pbnZhbGlkKCkgKQorCQkJCXsKKwkJCQkJKytlcnJvckNvdW50OworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCW1Db25maWdGbGFnID0gKGVycm9yQ291bnQgPT0gMCkgJiYgbUNvbmZpZ0ZsYWc7CisKKwlyZXR1cm4oIG1Db25maWdGbGFnICk7Cit9CisKKworCisvKgorICogR0VUVEVSCisgKiBtVmVjdG9yT2ZGb3JtdWxhCisgKi8KK0JGIEZvcm11bGFDb3ZlcmFnZUZpbHRlcjo6YXBwZW5kRm9ybXVsYShjb25zdCBCRiAmIGFGb3JtdWxhLAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGxhYmVsLCBFbGVtZW50ICogZmF2bUZvcm11bGEpCit7CisvLwlCRiBhQnVpbGRGb3JtdWxhID0gRU5WLmdldEJ1aWxkZXIoKS5idWlsZCgKKy8vCQkJTWFpbkRhdGFDb25maWd1cmF0aW9uOjpnZXRJbnN0YW5jZSgpLT5nZXRNYWluRXhlY3V0aW9uQ29udGV4dCgpCisvLwkJCQkJLT5nZXRBUEV4ZWN1dGlvbkRhdGEoKSwgbUxvY2FsRXhlY3V0YWJsZUZvcm0sIGFGb3JtdWxhKTsKKworCUVOVi5nZXRCdWlsZGVyKCkuZ2V0QXZtY29kZUNvbXBpbGVyKCkuZ2V0U3ltYm9sVGFibGUoKS5yZXNldEVycm9yKCk7CisKKwlCRiBhQnVpbGRGb3JtdWxhID0gRU5WLmdldEJ1aWxkZXIoKS4KKwkJCWNvbXBpbGVFeHByZXNzaW9uKCZtTG9jYWxFeGVjdXRhYmxlRm9ybSwgYUZvcm11bGEpOworCisJaWYoIEVOVi5nZXRCdWlsZGVyKCkuZ2V0QXZtY29kZUNvbXBpbGVyKCkuZ2V0U3ltYm9sVGFibGUoKS5oYXNaZXJvRXJyb3IoKQorCQkJJiYgYUJ1aWxkRm9ybXVsYS52YWxpZCgpICkKKwl7CisJCUJGIGFGRCggbmV3IEZvcm11bGFEYXRhKGFCdWlsZEZvcm11bGEsIGxhYmVsLAorCQkJCW1Gb3JtdWxhVGFibGUuc2l6ZSgpLCBmYXZtRm9ybXVsYSkgKTsKKwkJbUZvcm11bGFUYWJsZS5hcHBlbmQoIGFGRCApOworCQltTGlzdE9mVW5jb3ZlcmVkRm9ybXVsYS5hcHBlbmQoIGFGRCApOworCisKKwkJbUNvdmVyYWdlU3RhdGlzdGljcy5tTnVtYmVyT2ZFbGVtZW50cyA9IG1Gb3JtdWxhVGFibGUuc2l6ZSgpOworCisJCW1Gb3JtdWxhVHJ1dGhUYWJsZS5yZXNpemUobUNvdmVyYWdlU3RhdGlzdGljcy5tTnVtYmVyT2ZFbGVtZW50cywgZmFsc2UpOworCQltRm9ybXVsYUxpbmtUYWJsZS5yZXNpemUobUNvdmVyYWdlU3RhdGlzdGljcy5tTnVtYmVyT2ZFbGVtZW50cywgMCk7CisKK0FWTV9JRl9ERUJVR19GTEFHKCBDT05GSUdVUklORyApCisJQVZNX09TX0xPRyA8PCBUQUIgPDwgIiAtLT4gZm9ybXVsYSAiIDw8IGxhYmVsIDw8ICIgOiAiCisJCQk8PCBhRm9ybXVsYS5zdHIoKSA8PCAiIDwtLSAiIDw8IEVPTAorCQkJPDwgVEFCIDw8ICIgLS0+IGJ1aWxkIGZvcm11bGEgIiA8PCBsYWJlbCA8PCAiIDogIgorCQkJPDwgYUJ1aWxkRm9ybXVsYS5zdHIoKSA8PCAiIDwtLSAiCisJCQk8PCBFT0wgPDwgRU9MIDw8IHN0ZDo6Zmx1c2g7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggQ09ORklHVVJJTkcgKQorCisJCXJldHVybiggYUZEICk7CisJfQorCWVsc2UKKwl7CisJCWlmKCBFTlYuZ2V0QnVpbGRlcigpLmdldEF2bWNvZGVDb21waWxlcigpLmdldFN5bWJvbFRhYmxlKCkuaGFzRXJyb3JNZXNzYWdlKCkgKQorCQl7CisJCQlBVk1fT1NfTE9HIDw8IFRBQiA8PCBFTlYuZ2V0QnVpbGRlcigpLmdldEF2bWNvZGVDb21waWxlcigpLgorCQkJCQlnZXRTeW1ib2xUYWJsZSgpLmdldEVycm9yTWVzc2FnZSgpIDw8IEVPTCA8PCBzdGQ6OmZsdXNoOworCQl9CisKKwkJQVZNX09TX0NPVVQgPDwgVEFCIDw8ICIgLS0+IGJ1aWxkIGZvcm11bGEgRkFJTEVEIDo+ICIgPDwgbGFiZWwKKwkJCQk8PCAiIDogIiA8PCBhRm9ybXVsYS5zdHIoKSA8PCAiIDwtLSAiIDw8IEVPTCA8PCBzdGQ6OmZsdXNoOworCQlBVk1fT1NfTE9HIDw8IFRBQiA8PCAiIC0tPiBidWlsZCBmb3JtdWxhIEZBSUxFRCA6PiAiIDw8IGxhYmVsCisJCQkJPDwgIiA6ICIgPDwgYUZvcm11bGEuc3RyKCkgPDwgIiA8LS0gIiA8PCBFT0wgPDwgc3RkOjpmbHVzaDsKKworCisJCXJldHVybiggQkY6OlJFRl9OVUxMICk7CisJfQorfQorCisKKworLyoKKyAqIEdFVFRFUgorICogbVZlY3Rvck9mTW9jCisgKi8KK0JGIEZvcm11bGFDb3ZlcmFnZUZpbHRlcjo6YXBwZW5kTW9jKGNvbnN0IEJGICYgYU1vYywKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBsYWJlbCwgRWxlbWVudCAqIGZhdm1Gb3JtdWxhKQoreworCUJGIGFCdWlsZE1vYyA9IGJ1aWxkTW9jKCBhTW9jICk7CisKKwlpZiggYUJ1aWxkTW9jLnZhbGlkKCkgKQorCXsKKwkJQkYgYUZEKCBuZXcgRm9ybXVsYURhdGEoYUJ1aWxkTW9jLCBsYWJlbCwKKwkJCQltTW9jVGFibGUuc2l6ZSgpLCBmYXZtRm9ybXVsYSkgKTsKKwkJbU1vY1RhYmxlLmFwcGVuZCggYUZEICk7CisJCW1MaXN0T2ZVbkNvdmVyZWRNb2MuYXBwZW5kKCBtTW9jVGFibGUubGFzdCgpICk7CisKKworCQltTW9jQ292ZXJhZ2VTdGF0aXN0aWNzLm1OdW1iZXJPZkVsZW1lbnRzID0gbU1vY1RhYmxlLnNpemUoKTsKKworCQltTW9jVHJ1dGhUYWJsZS5yZXNpemUoIG1Nb2NDb3ZlcmFnZVN0YXRpc3RpY3MubU51bWJlck9mRWxlbWVudHMgLCBmYWxzZSApOworCQltTW9jTGlua1RhYmxlLnJlc2l6ZSggbU1vY0NvdmVyYWdlU3RhdGlzdGljcy5tTnVtYmVyT2ZFbGVtZW50cyAsIDAgKTsKKworCisJCW1vY0FwcGVuZEZvcm11bGFMaW5rKCBhQnVpbGRNb2MgKTsKKworQVZNX0lGX0RFQlVHX0ZMQUcoIENPTkZJR1VSSU5HICkKKwlBVk1fT1NfTE9HIDw8IFRBQiA8PCAiIC0tPiBtb2MgIiA8PCBsYWJlbAorCQkJPDwgIiA6ICIgPDwgYU1vYy5zdHIoKSA8PCAiIDwtLSAiIDw8IEVPTAorCQkJPDwgVEFCIDw8ICIgLS0+IGJ1aWxkIG1vYyAiIDw8IGxhYmVsCisJCQk8PCAiIDogIiA8PCBhQnVpbGRNb2Muc3RyKCkgPDwgIiA8LS0gIgorCQkJPDwgRU9MIDw8IEVPTCA8PCBzdGQ6OmZsdXNoOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIENPTkZJR1VSSU5HICkKKworCisJCXByaW50TGlua1RhYmxlKEFWTV9PU19UUkFDRSwgbUZvcm11bGFUYWJsZSwgbUZvcm11bGFMaW5rVGFibGUsCisJCQkJIkNvbmZpZ3VyYXRpb24gb2YgdGhlIEZvcm11bGEgTGluayBUYWJsZSIpOworCisJCXJldHVybiggYUZEICk7CisJfQorCWVsc2UKKwl7CisJCUFWTV9PU19MT0cgPDwgVEFCIDw8ICIgLS0+IGJ1aWxkIG1vYyBGQUlMRUQgOj4gIiA8PCBsYWJlbAorCQkJCTw8ICIgOiAiIDw8IGFNb2Muc3RyKCkgPDwgIiA8LS0gIiA8PCBFT0wgPDwgc3RkOjpmbHVzaDsKKworCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCX0KK30KKworCitCRiBGb3JtdWxhQ292ZXJhZ2VGaWx0ZXI6OmJ1aWxkTW9jKGNvbnN0IEJGICYgYU1vYykKK3sKKwlzd2l0Y2goIGFNb2MuY2xhc3NLaW5kKCkgKQorCXsKKwkJY2FzZSBGT1JNX0FWTUNPREVfS0lORDoKKwkJeworCQkJQkZDb2RlIG5ld01vYyggYU1vYy50b19wdHI8IEF2bUNvZGUgPigpLT5nZXRPcGVyYXRvcigpICk7CisKKwkJCUJGIGJmTW9jOworCisJCQlBdm1Db2RlOjppdGVyYXRvciBpdEZvcm0gPSBhTW9jLnRvX3B0cjwgQXZtQ29kZSA+KCktPmJlZ2luKCk7CisJCQlBdm1Db2RlOjppdGVyYXRvciBlbmRGb3JtID0gYU1vYy50b19wdHI8IEF2bUNvZGUgPigpLT5lbmQoKTsKKwkJCWZvciggOyBpdEZvcm0gIT0gZW5kRm9ybSA7ICsraXRGb3JtICkKKwkJCXsKKwkJCQlpZiggKGJmTW9jID0gYnVpbGRNb2MoKml0Rm9ybSkpLnZhbGlkKCkgKQorCQkJCXsKKwkJCQkJbmV3TW9jLT5hcHBlbmQoIGJmTW9jICk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXJldHVybiggQkY6OlJFRl9OVUxMICk7CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4oIG5ld01vYyApOworCQl9CisKKwkJY2FzZSBGT1JNX1VGSV9LSU5EOgorCQljYXNlIEZPUk1fQlVJTFRJTl9JREVOVElGSUVSX0tJTkQ6CisJCWNhc2UgRk9STV9CVUlMVElOX1NUUklOR19LSU5EOgorCQljYXNlIEZPUk1fQlVJTFRJTl9RVUFMSUZJRURfSURFTlRJRklFUl9LSU5EOgorCQl7CisJCQlCRiBhRm9ybXVsYSA9IGdldEZvcm11bGEoYU1vYy5zdHIoKSkgOworCQkJaWYoIGFGb3JtdWxhLnZhbGlkKCkgKQorCQkJeworCQkJCXJldHVybiggYUZvcm11bGEgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCQkJfQorCQl9CisKKwkJY2FzZSBGT1JNX0VYRUNfRklMVEVSX0ZPUk1VTEFfREFUQV9LSU5EOgorCQlkZWZhdWx0OgorCQl7CisJCQlyZXR1cm4oIGFNb2MgKTsKKwkJfQorCX0KK30KKworCisvKgorICogUkVQT1JUCisgKi8KK3ZvaWQgRm9ybXVsYURhdGE6OnJlcG9ydChPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlvcyA8PCBUQUIgPDwgc3RyKCkgPDwgRU9MOworCisJTGlzdE9mRXhlY3V0aW9uQ29udGV4dDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzYXRFQy5iZWdpbigpOworCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQ6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gc2F0RUMuZW5kKCk7CisJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJeworCQlvcyA8PCBUQUIyIDw8ICI9PT5FWz9dICIgPDwgKCppdCktPnN0cl9taW4oKSA8PCBFT0w7CisJfQorCW9zIDw8IHN0ZDo6Zmx1c2g7Cit9CisKKwordm9pZCBGb3JtdWxhQ292ZXJhZ2VGaWx0ZXI6OnJlcG9ydERlZmF1bHQoT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJcmVwb3J0SGVhZGVyKG9zLCAiRk9STVVMQSBDT1ZFUkFHRSAiKTsKKworCisJaWYoIG1Gb3JtdWxhVGFibGUubm9uZW1wdHkoKSApCisJeworCQlpZiggbUNvdmVyYWdlU3RhdGlzdGljcy5nb2FsQWNoaWV2ZWQoKSApCisJCXsKKwkJCW9zIDw8IFRBQjIgPDwgIkFsbCB0aGUgPDwgIiA8PCBtQ292ZXJhZ2VTdGF0aXN0aWNzLm1OdW1iZXJPZkVsZW1lbnRzCisJCQkJCTw8ICIgPj4gZm9ybXVsYXMgYXJlIGNvdmVyZWQgISIgPDwgRU9MOworCQl9CisJCWVsc2UKKwkJeworCQkJb3MgPDwgVEFCMiA8PCAiV2FybmluZzogYWxsIGZvcm11bGFzIGFyZSBub3QgY292ZXJlZCAhIiA8PCBFT0w7CisJCQltQ292ZXJhZ2VTdGF0aXN0aWNzLnRvU3RyZWFtQ292ZXJhZ2VSYXRlKCBvcyA8PCBUQUIyLAorCQkJCQkiUmVzdWx0czogPDwgIiwgIiBvbiAiLCIgPj4gYXJlIGNvdmVyZWQgIVxuIiApOworCisJCQlpZiggaXNSZXBvcnREZXRhaWxzKCkgJiYgbUxpc3RPZlVuY292ZXJlZEZvcm11bGEubm9uZW1wdHkoKSApCisJCQl7CisJCQkJb3MgPDwgVEFCMiA8PCAiTGlzdCBvZiB0aGUgPDwgIgorCQkJCQkJPDwgbUNvdmVyYWdlU3RhdGlzdGljcy5nZXROdW1iZXJPZlVuY292ZXJlZCgpCisJCQkJCQk8PCAgIiA+PiBmb3JtdWxhcyBub24gY292ZXJlZDoiIDw8IEVPTDsKKworCQkJCUJGTGlzdDo6Y29uc3RfaXRlcmF0b3IgaXRGb3JtID0gbUxpc3RPZlVuY292ZXJlZEZvcm11bGEuYmVnaW4oKTsKKwkJCQlCRkxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGVuZEZvcm0gPSBtTGlzdE9mVW5jb3ZlcmVkRm9ybXVsYS5lbmQoKTsKKwkJCQlmb3IoIDsgaXRGb3JtICE9IGVuZEZvcm0gOyArK2l0Rm9ybSApCisJCQkJeworCQkJCQlvcyA8PCBUQUIyIDw8ICIgPT0+ICAiIDw8ICgqaXRGb3JtKS5zdHIoKSA8PCAiIDw9PSAiIDw8IEVPTDsKKwkJCQl9CisKKwkJCQltQ292ZXJhZ2VTdGF0aXN0aWNzLnRvU3RyZWFtQ292ZXJhZ2VSYXRlKCBvcyA8PCBUQUIyLAorCQkJCQkJIlJlc3VsdHM6IDw8ICIsICIgb24gIiwiID4+IGFyZSBjb3ZlcmVkICFcbiIgKTsKKwkJCX0KKwkJfQorCisJCWlmKCBtU2xpY2VGbGFnICkKKwkJeworCQkJb3MgPDwgVEFCMiA8PCAiTnVtYmVyIG9mIG5vZGVzIGN1dCBiYWNrOiAiIDw8IG1TbGljZUNvdW50IDw8IEVPTDsKKwkJfQorCisJfQorCisKKwlpZiggbU1vY1RhYmxlLm5vbmVtcHR5KCkgKQorCXsKKwkJb3MgPDwgRU9MOworCQlpZiggbU1vY0NvdmVyYWdlU3RhdGlzdGljcy5nb2FsQWNoaWV2ZWQoKSApCisJCXsKKwkJCW9zIDw8IFRBQjIgPDwgIkFsbCBvZiB0aGUgIiA8PCBtTW9jVGFibGUuc2l6ZSgpCisJCQkJCTw8ICIgTU9DcyBhcmUgY292ZXJlZCAhIiA8PCBFT0w7CisJCX0KKwkJZWxzZQorCQl7CisJCQlvcyA8PCBUQUIyIDw8ICJXYXJuaW5nOiBhbGwgTU9DcyBhcmUgbm90IGNvdmVyZWQgISIgPDwgRU9MOworCQkJbU1vY0NvdmVyYWdlU3RhdGlzdGljcy50b1N0cmVhbUNvdmVyYWdlUmF0ZSggb3MgPDwgVEFCMiwKKwkJCQkJIlJlc3VsdHM6IDw8ICIsICIgb24gIiwiID4+IGFyZSBjb3ZlcmVkICFcbiIgKTsKKworCQkJaWYoIGlzUmVwb3J0RGV0YWlscygpICYmIG1MaXN0T2ZVbkNvdmVyZWRNb2Mubm9uZW1wdHkoKSApCisJCQl7CisJCQkJb3MgPDwgVEFCMiA8PCAiTGlzdCBvZiB0aGUgPDwgIgorCQkJCQkJPDwgbU1vY0NvdmVyYWdlU3RhdGlzdGljcy5nZXROdW1iZXJPZlVuY292ZXJlZCgpCisJCQkJCQk8PCAgIiA+PiBNT0NzIG5vbiBjb3ZlcmVkOiIgPDwgRU9MOworCisJCQkJQkZMaXN0Ojpjb25zdF9pdGVyYXRvciBpdEZvcm0gPSBtTGlzdE9mVW5Db3ZlcmVkTW9jLmJlZ2luKCk7CisJCQkJQkZMaXN0Ojpjb25zdF9pdGVyYXRvciBlbmRGb3JtID0gbUxpc3RPZlVuQ292ZXJlZE1vYy5lbmQoKTsKKwkJCQlmb3IoIDsgaXRGb3JtICE9IGVuZEZvcm0gOyArK2l0Rm9ybSApCisJCQkJeworCQkJCQlvcyA8PCBUQUIyIDw8ICIgPT0+ICAiIDw8ICgqaXRGb3JtKS5zdHIoKSA8PCAiIDw9PSAiIDw8IEVPTDsKKwkJCQl9CisKKwkJCQltTW9jQ292ZXJhZ2VTdGF0aXN0aWNzLnRvU3RyZWFtQ292ZXJhZ2VSYXRlKCBvcyA8PCBUQUIyLAorCQkJCQkJIlJlc3VsdHM6IDw8ICIsICIgb24gIiwiID4+IGFyZSBjb3ZlcmVkICFcbiIgKTsKKwkJCX0KKwkJfQorCX0KKworCWlmKCBpc1JlcG9ydERldGFpbHMoKSApCisJeworCQlvcyA8PCBFT0xfSU5DUl9JTkRFTlQ7CisJCXJlcG9ydFRhYmxlKG9zLCBtRm9ybXVsYVRhYmxlLCAiRk9STVVMQSBUQUJMRSIpOworCQlvcyA8PCBFT0w7CisJCXJlcG9ydFRhYmxlKG9zLCBtTW9jVGFibGUsICJNT0MgVEFCTEUiKTsKKwkJb3MgPDwgREVDUl9JTkRFTlQ7CisJfQorCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFNFVCBFWElUIENPREUKKwltQ292ZXJhZ2VTdGF0aXN0aWNzLnNldEV4aXRDb2RlKCk7Cit9CisKKworYm9vbCBGb3JtdWxhQ292ZXJhZ2VGaWx0ZXI6OnBvc3RmaWx0ZXIoRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpCit7CisJaWYoIG1Db3ZlcmFnZVN0YXRpc3RpY3MuaGFzVW5jb3ZlcmVkKCkgKQorCXsKKwkJRXhlY3V0aW9uVGltZSBtRXhlY3V0aW9uVGltZU1hbmFnZXIoZmFsc2UpOworQVZNX0lGX0RFQlVHX0ZMQUcoIFRJTUUgKQorCW1FeGVjdXRpb25UaW1lTWFuYWdlci5zdGFydF90aW1lKCk7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggVElNRSApCisKKworCQlpZiggbVRyaWdnZXIudmFsaWQoKSApCisJCXsKKwkJCWlmKCBFTlYuZXZhbChhbkVDLmdldEFQRXhlY3V0aW9uRGF0YSgpLAorCQkJCQlhbkVDLmdldEFQRXhlY3V0aW9uRGF0YSgpLT5nZXRTeXN0ZW1SSUQoKSwgbVRyaWdnZXIpICkKKwkJCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgU09MVklORyApCisJQVZNX09TX0NPVVQgPDwgIm1UcmlnZ2VyOj4gIiA8PCBFTlYub3V0VkFMLnN0cigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgU09MVklORyApCisJCQkJaWYoIEVOVi5vdXRWQUwuaXNFcXVhbEZhbHNlKCkgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCB0cnVlICk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJY2hlY2tGb3JtdWxhKCAmIGFuRUMgKTsKKworQVZNX0lGX0RFQlVHX0ZMQUcoIFRJTUUgKQorCUFWTV9PU19UUkFDRSA8PCAiY2hlY2tGb3JtdWxhPCBFQzo6aWQgIgorCQkJPDwgYW5FQy5nZXRJZE51bWJlcigpIDw8ICIgPiIgPDwgc3RkOjplbmRsOworCW1FeGVjdXRpb25UaW1lTWFuYWdlci5maW5pc2hfdGltZSgpOworCUFWTV9PU19UUkFDRSA8PCBtRXhlY3V0aW9uVGltZU1hbmFnZXIudGltZV9zdGF0KCk7Ly8gPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFRJTUUgKQorCX0KKworCWVsc2UgaWYoIG5vdCBtU3RvcEZsYWcgKQorCXsKKwkJaWYoIG1UcmlnZ2VyLnZhbGlkKCkgKQorCQl7CisJCQlpZiggRU5WLmV2YWwoYW5FQy5nZXRBUEV4ZWN1dGlvbkRhdGEoKSwKKwkJCQkJYW5FQy5nZXRBUEV4ZWN1dGlvbkRhdGEoKS0+Z2V0U3lzdGVtUklEKCksIG1UcmlnZ2VyKSApCisJCQl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFNPTFZJTkcgKQorCUFWTV9PU19DT1VUIDw8ICJtVHJpZ2dlcjo+ICIgPDwgRU5WLm91dFZBTC5zdHIoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFNPTFZJTkcgKQorCQkJCWlmKCBFTlYub3V0VkFMLmlzRXF1YWxGYWxzZSgpICkKKwkJCQl7CisJCQkJCXJldHVybiggdHJ1ZSApOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWNoZWNrRm9ybXVsYUFmdGVyKCAmIGFuRUMgKTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENIRUNLIEZPUk1VTEEKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIEZvcm11bGFDb3ZlcmFnZUZpbHRlcjo6Y2hlY2tzYXRGb3JtdWxhKEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDLAorCQljb25zdCBCRiAmIGFGb3JtdWxhLCBGb3JtdWxhRGF0YSAqIGFGRCkKK3sKKwlCRiBjb25kaXRpb24gPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6OmFuZEV4cHIoCisJCQlhbkVDLT5yZWZFeGVjdXRpb25EYXRhKCkuZ2V0UGF0aENvbmRpdGlvbigpLCBhRm9ybXVsYSk7CisKKwlpZiggU29sdmVyRmFjdG9yeTo6aXNTdHJvbmdTYXRpc2ZpYWJsZShtU29sdmVyS2luZCwgY29uZGl0aW9uKSApCisJeworQVZNX0lGX0RFQlVHX0ZMQUcoIFBST0NFU1NPUiApCisJQVZNX09TX1RSQUNFIDw8IFRBQjIgPDwgIkVDPCIgPDwgYW5FQy0+Z2V0SWROdW1iZXIoKQorCQkJPDwgIj4gIHw9ICA8IiA8PCBhRkQtPmxhYmVsIDw8ICI+ICIgPDwgYUZvcm11bGEuc3RyKCkKKwkJCTw8IHN0ZDo6ZW5kbDsKKworCUFWTV9PU19DT1VUIDw8IFRBQjIgPDwgIkVDPCIgPDwgYW5FQy0+Z2V0SWROdW1iZXIoKQorCQkJPDwgIj4gIHw9ICA8IiA8PCBhRkQtPmxhYmVsIDw8ICI+ICIgPDwgYUZvcm11bGEuc3RyKCkKKwkJCTw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBQUk9DRVNTT1IgKQorCisJCWFuRUMtPmdldHdGbGFncygpLmFkZENvdmVyYWdlRWxlbWVudFRyYWNlKCk7CisKKwkJYW5FQy0+YWRkSW5mbygqdGhpcywgRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdTdHJpbmcoIGFGRC0+bGFiZWwgKSk7CisKKwkJYW5FQy0+Z2V0VW5pcUluZm9ybWF0aW9uKCktPmdldFVuaXFGb3JtdWxhQ292ZXJhZ2VGaWx0ZXJJbmZvKCktPgorCQkJCWFwcGVuZEZvcm11bGEoIElOQ1JfQkYoYUZEKSApOworCisJCWFGRC0+c2F0RUMuYXBwZW5kKCBhbkVDICk7CisKKwkJbUxpc3RPZlBvc2l0aXZlRUMuYXBwZW5kKCBhbkVDICk7CisKKwkJaWYoIG1CcmVha0ZsYWcgJiYgbU1vY1RhYmxlLmVtcHR5KCkgKQorCQl7CisJCQlhbkVDLT5nZXRFeGVjdXRpb25EYXRhKCktPnNldEFFRVMoIEFFRVNfU1RNTlRfRVhJVCApOworCQl9CisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiggZmFsc2UgKTsKKwl9Cit9CisKKworCisKK3ZvaWQgRm9ybXVsYUNvdmVyYWdlRmlsdGVyOjpjaGVja0Zvcm11bGEoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpCit7CisJYm9vbCBuZWVkQ2hlY2tNb2MgPSBmYWxzZTsKKworCUZvcm11bGFEYXRhICogaXRGRDsKKwlCRkxpc3Q6Oml0ZXJhdG9yIGl0Rm9ybSA9IG1MaXN0T2ZVbmNvdmVyZWRGb3JtdWxhLmJlZ2luKCk7CisJZm9yKCA7IGl0Rm9ybSAhPSBtTGlzdE9mVW5jb3ZlcmVkRm9ybXVsYS5lbmQoKSA7ICkKKwl7CisJCWl0RkQgPSAoKml0Rm9ybSkudG9fcHRyPCBGb3JtdWxhRGF0YSA+KCk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTT0xWSU5HICkKKwlBVk1fT1NfVFJBQ0UgPDwgIiA9PT4gY2hlY2tGb3JtdWxhICIgPDwgaXRGRC0+c3RyKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNPTFZJTkcgKQorCisJCWlmKCAoKG5vdCBtRm9ybXVsYVRydXRoVGFibGVbIGl0RkQtPm9mZnNldCBdKSB8fCAobm90IG1NaW5pbWl6YXRpb25GbGFnKSkKKwkJCQkmJiBjaGVja0Zvcm11bGEoYW5FQywgaXRGRCkgKQorCQl7CisJCQltRm9ybXVsYVRydXRoVGFibGVbIGl0RkQtPm9mZnNldCBdID0gdHJ1ZTsKKworCQkJaXRGb3JtID0gbUxpc3RPZlVuY292ZXJlZEZvcm11bGEuZXJhc2UoaXRGb3JtKTsKKworCQkJbUNvdmVyYWdlU3RhdGlzdGljcy5hZGRDb3ZlcmVkRWxlbWVudCgpOworCisJCQluZWVkQ2hlY2tNb2MgPSB0cnVlOworCisKK0FWTV9JRl9ERUJVR19GTEFHKCBQUk9DRVNTT1IgKQorCW1Db3ZlcmFnZVN0YXRpc3RpY3MudG9TdHJlYW1Db3ZlcmFnZVJhdGUoQVZNX09TX1RSQUNFIDw8IFRBQiwKKwkJCSJGb3JtdWxhIENvdmVyYWdlOiAiICwgIlxuIik7CisJQVZNX09TX1RSQUNFIDw8IFJFUEVBVCgiKioqKioqKioiLCAxMCkgPDwgc3RkOjplbmRsOworCisJbUNvdmVyYWdlU3RhdGlzdGljcy50b1N0cmVhbUNvdmVyYWdlUmF0ZShBVk1fT1NfQ09VVCA8PCBUQUIsCisJCQkiRm9ybXVsYSBDb3ZlcmFnZTogIiAsICJcbiIpOworCUFWTV9PU19DT1VUIDw8IFJFUEVBVCgiKioqKioqKioiLCAxMCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFBST0NFU1NPUiApCisJCX0KKwkJZWxzZQorCQl7CisJCQkrK2l0Rm9ybTsKKwkJfQorCX0KKworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU09MVklORyApCisJcHJpbnRUcnV0aFRhYmxlKEFWTV9PU19UUkFDRSwgbUZvcm11bGFUYWJsZSwgbUZvcm11bGFUcnV0aFRhYmxlLAorCQkJIlVwZGF0ZSBvZiB0aGUgRm9ybXVsYSBUcnV0aCBUYWJsZSIpOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNPTFZJTkcgKQorCisJaWYoIG5lZWRDaGVja01vYyApCisJeworCQlpZiggbU1vY0NvdmVyYWdlU3RhdGlzdGljcy5oYXNVbmNvdmVyZWQoKSApCisJCXsKKwkJCWNoZWNrTW9jKCBhbkVDICk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTT0xWSU5HICkKKwlwcmludFRydXRoVGFibGUoQVZNX09TX1RSQUNFLCBtTW9jVGFibGUsIG1Nb2NUcnV0aFRhYmxlLAorCQkJIlVwZGF0ZSBvZiB0aGUgTU9DIFRydXRoIFRhYmxlIik7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU09MVklORyApCisJCX0KKwl9CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTT0xWSU5HICkKKwlwcmludExpbmtUYWJsZShBVk1fT1NfVFJBQ0UsIG1Gb3JtdWxhVGFibGUsIG1Gb3JtdWxhTGlua1RhYmxlLAorCQkJIlVwZGF0ZSBvZiB0aGUgRm9ybXVsYSBMaW5rIFRhYmxlIik7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU09MVklORyApCit9CisKKworYm9vbCBGb3JtdWxhQ292ZXJhZ2VGaWx0ZXI6OmNoZWNrRm9ybXVsYSgKKwkJRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMsIEZvcm11bGFEYXRhICogYUZEKQoreworCWF2bV9zaXplX3Qgc3VjY2VzQ291bnQgPSAwOworCisJRXhlY3V0aW9uQ29udGV4dDo6Y2hpbGRfaXRlcmF0b3IgaXRFQyA9IGFuRUMtPmJlZ2luKCk7CisJRXhlY3V0aW9uQ29udGV4dDo6Y2hpbGRfaXRlcmF0b3IgZW5kRUMgPSBhbkVDLT5lbmQoKTsKKwlmb3IoIDsgaXRFQyAhPSBlbmRFQyA7ICsraXRFQyApCisJeworCQlpZiggRU5WLmV2YWxGb3JtdWxhKCooKml0RUMpLCAmbUxvY2FsRXhlY3V0YWJsZUZvcm0sIGFGRC0+Zm9ybXVsYSkgKQorCQl7CisJCQlpZiggY2hlY2tzYXRGb3JtdWxhKCppdEVDLCBFTlYub3V0VkFMLCBhRkQpICkKKwkJCXsKKwkJCQkrK3N1Y2Nlc0NvdW50OworCisJCQkJaWYoIG1NaW5pbWl6YXRpb25GbGFnICkKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXJldHVybiggc3VjY2VzQ291bnQgPiAwICk7Cit9CisKKworCit2b2lkIEZvcm11bGFDb3ZlcmFnZUZpbHRlcjo6Y2hlY2tGb3JtdWxhQWZ0ZXIoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpCit7CisJRm9ybXVsYURhdGEgKiBpdEZEOworCUJGVmVjdG9yOjppdGVyYXRvciBpdEZvcm0gPSBtRm9ybXVsYVRhYmxlLmJlZ2luKCk7CisJQkZWZWN0b3I6Oml0ZXJhdG9yIGVuZEZvcm0gPSBtRm9ybXVsYVRhYmxlLmVuZCgpOworCWZvciggOyBpdEZvcm0gIT0gZW5kRm9ybSA7ICsraXRGb3JtICkKKwl7CisJCWl0RkQgPSAoKml0Rm9ybSkudG9fcHRyPCBGb3JtdWxhRGF0YSA+KCk7CisKKwkJaWYoIGNoZWNrRm9ybXVsYUFmdGVyKGFuRUMsIGl0RkQpICkKKwkJeworCQkJbUZvcm11bGFUcnV0aFRhYmxlWyBpdEZELT5vZmZzZXQgXSA9IHRydWU7CisKKwkJCS8vIE9LCisJCX0KKwl9Cit9CisKKworYm9vbCBGb3JtdWxhQ292ZXJhZ2VGaWx0ZXI6OmNoZWNrRm9ybXVsYUFmdGVyKAorCQlFeGVjdXRpb25Db250ZXh0ICogYW5FQywgRm9ybXVsYURhdGEgKiBhRkQpCit7CisJQVBFeGVjdXRpb25EYXRhIGFwRUQ7CisJYXZtX3NpemVfdCBzdWNjZXNDb3VudCA9IDA7CisKKwkvLyBSZWNoZXJjaGUgZGVzIGZvcm11bGVzIGNvdXZlcnRlcyBwYXIgbGVzIGZpbHMgZGUgYW5FQworCUV4ZWN1dGlvbkNvbnRleHQ6OmNoaWxkX2l0ZXJhdG9yIGVuZEVDID0gYW5FQy0+ZW5kKCk7CisKKwlzd2l0Y2goIGFGRC0+Zm9ybXVsYS5jbGFzc0tpbmQoKSApCisJeworCQljYXNlIEZPUk1fQVZNQ09ERV9LSU5EOgorCQl7CisJCQljb25zdCBCRkNvZGUgJiBhRm9ybXVsYSA9IGFGRC0+Zm9ybXVsYS5iZkNvZGUoKTsKKworCQkJc3dpdGNoKCBhRm9ybXVsYS0+Z2V0QXZtT3BDb2RlKCkgKQorCQkJeworCQkJCWNhc2UgQVZNX09QQ09ERV9PQlMgOgorCQkJCXsKKwkJCQkJY29uc3QgQkZDb2RlICYgZXZ0Rm9ybXVsYSA9IGFGb3JtdWxhLT5maXJzdCgpLmJmQ29kZSgpOworCisJCQkJCWNvbnN0IEJGICYgY29uc3RyYWludEZvcm11bGEgPSBhRm9ybXVsYS0+c2Vjb25kKCk7CisKKwkJCQkJc3dpdGNoKCBldnRGb3JtdWxhLT5nZXRBdm1PcENvZGUoKSApCisJCQkJCXsKKwkJCQkJCWNhc2UgQVZNX09QQ09ERV9JTlBVVCA6CisJCQkJCQljYXNlIEFWTV9PUENPREVfT1VUUFVUIDoKKwkJCQkJCXsKKwkJCQkJCQlpZiggZXZ0Rm9ybXVsYS0+Zmlyc3QoKS5pczwgQmFzZUluc3RhbmNlRm9ybSA+KCkgKQorCQkJCQkJCXsKKwkJCQkJCQkJQmFzZUluc3RhbmNlRm9ybSAqIGlvSW5zdGFuY2UgPQorCQkJCQkJCQkJCWV2dEZvcm11bGEtPmZpcnN0KCkudG9fcHRyPCBCYXNlSW5zdGFuY2VGb3JtID4oKTsKKworCQkJCQkJCQlpZiggaW9JbnN0YW5jZS0+aXM8IEluc3RhbmNlT2ZQb3J0ID4oKSApCisJCQkJCQkJCXsKKwkJCQkJCQkJCUJGIGFuRXhlY0Zvcm11bGE7CisKKwkJCQkJCQkJCUV4ZWN1dGlvbkNvbnRleHQ6OmNoaWxkX2l0ZXJhdG9yIGl0RUMgPSBhbkVDLT5iZWdpbigpOworCQkJCQkJCQkJZm9yKCA7IGl0RUMgIT0gZW5kRUMgOyArK2l0RUMgKQorCQkJCQkJCQkJeworCQkJCQkJCQkJCWFwRUQgPSAoKml0RUMpLT5nZXRBUEV4ZWN1dGlvbkRhdGEoKTsKKworCQkJCQkJCQkJCUJGQ29kZSBpb1RyYWNlID0gRU5WLnNlYXJjaFRyYWNlSU8oCisJCQkJCQkJCQkJCQkoKml0RUMpLT5nZXRJT0VsZW1lbnRUcmFjZSgpLCBldnRGb3JtdWxhKTsKKworCQkJCQkJCQkJCWlmKCBpb1RyYWNlLnZhbGlkKCkgKQorCQkJCQkJCQkJCXsKKwkJCQkJCQkJCQkJYW5FeGVjRm9ybXVsYSA9IEVOVi5pb1N1YnN0KCBhcEVELAorCQkJCQkJCQkJCQkJCSZtTG9jYWxFeGVjdXRhYmxlRm9ybSwgZXZ0Rm9ybXVsYSwKKwkJCQkJCQkJCQkJCQlpb1RyYWNlLCBjb25zdHJhaW50Rm9ybXVsYSApOworCisJCQkJCQkJCQkJCWlmKCBjaGVja3NhdEZvcm11bGEoKml0RUMsIGFuRXhlY0Zvcm11bGEsIGFGRCkgKQorCQkJCQkJCQkJCQl7CisJCQkJCQkJCQkJCQkrK3N1Y2Nlc0NvdW50OworCQkJCQkJCQkJCQkJLy8gT0sKKwkJCQkJCQkJCQkJfQorCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCQllbHNlIGlmKCBpb0luc3RhbmNlLT5pczwgSW5zdGFuY2VPZkRhdGEgPigpICkKKwkJCQkJCQkJeworCQkJCQkJCQkJRXhlY3V0aW9uQ29udGV4dDo6Y2hpbGRfaXRlcmF0b3IgaXRFQyA9IGFuRUMtPmJlZ2luKCk7CisJCQkJCQkJCQlmb3IoIDsgaXRFQyAhPSBlbmRFQyA7ICsraXRFQyApCisJCQkJCQkJCQl7CisJCQkJCQkJCQkJYXBFRCA9ICgqaXRFQyktPmdldEFQRXhlY3V0aW9uRGF0YSgpOworCisJCQkJCQkJCQkJaWYoIEVOVi5pc0Fzc2lnbmVkKGFwRUQsIGFwRUQtPmdldFN5c3RlbVJJRCgpLAorCQkJCQkJCQkJCQkJaW9JbnN0YW5jZS0+dG88IEluc3RhbmNlT2ZEYXRhID4oKSkgKQorCQkJCQkJCQkJCXsKKwkJCQkJCQkJCQkJRU5WLmV2YWwoYXBFRCwgYXBFRC0+Z2V0U3lzdGVtUklEKCksIGNvbnN0cmFpbnRGb3JtdWxhKTsKKworCQkJCQkJCQkJCQlpZiggY2hlY2tzYXRGb3JtdWxhKCppdEVDLCBFTlYub3V0VkFMLCBhRkQpICkKKwkJCQkJCQkJCQkJeworCQkJCQkJCQkJCQkJKytzdWNjZXNDb3VudDsKKwkJCQkJCQkJCQkJCS8vIE9LCisJCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQl9CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQkJZWxzZQorCQkJCQkJCQl7CisJCQkJCQkJCQkrK3N1Y2Nlc0NvdW50OworCQkJCQkJCQkJLy8gT0sKKwkJCQkJCQkJfQorCQkJCQkJCX0KKworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCisKKwkJCQkJCWRlZmF1bHQ6CisJCQkJCQl7CisJCQkJCQkJRXhlY3V0aW9uQ29udGV4dDo6Y2hpbGRfaXRlcmF0b3IgaXRFQyA9IGFuRUMtPmJlZ2luKCk7CisJCQkJCQkJZm9yKCA7IGl0RUMgIT0gZW5kRUMgOyArK2l0RUMgKQorCQkJCQkJCXsKKwkJCQkJCQkJYXBFRCA9ICgqaXRFQyktPmdldEFQRXhlY3V0aW9uRGF0YSgpOworCisJCQkJCQkJCUVOVi5ldmFsKGFwRUQsIGFwRUQtPmdldFN5c3RlbVJJRCgpLCBldnRGb3JtdWxhKTsKKworCQkJCQkJCQlpZiggRU5WLm91dFZBTC5pc0VxdWFsVHJ1ZSgpICkKKwkJCQkJCQkJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNPTFZJTkcgKQorCUFWTV9PU19UUkFDRSA8PCAiID09PiBDb25zdHJhaW50IEZvcm11bGE6PiAiIDw8IGNvbnN0cmFpbnRGb3JtdWxhLnN0cigpCisJCQk8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU09MVklORyApCisKKwkJCQkJCQkJCUVOVi5ldmFsQ29uZGl0aW9uKGNvbnN0cmFpbnRGb3JtdWxhKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNPTFZJTkcgKQorCUFWTV9PU19UUkFDRSA8PCAiID09PiBFQzwiIDw8ICgqaXRFQyktPmdldElkTnVtYmVyKCkKKwkJCTw8ICI+IHw9Pz0gYW5FeGVjRm9ybXVsYTo+ICIgPDwgRU5WLm91dFZBTC5zdHIoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU09MVklORyApCisKKwkJCQkJCQkJCWlmKCBjaGVja3NhdEZvcm11bGEoKml0RUMsIEVOVi5vdXRWQUwsIGFGRCkgKQorCQkJCQkJCQkJeworCQkJCQkJCQkJCSsrc3VjY2VzQ291bnQ7CisJCQkJCQkJCQkJLy8gT0sKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCUV4ZWN1dGlvbkNvbnRleHQ6OmNoaWxkX2l0ZXJhdG9yIGl0RUMgPSBhbkVDLT5iZWdpbigpOworCQkJCQlmb3IoIDsgaXRFQyAhPSBlbmRFQyA7ICsraXRFQyApCisJCQkJCXsKKwkJCQkJCWFwRUQgPSAoKml0RUMpLT5nZXRBUEV4ZWN1dGlvbkRhdGEoKTsKKworCQkJCQkJRU5WLmV2YWwoYXBFRCwgYXBFRC0+Z2V0U3lzdGVtUklEKCksIGFGb3JtdWxhKTsKKworCQkJCQkJaWYoIGNoZWNrc2F0Rm9ybXVsYSgqaXRFQywgRU5WLm91dFZBTCwgYUZEKSApCisJCQkJCQl7CisJCQkJCQkJKytzdWNjZXNDb3VudDsKKwkJCQkJCQkvLyBPSworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlicmVhazsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCUV4ZWN1dGlvbkNvbnRleHQ6OmNoaWxkX2l0ZXJhdG9yIGl0RUMgPSBhbkVDLT5iZWdpbigpOworCQkJZm9yKCA7IGl0RUMgIT0gZW5kRUMgOyArK2l0RUMgKQorCQkJeworCQkJCWFwRUQgPSAoKml0RUMpLT5nZXRBUEV4ZWN1dGlvbkRhdGEoKTsKKworCQkJCUVOVi5ldmFsKGFwRUQsIGFwRUQtPmdldFN5c3RlbVJJRCgpLCBhRkQtPmZvcm11bGEpOworCisJCQkJaWYoIGNoZWNrc2F0Rm9ybXVsYSgqaXRFQywgRU5WLm91dFZBTCwgYUZEKSApCisJCQkJeworCQkJCQkrK3N1Y2Nlc0NvdW50OworCQkJCQkvLyBPSworCQkJCX0KKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4oIHN1Y2Nlc0NvdW50ID4gMCApOworfQorCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDSEVDSyBNT0MKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIEZvcm11bGFDb3ZlcmFnZUZpbHRlcjo6Y2hlY2tzYXRNb2MoY29uc3QgQkYgJiBhTW9jKQoreworCXN3aXRjaCggYU1vYy5jbGFzc0tpbmQoKSApCisJeworCQljYXNlIEZPUk1fQVZNQ09ERV9LSU5EOgorCQl7CisJCQljb25zdCBCRkNvZGUgJiBhQ29kZSA9IGFNb2MuYmZDb2RlKCk7CisKKwkJCXN3aXRjaCAoIGFDb2RlLT5nZXRBdm1PcENvZGUoKSApCisJCQl7CisJCQkJY2FzZSBBVk1fT1BDT0RFX05PVDoKKwkJCQl7CisJCQkJCXJldHVybiggbm90IGNoZWNrc2F0TW9jKGFDb2RlLT5maXJzdCgpKSApOworCQkJCX0KKworCQkJCWNhc2UgQVZNX09QQ09ERV9BTkQ6CisJCQkJY2FzZSBBVk1fT1BDT0RFX1NUUk9OR19TWU5DSFJPTk9VUzoKKwkJCQl7CisJCQkJCUF2bUNvZGU6Oml0ZXJhdG9yIGl0Rm9ybSA9IGFDb2RlLT5iZWdpbigpOworCQkJCQlBdm1Db2RlOjppdGVyYXRvciBlbmRGb3JtID0gYUNvZGUtPmVuZCgpOworCQkJCQlmb3IoIDsgaXRGb3JtICE9IGVuZEZvcm0gOyArK2l0Rm9ybSApCisJCQkJCXsKKwkJCQkJCWlmKCBub3QgY2hlY2tzYXRNb2MoKml0Rm9ybSkgKQorCQkJCQkJeworCQkJCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCQl9CisKKwkJCQljYXNlIEFWTV9PUENPREVfT1I6CisJCQkJY2FzZSBBVk1fT1BDT0RFX1dFQUtfU1lOQ0hST05PVVM6CisJCQkJeworCQkJCQlBdm1Db2RlOjppdGVyYXRvciBpdEZvcm0gPSBhQ29kZS0+YmVnaW4oKTsKKwkJCQkJQXZtQ29kZTo6aXRlcmF0b3IgZW5kRm9ybSA9IGFDb2RlLT5lbmQoKTsKKwkJCQkJZm9yKCA7IGl0Rm9ybSAhPSBlbmRGb3JtIDsgKytpdEZvcm0gKQorCQkJCQl7CisJCQkJCQlpZiggY2hlY2tzYXRNb2MoKml0Rm9ybSkgKQorCQkJCQkJeworCQkJCQkJCXJldHVybiggdHJ1ZSApOworCQkJCQkJfQorCQkJCQl9CisJCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCQl9CisKKwkJCQljYXNlIEFWTV9PUENPREVfWE9SOgorCQkJCWNhc2UgQVZNX09QQ09ERV9FWENMVVNJVkU6CisJCQkJeworCQkJCQlhdm1fc2l6ZV90IG5iVHJ1ZSA9IDA7CisKKwkJCQkJQXZtQ29kZTo6aXRlcmF0b3IgaXRGb3JtID0gYUNvZGUtPmJlZ2luKCk7CisJCQkJCUF2bUNvZGU6Oml0ZXJhdG9yIGVuZEZvcm0gPSBhQ29kZS0+ZW5kKCk7CisJCQkJCWZvciggOyBpdEZvcm0gIT0gZW5kRm9ybSA7ICsraXRGb3JtICkKKwkJCQkJeworCQkJCQkJaWYoIGNoZWNrc2F0TW9jKCppdEZvcm0pICkKKwkJCQkJCXsKKwkJCQkJCQkrK25iVHJ1ZTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlyZXR1cm4oIG5iVHJ1ZSA9PSAxICk7CisJCQkJfQorCisJCQkJY2FzZSBBVk1fT1BDT0RFX05BTkQ6CisJCQkJeworCQkJCQlBdm1Db2RlOjppdGVyYXRvciBpdEZvcm0gPSBhQ29kZS0+YmVnaW4oKTsKKwkJCQkJQXZtQ29kZTo6aXRlcmF0b3IgZW5kRm9ybSA9IGFDb2RlLT5lbmQoKTsKKwkJCQkJZm9yKCA7IGl0Rm9ybSAhPSBlbmRGb3JtIDsgKytpdEZvcm0gKQorCQkJCQl7CisJCQkJCQlpZiggbm90IGNoZWNrc2F0TW9jKCppdEZvcm0pICkKKwkJCQkJCXsKKwkJCQkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJfQorCisJCQkJY2FzZSBBVk1fT1BDT0RFX05PUjoKKwkJCQl7CisJCQkJCUF2bUNvZGU6Oml0ZXJhdG9yIGl0Rm9ybSA9IGFDb2RlLT5iZWdpbigpOworCQkJCQlBdm1Db2RlOjppdGVyYXRvciBlbmRGb3JtID0gYUNvZGUtPmVuZCgpOworCQkJCQlmb3IoIDsgaXRGb3JtICE9IGVuZEZvcm0gOyArK2l0Rm9ybSApCisJCQkJCXsKKwkJCQkJCWlmKCBjaGVja3NhdE1vYygqaXRGb3JtKSApCisJCQkJCQl7CisJCQkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCQkJfQorCQkJCQl9CisJCQkJCXJldHVybiggdHJ1ZSApOworCQkJCX0KKworCQkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisKKwkJY2FzZSBGT1JNX0VYRUNfRklMVEVSX0ZPUk1VTEFfREFUQV9LSU5EOgorCQl7CisJCQlyZXR1cm4oIG1Gb3JtdWxhVHJ1dGhUYWJsZVsgYU1vYy50b19wdHI8IEZvcm11bGFEYXRhID4oKS0+b2Zmc2V0IF0gKTsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KK30KKworCit2b2lkIEZvcm11bGFDb3ZlcmFnZUZpbHRlcjo6bW9jQXBwZW5kRm9ybXVsYUxpbmsoY29uc3QgQkYgJiBhTW9jKQoreworCXN3aXRjaCggYU1vYy5jbGFzc0tpbmQoKSApCisJeworCQljYXNlIEZPUk1fQVZNQ09ERV9LSU5EOgorCQl7CisJCQlBdm1Db2RlOjppdGVyYXRvciBpdEZvcm0gPSBhTW9jLnRvX3B0cjwgQXZtQ29kZSA+KCktPmJlZ2luKCk7CisJCQlBdm1Db2RlOjppdGVyYXRvciBlbmRGb3JtID0gYU1vYy50b19wdHI8IEF2bUNvZGUgPigpLT5lbmQoKTsKKwkJCWZvciggOyBpdEZvcm0gIT0gZW5kRm9ybSA7ICsraXRGb3JtICkKKwkJCXsKKwkJCQltb2NBcHBlbmRGb3JtdWxhTGluayggKml0Rm9ybSApOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEZPUk1fRVhFQ19GSUxURVJfRk9STVVMQV9EQVRBX0tJTkQ6CisJCXsKKwkJCShtRm9ybXVsYUxpbmtUYWJsZVsgYU1vYy50b19wdHI8IEZvcm11bGFEYXRhID4oKS0+b2Zmc2V0IF0pKys7CisJCQlicmVhazsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCS8vISEhIE5PVEhJTkcKKwkJCWJyZWFrOworCQl9CisJfQorfQorCit2b2lkIEZvcm11bGFDb3ZlcmFnZUZpbHRlcjo6bW9jUmVtb3ZlRm9ybXVsYUxpbmsoY29uc3QgQkYgJiBhTW9jKQoreworCXN3aXRjaCggYU1vYy5jbGFzc0tpbmQoKSApCisJeworCQljYXNlIEZPUk1fQVZNQ09ERV9LSU5EOgorCQl7CisJCQlBdm1Db2RlOjppdGVyYXRvciBpdEZvcm0gPSBhTW9jLnRvX3B0cjwgQXZtQ29kZSA+KCktPmJlZ2luKCk7CisJCQlBdm1Db2RlOjppdGVyYXRvciBlbmRGb3JtID0gYU1vYy50b19wdHI8IEF2bUNvZGUgPigpLT5lbmQoKTsKKwkJCWZvciggOyBpdEZvcm0gIT0gZW5kRm9ybSA7ICsraXRGb3JtICkKKwkJCXsKKwkJCQltb2NSZW1vdmVGb3JtdWxhTGluayggKml0Rm9ybSApOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEZPUk1fRVhFQ19GSUxURVJfRk9STVVMQV9EQVRBX0tJTkQ6CisJCXsKKwkJCShtRm9ybXVsYUxpbmtUYWJsZVsgYU1vYy50b19wdHI8IEZvcm11bGFEYXRhID4oKS0+b2Zmc2V0IF0pLS07CisJCQlicmVhazsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCS8vISEhIE5PVEhJTkcKKwkJCWJyZWFrOworCQl9CisJfQorfQorCit2b2lkIEZvcm11bGFDb3ZlcmFnZUZpbHRlcjo6bW9jVXBkYXRlVW5jb3ZlcmVkRm9ybXVsYSgpCit7CisJQkZMaXN0OjppdGVyYXRvciBpdEZvcm0gPSBtTGlzdE9mVW5jb3ZlcmVkRm9ybXVsYS5iZWdpbigpOworCWZvciggOyBpdEZvcm0gIT0gbUxpc3RPZlVuY292ZXJlZEZvcm11bGEuZW5kKCkgOyApCisJeworCQlpZiggbUZvcm11bGFMaW5rVGFibGVbICgqaXRGb3JtKS50b19wdHI8IEZvcm11bGFEYXRhID4oKS0+b2Zmc2V0IF0gPCAwICkKKwkJeworCQkJaXRGb3JtID0gbUxpc3RPZlVuY292ZXJlZEZvcm11bGEuZXJhc2UoaXRGb3JtKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCSsraXRGb3JtOworCQl9CisJfQorfQorCisKK3ZvaWQgRm9ybXVsYUNvdmVyYWdlRmlsdGVyOjpjaGVja01vYyhFeGVjdXRpb25Db250ZXh0ICogYW5FQykKK3sKKwlGb3JtdWxhRGF0YSAqIGl0RkQ7CisJQkZMaXN0OjppdGVyYXRvciBpdEZvcm0gPSBtTGlzdE9mVW5Db3ZlcmVkTW9jLmJlZ2luKCk7CisJZm9yKCA7IGl0Rm9ybSAhPSBtTGlzdE9mVW5Db3ZlcmVkTW9jLmVuZCgpIDsgKQorCXsKKwkJaXRGRCA9ICgqaXRGb3JtKS50b19wdHI8IEZvcm11bGFEYXRhID4oKTsKKworLy9BVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU09MVklORyApCisJCUFWTV9PU19UUkFDRSA8PCAiID09PiBjaGVja01vYyAiIDw8IGl0RkQtPnN0cigpIDw8IHN0ZDo6ZW5kbDsKKy8vQVZNX0FORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNPTFZJTkcgKQorCisJCWlmKCAoKG5vdCBtTW9jVHJ1dGhUYWJsZVsgaXRGRC0+b2Zmc2V0IF0pIHx8IChub3QgbU1pbmltaXphdGlvbkZsYWcpKQorCQkJCSYmIGNoZWNrc2F0TW9jKGl0RkQtPmZvcm11bGEpICkKKwkJeworCQkJbU1vY0NvdmVyYWdlU3RhdGlzdGljcy5hZGRDb3ZlcmVkRWxlbWVudCgpOworCitBVk1fSUZfREVCVUdfRkxBRyggUFJPQ0VTU09SICkKKwltTW9jQ292ZXJhZ2VTdGF0aXN0aWNzLnRvU3RyZWFtQ292ZXJhZ2VSYXRlKEFWTV9PU19UUkFDRSwKKwkJCSJNb2MgQ292ZXJhZ2U6ICIsICIgLyAiLCAiIDo+ICIpOworCUFWTV9PU19UUkFDRSA8PCBpdEZELT5zdHIoKSA8PCBzdGQ6OmVuZGw7CisJQVZNX09TX1RSQUNFIDw8IFJFUEVBVCgiKioqKioqKioiLCAxMCkgPDwgc3RkOjplbmRsOworCisJbU1vY0NvdmVyYWdlU3RhdGlzdGljcy50b1N0cmVhbUNvdmVyYWdlUmF0ZShBVk1fT1NfVFJBQ0UsCisJCQkiTW9jIENvdmVyYWdlOiAiLCAiIC8gIiwgIiA6PiAiKTsKKwlBVk1fT1NfQ09VVCA8PCBpdEZELT5zdHIoKSA8PCBzdGQ6OmVuZGw7CisJQVZNX09TX0NPVVQgPDwgUkVQRUFUKCIqKioqKioqKiIsIDEwKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggUFJPQ0VTU09SICkKKworCisJCQltTW9jVHJ1dGhUYWJsZVsgaXRGRC0+b2Zmc2V0IF0gPSB0cnVlOworCisJCQltb2NSZW1vdmVGb3JtdWxhTGluayggaXRGRC0+Zm9ybXVsYSApOworCisKKwkJCWFuRUMtPmdldHdGbGFncygpLmFkZENvdmVyYWdlRWxlbWVudFRyYWNlKCk7CisKKwkJCWFuRUMtPmFkZEluZm8oKnRoaXMsIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3U3RyaW5nKCBpdEZELT5sYWJlbCApKTsKKworCQkJYW5FQy0+Z2V0VW5pcUluZm9ybWF0aW9uKCktPgorCQkJCQlnZXRVbmlxRm9ybXVsYUNvdmVyYWdlRmlsdGVySW5mbygpLT5hcHBlbmRNb2MoICppdEZvcm0gKTsKKworCQkJaXRGRC0+c2F0RUMuYXBwZW5kKCBhbkVDICk7CisKKwkJCWlmKCBtQnJlYWtGbGFnICkKKwkJCXsKKwkJCQlhbkVDLT5nZXRFeGVjdXRpb25EYXRhKCktPnNldEFFRVMoIEFFRVNfU1RNTlRfRVhJVCApOworCQkJfQorCisJCQlpdEZvcm0gPSBtTGlzdE9mVW5Db3ZlcmVkTW9jLmVyYXNlKGl0Rm9ybSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkrK2l0Rm9ybTsKKwkJfQorCX0KK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRm9ybXVsYUNvdmVyYWdlRmlsdGVyIEluZm9ybWF0aW9uCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCisgKiBTZXJpYWxpemF0aW9uCisgKi8KK3ZvaWQgRm9ybXVsYUNvdmVyYWdlRmlsdGVySW5mbzo6dG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpICBjb25zdAoreworCWlmKCBtRm9ybXVsYVRhYmxlLm5vbmVtcHR5KCkgKQorCXsKKwkJb3MgPDwgVEFCIDw8ICJGT1JNVUxBeyIgPDwgRU9MX0lOQ1JfSU5ERU5UOworCisJCUJGTGlzdDo6Y29uc3RfaXRlcmF0b3IgaXRGb3JtID0gbUZvcm11bGFUYWJsZS5iZWdpbigpOworCQlCRkxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGVuZEZvcm0gPSBtRm9ybXVsYVRhYmxlLmVuZCgpOworCQlmb3IoIDsgaXRGb3JtICE9IGVuZEZvcm0gOyArK2l0Rm9ybSApCisJCXsKKwkJCSgqaXRGb3JtKS50b19wdHI8IEZvcm11bGFEYXRhID4oKS0+dG9TdHJlYW0ob3MpOworCQl9CisJCW9zIDw8IERFQ1JfSU5ERU5UX1RBQiA8PCAifSIgPDwgRU9MX0ZMVVNIOworCX0KKworCWlmKCBtRm9ybXVsYVRhYmxlLm5vbmVtcHR5KCkgKQorCXsKKwkJb3MgPDwgVEFCIDw8ICJGT1JNVUxBX01PQ3siIDw8IEVPTF9JTkNSX0lOREVOVDsKKworCQlCRkxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGl0Rm9ybSA9IG1Nb2NUYWJsZS5iZWdpbigpOworCQlCRkxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGVuZEZvcm0gPSBtTW9jVGFibGUuZW5kKCk7CisJCWZvciggOyBpdEZvcm0gIT0gZW5kRm9ybSA7ICsraXRGb3JtICkKKwkJeworCQkJKCppdEZvcm0pLnRvX3B0cjwgRm9ybXVsYURhdGEgPigpLT50b1N0cmVhbShvcyk7CisJCX0KKwkJb3MgPDwgREVDUl9JTkRFTlRfVEFCIDw8ICJ9IiA8PCBFT0xfRkxVU0g7CisJfQorfQorCit2b2lkIEZvcm11bGFDb3ZlcmFnZUZpbHRlckluZm86OnRvRnNjbihPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlpZiggbUZvcm11bGFUYWJsZS5ub25lbXB0eSgpICkKKwl7CisJCW9zIDw8IFRBQiA8PCAiRk9STVVMQXsiIDw8IEVPTF9JTkNSX0lOREVOVDsKKworCQlCRkxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGl0Rm9ybSA9IG1Gb3JtdWxhVGFibGUuYmVnaW4oKTsKKwkJQkZMaXN0Ojpjb25zdF9pdGVyYXRvciBlbmRGb3JtID0gbUZvcm11bGFUYWJsZS5lbmQoKTsKKwkJZm9yKCA7IGl0Rm9ybSAhPSBlbmRGb3JtIDsgKytpdEZvcm0gKQorCQl7CisJCQkoKml0Rm9ybSkudG9fcHRyPCBGb3JtdWxhRGF0YSA+KCktPnRvRnNjbihvcyk7CisJCX0KKwkJb3MgPDwgREVDUl9JTkRFTlRfVEFCIDw8ICJ9IiA8PCBFT0wgPDwgc3RkOjpmbHVzaDsKKwl9CisKKwlpZiggbU1vY1RhYmxlLm5vbmVtcHR5KCkgKQorCXsKKwkJb3MgPDwgVEFCIDw8ICJGT1JNVUxBX01PQ3siIDw8IEVPTF9JTkNSX0lOREVOVDsKKworCQlCRkxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGl0Rm9ybSA9IG1Nb2NUYWJsZS5iZWdpbigpOworCQlCRkxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGVuZEZvcm0gPSBtTW9jVGFibGUuZW5kKCk7CisJCWZvciggOyBpdEZvcm0gIT0gZW5kRm9ybSA7ICsraXRGb3JtICkKKwkJeworCQkJKCppdEZvcm0pLnRvX3B0cjwgRm9ybXVsYURhdGEgPigpLT50b0ZzY24ob3MpOworCQl9CisJCW9zIDw8IERFQ1JfSU5ERU5UX1RBQiA8PCAifSIgPDwgRU9MX0ZMVVNIOworCX0KK30KKworCisKKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vY292ZXJhZ2UvRm9ybXVsYUNvdmVyYWdlRmlsdGVyLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vY292ZXJhZ2UvRm9ybXVsYUNvdmVyYWdlRmlsdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNmODc3NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9jb3ZlcmFnZS9Gb3JtdWxhQ292ZXJhZ2VGaWx0ZXIuaApAQCAtMCwwICsxLDQ0MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDIzIGp1aWwuIDIwMDgKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBGT1JNVUxBQ09WRVJBR0VGSUxURVJfSF8KKyNkZWZpbmUgRk9STVVMQUNPVkVSQUdFRklMVEVSX0hfCisKKyNpbmNsdWRlIDxmYW0vY292ZXJhZ2UvQmFzZUNvdmVyYWdlRmlsdGVyLmg+CisKKyNpbmNsdWRlIDxjb21tb24vQXZtUG9pbnRlci5oPgorI2luY2x1ZGUgPGNvbW1vbi9FbGVtZW50Lmg+CisjaW5jbHVkZSA8Y29tbW9uL0JGLmg+CisKKyNpbmNsdWRlIDxjb2xsZWN0aW9uL0JpdHNldC5oPgorI2luY2x1ZGUgPGNvbGxlY3Rpb24vVHlwZWRlZi5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZUZvcm0uaD4KKworI2luY2x1ZGUgPHNldy9Db25maWd1cmF0aW9uLmg+CisKKyNpbmNsdWRlIDxzb2x2ZXIvYXBpL1NvbHZlckRlZi5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworY2xhc3MgQXZtQ29kZTsKK2NsYXNzIEV4ZWN1dGlvbkNvbnRleHQ7CitjbGFzcyBXT2JqZWN0OworY2xhc3MgU2F0U29sdmVyOworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRm9ybXVsYURhdGEKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisKK2NsYXNzIEZvcm11bGFEYXRhICA6ICBwdWJsaWMgRWxlbWVudCAsCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggRm9ybXVsYURhdGEgKQoreworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIEZvcm11bGFEYXRhICkKKworCitwdWJsaWM6CisJLyoqCisJICogQVRUUklCVVRFUworCSAqLworCUJGIGZvcm11bGE7CisJc3RkOjpzdHJpbmcgbGFiZWw7CisJYXZtX29mZnNldF90IG9mZnNldDsKKworCUVsZW1lbnQgKiBjb21waWxlZDsKKworCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQgc2F0RUM7CisKKworcHVibGljOgorCUZvcm11bGFEYXRhKGNvbnN0IEJGICYgYUZvcm11bGEsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYUxhYmVsLAorCQkJYXZtX29mZnNldF90IGFuT2Zmc2V0LCBFbGVtZW50ICogZmF2bUZvcm11bGEpCisJOiBFbGVtZW50KCBDTEFTU19LSU5EX1QoIEZvcm11bGFEYXRhICkgKSwKKwlmb3JtdWxhKCBhRm9ybXVsYSApLAorCWxhYmVsKCBhTGFiZWwgKSwKKwlvZmZzZXQoIGFuT2Zmc2V0ICksCisKKwljb21waWxlZCggZmF2bUZvcm11bGEgKSwKKwlzYXRFQyggKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+Rm9ybXVsYURhdGEoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogU0VSSUFMSVpBVElPTgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKi8KKworCXZpcnR1YWwgdm9pZCByZXBvcnQoT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCisKKwlpbmxpbmUgc3RkOjpzdHJpbmcgc3RyKCkgY29uc3QKKwl7CisJCVN0cmluZ091dFN0cmVhbSBvc3MoIEFWTV9OT19JTkRFTlQgKTsKKworCQl0b1N0cmVhbShvc3MpOworCisJCXJldHVybiggb3NzLnN0cigpICk7CisJfQorCisJaW5saW5lIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQlvcyA8PCBUQUIgPDwgIjw8ICIgPDwgb2Zmc2V0IDw8ICI6IiA8PCBsYWJlbCA8PCAiOiAiCisJCQkJPDwgZm9ybXVsYS5zdHIoKSA8PCAiID4+IiA8PCBFT0xfRkxVU0g7CisJfQorCisJaW5saW5lIHZvaWQgdG9Gc2NuKE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJb3MgPDwgVEFCIDw8IHN0cigpIDw8IEVPTCA8PCBzdGQ6OmZsdXNoOworCX0KKworfTsKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRm9ybXVsYUNvdmVyYWdlRmlsdGVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCitjbGFzcyBGb3JtdWxhQ292ZXJhZ2VGaWx0ZXIgOgorCQlwdWJsaWMgQXV0b1JlZ2lzdGVyZWRDb3ZlcmFnZVByb2Nlc3NvclVuaXQ8IEZvcm11bGFDb3ZlcmFnZUZpbHRlciA+Cit7CisKKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggRm9ybXVsYUNvdmVyYWdlRmlsdGVyICkKKworCisJLyoqCisJICogUFJPQ0VTU09SIEZBQ1RPUlkKKwkgKiBmb3IgYXV0b21hdGljIHJlZ2lzdHJhdGlvbiBpbiB0aGUgcHJvY2Vzc29yIHJlcG9zaXRvcnkKKwkgKiB0aGUgWyBbIEZVTExZIF0gUVVBTElGSUVEIF0gTkFNRSBJRAorCSAqLworCUFWTV9JTkpFQ1RfQVVUT19SRUdJU1RFUl9RVUFMSUZJRURfSURfS0VZXzIoCisJCQkiYXZtOjpwcm9jZXNzb3IuRk9STVVMQV9DT1ZFUkFHRSIsCisJCQkiYXZtOjpjb3JlLmZpbHRlci5GT1JNVUxBX0NPVkVSQUdFIiApCisJLy8gZW5kIHJlZ2lzdHJhdGlvbgorCisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBBVFRSSUJVVEVTCisJICovCisJU29sdmVyRGVmOjpTT0xWRVJfS0lORCBtU29sdmVyS2luZDsKKworCUV4ZWN1dGFibGVGb3JtIG1Mb2NhbEV4ZWN1dGFibGVGb3JtOworCisJQkYgbVRyaWdnZXI7CisKKworCUJGVmVjdG9yIG1Gb3JtdWxhVGFibGU7CisJQkZMaXN0IG1MaXN0T2ZVbmNvdmVyZWRGb3JtdWxhOworCisJQml0c2V0IG1Gb3JtdWxhVHJ1dGhUYWJsZTsKKwlWZWN0b3JPZkludCBtRm9ybXVsYUxpbmtUYWJsZTsKKworCisJQkZWZWN0b3IgbU1vY1RhYmxlOworCUJGTGlzdCBtTGlzdE9mVW5Db3ZlcmVkTW9jOworCisJQml0c2V0IG1Nb2NUcnV0aFRhYmxlOworCVZlY3Rvck9mSW50IG1Nb2NMaW5rVGFibGU7CisKKwlBdm1Db3ZlcmFnZVN0YXRpc3RpY3MgbU1vY0NvdmVyYWdlU3RhdGlzdGljczsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJRm9ybXVsYUNvdmVyYWdlRmlsdGVyKAorCQkJU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyICYgYU1hbmFnZXIsIFdPYmplY3QgKiB3ZlBhcmFtZXRlck9iamVjdCkKKwk6IFJlZ2lzdGVyZWRDb3ZlcmFnZVByb2Nlc3NvclVuaXQoYU1hbmFnZXIsIHdmUGFyYW1ldGVyT2JqZWN0LAorCQkJQVZNX1BSRVBPU1RfRklMVEVSSU5HX1NUQUdFLCBQUkVDRURFTkNFX09GX0ZPUk1VTEFfQ09WRVJBR0UpLAorCW1Tb2x2ZXJLaW5kKCBTb2x2ZXJEZWY6OlNPTFZFUl9VTkRFRklORURfS0lORCApLAorCW1Mb2NhbEV4ZWN1dGFibGVGb3JtKCBnZXRDb25maWd1cmF0aW9uKCkuZ2V0RXhlY3V0YWJsZVN5c3RlbSgpICwgMCApLAorCW1UcmlnZ2VyKCApLAorCisJbUZvcm11bGFUYWJsZSggKSwKKwltTGlzdE9mVW5jb3ZlcmVkRm9ybXVsYSgpLAorCW1Gb3JtdWxhVHJ1dGhUYWJsZSgpLAorCW1Gb3JtdWxhTGlua1RhYmxlKCApLAorCisJbU1vY1RhYmxlKCApLAorCW1MaXN0T2ZVbkNvdmVyZWRNb2MoKSwKKwltTW9jVHJ1dGhUYWJsZSgpLAorCW1Nb2NMaW5rVGFibGUoICksCisJbU1vY0NvdmVyYWdlU3RhdGlzdGljcyggKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkZvcm11bGFDb3ZlcmFnZUZpbHRlcigpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIENPTkZJR1VSRQorCSAqLworCXZpcnR1YWwgYm9vbCBjb25maWd1cmVJbXBsKCk7CisKKworCS8qKgorCSAqIFJFUE9SVCBUUkFDRQorCSAqLworCXZpcnR1YWwgdm9pZCByZXBvcnREZWZhdWx0KE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworCisJLyoqCisJICogcG9zdEV2YWwgRmlsdGVyCisJICovCisJdmlydHVhbCBib29sIHBvc3RmaWx0ZXIoRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQ0hFQ0sgRk9STVVMQQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwlib29sIGNoZWNrc2F0Rm9ybXVsYShFeGVjdXRpb25Db250ZXh0ICogYW5FQywKKwkJCWNvbnN0IEJGICYgYUZvcm11bGEsIEZvcm11bGFEYXRhICogYUZEKTsKKworCXZvaWQgY2hlY2tGb3JtdWxhKEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDKTsKKwlib29sIGNoZWNrRm9ybXVsYShFeGVjdXRpb25Db250ZXh0ICogYW5FQywgRm9ybXVsYURhdGEgKiBhRkQpOworCisJdm9pZCBjaGVja0Zvcm11bGFBZnRlcihFeGVjdXRpb25Db250ZXh0ICogYW5FQyk7CisJYm9vbCBjaGVja0Zvcm11bGFBZnRlcihFeGVjdXRpb25Db250ZXh0ICogYW5FQywgRm9ybXVsYURhdGEgKiBhRkQpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQ0hFQ0sgTU9DCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJYm9vbCBjaGVja3NhdE1vYyhjb25zdCBCRiAmIGFNb2MpOworCisJdm9pZCBtb2NBcHBlbmRGb3JtdWxhTGluayhjb25zdCBCRiAmIGFNb2MpOworCXZvaWQgbW9jUmVtb3ZlRm9ybXVsYUxpbmsoY29uc3QgQkYgJiBhTW9jKTsKKwl2b2lkIG1vY1VwZGF0ZVVuY292ZXJlZEZvcm11bGEoKTsKKworCXZvaWQgY2hlY2tNb2MoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpOworCisKKwkvKgorCSAqIEdFVFRFUgorCSAqIG1UcmlnZ2VyCisJICovCisJaW5saW5lIHZvaWQgc2V0VHJpZ2dlcihjb25zdCBCRiAmIGFUcmlnZ2VyKQorCXsKKwkJbVRyaWdnZXIgPSBhVHJpZ2dlcjsKKwl9CisKKwlpbmxpbmUgQkYgJiBnZXRUcmlnZ2VyKCkKKwl7CisJCXJldHVybiggbVRyaWdnZXIpOworCX0KKworCS8qCisJICogR0VUVEVSCisJICogbVZlY3Rvck9mRm9ybXVsYQorCSAqLworCUJGIGFwcGVuZEZvcm11bGEoY29uc3QgQkYgJiBhRm9ybXVsYSwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgbGFiZWwsIEVsZW1lbnQgKiBmYXZtRm9ybXVsYSA9IE5VTEwpOworCisJaW5saW5lIEJGICYgZ2V0Rm9ybXVsYShjb25zdCBzdGQ6OnN0cmluZyAmIGxhYmVsKQorCXsKKwkJQkZWZWN0b3I6Oml0ZXJhdG9yIGl0Rm9ybSA9IG1Gb3JtdWxhVGFibGUuYmVnaW4oKTsKKwkJQkZWZWN0b3I6Oml0ZXJhdG9yIGVuZEZvcm0gPSBtRm9ybXVsYVRhYmxlLmVuZCgpOworCQlmb3IoIDsgaXRGb3JtICE9IGVuZEZvcm0gOyArK2l0Rm9ybSApCisJCXsKKwkJCWlmKCAoKml0Rm9ybSkudG9fcHRyPCBGb3JtdWxhRGF0YSA+KCktPmxhYmVsID09IGxhYmVsICkKKwkJCXsKKwkJCQlyZXR1cm4oICppdEZvcm0gKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiggQkY6OlJFRl9OVUxMICk7CisJfQorCisKKwlpbmxpbmUgQkZWZWN0b3IgJiBnZXRGb3JtdWxhVGFibGUoKQorCXsKKwkJcmV0dXJuKCBtRm9ybXVsYVRhYmxlICk7CisJfQorCisKKwkvKgorCSAqIEdFVFRFUgorCSAqIG1MaXN0T2ZVbmNvdmVyZWRGb3JtdWxhCisJICovCisJaW5saW5lIGNvbnN0IEJGTGlzdCAmIGdldExpc3RPZlVuQ292ZXJlZEZvcm11bGEoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtTGlzdE9mVW5jb3ZlcmVkRm9ybXVsYSApOworCX0KKworCisJLyoKKwkgKiBHRVRURVIKKwkgKiBtVmVjdG9yT2ZNb2MKKwkgKi8KKwlCRiBhcHBlbmRNb2MoY29uc3QgQkYgJiBhTW9jLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBsYWJlbCwgRWxlbWVudCAqIGZhdm1Gb3JtdWxhID0gTlVMTCk7CisKKwlpbmxpbmUgQkZWZWN0b3IgJiBnZXRNb2NUYWJsZSgpCisJeworCQlyZXR1cm4oIG1Nb2NUYWJsZSApOworCX0KKworCUJGIGJ1aWxkTW9jKGNvbnN0IEJGICYgYU1vYyk7CisKK307CisKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRm9ybXVsYUNvdmVyYWdlRmlsdGVyIEluZm9ybWF0aW9uCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY2xhc3MgRm9ybXVsYUNvdmVyYWdlRmlsdGVySW5mbyA6CisJCXB1YmxpYyBFbGVtZW50ICwKKwkJQVZNX0lOSkVDVF9JTlNUQU5DRV9DT1VOVEVSX0NMQVNTKCBGb3JtdWxhQ292ZXJhZ2VGaWx0ZXJJbmZvICkKK3sKKworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBGb3JtdWxhQ292ZXJhZ2VGaWx0ZXJJbmZvICkKKworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQVRUUklCVVRFUworCSAqLworCUJGTGlzdCBtRm9ybXVsYVRhYmxlOworCisJQkZMaXN0IG1Nb2NUYWJsZTsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJRm9ybXVsYUNvdmVyYWdlRmlsdGVySW5mbygpCisJOiBFbGVtZW50KCBDTEFTU19LSU5EX1QoIEZvcm11bGFDb3ZlcmFnZUZpbHRlckluZm8gKSApLAorCW1Gb3JtdWxhVGFibGUoICksCisJbU1vY1RhYmxlKCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCUZvcm11bGFDb3ZlcmFnZUZpbHRlckluZm8oY29uc3QgRm9ybXVsYUNvdmVyYWdlRmlsdGVySW5mbyAmIGFuSW5mbykKKwk6IEVsZW1lbnQoIGFuSW5mbyApLAorCW1Gb3JtdWxhVGFibGUoYW5JbmZvLm1Gb3JtdWxhVGFibGUpLAorCW1Nb2NUYWJsZSggYW5JbmZvLm1Nb2NUYWJsZSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5Gb3JtdWxhQ292ZXJhZ2VGaWx0ZXJJbmZvKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qCisJICogR0VUVEVSIC0tIFNFVFRFUgorCSAqIG1Gb3JtdWxhVGFibGUKKwkgKi8KKwlpbmxpbmUgdm9pZCBhcHBlbmRGb3JtdWxhKGNvbnN0IEJGICYgYUZEKQorCXsKKwkJbUZvcm11bGFUYWJsZS5hcHBlbmQoIGFGRCApOworCX0KKworCWlubGluZSBCRkxpc3QgJiBnZXRGb3JtdWxhVGFibGUoKQorCXsKKwkJcmV0dXJuKCBtRm9ybXVsYVRhYmxlICk7CisJfQorCisKKwkvKgorCSAqIEdFVFRFUiAtLSBTRVRURVIKKwkgKiBtTW9jVGFibGUKKwkgKi8KKwlpbmxpbmUgdm9pZCBhcHBlbmRNb2MoQkYgJiBhRkQpCisJeworCQltTW9jVGFibGUuYXBwZW5kKCBhRkQgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBhcHBlbmRNb2MoQkZMaXN0ICYgYVRhYmxlKQorCXsKKwkJbU1vY1RhYmxlLmFwcGVuZCggYVRhYmxlICk7CisJfQorCisJaW5saW5lIHZvaWQgYXBwZW5kTW9jKEJGVmVjdG9yICYgYVRhYmxlKQorCXsKKwkJbU1vY1RhYmxlLmFwcGVuZCggYVRhYmxlICk7CisJfQorCisJaW5saW5lIEJGTGlzdCAmIGdldE1vY1RhYmxlKCkKKwl7CisJCXJldHVybiggbU1vY1RhYmxlICk7CisJfQorCisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKKwl2b2lkIHRvRnNjbihPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKK307CisKKworCit9CisKKyNlbmRpZiAvKiBGT1JNVUxBQ09WRVJBR0VGSUxURVJfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9jb3ZlcmFnZS9TdGF0ZW1hY2hpbmVSZWFjaGFiaWxpdHkuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2NvdmVyYWdlL1N0YXRlbWFjaGluZVJlYWNoYWJpbGl0eS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk0OGY0ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9jb3ZlcmFnZS9TdGF0ZW1hY2hpbmVSZWFjaGFiaWxpdHkuY3BwCkBAIC0wLDAgKzEsMzcxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTYganVpbC4gMjAxMworICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiU3RhdGVtYWNoaW5lUmVhY2hhYmlsaXR5LmgiCisKKyNpbmNsdWRlIDxmYW0vY292ZXJhZ2UvQmFzZUNvdmVyYWdlRmlsdGVyLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9Bdm1UcmFuc2l0aW9uLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZUZvcm0uaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlUXVlcnkuaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlU3lzdGVtLmg+CisKKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvQmVoYXZpb3JhbFBhcnQuaD4KKworI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9XT2JqZWN0Lmg+CisKKyNpbmNsdWRlIDxzZXcvQ29uZmlndXJhdGlvbi5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworLyoqCisgKiBCYWNrd2FyZCBSZWFjaGFiaWxpdHkgQW5hbHlzaXMKKyAqLworYm9vbCBTdGF0ZW1hY2hpbmVSZWFjaGFiaWxpdHk6OmNvbXB1dGVCYWNrd2FyZFJlYWNoYWJsZUNvbXBvbmVudCgKKwkJY29uc3QgQ29uZmlndXJhdGlvbiAmIGFDb25maWd1cmF0aW9uKQoreworCWF2bV9zaXplX3QgY3VycmVudEJhY2t3YXJkRGVwdGggPSAwOworCisJY29uc3QgTWFjaGluZSAqIGFNYWNoaW5lOworCUF2bVRyYW5zaXRpb24gKiBhQ29tcGlsZWRUcmFuc2l0aW9uOworCUluc3RhbmNlT2ZNYWNoaW5lICogYVNvdXJjZVN0YXRlOworCisJY29uc3QgVGFibGVPZkV4ZWN1dGFibGVGb3JtICYgZXhlY3V0YWJsZXMgPQorCQkJYUNvbmZpZ3VyYXRpb24uZ2V0RXhlY3V0YWJsZVN5c3RlbSgpLmdldEV4ZWN1dGFibGVzKCk7CisKKwlMaXN0T2ZFeGVjdXRhYmxlRm9ybSBsaXN0T2ZUcmVhdGVkU3RhdGVzOworCisJVGFibGVPZkV4ZWN1dGFibGVGb3JtOjpjb25zdF9yYXdfaXRlcmF0b3IgaXRFeGVjID0gZXhlY3V0YWJsZXMuYmVnaW4oKTsKKwlUYWJsZU9mRXhlY3V0YWJsZUZvcm06OmNvbnN0X3Jhd19pdGVyYXRvciBlbmRFeGVjID0gZXhlY3V0YWJsZXMuZW5kKCk7CisKKwlpZiggbUJhY2t3YXJkQW5hbHlzaXNMb29rYWhlYWREZXB0aCA+PSAxICkKKwl7CisJCUV4ZWN1dGFibGVRdWVyeSBYUXVlcnkoIGFDb25maWd1cmF0aW9uICk7CisKKwkJLy8gUG91ciB0b3VzIGxlcyDDqXRhdHMgaXRFeGVjCisJCS8vCW9uIHJham91dGUgIGxlcyB0cmFuc2l0aW9ucyBpbW3DqWRpYXRlbWVudCBlbnRyYW50ZXMgZGFucyBCYWNrd2FyZFJlYWNoYWJsZVRyYW5zaXRpb24KKwkJZm9yKCA7IGl0RXhlYyAhPSBlbmRFeGVjIDsgKytpdEV4ZWMgKQorCQl7CisJCQlpZiggKGl0RXhlYyktPmhhc1Byb3RvdHlwZUluc3RhbmNlKCkgKQorCQkJeworCQkJCWFNYWNoaW5lID0gKGl0RXhlYyktPmdldEFzdE1hY2hpbmUoKTsKKwkJCQlpZiggYU1hY2hpbmUtPmhhc0luY29taW5nVHJhbnNpdGlvbigpICkKKwkJCQl7CisJCQkJCS8vIFBvdXIgbCfDqXRhdCBpdEV4ZWMgb24gcmFqb3V0ZSA6CisJCQkJCS8vIC0gbGVzIHRyYW5zaXRpb25zIGVudHJhbnRlcyDDoCBsYSBsaXN0ZSBkZXMgQmFja3dhcmRSZWFjaGFibGVUcmFuc2l0aW9uCisJCQkJCS8vIC0gbGVzIMOpdGF0cyBzb3VyY2VzIGRlcyB0cmFuc2l0aW9ucyBlbnRyYW50ZXMgw6AgbGEgbGlzdGUgZGVzIEJhY2t3YXJkUmVhY2hhYmxlTWFjaGluZQorCQkJCQkvLworCQkJCQlCZWhhdmlvcmFsUGFydDo6Y29uc3RfdHJhbnNpdGlvbl9pdGVyYXRvciBpdFRyYW5zaXRpb24gPQorCQkJCQkJCWFNYWNoaW5lLT5nZXRCZWhhdmlvcigpLT5pbmNvbWluZ190cmFuc2l0aW9uX2JlZ2luKCk7CisJCQkJCUJlaGF2aW9yYWxQYXJ0Ojpjb25zdF90cmFuc2l0aW9uX2l0ZXJhdG9yIGVuZFRyYW5zaXRpb24gPQorCQkJCQkJCWFNYWNoaW5lLT5nZXRCZWhhdmlvcigpLT5pbmNvbWluZ190cmFuc2l0aW9uX2VuZCgpOworCQkJCQlmb3IoIDsgaXRUcmFuc2l0aW9uICE9IGVuZFRyYW5zaXRpb24gOyArK2l0VHJhbnNpdGlvbiApCisJCQkJCXsKKwkJCQkJCWFDb21waWxlZFRyYW5zaXRpb24gPSBYUXVlcnkuZ2V0VHJhbnNpdGlvbkJ5QXN0RWxlbWVudCgKKwkJCQkJCQkJKGl0VHJhbnNpdGlvbikgKS50b19wdHI8IEF2bVRyYW5zaXRpb24gPigpOworCQkJCQkJKGl0RXhlYyktPmFkZEJhY2t3YXJkUmVhY2hhYmxlVHJhbnNpdGlvbiggYUNvbXBpbGVkVHJhbnNpdGlvbiApOworCisJCQkJCQlhU291cmNlU3RhdGUgPSBhQ29tcGlsZWRUcmFuc2l0aW9uLT4KKwkJCQkJCQkJZ2V0RXhlY3V0YWJsZUNvbnRhaW5lcigpLT5nZXRQcm90b3R5cGVJbnN0YW5jZSgpOworCQkJCQkJaWYoIChhU291cmNlU3RhdGUgIT0gTlVMTCkKKwkJCQkJCQkmJiAoKGl0RXhlYykgIT0gYVNvdXJjZVN0YXRlLT5nZXRFeGVjdXRhYmxlKCkpCisJCQkJCQkJJiYgKG5vdCAoaXRFeGVjKS0+Z2V0QmFja3dhcmRSZWFjaGFibGVNYWNoaW5lKCkuCisJCQkJCQkJCQljb250YWlucyggYVNvdXJjZVN0YXRlICkpICkKKwkJCQkJCXsKKwkJCQkJCQkoaXRFeGVjKS0+YWRkQmFja3dhcmRSZWFjaGFibGVNYWNoaW5lKCBhU291cmNlU3RhdGUgKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQljdXJyZW50QmFja3dhcmREZXB0aCA9IDE7CisJfQorCisJaWYoIG1CYWNrd2FyZEFuYWx5c2lzTG9va2FoZWFkRGVwdGggPiBjdXJyZW50QmFja3dhcmREZXB0aCApCisJeworCQkvLyBQb3VyIHRvdXMgbGVzIMOpdGF0cyBpdEV4ZWMsIG9uIGFqb3V0ZSBwYXIgcsOpY3Vyc2l2aXTDqSA6CisJCS8vCS0gbGVzIHRyYW5zaXRpb25zIGFycmnDqHJlcyBub24gZGlyZWN0ZW1lbnQgZW50cmFudGVzCisJCS8vICAgIGRhbnMgQmFja3dhcmRSZWFjaGFibGVUcmFuc2l0aW9uCisJCS8vCS0gbGVzIMOpdGF0cyBzb3VyY2VzIGRlIHRvdXRlcyBsZXMgdHJhbnNpdGlvbnMgYXJyacOocmVzCisJCS8vICAgIG5vbiBkaXJlY3RlbWVudCBlbnRyYW50ZXMgZGFucyBCYWNrd2FyZFJlYWNoYWJsZU1hY2hpbmUKKwkJLy8KKwkJZm9yKCBpdEV4ZWMgPSBleGVjdXRhYmxlcy5iZWdpbigpIDsgaXRFeGVjICE9IGVuZEV4ZWMgOyArK2l0RXhlYyApCisJCXsKKwkJCWlmKCAoaXRFeGVjKS0+aGFzUHJvdG90eXBlSW5zdGFuY2UoKSApCisJCQl7CisJCQkJY29tcHV0ZUJhY2t3YXJkUmVhY2hhYmxlQ29tcG9uZW50KCBhQ29uZmlndXJhdGlvbiwKKwkJCQkJCShpdEV4ZWMpLCBsaXN0T2ZUcmVhdGVkU3RhdGVzLCBjdXJyZW50QmFja3dhcmREZXB0aCApOworCQkJfQorCQl9CisJfQorCisJLy8gUG91ciB0b3VzIGxlcyDDqXRhdHMgaXRFeGVjIDoKKwkvLyAgICDDqWxpbWluYXRpb24gZGUgbCfDqXRhdCBpdEV4ZWMgZGFucyBsYSBsaXN0ZSBCYWNrd2FyZFJlYWNoYWJsZU1hY2hpbmUKKwkvLworCWZvciggaXRFeGVjID0gZXhlY3V0YWJsZXMuYmVnaW4oKSA7IGl0RXhlYyAhPSBlbmRFeGVjIDsgKytpdEV4ZWMgKQorCXsKKwkJaWYoIChpdEV4ZWMpLT5oYXNQcm90b3R5cGVJbnN0YW5jZSgpICkKKwkJeworCQkJaWYoIChpdEV4ZWMpLT5nZXRCYWNrd2FyZFJlYWNoYWJsZU1hY2hpbmUoKS5ub25lbXB0eSgpICkKKwkJCXsKKwkJCQkoaXRFeGVjKS0+cmVtb3ZlQmFja3dhcmRSZWFjaGFibGVNYWNoaW5lKAorCQkJCQkJKGl0RXhlYyktPmdldFByb3RvdHlwZUluc3RhbmNlKCkgKTsKKwkJCX0KKworCQkJaWYoIChpdEV4ZWMpLT5oYXNUcmFuc2l0aW9uKCkKKwkJCQkmJiAobm90IChpdEV4ZWMpLT5nZXRTcGVjaWZpZXIoKS4KKwkJCQkJCWlzUHNldWRvc3RhdGVJbml0aWFsT3JTdGF0ZVN0YXJ0KCkpCisJCQkJJiYgKG5vdCAoaXRFeGVjKS0+aGFzQmFja3dhcmRSZWFjaGFibGVNYWNoaW5lKCkpICkKKwkJCXsKKwkJCQkoaXRFeGVjKS0+c2V0UmVhY2hhYmxlU3RhdGUoIGZhbHNlICk7CisJCQl9CisJCX0KKwl9CisKKworCisJLy8JQWZmaWNoYWdlIGR1IHLDqXN1bHRhdCBkYW5zIGxlIGZpY2hpZXIgdHJhY2UKKwkvLworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBDT05GSUdVUklORyApCisKKwlBVk1fT1NfVFJBQ0UgPDwgQVZNX1RBQjFfSU5ERU5UOworCisJZm9yKCBpdEV4ZWMgPSBleGVjdXRhYmxlcy5iZWdpbigpIDsgaXRFeGVjICE9IGVuZEV4ZWMgOyArK2l0RXhlYyApCisJeworCQlpZiggKGl0RXhlYyktPmhhc1Byb3RvdHlwZUluc3RhbmNlKCkgKQorCQl7CisJCQlBVk1fT1NfVFJBQ0UgPDwgIlN0YXRlbWFjaGluZSBSZWFjaGFiaWxpdHk6PiAiCisJCQkJCSJjb21wdXRlIGJhY2t3YXJkIHJlYWNoYWJsZSBzdGF0ZS90cmFuc2l0aW9uIgorCQkJCQk8PCBzdGQ6OmVuZGwKKwkJCQkJPDwgVEFCIDw8ICJzdGF0ZSA6PiAiCisJCQkJCTw8IChpdEV4ZWMpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQkJCTw8IHN0ZDo6ZW5kbAorCQkJCQk8PCAibmIgYmFja3dhcmQgc3RhdGVzIDo+ICIKKwkJCQkJPDwgKGl0RXhlYyktPmdldEJhY2t3YXJkUmVhY2hhYmxlTWFjaGluZSgpLnNpemUoKQorCQkJCQk8PCBzdGQ6OmVuZGwKKwkJCQkJPDwgIm5iIGJhY2t3YXJkIHRyYW5zaXRpb25zIDo+ICIKKwkJCQkJPDwgKGl0RXhlYyktPmdldEJhY2t3YXJkUmVhY2hhYmxlVHJhbnNpdGlvbigpLnNpemUoKQorCQkJCQk8PCBzdGQ6OmVuZGw7CisKKwlBVk1fSUZfREVCVUdfTEVWRUxfR1RFX0hJR0gKKwkJCUxpc3RPZkluc3RhbmNlT2ZNYWNoaW5lOjppdGVyYXRvciBpdFN0YXRlID0KKwkJCQkJKGl0RXhlYyktPmdldEJhY2t3YXJkUmVhY2hhYmxlTWFjaGluZSgpLmJlZ2luKCk7CisJCQlMaXN0T2ZJbnN0YW5jZU9mTWFjaGluZTo6aXRlcmF0b3IgZW5kU3RhdGUgPQorCQkJCQkoaXRFeGVjKS0+Z2V0QmFja3dhcmRSZWFjaGFibGVNYWNoaW5lKCkuZW5kKCk7CisJCQlmb3IoIDsgaXRTdGF0ZSAhPSBlbmRTdGF0ZSA7ICsraXRTdGF0ZSApCisJCQl7CisJCQkJQVZNX09TX1RSQUNFIDw8IFRBQjIgPDwgImJhY2t3YXJkIHN0YXRlIDo+ICIKKwkJCQkJCTw8ICgqIGl0U3RhdGUpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQkJCQk8PCBzdGQ6OmVuZGw7CisJCQl9CisJQVZNX0VORElGX0RFQlVHX0xFVkVMX0dURV9ISUdICisKKwlBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFRSQU5TSVRJT04gKQorCQkJTGlzdE9mQXZtVHJhbnNpdGlvbjo6aXRlcmF0b3IgaXRUcmFuc2l0aW9uID0KKwkJCQkJKGl0RXhlYyktPmdldEJhY2t3YXJkUmVhY2hhYmxlVHJhbnNpdGlvbigpLmJlZ2luKCk7CisJCQlMaXN0T2ZBdm1UcmFuc2l0aW9uOjppdGVyYXRvciBlbmRUcmFuc2l0aW9uID0KKwkJCQkJKGl0RXhlYyktPmdldEJhY2t3YXJkUmVhY2hhYmxlVHJhbnNpdGlvbigpLmVuZCgpOworCQkJZm9yKCA7IGl0VHJhbnNpdGlvbiAhPSBlbmRUcmFuc2l0aW9uIDsgKytpdFRyYW5zaXRpb24gKQorCQkJeworCQkJCUFWTV9PU19UUkFDRSA8PCBUQUIyIDw8ICJiYWNrd2FyZCB0cmFuc2l0aW9uIDo+ICIKKwkJCQkJCTw8ICgqIGl0VHJhbnNpdGlvbiktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKwkJCQkJCTw8IHN0ZDo6ZW5kbDsKKwkJCX0KKwlBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFRSQU5TSVRJT04gKQorCQl9CisJfQorCisJQVZNX09TX1RSQUNFIDw8IEVORF9JTkRFTlQ7CisKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgQ09ORklHVVJJTkcgKQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKwordm9pZCBTdGF0ZW1hY2hpbmVSZWFjaGFiaWxpdHk6OmNvbXB1dGVCYWNrd2FyZFJlYWNoYWJsZUNvbXBvbmVudCgKKwkJY29uc3QgQ29uZmlndXJhdGlvbiAmIGFDb25maWd1cmF0aW9uLCBFeGVjdXRhYmxlRm9ybSAqIGFTdGF0ZSwKKwkJTGlzdE9mRXhlY3V0YWJsZUZvcm0gJiBhTGlzdE9mVHJlYXRlZFN0YXRlcywKKwkJYXZtX3NpemVfdCB0aGVDdXJyZW50QmFja3dhcmREZXB0aCkKK3sKKworLy9BVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKy8vCUFWTV9PU19UUkFDRSA8PCAiXHQiIDw8ICJzdGF0ZSA6PiAiIDw8IGFTdGF0ZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorLy8JCQk8PCBzdGQ6OmVuZGw7CisvL0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCisJQXZtVHJhbnNpdGlvbiAqIGFDb21waWxlZFRyYW5zaXRpb247CisJRXhlY3V0YWJsZUZvcm0gKiBhU291cmNlU3RhdGU7CisJRXhlY3V0YWJsZUZvcm0gKiBhQ29udGFpbmVyU3RhdGU7CisKKwljb25zdCBNYWNoaW5lICogYU1hY2hpbmUgPSBhU3RhdGUtPmdldEFzdE1hY2hpbmUoKTsKKwlpZiggYU1hY2hpbmUtPmhhc0luY29taW5nVHJhbnNpdGlvbigpICkKKwl7CisJCUV4ZWN1dGFibGVRdWVyeSBYUXVlcnkoIGFDb25maWd1cmF0aW9uICk7CisKKwkJdGhlQ3VycmVudEJhY2t3YXJkRGVwdGggKz0gMTsKKworCQkvLyBQb3VyIGNoYXF1ZSB0cmFuc2l0aW9uIGVudHJhbnRlCisJCUJlaGF2aW9yYWxQYXJ0Ojpjb25zdF90cmFuc2l0aW9uX2l0ZXJhdG9yIGl0VHJhbnNpdGlvbiA9CisJCQkJYU1hY2hpbmUtPmdldEJlaGF2aW9yKCktPmluY29taW5nX3RyYW5zaXRpb25fYmVnaW4oKTsKKwkJQmVoYXZpb3JhbFBhcnQ6OmNvbnN0X3RyYW5zaXRpb25faXRlcmF0b3IgZW5kVHJhbnNpdGlvbiA9CisJCQkJYU1hY2hpbmUtPmdldEJlaGF2aW9yKCktPmluY29taW5nX3RyYW5zaXRpb25fZW5kKCk7CisJCWZvciggOyBpdFRyYW5zaXRpb24gIT0gZW5kVHJhbnNpdGlvbiA7ICsraXRUcmFuc2l0aW9uICkKKwkJeworCQkJYUNvbXBpbGVkVHJhbnNpdGlvbiA9IFhRdWVyeS5nZXRUcmFuc2l0aW9uQnlBc3RFbGVtZW50KAorCQkJCQkoaXRUcmFuc2l0aW9uKSApLnRvX3B0cjwgQXZtVHJhbnNpdGlvbiA+KCk7CisJCQlhU291cmNlU3RhdGUgPSBhQ29tcGlsZWRUcmFuc2l0aW9uLT5nZXRFeGVjdXRhYmxlQ29udGFpbmVyKCk7CisKKwkJCWlmKCBhU291cmNlU3RhdGUtPmdldFNwZWNpZmllcigpLgorCQkJCQlpc1BzZXVkb3N0YXRlSW5pdGlhbE9yU3RhdGVTdGFydCgpICkKKwkJCXsKKwkJCQlhQ29udGFpbmVyU3RhdGUgPSBhU291cmNlU3RhdGUtPmdldEV4ZWN1dGFibGVDb250YWluZXIoKTsKKwkJCQlpZiggbm90IGFMaXN0T2ZUcmVhdGVkU3RhdGVzLmNvbnRhaW5zKCBhQ29udGFpbmVyU3RhdGUgKSApCisJCQkJeworCQkJCQlhTGlzdE9mVHJlYXRlZFN0YXRlcy5hcHBlbmQoIGFDb250YWluZXJTdGF0ZSApOworCQkJCQlpZiggbUJhY2t3YXJkQW5hbHlzaXNMb29rYWhlYWREZXB0aCA+IHRoZUN1cnJlbnRCYWNrd2FyZERlcHRoICkKKwkJCQkJeworCQkJCQkJY29tcHV0ZUJhY2t3YXJkUmVhY2hhYmxlQ29tcG9uZW50KAorCQkJCQkJCQlhQ29uZmlndXJhdGlvbiwgYUNvbnRhaW5lclN0YXRlLAorCQkJCQkJCQlhTGlzdE9mVHJlYXRlZFN0YXRlcywgdGhlQ3VycmVudEJhY2t3YXJkRGVwdGggKTsKKwkJCQkJfQorCisvL0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorLy8JQVZNX09TX1RSQUNFIDw8ICJcdCIgPDwgImFDb250YWluZXJTdGF0ZSA6PiAiCisvLwkJCTw8IGFDb250YWluZXJTdGF0ZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCBzdGQ6OmVuZGw7CisvL0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCisJCQkJfQorCQkJCWFTdGF0ZS0+YWRkQmFja3dhcmRSZWFjaGFibGVUcmFuc2l0aW9uKAorCQkJCQkJYUNvbnRhaW5lclN0YXRlLT5nZXRCYWNrd2FyZFJlYWNoYWJsZVRyYW5zaXRpb24oKSApOworCQkJCWFTdGF0ZS0+YWRkQmFja3dhcmRSZWFjaGFibGVNYWNoaW5lKAorCQkJCQkJYUNvbnRhaW5lclN0YXRlLT5nZXRCYWNrd2FyZFJlYWNoYWJsZU1hY2hpbmUoKSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmKCBub3QgYUxpc3RPZlRyZWF0ZWRTdGF0ZXMuY29udGFpbnMoIGFTb3VyY2VTdGF0ZSApICkKKwkJCQl7CisJCQkJCWFMaXN0T2ZUcmVhdGVkU3RhdGVzLmFwcGVuZCggYVNvdXJjZVN0YXRlICk7CisJCQkJCWlmKCBtQmFja3dhcmRBbmFseXNpc0xvb2thaGVhZERlcHRoID4gdGhlQ3VycmVudEJhY2t3YXJkRGVwdGggKQorCQkJCQl7CisJCQkJCQljb21wdXRlQmFja3dhcmRSZWFjaGFibGVDb21wb25lbnQoCisJCQkJCQkJCWFDb25maWd1cmF0aW9uLCBhU291cmNlU3RhdGUsCisJCQkJCQkJCWFMaXN0T2ZUcmVhdGVkU3RhdGVzLCB0aGVDdXJyZW50QmFja3dhcmREZXB0aCApOworCQkJCQl9CisKKy8vQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisvLwlBVk1fT1NfVFJBQ0UgPDwgIlx0IiA8PCAiYVNvdXJjZVN0YXRlIDo+ICIKKy8vCQkJPDwgYVNvdXJjZVN0YXRlLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbDsKKy8vQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisKKwkJCQl9CisJCQkJYVN0YXRlLT5hZGRCYWNrd2FyZFJlYWNoYWJsZVRyYW5zaXRpb24oCisJCQkJCQlhU291cmNlU3RhdGUtPmdldEJhY2t3YXJkUmVhY2hhYmxlVHJhbnNpdGlvbigpICk7CisJCQkJYVN0YXRlLT5hZGRCYWNrd2FyZFJlYWNoYWJsZU1hY2hpbmUoCisJCQkJCQlhU291cmNlU3RhdGUtPmdldEJhY2t3YXJkUmVhY2hhYmxlTWFjaGluZSgpICk7CisJCQl9CisJCX0KKwl9Cit9CisKKworLyoqCisgKiBGb3J3YXJkIFJlYWNoYWJpbGl0eSBBbmFseXNpcworICovCitib29sIFN0YXRlbWFjaGluZVJlYWNoYWJpbGl0eTo6Y29tcHV0ZUZvcndhcmRSZWFjaGFibGVDb21wb25lbnQoCisJCWNvbnN0IENvbmZpZ3VyYXRpb24gJiBhQ29uZmlndXJhdGlvbikKK3sKKwljb25zdCBUYWJsZU9mRXhlY3V0YWJsZUZvcm0gJiBleGVjdXRhYmxlcyA9CisJCQlhQ29uZmlndXJhdGlvbi5nZXRFeGVjdXRhYmxlU3lzdGVtKCkuZ2V0RXhlY3V0YWJsZXMoKTsKKworCUxpc3RPZkluc3RhbmNlT2ZNYWNoaW5lOjppdGVyYXRvciBpdE1hY2hpbmU7CisJTGlzdE9mSW5zdGFuY2VPZk1hY2hpbmU6Oml0ZXJhdG9yIGVuZE1hY2hpbmU7CisKKwlUYWJsZU9mRXhlY3V0YWJsZUZvcm06OmNvbnN0X3Jhd19pdGVyYXRvciBpdEV4ZWMgPSBleGVjdXRhYmxlcy5iZWdpbigpOworCVRhYmxlT2ZFeGVjdXRhYmxlRm9ybTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGVuZEV4ZWMgPSBleGVjdXRhYmxlcy5lbmQoKTsKKwlmb3IoIDsgaXRFeGVjICE9IGVuZEV4ZWMgOyArK2l0RXhlYyApCisJeworCQlpZiggKGl0RXhlYyktPmdldFNwZWNpZmllcigpLgorCQkJCWlzUHNldWRvc3RhdGVJbml0aWFsT3JTdGF0ZVN0YXJ0KCkgKQorCQl7CisJCQlMaXN0T2ZFeGVjdXRhYmxlRm9ybSBhVHJhY2VNYWNoaW5lKCAoaXRFeGVjKSApOworCisJCQljb21wdXRlRm9yd2FyZFJlYWNoYWJsZUNvbXBvbmVudCgKKwkJCQkJKGl0RXhlYyksIGFUcmFjZU1hY2hpbmUsIChpdEV4ZWMpKTsKKworCQkJaXRNYWNoaW5lID0gKGl0RXhlYyktPmdldEZvcndhcmRSZWFjaGFibGVNYWNoaW5lKCkuYmVnaW4oKTsKKwkJCWVuZE1hY2hpbmUgPSAoaXRFeGVjKS0+Z2V0Rm9yd2FyZFJlYWNoYWJsZU1hY2hpbmUoKS5lbmQoKTsKKwkJCWZvciggOyBpdE1hY2hpbmUgIT0gZW5kTWFjaGluZSA7ICsraXRNYWNoaW5lICkKKwkJCXsKKwkJCQlpZiggKCppdE1hY2hpbmUpICE9IE5VTEwgKQorCQkJCXsKKwkJCQkJTGlzdE9mRXhlY3V0YWJsZUZvcm0gbmV3VHJhY2VNYWNoaW5lKAorCQkJCQkJCSgqaXRNYWNoaW5lKS0+Z2V0RXhlY3V0YWJsZSgpICk7CisKKwkJCQkJY29tcHV0ZUZvcndhcmRSZWFjaGFibGVDb21wb25lbnQoCisJCQkJCQkJKCppdE1hY2hpbmUpLT5nZXRFeGVjdXRhYmxlKCksCisJCQkJCQkJbmV3VHJhY2VNYWNoaW5lLCAoKml0TWFjaGluZSktPmdldEV4ZWN1dGFibGUoKSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJZm9yKCBpdEV4ZWMgPSBleGVjdXRhYmxlcy5iZWdpbigpIDsgaXRFeGVjICE9IGVuZEV4ZWMgOyArK2l0RXhlYyApCisJeworCQlpZiggKGl0RXhlYyktPmdldEZvcndhcmRSZWFjaGFibGVNYWNoaW5lKCkubm9uZW1wdHkoKSAmJgorCQkJCShpdEV4ZWMpLT5oYXNQcm90b3R5cGVJbnN0YW5jZSgpICApCisJCXsKKwkJCShpdEV4ZWMpLT5yZW1vdmVGb3J3YXJkUmVhY2hhYmxlTWFjaGluZSgKKwkJCQkJKGl0RXhlYyktPmdldFByb3RvdHlwZUluc3RhbmNlKCkgKTsKKwkJfQorCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKK3ZvaWQgU3RhdGVtYWNoaW5lUmVhY2hhYmlsaXR5Ojpjb21wdXRlRm9yd2FyZFJlYWNoYWJsZUNvbXBvbmVudCgKKwkJRXhlY3V0YWJsZUZvcm0gKiBleGVjTWFjaGluZSwKKwkJTGlzdE9mRXhlY3V0YWJsZUZvcm0gJiBhVHJhY2VNYWNoaW5lLCBFeGVjdXRhYmxlRm9ybSAqIGZ3ZE1hY2hpbmUpCit7CisJTGlzdE9mQXZtVHJhbnNpdGlvbiBsaXN0T2ZPdXRnb2luZ1RyYW5zaXRpb247CisJZndkTWFjaGluZS0+Z2V0T3V0Z29pbmdUcmFuc2l0aW9uKCBsaXN0T2ZPdXRnb2luZ1RyYW5zaXRpb24gKTsKKworCUxpc3RPZkluc3RhbmNlT2ZNYWNoaW5lIGxpc3RPZk91dGdvaW5nTWFjaGluZTsKKwlmd2RNYWNoaW5lLT5nZXRPdXRnb2luZ01hY2hpbmUoIGxpc3RPZk91dGdvaW5nTWFjaGluZSApOworCisJZXhlY01hY2hpbmUtPmFkZEZvcndhcmRSZWFjaGFibGVNYWNoaW5lKGxpc3RPZk91dGdvaW5nTWFjaGluZSk7CisKKwlleGVjTWFjaGluZS0+YWRkRm9yd2FyZFJlYWNoYWJsZVRyYW5zaXRpb24obGlzdE9mT3V0Z29pbmdUcmFuc2l0aW9uKTsKKworCUxpc3RPZkluc3RhbmNlT2ZNYWNoaW5lOjppdGVyYXRvciBpdE91dGdvaW5nID0gbGlzdE9mT3V0Z29pbmdNYWNoaW5lLmJlZ2luKCk7CisJTGlzdE9mSW5zdGFuY2VPZk1hY2hpbmU6Oml0ZXJhdG9yIGVuZE91dGdvaW5nID0gbGlzdE9mT3V0Z29pbmdNYWNoaW5lLmVuZCgpOworCWZvciggOyBpdE91dGdvaW5nICE9IGVuZE91dGdvaW5nIDsgKytpdE91dGdvaW5nICkKKwl7CisJCWlmKCBub3QgYVRyYWNlTWFjaGluZS5jb250YWlucyggKCppdE91dGdvaW5nKS0+Z2V0RXhlY3V0YWJsZSgpICkgKQorCQl7CisJCQlMaXN0T2ZFeGVjdXRhYmxlRm9ybSBuZXdUcmFjZU1hY2hpbmUoIGFUcmFjZU1hY2hpbmUgKTsKKworCQkJbmV3VHJhY2VNYWNoaW5lLmFwcGVuZCggKCppdE91dGdvaW5nKS0+Z2V0RXhlY3V0YWJsZSgpICk7CisKKwkJCWNvbXB1dGVGb3J3YXJkUmVhY2hhYmxlQ29tcG9uZW50KGV4ZWNNYWNoaW5lLAorCQkJCQluZXdUcmFjZU1hY2hpbmUsICgqaXRPdXRnb2luZyktPmdldEV4ZWN1dGFibGUoKSk7CisJCX0KKwl9Cit9CisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2NvdmVyYWdlL1N0YXRlbWFjaGluZVJlYWNoYWJpbGl0eS5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2NvdmVyYWdlL1N0YXRlbWFjaGluZVJlYWNoYWJpbGl0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZDg0NjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vY292ZXJhZ2UvU3RhdGVtYWNoaW5lUmVhY2hhYmlsaXR5LmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxNiBqdWlsLiAyMDEzCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgU1RBVEVNQUNISU5FUkVBQ0hBQklMSVRZX0hfCisjZGVmaW5lIFNUQVRFTUFDSElORVJFQUNIQUJJTElUWV9IXworCisjaW5jbHVkZSA8Y29sbGVjdGlvbi9UeXBlZGVmLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIEF2bVByb2dyYW07CitjbGFzcyBCYXNlQ292ZXJhZ2VGaWx0ZXI7CitjbGFzcyBDb25maWd1cmF0aW9uOworY2xhc3MgSW5zdGFuY2VPZk1hY2hpbmU7CisKKworY2xhc3MgU3RhdGVtYWNoaW5lUmVhY2hhYmlsaXR5Cit7CisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBBVFRSSUJVVEVTCisJICovCisJQmFzZUNvdmVyYWdlRmlsdGVyICYgbUNvdmVyYWdlRmlsdGVyOworCisJYXZtX3NpemVfdCBtQmFja3dhcmRBbmFseXNpc0xvb2thaGVhZERlcHRoOworCWF2bV9zaXplX3QgbUZvcndhcmRBbmFseXNpc0xvb2thaGVhZERlcHRoOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlTdGF0ZW1hY2hpbmVSZWFjaGFiaWxpdHkoQmFzZUNvdmVyYWdlRmlsdGVyICYgYUNvdmVyYWdlRmlsdGVyKQorCTogbUNvdmVyYWdlRmlsdGVyKCBhQ292ZXJhZ2VGaWx0ZXIgKSwKKwltQmFja3dhcmRBbmFseXNpc0xvb2thaGVhZERlcHRoKCBBVk1fTlVNRVJJQ19NQVhfU0laRV9UICksCisJbUZvcndhcmRBbmFseXNpc0xvb2thaGVhZERlcHRoICggQVZNX05VTUVSSUNfTUFYX1NJWkVfVCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+U3RhdGVtYWNoaW5lUmVhY2hhYmlsaXR5KCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogUmVhY2hhYmlsaXR5IEFuYWx5c2lzCisJICovCisJaW5saW5lIGJvb2wgY29tcHV0ZVJlYWNoYWJsZUNvbXBvbmVudCgKKwkJCWNvbnN0IENvbmZpZ3VyYXRpb24gJiBhQ29uZmlndXJhdGlvbiwKKwkJCWF2bV9zaXplX3QgYUJhY2t3YXJkQW5hbHlzaXNMb29rYWhlYWREZXB0aCkKKwl7CisJCW1CYWNrd2FyZEFuYWx5c2lzTG9va2FoZWFkRGVwdGggPSBhQmFja3dhcmRBbmFseXNpc0xvb2thaGVhZERlcHRoOworCisJCWJvb2wgaXNPSyA9IGNvbXB1dGVCYWNrd2FyZFJlYWNoYWJsZUNvbXBvbmVudCggYUNvbmZpZ3VyYXRpb24gKTsKKworCQlyZXR1cm4oIGNvbXB1dGVGb3J3YXJkUmVhY2hhYmxlQ29tcG9uZW50KGFDb25maWd1cmF0aW9uKSB8fCBpc09LICk7CisJfQorCisKKwkvKioKKwkgKiBCYWNrd2FyZCBSZWFjaGFiaWxpdHkgQW5hbHlzaXMKKwkgKi8KKwlib29sIGNvbXB1dGVCYWNrd2FyZFJlYWNoYWJsZUNvbXBvbmVudChjb25zdCBDb25maWd1cmF0aW9uICYgYUNvbmZpZ3VyYXRpb24pOworCisJdm9pZCBjb21wdXRlQmFja3dhcmRSZWFjaGFibGVDb21wb25lbnQoCisJCQljb25zdCBDb25maWd1cmF0aW9uICYgYUNvbmZpZ3VyYXRpb24sIEV4ZWN1dGFibGVGb3JtICogYVN0YXRlLAorCQkJTGlzdE9mRXhlY3V0YWJsZUZvcm0gJiBhTGlzdE9mVHJlYXRlZFN0YXRlcywKKwkJCWF2bV9zaXplX3QgdGhlQ3VyZW50QmFja3dhcmREZXB0aCk7CisKKworCS8qKgorCSAqIEZvcndhcmQgUmVhY2hhYmlsaXR5IEFuYWx5c2lzCisJICovCisJYm9vbCBjb21wdXRlRm9yd2FyZFJlYWNoYWJsZUNvbXBvbmVudChjb25zdCBDb25maWd1cmF0aW9uICYgYUNvbmZpZ3VyYXRpb24pOworCisJdm9pZCBjb21wdXRlRm9yd2FyZFJlYWNoYWJsZUNvbXBvbmVudChFeGVjdXRhYmxlRm9ybSAqIGV4ZWNNYWNoaW5lLAorCQkJTGlzdE9mRXhlY3V0YWJsZUZvcm0gJiBhVHJhY2VNYWNoaW5lLCBFeGVjdXRhYmxlRm9ybSAqIGZ3ZE1hY2hpbmUpOworCit9OworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKyNlbmRpZiAvKiBTVEFURU1BQ0hJTkVSRUFDSEFCSUxJVFlfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9jb3ZlcmFnZS9UcmFuc2l0aW9uQ292ZXJhZ2VGaWx0ZXIuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2NvdmVyYWdlL1RyYW5zaXRpb25Db3ZlcmFnZUZpbHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNjMTU2OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9jb3ZlcmFnZS9UcmFuc2l0aW9uQ292ZXJhZ2VGaWx0ZXIuY3BwCkBAIC0wLDAgKzEsMzA1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDI1IGp1aWwuIDIwMDgKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogIEFsYWluIEZhaXZyZSAoQ0VBIExJU1QpIGFsYWluLmZhaXZyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJUcmFuc2l0aW9uQ292ZXJhZ2VGaWx0ZXIuaCIKKworI2luY2x1ZGUgPGNvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1Db21tdW5pY2F0aW9uRmFjdG9yeS5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZUZvcm0uaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlUXVlcnkuaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mTWFjaGluZS5oPgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkNvbnN0cnVjdG9yLmg+CisKKyNpbmNsdWRlIDxmbWwvY29tbW9uL1NwZWNpZmllckVsZW1lbnQuaD4KKworCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uQ29uZmlndXJhdGlvbi5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkRhdGEuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lRm9ybS5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL1J1bnRpbWVJRC5oPgorCisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1F1ZXJ5Lmg+CisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1dPYmplY3QuaD4KKworI2luY2x1ZGUgPGZhbS9xdWV1ZS9XYWl0aW5nU3RyYXRlZ3kuaD4KKyNpbmNsdWRlIDxmYW0vcXVldWUvRXhlY3V0aW9uUXVldWUuaD4KKworI2luY2x1ZGUgPHNldy9Db25maWd1cmF0aW9uLmg+CisjaW5jbHVkZSA8c2V3L1N5bWJleENvbnRyb2xsZXJSZXF1ZXN0TWFuYWdlci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3Byb3RvdHlwZSBmaWx0ZXI6OnRyYW5zaXRpb25fY292ZXJhZ2UgYXMgJmF2bTo6Y29yZS5maWx0ZXIuUFJPR1JBTV9DT1ZFUkFHRSBpcworCXNlY3Rpb24gUFJPUEVSVFkKKwkJLy8gTm9tYnJlIGRlIHBhcyBkZSBjYWxjdWwgImN1bXVsw6lzIiBhdmFudCBkZSBkw6lidXRlcgorCQkvLyBsYSB2w6lyaWZpY2F0aW9uIGRlIGxhIGNvdXZlcnR1cmUKKwkJQGJlZ2luX3N0ZXAgPSAwOworCisJCS8vIEFycsOodGUgbCdleMOpY3V0aW9uIGTDqHMgcXVlIGxhIGNvdXZlcnR1cmUgZXN0IGNvbXBsw6h0ZQorCQlAc3RvcCA9IHRydWU7CisKKwkJLy8gQXJyw6h0ZSBsJ2V4w6ljdXRpb24gYXUgcGx1dMO0dAorCQlAbWluaW1pemUgPSB0cnVlOworCisJCS8vIEFycsOodGUgbCdleMOpY3V0aW9uIGR1IGNoZW1pbiBjb3VyYW50IGTDqHMgcXUndW4gb2JqZWN0aWYgZXN0IGF0dGVpbnQKKwkJQGJyZWFrID0gdHJ1ZTsKKworCQkvLyBFbGFnYWdlIGR1IGdyYXBoZSBkZXMgc2PDqW5hcmlvcyDDoCBsYSBmaW4gZGUgbGEgdsOpcmlmaWNhdGlvbgorCQlAc2xpY2UgPSB0cnVlOworCisJCS8vIEFjdGl2ZSBsJ3V0aWxpc2F0aW9uIGQnaGV1cmlzdGlxdWUKKwkJQGhldXJpc3RpYyA9IHRydWU7CisKKwkJLy8gY2hvaXggZGUgbCdoZXVyaXN0aXF1ZSBkZSBkw6lwYXJ0CisJCS8vIGJhc2ljIHwgbmFpdmUgfCBzbWFydCB8IGFncmVzc2l2ZQorCQlAaGV1cmlzdGljI3N0YXJ0ID0gJ2Jhc2ljJzsKKworCQkvLyBOb21icmUgZCdlc3NhaXMgZCdoZXVyaXN0aXF1ZXMKKwkJQGhldXJpc3RpYyN0cmlhbHMgPSA3OworCisJCS8vIENyaXTDqHJlIGRlIHNhdGlzZmFjdGlvbiBkdSBzdWNjw6hzIGRlcyBoZXVyaXN0aXF1ZXMKKwkJLy8gdGF1eCBkZSBjb3V2ZXJ0ZSAvIG5vbWJyZSBkJ8OpbMOpbWVudCByZXN0YW50Li4uCisJCUBvYmplY3RpdmUjcmF0ZSA9IDk1OworCQlAb2JqZWN0aXZlI3Jlc3QgPSA1OworCisKKwkJLy8gQ2hvaXggZGVzIGNvbnRleHRlcyBhdmVjIGRlcyB0cmFuc2l0aW9ucworCQkvLyBbIGZvcnRlbWVudCB8IGZhaWJsZW1lbnQgfCBhdXRyZSBdIHRpcmFibGVzCisKKwkJLy8gTGltaXRhdGlvbnMgdGVtcG9yYWlyZSBkZSBsYSBwcm9mb25kZXVyIGQnZXhwbG9yYXRpb24KKwkJQGNvdmVyYWdlI2hlaWdodCA9IDc7CisKKwkJLy8gbm9tYnJlIGRlIGZvaXMgcXVlIGxhIGxpbWl0ZSBkb2l0IMOqdHJlIGF0dGVpbnQgYXZhbnQgZGUgbCdhdWdtZW50ZXIKKwkJQGNvdmVyYWdlI2hlaWdodCNyZWFjaGVkI2xpbWl0ID0gNDI7CisKKwkJQGhpdCNzdHJvbmdseSNyYW5kb20gPSBmYWxzZTsKKwkJQGhpdCNzdHJvbmdseSNjb3VudCA9IDE7CisKKwkJQGhpdCN3ZWFrbHkjcmFuZG9tID0gZmFsc2U7CisJCUBoaXQjd2Vha2x5I2NvdW50ID0gMTsKKworCQlAaGl0I290aGVyI3JhbmRvbSA9IGZhbHNlOworCQlAaGl0I290aGVyI2NvdW50ID0gMTsKKworCQlAc2NvcGUgPSAnREVUQUlMUyc7IAkvLyAnSU5TVEFOQ0UnIHwgJ0ZPUk0nIHwgJ0RFVEFJTFMnCisJZW5kc2VjdGlvbiBQUk9QRVJUWQorCisJLy8gVXRpbGlzw6kgcG91ciBwcsOpY2lzZXIgbGVzIG1hY2hpbmVzIG91IGxlcyB0cmFuc2l0aW9ucyBwYXJ0aWN1bGnDqHJlcyDDoCBjb3V2cmlyIQorCXNlY3Rpb24gREVUQUlMUworCQlAZm9ybSA9IHNwZWM6OmFzY2Vuc2V1ci5hc2NlbnNldXIuY29udHJvbGVyOworCQlAaW5zdGFuY2UgPSBzcGVjOjphc2NlbnNldXIuYXNjZW5zZXVyLmVucmVnaXN0cmVyOworCisJCUB0cmFuc2l0aW9uID0gc3BlYzo6YXNjZW5zZXVyLmFzY2Vuc2V1ci5hbGxlcl9hX2xfZXRhZ2UuYXR0ZW50ZS50cmFuc2l0aW9uIzY7CisJZW5kc2VjdGlvbiBERVRBSUxTCitlbmRwcm90b3R5cGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisKKy8qKgorICogREVTVFJVQ1RPUgorICovCitUcmFuc2l0aW9uQ292ZXJhZ2VGaWx0ZXI6On5UcmFuc2l0aW9uQ292ZXJhZ2VGaWx0ZXIoKQoreworCWlmKCBtRXhlY3V0YWJsZUNvdmVyYWdlVGFibGUgIT0gTlVMTCApCisJeworCQljb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCA9IGdldENvbmZpZ3VyYXRpb24oKS5nZXRNYWluRXhlY3V0aW9uRGF0YSgpOworCisJCWF2bV9zaXplX3QgZW5kT2Zmc2V0ID0gbVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlLT5zaXplKCk7CisJCWZvciggYXZtX3NpemVfdCBpID0gMCA7IGkgPCBlbmRPZmZzZXQgOyArK2kgKQorCQl7CisJCQlpZiggbVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlLT5hdChpKSAhPSBtRXhlY3V0YWJsZUNvdmVyYWdlVGFibGUtPgorCQkJCQlhdChhbkVELmdldFJ1bnRpbWUoaSkuZ2V0RXhlY3V0YWJsZSgpLT5nZXRPZmZzZXQoKSkgKQorCQkJeworCQkJCWRlbGV0ZSggbVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlLT5hdChpKSApOworCQkJfQorCQl9CisKKwkJZGVsZXRlKCBtVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUgKTsKKworCQllbmRPZmZzZXQgPSBtRXhlY3V0YWJsZUNvdmVyYWdlVGFibGUtPnNpemUoKTsKKwkJZm9yKCBhdm1fc2l6ZV90IGkgPSAwIDsgaSA8IGVuZE9mZnNldCA7ICsraSApCisJCXsKKwkJCWlmKCBtRXhlY3V0YWJsZUNvdmVyYWdlVGFibGUtPmF0KGkpICE9IE5VTEwgKQorCQkJeworCQkJCWRlbGV0ZSggbUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlLT5hdChpKSApOworCQkJfQorCQl9CisKKwkJZGVsZXRlKCBtRXhlY3V0YWJsZUNvdmVyYWdlVGFibGUgKTsKKwl9CisKKwllbHNlIGlmKCBtVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUgIT0gTlVMTCApCisJeworCQlhdm1fc2l6ZV90IGVuZE9mZnNldCA9IG1UcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZS0+c2l6ZSgpOworCQlmb3IoIGF2bV9zaXplX3QgaSA9IDAgOyBpIDwgZW5kT2Zmc2V0IDsgKytpICkKKwkJeworCQkJaWYoIG1UcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZS0+YXQoaSkgIT0gTlVMTCApCisJCQl7CisJCQkJZGVsZXRlKCBtVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUtPmF0KGkpICk7CisJCQl9CisJCX0KKworCQlkZWxldGUoIG1UcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZSApOworCX0KK30KKworCisvKioKKyAqIENPTkZJR1VSRQorICovCisKK2Jvb2wgVHJhbnNpdGlvbkNvdmVyYWdlRmlsdGVyOjpjb25maWd1cmVJbXBsKCkKK3sKKwkvLyBTVVBFUiBDT05GSUdVUkFUSU9OCisJbUNvbmZpZ0ZsYWcgPSBCYXNlQ292ZXJhZ2VGaWx0ZXI6OmNvbmZpZ3VyZUltcGwoKTsKKworCVdPYmplY3QgKiB0aGVQUk9QRVJUWSA9IFF1ZXJ5OjpnZXRSZWdleFdTZXF1ZW5jZSgKKwkJCWdldFBhcmFtZXRlcldPYmplY3QoKSwgT1JfV0lEMigicHJvcGVydHkiLCAiUFJPUEVSVFkiKSk7CisKKwlpZiggdGhlUFJPUEVSVFkgIT0gV09iamVjdDo6X05VTExfICkKKwl7CisJCW1OYkNvdmVyYWdlID0gUXVlcnk6OmdldFdQcm9wZXJ0eVBvc1NpemVUKAorCQkJCXRoZVBST1BFUlRZLCAibmJDb3ZlcmFnZSIsIEFWTV9OVU1FUklDX01BWF9TSVpFX1QpOworCisJCW1Db3ZlcmFnZUhlaWdodCA9IG1Db3ZlcmFnZUhlaWdodFBlcmlvZCA9CisJCQkJUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5U2l6ZVQoCisJCQkJCQl0aGVQUk9QRVJUWSwgQ09OU19XSUQyKCJjb3ZlcmFnZSIsICJoZWlnaHQiKSwgMCk7CisKKwkJbUNvdmVyYWdlSGVpZ2h0UmVhY2hlZExpbWl0ID0gUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5U2l6ZVQodGhlUFJPUEVSVFksCisJCQlDT05TX1dJRDQoImNvdmVyYWdlIiwgImhlaWdodCIsICJyZWFjaGVkIiwgImxpbWl0IiksIDApOworCisJCS8vIE9wdGlvbnMgcG91ciBsZXMgdHJhbnNpdGlvbnMgZm9ydGVtZW50IHRpcmFibGVzCisJCW1IaXRTdHJvbmdseVJhbmRvbUZsYWcgPSBRdWVyeTo6Z2V0UmVnZXhXUHJvcGVydHlCb29sZWFuKAorCQkJCXRoZVBST1BFUlRZLCBDT05TX1dJRDMoImhpdCIsICJzdHJvbmdseSIsICJyYW5kb20iKSwgZmFsc2UpOworCisJCW1IaXRTdHJvbmdseUNvdW50ID0gUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5UG9zU2l6ZVQoCisJCQkJdGhlUFJPUEVSVFksIENPTlNfV0lEMygiaGl0IiwgInN0cm9uZ2x5IiwgImNvdW50IiksIDEpOworCisJCS8vIE9wdGlvbnMgcG91ciBsZXMgdHJhbnNpdGlvbnMgZmFpYmxlbWVudCB0aXJhYmxlcworCQltSGl0V2Vha2x5UmFuZG9tRmxhZyA9IFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eUJvb2xlYW4oCisJCQkJdGhlUFJPUEVSVFksIENPTlNfV0lEMygiaGl0IiwgIndlYWtseSIsICJyYW5kb20iKSwgZmFsc2UpOworCisJCW1IaXRXZWFrbHlDb3VudCA9IFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eVBvc1NpemVUKAorCQkJCXRoZVBST1BFUlRZLCBDT05TX1dJRDMoImhpdCIsICJ3ZWFrbHkiLCAiY291bnQiKSwgMSk7CisKKwkJLy8gT3B0aW9ucyBwb3VyIGxlcyBhdXRyZXMgdHJhbnNpdGlvbnMgdGlyYWJsZXMgPworCQltSGl0T3RoZXJSYW5kb21GbGFnID0gUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5Qm9vbGVhbigKKwkJCQl0aGVQUk9QRVJUWSwgQ09OU19XSUQzKCJoaXQiLCAib3RoZXIiLCAicmFuZG9tIiksIGZhbHNlKTsKKworCQltSGl0T3RoZXJDb3VudCA9IFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eVBvc1NpemVUKAorCQkJCXRoZVBST1BFUlRZLCBDT05TX1dJRDMoImhpdCIsICJvdGhlciIsICJjb3VudCIpLCAxKTsKKworCisJCWNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVEID0gZ2V0Q29uZmlndXJhdGlvbigpLmdldE1haW5FeGVjdXRpb25EYXRhKCk7CisKKwkJbVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlID0gbmV3IEFycmF5T2ZCaXRzZXQoCisJCQkJYW5FRC5nZXRUYWJsZU9mUnVudGltZSgpLnNpemUoKSwgTlVMTCk7CisKKwkJRXhlY3V0YWJsZVF1ZXJ5IFhRdWVyeSggZ2V0Q29uZmlndXJhdGlvbigpICk7CisKKwkJWFF1ZXJ5LmdldFJ1bnRpbWVFeGVjdXRhYmxlKCBtVGFibGVvZlJ1bnRpbWVFeGVjdXRhYmxlICk7CisKKwkJbVNjb3BlID0gU3BlY2lmaWVyOjp0b0Rlc2lnbktpbmQoCisJCQkJUXVlcnk6OmdldFdQcm9wZXJ0eVN0cmluZyh0aGVQUk9QRVJUWSwgInNjb3BlIiwgIk1PREVMIikgKTsKKworCQlzd2l0Y2goIG1TY29wZSApCisJCXsKKwkJCWNhc2UgU3BlY2lmaWVyOjpERVNJR05fSU5TVEFOQ0VfS0lORDoKKwkJCXsKKwkJCQkvLyBJTklUSUFMSVNBVElPTiBkZSBsYSB0YWJsZSBkZSB0b3VzIGxlcyBQUk9HUkFNCisJCQkJLy8gYXNzb2Npw6lzIMOgIGNoYWN1bmUgZGVzIElOU1RBTkNFLi4uCisJCQkJY29uZmlndXJlSW5zdGFuY2VDb3ZlcmFnZVRhYmxlRmxhZyhmYWxzZSk7CisKKwkJCQlicmVhazsKKwkJCX0KKworCQkJY2FzZSBTcGVjaWZpZXI6OkRFU0lHTl9NT0RFTF9LSU5EOgorCQkJeworCQkJCS8vIElOSVRJQUxJU0FUSU9OIGRlIGxhIHRhYmxlIGRlIHRvdXMgbGVzIFBST0dSQU0KKwkJCQkvLyBhc3NvY2nDqXMgw6AgY2hhY3VuZSBkZXMgRVhFQ1VUQUJMRS4uLgorCQkJCWNvbmZpZ3VyZUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlRmxhZyhmYWxzZSk7CisKKwkJCQlicmVhazsKKwkJCX0KKworCQkJZGVmYXVsdDogLy8gZm9yICA8PCBAc2NvcGUgPSAnREVUQUlMUyc7ID4+CisJCQl7CisJCQkJV09iamVjdCAqIHRoZURFVEFJTFMgPSBRdWVyeTo6Z2V0UmVnZXhXU2VxdWVuY2UoCisJCQkJCQlnZXRQYXJhbWV0ZXJXT2JqZWN0KCksIE9SX1dJRDIoImRldGFpbHMiLCAiREVUQUlMUyIpKTsKKworCQkJCWlmKCB0aGVERVRBSUxTICE9IFdPYmplY3Q6Ol9OVUxMXyApCisJCQkJeworCQkJCQlFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZSA9IE5VTEw7CisJCQkJCUF2bVRyYW5zaXRpb24gKiBhVHJhbnNpdGlvbiA9IE5VTEw7CisKKwkJCQkJTGlzdE9mRXhlY3V0YWJsZUZvcm0gbGlzdE9mRXhlY3V0YWJsZTsKKwkJCQkJTGlzdE9mSW5zdGFuY2VPZk1hY2hpbmUgbGlzdE9mSW5zdGFuY2U7CisJCQkJCUxpc3RPZkF2bVRyYW5zaXRpb24gbGlzdE9mVHJhbnNpdGlvbjsKKworCQkJCQlXT2JqZWN0Ojpjb25zdF9pdGVyYXRvciBpdFdmTyA9IHRoZURFVEFJTFMtPm93bmVkX2JlZ2luKCk7CisJCQkJCVdPYmplY3Q6OmNvbnN0X2l0ZXJhdG9yIGVuZFdmTyA9IHRoZURFVEFJTFMtPm93bmVkX2VuZCgpOworCQkJCQlmb3IoIDsgaXRXZk8gIT0gZW5kV2ZPIDsgKytpdFdmTyApCisJCQkJCXsKKwkJCQkJCWlmKCAoKml0V2ZPKS0+aXNXUHJvcGVydHkoKSApCisJCQkJCQl7CisJCQkJCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBraW5kID0gKCppdFdmTyktPmdldE5hbWVJRCgpOworCQkJCQkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgcW5pZCA9ICgqaXRXZk8pLT50b1N0cmluZ1ZhbHVlKCk7CisKKwkJCQkJCQlpZiggKGtpbmQgPT0gIm1vZGVsIikgfHwgKGtpbmQgPT0gImZvcm0iKSAgfHwKKwkJCQkJCQkJCShraW5kID09ICJleGVjdXRhYmxlIikgKQorCQkJCQkJCXsKKwkJCQkJCQkJYW5FeGVjdXRhYmxlID0KKwkJCQkJCQkJCVhRdWVyeS5nZXRFeGVjdXRhYmxlQnlRdWFsaWZpZWROYW1lSUQoCisJCQkJCQkJCQkJCXFuaWQgKS50b19wdHI8IEV4ZWN1dGFibGVGb3JtID4oKTsKKwkJCQkJCQkJaWYoIGFuRXhlY3V0YWJsZSAhPSBOVUxMICkKKwkJCQkJCQkJeworCQkJCQkJCQkJbGlzdE9mRXhlY3V0YWJsZS5hcHBlbmQoYW5FeGVjdXRhYmxlKTsKKwkJCQkJCQkJfQorCQkJCQkJCQllbHNlCisJCQkJCQkJCXsKKwkJCQkJCQkJCUFWTV9PU19XQVJOIDw8ICJVbmZvdW5kIHRoZSBtYWNoaW5lICIKKwkJCQkJCQkJCQk8PCBraW5kIDw8ICIgPDwgIiA8PCBxbmlkCisJCQkJCQkJCQkJPDwgIiA+PiBhcyBjb3ZlcmFnZSBwcm9jZXNzb3IgcGFyYW1ldGVyOj4gIgorCQkJCQkJCQkJCTw8IGdldFBhcmFtZXRlcldPYmplY3QoKQorCQkJCQkJCQkJCQkJLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQkJCQkJCQkJPDwgc3RkOjplbmRsOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCWVsc2UgaWYoIGtpbmQgPT0gImluc3RhbmNlIiApCisJCQkJCQkJeworCQkJCQkJCQljb25zdCBCRiAmIGFuSW5zdGFuY2UgPSBYUXVlcnkuc2VhcmNoTWFjaGluZSgKKwkJCQkJCQkJCQlTcGVjaWZpZXI6OkRFU0lHTl9JTlNUQU5DRV9LSU5ELCBxbmlkKTsKKwkJCQkJCQkJaWYoIGFuSW5zdGFuY2UudmFsaWQoKSApCisJCQkJCQkJCXsKKwkJCQkJCQkJCWxpc3RPZkluc3RhbmNlLmFwcGVuZCgKKwkJCQkJCQkJCQlhbkluc3RhbmNlLnRvX3B0cjwgSW5zdGFuY2VPZk1hY2hpbmUgPigpKTsKKwkJCQkJCQkJfQorCQkJCQkJCQllbHNlCisJCQkJCQkJCXsKKwkJCQkJCQkJCUFWTV9PU19XQVJOIDw8ICJVbmZvdW5kIHRoZSBtYWNoaW5lICIKKwkJCQkJCQkJCQk8PCBraW5kIDw8ICIgPDwgIiA8PCBxbmlkCisJCQkJCQkJCQkJPDwgIiA+PiBhcyBjb3ZlcmFnZSBwcm9jZXNzb3IgcGFyYW1ldGVyOj4gIgorCQkJCQkJCQkJCTw8IGdldFBhcmFtZXRlcldPYmplY3QoKQorCQkJCQkJCQkJCQkJLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQkJCQkJCQkJPDwgc3RkOjplbmRsOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCWVsc2UgaWYoIGtpbmQgPT0gInRyYW5zaXRpb24iICkKKwkJCQkJCQl7CisJCQkJCQkJCWFUcmFuc2l0aW9uID0KKwkJCQkJCQkJCVhRdWVyeS5nZXRUcmFuc2l0aW9uQnlRdWFsaWZpZWROYW1lSUQoCisJCQkJCQkJCQkJCXFuaWQgKS50b19wdHI8IEF2bVRyYW5zaXRpb24gPigpOworCQkJCQkJCQlpZiggYVRyYW5zaXRpb24gIT0gTlVMTCApCisJCQkJCQkJCXsKKwkJCQkJCQkJCWxpc3RPZlRyYW5zaXRpb24uYXBwZW5kKGFUcmFuc2l0aW9uKTsKKwkJCQkJCQkJfQorCQkJCQkJCQllbHNlCisJCQkJCQkJCXsKKwkJCQkJCQkJCUFWTV9PU19XQVJOICA8PCAiVW5mb3VuZCB0aGUgIgorCQkJCQkJCQkJCTw8IGtpbmQgPDwgIiA8PCAiIDw8IHFuaWQKKwkJCQkJCQkJCQk8PCAiID4+IGFzIGNvdmVyYWdlIHByb2Nlc3NvciBwYXJhbWV0ZXI6PiAiCisJCQkJCQkJCQkJPDwgZ2V0UGFyYW1ldGVyV09iamVjdCgpCisJCQkJCQkJCQkJCQktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKwkJCQkJCQkJCQk8PCBzdGQ6OmVuZGw7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQkJZWxzZSBpZigga2luZCA9PSAicHJvZ3JhbSIgKQorCQkJCQkJCXsKKwkJCQkJCQkJYVRyYW5zaXRpb24gPQorCQkJCQkJCQkJWFF1ZXJ5LmdldFRyYW5zaXRpb25CeVF1YWxpZmllZE5hbWVJRCgKKwkJCQkJCQkJCQkJcW5pZCApLnRvX3B0cjwgQXZtVHJhbnNpdGlvbiA+KCk7CisJCQkJCQkJCWlmKCBhVHJhbnNpdGlvbiAhPSBOVUxMICkKKwkJCQkJCQkJeworCQkJCQkJCQkJbGlzdE9mVHJhbnNpdGlvbi5hcHBlbmQoYVRyYW5zaXRpb24pOworCQkJCQkJCQl9CisJCQkJCQkJCWVsc2UKKwkJCQkJCQkJeworCQkJCQkJCQkJQVZNX09TX1dBUk4gIDw8ICJVbmZvdW5kIHRoZSAiCisJCQkJCQkJCQkJPDwga2luZCA8PCAiIDw8ICIgPDwgcW5pZAorCQkJCQkJCQkJCTw8ICIgPj4gYXMgY292ZXJhZ2UgcHJvY2Vzc29yIHBhcmFtZXRlcjo+ICIKKwkJCQkJCQkJCQk8PCBnZXRQYXJhbWV0ZXJXT2JqZWN0KCkKKwkJCQkJCQkJCQkJCS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJCQkJCQkJCTw8IHN0ZDo6ZW5kbDsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQllbHNlCisJCQkJCQkJeworCQkJCQkJCQlBVk1fT1NfV0FSTiA8PCAiVW5leHBlY3RlZCBhdHRyaWJ1dGUgPDwgIgorCQkJCQkJCQkJPDwgKCppdFdmTyktPnN0cigpCisJCQkJCQkJCQk8PCAiID4+IGFzIGNvdmVyYWdlIHByb2Nlc3NvciBwYXJhbWV0ZXI6PiAiCisJCQkJCQkJCQk8PCBnZXRQYXJhbWV0ZXJXT2JqZWN0KCkKKwkJCQkJCQkJCQkJLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQkJCQkJCQk8PCBzdGQ6OmVuZGw7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisKKworCQkJCQkvLyBJTklUSUFMSVNBVElPTiBkZSBsYSB0YWJsZSBkZSB0b3VzIGxlcyBQUk9HUkFNCisJCQkJCS8vIGFzc29jacOpcyDDoCBjaGFjdW4gZGVzIEVYRUNVVEFCTEUuLi4KKwkJCQkJY29uZmlndXJlRXhlY3V0YWJsZUNvdmVyYWdlVGFibGVGbGFnKHRydWUpOworCisJCQkJCUxpc3RPZkV4ZWN1dGFibGVGb3JtOjppdGVyYXRvciBpdEV4ZWMgPSBsaXN0T2ZFeGVjdXRhYmxlLmJlZ2luKCk7CisJCQkJCUxpc3RPZkV4ZWN1dGFibGVGb3JtOjppdGVyYXRvciBlbmRFeGVjID0gbGlzdE9mRXhlY3V0YWJsZS5lbmQoKTsKKwkJCQkJZm9yKCA7IGl0RXhlYyAhPSBlbmRFeGVjIDsgKytpdEV4ZWMgKQorCQkJCQl7CisJCQkJCQljb25maWd1cmVFeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZUZsYWcoKCppdEV4ZWMpLCBmYWxzZSk7CisJCQkJCX0KKworCisJCQkJCS8vIENhcyBkZXMgcHJvZ3JhbW1lcworCQkJCQljb25maWd1cmVUcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZUZsYWcobGlzdE9mVHJhbnNpdGlvbiwgZmFsc2UpOworCisKKwkJCQkJLy8gSU5JVElBTElTQVRJT04gZGUgbGEgdGFibGUgZGUgdG91cyBsZXMgUFJPR1JBTQorCQkJCQkvLyBhc3NvY2nDqXMgw6AgY2hhY3VuZSBkZXMgSU5TVEFOQ0UuLi4KKwkJCQkJTGlzdE9mSW5zdGFuY2VPZk1hY2hpbmU6Oml0ZXJhdG9yIGl0SW5zdCA9IGxpc3RPZkluc3RhbmNlLmJlZ2luKCk7CisJCQkJCUxpc3RPZkluc3RhbmNlT2ZNYWNoaW5lOjppdGVyYXRvciBlbmRJbnN0ID0gbGlzdE9mSW5zdGFuY2UuZW5kKCk7CisJCQkJCWZvciggOyBpdEluc3QgIT0gZW5kSW5zdCA7ICsraXRJbnN0ICkKKwkJCQkJeworCQkJCQkJaWYoICgqaXRJbnN0KS0+Z2V0RXhlY3V0YWJsZSgpLT5oYXNUcmFuc2l0aW9uKCkgKQorCQkJCQkJeworCQkJCQkJCWNvbmZpZ3VyZUluc3RhbmNlQ292ZXJhZ2VUYWJsZUZsYWcoYW5FRCwKKwkJCQkJCQkJCWFuRUQuZ2V0UnVudGltZUlEKCppdEluc3QpLCBmYWxzZSk7CisJCQkJCQl9CisJCQkJCX0KKworCisJCQkJCWlmKCBtRXhlY3V0YWJsZUNvdmVyYWdlVGFibGUgIT0gTlVMTCkKKwkJCQkJeworCQkJCQkJaWYoIG1UcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZSAhPSBOVUxMKQorCQkJCQkJeworCQkJCQkJCS8vIElOSVRJQUxJU0FUSU9OIGRlIGxhIHRhYmxlIGRlIHRvdXMgbGVzIFBST0dSQU0KKwkJCQkJCQkvLyBhc3NvY2nDqXMgw6AgY2hhY3VuZSBkZXMgSU5TVEFOQ0UuLi4KKwkJCQkJCQljb25maWd1cmVJbnN0YW5jZUNvdmVyYWdlVGFibGVGbGFnKCk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJbVNjb3BlID0gU3BlY2lmaWVyOjpERVNJR05fTU9ERUxfS0lORDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlBVk1fT1NfV0FSTiA8PCAiVW5mb3VuZCBzZWN0aW9uIDw8IERFVEFJTFMgPj4gIgorCQkJCQkJCSJhcyBjb3ZlcmFnZSBwcm9jZXNzb3IgcGFyYW1ldGVyOj4gIgorCQkJCQkJCTw8IGdldFBhcmFtZXRlcldPYmplY3QoKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJCQkJCTw8IHN0ZDo6ZW5kbDsKKwkJCQl9CisKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgQ09ORklHVVJJTkcgKQorCUFWTV9PU19UUkFDRSA8PCAiVW5jb3ZlcmVkIFRyYW5zaXRpb24gQ291bnQgYXQgdGhlIGJlZ2lubmluZyA6PiAiCisJCQk8PCBtQ292ZXJhZ2VTdGF0aXN0aWNzLm1OdW1iZXJPZkVsZW1lbnRzIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgQ09ORklHVVJJTkcgKQorCX0KKworCisJaWYoIChtQ292ZXJhZ2VIZWlnaHRQZXJpb2QgPT0gMCkgfHwKKwkJCShtQ292ZXJhZ2VIZWlnaHRQZXJpb2QgPT0gQVZNX05VTUVSSUNfTUFYX1NJWkVfVCkgKQorCXsKKwkJbUNvdmVyYWdlSGVpZ2h0ID0gbUNvdmVyYWdlSGVpZ2h0UGVyaW9kID0gNzsKKy8vCQkJCW1Db3ZlcmFnZVN0YXRpc3RpY3MubU51bWJlck9mRWxlbWVudHM7CisJfQorCW1Db3ZlcmFnZUhlaWdodFJlYWNoZWRDb3VudCA9IDA7CisJbUNvdmVyYWdlSGVpZ2h0UmVhY2hlZEZsYWcgPSBmYWxzZTsKKworCWlmKCBtQ292ZXJhZ2VIZWlnaHRSZWFjaGVkTGltaXQgPT0gMCApCisJeworCQltQ292ZXJhZ2VIZWlnaHRSZWFjaGVkTGltaXQgPSBtQ292ZXJhZ2VTdGF0aXN0aWNzLm1OdW1iZXJPZkVsZW1lbnRzOworCX0KKworCisJZW5hYmxlUHJlcHJvY2VzcyggdGhpcyApOworCisJcmV0dXJuIG1Db25maWdGbGFnOworfQorCisKK3ZvaWQgVHJhbnNpdGlvbkNvdmVyYWdlRmlsdGVyOjpjb25maWd1cmVFeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZUZsYWcoYm9vbCB2YWx1ZSkKK3sKKwlpZiggbUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlID09IE5VTEwgKQorCXsKKwkJbUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlID0gbmV3IEFycmF5T2ZCaXRzZXQoCisJCQkJZ2V0Q29uZmlndXJhdGlvbigpLmdldEV4ZWN1dGFibGVTeXN0ZW0oKS5zaXplKCksIE5VTEwpOworCX0KKworCUJpdHNldCAqIHRhYmxlT2ZGbGFnID0gTlVMTDsKKwlhdm1fc2l6ZV90IGl0VHJhbnNpdGlvbiA9IDA7CisJYXZtX3NpemVfdCBlbmRUcmFuc2l0aW9uID0gMDsKKworCVZlY3Rvck9mRXhlY3V0YWJsZUZvcm06Oml0ZXJhdG9yIGl0RXhlYyA9IG1UYWJsZW9mUnVudGltZUV4ZWN1dGFibGUuYmVnaW4oKTsKKwlWZWN0b3JPZkV4ZWN1dGFibGVGb3JtOjppdGVyYXRvciBlbmRFeGVjID0gbVRhYmxlb2ZSdW50aW1lRXhlY3V0YWJsZS5lbmQoKTsKKwlmb3IoIDsgaXRFeGVjICE9IGVuZEV4ZWMgOyArK2l0RXhlYyApCisJeworCQlpZiggKCppdEV4ZWMpLT5oYXNUcmFuc2l0aW9uKCkgKQorCQl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBR19BTkQoIE1FRElVTSAsIENPTkZJR1VSSU5HICwgKCEgdmFsdWUpICkKKwlBVk1fT1NfVFJBQ0UgPDwgImV4ZWN1dGFibGUgOj4gIiA8PCAoKml0RXhlYyktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKwkJCTw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHX0FORCggTUVESVVNICwgQ09ORklHVVJJTkcgKQorCisJCQl0YWJsZU9mRmxhZyA9IG1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZS0+YXQoKCppdEV4ZWMpLT5nZXRPZmZzZXQoKSk7CisJCQlpZiggdGFibGVPZkZsYWcgPT0gTlVMTCApCisJCQl7CisJCQkJdGFibGVPZkZsYWcgPSBuZXcgQml0c2V0KAorCQkJCQkJKCppdEV4ZWMpLT5nZXRUcmFuc2l0aW9uKCkuc2l6ZSgpLCB0cnVlKTsKKworCQkJCW1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZS0+c2V0KAorCQkJCQkJKCppdEV4ZWMpLT5nZXRPZmZzZXQoKSwgdGFibGVPZkZsYWcpOworCQkJfQorCisJCQllbmRUcmFuc2l0aW9uID0gKCppdEV4ZWMpLT5nZXRUcmFuc2l0aW9uKCkuc2l6ZSgpOworCQkJZm9yKCBpdFRyYW5zaXRpb24gPSAwIDsgaXRUcmFuc2l0aW9uIDwgZW5kVHJhbnNpdGlvbiA7ICsraXRUcmFuc2l0aW9uICkKKwkJCXsKKwkJCQlpZiggKG5vdCB2YWx1ZSkgJiYgdGFibGVPZkZsYWctPnRlc3QoaXRUcmFuc2l0aW9uKSApCisJCQkJeworCQkJCQl0YWJsZU9mRmxhZy0+c2V0KGl0VHJhbnNpdGlvbiwgdmFsdWUpOworCisJCQkJCWlmKCBub3QgdmFsdWUgKQorCQkJCQl7CisJCQkJCQltQ292ZXJhZ2VTdGF0aXN0aWNzLmFkZFVuY292ZXJlZEVsZW1lbnQoKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIENPTkZJR1VSSU5HICkKKwlBVk1fT1NfVFJBQ0UgPDwgIlx0IiA8PCAicHJvZ3JhbSA6PiAiCisJCQk8PCAoKml0RXhlYyktPnJhd1RyYW5zaXRpb24oaXRUcmFuc2l0aW9uKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIENPTkZJR1VSSU5HICkKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUdfQU5EKCBNRURJVU0gLCBDT05GSUdVUklORyAsICghIHZhbHVlKSApCisJQVZNX09TX1RSQUNFIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHX0FORCggTUVESVVNICwgQ09ORklHVVJJTkcgKQorCQl9CisJCWVsc2UKKwkJeworCQkJbUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlLT5zZXQoKCppdEV4ZWMpLT5nZXRPZmZzZXQoKSwgTlVMTCk7CisJCX0KKwl9Cit9CisKKwordm9pZCBUcmFuc2l0aW9uQ292ZXJhZ2VGaWx0ZXI6OmNvbmZpZ3VyZUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlRmxhZygKKwkJRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGUsIGJvb2wgdmFsdWUpCit7CisJaWYoIG1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZSA9PSBOVUxMICkKKwl7CisJCW1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZSA9IG5ldyBBcnJheU9mQml0c2V0KAorCQkJCWdldENvbmZpZ3VyYXRpb24oKS5nZXRFeGVjdXRhYmxlU3lzdGVtKCkuc2l6ZSgpLCBOVUxMKTsKKwl9CisKKwlpZiggYW5FeGVjdXRhYmxlLT5oYXNUcmFuc2l0aW9uKCkgKQorCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHX0FORCggTUVESVVNICwgQ09ORklHVVJJTkcgLCAoISB2YWx1ZSkgKQorCUFWTV9PU19UUkFDRSA8PCAiZXhlY3V0YWJsZSA6PiAiIDw8IGFuRXhlY3V0YWJsZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUdfQU5EKCBNRURJVU0gLCBDT05GSUdVUklORyApCisKKwkJQml0c2V0ICogdGFibGVPZkZsYWcgPQorCQkJCW1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZS0+YXQoIGFuRXhlY3V0YWJsZS0+Z2V0T2Zmc2V0KCkgKTsKKwkJaWYoIHRhYmxlT2ZGbGFnID09IE5VTEwgKQorCQl7CisJCQl0YWJsZU9mRmxhZyA9IG5ldyBCaXRzZXQoYW5FeGVjdXRhYmxlLT5nZXRUcmFuc2l0aW9uKCkuc2l6ZSgpLCB0cnVlKTsKKworCQkJbUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlLT5zZXQoYW5FeGVjdXRhYmxlLT5nZXRPZmZzZXQoKSwgdGFibGVPZkZsYWcpOworCQl9CisKKwkJYXZtX3NpemVfdCBlbmRUcmFuc2l0aW9uID0gYW5FeGVjdXRhYmxlLT5nZXRUcmFuc2l0aW9uKCkuc2l6ZSgpOworCQlhdm1fc2l6ZV90IGl0VHJhbnNpdGlvbiA9IDA7CisJCWZvciggOyBpdFRyYW5zaXRpb24gPCBlbmRUcmFuc2l0aW9uIDsgKytpdFRyYW5zaXRpb24gKQorCQl7CisJCQlpZiggKCEgdmFsdWUpICYmIHRhYmxlT2ZGbGFnLT50ZXN0KGl0VHJhbnNpdGlvbikgKQorCQkJeworCQkJCXRhYmxlT2ZGbGFnLT5zZXQoaXRUcmFuc2l0aW9uLCB2YWx1ZSk7CisKKwkJCQltQ292ZXJhZ2VTdGF0aXN0aWNzLmFkZFVuY292ZXJlZEVsZW1lbnQoKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIENPTkZJR1VSSU5HICkKKwlBVk1fT1NfVFJBQ0UgPDwgIlx0IiA8PCAicHJvZ3JhbSA6PiAiCisJCTw8IGFuRXhlY3V0YWJsZS0+cmF3VHJhbnNpdGlvbihpdFRyYW5zaXRpb24pLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCTw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBDT05GSUdVUklORyApCisJCQl9CisJCX0KKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUdfQU5EKCBNRURJVU0gLCBDT05GSUdVUklORyAsICghIHZhbHVlKSApCisJCUFWTV9PU19UUkFDRSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBR19BTkQoIE1FRElVTSAsIENPTkZJR1VSSU5HICkKKwl9CisKKwkvLyBDYXMgZGVzIHNvdXMgbWFjaGluZSBleGVjdXRhYmxlCisJaWYoIGFuRXhlY3V0YWJsZS0+aGFzSW5zdGFuY2VTdGF0aWMoKSApCisJeworCQlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBpdCA9IGFuRXhlY3V0YWJsZS0+aW5zdGFuY2Vfc3RhdGljX2JlZ2luKCk7CisJCVRhYmxlT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gYW5FeGVjdXRhYmxlLT5pbnN0YW5jZV9zdGF0aWNfZW5kKCk7CisJCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCQl7CisJCQljb25maWd1cmVFeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZUZsYWcoKCppdCkuZ2V0RXhlY3V0YWJsZSgpLCB2YWx1ZSk7CisJCX0KKwl9Cit9CisKKwordm9pZCBUcmFuc2l0aW9uQ292ZXJhZ2VGaWx0ZXI6OmNvbmZpZ3VyZUluc3RhbmNlQ292ZXJhZ2VUYWJsZUZsYWcoKQoreworCWlmKCBtRXhlY3V0YWJsZUNvdmVyYWdlVGFibGUgIT0gTlVMTCkKKwl7CisJCWNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVEID0gZ2V0Q29uZmlndXJhdGlvbigpLmdldE1haW5FeGVjdXRpb25EYXRhKCk7CisKKwkJUnVudGltZUlEIGFSSUQ7CisKKwkJaWYoIG1UcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZSA9PSBOVUxMICkKKwkJeworCQkJbVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlID0gbmV3IEFycmF5T2ZCaXRzZXQoCisJCQkJCWFuRUQuZ2V0VGFibGVPZlJ1bnRpbWUoKS5zaXplKCksIE5VTEwpOworCQl9CisKKwkJYXZtX3NpemVfdCBlbmRNYWNoaW5lID0gbVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlLT5zaXplKCk7CisJCWZvciggYXZtX3NpemVfdCBpdE1hY2hpbmUgPSAwIDsgaXRNYWNoaW5lIDwgZW5kTWFjaGluZSA7ICsraXRNYWNoaW5lICkKKwkJeworCQkJYVJJRCA9IGFuRUQuZ2V0UnVudGltZUlEKGl0TWFjaGluZSk7CisJCQlpZiggYVJJRC5nZXRFeGVjdXRhYmxlKCktPmhhc1RyYW5zaXRpb24oKSAmJgorCQkJCQkobVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlLT5hdChpdE1hY2hpbmUpID09IE5VTEwpICkKKwkJCXsKKwkJCQltVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUtPnNldChpdE1hY2hpbmUsCisJCQkJCQltRXhlY3V0YWJsZUNvdmVyYWdlVGFibGUtPmF0KAorCQkJCQkJCQlhUklELmdldEV4ZWN1dGFibGUoKS0+Z2V0T2Zmc2V0KCkpKTsKKwkJCX0KKwkJfQorCX0KK30KKworCisKK3ZvaWQgVHJhbnNpdGlvbkNvdmVyYWdlRmlsdGVyOjpjb25maWd1cmVJbnN0YW5jZUNvdmVyYWdlVGFibGVGbGFnKGJvb2wgdmFsdWUpCit7CisJY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0TWFpbkV4ZWN1dGlvbkRhdGEoKTsKKwlSdW50aW1lSUQgYVJJRDsKKwlCaXRzZXQgKiB0YWJsZU9mRmxhZyA9IE5VTEw7CisKKwlhdm1fc2l6ZV90IGl0VHJhbnNpdGlvbiA9IDA7CisJYXZtX3NpemVfdCBlbmRUcmFuc2l0aW9uID0gMDsKKworCWlmKCBtVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUgPT0gTlVMTCApCisJeworCQltVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUgPSBuZXcgQXJyYXlPZkJpdHNldCgKKwkJCQlhbkVELmdldFRhYmxlT2ZSdW50aW1lKCkuc2l6ZSgpLCBOVUxMKTsKKwl9CisKKwlhdm1fc2l6ZV90IGVuZE1hY2hpbmUgPSBtVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUtPnNpemUoKTsKKwlmb3IoIGF2bV9zaXplX3QgaXRNYWNoaW5lID0gMCA7IGl0TWFjaGluZSA8IGVuZE1hY2hpbmUgOyArK2l0TWFjaGluZSApCisJeworCQlhUklEID0gYW5FRC5nZXRSdW50aW1lSUQoaXRNYWNoaW5lKTsKKwkJaWYoIGFSSUQuZ2V0RXhlY3V0YWJsZSgpLT5oYXNUcmFuc2l0aW9uKCkgKQorCQl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBR19BTkQoIE1FRElVTSAsIENPTkZJR1VSSU5HICwgKCEgdmFsdWUpICkKKwlBVk1fT1NfVFJBQ0UgPDwgIm1hY2hpbmUgOj4gIiA8PCBhUklELmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUdfQU5EKCBNRURJVU0gLCBDT05GSUdVUklORyApCisKKwkJCXRhYmxlT2ZGbGFnID0gbVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlLT5hdCggaXRNYWNoaW5lICk7CisJCQlpZiggdGFibGVPZkZsYWcgPT0gTlVMTCApCisJCQl7CisJCQkJdGFibGVPZkZsYWcgPSBuZXcgQml0c2V0KAorCQkJCQkJYVJJRC5nZXRFeGVjdXRhYmxlKCktPmdldFRyYW5zaXRpb24oKS5zaXplKCksIHRydWUpOworCisJCQkJbVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlLT5zZXQoaXRNYWNoaW5lLCB0YWJsZU9mRmxhZyk7CisJCQl9CisKKwkJCWl0VHJhbnNpdGlvbiA9IDA7CisJCQllbmRUcmFuc2l0aW9uID0gYVJJRC5nZXRFeGVjdXRhYmxlKCktPmdldFRyYW5zaXRpb24oKS5zaXplKCk7CisJCQlmb3IoIDsgaXRUcmFuc2l0aW9uIDwgZW5kVHJhbnNpdGlvbiA7ICsraXRUcmFuc2l0aW9uICkKKwkJCXsKKwkJCQlpZiggKCEgdmFsdWUpICYmIHRhYmxlT2ZGbGFnLT50ZXN0KGl0VHJhbnNpdGlvbikgKQorCQkJCXsKKwkJCQkJdGFibGVPZkZsYWctPnNldChpdFRyYW5zaXRpb24sIHZhbHVlKTsKKworCQkJCQlpZiggbm90IHZhbHVlICkKKwkJCQkJeworCQkJCQkJbUNvdmVyYWdlU3RhdGlzdGljcy5hZGRVbmNvdmVyZWRFbGVtZW50KCk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBDT05GSUdVUklORyApCisJQVZNX09TX1RSQUNFIDw8ICJcdCIgPDwgInByb2dyYW0gOj4gIgorCQkJPDwgYVJJRC5nZXRFeGVjdXRhYmxlKCktPnJhd1RyYW5zaXRpb24oCisJCQkJCWl0VHJhbnNpdGlvbiApLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQk8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgQ09ORklHVVJJTkcgKQorCQkJCQl9CisJCQkJfQorCQkJfQorCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBR19BTkQoIE1FRElVTSAsIENPTkZJR1VSSU5HICwgKCEgdmFsdWUpICkKKwlBVk1fT1NfVFJBQ0UgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUdfQU5EKCBNRURJVU0gLCBDT05GSUdVUklORyApCisJCX0KKwkJZWxzZQorCQl7CisJCQltVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUtPnNldChpdE1hY2hpbmUsIE5VTEwpOworCQl9CisJfQorfQorCisKK3ZvaWQgVHJhbnNpdGlvbkNvdmVyYWdlRmlsdGVyOjpjb25maWd1cmVJbnN0YW5jZUNvdmVyYWdlVGFibGVGbGFnKAorCQljb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwgY29uc3QgUnVudGltZUlEICYgYVJJRCwgYm9vbCB2YWx1ZSkKK3sKKwlpZiggbUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlID09IE5VTEwgKQorCXsKKwkJY29uZmlndXJlRXhlY3V0YWJsZUNvdmVyYWdlVGFibGVGbGFnKCB0cnVlICk7CisJfQorCisJaWYoIG1UcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZSA9PSBOVUxMICkKKwl7CisJCW1UcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZSA9IG5ldyBBcnJheU9mQml0c2V0KAorCQkJCWFuRUQuZ2V0VGFibGVPZlJ1bnRpbWUoKS5zaXplKCksIE5VTEwpOworCX0KKworCUV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlID0gYVJJRC5nZXRFeGVjdXRhYmxlKCk7CisKKwlpZiggKGFuRXhlY3V0YWJsZSAhPSBOVUxMKSAmJgorCQkJKG1UcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZS0+YXQoYVJJRC5nZXRPZmZzZXQoKSkgPT0gTlVMTCkgKQorCXsKKwkJaWYoIGFuRXhlY3V0YWJsZS0+aGFzVHJhbnNpdGlvbigpICYmCisJCQkJbUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlLT5hdChhbkV4ZWN1dGFibGUtPmdldE9mZnNldCgpKSA9PSBOVUxMICkKKwkJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUdfQU5EKCBNRURJVU0gLCBDT05GSUdVUklORyAsICghIHZhbHVlKSApCisJQVZNX09TX1RSQUNFIDw8ICJtYWNoaW5lIDo+ICIgPDwgYVJJRC5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHX0FORCggTUVESVVNICwgQ09ORklHVVJJTkcgKQorCisJCQlCaXRzZXQgKiB0YWJsZU9mRmxhZyA9CisJCQkJCW1UcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZS0+YXQoIGFSSUQuZ2V0T2Zmc2V0KCkgKTsKKwkJCWlmKCB0YWJsZU9mRmxhZyA9PSBOVUxMICkKKwkJCXsKKwkJCQl0YWJsZU9mRmxhZyA9IG5ldyBCaXRzZXQoCisJCQkJCQlhbkV4ZWN1dGFibGUtPmdldFRyYW5zaXRpb24oKS5zaXplKCksIHRydWUpOworCisJCQkJbVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlLT5zZXQoYVJJRC5nZXRPZmZzZXQoKSwgdGFibGVPZkZsYWcpOworCQkJfQorCisJCQlhdm1fc2l6ZV90IGVuZFRyYW5zaXRpb24gPSBhbkV4ZWN1dGFibGUtPmdldFRyYW5zaXRpb24oKS5zaXplKCk7CisJCQlhdm1fc2l6ZV90IGl0VHJhbnNpdGlvbiA9IDA7CisJCQlmb3IoIDsgaXRUcmFuc2l0aW9uIDwgZW5kVHJhbnNpdGlvbiA7ICsraXRUcmFuc2l0aW9uICkKKwkJCXsKKwkJCQlpZiggKG5vdCB2YWx1ZSkgJiYgdGFibGVPZkZsYWctPnRlc3QoaXRUcmFuc2l0aW9uKSApCisJCQkJeworCQkJCQl0YWJsZU9mRmxhZy0+c2V0KGl0VHJhbnNpdGlvbiwgdmFsdWUpOworCisJCQkJCW1Db3ZlcmFnZVN0YXRpc3RpY3MuYWRkVW5jb3ZlcmVkRWxlbWVudCgpOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgQ09ORklHVVJJTkcgKQorCUFWTV9PU19UUkFDRSA8PCAiXHQiIDw8ICJwcm9ncmFtIDo+ICIKKwkJPDwgYW5FeGVjdXRhYmxlLT5yYXdUcmFuc2l0aW9uKGl0VHJhbnNpdGlvbiktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKwkJPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIENPTkZJR1VSSU5HICkKKwkJCQl9CisJCQl9CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHX0FORCggTUVESVVNICwgQ09ORklHVVJJTkcgLCAoISB2YWx1ZSkgKQorCUFWTV9PU19UUkFDRSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBR19BTkQoIE1FRElVTSAsIENPTkZJR1VSSU5HICkKKwkJfQorCQllbHNlIGlmKCBhbkV4ZWN1dGFibGUtPmhhc1RyYW5zaXRpb24oKSApCisJCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHX0FORCggTUVESVVNICwgQ09ORklHVVJJTkcgLCAoISB2YWx1ZSkgKQorCUFWTV9PU19UUkFDRSA8PCAibWFjaGluZSA6PiAiIDw8IGFSSUQuZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBR19BTkQoIE1FRElVTSAsIENPTkZJR1VSSU5HICkKKworCQkJQml0c2V0ICogdGFibGVPZkZsYWcgPQorCQkJCQltVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUtPmF0KCBhUklELmdldE9mZnNldCgpICk7CisJCQlpZiggdGFibGVPZkZsYWcgPT0gTlVMTCApCisJCQl7CisJCQkJdGFibGVPZkZsYWcgPSBuZXcgQml0c2V0KAorCQkJCQkJYW5FeGVjdXRhYmxlLT5nZXRUcmFuc2l0aW9uKCkuc2l6ZSgpLCB0cnVlKTsKKworCQkJCW1UcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZS0+c2V0KGFSSUQuZ2V0T2Zmc2V0KCksIHRhYmxlT2ZGbGFnKTsKKwkJCX0KKworCQkJYXZtX3NpemVfdCBlbmRUcmFuc2l0aW9uID0gYW5FeGVjdXRhYmxlLT5nZXRUcmFuc2l0aW9uKCkuc2l6ZSgpOworCQkJYXZtX3NpemVfdCBpdFRyYW5zaXRpb24gPSAwOworCQkJZm9yKCA7IGl0VHJhbnNpdGlvbiA8IGVuZFRyYW5zaXRpb24gOyArK2l0VHJhbnNpdGlvbiApCisJCQl7CisJCQkJdGFibGVPZkZsYWctPnNldChpdFRyYW5zaXRpb24sCisJCQkJCQl2YWx1ZSAmJiBtRXhlY3V0YWJsZUNvdmVyYWdlVGFibGUtPmF0KAorCQkJCQkJCQlhbkV4ZWN1dGFibGUtPmdldE9mZnNldCgpKS0+dGVzdChpdFRyYW5zaXRpb24pICk7CisKKwkJCQlpZiggKCEgdmFsdWUpICYmIG1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZS0+YXQoCisJCQkJCQlhbkV4ZWN1dGFibGUtPmdldE9mZnNldCgpKS0+dGVzdChpdFRyYW5zaXRpb24pICkKKwkJCQl7CisJCQkJCW1Db3ZlcmFnZVN0YXRpc3RpY3MuYWRkVW5jb3ZlcmVkRWxlbWVudCgpOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgQ09ORklHVVJJTkcgKQorCUFWTV9PU19UUkFDRSA8PCAiXHQiIDw8ICJwcm9ncmFtIDo+ICIKKwkJPDwgYW5FeGVjdXRhYmxlLT5yYXdUcmFuc2l0aW9uKGl0VHJhbnNpdGlvbiktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKwkJPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIENPTkZJR1VSSU5HICkKKwkJCQl9CisJCQl9CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHX0FORCggTUVESVVNICwgQ09ORklHVVJJTkcgLCAoISB2YWx1ZSkgKQorCUFWTV9PU19UUkFDRSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBR19BTkQoIE1FRElVTSAsIENPTkZJR1VSSU5HICkKKwkJfQorCisJCS8vIENhcyBkZXMgc291cyBtYWNoaW5lIGluc3RhbmNlCisJCWlmKCBhbkVELmdldFJ1bnRpbWUoYVJJRCkuaGFzQ2hpbGQoKSApCisJCXsKKwkJCVRhYmxlT2ZSdW50aW1lSUQ6OmNvbnN0X2l0ZXJhdG9yIGl0U3ViTWFjaGluZSA9CisJCQkJCWFuRUQuZ2V0UnVudGltZShhUklEKS5iZWdpbkNoaWxkKCk7CisJCQlUYWJsZU9mUnVudGltZUlEOjpjb25zdF9pdGVyYXRvciBlbmRTdWJNYWNoaW5lID0KKwkJCQkJYW5FRC5nZXRSdW50aW1lKGFSSUQpLmVuZENoaWxkKCk7CisJCQlmb3IoIDsgaXRTdWJNYWNoaW5lICE9IGVuZFN1Yk1hY2hpbmUgOyArK2l0U3ViTWFjaGluZSApCisJCQl7CisJCQkJY29uZmlndXJlSW5zdGFuY2VDb3ZlcmFnZVRhYmxlRmxhZyhhbkVELCAoKml0U3ViTWFjaGluZSksIHZhbHVlKTsKKwkJCX0KKwkJfQorCX0KK30KKworCit2b2lkIFRyYW5zaXRpb25Db3ZlcmFnZUZpbHRlcjo6Y29uZmlndXJlVHJhbnNpdGlvbkNvdmVyYWdlVGFibGVGbGFnKAorCQlMaXN0T2ZBdm1UcmFuc2l0aW9uICYgbGlzdE9mVHJhbnNpdGlvbiwgYm9vbCB2YWx1ZSkKK3sKKwlpZiggbUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlID09IE5VTEwgKQorCXsKKwkJbUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlID0gbmV3IEFycmF5T2ZCaXRzZXQoCisJCQkJZ2V0Q29uZmlndXJhdGlvbigpLmdldEV4ZWN1dGFibGVTeXN0ZW0oKS5zaXplKCksIE5VTEwpOworCX0KKworCUJpdHNldCAqIHRhYmxlT2ZGbGFnID0gTlVMTDsKKwlhdm1fb2Zmc2V0X3QgY29udGFpbmVyRXhlY09mZnNldCA9IDA7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHX0FORCggTUVESVVNICwgQ09ORklHVVJJTkcgLAorCQkoISB2YWx1ZSkgJiYgbGlzdE9mVHJhbnNpdGlvbi5ub25lbXB0eSgpICkKKwlBVk1fT1NfVFJBQ0UgPDwgInByb2dyYW0gOj4gdXNlciBkZXRhaWxzIiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBR19BTkQoIE1FRElVTSAsIENPTkZJR1VSSU5HICkKKworCUxpc3RPZkF2bVRyYW5zaXRpb246Oml0ZXJhdG9yIGl0UHJvZyA9IGxpc3RPZlRyYW5zaXRpb24uYmVnaW4oKTsKKwlMaXN0T2ZBdm1UcmFuc2l0aW9uOjppdGVyYXRvciBlbmRQcm9nID0gbGlzdE9mVHJhbnNpdGlvbi5lbmQoKTsKKwlmb3IoIDsgaXRQcm9nICE9IGVuZFByb2cgOyArK2l0UHJvZyApCisJeworCQljb250YWluZXJFeGVjT2Zmc2V0ID0gKCppdFByb2cpLT5nZXRFeGVjdXRhYmxlQ29udGFpbmVyKCktPmdldE9mZnNldCgpOworCisJCXRhYmxlT2ZGbGFnID0gbUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlLT5hdChjb250YWluZXJFeGVjT2Zmc2V0KTsKKwkJaWYoIHRhYmxlT2ZGbGFnID09IE5VTEwgKQorCQl7CisJCQl0YWJsZU9mRmxhZyA9IG5ldyBCaXRzZXQoKCppdFByb2cpLT5nZXRFeGVjdXRhYmxlQ29udGFpbmVyKCkKKwkJCQkJLT5nZXRUcmFuc2l0aW9uKCkuc2l6ZSgpLCB0cnVlKTsKKworCQkJbUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlLT5zZXQoY29udGFpbmVyRXhlY09mZnNldCwgdGFibGVPZkZsYWcpOworCQl9CisJCWlmKCAoISB2YWx1ZSkgJiYgdGFibGVPZkZsYWctPnRlc3QoICgqaXRQcm9nKS0+Z2V0T2Zmc2V0KCkgKSApCisJCXsKKwkJCW1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZS0+YXQoIGNvbnRhaW5lckV4ZWNPZmZzZXQgKS0+c2V0KAorCQkJCQkoKml0UHJvZyktPmdldE9mZnNldCgpLCB2YWx1ZSk7CisKKwkJCW1Db3ZlcmFnZVN0YXRpc3RpY3MuYWRkVW5jb3ZlcmVkRWxlbWVudCgpOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgQ09ORklHVVJJTkcgKQorCUFWTV9PU19UUkFDRSA8PCAiXHQiIDw8ICJwcm9ncmFtIDo+ICIKKwkJPDwgKCppdFByb2cpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBDT05GSUdVUklORyApCisJCX0KKwl9CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHX0FORCggTUVESVVNICwgQ09ORklHVVJJTkcgLAorCQkoISB2YWx1ZSkgJiYgbGlzdE9mVHJhbnNpdGlvbi5ub25lbXB0eSgpICkKKwlBVk1fT1NfVFJBQ0UgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUdfQU5EKCBNRURJVU0gLCBDT05GSUdVUklORyApCit9CisKKworQml0c2V0ICogVHJhbnNpdGlvbkNvdmVyYWdlRmlsdGVyOjpnZXRDb3ZlcmFnZVRhYmxlQml0c2V0KAorCQljb25zdCBSdW50aW1lSUQgJiBhUklEKQoreworCXN3aXRjaCggbVNjb3BlICkKKwl7CisJCWNhc2UgU3BlY2lmaWVyOjpERVNJR05fTU9ERUxfS0lORDoKKwkJeworCQkJcmV0dXJuKCBtRXhlY3V0YWJsZUNvdmVyYWdlVGFibGUtPmF0KAorCQkJCQlhUklELmdldEV4ZWN1dGFibGUoKS0+Z2V0T2Zmc2V0KCkgKSApOworCQl9CisJCWNhc2UgU3BlY2lmaWVyOjpERVNJR05fSU5TVEFOQ0VfS0lORDoKKwkJZGVmYXVsdDoKKwkJeworCQkJcmV0dXJuKCBtVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUtPmF0KCBhUklELmdldE9mZnNldCgpICkgKTsKKwkJfQorCX0KK30KKworCisvKgorICogUkVQT1JUCisgKi8KK3ZvaWQgVHJhbnNpdGlvbkNvdmVyYWdlRmlsdGVyOjpyZXBvcnRNaW5pbXVtKE91dFN0cmVhbSAmIG9zKSBjb25zdAoreworCW9zIDw8IFRBQiA8PCAiVFJBTlNJVElPTiBDT1ZFUkFHRSBQUk9DRVNTT1IiIDw8IEVPTF9GTFVTSDsKKworCWlmKCBtQ292ZXJhZ2VTdGF0aXN0aWNzLmdvYWxBY2hpZXZlZCgpICkKKwl7CisJCW9zIDw8IFRBQjIgPDwgIkFsbCB0aGUgPDwgIiA8PCBtQ292ZXJhZ2VTdGF0aXN0aWNzLm1OdW1iZXJPZkVsZW1lbnRzCisJCQkJPDwgIiA+PiB0cmFuc2l0aW9ucyBhcmUgY292ZXJlZCAhIiA8PCBFT0w7CisJfQorCWVsc2UKKwl7CisJCW9zIDw8IFRBQjIgPDwgIldhcm5pbmc6IGFsbCB0aGUgdHJhbnNpdGlvbnMgYXJlIG5vdCBjb3ZlcmVkICEiIDw8IEVPTDsKKwkJbUNvdmVyYWdlU3RhdGlzdGljcy50b1N0cmVhbUNvdmVyYWdlUmF0ZSggb3MgPDwgVEFCMiwKKwkJCQkiUmVzdWx0czogPDwgIiwgIiBvbiAiLCIgPj4gYXJlIGNvdmVyZWQgIVxuIiApOworCisJCWlmKCBpc1JlcG9ydERldGFpbHMoKSApCisJCXsKKwkJCW9zIDw8IFRBQjIgPDwgIkxpc3Qgb2YgdGhlIDw8ICIKKwkJCQkJPDwgbUNvdmVyYWdlU3RhdGlzdGljcy5nZXROdW1iZXJPZlVuY292ZXJlZCgpCisJCQkJCTw8ICIgPj4gdHJhbnNpdGlvbnMgbm9uIGNvdmVyZWQ6IiA8PCBFT0wyOworCisJCQljb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCA9CisJCQkJCWdldENvbmZpZ3VyYXRpb24oKS5nZXRNYWluRXhlY3V0aW9uRGF0YSgpOworCisJCQlSdW50aW1lSUQgYVJJRDsKKworCQkJU3RyaW5nT3V0U3RyZWFtIG9zcyggb3MuSU5ERU5UICk7CisJCQlib29sIGhhc09uZVVuY292ZXJkVHJhbnNpdGlvbiA9IGZhbHNlOworCisJCQlhdm1fc2l6ZV90IG9mZnNldDsKKwkJCWF2bV9zaXplX3QgZW5kT2Zmc2V0OworCQkJQXZtVHJhbnNpdGlvbiAqIGl0VHJhbnNpdGlvbjsKKworCQkJc3dpdGNoKCBtU2NvcGUgKQorCQkJeworCQkJCWNhc2UgU3BlY2lmaWVyOjpERVNJR05fSU5TVEFOQ0VfS0lORDoKKwkJCQl7CisJCQkJCWlmKCBtVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUgPT0gTlVMTCApCisJCQkJCXsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJYXZtX3NpemVfdCBlbmRNYWNoaW5lID0gbVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlLT5zaXplKCk7CisJCQkJCWF2bV9zaXplX3QgaXRNYWNoaW5lID0gMDsKKwkJCQkJZm9yKCA7IGl0TWFjaGluZSA8IGVuZE1hY2hpbmUgOyArK2l0TWFjaGluZSApCisJCQkJCXsKKwkJCQkJCWFSSUQgPSBhbkVELmdldFJ1bnRpbWVJRChpdE1hY2hpbmUpOworCQkJCQkJaWYoIGFSSUQuZ2V0RXhlY3V0YWJsZSgpLT5oYXNUcmFuc2l0aW9uKCkgKQorCQkJCQkJeworCQkJCQkJCW9zcy5zdHIoIiIpOworCisJCQkJCQkJaWYoIG5vdCBhUklELmdldEV4ZWN1dGFibGUoKS0+aXNSZWFjaGFibGVTdGF0ZSgpICkKKwkJCQkJCQl7CisJCQkJCQkJCW9zcyA8PCBUQUIyIDw8ICJpbnN0YW5jZVsgTk8gSU5DT01JTkcgVFJBTlNJVElPTiBdIDo+ICIKKwkJCQkJCQkJCQk8PCBhUklELmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgRU9MOworCQkJCQkJCX0KKworCQkJCQkJCWhhc09uZVVuY292ZXJkVHJhbnNpdGlvbiA9IGZhbHNlOworCisJCQkJCQkJZW5kT2Zmc2V0ID0gYVJJRC5nZXRFeGVjdXRhYmxlKCktPmdldFRyYW5zaXRpb24oKS5zaXplKCk7CisJCQkJCQkJZm9yKCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgZW5kT2Zmc2V0IDsgKytvZmZzZXQgKQorCQkJCQkJCXsKKwkJCQkJCQkJaXRUcmFuc2l0aW9uID0gYVJJRC5nZXRFeGVjdXRhYmxlKCktPgorCQkJCQkJCQkJCWdldFRyYW5zaXRpb24oKS5yYXdBdChvZmZzZXQpOworCisJCQkJCQkJCWlmKCBub3QgbVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlLT4KKwkJCQkJCQkJCQlhdCggYVJJRC5nZXRPZmZzZXQoKSApLT50ZXN0KCBvZmZzZXQgKSApCisJCQkJCQkJCXsKKwkJCQkJCQkJCWhhc09uZVVuY292ZXJkVHJhbnNpdGlvbiA9IHRydWU7CisJCQkJCQkJCQlvc3MgPDwgVEFCMyA8PCBpdFRyYW5zaXRpb24tPgorCQkJCQkJCQkJCQlzdHJUcmFuc2l0aW9uSGVhZGVyKCkgPDwgRU9MOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCWlmKCBoYXNPbmVVbmNvdmVyZFRyYW5zaXRpb24gKQorCQkJCQkJCXsKKwkJCQkJCQkJb3MgPDwgb3NzLnN0cigpIDw8IEVPTDsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQljYXNlIFNwZWNpZmllcjo6REVTSUdOX01PREVMX0tJTkQ6CisJCQkJeworCQkJCQlpZiggbUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlID09IE5VTEwgKQorCQkJCQl7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCVZlY3Rvck9mRXhlY3V0YWJsZUZvcm06OmNvbnN0X2l0ZXJhdG9yIGl0RXhlYyA9CisJCQkJCQkJbVRhYmxlb2ZSdW50aW1lRXhlY3V0YWJsZS5iZWdpbigpOworCQkJCQlWZWN0b3JPZkV4ZWN1dGFibGVGb3JtOjpjb25zdF9pdGVyYXRvciBlbmRFeGVjID0KKwkJCQkJCQltVGFibGVvZlJ1bnRpbWVFeGVjdXRhYmxlLmVuZCgpOworCQkJCQlmb3IoIGF2bV9zaXplX3QgaW5kZXhFeGVjID0gMCA7IGl0RXhlYyAhPSBlbmRFeGVjIDsKKwkJCQkJCQkrK2l0RXhlYyAsICsraW5kZXhFeGVjICkKKwkJCQkJeworCQkJCQkJaWYoICgqaXRFeGVjKS0+aGFzVHJhbnNpdGlvbigpICkKKwkJCQkJCXsKKwkJCQkJCQlvc3Muc3RyKCIiKTsKKworCQkJCQkJCWlmKCBub3QgKCppdEV4ZWMpLT5pc1JlYWNoYWJsZVN0YXRlKCkgKQorCQkJCQkJCXsKKwkJCQkJCQkJb3NzIDw8IFRBQjIgPDwgIm1vZGVsWyBOTyBJTkNPTUlORyBUUkFOU0lUSU9OIF0gOj4gIgorCQkJCQkJCQkJPDwgKCppdEV4ZWMpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IEVPTDsKKwkJCQkJCQl9CisKKwkJCQkJCQloYXNPbmVVbmNvdmVyZFRyYW5zaXRpb24gPSBmYWxzZTsKKworCQkJCQkJCWVuZE9mZnNldCA9ICgqaXRFeGVjKS0+Z2V0VHJhbnNpdGlvbigpLnNpemUoKTsKKwkJCQkJCQlmb3IoIG9mZnNldCA9IDAgOyBvZmZzZXQgPCBlbmRPZmZzZXQgOyArK29mZnNldCApCisJCQkJCQkJeworCQkJCQkJCQlpdFRyYW5zaXRpb24gPSAoKml0RXhlYyktPmdldFRyYW5zaXRpb24oKS5yYXdBdChvZmZzZXQpOworCisJCQkJCQkJCWlmKCBub3QgbUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlLT4KKwkJCQkJCQkJCQlhdCgoKml0RXhlYyktPmdldE9mZnNldCgpKS0+dGVzdCggb2Zmc2V0ICkgKQorCQkJCQkJCQl7CisJCQkJCQkJCQloYXNPbmVVbmNvdmVyZFRyYW5zaXRpb24gPSB0cnVlOworCQkJCQkJCQkJb3NzIDw8IFRBQjMgPDwgaXRUcmFuc2l0aW9uLT4KKwkJCQkJCQkJCQkJc3RyVHJhbnNpdGlvbkhlYWRlcigpIDw8IEVPTDsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQlpZiggaGFzT25lVW5jb3ZlcmRUcmFuc2l0aW9uICkKKwkJCQkJCQl7CisJCQkJCQkJCW9zIDw8IG9zcy5zdHIoKSA8PCBFT0w7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCWlmKCBtRXhlY3V0YWJsZUNvdmVyYWdlVGFibGUgIT0gTlVMTCApCisJCQkJCXsKKwkJCQkJCVZlY3Rvck9mRXhlY3V0YWJsZUZvcm06OmNvbnN0X2l0ZXJhdG9yIGl0RXhlYyA9CisJCQkJCQkJCW1UYWJsZW9mUnVudGltZUV4ZWN1dGFibGUuYmVnaW4oKTsKKwkJCQkJCVZlY3Rvck9mRXhlY3V0YWJsZUZvcm06OmNvbnN0X2l0ZXJhdG9yIGVuZEV4ZWMgPQorCQkJCQkJCQltVGFibGVvZlJ1bnRpbWVFeGVjdXRhYmxlLmVuZCgpOworCQkJCQkJZm9yKCBhdm1fc2l6ZV90IGluZGV4RXhlYyA9IDAgOyBpdEV4ZWMgIT0gZW5kRXhlYyA7CisJCQkJCQkJCSsraXRFeGVjICwgKytpbmRleEV4ZWMgKQorCQkJCQkJeworCQkJCQkJCWlmKCAoKml0RXhlYyktPmhhc1RyYW5zaXRpb24oKSApCisJCQkJCQkJeworCQkJCQkJCQlvc3Muc3RyKCIiKTsKKworCQkJCQkJCQlpZiggbm90ICgqaXRFeGVjKS0+aXNSZWFjaGFibGVTdGF0ZSgpICkKKwkJCQkJCQkJeworCQkJCQkJCQkJb3NzIDw8IFRBQjIgPDwgIm1vZGVsWyBOTyBJTkNPTUlORyBUUkFOU0lUSU9OIF0gOj4gIgorCQkJCQkJCQkJCQk8PCAoKml0RXhlYyktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgRU9MOworCQkJCQkJCQl9CisKKwkJCQkJCQkJaGFzT25lVW5jb3ZlcmRUcmFuc2l0aW9uID0gZmFsc2U7CisKKwkJCQkJCQkJZW5kT2Zmc2V0ID0gKCppdEV4ZWMpLT5nZXRUcmFuc2l0aW9uKCkuc2l6ZSgpOworCQkJCQkJCQlmb3IoIG9mZnNldCA9IDAgOyBvZmZzZXQgPCBlbmRPZmZzZXQgOyArK29mZnNldCApCisJCQkJCQkJCXsKKwkJCQkJCQkJCWl0VHJhbnNpdGlvbiA9ICgqaXRFeGVjKS0+Z2V0VHJhbnNpdGlvbigpLnJhd0F0KG9mZnNldCk7CisKKwkJCQkJCQkJCWlmKCBub3QgbUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlLT4KKwkJCQkJCQkJCQkJYXQoKCppdEV4ZWMpLT5nZXRPZmZzZXQoKSktPnRlc3QoIG9mZnNldCApICkKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQloYXNPbmVVbmNvdmVyZFRyYW5zaXRpb24gPSB0cnVlOworCQkJCQkJCQkJCW9zcyA8PCBUQUIzIDw8IGl0VHJhbnNpdGlvbi0+CisJCQkJCQkJCQkJCQlzdHJUcmFuc2l0aW9uSGVhZGVyKCkgPDwgRU9MOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJCWlmKCBoYXNPbmVVbmNvdmVyZFRyYW5zaXRpb24gKQorCQkJCQkJCQl7CisJCQkJCQkJCQlvcyA8PCBvc3Muc3RyKCkgPDwgRU9MOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJaWYoIG1UcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZSAhPSBOVUxMICkKKwkJCQkJeworCQkJCQkJYXZtX3NpemVfdCBlbmRNYWNoaW5lID0gbVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlLT5zaXplKCk7CisJCQkJCQlhdm1fc2l6ZV90IGl0TWFjaGluZSA9IDA7CisJCQkJCQlmb3IoIDsgaXRNYWNoaW5lIDwgZW5kTWFjaGluZSA7ICsraXRNYWNoaW5lICkKKwkJCQkJCXsKKwkJCQkJCQlhUklEID0gYW5FRC5nZXRSdW50aW1lSUQoaXRNYWNoaW5lKTsKKwkJCQkJCQlpZiggYVJJRC5nZXRFeGVjdXRhYmxlKCktPmhhc1RyYW5zaXRpb24oKSApCisJCQkJCQkJeworCQkJCQkJCQlvc3Muc3RyKCIiKTsKKworCQkJCQkJCQlpZiggbm90IGFSSUQuZ2V0RXhlY3V0YWJsZSgpLT5pc1JlYWNoYWJsZVN0YXRlKCkgKQorCQkJCQkJCQl7CisJCQkJCQkJCQlvc3MgPDwgVEFCMiA8PCAiaW5zdGFuY2VbIE5PIElOQ09NSU5HIFRSQU5TSVRJT04gXSA6PiAiCisJCQkJCQkJCQkJCTw8IGFSSUQuZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCBFT0w7CisJCQkJCQkJCX0KKworCQkJCQkJCQloYXNPbmVVbmNvdmVyZFRyYW5zaXRpb24gPSBmYWxzZTsKKworCQkJCQkJCQllbmRPZmZzZXQgPSBhUklELmdldEV4ZWN1dGFibGUoKS0+Z2V0VHJhbnNpdGlvbigpLnNpemUoKTsKKwkJCQkJCQkJZm9yKCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgZW5kT2Zmc2V0IDsgKytvZmZzZXQgKQorCQkJCQkJCQl7CisJCQkJCQkJCQlpdFRyYW5zaXRpb24gPSBhUklELmdldEV4ZWN1dGFibGUoKS0+CisJCQkJCQkJCQkJCWdldFRyYW5zaXRpb24oKS5yYXdBdChvZmZzZXQpOworCisJCQkJCQkJCQlpZiggKG5vdCBtVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUtPgorCQkJCQkJCQkJCQlhdChhUklELmdldE9mZnNldCgpKS0+dGVzdChvZmZzZXQpKQorCQkJCQkJCQkJCSYmIG1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZS0+CisJCQkJCQkJCQkJCWF0KGFSSUQuZ2V0RXhlY3V0YWJsZSgpLT5nZXRPZmZzZXQoKSktPgorCQkJCQkJCQkJCQkJdGVzdChvZmZzZXQpICkKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQloYXNPbmVVbmNvdmVyZFRyYW5zaXRpb24gPSB0cnVlOworCQkJCQkJCQkJCW9zcyA8PCBUQUIzIDw8IGl0VHJhbnNpdGlvbi0+CisJCQkJCQkJCQkJCQlzdHJUcmFuc2l0aW9uSGVhZGVyKCkgPDwgRU9MOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJCWlmKCBoYXNPbmVVbmNvdmVyZFRyYW5zaXRpb24gKQorCQkJCQkJCQl7CisJCQkJCQkJCQlvcyA8PCBvc3Muc3RyKCkgPDwgRU9MOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKCBpc1JlcG9ydERldGFpbHMoKSAmJiBtQ292ZXJhZ2VTdGF0aXN0aWNzLmhhc1VuY292ZXJlZCgpICkKKwkJeworCQkJbUNvdmVyYWdlU3RhdGlzdGljcy50b1N0cmVhbUNvdmVyYWdlUmF0ZSggb3MgPDwgVEFCMiwKKwkJCQkJIlJlc3VsdHM6IDw8ICIsICIgb24gIiwiID4+IGFyZSBjb3ZlcmVkICFcbiIgKTsKKwkJfQorCX0KKworCWlmKCBtU2xpY2VGbGFnICkKKwl7CisJCW9zIDw8IFRBQjIgPDwgIk51bWJlciBvZiBub2RlcyBjdXQgYmFjazogIiA8PCBtU2xpY2VDb3VudCA8PCBFT0w7CisJfQorCisJb3MgPDwgc3RkOjpmbHVzaDsKK30KKworCit2b2lkIFRyYW5zaXRpb25Db3ZlcmFnZUZpbHRlcjo6cmVwb3J0RGVmYXVsdChPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlyZXBvcnRIZWFkZXIob3MsICJUUkFOU0lUSU9OIENPVkVSQUdFICIpOworCisJaWYoIG1IZXVyaXN0aWNQcm9wZXJ0eS5tSGV1cmlzdGljRW5hYmxlZCApCisJeworCQlvcyA8PCBzdGQ6OmJvb2xhbHBoYQorCQkJCTw8ICIgPCBjaHA6IiA8PCBtQ292ZXJhZ2VIZWlnaHRQZXJpb2QKKwkJCQk8PCAiICwgY2g6IiAgPDwgbUNvdmVyYWdlSGVpZ2h0CisJCQkJPDwgIiA7IGhzcjoiIDw8IG1IaXRTdHJvbmdseVJhbmRvbUZsYWcKKwkJCQk8PCAiICwgaHNjOiIgPDwgbUhpdFN0cm9uZ2x5Q291bnQKKwkJCQk8PCAiIDsgaHdyOiIgPDwgbUhpdFdlYWtseVJhbmRvbUZsYWcKKwkJCQk8PCAiICwgaHdjOiIgPDwgbUhpdFdlYWtseUNvdW50CisJCQkJPDwgIiA7IGhvcjoiIDw8IG1IaXRPdGhlclJhbmRvbUZsYWcKKwkJCQk8PCAiICwgaG9jOiIgPDwgbUhpdE90aGVyQ291bnQKKwkJCQk8PCAiID4gIgorCQkJCTw8IHN0ZDo6bm9ib29sYWxwaGE7CisJfQorCisJb3MgPDwgRU9MX0ZMVVNIOworCisJaWYoIG1Db3ZlcmFnZVN0YXRpc3RpY3MuZ29hbEFjaGlldmVkKCkgKQorCXsKKwkJb3MgPDwgVEFCMiA8PCAiQWxsIHRoZSA8PCAiIDw8IG1Db3ZlcmFnZVN0YXRpc3RpY3MubU51bWJlck9mRWxlbWVudHMKKwkJCQk8PCAiID4+IHRyYW5zaXRpb25zIGFyZSBjb3ZlcmVkICEiIDw8IEVPTDsKKwl9CisJZWxzZQorCXsKKwkJb3MgPDwgVEFCMiA8PCAiV2FybmluZzogYWxsIHRoZSB0cmFuc2l0aW9ucyBhcmUgbm90IGNvdmVyZWQgISIgPDwgRU9MOworCQltQ292ZXJhZ2VTdGF0aXN0aWNzLnRvU3RyZWFtQ292ZXJhZ2VSYXRlKCBvcyA8PCBUQUIyLAorCQkJCSJSZXN1bHRzOiA8PCAiLCAiIG9uICIsIiA+PiBhcmUgY292ZXJlZCAhXG4iICk7CisKKwkJaWYoIGlzUmVwb3J0RGV0YWlscygpICkKKwkJeworCQkJb3MgPDwgVEFCMiA8PCAiTGlzdCBvZiB0aGUgPDwgIgorCQkJCQk8PCBtQ292ZXJhZ2VTdGF0aXN0aWNzLmdldE51bWJlck9mVW5jb3ZlcmVkKCkKKwkJCQkJPDwgICIgPj4gdHJhbnNpdGlvbnMgbm9uIGNvdmVyZWQ6IiA8PCBFT0wgPDwgRU9MOworCisJCQljb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCA9IGdldENvbmZpZ3VyYXRpb24oKS5nZXRNYWluRXhlY3V0aW9uRGF0YSgpOworCQkJUnVudGltZUlEIGFSSUQ7CisKKwkJCVN0cmluZ091dFN0cmVhbSBvc3MoIG9zLklOREVOVCApOworCQkJYm9vbCBoYXNPbmVVbmNvdmVyZFRyYW5zaXRpb24gPSBmYWxzZTsKKworCQkJYXZtX3NpemVfdCBvZmZzZXQ7CisJCQlhdm1fc2l6ZV90IGVuZE9mZnNldDsKKwkJCUF2bVRyYW5zaXRpb24gKiBpdFRyYW5zaXRpb247CisKKwkJCXN3aXRjaCggbVNjb3BlICkKKwkJCXsKKwkJCQljYXNlIFNwZWNpZmllcjo6REVTSUdOX0lOU1RBTkNFX0tJTkQ6CisJCQkJeworCQkJCQlpZiggbVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlID09IE5VTEwgKQorCQkJCQl7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCWF2bV9zaXplX3QgZW5kTWFjaGluZSA9IG1UcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZS0+c2l6ZSgpOworCQkJCQlhdm1fc2l6ZV90IGl0TWFjaGluZSA9IDA7CisJCQkJCWZvciggOyBpdE1hY2hpbmUgPCBlbmRNYWNoaW5lIDsgKytpdE1hY2hpbmUgKQorCQkJCQl7CisJCQkJCQlhUklEID0gYW5FRC5nZXRSdW50aW1lSUQoaXRNYWNoaW5lKTsKKwkJCQkJCWlmKCBhUklELmdldEV4ZWN1dGFibGUoKS0+aGFzVHJhbnNpdGlvbigpICkKKwkJCQkJCXsKKwkJCQkJCQlvc3Muc3RyKCIiKTsKKworCQkJCQkJCW9zcyA8PCBUQUIyIDw8ICJpbnN0YW5jZSI7CisJCQkJCQkJaWYoIG5vdCBhUklELmdldEV4ZWN1dGFibGUoKS0+aXNSZWFjaGFibGVTdGF0ZSgpICkKKwkJCQkJCQl7CisJCQkJCQkJCW9zcyA8PCAiWyBOTyBJTkNPTUlORyBUUkFOU0lUSU9OIF0iOworCQkJCQkJCX0KKwkJCQkJCQlvc3MgPDwgIiA6PiAiIDw8IGFSSUQuZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCBFT0w7CisKKwkJCQkJCQloYXNPbmVVbmNvdmVyZFRyYW5zaXRpb24gPSBmYWxzZTsKKworCQkJCQkJCWVuZE9mZnNldCA9IGFSSUQuZ2V0RXhlY3V0YWJsZSgpLT5nZXRUcmFuc2l0aW9uKCkuc2l6ZSgpOworCQkJCQkJCWZvciggb2Zmc2V0ID0gMCA7IG9mZnNldCA8IGVuZE9mZnNldCA7ICsrb2Zmc2V0ICkKKwkJCQkJCQl7CisJCQkJCQkJCWl0VHJhbnNpdGlvbiA9IGFSSUQuZ2V0RXhlY3V0YWJsZSgpLT4KKwkJCQkJCQkJCQlnZXRUcmFuc2l0aW9uKCkucmF3QXQob2Zmc2V0KTsKKworCQkJCQkJCQlpZiggbm90IG1UcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZS0+CisJCQkJCQkJCQkJYXQoIGFSSUQuZ2V0T2Zmc2V0KCkgKS0+dGVzdCggb2Zmc2V0ICkgKQorCQkJCQkJCQl7CisJCQkJCQkJCQloYXNPbmVVbmNvdmVyZFRyYW5zaXRpb24gPSB0cnVlOworCQkJCQkJCQkJb3NzIDw8IFRBQjMgPDwgaXRUcmFuc2l0aW9uLT4KKwkJCQkJCQkJCQkJc3RyVHJhbnNpdGlvbkhlYWRlcigpIDw8IEVPTDsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQlpZiggaGFzT25lVW5jb3ZlcmRUcmFuc2l0aW9uICkKKwkJCQkJCQl7CisJCQkJCQkJCW9zIDw8IG9zcy5zdHIoKSA8PCBFT0w7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJY2FzZSBTcGVjaWZpZXI6OkRFU0lHTl9NT0RFTF9LSU5EOgorCQkJCXsKKwkJCQkJaWYoIG1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZSA9PSBOVUxMICkKKwkJCQkJeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQlWZWN0b3JPZkV4ZWN1dGFibGVGb3JtOjpjb25zdF9pdGVyYXRvciBpdEV4ZWMgPQorCQkJCQkJCW1UYWJsZW9mUnVudGltZUV4ZWN1dGFibGUuYmVnaW4oKTsKKwkJCQkJVmVjdG9yT2ZFeGVjdXRhYmxlRm9ybTo6Y29uc3RfaXRlcmF0b3IgZW5kRXhlYyA9CisJCQkJCQkJbVRhYmxlb2ZSdW50aW1lRXhlY3V0YWJsZS5lbmQoKTsKKwkJCQkJZm9yKCBhdm1fc2l6ZV90IGluZGV4RXhlYyA9IDAgOyBpdEV4ZWMgIT0gZW5kRXhlYyA7CisJCQkJCQkJKytpdEV4ZWMgLCArK2luZGV4RXhlYyApCisJCQkJCXsKKwkJCQkJCWlmKCAoKml0RXhlYyktPmhhc1RyYW5zaXRpb24oKSApCisJCQkJCQl7CisJCQkJCQkJb3NzLnN0cigiIik7CisKKwkJCQkJCQlvc3MgPDwgVEFCMiA8PCAibW9kZWwiOworCQkJCQkJCWlmKCBub3QgKCppdEV4ZWMpLT5pc1JlYWNoYWJsZVN0YXRlKCkgKQorCQkJCQkJCXsKKwkJCQkJCQkJb3NzIDw8ICJbIE5PIElOQ09NSU5HIFRSQU5TSVRJT04gXSI7CisJCQkJCQkJfQorCQkJCQkJCW9zcyA8PCAiIDo+ICIgPDwgKCppdEV4ZWMpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IEVPTDsKKworCQkJCQkJCWhhc09uZVVuY292ZXJkVHJhbnNpdGlvbiA9IGZhbHNlOworCisJCQkJCQkJZW5kT2Zmc2V0ID0gKCppdEV4ZWMpLT5nZXRUcmFuc2l0aW9uKCkuc2l6ZSgpOworCQkJCQkJCWZvciggb2Zmc2V0ID0gMCA7IG9mZnNldCA8IGVuZE9mZnNldCA7ICsrb2Zmc2V0ICkKKwkJCQkJCQl7CisJCQkJCQkJCWl0VHJhbnNpdGlvbiA9ICgqaXRFeGVjKS0+Z2V0VHJhbnNpdGlvbigpLnJhd0F0KG9mZnNldCk7CisKKwkJCQkJCQkJaWYoIG5vdCBtRXhlY3V0YWJsZUNvdmVyYWdlVGFibGUtPgorCQkJCQkJCQkJCWF0KCgqaXRFeGVjKS0+Z2V0T2Zmc2V0KCkpLT50ZXN0KCBvZmZzZXQgKSApCisJCQkJCQkJCXsKKwkJCQkJCQkJCWhhc09uZVVuY292ZXJkVHJhbnNpdGlvbiA9IHRydWU7CisJCQkJCQkJCQlvc3MgPDwgVEFCMyA8PCBpdFRyYW5zaXRpb24tPgorCQkJCQkJCQkJCQlzdHJUcmFuc2l0aW9uSGVhZGVyKCkgPDwgRU9MOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCWlmKCBoYXNPbmVVbmNvdmVyZFRyYW5zaXRpb24gKQorCQkJCQkJCXsKKwkJCQkJCQkJb3MgPDwgb3NzLnN0cigpIDw8IEVPTDsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJaWYoIG1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZSAhPSBOVUxMICkKKwkJCQkJeworCQkJCQkJVmVjdG9yT2ZFeGVjdXRhYmxlRm9ybTo6Y29uc3RfaXRlcmF0b3IgaXRFeGVjID0KKwkJCQkJCQkJbVRhYmxlb2ZSdW50aW1lRXhlY3V0YWJsZS5iZWdpbigpOworCQkJCQkJVmVjdG9yT2ZFeGVjdXRhYmxlRm9ybTo6Y29uc3RfaXRlcmF0b3IgZW5kRXhlYyA9CisJCQkJCQkJCW1UYWJsZW9mUnVudGltZUV4ZWN1dGFibGUuZW5kKCk7CisJCQkJCQlhdm1fc2l6ZV90IGluZGV4RXhlYyA9IDA7CisJCQkJCQlmb3IoIDsgaXRFeGVjICE9IGVuZEV4ZWMgOyArK2l0RXhlYyAsICsraW5kZXhFeGVjICkKKwkJCQkJCXsKKwkJCQkJCQlpZiggKCppdEV4ZWMpLT5oYXNUcmFuc2l0aW9uKCkgKQorCQkJCQkJCXsKKwkJCQkJCQkJb3NzLnN0cigiIik7CisKKwkJCQkJCQkJb3NzIDw8IFRBQjIgPDwgIm1vZGVsIjsKKwkJCQkJCQkJaWYoIG5vdCAoKml0RXhlYyktPmlzUmVhY2hhYmxlU3RhdGUoKSApCisJCQkJCQkJCXsKKwkJCQkJCQkJCW9zcyA8PCAiWyBOTyBJTkNPTUlORyBUUkFOU0lUSU9OIF0iOworCQkJCQkJCQl9CisJCQkJCQkJCW9zcyA8PCAiIDo+ICIgPDwgKCppdEV4ZWMpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IEVPTDsKKworCisJCQkJCQkJCWhhc09uZVVuY292ZXJkVHJhbnNpdGlvbiA9IGZhbHNlOworCisJCQkJCQkJCWVuZE9mZnNldCA9ICgqaXRFeGVjKS0+Z2V0VHJhbnNpdGlvbigpLnNpemUoKTsKKwkJCQkJCQkJZm9yKCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgZW5kT2Zmc2V0IDsgKytvZmZzZXQgKQorCQkJCQkJCQl7CisJCQkJCQkJCQlpdFRyYW5zaXRpb24gPSAoKml0RXhlYyktPmdldFRyYW5zaXRpb24oKS5yYXdBdChvZmZzZXQpOworCisJCQkJCQkJCQlpZiggbm90IG1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZS0+CisJCQkJCQkJCQkJCWF0KCgqaXRFeGVjKS0+Z2V0T2Zmc2V0KCkpLT50ZXN0KCBvZmZzZXQgKSApCisJCQkJCQkJCQl7CisJCQkJCQkJCQkJaGFzT25lVW5jb3ZlcmRUcmFuc2l0aW9uID0gdHJ1ZTsKKwkJCQkJCQkJCQlvc3MgPDwgVEFCMyA8PCBpdFRyYW5zaXRpb24tPgorCQkJCQkJCQkJCQkJc3RyVHJhbnNpdGlvbkhlYWRlcigpIDw8IEVPTDsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCQlpZiggaGFzT25lVW5jb3ZlcmRUcmFuc2l0aW9uICkKKwkJCQkJCQkJeworCQkJCQkJCQkJb3MgPDwgb3NzLnN0cigpIDw8IEVPTDsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCWlmKCBtVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUgIT0gTlVMTCApCisJCQkJCXsKKwkJCQkJCWF2bV9zaXplX3QgZW5kTWFjaGluZSA9IG1UcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZS0+c2l6ZSgpOworCQkJCQkJYXZtX3NpemVfdCBpdE1hY2hpbmUgPSAwOworCQkJCQkJZm9yKCA7IGl0TWFjaGluZSA8IGVuZE1hY2hpbmUgOyArK2l0TWFjaGluZSApCisJCQkJCQl7CisJCQkJCQkJYVJJRCA9IGFuRUQuZ2V0UnVudGltZUlEKGl0TWFjaGluZSk7CisJCQkJCQkJaWYoIGFSSUQuZ2V0RXhlY3V0YWJsZSgpLT5oYXNUcmFuc2l0aW9uKCkgKQorCQkJCQkJCXsKKwkJCQkJCQkJb3NzLnN0cigiIik7CisKKwkJCQkJCQkJb3NzIDw8IFRBQjIgPDwgImluc3RhbmNlIjsKKwkJCQkJCQkJaWYoIG5vdCBhUklELmdldEV4ZWN1dGFibGUoKS0+aXNSZWFjaGFibGVTdGF0ZSgpICkKKwkJCQkJCQkJeworCQkJCQkJCQkJb3NzIDw8ICJbIE5PIElOQ09NSU5HIFRSQU5TSVRJT04gXSI7CisJCQkJCQkJCX0KKwkJCQkJCQkJb3NzIDw8ICIgOj4gIiA8PCBhUklELmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgRU9MOworCisJCQkJCQkJCWhhc09uZVVuY292ZXJkVHJhbnNpdGlvbiA9IGZhbHNlOworCisJCQkJCQkJCWVuZE9mZnNldCA9IGFSSUQuZ2V0RXhlY3V0YWJsZSgpLT5nZXRUcmFuc2l0aW9uKCkuc2l6ZSgpOworCQkJCQkJCQlmb3IoIG9mZnNldCA9IDAgOyBvZmZzZXQgPCBlbmRPZmZzZXQgOyArK29mZnNldCApCisJCQkJCQkJCXsKKwkJCQkJCQkJCWl0VHJhbnNpdGlvbiA9IGFSSUQuZ2V0RXhlY3V0YWJsZSgpLT4KKwkJCQkJCQkJCQkJZ2V0VHJhbnNpdGlvbigpLnJhd0F0KG9mZnNldCk7CisKKwkJCQkJCQkJCWlmKCAobm90IG1UcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZS0+CisJCQkJCQkJCQkJCWF0KGFSSUQuZ2V0T2Zmc2V0KCkpLT50ZXN0KG9mZnNldCkpCisJCQkJCQkJCQkJJiYgbUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlLT4KKwkJCQkJCQkJCQkJYXQoYVJJRC5nZXRFeGVjdXRhYmxlKCktPmdldE9mZnNldCgpKS0+CisJCQkJCQkJCQkJCQl0ZXN0KG9mZnNldCkgKQorCQkJCQkJCQkJeworCQkJCQkJCQkJCWhhc09uZVVuY292ZXJkVHJhbnNpdGlvbiA9IHRydWU7CisJCQkJCQkJCQkJb3NzIDw8IFRBQjMgPDwgaXRUcmFuc2l0aW9uLT4KKwkJCQkJCQkJCQkJCXN0clRyYW5zaXRpb25IZWFkZXIoKSA8PCBFT0w7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQkJaWYoIGhhc09uZVVuY292ZXJkVHJhbnNpdGlvbiApCisJCQkJCQkJCXsKKwkJCQkJCQkJCW9zIDw8IG9zcy5zdHIoKSA8PCBFT0w7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoIGlzUmVwb3J0RGV0YWlscygpICYmIG1Db3ZlcmFnZVN0YXRpc3RpY3MuaGFzVW5jb3ZlcmVkKCkgKQorCQl7CisJCQltQ292ZXJhZ2VTdGF0aXN0aWNzLnRvU3RyZWFtQ292ZXJhZ2VSYXRlKCBvcyA8PCBUQUIyLAorCQkJCQkiUmVzdWx0czogPDwgIiwgIiBvbiAiLCIgPj4gYXJlIGNvdmVyZWQgIVxuIiApOworCQl9CisJfQorCisJaWYoIG1TbGljZUZsYWcgKQorCXsKKwkJb3MgPDwgVEFCMiA8PCAiTnVtYmVyIG9mIG5vZGVzIGN1dCBiYWNrOiAiIDw8IG1TbGljZUNvdW50IDw8IEVPTDsKKwl9CisKKwlvcyA8PCBzdGQ6OmZsdXNoOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBOT04tUkVHUkVTU0lPTiBURVNUIEFQSQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBUcmFuc2l0aW9uQ292ZXJhZ2VGaWx0ZXI6OnRkZFJlZ3Jlc3Npb25SZXBvcnRJbXBsKE91dFN0cmVhbSAmIG9zKQoreworCW9zIDw8IFRBQjEgPDwgIkNPVkVSRUQgVFJBTlNJVElPTlMgOiAiOworCWlmKCBtQ292ZXJhZ2VTdGF0aXN0aWNzLmdvYWxBY2hpZXZlZCgpICkKKwl7CisJCW9zIDw8IG1Db3ZlcmFnZVN0YXRpc3RpY3MubU51bWJlck9mRWxlbWVudHMgPDwgIiAvICIKKwkJCQk8PCBtQ292ZXJhZ2VTdGF0aXN0aWNzLm1OdW1iZXJPZkVsZW1lbnRzIDw8IEVPTDsKKwl9CisJZWxzZQorCXsKKwkJb3MgPDwgbUNvdmVyYWdlU3RhdGlzdGljcy5nZXROdW1iZXJPZlVuY292ZXJlZCgpIDw8ICIgLyAiCisJCQkJPDwgbUNvdmVyYWdlU3RhdGlzdGljcy5tTnVtYmVyT2ZFbGVtZW50cyA8PCBFT0w7CisJfQorCisvLyQJaWYoIG1TbGljZUZsYWcgKQorLy8JeworLy8JCW9zIDw8IFRBQjIgPDwgIk51bWJlciBvZiBub2RlcyBjdXQgYmFjazogIiA8PCBtU2xpY2VDb3VudCA8PCBFT0w7CisvLyQJfQorCisJb3MgPDwgc3RkOjpmbHVzaDsKK30KKworCisKKy8qKgorICogUFJFLUZJTFRFUgorICovCitib29sIFRyYW5zaXRpb25Db3ZlcmFnZUZpbHRlcjo6cHJlZmlsdGVyKCkKK3sKKwlib29sIG1Db25kaXRpb24gPQorCQkJKCBtTmJDb3ZlcmFnZSA+IG1Db3ZlcmFnZVN0YXRpc3RpY3MubU51bWJlck9mRWxlbWVudHMgKSA/CisJCQltQ292ZXJhZ2VTdGF0aXN0aWNzLmdvYWxBY2hpZXZlZCgpICYmIG1TdG9wRmxhZyA6CisJCQkobUNvdmVyYWdlU3RhdGlzdGljcy5tTnVtYmVyT2ZDb3ZlcmVkID49IG1OYkNvdmVyYWdlKTsKKworCWlmKCBtQ29uZGl0aW9uICkKKwl7CisJCWdldFN5bWJleFJlcXVlc3RNYW5hZ2VyKCkucG9zdFJlcXVlc3RTdG9wKCB0aGlzICk7CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiggZ2V0RXhlY3V0aW9uUXVldWUoKS5oYXNSZWFkeSgpICk7Cit9CisKKworLyoqCisgKiBwb3N0RXZhbCBGaWx0ZXIKKyAqLworYm9vbCBUcmFuc2l0aW9uQ292ZXJhZ2VGaWx0ZXI6OnBvc3RmaWx0ZXIoKQoreworCWVjUXVldWUgPSAmKCBnZXRFeGVjdXRpb25RdWV1ZSgpLmdldFJlc3VsdFF1ZXVlKCkgKTsKKworCWlmKCBtQ292ZXJhZ2VTdGF0aXN0aWNzLmhhc1VuY292ZXJlZCgpICkKKwl7CisJCW1Db3ZlcmFnZVN0YXRpc3RpY3MuYmFja3VwQ292ZXJlZCgpOworCisJCWVjUXVldWVJdCA9IGVjUXVldWUtPmJlZ2luKCk7CisJCWVjUXVldWVJdEVuZCA9IGVjUXVldWUtPmVuZCgpOworCQlmb3IoIDsgZWNRdWV1ZUl0ICE9IGVjUXVldWVJdEVuZCA7ICsrZWNRdWV1ZUl0ICkKKwkJeworCQkJaXRFbmRFQyA9ICgqZWNRdWV1ZUl0KS0+ZW5kKCk7CisJCQlmb3IoIGl0RUMgPSAoKmVjUXVldWVJdCktPmJlZ2luKCkgOyAoaXRFQyAhPSBpdEVuZEVDKSA7ICsraXRFQyApCisJCQl7CisJCQkJdXBkYXRlVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUoKCppdEVDKSAsCisJCQkJCQkoKml0RUMpLT5nZXRSdW5uYWJsZUVsZW1lbnRUcmFjZSgpKTsKKwkJCX0KKwkJfQorCisKKwkJaWYoIG1IZXVyaXN0aWNQcm9wZXJ0eS5tSGV1cmlzdGljRW5hYmxlZCApCisJCXsKKwkJCWlmKCBtVHJhY2VEaXJlY3RpdmVSdW5uaW5nRmxhZyApCisJCQl7CisJCQkJaWYoIHJ1blRyYWNlRHJpdmVyKCkgKQorCQkJCXsKKwkJCQkJLy8hISBDb250aW51ZSBkcml2ZW4KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJZ2V0U3ltYmV4UmVxdWVzdE1hbmFnZXIoKS5wb3N0UmVxdWVzdFJlcXVldWVXYWl0aW5nKCB0aGlzICk7CisJCQkJfQorCisJCQkJaWYoIG1UcmFjZURpcmVjdGl2ZVJ1bm5pbmdGbGFnICkKKwkJCQl7CisJCQkJCWlmKCBub3QgbUNvdmVyYWdlU3RhdGlzdGljcy51cGRhdGVGYWlsZWRTdGVwKCkgKQorCQkJCQl7CisJCQkJCQltQ292ZXJhZ2VTdGF0aXN0aWNzLnJlc2V0RmFpbGVkU3RlcCgpOworCQkJCQl9CisKKwkJCQkJcmV0dXJuKCBnZXRFeGVjdXRpb25RdWV1ZSgpLmhhc1Jlc3VsdCgpICk7CisJCQkJfQorCQkJfQorCisKKwkJCWlmKCBtQ292ZXJhZ2VTdGF0aXN0aWNzLnVwZGF0ZUZhaWxlZFN0ZXAoKSApCisJCQl7CisJCQkJLy8hISEgVE9ETyBvcHRpbWl6YXRpb24KKwkJCQlpZiggbUNvdmVyYWdlU3RhdGlzdGljcy5pc1NlcmlvdXNseUZhaWxlZFN0ZXAoKSApCisJCQkJeworCQkJCQltSGV1cmlzdGljUHJvcGVydHkuaW5jckhldXJpc3RpY0NsYXNzKCk7CisKKwkJCQkJZ2V0U3ltYmV4UmVxdWVzdE1hbmFnZXIoKS5wb3N0UmVxdWVzdFJlcXVldWVXYWl0aW5nKCB0aGlzICk7CisKKworQVZNX0lGX0RFQlVHX0ZMQUcoIFBST0NFU1NPUiApCisJQVZNX09TX0lORk8gPDwgRU1QSEFTSVMobUhldXJpc3RpY1Byb3BlcnR5LnN0ckhldXJpc3RpY0NsYXNzKCksICcqJywgODApOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFBST0NFU1NPUiApCisJCQkJfQorCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCW1Db3ZlcmFnZVN0YXRpc3RpY3MudG9TdHJlYW1GYWlsZWRTdGVwKEFWTV9PU19DT1VULAorCQkJIk5vIG5ldyB0cmFuc2l0aW9uIGNvdmVyZWQgc2luY2UgPDwgIiwgIiBzdGVwIiwgIiA+PiAhISFcbiIpOworCW1Db3ZlcmFnZVN0YXRpc3RpY3MudG9TdHJlYW1GYWlsZWRTdGVwKEFWTV9PU19UUkFDRSwKKwkJCSJObyBuZXcgdHJhbnNpdGlvbiBjb3ZlcmVkIHNpbmNlIDw8ICIsICIgc3RlcCIsICIgPj4gISEhXG4iKTsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJbUNvdmVyYWdlU3RhdGlzdGljcy5yZXNldEZhaWxlZFN0ZXAoKTsKKwkJCX0KKworCisJCQlzd2l0Y2goIG1IZXVyaXN0aWNQcm9wZXJ0eS5tSGV1cmlzdGljQ2xhc3MgKQorCQkJeworCQkJCWNhc2UgSUhldXJpc3RpY0NsYXNzOjpIRVVSSVNUSUNfQkFTSUNfQ0xBU1M6CisJCQkJeworCQkJCQltSGV1cmlzdGljUHJvcGVydHkubUhldXJpc3RpY0NsYXNzID0KKwkJCQkJCQlJSGV1cmlzdGljQ2xhc3M6OkhFVVJJU1RJQ19CQVNJQ19DTEFTUzsKKworCQkJCQloZXVyaXN0aWNOYWl2ZUNsYXNzSW1wbCgpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2FzZSBJSGV1cmlzdGljQ2xhc3M6OkhFVVJJU1RJQ19OQUlWRV9DTEFTUzoKKwkJCQl7CisJCQkJCWhldXJpc3RpY05haXZlQ2xhc3NJbXBsKCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljYXNlIElIZXVyaXN0aWNDbGFzczo6SEVVUklTVElDX1NNQVJUX0NMQVNTOgorCQkJCXsKKwkJCQkJaGV1cmlzdGljU21hcnRDbGFzc0ltcGwoKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJY2FzZSBJSGV1cmlzdGljQ2xhc3M6OkhFVVJJU1RJQ19BR1JFU1NJVkVfQ0xBU1M6CisJCQkJeworCQkJCQloZXVyaXN0aWNBZ3Jlc3NpdmVDbGFzc0ltcGwoKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJY2FzZSBJSGV1cmlzdGljQ2xhc3M6OkhFVVJJU1RJQ19OT1RISU5HX0VMU0VfQ0xBU1M6CisJCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCWhldXJpc3RpY05vdGhpbmdFbHNlQ2xhc3NJbXBsKCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXJldHVybiggZ2V0RXhlY3V0aW9uUXVldWUoKS5oYXNSZXN1bHQoKSApOworfQorCisKKworLyoqCisgKiBIZXVyaXN0aWMgTkFJVkUgQ2xhc3MgaW1wbGVtZW50YXRpb24KKyAqLwordm9pZCBUcmFuc2l0aW9uQ292ZXJhZ2VGaWx0ZXI6OmhldXJpc3RpY05haXZlQ2xhc3NJbXBsKCkKK3sKKwlpZiggbUNvdmVyYWdlU3RhdGlzdGljcy5oYXNVbmNvdmVyZWQoKSApCisJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwltQ292ZXJhZ2VTdGF0aXN0aWNzLnRvU3RyZWFtQ292ZXJhZ2VSYXRlKEFWTV9PU19DT1VUICwKKwkJCSJOdW1iZXIgb2YgY292ZXJlZCB0cmFuc2l0aW9ucyA9ICIsICIgLyAiLCAiXG4iKTsKKworCW1Db3ZlcmFnZVN0YXRpc3RpY3MudG9TdHJlYW1Db3ZlcmFnZVJhdGUoQVZNX09TX1RSQUNFLAorCQkJIk51bWJlciBvZiBjb3ZlcmVkIHRyYW5zaXRpb25zID0gIiwgIiAvICIsICJcbiIpOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKworCQljb21wdXRlV2VpZ2h0T2ZSZXN1bHQoKTsKKworCQkvLyBjYXNlIG9mIGZvdW5kIHN0cm9uZyBoaXQgRUMKKwkJaWYoIG1TdHJvbmdseUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50ID4gMCApCisJCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX0lORk8gPDwgIj09PiBOZXh0IFsgU3Ryb25nbHkgXSBGaXJlYWJsZSBDb3VudCA6PiAiCisJCQk8PCBtU3Ryb25nbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudAorCQkJPDwgIiAgSGl0IENvdW50IDogIiA8PCBtU3Ryb25nbHlIaXRFQy5zaXplKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKworCQkJc2V0SGl0V2VpZ2h0KG1TdHJvbmdseUhpdEVDLCBXRUlHSFRfU0VMRUNURURfQUNISUVWQUJMRSwKKwkJCQkJbUhpdFN0cm9uZ2x5UmFuZG9tRmxhZywgbUhpdFN0cm9uZ2x5Q291bnQpOworCQl9CisKKwkJLy8gY2FzZSBvZiBoYXMgd2FpdGluZyBzdHJvbmcgaGl0IEVDCisJCWVsc2UgaWYoIGdldEV4ZWN1dGlvblF1ZXVlKCkuZ2V0V2FpdGluZ1N0cmF0ZWd5KCktPgorCQkJCWhhc1dhaXRpbmcoV0VJR0hUX1NUUk9OR0xZX0FDSElFVkFCTEUpICkKKwkJeworCQkJZ2V0U3ltYmV4UmVxdWVzdE1hbmFnZXIoKS5wb3N0UmVxdWVzdFJlcXVldWVXYWl0aW5nKCB0aGlzICk7CisJCX0KKworCQkvLyBjYXNlIG9mIGZvdW5kIHdlYWsgaGl0IEVDCisJCWVsc2UgaWYoIG1XZWFrbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCA+IDAgKQorCQl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCUFWTV9PU19JTkZPIDw8ICI9PT4gTmV4dCBbIFdlYWtseSBdIEZpcmVhYmxlIENvdW50IDo+ICIKKwkJCTw8IG1XZWFrbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudAorCQkJPDwgIiAgSGl0IENvdW50IDogIiA8PCBtV2Vha2x5SGl0RUMuc2l6ZSgpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisKKwkJCXNldEhpdFdlaWdodChtV2Vha2x5SGl0RUMsIFdFSUdIVF9TRUxFQ1RFRF9BQ0hJRVZBQkxFLAorCQkJCQltSGl0V2Vha2x5UmFuZG9tRmxhZywgbUhpdFdlYWtseUNvdW50KTsKKwkJfQorCisJCS8vISEhIFRPRE8gb3B0aW1pemF0aW9uCisJCWVsc2UvLyBpZiggbUNvdmVyYWdlU3RhdGlzdGljcy51cGRhdGVGYWlsZWRIZXVyaXN0aWMoKSApCisJCXsKKwkJCWdldFN5bWJleFJlcXVlc3RNYW5hZ2VyKCkucG9zdFJlcXVlc3RSZXF1ZXVlV2FpdGluZyggdGhpcyApOworCQl9CisJfQorfQorCisvKioKKyAqIEhldXJpc3RpYyBTTUFSVCBDbGFzcyBpbXBsZW1lbnRhdGlvbgorICovCit2b2lkIFRyYW5zaXRpb25Db3ZlcmFnZUZpbHRlcjo6aGV1cmlzdGljU21hcnRDbGFzc0ltcGwoKQoreworCWhldXJpc3RpY05haXZlQ2xhc3NJbXBsKCk7Cit9CisKKworLyoqCisgKiBIZXVyaXN0aWMgQUdSRVNTSVZFIENsYXNzIGltcGxlbWVudGF0aW9uCisgKi8KK3ZvaWQgVHJhbnNpdGlvbkNvdmVyYWdlRmlsdGVyOjpoZXVyaXN0aWNBZ3Jlc3NpdmVDbGFzc0ltcGwoKQoreworCWhldXJpc3RpY05haXZlQ2xhc3NJbXBsKCk7Cit9CisKKworLyoqCisgKiBIZXVyaXN0aWMgTk9USElORyBIRUxTRSBDbGFzcyBpbXBsZW1lbnRhdGlvbgorICovCit2b2lkIFRyYW5zaXRpb25Db3ZlcmFnZUZpbHRlcjo6aGV1cmlzdGljTm90aGluZ0Vsc2VDbGFzc0ltcGwoKQoreworCWNvbGxlY3RVbmNvdmVyZWRUcmFuc2l0aW9uKCk7CisKKwltSGV1cmlzdGljUHJvcGVydHkucmVzZXRIZXVyaXN0aWNDbGFzcygKKwkJCUlIZXVyaXN0aWNDbGFzczo6SEVVUklTVElDX05BSVZFX0NMQVNTKTsKKworQVZNX0lGX0RFQlVHX0ZMQUcoIFBST0NFU1NPUiApCisJQVZNX09TX0lORk8gPDwgRU1QSEFTSVMobUhldXJpc3RpY1Byb3BlcnR5LnN0ckhldXJpc3RpY0NsYXNzKCksICcqJywgODApOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFBST0NFU1NPUiApCisKKwloZXVyaXN0aWNOYWl2ZUNsYXNzSW1wbCgpOworCisKKwlpZiggbUNvdmVyYWdlU3RhdGlzdGljcy5nb2FsQWNoaWV2ZWRSYXRlKCkgKQorCXsKKwkJaWYoIG1TdG9wRmxhZyApCisJCXsKKwkJCWdldFN5bWJleFJlcXVlc3RNYW5hZ2VyKCkucG9zdFJlcXVlc3RTdG9wKCB0aGlzICk7CisJCX0KKworQVZNX0lGX0RFQlVHX0ZMQUcoIFBST0NFU1NPUiApCisJQVZNX09TX0lORk8gPDwgIioqKioqKiogSEVVUklTVElDIEdPQUwgQUNISUVWRUQgUkFURSA6ICIKKwkJCTw8IG1Db3ZlcmFnZVN0YXRpc3RpY3MubUNvdmVyYWdlUmF0ZUdvYWwgPDwgIiAlICoqKioqKioiIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBQUk9DRVNTT1IgKQorCX0KKworCWlmKCBtQ292ZXJhZ2VTdGF0aXN0aWNzLmdvYWxBY2hpZXZlZFJlc3QoKSApCisJeworCQlpZiggbVN0b3BGbGFnICkKKwkJeworCQkJZ2V0U3ltYmV4UmVxdWVzdE1hbmFnZXIoKS5wb3N0UmVxdWVzdFN0b3AoIHRoaXMgKTsKKwkJfQorCitBVk1fSUZfREVCVUdfRkxBRyggUFJPQ0VTU09SICkKKwlBVk1fT1NfSU5GTyA8PCAiKioqKioqKiBIRVVSSVNUSUMgR09BTCBBQ0hJRVZFRCBSRVNUIDogIgorCQkJPDwgbUNvdmVyYWdlU3RhdGlzdGljcy5tQ292ZXJhZ2VSZXN0R29hbCA8PCAiICoqKioqKioiIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBQUk9DRVNTT1IgKQorCX0KKworCisJaWYoICsrbUhldXJpc3RpY1Byb3BlcnR5Lm1IZXVyaXN0aWNUcmlhbHNDb3VudAorCQkJPiBtSGV1cmlzdGljUHJvcGVydHkubUhldXJpc3RpY1RyaWFsc0xpbWl0ICkKKwl7CisJCWlmKCBtU3RvcEZsYWcgKQorCQl7CisJCQlnZXRTeW1iZXhSZXF1ZXN0TWFuYWdlcigpLnBvc3RSZXF1ZXN0U3RvcCggdGhpcyApOworCQl9CisKK0FWTV9JRl9ERUJVR19GTEFHKCBQUk9DRVNTT1IgKQorCUFWTV9PU19JTkZPIDw8ICIqKioqKioqIEhFVVJJU1RJQyBUUklBTFMgU1RPUCA6ICIKKwkJCTw8IG1IZXVyaXN0aWNQcm9wZXJ0eS5tSGV1cmlzdGljVHJpYWxzTGltaXQKKwkJCTw8ICIgKioqKioqKiIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFBST0NFU1NPUiApCisJfQorfQorCisKKworLyoqCisgKiBDb21wdXRlIEhpdCBXZWlndGggZm9yIEV4ZWN1dGlvbiBDb250ZXh0CisgKi8KK3ZvaWQgVHJhbnNpdGlvbkNvdmVyYWdlRmlsdGVyOjpzZXRIaXRXZWlnaHQoVmVjdG9yT2ZFeGVjdXRpb25Db250ZXh0ICYgaGl0RUMsCisJCWF2bV91aW50OF90IGhpdFdlaWdodCwgYm9vbCByYW5kb21GbGFnLCBhdm1fc2l6ZV90IGhpdENvdW50KQoreworCWlmKCByYW5kb21GbGFnICYmIChoaXRDb3VudCA8IGhpdEVDLnNpemUoKSkgKQorCXsKKwkJbWF4UmFuZG9tT2Zmc2V0ID0gaGl0RUMuc2l6ZSgpIC0gMTsKKwkJcmFuZG9tT2Zmc2V0Qml0c2V0LnJlc2V0KCk7CisJCXJhbmRvbU9mZnNldEJpdHNldC5yZXNpemUobWF4UmFuZG9tT2Zmc2V0ICsgMSwgZmFsc2UpOworCisJCWZvciggOyAwIDwgaGl0Q291bnQgOyAtLWhpdENvdW50ICkKKwkJeworCQkJZG8KKwkJCXsKKwkJCQlvZmZzZXQgPSBSQU5ET006Omdlbl91aW50KDAsIG1heFJhbmRvbU9mZnNldCk7CisJCQl9CisJCQl3aGlsZSggcmFuZG9tT2Zmc2V0Qml0c2V0W29mZnNldF0gKTsKKworCQkJcmFuZG9tT2Zmc2V0Qml0c2V0W29mZnNldF0gPSB0cnVlOworCisJCQloaXRFQ1sgb2Zmc2V0IF0tPnNldFdlaWdodCggaGl0V2VpZ2h0ICk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX0lORk8gPDwgc3RkOjplbmRsIDw8IERFRkFVTFRfV1JBUF9EQVRBIDw8ICJISVQgOj4gIjsKKwloaXRFQ1sgb2Zmc2V0IF0tPnRyYWNlTWluaW11bShBVk1fT1NfQ09VVCApOworCWhpdEVDWyBvZmZzZXQgXS0+dHJhY2VNaW5pbXVtKEFWTV9PU19UUkFDRSk7CisJQVZNX09TX0lORk8gPDwgRU5EX1dSQVA7CisKKwlmaXJlYWJsZVRyYW5zaXRpb25UcmFjZShBVk1fT1NfQ09VVCAsIGhpdEVDWyBvZmZzZXQgXS0+cmVmRXhlY3V0aW9uRGF0YSgpKTsKKwlmaXJlYWJsZVRyYW5zaXRpb25UcmFjZShBVk1fT1NfVFJBQ0UsIGhpdEVDWyBvZmZzZXQgXS0+cmVmRXhlY3V0aW9uRGF0YSgpKTsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJCX0KKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwlBVk1fT1NfSU5GTyA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCX0KKworCWVsc2UKKwl7CisJCWlmKCBoaXRDb3VudCA+IGhpdEVDLnNpemUoKSApCisJCXsKKwkJCWhpdENvdW50ID0gaGl0RUMuc2l6ZSgpOworCQl9CisJCWZvciggb2Zmc2V0ID0gMCA7IG9mZnNldCA8IGhpdENvdW50IDsgKytvZmZzZXQgKQorCQl7CisJCQloaXRFQ1sgb2Zmc2V0IF0tPnNldFdlaWdodCggaGl0V2VpZ2h0ICk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX0lORk8gPDwgc3RkOjplbmRsIDw8IERFRkFVTFRfV1JBUF9EQVRBIDw8ICJISVQgOj4gIjsKKwloaXRFQ1sgb2Zmc2V0IF0tPnRyYWNlTWluaW11bShBVk1fT1NfQ09VVCApOworCWhpdEVDWyBvZmZzZXQgXS0+dHJhY2VNaW5pbXVtKEFWTV9PU19UUkFDRSk7CisJQVZNX09TX0lORk8gPDwgRU5EX1dSQVA7CisKKwlmaXJlYWJsZVRyYW5zaXRpb25UcmFjZShBVk1fT1NfQ09VVCAsIGhpdEVDWyBvZmZzZXQgXS0+cmVmRXhlY3V0aW9uRGF0YSgpKTsKKwlmaXJlYWJsZVRyYW5zaXRpb25UcmFjZShBVk1fT1NfVFJBQ0UsIGhpdEVDWyBvZmZzZXQgXS0+cmVmRXhlY3V0aW9uRGF0YSgpKTsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJCX0KKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwlBVk1fT1NfSU5GTyA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCisJfQorfQorCisvKgorICogd2VpZ2h0OiAxICBpZiBzb21lIHRyYW5zaXRpb24gb2YgbGVhZiBFQyB3aWxsICBiZSBmaXJlZAorICogd2VpZ2h0OiAyICBpZiBzb21lIHRyYW5zaXRpb24gb2YgbGVhZiBFQyBjb3VsZCBiZSBmaXJlZAorICogd2VpZ2h0OiAzICBlbHNlCisgKi8KK3ZvaWQgVHJhbnNpdGlvbkNvdmVyYWdlRmlsdGVyOjpjb21wdXRlV2VpZ2h0KEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDKQoreworCXN3aXRjaCggbUhldXJpc3RpY1Byb3BlcnR5Lm1IZXVyaXN0aWNDbGFzcyApCisJeworCQljYXNlIElIZXVyaXN0aWNDbGFzczo6SEVVUklTVElDX0JBU0lDX0NMQVNTOgorCQl7CisJCQltSGV1cmlzdGljUHJvcGVydHkubUhldXJpc3RpY0NsYXNzID0KKwkJCQkJSUhldXJpc3RpY0NsYXNzOjpIRVVSSVNUSUNfQkFTSUNfQ0xBU1M7CisKKwkJCWNvbXB1dGVXZWlnaHROYWl2ZSggYW5FQyApOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBJSGV1cmlzdGljQ2xhc3M6OkhFVVJJU1RJQ19OQUlWRV9DTEFTUzoKKwkJeworCQkJY29tcHV0ZVdlaWdodE5haXZlKCBhbkVDICk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIElIZXVyaXN0aWNDbGFzczo6SEVVUklTVElDX1NNQVJUX0NMQVNTOgorCQl7CisJCQljb21wdXRlV2VpZ2h0U21hcnQoIGFuRUMgKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBJSGV1cmlzdGljQ2xhc3M6OkhFVVJJU1RJQ19BR1JFU1NJVkVfQ0xBU1M6CisJCXsKKwkJCWNvbXB1dGVXZWlnaHRBZ3Jlc3NpdmUoIGFuRUMgKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBJSGV1cmlzdGljQ2xhc3M6OkhFVVJJU1RJQ19OT1RISU5HX0VMU0VfQ0xBU1M6CisJCWRlZmF1bHQ6CisJCXsKKwkJCWNvbXB1dGVXZWlnaHROYWl2ZSggYW5FQyApOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKwordm9pZCBUcmFuc2l0aW9uQ292ZXJhZ2VGaWx0ZXI6OmNvbXB1dGVXZWlnaHROYWl2ZShFeGVjdXRpb25Db250ZXh0ICogYW5FQykKK3sKKwlpZiggY29tcHV0ZUNoZWNrTm9uUHJpb3JpdHlXZWlnaHQoYW5FQykgKQorCXsKKwkJcmV0dXJuOworCX0KKworCWNvbXB1dGVQcmlvcml0eVdlaWdodChhbkVDKTsKKworCWlmKCBjaGVja1N0cm9uZ2x5UHJpb3JpdHlXZWlnaHQoYW5FQykgKQorCXsKKwkJcmV0dXJuOworCX0KKwllbHNlIGlmKCBjaGVja1dlYWtseVByaW9yaXR5V2VpZ2h0KGFuRUMpICkKKwl7CisJCXJldHVybjsKKwl9CisJZWxzZQorCXsKKwkJYW5FQy0+c2V0V2VpZ2h0KCBXRUlHSFRfVU5LTk9XTl9BQ0hJRVZBQkxFICk7CisJfQorfQorCisKK3ZvaWQgVHJhbnNpdGlvbkNvdmVyYWdlRmlsdGVyOjpjb21wdXRlV2VpZ2h0U21hcnQoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpCit7CisJY29tcHV0ZVByaW9yaXR5V2VpZ2h0KGFuRUMpOworCisJaWYoIGNoZWNrU3Ryb25nbHlQcmlvcml0eVdlaWdodChhbkVDKSApCisJeworCQlyZXR1cm47CisJfQorCisJZWxzZSBpZiggY29tcHV0ZUNoZWNrTm9uUHJpb3JpdHlXZWlnaHQoYW5FQykgKQorCXsKKwkJcmV0dXJuOworCX0KKworCWVsc2UgaWYoIGNoZWNrV2Vha2x5UHJpb3JpdHlXZWlnaHQoYW5FQykgKQorCXsKKwkJcmV0dXJuOworCX0KKwllbHNlCisJeworCQlhbkVDLT5zZXRXZWlnaHQoIFdFSUdIVF9VTktOT1dOX0FDSElFVkFCTEUgKTsKKwl9Cit9CisKKwordm9pZCBUcmFuc2l0aW9uQ292ZXJhZ2VGaWx0ZXI6OmNvbXB1dGVXZWlnaHRBZ3Jlc3NpdmUoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpCit7CisJY29tcHV0ZVByaW9yaXR5V2VpZ2h0KGFuRUMpOworCisJaWYoIGNoZWNrU3Ryb25nbHlQcmlvcml0eVdlaWdodChhbkVDKSApCisJeworCQlyZXR1cm47CisJfQorCWVsc2UgaWYoIGNoZWNrV2Vha2x5UHJpb3JpdHlXZWlnaHQoYW5FQykgKQorCXsKKwkJcmV0dXJuOworCX0KKwllbHNlCisJeworCQlhbkVDLT5zZXRXZWlnaHQoIFdFSUdIVF9VTktOT1dOX0FDSElFVkFCTEUgKTsKKwl9Cit9CisKKworYm9vbCBUcmFuc2l0aW9uQ292ZXJhZ2VGaWx0ZXI6OmNvbXB1dGVDaGVja05vblByaW9yaXR5V2VpZ2h0KAorCQlFeGVjdXRpb25Db250ZXh0ICogYW5FQykKK3sKKwlpZiggYW5FQy0+Z2V0SGVpZ2h0KCkgPiBtQ292ZXJhZ2VIZWlnaHQgKQorCXsKKwkJbUNvdmVyYWdlSGVpZ2h0UmVhY2hlZEZsYWcgPSB0cnVlOworCisJCWFuRUMtPnNldFdlaWdodCggV0VJR0hUX05PTl9QUklPUklUWSApOworCisJCXJldHVybiggdHJ1ZSApOworCX0KKwllbHNlIGlmKCBhbkVDLT5nZXRXZWlnaHQoKSAhPSBXRUlHSFRfTk9OX1BSSU9SSVRZICkKKwl7CisJCWlmKCBpc1RyaXZpYWxMb29wKGFuRUMpICkKKwkJeworCQkJYW5FQy0+c2V0V2VpZ2h0KCBXRUlHSFRfTk9OX0FDSElFVkFCTEUgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworLy8JCWlmKCBpc1N5bnRheGljTG9vcChhbkVDKSApCisvLwkJeworLy8JCQlhbkVDLT5zZXRXZWlnaHQoIFdFSUdIVF9OT05fQUNISUVWQUJMRSApOworLy8KKy8vCQkJcmV0dXJuKCB0cnVlICk7CisvLwkJfQorCisJCWVsc2UgaWYoIGlzQ29udHJvbExvb3AoYW5FQykgKQorCQl7CisJCQlhbkVDLT5zZXRXZWlnaHQoIFdFSUdIVF9OT05fUFJJT1JJVFkgKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKwordm9pZCBUcmFuc2l0aW9uQ292ZXJhZ2VGaWx0ZXI6OmNvbXB1dGVQcmlvcml0eVdlaWdodChFeGVjdXRpb25Db250ZXh0ICogYW5FQykKK3sKKwl0bXBTdHJvbmdseUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50ID0gMDsKKwl0bXBXZWFrbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCA9IDA7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCUFWTV9PU19JTkZPIDw8ICI6PiBmcm9tICI7ICBhbkVDLT50cmFjZU1pbmltdW0oQVZNX09TX1RSQUNFKTsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCisJLy8gY29tcHV0ZSA6PgorLy8JZmlyZWFibGVUcmFuc2l0aW9uQ291bnQoIGFuRUMtPmdldEFQRXhlY3V0aW9uRGF0YSgpICk7CisJZmlyZWFibGVUcmFuc2l0aW9uQ291bnQoIGFuRUMtPnJlZkV4ZWN1dGlvbkRhdGEoKSAsCisJCQlhbkVDLT5yZWZFeGVjdXRpb25EYXRhKCkuZ2V0U3lzdGVtUnVudGltZSgpICk7Cit9CisKKworCitib29sIFRyYW5zaXRpb25Db3ZlcmFnZUZpbHRlcjo6Y2hlY2tTdHJvbmdseVByaW9yaXR5V2VpZ2h0KAorCQlFeGVjdXRpb25Db250ZXh0ICogYW5FQykKK3sKKwlpZiggdG1wU3Ryb25nbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCA+IDAgKQorCXsKKwkJYW5FQy0+c2V0V2VpZ2h0KCBXRUlHSFRfU1RST05HTFlfQUNISUVWQUJMRSApOworCisJCWlmKCBtU3Ryb25nbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudAorCQkJPCB0bXBTdHJvbmdseUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50ICkKKwkJeworCQkJbVN0cm9uZ2x5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQgPQorCQkJCQl0bXBTdHJvbmdseUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50OworCisJCQltU3Ryb25nbHlIaXRFQy5jbGVhcigpOworCQkJbVN0cm9uZ2x5SGl0RUMuYXBwZW5kKCBhbkVDICk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCUFWTV9PU19JTkZPICA8PCAiPT0+IEhJVCBFQyBbIFN0cm9uZyA6ICIKKwkJCTw8IG1TdHJvbmdseUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50IDw8ICIgXTo+ICI7CisJYW5FQy0+dHJhY2VNaW5pbXVtKEFWTV9PU19DT1VUKTsKKwlhbkVDLT50cmFjZU1pbmltdW0oQVZNX09TX1RSQUNFKTsKKwlBVk1fT1NfSU5GTyA8PCBzdGQ6OmZsdXNoOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisKKwkJZWxzZSBpZiggbVN0cm9uZ2x5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQgPT0KKwkJCQl0bXBTdHJvbmdseUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50ICkKKwkJeworCQkJbVN0cm9uZ2x5SGl0RUMuYXBwZW5kKCBhbkVDICk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCUFWTV9PU19JTkZPICA8PCAiPT0+IEhJVCBFQyBbIFN0cm9uZyA6ICIKKwkJCTw8IG1TdHJvbmdseUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50IDw8ICIgXTo+ICI7CisJYW5FQy0+dHJhY2VNaW5pbXVtKEFWTV9PU19DT1VUKTsKKwlhbkVDLT50cmFjZU1pbmltdW0oQVZNX09TX1RSQUNFKTsKKwlBVk1fT1NfSU5GTyA8PCBzdGQ6OmZsdXNoOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJCX0KKworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKK2Jvb2wgVHJhbnNpdGlvbkNvdmVyYWdlRmlsdGVyOjpjaGVja1dlYWtseVByaW9yaXR5V2VpZ2h0KEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDKQoreworCWlmKCB0bXBXZWFrbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCA+IDAgKQorCXsKKwkJYW5FQy0+c2V0V2VpZ2h0KCBXRUlHSFRfV0VBS0xZX0FDSElFVkFCTEUgKTsKKworCQlpZiggbVdlYWtseUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50IDwgdG1wV2Vha2x5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQgKQorCQl7CisJCQltV2Vha2x5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQgPSB0bXBXZWFrbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudDsKKworCQkJbVdlYWtseUhpdEVDLmNsZWFyKCk7CisJCQltV2Vha2x5SGl0RUMuYXBwZW5kKCBhbkVDICk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCUFWTV9PU19JTkZPICA8PCAiPT0+IEhJVCBFQyBbIFdlYWsgOiAiCisJCQk8PCBtV2Vha2x5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQgPDwgIiBdOj4gIjsKKwlhbkVDLT50cmFjZU1pbmltdW0oQVZNX09TX0NPVVQpOworCWFuRUMtPnRyYWNlTWluaW11bShBVk1fT1NfVFJBQ0UpOworCUFWTV9PU19JTkZPIDw8IHN0ZDo6Zmx1c2g7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQllbHNlIGlmKCBtV2Vha2x5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQgPT0KKwkJCQl0bXBXZWFrbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCApCisJCXsKKwkJCW1XZWFrbHlIaXRFQy5hcHBlbmQoIGFuRUMgKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX0lORk8gIDw8ICI9PT4gSElUIEVDIFsgV2VhayA6ICIKKwkJCTw8IG1XZWFrbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCA8PCAiIF06PiAiOworCWFuRUMtPnRyYWNlTWluaW11bShBVk1fT1NfQ09VVCk7CisJYW5FQy0+dHJhY2VNaW5pbXVtKEFWTV9PU19UUkFDRSk7CisJQVZNX09TX0lORk8gPDwgc3RkOjpmbHVzaDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCQl9CisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKK3ZvaWQgVHJhbnNpdGlvbkNvdmVyYWdlRmlsdGVyOjpjb21wdXRlV2VpZ2h0T2ZSZXN1bHQoKQoreworCW1TdHJvbmdseUhpdEVDLmNsZWFyKCk7CisJbVN0cm9uZ2x5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQgPSAwOworCisJbVdlYWtseUhpdEVDLmNsZWFyKCk7CisJbVdlYWtseUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50ID0gMDsKKworCWVjUXVldWVJdCA9IGVjUXVldWUtPmJlZ2luKCk7CisJZm9yKCA7IGVjUXVldWVJdCAhPSBlY1F1ZXVlSXRFbmQgOyArK2VjUXVldWVJdCApCisJeworCQlpdEVuZEVDID0gKCplY1F1ZXVlSXQpLT5lbmQoKTsKKwkJZm9yKCBpdEVDID0gKCplY1F1ZXVlSXQpLT5iZWdpbigpIDsgKGl0RUMgIT0gaXRFbmRFQykgOyArK2l0RUMgKQorCQl7CisJCQljb21wdXRlV2VpZ2h0KCAqaXRFQyApOworCisvL0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisvLwlpZiggKCppdEVDKS0+Z2V0V2VpZ2h0KCkgPT0gV0VJR0hUX1NFTEVDVEVEX0FDSElFVkFCTEUgKQorLy8JeworLy8JCWZpcmVhYmxlVHJhbnNpdGlvblRyYWNlKEFWTV9PU19DT1VUICwgKCppdEVDKS0+Z2V0QVBFeGVjdXRpb25EYXRhKCkpOworLy8JCWZpcmVhYmxlVHJhbnNpdGlvblRyYWNlKEFWTV9PU19UUkFDRSwgKCppdEVDKS0+Z2V0QVBFeGVjdXRpb25EYXRhKCkpOworLy8JfQorLy9BVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCQl9CisJfQorCisJLy8gQ291bnQgb25lIHRpbWUgcGVyIHN0ZXAgQ292ZXJhZ2VIZWlnaHRSZWFjaGVkCisJaWYoIG1Db3ZlcmFnZUhlaWdodFJlYWNoZWRGbGFnICkKKwl7CisJCSsrbUNvdmVyYWdlSGVpZ2h0UmVhY2hlZENvdW50OworCisJCW1Db3ZlcmFnZUhlaWdodFJlYWNoZWRGbGFnID0gZmFsc2U7CisJfQorfQorCisKK3ZvaWQgVHJhbnNpdGlvbkNvdmVyYWdlRmlsdGVyOjpoYW5kbGVSZXF1ZXN0UmVxdWV1ZVdhaXRpbmdUYWJsZSgKKwkJV2FpdGluZ1N0cmF0ZWd5ICYgYVdhaXRpbmdTdHJhdGVneSwKKwkJYXZtX3VpbnQ4X3QgYVdlaWdodE1pbiwgYXZtX3VpbnQ4X3QgYVdlaWdodE1heCkKK3sKKwltQ292ZXJhZ2VTdGF0aXN0aWNzLnNldEZhaWxlZEhldXJpc3RpYygpOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfSU5GTyA8PCAiPj4+Pj4+PiBSRVFVRVNUIFJFUVVFVUUgPDw8PDw8PCIgPDwgc3RkOjplbmRsOworCisJQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBUUkFOU0lUSU9OICkKKwkJcmVwb3J0KEFWTV9PU19DT1VUKTsKKwkJcmVwb3J0KEFWTV9PU19UUkFDRSk7CisJQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBUUkFOU0lUSU9OICkKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCisJZG8KKwl7CisJCW1XYWl0aW5nUXVldWUuY2xlYXIoKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgUVVFVUUgKQorCWFXYWl0aW5nU3RyYXRlZ3kudG9TdHJlYW0oQVZNX09TX0NPVVQpOworCWFXYWl0aW5nU3RyYXRlZ3kudG9TdHJlYW0oQVZNX09TX1RSQUNFKTsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIFBST0NFU1NPUiAsIFFVRVVFICkKKworLy8JCWFXYWl0aW5nU3RyYXRlZ3kuc3BsaWNlUXVldWVUYWJsZShtV2FpdGluZ1F1ZXVlLCBhV2VpZ2h0TWF4KTsKKworCQlhV2VpZ2h0TWluID0gYVdhaXRpbmdTdHJhdGVneS5zcGxpY2VQcmlvclF1ZXVlVGFibGUoCisJCQkJbVdhaXRpbmdRdWV1ZSwgYVdlaWdodE1pbiwgYVdlaWdodE1heCk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX0lORk8gPDwgIlJFUVVFVUUgUVVFVUUgPDwgIiA8PCBzdHJIZXVyaXN0aWNXZWlnaHQoYVdlaWdodE1pbikKKwkJCTw8ICIgPj4gIiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCisKKwkJbVN0cm9uZ2x5SGl0RUMuY2xlYXIoKTsKKwkJbVN0cm9uZ2x5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQgPSAwOworCisJCW1XZWFrbHlIaXRFQy5jbGVhcigpOworCQltV2Vha2x5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQgPSAwOworCisJCWVjUXVldWVJdCA9IG1XYWl0aW5nUXVldWUuYmVnaW4oKTsKKwkJZWNRdWV1ZUl0RW5kID0gbVdhaXRpbmdRdWV1ZS5lbmQoKTsKKwkJZm9yKCA7IGVjUXVldWVJdCAhPSBlY1F1ZXVlSXRFbmQgOyArK2VjUXVldWVJdCApCisJCXsKKwkJCWNvbXB1dGVXZWlnaHQoICplY1F1ZXVlSXQgKTsKKworCQkJYVdhaXRpbmdTdHJhdGVneS5wdXNoKCAqZWNRdWV1ZUl0ICk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJaWYoICgqZWNRdWV1ZUl0KS0+Z2V0V2VpZ2h0KCkgPD0gV0VJR0hUX1NUUk9OR0xZX0FDSElFVkFCTEUgKQorCXsKKwkJQVZNX09TX0lORk8gIDw8IERFRkFVTFRfV1JBUF9EQVRBCisJCQkJPDwgIlJFUVVFVUUgY2FuZGlkYXRlIFsgPD0gU3Ryb25nbHkgXSA6PiAiOworCQkoKmVjUXVldWVJdCktPnRyYWNlTWluaW11bShBVk1fT1NfQ09VVCApOworCQkoKmVjUXVldWVJdCktPnRyYWNlTWluaW11bShBVk1fT1NfVFJBQ0UpOworCQlBVk1fT1NfSU5GTyA8PCBFTkRfV1JBUDsKKworCQlmaXJlYWJsZVRyYW5zaXRpb25UcmFjZShBVk1fT1NfQ09VVCwgKCplY1F1ZXVlSXQpLT5yZWZFeGVjdXRpb25EYXRhKCkpOworCQlmaXJlYWJsZVRyYW5zaXRpb25UcmFjZShBVk1fT1NfVFJBQ0UsKCplY1F1ZXVlSXQpLT5yZWZFeGVjdXRpb25EYXRhKCkpOworCX0KK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJCX0KKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgUVVFVUUgKQorCWFXYWl0aW5nU3RyYXRlZ3kudG9TdHJlYW0oQVZNX09TX0NPVVQpOworCWFXYWl0aW5nU3RyYXRlZ3kudG9TdHJlYW0oQVZNX09TX1RSQUNFKTsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIFBST0NFU1NPUiAsIFFVRVVFICkKKworCQkvLyBjYXNlIG9mIGZvdW5kIHN0cm9uZ2x5IGhpdCBFQworCQlpZiggbVN0cm9uZ2x5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQgPiAwICkKKwkJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwlBVk1fT1NfSU5GTyAgPDwgIj09PiBSRVFVRVVFIGNhbmRpZGF0ZSBbIFN0cm9uZ2x5IF0gRmlyZWFibGUgQ291bnQgOj4gIgorCQkJPDwgbVN0cm9uZ2x5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQKKwkJCTw8ICIgIEhpdCBDb3VudCA6ICIgPDwgbVN0cm9uZ2x5SGl0RUMuc2l6ZSgpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJCX0KKworCQkvLyBjYXNlIG9mIGZvdW5kIHdlYWtseSBoaXQgRUMKKwkJaWYoIG1XZWFrbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCA+IDAgKQorCQl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCUFWTV9PU19JTkZPIDw8ICI9PT4gUkVRVUVVRSBjYW5kaWRhdGUgWyBXZWFrbHkgXSBGaXJlYWJsZSBDb3VudCA6PiAiCisJCQk8PCBtV2Vha2x5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQKKwkJCTw8ICIgIEhpdCBDb3VudCA6ICIgPDwgbVdlYWtseUhpdEVDLnNpemUoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCQl9CisJfQorCXdoaWxlKCAoKCsrYVdlaWdodE1pbikgPD0gV0VJR0hUX05PTl9QUklPUklUWSkgJiYKKy8vCXdoaWxlKCAoKCsrYVdlaWdodE1pbikgPD0gYVdlaWdodE1heCkgJiYKKwkJCShtU3Ryb25nbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCA9PSAwKSApOworCisKKy8vQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwkvLyBQYXNzZXIgZW4gbW9kZSBESVJFQ1RJRiB2ZXJzIHVuZSB0cmFuc2l0aW9uIFdFQUtMWV9BQ0hJRVZBQkxFIMOgIGNvdXZyaXIKKwkvLyBDYWxjdWwgZCd1bmUgdHJhY2UgdmVycyBjZXR0ZSB0cmFuc2l0aW9uCisJaWYoIG1TdHJvbmdseUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50ID09IDAgKQorCXsKKwkJaWYoIGluaXRpYWxpemVUcmFjZURyaXZlcihhV2FpdGluZ1N0cmF0ZWd5KSApCisJCXsKKwkJCS8vISEgTk9USElORworCQl9CisJfQorLy9BVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorCisKKwlpZiggKG1Db3ZlcmFnZUhlaWdodFJlYWNoZWRDb3VudCA+IG1Db3ZlcmFnZUhlaWdodFJlYWNoZWRMaW1pdCkgJiYKKwkJCShtU3Ryb25nbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCA9PSAwKSApCisJeworCQltQ292ZXJhZ2VIZWlnaHRSZWFjaGVkQ291bnQgPSAwOworCQltQ292ZXJhZ2VIZWlnaHRSZWFjaGVkRmxhZyA9IGZhbHNlOworCisJCW1Db3ZlcmFnZUhlaWdodCArPSBtQ292ZXJhZ2VIZWlnaHRQZXJpb2Q7CisJCW1Db3ZlcmFnZUhlaWdodFJlYWNoZWRDb3VudCArPSBtQ292ZXJhZ2VIZWlnaHRSZWFjaGVkQ291bnQ7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX0lORk8gPDwgIlJFUVVFVUUgWyBjaHA6ICIgPDwgbUNvdmVyYWdlSGVpZ2h0UGVyaW9kCisJCQk8PCAiIF0gPT0+IE5ldyBDb3ZlcmFnZSBIZWlnaHQgOj4gIgk8PCBtQ292ZXJhZ2VIZWlnaHQgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFOU0lUSU9OICkKKwl9Cit9CisKKworYm9vbCBUcmFuc2l0aW9uQ292ZXJhZ2VGaWx0ZXI6OnRlc3RGaXJlYWJpbGl0eShjb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwKKwkJY29uc3QgUnVudGltZUlEICYgYVJlY2VpdmVyUklELCBBdm1UcmFuc2l0aW9uICogYVRyYW5zaXRpb24pCit7CisJaWYoIGFUcmFuc2l0aW9uLT5oYXNDb2RlKCkgJiYgYVRyYW5zaXRpb24tPmdldENvZGUoKS0+bm9uZW1wdHkoKSAmJgorCQkJYVRyYW5zaXRpb24tPmdldENvZGUoKS0+Zmlyc3QoKS5pczwgQXZtQ29kZSA+KCkgKQorCXsKKwkJY29uc3QgQXZtQ29kZSAqIGZpcnN0U3RhdGVtZW50ID0KKwkJCQlhVHJhbnNpdGlvbi0+Z2V0Q29kZSgpLT5maXJzdCgpLnRvX3B0cjwgQXZtQ29kZSA+KCk7CisKKwkJc3dpdGNoKCBmaXJzdFN0YXRlbWVudC0+Z2V0T3B0aW1pemVkT3BDb2RlKCkgKQorCQl7CisJCQljYXNlIEFWTV9PUENPREVfSU5QVVRfRU5WOgorCQkJY2FzZSBBVk1fT1BDT0RFX09VVFBVVF9FTlY6CisJCQl7CisJCQkJcmV0dXJuKCB0cnVlICk7CisJCQl9CisJCQlkZWZhdWx0OgorCQkJeworCQkJCWlmKCBmaXJzdFN0YXRlbWVudC0+aXNPcENvZGUoIEFWTV9PUENPREVfSU5QVVQgKSAmJgorCQkJCQlmaXJzdFN0YXRlbWVudC0+Zmlyc3QoKS5pczwgSW5zdGFuY2VPZlBvcnQgPigpICkKKwkJCQl7CisJCQkJCXJldHVybiggQXZtQ29tbXVuaWNhdGlvbkZhY3Rvcnk6OmNvbXB1dGVQcmVzZW5jZSgKKwkJCQkJCQlhbkVELCBhUmVjZWl2ZXJSSUQsCisJCQkJCQkJZmlyc3RTdGF0ZW1lbnQtPmZpcnN0KCkudG9fcHRyPCBJbnN0YW5jZU9mUG9ydCA+KCkpICk7CisJCQkJfQorCQkJCXJldHVybiggdHJ1ZSApOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworYm9vbCBUcmFuc2l0aW9uQ292ZXJhZ2VGaWx0ZXI6OmlzQ29udHJvbExvb3AoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpCit7CisJdG1wRUMgPSBhbkVDLT5nZXRQcmV2aW91cygpOworCWZvciggOyB0bXBFQyAhPSBOVUxMIDsgdG1wRUMgPSB0bXBFQy0+Z2V0UHJldmlvdXMoKSApCisJeworCQlpZiggYW5FQy0+cmVmRXhlY3V0aW9uRGF0YSgpLmdldFJ1bnRpbWVGb3JtU3RhdGVUYWJsZSgpLT5lcXVhbHNTdGF0ZSgKKwkJCQl0bXBFQy0+cmVmRXhlY3V0aW9uRGF0YSgpLmdldFJ1bnRpbWVGb3JtU3RhdGVUYWJsZSgpICkgKQorCQl7CisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCX0KKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKworYm9vbCBUcmFuc2l0aW9uQ292ZXJhZ2VGaWx0ZXI6OmlzU3ludGF4aWNMb29wKEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDKQoreworCXRtcEVDID0gYW5FQy0+Z2V0UHJldmlvdXMoKTsKKwlmb3IoIDsgdG1wRUMgIT0gTlVMTCA7IHRtcEVDID0gdG1wRUMtPmdldFByZXZpb3VzKCkgKQorCXsKKwkJaWYoIGFuRUMtPnJlZkV4ZWN1dGlvbkRhdGEoKS5nZXRSdW50aW1lRm9ybVN0YXRlVGFibGUoKS0+ZXF1YWxzU3RhdGUoCisJCQkJdG1wRUMtPnJlZkV4ZWN1dGlvbkRhdGEoKS5nZXRSdW50aW1lRm9ybVN0YXRlVGFibGUoKSApICkKKwkJeworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwl9CisJcmV0dXJuKCBmYWxzZSApOworfQorCisKK2Jvb2wgVHJhbnNpdGlvbkNvdmVyYWdlRmlsdGVyOjppc1RyaXZpYWxMb29wKEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDKQoreworCXRtcEVDID0gYW5FQy0+Z2V0UHJldmlvdXMoKTsKKwlmb3IoIDsgdG1wRUMgIT0gTlVMTCA7IHRtcEVDID0gdG1wRUMtPmdldFByZXZpb3VzKCkgKQorCXsKKwkJaWYoIGFuRUMtPnJlZkV4ZWN1dGlvbkRhdGEoKS5pc1RFUSggdG1wRUMtPmdldEV4ZWN1dGlvbkRhdGEoKSApICkKKwkJeworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwl9CisJcmV0dXJuKCBmYWxzZSApOworfQorCisKK3ZvaWQgVHJhbnNpdGlvbkNvdmVyYWdlRmlsdGVyOjpmaXJlYWJsZVRyYW5zaXRpb25Db3VudCgKKwkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQpCit7CisJdG1wRUYgPSBhUklELmdldEV4ZWN1dGFibGUoKTsKKworCXRtcFJ1bnRpbWVUcmFuc2l0aW9uQml0c2V0ID0gZ2V0Q292ZXJhZ2VUYWJsZUJpdHNldCggYVJJRCApOworCisJaWYoIHRtcFJ1bnRpbWVUcmFuc2l0aW9uQml0c2V0ID09IE5VTEwgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCS8vdG1wRUYtPmhhc1RyYW5zaXRpb24oKQorCWVsc2UgaWYoIHRtcFJ1bnRpbWVUcmFuc2l0aW9uQml0c2V0LT5hbnlGYWxzZSgpICkKKwl7CisJCUF2bVRyYW5zaXRpb24gKiBhUHJvZzsKKworCQlhdm1fc2l6ZV90IGVuZE9mZnNldCA9IHRtcEVGLT5nZXRUcmFuc2l0aW9uKCkuc2l6ZSgpOworCQlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMCA7IG9mZnNldCA8IGVuZE9mZnNldCA7ICsrb2Zmc2V0ICkKKwkJeworCQkJYVByb2cgPSB0bXBFRi0+Z2V0VHJhbnNpdGlvbigpLnJhd0F0KG9mZnNldCk7CisKKwkJCWlmKCBub3QgdG1wUnVudGltZVRyYW5zaXRpb25CaXRzZXQtPnRlc3QoYVByb2ctPmdldE9mZnNldCgpKSApCisJCQl7CisJCQkJdG1wV2Vha2x5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQgKz0gMTsKKworCQkJCWlmKCB0ZXN0RmlyZWFiaWxpdHkoYW5FRCwgYVJJRCwgYVByb2cpICkKKwkJCQl7CisJCQkJCXRtcFN0cm9uZ2x5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQgKz0gMTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX0lORk8gPDwgIj09PiBGaXJlYWJsZSA6PiAiIDw8IGFQcm9nLT5zdHJUcmFuc2l0aW9uSGVhZGVyKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJCQkJfQorCQkJfQorCQl9CisJfQorCisvLwllbHNlIGlmKCB0bXBSdW50aW1lVHJhbnNpdGlvbkJpdHNldC0+YWxsVHJ1ZSgpICkKKy8vCXsKKy8vCQlhbkVELnNldFJ1bnRpbWVGb3JtU3RhdGUoKCppdFJGKS0+Z2V0UklEKCksIFBST0NFU1NfU1VTUEVOREVEX1NUQVRFKTsKKy8vCX0KK30KKworCit2b2lkIFRyYW5zaXRpb25Db3ZlcmFnZUZpbHRlcjo6ZmlyZWFibGVUcmFuc2l0aW9uQ291bnQoCisJCWNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVEKQoreworCWF2bV9zaXplX3Qgb2Zmc2V0OworCWF2bV9zaXplX3QgZW5kT2Zmc2V0OworCUF2bVRyYW5zaXRpb24gKiBhUHJvZzsKKworCWl0UkYgPSBhbkVELmdldFRhYmxlT2ZSdW50aW1lKCkuYmVnaW4oKTsKKwllbmRSRiA9IGFuRUQuZ2V0VGFibGVPZlJ1bnRpbWUoKS5lbmQoKTsKKwlmb3IoIDsgKGl0UkYgIT0gZW5kUkYpIDsgKytpdFJGICkKKwl7CisJCWl0UklEID0gKCppdFJGKS0+Z2V0UklEKCk7CisKKwkJaWYoIG5vdCBhbkVELmlzSWRsZU9yUnVubmluZyggaXRSSUQgKSApCisJCXsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJdG1wRUYgPSBpdFJJRC5nZXRFeGVjdXRhYmxlKCk7CisKKwkJdG1wUnVudGltZVRyYW5zaXRpb25CaXRzZXQgPSBnZXRDb3ZlcmFnZVRhYmxlQml0c2V0KCBpdFJJRCApOworCisJCWlmKCB0bXBSdW50aW1lVHJhbnNpdGlvbkJpdHNldCA9PSBOVUxMICkKKwkJeworCQkJLy8hISBOT1RISU5HCisJCX0KKwkJLy90bXBFRi0+aGFzVHJhbnNpdGlvbigpCisJCWVsc2UgaWYoIGFuRUQuaXNJZGxlT3JSdW5uaW5nKCBpdFJJRCApICYmCisJCQkJdG1wUnVudGltZVRyYW5zaXRpb25CaXRzZXQtPmFueUZhbHNlKCkgKQorCQl7CisJCQllbmRPZmZzZXQgPSB0bXBFRi0+Z2V0VHJhbnNpdGlvbigpLnNpemUoKTsKKwkJCWZvciggb2Zmc2V0ID0gMCA7IG9mZnNldCA8IGVuZE9mZnNldCA7ICsrb2Zmc2V0ICkKKwkJCXsKKwkJCQlhUHJvZyA9IHRtcEVGLT5nZXRUcmFuc2l0aW9uKCkucmF3QXQob2Zmc2V0KTsKKworCQkJCWlmKCBub3QgdG1wUnVudGltZVRyYW5zaXRpb25CaXRzZXQtPnRlc3QoYVByb2ctPmdldE9mZnNldCgpKSApCisJCQkJeworCQkJCQl0bXBXZWFrbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCArPSAxOworCisJCQkJCWlmKCB0ZXN0RmlyZWFiaWxpdHkoYW5FRCwgaXRSSUQsIGFQcm9nKSApCisJCQkJCXsKKwkJCQkJCXRtcFN0cm9uZ2x5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQgKz0gMTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX0lORk8gPDwgIj09PiBGaXJlYWJsZSA6PiAiIDw8IGFQcm9nLT5zdHJUcmFuc2l0aW9uSGVhZGVyKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworLy8JCWVsc2UgaWYoIHRtcFJ1bnRpbWVUcmFuc2l0aW9uQml0c2V0LT5hbGxUcnVlKCkgKQorLy8JCXsKKy8vCQkJYW5FRC5zZXRSdW50aW1lRm9ybVN0YXRlKGl0UklELCBQUk9DRVNTX1NVU1BFTkRFRF9TVEFURSk7CisvLwkJfQorCisJfQorfQorCisKK3ZvaWQgVHJhbnNpdGlvbkNvdmVyYWdlRmlsdGVyOjpmaXJlYWJsZVRyYW5zaXRpb25Db3VudCgKKwkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQsIGNvbnN0IFJ1bnRpbWVGb3JtICYgYVJGKQoreworCWlmKCBub3QgYW5FRC5pc0lkbGVPclJ1bm5pbmcoIGFSRi5nZXRSSUQoKSApICkKKwl7CisJCXJldHVybjsKKwl9CisKKwl0bXBFRiA9IGFSRi5nZXRSSUQoKS5nZXRFeGVjdXRhYmxlKCk7CisKKwlpZiggdG1wRUYtPmhhc1RyYW5zaXRpb24oKSApCisJeworCQl0bXBSdW50aW1lVHJhbnNpdGlvbkJpdHNldCA9IGdldENvdmVyYWdlVGFibGVCaXRzZXQoIGFSRi5nZXRSSUQoKSApOworCisJCWlmKCB0bXBSdW50aW1lVHJhbnNpdGlvbkJpdHNldC0+YW55RmFsc2UoKSApCisJCXsKKwkJCUF2bVRyYW5zaXRpb24gKiBhUHJvZyA9IE5VTEw7CisKKwkJCWF2bV9zaXplX3QgZW5kT2Zmc2V0ID0gdG1wRUYtPmdldFRyYW5zaXRpb24oKS5zaXplKCk7CisJCQlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMCA7IG9mZnNldCA8IGVuZE9mZnNldCA7ICsrb2Zmc2V0ICkKKwkJCXsKKwkJCQlhUHJvZyA9IHRtcEVGLT5nZXRUcmFuc2l0aW9uKCkucmF3QXQob2Zmc2V0KTsKKworCQkJCWlmKCBub3QgdG1wUnVudGltZVRyYW5zaXRpb25CaXRzZXQtPnRlc3QoYVByb2ctPmdldE9mZnNldCgpKSApCisJCQkJeworCQkJCQlpZiggdGVzdEZpcmVhYmlsaXR5KGFuRUQsICBhUkYuZ2V0UklEKCksIGFQcm9nKSApCisJCQkJCXsKKwkJCQkJCXRtcFN0cm9uZ2x5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQgKz0gMTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX0lORk8gPDwgIj09PiBGaXJlYWJsZSA6PiAiIDw8IGFQcm9nLT5zdHJUcmFuc2l0aW9uSGVhZGVyKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQl0bXBXZWFrbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCArPSAxOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYoIGFSRi5oYXNDaGlsZCgpICkKKwl7CisJCVRhYmxlT2ZSdW50aW1lSUQ6OmNvbnN0X2l0ZXJhdG9yIGl0UklEID0gYVJGLmJlZ2luQ2hpbGQoKTsKKwkJVGFibGVPZlJ1bnRpbWVJRDo6Y29uc3RfaXRlcmF0b3IgaXRSSURFbmQgPSBhUkYuZW5kQ2hpbGQoKTsKKworCQlmb3IoIDsgaXRSSUQgIT0gaXRSSURFbmQgOyArK2l0UklEICkKKwkJeworCQkJaWYoIGFuRUQuaXNJZGxlT3JSdW5uaW5nKCAqaXRSSUQgKSApCisJCQl7CisJCQkJZmlyZWFibGVUcmFuc2l0aW9uQ291bnQoYW5FRCwgYW5FRC5nZXRSdW50aW1lKCppdFJJRCkpOworCQkJfQorCQl9CisJfQorfQorCisKKwordm9pZCBUcmFuc2l0aW9uQ292ZXJhZ2VGaWx0ZXI6OmZpcmVhYmxlVHJhbnNpdGlvblRyYWNlKAorCQlPdXRTdHJlYW0gJiBvcywgY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQpCit7CisJYXZtX3NpemVfdCBvZmZzZXQ7CisJYXZtX3NpemVfdCBlbmRPZmZzZXQ7CisJQXZtVHJhbnNpdGlvbiAqIGFQcm9nID0gTlVMTDsKKworCWl0UkYgPSBhbkVELmdldFRhYmxlT2ZSdW50aW1lKCkuYmVnaW4oKTsKKwllbmRSRiA9IGFuRUQuZ2V0VGFibGVPZlJ1bnRpbWUoKS5lbmQoKTsKKwlmb3IoIDsgKGl0UkYgIT0gZW5kUkYpIDsgKytpdFJGICkKKwl7CisJCWl0UklEID0gKCppdFJGKS0+Z2V0UklEKCk7CisKKwkJdG1wRUYgPSBpdFJJRC5nZXRFeGVjdXRhYmxlKCk7CisKKwkJdG1wUnVudGltZVRyYW5zaXRpb25CaXRzZXQgPSBnZXRDb3ZlcmFnZVRhYmxlQml0c2V0KCBpdFJJRCApOworCisJCWlmKCB0bXBSdW50aW1lVHJhbnNpdGlvbkJpdHNldCA9PSBOVUxMICkKKwkJeworCQkJLy8hISBOT1RISU5HCisJCX0KKwkJLy90bXBFRi0+aGFzVHJhbnNpdGlvbigpCisJCWVsc2UgaWYoIGFuRUQuaXNJZGxlT3JSdW5uaW5nKCBpdFJJRCApICkKKwkJeworCQkJaWYoIHRtcFJ1bnRpbWVUcmFuc2l0aW9uQml0c2V0LT5hbnlGYWxzZSgpICkKKwkJCXsKKwkJCQllbmRPZmZzZXQgPSB0bXBFRi0+Z2V0VHJhbnNpdGlvbigpLnNpemUoKTsKKwkJCQlmb3IoIG9mZnNldCA9IDAgOyBvZmZzZXQgPCBlbmRPZmZzZXQgOyArK29mZnNldCApCisJCQkJeworCQkJCQlhUHJvZyA9IHRtcEVGLT5nZXRUcmFuc2l0aW9uKCkucmF3QXQob2Zmc2V0KTsKKworCQkJCQlpZiggbm90IHRtcFJ1bnRpbWVUcmFuc2l0aW9uQml0c2V0LT4KKwkJCQkJCQl0ZXN0KGFQcm9nLT5nZXRPZmZzZXQoKSkgKQorCQkJCQl7CisJCQkJCQlpZiggdGVzdEZpcmVhYmlsaXR5KGFuRUQsIGl0UklELCBhUHJvZykgKQorCQkJCQkJeworCQkJCQkJCW9zIDw8ICI9PT4gWyBTdHJvbmdseSBdIEZpcmVhYmxlIDo+ICIKKwkJCQkJCQkJPDwgYVByb2ctPnN0clRyYW5zaXRpb25IZWFkZXIoKSA8PCBzdGQ6OmVuZGw7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJb3MgPDwgIj09PiBbIFdlYWtseSBdIEZpcmVhYmxlIDo+ICIKKwkJCQkJCQkJPDwgYVByb2ctPnN0clRyYW5zaXRpb25IZWFkZXIoKSA8PCBzdGQ6OmVuZGw7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisvLwkJCWVsc2UgaWYoIHRtcFJ1bnRpbWVUcmFuc2l0aW9uQml0c2V0LT5hbGxUcnVlKCkgKQorLy8JCQl7CisvLwkJCQlvcyA8PCAiPT0+IFsgc3VzcGVuZGVkICEgXSBtYWNoaW5lIDo+ICIKKy8vCQkJCQkJPDwgKCppdFJGKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCBzdGQ6OmVuZGw7CisvLwkJCX0KKwkJfQorCX0KK30KKworCit2b2lkIFRyYW5zaXRpb25Db3ZlcmFnZUZpbHRlcjo6ZmlyZWFibGVUcmFuc2l0aW9uVHJhY2UoT3V0U3RyZWFtICYgb3MsCisJCWNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVELCBjb25zdCBSdW50aW1lRm9ybSAmIGFSRikKK3sKKwl0bXBFRiA9IGFSRi5nZXRSSUQoKS5nZXRFeGVjdXRhYmxlKCk7CisKKwlpZiggdG1wRUYtPmhhc1RyYW5zaXRpb24oKSApCisJeworCQl0bXBSdW50aW1lVHJhbnNpdGlvbkJpdHNldCA9IGdldENvdmVyYWdlVGFibGVCaXRzZXQoIGFSRi5nZXRSSUQoKSApOworCisJCWlmKCB0bXBSdW50aW1lVHJhbnNpdGlvbkJpdHNldC0+YW55RmFsc2UoKSApCisJCXsKKwkJCUF2bVRyYW5zaXRpb24gKiBhUHJvZyA9IE5VTEw7CisKKwkJCWF2bV9zaXplX3QgZW5kT2Zmc2V0ID0gdG1wRUYtPmdldFRyYW5zaXRpb24oKS5zaXplKCk7CisJCQlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMCA7IG9mZnNldCA8IGVuZE9mZnNldCA7ICsrb2Zmc2V0ICkKKwkJCXsKKwkJCQlhUHJvZyA9IHRtcEVGLT5nZXRUcmFuc2l0aW9uKCkucmF3QXQob2Zmc2V0KTsKKworCQkJCWlmKCBub3QgdG1wUnVudGltZVRyYW5zaXRpb25CaXRzZXQtPnRlc3QoYVByb2ctPmdldE9mZnNldCgpKSApCisJCQkJeworCQkJCQlpZiggdGVzdEZpcmVhYmlsaXR5KGFuRUQsIGFSRi5nZXRSSUQoKSwgYVByb2cpICkKKwkJCQkJeworCQkJCQkJb3MgPDwgIj09PiBbIFN0cm9uZ2x5IF0gRmlyZWFibGUgOj4gIgorCQkJCQkJCQk8PCBhUHJvZy0+c3RyVHJhbnNpdGlvbkhlYWRlcigpIDw8IHN0ZDo6ZW5kbDsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCW9zIDw8ICI9PT4gWyBXZWFrbHkgXSBGaXJlYWJsZSA6PiAiCisJCQkJCQkJCTw8IGFQcm9nLT5zdHJUcmFuc2l0aW9uSGVhZGVyKCkgPDwgc3RkOjplbmRsOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYoIGFSRi5oYXNDaGlsZCgpICkKKwl7CisJCVRhYmxlT2ZSdW50aW1lSUQ6OmNvbnN0X2l0ZXJhdG9yIGl0UklEID0gYVJGLmJlZ2luQ2hpbGQoKTsKKwkJVGFibGVPZlJ1bnRpbWVJRDo6Y29uc3RfaXRlcmF0b3IgaXRSSURFbmQgPSBhUkYuZW5kQ2hpbGQoKTsKKworCQlmb3IoIDsgaXRSSUQgIT0gaXRSSURFbmQgOyArK2l0UklEICkKKwkJeworCQkJaWYoIGFuRUQuaXNJZGxlT3JSdW5uaW5nKCAqaXRSSUQgKSApCisJCQl7CisJCQkJZmlyZWFibGVUcmFuc2l0aW9uVHJhY2Uob3MsIGFuRUQsIGFuRUQuZ2V0UnVudGltZSgqaXRSSUQpKTsKKwkJCX0KKwkJfQorCX0KK30KKworCisvKioKKyAqIHVwZGF0ZVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlIHVzaW5nIG5ldyBmcmVzaCBFeGVjdXRpb24gQ29udGV4dAorICovCit2b2lkIFRyYW5zaXRpb25Db3ZlcmFnZUZpbHRlcjo6dXBkYXRlVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUoCisJCUV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDLCBjb25zdCBCRiAmIGFGaXJlZENvZGUpCit7CisJaWYoIGFGaXJlZENvZGUuaW52YWxpZCgpICkKKwl7CisJCXJldHVybjsKKwl9CisKKwkvLyBWw6lyaWZpY2F0aW9uIGRlIGxhIGNyw6lhdGlvbiBkZSBub3V2ZWxsZSBpbnN0YW5jZSBkeW5hbWlxdWUKKwkvLyBwYXIgbGEgY29tbWFuZGUgJHsgTkVXICwgRVhFQyB9CisJaWYoIChtU2NvcGUgIT0gU3BlY2lmaWVyOjpERVNJR05fTU9ERUxfS0lORCkgJiYKKwkJCShhbkVDLT5yZWZFeGVjdXRpb25EYXRhKCkuZ2V0VGFibGVPZlJ1bnRpbWUoKS5zaXplKCkgPgorCQkJCQltVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUtPnNpemUoKSkgKQorCXsKKwkJLy9UT0RPCisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2goIGFGaXJlZENvZGUuY2xhc3NLaW5kKCkgKQorCXsKKwkJY2FzZSBGT1JNX0FWTUNPREVfS0lORDoKKwkJeworCQkJY29uc3QgQkZDb2RlICYgYW5Bdm1Db2RlID0gYUZpcmVkQ29kZS5iZkNvZGUoKTsKKworCQkJQXZtQ29kZTo6aXRlcmF0b3IgaXRFbmQgPSBhbkF2bUNvZGUtPmVuZCgpOworCQkJZm9yKCBBdm1Db2RlOjppdGVyYXRvciBpdCA9IGFuQXZtQ29kZS0+YmVnaW4oKSA7IGl0ICE9IGl0RW5kIDsgKytpdCApCisJCQl7CisJCQkJdXBkYXRlVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUoYW5FQywgKCppdCkpOworCQkJfQorCisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgRk9STV9FWEVDVVRJT05fQ09ORklHVVJBVElPTl9LSU5EOgorCQl7CisJCQlFeGVjdXRpb25Db25maWd1cmF0aW9uICogYW5FeGVjQ29uZiA9CisJCQkJCWFGaXJlZENvZGUudG9fcHRyPCBFeGVjdXRpb25Db25maWd1cmF0aW9uID4oKTsKKworCQkJaWYoIGFuRXhlY0NvbmYtPmlzVHJhbnNpdGlvbigpICkKKwkJCXsKKwkJCQl1cGRhdGVUcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZShhbkVDLAorCQkJCQkJYW5FeGVjQ29uZi0+Z2V0UnVudGltZUlEKCksIGFuRXhlY0NvbmYtPmdldFRyYW5zaXRpb24oKSk7CisKKy8vCQkJCUF2bVRyYW5zaXRpb24gKiBmaXJlZFRyYW5zaXRpb24gPSBhbkV4ZWNDb25mLT5nZXRUcmFuc2l0aW9uKCk7CisvLworLy8JCQkJaWYoIG5vdCBtVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUtPgorLy8JCQkJCQlhdCggYW5FeGVjQ29uZi0+Z2V0UnVudGltZUlEKCkuZ2V0T2Zmc2V0KCkgKS0+CisvLwkJCQkJCXRlc3QoIGZpcmVkVHJhbnNpdGlvbi0+Z2V0T2Zmc2V0KCkgKSApCisvLwkJCQl7CisvLwkJCQkJbUNvdmVyYWdlU3RhdGlzdGljcy5hZGRDb3ZlcmVkRWxlbWVudCgpOworLy8KKy8vCQkJCQltVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUtPmF0KAorLy8JCQkJCQkJYW5FeGVjQ29uZi0+Z2V0UnVudGltZUlEKCkuZ2V0T2Zmc2V0KCkgKS0+CisvLwkJCQkJCQkJCXNldChmaXJlZFRyYW5zaXRpb24tPmdldE9mZnNldCgpLCB0cnVlKTsKKy8vCisvLwkJCQkJaWYoIG1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZSAhPSBOVUxMICkKKy8vCQkJCQl7CisvLwkJCQkJCW1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZS0+YXQoIGZpcmVkVHJhbnNpdGlvbi0+CisvLwkJCQkJCQkJZ2V0RXhlY3V0YWJsZUNvbnRhaW5lcigpLT5nZXRPZmZzZXQoKSApLT4KKy8vCQkJCQkJCQkJCXNldChmaXJlZFRyYW5zaXRpb24tPmdldE9mZnNldCgpLCB0cnVlKTsKKy8vCQkJCQl9CisvLworLy8JCQkJCWFuRUMtPmFkZEluZm8oKnRoaXMsIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3U3RyaW5nKAorLy8JCQkJCQkJZmlyZWRUcmFuc2l0aW9uLT5nZXROYW1lSUQoKSApICk7CisvLworLy8JCQkJCW1MaXN0T2ZQb3NpdGl2ZUVDLmFwcGVuZCggYW5FQyApOworCQkJfQorCisJCQlicmVhazsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisKK3ZvaWQgVHJhbnNpdGlvbkNvdmVyYWdlRmlsdGVyOjp1cGRhdGVUcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZSgKKwkJRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsCisJCUF2bVRyYW5zaXRpb24gKiBmaXJlZFRyYW5zaXRpb24pCit7CisJYm9vbCBpc05ld2x5Q292ZXJlZCA9IGZhbHNlOworCisJc3dpdGNoKCBtU2NvcGUgKQorCXsKKwkJY2FzZSBTcGVjaWZpZXI6OkRFU0lHTl9NT0RFTF9LSU5EOgorCQl7CisJCQlpZiggbm90IG1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZS0+YXQoIGZpcmVkVHJhbnNpdGlvbi0+CisJCQkJCWdldEV4ZWN1dGFibGVDb250YWluZXIoKS0+Z2V0T2Zmc2V0KCkgKS0+CisJCQkJCQkJdGVzdChmaXJlZFRyYW5zaXRpb24tPmdldE9mZnNldCgpKSApCisJCQl7CisJCQkJaXNOZXdseUNvdmVyZWQgPSB0cnVlOworCisJCQkJbUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlLT5hdCggZmlyZWRUcmFuc2l0aW9uLT4KKwkJCQkJCWdldEV4ZWN1dGFibGVDb250YWluZXIoKS0+Z2V0T2Zmc2V0KCkgKS0+CisJCQkJCQkJCXNldChmaXJlZFRyYW5zaXRpb24tPmdldE9mZnNldCgpLCB0cnVlKTsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFNwZWNpZmllcjo6REVTSUdOX0lOU1RBTkNFX0tJTkQ6CisJCXsKKwkJCWlmKCBub3QgbVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlLT5hdCggYVJJRC5nZXRPZmZzZXQoKSApLT4KKwkJCQkJdGVzdCggZmlyZWRUcmFuc2l0aW9uLT5nZXRPZmZzZXQoKSApICkKKwkJCXsKKwkJCQlpc05ld2x5Q292ZXJlZCA9IHRydWU7CisKKwkJCQltVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUtPmF0KCBhUklELmdldE9mZnNldCgpICktPgorCQkJCQkJc2V0KGZpcmVkVHJhbnNpdGlvbi0+Z2V0T2Zmc2V0KCksIHRydWUpOworCQkJfQorCisJCQlicmVhazsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCWlmKCBub3QgbVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlLT5hdCggYVJJRC5nZXRPZmZzZXQoKSApLT4KKwkJCQkJdGVzdCggZmlyZWRUcmFuc2l0aW9uLT5nZXRPZmZzZXQoKSApICkKKwkJCXsKKwkJCQlpc05ld2x5Q292ZXJlZCA9IHRydWU7CisKKwkJCQltVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUtPmF0KCBhUklELmdldE9mZnNldCgpICktPgorCQkJCQkJc2V0KGZpcmVkVHJhbnNpdGlvbi0+Z2V0T2Zmc2V0KCksIHRydWUpOworCisJCQkJaWYoIG1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZSAhPSBOVUxMICkKKwkJCQl7CisJCQkJCW1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZS0+YXQoIGZpcmVkVHJhbnNpdGlvbi0+CisJCQkJCQkJZ2V0RXhlY3V0YWJsZUNvbnRhaW5lcigpLT5nZXRPZmZzZXQoKSApLT4KKwkJCQkJCQkJCXNldChmaXJlZFRyYW5zaXRpb24tPmdldE9mZnNldCgpLCB0cnVlKTsKKwkJCQl9CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisJfQorCisKKwlpZiggaXNOZXdseUNvdmVyZWQgKQorCXsKKwkJbUNvdmVyYWdlU3RhdGlzdGljcy5hZGRDb3ZlcmVkRWxlbWVudCgpOworCisJCWFuRUMtPmdldHdGbGFncygpLmFkZENvdmVyYWdlRWxlbWVudFRyYWNlKCk7CisKKwkJYW5FQy0+YWRkSW5mbygqdGhpcywKKwkJCQlFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld1N0cmluZyggZmlyZWRUcmFuc2l0aW9uLT5nZXROYW1lSUQoKSApKTsKKworCQltTGlzdE9mUG9zaXRpdmVFQy5hcHBlbmQoIGFuRUMgKTsKKwl9Cit9CisKKworYm9vbCBUcmFuc2l0aW9uQ292ZXJhZ2VGaWx0ZXI6OnRlc3RUcmFuc2l0aW9uQ292ZXJhZ2UoQXZtVHJhbnNpdGlvbiAqIGZpcmVkVHJhbnNpdGlvbikKK3sKKwlzd2l0Y2goIG1TY29wZSApCisJeworCQljYXNlIFNwZWNpZmllcjo6REVTSUdOX01PREVMX0tJTkQ6CisJCXsKKwkJCXJldHVybiggbUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlLT5hdCggZmlyZWRUcmFuc2l0aW9uLT4KKwkJCQkJZ2V0RXhlY3V0YWJsZUNvbnRhaW5lcigpLT5nZXRPZmZzZXQoKSApLT4KKwkJCQkJCQl0ZXN0KGZpcmVkVHJhbnNpdGlvbi0+Z2V0T2Zmc2V0KCkpICk7CisJCX0KKworCQljYXNlIFNwZWNpZmllcjo6REVTSUdOX0lOU1RBTkNFX0tJTkQ6CisJCXsKKy8vCQkJcmV0dXJuKCBtVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUtPmF0KCBhUklELmdldE9mZnNldCgpICktPgorLy8JCQkJCXRlc3QoIGZpcmVkVHJhbnNpdGlvbi0+Z2V0T2Zmc2V0KCkgKSApOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCXJldHVybiggKG1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZSAhPSBOVUxMKSB8fAorCQkJCQltRXhlY3V0YWJsZUNvdmVyYWdlVGFibGUtPmF0KCBmaXJlZFRyYW5zaXRpb24tPgorCQkJCQlnZXRFeGVjdXRhYmxlQ29udGFpbmVyKCktPmdldE9mZnNldCgpICktPgorCQkJCQkJCXRlc3QoZmlyZWRUcmFuc2l0aW9uLT5nZXRPZmZzZXQoKSkgKTsKKwkJfQorCX0KK30KKworCisvKioKKyAqIG1UYWJsZW9mVW5jb3ZlcmVkVHJhbnNpdGlvbgorICovCit2b2lkIFRyYW5zaXRpb25Db3ZlcmFnZUZpbHRlcjo6Y29sbGVjdFVuY292ZXJlZFRyYW5zaXRpb24oKQoreworCWlmKCBtTGFzdENvbGxlY3RlZENvdmVyQ291bnQgPCBtQ292ZXJhZ2VTdGF0aXN0aWNzLm1OdW1iZXJPZkNvdmVyZWQgKQorCXsKKwkJbUxhc3RDb2xsZWN0ZWRDb3ZlckNvdW50ID0gbUNvdmVyYWdlU3RhdGlzdGljcy5tTnVtYmVyT2ZDb3ZlcmVkOworCisJCW1UYWJsZW9mVW5jb3ZlcmVkVHJhbnNpdGlvbi5jbGVhcigpOworCisvLwkJYXZtX3NpemVfdCBlbmRUcmFuc2l0aW9uID0gbVRhYmxlb2ZVbmNvdmVyZWRUcmFuc2l0aW9uLnNpemUoKTsKKy8vCQlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMCA7IG9mZnNldCA8IGVuZFRyYW5zaXRpb24gOyArK29mZnNldCApCisvLwkJeworLy8JCQlpZiggdGVzdFRyYW5zaXRpb25Db3ZlcmFnZShtVGFibGVvZlVuY292ZXJlZFRyYW5zaXRpb25bb2Zmc2V0XSkgKQorLy8JCQl7CisvLwkJCQltVGFibGVvZlVuY292ZXJlZFRyYW5zaXRpb25bb2Zmc2V0XSA9CisvLwkJCQkJCW1UYWJsZW9mVW5jb3ZlcmVkVHJhbnNpdGlvbltvZmZzZXRdOworLy8JCQl9CisvLwkJfQorCX0KKwllbHNlCisJeworCQlyZXR1cm47CisJfQorCisJY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0TWFpbkV4ZWN1dGlvbkRhdGEoKTsKKworCVJ1bnRpbWVJRCBhUklEOworCisJYXZtX3NpemVfdCBvZmZzZXQ7CisJYXZtX3NpemVfdCBlbmRPZmZzZXQ7CisJQXZtVHJhbnNpdGlvbiAqIGl0VHJhbnNpdGlvbjsKKworCXN3aXRjaCggbVNjb3BlICkKKwl7CisJCWNhc2UgU3BlY2lmaWVyOjpERVNJR05fSU5TVEFOQ0VfS0lORDoKKwkJeworCQkJaWYoIG1UcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZSA9PSBOVUxMICkKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJYXZtX3NpemVfdCBlbmRNYWNoaW5lID0gbVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlLT5zaXplKCk7CisJCQlmb3IoIGF2bV9zaXplX3QgaXRNYWNoaW5lID0gMCA7IGl0TWFjaGluZSA8IGVuZE1hY2hpbmUgOyArK2l0TWFjaGluZSApCisJCQl7CisJCQkJYVJJRCA9IGFuRUQuZ2V0UnVudGltZUlEKGl0TWFjaGluZSk7CisJCQkJaWYoIGFSSUQuZ2V0RXhlY3V0YWJsZSgpLT5oYXNUcmFuc2l0aW9uKCkgKQorCQkJCXsKKwkJCQkJZW5kT2Zmc2V0ID0gYVJJRC5nZXRFeGVjdXRhYmxlKCktPmdldFRyYW5zaXRpb24oKS5zaXplKCk7CisJCQkJCWZvciggb2Zmc2V0ID0gMCA7IG9mZnNldCA8IGVuZE9mZnNldCA7ICsrb2Zmc2V0ICkKKwkJCQkJeworCQkJCQkJaXRUcmFuc2l0aW9uID0gYVJJRC5nZXRFeGVjdXRhYmxlKCktPgorCQkJCQkJCQlnZXRUcmFuc2l0aW9uKCkucmF3QXQob2Zmc2V0KTsKKworCQkJCQkJaWYoIG5vdCBtVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUtPgorCQkJCQkJCQlhdCggYVJJRC5nZXRPZmZzZXQoKSApLT50ZXN0KCBvZmZzZXQgKSApCisJCQkJCQl7CisJCQkJCQkJbVRhYmxlb2ZVbmNvdmVyZWRUcmFuc2l0aW9uLmFwcGVuZCggaXRUcmFuc2l0aW9uICk7CisKKwkJCQkJCQlpZiggbVRhYmxlb2ZVbmNvdmVyZWRUcmFuc2l0aW9uLnNpemUoKSA+PQorCQkJCQkJCQltQ292ZXJhZ2VTdGF0aXN0aWNzLmdldE51bWJlck9mVW5jb3ZlcmVkKCkgKQorCQkJCQkJCXsKKwkJCQkJCQkJcmV0dXJuOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFNwZWNpZmllcjo6REVTSUdOX01PREVMX0tJTkQ6CisJCXsKKwkJCWlmKCBtRXhlY3V0YWJsZUNvdmVyYWdlVGFibGUgPT0gTlVMTCApCisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCVZlY3Rvck9mRXhlY3V0YWJsZUZvcm06OmNvbnN0X2l0ZXJhdG9yIGl0RXhlYyA9CisJCQkJCW1UYWJsZW9mUnVudGltZUV4ZWN1dGFibGUuYmVnaW4oKTsKKwkJCVZlY3Rvck9mRXhlY3V0YWJsZUZvcm06OmNvbnN0X2l0ZXJhdG9yIGVuZEV4ZWMgPQorCQkJCQltVGFibGVvZlJ1bnRpbWVFeGVjdXRhYmxlLmVuZCgpOworCQkJZm9yKCBhdm1fc2l6ZV90IGluZGV4RXhlYyA9IDAgOyBpdEV4ZWMgIT0gZW5kRXhlYyA7CisJCQkJCSsraXRFeGVjICwgKytpbmRleEV4ZWMgKQorCQkJeworCQkJCWlmKCAoKml0RXhlYyktPmhhc1RyYW5zaXRpb24oKSApCisJCQkJeworCQkJCQllbmRPZmZzZXQgPSAoKml0RXhlYyktPmdldFRyYW5zaXRpb24oKS5zaXplKCk7CisJCQkJCWZvciggb2Zmc2V0ID0gMCA7IG9mZnNldCA8IGVuZE9mZnNldCA7ICsrb2Zmc2V0ICkKKwkJCQkJeworCQkJCQkJaXRUcmFuc2l0aW9uID0gKCppdEV4ZWMpLT5nZXRUcmFuc2l0aW9uKCkucmF3QXQob2Zmc2V0KTsKKworCQkJCQkJaWYoIG5vdCBtRXhlY3V0YWJsZUNvdmVyYWdlVGFibGUtPgorCQkJCQkJCQlhdCgoKml0RXhlYyktPmdldE9mZnNldCgpKS0+dGVzdCggb2Zmc2V0ICkgKQorCQkJCQkJeworCQkJCQkJCW1UYWJsZW9mVW5jb3ZlcmVkVHJhbnNpdGlvbi5hcHBlbmQoIGl0VHJhbnNpdGlvbiApOworCisJCQkJCQkJaWYoIG1UYWJsZW9mVW5jb3ZlcmVkVHJhbnNpdGlvbi5zaXplKCkgPj0KKwkJCQkJCQkJbUNvdmVyYWdlU3RhdGlzdGljcy5nZXROdW1iZXJPZlVuY292ZXJlZCgpICkKKwkJCQkJCQl7CisJCQkJCQkJCXJldHVybjsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJaWYoIG1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZSAhPSBOVUxMICkKKwkJCXsKKwkJCQlWZWN0b3JPZkV4ZWN1dGFibGVGb3JtOjpjb25zdF9pdGVyYXRvciBpdEV4ZWMgPQorCQkJCQkJbVRhYmxlb2ZSdW50aW1lRXhlY3V0YWJsZS5iZWdpbigpOworCQkJCVZlY3Rvck9mRXhlY3V0YWJsZUZvcm06OmNvbnN0X2l0ZXJhdG9yIGVuZEV4ZWMgPQorCQkJCQkJbVRhYmxlb2ZSdW50aW1lRXhlY3V0YWJsZS5lbmQoKTsKKwkJCQlmb3IoIGF2bV9zaXplX3QgaW5kZXhFeGVjID0gMCA7IGl0RXhlYyAhPSBlbmRFeGVjIDsKKwkJCQkJCSsraXRFeGVjICwgKytpbmRleEV4ZWMgKQorCQkJCXsKKwkJCQkJaWYoICgqaXRFeGVjKS0+aGFzVHJhbnNpdGlvbigpICkKKwkJCQkJeworCQkJCQkJZW5kT2Zmc2V0ID0gKCppdEV4ZWMpLT5nZXRUcmFuc2l0aW9uKCkuc2l6ZSgpOworCQkJCQkJZm9yKCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgZW5kT2Zmc2V0IDsgKytvZmZzZXQgKQorCQkJCQkJeworCQkJCQkJCWl0VHJhbnNpdGlvbiA9ICgqaXRFeGVjKS0+Z2V0VHJhbnNpdGlvbigpLnJhd0F0KG9mZnNldCk7CisKKwkJCQkJCQlpZiggbm90IG1FeGVjdXRhYmxlQ292ZXJhZ2VUYWJsZS0+CisJCQkJCQkJCQlhdCgoKml0RXhlYyktPmdldE9mZnNldCgpKS0+dGVzdCggb2Zmc2V0ICkgKQorCQkJCQkJCXsKKwkJCQkJCQkJbVRhYmxlb2ZVbmNvdmVyZWRUcmFuc2l0aW9uLmFwcGVuZCggaXRUcmFuc2l0aW9uICk7CisKKwkJCQkJCQkJaWYoIG1UYWJsZW9mVW5jb3ZlcmVkVHJhbnNpdGlvbi5zaXplKCkgPj0KKwkJCQkJCQkJCW1Db3ZlcmFnZVN0YXRpc3RpY3MuZ2V0TnVtYmVyT2ZVbmNvdmVyZWQoKSApCisJCQkJCQkJCXsKKwkJCQkJCQkJCXJldHVybjsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJaWYoIG1UcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZSAhPSBOVUxMICkKKwkJCXsKKwkJCQlhdm1fc2l6ZV90IGVuZE1hY2hpbmUgPSBtVHJhbnNpdGlvbkNvdmVyYWdlVGFibGUtPnNpemUoKTsKKwkJCQlmb3IoIGF2bV9zaXplX3QgaXRNYWNoaW5lID0gMCA7IGl0TWFjaGluZSA8IGVuZE1hY2hpbmUgOyArK2l0TWFjaGluZSApCisJCQkJeworCQkJCQlhUklEID0gYW5FRC5nZXRSdW50aW1lSUQoaXRNYWNoaW5lKTsKKwkJCQkJaWYoIGFSSUQuZ2V0RXhlY3V0YWJsZSgpLT5oYXNUcmFuc2l0aW9uKCkgKQorCQkJCQl7CisJCQkJCQllbmRPZmZzZXQgPSBhUklELmdldEV4ZWN1dGFibGUoKS0+Z2V0VHJhbnNpdGlvbigpLnNpemUoKTsKKwkJCQkJCWZvciggb2Zmc2V0ID0gMCA7IG9mZnNldCA8IGVuZE9mZnNldCA7ICsrb2Zmc2V0ICkKKwkJCQkJCXsKKwkJCQkJCQlpdFRyYW5zaXRpb24gPSBhUklELmdldEV4ZWN1dGFibGUoKS0+CisJCQkJCQkJCQlnZXRUcmFuc2l0aW9uKCkucmF3QXQob2Zmc2V0KTsKKworCQkJCQkJCWlmKCAobm90IG1UcmFuc2l0aW9uQ292ZXJhZ2VUYWJsZS0+CisJCQkJCQkJCQlhdChhUklELmdldE9mZnNldCgpKS0+dGVzdChvZmZzZXQpKQorCQkJCQkJCQkmJiBtRXhlY3V0YWJsZUNvdmVyYWdlVGFibGUtPgorCQkJCQkJCQkJYXQoYVJJRC5nZXRFeGVjdXRhYmxlKCktPmdldE9mZnNldCgpKS0+dGVzdChvZmZzZXQpICkKKwkJCQkJCQl7CisJCQkJCQkJCW1UYWJsZW9mVW5jb3ZlcmVkVHJhbnNpdGlvbi5hcHBlbmQoIGl0VHJhbnNpdGlvbiApOworCisJCQkJCQkJCWlmKCBtVGFibGVvZlVuY292ZXJlZFRyYW5zaXRpb24uc2l6ZSgpID49CisJCQkJCQkJCQltQ292ZXJhZ2VTdGF0aXN0aWNzLmdldE51bWJlck9mVW5jb3ZlcmVkKCkgKQorCQkJCQkJCQl7CisJCQkJCQkJCQlyZXR1cm47CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisJfQorCisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBTlNJVElPTiApCisJQVZNX09TX0lORk8gPDwgIlRyYW5zaXRpb25Db3ZlcmFnZUZpbHRlcjo6Y29sbGVjdFVuY292ZXJlZFRyYW5zaXRpb246PiBjb3VudDogIgorCQkJPDwgbVRhYmxlb2ZVbmNvdmVyZWRUcmFuc2l0aW9uLnNpemUoKSA8PCBzdGQ6OmVuZGw7CisKKwlWZWN0b3JPZkF2bVRyYW5zaXRpb246OmNvbnN0X2l0ZXJhdG9yIGl0VHJhbnNpdGlvbiA9IG1UYWJsZW9mVW5jb3ZlcmVkVHJhbnNpdGlvbi5iZWdpbigpOworCVZlY3Rvck9mQXZtVHJhbnNpdGlvbjo6Y29uc3RfaXRlcmF0b3IgZW5kVHJhbnNpdGlvbiA9IG1UYWJsZW9mVW5jb3ZlcmVkVHJhbnNpdGlvbi5lbmQoKTsKKwlmb3IoIDsgaXRUcmFuc2l0aW9uICE9IGVuZFRyYW5zaXRpb24gOyArK2l0VHJhbnNpdGlvbiApCisJeworCQlBVk1fT1NfSU5GTyA8PCAiXHQiIDw8ICgqaXRUcmFuc2l0aW9uKS0+c3RyVHJhbnNpdGlvbkhlYWRlcigpIDw8IHN0ZDo6ZW5kbDsKKwl9CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQU5TSVRJT04gKQorfQorCisKK3ZvaWQgVHJhbnNpdGlvbkNvdmVyYWdlRmlsdGVyOjpjb2xsZWN0VW5jb3ZlcmVkVHJhbnNpdGlvbigKKwkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQsIExpc3RPZkF2bVRyYW5zaXRpb24gJiBsaXN0b2ZUcmFuc2l0aW9uKQoreworCUV4ZWN1dGFibGVGb3JtICogdG1wRXhlY3V0YWJsZSA9IE5VTEw7CisKKwlMaXN0T2ZBdm1UcmFuc2l0aW9uIGxpc3RPZk91dGdvaW5nVHJhbnNpdGlvbjsKKwlMaXN0T2ZBdm1UcmFuc2l0aW9uOjpjb25zdF9pdGVyYXRvciBpdFRyYW5zOworCUxpc3RPZkF2bVRyYW5zaXRpb246OmNvbnN0X2l0ZXJhdG9yIGVuZFRyYW5zOworCisJaXRSRiA9IGFuRUQuZ2V0VGFibGVPZlJ1bnRpbWUoKS5iZWdpbigpOworCWVuZFJGID0gYW5FRC5nZXRUYWJsZU9mUnVudGltZSgpLmVuZCgpOworCWZvciggOyBpdFJGICE9IGVuZFJGIDsgKytpdFJGICkKKwl7CisJCWl0UklEID0gKCppdFJGKS0+Z2V0UklEKCk7CisKKwkJdG1wRXhlY3V0YWJsZSA9IGl0UklELmdldEV4ZWN1dGFibGUoKTsKKworCQlpZiggYW5FRC5pc0lkbGVPclJ1bm5pbmcoIGl0UklEICkKKwkJCQkmJiB0bXBFeGVjdXRhYmxlLT5oYXNUcmFuc2l0aW9uKCkgKQorCQl7CisJCQl0bXBFeGVjdXRhYmxlLT5nZXRPdXRnb2luZ1RyYW5zaXRpb24oIGxpc3RPZk91dGdvaW5nVHJhbnNpdGlvbiApOworCisJCQlpdFRyYW5zID0gbGlzdE9mT3V0Z29pbmdUcmFuc2l0aW9uLmJlZ2luKCk7CisJCQllbmRUcmFucyA9IGxpc3RPZk91dGdvaW5nVHJhbnNpdGlvbi5lbmQoKTsKKwkJCWZvciggOyBpdFRyYW5zICE9IGVuZFRyYW5zIDsgKytpdFRyYW5zICkKKwkJCXsKKwkJCQlpZiggbm90IHRlc3RUcmFuc2l0aW9uQ292ZXJhZ2UoKml0VHJhbnMpICkKKwkJCQl7CisJCQkJCWxpc3RvZlRyYW5zaXRpb24uYXBwZW5kKCAqaXRUcmFucyApOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworCisvKioKKyAqIG1UcmFjZURyaXZlcgorICovCitib29sIFRyYW5zaXRpb25Db3ZlcmFnZUZpbHRlcjo6aW5pdGlhbGl6ZVRyYWNlRHJpdmVyKAorCQlXYWl0aW5nU3RyYXRlZ3kgJiBhV2FpdGluZ1N0cmF0ZWd5KQoreworCWF2bV91aW50OF90IGFXZWlnaHRNaW4gPSAwOworCisJbVdhaXRpbmdRdWV1ZS5jbGVhcigpOworCisJYVdlaWdodE1pbiA9IGFXYWl0aW5nU3RyYXRlZ3kuc3BsaWNlUHJpb3JRdWV1ZVRhYmxlKAorCQkJbVdhaXRpbmdRdWV1ZSwgYVdlaWdodE1pbiwgV0VJR0hUX1VOS05PV05fQUNISUVWQUJMRSk7CisKKwllY1F1ZXVlSXRFbmQgPSBtV2FpdGluZ1F1ZXVlLmVuZCgpOworCisJaWYoIG1XZWFrbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCA+IDAgKQorCXsKKwkJZWNRdWV1ZUl0ID0gbVdhaXRpbmdRdWV1ZS5iZWdpbigpOworCQlmb3IoIDsgZWNRdWV1ZUl0ICE9IGVjUXVldWVJdEVuZCA7ICsrZWNRdWV1ZUl0ICkKKwkJeworCQkJaWYoIGluaXRpYWxpemVUcmFjZURyaXZlcigqZWNRdWV1ZUl0KSApCisJCQl7CisJCQkJbVRyYWNlRGlyZWN0aXZlUnVubmluZ0ZsYWcgPSB0cnVlOworCisJCQkJKCplY1F1ZXVlSXQpLT5zZXRXZWlnaHQoIFdFSUdIVF9TRUxFQ1RFRF9BQ0hJRVZBQkxFICk7CisKKwkJCQlhV2FpdGluZ1N0cmF0ZWd5LnB1c2gobVdhaXRpbmdRdWV1ZSk7CisKKwkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCX0KKwkJfQorCX0KKworCisJaWYoIG1MYXN0Q29sbGVjdGVkQ292ZXJDb3VudCA8IG1Db3ZlcmFnZVN0YXRpc3RpY3MubU51bWJlck9mQ292ZXJlZCApCisJeworCQltTGFzdERpcmVjdGl2ZVRyYW5zaXRpb25PZmZzZXQgPSAwOworCX0KKwljb2xsZWN0VW5jb3ZlcmVkVHJhbnNpdGlvbigpOworCisJYXZtX3NpemVfdCBlbmRUcmFuc2l0aW9uID0gbVRhYmxlb2ZVbmNvdmVyZWRUcmFuc2l0aW9uLnNpemUoKTsKKwlpZiggbUxhc3REaXJlY3RpdmVUcmFuc2l0aW9uT2Zmc2V0ID49IGVuZFRyYW5zaXRpb24gKQorCXsKKwkJbUxhc3REaXJlY3RpdmVUcmFuc2l0aW9uT2Zmc2V0ID0gMDsKKwl9CisKKwlkbworCXsKKwkJYXZtX3NpemVfdCBvZmZzZXQgPSBtTGFzdERpcmVjdGl2ZVRyYW5zaXRpb25PZmZzZXQ7CisJCWZvciggOyBvZmZzZXQgPCBlbmRUcmFuc2l0aW9uIDsgKytvZmZzZXQgKQorCQl7CisJCQllY1F1ZXVlSXQgPSBtV2FpdGluZ1F1ZXVlLmJlZ2luKCk7CisJCQlmb3IoIDsgZWNRdWV1ZUl0ICE9IGVjUXVldWVJdEVuZCA7ICsrZWNRdWV1ZUl0ICkKKwkJCXsKKwkJCQlpZiggbVRyYWNlRHJpdmVyLmluaXRpYWxpemUoKmVjUXVldWVJdCwKKwkJCQkJCW1UYWJsZW9mVW5jb3ZlcmVkVHJhbnNpdGlvbltvZmZzZXRdKSApCisJCQkJeworCQkJCQkrK21MYXN0RGlyZWN0aXZlVHJhbnNpdGlvbk9mZnNldDsKKworCQkJCQltVHJhY2VEaXJlY3RpdmVSdW5uaW5nRmxhZyA9IHRydWU7CisKKwkJCQkJKCplY1F1ZXVlSXQpLT5zZXRXZWlnaHQoIFdFSUdIVF9TRUxFQ1RFRF9BQ0hJRVZBQkxFICk7CisKKwkJCQkJYVdhaXRpbmdTdHJhdGVneS5wdXNoKG1XYWl0aW5nUXVldWUpOworCisJCQkJCXJldHVybiggdHJ1ZSApOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWFXYWl0aW5nU3RyYXRlZ3kucHVzaChtV2FpdGluZ1F1ZXVlKTsKKworCQlpZiggKCsrYVdlaWdodE1pbikgPD0gV0VJR0hUX1VOS05PV05fQUNISUVWQUJMRSApCisJCXsKKwkJCW1XYWl0aW5nUXVldWUuY2xlYXIoKTsKKworCQkJYVdlaWdodE1pbiA9IGFXYWl0aW5nU3RyYXRlZ3kuc3BsaWNlUHJpb3JRdWV1ZVRhYmxlKAorCQkJCQltV2FpdGluZ1F1ZXVlLCBhV2VpZ2h0TWluLCBXRUlHSFRfVU5LTk9XTl9BQ0hJRVZBQkxFKTsKKworCQkJZWNRdWV1ZUl0RW5kID0gbVdhaXRpbmdRdWV1ZS5lbmQoKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWJyZWFrOworCQl9CisJfQorCXdoaWxlKCBtV2FpdGluZ1F1ZXVlLm5vbmVtcHR5KCkgKTsKKworCW1UcmFjZURyaXZlci5yZXNldEZhaWxlZFRyYW5zaXRpb25UYXJnZXRIaXN0b3J5KCk7CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKworYm9vbCBUcmFuc2l0aW9uQ292ZXJhZ2VGaWx0ZXI6OmluaXRpYWxpemVUcmFjZURyaXZlcihFeGVjdXRpb25Db250ZXh0ICogYW5FQykKK3sKKwlMaXN0T2ZBdm1UcmFuc2l0aW9uIHVuY292ZXJlZFRyYW5zaXRpb247CisJY29sbGVjdFVuY292ZXJlZFRyYW5zaXRpb24oYW5FQy0+cmVmRXhlY3V0aW9uRGF0YSgpLCB1bmNvdmVyZWRUcmFuc2l0aW9uKTsKKworCXdoaWxlKCB1bmNvdmVyZWRUcmFuc2l0aW9uLm5vbmVtcHR5KCkgKQorCXsKKwkJaWYoIG1UcmFjZURyaXZlci5pbml0aWFsaXplKGFuRUMsIHVuY292ZXJlZFRyYW5zaXRpb24ucG9wX2ZpcnN0KCkpICkKKwkJeworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKworYm9vbCBUcmFuc2l0aW9uQ292ZXJhZ2VGaWx0ZXI6OnJ1blRyYWNlRHJpdmVyKCkKK3sKKwlpZiggbVRyYWNlRHJpdmVyLnByb2Nlc3MoIGdldEV4ZWN1dGlvblF1ZXVlKCkuZ2V0UmVzdWx0UXVldWUoKSApICkKKwl7CisJCWlmKCBtVHJhY2VEcml2ZXIuZ29hbEFjaGlldmVkKCkgKQorCQl7CisJCQltVHJhY2VEaXJlY3RpdmVSdW5uaW5nRmxhZyA9IGZhbHNlOworCisJCQltTGFzdERpcmVjdGl2ZVRyYW5zaXRpb25PZmZzZXQgPSAwOworCQl9CisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCWVsc2UKKwl7CisJCW1UcmFjZURpcmVjdGl2ZVJ1bm5pbmdGbGFnID0gZmFsc2U7CisKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KK30KKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vY292ZXJhZ2UvVHJhbnNpdGlvbkNvdmVyYWdlRmlsdGVyLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vY292ZXJhZ2UvVHJhbnNpdGlvbkNvdmVyYWdlRmlsdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M1NTEzZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9jb3ZlcmFnZS9UcmFuc2l0aW9uQ292ZXJhZ2VGaWx0ZXIuaApAQCAtMCwwICsxLDM0MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDI1IGp1aWwuIDIwMDgKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogIEFsYWluIEZhaXZyZSAoQ0VBIExJU1QpIGFsYWluLmZhaXZyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRkFNX0NPVkVSQUdFX1RSQU5TSVRJT05DT1ZFUkFHRUZJTFRFUl9IXworI2RlZmluZSBGQU1fQ09WRVJBR0VfVFJBTlNJVElPTkNPVkVSQUdFRklMVEVSX0hfCisKKyNpbmNsdWRlIDxmYW0vY292ZXJhZ2UvQmFzZUNvdmVyYWdlRmlsdGVyLmg+CisKKyNpbmNsdWRlIDxjb2xsZWN0aW9uL0JpdHNldC5oPgorI2luY2x1ZGUgPGNvbGxlY3Rpb24vVHlwZWRlZi5oPgorCisjaW5jbHVkZSA8ZmFtL2NvdmVyYWdlL0F2bUNvdmVyYWdlVHJhY2VEcml2ZXIuaD4KKworI2luY2x1ZGUgPGZtbC9jb21tb24vU3BlY2lmaWVyRWxlbWVudC5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworY2xhc3MgV2FpdGluZ1N0cmF0ZWd5OworY2xhc3MgQXZtVHJhbnNpdGlvbjsKK2NsYXNzIEV4ZWN1dGlvbkRhdGE7CitjbGFzcyBSdW50aW1lSUQ7CitjbGFzcyBTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXI7CisKKworY2xhc3MgVHJhbnNpdGlvbkNvdmVyYWdlRmlsdGVyIDoKKwkJcHVibGljIEF1dG9SZWdpc3RlcmVkQ292ZXJhZ2VQcm9jZXNzb3JVbml0PCBUcmFuc2l0aW9uQ292ZXJhZ2VGaWx0ZXIgPgoreworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIFRyYW5zaXRpb25Db3ZlcmFnZUZpbHRlciApCisKKworCS8qKgorCSAqIFBST0NFU1NPUiBGQUNUT1JZCisJICogZm9yIGF1dG9tYXRpYyByZWdpc3RyYXRpb24gaW4gdGhlIHByb2Nlc3NvciByZXBvc2l0b3J5CisJICogdGhlIFsgWyBGVUxMWSBdIFFVQUxJRklFRCBdIE5BTUUgSUQKKwkgKi8KKwlBVk1fSU5KRUNUX0FVVE9fUkVHSVNURVJfUVVBTElGSUVEX0lEX0tFWV80KAorCQkJImNvdmVyYWdlI3RyYW5zaXRpb24iLAorCQkJImF2bTo6cHJvY2Vzc29yLlRSQU5TSVRJT05fQ09WRVJBR0UiLAorCQkJImF2bTo6Y29yZS5maWx0ZXIuUFJPR1JBTV9DT1ZFUkFHRSIsCisJCQkiYXZtOjpjb3JlLmZpbHRlci5UUkFOU0lUSU9OX0NPVkVSQUdFIikKKwkvLyBlbmQgcmVnaXN0cmF0aW9uCisKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlTcGVjaWZpZXI6OkRFU0lHTl9LSU5EIG1TY29wZTsKKworCWF2bV9zaXplX3QgbU5iQ292ZXJhZ2U7CisKKwlhdm1fc2l6ZV90IG1Db3ZlcmFnZUhlaWdodFBlcmlvZDsKKwlhdm1fc2l6ZV90IG1Db3ZlcmFnZUhlaWdodDsKKwlhdm1fc2l6ZV90IG1Db3ZlcmFnZUhlaWdodFJlYWNoZWRDb3VudDsKKwlhdm1fc2l6ZV90IG1Db3ZlcmFnZUhlaWdodFJlYWNoZWRMaW1pdDsKKwlib29sICAgICAgIG1Db3ZlcmFnZUhlaWdodFJlYWNoZWRGbGFnOworCisKKwlib29sIG1IaXRTdHJvbmdseVJhbmRvbUZsYWc7CisJYXZtX3NpemVfdCBtSGl0U3Ryb25nbHlDb3VudDsKKworCWJvb2wgbUhpdFdlYWtseVJhbmRvbUZsYWc7CisJYXZtX3NpemVfdCBtSGl0V2Vha2x5Q291bnQ7CisKKwlib29sIG1IaXRPdGhlclJhbmRvbUZsYWc7CisJYXZtX3NpemVfdCBtSGl0T3RoZXJDb3VudDsKKworCS8vIFRhYmxlIGRlcyBmbGFncyBkZSBjb3V2ZXJ0dXJlIGRlIHRyYW5zaXRpb24KKwkvLyBwb3VyIGNoYXF1ZSBpbnN0YW5jZSBkZSBtYWNoaW5lIGV4ZWN1dGFibGUKKwlBcnJheU9mQml0c2V0ICogbUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlOworCUFycmF5T2ZCaXRzZXQgKiBtVHJhbnNpdGlvbkNvdmVyYWdlVGFibGU7CisKKwlWZWN0b3JPZkV4ZWN1dGFibGVGb3JtIG1UYWJsZW9mUnVudGltZUV4ZWN1dGFibGU7CisKKworCVZlY3Rvck9mQXZtVHJhbnNpdGlvbiBtVGFibGVvZlVuY292ZXJlZFRyYW5zaXRpb247CisJYXZtX3NpemVfdCBtTGFzdENvbGxlY3RlZENvdmVyQ291bnQ7CisKKworCS8vIFV0aWxpc2F0aW9uIGQndW5lIHRyYWNlIHBvdXIgb3JpZW50w6kvZGlyaWfDqSBsJ2V4w6ljdXRpb24gdmVycyB1bmUgY2libGUKKwlib29sIG1UcmFjZURpcmVjdGl2ZVJ1bm5pbmdGbGFnOworCUF2bUNvdmVyYWdlVHJhY2VEcml2ZXIgbVRyYWNlRHJpdmVyOworCisJYXZtX3NpemVfdCBtTGFzdERpcmVjdGl2ZVRyYW5zaXRpb25PZmZzZXQ7CisKKwkvLyBDb21wdXRpbmcgTG9jYWwgVmFyaWFibGVzCisJQml0c2V0ICogdG1wUnVudGltZVRyYW5zaXRpb25CaXRzZXQ7CisKKwlhdm1fb2Zmc2V0X3Qgb2Zmc2V0OworCWF2bV9vZmZzZXRfdCBlbmRPZmZzZXQ7CisKKwlhdm1fb2Zmc2V0X3QgbWF4UmFuZG9tT2Zmc2V0OworCUJpdHNldCByYW5kb21PZmZzZXRCaXRzZXQ7CisKKworCUV4ZWN1dGlvbkNvbnRleHQ6OmNoaWxkX2l0ZXJhdG9yIGl0RUM7CisJRXhlY3V0aW9uQ29udGV4dDo6Y2hpbGRfaXRlcmF0b3IgaXRFbmRFQzsKKwlFeGVjdXRpb25Db250ZXh0ICogdG1wRUM7CisJRXhlY3V0YWJsZUZvcm0gKiB0bXBFRjsKKwlSdW50aW1lSUQgaXRSSUQ7CisJVGFibGVPZlJ1bnRpbWVUOjpjb25zdF9pdGVyYXRvciBpdFJGOworCVRhYmxlT2ZSdW50aW1lVDo6Y29uc3RfaXRlcmF0b3IgZW5kUkY7CisKKworCVZlY3Rvck9mRXhlY3V0aW9uQ29udGV4dCBtU3Ryb25nbHlIaXRFQzsKKwlhdm1fc2l6ZV90IG1TdHJvbmdseUZpcmVhYmxlVHJhbnNpdGlvbkNvdW50OworCWF2bV9zaXplX3QgdG1wU3Ryb25nbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudDsKKworCVZlY3Rvck9mRXhlY3V0aW9uQ29udGV4dCBtV2Vha2x5SGl0RUM7CisJYXZtX3NpemVfdCBtV2Vha2x5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQ7CisJYXZtX3NpemVfdCB0bXBXZWFrbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudDsKKworCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQgbVdhaXRpbmdRdWV1ZTsKKworCitwdWJsaWM6CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlUcmFuc2l0aW9uQ292ZXJhZ2VGaWx0ZXIoCisJCQlTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXIgJiBhQ29udHJvbGxlclVuaXRNYW5hZ2VyLAorCQkJV09iamVjdCAqIHdmUGFyYW1ldGVyT2JqZWN0KQorCTogUmVnaXN0ZXJlZENvdmVyYWdlUHJvY2Vzc29yVW5pdChhQ29udHJvbGxlclVuaXRNYW5hZ2VyLCB3ZlBhcmFtZXRlck9iamVjdCwKKwkJCUFWTV9QUkVQT1NUX0ZJTFRFUklOR19TVEFHRSwgUFJFQ0VERU5DRV9PRl9UUkFOU0lUSU9OX0NPVkVSQUdFKSwKKwltU2NvcGUoIFNwZWNpZmllcjo6REVTSUdOX01PREVMX0tJTkQgKSwKKworCW1OYkNvdmVyYWdlKCBBVk1fTlVNRVJJQ19NQVhfU0laRV9UICksCisKKwltQ292ZXJhZ2VIZWlnaHRQZXJpb2QoIDAgKSwKKwltQ292ZXJhZ2VIZWlnaHQoIDAgKSwKKwltQ292ZXJhZ2VIZWlnaHRSZWFjaGVkQ291bnQoIDAgKSwKKwltQ292ZXJhZ2VIZWlnaHRSZWFjaGVkTGltaXQoIDEgKSwKKwltQ292ZXJhZ2VIZWlnaHRSZWFjaGVkRmxhZyggZmFsc2UgKSwKKworCW1IaXRTdHJvbmdseVJhbmRvbUZsYWcoIGZhbHNlICksCisJbUhpdFN0cm9uZ2x5Q291bnQoIDEgKSwKKworCW1IaXRXZWFrbHlSYW5kb21GbGFnKCBmYWxzZSApLAorCW1IaXRXZWFrbHlDb3VudCggMSApLAorCisJbUhpdE90aGVyUmFuZG9tRmxhZyggZmFsc2UgKSwKKwltSGl0T3RoZXJDb3VudCggMSApLAorCisJbUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlKCBOVUxMICksCisJbVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlKCBOVUxMICksCisJbVRhYmxlb2ZSdW50aW1lRXhlY3V0YWJsZSggKSwKKworCW1UYWJsZW9mVW5jb3ZlcmVkVHJhbnNpdGlvbiggKSwKKwltTGFzdENvbGxlY3RlZENvdmVyQ291bnQoIDAgKSwKKworCW1UcmFjZURpcmVjdGl2ZVJ1bm5pbmdGbGFnKCBmYWxzZSApLAorCW1UcmFjZURyaXZlciggRU5WICksCisKKwltTGFzdERpcmVjdGl2ZVRyYW5zaXRpb25PZmZzZXQoIDAgKSwKKworCS8vIENvbXB1dGluZyBMb2NhbCBWYXJpYWJsZXMKKwl0bXBSdW50aW1lVHJhbnNpdGlvbkJpdHNldCggTlVMTCApLAorCisJb2Zmc2V0KCAwICksCisJZW5kT2Zmc2V0KCAwICksCisKKwltYXhSYW5kb21PZmZzZXQoIDAgKSwKKwlyYW5kb21PZmZzZXRCaXRzZXQoICksCisKKwlpdEVDKCApLAorCWl0RW5kRUMoICksCisJdG1wRUMoIE5VTEwgKSwKKwl0bXBFRiggTlVMTCApLAorCWl0UklEKCApLAorCWl0UkYoICksCisJZW5kUkYoICksCisKKwltU3Ryb25nbHlIaXRFQyggKSwKKwltU3Ryb25nbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCggMCApLAorCXRtcFN0cm9uZ2x5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQoIDAgKSwKKworCW1XZWFrbHlIaXRFQyggKSwKKwltV2Vha2x5RmlyZWFibGVUcmFuc2l0aW9uQ291bnQoIDAgKSwKKwl0bXBXZWFrbHlGaXJlYWJsZVRyYW5zaXRpb25Db3VudCggMCApLAorCisJbVdhaXRpbmdRdWV1ZSggKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgflRyYW5zaXRpb25Db3ZlcmFnZUZpbHRlcigpOworCisKKwkvKioKKwkgKiBDT05GSUdVUkUKKwkgKi8KKwl2aXJ0dWFsIGJvb2wgY29uZmlndXJlSW1wbCgpOworCisKKwl2b2lkIGNvbmZpZ3VyZUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlRmxhZyhib29sIHZhbHVlKTsKKwl2b2lkIGNvbmZpZ3VyZUV4ZWN1dGFibGVDb3ZlcmFnZVRhYmxlRmxhZygKKwkJCUV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlLCBib29sIHZhbHVlKTsKKworCXZvaWQgY29uZmlndXJlSW5zdGFuY2VDb3ZlcmFnZVRhYmxlRmxhZygpOworCXZvaWQgY29uZmlndXJlSW5zdGFuY2VDb3ZlcmFnZVRhYmxlRmxhZyhib29sIHZhbHVlKTsKKwl2b2lkIGNvbmZpZ3VyZUluc3RhbmNlQ292ZXJhZ2VUYWJsZUZsYWcoCisJCQljb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwgY29uc3QgUnVudGltZUlEICYgYVJJRCwgYm9vbCB2YWx1ZSk7CisKKwl2b2lkIGNvbmZpZ3VyZVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlRmxhZygKKwkJCUxpc3RPZkF2bVRyYW5zaXRpb24gJiBsaXN0T2ZUcmFuc2l0aW9uLCBib29sIHZhbHVlKTsKKworCisJQml0c2V0ICogZ2V0Q292ZXJhZ2VUYWJsZUJpdHNldChjb25zdCBSdW50aW1lSUQgJiBhUklEKTsKKworCisJLyoqCisJICogUkVQT1JUIFRSQUNFCisJICovCisJdmlydHVhbCB2b2lkIHJlcG9ydE1pbmltdW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCisJdmlydHVhbCB2b2lkIHJlcG9ydERlZmF1bHQoT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIE5PTi1SRUdSRVNTSU9OIFRFU1QgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJdmlydHVhbCB2b2lkIHRkZFJlZ3Jlc3Npb25SZXBvcnRJbXBsKE91dFN0cmVhbSAmIG9zKTsKKworCisJLyoqCisJICogcG9zdEV2YWwgRmlsdGVyCisJICovCisJdmlydHVhbCBib29sIHByZWZpbHRlcigpOworCisJdmlydHVhbCBib29sIHBvc3RmaWx0ZXIoKTsKKworCS8vIFJFUVVFVUUgUkVRVUVTVCBmb3IgdGhlIFdhaXRpbmcgUXVldWUgVGFibGUKKwl2aXJ0dWFsIHZvaWQgaGFuZGxlUmVxdWVzdFJlcXVldWVXYWl0aW5nVGFibGUoCisJCQlXYWl0aW5nU3RyYXRlZ3kgJiBhV2FpdGluZ1N0cmF0ZWd5LAorCQkJYXZtX3VpbnQ4X3QgYVdlaWdodE1pbiwgYXZtX3VpbnQ4X3QgYVdlaWdodE1heCk7CisKKwkvKioKKwkgKiBIZXVyaXN0aWMgQ2xhc3MgaW1wbGVtZW50YXRpb24KKwkgKi8KKwl2b2lkIGhldXJpc3RpY05haXZlQ2xhc3NJbXBsKCk7CisKKwl2b2lkIGhldXJpc3RpY1NtYXJ0Q2xhc3NJbXBsKCk7CisKKwl2b2lkIGhldXJpc3RpY0FncmVzc2l2ZUNsYXNzSW1wbCgpOworCisJdm9pZCBoZXVyaXN0aWNOb3RoaW5nRWxzZUNsYXNzSW1wbCgpOworCisKKwl2b2lkIHNldEhpdFdlaWdodChWZWN0b3JPZkV4ZWN1dGlvbkNvbnRleHQgJiBoaXRFQywKKwkJCWF2bV91aW50OF90IGhpdFdlaWdodCwgYm9vbCByYW5kb21GbGFnLCBhdm1fc2l6ZV90IGhpdENvdW50KTsKKworCXZvaWQgY29tcHV0ZVdlaWdodChFeGVjdXRpb25Db250ZXh0ICogYW5FQyk7CisJdm9pZCBjb21wdXRlV2VpZ2h0TmFpdmUoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpOworCXZvaWQgY29tcHV0ZVdlaWdodFNtYXJ0KEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDKTsKKwl2b2lkIGNvbXB1dGVXZWlnaHRBZ3Jlc3NpdmUoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpOworCisKKwlib29sIGNvbXB1dGVDaGVja05vblByaW9yaXR5V2VpZ2h0KEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDKTsKKworCXZvaWQgY29tcHV0ZVByaW9yaXR5V2VpZ2h0KEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDKTsKKworCWJvb2wgY2hlY2tTdHJvbmdseVByaW9yaXR5V2VpZ2h0KEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDKTsKKwlib29sIGNoZWNrV2Vha2x5UHJpb3JpdHlXZWlnaHQoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpOworCisKKwl2b2lkIGNvbXB1dGVXZWlnaHRPZlJlc3VsdCgpOworCisKKwlib29sIHRlc3RGaXJlYWJpbGl0eShjb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSZWNlaXZlclJJRCwgQXZtVHJhbnNpdGlvbiAqIGFUcmFuc2l0aW9uKTsKKworCWJvb2wgaXNDb250cm9sTG9vcChFeGVjdXRpb25Db250ZXh0ICogYW5FQyk7CisJYm9vbCBpc1N5bnRheGljTG9vcChFeGVjdXRpb25Db250ZXh0ICogYW5FQyk7CisJYm9vbCBpc1RyaXZpYWxMb29wKEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDKTsKKworCXZvaWQgZmlyZWFibGVUcmFuc2l0aW9uQ291bnQoCisJCQljb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwgY29uc3QgUnVudGltZUlEICYgYVJJRCk7CisKKwl2b2lkIGZpcmVhYmxlVHJhbnNpdGlvbkNvdW50KGNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVEKTsKKworCXZvaWQgZmlyZWFibGVUcmFuc2l0aW9uQ291bnQoCisJCQljb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwgY29uc3QgUnVudGltZUZvcm0gJiBhUkYpOworCisJdm9pZCBmaXJlYWJsZVRyYW5zaXRpb25UcmFjZShPdXRTdHJlYW0gJiBvcywgY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQpOworCisJdm9pZCBmaXJlYWJsZVRyYW5zaXRpb25UcmFjZShPdXRTdHJlYW0gJiBvcywKKwkJCWNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVELCBjb25zdCBSdW50aW1lRm9ybSAmIGFSRik7CisKKwl2b2lkIHVwZGF0ZVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlKAorCQkJRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMsIGNvbnN0IEJGICYgYUZpcmVkQ29kZSk7CisKKwl2b2lkIHVwZGF0ZVRyYW5zaXRpb25Db3ZlcmFnZVRhYmxlKEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDLAorCQkJY29uc3QgUnVudGltZUlEICYgYVJJRCwgQXZtVHJhbnNpdGlvbiAqIGZpcmVkVHJhbnNpdGlvbik7CisKKwlib29sIHRlc3RUcmFuc2l0aW9uQ292ZXJhZ2UoQXZtVHJhbnNpdGlvbiAqIGZpcmVkVHJhbnNpdGlvbik7CisKKwkvKioKKwkgKiBtVGFibGVvZlVuY292ZXJlZFRyYW5zaXRpb24KKwkgKi8KKwl2b2lkIGNvbGxlY3RVbmNvdmVyZWRUcmFuc2l0aW9uKCk7CisKKwl2b2lkIGNvbGxlY3RVbmNvdmVyZWRUcmFuc2l0aW9uKGNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVELAorCQkJTGlzdE9mQXZtVHJhbnNpdGlvbiAmIGxpc3RvZlRyYW5zaXRpb24pOworCisKKwkvKioKKwkgKiBtVHJhY2VEcml2ZXIKKwkgKi8KKwlib29sIGluaXRpYWxpemVUcmFjZURyaXZlcihXYWl0aW5nU3RyYXRlZ3kgJiBhV2FpdGluZ1N0cmF0ZWd5KTsKKworCWJvb2wgaW5pdGlhbGl6ZVRyYWNlRHJpdmVyKEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDKTsKKworCWJvb2wgcnVuVHJhY2VEcml2ZXIoKTsKKworfTsKKworCit9CisKKyNlbmRpZiAvKiBGQU1fQ09WRVJBR0VfVFJBTlNJVElPTkNPVkVSQUdFRklMVEVSX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vZGVidWcvQXZtRGVidWdQcm9jZXNzb3IuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2RlYnVnL0F2bURlYnVnUHJvY2Vzc29yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGMxOTAzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2RlYnVnL0F2bURlYnVnUHJvY2Vzc29yLmNwcApAQCAtMCwwICsxLDE4NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDI3IGphbnYuIDIwMTUKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkF2bURlYnVnUHJvY2Vzc29yLmgiCisKKyNpbmNsdWRlIDxib29zdC9mb3JtYXQuaHBwPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUkVQT1JUIEFQSQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBBdm1EZWJ1Z1Byb2Nlc3Nvcjo6cmVwb3J0TWluaW11bShPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlyZXBvcnRIZWFkZXIob3MsICJERUJVR0dFUiAiKTsKKworCW9zIDw8IHN0ZDo6Zmx1c2g7Cit9CisKKwordm9pZCBBdm1EZWJ1Z1Byb2Nlc3Nvcjo6cmVwb3J0RGVmYXVsdChPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlyZXBvcnRIZWFkZXIob3MsICJERUJVR0dFUiAiKTsKKworCW9zIDw8IHN0ZDo6Zmx1c2g7Cit9CisKKworYm9vbCBBdm1EZWJ1Z1Byb2Nlc3Nvcjo6Y29uZmlndXJlSW1wbCgpCit7CisJcmV0dXJuKCBJRGVidWdQcm9jZXNzb3JQcm92aWRlcjo6ZGVidWdDb25maWd1cmVJbXBsKCBnZXRQYXJhbWV0ZXJXT2JqZWN0KCkgKSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBQUk9DRVNTIEFQSQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBBdm1EZWJ1Z1Byb2Nlc3Nvcjo6cHJlcHJvY2VzcygpCit7CisJcmV0dXJuKCBJRGVidWdQcm9jZXNzb3JQcm92aWRlcjo6ZGVidWdQcmVwcm9jZXNzaW5nKCkgKTsKK30KKworYm9vbCBBdm1EZWJ1Z1Byb2Nlc3Nvcjo6cG9zdHByb2Nlc3MoKQoreworCXJldHVybiggSURlYnVnUHJvY2Vzc29yUHJvdmlkZXI6OmRlYnVnUG9zdHByb2Nlc3NpbmcoKSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBJTklUSUFMSVpFLUZJTFRFUiBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgQXZtRGVidWdQcm9jZXNzb3I6OmZpbHRlcmluZ0luaXRpYWxpemUoKQoreworCXJldHVybiggSURlYnVnUHJvY2Vzc29yUHJvdmlkZXI6OmRlYnVnRmlsdGVyaW5nSW5pdGlhbGl6ZSgpICk7Cit9CisKK2Jvb2wgQXZtRGVidWdQcm9jZXNzb3I6OmZpbHRlcmluZ0luaXRpYWxpemUoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpCit7CisJcmV0dXJuKCBJRGVidWdQcm9jZXNzb3JQcm92aWRlcjo6ZGVidWdGaWx0ZXJpbmdJbml0aWFsaXplKGFuRUMpICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEZJTkFMSVpFLUZJTFRFUiBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgQXZtRGVidWdQcm9jZXNzb3I6OmZpbmFsaXplRmlsdGVyaW5nKCkKK3sKKwlyZXR1cm4oIElEZWJ1Z1Byb2Nlc3NvclByb3ZpZGVyOjpkZWJ1Z0ZpbHRlcmluZ0ZpbmFsaXplKCkgKTsKK30KKworYm9vbCBBdm1EZWJ1Z1Byb2Nlc3Nvcjo6ZmluYWxpemVGaWx0ZXJpbmcoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpCit7CisJcmV0dXJuKCBJRGVidWdQcm9jZXNzb3JQcm92aWRlcjo6ZGVidWdGaWx0ZXJpbmdGaW5hbGl6ZShhbkVDKSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBQUkUtRklMVEVSIEFQSQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBBdm1EZWJ1Z1Byb2Nlc3Nvcjo6cHJlZmlsdGVyKCkKK3sKKwlyZXR1cm4oIElEZWJ1Z1Byb2Nlc3NvclByb3ZpZGVyOjpkZWJ1Z1ByZWZpbHRlcmluZygpICk7Cit9CisKK2Jvb2wgQXZtRGVidWdQcm9jZXNzb3I6OnByZWZpbHRlcihFeGVjdXRpb25Db250ZXh0ICYgYW5FQykKK3sKKwlyZXR1cm4oIElEZWJ1Z1Byb2Nlc3NvclByb3ZpZGVyOjpkZWJ1Z1ByZWZpbHRlcmluZygmIGFuRUMpICk7Cit9CisKKworYm9vbCBBdm1EZWJ1Z1Byb2Nlc3Nvcjo6ZmluYWxpemVQcmVmaWx0ZXJpbmcoKQoreworCXJldHVybiggSURlYnVnUHJvY2Vzc29yUHJvdmlkZXI6OmRlYnVnUHJlZmlsdGVyaW5nRmluYWxpemUoKSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBQT1NULUZJTFRFUiBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgQXZtRGVidWdQcm9jZXNzb3I6OnBvc3RmaWx0ZXIoKQoreworCXJldHVybiggSURlYnVnUHJvY2Vzc29yUHJvdmlkZXI6OmRlYnVnUG9zdGZpbHRlcmluZygpICk7Cit9CisKKworYm9vbCBBdm1EZWJ1Z1Byb2Nlc3Nvcjo6cG9zdGZpbHRlcihFeGVjdXRpb25Db250ZXh0ICYgYW5FQykKK3sKKwlyZXR1cm4oIElEZWJ1Z1Byb2Nlc3NvclByb3ZpZGVyOjpkZWJ1Z1Bvc3RmaWx0ZXJpbmcoJiBhbkVDKSApOworfQorCisKK2Jvb2wgQXZtRGVidWdQcm9jZXNzb3I6OmZpbmFsaXplUG9zdGZpbHRlcmluZygpCit7CisJcmV0dXJuKCBJRGVidWdQcm9jZXNzb3JQcm92aWRlcjo6ZGVidWdQb3N0ZmlsdGVyaW5nRmluYWxpemUoKSApOworfQorCisKKy8qKgorICogRVZBTCBUUkFDRQorICovCisKK3ZvaWQgQXZtRGVidWdQcm9jZXNzb3I6OnRyYWNlTWluaW11bVByZUV2YWwoCisJCU91dFN0cmVhbSAmIG9zLCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQykgY29uc3QKK3sKKwlib29zdDo6Zm9ybWF0IGZvcm1hdHRlcihtUHJlRXZhbFRyYWNlRm9ybWF0dGVyKTsKKwlmb3JtYXR0ZXIuZXhjZXB0aW9ucyggYm9vc3Q6OmlvOjpub19lcnJvcl9iaXRzICk7CisKKy8vCWZvcm1hdHRlci5leGNlcHRpb25zKCBib29zdDo6aW86OmFsbF9lcnJvcl9iaXRzIF4KKy8vCQkJKCBib29zdDo6aW86OnRvb19tYW55X2FyZ3NfYml0IHwgYm9vc3Q6OmlvOjp0b29fZmV3X2FyZ3NfYml0ICkgKTsKK30KKworCit2b2lkIEF2bURlYnVnUHJvY2Vzc29yOjp0cmFjZURlZmF1bHRQcmVFdmFsKAorCQlPdXRTdHJlYW0gJiBvcywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpIGNvbnN0Cit7CisvLwlvcyA8PCBUQUIgPDwgIkVbIiA8PCBzdGQ6OnNldHcoNCkgPDwgYW5FQy0+Z2V0RXZhbE51bWJlcigpIDw8ICJdICIKKy8vCQkJPDwgYW5FQy0+c3RyX21pbigpIDw8IEVPTF9GTFVTSDsKK30KKworCit2b2lkIEF2bURlYnVnUHJvY2Vzc29yOjp0cmFjZU1pbmltdW1Qb3N0RXZhbCgKKwkJT3V0U3RyZWFtICYgb3MsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKSBjb25zdAoreworCS8vISEgTk9USElORworfQorCit2b2lkIEF2bURlYnVnUHJvY2Vzc29yOjp0cmFjZURlZmF1bHRQb3N0RXZhbCgKKwkJT3V0U3RyZWFtICYgb3MsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKSBjb25zdAoreworCS8vISEgTk9USElORworfQorCisKKwordm9pZCBBdm1EZWJ1Z1Byb2Nlc3Nvcjo6cmVwb3J0RXZhbChPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlib29zdDo6Zm9ybWF0IGZvcm1hdHRlcihtUmVwb3J0RXZhbFRyYWNlRm9ybWF0dGVyKTsKKwlmb3JtYXR0ZXIuZXhjZXB0aW9ucyggYm9vc3Q6OmlvOjpub19lcnJvcl9iaXRzICk7CisKKy8vCWZvcm1hdHRlci5leGNlcHRpb25zKCBib29zdDo6aW86OmFsbF9lcnJvcl9iaXRzIF4KKy8vCQkJKCBib29zdDo6aW86OnRvb19tYW55X2FyZ3NfYml0IHwgYm9vc3Q6OmlvOjp0b29fZmV3X2FyZ3NfYml0ICkgKTsKK30KKworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2RlYnVnL0F2bURlYnVnUHJvY2Vzc29yLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vZGVidWcvQXZtRGVidWdQcm9jZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjE0MGNlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2RlYnVnL0F2bURlYnVnUHJvY2Vzc29yLmgKQEAgLTAsMCArMSwxNzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyNyBqYW52LiAyMDE1CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQVZNREVCVUdQUk9DRVNTT1JfSF8KKyNkZWZpbmUgQVZNREVCVUdQUk9DRVNTT1JfSF8KKworI2luY2x1ZGUgPGZhbS9hcGkvQWJzdHJhY3RQcm9jZXNzb3JVbml0Lmg+CisKKyNpbmNsdWRlIDxmYW0vZGVidWcvSURlYnVnUHJvY2Vzc29yUHJvdmlkZXIuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKK2NsYXNzIFN5bWJleENvbnRyb2xsZXJVbml0TWFuYWdlcjsKKworCitjbGFzcyBBdm1EZWJ1Z1Byb2Nlc3NvciAgOgorCQlwdWJsaWMgQXV0b1JlZ2lzdGVyZWRQcm9jZXNzb3JVbml0PCBBdm1EZWJ1Z1Byb2Nlc3NvciA+LAorCQlwdWJsaWMgSURlYnVnUHJvY2Vzc29yUHJvdmlkZXIKK3sKKworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBBdm1EZWJ1Z1Byb2Nlc3NvciApCisKKworCS8qKgorCSAqIFBST0NFU1NPUiBGQUNUT1JZCisJICogZm9yIGF1dG9tYXRpYyByZWdpc3RyYXRpb24gaW4gdGhlIHByb2Nlc3NvciByZXBvc2l0b3J5CisJICogdGhlIFsgWyBGVUxMWSBdIFFVQUxJRklFRCBdIE5BTUUgSUQKKwkgKi8KKwlBVk1fSU5KRUNUX0FVVE9fUkVHSVNURVJfUVVBTElGSUVEX0lEX0tFWSgKKwkJCSJhdm06OnByb2Nlc3Nvci5ERUJVR0dFUiIgKQorCS8vIGVuZCByZWdpc3RyYXRpb24KKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQXZtRGVidWdQcm9jZXNzb3IoU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyICYgYUNvbnRyb2xsZXJVbml0TWFuYWdlciwKKwkJCVdPYmplY3QgKiB3ZlBhcmFtZXRlck9iamVjdCA9IE5VTEwpCisJOiBSZWdpc3RlcmVkUHJvY2Vzc29yVW5pdChhQ29udHJvbGxlclVuaXRNYW5hZ2VyICwKKwkJCXdmUGFyYW1ldGVyT2JqZWN0ICwgUFJFQ0VERU5DRV9PRl9NQUlOX1BST0NFU1NPUiksCisJSURlYnVnUHJvY2Vzc29yUHJvdmlkZXIoIHRoaXMgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkF2bURlYnVnUHJvY2Vzc29yKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIENPTkZJR1VSRSBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwl2aXJ0dWFsIGJvb2wgY29uZmlndXJlSW1wbCgpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gUkVQT1JUIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgcmVwb3J0U2lsZW50KE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJLy8gU0lMRU5UID0+IE5PVEhJTkcKKwl9CisKKwl2aXJ0dWFsIHZvaWQgcmVwb3J0TWluaW11bShPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKKwl2aXJ0dWFsIHZvaWQgcmVwb3J0RGVmYXVsdChPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBQUk9DRVNTIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXZpcnR1YWwgYm9vbCBwcmVwcm9jZXNzKCk7CisKKwl2aXJ0dWFsIGJvb2wgcG9zdHByb2Nlc3MoKTsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIEZJTFRFUklORyBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwl2aXJ0dWFsIGJvb2wgZmlsdGVyaW5nSW5pdGlhbGl6ZSgpOworCXZpcnR1YWwgYm9vbCBmaWx0ZXJpbmdJbml0aWFsaXplKEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDKTsKKworCXZpcnR1YWwgYm9vbCBmaW5hbGl6ZUZpbHRlcmluZygpOworCXZpcnR1YWwgYm9vbCBmaW5hbGl6ZUZpbHRlcmluZyhFeGVjdXRpb25Db250ZXh0ICogYW5FQyk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyAoIFBSRSAvIFBPU1QgKSBGSUxURVIgIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXZpcnR1YWwgYm9vbCBwcmVmaWx0ZXIoKTsKKwl2aXJ0dWFsIGJvb2wgcHJlZmlsdGVyKEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKTsKKworCWJvb2wgZmluYWxpemVQcmVmaWx0ZXJpbmcoKTsKKworCXZpcnR1YWwgYm9vbCBwb3N0ZmlsdGVyKCk7CisJdmlydHVhbCBib29sIHBvc3RmaWx0ZXIoRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpOworCisJYm9vbCBmaW5hbGl6ZVBvc3RmaWx0ZXJpbmcoKTsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIERFQlVHIFBST0NFU1NJTkcgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJaW5saW5lIHZpcnR1YWwgYm9vbCBkZWJ1Z0V2YWxDb21tYW5kSW1wbCgpCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisKKwkvKioKKwkgKiBFVkFMIFRSQUNFCisJICovCisJdmlydHVhbCB2b2lkIHRyYWNlTWluaW11bVByZUV2YWwoCisJCQlPdXRTdHJlYW0gJiBvcywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpIGNvbnN0OworCisJdmlydHVhbCB2b2lkIHRyYWNlRGVmYXVsdFByZUV2YWwoCisJCQlPdXRTdHJlYW0gJiBvcywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpIGNvbnN0OworCisKKwl2aXJ0dWFsIHZvaWQgdHJhY2VNaW5pbXVtUG9zdEV2YWwoCisJCQlPdXRTdHJlYW0gJiBvcywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpIGNvbnN0OworCisJdmlydHVhbCB2b2lkIHRyYWNlRGVmYXVsdFBvc3RFdmFsKAorCQkJT3V0U3RyZWFtICYgb3MsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKSBjb25zdDsKKworCXZpcnR1YWwgdm9pZCByZXBvcnRFdmFsKE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFNFUklBTElaQVRJT04gQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJaW5saW5lIHZpcnR1YWwgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCWlmKCBtUGFyYW1ldGVyV09iamVjdCAhPSBOVUxMICkKKwkJeworCQkJbVBhcmFtZXRlcldPYmplY3QtPnRvU3RyZWFtKG9zKTsKKwkJfQorCX0KKworfTsKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qIEFWTURFQlVHUFJPQ0VTU09SX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vZGVidWcvSURlYnVnUHJvY2Vzc29yUHJvdmlkZXIuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2RlYnVnL0lEZWJ1Z1Byb2Nlc3NvclByb3ZpZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTgxYTFlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2RlYnVnL0lEZWJ1Z1Byb2Nlc3NvclByb3ZpZGVyLmNwcApAQCAtMCwwICsxLDMzOTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyNyBqYW52LiAyMDE1CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJJRGVidWdQcm9jZXNzb3JQcm92aWRlci5oIgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKworI2luY2x1ZGUgPHV0aWwvYXZtX3Zmcy5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZVF1ZXJ5Lmg+CisKKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25Db250ZXh0Lmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvUnVudGltZUZvcm0uaD4KKworI2luY2x1ZGUgPGZtbC90ZW1wbGF0ZS9UaW1lZE1hY2hpbmUuaD4KKworI2luY2x1ZGUgPGZtbC90cmFjZS9UcmFjZUZhY3RvcnkuaD4KKyNpbmNsdWRlIDxmbWwvdHJhY2UvVHJhY2VQb2ludC5oPgorCisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1F1ZXJ5Lmg+CisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1dPYmplY3QuaD4KKworI2luY2x1ZGUgPGZhbS9xdWV1ZS9FeGVjdXRpb25RdWV1ZS5oPgorCisjaW5jbHVkZSA8ZmFtL2NvdmVyYWdlL0F2bUNvdmVyYWdlRGlyZWN0aXZlVHJhY2VCdWlsZGVyLmg+CisKKyNpbmNsdWRlIDxzZXcvQ29uZmlndXJhdGlvbi5oPgorI2luY2x1ZGUgPHNldy9TeW1iZXhDb250cm9sbGVyUmVxdWVzdE1hbmFnZXIuaD4KKworI2luY2x1ZGUgPGJvb3N0L2Zvcm1hdC5ocHA+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorICogREVTVFJVQ1RPUgorICovCitJRGVidWdQcm9jZXNzb3JQcm92aWRlcjo6fklEZWJ1Z1Byb2Nlc3NvclByb3ZpZGVyKCkKK3sKKwlkZWxldGUoIG1EZWJ1Z1RyYWNlRmFjdG9yeSApOworfQorCisKKy8qCitwcm90b3R5cGUgcHJvY2Vzc29yOjpkZWJ1Z2dlciAiZGVidWdnZXIiIGFzIGF2bTo6cHJvY2Vzc29yLkRFQlVHR0VSIGlzCisvLyBFbmFibGUgb3Igbm90IGRlYnVnaW5nIGluIERpdmVyc2l0eSBwcm9jZXNzZXMKK3NlY3Rpb24gREVCVUcjU0NIRURVTElORworCUBmaWx0ZXIjZGV0YWlsID0gdHJ1ZTsKKwlAZmlsdGVyI2luaXRpYWxpemUgPSB0cnVlOworCisJQHByZWZpbHRlciA9IHRydWU7CisJQHByZWZpbHRlciNkZXRhaWwgPSB0cnVlOworCUBwcmVmaWx0ZXIjZmluYWxpemUgPSB0cnVlOworCisJQHBvc3RmaWx0ZXIgPSB0cnVlOworCUBwb3N0ZmlsdGVyI2RldGFpbCA9IHRydWU7CisJQHBvc3RmaWx0ZXIjZmluYWxpemUgPSB0cnVlOworCisJQHByZXByb2Nlc3MgPSB0cnVlOworCUBwcmVwcm9jZXNzI2RldGFpbD0gdHJ1ZTsKKworCUBwb3N0cHJvY2VzcyA9IHRydWU7CisJQHBvc3Rwcm9jZXNzI2RldGFpbCA9IHRydWU7CitlbmRzZWN0aW9uIERFQlVHI1NDSEVEVUxJTkcKKworc2VjdGlvbiBERUJVRyNQUk9QRVJUWQorCS8vIEFic29sdXRlIG9yIHJlbGF0aXZlIChmcm9tIExPQ0FUSU9OQGxvZyBmb2xkZXIpIHNjcmlwdCBmaWxlIHBhdGgKKwlAc2NyaXB0ID0gInBhdGgvdG8vZmlsZS9kaXZlcnNpdHkuZGJnIjsKKworCS8vIEVuYWJsZSBEZWJ1ZyBDb21tYW5kIFNoZWxsIFJFUEwKKwlAc2hlbGwgPSB0cnVlOworZW5kc2VjdGlvbiBERUJVRyNQUk9QRVJUWQorCitzZWN0aW9uIERFQlVHI0JSRUFLUE9JTlQKKwkvLyBUaGUgc3RlcCBvZiBmaXJzdCBicmVhaworCUBzdGVwICAgID0gMTAwOworCisJLy8gQnJlYWsgb24gdGhpcyBjb250ZXh0IElEIG51bWJlciBiZWZvcmUgaGlzIGV4ZWN1dGlvbgorCUBjb250ZXh0ID0gMjE7CisKKwkvLyBUaGUgcGVyaW9kaWMgYnJlYWsgYmFzZSBvbiBzdGVwIGNvdW50IGFuZCB0aGUgZmlyc3QgYnJlYWsgc3RlcAorCUBwZXJpb2QgID0gMTA7CitlbmRzZWN0aW9uIERFQlVHI0JSRUFLUE9JTlQKKworc2VjdGlvbiBERUJVRyNUUkFDRQorCUB2YXIgPSB2YXIjaWQ7CisJQHZhciA9ICJtYWNoaW5lI2lkLT52YXIjaWQiOworCisJQGJ1ZmZlciA9IGJ1ZmZlciNpZDsKKwlAYnVmZmVyID0gIm1hY2hpbmUjaWQtPmJ1ZmZlciNpZCI7CisKKwlAcG9ydCA9IHBvcnQjaWQ7CisJQHBvcnQgPSAibWFjaGluZSNpZC0+cG9ydCNpZDsKKworCUBzaWduYWwgPSBzaWduYWwjaWQ7CisJQHNpZ25hbCA9ICJtYWNoaW5lI2lkLT5zaWduYWwjaWQiOworCisJQG1hY2hpbmUgPSBtYWNoaW5lI2lkOworCUBtYWNoaW5lID0gIm1hY2hpbmUjaWQtPm1hY2hpbmUjaWQiOworCisJQHN0YXRlID0gc3RhdGUjaWQ7CisJQHN0YXRlID0gIm1hY2hpbmUjaWQtPnN0YXRlI2lkIjsKK2VuZHNlY3Rpb24gREVCVUcjVFJBQ0UKK2VuZHByb3RvdHlwZQorKi8KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ09ORklHVVJFIEFQSQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBJRGVidWdQcm9jZXNzb3JQcm92aWRlcjo6ZGVidWdDb25maWd1cmVJbXBsKFdPYmplY3QgKiB3ZlBhcmFtZXRlck9iamVjdCkKK3sKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gREVCVUcjUFJPUEVSVFkKKwlXT2JqZWN0ICogdGhlUFJPUEVSVFkgPSBRdWVyeTo6Z2V0V1NlcXVlbmNlT3JFbHNlKAorCQkJd2ZQYXJhbWV0ZXJPYmplY3QsICJERUJVRyNQUk9QRVJUWSIsICJQUk9QRVJUWSIpOworCisJbURlYnVnU2NyaXB0RmlsZSA9IFF1ZXJ5OjpnZXRXUHJvcGVydHlTdHJpbmcodGhlUFJPUEVSVFksICJzY3JpcHQiLCAiIik7CisKKwlpZiggbm90IG1EZWJ1Z1NjcmlwdEZpbGUuZW1wdHkoKSApCisJeworCQltRGVidWdTY3JpcHRGaWxlID0gVkZTOjpuYXRpdmVfcGF0aCgKKwkJCQltRGVidWdTY3JpcHRGaWxlLCBWRlM6OlByb2plY3RMb2dQYXRoICk7CisJfQorCisJbURlYnVnQ29uc29sZUZsYWcgPSBRdWVyeTo6Z2V0V1Byb3BlcnR5Qm9vbGVhbih0aGVQUk9QRVJUWSwgInNoZWxsIiwgdHJ1ZSk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBERUJVRyNTQ0hFRFVMSU5HCisJV09iamVjdCAqIHRoZVNDSEVEVUxJTkcgPSBRdWVyeTo6Z2V0UmVnZXhXU2VxdWVuY2Uod2ZQYXJhbWV0ZXJPYmplY3QsCisJCQlDT05TX1dJRDIoImRlYnVnIiwgInNjaGVkdWxpbmciKSAifCIKKwkJCUNPTlNfV0lEMigiREVCVUciLCAiU0NIRURVTElORyIpLCB0aGVQUk9QRVJUWSk7CisKKwltRGVidWdGaWx0ZXJpbmdEZXRhaWxGbGFnID0gUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5Qm9vbGVhbigKKwkJCXRoZVNDSEVEVUxJTkcsIENPTlNfV0lEMigiZmlsdGVyIiwgImRldGFpbCIpLCBmYWxzZSk7CisKKwltRGVidWdGaWx0ZXJpbmdJbml0aWFsaXplRmxhZyA9IFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eUJvb2xlYW4oCisJCQl0aGVTQ0hFRFVMSU5HLCBDT05TX1dJRDIoImZpbHRlciIsICJpbml0aWFsaXplIiksIGZhbHNlKTsKKworCisJbURlYnVnUHJlZmlsdGVyaW5nRmxhZyA9IFF1ZXJ5OjpnZXRXUHJvcGVydHlCb29sZWFuKAorCQkJdGhlU0NIRURVTElORywgInByZWZpbHRlciIsIGZhbHNlKTsKKworCW1EZWJ1Z1ByZWZpbHRlcmluZ0RldGFpbEZsYWcgPSBRdWVyeTo6Z2V0UmVnZXhXUHJvcGVydHlCb29sZWFuKAorCQkJdGhlU0NIRURVTElORywgQ09OU19XSUQyKCJwcmVmaWx0ZXIiLCAiZGV0YWlsIiksCisJCQltRGVidWdGaWx0ZXJpbmdEZXRhaWxGbGFnKTsKKworCW1EZWJ1Z1ByZWZpbHRlcmluZ0ZpbmFsaXplRmxhZyA9IFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eUJvb2xlYW4oCisJCQl0aGVTQ0hFRFVMSU5HLCBDT05TX1dJRDIoInByZWZpbHRlciIsICJmaW5hbGl6ZSIpLCBmYWxzZSk7CisKKworCW1EZWJ1Z1Bvc3RmaWx0ZXJpbmdGbGFnID0gUXVlcnk6OmdldFdQcm9wZXJ0eUJvb2xlYW4oCisJCQl0aGVTQ0hFRFVMSU5HLCAicG9zdGZpbHRlciIsIGZhbHNlKTsKKworCW1EZWJ1Z1Bvc3RmaWx0ZXJpbmdEZXRhaWxGbGFnID0gUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5Qm9vbGVhbigKKwkJCXRoZVNDSEVEVUxJTkcsIENPTlNfV0lEMigicG9zdGZpbHRlciIsICJkZXRhaWwiKSwKKwkJCW1EZWJ1Z0ZpbHRlcmluZ0RldGFpbEZsYWcpOworCisJbURlYnVnUG9zdGZpbHRlcmluZ0ZpbmFsaXplRmxhZyA9IFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eUJvb2xlYW4oCisJCQl0aGVTQ0hFRFVMSU5HLCBDT05TX1dJRDIoInBvc3RmaWx0ZXIiLCAiZmluYWxpemUiKSwgZmFsc2UpOworCisKKwltRGVidWdQcmVwcm9jZXNzaW5nRmxhZyA9IFF1ZXJ5OjpnZXRXUHJvcGVydHlCb29sZWFuKAorCQkJdGhlU0NIRURVTElORywgInByZXByb2Nlc3MiLCBmYWxzZSk7CisKKwltRGVidWdQcmVwcm9jZXNzaW5nRGV0YWlsRmxhZyA9IFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eUJvb2xlYW4oCisJCQl0aGVTQ0hFRFVMSU5HLCBDT05TX1dJRDIoInByZXByb2Nlc3MiLCAiZGV0YWlsIiksIGZhbHNlKTsKKworCisJbURlYnVnUG9zdHByb2Nlc3NpbmdGbGFnID0gUXVlcnk6OmdldFdQcm9wZXJ0eUJvb2xlYW4oCisJCQl0aGVTQ0hFRFVMSU5HLCAicG9zdHByb2Nlc3MiLCBmYWxzZSk7CisKKwltRGVidWdQb3N0cHJvY2Vzc2luZ0RldGFpbEZsYWcgPSBRdWVyeTo6Z2V0UmVnZXhXUHJvcGVydHlCb29sZWFuKAorCQkJdGhlU0NIRURVTElORywgQ09OU19XSUQyKCJwb3N0cHJvY2VzcyIsICJkZXRhaWwiKSwgZmFsc2UpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gREVCVUcjQlJFQUtQT0lOVAorCVdPYmplY3QgKiB0aGVCUkVBS1BPSU5UID0gUXVlcnk6OmdldFJlZ2V4V1NlcXVlbmNlKAorCQkJd2ZQYXJhbWV0ZXJPYmplY3QsIENPTlNfV0lEMigiKERFQlVHIiwgIik/QlJFQUtQT0lOVCIpLCB0aGVQUk9QRVJUWSk7CisKKwltRGVidWdCcmVha3BvaW50RXZhbFN0ZXAgPSBzdGQ6Om1heCggc3RhdGljX2Nhc3Q8IGF2bV9pbnRlZ2VyX3Q+KCAxICksCisJCQlRdWVyeTo6Z2V0V1Byb3BlcnR5SW50ZWdlcih0aGVCUkVBS1BPSU5ULCAic3RlcCIsIDEpICk7CisKKwltRGVidWdCcmVha3BvaW50RXZhbENvbnRleHQgPSBzdGQ6Om1heCggc3RhdGljX2Nhc3Q8IGF2bV9pbnRlZ2VyX3Q+KCAwICksCisJCQlRdWVyeTo6Z2V0V1Byb3BlcnR5SW50ZWdlcih0aGVCUkVBS1BPSU5ULCAiY29udGV4dCIsIDApICk7CisKKwltRGVidWdCcmVha3BvaW50RXZhbFN0ZXBQZXJpb2QgPSBzdGQ6Om1heCggc3RhdGljX2Nhc3Q8IGF2bV9pbnRlZ2VyX3Q+KCAxICksCisJCQlRdWVyeTo6Z2V0V1Byb3BlcnR5SW50ZWdlcih0aGVCUkVBS1BPSU5ULCAicGVyaW9kIiwgMSkgKTsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFRyYWNlIEZhY3RvcnkgdG9vbHMKKwlpZiggVGltZWRNYWNoaW5lOjpTWVNURU1fVkFSX0RFTFRBX1RJTUUgIT0gTlVMTCApCisJeworCQlFeGVjdXRhYmxlUXVlcnkgWFF1ZXJ5KCBtRGVidWdDb25maWd1cmF0aW9uICk7CisKKwkJbURlYnVnRGVsdGFUaW1lVmFyaWFibGUgPSBYUXVlcnkuZ2V0RGF0YUJ5QXN0RWxlbWVudCgKKwkJCQlUaW1lZE1hY2hpbmU6OlNZU1RFTV9WQVJfREVMVEFfVElNRSkudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCk7CisJfQorCisJbURlYnVnVHJhY2VGYWN0b3J5ID0gbmV3IFRyYWNlRmFjdG9yeShtRGVidWdDb25maWd1cmF0aW9uLAorCQkJbURlYnVnUHJvY2Vzc29yLT5nZXRFTlYoKSwgd2ZQYXJhbWV0ZXJPYmplY3QsCisJCQlOVUxMLCBtRGVidWdEZWx0YVRpbWVWYXJpYWJsZSk7CisKKwljb25zdCBFeGVjdXRpb25EYXRhICYgdGhlTWFpbkVEID0KKwkJCW1EZWJ1Z1Byb2Nlc3Nvci0+Z2V0Q29uZmlndXJhdGlvbigpLmdldE1haW5FeGVjdXRpb25EYXRhKCk7CisKKwltRGVidWdQYXJhbWV0ZXJzTWFjaGluZS5SSUQgICAgID0gdGhlTWFpbkVELmdldFBhcmFtZXRlcnNSSUQoKTsKKwltRGVidWdQYXJhbWV0ZXJzTWFjaGluZS5tYWNoaW5lID0gbURlYnVnUGFyYW1ldGVyc01hY2hpbmUuUklELmdldEluc3RhbmNlKCk7CisJbURlYnVnUGFyYW1ldGVyc01hY2hpbmUub2JqZWN0ICA9IG1EZWJ1Z1BhcmFtZXRlcnNNYWNoaW5lLm1hY2hpbmU7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBERUJVRyNUUkFDRQorCVdPYmplY3QgKiB0aGVUUkFDRSA9IFF1ZXJ5OjpnZXRXU2VxdWVuY2VPckVsc2UoCisJCQl3ZlBhcmFtZXRlck9iamVjdCwgIkRFQlVHI1RSQUNFIiwgIkRFQlVHIik7CisJaWYoICh0aGVUUkFDRSAhPSBXT2JqZWN0OjpfTlVMTF8pCisJCSYmIHRoZVRSQUNFLT5oYXNPd25lZEVsZW1lbnQoKQorCQkmJiBtRGVidWdUcmFjZUZhY3RvcnktPmNvbmZpZ3VyZSgKKwkJCQl0aGVUUkFDRSwgbURlYnVnVHJhY2VTZXF1ZW5jZSwgKCYgdGhlTWFpbkVEKSkgKQorCXsKKwkJQkZMaXN0Ojpjb25zdF9pdGVyYXRvciBpdFBvaW50ID0gbURlYnVnVHJhY2VTZXF1ZW5jZS5wb2ludHMuYmVnaW4oKTsKKwkJQkZMaXN0Ojpjb25zdF9pdGVyYXRvciBlbmRQb2ludCA9IG1EZWJ1Z1RyYWNlU2VxdWVuY2UucG9pbnRzLmVuZCgpOworCQlmb3IoIDsgaXRQb2ludCAhPSBlbmRQb2ludCA7ICsraXRQb2ludCApCisJCXsKKwkJCWlmKCAoKml0UG9pbnQpLmlzPCBUcmFjZVBvaW50ID4oKSApCisJCQl7CisJCQkJZGJnVHJhY2VQb2ludCA9ICgqaXRQb2ludCkudG9fcHRyPCBUcmFjZVBvaW50ID4oKTsKKworCQkJCXN3aXRjaCggZGJnVHJhY2VQb2ludC0+bmF0dXJlICkKKwkJCQl7CisJCQkJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfQ09NX05BVFVSRToKKwkJCQkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9DSEFOTkVMX05BVFVSRToKKwkJCQkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9NRVNTQUdFX05BVFVSRToKKwkJCQkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9QT1JUX05BVFVSRToKKwkJCQkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9TSUdOQUxfTkFUVVJFOgorCQkJCQl7CisJCQkJCQltRGVidWdTZWxlY3RlZFBvcnRzLmFwcGVuZCggZGJnVHJhY2VQb2ludCApOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9USU1FX05BVFVSRToKKwkJCQkJeworCQkJCQkJbURlYnVnU2VsZWN0ZWRUaW1lVmFyID0gZGJnVHJhY2VQb2ludDsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfVkFSSUFCTEVfTkFUVVJFOgorCQkJCQl7CisJCQkJCQltRGVidWdTZWxlY3RlZFZhcnMuYXBwZW5kKCBkYmdUcmFjZVBvaW50ICk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX0JVRkZFUl9OQVRVUkU6CisJCQkJCXsKKwkJCQkJCW1EZWJ1Z1NlbGVjdGVkQnVmZmVycy5hcHBlbmQoIGRiZ1RyYWNlUG9pbnQgKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9NQUNISU5FX05BVFVSRToKKwkJCQkJeworCQkJCQkJbURlYnVnU2VsZWN0ZWRNYWNoaW5lcy5hcHBlbmQoIGRiZ1RyYWNlUG9pbnQgKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfU1RBVEVNQUNISU5FX05BVFVSRToKKwkJCQkJeworCQkJCQkJbURlYnVnU2VsZWN0ZWRTdGF0ZW1hY2hpbmVzLmFwcGVuZCggZGJnVHJhY2VQb2ludCApOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9TVEFURV9OQVRVUkU6CisJCQkJCXsKKwkJCQkJCW1EZWJ1Z1NlbGVjdGVkU3RhdGVzLmFwcGVuZCggZGJnVHJhY2VQb2ludCApOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1RSQU5TSVRJT05fTkFUVVJFOgorCQkJCQl7CisJCQkJCQltRGVidWdTZWxlY3RlZFRyYW5zaXRpb25zLmFwcGVuZCggZGJnVHJhY2VQb2ludCApOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9ST1VUSU5FX05BVFVSRToKKwkJCQkJeworCQkJCQkJbURlYnVnU2VsZWN0ZWRSb3V0aW5lcy5hcHBlbmQoIGRiZ1RyYWNlUG9pbnQgKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfUlVOTkFCTEVfTkFUVVJFOgorCQkJCQl7CisJCQkJCQltRGVidWdTZWxlY3RlZFJ1bm5hYmxlcy5hcHBlbmQoIGRiZ1RyYWNlUG9pbnQgKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJZGVmYXVsdDoKKwkJCQkJeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiggbURlYnVnU2VsZWN0ZWRWYXJzLm5vbmVtcHR5KCkgKQorCQl7CisJCQltRGVidWdTZWxlY3RlZFZhciA9IG1EZWJ1Z1NlbGVjdGVkVmFycy5maXJzdCgpOworCQl9CisKKwkJaWYoIG1EZWJ1Z1NlbGVjdGVkUG9ydHMubm9uZW1wdHkoKSApCisJCXsKKwkJCW1EZWJ1Z1NlbGVjdGVkUG9ydCA9IG1EZWJ1Z1NlbGVjdGVkUG9ydHMuZmlyc3QoKTsKKwkJfQorCisJCWlmKCBtRGVidWdTZWxlY3RlZEJ1ZmZlcnMubm9uZW1wdHkoKSApCisJCXsKKwkJCW1EZWJ1Z1NlbGVjdGVkQnVmZmVyID0gbURlYnVnU2VsZWN0ZWRCdWZmZXJzLmZpcnN0KCk7CisJCX0KKworCQlpZiggbURlYnVnU2VsZWN0ZWRNYWNoaW5lcy5ub25lbXB0eSgpICkKKwkJeworCQkJbURlYnVnU2VsZWN0ZWRNYWNoaW5lID0gbURlYnVnU2VsZWN0ZWRNYWNoaW5lcy5maXJzdCgpOworCQl9CisKKwkJaWYoIG1EZWJ1Z1NlbGVjdGVkU3RhdGVzLm5vbmVtcHR5KCkgKQorCQl7CisJCQltRGVidWdTZWxlY3RlZFN0YXRlID0gbURlYnVnU2VsZWN0ZWRTdGF0ZXMuZmlyc3QoKTsKKwkJfQorCisJCWlmKCBtRGVidWdTZWxlY3RlZFN0YXRlbWFjaGluZXMubm9uZW1wdHkoKSApCisJCXsKKwkJCW1EZWJ1Z1NlbGVjdGVkU3RhdGVtYWNoaW5lID0gbURlYnVnU2VsZWN0ZWRTdGF0ZW1hY2hpbmVzLmZpcnN0KCk7CisJCX0KKworCQlpZiggbURlYnVnU2VsZWN0ZWRUcmFuc2l0aW9ucy5ub25lbXB0eSgpICkKKwkJeworCQkJbURlYnVnU2VsZWN0ZWRUcmFuc2l0aW9uID0gbURlYnVnU2VsZWN0ZWRUcmFuc2l0aW9ucy5maXJzdCgpOworCQl9CisKKwkJaWYoIG1EZWJ1Z1NlbGVjdGVkUm91dGluZXMubm9uZW1wdHkoKSApCisJCXsKKwkJCW1EZWJ1Z1NlbGVjdGVkUm91dGluZSA9IG1EZWJ1Z1NlbGVjdGVkUm91dGluZXMuZmlyc3QoKTsKKwkJfQorCisJCWlmKCBtRGVidWdTZWxlY3RlZFJ1bm5hYmxlcy5ub25lbXB0eSgpICkKKwkJeworCQkJbURlYnVnU2VsZWN0ZWRSdW5uYWJsZSA9IG1EZWJ1Z1NlbGVjdGVkUnVubmFibGVzLmZpcnN0KCk7CisJCX0KKwl9CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gT3RoZXIgUHJvcGVydHkKKwltRGVidWdFdmFsU3RlcENvdW50ID0gMDsKKworCXJldHVybiggdHJ1ZSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBQUk9DRVNTIEFQSQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBJRGVidWdQcm9jZXNzb3JQcm92aWRlcjo6ZGVidWdQcmVwcm9jZXNzaW5nKCkKK3sKKwlpZiggbURlYnVnUHJlcHJvY2Vzc2luZ0ZsYWcgKQorCXsKKwkJZGJnUXVldWUgPSAmKCBtRGVidWdQcm9jZXNzb3ItPmdldEV4ZWN1dGlvblF1ZXVlKCkuZ2V0SW5pdFF1ZXVlKCkgKTsKKworCQlpZiggZGJnUXVldWUtPm5vbmVtcHR5KCkgKQorCQl7CisJCQltRGVidWdTZWxlY3RlZENvbnRleHQgPSBkYmdRdWV1ZS0+Zmlyc3QoKTsKKwkJfQorCisJCW1EZWJ1Z1Byb21wdFByZWZpeCA9ICJQUkVQUk9DRVNTSU5HIjsKKworCQlkZWJ1Z1JlYWRFdmFsQ29tbWFuZCgpOworCisJCWlmKCBtRGVidWdQcmVwcm9jZXNzaW5nRGV0YWlsRmxhZyApCisJCXsKKwkJCWRiZ1F1ZXVlSXQgPSBkYmdRdWV1ZS0+YmVnaW4oKTsKKwkJCWRiZ1F1ZXVlSXRFbmQgPSBkYmdRdWV1ZS0+ZW5kKCk7CisJCQlmb3IoIDsgZGJnUXVldWVJdCAhPSBkYmdRdWV1ZUl0RW5kIDsgKytkYmdRdWV1ZUl0ICkKKwkJCXsKKwkJCQlkZWJ1Z1ByZXByb2Nlc3NpbmcoKmRiZ1F1ZXVlSXQpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKK2Jvb2wgSURlYnVnUHJvY2Vzc29yUHJvdmlkZXI6OmRlYnVnUHJlcHJvY2Vzc2luZyhjb25zdCBFeGVjdXRpb25Db250ZXh0ICogYW5FQykKK3sKKwlpZiggbURlYnVnRW5hYmxlZEZsYWcgJiYgbURlYnVnUHJlcHJvY2Vzc2luZ0ZsYWcgKQorCXsKKwkJbURlYnVnU2VsZWN0ZWRDb250ZXh0ID0gYW5FQzsKKworCQltRGVidWdQcm9tcHRQcmVmaXggPSAiUFJFUFJPQ0VTU0lORyNERVRBSUwiOworCisJCWRlYnVnUmVhZEV2YWxDb21tYW5kKCk7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworYm9vbCBJRGVidWdQcm9jZXNzb3JQcm92aWRlcjo6ZGVidWdQb3N0cHJvY2Vzc2luZygpCit7CisJaWYoIG1EZWJ1Z1Bvc3Rwcm9jZXNzaW5nRmxhZyApCisJeworCQltRGVidWdQcm9tcHRQcmVmaXggPSAiUE9TVFBST0NFU1NJTkciOworCisJCW1EZWJ1Z1NlbGVjdGVkQ29udGV4dCA9IE5VTEw7CisKKwkJZGVidWdSZWFkRXZhbENvbW1hbmQoKTsKKworCQlpZiggbURlYnVnUG9zdHByb2Nlc3NpbmdEZXRhaWxGbGFnCisJCQkmJiBtRGVidWdQcm9jZXNzb3ItPmdldENvbmZpZ3VyYXRpb24oKS5oYXNUcmFjZSgpICkKKwkJeworCQkJTGlzdE9mRXhlY3V0aW9uQ29udGV4dCBsaXN0T2ZSb290RUMoCisJCQkJCW1EZWJ1Z1Byb2Nlc3Nvci0+Z2V0Q29uZmlndXJhdGlvbigpLmdldFRyYWNlKCkubGFzdCgpICk7CisKKwkJCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQgbGlzdE9mTGVhZkVDOworCisJCQltRGVidWdQcm9jZXNzb3ItPmNvbXB1dGVMZWFmRUMobGlzdE9mUm9vdEVDLCBsaXN0T2ZMZWFmRUMpOworCisJCQlkYmdRdWV1ZSA9ICYgbGlzdE9mTGVhZkVDOworCisJCQkvLyEhIERldGFpbCBvbiB3aGF0ID8gbGVhZiBFQyA/CisJCQlkYmdRdWV1ZUl0ID0gZGJnUXVldWUtPmJlZ2luKCk7CisJCQlkYmdRdWV1ZUl0RW5kID0gZGJnUXVldWUtPmVuZCgpOworCQkJZm9yKCA7IGRiZ1F1ZXVlSXQgIT0gZGJnUXVldWVJdEVuZCA7ICsrZGJnUXVldWVJdCApCisJCQl7CisJCQkJZGVidWdQb3N0cHJvY2Vzc2luZygqZGJnUXVldWVJdCk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworYm9vbCBJRGVidWdQcm9jZXNzb3JQcm92aWRlcjo6ZGVidWdQb3N0cHJvY2Vzc2luZyhjb25zdCBFeGVjdXRpb25Db250ZXh0ICogYW5FQykKK3sKKwlpZiggbURlYnVnRW5hYmxlZEZsYWcgJiYgbURlYnVnUHJlcHJvY2Vzc2luZ0ZsYWcgKQorCXsKKwkJbURlYnVnU2VsZWN0ZWRDb250ZXh0ID0gYW5FQzsKKworCQltRGVidWdQcm9tcHRQcmVmaXggPSAiUE9TVFBST0NFU1NJTkcjREVUQUlMIjsKKworCQlkZWJ1Z1JlYWRFdmFsQ29tbWFuZCgpOworCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBQ1RJVkFUT1IgVFJJR0dFUiBUT09MUworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBJRGVidWdQcm9jZXNzb3JQcm92aWRlcjo6ZGVidWdBY3RpdmF0b3JUcmlnZ2VyaW5nKCkKK3sKKwlkYmdRdWV1ZSA9ICYoIG1EZWJ1Z1Byb2Nlc3Nvci0+Z2V0RXhlY3V0aW9uUXVldWUoKS5nZXRSZWFkeVF1ZXVlKCkgKTsKKworCWlmKCBkYmdRdWV1ZS0+bm9uZW1wdHkoKSApCisJeworCQlpZiggKCsrbURlYnVnRXZhbFN0ZXBDb3VudCA+PSBtRGVidWdCcmVha3BvaW50RXZhbFN0ZXApICkKKwkJeworCQkJbURlYnVnRW5hYmxlZEZsYWcgPSB0cnVlOworCisJCQltRGVidWdCcmVha3BvaW50RXZhbFN0ZXAgPQorCQkJCQltRGVidWdFdmFsU3RlcENvdW50ICsgbURlYnVnQnJlYWtwb2ludEV2YWxTdGVwUGVyaW9kOworCisJCQlpZiggZGJnUXVldWUtPm5vbmVtcHR5KCkgKQorCQkJeworCQkJCW1EZWJ1Z1NlbGVjdGVkQ29udGV4dCA9IGRiZ1F1ZXVlLT5maXJzdCgpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJbURlYnVnRW5hYmxlZEZsYWcgPSBmYWxzZTsKKwkJfQorCisJCWlmKCBtRGVidWdCcmVha3BvaW50RXZhbENvbnRleHQgPiAwICkKKwkJeworCQkJZGJnUXVldWVJdCA9IGRiZ1F1ZXVlLT5iZWdpbigpOworCQkJZGJnUXVldWVJdEVuZCA9IGRiZ1F1ZXVlLT5lbmQoKTsKKwkJCWZvciggOyBkYmdRdWV1ZUl0ICE9IGRiZ1F1ZXVlSXRFbmQgOyArK2RiZ1F1ZXVlSXQgKQorCQkJeworCQkJCWlmKCAoKmRiZ1F1ZXVlSXQpLT5nZXRJZE51bWJlcigpID09IG1EZWJ1Z0JyZWFrcG9pbnRFdmFsQ29udGV4dCApCisJCQkJeworCQkJCQltRGVidWdFbmFibGVkRmxhZyA9IHRydWU7CisKKwkJCQkJbURlYnVnU2VsZWN0ZWRDb250ZXh0ID0gKCpkYmdRdWV1ZUl0KTsKKworCQkJCQltRGVidWdCcmVha3BvaW50RXZhbENvbnRleHQgPSAwOworCisJCQkJCUFWTV9PU19DT1VUIDw8IHN0ZDo6ZW5kbCA8PCAiQnJlYWtwb2ludCBDb250ZXh0IHJlYWNoZWQgOj4gIjsKKwkJCQkJbURlYnVnU2VsZWN0ZWRDb250ZXh0LT50cmFjZU1pbmltdW0oIEFWTV9PU19DT1VUICk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWVsc2UKKwl7CisJCW1EZWJ1Z0VuYWJsZWRGbGFnID0gZmFsc2U7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIElOSVRJQUxJWkUtRklMVEVSIEFQSQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBJRGVidWdQcm9jZXNzb3JQcm92aWRlcjo6ZGVidWdGaWx0ZXJpbmdJbml0aWFsaXplKCkKK3sKKwlkYmdRdWV1ZSA9ICYoIG1EZWJ1Z1Byb2Nlc3Nvci0+Z2V0RXhlY3V0aW9uUXVldWUoKS5nZXRJbml0UXVldWUoKSApOworCisJaWYoIG1EZWJ1Z0VuYWJsZWRGbGFnICYmIG1EZWJ1Z1ByZWZpbHRlcmluZ0ZsYWcgKQorCXsKKwkJaWYoIGRiZ1F1ZXVlLT5ub25lbXB0eSgpICkKKwkJeworCQkJbURlYnVnU2VsZWN0ZWRDb250ZXh0ID0gZGJnUXVldWUtPmZpcnN0KCk7CisJCX0KKworCQltRGVidWdQcm9tcHRQcmVmaXggPSAiRklMVEVSSU5HI0lOSVRJQUxJWkUiOworCisJCWRlYnVnUmVhZEV2YWxDb21tYW5kKCk7CisKKwkJaWYoIG1EZWJ1Z0ZpbHRlcmluZ0RldGFpbEZsYWcgKQorCQl7CisJCQlkYmdRdWV1ZUl0ID0gZGJnUXVldWUtPmJlZ2luKCk7CisJCQlkYmdRdWV1ZUl0RW5kID0gZGJnUXVldWUtPmVuZCgpOworCQkJZm9yKCA7IGRiZ1F1ZXVlSXQgIT0gZGJnUXVldWVJdEVuZCA7ICsrZGJnUXVldWVJdCApCisJCQl7CisJCQkJZGVidWdGaWx0ZXJpbmdJbml0aWFsaXplKCpkYmdRdWV1ZUl0KTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCitib29sIElEZWJ1Z1Byb2Nlc3NvclByb3ZpZGVyOjpkZWJ1Z0ZpbHRlcmluZ0luaXRpYWxpemUoY29uc3QgRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpCit7CisJaWYoIG1EZWJ1Z0VuYWJsZWRGbGFnICYmIG1EZWJ1Z0ZpbHRlcmluZ0luaXRpYWxpemVGbGFnICkKKwl7CisJCW1EZWJ1Z1NlbGVjdGVkQ29udGV4dCA9IGFuRUM7CisKKwkJbURlYnVnUHJvbXB0UHJlZml4ID0gIkZJTFRFUklORyNJTklUSUFMSVpFI0RFVEFJTCI7CisKKwkJZGVidWdSZWFkRXZhbENvbW1hbmQoKTsKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRklOQUxJWkUtRklMVEVSIEFQSQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBJRGVidWdQcm9jZXNzb3JQcm92aWRlcjo6ZGVidWdGaWx0ZXJpbmdGaW5hbGl6ZSgpCit7CisJZGJnUXVldWUgPSAmKCBtRGVidWdQcm9jZXNzb3ItPmdldEV4ZWN1dGlvblF1ZXVlKCkuZ2V0SW5pdFF1ZXVlKCkgKTsKKworCWlmKCBtRGVidWdFbmFibGVkRmxhZyAmJiBtRGVidWdQcmVmaWx0ZXJpbmdGbGFnICkKKwl7CisJCWlmKCBkYmdRdWV1ZS0+bm9uZW1wdHkoKSApCisJCXsKKwkJCW1EZWJ1Z1NlbGVjdGVkQ29udGV4dCA9IGRiZ1F1ZXVlLT5maXJzdCgpOworCQl9CisKKwkJbURlYnVnUHJvbXB0UHJlZml4ID0gIkZJTFRFUklORyNGSU5BTElaRSI7CisKKwkJZGVidWdSZWFkRXZhbENvbW1hbmQoKTsKKworCQlpZiggbURlYnVnRmlsdGVyaW5nRGV0YWlsRmxhZyApCisJCXsKKwkJCWRiZ1F1ZXVlSXQgPSBkYmdRdWV1ZS0+YmVnaW4oKTsKKwkJCWRiZ1F1ZXVlSXRFbmQgPSBkYmdRdWV1ZS0+ZW5kKCk7CisJCQlmb3IoIDsgZGJnUXVldWVJdCAhPSBkYmdRdWV1ZUl0RW5kIDsgKytkYmdRdWV1ZUl0ICkKKwkJCXsKKwkJCQlkZWJ1Z0ZpbHRlcmluZ0ZpbmFsaXplKCpkYmdRdWV1ZUl0KTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCitib29sIElEZWJ1Z1Byb2Nlc3NvclByb3ZpZGVyOjpkZWJ1Z0ZpbHRlcmluZ0ZpbmFsaXplKGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDKQoreworCWlmKCBtRGVidWdFbmFibGVkRmxhZyAmJiBtRGVidWdGaWx0ZXJpbmdGaW5hbGl6ZUZsYWcgKQorCXsKKwkJbURlYnVnU2VsZWN0ZWRDb250ZXh0ID0gYW5FQzsKKworCQltRGVidWdQcm9tcHRQcmVmaXggPSAiRklMVEVSSU5HI0ZJTkFMSVpFI0RFVEFJTCI7CisKKwkJZGVidWdSZWFkRXZhbENvbW1hbmQoKTsKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUFJFLUZJTFRFUiBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgSURlYnVnUHJvY2Vzc29yUHJvdmlkZXI6OmRlYnVnUHJlZmlsdGVyaW5nKCkKK3sKKwlkZWJ1Z0FjdGl2YXRvclRyaWdnZXJpbmcoKTsKKworCWlmKCBtRGVidWdFbmFibGVkRmxhZyAmJiBtRGVidWdQcmVmaWx0ZXJpbmdGbGFnICkKKwl7CisJCWlmKCBkYmdRdWV1ZS0+bm9uZW1wdHkoKSApCisJCXsKKwkJCW1EZWJ1Z1NlbGVjdGVkQ29udGV4dCA9IGRiZ1F1ZXVlLT5maXJzdCgpOworCQl9CisKKwkJbURlYnVnUHJvbXB0UHJlZml4ID0gIlBSRUZJTFRFUklORyI7CisKKwkJZGVidWdSZWFkRXZhbENvbW1hbmQoKTsKKworCQlpZiggbURlYnVnUHJlZmlsdGVyaW5nRGV0YWlsRmxhZyApCisJCXsKKwkJCWRiZ1F1ZXVlSXQgPSBkYmdRdWV1ZS0+YmVnaW4oKTsKKwkJCWRiZ1F1ZXVlSXRFbmQgPSBkYmdRdWV1ZS0+ZW5kKCk7CisJCQlmb3IoIDsgZGJnUXVldWVJdCAhPSBkYmdRdWV1ZUl0RW5kIDsgKytkYmdRdWV1ZUl0ICkKKwkJCXsKKwkJCQlkZWJ1Z1ByZWZpbHRlcmluZygqZGJnUXVldWVJdCk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworYm9vbCBJRGVidWdQcm9jZXNzb3JQcm92aWRlcjo6ZGVidWdQcmVmaWx0ZXJpbmcoY29uc3QgRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpCit7CisJaWYoIG1EZWJ1Z0VuYWJsZWRGbGFnICYmIG1EZWJ1Z1ByZWZpbHRlcmluZ0ZsYWcgKQorCXsKKwkJbURlYnVnU2VsZWN0ZWRDb250ZXh0ID0gYW5FQzsKKworCQltRGVidWdQcm9tcHRQcmVmaXggPSAiUFJFRklMVEVSSU5HI0RFVEFJTCI7CisKKwkJZGVidWdSZWFkRXZhbENvbW1hbmQoKTsKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCitib29sIElEZWJ1Z1Byb2Nlc3NvclByb3ZpZGVyOjpkZWJ1Z1ByZWZpbHRlcmluZ0ZpbmFsaXplKCkKK3sKKwlpZiggbURlYnVnRW5hYmxlZEZsYWcgJiYgbURlYnVnUHJlZmlsdGVyaW5nRmluYWxpemVGbGFnICkKKwl7CisJCWRiZ1F1ZXVlID0gJiggbURlYnVnUHJvY2Vzc29yLT5nZXRFeGVjdXRpb25RdWV1ZSgpLmdldFJlYWR5UXVldWUoKSApOworCisJCWlmKCBkYmdRdWV1ZS0+bm9uZW1wdHkoKSApCisJCXsKKwkJCW1EZWJ1Z1NlbGVjdGVkQ29udGV4dCA9IGRiZ1F1ZXVlLT5maXJzdCgpOworCQl9CisKKwkJbURlYnVnUHJvbXB0UHJlZml4ID0gIlBSRUZJTFRFUklORyNGSU5BTElaRSI7CisKKwkJZGVidWdSZWFkRXZhbENvbW1hbmQoKTsKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUE9TVC1GSUxURVIgQVBJCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIElEZWJ1Z1Byb2Nlc3NvclByb3ZpZGVyOjpkZWJ1Z1Bvc3RmaWx0ZXJpbmcoKQoreworCWRiZ1F1ZXVlID0gJiggbURlYnVnUHJvY2Vzc29yLT5nZXRFeGVjdXRpb25RdWV1ZSgpLmdldFJlc3VsdFF1ZXVlKCkgKTsKKworCWlmKCBtRGVidWdFbmFibGVkRmxhZyAmJiBtRGVidWdQb3N0ZmlsdGVyaW5nRmxhZyApCisJeworCQlpZiggZGJnUXVldWUtPm5vbmVtcHR5KCkgKQorCQl7CisJCQltRGVidWdTZWxlY3RlZENvbnRleHQgPSBkYmdRdWV1ZS0+Zmlyc3QoKTsKKwkJfQorCisJCW1EZWJ1Z1Byb21wdFByZWZpeCA9ICJQT1NURklMVEVSSU5HIjsKKworCQlkZWJ1Z1JlYWRFdmFsQ29tbWFuZCgpOworCisJCWlmKCBtRGVidWdQb3N0ZmlsdGVyaW5nRGV0YWlsRmxhZyApCisJCXsKKwkJCWRiZ1F1ZXVlSXQgPSBkYmdRdWV1ZS0+YmVnaW4oKTsKKwkJCWRiZ1F1ZXVlSXRFbmQgPSBkYmdRdWV1ZS0+ZW5kKCk7CisJCQlmb3IoIDsgZGJnUXVldWVJdCAhPSBkYmdRdWV1ZUl0RW5kIDsgKytkYmdRdWV1ZUl0ICkKKwkJCXsKKwkJCQlkZWJ1Z1Bvc3RmaWx0ZXJpbmcoKmRiZ1F1ZXVlSXQpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuKCBtRGVidWdQcm9jZXNzb3ItPmdldEV4ZWN1dGlvblF1ZXVlKCkuaGFzUmVzdWx0KCkgKTsKK30KKworCitib29sIElEZWJ1Z1Byb2Nlc3NvclByb3ZpZGVyOjpkZWJ1Z1Bvc3RmaWx0ZXJpbmcoY29uc3QgRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpCit7CisJaWYoIG1EZWJ1Z0VuYWJsZWRGbGFnICYmIG1EZWJ1Z1Bvc3RmaWx0ZXJpbmdGbGFnICkKKwl7CisJCW1EZWJ1Z1NlbGVjdGVkQ29udGV4dCA9IGFuRUM7CisKKwkJbURlYnVnUHJvbXB0UHJlZml4ID0gIlBPU1RGSUxURVJJTkcjREVUQUlMIjsKKworCQlkZWJ1Z1JlYWRFdmFsQ29tbWFuZCgpOworCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKK2Jvb2wgSURlYnVnUHJvY2Vzc29yUHJvdmlkZXI6OmRlYnVnUG9zdGZpbHRlcmluZ0ZpbmFsaXplKCkKK3sKKwlpZiggbURlYnVnRW5hYmxlZEZsYWcgJiYgbURlYnVnUG9zdGZpbHRlcmluZ0ZpbmFsaXplRmxhZyApCisJeworCQlkYmdRdWV1ZSA9ICYoIG1EZWJ1Z1Byb2Nlc3Nvci0+Z2V0RXhlY3V0aW9uUXVldWUoKS5nZXRSZXN1bHRRdWV1ZSgpICk7CisKKwkJaWYoIGRiZ1F1ZXVlLT5ub25lbXB0eSgpICkKKwkJeworCQkJbURlYnVnU2VsZWN0ZWRDb250ZXh0ID0gZGJnUXVldWUtPmZpcnN0KCk7CisJCX0KKworCQltRGVidWdQcm9tcHRQcmVmaXggPSAiUE9TVEZJTFRFUklORyNGSU5BTElaRSI7CisKKwkJZGVidWdSZWFkRXZhbENvbW1hbmQoKTsKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU0NSSVBUIFBST0NFU1NJTkcKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgSURlYnVnUHJvY2Vzc29yUHJvdmlkZXI6OmRlYnVnUmVhZEV2YWxDb21tYW5kKCkKK3sKKwlpZiggbm90IG1EZWJ1Z1NjcmlwdEZpbGUuZW1wdHkoKSApCisJeworCQlkZWJ1Z1JlYWRFdmFsU2NyaXB0KCk7CisJfQorCisJaWYoIG1EZWJ1Z0NvbnNvbGVGbGFnICkKKwl7CisJCWlmKCBtRGVidWdTY3JpcHRGaWxlLmVtcHR5KCkgKQorCQl7CisJCQlBVk1fT1NfQ09VVCA8PCBzdGQ6OmVuZGw7CisJCX0KKworCQlkZWJ1Z1JlYWRFdmFsQ29tbWFuZExvb3AoKTsKKwl9Cit9CisKKwordm9pZCBJRGVidWdQcm9jZXNzb3JQcm92aWRlcjo6ZGVidWdSZWFkRXZhbFNjcmlwdCgpCit7CisJc3RkOjppZnN0cmVhbSBhU2NyaXB0U3RyZWFtKCBtRGVidWdTY3JpcHRGaWxlLmNfc3RyKCkgKTsKKworCWlmKCBpc0RlYnVnU2NyaXB0KGFTY3JpcHRTdHJlYW0pICkKKwl7CisJCWRlYnVnUmVhZEV2YWxTY3JpcHQoYVNjcmlwdFN0cmVhbSk7CisJfQorCisJYVNjcmlwdFN0cmVhbS5jbG9zZSgpOworfQorCitib29sIElEZWJ1Z1Byb2Nlc3NvclByb3ZpZGVyOjppc0RlYnVnU2NyaXB0KHN0ZDo6aWZzdHJlYW0gJiBhU2NyaXB0U3RyZWFtKQoreworCWlmKCBhU2NyaXB0U3RyZWFtLmdvb2QoKSApCisJeworCQlzdGQ6OmdldGxpbmUoYVNjcmlwdFN0cmVhbSwgZGJnQ29tbWFuZExpbmUpOworCisJCVN0cmluZ1Rvb2xzOjpsdHJpbSggZGJnQ29tbWFuZExpbmUgKTsKKworCQlpZiggKGRiZ0NvbW1hbmRMaW5lLmZpbmQoIiMhZGl2ZXJzaXR5IikgPT0gMCkgfHwKKwkJCShkYmdDb21tYW5kTGluZS5maW5kKCIjIWF2bSIpID09IDApICkKKwkJeworCQkJcmV0dXJuKCBhU2NyaXB0U3RyZWFtLmdvb2QoKSApOworCQl9CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCit2b2lkIElEZWJ1Z1Byb2Nlc3NvclByb3ZpZGVyOjpkZWJ1Z1JlYWRFdmFsU2NyaXB0KHN0ZDo6aWZzdHJlYW0gJiBhU2NyaXB0U3RyZWFtKQoreworCXdoaWxlKCBhU2NyaXB0U3RyZWFtLmdvb2QoKSApCisJeworCQlzdGQ6OmdldGxpbmUoYVNjcmlwdFN0cmVhbSwgZGJnQ29tbWFuZExpbmUpOworCQlTdHJpbmdUb29sczo6bHRyaW0oIGRiZ0NvbW1hbmRMaW5lICk7CisKKwkJaWYoIGRiZ0NvbW1hbmRMaW5lLmVtcHR5KCkgKQorCQl7CisJCQkvLyEhIElHTk9SRSBTUEFDRSAtLT4gY29udGludWUKKwkJfQorCQllbHNlCisJCXsKKwkJCWRlYnVnRXZhbENvbW1hbmQoKTsKKwkJfQorCX0KK30KKworCit2b2lkIElEZWJ1Z1Byb2Nlc3NvclByb3ZpZGVyOjpkZWJ1Z1JlYWRFdmFsQ29tbWFuZExvb3AoKQoreworCWRiZ0NvbnRpbnVlUkVQTCA9IHRydWU7CisKKwlBVk1fT1NfQ09VVCA8PCAiRW50ZXIgYSBjb21tYW5kIFtvciBoZWxwXSAiOworCisJd2hpbGUoIGRiZ0NvbnRpbnVlUkVQTCApCisJeworCQlBVk1fT1NfQ09VVCA8PCBtRGVidWdQcm9tcHRQcmVmaXgKKwkJCQk8PCAiIHsgc3RlcDogIiA8PCBtRGVidWdFdmFsU3RlcENvdW50CisJCQkJPDwgIiAoICsgIiA8PCBtRGVidWdCcmVha3BvaW50RXZhbFN0ZXBQZXJpb2QKKwkJCQk8PCAiICk9PT4gYnJlYWs6ICIgPDwgbURlYnVnQnJlYWtwb2ludEV2YWxTdGVwOworCQlpZiggbURlYnVnQnJlYWtwb2ludEV2YWxDb250ZXh0ID4gMCApCisJCXsKKwkJCUFWTV9PU19DT1VUIDw8ICIgfCBjdHg6ICIgPDwgbURlYnVnQnJlYWtwb2ludEV2YWxDb250ZXh0OworCisJCX0KKwkJQVZNX09TX0NPVVQgPDwgIiB9IFsgIiA8PCBzdGQ6OmZsdXNoOworCisJCWlmKCBtRGVidWdTZWxlY3RlZENvbnRleHQgIT0gTlVMTCApCisJCXsKKwkJCUFWTV9PU19DT1VUIDw8ICggbURlYnVnVHJhY2VGdWxsUGF0aEZsYWcgPyAicGF0aCIgOiAiY3R4IiApCisJCQkJCTw8ICI6IiA8PCBtRGVidWdTZWxlY3RlZENvbnRleHQtPmdldElkTnVtYmVyKCk7CisJCX0KKwkJaWYoIGRiZ0RldGFpbHNNaW4gfHwgZGJnRGV0YWlsc01lZCB8fCBkYmdEZXRhaWxzTWF4ICkKKwkJeworCQkJQVZNX09TX0NPVVQgPDwgIiAsIGRldGFpbDoiOworCQkJaWYoIGRiZ0RldGFpbHNNYXggKSB7IEFWTV9PU19DT1VUIDw8ICIqIjsgfQorCQkJaWYoIGRiZ0RldGFpbHNNZWQgKSB7IEFWTV9PU19DT1VUIDw8ICIrIjsgfQorCQkJaWYoIGRiZ0RldGFpbHNNaW4gKSB7IEFWTV9PU19DT1VUIDw8ICItIjsgfQorCQkJQVZNX09TX0NPVVQgPDwgIiAiOworCQl9CisJCUFWTV9PU19DT1VUIDw8ICIgXSA6PiAiIDw8IHN0ZDo6Zmx1c2g7CisKKwkJaWYoIG5vdCBkYmdDb21tYW5kTGluZS5lbXB0eSgpICkKKwkJeworCQkJZGJnQ29tbWFuZExpbmVIaXN0b3J5LnJyZW1vdmUoIGRiZ0NvbW1hbmRMaW5lICk7CisJCQlkYmdDb21tYW5kTGluZUhpc3RvcnkucHVzaF9iYWNrKCBkYmdDb21tYW5kTGluZSApOworCQl9CisKKwkJc3RkOjpnZXRsaW5lKHN0ZDo6Y2luLCBkYmdDb21tYW5kTGluZSk7CisJCVN0cmluZ1Rvb2xzOjpsdHJpbSggZGJnQ29tbWFuZExpbmUgKTsKKworCQlpZiggZGJnQ29tbWFuZExpbmUuZW1wdHkoKSApCisJCXsKKwkJCS8vISEgSUdOT1JFIFNQQUNFIC0tPmNvbnRpbnVlCisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiggZGJnQ29tbWFuZExpbmVbMF0gPT0gJyEnICkKKwkJCXsKKwkJCQlkZWJ1Z1JlYWRIaXN0b3J5Q29tbWFuZCgpOworCQkJfQorCisJCQlkZWJ1Z0V2YWxDb21tYW5kKCk7CisJCX0KKwl9Cit9CisKKwordm9pZCBJRGVidWdQcm9jZXNzb3JQcm92aWRlcjo6ZGVidWdSZWFkSGlzdG9yeUNvbW1hbmQoKQoreworCWRiZ09mZnNldCA9IEFWTV9OVU1FUklDX01BWF9TSVpFX1Q7CisKKwlpZiggZGJnQ29tbWFuZExpbmUgPT0gIiEhIiApCisJeworCQlkYmdPZmZzZXQgPSAwOworCX0KKwllbHNlIGlmKCBkYmdDb21tYW5kTGluZS5zaXplKCkgPiAxICkKKwl7CisJCWRiZ0NvbW1hbmRBcmcgPSBkYmdDb21tYW5kTGluZS5zdWJzdHIoIDEgKTsKKworCQlpZiggOjppc2RpZ2l0KCBkYmdDb21tYW5kQXJnWzBdICkgKQorCQl7CisJCQlmcm9tX3N0cmluZzxhdm1fc2l6ZV90PihkYmdDb21tYW5kQXJnLCBkYmdPZmZzZXQpOworCQl9CisJCWVsc2UKKwkJeworCQkJVmVjdG9yT2ZTdHJpbmc6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY21kSXQgPQorCQkJCQlkYmdDb21tYW5kTGluZUhpc3RvcnkucmJlZ2luKCk7CisJCQlWZWN0b3JPZlN0cmluZzo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjbWRJdEVuZCA9CisJCQkJCWRiZ0NvbW1hbmRMaW5lSGlzdG9yeS5yZW5kKCk7CisJCQlmb3IoIGRiZ09mZnNldCA9IDA7IGNtZEl0ICE9IGNtZEl0RW5kIDsgKytjbWRJdCwgKytkYmdPZmZzZXQgKQorCQkJeworCQkJCWlmKCAoKCpjbWRJdClbMF0gPT0gZGJnQ29tbWFuZEFyZ1swXSkgJiYKKwkJCQkJU3RyaW5nVG9vbHM6OnN0YXJ0c1dpdGgoKCpjbWRJdCksIGRiZ0NvbW1hbmRBcmcpICkKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmKCBkYmdPZmZzZXQgPCBkYmdDb21tYW5kTGluZUhpc3Rvcnkuc2l6ZSgpICkKKwl7CisJCWRiZ0NvbW1hbmRMaW5lID0gZGJnQ29tbWFuZExpbmVIaXN0b3J5LnJldmVyc2VfYXQoZGJnT2Zmc2V0KTsKKworCQlBVk1fT1NfQ09VVCA8PCAiaGlzdG9yeVsiIDw8IGRiZ09mZnNldCA8PCAiXSA6PiAiCisJCQkJPDwgZGJnQ29tbWFuZExpbmUgPDwgc3RkOjplbmRsOworCX0KK30KKworCit2b2lkIElEZWJ1Z1Byb2Nlc3NvclByb3ZpZGVyOjpkZWJ1Z0V2YWxDb21tYW5kKCkKK3sKKwlkYmdEZWNvZGVDb21tYW5kT2sgPSBmYWxzZTsKKworCS8vIEZpcnN0LCB0cnkgdG8gZXZhbCBzcGVjaWZpYyBwcm9jZXNzb3IgY29tbWFuZCBmb3IgbG9jYWwgZGVidWdnaW5nIHJlYXNvbgorCWlmKCBkZWJ1Z0V2YWxDb21tYW5kSW1wbCgpICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCWVsc2UgaWYoIChkYmdDb21tYW5kTGluZVswXSA9PSAnIycpIHx8ICggKGRiZ0NvbW1hbmRMaW5lLnNpemUoKSA+PSAyKSAmJgorCQkJKGRiZ0NvbW1hbmRMaW5lWzBdID09ICcvJykgJiYgKGRiZ0NvbW1hbmRMaW5lWzFdID09ICcvJykgKSApCisJeworCQkvLyEhIElHTk9SRSBTSU5HTEUgTElORSBDT01NRU5UIC0tPmNvbnRpbnVlCisJfQorCisJZWxzZSBpZiggZGJnRGVjb2RlQ29tbWFuZCgiaGVscCIsICc/JyAsICdoJykgKQorCXsKKwkJZGJnQ29tbWFuZEhlbHAoKTsKKwl9CisKKworCWVsc2UgaWYoIGRiZ0RlY29kZUNvbW1hbmQoImVjaG8iKSApCisJeworCQlkYmdDb21tYW5kRWNobygpOworCX0KKworCWVsc2UgaWYoIGRiZ0RlY29kZUNvbW1hbmQoInByaW50IikgKQorCXsKKwkJZGJnQ29tbWFuZFByaW50KCk7CisJfQorCisJZWxzZSBpZiggZGJnRGVjb2RlQ29tbWFuZCgic2hvdyIpICkKKwl7CisJCWRiZ0NvbW1hbmRTaG93KCk7CisJfQorCisKKwllbHNlIGlmKCBkYmdEZWNvZGVDb21tYW5kKCJicmVha3BvaW50IiwgImJwIikgKQorCXsKKwkJQVZNX09TX0NPVVQgPDwgIlRoZSBzdGVwIGNvdW50ICAgICA6ICIKKwkJCQk8PCBtRGVidWdFdmFsU3RlcENvdW50IDw8IHN0ZDo6ZW5kbDsKKworCQlBVk1fT1NfQ09VVCA8PCAiSW50ZXJhY3Rpb24gcGVyaW9kIDogIgorCQkJCTw8IG1EZWJ1Z0JyZWFrcG9pbnRFdmFsU3RlcFBlcmlvZCA8PCBzdGQ6OmVuZGw7CisKKworCQlBVk1fT1NfQ09VVCA8PCAiTmV4dCBzdGVwIGludGVyYWN0aW9uIGJyZWFrcG9pbnQgICAgOiAiCisJCQkJPDwgbURlYnVnQnJlYWtwb2ludEV2YWxTdGVwIDw8IHN0ZDo6ZW5kbDsKKworCQlBVk1fT1NfQ09VVCA8PCAiTmV4dCBjb250ZXh0IGludGVyYWN0aW9uIGJyZWFrcG9pbnQgOiAiCisJCQkJPDwgbURlYnVnQnJlYWtwb2ludEV2YWxDb250ZXh0IDw8IHN0ZDo6ZW5kbDsKKwl9CisKKworCWVsc2UgaWYoIGRiZ0RlY29kZUNvbW1hbmQoImNvbmZpZyIsICJjZmciKSApCisJeworCQlkYmdDb21tYW5kQ29uZmlnKCk7CisJfQorCisJZWxzZSBpZiggZGJnRGVjb2RlQ29tbWFuZCgic2NoZWR1bGVyIiwgInNjaGVkIikgKQorCXsKKwkJQVZNX09TX0NPVVQgPDwgIkRpdmVyc2l0eSBwcm9jZXNzIFNjaGVkdWxlcjoiIDw8IHN0ZDo6ZW5kbDsKKworCQltRGVidWdQcm9jZXNzb3ItPmdldENvbnRyb2xsZXJVbml0TWFuYWdlcigpLnRvU3RyZWFtKCBBVk1fT1NfQ09VVCApOworCX0KKworCisJZWxzZSBpZiggZGJnRGVjb2RlQ29tbWFuZCgicmVwb3J0IiwgInJwIikgKQorCXsKKwkJbURlYnVnUHJvY2Vzc29yLT5nZXRDb250cm9sbGVyVW5pdE1hbmFnZXIoKS5yZXBvcnQoQVZNX09TX0NPVVQpOworCX0KKworCWVsc2UgaWYoIGRiZ0RlY29kZUNvbW1hbmQoInNhdmUiKSApCisJeworCQltRGVidWdQcm9jZXNzb3ItPmdldENvbmZpZ3VyYXRpb24oKS5zZXJpYWxpemVDb21wdXRpbmdSZXN1bHQoKTsKKwkJQVZNX09TX0NPVVQgPDwgIkRPTkUgISEhIiA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCX0KKworCisJZWxzZSBpZiggZGJnRGVjb2RlQ29tbWFuZCgic2hlbGwiKSApCisJeworCQlpZiggbm90IG1EZWJ1Z0NvbnNvbGVGbGFnICkKKwkJeworCQkJbURlYnVnQ29uc29sZUZsYWcgPSB0cnVlOworCisJCQlBVk1fT1NfQ09VVCA8PCBzdGQ6OmVuZGw7CisKKwkJCW1EZWJ1Z1Byb21wdFByZWZpeCA9ICJVU0VSIjsKKworCQkJZGVidWdSZWFkRXZhbENvbW1hbmRMb29wKCk7CisKKwkJCW1EZWJ1Z0NvbnNvbGVGbGFnID0gZmFsc2U7CisJCX0KKwl9CisKKworCWVsc2UgaWYoIGRiZ0RlY29kZUNvbW1hbmQoImNvbnRpbnVlIikgKQorCXsKKwkJZGJnQ29udGludWVSRVBMID0gZmFsc2U7CisJfQorCisKKwllbHNlIGlmKCBkYmdEZWNvZGVDb21tYW5kKCJuZXh0IiwgJysnKSApCisJeworCQlkYmdDb250aW51ZVJFUEwgPSBmYWxzZTsKKworCQlkYmdDb21tYW5kTmV4dCgpOworCX0KKworCisJZWxzZSBpZiggZGJnRGVjb2RlQ29tbWFuZCgiYnJlYWsiKSApCisJeworCQlkYmdDb250aW51ZVJFUEwgPSBmYWxzZTsKKworCQlkYmdDb21tYW5kQnJlYWsoKTsKKwl9CisKKworCWVsc2UgaWYoIGRiZ0RlY29kZUNvbW1hbmQoInBlcmlvZCIpICkKKwl7CisJCWRiZ0NvbW1hbmRQZXJpb2QoKTsKKwl9CisKKworCWVsc2UgaWYoIGRiZ0RlY29kZUNvbW1hbmQoInF1ZXVlIikgKQorCXsKKwkJZGJnQ29tbWFuZFF1ZXVlKCk7CisJfQorCisJZWxzZSBpZiggZGJnRGVjb2RlQ29tbWFuZCgiZWMiLCAiY3R4IikgKQorCXsKKwkJZGJnQ29tbWFuZENvbnRleHQoKTsKKwl9CisKKwllbHNlIGlmKCBkYmdEZWNvZGVDb21tYW5kKCJwYXRoIikgKQorCXsKKwkJZGJnQ29tbWFuZFBhdGgoKTsKKwl9CisKKworCWVsc2UgaWYoIGRiZ0RlY29kZUNvbW1hbmQoInRyYWNlIikgKQorCXsKKwkJZGJnQ29tbWFuZFRyYWNlKCk7CisJfQorCisJZWxzZSBpZiggaXNEZWJ1Z1N0cmluZ0NvbW1hbmQoImRldGFpbCIpICkKKwl7CisJCWRiZ0NvbW1hbmRUcmFjZURldGFpbExldmVsKCk7CisJfQorCisJZWxzZSBpZiggZGJnRGVjb2RlQ29tbWFuZCgiZnVsbHBhdGgiKSApCisJeworCQltRGVidWdUcmFjZUZ1bGxQYXRoRmxhZyA9IG5vdCBtRGVidWdUcmFjZUZ1bGxQYXRoRmxhZzsKKwl9CisKKworCWVsc2UgaWYoIGRiZ0RlY29kZUNvbW1hbmQoInZhcnMiKSApCisJeworCQlkYmdDb21tYW5kVmFycygpOworCX0KKwllbHNlIGlmKCBkYmdEZWNvZGVDb21tYW5kKCJ2YXIiKSApCisJeworCQlkYmdDb21tYW5kVmFyKCk7CisJfQorCWVsc2UgaWYoIGRiZ0RlY29kZUNvbW1hbmQoInRpbWUiKSApCisJeworCQlkYmdDb21tYW5kVGltZSgpOworCX0KKworCisKKwllbHNlIGlmKCBkYmdEZWNvZGVDb21tYW5kKCJjb21zIikgKQorCXsKKwkJZGJnQ29tbWFuZFBvcnRzKEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX0NPTV9OQVRVUkUpOworCX0KKwllbHNlIGlmKCBkYmdEZWNvZGVDb21tYW5kKCJwb3J0cyIpICkKKwl7CisJCWRiZ0NvbW1hbmRQb3J0cyhFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9QT1JUX05BVFVSRSk7CisJfQorCWVsc2UgaWYoIGRiZ0RlY29kZUNvbW1hbmQoIm1lc3NhZ2VzIikgKQorCXsKKwkJZGJnQ29tbWFuZFBvcnRzKEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX01FU1NBR0VfTkFUVVJFKTsKKwl9CisJZWxzZSBpZiggZGJnRGVjb2RlQ29tbWFuZCgic2lnbmFscyIpICkKKwl7CisJCWRiZ0NvbW1hbmRQb3J0cyhFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9TSUdOQUxfTkFUVVJFKTsKKwl9CisKKworCWVsc2UgaWYoIGRiZ0RlY29kZUNvbW1hbmQoImNvbSIpICkKKwl7CisJCWRiZ0NvbW1hbmRQb3J0KEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX0NPTV9OQVRVUkUpOworCX0KKwllbHNlIGlmKCBkYmdEZWNvZGVDb21tYW5kKCJwb3J0IikgKQorCXsKKwkJZGJnQ29tbWFuZFBvcnQoRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfUE9SVF9OQVRVUkUpOworCX0KKwllbHNlIGlmKCBkYmdEZWNvZGVDb21tYW5kKCJtZXNzYWdlIikgKQorCXsKKwkJZGJnQ29tbWFuZFBvcnQoRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTUVTU0FHRV9OQVRVUkUpOworCX0KKwllbHNlIGlmKCBkYmdEZWNvZGVDb21tYW5kKCJzaWduYWwiKSApCisJeworCQlkYmdDb21tYW5kUG9ydChFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9TSUdOQUxfTkFUVVJFKTsKKwl9CisKKworCisJZWxzZSBpZiggZGJnRGVjb2RlQ29tbWFuZCgiYnVmZmVycyIpICkKKwl7CisJCWRiZ0NvbW1hbmRCdWZmZXJzKCk7CisJfQorCWVsc2UgaWYoIGRiZ0RlY29kZUNvbW1hbmQoImJ1ZmZlciIpICkKKwl7CisJCWRiZ0NvbW1hbmRCdWZmZXIoKTsKKwl9CisKKworCWVsc2UgaWYoIGRiZ0RlY29kZUNvbW1hbmQoIm1hY2hpbmVzIikgKQorCXsKKwkJZGJnQ29tbWFuZE1hY2hpbmVzKCk7CisJfQorCWVsc2UgaWYoIGRiZ0RlY29kZUNvbW1hbmQoIm1hY2hpbmUiKSApCisJeworCQlkYmdDb21tYW5kTWFjaGluZSgpOworCX0KKworCWVsc2UgaWYoIGRiZ0RlY29kZUNvbW1hbmQoInBhcmFtZXRlcnMiLCAicGFyYW1ldGVyIiwgInBhcmFtcyIsICJwYXJhbSIpICkKKwl7CisJCWRiZ0NvbW1hbmRQYXJhbWV0ZXJzTWFjaGluZSgpOworCX0KKworCisJZWxzZSBpZiggZGJnRGVjb2RlQ29tbWFuZCgic3RhdGVzIikgKQorCXsKKwkJZGJnQ29tbWFuZFN0YXRlcygpOworCX0KKwllbHNlIGlmKCBkYmdEZWNvZGVDb21tYW5kKCJzdGF0ZSIpICkKKwl7CisJCWRiZ0NvbW1hbmRTdGF0ZSgpOworCX0KKworCisJZWxzZSBpZiggZGJnRGVjb2RlQ29tbWFuZCgidHJhbnNpdGlvbnMiLCAidHJhbnNzIikgKQorCXsKKwkJZGJnQ29tbWFuZFRyYW5zaXRpb25zKCk7CisJfQorCWVsc2UgaWYoIGRiZ0RlY29kZUNvbW1hbmQoInRyYW5zaXRpb24iLCAidHJhbnMiKSApCisJeworCQlkYmdDb21tYW5kVHJhbnNpdGlvbigpOworCX0KKworCWVsc2UgaWYoIGRiZ0RlY29kZUNvbW1hbmQoInJvdXRpbmVzIikgKQorCXsKKwkJZGJnQ29tbWFuZFJvdXRpbmVzKCk7CisJfQorCWVsc2UgaWYoIGRiZ0RlY29kZUNvbW1hbmQoInJvdXRpbmUiKSApCisJeworCQlkYmdDb21tYW5kUm91dGluZSgpOworCX0KKworCisJZWxzZSBpZiggZGJnRGVjb2RlQ29tbWFuZCgiZW5hYmxlIikgKQorCXsKKwkJZGJnQ29tbWFuZEVuYWJsZURpc2FibGVQcm9jZXNzKCB0cnVlICk7CisJfQorCisKKwllbHNlIGlmKCBkYmdEZWNvZGVDb21tYW5kKCJkaXNhYmxlIikgKQorCXsKKwkJZGJnQ29tbWFuZEVuYWJsZURpc2FibGVQcm9jZXNzKCBmYWxzZSApOworCX0KKworCisJZWxzZSBpZiggZGJnRGVjb2RlQ29tbWFuZCgidmVyYm9zaXR5IiwgInZlcmJvc2UiKSApCisJeworCQlkYmdDb21tYW5kVmVyYm9zaXR5TGV2ZWwoKTsKKwl9CisKKworCWVsc2UgaWYoIGRiZ0RlY29kZUNvbW1hbmQoImRlYnVnI2xldmVsIikgKQorCXsKKwkJZGJnQ29tbWFuZERlYnVnTGV2ZWwoKTsKKwl9CisKKworCWVsc2UgaWYoIGRiZ0RlY29kZUNvbW1hbmQoImRlYnVnI2ZsYWciKSApCisJeworCQlkYmdDb21tYW5kRGVidWdGbGFnKCB0cnVlICk7CisJfQorCisKKwllbHNlIGlmKCBkYmdEZWNvZGVDb21tYW5kKCJkZWJ1ZyNmbGFnI29mZiIpICkKKwl7CisJCWRiZ0NvbW1hbmREZWJ1Z0ZsYWcoIGZhbHNlICk7CisJfQorCisKKwllbHNlIGlmKCBkYmdEZWNvZGVDb21tYW5kKCJieWUiLCAic3RvcCIpICkKKwl7CisJCWRiZ0NvbnRpbnVlUkVQTCA9IGZhbHNlOworCX0KKwllbHNlIGlmKCBkYmdEZWNvZGVDb21tYW5kKCJzdG9wIikgKQorCXsKKwkJZGJnQ29udGludWVSRVBMID0gZmFsc2U7CisJfQorCisJZWxzZSBpZiggZGJnRGVjb2RlQ29tbWFuZCgiZXhpdCIsICJxdWl0IikgKQorCXsKKwkJZGJnQ29udGludWVSRVBMID0gZmFsc2U7CisKKwkJbURlYnVnUHJvY2Vzc29yLT4KKwkJZ2V0U3ltYmV4UmVxdWVzdE1hbmFnZXIoKS5wb3N0UmVxdWVzdFN0b3AoIG1EZWJ1Z1Byb2Nlc3NvciApOworCX0KKworCWVsc2UgaWYoIGRiZ0RlY29kZUNvbW1hbmQoImhpc3RvcnkiLCAiaHR5IikgKQorCXsKKwkJZGJnQ29tbWFuZEhpc3RvcnkoKTsKKwl9CisKKwllbHNlCisJeworCQlBVk1fT1NfQ09VVCA8PCAiPFVua25vd24gQ29tbWFuZD46ICIgPDwgZGJnQ29tbWFuZExpbmUKKwkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworLy8JCUFWTV9PU19DT1VUIDw8IERFQlVHX1NIRUxMX0NPTU1BTkRfU1VNTUFSWSA8PCBzdGQ6OmVuZGw7CisKKwkJZGJnQ29tbWFuZExpbmUgPSAiIjsKKwl9Cit9CisKKwordm9pZCBJRGVidWdQcm9jZXNzb3JQcm92aWRlcjo6ZGJnQ2hlY2tDb21tYW5kRGV0YWlsc0FyZygpCit7CisJaWYoIG5vdCBkYmdDb21tYW5kQXJnLmVtcHR5KCkgKQorCXsKKwkJaWYoIGRiZ0NvbW1hbmRBcmdbMF0gPT0gJy0nICkKKwkJeworCQkJZGJnRGV0YWlsc01pbiA9IHRydWU7CisKKwkJCVN0cmluZ1Rvb2xzOjpsdHJpbSggZGJnQ29tbWFuZEFyZyAsIDEgKTsKKwkJfQorCisJCWlmKCBkYmdDb21tYW5kQXJnWzBdID09ICcrJyApCisJCXsKKwkJCWRiZ0RldGFpbHNNZWQgPSB0cnVlOworCisJCQlTdHJpbmdUb29sczo6bHRyaW0oIGRiZ0NvbW1hbmRBcmcgLCAxICk7CisJCX0KKworCQlpZiggZGJnQ29tbWFuZEFyZ1swXSA9PSAnKicgKQorCQl7CisJCQlkYmdEZXRhaWxzTWF4ID0gdHJ1ZTsKKworCQkJU3RyaW5nVG9vbHM6Omx0cmltKCBkYmdDb21tYW5kQXJnICwgMSApOworCQl9CisJfQorfQorCisKK3N0ZDo6c3RyaW5nIElEZWJ1Z1Byb2Nlc3NvclByb3ZpZGVyOjpERUJVR19TSEVMTF9DT01NQU5EX1NVTU1BUlkgPQorCQkiTGlzdCBvZiBjbGFzc2VzIG9mIGNvbW1hbmRzIDpcbiIKKwkJIlx0PyAgICAtLSBcbiIKKwkJIlx0aCAgICAtLSBcbiIKKwkJIlx0aGVscCAtLSBQcmludCB0aGlzIGhlbHBcblxuIgorCisJCSJcdGhpc3RvcnkgICAgLS0gaGVscCBvbiBjb21tYW5kIGZvciBpbnZva2luZyBhbiBvbGQgY29tbWFuZFxuIgorCisJCSJcdGNvbnRyb2wgICAgLS0gaGVscCBvbiBjb21tYW5kIGZvciBjb250cm9sbGluZyB0aGUgZGVidWcgcHJvY2Vzc1xuIgorCisJCSJcdHF1ZXVlICAgICAgLS0gaGVscCBvbiBjb21tYW5kIGZvciBhbmFseXppbmcgdGhlIGV4ZWN1dGlvbiBxdWV1ZVxuIgorCisJCSJcdGN0eCAgICAgICAgLS0gaGVscCBvbiBjb21tYW5kIGZvciBleGVjdXRpb24gY29udGV4dCBzZWxlY3Rpb25cbiIKKworCQkiXHRkYXRhICAgICAgIC0tIGhlbHAgb24gY29tbWFuZCBmb3IgYW5hbHl6aW5nIHRoZSBleGVjdXRpb24gZGF0YVxuXG4iCisKKwkJIlx0cHJpbnQgICAgICAtLSBoZWxwIG9uIGNvbW1hbmQgZm9yIHByaW50aW5nIGluIHRoZSBjb25zb2xlOiB0ZXh0IG1lc3NhZ2UsIC4uLlxuIgorCisJCSJcdHJlcG9ydCAgICAgLS0gaGVscCBvbiBjb21tYW5kIGZvciByZXBvcnRpbmcgb24gYSBzbmFwc2hvdCBvZiB0aGUgZXZhbHVhdGlvblxuIgorCisJCSJcdGJyZWFrcG9pbnQgLS0gaGVscCBvbiBjb21tYW5kIGZvciBzZXR0aW5nIHN0ZXAgcGFyYW1ldGVyc1xuIgorCisJCSJcdG9wdGlvbiAgICAgLS0gaGVscCBvbiBjb21tYW5kIGZvciBlbmFibGUgc3BlY2lmaWMgZGVidWcgcHJvY2Vzc1xuIgorCisJCSJcdGxvZyAgICAgICAgLS0gaGVscCBvbiBjb21tYW5kIGZvciBlbmFibGUgZGVidWcgbGV2ZWwgb3IgZmxhZ1xuXG4iCisKKwkJIlR5cGUgXCJoZWxwXCIgZm9sbG93ZWQgYnkgYSBjbGFzcyBuYW1lIGZvciBhIGxpc3Qgb2YgY29tbWFuZHMgaW4gdGhhdCBjbGFzcy5cbiI7CisKKworc3RkOjpzdHJpbmcgSURlYnVnUHJvY2Vzc29yUHJvdmlkZXI6OkRFQlVHX1NIRUxMX0NPTU1BTkRfSElTVE9SWSA9CisJCSJcdGhpc3RvcnkgIC0tIFByaW50IHRoZSBjb21tYW5kIGhpc3RvcnkgbGlzdFxuIgorCQkiXHQhISAgICAgICAtLSBSZS1ldmFsIHRoZSBsYXN0IGNvbW1hbmRcbiIKKwkJIlx0IU4gICAgICAgLS0gUmUtZXZhbCB0aGUgbGFzdCBOLXRoIGNvbW1hbmRcbiIKKwkJIlx0IXByZWZpeCAgLS0gUmUtZXZhbCB0aGUgZmlyc3Qgb2YgbGFzdCBjb21tYW5kIHdoaWNoIHN0YXJ0cyB3aXRoICdwcmVmaXgnXG4iOworCisKKworc3RkOjpzdHJpbmcgSURlYnVnUHJvY2Vzc29yUHJvdmlkZXI6OkRFQlVHX1NIRUxMX0NPTU1BTkRfQ09OVFJPTCA9CisJCSJcdGJ5ZSAgICAgIC0tIFxuIgorCQkiXHRzdG9wICAgICAtLSBcbiIKKwkJIlx0KyAgICAgICAgLS0gXG4iCisJCSJcdGNvbnRpbnVlIC0tIFN0b3AgdGhlIHRoZSBpbnRlcmFjdGlvbiBwcm9jZXNzLCAiCisJCQkJCQkiY29udGludWUgRGl2ZXJzaXR5IHByb2Nlc3NpbmdcblxuIgorCisJCSJcdHF1aXQgICAgIC0tIFF1aXQgdGhlIERpdmVyc2l0eSBwcm9jZXNzXG4iCisJCSJcdGV4aXQgICAgIC0tIEV4aXQgdGhlIERpdmVyc2l0eSBwcm9jZXNzXG5cbiIKKworCQkiXHRicmVhayAgICAtLSBDb250aW51ZSB1bnRpbCB0aGUgbmV4dCBicmVhayBmb3IgYSBnaXZlbiBDb250ZXh0IE51bWJlclxuIgorCQkiXHRcdGJyZWFrPyAgOiBXYWl0aW5nIGZvciB0aGUgdXNlciBnaXZlcyBhIENvbnRleHQgTnVtYmVyXG4iCisJCSJcdFx0YnJlYWsgTiA6IEEgQ29udGV4dCBOdW1iZXIgTlxuIgorCisJCSJcdG5leHQgICAgIC0tIENvbnRpbnVlIGZvciBhIGdpdmVuIE51bWJlciBvZiBzdGVwIHVudGlsIHRoZSBuZXh0IGludGVyYWN0aW9uXG4iCisJCSJcdFx0bmV4dD8gICA6IFdhaXRpbmcgZm9yIHRoZSB1c2VyIGdpdmVzIGEgbnVtYmVyIG9mIHN0ZXBcbiIKKwkJIlx0XHRuZXh0aSAgIDogT25lIHN0ZXBcbiIKKwkJIlx0XHRuZXh0IE4gIDogQSBudW1iZXIgTiBvZiBzdGVwXG5cbiIKKworCQkiXHRwZXJpb2QgICAtLSBTZXQgYW4gaW50ZXJhY3Rpb24gcGVyaW9kIG51bWJlclxuIgorCQkiXHRcdHBlcmlvZD8gIDogV2FpdGluZyBmb3IgdGhlIHVzZXIgZ2l2ZXMgYW4gaW50ZXJhY3Rpb24gcGVyaW9kIG51bWJlclxuIgorCQkiXHRcdHBlcmlvZCBOIDogQW4gaW50ZXJhY3Rpb24gcGVyaW9kIG51bWJlclxuIjsKKworCitzdGQ6OnN0cmluZyBJRGVidWdQcm9jZXNzb3JQcm92aWRlcjo6REVCVUdfU0hFTExfQ09NTUFORF9RVUVVRSA9CisJCSJcdHF1ZXVlICAgIC0tIFByaW50IGFsbCBleGVjdXRpb24gcXVldWVcbiIKKwkJIlx0XHRxdWV1ZT8gICAgICAgIDogV2FpdGluZyBmb3IgdGhlIHVzZXIgc2VsZWN0cyBhIHF1ZXVlIGluICIKKwkJCQkJCQkieyBpbml0ICwgd2FpdGluZyAsIHJlYWR5ICwgcmVzdWx0ICwgZmFpbGVkIH1cbiIKKwkJIlx0XHRxdWV1ZSNpbml0ICAgIDogdGhlICdpbml0JyBxdWV1ZVxuIgorCQkiXHRcdHF1ZXVlI3dhaXRpbmcgOiB0aGUgJ3dhaXRpbmcnIHF1ZXVlXG4iCisJCSJcdFx0cXVldWUjcmVhZHkgICA6IHRoZSAncmVhZHknIHF1ZXVlXG4iCisJCSJcdFx0cXVldWUjcmVzdWx0ICA6IHRoZSAncmVzdWx0JyBxdWV1ZVxuIgorCQkiXHRcdHF1ZXVlI2ZhaWxlZCAgOiB0aGUgJ2ZhaWxlZCcgcXVldWVcbiI7CisKKworc3RkOjpzdHJpbmcgSURlYnVnUHJvY2Vzc29yUHJvdmlkZXI6OkRFQlVHX1NIRUxMX0NPTU1BTkRfQ09OVEVYID0KKwkJIlx0cGF0aCAgICAgLS0gUHJpbnQgY3VycmVudCBleGVjdXRpb24gcGF0aCBmcm9tIHNlbGVjdGVkIGNvbnRleHRcbiIKKwkJIlx0ZWMgICAgICAgLS0gXG4iCisJCSJcdGN0eCAgICAgIC0tIFByaW50IGN1cnJlbnQgZXhlY3V0aW9uIGNvbnRleHRcbiIKKwkJIlx0XHRjdHg/ICA6IFdhaXRpbmcgZm9yIHRoZSB1c2VyIHNlbGVjdHMgYW4gZXhlY3V0aW9uIGNvbnRleHQgSUQgbnVtYmVyXG4iCisJCSJcdFx0Y3R4IE4gOiBTZWxlY3QgdGhlIGdpdmVuIGV4ZWN1dGlvbiBjb250ZXh0IE5cbiIKKwkJIlx0XHRcdFNlYXJjaGluZyBvcmRlcjogKDEpIGN1cnJlbnQgc2VsZWN0aW9uIGNoaWxkLCAoMikgYW5jZXN0b3JzLCAiCisJCSIoMykgYWxsIHRoZSB0aGUgZXhlY3V0aW9uIGdyYXBoICEhISI7CisKKworc3RkOjpzdHJpbmcgSURlYnVnUHJvY2Vzc29yUHJvdmlkZXI6OkRFQlVHX1NIRUxMX0NPTU1BTkRfREFUQSA9CisJCSJcdHZhciAgICAgIC0tIFByaW50IHZhbHVlIGZyb20gc2VsZWN0ZWQgQ29udGV4dCBmb3IgYSBzZWxlY3RlZCB2YXJpYWJsZVxuIgorCQkiXHRcdHZhcj8gICA6IFdhaXRpbmcgZm9yIHRoZSB1c2VyIGdpdmVzIGEgdmFyaWFibGUgSURcbiIKKwkJIlx0XHR2YXIgSUQgOiBTZWxlY3QgdGhlIGdpdmVuIHZhcmlhYmxlIElEXG5cbiIKKworCQkiXHRwb3J0ICAgICAtLSBQcmludCB2YWx1ZSBmcm9tIHNlbGVjdGVkIENvbnRleHQgZm9yIGEgc2VsZWN0ZWQgcG9ydFxuIgorCQkiXHRcdHBvcnQ/ICAgOiBXYWl0aW5nIGZvciB0aGUgdXNlciBnaXZlcyBhIHBvcnQgSURcbiIKKwkJIlx0XHRwb3J0IElEIDogU2VsZWN0IHRoZSBnaXZlbiBwb3J0IElEXG5cbiIKKworCQkiXHRidWZmZXIgICAtLSBQcmludCB2YWx1ZSBmcm9tIHNlbGVjdGVkIENvbnRleHQgZm9yIGEgc2VsZWN0ZWQgYnVmZmVyXG4iCisJCSJcdFx0YnVmZmVyPyAgIDogV2FpdGluZyBmb3IgdGhlIHVzZXIgZ2l2ZXMgYSBidWZmZXIgSURcbiIKKwkJIlx0XHRidWZmZXIgSUQgOiBTZWxlY3QgdGhlIGdpdmVuIGJ1ZmZlciBJRFxuXG4iCisKKwkJIlx0bWFjaGluZSAgLS0gUHJpbnQgc2VsZWN0ZWQgbWFjaGluZSBydW50aW1lIGRhdGFcbiIKKwkJIlx0XHRtYWNoaW5lPyAgIDogV2FpdGluZyBmb3IgdGhlIHVzZXIgZ2l2ZXMgYSBtYWNoaW5lIElEXG4iCisJCSJcdFx0bWFjaGluZSBJRCA6IFNlbGVjdCB0aGUgZ2l2ZW4gbWFjaGluZSBJRFxuXG4iCisKKwkJIlx0c3RhdGUgICAgLS0gUHJpbnQgYSBzZWxlY3RlZCBzdGF0ZSBjb2RlXG4iCisJCSJcdFx0c3RhdGU/ICAgOiBXYWl0aW5nIGZvciB0aGUgdXNlciBnaXZlcyBhIHN0YXRlIElEXG4iCisJCSJcdFx0c3RhdGUgSUQgOiBTZWxlY3QgdGhlIGdpdmVuIHN0YXRlIElEXG5cbiIKKworCQkiXHR0cmFuc2l0aW9uIC0tIFByaW50IGEgc2VsZWN0ZWQgdHJhbnNpdGlvbiBjb2RlXG4iCisJCSJcdFx0dHJhbnNpdGlvbj8gICA6IFdhaXRpbmcgZm9yIHRoZSB1c2VyIGdpdmVzIGEgdHJhbnNpdGlvbiBJRFxuIgorCQkiXHRcdHRyYW5zaXRpb24gSUQgOiBTZWxlY3QgdGhlIGdpdmVuIHRyYW5zaXRpb24gSURcblxuIgorCisJCSJcdHJvdXRpbmUgIC0tIFByaW50IGEgc2VsZWN0ZWQgcm91dGluZSBjb2RlXG4iCisJCSJcdFx0cm91dGluZT8gICA6IFdhaXRpbmcgZm9yIHRoZSB1c2VyIGdpdmVzIGEgcm91dGluZSBJRFxuIgorCQkiXHRcdHJvdXRpbmUgSUQgOiBTZWxlY3QgdGhlIGdpdmVuIHJvdXRpbmUgSURcbiIKKworCQkiXHR0cmFjZSAgICAtLSBUcmFjZSBvZiBhbGwgc2VsZWN0ZWQgZGF0YSBzcGVjaWZpZWQgaW4gPDwgc2VjdGlvbiBERUJVRyNUUkFDRSA+PlxuIgorCisJCSJcdGRldGFpbCAgIC0tIEVuYWJsZS9kaXNhYmxlIGRldGFpbCBsZXZlbDogIgorCQkiLSBmb3IgbWluaW11bSAsICsgZm9yIG1lZGl1bSAsICogZm9yIG1heGltdW0gLCBub3RoaW5nIGZvciBkZWZhdWx0XG4iCisKKwkJIlx0ZnVsbHBhdGggLS0gRW5hYmxlL2Rpc2FibGUgdGhlIDw8IGZ1bGwgcGF0aCB0cmFjZSBmbGFnID4+IGZvciBzaG93aW5nICIKKwkJInNlbGVjdGVkIGRhdGEgZnJvbSB0aGUgc2VsZWN0ZWQgY29udGV4dCB0byB0aGUgcm9vdCAhXG4iOworCisKKworc3RkOjpzdHJpbmcgSURlYnVnUHJvY2Vzc29yUHJvdmlkZXI6OkRFQlVHX1NIRUxMX0NPTU1BTkRfUFJJTlQgPQorCQkiXHRlY2hvIG1zZyAtLSBwcmludCB0aGUgbWVzc2FnZSB0ZXh0IGluIHRoZSBjb25zb2xlJ1xuIgorCisJCSJcdHByaW50ICAgIC0tIHByaW50IC4uLlxuIgorCQkiXHRzaG93ICAgICAtLSBzaG91dyAuLi5cbiI7CisKKworc3RkOjpzdHJpbmcgSURlYnVnUHJvY2Vzc29yUHJvdmlkZXI6OkRFQlVHX1NIRUxMX0NPTU1BTkRfUkVQT1JUID0KKwkJIlx0Y2ZnICAgICAgLS0gXG4iCisJCSJcdGNvbmZpZyAgIC0tIFByaW50IGN1cnJlbnQgRGl2ZXJzaXR5IHByb2Nlc3NpbmcgY29uZmlndXJhdGlvblxuIgorCisJCSJcdHNjaGVkdWxlciAgIC0tIFByaW50IGN1cnJlbnQgRGl2ZXJzaXR5IHByb2Nlc3Npbmcgc2NoZWR1bGVyXG4iCisKKwkJIlx0cnAgICAgICAgLS0gXG4iCisJCSJcdHJlcG9ydCAgIC0tIFByaW50IGN1cnJlbnQgRGl2ZXJzaXR5IHByb2Nlc3NpbmcgcmVwb3J0XG4iCisKKwkJIlx0c2F2ZSAgICAgLS0gU2F2ZSBhIHNuYXBzaG90IG9mIHRoZSBEaXZlcnNpdHkgcHJvY2Vzc1xuXG4iOworCisKK3N0ZDo6c3RyaW5nIElEZWJ1Z1Byb2Nlc3NvclByb3ZpZGVyOjpERUJVR19TSEVMTF9DT01NQU5EX0JSRUFLUE9JTlQgPQorCQkiXHRicFxuIgorCQkiXHRicmVha3BvaW50IC0tIFByaW50IGJyZWFrcG9pbnRzIGluZm9ybWF0aW9uOlxuIgorCQkiXHRcdFRoZSBzdGVwIGNvdW50IGFuZCB0aGUgaW50ZXJhY3Rpb24gcGVyaW9kIGZvciBicmVha1xuIgorCQkiXHRcdFRoZSBuZXh0IHN0ZXAgaW50ZXJhY3Rpb24gYnJlYWtwb2ludFxuIgorCQkiXHRcdFRoZSBuZXh0IGNvbnRleHQgaW50ZXJhY3Rpb24gYnJlYWtwb2ludFxuIjsKKworCitzdGQ6OnN0cmluZyBJRGVidWdQcm9jZXNzb3JQcm92aWRlcjo6REVCVUdfU0hFTExfQ09NTUFORF9PUFRJT04gPQorCQkiXHRlbmFibGUgICAtLSBFbmFibGUgYW4gaW5lcmFjdGlvbiBmb3IgYSBnaXZlbnQgcHJvY2Vzc1xuIgorCQkiXHRcdGVuYWJsZT8gICA6IFdhaXRpbmcgZm9yIHRoZSB1c2VyIHNlbGVjdHMgYSBwcm9jZXNzIGluICIKKwkJCQkJCQkieyBwcmVmaWx0ZXIgLCBwb3N0ZmlsdGVyICwgcHJlcHJvY2VzcyAsIHBvc3Rwcm9jZXNzIH1cbiIKKwkJIlx0XHRlbmFibGUjcHJlZmlsdGVyICAgOiB0aGUgJ3ByZWZpbHRlcicgcHJvY2Vzc1xuIgorCQkiXHRcdGVuYWJsZSNwb3N0ZmlsdGVyICA6IHRoZSAncG9zdGZpbHRlcicgcHJvY2Vzc1xuIgorCQkiXHRcdGVuYWJsZSNwcmVwcm9jZXNzICA6IHRoZSAncHJlcHJvY2VzcycgcHJvY2Vzc1xuIgorCQkiXHRcdGVuYWJsZSNwb3N0cHJvY2VzcyA6IHRoZSAncG9zdHByb2Nlc3MnIHByb2Nlc3NcblxuIgorCisKKwkJIlx0ZGlzYWJsZSAgLS0gRGlzYWJsZSBhbiBpbmVyYWN0aW9uIGZvciBhIGdpdmVudCBwcm9jZXNzXG4iCisJCSJcdFx0ZGlzYWJsZT8gIDogV2FpdGluZyBmb3IgdGhlIHVzZXIgc2VsZWN0cyBhIHByb2Nlc3MgaW4gIgorCQkJCQkJCSJ7IHByZWZpbHRlciAsIHBvc3RmaWx0ZXIgLCBwcmVwcm9jZXNzICwgcG9zdHByb2Nlc3MgfVxuIgorCQkiXHRcdGRpc2FibGUjcHJlZmlsdGVyICAgOiB0aGUgJ3ByZWZpbHRlcicgcHJvY2Vzc1xuIgorCQkiXHRcdGRpc2FibGUjcG9zdGZpbHRlciAgOiB0aGUgJ3Bvc3RmaWx0ZXInIHByb2Nlc3NcbiIKKwkJIlx0XHRkaXNhYmxlI3ByZXByb2Nlc3MgIDogdGhlICdwcmVwcm9jZXNzJyBwcm9jZXNzXG4iCisJCSJcdFx0ZGlzYWJsZSNwb3N0cHJvY2VzcyA6IHRoZSAncG9zdHByb2Nlc3MnIHByb2Nlc3NcbiI7CisKKworc3RkOjpzdHJpbmcgSURlYnVnUHJvY2Vzc29yUHJvdmlkZXI6OkRFQlVHX1NIRUxMX0NPTU1BTkRfTE9HID0KKwkJIlx0dmVyYm9zaXR5ICAgICAgIC0tIFNldCB2ZXJib3NpdHkgYXQgdGhlIGdpdmVuIGxldmVsIDogIgorCQkJCQkJIlNJTEVOVCA8IE1JTklNVU0gPCBNRURJVU0gPCBNQVhJTVVNXG4iCisJCSJcdFx0dmVyYm9zaXR5PyA6IFdhaXRpbmcgZm9yIHRoZSB1c2VyIGdpdmVzIGEgdmVyYm9zaXR5IGxldmVsXG5cbiIKKworCisJCSJcdGRlYnVnI2xldmVsICAgICAtLSBTZXQgZGVidWcjbGV2ZWwgYXQgdGhlIGdpdmVuIGxldmVsIDogIgorCQkJCQkJCSJaRVJPIDwgTE9XIDwgTUVESVVNIDwgSElHSCA8IFVMVFJBXG4iCisJCSJcdFx0ZGVidWcjbGV2ZWw/IDogV2FpdGluZyBmcm9tIHVzZXIgYSBkZWJ1ZyBsZXZlbFxuXG4iCisKKwkJIlx0ZGVidWcjZmxhZyAgICAgIC0tIFNldCBkZWJ1ZyNmbGFnIGF0IHRoZSBnaXZlbiBmbGFnXG4iCisJCSJcdFx0ZGVidWcjZmxhZz8gOiBXYWl0aW5nIGZvciB0aGUgdXNlciBnaXZlcyBhIGRlYnVnIGZsYWdcbiIKKworCQkiXHRkZWJ1ZyNmbGFnI29mZiAgLS0gVW5zZXQgdGhlIGRlYnVnI2ZsYWcgZm9yIHRoZSBnaXZlbiBmbGFnXG4iCisJCSJcdFx0ZGVidWcjZmxhZyNvZmY/IDogV2FpdGluZyBmcm9tIHVzZXIgYSBkZWJ1ZyBmbGFnIHRvIG9mZlxuIjsKKworCisKK3ZvaWQgSURlYnVnUHJvY2Vzc29yUHJvdmlkZXI6OmRiZ0NvbW1hbmRIZWxwKCkKK3sKKwlpZiggZGJnQ29tbWFuZEFyZy5lbXB0eSgpICkKKwl7CisJCUFWTV9PU19DT1VUIDw8IERFQlVHX1NIRUxMX0NPTU1BTkRfU1VNTUFSWSA8PCBzdGQ6OmVuZGw7CisJfQorCWVsc2UKKwl7CisJCWlmKCBkYmdDb21tYW5kQXJnID09ICI/IiApCisJCXsKKwkJCUFWTV9PU19DT1VUIDw8ICJTZWxlY3QgYSBzZWN0aW9uIHsgY29udHJvbCAsIHByaW50ICwgcmVwb3J0ICwgIgorCQkJCQkic3RlcCAsIHF1ZXVlICwgY3R4ICwgZGF0YSAsIG9wdGlvbiAsIGxvZyB9IDo+ICI7CisKKwkJCXN0ZDo6Z2V0bGluZShzdGQ6OmNpbiwgZGJnQ29tbWFuZEFyZyk7CisJCQlTdHJpbmdUb29sczo6bHRyaW0oIGRiZ0NvbW1hbmRBcmcgKTsKKwkJfQorCQllbHNlIGlmKCAoZGJnQ29tbWFuZEFyZ1swXSA9PSAnIycpIHx8IChkYmdDb21tYW5kQXJnWzBdID09ICc/JykgKQorCQl7CisJCQlkYmdDb21tYW5kQXJnID0gZGJnQ29tbWFuZEFyZy5zdWJzdHIoIDEgKTsKKwkJfQorCisJCWlmKCBkYmdDb21tYW5kQXJnLmZpbmQoImhpc3RvcnkiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisJCXsKKwkJCUFWTV9PU19DT1VUIDw8ICJIZWxwIG9uIGNvbW1hbmQgZm9yIGludm9raW5nIGFuIG9sZCBjb21tYW5kXG4iCisJCQkJCTw8IERFQlVHX1NIRUxMX0NPTU1BTkRfSElTVE9SWSA8PCBzdGQ6OmVuZGw7CisJCX0KKwkJZWxzZSBpZiggZGJnQ29tbWFuZEFyZy5maW5kKCJjb250cm9sIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorCQl7CisJCQlBVk1fT1NfQ09VVCA8PCAiSGVscCBvbiBjb21tYW5kIGZvciBjb250cm9sbGluZyB0aGUgZGVidWcgcHJvY2Vzc1xuIgorCQkJCQk8PCBERUJVR19TSEVMTF9DT01NQU5EX0NPTlRST0wgPDwgc3RkOjplbmRsOworCQl9CisJCWVsc2UgaWYoIGRiZ0NvbW1hbmRBcmcuZmluZCgicXVldWUiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisJCXsKKwkJCUFWTV9PU19DT1VUIDw8ICJIZWxwIG9uIGNvbW1hbmQgZm9yIGFuYWx5emluZyB0aGUgZXhlY3V0aW9uIHF1ZXVlXG4iCisJCQkJCTw8IERFQlVHX1NIRUxMX0NPTU1BTkRfUVVFVUUgPDwgc3RkOjplbmRsOworCQl9CisJCWVsc2UgaWYoIGRiZ0NvbW1hbmRBcmcuZmluZCgiY3R4IikgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorCQl7CisJCQlBVk1fT1NfQ09VVCA8PCAiSGVscCBvbiBjb21tYW5kIGZvciBleGVjdXRpb24gY29udGV4dCBzZWxlY3Rpb25cbiIKKwkJCQkJPDwgREVCVUdfU0hFTExfQ09NTUFORF9DT05URVggPDwgc3RkOjplbmRsOworCQl9CisJCWVsc2UgaWYoIGRiZ0NvbW1hbmRBcmcuZmluZCgiZGF0YSIpICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKwkJeworCQkJQVZNX09TX0NPVVQgPDwgIkhlbHAgb24gY29tbWFuZCBmb3IgYW5hbHl6aW5nIHRoZSBleGVjdXRpb24gZGF0YVxuIgorCQkJCQk8PCBERUJVR19TSEVMTF9DT01NQU5EX0RBVEEgPDwgc3RkOjplbmRsOworCQl9CisKKwkJZWxzZSBpZiggZGJnQ29tbWFuZEFyZy5maW5kKCJwcmludCIpICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKwkJeworCQkJQVZNX09TX0NPVVQgPDwgIkhlbHAgb24gY29tbWFuZCBmb3IgcHJpbnRpbmcgaW4gdGhlIGNvbnNvbGU6ICIKKwkJCQkJInRleHQgbWVzc2FnZSwgLi4uXG4iCisJCQkJCTw8IERFQlVHX1NIRUxMX0NPTU1BTkRfUFJJTlQgPDwgc3RkOjplbmRsOworCQl9CisJCWVsc2UgaWYoIChkYmdDb21tYW5kQXJnLmZpbmQoInJlcG9ydCIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB8fAorCQkJCShkYmdDb21tYW5kQXJnID09ICJycCIpICkKKwkJeworCQkJQVZNX09TX0NPVVQgPDwgIkhlbHAgb24gY29tbWFuZCBmb3IgcmVwb3J0aW5nIG9uIHRoZSBldmFsdWF0aW9uIHNuYXBzaG90XG4iCisJCQkJCTw8IERFQlVHX1NIRUxMX0NPTU1BTkRfUkVQT1JUIDw8IHN0ZDo6ZW5kbDsKKwkJfQorCQllbHNlIGlmKCAoZGJnQ29tbWFuZEFyZy5maW5kKCJicmVha3BvaW50IikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHx8CisJCQkJKGRiZ0NvbW1hbmRBcmcuZmluZCgiYnAiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgKQorCQl7CisJCQlBVk1fT1NfQ09VVCA8PCAiSGVscCBvbiBjb21tYW5kIGZvciBicmVha3BvaW50cyBpbmZvcm1hdGlvbnNcbiIKKwkJCQkJPDwgREVCVUdfU0hFTExfQ09NTUFORF9CUkVBS1BPSU5UIDw8IHN0ZDo6ZW5kbDsKKwkJfQorCQllbHNlIGlmKCBkYmdDb21tYW5kQXJnLmZpbmQoIm9wdGlvbiIpICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKwkJeworCQkJQVZNX09TX0NPVVQgPDwgIkhlbHAgb24gY29tbWFuZCBmb3IgZW5hYmxlIHNwZWNpZmljIGRlYnVnIHByb2Nlc3NcbiIKKwkJCQkJPDwgREVCVUdfU0hFTExfQ09NTUFORF9PUFRJT04gPDwgc3RkOjplbmRsOworCQl9CisJCWVsc2UgaWYoIGRiZ0NvbW1hbmRBcmcuZmluZCgibG9nIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorCQl7CisJCQlBVk1fT1NfQ09VVCA8PCAiSGVscCBvbiBjb21tYW5kIGZvciBlbmFibGUgZGVidWcgbGV2ZWwgb3IgZmxhZ1xuIgorCQkJCQk8PCBERUJVR19TSEVMTF9DT01NQU5EX0xPRyA8PCBzdGQ6OmVuZGw7CisJCX0KKwkJZWxzZQorCQl7CisJCQlBVk1fT1NfQ09VVCA8PCBERUJVR19TSEVMTF9DT01NQU5EX1NVTU1BUlkgPDwgc3RkOjplbmRsOworCQl9CisJfQorCisJQVZNX09TX0NPVVQgPDwgc3RkOjplbmRsOworCit9CisKKwordm9pZCBJRGVidWdQcm9jZXNzb3JQcm92aWRlcjo6ZGJnQ29tbWFuZEhpc3RvcnkoKQoreworCWlmKCBkYmdDb21tYW5kQXJnLmVtcHR5KCkgKQorCXsKKwkJZGJnT2Zmc2V0ID0gZGJnQ29tbWFuZExpbmVIaXN0b3J5LnNpemUoKTsKKwl9CisJZWxzZSBpZiggZGJnQ29tbWFuZEFyZyA9PSAiPyIgKQorCXsKKwkJQVZNX09TX0NPVVQgPDwgIkVudGVyIGFuIGludGVnZXIgYXMgaGlzdG9yeSBjb21tYW5kIGNvdW50IDo+ICI7CisKKwkJc3RkOjpjaW4gPj4gZGJnT2Zmc2V0OworCX0KKwllbHNlCisJeworCQlpZiggKGRiZ0NvbW1hbmRBcmdbMF0gPT0gJyMnKSB8fCAoZGJnQ29tbWFuZEFyZ1swXSA9PSAnPycpICkKKwkJeworCQkJZGJnQ29tbWFuZEFyZyA9IGRiZ0NvbW1hbmRBcmcuc3Vic3RyKCAxICk7CisJCX0KKworCQlmcm9tX3N0cmluZzxhdm1fc2l6ZV90PihkYmdDb21tYW5kQXJnLCBkYmdPZmZzZXQpOworCX0KKworCWF2bV9pbnRlZ2VyX3QgaGlzdG9yeUNvdW50ID0KKwkJCXN0ZDo6bWluKGRiZ09mZnNldCwgZGJnQ29tbWFuZExpbmVIaXN0b3J5LnNpemUoKSkgLSAxOworCisJQVZNX09TX0NPVVQgPDwgIkNvbW1hbmQgaGlzdG9yeSA6PiAiIDw8IHN0ZDo6ZW5kbDsKKwlBVk1fT1NfQ09VVCA8PCAiXHQiIDw8ICIwOiA8dGhpcyBoaXN0b3J5IGNvbW1hbmQ+ICIgPDwgZGJnQ29tbWFuZExpbmUgPDwgc3RkOjplbmRsOworCWZvciggZGJnT2Zmc2V0ID0gMSA7IGhpc3RvcnlDb3VudCA+PSAwIDsgKytkYmdPZmZzZXQsIC0taGlzdG9yeUNvdW50ICkKKwl7CisJCUFWTV9PU19DT1VUIDw8ICJcdCIgPDwgZGJnT2Zmc2V0IDw8ICI6ICIKKwkJCQk8PCBkYmdDb21tYW5kTGluZUhpc3RvcnlbaGlzdG9yeUNvdW50XSA8PCBzdGQ6OmVuZGw7CisJfQorfQorCisKK3ZvaWQgSURlYnVnUHJvY2Vzc29yUHJvdmlkZXI6OmRiZ0NvbW1hbmRDb25maWcoKQoreworCW1EZWJ1Z1Byb2Nlc3Nvci0+Z2V0Q29udHJvbGxlclVuaXRNYW5hZ2VyKCkudG9TdHJlYW0oIEFWTV9PU19DT1VUICk7CisKKwlBVk1fT1NfQ09VVCA8PCBzdGQ6OmVuZGw7CisKKwlBVk1fT1NfQ09VVCA8PCAiVGhlIGRlYnVnPCBlbmFibGUgPiBwcm9jZXNzZXMgYXJlIDo+ICIKKwkJCTw8ICggbURlYnVnUHJlZmlsdGVyaW5nRmxhZyA/ICAgICAgICAgICIgcHJlZmlsdGVyIiA6ICIiICkKKwkJCTw8ICggbURlYnVnUHJlZmlsdGVyaW5nRmluYWxpemVGbGFnID8gICIgcHJlZmlsdGVyI2ZpbmFsaXplIiA6ICIiICkKKwkJCTw8ICggbURlYnVnUG9zdGZpbHRlcmluZ0ZsYWcgPyAgICAgICAgICIgcG9zdGZpbHRlciIgOiAiIiApCisJCQk8PCAoIG1EZWJ1Z1Bvc3RmaWx0ZXJpbmdGaW5hbGl6ZUZsYWcgPyAiIHBvc3RmaWx0ZXIjZmluYWxpemUiIDogIiIgKQorCQkJPDwgKCBtRGVidWdQcmVwcm9jZXNzaW5nRmxhZyA/ICAgICAgICAgIiBwcmVwcm9jZXNzIiA6ICIiICkKKwkJCTw8ICggbURlYnVnUG9zdHByb2Nlc3NpbmdGbGFnID8gICAgICAgICIgcG9zdHByb2Nlc3MiIDogIiIgKQorCQkJPDwgc3RkOjplbmRsOworCisJQVZNX09TX0NPVVQgPDwgIlRoZSBzdGVwIGNvdW50ICAgICAgICA6ICIKKwkJCTw8IG1EZWJ1Z0V2YWxTdGVwQ291bnQgPDwgc3RkOjplbmRsOworCisJQVZNX09TX0NPVVQgPDwgIk5leHQgaW50ZXJhY3Rpb24gc3RlcCA6ICIKKwkJCTw8IG1EZWJ1Z0JyZWFrcG9pbnRFdmFsU3RlcCA8PCBzdGQ6OmVuZGw7CisKKwlBVk1fT1NfQ09VVCA8PCAiSW50ZXJhY3Rpb24gcGVyaW9kICAgIDogIgorCQkJPDwgbURlYnVnQnJlYWtwb2ludEV2YWxTdGVwUGVyaW9kIDw8IHN0ZDo6ZW5kbDsKKworCWlmKCBtRGVidWdCcmVha3BvaW50RXZhbENvbnRleHQgPiAwICkKKwl7CisJCUFWTV9PU19DT1VUIDw8ICJOZXh0IGludGVyYWN0aW9uIGN0eCAgOiAiCisJCQkJPDwgbURlYnVnQnJlYWtwb2ludEV2YWxDb250ZXh0IDw8IHN0ZDo6ZW5kbDsKKwl9CisKKwlBVk1fT1NfQ09VVCA8PCBzdGQ6OmVuZGw7CisKKworCUFWTV9PU19DT1VUIDw8ICJUaGUgdXNlciB0cmFjZSBlbGVtZW50IDo+ICI7CisJbURlYnVnVHJhY2VTZXF1ZW5jZS50b1N0cmVhbShBVk1fT1NfQ09VVCk7CisKKwlBVk1fT1NfQ09VVCA8PCAiZGV0YWlsIDoiOworCWlmKCBkYmdEZXRhaWxzTWluIHx8IGRiZ0RldGFpbHNNZWQgfHwgZGJnRGV0YWlsc01heCApCisJeworCQlpZiggZGJnRGV0YWlsc01pbiApIHsgQVZNX09TX0NPVVQgPDwgIiBNSU5JTVVNIjsgfQorCQlpZiggZGJnRGV0YWlsc01lZCApIHsgQVZNX09TX0NPVVQgPDwgIiBNRURJVU0iIDsgfQorCQlpZiggZGJnRGV0YWlsc01heCApIHsgQVZNX09TX0NPVVQgPDwgIiBNQVhJTVVNIjsgfQorCX0KKwllbHNlCisJeworCQlBVk1fT1NfQ09VVCA8PCAiIERFRkFVTFQiOworCX0KKworCUFWTV9PU19DT1VUIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisKKwlpZiggbURlYnVnU2VsZWN0ZWRDb250ZXh0ICE9IE5VTEwgKQorCXsKKwkJQVZNX09TX0NPVVQgPDwgIlNlbGVjdGVkIENvbnRleHQgOj4gIjsKKworCQltRGVidWdTZWxlY3RlZENvbnRleHQtPnRyYWNlRGVmYXVsdEV2YWwoQVZNX09TX0NPVVQpOworCisJCUFWTV9PU19DT1VUIDw8IHN0ZDo6ZW5kbDsKKwl9CisKKworCUFWTV9PU19DT1VUIDw8ICJWZXJib3NpdHkgbGV2ZWwgICA6PiAiIDw8IGF2bV9zdHJFeGVjVmVyYm9zaXR5TGV2ZWwoKQorCQkJPDwgc3RkOjplbmRsOworCUFWTV9PU19DT1VUIDw8ICJEZWJ1ZyB0cmFjZSBsZXZlbCA6PiAiIDw8IGF2bV9zdHJEZWJ1Z0xldmVsKCkKKwkJCTw8IHN0ZDo6ZW5kbDsKKwlBVk1fT1NfQ09VVCA8PCAiRGVidWcgdHJhY2UgZmxhZyAgOj4gIiA8PCBhdm1fc3RyRGVidWdGbGFnKCIgfCAiKQorCQkJPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKK30KKworCit2b2lkIElEZWJ1Z1Byb2Nlc3NvclByb3ZpZGVyOjpkYmdDb21tYW5kQnJlYWsoKQoreworCWlmKCBkYmdDb21tYW5kQXJnLmVtcHR5KCkgfHwgKGRiZ0NvbW1hbmRBcmcgPT0gIj8iKSApCisJeworCQlBVk1fT1NfQ09VVCA8PCAiRW50ZXIgYW4gaW50ZWdlciBhcyBzdGVwIG51bWJlciA6PiAiOworCisJCXN0ZDo6Y2luID4+IGRiZ0ludFZhbHVlOworCX0KKwllbHNlCisJeworCQlpZiggKGRiZ0NvbW1hbmRBcmdbMF0gPT0gJyMnKSB8fCAoZGJnQ29tbWFuZEFyZ1swXSA9PSAnPycpICkKKwkJeworCQkJZGJnQ29tbWFuZEFyZyA9IGRiZ0NvbW1hbmRBcmcuc3Vic3RyKCAxICk7CisJCX0KKworCQlmcm9tX3N0cmluZzxhdm1faW50ZWdlcl90PihkYmdDb21tYW5kQXJnLCBkYmdJbnRWYWx1ZSk7CisJfQorCisJbURlYnVnQnJlYWtwb2ludEV2YWxDb250ZXh0ID0KKwkJCXN0ZDo6bWF4KHN0YXRpY19jYXN0PCBhdm1faW50ZWdlcl90PiggMCApLCBkYmdJbnRWYWx1ZSk7Cit9CisKKwordm9pZCBJRGVidWdQcm9jZXNzb3JQcm92aWRlcjo6ZGJnQ29tbWFuZE5leHQoKQoreworCWlmKCBkYmdDb21tYW5kQXJnLmVtcHR5KCkgKQorCXsKKwkJLy8gQ29udGludWUgdW50aWwgbmV4dCBwcmVkZWZpbmVkIGJyZWFrIHN0ZXAgISEhCisJfQorCWVsc2UgaWYoIGRiZ0NvbW1hbmRBcmdbMF0gPT0gJ2knICkKKwl7CisJCW1EZWJ1Z0JyZWFrcG9pbnRFdmFsU3RlcCA9IG1EZWJ1Z0V2YWxTdGVwQ291bnQgKyAxOworCX0KKwllbHNlCisJeworCQlpZiggZGJnQ29tbWFuZEFyZyA9PSAiPyIgKQorCQl7CisJCQlBVk1fT1NfQ09VVCA8PCAiRW50ZXIgYW4gaW50ZWdlciBhcyBzdGVwIG51bWJlciA6PiAiOworCisJCQlzdGQ6OmNpbiA+PiBkYmdJbnRWYWx1ZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmKCAoZGJnQ29tbWFuZEFyZ1swXSA9PSAnIycpIHx8IChkYmdDb21tYW5kQXJnWzBdID09ICc/JykgKQorCQkJeworCQkJCWRiZ0NvbW1hbmRBcmcgPSBkYmdDb21tYW5kQXJnLnN1YnN0ciggMSApOworCQkJfQorCisJCQlmcm9tX3N0cmluZzxhdm1faW50ZWdlcl90PihkYmdDb21tYW5kQXJnLCBkYmdJbnRWYWx1ZSk7CisJCX0KKworCQltRGVidWdCcmVha3BvaW50RXZhbFN0ZXAgPSBtRGVidWdFdmFsU3RlcENvdW50ICsKKwkJCQlzdGQ6Om1heChzdGF0aWNfY2FzdDwgYXZtX2ludGVnZXJfdD4oIDEgKSwgZGJnSW50VmFsdWUpOworCX0KK30KKworCit2b2lkIElEZWJ1Z1Byb2Nlc3NvclByb3ZpZGVyOjpkYmdDb21tYW5kUGVyaW9kKCkKK3sKKwlpZiggZGJnQ29tbWFuZEFyZy5lbXB0eSgpIHx8IChkYmdDb21tYW5kQXJnID09ICI/IikgKQorCXsKKwkJQVZNX09TX0NPVVQgPDwgIkVudGVyIGFuIGludGVnZXIgYXMgc3RlcCBpbnRlcmFjdGlvbiBwZXJpb2QgOj4gIjsKKworCQlzdGQ6OmNpbiA+PiBkYmdJbnRWYWx1ZTsKKwl9CisJZWxzZQorCXsKKwkJaWYoIChkYmdDb21tYW5kQXJnWzBdID09ICcjJykgfHwgKGRiZ0NvbW1hbmRBcmdbMF0gPT0gJz8nKSApCisJCXsKKwkJCWRiZ0NvbW1hbmRBcmcgPSBkYmdDb21tYW5kQXJnLnN1YnN0ciggMSApOworCQl9CisKKwkJZnJvbV9zdHJpbmc8YXZtX2ludGVnZXJfdD4oZGJnQ29tbWFuZEFyZywgZGJnSW50VmFsdWUpOworCX0KKworCW1EZWJ1Z0JyZWFrcG9pbnRFdmFsU3RlcFBlcmlvZCA9CisJCQlzdGQ6Om1heChzdGF0aWNfY2FzdDwgYXZtX2ludGVnZXJfdD4oIDEgKSwgZGJnSW50VmFsdWUpOworCisJbURlYnVnQnJlYWtwb2ludEV2YWxTdGVwID0KKwkJCW1EZWJ1Z0V2YWxTdGVwQ291bnQgKyBtRGVidWdCcmVha3BvaW50RXZhbFN0ZXBQZXJpb2Q7Cit9CisKKwordm9pZCBJRGVidWdQcm9jZXNzb3JQcm92aWRlcjo6ZGJnQ29tbWFuZFF1ZXVlKCkKK3sKKwlpZiggZGJnQ29tbWFuZEFyZy5lbXB0eSgpICkKKwl7CisJCW1EZWJ1Z1Byb2Nlc3Nvci0+Z2V0RXhlY3V0aW9uUXVldWUoKS50b1N0cmVhbShBVk1fT1NfQ09VVCk7CisJfQorCWVsc2UKKwl7CisJCWlmKCBkYmdDb21tYW5kQXJnID09ICI/IiApCisJCXsKKwkJCUFWTV9PU19DT1VUIDw8ICJTZWxlY3QgYSBxdWV1ZSAiCisJCQkJCSJ7IGluaXQgLCB3YWl0aW5nICwgcmVhZHkgLCByZXN1bHQgLCBmYWlsZWQgfSA6PiAiOworCisJCQlzdGQ6OmdldGxpbmUoc3RkOjpjaW4sIGRiZ0NvbW1hbmRBcmcpOworCQkJU3RyaW5nVG9vbHM6Omx0cmltKCBkYmdDb21tYW5kQXJnICk7CisJCX0KKwkJZWxzZSBpZiggKGRiZ0NvbW1hbmRBcmdbMF0gPT0gJyMnKSB8fCAoZGJnQ29tbWFuZEFyZ1swXSA9PSAnPycpICkKKwkJeworCQkJZGJnQ29tbWFuZEFyZyA9IGRiZ0NvbW1hbmRBcmcuc3Vic3RyKCAxICk7CisJCX0KKworCQlpZiggZGJnQ29tbWFuZEFyZy5maW5kKCJpbml0IikgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorCQl7CisJCQlBVk1fT1NfQ09VVCA8PCAidGhlIElOSVQgUVVFVUUgOj4gIiA8PCBzdGQ6OmVuZGw7CisJCQltRGVidWdQcm9jZXNzb3ItPmdldEV4ZWN1dGlvblF1ZXVlKCkudG9TdHJlYW0oCisJCQkJCW1EZWJ1Z1Byb2Nlc3Nvci0+Z2V0RXhlY3V0aW9uUXVldWUoKS5nZXRJbml0UXVldWUoKSwKKwkJCQkJQVZNX09TX0NPVVQpOworCQl9CisJCWlmKCBkYmdDb21tYW5kQXJnLmZpbmQoIndhaXRpbmciKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisJCXsKKwkJCW1EZWJ1Z1Byb2Nlc3Nvci0+Z2V0RXhlY3V0aW9uUXVldWUoKS50b1N0cmVhbVdhaXRpbmcoQVZNX09TX0NPVVQpOworCQl9CisJCWlmKCBkYmdDb21tYW5kQXJnLmZpbmQoInJlYWR5IikgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorCQl7CisJCQlBVk1fT1NfQ09VVCA8PCAidGhlIFJFQURZIFFVRVVFIDo+ICIgPDwgc3RkOjplbmRsOworCQkJbURlYnVnUHJvY2Vzc29yLT5nZXRFeGVjdXRpb25RdWV1ZSgpLnRvU3RyZWFtKAorCQkJCQltRGVidWdQcm9jZXNzb3ItPmdldEV4ZWN1dGlvblF1ZXVlKCkuZ2V0UmVhZHlRdWV1ZSgpLAorCQkJCQlBVk1fT1NfQ09VVCk7CisJCX0KKwkJaWYoIGRiZ0NvbW1hbmRBcmcuZmluZCgicmVzdWx0IikgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorCQl7CisJCQlBVk1fT1NfQ09VVCA8PCAidGhlIFJFU1VMVCBRVUVVRSA6PiAiIDw8IHN0ZDo6ZW5kbDsKKwkJCW1EZWJ1Z1Byb2Nlc3Nvci0+Z2V0RXhlY3V0aW9uUXVldWUoKS50b1N0cmVhbSgKKwkJCQkJbURlYnVnUHJvY2Vzc29yLT5nZXRFeGVjdXRpb25RdWV1ZSgpLmdldFJlc3VsdFF1ZXVlKCksCisJCQkJCUFWTV9PU19DT1VUKTsKKwkJfQorCQlpZiggZGJnQ29tbWFuZEFyZy5maW5kKCJmYWlsZWQiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisJCXsKKwkJCUFWTV9PU19DT1VUIDw8ICJ0aGUgRkFJTEVEIFFVRVVFIDo+ICIgPDwgc3RkOjplbmRsOworCQkJbURlYnVnUHJvY2Vzc29yLT5nZXRFeGVjdXRpb25RdWV1ZSgpLnRvU3RyZWFtKAorCQkJCQltRGVidWdQcm9jZXNzb3ItPmdldEV4ZWN1dGlvblF1ZXVlKCkuZ2V0RmFpbGVkUXVldWUoKSwKKwkJCQkJQVZNX09TX0NPVVQpOworCQl9CisJfQorCisJQVZNX09TX0NPVVQgPDwgc3RkOjplbmRsOworfQorCisKK3N0YXRpYyBjb25zdCBFeGVjdXRpb25Db250ZXh0ICogc2VhcmNoQ29udGV4dCgKKwkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMsIGF2bV91aW50MzJfdCBjdHhJRCkKK3sKKwlpZiggYW5FQy0+Z2V0SWROdW1iZXIoKSA9PSBjdHhJRCApCisJeworCQlyZXR1cm4oIGFuRUMgKTsKKwl9CisKKwllbHNlLy8gaWYoIGFuRUMtPm5vbmVtcHR5KCkgJiYgKGFuRUMtPmdldElkTnVtYmVyKCkgPCBjdHhJRCkgKQorCXsKKwkJRXhlY3V0aW9uQ29udGV4dDo6Y2hpbGRfaXRlcmF0b3IgaXRFQyA9IGFuRUMtPmJlZ2luKCk7CisJCUV4ZWN1dGlvbkNvbnRleHQ6OmNoaWxkX2l0ZXJhdG9yIGVuZEVDID0gYW5FQy0+ZW5kKCk7CisJCWZvciggOyAoaXRFQyAhPSBlbmRFQykgOyArK2l0RUMgKQorCQl7CisJCQlpZiggKGFuRUMgPSBzZWFyY2hDb250ZXh0KCgqaXRFQyksIGN0eElEKSkgIT0gTlVMTCApCisJCQl7CisJCQkJcmV0dXJuKCBhbkVDICk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4oIE5VTEwgKTsKK30KKwordm9pZCBJRGVidWdQcm9jZXNzb3JQcm92aWRlcjo6ZGJnQ29tbWFuZENvbnRleHQoKQoreworCWlmKCBkYmdDb21tYW5kQXJnLmVtcHR5KCkgJiYgKG1EZWJ1Z1NlbGVjdGVkQ29udGV4dCAhPSBOVUxMKSApCisJeworCQlBVk1fT1NfQ09VVCA8PCAiU2VsZWN0ZWQgQ29udGV4dCA6PiAiOworCisJCW1EZWJ1Z1NlbGVjdGVkQ29udGV4dC0+dHJhY2VEZWZhdWx0RXZhbChBVk1fT1NfQ09VVCk7CisKKwkJaWYoIGRiZ0RldGFpbHNNZWQgfHwgZGJnRGV0YWlsc01heCApCisJCXsKKwkJCW1EZWJ1Z1NlbGVjdGVkQ29udGV4dC0+dG9EZWJ1Z0ZldChBVk1fT1NfQ09VVCk7CisJCX0KKwkJZWxzZSBpZiggbm90IGRiZ0RldGFpbHNNaW4gKQorCQl7CisJCQltRGVidWdTZWxlY3RlZENvbnRleHQtPnRvRGVidWcoQVZNX09TX0NPVVQpOworCQl9CisKKwkJQVZNX09TX0NPVVQgPDwgc3RkOjplbmRsOworCisJCXJldHVybjsKKwl9CisKKworCWVsc2UgaWYoIGRiZ0NvbW1hbmRBcmcuZW1wdHkoKSB8fCAoZGJnQ29tbWFuZEFyZyA9PSAiPyIpICkKKwl7CisJCUFWTV9PU19DT1VUIDw8ICJTZWxlY3QgYW4gRXhlY3V0aW9uIENvbnRleHQgOj4gIjsKKworCQlzdGQ6OmNpbiA+PiBkYmdJbnRWYWx1ZTsKKwl9CisJZWxzZQorCXsKKwkJaWYoIChkYmdDb21tYW5kQXJnWzBdID09ICcjJykgfHwgKGRiZ0NvbW1hbmRBcmdbMF0gPT0gJz8nKSApCisJCXsKKwkJCWRiZ0NvbW1hbmRBcmcgPSBkYmdDb21tYW5kQXJnLnN1YnN0ciggMSApOworCQl9CisKKwkJZnJvbV9zdHJpbmc8YXZtX2ludGVnZXJfdD4oZGJnQ29tbWFuZEFyZywgZGJnSW50VmFsdWUpOworCX0KKworCisJZGJnRUMgPSBOVUxMOworCisJaWYoIG1EZWJ1Z1NlbGVjdGVkQ29udGV4dCAhPSAgTlVMTCApCisJeworCQkvLyBTZWFyY2hpbmcgaW4gdGhlIGNoaWxkcyBvZiB0aGVTZWxlY3RlZENvbnRleHQKKwkJZGJnRUMgPSBzZWFyY2hDb250ZXh0KCBtRGVidWdTZWxlY3RlZENvbnRleHQsCisJCQkJc3RkOjptYXgoc3RhdGljX2Nhc3Q8IGF2bV9pbnRlZ2VyX3Q+KCAwICksIGRiZ0ludFZhbHVlKSApOworCQlpZiggZGJnRUMgIT0gTlVMTCApCisJCXsKKwkJCW1EZWJ1Z1NlbGVjdGVkQ29udGV4dCA9IGRiZ0VDOworCQl9CisKKwkJLy8gSWYgbm90IGZvdW5kLCBTZWFyY2hpbmcgaW4gdGhlIGFuY2VzdG9ycyBvZiB0aGVTZWxlY3RlZENvbnRleHQKKwkJaWYoIGRiZ0VDID09IE5VTEwgKQorCQl7CisJCQlkYmdFQyA9IG1EZWJ1Z1NlbGVjdGVkQ29udGV4dDsKKwkJCWZvciggOyBkYmdFQyAhPSBOVUxMIDsgZGJnRUMgPSBkYmdFQy0+Z2V0UHJldmlvdXMoKSApCisJCQl7CisJCQkJaWYoIGRiZ0VDLT5nZXRJZE51bWJlcigpID09IGRiZ0ludFZhbHVlICkKKwkJCQl7CisJCQkJCW1EZWJ1Z1NlbGVjdGVkQ29udGV4dCA9IGRiZ0VDOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvLyBJZiBub3QgZm91bmQsIFNlYXJjaGluZyBpbiB0aGUgY3VycmVudCBkYmdRdWV1ZQorCWlmKCBkYmdFQyA9PSBOVUxMICkKKwl7CisJCWlmKCBkYmdRdWV1ZS0+bm9uZW1wdHkoKSApCisJCXsKKwkJCWRiZ1F1ZXVlSXQgPSBkYmdRdWV1ZS0+YmVnaW4oKTsKKwkJCWRiZ1F1ZXVlSXRFbmQgPSBkYmdRdWV1ZS0+ZW5kKCk7CisJCQlmb3IoIDsgZGJnUXVldWVJdCAhPSBkYmdRdWV1ZUl0RW5kIDsgKytkYmdRdWV1ZUl0ICkKKwkJCXsKKwkJCQlpZiggKCpkYmdRdWV1ZUl0KS0+Z2V0SWROdW1iZXIoKSA9PSBkYmdJbnRWYWx1ZSApCisJCQkJeworCQkJCQltRGVidWdTZWxlY3RlZENvbnRleHQgPSBkYmdFQyA9ICgqZGJnUXVldWVJdCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8vIElmIG5vdCBmb3VuZCwgU2VhcmNoaW5nIGluIHRoZSBFeGVjdXRpb24gZ3JhcGggZnJvbSB0aGUgcm9vdCBjb250ZXh0CisJCWlmKCBkYmdFQyA9PSBOVUxMICkKKwkJeworCQkJZGJnRUMgPSBzZWFyY2hDb250ZXh0KAorCQkJCQltRGVidWdQcm9jZXNzb3ItPmdldENvbmZpZ3VyYXRpb24oKS5nZXRGaXJzdFRyYWNlKCksCisJCQkJCXN0ZDo6bWF4KHN0YXRpY19jYXN0PCBhdm1faW50ZWdlcl90PiggMCApLCBkYmdJbnRWYWx1ZSkgKTsKKworCQkJaWYoIGRiZ0VDICE9IE5VTEwgKQorCQkJeworCQkJCW1EZWJ1Z1NlbGVjdGVkQ29udGV4dCA9IGRiZ0VDOworCQkJfQorCQl9CisJfQorCisKKwlpZiggZGJnRUMgPT0gTlVMTCApCisJeworCQlBVk1fT1NfQ09VVCA8PCAiVW5mb3VuZCBFeGVjdXRpb24gQ29udGV4dCBieSBpZDogIiA8PCBkYmdJbnRWYWx1ZQorCQkJCTw8ICIgISEhIFVuY2hhbmdlIGN1cnJlbnQgc2VsZWN0aW9uIC4uLiIKKwkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCX0KKworCWlmKCBtRGVidWdTZWxlY3RlZENvbnRleHQgIT0gTlVMTCApCisJeworCQlBVk1fT1NfQ09VVCA8PCAiU2VsZWN0ZWQgQ29udGV4dCA6PiAiOworCisJCW1EZWJ1Z1NlbGVjdGVkQ29udGV4dC0+dHJhY2VEZWZhdWx0RXZhbChBVk1fT1NfQ09VVCk7CisKKwkJaWYoIGRiZ0RldGFpbHNNZWQgfHwgZGJnRGV0YWlsc01heCApCisJCXsKKwkJCW1EZWJ1Z1NlbGVjdGVkQ29udGV4dC0+dG9EZWJ1Z0ZldChBVk1fT1NfQ09VVCk7CisJCX0KKwkJZWxzZSBpZiggbm90IGRiZ0RldGFpbHNNaW4gKQorCQl7CisJCQltRGVidWdTZWxlY3RlZENvbnRleHQtPnRvRGVidWcoQVZNX09TX0NPVVQpOworCQl9CisKKwkJQVZNX09TX0NPVVQgPDwgc3RkOjplbmRsOworCX0KK30KKworCit2b2lkIElEZWJ1Z1Byb2Nlc3NvclByb3ZpZGVyOjpkYmdDb21tYW5kUGF0aCgpCit7CisJaWYoIGRiZ0NvbW1hbmRBcmcuZW1wdHkoKSAmJiAobURlYnVnU2VsZWN0ZWRDb250ZXh0ICE9IE5VTEwpICkKKwl7CisJCWRiZ0VDID0gbURlYnVnU2VsZWN0ZWRDb250ZXh0OworCisJCUFWTV9PU19DT1VUIDw8ICJTZWxlY3RlZCBQYXRoLCBjdXJyZW50IHNlbGVjdGVkIGNvbnRleHQgOj4gIiA8PCBzdGQ6OmVuZGw7CisJCWRiZ0VDLT50cmFjZURlZmF1bHRFdmFsKEFWTV9PU19DT1VUKTsKKworCQlkYmdFQy0+dG9EZWJ1ZyhBVk1fT1NfQ09VVCk7CisKKwkJQVZNX09TX0NPVVQgPDwgc3RkOjplbmRsIDw8ICJBbmNlc3RvcnMgOj4gIiA8PCBzdGQ6OmVuZGw7CisKKwkJZGJnRUMgPSBkYmdFQy0+Z2V0UHJldmlvdXMoKTsKKwkJZm9yKCA7IGRiZ0VDICE9IE5VTEwgOyBkYmdFQyA9IGRiZ0VDLT5nZXRQcmV2aW91cygpICkKKwkJeworCQkJZGJnRUMtPnRyYWNlRGVmYXVsdChBVk1fT1NfQ09VVCk7CisKKwkJCWRiZ0VDLT50b0RlYnVnKEFWTV9PU19DT1VUKTsKKwkJfQorCisJCUFWTV9PU19DT1VUIDw8IHN0ZDo6ZW5kbDsKKworCQlyZXR1cm47CisJfQorCisKKwllbHNlIGlmKCBkYmdDb21tYW5kQXJnLmVtcHR5KCkgfHwgKGRiZ0NvbW1hbmRBcmcgPT0gIj8iKSApCisJeworCQlBVk1fT1NfQ09VVCA8PCAiU2VsZWN0IGFuIEV4ZWN1dGlvbiBDb250ZXh0IDo+ICI7CisKKwkJc3RkOjpjaW4gPj4gZGJnSW50VmFsdWU7CisJfQorCWVsc2UKKwl7CisJCWlmKCAoZGJnQ29tbWFuZEFyZ1swXSA9PSAnIycpIHx8IChkYmdDb21tYW5kQXJnWzBdID09ICc/JykgKQorCQl7CisJCQlkYmdDb21tYW5kQXJnID0gZGJnQ29tbWFuZEFyZy5zdWJzdHIoIDEgKTsKKwkJfQorCisJCWZyb21fc3RyaW5nPGF2bV9pbnRlZ2VyX3Q+KGRiZ0NvbW1hbmRBcmcsIGRiZ0ludFZhbHVlKTsKKwl9CisKKworCWRiZ0VDID0gTlVMTDsKKworCWlmKCBtRGVidWdTZWxlY3RlZENvbnRleHQgIT0gIE5VTEwgKQorCXsKKwkJLy8gU2VhcmNoaW5nIGluIHRoZSBjaGlsZHMgb2YgbURlYnVnU2VsZWN0ZWRDb250ZXh0CisJCWRiZ0VDID0gc2VhcmNoQ29udGV4dCggbURlYnVnU2VsZWN0ZWRDb250ZXh0LAorCQkJCXN0ZDo6bWF4KHN0YXRpY19jYXN0PCBhdm1faW50ZWdlcl90PiggMCApLCBkYmdJbnRWYWx1ZSkgKTsKKwkJaWYoIGRiZ0VDICE9IE5VTEwgKQorCQl7CisJCQltRGVidWdTZWxlY3RlZENvbnRleHQgPSBkYmdFQzsKKwkJfQorCisJCS8vIElmIG5vdCBmb3VuZCwgU2VhcmNoaW5nIGluIHRoZSBhbmNlc3RvcnMgb2YgbURlYnVnU2VsZWN0ZWRDb250ZXh0CisJCWlmKCBkYmdFQyA9PSBOVUxMICkKKwkJeworCQkJZGJnRUMgPSBtRGVidWdTZWxlY3RlZENvbnRleHQ7CisJCQlmb3IoIDsgZGJnRUMgIT0gTlVMTCA7IGRiZ0VDID0gZGJnRUMtPmdldFByZXZpb3VzKCkgKQorCQkJeworCQkJCWlmKCBkYmdFQy0+Z2V0SWROdW1iZXIoKSA9PSBkYmdJbnRWYWx1ZSApCisJCQkJeworCQkJCQltRGVidWdTZWxlY3RlZENvbnRleHQgPSBkYmdFQzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLy8gSWYgbm90IGZvdW5kLCBTZWFyY2hpbmcgaW4gdGhlIGN1cnJlbnQgZGJnUXVldWUKKwlpZiggZGJnRUMgPT0gTlVMTCApCisJeworCQlpZiggZGJnUXVldWUtPm5vbmVtcHR5KCkgKQorCQl7CisJCQlkYmdRdWV1ZUl0ID0gZGJnUXVldWUtPmJlZ2luKCk7CisJCQlkYmdRdWV1ZUl0RW5kID0gZGJnUXVldWUtPmVuZCgpOworCQkJZm9yKCA7IGRiZ1F1ZXVlSXQgIT0gZGJnUXVldWVJdEVuZCA7ICsrZGJnUXVldWVJdCApCisJCQl7CisJCQkJaWYoICgqZGJnUXVldWVJdCktPmdldElkTnVtYmVyKCkgPT0gZGJnSW50VmFsdWUgKQorCQkJCXsKKwkJCQkJbURlYnVnU2VsZWN0ZWRDb250ZXh0ID0gZGJnRUMgPSAoKmRiZ1F1ZXVlSXQpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBJZiBub3QgZm91bmQsIFNlYXJjaGluZyBpbiB0aGUgRXhlY3V0aW9uIGdyYXBoIGZyb20gdGhlIHJvb3QgY29udGV4dAorCQlpZiggZGJnRUMgPT0gTlVMTCApCisJCXsKKwkJCWRiZ0VDID0gc2VhcmNoQ29udGV4dCgKKwkJCQkJbURlYnVnUHJvY2Vzc29yLT5nZXRDb25maWd1cmF0aW9uKCkuZ2V0Rmlyc3RUcmFjZSgpLAorCQkJCQlzdGQ6Om1heChzdGF0aWNfY2FzdDwgYXZtX2ludGVnZXJfdD4oIDAgKSwgZGJnSW50VmFsdWUpICk7CisKKwkJCWlmKCBkYmdFQyAhPSBOVUxMICkKKwkJCXsKKwkJCQltRGVidWdTZWxlY3RlZENvbnRleHQgPSBkYmdFQzsKKwkJCX0KKwkJfQorCX0KKworCWlmKCBkYmdFQyAhPSBOVUxMICkKKwl7CisJCUFWTV9PU19DT1VUIDw8ICJTZWxlY3RlZCBQYXRoLCBjdXJyZW50IHNlbGVjdGVkIGNvbnRleHQgOj4gIiA8PCBzdGQ6OmVuZGw7CisJCWRiZ0VDLT50cmFjZURlZmF1bHRFdmFsKEFWTV9PU19DT1VUKTsKKworCQlkYmdFQy0+dG9EZWJ1ZyhBVk1fT1NfQ09VVCk7CisKKwkJQVZNX09TX0NPVVQgPDwgc3RkOjplbmRsIDw8ICJBbmNlc3RvcnMgOj4gIiA8PCBzdGQ6OmVuZGw7CisKKwkJZGJnRUMgPSBkYmdFQy0+Z2V0UHJldmlvdXMoKTsKKwkJZm9yKCA7IGRiZ0VDICE9IE5VTEwgOyBkYmdFQyA9IGRiZ0VDLT5nZXRQcmV2aW91cygpICkKKwkJeworCQkJZGJnRUMtPnRyYWNlRGVmYXVsdChBVk1fT1NfQ09VVCk7CisKKwkJCWRiZ0VDLT50b0RlYnVnKEFWTV9PU19DT1VUKTsKKwkJfQorCisJCUFWTV9PU19DT1VUIDw8IHN0ZDo6ZW5kbDsKKwl9CisJZWxzZQorCXsKKwkJQVZNX09TX0NPVVQgPDwgIlVuZm91bmQgRXhlY3V0aW9uIENvbnRleHQgYnkgaWQ6ICIgPDwgZGJnSW50VmFsdWUKKwkJCQk8PCAiICEhISBVbmNoYW5nZSBjdXJyZW50IHNlbGVjdGlvbiAuLi4iCisJCQkJPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKwl9Cit9CisKKwordm9pZCBJRGVidWdQcm9jZXNzb3JQcm92aWRlcjo6ZGJnQ29tbWFuZFRyYWNlKCkKK3sKKwlBVk1fT1NfQ09VVCA8PCAiVGhlIHVzZXIgdHJhY2UgZWxlbWVudCA6PiAiOworCW1EZWJ1Z1RyYWNlU2VxdWVuY2UudG9TdHJlYW0oQVZNX09TX0NPVVQgKTsKKwlBVk1fT1NfQ09VVCA8PCBzdGQ6OmVuZGw7Cit9CisKK3ZvaWQgSURlYnVnUHJvY2Vzc29yUHJvdmlkZXI6OmRiZ0NvbW1hbmRUcmFjZURldGFpbExldmVsKCkKK3sKKwlpZiggbm90IGRiZ0NvbW1hbmRBcmcuZW1wdHkoKSApCisJeworCQlpZiggZGJnQ29tbWFuZEFyZ1swXSA9PSAnLScgKQorCQl7CisJCQlkYmdEZXRhaWxzTWluID0gbm90IGRiZ0RldGFpbHNNaW47CisJCX0KKwkJZWxzZSBpZiggZGJnQ29tbWFuZEFyZ1swXSA9PSAnKycgKQorCQl7CisJCQlkYmdEZXRhaWxzTWVkID0gbm90IGRiZ0RldGFpbHNNZWQ7CisJCX0KKwkJZWxzZSBpZiggZGJnQ29tbWFuZEFyZ1swXSA9PSAnKicgKQorCQl7CisJCQlkYmdEZXRhaWxzTWF4ID0gbm90IGRiZ0RldGFpbHNNYXg7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJZGJnRGV0YWlsc01pbiA9IGRiZ0RldGFpbHNNZWQgPSBkYmdEZXRhaWxzTWF4ID0gZmFsc2U7CisJfQorCisJQVZNX09TX0NPVVQgPDwgImRldGFpbCA6IjsKKwlpZiggZGJnRGV0YWlsc01pbiB8fCBkYmdEZXRhaWxzTWVkIHx8IGRiZ0RldGFpbHNNYXggKQorCXsKKwkJaWYoIGRiZ0RldGFpbHNNaW4gKSB7IEFWTV9PU19DT1VUIDw8ICIgTUlOSU1VTSI7IH0KKwkJaWYoIGRiZ0RldGFpbHNNZWQgKSB7IEFWTV9PU19DT1VUIDw8ICIgTUVESVVNIiA7IH0KKwkJaWYoIGRiZ0RldGFpbHNNYXggKSB7IEFWTV9PU19DT1VUIDw8ICIgTUFYSU1VTSI7IH0KKwl9CisJZWxzZQorCXsKKwkJQVZNX09TX0NPVVQgPDwgIiBERUZBVUxUIjsKKwl9CisKKwlBVk1fT1NfQ09VVCA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworfQorCisKKwordm9pZCBJRGVidWdQcm9jZXNzb3JQcm92aWRlcjo6ZGJnQ29tbWFuZFZhcigpCit7CisJaWYoIChkYmdDb21tYW5kQXJnLmVtcHR5KCkgJiYgKG1EZWJ1Z1NlbGVjdGVkVmFyID09IE5VTEwpKSB8fAorCQkoZGJnQ29tbWFuZEFyZyA9PSAiPyIpICkKKwl7CisJCUFWTV9PU19DT1VUIDw8ICJFbnRlciBhIHZhcmlhYmxlIElEIDo+ICI7CisKKwkJc3RkOjpnZXRsaW5lKHN0ZDo6Y2luLCBkYmdDb21tYW5kQXJnKTsKKwkJU3RyaW5nVG9vbHM6Omx0cmltKCBkYmdDb21tYW5kQXJnICk7CisJfQorCWVsc2UKKwl7CisJCWlmKCBkYmdDb21tYW5kQXJnWzBdID09ICc/JyApCisJCXsKKwkJCWRiZ0NvbW1hbmRBcmcgPSBkYmdDb21tYW5kQXJnLnN1YnN0ciggMSApOworCQl9CisJfQorCisJaWYoIG5vdCBkYmdDb21tYW5kQXJnLmVtcHR5KCkgKQorCXsKKwkJZGJnVFAgPSBkYmdUcmFjZVBvaW50ID0gbmV3IFRyYWNlUG9pbnQoCisJCQkJRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfVkFSSUFCTEVfTkFUVVJFLCBBVk1fT1BDT0RFX0FTU0lHTik7CisKKwkJaWYoIGRiZ1RyYWNlUG9pbnQtPmNvbmZpZ3VyZVZhcmlhYmxlKG1EZWJ1Z0NvbmZpZ3VyYXRpb24sIGRiZ0NvbW1hbmRBcmcpICkKKwkJeworCQkJaWYoIG1EZWJ1Z1RyYWNlU2VxdWVuY2UuY29udGFpbnNQb2ludChkYmdUcmFjZVBvaW50LCBkYmdUUCkgKQorCQkJeworCQkJCW1EZWJ1Z1NlbGVjdGVkVmFyID0gZGJnVFAudG9fcHRyPCBUcmFjZVBvaW50ID4oKTsKKworCQkJCW1EZWJ1Z1NlbGVjdGVkVmFycy5hZGRfdW5pb24oIG1EZWJ1Z1NlbGVjdGVkVmFyICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJZGJnVHJhY2VQb2ludC0+dHBpZCA9ICsrKG1EZWJ1Z1RyYWNlRmFjdG9yeS0+VFBfSUQpOworCisJCQkJbURlYnVnVHJhY2VTZXF1ZW5jZS5wb2ludHMuYXBwZW5kKCBkYmdUUCApOworCisJCQkJbURlYnVnU2VsZWN0ZWRWYXJzLmFwcGVuZCgKKwkJCQkJCW1EZWJ1Z1NlbGVjdGVkVmFyID0gZGJnVHJhY2VQb2ludCApOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJQVZNX09TX1dBUk4gPDwgIlVuZm91bmQgdmFyaWFibGUgPDwgIiA8PCBkYmdDb21tYW5kQXJnIDw8ICIgPj4gISIKKwkJCQkJPDwgc3RkOjplbmRsOworCQl9CisJfQorCisKKwlpZiggbURlYnVnU2VsZWN0ZWRWYXIgIT0gTlVMTCApCisJeworCQlBVk1fT1NfQ09VVCA8PCAiU2VsZWN0ZWQgdmFyaWFibGUgOj4gIjsKKwkJbURlYnVnU2VsZWN0ZWRWYXItPnRvU3RyZWFtKEFWTV9PU19DT1VUKTsKKworCQlpZiggbURlYnVnU2VsZWN0ZWRDb250ZXh0ICE9IE5VTEwgKQorCQl7CisJCQlkYmdFQyA9IG1EZWJ1Z1NlbGVjdGVkQ29udGV4dDsKKwkJCWRvCisJCQl7CisJCQkJQVZNX09TX0NPVVQgPDwgIldpdGggc2VsZWN0ZWQgQ29udGV4dCA6PiAiOworCQkJCWRiZ0VDLT50cmFjZU1pbmltdW0oQVZNX09TX0NPVVQpOworCisJCQkJZGJnUHJpbnRWYXJJbmZvKCBtRGVidWdTZWxlY3RlZFZhciApOworCQkJfQorCQkJd2hpbGUoIG1EZWJ1Z1RyYWNlRnVsbFBhdGhGbGFnICYmCisJCQkJKChkYmdFQyA9IGRiZ0VDLT5nZXRQcmV2aW91cygpKSAhPSBOVUxMKSApOworCQl9CisKKwkJQVZNX09TX0NPVVQgPDwgc3RkOjplbmRsOworCX0KK30KKworCit2b2lkIElEZWJ1Z1Byb2Nlc3NvclByb3ZpZGVyOjpkYmdQcmludFZhckluZm8oVHJhY2VQb2ludCAqIGFUUCkKK3sKKwlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBkYmdFQyApIDw8ICJFeGVjdXRpb24gQ29udGV4dCAhISEiCisJCQk8PCBTRU5EX0VYSVQ7CisKKwlkYmdFRCA9IGRiZ0VDLT5nZXRBUEV4ZWN1dGlvbkRhdGEoKTsKKworCWlmKCBhVFAtPlJJRC52YWxpZCgpICkKKwl7CisJCWRiZ1ZhbHVlID0gbURlYnVnUHJvY2Vzc29yLT5nZXRFTlYoKS5nZXRSdmFsdWUoZGJnRUQsCisJCQkJYVRQLT5SSUQsIGFUUC0+b2JqZWN0LT50bzwgSW5zdGFuY2VPZkRhdGEgPigpICk7CisJfQorCWVsc2UgaWYoIChhVFAtPmdldEV4ZWN1dGFibGUoKSAhPSBOVUxMKSAmJgorCQkJYVRQLT5nZXRFeGVjdXRhYmxlKCktPmhhc0luaXRpYWxJbnN0YW5jZSgpICkKKwl7CisJCWRiZ1ZhbHVlID0gbURlYnVnUHJvY2Vzc29yLT5nZXRFTlYoKS5nZXRSdmFsdWUoCisJCQkJZGJnRUQsIGFUUC0+b2JqZWN0LT50bzwgSW5zdGFuY2VPZkRhdGEgPigpICk7CisJfQorCWVsc2UKKwl7CisJCWRiZ1ZhbHVlID0gQkY6OlJFRl9OVUxMOworCX0KKworCWlmKCBkYmdWYWx1ZS52YWxpZCgpICkKKwl7CisJCUFWTV9PU19DT1VUIDw8ICIgPT0+IHZhciAiIDw8IGFUUC0+b2JqZWN0LT50bzwgSW5zdGFuY2VPZkRhdGEgPigpLT4KKwkJCQlnZXRUeXBlU3BlY2lmaWVyKCktPnN0clQoKSA8PCAiICIgPDwgYVRQLT5vYmplY3QtPmdldE5hbWVJRCgpCisJCQkJPDwgIiA9ICIgPDwgZGJnVmFsdWUuc3RyKCkgPDwgc3RkOjplbmRsOworCX0KK30KKwordm9pZCBJRGVidWdQcm9jZXNzb3JQcm92aWRlcjo6ZGJnQ29tbWFuZFZhcnMoKQoreworCUFWTV9PU19DT1VUIDw8ICJTZWxlY3RlZCB2YXJpYWJsZXMgOj4gIiA8PCBzdGQ6OmVuZGw7CisJbURlYnVnVHJhY2VGYWN0b3J5LT50b1N0cmVhbShBVk1fT1NfQ09VVCwgbURlYnVnU2VsZWN0ZWRWYXJzKTsKKworCWlmKCBtRGVidWdTZWxlY3RlZENvbnRleHQgIT0gTlVMTCApCisJeworCQlBVk1fT1NfQ09VVCA8PCAiV2l0aCBzZWxlY3RlZCBDb250ZXh0IDo+ICI7CisJCW1EZWJ1Z1NlbGVjdGVkQ29udGV4dC0+ZGVidWdEZWZhdWx0KEFWTV9PU19DT1VUKTsKKworCQlkYmdQb2ludEl0ID0gbURlYnVnU2VsZWN0ZWRWYXJzLmJlZ2luKCk7CisJCWRiZ1BvaW50SXRFbmQgPSBtRGVidWdTZWxlY3RlZFZhcnMuZW5kKCk7CisJCWZvciggOyBkYmdQb2ludEl0ICE9IGRiZ1BvaW50SXRFbmQgOyArK2RiZ1BvaW50SXQgKQorCQl7CisJCQlkYmdQcmludFZhckluZm8oICpkYmdQb2ludEl0ICk7CisJCX0KKwl9CisKKwlBVk1fT1NfQ09VVCA8PCBzdGQ6OmVuZGw7Cit9CisKKwordm9pZCBJRGVidWdQcm9jZXNzb3JQcm92aWRlcjo6ZGJnQ29tbWFuZFRpbWUoKQoreworCWlmKCAoZGJnQ29tbWFuZEFyZy5lbXB0eSgpICYmIChtRGVidWdTZWxlY3RlZFRpbWVWYXIgPT0gTlVMTCkpIHx8CisJCShkYmdDb21tYW5kQXJnID09ICI/IikgKQorCXsKKwkJQVZNX09TX0NPVVQgPDwgIkVudGVyIGEgdGltZSB2YXJpYWJsZSBJRCA6PiAiOworCisJCXN0ZDo6Z2V0bGluZShzdGQ6OmNpbiwgZGJnQ29tbWFuZEFyZyk7CisJCVN0cmluZ1Rvb2xzOjpsdHJpbSggZGJnQ29tbWFuZEFyZyApOworCX0KKwllbHNlCisJeworCQlpZiggZGJnQ29tbWFuZEFyZ1swXSA9PSAnPycgKQorCQl7CisJCQlkYmdDb21tYW5kQXJnID0gZGJnQ29tbWFuZEFyZy5zdWJzdHIoIDEgKTsKKwkJfQorCX0KKworCWlmKCBub3QgZGJnQ29tbWFuZEFyZy5lbXB0eSgpICkKKwl7CisJCWRiZ1RQID0gZGJnVHJhY2VQb2ludCA9IG5ldyBUcmFjZVBvaW50KAorCQkJCUVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1RJTUVfTkFUVVJFLCBBVk1fT1BDT0RFX1RJTUVEX0dVQVJEKTsKKwkJZGJnVHJhY2VQb2ludC0+b2JqZWN0ID0gbURlYnVnRGVsdGFUaW1lVmFyaWFibGU7CisKKwkJaWYoIGRiZ1RyYWNlUG9pbnQtPmNvbmZpZ3VyZVZhcmlhYmxlKG1EZWJ1Z0NvbmZpZ3VyYXRpb24sIGRiZ0NvbW1hbmRBcmcpICkKKwkJeworCQkJaWYoIG1EZWJ1Z1RyYWNlU2VxdWVuY2UuY29udGFpbnNQb2ludChkYmdUcmFjZVBvaW50LCBkYmdUUCkgKQorCQkJeworCQkJCW1EZWJ1Z1NlbGVjdGVkVGltZVZhciA9IGRiZ1RQLnRvX3B0cjwgVHJhY2VQb2ludCA+KCk7CisKKwkJCQltRGVidWdTZWxlY3RlZFZhcnMuYWRkX3VuaW9uKCBtRGVidWdTZWxlY3RlZFRpbWVWYXIgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlkYmdUcmFjZVBvaW50LT50cGlkID0gKysobURlYnVnVHJhY2VGYWN0b3J5LT5UUF9JRCk7CisKKwkJCQltRGVidWdUcmFjZVNlcXVlbmNlLnBvaW50cy5hcHBlbmQoIGRiZ1RQICk7CisKKwkJCQltRGVidWdTZWxlY3RlZFZhcnMuYXBwZW5kKAorCQkJCQkJbURlYnVnU2VsZWN0ZWRUaW1lVmFyID0gZGJnVHJhY2VQb2ludCApOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJQVZNX09TX1dBUk4gPDwgIlVuZm91bmQgdGltZSB2YXJpYWJsZSA8PCAiIDw8IGRiZ0NvbW1hbmRBcmcgPDwgIiA+PiAhIgorCQkJCQk8PCBzdGQ6OmVuZGw7CisJCX0KKwl9CisKKwlpZiggbURlYnVnU2VsZWN0ZWRUaW1lVmFyICE9IE5VTEwgKQorCXsKKwkJQVZNX09TX0NPVVQgPDwgIlNlbGVjdGVkIHRpbWUgdmFyaWFibGUgOj4gIjsKKwkJbURlYnVnU2VsZWN0ZWRUaW1lVmFyLT50b1N0cmVhbShBVk1fT1NfQ09VVCk7CisKKwkJaWYoIG1EZWJ1Z1NlbGVjdGVkQ29udGV4dCAhPSBOVUxMICkKKwkJeworCQkJQVZNX09TX0NPVVQgPDwgIldpdGggc2VsZWN0ZWQgQ29udGV4dCA6PiAiOworCQkJbURlYnVnU2VsZWN0ZWRDb250ZXh0LT5kZWJ1Z0RlZmF1bHQoQVZNX09TX0NPVVQpOworCisJCQlkYmdQcmludFZhckluZm8oIG1EZWJ1Z1NlbGVjdGVkVGltZVZhciApOworCQl9CisKKwkJQVZNX09TX0NPVVQgPDwgc3RkOjplbmRsOworCX0KK30KKworCit2b2lkIElEZWJ1Z1Byb2Nlc3NvclByb3ZpZGVyOjpkYmdDb21tYW5kUG9ydCgKKwkJRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTkFUVVJFIG5hdHVyZSkKK3sKKwlpZiggKGRiZ0NvbW1hbmRBcmcuZW1wdHkoKSAmJiAobURlYnVnU2VsZWN0ZWRQb3J0ID09IE5VTEwpKSB8fAorCQkoZGJnQ29tbWFuZEFyZyA9PSAiPyIpICkKKwl7CisJCUFWTV9PU19DT1VUIDw8ICJFbnRlciBhIHBvcnQgSUQgOj4gIjsKKworCQlzdGQ6OmdldGxpbmUoc3RkOjpjaW4sIGRiZ0NvbW1hbmRBcmcpOworCQlTdHJpbmdUb29sczo6bHRyaW0oIGRiZ0NvbW1hbmRBcmcgKTsKKwl9CisJZWxzZQorCXsKKwkJaWYoIGRiZ0NvbW1hbmRBcmdbMF0gPT0gJz8nICkKKwkJeworCQkJZGJnQ29tbWFuZEFyZyA9IGRiZ0NvbW1hbmRBcmcuc3Vic3RyKCAxICk7CisJCX0KKwl9CisKKwlpZiggbm90IGRiZ0NvbW1hbmRBcmcuZW1wdHkoKSApCisJeworCQlkYmdUUCA9IGRiZ1RyYWNlUG9pbnQgPSBuZXcgVHJhY2VQb2ludChuYXR1cmUsIEFWTV9PUENPREVfTlVMTCk7CisKKwkJaWYoIGRiZ1RyYWNlUG9pbnQtPmNvbmZpZ3VyZVBvcnQoCisJCQkJbURlYnVnQ29uZmlndXJhdGlvbiwgZGJnQ29tbWFuZEFyZywgbURlYnVnU2VsZWN0ZWRQb3J0cykgKQorCQl7CisJCQlpZiggbURlYnVnVHJhY2VTZXF1ZW5jZS5jb250YWluc1BvaW50KGRiZ1RyYWNlUG9pbnQsIGRiZ1RQKSApCisJCQl7CisJCQkJbURlYnVnU2VsZWN0ZWRQb3J0ID0gZGJnVFAudG9fcHRyPCBUcmFjZVBvaW50ID4oKTsKKworCQkJCW1EZWJ1Z1NlbGVjdGVkUG9ydHMuYWRkX3VuaW9uKCBtRGVidWdTZWxlY3RlZFBvcnQgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlkYmdUcmFjZVBvaW50LT50cGlkID0gKysobURlYnVnVHJhY2VGYWN0b3J5LT5UUF9JRCk7CisKKwkJCQltRGVidWdUcmFjZVNlcXVlbmNlLnBvaW50cy5hcHBlbmQoIGRiZ1RQICk7CisKKwkJCQltRGVidWdTZWxlY3RlZFBvcnRzLmFwcGVuZCgKKwkJCQkJCW1EZWJ1Z1NlbGVjdGVkUG9ydCA9IGRiZ1RyYWNlUG9pbnQgKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCUFWTV9PU19XQVJOIDw8ICJVbmZvdW5kIHBvcnQgPDwgIiA8PCBkYmdDb21tYW5kQXJnIDw8ICIgPj4gISIKKwkJCQkJPDwgc3RkOjplbmRsOworCQl9CisJfQorCisJaWYoIG1EZWJ1Z1NlbGVjdGVkUG9ydCAhPSBOVUxMICkKKwl7CisJCUFWTV9PU19DT1VUIDw8ICJTZWxlY3RlZCBwb3J0IDo+ICI7CisJCW1EZWJ1Z1NlbGVjdGVkUG9ydC0+dG9TdHJlYW0oQVZNX09TX0NPVVQpOworCisJCWlmKCBtRGVidWdTZWxlY3RlZENvbnRleHQgIT0gTlVMTCApCisJCXsKKwkJCUFWTV9PU19DT1VUIDw8ICJXaXRoIHNlbGVjdGVkIENvbnRleHQgOj4gIjsKKwkJCW1EZWJ1Z1NlbGVjdGVkQ29udGV4dC0+ZGVidWdEZWZhdWx0KEFWTV9PU19DT1VUKTsKKworCQkJZGJnUHJpbnRQb3J0SW5mbyggbURlYnVnU2VsZWN0ZWRQb3J0ICk7CisJCX0KKworCX0KK30KKwordm9pZCBJRGVidWdQcm9jZXNzb3JQcm92aWRlcjo6ZGJnUHJpbnRQb3J0SW5mbyhUcmFjZVBvaW50ICogYVRQKQoreworCit9CisKK3ZvaWQgSURlYnVnUHJvY2Vzc29yUHJvdmlkZXI6OmRiZ0NvbW1hbmRQb3J0cygKKwkJRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTkFUVVJFIG5hdHVyZSkKK3sKKwlBVk1fT1NfQ09VVCA8PCAiU2VsZWN0ZWQgcG9ydHMgOj4gIiA8PCBzdGQ6OmVuZGw7CisvLwltRGVidWdUcmFjZUZhY3RvcnktPnRvU3RyZWFtKEFWTV9PU19DT1VULCBtRGVidWdTZWxlY3RlZFBvcnRzKTsKKwlkYmdQb2ludEl0ID0gbURlYnVnU2VsZWN0ZWRQb3J0cy5iZWdpbigpOworCWRiZ1BvaW50SXRFbmQgPSBtRGVidWdTZWxlY3RlZFBvcnRzLmVuZCgpOworCWZvciggOyBkYmdQb2ludEl0ICE9IGRiZ1BvaW50SXRFbmQgOyArK2RiZ1BvaW50SXQgKQorCXsKKwkJc3dpdGNoKCBuYXR1cmUgKQorCQl7CisJCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX0NIQU5ORUxfTkFUVVJFOgorCQkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9NRVNTQUdFX05BVFVSRToKKwkJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfUE9SVF9OQVRVUkU6CisJCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1NJR05BTF9OQVRVUkU6CisJCQl7CisJCQkJaWYoICgqZGJnUG9pbnRJdCktPm5hdHVyZSA9PSBuYXR1cmUgKQorCQkJCXsKKwkJCQkJKCpkYmdQb2ludEl0KS0+dG9TdHJlYW0oQVZNX09TX0NPVVQpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9DT01fTkFUVVJFOgorCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQkoKmRiZ1BvaW50SXQpLT50b1N0cmVhbShBVk1fT1NfQ09VVCk7CisKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmKCBtRGVidWdTZWxlY3RlZENvbnRleHQgIT0gTlVMTCApCisJeworCQlBVk1fT1NfQ09VVCA8PCAiV2l0aCBzZWxlY3RlZCBDb250ZXh0IDo+ICI7CisJCW1EZWJ1Z1NlbGVjdGVkQ29udGV4dC0+ZGVidWdEZWZhdWx0KEFWTV9PU19DT1VUKTsKKworCQlkYmdQb2ludEl0ID0gbURlYnVnU2VsZWN0ZWRQb3J0cy5iZWdpbigpOworCQlkYmdQb2ludEl0RW5kID0gbURlYnVnU2VsZWN0ZWRQb3J0cy5lbmQoKTsKKwkJZm9yKCA7IGRiZ1BvaW50SXQgIT0gZGJnUG9pbnRJdEVuZCA7ICsrZGJnUG9pbnRJdCApCisJCXsKKwkJCXN3aXRjaCggbmF0dXJlICkKKwkJCXsKKwkJCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX0NIQU5ORUxfTkFUVVJFOgorCQkJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTUVTU0FHRV9OQVRVUkU6CisJCQkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9QT1JUX05BVFVSRToKKwkJCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1NJR05BTF9OQVRVUkU6CisJCQkJeworCQkJCQlpZiggKCpkYmdQb2ludEl0KS0+bmF0dXJlID09IG5hdHVyZSApCisJCQkJCXsKKwkJCQkJCWRiZ1ByaW50UG9ydEluZm8oICpkYmdQb2ludEl0ICk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9DT01fTkFUVVJFOgorCQkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlkYmdQcmludFBvcnRJbmZvKCAqZGJnUG9pbnRJdCApOworCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCUFWTV9PU19DT1VUIDw8IHN0ZDo6ZW5kbDsKK30KKworCit2b2lkIElEZWJ1Z1Byb2Nlc3NvclByb3ZpZGVyOjpkYmdDb21tYW5kQnVmZmVyKCkKK3sKKwlpZiggKGRiZ0NvbW1hbmRBcmcuZW1wdHkoKSAmJiAobURlYnVnU2VsZWN0ZWRCdWZmZXIgPT0gTlVMTCkpIHx8CisJCShkYmdDb21tYW5kQXJnID09ICI/IikgKQorCXsKKwkJQVZNX09TX0NPVVQgPDwgIkVudGVyIGEgYnVmZmVyIElEIDo+ICI7CisKKwkJc3RkOjpnZXRsaW5lKHN0ZDo6Y2luLCBkYmdDb21tYW5kQXJnKTsKKwkJU3RyaW5nVG9vbHM6Omx0cmltKCBkYmdDb21tYW5kQXJnICk7CisJfQorCWVsc2UKKwl7CisJCWlmKCBkYmdDb21tYW5kQXJnWzBdID09ICc/JyApCisJCXsKKwkJCWRiZ0NvbW1hbmRBcmcgPSBkYmdDb21tYW5kQXJnLnN1YnN0ciggMSApOworCQl9CisJfQorCisJaWYoIG5vdCBkYmdDb21tYW5kQXJnLmVtcHR5KCkgKQorCXsKKwkJZGJnVFAgPSBkYmdUcmFjZVBvaW50ID0gbmV3IFRyYWNlUG9pbnQoCisJCQkJRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfQlVGRkVSX05BVFVSRSwgQVZNX09QQ09ERV9OVUxMKTsKKworCQlpZiggZGJnVHJhY2VQb2ludC0+Y29uZmlndXJlVmFyaWFibGUobURlYnVnQ29uZmlndXJhdGlvbiwgZGJnQ29tbWFuZEFyZykgKQorCQl7CisJCQlpZiggbURlYnVnVHJhY2VTZXF1ZW5jZS5jb250YWluc1BvaW50KGRiZ1RyYWNlUG9pbnQsIGRiZ1RQKSApCisJCQl7CisJCQkJbURlYnVnU2VsZWN0ZWRCdWZmZXIgPSBkYmdUUC50b19wdHI8IFRyYWNlUG9pbnQgPigpOworCisJCQkJbURlYnVnU2VsZWN0ZWRCdWZmZXJzLmFkZF91bmlvbiggbURlYnVnU2VsZWN0ZWRCdWZmZXIgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlkYmdUcmFjZVBvaW50LT50cGlkID0gKysobURlYnVnVHJhY2VGYWN0b3J5LT5UUF9JRCk7CisKKwkJCQltRGVidWdUcmFjZVNlcXVlbmNlLnBvaW50cy5hcHBlbmQoIGRiZ1RQICk7CisKKwkJCQltRGVidWdTZWxlY3RlZEJ1ZmZlcnMuYXBwZW5kKAorCQkJCQkJbURlYnVnU2VsZWN0ZWRCdWZmZXIgPSBkYmdUcmFjZVBvaW50ICk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlBVk1fT1NfV0FSTiA8PCAiVW5mb3VuZCBidWZmZXIgPDwgIiA8PCBkYmdDb21tYW5kQXJnIDw8ICIgPj4gISIKKwkJCQkJPDwgc3RkOjplbmRsOworCQl9CisJfQorCisJaWYoIG1EZWJ1Z1NlbGVjdGVkQnVmZmVyICE9IE5VTEwgKQorCXsKKwkJQVZNX09TX0NPVVQgPDwgIlNlbGVjdGVkIGJ1ZmZlciA6PiAiOworCQltRGVidWdTZWxlY3RlZEJ1ZmZlci0+dG9TdHJlYW0oQVZNX09TX0NPVVQpOworCisJCWlmKCBtRGVidWdTZWxlY3RlZENvbnRleHQgIT0gTlVMTCApCisJCXsKKwkJCWRiZ0VDID0gbURlYnVnU2VsZWN0ZWRDb250ZXh0OworCQkJZG8KKwkJCXsKKwkJCQlBVk1fT1NfQ09VVCA8PCAiV2l0aCBzZWxlY3RlZCBDb250ZXh0IDo+ICI7CisJCQkJZGJnRUMtPnRyYWNlTWluaW11bShBVk1fT1NfQ09VVCk7CisKKwkJCQlkYmdQcmludEJ1ZmZlckluZm8oIG1EZWJ1Z1NlbGVjdGVkQnVmZmVyICk7CisJCQl9CisJCQl3aGlsZSggbURlYnVnVHJhY2VGdWxsUGF0aEZsYWcgJiYKKwkJCQkoKGRiZ0VDID0gZGJnRUMtPmdldFByZXZpb3VzKCkpICE9IE5VTEwpICk7CisJCX0KKworCX0KK30KKwordm9pZCBJRGVidWdQcm9jZXNzb3JQcm92aWRlcjo6ZGJnUHJpbnRCdWZmZXJJbmZvKFRyYWNlUG9pbnQgKiBhVFApCit7CisJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggZGJnRUMgKSA8PCAiRXhlY3V0aW9uIENvbnRleHQgISEhIgorCQkJPDwgU0VORF9FWElUOworCisJZGJnRUQgPSBkYmdFQy0+Z2V0QVBFeGVjdXRpb25EYXRhKCk7CisKKwlpZiggYVRQLT5SSUQuaW52YWxpZCgpICkKKwl7CisJCWFUUC0+UklEID0gZGJnRUQtPmdldFJ1bnRpbWVDb250YWluZXJSSUQoCisJCQkJYVRQLT5vYmplY3QtPnRvPCBJbnN0YW5jZU9mQnVmZmVyID4oKSApOworCX0KKworCWlmKCBhVFAtPlJJRC52YWxpZCgpICkKKwl7CisJCWRiZ1JGID0gZGJnRUQtPnB0clJ1bnRpbWUoIGFUUC0+UklEICk7CisKKwkJQVZNX09TX0NPVVQgPDwgIiA9PT4gYnVmZmVyICIgPDwgYVRQLT5vYmplY3QtPmdldE5hbWVJRCgpIDw8ICIgPSAiOworCQlkYmdSRi0+Z2V0QnVmZmVyKAorCQkJCWFUUC0+b2JqZWN0LT50bzwgSW5zdGFuY2VPZkJ1ZmZlciA+KCkgKS50b1N0cmVhbShBVk1fT1NfQ09VVCk7CisJCUFWTV9PU19DT1VUIDw8IHN0ZDo6ZW5kbDsKKwl9Cit9CisKK3ZvaWQgSURlYnVnUHJvY2Vzc29yUHJvdmlkZXI6OmRiZ0NvbW1hbmRCdWZmZXJzKCkKK3sKKwlBVk1fT1NfQ09VVCA8PCAiU2VsZWN0ZWQgYnVmZmVycyA6PiAiIDw8IHN0ZDo6ZW5kbDsKKwltRGVidWdUcmFjZUZhY3RvcnktPnRvU3RyZWFtKEFWTV9PU19DT1VULCBtRGVidWdTZWxlY3RlZEJ1ZmZlcnMpOworCisJaWYoIG1EZWJ1Z1NlbGVjdGVkQ29udGV4dCAhPSBOVUxMICkKKwl7CisJCUFWTV9PU19DT1VUIDw8ICJXaXRoIHNlbGVjdGVkIENvbnRleHQgOj4gIjsKKwkJbURlYnVnU2VsZWN0ZWRDb250ZXh0LT5kZWJ1Z0RlZmF1bHQoQVZNX09TX0NPVVQpOworCisJCWRiZ1BvaW50SXQgPSBtRGVidWdTZWxlY3RlZEJ1ZmZlcnMuYmVnaW4oKTsKKwkJZGJnUG9pbnRJdEVuZCA9IG1EZWJ1Z1NlbGVjdGVkQnVmZmVycy5lbmQoKTsKKwkJZm9yKCA7IGRiZ1BvaW50SXQgIT0gZGJnUG9pbnRJdEVuZCA7ICsrZGJnUG9pbnRJdCApCisJCXsKKwkJCWRiZ1ByaW50QnVmZmVySW5mbyggKmRiZ1BvaW50SXQgKTsKKwkJfQorCX0KKworCUFWTV9PU19DT1VUIDw8IHN0ZDo6ZW5kbDsKK30KKworCit2b2lkIElEZWJ1Z1Byb2Nlc3NvclByb3ZpZGVyOjpkYmdDb21tYW5kTWFjaGluZSgpCit7CisJaWYoIChkYmdDb21tYW5kQXJnLmVtcHR5KCkgJiYgKG1EZWJ1Z1NlbGVjdGVkTWFjaGluZSA9PSBOVUxMKSkgfHwKKwkJKGRiZ0NvbW1hbmRBcmcgPT0gIj8iKSApCisJeworCQlBVk1fT1NfQ09VVCA8PCAiRW50ZXIgYSBtYWNoaW5lIElEIDo+ICI7CisKKwkJc3RkOjpnZXRsaW5lKHN0ZDo6Y2luLCBkYmdDb21tYW5kQXJnKTsKKwkJU3RyaW5nVG9vbHM6Omx0cmltKCBkYmdDb21tYW5kQXJnICk7CisJfQorCWVsc2UKKwl7CisJCWlmKCBkYmdDb21tYW5kQXJnWzBdID09ICc/JyApCisJCXsKKwkJCWRiZ0NvbW1hbmRBcmcgPSBkYmdDb21tYW5kQXJnLnN1YnN0ciggMSApOworCQl9CisJfQorCisJaWYoIG5vdCBkYmdDb21tYW5kQXJnLmVtcHR5KCkgKQorCXsKKwkJZGJnVFAgPSBkYmdUcmFjZVBvaW50ID0gbmV3IFRyYWNlUG9pbnQoCisJCQkJRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTUFDSElORV9OQVRVUkUsIEFWTV9PUENPREVfUlVOKTsKKworCQlpZiggZGJnVHJhY2VQb2ludC0+Y29uZmlndXJlTWFjaGluZShtRGVidWdDb25maWd1cmF0aW9uLCBkYmdDb21tYW5kQXJnKSApCisJCXsKKwkJCWlmKCBtRGVidWdUcmFjZVNlcXVlbmNlLmNvbnRhaW5zUG9pbnQoZGJnVHJhY2VQb2ludCwgZGJnVFApICkKKwkJCXsKKwkJCQltRGVidWdTZWxlY3RlZE1hY2hpbmUgPSBkYmdUUC50b19wdHI8IFRyYWNlUG9pbnQgPigpOworCisJCQkJbURlYnVnU2VsZWN0ZWRNYWNoaW5lcy5hZGRfdW5pb24oIG1EZWJ1Z1NlbGVjdGVkTWFjaGluZSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWRiZ1RyYWNlUG9pbnQtPnRwaWQgPSArKyhtRGVidWdUcmFjZUZhY3RvcnktPlRQX0lEKTsKKworCQkJCW1EZWJ1Z1RyYWNlU2VxdWVuY2UucG9pbnRzLmFwcGVuZCggZGJnVFAgKTsKKworCQkJCW1EZWJ1Z1NlbGVjdGVkTWFjaGluZXMuYXBwZW5kKAorCQkJCQkJbURlYnVnU2VsZWN0ZWRNYWNoaW5lID0gZGJnVHJhY2VQb2ludCApOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJQVZNX09TX1dBUk4gPDwgIlVuZm91bmQgbWFjaGluZSA8PCAiIDw8IGRiZ0NvbW1hbmRBcmcgPDwgIiA+PiAhIgorCQkJCQk8PCBzdGQ6OmVuZGw7CisJCX0KKwl9CisKKwlpZiggbURlYnVnU2VsZWN0ZWRNYWNoaW5lICE9IE5VTEwgKQorCXsKKwkJQVZNX09TX0NPVVQgPDwgIlNlbGVjdGVkIG1hY2hpbmUgOj4gIjsKKwkJbURlYnVnU2VsZWN0ZWRNYWNoaW5lLT50b1N0cmVhbShBVk1fT1NfQ09VVCk7CisKKwkJaWYoIG1EZWJ1Z1NlbGVjdGVkQ29udGV4dCAhPSBOVUxMICkKKwkJeworCQkJQVZNX09TX0NPVVQgPDwgIldpdGggc2VsZWN0ZWQgQ29udGV4dCA6PiAiOworCQkJbURlYnVnU2VsZWN0ZWRDb250ZXh0LT5kZWJ1Z0RlZmF1bHQoQVZNX09TX0NPVVQpOworCisJCQlkYmdQcmludE1hY2hpbmVJbmZvKCBtRGVidWdTZWxlY3RlZE1hY2hpbmUgKTsKKwkJfQorCisJCUFWTV9PU19DT1VUIDw8IHN0ZDo6ZW5kbDsKKwl9Cit9CisKK3ZvaWQgSURlYnVnUHJvY2Vzc29yUHJvdmlkZXI6OmRiZ1ByaW50TWFjaGluZUluZm8oVHJhY2VQb2ludCAqIGFUUCkKK3sKKwlpZiggYVRQLT5SSUQuaW52YWxpZCgpICkKKwl7CisJCWFUUC0+UklEID0gbURlYnVnU2VsZWN0ZWRDb250ZXh0LT5yZWZFeGVjdXRpb25EYXRhKCkuCisJCQkJZ2V0UnVudGltZUlEKCBhVFAtPm9iamVjdC0+dG88IEluc3RhbmNlT2ZNYWNoaW5lID4oKSApOworCX0KKworCWlmKCBhVFAtPlJJRC52YWxpZCgpICkKKwl7CisJCWRiZ1JGID0gbURlYnVnU2VsZWN0ZWRDb250ZXh0LT5yZWZFeGVjdXRpb25EYXRhKCkucHRyUnVudGltZShhVFAtPlJJRCk7CisKKwkJZGJnUkYtPnRvU3RyZWFtKEFWTV9PU19DT1VUKTsKKwl9Cit9CisKK3ZvaWQgSURlYnVnUHJvY2Vzc29yUHJvdmlkZXI6OmRiZ0NvbW1hbmRNYWNoaW5lcygpCit7CisJQVZNX09TX0NPVVQgPDwgIlNlbGVjdGVkIG1hY2hpbmVzIDo+ICIgPDwgc3RkOjplbmRsOworCW1EZWJ1Z1RyYWNlRmFjdG9yeS0+dG9TdHJlYW0oQVZNX09TX0NPVVQsIG1EZWJ1Z1NlbGVjdGVkTWFjaGluZXMpOworCisJaWYoIG1EZWJ1Z1NlbGVjdGVkQ29udGV4dCAhPSBOVUxMICkKKwl7CisJCUFWTV9PU19DT1VUIDw8ICJXaXRoIHNlbGVjdGVkIENvbnRleHQgOj4gIjsKKwkJbURlYnVnU2VsZWN0ZWRDb250ZXh0LT5kZWJ1Z0RlZmF1bHQoQVZNX09TX0NPVVQpOworCisJCWRiZ1BvaW50SXQgPSBtRGVidWdTZWxlY3RlZE1hY2hpbmVzLmJlZ2luKCk7CisJCWRiZ1BvaW50SXRFbmQgPSBtRGVidWdTZWxlY3RlZE1hY2hpbmVzLmVuZCgpOworCQlmb3IoIDsgZGJnUG9pbnRJdCAhPSBkYmdQb2ludEl0RW5kIDsgKytkYmdQb2ludEl0ICkKKwkJeworCQkJZGJnUHJpbnRNYWNoaW5lSW5mbyggKmRiZ1BvaW50SXQgKTsKKwkJfQorCX0KKworCUFWTV9PU19DT1VUIDw8IHN0ZDo6ZW5kbDsKK30KKworCit2b2lkIElEZWJ1Z1Byb2Nlc3NvclByb3ZpZGVyOjpkYmdDb21tYW5kUGFyYW1ldGVyc01hY2hpbmUoKQoreworCUFWTV9PU19DT1VUIDw8ICJQYXJhbWV0ZXJzIG1hY2hpbmUgOj4gIjsKKwltRGVidWdQYXJhbWV0ZXJzTWFjaGluZS50b1N0cmVhbShBVk1fT1NfQ09VVCk7CisKKwlpZiggbURlYnVnU2VsZWN0ZWRDb250ZXh0ICE9IE5VTEwgKQorCXsKKwkJQVZNX09TX0NPVVQgPDwgIldpdGggc2VsZWN0ZWQgQ29udGV4dCA6PiAiOworCQltRGVidWdTZWxlY3RlZENvbnRleHQtPmRlYnVnRGVmYXVsdChBVk1fT1NfQ09VVCk7CisKKy8vCQlkYmdQcmludE1hY2hpbmVJbmZvKCAmIG1EZWJ1Z1BhcmFtZXRlcnNNYWNoaW5lICk7CisKKwkJaWYoIGRiZ0RldGFpbHNNYXggKQorCQl7CisJCQltRGVidWdTZWxlY3RlZENvbnRleHQtPnJlZkV4ZWN1dGlvbkRhdGEoKS4KKwkJCQkJZ2V0UGFyYW1ldGVyc1J1bnRpbWVGb3JtKCkudG9TdHJlYW0oQVZNX09TX0NPVVQpOworCQl9CisJCWVsc2UgaWYoIGRiZ0RldGFpbHNNZWQgKQorCQl7CisJCQltRGVidWdTZWxlY3RlZENvbnRleHQtPnJlZkV4ZWN1dGlvbkRhdGEoKS4KKwkJCQkJZ2V0UGFyYW1ldGVyc1J1bnRpbWVGb3JtKCkudG9TdHJlYW1EYXRhKAorCQkJCQkJbURlYnVnU2VsZWN0ZWRDb250ZXh0LT5nZXRFeGVjdXRpb25EYXRhKCksIEFWTV9PU19DT1VUKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW1EZWJ1Z1NlbGVjdGVkQ29udGV4dC0+cmVmRXhlY3V0aW9uRGF0YSgpLgorCQkJCQlnZXRQYXJhbWV0ZXJzUnVudGltZUZvcm0oKS50b0ZzY25EYXRhKEFWTV9PU19DT1VULAorCQkJCQkJCW1EZWJ1Z1NlbGVjdGVkQ29udGV4dC0+Z2V0RXhlY3V0aW9uRGF0YSgpLCBOVUxMKTsKKwkJfQorCX0KKworCUFWTV9PU19DT1VUIDw8IHN0ZDo6ZW5kbDsKK30KKworCit2b2lkIElEZWJ1Z1Byb2Nlc3NvclByb3ZpZGVyOjpkYmdDb21tYW5kU3RhdGUoKQoreworCWlmKCAoZGJnQ29tbWFuZEFyZy5lbXB0eSgpICYmIChtRGVidWdTZWxlY3RlZFN0YXRlID09IE5VTEwpKSB8fAorCQkoZGJnQ29tbWFuZEFyZyA9PSAiPyIpICkKKwl7CisJCUFWTV9PU19DT1VUIDw8ICJFbnRlciBhIHN0YXRlIElEIDo+ICI7CisKKwkJc3RkOjpnZXRsaW5lKHN0ZDo6Y2luLCBkYmdDb21tYW5kQXJnKTsKKwkJU3RyaW5nVG9vbHM6Omx0cmltKCBkYmdDb21tYW5kQXJnICk7CisJfQorCWVsc2UKKwl7CisJCWlmKCBkYmdDb21tYW5kQXJnWzBdID09ICc/JyApCisJCXsKKwkJCWRiZ0NvbW1hbmRBcmcgPSBkYmdDb21tYW5kQXJnLnN1YnN0ciggMSApOworCQl9CisJfQorCisJaWYoIG5vdCBkYmdDb21tYW5kQXJnLmVtcHR5KCkgKQorCXsKKwkJZGJnVFAgPSBkYmdUcmFjZVBvaW50ID0gbmV3IFRyYWNlUG9pbnQoCisJCQkJRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfU1RBVEVfTkFUVVJFLCBBVk1fT1BDT0RFX1JVTik7CisKKwkJaWYoIGRiZ1RyYWNlUG9pbnQtPmNvbmZpZ3VyZU1hY2hpbmUobURlYnVnQ29uZmlndXJhdGlvbiwgZGJnQ29tbWFuZEFyZykgKQorCQl7CisJCQlpZiggbURlYnVnVHJhY2VTZXF1ZW5jZS5jb250YWluc1BvaW50KGRiZ1RyYWNlUG9pbnQsIGRiZ1RQKSApCisJCQl7CisJCQkJbURlYnVnU2VsZWN0ZWRTdGF0ZSA9IGRiZ1RQLnRvX3B0cjwgVHJhY2VQb2ludCA+KCk7CisKKwkJCQltRGVidWdTZWxlY3RlZFN0YXRlcy5hZGRfdW5pb24oIG1EZWJ1Z1NlbGVjdGVkU3RhdGUgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlkYmdUcmFjZVBvaW50LT50cGlkID0gKysobURlYnVnVHJhY2VGYWN0b3J5LT5UUF9JRCk7CisKKwkJCQltRGVidWdUcmFjZVNlcXVlbmNlLnBvaW50cy5hcHBlbmQoIGRiZ1RQICk7CisKKwkJCQltRGVidWdTZWxlY3RlZFN0YXRlcy5hcHBlbmQoCisJCQkJCQltRGVidWdTZWxlY3RlZFN0YXRlID0gZGJnVHJhY2VQb2ludCApOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJQVZNX09TX1dBUk4gPDwgIlVuZm91bmQgc3RhdGUgPDwgIiA8PCBkYmdDb21tYW5kQXJnIDw8ICIgPj4gISIKKwkJCQkJPDwgc3RkOjplbmRsOworCQl9CisJfQorCisJaWYoIG1EZWJ1Z1NlbGVjdGVkU3RhdGUgIT0gTlVMTCApCisJeworCQlBVk1fT1NfQ09VVCA8PCAiU2VsZWN0ZWQgc3RhdGUgOj4gIjsKKwkJbURlYnVnU2VsZWN0ZWRTdGF0ZS0+dG9TdHJlYW0oQVZNX09TX0NPVVQpOworCisJCWlmKCBtRGVidWdTZWxlY3RlZENvbnRleHQgIT0gTlVMTCApCisJCXsKKwkJCUFWTV9PU19DT1VUIDw8ICJXaXRoIHNlbGVjdGVkIENvbnRleHQgOj4gIjsKKwkJCW1EZWJ1Z1NlbGVjdGVkQ29udGV4dC0+ZGVidWdEZWZhdWx0KEFWTV9PU19DT1VUKTsKKworCQkJZGJnUHJpbnRTdGF0ZUluZm8oIG1EZWJ1Z1NlbGVjdGVkU3RhdGUgKTsKKwkJfQorCisJCUFWTV9PU19DT1VUIDw8IHN0ZDo6ZW5kbDsKKwl9Cit9CisKK3ZvaWQgSURlYnVnUHJvY2Vzc29yUHJvdmlkZXI6OmRiZ1ByaW50U3RhdGVJbmZvKFRyYWNlUG9pbnQgKiBhVFApCit7CisJZGJnUHJpbnRNYWNoaW5lSW5mbyggYVRQICk7Cit9CisKK3ZvaWQgSURlYnVnUHJvY2Vzc29yUHJvdmlkZXI6OmRiZ0NvbW1hbmRTdGF0ZXMoKQoreworCUFWTV9PU19DT1VUIDw8ICJTZWxlY3RlZCBzdGF0ZXMgOj4gIiA8PCBzdGQ6OmVuZGw7CisJbURlYnVnVHJhY2VGYWN0b3J5LT50b1N0cmVhbShBVk1fT1NfQ09VVCwgbURlYnVnU2VsZWN0ZWRTdGF0ZXMpOworCisJaWYoIG1EZWJ1Z1NlbGVjdGVkQ29udGV4dCAhPSBOVUxMICkKKwl7CisJCUFWTV9PU19DT1VUIDw8ICJXaXRoIHNlbGVjdGVkIENvbnRleHQgOj4gIjsKKwkJbURlYnVnU2VsZWN0ZWRDb250ZXh0LT5kZWJ1Z0RlZmF1bHQoQVZNX09TX0NPVVQpOworCisJCWRiZ1BvaW50SXQgPSBtRGVidWdTZWxlY3RlZFN0YXRlcy5iZWdpbigpOworCQlkYmdQb2ludEl0RW5kID0gbURlYnVnU2VsZWN0ZWRTdGF0ZXMuZW5kKCk7CisJCWZvciggOyBkYmdQb2ludEl0ICE9IGRiZ1BvaW50SXRFbmQgOyArK2RiZ1BvaW50SXQgKQorCQl7CisJCQlkYmdQcmludFN0YXRlSW5mbyggKmRiZ1BvaW50SXQgKTsKKwkJfQorCX0KKworCUFWTV9PU19DT1VUIDw8IHN0ZDo6ZW5kbDsKK30KKworCit2b2lkIElEZWJ1Z1Byb2Nlc3NvclByb3ZpZGVyOjpkYmdDb21tYW5kU3RhdGVtYWNoaW5lKCkKK3sKKwlpZiggKGRiZ0NvbW1hbmRBcmcuZW1wdHkoKSAmJiAobURlYnVnU2VsZWN0ZWRTdGF0ZW1hY2hpbmUgPT0gTlVMTCkpIHx8CisJCShkYmdDb21tYW5kQXJnID09ICI/IikgKQorCXsKKwkJQVZNX09TX0NPVVQgPDwgIkVudGVyIGEgc3RhdGVtYWNoaW5lIElEIDo+ICI7CisKKwkJc3RkOjpnZXRsaW5lKHN0ZDo6Y2luLCBkYmdDb21tYW5kQXJnKTsKKwkJU3RyaW5nVG9vbHM6Omx0cmltKCBkYmdDb21tYW5kQXJnICk7CisJfQorCWVsc2UKKwl7CisJCWlmKCBkYmdDb21tYW5kQXJnWzBdID09ICc/JyApCisJCXsKKwkJCWRiZ0NvbW1hbmRBcmcgPSBkYmdDb21tYW5kQXJnLnN1YnN0ciggMSApOworCQl9CisJfQorCisJaWYoIG5vdCBkYmdDb21tYW5kQXJnLmVtcHR5KCkgKQorCXsKKwkJZGJnVFAgPSBkYmdUcmFjZVBvaW50ID0gbmV3IFRyYWNlUG9pbnQoCisJCQkJRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfU1RBVEVNQUNISU5FX05BVFVSRSwgQVZNX09QQ09ERV9SVU4pOworCisJCWlmKCBkYmdUcmFjZVBvaW50LT5jb25maWd1cmVNYWNoaW5lKG1EZWJ1Z0NvbmZpZ3VyYXRpb24sIGRiZ0NvbW1hbmRBcmcpICkKKwkJeworCQkJaWYoIG1EZWJ1Z1RyYWNlU2VxdWVuY2UuY29udGFpbnNQb2ludChkYmdUcmFjZVBvaW50LCBkYmdUUCkgKQorCQkJeworCQkJCW1EZWJ1Z1NlbGVjdGVkU3RhdGVtYWNoaW5lID0gZGJnVFAudG9fcHRyPCBUcmFjZVBvaW50ID4oKTsKKworCQkJCW1EZWJ1Z1NlbGVjdGVkU3RhdGVtYWNoaW5lcy5hZGRfdW5pb24oIG1EZWJ1Z1NlbGVjdGVkU3RhdGVtYWNoaW5lICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJZGJnVHJhY2VQb2ludC0+dHBpZCA9ICsrKG1EZWJ1Z1RyYWNlRmFjdG9yeS0+VFBfSUQpOworCisJCQkJbURlYnVnVHJhY2VTZXF1ZW5jZS5wb2ludHMuYXBwZW5kKCBkYmdUUCApOworCisJCQkJbURlYnVnU2VsZWN0ZWRTdGF0ZW1hY2hpbmVzLmFwcGVuZCgKKwkJCQkJCW1EZWJ1Z1NlbGVjdGVkU3RhdGVtYWNoaW5lID0gZGJnVHJhY2VQb2ludCApOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJQVZNX09TX1dBUk4gPDwgIlVuZm91bmQgc3RhdGVtYWNoaW5lIDw8ICIgPDwgZGJnQ29tbWFuZEFyZyA8PCAiID4+ICEiCisJCQkJCTw8IHN0ZDo6ZW5kbDsKKwkJfQorCX0KKworCWlmKCBtRGVidWdTZWxlY3RlZFN0YXRlbWFjaGluZSAhPSBOVUxMICkKKwl7CisJCUFWTV9PU19DT1VUIDw8ICJTZWxlY3RlZCBzdGF0ZW1hY2hpbmUgOj4gIjsKKwkJbURlYnVnU2VsZWN0ZWRTdGF0ZW1hY2hpbmUtPnRvU3RyZWFtKEFWTV9PU19DT1VUKTsKKworCQlpZiggbURlYnVnU2VsZWN0ZWRDb250ZXh0ICE9IE5VTEwgKQorCQl7CisJCQlBVk1fT1NfQ09VVCA8PCAiV2l0aCBzZWxlY3RlZCBDb250ZXh0IDo+ICI7CisJCQltRGVidWdTZWxlY3RlZENvbnRleHQtPmRlYnVnRGVmYXVsdChBVk1fT1NfQ09VVCk7CisKKwkJCWRiZ1ByaW50U3RhdGVtYWNoaW5lSW5mbyggbURlYnVnU2VsZWN0ZWRTdGF0ZW1hY2hpbmUgKTsKKwkJfQorCisJCUFWTV9PU19DT1VUIDw8IHN0ZDo6ZW5kbDsKKwl9Cit9CisKK3ZvaWQgSURlYnVnUHJvY2Vzc29yUHJvdmlkZXI6OmRiZ1ByaW50U3RhdGVtYWNoaW5lSW5mbyhUcmFjZVBvaW50ICogYVRQKQoreworCWRiZ1ByaW50TWFjaGluZUluZm8oIGFUUCApOworfQorCit2b2lkIElEZWJ1Z1Byb2Nlc3NvclByb3ZpZGVyOjpkYmdDb21tYW5kU3RhdGVtYWNoaW5lcygpCit7CisJQVZNX09TX0NPVVQgPDwgIlNlbGVjdGVkIHN0YXRlbWFjaGluZXMgOj4gIiA8PCBzdGQ6OmVuZGw7CisJbURlYnVnVHJhY2VGYWN0b3J5LT50b1N0cmVhbShBVk1fT1NfQ09VVCwgbURlYnVnU2VsZWN0ZWRTdGF0ZW1hY2hpbmVzKTsKKworCWlmKCBtRGVidWdTZWxlY3RlZENvbnRleHQgIT0gTlVMTCApCisJeworCQlBVk1fT1NfQ09VVCA8PCAiV2l0aCBzZWxlY3RlZCBDb250ZXh0IDo+ICI7CisJCW1EZWJ1Z1NlbGVjdGVkQ29udGV4dC0+ZGVidWdEZWZhdWx0KEFWTV9PU19DT1VUKTsKKworCQlkYmdQb2ludEl0ID0gbURlYnVnU2VsZWN0ZWRTdGF0ZW1hY2hpbmVzLmJlZ2luKCk7CisJCWRiZ1BvaW50SXRFbmQgPSBtRGVidWdTZWxlY3RlZFN0YXRlbWFjaGluZXMuZW5kKCk7CisJCWZvciggOyBkYmdQb2ludEl0ICE9IGRiZ1BvaW50SXRFbmQgOyArK2RiZ1BvaW50SXQgKQorCQl7CisJCQlkYmdQcmludFN0YXRlbWFjaGluZUluZm8oICpkYmdQb2ludEl0ICk7CisJCX0KKwl9CisKKwlBVk1fT1NfQ09VVCA8PCBzdGQ6OmVuZGw7Cit9CisKKwordm9pZCBJRGVidWdQcm9jZXNzb3JQcm92aWRlcjo6ZGJnQ29tbWFuZFRyYW5zaXRpb24oKQoreworCWlmKCAoZGJnQ29tbWFuZEFyZy5lbXB0eSgpICYmIChtRGVidWdTZWxlY3RlZFRyYW5zaXRpb24gPT0gTlVMTCkpIHx8CisJCShkYmdDb21tYW5kQXJnID09ICI/IikgKQorCXsKKwkJQVZNX09TX0NPVVQgPDwgIkVudGVyIGEgdHJhbnNpdGlvbiBJRCA6PiAiOworCisJCXN0ZDo6Z2V0bGluZShzdGQ6OmNpbiwgZGJnQ29tbWFuZEFyZyk7CisJCVN0cmluZ1Rvb2xzOjpsdHJpbSggZGJnQ29tbWFuZEFyZyApOworCX0KKwllbHNlCisJeworCQlpZiggZGJnQ29tbWFuZEFyZ1swXSA9PSAnPycgKQorCQl7CisJCQlkYmdDb21tYW5kQXJnID0gZGJnQ29tbWFuZEFyZy5zdWJzdHIoIDEgKTsKKwkJfQorCX0KKworCWlmKCBub3QgZGJnQ29tbWFuZEFyZy5lbXB0eSgpICkKKwl7CisJCWRiZ1RQID0gZGJnVHJhY2VQb2ludCA9IG5ldyBUcmFjZVBvaW50KAorCQkJCUVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1RSQU5TSVRJT05fTkFUVVJFLAorCQkJCUFWTV9PUENPREVfSU5WT0tFX1RSQU5TSVRJT04pOworCisJCWlmKCBkYmdUcmFjZVBvaW50LT5jb25maWd1cmVUcmFuc2l0aW9uKG1EZWJ1Z0NvbmZpZ3VyYXRpb24sIGRiZ0NvbW1hbmRBcmcpICkKKwkJeworCQkJaWYoIG1EZWJ1Z1RyYWNlU2VxdWVuY2UuY29udGFpbnNQb2ludChkYmdUcmFjZVBvaW50LCBkYmdUUCkgKQorCQkJeworCQkJCW1EZWJ1Z1NlbGVjdGVkVHJhbnNpdGlvbiA9IGRiZ1RQLnRvX3B0cjwgVHJhY2VQb2ludCA+KCk7CisKKwkJCQltRGVidWdTZWxlY3RlZFRyYW5zaXRpb25zLmFkZF91bmlvbiggbURlYnVnU2VsZWN0ZWRUcmFuc2l0aW9uICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJZGJnVHJhY2VQb2ludC0+dHBpZCA9ICsrKG1EZWJ1Z1RyYWNlRmFjdG9yeS0+VFBfSUQpOworCisJCQkJbURlYnVnVHJhY2VTZXF1ZW5jZS5wb2ludHMuYXBwZW5kKCBkYmdUUCApOworCisJCQkJbURlYnVnU2VsZWN0ZWRUcmFuc2l0aW9ucy5hcHBlbmQoCisJCQkJCQltRGVidWdTZWxlY3RlZFRyYW5zaXRpb24gPSBkYmdUcmFjZVBvaW50ICk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlBVk1fT1NfV0FSTiA8PCAiVW5mb3VuZCB0cmFuc2l0aW9uIDw8ICIgPDwgZGJnQ29tbWFuZEFyZyA8PCAiID4+ICEiCisJCQkJCTw8IHN0ZDo6ZW5kbDsKKwkJfQorCX0KKworCWlmKCBtRGVidWdTZWxlY3RlZFRyYW5zaXRpb24gIT0gTlVMTCApCisJeworCQlBVk1fT1NfQ09VVCA8PCAiU2VsZWN0ZWQgdHJhbnNpdGlvbiA6PiAiOworCQltRGVidWdTZWxlY3RlZFRyYW5zaXRpb24tPnRvU3RyZWFtKEFWTV9PU19DT1VUKTsKKworCQlpZiggbURlYnVnU2VsZWN0ZWRDb250ZXh0ICE9IE5VTEwgKQorCQl7CisJCQlBVk1fT1NfQ09VVCA8PCAiV2l0aCBzZWxlY3RlZCBDb250ZXh0IDo+ICI7CisJCQltRGVidWdTZWxlY3RlZENvbnRleHQtPmRlYnVnRGVmYXVsdChBVk1fT1NfQ09VVCk7CisKKwkJCWRiZ1ByaW50VHJhbnNpdGlvbkluZm8oIG1EZWJ1Z1NlbGVjdGVkVHJhbnNpdGlvbiApOworCQl9CisKKwkJQVZNX09TX0NPVVQgPDwgc3RkOjplbmRsOworCX0KK30KKwordm9pZCBJRGVidWdQcm9jZXNzb3JQcm92aWRlcjo6ZGJnUHJpbnRUcmFuc2l0aW9uSW5mbyhUcmFjZVBvaW50ICogYVRQKQoreworCUF2bVRyYW5zaXRpb24gKiBhVHJhbnNpdGlvbiA9IGFUUC0+b2JqZWN0LT50bzwgQXZtVHJhbnNpdGlvbiA+KCk7CisKKwlpZiggZGJnRGV0YWlsc01heCAmJiAobURlYnVnU2VsZWN0ZWRDb250ZXh0ICE9IE5VTEwpICkKKwl7CisJCUFWTV9PU19DT1VUIDw8IEFWTV9UQUJfSU5ERU5UOworCisJCWFUcmFuc2l0aW9uLT50b1N0cmVhbUhlYWRlcihBVk1fT1NfQ09VVCk7CisJCWlmKCBhVHJhbnNpdGlvbi0+aGFzSW50ZXJuYWxDb21tdW5pY2F0aW9uQ29kZSgpICkKKwkJeworCQkJQVZNX09TX0NPVVQgPDwgIiAiOworCQkJQmFzZUNvbXBpbGVkRm9ybTo6dG9TdHJlYW1TdGF0aWNDb20oQVZNX09TX0NPVVQsCisJCQkJCWFUcmFuc2l0aW9uLT5nZXRJbnRlcm5hbENvbW11bmljYXRpb25Db2RlKCkpOworCQl9CisJCUFWTV9PU19DT1VUIDw8IHN0ZDo6ZW5kbDsKKwl9CisKKwllbHNlIGlmKCBkYmdEZXRhaWxzTWVkICkKKwl7CisJCWFUUC0+b2JqZWN0LT50b1N0cmVhbShBVk1fT1NfQ09VVCk7CisJfQorCWVsc2UKKwl7CisJCWFUcmFuc2l0aW9uLT50b1N0cmVhbUhlYWRlcihBVk1fT1NfQ09VVCk7CisJCUFWTV9PU19DT1VUIDw8IHN0ZDo6ZW5kbDsKKwl9Cit9CisKK3ZvaWQgSURlYnVnUHJvY2Vzc29yUHJvdmlkZXI6OmRiZ0NvbW1hbmRUcmFuc2l0aW9ucygpCit7CisJQVZNX09TX0NPVVQgPDwgIlNlbGVjdGVkIHRyYW5zaXRpb25zIDo+ICIgPDwgc3RkOjplbmRsOworCW1EZWJ1Z1RyYWNlRmFjdG9yeS0+dG9TdHJlYW0oQVZNX09TX0NPVVQsIG1EZWJ1Z1NlbGVjdGVkVHJhbnNpdGlvbnMpOworCisJaWYoIG1EZWJ1Z1NlbGVjdGVkQ29udGV4dCAhPSBOVUxMICkKKwl7CisJCUFWTV9PU19DT1VUIDw8ICJXaXRoIHNlbGVjdGVkIENvbnRleHQgOj4gIjsKKwkJbURlYnVnU2VsZWN0ZWRDb250ZXh0LT5kZWJ1Z0RlZmF1bHQoQVZNX09TX0NPVVQpOworCisJCWRiZ1BvaW50SXQgPSBtRGVidWdTZWxlY3RlZFRyYW5zaXRpb25zLmJlZ2luKCk7CisJCWRiZ1BvaW50SXRFbmQgPSBtRGVidWdTZWxlY3RlZFRyYW5zaXRpb25zLmVuZCgpOworCQlmb3IoIDsgZGJnUG9pbnRJdCAhPSBkYmdQb2ludEl0RW5kIDsgKytkYmdQb2ludEl0ICkKKwkJeworCQkJZGJnUHJpbnRUcmFuc2l0aW9uSW5mbyggKmRiZ1BvaW50SXQgKTsKKwkJfQorCX0KKworCUFWTV9PU19DT1VUIDw8IHN0ZDo6ZW5kbDsKK30KKworCit2b2lkIElEZWJ1Z1Byb2Nlc3NvclByb3ZpZGVyOjpkYmdDb21tYW5kUm91dGluZSgpCit7CisJaWYoIChkYmdDb21tYW5kQXJnLmVtcHR5KCkgJiYgKG1EZWJ1Z1NlbGVjdGVkUm91dGluZSA9PSBOVUxMKSkgfHwKKwkJKGRiZ0NvbW1hbmRBcmcgPT0gIj8iKSApCisJeworCQlBVk1fT1NfQ09VVCA8PCAiRW50ZXIgYSByb3V0aW5lIElEIDo+ICI7CisKKwkJc3RkOjpnZXRsaW5lKHN0ZDo6Y2luLCBkYmdDb21tYW5kQXJnKTsKKwkJU3RyaW5nVG9vbHM6Omx0cmltKCBkYmdDb21tYW5kQXJnICk7CisJfQorCWVsc2UKKwl7CisJCWlmKCBkYmdDb21tYW5kQXJnWzBdID09ICc/JyApCisJCXsKKwkJCWRiZ0NvbW1hbmRBcmcgPSBkYmdDb21tYW5kQXJnLnN1YnN0ciggMSApOworCQl9CisJfQorCisJaWYoIG5vdCBkYmdDb21tYW5kQXJnLmVtcHR5KCkgKQorCXsKKwkJZGJnVFAgPSBkYmdUcmFjZVBvaW50ID0gbmV3IFRyYWNlUG9pbnQoCisJCQkJRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfUk9VVElORV9OQVRVUkUsIEFWTV9PUENPREVfTlVMTCk7CisKKwkJaWYoIGRiZ1RyYWNlUG9pbnQtPmNvbmZpZ3VyZVJvdXRpbmUobURlYnVnQ29uZmlndXJhdGlvbiwgZGJnQ29tbWFuZEFyZykgKQorCQl7CisJCQlpZiggbURlYnVnVHJhY2VTZXF1ZW5jZS5jb250YWluc1BvaW50KGRiZ1RyYWNlUG9pbnQsIGRiZ1RQKSApCisJCQl7CisJCQkJbURlYnVnU2VsZWN0ZWRSb3V0aW5lID0gZGJnVFAudG9fcHRyPCBUcmFjZVBvaW50ID4oKTsKKworCQkJCW1EZWJ1Z1NlbGVjdGVkUm91dGluZXMuYWRkX3VuaW9uKCBtRGVidWdTZWxlY3RlZFJvdXRpbmUgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlkYmdUcmFjZVBvaW50LT50cGlkID0gKysobURlYnVnVHJhY2VGYWN0b3J5LT5UUF9JRCk7CisKKwkJCQltRGVidWdUcmFjZVNlcXVlbmNlLnBvaW50cy5hcHBlbmQoIGRiZ1RQICk7CisKKwkJCQltRGVidWdTZWxlY3RlZFJvdXRpbmVzLmFwcGVuZCgKKwkJCQkJCW1EZWJ1Z1NlbGVjdGVkUm91dGluZSA9IGRiZ1RyYWNlUG9pbnQgKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCUFWTV9PU19XQVJOIDw8ICJVbmZvdW5kIHJvdXRpbmUgPDwgIiA8PCBkYmdDb21tYW5kQXJnIDw8ICIgPj4gISIKKwkJCQkJPDwgc3RkOjplbmRsOworCQl9CisJfQorCisJaWYoIG1EZWJ1Z1NlbGVjdGVkUm91dGluZSAhPSBOVUxMICkKKwl7CisJCUFWTV9PU19DT1VUIDw8ICJTZWxlY3RlZCByb3V0aW5lIDo+ICI7CisJCW1EZWJ1Z1NlbGVjdGVkUm91dGluZS0+dG9TdHJlYW0oQVZNX09TX0NPVVQpOworCisJCWlmKCBtRGVidWdTZWxlY3RlZENvbnRleHQgIT0gTlVMTCApCisJCXsKKwkJCUFWTV9PU19DT1VUIDw8ICJXaXRoIHNlbGVjdGVkIENvbnRleHQgOj4gIjsKKwkJCW1EZWJ1Z1NlbGVjdGVkQ29udGV4dC0+ZGVidWdEZWZhdWx0KEFWTV9PU19DT1VUKTsKKworCQkJZGJnUHJpbnRSb3V0aW5lSW5mbyggbURlYnVnU2VsZWN0ZWRSb3V0aW5lICk7CisJCX0KKworCX0KK30KKwordm9pZCBJRGVidWdQcm9jZXNzb3JQcm92aWRlcjo6ZGJnUHJpbnRSb3V0aW5lSW5mbyhUcmFjZVBvaW50ICogYVRQKQoreworCit9CisKK3ZvaWQgSURlYnVnUHJvY2Vzc29yUHJvdmlkZXI6OmRiZ0NvbW1hbmRSb3V0aW5lcygpCit7CisJQVZNX09TX0NPVVQgPDwgIlNlbGVjdGVkIHJvdXRpbmVzIDo+ICIgPDwgc3RkOjplbmRsOworCW1EZWJ1Z1RyYWNlRmFjdG9yeS0+dG9TdHJlYW0oQVZNX09TX0NPVVQsIG1EZWJ1Z1NlbGVjdGVkUm91dGluZXMpOworCisJaWYoIG1EZWJ1Z1NlbGVjdGVkQ29udGV4dCAhPSBOVUxMICkKKwl7CisJCUFWTV9PU19DT1VUIDw8ICJXaXRoIHNlbGVjdGVkIENvbnRleHQgOj4gIjsKKwkJbURlYnVnU2VsZWN0ZWRDb250ZXh0LT5kZWJ1Z0RlZmF1bHQoQVZNX09TX0NPVVQpOworCisJCWRiZ1BvaW50SXQgPSBtRGVidWdTZWxlY3RlZFJvdXRpbmVzLmJlZ2luKCk7CisJCWRiZ1BvaW50SXRFbmQgPSBtRGVidWdTZWxlY3RlZFJvdXRpbmVzLmVuZCgpOworCQlmb3IoIDsgZGJnUG9pbnRJdCAhPSBkYmdQb2ludEl0RW5kIDsgKytkYmdQb2ludEl0ICkKKwkJeworCQkJZGJnUHJpbnRSb3V0aW5lSW5mbyggKmRiZ1BvaW50SXQgKTsKKwkJfQorCX0KKworCUFWTV9PU19DT1VUIDw8IHN0ZDo6ZW5kbDsKK30KKworCit2b2lkIElEZWJ1Z1Byb2Nlc3NvclByb3ZpZGVyOjpkYmdDb21tYW5kUnVubmFibGUoKQoreworCWlmKCAoZGJnQ29tbWFuZEFyZy5lbXB0eSgpICYmIChtRGVidWdTZWxlY3RlZFJ1bm5hYmxlID09IE5VTEwpKSB8fAorCQkoZGJnQ29tbWFuZEFyZyA9PSAiPyIpICkKKwl7CisJCUFWTV9PU19DT1VUIDw8ICJFbnRlciBhIHJ1bm5hYmxlIElEIDo+ICI7CisKKwkJc3RkOjpnZXRsaW5lKHN0ZDo6Y2luLCBkYmdDb21tYW5kQXJnKTsKKwkJU3RyaW5nVG9vbHM6Omx0cmltKCBkYmdDb21tYW5kQXJnICk7CisJfQorCWVsc2UKKwl7CisJCWlmKCBkYmdDb21tYW5kQXJnWzBdID09ICc/JyApCisJCXsKKwkJCWRiZ0NvbW1hbmRBcmcgPSBkYmdDb21tYW5kQXJnLnN1YnN0ciggMSApOworCQl9CisJfQorCisJaWYoIG5vdCBkYmdDb21tYW5kQXJnLmVtcHR5KCkgKQorCXsKKwkJZGJnVFAgPSBkYmdUcmFjZVBvaW50ID0gbmV3IFRyYWNlUG9pbnQoCisJCQkJRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfUlVOTkFCTEVfTkFUVVJFLCBBVk1fT1BDT0RFX05VTEwpOworCisJCWlmKCBkYmdUcmFjZVBvaW50LT5jb25maWd1cmVSdW5uYWJsZShtRGVidWdDb25maWd1cmF0aW9uLCBkYmdDb21tYW5kQXJnKSApCisJCXsKKwkJCWlmKCBtRGVidWdUcmFjZVNlcXVlbmNlLmNvbnRhaW5zUG9pbnQoZGJnVHJhY2VQb2ludCwgZGJnVFApICkKKwkJCXsKKwkJCQltRGVidWdTZWxlY3RlZFJ1bm5hYmxlID0gZGJnVFAudG9fcHRyPCBUcmFjZVBvaW50ID4oKTsKKworCQkJCW1EZWJ1Z1NlbGVjdGVkUnVubmFibGVzLmFkZF91bmlvbiggbURlYnVnU2VsZWN0ZWRSdW5uYWJsZSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWRiZ1RyYWNlUG9pbnQtPnRwaWQgPSArKyhtRGVidWdUcmFjZUZhY3RvcnktPlRQX0lEKTsKKworCQkJCW1EZWJ1Z1RyYWNlU2VxdWVuY2UucG9pbnRzLmFwcGVuZCggZGJnVFAgKTsKKworCQkJCW1EZWJ1Z1NlbGVjdGVkUnVubmFibGVzLmFwcGVuZCgKKwkJCQkJCW1EZWJ1Z1NlbGVjdGVkUnVubmFibGUgPSBkYmdUcmFjZVBvaW50ICk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlBVk1fT1NfV0FSTiA8PCAiVW5mb3VuZCBydW5uYWJsZSA8PCAiIDw8IGRiZ0NvbW1hbmRBcmcgPDwgIiA+PiAhIgorCQkJCQk8PCBzdGQ6OmVuZGw7CisJCX0KKwl9CisKKwlpZiggbURlYnVnU2VsZWN0ZWRSdW5uYWJsZSAhPSBOVUxMICkKKwl7CisJCUFWTV9PU19DT1VUIDw8ICJTZWxlY3RlZCBydW5uYWJsZSA6PiAiOworCQltRGVidWdTZWxlY3RlZFJ1bm5hYmxlLT50b1N0cmVhbShBVk1fT1NfQ09VVCk7CisKKwkJaWYoIG1EZWJ1Z1NlbGVjdGVkQ29udGV4dCAhPSBOVUxMICkKKwkJeworCQkJQVZNX09TX0NPVVQgPDwgIldpdGggc2VsZWN0ZWQgQ29udGV4dCA6PiAiOworCQkJbURlYnVnU2VsZWN0ZWRDb250ZXh0LT5kZWJ1Z0RlZmF1bHQoQVZNX09TX0NPVVQpOworCisJCQlkYmdQcmludFJ1bm5hYmxlSW5mbyggbURlYnVnU2VsZWN0ZWRSdW5uYWJsZSApOworCQl9CisKKwl9Cit9CisKK3ZvaWQgSURlYnVnUHJvY2Vzc29yUHJvdmlkZXI6OmRiZ1ByaW50UnVubmFibGVJbmZvKFRyYWNlUG9pbnQgKiBhVFApCit7CisKK30KKwordm9pZCBJRGVidWdQcm9jZXNzb3JQcm92aWRlcjo6ZGJnQ29tbWFuZFJ1bm5hYmxlcygpCit7CisJQVZNX09TX0NPVVQgPDwgIlNlbGVjdGVkIHJ1bm5hYmxlcyA6PiAiIDw8IHN0ZDo6ZW5kbDsKKwltRGVidWdUcmFjZUZhY3RvcnktPnRvU3RyZWFtKEFWTV9PU19DT1VULCBtRGVidWdTZWxlY3RlZFJ1bm5hYmxlcyk7CisKKwlpZiggbURlYnVnU2VsZWN0ZWRDb250ZXh0ICE9IE5VTEwgKQorCXsKKwkJQVZNX09TX0NPVVQgPDwgIldpdGggc2VsZWN0ZWQgQ29udGV4dCA6PiAiOworCQltRGVidWdTZWxlY3RlZENvbnRleHQtPmRlYnVnRGVmYXVsdChBVk1fT1NfQ09VVCk7CisKKwkJZGJnUG9pbnRJdCA9IG1EZWJ1Z1NlbGVjdGVkUnVubmFibGVzLmJlZ2luKCk7CisJCWRiZ1BvaW50SXRFbmQgPSBtRGVidWdTZWxlY3RlZFJ1bm5hYmxlcy5lbmQoKTsKKwkJZm9yKCA7IGRiZ1BvaW50SXQgIT0gZGJnUG9pbnRJdEVuZCA7ICsrZGJnUG9pbnRJdCApCisJCXsKKwkJCWRiZ1ByaW50UnVubmFibGVJbmZvKCAqZGJnUG9pbnRJdCApOworCQl9CisJfQorCisJQVZNX09TX0NPVVQgPDwgc3RkOjplbmRsOworfQorCisKK3ZvaWQgSURlYnVnUHJvY2Vzc29yUHJvdmlkZXI6OmRiZ0NvbW1hbmRFY2hvKCkKK3sKKwlTdHJpbmdUb29sczo6cmVwbGFjZUFsbChkYmdDb21tYW5kQXJnLCAiXFxuIiwgIlxuIik7CisJU3RyaW5nVG9vbHM6OnJlcGxhY2VBbGwoZGJnQ29tbWFuZEFyZywgIlxcdCIsICJcdCIpOworCisJaWYoIChkYmdDb21tYW5kQXJnLnNpemUoKSA+IDIpICYmICgKKwkJKChkYmdDb21tYW5kQXJnWzBdID09ICciJykgJiYKKwkJCQkoZGJnQ29tbWFuZEFyZ1tkYmdDb21tYW5kQXJnLnNpemUoKSAtIDFdID09ICciJykpIHx8CisJCSgoZGJnQ29tbWFuZEFyZ1swXSA9PSAnXCcnKSAmJgorCQkJCShkYmdDb21tYW5kQXJnW2RiZ0NvbW1hbmRBcmcuc2l6ZSgpIC0gMV0gPT0gJ1wnJykpICkgKQorCXsKKwkJZGJnQ29tbWFuZEFyZyA9IGRiZ0NvbW1hbmRBcmcuc3Vic3RyKCAxICwgZGJnQ29tbWFuZEFyZy5zaXplKCkgLSAyICk7CisJfQorCisJQVZNX09TX0NPVVQgPDwgZGJnQ29tbWFuZEFyZzsKK30KKwordm9pZCBJRGVidWdQcm9jZXNzb3JQcm92aWRlcjo6ZGJnQ29tbWFuZFByaW50KCkKK3sKKwlkYmdDb21tYW5kRWNobygpOworfQorCit2b2lkIElEZWJ1Z1Byb2Nlc3NvclByb3ZpZGVyOjpkYmdDb21tYW5kU2hvdygpCit7CisJZGJnQ29tbWFuZEVjaG8oKTsKK30KKworCisKK3ZvaWQgSURlYnVnUHJvY2Vzc29yUHJvdmlkZXI6OmRiZ0NvbW1hbmRFbmFibGVEaXNhYmxlUHJvY2Vzcyhib29sIGJTdGF0dXMpCit7CisJaWYoIGRiZ0NvbW1hbmRBcmcuZW1wdHkoKSApCisJeworCX0KKworCWVsc2UKKwl7CisJCWlmKCBkYmdDb21tYW5kQXJnID09ICI/IiApCisJCXsKKwkJCUFWTV9PU19DT1VUIDw8ICJTZWxlY3QgYSBwcm9jZXNzIHsgcHJlZmlsdGVyICwgIgorCQkJCQkicG9zdGZpbHRlciAsIHByZXByb2Nlc3MgLCBwb3N0cHJvY2VzcyB9IDo+ICI7CisKKwkJCXN0ZDo6Z2V0bGluZShzdGQ6OmNpbiwgZGJnQ29tbWFuZEFyZyk7CisJCQlTdHJpbmdUb29sczo6bHRyaW0oIGRiZ0NvbW1hbmRBcmcgKTsKKwkJfQorCQllbHNlIGlmKCAoZGJnQ29tbWFuZEFyZ1swXSA9PSAnIycpIHx8IChkYmdDb21tYW5kQXJnWzBdID09ICc/JykgKQorCQl7CisJCQlkYmdDb21tYW5kQXJnID0gZGJnQ29tbWFuZEFyZy5zdWJzdHIoIDEgKTsKKwkJfQorCisJCWlmKCBkYmdDb21tYW5kQXJnLmZpbmQoImFsbCIpICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKwkJeworCQkJbURlYnVnUHJlZmlsdGVyaW5nRmxhZyA9IGJTdGF0dXM7CisJCQltRGVidWdQcmVmaWx0ZXJpbmdGaW5hbGl6ZUZsYWcgPSBiU3RhdHVzOworCisJCQltRGVidWdQb3N0ZmlsdGVyaW5nRmxhZyA9IGJTdGF0dXM7CisJCQltRGVidWdQb3N0ZmlsdGVyaW5nRmluYWxpemVGbGFnID0gYlN0YXR1czsKKworCQkJbURlYnVnUHJlcHJvY2Vzc2luZ0ZsYWcgPSBiU3RhdHVzOworCQkJbURlYnVnUG9zdHByb2Nlc3NpbmdGbGFnID0gYlN0YXR1czsKKwkJfQorCisJCWVsc2UgaWYoIGRiZ0NvbW1hbmRBcmcuZmluZCgicHJlZmlsdGVyI2ZpbmFsaXplIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorCQl7CisJCQltRGVidWdQcmVmaWx0ZXJpbmdGaW5hbGl6ZUZsYWcgPSBiU3RhdHVzOworCQl9CisJCWVsc2UgaWYoIGRiZ0NvbW1hbmRBcmcuZmluZCgicHJlZmlsdGVyIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorCQl7CisJCQltRGVidWdQcmVmaWx0ZXJpbmdGbGFnID0gYlN0YXR1czsKKworCQkJbURlYnVnUHJvY2Vzc29yLT5lbmFibGVQcmVmaWx0ZXIoIGJTdGF0dXMgKTsKKwkJfQorCisJCWVsc2UgaWYoIGRiZ0NvbW1hbmRBcmcuZmluZCgicG9zdGZpbHRlciNmaW5hbGl6ZSIpICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKwkJeworCQkJbURlYnVnUG9zdGZpbHRlcmluZ0ZpbmFsaXplRmxhZyA9IGJTdGF0dXM7CisJCX0KKwkJZWxzZSBpZiggZGJnQ29tbWFuZEFyZy5maW5kKCJwb3N0ZmlsdGVyIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorCQl7CisJCQltRGVidWdQb3N0ZmlsdGVyaW5nRmxhZyA9IGJTdGF0dXM7CisKKwkJCW1EZWJ1Z1Byb2Nlc3Nvci0+ZW5hYmxlUG9zdGZpbHRlciggYlN0YXR1cyApOworCQl9CisKKwkJZWxzZSBpZiggZGJnQ29tbWFuZEFyZy5maW5kKCJwcmVwcm9jZXNzIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorCQl7CisJCQltRGVidWdQcmVwcm9jZXNzaW5nRmxhZyA9IGJTdGF0dXM7CisKKwkJCW1EZWJ1Z1Byb2Nlc3Nvci0+ZW5hYmxlUHJlcHJvY2VzcyggYlN0YXR1cyApOworCQl9CisJCWVsc2UgaWYoIGRiZ0NvbW1hbmRBcmcuZmluZCgicG9zdHByb2Nlc3MiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisJCXsKKwkJCW1EZWJ1Z1Bvc3Rwcm9jZXNzaW5nRmxhZyA9IGJTdGF0dXM7CisKKwkJCW1EZWJ1Z1Byb2Nlc3Nvci0+ZW5hYmxlUG9zdHByb2Nlc3MoIGJTdGF0dXMgKTsKKwkJfQorCX0KKworCisJaWYoIGJTdGF0dXMgICkKKwl7CisJCUFWTV9PU19DT1VUIDw8ICJUaGUgZGVidWc8IGVuYWJsZSA+IHByb2Nlc3NlcyBhcmUgOj4gIgorCQkJCTw8ICggbURlYnVnUHJlZmlsdGVyaW5nRmxhZyA/ICAgICAgICAgICIgcHJlZmlsdGVyIiA6ICIiICkKKwkJCQk8PCAoIG1EZWJ1Z1ByZWZpbHRlcmluZ0ZpbmFsaXplRmxhZyA/ICAiIHByZWZpbHRlciNmaW5hbGl6ZSIgOiAiIiApCisJCQkJPDwgKCBtRGVidWdQb3N0ZmlsdGVyaW5nRmxhZyA/ICAgICAgICAgIiBwb3N0ZmlsdGVyIiA6ICIiICkKKwkJCQk8PCAoIG1EZWJ1Z1Bvc3RmaWx0ZXJpbmdGaW5hbGl6ZUZsYWcgPyAiIHBvc3RmaWx0ZXIjZmluYWxpemUiIDogIiIgKQorCQkJCTw8ICggbURlYnVnUHJlcHJvY2Vzc2luZ0ZsYWcgPyAgICAgICAgICIgcHJlcHJvY2VzcyIgOiAiIiApCisJCQkJPDwgKCBtRGVidWdQb3N0cHJvY2Vzc2luZ0ZsYWcgPyAgICAgICAgIiBwb3N0cHJvY2VzcyIgOiAiIiApCisJCQkJPDwgc3RkOjplbmRsOworCX0KKwllbHNlCisJeworCQlBVk1fT1NfQ09VVCA8PCAiVGhlIGRlYnVnPCBkaXNhYmxlID4gcHJvY2Vzc2VzIGFyZSA6PiAiCisJCQkJPDwgKCBtRGVidWdQcmVmaWx0ZXJpbmdGbGFnID8gICAgICAgICAgIiIgOiAiIHByZWZpbHRlciIgKQorCQkJCTw8ICggbURlYnVnUHJlZmlsdGVyaW5nRmluYWxpemVGbGFnID8gICIiIDogIiBwcmVmaWx0ZXIjZmluYWxpemUiICkKKwkJCQk8PCAoIG1EZWJ1Z1Bvc3RmaWx0ZXJpbmdGbGFnID8gICAgICAgICAiIiA6ICIgcG9zdGZpbHRlciIgKQorCQkJCTw8ICggbURlYnVnUG9zdGZpbHRlcmluZ0ZpbmFsaXplRmxhZyA/ICIiIDogIiBwb3N0ZmlsdGVyI2ZpbmFsaXplIiApCisJCQkJPDwgKCBtRGVidWdQcmVwcm9jZXNzaW5nRmxhZyA/ICAgICAgICAgIiIgOiAiIHByZXByb2Nlc3MiICkKKwkJCQk8PCAoIG1EZWJ1Z1Bvc3Rwcm9jZXNzaW5nRmxhZyA/ICAgICAgICAiIiA6ICIgcG9zdHByb2Nlc3MiICkKKwkJCQk8PCBzdGQ6OmVuZGw7CisJfQorCisJQVZNX09TX0NPVVQgPDwgc3RkOjplbmRsOworfQorCisKK3ZvaWQgSURlYnVnUHJvY2Vzc29yUHJvdmlkZXI6OmRiZ0NvbW1hbmRWZXJib3NpdHlMZXZlbCgpCit7CisJaWYoIChub3QgZGJnQ29tbWFuZEFyZy5lbXB0eSgpKSAmJiAoZGJnQ29tbWFuZEFyZyA9PSAiPyIpICkKKwl7CisJCUFWTV9PU19DT1VUIDw8ICJFbnRlciBhIHZlcmJvc2l0eSBsZXZlbCAiCisJCQkJInsgU0lMRU5UICwgTUlOSU1VTSAsIE1FRElVTSAsIE1BWElNVU0gfSA6PiAiOworCisJCXN0ZDo6Z2V0bGluZShzdGQ6OmNpbiwgZGJnQ29tbWFuZEFyZyk7CisJCVN0cmluZ1Rvb2xzOjpsdHJpbSggZGJnQ29tbWFuZEFyZyApOworCX0KKwllbHNlIGlmKCAoZGJnQ29tbWFuZEFyZ1swXSA9PSAnIycpIHx8IChkYmdDb21tYW5kQXJnWzBdID09ICc/JykgKQorCXsKKwkJZGJnQ29tbWFuZEFyZyA9IGRiZ0NvbW1hbmRBcmcuc3Vic3RyKCAxICk7CisJfQorCisJYXZtX3NldEV4ZWNWZXJib3NpdHlMZXZlbCggZGJnQ29tbWFuZEFyZyApOworCisJQVZNX09TX0NPVVQgPDwgIlZlcmJvc2l0eSBsZXZlbCA6PiAiIDw8IGF2bV9zdHJFeGVjVmVyYm9zaXR5TGV2ZWwoKQorCQkJPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKK30KKworCit2b2lkIElEZWJ1Z1Byb2Nlc3NvclByb3ZpZGVyOjpkYmdDb21tYW5kRGVidWdMZXZlbCgpCit7CisJaWYoIChub3QgZGJnQ29tbWFuZEFyZy5lbXB0eSgpKSAmJiAoZGJnQ29tbWFuZEFyZyA9PSAiPyIpICkKKwl7CisJCUFWTV9PU19DT1VUIDw8ICJFbnRlciBhIGRlYnVnIGxldmVsICIKKwkJCQkieyBaRVJPICwgTE9XICwgTUVESVVNICwgSElHSCAsIFVMVFJBIH0gOj4gIjsKKworCQlzdGQ6OmdldGxpbmUoc3RkOjpjaW4sIGRiZ0NvbW1hbmRBcmcpOworCQlTdHJpbmdUb29sczo6bHRyaW0oIGRiZ0NvbW1hbmRBcmcgKTsKKwl9CisJZWxzZSBpZiggKGRiZ0NvbW1hbmRBcmdbMF0gPT0gJyMnKSB8fCAoZGJnQ29tbWFuZEFyZ1swXSA9PSAnPycpICkKKwl7CisJCWRiZ0NvbW1hbmRBcmcgPSBkYmdDb21tYW5kQXJnLnN1YnN0ciggMSApOworCX0KKworCWF2bV9zZXREZWJ1Z0xldmVsKCBkYmdDb21tYW5kQXJnICk7CisKKwlBVk1fT1NfQ09VVCA8PCAiRGVidWcgdHJhY2UgbGV2ZWwgOj4gIiA8PCBhdm1fc3RyRGVidWdMZXZlbCgpCisJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworfQorCisKK3ZvaWQgSURlYnVnUHJvY2Vzc29yUHJvdmlkZXI6OmRiZ0NvbW1hbmREZWJ1Z0ZsYWcoYm9vbCBiU3RhdHVzKQoreworCWlmKCAobm90IGRiZ0NvbW1hbmRBcmcuZW1wdHkoKSkgJiYgKGRiZ0NvbW1hbmRBcmcgPT0gIj8iKSApCisJeworCQlBVk1fT1NfQ09VVCA8PCAiRW50ZXIgYSBkZWJ1ZyBmbGFnICIKKwkJCQkieyBDT01QVVRJTkcgLCBQUk9HUkFNICwgU1RBVEVNRU5UICwgQllURUNPREUgLCAuLi4gfSA6PiAiOworCisJCXN0ZDo6Z2V0bGluZShzdGQ6OmNpbiwgZGJnQ29tbWFuZEFyZyk7CisJCVN0cmluZ1Rvb2xzOjpsdHJpbSggZGJnQ29tbWFuZEFyZyApOworCX0KKworCWlmKCBiU3RhdHVzICkKKwl7CisJCWF2bV9zZXREZWJ1Z0ZsYWcoIGRiZ0NvbW1hbmRBcmcgKTsKKwl9CisJZWxzZQorCXsKKwkJYXZtX3Vuc2V0RGVidWdGbGFnKCBkYmdDb21tYW5kQXJnICk7CisJfQorCisJQVZNX09TX0NPVVQgPDwgIkRlYnVnIHRyYWNlIGZsYWcgOj4gIiA8PCBhdm1fc3RyRGVidWdGbGFnKCIgfCAiKQorCQkJPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKK30KKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9kZWJ1Zy9JRGVidWdQcm9jZXNzb3JQcm92aWRlci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2RlYnVnL0lEZWJ1Z1Byb2Nlc3NvclByb3ZpZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ5YTA3ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9kZWJ1Zy9JRGVidWdQcm9jZXNzb3JQcm92aWRlci5oCkBAIC0wLDAgKzEsNjU5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjcgamFudi4gMjAxNQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIElERUJVR1BST0NFU1NPUlBST1ZJREVSX0hfCisjZGVmaW5lIElERUJVR1BST0NFU1NPUlBST1ZJREVSX0hfCisKKyNpbmNsdWRlIDx1dGlsL2F2bV9zdHJpbmcuaD4KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vVHlwZWRlZi5oPgorCisjaW5jbHVkZSA8ZmFtL2FwaS9BYnN0cmFjdFByb2Nlc3NvclVuaXQuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkRhdGEuaD4KKworI2luY2x1ZGUgPGZtbC90cmFjZS9UcmFjZVBvaW50Lmg+CisjaW5jbHVkZSA8Zm1sL3RyYWNlL1RyYWNlU2VxdWVuY2UuaD4KKworI2luY2x1ZGUgPHNldy9Db25maWd1cmF0aW9uLmg+CisKKyNpbmNsdWRlIDxmc3RyZWFtPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworY2xhc3MgQ29uZmlndXJhdGlvbjsKKworY2xhc3MgRXhlY3V0aW9uQ29udGV4dDsKKworY2xhc3MgSW5zdGFuY2VPZkRhdGE7CisKK2NsYXNzIFJ1bnRpbWVGb3JtOworCitjbGFzcyBUcmFjZUZhY3Rvcnk7CisKKworCitjbGFzcyBJRGVidWdQcm9jZXNzb3JQcm92aWRlcgoreworCisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBBVFRSSUJVVEVTCisJICovCisJQWJzdHJhY3RQcm9jZXNzb3JVbml0ICogbURlYnVnUHJvY2Vzc29yOworCUNvbmZpZ3VyYXRpb24gJiBtRGVidWdDb25maWd1cmF0aW9uOworCisJYm9vbCBtRGVidWdFbmFibGVkRmxhZzsKKwlib29sIG1EZWJ1Z0NvbnNvbGVGbGFnOworCisJc3RkOjpzdHJpbmcgbURlYnVnU2NyaXB0RmlsZTsKKworCXN0ZDo6c3RyaW5nIG1EZWJ1Z1Byb21wdFByZWZpeDsKKworCWJvb2wgbURlYnVnRmlsdGVyaW5nRGV0YWlsRmxhZzsKKwlib29sIG1EZWJ1Z0ZpbHRlcmluZ0luaXRpYWxpemVGbGFnOworCWJvb2wgbURlYnVnRmlsdGVyaW5nRmluYWxpemVGbGFnOworCisJYm9vbCBtRGVidWdQcmVmaWx0ZXJpbmdGbGFnOworCWJvb2wgbURlYnVnUHJlZmlsdGVyaW5nRGV0YWlsRmxhZzsKKwlib29sIG1EZWJ1Z1ByZWZpbHRlcmluZ0ZpbmFsaXplRmxhZzsKKworCWJvb2wgbURlYnVnUG9zdGZpbHRlcmluZ0ZsYWc7CisJYm9vbCBtRGVidWdQb3N0ZmlsdGVyaW5nRGV0YWlsRmxhZzsKKwlib29sIG1EZWJ1Z1Bvc3RmaWx0ZXJpbmdGaW5hbGl6ZUZsYWc7CisKKwlib29sIG1EZWJ1Z1ByZXByb2Nlc3NpbmdGbGFnOworCWJvb2wgbURlYnVnUHJlcHJvY2Vzc2luZ0RldGFpbEZsYWc7CisKKwlib29sIG1EZWJ1Z1Bvc3Rwcm9jZXNzaW5nRmxhZzsKKwlib29sIG1EZWJ1Z1Bvc3Rwcm9jZXNzaW5nRGV0YWlsRmxhZzsKKworCWF2bV9zaXplX3QgbURlYnVnRXZhbFN0ZXBDb3VudDsKKwlhdm1fc2l6ZV90IG1EZWJ1Z0JyZWFrcG9pbnRFdmFsU3RlcDsKKwlhdm1fc2l6ZV90IG1EZWJ1Z0JyZWFrcG9pbnRFdmFsU3RlcFBlcmlvZDsKKworCWF2bV9zaXplX3QgbURlYnVnQnJlYWtwb2ludEV2YWxDb250ZXh0OworCisJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAqIG1EZWJ1Z1NlbGVjdGVkQ29udGV4dDsKKwlib29sIG1EZWJ1Z1RyYWNlRnVsbFBhdGhGbGFnOworCisJVHJhY2VTZXF1ZW5jZSBtRGVidWdUcmFjZVNlcXVlbmNlOworCisJVHJhY2VQb2ludCAqIG1EZWJ1Z1NlbGVjdGVkVmFyOworCUxpc3RPZlRyYWNlUG9pbnQgbURlYnVnU2VsZWN0ZWRWYXJzOworCisJVHJhY2VQb2ludCAqIG1EZWJ1Z1NlbGVjdGVkVGltZVZhcjsKKworCVRyYWNlUG9pbnQgKiBtRGVidWdTZWxlY3RlZFBvcnQ7CisJTGlzdE9mVHJhY2VQb2ludCBtRGVidWdTZWxlY3RlZFBvcnRzOworCisJVHJhY2VQb2ludCAqIG1EZWJ1Z1NlbGVjdGVkQnVmZmVyOworCUxpc3RPZlRyYWNlUG9pbnQgbURlYnVnU2VsZWN0ZWRCdWZmZXJzOworCisJVHJhY2VQb2ludCBtRGVidWdQYXJhbWV0ZXJzTWFjaGluZTsKKworCVRyYWNlUG9pbnQgKiBtRGVidWdTZWxlY3RlZE1hY2hpbmU7CisJTGlzdE9mVHJhY2VQb2ludCBtRGVidWdTZWxlY3RlZE1hY2hpbmVzOworCisJVHJhY2VQb2ludCAqIG1EZWJ1Z1NlbGVjdGVkU3RhdGU7CisJTGlzdE9mVHJhY2VQb2ludCBtRGVidWdTZWxlY3RlZFN0YXRlczsKKworCVRyYWNlUG9pbnQgKiBtRGVidWdTZWxlY3RlZFN0YXRlbWFjaGluZTsKKwlMaXN0T2ZUcmFjZVBvaW50IG1EZWJ1Z1NlbGVjdGVkU3RhdGVtYWNoaW5lczsKKworCVRyYWNlUG9pbnQgKiBtRGVidWdTZWxlY3RlZFRyYW5zaXRpb247CisJTGlzdE9mVHJhY2VQb2ludCBtRGVidWdTZWxlY3RlZFRyYW5zaXRpb25zOworCisJVHJhY2VQb2ludCAqIG1EZWJ1Z1NlbGVjdGVkUm91dGluZTsKKwlMaXN0T2ZUcmFjZVBvaW50IG1EZWJ1Z1NlbGVjdGVkUm91dGluZXM7CisKKwlUcmFjZVBvaW50ICogbURlYnVnU2VsZWN0ZWRSdW5uYWJsZTsKKwlMaXN0T2ZUcmFjZVBvaW50IG1EZWJ1Z1NlbGVjdGVkUnVubmFibGVzOworCisJLy8gVHJhY2UgRmFjdG9yeSB0b29scworCVRyYWNlRmFjdG9yeSAqIG1EZWJ1Z1RyYWNlRmFjdG9yeTsKKwlJbnN0YW5jZU9mRGF0YSAgICogbURlYnVnVGltZVZhcmlhYmxlOworCUluc3RhbmNlT2ZEYXRhICAgKiBtRGVidWdEZWx0YVRpbWVWYXJpYWJsZTsKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBDb21wdXRpbmcgVmFyaWFibGVzCisJQkYgZGJnVFA7CisJVHJhY2VQb2ludCAqIGRiZ1RyYWNlUG9pbnQ7CisJTGlzdE9mVHJhY2VQb2ludDo6aXRlcmF0b3IgZGJnUG9pbnRJdDsKKwlMaXN0T2ZUcmFjZVBvaW50OjppdGVyYXRvciBkYmdQb2ludEl0RW5kOworCisJTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAqIGRiZ1F1ZXVlOworCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQ6Oml0ZXJhdG9yIGRiZ1F1ZXVlSXQ7CisJTGlzdE9mRXhlY3V0aW9uQ29udGV4dDo6aXRlcmF0b3IgZGJnUXVldWVJdEVuZDsKKworCWJvb2wgZGJnQ29udGludWVSRVBMOworCisJYm9vbCBkYmdEZXRhaWxzTWluOworCWJvb2wgZGJnRGV0YWlsc01lZDsKKwlib29sIGRiZ0RldGFpbHNNYXg7CisKKwlib29sIGRiZ0RlY29kZUNvbW1hbmRPazsKKworCVZlY3Rvck9mU3RyaW5nIGRiZ0NvbW1hbmRMaW5lSGlzdG9yeTsKKwlzdGQ6OnN0cmluZyBkYmdDb21tYW5kTGluZTsKKwlzdGQ6OnN0cmluZyBkYmdDb21tYW5kQXJnOworCisJYXZtX2ludGVnZXJfdCBkYmdJbnRWYWx1ZTsKKwlhdm1fc2l6ZV90IGRiZ09mZnNldDsKKworCWNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgKiBkYmdFQzsKKwlBUEV4ZWN1dGlvbkRhdGEgZGJnRUQ7CisJY29uc3QgUnVudGltZUZvcm0gKiBkYmdSRjsKKwlCRiBkYmdWYWx1ZTsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJSURlYnVnUHJvY2Vzc29yUHJvdmlkZXIoQWJzdHJhY3RQcm9jZXNzb3JVbml0ICogYVByb2Nlc3NvcikKKwk6IG1EZWJ1Z1Byb2Nlc3NvciggYVByb2Nlc3NvciApLAorCW1EZWJ1Z0NvbmZpZ3VyYXRpb24oIGFQcm9jZXNzb3ItPmdldENvbmZpZ3VyYXRpb24oKSApLAorCW1EZWJ1Z0VuYWJsZWRGbGFnKCBmYWxzZSApLAorCisJbURlYnVnQ29uc29sZUZsYWcoIHRydWUgKSwKKwltRGVidWdTY3JpcHRGaWxlKCApLAorCisJbURlYnVnUHJvbXB0UHJlZml4KCApLAorCisJbURlYnVnRmlsdGVyaW5nRGV0YWlsRmxhZyggZmFsc2UgKSwKKwltRGVidWdGaWx0ZXJpbmdJbml0aWFsaXplRmxhZyggZmFsc2UgKSwKKwltRGVidWdGaWx0ZXJpbmdGaW5hbGl6ZUZsYWcoIGZhbHNlICksCisKKwltRGVidWdQcmVmaWx0ZXJpbmdGbGFnKCBmYWxzZSApLAorCW1EZWJ1Z1ByZWZpbHRlcmluZ0RldGFpbEZsYWcoIGZhbHNlICksCisJbURlYnVnUHJlZmlsdGVyaW5nRmluYWxpemVGbGFnKCBmYWxzZSApLAorCisJbURlYnVnUG9zdGZpbHRlcmluZ0ZsYWcoIGZhbHNlICksCisJbURlYnVnUG9zdGZpbHRlcmluZ0RldGFpbEZsYWcoIGZhbHNlICksCisJbURlYnVnUG9zdGZpbHRlcmluZ0ZpbmFsaXplRmxhZyggZmFsc2UgKSwKKworCW1EZWJ1Z1ByZXByb2Nlc3NpbmdGbGFnKCBmYWxzZSApLAorCW1EZWJ1Z1ByZXByb2Nlc3NpbmdEZXRhaWxGbGFnKCBmYWxzZSApLAorCisJbURlYnVnUG9zdHByb2Nlc3NpbmdGbGFnKCBmYWxzZSApLAorCW1EZWJ1Z1Bvc3Rwcm9jZXNzaW5nRGV0YWlsRmxhZyggZmFsc2UgKSwKKworCW1EZWJ1Z0V2YWxTdGVwQ291bnQoIDAgKSwKKwltRGVidWdCcmVha3BvaW50RXZhbFN0ZXAoIDAgKSwKKwltRGVidWdCcmVha3BvaW50RXZhbFN0ZXBQZXJpb2QoIDAgKSwKKworCW1EZWJ1Z0JyZWFrcG9pbnRFdmFsQ29udGV4dCggMCApLAorCisJbURlYnVnU2VsZWN0ZWRDb250ZXh0KCBOVUxMICksCisKKwltRGVidWdUcmFjZUZ1bGxQYXRoRmxhZyggZmFsc2UgKSwKKworCW1EZWJ1Z1RyYWNlU2VxdWVuY2UoICksCisKKwltRGVidWdTZWxlY3RlZFZhciggTlVMTCApLAorCW1EZWJ1Z1NlbGVjdGVkVmFycyggKSwKKworCW1EZWJ1Z1NlbGVjdGVkVGltZVZhciggTlVMTCApLAorCisJbURlYnVnU2VsZWN0ZWRQb3J0KCBOVUxMICksCisJbURlYnVnU2VsZWN0ZWRQb3J0cyggKSwKKworCW1EZWJ1Z1NlbGVjdGVkQnVmZmVyKCBOVUxMICksCisJbURlYnVnU2VsZWN0ZWRCdWZmZXJzKCApLAorCisJbURlYnVnUGFyYW1ldGVyc01hY2hpbmUoIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX01BQ0hJTkVfTkFUVVJFICksCisKKwltRGVidWdTZWxlY3RlZE1hY2hpbmUoIE5VTEwgKSwKKwltRGVidWdTZWxlY3RlZE1hY2hpbmVzKCApLAorCisJbURlYnVnU2VsZWN0ZWRTdGF0ZSggTlVMTCApLAorCW1EZWJ1Z1NlbGVjdGVkU3RhdGVzKCApLAorCisJbURlYnVnU2VsZWN0ZWRTdGF0ZW1hY2hpbmUoIE5VTEwgKSwKKwltRGVidWdTZWxlY3RlZFN0YXRlbWFjaGluZXMoICksCisKKwltRGVidWdTZWxlY3RlZFRyYW5zaXRpb24oIE5VTEwgKSwKKwltRGVidWdTZWxlY3RlZFRyYW5zaXRpb25zKCApLAorCisJbURlYnVnU2VsZWN0ZWRSb3V0aW5lKCBOVUxMICksCisJbURlYnVnU2VsZWN0ZWRSb3V0aW5lcyggKSwKKworCW1EZWJ1Z1NlbGVjdGVkUnVubmFibGUoIE5VTEwgKSwKKwltRGVidWdTZWxlY3RlZFJ1bm5hYmxlcyggKSwKKworCS8vIFRyYWNlIEZhY3RvcnkgdG9vbHMKKwltRGVidWdUcmFjZUZhY3RvcnkoIE5VTEwgKSwKKwltRGVidWdUaW1lVmFyaWFibGUoIE5VTEwgKSwKKwltRGVidWdEZWx0YVRpbWVWYXJpYWJsZSggTlVMTCApLAorCisJZGJnVFAoICksCisJZGJnVHJhY2VQb2ludCggTlVMTCApLAorCWRiZ1BvaW50SXQoICksCisJZGJnUG9pbnRJdEVuZCggKSwKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBDb21wdXRpbmcgVmFyaWFibGVzCisJZGJnUXVldWUoIE5VTEwgKSwKKwlkYmdRdWV1ZUl0KCApLAorCWRiZ1F1ZXVlSXRFbmQoICksCisKKwlkYmdDb250aW51ZVJFUEwoIHRydWUgKSwKKworCWRiZ0RldGFpbHNNaW4oIGZhbHNlICksCisJZGJnRGV0YWlsc01lZCggZmFsc2UgKSwKKwlkYmdEZXRhaWxzTWF4KCBmYWxzZSApLAorCisJZGJnRGVjb2RlQ29tbWFuZE9rKCBmYWxzZSApLAorCisJZGJnQ29tbWFuZExpbmVIaXN0b3J5KCAiaGVscCIgKSwKKwlkYmdDb21tYW5kTGluZSggKSwKKwlkYmdDb21tYW5kQXJnKCApLAorCisJZGJnSW50VmFsdWUoIDAgKSwKKwlkYmdPZmZzZXQoIDAgKSwKKworCWRiZ0VDKCBOVUxMICksCisJZGJnRUQoICksCisJZGJnUkYoIE5VTEwgKSwKKwlkYmdWYWx1ZSggKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfklEZWJ1Z1Byb2Nlc3NvclByb3ZpZGVyKCk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gUExVR0lOIFBST0NFU1NPUiBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIENPTkZJR1VSRSBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwl2aXJ0dWFsIGJvb2wgZGVidWdDb25maWd1cmVJbXBsKFdPYmplY3QgKiB3ZlBhcmFtZXRlck9iamVjdCk7CisKKwkvKioKKwkgKiBURVNUCisJICovCisJaW5saW5lIGJvb2wgaXNEZWJ1Z0VuYWJsZWQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRGVidWdGaWx0ZXJpbmdJbml0aWFsaXplRmxhZyB8fCBtRGVidWdGaWx0ZXJpbmdGaW5hbGl6ZUZsYWcgfHwKKwkJCQltRGVidWdQcmVmaWx0ZXJpbmdGbGFnICB8fCBtRGVidWdQcmVmaWx0ZXJpbmdGaW5hbGl6ZUZsYWcgICAgfHwKKwkJCQltRGVidWdQb3N0ZmlsdGVyaW5nRmxhZyB8fCBtRGVidWdQb3N0ZmlsdGVyaW5nRmluYWxpemVGbGFnICAgfHwKKwkJCQltRGVidWdQcmVwcm9jZXNzaW5nRmxhZyB8fCBtRGVidWdQb3N0cHJvY2Vzc2luZ0ZsYWcgKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBQUk9DRVNTIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXZpcnR1YWwgYm9vbCBkZWJ1Z1ByZXByb2Nlc3NpbmcoKTsKKworCXZpcnR1YWwgYm9vbCBkZWJ1Z1ByZXByb2Nlc3NpbmcoY29uc3QgRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpOworCisJaW5saW5lIGJvb2wgaXNEZWJ1Z1ByZXByb2Nlc3NpbmcoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRGVidWdQcmVwcm9jZXNzaW5nRmxhZyApOworCX0KKworCisJdmlydHVhbCBib29sIGRlYnVnUG9zdHByb2Nlc3NpbmcoKTsKKworCXZpcnR1YWwgYm9vbCBkZWJ1Z1Bvc3Rwcm9jZXNzaW5nKGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDKTsKKworCWlubGluZSBib29sIGlzRGVidWdQb3N0cHJvY2Vzc2luZygpIGNvbnN0CisJeworCQlyZXR1cm4oIG1EZWJ1Z1Bvc3Rwcm9jZXNzaW5nRmxhZyApOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIEZJTFRFUiBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlib29sIGRlYnVnQWN0aXZhdG9yVHJpZ2dlcmluZygpOworCisKKwlib29sIGRlYnVnRmlsdGVyaW5nSW5pdGlhbGl6ZSgpOworCisJYm9vbCBkZWJ1Z0ZpbHRlcmluZ0luaXRpYWxpemUoY29uc3QgRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpOworCisJaW5saW5lIGJvb2wgaXNEZWJ1Z0ZpbHRlcmluZ0luaXRpYWxpemUoKQorCXsKKwkJcmV0dXJuKCBtRGVidWdGaWx0ZXJpbmdJbml0aWFsaXplRmxhZyApOworCX0KKworCisJYm9vbCBkZWJ1Z0ZpbHRlcmluZ0ZpbmFsaXplKCk7CisKKwlib29sIGRlYnVnRmlsdGVyaW5nRmluYWxpemUoY29uc3QgRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpOworCisJaW5saW5lIGJvb2wgaXNEZWJ1Z0ZpbHRlcmluZ0ZpbmFsaXplKCkKKwl7CisJCXJldHVybiggbURlYnVnRmlsdGVyaW5nRmluYWxpemVGbGFnICk7CisJfQorCisKKwl2aXJ0dWFsIGJvb2wgZGVidWdQcmVmaWx0ZXJpbmcoKTsKKwl2aXJ0dWFsIGJvb2wgZGVidWdQcmVmaWx0ZXJpbmcoY29uc3QgRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpOworCisJaW5saW5lIGJvb2wgaXNEZWJ1Z1ByZWZpbHRlcmluZygpIGNvbnN0CisJeworCQlyZXR1cm4oIG1EZWJ1Z1ByZWZpbHRlcmluZ0ZsYWcgKTsKKwl9CisKKworCWJvb2wgZGVidWdQcmVmaWx0ZXJpbmdGaW5hbGl6ZSgpOworCisJaW5saW5lIGJvb2wgaXNEZWJ1Z1ByZWZpbHRlcmluZ0ZpbmFsaXplKCkKKwl7CisJCXJldHVybiggbURlYnVnUHJlZmlsdGVyaW5nRmluYWxpemVGbGFnICk7CisJfQorCisKKwl2aXJ0dWFsIGJvb2wgZGVidWdQb3N0ZmlsdGVyaW5nKCk7CisJdmlydHVhbCBib29sIGRlYnVnUG9zdGZpbHRlcmluZyhjb25zdCBFeGVjdXRpb25Db250ZXh0ICogYW5FQyk7CisKKwlpbmxpbmUgYm9vbCBpc0RlYnVnUG9zdGZpbHRlcmluZygpIGNvbnN0CisJeworCQlyZXR1cm4oIG1EZWJ1Z1Bvc3RmaWx0ZXJpbmdGbGFnICk7CisJfQorCisKKwlib29sIGRlYnVnUG9zdGZpbHRlcmluZ0ZpbmFsaXplKCk7CisKKwlpbmxpbmUgYm9vbCBpc0RlYnVnUG9zdGZpbHRlcmluZ0ZpbmFsaXplKCkKKwl7CisJCXJldHVybiggbURlYnVnUG9zdGZpbHRlcmluZ0ZpbmFsaXplRmxhZyApOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIERFQlVHIFBST0NFU1NJTkcKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwl2b2lkIGRlYnVnUmVhZEV2YWxDb21tYW5kKCk7CisKKworCXZvaWQgZGVidWdSZWFkRXZhbFNjcmlwdCgpOworCisJYm9vbCBpc0RlYnVnU2NyaXB0KHN0ZDo6aWZzdHJlYW0gJiBhU2NyaXB0U3RyZWFtKTsKKworCXZvaWQgZGVidWdSZWFkRXZhbFNjcmlwdChzdGQ6Omlmc3RyZWFtICYgYVNjcmlwdFN0cmVhbSk7CisKKworCXZvaWQgZGVidWdSZWFkRXZhbENvbW1hbmRMb29wKCk7CisKKwl2b2lkIGRlYnVnUmVhZEhpc3RvcnlDb21tYW5kKCk7CisKKwl2b2lkIGRlYnVnRXZhbENvbW1hbmQoKTsKKworCS8qKgorCSAqIEFQSQorCSAqIGlmIHJldHVybiBmYWxzZSwKKwkgKiB0aGUgZGVmYXVsdCBkZWJ1ZyBldmFsdWF0aW9uIGNvbW1hbmQgd2lsbCBoYW5kbGUgdGhlIGN1cnJlbnQgY29tbWFuZAorCSAqLworCXZpcnR1YWwgYm9vbCBkZWJ1Z0V2YWxDb21tYW5kSW1wbCgpID0gMDsKKworCS8qKgorCSAqIG1ldGhvZCBmb3IgbGF1bmNoIGFueXdoZXJlIHRoZSBSRVBMIGNvbW1hbmQgbG9vcCAhCisJICovCisJaW5saW5lIHZvaWQgZGVidWdSZWFkRXZhbENvbW1hbmRQcmludExvb3AoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFEZWJ1Z1Byb21wdFByZWZpeCA9ICJQUk9DRVNTT1IjQ1RYIiwKKwkJCUV4ZWN1dGlvbkNvbnRleHQgKiBhRGVidWdTZWxlY3RlZENvbnRleHQgPSBOVUxMKQorCXsKKwkJbURlYnVnUHJvbXB0UHJlZml4ID0gYURlYnVnUHJvbXB0UHJlZml4OworCisJCWlmKCBhRGVidWdTZWxlY3RlZENvbnRleHQgIT0gTlVMTCApCisJCXsKKwkJCW1EZWJ1Z1Byb21wdFByZWZpeCA9IGFEZWJ1Z1Byb21wdFByZWZpeDsKKwkJfQorCisJCWRlYnVnUmVhZEV2YWxDb21tYW5kKCk7CisJfQorCisKKwkvKioKKwkgKiBDb21tYW5kIGRlY29kZXIKKwkgKi8KKwlpbmxpbmUgYm9vbCBpc0RlYnVnU3RyaW5nQ29tbWFuZChjb25zdCBzdGQ6OnN0cmluZyAmIGNtZFN0cmluZykKKwl7CisJCWlmKCBTdHJpbmdUb29sczo6c3RhcnRzV2l0aChkYmdDb21tYW5kTGluZSwgY21kU3RyaW5nKSApCisJCXsKKwkJCVN0cmluZ1Rvb2xzOjpsdHJpbSggZGJnQ29tbWFuZEFyZyAsIGNtZFN0cmluZy5zaXplKCkpOworCisJCQlyZXR1cm4oIGRiZ0RlY29kZUNvbW1hbmRPayA9IHRydWUgKTsKKwkJfQorCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc0RlYnVnQ2hhckNvbW1hbmQoY2hhciBjbWRDaGFyKQorCXsKKwkJaWYoICgobm90IGRiZ0NvbW1hbmRMaW5lLmVtcHR5KCkpICYmIChkYmdDb21tYW5kTGluZVswXSA9PSBjbWRDaGFyKSkgJiYKKwkJCSgoZGJnQ29tbWFuZExpbmUuc2l6ZSgpID09IDEpIHx8IChub3QgOjppc2FscGhhKGRiZ0NvbW1hbmRMaW5lWzFdKSkpICkKKwkJeworCQkJU3RyaW5nVG9vbHM6Omx0cmltKCBkYmdDb21tYW5kQXJnICwgMSApOworCisJCQlyZXR1cm4oIGRiZ0RlY29kZUNvbW1hbmRPayA9IHRydWUgKTsKKwkJfQorCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKworCXZvaWQgZGJnQ2hlY2tDb21tYW5kRGV0YWlsc0FyZygpOworCisKKwlpbmxpbmUgYm9vbCBkYmdEZWNvZGVDb21tYW5kKGNvbnN0IHN0ZDo6c3RyaW5nICYgY21kU3RyKQorCXsKKwkJaWYoIGlzRGVidWdTdHJpbmdDb21tYW5kKGNtZFN0cikgKQorCQl7CisJCQlkYmdDaGVja0NvbW1hbmREZXRhaWxzQXJnKCkgOworCQl9CisKKwkJcmV0dXJuKCBkYmdEZWNvZGVDb21tYW5kT2sgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBkYmdEZWNvZGVDb21tYW5kKGNvbnN0IHN0ZDo6c3RyaW5nICYgY21kU3RyLCBjaGFyIGNtZENoYXIpCisJeworCQlpZiggaXNEZWJ1Z1N0cmluZ0NvbW1hbmQoY21kU3RyKSB8fCBpc0RlYnVnQ2hhckNvbW1hbmQoY21kQ2hhcikgKQorCQl7CisJCQlkYmdDaGVja0NvbW1hbmREZXRhaWxzQXJnKCkgOworCisJCQlkYmdEZWNvZGVDb21tYW5kT2sgPSB0cnVlOworCQl9CisKKwkJcmV0dXJuKCBkYmdEZWNvZGVDb21tYW5kT2sgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBkYmdEZWNvZGVDb21tYW5kKAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBjbWRTdHIsIGNvbnN0IHN0ZDo6c3RyaW5nICYgY21kU3RyMSkKKwl7CisJCWlmKCBpc0RlYnVnU3RyaW5nQ29tbWFuZChjbWRTdHIpIHx8IGlzRGVidWdTdHJpbmdDb21tYW5kKGNtZFN0cjEpICkKKwkJeworCQkJZGJnQ2hlY2tDb21tYW5kRGV0YWlsc0FyZygpIDsKKwkJfQorCisJCXJldHVybiggZGJnRGVjb2RlQ29tbWFuZE9rICk7CisJfQorCisJaW5saW5lIGJvb2wgZGJnRGVjb2RlQ29tbWFuZChjb25zdCBzdGQ6OnN0cmluZyAmIGNtZFN0ciwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgY21kU3RyMSwgY29uc3Qgc3RkOjpzdHJpbmcgJiBjbWRTdHIyKQorCXsKKwkJaWYoIGlzRGVidWdTdHJpbmdDb21tYW5kKGNtZFN0cikgfHwgaXNEZWJ1Z1N0cmluZ0NvbW1hbmQoY21kU3RyMSkgfHwKKwkJCWlzRGVidWdTdHJpbmdDb21tYW5kKGNtZFN0cjIpICkKKwkJeworCQkJZGJnQ2hlY2tDb21tYW5kRGV0YWlsc0FyZygpIDsKKwkJfQorCisJCXJldHVybiggZGJnRGVjb2RlQ29tbWFuZE9rICk7CisJfQorCisJaW5saW5lIGJvb2wgZGJnRGVjb2RlQ29tbWFuZCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgY21kU3RyLCBjb25zdCBzdGQ6OnN0cmluZyAmIGNtZFN0cjEsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGNtZFN0cjIsIGNvbnN0IHN0ZDo6c3RyaW5nICYgY21kU3RyMykKKwl7CisJCWlmKCBpc0RlYnVnU3RyaW5nQ29tbWFuZChjbWRTdHIpICB8fCBpc0RlYnVnU3RyaW5nQ29tbWFuZChjbWRTdHIxKSB8fAorCQkJaXNEZWJ1Z1N0cmluZ0NvbW1hbmQoY21kU3RyMikgfHwgaXNEZWJ1Z1N0cmluZ0NvbW1hbmQoY21kU3RyMykgKQorCQl7CisJCQlkYmdDaGVja0NvbW1hbmREZXRhaWxzQXJnKCkgOworCQl9CisKKwkJcmV0dXJuKCBkYmdEZWNvZGVDb21tYW5kT2sgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBkYmdEZWNvZGVDb21tYW5kKGNvbnN0IHN0ZDo6c3RyaW5nICYgY21kU3RyLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBjbWRTdHIxLCBjaGFyIGNtZENoYXIpCisJeworCQlpZiggaXNEZWJ1Z1N0cmluZ0NvbW1hbmQoY21kU3RyKSB8fCBpc0RlYnVnU3RyaW5nQ29tbWFuZChjbWRTdHIxKSB8fAorCQkJaXNEZWJ1Z0NoYXJDb21tYW5kKGNtZENoYXIpICApCisJCXsKKwkJCWRiZ0NoZWNrQ29tbWFuZERldGFpbHNBcmcoKSA7CisJCX0KKworCQlyZXR1cm4oIGRiZ0RlY29kZUNvbW1hbmRPayApOworCX0KKworCWlubGluZSBib29sIGRiZ0RlY29kZUNvbW1hbmQoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGNtZFN0ciwgY2hhciBjbWRDaGFyLCBjaGFyIGNtZENoYXIxKQorCXsKKwkJaWYoIGlzRGVidWdTdHJpbmdDb21tYW5kKGNtZFN0cikgfHwKKwkJCWlzRGVidWdDaGFyQ29tbWFuZChjbWRDaGFyKSAgfHwgaXNEZWJ1Z0NoYXJDb21tYW5kKGNtZENoYXIxKSApCisJCXsKKwkJCWRiZ0NoZWNrQ29tbWFuZERldGFpbHNBcmcoKSA7CisJCX0KKworCQlyZXR1cm4oIGRiZ0RlY29kZUNvbW1hbmRPayApOworCX0KKworCisJc3RhdGljIHN0ZDo6c3RyaW5nIERFQlVHX1NIRUxMX0NPTU1BTkRfU1VNTUFSWTsKKworCXN0YXRpYyBzdGQ6OnN0cmluZyBERUJVR19TSEVMTF9DT01NQU5EX0hJU1RPUlk7CisKKwlzdGF0aWMgc3RkOjpzdHJpbmcgREVCVUdfU0hFTExfQ09NTUFORF9DT05UUk9MOworCisJc3RhdGljIHN0ZDo6c3RyaW5nIERFQlVHX1NIRUxMX0NPTU1BTkRfUVVFVUU7CisKKwlzdGF0aWMgc3RkOjpzdHJpbmcgREVCVUdfU0hFTExfQ09NTUFORF9DT05URVg7CisKKwlzdGF0aWMgc3RkOjpzdHJpbmcgREVCVUdfU0hFTExfQ09NTUFORF9EQVRBOworCisJc3RhdGljIHN0ZDo6c3RyaW5nIERFQlVHX1NIRUxMX0NPTU1BTkRfUFJJTlQ7CisKKwlzdGF0aWMgc3RkOjpzdHJpbmcgREVCVUdfU0hFTExfQ09NTUFORF9SRVBPUlQ7CisKKwlzdGF0aWMgc3RkOjpzdHJpbmcgREVCVUdfU0hFTExfQ09NTUFORF9CUkVBS1BPSU5UOworCisJc3RhdGljIHN0ZDo6c3RyaW5nIERFQlVHX1NIRUxMX0NPTU1BTkRfT1BUSU9OOworCisJc3RhdGljIHN0ZDo6c3RyaW5nIERFQlVHX1NIRUxMX0NPTU1BTkRfTE9HOworCisKKworCXZvaWQgZGJnQ29tbWFuZEhlbHAoKTsKKworCXZvaWQgZGJnQ29tbWFuZEhpc3RvcnkoKTsKKworCisJdm9pZCBkYmdDb21tYW5kQ29uZmlnKCk7CisKKwl2b2lkIGRiZ0NvbW1hbmRCcmVhaygpOworCisJdm9pZCBkYmdDb21tYW5kTmV4dCgpOworCisJdm9pZCBkYmdDb21tYW5kUGVyaW9kKCk7CisKKwl2b2lkIGRiZ0NvbW1hbmRRdWV1ZSgpOworCisJdm9pZCBkYmdDb21tYW5kQ29udGV4dCgpOworCisJdm9pZCBkYmdDb21tYW5kUGF0aCgpOworCisJdm9pZCBkYmdDb21tYW5kVHJhY2UoKTsKKworCXZvaWQgZGJnQ29tbWFuZFRyYWNlRGV0YWlsTGV2ZWwoKTsKKworCXZvaWQgZGJnUHJpbnRWYXJJbmZvKFRyYWNlUG9pbnQgKiBhVFApOworCXZvaWQgZGJnQ29tbWFuZFZhcigpOworCXZvaWQgZGJnQ29tbWFuZFZhcnMoKTsKKworCXZvaWQgZGJnQ29tbWFuZFRpbWUoKTsKKworCXZvaWQgZGJnUHJpbnRQb3J0SW5mbyhUcmFjZVBvaW50ICogYVRQKTsKKwl2b2lkIGRiZ0NvbW1hbmRQb3J0KEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX05BVFVSRSBuYXR1cmUpOworCXZvaWQgZGJnQ29tbWFuZFBvcnRzKEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX05BVFVSRSBuYXR1cmUpOworCisJdm9pZCBkYmdQcmludEJ1ZmZlckluZm8oVHJhY2VQb2ludCAqIGFUUCk7CisJdm9pZCBkYmdDb21tYW5kQnVmZmVyKCk7CisJdm9pZCBkYmdDb21tYW5kQnVmZmVycygpOworCisJdm9pZCBkYmdQcmludE1hY2hpbmVJbmZvKFRyYWNlUG9pbnQgKiBhVFApOworCXZvaWQgZGJnQ29tbWFuZE1hY2hpbmUoKTsKKwl2b2lkIGRiZ0NvbW1hbmRNYWNoaW5lcygpOworCisJdm9pZCBkYmdDb21tYW5kUGFyYW1ldGVyc01hY2hpbmUoKTsKKworCXZvaWQgZGJnUHJpbnRTdGF0ZUluZm8oVHJhY2VQb2ludCAqIGFUUCk7CisJdm9pZCBkYmdDb21tYW5kU3RhdGUoKTsKKwl2b2lkIGRiZ0NvbW1hbmRTdGF0ZXMoKTsKKworCXZvaWQgZGJnUHJpbnRTdGF0ZW1hY2hpbmVJbmZvKFRyYWNlUG9pbnQgKiBhVFApOworCXZvaWQgZGJnQ29tbWFuZFN0YXRlbWFjaGluZSgpOworCXZvaWQgZGJnQ29tbWFuZFN0YXRlbWFjaGluZXMoKTsKKworCXZvaWQgZGJnUHJpbnRUcmFuc2l0aW9uSW5mbyhUcmFjZVBvaW50ICogYVRQKTsKKwl2b2lkIGRiZ0NvbW1hbmRUcmFuc2l0aW9uKCk7CisJdm9pZCBkYmdDb21tYW5kVHJhbnNpdGlvbnMoKTsKKworCXZvaWQgZGJnUHJpbnRSb3V0aW5lSW5mbyhUcmFjZVBvaW50ICogYVRQKTsKKwl2b2lkIGRiZ0NvbW1hbmRSb3V0aW5lKCk7CisJdm9pZCBkYmdDb21tYW5kUm91dGluZXMoKTsKKworCXZvaWQgZGJnUHJpbnRSdW5uYWJsZUluZm8oVHJhY2VQb2ludCAqIGFUUCk7CisJdm9pZCBkYmdDb21tYW5kUnVubmFibGUoKTsKKwl2b2lkIGRiZ0NvbW1hbmRSdW5uYWJsZXMoKTsKKworCXZvaWQgZGJnQ29tbWFuZEVjaG8oKTsKKwl2b2lkIGRiZ0NvbW1hbmRQcmludCgpOworCXZvaWQgZGJnQ29tbWFuZFNob3coKTsKKworCXZvaWQgZGJnQ29tbWFuZEVuYWJsZURpc2FibGVQcm9jZXNzKGJvb2wgYlN0YXR1cyk7CisKKwl2b2lkIGRiZ0NvbW1hbmRWZXJib3NpdHlMZXZlbCgpOworCisJdm9pZCBkYmdDb21tYW5kRGVidWdMZXZlbCgpOworCisJdm9pZCBkYmdDb21tYW5kRGVidWdGbGFnKGJvb2wgYlN0YXR1cyk7CisKK307CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKiBJREVCVUdQUk9DRVNTT1JQUk9WSURFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2hpdG9yanVtcC9Bdm1IaXRPckp1bXBQcm9jZXNzb3IuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2hpdG9yanVtcC9Bdm1IaXRPckp1bXBQcm9jZXNzb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MTVhODgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vaGl0b3JqdW1wL0F2bUhpdE9ySnVtcFByb2Nlc3Nvci5jcHAKQEAgLTAsMCArMSwxMjkwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogNyBqYW52LiAyMDE0CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJBdm1IaXRPckp1bXBQcm9jZXNzb3IuaCIKKworI2luY2x1ZGUgIkhpdE9yZGVyZWRQcm9jZXNzb3IuaCIKKyNpbmNsdWRlICJIaXRVbm9yZGVyZWRQcm9jZXNzb3IuaCIKKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vVHlwZWRlZi5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uQ29udGV4dC5oPgorCisjaW5jbHVkZSA8ZmFtL3F1ZXVlL0V4ZWN1dGlvblF1ZXVlLmg+CisKKyNpbmNsdWRlIDxmbWwvd29ya2Zsb3cvUXVlcnkuaD4KKyNpbmNsdWRlIDxmbWwvd29ya2Zsb3cvV09iamVjdC5oPgorCisjaW5jbHVkZSA8c2V3L1N5bWJleENvbnRyb2xsZXJSZXF1ZXN0TWFuYWdlci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvKgorcHJvdG90eXBlIHByb2Nlc3M6OmhpdF9vcl9qdW1wIGFzICZhdm06OnByb2Nlc3Nvci5ISVRfT1JfSlVNUCBpcworIHNlY3Rpb24gUkVQT1JUCisgIEB1cmkgPSBzdGQgICAgICAiOiIgKCAiY291dCIgfCAiY2VyciIgICkKKyAgICAgICB8IGF2bSAgICAgICI6IiAoICJsb2ciICB8ICJ0cmFjZSIgKQorICAgICAgIHwgZm9sZGVyICAgIjoiIHBhdGgKKyAgICAgICB8IGZpbGUgICAgICI6IiBwYXRoCisgICAgICAgfCBmaWxlbmFtZSAiOiIgcGF0aAorICAgICAgIHwgc29ja2V0ICAgIjoiIGhvc3QgIjoiIHBvcnQKKyAgICAgICA7CisgIEB1cmkgPSAuLi47CisKKyAgQHdoZW4gPSBbIGluaXQgXVs6XVsgb3RmIHwgKGV2ZXJ5IHwgYWZ0ZXIgfCBiZWZvcmUpP3ZhbHVlI3VuaXRdWzpdWyBleGl0IF0gOworIGVuZHNlY3Rpb24gUkVQT1JUCisKKyBzZWN0aW9uIFNDSEVEVUxJTkcKKyAgQHN0YXJ0dXAgPSAnd2FpdGluZyc7CisgZW5kc2VjdGlvbiBTQ0hFRFVMSU5HCisKKyBzZWN0aW9uIFBST1BFUlRZCisgIC8vIE5vbWJyZSBkZSBwYXMgZGUgY2FsY3VsICJjdW11bMOpcyIgYXZhbnQgZGUgZMOpYnV0ZXIgbGEgdsOpcmlmaWNhdGlvbiBkZSBsYSBjb3V2ZXJ0dXJlCisgIEBiZWdpbl9zdGVwID0gMDsKKworICAvLyBBcnLDqHRlIGwnZXjDqWN1dGlvbiBkw6hzIHF1ZSBsYSBjb3V2ZXJ0dXJlIGVzdCBjb21wbMOodGUKKyAgQHN0b3AgPSB0cnVlOworCisgIC8vIEVsYWdhZ2UgZHUgZ3JhcGhlIGRlcyBzY8OpbmFyaW9zIMOgIGxhIGZpbiBkZSBsYSB2w6lyaWZpY2F0aW9uCisgIEBzbGljZSA9IHRydWU7CisKKyAgLy8gQWN0aXZlIGwndXRpbGlzYXRpb24gZCdoZXVyaXN0aXF1ZQorICBAaGV1cmlzdGljID0gdHJ1ZTsKKworICAvLyBDaGVyY2hlIHVuZSB0cmFjZSBnbG9iYWxlbWVudCBvdSBsb2NhbGUgw6AgY2hhcXVlIG5vZXVkIHJhY2luZS4uLgorICBAc2VhcmNoI3Njb3BlID0gJ0dMT0JBTExZJzsgLy8gR0xPQkFMTFkgfCBMT0NBTExZIDsKKworICAvLyB8O3wgICAgIC0tPiBvcmRlcmVkICAgICAob3BlcmF0b3I6IHNlcXVlbmNlKQorICAvLyB8PHwgICAgIC0tPiBvcmRlcmVkICAgICAob3BlcmF0b3I6IG9yZGVyKQorICAvLyB8aXwgICAgIC0tPiB1bm9yZGVyZWQgICAob3BlcmF0b3I6IGludGVybGVhdmluZykKKyAgLy8gfHJlZ2V4fCAtLT4gcmVnZXggICAgICAgKG9wZXJhdG9yOiByZWdleCkKKyAgQHNjaGVkdWxlciA9ICd8PHwnOworCisKKyAgLy8gSGF1dGV1ciBkdSBqdW1wCisgIEBqdW1wI2hlaWdodCA9IDQ7CisKKyAgLy8gdGhlIEp1bXAgdHJpYWxzIGxpbWl0IGV4cGxvcmF0aW9uIHByb3BlcnR5CisgIEBqdW1wI2xpbWl0ID0gMTU7CisKKworICAvLyBDaG9pc2lyIGRlcyB0cmFjZXMgYXZlYyBvdSBzYW5zIHRyb3VzCisgIEBoaXQjY29uc2VjdXRpdmUgPSBmYWxzZTsKKworICAvLyBSZWNoZXJjaGVyIHVuIG1heGltdW0gZGUgdHJhY2VzIHNvbHV0aW9ucworICAvLyBQb3NzaWJsZSBiYWNrdHJhY2tpbmcKKyAgQGhpdCNtYXggPSBmYWxzZTsKKworICAvLyBOZSBmYWlyZSBxdSd1bmUgdGVudGF0aXZlIHZlcnMgbCdvYmplY3RpZiAoYXZvaXIgZGUgbGEgY2hhbmNlISkKKyAgLy8gUGFzIGRlIGJhY2t0cmFjaworICBAaGl0I2x1Y2t5ID0gdHJ1ZTsKKworICAvLyBOb21icmUgZGUgY2hlbWlucyBwb3NpdGlmcyBzw6lsZWN0aW9ubmFibGVzIEFMRUFUT0lSRU1FTlQKKyAgQGhpdCNjb3VudCAgPSAtMTsKKworICAvLyBOb21icmUgZGUgY2hlbWlucyBuw6lnYXRpZnMgc8OpbGVjdGlvbm5hYmxlcyBBTEVBVE9JUkVNRU5UCisgIEBqdW1wI2NvdW50ICA9IDE7CisKKyAgLy8gRWZmZWN0dWUgdW5lIHPDqWxlY3Rpb24gZmluYWxlIChyZWxhdGl2ZW1lbnQgw6AgQGhpdCNjb3VudCkKKyAgLy8gbG9yc3F1ZSBsJ29iamVjdGlmIGVzdCBhdHRlaW50ICEKKyAgQGhpdCNmaW5hbCAgPSB0cnVlOworCisgIC8vIFNsaWNlIGxlcyBoaXQvanVtcCBub24gcmV0ZW51cyBhbMOpYXRvaXJlbWVudAorICBAanVtcCNzbGljZSAgPSB0cnVlOworIGVuZHNlY3Rpb24gUFJPUEVSVFkKKworCisgLy8gRGVjbGFyYXRpb24gcGFydAorIHNlY3Rpb24gUE9JTlQKKyAgQGFzc2lnbiA9ICJzZW5zIjsKKworICBAbmV3ZnJlc2ggPSAic2VucyI7CisKKyAgQHNpZ25hbCNzZW5zID0gInNlbnMiOworCisgIEBwb3J0ID0gImVudiI7CisKKyAgQGlucHV0ID0gImVudiI7CisgIEBvdXRwdXQgPSAiZW52IjsKKworICBAb3V0cHV0ID0gIlRoZXJtb3N0YXQtPmR0IjsKKyAgQGlucHV0ICA9ICJUaGVybW9zdGF0LT5lcXVpcCI7CisgIEBvdXRwdXQyID0gIkVxdWlwbWVudC0+ZXJyb3IiOworIGVuZHNlY3Rpb24gUE9JTlQKKworIHNlY3Rpb24gVFJBQ0UKKyAgQHRyYWNlID0gJHsgJiYgInNpZ25hbCNzZW5zIiAib3V0cHV0MiIgfTsKKyAgQHRyYWNlID0gWyAic2lnbmFsI3NlbnMiICwgIm91dHB1dDIiIF07CisgIEBwb2ludCA9ICggInNpZ25hbCNzZW5zIiB8fCAib3V0cHV0MiIgKTsKKyAgQGNvbXBvc2l0ZSA9ICR7IHhvciAic2lnbmFsI3NlbnMiICJvdXRwdXQyIiB9OworCisKKyAgQGFzc2lnbiA9ICJzZW5zIjsKKworICBAbmV3ZnJlc2ggPSAic2VucyI7CisKKyAgQHNpZ25hbCA9ICJzZW5zIjsKKworICBAcG9ydCA9ICJlbnYiOworCisgIEBpbnB1dCA9ICJlbnYiOworICBAb3V0cHV0ID0gImVudiI7CisKKyAgQG91dHB1dCA9ICJUaGVybW9zdGF0LT5kdCI7CisgIEBpbnB1dCAgPSAiVGhlcm1vc3RhdC0+ZXF1aXAiOworICBAb3V0cHV0ID0gIkVxdWlwbWVudC0+ZXJyb3IiOworCisgIEB0cmFuc2l0aW9uID0gIlRoZXJtb3N0YXQtPnRyYW5zaXRpb24jMiNNU0dtMSNpbiI7CisgIEByb3V0aW5lID0gIlRoZXJtb3N0YXQtPnRyYW5zaXRpb24jMiNNU0dtMSNpbiI7CisKKyAgQG1hY2hpbmUgPSAiVGhlcm1vc3RhdCI7CisKKyAgQHN0YXRlID0gIlRoZXJtb3N0YXQtPnM0IjsKKworICBAZm9ybXVsYSA9IDxleHByZXNzaW9uPjsKKworCisgZW5kc2VjdGlvbiBUUkFDRQorZW5kcHJvdG90eXBlCisqLworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDT05GSUdVUkUgQVBJCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIEF2bUhpdE9ySnVtcFByb2Nlc3Nvcjo6Y29uZmlndXJlSW1wbCgpCit7CisJLy8gU1VQRVIgQ09ORklHVVJBVElPTgorCW1Db25maWdGbGFnID0gQmFzZUNvdmVyYWdlRmlsdGVyOjpjb25maWd1cmVJbXBsKCk7CisKKwlXT2JqZWN0ICogdGhlUFJPUEVSVFkgPSBRdWVyeTo6Z2V0UmVnZXhXU2VxdWVuY2UoZ2V0UGFyYW1ldGVyV09iamVjdCgpLAorCQkJT1JfV0lEMigicHJvcGVydHkiLCAiUFJPUEVSVFkiKSwgZ2V0UGFyYW1ldGVyV09iamVjdCgpKTsKKwlpZiggdGhlUFJPUEVSVFkgIT0gV09iamVjdDo6X05VTExfICkKKwl7CisJCXN0ZDo6c3RyaW5nIHN0clNjaGVkdWxlciA9IFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eVN0cmluZygKKwkJCQl0aGVQUk9QRVJUWSwgQ09OU19XSUQyKCJzZWFyY2giLCAic2NvcGUiKSwgIkdMT0JBTExZIik7CisJCVN0cmluZ1Rvb2xzOjp0b3VwcGVyKCBzdHJTY2hlZHVsZXIgKTsKKwkJbUdsb2JhbFNlYXJjaFNjb3BlRmxhZyA9ICggc3RyU2NoZWR1bGVyID09ICJHTE9CQUxMWSIgKTsKKworCisJCXN0clNjaGVkdWxlciA9IFF1ZXJ5OjpnZXRXUHJvcGVydHlTdHJpbmcodGhlUFJPUEVSVFksICJzY2hlZHVsZXIiLCAifDt8Iik7CisJCXNjaGVkdWxlciA9IE9wZXJhdG9yTGliOjp0b09wY29kZShzdHJTY2hlZHVsZXIsIEFWTV9PUENPREVfTlVMTCk7CisJCWlmKCBzY2hlZHVsZXIgPT0gQVZNX09QQ09ERV9OVUxMICkKKwkJeworCQkJaWYoIHN0clNjaGVkdWxlciA9PSAib3JkZXJlZCIgKQorCQkJeworCQkJCXNjaGVkdWxlciA9IEFWTV9PUENPREVfU0VRVUVOQ0U7CisJCQl9CisJCQllbHNlIGlmKCBzdHJTY2hlZHVsZXIgPT0gInVub3JkZXJlZCIgKQorCQkJeworCQkJCXNjaGVkdWxlciA9IEFWTV9PUENPREVfSU5URVJMRUFWSU5HOworCQkJfQorCQkJZWxzZSBpZiggc3RyU2NoZWR1bGVyID09ICJyZWdleCIgKQorCQkJeworCQkJCXNjaGVkdWxlciA9IEFWTV9PUENPREVfUkVHRVg7CisJCQl9CisJCX0KKwl9CisKKworCVdPYmplY3QgKiB0aGVIRVVSSVNUSUMgPSBRdWVyeTo6Z2V0UmVnZXhXU2VxdWVuY2UoZ2V0UGFyYW1ldGVyV09iamVjdCgpLAorCQkJT1JfV0lEMigiaGV1cmlzdGljIiwgIkhFVVJJU1RJQyIpLCB0aGVQUk9QRVJUWSk7CisJaWYoIHRoZUhFVVJJU1RJQyAhPSBXT2JqZWN0OjpfTlVMTF8gKQorCXsKKwkJLy8gdGhlIEp1bXAgSEVJR0hUIGV4cGxvcmF0aW9uIHByb3BlcnR5CisJCWxvbmcgaW50QXR0cmlidXRlID0gUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5SW50KAorCQkJCXRoZUhFVVJJU1RJQywgQ09OU19XSUQyKCJqdW1wIiwgImhlaWdodCIpLCA3KTsKKwkJaWYoIGludEF0dHJpYnV0ZSA8IDAgKQorCQl7CisJCQltSnVtcEhlaWdodCA9IG1KdW1wRGVsdGEgPSA3OworCitBVk1fSUZfREVCVUdfRkxBRyggQ09ORklHVVJJTkcgKQorCUFWTV9PU19MT0cgPDwgIkludmFsaWQganVtcCBoZWlnaHQgISA9PiByZXBsYWNlIGJ5ICIKKwkJCTw8IG1KdW1wRGVsdGEgPDwgIiA+IiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggQ09ORklHVVJJTkcgKQorCQl9CisJCWVsc2UKKwkJeworCQkJbUp1bXBIZWlnaHQgPSBtSnVtcERlbHRhID0gaW50QXR0cmlidXRlOworCQl9CisKKwkJLy8gdGhlIEp1bXAgdHJpYWxzIGxpbWl0IGV4cGxvcmF0aW9uIHByb3BlcnR5CisJCW1KdW1wVHJpYWxzTGltaXQgPSBRdWVyeTo6Z2V0UmVnZXhXUHJvcGVydHlQb3NTaXplVCgKKwkJCXRoZUhFVVJJU1RJQywgQ09OU19XSUQzKCJqdW1wIiwgIih0cmlhbHMiLCAiKT9saW1pdCIpLAorCQkJQVZNX05VTUVSSUNfTUFYX1NJWkVfVCwgQVZNX05VTUVSSUNfTUFYX1NJWkVfVCk7CisKKwkJLy8gdGhlIEhpdCBDT05TRUNVVElWRSB0cmFjZSBmbGFnIHByb3BlcnR5CisJCW1IaXRDb25zZWN1dGl2ZUZsYWcgPSBRdWVyeTo6Z2V0UmVnZXhXUHJvcGVydHlCb29sZWFuKAorCQkJCXRoZUhFVVJJU1RJQywgQ09OU19XSUQyKCJoaXQiLCAiY29uc2VjdXRpdmUiKSwgZmFsc2UpOworCisJCS8vIFRoZSBGb2xkaW5nIEZsYWcgd2hlbiBjaGVja2luZyBUcmFjZSBQb2ludCBzYXRpc2ZpYWJpbGl0eSBpbiBvbmUgRUMKKwkJbUZvbGRpbmdGbGFnICA9IFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eUJvb2xlYW4oCisJCQkJdGhlSEVVUklTVElDLCBDT05TX1dJRDIoImhpdCIsICJmb2xkaW5nIiksIHRydWUpOworCisKKwkJLy8gdGhlIEhpdHRlciBTRUxFQ1RJT04gb25seSBtYXhpbWFsIHByZWZpeCBmbGFnIHByb3BlcnR5CisJCW1IaXRNYXhGbGFnID0gUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5Qm9vbGVhbigKKwkJCQl0aGVIRVVSSVNUSUMsIENPTlNfV0lEMigiaGl0IiwgIm1heCIpLCBmYWxzZSk7CisKKwkJLy8gQ29tcGlsYXRpb24gZm9yIGNvaGVyZW5jZSBhbmQgb3B0aW1pemF0aW9uCisJCWlmKCBtSGl0TWF4RmxhZyApCisJCXsKKwkJCS8vIHRoZSBIaXQgTFVDS1kgd2lzaDogT25seSBvbmUgdHJ5LCBiYWNrdHJhY2tpbmcgb2ZmCisJCQltSGl0THVja3lGbGFnID0gZmFsc2U7CisKKwkJCS8vIEJhY2t0cmFja2luZyBlbmFibGVkICEKKwkJCW1CYWNrdHJhY2tGbGFnID0gdHJ1ZTsKKworCQkJLy8gdGhlIEhpdCBDT1VOVCBzZWxlY3Rpb24gcHJvcGVydHkKKwkJCW1IaXRDb3VudCA9IEFWTV9OVU1FUklDX01BWF9TSVpFX1Q7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyB0aGUgSGl0IExVQ0tZIHdpc2g6IE9ubHkgb25lIHRyeSwgYmFja3RyYWNraW5nIG9mZgorCQkJbUhpdEx1Y2t5RmxhZyA9IFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eUJvb2xlYW4oCisJCQkJCXRoZUhFVVJJU1RJQywgQ09OU19XSUQyKCJoaXQiLCAibHVja3kiKSwgZmFsc2UpOworCisJCQkvLyBCYWNrdHJhY2tpbmcgZW5hYmxlZCA/CisJCQltQmFja3RyYWNrRmxhZyA9IChub3QgbUhpdEx1Y2t5RmxhZyk7CisKKwkJCS8vIHRoZSBIaXQgQ09VTlQgc2VsZWN0aW9uIHByb3BlcnR5CisJCQltSGl0Q291bnQgPSBRdWVyeTo6Z2V0UmVnZXhXUHJvcGVydHlQb3NTaXplVCgKKwkJCQkJdGhlSEVVUklTVElDLCBDT05TX1dJRDIoImhpdCIsICJjb3VudCIpLCAxKTsKKwkJfQorCisKKwkJLy8gdGhlIEp1bXAgQ09VTlQgc2VsZWN0aW9uIHByb3BlcnR5CisJCW1KdW1wQ291bnQgPSBRdWVyeTo6Z2V0UmVnZXhXUHJvcGVydHlQb3NTaXplVCgKKwkJCQl0aGVIRVVSSVNUSUMsIENPTlNfV0lEMigianVtcCIsICJjb3VudCIpLCAxKTsKKworCQkvLyB0aGUgSGl0IEZJTkFMIChhZnRlciBvYmplY3RpdmUgYWNoaWV2ZWQpIGZsYWdzIHByb3BlcnR5IG1IaXRGaW5hbEZsYWcKKwkJbUhpdEZpbmFsRmxhZyA9IFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eUJvb2xlYW4oCisJCQkJdGhlSEVVUklTVElDLCBDT05TX1dJRDIoImhpdCIsICJmaW5hbCIpLCB0cnVlKTsKKworCQkvLyB0aGUgSnVtcCBTTElDRSAoYWZ0ZXIgZWFjaCBoaXQvanVtcCkgZmxhZ3MgcHJvcGVydHkKKwkJbUp1bXBTbGljZUZsYWcgPSAobm90IG1CYWNrdHJhY2tGbGFnKSAmJgorCQkJCVF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eUJvb2xlYW4oCisJCQkJCQl0aGVIRVVSSVNUSUMsIENPTlNfV0lEMigianVtcCIsICJzbGljZSIpLCB0cnVlKTsKKwl9CisJZWxzZQorCXsKKwkJbUNvbmZpZ0ZsYWcgPSBmYWxzZTsKKwl9CisKKworCisJLy8gdGhlIEhpdCBQcm9jZXNzb3IgY29uZmlndXJhdGlvbgorCXN3aXRjaCggc2NoZWR1bGVyICkKKwl7CisJCWNhc2UgQVZNX09QQ09ERV9JTlRFUkxFQVZJTkc6CisJCXsKKwkJCW1IaXRQcm9jZXNzb3IgPSBuZXcgSGl0VW5vcmRlcmVkUHJvY2Vzc29yKCp0aGlzLCBFTlYpOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfU0VRVUVOQ0U6CisJCWNhc2UgQVZNX09QQ09ERV9BVE9NSUNfU0VRVUVOQ0U6CisJCWNhc2UgQVZNX09QQ09ERV9TRVFVRU5DRV9XRUFLOgorCQljYXNlIEFWTV9PUENPREVfUFJJT1JfR1Q6CisJCWNhc2UgQVZNX09QQ09ERV9OVUxMOgorCQlkZWZhdWx0OgorCQl7CisJCQltSGl0UHJvY2Vzc29yID0gbmV3IEhpdE9yZGVyZWRQcm9jZXNzb3IoKnRoaXMsIEVOVik7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmKCBtSGl0UHJvY2Vzc29yLT5jb25maWd1cmUoZ2V0UGFyYW1ldGVyV09iamVjdCgpKSApCisJeworCQlpZiggaXNVbm9yZGVyZWQoKSApCisJCXsKKwkJCS8vbUhpdENvdW50ID0gQVZNX05VTUVSSUNfTUFYX1NJWkVfVDsKKwkJfQorCX0KKwllbHNlCisJeworCQltQ29uZmlnRmxhZyA9IGZhbHNlOworCX0KKworCWVuYWJsZVByZXByb2Nlc3MoIHRoaXMgKTsKKworCWlmKCBtQ29uZmlnRmxhZyApCisJeworCQkvLyBSZWdpc3RyYXRpb24gdG8gaGFuZGxlciBEZXN0cm95Q3R4IGV2ZW50CisJCWdldFN5bWJleEV2ZW50TWFuYWdlcigpLnJlZ2lzdGVySGFuZGxlckV2ZW50RGVzdHJveUN0eCh0aGlzKTsKKwl9CisKKwlyZXR1cm4oIG1Db25maWdGbGFnICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFJFUE9SVCBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgQXZtSGl0T3JKdW1wUHJvY2Vzc29yOjpyZXBvcnRNaW5pbXVtKE91dFN0cmVhbSAmIG9zKSBjb25zdAoreworCW9zIDw8IFRBQiA8PCAiSElUIE9SIEpVTVAgQ292ZXJhZ2UgIgorCQkJPDwgbUNvdmVyYWdlU3RhdGlzdGljcy5zdHJDb3ZlcmFnZVJhdGUobUdvYWxBY2hpZXZlZCkgPDwgIiA9PT4gIgorCQkJPDwgKChtR29hbEFjaGlldmVkIHx8IG1IaXRQcm9jZXNzb3ItPmdvYWxBY2hpZXZlZCgpKSA/CisJCQkJCSJET05FICEiIDogIkZBSUxFRCAhIikKKwkJCTw8IHN0ZDo6ZW5kbDsKKworCWlmKCAobm90IG1IaXRQcm9jZXNzb3ItPmdvYWxBY2hpZXZlZCgpKSAmJiAobm90IG1Hb2FsQWNoaWV2ZWQpCisJCSYmIChtSnVtcFRyaWFsc0NvdW50ID4gbUp1bXBUcmlhbHNMaW1pdCkgKQorCXsKKwkJb3MgPDwgVEFCIDw8ICI+Pj4gUmV0cnkgd2l0aCBhIGdyZWF0ZXIgPCBqdW1wI2xpbWl0PSIKKwkJCQk8PCBtSnVtcFRyaWFsc0xpbWl0IDw8ICIgPiBoZXVyaXN0aWMgYXR0cmlidXRlICEgPDw8IgorCQkJCTw8IHN0ZDo6ZW5kbDsKKwl9CisKKwltSGl0UHJvY2Vzc29yLT5yZXBvcnRNaW5pbXVtKG9zKTsKK30KKworCit2b2lkIEF2bUhpdE9ySnVtcFByb2Nlc3Nvcjo6cmVwb3J0RGVmYXVsdChPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlvcyA8PCBUQUIgPDwgIkhJVCBPUiBKVU1QWyAiIDw8IG1IaXRQcm9jZXNzb3ItPnN0cktpbmQoKQorCQkJPDwgIiA6ICIgPDwgKCBtR2xvYmFsU2VhcmNoU2NvcGVGbGFnID8gImdsb2JhbGx5IiA6ICJsb2NhbGx5IiApCisJCQk8PCAiIF0gPCBoZXVyaXN0aWM6IiA8PCBtSGV1cmlzdGljUHJvcGVydHkubUhldXJpc3RpY0VuYWJsZWQKKwkJCTw8ICIgLCBoZWlnaHQ6IiA8PCBtSnVtcERlbHRhIDw8ICIgLCBoaXQ6IjsKKworCSgobUhpdENvdW50IDwgQVZNX05VTUVSSUNfTUFYX1NJWkVfVCkgPyBvcyA8PCBtSGl0Q291bnQgOiBvcyA8PCAiPGFsbD4iKQorCQkJPDwgIiAsIGp1bXA6IjsKKworCSgobUp1bXBDb3VudCA8IEFWTV9OVU1FUklDX01BWF9TSVpFX1QpID8gb3MgPDwgbUp1bXBDb3VudCA6IG9zIDw8ICI8YWxsPiIpCisJCQk8PCAiIDsgYmFja3RyYWNrOiIgPDwgbUJhY2t0cmFja0ZsYWcgPDwgIjoiCisJCQkJCTw8IG1Db3ZlcmFnZVN0YXRpc3RpY3MubU51bWJlck9mQmFja3RyYWNrCisJCQk8PCAiICwgYmxhY2tfaG9sZToiIDw8IG1Db3ZlcmFnZVN0YXRpc3RpY3Muc3RyQmxhY2tIb2xlUmF0ZSgpCisJCQk8PCAiICwgc2xpY2U6IiA8PCBtU2xpY2VDb3VudCA8PCAiID46IENvdmVyYWdlICIKKwkJCTw8IG1Db3ZlcmFnZVN0YXRpc3RpY3Muc3RyQ292ZXJhZ2VSYXRlKG1Hb2FsQWNoaWV2ZWQpIDw8ICIgPT0+ICIKKwkJCTw8ICgobUdvYWxBY2hpZXZlZCB8fCBtSGl0UHJvY2Vzc29yLT5nb2FsQWNoaWV2ZWQoKSkgPworCQkJCQkiRE9ORSAhIiA6ICJGQUlMRUQgISIpCisJCQk8PCBzdGQ6OmVuZGw7CisKKwlpZiggKG5vdCBtSGl0UHJvY2Vzc29yLT5nb2FsQWNoaWV2ZWQoKSkgJiYgKG5vdCBtR29hbEFjaGlldmVkKQorCQkmJiAobUp1bXBUcmlhbHNDb3VudCA+IG1KdW1wVHJpYWxzTGltaXQpICkKKwl7CisJCW9zIDw8IFRBQiA8PCAiPj4+IFJldHJ5IHdpdGggYSBncmVhdGVyIDwganVtcCNsaW1pdD0iCisJCQkJPDwgbUp1bXBUcmlhbHNMaW1pdCA8PCAiID4gaGV1cmlzdGljIGF0dHJpYnV0ZSAhIDw8PCIKKwkJCQk8PCBzdGQ6OmVuZGw7CisJfQorCisJbUhpdFByb2Nlc3Nvci0+cmVwb3J0RGVmYXVsdChvcyk7CisKKwlvcyA8PCBUQUIgPDwgIkhJVCBPUiBKVU1QWyAiIDw8IG1IaXRQcm9jZXNzb3ItPnN0cktpbmQoKQorCQkJPDwgIiBdIDwgaGV1cmlzdGljOiIgPDwgbUhldXJpc3RpY1Byb3BlcnR5Lm1IZXVyaXN0aWNFbmFibGVkCisJCQk8PCAiICwgaGVpZ2h0OiIgPDwgbUp1bXBEZWx0YSA8PCAiICwgaGl0OiI7CisKKwkoKG1IaXRDb3VudCA8IEFWTV9OVU1FUklDX01BWF9TSVpFX1QpID8gb3MgPDwgbUhpdENvdW50IDogb3MgPDwgIjxhbGw+IikKKwkJCTw8ICIgLCBqdW1wOiI7CisKKwkoKG1KdW1wQ291bnQgPCBBVk1fTlVNRVJJQ19NQVhfU0laRV9UKSA/IG9zIDw8IG1KdW1wQ291bnQgOiBvcyA8PCAiPGFsbD4iKQorCQkJPDwgIiA7IGJhY2t0cmFjazoiIDw8IG1CYWNrdHJhY2tGbGFnIDw8ICI6IgorCQkJCQk8PCBtQ292ZXJhZ2VTdGF0aXN0aWNzLm1OdW1iZXJPZkJhY2t0cmFjaworCQkJPDwgIiAsIGJsYWNrX2hvbGU6IiA8PCBtQ292ZXJhZ2VTdGF0aXN0aWNzLnN0ckJsYWNrSG9sZVJhdGUoKQorCQkJPDwgIiAsIHNsaWNlOiIgPDwgbVNsaWNlQ291bnQgPDwgIiA+OiBDb3ZlcmFnZSAiCisJCQk8PCBtQ292ZXJhZ2VTdGF0aXN0aWNzLnN0ckNvdmVyYWdlUmF0ZShtR29hbEFjaGlldmVkKSA8PCAiID09PiAiCisJCQk8PCAoKG1Hb2FsQWNoaWV2ZWQgfHwgbUhpdFByb2Nlc3Nvci0+Z29hbEFjaGlldmVkKCkpID8KKwkJCQkJIkRPTkUgISIgOiAiRkFJTEVEICEiKQorCQkJPDwgRU9MX0ZMVVNIOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBOT04tUkVHUkVTU0lPTiBURVNUIEFQSQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBBdm1IaXRPckp1bXBQcm9jZXNzb3I6OnRkZFJlZ3Jlc3Npb25SZXBvcnRJbXBsKE91dFN0cmVhbSAmIG9zKQoreworCW9zIDw8IFRBQiA8PCAiSElUIE9SIEpVTVAgQ09WRVJBR0UgOiAiCisJCQk8PCBtQ292ZXJhZ2VTdGF0aXN0aWNzLnN0ckNvdmVyYWdlUmF0ZSgpIDw8ICIgPT0+ICIKKwkJCTw8IChtSGl0UHJvY2Vzc29yLT5nb2FsQWNoaWV2ZWQoKSA/ICJET05FICEiIDogIkZBSUxFRCAhIikKKwkJCTw8IEVPTF9GTFVTSDsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFBST0NFU1MgQVBJCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvL2Jvb2wgQXZtSGl0T3JKdW1wUHJvY2Vzc29yOjpwcmVwcm9jZXNzKCkKKy8veworLy8JcmV0dXJuKCB0cnVlICk7CisvL30KKy8vCisvLworLy9ib29sIEF2bUhpdE9ySnVtcFByb2Nlc3Nvcjo6cG9zdHByb2Nlc3MoKQorLy97CisvLwkvL0Jhc2VDb3ZlcmFnZUZpbHRlcjo6cG9zdHByb2Nlc3MoKTsKKy8vCisvLwlyZXR1cm4oIHRydWUgKTsKKy8vfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBQUkUtRklMVEVSIEFQSQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBBdm1IaXRPckp1bXBQcm9jZXNzb3I6OmZpbHRlcmluZ0luaXRpYWxpemUoKQoreworCS8vIFByZXNlcnZlIGV2ZXJ5IHJvb3QgY29udGV4dAorCW1MaXN0T2ZQb3NpdGl2ZUVDLmFwcGVuZCggZ2V0RXhlY3V0aW9uUXVldWUoKS5nZXRJbml0UXVldWUoKSApOworCW1Jbml0aWFsUm9vdEVDLmFwcGVuZCggZ2V0RXhlY3V0aW9uUXVldWUoKS5nZXRJbml0UXVldWUoKSApOworCisJaWYoIG1HbG9iYWxTZWFyY2hTY29wZUZsYWcgKQorCXsKKwkJbVJlbGF0aXZlUm9vdEVDLmFwcGVuZCggZ2V0RXhlY3V0aW9uUXVldWUoKS5nZXRJbml0UXVldWUoKSApOworCX0KKwllbHNlIGlmKCBnZXRFeGVjdXRpb25RdWV1ZSgpLmhhc0luaXQoKSApCisJeworCQltQnVmZmVyTG9jYWxSb290RUMuc3BsaWNlKCBnZXRFeGVjdXRpb25RdWV1ZSgpLmdldEluaXRRdWV1ZSgpICk7CisKKwkJbVJlbGF0aXZlUm9vdEVDLmFwcGVuZCggbUJ1ZmZlckxvY2FsUm9vdEVDLmZyb250KCkgKTsKKworCQkvLyBGaXJzdCAgSnVtcCBIZWlnaHQhCisJCW1KdW1wSGVpZ2h0ID0gbUp1bXBEZWx0YSArIG1CdWZmZXJMb2NhbFJvb3RFQy5mcm9udCgpLT5nZXRIZWlnaHQoKTsKKworCQlnZXRFeGVjdXRpb25RdWV1ZSgpLmdldEluaXRRdWV1ZSgpLmFwcGVuZCggbUJ1ZmZlckxvY2FsUm9vdEVDLmZyb250KCkgKTsKKworCQltQnVmZmVyTG9jYWxSb290RUMucG9wX2Zyb250KCk7CisJfQorCisJbUFic29sdXRlU3RvcENvbnRleHRGbGFnID0gdHJ1ZTsKKworCW1KdW1wVHJpYWxzQ291bnQgPSAwOworCisJZ2V0U3ltYmV4UmVxdWVzdE1hbmFnZXIoKS5wb3N0UmVxdWVzdENvbnRpbnVlKCB0aGlzICk7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCitib29sIEF2bUhpdE9ySnVtcFByb2Nlc3Nvcjo6cHJlZmlsdGVyKCkKK3sKKwllY1F1ZXVlID0gJiggZ2V0RXhlY3V0aW9uUXVldWUoKS5nZXRSZWFkeVF1ZXVlKCkgKTsKKworCW1BYnNvbHV0ZVN0b3BDb250ZXh0RmxhZyA9IGZhbHNlOworCisJaWYoIGVjUXVldWUtPm5vbmVtcHR5KCkgKQorCXsKKwkJZWNRdWV1ZUl0ID0gZWNRdWV1ZS0+YmVnaW4oKTsKKwkJZWNRdWV1ZUl0RW5kID0gZWNRdWV1ZS0+ZW5kKCk7CisJCWZvciggOyBlY1F1ZXVlSXQgIT0gZWNRdWV1ZUl0RW5kIDsgKQorCQl7CisvLwkJCXByZWZpbHRlcigqZWNRdWV1ZUl0KTsKKworCQkJaWYoIG1IaXRQcm9jZXNzb3ItPmdvYWxXaWxsTmV2ZXJBY2hpZXZlZCggKmVjUXVldWVJdCApICkKKwkJCXsKKwkJCQllY1F1ZXVlSXQgPSBlY1F1ZXVlLT5lcmFzZSggZWNRdWV1ZUl0ICk7CisJCQl9CisKKwkJCWVsc2UgaWYoICgqZWNRdWV1ZUl0KS0+Z2V0SGVpZ2h0KCkgPj0gbUp1bXBIZWlnaHQgKQorCQkJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCUFWTV9PU19UUkFDRSA8PCAiPDw8PDwganVtcDwgMSA+ID4+Pj4+IEVDPCBpZDoiCisJCQk8PCAoKmVjUXVldWVJdCktPmdldElkTnVtYmVyKCkgPDwgIiA+IiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFBST0NFU1NPUiApCisKKwkJCQltUmVsYXRpdmVMZWFmRUMuYXBwZW5kKCAqZWNRdWV1ZUl0ICk7CisKKwkJCQllY1F1ZXVlSXQgPSBlY1F1ZXVlLT5lcmFzZSggZWNRdWV1ZUl0ICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJKytlY1F1ZXVlSXQ7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4oIGdldEV4ZWN1dGlvblF1ZXVlKCkuaGFzUmVhZHkoKSApOworfQorCisKK2Jvb2wgQXZtSGl0T3JKdW1wUHJvY2Vzc29yOjpwcmVmaWx0ZXIoRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpCit7CisJaWYoIG1IaXRQcm9jZXNzb3ItPmdvYWxBY2hpZXZlZCgpICYmIG1TdG9wRmxhZyApCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworLyoqCisgKiBQUk9DRVNTT1IgUkVRVUVTVCBBUEkgOj4gQ09OSVROVUUKKyAqIEp1bXAgc3RlcAorICovCit2b2lkIEF2bUhpdE9ySnVtcFByb2Nlc3Nvcjo6aGFuZGxlUmVxdWVzdENvbnRpbnVlKCkKK3sKKwlpZiggbVJlbGF0aXZlUm9vdEVDLmVtcHR5KCkgKQorCXsKKwkJaWYoIG5vdCBob2pCYWNrdHJhY2soKSApCisJCXsKKwkJCWdldFN5bWJleFJlcXVlc3RNYW5hZ2VyKCkucG9zdFJlcXVlc3RHb2FsQWNoaWV2ZWQoIHRoaXMgKTsKKwkJfQorCisJCXJldHVybjsKKwl9CisKKwlpZiggbUhpdFByb2Nlc3Nvci0+aGl0KG1KdW1wSGVpZ2h0KSApCisJeworCQltU2VsZWN0aW9uQ291bnQgPSBtSGl0Q291bnQ7CisKKwkJbUhpdENhc2VGbGFnID0gdHJ1ZTsKKworCQlpZiggbUhpdFByb2Nlc3Nvci0+Z29hbEFjaGlldmVkKCkgKQorCQl7CisJCQltR29hbEFjaGlldmVkID0gdHJ1ZTsKKworCQkJaWYoIG1IaXRGaW5hbEZsYWcgfHwgbUhpdE1heEZsYWcgKQorCQkJeworCQkJCWhvalNlbGVjdGlvbkZpbmFsKCk7CisJCQl9CisKKwkJCWlmKCBtSGl0TWF4RmxhZyAmJiBob2pCYWNrdHJhY2soKSApCisJCQl7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQlnZXRTeW1iZXhSZXF1ZXN0TWFuYWdlcigpLnBvc3RSZXF1ZXN0R29hbEFjaGlldmVkKCB0aGlzICk7CisKKwkJCWlmKCBtU3RvcEZsYWcgKQorCQkJeworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCX0KKwllbHNlIGlmKCBtSGl0Q29uc2VjdXRpdmVGbGFnICYmIChtQ292ZXJhZ2VTdGF0aXN0aWNzLm1OdW1iZXJPZkNvdmVyZWQgPiAwKSApCisJeworCQlnZXRTeW1iZXhSZXF1ZXN0TWFuYWdlcigpLnBvc3RSZXF1ZXN0R29hbEFjaGlldmVkKCB0aGlzICk7CisKKwkJcmV0dXJuOworCX0KKwllbHNlCisJeworCQltU2VsZWN0aW9uQ291bnQgPSBtSnVtcENvdW50OworCisJCW1IaXRDYXNlRmxhZyA9IGZhbHNlOworCX0KKworCWlmKCBtUmVsYXRpdmVMZWFmRUMubm9uZW1wdHkoKSApCisJeworCQlob2pTZWxlY3Rpb24oKTsKKwl9CisJZWxzZQorCXsKKwkJLy8gTG9jYWxseSBzbGljZSBpZiBtSnVtcFNsaWNlRmxhZworCQlqdW1wU2xpY2UoKTsKKworCQlpZiggbUJhY2t0cmFja0ZsYWcgJiYgaG9qQmFja3RyYWNrKCkgKQorCQl7CisJCQlyZXR1cm47CisJCX0KKworCQltQWJzb2x1dGVTdG9wQ29udGV4dEZsYWcgPSB0cnVlOworCisJCW1SZWxhdGl2ZVJvb3RFQy5jbGVhcigpOworCX0KKworCisJaWYoICsrbUp1bXBUcmlhbHNDb3VudCA+IG1KdW1wVHJpYWxzTGltaXQgKQorCXsKKwkJZ2V0U3ltYmV4UmVxdWVzdE1hbmFnZXIoKS5wb3N0UmVxdWVzdEdvYWxBY2hpZXZlZCggdGhpcyApOworCisJCXJldHVybjsKKwl9CisKKwllbHNlIGlmKCBtQWJzb2x1dGVTdG9wQ29udGV4dEZsYWcgKQorCXsKKwkJbUNvdmVyYWdlU3RhdGlzdGljcy5jb3B5SWZCZXN0Q292ZXJhZ2VSYXRlKG1GaW5hbENvdmVyYWdlU3RhdGlzdGljcyk7CisKKwkJZ2V0U3ltYmV4UmVxdWVzdE1hbmFnZXIoKS5wb3N0UmVxdWVzdEdvYWxBY2hpZXZlZCggdGhpcyApOworCX0KKwllbHNlIGlmKCBtUmVsYXRpdmVSb290RUMubm9uZW1wdHkoKSApCisJeworCQlnZXRTeW1iZXhSZXF1ZXN0TWFuYWdlcigpLnBvc3RSZXF1ZXN0Q29udGludWUoIHRoaXMgKTsKKworCQlnZXRFeGVjdXRpb25RdWV1ZSgpLmFwcGVuZFJlYWR5KCBtUmVsYXRpdmVSb290RUMgKTsKKworCQltSnVtcEhlaWdodCA9IG1KdW1wSGVpZ2h0ICsgbUp1bXBEZWx0YTsKKworCQltQWJzb2x1dGVTdG9wQ29udGV4dEZsYWcgPSB0cnVlOworCX0KKworCWVsc2UgaWYoIG5vdCBob2pCYWNrdHJhY2soKSApCisJeworCQlnZXRTeW1iZXhSZXF1ZXN0TWFuYWdlcigpLnBvc3RSZXF1ZXN0R29hbEFjaGlldmVkKCB0aGlzICk7CisJfQorfQorCisKKy8qKgorICogUFJPQ0VTU09SIFJFUVVFU1QgQVBJIDo+IEdPQUxfQUNISUVWRUQKKyAqIEVuZGluZyAocG9zaXRpdmUgb3IgbmVnYXRpdmUpIGxvY2FsbHkgb3IgZ2xvYmFsbHkgb2JqZWN0aXZlCisgKi8KK3ZvaWQgQXZtSGl0T3JKdW1wUHJvY2Vzc29yOjpoYW5kbGVSZXF1ZXN0R29hbEFjaGlldmVkKCkKK3sKKwlpZiggbUdsb2JhbFNlYXJjaFNjb3BlRmxhZyB8fCBtQnVmZmVyTG9jYWxSb290RUMuZW1wdHkoKSApCisJeworLy8JCW1Hb2FsQWNoaWV2ZWQgPSB0cnVlOworCisJCWdldFN5bWJleFJlcXVlc3RNYW5hZ2VyKCkucG9zdFJlcXVlc3RTdG9wKCB0aGlzICk7CisJfQorCWVsc2UKKwl7CisJCWdldEV4ZWN1dGlvblF1ZXVlKCkuaGFuZGxlUmVxdWVzdFN0b3AoKTsKKworCQltUmVsYXRpdmVSb290RUMuY2xlYXIoKTsKKwkJbVJlbGF0aXZlUm9vdEVDLmFwcGVuZCggbUJ1ZmZlckxvY2FsUm9vdEVDLmZyb250KCkgKTsKKworCisJCS8vIFJlaW5pdGlhbGl6ZSBwYXJhbWV0ZXJzIGZvciByZXN0YXJ0aW5nOworCQltSnVtcEhlaWdodCA9IG1KdW1wRGVsdGEgKyBtQnVmZmVyTG9jYWxSb290RUMuZnJvbnQoKS0+Z2V0SGVpZ2h0KCk7CisJCW1IaXRQcm9jZXNzb3ItPnJlc2V0Q29uZmlnKCk7CisJCW1Db3ZlcmFnZVN0YXRpc3RpY3MucmVzZXRDb3ZlcmFnZUNvdW50ZXIoKTsKKworCisJCWdldEV4ZWN1dGlvblF1ZXVlKCkucHVzaFdhaXRpbmcoIG1CdWZmZXJMb2NhbFJvb3RFQy5mcm9udCgpICk7CisKKwkJbUJ1ZmZlckxvY2FsUm9vdEVDLnBvcF9mcm9udCgpOworCisJCW1BYnNvbHV0ZVN0b3BDb250ZXh0RmxhZyA9IHRydWU7CisKKwkJbUp1bXBUcmlhbHNDb3VudCA9IDA7CisKKwkJZ2V0U3ltYmV4UmVxdWVzdE1hbmFnZXIoKS5wb3N0UmVxdWVzdENvbnRpbnVlKCB0aGlzICk7CisJfQorfQorCisKK2Jvb2wgQXZtSGl0T3JKdW1wUHJvY2Vzc29yOjpob2pCYWNrdHJhY2soKQoreworCWlmKCBtQmFja3RyYWNrSGl0RUMuZW1wdHkoKSApCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJbUZpbmFsQ292ZXJhZ2VTdGF0aXN0aWNzLmNvcHlJZkJlc3RDb3ZlcmFnZVJhdGUoIG1Db3ZlcmFnZVN0YXRpc3RpY3MgKTsKKworCSsrKCBtRmluYWxDb3ZlcmFnZVN0YXRpc3RpY3MubU51bWJlck9mQmFja3RyYWNrICk7CisJKysoIG1Db3ZlcmFnZVN0YXRpc3RpY3MubU51bWJlck9mQmFja3RyYWNrICk7CisKKwltQmFja3RyYWNrSGl0RUMucG9wX2xhc3RfdG8oIHRtcEVDICk7CisJZ2V0RXhlY3V0aW9uUXVldWUoKS5wdXNoV2FpdGluZyggdG1wRUMgKTsKKworCW1Db3ZlcmFnZVN0YXRpc3RpY3MgPSB0bXBFQy0+Z2V0VW5pcUluZm9ybWF0aW9uKCktPgorCQkJZ2V0VW5pcUhpdE9ySnVtcE9iamVjdGl2ZUluZm8oKS0+CisJCQlnZXRDb3ZlcmFnZVN0YXRpc3RpY3MoKTsKKworCW1KdW1wSGVpZ2h0ID0gdG1wRUMtPmdldEhlaWdodCgpICsgbUp1bXBEZWx0YTsKKworCW1SZWxhdGl2ZVJvb3RFQy5jbGVhcigpOworCW1SZWxhdGl2ZVJvb3RFQy5hcHBlbmQoIHRtcEVDICk7CisKKwltQWJzb2x1dGVTdG9wQ29udGV4dEZsYWcgPSB0cnVlOworCisJZ2V0U3ltYmV4UmVxdWVzdE1hbmFnZXIoKS5wb3N0UmVxdWVzdENvbnRpbnVlKCB0aGlzICk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9HVEVfTUVESVVNCisJQVZNX09TX0NPVVQgIDw8ICI8PDw8PCBIb0ogQmFja3RyYWNrIEVDPCBpZDoiCisJCQk8PCB0bXBFQy0+Z2V0SWROdW1iZXIoKSA8PCAiID4gd2hlcmUgIgorCQkJPDwgbUNvdmVyYWdlU3RhdGlzdGljcy5zdHJDb3ZlcmFnZVJhdGUoKSA8PCAiID4+Pj4+IiA8PCBzdGQ6OmVuZGw7CisJQVZNX09TX1RSQUNFIDw8ICI8PDw8PCBIb0ogQmFja3RyYWNrIEVDPCBpZDoiCisJCQk8PCB0bXBFQy0+Z2V0SWROdW1iZXIoKSA8PCAiID4gd2hlcmUgIgorCQkJPDwgbUNvdmVyYWdlU3RhdGlzdGljcy5zdHJDb3ZlcmFnZVJhdGUoKSA8PCAiID4+Pj4+IiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfR1RFX01FRElVTQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKwordm9pZCBBdm1IaXRPckp1bXBQcm9jZXNzb3I6OmhvalNlbGVjdGlvbigpCit7CitBVk1fSUZfREVCVUdfTEVWRUxfR1RFX01FRElVTQorCUFWTV9PU19DT1VUICA8PCAiPDw8PDwgSG9KIENvdmVyYWdlIDogIgorCQkJPDwgbUNvdmVyYWdlU3RhdGlzdGljcy5zdHJDb3ZlcmFnZVJhdGUoKSA8PCAiID4+Pj4+IiA8PCBzdGQ6OmVuZGw7CisJQVZNX09TX1RSQUNFIDw8ICI8PDw8PCBIb0ogQ292ZXJhZ2UgOiAiCisJCQk8PCBtQ292ZXJhZ2VTdGF0aXN0aWNzLnN0ckNvdmVyYWdlUmF0ZSgpIDw8ICIgPj4+Pj4iIDw8IHN0ZDo6ZW5kbDsKKworCS8vISEgY3VycmVudCBSZWxhdGl2ZSBSb290JiBMZWFmIEVDCisJRXhlY3V0aW9uQ29udGV4dDo6dHJhY2VNaW5pbXVtKEFWTV9PU19UUkFDRSwKKwkJCW1SZWxhdGl2ZVJvb3RFQywgInRoZSBSZWxhdGl2ZSBSb290IEVDIik7CisKKwlFeGVjdXRpb25Db250ZXh0Ojp0cmFjZU1pbmltdW0oQVZNX09TX1RSQUNFLAorCQkJbVJlbGF0aXZlTGVhZkVDLCAidGhlIFJlbGF0aXZlIExlYWYgRUMiKTsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9HVEVfTUVESVVNCisKKworCS8vIFJlbW92ZSBFQyB3aGVuIFBhcmVudCBpcyBpbiBhbnkgQmxhY2tMaXN0CisJdXBkYXRlUmVsYXRpdmVMZWFmKCk7CisKKwkvLyBIaXQgb3IgSlVNUAorCW1SZWxhdGl2ZVJvb3RFQy5jbGVhcigpOworCisJbGVhZkNvdW50ID0gbVJlbGF0aXZlTGVhZkVDLnNpemUoKTsKKworCWlmKCBsZWFmQ291bnQgPT0gMCApCisJeworCQkvLyBMb2NhbGx5IHNsaWNlIGlmIG1KdW1wU2xpY2VGbGFnCisJCWp1bXBTbGljZSgpOworCisJCXJldHVybjsKKwl9CisKKwlyYW5kb21NYXggPSBsZWFmQ291bnQgLSAxOworCisJaWYoIChtU2VsZWN0aW9uQ291bnQgPT0gMSkgfHwgKGxlYWZDb3VudCA9PSAxKSApCisJeworCQlqdW1wT2Zmc2V0ID0gKGxlYWZDb3VudCA9PSAxKSA/IDAgOiBSQU5ET006Omdlbl91aW50KDAsIHJhbmRvbU1heCk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfVFJBQ0UgPDwgIjw8PDw8IGp1bXA8IDAgPiA+Pj4+PiBFQzwgaWQ6IgorCQkJPDwgbVJlbGF0aXZlTGVhZkVDW2p1bXBPZmZzZXRdLT5nZXRJZE51bWJlcigpIDw8ICIgPiIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCisJCWlmKCBtSGl0Q2FzZUZsYWcgKQorCQl7CisJCQltSGl0UHJvY2Vzc29yLT5oaXRTZWxlY3QoIGp1bXBPZmZzZXQgKTsKKwkJfQorCQllbHNlIGlmKCBtQmFja3RyYWNrRmxhZyApCisJCXsKKwkJCW1CYWNrdHJhY2tIaXRFQy5yZW1vdmUoIG1SZWxhdGl2ZUxlYWZFQ1tqdW1wT2Zmc2V0XSApOworCQl9CisKKwkJbVJlbGF0aXZlUm9vdEVDLmFwcGVuZCggbVJlbGF0aXZlTGVhZkVDW2p1bXBPZmZzZXRdICk7CisJfQorCisJZWxzZSBpZiggbVNlbGVjdGlvbkNvdW50IDwgbGVhZkNvdW50ICkKKwl7CisJCWp1bXBPZmZzZXRCaXRzZXQucmVzZXQoKTsKKwkJanVtcE9mZnNldEJpdHNldC5yZXNpemUobGVhZkNvdW50LCBmYWxzZSk7CisKKwkJZm9yKCBsZWFmT2Zmc2V0ID0gMCA7IGxlYWZPZmZzZXQgPCBtU2VsZWN0aW9uQ291bnQgOyArK2xlYWZPZmZzZXQgKQorCQl7CisJCQlkbworCQkJeworCQkJCWp1bXBPZmZzZXQgPSBSQU5ET006Omdlbl91aW50KDAsIHJhbmRvbU1heCk7CisJCQl9CisJCQl3aGlsZSgganVtcE9mZnNldEJpdHNldFtqdW1wT2Zmc2V0XSApOworCisJCQlqdW1wT2Zmc2V0Qml0c2V0W2p1bXBPZmZzZXRdID0gdHJ1ZTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCUFWTV9PU19UUkFDRSA8PCAiPDw8PDwganVtcDwgMCA+ID4+Pj4+IEVDPCBpZDoiCisJCQk8PCBtUmVsYXRpdmVMZWFmRUNbanVtcE9mZnNldF0tPmdldElkTnVtYmVyKCkgPDwgIiA+IiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFBST0NFU1NPUiApCisKKwkJCWlmKCBtSGl0Q2FzZUZsYWcgKQorCQkJeworCQkJCW1IaXRQcm9jZXNzb3ItPmhpdFNlbGVjdCgganVtcE9mZnNldCApOworCQkJfQorCQkJZWxzZSBpZiggbUJhY2t0cmFja0ZsYWcgKQorCQkJeworCQkJCW1CYWNrdHJhY2tIaXRFQy5yZW1vdmUoIG1SZWxhdGl2ZUxlYWZFQ1tqdW1wT2Zmc2V0XSApOworCQkJfQorCisJCQltUmVsYXRpdmVSb290RUMuYXBwZW5kKCBtUmVsYXRpdmVMZWFmRUNbanVtcE9mZnNldF0gKTsKKwkJfQorCX0KKworCWVsc2UKKwl7CisJCWZvciggbGVhZk9mZnNldCA9IDAgOyBsZWFmT2Zmc2V0IDwgbGVhZkNvdW50IDsgKytsZWFmT2Zmc2V0ICkKKwkJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCUFWTV9PU19UUkFDRSA8PCAiPDw8PDwganVtcDwgMCA+ID4+Pj4+IEVDPCBpZDoiCisJCQk8PCBtUmVsYXRpdmVMZWFmRUNbbGVhZk9mZnNldF0tPmdldElkTnVtYmVyKCkgPDwgIiA+IiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFBST0NFU1NPUiApCisKKwkJCWlmKCBtSGl0Q2FzZUZsYWcgKQorCQkJeworCQkJCW1IaXRQcm9jZXNzb3ItPmhpdFNlbGVjdCggbGVhZk9mZnNldCApOworCQkJfQorCQkJZWxzZSBpZiggbUJhY2t0cmFja0ZsYWcgKQorCQkJeworCQkJCW1CYWNrdHJhY2tIaXRFQy5yZW1vdmUoIG1SZWxhdGl2ZUxlYWZFQ1tqdW1wT2Zmc2V0XSApOworCQkJfQorCisJCQltUmVsYXRpdmVSb290RUMuYXBwZW5kKCBtUmVsYXRpdmVMZWFmRUNbbGVhZk9mZnNldF0gKTsKKwkJfQorCX0KKworCW1SZWxhdGl2ZUxlYWZFQy5jbGVhcigpOworCisJLy8gTG9jYWxseSBzbGljZSBpZiBtSnVtcFNsaWNlRmxhZworCWp1bXBTbGljZSgpOworCisKK0FWTV9JRl9ERUJVR19MRVZFTF9HVEVfTUVESVVNCisJQVZNX09TX1RSQUNFIDw8ICI8PDw8PCBIb0ogQ292ZXJhZ2UgOiAiCisJCQk8PCBtQ292ZXJhZ2VTdGF0aXN0aWNzLnN0ckNvdmVyYWdlUmF0ZSgpIDw8ICIgPj4+Pj4iIDw8IHN0ZDo6ZW5kbDsKKworCS8vISEgTmV4dCBSZWxhdGl2ZSBSb290IEVDCisJRXhlY3V0aW9uQ29udGV4dDo6dHJhY2VNaW5pbXVtKEFWTV9PU19UUkFDRSwKKwkJCW1SZWxhdGl2ZVJvb3RFQywgInRoZSBSZWxhdGl2ZSBSb290IEVDIik7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfR1RFX01FRElVTQorfQorCisKK3ZvaWQgQXZtSGl0T3JKdW1wUHJvY2Vzc29yOjpob2pTZWxlY3Rpb25GaW5hbCgpCit7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFBST0NFU1NPUiApCisJQVZNX09TX0NPVVQgIDw8ICI8PDw8PCBIb0ogR29hbCBBY2hpZXZlZCA6ICIKKwkJCTw8IG1Db3ZlcmFnZVN0YXRpc3RpY3Muc3RyQ292ZXJhZ2VSYXRlKCkgPDwgIiA+Pj4+PiIgPDwgc3RkOjplbmRsOworCUFWTV9PU19UUkFDRSA8PCAiPDw8PDwgSG9KIEdvYWwgQWNoaWV2ZWQgOiAiCisJCQk8PCBtQ292ZXJhZ2VTdGF0aXN0aWNzLnN0ckNvdmVyYWdlUmF0ZSgpIDw8ICIgPj4+Pj4iIDw8IHN0ZDo6ZW5kbDsKKworCUV4ZWN1dGlvbkNvbnRleHQ6OnRyYWNlTWluaW11bShBVk1fT1NfVFJBQ0UsCisJCQltUmVsYXRpdmVMZWFmRUMsICJ0aGUgUmVsYXRpdmUgTGVhZiBFQyIpOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCisJLy8gSGl0IEZpbmFsCisJbVJlbGF0aXZlUm9vdEVDLmNsZWFyKCk7CisKKwlpZiggbUhpdE1heEZsYWcgKQorCXsKKwkJbVNlbGVjdGlvbkNvdW50ID0gbVJlbGF0aXZlTGVhZkVDLnNpemUoKTsKKwl9CisKKwlsZWFmQ291bnQgPSBtUmVsYXRpdmVMZWFmRUMuc2l6ZSgpOworCXJhbmRvbU1heCA9IGxlYWZDb3VudCAtIDE7CisKKwlpZiggKG1TZWxlY3Rpb25Db3VudCA9PSAxKSB8fCAobGVhZkNvdW50ID09IDEpICkKKwl7CisJCWp1bXBPZmZzZXQgPSAobGVhZkNvdW50ID09IDEpID8gMCA6IFJBTkRPTTo6Z2VuX3VpbnQoMCwgcmFuZG9tTWF4KTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCUFWTV9PU19UUkFDRSA8PCAiPDw8PDwganVtcDwgZ29hbCBhY2hpZXZlZCA+ID4+Pj4+IEVDPCBpZDoiCisJCQk8PCBtUmVsYXRpdmVMZWFmRUNbanVtcE9mZnNldF0tPmdldElkTnVtYmVyKCkgPDwgIiA+IiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFBST0NFU1NPUiApCisKKwkJbVJlbGF0aXZlTGVhZkVDW2p1bXBPZmZzZXRdLT5nZXR3RmxhZ3MoKS5zZXRPYmplY3RpdmVBY2hpZXZlZFRyYWNlKCk7CisKKwkJbUxpc3RPZlBvc2l0aXZlRUMuYXBwZW5kKCBtUmVsYXRpdmVMZWFmRUNbanVtcE9mZnNldF0gKTsKKwl9CisKKwllbHNlIGlmKCBtU2VsZWN0aW9uQ291bnQgPCBsZWFmQ291bnQgKQorCXsKKwkJanVtcE9mZnNldEJpdHNldC5yZXNldCgpOworCQlqdW1wT2Zmc2V0Qml0c2V0LnJlc2l6ZShsZWFmQ291bnQsIGZhbHNlKTsKKworCQlmb3IoIGxlYWZPZmZzZXQgPSAwIDsgbGVhZk9mZnNldCA8IG1TZWxlY3Rpb25Db3VudCA7ICsrbGVhZk9mZnNldCApCisJCXsKKwkJCWRvCisJCQl7CisJCQkJanVtcE9mZnNldCA9IFJBTkRPTTo6Z2VuX3VpbnQoMCwgcmFuZG9tTWF4KTsKKwkJCX0KKwkJCXdoaWxlKCBqdW1wT2Zmc2V0Qml0c2V0W2p1bXBPZmZzZXRdICk7CisKKwkJCWp1bXBPZmZzZXRCaXRzZXRbanVtcE9mZnNldF0gPSB0cnVlOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFBST0NFU1NPUiApCisJQVZNX09TX1RSQUNFIDw8ICI8PDw8PCBqdW1wPCBnb2FsIGFjaGlldmVkID4gPj4+Pj4gRUM8IGlkOiIKKwkJCTw8IG1SZWxhdGl2ZUxlYWZFQ1tqdW1wT2Zmc2V0XS0+Z2V0SWROdW1iZXIoKSA8PCAiID4iIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgUFJPQ0VTU09SICkKKworCQkJbVJlbGF0aXZlTGVhZkVDW2p1bXBPZmZzZXRdLT5nZXR3RmxhZ3MoKS5zZXRPYmplY3RpdmVBY2hpZXZlZFRyYWNlKCk7CisKKwkJCW1MaXN0T2ZQb3NpdGl2ZUVDLmFwcGVuZCggbVJlbGF0aXZlTGVhZkVDW2p1bXBPZmZzZXRdICk7CisJCX0KKwl9CisKKwllbHNlCisJeworCQlmb3IoIGxlYWZPZmZzZXQgPSAwIDsgbGVhZk9mZnNldCA8IGxlYWZDb3VudCA7ICsrbGVhZk9mZnNldCApCisJCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfVFJBQ0UgPDwgIjw8PDw8IGp1bXA8IGdvYWwgYWNoaWV2ZWQgPiA+Pj4+PiBFQzwgaWQ6IgorCQkJPDwgbVJlbGF0aXZlTGVhZkVDW2xlYWZPZmZzZXRdLT5nZXRJZE51bWJlcigpIDw8ICIgPiIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCisJCQltUmVsYXRpdmVMZWFmRUNbanVtcE9mZnNldF0tPmdldHdGbGFncygpLnNldE9iamVjdGl2ZUFjaGlldmVkVHJhY2UoKTsKKworCQkJbUxpc3RPZlBvc2l0aXZlRUMuYXBwZW5kKCBtUmVsYXRpdmVMZWFmRUNbbGVhZk9mZnNldF0gKTsKKwkJfQorCX0KKworCW1SZWxhdGl2ZUxlYWZFQy5jbGVhcigpOworCisJLy8gTG9jYWxseSBzbGljZSBpZiBtSnVtcFNsaWNlRmxhZworCWp1bXBTbGljZSgpOworCisKK0FWTV9JRl9ERUJVR19MRVZFTF9HVEVfTUVESVVNCisJQVZNX09TX1RSQUNFIDw8ICI8PDw8PCBIb0ogQ292ZXJhZ2UgOiAiCisJCQk8PCBtQ292ZXJhZ2VTdGF0aXN0aWNzLnN0ckNvdmVyYWdlUmF0ZSgpIDw8ICIgPj4+Pj4iIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9HVEVfTUVESVVNCit9CisKKwordm9pZCBBdm1IaXRPckp1bXBQcm9jZXNzb3I6OnVwZGF0ZVJlbGF0aXZlTGVhZigpCit7CisJanVtcE9mZnNldCA9IDA7CisJbGVhZkNvdW50ID0gbVJlbGF0aXZlTGVhZkVDLnNpemUoKTsKKworCS8vIFBvc2l0aW9uIGZvciBMZWZ0IFNoaWZ0IG9mIG5vbi1CbGFja0xpc3RlZCBDb250ZXh0IExlYWYKKwlyYW5kb21NYXggPSBsZWFmQ291bnQ7CisKKwkvLyBNYXJrIEJsYWNrbGlzdGVkIENvbnRleHQgTGVhZiB1c2luZyBOVUxMCisJZm9yKCBsZWFmT2Zmc2V0ID0gMCA7IGxlYWZPZmZzZXQgPCBsZWFmQ291bnQgOyArK2xlYWZPZmZzZXQgKQorCXsKKwkJdG1wRUMgPSBtUmVsYXRpdmVMZWFmRUNbbGVhZk9mZnNldF07CisKKwkJaWYoIG1BYnNvbHV0ZUxlYWZFQy5jb250YWlucyggdG1wRUMgKSApCisJCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfVFJBQ0UgPDwgIjw8PDw8IGhvajwgbGVhZiBmYWlsZWQgPiA+Pj4+PiBFQzwgaWQ6IgorCQkJPDwgbVJlbGF0aXZlTGVhZkVDW2xlYWZPZmZzZXRdLT5nZXRJZE51bWJlcigpIDw8ICIgPiIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCisJCQltUmVsYXRpdmVMZWFmRUNbbGVhZk9mZnNldF0gPSBOVUxMOworCisJCQlpZiggcmFuZG9tTWF4ID09IGxlYWZDb3VudCApCisJCQl7CisJCQkJcmFuZG9tTWF4ID0gbGVhZk9mZnNldDsKKwkJCX0KKworCQkJY29udGludWU7CisJCX0KKworCQlmb3IoIGp1bXBPZmZzZXQgPSAwIDsganVtcE9mZnNldCA8IG1KdW1wRGVsdGEgOyArK2p1bXBPZmZzZXQgKQorCQl7CisJCQlpZiggdG1wRUMtPmlzUm9vdCgpIHx8IG1Jbml0aWFsUm9vdEVDLmNvbnRhaW5zKHRtcEVDKSApCisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlIGlmKCBtQmxhY2tIb2xlRUMuY29udGFpbnMoIHRtcEVDICkgKQorCQkJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCUFWTV9PU19UUkFDRSA8PCAiPDw8PDwgaG9qPCBsZWFmIGZhaWxlZCA+ID4+Pj4+IEVDPCBpZDoiCisJCQk8PCBtUmVsYXRpdmVMZWFmRUNbbGVhZk9mZnNldF0tPmdldElkTnVtYmVyKCkgPDwgIiA+IiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFBST0NFU1NPUiApCisKKwkJCQltUmVsYXRpdmVMZWFmRUNbbGVhZk9mZnNldF0gPSBOVUxMOworCisJCQkJaWYoIHJhbmRvbU1heCA9PSBsZWFmQ291bnQgKQorCQkJCXsKKwkJCQkJcmFuZG9tTWF4ID0gbGVhZk9mZnNldDsKKwkJCQl9CisKKwkJCQlicmVhazsKKwkJCX0KKworCQkJdG1wRUMgPSB0bXBFQy0+Z2V0UHJldmlvdXMoKTsKKwkJfQorCisJCWlmKCAocmFuZG9tTWF4IDwgbGVhZkNvdW50KSAmJiAobVJlbGF0aXZlTGVhZkVDW2xlYWZPZmZzZXRdICE9IE5VTEwpICApCisJCXsKKwkJCW1SZWxhdGl2ZUxlYWZFQ1tyYW5kb21NYXgrK10gPSBtUmVsYXRpdmVMZWFmRUNbbGVhZk9mZnNldF07CisJCX0KKworCX0KKworCS8vIFJlbW92ZSBOVUxMIENvbnRleHQgTGVhZgorCWlmKCByYW5kb21NYXggPCBsZWFmQ291bnQgKQorCXsKKwkJbVJlbGF0aXZlTGVhZkVDLnJlc2l6ZSggcmFuZG9tTWF4ICk7CisJfQorfQorCisKKy8qKgorICogU2xpY2UgbGVhZiBpbiBtU2xpY2VhYmxlRUMKKyAqIHcuci50LiB0aGUgaGl0L2p1bXAvcHJlc2VydmVkIGxlYWYgaW4gbVJlbGF0aXZlUm9vdEVDL21QcmVzZXJ2ZWRFQworICogYW5kIGJhY2t3YXJkIHVudGlsIG1KdW1wRGVsdGEKKyAqLwordm9pZCBBdm1IaXRPckp1bXBQcm9jZXNzb3I6Omp1bXBTbGljZSgpCit7CisvLwkvLyEhIEJsYWNrdHJhY2sKKy8vCUV4ZWN1dGlvbkNvbnRleHQ6OnRyYWNlTWluaW11bShBVk1fT1NfVFJBQ0UsCisvLwkJCW1CYWNrdHJhY2tIaXRFQywgInRoZSBCYWNrdHJhY2sgSGl0IEVDIik7CisvLworLy8JLy8hISBCbGFja0hvbGUgPworLy8JRXhlY3V0aW9uQ29udGV4dDo6dHJhY2VNaW5pbXVtKEFWTV9PU19UUkFDRSwKKy8vCQkJbUJsYWNrSG9sZUVDLCAidGhlIEJsYWNrIEhvbGUgRUMiKTsKKy8vCisvLwkvLyEhIERlYWRMb2NrIG9yIEFic29sdXRlIFN0b3AgPworLy8JRXhlY3V0aW9uQ29udGV4dDo6dHJhY2VNaW5pbXVtKEFWTV9PU19UUkFDRSwKKy8vCQkJbUFic29sdXRlTGVhZkVDLCAidGhlIEFic29sdXRlIExlYWYgRUMiKTsKKworCWlmKCBtSnVtcFNsaWNlRmxhZyApCisJeworCQlpZiggbUhpdEx1Y2t5RmxhZyApCisJCXsKKwkJCW1CbGFja0hvbGVFQy5jbGVhcigpOworCQkJbUFic29sdXRlTGVhZkVDLmNsZWFyKCk7CisKKwkJCWp1bXBTbGljZUx1Y2t5KCk7CisJCX0KKwkJZWxzZSAvLyBpZiggbUJhY2t0cmFja0ZsYWcgKQorCQl7CisJCQlqdW1wU2xpY2VCYWNrdHJhY2soKTsKKwkJfQorCitBVk1fSUZfREVCVUdfTEVWRUxfR1RFX01FRElVTQorCUFWTV9PU19UUkFDRSA8PCAiPDw8PDwgU2xpY2UgY291bnQgOiAiIDw8IG1TbGljZUNvdW50CisJCQk8PCAiID4+Pj4+IiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfR1RFX01FRElVTQorCX0KKworCW1TbGljZWFibGVFQy5jbGVhcigpOworfQorCisKK3ZvaWQgQXZtSGl0T3JKdW1wUHJvY2Vzc29yOjp1cGRhdGVQcmVzZXJ2ZWQoKQoreworCW1KdW1wUHJlc2VydmVkRUMuY2xlYXIoKTsKKwltSnVtcFByZXNlcnZlZExlYXZlc0VDLmNsZWFyKCk7CisKKy8vCUV4ZWN1dGlvbkNvbnRleHQ6OnRyYWNlTWluaW11bShBVk1fT1NfVFJBQ0UsCisvLwkJCW1SZWxhdGl2ZVJvb3RFQywgInRoZSBSZWxhdGl2ZSBSb290IEVDIik7CisKKwltSnVtcFByZXNlcnZlZExlYXZlc0VDLmFwcGVuZChtUmVsYXRpdmVSb290RUMpOworCisJZWNJdEVuZCA9IG1KdW1wUHJlc2VydmVkTGVhdmVzRUMuZW5kKCk7CisJZm9yKCBlY0l0ID0gbUp1bXBQcmVzZXJ2ZWRMZWF2ZXNFQy5iZWdpbigpIDsgZWNJdCAhPSBlY0l0RW5kIDsgKytlY0l0ICkKKwl7CisJCXRtcEVDID0gKCplY0l0KTsKKworCQltSnVtcFByZXNlcnZlZEVDLmFwcGVuZCggdG1wRUMgKTsKKworCQlpZiggdG1wRUMtPmlzUm9vdCgpIHx8IG1Jbml0aWFsUm9vdEVDLmNvbnRhaW5zKHRtcEVDKSApCisJCXsKKwkJCWNvbnRpbnVlOworCQl9CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfVFJBQ0UgPDwgIjw8PDw8IHByZXNlcnZlZCBFQzwgaWQ6ICIKKwkJCTw8IHRtcEVDLT5nZXRJZE51bWJlcigpIDw8ICIgPiA+Pj4+PiAiIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgUFJPQ0VTU09SICkKKworCQlmb3IoIGp1bXBPZmZzZXQgPSAxIDsganVtcE9mZnNldCA8IG1KdW1wRGVsdGEgOyArK2p1bXBPZmZzZXQgKQorCQl7CisJCQl0bXBFQyA9IHRtcEVDLT5nZXRQcmV2aW91cygpOworCisJCQlpZiggdG1wRUMtPmlzUm9vdCgpIHx8IG1Jbml0aWFsUm9vdEVDLmNvbnRhaW5zKHRtcEVDKSB8fAorCQkJCQltSnVtcFByZXNlcnZlZEVDLmNvbnRhaW5zKCB0bXBFQyApICkKKwkJCXsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJbUp1bXBQcmVzZXJ2ZWRFQy5hcHBlbmQoIHRtcEVDICk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfVFJBQ0UgPDwgIjw8PDw8IHByZXNlcnZlZCBFQzwgaWQ6ICIKKwkJCTw8IHRtcEVDLT5nZXRJZE51bWJlcigpIDw8ICIgPiA+Pj4+PiAiIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgUFJPQ0VTU09SICkKKwkJfQorCX0KK30KKworCit2b2lkIEF2bUhpdE9ySnVtcFByb2Nlc3Nvcjo6anVtcFNsaWNlTHVja3koKQoreworCXVwZGF0ZVByZXNlcnZlZCgpOworCisvLwlFeGVjdXRpb25Db250ZXh0Ojp0cmFjZU1pbmltdW0oQVZNX09TX1RSQUNFLAorLy8JCQltSnVtcFByZXNlcnZlZEVDLCAidGhlIEp1bXAgUHJlc2VydmVkIEVDIik7CisvLworLy8JRXhlY3V0aW9uQ29udGV4dDo6dHJhY2VNaW5pbXVtKEFWTV9PU19UUkFDRSwKKy8vCQkJbUp1bXBQcmVzZXJ2ZWRMZWF2ZXNFQywgInRoZSBKdW1wIFByZXNlcnZlZCBMZWF2ZXMgRUMiKTsKKworCisJZWNJdEVuZCA9IG1KdW1wUHJlc2VydmVkTGVhdmVzRUMuZW5kKCk7CisJZm9yKCBlY0l0ID0gbUp1bXBQcmVzZXJ2ZWRMZWF2ZXNFQy5iZWdpbigpIDsgZWNJdCAhPSBlY0l0RW5kIDsgKytlY0l0ICkKKwl7CisJCXRtcEVDID0gKCplY0l0KTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCUFWTV9PU19UUkFDRSA8PCAiPDw8PDwganVtcFNsaWNlIGZyb20gcHJlc2VydmVkIGxlYWYgRUM8IGlkOiAiCisJCQk8PCB0bXBFQy0+Z2V0SWROdW1iZXIoKSA8PCAiID4gPj4+Pj4gIiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFBST0NFU1NPUiApCisKKwkJaWYoIHRtcEVDLT5pc1Jvb3QoKSB8fCBtSW5pdGlhbFJvb3RFQy5jb250YWlucyh0bXBFQykgKQorCQl7CisJCQljb250aW51ZTsKKwkJfQorCisJCWZvcigganVtcE9mZnNldCA9IDAgOyBqdW1wT2Zmc2V0IDwgbUp1bXBEZWx0YSA7ICsranVtcE9mZnNldCApCisJCXsKKwkJCXRtcEVDID0gdG1wRUMtPmdldFByZXZpb3VzKCk7CisJCQlpZiggdG1wRUMtPmlzUm9vdCgpIHx8IG1Jbml0aWFsUm9vdEVDLmNvbnRhaW5zKHRtcEVDKSApCisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfVFJBQ0UgPDwgIjw8PDw8IGp1bXBTbGljZSBmcm9tIHByZXNlcnZlZCBFQzwgaWQ6ICIKKwkJCTw8IHRtcEVDLT5nZXRJZE51bWJlcigpIDw8ICIgPiA+Pj4+PiAiIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgUFJPQ0VTU09SICkKKworCQkJZW5kQ2hpbGRFQyA9IHRtcEVDLT5lbmQoKTsKKwkJCWZvciggaXRDaGlsZEVDID0gdG1wRUMtPmJlZ2luKCkgOyBpdENoaWxkRUMgIT0gZW5kQ2hpbGRFQyA7ICkKKwkJCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfVFJBQ0UgPDwgIjw8PDw8IGp1bXBTbGljZSA/Pz8gRUM8IGlkOiAiIDw8ICgqaXRDaGlsZEVDKS0+Z2V0SWROdW1iZXIoKQorCQkJPDwgIiA+ID4+Pj4+IGNvdW50Oj4gIiA8PCBtU2xpY2VDb3VudCA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFBST0NFU1NPUiApCisKKwkJCQlpZiggbUp1bXBQcmVzZXJ2ZWRFQy5jb250YWlucyggKml0Q2hpbGRFQyApICkKKwkJCQl7CisJCQkJCSsraXRDaGlsZEVDOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlwcmV2RUMgPSAoKml0Q2hpbGRFQyk7CisKKwkJCQkJaXRDaGlsZEVDID0gdG1wRUMtPmVyYXNlQ2hpbGRDb250ZXh0KCBpdENoaWxkRUMgKTsKKwkJCQkJcHJldkVDLT5zZXRDb250YWluZXIoIE5VTEwgKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCUFWTV9PU19UUkFDRSA8PCAiPDw8PDwganVtcFNsaWNlIEVDPCBpZDogIiA8PCBwcmV2RUMtPmdldElkTnVtYmVyKCkKKwkJCTw8ICIgPiA+Pj4+PiAiIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgUFJPQ0VTU09SICkKKworCQkJCQltU2xpY2VDb3VudCA9IG1TbGljZUNvdW50ICsgQWJzdHJhY3RQcm9jZXNzb3JVbml0OjpyZW1vdmUoCisJCQkJCQkJcHJldkVDLCBBVk1fT1NfVFJBQ0UsICI8PDw8PCBqdW1wU2xpY2VMdWNreSIgKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCUFWTV9PU19UUkFDRSA8PCAiPDw8PDwganVtcFNsaWNlIGNvdW50OiAiIDw8IG1TbGljZUNvdW50CisJCQk8PCAiID4+Pj4+IiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFBST0NFU1NPUiApCisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCisKK3ZvaWQgQXZtSGl0T3JKdW1wUHJvY2Vzc29yOjpqdW1wU2xpY2VCYWNrdHJhY2soKQoreworCS8vISEgQmxhY2tIb2xlID8KKwltU2xpY2VhYmxlRUMuc3BsaWNlKCBtQmxhY2tIb2xlRUMgKTsKKworCS8vISEgRGVhZExvY2sgb3IgQWJzb2x1dGUgU3RvcCA/CisJbVNsaWNlYWJsZUVDLnNwbGljZSggbUFic29sdXRlTGVhZkVDICk7CisKKy8vCW1TbGljZWFibGVFQy51bmlxdWUoKTsKKworCWVjSXRFbmQgPSBtU2xpY2VhYmxlRUMuZW5kKCk7CisJZm9yKCBlY0l0ID0gbVNsaWNlYWJsZUVDLmJlZ2luKCkgOyBlY0l0ICE9IGVjSXRFbmQgOyArK2VjSXQgKQorCXsKKwkJdG1wRUMgPSAoKmVjSXQpOworCisJCWZvcigganVtcE9mZnNldCA9IDAgOyBqdW1wT2Zmc2V0IDw9IG1KdW1wRGVsdGEgOyArK2p1bXBPZmZzZXQgKQorCQl7CisJCQlpZiggKHRtcEVDLT5oYXNOZXh0KCkgJiYgKGp1bXBPZmZzZXQgPiAwKSkgfHwgdG1wRUMtPmlzUm9vdCgpIHx8CisJCQkJCW1MaXN0T2ZQb3NpdGl2ZUVDLmNvbnRhaW5zKHRtcEVDKSApCisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXByZXZFQyA9IHRtcEVDLT5nZXRQcmV2aW91cygpOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFBST0NFU1NPUiApCisJQVZNX09TX1RSQUNFIDw8ICI8PDw8PCBqdW1wU2xpY2UgRUM8IGlkOiAiIDw8IHRtcEVDLT5nZXRJZE51bWJlcigpCisJCQk8PCAiID4gPj4+Pj4iIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgUFJPQ0VTU09SICkKKworCQkJbVNsaWNlQ291bnQgPSBtU2xpY2VDb3VudCArIEFic3RyYWN0UHJvY2Vzc29yVW5pdDo6cmVtb3ZlKAorCQkJCQl0bXBFQywgQVZNX09TX1RSQUNFLCAiPDw8PDwganVtcFNsaWNlQmFja3RyYWNrIiApOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFBST0NFU1NPUiApCisJQVZNX09TX1RSQUNFIDw8ICI8PDw8PCBqdW1wU2xpY2UgY291bnQ6ICIgPDwgbVNsaWNlQ291bnQKKwkJCTw8ICIgPj4+Pj4iIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgUFJPQ0VTU09SICkKKworCisJCQl0bXBFQyA9IHByZXZFQzsKKwkJfQorCX0KK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUE9TVC1GSUxURVIgQVBJCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIEF2bUhpdE9ySnVtcFByb2Nlc3Nvcjo6cG9zdGZpbHRlcigpCit7CisvLwllY1F1ZXVlID0gJiggZ2V0RXhlY3V0aW9uUXVldWUoKS5nZXRSZXN1bHRRdWV1ZSgpICk7CisvLwllY1F1ZXVlSXRFbmQgPSBlY1F1ZXVlLT5lbmQoKTsKKy8vCWZvciggZWNRdWV1ZUl0ID0gZWNRdWV1ZS0+YmVnaW4oKSA7IGVjUXVldWVJdCAhPSBlY1F1ZXVlSXRFbmQgOyApCisvLwl7CisvLwkJaWYoIHBvc3RmaWx0ZXIoKmVjUXVldWVJdCkgKQorLy8JCXsKKy8vCQkJKytlY1F1ZXVlSXQ7CisvLwkJfQorLy8JCWVsc2UKKy8vCQl7CisvLwkJCWVjUXVldWVJdCA9IGVjUXVldWUtPmVyYXNlKGVjUXVldWVJdCk7CisvLwkJfQorLy8JfQorCisJcmV0dXJuKCBnZXRFeGVjdXRpb25RdWV1ZSgpLmhhc1Jlc3VsdCgpICk7Cit9CisKKworYm9vbCBBdm1IaXRPckp1bXBQcm9jZXNzb3I6OnBvc3RmaWx0ZXIoRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpCit7CisvLwlpZiggbUhpdFByb2Nlc3Nvci0+aGl0KGFuRUMpICkKKy8vCXsKKy8vCQlpZiggbUhpdFByb2Nlc3Nvci0+Z29hbEFjaGlldmVkKCkgJiYgbVN0b3BGbGFnICkKKy8vCQl7CisvLwkJCXJldHVybiggZmFsc2UgKTsKKy8vCQl9CisvLwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvKioKKyAqIElIYW5kbGVyRXZlbnREZXN0cm95Q3R4IEFQSQorICogRGVzdHJveSBFeGVjdXRpb24gQ29udGV4dAorICovCit2b2lkIEF2bUhpdE9ySnVtcFByb2Nlc3Nvcjo6aGFuZGxlRXZlbnREZXN0cm95Q3R4KEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDKQoreworCW1CYWNrdHJhY2tIaXRFQy5yZW1vdmUoIGFuRUMgKTsKK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEZJTkFMIFNMSUNJTkcgVE9PTFMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBBdm1IaXRPckp1bXBQcm9jZXNzb3I6OmlzU2xpY2VhYmxlQ29udGV4dChFeGVjdXRpb25Db250ZXh0ICYgYW5FQykgY29uc3QKK3sKKwlpZiggbUhpdFByb2Nlc3Nvci0+Z29hbEFjaGlldmVkKCkgKQorCXsKKwkJcmV0dXJuKCBhbkVDLmdldEZsYWdzKCkubm9uZU9iamVjdGl2ZUFjaGlldmVkVHJhY2UoKQorCQkJCSYmIChub3QgbUluaXRpYWxSb290RUMuY29udGFpbnMoJiBhbkVDKSkgKTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuKCBhbkVDLmdldEZsYWdzKCkubm9uZUNvdmVyYWdlRWxlbWVudFRyYWNlKCkKKwkJCQkmJiAobm90IG1Jbml0aWFsUm9vdEVDLmNvbnRhaW5zKCYgYW5FQykpCisJCQkJJiYgKG5vdCBtTGlzdE9mUG9zaXRpdmVFQy5jb250YWlucygmIGFuRUMpKSApOworCX0KK30KKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9oaXRvcmp1bXAvQXZtSGl0T3JKdW1wUHJvY2Vzc29yLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vaGl0b3JqdW1wL0F2bUhpdE9ySnVtcFByb2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMmRhM2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vaGl0b3JqdW1wL0F2bUhpdE9ySnVtcFByb2Nlc3Nvci5oCkBAIC0wLDAgKzEsNDQzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogNyBqYW52LiAyMDE0CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQVZNSElUT1JKVU1QUFJPQ0VTU09SX0hfCisjZGVmaW5lIEFWTUhJVE9SSlVNUFBST0NFU1NPUl9IXworCisjaW5jbHVkZSA8ZmFtL2NvdmVyYWdlL0Jhc2VDb3ZlcmFnZUZpbHRlci5oPgorI2luY2x1ZGUgPHNldy9TeW1iZXhFdmVudE1hbmFnZXIuaD4KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vQml0c2V0Lmg+CisKKyNpbmNsdWRlIDxmbWwvb3BlcmF0b3IvT3BlcmF0b3JMaWIuaD4KKworI2luY2x1ZGUgPGZhbS9jb3ZlcmFnZS9Bdm1Db3ZlcmFnZVN0YXRpc3RpY3MuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKK2NsYXNzIEJhc2VIaXRQcm9jZXNzb3I7CitjbGFzcyBFeGVjdXRpb25Db250ZXh0OworY2xhc3MgU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyOworCisKK2NsYXNzIEF2bUhpdE9ySnVtcFByb2Nlc3NvciAgOgorCQlwdWJsaWMgQXV0b1JlZ2lzdGVyZWRDb3ZlcmFnZVByb2Nlc3NvclVuaXQ8IEF2bUhpdE9ySnVtcFByb2Nlc3NvciA+ICwKKwkJcHVibGljIElIYW5kbGVyRXZlbnREZXN0cm95Q3R4Cit7CisKKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggQXZtSGl0T3JKdW1wUHJvY2Vzc29yICkKKworCisJLyoqCisJICogUFJPQ0VTU09SIEZBQ1RPUlkKKwkgKiBmb3IgYXV0b21hdGljIHJlZ2lzdHJhdGlvbiBpbiB0aGUgcHJvY2Vzc29yIHJlcG9zaXRvcnkKKwkgKiB0aGUgWyBbIEZVTExZIF0gUVVBTElGSUVEIF0gTkFNRSBJRAorCSAqLworCUFWTV9JTkpFQ1RfQVVUT19SRUdJU1RFUl9RVUFMSUZJRURfSURfS0VZXzIoCisJCQkiY292ZXJhZ2UjYmVoYXZpb3IiLAorCQkJImF2bTo6cHJvY2Vzc29yLkhJVF9PUl9KVU1QIiApCisJLy8gZW5kIHJlZ2lzdHJhdGlvbgorCisKK3B1YmxpYzoKKwkvKioKKwkgKiBBVFRSSUJVVEUKKwkgKi8KKwlCYXNlSGl0UHJvY2Vzc29yICogbUhpdFByb2Nlc3NvcjsKKworCWJvb2wgbUdsb2JhbFNlYXJjaFNjb3BlRmxhZzsKKworCUFWTV9PUENPREUgc2NoZWR1bGVyOworCisJYm9vbCBtRm9sZGluZ0ZsYWc7CisKKwlhdm1fc2l6ZV90IG1KdW1wRGVsdGE7CisJYXZtX3NpemVfdCBtSnVtcEhlaWdodDsKKworCWF2bV9zaXplX3QgbUp1bXBUcmlhbHNDb3VudDsKKwlhdm1fc2l6ZV90IG1KdW1wVHJpYWxzTGltaXQ7CisKKwlib29sIG1IaXRDb25zZWN1dGl2ZUZsYWc7CisJYm9vbCBtSGl0TWF4RmxhZzsKKwlib29sIG1IaXRMdWNreUZsYWc7CisJYm9vbCBtQmFja3RyYWNrRmxhZzsKKworCWF2bV9zaXplX3QgbUhpdENvdW50OworCWF2bV9zaXplX3QgbUp1bXBDb3VudDsKKworCWJvb2wgbUhpdEZpbmFsRmxhZzsKKworCisJYm9vbCBtSnVtcFNsaWNlRmxhZzsKKworCUF2bUNvdmVyYWdlU3RhdGlzdGljcyBtRmluYWxDb3ZlcmFnZVN0YXRpc3RpY3M7CisKKwlib29sIG1Hb2FsQWNoaWV2ZWQ7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBDb21wdXRpbmcgVmFyaWFibGVzCisJYm9vbCBtQWJzb2x1dGVTdG9wQ29udGV4dEZsYWc7CisKKwlib29sIG1IaXRDYXNlRmxhZzsKKworCWF2bV9zaXplX3QgbVNlbGVjdGlvbkNvdW50OworCisJTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAgIG1Jbml0aWFsUm9vdEVDOworCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQgICBtQnVmZmVyTG9jYWxSb290RUM7CisKKwlMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICAgbVJlbGF0aXZlUm9vdEVDOworCVZlY3Rvck9mRXhlY3V0aW9uQ29udGV4dCBtUmVsYXRpdmVMZWFmRUM7CisKKwlMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICAgbUFic29sdXRlTGVhZkVDOworCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQgICBtQmxhY2tIb2xlRUM7CisKKwlMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICAgbUJhY2t0cmFja0hpdEVDOworCisJTGlzdE9mRXhlY3V0aW9uQ29udGV4dCBtU2xpY2VhYmxlRUM7CisJTGlzdE9mRXhlY3V0aW9uQ29udGV4dCBtSnVtcFByZXNlcnZlZEVDOworCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQgbUp1bXBQcmVzZXJ2ZWRMZWF2ZXNFQzsKKworcHJvdGVjdGVkOgorCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQ6Oml0ZXJhdG9yIGVjSXQ7CisJTGlzdE9mRXhlY3V0aW9uQ29udGV4dDo6aXRlcmF0b3IgZWNJdEVuZDsKKworCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQ6Oml0ZXJhdG9yIGl0Q2hpbGRFQzsKKwlMaXN0T2ZFeGVjdXRpb25Db250ZXh0OjppdGVyYXRvciBlbmRDaGlsZEVDOworCisJRXhlY3V0aW9uQ29udGV4dCAqIHRtcEVDOworCUV4ZWN1dGlvbkNvbnRleHQgKiBwcmV2RUM7CisKKwlhdm1fc2l6ZV90IGxlYWZPZmZzZXQ7CisJYXZtX3NpemVfdCBsZWFmQ291bnQ7CisKKwlhdm1fc2l6ZV90IHJhbmRvbU1heDsKKworCWF2bV9zaXplX3QganVtcE9mZnNldDsKKwlCaXRzZXQganVtcE9mZnNldEJpdHNldDsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQXZtSGl0T3JKdW1wUHJvY2Vzc29yKFN5bWJleENvbnRyb2xsZXJVbml0TWFuYWdlciAmIGFDb250cm9sbGVyVW5pdE1hbmFnZXIsCisJCQlXT2JqZWN0ICogd2ZQYXJhbWV0ZXJPYmplY3QpCisJOiBSZWdpc3RlcmVkQ292ZXJhZ2VQcm9jZXNzb3JVbml0KGFDb250cm9sbGVyVW5pdE1hbmFnZXIsIHdmUGFyYW1ldGVyT2JqZWN0LAorCQkJQVZNX1BSRV9GSUxURVJJTkdfU1RBR0UsIFBSRUNFREVOQ0VfT0ZfSElUX09SX0pVTVApLAorCW1IaXRQcm9jZXNzb3IoIE5VTEwgKSwKKworCW1HbG9iYWxTZWFyY2hTY29wZUZsYWcoIHRydWUgKSwKKwlzY2hlZHVsZXIoIEFWTV9PUENPREVfU0VRVUVOQ0UgKSwKKworCW1Gb2xkaW5nRmxhZyggdHJ1ZSApLAorCisJbUp1bXBEZWx0YSggMSApLAorCW1KdW1wSGVpZ2h0KCBtSnVtcERlbHRhICksCisJbUp1bXBUcmlhbHNDb3VudCggMCApLAorCW1KdW1wVHJpYWxzTGltaXQoIEFWTV9OVU1FUklDX01BWF9TSVpFX1QgKSwKKworCW1IaXRDb25zZWN1dGl2ZUZsYWcoIGZhbHNlICksCisJbUhpdE1heEZsYWcoIGZhbHNlICksCisJbUhpdEx1Y2t5RmxhZyggZmFsc2UgKSwKKwltQmFja3RyYWNrRmxhZyggdHJ1ZSApLAorCisJbUhpdENvdW50KCAxICksCisJbUp1bXBDb3VudCggMSApLAorCisJbUhpdEZpbmFsRmxhZyggdHJ1ZSApLAorCW1KdW1wU2xpY2VGbGFnKCB0cnVlICksCisKKwltRmluYWxDb3ZlcmFnZVN0YXRpc3RpY3MoICksCisKKwltR29hbEFjaGlldmVkKCBmYWxzZSApLAorCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIENvbXB1dGluZyBWYXJpYWJsZXMKKwltQWJzb2x1dGVTdG9wQ29udGV4dEZsYWcoIGZhbHNlICksCisJbUhpdENhc2VGbGFnKCBmYWxzZSApLAorCisJbVNlbGVjdGlvbkNvdW50KCAxICksCisKKwltSW5pdGlhbFJvb3RFQyggKSwKKwltQnVmZmVyTG9jYWxSb290RUMoICksCisKKwltUmVsYXRpdmVSb290RUMoICksCisJbVJlbGF0aXZlTGVhZkVDKCApLAorCisJbUFic29sdXRlTGVhZkVDKCApLAorCW1CbGFja0hvbGVFQyggKSwKKworCW1CYWNrdHJhY2tIaXRFQyggKSwKKworCisJbVNsaWNlYWJsZUVDKCApLAorCW1KdW1wUHJlc2VydmVkRUMoICksCisJbUp1bXBQcmVzZXJ2ZWRMZWF2ZXNFQyggKSwKKworCWVjSXQoICksCisJZWNJdEVuZCggKSwKKworCWl0Q2hpbGRFQyggKSwKKwllbmRDaGlsZEVDKCApLAorCisJdG1wRUMoIE5VTEwgKSwKKwlwcmV2RUMoIE5VTEwgKSwKKworCWxlYWZPZmZzZXQoIDAgKSwKKwlsZWFmQ291bnQoIDAgKSwKKworCXJhbmRvbU1heCggMCApLAorCisJanVtcE9mZnNldCggMCApLAorCWp1bXBPZmZzZXRCaXRzZXQoICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5Bdm1IaXRPckp1bXBQcm9jZXNzb3IoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQ09ORklHVVJFIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXZpcnR1YWwgYm9vbCBjb25maWd1cmVJbXBsKCk7CisKKworCS8qKgorCSAqIHNjaGVkdWxlcgorCSAqLworCWlubGluZSBib29sIGlzT3JkZXJlZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHNjaGVkdWxlciA9PSBBVk1fT1BDT0RFX1BSSU9SX0dUICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNSZWdleCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHNjaGVkdWxlciA9PSBBVk1fT1BDT0RFX1JFR0VYICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNVbm9yZGVyZWQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBzY2hlZHVsZXIgPT0gQVZNX09QQ09ERV9JTlRFUkxFQVZJTkcgKTsKKwl9CisKKworCWlubGluZSBzdGQ6OnN0cmluZyBzdHJTY2hlZHVsZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBPcGVyYXRvckxpYjo6dG9fc3RyaW5nKHNjaGVkdWxlcikgKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBSRVBPUlQgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJdmlydHVhbCB2b2lkIHJlcG9ydE1pbmltdW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCisJdmlydHVhbCB2b2lkIHJlcG9ydERlZmF1bHQoT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIE5PTi1SRUdSRVNTSU9OIFRFU1QgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJdmlydHVhbCB2b2lkIHRkZFJlZ3Jlc3Npb25SZXBvcnRJbXBsKE91dFN0cmVhbSAmIG9zKTsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFBST0NFU1MgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLwl2aXJ0dWFsIGJvb2wgcHJlcHJvY2VzcygpOworLy8KKy8vCXZpcnR1YWwgYm9vbCBwb3N0cHJvY2VzcygpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gRklMVEVSIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXZpcnR1YWwgYm9vbCBmaWx0ZXJpbmdJbml0aWFsaXplKCk7CisKKwl2aXJ0dWFsIGJvb2wgcHJlZmlsdGVyKCk7CisJdmlydHVhbCBib29sIHByZWZpbHRlcihFeGVjdXRpb25Db250ZXh0ICYgYW5FQyk7CisKKworCS8qKgorCSAqIFBST0NFU1NPUiBSRVFVRVNUIEFQSSA6PiBDT05JVE5VRSAsIEdPQUxfQUNISUVWRUQKKwkgKi8KKwl2aXJ0dWFsIHZvaWQgaGFuZGxlUmVxdWVzdENvbnRpbnVlKCk7CisKKwl2aXJ0dWFsIHZvaWQgaGFuZGxlUmVxdWVzdEdvYWxBY2hpZXZlZCgpOworCisJYm9vbCBob2pCYWNrdHJhY2soKTsKKworCXZvaWQgaG9qU2VsZWN0aW9uKCk7CisJdm9pZCBob2pTZWxlY3Rpb25GaW5hbCgpOworCisJdm9pZCB1cGRhdGVSZWxhdGl2ZUxlYWYoKTsKKworCisJdm9pZCB1cGRhdGVQcmVzZXJ2ZWQoKTsKKwl2b2lkIGp1bXBTbGljZSgpOworCXZvaWQganVtcFNsaWNlQmFja3RyYWNrKCk7CisJdm9pZCBqdW1wU2xpY2VMdWNreSgpOworCisJdmlydHVhbCBib29sIHBvc3RmaWx0ZXIoKTsKKwl2aXJ0dWFsIGJvb2wgcG9zdGZpbHRlcihFeGVjdXRpb25Db250ZXh0ICYgYW5FQyk7CisKKworCS8qKgorCSAqIElIYW5kbGVyRXZlbnREZXN0cm95Q3R4IEFQSQorCSAqIERlc3Ryb3kgRXhlY3V0aW9uIENvbnRleHQKKwkgKi8KKwl2aXJ0dWFsIHZvaWQgaGFuZGxlRXZlbnREZXN0cm95Q3R4KEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDKTsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIEZJTkFMIFNMSUNJTkcgVE9PTFMKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwl2aXJ0dWFsIGJvb2wgaXNTbGljZWFibGVDb250ZXh0KEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKSBjb25zdDsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFNFUklBTElaQVRJT04gQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJaW5saW5lIHZpcnR1YWwgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCWlmKCBtUGFyYW1ldGVyV09iamVjdCAhPSBOVUxMICkKKwkJeworCQkJbVBhcmFtZXRlcldPYmplY3QtPnRvU3RyZWFtKG9zKTsKKwkJfQorCX0KKworfTsKKworCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBdm1IaXRPckp1bXBPYmplY3RpdmUgSW5mb3JtYXRpb24KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjbGFzcyBIaXRPckp1bXBPYmplY3RpdmVJbmZvIDoKKwkJcHVibGljIEVsZW1lbnQgLAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIEhpdE9ySnVtcE9iamVjdGl2ZUluZm8gKQoreworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIEhpdE9ySnVtcE9iamVjdGl2ZUluZm8gKQorCisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBBVFRSSUJVVEVTCisJICovCisJQXZtQ292ZXJhZ2VTdGF0aXN0aWNzIG1Db3ZlcmFnZVN0YXRpc3RpY3M7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUhpdE9ySnVtcE9iamVjdGl2ZUluZm8oKQorCTogRWxlbWVudCggQ0xBU1NfS0lORF9UKCBIaXRPckp1bXBPYmplY3RpdmVJbmZvICkgKSwKKwltQ292ZXJhZ2VTdGF0aXN0aWNzKCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCUhpdE9ySnVtcE9iamVjdGl2ZUluZm8oY29uc3QgSGl0T3JKdW1wT2JqZWN0aXZlSW5mbyAmIGhvakluZm8pCisJOiBFbGVtZW50KCBob2pJbmZvICksCisJbUNvdmVyYWdlU3RhdGlzdGljcyggaG9qSW5mby5tQ292ZXJhZ2VTdGF0aXN0aWNzICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkhpdE9ySnVtcE9iamVjdGl2ZUluZm8oKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBtQ292ZXJhZ2VTdGF0aXN0aWNzCisJICovCisJQXZtQ292ZXJhZ2VTdGF0aXN0aWNzICYgZ2V0Q292ZXJhZ2VTdGF0aXN0aWNzKCkKKwl7CisJCXJldHVybiBtQ292ZXJhZ2VTdGF0aXN0aWNzOworCX0KKworCXZvaWQgc2V0Q292ZXJhZ2VTdGF0aXN0aWNzKAorCQkJQXZtQ292ZXJhZ2VTdGF0aXN0aWNzICYgYUNvdmVyYWdlU3RhdGlzdGljcywgYXZtX3NpemVfdCBoaXRDb3VudCA9IDApCisJeworCQltQ292ZXJhZ2VTdGF0aXN0aWNzID0gYUNvdmVyYWdlU3RhdGlzdGljczsKKworCQltQ292ZXJhZ2VTdGF0aXN0aWNzLmFkZENvdmVyZWRFbGVtZW50KGhpdENvdW50KTsKKwl9CisKKwl2b2lkIHNldENvdmVyYWdlU3RhdGlzdGljcyhBdm1Db3ZlcmFnZVN0YXRpc3RpY3MgJiBhQ292ZXJhZ2VTdGF0aXN0aWNzLAorCQkJQml0c2V0ICYgY292ZXJhZ2VCaXRzZXQsIGF2bV9zaXplX3QgaGl0Q291bnQgPSAwKQorCXsKKwkJbUNvdmVyYWdlU3RhdGlzdGljcyA9IGFDb3ZlcmFnZVN0YXRpc3RpY3M7CisKKwkJbUNvdmVyYWdlU3RhdGlzdGljcy5hZGRDb3ZlcmVkRWxlbWVudChoaXRDb3VudCk7CisKKwkJbUNvdmVyYWdlU3RhdGlzdGljcy5tQ292ZXJhZ2VCaXRzZXQgPSBjb3ZlcmFnZUJpdHNldDsKKwl9CisKKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwl2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJLy8hISEgTk9USElORworCX0KKworCXZvaWQgdG9Gc2NuKE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJLy8hISEgTk9USElORworCX0KKworfTsKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qIEFWTUhJVE9SSlVNUFBST0NFU1NPUl9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2hpdG9yanVtcC9CYXNlSGl0UHJvY2Vzc29yLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9oaXRvcmp1bXAvQmFzZUhpdFByb2Nlc3Nvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU5NTU4NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9oaXRvcmp1bXAvQmFzZUhpdFByb2Nlc3Nvci5jcHAKQEAgLTAsMCArMSwzODAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiA3IGphbnYuIDIwMTQKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkJhc2VIaXRQcm9jZXNzb3IuaCIKKworI2luY2x1ZGUgPGJ1aWxkZXIvQnVpbGRlci5oPgorCisjaW5jbHVkZSA8Y29tcHV0ZXIvRXZhbHVhdGlvbkVudmlyb25tZW50Lmg+CisKKyNpbmNsdWRlIDxmYW0vaGl0b3JqdW1wL0F2bUhpdE9ySnVtcFByb2Nlc3Nvci5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZUZvcm0uaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlU3lzdGVtLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZkRhdGEuaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0F2bUNvZGUuaD4KKworI2luY2x1ZGUgPGZtbC90eXBlL1R5cGVTcGVjaWZpZXIuaD4KKworI2luY2x1ZGUgPGZtbC90cmFjZS9UcmFjZUZhY3RvcnkuaD4KKworI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9RdWVyeS5oPgorI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9XT2JqZWN0Lmg+CisKKyNpbmNsdWRlIDxzZXcvQ29uZmlndXJhdGlvbi5oPgorCisjaW5jbHVkZSA8c29sdmVyL2FwaS9Tb2x2ZXJGYWN0b3J5Lmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorICogQ09OU1RSVUNUT1IKKyAqIERlZmF1bHQKKyAqLworQmFzZUhpdFByb2Nlc3Nvcjo6QmFzZUhpdFByb2Nlc3NvcihBdm1IaXRPckp1bXBQcm9jZXNzb3IgJiBob2pQcm9jZXNzb3IsCisJCUV2YWx1YXRpb25FbnZpcm9ubWVudCAmIGFuRU5WLCBPcGVyYXRvciAqIG9wKQorOiBtSGl0T3JKdW1wUHJvY2Vzc29yKCBob2pQcm9jZXNzb3IgKSwKK21Db3ZlcmFnZVN0YXRpc3RpY3MoIGhvalByb2Nlc3Nvci5nZXRDb3ZlcmFnZVN0YXRpc3RpY3MoKSApLAorRU5WKCBhbkVOViApLAorCittU29sdmVyS2luZCggIFNvbHZlckRlZjo6U09MVkVSX1VOREVGSU5FRF9LSU5EICApLAorbUxvY2FsRXhlY3V0YWJsZUZvcm0oCisJCW1IaXRPckp1bXBQcm9jZXNzb3IuZ2V0Q29uZmlndXJhdGlvbigpLmdldEV4ZWN1dGFibGVTeXN0ZW0oKSwgMCApLAorbVRyYWNlQ2hlY2tlciggYW5FTlYsICZtTG9jYWxFeGVjdXRhYmxlRm9ybSApLAorCittVHJhY2VPYmplY3RpdmUoIG9wICksCitpc1B1cmVTdGF0ZVRyYW5zaXRpb25OYXR1cmVGbGFnKCBmYWxzZSApLAorCisvLyBDb21wdXRpbmcgTG9jYWwgVmFyaWFibGVzCit0cmFjZU9mZnNldCggMCApLAorCittUmVsYXRpdmVSb290RUMoIGhvalByb2Nlc3Nvci5tUmVsYXRpdmVSb290RUMgKSwKK2VjSXQoICksCitlY0l0RW5kKCApLAorbVJlbGF0aXZlTGVhZkVDKCBob2pQcm9jZXNzb3IubVJlbGF0aXZlTGVhZkVDICksCisKK21BYnNvbHV0ZUxlYWZFQyggaG9qUHJvY2Vzc29yLm1BYnNvbHV0ZUxlYWZFQyApLAorCittQmxhY2tIb2xlRUMoIGhvalByb2Nlc3Nvci5tQmxhY2tIb2xlRUMgKSwKKworbUJhY2t0cmFja0hpdEVDKCBob2pQcm9jZXNzb3IubUJhY2t0cmFja0hpdEVDICksCittQmFja3RyYWNrRmxhZyggaG9qUHJvY2Vzc29yLm1CYWNrdHJhY2tGbGFnICksCisKK21KdW1wSGVpZ2h0KCAwICksCisKK21NYXhIaXRFQyggKSwKKworaGl0T2Zmc2V0KCAwICksCitoaXRPZmZzZXRFbmQoIDAgKSwKKworbUhpdENvdW50KCAwICksCisKK2VjQ2hpbGRJdCggKSwKK2VjQ2hpbGRJdEVuZCggKQoreworCS8vISEgTk9USElORworfQorCisKKy8qKgorICogR0VUVEVSCisgKiBtVHJhY2VPYmplY3RpdmUKKyAqLworYm9vbCBCYXNlSGl0UHJvY2Vzc29yOjppc1B1cmVTdGF0ZVRyYW5zaXRpb25PYmplY3RpdmUoKSBjb25zdAoreworCWZvciggYXZtX3NpemVfdCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgbVRyYWNlT2JqZWN0aXZlLnNpemUoKSA7ICsrb2Zmc2V0ICkKKwl7CisJCWlmKCBtVHJhY2VDaGVja2VyLmlzUG9pbnROYXR1cmUobVRyYWNlT2JqZWN0aXZlW29mZnNldF0sCisJCQkJRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfVFJBTlNJVElPTl9OQVRVUkUpICkKKwkJeworCQkJLy8hISBDT05USU5VRQorCQl9CisJCWVsc2UgaWYoIG1UcmFjZUNoZWNrZXIuaXNQb2ludE5hdHVyZShtVHJhY2VPYmplY3RpdmVbb2Zmc2V0XSwKKwkJCQlFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9TVEFURV9OQVRVUkUpICkKKwkJeworCQkJLy8hISBDT05USU5VRQorCQl9CisJCWVsc2UgaWYoIG1UcmFjZUNoZWNrZXIuaXNQb2ludE5hdHVyZShtVHJhY2VPYmplY3RpdmVbb2Zmc2V0XSwKKwkJCQlFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9TVEFURU1BQ0hJTkVfTkFUVVJFKSApCisJCXsKKwkJCS8vISEgQ09OVElOVUUKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKKy8qCitwcm90b3R5cGUgcHJvY2Vzczo6aGl0X29yX2p1bXAgYXMgJmF2bTo6cHJvY2Vzc29yLkhJVF9PUl9KVU1QIGlzCisgc2VjdGlvbiBSRVBPUlQKKyAgLi4uCisgZW5kc2VjdGlvbiBSRVBPUlQKKworIHNlY3Rpb24gUFJPUEVSVFkKKyAgLi4uCisgZW5kc2VjdGlvbiBQUk9QRVJUWQorCisgLy8gRGVjbGFyYXRpb24gcGFydAorIHNlY3Rpb24gUE9JTlQKKyAgQGFzc2lnbiA9ICJzZW5zIjsKKworICBAbmV3ZnJlc2ggPSAic2VucyI7CisKKyAgQHNpZ25hbCNzZW5zID0gInNlbnMiOworCisgIEBwb3J0ID0gImVudiI7CisKKyAgQGlucHV0ID0gImVudiI7CisgIEBvdXRwdXQgPSAiZW52IjsKKworICBAb3V0cHV0ID0gIlRoZXJtb3N0YXQtPmR0IjsKKyAgQGlucHV0ICA9ICJUaGVybW9zdGF0LT5lcXVpcCI7CisgIEBvdXRwdXQyID0gIkVxdWlwbWVudC0+ZXJyb3IiOworIGVuZHNlY3Rpb24gUE9JTlQKKworIHNlY3Rpb24gVFJBQ0UKKyAgQHRyYWNlID0gJHsgJiYgInNpZ25hbCNzZW5zIiAib3V0cHV0MiIgfTsKKyAgQHRyYWNlID0gWyAic2lnbmFsI3NlbnMiICwgIm91dHB1dDIiIF07CisgIEBwb2ludCA9ICggInNpZ25hbCNzZW5zIiB8fCAib3V0cHV0MiIgKTsKKyAgQGNvbXBvc2l0ZSA9ICR7IHhvciAic2lnbmFsI3NlbnMiICJvdXRwdXQyIiB9OworCisgIEBhc3NpZ24gPSAic2VucyI7CisKKyAgQG5ld2ZyZXNoID0gInNlbnMiOworCisgIEBzaWduYWwgPSAic2VucyI7CisKKyAgQHBvcnQgPSAiZW52IjsKKworICBAaW5wdXQgPSAiZW52IjsKKyAgQG91dHB1dCA9ICJlbnYiOworCisgIEBvdXRwdXQgPSAiVGhlcm1vc3RhdC0+ZHQiOworICBAaW5wdXQgID0gIlRoZXJtb3N0YXQtPmVxdWlwIjsKKyAgQG91dHB1dCA9ICJFcXVpcG1lbnQtPmVycm9yIjsKKyBlbmRzZWN0aW9uIFRSQUNFCitlbmRwcm90b3R5cGUKKyovCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENPTkZJR1VSRSBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgQmFzZUhpdFByb2Nlc3Nvcjo6Y29uZmlndXJlKFdPYmplY3QgKiB3ZlBhcmFtZXRlck9iamVjdCkKK3sKKwljb25zdCBFeGVjdXRhYmxlU3lzdGVtICYgYW5FeGVjdXRhYmxlU3lzdGVtID0KKwkJCW1IaXRPckp1bXBQcm9jZXNzb3IuZ2V0Q29uZmlndXJhdGlvbigpLmdldEV4ZWN1dGFibGVTeXN0ZW0oKTsKKworCW1Db3ZlcmFnZVN0YXRpc3RpY3MucmVzZXRDb3VudGVyKCk7CisKKworCVdPYmplY3QgKiB0aGVQUk9QRVJUWSA9IFF1ZXJ5OjpnZXRSZWdleFdTZXF1ZW5jZSgKKwkJCXdmUGFyYW1ldGVyT2JqZWN0LCBPUl9XSUQyKCJwcm9wZXJ0eSIsICJQUk9QRVJUWSIpKTsKKwlpZiggdGhlUFJPUEVSVFkgIT0gV09iamVjdDo6X05VTExfICkKKwl7CisJCXN0ZDo6c3RyaW5nIG1Tb2x2ZXJOYW1lID0KKwkJCQlRdWVyeTo6Z2V0V1Byb3BlcnR5U3RyaW5nKHRoZVBST1BFUlRZLCAic29sdmVyIiwgIiIpOworCQlpZiggbVNvbHZlck5hbWUuZW1wdHkoKSApCisJCXsKK0FWTV9JRl9ERUJVR19GTEFHKCBTT0xWSU5HICkKKwl0aGVQUk9QRVJUWS0+d2FybmluZ0xvY2F0aW9uKEFWTV9PU19XQVJOKQorCQkJPDwgIlVuZXhwZWN0ZWQgYW4gZW1wdHkgc29sdmVyIGVuZ2luZSBraW5kISEhISEiIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTT0xWSU5HICkKKwkJfQorCQltU29sdmVyS2luZCA9IFNvbHZlckRlZjo6dG9Tb2x2ZXIoCisJCQkJbVNvbHZlck5hbWUsIFNvbHZlckRlZjo6REVGQVVMVF9TT0xWRVJfS0lORCk7CisJfQorCWVsc2UKKwl7CisJCW1Tb2x2ZXJLaW5kID0gU29sdmVyRGVmOjpTT0xWRVJfQ1ZDNF9LSU5EOworCX0KKworCW1UcmFjZUNoZWNrZXIuc2V0U29sdmVyS2luZCggbVNvbHZlcktpbmQgKTsKKworCisJV09iamVjdCAqIHRoZURBVEEgPSBRdWVyeTo6Z2V0UmVnZXhXU2VxdWVuY2UoCisJCQl3ZlBhcmFtZXRlck9iamVjdCwgT1JfV0lEMigiZGF0YSIsICJEQVRBIikpOworCWlmKCB0aGVEQVRBICE9IFdPYmplY3Q6Ol9OVUxMXyApCisJeworCQlhbkV4ZWN1dGFibGVTeXN0ZW0uaW5pdFByb2Nlc3NFeGVjdXRhYmxlRm9ybSgKKwkJCQltTG9jYWxFeGVjdXRhYmxlRm9ybSwgdGhlREFUQS0+b3duZWRTaXplKCkpOworCisJCUxpc3Q8IFdPYmplY3QgKiA+IGxpc3RPZkxvY2FsVmFyOworCQlRdWVyeTo6Z2V0TGlzdFdPYmplY3QodGhlREFUQSwgbGlzdE9mTG9jYWxWYXIpOworCisJCVR5cGVTcGVjaWZpZXIgYVR5cGVTcGVjaWZpZXI7CisKKwkJTGlzdDwgV09iamVjdCAqID46Oml0ZXJhdG9yIGl0ID0gbGlzdE9mTG9jYWxWYXIuYmVnaW4oKTsKKwkJTGlzdDwgV09iamVjdCAqID46Oml0ZXJhdG9yIGl0RW5kID0gbGlzdE9mTG9jYWxWYXIuZW5kKCk7CisJCWZvciggYXZtX29mZnNldF90IG9mZnNldCA9IDAgOyBpdCAhPSBpdEVuZCA7ICsraXQgLCArK29mZnNldCApCisJCXsKKwkJCWFUeXBlU3BlY2lmaWVyID0gRU5WLmdldEJ1aWxkZXIoKS5nZXRDb21waWxlcigpLgorCQkJCQljb21waWxlVHlwZVNwZWNpZmllcigmbUxvY2FsRXhlY3V0YWJsZUZvcm0sCisJCQkJCQkJKCppdCktPmdldFF1YWxpZmllZFR5cGVOYW1lSUQoKSApOworCisJCQlCRiBhbkluc3RhbmNlKCBuZXcgSW5zdGFuY2VPZkRhdGEoCisJCQkJCUlQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9TVEFOREFSRF9OQVRVUkUsCisJCQkJCSZtTG9jYWxFeGVjdXRhYmxlRm9ybSwgTlVMTCwgYVR5cGVTcGVjaWZpZXIsCisJCQkJCSgqaXQpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpLCBvZmZzZXQpICk7CisKKwkJCW1Mb2NhbEV4ZWN1dGFibGVGb3JtLnNldERhdGEoIG9mZnNldCAsIGFuSW5zdGFuY2UgKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlhbkV4ZWN1dGFibGVTeXN0ZW0uaW5pdFByb2Nlc3NFeGVjdXRhYmxlRm9ybSgKKwkJCQltTG9jYWxFeGVjdXRhYmxlRm9ybSwgMCk7CisJfQorCisKKwlXT2JqZWN0ICogdGhlVFJBQ0UgPSBRdWVyeTo6Z2V0UmVnZXhXU2VxdWVuY2UoCisJCQl3ZlBhcmFtZXRlck9iamVjdCwgT1JfV0lEMigidHJhY2UiLCAiVFJBQ0UiKSk7CisJaWYoICh0aGVUUkFDRSA9PSBXT2JqZWN0OjpfTlVMTF8pIHx8IHRoZVRSQUNFLT5oYXNub093bmVkRWxlbWVudCgpICkKKwl7CisJCXJldHVybiB0cnVlOworCX0KKworCS8vIENvbmZpZ3VyYXRpb24gb2YgVFJBQ0UKKwlUcmFjZUZhY3RvcnkgdHJhY2VGYWN0b3J5KG1IaXRPckp1bXBQcm9jZXNzb3IuZ2V0Q29uZmlndXJhdGlvbigpLAorCQkJRU5WLCB3ZlBhcmFtZXRlck9iamVjdCwgJm1Mb2NhbEV4ZWN1dGFibGVGb3JtKTsKKworCWlmKCB0cmFjZUZhY3RvcnkuY29uZmlndXJlKCYgbVRyYWNlT2JqZWN0aXZlKSApCisJeworLy8JCXJldHVybiggZmFsc2UgKTsKKwl9CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBMT1cgLCBDT05GSUdVUklORyApCisJQVZNX09TX0xPRyA8PCAiVGhlIHBhcnNlZCB0cmFjZSA6PiAiIDw8IHN0ZDo6ZW5kbDsKKwltVHJhY2VPYmplY3RpdmUudG9TdHJlYW0oIEFWTV9PU19MT0cgPDwgQVZNX1RBQjFfSU5ERU5UICk7CisKKwltTG9jYWxFeGVjdXRhYmxlRm9ybS50b1N0cmVhbSggQVZNX09TX0xPRyk7CisKKwlBVk1fT1NfTE9HIDw8IEVORF9JTkRFTlQgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIExPVyAsIENPTkZJR1VSSU5HICkKKworCisJbUNvdmVyYWdlU3RhdGlzdGljcy5tTnVtYmVyT2ZFbGVtZW50cyA9IG1UcmFjZU9iamVjdGl2ZS5zaXplKCk7CisKKwltQ292ZXJhZ2VTdGF0aXN0aWNzLm1Db3ZlcmFnZUJpdHNldC5yZXNpemUoCisJCQltQ292ZXJhZ2VTdGF0aXN0aWNzLm1OdW1iZXJPZkVsZW1lbnRzLCBmYWxzZSk7CisKKworCWlzUHVyZVN0YXRlVHJhbnNpdGlvbk5hdHVyZUZsYWcgPSBpc1B1cmVTdGF0ZVRyYW5zaXRpb25PYmplY3RpdmUoKTsKKworCXJldHVybiggbUNvdmVyYWdlU3RhdGlzdGljcy5tTnVtYmVyT2ZFbGVtZW50cyA+IDAgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ09ORklHVVJFIEFQSQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBCYXNlSGl0UHJvY2Vzc29yOjpyZXNldENvbmZpZygpCit7CisJbUNvdmVyYWdlU3RhdGlzdGljcy5yZXNldENvdmVyYWdlQ291bnRlcigpOworCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEZJTFRFUklORyBUT09MUworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBCYXNlSGl0UHJvY2Vzc29yOjppc0Fic29sdXRlTGVhZihFeGVjdXRpb25Db250ZXh0ICogYW5FQykKK3sKKwlpZiggKG5vdCBhbkVDLT5oYXNOZXh0KCkpICYmICgoYW5FQy0+Z2V0SGVpZ2h0KCkgPCBtSnVtcEhlaWdodCkgfHwKKwkJCShub3QgbVJlbGF0aXZlTGVhZkVDLmNvbnRhaW5zKGFuRUMpKSApICkKKwl7CisJCS8vISEgRGVhZExvY2sgb3IgQWJzb2x1dGUgU3RvcCA/CisJCW1BYnNvbHV0ZUxlYWZFQy5hcHBlbmQoIGFuRUMgKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisJQVZNX09TX1RSQUNFIDw8ICI8PDw8PCBIb0o8IERlYWRMb2NrIG9yIEFic29sdXRlIFN0b3AgPiA+Pj4+PiBFQzwgaWQ6IgorCQkJPDwgYW5FQy0+Z2V0SWROdW1iZXIoKSA8PCAiID4iIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCisJCXJldHVybiggdHJ1ZSApOworCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU0VSSUFMSVpBVElPTiBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgQmFzZUhpdFByb2Nlc3Nvcjo6dG9TdHJlYW1Db3ZlcmVkKE91dFN0cmVhbSAmIG9zKSBjb25zdAoreworCW9zIDw8IFRBQiA8PCAiaGl0PGNvdmVyZWQ+IHsgIiA8PCBtSGl0T3JKdW1wUHJvY2Vzc29yLnN0clNjaGVkdWxlcigpOworCWlmKCBtQ292ZXJhZ2VTdGF0aXN0aWNzLm1Db3ZlcmFnZUJpdHNldC5hbnlUcnVlKCkgKQorCXsKKwkJb3MgPDwgRU9MX0lOQ1JfSU5ERU5UOworCQlmb3IoIGF2bV9zaXplX3QgdHJhY2VPZmZzZXQgPSAwIDsKKwkJCQl0cmFjZU9mZnNldCAhPSBtQ292ZXJhZ2VTdGF0aXN0aWNzLm1OdW1iZXJPZkVsZW1lbnRzIDsKKwkJCQkrK3RyYWNlT2Zmc2V0ICkKKwkJeworCQkJaWYoIG1Db3ZlcmFnZVN0YXRpc3RpY3MubUNvdmVyYWdlQml0c2V0LnRlc3QodHJhY2VPZmZzZXQpICkKKwkJCXsKKwkJCQltVHJhY2VPYmplY3RpdmVbdHJhY2VPZmZzZXRdLnRvU3RyZWFtKG9zKTsKKwkJCX0KKwkJfQorCQlvcyA8PCBERUNSX0lOREVOVF9UQUIgOworCX0KKwllbHNlCisJeworCQlvcyA8PCAiICI7CisJfQorCW9zIDw8ICJ9IiA8PCBFT0w7Cit9CisKKwordm9pZCBCYXNlSGl0UHJvY2Vzc29yOjp0b1N0cmVhbVVuY292ZXJlZChPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlvcyA8PCBUQUIgPDwgImhpdDx1bmNvdmVyZWQ+IHsgIiA8PCBtSGl0T3JKdW1wUHJvY2Vzc29yLnN0clNjaGVkdWxlcigpOworCWlmKCBtQ292ZXJhZ2VTdGF0aXN0aWNzLm1Db3ZlcmFnZUJpdHNldC5hbnlGYWxzZSgpICkKKwl7CisJCW9zIDw8IEVPTF9JTkNSX0lOREVOVDsKKwkJYXZtX3NpemVfdCBvZmZzZXQgPSAwOworCQlmb3IoIDsgb2Zmc2V0ICE9IG1Db3ZlcmFnZVN0YXRpc3RpY3MubU51bWJlck9mRWxlbWVudHMgOyArK29mZnNldCApCisJCXsKKwkJCWlmKCBub3QgbUNvdmVyYWdlU3RhdGlzdGljcy5tQ292ZXJhZ2VCaXRzZXQudGVzdChvZmZzZXQpICkKKwkJCXsKKwkJCQltVHJhY2VPYmplY3RpdmVbb2Zmc2V0XS50b1N0cmVhbShvcyk7CisJCQl9CisJCX0KKwkJb3MgPDwgREVDUl9JTkRFTlRfVEFCIDsKKwl9CisJZWxzZQorCXsKKwkJb3MgPDwgIiAiOworCX0KKwlvcyA8PCAifSIgPDwgRU9MOworfQorCisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vaGl0b3JqdW1wL0Jhc2VIaXRQcm9jZXNzb3IuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9oaXRvcmp1bXAvQmFzZUhpdFByb2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYWY4MTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vaGl0b3JqdW1wL0Jhc2VIaXRQcm9jZXNzb3IuaApAQCAtMCwwICsxLDIzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDcgamFudi4gMjAxNAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEJBU0VISVRQUk9DRVNTT1JfSF8KKyNkZWZpbmUgQkFTRUhJVFBST0NFU1NPUl9IXworCisjaW5jbHVkZSA8Y29sbGVjdGlvbi9CRkNvbnRhaW5lci5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZUZvcm0uaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkNvbnRleHQuaD4KKworI2luY2x1ZGUgPGZtbC90cmFjZS9UcmFjZUNoZWNrZXIuaD4KKworI2luY2x1ZGUgPGZhbS9jb3ZlcmFnZS9CYXNlQ292ZXJhZ2VGaWx0ZXIuaD4KKworI2luY2x1ZGUgPHNvbHZlci9hcGkvU29sdmVyRGVmLmg+CisKKworCituYW1lc3BhY2Ugc2VwCit7CisKK2NsYXNzIEJGOworCitjbGFzcyBBdm1Db2RlOworY2xhc3MgQXZtQ292ZXJhZ2VTdGF0aXN0aWNzOworY2xhc3MgQXZtSGl0T3JKdW1wUHJvY2Vzc29yOworCitjbGFzcyBFdmFsdWF0aW9uRW52aXJvbm1lbnQ7CitjbGFzcyBFeGVjdXRpb25Db250ZXh0OworY2xhc3MgRXhlY3V0YWJsZVN5c3RlbTsKKworY2xhc3MgT3BlcmF0b3I7CisKKworY2xhc3MgQmFzZUhpdFByb2Nlc3NvcgoreworCisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBBVFRSSUJVVEUKKwkgKi8KKwlBdm1IaXRPckp1bXBQcm9jZXNzb3IgJiBtSGl0T3JKdW1wUHJvY2Vzc29yOworCisJQXZtQ292ZXJhZ2VTdGF0aXN0aWNzICYgbUNvdmVyYWdlU3RhdGlzdGljczsKKworCUV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOVjsKKworCVNvbHZlckRlZjo6U09MVkVSX0tJTkQgbVNvbHZlcktpbmQ7CisKKwlFeGVjdXRhYmxlRm9ybSBtTG9jYWxFeGVjdXRhYmxlRm9ybTsKKworCVRyYWNlQ2hlY2tlciBtVHJhY2VDaGVja2VyOworCisJQXZtQ29kZSBtVHJhY2VPYmplY3RpdmU7CisJYm9vbCBpc1B1cmVTdGF0ZVRyYW5zaXRpb25OYXR1cmVGbGFnOworCisJLy8gQ29tcHV0aW5nIExvY2FsIFZhcmlhYmxlcworCWF2bV9zaXplX3QgdHJhY2VPZmZzZXQ7CisKKwlMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgbVJlbGF0aXZlUm9vdEVDOworCisJTGlzdE9mRXhlY3V0aW9uQ29udGV4dDo6aXRlcmF0b3IgZWNJdDsKKwlMaXN0T2ZFeGVjdXRpb25Db250ZXh0OjppdGVyYXRvciBlY0l0RW5kOworCisJVmVjdG9yT2ZFeGVjdXRpb25Db250ZXh0ICYgbVJlbGF0aXZlTGVhZkVDOworCisJTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIG1BYnNvbHV0ZUxlYWZFQzsKKwlMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgbUJsYWNrSG9sZUVDOworCisJTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIG1CYWNrdHJhY2tIaXRFQzsKKwlib29sIG1CYWNrdHJhY2tGbGFnOworCisJYXZtX3NpemVfdCBtSnVtcEhlaWdodDsKKworCVZlY3Rvck9mRXhlY3V0aW9uQ29udGV4dCBtTWF4SGl0RUM7CisJYXZtX3NpemVfdCBoaXRPZmZzZXQ7CisJYXZtX3NpemVfdCBoaXRPZmZzZXRFbmQ7CisKKwlhdm1fc2l6ZV90IG1IaXRDb3VudDsKKworCUV4ZWN1dGlvbkNvbnRleHQ6OmNoaWxkX2l0ZXJhdG9yIGVjQ2hpbGRJdDsKKwlFeGVjdXRpb25Db250ZXh0OjpjaGlsZF9pdGVyYXRvciBlY0NoaWxkSXRFbmQ7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUJhc2VIaXRQcm9jZXNzb3IoQXZtSGl0T3JKdW1wUHJvY2Vzc29yICYgaG9qUHJvY2Vzc29yLAorCQkJRXZhbHVhdGlvbkVudmlyb25tZW50ICYgYW5FTlYsIE9wZXJhdG9yICogb3ApOworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkJhc2VIaXRQcm9jZXNzb3IoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwl2aXJ0dWFsIHN0ZDo6c3RyaW5nIHN0cktpbmQoKSA9IDA7CisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBtVHJhY2VPYmplY3RpdmUKKwkgKi8KKwlib29sIGlzUHVyZVN0YXRlVHJhbnNpdGlvbk9iamVjdGl2ZSgpIGNvbnN0OworCisKKwkvKioKKwkgKiBDb3ZlcmFnZSBUZXN0CisJICovCisJaW5saW5lIGJvb2wgZ29hbEFjaGlldmVkKCkKKwl7CisJCXJldHVybiggbUNvdmVyYWdlU3RhdGlzdGljcy5nb2FsQWNoaWV2ZWQoKSApOworCX0KKworCWlubGluZSBib29sIGhhc1VuY292ZXJlZCgpCisJeworCQlyZXR1cm4oIG1Db3ZlcmFnZVN0YXRpc3RpY3MuaGFzVW5jb3ZlcmVkKCkgKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBDT05GSUdVUkUgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJdmlydHVhbCBib29sIGNvbmZpZ3VyZShXT2JqZWN0ICogd2ZQYXJhbWV0ZXJPYmplY3QpOworCisJdmlydHVhbCBib29sIHJlc2V0Q29uZmlnKCk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBISVQgRklMVEVSSU5HIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXZpcnR1YWwgYm9vbCBnb2FsV2lsbE5ldmVyQWNoaWV2ZWQoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpID0gMDsKKworCXZpcnR1YWwgYm9vbCBoaXQoYXZtX3NpemVfdCBqdW1wSGVpZ2h0KSA9IDA7CisKKwl2aXJ0dWFsIHZvaWQgaGl0U2VsZWN0KGF2bV9zaXplX3QganVtcE9mZnNldCkgPSAwOworCisKKwlpbmxpbmUgYm9vbCBoaXQoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMsIGNvbnN0IEJGICYgYXJnKQorCXsKKwkJcmV0dXJuKCBtVHJhY2VDaGVja2VyLmlzU2F0KCgqIGFuRUMpLCBhcmcpICk7CisJfQorCisJLy8gRklMVEVSSU5HIFRPT0xTCisJYm9vbCBpc0Fic29sdXRlTGVhZihFeGVjdXRpb25Db250ZXh0ICogYW5FQyk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBXSUxMIE5FVkVSIEhJVCBGSUxURVJJTkcgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJaW5saW5lIGJvb2wgd2lsbE5ldmVySGl0KEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDLCBjb25zdCBCRiAmIGFyZykKKwl7CisJCSsrbUNvdmVyYWdlU3RhdGlzdGljcy5tTnVtYmVyT2ZCbGFja0hvbGVUZXN0OworCisJCXJldHVybiggbVRyYWNlQ2hlY2tlci53aWxsTmV2ZXJTYXQoKCogYW5FQyksIGFyZykgKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBSRVBPUlQgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJaW5saW5lIHZvaWQgcmVwb3J0TWluaW11bShPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCWlmKCBtQ292ZXJhZ2VTdGF0aXN0aWNzLmhhc1VuY292ZXJlZCgpICkKKwkJeworCQkJdG9TdHJlYW1VbmNvdmVyZWQob3MpOworCQl9CisJCXRvU3RyZWFtQ292ZXJlZChvcyk7CisJfQorCisKKwlpbmxpbmUgdm9pZCByZXBvcnREZWZhdWx0KE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJaWYoIG1Db3ZlcmFnZVN0YXRpc3RpY3MuaGFzVW5jb3ZlcmVkKCkgKQorCQl7CisJCQl0b1N0cmVhbVVuY292ZXJlZChvcyk7CisJCX0KKworCQlpZiggbUNvdmVyYWdlU3RhdGlzdGljcy5oYXNDb3ZlcmVkKCkgKQorCQl7CisJCQl0b1N0cmVhbUNvdmVyZWQob3MpOworCQl9CisJfQorCisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBTRVJJQUxJWkFUSU9OIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXZvaWQgdG9TdHJlYW1Db3ZlcmVkKE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworCXZvaWQgdG9TdHJlYW1VbmNvdmVyZWQoT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCisJaW5saW5lIHZpcnR1YWwgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCXRvU3RyZWFtVW5jb3ZlcmVkKG9zKTsKKworCQl0b1N0cmVhbUNvdmVyZWQob3MpOworCX0KKworfTsKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qIEJBU0VISVRQUk9DRVNTT1JfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9oaXRvcmp1bXAvSGl0T3JkZXJlZFByb2Nlc3Nvci5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vaGl0b3JqdW1wL0hpdE9yZGVyZWRQcm9jZXNzb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MTEyZDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vaGl0b3JqdW1wL0hpdE9yZGVyZWRQcm9jZXNzb3IuY3BwCkBAIC0wLDAgKzEsNDAxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMzEgamFudi4gMjAxNAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiSGl0T3JkZXJlZFByb2Nlc3Nvci5oIgorCisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yTWFuYWdlci5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uQ29udGV4dC5oPgorCisjaW5jbHVkZSA8ZmFtL2hpdG9yanVtcC9Bdm1IaXRPckp1bXBQcm9jZXNzb3IuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoqCisgKiBDT05TVFJVQ1RPUgorICogRGVmYXVsdAorICovCitIaXRPcmRlcmVkUHJvY2Vzc29yOjpIaXRPcmRlcmVkUHJvY2Vzc29yKAorCQlBdm1IaXRPckp1bXBQcm9jZXNzb3IgJiBob2pQcm9jZXNzb3IsIEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIGFuRU5WKQorOiBCYXNlSGl0UHJvY2Vzc29yKGhvalByb2Nlc3NvciwgYW5FTlYgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NFUVVFTkNFICksCittTGFzdE9iamVjdGl2ZSggKQoreworCS8vISEgTk9USElORworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDT05GSUdVUkUgQVBJCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIEhpdE9yZGVyZWRQcm9jZXNzb3I6OmNvbmZpZ3VyZShXT2JqZWN0ICogd2ZQYXJhbWV0ZXJPYmplY3QpCit7CisJYm9vbCBtQ29uZmlnRmxhZyA9IEJhc2VIaXRQcm9jZXNzb3I6OmNvbmZpZ3VyZSh3ZlBhcmFtZXRlck9iamVjdCk7CisKKwlpZiggaXNQdXJlU3RhdGVUcmFuc2l0aW9uTmF0dXJlRmxhZyAmJiBtVHJhY2VPYmplY3RpdmUubm9uZW1wdHkoKSApCisJeworCQltTGFzdE9iamVjdGl2ZSA9IG1UcmFjZU9iamVjdGl2ZS5sYXN0KCk7CisJfQorCisJcmV0dXJuKCBtQ29uZmlnRmxhZyApOworfQorCisKK2Jvb2wgSGl0T3JkZXJlZFByb2Nlc3Nvcjo6cmVzZXRDb25maWcoKQoreworCXJldHVybiggQmFzZUhpdFByb2Nlc3Nvcjo6cmVzZXRDb25maWcoKSApOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gSElUIEZJTFRFUklORyBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgSGl0T3JkZXJlZFByb2Nlc3Nvcjo6Z29hbFdpbGxOZXZlckFjaGlldmVkKEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDKQoreworCWlmKCBtTGFzdE9iamVjdGl2ZS5pbnZhbGlkKCkgKQorCXsKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCWVsc2UgaWYoIEJhc2VIaXRQcm9jZXNzb3I6OmhpdChhbkVDLCBtTGFzdE9iamVjdGl2ZSkgKQorCXsKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCWVsc2UgaWYoIHdpbGxOZXZlckhpdChhbkVDLCBtTGFzdE9iamVjdGl2ZSkgKQorCXsKKwkJKyttQ292ZXJhZ2VTdGF0aXN0aWNzLm1OdW1iZXJPZkJsYWNrSG9sZTsKKworCQltQmxhY2tIb2xlRUMuYXBwZW5kKGFuRUMpOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfVFJBQ0UgPDwgIjw8PDw8IGdvYWxXaWxsTmV2ZXJBY2hpZXZlZDwgQkxBQ0sgSE9MRSA+ID4+Pj4+IiA8PCBzdGQ6OmVuZGwKKwkJCTw8ICJFQzo+ICIgPDwgYW5FQy0+c3RyX21pbigpIDw8IHN0ZDo6ZW5kbAorCQkJPDwgc3RyX2luZGVudCggbUxhc3RPYmplY3RpdmUgKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKwllbHNlCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorfQorCisKKworYm9vbCBIaXRPcmRlcmVkUHJvY2Vzc29yOjpoaXQoYXZtX3NpemVfdCBqdW1wSGVpZ2h0KQoreworCWlmKCBnb2FsQWNoaWV2ZWQoKSApCisJeworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKwltSnVtcEhlaWdodCA9IGp1bXBIZWlnaHQ7CisKKworCS8vIEFMR08gZm9yIE9SREVSRUQKKwltSGl0Q291bnQgPSAwOworCW1NYXhIaXRFQy5jbGVhcigpOworCisJRXhlY3V0aW9uQ29udGV4dDo6Y2hpbGRfaXRlcmF0b3IgaXRDaGlsZEVDOworCUV4ZWN1dGlvbkNvbnRleHQ6OmNoaWxkX2l0ZXJhdG9yIGVuZENoaWxkRUM7CisKKwllY0l0ID0gbVJlbGF0aXZlUm9vdEVDLmJlZ2luKCk7CisJZWNJdEVuZCA9IG1SZWxhdGl2ZVJvb3RFQy5lbmQoKTsKKwlmb3IoIDsgZWNJdCAhPSBlY0l0RW5kIDsgKytlY0l0ICkKKwl7CisJCWl0Q2hpbGRFQyA9ICgqZWNJdCktPmJlZ2luKCk7CisJCWVuZENoaWxkRUMgPSAoKmVjSXQpLT5lbmQoKTsKKwkJZm9yKCA7IGl0Q2hpbGRFQyAhPSBlbmRDaGlsZEVDIDsgKytpdENoaWxkRUMgKQorCQl7CisJCQloaXQoKCppdENoaWxkRUMpLCBtQ292ZXJhZ2VTdGF0aXN0aWNzLm1OdW1iZXJPZkNvdmVyZWQsIDApOworCQl9CisJfQorCisJaWYoIG1IaXRDb3VudCA+IDAgKQorCXsKKwkJdHJhY2VPZmZzZXQgPSBtQ292ZXJhZ2VTdGF0aXN0aWNzLm1OdW1iZXJPZkNvdmVyZWQ7CisJCW1Db3ZlcmFnZVN0YXRpc3RpY3MuYWRkQ292ZXJlZEVsZW1lbnQoIG1IaXRDb3VudCApOworCQkvLyBzZXQgdGhlIGNvdmVyYWdlIGJpdHNldAorCQlmb3IoIDsgdHJhY2VPZmZzZXQgPCBtQ292ZXJhZ2VTdGF0aXN0aWNzLm1OdW1iZXJPZkNvdmVyZWQgOyArK3RyYWNlT2Zmc2V0ICkKKwkJeworCQkJbUNvdmVyYWdlU3RhdGlzdGljcy5tQ292ZXJhZ2VCaXRzZXQuc2V0KHRyYWNlT2Zmc2V0LCB0cnVlKTsKKwkJfQorCisJCW1SZWxhdGl2ZUxlYWZFQy5jbGVhcigpOworCisJCWhpdE9mZnNldEVuZCA9IG1NYXhIaXRFQy5zaXplKCk7CisJCWZvciggaGl0T2Zmc2V0ID0gMCA7IGhpdE9mZnNldCAhPSBoaXRPZmZzZXRFbmQgOyArK2hpdE9mZnNldCApCisJCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfVFJBQ0UgPDwgIjw8PDw8IGhpdDwgY2FuZGlkYXRlID4gPj4+Pj4gRUM8IGlkOiIKKwkJCTw8IG1NYXhIaXRFQ1sgaGl0T2Zmc2V0IF0tPmdldElkTnVtYmVyKCkgPDwgIiA+IiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFBST0NFU1NPUiApCisKKwkJCW1NYXhIaXRFQ1sgaGl0T2Zmc2V0IF0tPnNldFdlaWdodCgwKTsKKworCQkJbVJlbGF0aXZlTGVhZkVDLmFwcGVuZCggbU1heEhpdEVDWyBoaXRPZmZzZXQgXSApOworCQl9CisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfVFJBQ0UgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKwordm9pZCBIaXRPcmRlcmVkUHJvY2Vzc29yOjpoaXQoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMsCisJCWF2bV9zaXplX3QgdW5jb3ZlcmVkT2Zmc2V0LCBhdm1fc2l6ZV90IGhpdENvdW50KQoreworCWlmKCBtQmxhY2tIb2xlRUMuY29udGFpbnMoYW5FQykgKQorCXsKKwkJcmV0dXJuOworCX0KKworCWF2bV9zaXplX3Qgc2F2ZUhpdENvdW50ID0gaGl0Q291bnQ7CisKKwlmb3IoIDsgdW5jb3ZlcmVkT2Zmc2V0ICE9IG1Db3ZlcmFnZVN0YXRpc3RpY3MubU51bWJlck9mRWxlbWVudHMgOworCQkJKyt1bmNvdmVyZWRPZmZzZXQgKQorCXsKKwkJaWYoIEJhc2VIaXRQcm9jZXNzb3I6OmhpdChhbkVDLCBtVHJhY2VPYmplY3RpdmVbdW5jb3ZlcmVkT2Zmc2V0XSkgKQorCQl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFBST0NFU1NPUiApCisJQVZNX09TX1RSQUNFIDw8ICI8PDw8PCBoaXQ8IDEgPiA+Pj4+PiBFQzwgaWQ6IgorCQkJPDwgYW5FQy0+Z2V0SWROdW1iZXIoKSA8PCAiID4iIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgUFJPQ0VTU09SICkKKworCQkJYW5FQy0+Z2V0d0ZsYWdzKCkuc2V0Q292ZXJhZ2VFbGVtZW50VHJhY2UoKTsKKworCQkJYW5FQy0+YWRkSW5mbyhtSGl0T3JKdW1wUHJvY2Vzc29yLCBtVHJhY2VPYmplY3RpdmVbdW5jb3ZlcmVkT2Zmc2V0XSk7CisKKwkJCSsraGl0Q291bnQ7CisKKwkJCWlmKCBub3QgbUhpdE9ySnVtcFByb2Nlc3Nvci5tRm9sZGluZ0ZsYWcgKQorCQkJeworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJZWxzZQorCQl7CisJCQlpZiggbUhpdE9ySnVtcFByb2Nlc3Nvci5tSGl0Q29uc2VjdXRpdmVGbGFnICYmCisJCQkJKHNhdmVIaXRDb3VudCA9PSBoaXRDb3VudCkgJiYgKHVuY292ZXJlZE9mZnNldCA+IDApICkKKwkJCXsKKwkJCQkvLyBUT0RPCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFBST0NFU1NPUiApCisJQVZNX09TX1RSQUNFIDw8ICI8PDw8PCBoaXQjY29uc2VjdXRpdmU8IEZBSUxFRCA+ID4+Pj4+IEVDPCBpZDoiCisJCQk8PCBhbkVDLT5nZXRJZE51bWJlcigpIDw8ICIgPiIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCisJCQkJcmV0dXJuOworCQkJfQorCisJCQlpZiggd2lsbE5ldmVyUmVhY2hlZChhbkVDLCBtVHJhY2VPYmplY3RpdmVbdW5jb3ZlcmVkT2Zmc2V0XSkgKQorCQkJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCUFWTV9PU19UUkFDRSA8PCAiPDw8PDwgaGl0I25ldmVyPCAxID4gPj4+Pj4gRUM8IGlkOiIKKwkJCTw8IGFuRUMtPmdldElkTnVtYmVyKCkgPDwgIiA+IiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFBST0NFU1NPUiApCisKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisJfQorCisKKwlpZiggaGl0Q291bnQgPT0gbUNvdmVyYWdlU3RhdGlzdGljcy5nZXROdW1iZXJPZlVuY292ZXJlZCgpICkKKwl7CisJCWFuRUMtPmdldHdGbGFncygpLnNldE9iamVjdGl2ZUFjaGlldmVkVHJhY2UoKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCUFWTV9PU19UUkFDRSA8PCAiPDw8PDwgaGl0PCBnb2FsIGFjaGlldmVkID4gPj4+Pj4gRUM8IGlkOiIKKwkJCTw8IGFuRUMtPmdldElkTnVtYmVyKCkgPDwgIiA+IiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFBST0NFU1NPUiApCisKKworCQlpZiggaGl0Q291bnQgPiBtSGl0Q291bnQgKQorCQl7CisJCQlpZiggbUJhY2t0cmFja0ZsYWcgKQorCQkJeworCQkJCWhpdE9mZnNldEVuZCA9IG1NYXhIaXRFQy5zaXplKCk7CisJCQkJZm9yKCBoaXRPZmZzZXQgPSAwIDsgaGl0T2Zmc2V0ICE9IGhpdE9mZnNldEVuZCA7ICsraGl0T2Zmc2V0ICkKKwkJCQl7CisJCQkJCXNhdmVCYWNrdHJhY2thYmxlKG1NYXhIaXRFQ1toaXRPZmZzZXRdLCBtSGl0Q291bnQpOworCQkJCX0KKwkJCX0KKworCQkJbU1heEhpdEVDLmNsZWFyKCk7CisKKwkJCW1IaXRDb3VudCA9IGhpdENvdW50OworCQl9CisKKwkJbU1heEhpdEVDLnB1c2hfYmFjayggYW5FQyApOworCX0KKworCWVsc2UgaWYoIGFuRUMtPmhhc05leHQoKSApCisJeworCQlFeGVjdXRpb25Db250ZXh0OjpjaGlsZF9pdGVyYXRvciBpdENoaWxkRUMgPSBhbkVDLT5iZWdpbigpOworCQlFeGVjdXRpb25Db250ZXh0OjpjaGlsZF9pdGVyYXRvciBlbmRDaGlsZEVDID0gYW5FQy0+ZW5kKCk7CisJCWZvciggOyBpdENoaWxkRUMgIT0gZW5kQ2hpbGRFQyA7ICsraXRDaGlsZEVDICkKKwkJeworCQkJaGl0KCgqaXRDaGlsZEVDKSwgdW5jb3ZlcmVkT2Zmc2V0LCBoaXRDb3VudCk7CisJCX0KKwl9CisKKwllbHNlIGlmKCBpc0Fic29sdXRlTGVhZihhbkVDKSApCisJeworCQkvLyEhIENPTlRJTlVFCisJfQorCisJZWxzZSBpZiggaGl0Q291bnQgPiBtSGl0Q291bnQgKQorCXsKKwkJaWYoIG1CYWNrdHJhY2tGbGFnICkKKwkJeworCQkJaGl0T2Zmc2V0RW5kID0gbU1heEhpdEVDLnNpemUoKTsKKwkJCWZvciggaGl0T2Zmc2V0ID0gMCA7IGhpdE9mZnNldCAhPSBoaXRPZmZzZXRFbmQgOyArK2hpdE9mZnNldCApCisJCQl7CisJCQkJc2F2ZUJhY2t0cmFja2FibGUobU1heEhpdEVDW2hpdE9mZnNldF0sIG1IaXRDb3VudCk7CisJCQl9CisJCX0KKworCQltTWF4SGl0RUMuY2xlYXIoKTsKKworCQltSGl0Q291bnQgPSBoaXRDb3VudDsKKworCQltTWF4SGl0RUMucHVzaF9iYWNrKCBhbkVDICk7CisJfQorCisJZWxzZSBpZiggKGhpdENvdW50ID4gMCkgKQorCXsKKwkJaWYoIGhpdENvdW50ID09IG1IaXRDb3VudCApCisJCXsKKwkJCW1NYXhIaXRFQy5wdXNoX2JhY2soIGFuRUMgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWFuRUMtPnNldFdlaWdodE1heCgpOworCisJCQlpZiggbUJhY2t0cmFja0ZsYWcgKQorCQkJeworCQkJCXNhdmVCYWNrdHJhY2thYmxlKGFuRUMsIGhpdENvdW50KTsKKwkJCX0KKwkJfQorCX0KKworCWVsc2UgaWYoIGhpdENvdW50ID09IDAgKQorCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfVFJBQ0UgPDwgIjw8PDw8IG5vcCA+Pj4+PiBFQzwgaWQ6IgorCQkJPDwgYW5FQy0+Z2V0SWROdW1iZXIoKSA8PCAiID4iIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgUFJPQ0VTU09SICkKKworCQlhbkVDLT5zZXRXZWlnaHRNYXgoKTsKKworCQlpZiggbUJhY2t0cmFja0ZsYWcgKQorCQl7CisJCQlzYXZlQmFja3RyYWNrYWJsZShhbkVDLCBoaXRDb3VudCk7CisJCX0KKwl9Cit9CisKKwordm9pZCBIaXRPcmRlcmVkUHJvY2Vzc29yOjpoaXRTZWxlY3QoYXZtX3NpemVfdCBqdW1wT2Zmc2V0KQoreworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCUFWTV9PU19UUkFDRSA8PCAiPDw8PDwgaGl0PCAwID4gPj4+Pj4gRUM8IGlkOiIKKwkJCTw8IG1NYXhIaXRFQ1sganVtcE9mZnNldCBdLT5nZXRJZE51bWJlcigpIDw8ICIgPiIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCisJbU1heEhpdEVDWyBqdW1wT2Zmc2V0IF0tPnNldFdlaWdodCgwKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRklMVEVSSU5HIFRPT0xTCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIEhpdE9yZGVyZWRQcm9jZXNzb3I6OnNhdmVCYWNrdHJhY2thYmxlKAorCQlFeGVjdXRpb25Db250ZXh0ICogYW5FQywgYXZtX3NpemVfdCBoaXRDb3VudCkKK3sKKwlpZiggYW5FQy0+aGFzTmV4dCgpICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCWVsc2UgaWYoIHdpbGxOZXZlclJlYWNoZWQoYW5FQywgbVRyYWNlT2JqZWN0aXZlCisJCQlbIG1Db3ZlcmFnZVN0YXRpc3RpY3MuZ2V0TnVtYmVyT2ZDb3ZlcmVkKCkgKyBoaXRDb3VudCBdKSApCisJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCUFWTV9PU19UUkFDRSA8PCAiPDw8PDwgaGl0I25ldmVyPCAxID4gPj4+Pj4gRUM8IGlkOiIKKwkJPDwgYW5FQy0+Z2V0SWROdW1iZXIoKSA8PCAiID4iIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgUFJPQ0VTU09SICkKKwl9CisKKwllbHNlCisJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCUFWTV9PU19UUkFDRSA8PCAiPDw8PDwgaGl0PCBiYWNrdHJhY3QgPiA+Pj4+PiBFQzwgaWQ6IgorCQk8PCBhbkVDLT5nZXRJZE51bWJlcigpIDw8ICIgPiIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCisJCWFuRUMtPmdldFVuaXFJbmZvcm1hdGlvbigpLT5nZXRVbmlxSGl0T3JKdW1wT2JqZWN0aXZlSW5mbygpLT4KKwkJCQlzZXRDb3ZlcmFnZVN0YXRpc3RpY3MoIG1Db3ZlcmFnZVN0YXRpc3RpY3MgLCBoaXRDb3VudCApOworCisJCW1CYWNrdHJhY2tIaXRFQy5hcHBlbmQoIGFuRUMgKTsKKwl9Cit9CisKKworYm9vbCBIaXRPcmRlcmVkUHJvY2Vzc29yOjp3aWxsTmV2ZXJSZWFjaGVkKAorCQlFeGVjdXRpb25Db250ZXh0ICogYW5FQywgY29uc3QgQkYgJiBhcmcpCit7CisJaWYoIGlzQWJzb2x1dGVMZWFmKGFuRUMpICkKKwl7CisJCXJldHVybiggdHJ1ZSApOworCX0KKworCWVsc2UgaWYoIEJhc2VIaXRQcm9jZXNzb3I6OndpbGxOZXZlckhpdChhbkVDLCBhcmcpICkKKwl7CisJCSsrbUNvdmVyYWdlU3RhdGlzdGljcy5tTnVtYmVyT2ZCbGFja0hvbGU7CisKKwkJbUJsYWNrSG9sZUVDLmFwcGVuZChhbkVDKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisJQVZNX09TX1RSQUNFIDw8ICI8PDw8PCBIb0o8IEJMQUNLIEhPTEUgPiA+Pj4+PiIgPDwgc3RkOjplbmRsCisJCQk8PCAiRUM6PiAiIDw8IGFuRUMtPnN0cl9taW4oKSA8PCBzdGQ6OmVuZGwKKwkJCTw8IHN0cl9pbmRlbnQoIGFyZyApIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCisJCXJldHVybiggdHJ1ZSApOworCX0KKwllbHNlCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorfQorCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2hpdG9yanVtcC9IaXRPcmRlcmVkUHJvY2Vzc29yLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vaGl0b3JqdW1wL0hpdE9yZGVyZWRQcm9jZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTY0MWM4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2hpdG9yanVtcC9IaXRPcmRlcmVkUHJvY2Vzc29yLmgKQEAgLTAsMCArMSw5OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDMxIGphbnYuIDIwMTQKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBISVRPUkRFUkVEUFJPQ0VTU09SX0hfCisjZGVmaW5lIEhJVE9SREVSRURQUk9DRVNTT1JfSF8KKworI2luY2x1ZGUgIkJhc2VIaXRQcm9jZXNzb3IuaCIKKworCituYW1lc3BhY2Ugc2VwCit7CisKKworY2xhc3MgQXZtSGl0T3JKdW1wUHJvY2Vzc29yOworY2xhc3MgRXhlY3V0aW9uQ29udGV4dDsKK2NsYXNzIEV2YWx1YXRpb25FbnZpcm9ubWVudDsKKworCitjbGFzcyBIaXRPcmRlcmVkUHJvY2Vzc29yICA6ICBwdWJsaWMgQmFzZUhpdFByb2Nlc3NvcgoreworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQVRUUklCVVRFCisJICovCisJQkYgbUxhc3RPYmplY3RpdmU7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUhpdE9yZGVyZWRQcm9jZXNzb3IoQXZtSGl0T3JKdW1wUHJvY2Vzc29yICYgaG9qUHJvY2Vzc29yLAorCQkJRXZhbHVhdGlvbkVudmlyb25tZW50ICYgYW5FTlYpOworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkhpdE9yZGVyZWRQcm9jZXNzb3IoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwlpbmxpbmUgc3RkOjpzdHJpbmcgc3RyS2luZCgpCisJeworCQlyZXR1cm4oICJvcmRlcmVkIiApOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIENPTkZJR1VSRSBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwl2aXJ0dWFsIGJvb2wgY29uZmlndXJlKFdPYmplY3QgKiB3ZlBhcmFtZXRlck9iamVjdCk7CisKKwl2aXJ0dWFsIGJvb2wgcmVzZXRDb25maWcoKTsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIEhJVCBGSUxURVJJTkcgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJYm9vbCBnb2FsV2lsbE5ldmVyQWNoaWV2ZWQoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpOworCisJYm9vbCBoaXQoYXZtX3NpemVfdCBqdW1wSGVpZ2h0KTsKKworCXZvaWQgaGl0KEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDLAorCQkJYXZtX3NpemVfdCB1bmNvdmVyZWRPZmZzZXQsIGF2bV9zaXplX3QgaGl0Q291bnQpOworCisJdmlydHVhbCB2b2lkIGhpdFNlbGVjdChhdm1fc2l6ZV90IGp1bXBPZmZzZXQpOworCisKKwkvLyBGSUxURVJJTkcgVE9PTFMKKwl2b2lkIHNhdmVCYWNrdHJhY2thYmxlKEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDLCBhdm1fc2l6ZV90IGhpdENvdW50KTsKKworCWJvb2wgd2lsbE5ldmVyUmVhY2hlZChFeGVjdXRpb25Db250ZXh0ICogYW5FQywgY29uc3QgQkYgJiBhcmcpOworCisKK307CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKiBISVRPUkRFUkVEUFJPQ0VTU09SX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vaGl0b3JqdW1wL0hpdFVub3JkZXJlZFByb2Nlc3Nvci5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vaGl0b3JqdW1wL0hpdFVub3JkZXJlZFByb2Nlc3Nvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY5OGIxZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9oaXRvcmp1bXAvSGl0VW5vcmRlcmVkUHJvY2Vzc29yLmNwcApAQCAtMCwwICsxLDQ0NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDMxIGphbnYuIDIwMTQKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkhpdFVub3JkZXJlZFByb2Nlc3Nvci5oIgorCisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yTWFuYWdlci5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uQ29udGV4dC5oPgorCisjaW5jbHVkZSA8ZmFtL2hpdG9yanVtcC9Bdm1IaXRPckp1bXBQcm9jZXNzb3IuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoqCisgKiBDT05TVFJVQ1RPUgorICogRGVmYXVsdAorICovCitIaXRVbm9yZGVyZWRQcm9jZXNzb3I6OkhpdFVub3JkZXJlZFByb2Nlc3NvcigKKwkJQXZtSGl0T3JKdW1wUHJvY2Vzc29yICYgaG9qUHJvY2Vzc29yLCBFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBhbkVOVikKKzogQmFzZUhpdFByb2Nlc3Nvcihob2pQcm9jZXNzb3IsIGFuRU5WLAorCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0lOVEVSTEVBVklORyksCisKK21IaXRDb3ZlcmFnZUJpdHNldCggKSwKK21IaXRTZWxlY3RlZENvdmVyYWdlQml0c2V0KCApLAorbUhpdFNlbGVjdGVkRUMoICkKK3sKKwkvLyEhIE5PVEhJTkcKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ09ORklHVVJFIEFQSQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBIaXRVbm9yZGVyZWRQcm9jZXNzb3I6OnJlc2V0Q29uZmlnKCkKK3sKKwlyZXR1cm4oIEJhc2VIaXRQcm9jZXNzb3I6OnJlc2V0Q29uZmlnKCkgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gSElUIEZJTFRFUklORyBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgSGl0VW5vcmRlcmVkUHJvY2Vzc29yOjpnb2FsV2lsbE5ldmVyQWNoaWV2ZWQoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpCit7CisJaWYoIG5vdCBpc1B1cmVTdGF0ZVRyYW5zaXRpb25OYXR1cmVGbGFnICkKKwl7CisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwllbHNlCisJeworLy8JCXRyYWNlT2Zmc2V0ID0gMDsKKy8vCQlmb3IoIDsgdHJhY2VPZmZzZXQgIT0gbUNvdmVyYWdlU3RhdGlzdGljcy5tTnVtYmVyT2ZFbGVtZW50cyA7ICsrdHJhY2VPZmZzZXQgKQorLy8JCXsKKy8vCQkJaWYoIG1Db3ZlcmFnZVN0YXRpc3RpY3MuY292ZXJhZ2VCaXRzZXQudGVzdCh0cmFjZU9mZnNldCkgKQorLy8JCQl7CisvLwkJCQkvLyEhIGNvbnRpbnVlOworLy8JCQl9CisvLwkJCWVsc2UgaWYoIEJhc2VIaXRQcm9jZXNzb3I6OndpbGxOZXZlckhpdCgKKy8vCQkJCQlhbkVDLG1UcmFjZU9iamVjdGl2ZVt0cmFjZU9mZnNldF0pICkKKy8vCQkJeworLy8JCQkJaWYoIG5vdCBCYXNlSGl0UHJvY2Vzc29yOjpoaXQoYW5FQyxtVHJhY2VPYmplY3RpdmVbdHJhY2VPZmZzZXRdKSApCisvLwkJCQl7CisvLwkJCQkJKyttQ292ZXJhZ2VTdGF0aXN0aWNzLm1OdW1iZXJPZkJsYWNrSG9sZTsKKy8vCisvLwkJCQkJbUJsYWNrSG9sZUVDLmFwcGVuZChhbkVDKTsKKy8vCisvL0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorLy8JQVZNX09TX1RSQUNFIDw8ICI8PDw8PCBIb0o8IEJMQUNLIEhPTEUgPiA+Pj4+PiIgPDwgc3RkOjplbmRsCisvLwkJCTw8ICJFQzo+ICIgPDwgYW5FQy0+c3RyX21pbigpIDw8IHN0ZDo6ZW5kbDsKKy8vQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisvLworLy8JCQkJCXJldHVybiggdHJ1ZSApOworLy8JCQkJfQorLy8JCQl9CisvLwkJfQorCisJCXJldHVybiggZmFsc2UgKTsKKwl9Cit9CisKKworYm9vbCBIaXRVbm9yZGVyZWRQcm9jZXNzb3I6OmhpdChhdm1fc2l6ZV90IGp1bXBIZWlnaHQpCit7CisJaWYoIGdvYWxBY2hpZXZlZCgpICkKKwl7CisJCXJldHVybiggdHJ1ZSApOworCX0KKworCW1KdW1wSGVpZ2h0ID0ganVtcEhlaWdodDsKKworCisJLy8gQUxHTyBmb3IgVU5PUkRFUkVECisJbUhpdENvdW50ID0gMDsKKwltTWF4SGl0RUMuY2xlYXIoKTsKKwltSGl0Q292ZXJhZ2VCaXRzZXQuY2xlYXIoKTsKKworCWlmKCBtUmVsYXRpdmVSb290RUMuc2luZ2xldG9uKCkgKQorCXsKKwkJaGl0KG1SZWxhdGl2ZVJvb3RFQy5mcm9udCgpLCBtQ292ZXJhZ2VTdGF0aXN0aWNzLm1Db3ZlcmFnZUJpdHNldCwgMCk7CisJfQorCWVsc2UKKwl7CisJCUV4ZWN1dGlvbkNvbnRleHQ6OmNoaWxkX2l0ZXJhdG9yIGl0Q2hpbGRFQzsKKwkJRXhlY3V0aW9uQ29udGV4dDo6Y2hpbGRfaXRlcmF0b3IgZW5kQ2hpbGRFQzsKKworCQllY0l0RW5kID0gbVJlbGF0aXZlUm9vdEVDLmVuZCgpOworCQlmb3IoIGVjSXQgPSBtUmVsYXRpdmVSb290RUMuYmVnaW4oKSA7IGVjSXQgIT0gZWNJdEVuZCA7ICsrZWNJdCApCisJCXsKKwkJCWl0Q2hpbGRFQyA9ICgqZWNJdCktPmJlZ2luKCk7CisJCQllbmRDaGlsZEVDID0gKCplY0l0KS0+ZW5kKCk7CisJCQlmb3IoIDsgaXRDaGlsZEVDICE9IGVuZENoaWxkRUMgOyArK2l0Q2hpbGRFQyApCisJCQl7CisJCQkJaGl0KCgqaXRDaGlsZEVDKSwgaGl0Q292ZXJhZ2VCaXRzZXQoKmVjSXQpLCAwKTsKKwkJCX0KKwkJfQorCisJCW1IaXRTZWxlY3RlZEVDLmNsZWFyKCk7CisJCW1IaXRTZWxlY3RlZENvdmVyYWdlQml0c2V0LmNsZWFyKCk7CisJfQorCisKKwlpZiggbUhpdENvdW50ID4gMCApCisJeworCQltQ292ZXJhZ2VTdGF0aXN0aWNzLmFkZENvdmVyZWRFbGVtZW50KCBtSGl0Q291bnQgKTsKKworCQkvLyBiYXNlZCBvbiBtQ292ZXJhZ2VTdGF0aXN0aWNzLm1OdW1iZXJPZkNvdmVyZWQKKwkJaWYoIG1Db3ZlcmFnZVN0YXRpc3RpY3MuZ29hbEFjaGlldmVkKCkgKQorCQl7CisJCQltQ292ZXJhZ2VTdGF0aXN0aWNzLm1Db3ZlcmFnZUJpdHNldC5zZXQoKTsKKwkJfQorCisJCW1SZWxhdGl2ZUxlYWZFQy5jbGVhcigpOworCisJCWhpdE9mZnNldEVuZCA9IG1NYXhIaXRFQy5zaXplKCk7CisJCWZvciggaGl0T2Zmc2V0ID0gMCA7IGhpdE9mZnNldCAhPSBoaXRPZmZzZXRFbmQgOyArK2hpdE9mZnNldCApCisJCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfVFJBQ0UgPDwgIjw8PDw8IGhpdDwgY2FuZGlkYXRlID4gPj4+Pj4gRUM8IGlkOiIKKwkJCTw8IG1NYXhIaXRFQ1sgaGl0T2Zmc2V0IF0tPmdldElkTnVtYmVyKCkgPDwgIiA+IiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFBST0NFU1NPUiApCisKKwkJCW1NYXhIaXRFQ1sgaGl0T2Zmc2V0IF0tPnNldFdlaWdodCgwKTsKKworCQkJbVJlbGF0aXZlTGVhZkVDLmFwcGVuZCggbU1heEhpdEVDWyBoaXRPZmZzZXQgXSApOworCQl9CisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfVFJBQ0UgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKwordm9pZCBIaXRVbm9yZGVyZWRQcm9jZXNzb3I6OmhpdChFeGVjdXRpb25Db250ZXh0ICogYW5FQywKKwkJQml0c2V0IGNvdmVyYWdlQml0c2V0LCBhdm1fc2l6ZV90IGhpdENvdW50KQoreworCWlmKCBtQmxhY2tIb2xlRUMuY29udGFpbnMoYW5FQykgKQorCXsKKwkJcmV0dXJuOworCX0KKworCWF2bV9zaXplX3Qgc2F2ZUhpdENvdW50ID0gaGl0Q291bnQ7CisKKwl0cmFjZU9mZnNldCA9IDA7CisJZm9yKCA7IHRyYWNlT2Zmc2V0ICE9IG1Db3ZlcmFnZVN0YXRpc3RpY3MubU51bWJlck9mRWxlbWVudHMgOyArK3RyYWNlT2Zmc2V0ICkKKwl7CisJCWlmKCBjb3ZlcmFnZUJpdHNldC50ZXN0KHRyYWNlT2Zmc2V0KSApCisJCXsKKwkJCS8vISEgY29udGludWU7CisJCX0KKwkJZWxzZSBpZiggQmFzZUhpdFByb2Nlc3Nvcjo6aGl0KGFuRUMsIG1UcmFjZU9iamVjdGl2ZVt0cmFjZU9mZnNldF0pICkKKwkJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCUFWTV9PU19UUkFDRSA8PCAiPDw8PDwgaGl0PCAxID4gPj4+Pj4gRUM8IGlkOiIKKwkJCTw8IGFuRUMtPmdldElkTnVtYmVyKCkgPDwgIiA+IiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFBST0NFU1NPUiApCisKKwkJCWFuRUMtPmdldHdGbGFncygpLnNldENvdmVyYWdlRWxlbWVudFRyYWNlKCk7CisKKwkJCWFuRUMtPmFkZEluZm8obUhpdE9ySnVtcFByb2Nlc3NvciwgbVRyYWNlT2JqZWN0aXZlW3RyYWNlT2Zmc2V0XSk7CisKKwkJCWNvdmVyYWdlQml0c2V0LnNldCh0cmFjZU9mZnNldCwgdHJ1ZSksCisKKwkJCSsraGl0Q291bnQ7CisKKwkJCWlmKCBub3QgbUhpdE9ySnVtcFByb2Nlc3Nvci5tRm9sZGluZ0ZsYWcgKQorCQkJeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisKKwlpZiggKHNhdmVIaXRDb3VudCA9PSBoaXRDb3VudCkgKQorCXsKKwkJaWYoIG1IaXRPckp1bXBQcm9jZXNzb3IubUhpdENvbnNlY3V0aXZlRmxhZyAmJiBjb3ZlcmFnZUJpdHNldC5hbnkoKSApCisJCXsKKwkJCS8vIFRPRE8KK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfVFJBQ0UgPDwgIjw8PDw8IGhpdCNjb25zZWN1dGl2ZTwgRkFJTEVEID4gPj4+Pj4gRUM8IGlkOiIKKwkJCTw8IGFuRUMtPmdldElkTnVtYmVyKCkgPDwgIiA+IiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFBST0NFU1NPUiApCisKKwkJCXJldHVybjsKKwkJfQorCQllbHNlIGlmKCB3aWxsTmV2ZXJIaXQoYW5FQywgY292ZXJhZ2VCaXRzZXQpICkKKwkJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCUFWTV9PU19UUkFDRSA8PCAiPDw8PDwgaGl0I25ldmVyPCAxID4gPj4+Pj4gRUM8IGlkOiIKKwkJCTw8IGFuRUMtPmdldElkTnVtYmVyKCkgPDwgIiA+IiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFBST0NFU1NPUiApCisKKwkJCXJldHVybjsKKwkJfQorCX0KKworCisJaWYoIGhpdENvdW50ID09IG1Db3ZlcmFnZVN0YXRpc3RpY3MuZ2V0TnVtYmVyT2ZVbmNvdmVyZWQoKSApCisJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCWFuRUMtPmdldHdGbGFncygpLnNldE9iamVjdGl2ZUFjaGlldmVkVHJhY2UoKTsKKworCUFWTV9PU19UUkFDRSA8PCAiPDw8PDwgaGl0PCBnb2FsIGFjaGlldmVkID4gPj4+Pj4gRUM8IGlkOiIKKwkJCTw8IGFuRUMtPmdldElkTnVtYmVyKCkgPDwgIiA+IiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFBST0NFU1NPUiApCisKKwkJaWYoIGhpdENvdW50ID4gbUhpdENvdW50ICkKKwkJeworCQkJaWYoIG1CYWNrdHJhY2tGbGFnICkKKwkJCXsKKwkJCQloaXRPZmZzZXRFbmQgPSBtTWF4SGl0RUMuc2l6ZSgpOworCQkJCWZvciggaGl0T2Zmc2V0ID0gMCA7IGhpdE9mZnNldCAhPSBoaXRPZmZzZXRFbmQgOyArK2hpdE9mZnNldCApCisJCQkJeworCQkJCQlzYXZlQmFja3RyYWNrYWJsZShtTWF4SGl0RUNbaGl0T2Zmc2V0XSwKKwkJCQkJCQltSGl0Q292ZXJhZ2VCaXRzZXRbaGl0T2Zmc2V0XSwgbUhpdENvdW50KTsKKwkJCQl9CisJCQl9CisKKwkJCW1NYXhIaXRFQy5jbGVhcigpOworCQkJbUhpdENvdmVyYWdlQml0c2V0LmNsZWFyKCk7CisKKwkJCW1IaXRDb3VudCA9IGhpdENvdW50OworCQl9CisKKwkJbU1heEhpdEVDLnB1c2hfYmFjayggYW5FQyApOworCQltSGl0Q292ZXJhZ2VCaXRzZXQucHVzaF9iYWNrKGNvdmVyYWdlQml0c2V0KTsKKwl9CisKKwllbHNlIGlmKCBhbkVDLT5oYXNOZXh0KCkgKQorCXsKKwkJRXhlY3V0aW9uQ29udGV4dDo6Y2hpbGRfaXRlcmF0b3IgaXRDaGlsZEVDID0gYW5FQy0+YmVnaW4oKTsKKwkJRXhlY3V0aW9uQ29udGV4dDo6Y2hpbGRfaXRlcmF0b3IgZW5kQ2hpbGRFQyA9IGFuRUMtPmVuZCgpOworCQlmb3IoIDsgaXRDaGlsZEVDICE9IGVuZENoaWxkRUMgOyArK2l0Q2hpbGRFQyApCisJCXsKKwkJCWhpdCgoKml0Q2hpbGRFQyksIGNvdmVyYWdlQml0c2V0LCBoaXRDb3VudCk7CisJCX0KKwl9CisKKwllbHNlIGlmKCBpc0Fic29sdXRlTGVhZihhbkVDKSApCisJeworCQkvLyEhIENPTlRJTlVFCisJfQorCisJZWxzZSBpZiggaGl0Q291bnQgPiBtSGl0Q291bnQgKQorCXsKKwkJaWYoIG1CYWNrdHJhY2tGbGFnICkKKwkJeworCQkJaGl0T2Zmc2V0RW5kID0gbU1heEhpdEVDLnNpemUoKTsKKwkJCWZvciggaGl0T2Zmc2V0ID0gMCA7IGhpdE9mZnNldCAhPSBoaXRPZmZzZXRFbmQgOyArK2hpdE9mZnNldCApCisJCQl7CisJCQkJc2F2ZUJhY2t0cmFja2FibGUobU1heEhpdEVDW2hpdE9mZnNldF0sCisJCQkJCQltSGl0Q292ZXJhZ2VCaXRzZXRbaGl0T2Zmc2V0XSwgbUhpdENvdW50KTsKKwkJCX0KKwkJfQorCisJCW1NYXhIaXRFQy5jbGVhcigpOworCQltSGl0Q292ZXJhZ2VCaXRzZXQuY2xlYXIoKTsKKworCQltSGl0Q291bnQgPSBoaXRDb3VudDsKKworCQltTWF4SGl0RUMucHVzaF9iYWNrKCBhbkVDICk7CisJCW1IaXRDb3ZlcmFnZUJpdHNldC5wdXNoX2JhY2soY292ZXJhZ2VCaXRzZXQpOworCX0KKworCWVsc2UgaWYoIGhpdENvdW50ID4gMCApCisJeworCQlpZiggaGl0Q291bnQgPT0gbUhpdENvdW50ICkKKwkJeworCQkJbU1heEhpdEVDLnB1c2hfYmFjayggYW5FQyApOworCQkJbUhpdENvdmVyYWdlQml0c2V0LnB1c2hfYmFjayhjb3ZlcmFnZUJpdHNldCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlhbkVDLT5zZXRXZWlnaHRNYXgoKTsKKworCQkJaWYoIG1CYWNrdHJhY2tGbGFnICkKKwkJCXsKKwkJCQlzYXZlQmFja3RyYWNrYWJsZShhbkVDLCBjb3ZlcmFnZUJpdHNldCwgaGl0Q291bnQpOworCQkJfQorCQl9CisJfQorCisJZWxzZSBpZiggaGl0Q291bnQgPT0gMCApCisJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCUFWTV9PU19UUkFDRSA8PCAiPDw8PDwgbm9wID4+Pj4+IEVDPCBpZDoiCisJCQk8PCBhbkVDLT5nZXRJZE51bWJlcigpIDw8ICIgPiIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCisJCWFuRUMtPnNldFdlaWdodE1heCgpOworCisJCWlmKCBtQmFja3RyYWNrRmxhZyApCisJCXsKKwkJCXNhdmVCYWNrdHJhY2thYmxlKGFuRUMsIGNvdmVyYWdlQml0c2V0LCBoaXRDb3VudCk7CisJCX0KKwl9Cit9CisKKwordm9pZCBIaXRVbm9yZGVyZWRQcm9jZXNzb3I6OmhpdFNlbGVjdChhdm1fc2l6ZV90IGp1bXBPZmZzZXQpCit7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFBST0NFU1NPUiApCisJQVZNX09TX1RSQUNFIDw8ICI8PDw8PCBoaXQ8IDAgPiA+Pj4+PiBFQzwgaWQ6IgorCQkJPDwgbU1heEhpdEVDWyBqdW1wT2Zmc2V0IF0tPmdldElkTnVtYmVyKCkgPDwgIiA+IiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFBST0NFU1NPUiApCisKKwltTWF4SGl0RUNbIGp1bXBPZmZzZXQgXS0+c2V0V2VpZ2h0KDApOworCisJbUNvdmVyYWdlU3RhdGlzdGljcy5tQ292ZXJhZ2VCaXRzZXQgPSBtSGl0Q292ZXJhZ2VCaXRzZXRbIGp1bXBPZmZzZXQgXTsKKworCW1IaXRTZWxlY3RlZEVDLmFwcGVuZCggbU1heEhpdEVDWyBqdW1wT2Zmc2V0IF0gKTsKKwltSGl0U2VsZWN0ZWRDb3ZlcmFnZUJpdHNldC5hcHBlbmQoIG1IaXRDb3ZlcmFnZUJpdHNldFsganVtcE9mZnNldCBdICk7Cit9CisKKworQml0c2V0ICYgSGl0VW5vcmRlcmVkUHJvY2Vzc29yOjpoaXRDb3ZlcmFnZUJpdHNldChFeGVjdXRpb25Db250ZXh0ICogYW5FQykKK3sKKwloaXRPZmZzZXRFbmQgPSBtSGl0U2VsZWN0ZWRFQy5zaXplKCk7CisJZm9yKCBoaXRPZmZzZXQgPSAwIDsgaGl0T2Zmc2V0ICE9IGhpdE9mZnNldEVuZCA7ICsraGl0T2Zmc2V0ICkKKwl7CisJCWlmKCBtSGl0U2VsZWN0ZWRFQ1toaXRPZmZzZXRdID09IGFuRUMgKQorCQl7CisJCQlyZXR1cm4oIG1IaXRTZWxlY3RlZENvdmVyYWdlQml0c2V0W2hpdE9mZnNldF0gKTsKKwkJfQorCX0KKworCXJldHVybiggbUNvdmVyYWdlU3RhdGlzdGljcy5tQ292ZXJhZ2VCaXRzZXQgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRklMVEVSSU5HIFRPT0xTCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIEhpdFVub3JkZXJlZFByb2Nlc3Nvcjo6c2F2ZUJhY2t0cmFja2FibGUoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMsCisJCUJpdHNldCAmIGNvdmVyYWdlQml0c2V0LCBhdm1fc2l6ZV90IGhpdENvdW50KQoreworCWlmKCBhbkVDLT5oYXNOZXh0KCkgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJZWxzZSBpZiggd2lsbE5ldmVySGl0KGFuRUMsIGNvdmVyYWdlQml0c2V0KSApCisJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCUFWTV9PU19UUkFDRSA8PCAiPDw8PDwgaGl0I25ldmVyPCAxID4gPj4+Pj4gRUM8IGlkOiIKKwkJPDwgYW5FQy0+Z2V0SWROdW1iZXIoKSA8PCAiID4iIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgUFJPQ0VTU09SICkKKwl9CisKKwllbHNlCisJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCUFWTV9PU19UUkFDRSA8PCAiPDw8PDwgaGl0PCBiYWNrdHJhY3QgPiA+Pj4+PiBFQzwgaWQ6IgorCQk8PCBhbkVDLT5nZXRJZE51bWJlcigpIDw8ICIgPiIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCisJCWFuRUMtPmdldFVuaXFJbmZvcm1hdGlvbigpLT5nZXRVbmlxSGl0T3JKdW1wT2JqZWN0aXZlSW5mbygpLT4KKwkJCQlzZXRDb3ZlcmFnZVN0YXRpc3RpY3MoIG1Db3ZlcmFnZVN0YXRpc3RpY3MsIGNvdmVyYWdlQml0c2V0ICk7CisKKwkJbUJhY2t0cmFja0hpdEVDLmFwcGVuZCggYW5FQyApOworCX0KK30KKworCitib29sIEhpdFVub3JkZXJlZFByb2Nlc3Nvcjo6d2lsbE5ldmVySGl0KAorCQlFeGVjdXRpb25Db250ZXh0ICogYW5FQywgQml0c2V0ICYgY292ZXJhZ2VCaXRzZXQpCit7CisJaWYoIGlzQWJzb2x1dGVMZWFmKGFuRUMpICkKKwl7CisJCXJldHVybiggdHJ1ZSApOworCX0KKwllbHNlIGlmKCBub3QgaXNQdXJlU3RhdGVUcmFuc2l0aW9uTmF0dXJlRmxhZyApCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJdHJhY2VPZmZzZXQgPSAwOworCWZvciggOyB0cmFjZU9mZnNldCAhPSBtQ292ZXJhZ2VTdGF0aXN0aWNzLm1OdW1iZXJPZkVsZW1lbnRzIDsgKyt0cmFjZU9mZnNldCApCisJeworCQlpZiggY292ZXJhZ2VCaXRzZXQudGVzdCh0cmFjZU9mZnNldCkgKQorCQl7CisJCQkvLyEhIGNvbnRpbnVlOworCQl9CisJCWVsc2UgaWYoIEJhc2VIaXRQcm9jZXNzb3I6OndpbGxOZXZlckhpdCgKKwkJCQlhbkVDLG1UcmFjZU9iamVjdGl2ZVt0cmFjZU9mZnNldF0pICkKKwkJeworCQkJKyttQ292ZXJhZ2VTdGF0aXN0aWNzLm1OdW1iZXJPZkJsYWNrSG9sZTsKKworCQkJbUJsYWNrSG9sZUVDLmFwcGVuZChhbkVDKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisJQVZNX09TX1RSQUNFIDw8ICI8PDw8PCBIb0o8IEJMQUNLIEhPTEUgPiA+Pj4+PiIgPDwgc3RkOjplbmRsCisJCQk8PCAiRUM6PiAiIDw8IGFuRUMtPnN0cl9taW4oKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vaGl0b3JqdW1wL0hpdFVub3JkZXJlZFByb2Nlc3Nvci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2hpdG9yanVtcC9IaXRVbm9yZGVyZWRQcm9jZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjRhNGQwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL2hpdG9yanVtcC9IaXRVbm9yZGVyZWRQcm9jZXNzb3IuaApAQCAtMCwwICsxLDEwNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDMxIGphbnYuIDIwMTQKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBISVRVTk9SREVSRURQUk9DRVNTT1JfSF8KKyNkZWZpbmUgSElUVU5PUkRFUkVEUFJPQ0VTU09SX0hfCisKKyNpbmNsdWRlICJCYXNlSGl0UHJvY2Vzc29yLmgiCisKKyNpbmNsdWRlIDxjb2xsZWN0aW9uL0JpdHNldC5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjbGFzcyBBdm1IaXRPckp1bXBQcm9jZXNzb3I7CitjbGFzcyBFeGVjdXRpb25Db250ZXh0OworY2xhc3MgRXZhbHVhdGlvbkVudmlyb25tZW50OworCisKK2NsYXNzIEhpdFVub3JkZXJlZFByb2Nlc3NvciAgOiAgcHVibGljIEJhc2VIaXRQcm9jZXNzb3IKK3sKKworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQVRUUklCVVRFCisJICovCisJVmVjdG9yT2ZCaXRzZXQgICAgICAgIG1IaXRDb3ZlcmFnZUJpdHNldDsKKworCVZlY3Rvck9mQml0c2V0ICAgICAgICBtSGl0U2VsZWN0ZWRDb3ZlcmFnZUJpdHNldDsKKworCVZlY3Rvck9mRXhlY3V0aW9uQ29udGV4dCBtSGl0U2VsZWN0ZWRFQzsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJSGl0VW5vcmRlcmVkUHJvY2Vzc29yKEF2bUhpdE9ySnVtcFByb2Nlc3NvciAmIGhvalByb2Nlc3NvciwKKwkJCUV2YWx1YXRpb25FbnZpcm9ubWVudCAmIGFuRU5WKTsKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5IaXRVbm9yZGVyZWRQcm9jZXNzb3IoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwlpbmxpbmUgc3RkOjpzdHJpbmcgc3RyS2luZCgpCisJeworCQlyZXR1cm4oICJ1bm9yZGVyZWQiICk7CisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQ09ORklHVVJFIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXZpcnR1YWwgYm9vbCByZXNldENvbmZpZygpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gSElUIEZJTFRFUklORyBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlib29sIGdvYWxXaWxsTmV2ZXJBY2hpZXZlZChFeGVjdXRpb25Db250ZXh0ICogYW5FQyk7CisKKwlib29sIGhpdChhdm1fc2l6ZV90IGp1bXBIZWlnaHQpOworCisJdm9pZCBoaXQoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMsCisJCQlCaXRzZXQgY292ZXJhZ2VCaXRzZXQsCWF2bV9zaXplX3QgaGl0Q291bnQpOworCisKKwl2aXJ0dWFsIHZvaWQgaGl0U2VsZWN0KGF2bV9zaXplX3QganVtcE9mZnNldCk7CisKKwlCaXRzZXQgJiBoaXRDb3ZlcmFnZUJpdHNldChFeGVjdXRpb25Db250ZXh0ICogYW5FQyk7CisKKworCS8vIEZJTFRFUklORyBUT09MUworCXZvaWQgc2F2ZUJhY2t0cmFja2FibGUoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMsCisJCQlCaXRzZXQgJiBjb3ZlcmFnZUJpdHNldCwgYXZtX3NpemVfdCBoaXRDb3VudCk7CisKKwlib29sIHdpbGxOZXZlckhpdChFeGVjdXRpb25Db250ZXh0ICogYW5FQywgQml0c2V0ICYgY292ZXJhZ2VCaXRzZXQpOworCit9OworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworCisjZW5kaWYgLyogSElUVU5PUkRFUkVEUFJPQ0VTU09SX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vcXVldWUvRXhlY3V0aW9uUXVldWUuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3F1ZXVlL0V4ZWN1dGlvblF1ZXVlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTNiZjRmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3F1ZXVlL0V4ZWN1dGlvblF1ZXVlLmNwcApAQCAtMCwwICsxLDk5OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgIkV4ZWN1dGlvblF1ZXVlLmgiCisKKyNpbmNsdWRlICJXYWl0aW5nQmFzaWNTdHJhdGVneS5oIgorI2luY2x1ZGUgIldhaXRpbmdTdHJhdGVneUJMT0NLLmgiCisjaW5jbHVkZSAiV2FpdGluZ1N0cmF0ZWd5V0VJR0hULmgiCisKKyNpbmNsdWRlIDxmYW0vYXBpL01haW5Qcm9jZXNzb3JVbml0Lmg+CisKKyNpbmNsdWRlIDxmbWwvd29ya2Zsb3cvUXVlcnkuaD4KKyNpbmNsdWRlIDxmbWwvd29ya2Zsb3cvV09iamVjdC5oPgorCisjaW5jbHVkZSA8c2V3L1N5bWJleERpc3BhdGNoZXIuaD4KKyNpbmNsdWRlIDxzZXcvV29ya2Zsb3cuaD4KKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorICogREVTVFJVQ1RPUgorICovCitFeGVjdXRpb25RdWV1ZTo6fkV4ZWN1dGlvblF1ZXVlKCkKK3sKKwkvLyBVbnJlZ2lzdHJhdGlvbgorCWdldFN5bWJleERpc3BhdGNoZXIoKS5nZXRTeW1iZXhFdmVudE1hbmFnZXIoKS4KKwkJCXVucmVnaXN0ZXJIYW5kbGVyRXZlbnREZXN0cm95Q3R4KHRoaXMpOworfQorCisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorcHJvdG90eXBlIGV4ZWN1dGlvbl9xdWV1ZSBhcyBhdm06OmNvcmUuRVhFQ1VUSU9OX1FVRVVFIGlzCisJc2VjdGlvbiBQUk9QRVJUWQorCQkvLyAnQUxMJworCisJCS8vICdCRVNUJyAgfCAnQkVTVF9GSVJTVF9TRUFSQ0gnCisJCS8vICdCRlMnICAgfCAnQlJFQURUSF9GSVJTVF9TRUFSQ0gnCisJCS8vICdERlMnICAgfCAnREVQVEhfRklSU1RfU0VBUkNIJworCQkvLyAnUkZTJyAgIHwgJ1JBTkRPTV9GSVJTVF9TRUFSQ0gnCisJCS8vICdYRlMnICAgfCAnUkFORE9NX0ZJUlNUX1NFQVJDSCcKKworCQkvLyAnRklSU1QnIHwgJ0xBU1QnCisKKwkJLy8gJ0JMT0NLX3sgQUxMIHwgQkVTVCB8IEJGUyB8IERGUyB8IFJGUyB8IFhGUyB9JworCisJCS8vICdXRUlHSFRfeyBBTEwgfCBCRVNUIHwgQkZTIHwgREZTIHwgUkZTIHwgWEZTIH0nCisKKwkJLy8gJ1RBUkdFVF9GT1JNVUxBX3sgQUxMIHwgQkVTVCB8IEJGUyB8IERGUyB8IFJGUyB8IFhGUyB9JworCisJCUBzdHJhdGVneSA9ICdCRlMnOworCisJCS8vIGZvciBXRUlHSFRfeyBBTEwgfCBCRVNUIHwgQkZTIHwgREZTIHwgUkZTIHwgWEZTIH0gc3RyYXRlZ3kKKwkJQHdlaWdodCA9IDg7CisKKwkJLy8gZm9yICdCTE9DS197IEFMTCB8IEJFU1QgfCBCRlMgfCBERlMgfCBSRlMgfCBYRlMgfScKKwkJLy8gbG9jYWwgYmxvY2sgaGVpZ2h0IGFuZCB3aWR0aCBzaXplCisJCUBibG9ja19oZWlnaHQgPSAyMDsKKwkJQGJsb2NrX3dpZHRoICA9IDMwOworCisJCS8vIG5leHQgaGVpZ2h0IGFuZCB3aWR0aCBsaW1pdCA9PT4gcG91ciDDqXZpdGVyIHRvdXRlIGV4cGxvc2lvbiBsb2NhbGlzw6llCisJCUBoZWlnaHQgPSA1MDsKKwkJQHdpZHRoICA9IDMwOworCWVuZHNlY3Rpb24gUFJPUEVSVFkKK2VuZHByb3RvdHlwZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKgorICogTkVXIENPTlNJU0UgU1lOVEFYCitzdXBlcnZpc29yIHsKKwlsaW1pdCAnb2YgZ3JhcGggZXhwbG9yYXRpb24nIFsKKwkJZXZhbCA9IDEwCisJCS4uLgorCV0KKwlxdWV1ZSAnZm9yIGdyYXBoIGV4cGxvcmF0aW9uJyBbCisJCXN0cmF0ZWd5ID0gJ0JGUycKKwkJLi4uCisJXQorCS8vIHNob3J0Y3V0IGFsdGVybmF0aXZlCisJcXVldWUgPSAnQkZTJworCisJY29uc29sZSBbCisJCWZvcm1hdCA9ICJcbnN0ZXA6JTElICwgY29udGV4dDolMiUgLCBoZWlnaHQ6JTMlICwgd2lkdGg6JTQlIgorCQkuLi4KKwldCit9CisqLworCisvKioKKyAqIENPTkZJR1VSRQorICovCitib29sIEV4ZWN1dGlvblF1ZXVlOjpjb25maWd1cmVJbXBsKCkKK3sKKwlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBtUGFyYW1ldGVyV09iamVjdCApCisJCQk8PCAiRXhlY3V0aW9uUXVldWUgV09iamVjdCAhISEiCisJCQk8PCBTRU5EX0VYSVQ7CisKKwkvLyBJTklUSUFMSVpBVElPTgorCWNvbmZpZ3VyZURlYnVnKCk7CisKKwkvLyBTZWUgUHJvY2Vzc29yVW5pdEZhY3RvcnkuY3BwIC0tPiAvLyBRVUVVRSBQUk9DRVNTT1IgQ09ORklHVVJFCisJbUNvbmZpZ0ZsYWcgPSB0cnVlOworCisJYm9vbCBpc25vdERlZmluZWRXVHlwZWRPYmplY3RQYXJhbWV0ZXJzID0gZmFsc2U7CisKKwlXT2JqZWN0ICogd2ZRdWV1ZSA9IG1QYXJhbWV0ZXJXT2JqZWN0OworCisJaWYoIE1haW5Qcm9jZXNzb3JVbml0OjpBVVRPX1JFR0lTVEVSX1RPT0wuaXNUeXBlSUQoICptUGFyYW1ldGVyV09iamVjdCApICkKKwl7CisJCXdmUXVldWUgPSBRdWVyeTo6Z2V0UmVnZXhXT2JqZWN0QnlOYW1lSUQobVBhcmFtZXRlcldPYmplY3QsCisJCQkJUFJFRklYX1dJRCgic3ltYmV4IiwgT1JfV0lEMigicXVldWUiICwgIlFVRVVFIikpLAorCQkJCQkJV09iamVjdDo6X05VTExfKTsKKworCQlpZiggd2ZRdWV1ZSA9PSBXT2JqZWN0OjpfTlVMTF8gKQorCQl7CisJCQlyZXR1cm4oIG1Db25maWdGbGFnICk7CisJCX0KKwkJZWxzZSBpZiggd2ZRdWV1ZS0+aXNXVHlwZWRPclJlZmVyZW5jZSgpICkKKwkJeworCQkJaWYoIHdmUXVldWUtPmlzV1Byb3BlcnR5V1JlZmVyZW5jZSgpICkKKwkJCXsKKwkJCQl3ZlF1ZXVlID0gd2ZRdWV1ZS0+Z2V0V1JlZmVyZW5jZVZhbHVlKCk7CisJCQl9CisKKwkJCWlmKCBFeGVjdXRpb25RdWV1ZTo6QVVUT19SRUdJU1RFUl9UT09MLmlzVHlwZUlEKCAqd2ZRdWV1ZSApICkKKwkJCXsKKwkJCQltUGFyYW1ldGVyV09iamVjdCA9IHdmUXVldWU7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQVZNX09TX1dBUk4gPDwgIkV4ZWN1dGlvblF1ZXVlOjpjb25maWd1cmU6PiAiCisJCQkJCQkiVW5leHBlY3RlZCB0aGUgV09iamVjdDwgIgorCQkJCQkJPDwgd2ZRdWV1ZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJCQkJPDwgIiA+IGFzIHF1ZXVlIHBhcmFtZXRlcnMgZGVmaW5lZCBpbiBzdXBlcnZpc29yIDwiCisJCQkJCQk8PCBtUGFyYW1ldGVyV09iamVjdC0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJCQkJPDwgIiA+ISAiIDw8IHN0ZDo6ZW5kbDsKKworCQkJCXJldHVybiggbUNvbmZpZ0ZsYWcgPSBmYWxzZSApOworCQkJfQorCQl9CisJCWVsc2UgaWYoIHdmUXVldWUtPmlzV1NlcXVlbmNlKCkgKQorCQl7CisJCQkvLyBjYXNlIHN1cGVydmlzb3Igc2VxdWVuY2UgcGFyYW1ldGVycworCisJCQlpc25vdERlZmluZWRXVHlwZWRPYmplY3RQYXJhbWV0ZXJzID0gdHJ1ZTsKKwkJfQorCQllbHNlIGlmKCB3ZlF1ZXVlLT5pc1dQcm9wZXJ0eVN0cmluZygpICkKKwkJeworCQkJLy8gY2FzZSBzdXBlcnZpc29yIHNpbmdsZSBzaG9ydGN1dCBwcm9wZXJ0eSBwYXJhbWV0ZXIKKworCQkJaXNub3REZWZpbmVkV1R5cGVkT2JqZWN0UGFyYW1ldGVycyA9IHRydWU7CisJCX0KKwkJZWxzZQorCQl7CisJCQlBVk1fT1NfV0FSTiA8PCAiRXhlY3V0aW9uUXVldWU6OmNvbmZpZ3VyZTo+ICIKKwkJCQkJIlVuZXhwZWN0ZWQgdGhlIFdPYmplY3Q8ICIgPDwgd2ZRdWV1ZS0+c3RySGVhZGVyKCkKKwkJCQkJPDwgIiA+IGFzIHJlZHVuZGFuY3kgcGFyYW1ldGVycyBkZWZpbmVkIGluIHN1cGVydmlzb3IgPCIKKwkJCQkJPDwgbVBhcmFtZXRlcldPYmplY3QtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKwkJCQkJPDwgIiA+ISAiIDw8IHN0ZDo6ZW5kbDsKKworCQkJcmV0dXJuKCBtQ29uZmlnRmxhZyA9IGZhbHNlICk7CisJCX0KKwl9CisKKwlXT2JqZWN0ICogdGhlUVVFVUUgPSAoIGlzbm90RGVmaW5lZFdUeXBlZE9iamVjdFBhcmFtZXRlcnMgKSA/ICB3ZlF1ZXVlCisJCQk6IFF1ZXJ5OjpnZXRSZWdleFdTZXF1ZW5jZSh3ZlF1ZXVlLCBPUl9XSUQ0KCJwcm9wZXJ0eSIsCisJCQkJCSJQUk9QRVJUWSIsICJxdWV1ZSIsICJRVUVVRSIpLCB3ZlF1ZXVlKTsKKworCWlmKCB0aGVRVUVVRSAhPSBXT2JqZWN0OjpfTlVMTF8gKQorCXsKKwkJLy8gY2FzZSBvZiBzdGFuZGFyZCBzZXF1ZW5jZSBwYXJhbWV0ZXJzIG9yIHNpbmdsZSBwcm9wZXJ0eSBwYXJhbWV0ZXIKKwkJc3RkOjpzdHJpbmcgc3RyU3RyYXRlZ3kgPSAoIHRoZVFVRVVFLT5pc1dTZXF1ZW5jZSgpICkKKwkJCQk/IFF1ZXJ5OjpnZXRXUHJvcGVydHlTdHJpbmdPckVsc2UoCisJCQkJCQl0aGVRVUVVRSwgInN0cmF0ZWd5IiwgInF1ZXVlIiwgIkJGUyIpCisJCQkJOiB0aGVRVUVVRS0+c3RyVmFsdWUoKTsKKworCQltU3RyYXRlZ3kgPSBTVFJBVEVHWV9VTkRFRklORUQ7CisKKwkJLy8gcG9wVG8gQUxMIFNUUkFURUdZCisJCWlmKCBzdHJTdHJhdGVneS5maW5kKCJBTEwiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisJCXsKKwkJCW1TdHJhdGVneSB8PSBTVFJBVEVHWV9BTEw7CisJCX0KKworCQkvLyBCQVNJQyBTVFJBVEVHWQorCQlpZiggKHN0clN0cmF0ZWd5LmZpbmQoIkJGUyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB8fAorCQkJUkVHRVhfRklORChzdHJTdHJhdGVneSwgQ09OU19XSUQzKCJCUkVBRFRIIiwgIkZJUlNUIiwgIlNFQVJDSCIpKSApCisJCXsKKwkJCW1TdHJhdGVneSB8PSBTVFJBVEVHWV9CRlM7CisJCX0KKwkJZWxzZSBpZiggKHN0clN0cmF0ZWd5LmZpbmQoIkRGUyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB8fAorCQkJUkVHRVhfRklORChzdHJTdHJhdGVneSwgQ09OU19XSUQzKCJERVBUSCIsICJGSVJTVCIsICJTRUFSQ0giKSkgKQorCQl7CisJCQltU3RyYXRlZ3kgfD0gU1RSQVRFR1lfREZTOworCQl9CisJCWVsc2UgaWYoIChzdHJTdHJhdGVneS5maW5kKCJSRlMiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgfHwKKwkJCVJFR0VYX0ZJTkQoc3RyU3RyYXRlZ3ksIENPTlNfV0lEMygiUkFNRE9NIiwgIkZJUlNUIiwgIlNFQVJDSCIpKSApCisJCXsKKwkJCW1TdHJhdGVneSB8PSBTVFJBVEVHWV9SRlM7CisJCX0KKwkJZWxzZSBpZiggc3RyU3RyYXRlZ3kuZmluZCgiWEZTIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorCQl7CisJCQltU3RyYXRlZ3kgfD0gU1RSQVRFR1lfWEZTOworCQl9CisKKwkJZWxzZSBpZiggKHN0clN0cmF0ZWd5LmZpbmQoIkJFU1QiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgfHwKKwkJCVJFR0VYX0ZJTkQoc3RyU3RyYXRlZ3ksIENPTlNfV0lEMygiQkVTVCIsICJGSVJTVCIsICJTRUFSQ0giKSkgKQorCQl7CisJCQltU3RyYXRlZ3kgfD0gU1RSQVRFR1lfQkZTOworCQl9CisKKwkJZWxzZSBpZiggc3RyU3RyYXRlZ3kuZmluZCgiRklSU1QiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisJCXsKKwkJCW1TdHJhdGVneSB8PSBTVFJBVEVHWV9GSVJTVDsKKwkJfQorCQllbHNlIGlmKCBzdHJTdHJhdGVneS5maW5kKCJMQVNUIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorCQl7CisJCQltU3RyYXRlZ3kgfD0gU1RSQVRFR1lfTEFTVDsKKwkJfQorCisJCS8vIE9SREVSIFNUUkFURUdZCisJCWVsc2UgaWYoIHN0clN0cmF0ZWd5LmZpbmQoIk9SREVSIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorCQl7CisJCQltU3RyYXRlZ3kgfD0gU1RSQVRFR1lfT1JERVI7CisJCX0KKworCQkvLyBPbmx5IGJhc2ljIGNvbmZpZ3VyYXRpb24gaW4gdGhlIHN1cGVydmlzb3IgV09iamVjdAorCQkvLyBDYXNlIGluIG5ldyBjb25jaXNlIHN5bnRheCAhCisJCWlmKCBpc25vdERlZmluZWRXVHlwZWRPYmplY3RQYXJhbWV0ZXJzICkKKwkJeworCQkJLy8hISBOT1RISU5HIEVMU0UgPz8/CisJCX0KKworCQkvLyBCTE9DSyBTVFJBVEVHWQorCQlpZiggc3RyU3RyYXRlZ3kuZmluZCgiQkxPQ0siKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisJCXsKKwkJCW1TdHJhdGVneSB8PSBTVFJBVEVHWV9CTE9DSzsKKworCQkJYXZtX3NpemVfdCBhQmxvY2tIZWlnaHRQZXJpb2Q7CisJCQlhdm1fc2l6ZV90IGFCbG9ja1dpZHRoUGVyaW9kOworCQkJYXZtX3NpemVfdCBhQmxvY2tIZWlnaHQ7CisJCQlhdm1fc2l6ZV90IGFCbG9ja1dpZHRoOworCisJCQlhdm1fc2l6ZV90IGFIZWlnaHRMaW1pdDsKKwkJCWF2bV9zaXplX3QgYVdpZHRoTGltaXQ7CisKKwkJCS8vIEJsb2NrIGhlaWdodCBsaW1pdAorCQkJYUhlaWdodExpbWl0ID0gUXVlcnk6OmdldFdQcm9wZXJ0eVNpemVUKHRoZVFVRVVFLCAiaGVpZ2h0IiwKKwkJCQkJQVZNX05VTUVSSUNfTUFYX1NJWkVfVCwgQVZNX05VTUVSSUNfTUFYX1NJWkVfVCk7CisKKwkJCS8vIEJsb2NrIGhlaWdodCBwZXJpb2QKKwkJCWFCbG9ja0hlaWdodFBlcmlvZCA9IGFCbG9ja0hlaWdodCA9IFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eVNpemVUKAorCQkJCQl0aGVRVUVVRSwgQ09OU19XSUQyKCJibG9jayIsICJoZWlnaHQiKSwKKwkJCQkJQVZNX05VTUVSSUNfTUFYX1NJWkVfVCwgQVZNX05VTUVSSUNfTUFYX1NJWkVfVCk7CisKKworCQkJLy8gQmxvY2sgd2lkdGggbGltaXQKKwkJCWFXaWR0aExpbWl0ID0gUXVlcnk6OmdldFdQcm9wZXJ0eVNpemVUKHRoZVFVRVVFLCAid2lkdGgiLAorCQkJCQlBVk1fTlVNRVJJQ19NQVhfU0laRV9ULCBBVk1fTlVNRVJJQ19NQVhfU0laRV9UKTsKKworCQkJLy8gQmxvY2sgd2lkdGggcGVyaW9kCisJCQlhQmxvY2tXaWR0aFBlcmlvZCA9IGFCbG9ja1dpZHRoID0gUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5U2l6ZVQoCisJCQkJCXRoZVFVRVVFLCBDT05TX1dJRDIoImJsb2NrIiwgIndpZHRoIiksCisJCQkJCUFWTV9OVU1FUklDX01BWF9TSVpFX1QsIEFWTV9OVU1FUklDX01BWF9TSVpFX1QpOworCisJCQljb25maWd1cmVXYWl0aW5nQmxvY2tTdHJhdGVneShhQmxvY2tIZWlnaHRQZXJpb2QsIGFCbG9ja1dpZHRoUGVyaW9kLAorCQkJCQlhQmxvY2tIZWlnaHQsIGFCbG9ja1dpZHRoLCBhSGVpZ2h0TGltaXQsIGFXaWR0aExpbWl0KTsKKwkJfQorCisJCS8vIFdFSUdIVCBTVFJBVEVHWQorCQllbHNlIGlmKCBzdHJTdHJhdGVneS5maW5kKCJXRUlHSFQiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisJCXsKKwkJCW1TdHJhdGVneSB8PSBTVFJBVEVHWV9XRUlHSFQ7CisKKwkJCWludCBhbkludGVnZXIgPSBRdWVyeTo6Z2V0V1Byb3BlcnR5SW50KAorCQkJCQl0aGVRVUVVRSwgIndlaWdodCIsIERFRkFVTFRfUVVFVUVfQ09VTlQpOworCQkJaWYoIChhbkludGVnZXIgPCAwKSB8fCAoYW5JbnRlZ2VyID4gKEFWTV9OVU1FUklDX01BWF9JTlQ4IC0gMSkpICkKKwkJCXsKKwkJCQlhbkludGVnZXIgPSAoQVZNX05VTUVSSUNfTUFYX0lOVDggLSAxKTsKKworQVZNX0lGX0RFQlVHX0ZMQUcoIENPTkZJR1VSSU5HICkKKwlBVk1fT1NfTE9HIDw8ICJFeGVjdXRpb25RdWV1ZTo6Y29uZmlndXJlOj4gSW52YWxpZCB3ZWlnaHQgdmFsdWUgaW4gWzEsIgorCQkJPDwgKEFWTV9OVU1FUklDX01BWF9JTlQ4IC0gMSkgPDwgIj5dICEgPT4gcmVwbGFjZSBieSA8ICIKKwkJCTw8IGFuSW50ZWdlciA8PCAiID4iIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBDT05GSUdVUklORyApCisJCQl9CisKKwkJCWlmKCBtU3RyYXRlZ3kgJiBTVFJBVEVHWV9BTEwgKQorCQkJeworCQkJCWNvbmZpZ3VyZVdhaXRpbmdXZWlnaHRTdHJhdGVneUFsbCgoYXZtX3VpbnQ4X3QpIGFuSW50ZWdlcik7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJY29uZmlndXJlV2FpdGluZ1dlaWdodFN0cmF0ZWd5KChhdm1fdWludDhfdCkgYW5JbnRlZ2VyKTsKKwkJCX0KKwkJfQorCisJCWlmKCBtU3RyYXRlZ3kgPT0gU1RSQVRFR1lfVU5ERUZJTkVEICkKKwkJeworCQkJQVZNX09TX0VSUk9SX0FMRVJUIDw8ICJFeGVjdXRpb25RdWV1ZTo6Y29uZmlndXJlOj4gIgorCQkJCQkJIkludmFsaWQgc3RyYXRlZ3kgQVRUUklCVVRFICEhISIKKwkJCQkJPDwgU0VORF9BTEVSVDsKKworCQkJbVN0cmF0ZWd5ID0gU1RSQVRFR1lfREZTOworCQl9CisKKwkJaWYoIG1XYWl0aW5nU3RyYXRlZ3kgPT0gTlVMTCApCisJCXsKKwkJCWlmKCBtU3RyYXRlZ3kgJiBTVFJBVEVHWV9BTEwgKQorCQkJeworCQkJCWNvbmZpZ3VyZVdhaXRpbmdCYXNpY1N0cmF0ZWd5QWxsKCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJY29uZmlndXJlV2FpdGluZ0Jhc2ljU3RyYXRlZ3koKTsKKwkJCX0KKworCQkJaWYoIG1XYWl0aW5nU3RyYXRlZ3kgPT0gTlVMTCApCisJCQl7CisJCQkJQVZNX09TX1dBUk4gPDwgIkV4ZWN1dGlvblF1ZXVlOjpjb25maWd1cmU6PiAiCisJCQkJCQkiRmFpbGVkIHRvIGNvbmZpZ3VyZSB3YWl0aW5nIHN0cmF0ZWd5ICEiOworCisJCQkJcmV0dXJuKCBtQ29uZmlnRmxhZyA9IGZhbHNlICk7CisJCQl9CisJCX0KKwl9CisJZWxzZQorCXsKKwkJQVZNX09TX0VSUk9SX0FMRVJUIDw8ICJFeGVjdXRpb25RdWV1ZTo6Y29uZmlndXJlOj4gIgorCQkJCQkiRXhwZWN0ZWQgYSA8cXVldWU+IG9yIFBST1BFUlRZIHNlY3Rpb24gISEhIgorCQkJCTw8IFNFTkRfQUxFUlQ7CisKKwkJcmV0dXJuKCBtQ29uZmlnRmxhZyA9IGZhbHNlICk7CisJfQorCisJLy8gUmVnaXN0cmF0aW9uIHRvIGhhbmRsZXIgRGVzdHJveUN0eCBldmVudAorCWdldFN5bWJleEV2ZW50TWFuYWdlcigpLnJlZ2lzdGVySGFuZGxlckV2ZW50RGVzdHJveUN0eCh0aGlzKTsKKworCXJldHVybiggbUNvbmZpZ0ZsYWcgPSB0cnVlICk7Cit9CisKKwordm9pZCBFeGVjdXRpb25RdWV1ZTo6Y29uZmlndXJlV2FpdGluZ0Jhc2ljU3RyYXRlZ3koKQoreworCXN3aXRjaCggbVN0cmF0ZWd5ICYgU1RSQVRFR1lfRkFNSUxZX0JBU0lDICkKKwl7CisJCWNhc2UgU1RSQVRFR1lfQkZTOgorCQl7CisJCQltV2FpdGluZ1N0cmF0ZWd5ID0gbmV3IFdhaXRpbmdCYXNpY1N0cmF0ZWd5QkZTKDEpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTVFJBVEVHWV9ERlM6CisJCXsKKwkJCW1XYWl0aW5nU3RyYXRlZ3kgPSBuZXcgV2FpdGluZ0Jhc2ljU3RyYXRlZ3lERlMoMSk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNUUkFURUdZX1JGUzoKKwkJY2FzZSBTVFJBVEVHWV9YRlM6CisJCXsKKwkJCW1XYWl0aW5nU3RyYXRlZ3kgPSBuZXcgV2FpdGluZ0Jhc2ljU3RyYXRlZ3lSRlMoMSk7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgU1RSQVRFR1lfQkVTVDoKKwkJeworCQkJbVdhaXRpbmdTdHJhdGVneSA9IG5ldyBXYWl0aW5nQmFzaWNTdHJhdGVneUJGUygxKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBTVFJBVEVHWV9GSVJTVDoKKwkJeworCQkJbVdhaXRpbmdTdHJhdGVneSA9IG5ldyBXYWl0aW5nQmFzaWNTdHJhdGVneUZJUlNUKDEpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTVFJBVEVHWV9MQVNUOgorCQl7CisJCQltV2FpdGluZ1N0cmF0ZWd5ID0gbmV3IFdhaXRpbmdCYXNpY1N0cmF0ZWd5TEFTVCgxKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBTVFJBVEVHWV9PUkRFUjoKKwkJeworCQkJbVdhaXRpbmdTdHJhdGVneSA9IG5ldyBXYWl0aW5nQmFzaWNTdHJhdGVneU9SREVSKDEpOworCQkJYnJlYWs7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQltV2FpdGluZ1N0cmF0ZWd5ID0gbmV3IFdhaXRpbmdCYXNpY1N0cmF0ZWd5QkZTKDEpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKwordm9pZCBFeGVjdXRpb25RdWV1ZTo6Y29uZmlndXJlV2FpdGluZ0Jhc2ljU3RyYXRlZ3lBbGwoKQoreworCXN3aXRjaCggbVN0cmF0ZWd5ICYgU1RSQVRFR1lfRkFNSUxZX0JBU0lDX0FMTCApCisJeworCQljYXNlIFNUUkFURUdZX0JGUzoKKwkJeworCQkJbVdhaXRpbmdTdHJhdGVneSA9IG5ldyBXYWl0aW5nQmFzaWNTdHJhdGVneUFMTDwKKwkJCQkJV2FpdGluZ0Jhc2ljU3RyYXRlZ3lCRlMgPigxKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU1RSQVRFR1lfREZTOgorCQl7CisJCQltV2FpdGluZ1N0cmF0ZWd5ID0gbmV3IFdhaXRpbmdCYXNpY1N0cmF0ZWd5QUxMPAorCQkJCQlXYWl0aW5nQmFzaWNTdHJhdGVneURGUyA+KDEpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTVFJBVEVHWV9SRlM6CisJCWNhc2UgU1RSQVRFR1lfWEZTOgorCQl7CisJCQltV2FpdGluZ1N0cmF0ZWd5ID0gbmV3IFdhaXRpbmdCYXNpY1N0cmF0ZWd5QUxMPAorCQkJCQlXYWl0aW5nQmFzaWNTdHJhdGVneVJGUyA+KDEpOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFNUUkFURUdZX0JFU1Q6CisJCXsKKwkJCW1XYWl0aW5nU3RyYXRlZ3kgPSBuZXcgV2FpdGluZ0Jhc2ljU3RyYXRlZ3lBTEw8CisJCQkJCVdhaXRpbmdCYXNpY1N0cmF0ZWd5QkZTID4oMSk7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgU1RSQVRFR1lfRklSU1Q6CisJCXsKKwkJCW1XYWl0aW5nU3RyYXRlZ3kgPSBuZXcgV2FpdGluZ0Jhc2ljU3RyYXRlZ3lBTEw8CisJCQkJCVdhaXRpbmdCYXNpY1N0cmF0ZWd5RklSU1QgPigxKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU1RSQVRFR1lfTEFTVDoKKwkJeworCQkJbVdhaXRpbmdTdHJhdGVneSA9IG5ldyBXYWl0aW5nQmFzaWNTdHJhdGVneUFMTDwKKwkJCQkJV2FpdGluZ0Jhc2ljU3RyYXRlZ3lMQVNUID4oMSk7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgU1RSQVRFR1lfT1JERVI6CisJCXsKKwkJCW1XYWl0aW5nU3RyYXRlZ3kgPSBuZXcgV2FpdGluZ0Jhc2ljU3RyYXRlZ3lBTEw8CisJCQkJCVdhaXRpbmdCYXNpY1N0cmF0ZWd5T1JERVIgPigxKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBTVFJBVEVHWV9BTEw6CisJCWRlZmF1bHQ6CisJCXsKKwkJCW1XYWl0aW5nU3RyYXRlZ3kgPSBuZXcgV2FpdGluZ0Jhc2ljU3RyYXRlZ3lBTEw8CisJCQkJCVdhaXRpbmdCYXNpY1N0cmF0ZWd5QkZTID4oMSk7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworCisKK3ZvaWQgRXhlY3V0aW9uUXVldWU6OmNvbmZpZ3VyZVdhaXRpbmdCbG9ja1N0cmF0ZWd5KAorCQlhdm1fc2l6ZV90IGFCbG9ja0hlaWdodFBlcmlvZCwgYXZtX3NpemVfdCBhQmxvY2tXaWR0aFBlcmlvZCwKKwkJYXZtX3NpemVfdCBhQmxvY2tIZWlnaHQsIGF2bV9zaXplX3QgYUJsb2NrV2lkdGgsCisJCWF2bV9zaXplX3QgYUhlaWdodExpbWl0LCBhdm1fc2l6ZV90IGFXaWR0aExpbWl0KQoreworCXN3aXRjaCggbVN0cmF0ZWd5ICYgU1RSQVRFR1lfRkFNSUxZX0JBU0lDX0FMTCApCisJeworCQljYXNlIFNUUkFURUdZX0JGUzoKKwkJeworCQkJbVdhaXRpbmdTdHJhdGVneSA9IG5ldyBXYWl0aW5nU3RyYXRlZ3lCTE9DS19CRlMoCisJCQkJCWdldENvbmZpZ3VyYXRpb24oKSwgMSwgYUJsb2NrSGVpZ2h0UGVyaW9kLAorCQkJCQlhQmxvY2tXaWR0aFBlcmlvZCwgYUJsb2NrSGVpZ2h0LAorCQkJCQlhQmxvY2tXaWR0aCwgYUhlaWdodExpbWl0LCBhV2lkdGhMaW1pdCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNUUkFURUdZX0RGUzoKKwkJeworCQkJbVdhaXRpbmdTdHJhdGVneSA9IG5ldyBXYWl0aW5nU3RyYXRlZ3lCTE9DS19ERlMoCisJCQkJCWdldENvbmZpZ3VyYXRpb24oKSwgMSwgYUJsb2NrSGVpZ2h0UGVyaW9kLAorCQkJCQlhQmxvY2tXaWR0aFBlcmlvZCwgYUJsb2NrSGVpZ2h0LAorCQkJCQlhQmxvY2tXaWR0aCwgYUhlaWdodExpbWl0LCBhV2lkdGhMaW1pdCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNUUkFURUdZX1JGUzoKKwkJY2FzZSBTVFJBVEVHWV9YRlM6CisJCXsKKwkJCW1XYWl0aW5nU3RyYXRlZ3kgPSBuZXcgV2FpdGluZ1N0cmF0ZWd5QkxPQ0tfUkZTKAorCQkJCQlnZXRDb25maWd1cmF0aW9uKCksIDEsIGFCbG9ja0hlaWdodFBlcmlvZCwKKwkJCQkJYUJsb2NrV2lkdGhQZXJpb2QsIGFCbG9ja0hlaWdodCwKKwkJCQkJYUJsb2NrV2lkdGgsIGFIZWlnaHRMaW1pdCwgYVdpZHRoTGltaXQpOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFNUUkFURUdZX0JFU1Q6CisJCXsKKwkJCW1XYWl0aW5nU3RyYXRlZ3kgPSBuZXcgV2FpdGluZ1N0cmF0ZWd5QkxPQ0tfQkZTKAorCQkJCQlnZXRDb25maWd1cmF0aW9uKCksIDEsIGFCbG9ja0hlaWdodFBlcmlvZCwKKwkJCQkJYUJsb2NrV2lkdGhQZXJpb2QsIGFCbG9ja0hlaWdodCwKKwkJCQkJYUJsb2NrV2lkdGgsIGFIZWlnaHRMaW1pdCwgYVdpZHRoTGltaXQpOworCQkJYnJlYWs7CisJCX0KKworLy8JCWNhc2UgU1RSQVRFR1lfRklSU1Q6CisvLwkJY2FzZSBTVFJBVEVHWV9MQVNUOgorLy8KKy8vCQljYXNlIFNUUkFURUdZX09SREVSOgorCisJCWNhc2UgU1RSQVRFR1lfQUxMOgorCQl7CisJCQltV2FpdGluZ1N0cmF0ZWd5ID0gbmV3IFdhaXRpbmdTdHJhdGVneUJMT0NLX0FMTDwKKwkJCQkJV2FpdGluZ0Jhc2ljU3RyYXRlZ3lBTEw8IFdhaXRpbmdCYXNpY1N0cmF0ZWd5QkZTID4gPigKKwkJCQkJCQlnZXRDb25maWd1cmF0aW9uKCksIDEsIGFCbG9ja0hlaWdodFBlcmlvZCwKKwkJCQkJCQlhQmxvY2tXaWR0aFBlcmlvZCwgYUJsb2NrSGVpZ2h0LAorCQkJCQkJCWFCbG9ja1dpZHRoLCBhSGVpZ2h0TGltaXQsIGFXaWR0aExpbWl0KTsKKwkJCWJyZWFrOworCQl9CisJCWRlZmF1bHQ6CisJCXsKKwkJCW1XYWl0aW5nU3RyYXRlZ3kgPSBuZXcgV2FpdGluZ1N0cmF0ZWd5QkxPQ0tfQkZTKAorCQkJCQlnZXRDb25maWd1cmF0aW9uKCksICAxLCBhQmxvY2tIZWlnaHRQZXJpb2QsCisJCQkJCWFCbG9ja1dpZHRoUGVyaW9kLCBhQmxvY2tIZWlnaHQsCisJCQkJCWFCbG9ja1dpZHRoLCBhSGVpZ2h0TGltaXQsIGFXaWR0aExpbWl0KTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisKK3ZvaWQgRXhlY3V0aW9uUXVldWU6OmNvbmZpZ3VyZVdhaXRpbmdXZWlnaHRTdHJhdGVneShhdm1fdWludDhfdCBtYXhXZWlnaHQpCit7CisJc3dpdGNoKCBtU3RyYXRlZ3kgJiBTVFJBVEVHWV9GQU1JTFlfQkFTSUMgKQorCXsKKwkJY2FzZSBTVFJBVEVHWV9CRlM6CisJCXsKKwkJCW1XYWl0aW5nU3RyYXRlZ3kgPSBuZXcgV2FpdGluZ1N0cmF0ZWd5V0VJR0hUPAorCQkJCQlXYWl0aW5nQmFzaWNTdHJhdGVneUJGUyA+KG1heFdlaWdodCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNUUkFURUdZX0RGUzoKKwkJeworCQkJbVdhaXRpbmdTdHJhdGVneSA9IG5ldyBXYWl0aW5nU3RyYXRlZ3lXRUlHSFQ8CisJCQkJCVdhaXRpbmdCYXNpY1N0cmF0ZWd5REZTID4obWF4V2VpZ2h0KTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU1RSQVRFR1lfUkZTOgorCQljYXNlIFNUUkFURUdZX1hGUzoKKwkJeworCQkJbVdhaXRpbmdTdHJhdGVneSA9IG5ldyBXYWl0aW5nU3RyYXRlZ3lXRUlHSFQ8CisJCQkJCVdhaXRpbmdCYXNpY1N0cmF0ZWd5UkZTID4obWF4V2VpZ2h0KTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBTVFJBVEVHWV9CRVNUOgorCQl7CisJCQltV2FpdGluZ1N0cmF0ZWd5ID0gbmV3IFdhaXRpbmdTdHJhdGVneVdFSUdIVDwKKwkJCQkJV2FpdGluZ0Jhc2ljU3RyYXRlZ3lCRlMgPihtYXhXZWlnaHQpOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFNUUkFURUdZX0ZJUlNUOgorCQl7CisJCQltV2FpdGluZ1N0cmF0ZWd5ID0gbmV3IFdhaXRpbmdTdHJhdGVneVdFSUdIVDwKKwkJCQkJV2FpdGluZ0Jhc2ljU3RyYXRlZ3lGSVJTVCA+KG1heFdlaWdodCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNUUkFURUdZX0xBU1Q6CisJCXsKKwkJCW1XYWl0aW5nU3RyYXRlZ3kgPSBuZXcgV2FpdGluZ1N0cmF0ZWd5V0VJR0hUPAorCQkJCQlXYWl0aW5nQmFzaWNTdHJhdGVneUxBU1QgPihtYXhXZWlnaHQpOworCQkJYnJlYWs7CisJCX0KKworLy8JCWNhc2UgU1RSQVRFR1lfT1JERVI6CisKKwkJZGVmYXVsdDoKKwkJeworCQkJbVdhaXRpbmdTdHJhdGVneSA9IG5ldyBXYWl0aW5nU3RyYXRlZ3lXRUlHSFQ8CisJCQkJCVdhaXRpbmdCYXNpY1N0cmF0ZWd5QkZTID4obWF4V2VpZ2h0KTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisKK3ZvaWQgRXhlY3V0aW9uUXVldWU6OmNvbmZpZ3VyZVdhaXRpbmdXZWlnaHRTdHJhdGVneUFsbChhdm1fdWludDhfdCBtYXhXZWlnaHQpCit7CisJc3dpdGNoKCBtU3RyYXRlZ3kgJiBTVFJBVEVHWV9GQU1JTFlfQkFTSUNfQUxMICkKKwl7CisJCWNhc2UgU1RSQVRFR1lfQkZTOgorCQl7CisJCQltV2FpdGluZ1N0cmF0ZWd5ID0gbmV3IFdhaXRpbmdTdHJhdGVneVdFSUdIVDwKKwkJCQlXYWl0aW5nQmFzaWNTdHJhdGVneUFMTDwKKwkJCQkJCVdhaXRpbmdCYXNpY1N0cmF0ZWd5QkZTID4gPihtYXhXZWlnaHQpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTVFJBVEVHWV9ERlM6CisJCXsKKwkJCW1XYWl0aW5nU3RyYXRlZ3kgPSBuZXcgV2FpdGluZ1N0cmF0ZWd5V0VJR0hUPAorCQkJCVdhaXRpbmdCYXNpY1N0cmF0ZWd5QUxMPAorCQkJCQkJV2FpdGluZ0Jhc2ljU3RyYXRlZ3lERlMgPiA+KG1heFdlaWdodCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNUUkFURUdZX1JGUzoKKwkJY2FzZSBTVFJBVEVHWV9YRlM6CisJCXsKKwkJCW1XYWl0aW5nU3RyYXRlZ3kgPSBuZXcgV2FpdGluZ1N0cmF0ZWd5V0VJR0hUPAorCQkJCVdhaXRpbmdCYXNpY1N0cmF0ZWd5QUxMPAorCQkJCQkJV2FpdGluZ0Jhc2ljU3RyYXRlZ3lSRlMgPiA+KG1heFdlaWdodCk7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgU1RSQVRFR1lfQkVTVDoKKwkJeworCQkJbVdhaXRpbmdTdHJhdGVneSA9IG5ldyBXYWl0aW5nU3RyYXRlZ3lXRUlHSFQ8CisJCQkJV2FpdGluZ0Jhc2ljU3RyYXRlZ3lBTEw8CisJCQkJCQlXYWl0aW5nQmFzaWNTdHJhdGVneUJGUyA+ID4obWF4V2VpZ2h0KTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBTVFJBVEVHWV9GSVJTVDoKKwkJeworCQkJbVdhaXRpbmdTdHJhdGVneSA9IG5ldyBXYWl0aW5nU3RyYXRlZ3lXRUlHSFQ8CisJCQkJV2FpdGluZ0Jhc2ljU3RyYXRlZ3lBTEw8CisJCQkJCQlXYWl0aW5nQmFzaWNTdHJhdGVneUZJUlNUID4gPihtYXhXZWlnaHQpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTVFJBVEVHWV9MQVNUOgorCQl7CisJCQltV2FpdGluZ1N0cmF0ZWd5ID0gbmV3IFdhaXRpbmdTdHJhdGVneVdFSUdIVDwKKwkJCQlXYWl0aW5nQmFzaWNTdHJhdGVneUFMTDwKKwkJCQkJCVdhaXRpbmdCYXNpY1N0cmF0ZWd5TEFTVCA+ID4obWF4V2VpZ2h0KTsKKwkJCWJyZWFrOworCQl9CisKKy8vCQljYXNlIFNUUkFURUdZX09SREVSOgorCisJCWNhc2UgU1RSQVRFR1lfQUxMOgorCQlkZWZhdWx0OgorCQl7CisJCQltV2FpdGluZ1N0cmF0ZWd5ID0gbmV3IFdhaXRpbmdTdHJhdGVneVdFSUdIVDwKKwkJCQlXYWl0aW5nQmFzaWNTdHJhdGVneUFMTDwKKwkJCQkJCVdhaXRpbmdCYXNpY1N0cmF0ZWd5QkZTID4gPihtYXhXZWlnaHQpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKworLyoqCisgKiBSRUNPTkZJR1VSQVRJT04KKyAqLworYm9vbCBFeGVjdXRpb25RdWV1ZTo6cmVjb25maWd1cmUoCisJCUVOVU1fU1RSQVRFR1lfVCBuZXdTdHJhdGVneSwgYXZtX3VpbnQ4X3QgcXVldWVDb3VudCkKK3sKKwlpZiggKG1TdHJhdGVneSA9PSBuZXdTdHJhdGVneSkgJiYgKG1XYWl0aW5nU3RyYXRlZ3kgIT0gTlVMTCkgKQorCXsKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisJaWYoIG5ld1N0cmF0ZWd5ID09IFNUUkFURUdZX1VOREVGSU5FRCkKKwl7CisJCXJldHVybiggZmFsc2UgKTsKKwl9CisJLy8gVW5zdXBwb3J0ZWQgQkxPQ0sgc3RyYXRlZ3ksIHNlZSByZWNvbmZpZ3VyZUJsb2NrKC4uLikKKwllbHNlIGlmKCAobmV3U3RyYXRlZ3kgJiBTVFJBVEVHWV9CTE9DSykgIT0gMCApCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJLy8gZGVzdHJveSBjdXJyZW50IHdhaXRpbmcgc3RyYXRlZ3kKKwlpZiggbVdhaXRpbmdTdHJhdGVneSAhPSBOVUxMICkKKwl7CisJCWRlbGV0ZSBtV2FpdGluZ1N0cmF0ZWd5OworCisJCW1XYWl0aW5nU3RyYXRlZ3kgPSBOVUxMOworCX0KKwltU3RyYXRlZ3kgPSBuZXdTdHJhdGVneTsKKworCS8qKgorCSAqIFJlY29uZmlndXJlIHN1cHBvcnRlZCBzdHJhdGVneQorCSAqLworCS8vIFdFSUdIVCBzdHJhdGVneQorCWlmKCAobVN0cmF0ZWd5ICYgU1RSQVRFR1lfV0VJR0hUKSAhPSAwICkKKwl7CisJCWlmKCBtU3RyYXRlZ3kgJiBTVFJBVEVHWV9BTEwgKQorCQl7CisJCQljb25maWd1cmVXYWl0aW5nV2VpZ2h0U3RyYXRlZ3lBbGwocXVldWVDb3VudCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQljb25maWd1cmVXYWl0aW5nV2VpZ2h0U3RyYXRlZ3kocXVldWVDb3VudCk7CisJCX0KKwl9CisKKwkvLyBBTEwgZmFtaWx5IHN0cmF0ZWd5CisJZWxzZSBpZiggKG1TdHJhdGVneSAmIFNUUkFURUdZX0FMTCkgIT0gMCApCisJeworCQljb25maWd1cmVXYWl0aW5nQmFzaWNTdHJhdGVneUFsbCgpOworCX0KKwkvLyBiYXNpYyBzdHJhdGVneQorCWVsc2UKKwl7CisJCWNvbmZpZ3VyZVdhaXRpbmdCYXNpY1N0cmF0ZWd5KCk7CisJfQorCisKKwlpZiggbVdhaXRpbmdTdHJhdGVneSA9PSBOVUxMICkKKwl7CisJCUFWTV9PU19XQVJOIDw8ICJFeGVjdXRpb25RdWV1ZTo6cmVjb25maWd1cmU6PiAiCisJCQkJIkZhaWxlZCB0byByZWNvbmZpZ3VyZSB3YWl0aW5nIHN0cmF0ZWd5ICEiOworCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwlyZXR1cm4oIG1XYWl0aW5nU3RyYXRlZ3kgIT0gTlVMTCApOworfQorCisKK2Jvb2wgRXhlY3V0aW9uUXVldWU6OnJlY29uZmlndXJlQmxvY2soRU5VTV9TVFJBVEVHWV9UIG5ld1N0cmF0ZWd5LAorCQlhdm1fc2l6ZV90IGFCbG9ja0hlaWdodFBlcmlvZCwgYXZtX3NpemVfdCBhQmxvY2tXaWR0aFBlcmlvZCwKKwkJYXZtX3NpemVfdCBhQmxvY2tIZWlnaHQsIGF2bV9zaXplX3QgYUJsb2NrV2lkdGgsCisJCWF2bV9zaXplX3QgYUhlaWdodExpbWl0LCBhdm1fc2l6ZV90IGFXaWR0aExpbWl0KQoreworCWlmKCAobVN0cmF0ZWd5ID09IG5ld1N0cmF0ZWd5KSAmJiAobVdhaXRpbmdTdHJhdGVneSAhPSBOVUxMKSApCisJeworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisJZWxzZSBpZiggKG5ld1N0cmF0ZWd5ICYgU1RSQVRFR1lfQkxPQ0spID09IDAgICkKKwl7CisJCUFWTV9PU19XQVJOIDw8ICJFeGVjdXRpb25RdWV1ZTo6cmVjb25maWd1cmVCbG9jazo+ICIKKwkJCQkiVW5leHBlY3RlZCBhIG5vbi1ibG9jayBhcyB3YWl0aW5nIHN0cmF0ZWd5ICEiOworCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwkvLyBkZXN0cm95IGN1cnJlbnQgd2FpdGluZyBzdHJhdGVneQorCWlmKCBtV2FpdGluZ1N0cmF0ZWd5ICE9IE5VTEwgKQorCXsKKwkJZGVsZXRlIG1XYWl0aW5nU3RyYXRlZ3k7CisKKwkJbVdhaXRpbmdTdHJhdGVneSA9IE5VTEw7CisJfQorCW1TdHJhdGVneSA9IG5ld1N0cmF0ZWd5OworCisJLyoqCisJICogUmVjb25maWd1cmUgYmxvY2sgc3RyYXRlZ3kKKwkgKi8KKwljb25maWd1cmVXYWl0aW5nQmxvY2tTdHJhdGVneShhQmxvY2tIZWlnaHRQZXJpb2QsIGFCbG9ja1dpZHRoUGVyaW9kLAorCQkJYUJsb2NrSGVpZ2h0LCBhQmxvY2tXaWR0aCwgYUhlaWdodExpbWl0LCBhV2lkdGhMaW1pdCk7CisKKwlpZiggbVdhaXRpbmdTdHJhdGVneSA9PSBOVUxMICkKKwl7CisJCUFWTV9PU19XQVJOIDw8ICJFeGVjdXRpb25RdWV1ZTo6cmVjb25maWd1cmVCbG9jazo+ICIKKwkJCQkiRmFpbGVkIHRvIHJlY29uZmlndXJlQmxvY2sgd2FpdGluZyBzdHJhdGVneSAhIjsKKworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJcmV0dXJuKCBtV2FpdGluZ1N0cmF0ZWd5ICE9IE5VTEwgKTsKK30KKworCisvKioKKyAqIEdFVFRFUiAtIFNFVFRFUgorICogbVdhaXRpbmdTdHJhdGVneVN0YWNrCisgKiBtV2FpdGluZ1N0cmF0ZWd5CisgKi8KK2Jvb2wgRXhlY3V0aW9uUXVldWU6OnB1c2hXYWl0aW5nU3RyYXRlZ3koCisJCVdhaXRpbmdTdHJhdGVneSAqIGFXYWl0aW5nU3RyYXRlZ3ksIGJvb2wgc3BsaWNlQ29udGFpbmVkRmxhZykKK3sKKwlpZiggYVdhaXRpbmdTdHJhdGVneSA9PSBOVUxMICkKKwl7CisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwlpZiggc3BsaWNlQ29udGFpbmVkRmxhZyApCisJeworCQlhV2FpdGluZ1N0cmF0ZWd5LT5zcGxpY2UoICptV2FpdGluZ1N0cmF0ZWd5ICk7CisJfQorCisJbVdhaXRpbmdTdHJhdGVneVN0YWNrLnB1c2goIG1XYWl0aW5nU3RyYXRlZ3kgKTsKKworCW1XYWl0aW5nU3RyYXRlZ3kgPSBhV2FpdGluZ1N0cmF0ZWd5OworCisJcmV0dXJuKCB0cnVlICk7Cit9CisKK2Jvb2wgRXhlY3V0aW9uUXVldWU6OnBvcFdhaXRpbmdTdHJhdGVneSgKKwkJYm9vbCBzcGxpY2VDb250YWluZWRGbGFnLCBib29sIGRlc3Ryb3lDdXJyZW50RmxhZykKK3sKKwlpZiggbVdhaXRpbmdTdHJhdGVneVN0YWNrLmVtcHR5KCkgKQorCXsKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCWlmKCBtV2FpdGluZ1N0cmF0ZWd5ICE9IE5VTEwgKQorCXsKKwkJaWYoIHNwbGljZUNvbnRhaW5lZEZsYWcgKQorCQl7CisJCQltV2FpdGluZ1N0cmF0ZWd5U3RhY2sudG9wKCktPnNwbGljZSggKm1XYWl0aW5nU3RyYXRlZ3kgKTsKKwkJfQorCQlpZiggZGVzdHJveUN1cnJlbnRGbGFnICkKKwkJeworCQkJZGVsZXRlIG1XYWl0aW5nU3RyYXRlZ3k7CisJCX0KKwl9CisKKwltV2FpdGluZ1N0cmF0ZWd5ID0gbVdhaXRpbmdTdHJhdGVneVN0YWNrLnRvcCgpOworCisJbVdhaXRpbmdTdHJhdGVneVN0YWNrLnBvcCgpOworCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworLyoqCisgKiBSRVBPUlQgVFJBQ0UKKyAqLwordm9pZCBFeGVjdXRpb25RdWV1ZTo6cmVwb3J0RGVmYXVsdChPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKy8vQVZNX0lGX0RFQlVHX0ZMQUcoIFBST0NFU1NPUiApCisJb3MgPDwgVEFCIDw8ICJFWEVDVVRJT04gUVVFVUUiIDw8IHN0ZDo6ZW5kbDsKKworCW9zIDw8IFRBQjIgPDwgInN0cmF0ZWd5IDogIiA8PCBzdHJTdHJhdGVneSgpIDw8IEVPTF9GTFVTSDsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUkVQT1JUSU5HICwgQ09NUFVUSU5HICkKKworCW9zIDw8IGluY3Jfc3RyZWFtKCAqdGhpcyApOworCitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBSRVBPUlRJTkcgLCBDT01QVVRJTkcgKQorLy9BVk1fRU5ESUZfREVCVUdfRkxBRyggUFJPQ0VTU09SICkKK30KKworCisvKioKKyAqIFRSQUNFIFF1ZXVlCisgKi8KK3ZvaWQgRXhlY3V0aW9uUXVldWU6OnRyYWNlUXVldWUoT3V0U3RyZWFtICYgb3MsCisJCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBhUXVldWUsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU1lc3NhZ2UpCit7CisJb3MgPDwgVEFCIDw8IGFNZXNzYWdlIDw8ICIgPDwgc2l6ZSA6ICIgPDwgYVF1ZXVlLnNpemUoKSA8PCAiID4+ICIKKwkJCTw8IEVPTF9JTkNSX0lOREVOVDsKKworCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQ6Oml0ZXJhdG9yIGl0ID0gYVF1ZXVlLmJlZ2luKCk7CisJTGlzdE9mRXhlY3V0aW9uQ29udGV4dDo6aXRlcmF0b3IgaXRFbmQgPSBhUXVldWUuZW5kKCk7CisJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApCisJeworCQkoKml0KS0+dHJhY2VEZWZhdWx0KG9zKTsKKwl9CisJb3MgPDwgREVDUl9JTkRFTlQ7Cit9CisKKworLyoqCisgKiBTZXJpYWxpemF0aW9uCisgKi8KK3N0ZDo6c3RyaW5nIEV4ZWN1dGlvblF1ZXVlOjpzdHJTdHJhdGVneSgpIGNvbnN0Cit7CisJaWYoIG1TdHJhdGVneSA9PSBTVFJBVEVHWV9VTkRFRklORUQgKQorCXsKKwkJcmV0dXJuKCAiVU5ERUZJTkVEIiApOworCX0KKwllbHNlCisJeworCQlzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworCisJCWlmKCAobVN0cmF0ZWd5ICYgU1RSQVRFR1lfQkxPQ0spICE9IDAgKQorCQl7CisJCQlvc3MgPDwgIiNCTE9DSyI7CisJCX0KKwkJaWYoIChtU3RyYXRlZ3kgJiBTVFJBVEVHWV9XRUlHSFQpICE9IDAgKQorCQl7CisJCQlvc3MgPDwgIiNXRUlHSFQiOworCQl9CisKKwkJaWYoIChtU3RyYXRlZ3kgJiBTVFJBVEVHWV9BTEwpICE9IDAgKQorCQl7CisJCQlvc3MgPDwgIiNBTEwiOworCQl9CisKKwkJaWYoIChtU3RyYXRlZ3kgJiBTVFJBVEVHWV9ERlMpICE9IDAgKQorCQl7CisJCQlvc3MgPDwgIiNERlMiOworCQl9CisJCWlmKCAobVN0cmF0ZWd5ICYgU1RSQVRFR1lfQkZTKSAhPSAwICkKKwkJeworCQkJb3NzIDw8ICIjQkZTIjsKKwkJfQorCQlpZiggKG1TdHJhdGVneSAmIFNUUkFURUdZX1JGUykgIT0gMCApCisJCXsKKwkJCW9zcyA8PCAiI1JGUyI7CisJCX0KKwkJaWYoIChtU3RyYXRlZ3kgJiBTVFJBVEVHWV9YRlMpICE9IDAgKQorCQl7CisJCQlvc3MgPDwgIiNYRlMiOworCQl9CisKKwkJaWYoIChtU3RyYXRlZ3kgJiBTVFJBVEVHWV9CRVNUKSAhPSAwICkKKwkJeworCQkJb3NzIDw8ICIjQkVTVCI7CisJCX0KKworCQlpZiggKG1TdHJhdGVneSAmIFNUUkFURUdZX0ZJUlNUKSAhPSAwICkKKwkJeworCQkJb3NzIDw8ICIjRklSU1QiOworCQl9CisJCWlmKCAobVN0cmF0ZWd5ICYgU1RSQVRFR1lfTEFTVCkgIT0gMCApCisJCXsKKwkJCW9zcyA8PCAiI0xBU1QiOworCQl9CisKKwkJaWYoIChtU3RyYXRlZ3kgJiBTVFJBVEVHWV9PUkRFUikgIT0gMCApCisJCXsKKwkJCW9zcyA8PCAiI09SREVSIjsKKwkJfQorCisJCXJldHVybiggb3NzLnN0cigpICk7CisJfQorfQorCisKK3ZvaWQgRXhlY3V0aW9uUXVldWU6OnRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdAoreworCW9zIDw8IFRBQiA8PCAicXVldWUgIiA8PCBzdHJVbmlxSWQoKSA8PCAiIHsiIDw8IEVPTDsKKworCWlmKCBtSW5pdFF1ZXVlLm5vbmVtcHR5KCkgKQorCXsKKwkJb3MgPDwgVEFCIDw8ICJpbml0PCBzaXplOiAiIDw8IG1Jbml0UXVldWUuc2l6ZSgpIDw8ICIgPjoiCisJCQkJPDwgRU9MX0lOQ1JfSU5ERU5UOworCisJCXRvU3RyZWFtKG1Jbml0UXVldWUsIG9zKTsKKwkJb3MgPDwgREVDUl9JTkRFTlQ7CisJfQorCisJaWYoIGhhc1dhaXRpbmcoKSApCisJeworCQltV2FpdGluZ1N0cmF0ZWd5LT50b1N0cmVhbShvcyk7CisJfQorCisJaWYoIG1GYWlsZWRRdWV1ZS5ub25lbXB0eSgpICkKKwl7CisJCW9zIDw8IFRBQiA8PCAiZmFpbGVkPCBzaXplOiAiIDw8IG1GYWlsZWRRdWV1ZS5zaXplKCkgPDwgIiA+OiIKKwkJCQk8PCBFT0xfSU5DUl9JTkRFTlQ7CisKKwkJdG9TdHJlYW0obUZhaWxlZFF1ZXVlLCBvcyk7CisJCW9zIDw8IERFQ1JfSU5ERU5UOworCX0KKworCWlmKCBtUmVhZHlRdWV1ZS5ub25lbXB0eSgpICkKKwl7CisJCW9zIDw8IFRBQiA8PCAicmVhZHk8IHNpemU6ICIgPDwgbVJlYWR5UXVldWUuc2l6ZSgpIDw8ICIgPjoiCisJCQkJPDwgRU9MX0lOQ1JfSU5ERU5UOworCisJCXRvU3RyZWFtKG1SZWFkeVF1ZXVlLCBvcyk7CisJCW9zIDw8IERFQ1JfSU5ERU5UOworCX0KKworCWlmKCBtUmVzdWx0UXVldWUubm9uZW1wdHkoKSApCisJeworCQlvcyA8PCBUQUIgPDwgInJlc3VsdDwgc2l6ZTogIiA8PCBtUmVzdWx0UXVldWUuc2l6ZSgpIDw8ICIgPjoiCisJCQkJPDwgRU9MX0lOQ1JfSU5ERU5UOworCisJCXRvU3RyZWFtKG1SZXN1bHRRdWV1ZSwgb3MpOworCQlvcyA8PCBERUNSX0lOREVOVDsKKwl9CisKKwlvcyA8PCBUQUIgPDwgIn0iIDw8IEVPTDsKK30KKwordm9pZCBFeGVjdXRpb25RdWV1ZTo6dG9TdHJlYW0oCisJCWNvbnN0IExpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBhUXVldWUsIE91dFN0cmVhbSAmIG9zKSBjb25zdAoreworCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQ6OmNvbnN0X2l0ZXJhdG9yIGl0RUMgPSBhUXVldWUuYmVnaW4oKTsKKwlMaXN0T2ZFeGVjdXRpb25Db250ZXh0Ojpjb25zdF9pdGVyYXRvciBpdEVuZCA9IGFRdWV1ZS5lbmQoKTsKKwlmb3IoIDsgaXRFQyAhPSBpdEVuZCA7ICsraXRFQyApCisJeworCQlpZiggKCgqaXRFQykgIT0gTlVMTCkgJiYgKCppdEVDKS0+aXNBbGl2ZSgpICkKKwkJeworCQkJKCppdEVDKS0+dHJhY2VEZWZhdWx0KG9zKTsKKwkJfQorCisJfQorfQorCisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3F1ZXVlL0V4ZWN1dGlvblF1ZXVlLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vcXVldWUvRXhlY3V0aW9uUXVldWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjNmZjhmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3F1ZXVlL0V4ZWN1dGlvblF1ZXVlLmgKQEAgLTAsMCArMSw3MjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgRVhFQ1VUSU9OUVVFVUVfSF8KKyNkZWZpbmUgRVhFQ1VUSU9OUVVFVUVfSF8KKworI2luY2x1ZGUgPGZhbS9hcGkvQWJzdHJhY3RQcm9jZXNzb3JVbml0Lmg+CisjaW5jbHVkZSA8c2V3L1N5bWJleEV2ZW50TWFuYWdlci5oPgorCisjaW5jbHVkZSAiV2FpdGluZ1N0cmF0ZWd5LmgiCisKKyNpbmNsdWRlIDxjb2xsZWN0aW9uL1R5cGVkZWYuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkNvbnRleHQuaD4KKworI2luY2x1ZGUgPHN0YWNrPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworY2xhc3MgQWJzdHJhY3RQcm9jZXNzb3JVbml0OworY2xhc3MgRXhlY3V0aW9uQ29udGV4dDsKK2NsYXNzIFN5bWJleENvbnRyb2xsZXJVbml0TWFuYWdlcjsKKworCitjbGFzcyBFeGVjdXRpb25RdWV1ZSA6CisJCXB1YmxpYyBBdXRvUmVnaXN0ZXJlZFByb2Nlc3NvclVuaXQ8IEV4ZWN1dGlvblF1ZXVlID4sCisJCXB1YmxpYyBJSGFuZGxlckV2ZW50RGVzdHJveUN0eAoreworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIEV4ZWN1dGlvblF1ZXVlICkKKworCS8qKgorCSAqIE1BSU4gUFJPQ0VTU09SIEZBQ1RPUlkKKwkgKiBmb3IgYXV0b21hdGljIHJlZ2lzdHJhdGlvbiBpbiB0aGUgcHJvY2Vzc29yIHJlcG9zaXRvcnkKKwkgKiB0aGUgWyBbIEZVTExZIF0gUVVBTElGSUVEIF0gTkFNRSBJRAorCSAqLworCUFWTV9JTkpFQ1RfQVVUT19SRUdJU1RFUl9RVUFMSUZJRURfSURfS0VZXzMoCisJCQkic3ltYmV4LnF1ZXVlIiwKKwkJCSJhdm06OnByb2Nlc3Nvci5FWEVDVVRJT05fUVVFVUUiLAorCQkJImF2bTo6Y29yZS5FWEVDVVRJT05fUVVFVUUiICkKKwkvLyBlbmQgcmVnaXN0cmF0aW9uCisKKworcHVibGljOgorCS8qKgorCSAqIFRZUEVERUYKKwkgKi8KKwl0eXBlZGVmIGF2bV91aW50MTZfdCAgICAgICAgICAgICBFTlVNX1NUUkFURUdZX1Q7CisKKwllbnVtCisJeworCQlTVFJBVEVHWV9VTkRFRklORUQgICAgICAgICAgICA9IDB4MDAwMCwKKworCQkvLyBCYXNpYyBTdHJhdGVneSBGYW1pbHkKKwkJU1RSQVRFR1lfQkZTICAgICAgICAgICAgICAgICAgPSAweDAwMDEsCisKKwkJU1RSQVRFR1lfREZTICAgICAgICAgICAgICAgICAgPSAweDAwMDIsCisKKwkJU1RSQVRFR1lfUkZTICAgICAgICAgICAgICAgICAgPSAweDAwMDQsCisJCVNUUkFURUdZX1hGUyAgICAgICAgICAgICAgICAgID0gMHgwMDA4LAorCisJCVNUUkFURUdZX0JFU1QgICAgICAgICAgICAgICAgID0gMHgwMDEwLAorCQlTVFJBVEVHWV9GSVJTVCAgICAgICAgICAgICAgICA9IDB4MDAyMCwKKwkJU1RSQVRFR1lfTEFTVCAgICAgICAgICAgICAgICAgPSAweDAwNDAsCisKKwkJU1RSQVRFR1lfT1JERVIgICAgICAgICAgICAgICAgPSAweDAwODAsCisKKwkJU1RSQVRFR1lfRkFNSUxZX0JBU0lDICAgICAgICAgPSBTVFJBVEVHWV9CRlMgICB8IFNUUkFURUdZX0RGUworCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNUUkFURUdZX1JGUyAgIHwgU1RSQVRFR1lfWEZTCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU1RSQVRFR1lfQkVTVCAgfCBTVFJBVEVHWV9PUkRFUgorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNUUkFURUdZX0ZJUlNUIHwgU1RSQVRFR1lfTEFTVCwKKworCQkvLyBmb3IgcG9wVG8gUmVhZHlRdWV1ZQorCQlTVFJBVEVHWV9BTEwgICAgICAgICAgICAgICAgICA9IDB4MDEwMCwKKworCQlTVFJBVEVHWV9GQU1JTFlfQkFTSUNfQUxMICAgICA9IFNUUkFURUdZX0ZBTUlMWV9CQVNJQworCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNUUkFURUdZX0FMTCwKKworCisJCS8vIEJsb2NrIFN0cmF0ZWd5CisJCVNUUkFURUdZX0JMT0NLICAgICAgICAgICAgICAgID0gMHgwMjAwLAorCisJCS8vIFdlaWdodCBTdHJhdGVneQorCQlTVFJBVEVHWV9XRUlHSFQgICAgICAgICAgICAgICA9IDB4MDQwMCwKKworCX07CisKKwkvKioKKwkgKiBERUZBVUxUIFFVRVVFIENPVU5UCisJICovCisJc3RhdGljIGNvbnN0IGF2bV91aW50OF90IERFRkFVTFRfUVVFVUVfQ09VTlQgPSA4OworCisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBBVFRSSUJVVEVTCisJICovCisJLy8gbGVzIGNvbnRleHRlcyBxdWkgYXR0ZW5kZW50IHNhZ2VtZW50IHF1J29uIGxlcyBpbml0aWFsaXNlIGFmaW4KKwkvLyBxdSdpbHMgcHVpc3NlbnQgw6l0cmUgbWlzIGRhbnMgbGEgd2FpdGluZyEhISEKKwkvLyBJbCBuJ3kgYSBwYXMgZGUgcmFpc29uIHF1J29uIGVuIHRyYWl0ZSBxdSd1biBzZXVsIMOgIGxhIGZvaXMhISEhIQorCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQgbUluaXRRdWV1ZTsKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyB0aGUgd2FpdGluZyBxdWV1ZSBzdHJhdGVneSAmIGJlaGF2b3VyCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIGxlcyBjb250ZXh0ZXMgcXVpIGF0dGVuZGVudCBzYWdlbWVudCBxdSdvbiBzJ2ludMOpcmVzc2Ugw6AgZXV4IHBvdXIgcGFzc2VyCisJLy8gbCdhdWRpdGlvbiBjb25kdWlzYW50IMOgIGwnZXjDqWN1dGlvbiAhISEKKwlXYWl0aW5nU3RyYXRlZ3kgKiBtV2FpdGluZ1N0cmF0ZWd5OworCXN0ZDo6c3RhY2s8IFdhaXRpbmdTdHJhdGVneSAqID4gbVdhaXRpbmdTdHJhdGVneVN0YWNrOworCisJLy8gbGVzIGNvbnRleHRlcyBwcmVzIHBvdXIgbCdleMOpY3V0aW9uOiBpbHMgb250IHLDqXVzc2kgbCdhdWRpdGlvbiBkZXMgZmlsdHJlcy4uLgorCS8vIElsIG4neSBhIHBhcyBkZSByYWlzb24gcXUnb24gZW4gdHJhaXRlIHF1J3VuIHNldWwgw6AgbGEgZm9pcyEhIQorCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQgbVJlYWR5UXVldWU7CisKKwkvLyBsZXMgY29udGV4dGVzIG1pcyBlbiByw6lzZXJ2ZSB2b2xvbnRhaXJlbWVudCBwYXIgdW4gcHJvY2Vzc2V1ciwKKwkvLyBldCBwb3VycmFpZW50IGZhaXJlIGwnb2JqZXQgZCd1bmUgcsOpY3Vww6lyYXRpb24gZnV0dXIuLi4uCisJTGlzdE9mRXhlY3V0aW9uQ29udGV4dCBtUmVzZXJ2ZVF1ZXVlOworCisJLy8gbGVzIGNvbnRleHRlcyBheWFudCDDqWNob3XDqSDDoCBsJ8OpcHJldXZlIGRlcyBmaWx0cmVzLAorCS8vIGV0IHBvdXJyYWllbnQgZmFpcmUgbCdvYmpldCBkJ3VuZSDDqXByZXV2ZSBkZSByw6ljdXDDqXJhdGlvbiBmdXR1ci4uLgorCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQgbUZhaWxlZFF1ZXVlOworCisJLy8gbGVzIGNvbnRleHRlcyB2ZW5hbnQgZCdldHJlIGV4w6ljdXTDqXMKKwkvLyBJbCBuJ3kgYSBwYXMgZGUgcmFpc29uIHF1J29uIGVuIHRyYWl0ZSBxdSd1biBzZXVsIMOgIGxhIGZvaXMhISEKKwlMaXN0T2ZFeGVjdXRpb25Db250ZXh0IG1SZXN1bHRRdWV1ZTsKKworCisJLyoqCisJICogU3RyYXRlZ3kKKwkgKiBERlMgfCBCRlMgfCBSRlMKKwkgKiBCTE9DS18/Pz8gfCBXRUlHSFRfPz8/IHwgVEFSR0VUX0ZPUk1VTEFfPz8/CisJICogU1RSQVRFR1lfT1JERVIKKwkgKi8KKwlFTlVNX1NUUkFURUdZX1QgbVN0cmF0ZWd5OworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlFeGVjdXRpb25RdWV1ZShTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXIgJiBhQ29udHJvbGxlclVuaXRNYW5hZ2VyLAorCQkJV09iamVjdCAqIHdmUGFyYW1ldGVyT2JqZWN0ID0gTlVMTCkKKwk6IEF1dG9SZWdpc3RlcmVkUHJvY2Vzc29yVW5pdCggYUNvbnRyb2xsZXJVbml0TWFuYWdlciAsCisJCQl3ZlBhcmFtZXRlck9iamVjdCAsIFBSRUNFREVOQ0VfT0ZfTUFJTl9QUk9DRVNTT1IpLAorCW1Jbml0UXVldWUoKSwKKworCW1XYWl0aW5nU3RyYXRlZ3koIE5VTEwgKSwKKwltV2FpdGluZ1N0cmF0ZWd5U3RhY2soICksCisKKwltUmVhZHlRdWV1ZSgpLAorCisJbVJlc2VydmVRdWV1ZSgpLAorCW1GYWlsZWRRdWV1ZSgpLAorCisJbVJlc3VsdFF1ZXVlKCksCisKKwltU3RyYXRlZ3koIFNUUkFURUdZX0RGUyApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+RXhlY3V0aW9uUXVldWUoKTsKKworCisJLyoqCisJICogQ09ORklHVVJFCisJICovCisJdmlydHVhbCBib29sIGNvbmZpZ3VyZUltcGwoKTsKKworCXZvaWQgY29uZmlndXJlV2FpdGluZ0Jhc2ljU3RyYXRlZ3koKTsKKworCXZvaWQgY29uZmlndXJlV2FpdGluZ0Jhc2ljU3RyYXRlZ3lBbGwoKTsKKworCXZvaWQgY29uZmlndXJlV2FpdGluZ0Jsb2NrU3RyYXRlZ3koCisJCQlhdm1fc2l6ZV90IGFCbG9ja0hlaWdodFBlcmlvZCwgYXZtX3NpemVfdCBhQmxvY2tXaWR0aFBlcmlvZCwKKwkJCWF2bV9zaXplX3QgYUJsb2NrSGVpZ2h0LCBhdm1fc2l6ZV90IGFCbG9ja1dpZHRoLAorCQkJYXZtX3NpemVfdCBhSGVpZ2h0TGltaXQsIGF2bV9zaXplX3QgYVdpZHRoTGltaXQpOworCisJdm9pZCBjb25maWd1cmVXYWl0aW5nV2VpZ2h0U3RyYXRlZ3koYXZtX3VpbnQ4X3QgbWF4V2VpZ2h0KTsKKwl2b2lkIGNvbmZpZ3VyZVdhaXRpbmdXZWlnaHRTdHJhdGVneUFsbChhdm1fdWludDhfdCBtYXhXZWlnaHQpOworCisKKwkvKioKKwkgKiBSRUNPTkZJR1VSQVRJT04KKwkgKi8KKwlib29sIHJlY29uZmlndXJlKEVOVU1fU1RSQVRFR1lfVCBuZXdTdHJhdGVneSwKKwkJCWF2bV91aW50OF90IHF1ZXVlQ291bnQgPSBERUZBVUxUX1FVRVVFX0NPVU5UKTsKKworCWJvb2wgcmVjb25maWd1cmVCbG9jayhFTlVNX1NUUkFURUdZX1QgbmV3U3RyYXRlZ3ksCisJCQlhdm1fc2l6ZV90IGFCbG9ja0hlaWdodFBlcmlvZCwgYXZtX3NpemVfdCBhQmxvY2tXaWR0aFBlcmlvZCwKKwkJCWF2bV9zaXplX3QgYUJsb2NrSGVpZ2h0LCBhdm1fc2l6ZV90IGFCbG9ja1dpZHRoLAorCQkJYXZtX3NpemVfdCBhSGVpZ2h0TGltaXQsIGF2bV9zaXplX3QgYVdpZHRoTGltaXQpOworCisKKwkvKioKKwkgKiBSRVBPUlQgVFJBQ0UKKwkgKi8KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgcmVwb3J0U2lsZW50KE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJLy8gU0lMRU5UID0+IE5PVEhJTkcKKwl9CisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHJlcG9ydE1pbmltdW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwl2aXJ0dWFsIHZvaWQgcmVwb3J0RGVmYXVsdChPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1Jbml0UXVldWUKKwkgKi8KKwlpbmxpbmUgdm9pZCBhcHBlbmRJbml0KEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDKQorCXsKKwkJbUluaXRRdWV1ZS5hcHBlbmQoYW5FQyk7CisJfQorCisJaW5saW5lIHZvaWQgYXBwZW5kSW5pdChjb25zdCBMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgbGlzdE9mRUMpCisJeworCQltSW5pdFF1ZXVlLmFwcGVuZChsaXN0T2ZFQyk7CisJfQorCisJaW5saW5lIExpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBnZXRJbml0UXVldWUoKQorCXsKKwkJcmV0dXJuKCBtSW5pdFF1ZXVlICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzSW5pdCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Jbml0UXVldWUubm9uZW1wdHkoKSApOworCX0KKworCWlubGluZSB2b2lkIHRyYWNlSW5pdChPdXRTdHJlYW0gJiBvcykKKwl7CisJCXRyYWNlUXVldWUob3MsIG1Jbml0UXVldWUsICJFWEVDVVRJT04gSU5JVCBRVUVVRSIpOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVdhaXRpbmdTdHJhdGVneQorCSAqLworCWlubGluZSBXYWl0aW5nU3RyYXRlZ3kgKiBnZXRXYWl0aW5nU3RyYXRlZ3koKQorCXsKKwkJcmV0dXJuKCBtV2FpdGluZ1N0cmF0ZWd5ICk7CisJfQorCisJaW5saW5lIFdhaXRpbmdTdHJhdGVneSAmIHJlZldhaXRpbmdTdHJhdGVneSgpCisJeworCQlyZXR1cm4oICptV2FpdGluZ1N0cmF0ZWd5ICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzV2FpdGluZ1N0cmF0ZWd5KCkgY29uc3QKKwl7CisJCXJldHVybiggbVdhaXRpbmdTdHJhdGVneSAhPSBOVUxMICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0V2FpdGluZ1N0cmF0ZWd5KFdhaXRpbmdTdHJhdGVneSAqIGFXYWl0aW5nU3RyYXRlZ3kpCisJeworCQltV2FpdGluZ1N0cmF0ZWd5ID0gYVdhaXRpbmdTdHJhdGVneTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1XYWl0aW5nU3RyYXRlZ3kKKwkgKiBtV2FpdGluZ1N0cmF0ZWd5U3RhY2sKKwkgKi8KKwlib29sIHB1c2hXYWl0aW5nU3RyYXRlZ3koV2FpdGluZ1N0cmF0ZWd5ICogYVdhaXRpbmdTdHJhdGVneSwKKwkJCWJvb2wgc3BsaWNlQ29udGFpbmVkRmxhZyA9IHRydWUpOworCisJYm9vbCBwb3BXYWl0aW5nU3RyYXRlZ3koYm9vbCBzcGxpY2VDb250YWluZWRGbGFnID0gdHJ1ZSwKKwkJCWJvb2wgZGVzdHJveUN1cnJlbnRGbGFnID0gZmFsc2UpOworCisKKwkvKioKKwkgKiBoYXNXb3JrKCkKKwkgKi8KKwlpbmxpbmUgYm9vbCBoYXNXb3JrKCkgY29uc3QKKwl7CisJCXJldHVybiggaGFzV2FpdGluZygpIHx8IGhhc1JlYWR5KCkgKTsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtV2FpdGluZ1F1ZXVlCisJICovCisKKwlpbmxpbmUgdm9pZCBjbGVhcldhaXRpbmcoKQorCXsKKwkJbVdhaXRpbmdTdHJhdGVneS0+Y2xlYXJRdWV1ZVRhYmxlKCk7CisJfQorCisJaW5saW5lIHZvaWQgZ2V0V2FpdGluZyhMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgYWxpc09mRUMpCisJeworCQltV2FpdGluZ1N0cmF0ZWd5LT5nZXRRdWV1ZVRhYmxlKCBhbGlzT2ZFQyApOworCX0KKworCWlubGluZSBMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgZ2V0V2FpdGluZ1F1ZXVlKCkKKwl7CisJCXJldHVybiggbVdhaXRpbmdTdHJhdGVneS0+Z2V0UXVldWUoKSApOworCX0KKworCWlubGluZSBMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgZ2V0V2FpdGluZ1F1ZXVlQ2FjaGUoKQorCXsKKwkJcmV0dXJuKCBtV2FpdGluZ1N0cmF0ZWd5LT5nZXRDYWNoZSgpICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBoYXNXYWl0aW5nKCkgY29uc3QKKwl7CisJCXJldHVybiggbVdhaXRpbmdTdHJhdGVneS0+aGFzV2FpdGluZygpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzV2FpdGluZ0NhY2hlKCkgY29uc3QKKwl7CisJCXJldHVybiggbVdhaXRpbmdTdHJhdGVneS0+Z2V0Q2FjaGUoKS5ub25lbXB0eSgpICk7CisJfQorCisKKworCWlubGluZSBFeGVjdXRpb25Db250ZXh0ICogdG9wV2FpdGluZygpCisJeworCQlyZXR1cm4oIG1XYWl0aW5nU3RyYXRlZ3ktPnRvcCgpICk7CisJfQorCisJaW5saW5lIEV4ZWN1dGlvbkNvbnRleHQgKiBwb3BXYWl0aW5nKCkKKwl7CisJCXJldHVybiggbVdhaXRpbmdTdHJhdGVneS0+cG9wKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBwb3BXYWl0aW5nMlJlYWR5KCkKKwl7CisJCW1XYWl0aW5nU3RyYXRlZ3ktPnBvcFRvKCBtUmVhZHlRdWV1ZSApOworCX0KKworCWlubGluZSB2b2lkIHB1c2hXYWl0aW5nQ2FjaGUoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpCisJeworCQltV2FpdGluZ1N0cmF0ZWd5LT5wdXNoQ2FjaGUoIGFuRUMgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzcGxpY2VXYWl0aW5nQ2FjaGUoTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGxpc3RPZkVDKQorCXsKKwkJd2hpbGUoIGxpc3RPZkVDLm5vbmVtcHR5KCkgKQorCQl7CisJCQltV2FpdGluZ1N0cmF0ZWd5LT5wdXNoQ2FjaGUoIGxpc3RPZkVDLnBvcF9maXJzdCgpICk7CisJCX0KKwl9CisKKwlpbmxpbmUgdm9pZCBwdXNoV2FpdGluZyhFeGVjdXRpb25Db250ZXh0ICogYW5FQykKKwl7CisJCW1XYWl0aW5nU3RyYXRlZ3ktPnB1c2goIGFuRUMgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBwdXNoV2FpdGluZyhjb25zdCBMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgbGlzdE9mRUMpCisJeworCQltV2FpdGluZ1N0cmF0ZWd5LT5wdXNoKCBsaXN0T2ZFQyApOworCX0KKworCWlubGluZSB2b2lkIHB1c2hJbml0MldhaXRpbmcoKQorCXsKKwkJd2hpbGUoIG1Jbml0UXVldWUubm9uZW1wdHkoKSApCisJCXsKKwkJCW1XYWl0aW5nU3RyYXRlZ3ktPnB1c2goIG1Jbml0UXVldWUucG9wX2ZpcnN0KCkgKTsKKwkJfQorCX0KKworCisJaW5saW5lIHZvaWQgcHVzaFdhaXRpbmdDaGlsZChjb25zdCBMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgY2hpbGRFQykKKwl7CisJCW1XYWl0aW5nU3RyYXRlZ3ktPnB1c2hDaGlsZCggY2hpbGRFQyApOworCX0KKworCisJaW5saW5lIGF2bV9zaXplX3Qgc2l6ZVdhaXRpbmcoKQorCXsKKwkJcmV0dXJuKCBtV2FpdGluZ1N0cmF0ZWd5LT5zaXplV2FpdGluZygpICk7CisJfQorCisKKwlpbmxpbmUgdm9pZCB0cmFjZVdhaXRpbmcoT3V0U3RyZWFtICYgb3MpCisJeworCQltV2FpdGluZ1N0cmF0ZWd5LT50cmFjZShvcywgIkVYRUNVVElPTiBXQUlUSU5HIFFVRVVFIik7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtUmVhZHlRdWV1ZQorCSAqLworCWlubGluZSB2b2lkIGFwcGVuZFJlYWR5KEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDKQorCXsKKwkJbVJlYWR5UXVldWUuYXBwZW5kKGFuRUMpOworCX0KKworCWlubGluZSB2b2lkIGFwcGVuZFJlYWR5KExpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBsaXN0T2ZFQykKKwl7CisJCW1SZWFkeVF1ZXVlLmFwcGVuZChsaXN0T2ZFQyk7CisJfQorCisJaW5saW5lIHZvaWQgc3BsaWNlUmVhZHkoTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGxpc3RPZkVDKQorCXsKKwkJbVJlYWR5UXVldWUuc3BsaWNlKGxpc3RPZkVDKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBjbGVhclJlYWR5KCkKKwl7CisJCW1SZWFkeVF1ZXVlLmNsZWFyKCk7CisJfQorCisJaW5saW5lIExpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBnZXRSZWFkeVF1ZXVlKCkKKwl7CisJCXJldHVybiggbVJlYWR5UXVldWUgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNSZWFkeSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1SZWFkeVF1ZXVlLm5vbmVtcHR5KCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNSZWFkeVdvcmsoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUmVhZHlRdWV1ZS5ub25lbXB0eSgpICk7CisJfQorCisKKwlpbmxpbmUgdm9pZCB0cmFjZVJlYWR5KE91dFN0cmVhbSAmIG9zKQorCXsKKwkJdHJhY2VRdWV1ZShvcywgbVJlYWR5UXVldWUsICJFWEVDVVRJT04gUkVBRFkgUVVFVUUiKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1SZXNlcnZlUXVldWUKKwkgKi8KKwlpbmxpbmUgdm9pZCBhcHBlbmRSZXNlcnZlKEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDKQorCXsKKwkJbVJlc2VydmVRdWV1ZS5hcHBlbmQoYW5FQyk7CisJfQorCisJaW5saW5lIHZvaWQgYXBwZW5kUmVzZXJ2ZShMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgbGlzdE9mRUMpCisJeworCQltUmVzZXJ2ZVF1ZXVlLmFwcGVuZChsaXN0T2ZFQyk7CisJfQorCisJaW5saW5lIHZvaWQgc3BsaWNlUmVzZXJ2ZShMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgbGlzdE9mRUMpCisJeworCQltUmVzZXJ2ZVF1ZXVlLnNwbGljZShsaXN0T2ZFQyk7CisJfQorCisJaW5saW5lIExpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBnZXRSZXNlcnZlUXVldWUoKQorCXsKKwkJcmV0dXJuKCBtUmVzZXJ2ZVF1ZXVlICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzUmVzZXJ2ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1SZXNlcnZlUXVldWUubm9uZW1wdHkoKSApOworCX0KKworCisJaW5saW5lIHZvaWQgdHJhY2VSZXNlcnZlKE91dFN0cmVhbSAmIG9zKQorCXsKKwkJdHJhY2VRdWV1ZShvcywgbVJlc2VydmVRdWV1ZSwgIkVYRUNVVElPTiBMQVNUIENIQU5DRSBRVUVVRSIpOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUZhaWxlZFF1ZXVlCisJICovCisJaW5saW5lIHZvaWQgYXBwZW5kRmFpbGVkKEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDKQorCXsKKwkJbUZhaWxlZFF1ZXVlLmFwcGVuZChhbkVDKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBhcHBlbmRGYWlsZWQoTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGxpc3RPZkVDKQorCXsKKwkJbUZhaWxlZFF1ZXVlLmFwcGVuZChsaXN0T2ZFQyk7CisJfQorCisJaW5saW5lIHZvaWQgc3BsaWNlRmFpbGVkKExpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBsaXN0T2ZFQykKKwl7CisJCW1GYWlsZWRRdWV1ZS5zcGxpY2UobGlzdE9mRUMpOworCX0KKworCWlubGluZSBMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgZ2V0RmFpbGVkUXVldWUoKQorCXsKKwkJcmV0dXJuKCBtRmFpbGVkUXVldWUgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNGYWlsZWQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRmFpbGVkUXVldWUubm9uZW1wdHkoKSApOworCX0KKworCisJaW5saW5lIHZvaWQgdHJhY2VGYWlsZWQoT3V0U3RyZWFtICYgb3MpCisJeworCQl0cmFjZVF1ZXVlKG9zLCBtRmFpbGVkUXVldWUsICJFWEVDVVRJT04gRkFJTEVEIFFVRVVFIik7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtUmVzdWx0UXVldWUKKwkgKi8KKwlpbmxpbmUgdm9pZCBhcHBlbmRSZXN1bHQoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpCisJeworCQltUmVzdWx0UXVldWUuYXBwZW5kKGFuRUMpOworCX0KKworCWlubGluZSB2b2lkIGFwcGVuZFJlc3VsdChMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgbGlzdE9mRUMpCisJeworCQltUmVzdWx0UXVldWUuYXBwZW5kKGxpc3RPZkVDKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzcGxpY2VSZXN1bHQoTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGxpc3RPZkVDKQorCXsKKwkJbVJlc3VsdFF1ZXVlLnNwbGljZShsaXN0T2ZFQyk7CisJfQorCisJaW5saW5lIExpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBnZXRSZXN1bHRRdWV1ZSgpCisJeworCQlyZXR1cm4oIG1SZXN1bHRRdWV1ZSApOworCX0KKworCWlubGluZSBib29sIGhhc1Jlc3VsdCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1SZXN1bHRRdWV1ZS5ub25lbXB0eSgpICk7CisJfQorCisKKwlpbmxpbmUgdm9pZCB0cmFjZVJlc3VsdChPdXRTdHJlYW0gJiBvcykKKwl7CisJCXRyYWNlUXVldWUob3MsIG1SZXN1bHRRdWV1ZSwgIkVYRUNVVElPTiBSRVNVTFQgUVVFVUUiKTsKKwl9CisKKworCisJLyoqCisJICogVFJBQ0UgUXVldWUKKwkgKi8KKwlzdGF0aWMgdm9pZCB0cmFjZVF1ZXVlKE91dFN0cmVhbSAmIG9zLCBMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgYVF1ZXVlLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTWVzc2FnZSk7CisKKworCS8qKgorCSAqIElIYW5kbGVyRXZlbnREZXN0cm95Q3R4IEFQSQorCSAqIERlc3Ryb3kgRXhlY3V0aW9uIENvbnRleHQKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCB2b2lkIGhhbmRsZUV2ZW50RGVzdHJveUN0eChFeGVjdXRpb25Db250ZXh0ICogYW5FQykKKwl7CisJCXJlbW92ZUZhaWxlZChhbkVDKTsKKwkJcmVtb3ZlSW5pdChhbkVDKTsKKwkJcmVtb3ZlV2FpdGluZyhhbkVDKTsKKwkJcmVtb3ZlUmVhZHkoYW5FQyk7CisJCXJlbW92ZVJlc2VydmUoYW5FQyk7CisJCXJlbW92ZVJlc3VsdChhbkVDKTsKKwl9CisKKwlpbmxpbmUgdm9pZCByZW1vdmVGYWlsZWQoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpCisJeworCQlnZXRGYWlsZWRRdWV1ZSgpLnJlbW92ZShhbkVDKTsKKwl9CisKKwlpbmxpbmUgdm9pZCByZW1vdmVJbml0KEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDKQorCXsKKwkJZ2V0SW5pdFF1ZXVlKCkucmVtb3ZlKGFuRUMpOworCX0KKworCWlubGluZSB2b2lkIHJlbW92ZVdhaXRpbmcoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpCisJeworCQltV2FpdGluZ1N0cmF0ZWd5LT5yZW1vdmUoYW5FQyk7CisJfQorCisJaW5saW5lIHZvaWQgcmVtb3ZlUmVhZHkoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpCisJeworCQlnZXRSZWFkeVF1ZXVlKCkucmVtb3ZlKGFuRUMpOworCX0KKworCWlubGluZSB2b2lkIHJlbW92ZVJlc2VydmUoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpCisJeworCQlnZXRSZXNlcnZlUXVldWUoKS5yZW1vdmUoYW5FQyk7CisJfQorCisJaW5saW5lIHZvaWQgcmVtb3ZlUmVzdWx0KEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDKQorCXsKKwkJZ2V0UmVzdWx0UXVldWUoKS5yZW1vdmUoYW5FQyk7CisJfQorCisKKworCisJLyoqCisJICogSEVVUklTVElDCisJICogQkxPQ0tfREZTIHN0cmF0ZWd5CisJICovCisJRXhlY3V0aW9uQ29udGV4dCAqIHBvcF9CTE9DS19ERlMoKTsKKwl2b2lkIHB1c2hfQkxPQ0tfREZTKEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDKTsKKwlib29sIHJlc2V0V2FpdGluZ19CTE9DSygpOworCisKKwkvKioKKwkgKiBIRVVSSVNUSUMKKwkgKiBCTE9DS19CRlMgc3RyYXRlZ3kKKwkgKi8KKwlFeGVjdXRpb25Db250ZXh0ICogcG9wX0JMT0NLX0JGUygpOworCXZvaWQgcHVzaF9CTE9DS19CRlMoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpOworCisKKwkvKioKKwkgKiBIRVVSSVNUSUMKKwkgKiBCTE9DS19CRlMgc3RyYXRlZ3kKKwkgKi8KKwlFeGVjdXRpb25Db250ZXh0ICogcG9wX0JMT0NLX1hGUygpOworCXZvaWQgcHVzaF9CTE9DS19YRlMoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpOworCisKKwkvKioKKwkgKiBIRVVSSVNUSUMKKwkgKiBPUkRFUiBzdHJhdGVneQorCSAqLworCUV4ZWN1dGlvbkNvbnRleHQgKiBwb3BfT1JERVIoKTsKKwl2b2lkIHB1c2hfT1JERVIoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpOworCisKKwkvKioKKwkgKiBIRVVSSVNUSUMKKwkgKiBUQVJHRVRfRk9STVVMQSBzdHJhdGVneQorCSAqLworCUV4ZWN1dGlvbkNvbnRleHQgKiBwb3BfVEFSR0VUX0ZPUk1VTEEoKTsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFBST0NFU1NPUiBSRVFVRVNUIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCS8qKgorCSAqIFNUT1AgIHwgUkVMRUFTRQorCSAqIFJFU0VUIHwgUkVTVEFSVCB8IENPTlRJTlVFCisJICogUkVRVUVVRV9XQUlUSU5HIHwgUkVRVUVVRV9SRVNFUlZFCisJICogSEVVUklTVElDIHwgR09BTF9BQ0hJRVZFRAorCSAqLworCWlubGluZSB2b2lkIGhhbmRsZVJlcXVlc3RTdG9wKCkKKwl7CisJCWNsZWFyUmVhZHkoKTsKKworCQljbGVhcldhaXRpbmcoKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBoYW5kbGVSZXF1ZXN0UmVsZWFzZSgpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCWlubGluZSB2b2lkIGhhbmRsZVJlcXVlc3RSZXNldCgpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlpbmxpbmUgdm9pZCBoYW5kbGVSZXF1ZXN0UmVzdGFydCgpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlpbmxpbmUgdm9pZCBoYW5kbGVSZXF1ZXN0Q29udGludWUoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwlpbmxpbmUgdm9pZCBoYW5kbGVSZXF1ZXN0UmVxdWV1ZVdhaXRpbmcoQWJzdHJhY3RQcm9jZXNzb3JVbml0ICogYVJlcXVlc3RvcikKKwl7CisJCW1XYWl0aW5nU3RyYXRlZ3ktPmhhbmRsZVJlcXVlc3RSZXF1ZXVlV2FpdGluZyhhUmVxdWVzdG9yKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBoYW5kbGVSZXF1ZXN0UmVxdWV1ZVJlc2VydmUoQWJzdHJhY3RQcm9jZXNzb3JVbml0ICogYVJlcXVlc3RvcikKKwl7CisJCW1XYWl0aW5nU3RyYXRlZ3ktPmhhbmRsZVJlcXVlc3RSZXF1ZXVlUmVzZXJ2ZShhUmVxdWVzdG9yLCBnZXRSZXNlcnZlUXVldWUoKSk7CisJfQorCisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJc3RkOjpzdHJpbmcgc3RyU3RyYXRlZ3koKSBjb25zdDsKKworCWlubGluZSB2b2lkIHRvU3RyZWFtV2FpdGluZyhPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCW1XYWl0aW5nU3RyYXRlZ3ktPnRvU3RyZWFtKG9zKTsKKwl9CisKKwl2aXJ0dWFsIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCisJdmlydHVhbCB2b2lkIHRvU3RyZWFtKGNvbnN0IExpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBhUXVldWUsIE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworfTsKKworCit9CisKKyNlbmRpZiAvKkVYRUNVVElPTlFVRVVFX0hfKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9xdWV1ZS9XYWl0aW5nQmFzaWNTdHJhdGVneS5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3F1ZXVlL1dhaXRpbmdCYXNpY1N0cmF0ZWd5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE4N2UzNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9xdWV1ZS9XYWl0aW5nQmFzaWNTdHJhdGVneS5oCkBAIC0wLDAgKzEsMjcxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTggZsOpdnIuIDIwMTMKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBXQUlUSU5HQkFTSUNTVFJBVEVHWV9IXworI2RlZmluZSBXQUlUSU5HQkFTSUNTVFJBVEVHWV9IXworCisjaW5jbHVkZSAiV2FpdGluZ1N0cmF0ZWd5LmgiCisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQUxMIFdBSVRJTkcgU1RSQVRFR1kKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit0ZW1wbGF0ZTwgY2xhc3MgQmFzaWNTdHJhdGVneSA+CitjbGFzcyBXYWl0aW5nQmFzaWNTdHJhdGVneUFMTCAgOiAgcHVibGljIEJhc2ljU3RyYXRlZ3kKK3sKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCVdhaXRpbmdCYXNpY1N0cmF0ZWd5QUxMKGF2bV91aW50OF90IHF1ZXVlQ291bnQgPSAxKQorCTogQmFzaWNTdHJhdGVneSggcXVldWVDb3VudCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+V2FpdGluZ0Jhc2ljU3RyYXRlZ3lBTEwoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gUE9QIFdBSVRJTkcgQkVIQVZJT1IgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJaW5saW5lIHZpcnR1YWwgdm9pZCBwb3BUbyhMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgYVJlYWR5UXVldWUpCisJeworCQlhUmVhZHlRdWV1ZS5zcGxpY2UoQmFzaWNTdHJhdGVneTo6bVF1ZXVlQ2FjaGUubm9uZW1wdHkoKSA/CisJCQkJQmFzaWNTdHJhdGVneTo6bVF1ZXVlQ2FjaGUgOiBCYXNpY1N0cmF0ZWd5OjptUXVldWUpOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgdm9pZCBwb3BUbyhhdm1fdWludDhfdCBhUXVldWVUYWJsZU9mZnNldCwKKwkJCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBhUmVhZHlRdWV1ZSkKKwl7CisJCWFSZWFkeVF1ZXVlLnNwbGljZSggQmFzaWNTdHJhdGVneTo6bVF1ZXVlVGFibGUKKwkJCQlbIChhUXVldWVUYWJsZU9mZnNldCA8IEJhc2ljU3RyYXRlZ3k6Om1RdWV1ZUNvdW50KSA/CisJCQkJYVF1ZXVlVGFibGVPZmZzZXQgOiBCYXNpY1N0cmF0ZWd5OjptUXVldWVDb3VudCBdICk7CisJfQorCisKK307CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBCRlMgPCBCUkVBRFRIX0ZJUlNUX1NFQVJDSCA+ICBXQUlUSU5HIFNUUkFURUdZCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY2xhc3MgV2FpdGluZ0Jhc2ljU3RyYXRlZ3lCRlMgOgorCQlwdWJsaWMgV2FpdGluZ1N0cmF0ZWd5SW1wbDwKKwkJCQlTdHJhdGVneVB1c2hCYWNrICwgQ2hpbGRJdGVyYXRvckZJRk8gLCBTdHJhdGVneVBvcEZyb250ID4KK3sKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCVdhaXRpbmdCYXNpY1N0cmF0ZWd5QkZTKGF2bV91aW50OF90IHF1ZXVlQ291bnQgPSAxKQorCTogV2FpdGluZ1N0cmF0ZWd5SW1wbCggcXVldWVDb3VudCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9Cit9OworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gREZTIDwgREVQVEhfRklSU1RfU0VBUkNIID4gIFdBSVRJTkcgU1RSQVRFR1kKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjbGFzcyBXYWl0aW5nQmFzaWNTdHJhdGVneURGUyA6CisJCXB1YmxpYyBXYWl0aW5nU3RyYXRlZ3lJbXBsPAorCQkJCVN0cmF0ZWd5UHVzaEJhY2sgLCBDaGlsZEl0ZXJhdG9yTElGTyAsIFN0cmF0ZWd5UG9wQmFjayA+Cit7CisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlXYWl0aW5nQmFzaWNTdHJhdGVneURGUyhhdm1fdWludDhfdCBxdWV1ZUNvdW50ID0gMSkKKwk6IFdhaXRpbmdTdHJhdGVneUltcGwoIHF1ZXVlQ291bnQgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorfTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFJGUyA8IFJBTkRPTV9GSVJTVF9TRUFSQ0ggPiBXQUlUSU5HIFNUUkFURUdZCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY2xhc3MgV2FpdGluZ0Jhc2ljU3RyYXRlZ3lSRlMgOgorCQlwdWJsaWMgV2FpdGluZ1N0cmF0ZWd5SW1wbDwKKwkJCQlTdHJhdGVneVB1c2hCYWNrICwgQ2hpbGRJdGVyYXRvckZJRk8gLCBTdHJhdGVneVBvcFJhbmRvbSA+Cit7CisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlXYWl0aW5nQmFzaWNTdHJhdGVneVJGUyhhdm1fdWludDhfdCBxdWV1ZUNvdW50ID0gMSkKKwk6IFdhaXRpbmdTdHJhdGVneUltcGwoIHF1ZXVlQ291bnQgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfldhaXRpbmdCYXNpY1N0cmF0ZWd5UkZTKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLy8gVU5ERUYgVE9QIEZPUiBSQU5ET00gQUNDRVNTCisJaW5saW5lIHZpcnR1YWwgRXhlY3V0aW9uQ29udGV4dCAqIHRvcCgpCisJeworCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCTw8ICJJbGxlZ2FsIGludm9jYXRpb24gb2YgIgorCQkJCQkiPDwgV2FpdGluZ0Jhc2ljU3RyYXRlZ3lBTEw6OnRvcCgpID4+ICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJcmV0dXJuKCBOVUxMICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgRXhlY3V0aW9uQ29udGV4dCAqIHRvcChhdm1fdWludDhfdCBhUXVldWVUYWJsZU9mZnNldCkKKwl7CisJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJPDwgIklsbGVnYWwgaW52b2NhdGlvbiBvZiAiCisJCQkJCSI8PCBXYWl0aW5nQmFzaWNTdHJhdGVneVJGUzo6dG9wKHF1ZXVlT2Zmc2V0KSA+PiAhISEiCisJCQkJPDwgU0VORF9FWElUOworCisJCXJldHVybiggTlVMTCApOworCX0KKworCWlubGluZSB2aXJ0dWFsIEV4ZWN1dGlvbkNvbnRleHQgKiB0b3BGcm9tKExpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBhUXVldWUpCisJeworCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCTw8ICJJbGxlZ2FsIGludm9jYXRpb24gb2YgIgorCQkJCQkiPDwgV2FpdGluZ0Jhc2ljU3RyYXRlZ3lSRlM6OnRvcEZyb20ocXVldWUpID4+ICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJcmV0dXJuKCBOVUxMICk7CisJfQorCit9OworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRklSU1QgIFdBSVRJTkcgU1RSQVRFR1kKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjbGFzcyBXYWl0aW5nQmFzaWNTdHJhdGVneUZJUlNUIDoKKwkJcHVibGljIFdhaXRpbmdTdHJhdGVneUltcGw8CisJCQkJU3RyYXRlZ3lQdXNoRnJvbnQgLCBDaGlsZEl0ZXJhdG9yTElGTyAsIFN0cmF0ZWd5UG9wRnJvbnQgPgoreworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJV2FpdGluZ0Jhc2ljU3RyYXRlZ3lGSVJTVChhdm1fdWludDhfdCBxdWV1ZUNvdW50ID0gMSkKKwk6IFdhaXRpbmdTdHJhdGVneUltcGwoIHF1ZXVlQ291bnQgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorfTsKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTEFTVCBXQUlUSU5HIFNUUkFURUdZCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY2xhc3MgV2FpdGluZ0Jhc2ljU3RyYXRlZ3lMQVNUIDoKKwkJcHVibGljIFdhaXRpbmdTdHJhdGVneUltcGw8CisJCQkJU3RyYXRlZ3lQdXNoQmFjayAsIENoaWxkSXRlcmF0b3JMSUZPICwgU3RyYXRlZ3lQb3BCYWNrID4KK3sKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCVdhaXRpbmdCYXNpY1N0cmF0ZWd5TEFTVChhdm1fdWludDhfdCBxdWV1ZUNvdW50ID0gMSkKKwk6IFdhaXRpbmdTdHJhdGVneUltcGwoIHF1ZXVlQ291bnQgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorfTsKKworCisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIE9SREVSICBXQUlUSU5HIFNUUkFURUdZCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY2xhc3MgV2FpdGluZ0Jhc2ljU3RyYXRlZ3lPUkRFUiA6CisJCXB1YmxpYyBXYWl0aW5nU3RyYXRlZ3lJbXBsPAorCQkJCVN0cmF0ZWd5UHVzaE9yZGVyICwgQ2hpbGRJdGVyYXRvckZJRk8gLCBTdHJhdGVneVBvcEZyb250ID4KK3sKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCVdhaXRpbmdCYXNpY1N0cmF0ZWd5T1JERVIoYXZtX3VpbnQ4X3QgcXVldWVDb3VudCA9IDEpCisJOiBXYWl0aW5nU3RyYXRlZ3lJbXBsKCBxdWV1ZUNvdW50ICkKKwl7CisJCS8vISEgTk9USElORworCX0KK307CisKKworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworI2VuZGlmIC8qIFdBSVRJTkdCQVNJQ1NUUkFURUdZX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vcXVldWUvV2FpdGluZ1N0cmF0ZWd5LmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vcXVldWUvV2FpdGluZ1N0cmF0ZWd5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIzZGM4ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9xdWV1ZS9XYWl0aW5nU3RyYXRlZ3kuaApAQCAtMCwwICsxLDc2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDEwIGbDqXZyLiAyMDEzCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRkFNX1FVRVVFX1dBSVRJTkdTVFJBVEVHWV9IXworI2RlZmluZSBGQU1fUVVFVUVfV0FJVElOR1NUUkFURUdZX0hfCisKKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vVHlwZWRlZi5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uQ29udGV4dC5oPgorCisjaW5jbHVkZSA8ZmFtL2FwaS9BYnN0cmFjdFByb2Nlc3NvclVuaXQuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworY2xhc3MgQWJzdHJhY3RQcm9jZXNzb3JVbml0OworCitjbGFzcyBFeGVjdXRpb25Db250ZXh0OworCitjbGFzcyBUYXJnZXRGaWx0ZXI7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBQlNUUkFDVCBXQUlUSU5HIFNUUkFURUdZCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY2xhc3MgV2FpdGluZ1N0cmF0ZWd5Cit7CisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBBVFRSSUJVVEVTCisJICovCisJLy8gbGVzIGNvbnRleHRlcyBxdWkgYXR0ZW5kZW50IHNhZ2VtZW50IHF1J29uIHMnaW50w6lyZXNzZSDDoCBldXggcG91ciBwYXNzZXIKKwkvLyBsJ2F1ZGl0aW9uIGNvbmR1aXNhbnQgw6AgbCdleMOpY3V0aW9uICEhISEhCisJYXZtX3VpbnQ4X3QgbVF1ZXVlQ291bnQ7CisJTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAqIG1RdWV1ZVRhYmxlOworCWF2bV91aW50OF90IHRPZmZzZXQ7CisKKwlzdGF0aWMgY29uc3QgYXZtX3VpbnQ4X3QgUVVFVUVfQ0FDSEUgPSAwOworCXN0YXRpYyBjb25zdCBhdm1fdWludDhfdCBRVUVVRV9PVEhFUiA9IDE7CisKKwlMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgbVF1ZXVlQ2FjaGU7CisJTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIG1RdWV1ZTsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJV2FpdGluZ1N0cmF0ZWd5KGF2bV91aW50OF90IHF1ZXVlQ291bnQgPSAxKQorCTogLy9tV2FpdGluZ0Jhc2ljU3RyYXRlZ3koIE5VTEwgKSwKKwltUXVldWVDb3VudCggcXVldWVDb3VudCApLAorCW1RdWV1ZVRhYmxlKCBuZXcgTGlzdE9mRXhlY3V0aW9uQ29udGV4dFttUXVldWVDb3VudCArIDFdICksCisJdE9mZnNldCggMCApLAorCisJbVF1ZXVlQ2FjaGUoIG1RdWV1ZVRhYmxlW1FVRVVFX0NBQ0hFXSApLAorCW1RdWV1ZSggbVF1ZXVlVGFibGVbUVVFVUVfT1RIRVJdICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5XYWl0aW5nU3RyYXRlZ3koKQorCXsKKwkJZGVsZXRlKCBtUXVldWVUYWJsZSApOworCX0KKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIFRhcmdldCBGaWx0ZXIKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCBUYXJnZXRGaWx0ZXIgKiBnZXRUYXJnZXRGaWx0ZXIoKQorCXsKKwkJcmV0dXJuKCBOVUxMICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgYm9vbCBoYXNUYXJnZXRGaWx0ZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgc2V0VGFyZ2V0RmlsdGVyKFRhcmdldEZpbHRlciAqIGFUYXJnZXRGaWx0ZXIpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1RdWV1ZVRhYmxlCisJICovCisJaW5saW5lIHZvaWQgY2xlYXJRdWV1ZVRhYmxlKCkKKwl7CisJCWZvciggdE9mZnNldCA9IDAgOyB0T2Zmc2V0IDw9IG1RdWV1ZUNvdW50IDsgKyt0T2Zmc2V0ICkKKwkJeworCQkJaWYoIG1RdWV1ZVRhYmxlWyB0T2Zmc2V0IF0ubm9uZW1wdHkoKSApCisJCQl7CisJCQkJbVF1ZXVlVGFibGVbIHRPZmZzZXQgXS5jbGVhcigpOworCQkJfQorCQl9CisJfQorCisKKwlpbmxpbmUgTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAqIGdldFF1ZXVlVGFibGUoKQorCXsKKwkJcmV0dXJuKCBtUXVldWVUYWJsZSApOworCX0KKworCWlubGluZSB2b2lkIGdldFF1ZXVlVGFibGUoTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGxpc3RPZkVDKQorCXsKKwkJZm9yKCB0T2Zmc2V0ID0gMCA7IHRPZmZzZXQgPD0gbVF1ZXVlQ291bnQgOyArK3RPZmZzZXQgKQorCQl7CisJCQlpZiggbVF1ZXVlVGFibGVbIHRPZmZzZXQgXS5ub25lbXB0eSgpICkKKwkJCXsKKwkJCQlsaXN0T2ZFQy5hcHBlbmQoIG1RdWV1ZVRhYmxlWyB0T2Zmc2V0IF0gKTsKKwkJCX0KKwkJfQorCX0KKworCisJaW5saW5lIHZvaWQgc3BsaWNlUXVldWVUYWJsZShMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgbGlzdE9mRUMpCisJeworCQlmb3IoIHRPZmZzZXQgPSAwIDsgdE9mZnNldCA8PSBtUXVldWVDb3VudCA7ICsrdE9mZnNldCApCisJCXsKKwkJCWlmKCBtUXVldWVUYWJsZVsgdE9mZnNldCBdLm5vbmVtcHR5KCkgKQorCQkJeworCQkJCWxpc3RPZkVDLnNwbGljZSggbVF1ZXVlVGFibGVbIHRPZmZzZXQgXSApOworCQkJfQorCQl9CisJfQorCisJaW5saW5lIHZvaWQgc3BsaWNlUXVldWVUYWJsZSgKKwkJCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBsaXN0T2ZFQywgYXZtX3VpbnQ4X3QgdE9mZnNldE1heCkKKwl7CisJCWlmKCB0T2Zmc2V0TWF4ID4gbVF1ZXVlQ291bnQgKQorCQl7CisJCQl0T2Zmc2V0TWF4ID0gbVF1ZXVlQ291bnQ7CisJCX0KKwkJZm9yKCB0T2Zmc2V0ID0gMCA7IHRPZmZzZXQgPD0gdE9mZnNldE1heCA7ICsrdE9mZnNldCApCisJCXsKKwkJCWlmKCBtUXVldWVUYWJsZVsgdE9mZnNldCBdLm5vbmVtcHR5KCkgKQorCQkJeworCQkJCWxpc3RPZkVDLnNwbGljZSggbVF1ZXVlVGFibGVbIHRPZmZzZXQgXSApOworCQkJfQorCQl9CisJfQorCisKKwlpbmxpbmUgYXZtX3VpbnQ4X3Qgc3BsaWNlUHJpb3JRdWV1ZVRhYmxlKExpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBsaXN0T2ZFQykKKwl7CisJCWZvciggdE9mZnNldCA9IDAgOyB0T2Zmc2V0IDw9IG1RdWV1ZUNvdW50IDsgKyt0T2Zmc2V0ICkKKwkJeworCQkJaWYoIG1RdWV1ZVRhYmxlWyB0T2Zmc2V0IF0ubm9uZW1wdHkoKSApCisJCQl7CisJCQkJbGlzdE9mRUMuc3BsaWNlKCBtUXVldWVUYWJsZVsgdE9mZnNldCBdICk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlyZXR1cm4oIHRPZmZzZXQgKTsKKwl9CisKKwlpbmxpbmUgYXZtX3VpbnQ4X3Qgc3BsaWNlUHJpb3JRdWV1ZVRhYmxlKExpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBsaXN0T2ZFQywKKwkJCWF2bV91aW50OF90IGFuT2Zmc2V0TWluLCBhdm1fdWludDhfdCB0T2Zmc2V0TWF4KQorCXsKKwkJZm9yKCB0T2Zmc2V0ID0gYW5PZmZzZXRNaW4gOyB0T2Zmc2V0IDw9IHRPZmZzZXRNYXggOyArK3RPZmZzZXQgKQorCQl7CisKKwkJCWlmKCBtUXVldWVUYWJsZVsgdE9mZnNldCBdLm5vbmVtcHR5KCkgKQorCQkJeworCQkJCWxpc3RPZkVDLnNwbGljZSggbVF1ZXVlVGFibGVbIHRPZmZzZXQgXSApOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJcmV0dXJuKCB0T2Zmc2V0ICk7CisJfQorCisKKwlpbmxpbmUgdm9pZCBjbGVhclF1ZXVlKCkKKwl7CisJCW1RdWV1ZS5jbGVhcigpOworCX0KKworCWlubGluZSBMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgZ2V0UXVldWUoKQorCXsKKwkJcmV0dXJuKCBtUXVldWUgKTsKKwl9CisKKworCWlubGluZSB2b2lkIGNsZWFyQ2FjaGUoKQorCXsKKwkJbVF1ZXVlQ2FjaGUuY2xlYXIoKTsKKwl9CisKKwlpbmxpbmUgTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGdldENhY2hlKCkKKwl7CisJCXJldHVybiggbVF1ZXVlQ2FjaGUgKTsKKwl9CisKKworCWlubGluZSBib29sIGhhc1dhaXRpbmcoKQorCXsKKwkJZm9yKCB0T2Zmc2V0ID0gMCA7IHRPZmZzZXQgPD0gbVF1ZXVlQ291bnQgOyArK3RPZmZzZXQgKQorCQl7CisJCQlpZiggbVF1ZXVlVGFibGVbIHRPZmZzZXQgXS5ub25lbXB0eSgpICkKKwkJCXsKKwkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNXYWl0aW5nKGF2bV91aW50OF90IHRPZmZzZXRNYXgpCisJeworCQlmb3IoIHRPZmZzZXQgPSAwIDsgdE9mZnNldCA8PSB0T2Zmc2V0TWF4IDsgKyt0T2Zmc2V0ICkKKwkJeworCQkJaWYoIG1RdWV1ZVRhYmxlWyB0T2Zmc2V0IF0ubm9uZW1wdHkoKSApCisJCQl7CisJCQkJcmV0dXJuKCB0cnVlICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisKKwlpbmxpbmUgYXZtX3NpemVfdCBzaXplV2FpdGluZygpIGNvbnN0CisJeworCQlhdm1fc2l6ZV90IHdzaXplID0gMDsKKwkJZm9yKCBhdm1fc2l6ZV90IHRPZmZzZXQgPSAwIDsgdE9mZnNldCA8PSBtUXVldWVDb3VudCA7ICsrdE9mZnNldCApCisJCXsKKwkJCWlmKCBtUXVldWVUYWJsZVsgdE9mZnNldCBdLm5vbmVtcHR5KCkgKQorCQkJeworCQkJCXdzaXplICs9IG1RdWV1ZVRhYmxlWyB0T2Zmc2V0IF0uc2l6ZSgpOworCQkJfQorCQl9CisKKwkJcmV0dXJuKCB3c2l6ZSApOworCX0KKworCWlubGluZSB2b2lkIHJlbW92ZShFeGVjdXRpb25Db250ZXh0ICogYW5FQykKKwl7CisJCWZvciggdE9mZnNldCA9IDAgOyB0T2Zmc2V0IDw9IG1RdWV1ZUNvdW50IDsgKyt0T2Zmc2V0ICkKKwkJeworCQkJaWYoIG1RdWV1ZVRhYmxlWyB0T2Zmc2V0IF0ubm9uZW1wdHkoKSApCisJCQl7CisJCQkJbVF1ZXVlVGFibGVbIHRPZmZzZXQgXS5yZW1vdmUoYW5FQyk7CisJCQl9CisJCX0KKwl9CisKKworCWlubGluZSB2b2lkIHRyYWNlUXVldWUoY29uc3QgTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGFRdWV1ZSwKKwkJCU91dFN0cmVhbSAmIG9zLCBjb25zdCBzdGQ6OnN0cmluZyAmIGFNZXNzYWdlKQorCXsKKwkJb3MgPDwgVEFCIDw8IGFNZXNzYWdlIDw8ICIgPDwgc2l6ZSA6ICIgPDwgYVF1ZXVlLnNpemUoKSA8PCAiID4+ICIKKwkJCQk8PCBFT0xfSU5DUl9JTkRFTlQ7CisKKwkJTGlzdE9mRXhlY3V0aW9uQ29udGV4dDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBhUXVldWUuYmVnaW4oKTsKKwkJTGlzdE9mRXhlY3V0aW9uQ29udGV4dDo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBhUXVldWUuZW5kKCk7CisJCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQorCQl7CisJCQkoKml0KS0+dHJhY2VEZWZhdWx0KG9zKTsKKwkJfQorCQlvcyA8PCBERUNSX0lOREVOVDsKKwl9CisKKwlpbmxpbmUgdm9pZCB0cmFjZShPdXRTdHJlYW0gJiBvcywgY29uc3Qgc3RkOjpzdHJpbmcgJiBhTWVzc2FnZSkKKwl7CisJCWZvciggYXZtX3NpemVfdCB0T2Zmc2V0ID0gMCA7IHRPZmZzZXQgPD0gbVF1ZXVlQ291bnQgOyArK3RPZmZzZXQgKQorCQl7CisJCQlpZiggbVF1ZXVlVGFibGVbIHRPZmZzZXQgXS5ub25lbXB0eSgpICkKKwkJCXsKKwkJCQl0cmFjZVF1ZXVlKG1RdWV1ZVRhYmxlWyB0T2Zmc2V0IF0sIG9zLAorCQkJCQkJT1NTKCkgPDwgYU1lc3NhZ2UgPDwgJ1snIDw8IHRPZmZzZXQgPDwgJ10nKTsKKwkJCX0KKwkJfQorCX0KKworCWlubGluZSB2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJb3MgPDwgVEFCIDw8ICJ3YWl0aW5nPCBzaXplOiAiIDw8IHNpemVXYWl0aW5nKCkgPDwgIiA+OiIKKwkJCQk8PCBFT0xfSU5DUl9JTkRFTlQ7CisKKwkJZm9yKCBhdm1fc2l6ZV90IHRPZmZzZXQgPSAwIDsgdE9mZnNldCA8PSBtUXVldWVDb3VudCA7ICsrdE9mZnNldCApCisJCXsKKwkJCWlmKCBtUXVldWVUYWJsZVsgdE9mZnNldCBdLm5vbmVtcHR5KCkgKQorCQkJeworCQkJCW9zIDw8IFRBQjIgPDwgInRhYmxlPCB3ZWlnaHQ6IiA8PCB0T2Zmc2V0CisJCQkJCQk8PCAiICwgc2l6ZToiIDw8IG1RdWV1ZVRhYmxlWyB0T2Zmc2V0IF0uc2l6ZSgpCisJCQkJCQk8PCAiID46IiA8PCBFT0xfSU5DUl9JTkRFTlQ7CisJCQkJdG9TdHJlYW0obVF1ZXVlVGFibGVbIHRPZmZzZXQgXSwgb3MpOworCQkJCW9zIDw8IERFQ1JfSU5ERU5UOworCQkJfQorCQl9CisJCW9zIDw8IERFQ1JfSU5ERU5UOworCX0KKworCWlubGluZSB2b2lkIHRvU3RyZWFtKAorCQkJY29uc3QgTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGFRdWV1ZSwgT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQlMaXN0T2ZFeGVjdXRpb25Db250ZXh0Ojpjb25zdF9pdGVyYXRvciBpdEVDID0gYVF1ZXVlLmJlZ2luKCk7CisJCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQ6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gYVF1ZXVlLmVuZCgpOworCQlmb3IoIDsgaXRFQyAhPSBpdEVuZCA7ICsraXRFQyApCisJCXsKKwkJCSgqaXRFQyktPnRyYWNlRGVmYXVsdChvcyk7CisKKwkJfQorCX0KKworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gUFVTSCBXQUlUSU5HIEJFSEFWSU9SIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCS8qKgorCSAqIFBVU0gKKwkgKi8KKwl2aXJ0dWFsIHZvaWQgcHVzaChFeGVjdXRpb25Db250ZXh0ICogYW5FQykgPSAwOworCisJaW5saW5lIHZpcnR1YWwgdm9pZCBwdXNoKGNvbnN0IExpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBsaXN0b2ZFQykKKwl7CisJCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQ6OmNvbnN0X2l0ZXJhdG9yIGl0RUMgPSBsaXN0b2ZFQy5iZWdpbigpOworCQlMaXN0T2ZFeGVjdXRpb25Db250ZXh0Ojpjb25zdF9pdGVyYXRvciBlbmRFQyA9IGxpc3RvZkVDLmVuZCgpOworCQlmb3IoIDsgaXRFQyAhPSBlbmRFQyA7ICsraXRFQyApCisJCXsKKwkJCXB1c2goICppdEVDICk7CisJCX0KKwl9CisKKwl2aXJ0dWFsIHZvaWQgcHVzaChhdm1fdWludDhfdCBhUXVldWVUYWJsZU9mZnNldCwKKwkJCUV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDKSA9IDA7CisKKwl2aXJ0dWFsIHZvaWQgcHVzaChMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgYVF1ZXVlLAorCQkJRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpID0gMDsKKworCisJaW5saW5lIHZpcnR1YWwgdm9pZCBwdXNoQ2FjaGUoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpCisJeworCQlwdXNoKG1RdWV1ZUNhY2hlLCBhbkVDKTsKKwl9CisKKwkvKioKKwkgKiBTUExJQ0UKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCB2b2lkIHNwbGljZShXYWl0aW5nU3RyYXRlZ3kgJiBhV2FpdGluZ1N0cmF0ZWd5KQorCXsKKwkJZm9yKCB0T2Zmc2V0ID0gMCA7IHRPZmZzZXQgPD0gYVdhaXRpbmdTdHJhdGVneS5tUXVldWVDb3VudCA7ICsrdE9mZnNldCApCisJCXsKKwkJCXB1c2goIGFXYWl0aW5nU3RyYXRlZ3kubVF1ZXVlVGFibGVbIHRPZmZzZXQgXSApOworCQl9CisKKwkJYVdhaXRpbmdTdHJhdGVneS5jbGVhclF1ZXVlVGFibGUoKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHNwbGljZShhdm1fdWludDhfdCBhUXVldWVUYWJsZU9mZnNldCwKKwkJCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBsaXN0b2ZFQykKKwl7CisJCW1RdWV1ZVRhYmxlWyAoYVF1ZXVlVGFibGVPZmZzZXQgPCBtUXVldWVDb3VudCkgPworCQkJCWFRdWV1ZVRhYmxlT2Zmc2V0IDogbVF1ZXVlQ291bnQgXS5zcGxpY2UoIGxpc3RvZkVDICk7CisJfQorCisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBQVVNII0NISUxEIFdBSVRJTkcgQkVIQVZJT1IgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJdmlydHVhbCB2b2lkIHB1c2hDaGlsZChjb25zdCBMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgY2hpbGRFQykgPSAwOworCisJdmlydHVhbCB2b2lkIHB1c2hDaGlsZChhdm1fdWludDhfdCBhUXVldWVUYWJsZU9mZnNldCwKKwkJCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBjaGlsZEVDKSA9IDA7CisKKwl2aXJ0dWFsIHZvaWQgcHVzaENoaWxkKExpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBhUXVldWUsCisJCQlMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgY2hpbGRFQykgPSAwOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gUE9QIFdBSVRJTkcgQkVIQVZJT1IgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJdmlydHVhbCBFeGVjdXRpb25Db250ZXh0ICogcG9wKCkgPSAwOworCisJdmlydHVhbCB2b2lkIHBvcFRvKExpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBhUmVhZHlRdWV1ZSkgPSAwOworCisJdmlydHVhbCBFeGVjdXRpb25Db250ZXh0ICogcG9wKGF2bV91aW50OF90IGFRdWV1ZVRhYmxlT2Zmc2V0KSA9IDA7CisKKwl2aXJ0dWFsIHZvaWQgcG9wVG8oYXZtX3VpbnQ4X3QgYVF1ZXVlVGFibGVPZmZzZXQsCisJCQlMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgYVJlYWR5UXVldWUpID0gMDsKKworCXZpcnR1YWwgRXhlY3V0aW9uQ29udGV4dCAqIHBvcEZyb20oTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGFRdWV1ZSkgPSAwOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gVE9QIFdBSVRJTkcgQkVIQVZJT1IgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJdmlydHVhbCBFeGVjdXRpb25Db250ZXh0ICogdG9wKCkgPSAwOworCisJdmlydHVhbCBFeGVjdXRpb25Db250ZXh0ICogdG9wKGF2bV91aW50OF90IGFRdWV1ZVRhYmxlT2Zmc2V0KSA9IDA7CisKKwl2aXJ0dWFsIEV4ZWN1dGlvbkNvbnRleHQgKiB0b3BGcm9tKExpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBhUXVldWUpID0gMDsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFJFUVVFVUUgUkVRVUVTVCAgV0FJVElORyBCRUhBVklPUiBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIGhhbmRsZVJlcXVlc3RSZXF1ZXVlV2FpdGluZygKKwkJCUFic3RyYWN0UHJvY2Vzc29yVW5pdCAqIGFSZXF1ZXN0b3IpCisJeworCQlhUmVxdWVzdG9yLT5oYW5kbGVSZXF1ZXN0UmVxdWV1ZVdhaXRpbmdUYWJsZSgoKnRoaXMpLCAwLCBtUXVldWVDb3VudCk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCBoYW5kbGVSZXF1ZXN0UmVxdWV1ZVJlc2VydmUoCisJCQlBYnN0cmFjdFByb2Nlc3NvclVuaXQgKiBhUmVxdWVzdG9yLAorCQkJTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGFSZXNlcnZlUXVldWUpCisJeworCQlhUmVxdWVzdG9yLT5oYW5kbGVSZXF1ZXN0UmVxdWV1ZVJlc2VydmVUYWJsZSgKKwkJCQkoKnRoaXMpLCBhUmVzZXJ2ZVF1ZXVlLCAwLCBtUXVldWVDb3VudCApOworCX0KKworfTsKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBCQVNJQyBTVFJBVEVHWSBQVVNICisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdHJ1Y3QgU3RyYXRlZ3lQdXNoQmFjaworeworCWlubGluZSBzdGF0aWMgdm9pZCBwdXNoKExpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBhUXVldWUsCisJCQlFeGVjdXRpb25Db250ZXh0ICogYW5FQykKKwl7CisJCWFRdWV1ZS5wdXNoX2JhY2soIGFuRUMgKTsKKwl9Cit9OworCitzdHJ1Y3QgU3RyYXRlZ3lQdXNoRnJvbnQKK3sKKwlpbmxpbmUgc3RhdGljIHZvaWQgcHVzaChMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgYVF1ZXVlLAorCQkJRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpCisJeworCQlhUXVldWUucHVzaF9mcm9udCggYW5FQyApOworCX0KK307CisKK3N0cnVjdCBTdHJhdGVneVB1c2hPcmRlcgoreworCWlubGluZSBzdGF0aWMgdm9pZCBwdXNoKExpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBhUXVldWUsCisJCQlFeGVjdXRpb25Db250ZXh0ICogYW5FQykKKwl7CisJCWF2bV91aW50OF90IHdlaWdodCA9IGFuRUMtPmdldFdlaWdodCgpOworCisJCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQ6Oml0ZXJhdG9yIGl0RUMgPSBhUXVldWUuYmVnaW4oKTsKKwkJTGlzdE9mRXhlY3V0aW9uQ29udGV4dDo6aXRlcmF0b3IgaXRFbmQgPSBhUXVldWUuZW5kKCk7CisJCWZvciggOyBpdEVDICE9IGl0RW5kIDsgKytpdEVDICkKKwkJeworCQkJaWYoICgqaXRFQyktPmdldFdlaWdodCgpID49IHdlaWdodCApCisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJYVF1ZXVlLmluc2VydCggaXRFQyAsIGFuRUMpOworCX0KK307CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEJBU0lDIFNUUkFURUdZIFBVU0ggZm9yIENISUxECisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdHJ1Y3QgQ2hpbGRJdGVyYXRvckZJRk8KK3sKKwl0eXBlZGVmIExpc3RPZkV4ZWN1dGlvbkNvbnRleHQ6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2NoaWxkX2l0ZXJhdG9yOworCisJaW5saW5lIHN0YXRpYyBjb25zdF9jaGlsZF9pdGVyYXRvciBiZWdpbl9jaGlsZCgKKwkJCWNvbnN0IExpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBjaGlsZEVDKQorCXsKKwkJcmV0dXJuKCBjaGlsZEVDLmJlZ2luKCkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIGNvbnN0X2NoaWxkX2l0ZXJhdG9yIGVuZF9jaGlsZCgKKwkJCWNvbnN0IExpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBjaGlsZEVDKQorCXsKKwkJcmV0dXJuKCBjaGlsZEVDLmVuZCgpICk7CisJfQorfTsKKworCitzdHJ1Y3QgQ2hpbGRJdGVyYXRvckxJRk8KK3sKKwl0eXBlZGVmIExpc3RPZkV4ZWN1dGlvbkNvbnRleHQ6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY29uc3RfY2hpbGRfaXRlcmF0b3I7CisKKwlpbmxpbmUgc3RhdGljIGNvbnN0X2NoaWxkX2l0ZXJhdG9yIGJlZ2luX2NoaWxkKAorCQkJY29uc3QgTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGNoaWxkRUMpCisJeworCQlyZXR1cm4oIGNoaWxkRUMucmJlZ2luKCkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIGNvbnN0X2NoaWxkX2l0ZXJhdG9yIGVuZF9jaGlsZCgKKwkJCWNvbnN0IExpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBjaGlsZEVDKQorCXsKKwkJcmV0dXJuKCBjaGlsZEVDLnJlbmQoKSApOworCX0KK307CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEJBU0lDIFNUUkFURUdZIFBPUAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RydWN0IFN0cmF0ZWd5UG9wQmFjaworeworCWlubGluZSBzdGF0aWMgRXhlY3V0aW9uQ29udGV4dCAqIHBvcEZyb20oTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGFRdWV1ZSkKKwl7CisJCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggYVF1ZXVlLm5vbmVtcHR5KCkgKQorCQkJCTw8ICJVbmV4cGVjdGVkIGFuIGVtcHR5IGV4ZWN1dGlvbiBRdWV1ZSAhISEiCisJCQkJPDwgU0VORF9FWElUOworCisJCXJldHVybiggYVF1ZXVlLnBvcF9sYXN0KCkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIEV4ZWN1dGlvbkNvbnRleHQgKiB0b3BGcm9tKExpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBhUXVldWUpCisJeworCQlpZiggYVF1ZXVlLm5vbmVtcHR5KCkgKQorCQl7CisJCQlyZXR1cm4oIGFRdWV1ZS5sYXN0KCkgKTsKKwkJfQorCisJCXJldHVybiggTlVMTCApOworCX0KKworfTsKKworc3RydWN0IFN0cmF0ZWd5UG9wRnJvbnQKK3sKKwlpbmxpbmUgc3RhdGljIEV4ZWN1dGlvbkNvbnRleHQgKiBwb3BGcm9tKExpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBhUXVldWUpCisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoIGFRdWV1ZS5ub25lbXB0eSgpICkKKwkJCQk8PCAiVW5leHBlY3RlZCBhbiBlbXB0eSBleGVjdXRpb24gUXVldWUgISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQlyZXR1cm4oIGFRdWV1ZS5wb3BfZmlyc3QoKSApOworCX0KKworCWlubGluZSBzdGF0aWMgRXhlY3V0aW9uQ29udGV4dCAqIHRvcEZyb20oTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGFRdWV1ZSkKKwl7CisJCWlmKCBhUXVldWUubm9uZW1wdHkoKSApCisJCXsKKwkJCXJldHVybiggYVF1ZXVlLmZpcnN0KCkgKTsKKwkJfQorCQlyZXR1cm4oIE5VTEwgKTsKKwl9CisKK307CisKKworc3RydWN0IFN0cmF0ZWd5UG9wUmFuZG9tCit7CisJaW5saW5lIHN0YXRpYyBFeGVjdXRpb25Db250ZXh0ICogcG9wRnJvbShMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgYVF1ZXVlKQorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKCBhUXVldWUubm9uZW1wdHkoKSApCisJCQkJPDwgIlVuZXhwZWN0ZWQgYW4gZW1wdHkgZXhlY3V0aW9uIFF1ZXVlICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJcmV0dXJuKCBhUXVldWUucG9wX2luZGV4KFJBTkRPTTo6Z2VuX3VpbnQoMCwgYVF1ZXVlLnNpemUoKSAtIDEpKSApOworCX0KKworCWlubGluZSBzdGF0aWMgRXhlY3V0aW9uQ29udGV4dCAqIHRvcEZyb20oTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGFRdWV1ZSkKKwl7CisJCXJldHVybiggTlVMTCApOworCX0KKworfTsKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQUJTVFJBQ1QgV0FJVElORyBTVFJBVEVHWQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3RlbXBsYXRlPCBjbGFzcyBTdHJhdGVneVB1c2ggLCBjbGFzcyBDaGlsZEl0ZXJhdG9yICwgY2xhc3MgU3RyYXRlZ3lQb3AgPgorY2xhc3MgV2FpdGluZ1N0cmF0ZWd5SW1wbCA6CisJCXB1YmxpYyBXYWl0aW5nU3RyYXRlZ3ksCisJCXB1YmxpYyBDaGlsZEl0ZXJhdG9yCit7CisKK3B1YmxpYzoKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCVdhaXRpbmdTdHJhdGVneUltcGwoYXZtX3VpbnQ4X3QgcXVldWVDb3VudCA9IDEpCisJOiBXYWl0aW5nU3RyYXRlZ3koIHF1ZXVlQ291bnQgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfldhaXRpbmdTdHJhdGVneUltcGwoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gUFVTSCBXQUlUSU5HIEJFSEFWSU9SIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCS8qKgorCSAqIFBVU0gKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCB2b2lkIHB1c2goRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpCisJeworCQlwdXNoKCBtUXVldWUgLCBhbkVDICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCBwdXNoKGF2bV91aW50OF90IGFRdWV1ZVRhYmxlT2Zmc2V0LAorCQkJRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpCisJeworCQlwdXNoKCBtUXVldWVUYWJsZVsgKGFRdWV1ZVRhYmxlT2Zmc2V0IDwgbVF1ZXVlQ291bnQpID8KKwkJCQlhUXVldWVUYWJsZU9mZnNldCA6IG1RdWV1ZUNvdW50IF0gLCBhbkVDICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCBwdXNoKExpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBhUXVldWUsCisJCQlFeGVjdXRpb25Db250ZXh0ICogYW5FQykKKwl7CisJCVN0cmF0ZWd5UHVzaDo6cHVzaCggYVF1ZXVlICwgYW5FQyApOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFBVU0gjQ0hJTEQgV0FJVElORyBCRUhBVklPUiBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwl0eXBlbmFtZSBDaGlsZEl0ZXJhdG9yOjpjb25zdF9jaGlsZF9pdGVyYXRvciBpdEVDOworCXR5cGVuYW1lIENoaWxkSXRlcmF0b3I6OmNvbnN0X2NoaWxkX2l0ZXJhdG9yIGl0RW5kOworCisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHB1c2hDaGlsZChjb25zdCBMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgY2hpbGRFQykKKwl7CisJCWl0RUMgPSBDaGlsZEl0ZXJhdG9yOjpiZWdpbl9jaGlsZCggY2hpbGRFQyApOworCQlpdEVuZCA9IENoaWxkSXRlcmF0b3I6OmVuZF9jaGlsZCggY2hpbGRFQyApOworCQlmb3IoIDsgaXRFQyAhPSBpdEVuZCA7ICsraXRFQyApCisJCXsKKwkJCXB1c2goICppdEVDICk7CisJCX0KKwl9CisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHB1c2hDaGlsZChhdm1fdWludDhfdCBhUXVldWVUYWJsZU9mZnNldCwKKwkJCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBjaGlsZEVDKQorCXsKKwkJaXRFQyA9IENoaWxkSXRlcmF0b3I6OmJlZ2luX2NoaWxkKCBjaGlsZEVDICk7CisJCWl0RW5kID0gQ2hpbGRJdGVyYXRvcjo6ZW5kX2NoaWxkKCBjaGlsZEVDICk7CisJCWZvciggOyBpdEVDICE9IGl0RW5kIDsgKytpdEVDICkKKwkJeworCQkJcHVzaCggYVF1ZXVlVGFibGVPZmZzZXQgLCAqaXRFQyApOworCQl9CisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCBwdXNoQ2hpbGQoTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGFRdWV1ZSwKKwkJCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBjaGlsZEVDKQorCXsKKwkJaXRFQyA9IENoaWxkSXRlcmF0b3I6OmJlZ2luX2NoaWxkKCBjaGlsZEVDICk7CisJCWl0RW5kID0gQ2hpbGRJdGVyYXRvcjo6ZW5kX2NoaWxkKCBjaGlsZEVDICk7CisJCWZvciggOyBpdEVDICE9IGl0RW5kIDsgKytpdEVDICkKKwkJeworCQkJcHVzaCggYVF1ZXVlICwgKml0RUMgKTsKKwkJfQorCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFBPUCBXQUlUSU5HIEJFSEFWSU9SIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlubGluZSB2aXJ0dWFsIEV4ZWN1dGlvbkNvbnRleHQgKiBwb3AoKQorCXsKKwkJcmV0dXJuKCBwb3BGcm9tKG1RdWV1ZUNhY2hlLm5vbmVtcHR5KCkgPyBtUXVldWVDYWNoZSA6IG1RdWV1ZSkgKTsKKwl9CisKKwl2aXJ0dWFsIHZvaWQgcG9wVG8oTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGFSZWFkeVF1ZXVlKQorCXsKKwkJYVJlYWR5UXVldWUuYXBwZW5kKCBwb3AoKSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIEV4ZWN1dGlvbkNvbnRleHQgKiBwb3AoYXZtX3VpbnQ4X3QgYVF1ZXVlVGFibGVPZmZzZXQpCisJeworCQlyZXR1cm4oIHBvcEZyb20oIG1RdWV1ZVRhYmxlWyAoYVF1ZXVlVGFibGVPZmZzZXQgPCBtUXVldWVDb3VudCkgPworCQkJCWFRdWV1ZVRhYmxlT2Zmc2V0IDogbVF1ZXVlQ291bnQgXSApICk7CisJfQorCisJdmlydHVhbCB2b2lkIHBvcFRvKGF2bV91aW50OF90IGFRdWV1ZVRhYmxlT2Zmc2V0LAorCQkJTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGFSZWFkeVF1ZXVlKQorCXsKKwkJYVJlYWR5UXVldWUuYXBwZW5kKCBwb3AoYVF1ZXVlVGFibGVPZmZzZXQpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgRXhlY3V0aW9uQ29udGV4dCAqIHBvcEZyb20oTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGFRdWV1ZSkKKwl7CisJCXJldHVybiggU3RyYXRlZ3lQb3A6OnBvcEZyb20oIGFRdWV1ZSApICk7CisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gVE9QIFdBSVRJTkcgQkVIQVZJT1IgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJaW5saW5lIHZpcnR1YWwgRXhlY3V0aW9uQ29udGV4dCAqIHRvcCgpCisJeworCQlyZXR1cm4oIHRvcEZyb20obVF1ZXVlQ2FjaGUubm9uZW1wdHkoKSA/IG1RdWV1ZUNhY2hlIDogbVF1ZXVlKSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIEV4ZWN1dGlvbkNvbnRleHQgKiB0b3AoYXZtX3VpbnQ4X3QgYVF1ZXVlVGFibGVPZmZzZXQpCisJeworCQlyZXR1cm4oIHRvcEZyb20oIG1RdWV1ZVRhYmxlWyAoYVF1ZXVlVGFibGVPZmZzZXQgPCBtUXVldWVDb3VudCkgPworCQkJCWFRdWV1ZVRhYmxlT2Zmc2V0IDogbVF1ZXVlQ291bnQgXSApICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgRXhlY3V0aW9uQ29udGV4dCAqIHRvcEZyb20oTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGFRdWV1ZSkKKwl7CisJCXJldHVybiggU3RyYXRlZ3lQb3A6OnRvcEZyb20oIGFRdWV1ZSApICk7CisJfQorCit9OworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworCisjZW5kaWYgLyogRkFNX1FVRVVFX1dBSVRJTkdTVFJBVEVHWV9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3F1ZXVlL1dhaXRpbmdTdHJhdGVneUJMT0NLLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vcXVldWUvV2FpdGluZ1N0cmF0ZWd5QkxPQ0suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjJkY2M0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3F1ZXVlL1dhaXRpbmdTdHJhdGVneUJMT0NLLmgKQEAgLTAsMCArMSw2OTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxMCBmw6l2ci4gMjAxMworICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFdBSVRJTkdTVFJBVEVHWUJMT0NLX0hfCisjZGVmaW5lIFdBSVRJTkdTVFJBVEVHWUJMT0NLX0hfCisKKyNpbmNsdWRlICJXYWl0aW5nU3RyYXRlZ3kuaCIKKyNpbmNsdWRlICJXYWl0aW5nQmFzaWNTdHJhdGVneS5oIgorCisjaW5jbHVkZSA8c2V3L0NvbmZpZ3VyYXRpb24uaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKwordGVtcGxhdGU8IGNsYXNzIEJhc2ljU3RyYXRlZ3kgPgorY2xhc3MgV2FpdGluZ1N0cmF0ZWd5QkxPQ0sgIDogIHB1YmxpYyBCYXNpY1N0cmF0ZWd5Cit7CisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBBVFRSSUJVVEUKKwkgKi8KKwlDb25maWd1cmF0aW9uICYgbUNvbmZpZ3VyYXRpb247CisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlXYWl0aW5nU3RyYXRlZ3lCTE9DSygKKwkJCUNvbmZpZ3VyYXRpb24gJiBhQ29uZmlndXJhdGlvbiwgYXZtX3VpbnQ4X3QgcXVldWVDb3VudCwKKwkJCWF2bV9zaXplX3QgYUJsb2NrSGVpZ2h0UGVyaW9kLCBhdm1fc2l6ZV90IGFCbG9ja1dpZHRoUGVyaW9kLAorCQkJYXZtX3NpemVfdCBhQmxvY2tIZWlnaHQsIGF2bV9zaXplX3QgYUJsb2NrV2lkdGgsCisJCQlhdm1fc2l6ZV90IGFIZWlnaHRMaW1pdCwgYXZtX3NpemVfdCBhV2lkdGhMaW1pdCkKKwk6IEJhc2ljU3RyYXRlZ3koIHF1ZXVlQ291bnQgKSwKKwltQ29uZmlndXJhdGlvbiggYUNvbmZpZ3VyYXRpb24gKSwKKwltQmxvY2tIZWlnaHRQZXJpb2QoIGFCbG9ja0hlaWdodFBlcmlvZCApLAorCW1CbG9ja1dpZHRoUGVyaW9kKCBhQmxvY2tXaWR0aFBlcmlvZCApLAorCisJbUJsb2NrSGVpZ2h0KCBhQmxvY2tIZWlnaHQgKSwKKwltQmxvY2tXaWR0aCggYUJsb2NrV2lkdGggKSwKKworCW1IZWlnaHRMaW1pdCggYUhlaWdodExpbWl0ICksCisJbVdpZHRoTGltaXQoIGFXaWR0aExpbWl0ICksCisKKwltUHVzaEhlaWdodE1pbiggMCApLAorCW1QdXNoV2lkdGhNaW4oIDAgKSwKKworCW1QdXNoSGVpZ2h0TWF4KCAwICksCisJbVB1c2hXaWR0aE1heCggMCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5XYWl0aW5nU3RyYXRlZ3lCTE9DSygpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBQVVNIIC8gUFVTSCNDSElMRCAgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJdm9pZCBwdXNoKEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDKQorCXsKKwkJaWYoIChhbkVDLT5nZXRIZWlnaHQoKSA8PSBtQmxvY2tIZWlnaHQpICYmCisJCQkJKGFuRUMtPmdldFdpZHRoKCkgPD0gbUJsb2NrV2lkdGgpICkKKwkJeworCQkJQmFzaWNTdHJhdGVneTo6cHVzaChCYXNpY1N0cmF0ZWd5OjptUXVldWVDYWNoZSwgYW5FQyk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlCYXNpY1N0cmF0ZWd5OjpwdXNoKEJhc2ljU3RyYXRlZ3k6Om1RdWV1ZSwgYW5FQyk7CisJCX0KKworCQkvLyBGb3IgYWxnbyBvcHRpbWl6YXRpb24KKwkJaWYoIG1QdXNoSGVpZ2h0TWF4IDwgYW5FQy0+Z2V0SGVpZ2h0KCkgKQorCQl7CisJCQltUHVzaEhlaWdodE1heCA9IGFuRUMtPmdldEhlaWdodCgpOworCQl9CisJCWlmKCBtUHVzaFdpZHRoTWF4IDwgYW5FQy0+Z2V0V2lkdGgoKSApCisJCXsKKwkJCW1QdXNoV2lkdGhNYXggPSBhbkVDLT5nZXRXaWR0aCgpOworCQl9CisJfQorCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFBPUCAvIFRPUCAgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJYm9vbCB1cGRhdGVRdWV1ZSgpCisJeworCQltUHVzaEhlaWdodE1pbiA9IG1QdXNoSGVpZ2h0TWF4OworCQltUHVzaFdpZHRoTWluICA9IG1QdXNoV2lkdGhNYXg7CisKKwkJTGlzdE9mRXhlY3V0aW9uQ29udGV4dDo6aXRlcmF0b3IgaXRFQyA9IEJhc2ljU3RyYXRlZ3k6Om1RdWV1ZS5iZWdpbigpOworCQlMaXN0T2ZFeGVjdXRpb25Db250ZXh0OjppdGVyYXRvciBpdEVuZCA9IEJhc2ljU3RyYXRlZ3k6Om1RdWV1ZS5lbmQoKTsKKwkJd2hpbGUoIGl0RUMgIT0gaXRFbmQgKQorCQl7CisJCQkvLyBGb3IgYWxnbyBvcHRpbWl6YXRpb24KKwkJCWlmKCBtUHVzaEhlaWdodE1pbiA+ICgqaXRFQyktPmdldEhlaWdodCgpICkKKwkJCXsKKwkJCQltUHVzaEhlaWdodE1pbiA9ICgqaXRFQyktPmdldEhlaWdodCgpOworCQkJfQorCQkJaWYoIG1QdXNoV2lkdGhNaW4gPiAoKml0RUMpLT5nZXRXaWR0aCgpICkKKwkJCXsKKwkJCQltUHVzaFdpZHRoTWluID0gKCppdEVDKS0+Z2V0V2lkdGgoKTsKKwkJCX0KKworCQkJaWYoICgoKml0RUMpLT5nZXRIZWlnaHQoKSA8PSBtQmxvY2tIZWlnaHQpICYmCisJCQkJCSgoKml0RUMpLT5nZXRXaWR0aCgpIDw9IG1CbG9ja1dpZHRoKSApCisJCQl7CisJCQkJLy9CYXNpY1N0cmF0ZWd5OjpwdXNoKEJhc2ljU3RyYXRlZ3k6Om1RdWV1ZUNhY2hlLCAoKml0RUMpKTsKKwkJCQlCYXNpY1N0cmF0ZWd5OjptUXVldWVDYWNoZS5wdXNoX2JhY2soICppdEVDICk7CisKKwkJCQlpdEVDID0gQmFzaWNTdHJhdGVneTo6bVF1ZXVlLmVyYXNlKGl0RUMpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCSsraXRFQzsKKwkJCX0KKwkJfQorCisJCXJldHVybiggQmFzaWNTdHJhdGVneTo6bVF1ZXVlQ2FjaGUubm9uZW1wdHkoKSApOworCX0KKworCWlubGluZSBFeGVjdXRpb25Db250ZXh0ICogdG9wKCkKKwl7CisJCWlmKCBCYXNpY1N0cmF0ZWd5OjptUXVldWVDYWNoZS5ub25lbXB0eSgpICkKKwkJeworCQkJcmV0dXJuKCBCYXNpY1N0cmF0ZWd5Ojp0b3BGcm9tKCBCYXNpY1N0cmF0ZWd5OjptUXVldWVDYWNoZSApICk7CisJCX0KKworCQlyZXR1cm4oIE5VTEwgKTsKKwl9CisKKworcHJvdGVjdGVkOgorCS8qQVRUUklCVVRFUyovCisJYXZtX3NpemVfdCBtQmxvY2tIZWlnaHRQZXJpb2Q7CisJYXZtX3NpemVfdCBtQmxvY2tXaWR0aFBlcmlvZDsKKworCWF2bV9zaXplX3QgbUJsb2NrSGVpZ2h0OworCWF2bV9zaXplX3QgbUJsb2NrV2lkdGg7CisKKwlhdm1fc2l6ZV90IG1IZWlnaHRMaW1pdDsKKwlhdm1fc2l6ZV90IG1XaWR0aExpbWl0OworCisJYXZtX3NpemVfdCBtUHVzaEhlaWdodE1pbjsKKwlhdm1fc2l6ZV90IG1QdXNoV2lkdGhNaW47CisKKwlhdm1fc2l6ZV90IG1QdXNoSGVpZ2h0TWF4OworCWF2bV9zaXplX3QgbVB1c2hXaWR0aE1heDsKKworfTsKKworCisjZGVmaW5lIE5FWFRfSU5DUihNLCBQKSAgKE0gKyBQIC0gKE0gJSBQKSkKKworCisKKwordGVtcGxhdGU8IGNsYXNzIEJhc2ljU3RyYXRlZ3lBTEwgPgorY2xhc3MgV2FpdGluZ1N0cmF0ZWd5QkxPQ0tfQUxMIDoKKwkJcHVibGljIFdhaXRpbmdTdHJhdGVneUJMT0NLPCBCYXNpY1N0cmF0ZWd5QUxMID4KK3sKKworcHJpdmF0ZToKKwkvKioKKwkgKiBUWVBFREVGCisJICovCisJdHlwZWRlZiBXYWl0aW5nU3RyYXRlZ3lCTE9DSzwgQmFzaWNTdHJhdGVneUFMTCA+ICBiYXNlX3RoaXNfdHlwZTsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJV2FpdGluZ1N0cmF0ZWd5QkxPQ0tfQUxMKAorCQkJQ29uZmlndXJhdGlvbiAmIGFDb25maWd1cmF0aW9uLCBhdm1fdWludDhfdCBxdWV1ZUNvdW50LAorCQkJYXZtX3NpemVfdCBhQmxvY2tIZWlnaHRQZXJpb2QsIGF2bV9zaXplX3QgYUJsb2NrV2lkdGhQZXJpb2QsCisJCQlhdm1fc2l6ZV90IGFCbG9ja0hlaWdodCwgYXZtX3NpemVfdCBhQmxvY2tXaWR0aCwKKwkJCWF2bV9zaXplX3QgYUhlaWdodExpbWl0LCBhdm1fc2l6ZV90IGFXaWR0aExpbWl0KQorCTogYmFzZV90aGlzX3R5cGUoYUNvbmZpZ3VyYXRpb24sIHF1ZXVlQ291bnQsCisJCQlhQmxvY2tIZWlnaHRQZXJpb2QsIGFCbG9ja1dpZHRoUGVyaW9kLAorCQkJYUJsb2NrSGVpZ2h0LCBhQmxvY2tXaWR0aCwgYUhlaWdodExpbWl0LCBhV2lkdGhMaW1pdCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFBPUCAvIFRPUCAgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJRXhlY3V0aW9uQ29udGV4dCAqIHBvcCgpCisJeworCQlyZXR1cm4oIE5VTEwgKTsKKwl9CisKKworCXZvaWQgcG9wVG8oTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGFSZWFkeVF1ZXVlKQorCXsKKwkJc3RhdGljIGF2bV9zaXplX3QgY2FsbF9jb3VudGVyID0gMDsKKwkJKytjYWxsX2NvdW50ZXI7CisKKwkJaWYoIEJhc2ljU3RyYXRlZ3lBTEw6Om1RdWV1ZUNhY2hlLm5vbmVtcHR5KCkgKQorCQl7CisJCQlhUmVhZHlRdWV1ZS5zcGxpY2UoIEJhc2ljU3RyYXRlZ3lBTEw6Om1RdWV1ZUNhY2hlICk7CisJCX0KKwkJZWxzZSBpZiggQmFzaWNTdHJhdGVneUFMTDo6bVF1ZXVlLm5vbmVtcHR5KCkgKQorCQl7CisJCQl3aGlsZSggdHJ1ZSApCisJCQl7CisJCQkJLy8gUmVjaGVyY2hlIHBhciBibG9jayBlbiBCRlMgw6AgcGFydGlyIGRlIGxhIGhhdXRldXIgY291cmFudGUKKwkJCQl3aGlsZSggKGJhc2VfdGhpc190eXBlOjptQmxvY2tXaWR0aCA8IGJhc2VfdGhpc190eXBlOjptV2lkdGhMaW1pdCkgJiYKKwkJCQkJCShiYXNlX3RoaXNfdHlwZTo6bUJsb2NrV2lkdGggPCBiYXNlX3RoaXNfdHlwZTo6bVB1c2hXaWR0aE1heCkgKQorCQkJCXsKKwkJCQkJYmFzZV90aGlzX3R5cGU6Om1CbG9ja1dpZHRoID0gc3RkOjptaW4oYmFzZV90aGlzX3R5cGU6Om1XaWR0aExpbWl0LAorCQkJCQkJCQliYXNlX3RoaXNfdHlwZTo6bUJsb2NrV2lkdGggKyBiYXNlX3RoaXNfdHlwZTo6bUJsb2NrV2lkdGhQZXJpb2QpOworCisJCQkJCUFWTV9PU19DT1VUIDw8ICJ1cGRhdGUgbUJsb2NrV2lkdGggWyIgPDwgY2FsbF9jb3VudGVyIDw8ICJdIDo+ICIKKwkJCQkJCQk8PCAiSDwiIDw8IGJhc2VfdGhpc190eXBlOjptQmxvY2tIZWlnaHRQZXJpb2QgPDwgIj5bICIKKwkJCQkJCQk8PCBiYXNlX3RoaXNfdHlwZTo6bVB1c2hIZWlnaHRNaW4gPDwgIiAsICIgPDwgYmFzZV90aGlzX3R5cGU6Om1QdXNoSGVpZ2h0TWF4IDw8ICIgXSIKKwkJCQkJCQk8PCAiID0+IGhlaWdodDoiIDw8IGJhc2VfdGhpc190eXBlOjptQmxvY2tIZWlnaHQgPDwgIiA8LS0tPiAiCisJCQkJCQkJPDwgIlc8IiA8PCBiYXNlX3RoaXNfdHlwZTo6bUJsb2NrV2lkdGhQZXJpb2QgPDwgIj5bICIKKwkJCQkJCQk8PCBiYXNlX3RoaXNfdHlwZTo6bVB1c2hXaWR0aE1pbiA8PCAiICwgIiA8PCBiYXNlX3RoaXNfdHlwZTo6bVB1c2hXaWR0aE1heCA8PCAiIF0iCisJCQkJCQkJPDwgIiA9PiB3aWR0aDoiIDw8IGJhc2VfdGhpc190eXBlOjptQmxvY2tXaWR0aCA8PCBzdGQ6OmVuZGw7CisKKwkJCQkJaWYoIGJhc2VfdGhpc190eXBlOjp1cGRhdGVRdWV1ZSgpICkKKwkJCQkJeworCQkJCQkJYVJlYWR5UXVldWUuc3BsaWNlKCBCYXNpY1N0cmF0ZWd5QUxMOjptUXVldWVDYWNoZSApOworCQkJCQl9CisJCQkJfQorCisvLwkJCQltQ29uZmlndXJhdGlvbi5zYXZlVHJhY2VTcGVjaWZpY2F0aW9uKEFWTV9PU19DT1VUKTsKKy8vCQkJCW1Db25maWd1cmF0aW9uLnNhdmVTY2VuYXJpaSgpOworCisJCQkJLy8gUmVjaGVyY2hlIHBhciBibG9jayBCRlMgw6AgcGFydGlyCisJCQkJLy8gZCd1bmUgaGF1dGV1ciBhdWdtZW50w6llIGQndW5lIHRhaWxsZSBkZSBibG9jaworCQkJCWlmKCAoYmFzZV90aGlzX3R5cGU6Om1QdXNoSGVpZ2h0TWluIDwgYmFzZV90aGlzX3R5cGU6Om1IZWlnaHRMaW1pdCkgJiYKKwkJCQkJCShiYXNlX3RoaXNfdHlwZTo6bVB1c2hXaWR0aE1pbiA8IGJhc2VfdGhpc190eXBlOjptV2lkdGhMaW1pdCkgKQorCQkJCXsKKwkJCQkJYmFzZV90aGlzX3R5cGU6Om1CbG9ja0hlaWdodCA9IHN0ZDo6bWluKGJhc2VfdGhpc190eXBlOjptSGVpZ2h0TGltaXQsCisJCQkJCQkJTkVYVF9JTkNSKGJhc2VfdGhpc190eXBlOjptUHVzaEhlaWdodE1pbiwgYmFzZV90aGlzX3R5cGU6Om1CbG9ja0hlaWdodFBlcmlvZCkpOworCisJCQkJCWJhc2VfdGhpc190eXBlOjptQmxvY2tXaWR0aCA9IHN0ZDo6bWluKGJhc2VfdGhpc190eXBlOjptV2lkdGhMaW1pdCwKKwkJCQkJCQlORVhUX0lOQ1IoIGJhc2VfdGhpc190eXBlOjptUHVzaFdpZHRoTWluICwgYmFzZV90aGlzX3R5cGU6Om1CbG9ja1dpZHRoUGVyaW9kKSk7CisKKwkJCQkJQVZNX09TX0NPVVQgPDwgInVwZGF0ZSBtQmxvY2tIZWlnaHRbIiA8PCBjYWxsX2NvdW50ZXIgPDwgIl0gOj4gIgorCQkJCQkJCTw8ICJIPCIgPDwgYmFzZV90aGlzX3R5cGU6Om1CbG9ja0hlaWdodFBlcmlvZCA8PCAiPlsgIgorCQkJCQkJCTw8IGJhc2VfdGhpc190eXBlOjptUHVzaEhlaWdodE1pbiA8PCAiICwgIiA8PCBiYXNlX3RoaXNfdHlwZTo6bVB1c2hIZWlnaHRNYXggPDwgIiBdIgorCQkJCQkJCTw8ICIgPT4gaGVpZ2h0OiIgPDwgYmFzZV90aGlzX3R5cGU6Om1CbG9ja0hlaWdodCA8PCAiIDwtLS0+ICIKKwkJCQkJCQk8PCAiVzwiIDw8IGJhc2VfdGhpc190eXBlOjptQmxvY2tXaWR0aFBlcmlvZCA8PCAiPlsgIgorCQkJCQkJCTw8IGJhc2VfdGhpc190eXBlOjptUHVzaFdpZHRoTWluIDw8ICIgLCAiIDw8IGJhc2VfdGhpc190eXBlOjptUHVzaFdpZHRoTWF4IDw8ICIgXSIKKwkJCQkJCQk8PCAiID0+IHdpZHRoOiIgPDwgYmFzZV90aGlzX3R5cGU6Om1CbG9ja1dpZHRoIDw8IHN0ZDo6ZW5kbDsKKworCQkJCQlpZiggYmFzZV90aGlzX3R5cGU6OnVwZGF0ZVF1ZXVlKCkgKQorCQkJCQl7CisJCQkJCQlhUmVhZHlRdWV1ZS5zcGxpY2UoIEJhc2ljU3RyYXRlZ3lBTEw6Om1RdWV1ZUNhY2hlICk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQkvLyBSZWNoZXJjaGUgcGFyIGJsb2NrIERGUyDDoCBwYXJ0aXIKKwkJCQkvLyBkJ3VuIG5vdXZlYXUgcMOpcmltw6h0cmUgZG91YmzDqQorCQkJCWJhc2VfdGhpc190eXBlOjptQmxvY2tIZWlnaHQgPSBORVhUX0lOQ1IoYmFzZV90aGlzX3R5cGU6Om1QdXNoSGVpZ2h0TWluLCBiYXNlX3RoaXNfdHlwZTo6bUJsb2NrSGVpZ2h0UGVyaW9kKTsKKwkJCQliYXNlX3RoaXNfdHlwZTo6bUJsb2NrV2lkdGggID0gTkVYVF9JTkNSKGJhc2VfdGhpc190eXBlOjptUHVzaFdpZHRoTWluICwgYmFzZV90aGlzX3R5cGU6Om1CbG9ja1dpZHRoUGVyaW9kKTsKKworCQkJCWJhc2VfdGhpc190eXBlOjptSGVpZ2h0TGltaXQgKz0gYmFzZV90aGlzX3R5cGU6Om1IZWlnaHRMaW1pdDsKKwkJCQliYXNlX3RoaXNfdHlwZTo6bVdpZHRoTGltaXQgICs9IGJhc2VfdGhpc190eXBlOjptV2lkdGhMaW1pdDsKKworCQkJCUFWTV9PU19DT1VUIDw8ICJ1cGRhdGUgbUJsb2NrTGltaXRbIiA8PCBjYWxsX2NvdW50ZXIgPDwgIl0gOj4gIgorCQkJCQkJPDwgImhlaWdodDoiIDw8IGJhc2VfdGhpc190eXBlOjptSGVpZ2h0TGltaXQKKwkJCQkJCTw8ICIgd2lkdGg6IiA8PCBiYXNlX3RoaXNfdHlwZTo6bVdpZHRoTGltaXQKKwkJCQkJCTw8ICIgID09PiAgcmVzZXQgbUJsb2NrU2l6ZSA6PiAiCisJCQkJCQk8PCAiSDwiIDw8IGJhc2VfdGhpc190eXBlOjptQmxvY2tIZWlnaHRQZXJpb2QgPDwgIj5bICIKKwkJCQkJCTw8IGJhc2VfdGhpc190eXBlOjptUHVzaEhlaWdodE1pbiA8PCAiICwgIiA8PCBiYXNlX3RoaXNfdHlwZTo6bVB1c2hIZWlnaHRNYXggPDwgIiBdIgorCQkJCQkJPDwgIiA9PiBoZWlnaHQ6IiA8PCBiYXNlX3RoaXNfdHlwZTo6bUJsb2NrSGVpZ2h0IDw8ICIgPC0tLT4gIgorCQkJCQkJPDwgIlc8IiA8PCBiYXNlX3RoaXNfdHlwZTo6bUJsb2NrV2lkdGhQZXJpb2QgPDwgIj5bICIKKwkJCQkJCTw8IGJhc2VfdGhpc190eXBlOjptUHVzaFdpZHRoTWluIDw8ICIgLCAiIDw8IGJhc2VfdGhpc190eXBlOjptUHVzaFdpZHRoTWF4IDw8ICIgXSIKKwkJCQkJCTw8ICIgPT4gd2lkdGg6IiA8PCBiYXNlX3RoaXNfdHlwZTo6bUJsb2NrV2lkdGggPDwgc3RkOjplbmRsOworCisJCQkJaWYoIGJhc2VfdGhpc190eXBlOjp1cGRhdGVRdWV1ZSgpICkKKwkJCQl7CisJCQkJCWFSZWFkeVF1ZXVlLnNwbGljZSggQmFzaWNTdHJhdGVneUFMTDo6bVF1ZXVlQ2FjaGUgKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKK307CisKKworCitjbGFzcyBXYWl0aW5nU3RyYXRlZ3lCTE9DS19CRlMgOgorCQlwdWJsaWMgV2FpdGluZ1N0cmF0ZWd5QkxPQ0s8IFdhaXRpbmdCYXNpY1N0cmF0ZWd5QkZTID4KK3sKKworcHJpdmF0ZToKKwkvKioKKwkgKiBUWVBFREVGCisJICovCisJdHlwZWRlZiBXYWl0aW5nU3RyYXRlZ3lCTE9DSzwgV2FpdGluZ0Jhc2ljU3RyYXRlZ3lCRlMgPiAgYmFzZV90aGlzX3R5cGU7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCVdhaXRpbmdTdHJhdGVneUJMT0NLX0JGUygKKwkJCUNvbmZpZ3VyYXRpb24gJiBhQ29uZmlndXJhdGlvbiwgYXZtX3VpbnQ4X3QgcXVldWVDb3VudCwKKwkJCWF2bV9zaXplX3QgYUJsb2NrSGVpZ2h0UGVyaW9kLCBhdm1fc2l6ZV90IGFCbG9ja1dpZHRoUGVyaW9kLAorCQkJYXZtX3NpemVfdCBhQmxvY2tIZWlnaHQsIGF2bV9zaXplX3QgYUJsb2NrV2lkdGgsCisJCQlhdm1fc2l6ZV90IGFIZWlnaHRMaW1pdCwgYXZtX3NpemVfdCBhV2lkdGhMaW1pdCkKKwk6IGJhc2VfdGhpc190eXBlKGFDb25maWd1cmF0aW9uLCBxdWV1ZUNvdW50LAorCQkJYUJsb2NrSGVpZ2h0UGVyaW9kLCBhQmxvY2tXaWR0aFBlcmlvZCwKKwkJCWFCbG9ja0hlaWdodCwgYUJsb2NrV2lkdGgsIGFIZWlnaHRMaW1pdCwgYVdpZHRoTGltaXQpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBQT1AgLyBUT1AgIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCUV4ZWN1dGlvbkNvbnRleHQgKiBwb3AoKQorCXsKKwkJc3RhdGljIGF2bV9zaXplX3QgY2FsbF9jb3VudGVyID0gMDsKKwkJKytjYWxsX2NvdW50ZXI7CisKKwkJaWYoIFdhaXRpbmdCYXNpY1N0cmF0ZWd5QkZTOjptUXVldWVDYWNoZS5ub25lbXB0eSgpICkKKwkJeworCQkJcmV0dXJuKCBXYWl0aW5nQmFzaWNTdHJhdGVneUJGUzo6cG9wRnJvbSgKKwkJCQkJV2FpdGluZ0Jhc2ljU3RyYXRlZ3lCRlM6Om1RdWV1ZUNhY2hlKSApOworCQl9CisJCWVsc2UgaWYoIFdhaXRpbmdCYXNpY1N0cmF0ZWd5QkZTOjptUXVldWUubm9uZW1wdHkoKSApCisJCXsKKwkJCXdoaWxlKCB0cnVlICkKKwkJCXsKKwkJCQkvLyBSZWNoZXJjaGUgcGFyIGJsb2NrIGVuIEJGUyDDoCBwYXJ0aXIgZGUgbGEgaGF1dGV1ciBjb3VyYW50ZQorCQkJCXdoaWxlKCAobUJsb2NrV2lkdGggPCBtV2lkdGhMaW1pdCkgJiYKKwkJCQkJCShtQmxvY2tXaWR0aCA8IG1QdXNoV2lkdGhNYXgpICkKKwkJCQl7CisJCQkJCW1CbG9ja1dpZHRoID0gc3RkOjptaW4obVdpZHRoTGltaXQsCisJCQkJCQkJCW1CbG9ja1dpZHRoICsgbUJsb2NrV2lkdGhQZXJpb2QpOworCisJCQkJCUFWTV9PU19DT1VUIDw8ICJ1cGRhdGUgbUJsb2NrV2lkdGggWyIgPDwgY2FsbF9jb3VudGVyIDw8ICJdIDo+ICIKKwkJCQkJCQk8PCAiSDwiIDw8IG1CbG9ja0hlaWdodFBlcmlvZCA8PCAiPlsgIgorCQkJCQkJCTw8IG1QdXNoSGVpZ2h0TWluIDw8ICIgLCAiIDw8IG1QdXNoSGVpZ2h0TWF4IDw8ICIgXSIKKwkJCQkJCQk8PCAiID0+IGhlaWdodDoiIDw8IG1CbG9ja0hlaWdodCA8PCAiIDwtLS0+ICIKKwkJCQkJCQk8PCAiVzwiIDw8IG1CbG9ja1dpZHRoUGVyaW9kIDw8ICI+WyAiCisJCQkJCQkJPDwgbVB1c2hXaWR0aE1pbiA8PCAiICwgIiA8PCBtUHVzaFdpZHRoTWF4IDw8ICIgXSIKKwkJCQkJCQk8PCAiID0+IHdpZHRoOiIgPDwgbUJsb2NrV2lkdGggPDwgc3RkOjplbmRsOworCisJCQkJCWlmKCB1cGRhdGVRdWV1ZSgpICkKKwkJCQkJeworCQkJCQkJcmV0dXJuKCBXYWl0aW5nQmFzaWNTdHJhdGVneUJGUzo6cG9wRnJvbSgKKwkJCQkJCQkJV2FpdGluZ0Jhc2ljU3RyYXRlZ3lCRlM6Om1RdWV1ZUNhY2hlKSApOworCQkJCQl9CisJCQkJfQorCisvLwkJCQltQ29uZmlndXJhdGlvbi5zYXZlVHJhY2VTcGVjaWZpY2F0aW9uKEFWTV9PU19DT1VUKTsKKy8vCQkJCW1Db25maWd1cmF0aW9uLnNhdmVTY2VuYXJpaSgpOworCisJCQkJLy8gUmVjaGVyY2hlIHBhciBibG9jayBCRlMgw6AgcGFydGlyCisJCQkJLy8gZCd1bmUgaGF1dGV1ciBhdWdtZW50w6llIGQndW5lIHRhaWxsZSBkZSBibG9jaworCQkJCWlmKCAobVB1c2hIZWlnaHRNaW4gPCBtSGVpZ2h0TGltaXQpICYmCisJCQkJCQkobVB1c2hXaWR0aE1pbiA8IG1XaWR0aExpbWl0KSApCisJCQkJeworCQkJCQltQmxvY2tIZWlnaHQgPSBzdGQ6Om1pbihtSGVpZ2h0TGltaXQsCisJCQkJCQkJTkVYVF9JTkNSKG1QdXNoSGVpZ2h0TWluLCBtQmxvY2tIZWlnaHRQZXJpb2QpKTsKKworCQkJCQltQmxvY2tXaWR0aCA9IHN0ZDo6bWluKG1XaWR0aExpbWl0LAorCQkJCQkJCU5FWFRfSU5DUiggbVB1c2hXaWR0aE1pbiAsIG1CbG9ja1dpZHRoUGVyaW9kKSk7CisKKwkJCQkJQVZNX09TX0NPVVQgPDwgInVwZGF0ZSBtQmxvY2tIZWlnaHRbIiA8PCBjYWxsX2NvdW50ZXIgPDwgIl0gOj4gIgorCQkJCQkJCTw8ICJIPCIgPDwgbUJsb2NrSGVpZ2h0UGVyaW9kIDw8ICI+WyAiCisJCQkJCQkJPDwgbVB1c2hIZWlnaHRNaW4gPDwgIiAsICIgPDwgbVB1c2hIZWlnaHRNYXggPDwgIiBdIgorCQkJCQkJCTw8ICIgPT4gaGVpZ2h0OiIgPDwgbUJsb2NrSGVpZ2h0IDw8ICIgPC0tLT4gIgorCQkJCQkJCTw8ICJXPCIgPDwgbUJsb2NrV2lkdGhQZXJpb2QgPDwgIj5bICIKKwkJCQkJCQk8PCBtUHVzaFdpZHRoTWluIDw8ICIgLCAiIDw8IG1QdXNoV2lkdGhNYXggPDwgIiBdIgorCQkJCQkJCTw8ICIgPT4gd2lkdGg6IiA8PCBtQmxvY2tXaWR0aCA8PCBzdGQ6OmVuZGw7CisKKwkJCQkJaWYoIHVwZGF0ZVF1ZXVlKCkgKQorCQkJCQl7CisJCQkJCQlyZXR1cm4oIFdhaXRpbmdCYXNpY1N0cmF0ZWd5QkZTOjpwb3BGcm9tKAorCQkJCQkJCQlXYWl0aW5nQmFzaWNTdHJhdGVneUJGUzo6bVF1ZXVlQ2FjaGUpICk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQkvLyBSZWNoZXJjaGUgcGFyIGJsb2NrIERGUyDDoCBwYXJ0aXIKKwkJCQkvLyBkJ3VuIG5vdXZlYXUgcMOpcmltw6h0cmUgZG91YmzDqQorCQkJCW1CbG9ja0hlaWdodCA9IE5FWFRfSU5DUihtUHVzaEhlaWdodE1pbiwgbUJsb2NrSGVpZ2h0UGVyaW9kKTsKKwkJCQltQmxvY2tXaWR0aCAgPSBORVhUX0lOQ1IobVB1c2hXaWR0aE1pbiAsIG1CbG9ja1dpZHRoUGVyaW9kKTsKKworCQkJCW1IZWlnaHRMaW1pdCArPSBtSGVpZ2h0TGltaXQ7CisJCQkJbVdpZHRoTGltaXQgICs9IG1XaWR0aExpbWl0OworCisJCQkJQVZNX09TX0NPVVQgPDwgInVwZGF0ZSBtQmxvY2tMaW1pdFsiIDw8IGNhbGxfY291bnRlciA8PCAiXSA6PiAiCisJCQkJCQk8PCAiaGVpZ2h0OiIgPDwgbUhlaWdodExpbWl0CisJCQkJCQk8PCAiIHdpZHRoOiIgPDwgbVdpZHRoTGltaXQKKwkJCQkJCTw8ICIgID09PiAgcmVzZXQgbUJsb2NrU2l6ZSA6PiAiCisJCQkJCQk8PCAiSDwiIDw8IG1CbG9ja0hlaWdodFBlcmlvZCA8PCAiPlsgIgorCQkJCQkJPDwgbVB1c2hIZWlnaHRNaW4gPDwgIiAsICIgPDwgbVB1c2hIZWlnaHRNYXggPDwgIiBdIgorCQkJCQkJPDwgIiA9PiBoZWlnaHQ6IiA8PCBtQmxvY2tIZWlnaHQgPDwgIiA8LS0tPiAiCisJCQkJCQk8PCAiVzwiIDw8IG1CbG9ja1dpZHRoUGVyaW9kIDw8ICI+WyAiCisJCQkJCQk8PCBtUHVzaFdpZHRoTWluIDw8ICIgLCAiIDw8IG1QdXNoV2lkdGhNYXggPDwgIiBdIgorCQkJCQkJPDwgIiA9PiB3aWR0aDoiIDw8IG1CbG9ja1dpZHRoIDw8IHN0ZDo6ZW5kbDsKKworCQkJCWlmKCB1cGRhdGVRdWV1ZSgpICkKKwkJCQl7CisJCQkJCXJldHVybiggV2FpdGluZ0Jhc2ljU3RyYXRlZ3lCRlM6OnBvcEZyb20oCisJCQkJCQkJV2FpdGluZ0Jhc2ljU3RyYXRlZ3lCRlM6Om1RdWV1ZUNhY2hlKSApOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiggTlVMTCApOworCX0KKworfTsKKworCisKKworY2xhc3MgV2FpdGluZ1N0cmF0ZWd5QkxPQ0tfREZTIDoKKwkJcHVibGljIFdhaXRpbmdTdHJhdGVneUJMT0NLPCBXYWl0aW5nQmFzaWNTdHJhdGVneURGUyA+Cit7CisKK3ByaXZhdGU6CisJLyoqCisJICogVFlQRURFRgorCSAqLworCXR5cGVkZWYgV2FpdGluZ1N0cmF0ZWd5QkxPQ0s8IFdhaXRpbmdCYXNpY1N0cmF0ZWd5REZTID4gIGJhc2VfdGhpc190eXBlOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlXYWl0aW5nU3RyYXRlZ3lCTE9DS19ERlMoCisJCQlDb25maWd1cmF0aW9uICYgYUNvbmZpZ3VyYXRpb24sIGF2bV91aW50OF90IHF1ZXVlQ291bnQsCisJCQlhdm1fc2l6ZV90IGFCbG9ja0hlaWdodFBlcmlvZCwgYXZtX3NpemVfdCBhQmxvY2tXaWR0aFBlcmlvZCwKKwkJCWF2bV9zaXplX3QgYUJsb2NrSGVpZ2h0LCBhdm1fc2l6ZV90IGFCbG9ja1dpZHRoLAorCQkJYXZtX3NpemVfdCBhSGVpZ2h0TGltaXQsIGF2bV9zaXplX3QgYVdpZHRoTGltaXQpCisJOiBiYXNlX3RoaXNfdHlwZShhQ29uZmlndXJhdGlvbiwgcXVldWVDb3VudCwKKwkJCWFCbG9ja0hlaWdodFBlcmlvZCwgYUJsb2NrV2lkdGhQZXJpb2QsCisJCQlhQmxvY2tIZWlnaHQsIGFCbG9ja1dpZHRoLCBhSGVpZ2h0TGltaXQsIGFXaWR0aExpbWl0KQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gUE9QIC8gVE9QICBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlFeGVjdXRpb25Db250ZXh0ICogcG9wKCkKKwl7CisJCXN0YXRpYyBhdm1fc2l6ZV90IGNhbGxfY291bnRlciA9IDA7CisJCSsrY2FsbF9jb3VudGVyOworCisJCWlmKCBXYWl0aW5nQmFzaWNTdHJhdGVneURGUzo6bVF1ZXVlQ2FjaGUubm9uZW1wdHkoKSApCisJCXsKKwkJCXJldHVybiggV2FpdGluZ0Jhc2ljU3RyYXRlZ3lERlM6OnBvcEZyb20oCisJCQkJCVdhaXRpbmdCYXNpY1N0cmF0ZWd5REZTOjptUXVldWVDYWNoZSkgKTsKKwkJfQorCQllbHNlIGlmKCBXYWl0aW5nQmFzaWNTdHJhdGVneURGUzo6bVF1ZXVlLm5vbmVtcHR5KCkgKQorCQl7CisJCQl3aGlsZSggdHJ1ZSApCisJCQl7CisJCQkJLy8gUmVjaGVyY2hlIHBhciBibG9jayBlbiBERlMgw6AgcGFydGlyIGRlIGxhIGxhcmdldXIgY291cmFudGUKKwkJCQl3aGlsZSggKG1CbG9ja0hlaWdodCA8IG1IZWlnaHRMaW1pdCkgJiYKKwkJCQkJCShtQmxvY2tIZWlnaHQgPCBtUHVzaEhlaWdodE1heCkgKQorCQkJCXsKKwkJCQkJbUJsb2NrSGVpZ2h0ID0gc3RkOjptaW4obUhlaWdodExpbWl0LAorCQkJCQkJCQltQmxvY2tIZWlnaHQgKyBtQmxvY2tIZWlnaHRQZXJpb2QpOworCisJCQkJCUFWTV9PU19DT1VUIDw8ICJ1cGRhdGUgbUJsb2NrSGVpZ2h0WyIgPDwgY2FsbF9jb3VudGVyIDw8ICJdIDo+ICIKKwkJCQkJCQk8PCAiSDwiIDw8IG1CbG9ja0hlaWdodFBlcmlvZCA8PCAiPlsgIgorCQkJCQkJCTw8IG1QdXNoSGVpZ2h0TWluIDw8ICIgLCAiIDw8IG1QdXNoSGVpZ2h0TWF4IDw8ICIgXSIKKwkJCQkJCQk8PCAiID0+IGhlaWdodDoiIDw8IG1CbG9ja0hlaWdodCA8PCAiIDwtLS0+ICIKKwkJCQkJCQk8PCAiVzwiIDw8IG1CbG9ja1dpZHRoUGVyaW9kIDw8ICI+WyAiCisJCQkJCQkJPDwgbVB1c2hXaWR0aE1pbiA8PCAiICwgIiA8PCBtUHVzaFdpZHRoTWF4IDw8ICIgXSIKKwkJCQkJCQk8PCAiID0+IHdpZHRoOiIgPDwgbUJsb2NrV2lkdGggPDwgc3RkOjplbmRsOworCisJCQkJCWlmKCB1cGRhdGVRdWV1ZSgpICkKKwkJCQkJeworCQkJCQkJcmV0dXJuKCBXYWl0aW5nQmFzaWNTdHJhdGVneURGUzo6cG9wRnJvbSgKKwkJCQkJCQkJV2FpdGluZ0Jhc2ljU3RyYXRlZ3lERlM6Om1RdWV1ZUNhY2hlKSApOworCQkJCQl9CisJCQkJfQorCisvLwkJCQltQ29uZmlndXJhdGlvbi5zYXZlVHJhY2VTcGVjaWZpY2F0aW9uKEFWTV9PU19DT1VUKTsKKy8vCQkJCW1Db25maWd1cmF0aW9uLnNhdmVTY2VuYXJpaSgpOworCisJCQkJLy8gUmVjaGVyY2hlIHBhciBibG9jayBERlMgw6AgcGFydGlyCisJCQkJLy8gZCd1bmUgbGFyZ2V1ciBhdWdtZW50w6llIGQndW5lIHRhaWxsZSBkZSBibG9jaworCQkJCWlmKCAobVB1c2hXaWR0aE1pbiA8IG1XaWR0aExpbWl0KSAmJgorCQkJCQkJKG1QdXNoSGVpZ2h0TWluIDwgbUhlaWdodExpbWl0KSApCisJCQkJeworCQkJCQltQmxvY2tIZWlnaHQgPSBzdGQ6Om1pbihtSGVpZ2h0TGltaXQsCisJCQkJCQkJTkVYVF9JTkNSKG1QdXNoSGVpZ2h0TWluLCBtQmxvY2tIZWlnaHRQZXJpb2QpKTsKKworCQkJCQltQmxvY2tXaWR0aCA9IHN0ZDo6bWluKG1XaWR0aExpbWl0LAorCQkJCQkJCU5FWFRfSU5DUiggbVB1c2hXaWR0aE1pbiAsIG1CbG9ja1dpZHRoUGVyaW9kKSk7CisKKwkJCQkJQVZNX09TX0NPVVQgPDwgInVwZGF0ZSBtQmxvY2tXaWR0aCBbIiA8PCBjYWxsX2NvdW50ZXIgPDwgIl0gOj4gIgorCQkJCQkJCTw8ICJIPCIgPDwgbUJsb2NrSGVpZ2h0UGVyaW9kIDw8ICI+WyAiCisJCQkJCQkJPDwgbVB1c2hIZWlnaHRNaW4gPDwgIiAsICIgPDwgbVB1c2hIZWlnaHRNYXggPDwgIiBdIgorCQkJCQkJCTw8ICIgPT4gaGVpZ2h0OiIgPDwgbUJsb2NrSGVpZ2h0IDw8ICIgPC0tLT4gIgorCQkJCQkJCTw8ICJXPCIgPDwgbUJsb2NrV2lkdGhQZXJpb2QgPDwgIj5bICIKKwkJCQkJCQk8PCBtUHVzaFdpZHRoTWluIDw8ICIgLCAiIDw8IG1QdXNoV2lkdGhNYXggPDwgIiBdIgorCQkJCQkJCTw8ICIgPT4gd2lkdGg6IiA8PCBtQmxvY2tXaWR0aCA8PCBzdGQ6OmVuZGw7CisKKwkJCQkJaWYoIHVwZGF0ZVF1ZXVlKCkgKQorCQkJCQl7CisJCQkJCQlyZXR1cm4oIFdhaXRpbmdCYXNpY1N0cmF0ZWd5REZTOjpwb3BGcm9tKAorCQkJCQkJCQlXYWl0aW5nQmFzaWNTdHJhdGVneURGUzo6bVF1ZXVlQ2FjaGUpICk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQkvLyBSZWNoZXJjaGUgcGFyIGJsb2NrIERGUyDDoCBwYXJ0aXIKKwkJCQkvLyBkJ3VuIG5vdXZlYXUgcMOpcmltw6h0cmUgZG91YmzDqQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCW1CbG9ja0hlaWdodCA9IE5FWFRfSU5DUihtUHVzaEhlaWdodE1pbiwgbUJsb2NrSGVpZ2h0UGVyaW9kKTsKKwkJCQkJbUJsb2NrV2lkdGggID0gTkVYVF9JTkNSKG1QdXNoV2lkdGhNaW4gLCBtQmxvY2tXaWR0aFBlcmlvZCk7CisKKwkJCQkJbUhlaWdodExpbWl0ICs9IG1IZWlnaHRMaW1pdDsKKwkJCQkJbVdpZHRoTGltaXQgICs9IG1XaWR0aExpbWl0OworCisJCQkJCUFWTV9PU19DT1VUIDw8ICJ1cGRhdGUgbUJsb2NrTGltaXRbIiA8PCBjYWxsX2NvdW50ZXIgPDwgIl0gOj4iCisJCQkJCQkJPDwgImhlaWdodDoiIDw8IG1IZWlnaHRMaW1pdAorCQkJCQkJCTw8ICIgd2lkdGg6IiA8PCBtV2lkdGhMaW1pdAorCQkJCQkJCTw8ICIgID09PiAgcmVzZXQgbUJsb2NrU2l6ZSA6PiAiCisJCQkJCQkJPDwgIkg8IiA8PCBtQmxvY2tIZWlnaHRQZXJpb2QgPDwgIj5bICIKKwkJCQkJCQk8PCBtUHVzaEhlaWdodE1pbiA8PCAiICwgIiA8PCBtUHVzaEhlaWdodE1heCA8PCAiIF0iCisJCQkJCQkJPDwgIiA9PiBoZWlnaHQ6IiA8PCBtQmxvY2tIZWlnaHQgPDwgIiA8LS0tPiAiCisJCQkJCQkJPDwgIlc8IiA8PCBtQmxvY2tXaWR0aFBlcmlvZCA8PCAiPlsgIgorCQkJCQkJCTw8IG1QdXNoV2lkdGhNaW4gPDwgIiAsICIgPDwgbVB1c2hXaWR0aE1heCA8PCAiIF0iCisJCQkJCQkJPDwgIiA9PiB3aWR0aDoiIDw8IG1CbG9ja1dpZHRoIDw8IHN0ZDo6ZW5kbDsKKworCQkJCQlpZiggdXBkYXRlUXVldWUoKSApCisJCQkJCXsKKwkJCQkJCXJldHVybiggV2FpdGluZ0Jhc2ljU3RyYXRlZ3lERlM6OnBvcEZyb20oCisJCQkJCQkJCVdhaXRpbmdCYXNpY1N0cmF0ZWd5REZTOjptUXVldWVDYWNoZSkgKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiggTlVMTCApOworCX0KKworfTsKKworCisKK2NsYXNzIFdhaXRpbmdTdHJhdGVneUJMT0NLX1JGUyA6CisJCXB1YmxpYyBXYWl0aW5nU3RyYXRlZ3lCTE9DSzwgV2FpdGluZ0Jhc2ljU3RyYXRlZ3lSRlMgPgoreworCitwcml2YXRlOgorCS8qKgorCSAqIFRZUEVERUYKKwkgKi8KKwl0eXBlZGVmIFdhaXRpbmdTdHJhdGVneUJMT0NLPCBXYWl0aW5nQmFzaWNTdHJhdGVneVJGUyA+ICBiYXNlX3RoaXNfdHlwZTsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJV2FpdGluZ1N0cmF0ZWd5QkxPQ0tfUkZTKAorCQkJQ29uZmlndXJhdGlvbiAmIGFDb25maWd1cmF0aW9uLCBhdm1fdWludDhfdCBxdWV1ZUNvdW50LAorCQkJYXZtX3NpemVfdCBhQmxvY2tIZWlnaHRQZXJpb2QsIGF2bV9zaXplX3QgYUJsb2NrV2lkdGhQZXJpb2QsCisJCQlhdm1fc2l6ZV90IGFCbG9ja0hlaWdodCwgYXZtX3NpemVfdCBhQmxvY2tXaWR0aCwKKwkJCWF2bV9zaXplX3QgYUhlaWdodExpbWl0LCBhdm1fc2l6ZV90IGFXaWR0aExpbWl0KQorCTogYmFzZV90aGlzX3R5cGUoYUNvbmZpZ3VyYXRpb24sIHF1ZXVlQ291bnQsCisJCQlhQmxvY2tIZWlnaHRQZXJpb2QsIGFCbG9ja1dpZHRoUGVyaW9kLAorCQkJYUJsb2NrSGVpZ2h0LCBhQmxvY2tXaWR0aCwgYUhlaWdodExpbWl0LCBhV2lkdGhMaW1pdCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFBPUCAvIFRPUCAgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJRXhlY3V0aW9uQ29udGV4dCAqIHBvcCgpCisJeworCQlzdGF0aWMgYXZtX3NpemVfdCBjYWxsX2NvdW50ZXIgPSAwOworCQkrK2NhbGxfY291bnRlcjsKKworCQlpZiggV2FpdGluZ0Jhc2ljU3RyYXRlZ3lSRlM6Om1RdWV1ZUNhY2hlLm5vbmVtcHR5KCkgKQorCQl7CisJCQlyZXR1cm4oIFdhaXRpbmdCYXNpY1N0cmF0ZWd5UkZTOjpwb3BGcm9tKAorCQkJCQlXYWl0aW5nQmFzaWNTdHJhdGVneVJGUzo6bVF1ZXVlQ2FjaGUpICk7CisJCX0KKwkJZWxzZSBpZiggV2FpdGluZ0Jhc2ljU3RyYXRlZ3lSRlM6Om1RdWV1ZS5ub25lbXB0eSgpICkKKwkJeworCQkJd2hpbGUoIHRydWUgKQorCQkJeworCQkJCXdoaWxlKCAobUJsb2NrSGVpZ2h0IDwgbUhlaWdodExpbWl0KSB8fAorCQkJCQkJKG1CbG9ja1dpZHRoIDwgbVdpZHRoTGltaXQpICkKKwkJCQl7CisJCQkJCS8vIFJlY2hlcmNoZSBwYXIgYmxvY2sgUkZTIMOgIHBhcnRpciBkJ3VuIHDDqXJpbcOodHJlIGF1Z21lbnTDqSwKKwkJCQkJLy8gIGQndW5lIHRhaWxsZSBkZSBibG9jayBlbiBoYXV0ZXVyIGV0L291IGVuIGxhcmdldXIKKwkJCQkJbUJsb2NrSGVpZ2h0ID0gc3RkOjptaW4obUhlaWdodExpbWl0LAorCQkJCQkJCQltQmxvY2tIZWlnaHQgKyBtQmxvY2tIZWlnaHRQZXJpb2QpOworCisJCQkJCW1CbG9ja1dpZHRoID0gc3RkOjptaW4obVdpZHRoTGltaXQsCisJCQkJCQkJCW1CbG9ja1dpZHRoICsgbUJsb2NrV2lkdGhQZXJpb2QpOworCisJCQkJCUFWTV9PU19DT1VUIDw8ICJ1cGRhdGUgbUJsb2NrU2l6ZVsiIDw8IGNhbGxfY291bnRlciA8PCAiXSA6PiAiCisJCQkJCQkJPDwgIkhbICIgPDwgbVB1c2hIZWlnaHRNaW4gPDwgIiAsICIgPDwgbVB1c2hIZWlnaHRNYXggPDwgIiBdIgorCQkJCQkJCTw8ICIgV1sgIiA8PCBtUHVzaFdpZHRoTWluIDw8ICIgLCAiIDw8IG1QdXNoV2lkdGhNYXggPDwgIiBdIgorCQkJCQkJCTw8ICJoZWlnaHQ6IiA8PCBtQmxvY2tIZWlnaHQKKwkJCQkJCQk8PCAiIHdpZHRoOiIgPDwgbUJsb2NrV2lkdGggPDwgc3RkOjplbmRsOworCisJCQkJCWlmKCB1cGRhdGVRdWV1ZSgpICkKKwkJCQkJeworCQkJCQkJcmV0dXJuKCBXYWl0aW5nQmFzaWNTdHJhdGVneVJGUzo6cG9wRnJvbSgKKwkJCQkJCQkJV2FpdGluZ0Jhc2ljU3RyYXRlZ3lSRlM6Om1RdWV1ZUNhY2hlKSApOworCQkJCQl9CisJCQkJfQorCisvLwkJCQltQ29uZmlndXJhdGlvbi5zYXZlVHJhY2VTcGVjaWZpY2F0aW9uKEFWTV9PU19DT1VUKTsKKy8vCQkJCW1Db25maWd1cmF0aW9uLnNhdmVTY2VuYXJpaSgpOworCisJCQkJLy8gUmVjaGVyY2hlIHBhciBibG9jayBSRlMgw6AgcGFydGlyIGQndW4gcMOpcmltw6h0cmUgYXVnbWVudMOpCisJCQkJLy8gZCd1bmUgdGFpbGxlIGRlIGJsb2NrIGVuIGhhdXRldXIgZXQgZW4gbGFyZ2V1cgorCQkJCS8vIGV0IGVuIGRvdWJsYW50IGxlIHDDqXJpbcOodHJlIGxpbWl0ZQorCQkJCW1CbG9ja0hlaWdodCA9IG1IZWlnaHRMaW1pdCArIG1CbG9ja0hlaWdodFBlcmlvZDsKKwkJCQltQmxvY2tXaWR0aCAgPSBtV2lkdGhMaW1pdCAgKyBtQmxvY2tXaWR0aFBlcmlvZDsKKworCQkJCW1IZWlnaHRMaW1pdCArPSBtSGVpZ2h0TGltaXQ7CisJCQkJbVdpZHRoTGltaXQgICs9IG1XaWR0aExpbWl0OworCisJCQkJQVZNX09TX0NPVVQgPDwgInVwZGF0ZSBtQmxvY2tMaW1pdFsiIDw8IGNhbGxfY291bnRlciA8PCAiXSA6PiAiCisJCQkJCQk8PCAiaGVpZ2h0OiIgPDwgbUhlaWdodExpbWl0CisJCQkJCQk8PCAiIHdpZHRoOiIgPDwgbVdpZHRoTGltaXQKKwkJCQkJCTw8ICIgID09PiAgcmVzZXQgbUJsb2NrU2l6ZSA6PiAiCisJCQkJCQk8PCAiSFsgIiA8PCBtUHVzaEhlaWdodE1pbiA8PCAiICwgIiA8PCBtUHVzaEhlaWdodE1heCA8PCAiIF0iCisJCQkJCQk8PCAiID0+IGhlaWdodDoiIDw8IG1CbG9ja0hlaWdodCA8PCAiIDwtLS0+ICIKKwkJCQkJCTw8ICJXWyAiIDw8IG1QdXNoV2lkdGhNaW4gPDwgIiAsICIgPDwgbVB1c2hXaWR0aE1heCA8PCAiIF0iCisJCQkJCQk8PCAiID0+IHdpZHRoOiIgPDwgbUJsb2NrV2lkdGggPDwgc3RkOjplbmRsOworCisJCQkJaWYoIHVwZGF0ZVF1ZXVlKCkgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCBXYWl0aW5nQmFzaWNTdHJhdGVneVJGUzo6cG9wRnJvbSgKKwkJCQkJCQlXYWl0aW5nQmFzaWNTdHJhdGVneVJGUzo6bVF1ZXVlQ2FjaGUpICk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuKCBOVUxMICk7CisJfQorCit9OworCisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisjZW5kaWYgLyogV0FJVElOR1NUUkFURUdZQkxPQ0tfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9xdWV1ZS9XYWl0aW5nU3RyYXRlZ3lXRUlHSFQuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9xdWV1ZS9XYWl0aW5nU3RyYXRlZ3lXRUlHSFQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjE4NmNkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3F1ZXVlL1dhaXRpbmdTdHJhdGVneVdFSUdIVC5oCkBAIC0wLDAgKzEsMTU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTAgZsOpdnIuIDIwMTMKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBXQUlUSU5HU1RSQVRFR1lXRUlHSFRfSF8KKyNkZWZpbmUgV0FJVElOR1NUUkFURUdZV0VJR0hUX0hfCisKKyNpbmNsdWRlICJXYWl0aW5nU3RyYXRlZ3kuaCIKKworCituYW1lc3BhY2Ugc2VwCit7CisKKwordGVtcGxhdGU8IGNsYXNzIEJhc2ljU3RyYXRlZ3kgPgorY2xhc3MgV2FpdGluZ1N0cmF0ZWd5V0VJR0hUICA6ICBwdWJsaWMgQmFzaWNTdHJhdGVneQoreworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJV2FpdGluZ1N0cmF0ZWd5V0VJR0hUKGF2bV91aW50OF90IHF1ZXVlQ291bnQpCisJOiBCYXNpY1N0cmF0ZWd5KCBxdWV1ZUNvdW50ICksCisJbVB1c2hXZWlnaHRNaW4oIHF1ZXVlQ291bnQgKSwKKwltUHVzaFdlaWdodE1heCggMCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+V2FpdGluZ1N0cmF0ZWd5V0VJR0hUKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFBVU0ggIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlubGluZSB2b2lkIHB1c2goRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpCisJeworCQlCYXNpY1N0cmF0ZWd5Ojp0T2Zmc2V0ID0gYW5FQy0+Z2V0V2VpZ2h0KCk7CisKKwkJQmFzaWNTdHJhdGVneTo6cHVzaChCYXNpY1N0cmF0ZWd5Ojp0T2Zmc2V0LCBhbkVDKTsKKworCQkvLyBGb3IgYWxnbyBvcHRpbWl6YXRpb24KKwkJaWYoIG1QdXNoV2VpZ2h0TWluID4gQmFzaWNTdHJhdGVneTo6dE9mZnNldCApCisJCXsKKwkJCW1QdXNoV2VpZ2h0TWluID0gQmFzaWNTdHJhdGVneTo6dE9mZnNldDsKKwkJfQorCQlpZiggbVB1c2hXZWlnaHRNYXggPCBCYXNpY1N0cmF0ZWd5Ojp0T2Zmc2V0ICkKKwkJeworCQkJbVB1c2hXZWlnaHRNYXggPSBCYXNpY1N0cmF0ZWd5Ojp0T2Zmc2V0OworCQl9CisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gUE9QIC8gVE9QICBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlpbmxpbmUgRXhlY3V0aW9uQ29udGV4dCAqIHBvcCgpCisJeworCQlmb3IoIDsgbVB1c2hXZWlnaHRNaW4gPD0gbVB1c2hXZWlnaHRNYXggOyArK21QdXNoV2VpZ2h0TWluICkKKwkJeworCQkJaWYoIEJhc2ljU3RyYXRlZ3k6Om1RdWV1ZVRhYmxlWyBtUHVzaFdlaWdodE1pbiBdLm5vbmVtcHR5KCkgKQorCQkJeworCQkJCXJldHVybiggQmFzaWNTdHJhdGVneTo6cG9wRnJvbSgKKwkJCQkJCUJhc2ljU3RyYXRlZ3k6Om1RdWV1ZVRhYmxlWyBtUHVzaFdlaWdodE1pbiBdICkgKTsKKwkJCX0KKwkJfQorCisvLwkJZm9yKCBCYXNpY1N0cmF0ZWd5Ojp0T2Zmc2V0ID0gMCA7CisvLwkJCQlCYXNpY1N0cmF0ZWd5Ojp0T2Zmc2V0IDw9IEJhc2ljU3RyYXRlZ3k6Om1RdWV1ZUNvdW50IDsKKy8vCQkJCSsrQmFzaWNTdHJhdGVneTo6dE9mZnNldCApCisvLwkJeworLy8JCQlpZiggQmFzaWNTdHJhdGVneTo6bVF1ZXVlVGFibGVbIEJhc2ljU3RyYXRlZ3k6OnRPZmZzZXQgXS5ub25lbXB0eSgpICkKKy8vCQkJeworLy8JCQkJcmV0dXJuKCBCYXNpY1N0cmF0ZWd5Ojpwb3AoCisvLwkJCQkJCUJhc2ljU3RyYXRlZ3k6Om1RdWV1ZVRhYmxlWyBCYXNpY1N0cmF0ZWd5Ojp0T2Zmc2V0IF0gKSApOworLy8JCQl9CisvLwkJfQorCisJCXJldHVybiggTlVMTCApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgdm9pZCBwb3BUbyhMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgYVJlYWR5UXVldWUpCisJeworCQlmb3IoIDsgbVB1c2hXZWlnaHRNaW4gPD0gbVB1c2hXZWlnaHRNYXggOyArK21QdXNoV2VpZ2h0TWluICkKKwkJeworCQkJaWYoIEJhc2ljU3RyYXRlZ3k6Om1RdWV1ZVRhYmxlWyBtUHVzaFdlaWdodE1pbiBdLm5vbmVtcHR5KCkgKQorCQkJeworCQkJCUJhc2ljU3RyYXRlZ3k6OnBvcFRvKG1QdXNoV2VpZ2h0TWluLCBhUmVhZHlRdWV1ZSk7CisKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCisJaW5saW5lIEV4ZWN1dGlvbkNvbnRleHQgKiB0b3AoKQorCXsKKwkJZm9yKCA7IG1QdXNoV2VpZ2h0TWluIDw9IG1QdXNoV2VpZ2h0TWF4IDsgKyttUHVzaFdlaWdodE1pbiApCisJCXsKKwkJCWlmKCBCYXNpY1N0cmF0ZWd5OjptUXVldWVUYWJsZVsgbVB1c2hXZWlnaHRNaW4gXS5ub25lbXB0eSgpICkKKwkJCXsKKwkJCQlyZXR1cm4oIEJhc2ljU3RyYXRlZ3k6OnRvcEZyb20oCisJCQkJCQlCYXNpY1N0cmF0ZWd5OjptUXVldWVUYWJsZVsgbVB1c2hXZWlnaHRNaW4gXSApICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4oIE5VTEwgKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBQUk9DRVNTT1IgUkVRVUVTVCBBUEkgOj4gUkVRVUVVRQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXZvaWQgaGFuZGxlUmVxdWVzdFJlcXVldWUoQWJzdHJhY3RQcm9jZXNzb3JVbml0ICogYVJlcXVlc3RvcikKKwl7CisJCWFSZXF1ZXN0b3ItPmhhbmRsZVJlcXVlc3RSZXF1ZXVlV2FpdGluZ1RhYmxlKCAqdGhpcywKKwkJCQltUHVzaFdlaWdodE1pbiwgbVB1c2hXZWlnaHRNYXggKTsKKwl9CisKKworCisKK3Byb3RlY3RlZDoKKwkvKkFUVFJJQlVURVMqLworCWF2bV91aW50OF90IG1QdXNoV2VpZ2h0TWluOworCWF2bV91aW50OF90IG1QdXNoV2VpZ2h0TWF4OworCit9OworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworI2VuZGlmIC8qIFdBSVRJTkdTVFJBVEVHWVdFSUdIVF9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3JlZHVuZGFuY3kvQmFzZURhdGFDb21wYXJhdG9yLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9yZWR1bmRhbmN5L0Jhc2VEYXRhQ29tcGFyYXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFhMjU3MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9yZWR1bmRhbmN5L0Jhc2VEYXRhQ29tcGFyYXRvci5jcHAKQEAgLTAsMCArMSwxMjI3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiQmFzZURhdGFDb21wYXJhdG9yLmgiCisKKyNpbmNsdWRlIDxmYW0vcmVkdW5kYW5jeS9SZWR1bmRhbmN5RmlsdGVyLmg+CisKKyNpbmNsdWRlIDxmbWwvYnVmZmVyL0Jhc2VCdWZmZXJGb3JtLmg+CisjaW5jbHVkZSA8Zm1sL2J1ZmZlci9CYXNlQnVmZmVyUXVldWUuaD4KKyNpbmNsdWRlIDxmbWwvYnVmZmVyL1JhbUJ1ZmZlci5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZUZvcm0uaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlUXVlcnkuaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mRGF0YS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZNYWNoaW5lLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29tcGFyZXIuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uRmFjdG9yeS5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uRGF0YS5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL01lc3NhZ2UuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lRm9ybS5oPgorCisjaW5jbHVkZSA8Zm1sL3R5cGUvQmFzZVR5cGVTcGVjaWZpZXIuaD4KKworI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9RdWVyeS5oPgorI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9XT2JqZWN0Lmg+CisKKyNpbmNsdWRlIDxzZXcvQ29uZmlndXJhdGlvbi5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvKioKKyAqIGRlc3Ryb3lNYWNoaW5lRGF0YQorICovCisKK3ZvaWQgQmFzZURhdGFDb21wYXJhdG9yOjpkZXN0cm95TWFjaGluZURhdGEoKQoreworCW1MaXN0T2ZTZWxlY3RlZElPTWFjaGluZS5jbGVhcigpOworCisJbUxpc3RPZkFsbFZhcmlhYmxlLmNsZWFyKCk7CisKKwltTGlzdE9mU2VsZWN0ZWRQcmVzYnVyZ2VyVmFyaWFibGUuY2xlYXIoKTsKKworCW1MaXN0T2ZTZWxlY3RlZE5vblByZXNidXJnZXJWYXJpYWJsZS5jbGVhcigpOworfQorCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorcHJvdG90eXBlIGZpbHRlcjo6cmVkdW5kYW5jeSBhcyBhdm06OmNvcmUuZmlsdGVyLlJFRFVOREFOQ1kgaXMKK3NlY3Rpb24gUFJPUEVSVFkKKwlAcHJlZGljYXRlID0gJ0lOQ0xVU0lPTic7ICAvLyAoIDw9ICB8IElOQyB8IElOQ0xVU0lPTiApCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCA9PSAgfCBFUSAgfCBFUVVBTElUWSApCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCA9YT0gfCBBRVEgfCBBTFBIQV9FUVVJVikKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoID1zPSB8IFNFUSB8IFNZTlRBWElDX0VRVUFMSVRZKQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggPXQ9IHwgVEVRIHwgVFJJVklBTExZX0VRVUFMSVRZKQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PTkUKKworCUBzb2x2ZXIgPSAnT01FR0EnOyAgICAgICAgIC8vIE9NRUdBIHwgQ1ZDMworCisJQHBhdGhfc2NvcGUgPSAnQUxMJzsgICAgICAgLy8gQUxMIHwgQ1VSUkVOVCBleGVjdXRpb24gZ3JhcGggcGF0aAorCisJQGRhdGFfc2NvcGUgPSAnQUxMJzsgICAgICAgLy8gQUxMIGRhdGEgOyBvciBERVRBSUxTIHNlY3Rpb24KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBERVRBSUxTIHwgREVUQUlMUzwgZXhjbHVkZSA+IHNvbWUgZGF0YSwKK2VuZHNlY3Rpb24gUFJPUEVSVFkKKworc2VjdGlvbiBIRVVSSVNUSUMKKwlAY29tbXVuaWNhdGlvbiA9IGZhbHNlOworCisJQHZhcmlhYmxlID0gdHJ1ZTsKKwlAcGF0aF9jb25kaXRpb24gPSBmYWxzZTsKK2VuZHNlY3Rpb24gSEVVUklTVElDCisKK3NlY3Rpb24gREVUQUlMUworCUBtb2RlbCA9IHVmaTsKKworCUBpbnN0YW5jZSA9IHVmaTsKKworCUB2YXJpYWJsZSA9IHVmaTsKK2VuZHNlY3Rpb24gREVUQUlMUworZW5kcHJvdG90eXBlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoqCisgKiBDT05GSUdVUkUKKyAqLworYm9vbCBCYXNlRGF0YUNvbXBhcmF0b3I6OmNvbmZpZ3VyZShXT2JqZWN0ICogd2ZQYXJhbWV0ZXJPYmplY3QpCit7CisJY29uc3QgRXhlY3V0aW9uRGF0YSAmIHRoZUVEID0gbUNvbmZpZ3VyYXRpb24uZ2V0TWFpbkV4ZWN1dGlvbkRhdGEoKTsKKworCW1NYWNoaW5lQ291bnQgPSB0aGVFRC5nZXRUYWJsZU9mUnVudGltZSgpLnNpemUoKTsKKworCVdPYmplY3QgKiB0aGVQUk9QRVJUWSA9CisJCVJlZHVuZGFuY3lGaWx0ZXI6OkFVVE9fUkVHSVNURVJfVE9PTC5pc1R5cGVJRCggKndmUGFyYW1ldGVyT2JqZWN0ICkKKwkJCT8gUXVlcnk6OmdldFJlZ2V4V1NlcXVlbmNlKHdmUGFyYW1ldGVyT2JqZWN0LAorCQkJCQlPUl9XSUQyKCJwcm9wZXJ0eSIsICJQUk9QRVJUWSIpLCB3ZlBhcmFtZXRlck9iamVjdCkKKwkJCTogUXVlcnk6OmdldFJlZ2V4V1NlcXVlbmNlKHdmUGFyYW1ldGVyT2JqZWN0LAorCQkJCQlPUl9XSUQyKCJyZWR1bmRhbmN5IiAsICJSRURVTkRBTkNZIiksIHdmUGFyYW1ldGVyT2JqZWN0KTsKKworCXN0ZDo6c3RyaW5nIHBhdGhfc2NvcGUgPSBRdWVyeTo6Z2V0UmVnZXhXUHJvcGVydHlTdHJpbmcoCisJCQkJCXRoZVBST1BFUlRZLCBDT05TX1dJRDIoInBhdGgiLCAic2NvcGUiKSwgIkFMTCIpOworCW1DdXJyZW50UGF0aFNjb3BlRmxhZyA9CisJCQkoIChwYXRoX3Njb3BlID09ICJDVVJSRU5UIikgfHwgKHBhdGhfc2NvcGUgPT0gIlBBUkVOVCIpICk7CisKKwlzdGQ6OnN0cmluZyBkYXRhX3Njb3BlID0gUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5U3RyaW5nKAorCQkJdGhlUFJPUEVSVFksIENPTlNfV0lEMigiZGF0YSIsICJzY29wZSIpLCAiQUxMIik7CisKKworCVdPYmplY3QgKiB0aGVIRVVSSVNUSUMgPQorCQlSZWR1bmRhbmN5RmlsdGVyOjpBVVRPX1JFR0lTVEVSX1RPT0wuaXNUeXBlSUQoICp3ZlBhcmFtZXRlck9iamVjdCApCisJCQk/IFF1ZXJ5OjpnZXRSZWdleFdTZXF1ZW5jZSh3ZlBhcmFtZXRlck9iamVjdCwKKwkJCQkJT1JfV0lEMigiaGV1cmlzdGljIiwgIkhFVVJJU1RJQyIpLCB0aGVQUk9QRVJUWSkKKwkJCTogUXVlcnk6OmdldFJlZ2V4V1NlcXVlbmNlKHdmUGFyYW1ldGVyT2JqZWN0LAorCQkJCQlPUl9XSUQyKCJyZWR1bmRhbmN5IiAsICJSRURVTkRBTkNZIiksIHRoZVBST1BFUlRZKTsKKworCWlmKCB0aGVIRVVSSVNUSUMgIT0gV09iamVjdDo6X05VTExfICkKKwl7CisJCW1Vc2VDb21tdW5pY2F0aW9uID0gUXVlcnk6OmdldFdQcm9wZXJ0eUJvb2xlYW4oCisJCQkJdGhlSEVVUklTVElDLCAiY29tbXVuaWNhdGlvbiIsIHRydWUpOworCisJCW1Vc2VWYXJpYWJsZSA9IFF1ZXJ5OjpnZXRXUHJvcGVydHlCb29sZWFuKAorCQkJCXRoZUhFVVJJU1RJQywgInZhcmlhYmxlIiwgdHJ1ZSk7CisKKwkJbUlnbm9yZVBhdGhDb25kaXRpb24gPSBub3QgUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5Qm9vbGVhbigKKwkJCQl0aGVIRVVSSVNUSUMsIENPTlNfV0lEMigicGF0aCIsICJjb25kaXRpb24iKSwgdHJ1ZSk7CisJfQorCisKKwlpZiggZGF0YV9zY29wZSA9PSAiQUxMIiApCisJeworCQljb21wdXRlQWxsTWFjaGluZURhdGEodGhlRUQpOworCX0KKwkvLyBUT0RPIGNvbmZpZ3VyZSBmb3IgQGRhdGFfc2NvcGUgPSAnREVUQUlMUyc7CisJZWxzZSBpZiggU3RyaW5nVG9vbHM6OnN0YXJ0c1dpdGgoZGF0YV9zY29wZSwgIkRFVEFJTFMiKSApCisJeworCQlXT2JqZWN0ICogdGhlREVUQUlMUyA9CisJCQlSZWR1bmRhbmN5RmlsdGVyOjpBVVRPX1JFR0lTVEVSX1RPT0wuaXNUeXBlSUQoICp3ZlBhcmFtZXRlck9iamVjdCApCisJCQkJPyBRdWVyeTo6Z2V0UmVnZXhXU2VxdWVuY2Uod2ZQYXJhbWV0ZXJPYmplY3QsCisJCQkJCQlPUl9XSUQyKCJkZXRhaWxzIiwgIkRFVEFJTFMiKSwgdGhlUFJPUEVSVFkpCisJCQkJOiBRdWVyeTo6Z2V0UmVnZXhXU2VxdWVuY2Uod2ZQYXJhbWV0ZXJPYmplY3QsCisJCQkJCQlPUl9XSUQyKCJyZWR1bmRhbmN5IiAsICJSRURVTkRBTkNZIiksIHRoZVBST1BFUlRZKTsKKworCQlpZiggdGhlREVUQUlMUyAhPSBXT2JqZWN0OjpfTlVMTF8gKQorCQl7CisJCQlFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZSA9IE5VTEw7CisJCQlJbnN0YW5jZU9mTWFjaGluZSAqIGFNYWNoaW5lID0gTlVMTDsKKwkJCUluc3RhbmNlT2ZEYXRhICogYVZhcmlhYmxlID0gTlVMTDsKKworCQkJTGlzdE9mRXhlY3V0YWJsZUZvcm0gbGlzdE9mRXhlY3V0YWJsZTsKKwkJCUxpc3RPZkluc3RhbmNlT2ZNYWNoaW5lIGxpc3RPZkluc3RhbmNlOworCQkJTGlzdE9mSW5zdGFuY2VPZkRhdGEgbGlzdE9mVmFyaWFibGU7CisKKwkJCUV4ZWN1dGFibGVRdWVyeSBYUXVlcnkoIG1Db25maWd1cmF0aW9uICk7CisKKwkJCVdPYmplY3Q6OmNvbnN0X2l0ZXJhdG9yIGl0V2ZPID0gdGhlREVUQUlMUy0+b3duZWRfYmVnaW4oKTsKKwkJCVdPYmplY3Q6OmNvbnN0X2l0ZXJhdG9yIGVuZFdmTyA9IHRoZURFVEFJTFMtPm93bmVkX2VuZCgpOworCQkJZm9yKCA7IGl0V2ZPICE9IGVuZFdmTyA7ICsraXRXZk8gKQorCQkJeworCQkJCWlmKCAoKml0V2ZPKS0+aXNXUHJvcGVydHkoKSApCisJCQkJeworCQkJCQljb25zdCBzdGQ6OnN0cmluZyAmIGtpbmQgPSAoKml0V2ZPKS0+Z2V0TmFtZUlEKCk7CisJCQkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgcW5pZCA9ICgqaXRXZk8pLT50b1N0cmluZ1ZhbHVlKCk7CisKKworCQkJCQlpZiggKGtpbmQgPT0gIm1vZGVsIikgfHwgKGtpbmQgPT0gImZvcm0iKSApCisJCQkJCXsKKwkJCQkJCWFuRXhlY3V0YWJsZSA9IFhRdWVyeS5nZXRFeGVjdXRhYmxlKAorCQkJCQkJCQlxbmlkICkudG9fcHRyPCBFeGVjdXRhYmxlRm9ybSA+KCk7CisJCQkJCQlpZiggYW5FeGVjdXRhYmxlICE9IE5VTEwgKQorCQkJCQkJeworCQkJCQkJCWxpc3RPZkV4ZWN1dGFibGUuYXBwZW5kKGFuRXhlY3V0YWJsZSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJQVZNX09TX1dBUk4gPDwgIlVuZm91bmQgdGhlIG1hY2hpbmUgIgorCQkJCQkJCQk8PCBraW5kIDw8ICIgPDwgIiA8PCBxbmlkCisJCQkJCQkJCTw8ICIgPj4gYXMgcHJvY2Vzc29yIHBhcmFtZXRlcjo+ICIKKwkJCQkJCQkJPDwgd2ZQYXJhbWV0ZXJPYmplY3QtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKwkJCQkJCQkJPDwgc3RkOjplbmRsOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UgaWYoIGtpbmQgPT0gImluc3RhbmNlIiApCisJCQkJCXsKKwkJCQkJCWFNYWNoaW5lID0gWFF1ZXJ5LmdldE1hY2hpbmUoCisJCQkJCQkJU3BlY2lmaWVyOjpERVNJR05fSU5TVEFOQ0VfS0lORCwgcW5pZCkucmF3TWFjaGluZSgpOworCQkJCQkJaWYoIGFNYWNoaW5lICE9IE5VTEwgKQorCQkJCQkJeworCQkJCQkJCWxpc3RPZkluc3RhbmNlLmFwcGVuZChhTWFjaGluZSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJQVZNX09TX1dBUk4gPDwgIlVuZm91bmQgdGhlIG1hY2hpbmUgIgorCQkJCQkJCQk8PCBraW5kIDw8ICIgPDwgIiA8PCBxbmlkCisJCQkJCQkJCTw8ICIgPj4gYXMgcHJvY2Vzc29yIHBhcmFtZXRlcjo+ICIKKwkJCQkJCQkJPDwgd2ZQYXJhbWV0ZXJPYmplY3QtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKwkJCQkJCQkJPDwgc3RkOjplbmRsOworCQkJCQkJfQorCQkJCQl9CisJCQkJCS8vIFRPRE86IMOgIGZhaXJlIHBvdXIgbGVzIHZhcmlhYmxlcy4KKwkJCQkJZWxzZSBpZigga2luZCA9PSAidmFyaWFibGUiICkKKwkJCQkJeworCQkJCQkJYVZhcmlhYmxlID0gWFF1ZXJ5LmdldERhdGEoCisJCQkJCQkJCXFuaWQgKS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKTsKKwkJCQkJCWlmKCBhVmFyaWFibGUgIT0gTlVMTCApCisJCQkJCQl7CisJCQkJCQkJbGlzdE9mVmFyaWFibGUuYXBwZW5kKGFWYXJpYWJsZSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJQVZNX09TX1dBUk4gPDwgIlVuZm91bmQgdGhlICIgPDwga2luZCA8PCAiIDw8ICIKKwkJCQkJCQkJPDwgcW5pZCA8PCAiID4+IGFzIHByb2Nlc3NvciBwYXJhbWV0ZXI6PiAiCisJCQkJCQkJCTw8IHdmUGFyYW1ldGVyT2JqZWN0LT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQkJCQkJCTw8IHN0ZDo6ZW5kbDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCUFWTV9PU19XQVJOIDw8ICJVbmV4cGVjdGVkIGF0dHJpYnV0ZSA8PCAiCisJCQkJCQkJPDwgKCppdFdmTyktPnN0cigpIDw8ICIgPj4gYXMgcHJvY2Vzc29yIHBhcmFtZXRlcjo+ICIKKwkJCQkJCQk8PCB3ZlBhcmFtZXRlck9iamVjdC0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJCQkJCTw8IHN0ZDo6ZW5kbDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCisJCQlpZiggZGF0YV9zY29wZS5maW5kKCJleGNsdWRlIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorCQkJeworCQkJCWNvbXB1dGVEZXRhaWxzRXhjbHVkZU1hY2hpbmVEYXRhKHRoZUVELAorCQkJCQkJbGlzdE9mRXhlY3V0YWJsZSwgbGlzdE9mSW5zdGFuY2UsIGxpc3RPZlZhcmlhYmxlKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQljb21wdXRlRGV0YWlsc0luY2x1ZGVNYWNoaW5lRGF0YSh0aGVFRCwKKwkJCQkJCWxpc3RPZkV4ZWN1dGFibGUsIGxpc3RPZkluc3RhbmNlLCBsaXN0T2ZWYXJpYWJsZSk7CisJCQl9CisKKwkJfQorCQllbHNlCisJCXsKKwkJCUFWTV9PU19XQVJOIDw8ICJVbmZvdW5kIHNlY3Rpb24gPDwgREVUQUlMUyA+PiBhcyByZWR1bmRhbmN5ICIKKwkJCQkJImRldGVjdG9yIHBhcmFtZXRlciIgPDwgc3RkOjplbmRsOworCQl9CisJfQorCWVsc2UKKwl7CisJCUFWTV9PU19FUlJPUl9BTEVSVCA8PCAiVW5leHBlY3RlZCBSRURVTkRBTkNZIGZpbHRlciA8PCBAZGF0YV9zY29wZSA9ICIKKwkJCQk8PCBkYXRhX3Njb3BlIDw8ICI7ID4+ICEhISIgPDwgc3RkOjplbmRsCisJCQkJPDwgIk5CLiA8PCBAZGF0YV9zY29wZSA9IHtbICdBTEwnIHwgJ0RFVEFJTFMnIF19OyA+PiAhISEiCisJCQkJPDwgU0VORF9BTEVSVDsKKworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKwordm9pZCBCYXNlRGF0YUNvbXBhcmF0b3I6OmNvbXB1dGVBbGxNYWNoaW5lRGF0YShjb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCkKK3sKKwlkZXN0cm95TWFjaGluZURhdGEoKTsKKworCXNlbGVjdElPTWFjaGluZShhbkVELCBtTGlzdE9mU2VsZWN0ZWRJT01hY2hpbmUpOworCisJc2VsZWN0QWxsVmFyaWFibGUoYW5FRCwgbUxpc3RPZkFsbFZhcmlhYmxlKTsKKworCXNlbGVjdFByZXNidXJnZXJWYXJpYWJsZShhbkVELCBtTGlzdE9mU2VsZWN0ZWRQcmVzYnVyZ2VyVmFyaWFibGUpOworCisJc2VsZWN0Tm9uUHJlc2J1cmdlclZhcmlhYmxlKGFuRUQsIG1MaXN0T2ZTZWxlY3RlZE5vblByZXNidXJnZXJWYXJpYWJsZSk7Cit9CisKKworCisKK3ZvaWQgQmFzZURhdGFDb21wYXJhdG9yOjpjb21wdXRlRGV0YWlsc0luY2x1ZGVNYWNoaW5lRGF0YSgKKwkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQsCisJCUxpc3RPZkV4ZWN1dGFibGVGb3JtICYgbGlzdE9mRXhlY3V0YWJsZSwKKwkJTGlzdE9mSW5zdGFuY2VPZk1hY2hpbmUgJiBsaXN0T2ZJbnN0YW5jZSwKKwkJTGlzdE9mSW5zdGFuY2VPZkRhdGEgJiBsaXN0T2ZWYXJpYWJsZSkKK3sKKwlkZXN0cm95TWFjaGluZURhdGEoKTsKKworCS8vIFRPRE86IHLDqcOpY3JpcmUgbGVzIDQgbcOpdGhvZGVzIHN1aXZhbnRlcyBwb3VyIHByZW5kcmUgZW4gY29tcHRlIGxlcworCS8vIERFVEFJTFMgY29udGVudXMgZGFucyBsZXMgZGV1eCBwYXJhbcOodHJlcyBhZGRpdGlvbm5lbHMgcGFyIHJhcHBvcnQgYXUgY2FzIEFMTDoKKworCXNlbGVjdERldGFpbHNJT01hY2hpbmUoYW5FRCwgbUxpc3RPZlNlbGVjdGVkSU9NYWNoaW5lLAorCQkJbGlzdE9mRXhlY3V0YWJsZSwgbGlzdE9mSW5zdGFuY2UpOworCisJc2VsZWN0RGV0YWlsc1ZhcmlhYmxlKGFuRUQsIG1MaXN0T2ZBbGxWYXJpYWJsZSwKKwkJCWxpc3RPZkV4ZWN1dGFibGUsIGxpc3RPZkluc3RhbmNlLCBsaXN0T2ZWYXJpYWJsZSk7CisKKwlzZWxlY3REZXRhaWxzUHJlc2J1cmdlclZhcmlhYmxlKGFuRUQsIG1MaXN0T2ZTZWxlY3RlZFByZXNidXJnZXJWYXJpYWJsZSwKKwkJCWxpc3RPZkV4ZWN1dGFibGUsIGxpc3RPZkluc3RhbmNlLCBsaXN0T2ZWYXJpYWJsZSk7CisKKwlzZWxlY3REZXRhaWxzTm9uUHJlc2J1cmdlclZhcmlhYmxlKAorCQkJYW5FRCwgbUxpc3RPZlNlbGVjdGVkTm9uUHJlc2J1cmdlclZhcmlhYmxlLAorCQkJbGlzdE9mRXhlY3V0YWJsZSwgbGlzdE9mSW5zdGFuY2UsIGxpc3RPZlZhcmlhYmxlKTsKKworCWlmKCBtTGlzdE9mQWxsVmFyaWFibGUuZW1wdHkoKSApCisJeworLy8JCUFWTV9PU19XQVJOSU5HX0FMRVJUCisvLwkJCQk8PCAiQXR0ZW50aW9uIGxhIGxpc3RlIGRlcyB2YXJpYWJsZXMgdXRpbGlzw6llcyBwb3VyIGxlICIKKy8vCQkJCQkiY2FsY3VsIGRlIGxhIHJlZG9uZGFuY2UgZXN0IHZpZGUgKGNhcyBERVRBSUxTKSAhISEiCisvLwkJCQk8PCBTRU5EX0FMRVJUOworCX0KK30KKworCitzdGF0aWMgdm9pZCBleGNsdWRlVmFyaWFibGUoTGlzdE9mUGFpck1hY2hpbmVEYXRhICYgaW5jbHVkZUxpc3RPZlZhcmlhYmxlLAorCQlMaXN0T2ZFeGVjdXRhYmxlRm9ybSAmIGV4Y2x1ZGVMaXN0T2ZFeGVjdXRhYmxlLAorCQlMaXN0T2ZJbnN0YW5jZU9mTWFjaGluZSAmIGV4Y2x1ZGVMaXN0T2ZJbnN0YW5jZSwKKwkJTGlzdE9mSW5zdGFuY2VPZkRhdGEgJiBleGNsdWRlTGlzdE9mVmFyaWFibGUpCit7CisJTGlzdE9mRXhlY3V0YWJsZUZvcm06Oml0ZXJhdG9yIGl0RXhlYzsKKwlMaXN0T2ZFeGVjdXRhYmxlRm9ybTo6aXRlcmF0b3IgZW5kRXhlYzsKKworCUxpc3RPZkluc3RhbmNlT2ZNYWNoaW5lOjppdGVyYXRvciBpdFJGOworCUxpc3RPZkluc3RhbmNlT2ZNYWNoaW5lOjppdGVyYXRvciBlbmRSRjsKKworCUxpc3RPZkluc3RhbmNlT2ZEYXRhOjppdGVyYXRvciBpdFZhcjsKKwlMaXN0T2ZJbnN0YW5jZU9mRGF0YTo6aXRlcmF0b3IgZW5kVmFyOworCisJYm9vbCBoYXNFcmFzZU5vdGhpbmc7CisKKwlMaXN0T2ZQYWlyTWFjaGluZURhdGE6Oml0ZXJhdG9yIGl0UGFpck1hY2hpbmVEYXRhID0gaW5jbHVkZUxpc3RPZlZhcmlhYmxlLmJlZ2luKCk7CisJZm9yKCA7IGl0UGFpck1hY2hpbmVEYXRhICE9IGluY2x1ZGVMaXN0T2ZWYXJpYWJsZS5lbmQoKSA7ICkKKwl7CisJCWhhc0VyYXNlTm90aGluZyA9IHRydWU7CisKKwkJaXRFeGVjID0gZXhjbHVkZUxpc3RPZkV4ZWN1dGFibGUuYmVnaW4oKTsKKwkJZW5kRXhlYyA9IGV4Y2x1ZGVMaXN0T2ZFeGVjdXRhYmxlLmVuZCgpOworCQlmb3IoIDsgaXRFeGVjICE9IGVuZEV4ZWMgOyArK2l0RXhlYyApCisJCXsKKwkJCWlmKCAoKml0UGFpck1hY2hpbmVEYXRhKS5maXJzdCgpLmdldEV4ZWN1dGFibGUoKSA9PSAoKml0RXhlYykgKQorCQkJeworCQkJCWl0UGFpck1hY2hpbmVEYXRhID0gaW5jbHVkZUxpc3RPZlZhcmlhYmxlLmVyYXNlKGl0UGFpck1hY2hpbmVEYXRhKTsKKwkJCQloYXNFcmFzZU5vdGhpbmcgPSBmYWxzZTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCWl0UkYgPSBleGNsdWRlTGlzdE9mSW5zdGFuY2UuYmVnaW4oKTsKKwkJZW5kUkYgPSBleGNsdWRlTGlzdE9mSW5zdGFuY2UuZW5kKCk7CisJCWZvciggOyBpdFJGICE9IGVuZFJGIDsgKytpdFJGICkKKwkJeworCQkJaWYoICgqaXRQYWlyTWFjaGluZURhdGEpLmZpcnN0KCkuZ2V0SW5zdGFuY2UoKSA9PSAoKml0UkYpICkKKwkJCXsKKwkJCQlpdFBhaXJNYWNoaW5lRGF0YSA9IGluY2x1ZGVMaXN0T2ZWYXJpYWJsZS5lcmFzZShpdFBhaXJNYWNoaW5lRGF0YSk7CisJCQkJaGFzRXJhc2VOb3RoaW5nID0gZmFsc2U7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQlpdFZhciA9IGV4Y2x1ZGVMaXN0T2ZWYXJpYWJsZS5iZWdpbigpOworCQllbmRWYXIgPSBleGNsdWRlTGlzdE9mVmFyaWFibGUuZW5kKCk7CisJCWZvciggOyBpdFZhciAhPSBlbmRWYXIgOyArK2l0VmFyICkKKwkJeworCQkJKCppdFBhaXJNYWNoaW5lRGF0YSkuc2Vjb25kKCkucmVtb3ZlKCAoKml0VmFyKSApOworCQkJaWYoICgqaXRQYWlyTWFjaGluZURhdGEpLnNlY29uZCgpLmVtcHR5KCkgKQorCQkJeworCQkJCWl0UGFpck1hY2hpbmVEYXRhID0gaW5jbHVkZUxpc3RPZlZhcmlhYmxlLmVyYXNlKGl0UGFpck1hY2hpbmVEYXRhKTsKKwkJCQloYXNFcmFzZU5vdGhpbmcgPSBmYWxzZTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCWlmKCBoYXNFcmFzZU5vdGhpbmcgKQorCQl7CisJCQkrK2l0UGFpck1hY2hpbmVEYXRhOworCQl9CisJfQorfQorCisKK3ZvaWQgQmFzZURhdGFDb21wYXJhdG9yOjpjb21wdXRlRGV0YWlsc0V4Y2x1ZGVNYWNoaW5lRGF0YSgKKwkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQsCisJCUxpc3RPZkV4ZWN1dGFibGVGb3JtICYgbGlzdE9mRXhlY3V0YWJsZSwKKwkJTGlzdE9mSW5zdGFuY2VPZk1hY2hpbmUgJiBsaXN0T2ZJbnN0YW5jZSwKKwkJTGlzdE9mSW5zdGFuY2VPZkRhdGEgJiBsaXN0T2ZWYXJpYWJsZSkKK3sKKwljb21wdXRlQWxsTWFjaGluZURhdGEoYW5FRCk7CisKKwlleGNsdWRlVmFyaWFibGUobUxpc3RPZkFsbFZhcmlhYmxlLAorCQkJbGlzdE9mRXhlY3V0YWJsZSwgbGlzdE9mSW5zdGFuY2UsIGxpc3RPZlZhcmlhYmxlKTsKKworCWV4Y2x1ZGVWYXJpYWJsZShtTGlzdE9mU2VsZWN0ZWRQcmVzYnVyZ2VyVmFyaWFibGUsCisJCQlsaXN0T2ZFeGVjdXRhYmxlLCBsaXN0T2ZJbnN0YW5jZSwgbGlzdE9mVmFyaWFibGUpOworCisJZXhjbHVkZVZhcmlhYmxlKG1MaXN0T2ZTZWxlY3RlZE5vblByZXNidXJnZXJWYXJpYWJsZSwKKwkJCWxpc3RPZkV4ZWN1dGFibGUsIGxpc3RPZkluc3RhbmNlLCBsaXN0T2ZWYXJpYWJsZSk7CisKK30KKworCisKKworCit2b2lkIEJhc2VEYXRhQ29tcGFyYXRvcjo6c2VsZWN0SU9NYWNoaW5lKGNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVELAorCQlMaXN0PCBSdW50aW1lSUQgPiAmIGFMaXN0T2ZTZWxlY3RlZElPTWFjaGluZSkKK3sKKwlUYWJsZU9mUnVudGltZVQ6OmNvbnN0X2l0ZXJhdG9yIGl0UkYgPSBhbkVELmdldFRhYmxlT2ZSdW50aW1lKCkuYmVnaW4oKTsKKwlUYWJsZU9mUnVudGltZVQ6OmNvbnN0X2l0ZXJhdG9yIGl0UkZFbmQgPSBhbkVELmdldFRhYmxlT2ZSdW50aW1lKCkuZW5kKCk7CisJZm9yKCBSdW50aW1lSUQgaXRSSUQgOyBpdFJGICE9IGl0UkZFbmQgOyArK2l0UkYgKQorCXsKKwkJaXRSSUQgPSAoKml0UkYpLT5nZXRSSUQoKTsKKworCQlpZiggaXRSSUQuZ2V0RXhlY3V0YWJsZSgpLT5oYXNCdWZmZXIoKSApCisJCXsKKwkJCWFMaXN0T2ZTZWxlY3RlZElPTWFjaGluZS5hcHBlbmQoIGl0UklEICk7CisJCX0KKwl9Cit9CisKK3ZvaWQgQmFzZURhdGFDb21wYXJhdG9yOjpzZWxlY3REZXRhaWxzSU9NYWNoaW5lKAorCQljb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwKKwkJTGlzdDwgUnVudGltZUlEID4gJiBhTGlzdE9mU2VsZWN0ZWRJT01hY2hpbmUsCisJCUxpc3RPZkV4ZWN1dGFibGVGb3JtICYgbGlzdE9mRXhlY3V0YWJsZSwKKwkJTGlzdE9mSW5zdGFuY2VPZk1hY2hpbmUgJiBsaXN0T2ZJbnN0YW5jZSkKK3sKKwlUYWJsZU9mUnVudGltZVQ6OmNvbnN0X2l0ZXJhdG9yIGl0UkYgPSBhbkVELmdldFRhYmxlT2ZSdW50aW1lKCkuYmVnaW4oKTsKKwlUYWJsZU9mUnVudGltZVQ6OmNvbnN0X2l0ZXJhdG9yIGl0UkZFbmQgPSBhbkVELmdldFRhYmxlT2ZSdW50aW1lKCkuZW5kKCk7CisJZm9yKCBSdW50aW1lSUQgaXRSSUQgOyBpdFJGICE9IGl0UkZFbmQgOyArK2l0UkYgKQorCXsKKwkJaXRSSUQgPSAoKml0UkYpLT5nZXRSSUQoKTsKKworCQlpZiggaXRSSUQuZ2V0RXhlY3V0YWJsZSgpLT5oYXNCdWZmZXIoKQorCQkJJiYgKCBsaXN0T2ZFeGVjdXRhYmxlLmNvbnRhaW5zKGl0UklELmdldEV4ZWN1dGFibGUoKSkKKwkJCQl8fCBsaXN0T2ZJbnN0YW5jZS5jb250YWlucyhpdFJJRC5nZXRJbnN0YW5jZSgpKSApICkKKwkJeworCQkJYUxpc3RPZlNlbGVjdGVkSU9NYWNoaW5lLmFwcGVuZCggaXRSSUQgKTsKKwkJfQorCX0KK30KKwordm9pZCBCYXNlRGF0YUNvbXBhcmF0b3I6OnNlbGVjdEFsbFZhcmlhYmxlKGNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVELAorCQlMaXN0T2ZQYWlyTWFjaGluZURhdGEgJiBhTGlzdE9mU2VsZWN0ZWRWYXJpYWJsZSkKK3sKKwlUYWJsZU9mSW5zdGFuY2VPZkRhdGE6OmNvbnN0X3Jhd19pdGVyYXRvciBpdFZhcjsKKwlUYWJsZU9mSW5zdGFuY2VPZkRhdGE6OmNvbnN0X3Jhd19pdGVyYXRvciBpdFZhckVuZDsKKworCVRhYmxlT2ZSdW50aW1lVDo6Y29uc3RfaXRlcmF0b3IgaXRSRiA9IGFuRUQuZ2V0VGFibGVPZlJ1bnRpbWUoKS5iZWdpbigpOworCVRhYmxlT2ZSdW50aW1lVDo6Y29uc3RfaXRlcmF0b3IgaXRSRkVuZCA9IGFuRUQuZ2V0VGFibGVPZlJ1bnRpbWUoKS5lbmQoKTsKKwlmb3IoIFJ1bnRpbWVGb3JtICogcFJGID0gTlVMTCA7IGl0UkYgIT0gaXRSRkVuZCA7ICsraXRSRiApCisJeworCQlwUkYgPSAoKml0UkYpOworCisJCWlmKCBwUkYtPmdldEV4ZWN1dGFibGUoKS0+aGFzRGF0YSgpICkKKwkJeworCQkJYUxpc3RPZlNlbGVjdGVkVmFyaWFibGUuYXBwZW5kKCBQYWlyTWFjaGluZURhdGEocFJGLT5nZXRSSUQoKSkgKTsKKwkJCUxpc3RPZkluc3RhbmNlT2ZEYXRhICYgbGlzdE9mRGF0YSA9CisJCQkJCWFMaXN0T2ZTZWxlY3RlZFZhcmlhYmxlLmxhc3QoKS5zZWNvbmQoKTsKKworCQkJaXRWYXIgPSBwUkYtPmdldFZhcmlhYmxlcygpLmJlZ2luKCk7CisJCQlpdFZhckVuZCA9IHBSRi0+Z2V0VmFyaWFibGVzKCkuZW5kKCk7CisJCQlmb3IoIDsgaXRWYXIgIT0gaXRWYXJFbmQgOyArK2l0VmFyICkKKwkJCXsKKwkJCQlsaXN0T2ZEYXRhLmFwcGVuZCggKGl0VmFyKSApOworCQkJfQorCisJCQlpZiggbGlzdE9mRGF0YS5lbXB0eSgpICkKKwkJCXsKKwkJCQlhTGlzdE9mU2VsZWN0ZWRWYXJpYWJsZS5wb3BfbGFzdCgpOworCQkJfQorCQl9CisJfQorfQorCisKKy8vIHRvZG86IGNvbGxlY3RlciB0b3V0ZXMgbGVzIHZhcmlhYmxlcyBkYW5zIGxlcyBzb3VzLW1hY2hpbmVzIC4uLgorLy92b2lkICBCYXNlRGF0YUNvbXBhcmF0b3I6OmNvbGxlY3REZXRhaWxzVmFyaWFibGVzKGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsCisvLwkJTGlzdE9mUGFpck1hY2hpbmVEYXRhICYgYUxpc3RPZlNlbGVjdGVkVmFyaWFibGUsCisvLwkJTGlzdE9mRXhlY3V0YWJsZUZvcm0gJiBsaXN0T2ZFeGVjdXRhYmxlLAorLy8JCUxpc3RPZkluc3RhbmNlT2ZNYWNoaW5lICYgbGlzdE9mSW5zdGFuY2UpCisvL3sKKy8vCVBhaXJNYWNoaW5lRGF0YSAqIHRtcFBhaXJNYWNoaW5lRGF0YSA9IG5ldyBQYWlyTWFjaGluZURhdGEoYVJJRCk7CisvLwlUYWJsZU9mSW5zdGFuY2VPZkRhdGE6OmNvbnN0X3Jhd19pdGVyYXRvciBpdFZhciA9IGFSSUQtPmdldFZhcmlhYmxlcygpLmJlZ2luKCk7CisvLwlUYWJsZU9mSW5zdGFuY2VPZkRhdGE6OmNvbnN0X3Jhd19pdGVyYXRvciBpdFZhckVuZCA9IGFSSUQtPmdldFZhcmlhYmxlcygpLmVuZCgpOworLy8JZm9yKCA7IGl0VmFyICE9IGl0VmFyRW5kIDsgKytpdFZhciApCisvLwl7CisvLwkJaWYoIChpdERhdGEpLT5hbnlNb2RpZmllck9mU3RhdGVEYXRhKCkKKy8vCQkJJiYgKGl0RGF0YSktPmhhc1R5cGVTcGVjaWZpZXIoKQorLy8JCQkmJiAoKGl0RGF0YSktPmlzVHlwZWROdW1lcmljKCkKKy8vCQkJCXx8IChpdERhdGEpLT5pc1R5cGVkRW51bWVyYXRpb24oKSkgKQorLy8JCXsKKy8vCQkJdG1wUGFpck1hY2hpbmVEYXRhLT5zZWNvbmQoKS5hcHBlbmQoIChpdERhdGEpICk7CisvLwkJfQorLy8JfQorLy8JaWYoIHRtcFBhaXJNYWNoaW5lRGF0YS0+c2Vjb25kKCkubm9uZW1wdHkoKSApCisvLwl7CisvLwkJYUxpc3RPZlNlbGVjdGVkVmFyaWFibGUuYXBwZW5kKHRtcFBhaXJNYWNoaW5lRGF0YSk7CisvLwl9CisvLwllbHNlCisvLwl7CisvLwkJZGVsZXRlKCB0bXBQYWlyTWFjaGluZURhdGEgKTsKKy8vCX0KKy8vCVRhYmxlT2ZSdW50aW1lSUQ6Oml0ZXJhdG9yIGl0UmVjUklEID0gKCppdG1hY2hpbmUpLT5iZWdpbkNoaWxkVGFibGUoKSA7CisvLwlUYWJsZU9mUnVudGltZUlEOjppdGVyYXRvciBpdFJlY0VuZCA9ICgqaXRtYWNoaW5lKS0+ZW5kQ2hpbGRUYWJsZSgpIDsKKy8vCWZvciggOyBpdFJlY1JJRCAhPSBpdFJlY0VuZCA7ICsraXRSZWNSSUQgKQorLy8JeworLy8JCS8vaXRSZWNNYWNoaW5lCisvLwl9CisvL30KKworCisKK2F2bV9zaXplX3QgQmFzZURhdGFDb21wYXJhdG9yOjpzZWxlY3RWYXJpYWJsZSgKKwkJTGlzdE9mSW5zdGFuY2VPZkRhdGEgJiBsaXN0T2ZEYXRhLCBJbnN0YW5jZU9mRGF0YSAqIHBEYXRhKQoreworCWlmKCBwRGF0YS0+Z2V0TW9kaWZpZXIoKS5hbnlNb2RpZmllck9mU3RhdGVEYXRhKCkgKQorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKCBwRGF0YS0+aGFzVHlwZVNwZWNpZmllcigpICkKKwkJCQk8PCAiVW5leHBlY3RlZCB2YXJpYWJsZSA8PCAiIDw8IHBEYXRhLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQkJPDwgIiA+PiB3aXRob3V0IHR5cGUgc3BlY2lmaWZlciAhISEiCisJCQkJPDwgU0VORF9FWElUOworCisJCWF2bV9zaXplX3QgdmFyQ291bnQgPSAwOworCisJCWlmKCBwRGF0YS0+aXNUeXBlZE51bWVyaWMoKSAgICAgfHwKKwkJCXBEYXRhLT5pc1R5cGVkRW51bWVyYXRpb24oKSB8fAorCQkJcERhdGEtPmlzVHlwZWRNYWNoaW5lKCkgICAgICkKKwkJeworCQkJKyt2YXJDb3VudDsKKworCQkJbGlzdE9mRGF0YS5hcHBlbmQoIHBEYXRhICk7CisJCX0KKwkJZWxzZSBpZiggcERhdGEtPmhhc1R5cGVBcnJheU9yU3RydWN0dXJlKCkgKQorCQl7CisJCQlUYWJsZU9mU3ltYm9sOjppdGVyYXRvciBhdHRySXQgPSBwRGF0YS0+Z2V0QXR0cmlidXRlKCktPmJlZ2luKCk7CisJCQlUYWJsZU9mU3ltYm9sOjppdGVyYXRvciBhdHRyRW5kID0gcERhdGEtPmdldEF0dHJpYnV0ZSgpLT5lbmQoKTsKKwkJCWZvciggOyBhdHRySXQgIT0gYXR0ckVuZCA7ICsrYXR0ckl0ICkKKwkJCXsKKwkJCQl2YXJDb3VudCArPSBzZWxlY3RWYXJpYWJsZShsaXN0T2ZEYXRhLCAoKmF0dHJJdCkuCisJCQkJCQlkYXRhKCkuZ2V0QWxpYXNUYXJnZXQoKS0+YXM8IEluc3RhbmNlT2ZEYXRhID4oKSApOworCQkJfQorCQl9CisKKwkJcmV0dXJuKCB2YXJDb3VudCApOworCX0KKworCXJldHVybiggMCApOworfQorCisKK2F2bV9zaXplX3QgQmFzZURhdGFDb21wYXJhdG9yOjpzZWxlY3RQcmVzYnVyZ2VyVmFyaWFibGUoCisJCUxpc3RPZkluc3RhbmNlT2ZEYXRhICYgbGlzdE9mRGF0YSwgSW5zdGFuY2VPZkRhdGEgKiBwRGF0YSkKK3sKKwlpZiggcERhdGEtPmdldE1vZGlmaWVyKCkuYW55TW9kaWZpZXJPZlN0YXRlRGF0YSgpICkKKwl7CisJCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggcERhdGEtPmhhc1R5cGVTcGVjaWZpZXIoKSApCisJCQkJPDwgIlVuZXhwZWN0ZWQgdmFyaWFibGUgPDwgIiA8PCBwRGF0YS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJCTw8ICIgPj4gd2l0aG91dCB0eXBlIHNwZWNpZmlmZXIgISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQlhdm1fc2l6ZV90IHZhckNvdW50ID0gMDsKKworCQlpZiggcERhdGEtPndlYWtseVR5cGVkSW50ZWdlcigpIHx8CisJCQlwRGF0YS0+aXNUeXBlZEVudW1lcmF0aW9uKCkgfHwKKwkJCXBEYXRhLT5pc1R5cGVkTWFjaGluZSgpICAgICApCisJCXsKKwkJCSsrdmFyQ291bnQ7CisKKwkJCWxpc3RPZkRhdGEuYXBwZW5kKCBwRGF0YSApOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIENPTkZJR1VSSU5HICwgUkVEVU5EQU5DRSApCisJQVZNX09TX1RSQUNFIDw8ICJcdHByZXNidXJnZXIgOj4gIiA8PCBzdHJfaGVhZGVyKCBwRGF0YSApIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgQ09ORklHVVJJTkcgLCBSRURVTkRBTkNFICkKKwkJfQorCQllbHNlIGlmKCBwRGF0YS0+aGFzVHlwZUFycmF5T3JTdHJ1Y3R1cmUoKSApCisJCXsKKwkJCVRhYmxlT2ZTeW1ib2w6Oml0ZXJhdG9yIGF0dHJJdCA9IHBEYXRhLT5nZXRBdHRyaWJ1dGUoKS0+YmVnaW4oKTsKKwkJCVRhYmxlT2ZTeW1ib2w6Oml0ZXJhdG9yIGF0dHJFbmQgPSBwRGF0YS0+Z2V0QXR0cmlidXRlKCktPmVuZCgpOworCQkJZm9yKCA7IGF0dHJJdCAhPSBhdHRyRW5kIDsgKythdHRySXQgKQorCQkJeworCQkJCXZhckNvdW50ICs9IHNlbGVjdFByZXNidXJnZXJWYXJpYWJsZShsaXN0T2ZEYXRhLCAoKmF0dHJJdCkuCisJCQkJCQlkYXRhKCkuZ2V0QWxpYXNUYXJnZXQoKS0+YXM8IEluc3RhbmNlT2ZEYXRhID4oKSApOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBDT05GSUdVUklORyAsIFJFRFVOREFOQ0UgKQorCUFWTV9PU19UUkFDRSA8PCAiXHROT04gcHJlc2J1cmdlciA6PiAiIDw8IHN0cl9oZWFkZXIoIHBEYXRhICkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBDT05GSUdVUklORyAsIFJFRFVOREFOQ0UgKQorCQl9CisKKwkJcmV0dXJuKCB2YXJDb3VudCApOworCX0KKworCXJldHVybiggMCApOworfQorCisKK2F2bV9zaXplX3QgQmFzZURhdGFDb21wYXJhdG9yOjpzZWxlY3ROb25QcmVzYnVyZ2VyVmFyaWFibGUoCisJCUxpc3RPZkluc3RhbmNlT2ZEYXRhICYgbGlzdE9mRGF0YSwgSW5zdGFuY2VPZkRhdGEgKiBwRGF0YSkKK3sKKwlpZiggcERhdGEtPmdldE1vZGlmaWVyKCkuYW55TW9kaWZpZXJPZlN0YXRlRGF0YSgpICkKKwl7CisJCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggcERhdGEtPmhhc1R5cGVTcGVjaWZpZXIoKSApCisJCQkJPDwgIlVuZXhwZWN0ZWQgdmFyaWFibGUgPDwgIiA8PCBwRGF0YS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJCTw8ICIgPj4gd2l0aG91dCB0eXBlIHNwZWNpZmlmZXIgISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQlhdm1fc2l6ZV90IHZhckNvdW50ID0gMDsKKworCQlpZiggKG5vdCBwRGF0YS0+d2Vha2x5VHlwZWRJbnRlZ2VyKCkpICYmCisJCQkobm90IHBEYXRhLT5pc1R5cGVkRW51bWVyYXRpb24oKSkgJiYKKwkJCShub3QgcERhdGEtPmlzVHlwZWRNYWNoaW5lKCkpICAgICApCisJCXsKKwkJCSsrdmFyQ291bnQ7CisKKwkJCWxpc3RPZkRhdGEuYXBwZW5kKCBwRGF0YSApOworCQl9CisJCWVsc2UgaWYoIHBEYXRhLT5oYXNUeXBlQXJyYXlPclN0cnVjdHVyZSgpICkKKwkJeworCQkJVGFibGVPZlN5bWJvbDo6aXRlcmF0b3IgYXR0ckl0ID0gcERhdGEtPmdldEF0dHJpYnV0ZSgpLT5iZWdpbigpOworCQkJVGFibGVPZlN5bWJvbDo6aXRlcmF0b3IgYXR0ckVuZCA9IHBEYXRhLT5nZXRBdHRyaWJ1dGUoKS0+ZW5kKCk7CisJCQlmb3IoIDsgYXR0ckl0ICE9IGF0dHJFbmQgOyArK2F0dHJJdCApCisJCQl7CisJCQkJc2VsZWN0Tm9uUHJlc2J1cmdlclZhcmlhYmxlKGxpc3RPZkRhdGEsICgqYXR0ckl0KS4KKwkJCQkJCWRhdGEoKS5nZXRBbGlhc1RhcmdldCgpLT5hczwgSW5zdGFuY2VPZkRhdGEgPigpICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4oIHZhckNvdW50ICk7CisJfQorCisJcmV0dXJuKCAwICk7Cit9CisKKworLy8gVE9ETzogYXR0ZW50aW9uIG9uIG5lIHByZW5kIHBhcyBlbiBjb21wdGUgbGVzIFNPVVMtbWFjaGluZXMgISEhCit2b2lkIEJhc2VEYXRhQ29tcGFyYXRvcjo6c2VsZWN0RGV0YWlsc1ZhcmlhYmxlKGNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVELAorCQlMaXN0T2ZQYWlyTWFjaGluZURhdGEgJiBhTGlzdE9mU2VsZWN0ZWRWYXJpYWJsZSwKKwkJTGlzdE9mRXhlY3V0YWJsZUZvcm0gJiBsaXN0T2ZFeGVjdXRhYmxlLAorCQlMaXN0T2ZJbnN0YW5jZU9mTWFjaGluZSAmIGxpc3RPZkluc3RhbmNlLAorCQlMaXN0T2ZJbnN0YW5jZU9mRGF0YSAmIGxpc3RPZlZhcmlhYmxlKQoreworCVRhYmxlT2ZJbnN0YW5jZU9mRGF0YTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGl0VmFyOworCVRhYmxlT2ZJbnN0YW5jZU9mRGF0YTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGl0VmFyRW5kOworCisJTGlzdE9mSW5zdGFuY2VPZkRhdGE6Oml0ZXJhdG9yIHZhckl0OworCUxpc3RPZkluc3RhbmNlT2ZEYXRhOjppdGVyYXRvciB2YXJFbmQ7CisKKwlUYWJsZU9mUnVudGltZVQ6OmNvbnN0X2l0ZXJhdG9yIGl0UkYgPSBhbkVELmdldFRhYmxlT2ZSdW50aW1lKCkuYmVnaW4oKTsKKwlUYWJsZU9mUnVudGltZVQ6OmNvbnN0X2l0ZXJhdG9yIGl0UkZFbmQgPSBhbkVELmdldFRhYmxlT2ZSdW50aW1lKCkuZW5kKCk7CisJZm9yKCBSdW50aW1lRm9ybSAqIHBSRiA9IE5VTEwgOyBpdFJGICE9IGl0UkZFbmQgOyArK2l0UkYgKQorCXsKKwkJcFJGID0gKCppdFJGKTsKKworCQlpZiggcFJGLT5nZXRFeGVjdXRhYmxlKCktPmhhc0RhdGEoKSApCisJCXsKKwkJCWlmKCBsaXN0T2ZJbnN0YW5jZS5jb250YWlucyhwUkYtPmdldEluc3RhbmNlKCkpIHx8CisJCQkJbGlzdE9mRXhlY3V0YWJsZS5jb250YWlucyhwUkYtPmdldEV4ZWN1dGFibGUoKSkgKQorCQkJeworCQkJCWFMaXN0T2ZTZWxlY3RlZFZhcmlhYmxlLmFwcGVuZCgKKwkJCQkJCVBhaXJNYWNoaW5lRGF0YShwUkYtPmdldFJJRCgpKSApOworCQkJCUxpc3RPZkluc3RhbmNlT2ZEYXRhICYgbGlzdE9mRGF0YSA9CisJCQkJCQlhTGlzdE9mU2VsZWN0ZWRWYXJpYWJsZS5sYXN0KCkuc2Vjb25kKCk7CisKKwkJCQlpdFZhciA9IHBSRi0+Z2V0VmFyaWFibGVzKCkuYmVnaW4oKTsKKwkJCQlpdFZhckVuZCA9IHBSRi0+Z2V0VmFyaWFibGVzKCkuZW5kKCk7CisJCQkJZm9yKCA7IGl0VmFyICE9IGl0VmFyRW5kIDsgKytpdFZhciApCisJCQkJeworCQkJCQlzZWxlY3RWYXJpYWJsZShsaXN0T2ZEYXRhLCAoaXRWYXIpKTsKKwkJCQl9CisKKwkJCQkvLyBUT0RPOiBwYXJjb3VyaXIgbGVzIGNoaWxkcmVuCisvLwkJCQlUYWJsZU9mUnVudGltZUlEOjppdGVyYXRvciBpdFJlY01hY2hpbmUgPSAoKml0bWFjaGluZSktPmJlZ2luQ2hpbGRUYWJsZSgpIDsKKy8vCQkJCVRhYmxlT2ZSdW50aW1lSUQ6Oml0ZXJhdG9yIGl0UmVjRW5kICAgICA9ICgqaXRtYWNoaW5lKS0+ZW5kQ2hpbGRUYWJsZSgpIDsKKy8vCQkJCWZvciggOyBpdFJlY01hY2hpbmUgIT0gaXRSZWNFbmQgOyArK2l0UmVjTWFjaGluZSApCisvLwkJCQl7CisvLwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJYUxpc3RPZlNlbGVjdGVkVmFyaWFibGUuYXBwZW5kKAorCQkJCQkJUGFpck1hY2hpbmVEYXRhKHBSRi0+Z2V0UklEKCkpICk7CisJCQkJTGlzdE9mSW5zdGFuY2VPZkRhdGEgJiBsaXN0T2ZEYXRhID0KKwkJCQkJCWFMaXN0T2ZTZWxlY3RlZFZhcmlhYmxlLmxhc3QoKS5zZWNvbmQoKTsKKworCQkJCXZhckl0ID0gbGlzdE9mVmFyaWFibGUuYmVnaW4oKTsKKwkJCQl2YXJFbmQgPSBsaXN0T2ZWYXJpYWJsZS5lbmQoKTsKKwkJCQlmb3IoIDsgdmFySXQgIT0gdmFyRW5kIDsgKyt2YXJJdCApCisJCQkJeworCQkJCQlpZiggcFJGLT5nZXRFeGVjdXRhYmxlKCktPmNvbnRhaW5zQWxsRGF0YSgqdmFySXQpICkKKwkJCQkJeworCQkJCQkJc2VsZWN0VmFyaWFibGUobGlzdE9mRGF0YSwgKCp2YXJJdCkpOworCQkJCQl9CisJCQkJfQorCisJCQkJaWYoIGxpc3RPZkRhdGEuZW1wdHkoKSApCisJCQkJeworCQkJCQlhTGlzdE9mU2VsZWN0ZWRWYXJpYWJsZS5wb3BfbGFzdCgpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworCit2b2lkIEJhc2VEYXRhQ29tcGFyYXRvcjo6c2VsZWN0UHJlc2J1cmdlclZhcmlhYmxlKGNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVELAorCQlMaXN0T2ZQYWlyTWFjaGluZURhdGEgJiBhTGlzdE9mU2VsZWN0ZWRWYXJpYWJsZSkKK3sKKwlhdm1fc2l6ZV90IHZhckNvdW50ID0gMDsKKworCVRhYmxlT2ZJbnN0YW5jZU9mRGF0YTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGl0VmFyOworCVRhYmxlT2ZJbnN0YW5jZU9mRGF0YTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGl0VmFyRW5kOworCisJVGFibGVPZlJ1bnRpbWVUOjpjb25zdF9pdGVyYXRvciBpdFJGID0gYW5FRC5nZXRUYWJsZU9mUnVudGltZSgpLmJlZ2luKCk7CisJVGFibGVPZlJ1bnRpbWVUOjpjb25zdF9pdGVyYXRvciBpdFJGRW5kID0gYW5FRC5nZXRUYWJsZU9mUnVudGltZSgpLmVuZCgpOworCWZvciggUnVudGltZUlEIGl0UklEIDsgaXRSRiAhPSBpdFJGRW5kIDsgKytpdFJGICkKKwl7CisJCWl0UklEID0gKCppdFJGKS0+Z2V0UklEKCk7CisKKwkJaWYoIGl0UklELmdldEV4ZWN1dGFibGUoKS0+aGFzRGF0YSgpICkKKwkJeworCQkJYUxpc3RPZlNlbGVjdGVkVmFyaWFibGUuYXBwZW5kKCBQYWlyTWFjaGluZURhdGEoaXRSSUQpICk7CisJCQlMaXN0T2ZJbnN0YW5jZU9mRGF0YSAmIGxpc3RPZkRhdGEgPSBhTGlzdE9mU2VsZWN0ZWRWYXJpYWJsZS5sYXN0KCkuc2Vjb25kKCk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgQ09ORklHVVJJTkcgLCBSRURVTkRBTkNFICkKKwlBVk1fT1NfVFJBQ0UgPDwgInByZXNidXJnZXIgbWFjaGluZSA6PiAiIDw8IGl0UklELnN0cigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgQ09ORklHVVJJTkcgLCBSRURVTkRBTkNFICkKKworCQkJaXRWYXIgPSBpdFJJRC5nZXRFeGVjdXRhYmxlKCktPmdldEJhc2ljRGF0YSgpLmJlZ2luKCk7CisJCQlpdFZhckVuZCA9IGl0UklELmdldEV4ZWN1dGFibGUoKS0+Z2V0QmFzaWNEYXRhKCkuZW5kKCk7CisJCQlmb3IoIDsgaXRWYXIgIT0gaXRWYXJFbmQgOyArK2l0VmFyICkKKwkJCXsKKwkJCQl2YXJDb3VudCArPSBzZWxlY3RQcmVzYnVyZ2VyVmFyaWFibGUobGlzdE9mRGF0YSwgKGl0VmFyKSk7CisJCQl9CisKKwkJCWlmKCBsaXN0T2ZEYXRhLmVtcHR5KCkgKQorCQkJeworCQkJCWFMaXN0T2ZTZWxlY3RlZFZhcmlhYmxlLnBvcF9sYXN0KCk7CisJCQl9CisJCX0KKwl9CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgQ09ORklHVVJJTkcgLCBSRURVTkRBTkNFICkKKwlBVk1fT1NfVFJBQ0UgPDwgIlRvdGFsOj4gIiA8PCB2YXJDb3VudCA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBDT05GSUdVUklORyAsIFJFRFVOREFOQ0UgKQorfQorCisKK3ZvaWQgQmFzZURhdGFDb21wYXJhdG9yOjpzZWxlY3REZXRhaWxzUHJlc2J1cmdlclZhcmlhYmxlKAorCQljb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwKKwkJTGlzdE9mUGFpck1hY2hpbmVEYXRhICYgYUxpc3RPZlNlbGVjdGVkVmFyaWFibGUsCisJCUxpc3RPZkV4ZWN1dGFibGVGb3JtICYgbGlzdE9mRXhlY3V0YWJsZSwKKwkJTGlzdE9mSW5zdGFuY2VPZk1hY2hpbmUgJiBsaXN0T2ZJbnN0YW5jZSwKKwkJTGlzdE9mSW5zdGFuY2VPZkRhdGEgJiBsaXN0T2ZWYXJpYWJsZSkKK3sKKwlhdm1fc2l6ZV90IHZhckNvdW50ID0gMDsKKworCVRhYmxlT2ZJbnN0YW5jZU9mRGF0YTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGl0VmFyOworCVRhYmxlT2ZJbnN0YW5jZU9mRGF0YTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGl0VmFyRW5kOworCisJTGlzdE9mSW5zdGFuY2VPZkRhdGE6Oml0ZXJhdG9yIHZhckl0OworCUxpc3RPZkluc3RhbmNlT2ZEYXRhOjppdGVyYXRvciB2YXJFbmQ7CisKKwlUYWJsZU9mUnVudGltZVQ6OmNvbnN0X2l0ZXJhdG9yIGl0UkYgPSBhbkVELmdldFRhYmxlT2ZSdW50aW1lKCkuYmVnaW4oKTsKKwlUYWJsZU9mUnVudGltZVQ6OmNvbnN0X2l0ZXJhdG9yIGl0UkZFbmQgPSBhbkVELmdldFRhYmxlT2ZSdW50aW1lKCkuZW5kKCk7CisJZm9yKCBSdW50aW1lSUQgaXRSSUQgOyBpdFJGICE9IGl0UkZFbmQgOyArK2l0UkYgKQorCXsKKwkJaXRSSUQgPSAoKml0UkYpLT5nZXRSSUQoKTsKKworCQlpZiggaXRSSUQuZ2V0RXhlY3V0YWJsZSgpLT5oYXNEYXRhKCkgKQorCQl7CisJCQlpZiggbGlzdE9mRXhlY3V0YWJsZS5jb250YWlucyhpdFJJRC5nZXRFeGVjdXRhYmxlKCkpIHx8CisJCQkJbGlzdE9mSW5zdGFuY2UuY29udGFpbnMoaXRSSUQuZ2V0SW5zdGFuY2UoKSkpCisJCQl7CisJCQkJYUxpc3RPZlNlbGVjdGVkVmFyaWFibGUuYXBwZW5kKCBQYWlyTWFjaGluZURhdGEoaXRSSUQpICk7CisJCQkJTGlzdE9mSW5zdGFuY2VPZkRhdGEgJiBsaXN0T2ZEYXRhID0gYUxpc3RPZlNlbGVjdGVkVmFyaWFibGUubGFzdCgpLnNlY29uZCgpOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIENPTkZJR1VSSU5HICwgUkVEVU5EQU5DRSApCisJQVZNX09TX1RSQUNFIDw8ICJwcmVzYnVyZ2VyIG1hY2hpbmUgOj4gIiA8PCBpdFJJRC5zdHIoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIENPTkZJR1VSSU5HICwgUkVEVU5EQU5DRSApCisKKwkJCQlpdFZhciA9IGl0UklELmdldEV4ZWN1dGFibGUoKS0+Z2V0QmFzaWNEYXRhKCkuYmVnaW4oKTsKKwkJCQlpdFZhckVuZCA9IGl0UklELmdldEV4ZWN1dGFibGUoKS0+Z2V0QmFzaWNEYXRhKCkuZW5kKCk7CisJCQkJZm9yKCA7IGl0VmFyICE9IGl0VmFyRW5kIDsgKytpdFZhciApCisJCQkJeworCQkJCQl2YXJDb3VudCArPSBzZWxlY3RQcmVzYnVyZ2VyVmFyaWFibGUobGlzdE9mRGF0YSwgKGl0VmFyKSk7CisJCQkJfQorCisJCQkJaWYoIGxpc3RPZkRhdGEuZW1wdHkoKSApCisJCQkJeworCQkJCQlhTGlzdE9mU2VsZWN0ZWRWYXJpYWJsZS5wb3BfbGFzdCgpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlhTGlzdE9mU2VsZWN0ZWRWYXJpYWJsZS5hcHBlbmQoCisJCQkJCQlQYWlyTWFjaGluZURhdGEoaXRSSUQpICk7CisJCQkJTGlzdE9mSW5zdGFuY2VPZkRhdGEgJiBsaXN0T2ZEYXRhID0KKwkJCQkJCWFMaXN0T2ZTZWxlY3RlZFZhcmlhYmxlLmxhc3QoKS5zZWNvbmQoKTsKKworCQkJCXZhckl0ID0gbGlzdE9mVmFyaWFibGUuYmVnaW4oKTsKKwkJCQl2YXJFbmQgPSBsaXN0T2ZWYXJpYWJsZS5lbmQoKTsKKwkJCQlmb3IoIDsgdmFySXQgIT0gdmFyRW5kIDsgKyt2YXJJdCApCisJCQkJeworCQkJCQlpZiggaXRSSUQuZ2V0RXhlY3V0YWJsZSgpLT5jb250YWluc0FsbERhdGEoKnZhckl0KSApCisJCQkJCXsKKwkJCQkJCXZhckNvdW50ICs9IHNlbGVjdFByZXNidXJnZXJWYXJpYWJsZShsaXN0T2ZEYXRhLCAoKnZhckl0KSk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiggbGlzdE9mRGF0YS5lbXB0eSgpICkKKwkJCQl7CisJCQkJCWFMaXN0T2ZTZWxlY3RlZFZhcmlhYmxlLnBvcF9sYXN0KCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIENPTkZJR1VSSU5HICwgUkVEVU5EQU5DRSApCisJQVZNX09TX1RSQUNFIDw8ICJUb3RhbDo+ICIgPDwgdmFyQ291bnQgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgQ09ORklHVVJJTkcgLCBSRURVTkRBTkNFICkKKworfQorCit2b2lkIEJhc2VEYXRhQ29tcGFyYXRvcjo6c2VsZWN0Tm9uUHJlc2J1cmdlclZhcmlhYmxlKAorCQljb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwKKwkJTGlzdE9mUGFpck1hY2hpbmVEYXRhICYgYUxpc3RPZlNlbGVjdGVkVmFyaWFibGUpCit7CisJVGFibGVPZkluc3RhbmNlT2ZEYXRhOjpjb25zdF9yYXdfaXRlcmF0b3IgaXRWYXI7CisJVGFibGVPZkluc3RhbmNlT2ZEYXRhOjpjb25zdF9yYXdfaXRlcmF0b3IgaXRWYXJFbmQ7CisKKwlUYWJsZU9mUnVudGltZVQ6OmNvbnN0X2l0ZXJhdG9yIGl0UkYgPSBhbkVELmdldFRhYmxlT2ZSdW50aW1lKCkuYmVnaW4oKTsKKwlUYWJsZU9mUnVudGltZVQ6OmNvbnN0X2l0ZXJhdG9yIGVuZFJGID0gYW5FRC5nZXRUYWJsZU9mUnVudGltZSgpLmVuZCgpOworCWZvciggUnVudGltZUZvcm0gKiBwUkYgPSBOVUxMIDsgaXRSRiAhPSBlbmRSRiA7ICsraXRSRiApCisJeworCQlwUkYgPSAoKml0UkYpOworCisJCWlmKCBwUkYtPmdldEV4ZWN1dGFibGUoKS0+aGFzRGF0YSgpICkKKwkJeworCQkJYUxpc3RPZlNlbGVjdGVkVmFyaWFibGUuYXBwZW5kKAorCQkJCQlQYWlyTWFjaGluZURhdGEocFJGLT5nZXRSSUQoKSkgKTsKKwkJCUxpc3RPZkluc3RhbmNlT2ZEYXRhICYgbGlzdE9mRGF0YSA9CisJCQkJCWFMaXN0T2ZTZWxlY3RlZFZhcmlhYmxlLmxhc3QoKS5zZWNvbmQoKTsKKworLy8JCQlBVk1fT1NfVFJBQ0UgPDwgInByZXNidXJnZXIgbWFjaGluZSA6PiAiCisvLwkJCQkJPDwgaXRSSUQuc3RyKCkgPDwgc3RkOjplbmRsOworCisJCQlpdFZhciA9IHBSRi0+Z2V0VmFyaWFibGVzKCkuYmVnaW4oKTsKKwkJCWl0VmFyRW5kID0gcFJGLT5nZXRWYXJpYWJsZXMoKS5lbmQoKTsKKwkJCWZvciggOyBpdFZhciAhPSBpdFZhckVuZCA7ICsraXRWYXIgKQorCQkJeworCQkJCXNlbGVjdE5vblByZXNidXJnZXJWYXJpYWJsZShsaXN0T2ZEYXRhLCAoaXRWYXIpKTsKKwkJCX0KKworCQkJaWYoIGxpc3RPZkRhdGEuZW1wdHkoKSApCisJCQl7CisJCQkJYUxpc3RPZlNlbGVjdGVkVmFyaWFibGUucG9wX2xhc3QoKTsKKwkJCX0KKwkJfQorCX0KK30KKworCit2b2lkIEJhc2VEYXRhQ29tcGFyYXRvcjo6c2VsZWN0RGV0YWlsc05vblByZXNidXJnZXJWYXJpYWJsZSgKKwkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQsCisJCUxpc3RPZlBhaXJNYWNoaW5lRGF0YSAmIGFMaXN0T2ZTZWxlY3RlZFZhcmlhYmxlLAorCQlMaXN0T2ZFeGVjdXRhYmxlRm9ybSAmIGxpc3RPZkV4ZWN1dGFibGUsCisJCUxpc3RPZkluc3RhbmNlT2ZNYWNoaW5lICYgbGlzdE9mSW5zdGFuY2UsCisJCUxpc3RPZkluc3RhbmNlT2ZEYXRhICYgbGlzdE9mVmFyaWFibGUpCit7CisJVGFibGVPZkluc3RhbmNlT2ZEYXRhOjpjb25zdF9yYXdfaXRlcmF0b3IgaXRWYXI7CisJVGFibGVPZkluc3RhbmNlT2ZEYXRhOjpjb25zdF9yYXdfaXRlcmF0b3IgaXRWYXJFbmQ7CisKKwlMaXN0T2ZJbnN0YW5jZU9mRGF0YTo6aXRlcmF0b3IgdmFySXQ7CisJTGlzdE9mSW5zdGFuY2VPZkRhdGE6Oml0ZXJhdG9yIHZhckVuZDsKKworCVRhYmxlT2ZSdW50aW1lVDo6Y29uc3RfaXRlcmF0b3IgaXRSRiA9IGFuRUQuZ2V0VGFibGVPZlJ1bnRpbWUoKS5iZWdpbigpOworCVRhYmxlT2ZSdW50aW1lVDo6Y29uc3RfaXRlcmF0b3IgZW5kUkYgPSBhbkVELmdldFRhYmxlT2ZSdW50aW1lKCkuZW5kKCk7CisJZm9yKCBSdW50aW1lRm9ybSAqIHBSRiA9IE5VTEwgOyBpdFJGICE9IGVuZFJGIDsgKytpdFJGICkKKwl7CisJCXBSRiA9ICgqaXRSRik7CisKKwkJaWYoIHBSRi0+Z2V0RXhlY3V0YWJsZSgpLT5oYXNEYXRhKCkgKQorCQl7CisJCQlpZiggbGlzdE9mRXhlY3V0YWJsZS5jb250YWlucyhwUkYtPmdldEV4ZWN1dGFibGUoKSkgfHwKKwkJCQlsaXN0T2ZJbnN0YW5jZS5jb250YWlucyhwUkYtPmdldEluc3RhbmNlKCkpICkKKwkJCXsKKwkJCQlhTGlzdE9mU2VsZWN0ZWRWYXJpYWJsZS5hcHBlbmQoCisJCQkJCQlQYWlyTWFjaGluZURhdGEocFJGLT5nZXRSSUQoKSkgKTsKKwkJCQlMaXN0T2ZJbnN0YW5jZU9mRGF0YSAmIGxpc3RPZkRhdGEgPQorCQkJCQkJYUxpc3RPZlNlbGVjdGVkVmFyaWFibGUubGFzdCgpLnNlY29uZCgpOworCisvLwkJCQlBVk1fT1NfVFJBQ0UgPDwgIk5vbiBwcmVzYnVyZ2VyIG1hY2hpbmUgOj4gIgorLy8JCQkJCQk8PCBpdFJJRC5zdHIoKSA8PCBzdGQ6OmVuZGw7CisKKwkJCQlpdFZhciA9IHBSRi0+Z2V0VmFyaWFibGVzKCkuYmVnaW4oKTsKKwkJCQlpdFZhckVuZCA9IHBSRi0+Z2V0VmFyaWFibGVzKCkuZW5kKCk7CisJCQkJZm9yKCA7IGl0VmFyICE9IGl0VmFyRW5kIDsgKytpdFZhciApCisJCQkJeworCQkJCQlzZWxlY3ROb25QcmVzYnVyZ2VyVmFyaWFibGUobGlzdE9mRGF0YSwgKGl0VmFyKSk7CisJCQkJfQorCisJCQkJaWYoIGxpc3RPZkRhdGEuZW1wdHkoKSApCisJCQkJeworCQkJCQlhTGlzdE9mU2VsZWN0ZWRWYXJpYWJsZS5wb3BfbGFzdCgpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlhTGlzdE9mU2VsZWN0ZWRWYXJpYWJsZS5hcHBlbmQoCisJCQkJCQlQYWlyTWFjaGluZURhdGEocFJGLT5nZXRSSUQoKSkgKTsKKwkJCQlMaXN0T2ZJbnN0YW5jZU9mRGF0YSAmIGxpc3RPZkRhdGEgPQorCQkJCQkJYUxpc3RPZlNlbGVjdGVkVmFyaWFibGUubGFzdCgpLnNlY29uZCgpOworCisJCQkJdmFySXQgPSBsaXN0T2ZWYXJpYWJsZS5iZWdpbigpOworCQkJCXZhckVuZCA9IGxpc3RPZlZhcmlhYmxlLmVuZCgpOworCQkJCWZvciggOyB2YXJJdCAhPSB2YXJFbmQgOyArK3Zhckl0ICkKKwkJCQl7CisJCQkJCXNlbGVjdE5vblByZXNidXJnZXJWYXJpYWJsZShsaXN0T2ZEYXRhLCAoKnZhckl0KSk7CisJCQkJfQorCisJCQkJaWYoIGxpc3RPZkRhdGEuZW1wdHkoKSApCisJCQkJeworCQkJCQlhTGlzdE9mU2VsZWN0ZWRWYXJpYWJsZS5wb3BfbGFzdCgpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworCisvKgorICogUkVGUkVTSCBDVVJSRU5UIFBSRVNCVVJHRVIgVkFSSUFCTEUKKyAqLworCit2b2lkIEJhc2VEYXRhQ29tcGFyYXRvcjo6cmVmcmVzaEN1cnJlbnRWYXJpYWJsZXMoCisJCUxpc3RPZlBhaXJNYWNoaW5lRGF0YSAmIGN1cnJlbnRWYXJpYWJsZXMsCisJCUxpc3RPZlBhaXJNYWNoaW5lRGF0YSAmIHJlZmVyZW5jZVZhcmlhYmxlcywKKwkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIG5ld0VELCBjb25zdCBFeGVjdXRpb25EYXRhICYgb2xkRUQpCit7CisJY3VycmVudFZhcmlhYmxlcy5jbGVhcigpOworCisJTGlzdE9mSW5zdGFuY2VPZkRhdGE6Oml0ZXJhdG9yIGl0VmFyOworCUxpc3RPZkluc3RhbmNlT2ZEYXRhOjppdGVyYXRvciBlbmRWYXI7CisKKwlMaXN0T2ZQYWlyTWFjaGluZURhdGE6Oml0ZXJhdG9yIGl0UGFpck1hY2hpbmVEYXRhID0gcmVmZXJlbmNlVmFyaWFibGVzLmJlZ2luKCk7CisJTGlzdE9mUGFpck1hY2hpbmVEYXRhOjppdGVyYXRvciBlbmRQYWlyTWFjaGluZURhdGEgPSByZWZlcmVuY2VWYXJpYWJsZXMuZW5kKCk7CisJZm9yKCA7IGl0UGFpck1hY2hpbmVEYXRhICE9IGVuZFBhaXJNYWNoaW5lRGF0YSA7ICsraXRQYWlyTWFjaGluZURhdGEgKQorCXsKKwkJaWYoICgqaXRQYWlyTWFjaGluZURhdGEpLnNlY29uZCgpLm5vbmVtcHR5KCkgKQorCQl7CisJCQljb25zdCBSdW50aW1lRm9ybSAmIG5ld1JGID0KKwkJCQkJbmV3RUQuZ2V0UnVudGltZSggKCppdFBhaXJNYWNoaW5lRGF0YSkuZmlyc3QoKSApOworCQkJY29uc3QgUnVudGltZUZvcm0gJiBvbGRSRiA9CisJCQkJCW9sZEVELmdldFJ1bnRpbWUoICgqaXRQYWlyTWFjaGluZURhdGEpLmZpcnN0KCkgKTsKKworCQkJY3VycmVudFZhcmlhYmxlcy5hcHBlbmQoIFBhaXJNYWNoaW5lRGF0YShuZXdSRi5nZXRSSUQoKSkgKTsKKwkJCUxpc3RPZkluc3RhbmNlT2ZEYXRhICYgbGlzdE9mRGF0YSA9IGN1cnJlbnRWYXJpYWJsZXMubGFzdCgpLnNlY29uZCgpOworCisJCQlpdFZhciA9ICgqaXRQYWlyTWFjaGluZURhdGEpLnNlY29uZCgpLmJlZ2luKCk7CisJCQllbmRWYXIgPSAoKml0UGFpck1hY2hpbmVEYXRhKS5zZWNvbmQoKS5lbmQoKTsKKwkJCWZvciggOyBpdFZhciAhPSBlbmRWYXIgOyArK2l0VmFyICkKKwkJCXsKKwkJCQlpZiggbm90IEV4cHJlc3Npb25Db21wYXJlcjo6aXNURVEoCisJCQkJCQluZXdSRi5nZXREYXRhKCAoKml0VmFyKS0+Z2V0T2Zmc2V0KCkgKSwKKwkJCQkJCW9sZFJGLmdldERhdGEoICgqaXRWYXIpLT5nZXRPZmZzZXQoKSApKSApCisJCQkJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBDT05GSUdVUklORyAsIFJFRFVOREFOQ0UgKQorCUFWTV9PU19UUkFDRSA8PCAiY3VycmVudCB2YXIgOj4gIiA8PCBuZXdSRi5nZXRSSUQoKS5zdHIoKQorCQkJPDwgIjoiIDw8ICgqaXRWYXIpLT5nZXROYW1lSUQoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIENPTkZJR1VSSU5HICwgUkVEVU5EQU5DRSApCisKKwkJCQkJbGlzdE9mRGF0YS5hcHBlbmQoICgqaXRWYXIpICk7CisJCQkJfQorCQkJfQorCisJCQlpZiggbGlzdE9mRGF0YS5lbXB0eSgpICkKKwkJCXsKKwkJCQljdXJyZW50VmFyaWFibGVzLnBvcF9sYXN0KCk7CisJCQl9CisJCX0KKwl9Cit9CisKKworLyoKKyAqIENPTVBBUkUKKyAqLworYm9vbCBCYXNlRGF0YUNvbXBhcmF0b3I6OmNvbXBhcmVJTygKKwkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIG5ld0VDLCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgb2xkRUMpCit7CisJbmV3RUQgPSBuZXdFQy5nZXRFeGVjdXRpb25EYXRhKCk7CisJb2xkRUQgPSBvbGRFQy5nZXRFeGVjdXRpb25EYXRhKCk7CisKKwlUYWJsZU9mQnVmZmVyVDo6Y29uc3RfaXRlcmF0b3IgaXROZXdCdWY7CisJVGFibGVPZkJ1ZmZlclQ6OmNvbnN0X2l0ZXJhdG9yIGl0TmV3QnVmRW5kOworCisJVGFibGVPZkJ1ZmZlclQ6OmNvbnN0X2l0ZXJhdG9yIGl0T2xkQnVmOworCisJLy8gY29tcGFyZSBCVUZGRVIKKwlMaXN0PCBSdW50aW1lSUQgPjo6Y29uc3RfaXRlcmF0b3IgaXRSSUQgPSBnZXRTZWxlY3RlZElPTWFjaGluZSgpLmJlZ2luKCk7CisJTGlzdDwgUnVudGltZUlEID46OmNvbnN0X2l0ZXJhdG9yIGVuZFJJRCA9IGdldFNlbGVjdGVkSU9NYWNoaW5lKCkuZW5kKCk7CisJZm9yKCA7IGl0UklEICE9IGVuZFJJRCA7ICsraXRSSUQgKQorCXsKKwkJbmV3UkYgPSBuZXdFRC0+cHRyUnVudGltZSggKml0UklEICk7CisJCW9sZFJGID0gb2xkRUQtPnB0clJ1bnRpbWUoICppdFJJRCApOworCisJCWlmKCBuZXdSRi0+aGFzQnVmZmVyKCkKKwkJCSYmIChuZXdSRi0+Z2V0QnVmZmVyVGFibGUoKSAhPSBvbGRSRi0+Z2V0QnVmZmVyVGFibGUoKSkgKQorCQl7CisJCQlpdE5ld0J1ZiA9IG5ld1JGLT5nZXRCdWZmZXJUYWJsZSgpLmJlZ2luKCk7CisJCQlpdE5ld0J1ZkVuZCA9IG5ld1JGLT5nZXRCdWZmZXJUYWJsZSgpLmVuZCgpOworCQkJaXRPbGRCdWYgPSBvbGRSRi0+Z2V0QnVmZmVyVGFibGUoKS5iZWdpbigpOworCQkJZm9yKCA7IGl0TmV3QnVmICE9IGl0TmV3QnVmRW5kIDsgKytpdE5ld0J1ZiwgKytpdE9sZEJ1ZiApCisJCQl7CisJCQkJaWYoICgoKml0TmV3QnVmKSAhPSAoKml0T2xkQnVmKSkKKwkJCQkJJiYgKG5vdCBjb21wYXJlQlVGRkVSKCppdE5ld0J1ZiwgKml0T2xkQnVmKSkgKQorCQkJCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBSRURVTkRBTkNFICkKKwlBVk1fT1NfQ09VVCA8PCAib2xkUkYgOj4gIiA8PCBvbGRSRi0+Z2V0UklEKCkuc3RyKCkgPDwgc3RkOjplbmRsOworCW9sZFJGLT5nZXRCdWZmZXJUYWJsZSgpLnRvU3RyZWFtKEFWTV9PU19DT1VUKTsKKworCUFWTV9PU19DT1VUIDw8ICJuZXdSRiA6PiAiIDw8IG5ld1JGLT5nZXRSSUQoKS5zdHIoKSA8PCBzdGQ6OmVuZGw7CisJbmV3UkYtPmdldEJ1ZmZlclRhYmxlKCkudG9TdHJlYW0oQVZNX09TX0NPVVQpOworCisJQVZNX09TX0NPVVQgPDwgIj4+Pj4+Pj4gZmFsc2UgPDw8PDw8PCIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFJFRFVOREFOQ0UgKQorCisJCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCitib29sIEJhc2VEYXRhQ29tcGFyYXRvcjo6Y29tcGFyZUJVRkZFUigKKwkJY29uc3QgQmFzZUJ1ZmZlckZvcm0gKiBuZXdCdWYsIGNvbnN0IEJhc2VCdWZmZXJGb3JtICogb2xkQnVmKQoreworCXN3aXRjaCggbmV3QnVmLT5jbGFzc0tpbmQoKSApCisJeworCQljYXNlIEZPUk1fQlVGRkVSX0ZJRk9fS0lORDoKKwkJY2FzZSBGT1JNX0JVRkZFUl9MSUZPX0tJTkQ6CisJCXsKKwkJCWNvbnN0IEJhc2VCdWZmZXJRdWV1ZSAqIG5ld01zZ0xpc3QgPSBuZXdCdWYtPnRvPCBCYXNlQnVmZmVyUXVldWUgPigpOworCQkJY29uc3QgQmFzZUJ1ZmZlclF1ZXVlICogb2xkTXNnTGlzdCA9IG9sZEJ1Zi0+dG88IEJhc2VCdWZmZXJRdWV1ZSA+KCk7CisKKwkJCWlmKCBuZXdNc2dMaXN0LT5ub25lbXB0eSgpCisJCQkJJiYgKG5ld01zZ0xpc3QtPnNpemUoKSA9PSBvbGRNc2dMaXN0LT5zaXplKCkpICkKKwkJCXsKKwkJCQlMaXN0T2ZNZXNzYWdlOjoKKwkJCQljb25zdF9pdGVyYXRvciBpdE5ld01zZyA9IG5ld01zZ0xpc3QtPmJlZ2luTWVzc2FnZXMoKTsKKwkJCQlMaXN0T2ZNZXNzYWdlOjoKKwkJCQljb25zdF9pdGVyYXRvciBpdE5ld01zZ0VuZCA9IG5ld01zZ0xpc3QtPmVuZE1lc3NhZ2VzKCk7CisJCQkJTGlzdE9mTWVzc2FnZTo6CisJCQkJY29uc3RfaXRlcmF0b3IgaXRPbGRNc2cgPSBvbGRNc2dMaXN0LT5iZWdpbk1lc3NhZ2VzKCk7CisJCQkJZm9yKCA7IGl0TmV3TXNnICE9IGl0TmV3TXNnRW5kIDsgKytpdE5ld01zZywgKytpdE9sZE1zZyApCisJCQkJeworCQkJCQlpZiggKCgqaXROZXdNc2cpICE9ICgqaXRPbGRNc2cpKQorCQkJCQkJJiYgKG5vdCBjb21wYXJlTUVTU0FHRSgoKml0TmV3TXNnKSwgKCppdE9sZE1zZykpKSApCisJCQkJCXsKKwkJCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCX0KKwkJCXJldHVybiggbmV3TXNnTGlzdC0+ZW1wdHkoKSApOworCQl9CisKKwkJY2FzZSBGT1JNX0JVRkZFUl9NVUxUSVNFVF9LSU5EOgorCQljYXNlIEZPUk1fQlVGRkVSX1NFVF9LSU5EOgorCQl7IC8vIFRPRE8gY29ycmVjdCBjb21wYXJhaXNvbgorCQkJY29uc3QgQmFzZUJ1ZmZlclF1ZXVlICogbmV3TXNnTGlzdCA9IG5ld0J1Zi0+dG88IEJhc2VCdWZmZXJRdWV1ZSA+KCk7CisJCQljb25zdCBCYXNlQnVmZmVyUXVldWUgKiBvbGRNc2dMaXN0ID0gb2xkQnVmLT50bzwgQmFzZUJ1ZmZlclF1ZXVlID4oKTsKKworCQkJaWYoIG5ld01zZ0xpc3QtPnNpemUoKSA9PSBvbGRNc2dMaXN0LT5zaXplKCkgKQorCQkJeworCQkJCUxpc3RPZk1lc3NhZ2U6OgorCQkJCWNvbnN0X2l0ZXJhdG9yIGl0TmV3TXNnID0gbmV3TXNnTGlzdC0+YmVnaW5NZXNzYWdlcygpOworCQkJCUxpc3RPZk1lc3NhZ2U6OgorCQkJCWNvbnN0X2l0ZXJhdG9yIGl0TmV3TXNnRW5kID0gbmV3TXNnTGlzdC0+ZW5kTWVzc2FnZXMoKTsKKwkJCQlMaXN0T2ZNZXNzYWdlOjoKKwkJCQljb25zdF9pdGVyYXRvciBpdE9sZE1zZyA9IG9sZE1zZ0xpc3QtPmJlZ2luTWVzc2FnZXMoKTsKKwkJCQlmb3IoIDsgaXROZXdNc2cgIT0gaXROZXdNc2dFbmQgOyArK2l0TmV3TXNnLCArK2l0T2xkTXNnICkKKwkJCQl7CisJCQkJCWlmKCAoKCppdE5ld01zZykgIT0gKCppdE9sZE1zZykpCisJCQkJCQkmJiAobm90IGNvbXBhcmVNRVNTQUdFKCgqaXROZXdNc2cpLCAoKml0T2xkTXNnKSkpICkKKwkJCQkJeworCQkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCQl9CisJCQkJfQorCQkJCXJldHVybiggdHJ1ZSApOworCQkJfQorCQkJcmV0dXJuKCBuZXdNc2dMaXN0LT5lbXB0eSgpICk7CisJCX0KKworCQljYXNlIEZPUk1fQlVGRkVSX0JST0FEQ0FTVF9LSU5EOgorCQljYXNlIEZPUk1fQlVGRkVSX1JBTV9LSU5EOgorCQl7CisJCQlyZXR1cm4oIGNvbXBhcmVNRVNTQUdFKAorCQkJCQluZXdCdWYtPnRvPCBSYW1CdWZmZXIgPigpLT50b3AoKSwKKwkJCQkJb2xkQnVmLT50bzwgUmFtQnVmZmVyID4oKS0+dG9wKCkgKSApOworCQl9CisKKwkJZGVmYXVsdCA6CisJCXsKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworYm9vbCBCYXNlRGF0YUNvbXBhcmF0b3I6OmNvbXBhcmVNRVNTQUdFKAorCQljb25zdCBNZXNzYWdlICYgbmV3TXNnLCBjb25zdCBNZXNzYWdlICYgb2xkTXNnKQoreworCWlmKCBuZXdNc2cuZ2V0TUlEKCkgPT0gb2xkTXNnLmdldE1JRCgpICkKKwl7CisvLwkJQkZWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIGl0TmV3ID0gbmV3TXNnLT5iZWdpbigpOworLy8JCUJGVmVjdG9yOjpjb25zdF9pdGVyYXRvciBpdE5ld0VuZCA9IG5ld01zZy0+ZW5kKCk7CisvLwkJQkZWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIGl0T2xkID0gb2xkTXNnLT5iZWdpbigpOworLy8JCWZvciggOyBpdE5ldyAhPSBpdE5ld0VuZCA7ICsraXROZXcsICsraXRPbGQgKQorLy8JCXsKKy8vCQkJaWYoIG5vdCBFeHByZXNzaW9uQ29tcGFyZXI6OmlzRVEoKml0TmV3LCAqaXRPbGQpICkKKy8vCQkJeworLy8JCQkJcmV0dXJuKCBmYWxzZSApOworLy8JCQl9CisvLwkJfQorCisJCXJldHVybiggdHJ1ZSApOworCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKworCisKK2Jvb2wgQmFzZURhdGFDb21wYXJhdG9yOjpjb21wYXJlKAorCQljb25zdCBFeGVjdXRpb25Db250ZXh0ICYgbmV3RUMsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBvbGRFQykKK3sKKwlpZiggbU1hY2hpbmVDb3VudCAhPSBuZXdFQy5yZWZFeGVjdXRpb25EYXRhKCkuZ2V0VGFibGVPZlJ1bnRpbWUoKS5zaXplKCkgKQorCXsKKwkJbU1hY2hpbmVDb3VudCA9IG5ld0VDLnJlZkV4ZWN1dGlvbkRhdGEoKS5nZXRUYWJsZU9mUnVudGltZSgpLnNpemUoKTsKKworCQljb21wdXRlQWxsTWFjaGluZURhdGEoIG5ld0VDLnJlZkV4ZWN1dGlvbkRhdGEoKSApOworCX0KKworCSsrbUNvbXBhcmlzb25Db3VudDsKKworCWlmKCBjb21wYXJlVEVRKG5ld0VDLCBvbGRFQykgKQorCXsKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCWVsc2UgaWYoIG1Vc2VDb21tdW5pY2F0aW9uIHx8IG1Vc2VWYXJpYWJsZSApCisJeworCQlyZXR1cm4oIChtVXNlQ29tbXVuaWNhdGlvbiA/IGNvbXBhcmVJTyhuZXdFQywgb2xkRUMpIDogdHJ1ZSkKKwkJCQkmJiAobVVzZVZhcmlhYmxlID8gY29tcGFyZURBVEEobmV3RUMsIG9sZEVDKSA6IHRydWUpICk7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVFJJVklBTExZIERBVEEgQ09NUEFSQVRPUgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgVHJpdmlhbGx5RGF0YUNvbXBhcmlzb246OmNvbXBhcmVEQVRBKAorCQljb25zdCBFeGVjdXRpb25Db250ZXh0ICYgbmV3RUMsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBvbGRFQykKK3sKKwluZXdFRCA9IG5ld0VDLmdldEV4ZWN1dGlvbkRhdGEoKTsKKwlvbGRFRCA9IG9sZEVDLmdldEV4ZWN1dGlvbkRhdGEoKTsKKworCS8vIGNvbXBhcmUgUEMKKwlpZiggbUlnbm9yZVBhdGhDb25kaXRpb24gfHwgRXhwcmVzc2lvbkNvbXBhcmVyOjppc1RFUSgKKwkJCW5ld0VELT5nZXRQYXRoQ29uZGl0aW9uKCksIG9sZEVELT5nZXRQYXRoQ29uZGl0aW9uKCkgKSApCisJeworCQkvLyBjb21wYXJlIERBVEFzCisJCWl0UGFpck1hY2hpbmVEYXRhID0gZ2V0QWxsVmFyaWFibGUoKS5iZWdpbigpOworCQllbmRQYWlyTWFjaGluZURhdGEgPSBnZXRBbGxWYXJpYWJsZSgpLmVuZCgpOworCQlmb3IoIDsgaXRQYWlyTWFjaGluZURhdGEgIT0gZW5kUGFpck1hY2hpbmVEYXRhIDsgKytpdFBhaXJNYWNoaW5lRGF0YSApCisJCXsKKwkJCWlmKCAoKml0UGFpck1hY2hpbmVEYXRhKS5zZWNvbmQoKS5ub25lbXB0eSgpICkKKwkJCXsKKwkJCQluZXdSRiA9IG5ld0VELT5wdHJSdW50aW1lKCAoKml0UGFpck1hY2hpbmVEYXRhKS5maXJzdCgpICk7CisJCQkJb2xkUkYgPSBvbGRFRC0+cHRyUnVudGltZSggKCppdFBhaXJNYWNoaW5lRGF0YSkuZmlyc3QoKSApOworCisJCQkJaWYoIG5ld1JGLT5nZXREYXRhVGFibGUoKSAhPSBvbGRSRi0+Z2V0RGF0YVRhYmxlKCkgKQorCQkJCXsKKwkJCQkJaXRWYXIgPSAoKml0UGFpck1hY2hpbmVEYXRhKS5zZWNvbmQoKS5iZWdpbigpOworCQkJCQllbmRWYXIgPSAoKml0UGFpck1hY2hpbmVEYXRhKS5zZWNvbmQoKS5lbmQoKTsKKwkJCQkJZm9yKCA7IGl0VmFyICE9IGVuZFZhciA7ICsraXRWYXIgKQorCQkJCQl7CisJCQkJCQlpZiggbm90IEV4cHJlc3Npb25Db21wYXJlcjo6aXNURVEoCisJCQkJCQkJCW5ld1JGLT5nZXREYXRhKCgqaXRWYXIpLT5nZXRPZmZzZXQoKSksCisJCQkJCQkJCW9sZFJGLT5nZXREYXRhKCgqaXRWYXIpLT5nZXRPZmZzZXQoKSkpICkKKwkJCQkJCXsKKwkJCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3JlZHVuZGFuY3kvQmFzZURhdGFDb21wYXJhdG9yLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vcmVkdW5kYW5jeS9CYXNlRGF0YUNvbXBhcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGE0ZjcwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3JlZHVuZGFuY3kvQmFzZURhdGFDb21wYXJhdG9yLmgKQEAgLTAsMCArMSw0MjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgQmFzZURhdGFDb21wYXJhdG9yX0hfCisjZGVmaW5lIEJhc2VEYXRhQ29tcGFyYXRvcl9IXworCisjaW5jbHVkZSA8Y29sbGVjdGlvbi9UeXBlZGVmLmg+CisKKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25Db250ZXh0Lmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvUnVudGltZUlELmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIEJhc2VCdWZmZXJGb3JtOworY2xhc3MgQ29uZmlndXJhdGlvbjsKK2NsYXNzIEV4ZWN1dGFibGVTeXN0ZW07CitjbGFzcyBNZXNzYWdlOworY2xhc3MgUnVudGltZUZvcm07CisKKworY2xhc3MgQmFzZURhdGFDb21wYXJhdG9yCit7CisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBBVFRSSUJVVEVTCisJICovCisJQ29uZmlndXJhdGlvbiAmIG1Db25maWd1cmF0aW9uOworCisJYXZtX3NpemVfdCBtTWFjaGluZUNvdW50OworCisJYm9vbCBtQ3VycmVudFBhdGhTY29wZUZsYWc7CisKKwlhdm1fc2l6ZV90IG1Db21wYXJpc29uQ291bnQ7CisKKworCUxpc3Q8IFJ1bnRpbWVJRCA+IG1MaXN0T2ZTZWxlY3RlZElPTWFjaGluZTsKKworCUxpc3RPZlBhaXJNYWNoaW5lRGF0YSBtTGlzdE9mQWxsVmFyaWFibGU7CisKKworCUxpc3RPZlBhaXJNYWNoaW5lRGF0YSBtTGlzdE9mU2VsZWN0ZWRQcmVzYnVyZ2VyVmFyaWFibGU7CisKKwlMaXN0T2ZQYWlyTWFjaGluZURhdGEgbUxpc3RPZkN1cnJlbnRQcmVzYnVyZ2VyVmFyaWFibGU7CisKKwlMaXN0T2ZQYWlyTWFjaGluZURhdGEgbUxpc3RPZlNlbGVjdGVkTm9uUHJlc2J1cmdlclZhcmlhYmxlOworCisJLy8gSGV1cmlzdGljCisJYm9vbCBtVXNlQ29tbXVuaWNhdGlvbjsKKwlib29sIG1Vc2VWYXJpYWJsZTsKKwlib29sIG1JZ25vcmVQYXRoQ29uZGl0aW9uOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQ29tcHV0aW5nIFZhcmlhYmxlcworCUV4ZWN1dGlvbkRhdGEgKiBuZXdFRDsKKwlFeGVjdXRpb25EYXRhICogb2xkRUQ7CisKKwljb25zdCBSdW50aW1lRm9ybSAqIG5ld1JGOworCWNvbnN0IFJ1bnRpbWVGb3JtICogb2xkUkY7CisKKwlMaXN0T2ZQYWlyTWFjaGluZURhdGE6Oml0ZXJhdG9yIGl0UGFpck1hY2hpbmVEYXRhOworCUxpc3RPZlBhaXJNYWNoaW5lRGF0YTo6aXRlcmF0b3IgZW5kUGFpck1hY2hpbmVEYXRhOworCisJTGlzdE9mSW5zdGFuY2VPZkRhdGE6Oml0ZXJhdG9yIGl0VmFyOworCUxpc3RPZkluc3RhbmNlT2ZEYXRhOjppdGVyYXRvciBlbmRWYXI7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUJhc2VEYXRhQ29tcGFyYXRvcihDb25maWd1cmF0aW9uICYgYUNvbmZpZ3VyYXRpb24pCisJOiBtQ29uZmlndXJhdGlvbiggYUNvbmZpZ3VyYXRpb24gKSwKKwltTWFjaGluZUNvdW50KCAwICksCisJbUN1cnJlbnRQYXRoU2NvcGVGbGFnKCBmYWxzZSApLAorCW1Db21wYXJpc29uQ291bnQoIDAgKSwKKworCW1MaXN0T2ZTZWxlY3RlZElPTWFjaGluZSggKSwKKwltTGlzdE9mQWxsVmFyaWFibGUoICksCisKKwltTGlzdE9mU2VsZWN0ZWRQcmVzYnVyZ2VyVmFyaWFibGUoICksCisJbUxpc3RPZkN1cnJlbnRQcmVzYnVyZ2VyVmFyaWFibGUoICksCisJbUxpc3RPZlNlbGVjdGVkTm9uUHJlc2J1cmdlclZhcmlhYmxlKCApLAorCisJLy8gSGV1cmlzdGljCisJbVVzZUNvbW11bmljYXRpb24oIHRydWUgKSwKKwltVXNlVmFyaWFibGUoIHRydWUgKSwKKwltSWdub3JlUGF0aENvbmRpdGlvbiggZmFsc2UgKSwKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBDb21wdXRpbmcgVmFyaWFibGVzCisJbmV3RUQoIE5VTEwgKSwKKwlvbGRFRCggTlVMTCApLAorCisJbmV3UkYoIE5VTEwgKSwKKwlvbGRSRiggTlVMTCApLAorCisJaXRQYWlyTWFjaGluZURhdGEoICksCisJZW5kUGFpck1hY2hpbmVEYXRhKCApLAorCisJaXRWYXIoICksCisJZW5kVmFyKCApCisJeworCQkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkJhc2VEYXRhQ29tcGFyYXRvcigpCisJeworCQlkZXN0cm95TWFjaGluZURhdGEoKTsKKwl9CisKKwl2b2lkIGRlc3Ryb3lNYWNoaW5lRGF0YSgpOworCisKKwkvKioKKwkgKiBDT05GSUdVUkUKKwkgKi8KKwl2aXJ0dWFsIGJvb2wgY29uZmlndXJlKFdPYmplY3QgKiB3ZlBhcmFtZXRlck9iamVjdCk7CisKKwl2b2lkIGNvbXB1dGVBbGxNYWNoaW5lRGF0YShjb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCk7CisKKwl2b2lkIGNvbXB1dGVEZXRhaWxzSW5jbHVkZU1hY2hpbmVEYXRhKGNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVELAorCQkJTGlzdE9mRXhlY3V0YWJsZUZvcm0gJiBsaXN0T2ZFeGVjdXRhYmxlLAorCQkJTGlzdE9mSW5zdGFuY2VPZk1hY2hpbmUgJiBsaXN0T2ZJbnN0YW5jZSwKKwkJCUxpc3RPZkluc3RhbmNlT2ZEYXRhICYgbGlzdE9mVmFyaWFibGUpOworCisJdm9pZCBjb21wdXRlRGV0YWlsc0V4Y2x1ZGVNYWNoaW5lRGF0YShjb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwKKwkJCUxpc3RPZkV4ZWN1dGFibGVGb3JtICYgbGlzdE9mRXhlY3V0YWJsZSwKKwkJCUxpc3RPZkluc3RhbmNlT2ZNYWNoaW5lICYgbGlzdE9mSW5zdGFuY2UsCisJCQlMaXN0T2ZJbnN0YW5jZU9mRGF0YSAmIGxpc3RPZlZhcmlhYmxlKTsKKworCisJLyoKKwkgKiBDT01QQVJFCisJICovCisJaW5saW5lIHZpcnR1YWwgYm9vbCBjb21wYXJlREFUQSgKKwkJCWNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBuZXdFQywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIG9sZEVDKQorCXsKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisJdmlydHVhbCBib29sIGNvbXBhcmVJTygKKwkJCWNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBuZXdFQywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIG9sZEVDKTsKKworCXZpcnR1YWwgYm9vbCBjb21wYXJlQlVGRkVSKAorCQkJY29uc3QgQmFzZUJ1ZmZlckZvcm0gKiBuZXdCdWYsIGNvbnN0IEJhc2VCdWZmZXJGb3JtICpvbGRCdWYpOworCisJdmlydHVhbCBib29sIGNvbXBhcmVNRVNTQUdFKAorCQkJY29uc3QgTWVzc2FnZSAmIG5ld01zZywgY29uc3QgTWVzc2FnZSAmIG9sZE1zZyk7CisKKworCWlubGluZSB2aXJ0dWFsIGJvb2wgY29tcGFyZVRFUSgKKwkJCWNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBuZXdFQywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIG9sZEVDKQorCXsKKwkJcmV0dXJuKCBuZXdFQy5nZXRFeGVjdXRpb25EYXRhKCkgPT0gb2xkRUMuZ2V0RXhlY3V0aW9uRGF0YSgpICk7CisJfQorCisJdmlydHVhbCBib29sIGNvbXBhcmUoCisJCQljb25zdCBFeGVjdXRpb25Db250ZXh0ICYgbmV3RUMsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBvbGRFQyk7CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1DdXJyZW50UGF0aFNjb3BlRmxhZworCSAqLworCWlubGluZSBib29sIGlzQ3VycmVudFBhdGhTY29wZSgpCisJeworCQlyZXR1cm4oIG1DdXJyZW50UGF0aFNjb3BlRmxhZyApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogdGhlIExpc3QgT2YgU2VsZWN0ZWQgTWFjaGluZSBhbmQgVmFyaWFibGUKKwkgKi8KKworCS8vIElPIE1hY2hpbmUKKwlpbmxpbmUgY29uc3QgTGlzdDwgUnVudGltZUlEID4gJiBnZXRTZWxlY3RlZElPTWFjaGluZSgpCisJeworCQlyZXR1cm4oIG1MaXN0T2ZTZWxlY3RlZElPTWFjaGluZSApOworCX0KKworCXN0YXRpYyB2b2lkIHNlbGVjdERldGFpbHNJT01hY2hpbmUoY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQsCisJCQlMaXN0PCBSdW50aW1lSUQgPiAmIGFMaXN0T2ZTZWxlY3RlZElPTWFjaGluZSwKKwkJCUxpc3RPZkV4ZWN1dGFibGVGb3JtICYgbGlzdE9mRXhlY3V0YWJsZSwKKwkJCUxpc3RPZkluc3RhbmNlT2ZNYWNoaW5lICYgbGlzdE9mSW5zdGFuY2UpOworCisJc3RhdGljIHZvaWQgc2VsZWN0SU9NYWNoaW5lKGNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVELAorCQkJTGlzdDwgUnVudGltZUlEID4gJiBhTGlzdE9mU2VsZWN0ZWRJT01hY2hpbmUpOworCisKKwkvLyBBTEwgVmFyaWFibGUKKwlpbmxpbmUgTGlzdE9mUGFpck1hY2hpbmVEYXRhICYgZ2V0QWxsVmFyaWFibGUoKQorCXsKKwkJcmV0dXJuKCBtTGlzdE9mQWxsVmFyaWFibGUgKTsKKwl9CisKKwlzdGF0aWMgdm9pZCBzZWxlY3RBbGxWYXJpYWJsZShjb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwKKwkJCUxpc3RPZlBhaXJNYWNoaW5lRGF0YSAmIGFMaXN0T2ZTZWxlY3RlZFZhcmlhYmxlKTsKKworCisJc3RhdGljIGF2bV9zaXplX3Qgc2VsZWN0VmFyaWFibGUoCisJCQlMaXN0T2ZJbnN0YW5jZU9mRGF0YSAmIGxpc3RPZkRhdGEsIEluc3RhbmNlT2ZEYXRhICogcERhdGEpOworCisJc3RhdGljIGF2bV9zaXplX3Qgc2VsZWN0UHJlc2J1cmdlclZhcmlhYmxlKAorCQkJTGlzdE9mSW5zdGFuY2VPZkRhdGEgJiBsaXN0T2ZEYXRhLCBJbnN0YW5jZU9mRGF0YSAqIHBEYXRhKTsKKworCXN0YXRpYyBhdm1fc2l6ZV90IHNlbGVjdE5vblByZXNidXJnZXJWYXJpYWJsZSgKKwkJCUxpc3RPZkluc3RhbmNlT2ZEYXRhICYgbGlzdE9mRGF0YSwgSW5zdGFuY2VPZkRhdGEgKiBwRGF0YSk7CisKKworCXN0YXRpYyB2b2lkIHNlbGVjdERldGFpbHNWYXJpYWJsZShjb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwKKwkJCUxpc3RPZlBhaXJNYWNoaW5lRGF0YSAmIGFMaXN0T2ZTZWxlY3RlZFZhcmlhYmxlLAorCQkJTGlzdE9mRXhlY3V0YWJsZUZvcm0gJiBsaXN0T2ZFeGVjdXRhYmxlLAorCQkJTGlzdE9mSW5zdGFuY2VPZk1hY2hpbmUgJiBsaXN0T2ZJbnN0YW5jZSwKKwkJCUxpc3RPZkluc3RhbmNlT2ZEYXRhICYgbGlzdE9mVmFyaWFibGUpOworCisKKwkvLyBQUkVTQlVSR0VSIFZhcmlhYmxlCisJaW5saW5lIExpc3RPZlBhaXJNYWNoaW5lRGF0YSAmIGdldFNlbGVjdGVkUHJlc2J1cmdlclZhcmlhYmxlKCkKKwl7CisJCXJldHVybiggbUxpc3RPZlNlbGVjdGVkUHJlc2J1cmdlclZhcmlhYmxlICk7CisJfQorCisJc3RhdGljIHZvaWQgc2VsZWN0UHJlc2J1cmdlclZhcmlhYmxlKGNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVELAorCQkJTGlzdE9mUGFpck1hY2hpbmVEYXRhICYgYUxpc3RPZlNlbGVjdGVkVmFyaWFibGUpOworCisJc3RhdGljIHZvaWQgc2VsZWN0RGV0YWlsc1ByZXNidXJnZXJWYXJpYWJsZShjb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwKKwkJCUxpc3RPZlBhaXJNYWNoaW5lRGF0YSAmIGFMaXN0T2ZTZWxlY3RlZFZhcmlhYmxlLAorCQkJTGlzdE9mRXhlY3V0YWJsZUZvcm0gJiBsaXN0T2ZFeGVjdXRhYmxlLAorCQkJTGlzdE9mSW5zdGFuY2VPZk1hY2hpbmUgJiBsaXN0T2ZJbnN0YW5jZSwKKwkJCUxpc3RPZkluc3RhbmNlT2ZEYXRhICYgbGlzdE9mVmFyaWFibGUpOworCisKKwlpbmxpbmUgTGlzdE9mUGFpck1hY2hpbmVEYXRhICYgZ2V0Q3VycmVudFByZXNidXJnZXJWYXJpYWJsZSgpCisJeworCQlyZXR1cm4oIG1MaXN0T2ZDdXJyZW50UHJlc2J1cmdlclZhcmlhYmxlICk7CisJfQorCisJc3RhdGljIHZvaWQgcmVmcmVzaEN1cnJlbnRWYXJpYWJsZXMoCisJCQlMaXN0T2ZQYWlyTWFjaGluZURhdGEgJiBjdXJyZW50VmFyaWFibGVzLAorCQkJTGlzdE9mUGFpck1hY2hpbmVEYXRhICYgcmVmZXJlbmNlVmFyaWFibGVzLAorCQkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIG5ld0VELCBjb25zdCBFeGVjdXRpb25EYXRhICYgb2xkRUQpOworCisJLy8gTk9OIFBSRVNCVVJHRVIgVmFyaWFibGUKKwlpbmxpbmUgTGlzdE9mUGFpck1hY2hpbmVEYXRhICYgZ2V0U2VsZWN0ZWROb25QcmVzYnVyZ2VyVmFyaWFibGUoKQorCXsKKwkJcmV0dXJuKCBtTGlzdE9mU2VsZWN0ZWROb25QcmVzYnVyZ2VyVmFyaWFibGUgKTsKKwl9CisKKworCXN0YXRpYyB2b2lkIHNlbGVjdE5vblByZXNidXJnZXJWYXJpYWJsZShjb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwKKwkJCUxpc3RPZlBhaXJNYWNoaW5lRGF0YSAmIGFMaXN0T2ZTZWxlY3RlZFZhcmlhYmxlKTsKKworCXN0YXRpYyB2b2lkIHNlbGVjdERldGFpbHNOb25QcmVzYnVyZ2VyVmFyaWFibGUoY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQsCisJCQlMaXN0T2ZQYWlyTWFjaGluZURhdGEgJiBhTGlzdE9mU2VsZWN0ZWRWYXJpYWJsZSwKKwkJCUxpc3RPZkV4ZWN1dGFibGVGb3JtICYgbGlzdE9mRXhlY3V0YWJsZSwKKwkJCUxpc3RPZkluc3RhbmNlT2ZNYWNoaW5lICYgbGlzdE9mSW5zdGFuY2UsCisJCQlMaXN0T2ZJbnN0YW5jZU9mRGF0YSAmIGxpc3RPZlZhcmlhYmxlKTsKKworCisJaW5saW5lIHZpcnR1YWwgYm9vbCBoYXNWYXJpYWJsZUNvbXBhcmlzb24oKQorCXsKKwkJcmV0dXJuKCAobU1hY2hpbmVDb3VudCA+IDApICYmIG1MaXN0T2ZBbGxWYXJpYWJsZS5ub25lbXB0eSgpICk7CisJfQorCisJLyoqCisJICogc3RyQ29tcGFyZXIKKwkgKi8KKwl2aXJ0dWFsIHN0ZDo6c3RyaW5nIHN0ckNvbXBhcmVyKCkgY29uc3QgPSAwOworfTsKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVFJJVklBTExZIERBVEEgQ09NUEFSQVRPUgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NsYXNzIFRyaXZpYWxseURhdGFDb21wYXJpc29uICA6ICBwdWJsaWMgQmFzZURhdGFDb21wYXJhdG9yCit7CisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlUcml2aWFsbHlEYXRhQ29tcGFyaXNvbihDb25maWd1cmF0aW9uICYgYUNvbmZpZ3VyYXRpb24pCisJOiBCYXNlRGF0YUNvbXBhcmF0b3IoIGFDb25maWd1cmF0aW9uICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5Ucml2aWFsbHlEYXRhQ29tcGFyaXNvbigpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qCisJICogQ09NUEFSRQorCSAqLworCXZpcnR1YWwgYm9vbCBjb21wYXJlREFUQSgKKwkJCWNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBuZXdFQywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIG9sZEVDKTsKKworCXZpcnR1YWwgYm9vbCBjb21wYXJlKAorCQkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIG5ld0VDLCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgb2xkRUMpCisJeworCQlyZXR1cm4oIChuZXdFQy5nZXRFeGVjdXRpb25EYXRhKCkgPT0gb2xkRUMuZ2V0RXhlY3V0aW9uRGF0YSgpKQorCQkJCXx8IChtVXNlVmFyaWFibGUgPyBjb21wYXJlREFUQShuZXdFQywgb2xkRUMpIDogdHJ1ZSkgKTsKKwl9CisKKwkvKioKKwkgKiBzdHJDb21wYXJlcgorCSAqLworCWlubGluZSB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHN0ckNvbXBhcmVyKCkgY29uc3QKKwl7CisJCXJldHVybiggIj0mPSBpLmUuIFRFUSIgKTsKKwl9CisKK307CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBOT05FIERBVEEgQ09NUEFSQVRPUgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NsYXNzIE5vbmVEYXRhQ29tcGFyaXNvbiAgOiAgcHVibGljIEJhc2VEYXRhQ29tcGFyYXRvcgoreworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJTm9uZURhdGFDb21wYXJpc29uKENvbmZpZ3VyYXRpb24gJiBhQ29uZmlndXJhdGlvbikKKwk6IEJhc2VEYXRhQ29tcGFyYXRvciggYUNvbmZpZ3VyYXRpb24gKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfk5vbmVEYXRhQ29tcGFyaXNvbigpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBDT05GSUdVUkUKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCBib29sIGNvbmZpZ3VyZShXT2JqZWN0ICogd2ZGaWx0ZXJPYmplY3QpCisJeworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKworCS8qCisJICogQ09NUEFSRQorCSAqLworCWlubGluZSB2aXJ0dWFsIGJvb2wgY29tcGFyZURBVEEoCisJCQljb25zdCBFeGVjdXRpb25Db250ZXh0ICYgbmV3RUMsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBvbGRFQykKKwl7CisJCXJldHVybiggdHJ1ZSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGJvb2wgY29tcGFyZUlPKAorCQkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIG5ld0VDLCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgb2xkRUMpCisJeworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBib29sIGNvbXBhcmVCVUZGRVIoCisJCQljb25zdCBFeGVjdXRpb25Db250ZXh0ICYgbmV3RUMsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBvbGRFQykKKwl7CisJCXJldHVybiggdHJ1ZSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGJvb2wgY29tcGFyZU1FU1NBR0UoCisJCQljb25zdCBFeGVjdXRpb25Db250ZXh0ICYgbmV3RUMsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBvbGRFQykKKwl7CisJCXJldHVybiggdHJ1ZSApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgYm9vbCBjb21wYXJlKAorCQkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIG5ld0VDLCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgb2xkRUMpCisJeworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKwkvKioKKwkgKiBzdHJDb21wYXJlcgorCSAqLworCWlubGluZSB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHN0ckNvbXBhcmVyKCkgY29uc3QKKwl7CisJCXJldHVybiggIk5PTkUiICk7CisJfQorCit9OworCisKK30KKworI2VuZGlmIC8qQmFzZURhdGFDb21wYXJhdG9yX0hfKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9yZWR1bmRhbmN5L0NvbmZpZ3VyYXRpb25Db21wYXJhdG9yLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9yZWR1bmRhbmN5L0NvbmZpZ3VyYXRpb25Db21wYXJhdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDQ5NTg0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3JlZHVuZGFuY3kvQ29uZmlndXJhdGlvbkNvbXBhcmF0b3IuY3BwCkBAIC0wLDAgKzEsMzU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiQ29uZmlndXJhdGlvbkNvbXBhcmF0b3IuaCIKKworI2luY2x1ZGUgPGZhbS9yZWR1bmRhbmN5L1JlZHVuZGFuY3lGaWx0ZXIuaD4KKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVRdWVyeS5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uQ29uZmlndXJhdGlvbi5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL1J1bnRpbWVJRC5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL1RhYmxlT2ZSdW50aW1lRm9ybVN0YXRlLmg+CisKKyNpbmNsdWRlIDxmbWwvd29ya2Zsb3cvUXVlcnkuaD4KKyNpbmNsdWRlIDxmbWwvd29ya2Zsb3cvV09iamVjdC5oPgorCisjaW5jbHVkZSA8c2V3L0NvbmZpZ3VyYXRpb24uaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworYm9vbCBCYXNlQ29uZmlndXJhdGlvbkNvbXBhcmF0b3I6OmVxdWFscygKKwkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIGZpcnN0RUQsIGNvbnN0IEJGICYgZmlyc3RTY2hlZHVsZSwKKwkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIHNuZEVEICAsIGNvbnN0IEJGICYgc25kU2NoZWR1bGUpCit7CisJcmV0dXJuKCBmaXJzdEVELmdldFJ1bnRpbWVGb3JtU3RhdGVUYWJsZSgpLT4KKwkJCWVxdWFsc1N0YXRlKCBzbmRFRC5nZXRSdW50aW1lRm9ybVN0YXRlVGFibGUoKSApICk7Cit9CisKKy8qIUFMVEVSTkFUSVZFISoKK2Jvb2wgQmFzZUNvbmZpZ3VyYXRpb25Db21wYXJhdG9yOjplcXVhbHMyKAorCQljb25zdCBFeGVjdXRpb25EYXRhICYgZmlyc3RFRCwgY29uc3QgQkYgJiBmaXJzdFNjaGVkdWxlLAorCQljb25zdCBFeGVjdXRpb25EYXRhICYgc25kRUQgICwgY29uc3QgQkYgJiBzbmRTY2hlZHVsZSkKK3sKKwlpZiggZmlyc3RTY2hlZHVsZS52YWxpZCgpICYmIHNuZFNjaGVkdWxlLnZhbGlkKCkgKQorCXsKKy8vCQlBVk1fT1NfVFJBQ0UgPDwgIkNvbXBhcmUgOiIgPDwgc3RkOjplbmRsOworLy8JCUFWTV9PU19UUkFDRSA8PCAiXHQiIDw8IGZpcnN0U2NoZWR1bGUtPnN0cigpIDw8IHN0ZDo6ZW5kbDsKKy8vCQlBVk1fT1NfVFJBQ0UgPDwgIlx0IiA8PCBzbmRTY2hlZHVsZS0+c3RyKCkgPDwgc3RkOjplbmRsOworCisJCWlmKCBmaXJzdFNjaGVkdWxlID09IHNuZFNjaGVkdWxlICkKKwkJeworCQkJaWYoIGZpcnN0U2NoZWR1bGUuaXM8IFJ1bnRpbWVJRCA+KCkgKQorCQkJeworCQkJCXJldHVybiggZXF1YWxzKAorCQkJCQkJZmlyc3RFRCwgZmlyc3RFRC5nZXRSdW50aW1lKAorCQkJCQkJCQlmaXJzdFNjaGVkdWxlLmJmUklEKCkgKS5nZXRPblNjaGVkdWxlKCksCisJCQkJCQlzbmRFRCwgc25kRUQuZ2V0UnVudGltZSgKKwkJCQkJCQkJc25kU2NoZWR1bGUuYmZSSUQoKSApLmdldE9uU2NoZWR1bGUoKSkgKTsKKwkJCX0KKwkJCWVsc2UgaWYoIGZpcnN0U2NoZWR1bGUuaXM8IEF2bUNvZGUgPigpICkKKwkJCXsKKwkJCQlBdm1Db2RlICogc2NoZWR1bGVDb2RlID0gZmlyc3RTY2hlZHVsZS50b19wdHI8IEF2bUNvZGUgPigpOworCisJCQkJQXZtQ29kZTo6aXRlcmF0b3IgaXQgPSBzY2hlZHVsZUNvZGUtPmJlZ2luKCk7CisJCQkJZm9yKCA7IGl0ICE9IHNjaGVkdWxlQ29kZS0+ZW5kKCkgOyArK2l0ICkKKwkJCQl7CisJCQkJCWlmKCBub3QgZXF1YWxzKGZpcnN0RUQsICppdCwgc25kRUQsICppdCkgKQorCQkJCQl7CisJCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJCX0KKwkJCQl9CisJCQkJcmV0dXJuKCB0cnVlICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQVZNX09TX0VYSVQoIEZBSUxFRCApCisJCQkJCQk8PCAiVW5leHBlY3RlZCBTY2hlZHVsZSBFbGVtZW50IFR5cGUgPDwgIgorCQkJCQkJPDwgZmlyc3RTY2hlZHVsZS5zdHIoKSA8PCAiID4+ICEhISIKKwkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmKCBmaXJzdFNjaGVkdWxlLmNsYXNzS2luZCgpID09IHNuZFNjaGVkdWxlLmNsYXNzS2luZCgpICkKKwkJeworCQkJaWYoIGZpcnN0U2NoZWR1bGUuaXM8IFJ1bnRpbWVJRCA+KCkgKQorCQkJeworCQkJCXJldHVybiggKGZpcnN0U2NoZWR1bGUgPT0gc25kU2NoZWR1bGUpJiYgZXF1YWxzKAorCQkJCQkJZmlyc3RFRCwgZmlyc3RFRC5nZXRSdW50aW1lKAorCQkJCQkJCQlmaXJzdFNjaGVkdWxlLmJmUklEKCkgKS5nZXRPblNjaGVkdWxlKCksCisJCQkJCQlzbmRFRCwgc25kRUQuZ2V0UnVudGltZSgKKwkJCQkJCQkJc25kU2NoZWR1bGUuYmZSSUQoKSApLmdldE9uU2NoZWR1bGUoKSkgKTsKKwkJCX0KKwkJCWVsc2UgaWYoIGZpcnN0U2NoZWR1bGUuaXM8IEF2bUNvZGUgPigpICkKKwkJCXsKKwkJCQlBdm1Db2RlICogZmlyc3RDb2RlID0gZmlyc3RTY2hlZHVsZS50b19wdHI8IEF2bUNvZGUgPigpOworCQkJCUF2bUNvZGUgKiBzbmRDb2RlID0gc25kU2NoZWR1bGUudG9fcHRyPCBBdm1Db2RlID4oKTsKKworCQkJCWlmKCAoZmlyc3RDb2RlLT5zYW1lT3BlcmF0b3IoIHNuZENvZGUgKSkgJiYKKwkJCQkJKGZpcnN0Q29kZS0+c2l6ZSgpID09IHNuZENvZGUtPnNpemUoKSkgKQorCQkJCXsKKwkJCQkJQXZtQ29kZTo6aXRlcmF0b3IgaXRGaXJzdCA9IGZpcnN0Q29kZS0+YmVnaW4oKTsKKwkJCQkJQXZtQ29kZTo6aXRlcmF0b3IgaXRTbmQgPSBzbmRDb2RlLT5iZWdpbigpOworCQkJCQlmb3IoICA7IGl0Rmlyc3QgIT0gZmlyc3RDb2RlLT5lbmQoKSA7ICsraXRGaXJzdCAsICsraXRTbmQgKQorCQkJCQl7CisJCQkJCQlpZiggbm90IGVxdWFscyhmaXJzdEVELCAqaXRGaXJzdCwgc25kRUQsICppdFNuZCkgKQorCQkJCQkJeworCQkJCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCQl9CisKKwkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQVZNX09TX0VYSVQoIEZBSUxFRCApCisJCQkJCQk8PCAiVW5leHBlY3RlZCBTY2hlZHVsZSBFbGVtZW50IFR5cGUhISEhISIKKwkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlyZXR1cm4oIGZpcnN0U2NoZWR1bGUgPT0gc25kU2NoZWR1bGUgKTsKKwl9Cit9CisqIUFMVEVSTkFUSVZFISovCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBTEwgQ09ORklHVVJBVElPTiBDT01QQVJBVE9SCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBBbGxDb25maWd1cmF0aW9uQ29tcGFyYXRvcjo6ZXF1YWxzKAorCQljb25zdCBFeGVjdXRpb25Db250ZXh0ICYgbmV3RUMsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBvbGRFQykKK3sKKwlpZiggKCgmIG5ld0VDKSA9PSAoJiBvbGRFQykpCisJCXx8IChuZXdFQy5nZXRFeGVjdXRpb25EYXRhKCkgPT0gb2xkRUMuZ2V0RXhlY3V0aW9uRGF0YSgpKSApCisJeworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKwlpZiggbmV3RUMucmVmRXhlY3V0aW9uRGF0YSgpLmdldFRhYmxlT2ZSdW50aW1lKCkuc2l6ZSgpICE9CisJCQlvbGRFQy5yZWZFeGVjdXRpb25EYXRhKCkuZ2V0VGFibGVPZlJ1bnRpbWUoKS5zaXplKCkgKQorCXsKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCisJcmV0dXJuKCBlcXVhbHMobmV3RUMucmVmRXhlY3V0aW9uRGF0YSgpLAorCQkJbmV3RUMucmVmRXhlY3V0aW9uRGF0YSgpLmdldE9uU2NoZWR1bGUoKSwKKwkJCW9sZEVDLnJlZkV4ZWN1dGlvbkRhdGEoKSwKKwkJCW9sZEVDLnJlZkV4ZWN1dGlvbkRhdGEoKS5nZXRPblNjaGVkdWxlKCkgKSApOworCisvLwlyZXR1cm4oIHN0clN0YXRlQ29uZihuZXdFQy5nZXRFeGVjdXRpb25EYXRhKCkpID09CisvLwkJCXN0clN0YXRlQ29uZihvbGRFQy5nZXRFeGVjdXRpb25EYXRhKCkpICk7Cit9CisKKworCitib29sIEFsbENvbmZpZ3VyYXRpb25Db21wYXJhdG9yOjplcXVhbHMoCisJCWNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBmaXJzdEVELCBjb25zdCBCRiAmIGZpcnN0U2NoZWR1bGUsCisJCWNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBzbmRFRCwgY29uc3QgQkYgJiBzbmRTY2hlZHVsZSkKK3sKKwlyZXR1cm4oIGZpcnN0RUQuZ2V0UnVudGltZUZvcm1TdGF0ZVRhYmxlKCktPgorCQkJZXF1YWxzU3RhdGUoIHNuZEVELmdldFJ1bnRpbWVGb3JtU3RhdGVUYWJsZSgpICkgKTsKK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gREVUQUlMUyBDT05GSUdVUkFUSU9OIENPTVBBUkFUT1IKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIERldGFpbENvbmZpZ3VyYXRpb25Db21wYXJhdG9yOjpjb25maWd1cmUoV09iamVjdCAqIHdmUGFyYW1ldGVyT2JqZWN0KQoreworCVdPYmplY3QgKiB0aGVERVRBSUxTID0gUXVlcnk6OmdldFJlZ2V4V1NlcXVlbmNlKHdmUGFyYW1ldGVyT2JqZWN0LAorCQkJT1JfV0lEMigiY29udHJvbF9zdGF0ZSIsICJDT05UUk9MX1NUQVRFIiksIHdmUGFyYW1ldGVyT2JqZWN0KTsKKworCWlmKCB0aGVERVRBSUxTICE9IFdPYmplY3Q6Ol9OVUxMXyApCisJeworCQljb25zdCBFeGVjdXRpb25EYXRhICYgdGhlRUQgPSBtQ29uZmlndXJhdGlvbi5nZXRNYWluRXhlY3V0aW9uRGF0YSgpOworCisJCUV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlID0gTlVMTDsKKworCQlMaXN0T2ZFeGVjdXRhYmxlRm9ybSBsaXN0T2ZFeGVjdXRhYmxlOworCQlMaXN0T2ZJbnN0YW5jZU9mTWFjaGluZSBsaXN0T2ZJbnN0YW5jZTsKKworCQlFeGVjdXRhYmxlUXVlcnkgWFF1ZXJ5KCBtQ29uZmlndXJhdGlvbiApOworCisJCVdPYmplY3Q6OmNvbnN0X2l0ZXJhdG9yIGl0V2ZPID0gdGhlREVUQUlMUy0+b3duZWRfYmVnaW4oKTsKKwkJV09iamVjdDo6Y29uc3RfaXRlcmF0b3IgZW5kV2ZPID0gdGhlREVUQUlMUy0+b3duZWRfZW5kKCk7CisJCWZvciggOyBpdFdmTyAhPSBlbmRXZk8gOyArK2l0V2ZPICkKKwkJeworCQkJaWYoICgqaXRXZk8pLT5pc1dQcm9wZXJ0eSgpICkKKwkJCXsKKwkJCQljb25zdCBzdGQ6OnN0cmluZyAmIGtpbmQgPSAoKml0V2ZPKS0+Z2V0TmFtZUlEKCk7CisJCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBxbmlkID0gKCppdFdmTyktPnRvU3RyaW5nVmFsdWUoKTsKKworCQkJCWlmKCAoa2luZCA9PSAibW9kZWwiKSB8fCAoa2luZCA9PSAiZm9ybSIpICkKKwkJCQl7CisJCQkJCWFuRXhlY3V0YWJsZSA9IFhRdWVyeS5nZXRFeGVjdXRhYmxlKAorCQkJCQkJCXFuaWQgKS50b19wdHI8IEV4ZWN1dGFibGVGb3JtID4oKTsKKwkJCQkJaWYoIGFuRXhlY3V0YWJsZSAhPSBOVUxMICkKKwkJCQkJeworCQkJCQkJbGlzdE9mRXhlY3V0YWJsZS5hcHBlbmQoYW5FeGVjdXRhYmxlKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCUFWTV9PU19XQVJOIDw8ICJVbmZvdW5kIHRoZSBtYWNoaW5lICI8PCBraW5kIDw8ICIgPDwgIgorCQkJCQkJCQk8PCBxbmlkIDw8ICIgPj4gYXMgcHJvY2Vzc29yIHBhcmFtZXRlcjo+ICIKKwkJCQkJCQkJPDwgd2ZQYXJhbWV0ZXJPYmplY3QtPnN0ckhlYWRlcigpCisJCQkJCQkJCTw8IHN0ZDo6ZW5kbDsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmKCBraW5kID09ICJpbnN0YW5jZSIgKQorCQkJCXsKKwkJCQkJY29uc3QgQkYgJiBhbkluc3RhbmNlID0gWFF1ZXJ5LmdldE1hY2hpbmUoCisJCQkJCQkJU3BlY2lmaWVyOjpERVNJR05fSU5TVEFOQ0VfS0lORCwgcW5pZCApOworCQkJCQlpZiggYW5JbnN0YW5jZS52YWxpZCgpICkKKwkJCQkJeworCQkJCQkJbGlzdE9mSW5zdGFuY2UuYXBwZW5kKAorCQkJCQkJCQlhbkluc3RhbmNlLnRvX3B0cjwgSW5zdGFuY2VPZk1hY2hpbmUgPigpKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCUFWTV9PU19XQVJOIDw8ICJVbmZvdW5kIHRoZSBtYWNoaW5lICIgPDwga2luZCA8PCAiIDw8ICIKKwkJCQkJCQkJPDwgcW5pZCA8PCAiID4+IGFzIHByb2Nlc3NvciBwYXJhbWV0ZXI6PiAiCisJCQkJCQkJCTw8IHdmUGFyYW1ldGVyT2JqZWN0LT5zdHJIZWFkZXIoKQorCQkJCQkJCQk8PCBzdGQ6OmVuZGw7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJQVZNX09TX1dBUk4gPDwgIlVuZXhwZWN0ZWQgYXR0cmlidXRlIDw8ICIKKwkJCQkJCQk8PCAoKml0V2ZPKS0+c3RyKCkKKwkJCQkJCQk8PCAiID4+IGFzIHByb2Nlc3NvciBwYXJhbWV0ZXI6PiAiCisJCQkJCQkJPDwgd2ZQYXJhbWV0ZXJPYmplY3QtPnN0ckhlYWRlcigpCisJCQkJCQkJPDwgc3RkOjplbmRsOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWNvbXB1dGVJZ25vcmVNYWNoaW5lKHRoZUVELCBsaXN0T2ZFeGVjdXRhYmxlLCBsaXN0T2ZJbnN0YW5jZSk7CisKKwl9CisJZWxzZQorCXsKKwkJQVZNX09TX1dBUk4gPDwgIlVuZm91bmQgc2VjdGlvbiA8PCBERVRBSUxTID4+IGFzIHN0YXRlIHNjb3BlIHBhcmFtZXRlciI7CisJfQorCisJcmV0dXJuKCB0cnVlICk7CisKK30KKworCit2b2lkIERldGFpbENvbmZpZ3VyYXRpb25Db21wYXJhdG9yOjphcHBlbmRGYW1pbHlNYWNoaW5lKAorCQljb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwgY29uc3QgUnVudGltZUlEICYgYVJJRCkKK3sKKwlpZiggYVJJRC5pbnZhbGlkKCkgKQorCXsKKwkJcmV0dXJuOworCX0KKworCW1MaXN0T2ZJZ25vcmVNYWNoaW5lLmFwcGVuZChhUklEKTsKKworCWNvbnN0IFJ1bnRpbWVGb3JtICYgYVJGID0gYW5FRC5nZXRSdW50aW1lKGFSSUQpOworCWlmKCBhUkYuaGFzQ2hpbGQoKSApCisJeworCQlUYWJsZU9mUnVudGltZUlEOjpjb25zdF9pdGVyYXRvciBpdCA9IGFSRi5iZWdpbkNoaWxkKCk7CisJCVRhYmxlT2ZSdW50aW1lSUQ6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gYVJGLmVuZENoaWxkKCk7CisJCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCQl7CisJCQlhcHBlbmRGYW1pbHlNYWNoaW5lKCBhbkVEICwgYW5FRC5nZXRSdW50aW1lKCppdCkuZ2V0UklEKCkgKTsKKwkJfQorCX0KK30KKworCit2b2lkIERldGFpbENvbmZpZ3VyYXRpb25Db21wYXJhdG9yOjpjb21wdXRlSWdub3JlTWFjaGluZSgKKwkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQsIExpc3RPZkV4ZWN1dGFibGVGb3JtICYgbGlzdE9mRXhlY3V0YWJsZSwKKwkJTGlzdE9mSW5zdGFuY2VPZk1hY2hpbmUgJiBsaXN0T2ZJbnN0YW5jZSkKK3sKKwlMaXN0T2ZJbnN0YW5jZU9mTWFjaGluZTo6aXRlcmF0b3IgaXRNYWNoaW5lID0gbGlzdE9mSW5zdGFuY2UuYmVnaW4oKTsKKwlmb3IoIDsgaXRNYWNoaW5lICE9IGxpc3RPZkluc3RhbmNlLmVuZCgpIDsgKytpdE1hY2hpbmUgKQorCXsKKwkJYXBwZW5kRmFtaWx5TWFjaGluZSggYW5FRCAsICBhbkVELmdldFJ1bnRpbWVJRCgqaXRNYWNoaW5lKSApOworCX0KK30KKworCisKK2Jvb2wgRGV0YWlsQ29uZmlndXJhdGlvbkNvbXBhcmF0b3I6OmVxdWFscygKKwkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIG5ld0VDLCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgb2xkRUMpCit7CisJaWYoIHJlc3RyaWN0ZWRSdW5uYWJsZUVsZW1lbnRUcmFjZShuZXdFQy5nZXRSdW5uYWJsZUVsZW1lbnRUcmFjZSgpKSApCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiggbmV3RUMucmVmRXhlY3V0aW9uRGF0YSgpLmdldFJ1bnRpbWVGb3JtU3RhdGVUYWJsZSgpLT5lcXVhbHNTdGF0ZSgKKwkJCQlvbGRFQy5yZWZFeGVjdXRpb25EYXRhKCkuZ2V0UnVudGltZUZvcm1TdGF0ZVRhYmxlKCkgKSApOworCX0KK30KKworCitib29sIERldGFpbENvbmZpZ3VyYXRpb25Db21wYXJhdG9yOjpyZXN0cmljdGVkUnVubmFibGVFbGVtZW50VHJhY2UoY29uc3QgQkYgJiBmb3JtKQoreworCWlmKCBmb3JtLmlzPCBFeGVjdXRpb25Db25maWd1cmF0aW9uID4oKSApCisJeworCQlFeGVjdXRpb25Db25maWd1cmF0aW9uICogYUNvbmYgPSBmb3JtLnRvX3B0cjwgRXhlY3V0aW9uQ29uZmlndXJhdGlvbiA+KCk7CisKKwkJcmV0dXJuKCBtTGlzdE9mSWdub3JlTWFjaGluZS5jb250YWlucyhhQ29uZi0+Z2V0UnVudGltZUlEKCkpICk7CisJfQorCisJZWxzZSBpZiggZm9ybS5pczwgQXZtQ29kZSA+KCkgKQorCXsKKwkJQXZtQ29kZSAqIGFDb2RlID0gZm9ybS50b19wdHI8IEF2bUNvZGUgPigpOworCisJCUF2bUNvZGU6Oml0ZXJhdG9yIGl0Q29kZSA9IGFDb2RlLT5iZWdpbigpOworCQlmb3IoIDsgaXRDb2RlICE9IGFDb2RlLT5lbmQoKSA7ICsraXRDb2RlICkKKwkJeworCQkJaWYoIG5vdCByZXN0cmljdGVkUnVubmFibGVFbGVtZW50VHJhY2UoKml0Q29kZSkgKQorCQkJeworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiggdHJ1ZSApOworCX0KKworCWVsc2UKKwl7CisJCXJldHVybiggdHJ1ZSApOworCX0KK30KKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vcmVkdW5kYW5jeS9Db25maWd1cmF0aW9uQ29tcGFyYXRvci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3JlZHVuZGFuY3kvQ29uZmlndXJhdGlvbkNvbXBhcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzNhNGE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3JlZHVuZGFuY3kvQ29uZmlndXJhdGlvbkNvbXBhcmF0b3IuaApAQCAtMCwwICsxLDIzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBDT05GSUdVUkFUSU9OQ09NUEFSQVRPUl9IXworI2RlZmluZSBDT05GSUdVUkFUSU9OQ09NUEFSQVRPUl9IXworCisjaW5jbHVkZSAiQmFzZURhdGFDb21wYXJhdG9yLmgiCisKKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25Db250ZXh0Lmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIEJhc2VDb25maWd1cmF0aW9uQ29tcGFyYXRvciA6IHB1YmxpYyBCYXNlRGF0YUNvbXBhcmF0b3IKK3sKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUJhc2VDb25maWd1cmF0aW9uQ29tcGFyYXRvcihDb25maWd1cmF0aW9uICYgYUNvbmZpZ3VyYXRpb24pCisJOiBCYXNlRGF0YUNvbXBhcmF0b3IoIGFDb25maWd1cmF0aW9uICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5CYXNlQ29uZmlndXJhdGlvbkNvbXBhcmF0b3IoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBDT05GSUdVUkUKKwkgKi8KKwl2aXJ0dWFsIGJvb2wgY29uZmlndXJlKFdPYmplY3QgKiB3ZkZpbHRlck9iamVjdCkKKwl7CisJCS8vISEgTk9USElORworCisJCXJldHVybiggdHJ1ZSApOworCX0KKworCisJLyoKKwkgKiBDT01QQVJFCisJICovCisJaW5saW5lIHZpcnR1YWwgYm9vbCBjb21wYXJlKAorCQkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIG5ld0VDLCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgb2xkRUMpCisJeworCQlyZXR1cm4oIGVxdWFscyhuZXdFQywgb2xkRUMpICk7CisJfQorCisKKwl2aXJ0dWFsIGJvb2wgZXF1YWxzKAorCQkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIG5ld0VDLCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgb2xkRUMpCisJeworCQlpZiggKCgmIG5ld0VDKSA9PSAoJiBvbGRFQykpCisJCQl8fCAobmV3RUMuZ2V0RXhlY3V0aW9uRGF0YSgpID09IG9sZEVDLmdldEV4ZWN1dGlvbkRhdGEoKSkgKQorCQl7CisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWlmKCBuZXdFQy5yZWZFeGVjdXRpb25EYXRhKCkuZ2V0VGFibGVPZlJ1bnRpbWUoKS5zaXplKCkgIT0KKwkJCQlvbGRFQy5yZWZFeGVjdXRpb25EYXRhKCkuZ2V0VGFibGVPZlJ1bnRpbWUoKS5zaXplKCkgKQorCQl7CisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKworCisJCXJldHVybiggZXF1YWxzKG5ld0VDLnJlZkV4ZWN1dGlvbkRhdGEoKSwKKwkJCQluZXdFQy5yZWZFeGVjdXRpb25EYXRhKCkuZ2V0T25TY2hlZHVsZSgpLAorCQkJCW9sZEVDLnJlZkV4ZWN1dGlvbkRhdGEoKSwKKwkJCQlvbGRFQy5yZWZFeGVjdXRpb25EYXRhKCkuZ2V0T25TY2hlZHVsZSgpKSApOworCQkvKiFBTFRFUk5BVElWRSEqCisJCXJldHVybiggbmV3RUMucmVmRXhlY3V0aW9uRGF0YSgpLnN0clN0YXRlQ29uZigpCisJCQkJPT0gb2xkRUMucmVmRXhlY3V0aW9uRGF0YSgpLnN0clN0YXRlQ29uZigpICk7CisJCSohQUxURVJOQVRJVkUhKi8KKwl9CisKKworCXZpcnR1YWwgYm9vbCBlcXVhbHMoY29uc3QgRXhlY3V0aW9uRGF0YSAmIGZpcnN0RUQsIGNvbnN0IEJGICYgZmlyc3RTY2hlZHVsZSwKKwkJCWNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBzbmRFRCwgY29uc3QgQkYgJiBzbmRTY2hlZHVsZSk7CisKKwkvKioKKwkgKiBzdHJDb21wYXJlcgorCSAqLworCWlubGluZSB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHN0ckNvbXBhcmVyKCkgY29uc3QKKwl7CisJCXJldHVybiggImNvbnRyb2xfc2NvcGU6IEFMTCIgKTsKKwl9CisKK307CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBTEwgQ09ORklHVVJBVElPTiBDT01QQVJBVE9SCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY2xhc3MgQWxsQ29uZmlndXJhdGlvbkNvbXBhcmF0b3IgIDogIHB1YmxpYyBCYXNlQ29uZmlndXJhdGlvbkNvbXBhcmF0b3IKK3sKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUFsbENvbmZpZ3VyYXRpb25Db21wYXJhdG9yKENvbmZpZ3VyYXRpb24gJiBhQ29uZmlndXJhdGlvbikKKwk6IEJhc2VDb25maWd1cmF0aW9uQ29tcGFyYXRvciggYUNvbmZpZ3VyYXRpb24gKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkFsbENvbmZpZ3VyYXRpb25Db21wYXJhdG9yKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisKKwkvKgorCSAqIENPTVBBUkUKKwkgKi8KKwl2aXJ0dWFsIGJvb2wgZXF1YWxzKAorCQkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIG5ld0VDLCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgb2xkRUMpOworCisKKwl2aXJ0dWFsIGJvb2wgZXF1YWxzKAorCQkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIGZpcnN0RUQsIGNvbnN0IEJGICYgZmlyc3RTY2hlZHVsZSwKKwkJCWNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBzbmRFRCAgLCBjb25zdCBCRiAmIHNuZFNjaGVkdWxlKTsKKworfTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERFVEFJTFMgQ09ORklHVVJBVElPTiBDT01QQVJBVE9SCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY2xhc3MgUnVudGltZUlEOworCitjbGFzcyBEZXRhaWxDb25maWd1cmF0aW9uQ29tcGFyYXRvciAgOiAgcHVibGljIEJhc2VDb25maWd1cmF0aW9uQ29tcGFyYXRvcgoreworCitwcm90ZWN0ZWQ6CisJLyoKKwkgKiBBVFRSSUJVVEVTCisJICovCisJTGlzdDwgUnVudGltZUlEID4gbUxpc3RPZklnbm9yZU1hY2hpbmU7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCURldGFpbENvbmZpZ3VyYXRpb25Db21wYXJhdG9yKENvbmZpZ3VyYXRpb24gJiBhQ29uZmlndXJhdGlvbikKKwk6IEJhc2VDb25maWd1cmF0aW9uQ29tcGFyYXRvciggYUNvbmZpZ3VyYXRpb24gKSwKKwltTGlzdE9mSWdub3JlTWFjaGluZSggKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkRldGFpbENvbmZpZ3VyYXRpb25Db21wYXJhdG9yKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisKKwkvKioKKwkgKiBDT05GSUdVUkUKKwkgKi8KKwl2aXJ0dWFsIGJvb2wgY29uZmlndXJlKFdPYmplY3QgKiB3ZlBhcmFtZXRlck9iamVjdCk7CisKKwl2b2lkIGNvbXB1dGVJZ25vcmVNYWNoaW5lKGNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVELAorCQkJTGlzdE9mRXhlY3V0YWJsZUZvcm0gJiBsaXN0T2ZFeGVjdXRhYmxlLAorCQkJTGlzdE9mSW5zdGFuY2VPZk1hY2hpbmUgJiBsaXN0T2ZJbnN0YW5jZSk7CisKKwl2b2lkIGFwcGVuZEZhbWlseU1hY2hpbmUoCisJCQljb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwgY29uc3QgUnVudGltZUlEICYgYVJJRCk7CisKKworCS8qCisJICogQ09NUEFSRQorCSAqLworCisJdmlydHVhbCBib29sIGVxdWFscygKKwkJCWNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBuZXdFQywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIG9sZEVDKTsKKworCWJvb2wgcmVzdHJpY3RlZFJ1bm5hYmxlRWxlbWVudFRyYWNlKGNvbnN0IEJGICYgZm9ybSk7CisKKwkvKioKKwkgKiBzdHJDb21wYXJlcgorCSAqLworCWlubGluZSB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHN0ckNvbXBhcmVyKCkgY29uc3QKKwl7CisJCXJldHVybiggImNvbnRyb2xfc2NvcGU6IERFVEFJTFMiICk7CisJfQorCit9OworCisKKworfQorCisjZW5kaWYgLypDT05GSUdVUkFUSU9OQ09NUEFSQVRPUl9IXyovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vcmVkdW5kYW5jeS9EYXRhU29sdmVyQ29tcGFyYXRvci5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vcmVkdW5kYW5jeS9EYXRhU29sdmVyQ29tcGFyYXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ2ZDk0NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9yZWR1bmRhbmN5L0RhdGFTb2x2ZXJDb21wYXJhdG9yLmNwcApAQCAtMCwwICsxLDE4NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgIkRhdGFTb2x2ZXJDb21wYXJhdG9yLmgiCisKKyNpbmNsdWRlIDxmYW0vcmVkdW5kYW5jeS9SZWR1bmRhbmN5RmlsdGVyLmg+CisKKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25Db250ZXh0Lmg+CisKKyNpbmNsdWRlIDxmbWwvd29ya2Zsb3cvUXVlcnkuaD4KKyNpbmNsdWRlIDxmbWwvd29ya2Zsb3cvV09iamVjdC5oPgorCisjaW5jbHVkZSA8c2V3L0NvbmZpZ3VyYXRpb24uaD4KKworI2luY2x1ZGUgPHNvbHZlci9hcGkvU29sdmVyRGVmLmg+CisjaW5jbHVkZSA8c29sdmVyL2FwaS9Tb2x2ZXJGYWN0b3J5Lmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorICogREVTVFJVQ1RPUgorICovCitCYXNlRGF0YVNvbHZlckNvbXBhcmF0b3I6On5CYXNlRGF0YVNvbHZlckNvbXBhcmF0b3IoKQoreworCVNvbHZlckZhY3Rvcnk6OmRlc3Ryb3koIG1Tb2x2ZXIgKTsKK30KKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3Byb3RvdHlwZSBmaWx0ZXI6OnJlZHVuZGFuY3kgYXMgYXZtOjpjb3JlLmZpbHRlci5SRURVTkRBTkNZIGlzCitzZWN0aW9uIFBST1BFUlRZCisJQHByZWRpY2F0ZSA9ICdJTkNMVVNJT04nOyAgLy8gKCA8PSAgfCBJTkMgfCBJTkNMVVNJT04gKQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggPT0gIHwgRVEgIHwgRVFVQUxJVFkgKQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggPWE9IHwgQUVRIHwgQUxQSEFfRVFVSVYpCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCA9cz0gfCBTRVEgfCBTWU5UQVhJQ19FUVVBTElUWSkKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoID10PSB8IFRFUSB8IFRSSVZJQUxMWV9FUVVBTElUWSkKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT05FCisKKwlAc29sdmVyID0gJ09NRUdBJzsgICAgICAgICAvLyBPTUVHQSB8IENWQzMKKworCUBwYXRoX3Njb3BlID0gJ0FMTCc7ICAgICAgIC8vIEFMTCBleGVjdXRpb24gZ3JhcGggcGF0aCB8IENVUlJFTlQgZXhlY3V0aW9uIGdyYXBoIHBhdGgKKworCUBkYXRhX3Njb3BlID0gJ0FMTCc7ICAgICAgIC8vIEFMTCBkYXRhIDsgb3IgREVUQUlMUyBzZWN0aW9uCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gREVUQUlMUyB8IERFVEFJTFM8IGV4Y2x1ZGUgPiBzb21lIGRhdGEsCitlbmRzZWN0aW9uIFBST1BFUlRZCisKK3NlY3Rpb24gSEVVUklTVElDCisJQGNvbW11bmljYXRpb24gPSBmYWxzZTsKKworCUB2YXJpYWJsZSA9IHRydWU7CisJQHBhdGhfY29uZGl0aW9uID0gZmFsc2U7CitlbmRzZWN0aW9uIEhFVVJJU1RJQworCitzZWN0aW9uIERFVEFJTFMKKwlAbW9kZWwgPSB1Zmk7CisKKwlAaW5zdGFuY2UgPSB1Zmk7CisKKwlAdmFyaWFibGUgPSB1Zmk7CitlbmRzZWN0aW9uIERFVEFJTFMKK2VuZHByb3RvdHlwZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisKKy8qKgorICogQ09ORklHVVJFCisgKi8KK2Jvb2wgQmFzZURhdGFTb2x2ZXJDb21wYXJhdG9yOjpjb25maWd1cmUoV09iamVjdCAqIHdmUGFyYW1ldGVyT2JqZWN0KQoreworCWlmKCBub3QgQmFzZURhdGFDb21wYXJhdG9yOjpjb25maWd1cmUod2ZQYXJhbWV0ZXJPYmplY3QpICkKKwl7CisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwlXT2JqZWN0ICogdGhlUFJPUEVSVFkgPQorCQkJUmVkdW5kYW5jeUZpbHRlcjo6QVVUT19SRUdJU1RFUl9UT09MLmlzVHlwZUlEKCAqIHdmUGFyYW1ldGVyT2JqZWN0ICkKKwkJCT8gUXVlcnk6OmdldFJlZ2V4V1NlcXVlbmNlKHdmUGFyYW1ldGVyT2JqZWN0LAorCQkJCQlPUl9XSUQyKCJwcm9wZXJ0eSIsICJQUk9QRVJUWSIpLCB3ZlBhcmFtZXRlck9iamVjdCkKKwkJCTogUXVlcnk6OmdldFJlZ2V4V1NlcXVlbmNlKHdmUGFyYW1ldGVyT2JqZWN0LAorCQkJCQlPUl9XSUQyKCJyZWR1bmRhbmN5IiAsICJSRURVTkRBTkNZIiksIHdmUGFyYW1ldGVyT2JqZWN0KTsKKworCXN0ZDo6c3RyaW5nIHNvbHZlcklEID0gUXVlcnk6OmdldFdQcm9wZXJ0eVN0cmluZyh0aGVQUk9QRVJUWSwgInNvbHZlciIsCisJCQlTb2x2ZXJEZWY6OnN0clNvbHZlcihTb2x2ZXJEZWY6OlNPTFZFUl9PTUVHQV9LSU5EKSk7CisKKwlBVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoIFNvbHZlckRlZjo6aXNBdmFpbGFibGVTb2x2ZXIoCisJCQlTb2x2ZXJEZWY6OnRvU29sdmVyKHNvbHZlcklELCBTb2x2ZXJEZWY6OlNPTFZFUl9VTkRFRklORURfS0lORCkpICkKKwkJCTw8ICJSZWR1bmRhbmN5OiBVbmtub3duIHNvbHZlciA8PCAiIDw8IHNvbHZlcklECisJCQk8PCAiID4+IGFzIHBhcmFtZXRlciAodHJ5aW5nIHRvIHVzZSB0aGUgZGVmYXVsdCBPTUVHQSBzb2x2ZXIpISEhIgorCQkJPDwgU0VORF9BTEVSVDsKKworCVNvbHZlckRlZjo6U09MVkVSX0tJTkQgc29sdmVyS2luZyA9CisJCQlTb2x2ZXJEZWY6OnRvU29sdmVyKHNvbHZlcklELCBTb2x2ZXJEZWY6OlNPTFZFUl9PTUVHQV9LSU5EKTsKKworCWlmKCBub3QgU29sdmVyRGVmOjppc0F2YWlsYWJsZVNvbHZlciggc29sdmVyS2luZyApICkKKwl7CisJCUFWTV9PU19FUlJPUl9BTEVSVDw8ICJSZWR1bmRhbmN5OiBVbmtub3duIHNvbHZlciA8PCAiCisJCQkJPDwgc29sdmVySUQgPDwgIiA+PiAhISEiCisJCQkJPDwgU0VORF9FWElUOworCisJCW1Tb2x2ZXIgPSBOVUxMOworCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwltU29sdmVyID0gU29sdmVyRmFjdG9yeTo6bmV3U29sdmVyNENoZWNrU2F0aXNmaWFiaWxpdHkoIHNvbHZlcktpbmcgKTsKKworCWlmKCBtU29sdmVyICE9IE5VTEwgKQorCXsKKwkJbVNvbHZlci0+c2V0Q3VycmVudFBhdGhTY29wZSggaXNDdXJyZW50UGF0aFNjb3BlKCkgKTsKKworCQlyZXR1cm4oIG1Tb2x2ZXItPmNvbmZpZ3VyZShtQ29uZmlndXJhdGlvbiwKKwkJCQl3ZlBhcmFtZXRlck9iamVjdCwgZ2V0U2VsZWN0ZWRQcmVzYnVyZ2VyVmFyaWFibGUoKSkgKTsKKwl9CisJZWxzZQorCXsKKwkJQVZNX09TX0VSUk9SX0FMRVJUIDw8ICJVbmV4cGVjdGVkIFJFRFVOREFOQ1kgZmlsdGVyIDw8IEBzb2x2ZXIgPSAiCisJCQkJPDwgc29sdmVySUQgPDwgIjsgPj4gISEhIiA8PCBzdGQ6OmVuZGwKKwkJCQk8PCAiTkIuIDw8IEBzb2x2ZXIgPSB7ICdPTUVHQScgfCAnQ1ZDNCcgfTsgPj4gISEhIgorCQkJCTw8IFNFTkRfQUxFUlQ7CisKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKKworLyoKKyAqIENPTVBBUkUKKyAqLworYm9vbCBCYXNlRGF0YVNvbHZlckNvbXBhcmF0b3I6OmNvbXBhcmUoCisJCWNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBuZXdFQywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIG9sZEVDKQoreworCWlmKCBtTWFjaGluZUNvdW50ICE9IG5ld0VDLnJlZkV4ZWN1dGlvbkRhdGEoKS5nZXRUYWJsZU9mUnVudGltZSgpLnNpemUoKSApCisJeworCQltTWFjaGluZUNvdW50ID0gbmV3RUMucmVmRXhlY3V0aW9uRGF0YSgpLmdldFRhYmxlT2ZSdW50aW1lKCkuc2l6ZSgpOworCisJCWNvbXB1dGVBbGxNYWNoaW5lRGF0YSggbmV3RUMucmVmRXhlY3V0aW9uRGF0YSgpICk7CisKKwkJZ2V0U29sdmVyKCktPnNldFNlbGVjdGVkVmFyaWFibGUoCisJCQkJbUNvbmZpZ3VyYXRpb24uZ2V0TWFpbkV4ZWN1dGlvbkRhdGEoKSwKKwkJCQlnZXRTZWxlY3RlZFByZXNidXJnZXJWYXJpYWJsZSgpICk7CisJfQorCisJaWYoIG1DdXJyZW50UGF0aFNjb3BlRmxhZyApCisJeworCQlyZWZyZXNoQ3VycmVudFZhcmlhYmxlcyhnZXRDdXJyZW50UHJlc2J1cmdlclZhcmlhYmxlKCksCisJCQkJZ2V0U2VsZWN0ZWRQcmVzYnVyZ2VyVmFyaWFibGUoKSwKKwkJCQluZXdFQy5yZWZFeGVjdXRpb25EYXRhKCksIG9sZEVDLnJlZkV4ZWN1dGlvbkRhdGEoKSk7CisKKwkJZ2V0U29sdmVyKCktPnNldFNlbGVjdGVkVmFyaWFibGUobmV3RUMucmVmRXhlY3V0aW9uRGF0YSgpLAorCQkJCWdldEN1cnJlbnRQcmVzYnVyZ2VyVmFyaWFibGUoKSk7CisJfQorCisJaWYoIGNvbXBhcmVURVEobmV3RUMsIG9sZEVDKSApCisJeworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisJZWxzZSBpZiggbVVzZUNvbW11bmljYXRpb24gfHwgbVVzZVZhcmlhYmxlICkKKwl7CisJCXJldHVybiggKG1Vc2VDb21tdW5pY2F0aW9uID8gY29tcGFyZUlPKG5ld0VDLCBvbGRFQykgOiB0cnVlKQorCQkJCSYmIChtVXNlVmFyaWFibGUgPyBjb21wYXJlREFUQShuZXdFQywgb2xkRUMpIDogdHJ1ZSkgKTsKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9yZWR1bmRhbmN5L0RhdGFTb2x2ZXJDb21wYXJhdG9yLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vcmVkdW5kYW5jeS9EYXRhU29sdmVyQ29tcGFyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjOGVkYmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vcmVkdW5kYW5jeS9EYXRhU29sdmVyQ29tcGFyYXRvci5oCkBAIC0wLDAgKzEsMTg0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIERBVEFTT0xWRVJDT01QQVJBVE9SX0hfCisjZGVmaW5lIERBVEFTT0xWRVJDT01QQVJBVE9SX0hfCisKKyNpbmNsdWRlICJCYXNlRGF0YUNvbXBhcmF0b3IuaCIKKworI2luY2x1ZGUgPHNvbHZlci9hcGkvU2F0U29sdmVyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIEJhc2VEYXRhU29sdmVyQ29tcGFyYXRvciA6IHB1YmxpYyBCYXNlRGF0YUNvbXBhcmF0b3IKK3sKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlTYXRTb2x2ZXIgKiBtU29sdmVyOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlCYXNlRGF0YVNvbHZlckNvbXBhcmF0b3IoQ29uZmlndXJhdGlvbiAmIGFDb25maWd1cmF0aW9uKQorCTogQmFzZURhdGFDb21wYXJhdG9yKCBhQ29uZmlndXJhdGlvbiApLAorCW1Tb2x2ZXIoIE5VTEwgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkJhc2VEYXRhU29sdmVyQ29tcGFyYXRvcigpOworCisKKwkvKioKKwkgKiBDT05GSUdVUkUKKwkgKi8KKwl2aXJ0dWFsIGJvb2wgY29uZmlndXJlKFdPYmplY3QgKiB3ZlBhcmFtZXRlck9iamVjdCk7CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1Tb2x2ZXIKKwkgKi8KKwlpbmxpbmUgU2F0U29sdmVyICogZ2V0U29sdmVyKCkKKwl7CisJCXJldHVybiggbVNvbHZlciApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGJvb2wgaGFzVmFyaWFibGVDb21wYXJpc29uKCkKKwl7CisJCXJldHVybiggKG1Tb2x2ZXIgIT0gTlVMTCkgJiYgbVNvbHZlci0+aGFzU2VsZWN0ZWRWYXJpYWJsZSgpICk7CisJfQorCisKKwkvKgorCSAqIENPTVBBUkUKKwkgKi8KKwl2aXJ0dWFsIGJvb2wgY29tcGFyZSgKKwkJCWNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBuZXdFQywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIG9sZEVDKTsKKworfTsKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU09MVkVSIEVRVUFMSVRZCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY2xhc3MgRGF0YVNvbHZlckVxdWFsaXR5IDogcHVibGljIEJhc2VEYXRhU29sdmVyQ29tcGFyYXRvcgoreworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJRGF0YVNvbHZlckVxdWFsaXR5KENvbmZpZ3VyYXRpb24gJiBhQ29uZmlndXJhdGlvbikKKwk6IEJhc2VEYXRhU29sdmVyQ29tcGFyYXRvciggYUNvbmZpZ3VyYXRpb24gKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkRhdGFTb2x2ZXJFcXVhbGl0eSgpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qCisJICogQ09NUEFSRQorCSAqLworCWlubGluZSB2aXJ0dWFsIGJvb2wgY29tcGFyZURBVEEoCisJCQljb25zdCBFeGVjdXRpb25Db250ZXh0ICYgbmV3RUMsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBvbGRFQykKKwl7CisJCXJldHVybiggZ2V0U29sdmVyKCktPmlzRXF1YWxTZXQobmV3RUMsIG9sZEVDKSApOworCX0KKworCS8qKgorCSAqIHN0ckNvbXBhcmVyCisJICovCisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgc3RyQ29tcGFyZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAiPT0gaS5lLiBFUSIgKTsKKwl9CisKK307CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTT0xWRVIgSU5DTFVTSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY2xhc3MgRGF0YVNvbHZlckluY2x1c2lvbiA6IHB1YmxpYyBCYXNlRGF0YVNvbHZlckNvbXBhcmF0b3IKK3sKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCURhdGFTb2x2ZXJJbmNsdXNpb24oQ29uZmlndXJhdGlvbiAmIGFDb25maWd1cmF0aW9uKQorCTogQmFzZURhdGFTb2x2ZXJDb21wYXJhdG9yKCBhQ29uZmlndXJhdGlvbiApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+RGF0YVNvbHZlckluY2x1c2lvbigpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qCisJICogQ09NUEFSRQorCSAqLworCXZpcnR1YWwgYm9vbCBjb21wYXJlREFUQSgKKwkJCWNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBuZXdFQywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIG9sZEVDKQorCXsKKwkJcmV0dXJuKCBnZXRTb2x2ZXIoKS0+aXNTdWJTZXQobmV3RUMsIG9sZEVDKSApOworCX0KKworCS8qKgorCSAqIHN0ckNvbXBhcmVyCisJICovCisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgc3RyQ29tcGFyZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAiPD0gaS5lLiBJTkNMVVNJT04iICk7CisJfQorCit9OworCisKK30KKworI2VuZGlmIC8qREFUQVNPTFZFUkNPTVBBUkFUT1JfSF8qLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3JlZHVuZGFuY3kvRGF0YVN5bnRheGljRXF1aXZhbGVuY2UuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3JlZHVuZGFuY3kvRGF0YVN5bnRheGljRXF1aXZhbGVuY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYTBiZjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vcmVkdW5kYW5jeS9EYXRhU3ludGF4aWNFcXVpdmFsZW5jZS5jcHAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3JlZHVuZGFuY3kvRGF0YVN5bnRheGljRXF1aXZhbGVuY2UuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9yZWR1bmRhbmN5L0RhdGFTeW50YXhpY0VxdWl2YWxlbmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM2NTc4NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9yZWR1bmRhbmN5L0RhdGFTeW50YXhpY0VxdWl2YWxlbmNlLmgKQEAgLTAsMCArMSwxMjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgRGF0YVN5bnRheGljRXF1aXZhbGVuY2VfSF8KKyNkZWZpbmUgRGF0YVN5bnRheGljRXF1aXZhbGVuY2VfSF8KKworI2luY2x1ZGUgIkJhc2VEYXRhQ29tcGFyYXRvci5oIgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBEQVRBIFNZTlRBWElDIEVRVUlWQUxFTkNFCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY2xhc3MgRGF0YVN5bnRheGljRXF1aXZhbGVuY2UgOiBwdWJsaWMgQmFzZURhdGFDb21wYXJhdG9yCit7CisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlEYXRhU3ludGF4aWNFcXVpdmFsZW5jZShDb25maWd1cmF0aW9uICYgYUNvbmZpZ3VyYXRpb24pCisJOiBCYXNlRGF0YUNvbXBhcmF0b3IoIGFDb25maWd1cmF0aW9uICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5EYXRhU3ludGF4aWNFcXVpdmFsZW5jZSgpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qCisJICogQ09NUEFSRQorCSAqLworCXZpcnR1YWwgYm9vbCBjb21wYXJlTUVTU0FHRSgKKwkJCWNvbnN0IE1lc3NhZ2UgJiBuZXdNc2csIGNvbnN0IE1lc3NhZ2UgJiBvbGRNc2cpOworCisJdmlydHVhbCBib29sIGNvbXBhcmVEQVRBKAorCQkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIG5ld0VDLCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgb2xkRUMpOworCisJLyoqCisJICogc3RyQ29tcGFyZXIKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCBzdGQ6OnN0cmluZyBzdHJDb21wYXJlcigpIGNvbnN0CisJeworCQlyZXR1cm4oICI9cz0gaS5lLiBTRVEiICk7CisJfQorCit9OworCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBEQVRBIEFMUEhBIEVRVUlWQUxFTkNFCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY2xhc3MgRGF0YUFscGhhRXF1aXZhbGVuY2UgOiBwdWJsaWMgQmFzZURhdGFDb21wYXJhdG9yCit7CisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlEYXRhQWxwaGFFcXVpdmFsZW5jZShDb25maWd1cmF0aW9uICYgYUNvbmZpZ3VyYXRpb24pCisJOiBCYXNlRGF0YUNvbXBhcmF0b3IoIGFDb25maWd1cmF0aW9uICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5EYXRhQWxwaGFFcXVpdmFsZW5jZSgpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qCisJICogQ09NUEFSRQorCSAqLworCXZpcnR1YWwgYm9vbCBjb21wYXJlREFUQSgKKwkJCWNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBuZXdFQywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIG9sZEVDKTsKKworCS8qKgorCSAqIHN0ckNvbXBhcmVyCisJICovCisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgc3RyQ29tcGFyZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAiPWE9IGkuZS4gQUVRIiApOworCX0KKworfTsKKworCit9CisKKyNlbmRpZiAvKkRhdGFTeW50YXhpY0VxdWl2YWxlbmNlX0hfKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9yZWR1bmRhbmN5L1BhdGhTY29wZUl0ZXJhdG9yLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vcmVkdW5kYW5jeS9QYXRoU2NvcGVJdGVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNTkxZmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vcmVkdW5kYW5jeS9QYXRoU2NvcGVJdGVyYXRvci5oCkBAIC0wLDAgKzEsNDY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFBBVEhTQ09QRUlURVJBVE9SX0hfCisjZGVmaW5lIFBBVEhTQ09QRUlURVJBVE9SX0hfCisKKyNpbmNsdWRlICJDb25maWd1cmF0aW9uQ29tcGFyYXRvci5oIgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uQ29udGV4dC5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkRhdGEuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworY2xhc3MgQmFzZVBhdGhTY29wZUl0ZXJhdG9yCit7CisKK3Byb3RlY3RlZDoKKworCS8qCisJICogQVRUUklCVVRFUworCSAqLworCWNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgKiBtSW50ZXJlc3RFQzsKKworCUJhc2VDb25maWd1cmF0aW9uQ29tcGFyYXRvciAqIG1Db25maWd1cmF0aW9uQ29tcGFyYXRvcjsKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUJhc2VQYXRoU2NvcGVJdGVyYXRvcihCYXNlQ29uZmlndXJhdGlvbkNvbXBhcmF0b3IgKiBhQ29uZmlnQ29tcGFyYXRvcikKKwk6IG1JbnRlcmVzdEVDKCBOVUxMICksCisJbUNvbmZpZ3VyYXRpb25Db21wYXJhdG9yKCBhQ29uZmlnQ29tcGFyYXRvciApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+QmFzZVBhdGhTY29wZUl0ZXJhdG9yKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogQ09ORklHVVJFCisJICovCisJdmlydHVhbCBib29sIGNvbmZpZ3VyZShXT2JqZWN0ICogd2ZGaWx0ZXJPYmplY3QpCisJeworCQkvLyEhIE5PVEhJTkcKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisKKworCS8qIElURVJBVE9SCisJICogdGhlQmVnaW5FQyB0byB0aGVFbmQgdXNpbmcgdGhlQ3VycmVudEVDCisJICovCisJdmlydHVhbCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICogYmVnaW4oCisJCQljb25zdCBFeGVjdXRpb25Db250ZXh0ICogYW5JbnRlcmVzdEVDKSA9IDA7CisKKwl2aXJ0dWFsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgKiBiZWdpbigpID0gMDsKKworCisJdmlydHVhbCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICogY3VycmVudCgpID0gMDsKKworCisJdmlydHVhbCBib29sIGhhc05leHQoKSA9IDA7CisKKwl2aXJ0dWFsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgKiBuZXh0KCkgPSAwOworCisKKwl2aXJ0dWFsIHZvaWQgaGFzaChjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5JbnRlcmVzdEVDKSA9IDA7CisKKworCS8qKgorCSAqIEhBTkRMRVIgZm9yIEV2ZW50IE5vdGlmaWNhdGlvbgorCSAqIERlc3Ryb3kgRXhlY3V0aW9uIENvbnRleHQKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCB2b2lkIGhhbmRsZUV2ZW50RGVzdHJveUN0eChjb25zdCBFeGVjdXRpb25Db250ZXh0ICogYW5FQykKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyogR0VUVEVSIC0gU0VUVEVSCisJICogbUludGVyZXN0RUMKKwkgKi8KKwlpbmxpbmUgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAqIGdldEludGVyZXN0KCkKKwl7CisJCXJldHVybiggbUludGVyZXN0RUMgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNJbnRlcmVzdCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1JbnRlcmVzdEVDICE9IE5VTEwgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRJbnRlcmVzdChjb25zdCBFeGVjdXRpb25Db250ZXh0ICogYW5JbnRlcmVzdEVDKQorCXsKKwkJbUludGVyZXN0RUMgPSBhbkludGVyZXN0RUM7CisJfQorCisKKwkvKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtQ29uZmlndXJhdGlvbkNvbXBhcmF0b3IKKwkgKi8KKwlpbmxpbmUgQmFzZUNvbmZpZ3VyYXRpb25Db21wYXJhdG9yICogZ2V0Q29uZmlndXJhdGlvbkNvbXBhcmF0b3IoKQorCXsKKwkJcmV0dXJuKCBtQ29uZmlndXJhdGlvbkNvbXBhcmF0b3IgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNDb25maWd1cmF0aW9uQ29tcGFyYXRvcigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Db25maWd1cmF0aW9uQ29tcGFyYXRvciAhPSBOVUxMICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0Q29uZmlndXJhdGlvbkNvbXBhcmF0b3IoCisJCQlCYXNlQ29uZmlndXJhdGlvbkNvbXBhcmF0b3IgKiBhQ29uZmlndXJhdGlvbkNvbXBhcmF0b3IpCisJeworCQltQ29uZmlndXJhdGlvbkNvbXBhcmF0b3IgPSBhQ29uZmlndXJhdGlvbkNvbXBhcmF0b3I7CisJfQorCit9OworCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBTEwgUEFUSCBTQ09QRSBJVEVSQVRPUgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NsYXNzIEFsbFBhdGhTY29wZUl0ZXJhdG9yIDogcHVibGljIEJhc2VQYXRoU2NvcGVJdGVyYXRvcgoreworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQVRUUklCVVRFUworCSAqLworCUxpc3RPZkNvbnN0RXhlY3V0aW9uQ29udGV4dCBtSGFzaFRhYmxlOworCisJTGlzdE9mQ29uc3RFeGVjdXRpb25Db250ZXh0Ojpjb25zdF9pdGVyYXRvciBpdEJlZ2luOworCUxpc3RPZkNvbnN0RXhlY3V0aW9uQ29udGV4dDo6Y29uc3RfaXRlcmF0b3IgaXRFbmQ7CisKKwlMaXN0T2ZDb25zdEV4ZWN1dGlvbkNvbnRleHQ6OmNvbnN0X2l0ZXJhdG9yIGl0Q3VycmVudDsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQWxsUGF0aFNjb3BlSXRlcmF0b3IoQmFzZUNvbmZpZ3VyYXRpb25Db21wYXJhdG9yICogYUNvbmZpZ0NvbXBhcmF0b3IpCisJOiBCYXNlUGF0aFNjb3BlSXRlcmF0b3IoIGFDb25maWdDb21wYXJhdG9yICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5BbGxQYXRoU2NvcGVJdGVyYXRvcigpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qIElURVJBVE9SCisJICogdGhlQmVnaW4gdG8gdGhlRW5kIHVzaW5nIHRoZUN1cnJlbnQKKwkgKiBuZXh0CisJICovCisJaW5saW5lIHZpcnR1YWwgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAqIGJlZ2luKAorCQkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAqIGFuSW50ZXJlc3RFQykKKwl7CisJCW1JbnRlcmVzdEVDID0gYW5JbnRlcmVzdEVDOworCisJCWZvciggaXRDdXJyZW50ID0gZ2V0SGFzaFRhYmxlKCkuYmVnaW4oKSA7CisJCQkJaXRDdXJyZW50ICE9IGdldEhhc2hUYWJsZSgpLmVuZCgpIDsgKytpdEN1cnJlbnQgKQorCQl7CisJCQlpZiggZ2V0Q29uZmlndXJhdGlvbkNvbXBhcmF0b3IoKS0+ZXF1YWxzKAorCQkJCQkoKiBtSW50ZXJlc3RFQyksICgqICgqaXRDdXJyZW50KSkpICkKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWl0QmVnaW4gPSBpdEN1cnJlbnQ7CisKKwkJcmV0dXJuKCAoaXRDdXJyZW50ICE9IGdldEhhc2hUYWJsZSgpLmVuZCgpKT8gKCppdEN1cnJlbnQpIDogTlVMTCApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgKiBiZWdpbigpCisJeworCQlyZXR1cm4oIChpdEJlZ2luICE9IGdldEhhc2hUYWJsZSgpLmVuZCgpKT8gKCppdEJlZ2luKSA6IE5VTEwgKTsKKwl9CisKKwl2aXJ0dWFsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgKiBjdXJyZW50KCkKKwl7CisJCXJldHVybiggKGl0Q3VycmVudCAhPSBnZXRIYXNoVGFibGUoKS5lbmQoKSk/ICgqaXRDdXJyZW50KSA6IE5VTEwgKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIGJvb2wgaGFzTmV4dCgpCisJeworCQlyZXR1cm4oIGl0Q3VycmVudCAhPSBnZXRIYXNoVGFibGUoKS5lbmQoKSApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAqIG5leHQoKQorCXsKKwkJaWYoIGl0Q3VycmVudCAhPSBnZXRIYXNoVGFibGUoKS5lbmQoKSApCisJCXsKKwkJCWZvciggKytpdEN1cnJlbnQgOyBpdEN1cnJlbnQgIT0gZ2V0SGFzaFRhYmxlKCkuZW5kKCkgOyArK2l0Q3VycmVudCApCisJCQl7CisJCQkJaWYoIGdldENvbmZpZ3VyYXRpb25Db21wYXJhdG9yKCktPmVxdWFscygKKwkJCQkJCSgqIG1JbnRlcmVzdEVDKSwgKCogKCppdEN1cnJlbnQpKSkgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCAqaXRDdXJyZW50ICk7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiggTlVMTCApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgdm9pZCBoYXNoKGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkludGVyZXN0RUMpCisJeworCQlhcHBlbmRIYXNoKCAmIGFuSW50ZXJlc3RFQyApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUhhc2hUYWJsZQorCSAqLworCWlubGluZSB2b2lkIGFwcGVuZEhhc2goY29uc3QgRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpCisJeworCQltSGFzaFRhYmxlLmFwcGVuZCggYW5FQyApOworCX0KKworCWlubGluZSBMaXN0T2ZDb25zdEV4ZWN1dGlvbkNvbnRleHQgJiBnZXRIYXNoVGFibGUoKQorCXsKKwkJcmV0dXJuKCBtSGFzaFRhYmxlICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzSGFzaCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1IYXNoVGFibGUubm9uZW1wdHkoKSApOworCX0KKworCisJLyoqCisJICogSEFORExFUiBmb3IgRXZlbnQgTm90aWZpY2F0aW9uCisJICogRGVzdHJveSBFeGVjdXRpb24gQ29udGV4dAorCSAqLworCWlubGluZSB2aXJ0dWFsIHZvaWQgaGFuZGxlRXZlbnREZXN0cm95Q3R4KGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDKQorCXsKKwkJbUhhc2hUYWJsZS5yZW1vdmUoIGFuRUMgKTsKKwl9CisKK307CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDVVJSRU5UIFBBVEggU0NPUEUgSVRFUkFUT1IKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjbGFzcyBDdXJyZW50UGF0aFNjb3BlSXRlcmF0b3IgOiBwdWJsaWMgQmFzZVBhdGhTY29wZUl0ZXJhdG9yCit7CisKK3Byb3RlY3RlZDoKKwkvKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwljb25zdCBFeGVjdXRpb25Db250ZXh0ICogbUJlZ2luRUM7CisJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAqIG1DdXJyZW50RUM7CisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlDdXJyZW50UGF0aFNjb3BlSXRlcmF0b3IoQmFzZUNvbmZpZ3VyYXRpb25Db21wYXJhdG9yICogYUNvbmZpZ0NvbXBhcmF0b3IpCisJOiBCYXNlUGF0aFNjb3BlSXRlcmF0b3IoIGFDb25maWdDb21wYXJhdG9yICksCisJbUJlZ2luRUMoIE5VTEwgKSwKKwltQ3VycmVudEVDKCBOVUxMICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5DdXJyZW50UGF0aFNjb3BlSXRlcmF0b3IoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKiBJVEVSQVRPUgorCSAqIHRoZUJlZ2luIHRvIHRoZUVuZCB1c2luZyB0aGVDdXJyZW50CisJICogbmV4dAorCSAqLworCWlubGluZSB2aXJ0dWFsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgKiBiZWdpbigKKwkJCWNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgKiBhbkludGVyZXN0RUMpCisJeworCQltQ3VycmVudEVDID0gbUludGVyZXN0RUMgPSBhbkludGVyZXN0RUM7CisJCXJldHVybiggbUJlZ2luRUMgPSBuZXh0KCkgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICogYmVnaW4oKQorCXsKKwkJcmV0dXJuKCBtQmVnaW5FQyApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAqIGN1cnJlbnQoKQorCXsKKwkJcmV0dXJuKCBtQ3VycmVudEVDICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBib29sIGhhc05leHQoKQorCXsKKwkJcmV0dXJuKCBtQ3VycmVudEVDICE9IE5VTEwgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICogbmV4dCgpCisJeworCQlpZiggbUN1cnJlbnRFQyAhPSBOVUxMICkKKwkJeworCQkJbUN1cnJlbnRFQyA9IG1DdXJyZW50RUMtPmdldENvbnRhaW5lcigpOworCQkJZm9yKCA7IChtQ3VycmVudEVDICE9IE5VTEwpIDsKKwkJCQkJbUN1cnJlbnRFQyA9IG1DdXJyZW50RUMtPmdldENvbnRhaW5lcigpICkKKwkJCXsKKwkJCQlpZiggZ2V0Q29uZmlndXJhdGlvbkNvbXBhcmF0b3IoKQorCQkJCQkJLT5lcXVhbHMoKCogbUludGVyZXN0RUMpLCAoKiBtQ3VycmVudEVDKSkgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCBtQ3VycmVudEVDLT5pc25vdFJvb3QoKSA/CisJCQkJCQkJbUN1cnJlbnRFQyA6IChtQ3VycmVudEVDID0gTlVMTCkgKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4oIG1DdXJyZW50RUMgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIGhhc2goY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuSW50ZXJlc3RFQykKKwl7CisJCS8vISEgTk9USElORworCX0KKworfTsKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUEFSRU5UIFBBVEggU0NPUEUgSVRFUkFUT1IKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjbGFzcyBQYXJlbnRQYXRoU2NvcGVJdGVyYXRvciAgOiAgcHVibGljIEJhc2VQYXRoU2NvcGVJdGVyYXRvcgoreworCitwcm90ZWN0ZWQ6CisKKwkvKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwljb25zdCBFeGVjdXRpb25Db250ZXh0ICogbUN1cnJlbnRFQzsKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCVBhcmVudFBhdGhTY29wZUl0ZXJhdG9yKEJhc2VDb25maWd1cmF0aW9uQ29tcGFyYXRvciAqIGFDb25maWdDb21wYXJhdG9yKQorCTogQmFzZVBhdGhTY29wZUl0ZXJhdG9yKCBhQ29uZmlnQ29tcGFyYXRvciApLAorCW1DdXJyZW50RUMoIE5VTEwgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgflBhcmVudFBhdGhTY29wZUl0ZXJhdG9yKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyogSVRFUkFUT1IKKwkgKiB0aGVCZWdpbiB0byB0aGVFbmQgdXNpbmcgdGhlQ3VycmVudAorCSAqIG5leHQKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICogYmVnaW4oCisJCQljb25zdCBFeGVjdXRpb25Db250ZXh0ICogYW5JbnRlcmVzdEVDKQorCXsKKwkJbUludGVyZXN0RUMgPSBhbkludGVyZXN0RUM7CisKKwkJbUludGVyZXN0RUMgPSBtSW50ZXJlc3RFQy0+Z2V0Q29udGFpbmVyKCk7CisJCWlmKCAobUludGVyZXN0RUMgIT0gTlVMTCkKKwkJCSYmIG1JbnRlcmVzdEVDLT5pc25vdFJvb3QoKQorCQkJJiYgZ2V0Q29uZmlndXJhdGlvbkNvbXBhcmF0b3IoKS0+ZXF1YWxzKAorCQkJCQkoKiBtSW50ZXJlc3RFQyksICgqIG1JbnRlcmVzdEVDKSkgKQorCQl7CisJCQlyZXR1cm4oIG1JbnRlcmVzdEVDICk7CisJCX0KKworCQlyZXR1cm4oIG1JbnRlcmVzdEVDID0gTlVMTCApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgKiBiZWdpbigpCisJeworCQlyZXR1cm4oIG1JbnRlcmVzdEVDICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICogY3VycmVudCgpCisJeworCQlyZXR1cm4oIG1JbnRlcmVzdEVDICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBib29sIGhhc05leHQoKQorCXsKKwkJcmV0dXJuKCBtSW50ZXJlc3RFQyAhPSBOVUxMICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAqIG5leHQoKQorCXsKKwkJcmV0dXJuKCBtSW50ZXJlc3RFQyA9IE5VTEwgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIGhhc2goY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuSW50ZXJlc3RFQykKKwl7CisJCS8vISEgTk9USElORworCX0KKworfTsKKworCit9CisKKyNlbmRpZiAvKlBBVEhTQ09QRUlURVJBVE9SX0hfKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9yZWR1bmRhbmN5L1JlZHVuZGFuY3lGaWx0ZXIuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3JlZHVuZGFuY3kvUmVkdW5kYW5jeUZpbHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VjYjZkOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9yZWR1bmRhbmN5L1JlZHVuZGFuY3lGaWx0ZXIuY3BwCkBAIC0wLDAgKzEsNjA5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiUmVkdW5kYW5jeUZpbHRlci5oIgorCisjaW5jbHVkZSAiQ29uZmlndXJhdGlvbkNvbXBhcmF0b3IuaCIKKworI2luY2x1ZGUgIlBhdGhTY29wZUl0ZXJhdG9yLmgiCisKKyNpbmNsdWRlICJCYXNlRGF0YUNvbXBhcmF0b3IuaCIKKyNpbmNsdWRlICJEYXRhU29sdmVyQ29tcGFyYXRvci5oIgorI2luY2x1ZGUgIkRhdGFTeW50YXhpY0VxdWl2YWxlbmNlLmgiCisKKyNpbmNsdWRlIDxmYW0vYXBpL01haW5Qcm9jZXNzb3JVbml0Lmg+CisKKyNpbmNsdWRlIDxmYW0vcXVldWUvRXhlY3V0aW9uUXVldWUuaD4KKworI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9RdWVyeS5oPgorI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9XT2JqZWN0Lmg+CisKKyNpbmNsdWRlIDxzZXcvQ29uZmlndXJhdGlvbi5oPgorI2luY2x1ZGUgPHNldy9Xb3JrZmxvdy5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworLyoqCisgKiBERVNUUlVDVE9SCisgKi8KK1JlZHVuZGFuY3lGaWx0ZXI6On5SZWR1bmRhbmN5RmlsdGVyKCkKK3sKKwlpZiggbVJlZHVuZGFuY3lFbmFibGVkRmxhZyApCisJeworCQkvLyBVbnJlZ2lzdHJhdGlvbgorCQlnZXRTeW1iZXhFdmVudE1hbmFnZXIoKS51bnJlZ2lzdGVySGFuZGxlckV2ZW50RGVzdHJveUN0eCh0aGlzKTsKKwl9CisKKwlkZXN0cm95KCk7Cit9CisKKwordm9pZCBSZWR1bmRhbmN5RmlsdGVyOjpkZXN0cm95KCkKK3sKKwlpZiggbUNvbmZpZ3VyYXRpb25Db21wYXJhdG9yICE9IE5VTEwgKQorCXsKKwkJZGVsZXRlIG1Db25maWd1cmF0aW9uQ29tcGFyYXRvcjsKKwl9CisKKwlpZiggbVBhdGhTY29wZUl0ZXJhdG9yICE9IE5VTEwgKQorCXsKKwkJZGVsZXRlIG1QYXRoU2NvcGVJdGVyYXRvcjsKKwl9CisKKwlpZiggbUV4ZWN1dGlvbkRhdGFDb21wYXJhdG9yICE9IE5VTEwgKQorCXsKKwkJZGVsZXRlIG1FeGVjdXRpb25EYXRhQ29tcGFyYXRvcjsKKwl9Cit9CisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitwcm90b3R5cGUgZmlsdGVyOjpyZWR1bmRhbmN5IGFzIGF2bTo6Y29yZS5maWx0ZXIuUkVEVU5EQU5DWSBpcworc2VjdGlvbiBQUk9QRVJUWQorCUBwcmVkaWNhdGUgPSAnSU5DTFVTSU9OJzsgIC8vICggPD0gIHwgSU5DIHwgSU5DTFVTSU9OICkKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoID09ICB8IEVRICB8IEVRVUFMSVRZICkKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoID1hPSB8IEFFUSB8IEFMUEhBX0VRVUlWKQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggPXM9IHwgU0VRIHwgU1lOVEFYSUNfRVFVQUxJVFkpCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCA9dD0gfCBURVEgfCBUUklWSUFMTFlfRVFVQUxJVFkpCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9ORQorCisJQHNvbHZlciA9ICdPTUVHQSc7ICAgICAgICAgLy8gT01FR0EgfCBDVkM0CisKKwlAcGF0aF9zY29wZSA9ICdBTEwnOyAgICAgICAvLyBBTEwgZXhlY3V0aW9uIGdyYXBoIHBhdGgKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVJSRU5UIGV4ZWN1dGlvbiBncmFwaCBwYXRoCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSRU5UIGV4ZWN1dGlvbiBncmFwaCBub2RlCisKKwlAZGF0YV9zY29wZSA9ICdBTEwnOyAgICAgICAvLyBBTEwgZGF0YSA7IG9yIERFVEFJTFMgc2VjdGlvbgorCSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERFVEFJTFMgfCBERVRBSUxTPCBleGNsdWRlID4gc29tZSBkYXRhLAorZW5kc2VjdGlvbiBQUk9QRVJUWQorCitzZWN0aW9uIEhFVVJJU1RJQworCUBjb21tdW5pY2F0aW9uID0gZmFsc2U7CisKKwlAdmFyaWFibGUgPSB0cnVlOworCUBwYXRoX2NvbmRpdGlvbiA9IGZhbHNlOworZW5kc2VjdGlvbiBIRVVSSVNUSUMKKworc2VjdGlvbiBERVRBSUxTCisJQG1vZGVsID0gdWZpOworCisJQGluc3RhbmNlID0gdWZpOworCisJQHZhcmlhYmxlID0gdWZpOworZW5kc2VjdGlvbiBERVRBSUxTCitlbmRwcm90b3R5cGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworLyoKKyAqIE5FVyBDT05TSVNFIFNZTlRBWAorc3VwZXJ2aXNvciB7CisJbGltaXQgJ29mIGdyYXBoIGV4cGxvcmF0aW9uJyBbCisJCWV2YWwgPSAxMAorCQkuLi4KKwldCisJcXVldWUgJ2ZvciBncmFwaCBleHBsb3JhdGlvbicgWworCQlzdHJhdGVneSA9ICdCRlMnCisJCS4uLgorCV0KKwlyZWR1bmRhbmN5ICdkZXRlY3Rpb24gc3RyYXRlZ3knIFsKKwkJY29tcGFyZXIgPSAnSU5DTFVTSU9OJworCQlzb2x2ZXIgPSAnT01FR0EnCisJCXBhdGhfc2NvcGUgPSAnQ1VSUkVOVCcKKwkJZGF0YV9zY29wZSA9ICdBTEwnCisJXSAvLyBlbmQgcmVkdW5kYW5jeQorCisJY29uc29sZSBbCisJCWZvcm1hdCA9ICJcbnN0ZXA6JTElICwgY29udGV4dDolMiUgLCBoZWlnaHQ6JTMlICwgd2lkdGg6JTQlIgorCQkuLi4KKwldCit9CisqLworCisKK2Jvb2wgUmVkdW5kYW5jeUZpbHRlcjo6Y29uZmlndXJlSW1wbCgpCit7CisJQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKCBoYXNQYXJhbWV0ZXJXT2JqZWN0KCkgKQorCQkJPDwgIlVuZXhwZWN0ZWQgYSA8bnVsbD4gUmVkdW5kYW5jeUZpbHRlciBXT2JqZWN0ICEhISIKKwkJCTw8IFNFTkRfRVhJVDsKKworCW1Db25maWdGbGFnID0gdHJ1ZTsKKworCW1SZWR1bmRhbmN5Q29uZmlndXJhdGlvbkZsYWcgPSBmYWxzZTsKKworCWJvb2wgaXNub3REZWZpbmVkV1R5cGVkT2JqZWN0UGFyYW1ldGVycyA9IGZhbHNlOworCisJV09iamVjdCAqIHdmUmVkdW5kYW5jeSA9IG1QYXJhbWV0ZXJXT2JqZWN0OworCisJaWYoIE1haW5Qcm9jZXNzb3JVbml0OjpBVVRPX1JFR0lTVEVSX1RPT0wuaXNUeXBlSUQoICptUGFyYW1ldGVyV09iamVjdCApICkKKwl7CisJCXdmUmVkdW5kYW5jeSA9IFF1ZXJ5OjpnZXRSZWdleFdPYmplY3RCeU5hbWVJRChtUGFyYW1ldGVyV09iamVjdCwKKwkJCQlQUkVGSVhfV0lEKCJzeW1iZXgiLCBPUl9XSUQyKCJyZWR1bmRhbmN5IiwgIlJFRFVOREFOQ1kiKSksCisJCQkJV09iamVjdDo6X05VTExfKTsKKworCQlpZiggd2ZSZWR1bmRhbmN5ID09IFdPYmplY3Q6Ol9OVUxMXyApCisJCXsKKwkJCW1SZWR1bmRhbmN5RW5hYmxlZEZsYWcgPSBmYWxzZTsKKworCQkJLy8gVHJpdmlhbCBMb29wIERldGVjdGlvbiBFbmFibGluZworCQkJbVRyaXZpYWxMb29wRGV0ZWN0aW9uRmxhZyA9CisJCQkJCVF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eUJvb2xlYW4obVBhcmFtZXRlcldPYmplY3QsCisJCQkJCUNPTlNfV0lEMygibG9vcCIsICJkZXRlY3Rpb24iLCAidHJpdmlhbCIpLCB0cnVlKTsKKworCQkJcmV0dXJuKCBtQ29uZmlnRmxhZyA9IHRydWUgKTsKKwkJfQorCQllbHNlIGlmKCB3ZlJlZHVuZGFuY3ktPmlzV1R5cGVkT3JSZWZlcmVuY2UoKSApCisJCXsKKwkJCWlmKCB3ZlJlZHVuZGFuY3ktPmlzV1Byb3BlcnR5V1JlZmVyZW5jZSgpICkKKwkJCXsKKwkJCQl3ZlJlZHVuZGFuY3kgPSB3ZlJlZHVuZGFuY3ktPmdldFdSZWZlcmVuY2VWYWx1ZSgpOworCQkJfQorCisJCQlpZiggUmVkdW5kYW5jeUZpbHRlcjo6QVVUT19SRUdJU1RFUl9UT09MLmlzVHlwZUlEKCAqd2ZSZWR1bmRhbmN5ICkgKQorCQkJeworCQkJCW1QYXJhbWV0ZXJXT2JqZWN0ID0gd2ZSZWR1bmRhbmN5OworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUFWTV9PU19XQVJOIDw8ICJSZWR1bmRhbmN5RmlsdGVyOjpjb25maWd1cmU6PiAiCisJCQkJCQkiVW5leHBlY3RlZCB0aGUgV09iamVjdDwgIgorCQkJCQkJPDwgd2ZSZWR1bmRhbmN5LT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQkJCQk8PCAiID4gYXMgcmVkdW5kYW5jeSBwYXJhbWV0ZXJzIGRlZmluZWQgaW4gc3VwZXJ2aXNvciA8IgorCQkJCQkJPDwgbVBhcmFtZXRlcldPYmplY3QtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKwkJCQkJCTw8ICIgPiEgIiA8PCBzdGQ6OmVuZGw7CisKKwkJCQltUmVkdW5kYW5jeUVuYWJsZWRGbGFnID0gbUNvbmZpZ0ZsYWcgPSBmYWxzZTsKKworCQkJCXJldHVybiggbUNvbmZpZ0ZsYWcgKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmKCB3ZlJlZHVuZGFuY3ktPmlzV1NlcXVlbmNlKCkgKQorCQl7CisJCQlpc25vdERlZmluZWRXVHlwZWRPYmplY3RQYXJhbWV0ZXJzID0gdHJ1ZTsKKwkJfQorCQllbHNlIGlmKCBub3Qgd2ZSZWR1bmRhbmN5LT5pc1dTZXF1ZW5jZSgpICkKKwkJeworCQkJQVZNX09TX1dBUk4gPDwgIlJlZHVuZGFuY3lGaWx0ZXI6OmNvbmZpZ3VyZTo+ICIKKwkJCQkJIlVuZXhwZWN0ZWQgdGhlIFdPYmplY3Q8ICIgPDwgd2ZSZWR1bmRhbmN5LT5zdHJIZWFkZXIoKQorCQkJCQk8PCAiID4gYXMgcmVkdW5kYW5jeSBwYXJhbWV0ZXJzIGRlZmluZWQgaW4gc3VwZXJ2aXNvciA8IgorCQkJCQk8PCBtUGFyYW1ldGVyV09iamVjdC0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJCQk8PCAiID4hICIgPDwgc3RkOjplbmRsOworCisJCQltUmVkdW5kYW5jeUVuYWJsZWRGbGFnID0gbUNvbmZpZ0ZsYWcgPSBmYWxzZTsKKworCQkJcmV0dXJuKCBtQ29uZmlnRmxhZyApOworCQl9CisJfQorCisJV09iamVjdCAqIHRoZVBST1BFUlRZID0gKGlzbm90RGVmaW5lZFdUeXBlZE9iamVjdFBhcmFtZXRlcnMpID8gd2ZSZWR1bmRhbmN5CisJCQk6IFF1ZXJ5OjpnZXRSZWdleFdTZXF1ZW5jZSh3ZlJlZHVuZGFuY3ksIE9SX1dJRDQoInByb3BlcnR5IiwKKwkJCQkJIlBST1BFUlRZIiwgInJlZHVuZGFuY3kiLCAiUkVEVU5EQU5DWSIpLCB3ZlJlZHVuZGFuY3kpOworCisKKwkvLyBUcml2aWFsIExvb3AgRGV0ZWN0aW9uIEVuYWJsaW5nCisJbVRyaXZpYWxMb29wRGV0ZWN0aW9uRmxhZyA9CisJCQlRdWVyeTo6Z2V0UmVnZXhXUHJvcGVydHlCb29sZWFuKHRoZVBST1BFUlRZLAorCQkJCUNPTlNfV0lEMygibG9vcCIsICJkZXRlY3Rpb24iLCAidHJpdmlhbCIpLCB0cnVlKTsKKworCWlmKCAodGhlUFJPUEVSVFkgPT0gV09iamVjdDo6X05VTExfKQorCQl8fCAodGhlUFJPUEVSVFktPmlzV1R5cGVkT3JTZXF1ZW5jZSgpCisJCQkmJiB0aGVQUk9QRVJUWS0+aGFzbm9Pd25lZEVsZW1lbnQoKSkgKQorCXsKKwkJcmV0dXJuKCBtQ29uZmlnRmxhZyApOworCX0KKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBQUkVESUNBVEUgS0lORAorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwlzdGQ6OnN0cmluZyBzdHJQcmVkaWNhdGUgPSBRdWVyeTo6Z2V0UmVnZXhXUHJvcGVydHlTdHJpbmcoCisJCQl0aGVQUk9QRVJUWSwgT1JfV0lEMigiY29tcGFyZXIiLCAicHJlZGljYXRlIiksICIiKTsKKworCWlmKCBzdHJQcmVkaWNhdGUuZW1wdHkoKSApCisJeworCQlyZXR1cm4oIG1Db25maWdGbGFnICk7CisJfQorCisJZWxzZSBpZiggKHN0clByZWRpY2F0ZSA9PSAiPD0iKQorCQkJfHwgKHN0clByZWRpY2F0ZSA9PSAiSU5DIikKKwkJCXx8IChzdHJQcmVkaWNhdGUgPT0gIklOQ0xVU0lPTiIpICkKKwl7CisJCW1FeGVjdXRpb25EYXRhQ29tcGFyYXRvciA9CisJCQkJbmV3IERhdGFTb2x2ZXJJbmNsdXNpb24oIGdldENvbmZpZ3VyYXRpb24oKSApOworCX0KKwllbHNlIGlmKCAoc3RyUHJlZGljYXRlID09ICI9PSIpCisJCQl8fCAoc3RyUHJlZGljYXRlID09ICJFUSIpCisJCQl8fCAoc3RyUHJlZGljYXRlID09ICJFUVVBTElUWSIpICkKKwl7CisJCW1FeGVjdXRpb25EYXRhQ29tcGFyYXRvciA9CisJCQkJbmV3IERhdGFTb2x2ZXJFcXVhbGl0eSggZ2V0Q29uZmlndXJhdGlvbigpICk7CisJfQorCWVsc2UgaWYoIChzdHJQcmVkaWNhdGUgPT0gIj1hPSIpCisJCQl8fCAoc3RyUHJlZGljYXRlID09ICJBRVEiKQorCQkJfHwgKHN0clByZWRpY2F0ZSA9PSAiQUxQSEFfRVFVSVYiKSApCisJeworCQltRXhlY3V0aW9uRGF0YUNvbXBhcmF0b3IgPQorCQkJCW5ldyBEYXRhQWxwaGFFcXVpdmFsZW5jZSggZ2V0Q29uZmlndXJhdGlvbigpICk7CisJfQorCWVsc2UgaWYoIChzdHJQcmVkaWNhdGUgPT0gIj1zPSIpCisJCQl8fCAoc3RyUHJlZGljYXRlID09ICJTRVEiKQorCQkJfHwgKHN0clByZWRpY2F0ZSA9PSAiU1lOVEFYSUNfRVFVQUxJVFkiKSApCisJeworCQltRXhlY3V0aW9uRGF0YUNvbXBhcmF0b3IgPQorCQkJCW5ldyBEYXRhU3ludGF4aWNFcXVpdmFsZW5jZSggZ2V0Q29uZmlndXJhdGlvbigpICk7CisJfQorCWVsc2UgaWYoIChzdHJQcmVkaWNhdGUgPT0gIj0mPSIpCisJCQl8fCAoc3RyUHJlZGljYXRlID09ICI9dD0iKQorCQkJfHwgKHN0clByZWRpY2F0ZSA9PSAiVEVRIikKKwkJCXx8IChzdHJQcmVkaWNhdGUgPT0gIlRSSVZJQUxMWV9FUVVBTElUWSIpICkKKwl7CisJCW1FeGVjdXRpb25EYXRhQ29tcGFyYXRvciA9CisJCQkJbmV3IFRyaXZpYWxseURhdGFDb21wYXJpc29uKCBnZXRDb25maWd1cmF0aW9uKCkgKTsKKwkJc3RyUHJlZGljYXRlID0gIj10PSI7CisJfQorCWVsc2UgaWYoIHN0clByZWRpY2F0ZSA9PSAiTk9ORSIgKQorCXsKKwkJbUV4ZWN1dGlvbkRhdGFDb21wYXJhdG9yID0gbmV3IE5vbmVEYXRhQ29tcGFyaXNvbiggZ2V0Q29uZmlndXJhdGlvbigpICk7CisJfQorCWVsc2UKKwl7CisJCUFWTV9PU19FUlJPUl9BTEVSVCA8PCAiVW5leHBlY3RlZCBSRURVTkRBTkNZIGZpbHRlciA8PCBAcHJlZGljYXRlID0gIgorCQkJCTw8IHN0clByZWRpY2F0ZSA8PCAiOyA+PiAhISEiIDw8IHN0ZDo6ZW5kbAorCQkJCTw8ICJOQi4gPDwgQHByZWRpY2F0ZSA9IHsgJ0lOQ0xVU0lPTicgfCAnRVFVQUxJVFknIHwgIgorCQkJCSInQUxQSEFfRVFVSVYnIHwgJ1NZTlRBWElDX0VRVUFMSVRZJyB8ICdUUklWSUFMTFlfRVFVQUxJVFknIHwgIgorCQkJCSInTk9ORScgfTsgPj4gISEhIgorCQkJCTw8IFNFTkRfQUxFUlQ7CisKKwkJbUNvbmZpZ0ZsYWcgPSBmYWxzZTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBEQVRBIFNDT1BFCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCWlmKCBtRXhlY3V0aW9uRGF0YUNvbXBhcmF0b3IgIT0gTlVMTCApCisJeworCQlpZiggbUV4ZWN1dGlvbkRhdGFDb21wYXJhdG9yLT5jb25maWd1cmUoIG1QYXJhbWV0ZXJXT2JqZWN0ICkgKQorCQl7CisJCQlpZiggKG5vdCBtRXhlY3V0aW9uRGF0YUNvbXBhcmF0b3ItPmhhc1ZhcmlhYmxlQ29tcGFyaXNvbigpKQorCQkJCSYmIChzdHJQcmVkaWNhdGUgIT0gIj10PSIpCisJCQkJJiYgKHN0clByZWRpY2F0ZSAhPSAiTk9ORSIpICkKKwkJCXsKKwkJCQlkZWxldGUgbUV4ZWN1dGlvbkRhdGFDb21wYXJhdG9yOworCisJCQkJbUV4ZWN1dGlvbkRhdGFDb21wYXJhdG9yID0KKwkJCQkJCW5ldyBOb25lRGF0YUNvbXBhcmlzb24oIGdldENvbmZpZ3VyYXRpb24oKSApOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJZGVzdHJveSgpOworCisJCQltQ29uZmlnRmxhZyA9IGZhbHNlOworCQl9CisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gU1RBVEUgU0NPUEUKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJc3RkOjpzdHJpbmcgY29udHJvbF9zY29wZSA9IFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eVN0cmluZygKKwkJCXRoZVBST1BFUlRZLCBDT05TX1dJRDIoImNvbnRyb2wiLCAic2NvcGUiKSwgIkFMTCIpOworCWlmKCBjb250cm9sX3Njb3BlID09ICJBTEwiICkKKwl7CisJCW1Db25maWd1cmF0aW9uQ29tcGFyYXRvciA9CisJCQkJbmV3IEJhc2VDb25maWd1cmF0aW9uQ29tcGFyYXRvciggZ2V0Q29uZmlndXJhdGlvbigpICk7CisJfQorCWVsc2UgaWYoIGNvbnRyb2xfc2NvcGUgPT0gIkRFVEFJTFMiICkKKwl7CisJCW1Db25maWd1cmF0aW9uQ29tcGFyYXRvciA9CisJCQkJbmV3IERldGFpbENvbmZpZ3VyYXRpb25Db21wYXJhdG9yKCBnZXRDb25maWd1cmF0aW9uKCkgKTsKKwl9CisJZWxzZQorCXsKKwkJQVZNX09TX0VSUk9SX0FMRVJUCisJCQkJPDwgIlVuZXhwZWN0ZWQgUkVEVU5EQU5DWSBmaWx0ZXIgPDwgQGNvbnRyb2xfc2NvcGUgPSAiCisJCQkJPDwgY29udHJvbF9zY29wZSA8PCAiOyA+PiAhISEiIDw8IHN0ZDo6ZW5kbAorCQkJCTw8ICJOQi4gPDwgQGNvbnRyb2xfc2NvcGUgPSB7ICdBTEwnIHwgJ0RFVEFJTFMnIH07ID4+ICEhISIKKwkJCQk8PCBTRU5EX0FMRVJUOworCisJCW1Db25maWdGbGFnID0gZmFsc2U7CisJfQorCisJbUNvbmZpZ0ZsYWcgPSBtQ29uZmlndXJhdGlvbkNvbXBhcmF0b3ItPmNvbmZpZ3VyZSggbVBhcmFtZXRlcldPYmplY3QgKQorCQkJCSYmIG1Db25maWdGbGFnOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gUEFUSCBTQ09QRQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwlzdGQ6OnN0cmluZyBwYXRoX3Njb3BlID0gUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5U3RyaW5nKAorCQkJdGhlUFJPUEVSVFksIENPTlNfV0lEMigicGF0aCIsICJzY29wZSIpLCAiQUxMIik7CisJaWYoIHBhdGhfc2NvcGUgPT0gIkFMTCIgKQorCXsKKwkJbVBhdGhTY29wZUl0ZXJhdG9yID0KKwkJCQluZXcgQWxsUGF0aFNjb3BlSXRlcmF0b3IobUNvbmZpZ3VyYXRpb25Db21wYXJhdG9yKTsKKwl9CisJZWxzZSBpZiggcGF0aF9zY29wZSA9PSAiQ1VSUkVOVCIgKQorCXsKKwkJbVBhdGhTY29wZUl0ZXJhdG9yID0KKwkJCQluZXcgQ3VycmVudFBhdGhTY29wZUl0ZXJhdG9yKG1Db25maWd1cmF0aW9uQ29tcGFyYXRvcik7CisJfQorCWVsc2UgaWYoIHBhdGhfc2NvcGUgPT0gIlBBUkVOVCIgKQorCXsKKwkJbVBhdGhTY29wZUl0ZXJhdG9yID0KKwkJCQluZXcgUGFyZW50UGF0aFNjb3BlSXRlcmF0b3IobUNvbmZpZ3VyYXRpb25Db21wYXJhdG9yKTsKKwl9CisJZWxzZQorCXsKKwkJQVZNX09TX0VSUk9SX0FMRVJUIDw8ICJVbmV4cGVjdGVkIFJFRFVOREFOQ1kgZmlsdGVyIDw8IEBwYXRoX3Njb3BlID0gIgorCQkJCTw8IHBhdGhfc2NvcGUgPDwgIjsgPj4gISEhIiA8PCBzdGQ6OmVuZGwKKwkJCQk8PCAiTkIuIDw8IEBwYXRoX3Njb3BlID0geyAnQUxMJyB8ICdDVVJSRU5UJyB8IFBBUkVOVCB9OyA+PiAhISEiCisJCQkJPDwgU0VORF9BTEVSVDsKKworCQltQ29uZmlnRmxhZyA9IGZhbHNlOworCX0KKworCWlmKCBtQ29uZmlnRmxhZyApCisJeworCQltQ29uZmlnRmxhZyA9IG1QYXRoU2NvcGVJdGVyYXRvci0+Y29uZmlndXJlKCBtUGFyYW1ldGVyV09iamVjdCApOworCisJCWlmKCBtQ29uZmlnRmxhZyApCisJCXsKKwkJCS8vIFJlZ2lzdHJhdGlvbiB0byBoYW5kbGVyIERlc3Ryb3lDdHggZXZlbnQKKwkJCWdldFN5bWJleEV2ZW50TWFuYWdlcigpLnJlZ2lzdGVySGFuZGxlckV2ZW50RGVzdHJveUN0eCh0aGlzKTsKKwkJfQorCX0KKworCW1SZWR1bmRhbmN5Q29uZmlndXJhdGlvbkZsYWcgPSBtUmVkdW5kYW5jeUVuYWJsZWRGbGFnID0gbUNvbmZpZ0ZsYWc7CisKKwlyZXR1cm4oIG1Db25maWdGbGFnICk7Cit9CisKKworLyoqCisgKiBwcmVGaWx0ZXIKKyAqIEV2ZXJ5IHByZSBmaWx0ZXIgaGFzIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZAorICovCitib29sIFJlZHVuZGFuY3lGaWx0ZXI6OnByZWZpbHRlcigpCit7CisJZWNRdWV1ZSA9ICYoIGdldEV4ZWN1dGlvblF1ZXVlKCkuZ2V0UmVhZHlRdWV1ZSgpICk7CisJZWNRdWV1ZUl0RW5kID0gZWNRdWV1ZS0+ZW5kKCk7CisJZm9yKCBlY1F1ZXVlSXQgPSBlY1F1ZXVlLT5iZWdpbigpIDsgZWNRdWV1ZUl0ICE9IGVjUXVldWVJdEVuZCA7ICkKKwl7CisJCWlmKCBub3QgcHJlZmlsdGVyKCAqICgqZWNRdWV1ZUl0KSkgKQorCQl7CisJCQlnZXRFeGVjdXRpb25RdWV1ZSgpLmFwcGVuZEZhaWxlZCggKmVjUXVldWVJdCApOworCisJCQllY1F1ZXVlSXQgPSBlY1F1ZXVlLT5lcmFzZShlY1F1ZXVlSXQpOworCQl9CisJCWVsc2UKKwkJeworCQkJKytlY1F1ZXVlSXQ7CisJCX0KKwl9CisKKwlyZXR1cm4oIGdldEV4ZWN1dGlvblF1ZXVlKCkuaGFzUmVhZHkoKSApOworfQorCisKK2Jvb2wgUmVkdW5kYW5jeUZpbHRlcjo6cHJlZmlsdGVyKEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKQoreworCWlmKCB0cml2aWFsTG9vcERldGVjdGlvbihhbkVDKSApCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJZWxzZSBpZiggbVJlZHVuZGFuY3lFbmFibGVkRmxhZyApCisJeworCQltUGF0aFNjb3BlSXRlcmF0b3ItPmJlZ2luKCYgYW5FQyk7CisJCWZvciggOyBtUGF0aFNjb3BlSXRlcmF0b3ItPmhhc05leHQoKSA7IG1QYXRoU2NvcGVJdGVyYXRvci0+bmV4dCgpICkKKwkJeworCQkJKyttUmVkdW5kYW5jeVRlc3Q7CisKKwkJCW1DYW5kaWRhdGVFQyA9IG1QYXRoU2NvcGVJdGVyYXRvci0+Y3VycmVudCgpOworCisJCQlpZiggZ2V0RXhlY3V0aW9uRGF0YUNvbXBhcmF0b3IoKS0+Y29tcGFyZSgKKwkJCQkJYW5FQywgKCogbUNhbmRpZGF0ZUVDKSkgKQorCQkJeworCQkJCSsrbVJlZHVuZGFuY3lDb3VudDsKKworCQkJCWFuRUMuZ2V0d0ZsYWdzKCkuc2V0RXhlY3V0aW9uUmVkdW5kYW5jeVRyYWNlKCk7CisKKwkJCQlhbkVDLmFkZEluZm8oKnRoaXMsIG1DYW5kaWRhdGVFQy0+Z2V0SGVhZGVyKCkpOworCisJCQkJY29uc3RfY2FzdDwgRXhlY3V0aW9uQ29udGV4dCAqID4oIG1DYW5kaWRhdGVFQyApLT4KKwkJCQkJCWdldHdGbGFncygpLnNldEV4ZWN1dGlvblJlZHVuZGFuY3lUYXJnZXRUcmFjZSgpOworCisJCQkJLy8gRE8gRElBR05PU1RJUQorQVZNX0lGX0RFQlVHX0xFVkVMX09SX0ZMQUcoIE1FRElVTSAsIFJFRFVOREFOQ0UgKQorCUFWTV9PU19UUkFDRSA8PCBzdGQ6OmVuZGwgPDwgREVGQVVMVF9XUkFQX0RBVEEgPDwgIlJFRFVOREFOVCBFQyA6PiAiOworCWFuRUMudHJhY2VEZWZhdWx0KEFWTV9PU19UUkFDRSk7CisKKwlBVk1fT1NfVFJBQ0UgPDwgIkZPVU5EWyIgPDwgc3RkOjpzZXR3KDUpCisJCQk8PCBtUmVkdW5kYW5jeUNvdW50IDw8ICJdIDo+ICI7CisJbUNhbmRpZGF0ZUVDLT50cmFjZURlZmF1bHQoQVZNX09TX1RSQUNFKTsKKwlBVk1fT1NfVFJBQ0UgPDwgRU5EX1dSQVBfRU9MOworCisKKwlBVk1fT1NfQ09VVCA8PCBzdGQ6OmVuZGwgPDwgREVGQVVMVF9XUkFQX0RBVEEgPDwgIlJFRFVOREFOVCBFQyA6PiAiOworCWFuRUMudHJhY2VEZWZhdWx0KEFWTV9PU19DT1VUKTsKKworCUFWTV9PU19DT1VUIDw8ICJGT1VORFsiIDw8IHN0ZDo6c2V0dyg1KQorCQkJPDwgbVJlZHVuZGFuY3lDb3VudCA8PCAiXSA6PiAiOworCW1DYW5kaWRhdGVFQy0+dHJhY2VEZWZhdWx0KEFWTV9PU19DT1VUKTsKKwlBVk1fT1NfQ09VVCA8PCBFTkRfV1JBUF9FT0w7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfT1JfRkxBRyggTUVESVVNICwgUkVEVU5EQU5DRSApCisKKwkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkvLyBETyBESUFHTk9TVElRCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUkVEVU5EQU5DRSApCisJQVZNX09TX1RSQUNFIDw8IERFRkFVTFRfV1JBUF9EQVRBIDw8ICJORVcgRUMgOj4gIjsKKwlhbkVDLnRyYWNlRGVmYXVsdChBVk1fT1NfVFJBQ0UpOworCisJQVZNX09TX1RSQUNFIDw8ICJPTEQgRUMgOj4gIjsKKwltQ2FuZGlkYXRlRUMtPnRyYWNlRGVmYXVsdChBVk1fT1NfVFJBQ0UpOworCUFWTV9PU19UUkFDRSA8PCBFTkRfV1JBUF9FT0w7CisKKworCUFWTV9PU19DT1VUIDw8IERFRkFVTFRfV1JBUF9EQVRBIDw8ICJORVcgRUMgOj4gIjsKKwlhbkVDLnRyYWNlRGVmYXVsdChBVk1fT1NfQ09VVCk7CisKKwlBVk1fT1NfQ09VVCA8PCAiT0xEIEVDIDo+ICI7CisJbUNhbmRpZGF0ZUVDLT50cmFjZURlZmF1bHQoQVZNX09TX0NPVVQpOworCUFWTV9PU19DT1VUIDw8IEVORF9XUkFQX0VPTDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBSRURVTkRBTkNFICkKKwkJCX0KKwkJfQorCisJCW1QYXRoU2NvcGVJdGVyYXRvci0+aGFzaCggYW5FQyApOworCitBVk1fSUZfREVCVUdfRU5BQkxFRAorCUFWTV9PU19UUkFDRSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRU5BQkxFRAorCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKK2Jvb2wgUmVkdW5kYW5jeUZpbHRlcjo6dHJpdmlhbExvb3BEZXRlY3Rpb24oRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpCit7CisJRXhlY3V0aW9uQ29udGV4dCAqIHByZXZFQyA9IGFuRUMuZ2V0UHJldmlvdXMoKTsKKwlib29sIGZvb25kTG9vcCA9IGZhbHNlOworCisJaWYoIG1Ucml2aWFsTG9vcERldGVjdGlvbkZsYWcgKQorCXsKKwkJZm9yKCA7IChwcmV2RUMgIT0gTlVMTCkgJiYgcHJldkVDLT5pc25vdFJvb3QoKSA7CisJCQkJcHJldkVDID0gcHJldkVDLT5nZXRQcmV2aW91cygpICApCisJCXsKKwkJCWlmKCBhbkVDLnJlZkV4ZWN1dGlvbkRhdGEoKS5pc1RFUSggcHJldkVDLT5nZXRFeGVjdXRpb25EYXRhKCkgKSApCisJCQl7CisJCQkJKyttVHJpdmlhbExvb3BDb3VudDsKKworCQkJCWZvb25kTG9vcCA9IHRydWU7CisKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwllbHNlIGlmKCAocHJldkVDICE9IE5VTEwpICYmIHByZXZFQy0+aXNub3RSb290KCkKKwkJCSYmIGFuRUMucmVmRXhlY3V0aW9uRGF0YSgpLmlzVEVRKCBwcmV2RUMtPmdldEV4ZWN1dGlvbkRhdGEoKSApICkKKwl7CisJCSsrbVRyaXZpYWxMb29wQ291bnQ7CisKKwkJZm9vbmRMb29wID0gdHJ1ZTsKKwl9CisKKwlpZiggZm9vbmRMb29wICkKKwl7CisJCWFuRUMuZ2V0d0ZsYWdzKCkuc2V0RXhlY3V0aW9uVHJpdmlhbExvb3BUcmFjZSgpOworCisJCS8vIERPIERJQUdOT1NUSVEKK0FWTV9JRl9ERUJVR19MRVZFTF9PUl9GTEFHKCBNRURJVU0gLCBSRURVTkRBTkNFICkKKwlBVk1fT1NfVFJBQ0UgPDwgc3RkOjplbmRsIDw8ICJUUklWSUFMIExPT1AgREVURUNUSU9OIDo+ICI7CisJYW5FQy50cmFjZURlZmF1bHQoQVZNX09TX1RSQUNFKTsKKworCUFWTV9PU19UUkFDRSA8PCAiRk9VTkRbIiA8PCBzdGQ6OnNldHcoNSkKKwkJCTw8IG1Ucml2aWFsTG9vcENvdW50IDw8ICJdIDo+ICI7CisJcHJldkVDLT50cmFjZURlZmF1bHQoQVZNX09TX1RSQUNFKTsKKwlBVk1fT1NfVFJBQ0UgPDwgc3RkOjplbmRsOworCisKKwlBVk1fT1NfQ09VVCA8PCBzdGQ6OmVuZGwgPDwgIlRSSVZJQUwgTE9PUCA6PiAiOworCWFuRUMudHJhY2VEZWZhdWx0KEFWTV9PU19DT1VUKTsKKworCUFWTV9PU19DT1VUIDw8ICJDT1VOVFsiIDw8IHN0ZDo6c2V0dyg1KQorCQkJPDwgbVRyaXZpYWxMb29wQ291bnQgPDwgIl0gOj4gIjsKKwlwcmV2RUMtPnRyYWNlRGVmYXVsdChBVk1fT1NfQ09VVCk7CisJQVZNX09TX0NPVVQgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX09SX0ZMQUcoIE1FRElVTSAsIFJFRFVOREFOQ0UgKQorCisJCXJldHVybiggdHJ1ZSApOworCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKworCisvKioKKyAqIElIYW5kbGVyRXZlbnREZXN0cm95Q3R4IEFQSQorICogRGVzdHJveSBFeGVjdXRpb24gQ29udGV4dAorICovCit2b2lkIFJlZHVuZGFuY3lGaWx0ZXI6OmhhbmRsZUV2ZW50RGVzdHJveUN0eChFeGVjdXRpb25Db250ZXh0ICogYW5FQykKK3sKKwltUGF0aFNjb3BlSXRlcmF0b3ItPmhhbmRsZUV2ZW50RGVzdHJveUN0eChhbkVDKTsKK30KKworLyoqCisgKiBSRVBPUlQgVFJBQ0UKKyAqLwordm9pZCBSZWR1bmRhbmN5RmlsdGVyOjpyZXBvcnREZWZhdWx0KE91dFN0cmVhbSAmIG9zKSBjb25zdAoreworCWlmKCAobVJlZHVuZGFuY3lUZXN0ID4gMCkgfHwgKG1Ucml2aWFsTG9vcFRlc3QgPiAwKSApCisJeworCQlyZXBvcnRIZWFkZXIob3MsICJSRURVTkRBTkNZIik7CisKKwkJaWYoIG1SZWR1bmRhbmN5RW5hYmxlZEZsYWcgJiYgKG1SZWR1bmRhbmN5VGVzdCA+IDApICkKKwkJeworCQkJb3MgPDwgVEFCMiA8PCAiQ29tcGFyZXIgcHJlZGljYXRlOiAiCisJCQkJCTw8IG1FeGVjdXRpb25EYXRhQ29tcGFyYXRvci0+c3RyQ29tcGFyZXIoKSA8PCBFT0wKKwkJCQkJPDwgVEFCMiA8PCAiVGhlIHJlZHVuZGFuY3kgY291bnQ6ICIgPDwgbVJlZHVuZGFuY3lDb3VudAorCQkJCQk8PCAiIGZvciAiIDw8IG1SZWR1bmRhbmN5VGVzdCA8PCAiIHRlc3RzICEiIDw8IEVPTF9GTFVTSDsKKwkJfQorCisJCWlmKCBtVHJpdmlhbExvb3BEZXRlY3Rpb25GbGFnICYmIChtVHJpdmlhbExvb3BUZXN0ID4gMCkgKQorCQl7CisJCQlvcyA8PCBUQUIyIDw8ICJUaGUgdHJpdmlhbCBsb29wIGNvdW50OiAiIDw8IG1Ucml2aWFsTG9vcENvdW50CisJCQkJCTw8ICIgZm9yICIgPDwgbVRyaXZpYWxMb29wVGVzdCA8PCAiIHRlc3RzICEiIDw8IEVPTF9GTFVTSDsKKwkJfQorCX0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIE5PTi1SRUdSRVNTSU9OIFRFU1QgQVBJCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIFJlZHVuZGFuY3lGaWx0ZXI6OnRkZFJlZ3Jlc3Npb25SZXBvcnRJbXBsKE91dFN0cmVhbSAmIG9zKQoreworCW9zIDw8IFRBQiA8PCAiUkVEVU5EQU5DWSAtIHBvc2l0aXZlIGRldGVjdGlvbiBjb3VudCA6ICIKKwkJCTw8IG1SZWR1bmRhbmN5Q291bnQKKwkJCTw8ICIgZm9yICIgPDwgbVJlZHVuZGFuY3lUZXN0IDw8ICIgdGVzdHMiIDw8IEVPTF9GTFVTSDsKK30KKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vcmVkdW5kYW5jeS9SZWR1bmRhbmN5RmlsdGVyLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vcmVkdW5kYW5jeS9SZWR1bmRhbmN5RmlsdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTczNDkzMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9yZWR1bmRhbmN5L1JlZHVuZGFuY3lGaWx0ZXIuaApAQCAtMCwwICsxLDIzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBSRURVTkRBTkNZRklMVEVSX0hfCisjZGVmaW5lIFJFRFVOREFOQ1lGSUxURVJfSF8KKworI2luY2x1ZGUgPGZhbS9hcGkvQWJzdHJhY3RQcm9jZXNzb3JVbml0Lmg+CisjaW5jbHVkZSA8c2V3L1N5bWJleEV2ZW50TWFuYWdlci5oPgorCisjaW5jbHVkZSA8Y29tbW9uL0JGLmg+CisKKyNpbmNsdWRlIDxmbWwvYnVpbHRpbi9JZGVudGlmaWVyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBCYXNlQ29uZmlndXJhdGlvbkNvbXBhcmF0b3I7CitjbGFzcyBCYXNlRGF0YUNvbXBhcmF0b3I7CitjbGFzcyBCYXNlUGF0aFNjb3BlSXRlcmF0b3I7CisKK2NsYXNzIFN5bWJleENvbnRyb2xsZXJVbml0TWFuYWdlcjsKKworCitjbGFzcyBSZWR1bmRhbmN5RmlsdGVyIDoKKwkJcHVibGljIEF1dG9SZWdpc3RlcmVkUHJvY2Vzc29yVW5pdDwgUmVkdW5kYW5jeUZpbHRlciA+LAorCQlwdWJsaWMgSUhhbmRsZXJFdmVudERlc3Ryb3lDdHgKK3sKKworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBSZWR1bmRhbmN5RmlsdGVyICkKKworCisJLyoqCisJICogUFJPQ0VTU09SIEZBQ1RPUlkKKwkgKiBmb3IgYXV0b21hdGljIHJlZ2lzdHJhdGlvbiBpbiB0aGUgcHJvY2Vzc29yIHJlcG9zaXRvcnkKKwkgKiB0aGUgWyBbIEZVTExZIF0gUVVBTElGSUVEIF0gTkFNRSBJRAorCSAqLworCUFWTV9JTkpFQ1RfQVVUT19SRUdJU1RFUl9RVUFMSUZJRURfSURfS0VZXzMoCisJCQkic3ltYmV4LnJlZHVuZGFuY3kiLAorCQkJImF2bTo6cHJvY2Vzc29yLlJFRFVOREFOQ1kiLAorCQkJImF2bTo6Y29yZS5maWx0ZXIuUkVEVU5EQU5DWSIpCisJLy8gZW5kIHJlZ2lzdHJhdGlvbgorCisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBBVFRSSUJVVEVTCisJICovCisJYm9vbCBtVHJpdmlhbExvb3BEZXRlY3Rpb25GbGFnOworCisKKwlib29sIG1SZWR1bmRhbmN5Q29uZmlndXJhdGlvbkZsYWc7CisJYm9vbCBtUmVkdW5kYW5jeUVuYWJsZWRGbGFnOworCisJQmFzZUNvbmZpZ3VyYXRpb25Db21wYXJhdG9yICogbUNvbmZpZ3VyYXRpb25Db21wYXJhdG9yOworCisJQmFzZVBhdGhTY29wZUl0ZXJhdG9yICAgICAgICogbVBhdGhTY29wZUl0ZXJhdG9yOworCisJQmFzZURhdGFDb21wYXJhdG9yICAgICAgICAgICogbUV4ZWN1dGlvbkRhdGFDb21wYXJhdG9yOworCisJYXZtX3NpemVfdCBtVHJpdmlhbExvb3BUZXN0OworCWF2bV9zaXplX3QgbVRyaXZpYWxMb29wQ291bnQ7CisKKwlhdm1fc2l6ZV90IG1SZWR1bmRhbmN5VGVzdDsKKwlhdm1fc2l6ZV90IG1SZWR1bmRhbmN5Q291bnQ7CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQ29tcHV0aW5nIFZhcmlhYmxlCisJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAqIG1DYW5kaWRhdGVFQzsKKworCitwdWJsaWM6CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqLworCVJlZHVuZGFuY3lGaWx0ZXIoU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyICYgYUNvbnRyb2xsZXJVbml0TWFuYWdlciwKKwkJCVdPYmplY3QgKiB3ZlBhcmFtZXRlck9iamVjdCA9IE5VTEwpCisJOiBSZWdpc3RlcmVkUHJvY2Vzc29yVW5pdChhQ29udHJvbGxlclVuaXRNYW5hZ2VyLCB3ZlBhcmFtZXRlck9iamVjdCwKKwkJCUFWTV9QUkVfRklMVEVSSU5HX1NUQUdFLCBQUkVDRURFTkNFX09GX1JFRFVOREFOQ1kpLAorCW1Ucml2aWFsTG9vcERldGVjdGlvbkZsYWcoIGZhbHNlICksCisJbVJlZHVuZGFuY3lDb25maWd1cmF0aW9uRmxhZyggZmFsc2UgKSwKKwltUmVkdW5kYW5jeUVuYWJsZWRGbGFnKCBmYWxzZSApLAorCisJbUNvbmZpZ3VyYXRpb25Db21wYXJhdG9yKCBOVUxMICksCisJbVBhdGhTY29wZUl0ZXJhdG9yKCBOVUxMICksCisJbUV4ZWN1dGlvbkRhdGFDb21wYXJhdG9yKCBOVUxMICksCisKKwltVHJpdmlhbExvb3BUZXN0KCAwICksCisJbVRyaXZpYWxMb29wQ291bnQoIDAgKSwKKworCW1SZWR1bmRhbmN5VGVzdCggMCApLAorCW1SZWR1bmRhbmN5Q291bnQoIDAgKSwKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBDb21wdXRpbmcgVmFyaWFibGUKKwltQ2FuZGlkYXRlRUMoIE5VTEwgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgflJlZHVuZGFuY3lGaWx0ZXIoKTsKKworCXZvaWQgZGVzdHJveSgpOworCisJLyoqCisJICogbVJlZHVuZGFuY3lFbmFibGVkRmxhZworCSAqIG1Ucml2aWFsTG9vcERldGVjdGlvbkZsYWcKKwkgKi8KKwlpbmxpbmUgdm9pZCBzZXRFbmFibGVkUmVkdW5kYW5jeURldGVjdGlvbihib29sIGJFbmFibGVkID0gdHJ1ZSApCisJeworCQkvLyBFbmFibGluZyBvbmx5IGlmIGl0IHdhcyBjb25maWd1cmVkLAorCQkvLyBpLmUuIG1SZWR1bmRhbmN5Q29uZmlndXJhdGlvbkZsYWcgaXMgdHJ1ZSAhCisJCW1SZWR1bmRhbmN5RW5hYmxlZEZsYWcgPSAoYkVuYWJsZWQgJiYgbVJlZHVuZGFuY3lDb25maWd1cmF0aW9uRmxhZyk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0RW5hYmxlZFRyaXZpYWxMb29wRGV0ZWN0aW9uKGJvb2wgYkVuYWJsZWQgPSB0cnVlICkKKwl7CisJCW1Ucml2aWFsTG9vcERldGVjdGlvbkZsYWcgPSBiRW5hYmxlZDsKKwl9CisKKworCS8qKgorCSAqIENPTkZJR1VSRQorCSAqLworCWJvb2wgY29uZmlndXJlSW1wbCgpOworCisKKwkvKioKKwkgKiBSRVBPUlQgVFJBQ0UKKwkgKi8KKwl2aXJ0dWFsIHZvaWQgcmVwb3J0RGVmYXVsdChPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBOT04tUkVHUkVTU0lPTiBURVNUIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXZpcnR1YWwgdm9pZCB0ZGRSZWdyZXNzaW9uUmVwb3J0SW1wbChPdXRTdHJlYW0gJiBvcyk7CisKKwkvKioKKwkgKiBwcmVGaWx0ZXIKKwkgKiBFdmVyeSBwcmUgZmlsdGVyIGhhcyB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QKKwkgKi8KKwl2aXJ0dWFsIGJvb2wgcHJlZmlsdGVyKCk7CisKKwl2aXJ0dWFsIGJvb2wgcHJlZmlsdGVyKEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKTsKKworCWJvb2wgdHJpdmlhbExvb3BEZXRlY3Rpb24oRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpOworCisKKwkvKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtQ29uZmlndXJhdGlvbkNvbXBhcmF0b3IKKwkgKi8KKwlpbmxpbmUgQmFzZUNvbmZpZ3VyYXRpb25Db21wYXJhdG9yICogZ2V0Q29uZmlndXJhdGlvbkNvbXBhcmF0b3IoKQorCXsKKwkJcmV0dXJuKCBtQ29uZmlndXJhdGlvbkNvbXBhcmF0b3IgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNDb25maWd1cmF0aW9uQ29tcGFyYXRvcigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Db25maWd1cmF0aW9uQ29tcGFyYXRvciAhPSBOVUxMICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0Q29uZmlndXJhdGlvbkNvbXBhcmF0b3IoCisJCQlCYXNlQ29uZmlndXJhdGlvbkNvbXBhcmF0b3IgKiBhQ29uZmlndXJhdGlvbkNvbXBhcmF0b3IpCisJeworCQltQ29uZmlndXJhdGlvbkNvbXBhcmF0b3IgPSBhQ29uZmlndXJhdGlvbkNvbXBhcmF0b3I7CisJfQorCisKKwkvKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtUGF0aFNjb3BlSXRlcmF0b3IKKwkgKi8KKwlpbmxpbmUgQmFzZVBhdGhTY29wZUl0ZXJhdG9yICogZ2V0UGF0aFNjb3BlSXRlcmF0b3IoKQorCXsKKwkJcmV0dXJuKCBtUGF0aFNjb3BlSXRlcmF0b3IgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNQYXRoU2NvcGVJdGVyYXRvcigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1QYXRoU2NvcGVJdGVyYXRvciAhPSBOVUxMICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0UGF0aFNjb3BlSXRlcmF0b3IoQmFzZVBhdGhTY29wZUl0ZXJhdG9yICogYVBhdGhTY29wZUl0ZXJhdG9yKQorCXsKKwkJbVBhdGhTY29wZUl0ZXJhdG9yID0gYVBhdGhTY29wZUl0ZXJhdG9yOworCX0KKworCisJLyogR0VUVEVSIC0gU0VUVEVSCisJICogbUV4ZWN1dGlvbkRhdGFDb21wYXJhdG9yCisJICovCisJaW5saW5lIEJhc2VEYXRhQ29tcGFyYXRvciAqIGdldEV4ZWN1dGlvbkRhdGFDb21wYXJhdG9yKCkKKwl7CisJCXJldHVybiggbUV4ZWN1dGlvbkRhdGFDb21wYXJhdG9yICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzRXhlY3V0aW9uRGF0YUNvbXBhcmF0b3IoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRXhlY3V0aW9uRGF0YUNvbXBhcmF0b3IgIT0gTlVMTCApOworCX0KKworCWlubGluZSB2b2lkIHNldEV4ZWN1dGlvbkRhdGFDb21wYXJhdG9yKAorCQkJQmFzZURhdGFDb21wYXJhdG9yICogYW5FeGVjdXRpb25EYXRhQ29tcGFyYXRvcikKKwl7CisJCW1FeGVjdXRpb25EYXRhQ29tcGFyYXRvciA9IGFuRXhlY3V0aW9uRGF0YUNvbXBhcmF0b3I7CisJfQorCisKKwkvKioKKwkgKiBJSGFuZGxlckV2ZW50RGVzdHJveUN0eCBBUEkKKwkgKiBEZXN0cm95IEV4ZWN1dGlvbiBDb250ZXh0CisJICovCisJdmlydHVhbCB2b2lkIGhhbmRsZUV2ZW50RGVzdHJveUN0eChFeGVjdXRpb25Db250ZXh0ICogYW5FQyk7CisKK307CisKKworfQorCisjZW5kaWYgLypSRURVTkRBTkNZRklMVEVSX0hfKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9zZXJpYWxpemVyL0dyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9zZXJpYWxpemVyL0dyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTk4YWE5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3NlcmlhbGl6ZXIvR3JhcGhWaXpFeGVjdXRpb25HcmFwaFNlcmlhbGl6ZXIuY3BwCkBAIC0wLDAgKzEsMTcwMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDIyIG1hcnMgMjAxNgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiR3JhcGhWaXpFeGVjdXRpb25HcmFwaFNlcmlhbGl6ZXIuaCIKKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0F2bVByb2dyYW0uaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9Bdm1UcmFuc2l0aW9uLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9Bdm1Db2RlLmg+CisKKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25Db25maWd1cmF0aW9uLmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uQ29udGV4dC5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkRhdGEuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25JbmZvcm1hdGlvbi5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL1J1bnRpbWVGb3JtLmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvUnVudGltZUlELmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvVGFibGVPZkRhdGEuaD4KKworI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9RdWVyeS5oPgorI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9XT2JqZWN0Lmg+CisKKyNpbmNsdWRlIDxzZXcvQ29uZmlndXJhdGlvbi5oPgorI2luY2x1ZGUgPHNldy9TeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXIuaD4KKworI2luY2x1ZGUgPGJvb3N0L2Zvcm1hdC5ocHA+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorICogR0xPQkFMIEhFQURFUiAvIEVORAorICogJTElIC0tPiBncmFwaCBuYW1lLWlkCisgKi8KK2NvbnN0IHN0ZDo6c3RyaW5nICYgR3JhcGhWaXpFeGVjdXRpb25HcmFwaFNlcmlhbGl6ZXI6OgorREVGQVVMVF9HTE9CQUxfSEVBREVSX1BBVFRFUk4gPSAiZGlncmFwaCAlMSUgeyI7CisKK2NvbnN0IHN0ZDo6c3RyaW5nICYgR3JhcGhWaXpFeGVjdXRpb25HcmFwaFNlcmlhbGl6ZXI6OgorREVGQVVMVF9HTE9CQUxfRU5EX1BBVFRFUk4gPSAiXG59IjsKKworLyoqCisgKiBFWEVDVVRJT04gQ09OVEVYVCBOT0RFCisgKiAlMSUgLS0+IG5vZGUjaWQKKyAqICUyJSAtLT4gbm9kZSNsYWJlbAorICogJTMlIC0tPiBub2RlI2NzcworICogJTQlIC0tPiBub2RlI2RhdGEKKyAqICU1JSAtLT4gbm9kZSNpbmZvCisgKiAlNiUgLS0+IG5vZGUjZmlyZWQKKyAqICU3JSAtLT4gbm9kZSN0cmFjZQorICovCitjb25zdCBzdGQ6OnN0cmluZyAmIEdyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyOjoKK0RFRkFVTFRfQ09OVEVYVF9OT0RFX1BBVFRFUk4gPSAiXG5FQyUxJSBbJTIlJTMlXG5dJTQlIjsKKworLyoqCisgKiBFWEVDVVRJT04gQ09OVEVYVCBOT0RFIExBQkVMCisgKiAlMSUgLS0+IG5vZGUjaWQKKyAqICUyJSAtLT4gbm9kZSNoZWFkZXIKKyAqICUzJSAtLT4gbm9kZSNkYXRhCisgKiAlNCUgLS0+IG5vZGUjaW5mbworICogJTUlIC0tPiBub2RlI2ZpcmVkCisgKiAlNiUgLS0+IG5vZGUjdHJhY2UKKyAqLworY29uc3Qgc3RkOjpzdHJpbmcgJiBHcmFwaFZpekV4ZWN1dGlvbkdyYXBoU2VyaWFsaXplcjo6CitERUZBVUxUX0NPTlRFWFRfTk9ERV9MQUJFTF9QQVRURVJOID0gIlxuXHRsYWJlbD1cIiUyJSU0JVwiIjsKKworLyoqCisgKiBFWEVDVVRJT04gQ09OVEVYVCBOT0RFIENTUworICogJTElIC0tPiBub2RlI2lkCisgKiAlMiUgLS0+IG5vZGUjY29sb3IKKyAqICUzJSAtLT4gbm9kZSNzaGFwZQorICogJTQlIC0tPiBub2RlI3N0eWxlCisgKi8KK2NvbnN0IHN0ZDo6c3RyaW5nICYgR3JhcGhWaXpFeGVjdXRpb25HcmFwaFNlcmlhbGl6ZXI6OgorREVGQVVMVF9DT05URVhUX05PREVfQ1NTX1BBVFRFUk4gPQorCQkiXG5cdGNvbG9yPSUyJVxuXHRzaGFwZT0lMyVcblx0c3R5bGU9JTQlIjsKKworLy8gQ1NTIFBST0ZJTEU6IENPTE9SIC8gU0hBUEUKK2NvbnN0IHN0ZDo6c3RyaW5nICYgR3JhcGhWaXpFeGVjdXRpb25HcmFwaFNlcmlhbGl6ZXI6OgorREVGQVVMVF9DT05URVhUX05PREVfQ09MT1IgPSAibGlnaHRibHVlIjsKKworY29uc3Qgc3RkOjpzdHJpbmcgJiBHcmFwaFZpekV4ZWN1dGlvbkdyYXBoU2VyaWFsaXplcjo6CitXQVJOSU5HX0NPTlRFWFRfTk9ERV9DT0xPUiA9ICJvcmFuZ2UiOworCitjb25zdCBzdGQ6OnN0cmluZyAmIEdyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyOjoKK0VSUk9SX0NPTlRFWFRfTk9ERV9DT0xPUiA9ICJyZWQiOworCitjb25zdCBzdGQ6OnN0cmluZyAmIEdyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyOjoKK0FMRVJUX0NPTlRFWFRfTk9ERV9DT0xPUiA9ICJyZWQiOworCisKK2NvbnN0IHN0ZDo6c3RyaW5nICYgR3JhcGhWaXpFeGVjdXRpb25HcmFwaFNlcmlhbGl6ZXI6OgorT0JKRUNUSVZFX0FDSElFVkVEX0NPTlRFWFRfTk9ERV9DT0xPUiA9ICJsYXduZ3JlZW4iOworCitjb25zdCBzdGQ6OnN0cmluZyAmIEdyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyOjoKK09CSkVDVElWRV9BQ0hJRVZFRF9DT05URVhUX05PREVfU0hBUEUgPSAidHJpcGxlb2N0YWdvbiI7CisKKworY29uc3Qgc3RkOjpzdHJpbmcgJiBHcmFwaFZpekV4ZWN1dGlvbkdyYXBoU2VyaWFsaXplcjo6CitPQkpFQ1RJVkVfRkFJTEVEX0NPTlRFWFRfTk9ERV9DT0xPUiA9ICJvcmFuZ2UiOworCitjb25zdCBzdGQ6OnN0cmluZyAmIEdyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyOjoKK09CSkVDVElWRV9GQUlMRURfQ09OVEVYVF9OT0RFX1NIQVBFID0gImRvdWJsZW9jdGFnb24iOworCisKK2NvbnN0IHN0ZDo6c3RyaW5nICYgR3JhcGhWaXpFeGVjdXRpb25HcmFwaFNlcmlhbGl6ZXI6OgorT0JKRUNUSVZFX0FCT1JURURfQ09OVEVYVF9OT0RFX0NPTE9SID0gInJlZCI7CisKK2NvbnN0IHN0ZDo6c3RyaW5nICYgR3JhcGhWaXpFeGVjdXRpb25HcmFwaFNlcmlhbGl6ZXI6OgorT0JKRUNUSVZFX0FCT1JURURfQ09OVEVYVF9OT0RFX1NIQVBFID0gIm9jdGFnb24iOworCisKK2NvbnN0IHN0ZDo6c3RyaW5nICYgR3JhcGhWaXpFeGVjdXRpb25HcmFwaFNlcmlhbGl6ZXI6OgorQ09WRVJBR0VfRUxFTUVOVF9DT05URVhUX05PREVfQ09MT1IgPSAieWVsbG93IjsKKworCitjb25zdCBzdGQ6OnN0cmluZyAmIEdyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyOjoKK1JFRFVOREFOQ1lfQ09OVEVYVF9OT0RFX0NPTE9SID0gImdyZWVuIjsKKworY29uc3Qgc3RkOjpzdHJpbmcgJiBHcmFwaFZpekV4ZWN1dGlvbkdyYXBoU2VyaWFsaXplcjo6CitSRURVTkRBTkNZX0NPTlRFWFRfTk9ERV9TSEFQRSA9ICJjZHMiOworCitjb25zdCBzdGQ6OnN0cmluZyAmIEdyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyOjoKK1JFRFVOREFOQ1lfVEFSR0VUX0NPTlRFWFRfTk9ERV9DT0xPUiA9ICJncmVlbnllbGxvdyI7CisKK2NvbnN0IHN0ZDo6c3RyaW5nICYgR3JhcGhWaXpFeGVjdXRpb25HcmFwaFNlcmlhbGl6ZXI6OgorUkVEVU5EQU5DWV9UQVJHRVRfQ09OVEVYVF9OT0RFX1NIQVBFID0gInNlcHRhZ29uIjsKKworLy8gQ1NTIFBST0ZJTEU6IFNIQVBFCitjb25zdCBzdGQ6OnN0cmluZyAmIEdyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyOjoKK0RFRkFVTFRfQ09OVEVYVF9OT0RFX1NIQVBFID0gImVsbGlwc2UiOworCitjb25zdCBzdGQ6OnN0cmluZyAmIEdyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyOjoKK1NUQVRFTUVOVF9FWElUX0NPTlRFWFRfTk9ERV9TSEFQRSA9ICJ0cmlwbGVvY3RhZ29uIjsKKworLy8gQ1NTIFBST0ZJTEU6IFNUWUxFCitjb25zdCBzdGQ6OnN0cmluZyAmIEdyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyOjoKK0RFRkFVTFRfQ09OVEVYVF9OT0RFX1NUWUxFID0gImZpbGxlZCI7CisKKworLyoqCisgKiBFWEVDVVRJT04gQ09OVEVYVCBFREdFCisgKiAlMSUgLS0+IG5vZGUjc291cmNlI2lkCisgKiAlMiUgLS0+IG5vZGUjdGFyZ2V0I2lkCisgKiAlMyUgLS0+IG5vZGUjdGFyZ2V0I2RhdGEKKyAqICU0JSAtLT4gbm9kZSN0YXJnZXQjaW5mbworICogJTUlIC0tPiBub2RlI3RhcmdldCNmaXJlZAorICogJTYlIC0tPiBub2RlI3RhcmdldCN0cmFjZQorICovCitjb25zdCBzdGQ6OnN0cmluZyAmIEdyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyOjoKK0RFRkFVTFRfQ09OVEVYVF9FREdFX1BBVFRFUk4gPSAiXG5FQyUxJSAtPiBFQyUyJSBbXG5cdGxhYmVsPVwiJTUlJTYlXCJcbl0iOworCisvKioKKyAqIEVYRUNVVElPTiBDT05URVhUIEhFQURFUgorICogJTElIC0tPiBlYyNpZAorICogJTIlIC0tPiBlYyNldmFsCisgKiAlMyUgLS0+IGVjI2hpZ2h0CisgKiAlNCUgLS0+IGVjI3dpZHRoCisgKiAlNSUgLS0+IGVjI3dlaWdodAorICogJTYlIC0tPiBzdGF0ZW1hY2hpbmUgY29uZmlndXJhdGlvbiBpLmUuIGxpZmVsaW5lcyBzdGF0ZSBpZGVudGlmaWVyCisgKi8KK2NvbnN0IHN0ZDo6c3RyaW5nICYgR3JhcGhWaXpFeGVjdXRpb25HcmFwaFNlcmlhbGl6ZXI6OgorREVGQVVMVF9DT05URVhUX05PREVfSEVBREVSX1BBVFRFUk4gPSAiRUMjJTElPEV2OiUyJT5cXG4lNiUiOworCisvKioKKyAqIEVYRUNVVElPTiBEQVRBCisgKiAlMSUgLS0+IGVjI2lkCisgKiAlMiUgLS0+IGVjI2Fzc2lnbgorICogJTMlIC0tPiBlYyNwYXRoI2NvbmRpdGlvbgorICogJTQlIC0tPiBlYyNwYXRoI3RpbWVkI2NvbmRpdGlvbgorICogJTUlIC0tPiBlYyNub2RlI2NvbmRpdGlvbgorICogJTYlIC0tPiBlYyNub2RlI3RpbWVkI2NvbmRpdGlvbgorICovCitjb25zdCBzdGQ6OnN0cmluZyAmIEdyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyOjoKK0RFRkFVTFRfQ09OVEVYVF9OT0RFX0RBVEFfUEFUVEVSTiA9ICJcbkVDJTElIC0+IEVEJTElXG5FRCUxJSAiCisJCSJbXG5cdGxhYmVsPVwiJTMlJTQlJTUlJTYlJTIlXCJcblx0c2hhcGU9Ym94XG5dIjsKKworLyoqCisgKiBFWEVDVVRJT04gQ09OVEVYVCBJTkZPCisgKiAlMSUgLS0+IG5vZGUjaWQKKyAqICUyJSAtLT4gZXhlY3V0aW9uIGluZm8KKyAqLworY29uc3Qgc3RkOjpzdHJpbmcgJiBHcmFwaFZpekV4ZWN1dGlvbkdyYXBoU2VyaWFsaXplcjo6CitERUZBVUxUX0NPTlRFWFRfTk9ERV9JTkZPX1BBVFRFUk4gPSAiXG4lMiUiOworLy8JCSJcbkVDJTElIC0+IEVJJTElXG5FSSUxJSBbXG5cdGxhYmVsPVwiJTIlXCIiCisvLwkJIlxuXHRzaGFwZT1vY3RhZ29uXG5cdGNvbG9yPXllbGxvd1xuXHRzdHlsZT1maWxsZWRcbl0iOworCisvKioKKyAqIEVYRUNVVElPTiBDT05URVhUIElORk8KKyAqICUxJSAtLT4gbm9kZSNpZAorICogJTIlIC0tPiBleGVjdXRpb24gZmlyZWQKKyAqLworY29uc3Qgc3RkOjpzdHJpbmcgJiBHcmFwaFZpekV4ZWN1dGlvbkdyYXBoU2VyaWFsaXplcjo6CitERUZBVUxUX0NPTlRFWFRfTk9ERV9GSVJFRF9QQVRURVJOID0gIiUyJSI7CisKKy8qKgorICogRVhFQ1VUSU9OIENPTlRFWFQgSU5GTworICogJTElIC0tPiBub2RlI2lkCisgKiAlMiUgLS0+IGV4ZWN1dGlvbiB0cmFjZQorICovCitjb25zdCBzdGQ6OnN0cmluZyAmIEdyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyOjoKK0RFRkFVTFRfQ09OVEVYVF9OT0RFX1RSQUNFX1BBVFRFUk4gPSAiJTIlIjsKKworLyoqCisgKiBJTkZPCisgKiAlMSUgLS0+IGluZm8gaWQKKyAqICUyJSAtLT4gaW5mbyBkYXRhCisgKi8KK2NvbnN0IHN0ZDo6c3RyaW5nICYgR3JhcGhWaXpFeGVjdXRpb25HcmFwaFNlcmlhbGl6ZXI6OgorREVGQVVMVF9JTkZPX1BBVFRFUk4gPSAiJTElOiAlMiUiOworCitjb25zdCBzdGQ6OnN0cmluZyAmIEdyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyOjoKK1NUQU5EQVJEX0lORk9fUEFUVEVSTiA9ICIlMiUiOworCisvKioKKyAqIENPTkRJVElPTgorICogICUxJSAtLT4gY29uZGl0aW9uCisgKi8KK2NvbnN0IHN0ZDo6c3RyaW5nICYgR3JhcGhWaXpFeGVjdXRpb25HcmFwaFNlcmlhbGl6ZXI6OgorREVGQVVMVF9QQVRIX0NPTkRJVElPTl9QQVRURVJOID0gIiIgLyoiUEM6ICUxJSIqLzsKKworY29uc3Qgc3RkOjpzdHJpbmcgJiBHcmFwaFZpekV4ZWN1dGlvbkdyYXBoU2VyaWFsaXplcjo6CitERUZBVUxUX1BBVEhfVElNRURfQ09ORElUSU9OX1BBVFRFUk4gPSAiIiAvKiJQdEM6ICUxJSIqLzsKKworY29uc3Qgc3RkOjpzdHJpbmcgJiBHcmFwaFZpekV4ZWN1dGlvbkdyYXBoU2VyaWFsaXplcjo6CitERUZBVUxUX05PREVfQ09ORElUSU9OX1BBVFRFUk4gPSAiIiAvKiJOQzogJTElIiovOworCitjb25zdCBzdGQ6OnN0cmluZyAmIEdyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyOjoKK0RFRkFVTFRfTk9ERV9USU1FRF9DT05ESVRJT05fUEFUVEVSTiA9ICIiLyoiTnRDOiAlMSUiKi87CisKKy8qKgorICogQVNTSUdOCisgKiAlMSUgLS0+IG1hY2hpbmUgcnVudGltZSBwaWQKKyAqICUyJSAtLT4gbWFjaGluZSBjb250YWluZXIgaWRlbnRpZmllcgorICogJTMlIC0tPiB2YXJpYWJsZSBpZGVudGlmaWVyCisgKiAlNCUgLS0+IHZhbHVlCisgKi8KK2NvbnN0IHN0ZDo6c3RyaW5nICYgR3JhcGhWaXpFeGVjdXRpb25HcmFwaFNlcmlhbGl6ZXI6OgorREVGQVVMVF9BU1NJR05fUEFUVEVSTiA9ICIlMSU6JTIlID0gJTMlIjsKKworLyoqCisgKiBORVdGUkVTSAorICogJTElIC0tPiBtYWNoaW5lIHJ1bnRpbWUgcGlkCisgKiAlMiUgLS0+IG1hY2hpbmUgY29udGFpbmVyIGlkZW50aWZpZXIKKyAqICUzJSAtLT4gdmFyaWFibGUgaWRlbnRpZmllcgorICogJTQlIC0tPiB2YWx1ZQorICovCitjb25zdCBzdGQ6OnN0cmluZyAmIEdyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyOjoKK0RFRkFVTFRfTkVXRlJFU0hfUEFUVEVSTiA9ICJuZXdmcmVzaCAlMSUtPiUyJSggJTMlICkiOworCisvKioKKyAqIElOUFVUIC8gT1VUUFVUCisgKiAlMSUgLS0+IG1hY2hpbmUgcnVudGltZSBwaWQKKyAqICUyJSAtLT4gbWFjaGluZSBjb250YWluZXIgaWRlbnRpZmllcgorICogJTMlIC0tPiAoIHBvcnQgfCBzaWduYWwgKSBpZGVudGlmaWVyCisgKiAlNCUgLS0+IHZhbHVlCisgKiAlNSUgLS0+IG1hY2hpbmUgc2VuZGVyICAgaWRlbnRpZmllciBuYW1lCisgKiAlNiUgLS0+IG1hY2hpbmUgcmVjZWl2ZXIgaWRlbnRpZmllciBuYW1lCisgKi8KK2NvbnN0IHN0ZDo6c3RyaW5nICYgR3JhcGhWaXpFeGVjdXRpb25HcmFwaFNlcmlhbGl6ZXI6OgorREVGQVVMVF9JTlBVVF9QQVRURVJOID0gIiUxJS0+JTMlID8gJTQlIjsKKworY29uc3Qgc3RkOjpzdHJpbmcgJiBHcmFwaFZpekV4ZWN1dGlvbkdyYXBoU2VyaWFsaXplcjo6CitERUZBVUxUX09VVFBVVF9QQVRURVJOID0gIiUxJS0+JTMlICEgJTQlIjsKKworCitjb25zdCBzdGQ6OnN0cmluZyAmIEdyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyOjoKK0RFRkFVTFRfSU5QVVRfRU5WX1BBVFRFUk4gPSAiZW52ID0+ICUxJS0+JTMlID8gJTQlIjsKKworY29uc3Qgc3RkOjpzdHJpbmcgJiBHcmFwaFZpekV4ZWN1dGlvbkdyYXBoU2VyaWFsaXplcjo6CitERUZBVUxUX09VVFBVVF9FTlZfUEFUVEVSTiA9ICJlbnYgPD0gJTElLT4lMyUgISAlNCUiOworCisKK2NvbnN0IHN0ZDo6c3RyaW5nICYgR3JhcGhWaXpFeGVjdXRpb25HcmFwaFNlcmlhbGl6ZXI6OgorREVGQVVMVF9JTlBVVF9SRFZfUEFUVEVSTiA9ICJcdGlucHV0I3JkdiAgJTIlLT4lMyUlNCVcbiI7CisKK2NvbnN0IHN0ZDo6c3RyaW5nICYgR3JhcGhWaXpFeGVjdXRpb25HcmFwaFNlcmlhbGl6ZXI6OgorREVGQVVMVF9PVVRQVVRfUkRWX1BBVFRFUk4gPSAiXHRvdXRwdXQjcmR2ICUyJS0+JTMlJTQlXG4iOworCisKKy8qKgorICogTElGRUxJTkUgU1RBVEUgSURFTlRJRklFUgorICogJTElIC0tPiBsaWZlbGluZSBydW50aW1lIHBpZAorICogJTIlIC0tPiBsaWZlbGluZSBpZGVudGlmaWVyCisgKiAlMyUgLS0+IHN0YXRlIHJ1bnRpbWUgcGlkCisgKiAlMyUgLS0+IHN0YXRlIGlkZW50aWZpZXIKKyAqLworY29uc3Qgc3RkOjpzdHJpbmcgJiBHcmFwaFZpekV4ZWN1dGlvbkdyYXBoU2VyaWFsaXplcjo6CitERUZBVUxUX0xJRkVMSU5FX1NUQVRFX1BBVFRFUk4gPSAiJTIlOiU0JSI7CisKKy8qKgorICogTUFDSElORQorICogJTElIC0tPiBtYWNoaW5lIHJ1bnRpbWUgcGlkCisgKiAlMiUgLS0+IG1hY2hpbmUgY29udGFpbmVyIGlkZW50aWZpZXIKKyAqICUzJSAtLT4gbWFjaGluZSBpZGVudGlmaWVyCisgKi8KK2NvbnN0IHN0ZDo6c3RyaW5nICYgR3JhcGhWaXpFeGVjdXRpb25HcmFwaFNlcmlhbGl6ZXI6OgorREVGQVVMVF9NQUNISU5FX1BBVFRFUk4gPSAiJTMlIjsKKworLyoqCisgKiBUUkFOU0lUSU9OCisgKiAlMSUgLS0+IG1hY2hpbmUgcnVudGltZSBwaWQKKyAqICUyJSAtLT4gbWFjaGluZSBjb250YWluZXIgaWRlbnRpZmllcgorICogJTMlIC0tPiB0cmFuc2l0aW9uIGlkZW50aWZpZXIKKyAqLworY29uc3Qgc3RkOjpzdHJpbmcgJiBHcmFwaFZpekV4ZWN1dGlvbkdyYXBoU2VyaWFsaXplcjo6CitERUZBVUxUX1RSQU5TSVRJT05fUEFUVEVSTiA9ICIlMiUtPiUzJSI7CisKKy8qKgorICogUk9VVElORQorICogJTElIC0tPiBtYWNoaW5lIHJ1bnRpbWUgcGlkCisgKiAlMiUgLS0+IG1hY2hpbmUgY29udGFpbmVyIGlkZW50aWZpZXIKKyAqICUzJSAtLT4gcm91dGluZSBpZGVudGlmaWVyCisgKi8KK2NvbnN0IHN0ZDo6c3RyaW5nICYgR3JhcGhWaXpFeGVjdXRpb25HcmFwaFNlcmlhbGl6ZXI6OgorREVGQVVMVF9ST1VUSU5FX1BBVFRFUk4gPSAiJTIlLT4lMyUiOworCisvKioKKyAqIFZBUklBQkxFCisgKiAlMSUgLS0+IG1hY2hpbmUgcnVudGltZSBwaWQKKyAqICUyJSAtLT4gbWFjaGluZSBjb250YWluZXIgaWRlbnRpZmllcgorICogJTMlIC0tPiB2YXJpYWJsZSBpZGVudGlmaWVyCisgKi8KK2NvbnN0IHN0ZDo6c3RyaW5nICYgR3JhcGhWaXpFeGVjdXRpb25HcmFwaFNlcmlhbGl6ZXI6OgorREVGQVVMVF9WQVJJQUJMRV9QQVRURVJOID0gIiUxJS0+JTMlIjsKKworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc2VyaWFsaXplciArPSBHcmFwaFZpekV4ZWN1dGlvbkdyYXBoU2VyaWFsaXplciA8bmFtZS1pZD4gIjxkZXNjcmlwdGlvbj4iIHsKKwkvLyAuLi4KKworQHByb3BlcnR5OgorCitAdHJhY2U6CisKK0Bmb3JtYXQ6CisKK0B2ZnM6CisJZmlsZSA9ICI8c2F2ZS1maWxlLXBhdGg+IgorfQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCitwcm90b3R5cGUgcHJvY2Vzc29yOjpzZXJpYWxpemVyI2dyYXBoICJzZXJpYWxpemUgZ3JhcGgiIGFzIEdyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyIGlzCitzZWN0aW9uIFBST1BFUlRZCisJQGluZm8jc2VsZWN0aW9uID0gJ0FMTCc7ICAgCQkvLyBBTEwgfCBNT0RJRklFRAorCUBkYXRhI3NlbGVjdGlvbiA9ICdBTEwnOyAgIAkJLy8gQUxMIHwgTU9ESUZJRUQKK2VuZHNlY3Rpb24gUFJPUEVSVFkKKworc2VjdGlvbiBGT1JNQVQKKwlAbGluZSN3cmFwI3dpZHRoID0gNDI7CisJQGxpbmUjd3JhcCNzZXBhcmF0b3IgPSAiXFxsIjsKKworCS8vICUxJSAtLT4gZ3JhcGggbmFtZSNpZAorCUBoZWFkZXIgPSAiZGlncmFwaCBtb2RlbF8lMSUge1xuIjsKKwlAZW5kICAgID0gIlxufSI7CisKKwkvLyAlMSUgLS0+IG5vZGUjaWQKKwkvLyAlMiUgLS0+IG5vZGUjbGFiZWwKKwkvLyAlMyUgLS0+IG5vZGUjY3NzCisJLy8gJTQlIC0tPiBub2RlI2RhdGEKKwkvLyAlNSUgLS0+IG5vZGUjaW5mbworCS8vICU2JSAtLT4gbm9kZSNmaXJlZAorCS8vICU3JSAtLT4gbm9kZSN0cmFjZQorCUBub2RlID0gIlxuRUMlMSUgWyUyJSUzJVxuXSU1JSU0JSI7CisKKwkvLyAlMSUgLS0+IG5vZGUjaWQKKwkvLyAlMiUgLS0+IG5vZGUjaGVhZGVyCisJLy8gJTMlIC0tPiBub2RlI2RhdGEKKwkvLyAlNCUgLS0+IG5vZGUjaW5mbworCS8vICU1JSAtLT4gbm9kZSNmaXJlZAorCS8vICU2JSAtLT4gbm9kZSN0cmFjZQorCUBub2RlI2xhYmVsID0gIlxuXHRsYWJlbD1cIiUyJVwiIjsKKworCS8vICUxJSAtLT4gbm9kZSNpZAorCS8vICUyJSAtLT4gbm9kZSNjb2xvcgorCS8vICUzJSAtLT4gbm9kZSNzaGFwZQorCS8vICU0JSAtLT4gbm9kZSNzdHlsZQorCUBub2RlI2NzcyA9ICJcblx0Y29sb3I9JTIlXG5cdHNoYXBlPSUzJVxuXHRzdHlsZT0lNCUiOworCisJLy8gJTElIC0tPiBub2RlI3NvdXJjZSNpZAorCS8vICUyJSAtLT4gbm9kZSN0YXJnZXQjaWQKKwkvLyAlMyUgLS0+IG5vZGUjdGFyZ2V0I2RhdGEKKwkvLyAlNCUgLS0+IG5vZGUjdGFyZ2V0I2luZm8KKwkvLyAlNSUgLS0+IG5vZGUjdGFyZ2V0I2ZpcmVkCisJLy8gJTYlIC0tPiBub2RlI3RhcmdldCN0cmFjZQorCUBlZGdlID0gIlxuRUMlMSUgLT4gRUMlMiUgW1xuXHRsYWJlbD1cIiU1JSU2JVwiXG5dIjsKKworCS8vICUxJSAtLT4gZWMjaWQKKwkvLyAlMiUgLS0+IGVjI2V2YWwKKwkvLyAlMyUgLS0+IGVjI2hpZ2h0CisJLy8gJTQlIC0tPiBlYyN3aWR0aAorCS8vICU1JSAtLT4gZWMjd2VpZ2h0CisJLy8gJTYlIC0tPiBzdGF0ZW1hY2hpbmUgY29uZmlndXJhdGlvbiBpLmUuIGxpZmVsaW5lcyBzdGF0ZSBpZGVudGlmaWVyCisJQG5vZGUjaGVhZGVyID0gIkVDIyUxJTxFdjolMiU+XG4lNiUiOworCisJLy8gJTElIC0tPiBlYyNpZAorCS8vICUyJSAtLT4gZWMjYXNzaWduCisJLy8gJTMlIC0tPiBlYyNwYXRoI2NvbmRpdGlvbgorCS8vICU0JSAtLT4gZWMjcGF0aCN0aW1lZCNjb25kaXRpb24KKwkvLyAlNSUgLS0+IGVjI25vZGUjY29uZGl0aW9uCisJLy8gJTYlIC0tPiBlYyNub2RlI3RpbWVkI2NvbmRpdGlvbgorCUBub2RlI2RhdGEgPSAiXG5FQyUxJSAtPiBFRCUxJVxuRUQlMSUgW1xuXHRsYWJlbD1cIiUzJSU0JSU1JSU2JSUyJVwiXG5cdHNoYXBlPWJveFxuXSI7CisKKwkvLyAlMSUgLS0+IG5vZGUjaWQKKwkvLyAlMiUgLS0+IGV4ZWN1dGlvbiBpbmZvCisJQG5vZGUjaW5mbyA9ICJcbkVDJTElIC0+IEVJJTElXG5FSSUxJSBbXG5cdGxhYmVsPVwiJTIlXCJcblx0c2hhcGU9Ym94XG5cdGNvbG9yPXllbGxvd1xuXHRzdHlsZT1maWxsZWRcbl0iOworCisJLy8gJTElIC0tPiBub2RlI2lkCisJLy8gJTIlIC0tPiBleGVjdXRpb24gZmlyZWQKKwlAbm9kZSNmaXJlZCA9ICIlMiUiOworCisJLy8gJTElIC0tPiBub2RlI2lkCisJLy8gJTIlIC0tPiBleGVjdXRpb24gdHJhY2UKKwlAbm9kZSN0cmFjZSA9ICIlMiUiOworCisKKwkvLyAlMSUgLS0+IGluZm8gaWQKKwkvLyAlMiUgLS0+IGluZm8gZGF0YQorCUBpbmZvID0gIiUyJSI7CisKKwkvLyAlMSUgLS0+IGNvbmRpdGlvbgorCUBwYXRoI2NvbmRpdGlvbiA9ICJQQzogJTElIjsKKwlAcGF0aCN0aW1lZCNjb25kaXRpb24gPSAiUHRDOiAlMSUiOworCUBub2RlI2NvbmRpdGlvbiA9ICJOQzogJTElIjsKKwlAbm9kZSN0aW1lZCNjb25kaXRpb24gPSAiTnRDOiAlMSUiOworCisJLy8gJTElIC0tPiBtYWNoaW5lIHJ1bnRpbWUgcGlkCisJLy8gJTIlIC0tPiBtYWNoaW5lIGlkZW50aWZpZXIgbmFtZQorCS8vICUzJSAtLT4gcG9ydCB8IHNpZ25hbCB8IHZhcmlhYmxlIHwgbWFjaGluZSB8IHRyYW5zaXRpb24gfCByb3V0aW5lCisJLy8gJTQlIC0tPiB2YWx1ZQorCUBhc3NpZ24gICAgID0gIiUyJTolMyU9JTQlIjsKKworCUBuZXdmcmVzaCAgID0gIm5ld2ZyZXNoKCUxJTolMyUpIDwtICU0JSI7CisKKwlAbWFjaGluZSAgICA9ICIiOworCUBtYWNoaW5lICAgID0gInJ1biAlMSU6JTMlIjsKKworCUB0cmFuc2l0aW9uID0gImZpcmVkICUzJSI7CisJQHJvdXRpbmUgICAgPSAiaW52b2tlICUyJTolMyUiOworCisJQGlucHV0ICA9ICIlMyUgPyAlNCUiOworCUBpbnB1dCAgPSAiJTElLT4lMyUgPyAlNCUiOworCisJQGlucHV0I2VudiA9ICJlbnYgPT4gJTElLT4lMyUgPyAlNCUiOworCisJQG91dHB1dCA9ICIlMyUgISAlNCUiOworCUBvdXRwdXQgPSAiJTElLT4lMyUgISAlNCUiOworCisJQG91dHB1dCNlbnYgPSAiZW52IDw9ICUxJS0+JTMlICEgJTQlIjsKK2VuZHNlY3Rpb24gRk9STUFUCitzZWN0aW9uIFRSQUNFCisJQG1hY2hpbmUgPSAiWypdIjsKKworCUBzdGF0ZSA9ICJbKl0iOworCUB0YXRlbWFjaGluZSA9ICJbKl0iOworCisJQHRyYW5zaXRpb24gPSAiWypdIjsKKworCUByb3V0aW5lID0gIlsqXSI7CisKKwlAY29tID0gIlsqXSI7CisKKwlAaW5wdXQgID0gIlsqXSI7CisJQG91dHB1dCA9ICJbKl0iOworCisJQG5ld2ZyZXNoID0gIlsqXSI7CisJQHZhcmlhYmxlID0gIlsqXSI7CitlbmRzZWN0aW9uIFRSQUNFCitzZWN0aW9uIFZGUworCUBmaWxlID0gImdyYXBoLmd2IjsKK2VuZHNlY3Rpb24gVkZTCitlbmRwcm90b3R5cGUKKyovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDT05GSUdVUkUgQVBJCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIEdyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyOjpjb25maWd1cmVJbXBsKCkKK3sKKwltQ29uZmlnRmxhZyA9IFNlcmlhbGl6ZXI6OmNvbmZpZ3VyZUltcGwoKTsKKworCS8vIHRoZSBUcmFjZSBQb2ludCBGaWx0ZXIgY29uZmlndXJhdGlvbgorCW1Db25maWdGbGFnID0gbVRyYWNlRmlsdGVyLmNvbmZpZ3VyZShnZXRFTlYoKSwgZ2V0UGFyYW1ldGVyV09iamVjdCgpKQorCQkJJiYgbUNvbmZpZ0ZsYWc7CisKKwlhdm1fc2l6ZV90IGVycm9yID0gMDsKKworCS8vIFN0YW5kYXJkIHByb2ZpbGUKKwltQ29udGV4dE5vZGVDb2xvciAgID0gREVGQVVMVF9DT05URVhUX05PREVfQ09MT1I7CisJbUNvbnRleHROb2RlU2hhcGUgICA9IERFRkFVTFRfQ09OVEVYVF9OT0RFX1NIQVBFOworCW1Db250ZXh0Tm9kZVN0eWxlICAgPSBERUZBVUxUX0NPTlRFWFRfTk9ERV9TVFlMRTsKKworCW1Db250ZXh0Tm9kZVNlcGFyYXRvciA9ICJcXG4iOworCisJbUluZm9QYXR0ZXJuID0gU1RBTkRBUkRfSU5GT19QQVRURVJOOworCW1JbmZvSnVzdGlmaWNhdGlvbiA9ICIiOworCW1JbmZvU2VwYXJhdG9yID0gIlxcbiI7CisKKworCVdPYmplY3QgKiB0aGVGT1JNQVQgPSBRdWVyeTo6Z2V0UmVnZXhXU2VxdWVuY2UoCisJCQlnZXRQYXJhbWV0ZXJXT2JqZWN0KCksIE9SX1dJRDIoImZvcm1hdCIsICJGT1JNQVQiKSk7CisJaWYoIHRoZUZPUk1BVCAhPSBXT2JqZWN0OjpfTlVMTF8gKQorCXsKKwkJbVdyYXBEYXRhLlNFUEFSQVRPUiA9IFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eVN0cmluZyh0aGVGT1JNQVQsCisJCQlDT05TX1dJRDMoImxpbmUiLCAid3JhcCIsICJzZXBhcmF0b3IiKSwgbVdyYXBEYXRhLlNFUEFSQVRPUik7CisJCVN0cmluZ1Rvb2xzOjpyZXBsYWNlQWxsKG1XcmFwRGF0YS5TRVBBUkFUT1IsICJcXFxcbCIsICJcXGwiKTsKKworCQllcnJvciArPSBjb25maWd1cmVGb3JtYXR0ZXIodGhlRk9STUFULAorCQkJCW1HbG9iYWxIZWFkZXJQYXR0ZXJuLCAiaGVhZGVyIiApID8gMCA6IDE7CisJCWVycm9yICs9IGNvbmZpZ3VyZUZvcm1hdHRlcih0aGVGT1JNQVQsCisJCQkJbUdsb2JhbEVuZFBhdHRlcm4sICJlbmQiICkgPyAwIDogMTsKKworCQllcnJvciArPSBjb25maWd1cmVGb3JtYXR0ZXIodGhlRk9STUFULAorCQkJCW1Db250ZXh0Tm9kZVBhdHRlcm4sICJub2RlIiApID8gMCA6IDE7CisJCWVycm9yICs9IGNvbmZpZ3VyZUZvcm1hdHRlcih0aGVGT1JNQVQsIG1Db250ZXh0Tm9kZUxhYmVsUGF0dGVybiwKKwkJCQlDT05TX1dJRDIoIm5vZGUiLCAibGFiZWwiKSwgdHJ1ZSApID8gMCA6IDE7CisJCWVycm9yICs9IGNvbmZpZ3VyZUZvcm1hdHRlcih0aGVGT1JNQVQsIG1Db250ZXh0Tm9kZUNzc1BhdHRlcm4sCisJCQkJQ09OU19XSUQyKCJub2RlIiwgImNzcyIpLCB0cnVlICkgPyAwIDogMTsKKworCQllcnJvciArPSBjb25maWd1cmVGb3JtYXR0ZXIodGhlRk9STUFULAorCQkJCW1Db250ZXh0RWRnZVBhdHRlcm4sICJlZGdlIiApID8gMCA6IDE7CisKKwkJZXJyb3IgKz0gY29uZmlndXJlRm9ybWF0dGVyKHRoZUZPUk1BVCwgbUNvbnRleHROb2RlSGVhZGVyUGF0dGVybiwKKwkJCQlDT05TX1dJRDIoIm5vZGUiLCAiaGVhZGVyIiksIHRydWUgKSA/IDAgOiAxOworCQllcnJvciArPSBjb25maWd1cmVGb3JtYXR0ZXIodGhlRk9STUFULCBtQ29udGV4dE5vZGVEYXRhUGF0dGVybiwKKwkJCQlDT05TX1dJRDIoIm5vZGUiLCAiZGF0YSIpLCB0cnVlICkgPyAwIDogMTsKKwkJZXJyb3IgKz0gY29uZmlndXJlRm9ybWF0dGVyKHRoZUZPUk1BVCwgbUNvbnRleHROb2RlSW5mb1BhdHRlcm4sCisJCQkJQ09OU19XSUQyKCJub2RlIiwgImluZm8iKSwgdHJ1ZSApID8gMCA6IDE7CisJCWVycm9yICs9IGNvbmZpZ3VyZUZvcm1hdHRlcih0aGVGT1JNQVQsIG1Db250ZXh0Tm9kZUZpcmVkUGF0dGVybiwKKwkJCQlDT05TX1dJRDIoIm5vZGUiLCAiZmlyZWQiKSwgdHJ1ZSApID8gMCA6IDE7CisJCWVycm9yICs9IGNvbmZpZ3VyZUZvcm1hdHRlcih0aGVGT1JNQVQsIG1Db250ZXh0Tm9kZVRyYWNlUGF0dGVybiwKKwkJCQlDT05TX1dJRDIoIm5vZGUiLCAidHJhY2UiKSwgdHJ1ZSApID8gMCA6IDE7CisKKwkJZXJyb3IgKz0gY29uZmlndXJlRm9ybWF0dGVyKHRoZUZPUk1BVCwgbUluZm9QYXR0ZXJuLCAiaW5mbyIgKSA/IDAgOiAxOworCisJCWVycm9yICs9IGNvbmZpZ3VyZUZvcm1hdHRlcih0aGVGT1JNQVQsIG1QYXRoQ29uZGl0aW9uUGF0dGVybiwKKwkJCQlDT05TX1dJRDIoInBhdGgiLCAiY29uZGl0aW9uIiksIHRydWUgKSA/IDAgOiAxOworCQllcnJvciArPSBjb25maWd1cmVGb3JtYXR0ZXIodGhlRk9STUFULCBtUGF0aFRpbWVkQ29uZGl0aW9uUGF0dGVybiwKKwkJCQlDT05TX1dJRDMoInBhdGgiLCAidGltZWQiLCAiY29uZGl0aW9uIiksIHRydWUgKSA/IDAgOiAxOworCQllcnJvciArPSBjb25maWd1cmVGb3JtYXR0ZXIodGhlRk9STUFULCBtTm9kZUNvbmRpdGlvblBhdHRlcm4sCisJCQkJQ09OU19XSUQyKCJub2RlIiwgImNvbmRpdGlvbiIpLCB0cnVlICkgPyAwIDogMTsKKwkJZXJyb3IgKz0gY29uZmlndXJlRm9ybWF0dGVyKHRoZUZPUk1BVCwgbU5vZGVUaW1lZENvbmRpdGlvblBhdHRlcm4sCisJCQkJQ09OU19XSUQzKCJub2RlIiwgInRpbWVkIiwgImNvbmRpdGlvbiIpLCB0cnVlICkgPyAwIDogMTsKKworCQllcnJvciArPSBjb25maWd1cmVGb3JtYXR0ZXIodGhlRk9STUFULAorCQkJCW1Bc3NpZ25QYXR0ZXJuLCAiYXNzaWduIiApID8gMCA6IDE7CisJCWVycm9yICs9IGNvbmZpZ3VyZUZvcm1hdHRlcih0aGVGT1JNQVQsCisJCQkJbU5ld2ZyZXNoUGF0dGVybiwgIm5ld2ZyZXNoIiApID8gMCA6IDE7CisKKwkJZXJyb3IgKz0gY29uZmlndXJlRm9ybWF0dGVyKHRoZUZPUk1BVCwKKwkJCQltSW5wdXRQYXR0ZXJuLCAiaW5wdXQiICkgPyAwIDogMTsKKwkJZXJyb3IgKz0gY29uZmlndXJlRm9ybWF0dGVyKHRoZUZPUk1BVCwKKwkJCQltT3V0cHV0UGF0dGVybiwgIm91dHB1dCIgKSA/IDAgOiAxOworCisKKwkJZXJyb3IgKz0gY29uZmlndXJlRm9ybWF0dGVyKHRoZUZPUk1BVCwKKwkJCQltSW5wdXRFbnZQYXR0ZXJuLCBDT05TX1dJRDIoImlucHV0IiwgImVudiIpLCB0cnVlICkgPyAwIDogMTsKKwkJZXJyb3IgKz0gY29uZmlndXJlRm9ybWF0dGVyKHRoZUZPUk1BVCwKKwkJCQltT3V0cHV0RW52UGF0dGVybiwgQ09OU19XSUQyKCJvdXRwdXQiLCAiZW52IiksIHRydWUgKSA/IDAgOiAxOworCisJCWVycm9yICs9IGNvbmZpZ3VyZUZvcm1hdHRlcih0aGVGT1JNQVQsCisJCQkJbUlucHV0UmR2UGF0dGVybiAsIENPTlNfV0lEMigiaW5wdXQiLCAicmR2IiksIHRydWUgKSA/IDAgOiAxOworCQllcnJvciArPSBjb25maWd1cmVGb3JtYXR0ZXIodGhlRk9STUFULAorCQkJCW1PdXRwdXRSZHZQYXR0ZXJuLCBDT05TX1dJRDIoIm91dHB1dCIsICJyZHYiKSwgdHJ1ZSkgPyAwIDogMTsKKworCisJCWlmKCBRdWVyeTo6aGFzV1Byb3BlcnR5U3RyaW5nKHRoZUZPUk1BVCwgImlucHV0IikgKQorCQl7CisJCQlpZiggbm90IFF1ZXJ5OjpoYXNSZWdleFdQcm9wZXJ0eSgKKwkJCQkJdGhlRk9STUFULCBDT05TX1dJRDIoImlucHV0IiwgImVudiIpKSApCisJCQl7CisJCQkJbUlucHV0RW52UGF0dGVybiA9IG1JbnB1dFBhdHRlcm47CisJCQl9CisJCQlpZiggbm90IFF1ZXJ5OjpoYXNSZWdleFdQcm9wZXJ0eSgKKwkJCQkJdGhlRk9STUFULCBDT05TX1dJRDIoImlucHV0IiwgInJkdiIpKSApCisJCQl7CisJCQkJbUlucHV0UmR2UGF0dGVybiA9IG1JbnB1dFBhdHRlcm47CisJCQl9CisJCX0KKworCQlpZiggUXVlcnk6Omhhc1dQcm9wZXJ0eVN0cmluZyh0aGVGT1JNQVQsICJvdXRwdXQiKSApCisJCXsKKwkJCWlmKCBub3QgUXVlcnk6Omhhc1JlZ2V4V1Byb3BlcnR5KAorCQkJCQl0aGVGT1JNQVQsIENPTlNfV0lEMigib3V0cHV0IiwgImVudiIpKSApCisJCQl7CisJCQkJbU91dHB1dEVudlBhdHRlcm4gPSBtT3V0cHV0UGF0dGVybjsKKwkJCX0KKworCQkJaWYoIG5vdCBRdWVyeTo6aGFzUmVnZXhXUHJvcGVydHkoCisJCQkJCXRoZUZPUk1BVCwgQ09OU19XSUQyKCJvdXRwdXQiLCAicmR2IikpICkKKwkJCXsKKwkJCQltT3V0cHV0UmR2UGF0dGVybiA9IG1PdXRwdXRQYXR0ZXJuOworCQkJfQorCQl9CisKKworCQllcnJvciArPSBjb25maWd1cmVGb3JtYXR0ZXIodGhlRk9STUFULCBtTGlmZWxpbmVTdGF0ZVBhdHRlcm4sCisJCQkJQ09OU19XSUQyKCJsaWZlbGluZSIsICJzdGF0ZSIpLCB0cnVlICkgPyAwIDogMTsKKworCQllcnJvciArPSBjb25maWd1cmVGb3JtYXR0ZXIodGhlRk9STUFULAorCQkJCW1NYWNoaW5lUGF0dGVybiwgIm1hY2hpbmUiICkgPyAwIDogMTsKKwkJZXJyb3IgKz0gY29uZmlndXJlRm9ybWF0dGVyKHRoZUZPUk1BVCwKKwkJCQltVHJhbnNpdGlvblBhdHRlcm4sICJ0cmFuc2l0aW9uIikgPyAwIDogMTsKKwkJZXJyb3IgKz0gY29uZmlndXJlRm9ybWF0dGVyKHRoZUZPUk1BVCwKKwkJCQltUm91dGluZVBhdHRlcm4sICJyb3V0aW5lIiApID8gMCA6IDE7CisJCWVycm9yICs9IGNvbmZpZ3VyZUZvcm1hdHRlcih0aGVGT1JNQVQsCisJCQkJbVZhcmlhYmxlUGF0dGVybiwgInZhcmlhYmxlIiApID8gMCA6IDE7CisJfQorLy8JZWxzZSAvLyBTdGFuZGFyZCBwcm9maWxlCisvLwl7CisvLwkJbUNvbnRleHROb2RlQ29sb3IgICA9IERFRkFVTFRfQ09OVEVYVF9OT0RFX0NPTE9SOworLy8JCW1Db250ZXh0Tm9kZVNoYXBlICAgPSBERUZBVUxUX0NPTlRFWFRfTk9ERV9TSEFQRTsKKy8vCQltQ29udGV4dE5vZGVTdHlsZSAgID0gREVGQVVMVF9DT05URVhUX05PREVfU1RZTEU7CisvLworLy8JCW1Db250ZXh0Tm9kZVNlcGFyYXRvciA9ICJcXG4iOworLy8KKy8vCQltSW5mb1BhdHRlcm4gPSBTVEFOREFSRF9JTkZPX1BBVFRFUk47CisvLwkJbUluZm9KdXN0aWZpY2F0aW9uID0gIiI7CisvLwkJbUluZm9TZXBhcmF0b3IgPSAiXFxuIjsKKy8vCX0KKworCW1TaG93Tm9kZUhlYWRlckZsYWcgPSAobm90IG1Db250ZXh0Tm9kZUhlYWRlclBhdHRlcm4uZW1wdHkoKSk7CisJbVNob3dOb2RlRGF0YUZsYWcgICA9IChub3QgbUNvbnRleHROb2RlRGF0YVBhdHRlcm4uZW1wdHkoKSk7CisJbVNob3dOb2RlSW5mb0ZsYWcgICA9IChub3QgbUNvbnRleHROb2RlSW5mb1BhdHRlcm4uZW1wdHkoKSk7CisKKwltQ29uZmlnRmxhZyA9ICAoZXJyb3IgPT0gMCkgJiYgbUNvbmZpZ0ZsYWc7CisKKwlyZXR1cm4oIG1Db25maWdGbGFnICk7Cit9CisKKworYm9vbCBHcmFwaFZpekV4ZWN1dGlvbkdyYXBoU2VyaWFsaXplcjo6Y29uZmlndXJlRm9ybWF0dGVyKFdPYmplY3QgKiBGT1JNQVQsCisJCXN0ZDo6c3RyaW5nICYgZm9ybWF0UGF0dGVybiwgY29uc3Qgc3RkOjpzdHJpbmcgJiBpZCwgYm9vbCBpc1JlZ2V4KQoreworCWZvcm1hdFBhdHRlcm4gPSBpc1JlZ2V4CisJCQk/IFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eVN0cmluZyhGT1JNQVQsIGlkLCBmb3JtYXRQYXR0ZXJuKQorCQkJOiBRdWVyeTo6Z2V0V1Byb3BlcnR5U3RyaW5nKEZPUk1BVCwgaWQsIGZvcm1hdFBhdHRlcm4pOworCisJU3RyaW5nVG9vbHM6OnJlcGxhY2VBbGwoZm9ybWF0UGF0dGVybiwgIlxcdCIgLCAiXHQiKTsKKwlTdHJpbmdUb29sczo6cmVwbGFjZUFsbChmb3JtYXRQYXR0ZXJuLCAiXFxuIiAsICJcbiIpOworCVN0cmluZ1Rvb2xzOjpyZXBsYWNlQWxsKGZvcm1hdFBhdHRlcm4sICJcXFwiIiwgIlwiIik7CisKKwl0cnkKKwl7CisJCWJvb3N0Ojpmb3JtYXQgZm9ybWF0dGVyKGZvcm1hdFBhdHRlcm4pOworCX0KKwljYXRjaChjb25zdCBib29zdDo6aW86OmJhZF9mb3JtYXRfc3RyaW5nICYgYmZzKQorCXsKKwkJUXVlcnk6OnJlcG9ydEVycm9yQXR0cmlidXRlKEZPUk1BVCwgaWQsIGJmcy53aGF0KCkpOworCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisKKy8qKgorICogUkVQT1JUIFRSQUNFCisgKi8KK3ZvaWQgR3JhcGhWaXpFeGVjdXRpb25HcmFwaFNlcmlhbGl6ZXI6OnJlcG9ydERlZmF1bHQoT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJQVZNX09TX1ZFUkJPU0lUWV9NRURJVU0oIG9zICkKKwkJCTw8IFRBQiA8PCAiR1JBUEhWSVogRVhFQ1VUSU9OIEdSQVBIIFNFUklBTElaRVI8ICIKKwkJCTw8IGdldFBhcmFtZXRlcldPYmplY3QoKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJPDwgIiA+IERPTkUgISEhIiAgPDwgRU9MX0ZMVVNIOworfQorCisKKy8qKgorICogRklMVEVSSU5HIEFQSQorICovCitib29sIEdyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyOjpwcmVmaWx0ZXIoKQoreworCXJldHVybiggdHJ1ZSApOworfQorCitib29sIEdyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyOjpwb3N0ZmlsdGVyKCkKK3sKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvKioKKyAqIFBPU1QtUFJPQ0VTU0lORyBBUEkKKyAqLworYm9vbCBHcmFwaFZpekV4ZWN1dGlvbkdyYXBoU2VyaWFsaXplcjo6cG9zdHByb2Nlc3MoKQoreworCWNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDID0gKiggZ2V0Q29uZmlndXJhdGlvbigpLmdldEZpcnN0VHJhY2UoKSApOworCisJYm9vbCBzYXZlRmxhZyA9IFN0cmluZzo6VVNFX0JBQ0tTTEFTSF9RVU9URTsKKwlTdHJpbmc6OlVTRV9CQUNLU0xBU0hfUVVPVEUgPSB0cnVlOworCisJYmVnaW5TdHJlYW0oKTsKKwl3aGlsZSggaGFzU3RyZWFtKCkgKQorCXsKKwkJZG90Rm9ybWF0KGN1cnJlbnRTdHJlYW0oKSwgYW5FQyk7CisJfQorCisJU3RyaW5nOjpVU0VfQkFDS1NMQVNIX1FVT1RFID0gc2F2ZUZsYWc7CisKKwljbG9zZVN0cmVhbSgpOworCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gREVGQVVMVCBGT1JNQVQgQVBJCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgR3JhcGhWaXpFeGVjdXRpb25HcmFwaFNlcmlhbGl6ZXI6OmZvcm1hdCgKKwkJU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyICYgYU1hbmFnZXIsCisJCU91dFN0cmVhbSAmIG91dCwgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIHJvb3RFQykKK3sKKwlBYnN0cmFjdFByb2Nlc3NvclVuaXQgKiBleGlzdGluZ1NlcmlhbGl6ZXIgPQorCQkJYU1hbmFnZXIuZ2V0Q29udHJvbGxlclVuaXQoCisJCQkJCUdyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyOjpBVVRPX1JFR0lTVEVSX1RPT0wpOworCisJaWYoIGV4aXN0aW5nU2VyaWFsaXplciAhPSBOVUxMICkKKwl7CisJCUdyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyIGd2U2VyaWFsaXplcigKKwkJCQlhTWFuYWdlciwgZXhpc3RpbmdTZXJpYWxpemVyLT5nZXRQYXJhbWV0ZXJXT2JqZWN0KCkpOworCisJCWlmKCBndlNlcmlhbGl6ZXIuY29uZmlndXJlSW1wbCgpICkKKwkJeworCQkJZ3ZTZXJpYWxpemVyLmRvdEZvcm1hdChvdXQsIHJvb3RFQyk7CisKKwkJCXJldHVybjsKKwkJfQorCX0KKwllbHNlCisJeworCQlHcmFwaFZpekV4ZWN1dGlvbkdyYXBoU2VyaWFsaXplciBndlNlcmlhbGl6ZXIoYU1hbmFnZXIsIFdPYmplY3Q6Ol9OVUxMXyk7CisKKwkJaWYoIGd2U2VyaWFsaXplci5jb25maWd1cmVJbXBsKCkgKQorCQl7CisJCQlndlNlcmlhbGl6ZXIuZG90Rm9ybWF0KG91dCwgcm9vdEVDKTsKKworCQkJcmV0dXJuOworCQl9CisJfQorCisJb3V0IDw8ICJkaWdyYXBoIGZzY24geyIgPDwgc3RkOjplbmRsCisJCTw8ICJFUlJPUiBbICIgPDwgc3RkOjplbmRsCisJCTw8ICJcdGxhYmVsPVwiIgorCQk8PCAiVW5mb3VuZCxcbiIKKwkJCSJpbiB0aGUgY3VycmVudCBTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXIsXFxuIgorCQkJImFuIGV4aXN0aW5nIEdyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyXFxuIgorCQkJIndoaWNoIGNvbmZpZ3VyYXRpb24gY291bGQgYmUgdXNlZFxuIgorCQkJInRvIGNvbmZpZ3VyZSB0aGUgZGVmYXVsdCBHcmFwaFZpeidzIHNlcmlhbGl6ZXIhXCIiCisJCTw8IHN0ZDo6ZW5kbAorCQk8PCAiXHRzaGFwZT10cmlwbGVvY3RhZ29uIiA8PCBzdGQ6OmVuZGwKKwkJPDwgIlx0Y29sb3I9cmVkIiA8PCBzdGQ6OmVuZGwKKwkJPDwgIlx0c3R5bGU9ZmlsbGVkIiAgPDwgc3RkOjplbmRsCisJCTw8ICJdIiA8PCBzdGQ6OmVuZGwKKwkJPDwgIn0iIDw8IHN0ZDo6ZW5kbDsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRk9STUFUIEFQSQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBHcmFwaFZpekV4ZWN1dGlvbkdyYXBoU2VyaWFsaXplcjo6ZG90Rm9ybWF0KAorCQlPdXRTdHJlYW0gJiBvcywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIHJvb3RFQykKK3sKKwlvcy5zZXRTeW1iZXhWYWx1ZUNTUyhtTXVsdGlWYWx1ZUFycmF5Q1NTLAorCQkJbU11bHRpVmFsdWVQYXJhbXNDU1MsIG1NdWx0aVZhbHVlU3RydWN0Q1NTKTsKKworCWRvRm9ybWF0SGVhZGVyKCBvcyApOworCisJbURvdEZvcm1hdE5vZGVXYWl0aW5nUXVldWUucHVzaF9iYWNrKCAmIHJvb3RFQyApOworCisJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAqIGl0RUMgPSBOVUxMOworCXdoaWxlKCBtRG90Rm9ybWF0Tm9kZVdhaXRpbmdRdWV1ZS5ub25lbXB0eSgpICkKKwl7CisJCW1Eb3RGb3JtYXROb2RlV2FpdGluZ1F1ZXVlLnBvcF9maXJzdF90byggaXRFQyApOworCisJCWRvdEZvcm1hdE5vZGUob3MsICgqIGl0RUMpKTsKKwl9CisKKwlkb0Zvcm1hdEVuZCggb3MgKTsKKworCW9zLnJlc3RvcmVTeW1iZXhWYWx1ZUNTUygpOworfQorCisvKioKKyAqIEdMT0JBTCBIRUFERVIKKyAqICUxJSAtLT4gZ3JhcGggbmFtZS1pZAorICovCit2b2lkIEdyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyOjpkb0Zvcm1hdEhlYWRlcihPdXRTdHJlYW0gJiBvcykKK3sKKwlib29zdDo6Zm9ybWF0IGZvcm1hdHRlcihtR2xvYmFsSGVhZGVyUGF0dGVybik7CisJZm9ybWF0dGVyLmV4Y2VwdGlvbnMoIGJvb3N0Ojppbzo6bm9fZXJyb3JfYml0cyApOworCisJb3MgPDwgZm9ybWF0dGVyCisJCQklICJmc2NuIjsKK30KKworLyoqCisgKiBHTE9CQUwgRU5ECisgKiAlMSUgLS0+IGdyYXBoIG5hbWUjaWQKKyAqLwordm9pZCBHcmFwaFZpekV4ZWN1dGlvbkdyYXBoU2VyaWFsaXplcjo6ZG9Gb3JtYXRFbmQoT3V0U3RyZWFtICYgb3MpCit7CisJYm9vc3Q6OmZvcm1hdCBmb3JtYXR0ZXIobUdsb2JhbEVuZFBhdHRlcm4pOworCWZvcm1hdHRlci5leGNlcHRpb25zKCBib29zdDo6aW86Om5vX2Vycm9yX2JpdHMgKTsKKworCW9zIDw8IGZvcm1hdHRlcgorCQkJJSAiZnNjbiI7Cit9CisKKworLyoqCisgKiBFWEVDVVRJT04gQ09OVEVYVCBOT0RFCisgKiAlMSUgLS0+IG5vZGUjaWQKKyAqICUyJSAtLT4gbm9kZSNsYWJlbAorICogJTMlIC0tPiBub2RlI2NzcworICogJTQlIC0tPiBub2RlI2RhdGEKKyAqICU1JSAtLT4gbm9kZSNpbmZvCisgKiAlNiUgLS0+IG5vZGUjZmlyZWQKKyAqICU3JSAtLT4gbm9kZSN0cmFjZQorICovCit2b2lkIEdyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyOjpkb3RGb3JtYXROb2RlKAorCQlPdXRTdHJlYW0gJiBvcywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpCit7CisJU3RyaW5nT3V0U3RyZWFtIGVjTGFiZWw7CisJU3RyaW5nT3V0U3RyZWFtIGVjQ1NTOworCisJU3RyaW5nT3V0U3RyZWFtIGVjSGVhZGVyOworCVN0cmluZ091dFN0cmVhbSBlY0RhdGE7CisJU3RyaW5nT3V0U3RyZWFtIGVjSW5mbzsKKwlTdHJpbmdPdXRTdHJlYW0gZWNGaXJlZDsKKwlTdHJpbmdPdXRTdHJlYW0gZWNUcmFjZTsKKworCWlmKCBtU2hvd05vZGVIZWFkZXJGbGFnICkKKwl7CisJCWRvdEZvcm1hdE5vZGVIZWFkZXIoZWNIZWFkZXIsIGFuRUMpOworCX0KKwlpZiggbVNob3dOb2RlRGF0YUZsYWcgKQorCXsKKwkJZG90Rm9ybWF0Tm9kZURhdGEoZWNEYXRhLCBhbkVDKTsKKwl9CisJaWYoIG1TaG93Tm9kZUluZm9GbGFnICkKKwl7CisJCWRvdEZvcm1hdE5vZGVJbmZvKGVjSW5mbywgYW5FQyk7CisJfQorCWlmKCBtVHJhY2VGaWx0ZXIuaGFzUnVubmFibGVQb2ludCgpICkKKwl7CisJCWRvdEZvcm1hdE5vZGVSdW5uYWJsZVRyYWNlKGVjRmlyZWQsIGFuRUMpOworCX0KKwlpZiggbVRyYWNlRmlsdGVyLmhhc0lPVHJhY2VQb2ludCgpICkKKwl7CisJCWRvdEZvcm1hdE5vZGVJT1RyYWNlKGVjRmlyZWQsIGFuRUMpOworCX0KKworCS8qCisJICogRVhFQ1VUSU9OIENPTlRFWFQgTk9ERSBMQUJFTAorCSAqICUxJSAtLT4gbm9kZSNpZAorCSAqICUyJSAtLT4gbm9kZSNoZWFkZXIKKwkgKiAlMyUgLS0+IG5vZGUjZGF0YQorCSAqICU0JSAtLT4gbm9kZSNpbmZvCisJICogJTUlIC0tPiBub2RlI2ZpcmVkCisJICogJTYlIC0tPiBub2RlI3RyYWNlCisJICovCisJYm9vc3Q6OmZvcm1hdCBmb3JtYXR0ZXJMYWJlbChtQ29udGV4dE5vZGVMYWJlbFBhdHRlcm4pOworCWZvcm1hdHRlckxhYmVsLmV4Y2VwdGlvbnMoIGJvb3N0Ojppbzo6bm9fZXJyb3JfYml0cyApOworCisJZWNMYWJlbCA8PCBmb3JtYXR0ZXJMYWJlbAorCQkJCSUgYW5FQy5nZXRJZE51bWJlcigpCisJCQkJJSBlY0hlYWRlci5zdHIoKQorCQkJCSUgZWNEYXRhLnN0cigpCisJCQkJJSBlY0luZm8uc3RyKCkKKwkJCQklIGVjRmlyZWQuc3RyKCkKKwkJCQklIGVjVHJhY2Uuc3RyKCk7CisKKwkvKgorCSAqIEVYRUNVVElPTiBDT05URVhUIE5PREUgQ1NTCisJICogJTElIC0tPiBub2RlI2lkCisJICogJTIlIC0tPiBub2RlI2NvbG9yCisJICogJTMlIC0tPiBub2RlI3NoYXBlCisJICogJTQlIC0tPiBub2RlI3N0eWxlCisJICovCisJYm9vc3Q6OmZvcm1hdCBmb3JtYXR0ZXJDU1MobUNvbnRleHROb2RlQ3NzUGF0dGVybik7CisJZm9ybWF0dGVyQ1NTLmV4Y2VwdGlvbnMoIGJvb3N0Ojppbzo6bm9fZXJyb3JfYml0cyApOworCisJZWNDU1MgPDwgZm9ybWF0dGVyQ1NTCisJCQklIGFuRUMuZ2V0SWROdW1iZXIoKQorCQkJJSBkb3ROb2RlQ29sb3IoIGFuRUMgKQorCQkJJSBkb3ROb2RlU2hhcGUoIGFuRUMgKQorCQkJJSBkb3ROb2RlU3R5bGUoIGFuRUMgKTsKKworCS8qCisJICogRVhFQ1VUSU9OIENPTlRFWFQgTk9ERQorCSAqICUxJSAtLT4gbm9kZSNpZAorCSAqICUyJSAtLT4gbm9kZSNsYWJlbAorCSAqICUzJSAtLT4gbm9kZSNjc3MKKwkgKiAlNCUgLS0+IG5vZGUjZGF0YQorCSAqICU1JSAtLT4gbm9kZSNpbmZvCisJICogJTYlIC0tPiBub2RlI2ZpcmVkCisJICogJTclIC0tPiBub2RlI3RyYWNlCisJICovCisJYm9vc3Q6OmZvcm1hdCBmb3JtYXR0ZXIobUNvbnRleHROb2RlUGF0dGVybik7CisJZm9ybWF0dGVyLmV4Y2VwdGlvbnMoIGJvb3N0Ojppbzo6bm9fZXJyb3JfYml0cyApOworCisJb3MgPDwgZm9ybWF0dGVyCisJCQklIGFuRUMuZ2V0SWROdW1iZXIoKQorCQkJJSBlY0xhYmVsLnN0cigpCisJCQklIGVjQ1NTLnN0cigpCisJCQklIGVjRGF0YS5zdHIoKQorCQkJJSBlY0luZm8uc3RyKCkKKwkJCSUgZWNGaXJlZC5zdHIoKQorCQkJJSBlY1RyYWNlLnN0cigpOworCisJRXhlY3V0aW9uQ29udGV4dDo6Y2hpbGRfaXRlcmF0b3IgaXRFQyA9IGFuRUMuYmVnaW4oKTsKKwlFeGVjdXRpb25Db250ZXh0OjpjaGlsZF9pdGVyYXRvciBlbmRFQyA9IGFuRUMuZW5kKCk7CisJZm9yKCA7IGl0RUMgIT0gZW5kRUMgOyArK2l0RUMgKQorCXsKKwkJZG90Rm9ybWF0RWRnZShvcywgYW5FQywgKigqaXRFQykpOworCisJCW1Eb3RGb3JtYXROb2RlV2FpdGluZ1F1ZXVlLnB1c2hfYmFjayggKml0RUMgKTsKKwl9Cit9CisKKworc3RkOjpzdHJpbmcgR3JhcGhWaXpFeGVjdXRpb25HcmFwaFNlcmlhbGl6ZXI6OmRvdE5vZGVDb2xvcigKKwkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpCit7CisJY29uc3QgRXhlY3V0aW9uQ29udGV4dEZsYWdzICYgZmxhZ3MgPSBhbkVDLmdldEZsYWdzKCk7CisKKwlpZiggZmxhZ3MuaGFzT2JqZWN0aXZlQWNoaWV2ZWQoKSApCisJeworCQlyZXR1cm4oIE9CSkVDVElWRV9BQ0hJRVZFRF9DT05URVhUX05PREVfQ09MT1IgKTsKKwl9CisJaWYoIGZsYWdzLmhhc09iamVjdGl2ZUZhaWxlZCgpICkKKwl7CisJCXJldHVybiggT0JKRUNUSVZFX0ZBSUxFRF9DT05URVhUX05PREVfQ09MT1IgKTsKKwl9CisJaWYoIGZsYWdzLmhhc09iamVjdGl2ZUFib3J0ZWQoKSApCisJeworCQlyZXR1cm4oIE9CSkVDVElWRV9BQk9SVEVEX0NPTlRFWFRfTk9ERV9DT0xPUiApOworCX0KKworCWlmKCBmbGFncy5oYXNFcnJvcigpICkKKwl7CisJCXJldHVybiggRVJST1JfQ09OVEVYVF9OT0RFX0NPTE9SICk7CisJfQorCisJaWYoIGZsYWdzLmhhc0FsZXJ0KCkgKQorCXsKKwkJcmV0dXJuKCBBTEVSVF9DT05URVhUX05PREVfQ09MT1IgKTsKKwl9CisKKwlpZiggZmxhZ3MuaGFzV2FybmluZygpICkKKwl7CisJCXJldHVybiggV0FSTklOR19DT05URVhUX05PREVfQ09MT1IgKTsKKwl9CisKKwlpZiggZmxhZ3MuaGFzUmVkdW5kYW5jeSgpICkKKwl7CisJCXJldHVybiggUkVEVU5EQU5DWV9DT05URVhUX05PREVfQ09MT1IgKTsKKwl9CisKKwlpZiggZmxhZ3MuaGFzUmVkdW5kYW5jeVRhcmdldCgpICkKKwl7CisJCXJldHVybiggUkVEVU5EQU5DWV9UQVJHRVRfQ09OVEVYVF9OT0RFX0NPTE9SICk7CisJfQorCisJaWYoIGZsYWdzLmhhc0NvdmVyYWdlRWxlbWVudCgpIC8qJiYgYW5FQy5oYXNJbmZvKCkqLyApCisJeworCQlyZXR1cm4oIENPVkVSQUdFX0VMRU1FTlRfQ09OVEVYVF9OT0RFX0NPTE9SICk7CisJfQorCisJcmV0dXJuKCBtQ29udGV4dE5vZGVDb2xvciApOworfQorCitzdGQ6OnN0cmluZyBHcmFwaFZpekV4ZWN1dGlvbkdyYXBoU2VyaWFsaXplcjo6ZG90Tm9kZVNoYXBlKAorCQljb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQykKK3sKKwljb25zdCBFeGVjdXRpb25Db250ZXh0RmxhZ3MgJiBmbGFncyA9IGFuRUMuZ2V0RmxhZ3MoKTsKKworCWlmKCBmbGFncy5oYXNPYmplY3RpdmVBY2hpZXZlZCgpICkKKwl7CisJCXJldHVybiggT0JKRUNUSVZFX0FDSElFVkVEX0NPTlRFWFRfTk9ERV9TSEFQRSApOworCX0KKwlpZiggZmxhZ3MuaGFzT2JqZWN0aXZlRmFpbGVkKCkgKQorCXsKKwkJcmV0dXJuKCBPQkpFQ1RJVkVfRkFJTEVEX0NPTlRFWFRfTk9ERV9TSEFQRSApOworCX0KKwlpZiggZmxhZ3MuaGFzT2JqZWN0aXZlQWJvcnRlZCgpICkKKwl7CisJCXJldHVybiggT0JKRUNUSVZFX0FCT1JURURfQ09OVEVYVF9OT0RFX1NIQVBFICk7CisJfQorCisJaWYoIGZsYWdzLmlzRXhlY3V0aW9uU3RhdGVtZW50RXhpdFRyYWNlKCkgKQorCXsKKwkJcmV0dXJuKCBTVEFURU1FTlRfRVhJVF9DT05URVhUX05PREVfU0hBUEUgKTsKKwl9CisKKwlpZiggZmxhZ3MuaGFzUmVkdW5kYW5jeSgpICkKKwl7CisJCXJldHVybiggUkVEVU5EQU5DWV9DT05URVhUX05PREVfU0hBUEUgKTsKKwl9CisKKwlpZiggZmxhZ3MuaGFzUmVkdW5kYW5jeVRhcmdldCgpICkKKwl7CisJCXJldHVybiggUkVEVU5EQU5DWV9UQVJHRVRfQ09OVEVYVF9OT0RFX1NIQVBFICk7CisJfQorCisJcmV0dXJuKCBtQ29udGV4dE5vZGVTaGFwZSApOworfQorCitzdGQ6OnN0cmluZyBHcmFwaFZpekV4ZWN1dGlvbkdyYXBoU2VyaWFsaXplcjo6ZG90Tm9kZVN0eWxlKAorCQljb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQykKK3sKKwlyZXR1cm4oIG1Db250ZXh0Tm9kZVN0eWxlICk7Cit9CisKKworLyoqCisgKiBFWEVDVVRJT04gQ09OVEVYVCBFREdFCisgKiAlMSUgLS0+IG5vZGUjc291cmNlI2lkCisgKiAlMiUgLS0+IG5vZGUjdGFyZ2V0I2lkCisgKiAlMyUgLS0+IG5vZGUjdGFyZ2V0I2RhdGEKKyAqICU0JSAtLT4gbm9kZSN0YXJnZXQjaW5mbworICogJTUlIC0tPiBub2RlI3RhcmdldCNmaXJlZAorICogJTYlIC0tPiBub2RlI3RhcmdldCN0cmFjZQorICovCit2b2lkIEdyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyOjpkb3RGb3JtYXRJbmZvKAorCQlPdXRTdHJlYW0gJiBvcywgR2VuZXJpY0luZm9EYXRhICogYW5JbmZvKQoreworCXN0ZDo6c3RyaW5nIHN0ckluZm8gPSBhbkluZm8tPnN0ckRhdGEoKTsKKwlpZiggbm90IHN0ckluZm8uZW1wdHkoKSApCisJeworCQlib29zdDo6Zm9ybWF0IGZvcm1hdHRlcihtSW5mb1BhdHRlcm4pOworCQlmb3JtYXR0ZXIuZXhjZXB0aW9ucyggYm9vc3Q6OmlvOjpub19lcnJvcl9iaXRzICk7CisKKwkJb3MgPDwgZm9ybWF0dGVyCisJCQkJJSBhbkluZm8tPnN0clVJRCgpCisJCQkJJSBzdHJJbmZvCisJCQkJPDwgbUluZm9KdXN0aWZpY2F0aW9uOworCX0KK30KKworCisKK3ZvaWQgR3JhcGhWaXpFeGVjdXRpb25HcmFwaFNlcmlhbGl6ZXI6OmRvdEZvcm1hdEVkZ2UoT3V0U3RyZWFtICYgb3MsCisJCWNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBzcmNFQywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIHRndEVDKQoreworCVN0cmluZ091dFN0cmVhbSBlY0RhdGE7CisJU3RyaW5nT3V0U3RyZWFtIGVjSW5mbzsKKwlTdHJpbmdPdXRTdHJlYW0gZWNGaXJlZDsKKwlTdHJpbmdPdXRTdHJlYW0gZWNUcmFjZTsKKworCWlmKCBtU2hvd05vZGVEYXRhRmxhZyApCisJeworCQlkb3RGb3JtYXROb2RlRGF0YShlY0RhdGEsIHRndEVDKTsKKwl9CisJaWYoIG1TaG93Tm9kZUluZm9GbGFnICkKKwl7CisJCWRvdEZvcm1hdE5vZGVJbmZvKGVjSW5mbywgdGd0RUMpOworCX0KKwlpZiggbVRyYWNlRmlsdGVyLmhhc1J1bm5hYmxlUG9pbnQoKSApCisJeworCQlkb3RGb3JtYXROb2RlUnVubmFibGVUcmFjZShlY0ZpcmVkLCB0Z3RFQyk7CisJfQorCWlmKCBtVHJhY2VGaWx0ZXIuaGFzSU9UcmFjZVBvaW50KCkgKQorCXsKKwkJZG90Rm9ybWF0Tm9kZUlPVHJhY2UoZWNGaXJlZCwgdGd0RUMpOworCX0KKworCWJvb3N0Ojpmb3JtYXQgZm9ybWF0dGVyKG1Db250ZXh0RWRnZVBhdHRlcm4pOworCWZvcm1hdHRlci5leGNlcHRpb25zKCBib29zdDo6aW86Om5vX2Vycm9yX2JpdHMgKTsKKworCW9zIDw8IGZvcm1hdHRlcgorCQkJJSBzcmNFQy5nZXRJZE51bWJlcigpCisJCQklIHRndEVDLmdldElkTnVtYmVyKCkKKwkJCSUgZWNEYXRhLnN0cigpCisJCQklIGVjSW5mby5zdHIoKQorCQkJJSBlY0ZpcmVkLnN0cigpCisJCQklIGVjVHJhY2Uuc3RyKCk7Cit9CisKKworLyoqCisgKiBFWEVDVVRJT04gQ09OVEVYVCBIRUFERVIKKyAqICUxJSAtLT4gZWMjaWQKKyAqICUyJSAtLT4gZWMjZXZhbAorICogJTMlIC0tPiBlYyNoaWdodAorICogJTQlIC0tPiBlYyN3aWR0aAorICogJTUlIC0tPiBlYyN3ZWlnaHQKKyAqICU2JSAtLT4gc3RhdGVtYWNoaW5lIGNvbmZpZ3VyYXRpb24gaS5lLiBsaWZlbGluZXMgc3RhdGUgaWRlbnRpZmllcgorICovCit2b2lkIEdyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyOjpkb3RGb3JtYXROb2RlSGVhZGVyKAorCQlPdXRTdHJlYW0gJiBvcywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpCit7CisJYm9vc3Q6OmZvcm1hdCBmb3JtYXR0ZXIobUNvbnRleHROb2RlSGVhZGVyUGF0dGVybik7CisJZm9ybWF0dGVyLmV4Y2VwdGlvbnMoIGJvb3N0Ojppbzo6bm9fZXJyb3JfYml0cyApOworCisJb3MgPDwgZm9ybWF0dGVyCisJCQklIGFuRUMuZ2V0SWROdW1iZXIoKQorCQkJJSBhbkVDLmdldEV2YWxOdW1iZXIoKQorCQkJJSBhbkVDLmdldEhlaWdodCgpCisJCQklIGFuRUMuZ2V0V2lkdGgoKQorCQkJJSBhbkVDLmdldFdlaWdodCgpCisJCQklIGFuRUMucmVmRXhlY3V0aW9uRGF0YSgpLnN0clN0YXRlQ29uZihtTGlmZWxpbmVTdGF0ZVBhdHRlcm4pOworCisJaWYoIGFuRUMuZ2V0RmxhZ3MoKS5oYXNSZWFjaGVkTGltaXRPckV4ZWN1dGlvblRyYWNlKCkgKQorCXsKKwkJb3MgPDwgIlxcbiIgPDwgYW5FQy5nZXRGbGFncygpLnN0cigpOworCX0KK30KKworLyoqCisgKiBFWEVDVVRJT04gREFUQQorICogJTElIC0tPiBlYyNpZAorICogJTIlIC0tPiBlYyNhc3NpZ24KKyAqICUzJSAtLT4gZWMjcGF0aCNjb25kaXRpb24KKyAqICU0JSAtLT4gZWMjcGF0aCN0aW1lZCNjb25kaXRpb24KKyAqICU1JSAtLT4gZWMjbm9kZSNjb25kaXRpb24KKyAqICU2JSAtLT4gZWMjbm9kZSN0aW1lZCNjb25kaXRpb24KKyAqLwordm9pZCBHcmFwaFZpekV4ZWN1dGlvbkdyYXBoU2VyaWFsaXplcjo6ZG90Rm9ybWF0Tm9kZURhdGEoCisJCU91dFN0cmVhbSAmIG9zLCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQykKK3sKKwlTdHJpbmdPdXRTdHJlYW0gZWRBc3NpZ247CisJU3RyaW5nT3V0U3RyZWFtIGVkUEM7CisJU3RyaW5nT3V0U3RyZWFtIGVkUHRDOworCVN0cmluZ091dFN0cmVhbSBlZEZDOworCVN0cmluZ091dFN0cmVhbSBlZEZ0QzsKKworCWJvb2wgaGFzRGF0YSA9IGZhbHNlOworCisJY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQgPSBhbkVDLnJlZkV4ZWN1dGlvbkRhdGEoKTsKKworCWlmKCBtVHJhY2VGaWx0ZXIuaGFzUGF0aENvbmRpdGlvblBvaW50KCkKKwkJJiYgKG5vdCBhbkVELmdldFBhdGhDb25kaXRpb24oKS5pc0VxdWFsVHJ1ZSgpKSApCisJeworCQlkb3RGb3JtYXRDb25kaXRpb24oZWRQQywgbVBhdGhDb25kaXRpb25QYXR0ZXJuLAorCQkJCWFuRUQuZ2V0UGF0aENvbmRpdGlvbigpICk7CisKKwkJaGFzRGF0YSA9IHRydWU7CisJfQorCWVsc2UgaWYoIG1UcmFjZUZpbHRlci5oYXNQYXRoQ29uZGl0aW9uTGVhZk5vZGVQb2ludCgpCisJCQkmJiBhbkVDLmlzTGVhZk5vZGUoKQorCQkJJiYgKG5vdCBhbkVELmdldFBhdGhDb25kaXRpb24oKS5pc0VxdWFsVHJ1ZSgpKSApCisJeworCQlkb3RGb3JtYXRDb25kaXRpb24oZWRQQywgbVBhdGhDb25kaXRpb25QYXR0ZXJuLAorCQkJCWFuRUQuZ2V0UGF0aENvbmRpdGlvbigpICk7CisKKwkJaGFzRGF0YSA9IHRydWU7CisJfQorCisJaWYoIG1UcmFjZUZpbHRlci5oYXNQYXRoVGltZWRDb25kaXRpb25Qb2ludCgpCisJCSYmIChub3QgYW5FRC5nZXRQYXRoVGltZWRDb25kaXRpb24oKS5pc0VxdWFsVHJ1ZSgpKSApCisJeworCQlkb3RGb3JtYXRDb25kaXRpb24oZWRQdEMsIG1QYXRoVGltZWRDb25kaXRpb25QYXR0ZXJuLAorCQkJCWFuRUQuZ2V0UGF0aFRpbWVkQ29uZGl0aW9uKCkgKTsKKworCQloYXNEYXRhID0gdHJ1ZTsKKwl9CisJZWxzZSBpZiggbVRyYWNlRmlsdGVyLmhhc1BhdGhUaW1lZENvbmRpdGlvbkxlYWZOb2RlUG9pbnQoKQorCQkJJiYgYW5FQy5pc0xlYWZOb2RlKCkKKwkJCSYmIChub3QgYW5FRC5nZXRQYXRoVGltZWRDb25kaXRpb24oKS5pc0VxdWFsVHJ1ZSgpKSApCisJeworCQlkb3RGb3JtYXRDb25kaXRpb24oZWRQdEMsIG1QYXRoVGltZWRDb25kaXRpb25QYXR0ZXJuLAorCQkJCWFuRUQuZ2V0UGF0aFRpbWVkQ29uZGl0aW9uKCkgKTsKKworCQloYXNEYXRhID0gdHJ1ZTsKKwl9CisKKwlpZiggbVRyYWNlRmlsdGVyLmhhc05vZGVDb25kaXRpb25Qb2ludCgpCisJCSYmIChub3QgYW5FRC5nZXROb2RlQ29uZGl0aW9uKCkuaXNFcXVhbFRydWUoKSkgKQorCXsKKwkJZG90Rm9ybWF0Q29uZGl0aW9uKGVkRkMsIG1Ob2RlQ29uZGl0aW9uUGF0dGVybiwKKwkJCQlhbkVELmdldE5vZGVDb25kaXRpb24oKSApOworCisJCWhhc0RhdGEgPSB0cnVlOworCX0KKwlpZiggbVRyYWNlRmlsdGVyLmhhc05vZGVUaW1lZENvbmRpdGlvblBvaW50KCkKKwkJJiYgKG5vdCBhbkVELmdldE5vZGVUaW1lZENvbmRpdGlvbigpLmlzRXF1YWxUcnVlKCkpICkKKwl7CisJCWRvdEZvcm1hdENvbmRpdGlvbihlZEZ0QywgbU5vZGVUaW1lZENvbmRpdGlvblBhdHRlcm4sCisJCQkJYW5FRC5nZXROb2RlVGltZWRDb25kaXRpb24oKSApOworCisJCWhhc0RhdGEgPSB0cnVlOworCX0KKworCWlmKCBtVHJhY2VGaWx0ZXIuaGFzQXNzaWduUG9pbnQoKSApCisJeworCQlkb3RGb3JtYXRBc3NpZ24oZWRBc3NpZ24sIGFuRUQsIGFuRUMuaXNub3RSb290KCkpOworCisJCWhhc0RhdGEgPSBoYXNEYXRhIHx8IChub3QgZWRBc3NpZ24uc3RyKCkuZW1wdHkoKSk7CisJfQorCisKKwlpZiggaGFzRGF0YSApCisJeworCQlib29zdDo6Zm9ybWF0IGZvcm1hdHRlcihtQ29udGV4dE5vZGVEYXRhUGF0dGVybik7CisJCWZvcm1hdHRlci5leGNlcHRpb25zKCBib29zdDo6aW86Om5vX2Vycm9yX2JpdHMgKTsKKworCQlvcyA8PCBmb3JtYXR0ZXIKKwkJCQklIGFuRUMuZ2V0SWROdW1iZXIoKQorCQkJCSUgZWRBc3NpZ24uc3RyKCkKKwkJCQklIGVkUEMuc3RyKCkKKwkJCQklIGVkUHRDLnN0cigpCisJCQkJJSBlZEZDLnN0cigpCisJCQkJJSBlZEZ0Qy5zdHIoKTsKKwl9Cit9CisKKy8qKgorICogRVhFQ1VUSU9OIENPTlRFWFQgSU5GTworICogJTElIC0tPiBub2RlI2lkCisgKiAlMiUgLS0+IGV4ZWN1dGlvbiBpbmZvCisgKi8KK3ZvaWQgR3JhcGhWaXpFeGVjdXRpb25HcmFwaFNlcmlhbGl6ZXI6OmRvdEZvcm1hdE5vZGVJbmZvKAorCQlPdXRTdHJlYW0gJiBvcywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpCit7CisJaWYoIGFuRUMuaGFzSW5mbygpICkKKwl7CisJCVN0cmluZ091dFN0cmVhbSBlY0luZm87CisKKwkJQkZMaXN0Ojpjb25zdF9yYXdfaXRlcmF0b3I8CisJCQkJR2VuZXJpY0luZm9EYXRhID4gaXRJbmZvID0gYW5FQy5nZXRJbmZvcygpLmJlZ2luKCk7CisJCUJGTGlzdDo6Y29uc3RfcmF3X2l0ZXJhdG9yPAorCQkJCUdlbmVyaWNJbmZvRGF0YSA+IGVuZEluZm8gPSBhbkVDLmdldEluZm9zKCkuZW5kKCk7CisJCWRvdEZvcm1hdEluZm8oZWNJbmZvLCBpdEluZm8pOworCQlmb3IoICsraXRJbmZvIDsgaXRJbmZvICE9IGVuZEluZm8gOyArK2l0SW5mbyApCisJCXsKKwkJCWVjSW5mbyA8PCBtSW5mb1NlcGFyYXRvcjsKKwkJCWRvdEZvcm1hdEluZm8oZWNJbmZvLCBpdEluZm8pOworCQl9CisKKwkJc3RkOjpzdHJpbmcgc3RySW5mbyA9IGVjSW5mby5zdHIoKTsKKwkJaWYoIG5vdCBzdHJJbmZvLmVtcHR5KCkgKQorCQl7CisJCQlib29zdDo6Zm9ybWF0IGZvcm1hdHRlcihtQ29udGV4dE5vZGVJbmZvUGF0dGVybik7CisJCQlmb3JtYXR0ZXIuZXhjZXB0aW9ucyggYm9vc3Q6OmlvOjpub19lcnJvcl9iaXRzICk7CisKKwkJCW9zIDw8IGZvcm1hdHRlcgorCQkJCQklIGFuRUMuZ2V0SWROdW1iZXIoKQorCQkJCQklIHN0ckluZm87CisJCX0KKwl9Cit9CisKKworLyoqCisgKiBJTkZPCisgKiAlMSUgLS0+IGluZm8gaWQKKyAqICUyJSAtLT4gaW5mbyBkYXRhCisgKi8KKy8qKgorICogRVhFQ1VUSU9OIENPTlRFWFQgSU5GTworICogJTElIC0tPiBub2RlI2lkCisgKiAlMiUgLS0+IGV4ZWN1dGlvbiBmaXJlZAorICovCit2b2lkIEdyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyOjpkb3RGb3JtYXROb2RlUnVubmFibGVUcmFjZSgKKwkJT3V0U3RyZWFtICYgb3MsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKQoreworCWlmKCBhbkVDLmhhc1J1bm5hYmxlRWxlbWVudFRyYWNlKCkgKQorCXsKKwkJU3RyaW5nT3V0U3RyZWFtIGVjRmlyZWQ7CisJCWRvdEZvcm1hdFJ1bm5hYmxlVHJhY2UoZWNGaXJlZCwgYW5FQy5nZXRSdW5uYWJsZUVsZW1lbnRUcmFjZSgpKTsKKworCQlzdGQ6OnN0cmluZyBzdHJGaXJlZCA9IGVjRmlyZWQuc3RyKCk7CisKKwkJaWYoIG5vdCBzdHJGaXJlZC5lbXB0eSgpICkKKwkJeworCQkJYm9vc3Q6OmZvcm1hdCBmb3JtYXR0ZXIobUNvbnRleHROb2RlRmlyZWRQYXR0ZXJuKTsKKwkJCWZvcm1hdHRlci5leGNlcHRpb25zKCBib29zdDo6aW86Om5vX2Vycm9yX2JpdHMgKTsKKworCQkJb3MgPDwgZm9ybWF0dGVyCisJCQkJCSUgYW5FQy5nZXRJZE51bWJlcigpCisJCQkJCSUgc3RyRmlyZWQ7CisJCX0KKwl9Cit9CisKKy8qKgorICogRklSRUQKKyAqIHJ1bm5pbmcgbWFjaGluZQorICogZmlyZWQgdHJhbnNpdGlvbgorICogaW52b2tlZCByb3V0aW5lCisgKi8KK3ZvaWQgR3JhcGhWaXpFeGVjdXRpb25HcmFwaFNlcmlhbGl6ZXI6OmRvdEZvcm1hdFJ1bm5hYmxlVHJhY2UoCisJCU91dFN0cmVhbSAmIG9zLCBjb25zdCBCRiAmIGFGaXJlZCkKK3sKKwlpZiggYUZpcmVkLmlzPCBFeGVjdXRpb25Db25maWd1cmF0aW9uID4oKSApCisJeworCQlFeGVjdXRpb25Db25maWd1cmF0aW9uICogYUNvbmYgPQorCQkJCWFGaXJlZC50b19wdHI8IEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24gPigpOworCisJCWlmKCBhQ29uZi0+aXNUcmFuc2l0aW9uKCkgKQorCQl7CisJCQlkb3RGb3JtYXRUcmFuc2l0aW9uKG9zLAorCQkJCQlhQ29uZi0+Z2V0UnVudGltZUlEKCksIGFDb25mLT5nZXRUcmFuc2l0aW9uKCkpOworCQl9CisJCWVsc2UgaWYoIGFDb25mLT5pc09wZXJhdG9yKCkgJiYKKwkJCQlhQ29uZi0+Z2V0T3BlcmF0b3IoKS0+aXNPcENvZGUoIEFWTV9PUENPREVfUlVOICkgKQorCQl7CisJCQlkb3RGb3JtYXRNYWNoaW5lKG9zLCBhQ29uZi0+Z2V0UnVudGltZUlEKCkpOworCQl9CisJfQorCWVsc2UgaWYoIGFGaXJlZC5pczwgQXZtQ29kZSA+KCkgKQorCXsKKwkJQXZtQ29kZSAqIGFDb2RlID0gYUZpcmVkLnRvX3B0cjwgQXZtQ29kZSA+KCk7CisKKwkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBhQ29kZS0+YmVnaW4oKTsKKwkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kQ29kZSA9IGFDb2RlLT5lbmQoKTsKKwkJZm9yKCA7IGl0ICE9IGVuZENvZGUgOyArK2l0ICkKKwkJeworCQkJZG90Rm9ybWF0UnVubmFibGVUcmFjZShvcywgKCppdCkpOworCQl9CisJfQorfQorCisvKioKKyAqIE1BQ0hJTkUKKyAqICUxJSAtLT4gbWFjaGluZSBydW50aW1lIHBpZAorICogJTIlIC0tPiBtYWNoaW5lIGNvbnRhaW5lciBpZGVudGlmaWVyCisgKiAlMyUgLS0+IG1hY2hpbmUgaWRlbnRpZmllcgorICovCit2b2lkIEdyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyOjpkb3RGb3JtYXRNYWNoaW5lKAorCQlPdXRTdHJlYW0gJiBvcywgY29uc3QgUnVudGltZUlEICYgYVJJRCkKK3sKKwlpZiggbVRyYWNlRmlsdGVyLnBhc3MoYVJJRCkgKQorCXsKKwkJYm9vc3Q6OmZvcm1hdCBmb3JtYXR0ZXIobU1hY2hpbmVQYXR0ZXJuKTsKKwkJZm9ybWF0dGVyLmV4Y2VwdGlvbnMoIGJvb3N0Ojppbzo6bm9fZXJyb3JfYml0cyApOworCisJCW9zIDw8IGZvcm1hdHRlcgorCQkJCSUgYVJJRC5zdHJQaWQoKQorCQkJCSUgYVJJRC5nZXRJbnN0YW5jZSgpLT5nZXROYW1lSUQoKQorCQkJCSUgYVJJRC5nZXRJbnN0YW5jZSgpLT5nZXROYW1lSUQoKQorCQkJCTw8IG1XcmFwRGF0YS5TRVBBUkFUT1I7CisJfQorfQorCisvKioKKyAqIFRSQU5TSVRJT04KKyAqICUxJSAtLT4gbWFjaGluZSBydW50aW1lIHBpZAorICogJTIlIC0tPiBtYWNoaW5lIGNvbnRhaW5lciBpZGVudGlmaWVyCisgKiAlMyUgLS0+IHRyYW5zaXRpb24gaWRlbnRpZmllcgorICovCit2b2lkIEdyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyOjpkb3RGb3JtYXRUcmFuc2l0aW9uKE91dFN0cmVhbSAmIG9zLAorCQljb25zdCBSdW50aW1lSUQgJiBhUklELCBBdm1UcmFuc2l0aW9uICogYVRyYW5zaXRpb24pCit7CisJaWYoIG1UcmFjZUZpbHRlci5oYXNUcmFuc2l0aW9uUG9pbnQoKSApCisJeworCQlib29zdDo6Zm9ybWF0IGZvcm1hdHRlcihtVHJhbnNpdGlvblBhdHRlcm4pOworCQlmb3JtYXR0ZXIuZXhjZXB0aW9ucyggYm9vc3Q6OmlvOjpub19lcnJvcl9iaXRzICk7CisKKwkJb3MgPDwgZm9ybWF0dGVyCisJCQkJJSBhUklELnN0clBpZCgpCisJCQkJJSBhUklELmdldEluc3RhbmNlKCktPmdldE5hbWVJRCgpCisJCQkJJSBhVHJhbnNpdGlvbi0+Z2V0TmFtZUlEKCkKKwkJCQk8PCBtV3JhcERhdGEuU0VQQVJBVE9SOworCX0KK30KKworLyoqCisgKiBST1VUSU5FCisgKiAlMSUgLS0+IG1hY2hpbmUgcnVudGltZSBwaWQKKyAqICUyJSAtLT4gbWFjaGluZSBjb250YWluZXIgaWRlbnRpZmllcgorICogJTMlIC0tPiByb3V0aW5lIGlkZW50aWZpZXIKKyAqLwordm9pZCBHcmFwaFZpekV4ZWN1dGlvbkdyYXBoU2VyaWFsaXplcjo6ZG90Rm9ybWF0Um91dGluZShPdXRTdHJlYW0gJiBvcywKKwkJY29uc3QgUnVudGltZUlEICYgYVJJRCwgQXZtUHJvZ3JhbSAqIGFSb3V0aW5lKQoreworCWlmKCBtVHJhY2VGaWx0ZXIuaGFzUm91dGluZVBvaW50KCkgKQorCXsKKwkJYm9vc3Q6OmZvcm1hdCBmb3JtYXR0ZXIobVJvdXRpbmVQYXR0ZXJuKTsKKwkJZm9ybWF0dGVyLmV4Y2VwdGlvbnMoIGJvb3N0Ojppbzo6bm9fZXJyb3JfYml0cyApOworCisJCW9zIDw8IGZvcm1hdHRlcgorCQkJCSUgYVJJRC5zdHJQaWQoKQorCQkJCSUgYVJJRC5nZXRJbnN0YW5jZSgpLT5nZXROYW1lSUQoKQorCQkJCSUgYVJvdXRpbmUtPmdldE5hbWVJRCgpCisJCQkJPDwgbVdyYXBEYXRhLlNFUEFSQVRPUjsKKwl9Cit9CisKKworLyoqCisgKiBFWEVDVVRJT04gQ09OVEVYVCBJTkZPCisgKiAlMSUgLS0+IG5vZGUjaWQKKyAqICUyJSAtLT4gZXhlY3V0aW9uIHRyYWNlCisgKi8KK3ZvaWQgR3JhcGhWaXpFeGVjdXRpb25HcmFwaFNlcmlhbGl6ZXI6OmRvdEZvcm1hdE5vZGVJT1RyYWNlKAorCQlPdXRTdHJlYW0gJiBvcywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpCit7CisJU3RyaW5nT3V0U3RyZWFtIGVjVHJhY2U7CisJZG90Rm9ybWF0SU9UcmFjZShlY1RyYWNlLCBhbkVDLmdldElPRWxlbWVudFRyYWNlKCkpOworCisJc3RkOjpzdHJpbmcgc3RyVHJhY2UgPSBlY1RyYWNlLnN0cigpOworCisJaWYoIG5vdCBzdHJUcmFjZS5lbXB0eSgpICkKKwl7CisJCWJvb3N0Ojpmb3JtYXQgZm9ybWF0dGVyKG1Db250ZXh0Tm9kZVRyYWNlUGF0dGVybik7CisJCWZvcm1hdHRlci5leGNlcHRpb25zKCBib29zdDo6aW86Om5vX2Vycm9yX2JpdHMgKTsKKworCQlvcyA8PCBmb3JtYXR0ZXIKKwkJCQklIGFuRUMuZ2V0SWROdW1iZXIoKQorCQkJCSUgc3RyVHJhY2U7CisJfQorfQorCisvKioKKyAqIFRSQUNFCisgKiBpbnB1dCAgKCBwb3J0IHwgc2lnbmFsIHwgbWVzc2FnZSApIFsgdmFsdWVzIF0KKyAqIG91dHB1dCAoIHBvcnQgfCBzaWduYWwgfCBtZXNzYWdlICkgWyB2YWx1ZXMgXQorICogbmV3ZnJlc2ggdmFyaWFibGUgPC0gdmFsdWUKKyAqLwordm9pZCBHcmFwaFZpekV4ZWN1dGlvbkdyYXBoU2VyaWFsaXplcjo6ZG90Rm9ybWF0SU9UcmFjZSgKKwkJT3V0U3RyZWFtICYgb3MsIGNvbnN0IEJGICYgYVRyYWNlKQoreworCWlmKCBhVHJhY2UuaXM8IEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24gPigpICkKKwl7CisJCUV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24gKiBhQ29uZiA9CisJCQkJYVRyYWNlLnRvX3B0cjwgRXhlY3V0aW9uQ29uZmlndXJhdGlvbiA+KCk7CisKKwkJaWYoIGFDb25mLT5pc0F2bUNvZGUoKSApCisJCXsKKwkJCUF2bUNvZGUgKiBhQ29kZSA9IGFDb25mLT5nZXRBdm1Db2RlKCk7CisKKwkJCXN3aXRjaCggYUNvZGUtPmdldE9wdGltaXplZE9wQ29kZSgpICkKKwkJCXsKKwkJCQljYXNlIEFWTV9PUENPREVfSU5QVVRfRU5WOgorCQkJCXsKKwkJCQkJaWYoIG1UcmFjZUZpbHRlci5oYXNJbnB1dEVudlBvaW50KCkKKwkJCQkJCSYmIG1UcmFjZUZpbHRlci5wYXNzKGFDb2RlKSApCisJCQkJCXsKKwkJCQkJCWRvdEZvcm1hdElucHV0T3V0cHV0KG9zLCBtSW5wdXRFbnZQYXR0ZXJuLAorCQkJCQkJCQlhQ29uZi0+Z2V0UnVudGltZUlEKCksIGFDb2RlKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUX1JEVjoKKwkJCQl7CisJCQkJCWlmKCBtVHJhY2VGaWx0ZXIuaGFzSW5wdXRSZHZQb2ludCgpCisJCQkJCQkmJiBtVHJhY2VGaWx0ZXIucGFzcyhhQ29kZSkgKQorCQkJCQl7CisJCQkJCQlkb3RGb3JtYXRJbnB1dE91dHB1dChvcywgbUlucHV0UmR2UGF0dGVybiwKKwkJCQkJCQkJYUNvbmYtPmdldFJ1bnRpbWVJRCgpLCBhQ29kZSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWNhc2UgQVZNX09QQ09ERV9JTlBVVDoKKwkJCQl7CisJCQkJCWlmKCBtVHJhY2VGaWx0ZXIuaGFzSW5wdXRQb2ludCgpCisJCQkJCQkmJiBtVHJhY2VGaWx0ZXIucGFzcyhhQ29kZSkgKQorCQkJCQl7CisJCQkJCQlkb3RGb3JtYXRJbnB1dE91dHB1dChvcywgbUlucHV0UGF0dGVybiwKKwkJCQkJCQkJYUNvbmYtPmdldFJ1bnRpbWVJRCgpLCBhQ29kZSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJY2FzZSBBVk1fT1BDT0RFX09VVFBVVF9FTlY6CisJCQkJeworCQkJCQlpZiggbVRyYWNlRmlsdGVyLmhhc091dHB1dEVudlBvaW50KCkKKwkJCQkJCSYmIG1UcmFjZUZpbHRlci5wYXNzKGFDb2RlKSApCisJCQkJCXsKKwkJCQkJCWRvdEZvcm1hdElucHV0T3V0cHV0KG9zLCBtT3V0cHV0RW52UGF0dGVybiwKKwkJCQkJCQkJYUNvbmYtPmdldFJ1bnRpbWVJRCgpLCBhQ29kZSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWNhc2UgQVZNX09QQ09ERV9PVVRQVVRfUkRWOgorCQkJCXsKKwkJCQkJaWYoIG1UcmFjZUZpbHRlci5oYXNPdXRwdXRSZHZQb2ludCgpCisJCQkJCQkmJiBtVHJhY2VGaWx0ZXIucGFzcyhhQ29kZSkgKQorCQkJCQl7CisJCQkJCQlkb3RGb3JtYXRJbnB1dE91dHB1dChvcywgbU91dHB1dFJkdlBhdHRlcm4sCisJCQkJCQkJCWFDb25mLT5nZXRSdW50aW1lSUQoKSwgYUNvZGUpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljYXNlIEFWTV9PUENPREVfT1VUUFVUOgorCQkJCXsKKwkJCQkJaWYoIG1UcmFjZUZpbHRlci5oYXNPdXRwdXRQb2ludCgpCisJCQkJCQkmJiBtVHJhY2VGaWx0ZXIucGFzcyhhQ29kZSkgKQorCQkJCQl7CisJCQkJCQlkb3RGb3JtYXRJbnB1dE91dHB1dChvcywgbU91dHB1dFBhdHRlcm4sCisJCQkJCQkJCWFDb25mLT5nZXRSdW50aW1lSUQoKSwgYUNvZGUpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWNhc2UgQVZNX09QQ09ERV9BU1NJR05fTkVXRlJFU0g6CisJCQkJeworCQkJCQlpZiggbVRyYWNlRmlsdGVyLmhhc05ld2ZyZXNoUG9pbnQoKQorCQkJCQkJJiYgbVRyYWNlRmlsdGVyLnBhc3MoYUNvZGUpICkKKwkJCQkJeworCQkJCQkJZG90Rm9ybWF0TmV3ZnJlc2gob3MsIGFDb25mLT5nZXRSdW50aW1lSUQoKSwgYUNvZGUpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJZWxzZSBpZiggYVRyYWNlLmlzPCBBdm1Db2RlID4oKSApCisJeworCQlBdm1Db2RlICogYUNvZGUgPSBhVHJhY2UudG9fcHRyPCBBdm1Db2RlID4oKTsKKworCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdCA9IGFDb2RlLT5iZWdpbigpOworCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBlbmRDb2RlID0gYUNvZGUtPmVuZCgpOworCQlmb3IoIDsgaXQgIT0gZW5kQ29kZSA7ICsraXQgKQorCQl7CisJCQlkb3RGb3JtYXRJT1RyYWNlKG9zLCAoKml0KSk7CisJCX0KKwl9Cit9CisKKy8qKgorICogSU5QVVQgLyBPVVRQVVQKKyAqICUxJSAtLT4gbWFjaGluZSBydW50aW1lIHBpZAorICogJTIlIC0tPiBtYWNoaW5lIGNvbnRhaW5lciBpZGVudGlmaWVyCisgKiAlMyUgLS0+IHBvcnQgfCBzaWduYWwgfCBtZXNzYWdlICBpZGVudGlmaWVyCisgKiAlNCUgLS0+IHZhbHVlCisgKiAlNSUgLS0+IG1hY2hpbmUgc2VuZGVyICAgaWRlbnRpZmllciBuYW1lCisgKiAlNiUgLS0+IG1hY2hpbmUgcmVjZWl2ZXIgaWRlbnRpZmllciBuYW1lCisgKi8KK3ZvaWQgR3JhcGhWaXpFeGVjdXRpb25HcmFwaFNlcmlhbGl6ZXI6OmRvdEZvcm1hdElucHV0T3V0cHV0KAorCQlPdXRTdHJlYW0gJiBvcywgY29uc3Qgc3RkOjpzdHJpbmcgJiBwYXR0ZXJuLAorCQljb25zdCBSdW50aW1lSUQgJiBhUklELCBBdm1Db2RlICogYUNvZGUpCit7CisJSW5zdGFuY2VPZlBvcnQgKiBhUG9ydCA9IGFDb2RlLT5maXJzdCgpLnRvX3B0cjwgSW5zdGFuY2VPZlBvcnQgPigpOworCisJT1NTIG9zcyggQVZNX1NUUl9JTkRFTlQgKTsKKworCWlmKCBhQ29kZS0+cG9wdWxhdGVkKCkgKQorCXsKKwkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBhQ29kZS0+YmVnaW4oKTsKKwkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kQ29kZSA9IGFDb2RlLT5lbmQoKTsKKwkJaWYoICgrK2l0KSAhPSBlbmRDb2RlICkKKwkJeworCQkJb3NzIDw8IG9zLlZBTFVFX1BBUkFNU19DU1MuQkVHSU47CisKKwkJCWFQb3J0LT5nZXRQYXJhbWV0ZXJUeXBlKDApLT5mb3JtYXRTdHJlYW0ob3NzLCAoKml0KSk7CisKKwkJCWF2bV9zaXplX3Qgb2Zmc2V0ID0gMTsKKwkJCWZvciggKytpdCA7IGl0ICE9IGVuZENvZGUgOyArK2l0ICwgKytvZmZzZXQgKQorCQkJeworCQkJCW9zcyA8PCBvcy5WQUxVRV9QQVJBTVNfQ1NTLlNFUEFSQVRPUjsKKworCQkJCWFQb3J0LT5nZXRQYXJhbWV0ZXJUeXBlKG9mZnNldCktPmZvcm1hdFN0cmVhbShvc3MsICgqaXQpKTsKKwkJCX0KKworCQkJb3NzIDw8IG9zLlZBTFVFX1BBUkFNU19DU1MuRU5EOworCQl9CisJfQorCisJYm9vc3Q6OmZvcm1hdCBmb3JtYXR0ZXIocGF0dGVybik7CisJZm9ybWF0dGVyLmV4Y2VwdGlvbnMoIGJvb3N0Ojppbzo6bm9fZXJyb3JfYml0cyApOworCisJUnVudGltZUlEIHJpZENvbnRhaW5lciA9IGFSSUQuZ2V0Q29tbXVuaWNhdG9yKCBhUG9ydCApOworCisJb3MgPDwgbVdyYXBEYXRhIDw8IGZvcm1hdHRlcgorCQkJJSByaWRDb250YWluZXIuc3RyUGlkKCkKKwkJCSUgcmlkQ29udGFpbmVyLmdldEluc3RhbmNlKCktPmdldE5hbWVJRCgpCisJCQklIGFDb2RlLT5maXJzdCgpLnRvX3B0cjwgSW5zdGFuY2VPZlBvcnQgPigpLT5nZXROYW1lSUQoKQorCQkJJSBvc3Muc3RyKCk7CisKKwlvcyA8PCBFTkRfV1JBUCA8PCBtV3JhcERhdGEuU0VQQVJBVE9SOworfQorCisKKy8qKgorICogTkVXRlJFU0gKKyAqICUxJSAtLT4gbWFjaGluZSBydW50aW1lIHBpZAorICogJTIlIC0tPiBtYWNoaW5lIGNvbnRhaW5lciBpZGVudGlmaWVyCisgKiAlMyUgLS0+IHZhcmlhYmxlIGlkZW50aWZpZXIKKyAqICU0JSAtLT4gdmFsdWUKKyAqLwordm9pZCBHcmFwaFZpekV4ZWN1dGlvbkdyYXBoU2VyaWFsaXplcjo6ZG90Rm9ybWF0TmV3ZnJlc2goT3V0U3RyZWFtICYgb3MsCisJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsIEF2bUNvZGUgKiBhQ29kZSkKK3sKKwlJbnN0YW5jZU9mRGF0YSAqIGFWYXIgPSBhQ29kZS0+Zmlyc3QoKS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKTsKKworCWJvb3N0Ojpmb3JtYXQgZm9ybWF0dGVyKG1OZXdmcmVzaFBhdHRlcm4pOworCWZvcm1hdHRlci5leGNlcHRpb25zKCBib29zdDo6aW86Om5vX2Vycm9yX2JpdHMgKTsKKworCVJ1bnRpbWVJRCByaWRDb250YWluZXIgPSBhUklELmdldEFuY2VzdG9yQ29udGFpbmluZyhhVmFyKTsKKworCW9zIDw8IG1XcmFwRGF0YSA8PCBmb3JtYXR0ZXIKKwkJCSUgcmlkQ29udGFpbmVyLnN0clBpZCgpCisJCQklIHJpZENvbnRhaW5lci5nZXRJbnN0YW5jZSgpLT5nZXROYW1lSUQoKQorCQkJJSBhVmFyLT5nZXROYW1lSUQoKQorCQkJJSBhVmFyLT5zdHJWYWx1ZSggYUNvZGUtPnNlY29uZCgpICk7CisKKwlvcyA8PCBFTkRfV1JBUCA8PCBtV3JhcERhdGEuU0VQQVJBVE9SOworfQorCisKKy8qKgorICogQ09ORElUSU9OCisgKiBbIFRpbWVkIF0gWyBQYXRoIHwgRmlyZWQgXSBDb25kaXRpb24KKyAqLwordm9pZCBHcmFwaFZpekV4ZWN1dGlvbkdyYXBoU2VyaWFsaXplcjo6ZG90Rm9ybWF0Q29uZGl0aW9uKE91dFN0cmVhbSAmIG9zLAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGZvcm1hdFBhdHRlcm4sIGNvbnN0IEJGICYgYUNvbmRpdGlvbikKK3sKKwlib29zdDo6Zm9ybWF0IGZvcm1hdHRlcihmb3JtYXRQYXR0ZXJuKTsKKwlmb3JtYXR0ZXIuZXhjZXB0aW9ucyggYm9vc3Q6OmlvOjpub19lcnJvcl9iaXRzICk7CisKKwlvcyA8PCBtV3JhcERhdGEgPDwgZm9ybWF0dGVyICUgYUNvbmRpdGlvbi5zdHIoKTsKKworCW9zIDw8IEVORF9XUkFQIDw8IG1XcmFwRGF0YS5TRVBBUkFUT1I7Cit9CisKKy8qKgorICogQVNTSUdOCisgKiBBc3NpZ25tZW50OiB2YXIgPSB2YWx1ZQorICovCit2b2lkIEdyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyOjpkb3RGb3JtYXRBc3NpZ24oCisJCU91dFN0cmVhbSAmIG9zLCBjb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwgYm9vbCBpc25vdFJvb3QpCit7CisJVGFibGVPZkluc3RhbmNlT2ZEYXRhOjpjb25zdF9yYXdfaXRlcmF0b3IgaXRWYXJpYWJsZTsKKwlUYWJsZU9mSW5zdGFuY2VPZkRhdGE6OmNvbnN0X3Jhd19pdGVyYXRvciBlbmRWYXJpYWJsZTsKKworCVRhYmxlT2ZSdW50aW1lVDo6Y29uc3RfaXRlcmF0b3IgaXRSRiA9IGFuRUQuZ2V0VGFibGVPZlJ1bnRpbWUoKS5iZWdpbigpOworCVRhYmxlT2ZSdW50aW1lVDo6Y29uc3RfaXRlcmF0b3IgZW5kUkYgPSBhbkVELmdldFRhYmxlT2ZSdW50aW1lKCkuZW5kKCk7CisJUnVudGltZUZvcm0gKiBwUkYgPSBOVUxMOworCWZvciggKytpdFJGOyAoaXRSRiAhPSBlbmRSRikgOyArK2l0UkYgKQorCXsKKwkJcFJGID0gKCppdFJGKTsKKworCQlpZiggcFJGLT5oYXNEYXRhKCkgKQorCQl7CisJCQlpdFZhcmlhYmxlID0gcFJGLT5nZXRFeGVjdXRhYmxlKCktPmdldEFsbERhdGEoKS5iZWdpbigpOworCQkJZW5kVmFyaWFibGUgPSBwUkYtPmdldEV4ZWN1dGFibGUoKS0+Z2V0QWxsRGF0YSgpLmVuZCgpOworCQkJZm9yKCA7IGl0VmFyaWFibGUgIT0gZW5kVmFyaWFibGUgOyArK2l0VmFyaWFibGUgKQorCQkJeworCQkJCWlmKCBtRGF0YVNlbGVjdGlvbk1vZGlmaWVkRmxhZ3MgJiYgaXNub3RSb290ICkKKwkJCQl7CisJCQkJCWlmKCBub3QgYW5FRC5pc0Fzc2lnbmVkKAorCQkJCQkJCXBSRi0+Z2V0UklEKCksIGl0VmFyaWFibGUtPmdldE9mZnNldCgpKSApCisJCQkJCXsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJfQorCisJCQkJaWYoIG1UcmFjZUZpbHRlci5wYXNzKHBSRi0+Z2V0UklEKCksCisJCQkJCQlzdGF0aWNfY2FzdDwgSW5zdGFuY2VPZkRhdGEgKiA+KGl0VmFyaWFibGUpKSApCisJCQkJeworCQkJCQlkb3RGb3JtYXRBc3NpZ24ob3MsIHBSRi0+Z2V0UklEKCksIGl0VmFyaWFibGUsCisJCQkJCQkJcFJGLT5nZXREYXRhVGFibGUoKS0+Z2V0KGl0VmFyaWFibGUpKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKKy8qKgorICogQVNTSUdOCisgKiAlMSUgLS0+IG1hY2hpbmUgcnVudGltZSBwaWQKKyAqICUyJSAtLT4gbWFjaGluZSBjb250YWluZXIgaWRlbnRpZmllcgorICogJTMlIC0tPiB2YXJpYWJsZSBpZGVudGlmaWVyCisgKiAlNCUgLS0+IHZhbHVlCisgKi8KK3ZvaWQgR3JhcGhWaXpFeGVjdXRpb25HcmFwaFNlcmlhbGl6ZXI6OmRvdEZvcm1hdEFzc2lnbihPdXRTdHJlYW0gJiBvcywKKwkJY29uc3QgUnVudGltZUlEICYgYVJJRCwgSW5zdGFuY2VPZkRhdGEgKiBhVmFyLCBjb25zdCBCRiAmIGFWYWx1ZSkKK3sKKwlib29zdDo6Zm9ybWF0IGZvcm1hdHRlcihtQXNzaWduUGF0dGVybik7CisJZm9ybWF0dGVyLmV4Y2VwdGlvbnMoIGJvb3N0Ojppbzo6bm9fZXJyb3JfYml0cyApOworCisJb3MgPDwgbVdyYXBEYXRhIDw8IGZvcm1hdHRlcgorCQkJJSBhUklELnN0clBpZCgpCisJCQklIGFSSUQuZ2V0SW5zdGFuY2UoKS0+Z2V0TmFtZUlEKCkKKwkJCSUgYVZhci0+Z2V0TmFtZUlEKCkKKwkJCSUgYVZhci0+c3RyVmFsdWUoIGFWYWx1ZSApOworCisJb3MgPDwgRU5EX1dSQVAgPDwgbVdyYXBEYXRhLlNFUEFSQVRPUjsKK30KKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9zZXJpYWxpemVyL0dyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vc2VyaWFsaXplci9HcmFwaFZpekV4ZWN1dGlvbkdyYXBoU2VyaWFsaXplci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YjE4NDMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vc2VyaWFsaXplci9HcmFwaFZpekV4ZWN1dGlvbkdyYXBoU2VyaWFsaXplci5oCkBAIC0wLDAgKzEsNDMyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjIgbWFycyAyMDE2CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRkFNX1NFUklBTElaRVJfR1JBUEhWSVpFWEVDVVRJT05HUkFQSFNFUklBTElaRVJfSF8KKyNkZWZpbmUgRkFNX1NFUklBTElaRVJfR1JBUEhWSVpFWEVDVVRJT05HUkFQSFNFUklBTElaRVJfSF8KKworI2luY2x1ZGUgPGZhbS9zZXJpYWxpemVyL1NlcmlhbGl6ZXIuaD4KKworI2luY2x1ZGUgPGZtbC90cmFjZS9UcmFjZUZpbHRlci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworY2xhc3MgQkY7CitjbGFzcyBSdW50aW1lSUQ7CisKK2NsYXNzIE91dFN0cmVhbTsKKworY2xhc3MgQXZtQ29kZTsKK2NsYXNzIEF2bVByb2dyYW07CitjbGFzcyBBdm1UcmFuc2l0aW9uOworY2xhc3MgQXZtU2VyaWFsaXplclByb2Nlc3NvcjsKKworY2xhc3MgQ29uZmlndXJhdGlvbjsKKworY2xhc3MgRXhlY3V0aW9uQ29udGV4dDsKK2NsYXNzIEV4ZWN1dGlvbkRhdGE7CisKK2NsYXNzIEdlbmVyaWNJbmZvRGF0YTsKK2NsYXNzIEluc3RhbmNlT2ZEYXRhOworCisKK2NsYXNzIEdyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyIDoKKwkJcHVibGljIEF1dG9SZWdpc3RlcmVkU2VyaWFsaXplclByb2Nlc3NvclVuaXQ8IEdyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyID4KK3sKKworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBHcmFwaFZpekV4ZWN1dGlvbkdyYXBoU2VyaWFsaXplciApCisKKworCS8qKgorCSAqIFBST0NFU1NPUiBGQUNUT1JZCisJICogZm9yIGF1dG9tYXRpYyByZWdpc3RyYXRpb24gaW4gdGhlIHByb2Nlc3NvciByZXBvc2l0b3J5CisJICogdGhlIFsgWyBGVUxMWSBdIFFVQUxJRklFRCBdIE5BTUUgSUQKKwkgKi8KKwlBVk1fSU5KRUNUX0FVVE9fUkVHSVNURVJfUVVBTElGSUVEX0lEX0tFWV8yKAorCQkJInNlcmlhbGl6ZXIjc3ltYmV4I2dyYXBodml6IiwKKwkJCSJHcmFwaFZpekV4ZWN1dGlvbkdyYXBoU2VyaWFsaXplciIpCisJLy8gZW5kIHJlZ2lzdHJhdGlvbgorCisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBDT05TVEFOVFMKKwkgKiBERUZBVUxUIFBST0ZJTEUKKwkgKi8KKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBERUZBVUxUX0dMT0JBTF9IRUFERVJfUEFUVEVSTjsKKworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIERFRkFVTFRfR0xPQkFMX0VORF9QQVRURVJOOworCisKKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBERUZBVUxUX0NPTlRFWFRfTk9ERV9QQVRURVJOOworCisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgREVGQVVMVF9DT05URVhUX05PREVfTEFCRUxfUEFUVEVSTjsKKworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIERFRkFVTFRfQ09OVEVYVF9OT0RFX0NTU19QQVRURVJOOworCisKKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBERUZBVUxUX0NPTlRFWFRfRURHRV9QQVRURVJOOworCisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgREVGQVVMVF9DT05URVhUX05PREVfSEVBREVSX1BBVFRFUk47CisKKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBERUZBVUxUX0NPTlRFWFRfTk9ERV9EQVRBX1BBVFRFUk47CisKKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBERUZBVUxUX0NPTlRFWFRfTk9ERV9JTkZPX1BBVFRFUk47CisKKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBERUZBVUxUX0NPTlRFWFRfTk9ERV9GSVJFRF9QQVRURVJOOworCisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgREVGQVVMVF9DT05URVhUX05PREVfVFJBQ0VfUEFUVEVSTjsKKworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIERFRkFVTFRfSU5GT19QQVRURVJOOworCisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgREVGQVVMVF9QQVRIX0NPTkRJVElPTl9QQVRURVJOOworCisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgREVGQVVMVF9QQVRIX1RJTUVEX0NPTkRJVElPTl9QQVRURVJOOworCisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgREVGQVVMVF9OT0RFX0NPTkRJVElPTl9QQVRURVJOOworCisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgREVGQVVMVF9OT0RFX1RJTUVEX0NPTkRJVElPTl9QQVRURVJOOworCisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgREVGQVVMVF9BU1NJR05fUEFUVEVSTjsKKworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIERFRkFVTFRfTkVXRlJFU0hfUEFUVEVSTjsKKworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIERFRkFVTFRfSU5QVVRfUEFUVEVSTjsKKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBERUZBVUxUX09VVFBVVF9QQVRURVJOOworCisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgREVGQVVMVF9JTlBVVF9FTlZfUEFUVEVSTjsKKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBERUZBVUxUX09VVFBVVF9FTlZfUEFUVEVSTjsKKworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIERFRkFVTFRfSU5QVVRfUkRWX1BBVFRFUk47CisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgREVGQVVMVF9PVVRQVVRfUkRWX1BBVFRFUk47CisKKworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIERFRkFVTFRfTElGRUxJTkVfU1RBVEVfUEFUVEVSTjsKKworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIERFRkFVTFRfTUFDSElORV9QQVRURVJOOworCisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgREVGQVVMVF9UUkFOU0lUSU9OX1BBVFRFUk47CisKKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBERUZBVUxUX1JPVVRJTkVfUEFUVEVSTjsKKworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIERFRkFVTFRfVkFSSUFCTEVfUEFUVEVSTjsKKworCS8qKgorCSAqIENPTlNUQU5UUworCSAqIFNUQU5EQVJEIFBST0ZJTEUKKwkgKi8KKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBTVEFOREFSRF9JTkZPX1BBVFRFUk47CisKKwkvKioKKwkgKiBDT05TVEFOVFMKKwkgKiBDU1MgUFJPRklMRQorCSAqLworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIERFRkFVTFRfQ09OVEVYVF9OT0RFX0NPTE9SOworCisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgV0FSTklOR19DT05URVhUX05PREVfQ09MT1I7CisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgRVJST1JfQ09OVEVYVF9OT0RFX0NPTE9SOworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIEFMRVJUX0NPTlRFWFRfTk9ERV9DT0xPUjsKKworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIE9CSkVDVElWRV9BQ0hJRVZFRF9DT05URVhUX05PREVfQ09MT1I7CisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgT0JKRUNUSVZFX0FDSElFVkVEX0NPTlRFWFRfTk9ERV9TSEFQRTsKKworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIE9CSkVDVElWRV9GQUlMRURfQ09OVEVYVF9OT0RFX0NPTE9SOworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIE9CSkVDVElWRV9GQUlMRURfQ09OVEVYVF9OT0RFX1NIQVBFOworCisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgT0JKRUNUSVZFX0FCT1JURURfQ09OVEVYVF9OT0RFX0NPTE9SOworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIE9CSkVDVElWRV9BQk9SVEVEX0NPTlRFWFRfTk9ERV9TSEFQRTsKKworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIENPVkVSQUdFX0VMRU1FTlRfQ09OVEVYVF9OT0RFX0NPTE9SOworCisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgUkVEVU5EQU5DWV9DT05URVhUX05PREVfQ09MT1I7CisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgUkVEVU5EQU5DWV9DT05URVhUX05PREVfU0hBUEU7CisKKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBSRURVTkRBTkNZX1RBUkdFVF9DT05URVhUX05PREVfQ09MT1I7CisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgUkVEVU5EQU5DWV9UQVJHRVRfQ09OVEVYVF9OT0RFX1NIQVBFOworCisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgREVGQVVMVF9DT05URVhUX05PREVfU0hBUEU7CisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgU1RBVEVNRU5UX0VYSVRfQ09OVEVYVF9OT0RFX1NIQVBFOworCisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgREVGQVVMVF9DT05URVhUX05PREVfU1RZTEU7CisKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlUcmFjZUZpbHRlciBtVHJhY2VGaWx0ZXI7CisKKwlzdGQ6OnN0cmluZyBtR2xvYmFsSGVhZGVyUGF0dGVybjsKKwlzdGQ6OnN0cmluZyBtR2xvYmFsRW5kUGF0dGVybjsKKworCXN0ZDo6c3RyaW5nIG1Db250ZXh0Tm9kZVBhdHRlcm47CisJc3RkOjpzdHJpbmcgbUNvbnRleHROb2RlTGFiZWxQYXR0ZXJuOworCXN0ZDo6c3RyaW5nIG1Db250ZXh0Tm9kZUNzc1BhdHRlcm47CisJc3RkOjpzdHJpbmcgbUNvbnRleHROb2RlQ29sb3I7CisJc3RkOjpzdHJpbmcgbUNvbnRleHROb2RlU2hhcGU7CisJc3RkOjpzdHJpbmcgbUNvbnRleHROb2RlU3R5bGU7CisJc3RkOjpzdHJpbmcgbUNvbnRleHROb2RlU2VwYXJhdG9yOworCisJc3RkOjpzdHJpbmcgbUNvbnRleHRFZGdlUGF0dGVybjsKKworCXN0ZDo6c3RyaW5nIG1Db250ZXh0Tm9kZUhlYWRlclBhdHRlcm47CisJc3RkOjpzdHJpbmcgbUNvbnRleHROb2RlRGF0YVBhdHRlcm47CisJc3RkOjpzdHJpbmcgbUNvbnRleHROb2RlSW5mb1BhdHRlcm47CisJc3RkOjpzdHJpbmcgbUNvbnRleHROb2RlRmlyZWRQYXR0ZXJuOworCXN0ZDo6c3RyaW5nIG1Db250ZXh0Tm9kZVRyYWNlUGF0dGVybjsKKworCXN0ZDo6c3RyaW5nIG1JbmZvUGF0dGVybjsKKwlzdGQ6OnN0cmluZyBtSW5mb0p1c3RpZmljYXRpb247CisJc3RkOjpzdHJpbmcgbUluZm9TZXBhcmF0b3I7CisKKwlzdGQ6OnN0cmluZyBtUGF0aENvbmRpdGlvblBhdHRlcm47CisJc3RkOjpzdHJpbmcgbVBhdGhUaW1lZENvbmRpdGlvblBhdHRlcm47CisKKwlzdGQ6OnN0cmluZyBtTm9kZUNvbmRpdGlvblBhdHRlcm47CisJc3RkOjpzdHJpbmcgbU5vZGVUaW1lZENvbmRpdGlvblBhdHRlcm47CisKKwlzdGQ6OnN0cmluZyBtQXNzaWduUGF0dGVybjsKKwlzdGQ6OnN0cmluZyBtTmV3ZnJlc2hQYXR0ZXJuOworCisJc3RkOjpzdHJpbmcgbUlucHV0UGF0dGVybjsKKwlzdGQ6OnN0cmluZyBtT3V0cHV0UGF0dGVybjsKKworCXN0ZDo6c3RyaW5nIG1JbnB1dEVudlBhdHRlcm47CisJc3RkOjpzdHJpbmcgbU91dHB1dEVudlBhdHRlcm47CisKKwlzdGQ6OnN0cmluZyBtSW5wdXRSZHZQYXR0ZXJuOworCXN0ZDo6c3RyaW5nIG1PdXRwdXRSZHZQYXR0ZXJuOworCisJc3RkOjpzdHJpbmcgbUxpZmVsaW5lU3RhdGVQYXR0ZXJuOworCisJc3RkOjpzdHJpbmcgbU1hY2hpbmVQYXR0ZXJuOworCXN0ZDo6c3RyaW5nIG1UcmFuc2l0aW9uUGF0dGVybjsKKwlzdGQ6OnN0cmluZyBtUm91dGluZVBhdHRlcm47CisJc3RkOjpzdHJpbmcgbVZhcmlhYmxlUGF0dGVybjsKKworCWJvb2wgbVVzZWRTaW5nbGVFeGVjdXRpb25Db250ZXh0Tm9kZUZsYWc7CisKKwlib29sIG1TaG93Tm9kZUhlYWRlckZsYWc7CisJYm9vbCBtU2hvd05vZGVEYXRhRmxhZzsKKwlib29sIG1TaG93Tm9kZUluZm9GbGFnOworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIENPTVBVVElORyBWQVJJQUJMRQorCUxpc3RPZkNvbnN0RXhlY3V0aW9uQ29udGV4dCBtRG90Rm9ybWF0Tm9kZVdhaXRpbmdRdWV1ZTsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJR3JhcGhWaXpFeGVjdXRpb25HcmFwaFNlcmlhbGl6ZXIoCisJCQlTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXIgJiBhTWFuYWdlciwgV09iamVjdCAqIHdmUGFyYW1ldGVyT2JqZWN0KQorCTogUmVnaXN0ZXJlZFNlcmlhbGl6ZXJQcm9jZXNzb3JVbml0KGFNYW5hZ2VyLCB3ZlBhcmFtZXRlck9iamVjdCwKKwkJCUFWTV9QT1NUX1BST0NFU1NJTkdfU1RBR0UsIERFRkFVTFRfUFJFQ0VERU5DRV9PRl9TRVJJQUxJWkVSX1BST0NFU1NPUiksCisKKwltR2xvYmFsSGVhZGVyUGF0dGVybiggREVGQVVMVF9HTE9CQUxfSEVBREVSX1BBVFRFUk4gKSwKKwltR2xvYmFsRW5kUGF0dGVybiggREVGQVVMVF9HTE9CQUxfRU5EX1BBVFRFUk4gKSwKKworCW1Db250ZXh0Tm9kZVBhdHRlcm4oIERFRkFVTFRfQ09OVEVYVF9OT0RFX1BBVFRFUk4gKSwKKwltQ29udGV4dE5vZGVMYWJlbFBhdHRlcm4oIERFRkFVTFRfQ09OVEVYVF9OT0RFX0xBQkVMX1BBVFRFUk4gKSwKKwltQ29udGV4dE5vZGVDc3NQYXR0ZXJuKCBERUZBVUxUX0NPTlRFWFRfTk9ERV9DU1NfUEFUVEVSTiApLAorCisJbUNvbnRleHROb2RlQ29sb3IgICggREVGQVVMVF9DT05URVhUX05PREVfQ09MT1IgICApLAorCW1Db250ZXh0Tm9kZVNoYXBlICAoIERFRkFVTFRfQ09OVEVYVF9OT0RFX1NIQVBFICAgKSwKKwltQ29udGV4dE5vZGVTdHlsZSAgKCBERUZBVUxUX0NPTlRFWFRfTk9ERV9TVFlMRSAgICksCisJbUNvbnRleHROb2RlU2VwYXJhdG9yKCAiXFxuIiApLAorCisJbUNvbnRleHRFZGdlUGF0dGVybiggREVGQVVMVF9DT05URVhUX0VER0VfUEFUVEVSTiApLAorCisJbUNvbnRleHROb2RlSGVhZGVyUGF0dGVybiggREVGQVVMVF9DT05URVhUX05PREVfSEVBREVSX1BBVFRFUk4gKSwKKworCW1Db250ZXh0Tm9kZURhdGFQYXR0ZXJuKCBERUZBVUxUX0NPTlRFWFRfTk9ERV9EQVRBX1BBVFRFUk4gKSwKKworCW1Db250ZXh0Tm9kZUluZm9QYXR0ZXJuKCBERUZBVUxUX0NPTlRFWFRfTk9ERV9JTkZPX1BBVFRFUk4gKSwKKworCW1Db250ZXh0Tm9kZUZpcmVkUGF0dGVybiggREVGQVVMVF9DT05URVhUX05PREVfRklSRURfUEFUVEVSTiApLAorCW1Db250ZXh0Tm9kZVRyYWNlUGF0dGVybiggREVGQVVMVF9DT05URVhUX05PREVfVFJBQ0VfUEFUVEVSTiApLAorCisJbUluZm9QYXR0ZXJuKCBERUZBVUxUX0lORk9fUEFUVEVSTiApLAorCW1JbmZvSnVzdGlmaWNhdGlvbiggIlxcbCIgKSwKKwltSW5mb1NlcGFyYXRvciggIiIgKSwKKworCW1QYXRoQ29uZGl0aW9uUGF0dGVybiggREVGQVVMVF9QQVRIX0NPTkRJVElPTl9QQVRURVJOICksCisJbVBhdGhUaW1lZENvbmRpdGlvblBhdHRlcm4oIERFRkFVTFRfUEFUSF9USU1FRF9DT05ESVRJT05fUEFUVEVSTiApLAorCisJbU5vZGVDb25kaXRpb25QYXR0ZXJuKCBERUZBVUxUX05PREVfQ09ORElUSU9OX1BBVFRFUk4gKSwKKwltTm9kZVRpbWVkQ29uZGl0aW9uUGF0dGVybiggREVGQVVMVF9OT0RFX1RJTUVEX0NPTkRJVElPTl9QQVRURVJOICksCisKKwltQXNzaWduUGF0dGVybiggREVGQVVMVF9BU1NJR05fUEFUVEVSTiApLAorCW1OZXdmcmVzaFBhdHRlcm4oIERFRkFVTFRfTkVXRlJFU0hfUEFUVEVSTiApLAorCisJbUlucHV0UGF0dGVybiAoIERFRkFVTFRfSU5QVVRfUEFUVEVSTiAgKSwKKwltT3V0cHV0UGF0dGVybiggREVGQVVMVF9PVVRQVVRfUEFUVEVSTiApLAorCisJbUlucHV0RW52UGF0dGVybiAoIERFRkFVTFRfSU5QVVRfRU5WX1BBVFRFUk4gICksCisJbU91dHB1dEVudlBhdHRlcm4oIERFRkFVTFRfT1VUUFVUX0VOVl9QQVRURVJOICksCisKKwltSW5wdXRSZHZQYXR0ZXJuICggREVGQVVMVF9JTlBVVF9SRFZfUEFUVEVSTiAgKSwKKwltT3V0cHV0UmR2UGF0dGVybiggREVGQVVMVF9PVVRQVVRfUkRWX1BBVFRFUk4gKSwKKworCW1MaWZlbGluZVN0YXRlUGF0dGVybiggREVGQVVMVF9MSUZFTElORV9TVEFURV9QQVRURVJOICksCisKKwltTWFjaGluZVBhdHRlcm4oIERFRkFVTFRfTUFDSElORV9QQVRURVJOICksCisJbVRyYW5zaXRpb25QYXR0ZXJuKCBERUZBVUxUX1RSQU5TSVRJT05fUEFUVEVSTiApLAorCW1Sb3V0aW5lUGF0dGVybiggREVGQVVMVF9ST1VUSU5FX1BBVFRFUk4gKSwKKwltVmFyaWFibGVQYXR0ZXJuKCBERUZBVUxUX1ZBUklBQkxFX1BBVFRFUk4gKSwKKworCW1Vc2VkU2luZ2xlRXhlY3V0aW9uQ29udGV4dE5vZGVGbGFnKCB0cnVlICksCisKKwltU2hvd05vZGVIZWFkZXJGbGFnKCB0cnVlICksCisJbVNob3dOb2RlRGF0YUZsYWcoIHRydWUgKSwKKwltU2hvd05vZGVJbmZvRmxhZyggdHJ1ZSApLAorCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIENPTVBVVElORyBWQVJJQUJMRQorCW1Eb3RGb3JtYXROb2RlV2FpdGluZ1F1ZXVlKCApCisJeworCQltV3JhcERhdGEuU0VQQVJBVE9SID0gIlxcbCI7CisJfQorCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkdyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogQ09ORklHVVJFCisJICovCisJdmlydHVhbCBib29sIGNvbmZpZ3VyZUltcGwoKTsKKworCWJvb2wgY29uZmlndXJlRm9ybWF0dGVyKFdPYmplY3QgKiBGT1JNQVQsIHN0ZDo6c3RyaW5nICYgZm9ybWF0UGF0dGVybiwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgaWQsIGJvb2wgaXNSZWdleCA9IGZhbHNlKTsKKworCS8qKgorCSAqIFJFUE9SVCBUUkFDRQorCSAqLworCXZpcnR1YWwgdm9pZCByZXBvcnREZWZhdWx0KE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworCisJLyoqCisJICogRklMVEVSSU5HIEFQSQorCSAqLworCXZpcnR1YWwgYm9vbCBwcmVmaWx0ZXIoKTsKKwl2aXJ0dWFsIGJvb2wgcG9zdGZpbHRlcigpOworCisJLyoqCisJICogUE9TVC1QUk9DRVNTSU5HIEFQSQorCSAqLworCXZpcnR1YWwgYm9vbCBwb3N0cHJvY2VzcygpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gREVGQVVMVCBGT1JNQVQgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJc3RhdGljIHZvaWQgZm9ybWF0KFN5bWJleENvbnRyb2xsZXJVbml0TWFuYWdlciAmIGFNYW5hZ2VyLAorCQkJT3V0U3RyZWFtICYgb3V0LCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgcm9vdEVDKTsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIEZPUk1BVCBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwl2b2lkIGRvdEZvcm1hdChPdXRTdHJlYW0gJiBvcywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIHJvb3RFQyk7CisKKwl2b2lkIGRvRm9ybWF0SGVhZGVyKE91dFN0cmVhbSAmIG9zKTsKKwl2b2lkIGRvRm9ybWF0RW5kKE91dFN0cmVhbSAmIG9zKTsKKworCXZvaWQgZG90Rm9ybWF0Tm9kZShPdXRTdHJlYW0gJiBvcywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpOworCisJc3RkOjpzdHJpbmcgZG90Tm9kZUNvbG9yKGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKTsKKwlzdGQ6OnN0cmluZyBkb3ROb2RlU2hhcGUoY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpOworCXN0ZDo6c3RyaW5nIGRvdE5vZGVTdHlsZShjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQyk7CisKKwl2b2lkIGRvdEZvcm1hdEVkZ2UoT3V0U3RyZWFtICYgb3MsCisJCQljb25zdCBFeGVjdXRpb25Db250ZXh0ICYgc3JjRUMsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiB0Z3RFQyk7CisKKwl2b2lkIGRvdEZvcm1hdE5vZGVIZWFkZXIoT3V0U3RyZWFtICYgb3MsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKTsKKworCXZvaWQgZG90Rm9ybWF0Tm9kZURhdGEoT3V0U3RyZWFtICYgb3MsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKTsKKworCXZvaWQgZG90Rm9ybWF0Tm9kZUluZm8oT3V0U3RyZWFtICYgb3MsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKTsKKworCXZvaWQgZG90Rm9ybWF0Tm9kZVJ1bm5hYmxlVHJhY2UoCisJCQlPdXRTdHJlYW0gJiBvcywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpOworCisJdm9pZCBkb3RGb3JtYXROb2RlSU9UcmFjZShPdXRTdHJlYW0gJiBvcywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpOworCisJLyoqCisJICogSU5GTworCSAqLworCXZvaWQgZG90Rm9ybWF0SW5mbyhPdXRTdHJlYW0gJiBvcywgR2VuZXJpY0luZm9EYXRhICogYW5JbmZvKTsKKworCS8qKgorCSAqIEZJUkVECisJICogcnVuIG1hY2hpbmUKKwkgKiBmaXJlZCB0cmFuc2l0aW9uCisJICogaW52b2tlIHJvdXRpbmUKKwkgKi8KKwl2b2lkIGRvdEZvcm1hdFJ1bm5hYmxlVHJhY2UoT3V0U3RyZWFtICYgb3MsIGNvbnN0IEJGICYgYUZpcmVkKTsKKworCXZvaWQgZG90Rm9ybWF0TWFjaGluZShPdXRTdHJlYW0gJiBvcywgY29uc3QgUnVudGltZUlEICYgYVJJRCk7CisKKwl2b2lkIGRvdEZvcm1hdFRyYW5zaXRpb24oT3V0U3RyZWFtICYgb3MsCisJCQljb25zdCBSdW50aW1lSUQgJiBhUklELCBBdm1UcmFuc2l0aW9uICogYVRyYW5zaXRpb24pOworCisJdm9pZCBkb3RGb3JtYXRSb3V0aW5lKE91dFN0cmVhbSAmIG9zLAorCQkJY29uc3QgUnVudGltZUlEICYgYVJJRCwgQXZtUHJvZ3JhbSAqIGFSb3V0aW5lKTsKKworCS8qKgorCSAqIFRSQUNFCisJICogaW5wdXQgICggcG9ydCB8IHNpZ25hbCB8IG1lc3NhZ2UgKSBbIHZhbHVlcyBdCisJICogb3V0cHV0ICggcG9ydCB8IHNpZ25hbCB8IG1lc3NhZ2UgKSBbIHZhbHVlcyBdCisJICogbmV3ZnJlc2ggdmFyaWFibGUgPC0gdmFsdWUKKwkgKi8KKwl2b2lkIGRvdEZvcm1hdElPVHJhY2UoT3V0U3RyZWFtICYgb3MsIGNvbnN0IEJGICYgYVRyYWNlKTsKKworCXZvaWQgZG90Rm9ybWF0SW5wdXRPdXRwdXQoT3V0U3RyZWFtICYgb3MsIGNvbnN0IHN0ZDo6c3RyaW5nICYgcGF0dGVybiwKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsIEF2bUNvZGUgKiBhQ29kZSk7CisKKwl2b2lkIGRvdEZvcm1hdE5ld2ZyZXNoKE91dFN0cmVhbSAmIG9zLAorCQkJY29uc3QgUnVudGltZUlEICYgYVJJRCwgQXZtQ29kZSAqIGFDb2RlKTsKKworCS8qKgorCSAqIERBVEEKKwkgKiBbIFRpbWVkIF0gUGF0aCBDb25kaXRpb24KKwkgKiBBc3NpZ25tZW50OiB2YXIgPSB2YWx1ZQorCSAqLworCXZvaWQgZG90Rm9ybWF0Q29uZGl0aW9uKE91dFN0cmVhbSAmIG9zLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBmb3JtYXRQYXR0ZXJuLCBjb25zdCBCRiAmIGFDb25kaXRpb24pOworCisJdm9pZCBkb3RGb3JtYXRBc3NpZ24oT3V0U3RyZWFtICYgb3MsCisJCQljb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwgYm9vbCBpc25vdFJvb3QgPSB0cnVlKTsKKworCXZvaWQgZG90Rm9ybWF0QXNzaWduKE91dFN0cmVhbSAmIG9zLCBjb25zdCBSdW50aW1lSUQgJiBhUklELAorCQkJSW5zdGFuY2VPZkRhdGEgKiBhVmFyLCBjb25zdCBCRiAmIGFWYWx1ZSk7CisKK307CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKiBGQU1fU0VSSUFMSVpFUl9HUkFQSFZJWkVYRUNVVElPTkdSQVBIU0VSSUFMSVpFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3NlcmlhbGl6ZXIvR3JhcGhWaXpTdGF0ZW1hY2hpbmVTZXJpYWxpemVyLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9zZXJpYWxpemVyL0dyYXBoVml6U3RhdGVtYWNoaW5lU2VyaWFsaXplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM3YmM1NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9zZXJpYWxpemVyL0dyYXBoVml6U3RhdGVtYWNoaW5lU2VyaWFsaXplci5jcHAKQEAgLTAsMCArMSw5NDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyMiBtYXJzIDIwMTYKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkdyYXBoVml6U3RhdGVtYWNoaW5lU2VyaWFsaXplci5oIgorCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL01hY2hpbmUuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvUHJvcGVydHlQYXJ0Lmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1N5c3RlbS5oPgorCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0JlaGF2aW9yYWxQYXJ0Lmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0NvbXBvc2l0ZVBhcnQuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvUHJvcGVydHlQYXJ0Lmg+CisKKyNpbmNsdWRlIDxmbWwvd29ya2Zsb3cvUXVlcnkuaD4KKyNpbmNsdWRlIDxmbWwvd29ya2Zsb3cvV09iamVjdC5oPgorCisjaW5jbHVkZSA8c2V3L0NvbmZpZ3VyYXRpb24uaD4KKyNpbmNsdWRlIDxzZXcvU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzZXJpYWxpemVyICs9IEdyYXBoVml6U3RhdGVtYWNoaW5lU2VyaWFsaXplciA8bmFtZS1pZD4gIjxkZXNjcmlwdGlvbj4iIHsKKwkvLyAuLi4KKworQHByb3BlcnR5OgorCitAdHJhY2U6CisKK0Bmb3JtYXQ6CisKK0B2ZnM6CisJZmlsZSA9ICI8c2F2ZS1maWxlLXBhdGg+IgorfQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKK3Byb3RvdHlwZSBwcm9jZXNzb3I6OlN0YXRlbWFjaGluZVNlcmlhbGl6ZXIgYXMgR3JhcGhWaXpTdGF0ZW1hY2hpbmVTZXJpYWxpemVyIGlzCitzZWN0aW9uIFBST1BFUlRZCisJQGluZm8jc2VsZWN0aW9uID0gJ0FMTCc7ICAgIC8vIEFMTCB8IE1PRElGSUVECisJQGRhdGEjc2VsZWN0aW9uID0gJ0FMTCc7CS8vIEFMTCB8IE1PRElGSUVECitlbmRzZWN0aW9uIFBST1BFUlRZCisKK3NlY3Rpb24gRk9STUFUCisJQGxpbmUjd3JhcCN3aWR0aCA9IDQyOworCUBsaW5lI3dyYXAjc2VwYXJhdG9yID0gIlxcbCI7CitlbmRzZWN0aW9uIEZPUk1BVAorCitzZWN0aW9uIFJFUE9SVAorCUB1cmkgPSAic3RyZWFtOnN0ZDpjb3V0IjsKKwlAdXJpID0gInN0cmVhbTpzdGQ6Y2VyciI7CisKKwlAdXJpID0gInN0cmVhbTphdm06bG9nIjsKKwlAdXJpID0gInN0cmVhbTphdm06dHJhY2UiOworCisJQHVyaSA9ICJmb2xkZXI6cmVwb3J0IjsKKwlAdXJpID0gImZpbGU6cmVwb3J0L2JydXNzZWxhdG9yLnJlcG9ydCI7CisJQHVyaSA9ICJmaWxlbmFtZTpicnVzc2VsYXRvciI7CisKKwlAdXJpID0gInNvY2tldDppczAwNjE2My5pbnRyYS5jZWEuZnI6MTIzNDU2IjsKKworCUB3aGVuID0gImluaXQ6YWZ0ZXI/MTAjc3RlcDpvdGY6ZXZlcnk/NSN1czpiZWZvcmU/MTAwI21hY3JvX3N0ZXA6ZXhpdCI7CisKKwlAcHJvdG9jb2wgPSAnU1RBVElDJzsgICAJLy8gU1RBVElDIHwgRFlOQU1JQyB8IFNUUkVBTQorZW5kc2VjdGlvbiBSRVBPUlQKKworCitzZWN0aW9uIE1BQ0hJTkUKKwlAbWFjaGluZSA9IHRydWU7CisJQG1hY2hpbmUjaW5zdGFuY2UgPSB0cnVlOworCUBtYWNoaW5lI21vZGVsID0gdHJ1ZTsKKwlAbWFjaGluZSNwcm90b3R5cGUgPSB0cnVlOworCisJQHByb2NlZHVyZSA9IHRydWU7CisJQHByb2dyYW0gPSB0cnVlOworCUByb3V0aW5lID0gdHJ1ZTsKKworCUBzdGF0ZW1hY2hpbmUgPSB0cnVlOworZW5kc2VjdGlvbiBNQUNISU5FCisKK3NlY3Rpb24gU1RBVEVNQUNISU5FCisJQHRyYW5zaXRpb24gPSB0cnVlOworCisJQGVuYWJsZSA9IHRydWU7CisJQGRpc2FibGUgPSB0cnVlOworCUByb3V0aW5lID0gdHJ1ZTsKKyAgZW5kc2VjdGlvbiBTVEFURU1BQ0hJTkUKKworc2VjdGlvbiBUUkFOU0lUSU9OCisJQHByaW9yaXR5ID0gdHJ1ZTsKK2VuZHNlY3Rpb24gVFJBTlNJVElPTgorCitzZWN0aW9uIFNUQVRFTUVOVAorCUBhc3NpZ24gPSB0cnVlOworCisJQGNvbSA9IHRydWU7CisKKwlAY29tI2VudiA9IHRydWU7CisKKwlAaW5wdXQgPSB0cnVlOworCUBpbnB1dCNlbnYgPSB0cnVlOworCisJQG91dHB1dCA9IHRydWU7CisJQG91dHB1dCNlbnYgPSB0cnVlOworZW5kc2VjdGlvbiBTVEFURU1FTlQKK2VuZHByb3RvdHlwZQorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENPTkZJR1VSRSBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgR3JhcGhWaXpTdGF0ZW1hY2hpbmVTZXJpYWxpemVyOjpjb25maWd1cmVJbXBsKCkKK3sKKwltQ29uZmlnRmxhZyA9IFNlcmlhbGl6ZXI6OmNvbmZpZ3VyZUltcGwoKTsKKworCVdPYmplY3QgKiB0aGVTRUNUSU9OID0gUXVlcnk6OmdldFJlZ2V4V1NlcXVlbmNlKAorCQkJZ2V0UGFyYW1ldGVyV09iamVjdCgpLCBPUl9XSUQyKCJwcm9wZXJ0eSIsICJQUk9QRVJUWSIpKTsKKwlpZiggdGhlU0VDVElPTiAhPSBXT2JqZWN0OjpfTlVMTF8gKQorCXsKKworCX0KKworCXRoZVNFQ1RJT04gPSBRdWVyeTo6Z2V0UmVnZXhXU2VxdWVuY2UoCisJCQlnZXRQYXJhbWV0ZXJXT2JqZWN0KCksIE9SX1dJRDIoIm1hY2hpbmUiLCAiTUFDSElORSIpKTsKKwlpZiggdGhlU0VDVElPTiAhPSBXT2JqZWN0OjpfTlVMTF8gKQorCXsKKwkJbU1hY2hpbmVGbGFnID0gUXVlcnk6OmdldFdQcm9wZXJ0eUJvb2xlYW4oCisJCQkJdGhlU0VDVElPTiwgIm1hY2hpbmUiLCB0cnVlKTsKKworCQltTWFjaGluZUluc3RhbmNlRmxhZyA9IFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eUJvb2xlYW4oCisJCQkJdGhlU0VDVElPTiwgQ09OU19XSUQyKCJtYWNoaW5lIiwgImluc3RhbmNlIiksIHRydWUpOworCQltTWFjaGluZU1vZGVsRmxhZyA9IFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eUJvb2xlYW4oCisJCQkJdGhlU0VDVElPTiwgQ09OU19XSUQyKCJtYWNoaW5lIiwgIm1vZGVsIiksIHRydWUpOworCQltTWFjaGluZVByb3RvdHlwZUZsYWcgPSBRdWVyeTo6Z2V0UmVnZXhXUHJvcGVydHlCb29sZWFuKAorCQkJCXRoZVNFQ1RJT04sIENPTlNfV0lEMigibWFjaGluZSIsICJwcm90b3R5cGUiKSwgdHJ1ZSk7CisKKworCQltUHJvY2VkdXJlRmxhZyA9IFF1ZXJ5OjpnZXRXUHJvcGVydHlCb29sZWFuKAorCQkJCXRoZVNFQ1RJT04sICJwcm9jZWR1cmUiLCB0cnVlKTsKKworCQltUHJvZ3JhbUZsYWcgPSBRdWVyeTo6Z2V0V1Byb3BlcnR5Qm9vbGVhbigKKwkJCQl0aGVTRUNUSU9OLCAicHJvZ3JhbSIsIHRydWUpOworCisJCW1Sb3V0aW5lRmxhZyA9IFF1ZXJ5OjpnZXRXUHJvcGVydHlCb29sZWFuKAorCQkJCXRoZVNFQ1RJT04sICJyb3V0aW5lIiwgdHJ1ZSk7CisKKwkJbVN0YXRlbWFjaGluZUZsYWcgPSBRdWVyeTo6Z2V0V1Byb3BlcnR5Qm9vbGVhbigKKwkJCQl0aGVTRUNUSU9OLCAic3RhdGVtYWNoaW5lIiwgdHJ1ZSk7CisJfQorCisJdGhlU0VDVElPTiA9IFF1ZXJ5OjpnZXRSZWdleFdTZXF1ZW5jZSgKKwkJCWdldFBhcmFtZXRlcldPYmplY3QoKSwgT1JfV0lEMigic3RhdGVtYWNoaW5lIiwgIlNUQVRFTUFDSElORSIpKTsKKwlpZiggdGhlU0VDVElPTiAhPSBXT2JqZWN0OjpfTlVMTF8gKQorCXsKKwkJbVRyYW5zaXRpb25GbGFnID0gUXVlcnk6OmdldFdQcm9wZXJ0eUJvb2xlYW4oCisJCQkJdGhlU0VDVElPTiwgInRyYW5zaXRpb24iLCB0cnVlKTsKKworCQltU3RhdGVtYWNoaW5lRGlzYWJsZUZsYWcgPSBRdWVyeTo6Z2V0V1Byb3BlcnR5Qm9vbGVhbigKKwkJCQl0aGVTRUNUSU9OLCAiZGlzYWJsZSIsIHRydWUpOworCQltU3RhdGVtYWNoaW5lRW5hYmxlRmxhZyA9IFF1ZXJ5OjpnZXRXUHJvcGVydHlCb29sZWFuKAorCQkJCXRoZVNFQ1RJT04sICJlbmFibGUiLCB0cnVlKTsKKwl9CisKKwl0aGVTRUNUSU9OID0gUXVlcnk6OmdldFJlZ2V4V1NlcXVlbmNlKAorCQkJZ2V0UGFyYW1ldGVyV09iamVjdCgpLCBPUl9XSUQyKCJ0cmFuc2l0aW9uIiwgIlRSQU5TSVRJT04iKSk7CisJaWYoIHRoZVNFQ1RJT04gIT0gV09iamVjdDo6X05VTExfICkKKwl7CisJCW1UcmFuc2l0aW9uUHJpb3JpdHlGbGFnID0gUXVlcnk6OmdldFdQcm9wZXJ0eUJvb2xlYW4oCisJCQkJdGhlU0VDVElPTiwgInByaW9yaXR5IiwgdHJ1ZSk7CisJfQorCisJdGhlU0VDVElPTiA9IFF1ZXJ5OjpnZXRSZWdleFdTZXF1ZW5jZSgKKwkJCWdldFBhcmFtZXRlcldPYmplY3QoKSwgT1JfV0lEMigic3RhdGVtZW50IiwgIlNUQVRFTUVOVCIpKTsKKwlpZiggdGhlU0VDVElPTiAhPSBXT2JqZWN0OjpfTlVMTF8gKQorCXsKKwkJbVN0YXRlbWVudEFzc2lnbkZsYWcgPSBRdWVyeTo6Z2V0V1Byb3BlcnR5Qm9vbGVhbigKKwkJCQl0aGVTRUNUSU9OLCAiYXNzaWduIiwgZmFsc2UpOworCisJCW1TdGF0ZW1lbnRDb21GbGFnID0gUXVlcnk6OmdldFdQcm9wZXJ0eUJvb2xlYW4oCisJCQkJdGhlU0VDVElPTiwgImNvbSIsIGZhbHNlKTsKKwkJbVN0YXRlbWVudENvbUVudkZsYWcgPSBRdWVyeTo6Z2V0UmVnZXhXUHJvcGVydHlCb29sZWFuKAorCQkJCXRoZVNFQ1RJT04sIENPTlNfV0lEMigiY29tIiwgImVudiIpLCBmYWxzZSk7CisKKwkJbVN0YXRlbWVudElucHV0RmxhZyA9IFF1ZXJ5OjpnZXRXUHJvcGVydHlCb29sZWFuKAorCQkJCXRoZVNFQ1RJT04sICJpbnB1dCIsIGZhbHNlKTsKKwkJbVN0YXRlbWVudElucHV0RW52RmxhZyA9IFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eUJvb2xlYW4oCisJCQkJdGhlU0VDVElPTiwgQ09OU19XSUQyKCJpbnB1dCIsICJlbnYiKSwgZmFsc2UpOworCisJCW1TdGF0ZW1lbnRPdXB1dEZsYWcgPSBRdWVyeTo6Z2V0V1Byb3BlcnR5Qm9vbGVhbigKKwkJCQl0aGVTRUNUSU9OLCAib3V0cHV0IiwgZmFsc2UpOworCQltU3RhdGVtZW50T3VwdXRFbnZGbGFnID0gUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5Qm9vbGVhbigKKwkJCQl0aGVTRUNUSU9OLCBDT05TX1dJRDIoIm91dHB1dCIsICJlbnYiKSwgZmFsc2UpOworCisJCW1TdGF0ZW1lbnRHdWFyZEZsYWcgPSBRdWVyeTo6Z2V0V1Byb3BlcnR5Qm9vbGVhbigKKwkJCQl0aGVTRUNUSU9OLCAiZ3VhcmQiLCBmYWxzZSk7CisJCW1TdGF0ZW1lbnRUZXN0RmxhZyA9IFF1ZXJ5OjpnZXRXUHJvcGVydHlCb29sZWFuKAorCQkJCXRoZVNFQ1RJT04sICJ0ZXN0IiwgZmFsc2UpOworCX0KKworCXJldHVybiggbUNvbmZpZ0ZsYWcgKTsKK30KKworCisvKioKKyAqIFJFUE9SVCBUUkFDRQorICovCit2b2lkIEdyYXBoVml6U3RhdGVtYWNoaW5lU2VyaWFsaXplcjo6cmVwb3J0RGVmYXVsdChPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlBVk1fT1NfVkVSQk9TSVRZX01FRElVTSggb3MgKQorCQkJPDwgVEFCIDw8ICJHUkFQSFZJWiBTVEFURU1BQ0hJTkUgU0VSSUFMSVpFUjwgIgorCQkJPDwgZ2V0UGFyYW1ldGVyV09iamVjdCgpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQk8PCAiID4gRE9ORSAhISEiICA8PCBFT0xfRkxVU0g7Cit9CisKKworLyoqCisgKiBQUkUtUFJPQ0VTU0lORyBBUEkKKyAqLworYm9vbCBHcmFwaFZpelN0YXRlbWFjaGluZVNlcmlhbGl6ZXI6OnByZXByb2Nlc3MoKQoreworCWJvb2wgc2F2ZUZsYWcgPSBTdHJpbmc6OlVTRV9CQUNLU0xBU0hfUVVPVEU7CisJU3RyaW5nOjpVU0VfQkFDS1NMQVNIX1FVT1RFID0gdHJ1ZTsKKworCWJlZ2luU3RyZWFtKCk7CisJd2hpbGUoIGhhc1N0cmVhbSgpICkKKwl7CisJCWRvdEZvcm1hdChjdXJyZW50U3RyZWFtKCksIGdldENvbmZpZ3VyYXRpb24oKS5nZXRTcGVjaWZpY2F0aW9uKCkpOworCX0KKworCVN0cmluZzo6VVNFX0JBQ0tTTEFTSF9RVU9URSA9IHNhdmVGbGFnOworCisJY2xvc2VTdHJlYW0oKTsKKworCXJldHVybiggdHJ1ZSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERFRkFVTFQgRk9STUFUIEFQSQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIEdyYXBoVml6U3RhdGVtYWNoaW5lU2VyaWFsaXplcjo6Zm9ybWF0KAorCQlTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXIgJiBhTWFuYWdlciwKKwkJT3V0U3RyZWFtICYgb3V0LCBjb25zdCBTeXN0ZW0gJiBhU3lzdGVtKQoreworCUFic3RyYWN0UHJvY2Vzc29yVW5pdCAqIGV4aXN0aW5nU2VyaWFsaXplciA9CisJCQlhTWFuYWdlci5nZXRDb250cm9sbGVyVW5pdCgKKwkJCQkJR3JhcGhWaXpTdGF0ZW1hY2hpbmVTZXJpYWxpemVyOjpBVVRPX1JFR0lTVEVSX1RPT0wpOworCisJaWYoIGV4aXN0aW5nU2VyaWFsaXplciAhPSBOVUxMICkKKwl7CisJCUdyYXBoVml6U3RhdGVtYWNoaW5lU2VyaWFsaXplciBndlNlcmlhbGl6ZXIoCisJCQkJYU1hbmFnZXIsIGV4aXN0aW5nU2VyaWFsaXplci0+Z2V0UGFyYW1ldGVyV09iamVjdCgpKTsKKworCQlpZiggZ3ZTZXJpYWxpemVyLmNvbmZpZ3VyZUltcGwoKSApCisJCXsKKwkJCWd2U2VyaWFsaXplci5kb3RGb3JtYXQob3V0LCBhU3lzdGVtKTsKKworCQkJcmV0dXJuOworCQl9CisJfQorCWVsc2UKKwl7CisJCUdyYXBoVml6U3RhdGVtYWNoaW5lU2VyaWFsaXplciBndlNlcmlhbGl6ZXIoYU1hbmFnZXIsIFdPYmplY3Q6Ol9OVUxMXyk7CisKKwkJaWYoIGd2U2VyaWFsaXplci5jb25maWd1cmVJbXBsKCkgKQorCQl7CisJCQlndlNlcmlhbGl6ZXIuZG90Rm9ybWF0KG91dCwgYVN5c3RlbSk7CisKKwkJCXJldHVybjsKKwkJfQorCX0KKworCW91dCA8PCAiZGlncmFwaCBmc2NuIHsiIDw8IHN0ZDo6ZW5kbAorCQk8PCAiRVJST1IgWyAiIDw8IHN0ZDo6ZW5kbAorCQk8PCAiXHRsYWJlbD1cIiIKKwkJPDwgIlVuZm91bmQsXG4iCisJCQkiaW4gdGhlIGN1cnJlbnQgU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyLFxcbiIKKwkJCSJhbiBleGlzdGluZyBHcmFwaFZpelN0YXRlbWFjaGluZVNlcmlhbGl6ZXJcXG4iCisJCQkid2hpY2ggY29uZmlndXJhdGlvbiBjb3VsZCBiZSB1c2VkXG4iCisJCQkidG8gY29uZmlndXJlIHRoZSBkZWZhdWx0IEdyYXBoVml6J3Mgc2VyaWFsaXplciFcIiIKKwkJPDwgc3RkOjplbmRsCisJCTw8ICJcdHNoYXBlPXRyaXBsZW9jdGFnb24iIDw8IHN0ZDo6ZW5kbAorCQk8PCAiXHRjb2xvcj1yZWQiIDw8IHN0ZDo6ZW5kbAorCQk8PCAiXHRzdHlsZT1maWxsZWQiICA8PCBzdGQ6OmVuZGwKKwkJPDwgIl0iIDw8IHN0ZDo6ZW5kbAorCQk8PCAifSIgPDwgc3RkOjplbmRsOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBGT1JNQVQgQVBJCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIEdyYXBoVml6U3RhdGVtYWNoaW5lU2VyaWFsaXplcjo6ZG90Rm9ybWF0KAorCQlPdXRTdHJlYW0gJiBvcywgY29uc3QgU3lzdGVtICYgYVN5c3RlbSkKK3sKKwlvcy5zZXRTeW1iZXhWYWx1ZUNTUyhtTXVsdGlWYWx1ZUFycmF5Q1NTLAorCQkJbU11bHRpVmFsdWVQYXJhbXNDU1MsIG1NdWx0aVZhbHVlU3RydWN0Q1NTKTsKKworCW9zIDw8ICJkaWdyYXBoIFwiIiA8PCBhU3lzdGVtLmdldE5hbWVJRCgpIDw8ICJcIiB7IiA8PCBFT0w7CisKKwlvcyA8PCBUQUIgPDwgImNvbXBvdW5kID0gdHJ1ZTsiIDw8IEVPTDsKKworCW9zIDw8IFRBQiA8PCAiZm9udHNpemUgPSAxMiIgPDwgRU9MX0lOQ1JfSU5ERU5UOworCisJZG90Rm9ybWF0U3lzdGVtKG9zLCBhU3lzdGVtKTsKKworCW9zIDw8IERFQ1JfSU5ERU5UX1RBQiA8PCAifSIgPDwgRU9MMl9GTFVTSDsKKworCW9zLnJlc3RvcmVTeW1iZXhWYWx1ZUNTUygpOworfQorCisKK3ZvaWQgR3JhcGhWaXpTdGF0ZW1hY2hpbmVTZXJpYWxpemVyOjpkb3RGb3JtYXRTeXN0ZW0oCisJCU91dFN0cmVhbSAmIG9zLCBjb25zdCBTeXN0ZW0gJiBhU3lzdGVtKQoreworCW9zIDw8IFRBQiA8PCAic3ViZ3JhcGggXCJjbHVzdGVyXyIgPDwgYVN5c3RlbS5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQk8PCAiXCIgeyIgPDwgRU9MOworCisJb3MgPDwgVEFCMiA8PCAibGFiZWwgPSBcIlNZU1RFTSAiIDw8IGFTeXN0ZW0uZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJPDwgIlwiIiA8PCBFT0wyOworCisJb3MgPDwgSU5DUl9JTkRFTlQ7CisKKwlpZiggYVN5c3RlbS5oYXNQcm9jZWR1cmUoKSAmJiBtUHJvY2VkdXJlRmxhZyApCisJeworCQlDb21wb3NpdGVQYXJ0Ojpjb25zdF9wcm9jZWR1cmVfaXRlcmF0b3IgaXRNYWNoaW5lID0KKwkJCQlhU3lzdGVtLmdldENvbXBvc2l0ZVBhcnQoKS0+cHJvY2VkdXJlX2JlZ2luKCk7CisJCUNvbXBvc2l0ZVBhcnQ6OmNvbnN0X3Byb2NlZHVyZV9pdGVyYXRvciBlbmRNYWNoaW5lID0KKwkJCQlhU3lzdGVtLmdldENvbXBvc2l0ZVBhcnQoKS0+cHJvY2VkdXJlX2VuZCgpOworCQlkb3RGb3JtYXRNYWNoaW5lKG9zLCBpdE1hY2hpbmUpOworCQlmb3IoICsraXRNYWNoaW5lOyBpdE1hY2hpbmUgIT0gZW5kTWFjaGluZSA7ICsraXRNYWNoaW5lICkKKwkJeworCQkJb3MgPDwgRU9MOworCQkJZG90Rm9ybWF0TWFjaGluZShvcywgaXRNYWNoaW5lKTsKKwkJfQorCX0KKwlpZiggYVN5c3RlbS5oYXNNYWNoaW5lKCkgKQorCXsKKwkJQ29tcG9zaXRlUGFydDo6Y29uc3RfbWFjaGluZV9pdGVyYXRvciBpdE1hY2hpbmUgPQorCQkJCWFTeXN0ZW0uZ2V0Q29tcG9zaXRlUGFydCgpLT5tYWNoaW5lX2JlZ2luKCk7CisJCUNvbXBvc2l0ZVBhcnQ6OmNvbnN0X21hY2hpbmVfaXRlcmF0b3IgZW5kTWFjaGluZSA9CisJCQkJYVN5c3RlbS5nZXRDb21wb3NpdGVQYXJ0KCktPm1hY2hpbmVfZW5kKCk7CisJCWRvdEZvcm1hdE1hY2hpbmUob3MsIGl0TWFjaGluZSk7CisJCWZvciggKytpdE1hY2hpbmU7IGl0TWFjaGluZSAhPSBlbmRNYWNoaW5lIDsgKytpdE1hY2hpbmUgKQorCQl7CisJCQlvcyA8PCBFT0w7CisJCQlkb3RGb3JtYXRNYWNoaW5lKG9zLCBpdE1hY2hpbmUpOworCQl9CisJfQorCisJb3MgPDwgREVDUl9JTkRFTlQ7CisKKwlvcyA8PCBUQUIgPDwgIn0iIDw8IEVPTF9GTFVTSDsKK30KKworCit2b2lkIEdyYXBoVml6U3RhdGVtYWNoaW5lU2VyaWFsaXplcjo6ZG90Rm9ybWF0TWFjaGluZSgKKwkJT3V0U3RyZWFtICYgb3MsIGNvbnN0IE1hY2hpbmUgKiBhTWFjaGluZSkKK3sKKwlpZiggYU1hY2hpbmUtPmdldFNwZWNpZmllcigpLmlzTW9jQ29tcG9zaXRlU3RydWN0dXJlKCkgKQorCXsKKwkJaWYoIGFNYWNoaW5lLT5nZXRTcGVjaWZpZXIoKS5pc0NvbXBvbmVudFByb2NlZHVyZSgpCisJCQkmJiBhTWFjaGluZS0+Z2V0Q29tcG9zaXRlUGFydCgpLT5nZXRNYWNoaW5lcygpLnNpbmdsZXRvbigpCisJCQkmJiBhTWFjaGluZS0+Z2V0Q29tcG9zaXRlUGFydCgpLT5nZXRNYWNoaW5lcygpLmZpcnN0KCkuCisJCQkJdG9fcHRyPCBNYWNoaW5lID4oKS0+Z2V0U3BlY2lmaWVyKCkuaXNEZXNpZ25JbnN0YW5jZVN0YXRpYygpCisJCQkmJiBhTWFjaGluZS0+Z2V0Q29tcG9zaXRlUGFydCgpLT5nZXRQcm9jZWR1cmVzKCkuZW1wdHkoKSApCisJCXsKKwkJCWRvdEZvcm1hdFN0YXRlbWFjaGluZUNhbGwob3MsIGFNYWNoaW5lKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWRvdEZvcm1hdENvbXBvc2l0ZVN0cnVjdHVyZShvcywgYU1hY2hpbmUpOworCQl9CisJfQorCisJZWxzZSBpZiggYU1hY2hpbmUtPmdldFNwZWNpZmllcigpLmlzTW9jU3RhdGVUcmFuc2l0aW9uU3RydWN0dXJlKCkgKQorCXsKKwkJZG90Rm9ybWF0U3RhdGVUcmFuc2l0aW9uU3RydWN0dXJlKG9zLCBhTWFjaGluZSk7CisJfQorCisJZWxzZSBpZiggYU1hY2hpbmUtPmdldFNwZWNpZmllcigpLmlzU3RhdGUoKSApCisJeworCQlkb3RGb3JtYXRNYWNoaW5lU2ltcGxlU3RhdGUob3MsIGFNYWNoaW5lKTsKKwl9CisJZWxzZSBpZiggYU1hY2hpbmUtPmdldFNwZWNpZmllcigpLmlzUHNldWRvc3RhdGUoKSApCisJeworCQlkb3RGb3JtYXRNYWNoaW5lUHNldWRvU3RhdGUob3MsIGFNYWNoaW5lKTsKKwl9CisKKwllbHNlIGlmKCBhTWFjaGluZS0+Z2V0U3BlY2lmaWVyKCkuaXNEZXNpZ25JbnN0YW5jZVN0YXRpYygpICkKKwl7CisJCWlmKCBtTWFjaGluZUluc3RhbmNlRmxhZworCQkJJiYgKCBtUHJvY2VkdXJlRmxhZworCQkJCXx8IChub3QgYU1hY2hpbmUtPmdldFNwZWNpZmllcigpLmlzQ29tcG9uZW50UHJvY2VkdXJlKCkpICkgKQorCQl7CisJCQlkb3RGb3JtYXRNYWNoaW5lQ2FsbChvcywgYU1hY2hpbmUpOworCQl9CisJfQorCisJZWxzZSAvL2lmKCAobm90IGFNYWNoaW5lLT5nZXRTcGVjaWZpZXIoKS5pc0NvbXBvbmVudFByb2NlZHVyZSgpKQorLy8JCQl8fCBtUHJvY2VkdXJlRmxhZyApCisJeworCQlkb3RGb3JtYXRNYWNoaW5lRGVmYXVsdChvcywgYU1hY2hpbmUpOworCX0KK30KKworCit2b2lkIEdyYXBoVml6U3RhdGVtYWNoaW5lU2VyaWFsaXplcjo6ZG90Rm9ybWF0TWFjaGluZU1vZGVsSW50ZXJmYWNlKAorCQlPdXRTdHJlYW0gJiBvcywgY29uc3QgTWFjaGluZSAqIGFNYWNoaW5lKQoreworCW9zIDw8IFRBQiA8PCAiXCIiIDw8IGFNYWNoaW5lLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQk8PCAiI3BhcmFtZXRlcnNcIiIgPDwgRU9MOworCisJb3MgPDwgVEFCIDw8ICJbIiA8PCBFT0w7CisJb3MgPDwgVEFCMiA8PCAibGFiZWwgPSBcInx7UGFyYW1ldGVyczogIjsKKwlpZiggYU1hY2hpbmUtPmhhc1ZhcmlhYmxlUGFyYW1ldGVyKCkgKQorCXsKKwkJb3MgPDwgIklucHV0IjsKKwkJaWYoIGFNYWNoaW5lLT5oYXNWYXJpYWJsZVJldHVybigpICkKKwkJeworCQkJb3MgPDwgIiAvIE91dHB1dCI7CisJCX0KKwl9CisJZWxzZSAgaWYoIGFNYWNoaW5lLT5oYXNWYXJpYWJsZVJldHVybigpICkKKwl7CisJCW9zIDw8ICJPdXRwdXQiOworCX0KKworCisJaWYoIGFNYWNoaW5lLT5oYXNQYXJhbVJldHVybigpICkKKwl7CisJCXN0ZDo6c3RyaW5nIHN0clZhbHVlOworCisJCWlmKCBhTWFjaGluZS0+aGFzVmFyaWFibGVQYXJhbWV0ZXIoKSApCisJCXsKKwkJCW9zIDw8ICJ8IjsKKworCQkJVGFibGVPZlZhcmlhYmxlOjpjb25zdF9yYXdfaXRlcmF0b3IgaXRQYXJhbSA9CisJCQkJCWFNYWNoaW5lLT5nZXRWYXJpYWJsZVBhcmFtZXRlcnMoKS5iZWdpbigpOworCQkJVGFibGVPZlZhcmlhYmxlOjpjb25zdF9yYXdfaXRlcmF0b3IgZW5kSXQgPQorCQkJCQlhTWFjaGluZS0+Z2V0VmFyaWFibGVQYXJhbWV0ZXJzKCkuZW5kKCk7CisJCQlmb3IoIDsgaXRQYXJhbSAhPSBlbmRJdCA7ICsraXRQYXJhbSApCisJCQl7CisJCQkJb3MgPDwgKGl0UGFyYW0pLT5zdHJUKCkgPDwgIiAiIDw8IChpdFBhcmFtKS0+Z2V0TmFtZUlEKCk7CisJCQkJaWYoIChpdFBhcmFtKS0+aGFzVmFsdWUoKSApCisJCQkJeworCQkJCQlzdHJWYWx1ZSA9IChpdFBhcmFtKS0+cHJldHR5UHJpbnRhYmxlVmFsdWUoKTsKKworCQkJCQlTdHJpbmdUb29sczo6cmVwbGFjZUFsbChzdHJWYWx1ZSwgIlwiIiwgIlxcXCIiKTsKKworCQkJCQlvcyA8PCAiIDo9ICIgPDwgc3RyVmFsdWU7CisJCQkJfQorCQkJCW9zIDw8ICJcbiI7CisJCQl9CisKKwkJfQorCisJCWlmKCBhTWFjaGluZS0+aGFzVmFyaWFibGVSZXR1cm4oKSApCisJCXsKKwkJCW9zIDw8ICJ8IjsKKworCQkJVGFibGVPZlZhcmlhYmxlOjpjb25zdF9yYXdfaXRlcmF0b3IgaXRQYXJhbSA9CisJCQkJCWFNYWNoaW5lLT5nZXRWYXJpYWJsZVJldHVybnMoKS5iZWdpbigpOworCQkJVGFibGVPZlZhcmlhYmxlOjpjb25zdF9yYXdfaXRlcmF0b3IgZW5kSXQgPQorCQkJCQlhTWFjaGluZS0+Z2V0VmFyaWFibGVSZXR1cm5zKCkuZW5kKCk7CisJCQlmb3IoIDsgaXRQYXJhbSAhPSBlbmRJdCA7ICsraXRQYXJhbSApCisJCQl7CisJCQkJb3MgPDwgKGl0UGFyYW0pLT5zdHJUKCkgPDwgIiAiIDw8IChpdFBhcmFtKS0+Z2V0TmFtZUlEKCk7CisJCQkJaWYoIChpdFBhcmFtKS0+aGFzVmFsdWUoKSApCisJCQkJeworCQkJCQlzdHJWYWx1ZSA9IChpdFBhcmFtKS0+cHJldHR5UHJpbnRhYmxlVmFsdWUoKTsKKworCQkJCQlTdHJpbmdUb29sczo6cmVwbGFjZUFsbChzdHJWYWx1ZSwgIlwiIiwgIlxcXCIiKTsKKworCQkJCQlvcyA8PCAiID06ICIgPDwgc3RyVmFsdWU7CisJCQkJfQorCQkJCW9zIDw8ICJcbiI7CisJCQl9CisKKwkJfQorCX0KKwlvcyA8PCAifXxcIiIgPDwgRU9MOworCisJb3MgPDwgVEFCMiA8PCAic2hhcGU9TXJlY29yZCwgc3R5bGU9Ym9sZCwgY29sb3I9Ymx1ZSIgPDwgRU9MOworCisJb3MgPDwgVEFCIDw8ICJdOyIgPDwgRU9MMjsKKworCisJaWYoIGFNYWNoaW5lLT5oYXNPdXRnb2luZ1RyYW5zaXRpb24oKSApCisJeworCQlCZWhhdmlvcmFsUGFydDo6Y29uc3RfdHJhbnNpdGlvbl9pdGVyYXRvciBpdFRyYW5zaXRpb24gPQorCQkJCWFNYWNoaW5lLT5nZXRCZWhhdmlvcigpLT5vdXRnb2luZ190cmFuc2l0aW9uX2JlZ2luKCk7CisJCUJlaGF2aW9yYWxQYXJ0Ojpjb25zdF90cmFuc2l0aW9uX2l0ZXJhdG9yIGVuZFRyYW5zaXRpb24gPQorCQkJCWFNYWNoaW5lLT5nZXRCZWhhdmlvcigpLT5vdXRnb2luZ190cmFuc2l0aW9uX2VuZCgpOworCQlmb3IoIDsgaXRUcmFuc2l0aW9uICE9IGVuZFRyYW5zaXRpb24gOyArK2l0VHJhbnNpdGlvbiApCisJCXsKKwkJCW9zIDw8IEVPTDsKKwkJCWRvdEZvcm1hdFRyYW5zaXRpb24oIG9zLCBpdFRyYW5zaXRpb24pOworCQl9CisJfQorfQorCisKK3ZvaWQgR3JhcGhWaXpTdGF0ZW1hY2hpbmVTZXJpYWxpemVyOjpkb3RGb3JtYXRNYWNoaW5lQ2FsbCgKKwkJT3V0U3RyZWFtICYgb3MsIGNvbnN0IE1hY2hpbmUgKiBhTWFjaGluZSkKK3sKKwlvcyA8PCBUQUIgPDwgIlwiIiA8PCBhTWFjaGluZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiXCIiIDw8IEVPTDsKKworCW9zIDw8IFRBQiA8PCAiWyIgPDwgRU9MOworCW9zIDw8IFRBQjIgPDwgImxhYmVsID0gXCJ8eyI7CisJaWYoIGFNYWNoaW5lLT5nZXRTcGVjaWZpZXIoKS5pc0NvbXBvbmVudFByb2NlZHVyZSgpICkKKwl7CisJCW9zIDw8ICJjYWxsZXI6ICIgPDwgYU1hY2hpbmUtPmdldENvbnRhaW5lck1hY2hpbmUoKS0+Z2V0TmFtZUlEKCk7CisJfQorCWVsc2UKKwl7CisJCW9zIDw8ICJtb2RlbDogIiA8PCBhTWFjaGluZS0+Z2V0TW9kZWxNYWNoaW5lKCktPmdldE5hbWVJRCgpOworCX0KKwlvcyA8PCAifCIgPDwgYU1hY2hpbmUtPmdldE5hbWVJRCgpOworCisJaWYoIGFNYWNoaW5lLT5oYXNQYXJhbVJldHVybigpICkKKwl7CisJCXN0ZDo6c3RyaW5nIHN0clZhbHVlOworCisJCWlmKCBhTWFjaGluZS0+aGFzVmFyaWFibGVQYXJhbWV0ZXIoKSApCisJCXsKKwkJCW9zIDw8ICJ8IjsKKworCQkJVGFibGVPZlZhcmlhYmxlOjpjb25zdF9yYXdfaXRlcmF0b3IgaXRQYXJhbSA9CisJCQkJCWFNYWNoaW5lLT5nZXRWYXJpYWJsZVBhcmFtZXRlcnMoKS5iZWdpbigpOworCQkJVGFibGVPZlZhcmlhYmxlOjpjb25zdF9yYXdfaXRlcmF0b3IgZW5kSXQgPQorCQkJCQlhTWFjaGluZS0+Z2V0VmFyaWFibGVQYXJhbWV0ZXJzKCkuZW5kKCk7CisJCQlmb3IoIDsgaXRQYXJhbSAhPSBlbmRJdCA7ICsraXRQYXJhbSApCisJCQl7CisJCQkJb3MgPDwgKGl0UGFyYW0pLT5nZXROYW1lSUQoKTsKKwkJCQlpZiggKGl0UGFyYW0pLT5oYXNWYWx1ZSgpICkKKwkJCQl7CisJCQkJCXN0clZhbHVlID0gKGl0UGFyYW0pLT5wcmV0dHlQcmludGFibGVWYWx1ZSgpOworCisJCQkJCVN0cmluZ1Rvb2xzOjpyZXBsYWNlQWxsKHN0clZhbHVlLCAiXCIiLCAiXFxcIiIpOworCisJCQkJCW9zIDw8ICIgOj0gIiA8PCBzdHJWYWx1ZTsKKwkJCQl9CisJCQkJb3MgPDwgIlxuIjsKKwkJCX0KKworCQl9CisKKwkJaWYoIGFNYWNoaW5lLT5oYXNWYXJpYWJsZVJldHVybigpICkKKwkJeworCQkJb3MgPDwgInwiOworCisJCQlUYWJsZU9mVmFyaWFibGU6OmNvbnN0X3Jhd19pdGVyYXRvciBpdFBhcmFtID0KKwkJCQkJYU1hY2hpbmUtPmdldFZhcmlhYmxlUmV0dXJucygpLmJlZ2luKCk7CisJCQlUYWJsZU9mVmFyaWFibGU6OmNvbnN0X3Jhd19pdGVyYXRvciBlbmRJdCA9CisJCQkJCWFNYWNoaW5lLT5nZXRWYXJpYWJsZVJldHVybnMoKS5lbmQoKTsKKwkJCWZvciggOyBpdFBhcmFtICE9IGVuZEl0IDsgKytpdFBhcmFtICkKKwkJCXsKKwkJCQlvcyA8PCAoaXRQYXJhbSktPmdldE5hbWVJRCgpOworCQkJCWlmKCAoaXRQYXJhbSktPmhhc1ZhbHVlKCkgKQorCQkJCXsKKwkJCQkJc3RyVmFsdWUgPSAoaXRQYXJhbSktPnByZXR0eVByaW50YWJsZVZhbHVlKCk7CisKKwkJCQkJU3RyaW5nVG9vbHM6OnJlcGxhY2VBbGwoc3RyVmFsdWUsICJcIiIsICJcXFwiIik7CisKKwkJCQkJb3MgPDwgIj06IiA8PCBzdHJWYWx1ZTsKKwkJCQl9CisJCQkJb3MgPDwgIlxuIjsKKwkJCX0KKworCQl9CisJfQorCW9zIDw8ICJ9fFwiIiA8PCBFT0w7CisKKwlvcyA8PCBUQUIyIDw8ICJzaGFwZT1NcmVjb3JkLCBzdHlsZT1ib2xkLCBjb2xvcj1vcmFuZ2UiIDw8IEVPTDsKKworCW9zIDw8IFRBQiA8PCAiXTsiIDw8IEVPTDsKKworCisJaWYoIGFNYWNoaW5lLT5oYXNPdXRnb2luZ1RyYW5zaXRpb24oKSApCisJeworCQlCZWhhdmlvcmFsUGFydDo6Y29uc3RfdHJhbnNpdGlvbl9pdGVyYXRvciBpdFRyYW5zaXRpb24gPQorCQkJCWFNYWNoaW5lLT5nZXRCZWhhdmlvcigpLT5vdXRnb2luZ190cmFuc2l0aW9uX2JlZ2luKCk7CisJCUJlaGF2aW9yYWxQYXJ0Ojpjb25zdF90cmFuc2l0aW9uX2l0ZXJhdG9yIGVuZFRyYW5zaXRpb24gPQorCQkJCWFNYWNoaW5lLT5nZXRCZWhhdmlvcigpLT5vdXRnb2luZ190cmFuc2l0aW9uX2VuZCgpOworCQlmb3IoIDsgaXRUcmFuc2l0aW9uICE9IGVuZFRyYW5zaXRpb24gOyArK2l0VHJhbnNpdGlvbiApCisJCXsKKwkJCW9zIDw8IEVPTDsKKwkJCWRvdEZvcm1hdFRyYW5zaXRpb24oIG9zLCBpdFRyYW5zaXRpb24pOworCQl9CisJfQorfQorCisKK3ZvaWQgR3JhcGhWaXpTdGF0ZW1hY2hpbmVTZXJpYWxpemVyOjpkb3RGb3JtYXRTdGF0ZW1hY2hpbmVDYWxsKAorCQlPdXRTdHJlYW0gJiBvcywgY29uc3QgTWFjaGluZSAqIGFNYWNoaW5lKQoreworCW9zIDw8IFRBQiA8PCAiXCIiIDw8IGFNYWNoaW5lLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8ICJcIiIgPDwgRU9MOworCisJb3MgPDwgVEFCIDw8ICJbIiA8PCBFT0w7CisJb3MgPDwgVEFCMiA8PCAibGFiZWwgPSBcInxcbiIgLy88PCBhTWFjaGluZS0+Z2V0TmFtZUlEKCkgPDwgIlxuXG58XG4iCisJCQk8PCBhTWFjaGluZS0+Z2V0Q29tcG9zaXRlUGFydCgpLT4KKwkJCQlnZXRNYWNoaW5lcygpLmZpcnN0KCkudG9fcHRyPCBNYWNoaW5lID4oKS0+Z2V0TmFtZUlEKCkKKwkJCTw8ICJcblxufFwiIiA8PCBFT0w7CisKKwlvcyA8PCBUQUIyIDw8ICJzaGFwZT1NcmVjb3JkLCBzdHlsZT1ib2xkLCBjb2xvcj1vcmFuZ2UiIDw8IEVPTDsKKworCW9zIDw8IFRBQiA8PCAiXTsiIDw8IEVPTDsKKworCisJaWYoIGFNYWNoaW5lLT5oYXNPdXRnb2luZ1RyYW5zaXRpb24oKSApCisJeworCQlCZWhhdmlvcmFsUGFydDo6Y29uc3RfdHJhbnNpdGlvbl9pdGVyYXRvciBpdFRyYW5zaXRpb24gPQorCQkJCWFNYWNoaW5lLT5nZXRCZWhhdmlvcigpLT5vdXRnb2luZ190cmFuc2l0aW9uX2JlZ2luKCk7CisJCUJlaGF2aW9yYWxQYXJ0Ojpjb25zdF90cmFuc2l0aW9uX2l0ZXJhdG9yIGVuZFRyYW5zaXRpb24gPQorCQkJCWFNYWNoaW5lLT5nZXRCZWhhdmlvcigpLT5vdXRnb2luZ190cmFuc2l0aW9uX2VuZCgpOworCQlmb3IoIDsgaXRUcmFuc2l0aW9uICE9IGVuZFRyYW5zaXRpb24gOyArK2l0VHJhbnNpdGlvbiApCisJCXsKKwkJCW9zIDw8IEVPTDsKKwkJCWRvdEZvcm1hdFRyYW5zaXRpb24oIG9zLCBpdFRyYW5zaXRpb24pOworCQl9CisJfQorfQorCisKK3ZvaWQgR3JhcGhWaXpTdGF0ZW1hY2hpbmVTZXJpYWxpemVyOjpkb3RGb3JtYXRDb21wb3NpdGVTdHJ1Y3R1cmUoCisJCU91dFN0cmVhbSAmIG9zLCBjb25zdCBNYWNoaW5lICogYU1hY2hpbmUpCit7CisJb3MgPDwgVEFCIDw8ICJzdWJncmFwaCBcImNsdXN0ZXJfIiA8PCBhTWFjaGluZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJPDwgIlwiIHsiIDw8IEVPTDsKKworCW9zIDw8IFRBQjIgPDwgImxhYmVsID0gXCIiIDw8IGFNYWNoaW5lLT5nZXROYW1lSUQoKSA8PCAiXCIiIDw8IEVPTDsKKwlvcyA8PCBUQUIyIDw8ICJzdHlsZT1ib2xkIiA8PCAiOyIgPDwgRU9MMjsKKworCS8vIGludmlzaWJsZSB0YXJnZXQgc3RhdGUKKwlvcyA8PCBUQUIyIDw8ICJcIiIgPDwgYU1hY2hpbmUtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIlwiIiA8PCBFT0w7CisJb3MgPDwgVEFCMiA8PCAiWyIgPDwgRU9MOworCW9zIDw8IFRBQjMgPDwgImxhYmVsID0gXCIiIDw8IGFNYWNoaW5lLT5nZXROYW1lSUQoKSA8PCAiXCIiIDw8IEVPTDsKKwlvcyA8PCBUQUIzIDw8ICJzaGFwZT1wb2ludCwgc3R5bGU9aW52aXNpYmxlLCBjb2xvcj13aGl0ZSIgPDwgRU9MOworCW9zIDw8IFRBQjIgPDwgIl07IiA8PCBFT0wyOworCisJb3MgPDwgSU5DUl9JTkRFTlQ7CisKKwlpZiggYU1hY2hpbmUtPmhhc1BhcmFtUmV0dXJuKCkgKQorCXsKKwkJZG90Rm9ybWF0TWFjaGluZU1vZGVsSW50ZXJmYWNlKG9zLCBhTWFjaGluZSk7CisJfQorCisJaWYoIGFNYWNoaW5lLT5oYXNQcm9jZWR1cmUoKSAmJiBtUHJvY2VkdXJlRmxhZyApCisJeworCQlDb21wb3NpdGVQYXJ0Ojpjb25zdF9wcm9jZWR1cmVfaXRlcmF0b3IgaXRNYWNoaW5lID0KKwkJCQlhTWFjaGluZS0+Z2V0Q29tcG9zaXRlUGFydCgpLT5wcm9jZWR1cmVfYmVnaW4oKTsKKwkJQ29tcG9zaXRlUGFydDo6Y29uc3RfcHJvY2VkdXJlX2l0ZXJhdG9yIGVuZE1hY2hpbmUgPQorCQkJCWFNYWNoaW5lLT5nZXRDb21wb3NpdGVQYXJ0KCktPnByb2NlZHVyZV9lbmQoKTsKKwkJZG90Rm9ybWF0TWFjaGluZShvcywgaXRNYWNoaW5lKTsKKwkJZm9yKCArK2l0TWFjaGluZTsgaXRNYWNoaW5lICE9IGVuZE1hY2hpbmUgOyArK2l0TWFjaGluZSApCisJCXsKKwkJCW9zIDw8IEVPTDsKKwkJCWRvdEZvcm1hdE1hY2hpbmUob3MsIGl0TWFjaGluZSk7CisJCX0KKwl9CisJaWYoIGFNYWNoaW5lLT5oYXNNYWNoaW5lKCkgKQorCXsKKwkJQ29tcG9zaXRlUGFydDo6Y29uc3RfbWFjaGluZV9pdGVyYXRvciBpdE1hY2hpbmUgPQorCQkJCWFNYWNoaW5lLT5nZXRDb21wb3NpdGVQYXJ0KCktPm1hY2hpbmVfYmVnaW4oKTsKKwkJQ29tcG9zaXRlUGFydDo6Y29uc3RfbWFjaGluZV9pdGVyYXRvciBlbmRNYWNoaW5lID0KKwkJCQlhTWFjaGluZS0+Z2V0Q29tcG9zaXRlUGFydCgpLT5tYWNoaW5lX2VuZCgpOworCQlkb3RGb3JtYXRNYWNoaW5lKG9zLCBpdE1hY2hpbmUpOworCQlmb3IoICsraXRNYWNoaW5lOyBpdE1hY2hpbmUgIT0gZW5kTWFjaGluZSA7ICsraXRNYWNoaW5lICkKKwkJeworCQkJb3MgPDwgRU9MOworCQkJZG90Rm9ybWF0TWFjaGluZShvcywgaXRNYWNoaW5lKTsKKwkJfQorCX0KKworCW9zIDw8IERFQ1JfSU5ERU5UOworCisJb3MgPDwgVEFCIDw8ICJ9IiA8PCBFT0w7CisKKwlpZiggYU1hY2hpbmUtPmhhc091dGdvaW5nVHJhbnNpdGlvbigpICkKKwl7CisJCUJlaGF2aW9yYWxQYXJ0Ojpjb25zdF90cmFuc2l0aW9uX2l0ZXJhdG9yIGl0VHJhbnNpdGlvbiA9CisJCQkJYU1hY2hpbmUtPmdldEJlaGF2aW9yKCktPm91dGdvaW5nX3RyYW5zaXRpb25fYmVnaW4oKTsKKwkJQmVoYXZpb3JhbFBhcnQ6OmNvbnN0X3RyYW5zaXRpb25faXRlcmF0b3IgZW5kVHJhbnNpdGlvbiA9CisJCQkJYU1hY2hpbmUtPmdldEJlaGF2aW9yKCktPm91dGdvaW5nX3RyYW5zaXRpb25fZW5kKCk7CisJCWZvciggOyBpdFRyYW5zaXRpb24gIT0gZW5kVHJhbnNpdGlvbiA7ICsraXRUcmFuc2l0aW9uICkKKwkJeworCQkJb3MgPDwgRU9MOworCQkJZG90Rm9ybWF0VHJhbnNpdGlvbiggb3MsIGl0VHJhbnNpdGlvbik7CisJCX0KKwl9Cit9CisKKwordm9pZCBHcmFwaFZpelN0YXRlbWFjaGluZVNlcmlhbGl6ZXI6OmRvdEZvcm1hdFN0YXRlVHJhbnNpdGlvblN0cnVjdHVyZSgKKwkJT3V0U3RyZWFtICYgb3MsIGNvbnN0IE1hY2hpbmUgKiBhTWFjaGluZSkKK3sKKwlvcyA8PCBUQUIgPDwgInN1YmdyYXBoIFwiY2x1c3Rlcl8iCisJCQk8PCBhTWFjaGluZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiXCIgeyIgPDwgRU9MOworCisJb3MgPDwgVEFCMiA8PCAibGFiZWwgPSBcIiIgPDwgYU1hY2hpbmUtPmdldE5hbWVJRCgpOworLy8JaWYoIGlzTU9FICkKKy8vCXsKKy8vCQlvcyA8PCAiXFxsIiA8PCAiXFxsIiA8PCBsYWJlbE1PRSk7CisvLwl9CisJb3MgPDwgIlwiIiA8PCBFT0xfVEFCMiA8PCAic3R5bGU9ZGFzaGVkOyIgPDwgRU9MMjsKKworCS8vIGludmlzaWJsZSB0YXJnZXQgc3RhdGUgZm9yIHRyYW5zaXRpb25zCisJb3MgPDwgVEFCMiA8PCAiXCIiIDw8IGFNYWNoaW5lLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8ICJcIiIgPDwgRU9MOworCW9zIDw8IFRBQjIgPDwgIlsiIDw8IEVPTDsKKwlvcyA8PCBUQUIzIDw8ICJsYWJlbCA9IFwiIiA8PCBhTWFjaGluZS0+Z2V0TmFtZUlEKCk7CisKKwlvcyA8PCAiXCIiIDw8IEVPTDsKKwlvcyA8PCBUQUIzIDw8ICJzaGFwZT1wb2ludCwgc3R5bGU9aW52aXNpYmxlLCBjb2xvcj13aGl0ZSIgPDwgRU9MOworCW9zIDw8IFRBQjIgPDwgIl07IiA8PCBFT0wyOworCisJb3MgPDwgSU5DUl9JTkRFTlQ7CisKKwlpZiggYU1hY2hpbmUtPmhhc1BhcmFtUmV0dXJuKCkgKQorCXsKKwkJZG90Rm9ybWF0TWFjaGluZU1vZGVsSW50ZXJmYWNlKG9zLCBhTWFjaGluZSk7CisJfQorCisJaWYoIGFNYWNoaW5lLT5oYXNQcm9jZWR1cmUoKSAmJiBtUHJvY2VkdXJlRmxhZyApCisJeworCQlDb21wb3NpdGVQYXJ0Ojpjb25zdF9wcm9jZWR1cmVfaXRlcmF0b3IgaXRNYWNoaW5lID0KKwkJCQlhTWFjaGluZS0+Z2V0Q29tcG9zaXRlUGFydCgpLT5wcm9jZWR1cmVfYmVnaW4oKTsKKwkJQ29tcG9zaXRlUGFydDo6Y29uc3RfcHJvY2VkdXJlX2l0ZXJhdG9yIGVuZE1hY2hpbmUgPQorCQkJCWFNYWNoaW5lLT5nZXRDb21wb3NpdGVQYXJ0KCktPnByb2NlZHVyZV9lbmQoKTsKKwkJZG90Rm9ybWF0TWFjaGluZShvcywgaXRNYWNoaW5lKTsKKwkJZm9yKCArK2l0TWFjaGluZTsgaXRNYWNoaW5lICE9IGVuZE1hY2hpbmUgOyArK2l0TWFjaGluZSApCisJCXsKKwkJCW9zIDw8IEVPTDsKKwkJCWRvdEZvcm1hdE1hY2hpbmUob3MsIGl0TWFjaGluZSk7CisJCX0KKwl9CisJaWYoIGFNYWNoaW5lLT5oYXNNYWNoaW5lKCkgKQorCXsKKwkJQ29tcG9zaXRlUGFydDo6Y29uc3RfbWFjaGluZV9pdGVyYXRvciBpdE1hY2hpbmUgPQorCQkJCWFNYWNoaW5lLT5nZXRDb21wb3NpdGVQYXJ0KCktPm1hY2hpbmVfYmVnaW4oKTsKKwkJQ29tcG9zaXRlUGFydDo6Y29uc3RfbWFjaGluZV9pdGVyYXRvciBlbmRNYWNoaW5lID0KKwkJCQlhTWFjaGluZS0+Z2V0Q29tcG9zaXRlUGFydCgpLT5tYWNoaW5lX2VuZCgpOworCQlkb3RGb3JtYXRNYWNoaW5lKG9zLCBpdE1hY2hpbmUpOworCQlmb3IoICsraXRNYWNoaW5lOyBpdE1hY2hpbmUgIT0gZW5kTWFjaGluZSA7ICsraXRNYWNoaW5lICkKKwkJeworCQkJb3MgPDwgRU9MOworCQkJZG90Rm9ybWF0TWFjaGluZShvcywgaXRNYWNoaW5lKTsKKwkJfQorCX0KKworCW9zIDw8IERFQ1JfSU5ERU5UOworCisJb3MgPDwgVEFCIDw8ICJ9IiA8PCBFT0w7CisKKwlpZiggYU1hY2hpbmUtPmhhc091dGdvaW5nVHJhbnNpdGlvbigpICkKKwl7CisJCUJlaGF2aW9yYWxQYXJ0Ojpjb25zdF90cmFuc2l0aW9uX2l0ZXJhdG9yIGl0VHJhbnNpdGlvbiA9CisJCQkJYU1hY2hpbmUtPmdldEJlaGF2aW9yKCktPm91dGdvaW5nX3RyYW5zaXRpb25fYmVnaW4oKTsKKwkJQmVoYXZpb3JhbFBhcnQ6OmNvbnN0X3RyYW5zaXRpb25faXRlcmF0b3IgZW5kVHJhbnNpdGlvbiA9CisJCQkJYU1hY2hpbmUtPmdldEJlaGF2aW9yKCktPm91dGdvaW5nX3RyYW5zaXRpb25fZW5kKCk7CisJCWZvciggOyBpdFRyYW5zaXRpb24gIT0gZW5kVHJhbnNpdGlvbiA7ICsraXRUcmFuc2l0aW9uICkKKwkJeworCQkJb3MgPDwgRU9MOworCQkJZG90Rm9ybWF0VHJhbnNpdGlvbiggb3MsIGl0VHJhbnNpdGlvbik7CisJCX0KKwl9Cit9CisKKwordm9pZCBHcmFwaFZpelN0YXRlbWFjaGluZVNlcmlhbGl6ZXI6OmRvdEZvcm1hdE1hY2hpbmVEZWZhdWx0KAorCQlPdXRTdHJlYW0gJiBvcywgY29uc3QgTWFjaGluZSAqIGFNYWNoaW5lKQoreworCWlmKCBhTWFjaGluZS0+aGFzTWFjaGluZSgpIHx8IGFNYWNoaW5lLT5oYXNQYXJhbVJldHVybigpICkKKwl7CisJCWRvdEZvcm1hdENvbXBvc2l0ZVN0cnVjdHVyZShvcywgYU1hY2hpbmUpOworCX0KKwllbHNlCisJeworCQlvcyA8PCBUQUIgPDwgIlwiIiA8PCBhTWFjaGluZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiXCIiIDw8IEVPTDsKKworCQlvcyA8PCBUQUIgPDwgIlsiIDw8IEVPTDsKKwkJb3MgPDwgVEFCMiA8PCAibGFiZWwgPSBcIiIgPDwgYU1hY2hpbmUtPmdldE5hbWVJRCgpIDw8ICJcIiIgPDwgRU9MOworCisJCW9zIDw8IFRBQjIgPDwgInNoYXBlPWJveCwgc3R5bGU9Ym9sZCwgY29sb3I9Ymx1ZSIgPDwgRU9MOworCisJCW9zIDw8IFRBQiA8PCAiXTsiIDw8IEVPTDsKKworCQlpZiggYU1hY2hpbmUtPmhhc091dGdvaW5nVHJhbnNpdGlvbigpICkKKwkJeworCQkJQmVoYXZpb3JhbFBhcnQ6OmNvbnN0X3RyYW5zaXRpb25faXRlcmF0b3IgaXRUcmFuc2l0aW9uID0KKwkJCQkJYU1hY2hpbmUtPmdldEJlaGF2aW9yKCktPm91dGdvaW5nX3RyYW5zaXRpb25fYmVnaW4oKTsKKwkJCUJlaGF2aW9yYWxQYXJ0Ojpjb25zdF90cmFuc2l0aW9uX2l0ZXJhdG9yIGVuZFRyYW5zaXRpb24gPQorCQkJCQlhTWFjaGluZS0+Z2V0QmVoYXZpb3IoKS0+b3V0Z29pbmdfdHJhbnNpdGlvbl9lbmQoKTsKKwkJCWZvciggOyBpdFRyYW5zaXRpb24gIT0gZW5kVHJhbnNpdGlvbiA7ICsraXRUcmFuc2l0aW9uICkKKwkJCXsKKwkJCQlvcyA8PCBFT0w7CisJCQkJZG90Rm9ybWF0VHJhbnNpdGlvbiggb3MsIGl0VHJhbnNpdGlvbik7CisJCQl9CisJCX0KKwl9Cit9CisKKwordm9pZCBHcmFwaFZpelN0YXRlbWFjaGluZVNlcmlhbGl6ZXI6OmRvdEZvcm1hdE1hY2hpbmVTaW1wbGVTdGF0ZSgKKwkJT3V0U3RyZWFtICYgb3MsIGNvbnN0IE1hY2hpbmUgKiBhTWFjaGluZSkKK3sKKwlvcyA8PCBUQUIgPDwgIlwiIiA8PCBhTWFjaGluZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiXCIiIDw8IEVPTDsKKworCW9zIDw8IFRBQiA8PCAiWyIgPDwgRU9MOworCW9zIDw8IFRBQjIgPDwgImxhYmVsID0gXCIiIDw8IGFNYWNoaW5lLT5nZXROYW1lSUQoKSA8PCAiXCIiIDw8IEVPTDsKKworCW9zIDw8IFRBQjI7CisJaWYoIGFNYWNoaW5lLT5nZXRTcGVjaWZpZXIoKS5pc1N0YXRlU3RhcnQoKSApCisJeworCQlvcyA8PCAic2hhcGU9ZWxsaXBzZSwgc3R5bGU9XCJib2xkLGZpbGxlZFwiLCBmaWxsY29sb3I9Z3JlZW4iOworCX0KKwllbHNlIGlmKCBhTWFjaGluZS0+Z2V0U3BlY2lmaWVyKCkuaXNTdGF0ZUZpbmFsKCkgKQorCXsKKwkJb3MgPDwgInNoYXBlPU1jaXJjbGUsIHN0eWxlPVwiYm9sZCxmaWxsZWRcIiwgZmlsbGNvbG9yPXJlZCI7CisJfQorCWVsc2UgaWYoIGFNYWNoaW5lLT5nZXRTcGVjaWZpZXIoKS5pc1N0YXRlU3luYygpICkKKwl7CisJCW9zIDw8ICJzaGFwZT1kb3VibGVjaXJjbGUsIHN0eWxlPVwiYm9sZCxmaWxsZWRcIiwgY29sb3I9b3JhbmdlIjsKKwl9CisJZWxzZQorCXsKKwkJb3MgPDwgInNoYXBlPWVsbGlwc2UsIHN0eWxlPVwiYm9sZCxmaWxsZWRcIiwgY29sb3I9c2t5Ymx1ZSI7CisJfQorCW9zIDw8IEVPTDsKKworCW9zIDw8IFRBQiA8PCAiXTsiIDw8IEVPTDsKKworCisJaWYoIGFNYWNoaW5lLT5oYXNPdXRnb2luZ1RyYW5zaXRpb24oKSApCisJeworCQlCZWhhdmlvcmFsUGFydDo6Y29uc3RfdHJhbnNpdGlvbl9pdGVyYXRvciBpdFRyYW5zaXRpb24gPQorCQkJCWFNYWNoaW5lLT5nZXRCZWhhdmlvcigpLT5vdXRnb2luZ190cmFuc2l0aW9uX2JlZ2luKCk7CisJCUJlaGF2aW9yYWxQYXJ0Ojpjb25zdF90cmFuc2l0aW9uX2l0ZXJhdG9yIGVuZFRyYW5zaXRpb24gPQorCQkJCWFNYWNoaW5lLT5nZXRCZWhhdmlvcigpLT5vdXRnb2luZ190cmFuc2l0aW9uX2VuZCgpOworCQlmb3IoIDsgaXRUcmFuc2l0aW9uICE9IGVuZFRyYW5zaXRpb24gOyArK2l0VHJhbnNpdGlvbiApCisJCXsKKwkJCW9zIDw8IEVPTDsKKwkJCWRvdEZvcm1hdFRyYW5zaXRpb24oIG9zLCBpdFRyYW5zaXRpb24pOworCQl9CisJfQorfQorCisKK3ZvaWQgR3JhcGhWaXpTdGF0ZW1hY2hpbmVTZXJpYWxpemVyOjpkb3RGb3JtYXRNYWNoaW5lUHNldWRvU3RhdGUoCisJCU91dFN0cmVhbSAmIG9zLCBjb25zdCBNYWNoaW5lICogYU1hY2hpbmUpCit7CisJb3MgPDwgVEFCIDw8ICJcIiIgPDwgYU1hY2hpbmUtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIlwiIiA8PCBFT0w7CisKKwlvcyA8PCBUQUIgPDwgIlsiIDw8IEVPTDsKKwlvcyA8PCBUQUIyIDw8ICJsYWJlbCA9IFwiIiA8PCBhTWFjaGluZS0+Z2V0TmFtZUlEKCkgPDwgIlwiIiA8PCBFT0w7CisKKwlvcyA8PCBUQUIyOworCWlmKCBhTWFjaGluZS0+Z2V0U3BlY2lmaWVyKCkuaXNQc2V1ZG9zdGF0ZUluaXRpYWwoKSApCisJeworCQlvcyA8PCAic2hhcGU9b3ZhbCwgc3R5bGU9XCJmaWxsZWRcIiwgZmlsbGNvbG9yPWdyZWVuIjsKKwl9CisJZWxzZSBpZiggYU1hY2hpbmUtPmdldFNwZWNpZmllcigpLmlzUHNldWRvc3RhdGVKdW5jdGlvbigpICkKKwl7CisJCW9zIDw8ICJzaGFwZT1vY3RhZ29uLCBzdHlsZT1cImZpbGxlZFwiLCBmaWxsY29sb3I9Z3JlZW4iOworCX0KKwllbHNlIGlmKCBhTWFjaGluZS0+Z2V0U3BlY2lmaWVyKCkuaXNQc2V1ZG9zdGF0ZUNob2ljZSgpICkKKwl7CisJCW9zIDw8ICJzaGFwZT1vY3RhZ29uLCBzdHlsZT1cImZpbGxlZFwiLCBmaWxsY29sb3I9b3JhbmdlIjsKKwl9CisJZWxzZSBpZiggYU1hY2hpbmUtPmdldFNwZWNpZmllcigpLmlzUHNldWRvc3RhdGVUZXJtaW5hbCgpICkKKwl7CisJCW9zIDw8ICJzaGFwZT1Nc3F1YXJlLCBzdHlsZT1cImZpbGxlZFwiLCBmaWxsY29sb3I9cmVkIjsKKwl9CisJZWxzZSBpZiggYU1hY2hpbmUtPmdldFNwZWNpZmllcigpLmlzUHNldWRvc3RhdGVSZXR1cm4oKSApCisJeworCQlvcyA8PCAic2hhcGU9aW52aG91c2UsIHN0eWxlPVwiZmlsbGVkXCIsIGZpbGxjb2xvcj1ncmVlbnllbGxvdyI7CisJfQorCWVsc2UKKwl7CisJCW9zIDw8ICJzaGFwZT1lbGxpcHNlLCBzdHlsZT1cImZpbGxlZFwiLCBjb2xvcj1jeWFuIjsKKwl9CisJb3MgPDwgRU9MOworCisJb3MgPDwgVEFCIDw8ICJdOyIgPDwgRU9MOworCisKKwlpZiggYU1hY2hpbmUtPmhhc091dGdvaW5nVHJhbnNpdGlvbigpICkKKwl7CisJCUJlaGF2aW9yYWxQYXJ0Ojpjb25zdF90cmFuc2l0aW9uX2l0ZXJhdG9yIGl0VHJhbnNpdGlvbiA9CisJCQkJYU1hY2hpbmUtPmdldEJlaGF2aW9yKCktPm91dGdvaW5nX3RyYW5zaXRpb25fYmVnaW4oKTsKKwkJQmVoYXZpb3JhbFBhcnQ6OmNvbnN0X3RyYW5zaXRpb25faXRlcmF0b3IgZW5kVHJhbnNpdGlvbiA9CisJCQkJYU1hY2hpbmUtPmdldEJlaGF2aW9yKCktPm91dGdvaW5nX3RyYW5zaXRpb25fZW5kKCk7CisJCWZvciggOyBpdFRyYW5zaXRpb24gIT0gZW5kVHJhbnNpdGlvbiA7ICsraXRUcmFuc2l0aW9uICkKKwkJeworCQkJb3MgPDwgRU9MOworCQkJZG90Rm9ybWF0VHJhbnNpdGlvbiggb3MsIGl0VHJhbnNpdGlvbik7CisJCX0KKwl9Cit9CisKKwordm9pZCBHcmFwaFZpelN0YXRlbWFjaGluZVNlcmlhbGl6ZXI6OmRvdEZvcm1hdFRyYW5zaXRpb24oCisJCU91dFN0cmVhbSAmIG9zLCBjb25zdCBUcmFuc2l0aW9uICogYVRyYW5zaXRpb24pCit7CisJLy8gU09VUkNFIC0+IFRBUkdFVAorCXN0ZDo6c3RyaW5nIHRhcmdldFVmaSA9IChhVHJhbnNpdGlvbi0+aGFzVGFyZ2V0KCkgPworCQkJYVRyYW5zaXRpb24tPmdldFRhcmdldCgpLnN0cigpIDogIiNMYXN0I0FjdGl2ZSNTdGF0ZSIgKTsKKworCW9zIDw8IFRBQiA8PCAiXCIiIDw8IGFUcmFuc2l0aW9uLT5nZXRTb3VyY2UoKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJPDwgIlwiIC0+ICIgPDwgIlwiIiA8PCB0YXJnZXRVZmkgPDwgIlwiICIKKwkJCTw8ICJbIGxhYmVsID0gXCIiIDw8IGFUcmFuc2l0aW9uLT5nZXROYW1lSUQoKSA8PCAiXCIiOworCisJaWYoIGFUcmFuc2l0aW9uLT5oYXNNb2NFbHNlKCkgKQorCXsKKwkJb3MgPDwgIiwgY29sb3I9b3JhbmdlIjsKKwl9CisKKwlvcyA8PCAiIF07IiA8PCBFT0xfRkxVU0g7Cit9CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vc2VyaWFsaXplci9HcmFwaFZpelN0YXRlbWFjaGluZVNlcmlhbGl6ZXIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9zZXJpYWxpemVyL0dyYXBoVml6U3RhdGVtYWNoaW5lU2VyaWFsaXplci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0N2Q2MzAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vc2VyaWFsaXplci9HcmFwaFZpelN0YXRlbWFjaGluZVNlcmlhbGl6ZXIuaApAQCAtMCwwICsxLDIwOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDIyIG1hcnMgMjAxNgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEZBTV9TRVJJQUxJWkVSX0dSQVBIVklaU1RBVEVNQUNISU5FU0VSSUFMSVpFUl9IXworI2RlZmluZSBGQU1fU0VSSUFMSVpFUl9HUkFQSFZJWlNUQVRFTUFDSElORVNFUklBTElaRVJfSF8KKworI2luY2x1ZGUgPGZhbS9zZXJpYWxpemVyL1NlcmlhbGl6ZXIuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKK2NsYXNzIE91dFN0cmVhbTsKK2NsYXNzIEF2bVNlcmlhbGl6ZXJQcm9jZXNzb3I7CitjbGFzcyBNYWNoaW5lOworY2xhc3MgU3lzdGVtOworY2xhc3MgVHJhbnNpdGlvbjsKKworCitjbGFzcyBHcmFwaFZpelN0YXRlbWFjaGluZVNlcmlhbGl6ZXIgOgorCQlwdWJsaWMgQXV0b1JlZ2lzdGVyZWRTZXJpYWxpemVyUHJvY2Vzc29yVW5pdDwgR3JhcGhWaXpTdGF0ZW1hY2hpbmVTZXJpYWxpemVyID4KK3sKKworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBHcmFwaFZpelN0YXRlbWFjaGluZVNlcmlhbGl6ZXIgKQorCisKKwkvKioKKwkgKiBQUk9DRVNTT1IgRkFDVE9SWQorCSAqIGZvciBhdXRvbWF0aWMgcmVnaXN0cmF0aW9uIGluIHRoZSBwcm9jZXNzb3IgcmVwb3NpdG9yeQorCSAqIHRoZSBbIFsgRlVMTFkgXSBRVUFMSUZJRUQgXSBOQU1FIElECisJICovCisJQVZNX0lOSkVDVF9BVVRPX1JFR0lTVEVSX1FVQUxJRklFRF9JRF9LRVlfMigKKwkJCSJzZXJpYWxpemVyI21vZGVsI2dyYXBodml6IiwKKwkJCSJHcmFwaFZpelN0YXRlbWFjaGluZVNlcmlhbGl6ZXIiKQorCS8vIGVuZCByZWdpc3RyYXRpb24KKworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQVRUUklCVVRFCisJICovCisJYm9vbCBtTWFjaGluZUZsYWc7CisJYm9vbCBtTWFjaGluZUluc3RhbmNlRmxhZzsKKwlib29sIG1NYWNoaW5lTW9kZWxGbGFnOworCWJvb2wgbU1hY2hpbmVQcm90b3R5cGVGbGFnOworCisJYm9vbCBtUHJvY2VkdXJlRmxhZzsKKwlib29sIG1Qcm9ncmFtRmxhZzsKKwlib29sIG1Sb3V0aW5lRmxhZzsKKworCWJvb2wgbVN0YXRlbWFjaGluZUZsYWc7CisKKwlib29sIG1TdGF0ZW1hY2hpbmVEaXNhYmxlRmxhZzsKKwlib29sIG1TdGF0ZW1hY2hpbmVFbmFibGVGbGFnOworCisJYm9vbCBtVHJhbnNpdGlvbkZsYWc7CisJYm9vbCBtVHJhbnNpdGlvblByaW9yaXR5RmxhZzsKKworCWJvb2wgbVN0YXRlbWVudEZsYWc7CisJYm9vbCBtU3RhdGVtZW50QXNzaWduRmxhZzsKKworCWJvb2wgbVN0YXRlbWVudENvbUZsYWc7CisJYm9vbCBtU3RhdGVtZW50Q29tRW52RmxhZzsKKworCWJvb2wgbVN0YXRlbWVudElucHV0RmxhZzsKKwlib29sIG1TdGF0ZW1lbnRJbnB1dEVudkZsYWc7CisKKwlib29sIG1TdGF0ZW1lbnRPdXB1dEZsYWc7CisJYm9vbCBtU3RhdGVtZW50T3VwdXRFbnZGbGFnOworCisJYm9vbCBtU3RhdGVtZW50R3VhcmRGbGFnOworCWJvb2wgbVN0YXRlbWVudFRlc3RGbGFnOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwkJCUdyYXBoVml6U3RhdGVtYWNoaW5lU2VyaWFsaXplcigKKwkJCVN5bWJleENvbnRyb2xsZXJVbml0TWFuYWdlciAmIGFNYW5hZ2VyLCBXT2JqZWN0ICogd2ZQYXJhbWV0ZXJPYmplY3QpCisJOiBSZWdpc3RlcmVkU2VyaWFsaXplclByb2Nlc3NvclVuaXQoYU1hbmFnZXIsIHdmUGFyYW1ldGVyT2JqZWN0LAorCQkJQVZNX1BSRV9QUk9DRVNTSU5HX1NUQUdFLCBERUZBVUxUX1BSRUNFREVOQ0VfT0ZfU0VSSUFMSVpFUl9QUk9DRVNTT1IpLAorCisJbU1hY2hpbmVGbGFnKCB0cnVlICksCisKKwltTWFjaGluZUluc3RhbmNlRmxhZyggdHJ1ZSApLAorCW1NYWNoaW5lTW9kZWxGbGFnKCB0cnVlICksCisJbU1hY2hpbmVQcm90b3R5cGVGbGFnKCB0cnVlICksCisKKwltUHJvY2VkdXJlRmxhZyggdHJ1ZSApLAorCW1Qcm9ncmFtRmxhZyggdHJ1ZSApLAorCW1Sb3V0aW5lRmxhZyggdHJ1ZSApLAorCW1TdGF0ZW1hY2hpbmVGbGFnKCB0cnVlICksCisKKwltU3RhdGVtYWNoaW5lRGlzYWJsZUZsYWcoIHRydWUgKSwKKwltU3RhdGVtYWNoaW5lRW5hYmxlRmxhZyggdHJ1ZSApLAorCisJbVRyYW5zaXRpb25GbGFnKCB0cnVlICksCisJbVRyYW5zaXRpb25Qcmlvcml0eUZsYWcoIGZhbHNlICksCisKKwltU3RhdGVtZW50RmxhZyggZmFsc2UgKSwKKwltU3RhdGVtZW50QXNzaWduRmxhZyggZmFsc2UgKSwKKworCW1TdGF0ZW1lbnRDb21GbGFnKCB0cnVlICksCisJbVN0YXRlbWVudENvbUVudkZsYWcoIGZhbHNlICksCisKKwltU3RhdGVtZW50SW5wdXRGbGFnKCBmYWxzZSApLAorCW1TdGF0ZW1lbnRJbnB1dEVudkZsYWcoIGZhbHNlICksCisKKwltU3RhdGVtZW50T3VwdXRGbGFnKCBmYWxzZSApLAorCW1TdGF0ZW1lbnRPdXB1dEVudkZsYWcoIGZhbHNlICksCisKKwltU3RhdGVtZW50R3VhcmRGbGFnKCBmYWxzZSApLAorCW1TdGF0ZW1lbnRUZXN0RmxhZyggZmFsc2UgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkdyYXBoVml6U3RhdGVtYWNoaW5lU2VyaWFsaXplcigpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIENPTkZJR1VSRQorCSAqLworCXZpcnR1YWwgYm9vbCBjb25maWd1cmVJbXBsKCk7CisKKwkvKioKKwkgKiBSRVBPUlQgVFJBQ0UKKwkgKi8KKwl2aXJ0dWFsIHZvaWQgcmVwb3J0RGVmYXVsdChPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKKwkvKioKKwkgKiBQUkUtUE9TVCBQUk9DRVNTSU5HIEFQSQorCSAqLworCXZpcnR1YWwgYm9vbCBwcmVwcm9jZXNzKCk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBERUZBVUxUIEZPUk1BVCBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlzdGF0aWMgdm9pZCBmb3JtYXQoU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyICYgYU1hbmFnZXIsCisJCQlPdXRTdHJlYW0gJiBvdXQsIGNvbnN0IFN5c3RlbSAmIGFTeXN0ZW0pOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gRk9STUFUIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXZvaWQgZG90Rm9ybWF0KE91dFN0cmVhbSAmIG9zLCBjb25zdCBTeXN0ZW0gJiBhU3lzdGVtKTsKKworCXZvaWQgZG90Rm9ybWF0U3lzdGVtKE91dFN0cmVhbSAmIG9zLCBjb25zdCBTeXN0ZW0gJiBhU3lzdGVtKTsKKworCXZvaWQgZG90Rm9ybWF0TWFjaGluZShPdXRTdHJlYW0gJiBvcywgY29uc3QgTWFjaGluZSAqIGFNYWNoaW5lKTsKKworCisJdm9pZCBkb3RGb3JtYXRNYWNoaW5lTW9kZWxJbnRlcmZhY2UoCisJCQlPdXRTdHJlYW0gJiBvcywgY29uc3QgTWFjaGluZSAqIGFNYWNoaW5lKTsKKworCXZvaWQgZG90Rm9ybWF0TWFjaGluZUNhbGwoCisJCQlPdXRTdHJlYW0gJiBvcywgY29uc3QgTWFjaGluZSAqIGFNYWNoaW5lKTsKKworCXZvaWQgZG90Rm9ybWF0U3RhdGVtYWNoaW5lQ2FsbCgKKwkJCU91dFN0cmVhbSAmIG9zLCBjb25zdCBNYWNoaW5lICogYU1hY2hpbmUpOworCisJdm9pZCBkb3RGb3JtYXRDb21wb3NpdGVTdHJ1Y3R1cmUoCisJCQlPdXRTdHJlYW0gJiBvcywgY29uc3QgTWFjaGluZSAqIGFNYWNoaW5lKTsKKwl2b2lkIGRvdEZvcm1hdFN0YXRlVHJhbnNpdGlvblN0cnVjdHVyZSgKKwkJCU91dFN0cmVhbSAmIG9zLCBjb25zdCBNYWNoaW5lICogYU1hY2hpbmUpOworCisJdm9pZCBkb3RGb3JtYXRNYWNoaW5lRGVmYXVsdCgKKwkJCU91dFN0cmVhbSAmIG9zLCBjb25zdCBNYWNoaW5lICogYU1hY2hpbmUpOworCisKKwl2b2lkIGRvdEZvcm1hdE1hY2hpbmVTaW1wbGVTdGF0ZSgKKwkJCU91dFN0cmVhbSAmIG9zLCBjb25zdCBNYWNoaW5lICogYU1hY2hpbmUpOworCisJdm9pZCBkb3RGb3JtYXRNYWNoaW5lUHNldWRvU3RhdGUoCisJCQlPdXRTdHJlYW0gJiBvcywgY29uc3QgTWFjaGluZSAqIGFNYWNoaW5lKTsKKworCXZvaWQgZG90Rm9ybWF0VHJhbnNpdGlvbigKKwkJCU91dFN0cmVhbSAmIG9zLCBjb25zdCBUcmFuc2l0aW9uICogYVRyYW5zaXRpb24pOworCit9OworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworCisjZW5kaWYgLyogRkFNX1NFUklBTElaRVJfR1JBUEhWSVpTVEFURU1BQ0hJTkVTRVJJQUxJWkVSX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vc2VyaWFsaXplci9TZXJpYWxpemVyLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS9zZXJpYWxpemVyL1NlcmlhbGl6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZmIyMGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vc2VyaWFsaXplci9TZXJpYWxpemVyLmNwcApAQCAtMCwwICsxLDk4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjIgbWFycyAyMDE2CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJTZXJpYWxpemVyLmgiCisKKyNpbmNsdWRlIDxmbWwvd29ya2Zsb3cvUXVlcnkuaD4KKyNpbmNsdWRlIDxmbWwvd29ya2Zsb3cvV09iamVjdC5oPgorCisjaW5jbHVkZSA8Ym9vc3QvZm9ybWF0LmhwcD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENPTkZJR1VSRSBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorcHJvdG90eXBlIHByb2Nlc3Nvcjo6c2VyaWFsaXplciNncmFwaCAic2VyaWFsaXplIGdyYXBoIiBhcyBhdm06OnByb2Nlc3Nvci5TRVJJQUxJWkVSIGlzCitzZWN0aW9uIFBST1BFUlRZCisJQGluZm8jc2VsZWN0aW9uID0gJ0FMTCc7ICAgIC8vIEFMTCB8IE1PRElGSUVECisJQGRhdGEjc2VsZWN0aW9uID0gJ0FMTCc7CS8vIEFMTCB8IE1PRElGSUVECitlbmRzZWN0aW9uIFBST1BFUlRZCisKK3NlY3Rpb24gRk9STUFUCisJQGxpbmUjd3JhcCN3aWR0aCA9IDQyOworCUBsaW5lI3dyYXAjc2VwYXJhdG9yID0gIlxcbCI7CitlbmRzZWN0aW9uIEZPUk1BVAorCitlbmRwcm90b3R5cGUKKyovCisKK2Jvb2wgU2VyaWFsaXplcjo6Y29uZmlndXJlSW1wbCgpCit7CisJV09iamVjdCAqIHRoZVBST1BFUlRZID0gUXVlcnk6OmdldFJlZ2V4V1NlcXVlbmNlKAorCQkJZ2V0UGFyYW1ldGVyV09iamVjdCgpLCBPUl9XSUQyKCJwcm9wZXJ0eSIsICJQUk9QRVJUWSIpKTsKKwlpZiggdGhlUFJPUEVSVFkgIT0gV09iamVjdDo6X05VTExfICkKKwl7CisJCW1JbmZvQWxsRmxhZ3MgPSAoUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5U3RyaW5nKAorCQkJCXRoZVBST1BFUlRZLCBDT05TX1dJRDIoImluZm8iLCAic2VsZWN0aW9uIiksICJBTEwiKSA9PSAiQUxMIik7CisKKwkJbURhdGFTZWxlY3Rpb25Nb2RpZmllZEZsYWdzID0gKFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eVN0cmluZygKKwkJCXRoZVBST1BFUlRZLCBDT05TX1dJRDIoImRhdGEiLCAic2VsZWN0aW9uIiksICJNT0RJRklFRCIpID09ICJNT0RJRklFRCIpOworCX0KKworCVdPYmplY3QgKiB0aGVGT1JNQVQgPSBRdWVyeTo6Z2V0UmVnZXhXU2VxdWVuY2UoZ2V0UGFyYW1ldGVyV09iamVjdCgpLAorCQkJT1JfV0lEMigiZm9ybWF0IiwgIkZPUk1BVCIpLCB0aGVQUk9QRVJUWSk7CisJaWYoIHRoZUZPUk1BVCAhPSBXT2JqZWN0OjpfTlVMTF8gKQorCXsKKwkJbVdyYXBEYXRhLkxJTkVfV0lEVEggPSBRdWVyeTo6Z2V0UmVnZXhXUHJvcGVydHlQb3NTaXplVCh0aGVGT1JNQVQsCisJCQlDT05TX1dJRDMoImxpbmUiLCAid3JhcCIsICJ3aWR0aCIpLCBtRGVmYXVsdExpbmVXcmFwV2lkdGgpOworCisJCW1XcmFwRGF0YS5TRVBBUkFUT1IgPSBRdWVyeTo6Z2V0UmVnZXhXUHJvcGVydHlTdHJpbmcodGhlRk9STUFULAorCQkJQ09OU19XSUQzKCJsaW5lIiwgIndyYXAiLCAic2VwYXJhdG9yIiksIG1XcmFwRGF0YS5TRVBBUkFUT1IpOworCQlTdHJpbmdUb29sczo6cmVwbGFjZUFsbChtV3JhcERhdGEuU0VQQVJBVE9SLCAiXFx0IiAsICJcdCIpOworCQlTdHJpbmdUb29sczo6cmVwbGFjZUFsbChtV3JhcERhdGEuU0VQQVJBVE9SLCAiXFxuIiAsICJcbiIpOworCisJCW1NdWx0aVZhbHVlQXJyYXlDU1MuQkVHSU4gPSBRdWVyeTo6Z2V0UmVnZXhXUHJvcGVydHlTdHJpbmcoCisJCQkJdGhlRk9STUFULCBDT05TX1dJRDMoInZhbHVlIiwgImFycmF5IiwgImJlZ2luIiksICJbICIpOworCQltTXVsdGlWYWx1ZUFycmF5Q1NTLlNFUEFSQVRPUiA9IFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eVN0cmluZygKKwkJCXRoZUZPUk1BVCwgQ09OU19XSUQzKCJ2YWx1ZSIsICJhcnJheSIsICJzZXBhcmF0b3IiKSwgIiAsICIpOworCQltTXVsdGlWYWx1ZUFycmF5Q1NTLkVORCA9IFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eVN0cmluZygKKwkJCQl0aGVGT1JNQVQsIENPTlNfV0lEMygidmFsdWUiLCAiYXJyYXkiLCAiZW5kIiksICIgXSIpOworCisJCW1NdWx0aVZhbHVlUGFyYW1zQ1NTLkJFR0lOID0gUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5U3RyaW5nKHRoZUZPUk1BVCwKKwkJCQlDT05TX1dJRDMoInZhbHVlIiwgInBhcmFtKGV0ZXIpP3M/IiwgImJlZ2luIiksICIoICIpOworCQltTXVsdGlWYWx1ZVBhcmFtc0NTUy5TRVBBUkFUT1IgPSBRdWVyeTo6Z2V0UmVnZXhXUHJvcGVydHlTdHJpbmcodGhlRk9STUFULAorCQkJCUNPTlNfV0lEMygidmFsdWUiLCAicGFyYW0oZXRlcik/cz8iLCAic2VwYXJhdG9yIiksICIgLCAiKTsKKwkJbU11bHRpVmFsdWVQYXJhbXNDU1MuRU5EID0gUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5U3RyaW5nKHRoZUZPUk1BVCwKKwkJCQlDT05TX1dJRDMoInZhbHVlIiwgInBhcmFtKGV0ZXIpP3M/IiwgImVuZCIpLCAiICkiKTsKKworCQltTXVsdGlWYWx1ZVN0cnVjdENTUy5CRUdJTiA9IFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eVN0cmluZygKKwkJCXRoZUZPUk1BVCwgQ09OU19XSUQzKCJ2YWx1ZSIsICJzdHJ1Y3QiLCAiYmVnaW4iKSwgInsgIik7CisJCW1NdWx0aVZhbHVlU3RydWN0Q1NTLlNFUEFSQVRPUiA9IFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eVN0cmluZygKKwkJCXRoZUZPUk1BVCwgQ09OU19XSUQzKCJ2YWx1ZSIsICJzdHJ1Y3QiLCAic2VwYXJhdG9yIiksICIgLCAiKTsKKwkJbU11bHRpVmFsdWVTdHJ1Y3RDU1MuRU5EID0gUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5U3RyaW5nKAorCQkJCXRoZUZPUk1BVCwgQ09OU19XSUQzKCJ2YWx1ZSIsICJzdHJ1Y3QiLCAiZW5kIiksICIgfSIpOworCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3NlcmlhbGl6ZXIvU2VyaWFsaXplci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3NlcmlhbGl6ZXIvU2VyaWFsaXplci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZThjM2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vc2VyaWFsaXplci9TZXJpYWxpemVyLmgKQEAgLTAsMCArMSwxNjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyMiBtYXJzIDIwMTYKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBGQU1fU0VSSUFMSVpFUl9TRVJJQUxJWkVSX0hfCisjZGVmaW5lIEZBTV9TRVJJQUxJWkVSX1NFUklBTElaRVJfSF8KKworI2luY2x1ZGUgPGZhbS9hcGkvQWJzdHJhY3RQcm9jZXNzb3JVbml0Lmg+CisKKyNpbmNsdWRlIDxwcmludGVyL091dFN0cmVhbS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworY2xhc3MgU2VyaWFsaXplciA6ICBwdWJsaWMgQWJzdHJhY3RQcm9jZXNzb3JVbml0Cit7CisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBBVFRSSUJVVEUKKwkgKi8KKwlzdGF0aWMgY29uc3QgYXZtX3NpemVfdCAgbURlZmF1bHRMaW5lV3JhcFdpZHRoID0gNDI7CisKKwlXcmFwRGF0YSBtV3JhcERhdGE7CisKKwlib29sIG1JbmZvQWxsRmxhZ3M7CisJYm9vbCBtRGF0YVNlbGVjdGlvbk1vZGlmaWVkRmxhZ3M7CisKKwlTeW1iZXhWYWx1ZUNTUyBtTXVsdGlWYWx1ZUFycmF5Q1NTOworCVN5bWJleFZhbHVlQ1NTIG1NdWx0aVZhbHVlUGFyYW1zQ1NTOworCVN5bWJleFZhbHVlQ1NTIG1NdWx0aVZhbHVlU3RydWN0Q1NTOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlTZXJpYWxpemVyKFN5bWJleENvbnRyb2xsZXJVbml0TWFuYWdlciAmIGFNYW5hZ2VyLCBXT2JqZWN0ICogd2ZQYXJhbWV0ZXJPYmplY3QsCisJCQlhdm1fY29tcHV0aW5nX3Byb2Nlc3Nfc3RhZ2VfdCByZXF1aXJlZFN0YWdlLAorCQkJY29uc3QgYXZtX3VpbnQ4X3QgKiBhUHJlY2VkZW5jZS8qID0gREVGQVVMVF9QUkVDRURFTkNFX09GX1BST0NFU1NPUiovKQorCTogQWJzdHJhY3RQcm9jZXNzb3JVbml0KGFNYW5hZ2VyLCB3ZlBhcmFtZXRlck9iamVjdCwgcmVxdWlyZWRTdGFnZSwgYVByZWNlZGVuY2UpLAorCW1XcmFwRGF0YSggbURlZmF1bHRMaW5lV3JhcFdpZHRoICwgMCAsIDQgLCJcbiIgKSwKKworCW1JbmZvQWxsRmxhZ3MoIHRydWUgKSwKKwltRGF0YVNlbGVjdGlvbk1vZGlmaWVkRmxhZ3MoIHRydWUgKSwKKworCW1NdWx0aVZhbHVlQXJyYXlDU1MgKCBERUZBVUxUX1NZTUJFWF9WQUxVRV9BUlJBWV9DU1MgICksCisJbU11bHRpVmFsdWVQYXJhbXNDU1MoIERFRkFVTFRfU1lNQkVYX1ZBTFVFX1BBUkFNU19DU1MgKSwKKwltTXVsdGlWYWx1ZVN0cnVjdENTUyggREVGQVVMVF9TWU1CRVhfVkFMVUVfU1RSVUNUX0NTUyApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+U2VyaWFsaXplcigpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIENPTkZJR1VSRQorCSAqLworCWJvb2wgY29uZmlndXJlSW1wbCgpOworCit9OworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBQUk9DRVNTT1IgVU5JVCBBVVRPIFJFR0lTVFJBVElPTiBGQUNUT1JZCisvLyBmb3IgYXV0b21hdGljIHJlZ2lzdHJhdGlvbiBpbiB0aGUgcHJvY2Vzc29yIHJlcG9zaXRvcnkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3RlbXBsYXRlPCBjbGFzcyBQcm9jZXNzb3JUID4KK2NsYXNzIEF1dG9SZWdpc3RlcmVkU2VyaWFsaXplclByb2Nlc3NvclVuaXQgOiAgcHVibGljICBTZXJpYWxpemVyCit7CisKK3B1YmxpYzoKKwkvKioKKwkgKiBUWVBERURFRgorCSAqLworCXR5cGVkZWYgQXV0b1JlZ2lzdGVyZWRTZXJpYWxpemVyUHJvY2Vzc29yVW5pdDwgUHJvY2Vzc29yVCA+CisJCQkJUmVnaXN0ZXJlZFNlcmlhbGl6ZXJQcm9jZXNzb3JVbml0OworCisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlBdXRvUmVnaXN0ZXJlZFNlcmlhbGl6ZXJQcm9jZXNzb3JVbml0KFN5bWJleENvbnRyb2xsZXJVbml0TWFuYWdlciAmIGFNYW5hZ2VyLAorCQkJV09iamVjdCAqIHdmUGFyYW1ldGVyT2JqZWN0LCBhdm1fY29tcHV0aW5nX3Byb2Nlc3Nfc3RhZ2VfdCByZXF1aXJlZFN0YWdlLAorCQkJY29uc3QgYXZtX3VpbnQ4X3QgKiBhUHJlY2VkZW5jZS8qID0gREVGQVVMVF9QUkVDRURFTkNFX09GX1BST0NFU1NPUiovKQorCTogU2VyaWFsaXplcihhTWFuYWdlciwgd2ZQYXJhbWV0ZXJPYmplY3QsIHJlcXVpcmVkU3RhZ2UsIGFQcmVjZWRlbmNlKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkF1dG9SZWdpc3RlcmVkU2VyaWFsaXplclByb2Nlc3NvclVuaXQoKQorCXsKKwkJLy8gRm9yY2UgSW5zdGFuY2lhdGUKKwkJKHZvaWQpICYgQVVUT19SRUdJU1RFUl9UT09MOworCX0KKworCisJLyoqCisJICogUFJPQ0VTU09SIEZBQ1RPUlkKKwkgKiBmb3IgYXV0b21hdGljIHJlZ2lzdHJhdGlvbiBpbiB0aGUgcHJvY2Vzc29yIHJlcG9zaXRvcnkKKwkgKi8KKwlzdGF0aWMgc3RydWN0IEF1dG9SZWdpc3RlclByb2Nlc3NvckZhY3RvcnkgIDoKKwkJCXB1YmxpYyBQcm9jZXNzb3JVbml0UmVnaXN0cmF0aW9uSW1wbDwgUHJvY2Vzc29yVCA+CisJeworCQlBdXRvUmVnaXN0ZXJQcm9jZXNzb3JGYWN0b3J5KCkKKwkJOiBQcm9jZXNzb3JVbml0UmVnaXN0cmF0aW9uSW1wbDwgUHJvY2Vzc29yVCA+KAorCQkJCVByb2Nlc3NvclQ6OlFOSUQoKSAsIFByb2Nlc3NvclQ6OlFOSUQxKCkgLAorCQkJCVByb2Nlc3NvclQ6OlFOSUQyKCksIFByb2Nlc3NvclQ6OlFOSUQzKCkgKQorCQl7CisJCQkvLyEhIE5PVEhJTkcKKwkJfQorCisJfSAgQVVUT19SRUdJU1RFUl9UT09MOworCS8vIGVuZCByZWdpc3RyYXRpb24KKworCisJLyoqCisJICogQVBJCisJICovCisJaW5saW5lIGNvbnN0IElQcm9jZXNzb3JVbml0UmVnaXN0cmF0aW9uICYgUkVHSVNURVJfVE9PTCgpIGNvbnN0CisJeworCQlyZXR1cm4oIEFVVE9fUkVHSVNURVJfVE9PTCApOworCX0KKworCWlubGluZSBib29sIGlzUmVnaXN0ZXJUb29sKAorCQkJY29uc3QgSVByb2Nlc3NvclVuaXRSZWdpc3RyYXRpb24gJiBhUmVnaXN0ZXJUb29sKSBjb25zdAorCXsKKwkJcmV0dXJuKCBBVVRPX1JFR0lTVEVSX1RPT0wuaXNFcXVhbHMoIGFSZWdpc3RlclRvb2wgKSApOworCX0KKworfTsKKworCit0ZW1wbGF0ZTwgY2xhc3MgUHJvY2Vzc29yVCA+IHR5cGVuYW1lCitBdXRvUmVnaXN0ZXJlZFNlcmlhbGl6ZXJQcm9jZXNzb3JVbml0PCBQcm9jZXNzb3JUID46OkF1dG9SZWdpc3RlclByb2Nlc3NvckZhY3RvcnkKK0F1dG9SZWdpc3RlcmVkU2VyaWFsaXplclByb2Nlc3NvclVuaXQ8IFByb2Nlc3NvclQgPjo6QVVUT19SRUdJU1RFUl9UT09MOworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworCisjZW5kaWYgLyogRkFNX1NFUklBTElaRVJfU0VSSUFMSVpFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3Rlc3RpbmcvT2ZmbGluZVRlc3RQcm9jZXNzb3IuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3Rlc3RpbmcvT2ZmbGluZVRlc3RQcm9jZXNzb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMTVmY2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vdGVzdGluZy9PZmZsaW5lVGVzdFByb2Nlc3Nvci5jcHAKQEAgLTAsMCArMSwzMTE2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogZmV2LiAyMDEyCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEpvc2UgRXNjb2JlZG8gKENFQSBMSVNUKSBqb3NlLmVzY29iZWRvQGNlYS5mcgorICogIE1hdGhpbGRlIEFybmF1ZCAoQ0VBIExJU1QpIG1hdGhpbGRlLmFybmF1ZEBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJPZmZsaW5lVGVzdFByb2Nlc3Nvci5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisKKyNpbmNsdWRlIDxib29zdC9hbGdvcml0aG0vc3RyaW5nLmhwcD4KKyNpbmNsdWRlIDxib29zdC9sZXhpY2FsX2Nhc3QuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3JlZ2V4LmhwcD4KKyNpbmNsdWRlIDxib29zdC90dXBsZS90dXBsZS5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdHVwbGUvdHVwbGVfY29tcGFyaXNvbi5ocHA+CisKKyNpbmNsdWRlIDx1dGlsL2F2bV91dGlsLmg+CisjaW5jbHVkZSA8dXRpbC9hdm1fdmZzLmg+CisKKyNpbmNsdWRlIDxidWlsZGVyL0J1aWxkZXIuaD4KKworI2luY2x1ZGUgPGNvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1Db21tdW5pY2F0aW9uRmFjdG9yeS5oPgorI2luY2x1ZGUgPGNvbXB1dGVyL1BhdGhDb25kaXRpb25Qcm9jZXNzb3IuaD4KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vVHlwZWRlZi5oPgorCisjaW5jbHVkZSA8Zm1sL251bWVyaWMvRmxvYXQuaD4KKyNpbmNsdWRlIDxmbWwvbnVtZXJpYy9OdW1iZXIuaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25Db25zdGFudC5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25Db25zdHJ1Y3Rvci5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25UeXBlQ2hlY2tlci5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZVF1ZXJ5Lmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZkRhdGEuaD4KKworI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Db21Qcm90b2NvbC5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uQ29uZmlndXJhdGlvbi5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkNvbnRleHQuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25JbmZvcm1hdGlvbi5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL1J1bnRpbWVRdWVyeS5oPgorCisjaW5jbHVkZSA8Zm1sL3RlbXBsYXRlL1RpbWVkTWFjaGluZS5oPgorCisjaW5jbHVkZSA8Zm1sL3RyYWNlL1RyYWNlRmFjdG9yeS5oPgorCisjaW5jbHVkZSA8ZmFtL2FwaS9Qcm9jZXNzb3JVbml0UmVwb3NpdG9yeS5oPgorI2luY2x1ZGUgPGZhbS9xdWV1ZS9FeGVjdXRpb25RdWV1ZS5oPgorCisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1F1ZXJ5Lmg+CisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1dPYmplY3QuaD4KKworI2luY2x1ZGUgPHNldy9Db25maWd1cmF0aW9uLmg+CisKKyNpbmNsdWRlIDxzb2x2ZXIvYXBpL1NvbHZlckZhY3RvcnkuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKy8qKgorICogQ09OU1RSVUNUT1IKKyAqIERlZmF1bHQKKyAqLworT2ZmbGluZVRlc3RQcm9jZXNzb3I6Ok9mZmxpbmVUZXN0UHJvY2Vzc29yKAorCQlTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXIgJiBhQ29udHJvbGxlclVuaXRNYW5hZ2VyLAorCQlXT2JqZWN0ICogd2ZQYXJhbWV0ZXJPYmplY3QpCis6IFJlZ2lzdGVyZWRQcm9jZXNzb3JVbml0KGFDb250cm9sbGVyVW5pdE1hbmFnZXIgLCB3ZlBhcmFtZXRlck9iamVjdCwKKwkJQVZNX1BSRVBPU1RfRklMVEVSSU5HX1NUQUdFIHwgQVZNX1BPU1RfUFJPQ0VTU0lOR19TVEFHRSwKKwkJUFJFQ0VERU5DRV9PRl9URVNUX09GRkxJTkUpLAorCitJTkZPX09GRkxJTkVURVNUX0RBVEEoIG5ldyBJZGVudGlmaWVyKCAiT0ZGTElORV9URVNUIiApICksCitJTkZPX09GRkxJTkVURVNUX0RBVEFfUEFTUyggbmV3IElkZW50aWZpZXIoICJPRkZMSU5FX1RFU1RfUEFTUyIgKSApLAorSU5GT19PRkZMSU5FVEVTVF9EQVRBX0lOQ09OQyggbmV3IElkZW50aWZpZXIoICJPRkZMSU5FX1RFU1RfSU5DT05DIiApICksCitJTkZPX09GRkxJTkVURVNUX0RBVEFfRkFJTCggbmV3IElkZW50aWZpZXIoICJPRkZMSU5FX1RFU1RfRkFJTCIgKSApLAorSU5GT19PRkZMSU5FVEVTVF9UUF9QQVRIKCBuZXcgSWRlbnRpZmllciggIlRFU1RfUFVSUE9TRV9QQVRIIiApICksCitJTkZPX09GRkxJTkVURVNUX1RBUkdFVF9TVEFURSggbmV3IElkZW50aWZpZXIoICJUQVJHRVRfU1RBVEUiICkgKSwKKwordGhlVmVyZGljdEtpbmQoIFZFUkRJQ1RfVU5ERUZJTkVEX0tJTkQgKSwKKwordGhlU29sdmVyS2luZCggU29sdmVyRGVmOjpTT0xWRVJfQ1ZDNF9LSU5EICksCit0aGVUcmFjZSggKSwKK3RoZU1lcmdlVHJhY2UoICksCisKK3RoZVRpbWVkVmFyc1ZlY3RvciggKSwKK3RyYWNlSW5QYXRoKCAwICksCit2ZXJkaWN0RW1pdHRlZCggZmFsc2UgKSwKK3RoZVZlcmRpY3QoICksCit0aGVUZXN0UHVycG9zZSggKSwKK3RoZVRpbWVWYXJJbnN0YW5jZSggKSwKK3RoZUxlYXZlc0VDVmVjdG9yKCApLAordGltZVJlZmVyZW5jZUluc3RhbmNlKCApLAordGhlT2JzU2lnbmFscyggKSwKK3RoZVRyYWNlRmlsdGVyKCApLAordGhlRXJhc2VkTm9kZXMoIDAgKSwKK3RpbWVkRmxhZyggKSwKKwordGhlTWFpbkV4ZWN1dGlvbkRhdGEoIGdldENvbmZpZ3VyYXRpb24oKS5nZXRNYWluRXhlY3V0aW9uRGF0YSgpICkKK3sKKwkvLyEhIE5PVEhJTkcKK30KKworLyoKK3Byb3RvdHlwZSBwcm9jZXNzOjpvZmZsaW5lX3Rlc3QgIm9mZmxpbmVfdGVzdCIgYXMgJmF2bTo6cHJvY2Vzc29yLk9GRkxJTkVURVNUIGlzCisJc2VjdGlvbiBQUk9QRVJUWQorCQkvLyAnT01FR0EnIHwgJ0NWQzQnIHwgJ1ozJyB8ICdZSUNFUycKKwkJQHNvbHZlciA9ICdDVkM0JzsKKwllbmRzZWN0aW9uIFBST1BFUlRZCisKKwlzZWN0aW9uIE1FUkdFRF9UUkFDRQorCQlAbWVyZ2VkVHJhY2VGaWxlPSJtZXJnZWRfdHJhY2UudHh0IjsKKwkJLy9vcHRpb25hbAorCQlAdGltZVZhcj0ic3BlYzo6c3lzdGVtLmRlbHRhVCI7CisJCS8vb3B0aW9uYWwKKwkJQHRlc3RQdXJwb3NlRmlsZT0idGVzdF9wdXJwb3NlLnR4dCI7CisJZW5kc2VjdGlvbiBNRVJHRURfVFJBQ0UKKworCXNlY3Rpb24gVElNRV9IQU5ETElORworCQkvL29wdGlvbmFsCisJCUBjdXJyZW50VGltZSA9ICJpbnN0OjpzeXN0ZW0uVCI7CisJZW5kc2VjdGlvbiBUSU1FX0hBTkRMSU5HCisKKwkvLyBkZXByZWNhdGVkCisJc2VjdGlvbiBPQlNFUlZBQkxFX1NJR05BTAorCQlAbWFjaGluZSA9ICJtMSI7CisJCUBwb3J0PSAicDEiOworCQlAc2VucyA9ICI/IjsKKwkJQG1hY2hpbmUgPSAibTIiOworCQlAcG9ydD0gInAyIjsKKwkJQHNlbnMgPSAiISI7CisJZW5kc2VjdGlvbiBPQlNFUlZBQkxFX1NJR05BTAorCisJc2VjdGlvbiBPQlNFUlZBQkxFCisJCUBpbnB1dCA9ICJtYWNoaW5lX2luc3RhbmNlMS0+c2lnbmFsMSI7CisJCUBvdXRwdXQgPSAibWFjaGluZV9pbnN0YW5jZTItPnNpZ25hbDIiOworCQlAaW5wdXQgPSAibWFjaGluZV9pbnN0YW5jZTMtPnNpZ25hbDEiOworCQlAb3V0cHV0ID0gIm1hY2hpbmVfaW5zdGFuY2UzLT5zaWduYWwyIjsKKwllbmRzZWN0aW9uCisKKwlzZWN0aW9uIENPTlRST0xMQUJMRQorCQlAaW5wdXQgPSAibWFjaGluZV9pbnN0YW5jZTMtPnNpZ25hbDEiOworCWVuZHNlY3Rpb24gQ09OVFJPTExBQkxFCisKKworZW5kcHJvdG90eXBlCisgKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENPTkZJR1VSRSBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgT2ZmbGluZVRlc3RQcm9jZXNzb3I6OmNvbmZpZ3VyZUltcGwoKQoreworCVdPYmplY3QgKiB0aGVQUk9QRVJUWSA9IFF1ZXJ5OjpnZXRSZWdleFdTZXF1ZW5jZSgKKwkJCW1QYXJhbWV0ZXJXT2JqZWN0LCBPUl9XSUQyKCJwcm9wZXJ0eSIsICJQUk9QRVJUWSIpKTsKKwlzdGQ6OnN0cmluZyBmb3JtYXQ7CisJaWYoIHRoZVBST1BFUlRZICE9IFdPYmplY3Q6Ol9OVUxMXyApCisJeworCQlzdGQ6OnN0cmluZyB0aGVTb2x2ZXJJRCA9CisJCQkJUXVlcnk6OmdldFdQcm9wZXJ0eVN0cmluZyh0aGVQUk9QRVJUWSwgInNvbHZlciIsICIiKTsKKworCQl0aGVTb2x2ZXJLaW5kID0gU29sdmVyRGVmOjp0b1NvbHZlcigKKwkJCQl0aGVTb2x2ZXJJRCwgU29sdmVyRGVmOjpERUZBVUxUX1NPTFZFUl9LSU5EKTsKKworCQkvL1RPRE86IGFkZCBwb3NzaWJpbGl0eSB0byBwYXJhbWV0ZXJpemUgaW5wdXQgZm9ybWF0CisJCS8vZm9yIHRoZSBtb21lbnQsIHR3byBmb3JtYXRzIGdpdmVuIGFzLWlzOgorCQkvLyB0aGUgaGlzdG9yaWNhbCBmb3JtYXQgYW5kIHRoZSBiYXNpYyB4bGlhIHRyYWNlIGZvcm1hdAorCQlmb3JtYXQgPSBRdWVyeTo6Z2V0V1Byb3BlcnR5U3RyaW5nKAorCQkJCXRoZVBST1BFUlRZLCAiZm9ybWF0IiwgIkJBU0lDI1hMSUEiKTsKKwl9CisJZWxzZQorCXsKKwkJdGhlU29sdmVyS2luZCA9IFNvbHZlckRlZjo6REVGQVVMVF9TT0xWRVJfS0lORDsKKwkJZm9ybWF0ID0gIkJBU0lDI1hMSUEiOworCX0KKworCVdPYmplY3QgKiB0aGVNZXJnZWRUcmFjZSA9IFF1ZXJ5OjpnZXRSZWdleFdTZXF1ZW5jZSgKKwkJCW1QYXJhbWV0ZXJXT2JqZWN0LCBPUl9XSUQyKCJtZXJnZWRfdHJhY2UiLCAiTUVSR0VEX1RSQUNFIikpOworLy8JV09iamVjdCAqIHRoZVRpbWVIYW5kbGluZyA9IFF1ZXJ5OjpnZXRSZWdleFdTZXF1ZW5jZSgKKy8vCQkJbVBhcmFtZXRlcldPYmplY3QgLCBPUl9XSUQyKCJ0aW1lX2hhbmRsaW5nIiwgIlRJTUVfSEFORExJTkciKSApOworCisJVHJhY2VGYWN0b3J5IHRyYWNlRmFjdG9yeShnZXRDb25maWd1cmF0aW9uKCksIEVOViwgbVBhcmFtZXRlcldPYmplY3QpOworCisJLy8gUmV0cmlldmluZyB0aW1lIGluZm8gZnJvbSB0aGUgeGZzcAorCisJaWYoIFRpbWVkTWFjaGluZTo6U1lTVEVNX1ZBUl9ERUxUQV9USU1FICE9IE5VTEwgKQorCXsKKwkJRXhlY3V0YWJsZVF1ZXJ5IFhRdWVyeSggZ2V0Q29uZmlndXJhdGlvbigpICk7CisKKwkJdGltZVJlZmVyZW5jZUluc3RhbmNlID0gWFF1ZXJ5LmdldERhdGFCeUFzdEVsZW1lbnQoCisJCQkJVGltZWRNYWNoaW5lOjpTWVNURU1fVkFSX0dMT0JBTF9USU1FICk7CisKKwkJdGhlVGltZVZhckluc3RhbmNlID0gWFF1ZXJ5LmdldERhdGFCeUFzdEVsZW1lbnQoCisJCQkJVGltZWRNYWNoaW5lOjpTWVNURU1fVkFSX0RFTFRBX1RJTUUgKTsKKworCQl0aW1lZEZsYWcgPSB0cnVlOworCX0KKwkvLyBUT0RPOiBjaGFuZ2luZyB0aW1lIG1hbmFnZW1lbnQsIGdldHRpbmcgaW5mb3JtYXRpb24gZGlyZWN0bHkgZnJvbSB0aGUgeGZzcAorCWVsc2UKKwl7CisJCUFWTV9PU19MT0cgPDwgIk5vIHRpbWUgcGFyYW1ldGVyIGZvdW5kISIgPDwgc3RkOjplbmRsOworCQl0aW1lZEZsYWcgPSBmYWxzZTsKKwl9CisKKwkvKgorCWVsc2UKKwl7CisJCXN0ZDo6c3RyaW5nIHRoZUN1cnJlbnRUaW1lVmFyID0KKwkJCQlRdWVyeTo6Z2V0V1Byb3BlcnR5U3RyaW5nKHRoZVRpbWVIYW5kbGluZywgImN1cnJlbnRUaW1lIiwgIiIpOworCisJCWlmKCBub3QgdGhlQ3VycmVudFRpbWVWYXIuZW1wdHkoKSApCisJCXsKKwkJCXRpbWVSZWZlcmVuY2VJbnN0YW5jZSA9IFJRdWVyeS5zZWFyY2hWYXJpYWJsZSgKKwkJCQkJdGhlTWFpbkV4ZWN1dGlvbkRhdGEsIHRoZUN1cnJlbnRUaW1lVmFyKTsKKwkJCWlmKCB0aW1lUmVmZXJlbmNlSW5zdGFuY2UuaW52YWxpZCgpICkKKwkJCXsKKwkJCQlBVk1fT1NfV0FSTiA8PCAiVW5mb3VuZCBjdXJyZW50VGltZTwgIiA8PCB0aGVDdXJyZW50VGltZVZhcgorCQkJCQkJPDwgIj4gcGFyYW1ldGVyISIgPDwgc3RkOjplbmRsOworCisJCQkJbUNvbmZpZ0ZsYWcgPSBmYWxzZTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCUFWTV9PU19XQVJOIDw8ICJVbmZvdW5kIGN1cnJlbnRUaW1lIHBhcmFtZXRlciEiIDw8IHN0ZDo6ZW5kbDsKKworCQkJbUNvbmZpZ0ZsYWcgPSBmYWxzZTsKKwkJfQorCisKKwkJc3RkOjpzdHJpbmcgdGltZVZhciA9CisJCQkJUXVlcnk6OmdldFdQcm9wZXJ0eVN0cmluZyh0aGVNZXJnZWRUcmFjZSwgInRpbWVWYXIiLCAiIik7CisKKwkJaWYoIG5vdCB0aW1lVmFyLmVtcHR5KCkgKQorCQl7CisJCQl0aGVUaW1lVmFySW5zdGFuY2UgPSBSUXVlcnkuc2VhcmNoVmFyaWFibGUoCisJCQkJCXRoZU1haW5FeGVjdXRpb25EYXRhLCB0aW1lVmFyKTsKKwkJCWlmKCB0aGVUaW1lVmFySW5zdGFuY2UuaW52YWxpZCgpICkKKwkJCXsKKwkJCQlBVk1fT1NfTE9HIDw8ICJVbmZvdW5kIHRpbWVWYXIgPCAiIDw8IHRpbWVWYXIgPDwgIj4gcGFyYW1ldGVyISIKKwkJCQkJCTw8IHN0ZDo6ZW5kbDsKKworCQkJCW1Db25maWdGbGFnID0gZmFsc2U7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlBVk1fT1NfV0FSTiA8PCAiVW5mb3VuZCB0aW1lVmFyIHBhcmFtZXRlciEiIDw8IHN0ZDo6ZW5kbDsKKworCQkJbUNvbmZpZ0ZsYWcgPSBmYWxzZTsKKwkJfQorCX0qLworCisJc3RkOjpzdHJpbmcgdGhlTWVyZ2VkVHJhY2VQYXRoID0KKwkJCVF1ZXJ5OjpnZXRXUHJvcGVydHlTdHJpbmcodGhlTWVyZ2VkVHJhY2UsICJtZXJnZWRUcmFjZUZpbGUiLCAiIik7CisKKwkJdGhlTWVyZ2VkVHJhY2VQYXRoID0gVkZTOjpuYXRpdmVfcGF0aCgKKwkJCQl0aGVNZXJnZWRUcmFjZVBhdGgsIFZGUzo6UHJvamVjdFNvdXJjZVBhdGgpOworCisJCS8vIGluaXRpYWxpemluZyB0aGVUcmFjZQorCQlpZiggbm90IHBhcnNlTWVyZ2VkVHJhY2UodHJhY2VGYWN0b3J5LCBmb3JtYXQsCisJCQkJdGhlTWVyZ2VkVHJhY2VQYXRoLCB0aGVUcmFjZSwgdGhlVGltZVZhckluc3RhbmNlKSApCisJCXsKKwkJCUFWTV9PU19XQVJOIDw8ICJFcnJvcjogRXJyb3Igd2hpbGUgcGFyc2luZyB0aGUgdHJhY2UhICIgPDwgc3RkOjplbmRsOworCisJCQltQ29uZmlnRmxhZyA9IGZhbHNlOworCisJCS8vVE9ETzogY2hlY2sgdGhhdCB0aGlzIGlzIHVzZWxlc3MgYW5kIGVyYXNlIGl0CisJCS8vIGluaXRpYWxpemluZyB0aGVNZXJnZVRyYWNlCisJCS8qaWYoIG5vdCBwYXJzZU1lcmdlZFRyYWNlKHRyYWNlRmFjdG9yeSwKKwkJCQl0aGVNZXJnZWRUcmFjZVBhdGgsIHRoZU1lcmdlVHJhY2UsIHRoZVRpbWVWYXJJbnN0YW5jZSkgKQorCQl7CisJCQlBVk1fT1NfV0FSTiA8PCAiRXJyb3I6IEVycm9yIHdoaWxlIHBhcnNpbmcgbWVyZ2VkIHRyYWNlISAiIDw8IHN0ZDo6ZW5kbDsKKworCQkJbUNvbmZpZ0ZsYWcgPSBmYWxzZTsKKwkJfSovCisJfQorCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfTE9HIDw8ICJUaGUgbWVyZ2UgdHJhY2UgKHNlcXVlbmNlIG9mIGR1cmF0aW9uL2lucHV0L291dHB1dCkgaXM6ICIgPDwgc3RkOjplbmRsOworCXRoZVRyYWNlLnRvU3RyZWFtKCBBVk1fT1NfTE9HIDw8IEFWTV9UQUJfSU5ERU5UICk7CisJQVZNX09TX0xPRyA8PCBFTkRfSU5ERU5UIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCisJc3RkOjpzdHJpbmcgdGVzdFB1cnBvc2VQYXRoID0KKwkJCVF1ZXJ5OjpnZXRXUHJvcGVydHlTdHJpbmcodGhlTWVyZ2VkVHJhY2UsICJ0ZXN0UHVycG9zZUZpbGUiLCAiIik7CisKKwlpZiggbm90IHRlc3RQdXJwb3NlUGF0aC5lbXB0eSgpICkKKwl7CisJCXRlc3RQdXJwb3NlUGF0aCA9IFZGUzo6bmF0aXZlX3BhdGgoCisJCQkJdGVzdFB1cnBvc2VQYXRoLCBWRlM6OlByb2plY3RTb3VyY2VQYXRoKTsKKworCQlpZiggbm90IHBhcnNlVGVzdFB1cnBvc2UodGVzdFB1cnBvc2VQYXRoLCB0aGVUZXN0UHVycG9zZSkgKQorCQl7CisJCQlBVk1fT1NfV0FSTiA8PCAiRXJyb3I6IEVycm9yIHdoaWxlIHBhcnNpbmcgdGVzdCBwdXJwb3NlISAiIDw8IHN0ZDo6ZW5kbDsKKworCQkJbUNvbmZpZ0ZsYWcgPSBmYWxzZTsKKwkJfQorCisJfQorCisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCUFWTV9PU19MT0cgPDwgIlRoZSBwYXJzZWQgdHJhY2UgaXM6ICIgPDwgc3RkOjplbmRsOworCXByaW50VHJhY2UodGhlVHJhY2UpOworCisJQVZNX09TX0xPRyA8PCAiVGhlIHRlc3QgcHVycG9zZSAoc2VxdWVuY2Ugb2YgdHJhbnNpdGlvbiBuYW1lcykgaXM6ICIgPDwgc3RkOjplbmRsOworCXRoZVRlc3RQdXJwb3NlLnRvU3RyZWFtKCBBVk1fT1NfTE9HIDw8IEFWTV9UQUJfSU5ERU5UICk7CisJQVZNX09TX0xPRyA8PCBFTkRfSU5ERU5UIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCisKKwkvLyBDb25maWd1cmF0aW9uIG9mIE9CU0VSVkFCTEUgU0lHTkFMCisJV09iamVjdCAqIHRoZU9ic2VydmFibGVTaWduYWxzID0gUXVlcnk6OmdldFJlZ2V4V1NlcXVlbmNlKG1QYXJhbWV0ZXJXT2JqZWN0LAorCQkJT1JfV0lEMigib2JzZXJ2YWJsZSIsICJPQlNFUlZBQkxFIiksIFdPYmplY3Q6Ol9OVUxMXyk7CisKKwkvL1RPRE86IHRlc3RzICEKKwkvLyBpZiBub3RoaW5nIGlzIGRlY2xhcmVkIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUKKwkvLyB0aGUgb2JzZXJ2YWJsZSBhcmUgc2V0IHRvIGJlIHRoZSBzaWduYWxzIGFwcGVhcmluZyBpbiB0aGUgdHJhY2UKKwlpZiggKHRoZU9ic2VydmFibGVTaWduYWxzID09IFdPYmplY3Q6Ol9OVUxMXykgfHwKKwkJdGhlT2JzZXJ2YWJsZVNpZ25hbHMtPmhhc25vT3duZWRFbGVtZW50KCkgKQorCXsKKwkJQVZNX09TX0xPRyA8PCAiV2FybmluZyA6IE9ic2VydmFibGUgcG9ydHMgYXJlIG5vdCBjb25maWd1cmVkIiA8PCBzdGQ6OmVuZGwKKwkJCQk8PCAiRGVkdWNpbmcgb2JzZXJ2YWJsZSBwb3J0cyBmcm9tIHRoZSB0cmFjZSIgPDxzdGQ6OmVuZGw7CisKKwkJQkZMaXN0OjpyYXdfaXRlcmF0b3I8IFRyYWNlUG9pbnQgPiBpdFBvaW50ID0gdGhlVHJhY2UucG9pbnRzLmJlZ2luKCk7CisJCUJGTGlzdDo6cmF3X2l0ZXJhdG9yPCBUcmFjZVBvaW50ID4gZW5kUG9pbnQgPSB0aGVUcmFjZS5wb2ludHMuZW5kKCk7CisJCWZvciggOyAoaXRQb2ludCAhPSBlbmRQb2ludCkgOyArK2l0UG9pbnQgKQorCQl7CisJCQlpZiggKG5vdCBpdFBvaW50LT5pc1RpbWUoKSkKKwkJCQkmJiAobm90IHRoZU9ic1NpZ25hbHMuY29udGFpbnNQb2ludChpdFBvaW50LCBmYWxzZSkpKQorCQkJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCUFWTV9PU19MT0cgPDwgIkFkZGluZyBwb2ludDogIiA8PCAoKml0UG9pbnQpIDw8ICBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFBST0NFU1NPUiApCisJCQkJCXRoZU9ic1NpZ25hbHMucG9pbnRzLmFwcGVuZCgqaXRQb2ludCk7CisJCQl9CisJCX0KKwl9CisJLy8gaWYgdGhlIG9ic2VydmFibGUgc2VjdGlvbiBjb250YWlucyBzb21ldGhpbmcKKwkvLyB0aGUgb2JzZXJ2YWJsZSBzaWduYWxzIGFyZSBjb25maWd1cmVkIGFjY29yZGluZ2x5CisJZWxzZQorCXsKKwkJbUNvbmZpZ0ZsYWcgPSB0cmFjZUZhY3RvcnkuY29uZmlndXJlKHRoZU9ic2VydmFibGVTaWduYWxzLCB0aGVPYnNTaWduYWxzKQorCQkJCSYmIG1Db25maWdGbGFnOworCX0KKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIENPTkZJR1VSSU5HICkKKwlBVk1fT1NfTE9HIDw8ICJDb25maWd1cmF0aW9uIG9mIE9CU0VSVkFCTEUgU0lHTkFMOiAiIDw8IHN0ZDo6ZW5kbDsKKwl0aGVPYnNTaWduYWxzLnRvU3RyZWFtKCBBVk1fT1NfTE9HIDw8IEFWTV9UQUJfSU5ERU5UICk7CisJQVZNX09TX0xPRyA8PCBFTkRfSU5ERU5UIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBDT05GSUdVUklORyApCisKKworCS8vIENvbmZpZ3VyYXRpb24gb2YgQ09OVFJPTExBQkxFIFNJR05BTAorCW1Db25maWdGbGFnID0gdGhlVHJhY2VGaWx0ZXIuY29uZmlndXJlKAorCQkJRU5WLCBnZXRQYXJhbWV0ZXJXT2JqZWN0KCksICJjb250cm9sbGFibGUiLCAiQ09OVFJPTExBQkxFIikKKwkJCSYmIG1Db25maWdGbGFnOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgQ09ORklHVVJJTkcgKQorCUFWTV9PU19MT0cgPDwgIkNvbmZpZ3VyYXRpb24gb2YgQ09OVFJPTExBQkxFIFNJR05BTDogIiA8PCBzdGQ6OmVuZGw7CisJdGhlVHJhY2VGaWx0ZXIudG9TdHJlYW0oIEFWTV9PU19MT0cgPDwgQVZNX1RBQl9JTkRFTlQgKTsKKwlBVk1fT1NfTE9HIDw8IEVORF9JTkRFTlQgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIENPTkZJR1VSSU5HICkKKworCS8vIGluaXRpYWxpemF0aW9uCisJdHJhY2VJblBhdGggPSAwOworCXZlcmRpY3RFbWl0dGVkID0gZmFsc2U7CisJdGhlVmVyZGljdCA9ICIiOworCXRoZUVyYXNlZE5vZGVzID0gMDsKKworCXJldHVybiBtQ29uZmlnRmxhZzsKK30KKworCisvL1RPRE8gOiBwYXJhbWV0ZXJpemUgaW5wdXQgZm9ybWF0Citib29sIE9mZmxpbmVUZXN0UHJvY2Vzc29yOjpwYXJzZU1lcmdlZFRyYWNlKAorCQlUcmFjZUZhY3RvcnkgJiBhVHJhY2VGYWN0b3J5LCBjb25zdCBzdGQ6OnN0cmluZyAmIGZvcm1hdCwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBmaWxlUGF0aCwKKwkJVHJhY2VTZXF1ZW5jZSAmIGFNZXJnZVRyYWNlLCBjb25zdCBCRiAmIHRoZVRpbWVWYXIpCit7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfTE9HIDw8ICJGaWxlIHBhdGggb2YgbWVyZ2VkIHRyYWNlOiAiIDw8IGZpbGVQYXRoIDw8IHN0ZDo6ZW5kbAorCTw8ICJUcmFjZSBmb3JtYXQ6ICIgPDwgZm9ybWF0IDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCisJc3RkOjppZnN0cmVhbSBmaWxlVHJhY2U7CisJZmlsZVRyYWNlLm9wZW4oZmlsZVBhdGguY19zdHIoKSwgc3RkOjppZnN0cmVhbTo6aW4pOworCWlmKCBmaWxlVHJhY2UuaXNfb3BlbigpICkKKwl7CisJCWlmKCBTdHJpbmdUb29sczo6c3RhcnRzV2l0aChmb3JtYXQsIkJBU0lDIikgKQorCQl7CisJCQlyZXR1cm4oIGFUcmFjZUZhY3RvcnkucGFyc2VCYXNpY1hsaWFUcmFjZSgKKwkJCQkJYU1lcmdlVHJhY2UsIGZpbGVUcmFjZSwgdGhlVGltZVZhcikgKTsKKwkJfQorCQllbHNlIC8vaWYoIFN0cmluZ1Rvb2xzOjpzdGFydHNXaXRoKGZvcm1hdCwiQkFTSUMiKSApCisJCXsKKwkJCXJldHVybiggYVRyYWNlRmFjdG9yeS5wYXJzZUJhc2ljVHJhY2UoCisJCQkJCWFNZXJnZVRyYWNlLCBmaWxlVHJhY2UsIHRoZVRpbWVWYXIpICk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJQVZNX09TX1dBUk4gPDwgIkVycm9yOiBjYW5ub3Qgb3BlbiBmaWxlICIKKwkJCQk8PCBmaWxlUGF0aCA8PCBzdGQ6OmVuZGw7CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCitib29sIE9mZmxpbmVUZXN0UHJvY2Vzc29yOjpwYXJzZU1lcmdlZFRyYWNlKAorCQlUcmFjZUZhY3RvcnkgJiBhVHJhY2VGYWN0b3J5LCBjb25zdCBzdGQ6OnN0cmluZyAmIGZpbGVQYXRoLAorCQlUcmFjZVNlcXVlbmNlICYgYU1lcmdlVHJhY2UsIGNvbnN0IEJGICYgdGhlVGltZVZhcikKK3sKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCUFWTV9PU19MT0cgPDwgIkZpbGUgcGF0aCBvZiBtZXJnZWQgdHJhY2U6ICIgPDwgZmlsZVBhdGggPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisKKwlzdGQ6Omlmc3RyZWFtIGZpbGVUcmFjZTsKKwlmaWxlVHJhY2Uub3BlbihmaWxlUGF0aC5jX3N0cigpLCBzdGQ6Omlmc3RyZWFtOjppbik7CisJaWYoIGZpbGVUcmFjZS5pc19vcGVuKCkgKQorCXsKKwkJcmV0dXJuKCBhVHJhY2VGYWN0b3J5LnBhcnNlQmFzaWNUcmFjZSgKKwkJCQlhTWVyZ2VUcmFjZSwgZmlsZVRyYWNlLCB0aGVUaW1lVmFyKSApOworCX0KKwllbHNlCisJeworCQlBVk1fT1NfV0FSTiA8PCAiRXJyb3I6IGNhbm5vdCBvcGVuIGZpbGUgIgorCQkJCTw8IGZpbGVQYXRoIDw8IHN0ZDo6ZW5kbDsKKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKworYm9vbCAgT2ZmbGluZVRlc3RQcm9jZXNzb3I6OnBhcnNlVGVzdFB1cnBvc2UoCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgZmlsZVBhdGgsIFRyYWNlU2VxdWVuY2UgJiB0ZXN0UHVycG9zZSkKK3sKKwkvKgorCSAqIFRoaXMgZnVuY3Rpb24gcGFyc2VzIHRoZSB0ZXN0IHB1cnBvc2UgZ2l2ZW4gaW4gYSBmaWxlCisJICogYXMgYSBzZXF1ZW5jZSBvZiB0cmFuc2l0aW9ucy4KKwkgKiBJZiBmaWxlUGF0aCBpcyBlbXB0eSwgbm8gdGVzdCBwdXJwb3NlIGlzIHNwZWNpZmllZAorCSAqIFRoZSBzZXF1ZW5jZSBvZiB0cmFuc2l0aW9ucyBpcyBzdG9yZWQgaW4gdGhlIHRyYWNlIGVsZW1lbnQgdGVzdFB1cnBvc2UKKwkgKi8KKwlpZiggZmlsZVBhdGggPT0gIiIgKQorCXsKKwkJQVZNX09TX0xPRyA8PCAiV2FybmluZzogTm8gdGVzdCBwdXJwb3NlIHNwZWNpZmllZCEgIiA8PCBzdGQ6OmVuZGw7CisJfQorCWVsc2UKKwl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfTE9HIDw8ICJUaGUgZmlsZSBwYXRoIG9mIHRoZSB0ZXN0IHB1cnBvc2UgdG8gcGFyc2UgaXM6ICIKKwkJCTw8IGZpbGVQYXRoIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCisJCXN0ZDo6aWZzdHJlYW0gdGVzdFB1cnBvc2VGaWxlOworCQl0ZXN0UHVycG9zZUZpbGUub3BlbihmaWxlUGF0aC5jX3N0cigpLCBzdGQ6Omlmc3RyZWFtOjppbik7CisJCWlmKCB0ZXN0UHVycG9zZUZpbGUuaXNfb3BlbigpICkKKwkJeworCQkJc3RkOjpzdHJpbmcgb25lTGluZTsKKworCQkJd2hpbGUgKHRlc3RQdXJwb3NlRmlsZS5nb29kKCkpCisJCQl7CisJCQkJc3RkOjpnZXRsaW5lKHRlc3RQdXJwb3NlRmlsZSwgb25lTGluZSk7CisJCQkJVHJhY2VGYWN0b3J5OjphcHBlbmRUcmFuc2l0aW9uUG9pbnQoCisJCQkJCQlnZXRDb25maWd1cmF0aW9uKCksIHRlc3RQdXJwb3NlLCBvbmVMaW5lKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKworCQlBVk1fT1NfV0FSTiA8PCAiRXJyb3I6IEVycm9yIHdoaWxlIHJlYWRpbmcgdGVzdCBwdXJwb3NlIGZpbGUgIgorCQkJCTw8IGZpbGVQYXRoIDw8IHN0ZDo6ZW5kbDsKKwkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCXJldHVybiB0cnVlOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBSRVBPUlQgQVBJCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIE9mZmxpbmVUZXN0UHJvY2Vzc29yOjpyZXBvcnREZWZhdWx0KE91dFN0cmVhbSAmIG9zKSBjb25zdAoreworCXJlcG9ydEhlYWRlcihvcywgIkFWTSBPRkYtTElORSBURVNUICIpOworCisJb3MgPDwgRU1QSEFTSVModGhlVmVyZGljdCwgJz0nLCA4MCk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFBSRS1QUk9DRVNTIEFQSQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBPZmZsaW5lVGVzdFByb2Nlc3Nvcjo6cHJlcHJvY2VzcygpCit7CisJQVZNX09TX1dBUk4gPDwgIk9mZmxpbmVUZXN0UHJvY2Vzc29yOjpwcmVwcm9jZXNzKCkiIDw8IHN0ZDo6ZW5kbDsKKworCXJldHVybiggdHJ1ZSApOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUFJFLUZJTFRFUiBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgT2ZmbGluZVRlc3RQcm9jZXNzb3I6OkFzc2lnblZhbHVlc0lmT2JzZXJ2YWJsZSgKKwkJRXhlY3V0aW9uQ29udGV4dCAmIGFuRXhlY3V0aW9uQ29udGV4dCwgVHJhY2VTZXF1ZW5jZSAmIGxvY2FsVHJhY2UpCit7CisJYm9vbCB2YWx1ZUFzc2lnbmVkID0gZmFsc2U7CisJaWYoIGFuRXhlY3V0aW9uQ29udGV4dC5oYXNJT0VsZW1lbnRUcmFjZSgpICkKKwl7CisJCWNvbnN0IEJGICYgdGhlQkYgPSBhbkV4ZWN1dGlvbkNvbnRleHQuZ2V0SU9FbGVtZW50VHJhY2UoKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBSRV9GSUxURVJJTkcgKQorCUFWTV9PU19MT0cgPDwgIk9GRkxJTkUgVEVTVDo6IEFib3V0IHRvIHBhcnNlIHRoZSB0cmFjZTogIiA8PCBzdGQ6OmVuZGwKKwkJCTw8IHRoZUJGLnRvU3RyaW5nKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBSRV9GSUxURVJJTkcgKQorCisJCS8vVE9ETyA6IGNoYW5nZSBoYXNJTyBmb3IgbWF0Y2hlc0lPIGluIGEgc21hcnQgd2F5CisJCXZhbHVlQXNzaWduZWQgPSBoYXNJTyh0aGVCRiwgYW5FeGVjdXRpb25Db250ZXh0LCBsb2NhbFRyYWNlKTsKKwkJLy92YWx1ZUFzc2lnbmVkID0gbWF0Y2hlcyh0aGVCRiwgYW5FeGVjdXRpb25Db250ZXh0LCBsb2NhbFRyYWNlKTsKKwl9CisKKwlyZXR1cm4gdmFsdWVBc3NpZ25lZDsKK30KKworLyoKK2Jvb2wgT2ZmbGluZVRlc3RQcm9jZXNzb3I6Om1hdGNoZXMoY29uc3QgQkYgJiBhbkVsZW1lbnQsCisJCUV4ZWN1dGlvbkNvbnRleHQgJiBhbkV4ZWN1dGlvbkNvbnRleHQsIFRyYWNlU2VxdWVuY2UgJiBsb2NhbFRyYWNlKQoreworCWJvb2wgdmFsdWVBc3NpZ25lZCA9IGZhbHNlOworCWlmKCBhbkVsZW1lbnQuaXM8IEF2bUNvZGUgPigpICkKKwl7CisJCUF2bUNvZGUgKiB0aGVBQyA9IGFuRWxlbWVudC50b19wdHI8IEF2bUNvZGUgPigpOworCQlBdm1Db2RlOjppdGVyYXRvciBpdCA9IHRoZUFDLT5iZWdpbigpOworCisJCXN3aXRjaCggdGhlQUMtPmdldEF2bU9wQ29kZSgpICkKKwkJeworCQkJY2FzZSBBVk1fT1BDT0RFX1BBUkFMTEVMIDoKKwkJCXsKKwkJCQlmb3IoIDsgaXQgIT0gdGhlQUMtPmVuZCgpIDsgKytpdCApCisJCQkJeworCQkJCQlpZiggaGFzSU8oICgqaXQpLCBhbkV4ZWN1dGlvbkNvbnRleHQsIGxvY2FsVHJhY2UpICkKKwkJCQkJeworCQkJCQkJdmFsdWVBc3NpZ25lZCA9IHRydWU7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNhc2UgQVZNX09QQ09ERV9TRVFVRU5DRSA6CisJCQl7CisJCQkJZm9yKCA7IGl0ICE9IHRoZUFDLT5lbmQoKSA7ICsraXQgKQorCQkJCXsKKwkJCQkJaWYoIGhhc0lPKCAoKml0KSwgYW5FeGVjdXRpb25Db250ZXh0LCBsb2NhbFRyYWNlKSApCisJCQkJCXsKKwkJCQkJCXZhbHVlQXNzaWduZWQgPSB0cnVlOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworLy8JCQkJCQl2YWx1ZUFzc2lnbmVkID0gZmFsc2U7CisvLwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCQlkZWZhdWx0OgorCQkJeworCQkJCWZvciggOyBpdCAhPSB0aGVBQy0+ZW5kKCkgOyArK2l0ICkKKwkJCQl7CisJCQkJCWlmKCBoYXNJTyggKCppdCksIGFuRXhlY3V0aW9uQ29udGV4dCwgbG9jYWxUcmFjZSkgKQorCQkJCQl7CisJCQkJCQl2YWx1ZUFzc2lnbmVkID0gdHJ1ZTsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwllbHNlIGlmKCBhbkVsZW1lbnQuaXM8IEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24gPigpICkKKwl7CisJCUV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24gKiB0aGVFQyA9IGFuRWxlbWVudC50b19wdHI8IEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24gPigpOworCQl2YWx1ZUFzc2lnbmVkID0gaGFzSU8oIHRoZUVDLCBhbkV4ZWN1dGlvbkNvbnRleHQsIGxvY2FsVHJhY2UpOworCX0KKworCXJldHVybiB2YWx1ZUFzc2lnbmVkOworfSAqLworCitib29sIE9mZmxpbmVUZXN0UHJvY2Vzc29yOjpoYXNJTyhjb25zdCBCRiAmIGFuRWxlbWVudCwKKwkJRXhlY3V0aW9uQ29udGV4dCAmIGFuRXhlY3V0aW9uQ29udGV4dCwgVHJhY2VTZXF1ZW5jZSAmIGxvY2FsVHJhY2UpCit7CisJYm9vbCB2YWx1ZUFzc2lnbmVkID0gZmFsc2U7CisJaWYoIGFuRWxlbWVudC5pczwgQXZtQ29kZSA+KCkgKQorCXsKKwkJQXZtQ29kZSAqIHRoZUFDID0gYW5FbGVtZW50LnRvX3B0cjwgQXZtQ29kZSA+KCk7CisJCUF2bUNvZGU6Oml0ZXJhdG9yIGl0ID0gdGhlQUMtPmJlZ2luKCk7CisKKwkJc3dpdGNoKCB0aGVBQy0+Z2V0QXZtT3BDb2RlKCkgKQorCQl7CisJCQljYXNlIEFWTV9PUENPREVfUEFSQUxMRUwgOgorCQkJeworCQkJCWZvciggOyBpdCAhPSB0aGVBQy0+ZW5kKCkgOyArK2l0ICkKKwkJCQl7CisJCQkJCWlmKCBoYXNJTyggKCppdCksIGFuRXhlY3V0aW9uQ29udGV4dCwgbG9jYWxUcmFjZSkgKQorCQkJCQl7CisJCQkJCQl2YWx1ZUFzc2lnbmVkID0gdHJ1ZTsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQkJY2FzZSBBVk1fT1BDT0RFX1NFUVVFTkNFIDoKKwkJCXsKKwkJCQlmb3IoIDsgaXQgIT0gdGhlQUMtPmVuZCgpIDsgKytpdCApCisJCQkJeworCQkJCQlpZiggaGFzSU8oICgqaXQpLCBhbkV4ZWN1dGlvbkNvbnRleHQsIGxvY2FsVHJhY2UpICkKKwkJCQkJeworCQkJCQkJdmFsdWVBc3NpZ25lZCA9IHRydWU7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisvLwkJCQkJCXZhbHVlQXNzaWduZWQgPSBmYWxzZTsKKy8vCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJZm9yKCA7IGl0ICE9IHRoZUFDLT5lbmQoKSA7ICsraXQgKQorCQkJCXsKKwkJCQkJaWYoIGhhc0lPKCAoKml0KSwgYW5FeGVjdXRpb25Db250ZXh0LCBsb2NhbFRyYWNlKSApCisJCQkJCXsKKwkJCQkJCXZhbHVlQXNzaWduZWQgPSB0cnVlOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCWVsc2UgaWYoIGFuRWxlbWVudC5pczwgRXhlY3V0aW9uQ29uZmlndXJhdGlvbiA+KCkgKQorCXsKKwkJRXhlY3V0aW9uQ29uZmlndXJhdGlvbiAqIHRoZUVDID0gYW5FbGVtZW50LnRvX3B0cjwgRXhlY3V0aW9uQ29uZmlndXJhdGlvbiA+KCk7CisJCXZhbHVlQXNzaWduZWQgPSBoYXNJTyggdGhlRUMsIGFuRXhlY3V0aW9uQ29udGV4dCwgbG9jYWxUcmFjZSk7CisJfQorCisJcmV0dXJuIHZhbHVlQXNzaWduZWQ7Cit9CisKKworYm9vbCBPZmZsaW5lVGVzdFByb2Nlc3Nvcjo6aGFzSU8oCisJCUV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24gKiBhbkV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24sCisJCUV4ZWN1dGlvbkNvbnRleHQgJiBhbkV4ZWN1dGlvbkNvbnRleHQsIFRyYWNlU2VxdWVuY2UgJiBsb2NhbFRyYWNlKQoreworCS8vIFRPRE86IGhlcmUsIHRoZSBleGVjIGNvbmZpZ3VyYXRpb24gaXMgdGhlIG1haW4/IG9uZS4KKwkvLyBNYXliZSB3ZSB3aWxsIG5lZWQgdG8gdGFrZSBpbnRvIGFjY291bnQgY2FzZXMgd2hlcmUgdGhlIGlucHV0L291dHB1dHMKKwkvLyBhcmUgY29uc2lkZXJlZCBmcm9tIGEgc3ViLW1hY2hpbmUgcG9pbnQgb2Ygdmlldy4KKwlib29sIHZhbHVlQXNzaWduZWQgPSBmYWxzZTsKKwlpZiggYW5FeGVjdXRpb25Db25maWd1cmF0aW9uLT5pc0F2bUNvZGUoKSApCisJeworCQljb25zdCBCRkNvZGUgJiB0aGVBQyA9IGFuRXhlY3V0aW9uQ29uZmlndXJhdGlvbi0+Z2V0QXZtQ29kZSgpOworCisJCUFWTV9PU19MT0cgPDwgIk9mZmxpbmVUZXN0UHJvY2Vzc29yOjpoYXNJTyA8IHRoZUFDID4gOiAiCisJCQkJPDwgdGhlQUMuc3RyKCkgPDwgc3RkOjplbmRsOworCisJCXN3aXRjaCggdGhlQUMtPmdldEF2bU9wQ29kZSgpICkKKwkJeworCQkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUIDoKKwkJCXsKKwkJCQlpZiggdGhlQUMtPmZpcnN0KCkuaXM8IEluc3RhbmNlT2ZQb3J0ID4oKSkKKwkJCQl7CisJCQkJCUluc3RhbmNlT2ZQb3J0ICogaW9Qb3J0ID0gdGhlQUMtPmZpcnN0KCkudG9fcHRyPCBJbnN0YW5jZU9mUG9ydCA+KCk7CisJCQkJCWlmKCBpb1BvcnQtPmhhc0FsaWFzVGFyZ2V0KCkgKQorCQkJCQl7CisJCQkJCQlpb1BvcnQgPSBpb1BvcnQtPmdldEFsaWFzVGFyZ2V0KCktPmFzPCBJbnN0YW5jZU9mUG9ydCA+KCk7CisJCQkJCX0KKworCQkJCQkvLyB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgdHJhY2UgY291bGQgYmUgYSBkZWxheSwKKwkJCQkJLy8gKGJ1dCBpdCBtYXkgaGFwcGVuIHRoYXQgaGVyZSBhcmUgdHdvIGNvbnNlY3V0aXZlIGFjdGlvbnMpCisJCQkJCS8vIChidXQgdGhlcmUgYXJlIG5ldmVyIHR3byBjb25zZWN1dGl2ZSB0aW1lIGRlbGF5cykKKwkJCQkJLy8gc28gd2UgY29tcGFyZSBwb3J0cyB3aXRoIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGVudHJpZXMgaW4gdGhlIGxvY2FsT2JzCisJCQkJCS8vIHdlIHJldHJpZXZlIHRoZSBuZXh0IGFjdGlvbiBpbiB0aGUgbG9jYWxUcmFjZQorCQkJCQkvLyBlaXRoZXIgaXQgaXMgaW4gdGhlIGZpcnN0IFRyYWNlUG9pbnQKKwkJCQkJLy8gb3IgdGhlIGZpcnN0IFRyYWNlUG9pbnQgaXMgYSBkZWxheSBhbmQgc28gaXQgbXVzdCBiZSB0aGUgbmV4dCBvbmUKKwkJCQkJVHJhY2VQb2ludCAqIGFUcmFjZVBvaW50ID0gTlVMTDsKKwkJCQkJaWYoIGxvY2FsVHJhY2UucG9pbnRzLm5vbmVtcHR5KCkgKQorCQkJCQl7CisJCQkJCQlhVHJhY2VQb2ludCA9IGxvY2FsVHJhY2UucG9pbnRzLmZpcnN0KCkudG9fcHRyPCBUcmFjZVBvaW50ID4oKTsKKwkJCQkJCWlmKCBhVHJhY2VQb2ludC0+aXNUaW1lKCkgJiYgbG9jYWxUcmFjZS5wb2ludHMucG9wdWxhdGVkKCkgKQorCQkJCQkJeworCQkJCQkJCWFUcmFjZVBvaW50ID0gbG9jYWxUcmFjZS5wb2ludHMuc2Vjb25kKCkudG9fcHRyPCBUcmFjZVBvaW50ID4oKTsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCWlmKCAoYVRyYWNlUG9pbnQgIT0gTlVMTCkKKwkJCQkJCQkmJiAoaW9Qb3J0LT5nZXROYW1lSUQoKSA9PSBhVHJhY2VQb2ludC0+b2JqZWN0LT5nZXROYW1lSUQoKSkKKwkJCQkJCQkmJiAoKGFUcmFjZVBvaW50LT5vcCA9PSBBVk1fT1BDT0RFX0lOUFVUKQorCQkJCQkJCQl8fChhVHJhY2VQb2ludC0+b3AgPT0gQVZNX09QQ09ERV9JTlBVVF9FTlYpKSkKKwkJCQkJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisJQVZNX09TX0xPRyA8PCAiT0ZGTElORSBURVNUOjogSW5wdXQgZm91bmQgb24gcG9ydDogIgorCQkJPDwgaW9Qb3J0LT5nZXROYW1lSUQoKSA8PCBzdGQ6OmVuZGwKKwkJCTw8ICJ3aXRoIG1hY2hpbmUgOiAiIDw8IGlvUG9ydC0+Z2V0UnVudGltZUNvbnRhaW5lclJJRCgpLnN0cigpIDw8IHN0ZDo6ZW5kbAorCQkJPDwgIndpdGggbWFjaGluZSAyIDogIiA8PCBhbkV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24tPmdldFJ1bnRpbWVJRCgpLnN0cigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCisJCQkJCQl2YWx1ZUFzc2lnbmVkID0gbG9va3VwVmFsdWUodGhlQUMsIGFuRXhlY3V0aW9uQ29udGV4dCwKKwkJCQkJCQkJYW5FeGVjdXRpb25Db25maWd1cmF0aW9uLCBpb1BvcnQsCisJCQkJCQkJCXRoZUFDLT5nZXRBdm1PcENvZGUoKSwgbG9jYWxUcmFjZSk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQljb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCA9IGFuRXhlY3V0aW9uQ29udGV4dC5yZWZFeGVjdXRpb25EYXRhKCk7CisJCQkJCVJ1bnRpbWVJRCB0aGVSSUQgPSBhbkV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24tPmdldFJ1bnRpbWVJRCgpOworCisJCQkJCWNvbnN0IFJvdXRpbmdEYXRhICYgaW9SRCA9IEF2bUNvbW11bmljYXRpb25GYWN0b3J5OjoKKwkJCQkJCQlzZWFyY2hJbnB1dFJvdXRpbmdEYXRhKGFuRUQsIGlvUG9ydCwgdGhlUklEKTsKKworCQkJCQlpZiggaW9SRC52YWxpZCgpICkKKwkJCQkJeworCQkJCQkJaWYoIGlvUkQuZ2V0UHJvdG9jb2woKSA9PSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfRU5WSVJPTk1FTlRfS0lORCAgKQorCQkJCQkJeworCQkJCQkJCS8vIHdlIHJldHJpZXZlIHRoZSBuZXh0IGFjdGlvbiBpbiB0aGUgbG9jYWxUcmFjZQorCQkJCQkJCS8vIGVpdGhlciBpdCBpcyBpbiB0aGUgZmlyc3QgVHJhY2VQb2ludAorCQkJCQkJCS8vIG9yIHRoZSBmaXJzdCBUcmFjZVBvaW50IGlzIGEgZGVsYXkgYW5kIHNvIGl0IG11c3QgYmUgdGhlIG5leHQgb25lCisJCQkJCQkJVHJhY2VQb2ludCAqIGFUcmFjZVBvaW50ID0gTlVMTDsKKwkJCQkJCQlpZiggbG9jYWxUcmFjZS5wb2ludHMubm9uZW1wdHkoKSApCisJCQkJCQkJeworCQkJCQkJCQlhVHJhY2VQb2ludCA9IGxvY2FsVHJhY2UucG9pbnRzLmZpcnN0KCkudG9fcHRyPCBUcmFjZVBvaW50ID4oKTsKKwkJCQkJCQkJaWYoIGFUcmFjZVBvaW50LT5pc1RpbWUoKSAmJiBsb2NhbFRyYWNlLnBvaW50cy5wb3B1bGF0ZWQoKSApCisJCQkJCQkJCXsKKwkJCQkJCQkJCWFUcmFjZVBvaW50ID0gbG9jYWxUcmFjZS5wb2ludHMuc2Vjb25kKCkudG9fcHRyPCBUcmFjZVBvaW50ID4oKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKworCQkJCQkJCWlmKCAoYVRyYWNlUG9pbnQgIT0gTlVMTCkKKwkJCQkJCQkJJiYgKGlvUG9ydC0+Z2V0TmFtZUlEKCkgPT0gYVRyYWNlUG9pbnQtPm9iamVjdC0+Z2V0TmFtZUlEKCkpCisJCQkJCQkJCQkmJiAoKGFUcmFjZVBvaW50LT5vcCA9PSBBVk1fT1BDT0RFX0lOUFVUKQorCQkJCQkJCQkJCQl8fGFUcmFjZVBvaW50LT5vcCA9PSBBVk1fT1BDT0RFX0lOUFVUX0VOVikpCisJCQkJCQkJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisJQVZNX09TX0xPRyA8PCAiT0ZGTElORSBURVNUOjogaW5wdXQgZnJvbSBlbnZpcm9ubWVudCBvbiBwb3J0OiAiCisJCQk8PCBpb1BvcnQtPmdldE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbAorCQkJPDwgIndpdGggbWFjaGluZSA6ICIgPDwgaW9Qb3J0LT5nZXRSdW50aW1lQ29udGFpbmVyUklEKCkuc3RyKCkgPDwgc3RkOjplbmRsCisJCQk8PCAid2l0aCBtYWNoaW5lIDIgOiAiIDw8IGFuRXhlY3V0aW9uQ29uZmlndXJhdGlvbi0+Z2V0UnVudGltZUlEKCkuc3RyKCkKKwkJCTw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCisJCQkJCQkJCXZhbHVlQXNzaWduZWQgPSBsb29rdXBWYWx1ZSh0aGVBQywKKwkJCQkJCQkJCQlhbkV4ZWN1dGlvbkNvbnRleHQsCisJCQkJCQkJCQkJYW5FeGVjdXRpb25Db25maWd1cmF0aW9uLAorCQkJCQkJCQkJCWlvUG9ydCwgdGhlQUMtPmdldEF2bU9wQ29kZSgpLAorCQkJCQkJCQkJCWxvY2FsVHJhY2UpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNhc2UgQVZNX09QQ09ERV9PVVRQVVQgOgorCQkJeworCQkJCWlmKCB0aGVBQy0+Zmlyc3QoKS5pczwgSW5zdGFuY2VPZlBvcnQgPigpICkKKwkJCQl7CisJCQkJCUluc3RhbmNlT2ZQb3J0ICogaW9Qb3J0ID0gdGhlQUMtPmZpcnN0KCkudG9fcHRyPCBJbnN0YW5jZU9mUG9ydCA+KCk7CisJCQkJCWlmKCBpb1BvcnQtPmhhc0FsaWFzVGFyZ2V0KCkgKQorCQkJCQl7CisJCQkJCQlpb1BvcnQgPSBpb1BvcnQtPmdldEFsaWFzVGFyZ2V0KCktPmFzPCBJbnN0YW5jZU9mUG9ydCA+KCk7CisJCQkJCX0KKworCQkJCQkvLyB3ZSByZXRyaWV2ZSB0aGUgbmV4dCBhY3Rpb24gaW4gdGhlIGxvY2FsVHJhY2UKKwkJCQkJLy8gZWl0aGVyIGl0IGlzIGluIHRoZSBmaXJzdCBUcmFjZVBvaW50CisJCQkJCS8vIG9yIHRoZSBmaXJzdCBUcmFjZVBvaW50IGlzIGEgZGVsYXkgYW5kIHNvIGl0IG11c3QgYmUgdGhlIG5leHQgb25lCisJCQkJCVRyYWNlUG9pbnQgKiBhVHJhY2VQb2ludCA9IE5VTEw7CisJCQkJCWlmKCBsb2NhbFRyYWNlLnBvaW50cy5ub25lbXB0eSgpICkKKwkJCQkJeworCQkJCQkJYVRyYWNlUG9pbnQgPSBsb2NhbFRyYWNlLnBvaW50cy5maXJzdCgpLnRvX3B0cjwgVHJhY2VQb2ludCA+KCk7CisJCQkJCQlpZiggYVRyYWNlUG9pbnQtPmlzVGltZSgpICYmIGxvY2FsVHJhY2UucG9pbnRzLnBvcHVsYXRlZCgpICkKKwkJCQkJCXsKKwkJCQkJCQlhVHJhY2VQb2ludCA9IGxvY2FsVHJhY2UucG9pbnRzLgorCQkJCQkJCQkJc2Vjb25kKCkudG9fcHRyPCBUcmFjZVBvaW50ID4oKTsKKwkJCQkJCX0KKwkJCQkJfQorLy9BVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKy8vCUFWTV9PU19MT0cgPDwgIk9GRkxJTkUgVEVTVDo6IFRyYWNlUG9pbnQgY29uc2lkZXJlZDogIiA8PCBzdGQ6OmVuZGw7CisvLwlhVHJhY2VQb2ludC0+dG9TdHJlYW0oQVZNX09TX0xPRyA8PCBBVk1fVEFCX0lOREVOVCk7CisvLwlBVk1fT1NfTE9HIDw8ICJDb21waWxlZCBmb3JtIG5hbWUgOiIgPDwgaW9Qb3J0LT5nZXROYW1lSUQoKSA8PCBzdGQ6OmVuZGwKKy8vCQk8PAkiVHJhY2VQb2ludCBvYmplY3QgSWQgOiIgPDxhVHJhY2VQb2ludC0+b2JqZWN0LT5nZXROYW1lSUQoKSA8PCBzdGQ6OmVuZGwKKy8vCQk8PCAiVHJhY2VQb2ludCBvcGVyYXRvciA6IiA8PCBhVHJhY2VQb2ludC0+dG9fc3RyaW5nKGFUcmFjZVBvaW50LT5vcCkgPDwgc3RkOjplbmRsOworLy8JQVZNX09TX0xPRyA8PCBFTkRfSU5ERU5UIDw8IHN0ZDo6ZW5kbDsKKy8vQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisKKworCQkJCQlpZiggKGFUcmFjZVBvaW50ICE9IE5VTEwpCisJCQkJCQkJJiYgKGlvUG9ydC0+Z2V0TmFtZUlEKCkgPT0gYVRyYWNlUG9pbnQtPm9iamVjdC0+Z2V0TmFtZUlEKCkpCisJCQkJCQkJJiYgKChhVHJhY2VQb2ludC0+b3AgPT0gQVZNX09QQ09ERV9PVVRQVVQpCisJCQkJCQkJCXx8YVRyYWNlUG9pbnQtPm9wID09IEFWTV9PUENPREVfT1VUUFVUX0VOVikpCisJCQkJCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCUFWTV9PU19MT0cgPDwgIk9GRkxJTkUgVEVTVDo6IE91dHB1dCBmb3VuZCBvbiBwb3J0OiAiCisJCQk8PCBpb1BvcnQtPmdldE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbAorCQkJPDwgIndpdGggbWFjaGluZSA6ICIgPDwgaW9Qb3J0LT5nZXRSdW50aW1lQ29udGFpbmVyUklEKCkuc3RyKCkgPDwgc3RkOjplbmRsCisJCQk8PCAid2l0aCBtYWNoaW5lIDIgOiAiIDw8IGFuRXhlY3V0aW9uQ29uZmlndXJhdGlvbi0+Z2V0UnVudGltZUlEKCkuc3RyKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisKKwkJCQkJCXZhbHVlQXNzaWduZWQgPSBsb29rdXBWYWx1ZSh0aGVBQywgYW5FeGVjdXRpb25Db250ZXh0LAorCQkJCQkJCQlhbkV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24sIGlvUG9ydCwKKwkJCQkJCQkJdGhlQUMtPmdldEF2bU9wQ29kZSgpLCBsb2NhbFRyYWNlKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVEID0gYW5FeGVjdXRpb25Db250ZXh0LnJlZkV4ZWN1dGlvbkRhdGEoKTsKKwkJCQkJUnVudGltZUlEIHRoZVJJRCA9IGFuRXhlY3V0aW9uQ29uZmlndXJhdGlvbi0+Z2V0UnVudGltZUlEKCk7CisKKwkJCQkJY29uc3QgUm91dGluZ0RhdGEgJiBpb1JEID0gQXZtQ29tbXVuaWNhdGlvbkZhY3Rvcnk6OgorCQkJCQkJCQlzZWFyY2hPdXRwdXRSb3V0aW5nRGF0YShhbkVELCBpb1BvcnQsIHRoZVJJRCk7CisKKwkJCQkJaWYoIGlvUkQudmFsaWQoKSApCisJCQkJCXsKKwkJCQkJCWlmKCBpb1JELmdldFByb3RvY29sKCkgPT0gQ29tUHJvdG9jb2w6OlBST1RPQ09MX0VOVklST05NRU5UX0tJTkQgICkKKwkJCQkJCXsKKwkJCQkJCQkvLyB3ZSByZXRyaWV2ZSB0aGUgbmV4dCBhY3Rpb24gaW4gdGhlIGxvY2FsVHJhY2UKKwkJCQkJCQkvLyBlaXRoZXIgaXQgaXMgaW4gdGhlIGZpcnN0IFRyYWNlUG9pbnQKKwkJCQkJCQkvLyBvciB0aGUgZmlyc3QgVHJhY2VQb2ludCBpcyBhIGRlbGF5IGFuZCBzbyBpdCBtdXN0IGJlIHRoZSBuZXh0IG9uZQorCQkJCQkJCVRyYWNlUG9pbnQgKiBhVHJhY2VQb2ludCA9IE5VTEw7CisJCQkJCQkJaWYoIGxvY2FsVHJhY2UucG9pbnRzLm5vbmVtcHR5KCkgKQorCQkJCQkJCXsKKwkJCQkJCQkJYVRyYWNlUG9pbnQgPSBsb2NhbFRyYWNlLnBvaW50cy5maXJzdCgpLnRvX3B0cjwgVHJhY2VQb2ludCA+KCk7CisJCQkJCQkJCWlmKCBhVHJhY2VQb2ludC0+aXNUaW1lKCkgJiYgbG9jYWxUcmFjZS5wb2ludHMucG9wdWxhdGVkKCkgKQorCQkJCQkJCQl7CisJCQkJCQkJCQlhVHJhY2VQb2ludCA9IGxvY2FsVHJhY2UucG9pbnRzLnNlY29uZCgpLnRvX3B0cjwgVHJhY2VQb2ludCA+KCk7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisKKwkJCQkJCQlpZiggKGFUcmFjZVBvaW50ICE9IE5VTEwpCisJCQkJCQkJCSYmIChpb1BvcnQtPmdldE5hbWVJRCgpID09IGFUcmFjZVBvaW50LT5vYmplY3QtPmdldE5hbWVJRCgpKQorCQkJCQkJCQkmJiAoKGFUcmFjZVBvaW50LT5vcCA9PSBBVk1fT1BDT0RFX09VVFBVVCkKKwkJCQkJCQkJCXx8YVRyYWNlUG9pbnQtPm9wID09IEFWTV9PUENPREVfT1VUUFVUX0VOVikpCisJCQkJCQkJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisJQVZNX09TX0xPRyA8PCAiT0ZGTElORSBURVNUOjogb3V0cHV0IHRvIGVudmlyb25tZW50IG9uIHBvcnQ6ICIKKwkJCTw8IGlvUG9ydC0+Z2V0TmFtZUlEKCkgPDwgc3RkOjplbmRsCisJCQk8PCAid2l0aCBtYWNoaW5lIDogIiA8PCBpb1BvcnQtPmdldFJ1bnRpbWVDb250YWluZXJSSUQoKS5zdHIoKSA8PCBzdGQ6OmVuZGwKKwkJCTw8ICJ3aXRoIG1hY2hpbmUgMiA6ICIgPDwgYW5FeGVjdXRpb25Db25maWd1cmF0aW9uLT5nZXRSdW50aW1lSUQoKS5zdHIoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKworCQkJCQkJCQl2YWx1ZUFzc2lnbmVkID0gbG9va3VwVmFsdWUodGhlQUMsCisJCQkJCQkJCQkJYW5FeGVjdXRpb25Db250ZXh0LAorCQkJCQkJCQkJCWFuRXhlY3V0aW9uQ29uZmlndXJhdGlvbiwKKwkJCQkJCQkJCQlpb1BvcnQsIHRoZUFDLT5nZXRBdm1PcENvZGUoKSwKKwkJCQkJCQkJCQlsb2NhbFRyYWNlKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKworCQkJCWJyZWFrOworCQkJfQorCisJCQljYXNlIEFWTV9PUENPREVfQVNTSUdOX05FV0ZSRVNIIDoKKwkJCXsKKwkJCQl2YWx1ZUFzc2lnbmVkID0gZmFsc2U7CisJCQkJYnJlYWs7CisJCQl9CisKKworCQkJZGVmYXVsdCA6CisJCQl7CisJCQkJdmFsdWVBc3NpZ25lZCA9IGZhbHNlOworCisJCQkJLy8gUGFzIGRlIHLDqWN1cnNpb24gY2FyIGFuRXhlY3V0aW9uQ29uZmlndXJhdGlvbiBlc3QgYXRvbWlxdWUgZHUgcG9pbnQgZGUgdnVlIGxhIEkvTy1UcmFjZQorLy8JCQkJZm9yKEF2bUNvZGU6Oml0ZXJhdG9yIGl0ID0gdGhlQUMtPmJlZ2luKCkgOwlpdCAhPSB0aGVBQy0+ZW5kKCkgOyArK2l0ICkKKy8vCQkJCXsKKy8vCQkJCQlpZiggaGFzSU8oICgqaXQpLCBhbkV4ZWN1dGlvbkNvbnRleHQsIGxvY2FsVHJhY2UpICkKKy8vCQkJCQl7CisvLwkJCQkJCXZhbHVlQXNzaWduZWQgPSB0cnVlOworLy8JCQkJCX0KKy8vCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiB2YWx1ZUFzc2lnbmVkOworfQorCitib29sIE9mZmxpbmVUZXN0UHJvY2Vzc29yOjp1cGRhdGVUaW1lKAorCQlUcmFjZVBvaW50ICogYVRyYWNlUG9pbnQsCisJCUV4ZWN1dGlvbkNvbnRleHQgJiBhbkV4ZWN1dGlvbkNvbnRleHQsCisJCVRyYWNlU2VxdWVuY2UgKiBsb2NhbFRyYWNlKQoreworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisJQVZNX09TX0xPRyA8PCAiVGltZSBwYXNzaW5nLi4uIGFkZCB0aW1lIGNvbnN0cmFpbnQsIGlucHV0IiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKworCWNvbnN0IEJGICYgY3VycmVudFRpbWVWYXIgPSBFTlYuZ2V0UnZhbHVlKAorCQkJYW5FeGVjdXRpb25Db250ZXh0LmdldEFQRXhlY3V0aW9uRGF0YSgpLAorCQkJYW5FeGVjdXRpb25Db250ZXh0LnJlZkV4ZWN1dGlvbkRhdGEoKS5nZXRTeXN0ZW1SSUQoKSwKKwkJCQkJdGltZVJlZmVyZW5jZUluc3RhbmNlLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpKTsKKworCS8vIGFzc2lnbiB0aGUgZGVsYXkgdG8gdGhlIGRpZmZlcmVuY2Ugb2YgY3VycnRpbWUgLSByZWYgdGltZQorCUJGIGJ1aWxkVmFsdWUgPSBFTlYuZ2V0QnVpbGRlcigpLmJ1aWxkKAorCQkJdGhlTWFpbkV4ZWN1dGlvbkRhdGEsIGFUcmFjZVBvaW50LT52YWwoMCkpOworCisJLy9QYXRoQ29uZGl0aW9uUHJvY2Vzc29yOjphZGRQYXRoVGltZWRDb25kaXRpb24oCisJLy8JYW5FeGVjdXRpb25Db250ZXh0LmdldEV4ZWN1dGlvbkRhdGEoKSwKKwlhbkV4ZWN1dGlvbkNvbnRleHQuZ2V0QVBFeGVjdXRpb25EYXRhKCkubXdzZXRQYXRoVGltZWRDb25kaXRpb24oCisJCUV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6YW5kRXhwcigKKwkJCWFuRXhlY3V0aW9uQ29udGV4dC5yZWZFeGVjdXRpb25EYXRhKCkuZ2V0UGF0aFRpbWVkQ29uZGl0aW9uKCksCisJCQlFeHByZXNzaW9uQ29uc3RydWN0b3I6OmVxRXhwcigKKwkJCQlFeHByZXNzaW9uQ29uc3RydWN0b3I6Om1pbnVzRXhwcihjdXJyZW50VGltZVZhciwKKwkJCQkJYW5FeGVjdXRpb25Db250ZXh0LmdldFVuaXFJbmZvcm1hdGlvbigpLT4KKwkJCQkJZ2V0VW5pcU9mZmxpbmVUZXN0UHJvY2Vzc29ySW5mbygpLT5nZXRUaW1lUmVmZXJlbmNlKCkpLAorCQkJCWJ1aWxkVmFsdWUpKSk7CisKKwlpZiggbm90IFNvbHZlckZhY3Rvcnk6OmlzU2F0aXNmaWFibGUodGhlU29sdmVyS2luZCwKKwkJCWFuRXhlY3V0aW9uQ29udGV4dC5yZWZFeGVjdXRpb25EYXRhKCkuZ2V0UGF0aFRpbWVkQ29uZGl0aW9uKCkpICkKKwl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKK0FWTV9PU19MT0cgPDwgIjMuIEZBSUw6IHBhdGggY29uc3RyYWludCBub3Qgc2F0aXNmaWFibGUgKGRlbGF5KSIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8vIHJlbW92ZSByZWFkIHZhbAorCWxvY2FsVHJhY2UtPnBvaW50cy5yZW1vdmVfZmlyc3QoKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisJQVZNX09TX0xPRyA8PCAiQW5kIHRoZSB0aW1lZCBjb25zdHJhaW50IGlzICIKKwkJCTw8IGFuRXhlY3V0aW9uQ29udGV4dC5yZWZFeGVjdXRpb25EYXRhKCkuZ2V0UGF0aFRpbWVkQ29uZGl0aW9uKCkuc3RyKCkKKwkJCTw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCisJcmV0dXJuIHRydWU7Cit9CisKKworCitib29sIE9mZmxpbmVUZXN0UHJvY2Vzc29yOjpsb29rdXBWYWx1ZSgKKwkJQXZtQ29kZSAqIGFuQUMsIEV4ZWN1dGlvbkNvbnRleHQgJiBhbkV4ZWN1dGlvbkNvbnRleHQsCisJCUV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24gKiBhbkV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24sCisJCUluc3RhbmNlT2ZQb3J0ICogYVBvcnQsIEFWTV9PUENPREUgYXZtT3Bjb2RlLAorCQlUcmFjZVNlcXVlbmNlICYgbG9jYWxUcmFjZSkKK3sKKwkvLyBhc3NpZ24gdGhlIHJlc3BlY3RpdmUgdmFsdWUgKGlmIGZvdW5kKSB0byBpdHMgcmVzcGVjdGl2ZSB2YXJpYWJsZQorCisJYm9vbCB2YWx1ZUFzc2lnbmVkID0gZmFsc2U7CisJVHJhY2VQb2ludCAqIGFUcmFjZVBvaW50ID0gTlVMTDsKKwl3aGlsZSggdHJ1ZSApCisJeworCisJCWF2bV9zaXplX3QgbmJQYXJhbSA9IGFQb3J0LT5nZXRQYXJhbWV0ZXJDb3VudCgpOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfTE9HIDw8ICJOdW1iZXIgb2YgcGFyYW1ldGVyczoiIDw8IG5iUGFyYW0gPDwgIHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCisJCWFUcmFjZVBvaW50ID0gbG9jYWxUcmFjZS5wb2ludHMuZmlyc3QoKS50b19wdHI8IFRyYWNlUG9pbnQgPigpOworCisJCS8vIGNvbnNpZGVyaW5nIGNvbW11bmljYXRpb24gYWN0aW9ucworLy9UT0RPOiBjb25zaWRlciBvdGhlciBvYnNlcnZhYmxlIGFjdGlvbnMgKHN1Y2ggYXMgdmFyaWFibGUgYXNzaWduYXRpb25zKSA/CisJCWlmKCAoYXZtT3Bjb2RlID09IEFWTV9PUENPREVfT1VUUFVUKSB8fCAoYXZtT3Bjb2RlID09IEFWTV9PUENPREVfSU5QVVQpICkKKwkJeworCQkJLy8gY29tcGFyZSBhY3Rpb24gaW4gdHJlZSB3aXRoIGxvY2FsIG9iczogb25lIG9yIHR3byBzdGVwcworCQkJLy8gMS4gKGNvbmRpdGlvbmFsKSA6IGlmIHRoZSBmaXJzdCB2YWx1ZSBpcyBhIHRpbWUgdmFyOgorCQkJLy8gYXNzaWduIHRoZSB0aW1lIHRvIHRoZSBkYXRhIHZhcgorCQkJLy8gYW5kIGRlbGV0ZSB0aGUgdHJhY2UgcG9pbnQgZnJvbSB0aGUgdHJhY2UKKwkJCS8vIDIuIGNvbXBhcmUgYWN0aW9uIHdpdGggdHJhY2UgZWxlbWVudAorCisJCQlpZiggYVRyYWNlUG9pbnQtPmlzVGltZSgpICYmCisJCQkJKCAodGhlVGltZVZhckluc3RhbmNlID09IGFUcmFjZVBvaW50LT5vYmplY3QpIC8qfHwKKwkJCQkodGhlVGltZVZhckluc3RhbmNlLT5nZXROYW1lSUQoKSA9PSBhVHJhY2VQb2ludC0+b2JqZWN0LT5nZXROYW1lSUQoKSkqLyApICkKKwkJCXsKKwkJCQkvLyAxLiBjYXNlIHdoZXJlIGZpcnN0IHZhbHVlIGlzIGEgdGltZSB2YXIKKwkJCQl2YWx1ZUFzc2lnbmVkID0gdXBkYXRlVGltZShhVHJhY2VQb2ludCwKKwkJCQkJCWFuRXhlY3V0aW9uQ29udGV4dCwgJmxvY2FsVHJhY2UpOworCQkJCWlmKCBub3QgdmFsdWVBc3NpZ25lZCkKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvL2xvY2FsVHJhY2UucG9pbnRzLnJlbW92ZV9maXJzdCgpOworCQkJfQorCisJCQkvLyBTdGVwIDIgOiBjb21wYXJlIGFjdGlvbiBpbiBzeW1ib2xpYyB0cmVlIHdpdGggdHJhY2UgZWxlbWVudAorCQkJLy9ub3cgcmVhZGluZyB3aGF0IHNob3VsZCBiZSBhIHNpZ25hbAorCQkJYVRyYWNlUG9pbnQgPSBsb2NhbFRyYWNlLnBvaW50cy5maXJzdCgpLnRvX3B0cjwgVHJhY2VQb2ludCA+KCk7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFBST0NFU1NPUiApCisJQVZNX09TX0xPRyA8PCAiVGhlIHBvcnQgaW4gdGhlIHRyYWNlIGlzICIgPDwgYVRyYWNlUG9pbnQtPm9iamVjdC0+c3RyKCkgPDwgc3RkOjplbmRsCisJPDwgIkFuZCB0aGUgcG9ydCBpcyAiIDw8IGFQb3J0LT5nZXROYW1lSUQoKQorCQkJPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCisJCQkvLyBub3cgcmVhZGluZyB2YWx1ZXMgdG8gYmUgY29tcGFyZWQKKworCQkJLy8gdGhlIHNpZ25hbCBzaG91bGQgY29ycmVzcG9uZCB3aXRoIHRoZSB2YWx1ZSBpbgorCQkJLy8gdGhlIHRyYWNlLCBlbHNlIGl0IGlzIHNpbXBseSBub3QgcmVtb3ZlZAorCQkJaWYoIGFUcmFjZVBvaW50LT5vYmplY3QtPmdldE5hbWVJRCgpID09IGFQb3J0LT5nZXROYW1lSUQoKSApCisJCQl7CisJCQkJLy9jaGVja2luZyBkaXJlY3Rpb24gb2Ygc2lnbmFsCisJCQkJaWYoICAoYXZtT3Bjb2RlID09IEFWTV9PUENPREVfT1VUUFVUKSAmJgorCQkJCQkoKGFUcmFjZVBvaW50LT5vcCA9PSBBVk1fT1BDT0RFX0lOUFVUKSB8fAorCQkJCQkoYVRyYWNlUG9pbnQtPm9wID09IEFWTV9PUENPREVfSU5QVVRfRU5WKSkgKQorCQkJCXsKKwkJCQkJQVZNX09TX0xPRyA8PCAiT0ZGTElORSBURVNUOiBXQVJOSU5HISBpbnB1dCB3aGVuIGV4cGVjdGluZyBvdXRwdXQhIgorCQkJCQkJCQk8PCBzdGQ6OmVuZGw7CisJCQkJCXZhbHVlQXNzaWduZWQgPSBmYWxzZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmKCAoYXZtT3Bjb2RlID09IEFWTV9PUENPREVfSU5QVVQpICYmCisJCQkJCSgoYVRyYWNlUG9pbnQtPm9wID09IEFWTV9PUENPREVfT1VUUFVUKSB8fAorCQkJCQkoYVRyYWNlUG9pbnQtPm9wID09IEFWTV9PUENPREVfT1VUUFVUX0VOVikpICkKKwkJCQl7CisJCQkJCUFWTV9PU19MT0cgPDwgIk9GRkxJTkUgVEVTVDogV0FSTklORyEgb3V0cHV0IHdoZW4gZXhwZWN0aW5nIGlucHV0ISIKKwkJCQkJCQkJPDwgc3RkOjplbmRsOworCQkJCQl2YWx1ZUFzc2lnbmVkID0gZmFsc2U7CisJCQkJCWJyZWFrOworCQkJCX0KKworCisJCQkJLy9lYWNoIG9mIHRoZSBwYXJhbWV0ZXJzIG11c3QgbWF0Y2gKKwkJCQlib29sIG1hdGNoaW5nUGFyYW1zID0gdHJ1ZTsKKwkJCQkvL2ludCBwYXJhbU5iID0gMDsKKworCQkJCWlmKCBtYXRjaGluZ1BhcmFtcyApCisJCQkJeworCQkJCQlSdW50aW1lUXVlcnkgUlF1ZXJ5KCBnZXRDb25maWd1cmF0aW9uKCkgKTsKKworCQkJCQlmb3IoIGF2bV9zaXplX3QgaSA9IDAgOyBtYXRjaGluZ1BhcmFtcyAmJiAoaSA8IG5iUGFyYW0pIDsgKytpICkKKwkJCQkJeworCQkJCQkJaWYoIGFuQUMtPmdldChpKzEpLmlzPCBJbnN0YW5jZU9mRGF0YSA+KCkgKQorCQkJCQkJeworCQkJCQkJCUJGIGZvdW5kVmFyID0gUlF1ZXJ5LnNlYXJjaFZhcmlhYmxlKAorCQkJCQkJCQkJYW5FeGVjdXRpb25Db250ZXh0LnJlZkV4ZWN1dGlvbkRhdGEoKSwKKwkJCQkJCQkJCWFuRXhlY3V0aW9uQ29uZmlndXJhdGlvbi0+Z2V0UnVudGltZUlEKCksCisJCQkJCQkJCQlhbkFDLT5nZXQoaSsxKSApOworCisJCQkJCQkJaWYoIGZvdW5kVmFyLnZhbGlkKCkgKQorCQkJCQkJCXsKKwkJCQkJCQkJbWF0Y2hpbmdQYXJhbXMgPSBhc3NpZ25WYWx1ZSgKKwkJCQkJCQkJCQlhbkFDLCBhbkV4ZWN1dGlvbkNvbnRleHQsCisJCQkJCQkJCQkJZm91bmRWYXIsIGFUcmFjZVBvaW50LCBpICk7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCUFWTV9PU19MT0cgPDwgImxvb2t1cFZhbHVlKC4uLik6ICIKKwkJCQkJCQkJCQkJIlVuZm91bmQgc3ltYm9saWMgcGFyYW1ldGVyIDo+ICIKKwkJCQkJCQkJCQkJPDwgYW5BQy0+Z2V0KGkrMSkgPDwgc3RkOjplbmRsOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfTE9HIDw8ICJjdWZpOiAiIDw8IGFuQUMtPmdldChpKzEpLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpLT5nZXRBc3RGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbAorCQkJCTw8ICJwb3J0OiAiIDw8IHN0cl9oZWFkZXIoIGFQb3J0ICkgPDwgc3RkOjplbmRsCisJCQkJPDwgInJpZCA6ICIgPDwgc3RyX2hlYWRlciggYW5FeGVjdXRpb25Db25maWd1cmF0aW9uLT5nZXRSdW50aW1lSUQoKSApIDw8IHN0ZDo6ZW5kbAorCQkJCTw8ICJjb20gOiAiIDw8IHN0cl9oZWFkZXIoIGFuRXhlY3V0aW9uQ29uZmlndXJhdGlvbi0+Z2V0UnVudGltZUlEKCkuZ2V0Q29tbXVuaWNhdG9yKGFQb3J0KSApIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQltYXRjaGluZ1BhcmFtcyA9IGFzc2lnblZhbHVlKAorCQkJCQkJCQkJYW5BQywgYW5FeGVjdXRpb25Db250ZXh0LAorCQkJCQkJCQkJQkY6OlJFRl9OVUxMLCBhVHJhY2VQb2ludCwgaSApOworCQkJCQkJfQorCisJCQkJCQkvKgorCQkJCQkJaWYoIGFuQUMtPmdldChpKzEpLmlzPCBJbnN0YW5jZU9mRGF0YSA+KCkgKQorCQkJCQkJeworCQkJCQkJCXZhbHVlQXNzaWduZWQgPSBhc3NpZ25WYWx1ZShhbkFDLCBhbkV4ZWN1dGlvbkNvbnRleHQsCisJCQkJCQkJCQlhVHJhY2VQb2ludCwgaSk7CisKKwkJCQkJCX0KKworCQkJCQkJZWxzZQorLy8JCQkJCQkJaWYoIGFuQUMtPmdldChpKzEpLmlzTnVtYmVyKCkKKy8vCQkJCQkJCQl8fCBhbkFDLT5nZXQoaSsxKS5pc0Jvb2xlYW4oKQorLy8JCQkJCQkJCXx8IGFuQUMtPmdldChpKzEpLmlzQnVpbHRpblN0cmluZygpCisvLwkJCQkJCQkJfHwgYW5BQy0+Z2V0KGkrMSkuaXNFbnVtU3ltYm9sKCkpCisJCQkJCQkvL1RPRE86IGNoZWNrIHdoZXRoZXIgdGhpcyBpcyBub3QgcHJvYmxlbWF0aWMgKGNlcnRhaW4gdHlwZXMsIG1hY2hpbmUsIGV0YykKKwkJCQkJCXsKKwkJCQkJCQltYXRjaGluZ1BhcmFtcyA9ICgoYVRyYWNlUG9pbnQtPnZhbChpKSA9PSBhbkFDLT5nZXQoaSsxKSkgJiYgbWF0Y2hpbmdQYXJhbXMpOworCQkJCQkJfSovCisKKwkJCQkJCX0KKworCQkJCQlpZiggbWF0Y2hpbmdQYXJhbXMgKQorCQkJCQl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfTE9HIDw8ICJPRkZMSU5FIFRFU1Q6IGNvbSBhY3Rpb24gY29ycmVzcG9uZHMgdG8gdHJhY2UsIGRlbGV0ZSBpdCIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisKKwkJCQkJCWxvY2FsVHJhY2UucG9pbnRzLnJlbW92ZV9maXJzdCgpOworCQkJCQkJdmFsdWVBc3NpZ25lZCA9IHRydWU7CisJCQkJCX0KKworCQkJCQllbHNlCisJCQkJCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCUFWTV9PU19MT0cgPDwgIk9GRkxJTkUgVEVTVDogV0FSTklORzogY29tIGFjdGlvbiA6ICIgOworCWZvciggYXZtX3NpemVfdCBpID0gMCA7IGkgPCBuYlBhcmFtOyArK2kgKQorCXsKKwkJQVZNX09TX0xPRyA8PCAiICIgPDwgYW5BQy0+Z2V0KGkrMSkuc3RyKCkgOworCX0KKwkvL2FQb3J0LT5nZXRQYXJhbWV0ZXIoMCkKKwlBVk1fT1NfTE9HCTw8ICIgZG9lcyBub3QgY29ycmVzcG9uZCB0byB0cmFjZSA6ICIKKwkJCTw8IGFUcmFjZVBvaW50LT52YWx1ZS5zdHIoKQorCQkJPDwgIiAsIGRvIG5vdCBkZWxldGUgaXQgKGJ1dCBkZWxldGluZyBmb3IgdGhlIG1vbWVudCkiCisJCQk8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKworCQkJCQkJdmFsdWVBc3NpZ25lZCA9IGZhbHNlOworCQkJCQkJYW5FeGVjdXRpb25Db250ZXh0LmdldEFQRXhlY3V0aW9uRGF0YSgpLgorCQkJCQkJCQltd3NldFBhdGhDb25kaXRpb24oIEV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9GQUxTRSApOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfTE9HIDw8ICJPRkZMSU5FIFRFU1Q6IFdBUk5JTkcgOiBudW1iZXIgb2YgcGFyYW1ldGVycyBleHBlY3RlZCIgPDwgbmJQYXJhbQorCQkJPDwgIndoaWxlIGFjdHVhbCBudW1iZXIgb2YgcGFyYW1ldGVycyBnaXZlbiBpbiB0aGUgdHJhY2UgaXMiCisJCQk8PCBhVHJhY2VQb2ludC0+dmFsQ291bnQoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJLyoKKwkJLy9Ob3csIHRyZWF0IGNhc2Ugd2hlcmUgbG9jYWwgb2JzIGlzIGFuIGlucHV0CisJCWVsc2UgaWYoIGF2bU9wY29kZSA9PSBBVk1fT1BDT0RFX0lOUFVUICkKKwkJeworCQkJLy8gY2hlY2sgaW5wdXQgaW4gdHJlZSB3aXRoIGxvY2FsIG9iczogb24gb3IgdHdvIHN0ZXBzCisJCQkvLyAxLiBpZiBmaXJzdCBlbGVtZW50IGluIHRyYWNlIGlzIGEgdGltZSB2YXIKKwkJCS8vIGFzc2lnbiB0aW1lIGRhdGEgYW5kIG1vdmUgb24KKwkJCS8vIDIuIGNvbXBhcmUgZWxlbWVudCBpbiB0cmFjZSBhZ2FpbnN0IGlucHV0CisJCQlpZiggYVRyYWNlUG9pbnQtPmlzVGltZSgpICYmCisJCQkJKHRoZVRpbWVWYXJJbnN0YW5jZS0+Z2V0TmFtZUlEKCkgPT0gYVRyYWNlUG9pbnQtPm9iamVjdC0+Z2V0TmFtZUlEKCkpICkKKwkJCXsKKwkJCQl2YWx1ZUFzc2lnbmVkID0gdXBkYXRlVGltZShhVHJhY2VQb2ludCwgYW5FeGVjdXRpb25Db250ZXh0LCAmbG9jYWxUcmFjZSk7CisJCQkJaWYoIHZhbHVlQXNzaWduZWQgPT0gIGZhbHNlICkKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlsb2NhbFRyYWNlLnBvaW50cy5yZW1vdmVfZmlyc3QoKTsKKwkJCX0KKworCQkJLy9ub3cgcmVhZGluZyB3aGF0IHNob3VsZCBiZSBhIHNpZ25hbAorCQkJYVRyYWNlUG9pbnQgPSBsb2NhbFRyYWNlLnBvaW50cy5maXJzdCgpLnRvX3B0cjwgVHJhY2VQb2ludCA+KCk7CisKKy8vQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisvLwlBVk1fT1NfTE9HIDw8ICJUaGUgcG9ydCBpbiB0aGUgdHJhY2UgaXMgIiA8PCBhVHJhY2VQb2ludC0+b2JqZWN0LT5zdHIoKSA8PCBzdGQ6OmVuZGwKKy8vCTw8ICJBbmQgdGhlIHBvcnQgaXMgIiA8PCBhUG9ydC0+Z2V0TmFtZUlEKCkKKy8vCQkJPDwgc3RkOjplbmRsOworLy9BVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKworCQkJLy8gbm93IHJlYWRpbmcgaW5wdXQgdmFsdWUgdG8gYmUgY29tcGFyZWQKKwkJCWlmKCBhVHJhY2VQb2ludC0+b2JqZWN0LT5nZXROYW1lSUQoKSA9PSAgYVBvcnQtPmdldE5hbWVJRCgpICkKKwkJCXsKKworCQkJCWlmKCAoYVRyYWNlUG9pbnQtPm9wID09IEFWTV9PUENPREVfT1VUUFVUKSB8fAorCQkJCQkoYVRyYWNlUG9pbnQtPm9wID09IEFWTV9PUENPREVfT1VUUFVUX0VOVikgKQorCQkJCXsKKwkJCQkJQVZNX09TX0xPRyA8PCAiT0ZGTElORSBURVNUOiBXQVJOSU5HISBvdXRwdXQgd2hlbiBleHBlY3RpbmcgaW5wdXQhIgorCQkJCQkJCQk8PCBzdGQ6OmVuZGw7CisJCQkJCXZhbHVlQXNzaWduZWQgPSBmYWxzZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8vIHRoZSBpbnB1dCBzaG91bGQgY29ycmVzcG9uZCB3aXRoIHRoZSB2YWx1ZSBpbgorCQkJCS8vIHRoZSB0cmFjZSwgZWxzZSBpdCBpcyBzaW1wbHkgbm90IHJlbW92ZWQKKworCQkJCWJvb2wgbWF0Y2hpbmdQYXJhbXMgPSAoYVRyYWNlUG9pbnQtPnZhbENvdW50KCkgPT0gbmJQYXJhbSk7CisKKwkJCQlpZiggbWF0Y2hpbmdQYXJhbXMgKQorCQkJCXsKKwkJCQkJZm9yKCBhdm1fc2l6ZV90IGkgPSAwIDsgbWF0Y2hpbmdQYXJhbXMgJiYgKGkgPCBuYlBhcmFtKSA7ICsraSApCisJCQkJCXsKKwkJCQkJCS8vVE9ETzogYWRkIGNvbmRpdGlvbmFsIG51bWVyaWMvc3ltYm9saWMKKwkJCQkJCWlmKCBhbkFDLT5nZXQoaSsxKS5pczwgSW5zdGFuY2VPZkRhdGEgPigpICkKKwkJCQkJCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCUFWTV9PU19MT0cgPDwgIkFzc2lnbmluZyB2YWx1ZTogIiA8PCBhVHJhY2VQb2ludC0+dmFsKGkpIDw8ICAidG8gdmFyaWFibGU6ICIKKwkJCTw8IGFuQUMtPmdldChpKzEpLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpLT5nZXROYW1lSUQoKQorCQkJPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisKKwkJCQkJCQl2YWx1ZUFzc2lnbmVkID0gYXNzaWduVmFsdWUoYW5BQywKKwkJCQkJCQkJCWFuRXhlY3V0aW9uQ29udGV4dCwgYVRyYWNlUG9pbnQsIGkpOworCisJCQkJCQl9CisKKwkJCQkJCWVsc2UgaWYoIGFuQUMtPmdldChpKzEpLmlzTnVtYmVyKCkKKwkJCQkJCQkJfHwgYW5BQy0+Z2V0KGkrMSkuaXNCb29sZWFuKCkKKwkJCQkJCQkJfHwgYW5BQy0+Z2V0KGkrMSkuaXNCdWlsdGluU3RyaW5nKCkKKwkJCQkJCQkJfHwgYW5BQy0+Z2V0KGkrMSkuaXNFbnVtU3ltYm9sKCkgKQorCQkJCQkJeworCQkJCQkJCW1hdGNoaW5nUGFyYW1zID0gKChhVHJhY2VQb2ludC0+dmFsKGkpID09CisJCQkJCQkJCQlhbkFDLT5nZXQoaSsxKSkgJiYgbWF0Y2hpbmdQYXJhbXMpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisJQVZNX09TX0xPRyA8PCAiVW5leHBlY3RlZCBLaW5kOiAiIDw8IGFuQUMtPmdldChpKzEpLmNsYXNzS2luZE5hbWUoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJaWYoIG1hdGNoaW5nUGFyYW1zKQorCQkJCQl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfTE9HIDw8ICJPRkZMSU5FIFRFU1Q6IG91dHB1dCBjb3JyZXNwb25kcyB0byB0cmFjZSwgZGVsZXRlIGl0IiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKworCQkJCQkJbG9jYWxUcmFjZS5wb2ludHMucmVtb3ZlX2ZpcnN0KCk7CisJCQkJCQl2YWx1ZUFzc2lnbmVkID0gdHJ1ZTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCUFWTV9PU19MT0cgPDwgIk9GRkxJTkUgVEVTVDogV0FSTklORzogaW5wdXQgOiAiIDsKKwlmb3IoIGF2bV9zaXplX3QgaSA9IDAgOyBpIDwgbmJQYXJhbTsgKytpICkKKwl7CisJCUFWTV9PU19MT0cgPDwgIlx0IiA8PCBhbkFDLT5nZXQoaSsxKS5zdHIoKSA7CisJfQorCS8vYVBvcnQtPmdldFBhcmFtZXRlcigwKQorCUFWTV9PU19MT0cJPDwgIiBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIHRyYWNlIDogIgorCQkJPDwgYVRyYWNlUG9pbnQtPnZhbHVlLnN0cigpCisJCQk8PCAiICwgZG8gbm90IGRlbGV0ZSBpdCAoYnV0IGRlbGV0aW5nIGZvciB0aGUgbW9tZW50KSIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisKKwkJCQkJCXZhbHVlQXNzaWduZWQgPSBmYWxzZTsKKworLy8KKyAvLyBUT0RPIE1vZGlmaWNhdGlvbiBkZSBsYSBwYXRoIGNvbmRpdGlvbiBzYW5zIHJpc3F1ZSBkYW5zIGxlIHNtYXJ0IHBvaW50ZXIgRXhlY3V0aW9uRGF0YQorIC8vCisvLwkJCQkJCWlmKCBub3QgUGF0aENvbmRpdGlvblByb2Nlc3Nvcjo6YWRkUGF0aENvbmRpdGlvbigKKy8vCQkJCQkJCWFuRXhlY3V0aW9uQ29udGV4dC5nZXRBUEV4ZWN1dGlvbkRhdGEoKSwKKy8vCQkJCQkJCUV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9GQUxTRSkgKQorLy8JCQkJCQl7CisvLwkJCQkJCQkvLyEhIElOU0FUSVNGSUFCTEUgUEFUSCBDT05ESVRJT04KKy8vCQkJCQkJfQorCisJCQkJCQlhbkV4ZWN1dGlvbkNvbnRleHQuZ2V0QVBFeGVjdXRpb25EYXRhKCkuCisJCQkJCQkJCW13c2V0UGF0aENvbmRpdGlvbiggRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX0ZBTFNFICk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCUFWTV9PU19MT0cgPDwgIk9GRkxJTkUgVEVTVDogV0FSTklORyA6IG51bWJlciBvZiBwYXJhbWV0ZXJzIGV4cGVjdGVkIiA8PCBuYlBhcmFtCisJCQk8PCAid2hpbGUgYWN0dWFsIG51bWJlciBvZiBwYXJhbWV0ZXJzIGdpdmVuIGluIHRoZSB0cmFjZSBpcyIKKwkJCTw8IGFUcmFjZVBvaW50LT52YWxDb3VudCgpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlicmVhazsqLworCX0KKworCWlmKCB2YWx1ZUFzc2lnbmVkICkKKwl7CisJCS8vIFNvbWV0aW1lcywgdGhlIGNvbnN0cmFpbnQgaXMgbm8gbG9uZ2VyIHZhbGlkLCBidXQgaXQgc3RpbGwgYXBwZWFycworCQkvLyBpbiB0aGUgZ3JhcGgKKworCQlpZiggbm90IFNvbHZlckZhY3Rvcnk6OmlzU2F0aXNmaWFibGUodGhlU29sdmVyS2luZCwKKwkJCQlhbkV4ZWN1dGlvbkNvbnRleHQucmVmRXhlY3V0aW9uRGF0YSgpLmdldFBhdGhDb25kaXRpb24oKSkgKQorCQl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfTE9HIDw8ICJXYXJuaW5nISB0aGUgcGF0aCBjb25zdHJhaW50IGFmdGVyIGFzc2lnbmluZyB0aGUgdmFsdWVzIGlzIGZhbHNlICEiCisJCTw8ICJcblx0PT0+IHJldHVybmluZyBmYWxzZSwgc28gdGhlIEVDIGNoaWxkcmVuIHdvbid0IGJlIGV2YWx1YXRlZCBhbnltb3JlICEiCisJCTw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCisJCQl2YWx1ZUFzc2lnbmVkID0gZmFsc2U7CisJCX0KKwkJZWxzZQorCQl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwkJCUFWTV9PU19MT0cgPDwgIlRoZSBjb25zdHJhaW50IGlzIHNhdGlzZmllZCAhIiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwkJfQorCX0KKworCXJldHVybiB2YWx1ZUFzc2lnbmVkOworfQorCitib29sIE9mZmxpbmVUZXN0UHJvY2Vzc29yOjphc3NpZ25WYWx1ZShBdm1Db2RlICogYW5BQywKKwkJRXhlY3V0aW9uQ29udGV4dCAmIGFuRXhlY3V0aW9uQ29udGV4dCwKKwkJRXhlY3V0aW9uQ29uZmlndXJhdGlvbiAqIGFuRXhlY3V0aW9uQ29uZmlndXJhdGlvbiwKKwkJSW5zdGFuY2VPZlBvcnQgKiBhUG9ydCwKKwkJVHJhY2VTZXF1ZW5jZSAmIGxvY2FsVHJhY2UsIGludCBvZmZzZXQpCit7CisJLy8gbG9vayBmb3IgdGhlIHJlc3BlY3RpdmUgdmFsdWU6CisJLy8gc2ltcGxlIHNlYXJjaCBvbiB0aGUgdmVjdG9yIG9mIHBhaXIgb2YgdmFsdWVzIHVudGlsIHdlIGZpbmQKKwkvLyBhIG1hdGNoIG9uIHRoZSB2YXJpYWJsZSBuYW1lOyBpZiBmb3VuZCwgImFzc2lnbiIgdGhlIHZhbHVlLi4uCisJLy8gVGhlIHZhbHVlIGlzIGFzc2lnbmVkIGFzIGEgY29uc3RyYWludCBpbiB0aGUgUGF0aCBDb25kaXRpb24KKwlUcmFjZVBvaW50ICogYVRyYWNlUG9pbnQgPSBsb2NhbFRyYWNlLnBvaW50cy5maXJzdCgpLnRvX3B0cjxUcmFjZVBvaW50PigpOworCWlmKCBhVHJhY2VQb2ludC0+aXNUaW1lKCkgJiYKKwkJKCAodGhlVGltZVZhckluc3RhbmNlID09IGFUcmFjZVBvaW50LT5vYmplY3QpIC8qfHwKKwkJKHRoZVRpbWVWYXJJbnN0YW5jZS0+Z2V0TmFtZUlEKCkgPT0gYVRyYWNlUG9pbnQtPm9iamVjdC0+Z2V0TmFtZUlEKCkpKi8gKSApCisJeworCQkvLyBzaW5jZSB0aGUgdHJhY2VzIGFyZSBvZiB0aGUgZm9ybSBERUxBWS5BQ1RJT04sIGFuZCBzaW5jZSB3ZSBtYXkgaGF2ZSBjb25zZWN1dGl2ZQorCQkvLyBpbnB1dHMvb3V0cHV0cyB3aXRob3V0IGRlbGF5cyBpbiBiZXR3ZWVuIChzdHJ1Y3R1cmVzIG9mIGRhdGEpLAorCQkvLyBpZiB3ZSBhcmUgaW4gc3VjaCBhIGNhc2UgKGEgdHJhY2Ugb2YgdGhlIGZvcm0gNS5hPy5hPyksIHdlIHZlcmlmeSB0aGF0CisJCS8vIHRoZSBGSVJTVCBpdGVtIGluIHRoZSB0cmFjZSBpcyBhIGRlbGF5LCBhbmQgdGhhdCB0aGUgU0VDT05EIG9uZSBpcyB0aGUgaW5wdXQvb3V0cHV0CisJCS8vIHRoYXQgd2UgYXJlIGV4cGVjdGluZyB0byBzZWUuCisJCS8vIFRoaXMgaGFwcGVucyBvbmx5IG9uY2UsIHNpbmNlIGZvciB0aGUgY2FzZSB3aGVuIHRoZSB0cmFjZSBpcyBqdXN0IGE/CisJCS8vIChhbmQgNS5hPyBoYXZlIGJlZW4gcmVhZCksIHdlIGNvbXBhcmUgZGlyZWN0bHkgd2l0aCB0aGUgRklSU1QgaXRlbQorCQkvLyBvZiB0aGUgdHJhY2UKKworCQkvLyBUT0RPOiBjaGFuZ2UgdGhpcyB0byB0YWtlIG91dHB1dHMgaW50byBhY2NvdW50IChuZXh0IHN0ZXApCisJCS8vIGlmIHRoZXJlIGlzIGEgcGFzc2FnZSBvZiB0aW1lIG9ic2VydmF0aW9uLCBqdXN0IGFkZCBpdAorCQkvLyB0byB0aGUgcGF0aCBjb25kaXRpb24gb2YgdGhlIG5vZGUgKEVDKQorCQkvLyBlbWl0IHZlcmRpY3RzIGFjY29yZGluZyB0byBvdXRwdXQKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCUFWTV9PU19MT0cgPDwgIkFzc2lnbiB2YWx1ZTogVGltZSBwYXNzaW5nLi4uIGFkZCB0aW1lIGNvbnN0cmFpbnQiIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCisJCWNvbnN0IEJGICYgY3VycmVudFRpbWVWYXIgPSBFTlYuZ2V0UnZhbHVlKAorCQkJCWFuRXhlY3V0aW9uQ29udGV4dC5nZXRBUEV4ZWN1dGlvbkRhdGEoKSwKKwkJCQlhbkV4ZWN1dGlvbkNvbnRleHQucmVmRXhlY3V0aW9uRGF0YSgpLmdldFN5c3RlbVJJRCgpLAorCQkJCXRpbWVSZWZlcmVuY2VJbnN0YW5jZS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSk7CisKKwkJLy8gYXNzaWduIHRoZSBkZWxheSB0byB0aGUgZGlmZmVyZW5jZSBvZiBjdXJydGltZSAtIHJlZiB0aW1lCisJCUJGIGJ1aWxkVmFsdWUgPSBFTlYuZ2V0QnVpbGRlcigpLmJ1aWxkKAorCQkJCXRoZU1haW5FeGVjdXRpb25EYXRhLCBhVHJhY2VQb2ludC0+dmFsKDApKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisJQVZNX09TX0xPRyA8PCAidGhlIHZhcnMgYXJlOiBjdXJyIHRpbWV2YXI6ICIKKwkJCTw8IGN1cnJlbnRUaW1lVmFyLnN0cigpIDw8IHN0ZDo6ZW5kbAorCQkJPDwgInJlZmVyZW5jZSB0aW1lOj4gIiA8PCBzdGQ6OmVuZGwKKwkJCTw8ICJcdHZhciAgIDogIiA8PCBhbkV4ZWN1dGlvbkNvbnRleHQuZ2V0VW5pcUluZm9ybWF0aW9uKCktPgorCQkJCQlnZXRVbmlxT2ZmbGluZVRlc3RQcm9jZXNzb3JJbmZvKCktPmdldFRpbWVSZWZlcmVuY2UoKS5zdHIoKQorCQkJPDwgc3RkOjplbmRsCisJCQk8PCAiXHR2YWx1ZSA6ICIgPDwgYnVpbGRWYWx1ZS5zdHIoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKworCQlhbkV4ZWN1dGlvbkNvbnRleHQuZ2V0QVBFeGVjdXRpb25EYXRhKCkubXdzZXRQYXRoVGltZWRDb25kaXRpb24oCisJCQlFeHByZXNzaW9uQ29uc3RydWN0b3I6OmFuZEV4cHIoCisJCQkJYW5FeGVjdXRpb25Db250ZXh0LnJlZkV4ZWN1dGlvbkRhdGEoKS5nZXRQYXRoVGltZWRDb25kaXRpb24oKSwKKwkJCQlFeHByZXNzaW9uQ29uc3RydWN0b3I6OmVxRXhwcigKKwkJCQkJRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjptaW51c0V4cHIoY3VycmVudFRpbWVWYXIsCisJCQkJCQlhbkV4ZWN1dGlvbkNvbnRleHQuZ2V0VW5pcUluZm9ybWF0aW9uKCktPgorCQkJCQkJZ2V0VW5pcU9mZmxpbmVUZXN0UHJvY2Vzc29ySW5mbygpLT5nZXRUaW1lUmVmZXJlbmNlKCkpLAorCQkJCQlidWlsZFZhbHVlKSkpOworCisJCWlmKCBub3QgU29sdmVyRmFjdG9yeTo6aXNTYXRpc2ZpYWJsZSh0aGVTb2x2ZXJLaW5kLAorCQkJYW5FeGVjdXRpb25Db250ZXh0LnJlZkV4ZWN1dGlvbkRhdGEoKS5nZXRQYXRoVGltZWRDb25kaXRpb24oKSkgKQorCQl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwkJCUFWTV9PU19MT0cgPDwgIjQuIEZBSUw6IHBhdGggY29uc3RyYWludCBub3Qgc2F0aXNmaWFibGUgZHVlIHRvIGRlbGF5IgorCQkJCQk8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKworCQlsb2NhbFRyYWNlLnBvaW50cy5yZW1vdmVfZmlyc3QoKTsKKwkJYVRyYWNlUG9pbnQgPSBsb2NhbFRyYWNlLnBvaW50cy5maXJzdCgpLnRvX3B0cjxUcmFjZVBvaW50PigpOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfTE9HIDw8ICJBbmQgdGhlIHNlY29uZCB0aW1lZCBjb25zdHJhaW50IGlzICIKKwkJCTw8IGFuRXhlY3V0aW9uQ29udGV4dC5yZWZFeGVjdXRpb25EYXRhKCkuZ2V0UGF0aFRpbWVkQ29uZGl0aW9uKCkuc3RyKCkKKwkJCTw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCisJfQorCisJLy8gZXZlcnl0aGluZyBpcyBPSyBpZiB0aGUgZmlyc3QgdmFsdWUgaW4gdGhlIHRyYWNlIHRvIGJlIHJlYWQgY29ycmVzcG9uZHMKKwkvLyB0byB0aGUgb25lIHRoYXQgd2UgYXJlIGxvb2tpbmcgZm9yLCBlbHNlPz8/CisJYXZtX3NpemVfdCBuYlBhcmFtID0gYVBvcnQtPmdldFBhcmFtZXRlckNvdW50KCk7CisKKwlpZiggKGFUcmFjZVBvaW50LT5vYmplY3QtPmdldE5hbWVJRCgpID09ICBhUG9ydC0+Z2V0TmFtZUlEKCkpICYmCisJCShuYlBhcmFtID09IGFUcmFjZVBvaW50LT52YWxDb3VudCgpKSApCisJeworCQkvL2ludCBuYlBhcmFtID0gYVBvcnQtPmdldFBhcmFtZXRlckNvdW50KCk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCUFWTV9PU19MT0cgPDwgIkZvdW5kIGluIGl0cyBwbGFjZSwgdmFyaWFibGU6ICI7CisJZm9yKCBhdm1fc2l6ZV90IGkgPSAwIDsgaSA8IG5iUGFyYW0gOyArK2kgKQorCXsKKwkJQVZNX09TX0xPRwk8PCAiXHQiIDw8IGFuQUMtPmdldChpKzEpLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOworCX0KKwlBVk1fT1NfTE9HCTw8ICIgaW4gcG9ydCAiIDw8IGFQb3J0LT5nZXROYW1lSUQoKQorCQk8PCAiID09ICIgPDwgYVRyYWNlUG9pbnQtPm9iamVjdC0+c3RyKCkgPDwgc3RkOjplbmRsCisJCTw8ICJ3aXRoIG1hY2hpbmUgMyA6ICIgPDwgYVBvcnQtPmdldFJ1bnRpbWVDb250YWluZXJSSUQoKS5nZXROYW1lSUQoKSA8PCBzdGQ6OmVuZGwKKwkJPDwgIndpdGggbWFjaGluZSA0IDogIiA8PCBhbkV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24tPmdldFJ1bnRpbWVJRCgpLmdldE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbAorCQk8PCAid2l0aCBtYWNoaW5lIDUgOiAiIDw8IGFuRXhlY3V0aW9uQ29uZmlndXJhdGlvbi0+Z2V0UnVudGltZUlEKCkuCisJCQkJZ2V0Q29tbXVuaWNhdG9yKGFQb3J0KS5nZXROYW1lSUQoKSA8PCBzdGQ6OmVuZGwKKwkJPDwgIkFib3V0IHRvIGFzc2lnbiB2YWx1ZTo+ICIgPDwgYVRyYWNlUG9pbnQtPnZhbHVlLnN0cigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCisJCVJ1bnRpbWVRdWVyeSBSUXVlcnkoIGdldENvbmZpZ3VyYXRpb24oKSApOworCisJCWZvciggYXZtX3NpemVfdCBpID0gMCA7IGkgPCBuYlBhcmFtIDsgKytpICkKKwkJeworCQkJLy8gdGhlIHZhbHVlIGlzIHN0b3JlZCBpbiB0aGUgdHJhY2UgcG9pbnQgYW5kIGFjY2Vzc2VkIHRocm91Z2ggdGhlIHZhbCBtZXRob2QKKwkJCUJGIGJ1aWxkVmFsdWUgPSBFTlYuZ2V0QnVpbGRlcigpLmJ1aWxkKAorCQkJCQl0aGVNYWluRXhlY3V0aW9uRGF0YSwgYVRyYWNlUG9pbnQtPnZhbChpKSk7CisKKwkvL1RPRE86IGNoZWNrIHdoZXRoZXIgdGhlcmUgaXMgbm8gaXNzdWUgd2l0aCB0aGUgbWFuYWdlbWVudCBvZiBzdHJpbmdzCisJCQlpZiggYVRyYWNlUG9pbnQtPnZhbChpKS5pc0J1aWx0aW5TdHJpbmcoKSApCisJCQl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfTE9HIDw8ICJBc3NpZ25pbmcgYSBzdHJpbmcgISAiIDw8IGFUcmFjZVBvaW50LT52YWwoaSkuc3RyKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gVE9ETyA6IHRlc3RzCisJCQkJaWYoIG5vdCBQYXRoQ29uZGl0aW9uUHJvY2Vzc29yOjphZGRQYXRoQ29uZGl0aW9uKAorCQkJCQlhbkV4ZWN1dGlvbkNvbnRleHQuZ2V0QVBFeGVjdXRpb25EYXRhKCksCisJCQkJCUV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6ZXFFeHByKGFuQUMtPmdldChpKzEpLCBidWlsZFZhbHVlKSwKKwkJCQkJZmFsc2UpICkKKwkJCQl7CisJCQkJCS8vISEgSU5TQVRJU0ZJQUJMRSBQQVRIIENPTkRJVElPTgorCQkJCQlyZXR1cm4gZmFsc2U7IC8vID8/PyBUT0RPCisKKwkJCQl9CisJCQl9CisKKwkJCUJGIHZhcmlhYmxlSW5zdGFuY2UgPSBSUXVlcnkuc2VhcmNoVmFyaWFibGUoCisJCQkJCWFuRXhlY3V0aW9uQ29udGV4dC5yZWZFeGVjdXRpb25EYXRhKCksCisJCQkJCWFuRXhlY3V0aW9uQ29uZmlndXJhdGlvbi0+Z2V0UnVudGltZUlEKCksIGFuQUMtPmdldChpKzEpICk7CisKKwkJCWlmKCB2YXJpYWJsZUluc3RhbmNlLnZhbGlkKCkgKQorCQkJeworCQkJCS8vIEFzc2lnbiB0aGUgdmFsdWUKKwkJCQlFTlYuc2V0UnZhbHVlKGFuRXhlY3V0aW9uQ29udGV4dC5nZXRBUEV4ZWN1dGlvbkRhdGEoKSwKKwkJCQkJCXZhcmlhYmxlSW5zdGFuY2UudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCksIGJ1aWxkVmFsdWUpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUFWTV9PU19MT0cgPDwgImFzc2lnblZhbHVlKC4uLik6IFVuZm91bmQgc3ltYm9saWMgcGFyYW1ldGVyIDo+ICIKKwkJCQkJCQk8PCBhbkFDLT5nZXQoaSsxKSA8PCBzdGQ6OmVuZGw7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorQVZNX09TX0xPRyA8PCAiY3VmaTogIgorCTw8IGFuQUMtPmdldChpKzEpLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpLT5nZXRBc3RGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbAorCTw8ICJwb3J0OiAiIDw8IHN0cl9oZWFkZXIoIGFQb3J0ICkgPDwgc3RkOjplbmRsCisJPDwgInJpZCA6ICIgPDwgc3RyX2hlYWRlciggYW5FeGVjdXRpb25Db25maWd1cmF0aW9uLT5nZXRSdW50aW1lSUQoKSApIDw8IHN0ZDo6ZW5kbAorCTw8ICJjb20gOiAiIDw8IHN0cl9oZWFkZXIoIGFuRXhlY3V0aW9uQ29uZmlndXJhdGlvbi0+Z2V0UnVudGltZUlEKCkuZ2V0Q29tbXVuaWNhdG9yKGFQb3J0KSApCisJPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisJCQl9CisJCX0KKworCisJCWxvY2FsVHJhY2UucG9pbnRzLnJlbW92ZV9maXJzdCgpOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfTE9HIDw8ICJBZnRlciBvYnNlcnZpbmcgdGhlIGxvY2FsIG9icyB0cmFjZSBvZiBzaXplOiAiCisJCQk8PCBsb2NhbFRyYWNlLnBvaW50cy5zaXplKCkgPDwgc3RkOjplbmRsOworCXByaW50VHJhY2UobG9jYWxUcmFjZSk7CisKKwlBVk1fT1NfTE9HIDw8ICJBbmQgdGhlIGFsbCBjb25zdHJhaW50IGlzIDo+XG5cdCIKKwkJCQk8PCBhbkV4ZWN1dGlvbkNvbnRleHQucmVmRXhlY3V0aW9uRGF0YSgpLmdldEFsbFBhdGhDb25kaXRpb24oKS5zdHIoKQorCQkJCTw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCisJCXJldHVybiB0cnVlOworCX0KKwllbHNlIGlmKCBuYlBhcmFtICE9IGFUcmFjZVBvaW50LT52YWxDb3VudCgpICkKKwl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfTE9HIDw8ICJPRkZMSU5FIFRFU1Q6IFdBUk5JTkcgOiBudW1iZXIgb2YgcGFyYW1ldGVycyBleHBlY3RlZCIgPDwgbmJQYXJhbQorCQkJPDwgIndoaWxlIGFjdHVhbCBudW1iZXIgb2YgcGFyYW1ldGVycyBnaXZlbiBpbiB0aGUgdHJhY2UgaXMiCisJCQk8PCBhVHJhY2VQb2ludC0+dmFsQ291bnQoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwl9CisJZWxzZQorCXsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisJQVZNX09TX0xPRyA8PCAiSW5wdXQvT3V0cHV0IG5vdCBleHBlY3RlZCAoIgorCQkJPDwgYW5BQy0+Z2V0KDEpLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpLT5nZXRBc3RGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQk8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKKworCitib29sIE9mZmxpbmVUZXN0UHJvY2Vzc29yOjphc3NpZ25WYWx1ZSgKKwkJQXZtQ29kZSAqIGFuQUMsIEV4ZWN1dGlvbkNvbnRleHQgJiBhbkV4ZWN1dGlvbkNvbnRleHQsCisJCWNvbnN0IEJGICYgdmFyaWFibGVJbnN0YW5jZSwgVHJhY2VQb2ludCAqIGFUcmFjZVBvaW50LCBpbnQgcGFyYW1OYikKK3sKKworCWJvb2wgdmFsdWVBc3NpZ25lZCA9ZmFsc2U7CisJLy8gdGhlIHZhbHVlIGlzIHN0b3JlZCBpbiB0aGUgdHJhY2UgcG9pbnQgYW5kIGFjY2Vzc2VkIHRocm91Z2ggdGhlIHZhbCBtZXRob2QKKworCWlmKGFuQUMtPmdldChwYXJhbU5iKzEpLmlzQnVpbHRpblN0cmluZygpKQorCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCUFWTV9PU19MT0cgPDwgIkNoZWNraW5nIHN0cmluZyBlcXVhbGl0eSEgIgorCQk8PCBhbkFDLT5nZXQocGFyYW1OYisxKS5zdHIoKQorCQk8PCAiID0/ICIKKwkJPDwgYVRyYWNlUG9pbnQtPnZhbChwYXJhbU5iKS5zdHIoKQorCQk8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwkJdmFsdWVBc3NpZ25lZCA9IChhVHJhY2VQb2ludC0+dmFsKHBhcmFtTmIpID09IGFuQUMtPmdldChwYXJhbU5iKzEpKTsKKwl9CisKKwllbHNlIGlmKGFuQUMtPmdldChwYXJhbU5iKzEpLmlzSWRlbnRpZmllcigpKQorCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorQVZNX09TX0xPRyA8PCAiQ2hlY2tpbmcgdGhhdCBpZGVudGlmaWVycyBtYXRjaDogIgorCQk8PCBhbkFDLT5nZXQocGFyYW1OYisxKS5zdHIoKQorCQk8PCAiID0/ICIKKwkJPDwgYVRyYWNlUG9pbnQtPnZhbChwYXJhbU5iKS5zdHIoKQorCQk8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwkJdmFsdWVBc3NpZ25lZCA9CisJCQkJKGFUcmFjZVBvaW50LT52YWwocGFyYW1OYikudG9fcHRyPCBJZGVudGlmaWVyID4oKS0+Z2V0VmFsdWUoKQorCQkJCT09IGFuQUMtPmdldChwYXJhbU5iKzEpLnRvX3B0cjwgSWRlbnRpZmllciA+KCktPmdldFZhbHVlKCkpOworCX0KKworCS8vZ2VzdGlvbiBkdSB0eXBlIG1hY2hpbmUKKwllbHNlIGlmKCBhbkFDLT5nZXQocGFyYW1OYisxKS5pczwgUnVudGltZUlEID4oKSApCisJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCitBVk1fT1NfTE9HIDw8ICJDaGVja2luZyBtYWNoaW5lIGVxdWFsaXR5OiAiCisJCTw8IGFuQUMtPmdldChwYXJhbU5iKzEpLnN0cigpCisJCTw8ICIgPT8gIgorCQk8PCBhVHJhY2VQb2ludC0+dmFsKHBhcmFtTmIpLnN0cigpCisJCTw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCQlSdW50aW1lSUQgbWFjaGluZSA9IGFuQUMtPmdldChwYXJhbU5iKzEpLmFzX2JmPCBSdW50aW1lSUQgPigpOworCQl2YWx1ZUFzc2lnbmVkID0gKGFUcmFjZVBvaW50LT52YWwocGFyYW1OYikuaXNURVEobWFjaGluZS5nZXRJbnN0YW5jZSgpKSk7CisJfQorCisKKwkvLyBDb25zdCB2YWx1ZQorCS8vIFRPRE8gOiB0ZXN0aW5nIGVxdWFsaXR5IGJldHdlZW4gdmFsdWUgaW4gdHJhY2UgYW5kIGF0IHJ1bnRpbWUgcHJvcGVybHkKKwkvKgorCWVsc2UgaWYoIGFuQUMtPmdldChwYXJhbU5iKzEpLmlzQ29uc3RWYWx1ZSgpICkKKwl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKK0FWTV9PU19MT0cgPDwgIkNoZWNraW5nIHBhcmFtZXRlciBlcXVhbGl0eTogIgorCQk8PCBhbkFDLT5nZXQocGFyYW1OYisxKS5zdHIoKQorCQk8PCAiID0/ICIKKwkJPDwgYVRyYWNlUG9pbnQtPnZhbChwYXJhbU5iKS5zdHIoKQorCQk8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwkJdmFsdWVBc3NpZ25lZCA9IChhVHJhY2VQb2ludC0+dmFsKHBhcmFtTmIpLmlzRVEoYW5BQy0+Z2V0KHBhcmFtTmIrMSkpKTsKKwl9Ki8KKworCS8vIFN5bWJvbGljIGV4ZWN1dGlvbiBWYWx1ZQorCWVsc2UKKwl7CisJCUJGIGJ1aWxkVmFsdWUgPSBFTlYuZ2V0QnVpbGRlcigpLmJ1aWxkKAorCQkJCXRoZU1haW5FeGVjdXRpb25EYXRhLCBhVHJhY2VQb2ludC0+dmFsKHBhcmFtTmIpKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisJQVZNX09TX0xPRyA8PCAiQXNzaWduaW5nIHZhbHVlOiAiIDw8IGFUcmFjZVBvaW50LT52YWwocGFyYW1OYikKKwkJPDwgIiB0byB2YXJpYWJsZTogIiA8PCBhbkFDLT5nZXQocGFyYW1OYisxKS5zdHIoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKworCQkvL1RPRE86IGNoZWNrIHdoZXRoZXIgdGhlcmUgaXMgbm8gaXNzdWUgd2l0aCB0aGUgbWFuYWdlbWVudCBvZiBzdHJpbmdzCisJCWlmKCBhVHJhY2VQb2ludC0+dmFsKHBhcmFtTmIpLmlzQnVpbHRpblN0cmluZygpICkKKwkJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisJQVZNX09TX0xPRyA8PCAiQXNzaWduaW5nIGEgc3RyaW5nICEgIgorCQk8PCBhVHJhY2VQb2ludC0+dmFsKHBhcmFtTmIpLnN0cigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCQl9CisJCWVsc2UgeworCQkJaWYoIG5vdCBQYXRoQ29uZGl0aW9uUHJvY2Vzc29yOjphZGRQYXRoQ29uZGl0aW9uKAorCQkJCWFuRXhlY3V0aW9uQ29udGV4dC5nZXRBUEV4ZWN1dGlvbkRhdGEoKSwKKwkJCQlFeHByZXNzaW9uQ29uc3RydWN0b3I6OmVxRXhwcihhbkFDLT5nZXQocGFyYW1OYisxKSwgYnVpbGRWYWx1ZSksCisJCQkJZmFsc2UgKSApCisJCQkJLy9UT0RPIDogdGVzdGluZyB3aGV0aGVyIGFkZGluZyBwYXJhbWV0ZXIgZmFsc2UgaXMgYmV0dGVyCisJCQl7CisJCQkJLy8hISBJTlNBVElTRklBQkxFIFBBVEggQ09ORElUSU9OCisJCQkJcmV0dXJuIGZhbHNlOyAvLyA/Pz8gVE9ETworCQkJfQorCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcmV0dXJuIHZhbHVlQXNzaWduZWQ7Cit9CisKKworLy9ib29sIE9mZmxpbmVUZXN0UHJvY2Vzc29yOjphc3NpZ25WYWx1ZShBdm1Db2RlICogYW5BQywKKy8vCQlFeGVjdXRpb25Db250ZXh0ICYgYW5FeGVjdXRpb25Db250ZXh0LAorLy8JCUV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24gKiBhbkV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24sCisvLwkJQkYgZGF0YVZhciwgSW5zdGFuY2VPZlBvcnQgKiBhUG9ydCwKKy8vCQlUcmFjZVNlcXVlbmNlICYgbG9jYWxUcmFjZSwgaW50IG9mZnNldCkKKy8veworLy8JLy8gbG9vayBmb3IgdGhlIHJlc3BlY3RpdmUgdmFsdWU6CisvLwkvLyBzaW1wbGUgc2VhcmNoIG9uIHRoZSB2ZWN0b3Igb2YgcGFpciBvZiB2YWx1ZXMgdW50aWwgd2UgZmluZAorLy8JLy8gYSBtYXRjaCBvbiB0aGUgdmFyaWFibGUgbmFtZTsgaWYgZm91bmQsICJhc3NpZ24iIHRoZSB2YWx1ZS4uLgorLy8JLy8gVGhlIHZhbHVlIGlzIGFzc2lnbmVkIGFzIGEgY29uc3RyYWludCBpbiB0aGUgUGF0aCBDb25kaXRpb24KKy8vCVRyYWNlUG9pbnQgKiBhVHJhY2VQb2ludCA9IGxvY2FsVHJhY2UucG9pbnRzLmZpcnN0KCkudG9fcHRyPFRyYWNlUG9pbnQ+KCk7CisvLwlpZiggYVRyYWNlUG9pbnQtPmlzVGltZSgpICYmCisvLwkJKHRoZVRpbWVWYXJJbnN0YW5jZS0+Z2V0TmFtZUlEKCkgPT0gYVRyYWNlUG9pbnQtPm9iamVjdC0+Z2V0TmFtZUlEKCkpICkKKy8vCXsKKy8vCQkvLyBzaW5jZSB0aGUgdHJhY2VzIGFyZSBvZiB0aGUgZm9ybSBERUxBWS5BQ1RJT04sIGFuZCBzaW5jZSB3ZSBtYXkgaGF2ZSBjb25zZWN1dGl2ZQorLy8JCS8vIGlucHV0cy9vdXRwdXRzIHdpdGhvdXQgZGVsYXlzIGluIGJldHdlZW4gKHN0cnVjdHVyZXMgb2YgZGF0YSksCisvLwkJLy8gaWYgd2UgYXJlIGluIHN1Y2ggYSBjYXNlIChhIHRyYWNlIG9mIHRoZSBmb3JtIDUuYT8uYT8pLCB3ZSB2ZXJpZnkgdGhhdAorLy8JCS8vIHRoZSBGSVJTVCBpdGVtIGluIHRoZSB0cmFjZSBpcyBhIGRlbGF5LCBhbmQgdGhhdCB0aGUgU0VDT05EIG9uZSBpcyB0aGUgaW5wdXQvb3V0cHV0CisvLwkJLy8gdGhhdCB3ZSBhcmUgZXhwZWN0aW5nIHRvIHNlZS4KKy8vCQkvLyBUaGlzIGhhcHBlbnMgb25seSBvbmNlLCBzaW5jZSBmb3IgdGhlIGNhc2Ugd2hlbiB0aGUgdHJhY2UgaXMganVzdCBhPworLy8JCS8vIChhbmQgNS5hPyBoYXZlIGJlZW4gcmVhZCksIHdlIGNvbXBhcmUgZGlyZWN0bHkgd2l0aCB0aGUgRklSU1QgaXRlbQorLy8JCS8vIG9mIHRoZSB0cmFjZQorLy8KKy8vCQkvLyBUT0RPOiBjaGFuZ2UgdGhpcyB0byB0YWtlIG91dHB1dHMgaW50byBhY2NvdW50IChuZXh0IHN0ZXApCisvLwkJLy8gaWYgdGhlcmUgaXMgYSBwYXNzYWdlIG9mIHRpbWUgb2JzZXJ2YXRpb24sIGp1c3QgYWRkIGl0CisvLwkJLy8gdG8gdGhlIHBhdGggY29uZGl0aW9uIG9mIHRoZSBub2RlIChFQykKKy8vCQkvLyBlbWl0IHZlcmRpY3RzIGFjY29yZGluZyB0byBvdXRwdXQKKy8vQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisvLwlBVk1fT1NfTE9HIDw8ICJBc3NpZ24gdmFsdWU6IFRpbWUgcGFzc2luZy4uLiBhZGQgdGltZSBjb25zdHJhaW50IiA8PCBzdGQ6OmVuZGw7CisvL0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorLy8KKy8vCQljb25zdCBCRiAmIGN1cnJlbnRUaW1lVmFyID0gRU5WLmdldFJ2YWx1ZSgKKy8vCQkJCWFuRXhlY3V0aW9uQ29udGV4dC5nZXRBUEV4ZWN1dGlvbkRhdGEoKSwKKy8vCQkJCWFuRXhlY3V0aW9uQ29udGV4dC5yZWZFeGVjdXRpb25EYXRhKCkuZ2V0U3lzdGVtUklEKCksCisvLwkJCQl0aW1lUmVmZXJlbmNlSW5zdGFuY2UpOworLy8KKy8vCQkvLyBhc3NpZ24gdGhlIGRlbGF5IHRvIHRoZSBkaWZmZXJlbmNlIG9mIGN1cnJ0aW1lIC0gcmVmIHRpbWUKKy8vCQlCRiBidWlsZFZhbHVlID0gRU5WLmdldEJ1aWxkZXIoKS5idWlsZCgKKy8vCQkJCXRoZU1haW5FeGVjdXRpb25EYXRhLCBhVHJhY2VQb2ludC0+dmFsKDApKTsKKy8vCisvL0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorLy8JQVZNX09TX0xPRyA8PCAidGhlIHZhcnMgYXJlOiBjdXJyIHRpbWV2YXI6ICIKKy8vCQkJPDwgY3VycmVudFRpbWVWYXIuc3RyKCkgPDwgc3RkOjplbmRsCisvLwkJCTw8ICJyZWZlcmVuY2UgdGltZTo+ICIgPDwgc3RkOjplbmRsCisvLwkJCTw8ICJcdHZhciAgIDogIiA8PCBhbkV4ZWN1dGlvbkNvbnRleHQuZ2V0VW5pcUluZm9ybWF0aW9uKCktPgorLy8JCQlnZXRVbmlxT2ZmbGluZVRlc3RQcm9jZXNzb3JJbmZvKCktPmdldFRpbWVSZWZlcmVuY2UoKS5zdHIoKSA8PCBzdGQ6OmVuZGwKKy8vCQkJPDwgIlx0dmFsdWUgOiAiIDw8IGJ1aWxkVmFsdWUuc3RyKCkgPDwgc3RkOjplbmRsOworLy9BVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKy8vCisvLwkJYW5FeGVjdXRpb25Db250ZXh0LmdldEFQRXhlY3V0aW9uRGF0YSgpLm13c2V0UGF0aFRpbWVkQ29uZGl0aW9uKAorLy8JCQlFeHByZXNzaW9uQ29uc3RydWN0b3I6OmFuZEV4cHIoCisvLwkJCQlhbkV4ZWN1dGlvbkNvbnRleHQucmVmRXhlY3V0aW9uRGF0YSgpLmdldFBhdGhUaW1lZENvbmRpdGlvbigpLAorLy8JCQkJCUV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6ZXFFeHByKAorLy8JCQkJCQlFeHByZXNzaW9uQ29uc3RydWN0b3I6Om1pbnVzRXhwcihjdXJyZW50VGltZVZhciwKKy8vCQkJCQkJCWFuRXhlY3V0aW9uQ29udGV4dC5nZXRVbmlxSW5mb3JtYXRpb24oKS0+CisvLwkJCQkJCQlnZXRVbmlxT2ZmbGluZVRlc3RQcm9jZXNzb3JJbmZvKCktPmdldFRpbWVSZWZlcmVuY2UoKSksCisvLwkJCQkJCWJ1aWxkVmFsdWUpKSk7CisvLworLy8JCWlmKCBub3QgU29sdmVyRmFjdG9yeTo6aXNTYXRpc2ZpYWJsZSh0aGVTb2x2ZXJLaW5kLAorLy8JCQlhbkV4ZWN1dGlvbkNvbnRleHQucmVmRXhlY3V0aW9uRGF0YSgpLmdldFBhdGhUaW1lZENvbmRpdGlvbigpKSApCisvLwkJeworLy9BVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKy8vCQkJQVZNX09TX0xPRyA8PCAiNC4gRkFJTDogcGF0aCBjb25zdHJhaW50IG5vdCBzYXRpc2ZpYWJsZSBkdWUgdG8gZGVsYXkiCisvLwkJCQkJPDwgc3RkOjplbmRsOworLy9BVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKy8vCQkJcmV0dXJuIGZhbHNlOworLy8JCX0KKy8vCisvLworLy8JCWxvY2FsVHJhY2UucG9pbnRzLnJlbW92ZV9maXJzdCgpOworLy8JCWFUcmFjZVBvaW50ID0gbG9jYWxUcmFjZS5wb2ludHMuZmlyc3QoKS50b19wdHI8VHJhY2VQb2ludD4oKTsKKy8vCisvL0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorLy8JQVZNX09TX0xPRyA8PCAiQW5kIHRoZSBzZWNvbmQgdGltZWQgY29uc3RyYWludCBpcyAiCisvLwkJCTw8IGFuRXhlY3V0aW9uQ29udGV4dC5yZWZFeGVjdXRpb25EYXRhKCkuZ2V0UGF0aFRpbWVkQ29uZGl0aW9uKCkuc3RyKCkKKy8vCQkJPDwgc3RkOjplbmRsOworLy9BVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKy8vCX0KKy8vCisvLwkvLyBldmVyeXRoaW5nIGlzIE9LIGlmIHRoZSBmaXJzdCB2YWx1ZSBpbiB0aGUgdHJhY2UgdG8gYmUgcmVhZCBjb3JyZXNwb25kcworLy8JLy8gdG8gdGhlIG9uZSB0aGF0IHdlIGFyZSBsb29raW5nIGZvciwgZWxzZT8/PworLy8KKy8vCWlmKCBhVHJhY2VQb2ludC0+b2JqZWN0LT5nZXROYW1lSUQoKSA9PSAgYVBvcnQtPmdldE5hbWVJRCgpICkKKy8vCXsKKy8vQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisvLwlBVk1fT1NfTE9HIDw8ICJGb3VuZCBpbiBpdHMgcGxhY2UsIHZhcmlhYmxlOiAiCisvLwkJPDwgZGF0YVZhci50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorLy8JCTw8ICIgaW4gcG9ydCAiIDw8IGFQb3J0LT5nZXROYW1lSUQoKQorLy8JCTw8ICIgPT0gIiA8PCBhVHJhY2VQb2ludC0+b2JqZWN0LT5zdHIoKSA8PCBzdGQ6OmVuZGwKKy8vCQk8PCAid2l0aCBtYWNoaW5lIDMgOiAiIDw8IGFQb3J0LT5nZXRSdW50aW1lQ29udGFpbmVyUklEKCkuZ2V0TmFtZUlEKCkgPDwgc3RkOjplbmRsCisvLwkJPDwgIndpdGggbWFjaGluZSA0IDogIiA8PCBhbkV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24tPmdldFJ1bnRpbWVJRCgpLmdldE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbAorLy8JCTw8ICJ3aXRoIG1hY2hpbmUgNSA6ICIgPDwgYW5FeGVjdXRpb25Db25maWd1cmF0aW9uLT5nZXRSdW50aW1lSUQoKS4KKy8vCQkJCWdldENvbW11bmljYXRvcihhUG9ydCkuZ2V0TmFtZUlEKCkgPDwgc3RkOjplbmRsCisvLwkJPDwgIkFib3V0IHRvIGFzc2lnbiB2YWx1ZTo+ICIgPDwgYVRyYWNlUG9pbnQtPnZhbCgwKS5zdHIoKSA8PCBzdGQ6OmVuZGw7CisvL0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorLy8KKy8vCQkvLyBmb3IgdGhlIG1vbWVudCwgdGhlIHZhbHVlIGlzIHN0b3JlZCBpbiB0aGUgdGhpcmQgcG9zaXRpb24gb2YgdGhlIGxpc3QKKy8vCQkvLyB0aGUgdmFsdWUgaXMgc3RvcmVkIGluIHRoZSB0cmFjZSBwb2ludCBhbmQgYWNjZXNzZWQgdGhyb3VnaCB0aGUgdmFsIG1ldGhvZAorLy8JCUJGIGJ1aWxkVmFsdWUgPSBFTlYuZ2V0QnVpbGRlcigpLmJ1aWxkKAorLy8JCQkJdGhlTWFpbkV4ZWN1dGlvbkRhdGEsIGFUcmFjZVBvaW50LT52YWwoMCkpOworLy8KKy8vLy9UT0RPOiBjaGVjayB3aGV0aGVyIHRoZXJlIGlzIG5vIGlzc3VlIHdpdGggdGhlIG1hbmFnZW1lbnQgb2Ygc3RyaW5ncworLy8JCWlmKCBhVHJhY2VQb2ludC0+dmFsKDApLmlzQnVpbHRpblN0cmluZygpICkKKy8vCQl7CisvL0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorLy8JQVZNX09TX0xPRyA8PCAiQXNzaWduaW5nIGEgc3RyaW5nICEgIgorLy8JCQkvLzw8ZGF0YVZhci50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKS0+Z2V0QXN0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCBzdGQ6OmVuZGwKKy8vCQkJLy88PCBhVHJhY2VQb2ludC0+dmFsKDApLnN0cigpCisvLwkJCTw8IHN0ZDo6ZW5kbDsKKy8vQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisvLwkJfQorLy8JCWVsc2UgeworLy8JCQlhbkV4ZWN1dGlvbkNvbnRleHQuZ2V0QVBFeGVjdXRpb25EYXRhKCkubXdzZXRQYXRoQ29uZGl0aW9uKAorLy8JCQkJRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjphbmRFeHByKAorLy8JCQkJCWFuRXhlY3V0aW9uQ29udGV4dC5yZWZFeGVjdXRpb25EYXRhKCkuZ2V0UGF0aENvbmRpdGlvbigpLAorLy8JCQkJCUV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6ZXFFeHByKGRhdGFWYXIsIGJ1aWxkVmFsdWUpKSk7CisvLwkJfQorLy8KKy8vCQlCRiB2YXJpYWJsZUluc3RhbmNlID0gRU5WLmdldEJ1aWxkZXIoKS5zZWFyY2hTeW1ib2xEYXRhKAorLy8JCQkJdGhlTWFpbkV4ZWN1dGlvbkRhdGEsIGRhdGFWYXItPmdldEFzdEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkpOworLy8KKy8vCQkvLyBBc3NpZ24gdGhlIHZhbHVlCisvLwkJRU5WLnNldFJ2YWx1ZShhbkV4ZWN1dGlvbkNvbnRleHQuZ2V0QVBFeGVjdXRpb25EYXRhKCksCisvLwkJCQl2YXJpYWJsZUluc3RhbmNlLCBidWlsZFZhbHVlKTsKKy8vCQlsb2NhbFRyYWNlLnBvaW50cy5yZW1vdmVfZmlyc3QoKTsKKy8vCisvL0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorLy8JQVZNX09TX0xPRyA8PCAiQWZ0ZXIgb2JzZXJ2aW5nIHRoZSBsb2NhbCBvYnMgdHJhY2Ugb2Ygc2l6ZTogIgorLy8JCQk8PCBsb2NhbFRyYWNlLnBvaW50cy5zaXplKCkgPDwgc3RkOjplbmRsOworLy8JcHJpbnRUcmFjZShsb2NhbFRyYWNlKTsKKy8vCisvLwlBVk1fT1NfTE9HIDw8ICJBbmQgdGhlIGFsbCBjb25zdHJhaW50IGlzIDo+XG5cdCIKKy8vCQkJPDwgYW5FeGVjdXRpb25Db250ZXh0LnJlZkV4ZWN1dGlvbkRhdGEoKS5nZXRBbGxQYXRoQ29uZGl0aW9uKCkuc3RyKCkKKy8vCQkJPDwgc3RkOjplbmRsOworLy9BVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKy8vCisvLwkJcmV0dXJuIHRydWU7CisvLwl9CisvLwllbHNlCisvLwl7CisvLworLy9BVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKy8vCUFWTV9PU19MT0cgPDwgIklucHV0L091dHB1dCBub3QgZXhwZWN0ZWQgKCIgPDwKKy8vCQkJZGF0YVZhci50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKS0+Z2V0QXN0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorLy8JCQk8PCBzdGQ6OmVuZGw7CisvL0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorLy8JfQorLy8KKy8vCXJldHVybiBmYWxzZTsKKy8vfQorCisvKmJvb2wgT2ZmbGluZVRlc3RQcm9jZXNzb3I6OnJlQXNzaWduVmFsdWUoQXZtQ29kZSAqIGFuQUMsCisvLwkJRXhlY3V0aW9uQ29udGV4dCAmIGFuRXhlY3V0aW9uQ29udGV4dCwKKy8vCQlCRiBhVmFsdWUsIEluc3RhbmNlT2ZQb3J0ICogYVBvcnQsCisvLwkJVmVjdG9yT2ZQYWlyT2ZWYXJpYWJsZVZhbHVlICogYVRhYmxlLCBpbnQgb2Zmc2V0KQorLy97CisvLyBUaGlzIHZlcnNpb24gb2YgdGhlIG1ldGhvZCBpcyBmb3IgY2hhbmdpbmcgdGhlIHZhbHVlCisvLyAiYXNzb2NpYXRlZCIgd2l0aCBwb3J0IGFQb3J0CisKKworCVRyaXBsZU9mUG9ydFZhcmlhYmxlT2Zmc2V0IGFUdXBsZTsKKworCVZlY3Rvck9mUGFpck9mVmFyaWFibGVWYWx1ZTo6aXRlcmF0b3IgaXQgPSBhVGFibGUtPmJlZ2luKCk7CisJVmVjdG9yT2ZQYWlyT2ZWYXJpYWJsZVZhbHVlOjppdGVyYXRvciBpdGVuZCA9IGFUYWJsZS0+ZW5kKCk7CisKKwkvLyBsb29wIGl0ZXJhdGluZyBvbiB0aGUgdmVjdG9yIG9mIHZhcmlhYmxlL3ZhbHVlcyAocGFyYW1ldGVycyBmaWxlKQorCWZvciggOyBpdCAhPSBpdGVuZCA7ICsraXQpCisJeworCQkvLyBsb29wIGl0ZXJhdGluZyBvbiB0aGUgdmVjdG9yIG9mIG1vZGlmaWVkIHZhcmlhYmxlcworCQlmb3IgKHNpemVfdCBpPTAgOyBpIDwgdGhlVmVjdG9yT2ZQb3J0VmFyaWFibGVPZmZzZXQuc2l6ZSgpIDsgKytpICkKKwkJeworCQkJYVR1cGxlID0gdGhlVmVjdG9yT2ZQb3J0VmFyaWFibGVPZmZzZXRbaV07CisJCQlpZiggYVBvcnQgIT0gYVR1cGxlLmdldDwwPigpLnRvX3B0cjwgSW5zdGFuY2VPZlBvcnQgPigpICkKKwkJCXsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCUFWTV9PU19MT0cgPDwgInNlYXJjaCBtYXBwaW5nICIgPDwgc3RkOjplbmRsOworCisJCQlpZiggb3BlcmF0b3I9PShhVHVwbGUsIGJvb3N0OjptYWtlX3R1cGxlKAorCQkJCQlhUG9ydCwoKml0KS5maXJzdCgpLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpLCBvZmZzZXQpKSApCisJCQl7CisJCQkJQVZNX09TX0xPRyA8PCAibWFwcGluZyBmb3VuZCEhISAiCisJCQkJCQk8PCBhVHVwbGUuZ2V0PDA+KCkudG9fcHRyPCBJbnN0YW5jZU9mUG9ydCA+KCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJCQkJPDwgIiwiIDw8IGFUdXBsZS5nZXQ8MT4oKS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKS5zdHIoKQorCQkJCQkJPDwgIiwiIDw8IGFUdXBsZS5nZXQ8Mj4oKSA8PCAiIGNvbiAiIDw8IGFQb3J0LT5zdHIoKQorCQkJCQkJPDwgIiwiIDw8ICgqaXQpLmZpcnN0KCktPnRvPCBJbnN0YW5jZU9mRGF0YSA+KCktPnN0cigpCisJCQkJCQk8PCAiLCIgPDwgb2Zmc2V0IDw8IHN0ZDo6ZW5kbDsKKworCQkJCS8vIENyZWF0ZSBhIG5ldyBzaW1ib2xpYyB2YXIgYW5kIGFzc2lnbiB0aGUgY29uc3RyYWludAorCisKKwkJCQlBVk1fT1NfTE9HIDw8ICJ2aWVuZG8gYWhvcmEgbGEgc3ltYm9saWMgdmFyLi4uIHBhcmEgICIKKwkJCQkJCTw8ICgqaXQpLmZpcnN0KCktPmdldEFzdEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgc3RkOjplbmRsCisJCQkJCQk8PCAidmllbmRvIGFob3JhIGxhIHN5bWJvbGljIHZhci4uLiBwYXJhICAiCisJCQkJCQk8PCAoKml0KS5maXJzdCgpLT5nZXRBc3ROYW1lSUQoKSA8PCBzdGQ6OmVuZGw7CisKKwkJCQlJbnN0YW5jZU9mTWFjaGluZSAqIHRoZU1haW5TcGVjaWZpY2F0aW9uID0KKwkJCQkJZ2V0Q29uZmlndXJhdGlvbigpLmdldEV4ZWN1dGFibGVTeXN0ZW0oKS5nZXRTeXN0ZW1JbnN0YW5jZSgpOworCQkJCWlmKCB0aGVNYWluU3BlY2lmaWNhdGlvbiAhPSBOVUxMICkKKwkJCQl7CisJCQkJCUFWTV9PU19MT0cgPDwgImFsIG1lbm9zIG5vIGVzIG51bGwgXG4iOworCQkJCX0KKwkJCQlWYXJpYWJsZSAqIGFWYXIgPSB0aGVNYWluU3BlY2lmaWNhdGlvbi0+Z2V0RXhlY3V0YWJsZSgpLT4KKwkJCQkJZ2V0QXN0TWFjaGluZSgpLT5nZXRWYXJpYWJsZSggKCppdCkuZmlyc3QoKS0+Z2V0QXN0TmFtZUlEKCkgKTsKKwkJCQljb25zdCBCRiAmIHJpcHZhbHVlID0gRU5WLmdldFJ2YWx1ZShhbkV4ZWN1dGlvbkNvbnRleHQuZ2V0QVBFeGVjdXRpb25EYXRhKCksCisJCQkJCWFuRXhlY3V0aW9uQ29udGV4dC5yZWZFeGVjdXRpb25EYXRhKCkuZ2V0UnVudGltZUlEKHRoZU1haW5TcGVjaWZpY2F0aW9uKSwKKwkJCQkJCSgqaXQpLmZpcnN0KCkudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCkpOworCQkJCWlmKCBhVmFyICE9IE5VTEwgKQorCQkJCXsKKwkJCQkJSW5zdGFuY2VPZkRhdGEgKiB2YXJHbG9iYWxUaW1lID0gdGhlTWFpblNwZWNpZmljYXRpb24tPgorCQkJCQkJCWdldEV4ZWN1dGFibGUoKS0+Z2V0QWxsRGF0YSgpLnJhd0J5Q29tcGlsZWQoYVZhcik7CisJCQkJCUFWTV9PU19MT0cgPDwgIlZFTU9TTk9PT1NTU1MuLi4uLi4uLi47ICIKKwkJCQkJCQk8PCB2YXJHbG9iYWxUaW1lLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbDsKKwkJCQkJY29uc3QgQkYgJiBydmFsdWUgPSBFTlYuZ2V0UnZhbHVlKGFuRXhlY3V0aW9uQ29udGV4dC5nZXRBUEV4ZWN1dGlvbkRhdGEoKSwKKwkJCQkJCWFuRXhlY3V0aW9uQ29udGV4dC5yZWZFeGVjdXRpb25EYXRhKCkuZ2V0UnVudGltZUlEKHRoZU1haW5TcGVjaWZpY2F0aW9uKSwKKwkJCQkJCXZhckdsb2JhbFRpbWUpOworCQkJCQlBVk1fT1NfTE9HIDw8ICJWRU1PU05PcyBNQVMgOiAiIDw8IHJ2YWx1ZS5zdHIoKTsKKwkJCQl9CisJCQkJaWYoIHJpcHZhbHVlLnZhbGlkKCkgKQorCQkJCXsKKwkJCQkJQVZNX09TX0xPRyA8PCAicHJ2b2JlbW9zIGEgdmVyIDogIiA8PCByaXB2YWx1ZS5zdHIoKSA8PCBzdGQ6OmVuZGw7CisJCQkJfQorCQkJCUFWTV9PU19MT0cgPDwgIkVTIE5VTExMTCBcbiI7CisJCQkJLy8gdHVwbGUgZm91bmQsIHJlcGxhY2Ugd2l0aCBuZXcgdmFsdWUKKwkJCQlCRiBidWlsZFZhbHVlID0gRU5WLmdldEJ1aWxkZXIoKS5idWlsZCh0aGVNYWluRXhlY3V0aW9uRGF0YSwgYVZhbHVlKTsKKwkJCQlFTlYuc2V0UnZhbHVlKGFuRXhlY3V0aW9uQ29udGV4dC5nZXRBUEV4ZWN1dGlvbkRhdGEoKSwKKwkJCQkJCSgqaXQpLmZpcnN0KCksIGJ1aWxkVmFsdWUpOworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJfQorCS8vCXJldHVybiBmYWxzZTsKKwkvL30KKwkgKi8KKwordm9pZCBPZmZsaW5lVGVzdFByb2Nlc3Nvcjo6dHJhbnNpdGlvbkluTGlzdCgKKwkJY29uc3QgQkYgJiBhRkYsIFRyYWNlU2VxdWVuY2UgJiBhVGVzdFB1cnBvc2UsIGJvb2wgJiBmbGFnKQoreworCWlmKCBhRkYuaXM8IEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24gPigpICkKKwl7CisJCUV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24gKiB0aGVFQyA9IGFGRi50b19wdHI8IEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24gPigpOworCQlpZiggdGhlRUMtPmhhc0NvZGUoKSApCisJCXsKKwkJCWlmKCB0aGVFQy0+aXNUcmFuc2l0aW9uKCkgKQorCQkJeworCQkJCWlmKCBhVGVzdFB1cnBvc2UuY29udGFpbnNPYmplY3QodGhlRUMtPnRvVHJhbnNpdGlvbigpKSApCisJCQkJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisJQVZNX09TX0xPRyA8PCAiVHJhbnNpdGlvbiBmb3VuZCBpbiBUUCAhIgorCQkJPDwgdGhlRUMtPnRvVHJhbnNpdGlvbigpLT5nZXRBc3ROYW1lSUQoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKworCQkJCQlmbGFnID0gdHJ1ZTsKKwkJCQl9CisKKwkJCQkvL2FkZGluZyBjYXNlIHdoZXJlIG5vIHRlc3QgcHVycG9zZSBpcyBzcGVjaWZpZWQKKwkJCQkvL3Nob3VsZCBub3QgYmUgdXNlZCBhbnkgbW9yZSwgdHJlYXRlZCBpbiBwb3N0cHJvY2VzcworCQkJCS8qCisJCQkJZWxzZSBpZiggYVRlc3RQdXJwb3NlLnBvaW50cy5lbXB0eSgpICkKKwkJCQl7CisJCQkJCWZsYWcgPSB0cnVlOworCQkJCQlBVk1fT1NfV0FSTiA8PCAiTkI6IFRoZSB2ZXJkaWN0IHdhcyBjb21wdXRlZCB3aXRoIG5vIHRlc3QgcHVycG9zZS4gIiA8PCBzdGQ6OmVuZGw7CisJCQkJfSovCisKKwkJCX0KKworCQl9CisJfQorCisJZWxzZSBpZiggYUZGLmlzPCBBdm1Db2RlID4oKSApCisJeworCQljb25zdCBCRkNvZGUgJiB0aGVBQyA9IGFGRi5iZkNvZGUoKTsKKwkJQkZDb2RlIG5ld0FDKHRoZUFDLT5nZXRPcGVyYXRvcigpKTsKKworCQlCRiBiZjsKKworCQlmb3IoQXZtQ29kZTo6aXRlcmF0b3IgaXQgPSB0aGVBQy0+YmVnaW4oKSA7IGl0ICE9IHRoZUFDLT5lbmQoKSA7ICsraXQgKQorCQl7CisJCQl0cmFuc2l0aW9uSW5MaXN0KCgqaXQpLCBhVGVzdFB1cnBvc2UsIGZsYWcpOworCQl9CisJfQorfQorCitib29sIE9mZmxpbmVUZXN0UHJvY2Vzc29yOjpwcmVmaWx0ZXIoKQoreworLy8JRXhlY3V0aW9uQ29udGV4dCAmIGRlbEVDID0gTlVMTDsKKworCWVjUXVldWUgPSAmKCBnZXRFeGVjdXRpb25RdWV1ZSgpLmdldFJlYWR5UXVldWUoKSApOworCWVjUXVldWVJdCA9IGVjUXVldWUtPmJlZ2luKCk7CisJZWNRdWV1ZUl0RW5kID0gZWNRdWV1ZS0+ZW5kKCk7CisJZm9yKCA7IGVjUXVldWVJdCAhPSBlY1F1ZXVlSXRFbmQgOyApCisJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisJQVZNX09TX0xPRyA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsIDw8ICJXb3JraW5nIHdpdGggRUM6ICIKKwkJCTw8ICgqZWNRdWV1ZUl0KS0+c3RyX21pbigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCisJCWlmKCBub3QgcHJlZmlsdGVyKCogKCplY1F1ZXVlSXQpKSApCisJCXsKKwkJCUFWTV9PU19MT0cgPDwgIk9mZmxpbmVUZXN0UHJvY2Vzc29yOjpQcmVmaWx0ZXIgd29uJ3QgY29udGludWUgaGVyZSEiCisJCQkJCTw8IHN0ZDo6ZW5kbDsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisJQVZNX09TX0xPRyA8PCAiRXJhc2luZyBFQzogIiA8PCAoKmVjUXVldWVJdCktPnN0cl9taW4oKSA8PCBzdGQ6OmVuZGwKKwkJCTw8ICJcdEl0J3MgdGhlICIgPDwgKCsrdGhlRXJhc2VkTm9kZXMpCisJCQk8PCAiJ250aCBFQyB0aGF0IGhhcyBiZWVuIGRlbGV0ZWQgISIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisKKy8vCQkJZGVsRUMgPSAoKml0KTsKKworCQkJZWNRdWV1ZUl0ID0gZWNRdWV1ZS0+ZXJhc2UoZWNRdWV1ZUl0KTsKKworLy8JCQlBYnN0cmFjdFByb2Nlc3NvclVuaXQ6OnJlbW92ZShkZWxFQyAsCisvLwkJCQkJQVZNX09TX0xPRywgIk9mZmxpbmVUZXN0UHJvY2Vzc29yOjpyZW1vdmUiKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWVjUXVldWVJdCsrOworCQl9CisJfQorCXJldHVybiAoZ2V0RXhlY3V0aW9uUXVldWUoKS5oYXNSZWFkeSgpKTsKK30KKworYm9vbCBPZmZsaW5lVGVzdFByb2Nlc3Nvcjo6aGFzSU8oY29uc3QgQkYgJiBhbkVsZW1lbnQpCit7CisJaWYoIGFuRWxlbWVudC5pbnZhbGlkKCkgKQorCXsKKwkJcmV0dXJuIChmYWxzZSk7CisJfQorCWVsc2UgaWYoIGFuRWxlbWVudC5pczwgQXZtQ29kZSA+KCkgKQorCXsKKwkJQXZtQ29kZSAqIHRoZUFDID0gYW5FbGVtZW50LnRvX3B0cjwgQXZtQ29kZSA+KCk7CisJCXN3aXRjaCAodGhlQUMtPmdldEF2bU9wQ29kZSgpKXsKKwkJCS8vY2FzZSBBVk1fT1BDT0RFX0FTU0lHTl9ORVdGUkVTSCA6CisJCQljYXNlIEFWTV9PUENPREVfSU5QVVQ6CisJCQljYXNlIEFWTV9PUENPREVfT1VUUFVUOgorCQkJeworCQkJCXJldHVybiB0cnVlOworCQkJfWRlZmF1bHQ6CisJCQl7CisJCQkJZm9yKEF2bUNvZGU6Oml0ZXJhdG9yIGl0ID0gdGhlQUMtPmJlZ2luKCk7aXQgIT0gdGhlQUMtPmVuZCgpOysraXQpCisJCQkJeworCQkJCQlpZiggaGFzSU8oICgqaXQpICkgKQorCQkJCQl7CisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJfQorCQkJCX0KKworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCisJfQorCWVsc2UgaWYoIGFuRWxlbWVudC5pczwgRXhlY3V0aW9uQ29uZmlndXJhdGlvbiA+KCkgKQorCXsKKwkJcmV0dXJuIChoYXNJTyhhbkVsZW1lbnQudG9fcHRyPCBFeGVjdXRpb25Db25maWd1cmF0aW9uID4oKS0+Z2V0Q29kZSgpKSk7CisJfQorCisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgT2ZmbGluZVRlc3RQcm9jZXNzb3I6OnBvcnRJbk9ic1NpZ25hbHMoY29uc3QgUnVudGltZUlEICYgcnVudGltZUN0eCwKKwkJSW5zdGFuY2VPZlBvcnQgKiBwb3J0LCBBVk1fT1BDT0RFIGlvT3Bjb2RlKQoreworCUJGTGlzdDo6Y29uc3RfaXRlcmF0b3IgaXRQb2ludCA9IHRoZU9ic1NpZ25hbHMucG9pbnRzLmJlZ2luKCk7CisJQkZMaXN0Ojpjb25zdF9pdGVyYXRvciBlbmRQb2ludCA9IHRoZU9ic1NpZ25hbHMucG9pbnRzLmVuZCgpOworCVRyYWNlUG9pbnQgKiBhVHJhY2Vwb2ludDsKKwlmb3IoIDsgaXRQb2ludCAhPSBlbmRQb2ludCA7ICsraXRQb2ludCkKKwl7CisJCWlmKCAoKml0UG9pbnQpLmlzPCBUcmFjZVBvaW50ID4oKSApCisJCXsKKwkJCWFUcmFjZXBvaW50ID0gKCppdFBvaW50KS50b19wdHI8IFRyYWNlUG9pbnQgPigpOworCisJCQlpZiggYVRyYWNlcG9pbnQtPmlzQ29tKGlvT3Bjb2RlLCBydW50aW1lQ3R4LCBwb3J0KSApCisJCQl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfTE9HIDw8ICJGb3VuZCwgcG9ydCBpbiBtYWNoaW5lOiAiIDw8IGFUcmFjZXBvaW50LT50b1N0cmluZygpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCQllbHNlCisJCQl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFBST0NFU1NPUiApCisJQVZNX09TX0xPRyA8PCAiTk9UIEZvdW5kLCBwb3J0IGluIG1hY2hpbmUgKGZyb20gdHJlZSk6ICIKKwkJCTw8IHJ1bnRpbWVDdHguZ2V0UXVhbGlmaWVkTmFtZUlEKCkgPDwgIiAtPiAiIDw8IFRyYWNlUG9pbnQ6OnRvX3N0cmluZyhpb09wY29kZSkKKwkJCTw8ICIgcG9ydCAiIDw8IHBvcnQtPmdldFF1YWxpZmllZE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbDsKKwlBVk1fT1NfTE9HIDw8ICJOT1QgRm91bmQsIGNvbXBhcmluZyB3aXRoIChmcm9tIG9icyBzaWduYWxzKTogIgorCQkJPDwgYVRyYWNlcG9pbnQtPnRvU3RyaW5nKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCitib29sIE9mZmxpbmVUZXN0UHJvY2Vzc29yOjpwb3J0SW5DdHJsU2lnbmFscyhUcmFjZVBvaW50ICogcG9ydFRQKQoreworCXJldHVybiggdGhlVHJhY2VGaWx0ZXIucGFzcyhwb3J0VFApICk7Cit9CisKK2Jvb2wgT2ZmbGluZVRlc3RQcm9jZXNzb3I6Omhhc09ic2VydmFibGVTaWduYWwoCisJCWNvbnN0IEJGICYgYW5FbGVtZW50KQoreworCWlmKCBhbkVsZW1lbnQuaW52YWxpZCgpICkKKwl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfTE9HIDw8ICJPZmZsaW5lVGVzdFByb2Nlc3Nvcjo6aGFzT2JzZXJ2YWJsZVNpZ25hbDo+ICIKKwkJCSJJbnZhbGlkIFRyYWNlLCByZXR1cm5pbmcgZmFsc2UgISIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisKKwkJcmV0dXJuIChmYWxzZSk7CisJfQorCWVsc2UgaWYoIGFuRWxlbWVudC5pczwgQXZtQ29kZSA+KCkgKQorCXsKKwkJQXZtQ29kZSAqIHRoZUFDID0gYW5FbGVtZW50LnRvX3B0cjwgQXZtQ29kZSA+KCk7CisKKwkJZm9yKEF2bUNvZGU6Oml0ZXJhdG9yIGl0ID0gdGhlQUMtPmJlZ2luKCkgOyBpdCAhPSB0aGVBQy0+ZW5kKCkgOyArK2l0ICkKKwkJeworCQkJaWYoIGhhc09ic2VydmFibGVTaWduYWwoICgqaXQpKSApCisJCQl7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKworCX0KKwllbHNlIGlmKCBhbkVsZW1lbnQuaXM8IEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24gPigpICkKKwl7CisJCXJldHVybiggaGFzT2JzZXJ2YWJsZVNpZ25hbCgKKwkJCQlhbkVsZW1lbnQudG9fcHRyPCBFeGVjdXRpb25Db25maWd1cmF0aW9uID4oKS0+Z2V0Q29kZSgpLAorCQkJCWFuRWxlbWVudC50b19wdHI8IEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24gPigpKSApOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworYm9vbCBPZmZsaW5lVGVzdFByb2Nlc3Nvcjo6aGFzT2JzZXJ2YWJsZVNpZ25hbCgKKwkJY29uc3QgQkYgJiBhbkVsZW1lbnQsIGNvbnN0IEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24gKiBhbkV4ZXhDb25mKQoreworCWlmKCBhbkVsZW1lbnQuaW52YWxpZCgpICkKKwl7CisJCXJldHVybiAoZmFsc2UpOworCX0KKwllbHNlIGlmKCBhbkVsZW1lbnQuaXM8IEF2bUNvZGUgPigpICkKKwl7CisJCUF2bUNvZGUgKiB0aGVBQyA9IGFuRWxlbWVudC50b19wdHI8IEF2bUNvZGUgPigpOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFBSRV9GSUxURVJJTkcgKQorCUFWTV9PU19MT0cgPDwgIkFuYWx5emluZyBJL08gRWxlbWVudCBUcmFjZSAiCisJCTw8IGFuRWxlbWVudCA8PCAid2l0aCBBdm1PcENvZGUgOiAiCisJCTw8IFRyYWNlUG9pbnQ6OnRvX3N0cmluZyh0aGVBQy0+Z2V0QXZtT3BDb2RlKCkpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgUFJFX0ZJTFRFUklORyApCisKKwkJc3dpdGNoKCB0aGVBQy0+Z2V0QXZtT3BDb2RlKCkgKQorCQl7CisJCQkvL2Nhc2UgQVZNX09QQ09ERV9BU1NJR05fTkVXRlJFU0ggOgorCQkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUOgorCQkJeworCQkJCS8vIGhhcmR3aXJlZCBjb21wYXJpc29uCisJCQkJaWYoIHRoZUFDLT5maXJzdCgpLmlzPCBJbnN0YW5jZU9mUG9ydCA+KCkgKQorCQkJCXsKKwkJCQkJSW5zdGFuY2VPZlBvcnQgKiBpb1BvcnQgPSB0aGVBQy0+Zmlyc3QoKS50b19wdHI8IEluc3RhbmNlT2ZQb3J0ID4oKTsKKwkJCQkJaWYoIGlvUG9ydC0+aGFzQWxpYXNUYXJnZXQoKSApCisJCQkJCXsKKwkJCQkJCWlvUG9ydCA9IGlvUG9ydC0+Z2V0QWxpYXNUYXJnZXQoKS0+YXM8IEluc3RhbmNlT2ZQb3J0ID4oKTsKKwkJCQkJfQorCisJCQkJCWlmKCBwb3J0SW5PYnNTaWduYWxzKAorCQkJCQkJCWFuRXhleENvbmYtPmdldFJ1bnRpbWVJRCgpLAorCQkJCQkJCWlvUG9ydCwgQVZNX09QQ09ERV9JTlBVVCkgKQorCQkJCQl7CisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgQVZNX09QQ09ERV9PVVRQVVQ6CisJCQl7CisJCQkJLy8gaGFyZHdpcmVkIGNvbXBhcmlzb24KKwkJCQlpZiggdGhlQUMtPmZpcnN0KCkuaXM8IEluc3RhbmNlT2ZQb3J0ID4oKSApCisJCQkJeworCQkJCQlJbnN0YW5jZU9mUG9ydCAqIGlvUG9ydCA9IHRoZUFDLT5maXJzdCgpLnRvX3B0cjwgSW5zdGFuY2VPZlBvcnQgPigpOworCQkJCQlpZiggaW9Qb3J0LT5oYXNBbGlhc1RhcmdldCgpICkKKwkJCQkJeworCQkJCQkJaW9Qb3J0ID0gaW9Qb3J0LT5nZXRBbGlhc1RhcmdldCgpLT5hczwgSW5zdGFuY2VPZlBvcnQgPigpOworCQkJCQl9CisKKwkJCQkJaWYoIHBvcnRJbk9ic1NpZ25hbHMoCisJCQkJCQkJYW5FeGV4Q29uZi0+Z2V0UnVudGltZUlEKCksCisJCQkJCQkJaW9Qb3J0LCBBVk1fT1BDT0RFX09VVFBVVCkgKQorCQkJCQl7CisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJQXZtQ29kZTo6aXRlcmF0b3IgaXQgPSB0aGVBQy0+YmVnaW4oKTsKKwkJCQlmb3IoIDsgaXQgIT0gdGhlQUMtPmVuZCgpIDsgKytpdCApCisJCQkJeworCQkJCQlpZiggaGFzT2JzZXJ2YWJsZVNpZ25hbCgoKml0KSwgYW5FeGV4Q29uZikgKQorCQkJCQl7CisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJfQorCQkJCX0KKworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgT2ZmbGluZVRlc3RQcm9jZXNzb3I6OnByZWZpbHRlcihFeGVjdXRpb25Db250ZXh0ICYgYW5FQykKK3sKKwlUcmFjZVNlcXVlbmNlIHRoZUxvY2FsVHJhY2U7CisKKwlPZmZsaW5lVGVzdFByb2Nlc3NvckluZm8gKiBjdXJyZW50T2ZmbGluZVRlc3RJbmZvID0gTlVMTDsKKwlPZmZsaW5lVGVzdFByb2Nlc3NvckluZm8gKiBwcmV2aW91c09mZmxpbmVUZXN0SW5mbyA9IE5VTEw7CisKKwlpZiggYW5FQy5oYXNQcmV2aW91cygpICkKKwl7CisJCS8vIEdldCAidHJhY2UiICh2ZWN0b3Igb2YgcGFpciBvZiB2YXJpYWJsZSB2YWx1ZSksIHdoaWNoIGlzCisJCS8vIHRoZSBvbmUgb2YgaXRzIHBhcmVudCAocHJldmlvdXMpCisJCWlmKCBhbkVDLmdldFByZXZpb3VzKCktPmhhc0luZm9ybWF0aW9uKCkgKQorCQl7CisJCQlwcmV2aW91c09mZmxpbmVUZXN0SW5mbyA9IGFuRUMuZ2V0UHJldmlvdXMoKS0+Z2V0SW5mb3JtYXRpb24oKS0+CisJCQkJCWdldFVuaXFPZmZsaW5lVGVzdFByb2Nlc3NvckluZm8oKTsKKworCQkJdGhlTG9jYWxUcmFjZSA9IHByZXZpb3VzT2ZmbGluZVRlc3RJbmZvLT5nZXRMb2NhbFRyYWNlKCk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUkVfRklMVEVSSU5HICkKKwlBVk1fT1NfTE9HIDw8ICJJdHMgcHJldmlvdXMgRUM6ICIgPDwgYW5FQy5nZXRQcmV2aW91cygpLT5zdHJfbWluKCkgPDwgc3RkOjplbmRsOworCXByaW50VHJhY2UoIHByZXZpb3VzT2ZmbGluZVRlc3RJbmZvLT5nZXRMYXN0T2JzKCkgLCAiVGhlIChMYXN0IE9icykgdHJhY2U6IiwgIlx0IiApOworCUFWTV9PU19MT0cgPDwgIkl0cyBwcmV2aW91cyB0cmFjZSBzaXplIGlzOiAiCisJCQk8PCBwcmV2aW91c09mZmxpbmVUZXN0SW5mby0+Z2V0TG9jYWxUcmFjZSgpLnBvaW50cy5zaXplKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBSRV9GSUxURVJJTkcgKQorCQl9CisJCWVsc2UKKwkJeworCQkJcHJldmlvdXNPZmZsaW5lVGVzdEluZm8gPSBhbkVDLmdldFByZXZpb3VzKCkKKwkJCQkJLT5nZXRVbmlxSW5mb3JtYXRpb24oKS0+Z2V0VW5pcU9mZmxpbmVUZXN0UHJvY2Vzc29ySW5mbygpOworCQl9CisJfQorCWVsc2UKKwl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJFX0ZJTFRFUklORyApCisJQVZNX09TX0xPRyA8PCAiV2FybmluZyBpbiBQUk9DRVNTT1IgUHJlZmlsdGVyOiBub2RlIHdpdGhvdXQgcHJldmlvdXM/ICIKKwkJCSJJcyBpdCB0aGUgUm9vdCA/IiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJFX0ZJTFRFUklORyApCisJfQorCisKKwljdXJyZW50T2ZmbGluZVRlc3RJbmZvID0gYW5FQy5nZXRVbmlxSW5mb3JtYXRpb24oKS0+Z2V0VW5pcU9mZmxpbmVUZXN0UHJvY2Vzc29ySW5mbygpOworCisJaWYoIGFuRUMuZ2V0SGVpZ2h0KCkgPD0gMCApCisJeworCisJCWN1cnJlbnRPZmZsaW5lVGVzdEluZm8tPnNldExvY2FsVHJhY2UodGhlVHJhY2UpOworCQltYWtlTG9jYWxPYnMoY3VycmVudE9mZmxpbmVUZXN0SW5mby0+Z2V0TGFzdE9icygpLCB0aGVUcmFjZSk7CisKKwkJLy8gU2V0dGluZyB0aW1lIHJlZmVyZW5jZSB3aGVuIHN5c3RlbSBpcyB0aW1lZAorCQlpZih0aW1lZEZsYWcpCisJCXsKKwkJCWNvbnN0IEJGICYgcmVmZXJlbmNlVGltZVZhciA9IEVOVi5nZXRSdmFsdWUoYW5FQy5nZXRBUEV4ZWN1dGlvbkRhdGEoKSwKKwkJCQkJYW5FQy5yZWZFeGVjdXRpb25EYXRhKCkuZ2V0U3lzdGVtUklEKCksCisJCQkJCXRpbWVSZWZlcmVuY2VJbnN0YW5jZS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSk7CisKKwkJCWFuRUMuZ2V0VW5pcUluZm9ybWF0aW9uKCktPgorCQkJCQlnZXRVbmlxT2ZmbGluZVRlc3RQcm9jZXNzb3JJbmZvKCktPgorCQkJCQlzZXRUaW1lUmVmZXJlbmNlKHJlZmVyZW5jZVRpbWVWYXIpOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJFX0ZJTFRFUklORyApCisJQVZNX09TX0xPRyA8PCAiMS4gU2V0dGluZyB0aW1lIHJlZmVyZW5jZSB0byAiIDw8IHJlZmVyZW5jZVRpbWVWYXIuc3RyKCkKKwkJPDwgc3RkOjplbmRsCisJCTw8ICJUaGUgVGltZSBSZWZlcmVuY2UgSW5zdGFuY2UgaXM6ICIgPDwgdGltZVJlZmVyZW5jZUluc3RhbmNlLnN0cigpCisJCTw8IHN0ZDo6ZW5kbAorCQk8PCBjdXJyZW50T2ZmbGluZVRlc3RJbmZvLT5nZXRUaW1lUmVmZXJlbmNlKCkuc3RyKCkKKwkJPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBSRV9GSUxURVJJTkcgKQorCQl9CisKKworCQlpZiggYW5FQy5oYXNSdW5uYWJsZUVsZW1lbnRUcmFjZSgpICkKKwkJeworCQkJY3VycmVudE9mZmxpbmVUZXN0SW5mby0+c2V0TGFzdFRyYW5zaXRpb24oCisJCQkJCWFuRUMuZ2V0UnVubmFibGVFbGVtZW50VHJhY2UoKSk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUkVfRklMVEVSSU5HICkKKwlBVk1fT1NfTE9HIDw8ICJSb290IGRvZXMgaGF2ZSBSdW5uYWJsZSBFbGVtZW50IFRyYWNlISAiIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUkVfRklMVEVSSU5HICkKKwkJfQorCQllbHNlCisJCXsKKwkJCWN1cnJlbnRPZmZsaW5lVGVzdEluZm8tPnNldExhc3RUcmFuc2l0aW9uKEJGOjpSRUZfTlVMTCk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUkVfRklMVEVSSU5HICkKKwlBVk1fT1NfTE9HIDw8ICJSb290IGRvZXMgTk9UIGhhdmUgUnVubmFibGUgRWxlbWVudCBUcmFjZSEgIiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJFX0ZJTFRFUklORyApCisJCX0KK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUkVfRklMVEVSSU5HICkKKwlBVk1fT1NfTE9HIDw8ICJSb290LCBhc3NpZ25pbmcgYW5kIHNraXBwaW5nOiAiIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUkVfRklMVEVSSU5HICkKKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKworCWlmKCBwcmV2aW91c09mZmxpbmVUZXN0SW5mby0+Z2V0VGhlQW5hbHl6ZWRNYXJrKCkgPT0gdHJ1ZSApCisJeworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJFX0ZJTFRFUklORyApCisJQVZNX09TX0xPRyA8PCAiVmVyZGljdCBhbHJlYWR5IGNvbXB1dGVkISEhISEhISEhISBmb3IgRUM6ICIKKwkJCTw8IGFuRUMuc3RyX21pbigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUkVfRklMVEVSSU5HICkKKworCQlyZXR1cm4gZmFsc2U7CisKKwl9CisJaWYoIG5vdCBoYXNPYnNlcnZhYmxlU2lnbmFsKGFuRUMuZ2V0SU9FbGVtZW50VHJhY2UoKSkgKQorCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUkVfRklMVEVSSU5HICkKKwlBVk1fT1NfTE9HIDw8ICJqdW1waW5nISEhISEhISEgbm90IGludGVyZXN0aW5nISEhISEhISEgZm9yIEVDOiAiCisJCQk8PCBhbkVDLnN0cl9taW4oKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJFX0ZJTFRFUklORyApCisJfQorCisJaWYodGltZWRGbGFnKQorCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUkVfRklMVEVSSU5HICkKKwlBVk1fT1NfTE9HIDw8ICJzZXR0aW5nIHJlZmVyZW5jZSBvZiBmYXRoZXIgaW4gRUM6ICIKKwkJCTw8IGFuRUMuc3RyX21pbigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUkVfRklMVEVSSU5HICkKKworCQljdXJyZW50T2ZmbGluZVRlc3RJbmZvLT5zZXRUaW1lUmVmZXJlbmNlKAorCQkJCWFuRUMuZ2V0UHJldmlvdXMoKS0+Z2V0VW5pcUluZm9ybWF0aW9uKCktPgorCQkJCWdldFVuaXFPZmZsaW5lVGVzdFByb2Nlc3NvckluZm8oKS0+Z2V0VGltZVJlZmVyZW5jZSgpKTsKKwl9CisKKwlpZiggdGhlVHJhY2UucG9pbnRzLmVtcHR5KCkKKwkJfHwgKG5vdCBoYXNJTyhhbkVDLmdldElPRWxlbWVudFRyYWNlKCkpKQorCQl8fCAocHJldmlvdXNPZmZsaW5lVGVzdEluZm8tPmdldFRoZUFuYWx5emVkTWFyaygpID09IHRydWUpCisJCXx8IChub3QgaGFzT2JzZXJ2YWJsZVNpZ25hbChhbkVDLmdldElPRWxlbWVudFRyYWNlKCkpKSApCisJeworCisJCWN1cnJlbnRPZmZsaW5lVGVzdEluZm8tPnNldExvY2FsVHJhY2UoCisJCQkJcHJldmlvdXNPZmZsaW5lVGVzdEluZm8tPmdldExvY2FsVHJhY2UoKSk7CisKKwkJY3VycmVudE9mZmxpbmVUZXN0SW5mby0+c2V0TGFzdE9icygKKwkJCQlwcmV2aW91c09mZmxpbmVUZXN0SW5mby0+Z2V0TGFzdE9icygpKTsKKworCQljdXJyZW50T2ZmbGluZVRlc3RJbmZvLT5zZXRMYXN0VHJhbnNpdGlvbigKKwkJCQlwcmV2aW91c09mZmxpbmVUZXN0SW5mby0+Z2V0TGFzdFRyYW5zaXRpb24oKSk7CisKKwkJY3VycmVudE9mZmxpbmVUZXN0SW5mby0+c2V0VGhlQW5hbHl6ZWRNYXJrKAorCQkJCXByZXZpb3VzT2ZmbGluZVRlc3RJbmZvLT5nZXRUaGVBbmFseXplZE1hcmsoKSk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUkVfRklMVEVSSU5HICkKKwlBVk1fT1NfTE9HIDw8ICJUcmFjZSBhbHJlYWR5IHJlYWQsIG9yIHRhdSwgb3IgYWxyZWFkeSBmYWlsZWQvaW5jb25jaSwgIgorCQkJIm9yIHByb2plY3RpbmcsXG5hc3NpZ25pbmcgYW5kIHNraXBwaW5nIEVDOiAiIDw8IGFuRUMuc3RyX21pbigpCisJCQk8PCBzdGQ6OmVuZGwKKwkJCTw8ICJMb2NhbCBUcmFjZSBzaXplIDogIgorCQkJPDwgY3VycmVudE9mZmxpbmVUZXN0SW5mby0+Z2V0TG9jYWxUcmFjZSgpLnBvaW50cy5zaXplKCkKKwkJCTw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUkVfRklMVEVSSU5HICkKKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvLyB0aGUgbGFzdCBvYnNlcnZhdGlvbiBpcyBzdG9yZWQgaW4gdGhlIG5vZGUgKHRvIGZpbmQgYSBtYXRjaCBpbiB0aGUgdHJhY2UpCisJVHJhY2VTZXF1ZW5jZSBsYXN0T2JzOworCW1ha2VMb2NhbE9icyhsYXN0T2JzLCB0aGVMb2NhbFRyYWNlKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBSRV9GSUxURVJJTkcgKQorCUFWTV9PU19MT0cgPDwgIlRoZSBsb2NhbCB0cmFjZSBpcyAoYXNzaWduZWQhKTogIiA8PCBzdGQ6OmVuZGw7CisJcHJpbnRUcmFjZSh0aGVMb2NhbFRyYWNlKTsKKwlBVk1fT1NfQ09VVCA8PCAiXG5PZmZsaW5lVGVzdFByb2Nlc3Nvcjo6cHJlZmlsdGVyKC4uLikgRUM6PiAiCisJCQk8PCBhbkVDLnN0cl9taW4oKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJFX0ZJTFRFUklORyApCisKKworCWlmKCBBc3NpZ25WYWx1ZXNJZk9ic2VydmFibGUoYW5FQywgdGhlTG9jYWxUcmFjZSkgKQorCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUkVfRklMVEVSSU5HICkKKwkJQVZNX09TX0xPRyA8PCAiU29tZXRoaW5nIHdhcyByZWFkICIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBSRV9GSUxURVJJTkcgKQorCisJCS8vIGFzc2lnbiBsYXN0IG9icyAoc2luY2Ugc29tZXRoaW5nIHdhcyByZWFkL2xvY2FsT2JzIHdhcyBtb2RpZmllZCkKKwkJY3VycmVudE9mZmxpbmVUZXN0SW5mby0+c2V0TGFzdE9icyhsYXN0T2JzKTsKKwkJY3VycmVudE9mZmxpbmVUZXN0SW5mby0+c2V0TGFzdFRyYW5zaXRpb24oCisJCQkJYW5FQy5nZXRSdW5uYWJsZUVsZW1lbnRUcmFjZSgpKTsKKwkJLy8gZWFjaCBFQyBoYXMgaXRzIG93biBjb3B5IG9mIHRoZSB0cmFjZQorCQljdXJyZW50T2ZmbGluZVRlc3RJbmZvLT5zZXRMb2NhbFRyYWNlKHRoZUxvY2FsVHJhY2UpOworCisJCS8vIGNoZWNraW5nIHRyYWNlIGxlbmd0aAorCQlpZiggY3VycmVudE9mZmxpbmVUZXN0SW5mby0+Z2V0TG9jYWxUcmFjZSgpLnBvaW50cy5lbXB0eSgpICkKKwkJeworCQkJLy8gdGhlIHRyYWNlIGlzIGZpbmlzaGVkIGZvciB0aGlzIHBhdGgsIHNldCB0aGUgZmxhZyB0byB0cnVlIHNvIHdlIGRvbid0CisJCQkvLyBjb250aW51ZSBjYWxjdWxhdGluZworCQkJY3VycmVudE9mZmxpbmVUZXN0SW5mby0+c2V0VGhlQW5hbHl6ZWRNYXJrKHRydWUpOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJFX0ZJTFRFUklORyApCisJQVZNX09TX0xPRyA8PCAiVGhlIGZsYWcgd2FzIHNldCB0byB0cnVlLCB0aGlzIHRyZWUgcGF0aCBzaG91bGQgc3RvcCBhdCBFQzogIgorCQkJPDwgYW5FQy5zdHJfbWluKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBSRV9GSUxURVJJTkcgKQorCQl9CisJfQorCWVsc2UKKwl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJFX0ZJTFRFUklORyApCisJQVZNX09TX0xPRyA8PCAiTm90aGluZyB3YXMgcmVhZCBpbiB0aGlzIEVDOiAiIDw8IGFuRUMuc3RyX21pbigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUkVfRklMVEVSSU5HICkKKworCQkvLyBpdCB3YXMgbmVjZXNzYXJpbHkgYW4gaW5wdXQgb3IgYW4gb3V0cHV0IHRoYXQgd2FzIG5vdCByZWFkLCBzbyB3ZSBtYXJrCisJCS8vIHRoZSBlbnRpcmUgcGF0aCBzbyB3ZSBkb24ndCBhbmFseXplIGl0IGFueW1vcmUgKHRoZSB2ZXJkaWN0IHdpbGwgYmUKKwkJLy8gZW1pdHRlZCBsYXRlcgorCQljdXJyZW50T2ZmbGluZVRlc3RJbmZvLT5zZXRUaGVBbmFseXplZE1hcmsodHJ1ZSk7CisKKwkJLy8gYXNzaWduIGxhc3Qgb2JzIG9mIHBhcmVudCAoc2luY2Ugbm90aGluZyB3YXMgcmVhZCkKKwkJY3VycmVudE9mZmxpbmVUZXN0SW5mby0+c2V0TGFzdE9icygKKwkJCQlwcmV2aW91c09mZmxpbmVUZXN0SW5mby0+Z2V0TGFzdE9icygpKTsKKworCQljdXJyZW50T2ZmbGluZVRlc3RJbmZvLT5zZXRMYXN0VHJhbnNpdGlvbigKKwkJCQlwcmV2aW91c09mZmxpbmVUZXN0SW5mby0+Z2V0TGFzdFRyYW5zaXRpb24oKSk7CisKKwkJLy8gZWFjaCBFQyBoYXMgaXRzIG93biBjb3B5IG9mIHRoZSB0cmFjZQorCQljdXJyZW50T2ZmbGluZVRlc3RJbmZvLT5zZXRMb2NhbFRyYWNlKAorCQkJCXByZXZpb3VzT2ZmbGluZVRlc3RJbmZvLT5nZXRMb2NhbFRyYWNlKCkpOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFBPU1QtRklMVEVSIEFQSQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBPZmZsaW5lVGVzdFByb2Nlc3Nvcjo6cG9zdGZpbHRlcigpCit7CisJZWNRdWV1ZSA9ICYoIGdldEV4ZWN1dGlvblF1ZXVlKCkuZ2V0UmVzdWx0UXVldWUoKSApOworCWVjUXVldWVJdCA9IGVjUXVldWUtPmJlZ2luKCk7CisJZWNRdWV1ZUl0RW5kID0gZWNRdWV1ZS0+ZW5kKCk7CisJZm9yKCA7IGVjUXVldWVJdCAhPSBlY1F1ZXVlSXRFbmQgOyApCisJeworCQlpZiggbm90IHBvc3RmaWx0ZXIoKiAoKmVjUXVldWVJdCkpICkKKwkJeworCQkJQVZNX09TX0xPRyA8PCAiRkFJTCBpbiBwb3N0ZmlsdGVyIG9mZmxpbmUgdGVzdCEiIDw8IHN0ZDo6ZW5kbDsKKworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWVsc2UKKwkJeworCQkJKytlY1F1ZXVlSXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gKGdldEV4ZWN1dGlvblF1ZXVlKCkuaGFzUmVzdWx0KCkpOworfQorCitib29sIE9mZmxpbmVUZXN0UHJvY2Vzc29yOjpwb3N0ZmlsdGVyKEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKQoreworCWlmKCAoYW5FQy5nZXRIZWlnaHQoKSA8PSAwKSB8fCAodGhlVHJhY2UucG9pbnRzLnNpemUoKSA9PSAwKSB8fAorCQkobm90IGhhc0lPKGFuRUMuZ2V0SU9FbGVtZW50VHJhY2UoKSkpIHx8CisJCShub3QgaGFzT2JzZXJ2YWJsZVNpZ25hbChhbkVDLmdldElPRWxlbWVudFRyYWNlKCkpKSApCisJeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlPZmZsaW5lVGVzdFByb2Nlc3NvckluZm8gKiBjdXJyZW50T2ZmbGluZVRlc3RJbmZvID0KKwkJCWFuRUMuZ2V0VW5pcUluZm9ybWF0aW9uKCktPmdldFVuaXFPZmZsaW5lVGVzdFByb2Nlc3NvckluZm8oKTsKKworCisJLy8gc2V0IFRISVMgY3VycmVudCB0aW1lIChzaW5jZSBpdCBpcyBub3QgYSB0YXUsIG5vciBpdCB3YXMgcHJvamVjdGVkKQorCS8vIGluIGNhc2Ugd2hlbiB0aGUgc3lzdGVtIGlzIHRpbWVkCisJaWYodGltZWRGbGFnKQorCXsKKwkJY29uc3QgQkYgJiByZWZlcmVuY2VUaW1lVmFyID0gRU5WLmdldFJ2YWx1ZSgKKwkJCQlhbkVDLmdldEFQRXhlY3V0aW9uRGF0YSgpLAorCQkJCWFuRUMucmVmRXhlY3V0aW9uRGF0YSgpLmdldFN5c3RlbVJJRCgpLAorCQkJCXRpbWVSZWZlcmVuY2VJbnN0YW5jZS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSApOworCisJCWN1cnJlbnRPZmZsaW5lVGVzdEluZm8tPnNldFRpbWVSZWZlcmVuY2UocmVmZXJlbmNlVGltZVZhcik7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCUFWTV9PU19MT0cgPDwgIjIuIFNldHRpbmcgdGltZSByZWZlcmVuY2UgdG8gIgorCQkJPDwgcmVmZXJlbmNlVGltZVZhci5zdHIoKQorCQkJPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisJfQorCisKKy8vQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisvLwlBVk1fT1NfTE9HIDw8ICJUaGUgbGV2ZWwgbm9kZXMgaXMgbm93OiAiIDw8IHN0ZDo6ZW5kbDsKKy8vCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQ6Oml0ZXJhdG9yIGl0bCA9IHRoZUxldmVsTm9kZXMuYmVnaW4oKTsKKy8vCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQ6Oml0ZXJhdG9yIGVuZEl0bCA9IHRoZUxldmVsTm9kZXMuZW5kKCk7CisvLwlmb3IoIDsgaXRsICE9IGVuZEl0bCA7IGl0bCsrKQorLy8JeworLy8JCUFWTV9PU19MT0cgPDwgIkVDOiAiIDw8ICgqaXRsKS0+c3RyX21pbigpIDw8IHN0ZDo6ZW5kbDsKKy8vCX0KKy8vCUFWTV9PU19MT0cgPDwgIkNVcnIgaGVpZ2h0OiAiIDw8IGFuRUMuZ2V0SGVpZ2h0KCkgPDwgc3RkOjplbmRsOworLy8JCQk8PCAid2FpdGluZyB0b3AgRUM6ICIgPDwgZ2V0RXhlY3V0aW9uUXVldWUoKS50b3BXYWl0aW5nKCktPnN0cl9taW4oKQorLy8JCQk8PCBzdGQ6OmVuZGw7CisvL0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCisJLyoKKwkvLyBvbmx5IGlmIHRoZSBuZXh0IGNvbnRleHQgdG8gZXhlY3V0ZSBpcyBpbiBhIG5ldyBsZXZlbCBvZiB0aGUgdHJlZSwgd2UKKwkvLyBleGFtaW5lIHdoYXQgaGFwcGVuZWQgd2l0aCBhbGwgdGhlIG5vZGVzIGluIHRoZSBzYW1lIGxldmVsCisJaWYoIG5vdCBnZXRFeGVjdXRpb25RdWV1ZSgpLmhhc1dhaXRpbmcoKSB8fAorCQlnZXRFeGVjdXRpb25RdWV1ZSgpLnRvcFdhaXRpbmcoKS0+Z2V0SGVpZ2h0KCkgIT0gIGFuRUMuZ2V0SGVpZ2h0KCkgKQorCXsKKy8vd2UgYXJlIGluIGEgbmV3IGxldmVsOgorLy8JMS4gdXBkYXRlIGhlaWdodAorLy8JMi4gcmVtb3ZlIGZpcnN0IG9icyBmcm9tIHRyYWNlLCBrZWVwIGl0IGluIGxhc3RPYnMKKy8vCTMuIGFjY29yZGluZyB0byB0aGUgc2V0IG9mIGxvY2FsT2JzIG9mIGFsbCBleGVjdXRpb24gY29udGV4dHMgb2YgdGhlCisvLwlwcmV2aW91cyBoZWlnaHQsIGdpdmUgdmVyZGljdHM6CisvLwkJMy4xIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBlbXB0eSBvYnMsIGl0IGlzIGJlY2F1c2UgaXQgd2FzCisvLwkJcmVhZC9hY2NlcHRlZCBieSBhIG5vZGUgaW4gdGhlIHRyZWUKKy8vCQkJMy4xLjEgaWYgdGhlIG5vZGUgZm9yIHdoaWNoIHRoZSBvYnMgaXMgZW1wdHkgaXMgaW4gdGhlIHBhdGgsCisvLwkJCQlpZiB0aGUgdHJhY2UgaXMgZW1wdHksIGluY3IgUEFTUworLy8JCQkzLjEuMiBpZiB0aGUgbm9kZSBmb3Igd2hpY2ggdGhlIG9icyBpcyBlbXB0eSBpcyBub3QgaW4gdGhlIHBhdGgsCisvLwkJCQlpZiB0aGUgdHJhY2UgaXMgZW1wdHksIGluY3IgV2Vha1BBU1MKKy8vCQkJMy4yIGlmIHRoZSB0cmFjZSBpcyBlbXB0eToKKy8vCQkJMy4yLjEgaWYgUEFTUyA+IDAgYW5kIFdlYWtQQVNTID4gMCwgZW1pdCBXZWFrUEFTUworLy8JCQkzLjIuMiBpZiBQQVNTID4gMCBhbmQgV2Vha1BBU1MgPT0gMCwgZW1pdCBQQVNTCisvLwkJCTMuMi4zIGlmIFBBU1MgPT0gMCBhbmQgV2Vha1BBU1MgPiAwLCBlbWl0IElOQ09OQ3IKKy8vCQkzLjMgaWYgdGhlcmUgaXMgbm8gZW1wdHkgb2JzLCBpdCBpcyBiZWNhdXNlIG5vIG5vZGUgcmVhZC9hY2NlcHRlZCB0aGUgdHJhY2U6CisvLwkJCTMuMy4xIGlmIGxhc3RPYnMgaXMgYW4gaW5wdXQsIGVtaXQgSU5DT05DPworLy8JCQkzLjMuMiBpZiBsYXN0T2JzIGlzIGFuIG91dHB1dCBvciBhIGRlbGF5LCBlbWl0IEZBSUwKKy8vCQkzLjQgaWYgdGhlcmUgaXMgYW4gb2JzIGFuZCB0aGUgdHJhY2UgaXMgbm90IGVtcHR5LCBjb250aW51ZQorLy8JNC4gY2xlYXIgdGhlIGxldmVsIG5vZGVzCisKKworCQkvLyBzdGVwIDEKKwkJdGhlSGVpZ2h0ID0gYW5FQy5nZXRIZWlnaHQoKTsKKworCQkvLyBzdGVwIDIKKwkJVHJhY2VPZk9icyBsYXN0T2JzOworCQltYWtlTG9jYWxPYnMobGFzdE9icywgdGhlVHJhY2UpOworCQlyZW1vdmVPbmVPYnModGhlVHJhY2UpOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfTE9HIDw8ICJhaG9yYSBlbCBzaXplIGRlIGxhIHRyYWNlIGVzICIgPDwgdGhlVHJhY2Uuc2l6ZSgpIDw8c3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisKKwkJLy8gc3RlcCAzCisJCS8vIHBhcmNvdXIgYWxsIG5vZGVzIGluIHRoZSBsaXN0CisJCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQ6Oml0ZXJhdG9yIGl0bCA9IHRoZUxldmVsTm9kZXMuYmVnaW4oKTsKKwkJTGlzdE9mRXhlY3V0aW9uQ29udGV4dDo6aXRlcmF0b3IgZW5kSXRsID0gdGhlTGV2ZWxOb2Rlcy5lbmQoKTsKKwkJaW50IGVtcHR5T2JzID0gMDsKKwkJaW50IHdlYWtQQVNTID0gMDsKKwkJaW50IFBBU1MgPSAwOworCQlmb3IoIDsgaXRsICE9IGVuZEl0bCA7IGl0bCsrKQorCQl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfTE9HIDw8ICJ2ZXJkaWN0IGFuYWxpemluZyBFQzogIiA8PCAoKml0bCktPnN0cl9taW4oKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKworCQkJYm9vbCBmbGFnID0gZmFsc2U7CisJCQl0cmFuc2l0aW9uSW5UZXN0UHVycG9zZSgKKwkJCQkJKCppdGwpLT5nZXRSdW5uYWJsZUVsZW1lbnRUcmFjZSgpLCB0aGVUZXN0UHVycG9zZSwgZmxhZyk7CisKKwkJCWNvbnN0IFRyYWNlT2ZPYnMgJiBhTG9jYWxPYnMgPSAoKml0bCktPmdldFVuaXFJbmZvcm1hdGlvbigpLT4KKwkJCQkJZ2V0VW5pcU9mZmxpbmVUZXN0UHJvY2Vzc29ySW5mbygpLT5nZXRMb2NhbE9icygpOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfTE9HIDw8ICJzaXplIG9mIGxvY2FsIG9icyBpcyA6ICIgPDwgYUxvY2FsT2JzLnNpemUoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKworCQkJaWYoIGFMb2NhbE9icy5lbXB0eSgpICkKKwkJCXsKKwkJCQkvLyBpdCBtZWFucyB0aGlzIG5vZGUgYWNjZXB0ZWQgdGhlIGhlYWQgb2YgdGhlIHRyYWNlCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfTE9HIDw8ICJTaXplIDAgZm9yIEVDOiAiIDw8ICgqaXRsKS0+c3RyX21pbigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCisJCQkJZW1wdHlPYnMrKzsKKworCQkJCWlmKCB0aGVUcmFjZS5zaXplKCkgPT0gMCApCisJCQkJeworCQkJCQkvLyB3ZWFrUEFTUyBvciBQQVMKKwkJCQkJZmxhZz1mYWxzZTsKKwkJCQkJdHJhbnNpdGlvbkluVGVzdFB1cnBvc2UoCisJCQkJCQkoKml0bCktPmdldFJ1bm5hYmxlRWxlbWVudFRyYWNlKCksIHRoZVRlc3RQdXJwb3NlLCBmbGFnKTsKKwkJCQkJaWYoIGZsYWcgKQorCQkJCQl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfTE9HIDw8ICJGb3VuZCBpbiB0ZXN0IHB1cnBvc2UsIHBhc3MhIiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKworCQkJCQkJUEFTUyArKzsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCUFWTV9PU19MT0cgPDwgIk5vdCBmb3VuZCBpbiB0ZXN0IHBvdXJwb3NlLCB3ZWFrUGFzcyIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisKKwkJCQkJCXdlYWtQQVNTICsrOworCQkJCQl9CisKKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyB3ZSBkZWxldGUgdGhlIGZpcnN0IHRyYW5zaXRpb24gaW4gdGhlIGxpc3QsIHNpbmNlIHdlIGNoYW5nZWQgb2YKKwkJLy8gbGV2ZWwgaW4gdGhlIHRyZWUKKwkJaWYoIG5vdCB0aGVUZXN0UHVycG9zZS5lbXB0eSgpICkKKwkJeworCQkJdGhlVGVzdFB1cnBvc2UuZXJhc2UodGhlVGVzdFB1cnBvc2UuYmVnaW4oKSk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCUFWTV9PU19MT0cgPDwgIk5PVyBUaGUgdGVzdCBwdXJwb3NlIChzZXF1ZW5jZSBvZiB0cmFuc2l0aW9uIG5hbWVzKSBpczogIgorCQkJPDwgc3RkOjplbmRsOworCWZvciggVmVjdG9yT2ZTdHJpbmc6Oml0ZXJhdG9yIGkgPSB0aGVUZXN0UHVycG9zZS5iZWdpbigpIDsKKwkJCWkgIT0gdGhlVGVzdFB1cnBvc2UuZW5kKCkgOyArK2kgKQorCXsKKwkJQVZNX09TX0xPRyA8PCAqaSA8PCBzdGQ6OmVuZGw7CisJfQorQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisJCX0KKwkJZWxzZQorCQl7CisJCQlBVk1fT1NfV0FSTiA8PCAiRXJyb3I6IFRlc3QgcHVycG9zZSBpcyBlbXB0eSBiZWZvcmUgZXhwZWN0ZWQhICIKKwkJCQkJPDwgc3RkOjplbmRsOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJLy8gc3RlcCAzLjIKKwkJaWYoIHRoZVRyYWNlLnNpemUoKSA9PTAgJiYgZW1wdHlPYnMgPiAwICkKKwkJeworCQkJaWYoIHdlYWtQQVNTID4gMCApCisJCQl7CisJCQkJaWYoIFBBU1MgPT0gMCApCisJCQkJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisJQVZNX09TX0xPRyA8PCAiVmVyZGljdCBpcyBJbmNvbmNSISIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisKKwkJCQkJdmVyZGljdEVtaXR0ZWQgPSB0cnVlOworCQkJCQl0aGVWZXJkaWN0ID0gIklOVE9OQ3IiOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisJQVZNX09TX0xPRyA8PCAiVmVyZGljdCBpcyBXZWFrIFBhc3MhIiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKworCQkJCQl2ZXJkaWN0RW1pdHRlZCA9IHRydWU7CisJCQkJCXRoZVZlcmRpY3QgPSAid2Vha1BBU1MiOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYoIFBBU1MgPiAwICkKKwkJCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCUFWTV9PU19MT0cgPDwgIlZlcmRpY3QgaXMgUGFzcyEiIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCisJCQkJdmVyZGljdEVtaXR0ZWQgPSB0cnVlOworCQkJCXRoZVZlcmRpY3QgPSAiUEFTUyI7CisJCQl9CisKKworCQl9CisKKwkJLy8gc3RlcCAzLjMKKwkJLy8gaWYgdGhlcmUgaXMgbm8gZW1wdHkgb2JzLCBpdCBpcyBiZWNhdXNlIG5vIG5vZGUgcmVhZC9hY2NlcHRlZAorCQkvLyB0aGUgdHJhY2U6CisJCS8vIDMuMi4xIGlmIGxhc3RPYnMgaXMgYW4gaW5wdXQsIGVtaXQgSU5DT05DPworCQkvLyAzLjIuMiBpZiBsYXN0T2JzIGlzIGFuIG91dHB1dCBvciBhIGRlbGF5LCBlbWl0IEZBSUwKKwkJaWYoIGVtcHR5T2JzID09IDAgKQorCQl7CisJCQlpZiggbGFzdE9icy5maXJzdCgpLmZpcnN0KCkuaXM8IEluc3RhbmNlT2ZEYXRhID4oKSAmJgorCQkJCSh0aGVUaW1lVmFySW5zdGFuY2UtPmdldE5hbWVJRCgpID09CisJCQkJCWxhc3RPYnMuZmlyc3QoKS5maXJzdCgpLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpLT5nZXROYW1lSUQoKSkgKQorCQkJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisJQVZNX09TX0xPRyA8PCAiU2Vuc2Ugb2Ygb2JzZXJ2YXRpb24gaXM6ICIKKwkJCTw8IGxhc3RPYnMuc2Vjb25kKCkuc2Vjb25kKCkuc3RyKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisKKwkJCQlpZiggbGFzdE9icy5zZWNvbmQoKS5zZWNvbmQoKS5zdHIoKSA9PSAiPyIgKQorCQkJCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCUFWTV9PU19MT0cgPDwgIlZlcmRpY3QgaXMgSW5jb25jPyIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisKKwkJCQkJdmVyZGljdEVtaXR0ZWQgPSB0cnVlOworCQkJCQl0aGVWZXJkaWN0ID0gIklOQ09OQz8iOworCQkJCX0KKwkJCQllbHNlIHsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCUFWTV9PU19MT0cgPDwgIlZlcmRpY3QgaXMgRmFpbCEiIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCisJCQkJCXZlcmRpY3RFbWl0dGVkID0gdHJ1ZTsKKwkJCQkJdGhlVmVyZGljdCA9ICJGQUlMIjsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfTE9HIDw8ICJTZW5zZSBvZiBvYnNlcnZhdGlvbiBpczogIgorCQkJPDwgbGFzdE9icy5maXJzdCgpLnNlY29uZCgpLnN0cigpIDw8c3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisKKwkJCQlpZiggbGFzdE9icy5maXJzdCgpLnNlY29uZCgpLnN0cigpID09ICI/IiApCisJCQkJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisJQVZNX09TX0xPRyA8PCAiVmVyZGljdCBpcyBJbmNvbmM/ICIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisKKwkJCQkJdmVyZGljdEVtaXR0ZWQgPSB0cnVlOworCQkJCQl0aGVWZXJkaWN0ID0gIklOQ09OQz8iOworCQkJCX0KKwkJCQllbHNlIHsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCUFWTV9PU19MT0cgPDwgIlZlcmRpY3QgaXMgRmFpbCEgIiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKworCQkJCQl2ZXJkaWN0RW1pdHRlZCA9IHRydWU7CisJCQkJCXRoZVZlcmRpY3QgPSAiRkFJTCI7CisJCQkJfQorCQkJfQorCisJCX0KKworCQkvLyBzdGVwIDMuNAorCQlpZiggdGhlVHJhY2Uuc2l6ZSgpID4gMCAmJiBlbXB0eU9icyA+IDAgKQorCQl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfTE9HIDw8ICJDb250aW51ZSByZWFkaW5nICIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisJCX0KKworCQlWZWN0b3JPZkV4ZWN1dGlvbkNvbnRleHQ6Oml0ZXJhdG9yIGl0ID0gYW5FQy5iZWdpbigpOworCQlWZWN0b3JPZkV4ZWN1dGlvbkNvbnRleHQ6Oml0ZXJhdG9yIGVuZEl0ID0gYW5FQy5lbmQoKTsKKwkJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJCXsKKwkJCS8vIG5vb3A/PworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisJQVZNX09TX0xPRyA8PCAiTmVzdGVkIG5vb3AgIiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwkJfQorCisJCXRoZUxldmVsTm9kZXMuY2xlYXIoKTsKKwl9CisJZWxzZQorCXt3d3cubnByLm9yZy9ibG9ncy9lZC8yMDE0LzA4LzIyLzM0MTg5ODk3NS9hLXBpY3R1cmUtb2YtbGFuZ3VhZ2UtdGhlLWZhZGluZy1hcnQtb2YtZGlhZ3JhbW1pbmctc2VudGVuY2VzCisJCS8vIHdlIGFyZSBpbiB0aGUgc2FtZSBsZXZlbAorQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisJQVZNX09TX0xPRyA8PCAiTm90IGFuYWx5emluZywgb3V0ICIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisJfQorKi8KK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCUFWTV9PU19MT0cgPDwgIj09PiBSdWxlOiBjb250aW51ZSAiIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBQT1NULVBST0NFU1MgQVBJCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIE9mZmxpbmVUZXN0UHJvY2Vzc29yOjpzZWFyY2hMZWF2ZXMoY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpCit7CisJaWYoIGFuRUMuaXNMZWFmTm9kZSgpICYmIGFuRUMuaXNub3RSb290KCkgKQorCXsKKwkJLy8gaXQgaXMgYSBsZWFmLCB0YWtlIGl0cyBwYXJlbnQKKwkJLy8gKHRoZSBsYXN0IGxlYXZlIGlzIG5vdCBldmFsdWF0ZWQgYnkgdGhlIGZpbHRlcnMpCisJCWlmKCBub3QgdGhlTGVhdmVzRUNWZWN0b3IuY29udGFpbnMoYW5FQy5nZXRQcmV2aW91cygpKSApCisJCXsKKwkJCXRoZUxlYXZlc0VDVmVjdG9yLmFwcGVuZCggYW5FQy5nZXRQcmV2aW91cygpICk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCUFWTV9PU19MT0cgPDwgIkxFQUYhISEgbG9jYWwgVHJhY2Ugc2l6ZSA6ICIKKwkJCTw8IGFuRUMuZ2V0UHJldmlvdXMoKS0+Z2V0VW5pcUluZm9ybWF0aW9uKCktPgorCQkJCWdldFVuaXFPZmZsaW5lVGVzdFByb2Nlc3NvckluZm8oKS0+Z2V0TG9jYWxUcmFjZSgpLnBvaW50cy5zaXplKCkKKwkJCTw8ICIgPT4gdGhlIEVDOiAiIDw8IGFuRUMuZ2V0UHJldmlvdXMoKS0+c3RyX21pbigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCQl9CisJfQorCWVsc2UKKwl7CisJCS8vIHJlY3Vyc2l2ZSBsb29rdXAKKwkJRXhlY3V0aW9uQ29udGV4dDo6Y2hpbGRfaXRlcmF0b3IgaXQgPSBhbkVDLmJlZ2luKCk7CisJCWZvciggOyBpdCAhPSBhbkVDLmVuZCgpIDsgKytpdCApCisJCXsKKwkJCXNlYXJjaExlYXZlcyggKiAoKml0KSApOworCQl9CisJfQorfQorCitib29sIE9mZmxpbmVUZXN0UHJvY2Vzc29yOjpwb3N0cHJvY2VzcygpCit7CisJQVZNX09TX0NPVVQgPDwgIk9mZmxpbmVUZXN0UHJvY2Vzc29yOjpwb3N0cHJvY2VzcygpIiA8PCBzdGQ6OmVuZGw7CisJQVZNX09TX0xPRyA8PCAiT2ZmbGluZVRlc3RQcm9jZXNzb3I6OnBvc3Rwcm9jZXNzKCkiIDw8IHN0ZDo6ZW5kbDsKKworCXRoZUxlYXZlc0VDVmVjdG9yLmNsZWFyKCk7CisJc2VhcmNoTGVhdmVzKCBnZXRDb25maWd1cmF0aW9uKCkucmVmRmlyc3RUcmFjZSgpICk7CisJaWYoIHRoZUxlYXZlc0VDVmVjdG9yLmVtcHR5KCkgKQorCXsKKwkJQVZNX09TX0xPRyA8PCAiWkVSTyBMRUFWRSA6PiBGQUlMRUQgISIgPDwgc3RkOjplbmRsOworCQl0aGVWZXJkaWN0ID0gIkZBSUxFRCI7CisJCXJldHVybiggdHJ1ZSApOworCX0KKworCS8vIGxpc3Qgb2YgZXhlY3V0aW9uIGNvbnRleHRzIHRoYXQgd2lsbCBzdG9yZSB0aGUgb25lcyB3aXRoIHRoZSBzbWFsbGVzdCB0cmFjZXMKKwlMaXN0PCBFeGVjdXRpb25Db250ZXh0ICogPiAgc21hbGxlc3RUcmFjZXM7CisJc21hbGxlc3RUcmFjZXMuYXBwZW5kKHRoZUxlYXZlc0VDVmVjdG9yLmZpcnN0KCkpOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfTE9HIDw8ICIxLiBTbWFsbGVzdCB0cmFjZXMgc2l6ZSA6IiA8PCBzbWFsbGVzdFRyYWNlcy5zaXplKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisJVmVjdG9yT2ZTdHJpbmcgcmVwZWF0ZWRUcmFjZXM7CisKKwlPZmZsaW5lVGVzdFByb2Nlc3NvckluZm8gKiBvZmZsaW5lVGVzdEluZm8gPSBOVUxMOworCisJLy8gYXV4IHZhciB0byBmaW5kIHN0cmluZ3MgaW4gbGlzdHMKKwlib29sIGZsYWcgPSBmYWxzZTsKKworCS8vIGNoZWNrIHRoZSBsb2NhbCB0cmFjZSwgbGFzdCBvYnMgYW5kIGxhc3QgdHJhbnNpdGlvbiBmb3IgZXZlcnkgbGVhZgorCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQ6Oml0ZXJhdG9yIGl0ID0gdGhlTGVhdmVzRUNWZWN0b3IuYmVnaW4oKTsKKwlMaXN0T2ZFeGVjdXRpb25Db250ZXh0OjppdGVyYXRvciBlbmRJdCA9IHRoZUxlYXZlc0VDVmVjdG9yLmVuZCgpOworCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCXsKKwkJb2ZmbGluZVRlc3RJbmZvID0gKCppdCktPmdldEluZm9ybWF0aW9uKCktPmdldFVuaXFPZmZsaW5lVGVzdFByb2Nlc3NvckluZm8oKTsKKworCQkvL3RoZUluZm9ybWF0aW9uVmVjdG9yLmNsZWFyKCk7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfTE9HIDw8ICJGb3IgdGhpcyBsZWF2ZSBFQzogIiA8PCAoKml0KS0+c3RyX21pbigpIDw8IHN0ZDo6ZW5kbAorCQkJPDwgIlx0bGFzdCBvYnM6ICIgPDwgc3RkOjplbmRsOworCS8vcHJpbnRUcmFjZShvZmZsaW5lVGVzdEluZm8tPmdldExhc3RPYnMoKSk7CisJaWYoIG9mZmxpbmVUZXN0SW5mby0+Z2V0TGFzdFRyYW5zaXRpb24oKS52YWxpZCgpICkKKwl7CisJCUFWTV9PU19MT0cgPDwgIkxhc3QgdHJhbnMgOiIgPDwgc3RkOjplbmRsCisJCQkJPDwgb2ZmbGluZVRlc3RJbmZvLT5nZXRMYXN0VHJhbnNpdGlvbigpLnN0cigpCisJCQkJPDwgc3RkOjplbmRsOworCQlBVk1fT1NfTE9HIDw8ICJMb2NhbCB0cmFjZSBzaXplIDoiIDw8IHN0ZDo6ZW5kbAorCQkJCTw8IG9mZmxpbmVUZXN0SW5mby0+Z2V0TG9jYWxUcmFjZSgpLnBvaW50cy5zaXplKCkKKwkJCQk8PCBzdGQ6OmVuZGw7CisJCUFWTV9PU19MT0cgPDwgIkxvY2FsIHRyYWNlIDoiIDw8IHN0ZDo6ZW5kbDsKKwl9CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKworCQlpZiggb2ZmbGluZVRlc3RJbmZvLT5nZXRMYXN0VHJhbnNpdGlvbigpLnZhbGlkKCkgJiYKKwkJCShvZmZsaW5lVGVzdEluZm8tPmdldExvY2FsVHJhY2UoKS5wb2ludHMuc2l6ZSgpIDwKKwkJCQlzbWFsbGVzdFRyYWNlcy5maXJzdCgpLT5nZXRJbmZvcm1hdGlvbigpLT4KKwkJCQlnZXRVbmlxT2ZmbGluZVRlc3RQcm9jZXNzb3JJbmZvKCktPmdldExvY2FsVHJhY2UoKS5wb2ludHMuc2l6ZSgpKSApCisJCXsKKwkJCS8vIHdlIGZvdW5kIGEgc21hbGxlciB0cmFjZTogY2xlYXIgdGhlIGxpc3QgYW5kIGluaXRpYWxpemUgaXQgd2l0aCB0aGlzIEVDCisJCQlzbWFsbGVzdFRyYWNlcy5jbGVhcigpOworCQkJc21hbGxlc3RUcmFjZXMuYXBwZW5kKCgqaXQpKTsKKwkJCXJlcGVhdGVkVHJhY2VzLmNsZWFyKCk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCUFWTV9PU19MT0cgPDwgIklzIHNtYWxsZXN0ISIgPDwgc3RkOjplbmRsOworCUFWTV9PU19MT0cgPDwgb2ZmbGluZVRlc3RJbmZvLT5nZXRUaGVBbmFseXplZE1hcmsoKSA8PCBzdGQ6OmVuZGw7CisJaWYoIG9mZmxpbmVUZXN0SW5mby0+Z2V0VGhlQW5hbHl6ZWRNYXJrKCkgPT0gdHJ1ZSApCisJeworCQlBVk1fT1NfTE9HIDw8ICJJcyBtYXJrZWQhIiA8PCBzdGQ6OmVuZGw7CisJfQorQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisJCX0KKwkJZWxzZSBpZiggKG9mZmxpbmVUZXN0SW5mby0+Z2V0TG9jYWxUcmFjZSgpLnBvaW50cy5zaXplKCkgPT0KKwkJCQkJc21hbGxlc3RUcmFjZXMuZmlyc3QoKS0+Z2V0SW5mb3JtYXRpb24oKS0+CisJCQkJCWdldFVuaXFPZmZsaW5lVGVzdFByb2Nlc3NvckluZm8oKS0+Z2V0TG9jYWxUcmFjZSgpLnBvaW50cy5zaXplKCkpCisJCQkJJiYgb2ZmbGluZVRlc3RJbmZvLT5nZXRMYXN0VHJhbnNpdGlvbigpLnZhbGlkKCkgKQorCQl7CisJCQkvLyB3ZSBmb3VuZCBhbm90aGVyIG5vZGUvcGF0aCBhY2NlcHRpbmcgdGhlIHRyYWNlCisJCQkvLyAgd2UgbmVlZCB0byBjaGVjayBpZiB0aGUgdHJhbnNpdGlvbiBpcyBkaWZmZXJlbnQgdGhhdCBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSBsaXN0Li4uCisJCQlmbGFnID0gZmFsc2U7CisJCQkvLyBUT0RPOiBpbnRlbGxpZ2VudCB3YXkgdG8gY2hlY2sgZm9yIHJlcGVhdGVkIHRyYW5zaXRpb25zPyBpcyB0aGF0IHBvc3NpYmxlPworLy8JCQl0cmFuc2l0aW9uSW5MaXN0KCgqaXQpLT5nZXRJbmZvcm1hdGlvbigpLT4KKy8vCQkJCQlnZXRVbmlxT2ZmbGluZVRlc3RQcm9jZXNzb3JJbmZvKCktPmdldExhc3RUcmFuc2l0aW9uKCksCisvLwkJCQkJcmVwZWF0ZWRUcmFjZXMsIGZsYWcpOworCQkJaWYoIGZsYWcgPT0gZmFsc2UgKQorCQkJeworCQkJCS8vIGRpZmZlcmVudCBwYXRoIGFjY2VwdGluZyB0aGUgc2FtZSB0cmFjZQorCQkJCXNtYWxsZXN0VHJhY2VzLmFwcGVuZCgoKml0KSk7CisJCQkJcmVwZWF0ZWRUcmFjZXMucHVzaF9iYWNrKG9mZmxpbmVUZXN0SW5mby0+Z2V0TGFzdFRyYW5zaXRpb24oKS5zdHIoKSk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCUFWTV9PU19MT0cgPDwgIklzIHJlcGVhdGVkISEhISIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisJCQl9CisJCX0KKwl9CisKKwkvLyBub3csIHNtYWxsZXN0VHJhY2VzIGlzIHRoZSBsaXN0IG9mIHNtYWxsZXN0IHRyYWNlcywgbGV0J3MgZW1pdCBhIHZlcmRpY3QKKworCWludCBQQVNTID0gMCwgd2Vha1BBU1MgPSAwLCBJTkNPTkNpID0gMCwgRkFJTCA9IDA7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCUFWTV9PU19MT0cgPDwgIjIuIFNtYWxsZXN0IHRyYWNlcyBzaXplIDoiIDw8IHNtYWxsZXN0VHJhY2VzLnNpemUoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKworCisJLy8gd2UgZ28gdGhyb3VnaCB0aGUgZW50aXJlIGxpc3QuLi4KKwllbmRJdCA9IHNtYWxsZXN0VHJhY2VzLmVuZCgpOworCWZvciggaXQgPSBzbWFsbGVzdFRyYWNlcy5iZWdpbigpIDsgaXQgIT0gZW5kSXQgOyBpdCsrICkKKwl7CisJCW9mZmxpbmVUZXN0SW5mbyA9ICgqaXQpLT5nZXRJbmZvcm1hdGlvbigpLT5nZXRVbmlxT2ZmbGluZVRlc3RQcm9jZXNzb3JJbmZvKCk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCUFWTV9PU19MT0cgPDwgIlNtYWxsZXN0IHRyYWNlIDoiIDw8IHN0ZDo6ZW5kbDsKKwlwcmludFRyYWNlKG9mZmxpbmVUZXN0SW5mby0+Z2V0TG9jYWxUcmFjZSgpKTsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCisJCWlmKCBvZmZsaW5lVGVzdEluZm8tPmdldExvY2FsVHJhY2UoKS5wb2ludHMuc2l6ZSgpID09IDAgKQorCQl7CisJCQlib29sIGZsYWcgPSBmYWxzZTsKKwkJCS8vIGlmIG5vIHRlc3QgcHVycG9zZSB3YXMgc3BlY2lmaWVkLCB0aGVuIFBBU1MKKwkJCWlmKHRoZVRlc3RQdXJwb3NlLnBvaW50cy5lbXB0eSgpKQorCQkJeworCQkJCUFWTV9PU19MT0cgPDwgIk5COiBUaGUgdmVyZGljdCB3YXMgY29tcHV0ZWQgd2l0aCBubyB0ZXN0IHB1cnBvc2UuICIgPDwgc3RkOjplbmRsOworCQkJCWZsYWcgPSB0cnVlOworCQkJfQorCQkJLy8gZWxzZSwgaXMgdGhlIGxhc3QgdHJhbnNpdGlvbiBwYXJ0IG9mIHRoZSB0ZXN0IHB1cnBvc2UgPworCQkJZWxzZXsKKwkJCXRyYW5zaXRpb25Jbkxpc3QoKCppdCktPmdldEluZm9ybWF0aW9uKCktPgorCQkJCQlnZXRVbmlxT2ZmbGluZVRlc3RQcm9jZXNzb3JJbmZvKCktPmdldExhc3RUcmFuc2l0aW9uKCksCisJCQkJCXRoZVRlc3RQdXJwb3NlLCBmbGFnKTsKKwkJCX0KKwkJCS8vaXMgaXQgYSBQQVNTLCB3ZWFrUEFTUyBvciBhIElOQ09OQ3I/CisJCQlpZiggZmxhZyApCisJCQl7CisJCQkJKCppdCktPmdldHdGbGFncygpLmFkZE9iamVjdGl2ZUFjaGlldmVkVHJhY2UoKTsKKworCQkJCSgqaXQpLT5hZGRJbmZvKCp0aGlzLCBJTkZPX09GRkxJTkVURVNUX0RBVEFfUEFTUyk7CisJCQkJUEFTUysrOworCQkJfQorCQkJZWxzZQorCQkJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisJQVZNX09TX0xPRyA8PCAiU2l6ZSBpcyAwLCBidXQgdHJhbnNpdGlvbiBub3QgaW4gVFAgb2YgdGhlIEVDOiAiCisJCQk8PCAoKml0KS0+c3RyX21pbigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCisJCQkJd2Vha1BBU1MrKzsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIHJldHJpZXZlIHRoZSB0cmFjZVBvaW50IG9mIHRoZSBmaXJzdCBhY3Rpb24gaW4gbG9jYWxUcmFjZQorCQkJLy8gaWYgYVRyYWNlUG9pbnQgaXMgYSBjb250cm9sbGFibGUgaW5wdXQsIGVtaXQgSU5DT05DPworCQkJLy8gaWYgYVRyYWNlUG9pbnQgaXMgYW4gb3V0cHV0IG9yIGFuIHVuY29udHJvbGxhYmxlIGlucHV0LCBlbWl0IEZBSUwKKworCQkJVHJhY2VQb2ludCAqIGFUcmFjZVBvaW50ID0gb2ZmbGluZVRlc3RJbmZvLT4KKwkJCQkJZ2V0TG9jYWxUcmFjZSgpLnBvaW50cy5maXJzdCgpLnRvX3B0cjxUcmFjZVBvaW50PigpOworCisJCQlpZiggYVRyYWNlUG9pbnQtPmlzVGltZSgpCisJCQkJJiYgb2ZmbGluZVRlc3RJbmZvLT5nZXRMb2NhbFRyYWNlKCkucG9pbnRzLnBvcHVsYXRlZCgpCisJCQkJJiYgKCAodGhlVGltZVZhckluc3RhbmNlID09IGFUcmFjZVBvaW50LT5vYmplY3QpCisJCQkJCS8qfHwgKHRoZVRpbWVWYXJJbnN0YW5jZS0+Z2V0TmFtZUlEKCkKKwkJCQkJCQk9PSBhVHJhY2VQb2ludC0+b2JqZWN0LT5nZXROYW1lSUQoKSkqLyApICkKKwkJCXsKKwkJCQlhVHJhY2VQb2ludCA9IG9mZmxpbmVUZXN0SW5mby0+CisJCQkJCQlnZXRMb2NhbFRyYWNlKCkucG9pbnRzLnNlY29uZCgpLnRvX3B0cjxUcmFjZVBvaW50PigpOworCQkJfQorQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisJQVZNX09TX0xPRyA8PCAiKDEpIERpcmVjdGlvbiBvZiBvYnNlcnZhdGlvbiBpczogIgorCQkJPDwgCWFUcmFjZVBvaW50LT50b19zdHJpbmcoYVRyYWNlUG9pbnQtPm9wKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKworCQkJaWYoIChhVHJhY2VQb2ludC0+b3AgPT0gQVZNX09QQ09ERV9JTlBVVF9FTlYpICYmCisJCQkJcG9ydEluQ3RybFNpZ25hbHMoYVRyYWNlUG9pbnQpICkKKwkJCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCUFWTV9PU19MT0cgPDwgIlZlcmRpY3QgaXMgSW5jb25jPyBmb3IgdGhlIEVDOiAiIDw8ICgqaXQpLT5zdHJfbWluKCkKKwkJCTw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCisJCQkJSU5DT05DaSsrOworCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZSBpZiggKGFUcmFjZVBvaW50LT5vcCA9PSBBVk1fT1BDT0RFX0lOUFVUKSAmJgorCQkJCXBvcnRJbkN0cmxTaWduYWxzKGFUcmFjZVBvaW50KSApCisJCQl7CisJCQlBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwkJCUFWTV9PU19MT0cgPDwgIlZlcmRpY3QgaXMgSW5jb25jPyBmb3IgdGhlIEVDOiAiIDw8ICgqaXQpLT5zdHJfbWluKCkKKwkJCTw8IHN0ZDo6ZW5kbDsKKwkJCUFWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCisJCQkJSU5DT05DaSsrOworCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZQorCQkJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisJQVZNX09TX0xPRyA8PCAiVmVyZGljdCBpcyBGYWlsISAob3V0cHV0IG9mIHRoZSBmb3JtIGQuYSIKKwkJCSIgLS13aXRoIGEgb3V0cHV0IG9yIGRlbGF5KSIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisKKwkJCQlGQUlMKys7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJfQorCisJfQorCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfTE9HIDw8ICJDb3VudGVyczogIgorCQkJPDwgIlBBU1M6ICIgPDwgUEFTUyA8PCBzdGQ6OmVuZGwKKwkJCTw8ICJXZWFrUEFTUzogIiA8PCB3ZWFrUEFTUyA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKworCS8vIGxldCdzIGVtaXQgdGhlIHZlcmRpY3QKKwlpZiggUEFTUyA+IDAgJiYgd2Vha1BBU1MgPT0gMCApCisJeworCQl0aGVWZXJkaWN0S2luZCA9IFZFUkRJQ1RfUEFTU19LSU5EOworCisJCXRoZVZlcmRpY3QgPSAiIFRIRSBWRVJESUNUIElTIDogUEFTUyAiOworCQl2ZXJkaWN0RW1pdHRlZCA9IHRydWU7CisJfQorCWVsc2UgaWYoIFBBU1MgPiAwICYmIHdlYWtQQVNTID4gMCApCisJeworCQl0aGVWZXJkaWN0S2luZCA9IFZFUkRJQ1RfV0VBS19QQVNTX0tJTkQ7CisKKwkJdGhlVmVyZGljdCA9ICIgVEhFIFZFUkRJQ1QgSVMgOiB3ZWFrUEFTUyAiOworCQl2ZXJkaWN0RW1pdHRlZCA9IHRydWU7CisJfQorCWVsc2UgaWYoIFBBU1MgPT0gMCAmJiB3ZWFrUEFTUyA+IDAgKQorCXsKKwkJdGhlVmVyZGljdEtpbmQgPSBWRVJESUNUX0lOQ09OQ3JfS0lORDsKKworCQl0aGVWZXJkaWN0ID0gIiBUSEUgVkVSRElDVCBJUyA6IElOQ09OQ3IgIjsKKwkJdmVyZGljdEVtaXR0ZWQgPSB0cnVlOworCX0KKwllbHNlIGlmKCBJTkNPTkNpID4gMCApCisJeworCQl0aGVWZXJkaWN0S2luZCA9IFZFUkRJQ1RfSU5DT05DaV9LSU5EOworCisJCXRoZVZlcmRpY3QgPSAiIFRIRSBWRVJESUNUIElTIDogSU5DT05DaSAiOworCQl2ZXJkaWN0RW1pdHRlZCA9IHRydWU7CisJfQorCWVsc2UgaWYoIEZBSUwgPiAwICkKKwl7CisJCXRoZVZlcmRpY3RLaW5kID0gVkVSRElDVF9GQUlMX0tJTkQ7CisKKwkJdGhlVmVyZGljdCA9ICIgVEhFIFZFUkRJQ1QgSVMgOiBGQUlMICI7CisJCXZlcmRpY3RFbWl0dGVkID0gdHJ1ZTsKKwl9CisKKwllbHNlCisJeworCQl0aGVWZXJkaWN0S2luZCA9IFZFUkRJQ1RfQUJPUlRfS0lORDsKKwl9CisKKwlpZiggdmVyZGljdEVtaXR0ZWQgPT0gdHJ1ZSApCisJeworLy9BVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUFJPQ0VTU09SICkKKy8vCUFWTV9PU19MT0cgPDwgRU1QSEFTSVModGhlVmVyZGljdCwgJz0nLCA4MCk7CisvL0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCX0KKwllbHNlCisJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisJQVZNX09TX1dBUk4gPDwgIkVSUk9SICEgc29tZXRoaW5nIHdlbnQgd3JvbmcsIG5vIHZlcmRpY3QgZW1pdHRlZCEgIgorCQkJCTw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCX0KKworCXJldHVybiB0cnVlOworfQorCisKKy8qKgorICogRVhJVCBBUEkKKyAqLworYm9vbCBPZmZsaW5lVGVzdFByb2Nlc3Nvcjo6ZXhpdEltcGwoKQoreworCS8vIFNFVCBFWElUIENPREUKKwlzd2l0Y2goIHRoZVZlcmRpY3RLaW5kICkKKwl7CisJCWNhc2UgVkVSRElDVF9QQVNTX0tJTkQ6CisJCXsKKwkJCWF2bV9zZXRfZXhpdF9jb2RlKCBBVk1fRVhJVF9WRVJESUNUX1BBU1NfQ09ERSApOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBWRVJESUNUX1dFQUtfUEFTU19LSU5EOgorCQl7CisJCQlhdm1fc2V0X2V4aXRfY29kZSggQVZNX0VYSVRfVkVSRElDVF9XRUFLX1BBU1NfQ09ERSApOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBWRVJESUNUX0lOQ09OQ3JfS0lORDoKKwkJeworCQkJYXZtX3NldF9leGl0X2NvZGUoIEFWTV9FWElUX1ZFUkRJQ1RfSU5DT05DTFVJVkVfUl9DT0RFKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgVkVSRElDVF9JTkNPTkNpX0tJTkQ6CisJCXsKKwkJCWF2bV9zZXRfZXhpdF9jb2RlKCBBVk1fRVhJVF9WRVJESUNUX0lOQ09OQ0xVSVZFX0lOUFVUX0NPREUgKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgVkVSRElDVF9GQUlMX0tJTkQ6CisJCXsKKwkJCWF2bV9zZXRfZXhpdF9jb2RlKCBBVk1fRVhJVF9WRVJESUNUX0ZBSUxfQ09ERSApOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBWRVJESUNUX0FCT1JUX0tJTkQ6CisJCXsKKwkJCWF2bV9zZXRfZXhpdF9jb2RlKCBBVk1fRVhJVF9WRVJESUNUX0FCT1JUX0NPREUgKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgVkVSRElDVF9VTkRFRklORURfS0lORDoKKwkJeworCQkJYXZtX3NldF9leGl0X2NvZGUoIEFWTV9FWElUX1ZFUkRJQ1RfVU5ERUZJTkVEX0NPREUgKTsKKwkJCWJyZWFrOworCQl9CisJCWRlZmF1bHQ6CisJCXsKKwkJCWF2bV9zZXRfZXhpdF9jb2RlKCBBVk1fRVhJVF9WRVJESUNUX0FCT1JUX0NPREUgKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIE5PTi1SRUdSRVNTSU9OIFRFU1QgQVBJCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIE9mZmxpbmVUZXN0UHJvY2Vzc29yOjp0ZGRSZWdyZXNzaW9uUmVwb3J0SW1wbChPdXRTdHJlYW0gJiBvcykKK3sKKwlvcyA8PCBUQUIgPDwgIlRIRSBWRVJESUNUIElTIDogIjsKKworCXN3aXRjaCggdGhlVmVyZGljdEtpbmQgKQorCXsKKwkJY2FzZSBWRVJESUNUX1BBU1NfS0lORDoKKwkJeworCQkJb3MgPDwgIlBBU1MiOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBWRVJESUNUX1dFQUtfUEFTU19LSU5EOgorCQl7CisJCQlvcyA8PCAiV0VBS19QQVNTIjsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgVkVSRElDVF9JTkNPTkNyX0tJTkQ6CisJCXsKKwkJCW9zIDw8ICJJTkNPTkNyIjsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgVkVSRElDVF9JTkNPTkNpX0tJTkQ6CisJCXsKKwkJCW9zIDw8ICJJTkNPTkNpIjsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgVkVSRElDVF9GQUlMX0tJTkQ6CisJCXsKKwkJCW9zIDw8ICJGQUlMIjsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgVkVSRElDVF9BQk9SVF9LSU5EOgorCQl7CisJCQlvcyA8PCAiQUJPUlQiOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBWRVJESUNUX1VOREVGSU5FRF9LSU5EOgorCQl7CisJCQlvcyA8PCAiVU5ERUZJTkVEIjsKKwkJCWJyZWFrOworCQl9CisJCWRlZmF1bHQ6CisJCXsKKwkJCW9zIDw8ICJBQk9SVCI7CisJCQlicmVhazsKKwkJfQorCX0KKworCW9zIDw8IEVPTF9GTFVTSDsKK30KKworLyoqCisgKiBJbmZvIFNlcmlhbGl6YXRpb24KKyAqLwordm9pZCBPZmZsaW5lVGVzdFByb2Nlc3NvckluZm86OnRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSAgY29uc3QKK3sKKwlpZiggdGhlTGFzdE9icy5wb2ludHMubm9uZW1wdHkoKSApCisJeworCQlvcyA8PCBUQUIgPDwgIlRBQkxFeyIgPDwgRU9MOworCisJCW9zIDw8IFRBQiA8PCAifSIgPDwgRU9MX0ZMVVNIOworCX0KK30KKwordm9pZCBPZmZsaW5lVGVzdFByb2Nlc3NvckluZm86OnRvRnNjbihPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlpZiggdGhlTGFzdE9icy5wb2ludHMubm9uZW1wdHkoKSApCisJeworCQlvcyA8PCBUQUIgPDwgIlRBQkxFeyIgPDwgRU9MOworCQlvcyA8PCBUQUIgPDwgIn0iIDw8IEVPTF9GTFVTSDsKKwl9Cit9CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vdGVzdGluZy9PZmZsaW5lVGVzdFByb2Nlc3Nvci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3Rlc3RpbmcvT2ZmbGluZVRlc3RQcm9jZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWYzNjBjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3Rlc3RpbmcvT2ZmbGluZVRlc3RQcm9jZXNzb3IuaApAQCAtMCwwICsxLDU5MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IGZldiAyMDEyCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEpvc2UgRXNjb2JlZG8gICAoQ0VBIExJU1QpIGpvc2UuZXNjb2JlZG9AY2VhLmZyCisgKiAgTWF0aGlsZGUgQXJuYXVkIChDRUEgTElTVCkgbWF0aGlsZGUuYXJuYXVkQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBPRkZMSU5FVEVTVFBST0NFU1NPUl9IXworI2RlZmluZSBPRkZMSU5FVEVTVFBST0NFU1NPUl9IXworCisjaW5jbHVkZSA8ZmFtL2FwaS9BYnN0cmFjdFByb2Nlc3NvclVuaXQuaD4KKworI2luY2x1ZGUgPGNvbW1vbi9CRi5oPgorCisjaW5jbHVkZSA8Y29sbGVjdGlvbi9UeXBlZGVmLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mRGF0YS5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0F2bUNvZGUuaD4KKyNpbmNsdWRlIDxmbWwvYnVpbHRpbi9JZGVudGlmaWVyLmg+CisKKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25EYXRhLmg+CisKKyNpbmNsdWRlIDxmbWwvdHJhY2UvVHJhY2VGaWx0ZXIuaD4KKyNpbmNsdWRlIDxmbWwvdHJhY2UvVHJhY2VQb2ludC5oPgorI2luY2x1ZGUgPGZtbC90cmFjZS9UcmFjZVNlcXVlbmNlLmg+CisKKyNpbmNsdWRlIDxzb2x2ZXIvYXBpL1NvbHZlckRlZi5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvLyBsaXN0IG9mIHBvcnQsIHNlbnMsIHZhbHVlIG9yIHR2YXIsIHZhbHVlCisvLyBSRVNUUklDVElPTjogUE9SVFMgQU5EIFZBUklBQkxFUyBDQU5OT1QgU0hBUkUgVEhFIFNBTUUgTkFNRVNQQUNFISEhCisvLyB0aGlzIGJhc2Ugc3RydWN0dXJlIGlzIHVzZWQgdG8gc3RvcmUgb2JzZXJ2YXRpb25zIG9mIHRoZSBmb3JtCisvLyBDSEFOTkVMIFs/LCAhXSBbVkFMVUUsIFZBUklBQkxFXQorLy90eXBlZGVmIExpc3QgPEJGPiBPbmVPYnM7CisvL3R5cGVkZWYgVHJhY2VQb2ludCBPbmVPYnM7CisvKiogVE9ETyAyMDE0LzAzLzA1CitDcsOpYXRpb24gZCd1bmUgc3RydWN0dXJlIGRlIGRvbm7DqWUgYWQnaG9jIHBvdXIgbGVzIDw8IHBvaW50cyBkJ29ic2VydmF0aW9uID4+CisqLworCisvLyB2ZWN0b3Igb2Ygb2JzCisvLyB0aGlzIHN0cnVjdHVyZSBzdG9yZXMgYSBzZXF1ZW5jZSAodmVjdG9yKSBvZiBvYnNlcnZhdGlvbnMKKy8vIGl0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRyYWNlIG9mIG9ic2VydmF0aW9ucywgYXMgd2VsbAorLy8gYXMgYSBzaW5nbGUgb2JzZXJ2YXRpb24gKHNpbmNlIHdlICJjYW4iIGhhdmUgbXVsdGlwbGUgY29tbXVuaWNhdGlvbiBjaGFubmVscywKKy8vIGEgInNpbmdsZSBvYnNlcnZhdGlvbiIgY2FuIGNvbnNpc3RzIG9mIG11bHRpcGxlIHN0cnVjdHVyZXMgb2YgdHlwZSBPbmVPYnMpCisvL3R5cGVkZWYgVmVjdG9yIDwgT25lT2JzID4gVHJhY2VPZk9iczsKKy8vdHlwZWRlZiBUcmFjZVNlcXVlbmNlIFRyYWNlT2ZPYnM7CisKKworY2xhc3MgUnVudGltZUlEOworY2xhc3MgU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyOworY2xhc3MgVHJhY2VGYWN0b3J5OworCisKK2NsYXNzIE9mZmxpbmVUZXN0UHJvY2Vzc29yICA6CisJCXB1YmxpYyBBdXRvUmVnaXN0ZXJlZFByb2Nlc3NvclVuaXQ8IE9mZmxpbmVUZXN0UHJvY2Vzc29yID4KK3sKKworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBPZmZsaW5lVGVzdFByb2Nlc3NvciApCisKKworCS8qKgorCSAqIFBST0NFU1NPUiBGQUNUT1JZCisJICogZm9yIGF1dG9tYXRpYyByZWdpc3RyYXRpb24gaW4gdGhlIHByb2Nlc3NvciByZXBvc2l0b3J5CisJICogdGhlIFsgWyBGVUxMWSBdIFFVQUxJRklFRCBdIE5BTUUgSUQKKwkgKi8KKwlBVk1fSU5KRUNUX0FVVE9fUkVHSVNURVJfUVVBTElGSUVEX0lEX0tFWV8zKAorCQkJInRlc3Qjb2ZmbGluZSIsCisJCQkiYXZtOjpwcm9jZXNzb3IuT0ZGTElORV9URVNURVIiLAorCQkJImF2bTo6cHJvY2Vzc29yLk9GRkxJTkVURVNUIiApCisJLy8gZW5kIHJlZ2lzdHJhdGlvbgorCisJLyoqCisJICogVFlQRURFRgorCSAqLworCWVudW0gVkVSRElDVF9LSU5ECisJeworCQlWRVJESUNUX1BBU1NfS0lORCwKKworCQlWRVJESUNUX1dFQUtfUEFTU19LSU5ELAorCisJCVZFUkRJQ1RfSU5DT05Dcl9LSU5ELAorCQlWRVJESUNUX0lOQ09OQ2lfS0lORCwKKworCQlWRVJESUNUX0ZBSUxfS0lORCwKKworCQlWRVJESUNUX0FCT1JUX0tJTkQsCisJCVZFUkRJQ1RfVU5ERUZJTkVEX0tJTkQKKwl9OworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBJTkZPIERBVEEKKwkgKi8KKwlCRiBJTkZPX09GRkxJTkVURVNUX0RBVEE7CisJQkYgSU5GT19PRkZMSU5FVEVTVF9EQVRBX1BBU1M7CisJQkYgSU5GT19PRkZMSU5FVEVTVF9EQVRBX0lOQ09OQzsKKwlCRiBJTkZPX09GRkxJTkVURVNUX0RBVEFfRkFJTDsKKwlCRiBJTkZPX09GRkxJTkVURVNUX1RQX1BBVEg7CisJQkYgSU5GT19PRkZMSU5FVEVTVF9UQVJHRVRfU1RBVEU7CisKKwkvKioKKwkgKiBBVFRSSUJVVEUKKwkgKi8KKwlWRVJESUNUX0tJTkQgdGhlVmVyZGljdEtpbmQ7CisKK3Byb3RlY3RlZDoKKwkvLyBUaGUgdXNlciBTT0xWRVIgY2hvaWNlCisJU29sdmVyRGVmOjpTT0xWRVJfS0lORCB0aGVTb2x2ZXJLaW5kOworCisJLy8gdGhlIHRyYWNlIGlzIHJlcHJlc2VudGVkIGFzIGEgdmVjdG9yIG9mIGxpc3RzCisJVHJhY2VTZXF1ZW5jZSB0aGVUcmFjZTsKKwlUcmFjZVNlcXVlbmNlIHRoZU1lcmdlVHJhY2U7CisKKwkvLyBWZWN0b3Igb2YgdGltZWQgdmFycywgc28gd2Uga25vdyB3aGVuIHRoZXJlIGlzIGFuIG9ic2VydmF0aW9uIG9mICJ0aW1lIgorCVZlY3Rvck9mU3RyaW5nIHRoZVRpbWVkVmFyc1ZlY3RvcjsKKworCS8vIGNvdW50ZXIgdGhhdCB3aWxsIHRlbGwgdXMgaG93IG1hbnkgcGF0aHMgaW4gdGhlIHRyZWUgaGF2ZSBhY2NlcHRlZCB0aGUgInRyYWNlIgorCWludCB0cmFjZUluUGF0aDsKKworCS8vIHdlIGtub3cgaWYgd2UgaGF2ZSBlbWl0dGVkIGEgdmVyZGljdCBieSB1c2luZyB0aGlzIGJvb2xlYW4gKGluaXQgdG8gZmFsc2UpCisJYm9vbCB2ZXJkaWN0RW1pdHRlZDsKKwlzdGQ6OnN0cmluZyB0aGVWZXJkaWN0OworCisJLy8gdGVzdCBwdXJwb3NlIGdpdmVuIGFzIGEgc2VxdWVuY2Ugb2YgdHJhbnNpdGlvbiBpZGVudGlmaWVycworCS8vIChhc3NvY2lhdGVkIHdpdGggdGhlIHN5bWJvbGljIGV4ZWN1dGlvbiB0cmVlKQorCVRyYWNlU2VxdWVuY2UgdGhlVGVzdFB1cnBvc2U7CisKKwkvLyB0aW1lZCB2YXIgcGFyYW0KKwlCRiB0aGVUaW1lVmFySW5zdGFuY2U7CisKKwkvLyBwb3N0LXByb2Nlc3MvZW1pc3Npb24gb2YgdmVyZGljdHMKKwkvLyBMaXN0ZSBkZXMgRXhlY3V0aW9uQ29udGV4dCBmZXVpbGxlcworCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQgdGhlTGVhdmVzRUNWZWN0b3I7CisKKwkvLyB0aW1lIG9mIHJlZmVyZW5jZSAodGF1IGFuZCBwcm9qZWN0aW9uKQorCUJGIHRpbWVSZWZlcmVuY2VJbnN0YW5jZTsKKworCS8vIHRoZSBvYnNlcnZhYmxlIHNpZ25hbHMgdG8gZG8gdGhlIHByb2plY3Rpb24gIsOgIGxhIHZvbMOpZSIKKwlUcmFjZVNlcXVlbmNlIHRoZU9ic1NpZ25hbHM7CisKKwkvL3RoZSBjb250cm9sbGFibGUgc2lnbmFscyB0byBjb21wdXRlIGNvcnJlY3RseSB2ZXJkaWN0cyBpbmNvbmMvZmFpbAorCVRyYWNlRmlsdGVyIHRoZVRyYWNlRmlsdGVyOworCisJLy8gZXJhc2VkIG5vZGVzCisJaW50IHRoZUVyYXNlZE5vZGVzOworCisJLy8gZmxhZyBzZXQgdG8gdHJ1ZSBpZiB0aGUgc3lzdGVtIGlzIHRpbWVkCisJYm9vbCB0aW1lZEZsYWc7CisKKwljb25zdCBFeGVjdXRpb25EYXRhICYgdGhlTWFpbkV4ZWN1dGlvbkRhdGE7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCU9mZmxpbmVUZXN0UHJvY2Vzc29yKAorCQkJU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyICYgYUNvbnRyb2xsZXJVbml0TWFuYWdlciwKKwkJCVdPYmplY3QgKiB3ZlBhcmFtZXRlck9iamVjdCk7CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+T2ZmbGluZVRlc3RQcm9jZXNzb3IoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFBMVUdJTiBQUk9DRVNTT1IgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBDT05GSUdVUkUgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCXZpcnR1YWwgYm9vbCBjb25maWd1cmVJbXBsKCk7CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gUkVQT1JUIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCVRPRE86IGZpeCBidWcgdG8gZGVjb21tZW50IHRoaXMKKwl2aXJ0dWFsIHZvaWQgcmVwb3J0RGVmYXVsdChPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBOT04tUkVHUkVTU0lPTiBURVNUIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwl2aXJ0dWFsIHZvaWQgdGRkUmVncmVzc2lvblJlcG9ydEltcGwoT3V0U3RyZWFtICYgb3MpOworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFBST0NFU1MgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCXZpcnR1YWwgYm9vbCBwcmVwcm9jZXNzKCk7CisKKwl2aXJ0dWFsIGJvb2wgcG9zdHByb2Nlc3MoKTsKKworCS8qKgorCSAqIEVYSVQgQVBJCisJICovCisJdmlydHVhbCBib29sIGV4aXRJbXBsKCk7CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gRklMVEVSIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwlib29sIEFzc2lnblZhbHVlc0lmT2JzZXJ2YWJsZSgKKwkJCUV4ZWN1dGlvbkNvbnRleHQgJiBhbkV4ZWN1dGlvbkNvbnRleHQsCisJCQlUcmFjZVNlcXVlbmNlICYgdGhlTG9jYWxUcmFjZSk7CisKKwlib29sIGhhc0lPKGNvbnN0IEJGICYgYW5FbGVtZW50LAorCQkJRXhlY3V0aW9uQ29udGV4dCAmIGFuRXhlY3V0aW9uQ29udGV4dCwKKwkJCVRyYWNlU2VxdWVuY2UgJiB0aGVMb2NhbFRyYWNlKTsKKworCWJvb2wgaGFzSU8oRXhlY3V0aW9uQ29uZmlndXJhdGlvbiAqIGFuRXhlY3V0aW9uQ29uZmlndXJhdGlvbiwKKwkJCUV4ZWN1dGlvbkNvbnRleHQgJiBhbkV4ZWN1dGlvbkNvbnRleHQsCisJCQlUcmFjZVNlcXVlbmNlICYgdGhlTG9jYWxUcmFjZSk7CisKKwlib29sIHVwZGF0ZVRpbWUoVHJhY2VQb2ludCAqIGFUcmFjZVBvaW50LAorCQkJRXhlY3V0aW9uQ29udGV4dCAmIGFuRXhlY3V0aW9uQ29udGV4dCwKKwkJCVRyYWNlU2VxdWVuY2UgKiBsb2NhbFRyYWNlKTsKKworCWJvb2wgbG9va3VwVmFsdWUoQXZtQ29kZSAqIGFuQUMsIEV4ZWN1dGlvbkNvbnRleHQgJiBhbkV4ZWN1dGlvbkNvbnRleHQsCisJCQlFeGVjdXRpb25Db25maWd1cmF0aW9uICogYW5FeGVjdXRpb25Db25maWd1cmF0aW9uLAorCQkJSW5zdGFuY2VPZlBvcnQgKiBhUG9ydCwJQVZNX09QQ09ERSBvcGNvZGUsCisJCQlUcmFjZVNlcXVlbmNlICYgdGhlTG9jYWxUcmFjZSk7CisKKwlib29sIGhhc0lPKGNvbnN0IEJGICYgYW5FbGVtZW50KTsKKworCWJvb2wgaGFzT2JzZXJ2YWJsZVNpZ25hbChjb25zdCBCRiAmIGFuRWxlbWVudCk7CisKKwlib29sIGhhc09ic2VydmFibGVTaWduYWwoY29uc3QgQkYgJiBhbkVsZW1lbnQsCisJCQljb25zdCBFeGVjdXRpb25Db25maWd1cmF0aW9uICogYW5FeGV4Q29uZik7CisKKwlib29sIHBvcnRJbk9ic1NpZ25hbHMoY29uc3QgUnVudGltZUlEICYgcnVudGltZUN0eCwKKwkJCUluc3RhbmNlT2ZQb3J0ICogcG9ydCwgQVZNX09QQ09ERSBpb09wY29kZSk7CisKKwlib29sIHBvcnRJbkN0cmxTaWduYWxzKFRyYWNlUG9pbnQgKiBwb3J0VFApOworCisJdmlydHVhbCBib29sIHByZWZpbHRlcigpOworCXZpcnR1YWwgYm9vbCBwcmVmaWx0ZXIoRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpOworCisJdmlydHVhbCBib29sIHBvc3RmaWx0ZXIoKTsKKwl2aXJ0dWFsIGJvb2wgcG9zdGZpbHRlcihFeGVjdXRpb25Db250ZXh0ICYgYW5FQyk7CisKKwlib29sIGFzc2lnblZhbHVlKEF2bUNvZGUgKiBhbkFDLCBFeGVjdXRpb25Db250ZXh0ICYgYW5FeGVjdXRpb25Db250ZXh0LAorCQkJRXhlY3V0aW9uQ29uZmlndXJhdGlvbiAqIGFuRXhlY3V0aW9uQ29uZmlndXJhdGlvbiwKKwkJCUluc3RhbmNlT2ZQb3J0ICogYVBvcnQsIFRyYWNlU2VxdWVuY2UgJiBsb2NhbFRyYWNlLCBpbnQgb2Zmc2V0ID0gLTEpOworCisJYm9vbCBhc3NpZ25WYWx1ZShBdm1Db2RlICogYW5BQywgRXhlY3V0aW9uQ29udGV4dCAmIGFuRXhlY3V0aW9uQ29udGV4dCwKKwkJCWNvbnN0IEJGICYgdmFyaWFibGVJbnN0YW5jZSwgVHJhY2VQb2ludCAqIGFUcmFjZVBvaW50LCBpbnQgcGFyYW1OYik7CisKKy8vCWJvb2wgYXNzaWduVmFsdWUoQXZtQ29kZSAqIGFuQUMsCisvLwkJCUV4ZWN1dGlvbkNvbnRleHQgJiBhbkV4ZWN1dGlvbkNvbnRleHQsCisvLwkJCUV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24gKiBhbkV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24sCisvLwkJCUJGIGRhdGFWYXIsIEluc3RhbmNlT2ZQb3J0ICogYVBvcnQsCisvLwkJCVRyYWNlU2VxdWVuY2UgJiB0aGVMb2NhbFRyYWNlLCBpbnQgb2Zmc2V0ID0gLTEpOworCisvLwlib29sIHJlQXNzaWduVmFsdWUoQXZtQ29kZSAqIGFuQUMsIEV2YWx1YXRpb25FbnZpcm9ubWVudCB0aGVFbnYsCisvLwkJCUV4ZWN1dGlvbkNvbnRleHQgJiBhbkV4ZWN1dGlvbkNvbnRleHQsIEJGIGFWYWx1ZSwKKy8vCQkJSW5zdGFuY2VPZlBvcnQgKiBhUG9ydCwgVmVjdG9yT2ZQYWlyT2ZWYXJpYWJsZVZhbHVlICogYVRhYmxlLAorLy8JCQlpbnQgb2Zmc2V0ID0gLTEpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gU0VSSUFMSVpBVElPTiBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJdmlydHVhbCB2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJaWYoIG1QYXJhbWV0ZXJXT2JqZWN0ICE9IFdPYmplY3Q6Ol9OVUxMXyAgKQorCQl7CisJCQltUGFyYW1ldGVyV09iamVjdC0+dG9TdHJlYW0ob3MpOworCQl9CisJfQorCisJdm9pZCBwcmludFRyYWNlKGNvbnN0IFRyYWNlU2VxdWVuY2UgJiBhVHJhY2UsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIHRpdGxlID0gIlRoZSAobG9jYWwpIHRyYWNlOiIsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIHRhYiA9ICJcdCIpCisJeworCQlBVk1fT1NfTE9HIDw8IHRhYiA8PCB0aXRsZSA8PCBzdGQ6OmVuZGw7CisJCWFUcmFjZS50b1N0cmVhbSggQVZNX09TX0xPRyA8PCBBVk1fVEFCX0lOREVOVCApOworCQlBVk1fT1NfTE9HIDw8IEVORF9JTkRFTlQgPDwgc3RkOjplbmRsOworLy8JCVRyYWNlU2VxdWVuY2U6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYVRyYWNlLmJlZ2luKCk7CisvLwkJZm9yKCA7IGl0ICE9IGFUcmFjZS5lbmQoKSA7ICsraXQgKQorLy8JCXsKKy8vLy8JCWlmICggKCppdCkuZmlyc3QoKS5pczwgSW5zdGFuY2VPZkRhdGEgPigpCisvLwkJCQkmJiAodGhlVGltZWRWYXJzVmVjdG9yLmdldEFzdE5hbWVJRCgpCisvLwkJCQkJPT0gKCppdCkuZmlyc3QoKS50b19wdHI8CisvLwkJCQkJCQlJbnN0YW5jZU9mRGF0YSA+KCktPmdldEFzdE5hbWVJRCgpKSApCisvLy8vCQl7CisvLy8vCQkJQVZNX09TX0xPRyA8PCBUQUIgPDwgIlhYWFhYWFhYWFhYWFhYdGltZXZhcjogIgorLy8vLwkJCQkJCTw8ICgqaXQpLmZpcnN0KCkuc3RyKCkgPDwgc3RkOjplbmRsOworLy8vLwkJfQorLy8JCQkvL0FWTV9PU19MT0cgPDwgVEFCIDw8ICJYWFhYWFhYWFhYWFhYWDIyMjIyOiAiCisvLwkJCQkJPDwgKCppdCkuZmlyc3QoKS50b19wdHI8CisvLwkJCQkJCQlJbnN0YW5jZU9mRGF0YSA+KCktPmdldEFzdE5hbWVJRCgpCisvLwkJCQkJPDwgc3RkOjplbmRsOworLy8JCQlpZiAoICgqaXQpLmZpcnN0KCkuaXM8IEluc3RhbmNlT2ZEYXRhID4oKQorLy8JCQkJJiYgKHRoZVRpbWVWYXJJbnN0YW5jZS0+Z2V0QXN0TmFtZUlEKCkKKy8vCQkJCQk9PSAoKml0KS5maXJzdCgpLnRvX3B0cjwKKy8vCQkJCQkJCUluc3RhbmNlT2ZEYXRhID4oKS0+Z2V0QXN0TmFtZUlEKCkpICkKKy8vCQkJeworLy8JCQkJLy8gaXQgaXMgYSB0aW1lIHZhciwgcHJpbnQgZmlyc3QgYW5kIHNlY29uZCB2YWx1ZXMKKy8vCQkJCUFWTV9PU19MT0cgPDwgdGFiIDw8ICJ0aW1ldmFyOiAiIDw8ICgqaXQpLmZpcnN0KCkuc3RyKCkgPDwgc3RkOjplbmRsCisvLwkJCQkJCTw8IHRhYiA8PCAidmFsdWU6ICIgPDwgKCppdCkuc2Vjb25kKCkuc3RyKCkgPDwgIHN0ZDo6ZW5kbAorLy8JCQkJCQk8PCB0YWIgPDwgUkVQRUFUKCI9PT09PT09PT09IiwgNSkgPDwgc3RkOjplbmRsOworLy8JCQl9CisvLwkJCWVsc2UKKy8vCQkJeworLy8JCQkJLy8gaXQgaXMgYSBwb3J0LCBzZW5zLCB2YWx1ZSBvYnNlcnZhdGlvbgorLy8JCQlBVk1fT1NfTE9HIDw8IHRhYiA8PCAicG9ydDogIiA8PCAoKml0KS5maXJzdCgpLnN0cigpIDw8IHN0ZDo6ZW5kbAorLy8JCQkJCTw8IHRhYiA8PCAic2VuczogIiA8PCAoKml0KS5zZWNvbmQoKS5zdHIoKSA8PCAgc3RkOjplbmRsCisvLwkJCQkJPDwgdGFiIDw8ICJ2YWx1ZTogIiA8PCAoKml0KS5hdCgzKS5zdHIoKSA8PCBzdGQ6OmVuZGwKKy8vCQkJCQk8PCB0YWIgPDwgUkVQRUFUKCI9PT09PT09PT09IiwgNSkgPDwgc3RkOjplbmRsOworLy8JCQl9CisvLwkJfQorCX0KKworCXZvaWQgbWFrZUxvY2FsT2JzKFRyYWNlU2VxdWVuY2UgJiBhbk9icywgVHJhY2VTZXF1ZW5jZSAmIGFUcmFjZSkKKwl7CisJCS8qCisJCSAqIENyZWF0ZXMgYSBzaW5nbGUgb2JzZXJ2YXRpb24gZnJvbSB0aGUgdHJhY2UgYVRyYWNlLgorCQkgKiBBIHNpbmdsZSBvYnNlcnZhdGlvbiBjYW4gY29uc2lzdCBvZiBtdWx0aXBsZSBzdHJ1Y3R1cmVzIG9mIHR5cGUKKwkJICogT25lT2JzLCBzaW5jZSB3ZSBtYXkgaGF2ZSBtdWx0aXBsZSBjb21tdW5pY2F0aW9uIGNoYW5uZWxzCisJCSAqLworCisvLwkJYW5PYnMuY2xlYXIoKTsKKwkJYW5PYnMucG9pbnRzLmNsZWFyKCk7CisKKwkJLy8gSWYgdGhlIHN5c3RlbSBpcyB0aW1lZCwgYSBzaW5nbGUgb2JzZXJ2YXRpb24gY29uc2lzdHMgb2YKKwkJLy8gdGhlIHRpbWUgZGVsYXkKKwkJLy8gYWxsIGNvbW11bmljYXRpb24gYWN0aW9ucyBvY2N1cnJpbmcgYmVmb3JlIHRoZSBuZXh0IHRpbWUgZGVsYXkKKwkJaWYgKGFUcmFjZS5wb2ludHMubm9uZW1wdHkoKSAmJiB0aW1lZEZsYWcpCisJCXsKKwkJCS8vIHN0YXJ0IHdpdGggdGltZSBvYnMKKwkJCWFuT2JzLnBvaW50cy5hcHBlbmQoIGFUcmFjZS5wb2ludHMuZmlyc3QoKSApOworCisJCQlCRkxpc3Q6OnJhd19pdGVyYXRvcjwgVHJhY2VQb2ludCA+IGl0UG9pbnQgPSBhVHJhY2UucG9pbnRzLmJlZ2luKCk7CisJCQlCRkxpc3Q6OnJhd19pdGVyYXRvcjwgVHJhY2VQb2ludCA+IGVuZFBvaW50ID0gYVRyYWNlLnBvaW50cy5lbmQoKTsKKwkJCWZvciggKytpdFBvaW50IDsgKGl0UG9pbnQgIT0gZW5kUG9pbnQpIDsgKytpdFBvaW50ICkKKwkJCXsKKwkJCQlpZiggaXRQb2ludC0+aXNUaW1lKCkgKQorCQkJCXsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWFuT2JzLnBvaW50cy5hcHBlbmQoKml0UG9pbnQpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWVsc2UgaWYgKGFUcmFjZS5wb2ludHMubm9uZW1wdHkoKSkKKwkJeworCQkJYW5PYnMuY29weVRyYWNlKGFUcmFjZSk7CisJCX0KKworLy8JCWlmIChhVHJhY2UucG9pbnRzLnNpemUoKSA+MCkKKy8vCQl7CisvLworLy8JCX0KKworCX0KKworCXZvaWQgcmVtb3ZlT25lT2JzKFRyYWNlU2VxdWVuY2UgJiBhVHJhY2UpCisJeworCQkvKgorCQkgKiBEZWxldGVzIG9uZSBvYnNlcnZhdGlvbiBmcm9tIHRoZSB0cmFjZS4KKwkJICogV2UgYXNzdW1lIHRoYXQgb25lIG9ic2VydmF0aW9uIGNvbnNpc3RzIG9mIGEgZGVsYXkgYW5kCisJCSAqIG9mIG9uZSBvciBtb3JlIGlucHV0cy9vdXRwdXRzICh1cCB0byB0aGUgbmV4dCBkZWxheSkuCisJCSAqLworCisJCWlmIChhVHJhY2UucG9pbnRzLnNpemUoKSA+MCkKKwkJeworCQkJLy8gc3RhcnQgd2l0aCB0aW1lIG9icworCQkJYVRyYWNlLnBvaW50cy5yZW1vdmVfZmlyc3QoKTsKKworCQkJaWYgKGFUcmFjZS5wb2ludHMuc2l6ZSgpID4wKQorCQkJeworCQkJCUJGTGlzdDo6Y29uc3RfaXRlcmF0b3IgaXRQb2ludCA9IGFUcmFjZS5wb2ludHMuYmVnaW4oKTsKKwkJCQlCRkxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGVuZFBvaW50ID0gYVRyYWNlLnBvaW50cy5lbmQoKTsKKwkJCQlUcmFjZVBvaW50ICogYVRyYWNlUG9pbnQgPSAoKml0UG9pbnQpLnRvX3B0cjwgVHJhY2VQb2ludCA+KCk7CisJCQkJd2hpbGUgKCAoaXRQb2ludCAhPSBlbmRQb2ludCkgJiYgIWFUcmFjZVBvaW50LT5pc1RpbWUoKSkKKwkJCQl7CisJCQkJCWFUcmFjZS5wb2ludHMucmVtb3ZlX2ZpcnN0KCk7CisJCQkJCWFUcmFjZVBvaW50ID0gKCppdFBvaW50KS50b19wdHI8IFRyYWNlUG9pbnQgPigpOworCQkJCX0KKworCQkJfQorCQl9CisJfQorCisKKwlib29sIHBhcnNlTWVyZ2VkVHJhY2UoY29uc3Qgc3RkOjpzdHJpbmcgJiBmaWxlUGF0aCwKKwkJCVRyYWNlU2VxdWVuY2UgJiBhVHJhY2UsIGNvbnN0IEJGICYgdGhlVGltZVZhcik7CisKKwlib29sIHBhcnNlTWVyZ2VkVHJhY2UoCisJCQlUcmFjZUZhY3RvcnkgJiBhVHJhY2VGYWN0b3J5LCBjb25zdCBzdGQ6OnN0cmluZyAmIGZpbGVQYXRoLAorCQkJVHJhY2VTZXF1ZW5jZSAmIGFNZXJnZVRyYWNlLCBjb25zdCBCRiAmIHRoZVRpbWVWYXIpOworCisJYm9vbCBwYXJzZU1lcmdlZFRyYWNlKFRyYWNlRmFjdG9yeSAmIGFUcmFjZUZhY3RvcnksCisJCQljb25zdCBzdGQ6OnN0cmluZyAmZm9ybWF0LCBjb25zdCBzdGQ6OnN0cmluZyAmIGZpbGVQYXRoLAorCQkJVHJhY2VTZXF1ZW5jZSAmIGFNZXJnZVRyYWNlLCBjb25zdCBCRiAmIHRoZVRpbWVWYXIpOworCisJYm9vbCBwYXJzZVRlc3RQdXJwb3NlKAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBmaWxlUGF0aCwgVHJhY2VTZXF1ZW5jZSAmIHRlc3RQdXJwb3NlKTsKKworCXN0YXRpYyB2b2lkIHRyYW5zaXRpb25Jbkxpc3QoCisJCQljb25zdCBCRiAmIGFGRiwgVHJhY2VTZXF1ZW5jZSAmIGFUZXN0UHVycG9zZSwgYm9vbCAmIGZsYWcpOworCisJLy8gcG9zdC1wcm9jZXNzIEFQSQorCisJdm9pZCBzZWFyY2hMZWF2ZXMoY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpOworCit9OworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gT2ZmbGluZVRlc3RQcm9jZXNzb3IgSW5mb3JtYXRpb24KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjbGFzcyBPZmZsaW5lVGVzdFByb2Nlc3NvckluZm8gOgorCQlwdWJsaWMgRWxlbWVudCwKKwkJQVZNX0lOSkVDVF9JTlNUQU5DRV9DT1VOVEVSX0NMQVNTKCBPZmZsaW5lVGVzdFByb2Nlc3NvckluZm8gKQoreworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIE9mZmxpbmVUZXN0UHJvY2Vzc29ySW5mbyApCisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCU9mZmxpbmVUZXN0UHJvY2Vzc29ySW5mbygpCisJOiBFbGVtZW50KCBDTEFTU19LSU5EX1QoIE9mZmxpbmVUZXN0UHJvY2Vzc29ySW5mbyApICksCisJdGhlTG9jYWxUcmFjZSggKSwKKwl0aGVMYXN0T2JzKCApLAorCXRoZUxhc3RUcmFuc2l0aW9uKCApLAorCXRoZUFuYWx5emVkTWFyayggZmFsc2UgKSwKKwl0aGVUaW1lUmVmZXJlbmNlKCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIENvcHkKKwkgKi8KKwlPZmZsaW5lVGVzdFByb2Nlc3NvckluZm8oY29uc3QgT2ZmbGluZVRlc3RQcm9jZXNzb3JJbmZvICYgYW5JbmZvKQorCTogRWxlbWVudCggYW5JbmZvICksCisJdGhlTG9jYWxUcmFjZShhbkluZm8udGhlTG9jYWxUcmFjZSksCisJdGhlTGFzdE9icyhhbkluZm8udGhlTGFzdE9icyksCisJdGhlTGFzdFRyYW5zaXRpb24oYW5JbmZvLnRoZUxhc3RUcmFuc2l0aW9uKSwKKwl0aGVBbmFseXplZE1hcmsoYW5JbmZvLnRoZUFuYWx5emVkTWFyayksCisJdGhlVGltZVJlZmVyZW5jZShhbkluZm8udGhlVGltZVJlZmVyZW5jZSkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfk9mZmxpbmVUZXN0UHJvY2Vzc29ySW5mbygpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKgorCSAqIEdFVFRFUiAtLSBTRVRURVIKKwkgKiB0aGVGb3JtdWxhVGFibGUKKwkgKi8KKwlpbmxpbmUgVHJhY2VTZXF1ZW5jZSAmIGdldExvY2FsVHJhY2UoKQorCXsKKwkJcmV0dXJuICggdGhlTG9jYWxUcmFjZSApOworCX0KKworCWlubGluZSB2b2lkIHNldExvY2FsVHJhY2UoVHJhY2VTZXF1ZW5jZSAmIGFMb2NhbFRyYWNlKQorCXsKKwkJdGhlTG9jYWxUcmFjZSA9IGFMb2NhbFRyYWNlOworCX0KKworCS8vLy8vLy8vLy8vLy8vCisKKwlpbmxpbmUgVHJhY2VTZXF1ZW5jZSAmIGdldExhc3RPYnMoKQorCXsKKwkJcmV0dXJuICggdGhlTGFzdE9icyApOworCX0KKworCWlubGluZSB2b2lkIHNldExhc3RPYnMoVHJhY2VTZXF1ZW5jZSAmIGFuT2JzKQorCXsKKwkJdGhlTGFzdE9icyA9IGFuT2JzOworCX0KKworCS8vLy8vLy8vLy8vLy8vCisKKwlpbmxpbmUgQkYgJiBnZXRMYXN0VHJhbnNpdGlvbigpCisJeworCQlyZXR1cm4gKCB0aGVMYXN0VHJhbnNpdGlvbiApOworCX0KKworCWlubGluZSBjb25zdCBCRiAmIGdldExhc3RUcmFuc2l0aW9uKCkgY29uc3QKKwl7CisJCXJldHVybiAoIHRoZUxhc3RUcmFuc2l0aW9uICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0TGFzdFRyYW5zaXRpb24oY29uc3QgQkYgJiBhVHJhbnMpCisJeworCQl0aGVMYXN0VHJhbnNpdGlvbiA9IGFUcmFuczsKKwl9CisKKwkvLy8vLy8vLy8vLy8vLworCisJaW5saW5lIEJGICYgZ2V0VGltZVJlZmVyZW5jZSgpCisJeworCQlyZXR1cm4gKCB0aGVUaW1lUmVmZXJlbmNlICk7CisJfQorCisJaW5saW5lIGNvbnN0IEJGICYgZ2V0VGltZVJlZmVyZW5jZSgpIGNvbnN0CisJeworCQlyZXR1cm4gKCB0aGVUaW1lUmVmZXJlbmNlICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0VGltZVJlZmVyZW5jZShjb25zdCBCRiAmIGFSZWZlcmVuY2UpCisJeworCQkvL2FSZWZlcmVuY2UubWFrZVdyaXRhYmxlKCk7CisJCXRoZVRpbWVSZWZlcmVuY2UgPSBhUmVmZXJlbmNlOworCX0KKworCS8vLy8vLy8vLy8vLy8vCisKKworCWlubGluZSBib29sIGdldFRoZUFuYWx5emVkTWFyaygpCisJeworCQlyZXR1cm4gKCB0aGVBbmFseXplZE1hcmsgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRUaGVBbmFseXplZE1hcmsoYm9vbCBtYXJrKQorCXsKKwkJdGhlQW5hbHl6ZWRNYXJrID0gbWFyazsKKwl9CisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJKi8KKwl2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworCXZvaWQgdG9Gc2NuKE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworCitwcm90ZWN0ZWQ6CisKKwkvKkFUVFJJQlVURVMqLworCisJLy8gZWFjaCBub2RlIGhhcyBhbiBhc3NvY2lhdGVkIGxvY2FsIGNvcHkgb2YgdGhlIHRyYWNlCisJVHJhY2VTZXF1ZW5jZSB0aGVMb2NhbFRyYWNlOworCS8vIGVhY2ggbm9kZSBoYXMgYXNzb2NpYXRlZCBhIGxhc3Qgb2JzZXJ2YXRpb24sIHVzZWQgbGF0ZXIgdG8gZW1pdCB2ZXJkaWN0cworCVRyYWNlU2VxdWVuY2UgdGhlTGFzdE9iczsKKwkvLyBlYWNoIG5vZGUgaGFzIGFzc29jaWF0ZWQgYSBsYXN0IHRyYW5zaXRpb24gbmFtZSwgdXNlZCBsYXRlciB0byBlbWl0IHZlcmRpY3RzCisJQkYgdGhlTGFzdFRyYW5zaXRpb247CisJLy8gYm9vbGVhbiB0byBpbmRpY2F0ZSB0aGF0IGEgcGF0aCBzaG91bGQgbm90IGJlIGFuYWx5emVkIGFueW1vcmUKKwlib29sIHRoZUFuYWx5emVkTWFyazsKKwkvLyB0aW1lIHJlZmVyZW5jZSB0byBjb21wdXRlIGRlbGF5cworCUJGIHRoZVRpbWVSZWZlcmVuY2U7CisKK307CisKKworCisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisjZW5kaWYgLyogT0ZGTElORVRFU1RQUk9DRVNTT1JfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS90cmFjZS9BYnN0cmFjdFRyYWNlQnVpbGRlci5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vdHJhY2UvQWJzdHJhY3RUcmFjZUJ1aWxkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NGZjMDAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vdHJhY2UvQWJzdHJhY3RUcmFjZUJ1aWxkZXIuY3BwCkBAIC0wLDAgKzEsNTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiA2IGphbnYuIDIwMTQKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkFic3RyYWN0VHJhY2VCdWlsZGVyLmgiCisKKyNpbmNsdWRlIDxmbWwvd29ya2Zsb3cvUXVlcnkuaD4KKyNpbmNsdWRlIDxmbWwvd29ya2Zsb3cvV09iamVjdC5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ09ORklHVVJFIEFQSQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKgorcHJvdG90eXBlIHByb2Nlc3M6OnRyYWNlX2dlbmVyYXRvciBhcyAmYXZtOjpwcm9jZXNzb3IuVFJBQ0VfR0VORVJBVE9SIGlzCisgc2VjdGlvbiBQUk9QRVJUWQorICAuLi4KKyAgQGRhdGEjc2VsZWN0aW9uID0gJ0FMTCc7CS8vIEFMTCB8IE1PRElGSUVECisgIC4uLgorIGVuZHNlY3Rpb24gUFJPUEVSVFkKKworIC4uLgorCitlbmRwcm90b3R5cGUKKyovCisKK2Jvb2wgQWJzdHJhY3RUcmFjZUJ1aWxkZXI6OmNvbmZpZ3VyZShXT2JqZWN0ICogd2ZQYXJhbWV0ZXJPYmplY3QpCit7CisJV09iamVjdCAqIHRoZVBST1BFUlRZID0gUXVlcnk6OmdldFJlZ2V4V1NlcXVlbmNlKAorCQkJd2ZQYXJhbWV0ZXJPYmplY3QsIE9SX1dJRDIoInByb3BlcnR5IiwgIlBST1BFUlRZIikpOworCisJaWYoIHRoZVBST1BFUlRZICE9IFdPYmplY3Q6Ol9OVUxMXyApCisJeworCQltRGF0YVNlbGVjdGlvbk1vZGlmaWVkRmxhZ3MgPSAoUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5U3RyaW5nKAorCQkJdGhlUFJPUEVSVFksIENPTlNfV0lEMigiZGF0YSIsICJzZWxlY3Rpb24iKSwgIiIpID09ICJNT0RJRklFRCIpOworCX0KKworCXJldHVybiggY29uZmlndXJlSW1wbCh3ZlBhcmFtZXRlck9iamVjdCkgKTsKK30KKworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3RyYWNlL0Fic3RyYWN0VHJhY2VCdWlsZGVyLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vdHJhY2UvQWJzdHJhY3RUcmFjZUJ1aWxkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzYzMDEyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3RyYWNlL0Fic3RyYWN0VHJhY2VCdWlsZGVyLmgKQEAgLTAsMCArMSw4MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDYgamFudi4gMjAxNAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEFCU1RSQUNUVFJBQ0VCVUlMREVSX0hfCisjZGVmaW5lIEFCU1RSQUNUVFJBQ0VCVUlMREVSX0hfCisKK25hbWVzcGFjZSBzZXAKK3sKKworY2xhc3MgQXZtVHJhY2VHZW5lcmF0b3I7CisKK2NsYXNzIFdPYmplY3Q7CisKK2NsYXNzIFRyYWNlTWFuYWdlcjsKKworCitjbGFzcyBBYnN0cmFjdFRyYWNlQnVpbGRlcgoreworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQVRUUklCVVRFCisJICovCisJQXZtVHJhY2VHZW5lcmF0b3IgJiBtUHJvY2Vzc29yOworCisJYm9vbCBtRGF0YVNlbGVjdGlvbk1vZGlmaWVkRmxhZ3M7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUFic3RyYWN0VHJhY2VCdWlsZGVyKEF2bVRyYWNlR2VuZXJhdG9yICYgYVByb2Nlc3NvcikKKwk6IG1Qcm9jZXNzb3IoIGFQcm9jZXNzb3IgKSwKKwltRGF0YVNlbGVjdGlvbk1vZGlmaWVkRmxhZ3MoIGZhbHNlICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5BYnN0cmFjdFRyYWNlQnVpbGRlcigpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIENPTkZJR1VSRSBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlib29sIGNvbmZpZ3VyZShXT2JqZWN0ICogd2ZQYXJhbWV0ZXJPYmplY3QpOworCisJdmlydHVhbCBib29sIGNvbmZpZ3VyZUltcGwoV09iamVjdCAqIHdmUGFyYW1ldGVyT2JqZWN0KSA9IDA7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBDT05TVFJVQ1RJT04gQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJdmlydHVhbCB2b2lkIGJ1aWxkKFRyYWNlTWFuYWdlciAmIGFUcmFjZU1hbmFnZXIpID0gMDsKKworfTsKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qIEFCU1RSQUNUVFJBQ0VCVUlMREVSX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vdHJhY2UvQWJzdHJhY3RUcmFjZUZvcm1hdHRlci5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vdHJhY2UvQWJzdHJhY3RUcmFjZUZvcm1hdHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU2MTY5NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS90cmFjZS9BYnN0cmFjdFRyYWNlRm9ybWF0dGVyLmNwcApAQCAtMCwwICsxLDEwNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDYgamFudi4gMjAxNAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQWJzdHJhY3RUcmFjZUZvcm1hdHRlci5oIgorCisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1F1ZXJ5Lmg+CisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1dPYmplY3QuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKy8qCitwcm90b3R5cGUgcHJvY2Vzczo6dHJhY2VfZ2VuZXJhdG9yIGFzICZhdm06OnByb2Nlc3Nvci5UUkFDRV9HRU5FUkFUT1IgaXMKKyAuLi4KKworIHNlY3Rpb24gRk9STUFUCisgIC4uLgorICBAbGluZSN3cmFwI3dpZHRoICAgICA9IDgwOworICBAbGluZSN3cmFwI3NlcGFyYXRvciA9ICJcblx0IjsKKyAgLi4uCisgIEB2YWx1ZSNhcnJheSNiZWdpbiA9ICJbICI7CisgIEB2YWx1ZSNhcnJheSNzZXBhcmF0b3IgPSAiICwgIjsKKyAgQHZhbHVlI2FycmF5I2VuZCA9ICIgXSI7CisKKyAgQHZhbHVlI3N0cnVjdCNiZWdpbiA9ICJ7ICI7CisgIEB2YWx1ZSNzdHJ1Y3Qjc2VwYXJhdG9yID0gIiAsICI7CisgIEB2YWx1ZSNzdHJ1Y3QjZW5kID0gIiB9IjsKKyAgLi4uCisgZW5kc2VjdGlvbiBGT1JNQVQKKworIC4uLgorCitlbmRwcm90b3R5cGUKKyovCisKK2Jvb2wgQWJzdHJhY3RUcmFjZUZvcm1hdHRlcjo6Y29uZmlndXJlKFdPYmplY3QgKiB3ZlBhcmFtZXRlck9iamVjdCkKK3sKKwlXT2JqZWN0ICogdGhlUFJPUEVSVFkgPSBRdWVyeTo6Z2V0UmVnZXhXU2VxdWVuY2UoCisJCQl3ZlBhcmFtZXRlck9iamVjdCwgT1JfV0lEMigicHJvcGVydHkiLCAiUFJPUEVSVFkiKSk7CisKKwlpZiggdGhlUFJPUEVSVFkgIT0gV09iamVjdDo6X05VTExfICkKKwl7CisJCW1QcmludExpZmVsaW5lcyA9IFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eUJvb2xlYW4oCisJCQl0aGVQUk9QRVJUWSwgQ09OU19XSUQyKCJwcmludCIsICJsaWZlbGluZXMiKSwgZmFsc2UpOworCX0KKworCVdPYmplY3QgKiB0aGVGT1JNQVQgPSBRdWVyeTo6Z2V0UmVnZXhXU2VxdWVuY2UoCisJCQl3ZlBhcmFtZXRlck9iamVjdCwgT1JfV0lEMigiZm9ybWF0IiwgIkZPUk1BVCIpKTsKKworCWlmKCB0aGVGT1JNQVQgPT0gV09iamVjdDo6X05VTExfICkgeworCQl0aGVGT1JNQVQgPSBRdWVyeTo6Z2V0UmVnZXhXU2VxdWVuY2Uod2ZQYXJhbWV0ZXJPYmplY3QsCisJCQkJT1JfV0lEMigicHJvcGVydHkiLCAiUFJPUEVSVFkiKSwgd2ZQYXJhbWV0ZXJPYmplY3QpOworCX0KKworCWlmKCB0aGVGT1JNQVQgIT0gV09iamVjdDo6X05VTExfICkKKwl7CisJCW1XcmFwRGF0YS5MSU5FX1dJRFRIID0gUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5UG9zU2l6ZVQoCisJCQkJdGhlRk9STUFULCBDT05TX1dJRDMoImxpbmUiLCAid3JhcCIsICJ3aWR0aCIpLAorCQkJCURFRkFVTFRfV1JBUF9EQVRBLkxJTkVfV0lEVEgpOworCisJCW1XcmFwRGF0YS5TRVBBUkFUT1IgPSBRdWVyeTo6Z2V0UmVnZXhXUHJvcGVydHlTdHJpbmcodGhlRk9STUFULAorCQkJQ09OU19XSUQzKCJsaW5lIiwgIndyYXAiLCAic2VwYXJhdG9yIiksIG1XcmFwRGF0YS5TRVBBUkFUT1IpOworCQlTdHJpbmdUb29sczo6cmVwbGFjZUFsbChtV3JhcERhdGEuU0VQQVJBVE9SLCAiXFx0IiAsICJcdCIpOworCQlTdHJpbmdUb29sczo6cmVwbGFjZUFsbChtV3JhcERhdGEuU0VQQVJBVE9SLCAiXFxuIiAsICJcbiIpOworCisJCW1NdWx0aVZhbHVlQXJyYXlDU1MuQkVHSU4gPSBRdWVyeTo6Z2V0UmVnZXhXUHJvcGVydHlTdHJpbmcoCisJCQkJdGhlRk9STUFULCBDT05TX1dJRDMoInZhbHVlIiwgImFycmF5IiwgImJlZ2luIiksICJbICIpOworCQltTXVsdGlWYWx1ZUFycmF5Q1NTLlNFUEFSQVRPUiA9IFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eVN0cmluZygKKwkJCXRoZUZPUk1BVCwgQ09OU19XSUQzKCJ2YWx1ZSIsICJhcnJheSIsICJzZXBhcmF0b3IiKSwgIiAsICIpOworCQltTXVsdGlWYWx1ZUFycmF5Q1NTLkVORCA9IFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eVN0cmluZygKKwkJCQl0aGVGT1JNQVQsIENPTlNfV0lEMygidmFsdWUiLCAiYXJyYXkiLCAiZW5kIiksICIgXSIpOworCisJCW1NdWx0aVZhbHVlUGFyYW1zQ1NTLkJFR0lOID0gUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5U3RyaW5nKHRoZUZPUk1BVCwKKwkJCQlDT05TX1dJRDMoInZhbHVlIiwgInBhcmFtKGV0ZXIpP3M/IiwgImJlZ2luIiksICIoICIpOworCQltTXVsdGlWYWx1ZVBhcmFtc0NTUy5TRVBBUkFUT1IgPSBRdWVyeTo6Z2V0UmVnZXhXUHJvcGVydHlTdHJpbmcodGhlRk9STUFULAorCQkJCUNPTlNfV0lEMygidmFsdWUiLCAicGFyYW0oZXRlcik/cz8iLCAic2VwYXJhdG9yIiksICIgLCAiKTsKKwkJbU11bHRpVmFsdWVQYXJhbXNDU1MuRU5EID0gUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5U3RyaW5nKHRoZUZPUk1BVCwKKwkJCQlDT05TX1dJRDMoInZhbHVlIiwgInBhcmFtKGV0ZXIpP3M/IiwgImVuZCIpLCAiICkiKTsKKworCQltTXVsdGlWYWx1ZVN0cnVjdENTUy5CRUdJTiA9IFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eVN0cmluZygKKwkJCXRoZUZPUk1BVCwgQ09OU19XSUQzKCJ2YWx1ZSIsICJzdHJ1Y3QiLCAiYmVnaW4iKSwgInsgIik7CisJCW1NdWx0aVZhbHVlU3RydWN0Q1NTLlNFUEFSQVRPUiA9IFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eVN0cmluZygKKwkJCXRoZUZPUk1BVCwgQ09OU19XSUQzKCJ2YWx1ZSIsICJzdHJ1Y3QiLCAic2VwYXJhdG9yIiksICIgLCAiKTsKKwkJbU11bHRpVmFsdWVTdHJ1Y3RDU1MuRU5EID0gUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5U3RyaW5nKAorCQkJCXRoZUZPUk1BVCwgQ09OU19XSUQzKCJ2YWx1ZSIsICJzdHJ1Y3QiLCAiZW5kIiksICIgfSIpOworCX0KKworCXJldHVybiggY29uZmlndXJlSW1wbCh3ZlBhcmFtZXRlck9iamVjdCkgKTsKK30KKworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3RyYWNlL0Fic3RyYWN0VHJhY2VGb3JtYXR0ZXIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS90cmFjZS9BYnN0cmFjdFRyYWNlRm9ybWF0dGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NhNDA1ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS90cmFjZS9BYnN0cmFjdFRyYWNlRm9ybWF0dGVyLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiA2IGphbnYuIDIwMTQKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBBQlNUUkFDVFRSQUNFRk9STUFUVEVSX0hfCisjZGVmaW5lIEFCU1RSQUNUVFJBQ0VGT1JNQVRURVJfSF8KKworI2luY2x1ZGUgPHByaW50ZXIvT3V0U3RyZWFtLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBBdm1UcmFjZUdlbmVyYXRvcjsKKworY2xhc3MgVHJhY2VNYW5hZ2VyOworCitjbGFzcyBXT2JqZWN0OworCisKK2NsYXNzIEFic3RyYWN0VHJhY2VGb3JtYXR0ZXIKK3sKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlBdm1UcmFjZUdlbmVyYXRvciAmIG1UcmFjZUdlbmVyYXRvcjsKKworCVdyYXBEYXRhIG1XcmFwRGF0YTsKKworCVN5bWJleFZhbHVlQ1NTIG1NdWx0aVZhbHVlQXJyYXlDU1M7CisJU3ltYmV4VmFsdWVDU1MgbU11bHRpVmFsdWVQYXJhbXNDU1M7CisJU3ltYmV4VmFsdWVDU1MgbU11bHRpVmFsdWVTdHJ1Y3RDU1M7CisKKwkvLyBMaWZlbGluZXMKKwlib29sIG1QcmludExpZmVsaW5lczsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQWJzdHJhY3RUcmFjZUZvcm1hdHRlcihBdm1UcmFjZUdlbmVyYXRvciAmIGFUcmFjZUdlbmVyYXRvcikKKwk6IG1UcmFjZUdlbmVyYXRvciggYVRyYWNlR2VuZXJhdG9yICksCisJbVdyYXBEYXRhKCBERUZBVUxUX1dSQVBfREFUQS5MSU5FX1dJRFRILCAwLAorCQkJREVGQVVMVF9XUkFQX0RBVEEuVEFCX1dJRFRILCAiXG4iICksCisKKwltTXVsdGlWYWx1ZUFycmF5Q1NTICggREVGQVVMVF9TWU1CRVhfVkFMVUVfQVJSQVlfQ1NTICApLAorCW1NdWx0aVZhbHVlUGFyYW1zQ1NTKCBERUZBVUxUX1NZTUJFWF9WQUxVRV9QQVJBTVNfQ1NTICksCisJbU11bHRpVmFsdWVTdHJ1Y3RDU1MoIERFRkFVTFRfU1lNQkVYX1ZBTFVFX1NUUlVDVF9DU1MgKSwKKworCS8vIExpZmVsaW5lcworCW1QcmludExpZmVsaW5lcyggdHJ1ZSApCisKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5BYnN0cmFjdFRyYWNlRm9ybWF0dGVyKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIENPTkZJR1VSRSBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwl2aXJ0dWFsIGJvb2wgY29uZmlndXJlKFdPYmplY3QgKiB3ZlBhcmFtZXRlck9iamVjdCk7CisKKwl2aXJ0dWFsIGJvb2wgY29uZmlndXJlSW1wbChXT2JqZWN0ICogd2ZQYXJhbWV0ZXJPYmplY3QpID0gMDsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIE5VTUVSSVpFIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXZpcnR1YWwgdm9pZCBmb3JtYXQoVHJhY2VNYW5hZ2VyICYgYVRyYWNlTWFuYWdlcikgPSAwOworCit9OworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworCisjZW5kaWYgLyogQUJTVFJBQ1RUUkFDRUZPUk1BVFRFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3RyYWNlL0F2bVRyYWNlR2VuZXJhdG9yLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS90cmFjZS9Bdm1UcmFjZUdlbmVyYXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU4ZjU5MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS90cmFjZS9Bdm1UcmFjZUdlbmVyYXRvci5jcHAKQEAgLTAsMCArMSwzMTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxMSBkw6ljLiAyMDEzCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJBdm1UcmFjZUdlbmVyYXRvci5oIgorCisjaW5jbHVkZSAiQmFzaWNUcmFjZUJ1aWxkZXIuaCIKKyNpbmNsdWRlICJCYXNpY1RyYWNlRm9ybWF0dGVyLmgiCisjaW5jbHVkZSAiVFRDTlRyYWNlRm9ybWF0dGVyLmgiCisjaW5jbHVkZSAiVFRDTlRpdGFuVHJhY2VGb3JtYXR0ZXIuaCIKKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vVHlwZWRlZi5oPgorCisjaW5jbHVkZSA8Zm1sL3RlbXBsYXRlL1RpbWVkTWFjaGluZS5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZVN5c3RlbS5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uQ29udGV4dC5oPgorCisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1F1ZXJ5Lmg+CisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1dPYmplY3QuaD4KKworI2luY2x1ZGUgPHNldy9Db25maWd1cmF0aW9uLmg+CisKKyNpbmNsdWRlIDxmYW0vcXVldWUvRXhlY3V0aW9uUXVldWUuaD4KKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qCitwcm90b3R5cGUgcHJvY2Vzczo6dHJhY2VfZ2VuZXJhdG9yIGFzICZhdm06OnByb2Nlc3Nvci5UUkFDRV9HRU5FUkFUT1IgaXMKKyBzZWN0aW9uIFJFUE9SVAorICBAdXJpID0gc3RkICAgICAgIjoiICggImNvdXQiIHwgImNlcnIiICApCisgICAgICAgfCBhdm0gICAgICAiOiIgKCAibG9nIiAgfCAidHJhY2UiICkKKyAgICAgICB8IGZvbGRlciAgICI6IiBwYXRoCisgICAgICAgfCBmaWxlICAgICAiOiIgcGF0aAorICAgICAgIHwgZmlsZW5hbWUgIjoiIHBhdGgKKyAgICAgICB8IHNvY2tldCAgICI6IiBob3N0ICI6IiBwb3J0CisgICAgICAgOworICBAdXJpID0gLi4uOworCisgIEB3aGVuID0gWyBpbml0IF1bOl1bIG90ZiB8IChldmVyeSB8IGFmdGVyIHwgYmVmb3JlKT92YWx1ZSN1bml0XVs6XVsgZXhpdCBdIDsKKworZW5kc2VjdGlvbiBSRVBPUlQKKworIHNlY3Rpb24gUFJPUEVSVFkKKyAgLy8gJ09NRUdBJyB8ICdDVkM0JyB8ICdaMycgfCAnWUlDRVMnCisgIEBzb2x2ZXIgPSAnQ1ZDNCc7CisKKyAgLy8gJ0JBU0lDJyB8ICdCQVNJQyNYTElBJyB8ICdCQVNJQyNTREwnCisgIC8vICdUVENOJyAgfCAnVFRDTiNYTElBJyAgfCAnVFRDTiNTREwnCisgIEBmb3JtYXQgPSAnQkFTSUMnOworCisgIC8vIFJlbW92ZSByZWR1bmRhbnQgPDxudW1lcmljPj4gVHJhY2UgIQorICAvLyB0cnVlIHwgZmFsc2UKKyAgQG5vcm1hbGl6ZSA9IHRydWU7CisKKyAgQG51bWVyaXplciA9ICdTT0xWRVInOyAgLy8gU09MVkVSIHwgTk9ORSB8IE5FV0ZSRVNICisKKyAgLy8gdHJ1ZSB8IGZhbHNlCisgIEBwcmludF9pbml0aWFsaXphdGlvbl92YWx1ZXMgPSBmYWxzZTsKKworICBAZGF0YSNzZWxlY3Rpb24gPSAnQUxMJzsJLy8gQUxMIHwgTU9ESUZJRUQKKyBlbmRzZWN0aW9uIFBST1BFUlRZCisKKyBzZWN0aW9uIFRSQUNFCisgIC8vIEFORCAtLT4gY29uanVuY3RpdmUKKyAgLy8gT1IgIC0tPiBkaXNqdW5jdGl2ZQorICAvLyBYT1IgLS0+IGV4Y2x1c2l2ZQorICAvLyBOT1QgLS0+IG5lZ2F0aXZlCisgIEBjb21iaW5hdG9yID0gJ09SJzsKKworICBAcGF0aCNjb25kaXRpb24gPSAiWypdIjsKKyAgQHBhdGgjdGltZWQjY29uZGl0aW9uID0gIlsqXSI7CisKKyAgQHRpbWUgPSAiJGRlbHRhIjsKKyAgQHRpbWUgPSAiJHRpbWUiOworCisgIEBhc3NpZ24gPSAic2VucyI7CisKKyAgQG5ld2ZyZXNoID0gInNlbnMiOworCisgIEBjb20gICAgPSAiZW52IjsKKworICBAc2lnbmFsID0gInNlbnMiOworICBAcG9ydCAgID0gImVudiI7CisKKyAgQGlucHV0ICA9ICJlbnYiOworICBAb3V0cHV0ID0gImVudiI7CisKKyAgQG91dHB1dCA9ICJUaGVybW9zdGF0LT5kdCI7CisgIEBpbnB1dCAgPSAiVGhlcm1vc3RhdC0+ZXF1aXAiOworICBAb3V0cHV0ID0gIkVxdWlwbWVudC0+ZXJyb3IiOworCisgIEB0cmFuc2l0aW9uID0gInQ4IjsKKyAgQG1hY2hpbmUgPSAibTEiOworICBAcHJvY2VkdXJlID0gIlsqXSI7CisgZW5kc2VjdGlvbiBUUkFDRQorCisgc2VjdGlvbiBGT1JNQVQKKyAgQGxpbmUjd3JhcCN3aWR0aCA9IDgwOworICBAbGluZSN3cmFwI3NlcGFyYXRvciA9ICJcblx0IjsKKworICBAdmFsdWUjc3RydWN0I2JlZ2luID0gInsgIjsKKyAgQHZhbHVlI3N0cnVjdCNzZXBhcmF0b3IgPSAiICwgIjsKKyAgQHZhbHVlI3N0cnVjdCNlbmQgPSAiIH0iOworCisgIEB2YWx1ZSNhcnJheSNiZWdpbiA9ICJbICI7CisgIEB2YWx1ZSNhcnJheSNzZXBhcmF0b3IgPSAiICwgIjsKKyAgQHZhbHVlI2FycmF5I2VuZCA9ICIgXSI7CisKKyAgLy8gJTElIC0tPiB0cmFjZSBudW1iZXIKKyAgLy8gJTIlIC0tPiBleGVjdXRpb24gY29udGV4dCBsZWFmIGlkZW50aWZpZXIKKyAgQGhlYWRlciA9ICJUUkFDRSBOVU1CRVIgJTElXG4iOworICBAZW5kICAgID0gIlxuIjsKKworICAvLyAlMSUgLS0+IHN0cmluZyBtZXNzYWdlCisgIC8vICUyJSAtLT4gZXhlY3V0aW9uIGNvbnRleHQgaWRlbnRpZmllcgorICBAY29tbWVudCAgID0gIi8vJTElIjsKKyAgQHNlcGFyYXRvciA9ICIlMSUiICA7CisgIEBuZXdsaW5lICAgPSAiXG4lMSUiOworCisgIC8vICUxJSAtLT4gc3RlcCBpZGVudGlmaWVyCisgIC8vICUyJSAtLT4gZXhlY3V0aW9uIGNvbnRleHQgaWRlbnRpZmllcgorICBAc3RlcCNiZWdpbiA9ICIjc3RlcCNiZWdpbiAlMSVcbiI7CisgIEBzdGVwI2VuZCAgID0gIiNzdGVwI2VuZCAlMSVcbiI7CisKKyAgLy8gJTElIC0tPiBjb25kaXRpb24KKyAgLy8gJTIlIC0tPiBleGVjdXRpb24gY29udGV4dCBpZGVudGlmaWVyCisgIEBwYXRoI2NvbmRpdGlvbiA9ICJQQzogJTElIjsKKyAgQHBhdGgjdGltZWQjY29uZGl0aW9uID0gIlB0QzogJTElIjsKKyAgQG5vZGUjY29uZGl0aW9uID0gIk5DOiAlMSUiOworICBAbm9kZSN0aW1lZCNjb25kaXRpb24gPSAiTnRDOiAlMSUiOworCisgIC8vICUxJSAtLT4gbWFjaGluZSBydW50aW1lIHBpZAorICAvLyAlMiUgLS0+IG1hY2hpbmUgY29udGFpbmVyIGlkZW50aWZpZXIKKyAgLy8gJTMlIC0tPiBwb3J0IHwgc2lnbmFsIHwgdmFyaWFibGUgfCBtYWNoaW5lIHwgdHJhbnNpdGlvbiB8IHJvdXRpbmUKKyAgLy8gJTQlIC0tPiB2YWx1ZQorCisgIEB0aW1lICAgPSAiXHQlNCVcbiI7CisKKyAgQGFzc2lnbiA9ICJcdCUyJTolMyUgPSAlNCVcbiI7CisKKyAgQG5ld2ZyZXNoID0gIlx0bmV3ZnJlc2ggJTIlLT4lMyUoICU0JSApXG4iOworCisgIEB0cmFuc2l0aW9uID0gIlxuZmlyZWQgICUzJS0+JTMlIjsKKworICBAbWFjaGluZSAgICA9ICJcbnJ1biAgJTMlIjsKKworICBAcHJvY2VkdXJlICA9ICJcbmNhbGwgICUzJSI7CisKKyAgQGlucHV0ICA9ICJcdGlucHV0ICAlMiUtPiUzJSU0JVxuIjsKKyAgQG91dHB1dCA9ICJcdG91dHB1dCAlMiUtPiUzJSU0JVxuIjsKKyBlbmRzZWN0aW9uIEZPUk1BVAorZW5kcHJvdG90eXBlCisqLworCisKKy8qKgorICogREVTVFJVQ1RPUgorICovCitBdm1UcmFjZUdlbmVyYXRvcjo6fkF2bVRyYWNlR2VuZXJhdG9yKCkKK3sKKwlkZWxldGUoIG1UcmFjZUJ1aWxkZXIgKTsKKworCWRlbGV0ZSggbVRyYWNlRm9ybWF0dGVyICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENPTkZJR1VSRSBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgQXZtVHJhY2VHZW5lcmF0b3I6OmNvbmZpZ3VyZUltcGwoKQoreworCVdPYmplY3QgKiB0aGVQUk9QRVJUWSA9IFF1ZXJ5OjpnZXRSZWdleFdTZXF1ZW5jZSgKKwkJCWdldFBhcmFtZXRlcldPYmplY3QoKSwgT1JfV0lEMigicHJvcGVydHkiLCAiUFJPUEVSVFkiKSk7CisKKwlpZiggdGhlUFJPUEVSVFkgPT0gV09iamVjdDo6X05VTExfICkKKwl7CisJCW1Db25maWdGbGFnID0gZmFsc2U7CisJfQorCisJc3RkOjpzdHJpbmcgc29sdmVyID0gUXVlcnk6OmdldFdQcm9wZXJ0eVN0cmluZyh0aGVQUk9QRVJUWSwgInNvbHZlciIsICIiKTsKKworCW1Tb2x2ZXJLaW5kID0gU29sdmVyRGVmOjp0b1NvbHZlcihzb2x2ZXIsIFNvbHZlckRlZjo6REVGQVVMVF9TT0xWRVJfS0lORCk7CisKKwltTm9ybWFsaXplZEZsYWcgPSBRdWVyeTo6Z2V0V1Byb3BlcnR5Qm9vbGVhbih0aGVQUk9QRVJUWSwgIm5vcm1hbGl6ZSIsIGZhbHNlKTsKKworCisJLy8gdGhlIFRyYWNlIFBvaW50IE51bWVyaXplciBjb25maWd1cmF0aW9uCisJbUNvbmZpZ0ZsYWcgPSBtVHJhY2VOdW1lcml6ZXIuY29uZmlndXJlKGdldFBhcmFtZXRlcldPYmplY3QoKSkKKwkJCSYmIG1Db25maWdGbGFnOworCisJLy8gdGhlIFRyYWNlIFBvaW50IEZpbHRlciBjb25maWd1cmF0aW9uCisJbUNvbmZpZ0ZsYWcgPSBtVHJhY2VQb2ludEZpbHRlci5jb25maWd1cmUoRU5WLCBnZXRQYXJhbWV0ZXJXT2JqZWN0KCkpCisJCQkmJiBtQ29uZmlnRmxhZzsKKworCS8vIHRoZSBUcmFjZSBCdWlsZGVyIGNvbmZpZ3VyYXRpb24KKwltVHJhY2VCdWlsZGVyID0gbmV3IEJhc2ljVHJhY2VCdWlsZGVyKCp0aGlzLCBtU29sdmVyS2luZCwgbVRyYWNlUG9pbnRGaWx0ZXIpOworCisJbUNvbmZpZ0ZsYWcgPSAobVRyYWNlQnVpbGRlciAhPSBOVUxMKSAmJgorCQkJCW1UcmFjZUJ1aWxkZXItPmNvbmZpZ3VyZShnZXRQYXJhbWV0ZXJXT2JqZWN0KCkpCisJCQkmJiBtQ29uZmlnRmxhZzsKKworCisJLy8gdGhlIFRyYWNlIEZvcm1hdHRlciBjb25maWd1cmF0aW9uCisJbVRyYWNlVHlwZUlEID0gUXVlcnk6OmdldFdQcm9wZXJ0eVN0cmluZygKKwkJCXRoZVBST1BFUlRZLCAiZm9ybWF0IiwgIkJBU0lDI1hMSUEiKTsKKwlpZiggU3RyaW5nVG9vbHM6OnN0YXJ0c1dpdGgobVRyYWNlVHlwZUlELCAiVFRDTiIpICkKKwl7CisvLwkJaWYoIFN0cmluZ1Rvb2xzOjpzdGFydHNXaXRoKG1UcmFjZVR5cGVJRCwgIlRUQ04jVElUQU4iKSApCisJCWlmKCBtVHJhY2VUeXBlSUQuZmluZCgiVElUQU4iKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisJCXsKKwkJCW1UcmFjZUZvcm1hdHRlciA9IG5ldyBUVENOVGl0YW5UcmFjZUZvcm1hdHRlciggKnRoaXMgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW1UcmFjZUZvcm1hdHRlciA9IG5ldyBUVENOVHJhY2VGb3JtYXR0ZXIoICp0aGlzICk7CisJCX0KKwl9CisJZWxzZSAvL2lmKCBTdHJpbmdUb29sczo6c3RhcnRzV2l0aChmb3JtYXQsIkJBU0lDIikgKQorCXsKKwkJbVRyYWNlRm9ybWF0dGVyID0gbmV3IEJhc2ljVHJhY2VGb3JtYXR0ZXIoICp0aGlzICk7CisJfQorCisJbUNvbmZpZ0ZsYWcgPSAobVRyYWNlRm9ybWF0dGVyICE9IE5VTEwpCisJCQkmJiBtVHJhY2VGb3JtYXR0ZXItPmNvbmZpZ3VyZShnZXRQYXJhbWV0ZXJXT2JqZWN0KCkpCisJCQkmJiBtQ29uZmlnRmxhZzsKKworCXJldHVybiBtQ29uZmlnRmxhZzsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUkVQT1JUIEFQSQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBBdm1UcmFjZUdlbmVyYXRvcjo6cmVwb3J0RGVmYXVsdChPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlvcyA8PCBUQUIgPDwgbVRyYWNlVHlwZUlEIDw8ICIgVFJBQ0UgR0VORVJBVE9SIiA8PCBFT0w7CisKKwlpZiggbVRyYWNlTWFuYWdlci5ub25lbXB0eSgpICkKKwl7CisJCW9zIDw8IFRBQjIgPDwgIlRoZSBUUkFDRSBjb3VudCA6ICIgPDwgbVRyYWNlTWFuYWdlci5zaXplKCkgPDwgRU9MOworCQlvcyA8PCBUQUIyIDw8ICJET05FICEiIDw8IEVPTF9GTFVTSDsKKwl9CisJZWxzZQorCXsKKwkJb3MgPDwgVEFCMiA8PCAiTk8gVFJBQ0UhIiA8PCBFT0xfRkxVU0g7CisJfQorfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBOT04tUkVHUkVTU0lPTiBURVNUIEFQSQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBBdm1UcmFjZUdlbmVyYXRvcjo6dGRkUmVncmVzc2lvblJlcG9ydEltcGwoT3V0U3RyZWFtICYgb3MpCit7CisJb3MgPDwgVEFCIDw8ICJOQiBUUkFDRVMgOiAiIDw8IG1UcmFjZU1hbmFnZXIuc2l6ZSgpIDw8IHN0ZDo6ZW5kbDsKKworCW9zIDw8IHN0ZDo6Zmx1c2g7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFBST0NFU1MgQVBJCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIEF2bVRyYWNlR2VuZXJhdG9yOjpwb3N0cHJvY2VzcygpCit7CisJRXhlY3V0aW9uQ29udGV4dCAqIHJvb3RFQyA9IGdldENvbmZpZ3VyYXRpb24oKS5nZXRGaXJzdFRyYWNlKCk7CisJaWYoIHJvb3RFQy0+aXNSb290KCkgJiYgcm9vdEVDLT5pc0xlYWZOb2RlKCkgKQorCXsKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisJLy8gQnVpbGQgVHJhY2UKKwltVHJhY2VCdWlsZGVyLT5idWlsZCggbVRyYWNlTWFuYWdlciApOworCisJLy8gTnVtZXJpemUgYWxsIFRyYWNlU2VxdWVuY2UKKwltVHJhY2VOdW1lcml6ZXIubnVtZXJpemUoIG1UcmFjZU1hbmFnZXIgKTsKKworCS8vIE5vcm1hbGl6ZSBhIFRyYWNlCisJaWYoIG1Ob3JtYWxpemVkRmxhZyApCisJeworCQltVHJhY2VNYW5hZ2VyLm5vcm1hbGl6ZSgpOworCisJCW1UcmFjZU1hbmFnZXIucmVzZXRUcmFjZUlEKCk7CisJfQorCisJLy8gRm9ybWF0IGFsbCBUcmFjZVNlcXVlbmNlCisJbVRyYWNlRm9ybWF0dGVyLT5mb3JtYXQobVRyYWNlTWFuYWdlcik7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS90cmFjZS9Bdm1UcmFjZUdlbmVyYXRvci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3RyYWNlL0F2bVRyYWNlR2VuZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBjMjkyMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS90cmFjZS9Bdm1UcmFjZUdlbmVyYXRvci5oCkBAIC0wLDAgKzEsMTY2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTEgZMOpYy4gMjAxMworICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEFWTVRSQUNFR0VORVJBVE9SX0hfCisjZGVmaW5lIEFWTVRSQUNFR0VORVJBVE9SX0hfCisKKyNpbmNsdWRlIDxmYW0vYXBpL0Fic3RyYWN0UHJvY2Vzc29yVW5pdC5oPgorCisjaW5jbHVkZSAiVHJhY2VNYW5hZ2VyLmgiCisjaW5jbHVkZSAiVHJhY2VOdW1lcml6ZXIuaCIKKworI2luY2x1ZGUgPGZtbC90cmFjZS9UcmFjZUZpbHRlci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjbGFzcyBBYnN0cmFjdFRyYWNlQnVpbGRlcjsKK2NsYXNzIEFic3RyYWN0VHJhY2VGb3JtYXR0ZXI7CisKK2NsYXNzIEV4ZWN1dGFibGVTeXN0ZW07CisKK2NsYXNzIFN5bWJleENvbnRyb2xsZXJVbml0TWFuYWdlcjsKKworCitjbGFzcyBBdm1UcmFjZUdlbmVyYXRvciAgOgorCQlwdWJsaWMgQXV0b1JlZ2lzdGVyZWRQcm9jZXNzb3JVbml0PCBBdm1UcmFjZUdlbmVyYXRvciA+Cit7CisKKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggQXZtVHJhY2VHZW5lcmF0b3IgKQorCisKKwkvKioKKwkgKiBQUk9DRVNTT1IgRkFDVE9SWQorCSAqIGZvciBhdXRvbWF0aWMgcmVnaXN0cmF0aW9uIGluIHRoZSBwcm9jZXNzb3IgcmVwb3NpdG9yeQorCSAqIHRoZSBbIFsgRlVMTFkgXSBRVUFMSUZJRUQgXSBOQU1FIElECisJICovCisJQVZNX0lOSkVDVF9BVVRPX1JFR0lTVEVSX1FVQUxJRklFRF9JRF9LRVlfMygKKwkJCSJzZXJpYWxpemVyI3N5bWJleCN0cmFjZSNiYXNpYyIsCisJCQkic2VyaWFsaXplciNzeW1iZXgjdHJhY2UjdHRjbiIsCisJCQkiYXZtOjpwcm9jZXNzb3IuVFJBQ0VfR0VORVJBVE9SIiApCisJLy8gZW5kIHJlZ2lzdHJhdGlvbgorCisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBBVFRSSUJVVEUKKwkgKi8KKwlUcmFjZU1hbmFnZXIgbVRyYWNlTWFuYWdlcjsKKworCVNvbHZlckRlZjo6U09MVkVSX0tJTkQgbVNvbHZlcktpbmQ7CisKKwlib29sIG1Ob3JtYWxpemVkRmxhZzsKKworCXN0ZDo6c3RyaW5nIG1UcmFjZVR5cGVJRDsKKworCVRyYWNlRmlsdGVyIG1UcmFjZVBvaW50RmlsdGVyOworCisJQWJzdHJhY3RUcmFjZUJ1aWxkZXIgKiBtVHJhY2VCdWlsZGVyOworCisJVHJhY2VOdW1lcml6ZXIgbVRyYWNlTnVtZXJpemVyOworCisJQWJzdHJhY3RUcmFjZUZvcm1hdHRlciAqIG1UcmFjZUZvcm1hdHRlcjsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQXZtVHJhY2VHZW5lcmF0b3IoU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyICYgYUNvbnRyb2xsZXJVbml0TWFuYWdlciwKKwkJCVdPYmplY3QgKiB3ZlBhcmFtZXRlck9iamVjdCkKKwk6IFJlZ2lzdGVyZWRQcm9jZXNzb3JVbml0KCBhQ29udHJvbGxlclVuaXRNYW5hZ2VyICwKKwkJCXdmUGFyYW1ldGVyT2JqZWN0ICwgQVZNX1BPU1RfUFJPQ0VTU0lOR19TVEFHRSAsCisJCQlERUZBVUxUX1BSRUNFREVOQ0VfT0ZfU0VSSUFMSVpFUl9QUk9DRVNTT1IgKSwKKwltVHJhY2VNYW5hZ2VyKCApLAorCisJbVNvbHZlcktpbmQoIFNvbHZlckRlZjo6U09MVkVSX1VOREVGSU5FRF9LSU5EICksCisJbU5vcm1hbGl6ZWRGbGFnKCBmYWxzZSApLAorCW1UcmFjZVR5cGVJRCggIiIgKSwKKworCW1UcmFjZVBvaW50RmlsdGVyKCApLAorCW1UcmFjZUJ1aWxkZXIoIE5VTEwgKSwKKwltVHJhY2VOdW1lcml6ZXIoIEVOViApLAorCW1UcmFjZUZvcm1hdHRlciggTlVMTCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+QXZtVHJhY2VHZW5lcmF0b3IoKTsKKworCisJLyoqCisJICogbVRyYWNlUG9pbnRGaWx0ZXIKKwkgKi8KKwlUcmFjZUZpbHRlciAmIGdldFRyYWNlRmlsdGVyKCkKKwl7CisJCXJldHVybiggbVRyYWNlUG9pbnRGaWx0ZXIgKTsKKwl9CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQ09ORklHVVJFIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXZpcnR1YWwgYm9vbCBjb25maWd1cmVJbXBsKCk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBSRVBPUlQgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJaW5saW5lIHZpcnR1YWwgdm9pZCByZXBvcnRTaWxlbnQoT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQkvLyBTSUxFTlQgPT4gTk9USElORworCX0KKworCXZpcnR1YWwgdm9pZCByZXBvcnREZWZhdWx0KE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIE5PTi1SRUdSRVNTSU9OIFRFU1QgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJdmlydHVhbCB2b2lkIHRkZFJlZ3Jlc3Npb25SZXBvcnRJbXBsKE91dFN0cmVhbSAmIG9zKTsKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBQUk9DRVNTIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXZpcnR1YWwgYm9vbCBwb3N0cHJvY2VzcygpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gU0VSSUFMSVpBVElPTiBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwl2aXJ0dWFsIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQlpZiggbVBhcmFtZXRlcldPYmplY3QgIT0gTlVMTCApCisJCXsKKwkJCW1QYXJhbWV0ZXJXT2JqZWN0LT50b1N0cmVhbShvcyk7CisJCX0KKwl9CisKK307CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKiBBVk1UUkFDRUdFTkVSQVRPUl9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3RyYWNlL0Jhc2ljVHJhY2VCdWlsZGVyLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS90cmFjZS9CYXNpY1RyYWNlQnVpbGRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk5NDIyZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS90cmFjZS9CYXNpY1RyYWNlQnVpbGRlci5jcHAKQEAgLTAsMCArMSw3NjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiA2IGphbnYuIDIwMTQKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkJhc2ljVHJhY2VCdWlsZGVyLmgiCisKKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vVHlwZWRlZi5oPgorCisjaW5jbHVkZSA8Y29tcHV0ZXIvRXZhbHVhdGlvbkVudmlyb25tZW50Lmg+CisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlU3lzdGVtLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uRmFjdG9yeS5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uQ29uZmlndXJhdGlvbi5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkNvbnRleHQuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lRm9ybS5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL1RhYmxlT2ZEYXRhLmg+CisKKyNpbmNsdWRlIDxmbWwvdGVtcGxhdGUvVGltZWRNYWNoaW5lLmg+CisKKyNpbmNsdWRlIDxmbWwvdHJhY2UvVHJhY2VGaWx0ZXIuaD4KKyNpbmNsdWRlIDxmbWwvdHJhY2UvVHJhY2VQb2ludC5oPgorI2luY2x1ZGUgPGZtbC90cmFjZS9UcmFjZVNlcXVlbmNlLmg+CisKKyNpbmNsdWRlIDxmbWwvdHlwZS9UeXBlTWFuYWdlci5oPgorCisjaW5jbHVkZSA8ZmFtL3RyYWNlL0F2bVRyYWNlR2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8ZmFtL3RyYWNlL1RyYWNlTWFuYWdlci5oPgorCisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1F1ZXJ5Lmg+CisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1dPYmplY3QuaD4KKworI2luY2x1ZGUgPHNldy9Db25maWd1cmF0aW9uLmg+CisKKyNpbmNsdWRlIDxzb2x2ZXIvYXBpL1NvbHZlckZhY3RvcnkuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoqCisgKiBDT05TVFJVQ1RPUgorICogRGVmYXVsdAorICovCitCYXNpY1RyYWNlQnVpbGRlcjo6QmFzaWNUcmFjZUJ1aWxkZXIoQXZtVHJhY2VHZW5lcmF0b3IgJiBhUHJvY2Vzc29yLAorCQlTb2x2ZXJEZWY6OlNPTFZFUl9LSU5EIGFTb2x2ZXJLaW5kLCBUcmFjZUZpbHRlciAmIGFUcmFjZVBvaW50RmlsdGVyKQorOiBBYnN0cmFjdFRyYWNlQnVpbGRlciggYVByb2Nlc3NvciApLAorRU5WKCBhUHJvY2Vzc29yLmdldEVOVigpICksCisKK2lzU0RMRmxhZyggZmFsc2UgKSwKK3ByaW50SW5pdFZhbHVlc0ZsYWcoIGZhbHNlICksCisKK21UcmFjZU1hbmFnZXIoIE5VTEwgKSwKK21Tb2x2ZXJLaW5kKCBhU29sdmVyS2luZCApLAorbVRyYWNlUG9pbnRGaWx0ZXIoICBhVHJhY2VQb2ludEZpbHRlciApLAorCittU3RlcEJlZ2luU2VwYXJhdG9yRmxhZyggZmFsc2UgKSwKK21TdGVwRW5kU2VwYXJhdG9yRmxhZyggZmFsc2UgKSwKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29tcHV0aW5nIFZhcmlhYmxlcworYVRyYWNlRWxlbWVudCggTlVMTCApLAorYVRyYWNlUG9pbnQoIE5VTEwgKSwKK2JmVFAoICksCitUUF9JRCggMCApLAorCittVHJhY2VDYWNoZSggKSwKK2FSb290RUMoIE5VTEwgKSwKK2FUcmFjZUVDKCBOVUxMICksCitpdEVDKCApLAorZW5kRUMoICksCisKK2NvZGUoICksCitvYmplY3QoIE5VTEwgKSwKK3ZhbHVlKCApCit7CisJLy8hISBOT1RISU5HCit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ09ORklHVVJFIEFQSQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8qCitwcm90b3R5cGUgcHJvY2Vzczo6dHJhY2VfZ2VuZXJhdG9yIGFzICZhdm06OnByb2Nlc3Nvci5UUkFDRV9HRU5FUkFUT1IgaXMKKyBzZWN0aW9uIFJFUE9SVAorIC4uLgorIGVuZHNlY3Rpb24gUkVQT1JUCisKKyBzZWN0aW9uIFBST1BFUlRZCisgLi4uCisgZW5kc2VjdGlvbiBQUk9QRVJUWQorCisgc2VjdGlvbiBUUkFDRQorICAvLyBBTkQgLS0+IGNvbmp1bmN0aXZlCisgIC8vIE9SICAtLT4gZGlzanVuY3RpdmUKKyAgLy8gWE9SIC0tPiBleGNsdXNpdmUKKyAgLy8gTk9UIC0tPiBuZWdhdGl2ZQorICBAY29tYmluYXRvciA9ICdPUic7CisKKyAgQHBhdGgjY29uZGl0aW9uID0gIlsqXSI7CisgIEBwYXRoI3RpbWVkI2NvbmRpdGlvbiA9ICJbKl0iOworCisgIEB0aW1lID0gIiRkZWx0YSI7CisgIEB0aW1lID0gIiR0aW1lIjsKKworICBAYXNzaWduID0gInNlbnMiOworCisgIEBuZXdmcmVzaCA9ICJzZW5zIjsKKworICBAY29tICAgID0gImVudiI7CisKKyAgQHNpZ25hbCA9ICJzZW5zIjsKKyAgQHBvcnQgICA9ICJlbnYiOworCisgIEBpbnB1dCAgPSAiZW52IjsKKyAgQG91dHB1dCA9ICJlbnYiOworCisgIEBvdXRwdXQgPSAiVGhlcm1vc3RhdC0+ZHQiOworICBAaW5wdXQgID0gIlRoZXJtb3N0YXQtPmVxdWlwIjsKKyAgQG91dHB1dCA9ICJFcXVpcG1lbnQtPmVycm9yIjsKKworICBAdHJhbnNpdGlvbiA9ICJ0OCI7CisgIEBtYWNoaW5lID0gIm0xIjsKKyAgQHByb2NlZHVyZSA9ICJbKl0iOworIGVuZHNlY3Rpb24gVFJBQ0UKKworIHNlY3Rpb24gRk9STUFUCisgLi4uCisgZW5kc2VjdGlvbiBGT1JNQVQKK2VuZHByb3RvdHlwZQorKi8KK2Jvb2wgQmFzaWNUcmFjZUJ1aWxkZXI6OmNvbmZpZ3VyZUltcGwoV09iamVjdCAqIHdmUGFyYW1ldGVyT2JqZWN0KQoreworCVdPYmplY3QgKiB0aGVQUk9QRVJUWSA9IFF1ZXJ5OjpnZXRSZWdleFdTZXF1ZW5jZSgKKwkJCXdmUGFyYW1ldGVyT2JqZWN0LCBPUl9XSUQyKCJwcm9wZXJ0eSIsICJQUk9QRVJUWSIpKTsKKworCWlmKCB0aGVQUk9QRVJUWSA9PSBXT2JqZWN0OjpfTlVMTF8gKQorCXsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXN0ZDo6c3RyaW5nIGZvcm1hdCA9IFF1ZXJ5OjpnZXRXUHJvcGVydHlTdHJpbmcoCisJCQl0aGVQUk9QRVJUWSwgImZvcm1hdCIsICJCQVNJQyNYTElBIik7CisJaXNTRExGbGFnID0gKCBmb3JtYXQuZmluZCgiU0RMIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKTsKKworCXByaW50SW5pdFZhbHVlc0ZsYWcgPSBRdWVyeTo6Z2V0UmVnZXhXUHJvcGVydHlCb29sZWFuKHRoZVBST1BFUlRZLAorCQkJQ09OU19XSUQyKCJzaG93IiwgImluaXRpYWxpemF0aW9uIikgInwiCisJCQlDT05TX1dJRDMoInByaW50IiwgImluaXRpYWwiLCAidmFsdWVzIiksIGZhbHNlKTsKKworCisJV09iamVjdCAqIHRoZUZPUk1BVCA9IFF1ZXJ5OjpnZXRSZWdleFdTZXF1ZW5jZSgKKwkJCXdmUGFyYW1ldGVyT2JqZWN0LCBPUl9XSUQyKCJmb3JtYXQiLCAiRk9STUFUIikpOworCisJaWYoIHRoZUZPUk1BVCAhPSBXT2JqZWN0OjpfTlVMTF8gKQorCXsKKwkJbVN0ZXBCZWdpblNlcGFyYXRvckZsYWcgPQorCQkJCVF1ZXJ5OjpoYXNSZWdleFdQcm9wZXJ0eSgKKwkJCQkJCXRoZUZPUk1BVCwgQ09OU19XSUQyKCJzdGVwIiwgImJlZ2luIikpOworCisJCW1TdGVwRW5kU2VwYXJhdG9yRmxhZyA9CisJCQkJUXVlcnk6Omhhc1JlZ2V4V1Byb3BlcnR5KAorCQkJCQkJdGhlRk9STUFULCBDT05TX1dJRDIoInN0ZXAiLCAiZW5kIikpOworCX0KKworCisJcmV0dXJuIHRydWU7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENPTlNUUlVDVElPTiBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgQmFzaWNUcmFjZUJ1aWxkZXI6OmJ1aWxkKFRyYWNlTWFuYWdlciAmIGFUcmFjZU1hbmFnZXIpCit7CisJbVRyYWNlTWFuYWdlciA9ICgmIGFUcmFjZU1hbmFnZXIpOworCisvLwl1cGRhdGVGbGFncygpOworCisJLy8gQ29sbGVjdCBhbmQgQ29tcHV0ZSBhbGwgVHJhY2VTZXF1ZW5jZQorCWJ1aWxkKCAqKCBtUHJvY2Vzc29yLmdldENvbmZpZ3VyYXRpb24oKS5nZXRGaXJzdFRyYWNlKCkgKSApOworfQorCisKK3ZvaWQgQmFzaWNUcmFjZUJ1aWxkZXI6OmJ1aWxkKGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKQoreworCW1UcmFjZUNhY2hlLnB1c2hfYmFjayggJiBhbkVDICk7CisKKwlpZiggYW5FQy5pc0xlYWZOb2RlKCkgKQorCXsKKwkJaWYoIFNvbHZlckZhY3Rvcnk6OmlzU3Ryb25nU2F0aXNmaWFibGUobVNvbHZlcktpbmQsCisJCQkJYW5FQy5yZWZFeGVjdXRpb25EYXRhKCkuZ2V0QWxsUGF0aENvbmRpdGlvbigpKSApCisJCXsKKwkJCWJ1aWxkVHJhY2UoKTsKKwkJfQorCQllbHNlCisJCXsKK0FWTV9JRl9ERUJVR19GTEFHMiggUFJPQ0VTU09SICwgVFJBQ0UgKQorCUFWTV9PU19UUkFDRSA8PCBzdGQ6OmVuZGwKKwkJCTw8ICJCYXNpY1RyYWNlQnVpbGRlcjo6YnVpbGQ6PiBVbnNhdGlzZmlhYmxlIFBDIDw8ICIKKwkJCTw8IGFuRUMucmVmRXhlY3V0aW9uRGF0YSgpLmdldEFsbFBhdGhDb25kaXRpb24oKS5zdHIoKQorCQkJPDwgIiA+PiB3aXRoIHNvbHZlciA8PCAiIDw8IFNvbHZlckRlZjo6c3RyU29sdmVyKCBtU29sdmVyS2luZCApCisJCQk8PCAiID4+IGZvciB0aGUgRUM6IiA8PCBzdGQ6OmVuZGw7CisJYW5FQy50cmFjZURlZmF1bHQoIEFWTV9PU19UUkFDRSApOworCWFuRUMucmVmRXhlY3V0aW9uRGF0YSgpLnRvU3RyZWFtRGF0YSggQVZNX09TX1RSQUNFICk7CisJQVZNX09TX1RSQUNFIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHMiggUFJPQ0VTU09SICwgVFJBQ0UgKQorCQl9CisJfQorCWVsc2UKKwl7CisJCUV4ZWN1dGlvbkNvbnRleHQ6OmNoaWxkX2l0ZXJhdG9yIGl0RUMgPSBhbkVDLmJlZ2luKCk7CisJCWZvciggOyBpdEVDICE9IGFuRUMuZW5kKCkgOyArK2l0RUMgKQorCQl7CisJCQlidWlsZCggKiggKml0RUMgKSApOworCisJCQltVHJhY2VDYWNoZS5wb3BfYmFjaygpOworCQl9CisJfQorfQorCisKK3ZvaWQgQmFzaWNUcmFjZUJ1aWxkZXI6OmJ1aWxkVHJhY2UoKQoreworCS8vIExhIHTDqnRlIGR1IGNoZW1pbgorCWFSb290RUMgPSBtVHJhY2VDYWNoZS5mcm9udCgpOworCS8vIGxhIHF1ZXVlIGR1IGNoZW1pbgorCWFUcmFjZUVDID0gbVRyYWNlQ2FjaGUuYmFjaygpOworCisJYVRyYWNlRWxlbWVudCA9IG5ldyBUcmFjZVNlcXVlbmNlKGFUcmFjZUVDLCBtVHJhY2VNYW5hZ2VyLT5uZXdUSUQoKSk7CisJbVRyYWNlTWFuYWdlci0+YXBwZW5kKCBhVHJhY2VFbGVtZW50ICk7CisKKwllbmRFQyA9IG1UcmFjZUNhY2hlLmVuZCgpOworCisKKwlpZiggbVRyYWNlUG9pbnRGaWx0ZXIuaGFzUGF0aENvbmRpdGlvblRyYWNlUG9pbnQoKQorCQkmJiBhVHJhY2VFQy0+cmVmRXhlY3V0aW9uRGF0YSgpLmhhc1BhdGhDb25kaXRpb24oKSApCisJeworCQliZlRQID0gYVRyYWNlUG9pbnQgPSBuZXcgVHJhY2VQb2ludCgoKiBhVHJhY2VFQyksCisJCQkJRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfUEFUSF9DT05ESVRJT05fTkFUVVJFX0xFQUYsCisJCQkJQVZNX09QQ09ERV9DSEVDS19TQVQsCisJCQkJYVRyYWNlRUMtPnJlZkV4ZWN1dGlvbkRhdGEoKS5nZXRQYXRoQ29uZGl0aW9uKCkpOworCisJCWFUcmFjZVBvaW50LT50cGlkID0gKytUUF9JRDsKKwkJYVRyYWNlRWxlbWVudC0+cG9pbnRzLmFwcGVuZCggYmZUUCApOworCX0KKworCWlmKCBtVHJhY2VQb2ludEZpbHRlci5oYXNQYXRoVGltZWRDb25kaXRpb25UcmFjZVBvaW50KCkKKwkJJiYgYVRyYWNlRUMtPnJlZkV4ZWN1dGlvbkRhdGEoKS5oYXNQYXRoVGltZWRDb25kaXRpb24oKSApCisJeworCQliZlRQID0gYVRyYWNlUG9pbnQgPSBuZXcgVHJhY2VQb2ludCgoKiBhVHJhY2VFQyksCisJCQkJRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfUEFUSF9USU1FRF9DT05ESVRJT05fTkFUVVJFX0xFQUYsCisJCQkJQVZNX09QQ09ERV9DSEVDS19TQVQsCisJCQkJYVRyYWNlRUMtPnJlZkV4ZWN1dGlvbkRhdGEoKS5nZXRQYXRoVGltZWRDb25kaXRpb24oKSk7CisKKwkJYVRyYWNlUG9pbnQtPnRwaWQgPSArK1RQX0lEOworCQlhVHJhY2VFbGVtZW50LT5wb2ludHMuYXBwZW5kKCBiZlRQICk7CisJfQorCisKKwlpZiggbVRyYWNlUG9pbnRGaWx0ZXIuaGFzTm9kZUNvbmRpdGlvblBvaW50KCkKKwkJJiYgYVRyYWNlRUMtPnJlZkV4ZWN1dGlvbkRhdGEoKS5oYXNOb2RlQ29uZGl0aW9uKCkgKQorCXsKKwkJYmZUUCA9IGFUcmFjZVBvaW50ID0gbmV3IFRyYWNlUG9pbnQoKCogYVRyYWNlRUMpLAorCQkJCUVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX05PREVfQ09ORElUSU9OX05BVFVSRV9MRUFGLAorCQkJCUFWTV9PUENPREVfQ0hFQ0tfU0FULAorCQkJCWFUcmFjZUVDLT5yZWZFeGVjdXRpb25EYXRhKCkuZ2V0Tm9kZUNvbmRpdGlvbigpKTsKKworCQlhVHJhY2VQb2ludC0+dHBpZCA9ICsrVFBfSUQ7CisJCWFUcmFjZUVsZW1lbnQtPnBvaW50cy5hcHBlbmQoIGJmVFAgKTsKKwl9CisKKwlpZiggbVRyYWNlUG9pbnRGaWx0ZXIuaGFzTm9kZVRpbWVkQ29uZGl0aW9uUG9pbnQoKQorCQkmJiBhVHJhY2VFQy0+cmVmRXhlY3V0aW9uRGF0YSgpLmhhc05vZGVUaW1lZENvbmRpdGlvbigpICkKKwl7CisJCWJmVFAgPSBhVHJhY2VQb2ludCA9IG5ldyBUcmFjZVBvaW50KCgqIGFUcmFjZUVDKSwKKwkJCQlFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9OT0RFX1RJTUVEX0NPTkRJVElPTl9OQVRVUkVfTEVBRiwKKwkJCQlBVk1fT1BDT0RFX0NIRUNLX1NBVCwKKwkJCQlhVHJhY2VFQy0+cmVmRXhlY3V0aW9uRGF0YSgpLmdldE5vZGVUaW1lZENvbmRpdGlvbigpKTsKKworCQlhVHJhY2VQb2ludC0+dHBpZCA9ICsrVFBfSUQ7CisJCWFUcmFjZUVsZW1lbnQtPnBvaW50cy5hcHBlbmQoIGJmVFAgKTsKKwl9CisKKworCWlmKCBwcmludEluaXRWYWx1ZXNGbGFnICkKKwl7CisJCXByaW50SW5pdGlhbGl6YXRpb25WYWx1ZXMoKTsKKwl9CisKKwlhdm1fc2l6ZV90IHN0ZXBOdW1iZXIgPSAwOworCWZvciggaXRFQyA9IG1UcmFjZUNhY2hlLmJlZ2luKCkgOyBpdEVDICE9IGVuZEVDIDsgKytpdEVDLCArK3N0ZXBOdW1iZXIgKQorCXsKKwkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQgPSAoKml0RUMpLT5yZWZFeGVjdXRpb25EYXRhKCk7CisKKwkJLy8gQkVHSU4gU1RFUAorCQlpZiggbVN0ZXBCZWdpblNlcGFyYXRvckZsYWcgKQorCQl7CisJCQliZlRQID0gYVRyYWNlUG9pbnQgPSBuZXcgVHJhY2VQb2ludCgqKCAqaXRFQyApLAorCQkJCQlFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9TVEVQX0JFR0lOX05BVFVSRSwKKwkJCQkJdG9fc3RyaW5nKHN0ZXBOdW1iZXIpICk7CisJCQlhVHJhY2VFbGVtZW50LT5wb2ludHMuYXBwZW5kKCBiZlRQICk7CisJCX0KKworCisJCS8vIHRoZSBTVEVQCisJCWlmKCBtVHJhY2VQb2ludEZpbHRlci5oYXNBc3NpZ25Qb2ludCgpICkKKwkJeworCQkJYnVpbGRUcmFjZVZhcmlhYmxlKCooICppdEVDICksIGFUcmFjZUVsZW1lbnQsIHN0ZXBOdW1iZXIgPiAwKTsKKwkJfQorCisJCWlmKCBtVHJhY2VQb2ludEZpbHRlci5oYXNSdW5uYWJsZVBvaW50KCkgKQorCQl7CisJCQlidWlsZFRyYWNlUnVubmFibGUoKiggKml0RUMgKSwgYVRyYWNlRWxlbWVudCwKKwkJCQkJYW5FRC5nZXRSdW5uYWJsZUVsZW1lbnRUcmFjZSgpKTsKKwkJfQorCisJCWlmKCBtVHJhY2VQb2ludEZpbHRlci5oYXNJT1RyYWNlUG9pbnQoKSApCisJCXsKKwkJCWJ1aWxkVHJhY2VJTygqKCAqaXRFQyApLCBhVHJhY2VFbGVtZW50LCBhbkVELmdldElPRWxlbWVudFRyYWNlKCkpOworCQl9CisKKworCQkvLyBFTkQgU1RFUAorCQlpZiggbVN0ZXBFbmRTZXBhcmF0b3JGbGFnICkKKwkJeworCQkJYmZUUCA9IGFUcmFjZVBvaW50ID0gbmV3IFRyYWNlUG9pbnQoKiggKml0RUMgKSwKKwkJCQkJRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfU1RFUF9FTkRfTkFUVVJFLAorCQkJCQl0b19zdHJpbmcoc3RlcE51bWJlcikgKTsKKwkJCWFUcmFjZUVsZW1lbnQtPnBvaW50cy5hcHBlbmQoIGJmVFAgKTsKKwkJfQorCX0KKworCW1UcmFjZU1hbmFnZXItPnJlZHVjZSggYVRyYWNlRWxlbWVudCApOworfQorCisKK3ZvaWQgQmFzaWNUcmFjZUJ1aWxkZXI6OmJ1aWxkVHJhY2VWYXJpYWJsZSgKKwkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMsIFRyYWNlU2VxdWVuY2UgKiBhVHJhY2VFbHQsIGJvb2wgaXNub3RSb290KQoreworCWNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVEID0gYW5FQy5yZWZFeGVjdXRpb25EYXRhKCk7CisKKwlUYWJsZU9mSW5zdGFuY2VPZkRhdGE6OmNvbnN0X3Jhd19pdGVyYXRvciBpdFZhcmlhYmxlOworCVRhYmxlT2ZJbnN0YW5jZU9mRGF0YTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGVuZFZhcmlhYmxlOworCisJVGFibGVPZlJ1bnRpbWVUOjpjb25zdF9pdGVyYXRvciBpdFJGID0gYW5FRC5nZXRUYWJsZU9mUnVudGltZSgpLmJlZ2luKCk7CisJVGFibGVPZlJ1bnRpbWVUOjpjb25zdF9pdGVyYXRvciBlbmRSRiA9IGFuRUQuZ2V0VGFibGVPZlJ1bnRpbWUoKS5lbmQoKTsKKwlSdW50aW1lRm9ybSAqIHBSRiA9IE5VTEw7CisJZm9yKCArK2l0UkY7IChpdFJGICE9IGVuZFJGKSA7ICsraXRSRiApCisJeworCQlwUkYgPSAoKml0UkYpOworCisJCWlmKCBwUkYtPmhhc0RhdGEoKSApCisJCXsKKwkJCWl0VmFyaWFibGUgPSBwUkYtPmdldEV4ZWN1dGFibGUoKS0+Z2V0QWxsRGF0YSgpLmJlZ2luKCk7CisJCQllbmRWYXJpYWJsZSA9IHBSRi0+Z2V0RXhlY3V0YWJsZSgpLT5nZXRBbGxEYXRhKCkuZW5kKCk7CisJCQlmb3IoIDsgaXRWYXJpYWJsZSAhPSBlbmRWYXJpYWJsZSA7ICsraXRWYXJpYWJsZSApCisJCQl7CisJCQkJaWYoIG1EYXRhU2VsZWN0aW9uTW9kaWZpZWRGbGFncyAmJiBpc25vdFJvb3QgKQorCQkJCXsKKwkJCQkJaWYoIG5vdCBhbkVELmlzQXNzaWduZWQoCisJCQkJCQkJcFJGLT5nZXRSSUQoKSwgaXRWYXJpYWJsZS0+Z2V0T2Zmc2V0KCkpICkKKwkJCQkJeworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiggbVRyYWNlUG9pbnRGaWx0ZXIucGFzcyhwUkYtPmdldFJJRCgpLAorCQkJCQkJc3RhdGljX2Nhc3Q8IEluc3RhbmNlT2ZEYXRhICogPihpdFZhcmlhYmxlKSkgKQorCQkJCXsKKwkJCQkJYmZUUCA9IGFUcmFjZVBvaW50ID0gbmV3IFRyYWNlUG9pbnQoYW5FQywKKwkJCQkJCQlFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9WQVJJQUJMRV9OQVRVUkUsCisJCQkJCQkJQVZNX09QQ09ERV9BU1NJR04sIHBSRi0+Z2V0SW5zdGFuY2UoKSwKKwkJCQkJCQlpdFZhcmlhYmxlLCBwUkYtPmdldERhdGFUYWJsZSgpLT5nZXQoaXRWYXJpYWJsZSkpOworCisJCQkJCWFUcmFjZVBvaW50LT5SSUQgPSBwUkYtPmdldFJJRCgpOworCQkJCQlhVHJhY2VQb2ludC0+dHBpZCA9ICsrVFBfSUQ7CisJCQkJCWFUcmFjZUVsdC0+cG9pbnRzLmFwcGVuZCggYmZUUCApOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworCit2b2lkIEJhc2ljVHJhY2VCdWlsZGVyOjpidWlsZFRyYWNlSU8oY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMsCisJCVRyYWNlU2VxdWVuY2UgKiBhVHJhY2VFbHQsIGNvbnN0IEJGICYgaW9UcmFjZSkKK3sKKwlpZiggaW9UcmFjZS5pbnZhbGlkKCkgKQorCXsKKwkJcmV0dXJuOworCX0KKwllbHNlIGlmKCBpb1RyYWNlLmlzPCBFeGVjdXRpb25Db25maWd1cmF0aW9uID4oKSApCisJeworCQlFeGVjdXRpb25Db25maWd1cmF0aW9uICogYUNvbmYgPQorCQkJCWlvVHJhY2UudG9fcHRyPCBFeGVjdXRpb25Db25maWd1cmF0aW9uID4oKTsKKworCQlvYmplY3QgPSBtVHJhY2VQb2ludEZpbHRlci5vYmplY3REZWx0YVRpbWU7CisKKwkJaWYoIGFDb25mLT5pc0F2bUNvZGUoKSApCisJCXsKKwkJCUF2bUNvZGUgKiBhQ29kZSA9IGFDb25mLT5nZXRBdm1Db2RlKCk7CisKKwkJCWFUcmFjZVBvaW50ID0gTlVMTDsKKworCQkJc3dpdGNoKCBhQ29kZS0+Z2V0QXZtT3BDb2RlKCkgKQorCQkJeworCQkJCWNhc2UgQVZNX09QQ09ERV9BU1NJR05fTkVXRlJFU0g6CisJCQkJeworCQkJCQlvYmplY3QgPSBhQ29kZS0+Zmlyc3QoKS50b19wdHI8IEJhc2VJbnN0YW5jZUZvcm0gPigpOworCQkJCQl2YWx1ZSA9IGFDb2RlLT5zZWNvbmQoKTsKKworCQkJCQlpZiggb2JqZWN0ID09IG1UcmFjZVBvaW50RmlsdGVyLm9iamVjdERlbHRhVGltZSApCisJCQkJCXsKKwkJCQkJCWJmVFAgPSBhVHJhY2VQb2ludCA9IG5ldyBUcmFjZVBvaW50KGFuRUMsIGFDb25mLAorCQkJCQkJCQlFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9USU1FX05BVFVSRSwKKwkJCQkJCQkJQVZNX09QQ09ERV9USU1FRF9HVUFSRCwKKwkJCQkJCQkJYUNvbmYtPmdldFJ1bnRpbWVJRCgpLmdldEluc3RhbmNlKCksCisJCQkJCQkJCW9iamVjdCwgdmFsdWUpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJYmZUUCA9IGFUcmFjZVBvaW50ID0gbmV3IFRyYWNlUG9pbnQoYW5FQywKKwkJCQkJCQkJYUNvbmYsIGFDb25mLT5nZXRSdW50aW1lSUQoKSwgb2JqZWN0LCB2YWx1ZSk7CisJCQkJCX0KKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQljYXNlIEFWTV9PUENPREVfSU5QVVQ6CisKKy8vCQkJCWNhc2UgQVZNX09QQ09ERV9JTlBVVF9GUk9NOgorLy8KKy8vCQkJCWNhc2UgQVZNX09QQ09ERV9JTlBVVF9TQVZFOgorLy8KKy8vCQkJCS8vIE9wdGltaXplZCB2ZXJzaW9uIG9mIElOUFVUCisvLwkJCQljYXNlIEFWTV9PUENPREVfSU5QVVRfRU5WOgorLy8JCQkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUX1ZBUjoKKy8vCQkJCWNhc2UgQVZNX09QQ09ERV9JTlBVVF9GTE9XOgorLy8JCQkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUX0JVRkZFUjoKKy8vCQkJCWNhc2UgQVZNX09QQ09ERV9JTlBVVF9SRFY6CisvLwkJCQljYXNlIEFWTV9PUENPREVfSU5QVVRfTVVMVElfUkRWOgorLy8JCQkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUX0JST0FEQ0FTVDoKKy8vCQkJCWNhc2UgQVZNX09QQ09ERV9JTlBVVF9ERUxFR0FURToKKworCQkJCWNhc2UgQVZNX09QQ09ERV9PVVRQVVQ6CisKKy8vCQkJCWNhc2UgQVZNX09QQ09ERV9PVVRQVVRfVE86CisvLwkJCQkvLyBPcHRpbWl6ZWQgdmVyc2lvbiBvZiBPVVRQVVQKKy8vCQkJCWNhc2UgQVZNX09QQ09ERV9PVVRQVVRfRU5WOgorLy8JCQkJY2FzZSBBVk1fT1BDT0RFX09VVFBVVF9WQVI6CisvLwkJCQljYXNlIEFWTV9PUENPREVfT1VUUFVUX0ZMT1c6CisvLwkJCQljYXNlIEFWTV9PUENPREVfT1VUUFVUX0JVRkZFUjoKKy8vCQkJCWNhc2UgQVZNX09QQ09ERV9PVVRQVVRfUkRWOgorLy8JCQkJY2FzZSBBVk1fT1BDT0RFX09VVFBVVF9NVUxUSV9SRFY6CisvLwkJCQljYXNlIEFWTV9PUENPREVfT1VUUFVUX0JST0FEQ0FTVDoKKy8vCQkJCWNhc2UgQVZNX09QQ09ERV9PVVRQVVRfREVMRUdBVEU6CisKKwkJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJaWYoIGFDb2RlLT5maXJzdCgpLmlzPCBCYXNlSW5zdGFuY2VGb3JtID4oKSApCisJCQkJCXsKKwkJCQkJCW9iamVjdCA9IGFDb2RlLT5maXJzdCgpLnRvX3B0cjwgQmFzZUluc3RhbmNlRm9ybSA+KCk7CisJCQkJCQl2YWx1ZSA9IEJGOjpSRUZfTlVMTDsKKworCQkJCQkJaWYoIGFDb2RlLT5wb3B1bGF0ZWQoKSApCisJCQkJCQl7CisJCQkJCQkJaWYoIGFDb2RlLT5zaXplKCkgPj0gMyAgKQorCQkJCQkJCXsKKwkJCQkJCQkJQXJyYXlCRiAqIHZhbHVlcyA9IG5ldyBBcnJheUJGKAorCQkJCQkJCQkJCVR5cGVNYW5hZ2VyOjpVTklWRVJTQUwsCisJCQkJCQkJCQkJYUNvZGUtPnNpemUoKSAtIChpc1NETEZsYWc/IDIgOiAxKSApOworCQkJCQkJCQl2YWx1ZS5zZXRQb2ludGVyKHZhbHVlcyk7CisKKwkJCQkJCQkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBhQ29kZS0+YmVnaW4oKTsKKwkJCQkJCQkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBhQ29kZS0+ZW5kKCk7CisJCQkJCQkJCWlmKCBpc1NETEZsYWcgKQorCQkJCQkJCQl7CisJCQkJCQkJCQktLWVuZEl0OworCQkJCQkJCQl9CisJCQkJCQkJCWF2bV9zaXplX3Qgb2Zmc2V0ID0gMDsKKwkJCQkJCQkJZm9yKCArK2l0OyBpdCAhPSBlbmRJdCA7ICsrb2Zmc2V0ICwgKytpdCApCisJCQkJCQkJCXsKKwkJCQkJCQkJCXZhbHVlcy0+c2V0KG9mZnNldCwgKCppdCkpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCWVsc2UgaWYoIG5vdCBpc1NETEZsYWcgKQorCQkJCQkJCXsKKwkJCQkJCQkJQXJyYXlCRiAqIHZhbHVlcyA9IG5ldyBBcnJheUJGKAorCQkJCQkJCQkJCVR5cGVNYW5hZ2VyOjpVTklWRVJTQUwsIDEpOworCQkJCQkJCQl2YWx1ZS5zZXRQb2ludGVyKHZhbHVlcyk7CisKKwkJCQkJCQkJdmFsdWVzLT5zZXQoMCwgYUNvZGUtPnNlY29uZCgpKTsKKwkJCQkJCQl9CisJCQkJCQl9CisKKwkJCQkJCVJ1bnRpbWVJRCByaWRDb250YWluZXIgPSBhQ29uZi0+Z2V0UnVudGltZUlEKCk7CisKKwkJCQkJCWlmKCBvYmplY3QtPmlzPCBJbnN0YW5jZU9mUG9ydCA+KCkgKQorCQkJCQkJeworCQkJCQkJCXJpZENvbnRhaW5lciA9IGFDb25mLT5nZXRSdW50aW1lSUQoKS5nZXRDb21tdW5pY2F0b3IoCisJCQkJCQkJCQlvYmplY3QtPnRvPCBJbnN0YW5jZU9mUG9ydCA+KCkpOworCisJCQkJCQkJaWYoIHJpZENvbnRhaW5lci5pbnZhbGlkKCkgKQorCQkJCQkJCXsKKwkJCQkJCQkJcmlkQ29udGFpbmVyID0gYUNvbmYtPmdldFJ1bnRpbWVJRCgpOworCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQkJYmZUUCA9IGFUcmFjZVBvaW50ID0gbmV3IFRyYWNlUG9pbnQoYW5FQywgYUNvbmYsCisJCQkJCQkJCXJpZENvbnRhaW5lciwgb2JqZWN0LCB2YWx1ZSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlpZiggbVRyYWNlUG9pbnRGaWx0ZXIucGFzcyhhVHJhY2VQb2ludCkgKQorCQkJeworCQkJCWFUcmFjZVBvaW50LT50cGlkID0gKytUUF9JRDsKKwkJCQlhVHJhY2VFbHQtPnBvaW50cy5hcHBlbmQoIGJmVFAgKTsKKwkJCX0KKwkJfQorCX0KKwllbHNlIGlmKCBpb1RyYWNlLmlzPCBBdm1Db2RlID4oKSApCisJeworCQlBdm1Db2RlICogaW9Db2RlID0gaW9UcmFjZS50b19wdHI8IEF2bUNvZGUgPigpOworCisJCVRyYWNlU2VxdWVuY2UgKiBzdWJUcmFjZSA9IGFUcmFjZUVsdDsKKwkJQkYgYmZTdWJUcmFjZTsKKwkJaWYoIG5vdCBpb0NvZGUtPmlzT3BDb2RlKGFUcmFjZUVsdC0+Y29tYmluYXRvcikgKQorCQl7CisJCQliZlN1YlRyYWNlID0gc3ViVHJhY2UgPQorCQkJCQluZXcgVHJhY2VTZXF1ZW5jZShhVHJhY2VFbHQsIGlvQ29kZS0+Z2V0T3BlcmF0b3IoKSk7CisJCX0KKworCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdCA9IGlvQ29kZS0+YmVnaW4oKTsKKwkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kQ29kZSA9IGlvQ29kZS0+ZW5kKCk7CisJCWZvciggOyBpdCAhPSBlbmRDb2RlIDsgKytpdCApCisJCXsKKwkJCWJ1aWxkVHJhY2VJTyhhbkVDLCBzdWJUcmFjZSwgKCppdCkpOworCQl9CisKKwkJaWYoIChzdWJUcmFjZSAhPSBhVHJhY2VFbHQpICkKKwkJeworCQkJaWYoIHN1YlRyYWNlLT5wb2ludHMuc2luZ2xldG9uKCkgKQorCQkJeworCQkJCWFUcmFjZUVsdC0+cG9pbnRzLmFwcGVuZCggc3ViVHJhY2UtPnBvaW50cy5wb3BfbGFzdCgpICk7CisJCQl9CisJCQllbHNlIGlmKCBzdWJUcmFjZS0+cG9pbnRzLm5vbmVtcHR5KCkgKQorCQkJeworCQkJCWFUcmFjZUVsdC0+cG9pbnRzLmFwcGVuZCggYmZTdWJUcmFjZSApOworCQkJfQorCQl9CisJfQorfQorCisKK3ZvaWQgQmFzaWNUcmFjZUJ1aWxkZXI6OmJ1aWxkVHJhY2VSdW5uYWJsZShjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQywKKwkJVHJhY2VTZXF1ZW5jZSAqIGFUcmFjZUVsdCwgY29uc3QgQkYgJiBhVHJhY2UpCit7CisJaWYoIGFUcmFjZS5pbnZhbGlkKCkgKQorCXsKKwkJcmV0dXJuOworCX0KKwllbHNlIGlmKCBhVHJhY2UuaXM8IEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24gPigpICkKKwl7CisJCUV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24gKiBhQ29uZiA9CisJCQkJYVRyYWNlLnRvX3B0cjwgRXhlY3V0aW9uQ29uZmlndXJhdGlvbiA+KCk7CisKKwkJYVRyYWNlUG9pbnQgPSBOVUxMOworCisJCWlmKCBhQ29uZi0+aXNBdm1Db2RlKCkgKQorCQl7CisJCQliZlRQID0gYVRyYWNlUG9pbnQgPSBuZXcgVHJhY2VQb2ludChhbkVDLCBhQ29uZiwKKwkJCQkJRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfVU5ERUZJTkVEX05BVFVSRSwKKwkJCQkJYUNvbmYtPmdldEF2bU9wQ29kZSgpLAorCQkJCQlhQ29uZi0+Z2V0UnVudGltZUlEKCkuZ2V0SW5zdGFuY2UoKSwKKwkJCQkJTlVMTCwgYUNvbmYtPmdldENvZGUoKSk7CisJCX0KKworCQllbHNlIGlmKCBhQ29uZi0+aXNUcmFuc2l0aW9uKCkgKQorCQl7CisJCQliZlRQID0gYVRyYWNlUG9pbnQgPSBuZXcgVHJhY2VQb2ludChhbkVDLCBhQ29uZiwKKwkJCQkJRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfVFJBTlNJVElPTl9OQVRVUkUsCisJCQkJCUFWTV9PUENPREVfSU5WT0tFX1RSQU5TSVRJT04sCisJCQkJCWFDb25mLT5nZXRSdW50aW1lSUQoKS5nZXRJbnN0YW5jZSgpLAorCQkJCQlhQ29uZi0+Z2V0VHJhbnNpdGlvbigpKTsKKwkJfQorCisJCWVsc2UgaWYoIGFDb25mLT5pc1JvdXRpbmUoKSApCisJCXsKKwkJCWJmVFAgPSBhVHJhY2VQb2ludCA9IG5ldyBUcmFjZVBvaW50KGFuRUMsIGFDb25mLAorCQkJCQlFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9ST1VUSU5FX05BVFVSRSwKKwkJCQkJQVZNX09QQ09ERV9OVUxMLCAvL0FWTV9PUENPREVfSU5WT0tFX1JPVVRJTkUsCisJCQkJCWFDb25mLT5nZXRSdW50aW1lSUQoKS5nZXRJbnN0YW5jZSgpLCBhQ29uZi0+Z2V0UHJvZ3JhbSgpKTsKKwkJfQorCisJCWVsc2UgaWYoIGFDb25mLT5pc1J1bm5hYmxlKCkgKQorCQl7CisJCQliZlRQID0gYVRyYWNlUG9pbnQgPSBuZXcgVHJhY2VQb2ludChhbkVDLCBhQ29uZiwKKwkJCQkJRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfUlVOTkFCTEVfTkFUVVJFLCBBVk1fT1BDT0RFX1JVTiwKKwkJCQkJYUNvbmYtPmdldFJ1bnRpbWVJRCgpLmdldEluc3RhbmNlKCksIGFDb25mLT5nZXRQcm9ncmFtKCkpOworCQl9CisKKwkJZWxzZSBpZiggYUNvbmYtPmlzT3BlcmF0b3IoKSApCisJCXsKKwkJCU9wZXJhdG9yICogYW5PcGVyYXRvciA9IGFDb25mLT5nZXRPcGVyYXRvcigpOworCisJCQlzd2l0Y2goIGFuT3BlcmF0b3ItPmdldEF2bU9wQ29kZSgpICkKKwkJCXsKKwkJCQljYXNlIEFWTV9PUENPREVfUlVOOgorCQkJCWNhc2UgQVZNX09QQ09ERV9JUlVOOgorCQkJCWNhc2UgQVZNX09QQ09ERV9TVEFSVDoKKwkJCQl7CisJCQkJCVJ1bnRpbWVJRCByaWRDb250YWluZXIgPQorCQkJCQkJCWFDb25mLT5nZXRSdW50aW1lSUQoKS5oYXNQYXJlbnQoKQorCQkJCQkJCQkJPyBhQ29uZi0+Z2V0UnVudGltZUlEKCkuZ2V0UGFyZW50KCkKKwkJCQkJCQkJCTogYUNvbmYtPmdldFJ1bnRpbWVJRCgpOworCisJCQkJCWJmVFAgPSBhVHJhY2VQb2ludCA9IG5ldyBUcmFjZVBvaW50KGFuRUMsIGFDb25mLAorCQkJCQkJCUVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX01BQ0hJTkVfTkFUVVJFLAorCQkJCQkJCUFWTV9PUENPREVfUlVOLCByaWRDb250YWluZXIsCisJCQkJCQkJYUNvbmYtPmdldFJ1bnRpbWVJRCgpLmdldEluc3RhbmNlKCkpOworCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQliZlRQID0gYVRyYWNlUG9pbnQgPSBuZXcgVHJhY2VQb2ludChhbkVDLCBhQ29uZiwKKwkJCQkJCQlFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9SVU5OQUJMRV9OQVRVUkUsCisJCQkJCQkJYW5PcGVyYXRvci0+Z2V0QXZtT3BDb2RlKCksCisJCQkJCQkJYUNvbmYtPmdldFJ1bnRpbWVJRCgpLmdldEluc3RhbmNlKCksCisJCQkJCQkJJiAoIGFDb25mLT5nZXRSdW50aW1lSUQoKS5nZXRFeGVjdXRhYmxlKCktPgorCQkJCQkJCQlnZXRPbkFjdGl2aXR5Um91dGluZSgKKwkJCQkJCQkJCQlhbk9wZXJhdG9yLT5nZXRBdm1PcENvZGUoKSkgKSApOworCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmKCBtVHJhY2VQb2ludEZpbHRlci5wYXNzKGFUcmFjZVBvaW50KSApCisJCXsKKwkJCWFUcmFjZVBvaW50LT50cGlkID0gKytUUF9JRDsKKwkJCWFUcmFjZUVsdC0+cG9pbnRzLmFwcGVuZCggYmZUUCApOworCQl9CisJfQorCWVsc2UgaWYoIGFUcmFjZS5pczwgQXZtQ29kZSA+KCkgKQorCXsKKwkJQXZtQ29kZSAqIGlvQ29kZSA9IGFUcmFjZS50b19wdHI8IEF2bUNvZGUgPigpOworCisJCVRyYWNlU2VxdWVuY2UgKiBzdWJUcmFjZSA9IGFUcmFjZUVsdDsKKwkJQkYgYmZTdWJUcmFjZTsKKwkJaWYoIG5vdCBpb0NvZGUtPmlzT3BDb2RlKGFUcmFjZUVsdC0+Y29tYmluYXRvcikgKQorCQl7CisJCQliZlN1YlRyYWNlID0gc3ViVHJhY2UgPQorCQkJCQluZXcgVHJhY2VTZXF1ZW5jZShhVHJhY2VFbHQsIGlvQ29kZS0+Z2V0T3BlcmF0b3IoKSk7CisJCX0KKworCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdCA9IGlvQ29kZS0+YmVnaW4oKTsKKwkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kQ29kZSA9IGlvQ29kZS0+ZW5kKCk7CisJCWZvciggOyBpdCAhPSBlbmRDb2RlIDsgKytpdCApCisJCXsKKwkJCWJ1aWxkVHJhY2VSdW5uYWJsZShhbkVDLCBzdWJUcmFjZSwgKCppdCkpOworCQl9CisKKwkJaWYoIChzdWJUcmFjZSAhPSBhVHJhY2VFbHQpICkKKwkJeworCQkJaWYoIHN1YlRyYWNlLT5wb2ludHMuc2luZ2xldG9uKCkgKQorCQkJeworCQkJCWFUcmFjZUVsdC0+cG9pbnRzLmFwcGVuZCggc3ViVHJhY2UtPnBvaW50cy5wb3BfbGFzdCgpICk7CisJCQl9CisJCQllbHNlIGlmKCBzdWJUcmFjZS0+cG9pbnRzLm5vbmVtcHR5KCkgKQorCQkJeworCQkJCWFUcmFjZUVsdC0+cG9pbnRzLmFwcGVuZCggYmZTdWJUcmFjZSApOworCQkJfQorCQl9CisJfQorfQorCisKK3ZvaWQgQmFzaWNUcmFjZUJ1aWxkZXI6OnByaW50SW5pdGlhbGl6YXRpb25WYWx1ZXMoKQoreworCS8vICEhISEhISEhISEhISEhIE1vZGlmIGR1IDA3LzAyLzE0IHBvdXIgYXZvaXIgbGVzIEluaXRpYWxpemF0aW9uVmFsdWVzICEhISEhISEhISEhISEhCisKKwlib29sIGF0TGVhc3RPbmVJbml0aWFsaXphdGlvbiA9IGZhbHNlOworCisJVGFibGVPZkluc3RhbmNlT2ZEYXRhIHRoZVBDVmFyaWFibGVWZWN0b3I7CisJSW5zdGFuY2VPZkRhdGEgKiB0aGVWYXJpYWJsZTsKKworCVJ1bnRpbWVJRCB0aGVSSUQgPSBhVHJhY2VFQy0+cmVmRXhlY3V0aW9uRGF0YSgpLmdldFBhcmFtZXRlcnNSSUQoKTsKKwlJbnN0YW5jZU9mTWFjaGluZSAqIHRoZU1hY2hpbmUgPSB0aGVSSUQuZ2V0SW5zdGFuY2UoKTsKKworCUV4cHJlc3Npb25GYWN0b3J5Ojpjb2xsZWN0VmFyaWFibGUoCisJCQlhVHJhY2VFQy0+cmVmRXhlY3V0aW9uRGF0YSgpLmdldFBhdGhDb25kaXRpb24oKSwKKwkJCXRoZVBDVmFyaWFibGVWZWN0b3IpOworCisJLy8gSW5pdGlhbGl6YXRpb24gYmVnaW5uaW5nIG1hcmtlciIKKwliZlRQID0gYVRyYWNlUG9pbnQgPSBuZXcgVHJhY2VQb2ludCgoKiBhVHJhY2VFQyksCisJCQlFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9JTklUX0JFR0lOX05BVFVSRSwKKwkJCXRvX3N0cmluZyhhVHJhY2VFbGVtZW50LT50aWQpKTsKKwlhVHJhY2VFbGVtZW50LT5wb2ludHMuYXBwZW5kKCBiZlRQICk7CisKKwlmb3IgKGF2bV9zaXplX3QgayA9IDAgOyBrIDwgdGhlUENWYXJpYWJsZVZlY3Rvci5zaXplKCkgOyBrICsrKQorCXsKKwkJdGhlVmFyaWFibGUgPSB0aGVQQ1ZhcmlhYmxlVmVjdG9yLnJhd0F0KCBrICk7CisKKwkJc3RkOjpzdHJpbmcgdmFyTmFtZSA9IHRoZVZhcmlhYmxlLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOworCQlzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGluZGV4ID0gdmFyTmFtZS5maW5kX2xhc3Rfb2YoJyMnKTsKKwkJaWYoIChpbmRleCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgJiYgKHZhck5hbWVbaW5kZXgrMV0gPT0gJzAnKSApCisJCXsKKwkJCWF0TGVhc3RPbmVJbml0aWFsaXphdGlvbiA9IHRydWU7CisKKwkJCWJmVFAgPSBhVHJhY2VQb2ludCA9IG5ldyBUcmFjZVBvaW50KCgqIGFUcmFjZUVDKSwgTlVMTCwKKwkJCQkJRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfVkFSSUFCTEVfTkFUVVJFLAorCQkJCQlBVk1fT1BDT0RFX0FTU0lHTiwKKwkJCQkJdGhlTWFjaGluZSwgCS8vIGluc3RhbmNlIGRlIHNhIG1hY2hpbmUsIE5VTEwgc2kgb24gbmUgbCdhZmZpY2hlIHBhcworCQkJCQl0aGVWYXJpYWJsZSwgCS8vIGluc3RhbmNlIGRlIGxhIHZhcmlhYmxlCisJCQkJCXRoZVBDVmFyaWFibGVWZWN0b3JbIGsgXSk7CS8vIHNhIHZhbGV1ciBkYW5zIGwnRUMKKworCQkJYVRyYWNlUG9pbnQtPlJJRCA9IGFUcmFjZUVDLT5yZWZFeGVjdXRpb25EYXRhKCkuZ2V0UGFyYW1ldGVyc1JJRCgpOworCisJCQkvLyBBam91dCBkYW5zIGxhIHRyYWNlIGNvdXJhbnRlCisJCQlhVHJhY2VFbGVtZW50LT5wb2ludHMuYXBwZW5kKCBiZlRQICk7CisJCX0KKwl9CisKKwlpZiggYXRMZWFzdE9uZUluaXRpYWxpemF0aW9uICkKKwl7CisJCS8vIEFmZmljaGFnZSBzYXV0IGRlIGxpZ25lIHBvdXIgc8OpcGFyZXIgbGVzICJJbml0aWFsaXphdGlvbiB2YWx1ZXMiIGR1IHNjw6luYXJpbworCQliZlRQID0gYVRyYWNlUG9pbnQgPSBuZXcgVHJhY2VQb2ludCgoKiBhVHJhY2VFQyksCisJCQkJRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfSU5JVF9FTkRfTkFUVVJFLAorCQkJCXRvX3N0cmluZyhhVHJhY2VFbGVtZW50LT50aWQpKTsKKwkJYVRyYWNlRWxlbWVudC0+cG9pbnRzLmFwcGVuZCggYmZUUCApOworCX0KKwllbHNlCisJeworCQkvLyBSZW1vdmUgaW5pdGlhbGl6YXRpb24gYmVnaW5uaW5nIG1hcmtlciIKKwkJYVRyYWNlRWxlbWVudC0+cG9pbnRzLnJlbW92ZV9sYXN0KCk7CisJfQorfQorCisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vdHJhY2UvQmFzaWNUcmFjZUJ1aWxkZXIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS90cmFjZS9CYXNpY1RyYWNlQnVpbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4OGQyNzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vdHJhY2UvQmFzaWNUcmFjZUJ1aWxkZXIuaApAQCAtMCwwICsxLDEzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDYgamFudi4gMjAxNAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEJBU0lDVFJBQ0VCVUlMREVSX0hfCisjZGVmaW5lIEJBU0lDVFJBQ0VCVUlMREVSX0hfCisKKyNpbmNsdWRlICJBYnN0cmFjdFRyYWNlQnVpbGRlci5oIgorCisjaW5jbHVkZSA8Y29sbGVjdGlvbi9UeXBlZGVmLmg+CisKKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25Db250ZXh0Lmg+CisKKyNpbmNsdWRlIDxzb2x2ZXIvYXBpL1NvbHZlckRlZi5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworY2xhc3MgQXZtVHJhY2VHZW5lcmF0b3I7CitjbGFzcyBFdmFsdWF0aW9uRW52aXJvbm1lbnQ7CitjbGFzcyBFeGVjdXRhYmxlU3lzdGVtOworY2xhc3MgRXhlY3V0aW9uRGF0YTsKKworY2xhc3MgVHJhY2VGaWx0ZXI7CitjbGFzcyBUcmFjZU1hbmFnZXI7CitjbGFzcyBUcmFjZVBvaW50OworY2xhc3MgVHJhY2VTZXF1ZW5jZTsKKworCitjbGFzcyBCYXNpY1RyYWNlQnVpbGRlciAgOiAgcHVibGljIEFic3RyYWN0VHJhY2VCdWlsZGVyCit7CisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBBVFRSSUJVVEVTCisJICovCisJRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WOworCisJYm9vbCBpc1NETEZsYWc7CisJYm9vbCBwcmludEluaXRWYWx1ZXNGbGFnOworCisJVHJhY2VNYW5hZ2VyICogbVRyYWNlTWFuYWdlcjsKKworCVNvbHZlckRlZjo6U09MVkVSX0tJTkQgbVNvbHZlcktpbmQ7CisKKwlUcmFjZUZpbHRlciAmIG1UcmFjZVBvaW50RmlsdGVyOworCisJYm9vbCBtU3RlcEJlZ2luU2VwYXJhdG9yRmxhZzsKKwlib29sIG1TdGVwRW5kU2VwYXJhdG9yRmxhZzsKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBDb21wdXRpbmcgVmFyaWFibGVzCisJVHJhY2VTZXF1ZW5jZSAqIGFUcmFjZUVsZW1lbnQ7CisJVHJhY2VQb2ludCAqIGFUcmFjZVBvaW50OworCUJGIGJmVFA7CisJYXZtX3NpemVfdCBUUF9JRDsKKworCUxpc3RPZkNvbnN0RXhlY3V0aW9uQ29udGV4dCBtVHJhY2VDYWNoZTsKKworCWNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgKiBhUm9vdEVDOworCWNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgKiBhVHJhY2VFQzsKKwlMaXN0T2ZDb25zdEV4ZWN1dGlvbkNvbnRleHQ6OmNvbnN0X2l0ZXJhdG9yIGl0RUM7CisJTGlzdE9mQ29uc3RFeGVjdXRpb25Db250ZXh0Ojpjb25zdF9pdGVyYXRvciBlbmRFQzsKKworCUJGIGNvZGU7CisJQmFzZUNvbXBpbGVkRm9ybSAqIG9iamVjdDsKKwlCRiB2YWx1ZTsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQmFzaWNUcmFjZUJ1aWxkZXIoQXZtVHJhY2VHZW5lcmF0b3IgJiBhUHJvY2Vzc29yLAorCQkJU29sdmVyRGVmOjpTT0xWRVJfS0lORCBhU29sdmVyS2luZCwKKwkJCVRyYWNlRmlsdGVyICYgYVRyYWNlUG9pbnRGaWx0ZXIpOworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkJhc2ljVHJhY2VCdWlsZGVyKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQ09ORklHVVJFIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXZpcnR1YWwgYm9vbCBjb25maWd1cmVJbXBsKFdPYmplY3QgKiB3ZlBhcmFtZXRlck9iamVjdCk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBDT05TVFJVQ1RJT04gQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJdm9pZCBidWlsZChUcmFjZU1hbmFnZXIgJiBhVHJhY2VNYW5hZ2VyKTsKKworCXZvaWQgYnVpbGQoY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpOworCisJdm9pZCBidWlsZFRyYWNlKCk7CisKKwl2b2lkIGJ1aWxkVHJhY2VWYXJpYWJsZShjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQywKKwkJCVRyYWNlU2VxdWVuY2UgKiBhVHJhY2VFbHQsIGJvb2wgaXNub3RSb290ID0gdHJ1ZSk7CisKKwl2b2lkIGJ1aWxkVHJhY2VJTyhjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQywKKwkJCVRyYWNlU2VxdWVuY2UgKiBhVHJhY2VFbHQsIGNvbnN0IEJGICYgaW9UcmFjZSk7CisKKwl2b2lkIGJ1aWxkVHJhY2VSdW5uYWJsZShjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQywKKwkJCVRyYWNlU2VxdWVuY2UgKiBhVHJhY2VFbHQsIGNvbnN0IEJGICYgYVRyYWNlKTsKKworCXZvaWQgcHJpbnRJbml0aWFsaXphdGlvblZhbHVlcygpOworCit9OworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworCisjZW5kaWYgLyogQkFTSUNUUkFDRUJVSUxERVJfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS90cmFjZS9CYXNpY1RyYWNlRm9ybWF0dGVyLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS90cmFjZS9CYXNpY1RyYWNlRm9ybWF0dGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjdkMjlkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3RyYWNlL0Jhc2ljVHJhY2VGb3JtYXR0ZXIuY3BwCkBAIC0wLDAgKzEsMTAxMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDExIGTDqWMuIDIwMTMKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkJhc2ljVHJhY2VGb3JtYXR0ZXIuaCIKKworI2luY2x1ZGUgIlRyYWNlTWFuYWdlci5oIgorCisjaW5jbHVkZSA8Y29tbW9uL1NlcmlhbGl6ZXJGZWF0dXJlLmg+CisKKyNpbmNsdWRlIDxmYW0vdHJhY2UvQXZtVHJhY2VHZW5lcmF0b3IuaD4KKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZNYWNoaW5lLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9CdWlsdGluQXJyYXkuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkNvbmZpZ3VyYXRpb24uaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lTGliLmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvUnVudGltZVF1ZXJ5Lmg+CisKKyNpbmNsdWRlIDxmbWwvdHJhY2UvVHJhY2VQb2ludC5oPgorI2luY2x1ZGUgPGZtbC90cmFjZS9UcmFjZVNlcXVlbmNlLmg+CisKKyNpbmNsdWRlIDxmbWwvd29ya2Zsb3cvUXVlcnkuaD4KKyNpbmNsdWRlIDxmbWwvd29ya2Zsb3cvV09iamVjdC5oPgorCisjaW5jbHVkZSA8Ym9vc3QvZm9ybWF0LmhwcD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoqCisgKiBBU1NJR04KKyAqICUxJSAtLT4gbWFjaGluZSBydW50aW1lIHBpZAorICogJTIlIC0tPiBtYWNoaW5lIGNvbnRhaW5lciBpZGVudGlmaWVyCisgKiAlMyUgLS0+IHZhcmlhYmxlIGlkZW50aWZpZXIKKyAqICU0JSAtLT4gdmFsdWUKKyAqLworY29uc3Qgc3RkOjpzdHJpbmcgJiBCYXNpY1RyYWNlRm9ybWF0dGVyOjoKK0RFRkFVTFRfQVNTSUdOX1BBVFRFUk4gPSAiXHQlMiU6JTMlID0gJTQlXG4iOworCisvKioKKyAqIE5FV0ZSRVNICisgKiAlMSUgLS0+IG1hY2hpbmUgcnVudGltZSBwaWQKKyAqICUyJSAtLT4gbWFjaGluZSBjb250YWluZXIgaWRlbnRpZmllcgorICogJTMlIC0tPiB2YXJpYWJsZSBpZGVudGlmaWVyCisgKiAlNCUgLS0+IHZhbHVlCisgKi8KK2NvbnN0IHN0ZDo6c3RyaW5nICYgQmFzaWNUcmFjZUZvcm1hdHRlcjo6CitERUZBVUxUX05FV0ZSRVNIX1BBVFRFUk4gPSAiXHRuZXdmcmVzaCAlMiUtPiUzJSggJTQlIClcbiI7CisKKy8qKgorICogSU5QVVQgLyBPVVRQVVQKKyAqICUxJSAtLT4gbWFjaGluZSBydW50aW1lIHBpZAorICogJTIlIC0tPiBtYWNoaW5lIGNvbnRhaW5lciBpZGVudGlmaWVyCisgKiAlMyUgLS0+ICggcG9ydCB8IHNpZ25hbCApIGlkZW50aWZpZXIKKyAqICU0JSAtLT4gdmFsdWUKKyAqICU1JSAtLT4gbWFjaGluZSBzZW5kZXIgICBpZGVudGlmaWVyIG5hbWUKKyAqICU2JSAtLT4gbWFjaGluZSByZWNlaXZlciBpZGVudGlmaWVyIG5hbWUKKyAqLworY29uc3Qgc3RkOjpzdHJpbmcgJiBCYXNpY1RyYWNlRm9ybWF0dGVyOjoKK0RFRkFVTFRfSU5QVVRfUEFUVEVSTiA9ICJcdGlucHV0ICAlMiUtPiUzJSU0JVxuIjsKKworY29uc3Qgc3RkOjpzdHJpbmcgJiBCYXNpY1RyYWNlRm9ybWF0dGVyOjoKK0RFRkFVTFRfT1VUUFVUX1BBVFRFUk4gPSAiXHRvdXRwdXQgJTIlLT4lMyUlNCVcbiI7CisKKworY29uc3Qgc3RkOjpzdHJpbmcgJiBCYXNpY1RyYWNlRm9ybWF0dGVyOjoKK0RFRkFVTFRfSU5QVVRfRU5WX1BBVFRFUk4gPSAiXHRpbnB1dCNlbnYgICUyJS0+JTMlJTQlXG4iOworCitjb25zdCBzdGQ6OnN0cmluZyAmIEJhc2ljVHJhY2VGb3JtYXR0ZXI6OgorREVGQVVMVF9PVVRQVVRfRU5WX1BBVFRFUk4gPSAiXHRvdXRwdXQjZW52ICUyJS0+JTMlJTQlXG4iOworCisKK2NvbnN0IHN0ZDo6c3RyaW5nICYgQmFzaWNUcmFjZUZvcm1hdHRlcjo6CitERUZBVUxUX0lOUFVUX1JEVl9QQVRURVJOID0gIlx0aW5wdXQjcmR2ICAlMiUtPiUzJSU0JVxuIjsKKworY29uc3Qgc3RkOjpzdHJpbmcgJiBCYXNpY1RyYWNlRm9ybWF0dGVyOjoKK0RFRkFVTFRfT1VUUFVUX1JEVl9QQVRURVJOID0gIlx0b3V0cHV0I3JkdiAlMiUtPiUzJSU0JVxuIjsKKworLyoqCisgKiBNQUNISU5FCisgKiAlMSUgLS0+IG1hY2hpbmUgcnVudGltZSBwaWQKKyAqICUyJSAtLT4gbWFjaGluZSBjb250YWluZXIgaWRlbnRpZmllcgorICogJTMlIC0tPiBtYWNoaW5lIGlkZW50aWZpZXIKKyAqLworY29uc3Qgc3RkOjpzdHJpbmcgJiBCYXNpY1RyYWNlRm9ybWF0dGVyOjoKK0RFRkFVTFRfTUFDSElORV9QQVRURVJOID0gIiUzJSI7CisKKy8qKgorICogVFJBTlNJVElPTgorICogJTElIC0tPiBtYWNoaW5lIHJ1bnRpbWUgcGlkCisgKiAlMiUgLS0+IG1hY2hpbmUgY29udGFpbmVyIGlkZW50aWZpZXIKKyAqICUzJSAtLT4gdHJhbnNpdGlvbiBpZGVudGlmaWVyCisgKi8KK2NvbnN0IHN0ZDo6c3RyaW5nICYgQmFzaWNUcmFjZUZvcm1hdHRlcjo6CitERUZBVUxUX1RSQU5TSVRJT05fUEFUVEVSTiA9ICIlMiUtPiUzJSI7CisKKy8qKgorICogUk9VVElORQorICogJTElIC0tPiBtYWNoaW5lIHJ1bnRpbWUgcGlkCisgKiAlMiUgLS0+IG1hY2hpbmUgY29udGFpbmVyIGlkZW50aWZpZXIKKyAqICUzJSAtLT4gcm91dGluZSBpZGVudGlmaWVyCisgKi8KK2NvbnN0IHN0ZDo6c3RyaW5nICYgQmFzaWNUcmFjZUZvcm1hdHRlcjo6CitERUZBVUxUX1JPVVRJTkVfUEFUVEVSTiA9ICIlMiUtPiUzJSI7CisKKworLyoKK3Byb3RvdHlwZSBwcm9jZXNzOjp0cmFjZV9nZW5lcmF0b3IgYXMgJmF2bTo6cHJvY2Vzc29yLlRSQUNFX0dFTkVSQVRPUiBpcworIC4uLgorIHNlY3Rpb24gRk9STUFUCisgIEBsaW5lI3dyYXAjd2lkdGggPSA4MDsKKyAgQGxpbmUjd3JhcCNzZXBhcmF0b3IgPSAiXG5cdCI7CisKKyAgQGhlYWRlciA9ICJUUkFDRSBMSVNUXG4iOworICBAZW5kICAgID0gIlxuIjsKKworICAvLyAlMSUgLS0+IC0+RUMjaWQKKyAgLy8gJTIlIC0tPiBlYyNldmFsCisgIC8vICUzJSAtLT4gZWMjaGlnaHQKKyAgLy8gJTQlIC0tPiBlYyN3aWR0aAorICAvLyAlNSUgLS0+IGVjI3dlaWdodAorICAvLyAlNiUgLS0+IHN0YXRlbWFjaGluZSBjb25maWd1cmF0aW9uIGkuZS4gY29udHJvbCBub2RlCisgIEBjb250ZXh0I3FuaWQgPSAiY3R4PCAlMSUgPiAlNiUiOworICBAY29udGV4dCN1ZmlkID0gImN0eDwgJTElID4gJTYlIjsgLy8gQERlcHJlY2F0ZWQKKworICAvLyAlMSUgLS0+IHRyYWNlIG51bWJlcgorICAvLyAlMiUgLS0+IGV4ZWN1dGlvbiBjb250ZXh0IGxlYWYgaWRlbnRpZmllcgorICBAaGVhZGVyID0gIlRSQUNFIE5VTUJFUiAlMSVcbiI7CisgIEBlbmQgICAgPSAiXG4iOworCisgIEBpbml0I2JlZ2luID0gIlx0Ly8gSW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIHZhbHVlczpcbiI7CisgIEBpbml0I2VuZCAgICA9ICJcbiI7CisKKyAgLy8gJTElIC0tPiBzdHJpbmcgbWVzc2FnZQorICAvLyAlMiUgLS0+IGV4ZWN1dGlvbiBjb250ZXh0IGlkZW50aWZpZXIKKyAgQGNvbW1lbnQgICA9ICIvLyUxJSI7CisgIEBzZXBhcmF0b3IgPSAiJTElIiAgOworICBAbmV3bGluZSAgID0gIlxuJTElIjsKKworICAvLyAlMSUgLS0+IHN0ZXAgaWRlbnRpZmllcgorICAvLyAlMiUgLS0+IGV4ZWN1dGlvbiBjb250ZXh0IGlkZW50aWZpZXIKKyAgQHN0ZXAjYmVnaW4gPSAiI3N0ZXAjYmVnaW4gJTElXG4iOworICBAc3RlcCNlbmQgICA9ICIjc3RlcCNlbmQgJTElXG4iOworCisgIC8vICUxJSAtLT4gY29uZGl0aW9uCisgIC8vICUyJSAtLT4gZXhlY3V0aW9uIGNvbnRleHQgaWRlbnRpZmllcgorICBAcGF0aCNjb25kaXRpb24gPSAiUEM6ICUxJSI7CisgIEBwYXRoI3RpbWVkI2NvbmRpdGlvbiA9ICJQdEM6ICUxJSI7CisgIEBub2RlI2NvbmRpdGlvbiA9ICJOQzogJTElIjsKKyAgQG5vZGUjdGltZWQjY29uZGl0aW9uID0gIk50QzogJTElIjsKKworICAvLyAlMSUgLS0+IG1hY2hpbmUgcnVudGltZSBwaWQKKyAgLy8gJTIlIC0tPiBtYWNoaW5lIGNvbnRhaW5lciBpZGVudGlmaWVyCisgIC8vICUzJSAtLT4gcG9ydCB8IHNpZ25hbCB8IHZhcmlhYmxlIHwgbWFjaGluZSB8IHRyYW5zaXRpb24gfCByb3V0aW5lCisgIC8vICU0JSAtLT4gdmFsdWUKKworICBAdGltZSAgID0gIlx0JTQlXG4iOworCisgIEBhc3NpZ24gPSAiXHQlMiU6JTMlID0gJTQlXG4iOworCisgIEBuZXdmcmVzaCA9ICJcdG5ld2ZyZXNoICUyJS0+JTMlKCAlNCUgKVxuIjsKKworICBAaW5wdXQgID0gIlx0aW5wdXQgICUyJS0+JTMlJTQlXG4iOworICBAb3V0cHV0ID0gIlx0b3V0cHV0ICUyJS0+JTMlJTQlXG4iOworCisgIEBpbnB1dCNlbnYgID0gIlx0SU5QVVQgICUyJS0+JTMlJTQlXG4iOworICBAb3V0cHV0I2VudiA9ICJcdE9VVFBVVCAlMiUtPiUzJSU0JVxuIjsKKworIGVuZHNlY3Rpb24gRk9STUFUCisgLi4uCitlbmRwcm90b3R5cGUKKyovCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENPTkZJR1VSRSBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgQmFzaWNUcmFjZUZvcm1hdHRlcjo6Y29uZmlndXJlKFdPYmplY3QgKiBGT1JNQVQsCisJCXN0ZDo6c3RyaW5nICYgZm9ybWF0UGF0dGVybiwgY29uc3Qgc3RkOjpzdHJpbmcgJiBpZCwgYm9vbCBpc1JlZ2V4KQoreworCWZvcm1hdFBhdHRlcm4gPSAgaXNSZWdleAorCQkJPyBRdWVyeTo6Z2V0UmVnZXhXUHJvcGVydHlTdHJpbmcoRk9STUFULCBpZCwgZm9ybWF0UGF0dGVybikKKwkJCTogUXVlcnk6OmdldFdQcm9wZXJ0eVN0cmluZyhGT1JNQVQsIGlkLCBmb3JtYXRQYXR0ZXJuKTsKKworCVN0cmluZ1Rvb2xzOjpyZXBsYWNlQWxsKGZvcm1hdFBhdHRlcm4sICJcXHQiLCAiXHQiKTsKKwlTdHJpbmdUb29sczo6cmVwbGFjZUFsbChmb3JtYXRQYXR0ZXJuLCAiXFxuIiwgIlxuIik7CisKKwlTdHJpbmdUb29sczo6cmVwbGFjZUFsbChmb3JtYXRQYXR0ZXJuLCAiXFxcIiIsICJcIiIpOworCisJdHJ5CisJeworCQlib29zdDo6Zm9ybWF0IGZvcm1hdHRlcihmb3JtYXRQYXR0ZXJuKTsKKwl9CisJY2F0Y2goY29uc3QgYm9vc3Q6OmlvOjpiYWRfZm9ybWF0X3N0cmluZyAmIGJmcykKKwl7CisJCVF1ZXJ5OjpyZXBvcnRFcnJvckF0dHJpYnV0ZShGT1JNQVQsIGlkLCBiZnMud2hhdCgpKTsKKworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKK2Jvb2wgQmFzaWNUcmFjZUZvcm1hdHRlcjo6Y29uZmlndXJlSW1wbChXT2JqZWN0ICogd2ZQYXJhbWV0ZXJPYmplY3QpCit7CisJLy8gZGVmYXVsdCBwYXJhbWV0ZXIKKwkvLyAlMSUgLS0+IHRyYWNlIG51bWJlcgorCS8vICUyJSAtLT4gZXhlY3V0aW9uIGNvbnRleHQgbGVhZiBpZGVudGlmaWVyCisJLy8gQGhlYWRlciA9ICJUUkFDRSBOVU1CRVIgJTElXG4iOworCS8vIEBlbmQgICAgPSAiXG4iOworCisJLy8gJTElIC0tPiBtYWNoaW5lIHJ1bnRpbWUgcGlkCisJLy8gJTIlIC0tPiBtYWNoaW5lIGNvbnRhaW5lciBpZGVudGlmaWVyCisJLy8gJTMlIC0tPiBwb3J0IHwgc2lnbmFsIHwgdmFyaWFibGUgfCBtYWNoaW5lIHwgdHJhbnNpdGlvbiB8IHJvdXRpbmUKKwkvLyAlNCUgLS0+IHZhbHVlCisKKwkvLyBAdGltZSAgID0gIlx0JTQlXG4iOworCS8vCisJLy8gQGFzc2lnbiA9ICJcdCUyJTolMyUgPSAlNCVcbiI7CisJLy8KKwkvLyBAbmV3ZnJlc2ggPSAiXHRuZXdmcmVzaCAlMiUtPiUzJSggJTQlIClcbiI7CisJLy8KKwkvLyBAaW5wdXQgID0gIlx0aW5wdXQgICUyJS0+JTMlJTQlXG4iOworCS8vIEBvdXRwdXQgPSAiXHRvdXRwdXQgJTIlLT4lMyUlNCVcbiI7CisKKwlXT2JqZWN0ICogdGhlRk9STUFUID0gUXVlcnk6OmdldFJlZ2V4V1NlcXVlbmNlKAorCQkJd2ZQYXJhbWV0ZXJPYmplY3QsIE9SX1dJRDIoImZvcm1hdCIsICJGT1JNQVQiKSk7CisKKwlpZiggdGhlRk9STUFUICE9IFdPYmplY3Q6Ol9OVUxMXyApCisJeworCQlhdm1fc2l6ZV90IGVycm9yID0gMDsKKworCQllcnJvciArPSBjb25maWd1cmUodGhlRk9STUFULCBtRXhlY3V0aW9uQ29udGV4dFVmaWRQYXR0ZXJuLAorCQkJCUNPTlNfV0lEMigiY29udGV4dCIsICIocW58dWYpaWQiKSwgdHJ1ZSkgPyAwIDogMTsKKworCisJCWVycm9yICs9IGNvbmZpZ3VyZSh0aGVGT1JNQVQsIG1GaWxlSGVhZGVyUGF0dGVybiwKKwkJCQlDT05TX1dJRDIoImZpbGUiLCAiaGVhZGVyIiksIHRydWUpID8gMCA6IDE7CisKKwkJZXJyb3IgKz0gY29uZmlndXJlKHRoZUZPUk1BVCwgbUZpbGVCZWdpblBhdHRlcm4sCisJCQkJQ09OU19XSUQyKCJmaWxlIiwgImJlZ2luIiksIHRydWUgKSA/IDAgOiAxOworCisJCWVycm9yICs9IGNvbmZpZ3VyZSh0aGVGT1JNQVQsIG1GaWxlRW5kUGF0dGVybiwKKwkJCQlDT05TX1dJRDIoImZpbGUiLCAiZW5kIiksIHRydWUgICApID8gMCA6IDE7CisKKworCQllcnJvciArPSBjb25maWd1cmUodGhlRk9STUFULCBtVGVzdGNhc2VIZWFkZXJQYXR0ZXJuLAorCQkJCUNPTlNfV0lEMigidGVzdGNhc2UiLCAiaGVhZGVyIiksIHRydWUpID8gMCA6IDE7CisKKwkJZXJyb3IgKz0gY29uZmlndXJlKHRoZUZPUk1BVCwgbVRlc3RjYXNlQmVnaW5QYXR0ZXJuLAorCQkJCUNPTlNfV0lEMigidGVzdGNhc2UiLCAiYmVnaW4iKSwgdHJ1ZSApID8gMCA6IDE7CisKKwkJZXJyb3IgKz0gY29uZmlndXJlKHRoZUZPUk1BVCwgbVRlc3RjYXNlRW5kUGF0dGVybiwKKwkJCQlDT05TX1dJRDIoInRlc3RjYXNlIiwgImVuZCIpLCB0cnVlICAgKSA/IDAgOiAxOworCisKKwkJZXJyb3IgKz0gY29uZmlndXJlKHRoZUZPUk1BVCwgbUxpZmVsaW5lSGVhZGVyUGF0dGVybiwKKwkJCQlDT05TX1dJRDIoImxpZmVsaW5lIiwgImhlYWRlciIpLCB0cnVlKSA/IDAgOiAxOworCisJCWVycm9yICs9IGNvbmZpZ3VyZSh0aGVGT1JNQVQsIG1MaWZlbGluZUJlZ2luUGF0dGVybiwKKwkJCQlDT05TX1dJRDIoImxpZmVsaW5lIiwgImJlZ2luIiksIHRydWUgKSA/IDAgOiAxOworCisJCWVycm9yICs9IGNvbmZpZ3VyZSh0aGVGT1JNQVQsIG1MaWZlbGluZUVuZFBhdHRlcm4sCisJCQkJQ09OU19XSUQyKCJsaWZlbGluZSIsICJlbmQiKSwgdHJ1ZSAgICkgPyAwIDogMTsKKworCQllcnJvciArPSBjb25maWd1cmUodGhlRk9STUFULCBtTGlmZWxpbmVJZFBhdHRlcm4sCisJCQkJQ09OU19XSUQyKCJsaWZlbGluZSIsICJpZCIpLCB0cnVlICAgKSA/IDAgOiAxOworCisKKwkJZXJyb3IgKz0gY29uZmlndXJlKHRoZUZPUk1BVCwgbUluaXRpYWxpemF0aW9uSGVhZGVyUGF0dGVybiwKKwkJCQlDT05TX1dJRDIoImluaXQiLCAiaGVhZGVyIiksIHRydWUpID8gMCA6IDE7CisKKwkJZXJyb3IgKz0gY29uZmlndXJlKHRoZUZPUk1BVCwgbUluaXRpYWxpemF0aW9uQmVnaW5QYXR0ZXJuLAorCQkJCUNPTlNfV0lEMigiaW5pdCIsICJiZWdpbiIpLCB0cnVlKSA/IDAgOiAxOworCisJCWVycm9yICs9IGNvbmZpZ3VyZSh0aGVGT1JNQVQsIG1Jbml0aWFsaXphdGlvbkVuZFBhdHRlcm4sCisJCQkJQ09OU19XSUQyKCJpbml0IiwgImVuZCIpLCB0cnVlICApID8gMCA6IDE7CisKKworCQllcnJvciArPSBjb25maWd1cmUodGhlRk9STUFULCBtU3RlcEhlYWRlclBhdHRlcm4sCisJCQkJQ09OU19XSUQyKCJzdGVwIiwgImhlYWRlciIpLCB0cnVlKSA/IDAgOiAxOworCisJCWVycm9yICs9IGNvbmZpZ3VyZSh0aGVGT1JNQVQsbVN0ZXBCZWdpblBhdHRlcm4sCisJCQkJQ09OU19XSUQyKCJzdGVwIiwgImJlZ2luIiksIHRydWUgKSA/IDAgOiAxOworCisJCWVycm9yICs9IGNvbmZpZ3VyZSh0aGVGT1JNQVQsIG1TdGVwRW5kUGF0dGVybiwKKwkJCQlDT05TX1dJRDIoInN0ZXAiLCAiZW5kIiksIHRydWUgICApID8gMCA6IDE7CisKKworCQllcnJvciArPSBjb25maWd1cmUodGhlRk9STUFULCBtQ29tbWVudFBhdHRlcm4gICwgImNvbW1lbnQiICApID8gMCA6IDE7CisKKwkJZXJyb3IgKz0gY29uZmlndXJlKHRoZUZPUk1BVCwgbVNlcGFyYXRvclBhdHRlcm4sICJzZXBhcmF0b3IiKSA/IDAgOiAxOworCisJCWVycm9yICs9IGNvbmZpZ3VyZSh0aGVGT1JNQVQsIG1OZXdsaW5lUGF0dGVybiAgLCAibmV3bGluZSIgICkgPyAwIDogMTsKKworCisJCWVycm9yICs9IGNvbmZpZ3VyZSh0aGVGT1JNQVQsIG1QYXRoQ29uZGl0aW9uUGF0dGVybiwKKwkJCQlDT05TX1dJRDIoInBhdGgiLCAiY29uZGl0aW9uIiksIHRydWUgKSA/IDAgOiAxOworCisJCWVycm9yICs9IGNvbmZpZ3VyZSh0aGVGT1JNQVQsbVBhdGhUaW1lZENvbmRpdGlvblBhdHRlcm4sCisJCQkJQ09OU19XSUQyKCJwYXRoI3RpbWVkIiwgImNvbmRpdGlvbiIpLCB0cnVlICkgPyAwIDogMTsKKworCQllcnJvciArPSBjb25maWd1cmUodGhlRk9STUFULCBtTm9kZUNvbmRpdGlvblBhdHRlcm4sCisJCQkJQ09OU19XSUQyKCJub2RlIiwgImNvbmRpdGlvbiIpLCB0cnVlICkgPyAwIDogMTsKKworCQllcnJvciArPSBjb25maWd1cmUodGhlRk9STUFULCBtTm9kZVRpbWVkQ29uZGl0aW9uUGF0dGVybiwKKwkJCQlDT05TX1dJRDIoIm5vZGUjdGltZWQiLCAiY29uZGl0aW9uIiksIHRydWUgKSA/IDAgOiAxOworCisKKwkJZXJyb3IgKz0gY29uZmlndXJlKHRoZUZPUk1BVCwgbVRpbWVQYXR0ZXJuICAgICwgInRpbWUiICAgICkgPyAwIDogMTsKKwkJZXJyb3IgKz0gY29uZmlndXJlKHRoZUZPUk1BVCwgbUFzc2lnblBhdHRlcm4gICwgImFzc2lnbiIgICkgPyAwIDogMTsKKwkJZXJyb3IgKz0gY29uZmlndXJlKHRoZUZPUk1BVCwgbU5ld2ZyZXNoUGF0dGVybiwgIm5ld2ZyZXNoIikgPyAwIDogMTsKKworCQllcnJvciArPSBjb25maWd1cmUodGhlRk9STUFULCBtSW5wdXRQYXR0ZXJuICwgImlucHV0IiApID8gMCA6IDE7CisJCWVycm9yICs9IGNvbmZpZ3VyZSh0aGVGT1JNQVQsIG1PdXRwdXRQYXR0ZXJuLCAib3V0cHV0IikgPyAwIDogMTsKKworCisJCWVycm9yICs9IGNvbmZpZ3VyZSh0aGVGT1JNQVQsIG1JbnB1dEVudlBhdHRlcm4sCisJCQkJQ09OU19XSUQyKCJpbnB1dCIsICJlbnYiKSwgdHJ1ZSApID8gMCA6IDE7CisKKwkJZXJyb3IgKz0gY29uZmlndXJlKHRoZUZPUk1BVCwgbU91dHB1dEVudlBhdHRlcm4sCisJCQkJQ09OU19XSUQyKCJvdXRwdXQiLCAiZW52IiksIHRydWUpID8gMCA6IDE7CisKKworCQllcnJvciArPSBjb25maWd1cmUodGhlRk9STUFULCBtSW5wdXRSZHZQYXR0ZXJuLAorCQkJCUNPTlNfV0lEMigiaW5wdXQiLCAicmR2IiksIHRydWUgKSA/IDAgOiAxOworCisJCWVycm9yICs9IGNvbmZpZ3VyZSh0aGVGT1JNQVQsIG1PdXRwdXRSZHZQYXR0ZXJuLAorCQkJCUNPTlNfV0lEMigib3V0cHV0IiwgInJkdiIpLCB0cnVlKSA/IDAgOiAxOworCisKKwkJaWYoIFF1ZXJ5OjpoYXNXUHJvcGVydHlTdHJpbmcodGhlRk9STUFULCAiaW5wdXQiKSApCisJCXsKKwkJCWlmKCBub3QgUXVlcnk6Omhhc1JlZ2V4V1Byb3BlcnR5KAorCQkJCQl0aGVGT1JNQVQsIENPTlNfV0lEMigiaW5wdXQiLCAiZW52IikpICkKKwkJCXsKKwkJCQltSW5wdXRFbnZQYXR0ZXJuID0gbUlucHV0UGF0dGVybjsKKwkJCX0KKwkJCWlmKCBub3QgUXVlcnk6Omhhc1JlZ2V4V1Byb3BlcnR5KAorCQkJCQl0aGVGT1JNQVQsIENPTlNfV0lEMigiaW5wdXQiLCAicmR2IikpICkKKwkJCXsKKwkJCQltSW5wdXRSZHZQYXR0ZXJuID0gbUlucHV0UGF0dGVybjsKKwkJCX0KKwkJfQorCisJCWlmKCBRdWVyeTo6aGFzV1Byb3BlcnR5U3RyaW5nKHRoZUZPUk1BVCwgIm91dHB1dCIpICkKKwkJeworCQkJaWYoIG5vdCBRdWVyeTo6aGFzUmVnZXhXUHJvcGVydHkoCisJCQkJCXRoZUZPUk1BVCwgQ09OU19XSUQyKCJvdXRwdXQiLCAiZW52IikpICkKKwkJCXsKKwkJCQltT3V0cHV0RW52UGF0dGVybiA9IG1PdXRwdXRQYXR0ZXJuOworCQkJfQorCQkJaWYoIG5vdCBRdWVyeTo6aGFzUmVnZXhXUHJvcGVydHkoCisJCQkJCXRoZUZPUk1BVCwgQ09OU19XSUQyKCJvdXRwdXQiLCAicmR2IikpICkKKwkJCXsKKwkJCQltT3V0cHV0UmR2UGF0dGVybiA9IG1PdXRwdXRQYXR0ZXJuOworCQkJfQorCQl9CisKKwkJZXJyb3IgKz0gY29uZmlndXJlKHRoZUZPUk1BVCwKKwkJCQltTWFjaGluZVBhdHRlcm4gICAsICJtYWNoaW5lIiAgICkgPyAwIDogMTsKKworCQllcnJvciArPSBjb25maWd1cmUodGhlRk9STUFULAorCQkJCW1UcmFuc2l0aW9uUGF0dGVybiwgInRyYW5zaXRpb24iKSA/IDAgOiAxOworCisJCWVycm9yICs9IGNvbmZpZ3VyZSh0aGVGT1JNQVQsCisJCQkJbVJvdXRpbmVQYXR0ZXJuICAgLCAicm91dGluZSIgICApID8gMCA6IDE7CisKKwkJZXJyb3IgKz0gY29uZmlndXJlKHRoZUZPUk1BVCwKKwkJCQltUnVubmFibGVQYXR0ZXJuICAsICJydW5uYWJsZSIgICkgPyAwIDogMTsKKworCQlyZXR1cm4oIGVycm9yID09IDAgKTsKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRk9STUFUIEFQSQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBCYXNpY1RyYWNlRm9ybWF0dGVyOjpmb3JtYXQoVHJhY2VNYW5hZ2VyICYgYVRyYWNlTWFuYWdlcikKK3sKKwltVHJhY2VHZW5lcmF0b3IuYmVnaW5TdHJlYW0oKTsKKwl3aGlsZSggbVRyYWNlR2VuZXJhdG9yLmhhc1N0cmVhbSgpICkKKwl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQUNFICkKKwltVHJhY2VHZW5lcmF0b3IuY3VycmVudFN0cmVhbSgpIDw8ICJmb3JtYXQ6PiAiOworCW1UcmFjZUdlbmVyYXRvci5nZXRUcmFjZUZpbHRlcigpLnRvU3RyZWFtKG1UcmFjZUdlbmVyYXRvci5jdXJyZW50U3RyZWFtKCkpOworCW1UcmFjZUdlbmVyYXRvci5jdXJyZW50U3RyZWFtKCkgPDwgc3RkOjplbmRsOworCisJYVRyYWNlTWFuYWdlci50b1N0cmVhbSggbVRyYWNlR2VuZXJhdG9yLmN1cnJlbnRTdHJlYW0oKSApOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFDRSApCisKKwkJZm9ybWF0KG1UcmFjZUdlbmVyYXRvci5jdXJyZW50U3RyZWFtKCksIGFUcmFjZU1hbmFnZXIpOworCX0KKworCW1UcmFjZUdlbmVyYXRvci5jbG9zZVN0cmVhbSgpOworfQorCisKK3ZvaWQgQmFzaWNUcmFjZUZvcm1hdHRlcjo6Zm9ybWF0KE91dFN0cmVhbSAmIG9zLCBUcmFjZU1hbmFnZXIgJiBhVHJhY2VNYW5hZ2VyKQoreworCW9zLnNldFN5bWJleFZhbHVlQ1NTKG1NdWx0aVZhbHVlQXJyYXlDU1MsCisJCQltTXVsdGlWYWx1ZVBhcmFtc0NTUywgbU11bHRpVmFsdWVTdHJ1Y3RDU1MpOworCisJLy8gRW4gdMOqdGUgZ2xvYmFsCisJYm9vc3Q6OmZvcm1hdCBoZWFkZm9ybWF0dGVyKG1GaWxlSGVhZGVyUGF0dGVybik7CisJaGVhZGZvcm1hdHRlci5leGNlcHRpb25zKCBib29zdDo6aW86Om5vX2Vycm9yX2JpdHMgKTsKKwlvcyA8PCBoZWFkZm9ybWF0dGVyIDw8IHN0ZDo6Zmx1c2g7CisKKwlib29zdDo6Zm9ybWF0IGJlZ2luZm9ybWF0dGVyKG1GaWxlQmVnaW5QYXR0ZXJuKTsKKwliZWdpbmZvcm1hdHRlci5leGNlcHRpb25zKCBib29zdDo6aW86Om5vX2Vycm9yX2JpdHMgKTsKKwlvcyA8PCBiZWdpbmZvcm1hdHRlciA8PCBzdGQ6OmZsdXNoOworCisJVHJhY2VNYW5hZ2VyOjpjb25zdF9pdGVyYXRvciBpdCA9IGFUcmFjZU1hbmFnZXIuYmVnaW4oKTsKKwlUcmFjZU1hbmFnZXI6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gYVRyYWNlTWFuYWdlci5lbmQoKTsKKwlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwl7CisJCWFUcmFjZUVsZW1lbnQgPSAoKml0KTsKKworCQlmb3JtYXRUcmFjZUlEKG9zLCAqYVRyYWNlRWxlbWVudCwgbVRlc3RjYXNlSGVhZGVyUGF0dGVybik7CisJCWZvcm1hdFRyYWNlSUQob3MsICphVHJhY2VFbGVtZW50LCBtVGVzdGNhc2VCZWdpblBhdHRlcm4pOworCisJCWZvcm1hdChvcywgKmFUcmFjZUVsZW1lbnQpOworCisJCWZvcm1hdFRyYWNlSUQob3MsICphVHJhY2VFbGVtZW50LCBtVGVzdGNhc2VFbmRQYXR0ZXJuKTsKKworCQlpZiggbVByaW50TGlmZWxpbmVzICkKKwkJeworCQkJZm9ybWF0TGlmZWxpbmVzKG9zLCAqYVRyYWNlRWxlbWVudCk7CisJCQlvcyA8PCBzdGQ6OmVuZGw7CisJCX0KKwl9CisKKwkvLyBFbmQgZ2xvYmFsCisJYm9vc3Q6OmZvcm1hdCBlbmRmb3JtYXR0ZXIobUZpbGVFbmRQYXR0ZXJuKTsKKwllbmRmb3JtYXR0ZXIuZXhjZXB0aW9ucyggYm9vc3Q6OmlvOjpub19lcnJvcl9iaXRzICk7CisJb3MgPDwgZW5kZm9ybWF0dGVyIDw8IHN0ZDo6Zmx1c2g7CisKKwlvcy5yZXN0b3JlU3ltYmV4VmFsdWVDU1MoKTsKK30KKworCit2b2lkIEJhc2ljVHJhY2VGb3JtYXR0ZXI6OmZvcm1hdExpZmVsaW5lcygKKwkJT3V0U3RyZWFtICYgb3MsIGNvbnN0IFRyYWNlU2VxdWVuY2UgJiBhVHJhY2VFbHQpCit7CisJUnVudGltZVF1ZXJ5IFJRdWVyeSggbVRyYWNlR2VuZXJhdG9yLmdldENvbmZpZ3VyYXRpb24oKSApOworCisJVmVjdG9yPCBSdW50aW1lSUQgPiBsaWZlbGluZXM7CisJUlF1ZXJ5LmdldFN5c3RlbUxpZmVsaW5lcyhsaWZlbGluZXMpOworCisJVmVjdG9yPCBSdW50aW1lSUQgPjo6aXRlcmF0b3IgaXRMaWZlbGluZVJJRCA9IGxpZmVsaW5lcy5iZWdpbigpOworCVZlY3RvcjwgUnVudGltZUlEID46Oml0ZXJhdG9yIGVuZExpZmVsaW5lID0gbGlmZWxpbmVzLmVuZCgpOworCWZvciggOyBpdExpZmVsaW5lUklEICE9IGVuZExpZmVsaW5lIDsgKytpdExpZmVsaW5lUklEKQorCXsKKwkJVHJhY2VTZXF1ZW5jZSBsaWZlbGluZVRyYWNlKGFUcmFjZUVsZW1lbnQtPm1FQywgMCk7CisKKwkJaWYoIGFUcmFjZUVsdC50b0xpZmVsaW5lKGxpZmVsaW5lVHJhY2UsICppdExpZmVsaW5lUklEKSA+IDAgKQorCQl7CisJCQlmb3JtYXRMaWZlbGluZUlEKG9zLCAqaXRMaWZlbGluZVJJRCwgbUxpZmVsaW5lSGVhZGVyUGF0dGVybik7CisJCQlmb3JtYXRMaWZlbGluZUlEKG9zLCAqaXRMaWZlbGluZVJJRCwgbUxpZmVsaW5lQmVnaW5QYXR0ZXJuKTsKKworCQkJZm9ybWF0KG9zLCBsaWZlbGluZVRyYWNlKTsKKworCQkJZm9ybWF0TGlmZWxpbmVJRChvcywgKml0TGlmZWxpbmVSSUQsIG1MaWZlbGluZUVuZFBhdHRlcm4pOworCQl9CisJfQorfQorCisKKy8qKgorICogRVhFQ1VUSU9OIENPTlRFWFQgSEVBREVSCisgKiAlMSUgLS0+IGVjI2lkCisgKiAlMiUgLS0+IGVjI2V2YWwKKyAqICUzJSAtLT4gZWMjaGlnaHQKKyAqICU0JSAtLT4gZWMjd2lkdGgKKyAqICU1JSAtLT4gZWMjd2VpZ2h0CisgKiAlNiUgLS0+IHN0YXRlbWFjaGluZSBjb25maWd1cmF0aW9uIGkuZS4gY29udHJvbCBub2RlCisgKi8KK3N0ZDo6c3RyaW5nIEJhc2ljVHJhY2VGb3JtYXR0ZXI6OnN0ckZvcm1hdEV4ZWN1dGlvbkNvbnRleHRVZmlkKAorCQljb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQykKK3sKKwlpZiggYW5FQy5pc25vdE51bGwoKSApCisJeworCQlTdHJpbmdPdXRTdHJlYW0gb3NzOworCisJCWJvb3N0Ojpmb3JtYXQgZm9ybWF0dGVyKG1FeGVjdXRpb25Db250ZXh0VWZpZFBhdHRlcm4pOworCQlmb3JtYXR0ZXIuZXhjZXB0aW9ucyggYm9vc3Q6OmlvOjpub19lcnJvcl9iaXRzICk7CisKKwkJb3NzIDw8IGZvcm1hdHRlcgorCQkJCSUgYW5FQy5nZXRJZE51bWJlcigpCisJCQkJJSBhbkVDLmdldEV2YWxOdW1iZXIoKQorCQkJCSUgYW5FQy5nZXRIZWlnaHQoKQorCQkJCSUgYW5FQy5nZXRXaWR0aCgpCisJCQkJJSBhbkVDLmdldFdlaWdodCgpCisJCQkJJSBhbkVDLnJlZkV4ZWN1dGlvbkRhdGEoKS5zdHJTdGF0ZUNvbmYoKTsKKworCQlyZXR1cm4oIG9zcy5zdHIoKSApOworCX0KKworCXJldHVybiggImN0eDxudWxsPiIgKTsKK30KKworCit2b2lkIEJhc2ljVHJhY2VGb3JtYXR0ZXI6OmZvcm1hdFRyYWNlSUQoT3V0U3RyZWFtICYgb3MsCisJCWNvbnN0IFRyYWNlU2VxdWVuY2UgJiBhVHJhY2VFbHQsIGNvbnN0IHN0ZDo6c3RyaW5nICYgcGF0dGVybikKK3sKKwlib29zdDo6Zm9ybWF0IGZvcm1hdHRlcihwYXR0ZXJuKTsKKwlmb3JtYXR0ZXIuZXhjZXB0aW9ucyggYm9vc3Q6OmlvOjpub19lcnJvcl9iaXRzICk7CisKKwlvcyA8PCBmb3JtYXR0ZXIKKwkJCSUgYVRyYWNlRWx0LnRpZAorCQkJJSBzdHJGb3JtYXRFeGVjdXRpb25Db250ZXh0VWZpZCgKKwkJCQkJRXhlY3V0aW9uQ29udGV4dDo6UkVGKCBhVHJhY2VFbHQubUVDICkgKQorCQkJPDwgc3RkOjpmbHVzaDsKK30KKworCit2b2lkIEJhc2ljVHJhY2VGb3JtYXR0ZXI6OmZvcm1hdExpZmVsaW5lSUQoT3V0U3RyZWFtICYgb3MsCisJCWNvbnN0IFJ1bnRpbWVJRCAmIGFMaWZlbGluZSwgY29uc3Qgc3RkOjpzdHJpbmcgJiBwYXR0ZXJuKQoreworCWJvb3N0Ojpmb3JtYXQgZm9ybWF0dGVyKHBhdHRlcm4pOworCWZvcm1hdHRlci5leGNlcHRpb25zKCBib29zdDo6aW86Om5vX2Vycm9yX2JpdHMgKTsKKworCW9zIDw8IGZvcm1hdHRlcgorCQkJJSBhTGlmZWxpbmUuc3RyUGlkKCkKKwkJCSUgKGFMaWZlbGluZS5oYXNQYXJlbnQoKSA/IGFMaWZlbGluZS5nZXRQYXJlbnQoKS5nZXROYW1lSUQoKSA6ICIiKQorCQkJJSBhTGlmZWxpbmUuZ2V0TmFtZUlEKCkKKwkJCTw8IHN0ZDo6Zmx1c2g7Cit9CisKKwordm9pZCBCYXNpY1RyYWNlRm9ybWF0dGVyOjpmb3JtYXRTdHJpbmcoT3V0U3RyZWFtICYgb3MsCisJCWNvbnN0IFRyYWNlUG9pbnQgJiBhVHJhY2VQb2ludCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBwYXR0ZXJuKQoreworCWJvb3N0Ojpmb3JtYXQgZm9ybWF0dGVyKHBhdHRlcm4pOworCWZvcm1hdHRlci5leGNlcHRpb25zKCBib29zdDo6aW86Om5vX2Vycm9yX2JpdHMgKTsKKworCW9zIDw8IGZvcm1hdHRlcgorCQkJJSAoIGFUcmFjZVBvaW50LnZhbHVlLnZhbGlkKCkgPworCQkJYVRyYWNlUG9pbnQudmFsdWUuYXNfcHRyPCBTdHJpbmcgPigpLT5nZXRWYWx1ZSgpIDogIiIgKQorCQkJJSBzdHJGb3JtYXRFeGVjdXRpb25Db250ZXh0VWZpZCggYVRyYWNlUG9pbnQuRUMgKTsKK30KKworCit2b2lkIEJhc2ljVHJhY2VGb3JtYXR0ZXI6OmZvcm1hdFN0ZXAoT3V0U3RyZWFtICYgb3MsCisJCWNvbnN0IFRyYWNlUG9pbnQgJiBhVHJhY2VQb2ludCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBwYXR0ZXJuKQoreworCWJvb3N0Ojpmb3JtYXQgZm9ybWF0dGVyKHBhdHRlcm4pOworCWZvcm1hdHRlci5leGNlcHRpb25zKCBib29zdDo6aW86Om5vX2Vycm9yX2JpdHMgKTsKKworCW9zIDw8IGZvcm1hdHRlcgorCQkJJSAoIGFUcmFjZVBvaW50LnZhbHVlLnZhbGlkKCkgPyBhVHJhY2VQb2ludC52YWx1ZS5hc19wdHI8CisJCQkJCVN0cmluZyA+KCktPmdldFZhbHVlKCkgOiAiIiApCisJCQklIHN0ckZvcm1hdEV4ZWN1dGlvbkNvbnRleHRVZmlkKCBhVHJhY2VQb2ludC5FQyApOworfQorCisKK3ZvaWQgQmFzaWNUcmFjZUZvcm1hdHRlcjo6Zm9ybWF0KE91dFN0cmVhbSAmIG9zLCBjb25zdCBUcmFjZVNlcXVlbmNlICYgYVRyYWNlRWx0KQoreworCUJGTGlzdDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBhVHJhY2VFbHQucG9pbnRzLmJlZ2luKCk7CisJQkZMaXN0Ojpjb25zdF9pdGVyYXRvciBlbmRJdCA9IGFUcmFjZUVsdC5wb2ludHMuZW5kKCk7CisJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJeworCQlpZiggKCppdCkuaXM8IFRyYWNlUG9pbnQgPigpICkKKwkJeworCQkJZm9ybWF0KG9zLCAoKml0KS50b19yZWY8IFRyYWNlUG9pbnQgPigpKTsKKwkJfQorCisJCWVsc2UgaWYoICgqaXQpLmlzPCBUcmFjZVNlcXVlbmNlID4oKSApCisJCXsKKwkJCWZvcm1hdChvcywgKCppdCkudG9fcmVmPCBUcmFjZVNlcXVlbmNlID4oKSk7CisJCX0KKwl9Cit9CisKK3ZvaWQgQmFzaWNUcmFjZUZvcm1hdHRlcjo6Zm9ybWF0KE91dFN0cmVhbSAmIG9zLCBjb25zdCBUcmFjZVBvaW50ICYgYVRyYWNlUG9pbnQpCit7CisJc3dpdGNoKCBhVHJhY2VQb2ludC5uYXR1cmUgKQorCXsKKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9DT01NRU5UX05BVFVSRToKKwkJeworCQkJZm9ybWF0U3RyaW5nKG9zLCBhVHJhY2VQb2ludCwgbUNvbW1lbnRQYXR0ZXJuKTsKKworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9TRVBBUkFUT1JfTkFUVVJFOgorCQl7CisJCQlmb3JtYXRTdHJpbmcob3MsIGFUcmFjZVBvaW50LCBtU2VwYXJhdG9yUGF0dGVybik7CisKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTkVXTElORV9OQVRVUkU6CisJCXsKKwkJCWZvcm1hdFN0cmluZyhvcywgYVRyYWNlUG9pbnQsIG1OZXdsaW5lUGF0dGVybik7CisKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9TVEVQX0hFQURFUl9OQVRVUkU6CisJCXsKKwkJCWZvcm1hdFN0ZXAob3MsIGFUcmFjZVBvaW50LCBtU3RlcEhlYWRlclBhdHRlcm4pOworCisJCQlicmVhazsKKwkJfQorCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1NURVBfQkVHSU5fTkFUVVJFOgorCQl7CisJCQlmb3JtYXRTdGVwKG9zLCBhVHJhY2VQb2ludCwgbVN0ZXBCZWdpblBhdHRlcm4pOworCisJCQlicmVhazsKKwkJfQorCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1NURVBfRU5EX05BVFVSRToKKwkJeworCQkJZm9ybWF0U3RlcChvcywgYVRyYWNlUG9pbnQsIG1TdGVwRW5kUGF0dGVybik7CisKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9JTklUX0hFQURFUl9OQVRVUkU6CisJCXsKKwkJCWZvcm1hdFN0ZXAob3MsIGFUcmFjZVBvaW50LCBtSW5pdGlhbGl6YXRpb25IZWFkZXJQYXR0ZXJuKTsKKworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9JTklUX0JFR0lOX05BVFVSRToKKwkJeworCQkJZm9ybWF0U3RlcChvcywgYVRyYWNlUG9pbnQsIG1Jbml0aWFsaXphdGlvbkJlZ2luUGF0dGVybik7CisKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfSU5JVF9FTkRfTkFUVVJFOgorCQl7CisJCQlmb3JtYXRTdGVwKG9zLCBhVHJhY2VQb2ludCwgbUluaXRpYWxpemF0aW9uRW5kUGF0dGVybik7CisKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9QQVRIX0NPTkRJVElPTl9OQVRVUkU6CisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfUEFUSF9DT05ESVRJT05fTkFUVVJFX0xFQUY6CisJCXsKKwkJCWRvdEZvcm1hdENvbmRpdGlvbihvcywgbVBhdGhDb25kaXRpb25QYXR0ZXJuLAorCQkJCQlhVHJhY2VQb2ludC52YWx1ZSk7CisKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9QQVRIX1RJTUVEX0NPTkRJVElPTl9OQVRVUkU6CisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfUEFUSF9USU1FRF9DT05ESVRJT05fTkFUVVJFX0xFQUY6CisJCXsKKwkJCWRvdEZvcm1hdENvbmRpdGlvbihvcywgbVBhdGhUaW1lZENvbmRpdGlvblBhdHRlcm4sCisJCQkJCWFUcmFjZVBvaW50LnZhbHVlKTsKKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX05PREVfQ09ORElUSU9OX05BVFVSRToKKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9OT0RFX0NPTkRJVElPTl9OQVRVUkVfTEVBRjoKKwkJeworCQkJZG90Rm9ybWF0Q29uZGl0aW9uKG9zLCBtTm9kZUNvbmRpdGlvblBhdHRlcm4sCisJCQkJCWFUcmFjZVBvaW50LnZhbHVlKTsKKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX05PREVfVElNRURfQ09ORElUSU9OX05BVFVSRToKKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9OT0RFX1RJTUVEX0NPTkRJVElPTl9OQVRVUkVfTEVBRjoKKwkJeworCQkJZG90Rm9ybWF0Q29uZGl0aW9uKG9zLCBtTm9kZVRpbWVkQ29uZGl0aW9uUGF0dGVybiwKKwkJCQkJYVRyYWNlUG9pbnQudmFsdWUpOworCisJCQlicmVhazsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCXN3aXRjaCggYVRyYWNlUG9pbnQub3AgKQorCQkJeworCQkJCWNhc2UgQVZNX09QQ09ERV9USU1FRF9HVUFSRDoKKwkJCQl7CisJCQkJCWZvcm1hdChvcywgYVRyYWNlUG9pbnQsIG1UaW1lUGF0dGVybik7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWNhc2UgQVZNX09QQ09ERV9BU1NJR046CisJCQkJeworCQkJCQl3cmFwX2Zvcm1hdChvcywgYVRyYWNlUG9pbnQsIG1Bc3NpZ25QYXR0ZXJuKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJY2FzZSBBVk1fT1BDT0RFX0FTU0lHTl9ORVdGUkVTSDoKKwkJCQl7CisJCQkJCWZvcm1hdChvcywgYVRyYWNlUG9pbnQsIG1OZXdmcmVzaFBhdHRlcm4pOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQljYXNlIEFWTV9PUENPREVfSU5QVVQ6CisJCQkJeworCQkJCQlmb3JtYXRJTyhvcywgYVRyYWNlUG9pbnQsIG1JbnB1dFBhdHRlcm4pOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUX0ZST006CisJCQkJeworCQkJCQlmb3JtYXRJTyhvcywgYVRyYWNlUG9pbnQsIG1JbnB1dFBhdHRlcm4pOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUX0VOVjoKKwkJCQl7CisJCQkJCWZvcm1hdElPKG9zLCBhVHJhY2VQb2ludCwgbUlucHV0RW52UGF0dGVybik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljYXNlIEFWTV9PUENPREVfSU5QVVRfUkRWOgorCQkJCXsKKwkJCQkJZm9ybWF0SU8ob3MsIGFUcmFjZVBvaW50LCBtSW5wdXRSZHZQYXR0ZXJuKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJY2FzZSBBVk1fT1BDT0RFX09VVFBVVDoKKwkJCQl7CisJCQkJCWZvcm1hdElPKG9zLCBhVHJhY2VQb2ludCwgbU91dHB1dFBhdHRlcm4pOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2FzZSBBVk1fT1BDT0RFX09VVFBVVF9UTzoKKwkJCQl7CisJCQkJCWZvcm1hdElPKG9zLCBhVHJhY2VQb2ludCwgbU91dHB1dFBhdHRlcm4pOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2FzZSBBVk1fT1BDT0RFX09VVFBVVF9FTlY6CisJCQkJeworCQkJCQlmb3JtYXRJTyhvcywgYVRyYWNlUG9pbnQsIG1PdXRwdXRFbnZQYXR0ZXJuKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWNhc2UgQVZNX09QQ09ERV9PVVRQVVRfUkRWOgorCQkJCXsKKwkJCQkJZm9ybWF0SU8ob3MsIGFUcmFjZVBvaW50LCBtT3V0cHV0UmR2UGF0dGVybik7CisJCQkJCWJyZWFrOworCQkJCX0KKworCisJCQkJY2FzZSBBVk1fT1BDT0RFX1JVTjoKKwkJCQl7CisJCQkJCWZvcm1hdChvcywgYVRyYWNlUG9pbnQsIG1NYWNoaW5lUGF0dGVybik7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWNhc2UgQVZNX09QQ09ERV9JTlZPS0VfVFJBTlNJVElPTjoKKwkJCQl7CisJCQkJCWZvcm1hdChvcywgYVRyYWNlUG9pbnQsIG1UcmFuc2l0aW9uUGF0dGVybik7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWNhc2UgQVZNX09QQ09ERV9JTlZPS0VfUk9VVElORToKKwkJCQl7CisJCQkJCWZvcm1hdChvcywgYVRyYWNlUG9pbnQsIG1Sb3V0aW5lUGF0dGVybik7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlzd2l0Y2goIGFUcmFjZVBvaW50Lm5hdHVyZSApCisJCQkJCXsKKwkJCQkJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTUFDSElORV9OQVRVUkU6CisJCQkJCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1NUQVRFTUFDSElORV9OQVRVUkU6CisJCQkJCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1NUQVRFX05BVFVSRToKKwkJCQkJCXsKKwkJCQkJCQlmb3JtYXQob3MsIGFUcmFjZVBvaW50LCBtTWFjaGluZVBhdHRlcm4pOworCisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1RSQU5TSVRJT05fTkFUVVJFOgorCQkJCQkJeworCQkJCQkJCWZvcm1hdChvcywgYVRyYWNlUG9pbnQsIG1UcmFuc2l0aW9uUGF0dGVybik7CisKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfUk9VVElORV9OQVRVUkU6CisJCQkJCQl7CisJCQkJCQkJZm9ybWF0KG9zLCBhVHJhY2VQb2ludCwgbVJvdXRpbmVQYXR0ZXJuKTsKKworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCisJCQkJCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1JVTk5BQkxFX05BVFVSRToKKwkJCQkJCXsKKwkJCQkJCQlmb3JtYXQob3MsIGFUcmFjZVBvaW50LCBtUnVubmFibGVQYXR0ZXJuKTsKKworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCisJCQkJCQlkZWZhdWx0OgorCQkJCQkJeworCQkJCQkJCWFUcmFjZVBvaW50LnRvU3RyZWFtKG9zKTsKKworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKwordm9pZCBCYXNpY1RyYWNlRm9ybWF0dGVyOjpmb3JtYXQoT3V0U3RyZWFtICYgb3MsCisJCWNvbnN0IFRyYWNlUG9pbnQgJiBhVHJhY2VQb2ludCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBwYXR0ZXJuKQoreworCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9QT0lOVEVSX0VYSVQoIGFUcmFjZVBvaW50Lm1hY2hpbmUgKQorCQkJPDwgIlRyYWNlUG9pbnQ6Om1hY2hpbmUgISEhIgorCQkJPDwgU0VORF9FWElUOworCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9QT0lOVEVSX0VYSVQoIGFUcmFjZVBvaW50Lm9iamVjdCApCisJCQk8PCAiVHJhY2VQb2ludDo6b2JqZWN0ICEhISIKKwkJCTw8IFNFTkRfRVhJVDsKKworCWJvb3N0Ojpmb3JtYXQgZm9ybWF0dGVyKHBhdHRlcm4pOworCWZvcm1hdHRlci5leGNlcHRpb25zKCBib29zdDo6aW86Om5vX2Vycm9yX2JpdHMgKTsKKy8vCWZvcm1hdHRlci5leGNlcHRpb25zKCBib29zdDo6aW86OmFsbF9lcnJvcl9iaXRzIF4KKy8vCQkJKCBib29zdDo6aW86OnRvb19tYW55X2FyZ3NfYml0IHwgYm9vc3Q6OmlvOjp0b29fZmV3X2FyZ3NfYml0ICkgKTsKKworCW9zc1ZhbHVlLnN0cigiIik7CisJb3NzVmFsdWUuc2V0U3ltYmV4VmFsdWVDU1MobU11bHRpVmFsdWVBcnJheUNTUywKKwkJCW1NdWx0aVZhbHVlUGFyYW1zQ1NTLCBtTXVsdGlWYWx1ZVN0cnVjdENTUyk7CisKKwlhVHJhY2VQb2ludC5mb3JtYXRWYWx1ZVN0cmVhbSggb3NzVmFsdWUgKTsKKworCW9zIDw8IGZvcm1hdHRlcgorCQkJJSAoYVRyYWNlUG9pbnQuUklELnZhbGlkKCkgPyBhVHJhY2VQb2ludC5SSUQuc3RyUGlkKCkgOiAiPHBpZCM/PiIpCisJCQklIGFUcmFjZVBvaW50Lm1hY2hpbmUtPmdldE5hbWVJRCgpCisJCQklIGFUcmFjZVBvaW50Lm9iamVjdC0+Z2V0TmFtZUlEKCkKKwkJCSUgb3NzVmFsdWUuc3RyKCk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMl9BTkQoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQUNFICwKKwkJYVRyYWNlUG9pbnQuRUMuaXNub3ROdWxsKCkgKQorCisJb3MgPDwgIiA9PT4gIiA8PCBBVk1fU1BDX0lOREVOVDsKKwlhVHJhY2VQb2ludC5FQy50cmFjZU1pbmltdW0ob3MpOworCW9zIDw8IEVORF9JTkRFTlQ7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzJfQU5EKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFDRSApCisKKwlvcyA8PCBzdGQ6OmZsdXNoOworfQorCisKKy8qKgorICogSU5QVVQgLyBPVVRQVVQKKyAqICUxJSAtLT4gbWFjaGluZSBydW50aW1lIHBpZAorICogJTIlIC0tPiBtYWNoaW5lIGNvbnRhaW5lciBpZGVudGlmaWVyCisgKiAlMyUgLS0+ICggcG9ydCB8IHNpZ25hbCApIGlkZW50aWZpZXIKKyAqICU0JSAtLT4gdmFsdWUKKyAqICU1JSAtLT4gbWFjaGluZSBzZW5kZXIgICBpZGVudGlmaWVyIG5hbWUKKyAqICU2JSAtLT4gbWFjaGluZSByZWNlaXZlciBpZGVudGlmaWVyIG5hbWUKKyAqLworc3RhdGljIHN0ZDo6c3RyaW5nIGZvcm1hdExpZmVsaW5lSWQoCisJCWNvbnN0IFJ1bnRpbWVJRCAmIGFMaWZlbGluZSwgY29uc3Qgc3RkOjpzdHJpbmcgJiBwYXR0ZXJuKQoreworCWlmKCBhTGlmZWxpbmUudmFsaWQoKSApCisJeworCQlTdHJpbmdPdXRTdHJlYW0gb3NzOworCisJCWJvb3N0Ojpmb3JtYXQgZm9ybWF0dGVyKHBhdHRlcm4pOworCQlmb3JtYXR0ZXIuZXhjZXB0aW9ucyggYm9vc3Q6OmlvOjpub19lcnJvcl9iaXRzICk7CisKKwkJb3NzIDw8IGZvcm1hdHRlcgorCQkJCSUgYUxpZmVsaW5lLnN0clBpZCgpCisJCQkJJSAoYUxpZmVsaW5lLmhhc1BhcmVudCgpID8KKwkJCQkJCWFMaWZlbGluZS5nZXRQYXJlbnQoKS5nZXROYW1lSUQoKSA6ICIiKQorCQkJCSUgYUxpZmVsaW5lLmdldE5hbWVJRCgpCisJCQkJPDwgc3RkOjpmbHVzaDsKKworCQlyZXR1cm4oIG9zcy5zdHIoKSApOworCX0KKwllbHNlCisJeworCQlyZXR1cm4oIFJ1bnRpbWVMaWI6OlJJRF9FTlZJUk9OTUVOVC5nZXROYW1lSUQoKSApOworCX0KK30KKwordm9pZCBCYXNpY1RyYWNlRm9ybWF0dGVyOjpmb3JtYXRJTyhPdXRTdHJlYW0gJiBvcywKKwkJY29uc3QgVHJhY2VQb2ludCAmIGFUcmFjZVBvaW50LCBjb25zdCBzdGQ6OnN0cmluZyAmIHBhdHRlcm4pCit7CisJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggYVRyYWNlUG9pbnQubWFjaGluZSApCisJCQk8PCAiVHJhY2VQb2ludDo6bWFjaGluZSAhISEiCisJCQk8PCBTRU5EX0VYSVQ7CisJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggYVRyYWNlUG9pbnQub2JqZWN0ICkKKwkJCTw8ICJUcmFjZVBvaW50OjpvYmplY3QgISEhIgorCQkJPDwgU0VORF9FWElUOworCisJYm9vc3Q6OmZvcm1hdCBmb3JtYXR0ZXIocGF0dGVybik7CisJZm9ybWF0dGVyLmV4Y2VwdGlvbnMoIGJvb3N0Ojppbzo6bm9fZXJyb3JfYml0cyApOworLy8JZm9ybWF0dGVyLmV4Y2VwdGlvbnMoIGJvb3N0Ojppbzo6YWxsX2Vycm9yX2JpdHMgXgorLy8JCQkoIGJvb3N0Ojppbzo6dG9vX21hbnlfYXJnc19iaXQgfCBib29zdDo6aW86OnRvb19mZXdfYXJnc19iaXQgKSApOworCisJb3NzVmFsdWUuc3RyKCIiKTsKKwlvc3NWYWx1ZS5zZXRTeW1iZXhWYWx1ZUNTUyhtTXVsdGlWYWx1ZUFycmF5Q1NTLAorCQkJbU11bHRpVmFsdWVQYXJhbXNDU1MsIG1NdWx0aVZhbHVlU3RydWN0Q1NTKTsKKworCWFUcmFjZVBvaW50LmZvcm1hdFZhbHVlU3RyZWFtKCBvc3NWYWx1ZSApOworCisJc3RkOjpzdHJpbmcgc2VuZGVyOworCXN0ZDo6c3RyaW5nIHJlY2VpdmVyOworCWlmKCAoYVRyYWNlUG9pbnQuY29uZmlnICE9IE5VTEwpCisJCSYmIGFUcmFjZVBvaW50LmNvbmZpZy0+aGFzSU9NZXNzYWdlKCkgKQorCXsKKwkJY29uc3QgTWVzc2FnZSBpb01lc3NhZ2UgPSBhVHJhY2VQb2ludC5jb25maWctPmdldElPTWVzc2FnZSgpOworCQlpZiggaW9NZXNzYWdlLmhhc1NlbmRlclJJRCgpICkKKwkJeworCQkJc2VuZGVyID0gZm9ybWF0TGlmZWxpbmVJZCgKKwkJCQkJaW9NZXNzYWdlLmdldFNlbmRlclJJRCgpLmdldExpZmVsaW5lKCksCisJCQkJCW1MaWZlbGluZUlkUGF0dGVybik7CisJCX0KKwkJaWYoIGlvTWVzc2FnZS5oYXNSZWNlaXZlclJJRCgpICkKKwkJeworCQkJcmVjZWl2ZXIgPSBmb3JtYXRMaWZlbGluZUlkKAorCQkJCQlpb01lc3NhZ2UuZ2V0UmVjZWl2ZXJSSUQoKS5nZXRMaWZlbGluZSgpLAorCQkJCQltTGlmZWxpbmVJZFBhdHRlcm4pOworCQl9CisJfQorCisJb3MgPDwgZm9ybWF0dGVyCisJCQklIChhVHJhY2VQb2ludC5SSUQudmFsaWQoKSA/IGFUcmFjZVBvaW50LlJJRC5zdHJQaWQoKSA6ICI8cGlkIz8+IikKKwkJCSUgYVRyYWNlUG9pbnQubWFjaGluZS0+Z2V0TmFtZUlEKCkKKwkJCSUgYVRyYWNlUG9pbnQub2JqZWN0LT5nZXROYW1lSUQoKQorCQkJJSBvc3NWYWx1ZS5zdHIoKQorCQkJJSBzZW5kZXIKKwkJCSUgcmVjZWl2ZXI7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMl9BTkQoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQUNFICwKKwkJYVRyYWNlUG9pbnQuRUMuaXNub3ROdWxsKCkgKQorCisJb3MgPDwgIiA9PT4gIiA8PCBBVk1fU1BDX0lOREVOVDsKKwlhVHJhY2VQb2ludC5FQy50cmFjZU1pbmltdW0ob3MpOworCW9zIDw8IEVORF9JTkRFTlQ7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzJfQU5EKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFDRSApCisKKwlvcyA8PCBzdGQ6OmZsdXNoOworfQorCisKK3ZvaWQgQmFzaWNUcmFjZUZvcm1hdHRlcjo6d3JhcF9mb3JtYXQoT3V0U3RyZWFtICYgb3MsCisJCWNvbnN0IFRyYWNlUG9pbnQgJiBhVHJhY2VQb2ludCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBwYXR0ZXJuKQoreworCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9QT0lOVEVSX0VYSVQoIGFUcmFjZVBvaW50Lm1hY2hpbmUgKQorCQkJPDwgIlRyYWNlUG9pbnQ6Om1hY2hpbmUgISEhIgorCQkJPDwgU0VORF9FWElUOworCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9QT0lOVEVSX0VYSVQoIGFUcmFjZVBvaW50Lm9iamVjdCApCisJCQk8PCAiVHJhY2VQb2ludDo6b2JqZWN0ICEhISIKKwkJCTw8IFNFTkRfRVhJVDsKKworCU9TUyBvc3MoIEFWTV9TVFJfSU5ERU5UICk7CisJYVRyYWNlUG9pbnQuZm9ybWF0VmFsdWVTdHJlYW0oIG9zcyA8PCBJR05PUkVfRklSU1RfVEFCICk7CisKKwlib29zdDo6Zm9ybWF0IGZvcm1hdHRlcihwYXR0ZXJuKTsKKwlmb3JtYXR0ZXIuZXhjZXB0aW9ucyggYm9vc3Q6OmlvOjpub19lcnJvcl9iaXRzICk7CisKKwlvcyA8PCBtV3JhcERhdGEgPDwgZm9ybWF0dGVyCisJCQklIChhVHJhY2VQb2ludC5SSUQudmFsaWQoKSA/IGFUcmFjZVBvaW50LlJJRC5zdHJQaWQoKSA6ICI8cGlkIz8+IikKKwkJCSUgYVRyYWNlUG9pbnQubWFjaGluZS0+Z2V0TmFtZUlEKCkKKwkJCSUgYVRyYWNlUG9pbnQub2JqZWN0LT5nZXROYW1lSUQoKQorCQkJJSBvc3Muc3RyKCk7CisKKwlvcyA8PCBFTkRfV1JBUDsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyX0FORCggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBQ0UgLAorCQlhVHJhY2VQb2ludC5FQy5pc25vdE51bGwoKSApCisKKwlvcyA8PCAiID09PiAiIDw8IEFWTV9TUENfSU5ERU5UOworCWFUcmFjZVBvaW50LkVDLnRyYWNlTWluaW11bShvcyk7CisJb3MgPDwgRU5EX0lOREVOVDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMl9BTkQoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQUNFICkKKworCW9zIDw8IHN0ZDo6Zmx1c2g7Cit9CisKKworLyoqCisgKiBEQVRBCisgKiBbIFRpbWVkIF0gUGF0aCBDb25kaXRpb24KKyAqIEFzc2lnbm1lbnQ6IHZhciA9IHZhbHVlCisgKi8KK3ZvaWQgQmFzaWNUcmFjZUZvcm1hdHRlcjo6ZG90Rm9ybWF0Q29uZGl0aW9uKE91dFN0cmVhbSAmIG9zLAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGZvcm1hdFBhdHRlcm4sIGNvbnN0IEJGICYgYUNvZGUpCit7CisJYm9vc3Q6OmZvcm1hdCBmb3JtYXR0ZXIoZm9ybWF0UGF0dGVybik7CisJZm9ybWF0dGVyLmV4Y2VwdGlvbnMoIGJvb3N0Ojppbzo6bm9fZXJyb3JfYml0cyApOworCisJb3MgPDwgbVdyYXBEYXRhIDw8IGZvcm1hdHRlciAlIGFDb2RlLnN0cigpOworCisJb3MgPDwgRU5EX1dSQVA7Cit9CisKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS90cmFjZS9CYXNpY1RyYWNlRm9ybWF0dGVyLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vdHJhY2UvQmFzaWNUcmFjZUZvcm1hdHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YzU2ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vdHJhY2UvQmFzaWNUcmFjZUZvcm1hdHRlci5oCkBAIC0wLDAgKzEsMjYxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTEgZMOpYy4gMjAxMworICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEJBU0lDVFJBQ0VGT1JNQVRURVJfSF8KKyNkZWZpbmUgQkFTSUNUUkFDRUZPUk1BVFRFUl9IXworCisjaW5jbHVkZSAiQWJzdHJhY3RUcmFjZUZvcm1hdHRlci5oIgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjbGFzcyBBdm1UcmFjZUdlbmVyYXRvcjsKK2NsYXNzIEJGOworY2xhc3MgRXhlY3V0aW9uQ29udGV4dDsKK2NsYXNzIFJ1bnRpbWVJRDsKK2NsYXNzIFRyYWNlTWFuYWdlcjsKK2NsYXNzIFRyYWNlUG9pbnQ7CitjbGFzcyBUcmFjZVNlcXVlbmNlOworY2xhc3MgV09iamVjdDsKKworCitjbGFzcyBCYXNpY1RyYWNlRm9ybWF0dGVyICA6ICBwdWJsaWMgQWJzdHJhY3RUcmFjZUZvcm1hdHRlcgoreworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQ09OU1RBTlRTCisJICovCisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgREVGQVVMVF9BU1NJR05fUEFUVEVSTjsKKworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIERFRkFVTFRfTkVXRlJFU0hfUEFUVEVSTjsKKworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIERFRkFVTFRfSU5QVVRfUEFUVEVSTjsKKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBERUZBVUxUX09VVFBVVF9QQVRURVJOOworCisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgREVGQVVMVF9JTlBVVF9FTlZfUEFUVEVSTjsKKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBERUZBVUxUX09VVFBVVF9FTlZfUEFUVEVSTjsKKworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIERFRkFVTFRfSU5QVVRfUkRWX1BBVFRFUk47CisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgREVGQVVMVF9PVVRQVVRfUkRWX1BBVFRFUk47CisKKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBERUZBVUxUX01BQ0hJTkVfUEFUVEVSTjsKKworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIERFRkFVTFRfVFJBTlNJVElPTl9QQVRURVJOOworCisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgREVGQVVMVF9ST1VUSU5FX1BBVFRFUk47CisKKworCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlzdGQ6OnN0cmluZyBtRmlsZUhlYWRlclBhdHRlcm47CisJc3RkOjpzdHJpbmcgbUZpbGVCZWdpblBhdHRlcm47CisJc3RkOjpzdHJpbmcgbUZpbGVFbmRQYXR0ZXJuOworCisJc3RkOjpzdHJpbmcgbUV4ZWN1dGlvbkNvbnRleHRVZmlkUGF0dGVybjsKKworCXN0ZDo6c3RyaW5nIG1UZXN0Y2FzZUhlYWRlclBhdHRlcm47CisJc3RkOjpzdHJpbmcgbVRlc3RjYXNlQmVnaW5QYXR0ZXJuOworCXN0ZDo6c3RyaW5nIG1UZXN0Y2FzZUVuZFBhdHRlcm47CisKKwlzdGQ6OnN0cmluZyBtTGlmZWxpbmVIZWFkZXJQYXR0ZXJuOworCXN0ZDo6c3RyaW5nIG1MaWZlbGluZUJlZ2luUGF0dGVybjsKKwlzdGQ6OnN0cmluZyBtTGlmZWxpbmVFbmRQYXR0ZXJuOworCisJc3RkOjpzdHJpbmcgbUxpZmVsaW5lSWRQYXR0ZXJuOworCisJc3RkOjpzdHJpbmcgbUluaXRpYWxpemF0aW9uSGVhZGVyUGF0dGVybjsKKwlzdGQ6OnN0cmluZyBtSW5pdGlhbGl6YXRpb25CZWdpblBhdHRlcm47CisJc3RkOjpzdHJpbmcgbUluaXRpYWxpemF0aW9uRW5kUGF0dGVybjsKKworCXN0ZDo6c3RyaW5nIG1TdGVwSGVhZGVyUGF0dGVybjsKKwlzdGQ6OnN0cmluZyBtU3RlcEJlZ2luUGF0dGVybjsKKwlzdGQ6OnN0cmluZyBtU3RlcEVuZFBhdHRlcm47CisKKwlzdGQ6OnN0cmluZyBtQ29tbWVudFBhdHRlcm47CisJc3RkOjpzdHJpbmcgbVNlcGFyYXRvclBhdHRlcm47CisJc3RkOjpzdHJpbmcgbU5ld2xpbmVQYXR0ZXJuOworCisJc3RkOjpzdHJpbmcgbVBhdGhDb25kaXRpb25QYXR0ZXJuOworCXN0ZDo6c3RyaW5nIG1QYXRoVGltZWRDb25kaXRpb25QYXR0ZXJuOworCisJc3RkOjpzdHJpbmcgbU5vZGVDb25kaXRpb25QYXR0ZXJuOworCXN0ZDo6c3RyaW5nIG1Ob2RlVGltZWRDb25kaXRpb25QYXR0ZXJuOworCisJc3RkOjpzdHJpbmcgbVRpbWVQYXR0ZXJuOworCisJc3RkOjpzdHJpbmcgbUFzc2lnblBhdHRlcm47CisKKwlzdGQ6OnN0cmluZyBtTmV3ZnJlc2hQYXR0ZXJuOworCisJc3RkOjpzdHJpbmcgbUlucHV0UGF0dGVybjsKKwlzdGQ6OnN0cmluZyBtT3V0cHV0UGF0dGVybjsKKworCXN0ZDo6c3RyaW5nIG1JbnB1dEVudlBhdHRlcm47CisJc3RkOjpzdHJpbmcgbU91dHB1dEVudlBhdHRlcm47CisKKwlzdGQ6OnN0cmluZyBtSW5wdXRSZHZQYXR0ZXJuOworCXN0ZDo6c3RyaW5nIG1PdXRwdXRSZHZQYXR0ZXJuOworCisJc3RkOjpzdHJpbmcgbU1hY2hpbmVQYXR0ZXJuOworCXN0ZDo6c3RyaW5nIG1UcmFuc2l0aW9uUGF0dGVybjsKKwlzdGQ6OnN0cmluZyBtUm91dGluZVBhdHRlcm47CisKKwlzdGQ6OnN0cmluZyBtUnVubmFibGVQYXR0ZXJuOworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIENvbXB1dGluZyBWYXJpYWJsZXMKKwlUcmFjZVNlcXVlbmNlICogYVRyYWNlRWxlbWVudDsKKwlTdHJpbmdPdXRTdHJlYW0gb3NzVmFsdWU7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUJhc2ljVHJhY2VGb3JtYXR0ZXIoQXZtVHJhY2VHZW5lcmF0b3IgJiBhVHJhY2VHZW5lcmF0b3IpCisJOiBBYnN0cmFjdFRyYWNlRm9ybWF0dGVyKCBhVHJhY2VHZW5lcmF0b3IgKSwKKwltRmlsZUhlYWRlclBhdHRlcm4oICIiICksCisJbUZpbGVCZWdpblBhdHRlcm4oICIiICksCisJbUZpbGVFbmRQYXR0ZXJuKCAiIiApLAorCisJbUV4ZWN1dGlvbkNvbnRleHRVZmlkUGF0dGVybiggImN0eDwgJTElID4gJTYlIiApLAorCisJbVRlc3RjYXNlSGVhZGVyUGF0dGVybiggIlRSQUNFIE5VTUJFUiAlMSVcbiIgKSwKKwltVGVzdGNhc2VCZWdpblBhdHRlcm4oICIiICksCisJbVRlc3RjYXNlRW5kUGF0dGVybiggIlxuIiApLAorCisJbUxpZmVsaW5lSGVhZGVyUGF0dGVybiggIkxJRkVMSU5FICUzJSB7XG4iICksCisJbUxpZmVsaW5lQmVnaW5QYXR0ZXJuKCAiIiApLAorCW1MaWZlbGluZUVuZFBhdHRlcm4oICJ9IC8vIGVuZCBsaWZlbGluZSAlMyVcbiIgKSwKKworCW1MaWZlbGluZUlkUGF0dGVybiggIiUzJSIgKSwKKworCW1Jbml0aWFsaXphdGlvbkhlYWRlclBhdHRlcm4oICJcdC8vIEluaXRpYWxpemF0aW9uIHBhcmFtZXRlciB2YWx1ZXM6XG4iICksCisJbUluaXRpYWxpemF0aW9uQmVnaW5QYXR0ZXJuKCAiIiApLAorCW1Jbml0aWFsaXphdGlvbkVuZFBhdHRlcm4oICJcbiIgKSwKKworCW1TdGVwSGVhZGVyUGF0dGVybiggIiNzdGVwI2hlYWRlciAlMSVcbiIgKSwKKwltU3RlcEJlZ2luUGF0dGVybiAoICIjc3RlcCNiZWdpbiAlMSVcbiIgICksCisJbVN0ZXBFbmRQYXR0ZXJuICAgKCAiI3N0ZXAjZW5kICUxJVxuIiAgICApLAorCisJbUNvbW1lbnRQYXR0ZXJuICAoICIvLyAlMSVcbiIgKSwKKwltU2VwYXJhdG9yUGF0dGVybiggIiUxJSIgICApLAorCW1OZXdsaW5lUGF0dGVybiAgKCAiXG4lMSUiICksCisKKwltUGF0aENvbmRpdGlvblBhdHRlcm4oIC8qIlBDOiAlMSUiKi8gKSwKKwltUGF0aFRpbWVkQ29uZGl0aW9uUGF0dGVybiggLyoiUHRDOiAlMSUiKi8gKSwKKworCW1Ob2RlQ29uZGl0aW9uUGF0dGVybiggLyoiTkM6ICUxJSIqLyApLAorCW1Ob2RlVGltZWRDb25kaXRpb25QYXR0ZXJuKCAvKiJOdEM6ICUxJSIqLyApLAorCisJbVRpbWVQYXR0ZXJuKCAiXHQlMyVcbiIgKSwKKworCW1Bc3NpZ25QYXR0ZXJuKCBERUZBVUxUX0FTU0lHTl9QQVRURVJOICksCisKKwltTmV3ZnJlc2hQYXR0ZXJuKCBERUZBVUxUX05FV0ZSRVNIX1BBVFRFUk4gKSwKKworCW1JbnB1dFBhdHRlcm4gKCBERUZBVUxUX0lOUFVUX1BBVFRFUk4gICksCisJbU91dHB1dFBhdHRlcm4oIERFRkFVTFRfT1VUUFVUX1BBVFRFUk4gKSwKKworCW1JbnB1dEVudlBhdHRlcm4gKCBERUZBVUxUX0lOUFVUX0VOVl9QQVRURVJOICApLAorCW1PdXRwdXRFbnZQYXR0ZXJuKCBERUZBVUxUX09VVFBVVF9FTlZfUEFUVEVSTiApLAorCisJbUlucHV0UmR2UGF0dGVybiAoIERFRkFVTFRfSU5QVVRfUkRWX1BBVFRFUk4gICksCisJbU91dHB1dFJkdlBhdHRlcm4oIERFRkFVTFRfT1VUUFVUX1JEVl9QQVRURVJOICksCisKKwltTWFjaGluZVBhdHRlcm4gICAoICJcdHJ1biAgJTElXG4iICksCisJbVRyYW5zaXRpb25QYXR0ZXJuKCAiXHRmaXJlICUxJS0+JTIlXG4iICksCisJbVJvdXRpbmVQYXR0ZXJuICAgKCAiXHRldmFsICUxJS0+JTIlXG4iICksCisKKwltUnVubmFibGVQYXR0ZXJuICAgKCAiXHRydW4gJTElLT4lMiVcbiIgKSwKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBDb21wdXRpbmcgVmFyaWFibGVzCisJYVRyYWNlRWxlbWVudCggTlVMTCApLAorCW9zc1ZhbHVlKCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+QmFzaWNUcmFjZUZvcm1hdHRlcigpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBDT05GSUdVUkUgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJYm9vbCBjb25maWd1cmUoV09iamVjdCAqIEZPUk1BVCwgc3RkOjpzdHJpbmcgJiBmb3JtYXRQYXR0ZXJuLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBpZCwgYm9vbCBpc1JlZ2V4ID0gZmFsc2UpOworCisJYm9vbCBjb25maWd1cmVJbXBsKFdPYmplY3QgKiB3ZlBhcmFtZXRlck9iamVjdCk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBGT1JNQVQgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJdm9pZCBmb3JtYXQoVHJhY2VNYW5hZ2VyICYgYVRyYWNlTWFuYWdlcik7CisKKwl2b2lkIGZvcm1hdChPdXRTdHJlYW0gJiBvcywgVHJhY2VNYW5hZ2VyICYgYVRyYWNlTWFuYWdlcik7CisKKwl2b2lkIGZvcm1hdExpZmVsaW5lcyhPdXRTdHJlYW0gJiBvcywgY29uc3QgVHJhY2VTZXF1ZW5jZSAmIGFUcmFjZUVsdCk7CisKKwlzdGQ6OnN0cmluZyBzdHJGb3JtYXRFeGVjdXRpb25Db250ZXh0VWZpZChjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQyk7CisKKwl2b2lkIGZvcm1hdFRyYWNlSUQoT3V0U3RyZWFtICYgb3MsIGNvbnN0IFRyYWNlU2VxdWVuY2UgJiBhVHJhY2VFbHQsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIHBhdHRlcm4pOworCisJdm9pZCBmb3JtYXRMaWZlbGluZUlEKE91dFN0cmVhbSAmIG9zLCBjb25zdCBSdW50aW1lSUQgJiBhTGlmZWxpbmUsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIHBhdHRlcm4pOworCisJdm9pZCBmb3JtYXRTdHJpbmcoT3V0U3RyZWFtICYgb3MsIGNvbnN0IFRyYWNlUG9pbnQgJiBhVHJhY2VQb2ludCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgcGF0dGVybik7CisKKwl2b2lkIGZvcm1hdFN0ZXAoT3V0U3RyZWFtICYgb3MsIGNvbnN0IFRyYWNlUG9pbnQgJiBhVHJhY2VQb2ludCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgcGF0dGVybik7CisKKwl2b2lkIGZvcm1hdChPdXRTdHJlYW0gJiBvcywgY29uc3QgVHJhY2VTZXF1ZW5jZSAmIGFUcmFjZUVsdCk7CisKKwl2b2lkIGZvcm1hdChPdXRTdHJlYW0gJiBvcywgY29uc3QgVHJhY2VQb2ludCAmIGFUcmFjZVBvaW50KTsKKworCXZvaWQgZm9ybWF0KE91dFN0cmVhbSAmIG9zLCBjb25zdCBUcmFjZVBvaW50ICYgYVRyYWNlUG9pbnQsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIHBhdHRlcm4pOworCisJdm9pZCBmb3JtYXRJTyhPdXRTdHJlYW0gJiBvcywgY29uc3QgVHJhY2VQb2ludCAmIGFUcmFjZVBvaW50LAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBwYXR0ZXJuKTsKKworCXZvaWQgd3JhcF9mb3JtYXQoT3V0U3RyZWFtICYgb3MsIGNvbnN0IFRyYWNlUG9pbnQgJiBhVHJhY2VQb2ludCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgcGF0dGVybik7CisKKwl2b2lkIGRvdEZvcm1hdENvbmRpdGlvbihPdXRTdHJlYW0gJiBvcywKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgZm9ybWF0UGF0dGVybiwgY29uc3QgQkYgJiBhQ29kZSk7CisKK307CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKiBCQVNJQ1RSQUNFRk9STUFUVEVSX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vdHJhY2UvVFRDTlRpdGFuVHJhY2VGb3JtYXR0ZXIuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3RyYWNlL1RUQ05UaXRhblRyYWNlRm9ybWF0dGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTgwOWIyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3RyYWNlL1RUQ05UaXRhblRyYWNlRm9ybWF0dGVyLmNwcApAQCAtMCwwICsxLDEzNDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiA2IGphbnYuIDIwMTQKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlRUQ05UaXRhblRyYWNlRm9ybWF0dGVyLmgiCisKKyNpbmNsdWRlICJUcmFjZU1hbmFnZXIuaCIKKworI2luY2x1ZGUgPGNvbW1vbi9TZXJpYWxpemVyRmVhdHVyZS5oPgorCisjaW5jbHVkZSA8ZmFtL3RyYWNlL0F2bVRyYWNlR2VuZXJhdG9yLmg+CisKKyNpbmNsdWRlIDxmbWwvY29tbW9uL01vZGlmaWVyRWxlbWVudC5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvQXZtUHJvZ3JhbS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVGb3JtLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZVN5c3RlbS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZQb3J0Lmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uVHlwZUNoZWNrZXIuaD4KKworI2luY2x1ZGUgPGZtbC9zeW1ib2wvVGFibGVPZlN5bWJvbC5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uRGF0YS5oPgorCisjaW5jbHVkZSA8Zm1sL3RyYWNlL1RyYWNlUG9pbnQuaD4KKyNpbmNsdWRlIDxmbWwvdHJhY2UvVHJhY2VTZXF1ZW5jZS5oPgorCisjaW5jbHVkZSA8Zm1sL3R5cGUvQmFzZVR5cGVTcGVjaWZpZXIuaD4KKyNpbmNsdWRlIDxmbWwvdHlwZS9DbGFzc1R5cGVTcGVjaWZpZXIuaD4KKyNpbmNsdWRlIDxmbWwvdHlwZS9Db250YWluZXJUeXBlU3BlY2lmaWVyLmg+CisjaW5jbHVkZSA8Zm1sL3R5cGUvRW51bVR5cGVTcGVjaWZpZXIuaD4KKyNpbmNsdWRlIDxmbWwvdHlwZS9JbnRlcnZhbFR5cGVTcGVjaWZpZXIuaD4KKyNpbmNsdWRlIDxmbWwvdHlwZS9UeXBlQWxpYXNTcGVjaWZpZXIuaD4KKworI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9RdWVyeS5oPgorI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9XT2JqZWN0Lmg+CisKKyNpbmNsdWRlIDxzZXcvQ29uZmlndXJhdGlvbi5oPgorCisjaW5jbHVkZSA8Ym9vc3QvZm9ybWF0LmhwcD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoqCisgKiBDT05TVEFOVFMKKyAqIERFRkFVTFQgUFJPRklMRQorICovCitjb25zdCBzdGQ6OnN0cmluZyAmIFRUQ05UaXRhblRyYWNlRm9ybWF0dGVyOjpERUZBVUxUX0VOVklST05NRU5UX0NIQU5ORUwgPSAiY0VudiI7CisKKworY29uc3Qgc3RkOjpzdHJpbmcgJiBUVENOVGl0YW5UcmFjZUZvcm1hdHRlcjo6REVGQVVMVF9URVNUQ0FTRVNfU1RBUlRJTkdfV1JBUFBFUgorCQk9ICJcdFx0Zl9zdGFydCgpOyI7CisKK2NvbnN0IHN0ZDo6c3RyaW5nICYgVFRDTlRpdGFuVHJhY2VGb3JtYXR0ZXI6OkRFRkFVTFRfVEVTVENBU0VTX0VORElOR19XUkFQUEVSCisJCT0gIlx0XHRmX2VuZCgpOyI7CisKKworY29uc3Qgc3RkOjpzdHJpbmcgJiBUVENOVGl0YW5UcmFjZUZvcm1hdHRlcjo6REVGQVVMVF9URVNUQ0FTRVNfU1RBUlRJTkdfRU5ESU5HX0lNUEwgPQorLy8JCSUxJSAtLT4gPHN5c3RlbSBpZGVudGlmaWVyPgorCQkiXHRmdW5jdGlvbiBmX3N0YXJ0KCkgcnVucyBvbiBydW5zT25fJTElIHsgfVxuIgorCQkiXHRmdW5jdGlvbiBmX2VuZCgpIHJ1bnMgb24gcnVuc09uXyUxJSB7IH0iOworCisKK2NvbnN0IHN0ZDo6c3RyaW5nICYgVFRDTlRpdGFuVHJhY2VGb3JtYXR0ZXI6OkRFRkFVTFRfVEVTVENBU0VTX1NFTkRJTkdfV1JBUFBFUgorLy8JCSUxJSAtLT4gPHN5c3RlbSBpZGVudGlmaWVyPgorLy8JCSUyJSAtLT4gPGVudmlyb25tZW50IGNoYW5uZWw+IHwgPChzeXN0ZW18ZW52aXJvbm1lbnQpIHBvcnQ+CisvLwkJJTMlIC0tPiA8dGVtcGxhdGUgcG9ydCBhcyB0eXBlPgorLy8JCSU0JSAtLT4gPHRlbXBsYXRlIHBvcnQgaWRlbnRpZmllcj4KKwkJPSAiXHRcdCUyJV9zZW5kXyUzJSggJTQlICkiOworCitjb25zdCBzdGQ6OnN0cmluZyAmIFRUQ05UaXRhblRyYWNlRm9ybWF0dGVyOjpERUZBVUxUX1RFU1RDQVNFU19SRUNFSVZJTkdfV1JBUFBFUgorLy8JCSUxJSAtLT4gPHN5c3RlbSBpZGVudGlmaWVyPgorLy8JCSUyJSAtLT4gPGVudmlyb25tZW50IGNoYW5uZWw+IHwgPChzeXN0ZW18ZW52aXJvbm1lbnQpIHBvcnQ+CisvLwkJJTMlIC0tPiA8dGVtcGxhdGUgcG9ydCBhcyB0eXBlPgorLy8JCSU0JSAtLT4gPHRlbXBsYXRlIHBvcnQgaWRlbnRpZmllcj4KKwkJPSAiXHRcdCUyJV9yZWNlaXZlXyUzJSggJTQlICkiOworCisKK2NvbnN0IHN0ZDo6c3RyaW5nICYgVFRDTlRpdGFuVHJhY2VGb3JtYXR0ZXI6OkRFRkFVTFRfVEVTVENBU0VTX1NFTkRJTkdfSU1QTCA9CisvLwkJJTElIC0tPiA8c3lzdGVtIGlkZW50aWZpZXI+CisvLwkJJTIlIC0tPiA8ZW52aXJvbm1lbnQgY2hhbm5lbD4gfCA8KHN5c3RlbXxlbnZpcm9ubWVudCkgcG9ydD4KKy8vCQklMyUgLS0+IDx0ZW1wbGF0ZSBwb3J0IGFzIHR5cGU+CisvLwkJJTQlIC0tPiA8dGVtcGxhdGUgcG9ydCBpZGVudGlmaWVyPgorCQkiXHRmdW5jdGlvbiAlMiVfc2VuZF8lMyUoIHRlbXBsYXRlICUzJSBwZHUgKSBydW5zIG9uIHJ1bnNPbl8lMSUge1xuIgorCQkiXHQlMiUuc2VuZCggJTMlIClcbiIKKwkJIlx0fSI7CisKK2NvbnN0IHN0ZDo6c3RyaW5nICYgVFRDTlRpdGFuVHJhY2VGb3JtYXR0ZXI6OkRFRkFVTFRfVEVTVENBU0VTX1JFQ0VJVklOR19JTVBMID0KKy8vCQklMSUgLS0+IDxzeXN0ZW0gaWRlbnRpZmllcj4KKy8vCQklMiUgLS0+IDxlbnZpcm9ubWVudCBjaGFubmVsPiB8IDwoc3lzdGVtfGVudmlyb25tZW50KSBwb3J0PgorLy8JCSUzJSAtLT4gPHRlbXBsYXRlIHBvcnQgYXMgdHlwZT4KKy8vCQklNCUgLS0+IDx0ZW1wbGF0ZSBwb3J0IGlkZW50aWZpZXI+CisJCSJcdGZ1bmN0aW9uICUyJV9yZWNlaXZlXyUzJSggdGVtcGxhdGUgJTMlIHBkdSApIHJ1bnMgb24gcnVuc09uXyUxJSB7XG4iCisJCSJcdFx0JTIlLnJlY2VpdmUoICUzJSApXG4iCisJCSJcdH0iOworCisKK2NvbnN0IHN0ZDo6c3RyaW5nICYgVFRDTlRpdGFuVHJhY2VGb3JtYXR0ZXI6OkRFRkFVTFRfQURBUFRBVElPTl9VVElMU19JTVBMID0KKwkJIlx0Ly8gQSB0ZXN0Y2FzZSBjb3VsZCBqdXN0IGNhbGwgdGhlIGZ1bmN0aW9uIGJlbG93LCAiCisJCQkJIndoZW4gaXQgbmVlZHMgdG8gd2FpdCBmb3IgYSB0aW1lb3V0LlxuIgorCQkiXHQvLyBJbiBjYXNlIHRoZSB1c2VyIHdhbnRzIGhlIGNhbiBhY3RpdmF0ZWQgIgorCQkJCSJhbHRzdGVwcyBpbiAnZl9zdGFydCgpJyB0byBjYXRjaCBldmVudHMgXG4iCisJCSJcdC8vIGR1cmluZyB0aGlzIHRpbWUgcGVyaW9kIgorCisJCSJcdGZ1bmN0aW9uIGZfd2FpdEZvclRpbWVvdXQoZmxvYXQgcF9kdXJhdGlvbikge1xuIgorCQkiXHRcdHRpbWVyIHQ7XG4iCisJCSJcdFx0dC5zdGFydChwX2R1cmF0aW9uKTtcbiIKKwkJIlx0XHR0LnRpbWVvdXQ7XG4iCisJCSJcdH0iOworCisKKy8qCitwcm90b3R5cGUgcHJvY2Vzczo6dHJhY2VfZ2VuZXJhdG9yIGFzICZhdm06OnByb2Nlc3Nvci5UUkFDRV9HRU5FUkFUT1IgaXMKKyBzZWN0aW9uIFJFUE9SVAorICAuLi4KK2VuZHNlY3Rpb24gUkVQT1JUCisKKyBzZWN0aW9uIFBST1BFUlRZCisgIC8vICdPTUVHQScgfCAnQ1ZDNCcgfCAnWjMnIHwgJ1lJQ0VTJworICBAc29sdmVyID0gJ1ozJzsKKworICAvLyAnQkFTSUMnIHwgJ1RUQ04nIHwgJ1RUQ04jU0RMJyB8ICdUVENOI1hMSUEnCisgIEBmb3JtYXQgPSAnQkFTSUMnOworIGVuZHNlY3Rpb24gUFJPUEVSVFkKKworIHNlY3Rpb24gVFJBQ0UKKyAgLi4uCisgZW5kc2VjdGlvbiBGT1JNQVQKK2VuZHByb3RvdHlwZQorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENPTkZJR1VSRSBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgVFRDTlRpdGFuVHJhY2VGb3JtYXR0ZXI6OmNvbmZpZ3VyZUltcGwoV09iamVjdCAqIHdmUGFyYW1ldGVyT2JqZWN0KQoreworCVdPYmplY3QgKiB0aGVQUk9QRVJUWSA9IFF1ZXJ5OjpnZXRSZWdleFdTZXF1ZW5jZSgKKwkJCXdmUGFyYW1ldGVyT2JqZWN0LCBPUl9XSUQyKCJwcm9wZXJ0eSIsICJQUk9QRVJUWSIpKTsKKworCWlmKCB0aGVQUk9QRVJUWSA9PSBXT2JqZWN0OjpfTlVMTF8gKQorCXsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXN0ZDo6c2l6ZV90IGVycm9yID0gMDsKKworCXN0ZDo6c3RyaW5nIGZvcm1hdCA9CisJCQlRdWVyeTo6Z2V0V1Byb3BlcnR5U3RyaW5nKHRoZVBST1BFUlRZLCAiZm9ybWF0IiwgIlRUQ04jU0RMIik7CisKKwlXT2JqZWN0ICogdGhlRk9STUFUID0gUXVlcnk6OmdldFdTZXF1ZW5jZU9yRWxzZSgKKwkJCXdmUGFyYW1ldGVyT2JqZWN0LCAiaW50ZXJmYWNlIiwgImZvcm1hdCIpOworCisJaWYoIHRoZUZPUk1BVCAhPSBXT2JqZWN0OjpfTlVMTF8gKQorCXsKKwkJbUNvbnRyb2xNb2R1bGVOYW1lID0gUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5U3RyaW5nKHRoZUZPUk1BVCwKKwkJCQlDT05TX1dJRDMoImNvbnRyb2wiLCAibW9kdWxlIiwgIm5hbWUiKSwKKwkJCQkiVFRDTl9Db250cm9sUGFydCIpOworCisJCW1EZWNsYXJhdGlvbnNNb2R1bGVOYW1lID0gUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5U3RyaW5nKHRoZUZPUk1BVCwKKwkJCQlDT05TX1dJRDMoImRlY2xhcmF0aW9ucyIsICJtb2R1bGUiLCAibmFtZSIpLAorCQkJCSJUVENOX0RlY2xhcmF0aW9ucyIpOworCisJCW1UZW1wbGF0ZXNNb2R1bGVOYW1lID0gUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5U3RyaW5nKHRoZUZPUk1BVCwKKwkJCQlDT05TX1dJRDMoInRlbXBsYXRlcyIsICJtb2R1bGUiLCAibmFtZSIpLAorCQkJCSJUVENOX1RlbXBsYXRlcyIpOworCisJCW1UZXN0Y2FzZXNNb2R1bGVOYW1lID0gUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5U3RyaW5nKHRoZUZPUk1BVCwKKwkJCQlDT05TX1dJRDMoInRlc3RjYXNlcyIsICJtb2R1bGUiLCAibmFtZSIpLAorCQkJCSJUVENOX1Rlc3RzQW5kQ29udHJvbCIpOworCX0KKworCVdPYmplY3QgKiB0aGVXUkFQUEVSID0gUXVlcnk6OmdldFdTZXF1ZW5jZSh3ZlBhcmFtZXRlck9iamVjdCwgIndyYXBwZXIiKTsKKworCWlmKCB0aGVXUkFQUEVSICE9IFdPYmplY3Q6Ol9OVUxMXyApCisJeworCQllcnJvciArPSBjb25maWd1cmVGb3JtYXR0ZXIoCisJCQkJdGhlV1JBUFBFUiwgbVRlc3RjYXNlc1N0YXJ0aW5nV3JhcHBlciwKKwkJCQlDT05TX1dJRDIoInRlc3RjYXNlcyIsICJzdGFydGluZyIpLCB0cnVlICkgPyAwIDogMTsKKworCQllcnJvciArPSBjb25maWd1cmVGb3JtYXR0ZXIoCisJCQkJdGhlV1JBUFBFUiwgbVRlc3RjYXNlc0VuZGluZ1dyYXBwZXIsCisJCQkJQ09OU19XSUQyKCJ0ZXN0Y2FzZXMiLCAiZW5kaW5nIiksIHRydWUgKSA/IDAgOiAxOworCisKKwkJZXJyb3IgKz0gY29uZmlndXJlRm9ybWF0dGVyKAorCQkJCXRoZVdSQVBQRVIsIG1UZXN0Y2FzZXNTZW5kaW5nV3JhcHBlciwKKwkJCQlDT05TX1dJRDIoInRlc3RjYXNlcyIsICJzZW5kaW5nIiksIHRydWUgKSA/IDAgOiAxOworCisJCWVycm9yICs9IGNvbmZpZ3VyZUZvcm1hdHRlcigKKwkJCQl0aGVXUkFQUEVSLCBtVGVzdGNhc2VzUmVjZWl2aW5nV3JhcHBlciwKKwkJCQlDT05TX1dJRDIoInRlc3RjYXNlcyIsICJyZWNlaXZpbmciKSwgdHJ1ZSApID8gMCA6IDE7CisJfQorCisKKwlXT2JqZWN0ICogdGhlSU1QTEVNRU5UQVRJT04gPSBRdWVyeTo6Z2V0V1NlcXVlbmNlKAorCQkJd2ZQYXJhbWV0ZXJPYmplY3QsICJpbXBsZW1lbnRhdGlvbiIpOworCWlmKCB0aGVJTVBMRU1FTlRBVElPTiAhPSBXT2JqZWN0OjpfTlVMTF8gKQorCXsKKwkJZXJyb3IgKz0gY29uZmlndXJlRm9ybWF0dGVyKAorCQkJCXRoZUlNUExFTUVOVEFUSU9OLCBtQWRhcHRhdGlvblN0YXJ0aW5nRW5kaW5nSW1wbCwKKwkJCQlDT05TX1dJRDIoImFkYXB0YXRpb24jc3RhcnRpbmciLCAiZW5kaW5nIiksIHRydWUgKSA/IDAgOiAxOworCisKKwkJZXJyb3IgKz0gY29uZmlndXJlRm9ybWF0dGVyKAorCQkJCXRoZUlNUExFTUVOVEFUSU9OLCBtQWRhcHRhdGlvblNlbmRpbmdJbXBsLAorCQkJCUNPTlNfV0lEMigiYWRhcHRhdGlvbiIsICJzZW5kaW5nIiksIHRydWUgKSA/IDAgOiAxOworCisJCWVycm9yICs9IGNvbmZpZ3VyZUZvcm1hdHRlcigKKwkJCQl0aGVJTVBMRU1FTlRBVElPTiwgbUFkYXB0YXRpb25SZWNlaXZpbmdJbXBsLAorCQkJCUNPTlNfV0lEMigiYWRhcHRhdGlvbiIsICJyZWNlaXZpbmciKSwgdHJ1ZSApID8gMCA6IDE7CisKKwkJZXJyb3IgKz0gY29uZmlndXJlRm9ybWF0dGVyKAorCQkJCXRoZUlNUExFTUVOVEFUSU9OLCBtQWRhcHRhdGlvblV0aWxzSW1wbCwKKwkJCQlDT05TX1dJRDIoImFkYXB0YXRpb24iLCAidXRpbHMiKSwgdHJ1ZSApID8gMCA6IDE7CisJfQorCisJcmV0dXJuKCBlcnJvciA9PSAwICk7Cit9CisKK2Jvb2wgVFRDTlRpdGFuVHJhY2VGb3JtYXR0ZXI6OmNvbmZpZ3VyZUZvcm1hdHRlcihXT2JqZWN0ICogRk9STUFULAorCQlzdGQ6OnN0cmluZyAmIGZvcm1hdFBhdHRlcm4sIGNvbnN0IHN0ZDo6c3RyaW5nICYgaWQsIGJvb2wgaXNSZWdleCkKK3sKKwlmb3JtYXRQYXR0ZXJuID0gIGlzUmVnZXgKKwkJCT8gUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5U3RyaW5nKEZPUk1BVCwgaWQsIGZvcm1hdFBhdHRlcm4pCisJCQk6IFF1ZXJ5OjpnZXRXUHJvcGVydHlTdHJpbmcoRk9STUFULCBpZCwgZm9ybWF0UGF0dGVybik7CisKKwlTdHJpbmdUb29sczo6cmVwbGFjZUFsbChmb3JtYXRQYXR0ZXJuLCAiXFx0IiAsICJcdCIpOworCVN0cmluZ1Rvb2xzOjpyZXBsYWNlQWxsKGZvcm1hdFBhdHRlcm4sICJcXG4iICwgIlxuIik7CisJU3RyaW5nVG9vbHM6OnJlcGxhY2VBbGwoZm9ybWF0UGF0dGVybiwgIlxcXCIiLCAiXCIiKTsKKworCXRyeQorCXsKKwkJYm9vc3Q6OmZvcm1hdCBmb3JtYXR0ZXIoZm9ybWF0UGF0dGVybik7CisJfQorCWNhdGNoKGNvbnN0IGJvb3N0Ojppbzo6YmFkX2Zvcm1hdF9zdHJpbmcgJiBiZnMpCisJeworCQlRdWVyeTo6cmVwb3J0RXJyb3JBdHRyaWJ1dGUoRk9STUFULCBpZCwgYmZzLndoYXQoKSk7CisKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEZPUk1BVCBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgVFRDTlRpdGFuVHJhY2VGb3JtYXR0ZXI6OmZvcm1hdChUcmFjZU1hbmFnZXIgJiBhVHJhY2VNYW5hZ2VyKQoreworCWZvcm1hdF9pbXBsKGFUcmFjZU1hbmFnZXIpOworCisJLy8gR2VuZXJhdGlvbiBkZXMgZmljaGllcnMgVFRDTl8KKwkvLworCXN0ZDo6c3RyaW5nIFRUQ05fZm9sZGVyID0gbVRyYWNlR2VuZXJhdG9yLmdldExhc3RGb2xkZXIoKS5sb2NhdGlvbjsKKwlzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSB0aGVPcGVuTW9kZSA9IHN0ZDo6aW9zX2Jhc2U6Om91dDsKKworCXN0ZDo6b3N0cmluZ3N0cmVhbSBvc3NTY2VuYXJpb0ZpbGVVUkw7CisJc3RkOjpzdHJpbmcgZmlsZW5hbWU7CisKKwlmaWxlbmFtZSA9IG1EZWNsYXJhdGlvbnNNb2R1bGVOYW1lOworCWlmKCBmaWxlbmFtZS5lbXB0eSgpICkKKwl7CisJCWZpbGVuYW1lID0gIlRUQ05fRGVjbGFyYXRpb25zIjsKKwl9CisJb3NzU2NlbmFyaW9GaWxlVVJMIDw8IFRUQ05fZm9sZGVyIDw8ICIvIiA8PCBmaWxlbmFtZSA8PCAiLnR0Y24zIjsKKwlzdGQ6Om9mc3RyZWFtIGRlY2xTdHJlYW0ob3NzU2NlbmFyaW9GaWxlVVJMLnN0cigpLmNfc3RyKCksIHRoZU9wZW5Nb2RlKTsKKwlpZiAoIGRlY2xTdHJlYW0uaXNfb3BlbigpICkKKwl7CisJCWRlY2xTdHJlYW0gPDwgbW9kdWxlX1RUQ05fRGVjbGFyYXRpb25zLnN0cigpIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisJCWRlY2xTdHJlYW0uY2xvc2UoKTsKKwl9CisKKwlmaWxlbmFtZSA9IG1UZW1wbGF0ZXNNb2R1bGVOYW1lOworCWlmKCBmaWxlbmFtZS5lbXB0eSgpICkKKwl7CisJCWZpbGVuYW1lID0gIlRUQ05fVGVtcGxhdGVzIjsKKwl9CisJb3NzU2NlbmFyaW9GaWxlVVJMLnN0cigiIik7CisJb3NzU2NlbmFyaW9GaWxlVVJMIDw8IFRUQ05fZm9sZGVyIDw8ICIvIiA8PCBmaWxlbmFtZSA8PCAiLnR0Y24zIjsKKwlzdGQ6Om9mc3RyZWFtIHRlbXBsU3RyZWFtKG9zc1NjZW5hcmlvRmlsZVVSTC5zdHIoKS5jX3N0cigpLCB0aGVPcGVuTW9kZSk7CisJaWYgKCB0ZW1wbFN0cmVhbS5pc19vcGVuKCkgKQorCXsKKwkJdGVtcGxTdHJlYW0gPDwgbW9kdWxlX1RUQ05fVGVtcGxhdGVzLnN0cigpIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisJCXRlbXBsU3RyZWFtLmNsb3NlKCk7CisJfQorCisJZmlsZW5hbWUgPSBtQWRhcHRhdGlvbk1vZHVsZU5hbWU7CisJaWYoIGZpbGVuYW1lLmVtcHR5KCkgKQorCXsKKwkJZmlsZW5hbWUgPSAiVFRDTl9BZGFwdGF0aW9uIjsKKwl9CisJb3NzU2NlbmFyaW9GaWxlVVJMLnN0cigiIik7CisJb3NzU2NlbmFyaW9GaWxlVVJMIDw8IFRUQ05fZm9sZGVyIDw8ICIvIiA8PCBmaWxlbmFtZSA8PCAiLnR0Y24zIjsKKwlzdGQ6Om9mc3RyZWFtIGFkYXB0U3RyZWFtKG9zc1NjZW5hcmlvRmlsZVVSTC5zdHIoKS5jX3N0cigpLCB0aGVPcGVuTW9kZSk7CisJaWYgKCBhZGFwdFN0cmVhbS5pc19vcGVuKCkgKQorCXsKKwkJYWRhcHRTdHJlYW0gPDwgbW9kdWxlX1RUQ05fQWRhcHRhdGlvbi5zdHIoKSA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCQlhZGFwdFN0cmVhbS5jbG9zZSgpOworCX0KKworCWZpbGVuYW1lID0gbVRlc3RjYXNlc01vZHVsZU5hbWU7CisJaWYoIGZpbGVuYW1lLmVtcHR5KCkgKQorCXsKKwkJZmlsZW5hbWUgPSAiVFRDTl9UZXN0c0FuZENvbnRyb2wiOworCX0KKwlvc3NTY2VuYXJpb0ZpbGVVUkwuc3RyKCIiKTsKKwlvc3NTY2VuYXJpb0ZpbGVVUkwgPDwgVFRDTl9mb2xkZXIgPDwgIi8iIDw8IGZpbGVuYW1lIDw8ICIudHRjbjMiOworCXN0ZDo6b2ZzdHJlYW0gdGVzdFN0cmVhbShvc3NTY2VuYXJpb0ZpbGVVUkwuc3RyKCkuY19zdHIoKSwgdGhlT3Blbk1vZGUpOworCWlmICggdGVzdFN0cmVhbS5pc19vcGVuKCkgKQorCXsKKwkJdGVzdFN0cmVhbSA8PCBtb2R1bGVfVFRDTl9UZXN0c0FuZENvbnRyb2wuc3RyKCkgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKwkJdGVzdFN0cmVhbS5jbG9zZSgpOworCX0KKworCWZpbGVuYW1lID0gbUNvbnRyb2xNb2R1bGVOYW1lOworCWlmKCBmaWxlbmFtZS5lbXB0eSgpICkKKwl7CisJCWZpbGVuYW1lID0gIlRUQ05fQ29udHJvbFBhcnQiOworCX0KKwlvc3NTY2VuYXJpb0ZpbGVVUkwuc3RyKCIiKTsKKwlvc3NTY2VuYXJpb0ZpbGVVUkwgPDwgVFRDTl9mb2xkZXIgPDwgIi8iIDw8IGZpbGVuYW1lIDw8ICIudHRjbjMiOworCXN0ZDo6b2ZzdHJlYW0gY3RybFN0cmVhbShvc3NTY2VuYXJpb0ZpbGVVUkwuc3RyKCkuY19zdHIoKSwgdGhlT3Blbk1vZGUpOworCWlmICggY3RybFN0cmVhbS5pc19vcGVuKCkgKQorCXsKKwkJY3RybFN0cmVhbSA8PCBtb2R1bGVfVFRDTl9Db250cm9sUGFydC5zdHIoKSA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCQljdHJsU3RyZWFtLmNsb3NlKCk7CisJfQorCisJLy8gQWZmaWNoYWdlIGRlcyByZXN1bHRhdHMgZGFucyBsZSBmaWNoaWVyIHR0Y24vdHJhY2UKKwkvLworCW9zc1NjZW5hcmlvRmlsZVVSTC5zdHIoIiIpOworCW9zc1NjZW5hcmlvRmlsZVVSTCA8PCBUVENOX2ZvbGRlciA8PCAiL1RUQ05fZ2xvYmFsLnR0Y24zIjsKKwlzdGQ6Om9mc3RyZWFtIGZpbGVTdHJlYW0ob3NzU2NlbmFyaW9GaWxlVVJMLnN0cigpLmNfc3RyKCksIHRoZU9wZW5Nb2RlKTsKKwlpZiAoIGZpbGVTdHJlYW0uaXNfb3BlbigpICkKKwl7CisJCWZpbGVTdHJlYW0gPDwgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiIDw8IHN0ZDo6ZW5kbDsKKwkJZmlsZVN0cmVhbSA8PCAiICAgICAgICAgIG1vZHVsZV9UVENOX0RlY2xhcmF0aW9ucyAgICAgICAgICAgICAgICAgICIgPDwgc3RkOjplbmRsOworCQlmaWxlU3RyZWFtIDw8ICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIiA8PCBzdGQ6OmVuZGw7CisJCWZpbGVTdHJlYW0gPDwgbW9kdWxlX1RUQ05fRGVjbGFyYXRpb25zLnN0cigpIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisKKwkJZmlsZVN0cmVhbSA8PCAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIgPDwgc3RkOjplbmRsOworCQlmaWxlU3RyZWFtIDw8ICIgICAgICAgICAgbW9kdWxlX1RUQ05fVGVtcGxhdGVzICAgICAgICAgICAgICAgICAgICAgIiA8PCBzdGQ6OmVuZGw7CisJCWZpbGVTdHJlYW0gPDwgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiIDw8IHN0ZDo6ZW5kbDsKKwkJZmlsZVN0cmVhbSA8PCBtb2R1bGVfVFRDTl9UZW1wbGF0ZXMuc3RyKCkgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKworCQlmaWxlU3RyZWFtIDw8ICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIiA8PCBzdGQ6OmVuZGw7CisJCWZpbGVTdHJlYW0gPDwgIiAgICAgICAgICBtb2R1bGVfVFRDTl9BZGFwdGF0aW9uICAgICAgICAgICAgICAgICAgICAgIiA8PCBzdGQ6OmVuZGw7CisJCWZpbGVTdHJlYW0gPDwgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiIDw8IHN0ZDo6ZW5kbDsKKwkJZmlsZVN0cmVhbSA8PCBtb2R1bGVfVFRDTl9BZGFwdGF0aW9uLnN0cigpIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisKKwkJZmlsZVN0cmVhbSA8PCAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIgPDwgc3RkOjplbmRsOworCQlmaWxlU3RyZWFtIDw8ICIgICAgICAgICAgbW9kdWxlX1RUQ05fVGVzdHNBbmRDb250cm9sICAgICAgICAgICAgICAgIiA8PCBzdGQ6OmVuZGw7CisJCWZpbGVTdHJlYW0gPDwgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiIDw8IHN0ZDo6ZW5kbDsKKwkJZmlsZVN0cmVhbSA8PCBtb2R1bGVfVFRDTl9UZXN0c0FuZENvbnRyb2wuc3RyKCkgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKworCQlmaWxlU3RyZWFtIDw8ICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIiA8PCBzdGQ6OmVuZGw7CisJCWZpbGVTdHJlYW0gPDwgIiAgICAgICAgICBtb2R1bGVfVFRDTl9Db250cm9sUGFydCAgICAgICAgICAgICAgICAgICAiIDw8IHN0ZDo6ZW5kbDsKKwkJZmlsZVN0cmVhbSA8PCAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIgPDwgc3RkOjplbmRsOworCQlmaWxlU3RyZWFtIDw8IG1vZHVsZV9UVENOX0NvbnRyb2xQYXJ0LnN0cigpIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisJCWZpbGVTdHJlYW0uY2xvc2UoKTsKKwl9CisKKwltVHJhY2VHZW5lcmF0b3IuYmVnaW5TdHJlYW0oKTsKKwl3aGlsZSggbVRyYWNlR2VuZXJhdG9yLmhhc1N0cmVhbSgpICkKKwl7CisJCU91dFN0cmVhbSAmIG9zID0gbVRyYWNlR2VuZXJhdG9yLmN1cnJlbnRTdHJlYW0oKTsKKworQVZNX0lGX0RFQlVHX0ZMQUcoIFBST0NFU1NPUiApCisJYVRyYWNlTWFuYWdlci50b1N0cmVhbSggb3MgKTsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBQUk9DRVNTT1IgKQorCisJCW9zIDw8ICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIiA8PCBzdGQ6OmVuZGw7CisJCW9zIDw8ICIgICAgICAgICAgbW9kdWxlX1RUQ05fRGVjbGFyYXRpb25zICAgICAgICAgICAgICAgICAgIiA8PCBzdGQ6OmVuZGw7CisJCW9zIDw8ICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIiA8PCBzdGQ6OmVuZGw7CisJCW9zIDw8IG1vZHVsZV9UVENOX0RlY2xhcmF0aW9ucy5zdHIoKSA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCisJCW9zIDw8ICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIiA8PCBzdGQ6OmVuZGw7CisJCW9zIDw8ICIgICAgICAgICAgbW9kdWxlX1RUQ05fVGVtcGxhdGVzICAgICAgICAgICAgICAgICAgICAgIiA8PCBzdGQ6OmVuZGw7CisJCW9zIDw8ICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIiA8PCBzdGQ6OmVuZGw7CisJCW9zIDw8IG1vZHVsZV9UVENOX1RlbXBsYXRlcy5zdHIoKSA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCisJCW9zIDw8ICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIiA8PCBzdGQ6OmVuZGw7CisJCW9zIDw8ICIgICAgICAgICAgbW9kdWxlX1RUQ05fQWRhcHRhdGlvbiAgICAgICAgICAgICAgICAgICAgICIgPDwgc3RkOjplbmRsOworCQlvcyA8PCAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIgPDwgc3RkOjplbmRsOworCQlvcyA8PCBtb2R1bGVfVFRDTl9BZGFwdGF0aW9uLnN0cigpIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisKKwkJb3MgPDwgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiIDw8IHN0ZDo6ZW5kbDsKKwkJb3MgPDwgIiAgICAgICAgICBtb2R1bGVfVFRDTl9UZXN0c0FuZENvbnRyb2wgICAgICAgICAgICAgICAiIDw8IHN0ZDo6ZW5kbDsKKwkJb3MgPDwgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiIDw8IHN0ZDo6ZW5kbDsKKwkJb3MgPDwgbW9kdWxlX1RUQ05fVGVzdHNBbmRDb250cm9sLnN0cigpIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisKKwkJb3MgPDwgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiIDw8IHN0ZDo6ZW5kbDsKKwkJb3MgPDwgIiAgICAgICAgICBtb2R1bGVfVFRDTl9Db250cm9sUGFydCAgICAgICAgICAgICAgICAgICAiIDw8IHN0ZDo6ZW5kbDsKKwkJb3MgPDwgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiIDw8IHN0ZDo6ZW5kbDsKKwkJb3MgPDwgbW9kdWxlX1RUQ05fQ29udHJvbFBhcnQuc3RyKCkgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKwl9CisKKwltVHJhY2VHZW5lcmF0b3IuY2xvc2VTdHJlYW0oKTsKK30KKwordm9pZCBUVENOVGl0YW5UcmFjZUZvcm1hdHRlcjo6Zm9ybWF0X2ltcGwoVHJhY2VNYW5hZ2VyICYgYVRyYWNlTWFuYWdlcikKK3sKKwkvLyBOb20gZHUgc3lzdGVtCisJc3lzdGVtTmFtZSA9IG1UcmFjZUdlbmVyYXRvci4KKwkJCWdldENvbmZpZ3VyYXRpb24oKS5nZXRFeGVjdXRhYmxlU3lzdGVtKCkuZ2V0TmFtZUlEKCk7CisKKwkvLyBtb2R1bGUgVFRDTl9EZWNsYXJhdGlvbnMKKwkvLworCWZvcm1hdEhlYWRlcl9UVENOX0RlY2xhcmF0aW9ucyhtb2R1bGVfVFRDTl9EZWNsYXJhdGlvbnMpOworCisJVHJhY2VNYW5hZ2VyOjpjb25zdF9pdGVyYXRvciBpdCA9IGFUcmFjZU1hbmFnZXIuYmVnaW4oKTsKKwlUcmFjZU1hbmFnZXI6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gYVRyYWNlTWFuYWdlci5lbmQoKTsKKwlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwl7CisJCWFUcmFjZUVsZW1lbnQgPSAoKml0KTsKKworCQlmb3JtYXRfVFRDTl9EZWNsYXJhdGlvbnMoYVRyYWNlRWxlbWVudCk7CisJfQorCisJZm9ybWF0X1RUQ05fRGVjbGFyYXRpb25zQ2hhbm5lbHMoKTsKKworCWZvcm1hdEVuZF9UVENOX0RlY2xhcmF0aW9ucyhtb2R1bGVfVFRDTl9EZWNsYXJhdGlvbnMpOworCisJLy8gbW9kdWxlIFRUQ05fVGVtcGxhdGVzCisJLy8gbW9kdWxlIFRUQ05fQWRhcHRhdGlvbgorCS8vIG1vZHVsZSBUVENOX1Rlc3RzQW5kQ29udHJvbAorCS8vIG1vZHVsZSBUVENOX0NvbnRyb2xQYXJ0CisJLy8KKwlmb3JtYXRIZWFkZXJfVFRDTl9UZW1wbGF0ZXMobW9kdWxlX1RUQ05fVGVtcGxhdGVzKTsKKwlmb3JtYXRIZWFkZXJfVFRDTl9BZGFwdGF0aW9uKG1vZHVsZV9UVENOX0FkYXB0YXRpb24pOworCWZvcm1hdEhlYWRlcl9UVENOX1Rlc3RzQW5kQ29udHJvbChtb2R1bGVfVFRDTl9UZXN0c0FuZENvbnRyb2wpOworCWZvcm1hdEhlYWRlcl9UVENOX0NvbnRyb2xQYXJ0KG1vZHVsZV9UVENOX0NvbnRyb2xQYXJ0KTsKKworCXRyYWNlTnVtYmVyID0gMTsKKwlsaW5rTnVtYmVyID0gMDsKKwlpdCA9IGFUcmFjZU1hbmFnZXIuYmVnaW4oKTsKKwllbmRJdCA9IGFUcmFjZU1hbmFnZXIuZW5kKCk7CisJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJeworCQlmb3JtYXRIZWFkZXJfVFRDTl9UZXN0c0FuZENvbnRyb2xfdGVzdGNhc2UobW9kdWxlX1RUQ05fVGVzdHNBbmRDb250cm9sKTsKKworCQlhVHJhY2VFbGVtZW50ID0gKCppdCk7CisKKwkJZm9ybWF0X1RUQ05fVHJhY2UoYVRyYWNlRWxlbWVudCk7CisKKwkJZm9ybWF0RW5kX1RUQ05fVGVzdHNBbmRDb250cm9sX3Rlc3RjYXNlKG1vZHVsZV9UVENOX1Rlc3RzQW5kQ29udHJvbCk7CisKKwkJZm9ybWF0X1RUQ05fQ29udHJvbFBhcnRfZXhlY3V0ZShtb2R1bGVfVFRDTl9Db250cm9sUGFydCk7CisKKwkJdHJhY2VOdW1iZXIgKys7CisJCWxpbmtOdW1iZXIgPSAwOworCX0KKworCWZvcm1hdEVuZF9UVENOX1RlbXBsYXRlcyhtb2R1bGVfVFRDTl9UZW1wbGF0ZXMpOworCWZvcm1hdEVuZF9UVENOX0FkYXB0YXRpb24obW9kdWxlX1RUQ05fQWRhcHRhdGlvbik7CisJZm9ybWF0RW5kX1RUQ05fVGVzdHNBbmRDb250cm9sKG1vZHVsZV9UVENOX1Rlc3RzQW5kQ29udHJvbCk7CisJZm9ybWF0RW5kX1RUQ05fQ29udHJvbFBhcnQobW9kdWxlX1RUQ05fQ29udHJvbFBhcnQpOworfQorCit2b2lkIFRUQ05UaXRhblRyYWNlRm9ybWF0dGVyOjpmb3JtYXRIZWFkZXJfVFRDTl9EZWNsYXJhdGlvbnMoc3RkOjpvc3RyZWFtICYgb3MpCit7CisJb3MgPDwgIm1vZHVsZSAiIDw8IG1EZWNsYXJhdGlvbnNNb2R1bGVOYW1lIDw8ICIgeyIgPDwgc3RkOjplbmRsOworfQorCit2b2lkIFRUQ05UaXRhblRyYWNlRm9ybWF0dGVyOjpmb3JtYXRFbmRfVFRDTl9EZWNsYXJhdGlvbnMoc3RkOjpvc3RyZWFtICYgb3MpCit7CisJaWYoIG5vdCBuZXdUeXBlc0RlY2xhcmF0aW9uLnN0cigpLmVtcHR5KCkgKQorCXsKKwkJb3MgPDwgIlx0Ly8gTmV3IHR5cGVzIGRlY2xhcmF0aW9ucyIgPDwgc3RkOjplbmRsOworCQlvcyA8PCBuZXdUeXBlc0RlY2xhcmF0aW9uLnN0cigpOworCX0KKworCW9zIDw8ICJcdC8vIFJlY29yZHMgZGVjbGFyYXRpb24iIDw8IHN0ZDo6ZW5kbDsKKwlvcyA8PCByZWNvcmRzRGVjbGFyYXRpb24uc3RyKCk7CisKKwkvKiEhIFRPRE8gY29kZSDDoCBzdXBwcmltZXIgYXByw6hzIHZhbGlkYXRpb24gbm91dmVhdSBjb2RlIHBvdXIgbGVzIGNoYW5uZWxzCisJb3MgPDwgIlx0Ly8gUG9ydHMgZGVjbGFyYXRpb24iIDw8IHN0ZDo6ZW5kbDsKKwlvcyA8PCAiXHR0eXBlIHBvcnQgcG9ydF9jRW52IG1lc3NhZ2UgeyIgPDwgc3RkOjplbmRsOworCW9zIDw8IHBvcnRzRGVjbGFyYXRpb24uc3RyKCk7CisJb3MgPDwgIlx0fSIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKwkqLworCisJaWYoIG5vdCBjaGFubmVsc0RlZmluaXRpb24uc3RyKCkuZW1wdHkoKSApCisJeworCQlvcyA8PCAiXHQvLyBDaGFubmVscyAmIHBvcnRzIGRlY2xhcmF0aW9uIiA8PCBzdGQ6OmVuZGw7CisJCW9zIDw8IGNoYW5uZWxzRGVmaW5pdGlvbi5zdHIoKTsKKwl9CisKKwkvLyBmaW4gZHUgbW9kdWxlIFRUQ05fRGVjbGFyYXRpb25zCisJb3MgPDwgIn0iIDw8IHN0ZDo6ZW5kbDsKK30KKwordm9pZCBUVENOVGl0YW5UcmFjZUZvcm1hdHRlcjo6Zm9ybWF0X1RUQ05fRGVjbGFyYXRpb25zKFRyYWNlU2VxdWVuY2UgKiBhVHJhY2VFbHQpCit7CisJQkZMaXN0Ojpjb25zdF9pdGVyYXRvciBpdCA9IGFUcmFjZUVsdC0+cG9pbnRzLmJlZ2luKCk7CisJQkZMaXN0Ojpjb25zdF9pdGVyYXRvciBlbmRJdCA9IGFUcmFjZUVsdC0+cG9pbnRzLmVuZCgpOworCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCXsKKwkJaWYoICgqaXQpLmlzPCBUcmFjZVBvaW50ID4oKSApCisJCXsKKwkJCWlmKCAoKml0KS50b19wdHI8IFRyYWNlUG9pbnQgPigpLT5pc1ZpcnR1YWwoKSApCisJCQl7CisJCQkJLy8hISBOT1RISU5HCisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJZm9ybWF0X1RUQ05fRGVjbGFyYXRpb25zKCgqaXQpLnRvX3B0cjwgVHJhY2VQb2ludCA+KCkpOworCQkJfQorCQl9CisKKwkJZWxzZSBpZiggKCppdCkuaXM8IFRyYWNlU2VxdWVuY2UgPigpICkKKwkJeworCQkJZm9ybWF0X1RUQ05fRGVjbGFyYXRpb25zKCgqaXQpLnRvX3B0cjwgVHJhY2VTZXF1ZW5jZSA+KCkpOworCQl9CisJfQorfQorCit2b2lkIFRUQ05UaXRhblRyYWNlRm9ybWF0dGVyOjpmb3JtYXRfVFRDTl9EZWNsYXJhdGlvbnMoVHJhY2VQb2ludCAqIGFUcmFjZVBvaW50KQoreworCXN0ZDo6c3RyaW5nIHBhcmFtTmFtZTsKKwlzdGQ6OnN0cmluZyBwYXJhbVR5cGU7CisKKy8vICEhISBNb2RpZiBBRkEgLSAyMy8wNS8yMDE2ICEhIQorLy8JaWYoIG5vdCBsaXN0T2ZUcmVhdGVkU2lnbmFsLmNvbnRhaW5zKCBhVHJhY2VQb2ludC0+b2JqZWN0ICkgKQorLy8JeworCWlmKCBub3QgbGlzdE9mVHJlYXRlZFNpZ25hbE5hbWUuY29udGFpbnMoIGFUcmFjZVBvaW50LT5vYmplY3QtPmdldE5hbWVJRCgpICkgKQorCXsKKworLy8JCWxpc3RPZlRyZWF0ZWRTaWduYWwuYXBwZW5kKCBhVHJhY2VQb2ludC0+b2JqZWN0ICk7CisJCWxpc3RPZlRyZWF0ZWRTaWduYWxOYW1lLmFwcGVuZCggYVRyYWNlUG9pbnQtPm9iamVjdC0+Z2V0TmFtZUlEKCkgKTsKKworCQlpZiggYVRyYWNlUG9pbnQtPm9iamVjdC0+aXM8IEluc3RhbmNlT2ZQb3J0ID4oKSApCisJCXsKKwkJCUluc3RhbmNlT2ZQb3J0ICogYVBvcnQgPSBhVHJhY2VQb2ludC0+b2JqZWN0LT50bzwgSW5zdGFuY2VPZlBvcnQgPigpOworCisJCQkvLyBSZWNvcmRzIGRlY2xhcmF0aW9uCisJCQkvLworCQkJQXJyYXlPZkJGOjpjb25zdF9pdGVyYXRvciBpdCA9IGFQb3J0LT5nZXRQYXJhbWV0ZXJzKCkuYmVnaW4oKTsKKwkJCUFycmF5T2ZCRjo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBhUG9ydC0+Z2V0UGFyYW1ldGVycygpLmVuZCgpOworCisJCQlpZiggYVBvcnQtPmhhc1BhcmFtZXRlcigpICYmIGl0ICE9IGVuZEl0ICkKKwkJCXsKKwkJCQkvLyBzaWduYWwgYXZlYyBhdSBtb2lucyB1biBwYXJhbcOodHJlIMOgIGFmZmljaGVyCisJCQkJLy8KKwkJCQlyZWNvcmRzRGVjbGFyYXRpb24gPDwgIlx0dHlwZSByZWNvcmQgIgorCQkJCQkJPDwgYVRyYWNlUG9pbnQtPm9iamVjdC0+Z2V0TmFtZUlEKCkgPDwgIiB7IjsKKworCQkJCXN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgcG9zT2ZEaWVzZTsKKworCQkJCWJvb2wgZmlyc3RQYXJhbWV0ZXIgPSB0cnVlOworCQkJCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCQkJCXsKKwkJCQkJcmVjb3Jkc0RlY2xhcmF0aW9uIDw8ICggZmlyc3RQYXJhbWV0ZXIgPyAiIiA6ICIsIikgPDwgc3RkOjplbmRsOworCisJCQkJCWZpcnN0UGFyYW1ldGVyID0gZmFsc2U7CisKKwkJCQkJLy8gcGFyYW3DqHRyZSBhbm9ueW1lCisJCQkJCWlmKCAoKml0KS5pczwgQmFzZVR5cGVTcGVjaWZpZXIgPigpICkKKwkJCQkJeworCQkJCQkJZm9ybWF0X1RUQ05fRGVjbGFyYXRpb25zKGFUcmFjZVBvaW50LAorCQkJCQkJCQkoKml0KS50b19wdHI8IEJhc2VUeXBlU3BlY2lmaWVyID4oKSwgInVuYW1lZCIpOworCisJCQkJCQlyZWNvcmRzRGVjbGFyYXRpb24gPDwgIlx0XHQiOworCQkJCQkJLy8gbGUgdHlwZQorCQkJCQkJaWYoICgqaXQpLnRvX3B0cjwgQmFzZVR5cGVTcGVjaWZpZXIgPigpLT5pc1R5cGVkUmVhbCgpICkKKwkJCQkJCXsKKwkJCQkJCQlyZWNvcmRzRGVjbGFyYXRpb24gPDwgImZsb2F0IjsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlyZWNvcmRzRGVjbGFyYXRpb24KKwkJCQkJCQkJPDwgKCppdCkudG9fcHRyPCBCYXNlVHlwZVNwZWNpZmllciA+KCktPnN0clQoKTsKKwkJCQkJCX0KKwkJCQkJCS8vIGxlIG5vbQorCQkJCQkJcmVjb3Jkc0RlY2xhcmF0aW9uIDw8ICIgIiA8PCAidW5hbWVkIjsKKwkJCQkJfQorCQkJCQkvLyBwYXJhbcOodHJlIG5vbW3DqQorCQkJCQllbHNlIGlmKCAoKml0KS5pczwgSW5zdGFuY2VPZkRhdGEgPigpICkKKwkJCQkJeworCQkJCQkJSW5zdGFuY2VPZkRhdGEgKiBhUGFyYW0gPSAoKml0KS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKTsKKworCQkJCQkJZm9ybWF0X1RUQ05fRGVjbGFyYXRpb25zKGFUcmFjZVBvaW50LAorCQkJCQkJCQlhUGFyYW0tPmdldFR5cGVTcGVjaWZpZXIoKSwKKwkJCQkJCQkJYVBhcmFtLT5nZXRUeXBlU3BlY2lmaWVyKCktPnN0clQoKSk7CisKKwkJCQkJCXJlY29yZHNEZWNsYXJhdGlvbiA8PCAiXHRcdCI7CisJCQkJCQkvLyBsZSB0eXBlCisJCQkJCQlpZiggYVBhcmFtLT5nZXRUeXBlU3BlY2lmaWVyKCktPmlzVHlwZWRTdHJpbmcoKSApCisJCQkJCQl7CisJCQkJCQkJcGFyYW1UeXBlID0gImNoYXJzdHJpbmciOworCQkJCQkJfQorCQkJCQkJZWxzZSBpZiggYVBhcmFtLT5nZXRUeXBlU3BlY2lmaWVyKCktPmlzVHlwZWRDaGFyYWN0ZXIoKSApCisJCQkJCQl7CisJCQkJCQkJcGFyYW1UeXBlID0gImNoYXJzdHJpbmciOworCQkJCQkJfQorCQkJCQkJZWxzZSBpZiggYVBhcmFtLT5nZXRUeXBlU3BlY2lmaWVyKCktPmlzVHlwZWRSZWFsKCkpCisJCQkJCQl7CisJCQkJCQkJcGFyYW1UeXBlID0gImZsb2F0IjsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlwYXJhbVR5cGUgPSBhUGFyYW0tPmdldFR5cGVTcGVjaWZpZXIoKS0+c3RyVCgpOworCQkJCQkJfQorCisJCQkJCQlyZWNvcmRzRGVjbGFyYXRpb24gPDwKKwkJCQkJCQkJKCBhUGFyYW0tPmdldFR5cGVTcGVjaWZpZXIoKS0+CisJCQkJCQkJCQkJaGFzVHlwZVByaW1pdGl2ZSgpID8gIiIgOiAiVFRDTl8iICkKKwkJCQkJCQkJPDwgcGFyYW1UeXBlOworCQkJCQkJLy8gbGUgbm9tCisJCQkJCQlwb3NPZkRpZXNlID0gYVBhcmFtLT5nZXROYW1lSUQoKS5maW5kX2ZpcnN0X29mKCcjJyk7CisJCQkJCQlpZiggKGFQYXJhbS0+Z2V0TmFtZUlEKClbMF0gPT0gJyQnKQorCQkJCQkJCXx8IChhUGFyYW0tPmdldE5hbWVJRCgpWzBdID09ICcjJykgKQorCQkJCQkJeworCQkJCQkJCXBhcmFtTmFtZSA9IGFQYXJhbS0+Z2V0TmFtZUlEKCkuc3Vic3RyKDEpOworCQkJCQkJCXJlY29yZHNEZWNsYXJhdGlvbiA8PCAiICIgPDwgInBhcmFtIiA8PCBwYXJhbU5hbWU7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJcmVjb3Jkc0RlY2xhcmF0aW9uIDw8ICIgIiA8PCBhUGFyYW0tPmdldE5hbWVJRCgpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCS8vICNiaW5kIGV4cHJlc3Npb24gcGFyYW1ldGVyCisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQl9CisJCQkJfQorCQkJCXJlY29yZHNEZWNsYXJhdGlvbiA8PCBzdGQ6OmVuZGw7CisJCQkJcmVjb3Jkc0RlY2xhcmF0aW9uIDw8ICJcdH0iIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gc2lnbmFsIHNhbnMgcGFyYW3DqHRyZSDDoCBhZmZpY2hlcgorCQkJCS8vCisJCQkJcmVjb3Jkc0RlY2xhcmF0aW9uIDw8ICJcdHR5cGUgZW51bWVyYXRlZCAiCisJCQkJCQk8PCBhVHJhY2VQb2ludC0+b2JqZWN0LT5nZXROYW1lSUQoKQorCQkJCQkJPDwgIiB7IGVfIiA8PCBhVHJhY2VQb2ludC0+b2JqZWN0LT5nZXROYW1lSUQoKSA8PCAiIH0iCisJCQkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCQkJfQorCisKKy8qCisJCQkvLyBQb3J0cyBkZWNsYXJhdGlvbgorCQkJLy8KKwkJCXN3aXRjaCggYVRyYWNlUG9pbnQtPm9wICkKKwkJCXsKKwkJCQljYXNlIEFWTV9PUENPREVfSU5QVVRfRU5WOgorCQkJCXsKKwkJCQkJaW5vdXRTaWduYWxOYW1lID0gIm91dCAiICsgYVRyYWNlUG9pbnQtPm9iamVjdC0+Z2V0TmFtZUlEKCk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWNhc2UgQVZNX09QQ09ERV9PVVRQVVRfRU5WOgorCQkJCXsKKwkJCQkJaW5vdXRTaWduYWxOYW1lID0gImluICIgKyBhVHJhY2VQb2ludC0+b2JqZWN0LT5nZXROYW1lSUQoKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCS8vIE1lc3NzYWdlIGVycmV1ciA/Pz8KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorKi8KKworCQl9CisJfQorCisKKwlpZiggYVRyYWNlUG9pbnQtPm9iamVjdC0+aXM8IEluc3RhbmNlT2ZQb3J0ID4oKSApCisJeworCQlJbnN0YW5jZU9mUG9ydCAqIGFQb3J0ID0gYVRyYWNlUG9pbnQtPm9iamVjdC0+dG88IEluc3RhbmNlT2ZQb3J0ID4oKTsKKwkJLy8gTGlzdGUgZGVzIGNoYW5uZWxzIGFzc29jacOpcyBhdXggc2lnbmF1eAorCQlpZiggYVBvcnQtPmhhc1JvdXRpbmdDaGFubmVsKCkgKQorCQl7CisJCQlzdGQ6OnN0cmluZyBjaGFubmVsTmFtZSA9IGFQb3J0LT5nZXRSb3V0aW5nQ2hhbm5lbCgpLT5nZXROYW1lSUQoKTsKKwkJCWlmKCBub3QgTGlzdE9mQ2hhbm5lbE5hbWUuY29udGFpbnMoIGNoYW5uZWxOYW1lICkgKQorCQkJeworCQkJCUxpc3RPZkNoYW5uZWxOYW1lLmFwcGVuZCggY2hhbm5lbE5hbWUgKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKy8vISFbVFJBQ0UgXSB0byBkZWxldGUKKy8vQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisvLwlBVk1fT1NfQ09VVCA8PCAiTWVzc3NhZ2UgZXJyZXVyID8/PyA6IFNpZ25hbCBub24gY29ubmVjdMOpIDogIgorLy8JCQk8PCBzdHJfaGVhZGVyKCBhUG9ydCApIDw8IHN0ZDo6ZW5kbDsKKy8vQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisJCX0KKwl9Cit9CisKK3ZvaWQgVFRDTlRpdGFuVHJhY2VGb3JtYXR0ZXI6OmZvcm1hdF9UVENOX0RlY2xhcmF0aW9ucyhUcmFjZVBvaW50ICogYVRyYWNlUG9pbnQsCisJCUJhc2VUeXBlU3BlY2lmaWVyICogYVRTLCBzdGQ6OnN0cmluZyB0eXBlTmFtZSkKK3sKKwlpZiggbGlzdE9mVHJlYXRlZFR5cGUuY29udGFpbnMoIGFUUyApICkKKwl7CisJCXJldHVybjsKKwl9CisKKwlsaXN0T2ZUcmVhdGVkVHlwZS5hcHBlbmQoIGFUUyApOworCisJaWYoIGFUUy0+aGFzVHlwZUNvbnRhaW5lcigpICkKKwl7CisJCUNvbnRhaW5lclR5cGVTcGVjaWZpZXIgKiBjb250YWluZXJUID0gYVRTLT5hczwgQ29udGFpbmVyVHlwZVNwZWNpZmllciA+KCk7CisJCWF2bV9zaXplX3Qgc2l6ZVQgPSBjb250YWluZXJULT5zaXplKCk7CisKKwkJc3dpdGNoKCBjb250YWluZXJULT5nZXRUeXBlU3BlY2lmaWVyS2luZCgpICkKKwkJeworCQkJY2FzZSBUWVBFX1ZFQ1RPUl9TUEVDSUZJRVI6CisJCQljYXNlIFRZUEVfUkVWRVJTRV9WRUNUT1JfU1BFQ0lGSUVSOgorCQkJY2FzZSBUWVBFX0xJU1RfU1BFQ0lGSUVSOgorCQkJY2FzZSBUWVBFX1NFVF9TUEVDSUZJRVI6CisJCQljYXNlIFRZUEVfTVVMVElTRVRfU1BFQ0lGSUVSOgorCQkJY2FzZSBUWVBFX0ZJRk9fU1BFQ0lGSUVSOgorCQkJY2FzZSBUWVBFX0xJRk9fU1BFQ0lGSUVSOgorCQkJY2FzZSBUWVBFX01VTFRJX0ZJRk9fU1BFQ0lGSUVSOgorCQkJY2FzZSBUWVBFX01VTFRJX0xJRk9fU1BFQ0lGSUVSOgorCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQlmb3JtYXRfVFRDTl9EZWNsYXJhdGlvbnMoYVRyYWNlUG9pbnQsCisJCQkJCQljb250YWluZXJULT5nZXRDb250ZW50c1R5cGVTcGVjaWZpZXIoKSwgdHlwZU5hbWUpOworCisJCQkJbmV3VHlwZXNEZWNsYXJhdGlvbiA8PCAiXHR0eXBlICIKKwkJCQkJPDwgKCBjb250YWluZXJULT5nZXRDb250ZW50c1R5cGVTcGVjaWZpZXIoKS4KKwkJCQkJCQloYXNUeXBlUHJpbWl0aXZlKCkgPyAiIiA6ICJUVENOXyIgKQorCQkJCQk8PCBjb250YWluZXJULT5nZXRDb250ZW50c1R5cGVTcGVjaWZpZXIoKS5zdHJUKCkgPDwgIiAiCisJCQkJCTw8ICJUVENOXyIgPDwgdHlwZU5hbWUgPDwgIlsiIDw8IHNpemVUIDw8ICJdOyIKKwkJCQkJPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJZWxzZSBpZiggYVRTLT5pc1R5cGVkQ2xhc3MoKSApCisJeworCQlDbGFzc1R5cGVTcGVjaWZpZXIgKiBjbGFzc1R5cGUgPSBhVFMtPmFzPCBDbGFzc1R5cGVTcGVjaWZpZXIgPigpOworCQlhdm1fc2l6ZV90IHNpemVUID0gY2xhc3NUeXBlLT5zaXplKCk7CisKKwkJU3ltYm9sIGFGaWVsZDsKKworCQlmb3IoIGF2bV9zaXplX3QgaWR4ID0gMCA7IGlkeCA8IHNpemVUIDsgKytpZHggKQorCQl7CisJCQlhRmllbGQgPSBjbGFzc1R5cGUtPmdldFN5bWJvbERhdGEoaWR4KTsKKworCQkJZm9ybWF0X1RUQ05fRGVjbGFyYXRpb25zKGFUcmFjZVBvaW50LAorCQkJCQlhRmllbGQuZ2V0VHlwZVNwZWNpZmllcigpLAorCQkJCQlhRmllbGQuZ2V0VHlwZVNwZWNpZmllcigpLT5zdHJUKCkpOworLy8JCQkJCWFGaWVsZC5nZXRUeXBlU3BlY2lmaWVyKCktPmdldE5hbWVJRCgpKTsKKwkJfQorCisJCS8vIFR5cGUgU3RydWN0dXJlL1JlY29yZCBkZWNsYXJhdGlvbgorCQluZXdUeXBlc0RlY2xhcmF0aW9uIDw8ICJcdHR5cGUgcmVjb3JkICIgPDwgIlRUQ05fIiA8PCB0eXBlTmFtZSA8PCAiIHsiCisJCQkJPDwgc3RkOjplbmRsOworCQlmb3IoIGF2bV9zaXplX3QgaWR4ID0gMCA7IGlkeCA8IHNpemVUIDsgKytpZHggKQorCQl7CisJCQlhRmllbGQgPSBjbGFzc1R5cGUtPmdldFN5bWJvbERhdGEoaWR4KTsKKworCQkJbmV3VHlwZXNEZWNsYXJhdGlvbiA8PCAiXHRcdCIKKwkJCQk8PCAoIGFGaWVsZC5nZXRUeXBlU3BlY2lmaWVyKCktPmhhc1R5cGVQcmltaXRpdmUoKSA/ICIiIDogIlRUQ05fIiApCisJCQkJPDwgKCBhRmllbGQuZ2V0VHlwZVNwZWNpZmllcigpLT5pc1R5cGVkUmVhbCgpID8KKwkJCQkJCSJmbG9hdCIgOiBhRmllbGQuZ2V0VHlwZVNwZWNpZmllcigpLT5zdHJUKCkgKQorCQkJCTw8ICIgIiA8PCBhRmllbGQuZ2V0TmFtZUlEKCkgPDwgKChpZHggPCAoc2l6ZVQgLSAxKSkgPyAiLCIgOiAiIikKKwkJCQk8PCBzdGQ6OmVuZGw7CisJCX0KKwkJbmV3VHlwZXNEZWNsYXJhdGlvbiA8PCAiXHR9IiA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCX0KKworCWVsc2UgaWYoIGFUUy0+aXNUeXBlZEVudW0oKSApCisJeworCQlFbnVtVHlwZVNwZWNpZmllciAqIGVudW1UeXBlID0gYVRTLT5hczwgRW51bVR5cGVTcGVjaWZpZXIgPigpOworCisJCS8vIFR5cGUgZW51bSBkZWNsYXJhdGlvbgorCQluZXdUeXBlc0RlY2xhcmF0aW9uIDw8ICJcdHR5cGUgZW51bWVyYXRlZCAiIDw8ICJUVENOXyIgPDwgdHlwZU5hbWUKKwkJCQk8PCAiIHsiIDw8IHN0ZDo6ZW5kbDsKKwkJbmV3VHlwZXNEZWNsYXJhdGlvbiA8PCAiXHRcdCI7CisKKwkJYXZtX3NpemVfdCBzaXplVCA9IGVudW1UeXBlLT5nZXRTeW1ib2xEYXRhKCkuc2l6ZSgpOworCQlmb3IoIGF2bV9zaXplX3QgaWR4ID0gMCA7IGlkeCA8IHNpemVUIDsgKytpZHggKQorCQl7CisJCQluZXdUeXBlc0RlY2xhcmF0aW9uIDw8IGVudW1UeXBlLT5nZXRTeW1ib2xEYXRhKGlkeCkuZ2V0TmFtZUlEKCkKKwkJCQkJPDwgKChpZHggPCAoc2l6ZVQgLSAxKSkgPyAiLCAiIDogIlxuIik7CisJCX0KKwkJbmV3VHlwZXNEZWNsYXJhdGlvbiA8PCAiXHR9IiA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCX0KKworCWVsc2UgaWYoIGFUUy0+aXNUeXBlZEludGVydmFsKCkgKQorCXsKKwkJSW50ZXJ2YWxUeXBlU3BlY2lmaWVyICogaW50ZXJ2YWxUUyA9IGFUUy0+YXM8IEludGVydmFsVHlwZVNwZWNpZmllciA+KCk7CisKKwkJbmV3VHlwZXNEZWNsYXJhdGlvbiA8PCAiXHR0eXBlICIKKwkJCTw8ICggaW50ZXJ2YWxUUy0+Z2V0U3VwcG9ydFR5cGVTcGVjaWZpZXIoKS4KKwkJCQkJaGFzVHlwZVByaW1pdGl2ZSgpID8gIiIgOiAiVFRDTl8iICkKKwkJCTw8ICggaW50ZXJ2YWxUUy0+Z2V0U3VwcG9ydFR5cGVTcGVjaWZpZXIoKS5pc1R5cGVkUmVhbCgpID8KKwkJCQkJImZsb2F0IiA6IGludGVydmFsVFMtPmdldFN1cHBvcnRUeXBlU3BlY2lmaWVyKCkuc3RyVCgpICkKKwkJCTw8ICIgVFRDTl8iIDw8IHR5cGVOYW1lCisJCQk8PCAiICgiICAgPDwgaW50ZXJ2YWxUUy0+Z2V0SW5maW11bSgpLnN0cigpCisJCQk8PCAiIC4uICIgPDwgaW50ZXJ2YWxUUy0+Z2V0U3VwcmVtdW0oKS5zdHIoKQorCQkJPDwgIik7IiAgICA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCX0KKworCWVsc2UgaWYoIGFUUy0+aXNUeXBlZFN0cmluZygpICkKKwl7CisJCWlmKCBhVFMtPnNpemUoKSA8IEFWTV9OVU1FUklDX01BWF9TSVpFX1QgKQorCQl7CisJCQluZXdUeXBlc0RlY2xhcmF0aW9uIDw8ICJcdHR5cGUgY2hhcnN0cmluZyBUVENOXyIgPDwgdHlwZU5hbWUKKwkJCQkJPDwgIiBsZW5ndGgoICIgPDwgYVRTLT5nZXRNaW5pbXVtU2l6ZSgpCisJCQkJCTw8ICIgLi4gIiA8PCBhVFMtPmdldE1heGltdW1TaXplKCkgPDwgIiApOyIKKwkJCQkJPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKwkJfQorCX0KKworCWVsc2UgaWYoIGFUUy0+aXNUeXBlZEFsaWFzKCkgKQorCXsKKwkJaWYoIGFUUy0+aGFzQ29uc3RyYWludCgpICkKKwkJeworLy8JCQlmb3JtYXRfVFRDTl9EZWNsYXJhdGlvbnMoYVRyYWNlUG9pbnQsCisvLwkJCQlhVFMtPmFzPCBUeXBlQWxpYXNTcGVjaWZpZXIgPigpLT50YXJnZXRUeXBlU3BlY2lmaWVyKCksIHR5cGVOYW1lKTsKKworCQkJQmFzZVR5cGVTcGVjaWZpZXIgKiB0YXJnZXRUUyA9CisJCQkJCWFUUy0+YXM8IFR5cGVBbGlhc1NwZWNpZmllciA+KCktPnRhcmdldFR5cGVTcGVjaWZpZXIoKTsKKworCQkJbmV3VHlwZXNEZWNsYXJhdGlvbiA8PCAiXHR0eXBlICIKKy8vCQkJCTw8ICggYVRTLT5oYXNUeXBlZFByaW1pdGl2ZSgpID8gIiIgOiAiVFRDTl8iKQorCQkJCTw8IHRhcmdldFRTLT5zdHJUKCkgPDwgIiAiIDw8ICJUVENOXyIgPDwgdHlwZU5hbWUgPDwgInsgIgorCQkJCTw8IGFUUy0+Z2V0Q29uc3RyYWludCgpLmFzX3B0cjwgQXZtUHJvZ3JhbSA+KCktPmdldENvZGUoKS5zdHIoKQorCQkJCTw8ICIgfTsiIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisJCX0KKwkJZWxzZQorCQl7CisJCQlmb3JtYXRfVFRDTl9EZWNsYXJhdGlvbnMoYVRyYWNlUG9pbnQsCisJCQkJYVRTLT5hczwgVHlwZUFsaWFzU3BlY2lmaWVyID4oKS0+dGFyZ2V0VHlwZVNwZWNpZmllcigpLCB0eXBlTmFtZSk7CisJCX0KKwl9CisKKwllbHNlIGlmKCBhVFMtPndlYWtseVR5cGVkSW50ZWdlcigpICYmIChhVFMtPmdldEJpdFNpemUoKSA+IDApICkKKwl7CisJCW5ld1R5cGVzRGVjbGFyYXRpb24gPDwgIlx0dHlwZSBpbnRlZ2VyIiAvLyA8PCBhVFMtPmdldE5hbWVJRCgpCisJCQk8PCAiIFRUQ05fIiA8PCB0eXBlTmFtZQorCQkJPDwgIiAoIiAgIDw8IGFUUy0+bWluSW50ZWdlclZhbHVlKCkKKwkJCTw8ICIgLi4gIiA8PCBhVFMtPm1heEludGVnZXJWYWx1ZSgpCisJCQk8PCAiKTsiICAgIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisJfQorCWVsc2UgaWYoIC8qYVRTLT5pc1R5cGVkU2ltcGxlKCkgJiYqLyBhVFMtPmhhc0NvbnN0cmFpbnQoKSApCisJeworCQkvLyEhIFRPRE8KKwkJbmV3VHlwZXNEZWNsYXJhdGlvbiA8PCAiXHR0eXBlICIKKwkJCTw8IC8qKCBhVFMtPmhhc1R5cGVkUHJpbWl0aXZlKCkgPyAiIiA6ICJUVENOXyIpIDw8Ki8gdHlwZU5hbWUKKwkJCTw8ICIgVFRDTl8iIDw8IGFUUy0+c3RyVCgpIDw8ICJ7ICIKKwkJCTw8IGFUUy0+Z2V0Q29uc3RyYWludCgpLmFzX3B0cjwgQXZtUHJvZ3JhbSA+KCktPmdldENvZGUoKS5zdHIoKQorCQkJPDwgIiB9OyIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKwl9Cit9CisKKwordm9pZCBUVENOVGl0YW5UcmFjZUZvcm1hdHRlcjo6Zm9ybWF0X1RUQ05fRGVjbGFyYXRpb25zQ2hhbm5lbHMoKQoreworCWNvbnN0IEV4ZWN1dGFibGVTeXN0ZW0gJiBhbkV4ZWN1dGFibGVTeXN0ZW0gPQorCQkJbVRyYWNlR2VuZXJhdG9yLmdldENvbmZpZ3VyYXRpb24oKS5nZXRFeGVjdXRhYmxlU3lzdGVtKCk7CisKKwlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBpdENoYW5uZWw7CisJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgZW5kQ2hhbm5lbDsKKworCVRhYmxlT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGl0UG9ydDsKKwlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBlbmRQb3J0OworCisJVGFibGVPZkV4ZWN1dGFibGVGb3JtOjpjb25zdF9yYXdfaXRlcmF0b3IgaXRFeGVjID0KKwkJCWFuRXhlY3V0YWJsZVN5c3RlbS5nZXRFeGVjdXRhYmxlcygpLmJlZ2luKCk7CisJVGFibGVPZkV4ZWN1dGFibGVGb3JtOjpjb25zdF9yYXdfaXRlcmF0b3IgZW5kRXhlYyA9CisJCQlhbkV4ZWN1dGFibGVTeXN0ZW0uZ2V0RXhlY3V0YWJsZXMoKS5lbmQoKTsKKwlmb3IoIDsgaXRFeGVjICE9IGVuZEV4ZWMgOyArK2l0RXhlYyApCisJeworCQlpdENoYW5uZWwgPSAoaXRFeGVjKS0+Z2V0Q2hhbm5lbCgpLmJlZ2luKCk7CisJCWVuZENoYW5uZWwgPSAoaXRFeGVjKS0+Z2V0Q2hhbm5lbCgpLmVuZCgpOworCQlmb3IoIDsgaXRDaGFubmVsICE9IGVuZENoYW5uZWwgOyArK2l0Q2hhbm5lbCApCisJCXsKKwkJCWNoYW5uZWxzRGVmaW5pdGlvbiA8PCAiXHR0eXBlIHBvcnQgcG9ydF8iIDw8ICgqaXRDaGFubmVsKS5nZXROYW1lSUQoKQorCQkJCQk8PCAiIG1lc3NhZ2UgeyIgPDwgc3RkOjplbmRsOworCisJCQljaGFubmVsc0RlY2xhcmF0aW9uIDw8ICJcdFx0cG9ydCBwb3J0XyIgPDwgKCppdENoYW5uZWwpLmdldE5hbWVJRCgpCisJCQkJCTw8ICIgIiA8PCAoKml0Q2hhbm5lbCkuZ2V0TmFtZUlEKCkgPDwgIjsiIDw8IHN0ZDo6ZW5kbDsKKworCQkJaXRQb3J0ID0gKCppdENoYW5uZWwpLmNoYW5uZWwoKS5nZXRDb250ZW50cygpLmJlZ2luKCk7CisJCQllbmRQb3J0ID0gKCppdENoYW5uZWwpLmNoYW5uZWwoKS5nZXRDb250ZW50cygpLmVuZCgpOworCQkJZm9yKCA7IGl0UG9ydCAhPSBlbmRQb3J0IDsgKytpdFBvcnQgKQorCQkJeworLy8gISEhIE1vZGlmIEFGQSAtIDIzLzA1LzIwMTYgISEhCisvLwkJCQlpZiggbGlzdE9mVHJlYXRlZFNpZ25hbC5jb250YWlucyggKCppdFBvcnQpLnJhd1BvcnQoKSApICkKKwkJCQlpZiggbGlzdE9mVHJlYXRlZFNpZ25hbE5hbWUuY29udGFpbnMoCisJCQkJCQkoKml0UG9ydCkucmF3UG9ydCgpLT5nZXROYW1lSUQoKSApICkKKwkJCQl7CisJCQkJCWNoYW5uZWxzRGVmaW5pdGlvbiA8PCAiXHRcdCIKKwkJCQkJCTw8ICggKCppdFBvcnQpLnBvcnQoKS5nZXRNb2RpZmllcigpLmlzRGlyZWN0aW9uSW5wdXQoKQorCQkJCQkJCQk/ICJvdXQgIiA6ICJpbiAiICkKKwkJCQkJCTw8ICgqaXRQb3J0KS5nZXROYW1lSUQoKSA8PCAiOyIgPDwgc3RkOjplbmRsOworCQkJCX0KKwkJCX0KKwkJCWNoYW5uZWxzRGVmaW5pdGlvbiA8PCAiXHR9IiA8PCBzdGQ6OmVuZGw7CisJCX0KKwl9Cit9CisKKwordm9pZCBUVENOVGl0YW5UcmFjZUZvcm1hdHRlcjo6Zm9ybWF0SGVhZGVyX1RUQ05fVGVtcGxhdGVzKHN0ZDo6b3N0cmVhbSAmIG9zKQoreworCW9zIDw8ICJtb2R1bGUgIiA8PCBtVGVtcGxhdGVzTW9kdWxlTmFtZSA8PCAiIHsiIDw8IHN0ZDo6ZW5kbAorCQk8PCAiXHRpbXBvcnQgZnJvbSAiIDw8IG1EZWNsYXJhdGlvbnNNb2R1bGVOYW1lIDw8ICIgYWxsOyIKKwkJPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKK30KKwordm9pZCBUVENOVGl0YW5UcmFjZUZvcm1hdHRlcjo6Zm9ybWF0RW5kX1RUQ05fVGVtcGxhdGVzKHN0ZDo6b3N0cmVhbSAmIG9zKQoreworCW9zIDw8IG9zc1RlbXBsYXRlTGlzdC5zdHIoKTsKKworCW9zIDw8ICJ9IiA8PCBzdGQ6OmVuZGw7Cit9CisKKworCit2b2lkIFRUQ05UaXRhblRyYWNlRm9ybWF0dGVyOjpmb3JtYXRIZWFkZXJfVFRDTl9BZGFwdGF0aW9uKHN0ZDo6b3N0cmVhbSAmIG9zKQoreworCW9zIDw8ICJtb2R1bGUgIiA8PCBtQWRhcHRhdGlvbk1vZHVsZU5hbWUgPDwgIiB7IiA8PCBzdGQ6OmVuZGwKKwkJPDwgIlx0aW1wb3J0IGZyb20gIiA8PCBtRGVjbGFyYXRpb25zTW9kdWxlTmFtZSA8PCAiIGFsbDsiCisJCTw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7Cit9CisKK3ZvaWQgVFRDTlRpdGFuVHJhY2VGb3JtYXR0ZXI6OmZvcm1hdEVuZF9UVENOX0FkYXB0YXRpb24oc3RkOjpvc3RyZWFtICYgb3MpCit7CisJb3MgPDwgIlx0Ly8gQ29tcG9uZW50cyBkZWNsYXJhdGlvbiIgPDwgc3RkOjplbmRsCisJCTw8ICJcdHR5cGUgY29tcG9uZW50IHJ1bnNPbl8iIDw8IHN5c3RlbU5hbWUgPDwgIiB7IiA8PCBzdGQ6OmVuZGwKKwkJPDwgY2hhbm5lbHNEZWNsYXJhdGlvbi5zdHIoKQorCQk8PCAiXHR9IgorCQk8PCBzdGQ6OmVuZGwKKwkJPDwgIlx0dHlwZSBjb21wb25lbnQgIiA8PCBzeXN0ZW1OYW1lIDw8ICIgeyIgPDwgc3RkOjplbmRsCisJCTw8IGNoYW5uZWxzRGVjbGFyYXRpb24uc3RyKCkKKwkJPDwgIlx0fSIgPDwgc3RkOjplbmRsCisJCTw8IHN0ZDo6ZW5kbDsKKworCisJYm9vc3Q6OmZvcm1hdCB1dGlsc0Zvcm1hdHRlciggbUFkYXB0YXRpb25VdGlsc0ltcGwpOworCXV0aWxzRm9ybWF0dGVyLmV4Y2VwdGlvbnMoIGJvb3N0Ojppbzo6bm9fZXJyb3JfYml0cyApOworCW9zIDw8ICJcdC8vIEltcGxlbWVudGF0aW9uIG9mIHV0aWxpdHkgZnVuY3Rpb25zIgorCQk8PCBzdGQ6OmVuZGwKKwkJPDwgdXRpbHNGb3JtYXR0ZXIKKwkJJSBzeXN0ZW1OYW1lCisJCTw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisKKwkvLyBTdGFydGluZyAvIEVuZGluZyBUZXN0Y2FzZXMgd3JhcHBlciBJbXBsZW1lbnRhdGlvbgorCisJYm9vc3Q6OmZvcm1hdCBzdGFydGluZ0VuZGluZ0Zvcm1hdHRlciggbUFkYXB0YXRpb25TdGFydGluZ0VuZGluZ0ltcGwpOworCXN0YXJ0aW5nRW5kaW5nRm9ybWF0dGVyLmV4Y2VwdGlvbnMoIGJvb3N0Ojppbzo6bm9fZXJyb3JfYml0cyApOworCW9zIDw8ICJcdC8vIEltcGxlbWVudGF0aW9uIG9mIHRlc3RjYXNlcyBTdGFydGluZyAvIEVuZGluZyB3cmFwcGVycyIKKwkJPDwgc3RkOjplbmRsCisJCTw8IHN0YXJ0aW5nRW5kaW5nRm9ybWF0dGVyCisJCSUgc3lzdGVtTmFtZQorCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCisJb3MgPDwgIlx0Ly8gSW1wbGVtZW50YXRpb24gb2YgdGVzdGNhc2VzIFNlbmRpbmcgLyBSZWNlaXZpbmcgd3JhcHBlcnMiCisJCTw8IHN0ZDo6ZW5kbAorCQk8PCBvc3NBZGFwdGF0aW9uTGlzdC5zdHIoKQorCQk8PCBzdGQ6OmVuZGw7CisKKwlvcyA8PCAifSIgPDwgc3RkOjplbmRsOworfQorCisKKwordm9pZCBUVENOVGl0YW5UcmFjZUZvcm1hdHRlcjo6Zm9ybWF0SGVhZGVyX1RUQ05fVGVzdHNBbmRDb250cm9sKHN0ZDo6b3N0cmVhbSAmIG9zKQoreworCW9zIDw8ICJtb2R1bGUgIiA8PCBtVGVzdGNhc2VzTW9kdWxlTmFtZSA8PCAiIHsiIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGwKKwkJPDwgIlx0aW1wb3J0IGZyb20gIiA8PCBtQWRhcHRhdGlvbk1vZHVsZU5hbWUgICA8PCAiIGFsbDsiIDw8IHN0ZDo6ZW5kbAorLy8JCTw8ICJcdGltcG9ydCBmcm9tICIgPDwgbURlY2xhcmF0aW9uc01vZHVsZU5hbWUgPDwgIiBhbGw7IiA8PCBzdGQ6OmVuZGwKKwkJPDwgIlx0aW1wb3J0IGZyb20gIiA8PCBtVGVtcGxhdGVzTW9kdWxlTmFtZSAgICA8PCAiIGFsbDsiIDw8IHN0ZDo6ZW5kbAorCQk8PCBzdGQ6OmVuZGw7Cit9CisKK3ZvaWQgVFRDTlRpdGFuVHJhY2VGb3JtYXR0ZXI6OmZvcm1hdEVuZF9UVENOX1Rlc3RzQW5kQ29udHJvbChzdGQ6Om9zdHJlYW0gJiBvcykKK3sKKwlvcyA8PCAifSIgPDwgc3RkOjplbmRsOworfQorCit2b2lkIFRUQ05UaXRhblRyYWNlRm9ybWF0dGVyOjpmb3JtYXRIZWFkZXJfVFRDTl9UZXN0c0FuZENvbnRyb2xfdGVzdGNhc2UoCisJCXN0ZDo6b3N0cmVhbSAmIG9zKQoreworCWludCB1bnNpZ25lZCBpOworCisJYm9vc3Q6OmZvcm1hdCBzdGFydGluZ0Zvcm1hdHRlciggbVRlc3RjYXNlc1N0YXJ0aW5nV3JhcHBlcik7CisJc3RhcnRpbmdGb3JtYXR0ZXIuZXhjZXB0aW9ucyggYm9vc3Q6OmlvOjpub19lcnJvcl9iaXRzICk7CisKKwlvcyA8PCAiXHR0ZXN0Y2FzZSBUQ190cmFjZSIgPDwgdHJhY2VOdW1iZXIgPDwgIigpICIKKwkJPDwgInJ1bnMgb24gcnVuc09uXyIgPDwgc3lzdGVtTmFtZSA8PCAiIHN5c3RlbSAiIDw8IHN5c3RlbU5hbWUgPDwgIiB7IgorCQk8PCBzdGQ6OmVuZGwKKwkJPDwgbVRlc3RjYXNlc1N0YXJ0aW5nV3JhcHBlcgorCQk8PCBzdGQ6OmVuZGw7CisKKwkvLyBNYXBwaW5nIG9mIENoYW5uZWxzCisJZm9yKGkgPSAwIDsgaSA8IExpc3RPZkNoYW5uZWxOYW1lLnNpemUoKSA7IGkrKykKKwl7CisJCW9zIDw8ICJcdFx0bWFwKHNlbGY6IiA8PCBMaXN0T2ZDaGFubmVsTmFtZS5nZXQoaSkKKwkJCTw8ICIsIHN5c3RlbToiIDw8IExpc3RPZkNoYW5uZWxOYW1lLmdldChpKSA8PCAiKTsiIDw8IHN0ZDo6ZW5kbDsKKwl9CisJb3NzVGVzdGNhc2VMaXN0LnN0cigiIik7Cit9CisKK3ZvaWQgVFRDTlRpdGFuVHJhY2VGb3JtYXR0ZXI6OmZvcm1hdEVuZF9UVENOX1Rlc3RzQW5kQ29udHJvbF90ZXN0Y2FzZSgKKwkJc3RkOjpvc3RyZWFtICYgb3MpCit7CisJYm9vc3Q6OmZvcm1hdCBlbmRpbmdGb3JtYXR0ZXIoIG1UZXN0Y2FzZXNFbmRpbmdXcmFwcGVyKTsKKwllbmRpbmdGb3JtYXR0ZXIuZXhjZXB0aW9ucyggYm9vc3Q6OmlvOjpub19lcnJvcl9iaXRzICk7CisKKwlvcyA8PCBvc3NUZXN0Y2FzZUxpc3Quc3RyKCkKKwkJPDwgZW5kaW5nRm9ybWF0dGVyCisJCTw8IHN0ZDo6ZW5kbAorCQk8PCAiXHR9IiA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworfQorCit2b2lkIFRUQ05UaXRhblRyYWNlRm9ybWF0dGVyOjpmb3JtYXRIZWFkZXJfVFRDTl9Db250cm9sUGFydChzdGQ6Om9zdHJlYW0gJiBvcykKK3sKKwlvcyA8PCAibW9kdWxlICIgPDwgbUNvbnRyb2xNb2R1bGVOYW1lIDw8ICIgeyIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbAorCQk8PCAiXHRpbXBvcnQgZnJvbSAiIDw8IG1UZXN0Y2FzZXNNb2R1bGVOYW1lIDw8ICIgYWxsOyIgPDwgc3RkOjplbmRsCisJCTw8IHN0ZDo6ZW5kbAorCQk8PCAiXHRjb250cm9sIHsiIDw8IHN0ZDo6ZW5kbDsKK30KKwordm9pZCBUVENOVGl0YW5UcmFjZUZvcm1hdHRlcjo6Zm9ybWF0RW5kX1RUQ05fQ29udHJvbFBhcnQoc3RkOjpvc3RyZWFtICYgb3MpCit7CisJb3MgPDwgIlx0fSIgPDwgc3RkOjplbmRsCisJCTw8ICJ9IiA8PCBzdGQ6OmVuZGw7Cit9CisKK3ZvaWQgVFRDTlRpdGFuVHJhY2VGb3JtYXR0ZXI6OmZvcm1hdF9UVENOX0NvbnRyb2xQYXJ0X2V4ZWN1dGUoc3RkOjpvc3RyZWFtICYgb3MpCit7CisJb3MgPDwgIlx0XHRleGVjdXRlKFRDX3RyYWNlIiA8PCB0cmFjZU51bWJlciA8PCAiKCkpOyIgPDwgc3RkOjplbmRsOworfQorCit2b2lkIFRUQ05UaXRhblRyYWNlRm9ybWF0dGVyOjpmb3JtYXRfVFRDTl9UcmFjZShUcmFjZVNlcXVlbmNlICogYVRyYWNlRWx0KQoreworCUJGTGlzdDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBhVHJhY2VFbHQtPnBvaW50cy5iZWdpbigpOworCUJGTGlzdDo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBhVHJhY2VFbHQtPnBvaW50cy5lbmQoKTsKKwlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwl7CisJCWlmKCAoKml0KS5pczwgVHJhY2VQb2ludCA+KCkgKQorCQl7CisJCQlpZiggKCppdCkudG9fcHRyPCBUcmFjZVBvaW50ID4oKS0+aXNWaXJ0dWFsKCkgKQorCQkJeworCQkJCS8vISEgTk9USElORworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWZvcm1hdF9UVENOX1RyYWNlKCgqaXQpLnRvX3B0cjwgVHJhY2VQb2ludCA+KCkpOworCQkJfQorCQl9CisKKwkJZWxzZSBpZiggKCppdCkuaXM8IFRyYWNlU2VxdWVuY2UgPigpICkKKwkJeworCQkJZm9ybWF0X1RUQ05fVHJhY2UoKCppdCkudG9fcHRyPCBUcmFjZVNlcXVlbmNlID4oKSk7CisJCX0KKwl9Cit9CisKK3ZvaWQgVFRDTlRpdGFuVHJhY2VGb3JtYXR0ZXI6OmZvcm1hdF9UVENOX1RyYWNlKFRyYWNlUG9pbnQgKiBhVHJhY2VQb2ludCkKK3sKKwlzdGQ6OnN0cmluZyB0ZW1wbGF0ZV9UQUIgPSAiXHRcdCI7CisJc3RkOjpzdHJpbmcgdGVtcGxhdGVfaW5jclRhYiA9ICJcdCI7CisKKwlpZiggYVRyYWNlUG9pbnQtPm9iamVjdC0+aXM8IEluc3RhbmNlT2ZQb3J0ID4oKSAmJgorCQkoICggYVRyYWNlUG9pbnQtPm9wCT09IEFWTV9PUENPREVfSU5QVVRfRU5WICkgfHwKKwkJICAoIGFUcmFjZVBvaW50LT5vcAk9PSBBVk1fT1BDT0RFX09VVFBVVF9FTlYgKSApICkKKwl7CisJCUluc3RhbmNlT2ZQb3J0ICogYVBvcnQgPSBhVHJhY2VQb2ludC0+b2JqZWN0LT50bzwgSW5zdGFuY2VPZlBvcnQgPigpOworCisJCXN0ZDo6b3N0cmluZ3N0cmVhbSB0ZW1wbGF0ZU5hbWU7CisJCXRlbXBsYXRlTmFtZSA8PCBhUG9ydC0+Z2V0TmFtZUlEKCkKKwkJCQk8PCAiX3RyYWNlIiA8PCB0cmFjZU51bWJlcgorCQkJCTw8ICJfTElOS18iIDw8IGxpbmtOdW1iZXI7CisKKwkJQXJyYXlPZkJGOjpjb25zdF9pdGVyYXRvciBpdCA9IGFQb3J0LT5nZXRQYXJhbWV0ZXJzKCkuYmVnaW4oKTsKKwkJQXJyYXlPZkJGOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IGFQb3J0LT5nZXRQYXJhbWV0ZXJzKCkuZW5kKCk7CisKKwkJaWYoIGFQb3J0LT5oYXNQYXJhbWV0ZXIoKSAmJiBpdCAhPSBlbmRJdCApCisJCXsKKwkJCS8vIHNpZ25hbCBhdmVjIGF1IG1vaW5zIHVuIHBhcmFtw6h0cmUgw6AgYWZmaWNoZXIKKwkJCS8vCisJCQlvc3NUZW1wbGF0ZUxpc3QgPDwgIlx0dGVtcGxhdGUgIiA8PCBhUG9ydC0+Z2V0TmFtZUlEKCkgPDwgIiAiOworCQkJb3NzVGVtcGxhdGVMaXN0IDw8IHRlbXBsYXRlTmFtZS5zdHIoKSA8PCAiIDo9IHsiIDw8IHN0ZDo6ZW5kbDsKKworCQkJYXZtX3NpemVfdCBzaXplVCA9IGFQb3J0LT5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpIC0gMTsKKworCQkJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDAgOyBpdCAhPSBlbmRJdCA7ICsraXQgLCArK29mZnNldCApCisJCQl7CisJCQkJLy8gcGFyYW3DqHRyZSBhbm9ueW1lCisJCQkJaWYoICgqaXQpLmlzPCBCYXNlVHlwZVNwZWNpZmllciA+KCkgKQorCQkJCXsKKwkJCQkJLy8gbGUgbm9tCisJCQkJCW9zc1RlbXBsYXRlTGlzdCA8PCAiXHRcdCIgPDwgInVuYW1lZCI7CisJCQkJCS8vIGxhIHZhbGV1cgorCQkJCQlvc3NUZW1wbGF0ZUxpc3QgPDwgIiA6PSAiIDw8IGFUcmFjZVBvaW50LT52YWwob2Zmc2V0KS5zdHIoKTsKKwkJCQl9CisJCQkJLy8gcGFyYW3DqHRyZSBub21tw6kKKwkJCQllbHNlIGlmKCAoKml0KS5pczwgSW5zdGFuY2VPZkRhdGEgPigpICkKKwkJCQl7CisJCQkJCUluc3RhbmNlT2ZEYXRhICogYVBhcmFtID0gKCppdCkudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCk7CisKKwkJCQkJZm9ybWF0X1RUQ05fVGVtcGxhdGVzKGFUcmFjZVBvaW50LT52YWwob2Zmc2V0KSwKKwkJCQkJCQlhUGFyYW0tPmdldFR5cGVTcGVjaWZpZXIoKSwgYVBhcmFtLT5nZXROYW1lSUQoKSwKKwkJCQkJCQlvZmZzZXQsIHRlbXBsYXRlX1RBQiwgdGVtcGxhdGVfaW5jclRhYik7CisJCQkJfQorCQkJCS8vICNiaW5kIGV4cHJlc3Npb24gcGFyYW1ldGVyCisJCQkJZWxzZQorCQkJCXsKKwkJCQkJLy8gQ2YgQXJuYXVsdCBzaSBjYXMgZXJyZXVyID8/PworCQkJCX0KKworCQkJCW9zc1RlbXBsYXRlTGlzdCA8PCAoKG9mZnNldCsxID49IHNpemVUKSA/ICIiIDogIiwiKSA8PCBzdGQ6OmVuZGw7CisJCQl9CisJCQlvc3NUZW1wbGF0ZUxpc3QgPDwgIlx0fSIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIHNpZ25hbCBzYW5zIHBhcmFtw6h0cmUgw6AgYWZmaWNoZXIKKwkJCS8vCisJCQlvc3NUZW1wbGF0ZUxpc3QgPDwgIlx0dGVtcGxhdGUgIiA8PCBhUG9ydC0+Z2V0TmFtZUlEKCkKKwkJCQkJPDwgIiAiIDw8IHRlbXBsYXRlTmFtZS5zdHIoKSA8PCAiIDo9ID87IgorCQkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCQl9CisKKwkJLy8gVEVTVCBDQVNFUworCQlzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzQWN0aW9uTmFtZTsKKworCQlvc3NBY3Rpb25OYW1lIDw8ICggYVBvcnQtPmhhc1JvdXRpbmdDaGFubmVsKCkgPworCQkJCQlhUG9ydC0+Z2V0Um91dGluZ0NoYW5uZWwoKS0+Z2V0TmFtZUlEKCkgOgorCQkJCQlERUZBVUxUX0VOVklST05NRU5UX0NIQU5ORUwgKQorCQkJCTw8ICggKGFUcmFjZVBvaW50LT5vcCA9PSBBVk1fT1BDT0RFX0lOUFVUX0VOVikgPworCQkJCQkJIl9zZW5kXyIgOiAiX3JlY2VpdmVfIiApIDw8IGFQb3J0LT5nZXROYW1lSUQoKTsKKy8vCisvLwkJb3NzVGVzdGNhc2VMaXN0IDw8ICJcdFx0IiA8PCBvc3NBY3Rpb25OYW1lLnN0cigpCisvLwkJCQk8PCAiKCIgPDwgdGVtcGxhdGVOYW1lLnN0cigpIDw8ICIpIiA8PCBzdGQ6OmVuZGw7CisKKwkJYm9vc3Q6OmZvcm1hdCB3cmFwcGVyRm9ybWF0dGVyKAorCQkJCShhVHJhY2VQb2ludC0+b3AgPT0gQVZNX09QQ09ERV9JTlBVVF9FTlYpID8KKwkJCQkJbVRlc3RjYXNlc1NlbmRpbmdXcmFwcGVyIDogbVRlc3RjYXNlc1JlY2VpdmluZ1dyYXBwZXIpOworCQl3cmFwcGVyRm9ybWF0dGVyLmV4Y2VwdGlvbnMoIGJvb3N0Ojppbzo6bm9fZXJyb3JfYml0cyApOworCisJCW9zc1Rlc3RjYXNlTGlzdCA8PCB3cmFwcGVyRm9ybWF0dGVyCisJCQkJJSBzeXN0ZW1OYW1lCisJCQkJJSAoIGFQb3J0LT5oYXNSb3V0aW5nQ2hhbm5lbCgpID8KKwkJCQkJYVBvcnQtPmdldFJvdXRpbmdDaGFubmVsKCktPmdldE5hbWVJRCgpIDoKKwkJCQkJREVGQVVMVF9FTlZJUk9OTUVOVF9DSEFOTkVMICkKKwkJCQklIGFQb3J0LT5nZXROYW1lSUQoKQorCQkJCSUgdGVtcGxhdGVOYW1lLnN0cigpCisJCQkJPDwgc3RkOjplbmRsOworCisKKworCQlpZiggbm90IGxpc3RPZkFkYXB0YXRpb25Qb3J0RnVuY3Rpb24uY29udGFpbnMob3NzQWN0aW9uTmFtZS5zdHIoKSkgKQorCQl7CisJCQlsaXN0T2ZBZGFwdGF0aW9uUG9ydEZ1bmN0aW9uLmFwcGVuZCggb3NzQWN0aW9uTmFtZS5zdHIoKSApOworCisJCQlib29zdDo6Zm9ybWF0IGFkYXB0YXRpb25Gb3JtYXR0ZXIoCisJCQkJCShhVHJhY2VQb2ludC0+b3AgPT0gQVZNX09QQ09ERV9JTlBVVF9FTlYpID8KKwkJCQkJCW1BZGFwdGF0aW9uU2VuZGluZ0ltcGwgOiBtQWRhcHRhdGlvblJlY2VpdmluZ0ltcGwpOworCQkJYWRhcHRhdGlvbkZvcm1hdHRlci5leGNlcHRpb25zKCBib29zdDo6aW86Om5vX2Vycm9yX2JpdHMgKTsKKworCQkJb3NzQWRhcHRhdGlvbkxpc3QgPDwgYWRhcHRhdGlvbkZvcm1hdHRlcgorCQkJCQklIHN5c3RlbU5hbWUKKwkJCQkJJSAoIGFQb3J0LT5oYXNSb3V0aW5nQ2hhbm5lbCgpID8KKwkJCQkJCWFQb3J0LT5nZXRSb3V0aW5nQ2hhbm5lbCgpLT5nZXROYW1lSUQoKSA6CisJCQkJCQlERUZBVUxUX0VOVklST05NRU5UX0NIQU5ORUwgKQorCQkJCQklIGFQb3J0LT5nZXROYW1lSUQoKQorCQkJCQklIHRlbXBsYXRlTmFtZS5zdHIoKQorCQkJCQk8PCBzdGQ6OmVuZGw7CisJCX0KKworCQkrK2xpbmtOdW1iZXI7CisJfQorfQorCit2b2lkIFRUQ05UaXRhblRyYWNlRm9ybWF0dGVyOjpmb3JtYXRfVFRDTl9UZW1wbGF0ZXMoY29uc3QgQkYgJiB2YWx1ZSwKKwkJQmFzZVR5cGVTcGVjaWZpZXIgKiBhVFMsIHN0ZDo6c3RyaW5nIGFQYXJhbU5hbWUsIGF2bV9zaXplX3QgYW5PZmZzZXQsCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgVEFCLCBjb25zdCBzdGQ6OnN0cmluZyAmIENIQVIpCit7CisJLy8gQWZmaWNoYWdlIGRlICJub20gOj0gIgorCWlmKCAoYVBhcmFtTmFtZVswXSA9PSAnJCcpIHx8IChhUGFyYW1OYW1lWzBdID09ICcjJykgKQorCXsKKwkJc3RkOjpzdHJpbmcgbmV3UGFyYW1OYW1lID0gYVBhcmFtTmFtZS5zdWJzdHIoMSk7CisJCW9zc1RlbXBsYXRlTGlzdCA8PCBUQUIgPDwgInBhcmFtIiA8PCBuZXdQYXJhbU5hbWUgPDwgIiA6PSAiIDsKKwl9CisJZWxzZQorCXsKKwkJb3NzVGVtcGxhdGVMaXN0IDw8IFRBQiA8PCBhUGFyYW1OYW1lIDw8ICIgOj0gIiA7CisJfQorCisJaWYoIGFUUy0+aGFzVHlwZUNvbnRhaW5lcigpICkKKwl7CisJCUNvbnRhaW5lclR5cGVTcGVjaWZpZXIgKiBjb250YWluZXJUID0gYVRTLT5hczwgQ29udGFpbmVyVHlwZVNwZWNpZmllciA+KCk7CisvLwkJYXZtX3NpemVfdCBzaXplVCA9IGNvbnRhaW5lclQtPnNpemUoKTsKKworCQlzd2l0Y2goIGNvbnRhaW5lclQtPmdldFR5cGVTcGVjaWZpZXJLaW5kKCkgKQorCQl7CisJCQljYXNlIFRZUEVfVkVDVE9SX1NQRUNJRklFUjoKKwkJCWNhc2UgVFlQRV9SRVZFUlNFX1ZFQ1RPUl9TUEVDSUZJRVI6CisJCQljYXNlIFRZUEVfTElTVF9TUEVDSUZJRVI6CisJCQljYXNlIFRZUEVfU0VUX1NQRUNJRklFUjoKKwkJCWNhc2UgVFlQRV9GSUZPX1NQRUNJRklFUjoKKwkJCWNhc2UgVFlQRV9MSUZPX1NQRUNJRklFUjoKKwkJCWNhc2UgVFlQRV9NVUxUSV9GSUZPX1NQRUNJRklFUjoKKwkJCWNhc2UgVFlQRV9NVUxUSV9MSUZPX1NQRUNJRklFUjoKKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJb3NzVGVtcGxhdGVMaXN0IDw8IHZhbHVlLnN0cigpOworLy8JCQkJaWYoIG5vdCBhVFMtPmlzVHlwZWRTaW1wbGUoKSApCisvLwkJCQl7CisvLwkJCQkJZm9ybWF0X1RUQ05fVGVtcGxhdGVzKGFUcmFjZVBvaW50LAorLy8JCQkJCQkJY29udGFpbmVyVC0+Z2V0VHlwZVNwZWNpZmllcigpLCBhUGFyYW1OYW1lKTsKKy8vCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWVsc2UgaWYoIGFUUy0+aXNUeXBlZENsYXNzKCkgKQorCXsKKwkJQ2xhc3NUeXBlU3BlY2lmaWVyICogY2xhc3NUeXBlID0gYVRTLT5hczwgQ2xhc3NUeXBlU3BlY2lmaWVyID4oKTsKKwkJYXZtX3NpemVfdCBzaXplVCA9IGNsYXNzVHlwZS0+c2l6ZSgpOworCisJCVN5bWJvbCBhRmllbGQ7CisKKwkJb3NzVGVtcGxhdGVMaXN0IDw8ICJ7IiA8PCBzdGQ6OmVuZGw7CisKKwkJZm9yKCBhdm1fc2l6ZV90IGlkeCA9IDAgOyBpZHggPCBzaXplVCA7ICsraWR4ICkKKwkJeworCQkJYUZpZWxkID0gY2xhc3NUeXBlLT5nZXRTeW1ib2xEYXRhKGlkeCk7CisKKwkJCWZvcm1hdF9UVENOX1RlbXBsYXRlcygKKwkJCQkJdmFsdWUudG9fcHRyPCBBcnJheUJGID4oKS0+YXQoIGlkeCApLAorCQkJCQlhRmllbGQuZ2V0VHlwZVNwZWNpZmllcigpLCBhRmllbGQuZ2V0TmFtZUlEKCksCisJCQkJCWlkeCwgVEFCICsgQ0hBUiwgQ0hBUik7CisKKwkJCW9zc1RlbXBsYXRlTGlzdCA8PCAoKChpZHgrMSkgPT0gc2l6ZVQpID8gIiIgOiAiLCIpIDw8IHN0ZDo6ZW5kbDsKKwkJfQorCisJCW9zc1RlbXBsYXRlTGlzdCA8PCBUQUIgPDwgIn0iOworCX0KKworCWVsc2UgaWYoIGFUUy0+aXNUeXBlZEVudW0oKSApCisJeworCQlFbnVtVHlwZVNwZWNpZmllciAqIGVudW1UID0gYVRTLT5hczwgRW51bVR5cGVTcGVjaWZpZXIgPigpOworCisJCS8vIEFmZmljaGFnZSBkZSBsYSB2YWxldXIgbnVtw6lyaXF1ZQorCQlpZiggdmFsdWUuaW52YWxpZCgpICkKKwkJeworCQkJb3NzVGVtcGxhdGVMaXN0IDw8ICJOVUxMIjsKKwkJfQorCQllbHNlIGlmKCB2YWx1ZS5pczwgQXJyYXlCRiA+KCkgKQorCQl7CisJCQlvc3NUZW1wbGF0ZUxpc3QgPDwgIkFSUkFZPD8+IjsKKwkJfQorCQllbHNlIGlmKCB2YWx1ZS5pczwgSW5zdGFuY2VPZkRhdGEgPigpICkKKwkJeworCQkJSW5zdGFuY2VPZkRhdGEgKiBhU3ltYm9sID0gdmFsdWUudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCk7CisKKwkJCWlmKCBub3QgZW51bVQtPmhhc1N5bWJvbERhdGEoYVN5bWJvbCkgKQorCQkJeworCQkJCUFWTV9PU19FUlJPUl9BTEVSVAorCQkJCQkJPDwgIlRUQ05UaXRhblRyYWNlRm9ybWF0dGVyOjpmb3JtYXRfVFRDTl9UZW1wbGF0ZXMiCisJCQkJCQk8PCAiIDo+IFVuZXhwZWN0ZWQgc3ltYm9sXG48PCAiIDw8IHN0cl9oZWFkZXIoIGFTeW1ib2wgKQorCQkJCQkJPDwgIiA+PlxuZm9yIHRoZSBlbnVtIHR5cGUgPDwgIgorCQkJCQkJPDwgZW51bVQtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIiA+PiAhISEiCisJCQkJCQk8PCBTRU5EX0FMRVJUOworCQkJfQorCisJCQlvc3NUZW1wbGF0ZUxpc3QgPDwgYVN5bWJvbC0+Z2V0TmFtZUlEKCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQljb25zdCBTeW1ib2wgJiBhU3ltYm9sID0gZW51bVQtPmdldFN5bWJvbERhdGFCeVZhbHVlKHZhbHVlKTsKKwkJCWlmKCBhU3ltYm9sLnZhbGlkKCkgKQorCQkJeworCQkJCW9zc1RlbXBsYXRlTGlzdCA8PCBhU3ltYm9sLmdldE5hbWVJRCgpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUFWTV9PU19FUlJPUl9BTEVSVAorCQkJCQkJPDwgIlRUQ05UaXRhblRyYWNlRm9ybWF0dGVyOjpmb3JtYXRfVFRDTl9UZW1wbGF0ZXMiCisJCQkJCQkJIiA6PlxuVW5leHBlY3RlZCBzeW1ib2wgdmFsdWUgPDwgIgorCQkJCQkJPDwgdmFsdWUuc3RyKCkgPDwgIiA+PiBmb3IgdGhlIGVudW0gdHlwZSA8PCAiCisJCQkJCQk8PCBlbnVtVC0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJCQkJPDwgIiA+PiBmb3IgdGhlIHBhcmFtZXRlciA8PCBwYXJhbSIKKwkJCQkJCTw8IGFQYXJhbU5hbWUgPDwgIiA+PiAhISEiCisJCQkJCQk8PCBTRU5EX0FMRVJUOworCisJCQkJb3NzVGVtcGxhdGVMaXN0IDw8IGVudW1ULT5nZXROYW1lSUQoKQorCQkJCQkJPDwgIlsgIiA8PCB2YWx1ZS5zdHIoKSA8PCAiIF0iOworCQkJfQorCQl9CisJfQorCisJZWxzZSBpZiggdmFsdWUuaXM8IENoYXJhY3RlciA+KCkgKQorCXsKKwkJLy8gT24gcmVtcGxhY2UgJ3gnIHBhciAieCIKKwkJb3NzVGVtcGxhdGVMaXN0IDw8IHZhbHVlLnRvX3B0cjwgQ2hhcmFjdGVyID4oKS0+c3RyQ2hhcignIicpOworCX0KKwllbHNlIC8vaWYoIGFUUy0+aXNUeXBlZFNpbXBsZSgpICkKKwl7CisJCS8vIEFmZmljaGFnZSBkZSBsYSB2YWxldXIgbnVtw6lyaXF1ZQorCQlpZiggdmFsdWUuaW52YWxpZCgpICkKKwkJeworCQkJb3NzVGVtcGxhdGVMaXN0IDw8ICJOVUxMIjsKKwkJfQorCQllbHNlIGlmKCB2YWx1ZS5pczwgQXJyYXlCRiA+KCkgKQorCQl7CisJCQlvc3NUZW1wbGF0ZUxpc3QgPDwgdmFsdWUudG9fcHRyPCBBcnJheUJGID4oKS0+YXQoIGFuT2Zmc2V0ICkuc3RyKCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlvc3NUZW1wbGF0ZUxpc3QgPDwgdmFsdWUuc3RyKCk7CisJCX0KKwl9Cit9CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vdHJhY2UvVFRDTlRpdGFuVHJhY2VGb3JtYXR0ZXIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS90cmFjZS9UVENOVGl0YW5UcmFjZUZvcm1hdHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZjEwNzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vdHJhY2UvVFRDTlRpdGFuVHJhY2VGb3JtYXR0ZXIuaApAQCAtMCwwICsxLDI2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDYgamFudi4gMjAxNAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFRUQ05USVRBTlRSQUNFRk9STUFUVEVSX0hfCisjZGVmaW5lIFRUQ05USVRBTlRSQUNFRk9STUFUVEVSX0hfCisKKyNpbmNsdWRlICJBYnN0cmFjdFRyYWNlRm9ybWF0dGVyLmgiCisKKyNpbmNsdWRlIDxjb2xsZWN0aW9uL0xpc3QuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworY2xhc3MgQXZtVHJhY2VHZW5lcmF0b3I7CisKK2NsYXNzIEJGOworY2xhc3MgQmFzZVR5cGVTcGVjaWZpZXI7CisKK2NsYXNzIEV4ZWN1dGlvbkRhdGE7CisKK2NsYXNzIFRyYWNlTWFuYWdlcjsKK2NsYXNzIFRyYWNlUG9pbnQ7CitjbGFzcyBUcmFjZVNlcXVlbmNlOworCisKK2NsYXNzIFRUQ05UaXRhblRyYWNlRm9ybWF0dGVyICA6ICBwdWJsaWMgQWJzdHJhY3RUcmFjZUZvcm1hdHRlcgoreworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQ09OU1RBTlRTCisJICogREVGQVVMVCBQUk9GSUxFCisJICovCisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgREVGQVVMVF9FTlZJUk9OTUVOVF9DSEFOTkVMOworCisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgREVGQVVMVF9URVNUQ0FTRVNfU1RBUlRJTkdfV1JBUFBFUjsKKworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIERFRkFVTFRfVEVTVENBU0VTX0VORElOR19XUkFQUEVSOworCisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgREVGQVVMVF9URVNUQ0FTRVNfU1RBUlRJTkdfRU5ESU5HX0lNUEw7CisKKworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIERFRkFVTFRfVEVTVENBU0VTX1NFTkRJTkdfV1JBUFBFUjsKKworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIERFRkFVTFRfVEVTVENBU0VTX1NFTkRJTkdfSU1QTDsKKworCisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgREVGQVVMVF9URVNUQ0FTRVNfUkVDRUlWSU5HX1dSQVBQRVI7CisKKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBERUZBVUxUX1RFU1RDQVNFU19SRUNFSVZJTkdfSU1QTDsKKworCisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgREVGQVVMVF9BREFQVEFUSU9OX1VUSUxTX0lNUEw7CisKKworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogVFlQRURFRgorCSAqLworCXR5cGVkZWYgTGlzdDwgQmFzZVR5cGVTcGVjaWZpZXIgKiA+IExpc3RPZkJhc2VUeXBlU3BlY2lmaWVyOworCisJdHlwZWRlZiBMaXN0PCBzdGQ6OnN0cmluZyA+ICBMaXN0T2ZTdHJpbmc7CisKKworCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlUcmFjZVNlcXVlbmNlICogYVRyYWNlRWxlbWVudDsKKwlpbnQgdHJhY2VOdW1iZXI7CisJaW50IGxpbmtOdW1iZXI7CisKKwlzdGQ6OnN0cmluZyBzeXN0ZW1OYW1lOworCisJc3RkOjpzdHJpbmcgbURlY2xhcmF0aW9uc01vZHVsZU5hbWU7CisJc3RkOjpzdHJpbmcgbVRlbXBsYXRlc01vZHVsZU5hbWU7CisJc3RkOjpzdHJpbmcgbUFkYXB0YXRpb25Nb2R1bGVOYW1lOworCXN0ZDo6c3RyaW5nIG1UZXN0Y2FzZXNNb2R1bGVOYW1lOworCXN0ZDo6c3RyaW5nIG1Db250cm9sTW9kdWxlTmFtZTsKKworCXN0ZDo6c3RyaW5nIG1UZXN0Y2FzZXNTdGFydGluZ1dyYXBwZXI7CisJc3RkOjpzdHJpbmcgbVRlc3RjYXNlc0VuZGluZ1dyYXBwZXI7CisJc3RkOjpzdHJpbmcgbVRlc3RjYXNlc1NlbmRpbmdXcmFwcGVyOworCXN0ZDo6c3RyaW5nIG1UZXN0Y2FzZXNSZWNlaXZpbmdXcmFwcGVyOworCisJc3RkOjpzdHJpbmcgbUFkYXB0YXRpb25VdGlsc0ltcGw7CisJc3RkOjpzdHJpbmcgbUFkYXB0YXRpb25TdGFydGluZ0VuZGluZ0ltcGw7CisJc3RkOjpzdHJpbmcgbUFkYXB0YXRpb25TZW5kaW5nSW1wbDsKKwlzdGQ6OnN0cmluZyBtQWRhcHRhdGlvblJlY2VpdmluZ0ltcGw7CisKKworLy8gISEhIE1vZGlmIEFGQSAtIDIzLzA1LzIwMTYgISEhCisvLwlMaXN0T2ZJbnN0YW5jZU9mUG9ydCBsaXN0T2ZUcmVhdGVkU2lnbmFsOworCUxpc3RPZlN0cmluZyBsaXN0T2ZUcmVhdGVkU2lnbmFsTmFtZTsKKworCUxpc3RPZkJhc2VUeXBlU3BlY2lmaWVyIGxpc3RPZlRyZWF0ZWRUeXBlOworCisJc3RkOjpvc3RyaW5nc3RyZWFtIG1vZHVsZV9UVENOX0RlY2xhcmF0aW9uczsKKwlzdGQ6Om9zdHJpbmdzdHJlYW0gbW9kdWxlX1RUQ05fVGVtcGxhdGVzOworCXN0ZDo6b3N0cmluZ3N0cmVhbSBtb2R1bGVfVFRDTl9BZGFwdGF0aW9uOworCXN0ZDo6b3N0cmluZ3N0cmVhbSBtb2R1bGVfVFRDTl9UZXN0c0FuZENvbnRyb2w7CisJc3RkOjpvc3RyaW5nc3RyZWFtIG1vZHVsZV9UVENOX0NvbnRyb2xQYXJ0OworCisJc3RkOjpvc3RyaW5nc3RyZWFtIG5ld1R5cGVzRGVjbGFyYXRpb247CisKKwlzdGQ6Om9zdHJpbmdzdHJlYW0gcmVjb3Jkc0RlY2xhcmF0aW9uOworCisJc3RkOjpvc3RyaW5nc3RyZWFtIHBvcnRzRGVjbGFyYXRpb247CisKKwlzdGQ6Om9zdHJpbmdzdHJlYW0gY2hhbm5lbHNEZWZpbml0aW9uOworCXN0ZDo6b3N0cmluZ3N0cmVhbSBjaGFubmVsc0RlY2xhcmF0aW9uOworCUxpc3RPZlN0cmluZyBMaXN0T2ZDaGFubmVsTmFtZTsKKworCUxpc3RPZlN0cmluZyBsaXN0T2ZBZGFwdGF0aW9uUG9ydEZ1bmN0aW9uOworCisJc3RkOjpvc3RyaW5nc3RyZWFtIG9zc1RlbXBsYXRlTGlzdDsKKwlzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzQWRhcHRhdGlvbkxpc3Q7CisJc3RkOjpvc3RyaW5nc3RyZWFtIG9zc1Rlc3RjYXNlTGlzdDsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJVFRDTlRpdGFuVHJhY2VGb3JtYXR0ZXIoQXZtVHJhY2VHZW5lcmF0b3IgJiBhVHJhY2VHZW5lcmF0b3IpCisJOiBBYnN0cmFjdFRyYWNlRm9ybWF0dGVyKCBhVHJhY2VHZW5lcmF0b3IgKSwKKwlhVHJhY2VFbGVtZW50KCBOVUxMICksCisJdHJhY2VOdW1iZXIoIDEgKSwKKwlsaW5rTnVtYmVyKCAwICksCisKKwlzeXN0ZW1OYW1lKCApLAorCisJbURlY2xhcmF0aW9uc01vZHVsZU5hbWUoICJUVENOX0RlY2xhcmF0aW9ucyIgKSwKKwltVGVtcGxhdGVzTW9kdWxlTmFtZSggIlRUQ05fVGVtcGxhdGVzIiApLAorCW1BZGFwdGF0aW9uTW9kdWxlTmFtZSggIlRUQ05fQWRhcHRhdGlvbiIgKSwKKwltVGVzdGNhc2VzTW9kdWxlTmFtZSggIlRUQ05fVGVzdHNBbmRDb250cm9sIiApLAorCW1Db250cm9sTW9kdWxlTmFtZSggIlRUQ05fQ29udHJvbFBhcnQiICksCisKKwltVGVzdGNhc2VzU3RhcnRpbmdXcmFwcGVyICggREVGQVVMVF9URVNUQ0FTRVNfU1RBUlRJTkdfV1JBUFBFUiAgKSwKKwltVGVzdGNhc2VzRW5kaW5nV3JhcHBlciAgICggREVGQVVMVF9URVNUQ0FTRVNfRU5ESU5HX1dSQVBQRVIgICAgKSwKKwltVGVzdGNhc2VzU2VuZGluZ1dyYXBwZXIgICggREVGQVVMVF9URVNUQ0FTRVNfU0VORElOR19XUkFQUEVSICAgKSwKKwltVGVzdGNhc2VzUmVjZWl2aW5nV3JhcHBlciggREVGQVVMVF9URVNUQ0FTRVNfUkVDRUlWSU5HX1dSQVBQRVIgKSwKKworCW1BZGFwdGF0aW9uVXRpbHNJbXBsKCBERUZBVUxUX0FEQVBUQVRJT05fVVRJTFNfSU1QTCApLAorCisJbUFkYXB0YXRpb25TdGFydGluZ0VuZGluZ0ltcGwoIERFRkFVTFRfVEVTVENBU0VTX1NUQVJUSU5HX0VORElOR19JTVBMICksCisJbUFkYXB0YXRpb25TZW5kaW5nSW1wbCggREVGQVVMVF9URVNUQ0FTRVNfU0VORElOR19JTVBMICksCisJbUFkYXB0YXRpb25SZWNlaXZpbmdJbXBsKCBERUZBVUxUX1RFU1RDQVNFU19SRUNFSVZJTkdfSU1QTCApLAorCisKKy8vICEhISBNb2RpZiBBRkEgLSAyMy8wNS8yMDE2ICEhIQorLy8JbGlzdE9mVHJlYXRlZFNpZ25hbCggKSwKKwlsaXN0T2ZUcmVhdGVkVHlwZSggKSwKKworCW1vZHVsZV9UVENOX0RlY2xhcmF0aW9ucyggKSwKKwltb2R1bGVfVFRDTl9UZW1wbGF0ZXMoICksCisJbW9kdWxlX1RUQ05fQWRhcHRhdGlvbiggKSwKKwltb2R1bGVfVFRDTl9UZXN0c0FuZENvbnRyb2woICksCisJbW9kdWxlX1RUQ05fQ29udHJvbFBhcnQoICksCisKKwluZXdUeXBlc0RlY2xhcmF0aW9uKCApLAorCisJcmVjb3Jkc0RlY2xhcmF0aW9uKCApLAorCisJcG9ydHNEZWNsYXJhdGlvbiggKSwKKwljaGFubmVsc0RlZmluaXRpb24oICksCisJY2hhbm5lbHNEZWNsYXJhdGlvbiggKSwKKworCWxpc3RPZkFkYXB0YXRpb25Qb3J0RnVuY3Rpb24oICksCisKKwlvc3NUZW1wbGF0ZUxpc3QoICksCisJb3NzQWRhcHRhdGlvbkxpc3QoICksCisJb3NzVGVzdGNhc2VMaXN0KCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+VFRDTlRpdGFuVHJhY2VGb3JtYXR0ZXIoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQ09ORklHVVJFIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWJvb2wgY29uZmlndXJlSW1wbChXT2JqZWN0ICogd2ZQYXJhbWV0ZXJPYmplY3QpOworCisJYm9vbCBjb25maWd1cmVGb3JtYXR0ZXIoCisJCQlXT2JqZWN0ICogRk9STUFULCBzdGQ6OnN0cmluZyAmIGZvcm1hdFBhdHRlcm4sCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGlkLCBib29sIGlzUmVnZXggPSBmYWxzZSk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBGT1JNQVQgQVBJCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwl2b2lkIGZvcm1hdChUcmFjZU1hbmFnZXIgJiBhVHJhY2VNYW5hZ2VyKTsKKworCXZvaWQgZm9ybWF0X2ltcGwoVHJhY2VNYW5hZ2VyICYgYVRyYWNlTWFuYWdlcik7CisKKworCXZvaWQgZm9ybWF0SGVhZGVyX1RUQ05fRGVjbGFyYXRpb25zKHN0ZDo6b3N0cmVhbSAmIG9zKTsKKwl2b2lkIGZvcm1hdEVuZF9UVENOX0RlY2xhcmF0aW9ucyhzdGQ6Om9zdHJlYW0gJiBvcyk7CisJdm9pZCBmb3JtYXRfVFRDTl9EZWNsYXJhdGlvbnMoVHJhY2VTZXF1ZW5jZSAqIGFUcmFjZUVsdCk7CisJdm9pZCBmb3JtYXRfVFRDTl9EZWNsYXJhdGlvbnMoVHJhY2VQb2ludCAqIGFUcmFjZVBvaW50KTsKKwl2b2lkIGZvcm1hdF9UVENOX0RlY2xhcmF0aW9ucyhUcmFjZVBvaW50ICogYVRyYWNlUG9pbnQsCisJCQlCYXNlVHlwZVNwZWNpZmllciAqIGFUUywgc3RkOjpzdHJpbmcgdHlwZU5hbWUpOworCisJdm9pZCBmb3JtYXRfVFRDTl9EZWNsYXJhdGlvbnNDaGFubmVscygpOworCisJdm9pZCBmb3JtYXRIZWFkZXJfVFRDTl9UZW1wbGF0ZXMoc3RkOjpvc3RyZWFtICYgb3MpOworCXZvaWQgZm9ybWF0RW5kX1RUQ05fVGVtcGxhdGVzKHN0ZDo6b3N0cmVhbSAmIG9zKTsKKwl2b2lkIGZvcm1hdF9UVENOX1RlbXBsYXRlcygKKwkJCWNvbnN0IEJGICYgdmFsdWUsIEJhc2VUeXBlU3BlY2lmaWVyICogYVRTLAorCQkJc3RkOjpzdHJpbmcgdHlwZU5hbWUsIGF2bV9zaXplX3QgYW5PZmZzZXQsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIFRBQiwgY29uc3Qgc3RkOjpzdHJpbmcgJiBDSEFSKTsKKworCXZvaWQgZm9ybWF0SGVhZGVyX1RUQ05fQWRhcHRhdGlvbihzdGQ6Om9zdHJlYW0gJiBvcyk7CisJdm9pZCBmb3JtYXRFbmRfVFRDTl9BZGFwdGF0aW9uKHN0ZDo6b3N0cmVhbSAmIG9zKTsKKworCisJdm9pZCBmb3JtYXRIZWFkZXJfVFRDTl9UZXN0c0FuZENvbnRyb2woc3RkOjpvc3RyZWFtICYgb3MpOworCXZvaWQgZm9ybWF0RW5kX1RUQ05fVGVzdHNBbmRDb250cm9sKHN0ZDo6b3N0cmVhbSAmIG9zKTsKKworCXZvaWQgZm9ybWF0SGVhZGVyX1RUQ05fVGVzdHNBbmRDb250cm9sX3Rlc3RjYXNlKHN0ZDo6b3N0cmVhbSAmIG9zKTsKKwl2b2lkIGZvcm1hdEVuZF9UVENOX1Rlc3RzQW5kQ29udHJvbF90ZXN0Y2FzZShzdGQ6Om9zdHJlYW0gJiBvcyk7CisKKwl2b2lkIGZvcm1hdEhlYWRlcl9UVENOX0NvbnRyb2xQYXJ0KHN0ZDo6b3N0cmVhbSAmIG9zKTsKKwl2b2lkIGZvcm1hdEVuZF9UVENOX0NvbnRyb2xQYXJ0KHN0ZDo6b3N0cmVhbSAmIG9zKTsKKwl2b2lkIGZvcm1hdF9UVENOX0NvbnRyb2xQYXJ0X2V4ZWN1dGUoc3RkOjpvc3RyZWFtICYgb3MpOworCisJdm9pZCBmb3JtYXRfVFRDTl9UcmFjZShUcmFjZVNlcXVlbmNlICogYVRyYWNlRWx0KTsKKwl2b2lkIGZvcm1hdF9UVENOX1RyYWNlKFRyYWNlUG9pbnQgKiBhVHJhY2VQb2ludCk7CisKK307CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKiBUVENOVElUQU5UUkFDRUZPUk1BVFRFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3RyYWNlL1RUQ05UcmFjZUZvcm1hdHRlci5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vdHJhY2UvVFRDTlRyYWNlRm9ybWF0dGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjdiY2ZlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3RyYWNlL1RUQ05UcmFjZUZvcm1hdHRlci5jcHAKQEAgLTAsMCArMSwxMDg0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogNiBqYW52LiAyMDE0CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFsYWluIEZhaXZyZSAoQ0VBIExJU1QpIGFsYWluLmZhaXZyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJUVENOVHJhY2VGb3JtYXR0ZXIuaCIKKworI2luY2x1ZGUgIlRyYWNlTWFuYWdlci5oIgorCisjaW5jbHVkZSA8Y29tbW9uL1NlcmlhbGl6ZXJGZWF0dXJlLmg+CisKKyNpbmNsdWRlIDxmYW0vdHJhY2UvQXZtVHJhY2VHZW5lcmF0b3IuaD4KKworI2luY2x1ZGUgPGZtbC9jb21tb24vTW9kaWZpZXJFbGVtZW50Lmg+CisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9Bdm1Qcm9ncmFtLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZUZvcm0uaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlU3lzdGVtLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZlBvcnQuaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25UeXBlQ2hlY2tlci5oPgorCisjaW5jbHVkZSA8Zm1sL3N5bWJvbC9UYWJsZU9mU3ltYm9sLmg+CisKKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25EYXRhLmg+CisKKyNpbmNsdWRlIDxmbWwvdHJhY2UvVHJhY2VQb2ludC5oPgorI2luY2x1ZGUgPGZtbC90cmFjZS9UcmFjZVNlcXVlbmNlLmg+CisKKyNpbmNsdWRlIDxmbWwvdHlwZS9CYXNlVHlwZVNwZWNpZmllci5oPgorI2luY2x1ZGUgPGZtbC90eXBlL0NsYXNzVHlwZVNwZWNpZmllci5oPgorI2luY2x1ZGUgPGZtbC90eXBlL0NvbnRhaW5lclR5cGVTcGVjaWZpZXIuaD4KKyNpbmNsdWRlIDxmbWwvdHlwZS9FbnVtVHlwZVNwZWNpZmllci5oPgorI2luY2x1ZGUgPGZtbC90eXBlL0ludGVydmFsVHlwZVNwZWNpZmllci5oPgorI2luY2x1ZGUgPGZtbC90eXBlL1R5cGVBbGlhc1NwZWNpZmllci5oPgorCisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1F1ZXJ5Lmg+CisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1dPYmplY3QuaD4KKworI2luY2x1ZGUgPHNldy9Db25maWd1cmF0aW9uLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qCitwcm90b3R5cGUgcHJvY2Vzczo6dHJhY2VfZ2VuZXJhdG9yIGFzICZhdm06OnByb2Nlc3Nvci5UUkFDRV9HRU5FUkFUT1IgaXMKKyBzZWN0aW9uIFJFUE9SVAorICAuLi4KK2VuZHNlY3Rpb24gUkVQT1JUCisKKyBzZWN0aW9uIFBST1BFUlRZCisgIC8vICdPTUVHQScgfCAnQ1ZDNCcgfCAnWjMnIHwgJ1lJQ0VTJworICBAc29sdmVyID0gJ1ozJzsKKworICAvLyAnQkFTSUMnIHwgJ1RUQ04nIHwgJ1RUQ04jU0RMJyB8ICdUVENOI1hMSUEnCisgIEBmb3JtYXQgPSAnQkFTSUMnOworIGVuZHNlY3Rpb24gUFJPUEVSVFkKKworIHNlY3Rpb24gVFJBQ0UKKyAgLi4uCisgZW5kc2VjdGlvbiBGT1JNQVQKK2VuZHByb3RvdHlwZQorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENPTkZJR1VSRSBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgVFRDTlRyYWNlRm9ybWF0dGVyOjpjb25maWd1cmVJbXBsKFdPYmplY3QgKiB3ZlBhcmFtZXRlck9iamVjdCkKK3sKKwlXT2JqZWN0ICogdGhlUFJPUEVSVFkgPSBRdWVyeTo6Z2V0UmVnZXhXU2VxdWVuY2UoCisJCQl3ZlBhcmFtZXRlck9iamVjdCwgT1JfV0lEMigicHJvcGVydHkiLCAiUFJPUEVSVFkiKSk7CisKKwlpZiggdGhlUFJPUEVSVFkgPT0gV09iamVjdDo6X05VTExfICkKKwl7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlzdGQ6OnN0cmluZyBmb3JtYXQgPQorCQkJUXVlcnk6OmdldFdQcm9wZXJ0eVN0cmluZyh0aGVQUk9QRVJUWSwgImZvcm1hdCIsICJUVENOLlNETCIpOworCisJaXNTRExGbGFnID0gKCBmb3JtYXQuZmluZCgiU0RMIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKTsKKworCXJldHVybiB0cnVlOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBGT1JNQVQgQVBJCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIFRUQ05UcmFjZUZvcm1hdHRlcjo6Zm9ybWF0KFRyYWNlTWFuYWdlciAmIGFUcmFjZU1hbmFnZXIpCit7CisJZm9ybWF0X2ltcGwoYVRyYWNlTWFuYWdlcik7CisKKwkvLyBHZW5lcmF0aW9uIGRlcyBmaWNoaWVycyBUVENOXworCS8vCisJc3RkOjpzdHJpbmcgVFRDTl9mb2xkZXIgPSBtVHJhY2VHZW5lcmF0b3IuZ2V0TGFzdEZvbGRlcigpLmxvY2F0aW9uOworCXN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlIHRoZU9wZW5Nb2RlID0gc3RkOjppb3NfYmFzZTo6b3V0OworCXN0ZDo6b3N0cmluZ3N0cmVhbSBvc3NTY2VuYXJpb0ZpbGVVUkw7CisKKwlvc3NTY2VuYXJpb0ZpbGVVUkwgPDwgVFRDTl9mb2xkZXIgPDwgIi9UVENOX0RlY2xhcmF0aW9ucy50dGNuMyI7CisJc3RkOjpvZnN0cmVhbSBmaWxlU3RyZWFtMShvc3NTY2VuYXJpb0ZpbGVVUkwuc3RyKCkuY19zdHIoKSwgdGhlT3Blbk1vZGUpOworCWlmICggZmlsZVN0cmVhbTEuaXNfb3BlbigpICkKKwl7CisJCWZpbGVTdHJlYW0xIDw8IG1vZHVsZV9UVENOX0RlY2xhcmF0aW9ucy5zdHIoKSA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCQlmaWxlU3RyZWFtMS5jbG9zZSgpOworCX0KKworCW9zc1NjZW5hcmlvRmlsZVVSTC5zdHIoIiIpOworCW9zc1NjZW5hcmlvRmlsZVVSTCA8PCBUVENOX2ZvbGRlciA8PCAiL1RUQ05fVGVtcGxhdGVzLnR0Y24zIjsKKwlzdGQ6Om9mc3RyZWFtIGZpbGVTdHJlYW0yKG9zc1NjZW5hcmlvRmlsZVVSTC5zdHIoKS5jX3N0cigpLCB0aGVPcGVuTW9kZSk7CisJaWYgKCBmaWxlU3RyZWFtMi5pc19vcGVuKCkgKQorCXsKKwkJZmlsZVN0cmVhbTIgPDwgbW9kdWxlX1RUQ05fVGVtcGxhdGVzLnN0cigpIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisJCWZpbGVTdHJlYW0yLmNsb3NlKCk7CisJfQorCisJb3NzU2NlbmFyaW9GaWxlVVJMLnN0cigiIik7CisJb3NzU2NlbmFyaW9GaWxlVVJMIDw8IFRUQ05fZm9sZGVyIDw8ICIvVFRDTl9UZXN0c0FuZENvbnRyb2wudHRjbjMiOworCXN0ZDo6b2ZzdHJlYW0gZmlsZVN0cmVhbTMob3NzU2NlbmFyaW9GaWxlVVJMLnN0cigpLmNfc3RyKCksIHRoZU9wZW5Nb2RlKTsKKwlpZiAoIGZpbGVTdHJlYW0zLmlzX29wZW4oKSApCisJeworCQlmaWxlU3RyZWFtMyA8PCBtb2R1bGVfVFRDTl9UZXN0c0FuZENvbnRyb2wuc3RyKCkKKwkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCQlmaWxlU3RyZWFtMy5jbG9zZSgpOworCX0KKworCW9zc1NjZW5hcmlvRmlsZVVSTC5zdHIoIiIpOworCW9zc1NjZW5hcmlvRmlsZVVSTCA8PCBUVENOX2ZvbGRlciA8PCAiL1RUQ05fQ29udHJvbFBhcnQudHRjbjMiOworCXN0ZDo6b2ZzdHJlYW0gZmlsZVN0cmVhbTQob3NzU2NlbmFyaW9GaWxlVVJMLnN0cigpLmNfc3RyKCksIHRoZU9wZW5Nb2RlKTsKKwlpZiAoIGZpbGVTdHJlYW00LmlzX29wZW4oKSApCisJeworCQlmaWxlU3RyZWFtNCA8PCBtb2R1bGVfVFRDTl9Db250cm9sUGFydC5zdHIoKSA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCQlmaWxlU3RyZWFtNC5jbG9zZSgpOworCX0KKworCS8vIEFmZmljaGFnZSBkZXMgcmVzdWx0YXRzIGRhbnMgbGUgZmljaGllciB0dGNuL3RyYWNlCisJLy8KKwlvc3NTY2VuYXJpb0ZpbGVVUkwuc3RyKCIiKTsKKwlvc3NTY2VuYXJpb0ZpbGVVUkwgPDwgVFRDTl9mb2xkZXIgPDwgIi9UVENOX2dsb2JhbC50dGNuMyI7CisJc3RkOjpvZnN0cmVhbSBmaWxlU3RyZWFtNShvc3NTY2VuYXJpb0ZpbGVVUkwuc3RyKCkuY19zdHIoKSwgdGhlT3Blbk1vZGUpOworCWlmICggZmlsZVN0cmVhbTUuaXNfb3BlbigpICkKKwl7CisJCWZpbGVTdHJlYW01IDw8ICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIiA8PCBzdGQ6OmVuZGw7CisJCWZpbGVTdHJlYW01IDw8ICIgICAgICAgICAgbW9kdWxlX1RUQ05fRGVjbGFyYXRpb25zICAgICAgICAgICAgICAgICAgIiA8PCBzdGQ6OmVuZGw7CisJCWZpbGVTdHJlYW01IDw8ICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIiA8PCBzdGQ6OmVuZGw7CisJCWZpbGVTdHJlYW01IDw8IG1vZHVsZV9UVENOX0RlY2xhcmF0aW9ucy5zdHIoKSA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCQlmaWxlU3RyZWFtNSA8PCAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIgPDwgc3RkOjplbmRsOworCQlmaWxlU3RyZWFtNSA8PCAiICAgICAgICAgIG1vZHVsZV9UVENOX1RlbXBsYXRlcyAgICAgICAgICAgICAgICAgICAgICIgPDwgc3RkOjplbmRsOworCQlmaWxlU3RyZWFtNSA8PCAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIgPDwgc3RkOjplbmRsOworCQlmaWxlU3RyZWFtNSA8PCBtb2R1bGVfVFRDTl9UZW1wbGF0ZXMuc3RyKCkgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKwkJZmlsZVN0cmVhbTUgPDwgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiIDw8IHN0ZDo6ZW5kbDsKKwkJZmlsZVN0cmVhbTUgPDwgIiAgICAgICAgICBtb2R1bGVfVFRDTl9UZXN0c0FuZENvbnRyb2wgICAgICAgICAgICAgICAiIDw8IHN0ZDo6ZW5kbDsKKwkJZmlsZVN0cmVhbTUgPDwgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiIDw8IHN0ZDo6ZW5kbDsKKwkJZmlsZVN0cmVhbTUgPDwgbW9kdWxlX1RUQ05fVGVzdHNBbmRDb250cm9sLnN0cigpIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisJCWZpbGVTdHJlYW01IDw8ICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIiA8PCBzdGQ6OmVuZGw7CisJCWZpbGVTdHJlYW01IDw8ICIgICAgICAgICAgbW9kdWxlX1RUQ05fQ29udHJvbFBhcnQgICAgICAgICAgICAgICAgICAgIiA8PCBzdGQ6OmVuZGw7CisJCWZpbGVTdHJlYW01IDw8ICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIiA8PCBzdGQ6OmVuZGw7CisJCWZpbGVTdHJlYW01IDw8IG1vZHVsZV9UVENOX0NvbnRyb2xQYXJ0LnN0cigpIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisJCWZpbGVTdHJlYW01LmNsb3NlKCk7CisJfQorCisJbVRyYWNlR2VuZXJhdG9yLmJlZ2luU3RyZWFtKCk7CisJd2hpbGUoIG1UcmFjZUdlbmVyYXRvci5oYXNTdHJlYW0oKSApCisJeworCQlPdXRTdHJlYW0gJiBvcyA9IG1UcmFjZUdlbmVyYXRvci5jdXJyZW50U3RyZWFtKCk7CisKK0FWTV9JRl9ERUJVR19GTEFHKCBQUk9DRVNTT1IgKQorCWFUcmFjZU1hbmFnZXIudG9TdHJlYW0oIG9zICk7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggUFJPQ0VTU09SICkKKworCQlvcyA8PCAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIgPDwgc3RkOjplbmRsOworCQlvcyA8PCAiICAgICAgICAgIG1vZHVsZV9UVENOX0RlY2xhcmF0aW9ucyAgICAgICAgICAgICAgICAgICIgPDwgc3RkOjplbmRsOworCQlvcyA8PCAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIgPDwgc3RkOjplbmRsOworCQlvcyA8PCBtb2R1bGVfVFRDTl9EZWNsYXJhdGlvbnMuc3RyKCkgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKwkJb3MgPDwgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiIDw8IHN0ZDo6ZW5kbDsKKwkJb3MgPDwgIiAgICAgICAgICBtb2R1bGVfVFRDTl9UZW1wbGF0ZXMgICAgICAgICAgICAgICAgICAgICAiIDw8IHN0ZDo6ZW5kbDsKKwkJb3MgPDwgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiIDw8IHN0ZDo6ZW5kbDsKKwkJb3MgPDwgbW9kdWxlX1RUQ05fVGVtcGxhdGVzLnN0cigpIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisJCW9zIDw8ICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIiA8PCBzdGQ6OmVuZGw7CisJCW9zIDw8ICIgICAgICAgICAgbW9kdWxlX1RUQ05fVGVzdHNBbmRDb250cm9sICAgICAgICAgICAgICAgIiA8PCBzdGQ6OmVuZGw7CisJCW9zIDw8ICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIiA8PCBzdGQ6OmVuZGw7CisJCW9zIDw8IG1vZHVsZV9UVENOX1Rlc3RzQW5kQ29udHJvbC5zdHIoKSA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCQlvcyA8PCAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIgPDwgc3RkOjplbmRsOworCQlvcyA8PCAiICAgICAgICAgIG1vZHVsZV9UVENOX0NvbnRyb2xQYXJ0ICAgICAgICAgICAgICAgICAgICIgPDwgc3RkOjplbmRsOworCQlvcyA8PCAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIgPDwgc3RkOjplbmRsOworCQlvcyA8PCBtb2R1bGVfVFRDTl9Db250cm9sUGFydC5zdHIoKSA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCX0KKworCW1UcmFjZUdlbmVyYXRvci5jbG9zZVN0cmVhbSgpOworfQorCit2b2lkIFRUQ05UcmFjZUZvcm1hdHRlcjo6Zm9ybWF0X2ltcGwoVHJhY2VNYW5hZ2VyICYgYVRyYWNlTWFuYWdlcikKK3sKKwkvLyBOb20gZHUgc3lzdGVtCisJc3lzdGVtTmFtZSA9IG1UcmFjZUdlbmVyYXRvci4KKwkJCWdldENvbmZpZ3VyYXRpb24oKS5nZXRFeGVjdXRhYmxlU3lzdGVtKCkuZ2V0TmFtZUlEKCk7CisKKwkvLyBtb2R1bGUgVFRDTl9EZWNsYXJhdGlvbnMKKwkvLworCWZvcm1hdEhlYWRlcl9UVENOX0RlY2xhcmF0aW9ucyhtb2R1bGVfVFRDTl9EZWNsYXJhdGlvbnMpOworCisJVHJhY2VNYW5hZ2VyOjpjb25zdF9pdGVyYXRvciBpdCA9IGFUcmFjZU1hbmFnZXIuYmVnaW4oKTsKKwlUcmFjZU1hbmFnZXI6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gYVRyYWNlTWFuYWdlci5lbmQoKTsKKwlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwl7CisJCWFUcmFjZUVsZW1lbnQgPSAoKml0KTsKKworCQlmb3JtYXRfVFRDTl9EZWNsYXJhdGlvbnMoYVRyYWNlRWxlbWVudCk7CisJfQorCisJZm9ybWF0X1RUQ05fRGVjbGFyYXRpb25zQ2hhbm5lbHMoKTsKKworCisJZm9ybWF0RW5kX1RUQ05fRGVjbGFyYXRpb25zKG1vZHVsZV9UVENOX0RlY2xhcmF0aW9ucyk7CisKKwkvLyBtb2R1bGUgVFRDTl9UZW1wbGF0ZXMKKwkvLyBtb2R1bGUgVFRDTl9UZXN0c0FuZENvbnRyb2wKKwkvLyBtb2R1bGUgVFRDTl9Db250cm9sUGFydAorCS8vCisJZm9ybWF0SGVhZGVyX1RUQ05fVGVtcGxhdGVzKG1vZHVsZV9UVENOX1RlbXBsYXRlcyk7CisJZm9ybWF0SGVhZGVyX1RUQ05fVGVzdHNBbmRDb250cm9sKG1vZHVsZV9UVENOX1Rlc3RzQW5kQ29udHJvbCk7CisJZm9ybWF0SGVhZGVyX1RUQ05fQ29udHJvbFBhcnQobW9kdWxlX1RUQ05fQ29udHJvbFBhcnQpOworCisJdHJhY2VOdW1iZXIgPSAxOworCWxpbmtOdW1iZXIgPSAwOworCWl0ID0gYVRyYWNlTWFuYWdlci5iZWdpbigpOworCWVuZEl0ID0gYVRyYWNlTWFuYWdlci5lbmQoKTsKKwlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwl7CisJCWZvcm1hdEhlYWRlcl9UVENOX1Rlc3RzQW5kQ29udHJvbF90ZXN0Y2FzZShtb2R1bGVfVFRDTl9UZXN0c0FuZENvbnRyb2wpOworCisJCWFUcmFjZUVsZW1lbnQgPSAoKml0KTsKKworCQlmb3JtYXRfVFRDTl9UZW1wbGF0ZXMoYVRyYWNlRWxlbWVudCk7CisKKwkJZm9ybWF0RW5kX1RUQ05fVGVzdHNBbmRDb250cm9sX3Rlc3RjYXNlKG1vZHVsZV9UVENOX1Rlc3RzQW5kQ29udHJvbCk7CisKKwkJZm9ybWF0X1RUQ05fQ29udHJvbFBhcnRfZXhlY3V0ZShtb2R1bGVfVFRDTl9Db250cm9sUGFydCk7CisKKwkJdHJhY2VOdW1iZXIgKys7CisJCWxpbmtOdW1iZXIgPSAwOworCX0KKworCWZvcm1hdEVuZF9UVENOX1RlbXBsYXRlcyhtb2R1bGVfVFRDTl9UZW1wbGF0ZXMpOworCWZvcm1hdEVuZF9UVENOX1Rlc3RzQW5kQ29udHJvbChtb2R1bGVfVFRDTl9UZXN0c0FuZENvbnRyb2wpOworCWZvcm1hdEVuZF9UVENOX0NvbnRyb2xQYXJ0KG1vZHVsZV9UVENOX0NvbnRyb2xQYXJ0KTsKK30KKwordm9pZCBUVENOVHJhY2VGb3JtYXR0ZXI6OmZvcm1hdEhlYWRlcl9UVENOX0RlY2xhcmF0aW9ucyhzdGQ6Om9zdHJlYW0gJiBvcykKK3sKKwlvcyA8PCAibW9kdWxlIFRUQ05fRGVjbGFyYXRpb25zIHsiIDw8IHN0ZDo6ZW5kbDsKK30KKwordm9pZCBUVENOVHJhY2VGb3JtYXR0ZXI6OmZvcm1hdEVuZF9UVENOX0RlY2xhcmF0aW9ucyhzdGQ6Om9zdHJlYW0gJiBvcykKK3sKKwlpZiggbm90IG5ld1R5cGVzRGVjbGFyYXRpb24uc3RyKCkuZW1wdHkoKSApCisJeworCQlvcyA8PCAiXHQvLyBOZXcgdHlwZXMgZGVjbGFyYXRpb25zIiA8PCBzdGQ6OmVuZGw7CisJCW9zIDw8IG5ld1R5cGVzRGVjbGFyYXRpb24uc3RyKCk7CisJfQorCisJb3MgPDwgIlx0Ly8gUmVjb3JkcyBkZWNsYXJhdGlvbiIgPDwgc3RkOjplbmRsOworCW9zIDw8IHJlY29yZHNEZWNsYXJhdGlvbi5zdHIoKTsKKworCS8qISEgVE9ETyBjb2RlIMOgIHN1cHByaW1lciBhcHLDqHMgdmFsaWRhdGlvbiBub3V2ZWF1IGNvZGUgcG91ciBsZXMgY2hhbm5lbHMKKwlvcyA8PCAiXHQvLyBQb3J0cyBkZWNsYXJhdGlvbiIgPDwgc3RkOjplbmRsOworCW9zIDw8ICJcdHR5cGUgcG9ydCBwb3J0X2NFbnYgbWVzc2FnZSB7IiA8PCBzdGQ6OmVuZGw7CisJb3MgPDwgcG9ydHNEZWNsYXJhdGlvbi5zdHIoKTsKKwlvcyA8PCAiXHR9IiA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCSovCisJb3MgPDwgIlx0Ly8gQ2hhbm5lbHMgJiBwb3J0cyBkZWNsYXJhdGlvbiIgPDwgc3RkOjplbmRsOworCW9zIDw8IGNoYW5uZWxzRGVmaW5pdGlvbi5zdHIoKTsKKworCW9zIDw8ICJcdC8vIFRTSSBhbmQgTVRDIGNvbXBvbmVudCBkZWNsYXJhdGlvbiIgPDwgc3RkOjplbmRsOworCW9zIDw8ICJcdHR5cGUgY29tcG9uZW50IHJ1bnNPbl8iIDw8IHN5c3RlbU5hbWUgPDwgIiB7IiA8PCBzdGQ6OmVuZGw7CisKKwkvKiEhIFRPRE8gY29kZSDDoCBzdXBwcmltZXIgYXByw6hzIHZhbGlkYXRpb24gbm91dmVhdSBjb2RlIHBvdXIgbGVzIGNoYW5uZWxzCisJb3MgPDwgIlx0XHRwb3J0IHBvcnRfY0VudiBjRW52OyIgPDwgc3RkOjplbmRsOworCSovCisJb3MgPDwgY2hhbm5lbHNEZWNsYXJhdGlvbi5zdHIoKTsKKworCW9zIDw8ICJcdH0iIDw8IHN0ZDo6ZW5kbDsKKwlvcyA8PCAiXHR0eXBlIGNvbXBvbmVudCAiIDw8IHN5c3RlbU5hbWUgPDwgIiB7IiA8PCBzdGQ6OmVuZGw7CisKKwkvKiEhIFRPRE8gY29kZSDDoCBzdXBwcmltZXIgYXByw6hzIHZhbGlkYXRpb24gbm91dmVhdSBjb2RlIHBvdXIgbGVzIGNoYW5uZWxzCisJb3MgPDwgIlx0XHRwb3J0IHBvcnRfY0VudiBjRW52OyIgPDwgc3RkOjplbmRsOworCSovCisJb3MgPDwgY2hhbm5lbHNEZWNsYXJhdGlvbi5zdHIoKTsKKworCW9zIDw8ICJcdH0iIDw8IHN0ZDo6ZW5kbDsKKworCS8vIGZpbiBkdSBtb2R1bGUgVFRDTl9EZWNsYXJhdGlvbnMKKwlvcyA8PCAifSIgPDwgc3RkOjplbmRsOworfQorCit2b2lkIFRUQ05UcmFjZUZvcm1hdHRlcjo6Zm9ybWF0X1RUQ05fRGVjbGFyYXRpb25zKFRyYWNlU2VxdWVuY2UgKiBhVHJhY2VFbHQpCit7CisJQkZMaXN0Ojpjb25zdF9pdGVyYXRvciBpdCA9IGFUcmFjZUVsdC0+cG9pbnRzLmJlZ2luKCk7CisJQkZMaXN0Ojpjb25zdF9pdGVyYXRvciBlbmRJdCA9IGFUcmFjZUVsdC0+cG9pbnRzLmVuZCgpOworCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCXsKKwkJaWYoICgqaXQpLmlzPCBUcmFjZVBvaW50ID4oKSApCisJCXsKKwkJCWlmKCAoKml0KS50b19wdHI8IFRyYWNlUG9pbnQgPigpLT5pc1ZpcnR1YWwoKSApCisJCQl7CisJCQkJLy8hISBOT1RISU5HCisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJZm9ybWF0X1RUQ05fRGVjbGFyYXRpb25zKCgqaXQpLnRvX3B0cjwgVHJhY2VQb2ludCA+KCkpOworCQkJfQorCQl9CisKKwkJZWxzZSBpZiggKCppdCkuaXM8IFRyYWNlU2VxdWVuY2UgPigpICkKKwkJeworCQkJZm9ybWF0X1RUQ05fRGVjbGFyYXRpb25zKCgqaXQpLnRvX3B0cjwgVHJhY2VTZXF1ZW5jZSA+KCkpOworCQl9CisJfQorfQorCit2b2lkIFRUQ05UcmFjZUZvcm1hdHRlcjo6Zm9ybWF0X1RUQ05fRGVjbGFyYXRpb25zKFRyYWNlUG9pbnQgKiBhVHJhY2VQb2ludCkKK3sKKwlzdGQ6OnN0cmluZyBwYXJhbU5hbWU7CisJc3RkOjpzdHJpbmcgcGFyYW1UeXBlOworCisvLyAhISEgTW9kaWYgQUZBIC0gMjMvMDUvMjAxNiAhISEKKy8vCWlmKCBub3QgbGlzdE9mVHJlYXRlZFNpZ25hbC5jb250YWlucyggYVRyYWNlUG9pbnQtPm9iamVjdCApICkKKy8vCXsKKwlpZiggbm90IGxpc3RPZlRyZWF0ZWRTaWduYWxOYW1lLmNvbnRhaW5zKAorCQkJYVRyYWNlUG9pbnQtPm9iamVjdC0+Z2V0TmFtZUlEKCkgKSApCisJeworCisvLwkJbGlzdE9mVHJlYXRlZFNpZ25hbC5hcHBlbmQoIGFUcmFjZVBvaW50LT5vYmplY3QgKTsKKwkJbGlzdE9mVHJlYXRlZFNpZ25hbE5hbWUuYXBwZW5kKCBhVHJhY2VQb2ludC0+b2JqZWN0LT5nZXROYW1lSUQoKSApOworCisJCWlmKCBhVHJhY2VQb2ludC0+b2JqZWN0LT5pczwgSW5zdGFuY2VPZlBvcnQgPigpICkKKwkJeworCQkJSW5zdGFuY2VPZlBvcnQgKiBhU2lnbmFsID0KKwkJCQkJYVRyYWNlUG9pbnQtPm9iamVjdC0+dG88IEluc3RhbmNlT2ZQb3J0ID4oKTsKKworCQkJLy8gUmVjb3JkcyBkZWNsYXJhdGlvbgorCQkJLy8KKwkJCUFycmF5T2ZCRjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBhU2lnbmFsLT5nZXRQYXJhbWV0ZXJzKCkuYmVnaW4oKTsKKwkJCUFycmF5T2ZCRjo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBhU2lnbmFsLT5nZXRQYXJhbWV0ZXJzKCkuZW5kKCk7CisJCQlpZiggaXNTRExGbGFnICkKKwkJCXsKKwkJCQkvLyBBVFRFTlRJT04gOiBkYW5zIGNlIGNhcyBvbiBuZSAgcHJlbmQgcGFzIGVuIGNvbXB0ZSBsZSBkZXJuaWVyIHBhcmFtw6h0cmUKKwkJCQkvLyBxdWkgY29ycmVzcG9uZCBhdSBQSUQgZGUgbCfDqW1ldHRldXIKKwkJCQkvLworCQkJCWVuZEl0ID0gZW5kSXQgLSAxOworCQkJfQorCisJCQlpZiggYVNpZ25hbC0+aGFzUGFyYW1ldGVyKCkgJiYgaXQgIT0gZW5kSXQgKQorCQkJeworCQkJCS8vIHNpZ25hbCBhdmVjIGF1IG1vaW5zIHVuIHBhcmFtw6h0cmUgw6AgYWZmaWNoZXIKKwkJCQkvLworCQkJCXJlY29yZHNEZWNsYXJhdGlvbiA8PCAiXHR0eXBlIHJlY29yZCAiCisJCQkJCQk8PCBhVHJhY2VQb2ludC0+b2JqZWN0LT5nZXROYW1lSUQoKSA8PCAiIHsiOworCisJCQkJc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBwb3NPZkRpZXNlOworCisJCQkJYm9vbCBmaXJzdFBhcmFtZXRlciA9IHRydWU7CisJCQkJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJCQkJeworCQkJCQlyZWNvcmRzRGVjbGFyYXRpb24gPDwgKCBmaXJzdFBhcmFtZXRlciA/ICIiIDogIiwiKQorCQkJCQkJCTw8IHN0ZDo6ZW5kbDsKKworCQkJCQlmaXJzdFBhcmFtZXRlciA9IGZhbHNlOworCisJCQkJCS8vIHBhcmFtw6h0cmUgYW5vbnltZQorCQkJCQlpZiggKCppdCkuaXM8IEJhc2VUeXBlU3BlY2lmaWVyID4oKSApCisJCQkJCXsKKwkJCQkJCWZvcm1hdF9UVENOX0RlY2xhcmF0aW9ucyhhVHJhY2VQb2ludCwKKwkJCQkJCQkJKCppdCkudG9fcHRyPCBCYXNlVHlwZVNwZWNpZmllciA+KCksICJ1bmFtZWQiKTsKKworCQkJCQkJcmVjb3Jkc0RlY2xhcmF0aW9uIDw8ICJcdFx0IjsKKwkJCQkJCS8vIGxlIHR5cGUKKwkJCQkJCWlmKCAoKml0KS50b19wdHI8IEJhc2VUeXBlU3BlY2lmaWVyID4oKS0+aXNUeXBlZFJlYWwoKSApCisJCQkJCQl7CisJCQkJCQkJcmVjb3Jkc0RlY2xhcmF0aW9uIDw8ICJmbG9hdCI7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJcmVjb3Jkc0RlY2xhcmF0aW9uCisJCQkJCQkJCTw8ICgqaXQpLnRvX3B0cjwgQmFzZVR5cGVTcGVjaWZpZXIgPigpLT5zdHJUKCk7CisJCQkJCQl9CisJCQkJCQkvLyBsZSBub20KKwkJCQkJCXJlY29yZHNEZWNsYXJhdGlvbiA8PCAiICIgPDwgInVuYW1lZCI7CisJCQkJCX0KKwkJCQkJLy8gcGFyYW3DqHRyZSBub21tw6kKKwkJCQkJZWxzZSBpZiggKCppdCkuaXM8IEluc3RhbmNlT2ZEYXRhID4oKSApCisJCQkJCXsKKwkJCQkJCUluc3RhbmNlT2ZEYXRhICogYVBhcmFtID0gKCppdCkudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCk7CisKKwkJCQkJCWZvcm1hdF9UVENOX0RlY2xhcmF0aW9ucyhhVHJhY2VQb2ludCwKKwkJCQkJCQkJYVBhcmFtLT5nZXRUeXBlU3BlY2lmaWVyKCksCisJCQkJCQkJCWFQYXJhbS0+Z2V0VHlwZVNwZWNpZmllcigpLT5zdHJUKCkpOworCisJCQkJCQlyZWNvcmRzRGVjbGFyYXRpb24gPDwgIlx0XHQiOworCQkJCQkJLy8gbGUgdHlwZQorCQkJCQkJaWYoIGFQYXJhbS0+Z2V0VHlwZVNwZWNpZmllcigpLT5pc1R5cGVkU3RyaW5nKCkgKQorCQkJCQkJeworCQkJCQkJCXBhcmFtVHlwZSA9ICJjaGFyc3RyaW5nIjsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgaWYoIGFQYXJhbS0+Z2V0VHlwZVNwZWNpZmllcigpLT5pc1R5cGVkQ2hhcmFjdGVyKCkgKQorCQkJCQkJeworCQkJCQkJCXBhcmFtVHlwZSA9ICJjaGFyc3RyaW5nIjsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgaWYoIGFQYXJhbS0+Z2V0VHlwZVNwZWNpZmllcigpLT5pc1R5cGVkUmVhbCgpKQorCQkJCQkJeworCQkJCQkJCXBhcmFtVHlwZSA9ICJmbG9hdCI7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJcGFyYW1UeXBlID0gYVBhcmFtLT5nZXRUeXBlU3BlY2lmaWVyKCktPnN0clQoKTsKKwkJCQkJCX0KKworCQkJCQkJcmVjb3Jkc0RlY2xhcmF0aW9uIDw8CisJCQkJCQkJCSggYVBhcmFtLT5nZXRUeXBlU3BlY2lmaWVyKCktPgorCQkJCQkJCQkJCWhhc1R5cGVQcmltaXRpdmUoKSA/ICIiIDogIlRUQ05fIiApCisJCQkJCQkJCTw8IHBhcmFtVHlwZTsKKwkJCQkJCS8vIGxlIG5vbQorCQkJCQkJcG9zT2ZEaWVzZSA9IGFQYXJhbS0+Z2V0TmFtZUlEKCkuZmluZF9maXJzdF9vZignIycpOworCQkJCQkJaWYoIChhUGFyYW0tPmdldE5hbWVJRCgpWzBdID09ICckJykKKwkJCQkJCQl8fCAoYVBhcmFtLT5nZXROYW1lSUQoKVswXSA9PSAnIycpICkKKwkJCQkJCXsKKwkJCQkJCQlwYXJhbU5hbWUgPSBhUGFyYW0tPmdldE5hbWVJRCgpLnN1YnN0cigxKTsKKwkJCQkJCQlyZWNvcmRzRGVjbGFyYXRpb24gPDwgIiAiIDw8ICJwYXJhbSIgPDwgcGFyYW1OYW1lOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCXJlY29yZHNEZWNsYXJhdGlvbiA8PCAiICIgPDwgYVBhcmFtLT5nZXROYW1lSUQoKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQkvLyAjYmluZCBleHByZXNzaW9uIHBhcmFtZXRlcgorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJfQorCQkJCX0KKwkJCQlyZWNvcmRzRGVjbGFyYXRpb24gPDwgc3RkOjplbmRsOworCQkJCXJlY29yZHNEZWNsYXJhdGlvbiA8PCAiXHR9IiA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIHNpZ25hbCBzYW5zIHBhcmFtw6h0cmUgw6AgYWZmaWNoZXIKKwkJCQkvLworCQkJCXJlY29yZHNEZWNsYXJhdGlvbiA8PCAiXHR0eXBlIGVudW1lcmF0ZWQgIgorCQkJCQkJPDwgYVRyYWNlUG9pbnQtPm9iamVjdC0+Z2V0TmFtZUlEKCkKKwkJCQkJCTw8ICIgeyBlXyIgPDwgYVRyYWNlUG9pbnQtPm9iamVjdC0+Z2V0TmFtZUlEKCkgPDwgIiB9IgorCQkJCQkJPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKwkJCX0KKworCisvKgorCQkJLy8gUG9ydHMgZGVjbGFyYXRpb24KKwkJCS8vCisJCQlzd2l0Y2goIGFUcmFjZVBvaW50LT5vcCApCisJCQl7CisJCQkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUX0VOVjoKKwkJCQl7CisJCQkJCWlub3V0U2lnbmFsTmFtZSA9ICJvdXQgIiArIGFUcmFjZVBvaW50LT5vYmplY3QtPmdldE5hbWVJRCgpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQljYXNlIEFWTV9PUENPREVfT1VUUFVUX0VOVjoKKwkJCQl7CisJCQkJCWlub3V0U2lnbmFsTmFtZSA9ICJpbiAiICsgYVRyYWNlUG9pbnQtPm9iamVjdC0+Z2V0TmFtZUlEKCk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQkvLyBNZXNzc2FnZSBlcnJldXIgPz8/CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKyovCisKKwkJfQorCX0KKworCisJaWYoIGFUcmFjZVBvaW50LT5vYmplY3QtPmlzPCBJbnN0YW5jZU9mUG9ydCA+KCkgKQorCXsKKwkJSW5zdGFuY2VPZlBvcnQgKiBhU2lnbmFsID0gYVRyYWNlUG9pbnQtPm9iamVjdC0+dG88IEluc3RhbmNlT2ZQb3J0ID4oKTsKKwkJLy8gTGlzdGUgZGVzIGNoYW5uZWxzIGFzc29jacOpcyBhdXggc2lnbmF1eAorCQlpZiggYVNpZ25hbC0+aGFzUm91dGluZ0NoYW5uZWwoKSApCisJCXsKKwkJCXN0ZDo6c3RyaW5nIGNoYW5uZWxOYW1lID0gYVNpZ25hbC0+Z2V0Um91dGluZ0NoYW5uZWwoKS0+Z2V0TmFtZUlEKCk7CisJCQlpZiggbm90IExpc3RPZkNoYW5uZWxOYW1lLmNvbnRhaW5zKCBjaGFubmVsTmFtZSApICkKKwkJCXsKKwkJCQlMaXN0T2ZDaGFubmVsTmFtZS5hcHBlbmQoIGNoYW5uZWxOYW1lICk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisvLyEhW1RSQUNFIF0gdG8gZGVsZXRlCisvL0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorLy8JQVZNX09TX0NPVVQgPDwgIk1lc3NzYWdlIGVycmV1ciA/Pz8gOiBTaWduYWwgbm9uIGNvbm5lY3TDqSA6ICIKKy8vCQkJPDwgc3RyX2hlYWRlciggYVNpZ25hbCApIDw8IHN0ZDo6ZW5kbDsKKy8vQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisJCX0KKwl9Cit9CisKK3ZvaWQgVFRDTlRyYWNlRm9ybWF0dGVyOjpmb3JtYXRfVFRDTl9EZWNsYXJhdGlvbnMoVHJhY2VQb2ludCAqIGFUcmFjZVBvaW50LAorCQlCYXNlVHlwZVNwZWNpZmllciAqIGFUUywgc3RkOjpzdHJpbmcgdHlwZU5hbWUpCit7CisJaWYoIGxpc3RPZlRyZWF0ZWRUeXBlLmNvbnRhaW5zKCBhVFMgKSApCisJeworCQlyZXR1cm47CisJfQorCisJbGlzdE9mVHJlYXRlZFR5cGUuYXBwZW5kKCBhVFMgKTsKKworCWlmKCBhVFMtPmhhc1R5cGVDb250YWluZXIoKSApCisJeworCQlDb250YWluZXJUeXBlU3BlY2lmaWVyICogY29udGFpbmVyVCA9IGFUUy0+YXM8IENvbnRhaW5lclR5cGVTcGVjaWZpZXIgPigpOworCQlhdm1fc2l6ZV90IHNpemVUID0gY29udGFpbmVyVC0+c2l6ZSgpOworCisJCXN3aXRjaCggY29udGFpbmVyVC0+Z2V0VHlwZVNwZWNpZmllcktpbmQoKSApCisJCXsKKwkJCWNhc2UgVFlQRV9WRUNUT1JfU1BFQ0lGSUVSOgorCQkJY2FzZSBUWVBFX1JFVkVSU0VfVkVDVE9SX1NQRUNJRklFUjoKKwkJCWNhc2UgVFlQRV9MSVNUX1NQRUNJRklFUjoKKwkJCWNhc2UgVFlQRV9TRVRfU1BFQ0lGSUVSOgorCQkJY2FzZSBUWVBFX01VTFRJU0VUX1NQRUNJRklFUjoKKwkJCWNhc2UgVFlQRV9GSUZPX1NQRUNJRklFUjoKKwkJCWNhc2UgVFlQRV9MSUZPX1NQRUNJRklFUjoKKwkJCWNhc2UgVFlQRV9NVUxUSV9GSUZPX1NQRUNJRklFUjoKKwkJCWNhc2UgVFlQRV9NVUxUSV9MSUZPX1NQRUNJRklFUjoKKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJZm9ybWF0X1RUQ05fRGVjbGFyYXRpb25zKGFUcmFjZVBvaW50LAorCQkJCQkJY29udGFpbmVyVC0+Z2V0Q29udGVudHNUeXBlU3BlY2lmaWVyKCksIHR5cGVOYW1lKTsKKworCQkJCW5ld1R5cGVzRGVjbGFyYXRpb24gPDwgIlx0dHlwZSAiCisJCQkJCTw8ICggY29udGFpbmVyVC0+Z2V0Q29udGVudHNUeXBlU3BlY2lmaWVyKCkuCisJCQkJCQkJaGFzVHlwZVByaW1pdGl2ZSgpID8gIiIgOiAiVFRDTl8iICkKKwkJCQkJPDwgY29udGFpbmVyVC0+Z2V0Q29udGVudHNUeXBlU3BlY2lmaWVyKCkuc3RyVCgpIDw8ICIgIgorCQkJCQk8PCAiVFRDTl8iIDw8IHR5cGVOYW1lIDw8ICJbIiA8PCBzaXplVCA8PCAiXTsiCisJCQkJCTw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWVsc2UgaWYoIGFUUy0+aXNUeXBlZENsYXNzKCkgKQorCXsKKwkJQ2xhc3NUeXBlU3BlY2lmaWVyICogY2xhc3NUeXBlID0gYVRTLT5hczwgQ2xhc3NUeXBlU3BlY2lmaWVyID4oKTsKKwkJYXZtX3NpemVfdCBzaXplVCA9IGNsYXNzVHlwZS0+c2l6ZSgpOworCisJCVN5bWJvbCBhRmllbGQ7CisKKwkJZm9yKCBhdm1fc2l6ZV90IGlkeCA9IDAgOyBpZHggPCBzaXplVCA7ICsraWR4ICkKKwkJeworCQkJYUZpZWxkID0gY2xhc3NUeXBlLT5nZXRTeW1ib2xEYXRhKGlkeCk7CisKKwkJCWZvcm1hdF9UVENOX0RlY2xhcmF0aW9ucyhhVHJhY2VQb2ludCwgYUZpZWxkLmdldFR5cGVTcGVjaWZpZXIoKSwKKwkJCQkJYUZpZWxkLmdldFR5cGVTcGVjaWZpZXIoKS0+c3RyVCgpKTsKKy8vCQkJCQlhRmllbGQuZ2V0VHlwZVNwZWNpZmllcigpLT5nZXROYW1lSUQoKSk7CisJCX0KKworCQkvLyBUeXBlIFN0cnVjdHVyZS9SZWNvcmQgZGVjbGFyYXRpb24KKwkJbmV3VHlwZXNEZWNsYXJhdGlvbiA8PCAiXHR0eXBlIHJlY29yZCAiIDw8ICJUVENOXyIgPDwgdHlwZU5hbWUgPDwgIiB7IgorCQkJCTw8IHN0ZDo6ZW5kbDsKKwkJZm9yKCBhdm1fc2l6ZV90IGlkeCA9IDAgOyBpZHggPCBzaXplVCA7ICsraWR4ICkKKwkJeworCQkJYUZpZWxkID0gY2xhc3NUeXBlLT5nZXRTeW1ib2xEYXRhKGlkeCk7CisKKwkJCW5ld1R5cGVzRGVjbGFyYXRpb24gPDwgIlx0XHQiCisJCQkJPDwgKCBhRmllbGQuZ2V0VHlwZVNwZWNpZmllcigpLT5oYXNUeXBlUHJpbWl0aXZlKCkgPyAiIiA6ICJUVENOXyIgKQorCQkJCTw8ICggYUZpZWxkLmdldFR5cGVTcGVjaWZpZXIoKS0+aXNUeXBlZFJlYWwoKSA/CisJCQkJCQkiZmxvYXQiIDogYUZpZWxkLmdldFR5cGVTcGVjaWZpZXIoKS0+c3RyVCgpICkKKwkJCQk8PCAiICIgPDwgYUZpZWxkLmdldE5hbWVJRCgpIDw8ICgoaWR4IDwgKHNpemVUIC0gMSkpID8gIiwiIDogIiIpCisJCQkJPDwgc3RkOjplbmRsOworCQl9CisJCW5ld1R5cGVzRGVjbGFyYXRpb24gPDwgIlx0fSIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKwl9CisKKwllbHNlIGlmKCBhVFMtPmlzVHlwZWRFbnVtKCkgKQorCXsKKwkJRW51bVR5cGVTcGVjaWZpZXIgKiBlbnVtVHlwZSA9IGFUUy0+YXM8IEVudW1UeXBlU3BlY2lmaWVyID4oKTsKKworCQkvLyBUeXBlIGVudW0gZGVjbGFyYXRpb24KKwkJbmV3VHlwZXNEZWNsYXJhdGlvbiA8PCAiXHR0eXBlIGVudW1lcmF0ZWQgIiA8PCAiVFRDTl8iIDw8IHR5cGVOYW1lCisJCQkJPDwgIiB7IiA8PCBzdGQ6OmVuZGw7CisJCW5ld1R5cGVzRGVjbGFyYXRpb24gPDwgIlx0XHQiOworCisJCWF2bV9zaXplX3Qgc2l6ZVQgPSBlbnVtVHlwZS0+Z2V0U3ltYm9sRGF0YSgpLnNpemUoKTsKKwkJZm9yKCBhdm1fc2l6ZV90IGlkeCA9IDAgOyBpZHggPCBzaXplVCA7ICsraWR4ICkKKwkJeworCQkJbmV3VHlwZXNEZWNsYXJhdGlvbiA8PCBlbnVtVHlwZS0+Z2V0U3ltYm9sRGF0YShpZHgpLmdldE5hbWVJRCgpCisJCQkJCTw8ICgoaWR4IDwgKHNpemVUIC0gMSkpID8gIiwgIiA6ICJcbiIpOworCQl9CisJCW5ld1R5cGVzRGVjbGFyYXRpb24gPDwgIlx0fSIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKwl9CisKKwllbHNlIGlmKCBhVFMtPmlzVHlwZWRJbnRlcnZhbCgpICkKKwl7CisJCUludGVydmFsVHlwZVNwZWNpZmllciAqIGludGVydmFsVFMgPSBhVFMtPmFzPCBJbnRlcnZhbFR5cGVTcGVjaWZpZXIgPigpOworCisJCW5ld1R5cGVzRGVjbGFyYXRpb24gPDwgIlx0dHlwZSAiCisJCQk8PCAoIGludGVydmFsVFMtPmdldFN1cHBvcnRUeXBlU3BlY2lmaWVyKCkuCisJCQkJCWhhc1R5cGVQcmltaXRpdmUoKSA/ICIiIDogIlRUQ05fIiApCisJCQk8PCAoIGludGVydmFsVFMtPmdldFN1cHBvcnRUeXBlU3BlY2lmaWVyKCkuaXNUeXBlZFJlYWwoKSA/CisJCQkJCSJmbG9hdCIgOiBpbnRlcnZhbFRTLT5nZXRTdXBwb3J0VHlwZVNwZWNpZmllcigpLnN0clQoKSApCisJCQk8PCAiIFRUQ05fIiA8PCB0eXBlTmFtZQorCQkJPDwgIiAoIiAgIDw8IGludGVydmFsVFMtPmdldEluZmltdW0oKS5zdHIoKQorCQkJPDwgIiAuLiAiIDw8IGludGVydmFsVFMtPmdldFN1cHJlbXVtKCkuc3RyKCkKKwkJCTw8ICIpOyIgICAgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKwl9CisKKwllbHNlIGlmKCBhVFMtPmlzVHlwZWRTdHJpbmcoKSApCisJeworCQlpZiggYVRTLT5zaXplKCkgPCBBVk1fTlVNRVJJQ19NQVhfU0laRV9UICkKKwkJeworCQkJbmV3VHlwZXNEZWNsYXJhdGlvbiA8PCAiXHR0eXBlIGNoYXJzdHJpbmcgVFRDTl8iIDw8IHR5cGVOYW1lCisJCQkJCTw8ICIgbGVuZ3RoKCAiIDw8IGFUUy0+Z2V0TWluaW11bVNpemUoKQorCQkJCQk8PCAiIC4uICIgPDwgYVRTLT5nZXRNYXhpbXVtU2l6ZSgpIDw8ICIgKTsiCisJCQkJCTw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisJCX0KKwl9CisKKwllbHNlIGlmKCBhVFMtPmlzVHlwZWRBbGlhcygpICkKKwl7CisJCWlmKCBhVFMtPmhhc0NvbnN0cmFpbnQoKSApCisJCXsKKy8vCQkJZm9ybWF0X1RUQ05fRGVjbGFyYXRpb25zKGFUcmFjZVBvaW50LAorLy8JCQkJYVRTLT5hczwgVHlwZUFsaWFzU3BlY2lmaWVyID4oKS0+dGFyZ2V0VHlwZVNwZWNpZmllcigpLCB0eXBlTmFtZSk7CisKKwkJCUJhc2VUeXBlU3BlY2lmaWVyICogdGFyZ2V0VFMgPQorCQkJCQlhVFMtPmFzPCBUeXBlQWxpYXNTcGVjaWZpZXIgPigpLT50YXJnZXRUeXBlU3BlY2lmaWVyKCk7CisKKwkJCW5ld1R5cGVzRGVjbGFyYXRpb24gPDwgIlx0dHlwZSAiCisvLwkJCQk8PCAoIGFUUy0+aGFzVHlwZWRQcmltaXRpdmUoKSA/ICIiIDogIlRUQ05fIikKKwkJCQk8PCB0YXJnZXRUUy0+c3RyVCgpIDw8ICIgIiA8PCAiVFRDTl8iIDw8IHR5cGVOYW1lIDw8ICJ7ICIKKwkJCQk8PCBhVFMtPmdldENvbnN0cmFpbnQoKS5hc19wdHI8IEF2bVByb2dyYW0gPigpLT5nZXRDb2RlKCkuc3RyKCkKKwkJCQk8PCAiIH07IiA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCQl9CisJCWVsc2UKKwkJeworCQkJZm9ybWF0X1RUQ05fRGVjbGFyYXRpb25zKGFUcmFjZVBvaW50LAorCQkJCWFUUy0+YXM8IFR5cGVBbGlhc1NwZWNpZmllciA+KCktPnRhcmdldFR5cGVTcGVjaWZpZXIoKSwgdHlwZU5hbWUpOworCQl9CisJfQorCisJZWxzZSBpZiggYVRTLT53ZWFrbHlUeXBlZEludGVnZXIoKSAmJiAoYVRTLT5nZXRCaXRTaXplKCkgPiAwKSApCisJeworCQluZXdUeXBlc0RlY2xhcmF0aW9uIDw8ICJcdHR5cGUgaW50ZWdlciIgLy8gPDwgYVRTLT5nZXROYW1lSUQoKQorCQkJPDwgIiBUVENOXyIgPDwgdHlwZU5hbWUKKwkJCTw8ICIgKCIgICA8PCBhVFMtPm1pbkludGVnZXJWYWx1ZSgpCisJCQk8PCAiIC4uICIgPDwgYVRTLT5tYXhJbnRlZ2VyVmFsdWUoKQorCQkJPDwgIik7IiAgICA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCX0KKwllbHNlIGlmKCAvKmFUUy0+aXNUeXBlZFNpbXBsZSgpICYmKi8gYVRTLT5oYXNDb25zdHJhaW50KCkgKQorCXsKKwkJLy8hISBUT0RPCisJCW5ld1R5cGVzRGVjbGFyYXRpb24gPDwgIlx0dHlwZSAiCisJCQk8PCAvKiggYVRTLT5oYXNUeXBlZFByaW1pdGl2ZSgpID8gIiIgOiAiVFRDTl8iKSA8PCovIHR5cGVOYW1lIDw8ICIgIgorCQkJPDwgIlRUQ05fIiA8PCBhVFMtPnN0clQoKSA8PCAieyAiCisJCQk8PCBhVFMtPmdldENvbnN0cmFpbnQoKS5hc19wdHI8IEF2bVByb2dyYW0gPigpLT5nZXRDb2RlKCkuc3RyKCkKKwkJCTw8ICIgfTsiIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisJfQorfQorCisKK3ZvaWQgVFRDTlRyYWNlRm9ybWF0dGVyOjpmb3JtYXRfVFRDTl9EZWNsYXJhdGlvbnNDaGFubmVscygpCit7CisJY29uc3QgRXhlY3V0YWJsZVN5c3RlbSAmIGFuRXhlY3V0YWJsZVN5c3RlbSA9CisJCQltVHJhY2VHZW5lcmF0b3IuZ2V0Q29uZmlndXJhdGlvbigpLmdldEV4ZWN1dGFibGVTeXN0ZW0oKTsKKworCVRhYmxlT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGl0Q2hhbm5lbDsKKwlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBlbmRDaGFubmVsOworCisJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgaXRQb3J0OworCVRhYmxlT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGVuZFBvcnQ7CisKKwlUYWJsZU9mRXhlY3V0YWJsZUZvcm06OmNvbnN0X3Jhd19pdGVyYXRvciBpdEV4ZWMgPQorCQkJYW5FeGVjdXRhYmxlU3lzdGVtLmdldEV4ZWN1dGFibGVzKCkuYmVnaW4oKTsKKwlUYWJsZU9mRXhlY3V0YWJsZUZvcm06OmNvbnN0X3Jhd19pdGVyYXRvciBlbmRFeGVjID0KKwkJCWFuRXhlY3V0YWJsZVN5c3RlbS5nZXRFeGVjdXRhYmxlcygpLmVuZCgpOworCWZvciggOyBpdEV4ZWMgIT0gZW5kRXhlYyA7ICsraXRFeGVjICkKKwl7CisJCWl0Q2hhbm5lbCA9IChpdEV4ZWMpLT5nZXRDaGFubmVsKCkuYmVnaW4oKTsKKwkJZW5kQ2hhbm5lbCA9IChpdEV4ZWMpLT5nZXRDaGFubmVsKCkuZW5kKCk7CisJCWZvciggOyBpdENoYW5uZWwgIT0gZW5kQ2hhbm5lbCA7ICsraXRDaGFubmVsICkKKwkJeworCQkJY2hhbm5lbHNEZWZpbml0aW9uIDw8ICJcdHR5cGUgcG9ydCBwb3J0XyIKKwkJCQkJPDwgKCppdENoYW5uZWwpLmdldE5hbWVJRCgpIDw8ICIgbWVzc2FnZSB7IiA8PCBzdGQ6OmVuZGw7CisKKwkJCWNoYW5uZWxzRGVjbGFyYXRpb24gPDwgIlx0XHRwb3J0IHBvcnRfIiA8PCAoKml0Q2hhbm5lbCkuZ2V0TmFtZUlEKCkKKwkJCQkJPDwgIiAiIDw8ICgqaXRDaGFubmVsKS5nZXROYW1lSUQoKSA8PCAiOyIgPDwgc3RkOjplbmRsOworCisJCQlpdFBvcnQgPSAoKml0Q2hhbm5lbCkuY2hhbm5lbCgpLmdldENvbnRlbnRzKCkuYmVnaW4oKTsKKwkJCWVuZFBvcnQgPSAoKml0Q2hhbm5lbCkuY2hhbm5lbCgpLmdldENvbnRlbnRzKCkuZW5kKCk7CisJCQlmb3IoIDsgaXRQb3J0ICE9IGVuZFBvcnQgOyArK2l0UG9ydCApCisJCQl7CisvLyAhISEgTW9kaWYgQUZBIC0gMjMvMDUvMjAxNiAhISEKKy8vCQkJCWlmKCBsaXN0T2ZUcmVhdGVkU2lnbmFsLmNvbnRhaW5zKCAoKml0UG9ydCkucmF3UG9ydCgpICkgKQorCQkJCWlmKCBsaXN0T2ZUcmVhdGVkU2lnbmFsTmFtZS5jb250YWlucygKKwkJCQkJCSgqaXRQb3J0KS5yYXdQb3J0KCktPmdldE5hbWVJRCgpICkgKQorCisJCQkJeworCQkJCQljaGFubmVsc0RlZmluaXRpb24gPDwgIlx0XHQiCisJCQkJCQk8PCAoICgqaXRQb3J0KS5wb3J0KCkuZ2V0TW9kaWZpZXIoKS5pc0RpcmVjdGlvbklucHV0KCkKKwkJCQkJCQkJPyAib3V0ICIgOiAiaW4gIiApCisJCQkJCQk8PCAoKml0UG9ydCkuZ2V0TmFtZUlEKCkgPDwgIjsiIDw8IHN0ZDo6ZW5kbDsKKwkJCQl9CisJCQl9CisJCQljaGFubmVsc0RlZmluaXRpb24gPDwgIlx0fSIgPDwgc3RkOjplbmRsOworCQl9CisJfQorfQorCisKK3ZvaWQgVFRDTlRyYWNlRm9ybWF0dGVyOjpmb3JtYXRIZWFkZXJfVFRDTl9UZW1wbGF0ZXMoc3RkOjpvc3RyZWFtICYgb3MpCit7CisJb3MgPDwgIm1vZHVsZSBUVENOX1RlbXBsYXRlcyB7IiA8PCBzdGQ6OmVuZGw7CisJb3MgPDwgIlx0aW1wb3J0IGZyb20gVFRDTl9EZWNsYXJhdGlvbnMgYWxsOyIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKK30KKwordm9pZCBUVENOVHJhY2VGb3JtYXR0ZXI6OmZvcm1hdEVuZF9UVENOX1RlbXBsYXRlcyhzdGQ6Om9zdHJlYW0gJiBvcykKK3sKKwlvcyA8PCB0ZW1wbGF0ZUxpc3Quc3RyKCk7CisJb3MgPDwgIn0iIDw8IHN0ZDo6ZW5kbDsKK30KKwordm9pZCBUVENOVHJhY2VGb3JtYXR0ZXI6OmZvcm1hdEhlYWRlcl9UVENOX1Rlc3RzQW5kQ29udHJvbChzdGQ6Om9zdHJlYW0gJiBvcykKK3sKKwlpbnQgdW5zaWduZWQgaTsKKworCW9zIDw8ICJtb2R1bGUgVFRDTl9UZXN0c0FuZENvbnRyb2wgeyIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKwlvcyA8PCAiXHRpbXBvcnQgZnJvbSBUVENOX0RlY2xhcmF0aW9ucyBhbGw7IiA8PCBzdGQ6OmVuZGw7CisJb3MgPDwgIlx0aW1wb3J0IGZyb20gVFRDTl9UZW1wbGF0ZXMgYWxsOyIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKworCW9zIDw8ICJcdGFsdHN0ZXAgUlREU19mYWlsKCkgcnVucyBvbiAiIDw8IHN5c3RlbU5hbWUgPDwgIiB7IiA8PCBzdGQ6OmVuZGw7CisJZm9yKGkgPSAwIDsgaSA8IExpc3RPZkNoYW5uZWxOYW1lLnNpemUoKSA7IGkrKykKKwl7CisJCW9zIDw8ICJcdFx0W10iIDw8IExpc3RPZkNoYW5uZWxOYW1lLmdldChpKQorCQkJCTw8ICIucmVjZWl2ZSB7IHNldHZlcmRpY3QoZmFpbCk7IH07IiA8PCBzdGQ6OmVuZGw7CisJfQorCW9zIDw8ICJcdH0iIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7Cit9CisKK3ZvaWQgVFRDTlRyYWNlRm9ybWF0dGVyOjpmb3JtYXRFbmRfVFRDTl9UZXN0c0FuZENvbnRyb2woc3RkOjpvc3RyZWFtICYgb3MpCit7CisJb3MgPDwgIn0iIDw8IHN0ZDo6ZW5kbDsKK30KKwordm9pZCBUVENOVHJhY2VGb3JtYXR0ZXI6OmZvcm1hdEhlYWRlcl9UVENOX1Rlc3RzQW5kQ29udHJvbF90ZXN0Y2FzZShzdGQ6Om9zdHJlYW0gJiBvcykKK3sKKwlpbnQgdW5zaWduZWQgaTsKKworCW9zIDw8ICJcdHRlc3RjYXNlIFRDX3RyYWNlIiA8PCB0cmFjZU51bWJlciA8PCAiKCkgIgorCQk8PCAicnVucyBvbiBydW5zT25fIiA8PCBzeXN0ZW1OYW1lCisJCTw8ICIgc3lzdGVtICIgPDwgc3lzdGVtTmFtZSA8PCAiIHsiIDw8IHN0ZDo6ZW5kbAorCQk8PCAiXHRcdGFjdGl2YXRlKFJURFNfZmFpbCgpKTsiIDw8IHN0ZDo6ZW5kbDsKKwlmb3IoaSA9IDAgOyBpIDwgTGlzdE9mQ2hhbm5lbE5hbWUuc2l6ZSgpIDsgaSsrKQorCXsKKwkJb3MgPDwgIlx0XHRtYXAoc2VsZjoiIDw8IExpc3RPZkNoYW5uZWxOYW1lLmdldChpKQorCQkJCTw8ICIsc3lzdGVtOiIgPDwgTGlzdE9mQ2hhbm5lbE5hbWUuZ2V0KGkpIDw8ICIpOyIgPDwgc3RkOjplbmRsOworCX0KKwlvc3NUZXN0Y2FzZUxpc3Quc3RyKCIiKTsKK30KKwordm9pZCBUVENOVHJhY2VGb3JtYXR0ZXI6OmZvcm1hdEVuZF9UVENOX1Rlc3RzQW5kQ29udHJvbF90ZXN0Y2FzZShzdGQ6Om9zdHJlYW0gJiBvcykKK3sKKwlvcyA8PCBvc3NUZXN0Y2FzZUxpc3Quc3RyKCk7CisJb3MgPDwgIlx0XHRzZXR2ZXJkaWN0KHBhc3MpIiA8PCBzdGQ6OmVuZGw7CisJb3MgPDwgIlx0fSIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKK30KKwordm9pZCBUVENOVHJhY2VGb3JtYXR0ZXI6OmZvcm1hdEhlYWRlcl9UVENOX0NvbnRyb2xQYXJ0KHN0ZDo6b3N0cmVhbSAmIG9zKQoreworCW9zIDw8ICJtb2R1bGUgVFRDTl9Db250cm9sUGFydCB7IiA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCW9zIDw8ICJcdGltcG9ydCBmcm9tIFRUQ05fVGVzdHNBbmRDb250cm9sIGFsbDsiIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisKKwlvcyA8PCAiXHRjb250cm9sIHsiIDw8IHN0ZDo6ZW5kbDsKK30KKwordm9pZCBUVENOVHJhY2VGb3JtYXR0ZXI6OmZvcm1hdEVuZF9UVENOX0NvbnRyb2xQYXJ0KHN0ZDo6b3N0cmVhbSAmIG9zKQoreworCW9zIDw8ICJcdH0iIDw8IHN0ZDo6ZW5kbDsKKwlvcyA8PCAifSIgPDwgc3RkOjplbmRsOworfQorCit2b2lkIFRUQ05UcmFjZUZvcm1hdHRlcjo6Zm9ybWF0X1RUQ05fQ29udHJvbFBhcnRfZXhlY3V0ZShzdGQ6Om9zdHJlYW0gJiBvcykKK3sKKwlvcyA8PCAiXHRcdGV4ZWN1dGUoVENfdHJhY2UiIDw8IHRyYWNlTnVtYmVyIDw8ICIoKSk7IiA8PCBzdGQ6OmVuZGw7Cit9CisKK3ZvaWQgVFRDTlRyYWNlRm9ybWF0dGVyOjpmb3JtYXRfVFRDTl9UZW1wbGF0ZXMoVHJhY2VTZXF1ZW5jZSAqIGFUcmFjZUVsdCkKK3sKKwlCRkxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYVRyYWNlRWx0LT5wb2ludHMuYmVnaW4oKTsKKwlCRkxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gYVRyYWNlRWx0LT5wb2ludHMuZW5kKCk7CisJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJeworCQlpZiggKCppdCkuaXM8IFRyYWNlUG9pbnQgPigpICkKKwkJeworCQkJaWYoICgqaXQpLnRvX3B0cjwgVHJhY2VQb2ludCA+KCktPmlzVmlydHVhbCgpICkKKwkJCXsKKwkJCQkvLyEhIE5PVEhJTkcKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlmb3JtYXRfVFRDTl9UZW1wbGF0ZXMoKCppdCkudG9fcHRyPCBUcmFjZVBvaW50ID4oKSk7CisJCQl9CisJCX0KKworCQllbHNlIGlmKCAoKml0KS5pczwgVHJhY2VTZXF1ZW5jZSA+KCkgKQorCQl7CisJCQlmb3JtYXRfVFRDTl9UZW1wbGF0ZXMoKCppdCkudG9fcHRyPCBUcmFjZVNlcXVlbmNlID4oKSk7CisJCX0KKwl9Cit9CisKK3ZvaWQgVFRDTlRyYWNlRm9ybWF0dGVyOjpmb3JtYXRfVFRDTl9UZW1wbGF0ZXMoVHJhY2VQb2ludCAqIGFUcmFjZVBvaW50KQoreworCXN0ZDo6c3RyaW5nIHRlbXBsYXRlX1RBQiA9ICJcdFx0IjsKKwlzdGQ6OnN0cmluZyB0ZW1wbGF0ZV9pbmNyVGFiID0gIlx0IjsKKworCWlmKCBhVHJhY2VQb2ludC0+b2JqZWN0LT5pczwgSW5zdGFuY2VPZlBvcnQgPigpICYmCisJCSggKCBhVHJhY2VQb2ludC0+b3AJPT0gQVZNX09QQ09ERV9JTlBVVF9FTlYgKSB8fAorCQkgICggYVRyYWNlUG9pbnQtPm9wCT09IEFWTV9PUENPREVfT1VUUFVUX0VOViApICkgKQorCXsKKwkJSW5zdGFuY2VPZlBvcnQgKiBhU2lnbmFsID0gYVRyYWNlUG9pbnQtPm9iamVjdC0+dG88IEluc3RhbmNlT2ZQb3J0ID4oKTsKKworCQlzdGQ6Om9zdHJpbmdzdHJlYW0gdGVtcGxhdGVOYW1lOworCQl0ZW1wbGF0ZU5hbWUgPDwgYVNpZ25hbC0+Z2V0TmFtZUlEKCkKKwkJCQk8PCAiX3RyYWNlIiA8PCB0cmFjZU51bWJlcgorCQkJCTw8ICJfTElOS18iIDw8IGxpbmtOdW1iZXI7CisKKwkJQXJyYXlPZkJGOjpjb25zdF9pdGVyYXRvciBpdCA9IGFTaWduYWwtPmdldFBhcmFtZXRlcnMoKS5iZWdpbigpOworCQlBcnJheU9mQkY6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gYVNpZ25hbC0+Z2V0UGFyYW1ldGVycygpLmVuZCgpOworCQlpZiggaXNTRExGbGFnICkKKwkJeworCQkJLy8gQVRURU5USU9OIDogZGFucyBjZSBjYXMgb24gbmUgIHByZW5kIHBhcyBlbiBjb21wdGUgbGUgZGVybmllciBwYXJhbcOodHJlCisJCQkvLyBxdWkgY29ycmVzcG9uZCBhdSBQSUQgZGUgbCfDqW1ldHRldXIKKwkJCS8vCisJCQllbmRJdCA9IGVuZEl0IC0gMTsKKwkJfQorCisJCWlmKCBhU2lnbmFsLT5oYXNQYXJhbWV0ZXIoKSAmJiBpdCAhPSBlbmRJdCApCisJCXsKKwkJCS8vIHNpZ25hbCBhdmVjIGF1IG1vaW5zIHVuIHBhcmFtw6h0cmUgw6AgYWZmaWNoZXIKKwkJCS8vCisJCQl0ZW1wbGF0ZUxpc3QgPDwgIlx0dGVtcGxhdGUgIiA8PCBhU2lnbmFsLT5nZXROYW1lSUQoKSA8PCAiICI7CisJCQl0ZW1wbGF0ZUxpc3QgPDwgdGVtcGxhdGVOYW1lLnN0cigpIDw8ICIgOj0geyIgPDwgc3RkOjplbmRsOworCisJCQlhdm1fc2l6ZV90IHNpemVUID0gYVNpZ25hbC0+Z2V0UGFyYW1ldGVycygpLnNpemUoKSAtIDE7CisKKwkJCWZvciggYXZtX3NpemVfdCBvZmZzZXQgPSAwIDsgaXQgIT0gZW5kSXQgOyArK2l0ICwgKytvZmZzZXQgKQorCQkJeworCQkJCS8vIHBhcmFtw6h0cmUgYW5vbnltZQorCQkJCWlmKCAoKml0KS5pczwgQmFzZVR5cGVTcGVjaWZpZXIgPigpICkKKwkJCQl7CisJCQkJCS8vIGxlIG5vbQorCQkJCQl0ZW1wbGF0ZUxpc3QgPDwgIlx0XHQiIDw8ICJ1bmFtZWQiOworCQkJCQkvLyBsYSB2YWxldXIKKwkJCQkJdGVtcGxhdGVMaXN0IDw8ICIgOj0gIiA8PCBhVHJhY2VQb2ludC0+dmFsKG9mZnNldCkuc3RyKCk7CisJCQkJfQorCQkJCS8vIHBhcmFtw6h0cmUgbm9tbcOpCisJCQkJZWxzZSBpZiggKCppdCkuaXM8IEluc3RhbmNlT2ZEYXRhID4oKSApCisJCQkJeworCQkJCQlJbnN0YW5jZU9mRGF0YSAqIGFQYXJhbSA9ICgqaXQpLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpOworCisJCQkJCWZvcm1hdF9UVENOX1RlbXBsYXRlcyhhVHJhY2VQb2ludC0+dmFsKG9mZnNldCksCisJCQkJCQkJYVBhcmFtLT5nZXRUeXBlU3BlY2lmaWVyKCksIGFQYXJhbS0+Z2V0TmFtZUlEKCksCisJCQkJCQkJb2Zmc2V0LCB0ZW1wbGF0ZV9UQUIsIHRlbXBsYXRlX2luY3JUYWIpOworCQkJCX0KKwkJCQkvLyAjYmluZCBleHByZXNzaW9uIHBhcmFtZXRlcgorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8vIENmIEFybmF1bHQgc2kgY2FzIGVycmV1ciA/Pz8KKwkJCQl9CisKKwkJCQl0ZW1wbGF0ZUxpc3QgPDwgKChvZmZzZXQrMSA+PSBzaXplVCkgPyAiIiA6ICIsIikgPDwgc3RkOjplbmRsOworCQkJfQorCQkJdGVtcGxhdGVMaXN0IDw8ICJcdH0iIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBzaWduYWwgc2FucyBwYXJhbcOodHJlIMOgIGFmZmljaGVyCisJCQkvLworCQkJdGVtcGxhdGVMaXN0IDw8ICJcdHRlbXBsYXRlICIgPDwgYVNpZ25hbC0+Z2V0TmFtZUlEKCkKKwkJCQkJPDwgIiAiIDw8IHRlbXBsYXRlTmFtZS5zdHIoKSA8PCAiIDo9ID87IgorCQkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCQl9CisKKwkJaWYoIGFUcmFjZVBvaW50LT5vcAk9PSBBVk1fT1BDT0RFX0lOUFVUX0VOViApCisJCXsKKwkJCWlmKCBhU2lnbmFsLT5oYXNSb3V0aW5nQ2hhbm5lbCgpICkKKwkJCXsKKwkJCQlvc3NUZXN0Y2FzZUxpc3QgPDwgIlx0XHQiCisJCQkJCQk8PCBhU2lnbmFsLT5nZXRSb3V0aW5nQ2hhbm5lbCgpLT5nZXROYW1lSUQoKQorCQkJCQkJPDwgIi5zZW5kKCIgPDwgdGVtcGxhdGVOYW1lLnN0cigpIDw8ICIpIiA8PCBzdGQ6OmVuZGw7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJb3NzVGVzdGNhc2VMaXN0IDw8ICJcdFx0Y0Vudi5zZW5kKCIKKwkJCQkJCTw8IHRlbXBsYXRlTmFtZS5zdHIoKSA8PCAiKSIgPDwgc3RkOjplbmRsOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJaWYoIGFTaWduYWwtPmhhc1JvdXRpbmdDaGFubmVsKCkgKQorCQkJeworCQkJCW9zc1Rlc3RjYXNlTGlzdCA8PCAiXHRcdCIKKwkJCQkJCTw8IGFTaWduYWwtPmdldFJvdXRpbmdDaGFubmVsKCktPmdldE5hbWVJRCgpCisJCQkJCQk8PCAiLnJlY2VpdmUoIiA8PCB0ZW1wbGF0ZU5hbWUuc3RyKCkgPDwgIikiCisJCQkJCQk8PCBzdGQ6OmVuZGw7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJb3NzVGVzdGNhc2VMaXN0IDw8ICJcdFx0Y0Vudi5yZWNlaXZlKCIKKwkJCQkJCTw8IHRlbXBsYXRlTmFtZS5zdHIoKSA8PCAiKSIgPDwgc3RkOjplbmRsOworCQkJfQorCQl9CisKKwkJbGlua051bWJlciArKzsKKwl9Cit9CisKK3ZvaWQgVFRDTlRyYWNlRm9ybWF0dGVyOjpmb3JtYXRfVFRDTl9UZW1wbGF0ZXMoCisJCWNvbnN0IEJGICYgdmFsdWUsIEJhc2VUeXBlU3BlY2lmaWVyICogYVRTLAorCQlzdGQ6OnN0cmluZyBhUGFyYW1OYW1lLCBhdm1fc2l6ZV90IGFuT2Zmc2V0LAorCQljb25zdCBzdGQ6OnN0cmluZyAmIFRBQiwgY29uc3Qgc3RkOjpzdHJpbmcgJiBDSEFSKQoreworCS8vIEFmZmljaGFnZSBkZSAibm9tIDo9ICIKKwlpZiggKGFQYXJhbU5hbWVbMF0gPT0gJyQnKSB8fCAoYVBhcmFtTmFtZVswXSA9PSAnIycpICkKKwl7CisJCXN0ZDo6c3RyaW5nIG5ld1BhcmFtTmFtZSA9IGFQYXJhbU5hbWUuc3Vic3RyKDEpOworCQl0ZW1wbGF0ZUxpc3QgPDwgVEFCIDw8ICJwYXJhbSIgPDwgbmV3UGFyYW1OYW1lIDw8ICIgOj0gIiA7CisJfQorCWVsc2UKKwl7CisJCXRlbXBsYXRlTGlzdCA8PCBUQUIgPDwgYVBhcmFtTmFtZSA8PCAiIDo9ICIgOworCX0KKworCWlmKCBhVFMtPmhhc1R5cGVDb250YWluZXIoKSApCisJeworCQlDb250YWluZXJUeXBlU3BlY2lmaWVyICogY29udGFpbmVyVCA9IGFUUy0+YXM8IENvbnRhaW5lclR5cGVTcGVjaWZpZXIgPigpOworLy8JCWF2bV9zaXplX3Qgc2l6ZVQgPSBjb250YWluZXJULT5zaXplKCk7CisKKwkJc3dpdGNoKCBjb250YWluZXJULT5nZXRUeXBlU3BlY2lmaWVyS2luZCgpICkKKwkJeworCQkJY2FzZSBUWVBFX1ZFQ1RPUl9TUEVDSUZJRVI6CisJCQljYXNlIFRZUEVfUkVWRVJTRV9WRUNUT1JfU1BFQ0lGSUVSOgorCQkJY2FzZSBUWVBFX0xJU1RfU1BFQ0lGSUVSOgorCQkJY2FzZSBUWVBFX1NFVF9TUEVDSUZJRVI6CisJCQljYXNlIFRZUEVfRklGT19TUEVDSUZJRVI6CisJCQljYXNlIFRZUEVfTElGT19TUEVDSUZJRVI6CisJCQljYXNlIFRZUEVfTVVMVElfRklGT19TUEVDSUZJRVI6CisJCQljYXNlIFRZUEVfTVVMVElfTElGT19TUEVDSUZJRVI6CisJCQlkZWZhdWx0OgorCQkJeworCQkJCXRlbXBsYXRlTGlzdCA8PCB2YWx1ZS5zdHIoKTsKKy8vCQkJCWlmKCBub3QgYVRTLT5pc1R5cGVkU2ltcGxlKCkgKQorLy8JCQkJeworLy8JCQkJCWZvcm1hdF9UVENOX1RlbXBsYXRlcyhhVHJhY2VQb2ludCwKKy8vCQkJCQkJCWNvbnRhaW5lclQtPmdldFR5cGVTcGVjaWZpZXIoKSwgYVBhcmFtTmFtZSk7CisvLwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwllbHNlIGlmKCBhVFMtPmlzVHlwZWRDbGFzcygpICkKKwl7CisJCUNsYXNzVHlwZVNwZWNpZmllciAqIGNsYXNzVHlwZSA9IGFUUy0+YXM8IENsYXNzVHlwZVNwZWNpZmllciA+KCk7CisJCWF2bV9zaXplX3Qgc2l6ZVQgPSBjbGFzc1R5cGUtPnNpemUoKTsKKworCQlTeW1ib2wgYUZpZWxkOworCisJCXRlbXBsYXRlTGlzdCA8PCAieyIgPDwgc3RkOjplbmRsOworCisJCWZvciggYXZtX3NpemVfdCBpZHggPSAwIDsgaWR4IDwgc2l6ZVQgOyArK2lkeCApCisJCXsKKwkJCWFGaWVsZCA9IGNsYXNzVHlwZS0+Z2V0U3ltYm9sRGF0YShpZHgpOworCisJCQlmb3JtYXRfVFRDTl9UZW1wbGF0ZXMoCisJCQkJCXZhbHVlLnRvX3B0cjwgQXJyYXlCRiA+KCktPmF0KCBpZHggKSwKKwkJCQkJYUZpZWxkLmdldFR5cGVTcGVjaWZpZXIoKSwgYUZpZWxkLmdldE5hbWVJRCgpLAorCQkJCQlpZHgsIFRBQiArIENIQVIsIENIQVIpOworCisJCQl0ZW1wbGF0ZUxpc3QgPDwgKChpZHgrMSA+PSBzaXplVCkgPyAiIiA6ICIsIikgPDwgc3RkOjplbmRsOworCQl9CisKKwkJdGVtcGxhdGVMaXN0IDw8IFRBQiA8PCAifSIgPDwgc3RkOjplbmRsOworCX0KKworCWVsc2UgaWYoIGFUUy0+aXNUeXBlZEVudW0oKSApCisJeworCQlFbnVtVHlwZVNwZWNpZmllciAqIGVudW1UID0gYVRTLT5hczwgRW51bVR5cGVTcGVjaWZpZXIgPigpOworCisJCS8vIEFmZmljaGFnZSBkZSBsYSB2YWxldXIgbnVtw6lyaXF1ZQorCQlpZiggdmFsdWUuaW52YWxpZCgpICkKKwkJeworCQkJdGVtcGxhdGVMaXN0IDw8ICJOVUxMIjsKKwkJfQorCQllbHNlIGlmKCB2YWx1ZS5pczwgQXJyYXlCRiA+KCkgKQorCQl7CisJCQl0ZW1wbGF0ZUxpc3QgPDwgIkFSUkFZPD8+IjsKKwkJfQorCQllbHNlIGlmKCB2YWx1ZS5pczwgSW5zdGFuY2VPZkRhdGEgPigpICkKKwkJeworCQkJSW5zdGFuY2VPZkRhdGEgKiBhU3ltYm9sID0gdmFsdWUudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCk7CisKKwkJCWlmKCBub3QgZW51bVQtPmhhc1N5bWJvbERhdGEoYVN5bWJvbCkgKQorCQkJeworCQkJCUFWTV9PU19FUlJPUl9BTEVSVCA8PCAiVFRDTlRyYWNlRm9ybWF0dGVyOjpmb3JtYXRfVFRDTl9UZW1wbGF0ZXMiCisJCQkJCQk8PCAiIDo+IFVuZXhwZWN0ZWQgc3ltYm9sXG48PCAiIDw8IHN0cl9oZWFkZXIoIGFTeW1ib2wgKQorCQkJCQkJPDwgIiA+PlxuZm9yIHRoZSBlbnVtIHR5cGUgPDwgIgorCQkJCQkJPDwgZW51bVQtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIiA+PiAhISEiCisJCQkJCQk8PCBTRU5EX0FMRVJUOworCQkJfQorCisJCQl0ZW1wbGF0ZUxpc3QgPDwgYVN5bWJvbC0+Z2V0TmFtZUlEKCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQljb25zdCBTeW1ib2wgJiBhU3ltYm9sID0gZW51bVQtPmdldFN5bWJvbERhdGFCeVZhbHVlKHZhbHVlKTsKKwkJCWlmKCBhU3ltYm9sLnZhbGlkKCkgKQorCQkJeworCQkJCXRlbXBsYXRlTGlzdCA8PCBhU3ltYm9sLmdldE5hbWVJRCgpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUFWTV9PU19FUlJPUl9BTEVSVAorCQkJCQkJPDwgIlRUQ05UcmFjZUZvcm1hdHRlcjo6Zm9ybWF0X1RUQ05fVGVtcGxhdGVzIgorCQkJCQkJCSIgOj5cblVuZXhwZWN0ZWQgc3ltYm9sIHZhbHVlIDw8ICIKKwkJCQkJCTw8IHZhbHVlLnN0cigpIDw8ICIgPj4gZm9yIHRoZSBlbnVtIHR5cGUgPDwgIgorCQkJCQkJPDwgZW51bVQtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKwkJCQkJCTw8ICIgPj4gZm9yIHRoZSBwYXJhbWV0ZXIgPDwgcGFyYW0iCisJCQkJCQk8PCBhUGFyYW1OYW1lIDw8ICIgPj4gISEhIgorCQkJCQkJPDwgU0VORF9BTEVSVDsKKworCQkJCXRlbXBsYXRlTGlzdCA8PCBlbnVtVC0+Z2V0TmFtZUlEKCkKKwkJCQkJCTw8ICJbICIgPDwgdmFsdWUuc3RyKCkgPDwgIiBdIjsKKwkJCX0KKwkJfQorCX0KKworCWVsc2UgaWYoIHZhbHVlLmlzPCBDaGFyYWN0ZXIgPigpICkKKwl7CisJCS8vIE9uIHJlbXBsYWNlICd4JyBwYXIgIngiCisJCXRlbXBsYXRlTGlzdCA8PCB2YWx1ZS50b19wdHI8IENoYXJhY3RlciA+KCktPnN0ckNoYXIoJyInKTsKKwl9CisJZWxzZSAvL2lmKCBhVFMtPmlzVHlwZWRTaW1wbGUoKSApCisJeworCQkvLyBBZmZpY2hhZ2UgZGUgbGEgdmFsZXVyIG51bcOpcmlxdWUKKwkJaWYoIHZhbHVlLmludmFsaWQoKSApCisJCXsKKwkJCXRlbXBsYXRlTGlzdCA8PCAiTlVMTCI7CisJCX0KKwkJZWxzZSBpZiggdmFsdWUuaXM8IEFycmF5QkYgPigpICkKKwkJeworCQkJdGVtcGxhdGVMaXN0IDw8IHZhbHVlLnRvX3B0cjwgQXJyYXlCRiA+KCktPmF0KCBhbk9mZnNldCApLnN0cigpOworCQl9CisJCWVsc2UKKwkJeworCQkJdGVtcGxhdGVMaXN0IDw8IHZhbHVlLnN0cigpOworCQl9CisJfQorfQorCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3RyYWNlL1RUQ05UcmFjZUZvcm1hdHRlci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3RyYWNlL1RUQ05UcmFjZUZvcm1hdHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NjA3MjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vdHJhY2UvVFRDTlRyYWNlRm9ybWF0dGVyLmgKQEAgLTAsMCArMSwxODYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiA2IGphbnYuIDIwMTQKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQWxhaW4gRmFpdnJlIChDRUEgTElTVCkgYWxhaW4uZmFpdnJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBUVENOVFJBQ0VGT1JNQVRURVJfSF8KKyNkZWZpbmUgVFRDTlRSQUNFRk9STUFUVEVSX0hfCisKKyNpbmNsdWRlICJBYnN0cmFjdFRyYWNlRm9ybWF0dGVyLmgiCisKKyNpbmNsdWRlIDxjb2xsZWN0aW9uL0xpc3QuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworY2xhc3MgQXZtVHJhY2VHZW5lcmF0b3I7CisKK2NsYXNzIEJGOworY2xhc3MgQmFzZVR5cGVTcGVjaWZpZXI7CisKK2NsYXNzIEV4ZWN1dGlvbkRhdGE7CisKK2NsYXNzIFRyYWNlTWFuYWdlcjsKK2NsYXNzIFRyYWNlUG9pbnQ7CitjbGFzcyBUcmFjZVNlcXVlbmNlOworCisKK2NsYXNzIFRUQ05UcmFjZUZvcm1hdHRlciAgOiAgcHVibGljIEFic3RyYWN0VHJhY2VGb3JtYXR0ZXIKK3sKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIFRZUEVERUYKKwkgKi8KKwl0eXBlZGVmIExpc3Q8IEJhc2VUeXBlU3BlY2lmaWVyICogPiBMaXN0T2ZCYXNlVHlwZVNwZWNpZmllcjsKKworCXR5cGVkZWYgTGlzdDwgc3RkOjpzdHJpbmcgPiAgTGlzdE9mU3RyaW5nOworCisKKwkvKioKKwkgKiBBVFRSSUJVVEVTCisJICovCisJYm9vbCBpc1NETEZsYWc7CisKKwlUcmFjZVNlcXVlbmNlICogYVRyYWNlRWxlbWVudDsKKwlpbnQgdHJhY2VOdW1iZXI7CisJaW50IGxpbmtOdW1iZXI7CisKKwlzdGQ6OnN0cmluZyBzeXN0ZW1OYW1lOworCisvLyAhISEgTW9kaWYgQUZBIC0gMjMvMDUvMjAxNiAhISEKKy8vCUxpc3RPZkluc3RhbmNlT2ZQb3J0IGxpc3RPZlRyZWF0ZWRTaWduYWw7CisJTGlzdE9mU3RyaW5nIGxpc3RPZlRyZWF0ZWRTaWduYWxOYW1lOworCisJTGlzdE9mQmFzZVR5cGVTcGVjaWZpZXIgbGlzdE9mVHJlYXRlZFR5cGU7CisKKwlzdGQ6Om9zdHJpbmdzdHJlYW0gbW9kdWxlX1RUQ05fRGVjbGFyYXRpb25zOworCXN0ZDo6b3N0cmluZ3N0cmVhbSBtb2R1bGVfVFRDTl9UZW1wbGF0ZXM7CisJc3RkOjpvc3RyaW5nc3RyZWFtIG1vZHVsZV9UVENOX1Rlc3RzQW5kQ29udHJvbDsKKwlzdGQ6Om9zdHJpbmdzdHJlYW0gbW9kdWxlX1RUQ05fQ29udHJvbFBhcnQ7CisKKwlzdGQ6Om9zdHJpbmdzdHJlYW0gbmV3VHlwZXNEZWNsYXJhdGlvbjsKKworCXN0ZDo6b3N0cmluZ3N0cmVhbSByZWNvcmRzRGVjbGFyYXRpb247CisKKwlzdGQ6Om9zdHJpbmdzdHJlYW0gcG9ydHNEZWNsYXJhdGlvbjsKKworCXN0ZDo6b3N0cmluZ3N0cmVhbSBjaGFubmVsc0RlZmluaXRpb247CisJc3RkOjpvc3RyaW5nc3RyZWFtIGNoYW5uZWxzRGVjbGFyYXRpb247CisJTGlzdE9mU3RyaW5nIExpc3RPZkNoYW5uZWxOYW1lOworCisJc3RkOjpvc3RyaW5nc3RyZWFtIHRlbXBsYXRlTGlzdDsKKworCXN0ZDo6b3N0cmluZ3N0cmVhbSBvc3NUZXN0Y2FzZUxpc3Q7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCVRUQ05UcmFjZUZvcm1hdHRlcihBdm1UcmFjZUdlbmVyYXRvciAmIGFUcmFjZUdlbmVyYXRvcikKKwk6IEFic3RyYWN0VHJhY2VGb3JtYXR0ZXIoIGFUcmFjZUdlbmVyYXRvciApLAorCWlzU0RMRmxhZyggdHJ1ZSApLAorCWFUcmFjZUVsZW1lbnQoIE5VTEwgKSwKKwl0cmFjZU51bWJlciggMSApLAorCWxpbmtOdW1iZXIoIDAgKSwKKworCXN5c3RlbU5hbWUoICksCisKKy8vICEhISBNb2RpZiBBRkEgLSAyMy8wNS8yMDE2ICEhIQorLy8JbGlzdE9mVHJlYXRlZFNpZ25hbCggKSwKKwlsaXN0T2ZUcmVhdGVkVHlwZSggKSwKKworCW1vZHVsZV9UVENOX1RlbXBsYXRlcyggKSwKKwltb2R1bGVfVFRDTl9UZXN0c0FuZENvbnRyb2woICksCisJbW9kdWxlX1RUQ05fQ29udHJvbFBhcnQoICksCisKKwluZXdUeXBlc0RlY2xhcmF0aW9uKCApLAorCisJcmVjb3Jkc0RlY2xhcmF0aW9uKCApLAorCisJcG9ydHNEZWNsYXJhdGlvbiggKSwKKwljaGFubmVsc0RlZmluaXRpb24oICksCisJY2hhbm5lbHNEZWNsYXJhdGlvbiggKSwKKworCXRlbXBsYXRlTGlzdCggKSwKKworCW9zc1Rlc3RjYXNlTGlzdCggKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgflRUQ05UcmFjZUZvcm1hdHRlcigpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBDT05GSUdVUkUgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJYm9vbCBjb25maWd1cmVJbXBsKFdPYmplY3QgKiB3ZlBhcmFtZXRlck9iamVjdCk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBGT1JNQVQgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJdm9pZCBmb3JtYXQoVHJhY2VNYW5hZ2VyICYgYVRyYWNlTWFuYWdlcik7CisKKwl2b2lkIGZvcm1hdF9pbXBsKFRyYWNlTWFuYWdlciAmIGFUcmFjZU1hbmFnZXIpOworCisKKwl2b2lkIGZvcm1hdEhlYWRlcl9UVENOX0RlY2xhcmF0aW9ucyhzdGQ6Om9zdHJlYW0gJiBvcyk7CisJdm9pZCBmb3JtYXRFbmRfVFRDTl9EZWNsYXJhdGlvbnMoc3RkOjpvc3RyZWFtICYgb3MpOworCXZvaWQgZm9ybWF0X1RUQ05fRGVjbGFyYXRpb25zKFRyYWNlU2VxdWVuY2UgKiBhVHJhY2VFbHQpOworCXZvaWQgZm9ybWF0X1RUQ05fRGVjbGFyYXRpb25zKFRyYWNlUG9pbnQgKiBhVHJhY2VQb2ludCk7CisJdm9pZCBmb3JtYXRfVFRDTl9EZWNsYXJhdGlvbnMoVHJhY2VQb2ludCAqIGFUcmFjZVBvaW50LAorCQkJQmFzZVR5cGVTcGVjaWZpZXIgKiBhVFMsIHN0ZDo6c3RyaW5nIHR5cGVOYW1lKTsKKworCXZvaWQgZm9ybWF0X1RUQ05fRGVjbGFyYXRpb25zQ2hhbm5lbHMoKTsKKworCXZvaWQgZm9ybWF0SGVhZGVyX1RUQ05fVGVtcGxhdGVzKHN0ZDo6b3N0cmVhbSAmIG9zKTsKKwl2b2lkIGZvcm1hdEVuZF9UVENOX1RlbXBsYXRlcyhzdGQ6Om9zdHJlYW0gJiBvcyk7CisJdm9pZCBmb3JtYXRfVFRDTl9UZW1wbGF0ZXMoCisJCQljb25zdCBCRiAmIHZhbHVlLCBCYXNlVHlwZVNwZWNpZmllciAqIGFUUywKKwkJCXN0ZDo6c3RyaW5nIHR5cGVOYW1lLCBhdm1fc2l6ZV90IGFuT2Zmc2V0LAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBUQUIsIGNvbnN0IHN0ZDo6c3RyaW5nICYgQ0hBUik7CisKKworCXZvaWQgZm9ybWF0SGVhZGVyX1RUQ05fVGVzdHNBbmRDb250cm9sKHN0ZDo6b3N0cmVhbSAmIG9zKTsKKwl2b2lkIGZvcm1hdEVuZF9UVENOX1Rlc3RzQW5kQ29udHJvbChzdGQ6Om9zdHJlYW0gJiBvcyk7CisKKwl2b2lkIGZvcm1hdEhlYWRlcl9UVENOX1Rlc3RzQW5kQ29udHJvbF90ZXN0Y2FzZShzdGQ6Om9zdHJlYW0gJiBvcyk7CisJdm9pZCBmb3JtYXRFbmRfVFRDTl9UZXN0c0FuZENvbnRyb2xfdGVzdGNhc2Uoc3RkOjpvc3RyZWFtICYgb3MpOworCisJdm9pZCBmb3JtYXRIZWFkZXJfVFRDTl9Db250cm9sUGFydChzdGQ6Om9zdHJlYW0gJiBvcyk7CisJdm9pZCBmb3JtYXRFbmRfVFRDTl9Db250cm9sUGFydChzdGQ6Om9zdHJlYW0gJiBvcyk7CisJdm9pZCBmb3JtYXRfVFRDTl9Db250cm9sUGFydF9leGVjdXRlKHN0ZDo6b3N0cmVhbSAmIG9zKTsKKworCXZvaWQgZm9ybWF0X1RUQ05fVGVtcGxhdGVzKFRyYWNlU2VxdWVuY2UgKiBhVHJhY2VFbHQpOworCXZvaWQgZm9ybWF0X1RUQ05fVGVtcGxhdGVzKFRyYWNlUG9pbnQgKiBhVHJhY2VQb2ludCk7CisKK307CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKiBUVENOVFJBQ0VGT1JNQVRURVJfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS90cmFjZS9UcmFjZU1hbmFnZXIuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3RyYWNlL1RyYWNlTWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA4NTkzOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS90cmFjZS9UcmFjZU1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsNDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxMyBkw6ljLiAyMDEzCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJUcmFjZU1hbmFnZXIuaCIKKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNFUklBTElaQVRJT04gQVBJCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIFRyYWNlTWFuYWdlcjo6dG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJb3MgPDwgVEFCIDw8ICJUcmFjZXMgbGlzdCA6PiIgPDwgRU9MOworCisJY29uc3RfaXRlcmF0b3IgZW5kSXQgPSBlbmQoKTsKKwlmb3IoIGNvbnN0X2l0ZXJhdG9yIGl0ID0gYmVnaW4oKSA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJeworCQkoKml0KS0+dG9TdHJlYW0ob3MpOworCX0KKwlvcyA8PCBzdGQ6OmZsdXNoOworfQorCisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vdHJhY2UvVHJhY2VNYW5hZ2VyLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vdHJhY2UvVHJhY2VNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc2ZDVjOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS90cmFjZS9UcmFjZU1hbmFnZXIuaApAQCAtMCwwICsxLDExOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDEzIGTDqWMuIDIwMTMKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBUUkFDRU1BTkFHRVJfSF8KKyNkZWZpbmUgVFJBQ0VNQU5BR0VSX0hfCisKKyNpbmNsdWRlICJUcmFjZU5vcm1hbGl6ZXIuaCIKKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vTGlzdC5oPgorCisjaW5jbHVkZSA8Zm1sL3RyYWNlL1RyYWNlU2VxdWVuY2UuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKK2NsYXNzIFRyYWNlRm9ybWF0dGVyOworCisKK2NsYXNzIFRyYWNlTWFuYWdlciAgOiAgcHVibGljIEFQTGlzdDwgVHJhY2VTZXF1ZW5jZSAqID4KK3sKKworcHVibGljOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlhdm1fc2l6ZV90IG5leHRUSUQ7CisKKwlUcmFjZU5vcm1hbGl6ZXIgbm9ybWFsaXplcjsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJVHJhY2VNYW5hZ2VyKCkKKwk6IEFQTGlzdDwgVHJhY2VTZXF1ZW5jZSAqID4oICksCisJbmV4dFRJRCggMCApLAorCisJbm9ybWFsaXplciggKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgflRyYWNlTWFuYWdlcigpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwlhdm1fc2l6ZV90IGN1cnJlbnRUSUQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBuZXh0VElEICk7CisJfQorCisJYXZtX3NpemVfdCBuZXdUSUQoKQorCXsKKwkJcmV0dXJuKCArK25leHRUSUQgKTsKKwl9CisKKwl2b2lkIHJlc2V0VElEKCkKKwl7CisJCW5leHRUSUQgPSAwOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFJFRFVDSU5HIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlubGluZSB2b2lkIHJlZHVjZShUcmFjZVNlcXVlbmNlICogYVRyYWNlRWx0KQorCXsKKwkJbm9ybWFsaXplci5yZWR1Y2UoYVRyYWNlRWx0KTsKKwkJaWYoIGFUcmFjZUVsdC0+cG9pbnRzLm5vbmVtcHR5KCkgKQorCQl7CisJCX0KKwl9CisKKwlpbmxpbmUgdm9pZCBub3JtYWxpemUoKQorCXsKKwkJbm9ybWFsaXplci5ub3JtYWxpemUodGhpcyk7CisJfQorCisJdm9pZCByZXNldFRyYWNlSUQoKQorCXsKKwkJbm9ybWFsaXplci5yZXNldFRyYWNlSUQodGhpcyk7CisJfQorCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFNFUklBTElaQVRJT04gQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCXZpcnR1YWwgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKK307CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKiBUUkFDRU1BTkFHRVJfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS90cmFjZS9UcmFjZU5vcm1hbGl6ZXIuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3RyYWNlL1RyYWNlTm9ybWFsaXplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY4OGM1YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS90cmFjZS9UcmFjZU5vcm1hbGl6ZXIuY3BwCkBAIC0wLDAgKzEsMjA1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTYgZMOpYy4gMjAxMworICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVHJhY2VOb3JtYWxpemVyLmgiCisKKyNpbmNsdWRlICJUcmFjZU1hbmFnZXIuaCIKKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25Db25zdHJ1Y3Rvci5oPgorCisjaW5jbHVkZSA8Zm1sL3RyYWNlL1RyYWNlUG9pbnQuaD4KKyNpbmNsdWRlIDxmbWwvdHJhY2UvVHJhY2VTZXF1ZW5jZS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUkVEVUNJTkcgQVBJCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIFRyYWNlTm9ybWFsaXplcjo6cmVkdWNlKFRyYWNlU2VxdWVuY2UgKiBhVHJhY2VFbHQpCit7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQUNFICkKKwlBVk1fT1NfVFJBQ0UgPDwgc3RkOjplbmRsIDw8ICJUcmFjZU5vcm1hbGl6ZXI6OnJlZHVjZTo+IHN0YXJ0IiA8PCBzdGQ6OmVuZGw7CisJYVRyYWNlRWx0LT50b1N0cmVhbSggQVZNX09TX1RSQUNFICk7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQUNFICkKKworCVRyYWNlUG9pbnQgKiBwcmV2QXNzaWduUG9pbnQgPSBOVUxMOworCVRyYWNlUG9pbnQgKiBwcmV2VGltZVBvaW50ID0gTlVMTDsKKwlUcmFjZVBvaW50ICogY3VycmVudFRyYWNlUG9pbnQgPSBOVUxMOworCisJQkZMaXN0OjppdGVyYXRvciBpdCA9IGFUcmFjZUVsdC0+cG9pbnRzLmJlZ2luKCk7CisJQkZMaXN0OjppdGVyYXRvciBlbmRJdCA9IGFUcmFjZUVsdC0+cG9pbnRzLmVuZCgpOworCWZvciggIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwl7CisJCWlmKCAoKml0KS5pczwgVHJhY2VQb2ludCA+KCkgKQorCQl7CisJCQljdXJyZW50VHJhY2VQb2ludCA9ICgqaXQpLnRvX3B0cjwgVHJhY2VQb2ludCA+KCk7CisKKwkJCS8vIFJlZHVjZSBBc3NpZ24gUG9pbnQKKwkJCWlmKCBjdXJyZW50VHJhY2VQb2ludC0+aXNBc3NpZ24oKSApCisJCQl7CisJCQkJaWYoIChwcmV2QXNzaWduUG9pbnQgIT0gTlVMTCkgJiYKKwkJCQkJcHJldkFzc2lnblBvaW50LT5pc0VRKCpjdXJyZW50VHJhY2VQb2ludCkgKQorCQkJCXsKKwkJCQkJYVRyYWNlRWx0LT5wb2ludHMuZXJhc2UoIGl0ICk7IC0taXQ7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXByZXZBc3NpZ25Qb2ludCA9IGN1cnJlbnRUcmFjZVBvaW50OworCisJCQkJCXByZXZUaW1lUG9pbnQgPSBOVUxMOworCQkJCX0KKwkJCX0KKworCQkJLy8gUmVkdWNlIFRpbWUgUG9pbnQKKwkJCWVsc2UgaWYoIGN1cnJlbnRUcmFjZVBvaW50LT5pc1RpbWUoKSApCisJCQl7CisJCQkJaWYoIChwcmV2VGltZVBvaW50ICE9IE5VTEwpICYmCisJCQkJCShwcmV2VGltZVBvaW50LT5vYmplY3QgPT0gY3VycmVudFRyYWNlUG9pbnQtPm9iamVjdCkgKQorCQkJCXsKKwkJCQkJcHJldlRpbWVQb2ludC0+dmFsdWUgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6OmFkZEV4cHIoCisJCQkJCQkJcHJldlRpbWVQb2ludC0+dmFsdWUsIGN1cnJlbnRUcmFjZVBvaW50LT52YWx1ZSk7CisKKwkJCQkJYVRyYWNlRWx0LT5wb2ludHMuZXJhc2UoIGl0ICk7IC0taXQ7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXByZXZUaW1lUG9pbnQgPSBjdXJyZW50VHJhY2VQb2ludDsKKwkJCQl9CisJCQl9CisKKwkJCWVsc2UgaWYoIGN1cnJlbnRUcmFjZVBvaW50LT5pc1ZpcnR1YWwoKSApCisJCQl7CisJCQkJLy8hISBOT1RISU5HCisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcHJldlRpbWVQb2ludCA9IE5VTEw7CisJCQl9CisJCX0KKworCQllbHNlIGlmKCAoKml0KS5pczwgVHJhY2VTZXF1ZW5jZSA+KCkgKQorCQl7CisJCQlwcmV2VGltZVBvaW50ID0gTlVMTDsKKworCQkJcmVkdWNlKCAoKml0KS50b19wdHI8IFRyYWNlU2VxdWVuY2UgPigpICk7CisJCX0KKworCQllbHNlIC8vIEFueXRoaW5nIGVsc2UKKwkJeworCQkJcHJldlRpbWVQb2ludCA9IE5VTEw7CisJCX0KKwl9CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBQ0UgKQorCUFWTV9PU19UUkFDRSA8PCBzdGQ6OmVuZGwgPDwgIlRyYWNlTm9ybWFsaXplcjo6cmVkdWNlOj4gcmVzdWx0IiA8PCBzdGQ6OmVuZGw7CisJYVRyYWNlRWx0LT50b1N0cmVhbSggQVZNX09TX1RSQUNFICk7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQUNFICkKK30KKworCit2b2lkIFRyYWNlTm9ybWFsaXplcjo6bm9ybWFsaXplKFRyYWNlTWFuYWdlciAqIGFUcmFjZU1hbmFnZXIpCit7CisJVHJhY2VNYW5hZ2VyOjppdGVyYXRvciBvdGhlckl0OworCisJVHJhY2VNYW5hZ2VyOjppdGVyYXRvciBpdCA9IGFUcmFjZU1hbmFnZXItPmJlZ2luKCk7CisJVHJhY2VNYW5hZ2VyOjppdGVyYXRvciBlbmRJdCA9IGFUcmFjZU1hbmFnZXItPmVuZCgpOworCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCXsKKwkJZm9yKCBvdGhlckl0ID0gYVRyYWNlTWFuYWdlci0+YmVnaW4oKSA7IG90aGVySXQgIT0gaXQgOyArK290aGVySXQgKQorCQl7CisJCQlzd2l0Y2goICgqaXQpLT5jb21wYXJlKCpvdGhlckl0KSApCisJCQl7CisJCQkJY2FzZSBBVk1fT1BDT0RFX0VROgorCQkJCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBQ0UgKQorCUFWTV9PU19DT1VUIDw8IHN0ZDo6ZW5kbCA8PCAiVHJhY2VNYW5hZ2VyOjpub3JtYWxpemU6PiAiCisJCQk8PCAoKml0KS0+c3RyKCkgPDwgIiA9ICIgPDwgKCpvdGhlckl0KS0+c3RyKCkgPDwgc3RkOjplbmRsOworCisJQVZNX0lGX0RFQlVHX0xFVkVMX0dURV9ISUdICisJCSgqaXQpLT50b1N0cmVhbShBVk1fT1NfQ09VVCk7CisJCSgqb3RoZXJJdCktPnRvU3RyZWFtKEFWTV9PU19DT1VUKTsKKwlBVk1fRU5ESUZfREVCVUdfTEVWRUxfR1RFX0hJR0gKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBQ0UgKQorCisJCQkJCW90aGVySXQgPSBhVHJhY2VNYW5hZ2VyLT5lcmFzZShvdGhlckl0KTsKKwkJCQkJLS1vdGhlckl0OworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQljYXNlIEFWTV9PUENPREVfR1Q6CisJCQkJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFDRSApCisJQVZNX09TX0NPVVQgPDwgc3RkOjplbmRsIDw8ICJUcmFjZU1hbmFnZXI6Om5vcm1hbGl6ZTo+ICIKKwkJCTw8ICgqaXQpLT5zdHIoKSA8PCAiID4gIiA8PCAoKm90aGVySXQpLT5zdHIoKSA8PCBzdGQ6OmVuZGw7CisKKwlBVk1fSUZfREVCVUdfTEVWRUxfR1RFX0hJR0gKKwkJKCppdCktPnRvU3RyZWFtKEFWTV9PU19DT1VUKTsKKwkJKCpvdGhlckl0KS0+dG9TdHJlYW0oQVZNX09TX0NPVVQpOworCUFWTV9FTkRJRl9ERUJVR19MRVZFTF9HVEVfSElHSAorQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBQUk9DRVNTT1IgLCBUUkFDRSApCisKKwkJCQkJb3RoZXJJdCA9IGFUcmFjZU1hbmFnZXItPmVyYXNlKG90aGVySXQpOworCQkJCQktLW90aGVySXQ7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWNhc2UgQVZNX09QQ09ERV9MVDoKKwkJCQl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQUNFICkKKwlBVk1fT1NfQ09VVCA8PCBzdGQ6OmVuZGwgPDwgIlRyYWNlTWFuYWdlcjo6bm9ybWFsaXplOj4gIgorCQkJPDwgKCppdCktPnN0cigpIDw8ICIgPCAiIDw8ICgqb3RoZXJJdCktPnN0cigpIDw8IHN0ZDo6ZW5kbDsKKworCUFWTV9JRl9ERUJVR19MRVZFTF9HVEVfSElHSAorCQkoKml0KS0+dG9TdHJlYW0oQVZNX09TX0NPVVQpOworCQkoKm90aGVySXQpLT50b1N0cmVhbShBVk1fT1NfQ09VVCk7CisJQVZNX0VORElGX0RFQlVHX0xFVkVMX0dURV9ISUdICitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQUNFICkKKworCQkJCQlpdCA9IGFUcmFjZU1hbmFnZXItPmVyYXNlKGl0KTsKKy8vCQkJCQktLWl0OworCQkJCQlpZiggKC0taXQpID09IG90aGVySXQgKQorCQkJCQl7CisJCQkJCQktLW90aGVySXQ7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworCit2b2lkIFRyYWNlTm9ybWFsaXplcjo6cmVzZXRUcmFjZUlEKFRyYWNlTWFuYWdlciAqIGFUcmFjZU1hbmFnZXIpCit7CisJYVRyYWNlTWFuYWdlci0+cmVzZXRUSUQoKTsKKworCVRyYWNlTWFuYWdlcjo6aXRlcmF0b3IgaXQgPSBhVHJhY2VNYW5hZ2VyLT5iZWdpbigpOworCVRyYWNlTWFuYWdlcjo6aXRlcmF0b3IgZW5kSXQgPSBhVHJhY2VNYW5hZ2VyLT5lbmQoKTsKKwlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwl7CisJCSgqaXQpLT50aWQgPSBhVHJhY2VNYW5hZ2VyLT5uZXdUSUQoKTsKKwl9Cit9CisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3RyYWNlL1RyYWNlTm9ybWFsaXplci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3RyYWNlL1RyYWNlTm9ybWFsaXplci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMWJkOTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vdHJhY2UvVHJhY2VOb3JtYWxpemVyLmgKQEAgLTAsMCArMSw2NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDE2IGTDqWMuIDIwMTMKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBUUkFDRU5PUk1BTElaRVJfSF8KKyNkZWZpbmUgVFJBQ0VOT1JNQUxJWkVSX0hfCisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBUcmFjZU1hbmFnZXI7CitjbGFzcyBUcmFjZVNlcXVlbmNlOworCisKK2NsYXNzIFRyYWNlTm9ybWFsaXplcgoreworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJVHJhY2VOb3JtYWxpemVyKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5UcmFjZU5vcm1hbGl6ZXIoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gUkVEVUNJTkcgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJdm9pZCByZWR1Y2UoVHJhY2VTZXF1ZW5jZSAqIGFUcmFjZUVsdCk7CisKKwl2b2lkIG5vcm1hbGl6ZShUcmFjZU1hbmFnZXIgKiBhVHJhY2VNYW5hZ2VyKTsKKworCXZvaWQgcmVzZXRUcmFjZUlEKFRyYWNlTWFuYWdlciAqIGFUcmFjZU1hbmFnZXIpOworCit9OworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworCisjZW5kaWYgLyogVFJBQ0VOT1JNQUxJWkVSX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vdHJhY2UvVHJhY2VOdW1lcml6ZXIuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3RyYWNlL1RyYWNlTnVtZXJpemVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTVlNzM4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZmFtL3RyYWNlL1RyYWNlTnVtZXJpemVyLmNwcApAQCAtMCwwICsxLDI4NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDYgamFudi4gMjAxNAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVHJhY2VOdW1lcml6ZXIuaCIKKworI2luY2x1ZGUgIlRyYWNlTWFuYWdlci5oIgorCisjaW5jbHVkZSA8Y29tcHV0ZXIvRXZhbHVhdGlvbkVudmlyb25tZW50Lmg+CisKKyNpbmNsdWRlIDxzb2x2ZXIvYXBpL1NvbHZlckZhY3RvcnkuaD4KKworI2luY2x1ZGUgPGZtbC90cmFjZS9UcmFjZVBvaW50Lmg+CisjaW5jbHVkZSA8Zm1sL3RyYWNlL1RyYWNlU2VxdWVuY2UuaD4KKworI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9RdWVyeS5oPgorI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9XT2JqZWN0Lmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDT05GSUdVUkUgQVBJCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKgorcHJvdG90eXBlIHByb2Nlc3M6OnRyYWNlX2dlbmVyYXRvciBhcyAmYXZtOjpwcm9jZXNzb3IuVFJBQ0VfR0VORVJBVE9SIGlzCisgc2VjdGlvbiBQUk9QRVJUWQorICAuLi4KKyAgLy8gJ09NRUdBJyB8ICdDVkM0JyB8ICdaMycgfCAnWUlDRVMnCisgIEBzb2x2ZXIgPSAnQ1ZDNCc7CisKKyAgQG51bWVyaXplciA9ICdTT0xWRVInOyAgLy8gU09MVkVSIHwgTk9ORSB8IE5FV0ZSRVNICisgIC4uLgorIGVuZHNlY3Rpb24gUFJPUEVSVFkKKworIC4uLgorCitlbmRwcm90b3R5cGUKKyovCisKK2Jvb2wgVHJhY2VOdW1lcml6ZXI6OmNvbmZpZ3VyZShXT2JqZWN0ICogd2ZQYXJhbWV0ZXJPYmplY3QpCit7CisJV09iamVjdCAqIHRoZVBST1BFUlRZID0gUXVlcnk6OmdldFJlZ2V4V1NlcXVlbmNlKHdmUGFyYW1ldGVyT2JqZWN0LAorCQkJT1JfV0lEMigicHJvcGVydHkiLCAiUFJPUEVSVFkiKSwgd2ZQYXJhbWV0ZXJPYmplY3QpOworCisJaWYoIHRoZVBST1BFUlRZICE9IFdPYmplY3Q6Ol9OVUxMXyApCisJeworCQlzdGQ6OnN0cmluZyBzdHJBdHRyaWJydXRlID0gUXVlcnk6OmdldFdQcm9wZXJ0eVN0cmluZygKKwkJCQl0aGVQUk9QRVJUWSwgIm51bWVyaXplciIsICJTT0xWRVIiKTsKKwkJaWYoIHN0ckF0dHJpYnJ1dGUgPT0gIlNPTFZFUiIgKQorCQl7CisJCQltTnVtZXJpemVyT3BlcmF0b3IgPSBBVk1fT1BDT0RFX0NIRUNLX1NBVDsKKwkJfQorCQllbHNlIGlmKCBzdHJBdHRyaWJydXRlID09ICJORVdGUkVTSCIgKQorCQl7CisJCQltTnVtZXJpemVyT3BlcmF0b3IgPSBBVk1fT1BDT0RFX0FTU0lHTl9ORVdGUkVTSDsKKwkJfQorCQllbHNlIC8vaWYoIHN0ckF0dHJpYnJ1dGUgPT0gIk5PTkUiICkKKwkJeworCQkJbU51bWVyaXplck9wZXJhdG9yID0gQVZNX09QQ09ERV9OT1A7CisJCX0KKworCisJCXN0ckF0dHJpYnJ1dGUgPSBRdWVyeTo6Z2V0V1Byb3BlcnR5U3RyaW5nKHRoZVBST1BFUlRZLCAic29sdmVyIiwgIiIpOworCisJCW1Tb2x2ZXJLaW5kID0gU29sdmVyRGVmOjp0b1NvbHZlcigKKwkJCQlzdHJBdHRyaWJydXRlLCBTb2x2ZXJEZWY6OkRFRkFVTFRfU09MVkVSX0tJTkQpOworCX0KKworCXJldHVybiB0cnVlOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBOVU1FUklaRSBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgVHJhY2VOdW1lcml6ZXI6Om51bWVyaXplKFRyYWNlTWFuYWdlciAmIGFUcmFjZU1hbmFnZXIpCit7CisJc3dpdGNoKCBtTnVtZXJpemVyT3BlcmF0b3IgKSB7CisJCWNhc2UgQVZNX09QQ09ERV9DSEVDS19TQVQ6CisJCXsKKwkJCW51bWVyaXplU29sdmVyKCBhVHJhY2VNYW5hZ2VyICk7CisKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgQVZNX09QQ09ERV9BU1NJR05fTkVXRlJFU0g6CisJCXsKKwkJCW51bWVyaXplTmV3ZnJlc2goIGFUcmFjZU1hbmFnZXIgKTsKKworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBBVk1fT1BDT0RFX05PUDoKKwkJeworCQkJbnVtZXJpemVOb3RoaW5nKCBhVHJhY2VNYW5hZ2VyICk7CisKKwkJCWJyZWFrOworCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJbnVtZXJpemVTb2x2ZXIoIGFUcmFjZU1hbmFnZXIgKTsKKworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKwordm9pZCBUcmFjZU51bWVyaXplcjo6bnVtZXJpemVTb2x2ZXIoVHJhY2VNYW5hZ2VyICYgYVRyYWNlTWFuYWdlcikKK3sKKwlUcmFjZU1hbmFnZXI6Oml0ZXJhdG9yIGl0ID0gYVRyYWNlTWFuYWdlci5iZWdpbigpOworCVRyYWNlTWFuYWdlcjo6aXRlcmF0b3IgZW5kSXQgPSBhVHJhY2VNYW5hZ2VyLmVuZCgpOworCXdoaWxlKCBpdCAhPSBlbmRJdCApCisJeworCQlhVHJhY2VFbGVtZW50ID0gKCppdCk7CisKKwkJYVRyYWNlRUMgPSBhVHJhY2VFbGVtZW50LT5tRUM7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIFNPTFZJTkcgLCBUUkFDRSApCisJQVZNX09TX1RSQUNFIDw8ICJBdmFudCBsYSByw6lzb2x1dGlvbiBwYXIgbGUgc29sdmV1ci4uLiIgPDwgRU9MX0ZMVVNIOworCS8vCWFUcmFjZUVDLT5yZWZFeGVjdXRpb25EYXRhKCkudG9TdHJlYW1EYXRhKEFWTV9PU19UUkFDRSk7CisJYVRyYWNlRUMtPnJlZkV4ZWN1dGlvbkRhdGEoKS5nZXRQYXJhbWV0ZXJzUnVudGltZUZvcm0oKS4KKwkJCXRvU3RyZWFtRGF0YShhVHJhY2VFQy0+Z2V0RXhlY3V0aW9uRGF0YSgpLCBBVk1fT1NfVFJBQ0UpOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgU09MVklORyAsIFRSQUNFICkKKworCQltb2RlbEVEID0gU29sdmVyRmFjdG9yeTo6c29sdmUobVNvbHZlcktpbmQsIEVOViwgKCogYVRyYWNlRUMpLAorCQkJCWFUcmFjZUVDLT5yZWZFeGVjdXRpb25EYXRhKCkuZ2V0QWxsUGF0aENvbmRpdGlvbigpICk7CisKKwkJaWYoIG1vZGVsRUQuaW52YWxpZCgpICkKKwkJeworQVZNX0lGX0RFQlVHX0VOQUJMRUQKKwlBVk1fT1NfV0FSTiA8PCAiRXJyb3IgY2hlY2tpbmcgbW9kZWw6IHRyYWNlIDwgIgorCQkJPDwgYVRyYWNlRWxlbWVudC0+dGlkIDw8ICIgPiBmb3IgbGVhZiBjb250ZXh0ICIKKwkJCTw8IGFUcmFjZUVDLT5zdHJfbWluKCkgIDw8IHN0ZDo6ZW5kbCA8PCAiIHw9ICIKKwkJCTw8IGFUcmFjZUVDLT5yZWZFeGVjdXRpb25EYXRhKCkuZ2V0QWxsUGF0aENvbmRpdGlvbigpLndyYXBTdHIoKQorCQkJPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0VOQUJMRUQKKworCQkJLy8gaXRlcmF0b3IgaW5jcmVtZW50YXRpb24KKwkJCWl0ID0gYVRyYWNlTWFuYWdlci5lcmFzZSggaXQgKTsKKworCQkJY29udGludWU7CisJCX0KKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgU09MVklORyAsIFRSQUNFICkKKwlBVk1fT1NfVFJBQ0UgPDwgIkFwcsOocyBsYSByw6lzb2x1dGlvbiBwYXIgbGUgc29sdmV1ci4uLiIgPDwgRU9MX0ZMVVNIOworLy8JbW9kZWxFRC0+dG9TdHJlYW1EYXRhKEFWTV9PU19UUkFDRSk7CisJbW9kZWxFRC0+Z2V0UGFyYW1ldGVyc1J1bnRpbWVGb3JtKCkudG9TdHJlYW1EYXRhKG1vZGVsRUQsIEFWTV9PU19UUkFDRSk7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBTT0xWSU5HICwgVFJBQ0UgKQorCisJCVNvbHZlckZhY3Rvcnk6OnNldE1vZGVsKEVOViwgbW9kZWxFRCk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIFNPTFZJTkcgLCBUUkFDRSApCisJQVZNX09TX1RSQUNFIDw8ICJBcHLDqHMgbGEgZ8OpbsOpcmF0aW9uIGR1IG1vZMOobGUgcGFyIGxlIHNvbHZldXIuLi4iIDw8IEVPTF9GTFVTSDsKKy8vCW1vZGVsRUQtPnRvU3RyZWFtRGF0YShBVk1fT1NfVFJBQ0UpOworCW1vZGVsRUQtPmdldFBhcmFtZXRlcnNSdW50aW1lRm9ybSgpLnRvU3RyZWFtRGF0YShtb2RlbEVELCBBVk1fT1NfVFJBQ0UpOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgU09MVklORyAsIFRSQUNFICkKKworCQludW1lcml6ZShhVHJhY2VFbGVtZW50KTsKKworCQlTb2x2ZXJGYWN0b3J5OjpyZXNldE1vZGVsKG1vZGVsRUQpOworCisJCS8vIGl0ZXJhdG9yIGluY3JlbWVudGF0aW9uCisJCSsraXQ7CisJfQorfQorCisKK3ZvaWQgVHJhY2VOdW1lcml6ZXI6Om51bWVyaXplTmV3ZnJlc2goVHJhY2VNYW5hZ2VyICYgYVRyYWNlTWFuYWdlcikKK3sKKwlUcmFjZU1hbmFnZXI6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYVRyYWNlTWFuYWdlci5iZWdpbigpOworCVRyYWNlTWFuYWdlcjo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBhVHJhY2VNYW5hZ2VyLmVuZCgpOworCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCXsKKwkJYVRyYWNlRWxlbWVudCA9ICgqaXQpOworCisJCWFUcmFjZUVDID0gYVRyYWNlRWxlbWVudC0+bUVDOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBTT0xWSU5HICwgVFJBQ0UgKQorCUFWTV9PU19UUkFDRSA8PCAiQXZhbnQgbGEgcsOpc29sdXRpb24gcGFyIGxlIHNvbHZldXIuLi4iIDw8IEVPTF9GTFVTSDsKKwkvLwlhVHJhY2VFQy0+cmVmRXhlY3V0aW9uRGF0YSgpLnRvU3RyZWFtRGF0YShBVk1fT1NfVFJBQ0UpOworCWFUcmFjZUVDLT5yZWZFeGVjdXRpb25EYXRhKCkuZ2V0UGFyYW1ldGVyc1J1bnRpbWVGb3JtKCkudG9TdHJlYW1EYXRhKAorCQkJYVRyYWNlRUMtPmdldEV4ZWN1dGlvbkRhdGEoKSwgQVZNX09TX1RSQUNFKTsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIFNPTFZJTkcgLCBUUkFDRSApCisKKwkJbW9kZWxFRCA9IFNvbHZlckZhY3Rvcnk6OnNvbHZlTmV3ZnJlc2gobVNvbHZlcktpbmQsIEVOViwgKCogYVRyYWNlRUMpLAorCQkJCWFUcmFjZUVDLT5yZWZFeGVjdXRpb25EYXRhKCkuZ2V0QWxsUGF0aENvbmRpdGlvbigpICk7CisKKwkJaWYoIG1vZGVsRUQuaW52YWxpZCgpICkKKwkJeworQVZNX0lGX0RFQlVHX0VOQUJMRUQKKwkJCUFWTV9PU19XQVJOIDw8ICJFcnJvciBjaGVja2luZyBtb2RlbCBmb3IgOj4gIgorCQkJCQk8PCBhVHJhY2VFQy0+c3RyX21pbigpIDw8IHN0ZDo6ZW5kbCA8PCAiIHw9ICIKKwkJCQkJPDwgYVRyYWNlRUMtPnJlZkV4ZWN1dGlvbkRhdGEoKS5nZXRBbGxQYXRoQ29uZGl0aW9uKCkuc3RyKCkKKwkJCQkJPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0VOQUJMRUQKKworCQkJY29udGludWU7CisJCX0KKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgU09MVklORyAsIFRSQUNFICkKKwlBVk1fT1NfVFJBQ0UgPDwgIkFwcsOocyBsYSByw6lzb2x1dGlvbiAvIGfDqW7DqXJhdGlvbiBwYXIgbGUgc29sdmV1ci4uLiIgPDwgRU9MX0ZMVVNIOworLy8JbW9kZWxFRC0+dG9TdHJlYW1EYXRhKEFWTV9PU19UUkFDRSk7CisJbW9kZWxFRC0+Z2V0UGFyYW1ldGVyc1J1bnRpbWVGb3JtKCkudG9TdHJlYW1EYXRhKG1vZGVsRUQsIEFWTV9PU19UUkFDRSk7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBTT0xWSU5HICwgVFJBQ0UgKQorCisJCW51bWVyaXplKGFUcmFjZUVsZW1lbnQpOworCisJCVNvbHZlckZhY3Rvcnk6OnJlc2V0TW9kZWwobW9kZWxFRCk7CisJfQorfQorCit2b2lkIFRyYWNlTnVtZXJpemVyOjpudW1lcml6ZU5vdGhpbmcoVHJhY2VNYW5hZ2VyICYgYVRyYWNlTWFuYWdlcikKK3sKKwkvLyEhIE5PVEhJTkcKK30KKworCit2b2lkIFRyYWNlTnVtZXJpemVyOjpudW1lcml6ZShUcmFjZVNlcXVlbmNlICogYVRyYWNlRWx0KQoreworCUJGTGlzdDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBhVHJhY2VFbHQtPnBvaW50cy5iZWdpbigpOworCUJGTGlzdDo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBhVHJhY2VFbHQtPnBvaW50cy5lbmQoKTsKKwlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwl7CisJCWlmKCAoKml0KS5pczwgVHJhY2VQb2ludCA+KCkgKQorCQl7CisJCQludW1lcml6ZSggKCppdCkudG9fcHRyPCBUcmFjZVBvaW50ID4oKSApOworCQl9CisKKwkJZWxzZSBpZiggKCppdCkuaXM8IFRyYWNlU2VxdWVuY2UgPigpICkKKwkJeworCQkJbnVtZXJpemUoICgqaXQpLnRvX3B0cjwgVHJhY2VTZXF1ZW5jZSA+KCkgKTsKKwkJfQorCX0KK30KKwordm9pZCBUcmFjZU51bWVyaXplcjo6bnVtZXJpemUoVHJhY2VQb2ludCAqIGFUcmFjZVBvaW50KQoreworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBTT0xWSU5HICwgVFJBQ0UgKQorCUFWTV9PU19UUkFDRSA8PCAiVHJhY2VOdW1lcml6ZXI6Om51bWVyaXplKFRyYWNlUG9pbnQpOj4gIiA8PCBzdGQ6OmVuZGw7CisJYVRyYWNlUG9pbnQtPnRvU3RyZWFtKEFWTV9PU19UUkFDRSk7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFNPTFZJTkcgLCBUUkFDRSApCisKKwlpZiggYVRyYWNlUG9pbnQtPnZhbHVlLmludmFsaWQoKSApCisJeworCQkvLyEhIE5PVElORworCX0KKwllbHNlIGlmKCBhVHJhY2VQb2ludC0+dmFsdWUuaXM8IEFycmF5QkYgPigpICkKKwl7CisJCWlmKCBFTlYuZXZhbChtb2RlbEVELCBtb2RlbEVELT5nZXRTeXN0ZW1SSUQoKSwgYVRyYWNlUG9pbnQtPnZhbHVlKSApCisJCXsKKwkJCWFUcmFjZVBvaW50LT52YWx1ZSA9IEVOVi5vdXRWQUw7CisJCX0KKwl9CisJZWxzZSBpZiggYVRyYWNlUG9pbnQtPnZhbHVlLmlzPCBCdWlsdGluRm9ybSA+KCkgKQorCXsKKwkJLy8hISBOT1RJTkcKKwl9CisJZWxzZSBpZiggRU5WLmV2YWwobW9kZWxFRCwgbW9kZWxFRC0+Z2V0U3lzdGVtUklEKCksIGFUcmFjZVBvaW50LT52YWx1ZSkgKQorCXsKKwkJYVRyYWNlUG9pbnQtPnZhbHVlID0gRU5WLm91dFZBTDsKKwl9CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgU09MVklORyAsIFRSQUNFICkKKwlhVHJhY2VQb2ludC0+dG9TdHJlYW0oQVZNX09TX1RSQUNFKTsKKwlBVk1fT1NfVFJBQ0UgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBNRURJVU0gLCBTT0xWSU5HICwgVFJBQ0UgKQorfQorCisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vdHJhY2UvVHJhY2VOdW1lcml6ZXIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZhbS90cmFjZS9UcmFjZU51bWVyaXplci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NGQwNTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mYW0vdHJhY2UvVHJhY2VOdW1lcml6ZXIuaApAQCAtMCwwICsxLDEwNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDYgamFudi4gMjAxNAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFRSQUNFTlVNRVJJWkVSX0hfCisjZGVmaW5lIFRSQUNFTlVNRVJJWkVSX0hfCisKKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25EYXRhLmg+CisKKyNpbmNsdWRlIDxzb2x2ZXIvYXBpL1NvbHZlckRlZi5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworY2xhc3MgRXhlY3V0aW9uQ29udGV4dDsKK2NsYXNzIEV2YWx1YXRpb25FbnZpcm9ubWVudDsKKworY2xhc3MgVHJhY2VNYW5hZ2VyOworY2xhc3MgVHJhY2VQb2ludDsKK2NsYXNzIFRyYWNlU2VxdWVuY2U7CisKKworY2xhc3MgVHJhY2VOdW1lcml6ZXIKK3sKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlBVk1fT1BDT0RFIG1OdW1lcml6ZXJPcGVyYXRvcjsKKworCVNvbHZlckRlZjo6U09MVkVSX0tJTkQgbVNvbHZlcktpbmQ7CisKKwlFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBFTlY7CisJQVBFeGVjdXRpb25EYXRhIG1vZGVsRUQ7CisKKwljb25zdCBFeGVjdXRpb25Db250ZXh0ICogYVRyYWNlRUM7CisJVHJhY2VTZXF1ZW5jZSAqIGFUcmFjZUVsZW1lbnQ7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCVRyYWNlTnVtZXJpemVyKEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIGFuRU5WKQorCTogbU51bWVyaXplck9wZXJhdG9yKCBBVk1fT1BDT0RFX0NIRUNLX1NBVCApLAorCW1Tb2x2ZXJLaW5kKCBTb2x2ZXJEZWY6OlNPTFZFUl9VTkRFRklORURfS0lORCApLAorCUVOViggYW5FTlYgKSwKKwltb2RlbEVEKCApLAorCisJYVRyYWNlRUMoIE5VTEwgKSwKKwlhVHJhY2VFbGVtZW50KCBOVUxMICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5UcmFjZU51bWVyaXplcigpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBDT05GSUdVUkUgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJYm9vbCBjb25maWd1cmUoV09iamVjdCAqIHdmUGFyYW1ldGVyT2JqZWN0KTsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIE5VTUVSSVpFIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXZvaWQgbnVtZXJpemUoVHJhY2VNYW5hZ2VyICYgYVRyYWNlTWFuYWdlcik7CisKKwl2b2lkIG51bWVyaXplU29sdmVyKFRyYWNlTWFuYWdlciAmIGFUcmFjZU1hbmFnZXIpOworCXZvaWQgbnVtZXJpemVOZXdmcmVzaChUcmFjZU1hbmFnZXIgJiBhVHJhY2VNYW5hZ2VyKTsKKwl2b2lkIG51bWVyaXplTm90aGluZyhUcmFjZU1hbmFnZXIgJiBhVHJhY2VNYW5hZ2VyKTsKKworCXZvaWQgbnVtZXJpemUoVHJhY2VTZXF1ZW5jZSAqIGFUcmFjZUVsdCk7CisJdm9pZCBudW1lcml6ZShUcmFjZVBvaW50ICogYVRyYWNlUG9pbnQpOworCit9OworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworCisjZW5kaWYgLyogVFJBQ0VOVU1FUklaRVJfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9DTWFrZUxpc3RzLnR4dCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDA2MjhhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMjEgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisjICAgICAgICAgICAgICAgICAgICBDTWFrZSBmaWxlIGZvciB0aGUgRk1MIGxpYnJhcnkgDQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKw0KKyMgQysrIHNvdXJjZSBmaWxlcyB0byB0YWtlIGludG8gYWNjb3VudCAoYWxsIGZpbGVzIG1hdGNoaW5nIHBhdHRlcm5zLCByZWN1cnNpdmVseSkNCitmaWxlIChHTE9CX1JFQ1VSU0UgRk1MX0NYWF9TUkNfRklMRVMgKi5jcHAgKi5oKQ0KKw0KKyMgVGFyZ2V0IHRvIGJ1aWxkDQorYWRkX2xpYnJhcnkgKGZtbCBTVEFUSUMgJHtGTUxfQ1hYX1NSQ19GSUxFU30pDQorDQorIyBJbmNsdWRlIGRpcmVjdG9yaWVzIChpbnRlcm5hbCkNCit0YXJnZXRfaW5jbHVkZV9kaXJlY3RvcmllcyAoZm1sIFBVQkxJQyAuLikgI8KgRklYTUUgOiBleHBsaWNpdCB0aGUgZGVwZW5kZW5jaWVzIGxpYiBieSBsaWINCisNCisjIFRhcmdldCBpbmNsdWRlIGRpcmVjdG9yaWVzIChleHRlcm5hbCkNCit0YXJnZXRfaW5jbHVkZV9kaXJlY3RvcmllcyAoZm1sIFBVQkxJQyAke0dNUF9JTkNMVURFX0RJUn0gJHtHTVBYWF9JTkNMVURFX0RJUn0pDQordGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMgKGZtbCBQVUJMSUMgJHtCb29zdF9JTkNMVURFX0RJUlN9KQ0KK3RhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzIChmbWwgUFVCTElDICR7Q1ZDNF9JTkNMVURFX0RJUn0pDQorDQorDQorYWRkX2RlcGVuZGVuY2llcyhmbWwgcmVzY2FuX2N2YzQpDQorDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL1JFQURNRS5tZCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAzZmE5MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9SRUFETUUubWQKQEAgLTAsMCArMSw0MyBAQAorIyBFRk0tU1lNQkVYLUZNTCA6IEZvcm1hbCBNb2RlbGluZyBMYW5ndWFnZQorCisjIyBTb3VyY2UgY29kZSBzdHJ1Y3R1cmUKKworCisjIyMgRm9sZGVyICpDb21tb24qCitbQ29tbW9uIENsYXNzZXNdKGNvbW1vbi9SRUFETUUubWQpCisKKworIyMjIEZvbGRlciAqbnVtZXJpYyoKK1tOdW1lcmljIENsYXNzZXNdKG51bWVyaWMvUkVBRE1FLm1kKQorCisKKyMjIyBGb2xkZXIgKnN5bWJvbCoKK1tTeW1ib2wgQ2xhc3Nlc10oc3ltYm9sL1JFQURNRS5tZCkKKworCisjIyMgRm9sZGVyICpleHByZXNzaW9uKgorW0V4cHJlc3Npb24gQ2xhc3Nlc10oZXhwcmVzc2lvbi9SRUFETUUubWQpCisKKworIyMjIEZvbGRlciAqb3BlcmF0b3IqCitbT3BlcmF0b3IgQ2xhc3Nlc10ob3BlcmF0b3IvUkVBRE1FLm1kKQorCisKKyMjIyBGb2xkZXIgKmluc3RydWN0aW9uKgorW0luc3RydWN0aW9uIENsYXNzZXNdKGluc3RydWN0aW9uL1JFQURNRS5tZCkKKworCisjIyMgRm9sZGVyICpzdGF0ZW1lbnQqCitbQmFzZSBDbGFzc2VzXShiYXNlL1JFQURNRS5tZCkKKworCisjIyMgRm9sZGVyICp0eXBlKgorW1R5cGUgQ2xhc3Nlc10odHlwZS9SRUFETUUubWQpCisKKworIyMjIEZvbGRlciAqaW5mcmFzdHJ1Y3R1cmUqCitbSW5mcmFzdHJ1Y3R1cmUgQ2xhc3Nlc10oaW5mcmFzdHJ1Y3R1cmUvUkVBRE1FLm1kKQorCisjIyMgRm9sZGVyICpydW50aW1lKgorW1J1bnRpbWUgQ2xhc3Nlc10ocnVudGltZS9SRUFETUUubWQpCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9idWZmZXIvQmFzZUJ1ZmZlckZvcm0uY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2J1ZmZlci9CYXNlQnVmZmVyRm9ybS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhlNjcyYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9idWZmZXIvQmFzZUJ1ZmZlckZvcm0uY3BwCkBAIC0wLDAgKzEsMTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJCYXNlQnVmZmVyRm9ybS5oIgorCituYW1lc3BhY2Ugc2VwCit7CisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2J1ZmZlci9CYXNlQnVmZmVyRm9ybS5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2J1ZmZlci9CYXNlQnVmZmVyRm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZTNiZDUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvYnVmZmVyL0Jhc2VCdWZmZXJGb3JtLmgKQEAgLTAsMCArMSwyMjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgQkFTRUJVRkZFUkZPUk1fSF8KKyNkZWZpbmUgQkFTRUJVRkZFUkZPUk1fSF8KKworI2luY2x1ZGUgPGNvbW1vbi9FbGVtZW50Lmg+CisKKyNpbmNsdWRlIDxjb21tb24vQXZtUG9pbnRlci5oPgorCisjaW5jbHVkZSA8Y29sbGVjdGlvbi9UeXBlZGVmLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mQnVmZmVyLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZlBvcnQuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL01lc3NhZ2UuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL1J1bnRpbWVJRC5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjbGFzcyBSdW50aW1lSUQ7CisKKworY2xhc3MgQmFzZUJ1ZmZlckZvcm0gOgorCQlwdWJsaWMgRWxlbWVudCAsCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggQmFzZUJ1ZmZlckZvcm0gKQoreworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQVRUUklCVVRFCisJICovCisJSW5zdGFuY2VPZkJ1ZmZlciAqIG1CdWZmZXJJbnRhbmNlOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlCYXNlQnVmZmVyRm9ybShjbGFzc19raW5kX3QgYUNsYXNzS2luZCwgSW5zdGFuY2VPZkJ1ZmZlciAqIGFCdWZmZXIpCisJOiBFbGVtZW50KCBhQ2xhc3NLaW5kICksCisJbUJ1ZmZlckludGFuY2UoIGFCdWZmZXIgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICogQWJzdHJhY3QgcHVyCisJICovCisJQmFzZUJ1ZmZlckZvcm0oY29uc3QgQmFzZUJ1ZmZlckZvcm0gJiBhQnVmZmVyKQorCTogRWxlbWVudCggYUJ1ZmZlciApLAorCW1CdWZmZXJJbnRhbmNlKCBhQnVmZmVyLm1CdWZmZXJJbnRhbmNlICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+QmFzZUJ1ZmZlckZvcm0oKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBDTE9ORQorCSAqLworCXZpcnR1YWwgQmFzZUJ1ZmZlckZvcm0gKiBjbG9uZSgpIGNvbnN0ID0gMDsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIEJVRkZFUiBNQU5BR0VNRU5UIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvKioKKwkgKiBlbXB0aW5lc3MKKwkgKiBzaXplCisJICovCisJdmlydHVhbCBib29sIGVtcHR5KCkgY29uc3QgPSAwOworCisJdmlydHVhbCBib29sIG5vbmVtcHR5KCkgY29uc3QgPSAwOworCisJdmlydHVhbCBib29sIHNpbmdsZXRvbigpIGNvbnN0ID0gMDsKKworCXZpcnR1YWwgYm9vbCBwb3B1bGF0ZWQoKSBjb25zdCA9IDA7CisKKwl2aXJ0dWFsIGJvb2wgZnVsbCgpIGNvbnN0ID0gMDsKKworCXZpcnR1YWwgYXZtX3NpemVfdCBzaXplKCkgY29uc3QgPSAwOworCisJLyoqCisJICogQ29tcGFyaXNvbgorCSAqIG9wZXJhdG9yPT0KKwkgKi8KKwl2aXJ0dWFsIGJvb2wgZXF1YWxzKGNvbnN0IEJhc2VCdWZmZXJGb3JtICYgYUJ1ZmZlcikgY29uc3QgPSAwOworCisJLyoqCisJICogY2xlYXIKKwkgKiByZXNpemUKKwkgKi8KKwl2aXJ0dWFsIHZvaWQgY2xlYXIoKSA9IDA7CisKKwl2aXJ0dWFsIHZvaWQgcmVzaXplKGF2bV9zaXplX3QgbmV3U2l6ZSkgPSAwOworCXZpcnR1YWwgdm9pZCByZXNpemUoYXZtX3NpemVfdCBuZXdTaXplLCBjb25zdCBNZXNzYWdlICYgYU1zZykgPSAwOworCisJLyoqCisJICogcHVzaAorCSAqIHRvcAorCSAqLworCXZpcnR1YWwgYm9vbCBwdXNoKGNvbnN0IE1lc3NhZ2UgJiBhTXNnKSA9IDA7CisKKwl2aXJ0dWFsIGJvb2wgdG9wKGNvbnN0IE1lc3NhZ2UgJiBhTXNnKSA9IDA7CisKKwl2aXJ0dWFsIGNvbnN0IE1lc3NhZ2UgJiB0b3AoKSBjb25zdCA9IDA7CisJdmlydHVhbCBjb25zdCBNZXNzYWdlICYgdG9wKGF2bV9zaXplX3QgbWlkLAorCQkJY29uc3QgUnVudGltZUlEICYgYVJlY2VpdmVyUklECisJCQkJCT0gUnVudGltZUlEOjpSRUZfTlVMTCkgY29uc3QgPSAwOworCisJaW5saW5lIHZpcnR1YWwgYm9vbCBpc1RvcChhdm1fc2l6ZV90IG1pZCwKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSZWNlaXZlclJJRAorCQkJCQk9IFJ1bnRpbWVJRDo6UkVGX05VTEwpIGNvbnN0CisJeworCQlyZXR1cm4oIHRvcChtaWQsIGFSZWNlaXZlclJJRCkudmFsaWQoKSApOworCX0KKworCS8qKgorCSAqIGNvbnRhaW5zCisJICogdW5jb250YWlucworCSAqLworCXZpcnR1YWwgYm9vbCBjb250YWlucyhhdm1fc2l6ZV90IG1pZCwKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSZWNlaXZlclJJRAorCQkJCQk9IFJ1bnRpbWVJRDo6UkVGX05VTEwpIGNvbnN0ID0gMDsKKworCXZpcnR1YWwgYm9vbCBjb250YWlucyhJbnN0YW5jZU9mUG9ydCAqIGFTaWduYWwsCisJCQljb25zdCBSdW50aW1lSUQgJiBhUmVjZWl2ZXJSSUQKKwkJCQkJPSBSdW50aW1lSUQ6OlJFRl9OVUxMKSBjb25zdCA9IDA7CisKKwl2aXJ0dWFsIGJvb2wgY29udGFpbnMoTGlzdE9mSW5zdGFuY2VPZlBvcnQgJiBhU2lnbmFsVHJhY2UsCisJCQljb25zdCBSdW50aW1lSUQgJiBhUmVjZWl2ZXJSSUQKKwkJCQkJPSBSdW50aW1lSUQ6OlJFRl9OVUxMKSBjb25zdCA9IDA7CisKKwl2aXJ0dWFsIGJvb2wgdW5jb250YWlucyhMaXN0T2ZJbnN0YW5jZU9mUG9ydCAmIGFTaWduYWxUcmFjZSwKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSZWNlaXZlclJJRAorCQkJCQk9IFJ1bnRpbWVJRDo6UkVGX05VTEwpIGNvbnN0ID0gMDsKKworCS8qKgorCSAqIHBvcAorCSAqLworCXZpcnR1YWwgTWVzc2FnZSBwb3AoKSA9IDA7CisKKwl2aXJ0dWFsIE1lc3NhZ2UgcG9wKGF2bV9zaXplX3QgbWlkLAorCQkJY29uc3QgUnVudGltZUlEICYgYVJlY2VpdmVyUklEID0gUnVudGltZUlEOjpSRUZfTlVMTCkgPSAwOworCisKKwl2aXJ0dWFsIHZvaWQgcG9wQmVmb3JlKGNvbnN0IFJ1bnRpbWVJRCAmIGFSZWNlaXZlclJJRCkgPSAwOworCisJdmlydHVhbCB2b2lkIHBvcEJlZm9yZShjb25zdCBMaXN0T2ZJbnN0YW5jZU9mUG9ydCAmIGllQ29tcywKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSZWNlaXZlclJJRCA9IFJ1bnRpbWVJRDo6UkVGX05VTEwpID0gMDsKKworCXZpcnR1YWwgdm9pZCBwb3BCZWZvcmUoY29uc3QgTGlzdE9mU2l6ZVQgJiBpZUNvbXMsCisJCQljb25zdCBSdW50aW1lSUQgJiBhUmVjZWl2ZXJSSUQgPSBSdW50aW1lSUQ6OlJFRl9OVUxMKSA9IDA7CisKKworCS8qKgorCSAqIHJlbW92ZQorCSAqIGNvcHlUbworCSAqIHJlc3RvcmUKKwkgKi8KKwl2aXJ0dWFsIHZvaWQgcmVtb3ZlKEluc3RhbmNlT2ZQb3J0ICogYVBvcnQpID0gMDsKKworCXZpcnR1YWwgdm9pZCBjb3B5VG8oQmFzZUJ1ZmZlckZvcm0gJiBhQnVmZmVyKSBjb25zdCA9IDA7CisKKwl2aXJ0dWFsIHZvaWQgcmVzdG9yZShMaXN0T2ZNZXNzYWdlICYgbGlzdE9mTWVzc2FnZSkgPSAwOworCisKKwkvKioKKwkgKiBTZXJpYWxpemUKKwkgKi8KKwl2aXJ0dWFsIHZvaWQgdG9Gc2NuKE91dFN0cmVhbSAmIG9zLCBjb25zdCBSdW50aW1lSUQgJiBhUklELAorCQkJY29uc3QgQmFzZUJ1ZmZlckZvcm0gKiBwcmV2QnVmID0gTlVMTCkgY29uc3QgPSAwOworCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiB0aGVJbnN0YW5jZQorCSAqLworCWlubGluZSBJbnN0YW5jZU9mQnVmZmVyICogZ2V0SW5zdGFuY2UoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQnVmZmVySW50YW5jZSApOworCX0KKworCWlubGluZSBib29sIGhhc0luc3RhbmNlKCkgY29uc3QKKwl7CisJCXJldHVybiggbUJ1ZmZlckludGFuY2UgIT0gTlVMTCApOworCX0KKworfTsKKworCit9CisKKyNlbmRpZiAvKkJBU0VCVUZGRVJGT1JNX0hfKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9idWZmZXIvQmFzZUJ1ZmZlclF1ZXVlLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9idWZmZXIvQmFzZUJ1ZmZlclF1ZXVlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmY2NDk1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2J1ZmZlci9CYXNlQnVmZmVyUXVldWUuY3BwCkBAIC0wLDAgKzEsMjE3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiQmFzZUJ1ZmZlclF1ZXVlLmgiCisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mTWFjaGluZS5oPgorCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0J1ZmZlci5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvUnVudGltZUlELmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisvKioKKyAqIENvbXBhcmlzb24KKyAqIG9wZXJhdG9yPT0KKyAqLworYm9vbCBCYXNlQnVmZmVyUXVldWU6OmVxdWFscyhjb25zdCBCYXNlQnVmZmVyRm9ybSAmIGFCdWZmZXIpIGNvbnN0Cit7CisJaWYoIHRoaXMgPT0gJmFCdWZmZXIgKQorCXsKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCWVsc2UgaWYoIGFCdWZmZXIuaXM8IEJhc2VCdWZmZXJRdWV1ZSA+KCkKKwkJJiYgKHRoaXMtPnNpemUoKSA9PSBhQnVmZmVyLnNpemUoKSkgKQorCXsKKwkJTGlzdE9mTWVzc2FnZTo6Y29uc3RfaXRlcmF0b3IgaXRPdGhlciA9CisJCQkJYUJ1ZmZlci50bzwgQmFzZUJ1ZmZlclF1ZXVlID4oKS0+YmVnaW5NZXNzYWdlcygpOworCQlMaXN0T2ZNZXNzYWdlOjpjb25zdF9pdGVyYXRvciBpdCA9IG1NZXNzYWdlcy5iZWdpbigpOworCQlMaXN0T2ZNZXNzYWdlOjpjb25zdF9pdGVyYXRvciBpdEVuZCA9IG1NZXNzYWdlcy5lbmQoKTsKKwkJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApCisJCXsKKwkJCWlmKCAoKCppdCkgIT0gKCppdE90aGVyKSkKKwkJCQkmJiAobm90ICgqaXQpLmVxdWFscyggKml0T3RoZXIgKSkgKQorCQkJeworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiggdHJ1ZSApOworCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKworCisvKioKKyAqIFNlcmlhbGl6YXRpb24KKyAqLwordm9pZCBCYXNlQnVmZmVyUXVldWU6OnRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdAoreworCW9zIDw8IFRBQiA8PCAiYnVmZmVyICI7CisJb3MgPDwgQnVmZmVyOjpzdHIoZ2V0SW5zdGFuY2UoKS0+Z2V0UG9saWN5U3BlY2lmaWVyS2luZCgpLCByZWFsQ2FwYWNpdHkoKSk7CisJb3MgPDwgIiAiIDw8ICggaGFzSW5zdGFuY2UoKSA/IGdldEluc3RhbmNlKCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgOiAiXyIpIDw8ICIgeyI7CisKKwlpZiggbm9uZW1wdHkoKSApCisJeworCQlBVk1fREVCVUdfUkVGX0NPVU5URVIob3MpOworCQlvcyA8PCBFT0xfSU5DUl9JTkRFTlQ7CisKKwkJTGlzdE9mTWVzc2FnZTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtTWVzc2FnZXMuYmVnaW4oKTsKKwkJTGlzdE9mTWVzc2FnZTo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBtTWVzc2FnZXMuZW5kKCk7CisJCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQorCQl7CitBVk1fSUZfREVCVUdfTEVWRUxfR1RFX01FRElVTQorCQkJKCppdCkudG9TdHJlYW0ob3MpOworQVZNX0VMU0UKKwkJCW9zIDw8IFRBQiA8PCAoKml0KS5zdHIoKSA8PCBFT0w7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfR1RFX01FRElVTQorCQl9CisJCW9zIDw8IERFQ1JfSU5ERU5UX1RBQiA8PCAifSI7CisJfQorCWVsc2UKKwl7CisJCW9zIDw8ICIgfSI7CisJCUFWTV9ERUJVR19SRUZfQ09VTlRFUihvcyk7CisJfQorCW9zIDw8IEVPTF9GTFVTSDsKK30KKworCit2b2lkIEJhc2VCdWZmZXJRdWV1ZTo6dG9Gc2NuKE91dFN0cmVhbSAmIG91dCwKKwkJY29uc3QgUnVudGltZUlEICYgYVJJRCwgY29uc3QgQmFzZUJ1ZmZlckZvcm0gKiBwcmV2QnVmKSBjb25zdAoreworCVN0cmluZ091dFN0cmVhbSBvc3MoIG91dC5JTkRFTlQgKTsKKworCWlmKHByZXZCdWYgPT0gTlVMTCkKKwl7CisJCWlmKHNpemUoKT09MCkKKwkJeworCQkJb3NzIDw8ICIgIjsKKwkJfQorCQllbHNlCisJCXsKKwkJCUxpc3RPZk1lc3NhZ2U6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbU1lc3NhZ2VzLmJlZ2luKCk7CisJCQlMaXN0T2ZNZXNzYWdlOjpjb25zdF9pdGVyYXRvciBpdEVuZCA9IG1NZXNzYWdlcy5lbmQoKTsKKwkJCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQorCQkJeworCQkJCSgqaXQpLnRvRnNjbihvc3MpOworCQkJfQorCQl9CisJfQorCWVsc2UgaWYocHJldkJ1Zi0+aXM8IEJhc2VCdWZmZXJRdWV1ZSA+KCkpCisJeworCQlib29sIGhhc0RpZmZlcmVuY2UgPSBmYWxzZTsKKwkJY29uc3QgQmFzZUJ1ZmZlclF1ZXVlKiBwcmV2ID0gcHJldkJ1Zi0+dG88IEJhc2VCdWZmZXJRdWV1ZSA+KCk7CisJCWhhc0RpZmZlcmVuY2UgPSAoc2l6ZSgpIT1wcmV2LT5zaXplKCkpOworCQlpZiggbm90IGhhc0RpZmZlcmVuY2UgKQorCQl7CisJCQlMaXN0T2ZNZXNzYWdlOjpjb25zdF9pdGVyYXRvciBpdFByZXYgPSBwcmV2LT5tTWVzc2FnZXMuYmVnaW4oKTsKKwkJCUxpc3RPZk1lc3NhZ2U6OmNvbnN0X2l0ZXJhdG9yIGl0UHJldkVuZCA9IHByZXYtPm1NZXNzYWdlcy5lbmQoKTsKKwkJCUxpc3RPZk1lc3NhZ2U6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbU1lc3NhZ2VzLmJlZ2luKCk7CisJCQlMaXN0T2ZNZXNzYWdlOjpjb25zdF9pdGVyYXRvciBpdEVuZCA9IG1NZXNzYWdlcy5lbmQoKTsKKwkJCWZvciggOyAoaXQgIT0gaXRFbmQpICYmIChpdFByZXYgIT0gaXRQcmV2RW5kKSAmJiAoIWhhc0RpZmZlcmVuY2UpIDsKKwkJCQkrK2l0ICwgKytpdFByZXYgKQorCQkJeworCQkJCWhhc0RpZmZlcmVuY2UgPSAoaXQgIT0gaXRQcmV2KTsKKwkJCX0KKwkJfQorCQlpZihoYXNEaWZmZXJlbmNlKQorCQl7CisJCQlpZihzaXplKCk9PTApCisJCQl7CisJCQkJb3NzIDw8ICIgIjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlMaXN0T2ZNZXNzYWdlOjpjb25zdF9pdGVyYXRvciBpdCA9IG1NZXNzYWdlcy5iZWdpbigpOworCQkJCUxpc3RPZk1lc3NhZ2U6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gbU1lc3NhZ2VzLmVuZCgpOworCQkJCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQorCQkJCXsKKwkJCQkJKCppdCkudG9Gc2NuKG9zcyk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYoIG5vdCBvc3Muc3RyKCkuZW1wdHkoKSApCisJeworCQlzdGQ6OnN0cmluZyBidWZmZXJraW5kOworCQlzd2l0Y2goIGNsYXNzS2luZCgpICkKKwkJeworCQkJY2FzZSBGT1JNX0JVRkZFUl9GSUZPX0tJTkQ6CisJCQl7CisJCQkJYnVmZmVya2luZCA9ICJGSUZPIjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgRk9STV9CVUZGRVJfTElGT19LSU5EOgorCQkJeworCQkJCWJ1ZmZlcmtpbmQgPSAiTElGTyI7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIEZPUk1fQlVGRkVSX01VTFRJU0VUX0tJTkQ6CisJCQl7CisJCQkJYnVmZmVya2luZCA9ICJNVUxUSVNFVCI7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIEZPUk1fQlVGRkVSX1NFVF9LSU5EOgorCQkJeworCQkJCWJ1ZmZlcmtpbmQgPSAiU0VUIjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlzdGQ6Om9zdHJpbmdzdHJlYW0gb3NOYW1lOworCQlpZiggaGFzSW5zdGFuY2UoKSApCisJCXsKKwkJCWlmKCBnZXRJbnN0YW5jZSgpLT5oYXNSdW50aW1lQ29udGFpbmVyUklEKCkgKQorCQkJeworCQkJCW9zTmFtZSA8PCBnZXRJbnN0YW5jZSgpLT5nZXRSdW50aW1lQ29udGFpbmVyUklEKCkuCisJCQkJCQkJCWdldEluc3RhbmNlKCktPmdldE5hbWVJRCgpCisJCQkJCQk8PCAiLiIgPDwgZ2V0SW5zdGFuY2UoKS0+Z2V0TmFtZUlEKCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJb3NOYW1lIDw8ICI6cGlkIyIgPDwgYVJJRC5nZXRSaWQoKQorCQkJCQkJPDwgIjoiIDw8IGdldEluc3RhbmNlKCktPmdldE5hbWVJRCgpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJb3NOYW1lIDw8ICI6cGlkIyIgPDwgYVJJRC5nZXRSaWQoKTsKKwkJfQorCisJCW91dCA8PCBUQUIgPDwgb3NOYW1lLnN0cigpIDw8ICI6IgorCQkJPDwgIjwiIDw8IGJ1ZmZlcmtpbmQgPDwgIj4jIiA8PCBnZXRJbnN0YW5jZSgpLT5nZXRPZmZzZXQoKSA8PCAieyI7CisKKwkJaWYob3NzLnN0cigpLmNvbXBhcmUoIiAiKT09MCkKKwkJeworCQkJb3V0IDw8ICIgfSIgPDwgRU9MX0ZMVVNIOworCQl9CisJCWVsc2UKKwkJeworCQkJb3V0IDw8IEVPTCA8PCBvc3Muc3RyKCkKKwkJCQk8PCBUQUIgPDwgIn0iIDw8IEVPTF9GTFVTSDsKKwkJfQorCX0KK30KKworCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9idWZmZXIvQmFzZUJ1ZmZlclF1ZXVlLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvYnVmZmVyL0Jhc2VCdWZmZXJRdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMTJhZmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvYnVmZmVyL0Jhc2VCdWZmZXJRdWV1ZS5oCkBAIC0wLDAgKzEsMzUxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIEJBU0VCVUZGRVJRVUVVRV9IXworI2RlZmluZSBCQVNFQlVGRkVSUVVFVUVfSF8KKworI2luY2x1ZGUgPGZtbC9idWZmZXIvQmFzZUJ1ZmZlckZvcm0uaD4KKyNpbmNsdWRlIDxjb2xsZWN0aW9uL0JGQ29udGFpbmVyLmg+CisKKyNpbmNsdWRlIDxmbWwvcnVudGltZS9NZXNzYWdlLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIFJ1bnRpbWVJRDsKKworCitjbGFzcyBCYXNlQnVmZmVyUXVldWUgIDogIHB1YmxpYyBCYXNlQnVmZmVyRm9ybQoreworCitwdWJsaWM6CisJLyoqCisJICogVFlQRURFRgorCSAqLworCXR5cGVkZWYgTGlzdE9mTWVzc2FnZTo6Y29uc3RfaXRlcmF0b3IgIGNvbnN0X2l0ZXJhdG9yOworCitwcm90ZWN0ZWQ6CisJLyoKKwkgKiBBVFRSSUJVVEUKKwkgKi8KKwlMaXN0T2ZNZXNzYWdlIG1NZXNzYWdlczsKKworCWF2bV9zaXplX3QgbUNhcGFjaXR5OworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlCYXNlQnVmZmVyUXVldWUoY2xhc3Nfa2luZF90IGFDbGFzc0tpbmQsIEluc3RhbmNlT2ZCdWZmZXIgKiBhQnVmZmVyKQorCTogQmFzZUJ1ZmZlckZvcm0oYUNsYXNzS2luZCwgYUJ1ZmZlciksCisJbU1lc3NhZ2VzKCApLAorCW1DYXBhY2l0eSggYUJ1ZmZlci0+Y2FwYWNpdHkoKSApCisJeworCQkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJQmFzZUJ1ZmZlclF1ZXVlKGNvbnN0IEJhc2VCdWZmZXJRdWV1ZSAmIGFCdWZmZXIpCisJOiBCYXNlQnVmZmVyRm9ybSggYUJ1ZmZlciApLAorCW1NZXNzYWdlcyggYUJ1ZmZlci5tTWVzc2FnZXMgKSwKKwltQ2FwYWNpdHkoIGFCdWZmZXIubUNhcGFjaXR5ICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5CYXNlQnVmZmVyUXVldWUoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtTWVzc2FnZXMKKwkgKi8KKwlpbmxpbmUgY29uc3RfaXRlcmF0b3IgYmVnaW5NZXNzYWdlcygpIGNvbnN0CisJeworCQlyZXR1cm4oIG1NZXNzYWdlcy5iZWdpbigpICk7CisJfQorCisJaW5saW5lIGNvbnN0X2l0ZXJhdG9yIGVuZE1lc3NhZ2VzKCkgY29uc3QKKwl7CisJCXJldHVybiggbU1lc3NhZ2VzLmVuZCgpICk7CisJfQorCisJaW5saW5lIExpc3RPZk1lc3NhZ2UgJiBnZXRNZXNzYWdlcygpCisJeworCQlyZXR1cm4oIG1NZXNzYWdlcyApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUNhcGFjaXR5CisJICovCisJaW5saW5lIGF2bV9zaXplX3QgY2FwYWNpdHkoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQ2FwYWNpdHkgKTsKKwl9CisKKwlpbmxpbmUgbG9uZyByZWFsQ2FwYWNpdHkoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobUNhcGFjaXR5ID09IEFWTV9OVU1FUklDX01BWF9TSVpFX1QpPyAtMSA6IG1DYXBhY2l0eSApOworCX0KKworCWlubGluZSB2b2lkIHNldENhcGFjaXR5KGxvbmcgYUNhcGFjaXR5KQorCXsKKwkJbUNhcGFjaXR5ID0gKGFDYXBhY2l0eSA8IDApID8gQVZNX05VTUVSSUNfTUFYX1NJWkVfVCA6IGFDYXBhY2l0eTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc0Zpbml0ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1DYXBhY2l0eSA8IEFWTV9OVU1FUklDX01BWF9TSVpFX1QgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc0luZmluaXRlKCkgY29uc3QKKwl7CisJCXJldHVybiggbUNhcGFjaXR5ID09IEFWTV9OVU1FUklDX01BWF9TSVpFX1QgKTsKKwl9CisKKworCS8qKgorCSAqIENvbXBhcmlzb24KKwkgKiBvcGVyYXRvcj09CisJICovCisJdmlydHVhbCBib29sIGVxdWFscyhjb25zdCBCYXNlQnVmZmVyRm9ybSAmIGFCdWZmZXIpIGNvbnN0OworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQlVGRkVSIE1BTkFHRU1FTlQgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8qKgorCSAqIGVtcHRpbmVzcworCSAqIHNpemUKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCBib29sIGVtcHR5KCkgY29uc3QKKwl7CisJCXJldHVybiggbU1lc3NhZ2VzLmVtcHR5KCkgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBib29sIG5vbmVtcHR5KCkgY29uc3QKKwl7CisJCXJldHVybiggbU1lc3NhZ2VzLm5vbmVtcHR5KCkgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBib29sIHNpbmdsZXRvbigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1NZXNzYWdlcy5zaW5nbGV0b24oKSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGJvb2wgcG9wdWxhdGVkKCkgY29uc3QKKwl7CisJCXJldHVybiggbU1lc3NhZ2VzLnBvcHVsYXRlZCgpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgYm9vbCBmdWxsKCkgY29uc3QKKwl7CisJCXJldHVybiggc2l6ZSgpID09IG1DYXBhY2l0eSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGF2bV9zaXplX3Qgc2l6ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1NZXNzYWdlcy5zaXplKCkgKTsKKwl9CisKKwkvKioKKwkgKiBjbGVhcgorCSAqIHJlc2l6ZQorCSAqIHJlbW92ZQorCSAqLworCWlubGluZSB2aXJ0dWFsIHZvaWQgY2xlYXIoKQorCXsKKwkJbU1lc3NhZ2VzLmNsZWFyKCk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCByZXNpemUoYXZtX3NpemVfdCBuZXdTaXplKQorCXsKKwkJaWYoIG1DYXBhY2l0eSA+IG5ld1NpemUgKQorCQl7CisJCQlpZiggKG1DYXBhY2l0eSA9IHNpemUoKSkgPiBuZXdTaXplICkKKwkJCXsKKwkJCQlmb3IoIDsgbUNhcGFjaXR5ID4gbmV3U2l6ZSA7IC0tbUNhcGFjaXR5ICkKKwkJCQl7CisJCQkJCXBvcCgpOworCQkJCX0KKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJbUNhcGFjaXR5ID0gbmV3U2l6ZTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHJlc2l6ZShhdm1fc2l6ZV90IG5ld1NpemUsIGNvbnN0IE1lc3NhZ2UgJiBhTXNnKQorCXsKKwkJaWYoIG1DYXBhY2l0eSA+IG5ld1NpemUgKQorCQl7CisJCQlpZiggKG1DYXBhY2l0eSA9IHNpemUoKSkgPiBuZXdTaXplICkKKwkJCXsKKwkJCQlmb3IoIDsgbUNhcGFjaXR5ID4gbmV3U2l6ZSA7IC0tbUNhcGFjaXR5ICkKKwkJCQl7CisJCQkJCXBvcCgpOworCQkJCX0KKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJZWxzZSBpZiggKG1DYXBhY2l0eSA9IHNpemUoKSkgPCBuZXdTaXplICkKKwkJeworCQkJZm9yKCA7IG1DYXBhY2l0eSA8IG5ld1NpemUgOyArK21DYXBhY2l0eSApCisJCQl7CisJCQkJcHVzaChhTXNnKTsKKwkJCX0KKwkJfQorCisJCW1DYXBhY2l0eSA9IG5ld1NpemU7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHJlbW92ZShJbnN0YW5jZU9mUG9ydCAqIGFTaWduYWwpCisJeworCQlMaXN0T2ZNZXNzYWdlOjppdGVyYXRvciBpdCA9IG1NZXNzYWdlcy5iZWdpbigpOworCQlmb3IoIDsgaXQgIT0gbU1lc3NhZ2VzLmVuZCgpIDsgKQorCQl7CisJCQlpZiggKCppdCkuaXNTaWduYWwoYVNpZ25hbCkgKQorCQkJeworCQkJCWl0ID0gbU1lc3NhZ2VzLmVyYXNlKGl0KTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkrK2l0OworCQkJfQorCQl9CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHJlbW92ZShjb25zdCBSdW50aW1lSUQgJiBhUmVjZWl2ZXJSSUQpCisJeworCQlpZiggYVJlY2VpdmVyUklELnZhbGlkKCkgKQorCQl7CisJCQlMaXN0T2ZNZXNzYWdlOjppdGVyYXRvciBpdCA9IG1NZXNzYWdlcy5iZWdpbigpOworCQkJZm9yKCA7IGl0ICE9IG1NZXNzYWdlcy5lbmQoKSA7ICkKKwkJCXsKKwkJCQlpZiggKCppdCkuaXNSZWNlaXZlcihhUmVjZWl2ZXJSSUQpICkKKwkJCQl7CisJCQkJCWl0ID0gbU1lc3NhZ2VzLmVyYXNlKCBpdCApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQkrK2l0OworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWNsZWFyKCk7CisJCX0KKwl9CisKKworCisJLyoqCisJICogY29udGFpbnMKKwkgKiB1bmNvbnRhaW5zCisJICovCisJaW5saW5lIHZpcnR1YWwgYm9vbCBjb250YWlucyhhdm1fc2l6ZV90IG1pZCwKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSZWNlaXZlclJJRCA9IFJ1bnRpbWVJRDo6UkVGX05VTEwpIGNvbnN0CisJeworCQljb25zdF9pdGVyYXRvciBpdCA9IG1NZXNzYWdlcy5iZWdpbigpOworCQljb25zdF9pdGVyYXRvciBpdEVuZCA9IG1NZXNzYWdlcy5lbmQoKTsKKwkJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApCisJCXsKKwkJCWlmKCAoKml0KS5pc0NvbXBhdGlibGUobWlkLCBhUmVjZWl2ZXJSSUQpICkKKwkJCXsKKwkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBib29sIGNvbnRhaW5zKEluc3RhbmNlT2ZQb3J0ICogYVNpZ25hbCwKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSZWNlaXZlclJJRCA9IFJ1bnRpbWVJRDo6UkVGX05VTEwpIGNvbnN0CisJeworCQljb25zdF9pdGVyYXRvciBpdCA9IG1NZXNzYWdlcy5iZWdpbigpOworCQljb25zdF9pdGVyYXRvciBpdEVuZCA9IG1NZXNzYWdlcy5lbmQoKTsKKwkJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApCisJCXsKKwkJCWlmKCAoKml0KS5pc0NvbXBhdGlibGUoYVNpZ25hbCwgYVJlY2VpdmVyUklEKSApCisJCQl7CisJCQkJcmV0dXJuKCB0cnVlICk7CisJCQl9CisJCX0KKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgYm9vbCBjb250YWlucyhMaXN0T2ZJbnN0YW5jZU9mUG9ydCAmIGFTaWduYWxUcmFjZSwKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSZWNlaXZlclJJRCA9IFJ1bnRpbWVJRDo6UkVGX05VTEwpIGNvbnN0CisJeworCQlMaXN0T2ZJbnN0YW5jZU9mUG9ydDo6Y29uc3RfaXRlcmF0b3IgaXRTaWduYWwgPSBhU2lnbmFsVHJhY2UuYmVnaW4oKTsKKwkJTGlzdE9mSW5zdGFuY2VPZlBvcnQ6OmNvbnN0X2l0ZXJhdG9yIGVuZFNpZ25hbCA9IGFTaWduYWxUcmFjZS5lbmQoKTsKKwkJZm9yKCA7IGl0U2lnbmFsICE9IGVuZFNpZ25hbCA7ICsraXRTaWduYWwgKQorCQl7CisJCQlpZiggbm90IGNvbnRhaW5zKCAqaXRTaWduYWwgLCBhUmVjZWl2ZXJSSUQgKSApCisJCQl7CisJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJfQorCQl9CisKKwkJcmV0dXJuKCBpdFNpZ25hbCA9PSBlbmRTaWduYWwgKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIGJvb2wgdW5jb250YWlucyhMaXN0T2ZJbnN0YW5jZU9mUG9ydCAmIGFTaWduYWxUcmFjZSwKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSZWNlaXZlclJJRCA9IFJ1bnRpbWVJRDo6UkVGX05VTEwpIGNvbnN0CisJeworCQlMaXN0T2ZJbnN0YW5jZU9mUG9ydDo6aXRlcmF0b3IgaXRTaWduYWwgPSBhU2lnbmFsVHJhY2UuYmVnaW4oKTsKKwkJTGlzdE9mSW5zdGFuY2VPZlBvcnQ6Oml0ZXJhdG9yIGVuZFNpZ25hbCA9IGFTaWduYWxUcmFjZS5lbmQoKTsKKwkJZm9yKCA7IGl0U2lnbmFsICE9IGVuZFNpZ25hbCA7ICkKKwkJeworCQkJaWYoIGNvbnRhaW5zKCAqaXRTaWduYWwsIGFSZWNlaXZlclJJRCApICkKKwkJCXsKKwkJCQlpdFNpZ25hbCA9IGFTaWduYWxUcmFjZS5lcmFzZSggaXRTaWduYWwgKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiggYVNpZ25hbFRyYWNlLm5vbmVtcHR5KCkgKTsKKwl9CisKKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwl2aXJ0dWFsIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCisJdmlydHVhbCB2b2lkIHRvRnNjbihPdXRTdHJlYW0gJiBvcywgY29uc3QgUnVudGltZUlEICYgYVJJRCwKKwkJCWNvbnN0IEJhc2VCdWZmZXJGb3JtICogcHJldkJ1ZiA9IE5VTEwpIGNvbnN0OworCit9OworCisKK30KKworI2VuZGlmIC8qQkFTRUJVRkZFUlFVRVVFX0hfKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9idWZmZXIvQnJvYWRjYXN0QnVmZmVyLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9idWZmZXIvQnJvYWRjYXN0QnVmZmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzdiYzQwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2J1ZmZlci9Ccm9hZGNhc3RCdWZmZXIuY3BwCkBAIC0wLDAgKzEsNzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJCcm9hZGNhc3RCdWZmZXIuaCIKKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL1J1bnRpbWVJRC5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCit2b2lkIEJyb2FkY2FzdEJ1ZmZlcjo6dG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJb3MgPDwgVEFCIDw8ICJidWZmZXIgYnJvYWRjYXN0ICIKKwkJCTw8ICggaGFzSW5zdGFuY2UoKSA/IGdldEluc3RhbmNlKCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgOiAiXyIpCisJCQk8PCAiIHsiOworCisJQVZNX0RFQlVHX1JFRl9DT1VOVEVSKG9zKTsKKwlvcyA8PCBFT0xfSU5DUl9JTkRFTlQ7CisKKwlpZiggbm9uZW1wdHkoKSApCisJeworCQltTWVzc2FnZS50b1N0cmVhbShvcyk7CisJfQorCisJb3MgPDwgREVDUl9JTkRFTlRfVEFCIDw8ICJ9IiA8PCBFT0xfRkxVU0g7Cit9CisKKwordm9pZCBCcm9hZGNhc3RCdWZmZXI6OnRvRnNjbihPdXRTdHJlYW0gJiBvcywKKwkJY29uc3QgUnVudGltZUlEICYgYVJJRCwgY29uc3QgQmFzZUJ1ZmZlckZvcm0gKiBwcmV2QnVmKSBjb25zdAoreworCWlmKCBub25lbXB0eSgpICkKKwl7CisJCWJvb2wgaGFzRGlmZmVyZW5jZSA9IChwcmV2QnVmID09IE5VTEwpOworCisJCWlmKCAobm90IGhhc0RpZmZlcmVuY2UpCisJCQkmJiBwcmV2QnVmLT5pczwgQnJvYWRjYXN0QnVmZmVyID4oKSApCisJCXsKKwkJCWNvbnN0IEJyb2FkY2FzdEJ1ZmZlciAqIHByZXYgPSBwcmV2QnVmLT50bzwgQnJvYWRjYXN0QnVmZmVyID4oKTsKKwkJCWlmKHByZXYtPm1NZXNzYWdlIT1tTWVzc2FnZSkKKwkJCXsKKwkJCQloYXNEaWZmZXJlbmNlID0gdHJ1ZTsKKwkJCX0KKwkJfQorCisJCWlmKCBoYXNEaWZmZXJlbmNlICkKKwkJeworCQkJb3MgPDwgVEFCIDw8ICI6cGlkIyIgPDwgYVJJRC5nZXRSaWQoKSA8PCAiOiIgPDwgIjxCUk9BRENBU1Q+IyIKKwkJCQkJPDwgZ2V0SW5zdGFuY2UoKS0+Z2V0T2Zmc2V0KCkgPDwgInsiIDw8IEVPTF9JTkNSX0lOREVOVDsKKworCQkJbU1lc3NhZ2UudG9Gc2NuKG9zKTsKKworCQkJb3MgPDwgREVDUl9JTkRFTlRfVEFCIDw8ICJ9IiA8PCBFT0xfRkxVU0g7CisJCX0KKwl9Cit9CisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2J1ZmZlci9Ccm9hZGNhc3RCdWZmZXIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9idWZmZXIvQnJvYWRjYXN0QnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFjNjkxMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9idWZmZXIvQnJvYWRjYXN0QnVmZmVyLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgQlJPQURDQVNUQlVGRkVSX0hfCisjZGVmaW5lIEJST0FEQ0FTVEJVRkZFUl9IXworCisjaW5jbHVkZSA8Zm1sL2J1ZmZlci9SYW1CdWZmZXIuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworY2xhc3MgUnVudGltZUlEOworCisKK2NsYXNzIEJyb2FkY2FzdEJ1ZmZlciA6IHB1YmxpYyBSYW1CdWZmZXIKK3sKKworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBCcm9hZGNhc3RCdWZmZXIgKQorCisKK3Byb3RlY3RlZDoKKwkvKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlNZXNzYWdlIG1OZXh0U3RlcE1lc3NhZ2U7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUJyb2FkY2FzdEJ1ZmZlcihJbnN0YW5jZU9mQnVmZmVyICogYUJ1ZmZlcikKKwk6IFJhbUJ1ZmZlcihDTEFTU19LSU5EX1QoIEJyb2FkY2FzdEJ1ZmZlciApLCBhQnVmZmVyKSwKKwltTmV4dFN0ZXBNZXNzYWdlKCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIENvcHkKKwkgKi8KKwlCcm9hZGNhc3RCdWZmZXIoY29uc3QgQnJvYWRjYXN0QnVmZmVyICYgYUJyb2FkY2FzdCkKKwk6IFJhbUJ1ZmZlciggYUJyb2FkY2FzdCApLAorCW1OZXh0U3RlcE1lc3NhZ2UoICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFVQREFURSA9PT4gcHVzaCggbU5leHRTdGVwTWVzc2FnZSApCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCWlubGluZSB2aXJ0dWFsIHZvaWQgdXBkYXRlKCkKKwl7CisJCW1NZXNzYWdlLmZsdXNoKCBtTmV4dFN0ZXBNZXNzYWdlICk7CisJfQorCisKKwkvKioKKwkgKiBCVUZGRVIgTUFOQUdFTUVOVAorCSAqLworCXZpcnR1YWwgYm9vbCBwdXNoKGNvbnN0IE1lc3NhZ2UgJiBhTXNnKQorCXsKKwkJbU5leHRTdGVwTWVzc2FnZSA9IGFNc2c7CisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisJdmlydHVhbCBib29sIHRvcChjb25zdCBNZXNzYWdlICYgYU1zZykKKwl7CisJCW1OZXh0U3RlcE1lc3NhZ2UgPSBhTXNnOworCisJCXJldHVybiggdHJ1ZSApOworCX0KKworCS8qKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBTRVJJQUxJWkFUSU9OCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCXZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCisJdm9pZCB0b0ZzY24oT3V0U3RyZWFtICYgb3MsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsCisJCQljb25zdCBCYXNlQnVmZmVyRm9ybSAqIHByZXZCdWYgPSBOVUxMKSBjb25zdDsKKworfTsKKworCit9CisKKyNlbmRpZiAvKkJST0FEQ0FTVEJVRkZFUl9IXyovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvYnVmZmVyL0ZpZm9CdWZmZXIuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2J1ZmZlci9GaWZvQnVmZmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWQ0ZmY4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2J1ZmZlci9GaWZvQnVmZmVyLmNwcApAQCAtMCwwICsxLDIwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiRmlmb0J1ZmZlci5oIgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvYnVmZmVyL0ZpZm9CdWZmZXIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9idWZmZXIvRmlmb0J1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMGIzNjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvYnVmZmVyL0ZpZm9CdWZmZXIuaApAQCAtMCwwICsxLDI0OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBGSUZPQlVGRkVSX0hfCisjZGVmaW5lIEZJRk9CVUZGRVJfSF8KKworI2luY2x1ZGUgPGZtbC9idWZmZXIvQmFzZUJ1ZmZlclF1ZXVlLmg+CisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjbGFzcyBGaWZvQnVmZmVyIDogcHVibGljIEJhc2VCdWZmZXJRdWV1ZQoreworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIEZpZm9CdWZmZXIgKQorCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlGaWZvQnVmZmVyKEluc3RhbmNlT2ZCdWZmZXIgKiBhQnVmZmVyKQorCTogQmFzZUJ1ZmZlclF1ZXVlKENMQVNTX0tJTkRfVCggRmlmb0J1ZmZlciApLCBhQnVmZmVyKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJRmlmb0J1ZmZlcihjb25zdCBGaWZvQnVmZmVyICYgYUZpZm8gKQorCTogQmFzZUJ1ZmZlclF1ZXVlKCBhRmlmbyApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBCVUZGRVIgTUFOQUdFTUVOVCBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLyoqCisJICogcHVzaAorCSAqIHRvcAorCSAqLworCWlubGluZSB2aXJ0dWFsIGJvb2wgcHVzaChjb25zdCBNZXNzYWdlICYgYU1zZykKKwl7CisJCWlmKCBzaXplKCkgPCBjYXBhY2l0eSgpICkKKwkJeworCQkJbU1lc3NhZ2VzLnB1c2hfYmFjayhhTXNnKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBib29sIHRvcChjb25zdCBNZXNzYWdlICYgYU1zZykKKwl7CisJCWlmKCBub25lbXB0eSgpICkKKwkJeworCQkJbU1lc3NhZ2VzLmZyb250KCkgPSBhTXNnOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBjb25zdCBNZXNzYWdlICYgdG9wKCkgY29uc3QKKwl7CisJCWlmKCBub25lbXB0eSgpICkKKwkJeworCQkJcmV0dXJuKCBtTWVzc2FnZXMuZnJvbnQoKSApOworCQl9CisKKwkJcmV0dXJuKCBNZXNzYWdlOjpfTlVMTF8gKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBjb25zdCBNZXNzYWdlICYgdG9wKGF2bV9zaXplX3QgbWlkLAorCQkJY29uc3QgUnVudGltZUlEICYgYVJlY2VpdmVyUklEID0gUnVudGltZUlEOjpSRUZfTlVMTCkgY29uc3QKKwl7CisJCWlmKCBub25lbXB0eSgpCisJCQkmJiBtTWVzc2FnZXMuZnJvbnQoKS5pc0NvbXBhdGlibGUobWlkLCBhUmVjZWl2ZXJSSUQpICkKKwkJeworCQkJcmV0dXJuKCBtTWVzc2FnZXMuZnJvbnQoKSApOworCQl9CisKKwkJcmV0dXJuKCBNZXNzYWdlOjpfTlVMTF8gKTsKKwl9CisKKworCS8qKgorCSAqIGNvbnRhaW5zCisJICogdW5jb250YWlucworCSAqLworCWlubGluZSB2aXJ0dWFsIGJvb2wgY29udGFpbnMoTGlzdE9mSW5zdGFuY2VPZlBvcnQgJiBhU2lnbmFsVHJhY2UsCisJCQljb25zdCBSdW50aW1lSUQgJiBhUmVjZWl2ZXJSSUQgPSBSdW50aW1lSUQ6OlJFRl9OVUxMKSBjb25zdAorCXsKKwkJTGlzdE9mSW5zdGFuY2VPZlBvcnQ6OmNvbnN0X2l0ZXJhdG9yIGl0U2lnbmFsID0gYVNpZ25hbFRyYWNlLmJlZ2luKCk7CisJCUxpc3RPZkluc3RhbmNlT2ZQb3J0Ojpjb25zdF9pdGVyYXRvciBlbmRTaWduYWwgPSBhU2lnbmFsVHJhY2UuZW5kKCk7CisJCUxpc3RPZk1lc3NhZ2U6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbU1lc3NhZ2VzLmJlZ2luKCk7CisJCUxpc3RPZk1lc3NhZ2U6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gbU1lc3NhZ2VzLmVuZCgpOworCQlmb3IoIDsgKGl0ICE9IGl0RW5kKSAmJiAoaXRTaWduYWwgIT0gZW5kU2lnbmFsKSA7ICsraXQgKQorCQl7CisJCQlpZiggKCppdCkuaXNDb21wYXRpYmxlKCppdFNpZ25hbCwgYVJlY2VpdmVyUklEKSApCisJCQl7CisJCQkJKytpdFNpZ25hbDsKKwkJCX0KKwkJfQorCisJCXJldHVybiggaXRTaWduYWwgPT0gZW5kU2lnbmFsICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBib29sIHVuY29udGFpbnMoTGlzdE9mSW5zdGFuY2VPZlBvcnQgJiBhU2lnbmFsVHJhY2UsCisJCQljb25zdCBSdW50aW1lSUQgJiBhUmVjZWl2ZXJSSUQgPSBSdW50aW1lSUQ6OlJFRl9OVUxMKSBjb25zdAorCXsKKwkJTGlzdE9mSW5zdGFuY2VPZlBvcnQ6Oml0ZXJhdG9yIGl0U2lnbmFsID0gYVNpZ25hbFRyYWNlLmJlZ2luKCk7CisJCUxpc3RPZkluc3RhbmNlT2ZQb3J0OjppdGVyYXRvciBlbmRTaWduYWwgPSBhU2lnbmFsVHJhY2UuZW5kKCk7CisJCUxpc3RPZk1lc3NhZ2U6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbU1lc3NhZ2VzLmJlZ2luKCk7CisJCUxpc3RPZk1lc3NhZ2U6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gbU1lc3NhZ2VzLmVuZCgpOworCQlmb3IoIDsgKGl0ICE9IGl0RW5kKSAmJiAoaXRTaWduYWwgIT0gZW5kU2lnbmFsKSA7ICsraXQgKQorCQl7CisJCQlpZiggKCppdCkuaXNDb21wYXRpYmxlKCppdFNpZ25hbCwgYVJlY2VpdmVyUklEKSApCisJCQl7CisJCQkJaXRTaWduYWwgPSBhU2lnbmFsVHJhY2UuZXJhc2UoIGl0U2lnbmFsICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4oIGFTaWduYWxUcmFjZS5ub25lbXB0eSgpICk7CisJfQorCisKKwkvKioKKwkgKiBwb3AKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCBNZXNzYWdlIHBvcCgpCisJeworCQlpZiggbm9uZW1wdHkoKSApCisJCXsKKwkJCU1lc3NhZ2UgYU1zZyA9IG1NZXNzYWdlcy5mcm9udCgpOworCQkJbU1lc3NhZ2VzLnBvcF9mcm9udCgpOworCisJCQlyZXR1cm4oIGFNc2cgKTsKKwkJfQorCisJCXJldHVybiggTWVzc2FnZTo6X05VTExfICk7CisJfQorCisKKwlNZXNzYWdlIHBvcChhdm1fc2l6ZV90IG1pZCwKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSZWNlaXZlclJJRCA9IFJ1bnRpbWVJRDo6UkVGX05VTEwpCisJeworCQlpZiggbm9uZW1wdHkoKSApCisJCXsKKwkJCU1lc3NhZ2UgYU1zZyA9IG1NZXNzYWdlcy5mcm9udCgpOworCQkJaWYoIGFNc2cuaXNDb21wYXRpYmxlKG1pZCwgYVJlY2VpdmVyUklEKSApCisJCQl7CisJCQkJbU1lc3NhZ2VzLnBvcF9mcm9udCgpOworCisJCQkJcmV0dXJuKCBhTXNnICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4oIE1lc3NhZ2U6Ol9OVUxMXyApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgdm9pZCBwb3BCZWZvcmUoY29uc3QgUnVudGltZUlEICYgYVJlY2VpdmVyUklEKQorCXsKKwkJd2hpbGUoIG5vbmVtcHR5KCkgJiYgbU1lc3NhZ2VzLmZyb250KCkuaXNDb21wYXRpYmxlKGFSZWNlaXZlclJJRCkgKQorCQl7CisJCQltTWVzc2FnZXMucG9wX2Zyb250KCk7CisJCX0KKwl9CisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHBvcEJlZm9yZShjb25zdCBMaXN0T2ZJbnN0YW5jZU9mUG9ydCAmIGllQ29tcywKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSZWNlaXZlclJJRCA9IFJ1bnRpbWVJRDo6UkVGX05VTEwpCisJeworCQl3aGlsZSggbm9uZW1wdHkoKSAmJiBtTWVzc2FnZXMuZnJvbnQoKS5pc0NvbXBhdGlibGUoYVJlY2VpdmVyUklEKSApCisJCXsKKwkJCWlmKCBtTWVzc2FnZXMuZnJvbnQoKS5pc0NvbXBhdGlibGUoaWVDb21zKSApCisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJbU1lc3NhZ2VzLnBvcF9mcm9udCgpOworCQkJfQorCQl9CisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCBwb3BCZWZvcmUoY29uc3QgTGlzdE9mU2l6ZVQgJiBpZUNvbXMsCisJCQljb25zdCBSdW50aW1lSUQgJiBhUmVjZWl2ZXJSSUQgPSBSdW50aW1lSUQ6OlJFRl9OVUxMKQorCXsKKwkJd2hpbGUoIG5vbmVtcHR5KCkgJiYgbU1lc3NhZ2VzLmZyb250KCkuaXNDb21wYXRpYmxlKGFSZWNlaXZlclJJRCkgKQorCQl7CisJCQlpZiggbU1lc3NhZ2VzLmZyb250KCkuaXNDb21wYXRpYmxlKGllQ29tcykgKQorCQkJeworCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW1NZXNzYWdlcy5wb3BfZnJvbnQoKTsKKwkJCX0KKwkJfQorCX0KKworCisJLyoqCisJICogY29weVRvCisJICogcmVzdG9yZQorCSAqLworCWlubGluZSB2aXJ0dWFsIHZvaWQgY29weVRvKEJhc2VCdWZmZXJGb3JtICYgYUJ1ZmZlcikgY29uc3QKKwl7CisJCUxpc3RPZk1lc3NhZ2U6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbU1lc3NhZ2VzLmJlZ2luKCk7CisJCUxpc3RPZk1lc3NhZ2U6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gbU1lc3NhZ2VzLmVuZCgpOworCQlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwkJeworCQkJYUJ1ZmZlci5wdXNoKCAqaXQgKTsKKwkJfQorCX0KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgcmVzdG9yZShMaXN0T2ZNZXNzYWdlICYgbGlzdE9mTWVzc2FnZSkKKwl7CisJCWxpc3RPZk1lc3NhZ2Uuc3BsaWNlKCBtTWVzc2FnZXMgKTsKKworCQltTWVzc2FnZXMuc3BsaWNlKCBsaXN0T2ZNZXNzYWdlICk7CisJfQorCit9OworCisKK30KKworI2VuZGlmIC8qRklGT0JVRkZFUl9IXyovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvYnVmZmVyL0xpZm9CdWZmZXIuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2J1ZmZlci9MaWZvQnVmZmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGFiNjkwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2J1ZmZlci9MaWZvQnVmZmVyLmNwcApAQCAtMCwwICsxLDIwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiTGlmb0J1ZmZlci5oIgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvYnVmZmVyL0xpZm9CdWZmZXIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9idWZmZXIvTGlmb0J1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMjZhMjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvYnVmZmVyL0xpZm9CdWZmZXIuaApAQCAtMCwwICsxLDI1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBMSUZPQlVGRkVSX0hfCisjZGVmaW5lIExJRk9CVUZGRVJfSF8KKworI2luY2x1ZGUgPGZtbC9idWZmZXIvQmFzZUJ1ZmZlclF1ZXVlLmg+CisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjbGFzcyBMaWZvQnVmZmVyIDogcHVibGljIEJhc2VCdWZmZXJRdWV1ZQoreworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIExpZm9CdWZmZXIgKQorCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlMaWZvQnVmZmVyKEluc3RhbmNlT2ZCdWZmZXIgKiBhQnVmZmVyKQorCTogQmFzZUJ1ZmZlclF1ZXVlKENMQVNTX0tJTkRfVCggTGlmb0J1ZmZlciApLCBhQnVmZmVyKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJTGlmb0J1ZmZlcihjb25zdCBMaWZvQnVmZmVyICYgYUxpZm8gKQorCTogQmFzZUJ1ZmZlclF1ZXVlKCBhTGlmbyApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBCVUZGRVIgTUFOQUdFTUVOVCBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLyoqCisJICogcHVzaAorCSAqIHRvcAorCSAqLworCWlubGluZSB2aXJ0dWFsIGJvb2wgcHVzaChjb25zdCBNZXNzYWdlICYgYU1zZykKKwl7CisJCWlmKCBzaXplKCkgPCBjYXBhY2l0eSgpICkKKwkJeworCQkJbU1lc3NhZ2VzLnB1c2hfYmFjayhhTXNnKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBib29sIHRvcChjb25zdCBNZXNzYWdlICYgYU1zZykKKwl7CisJCWlmKCBub25lbXB0eSgpICkKKwkJeworCQkJbU1lc3NhZ2VzLmJhY2soKSA9IGFNc2c7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGNvbnN0IE1lc3NhZ2UgJiB0b3AoKSBjb25zdAorCXsKKwkJaWYoIG5vbmVtcHR5KCkgKQorCQl7CisJCQlyZXR1cm4oIG1NZXNzYWdlcy5iYWNrKCkgKTsKKwkJfQorCisJCXJldHVybiggTWVzc2FnZTo6X05VTExfICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgY29uc3QgTWVzc2FnZSAmIHRvcChhdm1fc2l6ZV90IG1pZCwKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSZWNlaXZlclJJRCA9IFJ1bnRpbWVJRDo6UkVGX05VTEwpIGNvbnN0CisJeworCQlpZiggbm9uZW1wdHkoKSAmJiBtTWVzc2FnZXMuYmFjaygpLmlzQ29tcGF0aWJsZShtaWQsIGFSZWNlaXZlclJJRCkgKQorCQl7CisJCQlyZXR1cm4oIG1NZXNzYWdlcy5iYWNrKCkgKTsKKwkJfQorCisJCXJldHVybiggTWVzc2FnZTo6X05VTExfICk7CisJfQorCisKKwkvKioKKwkgKiBjb250YWlucworCSAqIHVuY29udGFpbnMKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCBib29sIGNvbnRhaW5zKExpc3RPZkluc3RhbmNlT2ZQb3J0ICYgYVNpZ25hbFRyYWNlLAorCQkJY29uc3QgUnVudGltZUlEICYgYVJlY2VpdmVyUklEID0gUnVudGltZUlEOjpSRUZfTlVMTCkgY29uc3QKKwl7CisJCUxpc3RPZkluc3RhbmNlT2ZQb3J0Ojpjb25zdF9pdGVyYXRvciBpdFNpZ25hbCA9IGFTaWduYWxUcmFjZS5iZWdpbigpOworCQlMaXN0T2ZJbnN0YW5jZU9mUG9ydDo6Y29uc3RfaXRlcmF0b3IgZW5kU2lnbmFsID0gYVNpZ25hbFRyYWNlLmVuZCgpOworCQlMaXN0T2ZNZXNzYWdlOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGl0ID0gbU1lc3NhZ2VzLnJiZWdpbigpOworCQlMaXN0T2ZNZXNzYWdlOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGl0RW5kID0gbU1lc3NhZ2VzLnJlbmQoKTsKKwkJZm9yKCA7IChpdCAhPSBpdEVuZCkgJiYgKGl0U2lnbmFsICE9IGVuZFNpZ25hbCkgOyArK2l0ICkKKwkJeworCQkJaWYoICgqaXQpLmlzQ29tcGF0aWJsZSgqaXRTaWduYWwsIGFSZWNlaXZlclJJRCkgKQorCQkJeworCQkJCSsraXRTaWduYWw7CisJCQl9CisJCX0KKworCQlyZXR1cm4oIGl0U2lnbmFsID09IGVuZFNpZ25hbCApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgYm9vbCB1bmNvbnRhaW5zKExpc3RPZkluc3RhbmNlT2ZQb3J0ICYgYVNpZ25hbFRyYWNlLAorCQkJY29uc3QgUnVudGltZUlEICYgYVJlY2VpdmVyUklEID0gUnVudGltZUlEOjpSRUZfTlVMTCkgY29uc3QKKwl7CisJCUxpc3RPZkluc3RhbmNlT2ZQb3J0OjppdGVyYXRvciBpdFNpZ25hbCA9IGFTaWduYWxUcmFjZS5iZWdpbigpOworCQlMaXN0T2ZJbnN0YW5jZU9mUG9ydDo6aXRlcmF0b3IgZW5kU2lnbmFsID0gYVNpZ25hbFRyYWNlLmVuZCgpOworCQlMaXN0T2ZNZXNzYWdlOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGl0ID0gbU1lc3NhZ2VzLnJiZWdpbigpOworCQlMaXN0T2ZNZXNzYWdlOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGl0RW5kID0gbU1lc3NhZ2VzLnJlbmQoKTsKKwkJZm9yKCA7IChpdCAhPSBpdEVuZCkgJiYgKGl0U2lnbmFsICE9IGVuZFNpZ25hbCkgOyArK2l0ICkKKwkJeworCQkJaWYoICgqaXQpLmlzQ29tcGF0aWJsZSgqaXRTaWduYWwsIGFSZWNlaXZlclJJRCkgKQorCQkJeworCQkJCWl0U2lnbmFsID0gYVNpZ25hbFRyYWNlLmVyYXNlKCBpdFNpZ25hbCApOworCQkJfQorCQl9CisKKwkJcmV0dXJuKCBhU2lnbmFsVHJhY2Uubm9uZW1wdHkoKSApOworCX0KKworCisJLyoqCisJICogcG9wCisJICovCisJaW5saW5lIHZpcnR1YWwgTWVzc2FnZSBwb3AoKQorCXsKKwkJaWYoIG5vbmVtcHR5KCkgKQorCQl7CisJCQlNZXNzYWdlIGFNc2cgPSBtTWVzc2FnZXMucG9wX2xhc3QoKTsKKworCQkJcmV0dXJuKCBhTXNnICk7CisJCX0KKworCQlyZXR1cm4oIE1lc3NhZ2U6Ol9OVUxMXyApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgTWVzc2FnZSBwb3AoYXZtX3NpemVfdCBtaWQsCisJCQljb25zdCBSdW50aW1lSUQgJiBhUmVjZWl2ZXJSSUQgPSBSdW50aW1lSUQ6OlJFRl9OVUxMKQorCXsKKwkJaWYoIG5vbmVtcHR5KCkgKQorCQl7CisJCQlNZXNzYWdlIGFNc2cgPSBtTWVzc2FnZXMuYmFjaygpOworCQkJaWYoIGFNc2cuaXNDb21wYXRpYmxlKG1pZCwgYVJlY2VpdmVyUklEKSApCisJCQl7CisJCQkJbU1lc3NhZ2VzLnBvcF9iYWNrKCk7CisKKwkJCQlyZXR1cm4oIGFNc2cgKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiggTWVzc2FnZTo6X05VTExfICk7CisJfQorCisKKworCWlubGluZSB2aXJ0dWFsIHZvaWQgcG9wQmVmb3JlKGNvbnN0IFJ1bnRpbWVJRCAmIGFSZWNlaXZlclJJRCkKKwl7CisJCXdoaWxlKCBub25lbXB0eSgpICYmIG1NZXNzYWdlcy5iYWNrKCkuaXNDb21wYXRpYmxlKGFSZWNlaXZlclJJRCkgKQorCQl7CisJCQltTWVzc2FnZXMucG9wX2JhY2soKTsKKwkJfQorCX0KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgcG9wQmVmb3JlKGNvbnN0IExpc3RPZkluc3RhbmNlT2ZQb3J0ICYgaWVDb21zLAorCQkJY29uc3QgUnVudGltZUlEICYgYVJlY2VpdmVyUklEID0gUnVudGltZUlEOjpSRUZfTlVMTCkKKwl7CisJCXdoaWxlKCBub25lbXB0eSgpICYmIG1NZXNzYWdlcy5iYWNrKCkuaXNDb21wYXRpYmxlKGFSZWNlaXZlclJJRCkgKQorCQl7CisJCQlpZiggbU1lc3NhZ2VzLmJhY2soKS5pc0NvbXBhdGlibGUoaWVDb21zKSApCisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJbU1lc3NhZ2VzLnBvcF9iYWNrKCk7CisJCQl9CisJCX0KKwl9CisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHBvcEJlZm9yZShjb25zdCBMaXN0T2ZTaXplVCAmIGllQ29tcywKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSZWNlaXZlclJJRCA9IFJ1bnRpbWVJRDo6UkVGX05VTEwpCisJeworCQl3aGlsZSggbm9uZW1wdHkoKSAmJiBtTWVzc2FnZXMuYmFjaygpLmlzQ29tcGF0aWJsZShhUmVjZWl2ZXJSSUQpICkKKwkJeworCQkJaWYoIG1NZXNzYWdlcy5iYWNrKCkuaXNDb21wYXRpYmxlKGllQ29tcykgKQorCQkJeworCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW1NZXNzYWdlcy5wb3BfYmFjaygpOworCQkJfQorCQl9CisJfQorCisKKwkvKioKKwkgKiBjb3B5VG8KKwkgKiByZXN0b3JlCisJICovCisJaW5saW5lIHZpcnR1YWwgdm9pZCBjb3B5VG8oQmFzZUJ1ZmZlckZvcm0gJiBhQnVmZmVyKSBjb25zdAorCXsKKwkJTGlzdE9mTWVzc2FnZTo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBpdCA9IG1NZXNzYWdlcy5yYmVnaW4oKTsKKwkJTGlzdE9mTWVzc2FnZTo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBpdEVuZCA9IG1NZXNzYWdlcy5yZW5kKCk7CisJCWZvciggIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwkJeworCQkJYUJ1ZmZlci5wdXNoKCAqaXQgKTsKKwkJfQorCX0KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgcmVzdG9yZShMaXN0T2ZNZXNzYWdlICYgbGlzdE9mTWVzc2FnZSkKKwl7CisJCXdoaWxlKCBsaXN0T2ZNZXNzYWdlLm5vbmVtcHR5KCkgKQorCQl7CisJCQltTWVzc2FnZXMucHVzaF9iYWNrKCBsaXN0T2ZNZXNzYWdlLmJhY2soKSApOworCisJCQlsaXN0T2ZNZXNzYWdlLnBvcF9iYWNrKCk7CisJCX0KKwl9CisKK307CisKKworfQorCisjZW5kaWYgLypMSUZPQlVGRkVSX0hfKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9idWZmZXIvTXVsdGlGaWZvQnVmZmVyLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9idWZmZXIvTXVsdGlGaWZvQnVmZmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWY3YzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2J1ZmZlci9NdWx0aUZpZm9CdWZmZXIuY3BwCkBAIC0wLDAgKzEsMjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAzIGbDqXZyLiAyMDE1CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJNdWx0aUZpZm9CdWZmZXIuaCIKKworbmFtZXNwYWNlIHNlcAoreworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9idWZmZXIvTXVsdGlGaWZvQnVmZmVyLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvYnVmZmVyL011bHRpRmlmb0J1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMmUyNmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvYnVmZmVyL011bHRpRmlmb0J1ZmZlci5oCkBAIC0wLDAgKzEsMjgxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMyBmw6l2ci4gMjAxNQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIE1VTFRJRklGT0JVRkZFUl9IXworI2RlZmluZSBNVUxUSUZJRk9CVUZGRVJfSF8KKworI2luY2x1ZGUgPGZtbC9idWZmZXIvQmFzZUJ1ZmZlclF1ZXVlLmg+CisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjbGFzcyBNdWx0aUZpZm9CdWZmZXIgOiBwdWJsaWMgQmFzZUJ1ZmZlclF1ZXVlCit7CisKKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggTXVsdGlGaWZvQnVmZmVyICkKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJTXVsdGlGaWZvQnVmZmVyKEluc3RhbmNlT2ZCdWZmZXIgKiBhQnVmZmVyKQorCTogQmFzZUJ1ZmZlclF1ZXVlKENMQVNTX0tJTkRfVCggTXVsdGlGaWZvQnVmZmVyICksIGFCdWZmZXIpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIENvcHkKKwkgKi8KKwlNdWx0aUZpZm9CdWZmZXIoY29uc3QgTXVsdGlGaWZvQnVmZmVyICYgYU11bHRpRmlmbyApCisJOiBCYXNlQnVmZmVyUXVldWUoIGFNdWx0aUZpZm8gKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQlVGRkVSIE1BTkFHRU1FTlQgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8qKgorCSAqIHB1c2gKKwkgKiB0b3AKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCBib29sIHB1c2goY29uc3QgTWVzc2FnZSAmIGFNc2cpCisJeworCQlpZiggc2l6ZSgpIDwgY2FwYWNpdHkoKSApCisJCXsKKwkJCW1NZXNzYWdlcy5wdXNoX2JhY2soYU1zZyk7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgYm9vbCB0b3AoY29uc3QgTWVzc2FnZSAmIGFNc2cpCisJeworCQlpZiggbm9uZW1wdHkoKSApCisJCXsKKwkJCW1NZXNzYWdlcy5mcm9udCgpID0gYU1zZzsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgY29uc3QgTWVzc2FnZSAmIHRvcCgpIGNvbnN0CisJeworCQlpZiggbm9uZW1wdHkoKSApCisJCXsKKwkJCXJldHVybiggbU1lc3NhZ2VzLmZyb250KCkgKTsKKwkJfQorCisJCXJldHVybiggTWVzc2FnZTo6X05VTExfICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgY29uc3QgTWVzc2FnZSAmIHRvcChhdm1fc2l6ZV90IG1pZCwKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSZWNlaXZlclJJRCA9IFJ1bnRpbWVJRDo6UkVGX05VTEwpIGNvbnN0CisJeworCQlMaXN0T2ZNZXNzYWdlOjpjb25zdF9pdGVyYXRvciBpdCA9IG1NZXNzYWdlcy5iZWdpbigpOworCQlMaXN0T2ZNZXNzYWdlOjpjb25zdF9pdGVyYXRvciBpdEVuZCA9IG1NZXNzYWdlcy5lbmQoKTsKKwkJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApCisJCXsKKwkJCWlmKCAoKml0KS5pc0NvbXBhdGlibGUobWlkLCBhUmVjZWl2ZXJSSUQpICkKKwkJCXsKKwkJCQlyZXR1cm4oICppdCApOworCQkJfQorCQl9CisKKwkJcmV0dXJuKCBNZXNzYWdlOjpfTlVMTF8gKTsKKwl9CisKKworCS8qKgorCSAqIGNvbnRhaW5zCisJICogdW5jb250YWlucworCSAqLworCWlubGluZSB2aXJ0dWFsIGJvb2wgY29udGFpbnMoTGlzdE9mSW5zdGFuY2VPZlBvcnQgJiBhU2lnbmFsVHJhY2UsCisJCQljb25zdCBSdW50aW1lSUQgJiBhUmVjZWl2ZXJSSUQgPSBSdW50aW1lSUQ6OlJFRl9OVUxMKSBjb25zdAorCXsKKwkJTGlzdE9mSW5zdGFuY2VPZlBvcnQ6OmNvbnN0X2l0ZXJhdG9yIGl0U2lnbmFsID0gYVNpZ25hbFRyYWNlLmJlZ2luKCk7CisJCUxpc3RPZkluc3RhbmNlT2ZQb3J0Ojpjb25zdF9pdGVyYXRvciBlbmRTaWduYWwgPSBhU2lnbmFsVHJhY2UuZW5kKCk7CisJCUxpc3RPZk1lc3NhZ2U6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbU1lc3NhZ2VzLmJlZ2luKCk7CisJCUxpc3RPZk1lc3NhZ2U6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gbU1lc3NhZ2VzLmVuZCgpOworCQlmb3IoIDsgKGl0ICE9IGl0RW5kKSAmJiAoaXRTaWduYWwgIT0gZW5kU2lnbmFsKSA7ICsraXQgKQorCQl7CisJCQlpZiggKCppdCkuaXNDb21wYXRpYmxlKCppdFNpZ25hbCwgYVJlY2VpdmVyUklEKSApCisJCQl7CisJCQkJKytpdFNpZ25hbDsKKwkJCX0KKwkJfQorCisJCXJldHVybiggaXRTaWduYWwgPT0gZW5kU2lnbmFsICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBib29sIHVuY29udGFpbnMoTGlzdE9mSW5zdGFuY2VPZlBvcnQgJiBhU2lnbmFsVHJhY2UsCisJCQljb25zdCBSdW50aW1lSUQgJiBhUmVjZWl2ZXJSSUQgPSBSdW50aW1lSUQ6OlJFRl9OVUxMKSBjb25zdAorCXsKKwkJTGlzdE9mSW5zdGFuY2VPZlBvcnQ6Oml0ZXJhdG9yIGl0U2lnbmFsID0gYVNpZ25hbFRyYWNlLmJlZ2luKCk7CisJCUxpc3RPZkluc3RhbmNlT2ZQb3J0OjppdGVyYXRvciBlbmRTaWduYWwgPSBhU2lnbmFsVHJhY2UuZW5kKCk7CisJCUxpc3RPZk1lc3NhZ2U6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbU1lc3NhZ2VzLmJlZ2luKCk7CisJCUxpc3RPZk1lc3NhZ2U6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gbU1lc3NhZ2VzLmVuZCgpOworCQlmb3IoIDsgKGl0ICE9IGl0RW5kKSAmJiAoaXRTaWduYWwgIT0gZW5kU2lnbmFsKSA7ICsraXQgKQorCQl7CisJCQlpZiggKCppdCkuaXNDb21wYXRpYmxlKCppdFNpZ25hbCwgYVJlY2VpdmVyUklEKSApCisJCQl7CisJCQkJaXRTaWduYWwgPSBhU2lnbmFsVHJhY2UuZXJhc2UoIGl0U2lnbmFsICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4oIGFTaWduYWxUcmFjZS5ub25lbXB0eSgpICk7CisJfQorCisKKwkvKioKKwkgKiBwb3AKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCBNZXNzYWdlIHBvcCgpCisJeworCQlpZiggbm9uZW1wdHkoKSApCisJCXsKKwkJCU1lc3NhZ2UgYU1zZyA9IG1NZXNzYWdlcy5mcm9udCgpOworCisJCQltTWVzc2FnZXMucG9wX2Zyb250KCk7CisKKwkJCXJldHVybiggYU1zZyApOworCQl9CisKKwkJcmV0dXJuKCBNZXNzYWdlOjpfTlVMTF8gKTsKKwl9CisKKworCU1lc3NhZ2UgcG9wKGF2bV9zaXplX3QgbWlkLAorCQkJY29uc3QgUnVudGltZUlEICYgYVJlY2VpdmVyUklEID0gUnVudGltZUlEOjpSRUZfTlVMTCkKKwl7CisJCWlmKCBub25lbXB0eSgpICkKKwkJeworCQkJTWVzc2FnZSBhTXNnID0gbU1lc3NhZ2VzLmZyb250KCk7CisJCQlpZiggYU1zZy5pc0NvbXBhdGlibGUobWlkLCBhUmVjZWl2ZXJSSUQpICkKKwkJCXsKKwkJCQltTWVzc2FnZXMucG9wX2Zyb250KCk7CisKKwkJCQlyZXR1cm4oIGFNc2cgKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiggTWVzc2FnZTo6X05VTExfICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHBvcEJlZm9yZShjb25zdCBSdW50aW1lSUQgJiBhUmVjZWl2ZXJSSUQpCisJeworCQlMaXN0T2ZNZXNzYWdlOjppdGVyYXRvciBpdCA9IG1NZXNzYWdlcy5iZWdpbigpOworCQlmb3IoIDsgaXQgIT0gbU1lc3NhZ2VzLmVuZCgpIDsgKQorCQl7CisJCQlpZiggKCppdCkuaXNDb21wYXRpYmxlKGFSZWNlaXZlclJJRCkgKQorCQkJeworCQkJCWl0ID0gbU1lc3NhZ2VzLmVyYXNlKCBpdCApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCSsraXQ7CisJCQl9CisJCX0KKwl9CisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHBvcEJlZm9yZShjb25zdCBMaXN0T2ZJbnN0YW5jZU9mUG9ydCAmIGllQ29tcywKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSZWNlaXZlclJJRCA9IFJ1bnRpbWVJRDo6UkVGX05VTEwpCisJeworCQlMaXN0T2ZNZXNzYWdlOjppdGVyYXRvciBpdCA9IG1NZXNzYWdlcy5iZWdpbigpOworCQlmb3IoIDsgaXQgIT0gbU1lc3NhZ2VzLmVuZCgpIDsgKQorCQl7CisJCQlpZiggKCppdCkuaXNDb21wYXRpYmxlKGFSZWNlaXZlclJJRCkgKQorCQkJeworCQkJCWlmKCAoKml0KS5pc0NvbXBhdGlibGUoaWVDb21zKSApCisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJaXQgPSBtTWVzc2FnZXMuZXJhc2UoIGl0ICk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCSsraXQ7CisJCQl9CisJCX0KKwl9CisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHBvcEJlZm9yZShjb25zdCBMaXN0T2ZTaXplVCAmIGllQ29tcywKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSZWNlaXZlclJJRCA9IFJ1bnRpbWVJRDo6UkVGX05VTEwpCisJeworCQlMaXN0T2ZNZXNzYWdlOjppdGVyYXRvciBpdCA9IG1NZXNzYWdlcy5iZWdpbigpOworCQlmb3IoIDsgaXQgIT0gbU1lc3NhZ2VzLmVuZCgpIDsgKQorCQl7CisJCQlpZiggKCppdCkuaXNDb21wYXRpYmxlKGFSZWNlaXZlclJJRCkgKQorCQkJeworCQkJCWlmKCAoKml0KS5pc0NvbXBhdGlibGUoaWVDb21zKSApCisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJaXQgPSBtTWVzc2FnZXMuZXJhc2UoIGl0ICk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCSsraXQ7CisJCQl9CisJCX0KKwl9CisKKworCS8qKgorCSAqIGNvcHlUbworCSAqIHJlc3RvcmUKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCB2b2lkIGNvcHlUbyhCYXNlQnVmZmVyRm9ybSAmIGFCdWZmZXIpIGNvbnN0CisJeworCQlMaXN0T2ZNZXNzYWdlOjpjb25zdF9pdGVyYXRvciBpdCA9IG1NZXNzYWdlcy5iZWdpbigpOworCQlMaXN0T2ZNZXNzYWdlOjpjb25zdF9pdGVyYXRvciBpdEVuZCA9IG1NZXNzYWdlcy5lbmQoKTsKKwkJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApCisJCXsKKwkJCWFCdWZmZXIucHVzaCggKml0ICk7CisJCX0KKwl9CisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHJlc3RvcmUoTGlzdE9mTWVzc2FnZSAmIGxpc3RPZk1lc3NhZ2UpCisJeworCQlsaXN0T2ZNZXNzYWdlLnNwbGljZSggbU1lc3NhZ2VzICk7CisKKwkJbU1lc3NhZ2VzLnNwbGljZSggbGlzdE9mTWVzc2FnZSApOworCX0KKworfTsKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qIE1VTFRJRklGT0JVRkZFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2J1ZmZlci9NdWx0aUxpZm9CdWZmZXIuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2J1ZmZlci9NdWx0aUxpZm9CdWZmZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxODNhYWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvYnVmZmVyL011bHRpTGlmb0J1ZmZlci5jcHAKQEAgLTAsMCArMSwyMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDMgZsOpdnIuIDIwMTUKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIk11bHRpTGlmb0J1ZmZlci5oIgorCituYW1lc3BhY2Ugc2VwCit7CisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2J1ZmZlci9NdWx0aUxpZm9CdWZmZXIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9idWZmZXIvTXVsdGlMaWZvQnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc3ZTFmZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9idWZmZXIvTXVsdGlMaWZvQnVmZmVyLmgKQEAgLTAsMCArMSwyNzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAzIGbDqXZyLiAyMDE1CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgTVVMVElMSUZPQlVGRkVSX0hfCisjZGVmaW5lIE1VTFRJTElGT0JVRkZFUl9IXworCisjaW5jbHVkZSA8Zm1sL2J1ZmZlci9CYXNlQnVmZmVyUXVldWUuaD4KKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIE11bHRpTGlmb0J1ZmZlciA6IHB1YmxpYyBCYXNlQnVmZmVyUXVldWUKK3sKKworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBNdWx0aUxpZm9CdWZmZXIgKQorCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlNdWx0aUxpZm9CdWZmZXIoSW5zdGFuY2VPZkJ1ZmZlciAqIGFCdWZmZXIpCisJOiBCYXNlQnVmZmVyUXVldWUoQ0xBU1NfS0lORF9UKCBNdWx0aUxpZm9CdWZmZXIgKSwgYUJ1ZmZlcikKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCU11bHRpTGlmb0J1ZmZlcihjb25zdCBNdWx0aUxpZm9CdWZmZXIgJiBhTXVsdGlMaWZvICkKKwk6IEJhc2VCdWZmZXJRdWV1ZSggYU11bHRpTGlmbyApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBCVUZGRVIgTUFOQUdFTUVOVCBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLyoqCisJICogcHVzaAorCSAqIHRvcAorCSAqLworCWlubGluZSB2aXJ0dWFsIGJvb2wgcHVzaChjb25zdCBNZXNzYWdlICYgYU1zZykKKwl7CisJCWlmKCBzaXplKCkgPCBjYXBhY2l0eSgpICkKKwkJeworCQkJbU1lc3NhZ2VzLnB1c2hfYmFjayhhTXNnKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBib29sIHRvcChjb25zdCBNZXNzYWdlICYgYU1zZykKKwl7CisJCWlmKCBub25lbXB0eSgpICkKKwkJeworCQkJbU1lc3NhZ2VzLmJhY2soKSA9IGFNc2c7CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGNvbnN0IE1lc3NhZ2UgJiB0b3AoKSBjb25zdAorCXsKKwkJaWYoIG5vbmVtcHR5KCkgKQorCQl7CisJCQlyZXR1cm4oIG1NZXNzYWdlcy5iYWNrKCkgKTsKKwkJfQorCisJCXJldHVybiggTWVzc2FnZTo6X05VTExfICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgY29uc3QgTWVzc2FnZSAmIHRvcChhdm1fc2l6ZV90IG1pZCwKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSZWNlaXZlclJJRCA9IFJ1bnRpbWVJRDo6UkVGX05VTEwpIGNvbnN0CisJeworCQlpZiggbm9uZW1wdHkoKSAmJiBtTWVzc2FnZXMuYmFjaygpLmlzQ29tcGF0aWJsZShtaWQsIGFSZWNlaXZlclJJRCkgKQorCQl7CisJCQlyZXR1cm4oIG1NZXNzYWdlcy5iYWNrKCkgKTsKKwkJfQorCisJCXJldHVybiggTWVzc2FnZTo6X05VTExfICk7CisJfQorCisKKwkvKioKKwkgKiBjb250YWlucworCSAqIHVuY29udGFpbnMKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCBib29sIGNvbnRhaW5zKExpc3RPZkluc3RhbmNlT2ZQb3J0ICYgYVNpZ25hbFRyYWNlLAorCQkJY29uc3QgUnVudGltZUlEICYgYVJlY2VpdmVyUklEID0gUnVudGltZUlEOjpSRUZfTlVMTCkgY29uc3QKKwl7CisJCUxpc3RPZkluc3RhbmNlT2ZQb3J0Ojpjb25zdF9pdGVyYXRvciBpdFNpZ25hbCA9IGFTaWduYWxUcmFjZS5iZWdpbigpOworCQlMaXN0T2ZJbnN0YW5jZU9mUG9ydDo6Y29uc3RfaXRlcmF0b3IgZW5kU2lnbmFsID0gYVNpZ25hbFRyYWNlLmVuZCgpOworCQlMaXN0T2ZNZXNzYWdlOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGl0ID0gbU1lc3NhZ2VzLnJiZWdpbigpOworCQlMaXN0T2ZNZXNzYWdlOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGl0RW5kID0gbU1lc3NhZ2VzLnJlbmQoKTsKKwkJZm9yKCA7IChpdCAhPSBpdEVuZCkgJiYgKGl0U2lnbmFsICE9IGVuZFNpZ25hbCkgOyArK2l0ICkKKwkJeworCQkJaWYoICgqaXQpLmlzQ29tcGF0aWJsZSgqaXRTaWduYWwsIGFSZWNlaXZlclJJRCkgKQorCQkJeworCQkJCSsraXRTaWduYWw7CisJCQl9CisJCX0KKworCQlyZXR1cm4oIGl0U2lnbmFsID09IGVuZFNpZ25hbCApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgYm9vbCB1bmNvbnRhaW5zKExpc3RPZkluc3RhbmNlT2ZQb3J0ICYgYVNpZ25hbFRyYWNlLAorCQkJY29uc3QgUnVudGltZUlEICYgYVJlY2VpdmVyUklEID0gUnVudGltZUlEOjpSRUZfTlVMTCkgY29uc3QKKwl7CisJCUxpc3RPZkluc3RhbmNlT2ZQb3J0OjppdGVyYXRvciBpdFNpZ25hbCA9IGFTaWduYWxUcmFjZS5iZWdpbigpOworCQlMaXN0T2ZJbnN0YW5jZU9mUG9ydDo6aXRlcmF0b3IgZW5kU2lnbmFsID0gYVNpZ25hbFRyYWNlLmVuZCgpOworCQlMaXN0T2ZNZXNzYWdlOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGl0ID0gbU1lc3NhZ2VzLnJiZWdpbigpOworCQlMaXN0T2ZNZXNzYWdlOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGl0RW5kID0gbU1lc3NhZ2VzLnJlbmQoKTsKKwkJZm9yKCA7IChpdCAhPSBpdEVuZCkgJiYgKGl0U2lnbmFsICE9IGVuZFNpZ25hbCkgOyArK2l0ICkKKwkJeworCQkJaWYoICgqaXQpLmlzQ29tcGF0aWJsZSgqaXRTaWduYWwsIGFSZWNlaXZlclJJRCkgKQorCQkJeworCQkJCWl0U2lnbmFsID0gYVNpZ25hbFRyYWNlLmVyYXNlKCBpdFNpZ25hbCApOworCQkJfQorCQl9CisKKwkJcmV0dXJuKCBhU2lnbmFsVHJhY2Uubm9uZW1wdHkoKSApOworCX0KKworCisJLyoqCisJICogcG9wCisJICovCisJaW5saW5lIHZpcnR1YWwgTWVzc2FnZSBwb3AoKQorCXsKKwkJaWYoIG5vbmVtcHR5KCkgKQorCQl7CisJCQlNZXNzYWdlIGFNc2cgPSBtTWVzc2FnZXMucG9wX2xhc3QoKTsKKworCQkJcmV0dXJuKCBhTXNnICk7CisJCX0KKworCQlyZXR1cm4oIE1lc3NhZ2U6Ol9OVUxMXyApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgTWVzc2FnZSBwb3AoYXZtX3NpemVfdCBtaWQsCisJCQljb25zdCBSdW50aW1lSUQgJiBhUmVjZWl2ZXJSSUQgPSBSdW50aW1lSUQ6OlJFRl9OVUxMKQorCXsKKwkJaWYoIG5vbmVtcHR5KCkgKQorCQl7CisJCQlNZXNzYWdlIGFNc2cgPSBtTWVzc2FnZXMuYmFjaygpOworCQkJaWYoIGFNc2cuaXNDb21wYXRpYmxlKG1pZCwgYVJlY2VpdmVyUklEKSApCisJCQl7CisJCQkJbU1lc3NhZ2VzLnBvcF9iYWNrKCk7CisKKwkJCQlyZXR1cm4oIGFNc2cgKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiggTWVzc2FnZTo6X05VTExfICk7CisJfQorCisKKworCWlubGluZSB2aXJ0dWFsIHZvaWQgcG9wQmVmb3JlKGNvbnN0IFJ1bnRpbWVJRCAmIGFSZWNlaXZlclJJRCkKKwl7CisJCUxpc3RPZk1lc3NhZ2U6OnJldmVyc2VfaXRlcmF0b3IgaXQgPSBtTWVzc2FnZXMucmJlZ2luKCk7CisJCWZvciggOyBpdCAhPSBtTWVzc2FnZXMucmVuZCgpIDsgKQorCQl7CisJCQkrK2l0OworCisJCQlpZiggKCppdCkuaXNDb21wYXRpYmxlKGFSZWNlaXZlclJJRCkgKQorCQkJeworCQkJCW1NZXNzYWdlcy5lcmFzZSggaXQuYmFzZSgpICk7CisJCQl9CisJCX0KKwl9CisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHBvcEJlZm9yZShjb25zdCBMaXN0T2ZJbnN0YW5jZU9mUG9ydCAmIGllQ29tcywKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSZWNlaXZlclJJRCA9IFJ1bnRpbWVJRDo6UkVGX05VTEwpCisJeworCQlMaXN0T2ZNZXNzYWdlOjpyZXZlcnNlX2l0ZXJhdG9yIGl0ID0gbU1lc3NhZ2VzLnJiZWdpbigpOworCQlmb3IoIDsgaXQgIT0gbU1lc3NhZ2VzLnJlbmQoKSA7ICkKKwkJeworCQkJKytpdDsKKworCQkJaWYoICgqaXQpLmlzQ29tcGF0aWJsZShhUmVjZWl2ZXJSSUQpICkKKwkJCXsKKwkJCQlpZiggKCppdCkuaXNDb21wYXRpYmxlKGllQ29tcykgKQorCQkJCXsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCW1NZXNzYWdlcy5lcmFzZSggaXQuYmFzZSgpICk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCBwb3BCZWZvcmUoY29uc3QgTGlzdE9mU2l6ZVQgJiBpZUNvbXMsCisJCQljb25zdCBSdW50aW1lSUQgJiBhUmVjZWl2ZXJSSUQgPSBSdW50aW1lSUQ6OlJFRl9OVUxMKQorCXsKKwkJTGlzdE9mTWVzc2FnZTo6cmV2ZXJzZV9pdGVyYXRvciBpdCA9IG1NZXNzYWdlcy5yYmVnaW4oKTsKKwkJZm9yKCA7IGl0ICE9IG1NZXNzYWdlcy5yZW5kKCkgOyApCisJCXsKKwkJCSsraXQ7CisKKwkJCWlmKCAoKml0KS5pc0NvbXBhdGlibGUoYVJlY2VpdmVyUklEKSApCisJCQl7CisJCQkJaWYoICgqaXQpLmlzQ29tcGF0aWJsZShpZUNvbXMpICkKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQltTWVzc2FnZXMuZXJhc2UoIGl0LmJhc2UoKSApOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCisJLyoqCisJICogY29weVRvCisJICogcmVzdG9yZQorCSAqLworCWlubGluZSB2aXJ0dWFsIHZvaWQgY29weVRvKEJhc2VCdWZmZXJGb3JtICYgYUJ1ZmZlcikgY29uc3QKKwl7CisJCUxpc3RPZk1lc3NhZ2U6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgaXQgPSBtTWVzc2FnZXMucmJlZ2luKCk7CisJCUxpc3RPZk1lc3NhZ2U6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgaXRFbmQgPSBtTWVzc2FnZXMucmVuZCgpOworCQlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwkJeworCQkJYUJ1ZmZlci5wdXNoKCAqaXQgKTsKKwkJfQorCX0KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgcmVzdG9yZShMaXN0T2ZNZXNzYWdlICYgbGlzdE9mTWVzc2FnZSkKKwl7CisJCXdoaWxlKCBsaXN0T2ZNZXNzYWdlLm5vbmVtcHR5KCkgKQorCQl7CisJCQltTWVzc2FnZXMucHVzaF9iYWNrKCBsaXN0T2ZNZXNzYWdlLmJhY2soKSApOworCisJCQlsaXN0T2ZNZXNzYWdlLnBvcF9iYWNrKCk7CisJCX0KKwl9CisKK307CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKiBNVUxUSUxJRk9CVUZGRVJfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9idWZmZXIvTXVsdGlzZXRCdWZmZXIuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2J1ZmZlci9NdWx0aXNldEJ1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QwYjA1NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9idWZmZXIvTXVsdGlzZXRCdWZmZXIuY3BwCkBAIC0wLDAgKzEsMjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJNdWx0aXNldEJ1ZmZlci5oIgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvYnVmZmVyL011bHRpc2V0QnVmZmVyLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvYnVmZmVyL011bHRpc2V0QnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVjNjEwMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9idWZmZXIvTXVsdGlzZXRCdWZmZXIuaApAQCAtMCwwICsxLDIwMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBNVUxUSVNFVEJVRkZFUl9IXworI2RlZmluZSBNVUxUSVNFVEJVRkZFUl9IXworCisjaW5jbHVkZSA8Zm1sL2J1ZmZlci9CYXNlQnVmZmVyUXVldWUuaD4KKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIE11bHRpc2V0QnVmZmVyIDogcHVibGljIEJhc2VCdWZmZXJRdWV1ZQoreworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIE11bHRpc2V0QnVmZmVyICkKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJTXVsdGlzZXRCdWZmZXIoSW5zdGFuY2VPZkJ1ZmZlciAqIGFCdWZmZXIpCisJOiBCYXNlQnVmZmVyUXVldWUoQ0xBU1NfS0lORF9UKCBNdWx0aXNldEJ1ZmZlciApLCBhQnVmZmVyKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJTXVsdGlzZXRCdWZmZXIoY29uc3QgTXVsdGlzZXRCdWZmZXIgJiBhTXVsdGlzZXQgKQorCTogQmFzZUJ1ZmZlclF1ZXVlKCBhTXVsdGlzZXQgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBCVUZGRVIgTUFOQUdFTUVOVAorCSAqLworCWlubGluZSB2aXJ0dWFsIGJvb2wgcHVzaChjb25zdCBNZXNzYWdlICYgYU1zZykKKwl7CisJCWlmKCBzaXplKCkgPCBjYXBhY2l0eSgpICkKKwkJeworCQkJbU1lc3NhZ2VzLnB1c2hfYmFjayhhTXNnKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisKKworCWlubGluZSB2aXJ0dWFsIGJvb2wgdG9wKGNvbnN0IE1lc3NhZ2UgJiBhTXNnKQorCXsKKwkJaWYoIG5vbmVtcHR5KCkgKQorCQl7CisJCQltTWVzc2FnZXMuYmFjaygpID0gYU1zZzsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgY29uc3QgTWVzc2FnZSAmIHRvcCgpIGNvbnN0CisJeworCQlpZiggbm9uZW1wdHkoKSApCisJCXsKKwkJCXJldHVybiggbU1lc3NhZ2VzLmJhY2soKSApOworCQl9CisKKwkJcmV0dXJuKCBNZXNzYWdlOjpfTlVMTF8gKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBjb25zdCBNZXNzYWdlICYgdG9wKGF2bV9zaXplX3QgbWlkLAorCQkJY29uc3QgUnVudGltZUlEICYgYVJlY2VpdmVyUklEID0gUnVudGltZUlEOjpSRUZfTlVMTCkgY29uc3QKKwl7CisJCUxpc3RPZk1lc3NhZ2U6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbU1lc3NhZ2VzLmJlZ2luKCk7CisJCUxpc3RPZk1lc3NhZ2U6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gbU1lc3NhZ2VzLmVuZCgpOworCQlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwkJeworCQkJaWYoICgqaXQpLmlzQ29tcGF0aWJsZShtaWQsIGFSZWNlaXZlclJJRCkgKQorCQkJeworCQkJCXJldHVybiggKCppdCkgKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiggTWVzc2FnZTo6X05VTExfICk7CisJfQorCisKKworCWlubGluZSB2aXJ0dWFsIE1lc3NhZ2UgcG9wKCkKKwl7CisJCWlmKCBub25lbXB0eSgpICkKKwkJeworCQkJTWVzc2FnZSBhTXNnID0gbU1lc3NhZ2VzLnBvcF9sYXN0KCk7CisKKwkJCXJldHVybiggYU1zZyApOworCQl9CisKKwkJcmV0dXJuKCBNZXNzYWdlOjpfTlVMTF8gKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIE1lc3NhZ2UgcG9wKGF2bV9zaXplX3QgbWlkLAorCQkJY29uc3QgUnVudGltZUlEICYgYVJlY2VpdmVyUklEID0gUnVudGltZUlEOjpSRUZfTlVMTCkKKwl7CisJCUxpc3RPZk1lc3NhZ2U6Oml0ZXJhdG9yIGl0ID0gbU1lc3NhZ2VzLmJlZ2luKCk7CisJCUxpc3RPZk1lc3NhZ2U6Oml0ZXJhdG9yIGl0RW5kID0gbU1lc3NhZ2VzLmVuZCgpOworCQlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwkJeworCQkJaWYoICgqaXQpLmlzQ29tcGF0aWJsZShtaWQsIGFSZWNlaXZlclJJRCkgKQorCQkJeworCQkJCU1lc3NhZ2UgYU1zZyA9ICgqaXQpOworCisJCQkJbU1lc3NhZ2VzLmVyYXNlKGl0KTsKKworCQkJCXJldHVybiggYU1zZyApOworCQkJfQorCQl9CisKKwkJcmV0dXJuKCBNZXNzYWdlOjpfTlVMTF8gKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIHZvaWQgcG9wQmVmb3JlKGNvbnN0IFJ1bnRpbWVJRCAmIGFSZWNlaXZlclJJRCkKKwl7CisJCXJlbW92ZShhUmVjZWl2ZXJSSUQpOworCX0KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgcG9wQmVmb3JlKGNvbnN0IExpc3RPZkluc3RhbmNlT2ZQb3J0ICYgaWVDb21zLAorCQkJY29uc3QgUnVudGltZUlEICYgYVJlY2VpdmVyUklEID0gUnVudGltZUlEOjpSRUZfTlVMTCkKKwl7CisJCUxpc3RPZk1lc3NhZ2U6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbU1lc3NhZ2VzLmJlZ2luKCk7CisJCUxpc3RPZk1lc3NhZ2U6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gbU1lc3NhZ2VzLmVuZCgpOworCQlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwkJeworCQkJaWYoICgqaXQpLmlzQ29tcGF0aWJsZShpZUNvbXMsIGFSZWNlaXZlclJJRCkgKQorCQkJeworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCisJCXJlbW92ZShhUmVjZWl2ZXJSSUQpOworCX0KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgcG9wQmVmb3JlKGNvbnN0IExpc3RPZlNpemVUICYgaWVDb21zLAorCQkJY29uc3QgUnVudGltZUlEICYgYVJlY2VpdmVyUklEID0gUnVudGltZUlEOjpSRUZfTlVMTCkKKwl7CisJCUxpc3RPZk1lc3NhZ2U6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbU1lc3NhZ2VzLmJlZ2luKCk7CisJCUxpc3RPZk1lc3NhZ2U6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gbU1lc3NhZ2VzLmVuZCgpOworCQlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwkJeworCQkJaWYoICgqaXQpLmlzQ29tcGF0aWJsZShpZUNvbXMsIGFSZWNlaXZlclJJRCkgKQorCQkJeworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCisJCXJlbW92ZShhUmVjZWl2ZXJSSUQpOworCX0KKworCisJLyoqCisJICogY29weVRvCisJICogcmVzdG9yZQorCSAqLworCWlubGluZSB2aXJ0dWFsIHZvaWQgY29weVRvKEJhc2VCdWZmZXJGb3JtICYgYUJ1ZmZlcikgY29uc3QKKwl7CisJCUxpc3RPZk1lc3NhZ2U6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbU1lc3NhZ2VzLmJlZ2luKCk7CisJCUxpc3RPZk1lc3NhZ2U6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gbU1lc3NhZ2VzLmVuZCgpOworCQlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwkJeworCQkJYUJ1ZmZlci5wdXNoKCAqaXQgKTsKKwkJfQorCX0KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgcmVzdG9yZShMaXN0T2ZNZXNzYWdlICYgbGlzdE9mTWVzc2FnZSkKKwl7CisJCW1NZXNzYWdlcy5zcGxpY2UoIGxpc3RPZk1lc3NhZ2UgKTsKKwl9CisKKworfTsKKworfQorCisjZW5kaWYgLypNVUxUSVNFVEJVRkZFUl9IXyovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvYnVmZmVyL1JhbUJ1ZmZlci5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvYnVmZmVyL1JhbUJ1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUwOGYyMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9idWZmZXIvUmFtQnVmZmVyLmNwcApAQCAtMCwwICsxLDEwMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgIlJhbUJ1ZmZlci5oIgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvUnVudGltZUlELmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK3ZvaWQgUmFtQnVmZmVyOjp0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlvcyA8PCBUQUIgPDwgImJ1ZmZlciByYW0gIgorCQkJPDwgKCBoYXNJbnN0YW5jZSgpID8gZ2V0SW5zdGFuY2UoKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA6ICJfIikKKwkJCTw8ICIgeyI7CisJQVZNX0RFQlVHX1JFRl9DT1VOVEVSKG9zKTsKKwlvcyA8PCBFT0xfSU5DUl9JTkRFTlQ7CisKKwlpZiggbm9uZW1wdHkoKSApCisJeworCQltTWVzc2FnZS50b1N0cmVhbShvcyk7CisJfQorCisJb3MgPDwgREVDUl9JTkRFTlRfVEFCIDw8ICJ9IiA8PCBFT0xfRkxVU0g7Cit9CisKKwordm9pZCBSYW1CdWZmZXI6OnRvRnNjbihPdXRTdHJlYW0gJiBvcywKKwkJY29uc3QgUnVudGltZUlEICYgYVJJRCwgY29uc3QgQmFzZUJ1ZmZlckZvcm0gKiBwcmV2QnVmKSBjb25zdAoreworCWJvb2wgaGFzRGlmZmVyZW5jZSA9IChwcmV2QnVmID09IE5VTEwpOworCisJaWYoIChub3QgaGFzRGlmZmVyZW5jZSkKKwkJJiYgKHByZXZCdWYtPmNsYXNzS2luZCgpID09IGNsYXNzS2luZCgpKQorCQkmJiBwcmV2QnVmLT5pczwgUmFtQnVmZmVyID4oKSApCisJeworCQljb25zdCBSYW1CdWZmZXIqIHByZXYgPSBwcmV2QnVmLT50bzwgUmFtQnVmZmVyID4oKTsKKwkJaWYocHJldi0+bU1lc3NhZ2UhPW1NZXNzYWdlKQorCQl7CisJCQloYXNEaWZmZXJlbmNlID0gdHJ1ZTsKKwkJfQorCX0KKworCVN0cmluZ091dFN0cmVhbSBvc3M7CisKKwlpZiggaGFzRGlmZmVyZW5jZSApCisJeworCQlpZiggbm9uZW1wdHkoKSApCisJCXsKKwkJCW1NZXNzYWdlLnRvRnNjbihvc3MgPDwgQVZNX1NUUl9JTkRFTlQpOworCQkJb3NzIDw8IEVORF9JTkRFTlQ7CisJCX0KKwkJZWxzZQorCQl7CisJCQlvc3MgPDwgIiAiOworCQl9CisKKwl9CisKKwlpZiggbm90IG9zcy5zdHIoKS5lbXB0eSgpICkKKwl7CisJCXN0ZDo6c3RyaW5nIGJ1ZmZlcmtpbmQ7CisJCXN3aXRjaCggY2xhc3NLaW5kKCkgKQorCQl7CisJCQljYXNlIEZPUk1fQlVGRkVSX1JBTV9LSU5EOgorCQkJeworCQkJCWJ1ZmZlcmtpbmQgPSAiUkFNIjsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCW9zIDw8IFRBQiA8PCAiOnBpZCMiIDw8IGFSSUQuZ2V0UmlkKCkgPDwgIjoiIDw8ICI8IgorCQkJCTw8IGJ1ZmZlcmtpbmQgPDwgIj4jIiA8PCBnZXRJbnN0YW5jZSgpLT5nZXRPZmZzZXQoKSA8PCAieyI7CisKKwkJaWYob3NzLnN0cigpLmNvbXBhcmUoIiAiKT09MCkKKwkJeworCQkJb3MgPDwgIiB9IiA8PCBFT0xfRkxVU0g7CisJCX0KKwkJZWxzZQorCQl7CisJCQlvcyA8PCBvc3Muc3RyKCkgPDwgIiB9IiA8PCBFT0xfRkxVU0g7CisJCX0KKwl9Cit9CisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2J1ZmZlci9SYW1CdWZmZXIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9idWZmZXIvUmFtQnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVhNzlmNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9idWZmZXIvUmFtQnVmZmVyLmgKQEAgLTAsMCArMSwzMzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUkFNQlVGRkVSX0hfCisjZGVmaW5lIFJBTUJVRkZFUl9IXworCisjaW5jbHVkZSA8Zm1sL2J1ZmZlci9CYXNlQnVmZmVyRm9ybS5oPgorCisKKyNpbmNsdWRlIDxmbWwvcnVudGltZS9NZXNzYWdlLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIFJ1bnRpbWVJRDsKKworCisKK2NsYXNzIFJhbUJ1ZmZlciA6IHB1YmxpYyBCYXNlQnVmZmVyRm9ybQoreworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIFJhbUJ1ZmZlciApCisKKworcHJvdGVjdGVkOgorCS8qCisJICogQVRUUklCVVRFUworCSAqLworCU1lc3NhZ2UgbU1lc3NhZ2U7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCVJhbUJ1ZmZlcihJbnN0YW5jZU9mQnVmZmVyICogYUJ1ZmZlcikKKwk6IEJhc2VCdWZmZXJGb3JtKENMQVNTX0tJTkRfVCggUmFtQnVmZmVyICksIGFCdWZmZXIpLAorCW1NZXNzYWdlKCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIENvcHkKKwkgKi8KKwlSYW1CdWZmZXIoY29uc3QgUmFtQnVmZmVyICYgYVJhbSkKKwk6IEJhc2VCdWZmZXJGb3JtKCBhUmFtICksCisJbU1lc3NhZ2UoIGFSYW0ubU1lc3NhZ2UgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBPdGhlcgorCSAqLworCVJhbUJ1ZmZlcihjbGFzc19raW5kX3QgYUNsYXNzS2luZCwgSW5zdGFuY2VPZkJ1ZmZlciAqIGFCdWZmZXIpCisJOiBCYXNlQnVmZmVyRm9ybShhQ2xhc3NLaW5kLCBhQnVmZmVyKSwKKwltTWVzc2FnZSggKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+UmFtQnVmZmVyKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIEJVRkZFUiBNQU5BR0VNRU5UIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvKioKKwkgKiBlbXB0aW5lc3MKKwkgKiBzaXplCisJICovCisJaW5saW5lIHZpcnR1YWwgYm9vbCBlbXB0eSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1NZXNzYWdlLmludmFsaWQoKSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGJvb2wgbm9uZW1wdHkoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtTWVzc2FnZS52YWxpZCgpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgYm9vbCBzaW5nbGV0b24oKWNvbnN0CisJeworCQlyZXR1cm4oIG1NZXNzYWdlLnZhbGlkKCkgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBib29sIHBvcHVsYXRlZCgpY29uc3QKKwl7CisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBib29sIGZ1bGwoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtTWVzc2FnZS52YWxpZCgpICk7CisJfQorCisJdmlydHVhbCBhdm1fc2l6ZV90IHNpemUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtTWVzc2FnZS52YWxpZCgpID8gMSA6IDAgKTsKKwl9CisKKwkvKioKKwkgKiBDb21wYXJpc29uCisJICogb3BlcmF0b3I9PQorCSAqLworCWlubGluZSB2aXJ0dWFsIGJvb2wgZXF1YWxzKGNvbnN0IEJhc2VCdWZmZXJGb3JtICYgYUJ1ZmZlcikgY29uc3QKKwl7CisJCXJldHVybiggKHRoaXMgPT0gJmFCdWZmZXIpCisJCQkJfHwgKGFCdWZmZXIuaXM8IFJhbUJ1ZmZlciA+KCkKKwkJCQkJJiYgbU1lc3NhZ2UuZXF1YWxzKAorCQkJCQkJCWFCdWZmZXIudG88IFJhbUJ1ZmZlciA+KCktPm1NZXNzYWdlICkgKSApOworCX0KKworCS8qKgorCSAqIGNsZWFyCisJICogcmVzaXplCisJICovCisJaW5saW5lIHZpcnR1YWwgdm9pZCBjbGVhcigpCisJeworCQltTWVzc2FnZS5kZXN0cm95KCk7CisJfQorCisKKwl2aXJ0dWFsIHZvaWQgcmVzaXplKGF2bV9zaXplX3QgbmV3U2l6ZSkKKwl7CisJCS8vIE5PVEhJTkcKKwl9CisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHJlc2l6ZShhdm1fc2l6ZV90IG5ld1NpemUsIGNvbnN0IE1lc3NhZ2UgJiBhTXNnKQorCXsKKwkJaWYoIG1NZXNzYWdlLmludmFsaWQoKSApCisJCXsKKwkJCW1NZXNzYWdlID0gYU1zZzsKKwkJfQorCX0KKworCisJLyoqCisJICogcHVzaAorCSAqIHRvcAorCSAqLworCWlubGluZSB2aXJ0dWFsIGJvb2wgcHVzaChjb25zdCBNZXNzYWdlICYgYU1zZykKKwl7CisJCW1NZXNzYWdlID0gYU1zZzsKKworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIGJvb2wgdG9wKGNvbnN0IE1lc3NhZ2UgJiBhTXNnKQorCXsKKwkJbU1lc3NhZ2UgPSBhTXNnOworCisJCXJldHVybiggdHJ1ZSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGNvbnN0IE1lc3NhZ2UgJiB0b3AoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtTWVzc2FnZSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGNvbnN0IE1lc3NhZ2UgJiB0b3AoYXZtX3NpemVfdCBtaWQsCisJCQljb25zdCBSdW50aW1lSUQgJiBhUmVjZWl2ZXJSSUQgPSBSdW50aW1lSUQ6OlJFRl9OVUxMKSBjb25zdAorCXsKKwkJaWYoIG5vbmVtcHR5KCkgJiYgbU1lc3NhZ2UuaXNDb21wYXRpYmxlKG1pZCwgYVJlY2VpdmVyUklEKSApCisJCXsKKwkJCXJldHVybiggbU1lc3NhZ2UgKTsKKwkJfQorCisJCXJldHVybiggTWVzc2FnZTo6X05VTExfICk7CisJfQorCisKKwkvKioKKwkgKiBjb250YWlucworCSAqIHVuY29udGFpbnMKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCBib29sIGNvbnRhaW5zKGF2bV9zaXplX3QgbWlkLAorCQkJY29uc3QgUnVudGltZUlEICYgYVJlY2VpdmVyUklEID0gUnVudGltZUlEOjpSRUZfTlVMTCkgY29uc3QKKwl7CisJCXJldHVybiggbm9uZW1wdHkoKSAmJiBtTWVzc2FnZS5pc0NvbXBhdGlibGUobWlkLCBhUmVjZWl2ZXJSSUQpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgYm9vbCBjb250YWlucyhJbnN0YW5jZU9mUG9ydCAqIGFTaWduYWwsCisJCQljb25zdCBSdW50aW1lSUQgJiBhUmVjZWl2ZXJSSUQgPSBSdW50aW1lSUQ6OlJFRl9OVUxMKSBjb25zdAorCXsKKwkJcmV0dXJuKCBub25lbXB0eSgpICYmIG1NZXNzYWdlLmlzQ29tcGF0aWJsZShhU2lnbmFsLCBhUmVjZWl2ZXJSSUQpICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBib29sIGNvbnRhaW5zKExpc3RPZkluc3RhbmNlT2ZQb3J0ICYgYVNpZ25hbFRyYWNlLAorCQkJY29uc3QgUnVudGltZUlEICYgYVJlY2VpdmVyUklEID0gUnVudGltZUlEOjpSRUZfTlVMTCkgY29uc3QKKwl7CisJCXJldHVybiggYVNpZ25hbFRyYWNlLnNpbmdsZXRvbigpICYmCisJCQkJY29udGFpbnMoYVNpZ25hbFRyYWNlLmZpcnN0KCksIGFSZWNlaXZlclJJRCkgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBib29sIHVuY29udGFpbnMoTGlzdE9mSW5zdGFuY2VPZlBvcnQgJiBhU2lnbmFsVHJhY2UsCisJCQljb25zdCBSdW50aW1lSUQgJiBhUmVjZWl2ZXJSSUQgPSBSdW50aW1lSUQ6OlJFRl9OVUxMKSBjb25zdAorCXsKKwkJaWYoIGFTaWduYWxUcmFjZS5ub25lbXB0eSgpICYmCisJCQljb250YWlucyhhU2lnbmFsVHJhY2UuZmlyc3QoKSwgYVJlY2VpdmVyUklEKSApCisJCXsKKwkJCWFTaWduYWxUcmFjZS5wb3BfZmlyc3QoKTsKKwkJfQorCisJCXJldHVybiggYVNpZ25hbFRyYWNlLm5vbmVtcHR5KCkgKTsKKwl9CisKKworCS8qKgorCSAqIHBvcAorCSAqLworCWlubGluZSB2aXJ0dWFsIE1lc3NhZ2UgcG9wKCkKKwl7CisJCXJldHVybiggbU1lc3NhZ2UgKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIE1lc3NhZ2UgcG9wKGF2bV9zaXplX3QgbWlkLAorCQkJY29uc3QgUnVudGltZUlEICYgYVJlY2VpdmVyUklEID0gUnVudGltZUlEOjpSRUZfTlVMTCkKKwl7CisJCWlmKCBub25lbXB0eSgpICYmIG1NZXNzYWdlLmlzQ29tcGF0aWJsZShtaWQsIGFSZWNlaXZlclJJRCkgKQorCQl7CisJCQlyZXR1cm4oIG1NZXNzYWdlICk7CisJCX0KKworCQlyZXR1cm4oIE1lc3NhZ2U6Ol9OVUxMXyApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgdm9pZCBwb3BCZWZvcmUoY29uc3QgUnVudGltZUlEICYgYVJlY2VpdmVyUklEKQorCXsKKwkJaWYoIG1NZXNzYWdlLmlzQ29tcGF0aWJsZShhUmVjZWl2ZXJSSUQpICkKKwkJeworCQkJY2xlYXIoKTsKKwkJfQorCX0KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgcG9wQmVmb3JlKGNvbnN0IExpc3RPZkluc3RhbmNlT2ZQb3J0ICYgaWVDb21zLAorCQkJY29uc3QgUnVudGltZUlEICYgYVJlY2VpdmVyUklEID0gUnVudGltZUlEOjpSRUZfTlVMTCkKKwl7CisJCWlmKCBtTWVzc2FnZS5pc0NvbXBhdGlibGUoYVJlY2VpdmVyUklEKSApCisJCXsKKwkJCWlmKCBub3QgbU1lc3NhZ2UuaXNDb21wYXRpYmxlKGllQ29tcykgKQorCQkJeworCQkJCWNsZWFyKCk7CisJCQl9CisJCX0KKwl9CisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHBvcEJlZm9yZShjb25zdCBMaXN0T2ZTaXplVCAmIGllQ29tcywKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSZWNlaXZlclJJRCA9IFJ1bnRpbWVJRDo6UkVGX05VTEwpCisJeworCQlpZiggbU1lc3NhZ2UuaXNDb21wYXRpYmxlKGFSZWNlaXZlclJJRCkgKQorCQl7CisJCQlpZiggbm90IG1NZXNzYWdlLmlzQ29tcGF0aWJsZShpZUNvbXMpICkKKwkJCXsKKwkJCQljbGVhcigpOworCQkJfQorCQl9CisJfQorCisKKwkvKioKKwkgKiByZW1vdmUKKwkgKiBjb3B5VG8KKwkgKiByZXN0b3JlCisJICovCisJaW5saW5lIHZpcnR1YWwgdm9pZCByZW1vdmUoSW5zdGFuY2VPZlBvcnQgKiBhU2lnbmFsKQorCXsKKwkJaWYoIG1NZXNzYWdlLnZhbGlkKCkgJiYKKwkJCW1NZXNzYWdlLmlzU2lnbmFsKGFTaWduYWwpICkKKwkJeworCQkJbU1lc3NhZ2UuZGVzdHJveSgpOworCQl9CisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCBjb3B5VG8oQmFzZUJ1ZmZlckZvcm0gJiBhQnVmZmVyKSBjb25zdAorCXsKKwkJaWYoIG1NZXNzYWdlLnZhbGlkKCkgKQorCQl7CisJCQlhQnVmZmVyLnB1c2goIG1NZXNzYWdlICk7CisJCX0KKwl9CisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHJlc3RvcmUoTGlzdE9mTWVzc2FnZSAmIGxpc3RPZk1lc3NhZ2UpCisJeworCQlpZiggbGlzdE9mTWVzc2FnZS5ub25lbXB0eSgpICkKKwkJeworCQkJbU1lc3NhZ2UgPSBsaXN0T2ZNZXNzYWdlLmJhY2soKTsKKwkJfQorCX0KKworCisJLyoqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFNFUklBTElaQVRJT04KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJdmlydHVhbCB2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworCXZpcnR1YWwgdm9pZCB0b0ZzY24oT3V0U3RyZWFtICYgb3MsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsCisJCQljb25zdCBCYXNlQnVmZmVyRm9ybSAqIHByZXZCdWYgPSBOVUxMKSBjb25zdDsKKworfTsKKworCit9CisKKyNlbmRpZiAvKlJBTUJVRkZFUl9IXyovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvYnVmZmVyL1NldEJ1ZmZlci5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvYnVmZmVyL1NldEJ1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQyNzg4ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9idWZmZXIvU2V0QnVmZmVyLmNwcApAQCAtMCwwICsxLDIwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiU2V0QnVmZmVyLmgiCisKKworbmFtZXNwYWNlIHNlcAoreworCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9idWZmZXIvU2V0QnVmZmVyLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvYnVmZmVyL1NldEJ1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNTkxYWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvYnVmZmVyL1NldEJ1ZmZlci5oCkBAIC0wLDAgKzEsMjE0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFNFVEJVRkZFUl9IXworI2RlZmluZSBTRVRCVUZGRVJfSF8KKworI2luY2x1ZGUgPGZtbC9idWZmZXIvQmFzZUJ1ZmZlclF1ZXVlLmg+CisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjbGFzcyBTZXRCdWZmZXIgOiBwdWJsaWMgQmFzZUJ1ZmZlclF1ZXVlCit7CisKKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggU2V0QnVmZmVyICkKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJU2V0QnVmZmVyKEluc3RhbmNlT2ZCdWZmZXIgKiBhQnVmZmVyKQorCTogQmFzZUJ1ZmZlclF1ZXVlKENMQVNTX0tJTkRfVCggU2V0QnVmZmVyICksIGFCdWZmZXIpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIENvcHkKKwkgKi8KKwlTZXRCdWZmZXIoY29uc3QgU2V0QnVmZmVyICYgYVNldCApCisJOiBCYXNlQnVmZmVyUXVldWUoIGFTZXQgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBCVUZGRVIgTUFOQUdFTUVOVAorCSAqLworCWlubGluZSB2aXJ0dWFsIGJvb2wgcHVzaChjb25zdCBNZXNzYWdlICYgYU1zZykKKwl7CisJCWlmKCBzaXplKCkgPCBjYXBhY2l0eSgpICkKKwkJeworCQkJLy8gQXNzdW1lIHRoYXQgaXMgYSBzZXQKKwkJCUxpc3RPZk1lc3NhZ2U6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbU1lc3NhZ2VzLmJlZ2luKCk7CisJCQlMaXN0T2ZNZXNzYWdlOjpjb25zdF9pdGVyYXRvciBpdEVuZCA9IG1NZXNzYWdlcy5lbmQoKTsKKwkJCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQorCQkJeworCQkJCWlmKCAoKml0KS5lcXVhbHMoYU1zZykgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCB0cnVlICk7CisJCQkJfQorCQkJfQorCisJCQltTWVzc2FnZXMucHVzaF9iYWNrKGFNc2cpOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKworCisJaW5saW5lIHZpcnR1YWwgYm9vbCB0b3AoY29uc3QgTWVzc2FnZSAmIGFNc2cpCisJeworCQlpZiggbm9uZW1wdHkoKSApCisJCXsKKwkJCW1NZXNzYWdlcy5iYWNrKCkgPSBhTXNnOworCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBjb25zdCBNZXNzYWdlICYgdG9wKCkgY29uc3QKKwl7CisJCWlmKCBub25lbXB0eSgpICkKKwkJeworCQkJcmV0dXJuKCBtTWVzc2FnZXMuYmFjaygpICk7CisJCX0KKworCQlyZXR1cm4oIE1lc3NhZ2U6Ol9OVUxMXyApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGNvbnN0IE1lc3NhZ2UgJiB0b3AoYXZtX3NpemVfdCBtaWQsCisJCQljb25zdCBSdW50aW1lSUQgJiBhUmVjZWl2ZXJSSUQgPSBSdW50aW1lSUQ6OlJFRl9OVUxMKSBjb25zdAorCXsKKwkJTGlzdE9mTWVzc2FnZTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtTWVzc2FnZXMuYmVnaW4oKTsKKwkJTGlzdE9mTWVzc2FnZTo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBtTWVzc2FnZXMuZW5kKCk7CisJCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQorCQl7CisJCQlpZiggKCppdCkuaXNDb21wYXRpYmxlKG1pZCwgYVJlY2VpdmVyUklEKSApCisJCQl7CisJCQkJcmV0dXJuKCAoKml0KSApOworCQkJfQorCQl9CisKKwkJcmV0dXJuKCBNZXNzYWdlOjpfTlVMTF8gKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIE1lc3NhZ2UgcG9wKCkKKwl7CisJCWlmKCBub25lbXB0eSgpICkKKwkJeworCQkJTWVzc2FnZSBhTXNnID0gbU1lc3NhZ2VzLnBvcF9sYXN0KCk7CisKKwkJCXJldHVybiggYU1zZyApOworCQl9CisKKwkJcmV0dXJuKCBNZXNzYWdlOjpfTlVMTF8gKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIE1lc3NhZ2UgcG9wKGF2bV9zaXplX3QgbWlkLAorCQkJY29uc3QgUnVudGltZUlEICYgYVJlY2VpdmVyUklEID0gUnVudGltZUlEOjpSRUZfTlVMTCkKKwl7CisJCUxpc3RPZk1lc3NhZ2U6Oml0ZXJhdG9yIGl0ID0gbU1lc3NhZ2VzLmJlZ2luKCk7CisJCUxpc3RPZk1lc3NhZ2U6Oml0ZXJhdG9yIGl0RW5kID0gbU1lc3NhZ2VzLmVuZCgpOworCQlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwkJeworCQkJaWYoICgqaXQpLmlzQ29tcGF0aWJsZShtaWQsIGFSZWNlaXZlclJJRCkgKQorCQkJeworCQkJCU1lc3NhZ2UgYU1zZyA9ICgqaXQpOworCisJCQkJbU1lc3NhZ2VzLmVyYXNlKGl0KTsKKworCQkJCXJldHVybiggYU1zZyApOworCQkJfQorCQl9CisKKwkJcmV0dXJuKCBNZXNzYWdlOjpfTlVMTF8gKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIHZvaWQgcG9wQmVmb3JlKGNvbnN0IFJ1bnRpbWVJRCAmIGFSZWNlaXZlclJJRCkKKwl7CisJCXJlbW92ZShhUmVjZWl2ZXJSSUQpOworCX0KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgcG9wQmVmb3JlKGNvbnN0IExpc3RPZkluc3RhbmNlT2ZQb3J0ICYgaWVDb21zLAorCQkJY29uc3QgUnVudGltZUlEICYgYVJlY2VpdmVyUklEID0gUnVudGltZUlEOjpSRUZfTlVMTCkKKwl7CisJCUxpc3RPZk1lc3NhZ2U6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbU1lc3NhZ2VzLmJlZ2luKCk7CisJCUxpc3RPZk1lc3NhZ2U6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gbU1lc3NhZ2VzLmVuZCgpOworCQlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwkJeworCQkJaWYoICgqaXQpLmlzQ29tcGF0aWJsZShpZUNvbXMsIGFSZWNlaXZlclJJRCkgKQorCQkJeworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCisJCXJlbW92ZShhUmVjZWl2ZXJSSUQpOworCX0KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgcG9wQmVmb3JlKGNvbnN0IExpc3RPZlNpemVUICYgaWVDb21zLAorCQkJY29uc3QgUnVudGltZUlEICYgYVJlY2VpdmVyUklEID0gUnVudGltZUlEOjpSRUZfTlVMTCkKKwl7CisJCUxpc3RPZk1lc3NhZ2U6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbU1lc3NhZ2VzLmJlZ2luKCk7CisJCUxpc3RPZk1lc3NhZ2U6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gbU1lc3NhZ2VzLmVuZCgpOworCQlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwkJeworCQkJaWYoICgqaXQpLmlzQ29tcGF0aWJsZShpZUNvbXMsIGFSZWNlaXZlclJJRCkgKQorCQkJeworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCisJCXJlbW92ZShhUmVjZWl2ZXJSSUQpOworCX0KKworCisJLyoqCisJICogY29weVRvCisJICogcmVzdG9yZQorCSAqLworCWlubGluZSB2aXJ0dWFsIHZvaWQgY29weVRvKEJhc2VCdWZmZXJGb3JtICYgYUJ1ZmZlcikgY29uc3QKKwl7CisJCUxpc3RPZk1lc3NhZ2U6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbU1lc3NhZ2VzLmJlZ2luKCk7CisJCUxpc3RPZk1lc3NhZ2U6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gbU1lc3NhZ2VzLmVuZCgpOworCQlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwkJeworCQkJYUJ1ZmZlci5wdXNoKCAqaXQgKTsKKwkJfQorCX0KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgcmVzdG9yZShMaXN0T2ZNZXNzYWdlICYgbGlzdE9mTWVzc2FnZSkKKwl7CisJCW1NZXNzYWdlcy5zcGxpY2UoIGxpc3RPZk1lc3NhZ2UgKTsKKwl9CisKKworfTsKKworCit9CisKKyNlbmRpZiAvKlNFVEJVRkZFUl9IXyovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvYnVpbHRpbi9Cb29sZWFuLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9idWlsdGluL0Jvb2xlYW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1Mjk0ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvYnVpbHRpbi9Cb29sZWFuLmNwcApAQCAtMCwwICsxLDIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiQm9vbGVhbi5oIgorCisjaW5jbHVkZSA8Y29tbW9uL0JGLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9idWlsdGluL0Jvb2xlYW4uaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9idWlsdGluL0Jvb2xlYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzdkMDdiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2J1aWx0aW4vQm9vbGVhbi5oCkBAIC0wLDAgKzEsMTI1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIEZNTF9FWFBSRVNTSU9OX0JPT0xFQU5fSF8KKyNkZWZpbmUgRk1MX0VYUFJFU1NJT05fQk9PTEVBTl9IXworCisjaW5jbHVkZSA8Zm1sL2J1aWx0aW4vQnVpbHRpbkZvcm0uaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworY2xhc3MgQm9vbGVhbiA6CisJCXB1YmxpYyBCdWlsdGluRm9ybSwKKwkJcHVibGljIEdlbmVyaWNCdWlsdGluVmFsdWU8IGJvb2wgLCBCb29sZWFuID4KK3sKKworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBCb29sZWFuICkKKworCitwcml2YXRlOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUJvb2xlYW4oYm9vbCBhVmFsdWUpCisJOiBCdWlsdGluRm9ybSggQ0xBU1NfS0lORF9UKCBCb29sZWFuICkgKSwKKwlHZW5lcmljQnVpbHRpblZhbHVlKCBhVmFsdWUgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJQm9vbGVhbihjb25zdCBCb29sZWFuICYgYUJvb2xlYW4pCisJOiBCdWlsdGluRm9ybSggYUJvb2xlYW4gKSwKKwlHZW5lcmljQnVpbHRpblZhbHVlKCBhQm9vbGVhbiApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworcHVibGljOgorCS8qKgorCSAqIENSRUFUT1IKKwkgKi8KKwlpbmxpbmUgc3RhdGljIEJvb2xlYW4gKiBjcmVhdGUoYm9vbCBhVmFsdWUpCisJeworCQlyZXR1cm4oIG5ldyBCb29sZWFuKGFWYWx1ZSkgKTsKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5Cb29sZWFuKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogVkFMVUUgVEVTVAorCSAqLworCWlubGluZSB2aXJ0dWFsIGJvb2wgaXNFcXVhbEZhbHNlKCkgY29uc3QKKwl7CisJCXJldHVybiggISBtVmFsdWUgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBib29sIGlzTm90RXF1YWxGYWxzZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1WYWx1ZSApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgYm9vbCBpc0VxdWFsVHJ1ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1WYWx1ZSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGJvb2wgaXNOb3RFcXVhbFRydWUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAhIG1WYWx1ZSApOworCX0KKworCisJLyoqCisJICogU2VyaWFsaXphdGlvbgorCSAqLworCWlubGluZSB2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJb3MgPDwgVEFCIDw8ICggbVZhbHVlID8gInRydWUiIDogImZhbHNlIiApOworCQlBVk1fREVCVUdfUkVGX0NPVU5URVIob3MpOworCQlvcyA8PCBFT0wgPDwgc3RkOjpmbHVzaDsKKwl9CisKKwl2aXJ0dWFsIHN0ZDo6c3RyaW5nIHN0cigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1WYWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSIgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBzdGQ6OnN0cmluZyBzdHJOdW0oCisJCQlhdm1fdWludDhfdCBwcmVjaXNpb24gPSBBVk1fTVVNRVJJQ19QUkVDSVNJT04pIGNvbnN0CisJeworCQlyZXR1cm4oIG1WYWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSIgKTsKKwl9CisKK307CisKKworfQorCisjZW5kaWYgLypGTUxfRVhQUkVTU0lPTl9CT09MRUFOX0hfKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9idWlsdGluL0J1aWx0aW5Gb3JtLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9idWlsdGluL0J1aWx0aW5Gb3JtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2ViMThiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2J1aWx0aW4vQnVpbHRpbkZvcm0uY3BwCkBAIC0wLDAgKzEsMTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJCdWlsdGluRm9ybS5oIgorCituYW1lc3BhY2Ugc2VwCit7CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9idWlsdGluL0J1aWx0aW5Gb3JtLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvYnVpbHRpbi9CdWlsdGluRm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNDI2ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvYnVpbHRpbi9CdWlsdGluRm9ybS5oCkBAIC0wLDAgKzEsMjM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIEZNTF9FWFBSRVNTSU9OX0JVSUxUSU5fSF8KKyNkZWZpbmUgRk1MX0VYUFJFU1NJT05fQlVJTFRJTl9IXworCisjaW5jbHVkZSA8Y29tbW9uL0VsZW1lbnQuaD4KKyNpbmNsdWRlIDxjb21tb24vQXZtUG9pbnRlci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjbGFzcyBCdWlsdGluRm9ybSA6IHB1YmxpYyBFbGVtZW50ICwKKwkJQVZNX0lOSkVDVF9JTlNUQU5DRV9DT1VOVEVSX0NMQVNTKCBCdWlsdGluRm9ybSApCit7CisKKworcHVibGljOgorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQnVpbHRpbkZvcm0oY2xhc3Nfa2luZF90IGFDbGFzc0tpbmQpCisJOiBFbGVtZW50KCBhQ2xhc3NLaW5kICkKKwl7CisJCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIENvcHkKKwkgKi8KKwlCdWlsdGluRm9ybShjb25zdCBCdWlsdGluRm9ybSAmIGFCdWlsdGluKQorCTogRWxlbWVudCggYUJ1aWx0aW4gKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+QnVpbHRpbkZvcm0oKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBDT01QQVJJU09OCisJICogT1BFUkFUT1IKKwkgKi8KKworLy8JdmlydHVhbCBib29sIGlzRVEoY29uc3QgRWxlbWVudCAmIGJmKSBjb25zdCA9IDA7CisvLworLy8JdmlydHVhbCBib29sIGlzTkVRKGNvbnN0IEVsZW1lbnQgJiBiZikgY29uc3QgPSAwOworCisKKwkvKioKKwkgKiBTRVJJQUxJWkFUSU9OCisJICovCisJdmlydHVhbCB2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdCA9IDA7CisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBBVFRSSUJVVEVTCisJICovCisKK307CisKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gR0VORVJJQyBCVUlMVElOIEZPUk0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVmFsdWVfVCAsIGNsYXNzIENsYXNzX1QgPgorY2xhc3MgR2VuZXJpY0J1aWx0aW5WYWx1ZQoreworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQVRUUklCVVRFUworCSAqLworCVZhbHVlX1QgbVZhbHVlOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlHZW5lcmljQnVpbHRpblZhbHVlKFZhbHVlX1QgYVZhbHVlKQorCTogbVZhbHVlKCBhVmFsdWUgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJR2VuZXJpY0J1aWx0aW5WYWx1ZShjb25zdCBHZW5lcmljQnVpbHRpblZhbHVlICYgYUJ1aWx0aW4pCisJOiBtVmFsdWUoIGFCdWlsdGluLm1WYWx1ZSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5HZW5lcmljQnVpbHRpblZhbHVlKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVZhbHVlCisJICovCisJaW5saW5lIFZhbHVlX1QgJiBnZXRWYWx1ZSgpCisJeworCQlyZXR1cm4oIG1WYWx1ZSApOworCX0KKworCWlubGluZSBjb25zdCBWYWx1ZV9UICYgZ2V0VmFsdWUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVmFsdWUgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRWYWx1ZShWYWx1ZV9UIGFWYWx1ZSkKKwl7CisJCW1WYWx1ZSA9IGFWYWx1ZTsKKwl9CisKKworCS8qKgorCSAqIENPTVBBUklTT04KKwkgKiBPUEVSQVRPUgorCSAqLworCWlubGluZSBpbnQgY29tcGFyZShjb25zdCBDbGFzc19UICYgb3RoZXIpIGNvbnN0CisJeworCQlyZXR1cm4oIChtVmFsdWUgPT0gb3RoZXIubVZhbHVlICk/IDAgOgorCQkJCSgobVZhbHVlIDwgb3RoZXIubVZhbHVlICkgPyAtMSA6IDEpICk7CisJfQorCisJaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDbGFzc19UICYgb3RoZXIpIGNvbnN0CisJeworCQlyZXR1cm4oIG1WYWx1ZSA9PSBvdGhlci5tVmFsdWUgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc0VRKGNvbnN0IENsYXNzX1QgJiBvdGhlcikgY29uc3QKKwl7CisJCXJldHVybiggbVZhbHVlID09IG90aGVyLm1WYWx1ZSApOworCX0KKworCWlubGluZSBib29sIGlzTkVRKGNvbnN0IENsYXNzX1QgJiBvdGhlcikgY29uc3QKKwl7CisJCXJldHVybiggbVZhbHVlICE9IG90aGVyLm1WYWx1ZSApOworCX0KKworfTsKKworCisKK3RlbXBsYXRlPCBjbGFzcyBDbGFzc19UID4KK2NsYXNzIEdlbmVyaWNCdWlsdGluVmFsdWVTdHJpbmcgOgorCQlwdWJsaWMgR2VuZXJpY0J1aWx0aW5WYWx1ZTwgc3RkOjpzdHJpbmcgLCBDbGFzc19UID4KK3sKKworcHVibGljOgorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJR2VuZXJpY0J1aWx0aW5WYWx1ZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmIGFWYWx1ZSkKKwk6IEdlbmVyaWNCdWlsdGluVmFsdWU8IHN0ZDo6c3RyaW5nICwgQ2xhc3NfVCA+KCBhVmFsdWUgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJR2VuZXJpY0J1aWx0aW5WYWx1ZVN0cmluZyhjb25zdCBHZW5lcmljQnVpbHRpblZhbHVlU3RyaW5nICYgYUJ1aWx0aW4pCisJOiBHZW5lcmljQnVpbHRpblZhbHVlPCBzdGQ6OnN0cmluZyAsIENsYXNzX1QgPiggYUJ1aWx0aW4gKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+R2VuZXJpY0J1aWx0aW5WYWx1ZVN0cmluZygpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIENPTVBBUklTT04KKwkgKiBPUEVSQVRPUgorCSAqLworCisJaW5saW5lIGludCBjb21wYXJlKGNvbnN0IENsYXNzX1QgJiBvdGhlcikgY29uc3QKKwl7CisJCXJldHVybiggR2VuZXJpY0J1aWx0aW5WYWx1ZTwgc3RkOjpzdHJpbmcgLCBDbGFzc19UID46OgorCQkJCW1WYWx1ZS5jb21wYXJlKCBvdGhlci5tVmFsdWUgKSApOworCX0KKworfTsKKworCit9CisKKyNlbmRpZiAvKkZNTF9FWFBSRVNTSU9OX0JVSUxUSU5fSF8qLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2J1aWx0aW4vQ2hhcmFjdGVyLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9idWlsdGluL0NoYXJhY3Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE4YmMwNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9idWlsdGluL0NoYXJhY3Rlci5jcHAKQEAgLTAsMCArMSwxOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgIkNoYXJhY3Rlci5oIgorCituYW1lc3BhY2Ugc2VwCit7CisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2J1aWx0aW4vQ2hhcmFjdGVyLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvYnVpbHRpbi9DaGFyYWN0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWFkZGM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2J1aWx0aW4vQ2hhcmFjdGVyLmgKQEAgLTAsMCArMSwxMDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgRk1MX0VYUFJFU1NJT05fQ0hBUkFDVEVSX0hfCisjZGVmaW5lIEZNTF9FWFBSRVNTSU9OX0NIQVJBQ1RFUl9IXworCisjaW5jbHVkZSA8Zm1sL2J1aWx0aW4vQnVpbHRpbkZvcm0uaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKK2NsYXNzIENoYXJhY3RlciA6CisJCXB1YmxpYyBCdWlsdGluRm9ybSwKKwkJcHVibGljIEdlbmVyaWNCdWlsdGluVmFsdWU8IGNoYXIgLCBDaGFyYWN0ZXIgPgoreworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIENoYXJhY3RlciApCisKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwljaGFyIG1RdW90ZUNoYXI7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUNoYXJhY3RlcihjaGFyIGFWYWx1ZSwgY2hhciBhUXVvdGUgPSAnXCcnKQorCTogQnVpbHRpbkZvcm0oIENMQVNTX0tJTkRfVCggQ2hhcmFjdGVyICkgKSwKKwlHZW5lcmljQnVpbHRpblZhbHVlKCBhVmFsdWUgKSwKKwltUXVvdGVDaGFyKCBhUXVvdGUgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJQ2hhcmFjdGVyKGNvbnN0IENoYXJhY3RlciAmIGFDaGFyYWN0ZXIpCisJOiBCdWlsdGluRm9ybSggYUNoYXJhY3RlciApLAorCUdlbmVyaWNCdWlsdGluVmFsdWUoIGFDaGFyYWN0ZXIgKSwKKwltUXVvdGVDaGFyKCBhQ2hhcmFjdGVyLm1RdW90ZUNoYXIgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+Q2hhcmFjdGVyKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogU2VyaWFsaXphdGlvbgorCSAqLworCWlubGluZSB2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJb3MgPDwgVEFCIDw8IG1RdW90ZUNoYXIgPDwgbVZhbHVlIDw8IG1RdW90ZUNoYXI7CisJCUFWTV9ERUJVR19SRUZfQ09VTlRFUihvcyk7CisJCW9zIDw8IEVPTF9GTFVTSDsKKwl9CisKKwl2aXJ0dWFsIHN0ZDo6c3RyaW5nIHN0cigpIGNvbnN0CisJeworCQlyZXR1cm4oIE9TUygpIDw8IG1RdW90ZUNoYXIgPDwgbVZhbHVlIDw8IG1RdW90ZUNoYXIgKTsKKwl9CisKKwlzdGQ6OnN0cmluZyBzdHJDaGFyKGNoYXIgYVF1b3RlID0gJ1wnJykgY29uc3QKKwl7CisJCXJldHVybiggT1NTKCkgPDwgYVF1b3RlIDw8IG1WYWx1ZSA8PCBhUXVvdGUgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBzdGQ6OnN0cmluZyBzdHJOdW0oCisJCQlhdm1fdWludDhfdCBwcmVjaXNpb24gPSBBVk1fTVVNRVJJQ19QUkVDSVNJT04pIGNvbnN0CisJeworCQlyZXR1cm4oIE9TUygpIDw8IG1RdW90ZUNoYXIgPDwgbVZhbHVlIDw8IG1RdW90ZUNoYXIgKTsKKwl9CisKK307CisKKworfQorCisjZW5kaWYgLypGTUxfRVhQUkVTU0lPTl9DSEFSQUNURVJfSF8qLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2J1aWx0aW4vSWRlbnRpZmllci5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvYnVpbHRpbi9JZGVudGlmaWVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzkwNTM3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2J1aWx0aW4vSWRlbnRpZmllci5jcHAKQEAgLTAsMCArMSwxOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgIklkZW50aWZpZXIuaCIKKworbmFtZXNwYWNlIHNlcAoreworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvYnVpbHRpbi9JZGVudGlmaWVyLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvYnVpbHRpbi9JZGVudGlmaWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ0YzQyOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9idWlsdGluL0lkZW50aWZpZXIuaApAQCAtMCwwICsxLDkxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIEZNTF9FWFBSRVNTSU9OX0lERU5USUZJRVJfSF8KKyNkZWZpbmUgRk1MX0VYUFJFU1NJT05fSURFTlRJRklFUl9IXworCisjaW5jbHVkZSA8Zm1sL2J1aWx0aW4vQnVpbHRpbkZvcm0uaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKK2NsYXNzIElkZW50aWZpZXIgOgorCQlwdWJsaWMgQnVpbHRpbkZvcm0sCisJCXB1YmxpYyBHZW5lcmljQnVpbHRpblZhbHVlU3RyaW5nPCBJZGVudGlmaWVyID4sCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggSWRlbnRpZmllciApCit7CisKKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggSWRlbnRpZmllciApCisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUlkZW50aWZpZXIoY29uc3Qgc3RkOjpzdHJpbmcgJiBhVmFsdWUpCisJOiBCdWlsdGluRm9ybSggQ0xBU1NfS0lORF9UKCBJZGVudGlmaWVyICkgKSwKKwlHZW5lcmljQnVpbHRpblZhbHVlU3RyaW5nKCBhVmFsdWUgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJSWRlbnRpZmllcihjb25zdCBJZGVudGlmaWVyICYgYW5JZGVudGlmaWVyKQorCTogQnVpbHRpbkZvcm0oIGFuSWRlbnRpZmllciApLAorCUdlbmVyaWNCdWlsdGluVmFsdWVTdHJpbmcoIGFuSWRlbnRpZmllciApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5JZGVudGlmaWVyKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogU2VyaWFsaXphdGlvbgorCSAqLworCXZpcnR1YWwgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCW9zIDw8IFRBQiA8PCBtVmFsdWU7CisJCUFWTV9ERUJVR19SRUZfQ09VTlRFUihvcyk7CisJCW9zIDw8IEVPTF9GTFVTSDsKKwl9CisKKwl2aXJ0dWFsIHN0ZDo6c3RyaW5nIHN0cigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1WYWx1ZSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHN0ck51bSgKKwkJCWF2bV91aW50OF90IHByZWNpc2lvbiA9IEFWTV9NVU1FUklDX1BSRUNJU0lPTikgY29uc3QKKwl7CisJCXJldHVybiggbVZhbHVlICk7CisJfQorCisKKworfTsKKworfQorCisjZW5kaWYgLypGTUxfRVhQUkVTU0lPTl9JREVOVElGSUVSX0hfKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9idWlsdGluL1F1YWxpZmllZElkZW50aWZpZXIuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2J1aWx0aW4vUXVhbGlmaWVkSWRlbnRpZmllci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg0OWY3ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9idWlsdGluL1F1YWxpZmllZElkZW50aWZpZXIuY3BwCkBAIC0wLDAgKzEsMjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJRdWFsaWZpZWRJZGVudGlmaWVyLmgiCisKKworbmFtZXNwYWNlIHNlcAoreworCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9idWlsdGluL1F1YWxpZmllZElkZW50aWZpZXIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9idWlsdGluL1F1YWxpZmllZElkZW50aWZpZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDg5OGZjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2J1aWx0aW4vUXVhbGlmaWVkSWRlbnRpZmllci5oCkBAIC0wLDAgKzEsMTc4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIEZNTF9FWFBSRVNTSU9OX1VGSV9IXworI2RlZmluZSBGTUxfRVhQUkVTU0lPTl9VRklfSF8KKworI2luY2x1ZGUgPGZtbC9idWlsdGluL0J1aWx0aW5Gb3JtLmg+CisKKyNpbmNsdWRlIDxjb21tb24vTmFtZWRFbGVtZW50Lmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIFF1YWxpZmllZElkZW50aWZpZXIgOgorCQlwdWJsaWMgQnVpbHRpbkZvcm0sCisJCXB1YmxpYyBHZW5lcmljQnVpbHRpblZhbHVlU3RyaW5nPCBRdWFsaWZpZWRJZGVudGlmaWVyID4sCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggUXVhbGlmaWVkSWRlbnRpZmllciApCit7CisKKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggUXVhbGlmaWVkSWRlbnRpZmllciApCisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBBVFRSSUJVVEUKKwkgKi8KKwlib29sIG1Qb3NpdGlvbmFsUGFyYW1ldGVyRmxhZzsKKworCWF2bV9vZmZzZXRfdCBtUG9zaXRpb25PZmZzZXQ7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCVF1YWxpZmllZElkZW50aWZpZXIoY29uc3Qgc3RkOjpzdHJpbmcgJiBhVmFsdWUpCisJOiBCdWlsdGluRm9ybSggQ0xBU1NfS0lORF9UKCBRdWFsaWZpZWRJZGVudGlmaWVyICkgKSwKKwlHZW5lcmljQnVpbHRpblZhbHVlU3RyaW5nKCBhVmFsdWUgKSwKKwltUG9zaXRpb25hbFBhcmFtZXRlckZsYWcoIGZhbHNlICksCisJbVBvc2l0aW9uT2Zmc2V0KCAwICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCVF1YWxpZmllZElkZW50aWZpZXIoY29uc3Qgc3RkOjpzdHJpbmcgJiBhVmFsdWUsIGF2bV9vZmZzZXRfdCBhUG9zaXRpb25PZmZzZXQpCisJOiBCdWlsdGluRm9ybSggQ0xBU1NfS0lORF9UKCBRdWFsaWZpZWRJZGVudGlmaWVyICkgKSwKKwlHZW5lcmljQnVpbHRpblZhbHVlU3RyaW5nKCBhVmFsdWUgKSwKKwltUG9zaXRpb25hbFBhcmFtZXRlckZsYWcoIHRydWUgKSwKKwltUG9zaXRpb25PZmZzZXQoIGFQb3NpdGlvbk9mZnNldCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIENvcHkKKwkgKi8KKwlRdWFsaWZpZWRJZGVudGlmaWVyKGNvbnN0IFF1YWxpZmllZElkZW50aWZpZXIgJiBhUUlEKQorCTogQnVpbHRpbkZvcm0oIGFRSUQgKSwKKwlHZW5lcmljQnVpbHRpblZhbHVlU3RyaW5nKCBhUUlEICksCisJbVBvc2l0aW9uYWxQYXJhbWV0ZXJGbGFnKCBhUUlELm1Qb3NpdGlvbmFsUGFyYW1ldGVyRmxhZyApLAorCW1Qb3NpdGlvbk9mZnNldCggYVFJRC5tUG9zaXRpb25PZmZzZXQgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+UXVhbGlmaWVkSWRlbnRpZmllcigpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIENPTlZFUlNJT04KKwkgKi8KKwlzdGQ6OnN0cmluZyBnZXRMb2NhdG9yKCkKKwl7CisJCXN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgc2VwUG9zID0gbVZhbHVlLmZpbmQoRlFOX0lEX1JPT1RfU0VQQVJBVE9SKTsKKwkJaWYoIHNlcFBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisJCXsKKwkJCXJldHVybiggbVZhbHVlLnN1YnN0cigwLCBzZXBQb3MpICk7CisJCX0KKwkJcmV0dXJuKCAiIiApOworCX0KKworCWJvb2wgaGFzTG9jYXRvcigpCisJeworCQlyZXR1cm4oIG1WYWx1ZS5maW5kKEZRTl9JRF9ST09UX1NFUEFSQVRPUikgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKTsKKwl9CisKKworCWlubGluZSBzdGQ6OnN0cmluZyBnZXRDb250YWluZXJRdWFsaWZpZWROYW1lSUQoKQorCXsKKwkJcmV0dXJuKCBOYW1lZEVsZW1lbnQ6OmdldENvbnRhaW5lclF1YWxpZmllZE5hbWVJRChtVmFsdWUpICk7CisJfQorCisJaW5saW5lIHN0ZDo6c3RyaW5nIGdldE5hbWVJRCgpCisJeworCQlyZXR1cm4oIE5hbWVkRWxlbWVudDo6ZXh0cmFjdE5hbWVJRChtVmFsdWUpICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtUG9zaXRpb25PZmZzZXQKKwkgKi8KKwlpbmxpbmUgYm9vbCBpc1Bvc2l0aW9uYWxQYXJhbWV0ZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUG9zaXRpb25hbFBhcmFtZXRlckZsYWcgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZVBvc2l0aW9uYWxQYXJhbWV0ZXIoYm9vbCBpc1Bvc2l0aW9uYWxQYXJhbWV0ZXIgPSB0cnVlKQorCXsKKwkJbVBvc2l0aW9uYWxQYXJhbWV0ZXJGbGFnID0gaXNQb3NpdGlvbmFsUGFyYW1ldGVyOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVBvc2l0aW9uT2Zmc2V0CisJICovCisJaW5saW5lIGF2bV9vZmZzZXRfdCBnZXRQb3NpdGlvbk9mZnNldCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Qb3NpdGlvbk9mZnNldCApOworCX0KKworCWlubGluZSB2b2lkIHNlUG9zaXRpb250T2Zmc2V0KGF2bV9vZmZzZXRfdCBhUG9zaXRpb25PZmZzZXQpCisJeworCQltUG9zaXRpb25PZmZzZXQgPSBhUG9zaXRpb25PZmZzZXQ7CisJfQorCisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJaW5saW5lIHZpcnR1YWwgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCW9zIDw8IFRBQiA8PCBtVmFsdWU7CisJCWlmKCBtUG9zaXRpb25hbFBhcmFtZXRlckZsYWcgKQorCQl7CisJCQlvcyA8PCAiLiQiIDw8IG1Qb3NpdGlvbk9mZnNldDsKKwkJfQorCQlBVk1fREVCVUdfUkVGX0NPVU5URVIob3MpOworCQlvcyA8PCBFT0xfRkxVU0g7CisJfQorCisJdmlydHVhbCBzdGQ6OnN0cmluZyBzdHIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVmFsdWUgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBzdGQ6OnN0cmluZyBzdHJOdW0oCisJCQlhdm1fdWludDhfdCBwcmVjaXNpb24gPSBBVk1fTVVNRVJJQ19QUkVDSVNJT04pIGNvbnN0CisJeworCQlyZXR1cm4oIG1WYWx1ZSApOworCX0KKworfTsKKworCit9CisKKyNlbmRpZiAvKkZNTF9FWFBSRVNTSU9OX1VGSV9IXyovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvYnVpbHRpbi9TdHJpbmcuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2J1aWx0aW4vU3RyaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGQ1M2FiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2J1aWx0aW4vU3RyaW5nLmNwcApAQCAtMCwwICsxLDM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiU3RyaW5nLmgiCisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorICogR0xPQkFMUworICovCitjaGFyIFN0cmluZzo6REVGQVVMVF9ERUxJTUlURVIgPSBET1VCTEVfUVVPVEVfREVMSU1JVEVSOworCitib29sIFN0cmluZzo6VVNFX0JBQ0tTTEFTSF9RVU9URSAgPSBmYWxzZTsKKworY29uc3QgY2hhciBTdHJpbmc6OkJBQ0tTTEFTSF9DSEFSID0gJ1xcJzsKKworCisvKioKKyAqIFRoZSBlbXB0eSBzdHJpbmcKKyAqIEVNUFRZCisgKi8KK0JGIFN0cmluZzo6X0VNUFRZXzsKKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvYnVpbHRpbi9TdHJpbmcuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9idWlsdGluL1N0cmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MzljNzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvYnVpbHRpbi9TdHJpbmcuaApAQCAtMCwwICsxLDIxMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBGTUxfRVhQUkVTU0lPTl9TVFJJTkdfSF8KKyNkZWZpbmUgRk1MX0VYUFJFU1NJT05fU1RSSU5HX0hfCisKKyNpbmNsdWRlIDxmbWwvYnVpbHRpbi9CdWlsdGluRm9ybS5oPgorCisjaW5jbHVkZSA8Y29tbW9uL0JGLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBTdHJpbmcgOgorCQlwdWJsaWMgQnVpbHRpbkZvcm0sCisJCXB1YmxpYyBHZW5lcmljQnVpbHRpblZhbHVlU3RyaW5nPCBTdHJpbmcgPgoreworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIFN0cmluZyApCisKKworcHVibGljOgorCS8qKgorCSAqIEdMT0JBTFMKKwkgKi8KKwlzdGF0aWMgY29uc3QgY2hhciBET1VCTEVfUVVPVEVfREVMSU1JVEVSID0gJyInOworCXN0YXRpYyBjb25zdCBjaGFyIFNJTkdMRV9RVU9URV9ERUxJTUlURVIgPSAnXCcnOworCisJc3RhdGljIGNoYXIgREVGQVVMVF9ERUxJTUlURVI7CisKKworCXN0YXRpYyBib29sIFVTRV9CQUNLU0xBU0hfUVVPVEU7CisKKwlzdGF0aWMgY29uc3QgY2hhciBCQUNLU0xBU0hfQ0hBUjsKKworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQVRUUklCVVRFUworCSAqLworCWNoYXIgbVF1b3RlQ2hhcjsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nICYgYVZhbHVlLCBjaGFyIGFRdW90ZSA9IERFRkFVTFRfREVMSU1JVEVSKQorCTogQnVpbHRpbkZvcm0oIENMQVNTX0tJTkRfVCggU3RyaW5nICkgKSwKKwlHZW5lcmljQnVpbHRpblZhbHVlU3RyaW5nKCBhVmFsdWUgKSwKKwltUXVvdGVDaGFyKCBhUXVvdGUgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJU3RyaW5nKGNvbnN0IFN0cmluZyAmIGFTdHJpbmcpCisJOiBCdWlsdGluRm9ybSggYVN0cmluZyApLAorCUdlbmVyaWNCdWlsdGluVmFsdWVTdHJpbmcoIGFTdHJpbmcgKSwKKwltUXVvdGVDaGFyKCBhU3RyaW5nLm1RdW90ZUNoYXIgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgflN0cmluZygpCisJeworCisJfQorCisKKwkvKioKKwkgKiBtUXVvdGVDaGFyCisJICovCisJaW5saW5lIGNoYXIgZ2V0UXVvdGVDaGFyKCkgY29uc3QKKwl7CisJCXJldHVybiBtUXVvdGVDaGFyOworCX0KKworCisJaW5saW5lIGJvb2wgaXNEb3VibGVRdW90ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1RdW90ZUNoYXIgPT0gRE9VQkxFX1FVT1RFX0RFTElNSVRFUiApOworCX0KKworCWlubGluZSBib29sIGlzU2luZ2xlUXVvdGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUXVvdGVDaGFyID09IFNJTkdMRV9RVU9URV9ERUxJTUlURVIgKTsKKwl9CisKKworCWlubGluZSB2b2lkIHNldFF1b3RlQ2hhcihjaGFyIGFRdW90ZUNoYXIpCisJeworCQltUXVvdGVDaGFyID0gYVF1b3RlQ2hhcjsKKwl9CisKKworCS8qKgorCSAqIFRoZSBlbXB0eSBzdHJpbmcKKwkgKiBFTVBUWQorCSAqLworCXN0YXRpYyBCRiBfRU1QVFlfOworCisKKwkvKioKKwkgKiBMT0FERVIgLSBESVNQT1NFUgorCSAqLworCWlubGluZSBzdGF0aWMgdm9pZCBsb2FkKCkKKwl7CisJCV9FTVBUWV8gPSBuZXcgU3RyaW5nKCIiKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIHZvaWQgZGlzcG9zZSgpCisJeworCQlfRU1QVFlfLmRlc3Ryb3koKTsKKwl9CisKKworCS8qKgorCSAqIENSRUFUT1IKKwkgKi8KKwlpbmxpbmUgc3RhdGljIEJGIGNyZWF0ZShjb25zdCBzdGQ6OnN0cmluZyAmIGFWYWx1ZSwKKwkJCWNoYXIgYVF1b3RlID0gREVGQVVMVF9ERUxJTUlURVIpCisJeworCQlyZXR1cm4oIGFWYWx1ZS5lbXB0eSgpID8gX0VNUFRZXyA6CisJCQkJQkYobmV3IFN0cmluZyhhVmFsdWUsIGFRdW90ZSkpICk7CisJfQorCisKKwkvKioKKwkgKiBPcGVyYXRpb24KKwkgKi8KKwlpbmxpbmUgdmlydHVhbCBhdm1fc2l6ZV90IHNpemUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVmFsdWUuc2l6ZSgpICk7CisJfQorCisJLyoqCisJICogU2VyaWFsaXphdGlvbgorCSAqLworCWlubGluZSB2aXJ0dWFsIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQlpZiggbVF1b3RlQ2hhciAhPSAnXDAnICkKKwkJeworCQkJaWYoIFVTRV9CQUNLU0xBU0hfUVVPVEUgKQorCQkJeworCQkJCW9zIDw8IFRBQiA8PCBTdHJpbmc6OkJBQ0tTTEFTSF9DSEFSIDw8IG1RdW90ZUNoYXIKKwkJCQkJCTw8IG1WYWx1ZSA8PCBTdHJpbmc6OkJBQ0tTTEFTSF9DSEFSIDw8IG1RdW90ZUNoYXI7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJb3MgPDwgVEFCIDw8IG1RdW90ZUNoYXIgPDwgbVZhbHVlIDw8IG1RdW90ZUNoYXI7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlvcyA8PCBUQUIgPDwgbVZhbHVlOworCQl9CisJCUFWTV9ERUJVR19SRUZfQ09VTlRFUihvcyk7CisKKwkJb3MgPDwgRU9MX0ZMVVNIOworCX0KKworCWlubGluZSB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHN0cigpIGNvbnN0CisJeworCQlpZiggbVF1b3RlQ2hhciAhPSAnXDAnICkKKwkJeworCQkJaWYoIFVTRV9CQUNLU0xBU0hfUVVPVEUgKQorCQkJeworCQkJCXJldHVybiggT1NTKCkgPDwgU3RyaW5nOjpCQUNLU0xBU0hfQ0hBUiA8PCBtUXVvdGVDaGFyCisJCQkJCQk8PCBtVmFsdWUgPDwgU3RyaW5nOjpCQUNLU0xBU0hfQ0hBUiA8PCBtUXVvdGVDaGFyICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuKCBPU1MoKSA8PCBtUXVvdGVDaGFyIDw8IG1WYWx1ZSA8PCBtUXVvdGVDaGFyICk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4oIG1WYWx1ZSApOworCQl9CisJfQorCisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgc3RyTnVtKAorCQkJYXZtX3VpbnQ4X3QgcHJlY2lzaW9uID0gQVZNX01VTUVSSUNfUFJFQ0lTSU9OKSBjb25zdAorCXsKKwkJcmV0dXJuKCBzdHIoKSApOworCX0KKworfTsKKworCit9CisKKyNlbmRpZiAvKkZNTF9FWFBSRVNTSU9OX1NUUklOR19IXyovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvY29tbW9uL0Jhc2VQb2ludGVyLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9jb21tb24vQmFzZVBvaW50ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwN2YyY2YKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvY29tbW9uL0Jhc2VQb2ludGVyLmNwcApAQCAtMCwwICsxLDIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTQganVpbiAyMDE0CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJCYXNlUG9pbnRlci5oIgorCituYW1lc3BhY2Ugc2VwCit7CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvY29tbW9uL0Jhc2VQb2ludGVyLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvY29tbW9uL0Jhc2VQb2ludGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZlMzBhNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9jb21tb24vQmFzZVBvaW50ZXIuaApAQCAtMCwwICsxLDM0OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDE0IGp1aW4gMjAxNAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEJBU0VQT0lOVEVSX0hfCisjZGVmaW5lIEJBU0VQT0lOVEVSX0hfCisKKyNpbmNsdWRlIDxjb21tb24vQkYuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKK2NsYXNzIE1vZGlmaWVyOworY2xhc3MgT2JqZWN0RWxlbWVudDsKKworCit0ZW1wbGF0ZTwgY2xhc3MgQ2xhc3NUICA+CitjbGFzcyBCYXNlUG9pbnRlciA6CisvLwkJcHVibGljIEF2bVBvaW50ZXI8IENsYXNzVCAsIERlc3Ryb3lFbGVtZW50UG9saWN5ID4sCisJCXB1YmxpYyBCRgorCit7CisKK3ByaXZhdGU6CisJLyoqCisJICogVFlQRURFRgorCSAqLworLy8JdHlwZWRlZiAgQXZtUG9pbnRlcjwgQ2xhc3NUICwgRGVzdHJveUVsZW1lbnRQb2xpY3kgPiAgYmFzZV90aGlzX3R5cGU7CisJdHlwZWRlZiAgQkYgIGJhc2VfdGhpc190eXBlOworCitwcm90ZWN0ZWQ6CisJdHlwZWRlZiAgICAgICBDbGFzc1QgICAgdmFsdWVfdHlwZTsKKworCXR5cGVkZWYgICAgICAgQ2xhc3NUICYgIHJlZmVyZW5jZTsKKwl0eXBlZGVmIGNvbnN0IENsYXNzVCAmICBjb25zdF9yZWZlcmVuY2U7CisKKworCXR5cGVkZWYgICAgICAgQ2xhc3NUICogIHBvaW50ZXI7CisJdHlwZWRlZiBjb25zdCBDbGFzc1QgKiAgY29uc3RfcG9pbnRlcjsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQmFzZVBvaW50ZXIoKQorCTogYmFzZV90aGlzX3R5cGUoICkKKwl7CisJCS8vISEhIE5PVEhJTkcKKwl9CisKKwlleHBsaWNpdCBCYXNlUG9pbnRlcihwb2ludGVyIHB0cikKKwk6IGJhc2VfdGhpc190eXBlKCBwdHIgKQorCXsKKwkJLy8hISEgTk9USElORworCX0KKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCUJhc2VQb2ludGVyKGNvbnN0IEJhc2VQb2ludGVyICYgYVBvaW50ZXIpCisJOiBiYXNlX3RoaXNfdHlwZSggYVBvaW50ZXIgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJZXhwbGljaXQgQmFzZVBvaW50ZXIoY29uc3QgQkYgJiBhUG9pbnRlcikKKwk6IGJhc2VfdGhpc190eXBlKCBhUG9pbnRlciApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+QmFzZVBvaW50ZXIoKQorCXsKKwkJLy8hISEgTk9USElORworCX0KKworCitwcm90ZWN0ZWQ6CisJaW5saW5lIHBvaW50ZXIgcmF3X3BvaW50ZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUFRSICApOworCX0KKworCWlubGluZSBwb2ludGVyIHB0ckJhc2UoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBzdGF0aWNfY2FzdDwgcG9pbnRlciA+KCBtUFRSICkgKTsKKwl9CisKKworcHJvdGVjdGVkOgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBUWVBFIENBU1QKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkvLyBjYXN0IEJGIGFzIHNwZWNpZmllZCBwb2ludGVyCisJdGVtcGxhdGU8IGNsYXNzIFQgPgorCWlubGluZSBUICogYXNfcHRyKCkgY29uc3QKKwl7CisJCS8vIHByZXZpb3VzOj4gQVZNX09TX0FTU0VSVF9XQVJOSU5HX0FMRVJUCisJCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9QT0lOVEVSX0VYSVQoIG1QVFIgKQorCQkJCTw8ICJyYXdfcG9pbnRlciBpbiBCYXNlUG9pbnRlcjo6YXNfcHRyPCBUID4oKSAhISEiCisJCQkJPDwgU0VORF9FWElUOworCisJCXJldHVybiggKG1QVFIgIT0gTlVMTCkgPyBtUFRSLT5hczwgVCA+KCkgOiBOVUxMICk7CisJfQorCisJdGVtcGxhdGU8IGNsYXNzIFQgPgorCWlubGluZSBUICogdG9fcHRyKCkgY29uc3QKKwl7CisJCXJldHVybiggbVBUUi0+dG88IFQgPigpICk7CisJfQorCisKKwkvLyBjYXN0IEJGIGFzIHNwZWNpZmllZCByZWZlcmVuY2UKKwl0ZW1wbGF0ZTwgY2xhc3MgVCA+CisJaW5saW5lIFQgJiBhc19yZWYoKQorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggbVBUUiApCisJCQkJPDwgInJhd19wb2ludGVyIGluIEJhc2VQb2ludGVyOjphc19yZWY8IFQgPigpICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJcmV0dXJuKCAqKCBtUFRSLT5hczwgVCA+KCkgKSApOworCX0KKworCXRlbXBsYXRlPCBjbGFzcyBUID4KKwlpbmxpbmUgY29uc3QgVCAmIGFzX3JlZigpIGNvbnN0CisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBtUFRSICkKKwkJCQk8PCAicmF3X3BvaW50ZXIgaW4gQmFzZVBvaW50ZXI6OmFzX3JlZjwgVCA+KCkgISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQlyZXR1cm4oICooIG1QVFItPmFzPCBUID4oKSApICk7CisJfQorCisKKwkvLyBjYXN0IEJGIGFzIGRlcml2ZWQgQkYKKwl0ZW1wbGF0ZTwgY2xhc3MgVCA+CisJaW5saW5lIFQgJiBhc19iZigpCisJeworCQlyZXR1cm4oIHN0YXRpY19jYXN0PCBUICYgPiggKnRoaXMgKSApOworCX0KKworCXRlbXBsYXRlPCBjbGFzcyBUID4KKwlpbmxpbmUgY29uc3QgVCAmIGFzX2JmKCkgY29uc3QKKwl7CisJCXJldHVybiggc3RhdGljX2Nhc3Q8IGNvbnN0IFQgJiA+KCAqdGhpcyApICk7CisJfQorCisKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIENBU1QKKwkgKi8KKwlpbmxpbmUgb3BlcmF0b3IgcG9pbnRlciAoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBwdHJCYXNlKCkgKTsKKwl9CisKKwkvKioKKwkgKiBPUEVSQVRPUlMKKwkgKi8KKwlpbmxpbmUgcG9pbnRlciBvcGVyYXRvci0+ICgpIGNvbnN0CisJeworCQlyZXR1cm4oIHB0ckJhc2UoKSApOworCX0KKworCitwdWJsaWM6CisJLyoqCisJICogQVNTSUdOTUVOVAorCSAqIEJGCisJICovCisKKwlpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0X3BvaW50ZXIgYVB0cikgY29uc3QKKwl7CisJCXJldHVybiggYmFzZV90aGlzX3R5cGU6Om1QVFIgPT0gYVB0ciApOworCX0KKworCWlubGluZSBib29sIG9wZXJhdG9yPT0ocG9pbnRlciBhUHRyKSBjb25zdAorCXsKKwkJcmV0dXJuKCBiYXNlX3RoaXNfdHlwZTo6bVBUUiA9PSBhUHRyICk7CisJfQorCisJaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBCYXNlUG9pbnRlciAmIG90aGVyKSBjb25zdAorCXsKKwkJcmV0dXJuKCBiYXNlX3RoaXNfdHlwZTo6bVBUUiA9PSBvdGhlci5tUFRSICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0X3BvaW50ZXIgYVB0cikgY29uc3QKKwl7CisJCXJldHVybiggYmFzZV90aGlzX3R5cGU6Om1QVFIgIT0gYVB0ciApOworCX0KKworCWlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgQmFzZVBvaW50ZXIgJiBvdGhlcikgY29uc3QKKwl7CisJCXJldHVybiggYmFzZV90aGlzX3R5cGU6Om1QVFIgIT0gb3RoZXIubVBUUiApOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBCYXNlQ29tcGlsZWRGb3JtCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCS8qKgorCSAqIEdFVFRFUgorCSAqIG1vZGlmaWVyIG9mIGEgVVNFUiBGT1JNCisJICovCisJaW5saW5lIHZpcnR1YWwgY29uc3QgTW9kaWZpZXIgJiBnZXRNb2RpZmllcigpIGNvbnN0CisJeworCQlyZXR1cm4oIHB0ckJhc2UoKS0+Z2V0TW9kaWZpZXIoKSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIE1vZGlmaWVyICYgZ2V0d01vZGlmaWVyKCkKKwl7CisJCXJldHVybiggcHRyQmFzZSgpLT5nZXR3TW9kaWZpZXIoKSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogdGhlQ29tcGlsZWRGb3JtCisJICovCisJaW5saW5lIGNvbnN0IE9iamVjdEVsZW1lbnQgKiBnZXRBc3RFbGVtZW50KCkgY29uc3QKKwl7CisJCXJldHVybiggcHRyQmFzZSgpLT5nZXRBc3RFbGVtZW50KCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc0FzdEVsZW1lbnQoY29uc3QgT2JqZWN0RWxlbWVudCAqIGFzdEVsZW1lbnQpIGNvbnN0CisJeworCQlyZXR1cm4oIHB0ckJhc2UoKS0+aXNBc3RFbGVtZW50KCBhc3RFbGVtZW50ICkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNBc3RFbGVtZW50KCkgY29uc3QKKwl7CisJCXJldHVybiggcHRyQmFzZSgpLT5oYXNBc3RFbGVtZW50KCkgKTsKKwl9CisKKwlpbmxpbmUgc3RkOjpzdHJpbmcgZ2V0QXN0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBwdHJCYXNlKCktPmdldEFzdEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgKTsKKwl9CisKKwlpbmxpbmUgc3RkOjpzdHJpbmcgZ2V0QXN0TmFtZUlEKCkgY29uc3QKKwl7CisJCXJldHVybiggcHRyQmFzZSgpLT5nZXRBc3ROYW1lSUQoKSApOworCX0KKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1GdWxseVF1YWxpZmllZE5hbWVJRAorCSAqLworCWlubGluZSBzdGQ6OnN0cmluZyBnZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHB0ckJhc2UoKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSApOworCX0KKworCWlubGluZSBib29sIGhhc0Z1bGx5UXVhbGlmaWVkTmFtZUlEKCkgY29uc3QKKwl7CisJCXJldHVybiggcHRyQmFzZSgpLT5oYXNGdWxseVF1YWxpZmllZE5hbWVJRCgpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoY29uc3Qgc3RkOjpzdHJpbmcgJiBhRlFOX0lEKQorCXsKKwkJcHRyQmFzZSgpLT5zZXRGdWxseVF1YWxpZmllZE5hbWVJRCggYUZRTl9JRCApOworCX0KKworCWlubGluZSB2b2lkIHVwZGF0ZUZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKwl7CisJCXB0ckJhc2UoKS0+dXBkYXRlRnVsbHlRdWFsaWZpZWROYW1lSUQoKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBmcW5FcXVhbHMoY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQsCisJCQlib29sIGVuYWJsZWRPbmx5TG9jYXRpb25Db21wYXJpc29uRWxzZSA9IGZhbHNlKSBjb25zdAorCXsKKwkJcmV0dXJuKCBwdHJCYXNlKCktPmZxbkVxdWFscyhhRnVsbHlRdWFsaWZpZWROYW1lSUQsCisJCQkJZW5hYmxlZE9ubHlMb2NhdGlvbkNvbXBhcmlzb25FbHNlKSApOworCX0KKworCWlubGluZSBib29sIGZxbkVuZHNXaXRoKGNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkgY29uc3QKKwl7CisJCXJldHVybiggcHRyQmFzZSgpLT5mcW5FbmRzV2l0aChhUXVhbGlmaWVkTmFtZUlEKSApOworCX0KKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIHRoZUlkCisJICovCisJaW5saW5lIHN0ZDo6c3RyaW5nIGdldE5hbWVJRCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHB0ckJhc2UoKS0+Z2V0TmFtZUlEKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNOYW1lSUQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBwdHJCYXNlKCktPmhhc05hbWVJRCgpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0TmFtZUlEKGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkKKwl7CisJCXB0ckJhc2UoKS0+c2V0TmFtZUlEKCBhTmFtZUlEICk7CisJfQorCisJdm9pZCB1cGRhdGVOYW1lSUQoKQorCXsKKwkJcHRyQmFzZSgpLT51cGRhdGVOYW1lSUQoKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRBbGxOYW1lSUQoY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpCisJeworCQlwdHJCYXNlKCktPnNldEFsbE5hbWVJRCggYUZ1bGx5UXVhbGlmaWVkTmFtZUlEICwgYU5hbWVJRCApOworCX0KKworCWlubGluZSB2b2lkIHNldEFsbE5hbWVJRChjb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBuYW1lKQorCXsKKwkJcHRyQmFzZSgpLT5zZXRBbGxOYW1lSUQoIGFGdWxseVF1YWxpZmllZE5hbWVJRCAsIGFOYW1lSUQgLCBuYW1lICk7CisJfQorCit9OworCisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKiBCQVNFUE9JTlRFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2NvbW1vbi9CZWhhdmlvcmFsRWxlbWVudC5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvY29tbW9uL0JlaGF2aW9yYWxFbGVtZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzQzM2ZkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2NvbW1vbi9CZWhhdmlvcmFsRWxlbWVudC5jcHAKQEAgLTAsMCArMSwyNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDIxIGbDqXZyLiAyMDE3CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgSW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJCZWhhdmlvcmFsRWxlbWVudC5oIgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2NvbW1vbi9CZWhhdmlvcmFsRWxlbWVudC5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2NvbW1vbi9CZWhhdmlvcmFsRWxlbWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZDViNTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvY29tbW9uL0JlaGF2aW9yYWxFbGVtZW50LmgKQEAgLTAsMCArMSw4OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDIxIGbDqXZyLiAyMDE3CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgSW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRk1MX0NPTU1PTl9CRUhBVklPUkFMX0VMRU1FTlRfSF8KKyNkZWZpbmUgRk1MX0NPTU1PTl9CRUhBVklPUkFMX0VMRU1FTlRfSF8KKworI2luY2x1ZGUgPGZtbC9jb21tb24vT2JqZWN0RWxlbWVudC5oPgorCisjaW5jbHVkZSA8YmFzZS9DbGFzc0tpbmRJbmZvLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIEJlaGF2aW9yYWxFbGVtZW50IDoKKwkJcHVibGljIE9iamVjdEVsZW1lbnQsCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggQmVoYXZpb3JhbEVsZW1lbnQgKQoreworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQmVoYXZpb3JhbEVsZW1lbnQoY2xhc3Nfa2luZF90IGFDbGFzc0tpbmQsIEJlaGF2aW9yYWxFbGVtZW50ICogYUNvbnRhaW5lcikKKwk6IE9iamVjdEVsZW1lbnQoIGFDbGFzc0tpbmQgLCBhQ29udGFpbmVyICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCUJlaGF2aW9yYWxFbGVtZW50KGNsYXNzX2tpbmRfdCBhQ2xhc3NLaW5kLCBCZWhhdmlvcmFsRWxlbWVudCAqIGFDb250YWluZXIsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYW5VbnJlc3RyaWN0ZWROYW1lKQorCTogT2JqZWN0RWxlbWVudCggYUNsYXNzS2luZCAsIGFDb250YWluZXIgLCBhRnVsbHlRdWFsaWZpZWROYW1lSUQsCisJCQlhTmFtZUlEICwgYW5VbnJlc3RyaWN0ZWROYW1lKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJQmVoYXZpb3JhbEVsZW1lbnQoY2xhc3Nfa2luZF90IGFDbGFzc0tpbmQsCisJCQlPYmplY3RFbGVtZW50ICogYUNvbnRhaW5lciwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKQorCTogT2JqZWN0RWxlbWVudCggYUNsYXNzS2luZCAsIGFDb250YWluZXIgLCBhTmFtZUlEICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCUJlaGF2aW9yYWxFbGVtZW50KGNsYXNzX2tpbmRfdCBhQ2xhc3NLaW5kLCBCZWhhdmlvcmFsRWxlbWVudCAqIGFDb250YWluZXIsCisJCQljb25zdCBNb2RpZmllciAmIGFNb2RpZmllciwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKQorCTogT2JqZWN0RWxlbWVudCggYUNsYXNzS2luZCAsIGFDb250YWluZXIgLCBhTW9kaWZpZXIgLCBhTmFtZUlEICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCUJlaGF2aW9yYWxFbGVtZW50KGNsYXNzX2tpbmRfdCBhQ2xhc3NLaW5kLAorCQkJQmVoYXZpb3JhbEVsZW1lbnQgKiBhQ29udGFpbmVyLCBjb25zdCBCZWhhdmlvcmFsRWxlbWVudCAmIGFQYXR0ZXJuKQorCTogT2JqZWN0RWxlbWVudCggYUNsYXNzS2luZCAsIGFDb250YWluZXIgLCBhUGF0dGVybiApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5CZWhhdmlvcmFsRWxlbWVudCgpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKK307CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKiBGTUxfQ09NTU9OX0JFSEFWSU9SQUxfRUxFTUVOVF9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2NvbW1vbi9Db21waWxlZEVsZW1lbnQuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2NvbW1vbi9Db21waWxlZEVsZW1lbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZmZlZTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvY29tbW9uL0NvbXBpbGVkRWxlbWVudC5jcHAKQEAgLTAsMCArMSwyMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDIwIG1hcnMgMjAxNgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQ29tcGlsZWRFbGVtZW50LmgiCisKKworbmFtZXNwYWNlIHNlcAoreworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2NvbW1vbi9Db21waWxlZEVsZW1lbnQuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9jb21tb24vQ29tcGlsZWRFbGVtZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJhZWE2NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9jb21tb24vQ29tcGlsZWRFbGVtZW50LmgKQEAgLTAsMCArMSwxMTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyMCBtYXJzIDIwMTYKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBGTUxfQ09NTU9OX0NPTVBJTEVERUxFTUVOVF9IXworI2RlZmluZSBGTUxfQ09NTU9OX0NPTVBJTEVERUxFTUVOVF9IXworCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjbGFzcyBDb21waWxlZEVsZW1lbnQKK3sKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlib29sIG1Db21waWxlZEZsYWc7CisKKwlib29sIG1PcHRpbWl6ZWRGbGFnOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlDb21waWxlZEVsZW1lbnQoKQorCTogbUNvbXBpbGVkRmxhZyggZmFsc2UgKSwKKwltT3B0aW1pemVkRmxhZyggZmFsc2UgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJQ29tcGlsZWRFbGVtZW50KGNvbnN0IENvbXBpbGVkRWxlbWVudCAmIGFuRWxlbWVudCkKKwk6IG1Db21waWxlZEZsYWcoIGFuRWxlbWVudC5tQ29tcGlsZWRGbGFnICksCisJbU9wdGltaXplZEZsYWcoIGFuRWxlbWVudC5tT3B0aW1pemVkRmxhZyApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+Q29tcGlsZWRFbGVtZW50KCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUNvbXBpbGVkRmxhZworCSAqLworCWlubGluZSBib29sIGlzQ29tcGlsZWQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQ29tcGlsZWRGbGFnICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0Q29tcGlsZWQoYm9vbCBpc0NvbXBpbGVkID0gdHJ1ZSkKKwl7CisJCW1Db21waWxlZEZsYWcgPSBpc0NvbXBpbGVkOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbU9wdGltaXplZEZsYWcKKwkgKi8KKwlpbmxpbmUgYm9vbCBpc09wdGltaXplZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1PcHRpbWl6ZWRGbGFnICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0T3B0aW1pemVkKGJvb2wgaXNPcHRpbWl6ZWQgPSB0cnVlKQorCXsKKwkJbU9wdGltaXplZEZsYWcgPSBpc09wdGltaXplZDsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtQ29tcGlsZWRGbGFnCisJICogbU9wdGltaXplZEZsYWcKKwkgKi8KKwlpbmxpbmUgdm9pZCBzZXRDb21waWxlZE9wdGltaXplZChib29sIGlzQ29tcGlsZWQsIGJvb2wgaXNPcHRpbWl6ZWQpCisJeworCQlzZXRDb21waWxlZCggaXNDb21waWxlZCApOworCisJCXNldE9wdGltaXplZCggaXNPcHRpbWl6ZWQgKTsKKwl9CisKKworfTsKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qIEZNTF9DT01NT05fQ09NUElMRURFTEVNRU5UX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvY29tbW9uL0xvY2F0aW9uRWxlbWVudC5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvY29tbW9uL0xvY2F0aW9uRWxlbWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQxMzk5ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9jb21tb24vTG9jYXRpb25FbGVtZW50LmNwcApAQCAtMCwwICsxLDI1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTggc2VwdC4gMjAwOAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTG9jYXRpb25FbGVtZW50LmgiCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitzdGQ6OnN0cmluZyBMb2NhdGlvbkVsZW1lbnQ6Om1MYXN0UmVwb3J0RmlsZUxvY2F0aW9uID0gIiI7CisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2NvbW1vbi9Mb2NhdGlvbkVsZW1lbnQuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9jb21tb24vTG9jYXRpb25FbGVtZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA1M2JiYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9jb21tb24vTG9jYXRpb25FbGVtZW50LmgKQEAgLTAsMCArMSw0MDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxOCBzZXB0LiAyMDA4CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgTE9DQVRJT05FTEVNRU5UX0hfCisjZGVmaW5lIExPQ0FUSU9ORUxFTUVOVF9IXworCisjaW5jbHVkZSA8cHJpbnRlci9PdXRTdHJlYW0uaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworY2xhc3MgTG9jYXRpb25FbGVtZW50Cit7CisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBBVFRSSUJVVEVTCisJICovCisJc3RhdGljIHN0ZDo6c3RyaW5nIG1MYXN0UmVwb3J0RmlsZUxvY2F0aW9uOworCisJc3RkOjpzdHJpbmcgbUZpbGVMb2NhdGlvbjsKKworCXN0ZDo6c2l6ZV90IG1CZWdpbkxpbmU7CisKKwlzdGQ6OnNpemVfdCBtRW5kTGluZTsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJTG9jYXRpb25FbGVtZW50KCkKKwk6IG1GaWxlTG9jYXRpb24oICksCisJbUJlZ2luTGluZSggMCApLAorCW1FbmRMaW5lKCAwICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCUxvY2F0aW9uRWxlbWVudChjb25zdCBMb2NhdGlvbkVsZW1lbnQgJiBhbkVsZW1lbnQpCisJOiBtRmlsZUxvY2F0aW9uKCBhbkVsZW1lbnQubUZpbGVMb2NhdGlvbiApLAorCW1CZWdpbkxpbmUoIGFuRWxlbWVudC5tQmVnaW5MaW5lICksCisJbUVuZExpbmUoIGFuRWxlbWVudC5tRW5kTGluZSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogT3RoZXIKKwkgKi8KKwlMb2NhdGlvbkVsZW1lbnQoY29uc3Qgc3RkOjpzdHJpbmcgJiBhRmlsZUxvY2F0aW9uLAorCQkJY29uc3Qgc3RkOjpzaXplX3QgYUJlZ2luTGluZSwgY29uc3Qgc3RkOjpzaXplX3QgYW5FbmRMaW5lKQorCTogbUZpbGVMb2NhdGlvbiggYUZpbGVMb2NhdGlvbiApLAorCW1CZWdpbkxpbmUoIGFCZWdpbkxpbmUgKSwKKwltRW5kTGluZSggYW5FbmRMaW5lICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCUxvY2F0aW9uRWxlbWVudChjb25zdCBzdGQ6OnN0cmluZyAmIGFGaWxlTG9jYXRpb24sIGNvbnN0IHN0ZDo6c2l6ZV90IGFMaW5lKQorCTogbUZpbGVMb2NhdGlvbiggYUZpbGVMb2NhdGlvbiApLAorCW1CZWdpbkxpbmUoIGFMaW5lICksCisJbUVuZExpbmUoIGFMaW5lICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCUxvY2F0aW9uRWxlbWVudChjb25zdCBzdGQ6OnNpemVfdCBhQmVnaW5MaW5lLCBjb25zdCBzdGQ6OnNpemVfdCBhbkVuZExpbmUpCisJOiBtRmlsZUxvY2F0aW9uKCApLAorCW1CZWdpbkxpbmUoIGFCZWdpbkxpbmUgKSwKKwltRW5kTGluZSggYW5FbmRMaW5lICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCUxvY2F0aW9uRWxlbWVudChjb25zdCBzdGQ6OnNpemVfdCBhTGluZSkKKwk6IG1GaWxlTG9jYXRpb24oICksCisJbUJlZ2luTGluZSggYUxpbmUgKSwKKwltRW5kTGluZSggYUxpbmUgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkxvY2F0aW9uRWxlbWVudCgpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1GaWxlTG9jYXRpb24KKwkgKi8KKwlpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcgJiBnZXRGaWxlTG9jYXRpb24oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRmlsZUxvY2F0aW9uICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzRmlsZUxvY2F0aW9uKCkgY29uc3QKKwl7CisJCXJldHVybiggISAobUZpbGVMb2NhdGlvbi5lbXB0eSgpKSApOworCX0KKworCWlubGluZSB2b2lkIHNldEZpbGVMb2NhdGlvbihjb25zdCBzdGQ6OnN0cmluZyAmIGFGaWxlTG9jYXRpb24pCisJeworCQltRmlsZUxvY2F0aW9uID0gYUZpbGVMb2NhdGlvbjsKKwl9CisKKworCWlubGluZSBPdXRTdHJlYW0gJiByZXBvcnRGaWxlTG9jYXRpb24oT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworLy8JICAgIGlmKCBtRmlsZUxvY2F0aW9uICE9IG1MYXN0UmVwb3J0RmlsZUxvY2F0aW9uICkKKy8vCSAgICB7CisvLwkJCW9zIDw8IG1GaWxlTG9jYXRpb24gc3RkOjplbmRsOworLy8KKy8vCQkJbUxhc3RSZXBvcnRGaWxlTG9jYXRpb24gPSBtRmlsZUxvY2F0aW9uOworLy8JICAgIH0KKworCQlvcyA8PCBtRmlsZUxvY2F0aW9uIDw8ICI6IjsKKworCQlyZXR1cm4oIG9zICk7CisJfQorCisJaW5saW5lIFBhaXJPdXRTdHJlYW0gJiByZXBvcnRGaWxlTG9jYXRpb24oUGFpck91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKy8vCSAgICBpZiggbUZpbGVMb2NhdGlvbiAhPSBtTGFzdFJlcG9ydEZpbGVMb2NhdGlvbiApCisvLwkgICAgeworLy8JCQlvcyA8PCBtRmlsZUxvY2F0aW9uIHN0ZDo6ZW5kbDsKKy8vCisvLwkJCW1MYXN0UmVwb3J0RmlsZUxvY2F0aW9uID0gbUZpbGVMb2NhdGlvbjsKKy8vCSAgICB9CisKKwkJb3MgPDwgbUZpbGVMb2NhdGlvbiA8PCAiOiI7CisKKwkJcmV0dXJuKCBvcyApOworCX0KKworCWlubGluZSBUcmlwbGVPdXRTdHJlYW0gJiByZXBvcnRGaWxlTG9jYXRpb24oVHJpcGxlT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworLy8JCWlmKCBtRmlsZUxvY2F0aW9uICE9IG1MYXN0UmVwb3J0RmlsZUxvY2F0aW9uICkKKy8vCQl7CisvLwkJCW9zIDw8IG1GaWxlTG9jYXRpb24gc3RkOjplbmRsOworLy8KKy8vCQkJbUxhc3RSZXBvcnRGaWxlTG9jYXRpb24gPSBtRmlsZUxvY2F0aW9uOworLy8JCX0KKworCQlvcyA8PCBtRmlsZUxvY2F0aW9uIDw8ICI6IjsKKworCQlyZXR1cm4oIG9zICk7CisJfQorCisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1CZWdpbkxpbmUKKwkgKi8KKwlpbmxpbmUgc3RkOjpzaXplX3QgZ2V0QmVnaW5MaW5lKCkgY29uc3QKKwl7CisJCXJldHVybiggbUJlZ2luTGluZSApOworCX0KKworCWlubGluZSBib29sIGhhc0JlZ2luTGluZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1CZWdpbkxpbmUgPiAwICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0QmVnaW5MaW5lKGNvbnN0IHN0ZDo6c2l6ZV90IGFCZWdpbkxpbmUpCisJeworCQltQmVnaW5MaW5lID0gYUJlZ2luTGluZTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1FbmRMaW5lCisJICovCisJaW5saW5lIHN0ZDo6c2l6ZV90IGdldEVuZExpbmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRW5kTGluZSApOworCX0KKworCWlubGluZSBib29sIGhhc0VuZExpbmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRW5kTGluZSA+IDAgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRFbmRMaW5lKGNvbnN0IHN0ZDo6c2l6ZV90IGFuRW5kTGluZSkKKwl7CisJCW1FbmRMaW5lID0gYW5FbmRMaW5lOworCX0KKworCisJLyoqCisJICogU0VUVEVSCisJICogbUZpbGVMb2NhdGlvbgorCSAqIG1CZWdpbkxpbmUKKwkgKiBtRW5kTGluZQorCSAqLworCWlubGluZSB2b2lkIHNldExvY2F0aW9uKGNvbnN0IExvY2F0aW9uRWxlbWVudCAmIGFuRWxlbWVudCkKKwl7CisJCW1GaWxlTG9jYXRpb24gPSBhbkVsZW1lbnQubUZpbGVMb2NhdGlvbjsKKworCQltQmVnaW5MaW5lID0gYW5FbGVtZW50Lm1CZWdpbkxpbmU7CisJCW1FbmRMaW5lICAgPSBhbkVsZW1lbnQubUVuZExpbmU7CisJfQorCisJaW5saW5lIHZvaWQgc2V0TG9jYXRpb24oY29uc3Qgc3RkOjpzdHJpbmcgJiBhRmlsZUxvY2F0aW9uLAorCQkJY29uc3Qgc3RkOjpzaXplX3QgYUJlZ2luTGluZSwgY29uc3Qgc3RkOjpzaXplX3QgYW5FbmRMaW5lKQorCXsKKwkJbUZpbGVMb2NhdGlvbiA9IGFGaWxlTG9jYXRpb247CisKKwkJbUJlZ2luTGluZSA9IGFCZWdpbkxpbmU7CisJCW1FbmRMaW5lICAgPSBhbkVuZExpbmU7CisJfQorCisJaW5saW5lIHZvaWQgc2V0TG9jYXRpb24oY29uc3Qgc3RkOjpzdHJpbmcgJiBhRmlsZUxvY2F0aW9uLAorCQkJY29uc3Qgc3RkOjpzaXplX3QgYUxpbmUpCisJeworCQltRmlsZUxvY2F0aW9uID0gYUZpbGVMb2NhdGlvbjsKKworCQltRW5kTGluZSA9IG1CZWdpbkxpbmUgPSBhTGluZTsKKwl9CisKKworCWlubGluZSB2b2lkIHNldExpbmUoY29uc3Qgc3RkOjpzaXplX3QgYUJlZ2luTGluZSwgY29uc3Qgc3RkOjpzaXplX3QgYW5FbmRMaW5lKQorCXsKKwkJbUJlZ2luTGluZSA9IGFCZWdpbkxpbmU7CisJCW1FbmRMaW5lICAgPSBhbkVuZExpbmU7CisJfQorCisJaW5saW5lIHZvaWQgc2V0TGluZShjb25zdCBzdGQ6OnNpemVfdCBhTGluZSkKKwl7CisJCW1FbmRMaW5lID0gbUJlZ2luTGluZSA9IGFMaW5lOworCX0KKworCisJLyoqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFNFUklBTElaQVRJT04KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJaW5saW5lIHN0ZDo6c3RyaW5nIHN0ckxpbmUoKSBjb25zdAorCXsKKwkJc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKworCQlpZiggbUJlZ2luTGluZSAhPSBtRW5kTGluZSApCisJCXsKKwkJCW9zcyA8PCAvKiJsaW5lICIgPDwqLyBtQmVnaW5MaW5lIDw8ICIgLT4gIiA8PCBtRW5kTGluZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW9zcyA8PCAvKiJsaW5lICIgPDwqLyBtQmVnaW5MaW5lOworCQl9CisKKwkJcmV0dXJuKCBvc3Muc3RyKCkgKTsKKwl9CisKKworCWlubGluZSBzdGQ6OnN0cmluZyB0cmFjZUxpbmUoCisJCQljb25zdCBzdGQ6OnN0cmluZyB0YWIsIGJvb2wgc2luZ2xlTGluZUNvbW1lbnQgPSB0cnVlKSBjb25zdAorCXsKKwkJc3RkOjpvc3RyaW5nc3RyZWFtIG9zcyh0YWIpOworCisJCWlmKCBzaW5nbGVMaW5lQ29tbWVudCApCisJCXsKKwkJCW9zcyA8PCAiLy8gIiA8PCBzdHJMaW5lKCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlvc3MgPDwgIi8qIiA8PCBzdHJMaW5lKCkgPDwgIiovIjsKKwkJfQorCisJCXJldHVybiggb3NzLnN0cigpICk7CisJfQorCisKKwlpbmxpbmUgc3RkOjpzdHJpbmcgZmF0YWxFcnJvckxvY2F0aW9uKCkgY29uc3QKKwl7CisJCVN0cmluZ091dFN0cmVhbSBvc3M7CisKKwkJZmF0YWxFcnJvckxvY2F0aW9uKG9zcyk7CisKKwkJcmV0dXJuKCBvc3Muc3RyKCkgKTsKKwl9CisKKwlpbmxpbmUgT3V0U3RyZWFtICYgZmF0YWxFcnJvckxvY2F0aW9uKE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJcmVwb3J0RmlsZUxvY2F0aW9uKG9zKQorCQkJCTw8IHN0ckxpbmUoKSA8PCBFT0xfVEFCIDw8ICJGYXRhbCBlcnJvcjo+ICIgPDwgc3RkOjpmbHVzaDsKKworCQlyZXR1cm4oIG9zICk7CisJfQorCisJaW5saW5lIFBhaXJPdXRTdHJlYW0gJiBmYXRhbEVycm9yTG9jYXRpb24oUGFpck91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJcmVwb3J0RmlsZUxvY2F0aW9uKG9zKQorCQkJCTw8IHN0ckxpbmUoKSA8PCBFT0xfVEFCIDw8ICJGYXRhbCBlcnJvcjo+ICIgPDwgc3RkOjpmbHVzaDsKKworCQlyZXR1cm4oIG9zICk7CisJfQorCisJaW5saW5lIFRyaXBsZU91dFN0cmVhbSAmIGZhdGFsRXJyb3JMb2NhdGlvbihUcmlwbGVPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCXJlcG9ydEZpbGVMb2NhdGlvbihvcykKKwkJCQk8PCBzdHJMaW5lKCkgPDwgRU9MX1RBQiA8PCAiRmF0YWwgZXJyb3I6PiAiIDw8IHN0ZDo6Zmx1c2g7CisKKwkJcmV0dXJuKCBvcyApOworCX0KKworCisJaW5saW5lIHN0ZDo6c3RyaW5nIGVycm9yTG9jYXRpb24oKSBjb25zdAorCXsKKwkJU3RyaW5nT3V0U3RyZWFtIG9zczsKKworCQllcnJvckxvY2F0aW9uKG9zcyk7CisKKwkJcmV0dXJuKCBvc3Muc3RyKCkgKTsKKwl9CisKKwlpbmxpbmUgT3V0U3RyZWFtICYgZXJyb3JMb2NhdGlvbihPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCXJlcG9ydEZpbGVMb2NhdGlvbihvcykKKwkJCQk8PCBzdHJMaW5lKCkgPDwgRU9MX1RBQiA8PCAiRXJyb3I6PiAiIDw8IHN0ZDo6Zmx1c2g7CisKKwkJcmV0dXJuKCBvcyApOworCX0KKworCWlubGluZSBQYWlyT3V0U3RyZWFtICYgZXJyb3JMb2NhdGlvbihQYWlyT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQlyZXBvcnRGaWxlTG9jYXRpb24ob3MpCisJCQkJPDwgc3RyTGluZSgpIDw8IEVPTF9UQUIgPDwgIkVycm9yOj4gIiA8PCBzdGQ6OmZsdXNoOworCisJCXJldHVybiggb3MgKTsKKwl9CisKKwlpbmxpbmUgVHJpcGxlT3V0U3RyZWFtICYgZXJyb3JMb2NhdGlvbihUcmlwbGVPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCXJlcG9ydEZpbGVMb2NhdGlvbihvcykKKwkJCQk8PCBzdHJMaW5lKCkgPDwgRU9MX1RBQiA8PCAiRXJyb3I6PiAiIDw8IHN0ZDo6Zmx1c2g7CisKKwkJcmV0dXJuKCBvcyApOworCX0KKworCisJaW5saW5lIHN0ZDo6c3RyaW5nIHdhcm5pbmdMb2NhdGlvbigpIGNvbnN0CisJeworCQlTdHJpbmdPdXRTdHJlYW0gb3NzOworCisJCXdhcm5pbmdMb2NhdGlvbihvc3MpOworCisJCXJldHVybiggb3NzLnN0cigpICk7CisJfQorCisJaW5saW5lIE91dFN0cmVhbSAmIHdhcm5pbmdMb2NhdGlvbihPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCXJlcG9ydEZpbGVMb2NhdGlvbihvcykKKwkJCQk8PCBzdHJMaW5lKCkgPDwgRU9MX1RBQiA8PCAiV2FybmluZzo+ICIgPDwgc3RkOjpmbHVzaDsKKworCQlyZXR1cm4oIG9zICk7CisJfQorCisJaW5saW5lIFBhaXJPdXRTdHJlYW0gJiB3YXJuaW5nTG9jYXRpb24oUGFpck91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJcmVwb3J0RmlsZUxvY2F0aW9uKG9zKQorCQkJCTw8IHN0ckxpbmUoKSA8PCBFT0xfVEFCIDw8ICJXYXJuaW5nOj4gIiA8PCBzdGQ6OmZsdXNoOworCisJCXJldHVybiggb3MgKTsKKwl9CisKKwlpbmxpbmUgVHJpcGxlT3V0U3RyZWFtICYgd2FybmluZ0xvY2F0aW9uKFRyaXBsZU91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJcmVwb3J0RmlsZUxvY2F0aW9uKG9zKQorCQkJCTw8IHN0ckxpbmUoKSA8PCBFT0xfVEFCIDw8ICJXYXJuaW5nOj4gIiA8PCBzdGQ6OmZsdXNoOworCisJCXJldHVybiggb3MgKTsKKwl9CisKK307CisKKworfQorCisjZW5kaWYgLyogTE9DQVRJT05FTEVNRU5UX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvY29tbW9uL01vZGlmaWVyRWxlbWVudC5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvY29tbW9uL01vZGlmaWVyRWxlbWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMyMDQ4YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9jb21tb24vTW9kaWZpZXJFbGVtZW50LmNwcApAQCAtMCwwICsxLDM4MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDE4IG1hcnMgMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTW9kaWZpZXJFbGVtZW50LmgiCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSA8dXRpbC9hdm1fc3RyaW5nLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisvKioKKyAqIFBST1BFUlRZIE1PRElGSUVSCisgKi8KK01vZGlmaWVyIE1vZGlmaWVyOjpQUk9QRVJUWV9VTkRFRklORURfTU9ESUZJRVI7CisKKy8qKgorICogVklTSUJJTElUWQorICovCitNb2RpZmllciBNb2RpZmllcjo6UFJPUEVSVFlfUFVCTElDX01PRElGSUVSKAorCQlWSVNJQklMSVRZX1BVQkxJQ19LSU5ELAorCQlESVJFQ1RJT05fVU5ERUZJTkVEX0tJTkQsCisJCU5BVFVSRV9VTkRFRklORURfS0lORCwKKwkJRkVBVFVSRV9VTkRFRklORURfS0lORAorKTsKKworTW9kaWZpZXIgTW9kaWZpZXI6OlBST1BFUlRZX1BST1RFQ1RFRF9NT0RJRklFUigKKwkJVklTSUJJTElUWV9QUk9URUNURURfS0lORCwKKwkJRElSRUNUSU9OX1VOREVGSU5FRF9LSU5ELAorCQlOQVRVUkVfVU5ERUZJTkVEX0tJTkQsCisJCUZFQVRVUkVfVU5ERUZJTkVEX0tJTkQKKyk7CisKK01vZGlmaWVyIE1vZGlmaWVyOjpQUk9QRVJUWV9QUklWQVRFX01PRElGSUVSKAorCQlWSVNJQklMSVRZX1BSSVZBVEVfS0lORCwKKwkJRElSRUNUSU9OX1VOREVGSU5FRF9LSU5ELAorCQlOQVRVUkVfVU5ERUZJTkVEX0tJTkQsCisJCUZFQVRVUkVfVU5ERUZJTkVEX0tJTkQKKyk7CisKKworLyoqCisgKiBESVJFQ1RJT04KKyAqLworTW9kaWZpZXIgTW9kaWZpZXI6OlBST1BFUlRZX0lOT1VUX0RJUkVDVElPTigKKwkJVklTSUJJTElUWV9VTkRFRklORURfS0lORCwKKwkJRElSRUNUSU9OX0lOT1VUX0tJTkQsCisJCU5BVFVSRV9VTkRFRklORURfS0lORCwKKwkJRkVBVFVSRV9VTkRFRklORURfS0lORAorKTsKKworLyoqCisgKiBOQVRVUkUKKyAqLworTW9kaWZpZXIgTW9kaWZpZXI6OlBST1BFUlRZX01BQ1JPX01PRElGSUVSKAorCQlWSVNJQklMSVRZX1BSSVZBVEVfS0lORCwKKwkJRElSRUNUSU9OX1VOREVGSU5FRF9LSU5ELAorCQlOQVRVUkVfTUFDUk9fS0lORCwKKwkJRkVBVFVSRV9VTkRFRklORURfS0lORAorKTsKKworCisKKy8qKgorICogQUxJQVMKKyAqLworTW9kaWZpZXIgTW9kaWZpZXI6OlBST1BFUlRZX1BVQkxJQ19WT0xBVElMRV9NT0RJRklFUigKKwkJVklTSUJJTElUWV9QVUJMSUNfS0lORCwKKwkJRElSRUNUSU9OX1VOREVGSU5FRF9LSU5ELAorCQlOQVRVUkVfVU5ERUZJTkVEX0tJTkQsCisJCUZFQVRVUkVfVk9MQVRJTEVfS0lORAorKTsKKworTW9kaWZpZXIgTW9kaWZpZXI6OlBST1BFUlRZX1BVQkxJQ19GSU5BTF9TVEFUSUNfTU9ESUZJRVIoCisJCVZJU0lCSUxJVFlfUFVCTElDX0tJTkQsCisJCURJUkVDVElPTl9VTkRFRklORURfS0lORCwKKwkJTkFUVVJFX1VOREVGSU5FRF9LSU5ELAorCQlGRUFUVVJFX0ZJTkFMX0tJTkQgfCBGRUFUVVJFX1NUQVRJQ19LSU5ECispOworCisKK01vZGlmaWVyIE1vZGlmaWVyOjpQQVJBTUVURVJfUFVCTElDX0ZJTkFMX1NUQVRJQ19NT0RJRklFUigKKwkJVklTSUJJTElUWV9QVUJMSUNfS0lORCwKKwkJRElSRUNUSU9OX1VOREVGSU5FRF9LSU5ELAorCQlOQVRVUkVfUEFSQU1FVEVSX0tJTkQsCisJCUZFQVRVUkVfRklOQUxfS0lORCB8IEZFQVRVUkVfU1RBVElDX0tJTkQKKyk7CisKKworLyoqCisgKiBbIERJUkVDVElPTiBdIFBBUkFNRVRFUgorICovCitNb2RpZmllciBNb2RpZmllcjo6UFJPUEVSVFlfUEFSQU1FVEVSX01PRElGSUVSKAorCQlWSVNJQklMSVRZX1BSSVZBVEVfS0lORCwKKwkJRElSRUNUSU9OX1VOREVGSU5FRF9LSU5ELAorCQlOQVRVUkVfUEFSQU1FVEVSX0tJTkQsCisJCUZFQVRVUkVfVU5ERUZJTkVEX0tJTkQKKyk7CisKK01vZGlmaWVyIE1vZGlmaWVyOjpQUk9QRVJUWV9JTlBVVF9QQVJBTUVURVJfTU9ESUZJRVIoCisJCVZJU0lCSUxJVFlfUFJJVkFURV9LSU5ELAorCQlESVJFQ1RJT05fSU5QVVRfS0lORCwKKwkJTkFUVVJFX1BBUkFNRVRFUl9LSU5ELAorCQlGRUFUVVJFX1VOREVGSU5FRF9LSU5ECispOworCitNb2RpZmllciBNb2RpZmllcjo6UFJPUEVSVFlfT1VUUFVUX1BBUkFNRVRFUl9NT0RJRklFUigKKwkJVklTSUJJTElUWV9QUklWQVRFX0tJTkQsCisJCURJUkVDVElPTl9PVVRQVVRfS0lORCwKKwkJTkFUVVJFX1BBUkFNRVRFUl9LSU5ELAorCQlGRUFUVVJFX1VOREVGSU5FRF9LSU5ECispOworCitNb2RpZmllciBNb2RpZmllcjo6UFJPUEVSVFlfSU5PVVRfUEFSQU1FVEVSX01PRElGSUVSKAorCQlWSVNJQklMSVRZX1BSSVZBVEVfS0lORCwKKwkJRElSRUNUSU9OX0lOT1VUX0tJTkQsCisJCU5BVFVSRV9QQVJBTUVURVJfS0lORCwKKwkJRkVBVFVSRV9VTkRFRklORURfS0lORAorKTsKKworTW9kaWZpZXIgTW9kaWZpZXI6OlBST1BFUlRZX1JFVFVSTl9QQVJBTUVURVJfTU9ESUZJRVIoCisJCVZJU0lCSUxJVFlfUFJJVkFURV9LSU5ELAorCQlESVJFQ1RJT05fUkVUVVJOX0tJTkQsCisJCU5BVFVSRV9QQVJBTUVURVJfS0lORCwKKwkJRkVBVFVSRV9VTkRFRklORURfS0lORAorKTsKKworCisvKioKKyAqIFsgQklORCBdIFBBUkFNRVRFUgorICovCitNb2RpZmllciBNb2RpZmllcjo6UFJPUEVSVFlfUEFSQU1FVEVSX0JJTkRfTU9ESUZJRVIoCisJCVZJU0lCSUxJVFlfUFJJVkFURV9LSU5ELAorCQlESVJFQ1RJT05fVU5ERUZJTkVEX0tJTkQsCisJCU5BVFVSRV9QQVJBTUVURVJfQklORF9LSU5ELAorCQlGRUFUVVJFX1VOREVGSU5FRF9LSU5ECispOworCisKKy8qKgorICogVklTSUJJTElUWSBLSU5EIHRvIFNUUklORworICovCitzdGQ6OnN0cmluZyBNb2RpZmllcjo6c3RyVmlzaWJpbGl0eSgKKwkJYml0X2ZpZWxkX3QgdmlzaWJpbGl0eUtpbmQsIGNvbnN0IHN0ZDo6c3RyaW5nICYgc2VwYXJhdG9yKQoreworCXN3aXRjaCggdmlzaWJpbGl0eUtpbmQgKQorCXsKKy8vCQkJY2FzZSBWSVNJQklMSVRZX1VOREVGSU5FRF9LSU5EOgorLy8JCQkJcmV0dXJuKCAiPHZpc2liaWxpdHk6dW5kZWY+IiArIHNlcGFyYXRvciApOworCQljYXNlIFZJU0lCSUxJVFlfUFJJVkFURV9LSU5EOgorLy8JCQkJcmV0dXJuKCAicHJpdmF0ZSIgKyBzZXBhcmF0b3IgKTsKKwkJCXJldHVybiggIiIgKTsKKwkJY2FzZSBWSVNJQklMSVRZX1BVQkxJQ19LSU5EOgorCQkJcmV0dXJuKCAicHVibGljIiArIHNlcGFyYXRvciApOworCQljYXNlIFZJU0lCSUxJVFlfUFJPVEVDVEVEX0tJTkQ6CisJCQlyZXR1cm4oICJwcm90ZWN0ZWQiICsgc2VwYXJhdG9yICk7CisJCWNhc2UgVklTSUJJTElUWV9QQUNLQUdFX0tJTkQ6CisJCQlyZXR1cm4oICJwYWNrYWdlIiArIHNlcGFyYXRvciApOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4oIHhzdHJWaXNpYmlsaXR5KHZpc2liaWxpdHlLaW5kLCBzZXBhcmF0b3IpICk7CisJfQorfQorCisKK3N0ZDo6c3RyaW5nIE1vZGlmaWVyOjp4c3RyVmlzaWJpbGl0eSgKKwkJYml0X2ZpZWxkX3QgdmlzaWJpbGl0eUtpbmQsIGNvbnN0IHN0ZDo6c3RyaW5nICYgc2VwYXJhdG9yKQoreworCWlmKCAodmlzaWJpbGl0eUtpbmQgIT0gVklTSUJJTElUWV9VTkRFRklORURfS0lORCkgKQorLy8JCSYmICh2aXNpYmlsaXR5S2luZCAhPSBWSVNJQklMSVRZX1BSSVZBVEVfS0lORCkgKQorCXsKKwkJc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKworCQlpZiggKHZpc2liaWxpdHlLaW5kICYgVklTSUJJTElUWV9QQUNLQUdFX0tJTkQpID09CisJCQkJVklTSUJJTElUWV9QQUNLQUdFX0tJTkQgKQorCQl7CisJCQlvc3MgPDwgInBhY2thZ2UiIDw8IHNlcGFyYXRvcjsKKwkJfQorCQllbHNlIGlmKCAodmlzaWJpbGl0eUtpbmQgJiBWSVNJQklMSVRZX1BVQkxJQ19LSU5EKSAhPSAwICkKKwkJeworCQkJb3NzIDw8ICJwdWJsaWMiIDw8IHNlcGFyYXRvcjsKKwkJfQorCQllbHNlIGlmKCAodmlzaWJpbGl0eUtpbmQgJiBWSVNJQklMSVRZX1BST1RFQ1RFRF9LSU5EKSAhPSAwICkKKwkJeworCQkJb3NzIDw8ICJwcm90ZWN0ZWQiIDw8IHNlcGFyYXRvcjsKKwkJfQorCisJCXJldHVybiggb3NzLnN0cigpICk7CisJfQorCisJcmV0dXJuKCAiPHZpc2liaWxpdHk6dW5kZWY+IiApOworfQorCisKKy8qKgorICogRElSRUNUSU9OIEtJTkQgdG8gU1RSSU5HCisgKi8KK3N0ZDo6c3RyaW5nIE1vZGlmaWVyOjpzdHJEaXJlY3Rpb24oCisJCWJpdF9maWVsZF90IGRpcmVjdGlvbktpbmQsIGNvbnN0IHN0ZDo6c3RyaW5nICYgc2VwYXJhdG9yKQoreworCXN3aXRjaCggZGlyZWN0aW9uS2luZCApCisJeworCQljYXNlIERJUkVDVElPTl9VTkRFRklORURfS0lORDoKKwkJCXJldHVybiggIiIgKTsKKworCQljYXNlIERJUkVDVElPTl9JTlBVVF9LSU5EOgorCQkJcmV0dXJuKCAiaW5wdXQiICsgc2VwYXJhdG9yICk7CisJCWNhc2UgRElSRUNUSU9OX09VVFBVVF9LSU5EOgorCQkJcmV0dXJuKCAib3V0cHV0IiArIHNlcGFyYXRvciApOworCQljYXNlIERJUkVDVElPTl9JTk9VVF9LSU5EOgorCQkJcmV0dXJuKCAiaW5vdXQiICsgc2VwYXJhdG9yICk7CisJCWNhc2UgRElSRUNUSU9OX1JFVFVSTl9LSU5EOgorCQkJcmV0dXJuKCAicmV0dXJuIiArIHNlcGFyYXRvciApOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4oIHhzdHJEaXJlY3Rpb24oZGlyZWN0aW9uS2luZCwgc2VwYXJhdG9yKSApOworCX0KK30KKworc3RkOjpzdHJpbmcgTW9kaWZpZXI6OnhzdHJEaXJlY3Rpb24oCisJCWJpdF9maWVsZF90IGRpcmVjdGlvbktpbmQsIGNvbnN0IHN0ZDo6c3RyaW5nICYgc2VwYXJhdG9yKQoreworCWlmKCAoZGlyZWN0aW9uS2luZCAhPSBESVJFQ1RJT05fVU5ERUZJTkVEX0tJTkQpICkKKwl7CisJCXN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisKKwkJaWYoIChkaXJlY3Rpb25LaW5kICYgRElSRUNUSU9OX1JFVFVSTl9LSU5EKSAhPSAwICkKKwkJeworCQkJb3NzIDw8ICJyZXR1cm4iIDw8IHNlcGFyYXRvcjsKKwkJfQorCisJCWlmKCAoZGlyZWN0aW9uS2luZCAmIERJUkVDVElPTl9JTk9VVF9LSU5EKSA9PSBESVJFQ1RJT05fSU5PVVRfS0lORCApCisJCXsKKwkJCW9zcyA8PCAiaW5vdXQiIDw8IHNlcGFyYXRvcjsKKwkJfQorCQllbHNlIGlmKCAoZGlyZWN0aW9uS2luZCAmIERJUkVDVElPTl9JTlBVVF9LSU5EKSAhPSAwICkKKwkJeworCQkJb3NzIDw8ICJpbnB1dCIgPDwgc2VwYXJhdG9yOworCQl9CisJCWVsc2UgaWYoIChkaXJlY3Rpb25LaW5kICYgRElSRUNUSU9OX09VVFBVVF9LSU5EKSAhPSAwICkKKwkJeworCQkJb3NzIDw8ICJvdXRwdXQiIDw8IHNlcGFyYXRvcjsKKwkJfQorCisJCXJldHVybiggb3NzLnN0cigpICk7CisJfQorCisJcmV0dXJuKCAiPGRpcmVjdGlvbjp1bmRlZj4iICk7Cit9CisKKworTW9kaWZpZXI6OkRJUkVDVElPTl9LSU5EIE1vZGlmaWVyOjp0b0RpcmVjdGlvbktpbmQoY29uc3Qgc3RkOjpzdHJpbmcgJiBpZCkKK3sKKwlpZiggaWQgPT0gImlub3V0IiAgKSByZXR1cm4gRElSRUNUSU9OX0lOT1VUX0tJTkQ7CisJaWYoIGlkID09ICJpbnB1dCIgICkgcmV0dXJuIERJUkVDVElPTl9JTlBVVF9LSU5EOworCWlmKCBpZCA9PSAib3V0cHV0IiApIHJldHVybiBESVJFQ1RJT05fT1VUUFVUX0tJTkQ7CisKKwlyZXR1cm4gRElSRUNUSU9OX1VOREVGSU5FRF9LSU5EOworfQorCisKKy8qKgorICogRkVBVFVSRSBLSU5EIHRvIFNUUklORworICovCitzdGQ6OnN0cmluZyBNb2RpZmllcjo6c3RyRmVhdHVyZSgKKwkJYml0X2ZpZWxkX3QgZmVhdHVyZUtpbmQsIGNvbnN0IHN0ZDo6c3RyaW5nICYgc2VwYXJhdG9yKQoreworCWlmKCBmZWF0dXJlS2luZCAhPSBGRUFUVVJFX1VOREVGSU5FRF9LSU5EICkKKwl7CisJCXN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisKKwkJaWYoIChmZWF0dXJlS2luZCAmIEZFQVRVUkVfRklOQUxfS0lORCkgIT0gMCApCisJCXsKKwkJCW9zcyA8PCAiZmluYWwiIDw8IHNlcGFyYXRvcjsKKwkJfQorCQlpZiggKGZlYXR1cmVLaW5kICYgRkVBVFVSRV9TVEFUSUNfS0lORCkgIT0gMCApCisJCXsKKwkJCW9zcyA8PCAic3RhdGljIiA8PCBzZXBhcmF0b3I7CisJCX0KKwkJaWYoIChmZWF0dXJlS2luZCAmIEZFQVRVUkVfVFJBTlNJRU5UX0tJTkQpICE9IDAgKQorCQl7CisJCQlvc3MgPDwgInRyYW5zaWVudCIgPDwgc2VwYXJhdG9yOworCQl9CisJCWlmKCAoZmVhdHVyZUtpbmQgJiBGRUFUVVJFX1ZPTEFUSUxFX0tJTkQpICE9IDAgKQorCQl7CisJCQlvc3MgPDwgInZvbGF0aWxlIiA8PCBzZXBhcmF0b3I7CisJCX0KKwkJaWYoIChmZWF0dXJlS2luZCAmIEZFQVRVUkVfVU5TQUZFX0tJTkQpICE9IDAgKQorCQl7CisJCQlvc3MgPDwgInVuc2FmZSIgPDwgc2VwYXJhdG9yOworCQl9CisKKwkJcmV0dXJuKCBvc3Muc3RyKCkgKTsKKwl9CisKKwlyZXR1cm4oICIiIC8qIjxmZWF0dXJlOnVuZGVmPiIqLyApOworfQorCisKKy8qKgorICogTkFUVVJFIEtJTkQgdG8gU1RSSU5HCisgKi8KK3N0ZDo6c3RyaW5nIE1vZGlmaWVyOjpzdHJOYXR1cmUoCisJCWJpdF9maWVsZF90IG5hdHVyZSwgY29uc3Qgc3RkOjpzdHJpbmcgJiBzZXBhcmF0b3IpCit7CisJaWYoIChuYXR1cmUgIT0gTkFUVVJFX1VOREVGSU5FRF9LSU5EKSApCisvLwkJJiYgKG5hdHVyZSAhPSBOQVRVUkVfVkFSSUFCTEVfS0lORCkgKQorCXsKKwkJc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKworCQlpZiggKG5hdHVyZSAmIE5BVFVSRV9SRUZFUkVOQ0VfS0lORCkgIT0gMCApCisJCXsKKwkJCW9zcyA8PCAicmVmZXJlbmNlIiA8PCBzZXBhcmF0b3I7CisJCX0KKwkJaWYoIChuYXR1cmUgJiBOQVRVUkVfTUFDUk9fS0lORCkgIT0gMCApCisJCXsKKwkJCW9zcyA8PCAibWFjcm8iIDw8IHNlcGFyYXRvcjsKKwkJfQorCQlpZiggKG5hdHVyZSAmIE5BVFVSRV9CSU5EX0tJTkQpICE9IDAgKQorCQl7CisJCQlvc3MgPDwgImJpbmQiIDw8IHNlcGFyYXRvcjsKKwkJfQorCisJCWlmKCAobmF0dXJlICYgTkFUVVJFX1BBUkFNRVRFUl9LSU5EKSAhPSAwICkKKwkJeworCQkJb3NzIDw8ICJwYXJhbWV0ZXIiIDw8IHNlcGFyYXRvcjsKKwkJfQorCisJCXJldHVybiggb3NzLnN0cigpICk7CisJfQorCisJcmV0dXJuKCAiIiAvKiI8bmF0dXJlOnVuZGVmPiIqLyApOworfQorCisKKy8qKgorICogU2VyaWFsaXphdGlvbgorICovCitzdGQ6OnN0cmluZyBNb2RpZmllcjo6dG9TdHJpbmcoYml0X2ZpZWxkX3QgZW5hYmxlZEZpZWxkcywKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBzZXBhcmF0b3IpIGNvbnN0Cit7CisJc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKworCWlmKCAoZW5hYmxlZEZpZWxkcyAmIEZJRUxEX1ZJU0lCSUxJVFlfUE9TSVRJT04pICE9IDAgKQorCXsKKwkJb3NzIDw8IE1vZGlmaWVyOjpzdHJWaXNpYmlsaXR5KCB2aXNpYmlsaXR5ICwgc2VwYXJhdG9yICk7CisJfQorCisJaWYoIChlbmFibGVkRmllbGRzICYgRklFTERfRElSRUNUSU9OX1BPU0lUSU9OKSAhPSAwICkKKwl7CisJCW9zcyA8PCBNb2RpZmllcjo6c3RyRGlyZWN0aW9uICggZGlyZWN0aW9uICAsIHNlcGFyYXRvciApOworCX0KKworCWlmKCAoZW5hYmxlZEZpZWxkcyAmIEZJRUxEX0ZFQVRVUkVfUE9TSVRJT04pICE9IDAgKQorCXsKKwkJb3NzIDw8IE1vZGlmaWVyOjpzdHJGZWF0dXJlKCBmZWF0dXJlICwgc2VwYXJhdG9yICk7CisJfQorCisJaWYoIChlbmFibGVkRmllbGRzICYgRklFTERfTkFUVVJFX1BPU0lUSU9OKSAhPSAwICkKKwl7CisJCW9zcyA8PCBNb2RpZmllcjo6c3RyTmF0dXJlICggbmF0dXJlICwgc2VwYXJhdG9yICk7CisJfQorCisJcmV0dXJuKCBvc3Muc3RyKCkgKTsKK30KKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvY29tbW9uL01vZGlmaWVyRWxlbWVudC5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2NvbW1vbi9Nb2RpZmllckVsZW1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTBkZmM3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2NvbW1vbi9Nb2RpZmllckVsZW1lbnQuaApAQCAtMCwwICsxLDE2ODEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxOCBtYXJzIDIwMTEKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBNT0RJRklFUkVMRU1FTlRfSF8KKyNkZWZpbmUgTU9ESUZJRVJFTEVNRU5UX0hfCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDx1dGlsL2F2bV9udW1lcmljLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK3N0cnVjdCBNb2RpZmllcgoreworCisJLyoqCisJICogVklTSUJJTElUWV9LSU5ECisJICogMiBiaXRzCisJICovCisJZW51bSBWSVNJQklMSVRZX0tJTkQKKwl7CisJCVZJU0lCSUxJVFlfVU5ERUZJTkVEX0tJTkQgID0gMHgwMCwgLy8gREVGQVVMVAorCQlWSVNJQklMSVRZX1BSSVZBVEVfS0lORCAgICA9IDB4MDAsIC8vIERFRkFVTFQKKworCQlWSVNJQklMSVRZX1BVQkxJQ19LSU5EICAgICA9IDB4MDEsCisKKwkJVklTSUJJTElUWV9QUk9URUNURURfS0lORCAgPSAweDAyLAorCisJCVZJU0lCSUxJVFlfUEFDS0FHRV9LSU5EICAgID0gMHgwMworCisJfTsKKworCisJLyoqCisJICogRElSRUNUSU9OX0tJTkQKKwkgKiAzIGJpdHMKKwkgKi8KKwllbnVtIERJUkVDVElPTl9LSU5ECisJeworCQlESVJFQ1RJT05fVU5ERUZJTkVEX0tJTkQgICA9IDB4MDAsIC8vIERFRkFVTFQKKworCQlESVJFQ1RJT05fSU5QVVRfS0lORCAgICAgICA9IDB4MDEsCisKKwkJRElSRUNUSU9OX09VVFBVVF9LSU5EICAgICAgPSAweDAyLAorCisJCURJUkVDVElPTl9JTk9VVF9LSU5EICAgICAgID0gRElSRUNUSU9OX0lOUFVUX0tJTkQKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBESVJFQ1RJT05fT1VUUFVUX0tJTkQsCisKKwkJRElSRUNUSU9OX1JFVFVSTl9LSU5EICAgICAgPSAweDA0CisKKwl9OworCisKKworCS8qKgorCSAqIE5BVFVSRV9LSU5ECisJICogNCBiaXRzCisJICovCisJZW51bSBOQVRVUkVfS0lORAorCXsKKwkJTkFUVVJFX1VOREVGSU5FRF9LSU5EICAgICAgICAgICAgPSAweDAwMCwgLy8gREVGQVVMVAorCQlOQVRVUkVfVkFSSUFCTEVfS0lORCAgICAgICAgICAgICA9IDB4MDAwLCAvLyBERUZBVUxUCisKKwkJTkFUVVJFX1BBUkFNRVRFUl9LSU5EICAgICAgICAgICAgPSAweDAwMSwKKworCQlOQVRVUkVfUkVGRVJFTkNFX0tJTkQgICAgICAgICAgICA9IDB4MDAyLAorCisJCU5BVFVSRV9NQUNST19LSU5EICAgICAgICAgICAgICAgID0gMHgwMDQsCisKKwkJTkFUVVJFX0JJTkRfS0lORCAgICAgICAgICAgICAgICAgPSAweDAwOCwKKworCQlOQVRVUkVfUEFSQU1FVEVSX0JJTkRfS0lORCAgICAgICA9IE5BVFVSRV9QQVJBTUVURVJfS0lORAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5BVFVSRV9CSU5EX0tJTkQsCisKKwkJTkFUVVJFX1JFRkVSRU5DRV9NQUNST19LSU5EICAgICAgPSBOQVRVUkVfUkVGRVJFTkNFX0tJTkQKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOQVRVUkVfTUFDUk9fS0lORCwKKworCQlOQVRVUkVfUEFSQU1FVEVSX1JFRkVSRU5DRV9NQUNST19LSU5ECisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gTkFUVVJFX1BBUkFNRVRFUl9LSU5ECisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTkFUVVJFX1JFRkVSRU5DRV9LSU5ECisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTkFUVVJFX01BQ1JPX0tJTkQKKworCX07CisKKworCS8qKgorCSAqIEZFQVRVUkVfS0lORAorCSAqIDUgYml0cworCSAqLworCWVudW0gRkVBVFVSRV9LSU5ECisJeworCQlGRUFUVVJFX1VOREVGSU5FRF9LSU5EICAgICA9IDB4MDAwLCAvLyBERUZBVUxUCisKKwkJRkVBVFVSRV9GSU5BTF9LSU5EICAgICAgICAgPSAweDAwMSwKKwkJRkVBVFVSRV9DT05TVF9LSU5EICAgICAgICAgPSAweDAwMSwKKworCQlGRUFUVVJFX1NUQVRJQ19LSU5EICAgICAgICA9IDB4MDAyLAorCisJCUZFQVRVUkVfVFJBTlNJRU5UX0tJTkQgICAgID0gMHgwMDQsCisKKwkJRkVBVFVSRV9WT0xBVElMRV9LSU5EICAgICAgPSAweDAwOCwKKworCQlGRUFUVVJFX1VOU0FGRV9LSU5EICAgICAgICA9IDB4MDEwLAorCisJCUZFQVRVUkVfRklOQUxfU1RBVElDX0tJTkQgID0gRkVBVFVSRV9GSU5BTF9LSU5ECisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRkVBVFVSRV9TVEFUSUNfS0lORAorCisJfTsKKworCisJLyoqCisJICogVFlQRURFRgorCSAqLworCXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIGJpdF9maWVsZF90OworCisJLyoqCisJICogQklUIEZJRUxEUworCSAqLworCWJpdF9maWVsZF90IHZpc2liaWxpdHkgICAgIDogMjsKKworCWJpdF9maWVsZF90IGRpcmVjdGlvbiAgICAgIDogMzsKKworCWJpdF9maWVsZF90IG5hdHVyZSAgICAgICAgIDogNDsKKworCWJpdF9maWVsZF90IGZlYXR1cmUgICAgICAgIDogNTsKKworCisJLyoqCisJICogRU5BQkxJTkcgUE9TSVRJT04KKwkgKi8KKwllbnVtCisJeworCQlGSUVMRF9WSVNJQklMSVRZX1BPU0lUSU9OICAgICAgICA9IDB4MDEsCisJCUZJRUxEX0RJUkVDVElPTl9QT1NJVElPTiAgICAgICAgID0gMHgwMiwKKwkJRklFTERfTkFUVVJFX1BPU0lUSU9OICAgICAgICAgICAgPSAweDA0LAorCQlGSUVMRF9GRUFUVVJFX1BPU0lUSU9OICAgICAgICAgICA9IDB4MDgsCisKKwkJRU5BQkxFX0FMTF9GSUVMRFMgICAgICAgICAgICAgICAgPSAweEZGLAorCisJCURJU0FCTEVfVklTSUJJTElUWV9GSUVMRCAgICAgICAgID0gKH4gRklFTERfVklTSUJJTElUWV9QT1NJVElPTiksCisJCURJU0FCTEVfRElSRUNUSU9OX0ZJRUxEICAgICAgICAgID0gKH4gRklFTERfRElSRUNUSU9OX1BPU0lUSU9OICksCisJCURJU0FCTEVfRkVBVFVSRV9ERVNJR05fRklFTEQgICAgID0gKH4gRklFTERfRkVBVFVSRV9QT1NJVElPTiAgICksCisJCURJU0FCTEVfTkFUVVJFX0ZJRUxEICAgICAgICAgICAgID0gKH4gRklFTERfTkFUVVJFX1BPU0lUSU9OICAgICkKKworCX07CisKKworCS8qKgorCSAqIFNUQVRJQyBQUk9QRVJUWSBNT0RJRklFUgorCSAqLworCXN0YXRpYyBNb2RpZmllciBQUk9QRVJUWV9VTkRFRklORURfTU9ESUZJRVI7CisKKwkvKioKKwkgKiBWSVNJQklMSVRZCisJICovCisJc3RhdGljIE1vZGlmaWVyIFBST1BFUlRZX1BVQkxJQ19NT0RJRklFUjsKKworCXN0YXRpYyBNb2RpZmllciBQUk9QRVJUWV9QUk9URUNURURfTU9ESUZJRVI7CisKKwlzdGF0aWMgTW9kaWZpZXIgUFJPUEVSVFlfUFJJVkFURV9NT0RJRklFUjsKKworCS8qKgorCSAqIERJUkVDVElPTgorCSAqLworCXN0YXRpYyBNb2RpZmllciBQUk9QRVJUWV9JTk9VVF9ESVJFQ1RJT047CisKKwkvKioKKwkgKiBOQVRVUkUKKwkgKi8KKwlzdGF0aWMgTW9kaWZpZXIgUFJPUEVSVFlfTUFDUk9fTU9ESUZJRVI7CisKKwkvKioKKwkgKiBBTElBUworCSAqLworCXN0YXRpYyBNb2RpZmllciBQUk9QRVJUWV9QVUJMSUNfVk9MQVRJTEVfTU9ESUZJRVI7CisKKwlzdGF0aWMgTW9kaWZpZXIgUFJPUEVSVFlfUFVCTElDX0ZJTkFMX1NUQVRJQ19NT0RJRklFUjsKKworCXN0YXRpYyBNb2RpZmllciBQQVJBTUVURVJfUFVCTElDX0ZJTkFMX1NUQVRJQ19NT0RJRklFUjsKKworCS8qKgorCSAqIFsgRElSRUNUSU9OIF0gUEFSQU1FVEVSCisJICovCisJc3RhdGljIE1vZGlmaWVyIFBST1BFUlRZX1BBUkFNRVRFUl9NT0RJRklFUjsKKworCXN0YXRpYyBNb2RpZmllciBQUk9QRVJUWV9JTlBVVF9QQVJBTUVURVJfTU9ESUZJRVI7CisKKwlzdGF0aWMgTW9kaWZpZXIgUFJPUEVSVFlfT1VUUFVUX1BBUkFNRVRFUl9NT0RJRklFUjsKKworCXN0YXRpYyBNb2RpZmllciBQUk9QRVJUWV9JTk9VVF9QQVJBTUVURVJfTU9ESUZJRVI7CisKKwlzdGF0aWMgTW9kaWZpZXIgUFJPUEVSVFlfUkVUVVJOX1BBUkFNRVRFUl9NT0RJRklFUjsKKworCS8qKgorCSAqIFsgQklORCBdIFBBUkFNRVRFUgorCSAqLworCXN0YXRpYyBNb2RpZmllciBQUk9QRVJUWV9QQVJBTUVURVJfQklORF9NT0RJRklFUjsKKworCisJLyoqCisJICogQ09OU1RSVUNUT1JTCisJICovCisJTW9kaWZpZXIoKQorCTogdmlzaWJpbGl0eSggVklTSUJJTElUWV9VTkRFRklORURfS0lORCApLAorCWRpcmVjdGlvbiAgICggRElSRUNUSU9OX1VOREVGSU5FRF9LSU5EICApLAorCW5hdHVyZSAgICAgICggTkFUVVJFX1VOREVGSU5FRF9LSU5EICAgICApLAorCWZlYXR1cmUgICAgICggRkVBVFVSRV9VTkRFRklORURfS0lORCAgICApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKy8vCU1vZGlmaWVyKGNvbnN0IE1vZGlmaWVyICYgYU1vZGlmaWVyKQorLy8JOiB2aXNpYmlsaXR5KCBhTW9kaWZpZXIudmlzaWJpbGl0eSApLAorLy8JZGlyZWN0aW9uICAgKCBhTW9kaWZpZXIuZGlyZWN0aW9uICApLAorLy8JbmF0dXJlICAgICAgKCBhTW9kaWZpZXIubmF0dXJlICAgICApLAorLy8JZmVhdHVyZSAgICAgKCBhTW9kaWZpZXIuZmVhdHVyZSAgICApCisvLwl7CisvLwkJLy8hISBOT1RISU5HCisvLwl9CisKKwlNb2RpZmllcihiaXRfZmllbGRfdCB2aXNpYmlsaXR5S2luZCwgYml0X2ZpZWxkX3QgZGlyZWN0aW9uS2luZCwKKwkJCWJpdF9maWVsZF90IG5hdHVyZUtpbmQsIGJpdF9maWVsZF90IGZlYXR1cmVLaW5kKQorCTogdmlzaWJpbGl0eSggdmlzaWJpbGl0eUtpbmQgKSwKKwlkaXJlY3Rpb24gICAoIGRpcmVjdGlvbktpbmQgICksCisJbmF0dXJlICAgICAgKCBuYXR1cmVLaW5kICApLAorCWZlYXR1cmUgICAgICggZmVhdHVyZUtpbmQgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJTW9kaWZpZXIoTkFUVVJFX0tJTkQgbmF0dXJlS2luZGluZCwgRkVBVFVSRV9LSU5EIGZlYXR1cmVLaW5kaW5kKQorCTogdmlzaWJpbGl0eSggVklTSUJJTElUWV9VTkRFRklORURfS0lORCApLAorCWRpcmVjdGlvbiAgICggRElSRUNUSU9OX1VOREVGSU5FRF9LSU5EICApLAorCW5hdHVyZSAgICAgICggbmF0dXJlS2luZGluZCAgKSwKKwlmZWF0dXJlICAgICAoIGZlYXR1cmVLaW5kaW5kICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJTW9kaWZpZXIoVklTSUJJTElUWV9LSU5EIHZpc2liaWxpdHlLaW5kKQorCTogdmlzaWJpbGl0eSggdmlzaWJpbGl0eUtpbmQgKSwKKwlkaXJlY3Rpb24gICAoIERJUkVDVElPTl9VTkRFRklORURfS0lORCAgKSwKKwluYXR1cmUgICAgICAoIE5BVFVSRV9VTkRFRklORURfS0lORCAgICAgKSwKKwlmZWF0dXJlICAgICAoIEZFQVRVUkVfVU5ERUZJTkVEX0tJTkQgICAgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJTW9kaWZpZXIoRElSRUNUSU9OX0tJTkQgZGlyZWN0aW9uS2luZCkKKwk6IHZpc2liaWxpdHkoIFZJU0lCSUxJVFlfVU5ERUZJTkVEX0tJTkQgKSwKKwlkaXJlY3Rpb24gICAoIGRpcmVjdGlvbktpbmQgICAgICAgICAgICAgKSwKKwluYXR1cmUgICAgICAoIE5BVFVSRV9VTkRFRklORURfS0lORCAgICAgKSwKKwlmZWF0dXJlICAgICAoIEZFQVRVUkVfVU5ERUZJTkVEX0tJTkQgICAgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJTW9kaWZpZXIoTkFUVVJFX0tJTkQgbmF0dXJlS2luZCkKKwk6IHZpc2liaWxpdHkoIFZJU0lCSUxJVFlfVU5ERUZJTkVEX0tJTkQgKSwKKwlkaXJlY3Rpb24gICAoIERJUkVDVElPTl9VTkRFRklORURfS0lORCAgKSwKKwluYXR1cmUgICAgICAoIG5hdHVyZUtpbmQgICAgICAgICAgICAgICAgKSwKKwlmZWF0dXJlICAgICAoIEZFQVRVUkVfVU5ERUZJTkVEX0tJTkQgICAgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJTW9kaWZpZXIoRkVBVFVSRV9LSU5EIGZlYXR1cmVLaW5kKQorCTogdmlzaWJpbGl0eSggVklTSUJJTElUWV9VTkRFRklORURfS0lORCApLAorCWRpcmVjdGlvbiAgICggRElSRUNUSU9OX1VOREVGSU5FRF9LSU5EICApLAorCW5hdHVyZSAgICAgICggTkFUVVJFX1VOREVGSU5FRF9LSU5EICAgICApLAorCWZlYXR1cmUgICAgICggZmVhdHVyZUtpbmQgICAgICAgICAgICAgICApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl+TW9kaWZpZXIoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBURVNURVIKKwkgKi8KKwlpbmxpbmUgYm9vbCBoYXNNb2RpZmllcigpIGNvbnN0CisJeworCQlyZXR1cm4oICAgICh2aXNpYmlsaXR5ICE9IFZJU0lCSUxJVFlfVU5ERUZJTkVEX0tJTkQpCisJCQkJfHwgKGRpcmVjdGlvbiAgIT0gRElSRUNUSU9OX1VOREVGSU5FRF9LSU5EICkKKwkJCQl8fCAobmF0dXJlICAgICAhPSBOQVRVUkVfVU5ERUZJTkVEX0tJTkQgICAgKQorCQkJCXx8IChmZWF0dXJlICAgICE9IEZFQVRVUkVfVU5ERUZJTkVEX0tJTkQgICApICk7CisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gT1BFUkFUT1IgPQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlubGluZSBNb2RpZmllciAmIG92ZXJyaWRlX2lmZGVmKGNvbnN0IE1vZGlmaWVyICYgb3RoZXIpCisJeworCQlpZiggb3RoZXIudmlzaWJpbGl0eSAhPSBWSVNJQklMSVRZX1VOREVGSU5FRF9LSU5EICkKKwkJeworCQkJdmlzaWJpbGl0eSA9IG90aGVyLnZpc2liaWxpdHk7CisJCX0KKwkJaWYoIG90aGVyLmRpcmVjdGlvbiAhPSBESVJFQ1RJT05fVU5ERUZJTkVEX0tJTkQgKQorCQl7CisJCQlkaXJlY3Rpb24gPSBvdGhlci5kaXJlY3Rpb247CisJCX0KKworCQluYXR1cmUgIHw9IG90aGVyLm5hdHVyZTsKKwkJZmVhdHVyZSB8PSBvdGhlci5mZWF0dXJlOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwlpbmxpbmUgTW9kaWZpZXIgJiBpZm5vdF9kZWZpbmUoY29uc3QgTW9kaWZpZXIgJiBvdGhlcikKKwl7CisJCWlmKCB2aXNpYmlsaXR5ID09IFZJU0lCSUxJVFlfVU5ERUZJTkVEX0tJTkQgKQorCQl7CisJCQl2aXNpYmlsaXR5ID0gb3RoZXIudmlzaWJpbGl0eTsKKwkJfQorCQlpZiggZGlyZWN0aW9uID09IERJUkVDVElPTl9VTkRFRklORURfS0lORCApCisJCXsKKwkJCWRpcmVjdGlvbiA9IG90aGVyLmRpcmVjdGlvbjsKKwkJfQorCisJCW5hdHVyZSAgfD0gb3RoZXIubmF0dXJlOworCQlmZWF0dXJlIHw9IG90aGVyLmZlYXR1cmU7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCisJaW5saW5lIE1vZGlmaWVyICYgb3BlcmF0b3I9KGNvbnN0IE1vZGlmaWVyICYgb3RoZXIpCisJeworCQl2aXNpYmlsaXR5ID0gb3RoZXIudmlzaWJpbGl0eTsKKwkJZGlyZWN0aW9uICA9IG90aGVyLmRpcmVjdGlvbjsKKwkJbmF0dXJlICAgICA9IG90aGVyLm5hdHVyZTsKKwkJZmVhdHVyZSAgICA9IG90aGVyLmZlYXR1cmU7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCWlubGluZSBNb2RpZmllciAmIG9wZXJhdG9yPShWSVNJQklMSVRZX0tJTkQgdmlzaWJpbGl0eUtpbmQpCisJeworCQl2aXNpYmlsaXR5ID0gdmlzaWJpbGl0eUtpbmQ7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCWlubGluZSBNb2RpZmllciAmIG9wZXJhdG9yPShESVJFQ1RJT05fS0lORCBkaXJlY3Rpb25LaW5kKQorCXsKKwkJZGlyZWN0aW9uID0gZGlyZWN0aW9uS2luZDsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJaW5saW5lIE1vZGlmaWVyICYgb3BlcmF0b3I9KE5BVFVSRV9LSU5EIG5hdHVyZUtpbmQpCisJeworCQluYXR1cmUgPSBuYXR1cmVLaW5kOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwlpbmxpbmUgTW9kaWZpZXIgJiBvcGVyYXRvcj0oRkVBVFVSRV9LSU5EIGZlYXR1cmVLaW5kKQorCXsKKwkJZmVhdHVyZSA9IGZlYXR1cmVLaW5kOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBPUEVSQVRPUiB8PQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlubGluZSBNb2RpZmllciAmIG9wZXJhdG9yfD0oY29uc3QgTW9kaWZpZXIgJiBvdGhlcikKKwl7CisJCXZpc2liaWxpdHkgfD0gb3RoZXIudmlzaWJpbGl0eTsKKwkJZGlyZWN0aW9uICB8PSBvdGhlci5kaXJlY3Rpb247CisJCW5hdHVyZSAgICAgfD0gb3RoZXIubmF0dXJlOworCQlmZWF0dXJlICAgIHw9IG90aGVyLmZlYXR1cmU7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCWlubGluZSBNb2RpZmllciAmIG9wZXJhdG9yfD0oVklTSUJJTElUWV9LSU5EIHZpc2liaWxpdHlLaW5kKQorCXsKKwkJdmlzaWJpbGl0eSB8PSB2aXNpYmlsaXR5S2luZDsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJaW5saW5lIE1vZGlmaWVyICYgb3BlcmF0b3J8PShESVJFQ1RJT05fS0lORCBkaXJlY3Rpb25LaW5kKQorCXsKKwkJZGlyZWN0aW9uIHw9IGRpcmVjdGlvbktpbmQ7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCWlubGluZSBNb2RpZmllciAmIG9wZXJhdG9yfD0oTkFUVVJFX0tJTkQgbmF0dXJlS2luZCkKKwl7CisJCW5hdHVyZSB8PSBuYXR1cmVLaW5kOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwlpbmxpbmUgTW9kaWZpZXIgJiBvcGVyYXRvcnw9KEZFQVRVUkVfS0lORCBmZWF0dXJlS2luZCkKKwl7CisJCWZlYXR1cmUgfD0gZmVhdHVyZUtpbmQ7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIE9QRVJBVE9SICY9CisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJaW5saW5lIE1vZGlmaWVyICYgb3BlcmF0b3ImPShjb25zdCBNb2RpZmllciAmIG90aGVyKQorCXsKKwkJdmlzaWJpbGl0eSAmPSBvdGhlci52aXNpYmlsaXR5OworCQlkaXJlY3Rpb24gICY9IG90aGVyLmRpcmVjdGlvbjsKKwkJbmF0dXJlICAgICAmPSBvdGhlci5uYXR1cmU7CisJCWZlYXR1cmUgICAgJj0gb3RoZXIuZmVhdHVyZTsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJaW5saW5lIE1vZGlmaWVyICYgb3BlcmF0b3ImPShWSVNJQklMSVRZX0tJTkQgdmlzaWJpbGl0eUtpbmQpCisJeworCQl2aXNpYmlsaXR5ICY9IHZpc2liaWxpdHlLaW5kOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwlpbmxpbmUgTW9kaWZpZXIgJiBvcGVyYXRvciY9KERJUkVDVElPTl9LSU5EIGRpcmVjdGlvbktpbmQpCisJeworCQlkaXJlY3Rpb24gJj0gZGlyZWN0aW9uS2luZDsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJaW5saW5lIE1vZGlmaWVyICYgb3BlcmF0b3ImPShOQVRVUkVfS0lORCBuYXR1cmVLaW5kKQorCXsKKwkJbmF0dXJlICY9IG5hdHVyZUtpbmQ7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCWlubGluZSBNb2RpZmllciAmIG9wZXJhdG9yJj0oRkVBVFVSRV9LSU5EIGZlYXR1cmVLaW5kKQorCXsKKwkJZmVhdHVyZSAmPSBmZWF0dXJlS2luZDsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gT1BFUkFUT1IgPT0gICE9CisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNb2RpZmllciAmIG90aGVyKSBjb25zdAorCXsKKwkJcmV0dXJuKCAgICAodmlzaWJpbGl0eSA9PSBvdGhlci52aXNpYmlsaXR5KQorCQkJCSYmIChkaXJlY3Rpb24gID09IG90aGVyLmRpcmVjdGlvbiApCisJCQkJJiYgKG5hdHVyZSAgICAgPT0gb3RoZXIubmF0dXJlICAgICkKKwkJCQkmJiAoZmVhdHVyZSAgICA9PSBvdGhlci5mZWF0dXJlICAgKSApOworCX0KKworCWlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgTW9kaWZpZXIgJiBvdGhlcikgY29uc3QKKwl7CisJCXJldHVybiggICAgKHZpc2liaWxpdHkgIT0gb3RoZXIudmlzaWJpbGl0eSkKKwkJCQl8fCAoZGlyZWN0aW9uICAhPSBvdGhlci5kaXJlY3Rpb24gKQorCQkJCXx8IChuYXR1cmUgICAgICE9IG90aGVyLm5hdHVyZSAgICApCisJCQkJfHwgKGZlYXR1cmUgICAgIT0gb3RoZXIuZmVhdHVyZSAgICkgKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBPUEVSQVRPUiB8CisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJaW5saW5lIE1vZGlmaWVyIG9wZXJhdG9yfChjb25zdCBNb2RpZmllciAmIG90aGVyKSBjb25zdAorCXsKKwkJcmV0dXJuKCBNb2RpZmllcigKKwkJCQl2aXNpYmlsaXR5IHwgb3RoZXIudmlzaWJpbGl0eSwKKwkJCQlkaXJlY3Rpb24gIHwgb3RoZXIuZGlyZWN0aW9uLAorCQkJCW5hdHVyZSAgICAgfCBvdGhlci5uYXR1cmUsCisJCQkJZmVhdHVyZSAgICB8IG90aGVyLmZlYXR1cmUpICk7CisJfQorCisJaW5saW5lIE1vZGlmaWVyIG9wZXJhdG9yfChWSVNJQklMSVRZX0tJTkQgdmlzaWJpbGl0eUtpbmQpIGNvbnN0CisJeworCQlyZXR1cm4oIE1vZGlmaWVyKHZpc2liaWxpdHkgfCB2aXNpYmlsaXR5S2luZCwKKwkJCQlkaXJlY3Rpb24sIG5hdHVyZSwgZmVhdHVyZSkgKTsKKwl9CisKKwlpbmxpbmUgTW9kaWZpZXIgb3BlcmF0b3J8KERJUkVDVElPTl9LSU5EIGRpcmVjdGlvbktpbmQpIGNvbnN0CisJeworCQlyZXR1cm4oIE1vZGlmaWVyKHZpc2liaWxpdHksCisJCQkJZGlyZWN0aW9uIHwgZGlyZWN0aW9uS2luZCwgbmF0dXJlLCBmZWF0dXJlKSApOworCX0KKworCWlubGluZSBNb2RpZmllciBvcGVyYXRvcnwoTkFUVVJFX0tJTkQgbmF0dXJlS2luZCkgY29uc3QKKwl7CisJCXJldHVybiggTW9kaWZpZXIodmlzaWJpbGl0eSwKKwkJCQlkaXJlY3Rpb24sIG5hdHVyZSB8IG5hdHVyZUtpbmQsIGZlYXR1cmUpICk7CisJfQorCisJaW5saW5lIE1vZGlmaWVyIG9wZXJhdG9yfChGRUFUVVJFX0tJTkQgZmVhdHVyZUtpbmQpIGNvbnN0CisJeworCQlyZXR1cm4oIE1vZGlmaWVyKHZpc2liaWxpdHksCisJCQkJZGlyZWN0aW9uLCBuYXR1cmUsIGZlYXR1cmUgfCBmZWF0dXJlS2luZCkgKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBPUEVSQVRPUiAmCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJaW5saW5lIE1vZGlmaWVyIG9wZXJhdG9yJihjb25zdCBNb2RpZmllciAmIG90aGVyKSBjb25zdAorCXsKKwkJcmV0dXJuKCBNb2RpZmllcigKKwkJCQl2aXNpYmlsaXR5ICYgb3RoZXIudmlzaWJpbGl0eSwKKwkJCQlkaXJlY3Rpb24gICYgb3RoZXIuZGlyZWN0aW9uLAorCQkJCW5hdHVyZSAgICAgJiBvdGhlci5uYXR1cmUsCisJCQkJZmVhdHVyZSAgICAmIG90aGVyLmZlYXR1cmUpICk7CisJfQorCisJaW5saW5lIE1vZGlmaWVyIG9wZXJhdG9yJihWSVNJQklMSVRZX0tJTkQgdmlzaWJpbGl0eUtpbmQpIGNvbnN0CisJeworCQlyZXR1cm4oIE1vZGlmaWVyKHZpc2liaWxpdHkgJiB2aXNpYmlsaXR5S2luZCwKKwkJCQlkaXJlY3Rpb24sIG5hdHVyZSwgZmVhdHVyZSkgKTsKKwl9CisKKwlpbmxpbmUgTW9kaWZpZXIgb3BlcmF0b3ImKERJUkVDVElPTl9LSU5EIGRpcmVjdGlvbktpbmQpIGNvbnN0CisJeworCQlyZXR1cm4oIE1vZGlmaWVyKHZpc2liaWxpdHksCisJCQkJZGlyZWN0aW9uICYgZGlyZWN0aW9uS2luZCwgbmF0dXJlLCBmZWF0dXJlKSApOworCX0KKworCWlubGluZSBNb2RpZmllciBvcGVyYXRvciYoTkFUVVJFX0tJTkQgbmF0dXJlS2luZCkgY29uc3QKKwl7CisJCXJldHVybiggTW9kaWZpZXIodmlzaWJpbGl0eSwKKwkJCQlkaXJlY3Rpb24sIG5hdHVyZSAmIG5hdHVyZUtpbmQsIGZlYXR1cmUpICk7CisJfQorCisJaW5saW5lIE1vZGlmaWVyIG9wZXJhdG9yJihGRUFUVVJFX0tJTkQgZmVhdHVyZUtpbmQpIGNvbnN0CisJeworCQlyZXR1cm4oIE1vZGlmaWVyKHZpc2liaWxpdHksCisJCQkJZGlyZWN0aW9uLCBuYXR1cmUsIGZlYXR1cmUgJiBmZWF0dXJlS2luZCkgKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBWSVNJQklMSVRZIEtJTkQKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiB2aXNpYmlsaXR5CisJICovCisJaW5saW5lIFZJU0lCSUxJVFlfS0lORCBnZXRWaXNpYmlsaXR5S2luZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHN0YXRpY19jYXN0PCBWSVNJQklMSVRZX0tJTkQgPiggdmlzaWJpbGl0eSApICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzVmlzaWJpbGl0eUtpbmQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCB2aXNpYmlsaXR5ICE9IFZJU0lCSUxJVFlfVU5ERUZJTkVEX0tJTkQgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc1Zpc2liaWxpdHlLaW5kKFZJU0lCSUxJVFlfS0lORCB2aXNpYmlsaXR5S2luZCkgY29uc3QKKwl7CisJCXJldHVybiggdmlzaWJpbGl0eSA9PSB2aXNpYmlsaXR5S2luZCApOworCX0KKworCWlubGluZSBNb2RpZmllciAmIHNldFZpc2liaWxpdHlLaW5kKFZJU0lCSUxJVFlfS0lORCB2aXNpYmlsaXR5S2luZCkKKwl7CisJCXZpc2liaWxpdHkgPSB2aXNpYmlsaXR5S2luZDsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJaW5saW5lIE1vZGlmaWVyICYgdW5zZXRWaXNpYmlsaXR5S2luZCgpCisJeworCQl2aXNpYmlsaXR5ID0gVklTSUJJTElUWV9VTkRFRklORURfS0lORDsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAicHVibGljIiB2aXNpYmlsaXR5CisJICovCisJaW5saW5lIGJvb2wgaXNWaXNpYmlsaXR5UHVibGljKCkgY29uc3QKKwl7CisJCXJldHVybiggdmlzaWJpbGl0eSA9PSBWSVNJQklMSVRZX1BVQkxJQ19LSU5EICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNWaXNpYmlsaXR5UHVibGljKGNvbnN0IE1vZGlmaWVyICYgbWFzaykgY29uc3QKKwl7CisJCXJldHVybiggKCh2aXNpYmlsaXR5IHwgbWFzay52aXNpYmlsaXR5KSAmIFZJU0lCSUxJVFlfUFVCTElDX0tJTkQpICE9IDAgKTsKKwl9CisKKwlpbmxpbmUgTW9kaWZpZXIgJiBzZXRWaXNpYmlsaXR5UHVibGljKCkKKwl7CisJCXZpc2liaWxpdHkgPSBWSVNJQklMSVRZX1BVQkxJQ19LSU5EOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAicHJpdmF0ZSIgdmlzaWJpbGl0eQorCSAqLworCWlubGluZSBib29sIGlzVmlzaWJpbGl0eVByaXZhdGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCB2aXNpYmlsaXR5ID09IFZJU0lCSUxJVFlfUFJJVkFURV9LSU5EICk7CisJfQorCisJaW5saW5lIE1vZGlmaWVyICYgc2V0VmlzaWJpbGl0eVByaXZhdGUoKQorCXsKKwkJdmlzaWJpbGl0eSA9IFZJU0lCSUxJVFlfUFJJVkFURV9LSU5EOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAicHJvdGVjdGVkIiB2aXNpYmlsaXR5CisJICovCisJaW5saW5lIGJvb2wgaXNWaXNpYmlsaXR5UHJvdGVjdGVkKCkgY29uc3QKKwl7CisJCXJldHVybiggdmlzaWJpbGl0eSA9PSBWSVNJQklMSVRZX1BST1RFQ1RFRF9LSU5EICk7CisJfQorCisJaW5saW5lIE1vZGlmaWVyICYgc2V0VmlzaWJpbGl0eVByb3RlY3RlZCgpCisJeworCQl2aXNpYmlsaXR5ID0gVklTSUJJTElUWV9QUk9URUNURURfS0lORDsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogInBhY2thZ2UiIHZpc2liaWxpdHkKKwkgKi8KKwlpbmxpbmUgYm9vbCBpc1Zpc2liaWxpdHlQYWNrYWdlKCkgY29uc3QKKwl7CisJCXJldHVybiggdmlzaWJpbGl0eSA9PSBWSVNJQklMSVRZX1BBQ0tBR0VfS0lORCApOworCX0KKworCWlubGluZSBNb2RpZmllciAmIHNldFZpc2liaWxpdHlQYWNrYWdlKCkKKwl7CisJCXZpc2liaWxpdHkgPSBWSVNJQklMSVRZX1BBQ0tBR0VfS0lORDsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gRElSRUNUSU9OIEtJTkQKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBkaXJlY3Rpb24KKwkgKi8KKwlpbmxpbmUgRElSRUNUSU9OX0tJTkQgZ2V0RGlyZWN0aW9uS2luZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHN0YXRpY19jYXN0PCBESVJFQ1RJT05fS0lORCA+KCBkaXJlY3Rpb24gKSApOworCX0KKworCWlubGluZSBib29sIGhhc0RpcmVjdGlvbktpbmQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBkaXJlY3Rpb24gIT0gRElSRUNUSU9OX1VOREVGSU5FRF9LSU5EICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzRGlyZWN0aW9uS2luZChESVJFQ1RJT05fS0lORCBkaXJlY3Rpb25LaW5kKSBjb25zdAorCXsKKwkJcmV0dXJuKCAoZGlyZWN0aW9uICYgZGlyZWN0aW9uS2luZCkgIT0gMCApOworCX0KKworCisJaW5saW5lIGJvb2wgaXNEaXJlY3Rpb25LaW5kKERJUkVDVElPTl9LSU5EIGRpcmVjdGlvbktpbmQpIGNvbnN0CisJeworCQlyZXR1cm4oIGRpcmVjdGlvbiA9PSBkaXJlY3Rpb25LaW5kICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNub3REaXJlY3Rpb25LaW5kKERJUkVDVElPTl9LSU5EIGRpcmVjdGlvbktpbmQpIGNvbnN0CisJeworCQlyZXR1cm4oIGRpcmVjdGlvbiAhPSBkaXJlY3Rpb25LaW5kICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBpc0RpcmVjdGlvbktpbmQoCisJCQlESVJFQ1RJT05fS0lORCBkaXJlY3Rpb25LaW5kLCBib29sIGlzU3Ryb25nbHkpIGNvbnN0CisJeworCQlyZXR1cm4oIGlzU3Ryb25nbHkgPyAoZGlyZWN0aW9uID09IGRpcmVjdGlvbktpbmQpCisJCQkJOiAoKGRpcmVjdGlvbiAmIGRpcmVjdGlvbktpbmQpICE9IDApICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNub3REaXJlY3Rpb25LaW5kKAorCQkJRElSRUNUSU9OX0tJTkQgZGlyZWN0aW9uS2luZCwgYm9vbCBpc1N0cm9uZ2x5KSBjb25zdAorCXsKKwkJcmV0dXJuKCBpc1N0cm9uZ2x5ID8gKGRpcmVjdGlvbiAhPSBkaXJlY3Rpb25LaW5kKQorCQkJCTogKChkaXJlY3Rpb24gJiBkaXJlY3Rpb25LaW5kKSA9PSAwKSApOworCX0KKworCisJaW5saW5lIGJvb2wgaXNEaXJlY3Rpb25VbmRlZmluZWQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBkaXJlY3Rpb24gPT0gRElSRUNUSU9OX1VOREVGSU5FRF9LSU5EICk7CisJfQorCisJaW5saW5lIE1vZGlmaWVyICYgc2V0RGlyZWN0aW9uS2luZChESVJFQ1RJT05fS0lORCBkaXJlY3Rpb25LaW5kKQorCXsKKwkJZGlyZWN0aW9uID0gZGlyZWN0aW9uS2luZDsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJaW5saW5lIE1vZGlmaWVyICYgdW5zZXREaXJlY3Rpb25LaW5kKCkKKwl7CisJCWRpcmVjdGlvbiA9IERJUkVDVElPTl9VTkRFRklORURfS0lORDsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisKKwlpbmxpbmUgc3RkOjpzdHJpbmcgc3RyRGlyZWN0aW9uKCkgY29uc3QKKwl7CisJCXN3aXRjaCggZGlyZWN0aW9uICkKKwkJeworCQkJY2FzZSBESVJFQ1RJT05fSU5QVVRfS0lORDoJICAgcmV0dXJuKCAiaW5wdXQiICApOworCQkJY2FzZSBESVJFQ1RJT05fT1VUUFVUX0tJTkQ6CSAgIHJldHVybiggIm91dHB1dCIgKTsKKwkJCWNhc2UgRElSRUNUSU9OX0lOT1VUX0tJTkQ6ICAgICByZXR1cm4oICJpbm91dCIgICk7CisJCQljYXNlIERJUkVDVElPTl9SRVRVUk5fS0lORDoJICAgcmV0dXJuKCAicmV0dXJuIiApOworCisJCQljYXNlIERJUkVDVElPTl9VTkRFRklORURfS0lORDogcmV0dXJuKCAidW5kZWZpbmVkPGRpcmVjdGlvbiNraW5kPiIgKTsKKworCQkJZGVmYXVsdDogcmV0dXJuKCAidW5rbm93bjxkaXJlY3Rpb24ja2luZD4iICk7CisJCX0KKwl9CisKKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogImlucHV0IiBkaXJlY3Rpb24gbW9kaWZpZXIKKwkgKi8KKwlpbmxpbmUgYm9vbCBpc0RpcmVjdGlvbklucHV0KCkgY29uc3QKKwl7CisJCXJldHVybiggZGlyZWN0aW9uID09IERJUkVDVElPTl9JTlBVVF9LSU5EICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzRGlyZWN0aW9uSW5wdXQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAoZGlyZWN0aW9uICYgRElSRUNUSU9OX0lOUFVUX0tJTkQpICE9IDAgKTsKKwl9CisKKwlpbmxpbmUgTW9kaWZpZXIgJiBzZXREaXJlY3Rpb25JbnB1dCgpCisJeworCQlkaXJlY3Rpb24gPSBESVJFQ1RJT05fSU5QVVRfS0lORDsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqICJpbnN0YW5jZSIgZGlyZWN0aW9uIG1vZGlmaWVyCisJICovCisJaW5saW5lIGJvb2wgaXNEaXJlY3Rpb25PdXRwdXQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBkaXJlY3Rpb24gPT0gRElSRUNUSU9OX09VVFBVVF9LSU5EICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzRGlyZWN0aW9uT3V0cHV0KCkgY29uc3QKKwl7CisJCXJldHVybiggKGRpcmVjdGlvbiAmIERJUkVDVElPTl9PVVRQVVRfS0lORCkgIT0gMCApOworCX0KKworCWlubGluZSBNb2RpZmllciAmIHNldERpcmVjdGlvbk91dHB1dCgpCisJeworCQlkaXJlY3Rpb24gPSBESVJFQ1RJT05fT1VUUFVUX0tJTkQ7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqICJwcm90b3R5cGUiIGRpcmVjdGlvbiBtb2RpZmllcgorCSAqLworCWlubGluZSBib29sIGlzRGlyZWN0aW9uSW5vdXQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBkaXJlY3Rpb24gPT0gRElSRUNUSU9OX0lOT1VUX0tJTkQgKTsKKwl9CisKKworCWlubGluZSBNb2RpZmllciAmIHNldERpcmVjdGlvbklub3V0KCkKKwl7CisJCWRpcmVjdGlvbiA9IERJUkVDVElPTl9JTk9VVF9LSU5EOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwlpbmxpbmUgTW9kaWZpZXIgJiBzZXREaXJlY3Rpb25Jbm91dEVsc2UoKQorCXsKKwkJaWYoIGRpcmVjdGlvbiA9PSBESVJFQ1RJT05fVU5ERUZJTkVEX0tJTkQgKQorCQl7CisJCQlkaXJlY3Rpb24gPSBESVJFQ1RJT05fSU5PVVRfS0lORDsKKwkJfQorCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAicnVudGltZSIgZGlyZWN0aW9uIG1vZGlmaWVyCisJICovCisJaW5saW5lIGJvb2wgaXNEaXJlY3Rpb25SZXR1cm4oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBkaXJlY3Rpb24gPT0gRElSRUNUSU9OX1JFVFVSTl9LSU5EICk7CisJfQorCisJaW5saW5lIGJvb2wgbm9EaXJlY3Rpb25SZXR1cm4oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBkaXJlY3Rpb24gIT0gRElSRUNUSU9OX1JFVFVSTl9LSU5EICk7CisJfQorCisJaW5saW5lIE1vZGlmaWVyICYgc2V0RGlyZWN0aW9uUmV0dXJuKCkKKwl7CisJCWRpcmVjdGlvbiA9IERJUkVDVElPTl9SRVRVUk5fS0lORDsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzRGlyZWN0aW9uT3RoZVRoYW5SZXR1cm4oKSBjb25zdAorCXsKKwkJcmV0dXJuKCAoZGlyZWN0aW9uICYgRElSRUNUSU9OX0lOT1VUX0tJTkQpICE9IDAgKTsKKwl9CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gTkFUVVJFIEtJTkQKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBuYXR1cmUKKwkgKi8KKwlpbmxpbmUgYml0X2ZpZWxkX3QgZ2V0TmF0dXJlS2luZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG5hdHVyZSApOworCX0KKworCWlubGluZSBib29sIGhhc05hdHVyZUtpbmQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBuYXR1cmUgIT0gTkFUVVJFX1VOREVGSU5FRF9LSU5EICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzTmF0dXJlS2luZChiaXRfZmllbGRfdCBraW5kKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobmF0dXJlICYga2luZCkgIT0gMCApOworCX0KKworCWlubGluZSBib29sIGlzTmF0dXJlS2luZChiaXRfZmllbGRfdCBraW5kKSBjb25zdAorCXsKKwkJcmV0dXJuKCBuYXR1cmUgPT0ga2luZCApOworCX0KKworCWlubGluZSBNb2RpZmllciAmIGFkZE5hdHVyZUtpbmQoYml0X2ZpZWxkX3Qga2luZCkKKwl7CisJCW5hdHVyZSB8PSBraW5kOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwlpbmxpbmUgTW9kaWZpZXIgJiByZW1OYXR1cmVLaW5kKGJpdF9maWVsZF90IGtpbmQpCisJeworCQluYXR1cmUgJj0gKH4ga2luZCk7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCWlubGluZSBNb2RpZmllciAmIHNldE5hdHVyZUtpbmQoYml0X2ZpZWxkX3Qga2luZCkKKwl7CisJCW5hdHVyZSA9IGtpbmQ7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gRkVBVFVSRSBLSU5ECisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogZmVhdHVyZQorCSAqLworCWlubGluZSBiaXRfZmllbGRfdCBnZXRGZWF0dXJlS2luZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIGZlYXR1cmUgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNGZWF0dXJlS2luZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIGZlYXR1cmUgIT0gRkVBVFVSRV9VTkRFRklORURfS0lORCApOworCX0KKworCWlubGluZSBib29sIGhhc0ZlYXR1cmVLaW5kKGJpdF9maWVsZF90IGtpbmQpIGNvbnN0CisJeworCQlyZXR1cm4oIChmZWF0dXJlICYga2luZCkgIT0gMCApOworCX0KKworCWlubGluZSBib29sIGlzRmVhdHVyZUtpbmQoYml0X2ZpZWxkX3Qga2luZCkgY29uc3QKKwl7CisJCXJldHVybiggZmVhdHVyZSA9PSBraW5kICk7CisJfQorCisKKwlpbmxpbmUgTW9kaWZpZXIgJiBhZGRGZWF0dXJlS2luZChiaXRfZmllbGRfdCBraW5kKQorCXsKKwkJZmVhdHVyZSB8PSBraW5kOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwlpbmxpbmUgTW9kaWZpZXIgJiByZW1GZWF0dXJlS2luZChiaXRfZmllbGRfdCBraW5kKQorCXsKKwkJZmVhdHVyZSAmPSAofiBraW5kKTsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJaW5saW5lIE1vZGlmaWVyICYgc2V0RmVhdHVyZUtpbmQoYml0X2ZpZWxkX3Qga2luZCkKKwl7CisJCWZlYXR1cmUgPSBraW5kOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqICJ2YXJpYWJsZSIgbmF0dXJlCisJICovCisJaW5saW5lIGJvb2wgaGFzTmF0dXJlVmFyaWFibGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobmF0dXJlICYgTkFUVVJFX1ZBUklBQkxFX0tJTkQpICE9IDAgKTsKKwl9CisKKwlpbmxpbmUgTW9kaWZpZXIgJiBzZXROYXR1cmVWYXJpYWJsZShib29sIGJOYXR1cmVWYXJpYWJsZSA9IHRydWUpCisJeworCQlpZiggYk5hdHVyZVZhcmlhYmxlICkKKwkJeworCQkJbmF0dXJlIHw9IE5BVFVSRV9WQVJJQUJMRV9LSU5EOworCQl9CisJCWVsc2UKKwkJeworCQkJbmF0dXJlICY9ICh+IE5BVFVSRV9WQVJJQUJMRV9LSU5EKTsKKwkJfQorCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAicGFyYW1ldGVyIiBuYXR1cmUKKwkgKi8KKwlpbmxpbmUgYm9vbCBoYXNOYXR1cmVQYXJhbWV0ZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobmF0dXJlICYgTkFUVVJFX1BBUkFNRVRFUl9LSU5EKSAhPSAwICk7CisJfQorCisJaW5saW5lIGJvb2wgbm9OYXR1cmVQYXJhbWV0ZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobmF0dXJlICYgTkFUVVJFX1BBUkFNRVRFUl9LSU5EKSA9PSAwICk7CisJfQorCisJaW5saW5lIE1vZGlmaWVyICYgc2V0TmF0dXJlUGFyYW1ldGVyKGJvb2wgYk5hdHVyZVBhcmFtZXRlciA9IHRydWUpCisJeworCQlpZiggYk5hdHVyZVBhcmFtZXRlciApCisJCXsKKwkJCW5hdHVyZSB8PSBOQVRVUkVfUEFSQU1FVEVSX0tJTkQ7CisJCX0KKwkJZWxzZQorCQl7CisJCQluYXR1cmUgJj0gKH4gTkFUVVJFX1BBUkFNRVRFUl9LSU5EKTsKKwkJfQorCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAicmVmZXJlbmNlIiBuYXR1cmUKKwkgKi8KKwlpbmxpbmUgYm9vbCBoYXNOYXR1cmVSZWZlcmVuY2UoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobmF0dXJlICYgTkFUVVJFX1JFRkVSRU5DRV9LSU5EKSAhPSAwICk7CisJfQorCisJaW5saW5lIE1vZGlmaWVyICYgc2V0TmF0dXJlUmVmZXJlbmNlKGJvb2wgYk5hdHVyZVJlZmVyZW5jZSA9IHRydWUpCisJeworCQlpZiggYk5hdHVyZVJlZmVyZW5jZSApCisJCXsKKwkJCW5hdHVyZSB8PSBOQVRVUkVfUkVGRVJFTkNFX0tJTkQ7CisJCX0KKwkJZWxzZQorCQl7CisJCQluYXR1cmUgJj0gKH4gTkFUVVJFX1JFRkVSRU5DRV9LSU5EKTsKKwkJfQorCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAibWFjcm8iIG5hdHVyZQorCSAqLworCWlubGluZSBib29sIGhhc05hdHVyZU1hY3JvKCkgY29uc3QKKwl7CisJCXJldHVybiggKG5hdHVyZSAmIE5BVFVSRV9NQUNST19LSU5EKSAhPSAwICk7CisJfQorCisJaW5saW5lIE1vZGlmaWVyICYgc2V0TmF0dXJlTWFjcm8oYm9vbCBiTmF0dXJlTWFjcm8gPSB0cnVlKQorCXsKKwkJaWYoIGJOYXR1cmVNYWNybyApCisJCXsKKwkJCW5hdHVyZSB8PSBOQVRVUkVfTUFDUk9fS0lORDsKKwkJfQorCQllbHNlCisJCXsKKwkJCW5hdHVyZSAmPSAofiBOQVRVUkVfTUFDUk9fS0lORCk7CisJCX0KKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisKKwkvKioKKwkgKiBBTElBUworCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqICJyZWZlcmVuY2UiIG9yICJtYWNybyIgbW9kaWZpZXIKKwkgKi8KKwlpbmxpbmUgYm9vbCBhbnlOYXR1cmVSZWZlcmVuY2VNYWNybygpIGNvbnN0CisJeworCQlyZXR1cm4oIChuYXR1cmUgJiBOQVRVUkVfUkVGRVJFTkNFX01BQ1JPX0tJTkQpICE9IDAgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBub25lTmF0dXJlUmVmZXJlbmNlTWFjcm8oKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobmF0dXJlICYgTkFUVVJFX1JFRkVSRU5DRV9NQUNST19LSU5EKSA9PSAwICk7CisJfQorCisKKwkvKioKKwkgKiBBTElBUworCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqICJwYXJhbWV0ZXIiIG9yICJyZWZlcmVuY2UiIG9yICJtYWNybyIgbW9kaWZpZXIKKwkgKi8KKwlpbmxpbmUgYm9vbCBhbnlOYXR1cmVQYXJhbWV0ZXJSZWZlcmVuY2VNYWNybygpIGNvbnN0CisJeworCQlyZXR1cm4oIChuYXR1cmUgJiBOQVRVUkVfUEFSQU1FVEVSX1JFRkVSRU5DRV9NQUNST19LSU5EKSAhPSAwICk7CisJfQorCisJaW5saW5lIGJvb2wgbm9uZU5hdHVyZVBhcmFtZXRlclJlZmVyZW5jZU1hY3JvKCkgY29uc3QKKwl7CisJCXJldHVybiggKG5hdHVyZSAmIE5BVFVSRV9QQVJBTUVURVJfUkVGRVJFTkNFX01BQ1JPX0tJTkQpID09IDAgKTsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAiYmluZCIgbmF0dXJlCisJICovCisJaW5saW5lIGJvb2wgaGFzTmF0dXJlQmluZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIChuYXR1cmUgJiBOQVRVUkVfQklORF9LSU5EKSAhPSAwICk7CisJfQorCisJaW5saW5lIE1vZGlmaWVyICYgc2V0TmF0dXJlQmluZChib29sIGJOYXR1cmVCaW5kID0gdHJ1ZSkKKwl7CisJCWlmKCBiTmF0dXJlQmluZCApCisJCXsKKwkJCW5hdHVyZSB8PSBOQVRVUkVfQklORF9LSU5EOworCQl9CisJCWVsc2UKKwkJeworCQkJbmF0dXJlICY9ICh+IE5BVFVSRV9CSU5EX0tJTkQpOworCQl9CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCisJLyoqCisJICogQUxJQVMKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAicGFyYW1ldGVyIiBvciAiYmluZCIgbW9kaWZpZXIKKwkgKi8KKwlpbmxpbmUgYm9vbCBoYXNOYXR1cmVQYXJhbWV0ZXJCaW5kKCkgY29uc3QKKwl7CisJCXJldHVybiggKG5hdHVyZSAmIE5BVFVSRV9QQVJBTUVURVJfQklORF9LSU5EKSA9PQorCQkJCQkJTkFUVVJFX1BBUkFNRVRFUl9CSU5EX0tJTkQgKTsKKwl9CisKKwlpbmxpbmUgTW9kaWZpZXIgJiBzZXROYXR1cmVQYXJhbWV0ZXJCaW5kKGJvb2wgYk5hdHVyZVBhcmFtZXRlckJpbmQgPSB0cnVlKQorCXsKKwkJaWYoIGJOYXR1cmVQYXJhbWV0ZXJCaW5kICkKKwkJeworCQkJbmF0dXJlIHw9IE5BVFVSRV9QQVJBTUVURVJfQklORF9LSU5EOworCQl9CisJCWVsc2UKKwkJeworCQkJbmF0dXJlICY9ICh+IE5BVFVSRV9QQVJBTUVURVJfQklORF9LSU5EKTsKKwkJfQorCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqICJmaW5hbCIgb3IgImNvbnN0IiBmZWF0dXJlCisJICovCisJaW5saW5lIGJvb2wgaGFzRmVhdHVyZUZpbmFsKCkgY29uc3QKKwl7CisJCXJldHVybiggKGZlYXR1cmUgJiBGRUFUVVJFX0ZJTkFMX0tJTkQpICE9IDAgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBub0ZlYXR1cmVGaW5hbCgpIGNvbnN0CisJeworCQlyZXR1cm4oIChmZWF0dXJlICYgRkVBVFVSRV9GSU5BTF9LSU5EKSA9PSAwICk7CisJfQorCisJaW5saW5lIE1vZGlmaWVyICYgc2V0RmVhdHVyZUZpbmFsKGJvb2wgYkZlYXR1cmVGaW5hbCA9IHRydWUpCisJeworCQlpZiggYkZlYXR1cmVGaW5hbCApCisJCXsKKwkJCWZlYXR1cmUgfD0gRkVBVFVSRV9GSU5BTF9LSU5EOworCQl9CisJCWVsc2UKKwkJeworCQkJZmVhdHVyZSAmPSAofiBGRUFUVVJFX0ZJTkFMX0tJTkQpOworCQl9CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCisJaW5saW5lIGJvb2wgaGFzRmVhdHVyZUNvbnN0KCkgY29uc3QKKwl7CisJCXJldHVybiggKGZlYXR1cmUgJiBGRUFUVVJFX0NPTlNUX0tJTkQpICE9IDAgKTsKKwl9CisKKwlpbmxpbmUgTW9kaWZpZXIgJiBzZXRGZWF0dXJlQ29uc3QoYm9vbCBiRmVhdHVyZUNvbnN0ID0gdHJ1ZSkKKwl7CisJCWlmKCBiRmVhdHVyZUNvbnN0ICkKKwkJeworCQkJZmVhdHVyZSB8PSBGRUFUVVJFX0NPTlNUX0tJTkQ7CisJCX0KKwkJZWxzZQorCQl7CisJCQlmZWF0dXJlICY9ICh+IEZFQVRVUkVfQ09OU1RfS0lORCk7CisJCX0KKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBoYXNGZWF0dXJlTXV0YWJsZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIChmZWF0dXJlICYgRkVBVFVSRV9GSU5BTF9LSU5EKSA9PSAwICk7CisJfQorCisJaW5saW5lIE1vZGlmaWVyICYgc2V0RmVhdHVyZU11dGFibGUoYm9vbCBiRmVhdHVyZU11dGFibGUgPSB0cnVlKQorCXsKKwkJaWYoIGJGZWF0dXJlTXV0YWJsZSApCisJCXsKKwkJCWZlYXR1cmUgJj0gKH4gRkVBVFVSRV9GSU5BTF9LSU5EKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWZlYXR1cmUgfD0gRkVBVFVSRV9GSU5BTF9LSU5EOworCQl9CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogInN0YXRpYyIgZmVhdHVyZQorCSAqLworCWlubGluZSBib29sIGhhc0ZlYXR1cmVTdGF0aWMoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAoZmVhdHVyZSAmIEZFQVRVUkVfU1RBVElDX0tJTkQpICE9IDAgKTsKKwl9CisKKwlpbmxpbmUgTW9kaWZpZXIgJiBzZXRGZWF0dXJlU3RhdGljKGJvb2wgYkZlYXR1cmVTdGF0aWMgPSB0cnVlKQorCXsKKwkJaWYoIGJGZWF0dXJlU3RhdGljICkKKwkJeworCQkJZmVhdHVyZSB8PSBGRUFUVVJFX1NUQVRJQ19LSU5EOworCQl9CisJCWVsc2UKKwkJeworCQkJZmVhdHVyZSAmPSAofiBGRUFUVVJFX1NUQVRJQ19LSU5EKTsKKwkJfQorCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKworCS8qKgorCSAqIEFMSUFTCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogImZpbmFsIHN0YXRpYyIgbW9kaWZpZXIKKwkgKi8KKwlpbmxpbmUgYm9vbCBoYXNGZWF0dXJlRmluYWxTdGF0aWMoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAoZmVhdHVyZSAmIEZFQVRVUkVfRklOQUxfU1RBVElDX0tJTkQpID09CisJCQkJCUZFQVRVUkVfRklOQUxfU1RBVElDX0tJTkQgKTsKKwl9CisKKwlpbmxpbmUgTW9kaWZpZXIgJiBzZXRGZWF0dXJlRmluYWxTdGF0aWMoYm9vbCBiRmVhdHVyZUZpbmFsU3RhdGljID0gdHJ1ZSkKKwl7CisJCWlmKCBiRmVhdHVyZUZpbmFsU3RhdGljICkKKwkJeworCQkJZmVhdHVyZSB8PSBGRUFUVVJFX0ZJTkFMX1NUQVRJQ19LSU5EOworCQl9CisJCWVsc2UKKwkJeworCQkJZmVhdHVyZSAmPSAofiBGRUFUVVJFX0ZJTkFMX1NUQVRJQ19LSU5EKTsKKwkJfQorCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqICJ0cmFuc2llbnQiIGZlYXR1cmUKKwkgKi8KKwlpbmxpbmUgYm9vbCBoYXNGZWF0dXJlVHJhbnNpZW50KCkgY29uc3QKKwl7CisJCXJldHVybiggKGZlYXR1cmUgJiBGRUFUVVJFX1RSQU5TSUVOVF9LSU5EKSAhPSAwICk7CisJfQorCisJaW5saW5lIGJvb2wgbm9GZWF0dXJlVHJhbnNpZW50KCkgY29uc3QKKwl7CisJCXJldHVybiggKGZlYXR1cmUgJiBGRUFUVVJFX1RSQU5TSUVOVF9LSU5EKSA9PSAwICk7CisJfQorCisJaW5saW5lIE1vZGlmaWVyICYgc2V0RmVhdHVyZVRyYW5zaWVudChib29sIGJGZWF0dXJlVHJhbnNpZW50ID0gdHJ1ZSkKKwl7CisJCWlmKCBiRmVhdHVyZVRyYW5zaWVudCApCisJCXsKKwkJCWZlYXR1cmUgfD0gRkVBVFVSRV9UUkFOU0lFTlRfS0lORDsKKwkJfQorCQllbHNlCisJCXsKKwkJCWZlYXR1cmUgJj0gKH4gRkVBVFVSRV9UUkFOU0lFTlRfS0lORCk7CisJCX0KKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAidm9sYXRpbGUiIGZlYXR1cmUKKwkgKi8KKwlpbmxpbmUgYm9vbCBoYXNGZWF0dXJlVm9sYXRpbGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAoZmVhdHVyZSAmIEZFQVRVUkVfVk9MQVRJTEVfS0lORCkgIT0gMCApOworCX0KKworCWlubGluZSBib29sIGhhc0ZlYXR1cmVWb2xhdGlsZShjb25zdCBNb2RpZmllciAmIG1hc2spIGNvbnN0CisJeworCQlyZXR1cm4oICgoZmVhdHVyZSB8IG1hc2suZmVhdHVyZSkgJiBGRUFUVVJFX1ZPTEFUSUxFX0tJTkQpICE9IDAgKTsKKwl9CisKKwlpbmxpbmUgTW9kaWZpZXIgJiBzZXRGZWF0dXJlVm9sYXRpbGUoYm9vbCBiRmVhdHVyZVZvbGF0aWxlID0gdHJ1ZSkKKwl7CisJCWlmKCBiRmVhdHVyZVZvbGF0aWxlICkKKwkJeworCQkJZmVhdHVyZSB8PSBGRUFUVVJFX1ZPTEFUSUxFX0tJTkQ7CisJCX0KKwkJZWxzZQorCQl7CisJCQlmZWF0dXJlICY9ICh+IEZFQVRVUkVfVk9MQVRJTEVfS0lORCk7CisJCX0KKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAidW5zYWZlIiBmZWF0dXJlCisJICovCisJaW5saW5lIGJvb2wgaGFzRmVhdHVyZVVuc2FmZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIChmZWF0dXJlICYgRkVBVFVSRV9VTlNBRkVfS0lORCkgIT0gMCApOworCX0KKworCWlubGluZSBNb2RpZmllciAmIHNldEZlYXR1cmVVbnNhZmUoYm9vbCBiRmVhdHVyZVVuc2FmZSA9IHRydWUpCisJeworCQlpZiggYkZlYXR1cmVVbnNhZmUgKQorCQl7CisJCQlmZWF0dXJlIHw9IEZFQVRVUkVfVU5TQUZFX0tJTkQ7CisJCX0KKwkJZWxzZQorCQl7CisJCQlmZWF0dXJlICY9ICh+IEZFQVRVUkVfVU5TQUZFX0tJTkQpOworCQl9CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCisJaW5saW5lIGJvb2wgaGFzRmVhdHVyZVNhZmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAoZmVhdHVyZSAmIEZFQVRVUkVfVU5TQUZFX0tJTkQpID09IDAgKTsKKwl9CisKKwlpbmxpbmUgTW9kaWZpZXIgJiBzZXRGZWF0dXJlU2FmZShib29sIGJGZWF0dXJlU2FmZSA9IHRydWUpCisJeworCQlpZiggYkZlYXR1cmVTYWZlICkKKwkJeworCQkJZmVhdHVyZSAmPSAofiBGRUFUVVJFX1VOU0FGRV9LSU5EKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWZlYXR1cmUgfD0gRkVBVFVSRV9VTlNBRkVfS0lORDsKKwkJfQorCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBNSVgtSU4gTU9ESUZJRVIKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkvKioKKwkgKiBIWUJSSUQgQUxJQVMKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAicHVibGljIGZpbmFsIHN0YXRpYyIgbW9kaWZpZXIKKwkgKi8KKwlpbmxpbmUgYm9vbCBoYXNNb2RpZmllclB1YmxpY0ZpbmFsU3RhdGljKCkgY29uc3QKKwl7CisJCXJldHVybiggaXNWaXNpYmlsaXR5UHVibGljKCkKKwkJCQkmJiBoYXNGZWF0dXJlRmluYWxTdGF0aWMoKSApOworCX0KKworCWlubGluZSBNb2RpZmllciAmIHNldE1vZGlmaWVyUHVibGljRmluYWxTdGF0aWMoKQorCXsKKwkJc2V0VmlzaWJpbGl0eVB1YmxpYygpOworCisJCXNldEZlYXR1cmVGaW5hbFN0YXRpYygpOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKworCWlubGluZSBib29sIGhhc01vZGlmaWVyUHVibGljRmluYWxTdGF0aWNQYXJhbWV0ZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBpc1Zpc2liaWxpdHlQdWJsaWMoKQorCQkJCSYmIGhhc0ZlYXR1cmVGaW5hbFN0YXRpYygpCisJCQkJJiYgaGFzTmF0dXJlUGFyYW1ldGVyKCkgKTsKKwl9CisKKwlpbmxpbmUgTW9kaWZpZXIgJiBzZXRNb2RpZmllclB1YmxpY0ZpbmFsU3RhdGljUGFyYW1ldGVyKCkKKwl7CisJCXNldFZpc2liaWxpdHlQdWJsaWMoKTsKKworCQlzZXRNb2RpZmllclB1YmxpY0ZpbmFsU3RhdGljKCk7CisKKwkJc2V0TmF0dXJlUGFyYW1ldGVyKCB0cnVlICk7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCisJLyoqCisJICogSFlCUklEIEFMSUFTCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogInB1YmxpYyB2b2xhdGlsZSIgbW9kaWZpZXIKKwkgKi8KKwlpbmxpbmUgYm9vbCBoYXNNb2RpZmllclB1YmxpY1ZvbGF0aWxlKCkgY29uc3QKKwl7CisJCXJldHVybiggaXNWaXNpYmlsaXR5UHVibGljKCkKKwkJCQkmJiBoYXNGZWF0dXJlVm9sYXRpbGUoKSApOworCX0KKworCWlubGluZSBNb2RpZmllciAmIHNldE1vZGlmaWVyUHVibGljVm9sYXRpbGUoKQorCXsKKwkJc2V0VmlzaWJpbGl0eVB1YmxpYygpOworCisJCXNldEZlYXR1cmVWb2xhdGlsZSggdHJ1ZSApOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKworCS8qKgorCSAqIEFMSUFTCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogInJlZmVyZW5jZSIgLCAibWFjcm8iICwgZmluYWwgbW9kaWZpZXIKKwkgKi8KKwlpbmxpbmUgYm9vbCBhbnlNb2RpZmllckZpbmFsUmVmZXJlbmNlTWFjcm8oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBoYXNGZWF0dXJlRmluYWwoKQorCQkJCXx8IGFueU5hdHVyZVJlZmVyZW5jZU1hY3JvKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBub25lTW9kaWZpZXJGaW5hbFJlZmVyZW5jZU1hY3JvKCkgY29uc3QKKwl7CisJCXJldHVybiggbm9GZWF0dXJlRmluYWwoKQorCQkJCSYmIG5vbmVOYXR1cmVSZWZlcmVuY2VNYWNybygpICk7CisJfQorCisKKwkvKioKKwkgKiBBTElBUworCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqICJyZWZlcmVuY2UiICwgIm1hY3JvIiAsICJ0cmFuc2llbnQiIG1vZGlmaWVyCisJICovCisJaW5saW5lIGJvb2wgYW55TW9kaWZpZXJUcmFuc2llbnRSZWZlcmVuY2VNYWNybygpIGNvbnN0CisJeworCQlyZXR1cm4oIGhhc0ZlYXR1cmVUcmFuc2llbnQoKQorCQkJCXx8IGFueU5hdHVyZVJlZmVyZW5jZU1hY3JvKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBub25lTW9kaWZpZXJUcmFuc2llbnRSZWZlcmVuY2VNYWNybygpIGNvbnN0CisJeworCQlyZXR1cm4oIG5vRmVhdHVyZVRyYW5zaWVudCgpCisJCQkJJiYgbm9uZU5hdHVyZVJlZmVyZW5jZU1hY3JvKCkgKTsKKwl9CisKKworCisJLyoqCisJICogQUxJQVMKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAiYmluZCByZXR1cm4iIG1vZGlmaWVyCisJICovCisJaW5saW5lIGJvb2wgaGFzTW9kaWZpZXJSZXR1cm5CaW5kKCkgY29uc3QKKwl7CisJCXJldHVybiggaXNEaXJlY3Rpb25SZXR1cm4oKQorCQkJCSYmIGhhc05hdHVyZUJpbmQoKSApOworCX0KKworCWlubGluZSBNb2RpZmllciAmIHNldE1vZGlmaWVyUmV0dXJuQmluZCgpCisJeworCQlzZXREaXJlY3Rpb25SZXR1cm4oKTsKKworCQlzZXROYXR1cmVCaW5kKCB0cnVlICk7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCS8qKgorCSAqIEFMSUFTCisJICogVEVTVAorCSAqIGZvciBzdGF0ZSBkYXRhIHZhciBtb2RpZmllcgorCSAqICJyZWZlcmVuY2UiICwgIm1hY3JvIiAsICJ0cmFuc2llbnQiICwgInBhcmFtZXRlciIgLCAicmV0dXJuIgorCSAqLworCWJvb2wgYW55TW9kaWZpZXJPZlN0YXRlRGF0YSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG5vRmVhdHVyZVRyYW5zaWVudCgpCisJCQkJJiYgbm9uZU5hdHVyZVBhcmFtZXRlclJlZmVyZW5jZU1hY3JvKCkgKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLyoqCisJICogU2VyaWFsaXphdGlvbgorCSAqLworCXN0YXRpYyBzdGQ6OnN0cmluZyBzdHJWaXNpYmlsaXR5KGJpdF9maWVsZF90IHZpc2liaWxpdHlLaW5kLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBzZXBhcmF0b3IgPSAiICIpOworCisJc3RhdGljIHN0ZDo6c3RyaW5nIHhzdHJWaXNpYmlsaXR5KGJpdF9maWVsZF90IGRpcmVjdGlvbktpbmQsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIHNlcGFyYXRvciA9ICIgIik7CisKKworCXN0YXRpYyBzdGQ6OnN0cmluZyBzdHJEaXJlY3Rpb24oYml0X2ZpZWxkX3QgZGlyZWN0aW9uS2luZCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgc2VwYXJhdG9yID0gIiAiKTsKKworCisJc3RhdGljIHN0ZDo6c3RyaW5nIHhzdHJEaXJlY3Rpb24oYml0X2ZpZWxkX3QgZGlyZWN0aW9uS2luZCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgc2VwYXJhdG9yID0gIiAiKTsKKworCXN0YXRpYyBNb2RpZmllcjo6RElSRUNUSU9OX0tJTkQgdG9EaXJlY3Rpb25LaW5kKGNvbnN0IHN0ZDo6c3RyaW5nICYgaWQpOworCisJc3RhdGljIHN0ZDo6c3RyaW5nIHN0ckZlYXR1cmUoYml0X2ZpZWxkX3QgZmVhdHVyZUtpbmQsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIHNlcGFyYXRvciA9ICIgIik7CisKKwlzdGF0aWMgc3RkOjpzdHJpbmcgc3RyTmF0dXJlKGJpdF9maWVsZF90IG5hdHVyZUtpbmQsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIHNlcGFyYXRvciA9ICIgIik7CisKKworCXN0ZDo6c3RyaW5nIHRvU3RyaW5nKGJpdF9maWVsZF90IGVuYWJsZWRGaWVsZHMgPSBFTkFCTEVfQUxMX0ZJRUxEUywKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgc2VwYXJhdG9yID0gIiAiKSBjb25zdDsKKworCWlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmIHNlcGFyYXRvcikgY29uc3QKKwl7CisJCXJldHVybiggdG9TdHJpbmcoIEVOQUJMRV9BTExfRklFTERTICwgc2VwYXJhdG9yKSApOworCX0KKworCWlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZ19ub3QoRElSRUNUSU9OX0tJTkQgZGlyZWN0aW9uS2luZCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgc2VwYXJhdG9yID0gIiAiKSBjb25zdAorCXsKKwkJaWYoIGlzRGlyZWN0aW9uS2luZChkaXJlY3Rpb25LaW5kKSApCisJCXsKKwkJCU1vZGlmaWVyIG1kZnIoICp0aGlzICk7CisKKwkJCXJldHVybiggbWRmci51bnNldERpcmVjdGlvbktpbmQoKS50b1N0cmluZyhzZXBhcmF0b3IpICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4oIHRvU3RyaW5nKHNlcGFyYXRvcikgKTsKKwkJfQorCX0KKworCWlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZ19ub3QoTkFUVVJFX0tJTkQgbmF0dXJlS2luZCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgc2VwYXJhdG9yID0gIiAiKSBjb25zdAorCXsKKwkJaWYoIGhhc05hdHVyZUtpbmQobmF0dXJlS2luZCkgKQorCQl7CisJCQlNb2RpZmllciBtZGZyKCAqdGhpcyApOworCisJCQlyZXR1cm4oIG1kZnIucmVtTmF0dXJlS2luZChuYXR1cmVLaW5kKS50b1N0cmluZyhzZXBhcmF0b3IpICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4oIHRvU3RyaW5nKHNlcGFyYXRvcikgKTsKKwkJfQorCX0KKworCWlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZ19ub3QoRkVBVFVSRV9LSU5EIGZlYXR1cmVLaW5kLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBzZXBhcmF0b3IgPSAiICIpIGNvbnN0CisJeworCQlpZiggaGFzRmVhdHVyZUtpbmQoZmVhdHVyZUtpbmQpICkKKwkJeworCQkJTW9kaWZpZXIgbWRmciggKnRoaXMgKTsKKworCQkJcmV0dXJuKCBtZGZyLnJlbUZlYXR1cmVLaW5kKGZlYXR1cmVLaW5kKS50b1N0cmluZyhzZXBhcmF0b3IpICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4oIHRvU3RyaW5nKHNlcGFyYXRvcikgKTsKKwkJfQorCX0KKworCit9OworCisKKy8vb3N0cmVhbSAmIG9wZXJhdG9yPDwob3N0cmVhbSAmIG9zLCBjb25zdCBNb2RpZmllciAmIGFNb2RpZmllcikKKy8veworLy8Jb3MgIDw8IE1vZGlmaWVyOjpzdHJWaXNpYmlsaXR5KCBhTW9kaWZpZXIudmlzaWJpbGl0eSApCisvLwkJPDwgTW9kaWZpZXI6OnN0ckRpcmVjdGlvbiggIGFNb2RpZmllci5kaXJlY3Rpb24gKQorLy8JCTw8IE1vZGlmaWVyOjpzdHJGZWF0dXJlKCAgYU1vZGlmaWVyLmZlYXR1cmUgKQorLy8JCTw8IE1vZGlmaWVyOjpzdHJOYXR1cmUoICBhTW9kaWZpZXIubmF0dXJlICk7CisvLworLy8JcmV0dXJuKCBvcyApOworLy99CisKKworLyoqCisgKiBNb2RpZmllciBJbXBsZW1lbnRhdGlvbgorICovCitjbGFzcyBNb2RpZmllckltcGwKK3sKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlNb2RpZmllciBtTW9kaWZpZXI7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICovCisJTW9kaWZpZXJJbXBsKCkKKwk6IG1Nb2RpZmllciggKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJTW9kaWZpZXJJbXBsKGNvbnN0IE1vZGlmaWVyICYgYU1vZGlmaWVyKQorCTogbU1vZGlmaWVyKCBhTW9kaWZpZXIgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJTW9kaWZpZXJJbXBsKGNvbnN0IE1vZGlmaWVySW1wbCAmIGFDb3B5KQorCTogbU1vZGlmaWVyKCBhQ29weS5tTW9kaWZpZXIgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJTW9kaWZpZXJJbXBsKGNvbnN0IE1vZGlmaWVySW1wbCAqIGFDb3B5KQorCTogbU1vZGlmaWVyKCAoYUNvcHkgIT0gTlVMTCkgPworCQkJYUNvcHktPm1Nb2RpZmllciA6IE1vZGlmaWVyOjpQUk9QRVJUWV9VTkRFRklORURfTU9ESUZJRVIgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJfk1vZGlmaWVySW1wbCgpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIG1Nb2RpZmllcgorCSAqLworCWlubGluZSBjb25zdCBNb2RpZmllciAmIGdldE1vZGlmaWVyKCkgY29uc3QKKwl7CisJCXJldHVybiggbU1vZGlmaWVyICk7CisJfQorCisJaW5saW5lIE1vZGlmaWVyICYgZ2V0d01vZGlmaWVyKCkKKwl7CisJCXJldHVybiggbU1vZGlmaWVyICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzTW9kaWZpZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtTW9kaWZpZXIgIT0gTW9kaWZpZXI6OlBST1BFUlRZX1VOREVGSU5FRF9NT0RJRklFUiApOworCX0KKworCWlubGluZSB2b2lkIHNldE1vZGlmaWVyKGNvbnN0IE1vZGlmaWVyICYgYU1vZGlmaWVyKQorCXsKKwkJbU1vZGlmaWVyID0gYU1vZGlmaWVyOworCX0KKworfTsKKworCit9CisKKyNlbmRpZiAvKiBNT0RJRklFUkVMRU1FTlRfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9jb21tb24vT2JqZWN0Q2xhc3NpZmllci5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvY29tbW9uL09iamVjdENsYXNzaWZpZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYzc4NGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvY29tbW9uL09iamVjdENsYXNzaWZpZXIuY3BwCkBAIC0wLDAgKzEsMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyMSBmw6l2ci4gMjAxNworICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIEltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiT2JqZWN0Q2xhc3NpZmllci5oIgorCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL01hY2hpbmUuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworY29uc3QgTWFjaGluZSAqIE9iamVjdENsYXNzaWZpZXI6OmdldENvbnRhaW5lck1hY2hpbmUoKSBjb25zdAoreworCXJldHVybiggbUNvbnRhaW5lci0+YXM8IE1hY2hpbmUgPigpICk7Cit9CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvY29tbW9uL09iamVjdENsYXNzaWZpZXIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9jb21tb24vT2JqZWN0Q2xhc3NpZmllci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NDBkZTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvY29tbW9uL09iamVjdENsYXNzaWZpZXIuaApAQCAtMCwwICsxLDk0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjEgZsOpdnIuIDIwMTcKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBJbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBGTUxfQ09NTU9OX09CSkVDVF9DTEFTU0lGSUVSX0hfCisjZGVmaW5lIEZNTF9DT01NT05fT0JKRUNUX0NMQVNTSUZJRVJfSF8KKworI2luY2x1ZGUgPGNvbW1vbi9OYW1lZEVsZW1lbnQuaD4KKyNpbmNsdWRlIDxmbWwvY29tbW9uL1RyYWNlYWJsZUVsZW1lbnQuaD4KKworI2luY2x1ZGUgPGJhc2UvQ2xhc3NLaW5kSW5mby5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworY2xhc3MgTWFjaGluZTsKK2NsYXNzIE9iamVjdEVsZW1lbnQ7CisKKworY2xhc3MgT2JqZWN0Q2xhc3NpZmllciA6CisJCXB1YmxpYyBOYW1lZEVsZW1lbnQgLAorCQlwdWJsaWMgVHJhY2VhYmxlRWxlbWVudCwKKwkJQVZNX0lOSkVDVF9JTlNUQU5DRV9DT1VOVEVSX0NMQVNTKCBPYmplY3RDbGFzc2lmaWVyICkKK3sKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlPYmplY3RFbGVtZW50ICogbUNvbnRhaW5lcjsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJT2JqZWN0Q2xhc3NpZmllcihjbGFzc19raW5kX3QgYUNsYXNzS2luZCwKKwkJCU9iamVjdEVsZW1lbnQgKiBhQ29udGFpbmVyLCBjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpCisJOiBOYW1lZEVsZW1lbnQoIGFDbGFzc0tpbmQgLCBhTmFtZUlEICwgYU5hbWVJRCAsIGFOYW1lSUQgKSwKKwlUcmFjZWFibGVFbGVtZW50KCApLAorCW1Db250YWluZXIoIGFDb250YWluZXIgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfk9iamVjdENsYXNzaWZpZXIoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtQ29udGFpbmVyCisJICovCisJaW5saW5lIE9iamVjdEVsZW1lbnQgKiBnZXRDb250YWluZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQ29udGFpbmVyICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzQ29udGFpbmVyKCkgY29uc3QKKwl7CisJCXJldHVybiggbUNvbnRhaW5lciAhPSBOVUxMICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0Q29udGFpbmVyKE9iamVjdEVsZW1lbnQgKiBhQ29udGFpbmVyKQorCXsKKwkJbUNvbnRhaW5lciA9IGFDb250YWluZXI7CisJfQorCisJY29uc3QgTWFjaGluZSAqIGdldENvbnRhaW5lck1hY2hpbmUoKSBjb25zdDsKKworCit9OworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qIEZNTF9DT01NT05fT0JKRUNUX0NMQVNTSUZJRVJfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9jb21tb24vT2JqZWN0RWxlbWVudC5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvY29tbW9uL09iamVjdEVsZW1lbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NDJmZGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvY29tbW9uL09iamVjdEVsZW1lbnQuY3BwCkBAIC0wLDAgKzEsOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJPYmplY3RFbGVtZW50LmgiCisKKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvTWFjaGluZS5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9QYWNrYWdlLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKworLyoKKyAqIEFUVFJJQlVURVMKKyAqLworYm9vbCBPYmplY3RFbGVtZW50OjpVU0VfT05MWV9JRCA9IGZhbHNlOworCisKKy8qKgorICogVVRJTAorICogcmV0dXJuIDxjb250YWluZXItZnVsbHktcXVsaWZpZWQtbmFtZS1pZD4uPG5hbWUtaWQ+CisgKi8KK3N0ZDo6c3RyaW5nIE9iamVjdEVsZW1lbnQ6Om1ha2VGdWxseVF1YWxpZmllZE5hbWVJRCgKKwkJY29uc3QgT2JqZWN0RWxlbWVudCAqIGFDb250YWluZXIsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkKK3sKKwlpZiggYUNvbnRhaW5lciA9PSBOVUxMICkKKwl7CisJCXJldHVybiggRlFOX0lEX1JPT1RfU0VQQVJBVE9SICsgYU5hbWVJRCApOworCX0KKy8vCWVsc2UgaWYoIGFDb250YWluZXItPmlzPCBTeXN0ZW0gPigpICkKKy8vCXsKKy8vCQlyZXR1cm4oICJzcGVjOjoiICsgaWQgKTsKKy8vCX0KKy8vCWVsc2UgaWYoIGFDb250YWluZXItPmlzPCBQYWNrYWdlID4oKSApCisvLwl7CisvLwkJcmV0dXJuKCAibGliOjoiICsgYU5hbWVJRCApOworLy8JfQorCWVsc2UKKwl7CisJCXJldHVybiggYUNvbnRhaW5lci0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSArICIuIiArIGFOYW1lSUQgKTsKKwl9Cit9CisKKy8qKgorICogR0VUVEVSCisgKiB0aGUgZmlyc3QgTWFjaGluZSBjb250YWluZXIKKyAqLworTWFjaGluZSAqIE9iamVjdEVsZW1lbnQ6OmdldENvbnRhaW5lck1hY2hpbmUoKSBjb25zdAoreworCU9iamVjdEVsZW1lbnQgKiBjb250YWluZXIgPSBnZXRDb250YWluZXIoKTsKKwlmb3IoIDsgY29udGFpbmVyICE9IE5VTEwgOyBjb250YWluZXIgPSBjb250YWluZXItPmdldENvbnRhaW5lcigpICkKKwl7CisJCWlmKCBjb250YWluZXItPmlzPCBNYWNoaW5lID4oKSApCisJCXsKKwkJCXJldHVybiggY29udGFpbmVyLT50bzwgTWFjaGluZSA+KCkgKTsKKwkJfQorCX0KKworCXJldHVybiggTlVMTCApOworfQorCisvKioKKyAqIEdFVFRFUgorICogdGhlIGZpcnN0IFByb3BlcnR5RWxlbWVudCBjb250YWluZXIKKyAqLworUHJvcGVydHlFbGVtZW50ICogT2JqZWN0RWxlbWVudDo6Z2V0Q29udGFpbmVyUHJvcGVydHkoKSBjb25zdAoreworCU9iamVjdEVsZW1lbnQgKiBjb250YWluZXIgPSBnZXRDb250YWluZXIoKTsKKwlmb3IoIDsgY29udGFpbmVyICE9IE5VTEwgOyBjb250YWluZXIgPSBjb250YWluZXItPmdldENvbnRhaW5lcigpICkKKwl7CisJCWlmKCBjb250YWluZXItPmlzPCBQcm9wZXJ0eUVsZW1lbnQgPigpICkKKwkJeworCQkJcmV0dXJuKCBjb250YWluZXItPnRvPCBQcm9wZXJ0eUVsZW1lbnQgPigpICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIE5VTEwgKTsKK30KKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvY29tbW9uL09iamVjdEVsZW1lbnQuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9jb21tb24vT2JqZWN0RWxlbWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllN2Q5NWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvY29tbW9uL09iamVjdEVsZW1lbnQuaApAQCAtMCwwICsxLDMzNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBGTUxfQ09NTU9OX09CSkVDVEVMRU1FTlRfSF8KKyNkZWZpbmUgRk1MX0NPTU1PTl9PQkpFQ1RFTEVNRU5UX0hfCisKKyNpbmNsdWRlIDxjb21tb24vTmFtZWRFbGVtZW50Lmg+CisjaW5jbHVkZSA8Zm1sL2NvbW1vbi9Nb2RpZmllckVsZW1lbnQuaD4KKyNpbmNsdWRlIDxmbWwvY29tbW9uL1RyYWNlYWJsZUVsZW1lbnQuaD4KKworI2luY2x1ZGUgPGJhc2UvQ2xhc3NLaW5kSW5mby5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworY2xhc3MgTWFjaGluZTsKK2NsYXNzIE1vZGlmaWVyOworY2xhc3MgUHJvcGVydHlFbGVtZW50OworY2xhc3MgV09iamVjdDsKKworCisjZGVmaW5lICBERUJVR19NRU1PUllfTkVXICAgQVZNX09TX0RFQlVHIDw8ICJuZXc6PiAiIFwKKwkJPDwgcmF3X2FkZHJlc3MoKSA8PCAiIDogIiA8PCBzdHJIZWFkZXIoKSA8PCBzdGQ6OmVuZGw7CisKKyNkZWZpbmUgIERFQlVHX01FTU9SWV9ERUwgICBBVk1fT1NfREVCVUcgPDwgImRlbDo+ICIgXAorCQk8PCByYXdfYWRkcmVzcygpIDw8ICIgOiAiIDw8IHN0ckhlYWRlcigpIDw8IHN0ZDo6ZW5kbDsKKworCitjbGFzcyBPYmplY3RFbGVtZW50IDoKKwkJcHVibGljIE5hbWVkRWxlbWVudCAsCisJCXB1YmxpYyBNb2RpZmllckltcGwsCisJCXB1YmxpYyBUcmFjZWFibGVFbGVtZW50LAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIE9iamVjdEVsZW1lbnQgKQoreworCisJLyoKKwkgKiBBVFRSSUJVVEVTCisJICovCisJc3RhdGljIGJvb2wgVVNFX09OTFlfSUQ7CisKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlPYmplY3RFbGVtZW50ICogbUNvbnRhaW5lcjsKKworCVdPYmplY3QgKiBtV09iamVjdDsKKworCWF2bV9vZmZzZXRfdCBtT2Zmc2V0OworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlPYmplY3RFbGVtZW50KGNsYXNzX2tpbmRfdCBhQ2xhc3NLaW5kLCBPYmplY3RFbGVtZW50ICogYUNvbnRhaW5lciwKKwkJCWNvbnN0IE1vZGlmaWVyICYgYU1vZGlmaWVyID0gTW9kaWZpZXI6OlBST1BFUlRZX1VOREVGSU5FRF9NT0RJRklFUikKKwk6IE5hbWVkRWxlbWVudCggYUNsYXNzS2luZCApLAorCU1vZGlmaWVySW1wbCggYU1vZGlmaWVyICksCisJVHJhY2VhYmxlRWxlbWVudCggKSwKKwltQ29udGFpbmVyKCBhQ29udGFpbmVyICksCisJbVdPYmplY3QoIE5VTEwgKSwKKwltT2Zmc2V0KCAwICkKKwl7CisJCS8vISEgREVCVUdfTUVNT1JZX05FVzsKKwl9CisKKworCU9iamVjdEVsZW1lbnQoY2xhc3Nfa2luZF90IGFDbGFzc0tpbmQsIE9iamVjdEVsZW1lbnQgKiBhQ29udGFpbmVyLAorCQkJY29uc3QgTW9kaWZpZXIgJiBhTW9kaWZpZXIsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkKKwk6IE5hbWVkRWxlbWVudCggYUNsYXNzS2luZCAsIGFGdWxseVF1YWxpZmllZE5hbWVJRCwgYU5hbWVJRCApLAorCU1vZGlmaWVySW1wbCggYU1vZGlmaWVyICksCisJVHJhY2VhYmxlRWxlbWVudCggKSwKKwltQ29udGFpbmVyKCBhQ29udGFpbmVyICksCisJbVdPYmplY3QoIE5VTEwgKSwKKwltT2Zmc2V0KCAwICkKKwl7CisJCS8vISEgREVCVUdfTUVNT1JZX05FVzsKKwl9CisKKwlPYmplY3RFbGVtZW50KGNsYXNzX2tpbmRfdCBhQ2xhc3NLaW5kLCBPYmplY3RFbGVtZW50ICogYUNvbnRhaW5lciwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlELAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhblVucmVzdHJpY3RlZE5hbWUpCisJOiBOYW1lZEVsZW1lbnQoIGFDbGFzc0tpbmQgLAorCQkJYUZ1bGx5UXVhbGlmaWVkTmFtZUlELCBhTmFtZUlEICwgYW5VbnJlc3RyaWN0ZWROYW1lICksCisJTW9kaWZpZXJJbXBsKCApLAorCVRyYWNlYWJsZUVsZW1lbnQoICksCisJbUNvbnRhaW5lciggYUNvbnRhaW5lciApLAorCW1XT2JqZWN0KCBOVUxMICksCisJbU9mZnNldCggMCApCisJeworCQkvLyEhIERFQlVHX01FTU9SWV9ORVc7CisJfQorCisJT2JqZWN0RWxlbWVudChjbGFzc19raW5kX3QgYUNsYXNzS2luZCwgT2JqZWN0RWxlbWVudCAqIGFDb250YWluZXIsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkKKwk6IE5hbWVkRWxlbWVudCggYUNsYXNzS2luZCAsIGFGdWxseVF1YWxpZmllZE5hbWVJRCwgYU5hbWVJRCApLAorCU1vZGlmaWVySW1wbCggKSwKKwlUcmFjZWFibGVFbGVtZW50KCApLAorCW1Db250YWluZXIoIGFDb250YWluZXIgKSwKKwltV09iamVjdCggTlVMTCApLAorCW1PZmZzZXQoIDAgKQorCXsKKwkJLy8hISBERUJVR19NRU1PUllfTkVXOworCX0KKworCU9iamVjdEVsZW1lbnQoY2xhc3Nfa2luZF90IGFDbGFzc0tpbmQsCisJCQlPYmplY3RFbGVtZW50ICogYUNvbnRhaW5lciwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKQorCTogTmFtZWRFbGVtZW50KCBhQ2xhc3NLaW5kICwKKwkJCW1ha2VGdWxseVF1YWxpZmllZE5hbWVJRChhQ29udGFpbmVyLCBhTmFtZUlEKSAsCisJCQlhTmFtZUlEICwgYU5hbWVJRCApLAorCU1vZGlmaWVySW1wbCggKSwKKwlUcmFjZWFibGVFbGVtZW50KCApLAorCW1Db250YWluZXIoIGFDb250YWluZXIgKSwKKwltV09iamVjdCggTlVMTCApLAorCW1PZmZzZXQoIDAgKQorCXsKKwkJLy8hISBERUJVR19NRU1PUllfTkVXOworCX0KKworCU9iamVjdEVsZW1lbnQoY2xhc3Nfa2luZF90IGFDbGFzc0tpbmQsIE9iamVjdEVsZW1lbnQgKiBhQ29udGFpbmVyLAorCQkJY29uc3QgTW9kaWZpZXIgJiBhTW9kaWZpZXIsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkKKwk6IE5hbWVkRWxlbWVudCggYUNsYXNzS2luZCAsCisJCQltYWtlRnVsbHlRdWFsaWZpZWROYW1lSUQoYUNvbnRhaW5lciwgYU5hbWVJRCkgLAorCQkJYU5hbWVJRCAsIGFOYW1lSUQgKSwKKwlNb2RpZmllckltcGwoIGFNb2RpZmllciApLAorCVRyYWNlYWJsZUVsZW1lbnQoICksCisJbUNvbnRhaW5lciggYUNvbnRhaW5lciApLAorCW1XT2JqZWN0KCBOVUxMICksCisJbU9mZnNldCggMCApCisJeworCQkvLyEhIERFQlVHX01FTU9SWV9ORVc7CisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBVc2luZyBwYXR0ZXJuCisJICovCisJT2JqZWN0RWxlbWVudChjbGFzc19raW5kX3QgYUNsYXNzS2luZCwKKwkJCU9iamVjdEVsZW1lbnQgKiBhQ29udGFpbmVyLCBjb25zdCBPYmplY3RFbGVtZW50ICYgYVBhdHRlcm4pCisJOiBOYW1lZEVsZW1lbnQoIGFDbGFzc0tpbmQgLAorCQkJbWFrZUZ1bGx5UXVhbGlmaWVkTmFtZUlEKGFDb250YWluZXIsIGFQYXR0ZXJuLmdldE5hbWVJRCgpKSAsCisJCQlhUGF0dGVybi5nZXROYW1lSUQoKSAsIGFQYXR0ZXJuLmdldFVucmVzdHJpY3RlZE5hbWUoKSApLAorCU1vZGlmaWVySW1wbCggYVBhdHRlcm4uZ2V0TW9kaWZpZXIoKSApLAorCVRyYWNlYWJsZUVsZW1lbnQoICksCisJbUNvbnRhaW5lciggYUNvbnRhaW5lciApLAorCW1XT2JqZWN0KCBOVUxMICksCisJbU9mZnNldCggMCApCisJeworCQkvLyEhIERFQlVHX01FTU9SWV9ORVc7CisJfQorCisJT2JqZWN0RWxlbWVudChjbGFzc19raW5kX3QgYUNsYXNzS2luZCwgT2JqZWN0RWxlbWVudCAqIGFDb250YWluZXIsCisJCQljb25zdCBNb2RpZmllciAmIGFNb2RpZmllciwgY29uc3QgT2JqZWN0RWxlbWVudCAmIGFQYXR0ZXJuKQorCTogTmFtZWRFbGVtZW50KCBhQ2xhc3NLaW5kICwKKwkJCW1ha2VGdWxseVF1YWxpZmllZE5hbWVJRChhQ29udGFpbmVyLCBhUGF0dGVybi5nZXROYW1lSUQoKSkgLAorCQkJYVBhdHRlcm4uZ2V0TmFtZUlEKCkgLCBhUGF0dGVybi5nZXRVbnJlc3RyaWN0ZWROYW1lKCkgKSwKKwlNb2RpZmllckltcGwoIGFNb2RpZmllciApLAorCVRyYWNlYWJsZUVsZW1lbnQoICksCisJbUNvbnRhaW5lciggYUNvbnRhaW5lciApLAorCW1XT2JqZWN0KCBOVUxMICksCisJbU9mZnNldCggMCApCisJeworCQkvLyEhIERFQlVHX01FTU9SWV9ORVc7CisJfQorCisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIENvcHkKKwkgKi8KKwlPYmplY3RFbGVtZW50KGNvbnN0IE9iamVjdEVsZW1lbnQgJiBvYmpFbGVtZW50KQorCTogTmFtZWRFbGVtZW50KCBvYmpFbGVtZW50ICksCisJTW9kaWZpZXJJbXBsKCBvYmpFbGVtZW50ICksCisJVHJhY2VhYmxlRWxlbWVudCggb2JqRWxlbWVudCApLAorCW1Db250YWluZXIoIG9iakVsZW1lbnQubUNvbnRhaW5lciApLAorCW1XT2JqZWN0KCBvYmpFbGVtZW50Lm1XT2JqZWN0ICksCisJbU9mZnNldCggb2JqRWxlbWVudC5tT2Zmc2V0ICkKKwl7CisJCS8vISEgREVCVUdfTUVNT1JZX05FVzsKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5PYmplY3RFbGVtZW50KCkKKwl7CisJCS8vISEgREVCVUdfTUVNT1JZX0RFTDsKKwl9CisKKworCS8qKgorCSAqIFNFVFRFUgorCSAqIEZ1bGx5IFF1YWxpZmllZCBOYW1lIElEZW50aWZpZXIKKwkgKiBtRnVsbHlRdWFsaWZpZWROYW1lSUQKKwkgKiBtTmFtZUlECisJICovCisJdm9pZCB1cGRhdGVGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJeworCQltRnVsbHlRdWFsaWZpZWROYW1lSUQgPQorCQkJCW1ha2VGdWxseVF1YWxpZmllZE5hbWVJRChnZXRDb250YWluZXIoKSwgZ2V0TmFtZUlEKCkpOworCX0KKworCXZvaWQgZnVsbHlVcGRhdGVBbGxOYW1lSUQoY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKQorCXsKKwkJbUZ1bGx5UXVhbGlmaWVkTmFtZUlEID0KKwkJCQltYWtlRnVsbHlRdWFsaWZpZWROYW1lSUQoZ2V0Q29udGFpbmVyKCksIGFOYW1lSUQpOworCisJCW1OYW1lSUQgPSBhTmFtZUlEOworCX0KKworCisJLyoqCisJICogVVRJTAorCSAqIHJldHVybiA8Y29udGFpbmVyLWZ1bGx5LXF1bGlmaWVkLW5hbWUtaWQ+LjxuYW1lLWlkPgorCSAqLworCXN0YXRpYyBzdGQ6OnN0cmluZyBtYWtlRnVsbHlRdWFsaWZpZWROYW1lSUQoCisJCQljb25zdCBPYmplY3RFbGVtZW50ICogYUNvbnRhaW5lciwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKTsKKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUNvbnRhaW5lcgorCSAqLworCWlubGluZSBPYmplY3RFbGVtZW50ICogZ2V0Q29udGFpbmVyKCkgY29uc3QKKwl7CisJCXJldHVybiggbUNvbnRhaW5lciApOworCX0KKworCWlubGluZSBib29sIGhhc0NvbnRhaW5lcigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Db250YWluZXIgIT0gTlVMTCApOworCX0KKworCWlubGluZSB2b2lkIHNldENvbnRhaW5lcihPYmplY3RFbGVtZW50ICogYUNvbnRhaW5lcikKKwl7CisJCW1Db250YWluZXIgPSBhQ29udGFpbmVyOworCX0KKworCWlubGluZSB2b2lkIHVwZGF0ZUNvbnRhaW5lcihPYmplY3RFbGVtZW50ICogYUNvbnRhaW5lcikKKwl7CisJCW1Db250YWluZXIgPSBhQ29udGFpbmVyOworCisJCXVwZGF0ZUZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7CisJfQorCisJLyoKKwkgKiBVVElMCisJICogdGhlIGZpcnN0IHNwZWNpZmljIHR5cGUgY29udGFpbmVyCisJICovCisJdmlydHVhbCBNYWNoaW5lICogZ2V0Q29udGFpbmVyTWFjaGluZSgpIGNvbnN0OworCisJdmlydHVhbCBQcm9wZXJ0eUVsZW1lbnQgKiBnZXRDb250YWluZXJQcm9wZXJ0eSgpIGNvbnN0OworCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAiZGVzaWduIiBvZiBhIFVTRVIgRk9STQorCSAqLworCWlubGluZSBXT2JqZWN0ICogZ2V0V09iamVjdCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1XT2JqZWN0ICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzV09iamVjdCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1XT2JqZWN0ICE9IE5VTEwgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRXT2JqZWN0KFdPYmplY3QgKiB3Zk9iamVjdCkKKwl7CisJCW1XT2JqZWN0ID0gd2ZPYmplY3Q7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtT2Zmc2V0CisJICovCisJaW5saW5lIGF2bV9vZmZzZXRfdCBnZXRPZmZzZXQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtT2Zmc2V0ICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0T2Zmc2V0KGF2bV9vZmZzZXRfdCBhbk9mZnNldCkKKwl7CisJCW1PZmZzZXQgPSBhbk9mZnNldDsKKwl9CisKKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwlpbmxpbmUgdmlydHVhbCBzdGQ6OnN0cmluZyBzdHJIZWFkZXIoKSBjb25zdAorCXsKKwkJU3RyaW5nT3V0U3RyZWFtIG9zczsKKworCQlzdHJIZWFkZXIoIG9zcyApOworCisJCXJldHVybiggb3NzLnN0cigpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCBzdHJIZWFkZXIoT3V0U3RyZWFtICYgb3V0KSBjb25zdAorCXsKKwkJb3V0IDw8IGdldE1vZGlmaWVyKCkudG9TdHJpbmcoKSA8PCBnZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOworCisJCWlmKCBoYXNVbnJlc3RyaWN0ZWROYW1lKCkgKQorCQl7CisJCQlvdXQgPDwgIiAnIiA8PCBnZXRVbnJlc3RyaWN0ZWROYW1lKCkgPDwgIiciOworCQl9CisJfQorCit9OworCisKK30KKworI2VuZGlmIC8qRk1MX0NPTU1PTl9PQkpFQ1RFTEVNRU5UX0hfKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9jb21tb24vUHJvcGVydHlFbGVtZW50LmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9jb21tb24vUHJvcGVydHlFbGVtZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTBjYTZlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2NvbW1vbi9Qcm9wZXJ0eUVsZW1lbnQuY3BwCkBAIC0wLDAgKzEsMzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiA4IGF2ci4gMjAxNgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIEltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiUHJvcGVydHlFbGVtZW50LmgiCisKKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvTWFjaGluZS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitQcm9wZXJ0eUVsZW1lbnQ6OlByb3BlcnR5RWxlbWVudChjbGFzc19raW5kX3QgYUNsYXNzS2luZCwgTWFjaGluZSAqIGFDb250YWluZXIsCisJCWNvbnN0IE1vZGlmaWVyICYgYU1vZGlmaWVyLCBjb25zdCBQcm9wZXJ0eUVsZW1lbnQgJiBhUGF0dGVybikKKzogT2JqZWN0RWxlbWVudCggYUNsYXNzS2luZCAsIGFDb250YWluZXIgLCBhTW9kaWZpZXIgLCBhUGF0dGVybiApCit7CisJLy8hISBOT1RISU5HCit9CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvY29tbW9uL1Byb3BlcnR5RWxlbWVudC5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2NvbW1vbi9Qcm9wZXJ0eUVsZW1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDVlOTViCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2NvbW1vbi9Qcm9wZXJ0eUVsZW1lbnQuaApAQCAtMCwwICsxLDEwNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDggYXZyLiAyMDE2CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgSW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRk1MX0NPTU1PTl9QUk9QRVJUWUVMRU1FTlRfSF8KKyNkZWZpbmUgRk1MX0NPTU1PTl9QUk9QRVJUWUVMRU1FTlRfSF8KKworI2luY2x1ZGUgPGZtbC9jb21tb24vT2JqZWN0RWxlbWVudC5oPgorCisjaW5jbHVkZSA8YmFzZS9DbGFzc0tpbmRJbmZvLmg+CisKKyNpbmNsdWRlIDxjb21tb24vQXZtUG9pbnRlci5oPgorCisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBNYWNoaW5lOworY2xhc3MgTW9kaWZpZXI7CisKK2NsYXNzIFByb3BlcnR5RWxlbWVudCA6CisJCXB1YmxpYyBPYmplY3RFbGVtZW50LAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIFByb3BlcnR5RWxlbWVudCApCit7CisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlQcm9wZXJ0eUVsZW1lbnQoY2xhc3Nfa2luZF90IGFDbGFzc0tpbmQsIE9iamVjdEVsZW1lbnQgKiBhQ29udGFpbmVyLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYW5VbnJlc3RyaWN0ZWROYW1lKQorCTogT2JqZWN0RWxlbWVudCggYUNsYXNzS2luZCAsIGFDb250YWluZXIgLAorCQkJYUZ1bGx5UXVhbGlmaWVkTmFtZUlEICwgYU5hbWVJRCAsIGFuVW5yZXN0cmljdGVkTmFtZSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlQcm9wZXJ0eUVsZW1lbnQoY2xhc3Nfa2luZF90IGFDbGFzc0tpbmQsIE9iamVjdEVsZW1lbnQgKiBhQ29udGFpbmVyLAorCQkJY29uc3QgTW9kaWZpZXIgJiBhTW9kaWZpZXIsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkKKwk6IE9iamVjdEVsZW1lbnQoIGFDbGFzc0tpbmQgLCBhQ29udGFpbmVyICwgYU1vZGlmaWVyICwgYU5hbWVJRCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlQcm9wZXJ0eUVsZW1lbnQoY2xhc3Nfa2luZF90IGFDbGFzc0tpbmQsCisJCQlPYmplY3RFbGVtZW50ICogYUNvbnRhaW5lciwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKQorCTogT2JqZWN0RWxlbWVudCggYUNsYXNzS2luZCAsIGFDb250YWluZXIgLCBhTmFtZUlEICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBPdGhlcgorCSAqLworCVByb3BlcnR5RWxlbWVudChjbGFzc19raW5kX3QgYUNsYXNzS2luZCwKKwkJCVByb3BlcnR5RWxlbWVudCAqIGFDb250YWluZXIsIGNvbnN0IFByb3BlcnR5RWxlbWVudCAmIGFQYXR0ZXJuKQorCTogT2JqZWN0RWxlbWVudCggYUNsYXNzS2luZCAsIGFDb250YWluZXIgLCBhUGF0dGVybiApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlQcm9wZXJ0eUVsZW1lbnQoY2xhc3Nfa2luZF90IGFDbGFzc0tpbmQsIE1hY2hpbmUgKiBhQ29udGFpbmVyLAorCQkJY29uc3QgTW9kaWZpZXIgJiBhTW9kaWZpZXIsIGNvbnN0IFByb3BlcnR5RWxlbWVudCAmIGFQYXR0ZXJuKTsKKworCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJUHJvcGVydHlFbGVtZW50KGNvbnN0IFByb3BlcnR5RWxlbWVudCAmIGFQcm9wZXJ0eSkKKwk6IE9iamVjdEVsZW1lbnQoIGFQcm9wZXJ0eSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5Qcm9wZXJ0eUVsZW1lbnQoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCit9OworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworCisjZW5kaWYgLyogRk1MX0NPTU1PTl9QUk9QRVJUWUVMRU1FTlRfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9jb21tb24vUkVBRE1FLm1kIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2NvbW1vbi9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZiOGI5OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9jb21tb24vUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTMgQEAKKyMgRUZNLVNZTUJFWCA6IENvbW1vbgorCisjIyBTb3VyY2UgY29kZSBzdHJ1Y3R1cmUKKworIyMjIEludGVyZmFjZXMKKyogKipJQXN0KioKKyogKipJQ29tcGlsZWQqKgorKiAqKklSdW50aW1lKioKKworIyMjIENsYXNzZXMKKworIyMjIEZhY3RvcmllcworCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvY29tbW9uL1NwZWNpZmllckVsZW1lbnQuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2NvbW1vbi9TcGVjaWZpZXJFbGVtZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGNhZDU3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2NvbW1vbi9TcGVjaWZpZXJFbGVtZW50LmNwcApAQCAtMCwwICsxLDgwMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDIxIGF2ci4gMjAxNgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIEltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiU3BlY2lmaWVyRWxlbWVudC5oIgorCisjaW5jbHVkZSA8c3N0cmVhbT4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoqCisgKiBTVEFUSUMgRVhFQ1VUQUJMRSBTUEVDSUZJRVIKKyAqLworU3BlY2lmaWVyIFNwZWNpZmllcjo6RVhFQ1VUQUJMRV9VTkRFRklORURfU1BFQ0lGSUVSOworCitTcGVjaWZpZXIgU3BlY2lmaWVyOjpDT01QT05FTlRfUEFDS0FHRV9TUEVDSUZJRVIoCisJCVNwZWNpZmllcjo6Q09NUE9ORU5UX1VOREVGSU5FRF9LSU5EKTsvLypDT01QT05FTlRfUEFDS0FHRV9LSU5EKTsKKworU3BlY2lmaWVyIFNwZWNpZmllcjo6Q09NUE9ORU5UX1NZU1RFTV9TUEVDSUZJRVIoCisJCVNwZWNpZmllcjo6Q09NUE9ORU5UX1NZU1RFTV9LSU5EICk7CisKK1NwZWNpZmllciBTcGVjaWZpZXI6OkNPTVBPTkVOVF9FWEVDVVRBQkxFX1NQRUNJRklFUigKKwkJU3BlY2lmaWVyOjpDT01QT05FTlRfRVhFQ1VUQUJMRV9LSU5EICk7CisKK1NwZWNpZmllciBTcGVjaWZpZXI6OkNPTVBPTkVOVF9QUk9DRURVUkVfU1BFQ0lGSUVSKAorCQlTcGVjaWZpZXI6OkNPTVBPTkVOVF9QUk9DRURVUkVfS0lORCApOworCitTcGVjaWZpZXIgU3BlY2lmaWVyOjpFWEVDVVRBQkxFX1BST0NFRFVSRV9DT01QT1NJVEVfU1BFQ0lGSUVSKAorCQlTcGVjaWZpZXI6OkNPTVBPTkVOVF9QUk9DRURVUkVfS0lORCwKKwkJU3BlY2lmaWVyOjpNT0NfQ09NUE9TSVRFX1NUUlVDVFVSRV9LSU5EICk7CisKK1NwZWNpZmllciBTcGVjaWZpZXI6OkVYRUNVVEFCTEVfUFJPQ0VEVVJFX01PREVMX1NQRUNJRklFUigKKwkJU3BlY2lmaWVyOjpDT01QT05FTlRfUFJPQ0VEVVJFX0tJTkQsCisJCVNwZWNpZmllcjo6REVTSUdOX01PREVMX0tJTkQgKTsKKworU3BlY2lmaWVyIFNwZWNpZmllcjo6RVhFQ1VUQUJMRV9QUk9DRURVUkVfSU5TVEFOQ0VfU1RBVElDX1NQRUNJRklFUigKKwkJU3BlY2lmaWVyOjpDT01QT05FTlRfUFJPQ0VEVVJFX0tJTkQsCisJCVNwZWNpZmllcjo6REVTSUdOX0lOU1RBTkNFX1NUQVRJQ19LSU5EICk7CisKKworLyoqCisgKiBFWEVDVVRBQkxFIERFU0lHTgorICovCitTcGVjaWZpZXIgU3BlY2lmaWVyOjpERVNJR05fTU9ERUxfU1BFQ0lGSUVSKAorCQlTcGVjaWZpZXI6OkRFU0lHTl9NT0RFTF9LSU5EKTsKKworU3BlY2lmaWVyIFNwZWNpZmllcjo6REVTSUdOX1BST1RPVFlQRV9TVEFUSUNfU1BFQ0lGSUVSKAorCQlTcGVjaWZpZXI6OkRFU0lHTl9QUk9UT1RZUEVfU1RBVElDX0tJTkQpOworCitTcGVjaWZpZXIgU3BlY2lmaWVyOjpERVNJR05fSU5TVEFOQ0VfU1RBVElDX1NQRUNJRklFUigKKwkJU3BlY2lmaWVyOjpERVNJR05fSU5TVEFOQ0VfU1RBVElDX0tJTkQpOworCitTcGVjaWZpZXIgU3BlY2lmaWVyOjpERVNJR05fSU5TVEFOQ0VfRFlOQU1JQ19TUEVDSUZJRVIoCisJCVNwZWNpZmllcjo6REVTSUdOX0lOU1RBTkNFX0RZTkFNSUNfS0lORCk7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNDT1BFIDxLSU5ECisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitTcGVjaWZpZXI6OlNDT1BFX0tJTkQgU3BlY2lmaWVyOjp0b1Njb3BlKGNvbnN0IHN0ZDo6c3RyaW5nICYgaWQpCit7CisJaWYoIGlkID09ICJtYWNoaW5lIiAgICApIHJldHVybiBTQ09QRV9NQUNISU5FX0tJTkQ7CisKKwlpZiggaWQgPT0gInByb2dyYW0iICAgICkgcmV0dXJuIFNDT1BFX1BST0dSQU1fS0lORDsKKworCWlmKCBpZCA9PSAidHJhbnNpdGlvbiIgKSByZXR1cm4gU0NPUEVfVFJBTlNJVElPTl9LSU5EOworCisJaWYoIGlkID09ICJyb3V0aW5lIiAgICApIHJldHVybiBTQ09QRV9ST1VUSU5FX0tJTkQ7CisKKwlpZiggaWQgPT0gInJ1bm5hYmxlIiAgICkgcmV0dXJuIFNDT1BFX1JVTk5BQkxFX0tJTkQ7CisKKwlyZXR1cm4gU0NPUEVfVU5ERUZJTkVEX0tJTkQ7Cit9CisKKworc3RkOjpzdHJpbmcgU3BlY2lmaWVyOjpzdHJTY29wZShTQ09QRV9LSU5EIGtpbmQpCit7CisJc3dpdGNoKCBraW5kICkKKwl7CisJCWNhc2UgU0NPUEVfTUFDSElORV9LSU5EICAgIDogcmV0dXJuKCAibWFjaGluZSIgICAgKTsKKworCQljYXNlIFNDT1BFX1BST0dSQU1fS0lORCAgICA6IHJldHVybiggInByb2dyYW0iICAgICk7CisKKwkJY2FzZSBTQ09QRV9UUkFOU0lUSU9OX0tJTkQgOiByZXR1cm4oICJ0cmFuc2l0aW9uIiApOworCisJCWNhc2UgU0NPUEVfUk9VVElORV9LSU5EICAgIDogcmV0dXJuKCAicm91dGluZSIgICAgKTsKKworCQljYXNlIFNDT1BFX1JVTk5BQkxFX0tJTkQgICA6IHJldHVybiggInJ1bm5hYmxlIiAgICk7CisKKwkJY2FzZSBTQ09QRV9VTkRFRklORURfS0lORCAgOiByZXR1cm4oICJ1bmRlZmluZWQ8c3BlY2lmaWVyI3Njb3BlI2tpbmQ+Iik7CisKKwkJZGVmYXVsdCAgICAgICAgICAgICAgICAgICAgOiByZXR1cm4oICJ1bmtub3duPHNwZWNpZmllciNzY29wZSNraW5kPiIgKTsKKwl9Cit9CisKKworLyoqCisgKiBTRVRURVIKKyAqLworU3BlY2lmaWVyICYgU3BlY2lmaWVyOjpzZXQoY29uc3Qgc3RkOjpzdHJpbmcgc3RyU3BlY2lmaWVyKQoreworI2RlZmluZSBJRl9JUyggc3BlYyAgKSAgaWYoIHN0clNwZWNpZmllciA9PSBzcGVjICkKKyNkZWZpbmUgSUZfSEFTKCBzcGVjICkgIGlmKCBzdHJTcGVjaWZpZXIuZmluZChzcGVjKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisKKwlJRl9IQVMoICJleGVjdXRhYmxlIiAgICAgKSB7IHNldENvbXBvbmVudEV4ZWN1dGFibGUoKTsgICB9CisJSUZfSEFTKCAibWFjaGluZSIgICAgICAgICkgeyBzZXRDb21wb25lbnRFeGVjdXRhYmxlKCk7ICAgfQorCUlGX0hBUyggInN0YXRlbWFjaGluZSIgICApIHsgc2V0Q29tcG9uZW50U3RhdGVtYWNoaW5lKCk7IH0KKwlJRl9IQVMoICJzeXN0ZW0iICAgICAgICAgKSB7IHNldENvbXBvbmVudFN5c3RlbSgpOyAgICAgICB9CisJSUZfSEFTKCAicHJvY2VkdXJlIiAgICAgICkgeyBzZXRDb21wb25lbnRQcm9jZWR1cmUoKTsgICAgfQorCisJSUZfSEFTKCAicGFja2FnZSIgICAgICAgICkgeyAvKnNldENvbXBvbmVudFBhY2thZ2UoKTsqLyAgfQorCisKKwlJRl9IQVMoICJncm91cCIgICAgICAgICAgKSB7IHNldEdyb3VwTWFzSygpOyAgIH0KKwlJRl9IQVMoICJldmVyeSIgICAgICAgICAgKSB7IHNldEdyb3VwRXZlcnkoKTsgIH0KKwlJRl9IQVMoICJzb21lIiAgICAgICAgICAgKSB7IHNldEdyb3VwU29tZSgpOyAgIH0KKwlJRl9IQVMoICJleGNlcHQiICAgICAgICAgKSB7IHNldEdyb3VwRXhjZXB0KCk7IH0KKworCUlGX0hBUyggImNvbXBvc2l0ZSIgICAgICApIHsgc2V0TW9jQ29tcG9zaXRlKCk7ICAgICAgICAgICAgIH0KKwlJRl9IQVMoICJhbmQiICAgICAgICAgICAgKSB7IHNldE1vY0NvbXBvc2l0ZVN0cnVjdHVyZSgpOyAgICB9CisKKwlJRl9IQVMoICJvciIgICAgICAgICAgICAgKSB7IHNldE1vY1N0YXRlVHJhbnNpdGlvblN5c3RlbSgpOyB9CisJSUZfSEFTKCAiU1RTIiAgICAgICAgICAgICkgeyBzZXRNb2NTdGF0ZVRyYW5zaXRpb25TeXN0ZW0oKTsgfQorCUlGX0hBUyggInN0ZiIgICAgICAgICAgICApIHsgc2V0TW9jU3RhdGVUcmFuc2l0aW9uRmxvdygpOyAgIH0KKwlJRl9IQVMoICJTVEYiICAgICAgICAgICAgKSB7IHNldE1vY1N0YXRlVHJhbnNpdGlvbkZsb3coKTsgICB9CisKKwlJRl9IQVMoICJmbG93IiAgICAgICAgICAgKSB7IHNldENvbXBvc2l0ZU1vY0RhdGFGbG93KCk7ICAgICB9CisJSUZfSEFTKCAiREYiICAgICAgICAgICAgICkgeyBzZXRDb21wb3NpdGVNb2NEYXRhRmxvdygpOyAgICAgfQorCisJSUZfSEFTKCAic2ltcGxlIiAgICAgICAgICkgeyBzZXRTdGF0ZU1vY1NJTVBMRSgpOyAgfQorCUlGX0hBUyggInN0YXJ0IiAgICAgICAgICApIHsgc2V0U3RhdGVNb2NTVEFSVCgpOyAgIH0KKwlJRl9IQVMoICJmaW5hbCIgICAgICAgICAgKSB7IHNldFN0YXRlTW9jRklOQUwoKTsgICB9CisJSUZfSEFTKCAic3luYyIgICAgICAgICAgICkgeyBzZXRTdGF0ZU1vY1NZTkMoKTsgICAgfQorCisJSUZfSEFTKCAiaW5pdGlhbCIgICAgICAgICkgeyBzZXRQc2V1ZG9zdGF0ZU1vY0lOSVRJQUwoKTsgIH0KKwlJRl9IQVMoICJ0ZXJtaW5hbCIgICAgICAgKSB7IHNldFBzZXVkb3N0YXRlTW9jVEVSTUlOQUwoKTsgfQorCUlGX0hBUyggInJldHVybiIgICAgICAgICApIHsgc2V0UHNldWRvc3RhdGVNb2NSRVRVUk4oKTsgICB9CisKKwlJRl9IQVMoICJqdW5jdGlvbiIgICAgICAgKSB7IHNldFBzZXVkb3N0YXRlTW9jSlVOQ1RJT04oKTsgfQorCUlGX0hBUyggImNob2ljZSIgICAgICAgICApIHsgc2V0UHNldWRvc3RhdGVNb2NDSE9JQ0UoKTsgICB9CisKKwlJRl9IQVMoICJmb3JrIiAgICAgICAgICAgKSB7IHNldFBzZXVkb3N0YXRlTW9jRk9SSygpOyAgICAgfQorCUlGX0hBUyggImpvaW4iICAgICAgICAgICApIHsgc2V0UHNldWRvc3RhdGVNb2NKT0lOKCk7ICAgICB9CisKKwlJRl9IQVMoICJkaGlzdG9yeSIgICAgICAgKSB7IHNldFBzZXVkb3N0YXRlTW9jREVFUF9ISVNUT1JZKCk7ICAgIH0KKwlJRl9IQVMoICJkZWVwSGlzdG9yeSIgICAgKSB7IHNldFBzZXVkb3N0YXRlTW9jREVFUF9ISVNUT1JZKCk7ICAgIH0KKworCUlGX0hBUyggInNoaXN0b3J5IiAgICAgICApIHsgc2V0UHNldWRvc3RhdGVNb2NTSEFMTE9XX0hJU1RPUlkoKTsgfQorCUlGX0hBUyggInNoYWxsb3dIaXN0b3J5IiApIHsgc2V0UHNldWRvc3RhdGVNb2NTSEFMTE9XX0hJU1RPUlkoKTsgfQorCisJSUZfSEFTKCAiaGlzdG9yeSIgICAgICAgICkgeyBzZXRQc2V1ZG9zdGF0ZU1vY1NIQUxMT1dfSElTVE9SWSgpOyB9CisKKwlyZXR1cm4oICp0aGlzICk7Cit9CisKKworU3BlY2lmaWVyICYgU3BlY2lmaWVyOjpzZXRNb2MoY29uc3Qgc3RkOjpzdHJpbmcgc3RyU3BlY2lmaWVyKQoreworI2RlZmluZSBJRl9IQVMoIHNwZWMgKSAgaWYoIHN0clNwZWNpZmllci5maW5kKHNwZWMpICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKworCUlGX0hBUyggImNvbXBvc2l0ZSIgICAgICApIHsgc2V0TW9jQ29tcG9zaXRlKCk7ICAgICAgICAgICAgIH0KKwlJRl9IQVMoICJhbmQiICAgICAgICAgICAgKSB7IHNldE1vY0NvbXBvc2l0ZVN0cnVjdHVyZSgpOyAgICB9CisKKwlJRl9IQVMoICJvciIgICAgICAgICAgICAgKSB7IHNldE1vY1N0YXRlVHJhbnNpdGlvblN5c3RlbSgpOyB9CisJSUZfSEFTKCAic3RzIiAgICAgICAgICAgICkgeyBzZXRNb2NTdGF0ZVRyYW5zaXRpb25TeXN0ZW0oKTsgfQorCUlGX0hBUyggIlNUUyIgICAgICAgICAgICApIHsgc2V0TW9jU3RhdGVUcmFuc2l0aW9uU3lzdGVtKCk7IH0KKwlJRl9IQVMoICJzdGYiICAgICAgICAgICAgKSB7IHNldE1vY1N0YXRlVHJhbnNpdGlvbkZsb3coKTsgICB9CisJSUZfSEFTKCAiU1RGIiAgICAgICAgICAgICkgeyBzZXRNb2NTdGF0ZVRyYW5zaXRpb25GbG93KCk7ICAgfQorCisJSUZfSEFTKCAiZmxvdyIgICAgICAgICAgICkgeyBzZXRDb21wb3NpdGVNb2NEYXRhRmxvdygpOyAgICAgfQorCUlGX0hBUyggIkRGIiAgICAgICAgICAgICApIHsgc2V0Q29tcG9zaXRlTW9jRGF0YUZsb3coKTsgICAgIH0KKworCUlGX0hBUyggInNpbXBsZSIgICAgICAgICApIHsgc2V0U3RhdGVNb2NTSU1QTEUoKTsgIH0KKwlJRl9IQVMoICJzdGFydCIgICAgICAgICAgKSB7IHNldFN0YXRlTW9jU1RBUlQoKTsgICB9CisJSUZfSEFTKCAiZmluYWwiICAgICAgICAgICkgeyBzZXRTdGF0ZU1vY0ZJTkFMKCk7ICAgfQorCUlGX0hBUyggInN5bmMiICAgICAgICAgICApIHsgc2V0U3RhdGVNb2NTWU5DKCk7ICAgIH0KKworCUlGX0hBUyggImluaXRpYWwiICAgICAgICApIHsgc2V0UHNldWRvc3RhdGVNb2NJTklUSUFMKCk7ICB9CisJSUZfSEFTKCAidGVybWluYWwiICAgICAgICkgeyBzZXRQc2V1ZG9zdGF0ZU1vY1RFUk1JTkFMKCk7IH0KKwlJRl9IQVMoICJyZXR1cm4iICAgICAgICAgKSB7IHNldFBzZXVkb3N0YXRlTW9jUkVUVVJOKCk7ICAgfQorCisJSUZfSEFTKCAianVuY3Rpb24iICAgICAgICkgeyBzZXRQc2V1ZG9zdGF0ZU1vY0pVTkNUSU9OKCk7IH0KKwlJRl9IQVMoICJjaG9pY2UiICAgICAgICAgKSB7IHNldFBzZXVkb3N0YXRlTW9jQ0hPSUNFKCk7ICAgfQorCisJSUZfSEFTKCAiZm9yayIgICAgICAgICAgICkgeyBzZXRQc2V1ZG9zdGF0ZU1vY0ZPUksoKTsgICAgIH0KKwlJRl9IQVMoICJqb2luIiAgICAgICAgICAgKSB7IHNldFBzZXVkb3N0YXRlTW9jSk9JTigpOyAgICAgfQorCisJSUZfSEFTKCAiZGhpc3RvcnkiICAgICAgICkgeyBzZXRQc2V1ZG9zdGF0ZU1vY0RFRVBfSElTVE9SWSgpOyAgICB9CisJSUZfSEFTKCAiZGVlcEhpc3RvcnkiICAgICkgeyBzZXRQc2V1ZG9zdGF0ZU1vY0RFRVBfSElTVE9SWSgpOyAgICB9CisKKwlJRl9IQVMoICJzaGlzdG9yeSIgICAgICAgKSB7IHNldFBzZXVkb3N0YXRlTW9jU0hBTExPV19ISVNUT1JZKCk7IH0KKwlJRl9IQVMoICJzaGFsbG93SGlzdG9yeSIgKSB7IHNldFBzZXVkb3N0YXRlTW9jU0hBTExPV19ISVNUT1JZKCk7IH0KKworCUlGX0hBUyggImhpc3RvcnkiICAgICAgICApIHsgc2V0UHNldWRvc3RhdGVNb2NTSEFMTE9XX0hJU1RPUlkoKTsgfQorCisJcmV0dXJuKCAqdGhpcyApOworfQorCisKKy8qKgorICogU1RSSU5HIFRPIERFU0lHTiBLSU5ECisgKi8KK1NwZWNpZmllcjo6REVTSUdOX0tJTkQgU3BlY2lmaWVyOjp0b0Rlc2lnbktpbmQoY29uc3Qgc3RkOjpzdHJpbmcgJiBzdHJEZXNpZ24pCit7CisJc3RkOjpzdHJpbmcgYURlc2lnbiA9IHN0ckRlc2lnbjsKKwlTdHJpbmdUb29sczo6dG9sb3dlcihhRGVzaWduKTsKKworCWlmKCBhRGVzaWduID09ICJpbnN0YW5jZSIgKQorCXsKKwkJcmV0dXJuKCBTcGVjaWZpZXI6OkRFU0lHTl9JTlNUQU5DRV9LSU5EICk7CisJfQorCWVsc2UgaWYoIChhRGVzaWduID09ICJtb2RlbCIpIHx8IChhRGVzaWduID09ICJmb3JtIikgKQorCXsKKwkJcmV0dXJuKCBTcGVjaWZpZXI6OkRFU0lHTl9NT0RFTF9LSU5EICk7CisKKwl9CisJZWxzZSBpZiggYURlc2lnbiA9PSAicHJvdG90eXBlIiApCisJeworCQlyZXR1cm4oIFNwZWNpZmllcjo6REVTSUdOX1BST1RPVFlQRV9TVEFUSUNfS0lORCApOworCX0KKworCWVsc2UgaWYoIGFEZXNpZ24gPT0gImR5bmFtaWMiICkKKwl7CisJCXJldHVybiggU3BlY2lmaWVyOjpERVNJR05fRFlOQU1JQ19LSU5EICk7CisJfQorCWVsc2UgaWYoIGFEZXNpZ24gPT0gInJ1bnRpbWUiICkKKwl7CisJCXJldHVybiggU3BlY2lmaWVyOjpERVNJR05fUlVOVElNRV9LSU5EICk7CisJfQorLy8JZWxzZSBpZiggYURlc2lnbiA9PSAibWV0YSIgKQorLy8JeworLy8JCXJldHVybiggU3BlY2lmaWVyOjpERVNJR05fTUVUQV9LSU5EICk7CisvLwl9CisJZWxzZQorCXsKKwkJcmV0dXJuKCBTcGVjaWZpZXI6OkRFU0lHTl9VTkRFRklORURfS0lORCApOworCX0KK30KKworCisvKioKKyAqIENPTVBPTkVOVCBLSU5EIHRvIFNUUklORworICovCitzdGQ6OnN0cmluZyBTcGVjaWZpZXI6OmtleXdvcmRDb21wb25lbnQoYml0X2ZpZWxkX3QgY29tcG9uZW50S2luZCkKK3sKKwlzd2l0Y2goIGNvbXBvbmVudEtpbmQgKQorCXsKKwkJY2FzZSBDT01QT05FTlRfVU5ERUZJTkVEX0tJTkQ6CisJCQlyZXR1cm4oICI8a2V5d29yZDpjb21wb25lbnQ6dW5kZWY+IiApOworCisJCWNhc2UgQ09NUE9ORU5UX1NZU1RFTV9LSU5EOgorCQkJcmV0dXJuKCAic3lzdGVtIiApOworCisJCWNhc2UgQ09NUE9ORU5UX0VYRUNVVEFCTEVfS0lORDoKKwkJCXJldHVybiggImV4ZWN1dGFibGUiICk7CisKKwkJY2FzZSBDT01QT05FTlRfUFJPQ0VEVVJFX0tJTkQ6CisJCQlyZXR1cm4oICJwcm9jZWR1cmUiICk7CisKKwkJY2FzZSBDT01QT05FTlRfUk9VVElORV9LSU5EOgorCQkJcmV0dXJuKCAicm91dGluZSIgKTsKKworCQljYXNlIENPTVBPTkVOVF9TVEFURU1BQ0hJTkVfS0lORDoKKwkJCXJldHVybiggInN0YXRlbWFjaGluZSIgKTsKKworCQljYXNlIENPTVBPTkVOVF9TVEFURV9LSU5EOgorCQkJcmV0dXJuKCAic3RhdGUiICk7CisKKwkJY2FzZSBDT01QT05FTlRfUFNFVURPU1RBVEVfS0lORDoKKy8vCQkJcmV0dXJuKCAicHNldWRvc3RhdGUiICk7CisJCQlyZXR1cm4oICJzdGF0ZSIgKTsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuKCB4c3RyQ29tcG9uZW50KGNvbXBvbmVudEtpbmQsICIjIikgKTsKKwl9Cit9CisKKworc3RkOjpzdHJpbmcgU3BlY2lmaWVyOjpzdHJDb21wb25lbnQoCisJCWJpdF9maWVsZF90IGNvbXBvbmVudEtpbmQsIGNvbnN0IHN0ZDo6c3RyaW5nICYgc2VwYXJhdG9yKQoreworCXN3aXRjaCggY29tcG9uZW50S2luZCApCisJeworCQljYXNlIENPTVBPTkVOVF9VTkRFRklORURfS0lORDoKKwkJCXJldHVybiggIiIgKTsKKy8vCQkJcmV0dXJuKCAiPGNvbXBvbmVudDp1bmRlZj4iICsgc2VwYXJhdG9yICk7CisKKwkJY2FzZSBDT01QT05FTlRfU1lTVEVNX0tJTkQ6CisJCQlyZXR1cm4oICJzeXN0ZW0iICsgc2VwYXJhdG9yICk7CisKKwkJY2FzZSBDT01QT05FTlRfRVhFQ1VUQUJMRV9LSU5EOgorCQkJcmV0dXJuKCAiZXhlY3V0YWJsZSIgKyBzZXBhcmF0b3IgKTsKKworCQljYXNlIENPTVBPTkVOVF9QUk9DRURVUkVfS0lORDoKKwkJCXJldHVybiggInByb2NlZHVyZSIgKyBzZXBhcmF0b3IgKTsKKworCQljYXNlIENPTVBPTkVOVF9ST1VUSU5FX0tJTkQ6CisJCQlyZXR1cm4oICJyb3V0aW5lIiArIHNlcGFyYXRvciApOworCisJCWNhc2UgQ09NUE9ORU5UX1NUQVRFTUFDSElORV9LSU5EOgorCQkJcmV0dXJuKCAic3RhdGVtYWNoaW5lIiArIHNlcGFyYXRvciApOworCisJCWNhc2UgQ09NUE9ORU5UX1NUQVRFX0tJTkQ6CisJCQlyZXR1cm4oICJzdGF0ZSIgKyBzZXBhcmF0b3IgKTsKKworCQljYXNlIENPTVBPTkVOVF9QU0VVRE9TVEFURV9LSU5EOgorCQkJcmV0dXJuKCAicHNldWRvc3RhdGUiICsgc2VwYXJhdG9yICk7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiggeHN0ckNvbXBvbmVudChjb21wb25lbnRLaW5kLCBzZXBhcmF0b3IpICk7CisJfQorfQorCisKK3N0ZDo6c3RyaW5nIFNwZWNpZmllcjo6eHN0ckNvbXBvbmVudCgKKwkJYml0X2ZpZWxkX3QgY29tcG9uZW50S2luZCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBzZXBhcmF0b3IpCit7CisJaWYoIGNvbXBvbmVudEtpbmQgIT0gQ09NUE9ORU5UX1VOREVGSU5FRF9LSU5EKQorCXsKKwkJc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKworCQlpZiggKGNvbXBvbmVudEtpbmQgJiBDT01QT05FTlRfU1lTVEVNX0tJTkQpICE9IDAgKQorCQl7CisJCQlvc3MgPDwgInN5c3RlbSIgPDwgc2VwYXJhdG9yOworCQl9CisKKwkJaWYoIChjb21wb25lbnRLaW5kICYgQ09NUE9ORU5UX0VYRUNVVEFCTEVfS0lORCkgIT0gMCApCisJCXsKKwkJCW9zcyA8PCAiZXhlY3V0YWJsZSIgPDwgc2VwYXJhdG9yOworCQl9CisKKwkJaWYoIChjb21wb25lbnRLaW5kICYgQ09NUE9ORU5UX1BST0NFRFVSRV9LSU5EKSAhPSAwICkKKwkJeworCQkJb3NzIDw8ICJwcm9jZWR1cmUiIDw8IHNlcGFyYXRvcjsKKwkJfQorCQlpZiggKGNvbXBvbmVudEtpbmQgJiBDT01QT05FTlRfUk9VVElORV9LSU5EKSAhPSAwICkKKwkJeworCQkJb3NzIDw8ICJyb3V0aW5lIiA8PCBzZXBhcmF0b3I7CisJCX0KKworCQlpZiggKGNvbXBvbmVudEtpbmQgJiBDT01QT05FTlRfU1RBVEVNQUNISU5FX0tJTkQpICE9IDAgKQorCQl7CisJCQlvc3MgPDwgInN0YXRlbWFjaGluZSIgPDwgc2VwYXJhdG9yOworCQl9CisJCWlmKCAoY29tcG9uZW50S2luZCAmIENPTVBPTkVOVF9TVEFURV9LSU5EKSAhPSAwICkKKwkJeworCQkJb3NzIDw8ICJzdGF0ZSIgPDwgc2VwYXJhdG9yOworCQl9CisJCWlmKCAoY29tcG9uZW50S2luZCAmIENPTVBPTkVOVF9QU0VVRE9TVEFURV9LSU5EKSAhPSAwICkKKwkJeworCQkJb3NzIDw8ICJwc2V1ZG9zdGF0ZSIgPDwgc2VwYXJhdG9yOworCQl9CisKKwkJcmV0dXJuKCBvc3Muc3RyKCkgKTsKKwl9CisKKwlyZXR1cm4gIjxjb21wb25lbnQ6dW5kZWY+IjsKK30KKworCisvKioKKyAqIENPTVBPU0lURSBNT0MgdG8gU1RSSU5HCisgKi8KK3N0ZDo6c3RyaW5nIFNwZWNpZmllcjo6c3RyTW9kZWxPZkNvbXB1dGF0aW9uKAorCQliaXRfZmllbGRfdCBtb2RlbE9mQ29tcHV0YXRpb25LaW5kLCBjb25zdCBzdGQ6OnN0cmluZyAmIHNlcGFyYXRvcikKK3sKKwlzd2l0Y2goIG1vZGVsT2ZDb21wdXRhdGlvbktpbmQgKQorCXsKKwkJY2FzZSBNT0NfVU5ERUZJTkVEX0tJTkQ6CisJCQlyZXR1cm4oICIiICk7CisvLwkJCXJldHVybiggIjxjb21wb3NpdGU6dW5kZWY+IiArIHNlcGFyYXRvciApOworCisJCWNhc2UgTU9DX0NPTVBPU0lURV9TVFJVQ1RVUkVfS0lORDoKKwkJCXJldHVybiggImFuZCIgKyBzZXBhcmF0b3IgKTsKKworCQljYXNlIE1PQ19TVEFURV9UUkFOU0lUSU9OX1NUUlVDVFVSRV9LSU5EOgorCQkJcmV0dXJuKCAib3IiICsgc2VwYXJhdG9yICk7CisKKwkJY2FzZSBNT0NfU1RBVEVfVFJBTlNJVElPTl9TWVNURU1fS0lORDoKKwkJCXJldHVybiggIiNTVFMiICsgc2VwYXJhdG9yICk7CisKKwkJY2FzZSBNT0NfU1RBVEVfVFJBTlNJVElPTl9GTE9XX0tJTkQ6CisJCQlyZXR1cm4oICIjU1RGIiArIHNlcGFyYXRvciApOworCisJCWNhc2UgTU9DX0RBVEFfRkxPV19LSU5EOgorCQkJcmV0dXJuKCAiI0RGIiArIHNlcGFyYXRvciApOworCisJCWNhc2UgTU9DX0NPTVBPU0lURV9NQVNLX0tJTkQ6CisJCQlyZXR1cm4oICJjb21wb3NpdGUiICsgc2VwYXJhdG9yICk7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiggIjxjb21wb3NpdGU6dW5rbm93bj4iICsgc2VwYXJhdG9yICk7CisJfQorfQorCisKKy8qKgorICogR1JPVVAgS0lORCB0byBTVFJJTkcKKyAqLworc3RkOjpzdHJpbmcgU3BlY2lmaWVyOjpzdHJHcm91cCgKKwkJYml0X2ZpZWxkX3QgZ3JvdXBLaW5kLCBjb25zdCBzdGQ6OnN0cmluZyAmIHNlcGFyYXRvcikKK3sKKwlzd2l0Y2goIGdyb3VwS2luZCApCisJeworCQljYXNlIEdST1VQX1VOREVGSU5FRF9LSU5EOgorCQkJcmV0dXJuKCAiIiApOworLy8JCQlyZXR1cm4oICI8Z3JvdXA6dW5kZWY+IiArIHNlcGFyYXRvciApOworCisJCWNhc2UgR1JPVVBfRVZFUllfS0lORDoKKwkJCXJldHVybiggImV2ZXJ5IiArIHNlcGFyYXRvciApOworCisJCWNhc2UgR1JPVVBfU09NRV9LSU5EOgorCQkJcmV0dXJuKCAic29tZSIgKyBzZXBhcmF0b3IgKTsKKworCQljYXNlIEdST1VQX0VYQ0VQVF9LSU5EOgorCQkJcmV0dXJuKCAiZXhjZXB0IiArIHNlcGFyYXRvciApOworCisJCWNhc2UgR1JPVVBfTUFTS19LSU5EOgorCQkJcmV0dXJuKCAiZ3JvdXAiICsgc2VwYXJhdG9yICk7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiggIjxncm91cDp1bmtub3duPiIgKyBzZXBhcmF0b3IgKTsKKwl9Cit9CisKKworLyoqCisgKiBTVEFURSBNT0MgdG8gU1RSSU5HCisgKi8KK3N0ZDo6c3RyaW5nIFNwZWNpZmllcjo6c3RyU3RhdGVNb2MoCisJCWJpdF9maWVsZF90IHN0YXRlTW9jLCBjb25zdCBzdGQ6OnN0cmluZyAmIHNlcGFyYXRvcikKK3sKKwlzd2l0Y2goIHN0YXRlTW9jICkKKwl7CisJCWNhc2UgU1RBVEVfVU5ERUZJTkVEX01PQzoKKwkJCXJldHVybiggIiIgKTsKKy8vCQkJcmV0dXJuKCAiPHN0YXRlOnVuZGVmPiIgKyBzZXBhcmF0b3IgKTsKKworCQljYXNlIFNUQVRFX1NJTVBMRV9NT0M6CisJCQlyZXR1cm4oICJzaW1wbGUiICsgc2VwYXJhdG9yICk7CisKKwkJY2FzZSBTVEFURV9TVEFSVF9NT0M6CisJCQlyZXR1cm4oICJzdGFydCIgKyBzZXBhcmF0b3IgKTsKKworCQljYXNlIFNUQVRFX0ZJTkFMX01PQzoKKwkJCXJldHVybiggImZpbmFsIiArIHNlcGFyYXRvciApOworCisJCWNhc2UgU1RBVEVfU1lOQ19NT0M6CisJCQlyZXR1cm4oICJzeW5jIiArIHNlcGFyYXRvciApOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4oIHhzdHJTdGF0ZU1vYyhzdGF0ZU1vYywgc2VwYXJhdG9yKSApOworCX0KK30KKworCitzdGQ6OnN0cmluZyBTcGVjaWZpZXI6OnhzdHJTdGF0ZU1vYygKKwkJYml0X2ZpZWxkX3Qgc3RhdGVNb2MsIGNvbnN0IHN0ZDo6c3RyaW5nICYgc2VwYXJhdG9yKQoreworCWlmKCBzdGF0ZU1vYyAhPSBTVEFURV9VTkRFRklORURfTU9DKQorCXsKKwkJc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKworCQlpZiggKHN0YXRlTW9jICYgU1RBVEVfU0lNUExFX01PQykgIT0gMCApCisJCXsKKwkJCW9zcyA8PCAic2ltcGxlIiA8PCBzZXBhcmF0b3I7CisJCX0KKwkJaWYoIChzdGF0ZU1vYyAmIFNUQVRFX1NUQVJUX01PQykgIT0gMCApCisJCXsKKwkJCW9zcyA8PCAic3RhcnQiIDw8IHNlcGFyYXRvcjsKKwkJfQorCQlpZiggKHN0YXRlTW9jICYgU1RBVEVfRklOQUxfTU9DKSAhPSAwICkKKwkJeworCQkJb3NzIDw8ICJmaW5hbCIgPDwgc2VwYXJhdG9yOworCQl9CisJCWlmKCAoc3RhdGVNb2MgJiBTVEFURV9TWU5DX01PQykgIT0gMCApCisJCXsKKwkJCW9zcyA8PCAic3luYyIgPDwgc2VwYXJhdG9yOworCQl9CisKKwkJcmV0dXJuKCBvc3Muc3RyKCkgKTsKKwl9CisKKwlyZXR1cm4gIjxzdGF0ZTp1bmRlZj4iOworfQorCisKKy8qKgorICogUFNFVURPU1RBVEUgTU9DIHRvIFNUUklORworICovCitzdGQ6OnN0cmluZyBTcGVjaWZpZXI6OnN0clBzZXVkb3N0YXRlTW9jKAorCQliaXRfZmllbGRfdCBwc2V1ZG9zdGF0ZU1vYywgY29uc3Qgc3RkOjpzdHJpbmcgJiBzZXBhcmF0b3IpCit7CisJc3dpdGNoKCBwc2V1ZG9zdGF0ZU1vYyApCisJeworCQljYXNlIFBTRVVET1NUQVRFX1VOREVGSU5FRF9NT0M6CisJCQlyZXR1cm4oICIiICk7CisvLwkJCXJldHVybiggIjxwc2V1ZG9zdGF0ZTp1bmRlZj4iICsgc2VwYXJhdG9yICk7CisKKwkJY2FzZSBQU0VVRE9TVEFURV9JTklUSUFMX01PQzoKKwkJCXJldHVybiggImluaXRpYWwiICsgc2VwYXJhdG9yICk7CisJCWNhc2UgUFNFVURPU1RBVEVfVEVSTUlOQUxfTU9DOgorCQkJcmV0dXJuKCAidGVybWluYWwiICsgc2VwYXJhdG9yICk7CisKKwkJY2FzZSBQU0VVRE9TVEFURV9SRVRVUk5fTU9DOgorCQkJcmV0dXJuKCAicmV0dXJuIiArIHNlcGFyYXRvciApOworCisJCWNhc2UgUFNFVURPU1RBVEVfSlVOQ1RJT05fTU9DOgorCQkJcmV0dXJuKCAianVuY3Rpb24iICsgc2VwYXJhdG9yICk7CisJCWNhc2UgUFNFVURPU1RBVEVfQ0hPSUNFX01PQzoKKwkJCXJldHVybiggImNob2ljZSIgKyBzZXBhcmF0b3IgKTsKKworCQljYXNlIFBTRVVET1NUQVRFX0VOVFJZX1BPSU5UX01PQzoKKwkJCXJldHVybiggImVudHJ5UG9pbnQiICsgc2VwYXJhdG9yICk7CisJCWNhc2UgUFNFVURPU1RBVEVfRVhJVF9QT0lOVF9NT0M6CisJCQlyZXR1cm4oICJleGl0UG9pbnQiICsgc2VwYXJhdG9yICk7CisKKwkJY2FzZSBQU0VVRE9TVEFURV9GT1JLX01PQzoKKwkJCXJldHVybiggImZvcmsiICsgc2VwYXJhdG9yICk7CisJCWNhc2UgUFNFVURPU1RBVEVfSk9JTl9NT0M6CisJCQlyZXR1cm4oICJqb2luIiArIHNlcGFyYXRvciApOworCisJCWNhc2UgUFNFVURPU1RBVEVfREVFUF9ISVNUT1JZX01PQzoKKwkJCXJldHVybiggImRoaXN0b3J5IiArIHNlcGFyYXRvciApOworCQljYXNlIFBTRVVET1NUQVRFX1NIQUxMT1dfSElTVE9SWV9NT0M6CisJCQlyZXR1cm4oICJzaGlzdG9yeSIgKyBzZXBhcmF0b3IgKTsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuKCB4c3RyUHNldWRvc3RhdGVNb2MocHNldWRvc3RhdGVNb2MsIHNlcGFyYXRvcikgKTsKKwl9Cit9CisKKworc3RkOjpzdHJpbmcgU3BlY2lmaWVyOjp4c3RyUHNldWRvc3RhdGVNb2MoCisJCWJpdF9maWVsZF90IHBzZXVkb3N0YXRlTW9jLCBjb25zdCBzdGQ6OnN0cmluZyAmIHNlcGFyYXRvcikKK3sKKwlpZiggcHNldWRvc3RhdGVNb2MgIT0gUFNFVURPU1RBVEVfVU5ERUZJTkVEX01PQykKKwl7CisJCXN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisKKwkJaWYoIChwc2V1ZG9zdGF0ZU1vYyAmIFBTRVVET1NUQVRFX0lOSVRJQUxfTU9DKSAhPSAwICkKKwkJeworCQkJb3NzIDw8ICJpbml0aWFsIiA8PCBzZXBhcmF0b3I7CisJCX0KKwkJaWYoIChwc2V1ZG9zdGF0ZU1vYyAmIFBTRVVET1NUQVRFX1RFUk1JTkFMX01PQykgIT0gMCApCisJCXsKKwkJCW9zcyA8PCAidGVybWluYWwiIDw8IHNlcGFyYXRvcjsKKwkJfQorCisJCWlmKCAocHNldWRvc3RhdGVNb2MgJiBQU0VVRE9TVEFURV9SRVRVUk5fTU9DKSAhPSAwICkKKwkJeworCQkJb3NzIDw8ICJyZXR1cm4iIDw8IHNlcGFyYXRvcjsKKwkJfQorCisJCWlmKCAocHNldWRvc3RhdGVNb2MgJiBQU0VVRE9TVEFURV9KVU5DVElPTl9NT0MpICE9IDAgKQorCQl7CisJCQlvc3MgPDwgImp1bmN0aW9uIiA8PCBzZXBhcmF0b3I7CisJCX0KKwkJaWYoIChwc2V1ZG9zdGF0ZU1vYyAmIFBTRVVET1NUQVRFX0NIT0lDRV9NT0MpICE9IDAgKQorCQl7CisJCQlvc3MgPDwgImNob2ljZSIgPDwgc2VwYXJhdG9yOworCQl9CisKKwkJaWYoIChwc2V1ZG9zdGF0ZU1vYyAmIFBTRVVET1NUQVRFX0VOVFJZX1BPSU5UX01PQykgIT0gMCApCisJCXsKKwkJCW9zcyA8PCAiZW50cnlQb2ludCIgPDwgc2VwYXJhdG9yOworCQl9CisJCWlmKCAocHNldWRvc3RhdGVNb2MgJiBQU0VVRE9TVEFURV9FWElUX1BPSU5UX01PQykgIT0gMCApCisJCXsKKwkJCW9zcyA8PCAiZXhpdFBvaW50IiA8PCBzZXBhcmF0b3I7CisJCX0KKworCQlpZiggKHBzZXVkb3N0YXRlTW9jICYgUFNFVURPU1RBVEVfRk9SS19NT0MpICE9IDAgKQorCQl7CisJCQlvc3MgPDwgImZvcmsiIDw8IHNlcGFyYXRvcjsKKwkJfQorCQlpZiggKHBzZXVkb3N0YXRlTW9jICYgUFNFVURPU1RBVEVfSk9JTl9NT0MpICE9IDAgKQorCQl7CisJCQlvc3MgPDwgImpvaW4iIDw8IHNlcGFyYXRvcjsKKwkJfQorCisJCWlmKCAocHNldWRvc3RhdGVNb2MgJiBQU0VVRE9TVEFURV9ERUVQX0hJU1RPUllfTU9DKSAhPSAwICkKKwkJeworCQkJb3NzIDw8ICJkaGlzdG9yeSIgPDwgc2VwYXJhdG9yOworCQl9CisJCWlmKCAocHNldWRvc3RhdGVNb2MgJiBQU0VVRE9TVEFURV9TSEFMTE9XX0hJU1RPUllfTU9DKSAhPSAwICkKKwkJeworCQkJb3NzIDw8ICJzaGlzdG9yeSIgPDwgc2VwYXJhdG9yOworCQl9CisKKwkJCXJldHVybiggb3NzLnN0cigpICk7CisJfQorCisJcmV0dXJuICI8cHNldWRvc3RhdGU6dW5kZWY+IjsKK30KKworCisvKioKKyAqIERFU0lHTiBLSU5EIHRvIFNUUklORworICovCitzdGQ6OnN0cmluZyBTcGVjaWZpZXI6OnN0ckZlYXR1cmUoCisJCWJpdF9maWVsZF90IGZlYXR1cmVLaW5kLCBjb25zdCBzdGQ6OnN0cmluZyAmIHNlcGFyYXRvcikKK3sKKwlpZiggKGZlYXR1cmVLaW5kICE9IEZFQVRVUkVfVU5ERUZJTkVEX0tJTkQpICkKKwl7CisJCXN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisKKwkJaWYoIChmZWF0dXJlS2luZCAmIEZFQVRVUkVfVElNRURfS0lORCkgIT0gMCApCisJCXsKKwkJCW9zcyA8PCAidGltZWQiIDw8IHNlcGFyYXRvcjsKKwkJfQorCQlpZiggKGZlYXR1cmVLaW5kICYgRkVBVFVSRV9JTlBVVF9FTkFCTEVEX0tJTkQpICE9IDAgKQorCQl7CisJCQlvc3MgPDwgImlucHV0X2VuYWJsZWQiIDw8IHNlcGFyYXRvcjsKKwkJfQorCQlpZiggKGZlYXR1cmVLaW5kICYgRkVBVFVSRV9MSUZFTElORV9LSU5EKSAhPSAwICkKKwkJeworCQkJb3NzIDw8ICJsaWZlbGluZSIgPDwgc2VwYXJhdG9yOworCQl9CisKKwkJcmV0dXJuKCBvc3Muc3RyKCkgKTsKKwl9CisKKwlyZXR1cm4oICIiIC8qIjxmZWF0dXJlOnVuZGVmPiIqLyApOworfQorCisKKy8qKgorICogREVTSUdOIEtJTkQgdG8gU1RSSU5HCisgKi8KK3N0ZDo6c3RyaW5nIFNwZWNpZmllcjo6c3RyRGVzaWduX25vdCgKKwkJREVTSUdOX0tJTkQgZGVzaWduS2luZCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBzZXBhcmF0b3IpIGNvbnN0Cit7CisJaWYoIGlzRGVzaWduS2luZChkZXNpZ25LaW5kKSApCisJeworCQlyZXR1cm4oICIiICk7CisJfQorCWVsc2UgaWYoIGlzRGVzaWduUHJvdG90eXBlU3RhdGljKCkgKQorCXsKKwkJcmV0dXJuKCBzdHJEZXNpZ24odGhpcy0+ZGVzaWduLCBzZXBhcmF0b3IpICk7CisJfQorCWVsc2UKKwl7CisJCXN3aXRjaCggZGVzaWduS2luZCApCisJCXsKKwkJCWNhc2UgREVTSUdOX01PREVMX0tJTkQ6CisJCQljYXNlIERFU0lHTl9JTlNUQU5DRV9LSU5EOgorCQkJY2FzZSBERVNJR05fRFlOQU1JQ19LSU5EOgorCQkJY2FzZSBERVNJR05fU1RBVElDX0tJTkQ6CisJCQljYXNlIERFU0lHTl9SVU5USU1FX0tJTkQ6CisJCQl7CisJCQkJcmV0dXJuKCBzdHJEZXNpZ24odGhpcy0+ZGVzaWduICYgKH4gZGVzaWduS2luZCksIHNlcGFyYXRvcikgKTsKKwkJCX0KKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJcmV0dXJuKCBzdHJEZXNpZ24odGhpcy0+ZGVzaWduLCBzZXBhcmF0b3IpICk7CisJCQl9CisJCX0KKwl9Cit9CisKKworc3RkOjpzdHJpbmcgU3BlY2lmaWVyOjpzdHJEZXNpZ24oCisJCWJpdF9maWVsZF90IGRlc2lnbktpbmQsIGNvbnN0IHN0ZDo6c3RyaW5nICYgc2VwYXJhdG9yKQoreworCXN3aXRjaCggZGVzaWduS2luZCApCisJeworCQljYXNlIERFU0lHTl9VTkRFRklORURfS0lORDoKKwkJCXJldHVybiggIiIgKTsKKy8vCQkJcmV0dXJuKCAiPGRlc2lnbjp1bmRlZj4iICsgc2VwYXJhdG9yICk7CisvLwkJCWNhc2UgREVTSUdOX01FVEFfS0lORDoKKy8vCQkJCXJldHVybiggIiNtZXRhIiArIHNlcGFyYXRvciApOworCisJCWNhc2UgREVTSUdOX01PREVMX0tJTkQ6CisJCQlyZXR1cm4oICIjbW9kZWwiICsgc2VwYXJhdG9yICk7CisJCWNhc2UgREVTSUdOX0lOU1RBTkNFX0tJTkQ6CisJCQlyZXR1cm4oICIjaW5zdGFuY2UiICsgc2VwYXJhdG9yICk7CisJCWNhc2UgREVTSUdOX1NUQVRJQ19LSU5EOgorCQkJcmV0dXJuKCAiI3N0YXRpYyIgKyBzZXBhcmF0b3IgKTsKKwkJY2FzZSBERVNJR05fRFlOQU1JQ19LSU5EOgorCQkJcmV0dXJuKCAiI2R5bmFtaWMiICsgc2VwYXJhdG9yICk7CisJCWNhc2UgREVTSUdOX1JVTlRJTUVfS0lORDoKKwkJCXJldHVybiggIiNydW50aW1lIiArIHNlcGFyYXRvciApOworCisJCWNhc2UgREVTSUdOX0lOU1RBTkNFX1NUQVRJQ19LSU5EOgorCQkJcmV0dXJuKCAiI3N0YXRpYyNpbnN0YW5jZSIgKyBzZXBhcmF0b3IgKTsKKwkJY2FzZSBERVNJR05fSU5TVEFOQ0VfRFlOQU1JQ19LSU5EOgorCQkJcmV0dXJuKCAiI2R5bmFtaWMjaW5zdGFuY2UiICsgc2VwYXJhdG9yICk7CisKKwkJY2FzZSBERVNJR05fUFJPVE9UWVBFX1NUQVRJQ19LSU5EOgorLy8JCQlyZXR1cm4oICIjc3RhdGljICNwcm90b3R5cGUiICsgc2VwYXJhdG9yICk7CisJCQlyZXR1cm4oICIjcHJvdG90eXBlIiArIHNlcGFyYXRvciApOworCQljYXNlIERFU0lHTl9QUk9UT1RZUEVfRFlOQU1JQ19LSU5EOgorCQkJcmV0dXJuKCAiI2R5bmFtaWMgI3Byb3RvdHlwZSIgKyBzZXBhcmF0b3IgKTsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuKCB4c3RyRGVzaWduKGRlc2lnbktpbmQsIHNlcGFyYXRvcikgKTsKKwl9Cit9CisKKworc3RkOjpzdHJpbmcgU3BlY2lmaWVyOjp4c3RyRGVzaWduKAorCQliaXRfZmllbGRfdCBkZXNpZ25LaW5kLCBjb25zdCBzdGQ6OnN0cmluZyAmIHNlcGFyYXRvcikKK3sKKwlpZiggKGRlc2lnbktpbmQgIT0gREVTSUdOX1VOREVGSU5FRF9LSU5EKSApCisvLwkJJiYgKGRlc2lnbktpbmQgIT0gREVTSUdOX01FVEFfS0lORCkgKQorCXsKKwkJc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKworCQlpZiggKGRlc2lnbktpbmQgJiBERVNJR05fTU9ERUxfS0lORCkgIT0gMCApCisJCXsKKwkJCW9zcyA8PCAiI21vZGVsIiA8PCBzZXBhcmF0b3I7CisJCX0KKwkJZWxzZSBpZiggKGRlc2lnbktpbmQgJiBERVNJR05fSU5TVEFOQ0VfS0lORCkgIT0gMCApCisJCXsKKwkJCW9zcyA8PCAiI2luc3RhbmNlIiA8PCBzZXBhcmF0b3I7CisJCX0KKwkJZWxzZSBpZiggKGRlc2lnbktpbmQgJiBERVNJR05fU1RBVElDX0tJTkQpICE9IDAgKQorCQl7CisJCQlvc3MgPDwgIiNzdGF0aWMiIDw8IHNlcGFyYXRvcjsKKwkJfQorCQllbHNlIGlmKCAoZGVzaWduS2luZCAmIERFU0lHTl9EWU5BTUlDX0tJTkQpICE9IDAgKQorCQl7CisJCQlvc3MgPDwgIiNkeW5hbWljIiA8PCBzZXBhcmF0b3I7CisJCX0KKwkJaWYoIChkZXNpZ25LaW5kICYgREVTSUdOX1JVTlRJTUVfS0lORCkgIT0gMCApCisJCXsKKwkJCW9zcyA8PCAiI3J1bnRpbWUiIDw8IHNlcGFyYXRvcjsKKwkJfQorCisJCXJldHVybiggb3NzLnN0cigpICk7CisJfQorCisJcmV0dXJuKCAiPGRlc2lnbjp1bmRlZj4iICk7Cit9CisKKworLyoqCisgKiBTZXJpYWxpemF0aW9uCisgKi8KK3N0ZDo6c3RyaW5nIFNwZWNpZmllcjo6U0VQQVJBVE9SID0gIiAlICI7CisKKworc3RkOjpzdHJpbmcgU3BlY2lmaWVyOjp0b1N0cmluZyhiaXRfZmllbGRfdCBlbmFibGVkRmllbGRzLAorCQljb25zdCBzdGQ6OnN0cmluZyAmIHNlcGFyYXRvcikgY29uc3QKK3sKKwlzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworCisJaWYoIChlbmFibGVkRmllbGRzICYgRklFTERfRkVBVFVSRV9QT1NJVElPTikgIT0gMCApCisJeworCQlvc3MgPDwgU3BlY2lmaWVyOjpzdHJGZWF0dXJlKCBmZWF0dXJlICwgc2VwYXJhdG9yICk7CisJfQorCisJaWYoIChlbmFibGVkRmllbGRzICYgRklFTERfUFNFVURPU1RBVEVfUE9TSVRJT04pICE9IDAgKQorCXsKKwkJb3NzIDw8IFNwZWNpZmllcjo6c3RyUHNldWRvc3RhdGVNb2MoIHBzZXVkb3N0YXRlICwgc2VwYXJhdG9yICk7CisJfQorCWlmKCAoZW5hYmxlZEZpZWxkcyAmIEZJRUxEX1NUQVRFX1BPU0lUSU9OKSAhPSAwICkKKwl7CisJCW9zcyA8PCBTcGVjaWZpZXI6OnN0clN0YXRlTW9jKCBzdGF0ZSAsIHNlcGFyYXRvciApOworCX0KKworCWlmKCAoZW5hYmxlZEZpZWxkcyAmIEZJRUxEX0NPTVBVVEFUSU9OX1BPU0lUSU9OKSAhPSAwICkKKwl7CisJCW9zcyA8PCBTcGVjaWZpZXI6OnN0ck1vZGVsT2ZDb21wdXRhdGlvbiggY29tcHV0YXRpb24gLCBzZXBhcmF0b3IgKTsKKwl9CisKKwlpZiggKGVuYWJsZWRGaWVsZHMgJiBGSUVMRF9ERVNJR05fUE9TSVRJT04pICE9IDAgKQorCXsKKwkJb3NzIDw8IFNwZWNpZmllcjo6c3RyRGVzaWduKCBkZXNpZ24gLCBzZXBhcmF0b3IpOworCX0KKworCWlmKCAoZW5hYmxlZEZpZWxkcyAmIEZJRUxEX0dST1VQX1BPU0lUSU9OKSAhPSAwICkKKwl7CisJCW9zcyA8PCBTcGVjaWZpZXI6OnN0ckdyb3VwICAgKCBncm91cCAsIHNlcGFyYXRvciApOworCX0KKworCWlmKCAoZW5hYmxlZEZpZWxkcyAmIEZJRUxEX0NPTVBPTkVOVF9QT1NJVElPTikgIT0gMCApCisJeworCQlvc3MgPDwgU3BlY2lmaWVyOjpzdHJDb21wb25lbnQoIGNvbXBvbmVudCAsIHNlcGFyYXRvciApOworCX0KKworCXJldHVybiggb3NzLnN0cigpICk7Cit9CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvY29tbW9uL1NwZWNpZmllckVsZW1lbnQuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9jb21tb24vU3BlY2lmaWVyRWxlbWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZDcxYjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvY29tbW9uL1NwZWNpZmllckVsZW1lbnQuaApAQCAtMCwwICsxLDI2NTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyMSBhdnIuIDIwMTYKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBJbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBGTUxfQ09NTU9OX1NQRUNJRklFUkVMRU1FTlRfSF8KKyNkZWZpbmUgRk1MX0NPTU1PTl9TUEVDSUZJRVJFTEVNRU5UX0hfCisKKyNpbmNsdWRlIDx1dGlsL2F2bV9udW1lcmljLmg+CisjaW5jbHVkZSA8dXRpbC9hdm1fc3RyaW5nLmg+CisKKworCituYW1lc3BhY2Ugc2VwCit7CisKKworY2xhc3MgU3BlY2lmaWVyCit7CisKK3B1YmxpYzoKKwkvKioKKwkgKiBTQ09QRV9LSU5ECisJICogMyBiaXRzCisJICovCisJZW51bSBTQ09QRV9LSU5ECisJeworCQlTQ09QRV9NQUNISU5FX0tJTkQsCisKKwkJU0NPUEVfUFJPR1JBTV9LSU5ELAorCisJCVNDT1BFX1RSQU5TSVRJT05fS0lORCwKKworCQlTQ09QRV9ST1VUSU5FX0tJTkQsCisKKwkJU0NPUEVfUlVOTkFCTEVfS0lORCwKKworCQlTQ09QRV9VTkRFRklORURfS0lORAorCX07CisKKwkvLyBVdGlscworCXN0YXRpYyBTQ09QRV9LSU5EIHRvU2NvcGUoY29uc3Qgc3RkOjpzdHJpbmcgJiBpZCk7CisKKwlzdGF0aWMgc3RkOjpzdHJpbmcgc3RyU2NvcGUoU0NPUEVfS0lORCBtTW9jS2luZCk7CisKKworCS8qKgorCSAqIENPTVBPTkVOVF9LSU5ECisJICogNyBiaXRzCisJICovCisJZW51bSBDT01QT05FTlRfS0lORCB7CisKKwkJQ09NUE9ORU5UX1VOREVGSU5FRF9LSU5EICAgICAgICAgPSAweDAwMCwKKworCQlDT01QT05FTlRfU1lTVEVNX0tJTkQgICAgICAgICAgICA9IDB4MDAxLAorCisJCUNPTVBPTkVOVF9FWEVDVVRBQkxFX0tJTkQgICAgICAgID0gMHgwMDIsCisKKworCQlDT01QT05FTlRfUFJPQ0VEVVJFX0tJTkQgICAgICAgICA9IDB4MDA0LAorCisJCUNPTVBPTkVOVF9ST1VUSU5FX0tJTkQgICAgICAgICAgID0gMHgwMDgsCisKKworCQlDT01QT05FTlRfU1RBVEVNQUNISU5FX0tJTkQgICAgICA9IDB4MDEwLAorCisJCUNPTVBPTkVOVF9TVEFURV9LSU5EICAgICAgICAgICAgID0gMHgwMjAsLy98IENPTVBPTkVOVF9TVEFURU1BQ0hJTkVfS0lORCwKKworCQlDT01QT05FTlRfUFNFVURPU1RBVEVfS0lORCAgICAgICA9IDB4MDQwLC8vfCBDT01QT05FTlRfU1RBVEVfS0lORCwKKworCisJCUZBTUlMWV9DT01QT05FTlRfU1RBVEVfS0lORCAgICAgID0gQ09NUE9ORU5UX1NUQVRFX0tJTkQKKwkJCQkJCQkJCQkgfCBDT01QT05FTlRfUFNFVURPU1RBVEVfS0lORCwKKworCQlGQU1JTFlfQ09NUE9ORU5UX1NUQVRFTUFDSElORV9LSU5EID0gQ09NUE9ORU5UX1NUQVRFTUFDSElORV9LSU5ECisJCQkJCQkJCQkJIHwgRkFNSUxZX0NPTVBPTkVOVF9TVEFURV9LSU5ELAorCisJCUZBTUlMWV9DT01QT05FTlRfQ09NUE9TSVRFX0tJTkQgID0gQ09NUE9ORU5UX1NZU1RFTV9LSU5ECisJCQkJCQkJCQkJIHwgQ09NUE9ORU5UX1NUQVRFTUFDSElORV9LSU5ECisJCQkJCQkJCQkJIHwgQ09NUE9ORU5UX0VYRUNVVEFCTEVfS0lORCwKKworCisJfTsKKworCisJLyoqCisJICogTW9kZWwgT2YgQ29tcHV0YXRpb24KKwkgKiBNT0NfS0lORAorCSAqIDYgYml0cworCSAqLworCWVudW0gTU9DX0tJTkQgeworCisJCU1PQ19VTkRFRklORURfS0lORCAgICAgICAgICAgICAgICAgID0gMHgwMDAsCisKKwkJTU9DX0NPTVBPU0lURV9NQVNLX0tJTkQgICAgICAgICAgICAgPSAweDAwMSwKKworCQlNT0NfQ09NUE9TSVRFX1NUUlVDVFVSRV9LSU5EICAgICAgICA9IDB4MDAyIHwgTU9DX0NPTVBPU0lURV9NQVNLX0tJTkQsCisKKworCQlNT0NfU1RBVEVfVFJBTlNJVElPTl9TVFJVQ1RVUkVfS0lORCA9IDB4MDA0IHwgTU9DX0NPTVBPU0lURV9NQVNLX0tJTkQsCisKKwkJTU9DX1NUQVRFX1RSQU5TSVRJT05fU1lTVEVNX0tJTkQgICAgPSAweDAwOCB8IE1PQ19TVEFURV9UUkFOU0lUSU9OX1NUUlVDVFVSRV9LSU5ELAorCisJCU1PQ19TVEFURV9UUkFOU0lUSU9OX0ZMT1dfS0lORCAgICAgID0gMHgwMTAgfCBNT0NfU1RBVEVfVFJBTlNJVElPTl9TVFJVQ1RVUkVfS0lORCwKKworCisJCU1PQ19EQVRBX0ZMT1dfS0lORCAgICAgICAgICAgICAgICAgID0gMHgwMjAgfCBNT0NfQ09NUE9TSVRFX01BU0tfS0lORCwKKworCX07CisKKworCS8qKgorCSAqIEdST1VQX0tJTkQKKwkgKiAzIGJpdHMKKwkgKi8KKwllbnVtIEdST1VQX0tJTkQKKwl7CisKKwkJR1JPVVBfVU5ERUZJTkVEX0tJTkQgICAgICAgICAgICAgPSAweDAwMCwKKworCQlHUk9VUF9NQVNLX0tJTkQgICAgICAgICAgICAgICAgICA9IDB4MDAxLAorCisJCUdST1VQX1NPTUVfS0lORCAgICAgICAgICAgICAgICAgID0gMHgwMDIgfCBHUk9VUF9NQVNLX0tJTkQsCisKKwkJR1JPVVBfRVhDRVBUX0tJTkQgICAgICAgICAgICAgICAgPSAweDAwNCB8IEdST1VQX01BU0tfS0lORCwKKworCQlHUk9VUF9FVkVSWV9LSU5EICAgICAgICAgICAgICAgICA9IDB4MDA2IHwgR1JPVVBfTUFTS19LSU5ECisKKwl9OworCisKKwkvKioKKwkgKiBTVEFURV9NT0MKKwkgKiA0IGJpdHMKKwkgKi8KKwllbnVtIFNUQVRFX01PQworCXsKKworCQlTVEFURV9VTkRFRklORURfTU9DICAgICAgICAgICAgICA9IDB4MDAwLAorCisJCVNUQVRFX1NJTVBMRV9NT0MgICAgICAgICAgICAgICAgID0gMHgwMDEsCisKKwkJU1RBVEVfU1RBUlRfTU9DICAgICAgICAgICAgICAgICAgPSAweDAwMiwKKworCQlTVEFURV9GSU5BTF9NT0MgICAgICAgICAgICAgICAgICA9IDB4MDA0LAorCisJCVNUQVRFX1NZTkNfTU9DICAgICAgICAgICAgICAgICAgID0gMHgwMDgKKworCX07CisKKworCS8qKgorCSAqIFBTRVVET1NUQVRFX01PQworCSAqIDExIGJpdHMKKwkgKi8KKwllbnVtIFBTRVVET1NUQVRFX01PQworCXsKKworCQlQU0VVRE9TVEFURV9VTkRFRklORURfTU9DICAgICAgICA9IDB4MDAwLAorCisJCVBTRVVET1NUQVRFX0lOSVRJQUxfTU9DICAgICAgICAgID0gMHgwMDEsCisKKwkJUFNFVURPU1RBVEVfVEVSTUlOQUxfTU9DICAgICAgICAgPSAweDAwMiwKKwkJUFNFVURPU1RBVEVfUkVUVVJOX01PQyAgICAgICAgICAgPSAweDAwNCwKKworCQlGQU1JTFlfUFNFVURPX0VORElOR19NT0MgICAgICAgICA9IFBTRVVET1NUQVRFX1RFUk1JTkFMX01PQworCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBTRVVET1NUQVRFX1JFVFVSTl9NT0MsCisKKwkJUFNFVURPU1RBVEVfSlVOQ1RJT05fTU9DICAgICAgICAgPSAweDAwOCwKKwkJUFNFVURPU1RBVEVfQ0hPSUNFX01PQyAgICAgICAgICAgPSAweDAxMCwKKworCQlQU0VVRE9TVEFURV9FTlRSWV9QT0lOVF9NT0MgICAgICA9IDB4MDIwLAorCQlQU0VVRE9TVEFURV9FWElUX1BPSU5UX01PQyAgICAgICA9IDB4MDQwLAorCisJCUZBTUlMWV9QU0VVRE9fQ09OTkVDVElPTl9QT0lOVF9NT0MgPSBQU0VVRE9TVEFURV9FTlRSWV9QT0lOVF9NT0MKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQU0VVRE9TVEFURV9FWElUX1BPSU5UX01PQywKKworCQlQU0VVRE9TVEFURV9GT1JLX01PQyAgICAgICAgICAgICA9IDB4MDgwLAorCQlQU0VVRE9TVEFURV9KT0lOX01PQyAgICAgICAgICAgICA9IDB4MTAwLAorCisJCVBTRVVET1NUQVRFX0RFRVBfSElTVE9SWV9NT0MgICAgID0gMHgyMDAsCisJCVBTRVVET1NUQVRFX1NIQUxMT1dfSElTVE9SWV9NT0MgID0gMHg0MDAsCisKKwkJRkFNSUxZX1BTRVVET19ISVNUT1JZX01PQyAgICAgICAgPSBQU0VVRE9TVEFURV9ERUVQX0hJU1RPUllfTU9DCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUFNFVURPU1RBVEVfU0hBTExPV19ISVNUT1JZX01PQywKKworCX07CisKKworCS8qKgorCSAqIEZFQVRVUkVfS0lORAorCSAqIDMgYml0cworCSAqLworCWVudW0gRkVBVFVSRV9LSU5ECisJeworCQlGRUFUVVJFX1VOREVGSU5FRF9LSU5EICAgICAgICAgICA9IDB4MDAwLCAvLyBERUZBVUxUCisKKwkJRkVBVFVSRV9USU1FRF9LSU5EICAgICAgICAgICAgICAgPSAweDAwMSwKKworCQlGRUFUVVJFX0lOUFVUX0VOQUJMRURfS0lORCAgICAgICA9IDB4MDAyLAorCisJCUZFQVRVUkVfTElGRUxJTkVfS0lORCAgICAgICAgICAgID0gMHgwMDQKKworCX07CisKKworCisJLyoqCisJICogREVTSUdOX0tJTkQKKwkgKiA1IGJpdHMKKwkgKi8KKwllbnVtIERFU0lHTl9LSU5ECisJeworCQlERVNJR05fVU5ERUZJTkVEX0tJTkQgICAgICAgICAgICA9IDB4MDAwLCAvLyBVTlVTRUQKKy8vCQlERVNJR05fTUVUQV9LSU5EICAgICAgICAgICAgICAgICA9IDB4MDAwLCAvLyBVTlVTRUQKKworCQlERVNJR05fTU9ERUxfS0lORCAgICAgICAgICAgICAgICA9IDB4MDAxLAorCisJCURFU0lHTl9JTlNUQU5DRV9LSU5EICAgICAgICAgICAgID0gMHgwMDIsCisKKwkJREVTSUdOX1NUQVRJQ19LSU5EICAgICAgICAgICAgICAgPSAweDAwNCwKKworCQlERVNJR05fRFlOQU1JQ19LSU5EICAgICAgICAgICAgICA9IDB4MDA4LAorCisJCURFU0lHTl9SVU5USU1FX0tJTkQgICAgICAgICAgICAgID0gMHgwMTAsCisKKwkJREVTSUdOX0lOU1RBTkNFX1NUQVRJQ19LSU5EICAgICAgPSBERVNJR05fSU5TVEFOQ0VfS0lORAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERFU0lHTl9TVEFUSUNfS0lORCwKKworCQlERVNJR05fSU5TVEFOQ0VfRFlOQU1JQ19LSU5EICAgICA9IERFU0lHTl9JTlNUQU5DRV9LSU5ECisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgREVTSUdOX0RZTkFNSUNfS0lORCwKKworCQkvLyBERUZBVUxUCisJCURFU0lHTl9QUk9UT1RZUEVfU1RBVElDX0tJTkQgICAgID0gREVTSUdOX0lOU1RBTkNFX1NUQVRJQ19LSU5ECisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgREVTSUdOX01PREVMX0tJTkQsCisKKwkJREVTSUdOX1BST1RPVFlQRV9EWU5BTUlDX0tJTkQgICAgPSBERVNJR05fSU5TVEFOQ0VfRFlOQU1JQ19LSU5ECisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgREVTSUdOX01PREVMX0tJTkQsCisKKwkJREVTSUdOX0lOU1RBTkNFX1JVTlRJTUVfS0lORCAgICAgPSBERVNJR05fSU5TVEFOQ0VfS0lORAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERFU0lHTl9SVU5USU1FX0tJTkQsCisKKwl9OworCisKKwkvKioKKwkgKiBUWVBFREVGCisJICovCisJdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgYml0X2ZpZWxkX3Q7CisKKwkvKioKKwkgKiBCSVQgRklFTERTCisJICovCisJYml0X2ZpZWxkX3QgY29tcG9uZW50ICAgICAgOiA3OworCisJYml0X2ZpZWxkX3QgY29tcHV0YXRpb24gICAgOiA2OworCisJYml0X2ZpZWxkX3QgZ3JvdXAgICAgICAgICAgOiAzOworCisJYml0X2ZpZWxkX3Qgc3RhdGUJICAgICAgIDogNDsKKworCWJpdF9maWVsZF90IHBzZXVkb3N0YXRlICAgIDogMTE7CisKKwliaXRfZmllbGRfdCBmZWF0dXJlICAgICAgICA6IDM7CisKKwliaXRfZmllbGRfdCBkZXNpZ24gICAgICAgICA6IDU7CisKKworCS8qKgorCSAqIEVOQUJMSU5HIFBPU0lUSU9OCisJICovCisJZW51bQorCXsKKwkJRklFTERfQ09NUE9ORU5UX1BPU0lUSU9OICAgICAgICAgPSAweDAwMSwKKwkJRklFTERfQ09NUFVUQVRJT05fUE9TSVRJT04gICAgICAgPSAweDAwMiwKKwkJRklFTERfR1JPVVBfUE9TSVRJT04gICAgICAgICAgICAgPSAweDAwNCwKKwkJRklFTERfU1RBVEVfUE9TSVRJT04gICAgICAgICAgICAgPSAweDAwOCwKKwkJRklFTERfUFNFVURPU1RBVEVfUE9TSVRJT04gICAgICAgPSAweDAxMCwKKwkJRklFTERfRkVBVFVSRV9QT1NJVElPTiAgICAgICAgICAgPSAweDAyMCwKKwkJRklFTERfREVTSUdOX1BPU0lUSU9OICAgICAgICAgICAgPSAweDA0MCwKKworCQlFTkFCTEVfQUxMX0ZJRUxEUyAgICAgICAgICAgICAgICA9IDB4RkZGLAorCisJCUVOQUJMRV9DT01QT05FTlRfREVTSUdOX0ZJRUxEICAgID0gRklFTERfQ09NUE9ORU5UX1BPU0lUSU9OCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRklFTERfREVTSUdOX1BPU0lUSU9OLAorCisJCURJU0FCTEVfQ09NUE9ORU5UX0RFU0lHTl9GSUVMRCAgID0gKH4gRU5BQkxFX0NPTVBPTkVOVF9ERVNJR05fRklFTEQpLAorCisJCUVOQUJMRV9GRUFUVVJFX0RFU0lHTl9GSUVMRCAgICAgID0gRklFTERfRkVBVFVSRV9QT1NJVElPTgorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEZJRUxEX0RFU0lHTl9QT1NJVElPTiwKKworCQlESVNBQkxFX0ZFQVRVUkVfREVTSUdOX0ZJRUxEICAgICA9ICh+IEVOQUJMRV9GRUFUVVJFX0RFU0lHTl9GSUVMRCkKKworCX07CisKKworCS8qKgorCSAqIFNUQVRJQyBFWEVDVVRBQkxFIFNQRUNJRklFUgorCSAqLworCXN0YXRpYyBTcGVjaWZpZXIgRVhFQ1VUQUJMRV9VTkRFRklORURfU1BFQ0lGSUVSOworCisJc3RhdGljIFNwZWNpZmllciBDT01QT05FTlRfUEFDS0FHRV9TUEVDSUZJRVI7CisKKwlzdGF0aWMgU3BlY2lmaWVyIENPTVBPTkVOVF9TWVNURU1fU1BFQ0lGSUVSOworCisJc3RhdGljIFNwZWNpZmllciBDT01QT05FTlRfRVhFQ1VUQUJMRV9TUEVDSUZJRVI7CisKKwlzdGF0aWMgU3BlY2lmaWVyIENPTVBPTkVOVF9QUk9DRURVUkVfU1BFQ0lGSUVSOworCisJc3RhdGljIFNwZWNpZmllciBFWEVDVVRBQkxFX1BST0NFRFVSRV9DT01QT1NJVEVfU1BFQ0lGSUVSOworCisJc3RhdGljIFNwZWNpZmllciBFWEVDVVRBQkxFX1BST0NFRFVSRV9NT0RFTF9TUEVDSUZJRVI7CisKKwlzdGF0aWMgU3BlY2lmaWVyIEVYRUNVVEFCTEVfUFJPQ0VEVVJFX0lOU1RBTkNFX1NUQVRJQ19TUEVDSUZJRVI7CisKKwkvKioKKwkgKiBFWEVDVVRBQkxFIERFU0lHTgorCSAqLworCXN0YXRpYyBTcGVjaWZpZXIgREVTSUdOX01PREVMX1NQRUNJRklFUjsKKworCXN0YXRpYyBTcGVjaWZpZXIgREVTSUdOX1BST1RPVFlQRV9TVEFUSUNfU1BFQ0lGSUVSOworCisJc3RhdGljIFNwZWNpZmllciBERVNJR05fSU5TVEFOQ0VfU1RBVElDX1NQRUNJRklFUjsKKworCXN0YXRpYyBTcGVjaWZpZXIgREVTSUdOX0lOU1RBTkNFX0RZTkFNSUNfU1BFQ0lGSUVSOworCisKKworCS8qKgorCSAqIENPTlNUUlVDVE9SUworCSAqLworCVNwZWNpZmllcigpCisJOiBjb21wb25lbnQoIENPTVBPTkVOVF9VTkRFRklORURfS0lORCApLAorCWNvbXB1dGF0aW9uKCBNT0NfVU5ERUZJTkVEX0tJTkQgKSwKKworCWdyb3VwKCBHUk9VUF9VTkRFRklORURfS0lORCAgKSwKKwlzdGF0ZSggU1RBVEVfVU5ERUZJTkVEX01PQyAgICksCisJcHNldWRvc3RhdGUoIFBTRVVET1NUQVRFX1VOREVGSU5FRF9NT0MgKSwKKworCWZlYXR1cmUoIEZFQVRVUkVfVU5ERUZJTkVEX0tJTkQgKSwKKwlkZXNpZ24oIERFU0lHTl9VTkRFRklORURfS0lORCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlTcGVjaWZpZXIoYml0X2ZpZWxkX3QgY29tcG9uZW50S2luZCwKKwkJCWJpdF9maWVsZF90IG1vZGVsT2ZDb21wdXRhdGlvbktpbmQsIGJpdF9maWVsZF90IGdyb3VwS2luZCwKKwkJCWJpdF9maWVsZF90IHN0YXRlTW9jLCBiaXRfZmllbGRfdCBwc2V1ZG9zdGF0ZU1vYywKKwkJCWJpdF9maWVsZF90IGZlYXR1cmVLaW5kLCBiaXRfZmllbGRfdCBkZXNpZ25LaW5kKQorCTogY29tcG9uZW50KCBjb21wb25lbnRLaW5kICksCisJY29tcHV0YXRpb24oIG1vZGVsT2ZDb21wdXRhdGlvbktpbmQgKSwKKworCWdyb3VwKCBncm91cEtpbmQgKSwKKwlzdGF0ZSggc3RhdGVNb2MgICksCisJcHNldWRvc3RhdGUoIHBzZXVkb3N0YXRlTW9jICksCisKKwlmZWF0dXJlKCBmZWF0dXJlS2luZCApLAorCWRlc2lnbiggZGVzaWduS2luZCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlTcGVjaWZpZXIoQ09NUE9ORU5UX0tJTkQgY29tcG9uZW50S2luZCwgTU9DX0tJTkQgbW9kZWxPZkNvbXB1dGF0aW9uS2luZCkKKwk6IGNvbXBvbmVudCggY29tcG9uZW50S2luZCApLAorCWNvbXB1dGF0aW9uKCBtb2RlbE9mQ29tcHV0YXRpb25LaW5kICksCisKKwlncm91cCggR1JPVVBfVU5ERUZJTkVEX0tJTkQgKSwKKwlzdGF0ZSggU1RBVEVfVU5ERUZJTkVEX01PQyAgKSwKKwlwc2V1ZG9zdGF0ZSggUFNFVURPU1RBVEVfVU5ERUZJTkVEX01PQyApLAorCisJZmVhdHVyZSggRkVBVFVSRV9VTkRFRklORURfS0lORCApLAorCWRlc2lnbiggREVTSUdOX1VOREVGSU5FRF9LSU5EICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCVNwZWNpZmllcihDT01QT05FTlRfS0lORCBjb21wb25lbnRLaW5kLCBERVNJR05fS0lORCBkZXNpZ25LaW5kKQorCTogY29tcG9uZW50KCBjb21wb25lbnRLaW5kICksCisJY29tcHV0YXRpb24oIE1PQ19VTkRFRklORURfS0lORCApLAorCisJZ3JvdXAoIEdST1VQX1VOREVGSU5FRF9LSU5EICksCisJc3RhdGUoIFNUQVRFX1VOREVGSU5FRF9NT0MgICksCisJcHNldWRvc3RhdGUoIFBTRVVET1NUQVRFX1VOREVGSU5FRF9NT0MgKSwKKworCWZlYXR1cmUoIEZFQVRVUkVfVU5ERUZJTkVEX0tJTkQgKSwKKwlkZXNpZ24oIGRlc2lnbktpbmQgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJU3BlY2lmaWVyKENPTVBPTkVOVF9LSU5EIGNvbXBvbmVudEtpbmQpCisJOiBjb21wb25lbnQoIGNvbXBvbmVudEtpbmQgKSwKKwljb21wdXRhdGlvbiggTU9DX1VOREVGSU5FRF9LSU5EICksCisKKwlncm91cCggR1JPVVBfVU5ERUZJTkVEX0tJTkQgKSwKKwlzdGF0ZSggU1RBVEVfVU5ERUZJTkVEX01PQyAgKSwKKwlwc2V1ZG9zdGF0ZSAoIFBTRVVET1NUQVRFX1VOREVGSU5FRF9NT0MgKSwKKworCWZlYXR1cmUoIEZFQVRVUkVfVU5ERUZJTkVEX0tJTkQgKSwKKwlkZXNpZ24oIERFU0lHTl9VTkRFRklORURfS0lORCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlTcGVjaWZpZXIoTU9DX0tJTkQgbW9kZWxPZkNvbXB1dGF0aW9uS2luZCkKKwk6IGNvbXBvbmVudCggQ09NUE9ORU5UX1VOREVGSU5FRF9LSU5EICApLAorCWNvbXB1dGF0aW9uKCBtb2RlbE9mQ29tcHV0YXRpb25LaW5kICksCisKKwlncm91cCggR1JPVVBfVU5ERUZJTkVEX0tJTkQgKSwKKwlzdGF0ZSggU1RBVEVfVU5ERUZJTkVEX01PQyAgKSwKKwlwc2V1ZG9zdGF0ZSAoIFBTRVVET1NUQVRFX1VOREVGSU5FRF9NT0MgKSwKKworCWZlYXR1cmUoIEZFQVRVUkVfVU5ERUZJTkVEX0tJTkQgKSwKKwlkZXNpZ24oIERFU0lHTl9VTkRFRklORURfS0lORCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlTcGVjaWZpZXIoR1JPVVBfS0lORCBncm91cEtpbmQpCisJOiBjb21wb25lbnQoIENPTVBPTkVOVF9VTkRFRklORURfS0lORCApLAorCWNvbXB1dGF0aW9uKCBNT0NfVU5ERUZJTkVEX0tJTkQgKSwKKworCWdyb3VwKCBncm91cEtpbmQgKSwKKwlzdGF0ZSggU1RBVEVfVU5ERUZJTkVEX01PQyApLAorCXBzZXVkb3N0YXRlICggUFNFVURPU1RBVEVfVU5ERUZJTkVEX01PQyApLAorCisJZmVhdHVyZSggRkVBVFVSRV9VTkRFRklORURfS0lORCApLAorCWRlc2lnbiggREVTSUdOX1VOREVGSU5FRF9LSU5EICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCVNwZWNpZmllcihTVEFURV9NT0Mgc3RhdGVNb2MpCisJOiBjb21wb25lbnQoIENPTVBPTkVOVF9VTkRFRklORURfS0lORCAgKSwKKwljb21wdXRhdGlvbiggTU9DX1VOREVGSU5FRF9LSU5EICksCisKKwlncm91cCggR1JPVVBfVU5ERUZJTkVEX0tJTkQgKSwKKwlzdGF0ZSggc3RhdGVNb2MgKSwKKwlwc2V1ZG9zdGF0ZSAoIFBTRVVET1NUQVRFX1VOREVGSU5FRF9NT0MgKSwKKworCWZlYXR1cmUoIEZFQVRVUkVfVU5ERUZJTkVEX0tJTkQgKSwKKwlkZXNpZ24oIERFU0lHTl9VTkRFRklORURfS0lORCAgICAgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJU3BlY2lmaWVyKFBTRVVET1NUQVRFX01PQyBwc2V1ZG9zdGF0ZU1vYykKKwk6IGNvbXBvbmVudCggQ09NUE9ORU5UX1VOREVGSU5FRF9LSU5EICApLAorCWNvbXB1dGF0aW9uKCBNT0NfVU5ERUZJTkVEX0tJTkQgKSwKKworCWdyb3VwKCBHUk9VUF9VTkRFRklORURfS0lORCApLAorCXN0YXRlKCBTVEFURV9VTkRFRklORURfTU9DICApLAorCXBzZXVkb3N0YXRlICggcHNldWRvc3RhdGVNb2MgKSwKKworCWZlYXR1cmUoIEZFQVRVUkVfVU5ERUZJTkVEX0tJTkQgKSwKKwlkZXNpZ24oIERFU0lHTl9VTkRFRklORURfS0lORCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlTcGVjaWZpZXIoRkVBVFVSRV9LSU5EIGZlYXR1cmVLaW5kKQorCTogY29tcG9uZW50KCBDT01QT05FTlRfVU5ERUZJTkVEX0tJTkQgICksCisJY29tcHV0YXRpb24oIE1PQ19VTkRFRklORURfS0lORCApLAorCisJZ3JvdXAoIEdST1VQX1VOREVGSU5FRF9LSU5EICksCisJc3RhdGUoIFNUQVRFX1VOREVGSU5FRF9NT0MgICksCisJcHNldWRvc3RhdGUgKCBQU0VVRE9TVEFURV9VTkRFRklORURfTU9DICksCisKKwlmZWF0dXJlKCBmZWF0dXJlS2luZCApLAorCWRlc2lnbiggREVTSUdOX1VOREVGSU5FRF9LSU5EICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCVNwZWNpZmllcihERVNJR05fS0lORCBkZXNpZ25LaW5kKQorCTogY29tcG9uZW50KCBDT01QT05FTlRfVU5ERUZJTkVEX0tJTkQgICksCisJY29tcHV0YXRpb24oIE1PQ19VTkRFRklORURfS0lORCApLAorCisJZ3JvdXAoIEdST1VQX1VOREVGSU5FRF9LSU5EICksCisJc3RhdGUoIFNUQVRFX1VOREVGSU5FRF9NT0MgICksCisJcHNldWRvc3RhdGUgKCBQU0VVRE9TVEFURV9VTkRFRklORURfTU9DICksCisKKwlmZWF0dXJlKCBGRUFUVVJFX1VOREVGSU5FRF9LSU5EICksCisJZGVzaWduKCBkZXNpZ25LaW5kICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl+U3BlY2lmaWVyKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogVEVTVEVSCisJICovCisJaW5saW5lIGJvb2wgaXNEZWZpbmVkKCkgY29uc3QKKwl7CisJCXJldHVybiggICAgKGNvbXBvbmVudCAgICE9IENPTVBPTkVOVF9VTkRFRklORURfS0lORCApCisJCQkJfHwgKGNvbXB1dGF0aW9uICE9IE1PQ19VTkRFRklORURfS0lORCAgICAgICApCisJCQkJfHwgKGdyb3VwICAgICAgICE9IEdST1VQX1VOREVGSU5FRF9LSU5EICAgICApCisJCQkJfHwgKHN0YXRlICAgICAgICE9IFNUQVRFX1VOREVGSU5FRF9NT0MgICAgICApCisJCQkJfHwgKHBzZXVkb3N0YXRlICE9IFBTRVVET1NUQVRFX1VOREVGSU5FRF9NT0MpCisJCQkJfHwgKGZlYXR1cmUgICAgICE9IEZFQVRVUkVfVU5ERUZJTkVEX0tJTkQgICApCisJCQkJfHwgKGRlc2lnbiAgICAgICE9IERFU0lHTl9VTkRFRklORURfS0lORCAgICApICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBpc0RlZmluZWQoYml0X2ZpZWxkX3QgZW5hYmxlZEZpZWxkcykgY29uc3QKKwl7CisJCXJldHVybiggKCgoZW5hYmxlZEZpZWxkcyAgICAgJiBGSUVMRF9DT01QT05FTlRfUE9TSVRJT04gICkgIT0gMCkKKwkJCQkJJiYgKGNvbXBvbmVudCAgICE9IENPTVBPTkVOVF9VTkRFRklORURfS0lORCAgKSkKKworCQkJCXx8ICgoKGVuYWJsZWRGaWVsZHMgICYgRklFTERfQ09NUFVUQVRJT05fUE9TSVRJT04pICE9IDApCisJCQkJCSYmIChjb21wdXRhdGlvbiAhPSBNT0NfVU5ERUZJTkVEX0tJTkQgICAgICAgICkpCisKKwkJCQl8fCAoKChlbmFibGVkRmllbGRzICAmIEZJRUxEX0dST1VQX1BPU0lUSU9OICAgICAgKSAhPSAwKQorCQkJCQkmJiAoZ3JvdXAgICAgICAgIT0gR1JPVVBfVU5ERUZJTkVEX0tJTkQgICAgICApKQorCisJCQkJfHwgKCgoZW5hYmxlZEZpZWxkcyAgJiBGSUVMRF9TVEFURV9QT1NJVElPTiAgICAgICkgIT0gMCkKKwkJCQkJJiYgKHN0YXRlICAgICAgICE9IFNUQVRFX1VOREVGSU5FRF9NT0MgICAgICAgKSkKKworCQkJCXx8ICgoKGVuYWJsZWRGaWVsZHMgICYgRklFTERfUFNFVURPU1RBVEVfUE9TSVRJT04pICE9IDApCisJCQkJCSYmIChwc2V1ZG9zdGF0ZSAhPSBQU0VVRE9TVEFURV9VTkRFRklORURfTU9DICkpCisKKwkJCQl8fCAoKChlbmFibGVkRmllbGRzICAmIEZJRUxEX0ZFQVRVUkVfUE9TSVRJT04gICAgKSAhPSAwKQorCQkJCQkmJiAoZmVhdHVyZSAgICAgIT0gRkVBVFVSRV9VTkRFRklORURfS0lORCAgICApKQorCisJCQkJfHwgKCgoZW5hYmxlZEZpZWxkcyAgJiBGSUVMRF9ERVNJR05fUE9TSVRJT04gICAgICkgIT0gMCkKKwkJCQkJJiYgKGRlc2lnbiAgICAgICE9IERFU0lHTl9VTkRFRklORURfS0lORCAgICAgKSkgKTsKKwl9CisKKworCWlubGluZSBib29sIGlzRGVmaW5lZF9vdGhlclRoYW4oY29uc3QgU3BlY2lmaWVyICYgb3RoZXIpIGNvbnN0CisJeworCQlyZXR1cm4oICggKCp0aGlzKSAmICh+IG90aGVyKSApLmlzRGVmaW5lZCgpICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBpc1VuZGVmaW5lZCgpIGNvbnN0CisJeworCQlyZXR1cm4oICAgIChjb21wb25lbnQgICA9PSBDT01QT05FTlRfVU5ERUZJTkVEX0tJTkQgKQorCQkJCSYmIChjb21wdXRhdGlvbiA9PSBNT0NfVU5ERUZJTkVEX0tJTkQgICAgICAgKQorCQkJCSYmIChncm91cCAgICAgICA9PSBHUk9VUF9VTkRFRklORURfS0lORCAgICAgKQorCQkJCSYmIChzdGF0ZSAgICAgICA9PSBTVEFURV9VTkRFRklORURfTU9DICAgICAgKQorCQkJCSYmIChwc2V1ZG9zdGF0ZSA9PSBQU0VVRE9TVEFURV9VTkRFRklORURfTU9DKQorCQkJCSYmIChmZWF0dXJlICAgICA9PSBGRUFUVVJFX1VOREVGSU5FRF9LSU5EICAgKQorCQkJCSYmIChkZXNpZ24gICAgICA9PSBERVNJR05fVU5ERUZJTkVEX0tJTkQgICAgKSApOworCX0KKworCisJLyoqCisJICogU0VUVEVSCisJICovCisJU3BlY2lmaWVyICYgc2V0KGNvbnN0IHN0ZDo6c3RyaW5nIHN0clNwZWNpZmllcik7CisKKwlTcGVjaWZpZXIgJiBzZXRNb2MoY29uc3Qgc3RkOjpzdHJpbmcgc3RyU3BlY2lmaWVyKTsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIE9QRVJBVE9SID0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlpbmxpbmUgU3BlY2lmaWVyICYgb3ZlcnJpZGVfaWZkZWYoY29uc3QgU3BlY2lmaWVyICYgb3RoZXIpCisJeworCQlpZiggb3RoZXIuY29tcG9uZW50ICE9IENPTVBPTkVOVF9VTkRFRklORURfS0lORCApCisJCXsKKwkJCWNvbXBvbmVudCA9IG90aGVyLmNvbXBvbmVudDsKKwkJfQorCisJCWlmKCBvdGhlci5jb21wdXRhdGlvbiAhPSBNT0NfVU5ERUZJTkVEX0tJTkQgKQorCQl7CisJCQljb21wdXRhdGlvbiA9IG90aGVyLmNvbXB1dGF0aW9uOworCQl9CisKKwkJaWYoIG90aGVyLmdyb3VwICE9IEdST1VQX1VOREVGSU5FRF9LSU5EICkKKwkJeworCQkJZ3JvdXAgPSBvdGhlci5ncm91cDsKKwkJfQorCisJCWlmKCBvdGhlci5zdGF0ZSAhPSBTVEFURV9VTkRFRklORURfTU9DICkKKwkJeworCQkJc3RhdGUgPSBvdGhlci5zdGF0ZTsKKwkJfQorCQlpZiggb3RoZXIucHNldWRvc3RhdGUgIT0gUFNFVURPU1RBVEVfVU5ERUZJTkVEX01PQyApCisJCXsKKwkJCXBzZXVkb3N0YXRlID0gb3RoZXIucHNldWRvc3RhdGU7CisJCX0KKworCQlpZiggb3RoZXIuZmVhdHVyZSAhPSBGRUFUVVJFX1VOREVGSU5FRF9LSU5EICkKKwkJeworCQkJZmVhdHVyZSA9IG90aGVyLmZlYXR1cmU7CisJCX0KKworCQlpZiggb3RoZXIuZGVzaWduICE9IERFU0lHTl9VTkRFRklORURfS0lORCApCisJCXsKKwkJCWRlc2lnbiA9IG90aGVyLmRlc2lnbjsKKwkJfQorCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwlpbmxpbmUgU3BlY2lmaWVyICYgaWZub3RfZGVmaW5lKGNvbnN0IFNwZWNpZmllciAmIG90aGVyKQorCXsKKwkJaWYoIGNvbXBvbmVudCA9PSBDT01QT05FTlRfVU5ERUZJTkVEX0tJTkQgKQorCQl7CisJCQljb21wb25lbnQgPSBvdGhlci5jb21wb25lbnQ7CisJCX0KKworCQlpZiggKGNvbXB1dGF0aW9uIDw9IE1PQ19DT01QT1NJVEVfTUFTS19LSU5EKQorCQkJJiYgKG90aGVyLmNvbXB1dGF0aW9uICE9IE1PQ19VTkRFRklORURfS0lORCkgKQorCQl7CisJCQljb21wdXRhdGlvbiA9IG90aGVyLmNvbXB1dGF0aW9uOworCQl9CisKKwkJaWYoIChncm91cCA8PSBHUk9VUF9NQVNLX0tJTkQpCisJCQkmJiAob3RoZXIuZ3JvdXAgIT0gR1JPVVBfVU5ERUZJTkVEX0tJTkQpICkKKwkJeworCQkJZ3JvdXAgPSBvdGhlci5ncm91cDsKKwkJfQorCisJCWlmKCBzdGF0ZSA9PSBTVEFURV9VTkRFRklORURfTU9DICkKKwkJeworCQkJc3RhdGUgPSBvdGhlci5zdGF0ZTsKKwkJfQorCQlpZiggcHNldWRvc3RhdGUgPT0gUFNFVURPU1RBVEVfVU5ERUZJTkVEX01PQyApCisJCXsKKwkJCXBzZXVkb3N0YXRlID0gb3RoZXIucHNldWRvc3RhdGU7CisJCX0KKworCQlpZiggZmVhdHVyZSA9PSBGRUFUVVJFX1VOREVGSU5FRF9LSU5EICkKKwkJeworCQkJZmVhdHVyZSA9IG90aGVyLmZlYXR1cmU7CisJCX0KKworCQlpZiggZGVzaWduID09IERFU0lHTl9VTkRFRklORURfS0lORCApCisJCXsKKwkJCWRlc2lnbiA9IG90aGVyLmRlc2lnbjsKKwkJfQorCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBPUEVSQVRPUiAmPQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlubGluZSBTcGVjaWZpZXIgJiBvcGVyYXRvciY9KGNvbnN0IFNwZWNpZmllciAmIG90aGVyKQorCXsKKwkJY29tcG9uZW50ICAgJj0gb3RoZXIuY29tcG9uZW50OworCQljb21wdXRhdGlvbiAmPSBvdGhlci5jb21wdXRhdGlvbjsKKwkJZ3JvdXAgICAgICAgJj0gb3RoZXIuZ3JvdXA7CisJCXN0YXRlICAgICAgICY9IG90aGVyLnN0YXRlOworCQlwc2V1ZG9zdGF0ZSAmPSBvdGhlci5wc2V1ZG9zdGF0ZTsKKwkJZmVhdHVyZSAgICAgJj0gb3RoZXIuZmVhdHVyZTsKKwkJZGVzaWduICAgICAgJj0gb3RoZXIuZGVzaWduOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gT1BFUkFUT1IgfD0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlpbmxpbmUgU3BlY2lmaWVyICYgb3BlcmF0b3J8PShjb25zdCBTcGVjaWZpZXIgJiBvdGhlcikKKwl7CisJCWNvbXBvbmVudCAgIHw9IG90aGVyLmNvbXBvbmVudDsKKwkJY29tcHV0YXRpb24gfD0gb3RoZXIuY29tcHV0YXRpb247CisJCWdyb3VwICAgICAgIHw9IG90aGVyLmdyb3VwOworCQlzdGF0ZSAgICAgICB8PSBvdGhlci5zdGF0ZTsKKwkJcHNldWRvc3RhdGUgfD0gb3RoZXIucHNldWRvc3RhdGU7CisJCWZlYXR1cmUgICAgIHw9IG90aGVyLmZlYXR1cmU7CisJCWRlc2lnbiAgICAgIHw9IG90aGVyLmRlc2lnbjsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gT1BFUkFUT1IgPT0gICE9CisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTcGVjaWZpZXIgJiBvdGhlcikgY29uc3QKKwl7CisJCXJldHVybiggICAgKGNvbXBvbmVudCAgID09IG90aGVyLmNvbXBvbmVudCAgKQorCQkJCSYmIChjb21wdXRhdGlvbiA9PSBvdGhlci5jb21wdXRhdGlvbiAgKQorCQkJCSYmIChncm91cCAgICAgICA9PSBvdGhlci5ncm91cCAgICAgICkKKwkJCQkmJiAoc3RhdGUgICAgICAgPT0gb3RoZXIuc3RhdGUgICAgICApCisJCQkJJiYgKHBzZXVkb3N0YXRlID09IG90aGVyLnBzZXVkb3N0YXRlKQorCQkJCSYmIChmZWF0dXJlICAgICA9PSBvdGhlci5mZWF0dXJlICAgICkKKwkJCQkmJiAoZGVzaWduICAgICAgPT0gb3RoZXIuZGVzaWduICAgICApICk7CisJfQorCisJaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTcGVjaWZpZXIgJiBvdGhlcikgY29uc3QKKwl7CisJCXJldHVybiggICAgKGNvbXBvbmVudCAgICE9IG90aGVyLmNvbXBvbmVudCAgKQorCQkJCXx8IChjb21wdXRhdGlvbiAhPSBvdGhlci5jb21wdXRhdGlvbiAgKQorCQkJCXx8IChncm91cCAgICAgICAhPSBvdGhlci5ncm91cCAgICAgICkKKwkJCQl8fCAoc3RhdGUgICAgICAgIT0gb3RoZXIuc3RhdGUgICAgICApCisJCQkJfHwgKHBzZXVkb3N0YXRlICE9IG90aGVyLnBzZXVkb3N0YXRlKQorCQkJCXx8IChmZWF0dXJlICAgICAhPSBvdGhlci5mZWF0dXJlICAgICkKKwkJCQl8fCAoZGVzaWduICAgICAgIT0gb3RoZXIuZGVzaWduICAgICApICk7CisJfQorCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIE9QRVJBVE9SIHwKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlpbmxpbmUgU3BlY2lmaWVyIG9wZXJhdG9yfChjb25zdCBTcGVjaWZpZXIgJiBvdGhlcikgY29uc3QKKwl7CisJCXJldHVybiggU3BlY2lmaWVyKAorCQkJCWNvbXBvbmVudCAgIHwgb3RoZXIuY29tcG9uZW50LAorCQkJCWNvbXB1dGF0aW9uIHwgb3RoZXIuY29tcHV0YXRpb24sCisJCQkJZ3JvdXAgICAgICAgfCBvdGhlci5ncm91cCwKKwkJCQlzdGF0ZSAgICAgICB8IG90aGVyLnN0YXRlLAorCQkJCXBzZXVkb3N0YXRlIHwgb3RoZXIucHNldWRvc3RhdGUsCisJCQkJZmVhdHVyZSAgICAgfCBvdGhlci5mZWF0dXJlLAorCQkJCWRlc2lnbiAgICAgIHwgb3RoZXIuZGVzaWduICkgKTsKKwl9CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gT1BFUkFUT1IgJgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlubGluZSBTcGVjaWZpZXIgb3BlcmF0b3ImKGNvbnN0IFNwZWNpZmllciAmIG90aGVyKSBjb25zdAorCXsKKwkJcmV0dXJuKCBTcGVjaWZpZXIoCisJCQkJY29tcG9uZW50ICAgJiBvdGhlci5jb21wb25lbnQsCisJCQkJY29tcHV0YXRpb24gJiBvdGhlci5jb21wdXRhdGlvbiwKKwkJCQlncm91cCAgICAgICAmIG90aGVyLmdyb3VwLAorCQkJCXN0YXRlICAgICAgICYgb3RoZXIuc3RhdGUsCisJCQkJcHNldWRvc3RhdGUgJiBvdGhlci5wc2V1ZG9zdGF0ZSwKKwkJCQlmZWF0dXJlICAgICAmIG90aGVyLmZlYXR1cmUsCisJCQkJZGVzaWduICAgICAgJiBvdGhlci5kZXNpZ24gKSApOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIE9QRVJBVE9SICYKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlpbmxpbmUgU3BlY2lmaWVyIG9wZXJhdG9yfigpIGNvbnN0CisJeworCQlyZXR1cm4oIFNwZWNpZmllcigKKwkJCQkofiBjb21wb25lbnQpLAorCQkJCSh+IGNvbXB1dGF0aW9uKSwKKwkJCQkofiBncm91cCksCisJCQkJKH4gc3RhdGUpLAorCQkJCSh+IHBzZXVkb3N0YXRlKSwKKwkJCQkofiBmZWF0dXJlKSwKKwkJCQkofiBkZXNpZ24pICkgKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBDT01QT05FTlQgS0lORAorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIGNvbXBvbmVudAorCSAqLworCWlubGluZSBDT01QT05FTlRfS0lORCBnZXRDb21wb25lbnRLaW5kKCkgY29uc3QKKwl7CisJCXJldHVybiggc3RhdGljX2Nhc3Q8IENPTVBPTkVOVF9LSU5EID4oIGNvbXBvbmVudCApICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzQ29tcG9uZW50S2luZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIGNvbXBvbmVudCAhPSBDT01QT05FTlRfVU5ERUZJTkVEX0tJTkQgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBub25lQ29tcG9uZW50S2luZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIGNvbXBvbmVudCA9PSBDT01QT05FTlRfVU5ERUZJTkVEX0tJTkQgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc0NvbXBvbmVudEtpbmQoQ09NUE9ORU5UX0tJTkQgY29tcG9uZW50S2luZCkgY29uc3QKKwl7CisJCXJldHVybiggY29tcG9uZW50ID09IGNvbXBvbmVudEtpbmQgKTsKKwl9CisKKwlpbmxpbmUgU3BlY2lmaWVyICYgYWRkQ29tcG9uZW50S2luZChDT01QT05FTlRfS0lORCBjb21wb25lbnRLaW5kKQorCXsKKwkJY29tcG9uZW50IHw9IGNvbXBvbmVudEtpbmQ7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCWlubGluZSBTcGVjaWZpZXIgJiByZW1Db21wb25lbnRLaW5kKENPTVBPTkVOVF9LSU5EIGNvbXBvbmVudEtpbmQpCisJeworCQljb21wb25lbnQgJj0gKH4gY29tcG9uZW50S2luZCk7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCWlubGluZSBTcGVjaWZpZXIgJiBzZXRDb21wb25lbnRLaW5kKENPTVBPTkVOVF9LSU5EIGNvbXBvbmVudEtpbmQpCisJeworCQljb21wb25lbnQgPSBjb21wb25lbnRLaW5kOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwlpbmxpbmUgU3BlY2lmaWVyICYgdW5zZXRDb21wb25lbnRLaW5kKCkKKwl7CisJCWNvbXBvbmVudCA9IENPTVBPTkVOVF9VTkRFRklORURfS0lORDsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAic3lzdGVtIiBjb21wb25lbnQKKwkgKi8KKwlpbmxpbmUgYm9vbCBpc0NvbXBvbmVudFN5c3RlbSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGNvbXBvbmVudCA9PSBDT01QT05FTlRfU1lTVEVNX0tJTkQgKTsKKwl9CisKKwlpbmxpbmUgU3BlY2lmaWVyICYgc2V0Q29tcG9uZW50U3lzdGVtKCkKKwl7CisJCWNvbXBvbmVudCA9IENPTVBPTkVOVF9TWVNURU1fS0lORDsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogImV4ZWN1dGFibGUiIGNvbXBvbmVudAorCSAqLworCWlubGluZSBib29sIGlzQ29tcG9uZW50RXhlY3V0YWJsZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGNvbXBvbmVudCA9PSBDT01QT05FTlRfRVhFQ1VUQUJMRV9LSU5EICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIHNldENvbXBvbmVudEV4ZWN1dGFibGUoKQorCXsKKwkJY29tcG9uZW50ID0gQ09NUE9ORU5UX0VYRUNVVEFCTEVfS0lORDsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogInByb2NlZHVyZSIgY29tcG9uZW50CisJICovCisJaW5saW5lIGJvb2wgaXNDb21wb25lbnRQcm9jZWR1cmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBjb21wb25lbnQgPT0gQ09NUE9ORU5UX1BST0NFRFVSRV9LSU5EICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIHNldENvbXBvbmVudFByb2NlZHVyZSgpCisJeworCQljb21wb25lbnQgPSBDT01QT05FTlRfUFJPQ0VEVVJFX0tJTkQ7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqICJyb3V0aW5lIiBjb21wb25lbnQKKwkgKi8KKwlpbmxpbmUgYm9vbCBpc0NvbXBvbmVudFJvdXRpbmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBjb21wb25lbnQgPT0gQ09NUE9ORU5UX1JPVVRJTkVfS0lORCApOworCX0KKworCWlubGluZSBTcGVjaWZpZXIgJiBzZXRDb21wb25lbnRSb3V0aW5lKCkKKwl7CisJCWNvbXBvbmVudCA9IENPTVBPTkVOVF9ST1VUSU5FX0tJTkQ7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqICJzdGF0ZW1hY2hpbmUiIGNvbXBvbmVudAorCSAqLworCWlubGluZSBib29sIGlzQ29tcG9uZW50U3RhdGVtYWNoaW5lKCkgY29uc3QKKwl7CisJCXJldHVybiggY29tcG9uZW50ID09IENPTVBPTkVOVF9TVEFURU1BQ0hJTkVfS0lORCApOworCX0KKworCWlubGluZSBTcGVjaWZpZXIgJiBzZXRDb21wb25lbnRTdGF0ZW1hY2hpbmUoKQorCXsKKwkJY29tcG9uZW50ID0gQ09NUE9ORU5UX1NUQVRFTUFDSElORV9LSU5EOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAic3RhdGUiIGNvbXBvbmVudAorCSAqLworCWlubGluZSBib29sIGlzQ29tcG9uZW50U3RhdGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBjb21wb25lbnQgPT0gQ09NUE9ORU5UX1NUQVRFX0tJTkQgKTsKKwl9CisKKwlpbmxpbmUgU3BlY2lmaWVyICYgc2V0Q29tcG9uZW50U3RhdGUoKQorCXsKKwkJY29tcG9uZW50ID0gQ09NUE9ORU5UX1NUQVRFX0tJTkQ7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqICJwc2V1ZG9zdGF0ZSIgY29tcG9uZW50CisJICovCisJaW5saW5lIGJvb2wgaXNDb21wb25lbnRQc2V1ZG9zdGF0ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGNvbXBvbmVudCA9PSBDT01QT05FTlRfUFNFVURPU1RBVEVfS0lORCApOworCX0KKworCWlubGluZSBTcGVjaWZpZXIgJiBzZXRDb21wb25lbnRQc2V1ZG9zdGF0ZSgpCisJeworCQljb21wb25lbnQgPSBDT01QT05FTlRfUFNFVURPU1RBVEVfS0lORDsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBNT0RFTCBPRiBDT01QVVRBVElPTgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIE1vZGVsIE9mIENvbXB1dGF0aW9uCisJICovCisJaW5saW5lIE1PQ19LSU5EIGdldE1vZGVsT2ZDb21wdXRhdGlvbigpIGNvbnN0CisJeworCQlyZXR1cm4oIHN0YXRpY19jYXN0PCBNT0NfS0lORCA+KCBjb21wdXRhdGlvbiApICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzTW9kZWxPZkNvbXB1dGF0aW9uKCkgY29uc3QKKwl7CisJCXJldHVybiggY29tcHV0YXRpb24gIT0gTU9DX1VOREVGSU5FRF9LSU5EICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNNb2RlbE9mQ29tcHV0YXRpb24oTU9DX0tJTkQgbW9kZWxPZkNvbXB1dGF0aW9uS2luZCkgY29uc3QKKwl7CisJCXJldHVybiggY29tcHV0YXRpb24gPT0gbW9kZWxPZkNvbXB1dGF0aW9uS2luZCApOworCX0KKworCWlubGluZSBTcGVjaWZpZXIgJiBzZXRNb2RlbE9mQ29tcHV0YXRpb24oTU9DX0tJTkQgbW9kZWxPZkNvbXB1dGF0aW9uS2luZCkKKwl7CisJCWNvbXB1dGF0aW9uID0gbW9kZWxPZkNvbXB1dGF0aW9uS2luZDsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIHVuc2V0TW9kZWxPZkNvbXB1dGF0aW9uKCkKKwl7CisJCWNvbXB1dGF0aW9uID0gTU9DX1VOREVGSU5FRF9LSU5EOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqICJjb21wb3NpdGUiIE1vZGVsIE9mIENvbXB1dGF0aW9uCisJICovCisJaW5saW5lIGJvb2wgaGFzTW9jQ29tcG9zaXRlKCkgY29uc3QKKwl7CisJCXJldHVybiggKGNvbXB1dGF0aW9uICYgTU9DX0NPTVBPU0lURV9NQVNLX0tJTkQpICE9IDAgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBub25lTW9jQ29tcG9zaXRlKCkgY29uc3QKKwl7CisJCXJldHVybiggY29tcHV0YXRpb24gPT0gTU9DX1VOREVGSU5FRF9LSU5EICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIHNldE1vY0NvbXBvc2l0ZSgpCisJeworCQljb21wdXRhdGlvbiA9IE1PQ19DT01QT1NJVEVfTUFTS19LSU5EOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAiQU5EIiBhcyBjb21wb3NpdGUgc3RydWN0dXJlIE1PQworCSAqLworCWlubGluZSBib29sIGlzTW9jQ29tcG9zaXRlU3RydWN0dXJlKCkgY29uc3QKKwl7CisJCXJldHVybiggY29tcHV0YXRpb24gPT0gTU9DX0NPTVBPU0lURV9TVFJVQ1RVUkVfS0lORCApOworCX0KKworCWlubGluZSBTcGVjaWZpZXIgJiBzZXRNb2NDb21wb3NpdGVTdHJ1Y3R1cmUoKQorCXsKKwkJY29tcHV0YXRpb24gPSBNT0NfQ09NUE9TSVRFX1NUUlVDVFVSRV9LSU5EOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqICJPUiIgYXMgU3RhdGUgVHJhbnNpdGlvbiBNT0MKKwkgKi8KKwlpbmxpbmUgYm9vbCBpc01vY1N0YXRlVHJhbnNpdGlvblN0cnVjdHVyZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIChjb21wdXRhdGlvbiAmIE1PQ19TVEFURV9UUkFOU0lUSU9OX1NUUlVDVFVSRV9LSU5EKQorCQkJCT09IE1PQ19TVEFURV9UUkFOU0lUSU9OX1NUUlVDVFVSRV9LSU5EICk7CisJfQorCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogIk9SIiBhcyBTdGF0ZSBUcmFuc2l0aW9uIFN5c3RlbSBNT0MKKwkgKiBoYXMgYXQgbGVhc3Qgb25lIHN0YXRlPCBzaW1wbGUgPgorCSAqLworCWlubGluZSBib29sIGlzTW9jU3RhdGVUcmFuc2l0aW9uU3lzdGVtKCkgY29uc3QKKwl7CisJCXJldHVybiggY29tcHV0YXRpb24gPT0gTU9DX1NUQVRFX1RSQU5TSVRJT05fU1lTVEVNX0tJTkQgKTsKKwl9CisKKwlpbmxpbmUgU3BlY2lmaWVyICYgc2V0TW9jU3RhdGVUcmFuc2l0aW9uU3lzdGVtKCkKKwl7CisJCWNvbXB1dGF0aW9uID0gTU9DX1NUQVRFX1RSQU5TSVRJT05fU1lTVEVNX0tJTkQ7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqICJPUiIgYXMgU3RhdGUgVHJhbnNpdGlvbiBGbG93IE1PQworCSAqIGhhcyBvbmx5IHBzZXVkb3N0YXRlCisJICovCisJaW5saW5lIGJvb2wgaXNNb2NTdGF0ZVRyYW5zaXRpb25GbG93KCkgY29uc3QKKwl7CisJCXJldHVybiggY29tcHV0YXRpb24gPT0gTU9DX1NUQVRFX1RSQU5TSVRJT05fRkxPV19LSU5EICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIHNldE1vY1N0YXRlVHJhbnNpdGlvbkZsb3coKQorCXsKKwkJY29tcHV0YXRpb24gPSBNT0NfU1RBVEVfVFJBTlNJVElPTl9GTE9XX0tJTkQ7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogIkZMT1ciIGFzIERhdGFGbG93IGNvbXB1dGF0aW9uCisJICovCisJaW5saW5lIGJvb2wgaXNDb21wb3NpdGVNb2NEYXRhRmxvdygpIGNvbnN0CisJeworCQlyZXR1cm4oIGNvbXB1dGF0aW9uID09IE1PQ19EQVRBX0ZMT1dfS0lORCApOworCX0KKworCWlubGluZSBTcGVjaWZpZXIgJiBzZXRDb21wb3NpdGVNb2NEYXRhRmxvdygpCisJeworCQljb21wdXRhdGlvbiA9IE1PQ19EQVRBX0ZMT1dfS0lORDsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gR1JPVVAgS0lORAorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIGdyb3VwCisJICovCisJaW5saW5lIEdST1VQX0tJTkQgZ2V0R3JvdXBLaW5kKCkgY29uc3QKKwl7CisJCXJldHVybiggc3RhdGljX2Nhc3Q8IEdST1VQX0tJTkQgPiggZ3JvdXAgKSApOworCX0KKworCWlubGluZSBib29sIGhhc0dyb3VwS2luZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIGdyb3VwICE9IEdST1VQX1VOREVGSU5FRF9LSU5EICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNHcm91cEtpbmQoR1JPVVBfS0lORCBncm91cEtpbmQpIGNvbnN0CisJeworCQlyZXR1cm4oIGdyb3VwID09IGdyb3VwS2luZCApOworCX0KKworCWlubGluZSBTcGVjaWZpZXIgJiBzZXRHcm91cEtpbmQoR1JPVVBfS0lORCBncm91cEtpbmQpCisJeworCQlncm91cCA9IGdyb3VwS2luZDsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIHVuc2V0R3JvdXBLaW5kKCkKKwl7CisJCWdyb3VwID0gR1JPVVBfVU5ERUZJTkVEX0tJTkQ7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogImdyb3VwIgorCSAqLworCWlubGluZSBib29sIGhhc0dyb3VwTWFzaygpIGNvbnN0CisJeworCQlyZXR1cm4oIChncm91cCAmIEdST1VQX01BU0tfS0lORCkgIT0gMCApOworCX0KKworCWlubGluZSBTcGVjaWZpZXIgJiBzZXRHcm91cE1hc0soKQorCXsKKwkJZ3JvdXAgPSBHUk9VUF9NQVNLX0tJTkQ7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqICJzb21lIiBncm91cAorCSAqLworCWlubGluZSBib29sIGlzR3JvdXBTb21lKCkgY29uc3QKKwl7CisJCXJldHVybiggZ3JvdXAgPT0gR1JPVVBfU09NRV9LSU5EICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIHNldEdyb3VwU29tZSgpCisJeworCQlncm91cCA9IEdST1VQX1NPTUVfS0lORDsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogImV4Y2VwdCIgZ3JvdXAKKwkgKi8KKwlpbmxpbmUgYm9vbCBpc0dyb3VwRXhjZXB0KCkgY29uc3QKKwl7CisJCXJldHVybiggZ3JvdXAgPT0gR1JPVVBfRVhDRVBUX0tJTkQgKTsKKwl9CisKKwlpbmxpbmUgU3BlY2lmaWVyICYgc2V0R3JvdXBFeGNlcHQoKQorCXsKKwkJZ3JvdXAgPSBHUk9VUF9FWENFUFRfS0lORDsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogImV2ZXJ5IiBncm91cAorCSAqLworCWlubGluZSBib29sIGlzR3JvdXBFdmVyeSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGdyb3VwID09IEdST1VQX0VWRVJZX0tJTkQgKTsKKwl9CisKKwlpbmxpbmUgU3BlY2lmaWVyICYgc2V0R3JvdXBFdmVyeSgpCisJeworCQlncm91cCA9IEdST1VQX0VWRVJZX0tJTkQ7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFNUQVRFIE1PQworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIHN0YXRlCisJICovCisJaW5saW5lIFNUQVRFX01PQyBnZXRTdGF0ZU1vYygpIGNvbnN0CisJeworCQlyZXR1cm4oIHN0YXRpY19jYXN0PCBTVEFURV9NT0MgPiggc3RhdGUgKSApOworCX0KKworCWlubGluZSBib29sIGhhc1N0YXRlTW9jKCkgY29uc3QKKwl7CisJCXJldHVybiggc3RhdGUgIT0gU1RBVEVfVU5ERUZJTkVEX01PQyApOworCX0KKworCWlubGluZSBib29sIG5vbmVTdGF0ZU1vYygpIGNvbnN0CisJeworCQlyZXR1cm4oIHN0YXRlID09IFNUQVRFX1VOREVGSU5FRF9NT0MgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc1N0YXRlTW9jKFNUQVRFX01PQyBzdGF0ZU1vYykgY29uc3QKKwl7CisJCXJldHVybiggc3RhdGUgPT0gc3RhdGVNb2MgKTsKKwl9CisKKwlpbmxpbmUgU3BlY2lmaWVyICYgYWRkU3RhdGVNb2MoU1RBVEVfTU9DIHN0YXRlTW9jKQorCXsKKwkJc3RhdGUgfD0gc3RhdGVNb2M7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCWlubGluZSBTcGVjaWZpZXIgJiByZW1TdGF0ZU1vYyhTVEFURV9NT0Mgc3RhdGVNb2MpCisJeworCQlzdGF0ZSAmPSAofiBzdGF0ZU1vYyk7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCWlubGluZSBTcGVjaWZpZXIgJiBzZXRTdGF0ZU1vYyhTVEFURV9NT0Mgc3RhdGVNb2MpCisJeworCQlzdGF0ZSA9IHN0YXRlTW9jOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwlpbmxpbmUgU3BlY2lmaWVyICYgdW5zZXRTdGF0ZU1vYygpCisJeworCQlzdGF0ZSA9IFNUQVRFX1VOREVGSU5FRF9NT0M7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCS8qKgorCSAqIE1JWC1JTiB3aXRoIGNvbXBvbmVudCAic3RhdGUiCisJICovCisJaW5saW5lIGJvb2wgaXNTdGF0ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGlzQ29tcG9uZW50U3RhdGUoKSAmJiBoYXNTdGF0ZU1vYygpICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAiU0lNUExFIiBzdGF0ZQorCSAqLworCWlubGluZSBib29sIGlzU3RhdGVNb2NTSU1QTEUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBzdGF0ZSA9PSBTVEFURV9TSU1QTEVfTU9DICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIHNldFN0YXRlTW9jU0lNUExFKCkKKwl7CisJCXN0YXRlID0gU1RBVEVfU0lNUExFX01PQzsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJLyoqCisJICogTUlYLUlOIHdpdGggY29tcG9uZW50ICJzdGF0ZSIKKwkgKi8KKwlpbmxpbmUgYm9vbCBpc1N0YXRlU2ltcGxlKCkgY29uc3QKKwl7CisJCXJldHVybiggaXNDb21wb25lbnRTdGF0ZSgpICYmIGlzU3RhdGVNb2NTSU1QTEUoKSApOworCX0KKworCWlubGluZSBTcGVjaWZpZXIgJiBzZXRTdGF0ZVNpbXBsZSgpCisJeworCQlzZXRDb21wb25lbnRTdGF0ZSgpOworCQlzZXRTdGF0ZU1vY1NJTVBMRSgpOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAiU1RBUlQiIHN0YXRlCisJICovCisJaW5saW5lIGJvb2wgaXNTdGF0ZU1vY1NUQVJUKCkgY29uc3QKKwl7CisJCXJldHVybiggc3RhdGUgPT0gU1RBVEVfU1RBUlRfTU9DICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzU3RhdGVNb2NTVEFSVCgpIGNvbnN0CisJeworCQlyZXR1cm4oIChzdGF0ZSAmIFNUQVRFX1NUQVJUX01PQykgIT0gMCApOworCX0KKworCWlubGluZSBTcGVjaWZpZXIgJiBhZGRTdGF0ZU1vY1NUQVJUKCkKKwl7CisJCXN0YXRlIHw9IFNUQVRFX1NUQVJUX01PQzsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIHNldFN0YXRlTW9jU1RBUlQoKQorCXsKKwkJc3RhdGUgPSBTVEFURV9TVEFSVF9NT0M7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCS8qKgorCSAqIE1JWC1JTiB3aXRoIGNvbXBvbmVudCAic3RhdGUiCisJICovCisJaW5saW5lIGJvb2wgaXNTdGF0ZVN0YXJ0KCkgY29uc3QKKwl7CisJCXJldHVybiggaXNDb21wb25lbnRTdGF0ZSgpICYmIGlzU3RhdGVNb2NTVEFSVCgpICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIHNldFN0YXRlU3RhcnQoKQorCXsKKwkJc2V0Q29tcG9uZW50U3RhdGUoKTsKKwkJc2V0U3RhdGVNb2NTVEFSVCgpOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAiRklOQUwiIHN0YXRlCisJICovCisJaW5saW5lIGJvb2wgaXNTdGF0ZU1vY0ZJTkFMKCkgY29uc3QKKwl7CisJCXJldHVybiggc3RhdGUgPT0gU1RBVEVfRklOQUxfTU9DICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzU3RhdGVNb2NGSU5BTCgpIGNvbnN0CisJeworCQlyZXR1cm4oIChzdGF0ZSAmIFNUQVRFX0ZJTkFMX01PQykgIT0gMCApOworCX0KKworCWlubGluZSBTcGVjaWZpZXIgJiBhZGRTdGF0ZU1vY0ZJTkFMKCkKKwl7CisJCXN0YXRlIHw9IFNUQVRFX0ZJTkFMX01PQzsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIHNldFN0YXRlTW9jRklOQUwoKQorCXsKKwkJc3RhdGUgPSBTVEFURV9GSU5BTF9NT0M7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCS8qKgorCSAqIE1JWC1JTiB3aXRoIGNvbXBvbmVudCAic3RhdGUiCisJICovCisJaW5saW5lIGJvb2wgaXNTdGF0ZUZpbmFsKCkgY29uc3QKKwl7CisJCXJldHVybiggaXNDb21wb25lbnRTdGF0ZSgpICYmIGlzU3RhdGVNb2NGSU5BTCgpICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIHNldFN0YXRlRmluYWwoKQorCXsKKwkJc2V0Q29tcG9uZW50U3RhdGUoKTsKKwkJc2V0U3RhdGVNb2NGSU5BTCgpOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAiU1lOQyIgc3RhdGUKKwkgKi8KKwlpbmxpbmUgYm9vbCBpc1N0YXRlTW9jU1lOQygpIGNvbnN0CisJeworCQlyZXR1cm4oIHN0YXRlID09IFNUQVRFX1NZTkNfTU9DICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIHNldFN0YXRlTW9jU1lOQygpCisJeworCQlzdGF0ZSA9IFNUQVRFX1NZTkNfTU9DOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwkvKioKKwkgKiBNSVgtSU4gd2l0aCBjb21wb25lbnQgInN0YXRlIgorCSAqLworCWlubGluZSBib29sIGlzU3RhdGVTeW5jKCkgY29uc3QKKwl7CisJCXJldHVybiggaXNDb21wb25lbnRTdGF0ZSgpICYmIGlzU3RhdGVNb2NTWU5DKCkgKTsKKwl9CisKKwlpbmxpbmUgU3BlY2lmaWVyICYgc2V0U3RhdGVTeW5jKCkKKwl7CisJCXNldENvbXBvbmVudFN0YXRlKCk7CisJCXNldFN0YXRlTW9jU1lOQygpOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBQU0VVRE9TVEFURSBNT0MKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBwc2V1ZG9zdGF0ZQorCSAqLworCWlubGluZSBQU0VVRE9TVEFURV9NT0MgZ2V0UHNldWRvc3RhdGVNb2MoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBzdGF0aWNfY2FzdDwgUFNFVURPU1RBVEVfTU9DID4oIHBzZXVkb3N0YXRlICkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNQc2V1ZG9zdGF0ZU1vYygpIGNvbnN0CisJeworCQlyZXR1cm4oIHBzZXVkb3N0YXRlICE9IFBTRVVET1NUQVRFX1VOREVGSU5FRF9NT0MgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBub25lUHNldWRvc3RhdGVNb2MoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBwc2V1ZG9zdGF0ZSA9PSBQU0VVRE9TVEFURV9VTkRFRklORURfTU9DICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNQc2V1ZG9zdGF0ZU1vYyhQU0VVRE9TVEFURV9NT0MgcHNldWRvc3RhdGVNb2MpIGNvbnN0CisJeworCQlyZXR1cm4oIHBzZXVkb3N0YXRlID09IHBzZXVkb3N0YXRlTW9jICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIGFkZFBzZXVkb3N0YXRlTW9jKFBTRVVET1NUQVRFX01PQyBwc2V1ZG9zdGF0ZU1vYykKKwl7CisJCXBzZXVkb3N0YXRlIHw9IHBzZXVkb3N0YXRlTW9jOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwlpbmxpbmUgU3BlY2lmaWVyICYgcmVtUHNldWRvc3RhdGVNb2MoUFNFVURPU1RBVEVfTU9DIHBzZXVkb3N0YXRlTW9jKQorCXsKKwkJcHNldWRvc3RhdGUgJj0gKH4gcHNldWRvc3RhdGVNb2MpOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwlpbmxpbmUgU3BlY2lmaWVyICYgc2V0UHNldWRvc3RhdGVNb2MoUFNFVURPU1RBVEVfTU9DIHBzZXVkb3N0YXRlTW9jKQorCXsKKwkJcHNldWRvc3RhdGUgPSBwc2V1ZG9zdGF0ZU1vYzsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIHVuc2V0UHNldWRvc3RhdGVNb2MoKQorCXsKKwkJcHNldWRvc3RhdGUgPSBQU0VVRE9TVEFURV9VTkRFRklORURfTU9DOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwkvKioKKwkgKiBNSVgtSU4gd2l0aCBjb21wb25lbnQgInBzZXVkb3N0YXRlIgorCSAqLworCWlubGluZSBib29sIGlzUHNldWRvc3RhdGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBpc0NvbXBvbmVudFBzZXVkb3N0YXRlKCkgJiYgaGFzUHNldWRvc3RhdGVNb2MoKSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogIklOSVRJQUwiIHBzZXVkb3N0YXRlCisJICovCisJaW5saW5lIGJvb2wgaXNQc2V1ZG9zdGF0ZU1vY0lOSVRJQUwoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBwc2V1ZG9zdGF0ZSA9PSBQU0VVRE9TVEFURV9JTklUSUFMX01PQyApOworCX0KKworCWlubGluZSBib29sIGhhc1BzZXVkb3N0YXRlTW9jSU5JVElBTCgpIGNvbnN0CisJeworCQlyZXR1cm4oIChwc2V1ZG9zdGF0ZSAmIFBTRVVET1NUQVRFX0lOSVRJQUxfTU9DKSAhPSAwICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIGFkZFBzZXVkb3N0YXRlTW9jSU5JVElBTCgpCisJeworCQlwc2V1ZG9zdGF0ZSB8PSBQU0VVRE9TVEFURV9JTklUSUFMX01PQzsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIHNldFBzZXVkb3N0YXRlTW9jSU5JVElBTCgpCisJeworCQlwc2V1ZG9zdGF0ZSA9IFBTRVVET1NUQVRFX0lOSVRJQUxfTU9DOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwkvKioKKwkgKiBNSVgtSU4gd2l0aCBjb21wb25lbnQgInBzZXVkb3N0YXRlIgorCSAqLworCWlubGluZSBib29sIGlzUHNldWRvc3RhdGVJbml0aWFsKCkgY29uc3QKKwl7CisJCXJldHVybiggaXNDb21wb25lbnRQc2V1ZG9zdGF0ZSgpICYmIGlzUHNldWRvc3RhdGVNb2NJTklUSUFMKCkgKTsKKwl9CisKKwlpbmxpbmUgU3BlY2lmaWVyICYgc2V0UHNldWRvc3RhdGVJbml0aWFsKCkKKwl7CisJCXNldENvbXBvbmVudFBzZXVkb3N0YXRlKCk7CisJCXNldFBzZXVkb3N0YXRlTW9jSU5JVElBTCgpOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAiVEVSTUlOQUwiIHBzZXVkb3N0YXRlCisJICovCisJaW5saW5lIGJvb2wgaXNQc2V1ZG9zdGF0ZU1vY1RFUk1JTkFMKCkgY29uc3QKKwl7CisJCXJldHVybiggcHNldWRvc3RhdGUgPT0gUFNFVURPU1RBVEVfVEVSTUlOQUxfTU9DICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzUHNldWRvc3RhdGVNb2NURVJNSU5BTCgpIGNvbnN0CisJeworCQlyZXR1cm4oIChwc2V1ZG9zdGF0ZSAmIFBTRVVET1NUQVRFX1RFUk1JTkFMX01PQykgIT0gMCApOworCX0KKworCWlubGluZSBTcGVjaWZpZXIgJiBhZGRQc2V1ZG9zdGF0ZU1vY1RFUk1JTkFMKCkKKwl7CisJCXBzZXVkb3N0YXRlIHw9IFBTRVVET1NUQVRFX1RFUk1JTkFMX01PQzsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIHNldFBzZXVkb3N0YXRlTW9jVEVSTUlOQUwoKQorCXsKKwkJcHNldWRvc3RhdGUgPSBQU0VVRE9TVEFURV9URVJNSU5BTF9NT0M7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCS8qKgorCSAqIE1JWC1JTiB3aXRoIGNvbXBvbmVudCAicHNldWRvc3RhdGUiCisJICovCisJaW5saW5lIGJvb2wgaXNQc2V1ZG9zdGF0ZVRlcm1pbmFsKCkgY29uc3QKKwl7CisJCXJldHVybiggaXNDb21wb25lbnRQc2V1ZG9zdGF0ZSgpICYmIGlzUHNldWRvc3RhdGVNb2NURVJNSU5BTCgpICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIHNldFBzZXVkb3N0YXRlVGVybWluYWwoKQorCXsKKwkJc2V0Q29tcG9uZW50UHNldWRvc3RhdGUoKTsKKwkJc2V0UHNldWRvc3RhdGVNb2NURVJNSU5BTCgpOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAiUkVUVVJOIiBwc2V1ZG9zdGF0ZQorCSAqLworCWlubGluZSBib29sIGlzUHNldWRvc3RhdGVNb2NSRVRVUk4oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBwc2V1ZG9zdGF0ZSA9PSBQU0VVRE9TVEFURV9SRVRVUk5fTU9DICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzUHNldWRvc3RhdGVNb2NSRVRVUk4oKSBjb25zdAorCXsKKwkJcmV0dXJuKCAocHNldWRvc3RhdGUgJiBQU0VVRE9TVEFURV9SRVRVUk5fTU9DKSAhPSAwICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIGFkZFBzZXVkb3N0YXRlTW9jUkVUVVJOKCkKKwl7CisJCXBzZXVkb3N0YXRlIHw9IFBTRVVET1NUQVRFX1JFVFVSTl9NT0M7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCWlubGluZSBTcGVjaWZpZXIgJiBzZXRQc2V1ZG9zdGF0ZU1vY1JFVFVSTigpCisJeworCQlwc2V1ZG9zdGF0ZSA9IFBTRVVET1NUQVRFX1JFVFVSTl9NT0M7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCisJLyoqCisJICogTUlYLUlOIHdpdGggY29tcG9uZW50ICJwc2V1ZG9zdGF0ZSIKKwkgKi8KKwlpbmxpbmUgYm9vbCBpc1BzZXVkb3N0YXRlUmV0dXJuKCkgY29uc3QKKwl7CisJCXJldHVybiggaXNDb21wb25lbnRQc2V1ZG9zdGF0ZSgpICYmIGlzUHNldWRvc3RhdGVNb2NSRVRVUk4oKSApOworCX0KKworCWlubGluZSBTcGVjaWZpZXIgJiBzZXRQc2V1ZG9zdGF0ZVJldHVybigpCisJeworCQlzZXRDb21wb25lbnRQc2V1ZG9zdGF0ZSgpOworCQlzZXRQc2V1ZG9zdGF0ZU1vY1JFVFVSTigpOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwkvKioKKwkgKiBNSVgtSU4gd2l0aCBjb21wb25lbnQgInBzZXVkb3N0YXRlIgorCSAqLworCWlubGluZSBib29sIGhhc0ZhbWlseVBzZXVkb3N0YXRlRU5ESU5HKCkgY29uc3QKKwl7CisJCXJldHVybiggKHBzZXVkb3N0YXRlICYgRkFNSUxZX1BTRVVET19FTkRJTkdfTU9DKSAhPSAwICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzRmFtaWx5UHNldWRvc3RhdGVFbmRpbmcoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBpc0NvbXBvbmVudFBzZXVkb3N0YXRlKCkgJiYgaGFzRmFtaWx5UHNldWRvc3RhdGVFTkRJTkcoKSApOworCX0KKworCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAiSlVOQ1RJT04iIHBzZXVkb3N0YXRlCisJICovCisJaW5saW5lIGJvb2wgaXNQc2V1ZG9zdGF0ZU1vY0pVTkNUSU9OKCkgY29uc3QKKwl7CisJCXJldHVybiggcHNldWRvc3RhdGUgPT0gUFNFVURPU1RBVEVfSlVOQ1RJT05fTU9DICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIHNldFBzZXVkb3N0YXRlTW9jSlVOQ1RJT04oKQorCXsKKwkJcHNldWRvc3RhdGUgPSBQU0VVRE9TVEFURV9KVU5DVElPTl9NT0M7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCS8qKgorCSAqIE1JWC1JTiB3aXRoIGNvbXBvbmVudCAicHNldWRvc3RhdGUiCisJICovCisJaW5saW5lIGJvb2wgaXNQc2V1ZG9zdGF0ZUp1bmN0aW9uKCkgY29uc3QKKwl7CisJCXJldHVybiggaXNDb21wb25lbnRQc2V1ZG9zdGF0ZSgpICYmIGlzUHNldWRvc3RhdGVNb2NKVU5DVElPTigpICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIHNldFBzZXVkb3N0YXRlSnVuY3Rpb24oKQorCXsKKwkJc2V0Q29tcG9uZW50UHNldWRvc3RhdGUoKTsKKwkJc2V0UHNldWRvc3RhdGVNb2NKVU5DVElPTigpOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAiQ0hPSUNFIiBwc2V1ZG9zdGF0ZQorCSAqLworCWlubGluZSBib29sIGlzUHNldWRvc3RhdGVNb2NDSE9JQ0UoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBwc2V1ZG9zdGF0ZSA9PSBQU0VVRE9TVEFURV9DSE9JQ0VfTU9DICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIHNldFBzZXVkb3N0YXRlTW9jQ0hPSUNFKCkKKwl7CisJCXBzZXVkb3N0YXRlID0gUFNFVURPU1RBVEVfQ0hPSUNFX01PQzsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJLyoqCisJICogTUlYLUlOIHdpdGggY29tcG9uZW50ICJwc2V1ZG9zdGF0ZSIKKwkgKi8KKwlpbmxpbmUgYm9vbCBpc1BzZXVkb3N0YXRlQ2hvaWNlKCkgY29uc3QKKwl7CisJCXJldHVybiggaXNDb21wb25lbnRQc2V1ZG9zdGF0ZSgpICYmIGlzUHNldWRvc3RhdGVNb2NDSE9JQ0UoKSApOworCX0KKworCWlubGluZSBTcGVjaWZpZXIgJiBzZXRQc2V1ZG9zdGF0ZUNob2ljZSgpCisJeworCQlzZXRDb21wb25lbnRQc2V1ZG9zdGF0ZSgpOworCQlzZXRQc2V1ZG9zdGF0ZU1vY0NIT0lDRSgpOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAiRU5UUllfUE9JTlQiIHBzZXVkb3N0YXRlCisJICovCisJaW5saW5lIGJvb2wgaXNQc2V1ZG9zdGF0ZU1vY0VOVFJZX1BPSU5UKCkgY29uc3QKKwl7CisJCXJldHVybiggcHNldWRvc3RhdGUgPT0gUFNFVURPU1RBVEVfRU5UUllfUE9JTlRfTU9DICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIHNldFBzZXVkb3N0YXRlTW9jRU5UUllfUE9JTlQoKQorCXsKKwkJcHNldWRvc3RhdGUgPSBQU0VVRE9TVEFURV9FTlRSWV9QT0lOVF9NT0M7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCS8qKgorCSAqIE1JWC1JTiB3aXRoIGNvbXBvbmVudCAicHNldWRvc3RhdGUiCisJICovCisJaW5saW5lIGJvb2wgaXNQc2V1ZG9zdGF0ZUVudHJ5UG9pbnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBpc0NvbXBvbmVudFBzZXVkb3N0YXRlKCkgJiYgaXNQc2V1ZG9zdGF0ZU1vY0VOVFJZX1BPSU5UKCkgKTsKKwl9CisKKwlpbmxpbmUgU3BlY2lmaWVyICYgc2V0UHNldWRvc3RhdGVFbnRyeVBvaW50KCkKKwl7CisJCXNldENvbXBvbmVudFBzZXVkb3N0YXRlKCk7CisJCXNldFBzZXVkb3N0YXRlTW9jRU5UUllfUE9JTlQoKTsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogIkVYSVRfUE9JTlQiIHBzZXVkb3N0YXRlCisJICovCisJaW5saW5lIGJvb2wgaXNQc2V1ZG9zdGF0ZU1vY0VYSVRfUE9JTlQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBwc2V1ZG9zdGF0ZSA9PSBQU0VVRE9TVEFURV9FWElUX1BPSU5UX01PQyApOworCX0KKworCWlubGluZSBTcGVjaWZpZXIgJiBzZXRQc2V1ZG9zdGF0ZU1vY0VYSVRfUE9JTlQoKQorCXsKKwkJcHNldWRvc3RhdGUgPSBQU0VVRE9TVEFURV9FWElUX1BPSU5UX01PQzsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJLyoqCisJICogTUlYLUlOIHdpdGggY29tcG9uZW50ICJwc2V1ZG9zdGF0ZSIKKwkgKi8KKwlpbmxpbmUgYm9vbCBpc1BzZXVkb3N0YXRlRXhpdFBvaW50KCkgY29uc3QKKwl7CisJCXJldHVybiggaXNDb21wb25lbnRQc2V1ZG9zdGF0ZSgpICYmIGlzUHNldWRvc3RhdGVNb2NFWElUX1BPSU5UKCkgKTsKKwl9CisKKwlpbmxpbmUgU3BlY2lmaWVyICYgc2V0UHNldWRvc3RhdGVFeGl0UG9pbnQoKQorCXsKKwkJc2V0Q29tcG9uZW50UHNldWRvc3RhdGUoKTsKKwkJc2V0UHNldWRvc3RhdGVNb2NFWElUX1BPSU5UKCk7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqICJDT05FQ1RJT04gUE9JTlQiIHBzZXVkb3N0YXRlCisJICovCisJaW5saW5lIGJvb2wgaGFzUHNldWRvc3RhdGVNb2NDb25uZWN0aW9uUG9pbnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAocHNldWRvc3RhdGUgJiBGQU1JTFlfUFNFVURPX0NPTk5FQ1RJT05fUE9JTlRfTU9DKSAhPSAwICk7CisJfQorCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogIkZPUksiIHBzZXVkb3N0YXRlCisJICovCisJaW5saW5lIGJvb2wgaXNQc2V1ZG9zdGF0ZU1vY0ZPUksoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBwc2V1ZG9zdGF0ZSA9PSBQU0VVRE9TVEFURV9GT1JLX01PQyApOworCX0KKworCWlubGluZSBTcGVjaWZpZXIgJiBzZXRQc2V1ZG9zdGF0ZU1vY0ZPUksoKQorCXsKKwkJcHNldWRvc3RhdGUgPSBQU0VVRE9TVEFURV9GT1JLX01PQzsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJLyoqCisJICogTUlYLUlOIHdpdGggY29tcG9uZW50ICJwc2V1ZG9zdGF0ZSIKKwkgKi8KKwlpbmxpbmUgYm9vbCBpc1BzZXVkb3N0YXRlRm9yaygpIGNvbnN0CisJeworCQlyZXR1cm4oIGlzQ29tcG9uZW50UHNldWRvc3RhdGUoKSAmJiBpc1BzZXVkb3N0YXRlTW9jRk9SSygpICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIHNldFBzZXVkb3N0YXRlRm9yaygpCisJeworCQlzZXRDb21wb25lbnRQc2V1ZG9zdGF0ZSgpOworCQlzZXRQc2V1ZG9zdGF0ZU1vY0ZPUksoKTsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogIkpPSU4iIHBzZXVkb3N0YXRlCisJICovCisJaW5saW5lIGJvb2wgaXNQc2V1ZG9zdGF0ZU1vY0pPSU4oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBwc2V1ZG9zdGF0ZSA9PSBQU0VVRE9TVEFURV9KT0lOX01PQyApOworCX0KKworCWlubGluZSBTcGVjaWZpZXIgJiBzZXRQc2V1ZG9zdGF0ZU1vY0pPSU4oKQorCXsKKwkJcHNldWRvc3RhdGUgPSBQU0VVRE9TVEFURV9KT0lOX01PQzsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJLyoqCisJICogTUlYLUlOIHdpdGggY29tcG9uZW50ICJwc2V1ZG9zdGF0ZSIKKwkgKi8KKwlpbmxpbmUgYm9vbCBpc1BzZXVkb3N0YXRlSm9pbigpIGNvbnN0CisJeworCQlyZXR1cm4oIGlzQ29tcG9uZW50UHNldWRvc3RhdGUoKSAmJiBpc1BzZXVkb3N0YXRlTW9jSk9JTigpICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIHNldFBzZXVkb3N0YXRlSm9pbigpCisJeworCQlzZXRDb21wb25lbnRQc2V1ZG9zdGF0ZSgpOworCQlzZXRQc2V1ZG9zdGF0ZU1vY0pPSU4oKTsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogIkRISVNUT1JZIiBwc2V1ZG9zdGF0ZQorCSAqLworCWlubGluZSBib29sIGlzUHNldWRvc3RhdGVNb2NERUVQX0hJU1RPUlkoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBwc2V1ZG9zdGF0ZSA9PSBQU0VVRE9TVEFURV9ERUVQX0hJU1RPUllfTU9DICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzUHNldWRvc3RhdGVNb2NERUVQX0hJU1RPUlkoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAocHNldWRvc3RhdGUgJiBQU0VVRE9TVEFURV9ERUVQX0hJU1RPUllfTU9DKSAhPSAwICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIGFkZFBzZXVkb3N0YXRlTW9jREVFUF9ISVNUT1JZKCkKKwl7CisJCXBzZXVkb3N0YXRlIHw9IFBTRVVET1NUQVRFX0RFRVBfSElTVE9SWV9NT0M7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCWlubGluZSBTcGVjaWZpZXIgJiBzZXRQc2V1ZG9zdGF0ZU1vY0RFRVBfSElTVE9SWSgpCisJeworCQlwc2V1ZG9zdGF0ZSA9IFBTRVVET1NUQVRFX0RFRVBfSElTVE9SWV9NT0M7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCS8qKgorCSAqIE1JWC1JTiB3aXRoIGNvbXBvbmVudCAicHNldWRvc3RhdGUiCisJICovCisJaW5saW5lIGJvb2wgaXNQc2V1ZG9zdGF0ZURlZXBIaXN0b3J5KCkgY29uc3QKKwl7CisJCXJldHVybiggaXNDb21wb25lbnRQc2V1ZG9zdGF0ZSgpICYmIGlzUHNldWRvc3RhdGVNb2NERUVQX0hJU1RPUlkoKSApOworCX0KKworCWlubGluZSBTcGVjaWZpZXIgJiBzZXRQc2V1ZG9zdGF0ZURlZXBIaXN0b3J5KCkKKwl7CisJCXNldENvbXBvbmVudFBzZXVkb3N0YXRlKCk7CisJCXNldFBzZXVkb3N0YXRlTW9jREVFUF9ISVNUT1JZKCk7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqICJTSElTVE9SWSIgcHNldWRvc3RhdGUKKwkgKi8KKwlpbmxpbmUgYm9vbCBpc1BzZXVkb3N0YXRlTW9jU0hBTExPV19ISVNUT1JZKCkgY29uc3QKKwl7CisJCXJldHVybiggcHNldWRvc3RhdGUgPT0gUFNFVURPU1RBVEVfU0hBTExPV19ISVNUT1JZX01PQyApOworCX0KKworCWlubGluZSBib29sIGhhc1BzZXVkb3N0YXRlTW9jU0hBTExPV19ISVNUT1JZKCkgY29uc3QKKwl7CisJCXJldHVybiggKHBzZXVkb3N0YXRlICYgUFNFVURPU1RBVEVfU0hBTExPV19ISVNUT1JZX01PQykgIT0gMCApOworCX0KKworCWlubGluZSBTcGVjaWZpZXIgJiBhZGRQc2V1ZG9zdGF0ZU1vY1NIQUxMT1dfSElTVE9SWSgpCisJeworCQlwc2V1ZG9zdGF0ZSB8PSBQU0VVRE9TVEFURV9TSEFMTE9XX0hJU1RPUllfTU9DOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwlpbmxpbmUgU3BlY2lmaWVyICYgc2V0UHNldWRvc3RhdGVNb2NTSEFMTE9XX0hJU1RPUlkoKQorCXsKKwkJcHNldWRvc3RhdGUgPSBQU0VVRE9TVEFURV9TSEFMTE9XX0hJU1RPUllfTU9DOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwkvKioKKwkgKiBNSVgtSU4gd2l0aCBjb21wb25lbnQgInBzZXVkb3N0YXRlIgorCSAqLworCWlubGluZSBib29sIGlzUHNldWRvc3RhdGVTaGFsbG93SGlzdG9yeSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGlzQ29tcG9uZW50UHNldWRvc3RhdGUoKSAmJiBpc1BzZXVkb3N0YXRlTW9jU0hBTExPV19ISVNUT1JZKCkgKTsKKwl9CisKKwlpbmxpbmUgU3BlY2lmaWVyICYgc2V0UHNldWRvc3RhdGVTaGFsbG93SGlzdG9yeSgpCisJeworCQlzZXRDb21wb25lbnRQc2V1ZG9zdGF0ZSgpOworCQlzZXRQc2V1ZG9zdGF0ZU1vY1NIQUxMT1dfSElTVE9SWSgpOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAiSElTVE9SWSIgcHNldWRvc3RhdGUKKwkgKi8KKwlpbmxpbmUgYm9vbCBoYXNQc2V1ZG9zdGF0ZU1vY0hJU1RPUlkoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAocHNldWRvc3RhdGUgJiBGQU1JTFlfUFNFVURPX0hJU1RPUllfTU9DKSAhPSAwICk7CisJfQorCisJLyoqCisJICogTUlYLUlOIHdpdGggY29tcG9uZW50ICJwc2V1ZG9zdGF0ZSIKKwkgKi8KKwlpbmxpbmUgYm9vbCBoYXNQc2V1ZG9zdGF0ZUhpc3RvcnkoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBpc0NvbXBvbmVudFBzZXVkb3N0YXRlKCkgJiYgaGFzUHNldWRvc3RhdGVNb2NISVNUT1JZKCkgKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBGRUFUVVJFIEtJTkQKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBmZWF0dXJlCisJICovCisJaW5saW5lIEZFQVRVUkVfS0lORCBnZXRGZWF0dXJlS2luZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHN0YXRpY19jYXN0PCBGRUFUVVJFX0tJTkQgPiggZmVhdHVyZSApICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzRmVhdHVyZUtpbmQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBmZWF0dXJlICE9IEZFQVRVUkVfVU5ERUZJTkVEX0tJTkQgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNGZWF0dXJlS2luZChGRUFUVVJFX0tJTkQgZGVzaWduS2luZCkgY29uc3QKKwl7CisJCXJldHVybiggKGZlYXR1cmUgJiBkZXNpZ25LaW5kKSAhPSAwICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNGZWF0dXJlS2luZChGRUFUVVJFX0tJTkQgZGVzaWduS2luZCkgY29uc3QKKwl7CisJCXJldHVybiggZmVhdHVyZSA9PSBkZXNpZ25LaW5kICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIHNldEZlYXR1cmVLaW5kKEZFQVRVUkVfS0lORCBkZXNpZ25LaW5kKQorCXsKKwkJZmVhdHVyZSA9IGRlc2lnbktpbmQ7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCWlubGluZSBTcGVjaWZpZXIgJiBhZGRGZWF0dXJlS2luZChGRUFUVVJFX0tJTkQgZGVzaWduS2luZCkKKwl7CisJCWZlYXR1cmUgfD0gZGVzaWduS2luZDsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIHJlbUZlYXR1cmVLaW5kKEZFQVRVUkVfS0lORCBkZXNpZ25LaW5kKQorCXsKKwkJZmVhdHVyZSAmPSAofiBkZXNpZ25LaW5kKTsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIHVuc2V0RmVhdHVyZUtpbmQoKQorCXsKKwkJZmVhdHVyZSA9IEZFQVRVUkVfVU5ERUZJTkVEX0tJTkQ7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogInRpbWVkIiBmZWF0dXJlCisJICovCisJaW5saW5lIGJvb2wgaGFzRmVhdHVyZVRpbWVkKCkgY29uc3QKKwl7CisJCXJldHVybiggKGZlYXR1cmUgJiBGRUFUVVJFX1RJTUVEX0tJTkQpICE9IDAgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBub0ZlYXR1cmVUaW1lZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIChmZWF0dXJlICYgRkVBVFVSRV9USU1FRF9LSU5EKSA9PSAwICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIHJlbUZlYXR1cmVUaW1lZCgpCisJeworCQlmZWF0dXJlICY9ICh+IEZFQVRVUkVfVElNRURfS0lORCk7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCWlubGluZSBTcGVjaWZpZXIgJiBzZXRGZWF0dXJlVGltZWQoKQorCXsKKwkJZmVhdHVyZSB8PSBGRUFUVVJFX1RJTUVEX0tJTkQ7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogImlucHV0X2VuYWJsZWQiIGZlYXR1cmUKKwkgKi8KKwlpbmxpbmUgYm9vbCBoYXNGZWF0dXJlSW5wdXRFbmFibGVkKCkgY29uc3QKKwl7CisJCXJldHVybiggKGZlYXR1cmUgJiBGRUFUVVJFX0lOUFVUX0VOQUJMRURfS0lORCkgIT0gMCApOworCX0KKworCWlubGluZSBib29sIG5vRmVhdHVyZUlucHV0RW5hYmxlZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIChmZWF0dXJlICYgRkVBVFVSRV9JTlBVVF9FTkFCTEVEX0tJTkQpID09IDAgKTsKKwl9CisKKwlpbmxpbmUgU3BlY2lmaWVyICYgcmVtRmVhdHVyZUlucHV0RW5hYmxlZCgpCisJeworCQlmZWF0dXJlICY9ICh+IEZFQVRVUkVfSU5QVVRfRU5BQkxFRF9LSU5EKTsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIHNldEZlYXR1cmVJbnB1dEVuYWJsZWQoKQorCXsKKwkJZmVhdHVyZSB8PSBGRUFUVVJFX0lOUFVUX0VOQUJMRURfS0lORDsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAiaW5wdXRfZW5hYmxlZCIgZmVhdHVyZQorCSAqLworCWlubGluZSBib29sIGhhc0ZlYXR1cmVMaWZlbGluZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIChmZWF0dXJlICYgRkVBVFVSRV9MSUZFTElORV9LSU5EKSAhPSAwICk7CisJfQorCisJaW5saW5lIGJvb2wgbm9GZWF0dXJlTGlmZWxpbmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAoZmVhdHVyZSAmIEZFQVRVUkVfTElGRUxJTkVfS0lORCkgPT0gMCApOworCX0KKworCWlubGluZSBTcGVjaWZpZXIgJiByZW1GZWF0dXJlTGlmZWxpbmUoKQorCXsKKwkJZmVhdHVyZSAmPSAofiBGRUFUVVJFX0xJRkVMSU5FX0tJTkQpOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwlpbmxpbmUgU3BlY2lmaWVyICYgc2V0RmVhdHVyZUxpZmVsaW5lKCkKKwl7CisJCWZlYXR1cmUgfD0gRkVBVFVSRV9MSUZFTElORV9LSU5EOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBERVNJR04gS0lORAorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIGRlc2lnbgorCSAqLworCWlubGluZSBERVNJR05fS0lORCBnZXREZXNpZ25LaW5kKCkgY29uc3QKKwl7CisJCXJldHVybiggc3RhdGljX2Nhc3Q8IERFU0lHTl9LSU5EID4oIGRlc2lnbiApICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzRGVzaWduS2luZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIGRlc2lnbiAhPSBERVNJR05fVU5ERUZJTkVEX0tJTkQgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBub25lRGVzaWduS2luZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIGRlc2lnbiA9PSBERVNJR05fVU5ERUZJTkVEX0tJTkQgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNEZXNpZ25LaW5kKERFU0lHTl9LSU5EIGRlc2lnbktpbmQpIGNvbnN0CisJeworCQlyZXR1cm4oIChkZXNpZ24gJiBkZXNpZ25LaW5kKSAhPSAwICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNEZXNpZ25LaW5kKERFU0lHTl9LSU5EIGRlc2lnbktpbmQpIGNvbnN0CisJeworCQlyZXR1cm4oIGRlc2lnbiA9PSBkZXNpZ25LaW5kICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIHNldERlc2lnbktpbmQoREVTSUdOX0tJTkQgZGVzaWduS2luZCkKKwl7CisJCWRlc2lnbiA9IGRlc2lnbktpbmQ7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCWlubGluZSBTcGVjaWZpZXIgJiBhZGREZXNpZ25LaW5kKERFU0lHTl9LSU5EIGRlc2lnbktpbmQpCisJeworCQlkZXNpZ24gfD0gZGVzaWduS2luZDsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIHJlbURlc2lnbktpbmQoREVTSUdOX0tJTkQgZGVzaWduS2luZCkKKwl7CisJCWRlc2lnbiAmPSAofiBkZXNpZ25LaW5kKTsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIHVuc2V0RGVzaWduS2luZCgpCisJeworCQlkZXNpZ24gPSBERVNJR05fVU5ERUZJTkVEX0tJTkQ7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCXN0YXRpYyBERVNJR05fS0lORCB0b0Rlc2lnbktpbmQoY29uc3Qgc3RkOjpzdHJpbmcgJiBzdHJEZXNpZ24pOworCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAiI21vZGVsIiBkZXNpZ24KKwkgKi8KKwlpbmxpbmUgYm9vbCBpc0Rlc2lnbk1vZGVsKCkgY29uc3QKKwl7CisJCXJldHVybihkZXNpZ24gPT0gREVTSUdOX01PREVMX0tJTkQgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNEZXNpZ25Nb2RlbCgpIGNvbnN0CisJeworCQlyZXR1cm4oIChkZXNpZ24gJiBERVNJR05fTU9ERUxfS0lORCkgIT0gMCApOworCX0KKworCWlubGluZSBTcGVjaWZpZXIgJiBzZXREZXNpZ25Nb2RlbCgpCisJeworCQlkZXNpZ24gPSBERVNJR05fTU9ERUxfS0lORDsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIGFkZERlc2lnbk1vZGVsKCkKKwl7CisJCWRlc2lnbiB8PSBERVNJR05fTU9ERUxfS0lORDsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogIiNpbnN0YW5jZSIgZGVzaWduCisJICovCisJaW5saW5lIGJvb2wgaXNEZXNpZ25JbnN0YW5jZSgpIGNvbnN0CisJeworCQlyZXR1cm4oZGVzaWduID09IERFU0lHTl9JTlNUQU5DRV9LSU5EICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzRGVzaWduSW5zdGFuY2UoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAoZGVzaWduICYgREVTSUdOX0lOU1RBTkNFX0tJTkQpICE9IDAgKTsKKwl9CisKKwlpbmxpbmUgU3BlY2lmaWVyICYgc2V0RGVzaWduSW5zdGFuY2UoKQorCXsKKwkJZGVzaWduID0gREVTSUdOX0lOU1RBTkNFX0tJTkQ7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCWlubGluZSBTcGVjaWZpZXIgJiBhZGREZXNpZ25JbnN0YW5jZSgpCisJeworCQlkZXNpZ24gfD0gREVTSUdOX0lOU1RBTkNFX0tJTkQ7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqICIjc3RhdGljIiBkZXNpZ24KKwkgKi8KKwlpbmxpbmUgYm9vbCBpc0Rlc2lnblN0YXRpYygpIGNvbnN0CisJeworCQlyZXR1cm4oZGVzaWduID09IERFU0lHTl9TVEFUSUNfS0lORCApOworCX0KKworCWlubGluZSBib29sIGhhc0Rlc2lnblN0YXRpYygpIGNvbnN0CisJeworCQlyZXR1cm4oIChkZXNpZ24gJiBERVNJR05fU1RBVElDX0tJTkQpICE9IDAgKTsKKwl9CisKKwlpbmxpbmUgU3BlY2lmaWVyICYgc2V0RGVzaWduU3RhdGljKCkKKwl7CisJCWRlc2lnbiA9IERFU0lHTl9TVEFUSUNfS0lORDsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogIiNzdGF0aWMgaW5zdGFuY2UiIGRlc2lnbgorCSAqLworCWlubGluZSBib29sIGlzRGVzaWduSW5zdGFuY2VTdGF0aWMoKSBjb25zdAorCXsKKwkJcmV0dXJuKGRlc2lnbiA9PSBERVNJR05fSU5TVEFOQ0VfU1RBVElDX0tJTkQgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNEZXNpZ25JbnN0YW5jZVN0YXRpYygpIGNvbnN0CisJeworCQlyZXR1cm4oIChkZXNpZ24gJiBERVNJR05fSU5TVEFOQ0VfU1RBVElDX0tJTkQpID09CisJCQkJREVTSUdOX0lOU1RBTkNFX1NUQVRJQ19LSU5EICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIHNldERlc2lnbkluc3RhbmNlU3RhdGljKCkKKwl7CisJCWRlc2lnbiA9IERFU0lHTl9JTlNUQU5DRV9TVEFUSUNfS0lORDsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIGFkZERlc2lnbkluc3RhbmNlU3RhdGljKCkKKwl7CisJCWRlc2lnbiB8PSBERVNJR05fSU5TVEFOQ0VfU1RBVElDX0tJTkQ7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogIiNzdGF0aWMgcHJvdG90eXBlIiBkZXNpZ24KKwkgKi8KKwlpbmxpbmUgYm9vbCBpc0Rlc2lnblByb3RvdHlwZVN0YXRpYygpIGNvbnN0CisJeworCQlyZXR1cm4oZGVzaWduID09IERFU0lHTl9QUk9UT1RZUEVfU1RBVElDX0tJTkQgKTsKKwl9CisKKwlpbmxpbmUgU3BlY2lmaWVyICYgc2V0RGVzaWduUHJvdG90eXBlU3RhdGljKCkKKwl7CisJCWRlc2lnbiA9IERFU0lHTl9QUk9UT1RZUEVfU1RBVElDX0tJTkQ7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqICJkeW5hbWljIiBkZXNpZ24KKwkgKi8KKwlpbmxpbmUgYm9vbCBpc0Rlc2lnbkR5bmFtaWMoKSBjb25zdAorCXsKKwkJcmV0dXJuKGRlc2lnbiA9PSBERVNJR05fRFlOQU1JQ19LSU5EICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzRGVzaWduRHluYW1pYygpIGNvbnN0CisJeworCQlyZXR1cm4oIChkZXNpZ24gJiBERVNJR05fRFlOQU1JQ19LSU5EKSAhPSAwICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIHNldERlc2lnbkR5bmFtaWMoKQorCXsKKwkJZGVzaWduID0gREVTSUdOX0RZTkFNSUNfS0lORDsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAiI2R5bmFtaWMgaW5zdGFuY2UiIGRlc2lnbgorCSAqLworCWlubGluZSBib29sIGlzRGVzaWduSW5zdGFuY2VEeW5hbWljKCkgY29uc3QKKwl7CisJCXJldHVybihkZXNpZ24gPT0gREVTSUdOX0lOU1RBTkNFX0RZTkFNSUNfS0lORCApOworCX0KKworCWlubGluZSBib29sIGhhc0Rlc2lnbkluc3RhbmNlRHluYW1pYygpIGNvbnN0CisJeworCQlyZXR1cm4oIChkZXNpZ24gJiBERVNJR05fSU5TVEFOQ0VfRFlOQU1JQ19LSU5EKSA9PQorCQkJCQlERVNJR05fSU5TVEFOQ0VfRFlOQU1JQ19LSU5EICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIHNldERlc2lnbkluc3RhbmNlRHluYW1pYygpCisJeworCQlkZXNpZ24gPSBERVNJR05fSU5TVEFOQ0VfRFlOQU1JQ19LSU5EOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqICJpbnN0YW5jZSBbIGR5bmFtaWMgXSIgZGVzaWduCisJICovCisJaW5saW5lIGJvb2wgaGFzRGVzaWduSW5zdGFuY2VOb3RNb2RlbCgpIGNvbnN0CisJeworCQlyZXR1cm4oICgoZGVzaWduICYgREVTSUdOX0lOU1RBTkNFX0tJTkQpICE9IDApCisJCQkJJiYgKChkZXNpZ24gJiBERVNJR05fTU9ERUxfS0lORCkgPT0gMCkgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqICJydW50aW1lIiBkZXNpZ24KKwkgKi8KKwlpbmxpbmUgYm9vbCBpc0Rlc2lnblJ1bnRpbWUoKSBjb25zdAorCXsKKwkJcmV0dXJuKGRlc2lnbiA9PSBERVNJR05fUlVOVElNRV9LSU5EICk7CisJfQorCisJaW5saW5lIFNwZWNpZmllciAmIHNldERlc2lnblJ1bnRpbWUoKQorCXsKKwkJZGVzaWduID0gREVTSUdOX1JVTlRJTUVfS0lORDsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gTUlYLUlOIE1PRElGSUVSCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJaW5saW5lIGJvb2wgaXNGYW1pbHlDb21wb25lbnRDb21wb3NpdGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBoYXNNb2NDb21wb3NpdGUoKQorCQkJCXx8ICggKGNvbXBvbmVudCAmIEZBTUlMWV9DT01QT05FTlRfQ09NUE9TSVRFX0tJTkQpICE9IDApICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNGYW1pbHlDb21wb25lbnRTdGF0ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIChjb21wb25lbnQgJiBGQU1JTFlfQ09NUE9ORU5UX1NUQVRFX0tJTkQpICE9IDAgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc0ZhbWlseUNvbXBvbmVudFN0YXRlbWFjaGluZSgpIGNvbnN0CisJeworCQlyZXR1cm4oICggKGNvbXBvbmVudCAmIEZBTUlMWV9DT01QT05FTlRfU1RBVEVNQUNISU5FX0tJTkQpICE9IDApCisJCQkJfHwgaXNNb2NTdGF0ZVRyYW5zaXRpb25TdHJ1Y3R1cmUoKSApOworCX0KKworCisJaW5saW5lIGJvb2wgaXNTdGF0ZUJhc2ljKCkgY29uc3QKKwl7CisJCXJldHVybiggbm9uZU1vY0NvbXBvc2l0ZSgpICYmIChpc1N0YXRlKCkgfHwgaXNQc2V1ZG9zdGF0ZSgpKSApOworCX0KKworCWlubGluZSBib29sIGlzU3RhdGVDb21wb3NpdGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBoYXNNb2NDb21wb3NpdGUoKSAmJiBpc1N0YXRlKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc1BzZXVkb3N0YXRlSW5pdGlhbE9yU3RhdGVTdGFydCgpIGNvbnN0CisJeworCQlyZXR1cm4oIGlzUHNldWRvc3RhdGVJbml0aWFsKCkgfHwgaXNTdGF0ZVN0YXJ0KCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNNb2NJTklUSUFMX1NUQVJUKCkgY29uc3QKKwl7CisJCXJldHVybiggaGFzUHNldWRvc3RhdGVNb2NJTklUSUFMKCkgfHwgaGFzU3RhdGVNb2NTVEFSVCgpICk7CisJfQorCisJaW5saW5lIGJvb2wgY291bGRCZVN0YXRlTW9jU0lNUExFKCkgY29uc3QKKwl7CisJCXJldHVybiggbm9uZVN0YXRlTW9jKCkgJiYgbm9uZVBzZXVkb3N0YXRlTW9jKCkgJiYgbm9uZU1vY0NvbXBvc2l0ZSgpICk7CisJfQorCisKKworCS8qKgorCSAqIENPTVBPTkVOVCBLSU5EIHRvIFNUUklORworCSAqLworCWlubGluZSBzdGQ6OnN0cmluZyBrZXl3b3JkQ29tcG9uZW50KCkgY29uc3QKKwl7CisJCXJldHVybiggU3BlY2lmaWVyOjprZXl3b3JkQ29tcG9uZW50KCBjb21wb25lbnQgKSApOworCX0KKworCXN0YXRpYyBzdGQ6OnN0cmluZyBrZXl3b3JkQ29tcG9uZW50KGJpdF9maWVsZF90IGNvbXBvbmVudEtpbmQpOworCisKKwlpbmxpbmUgc3RkOjpzdHJpbmcgc3RyQ29tcG9uZW50KGNvbnN0IHN0ZDo6c3RyaW5nICYgc2VwYXJhdG9yID0gIiAiKSBjb25zdAorCXsKKwkJcmV0dXJuKCBTcGVjaWZpZXI6OnN0ckNvbXBvbmVudCggY29tcG9uZW50ICwgc2VwYXJhdG9yICkgKTsKKwl9CisKKwlzdGF0aWMgc3RkOjpzdHJpbmcgc3RyQ29tcG9uZW50KGJpdF9maWVsZF90IGNvbXBvbmVudEtpbmQsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIHNlcGFyYXRvciA9ICIgIik7CisKKwlzdGF0aWMgc3RkOjpzdHJpbmcgeHN0ckNvbXBvbmVudChiaXRfZmllbGRfdCBkaXJlY3Rpb24sCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIHNlcGFyYXRvciA9ICIgIik7CisKKwkvKioKKwkgKiBDT01QT1NJVEUgTU9DIHRvIFNUUklORworCSAqLworCWlubGluZSBzdGQ6OnN0cmluZyBzdHJNb2RlbE9mQ29tcHV0YXRpb24oCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIHNlcGFyYXRvciA9ICIgIikgY29uc3QKKwl7CisJCXJldHVybiggU3BlY2lmaWVyOjpzdHJNb2RlbE9mQ29tcHV0YXRpb24oIGNvbXB1dGF0aW9uICwgc2VwYXJhdG9yICkgKTsKKwl9CisKKwlzdGF0aWMgc3RkOjpzdHJpbmcgc3RyTW9kZWxPZkNvbXB1dGF0aW9uKAorCQkJYml0X2ZpZWxkX3QgbW9kZWxPZkNvbXB1dGF0aW9uS2luZCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgc2VwYXJhdG9yID0gIiAiKTsKKworCS8qKgorCSAqIEdST1VQIEtJTkQgdG8gU1RSSU5HCisJICovCisJaW5saW5lIHN0ZDo6c3RyaW5nIHN0ckdyb3VwKGNvbnN0IHN0ZDo6c3RyaW5nICYgc2VwYXJhdG9yID0gIiAiKSBjb25zdAorCXsKKwkJcmV0dXJuKCBTcGVjaWZpZXI6OnN0ckdyb3VwKCBncm91cCAsIHNlcGFyYXRvciApICk7CisJfQorCisJc3RhdGljIHN0ZDo6c3RyaW5nIHN0ckdyb3VwKGJpdF9maWVsZF90IGdyb3VwS2luZCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgc2VwYXJhdG9yID0gIiAiKTsKKworCS8qKgorCSAqIFNUQVRFIE1PQyB0byBTVFJJTkcKKwkgKi8KKwlpbmxpbmUgc3RkOjpzdHJpbmcgc3RyU3RhdGVNb2MoY29uc3Qgc3RkOjpzdHJpbmcgJiBzZXBhcmF0b3IgPSAiICIpIGNvbnN0CisJeworCQlyZXR1cm4oIFNwZWNpZmllcjo6c3RyU3RhdGVNb2MoIHN0YXRlICwgc2VwYXJhdG9yICkgKTsKKwl9CisKKwlzdGF0aWMgc3RkOjpzdHJpbmcgc3RyU3RhdGVNb2MoYml0X2ZpZWxkX3Qgc3RhdGVNb2MsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIHNlcGFyYXRvciA9ICIgIik7CisKKwlzdGF0aWMgc3RkOjpzdHJpbmcgeHN0clN0YXRlTW9jKGJpdF9maWVsZF90IHN0YXRlTW9jLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBzZXBhcmF0b3IgPSAiICIpOworCisJLyoqCisJICogUFNFVURPU1RBVEUgTU9DIHRvIFNUUklORworCSAqLworCWlubGluZSBzdGQ6OnN0cmluZyBzdHJQc2V1ZG9zdGF0ZU1vYygKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgc2VwYXJhdG9yID0gIiAiKSBjb25zdAorCXsKKwkJcmV0dXJuKCBTcGVjaWZpZXI6OnN0clBzZXVkb3N0YXRlTW9jKCBwc2V1ZG9zdGF0ZSAsIHNlcGFyYXRvciApICk7CisJfQorCisJc3RhdGljIHN0ZDo6c3RyaW5nIHN0clBzZXVkb3N0YXRlTW9jKGJpdF9maWVsZF90IHBzZXVkb3N0YXRlTW9jLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBzZXBhcmF0b3IgPSAiICIpOworCisJc3RhdGljIHN0ZDo6c3RyaW5nIHhzdHJQc2V1ZG9zdGF0ZU1vYyhiaXRfZmllbGRfdCBwc2V1ZG9zdGF0ZU1vYywKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgc2VwYXJhdG9yID0gIiAiKTsKKworCS8qKgorCSAqIEFOWS1TVEFURSBNT0MgdG8gU1RSSU5HCisJICovCisJaW5saW5lIHN0ZDo6c3RyaW5nIHN0ckFueVN0YXRlTW9jKAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBzZXBhcmF0b3IgPSAiICIpIGNvbnN0CisJeworCQlpZiggcHNldWRvc3RhdGUgIT0gUFNFVURPU1RBVEVfVU5ERUZJTkVEX01PQyApCisJCXsKKwkJCXJldHVybiggU3BlY2lmaWVyOjpzdHJQc2V1ZG9zdGF0ZU1vYyggcHNldWRvc3RhdGUgLCBzZXBhcmF0b3IgKSApOworCQl9CisJCWVsc2UgaWYoIHN0YXRlICE9IFNUQVRFX1VOREVGSU5FRF9NT0MgKQorCQl7CisJCQlyZXR1cm4oIFNwZWNpZmllcjo6c3RyU3RhdGVNb2MoIHBzZXVkb3N0YXRlICwgc2VwYXJhdG9yICkgKTsKKwkJfQorCQllbHNlIGlmKCBjb21wdXRhdGlvbiAhPSBNT0NfVU5ERUZJTkVEX0tJTkQgKQorCQl7CisJCQlyZXR1cm4oIFNwZWNpZmllcjo6c3RyTW9kZWxPZkNvbXB1dGF0aW9uKCBjb21wdXRhdGlvbiAsIHNlcGFyYXRvciApICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4oICI8YW55OnN0YXRlOnVuZGVmPiIgKTsKKwkJfQorCX0KKworCisJLyoqCisJICogRkVBVFVSRSBLSU5EIHRvIFNUUklORworCSAqLworCWlubGluZSBzdGQ6OnN0cmluZyBzdHJGZWF0dXJlKGNvbnN0IHN0ZDo6c3RyaW5nICYgc2VwYXJhdG9yID0gIiAiKSBjb25zdAorCXsKKwkJcmV0dXJuKCBTcGVjaWZpZXI6OnN0ckZlYXR1cmUoIGZlYXR1cmUgLCBzZXBhcmF0b3IgKSApOworCX0KKworCXN0YXRpYyBzdGQ6OnN0cmluZyBzdHJGZWF0dXJlKGJpdF9maWVsZF90IGZlYXR1cmVLaW5kLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBzZXBhcmF0b3IgPSAiICIpOworCisJLyoqCisJICogREVTSUdOIEtJTkQgdG8gU1RSSU5HCisJICovCisJaW5saW5lIHN0ZDo6c3RyaW5nIHN0ckRlc2lnbihjb25zdCBzdGQ6OnN0cmluZyAmIHNlcGFyYXRvciA9ICIgIikgY29uc3QKKwl7CisJCXJldHVybiggU3BlY2lmaWVyOjpzdHJEZXNpZ24oIGRlc2lnbiAsIHNlcGFyYXRvciApICk7CisJfQorCisJc3RkOjpzdHJpbmcgc3RyRGVzaWduX25vdChERVNJR05fS0lORCBkZXNpZ25LaW5kLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBzZXBhcmF0b3IgPSAiICIpIGNvbnN0OworCisJc3RhdGljIHN0ZDo6c3RyaW5nIHN0ckRlc2lnbihiaXRfZmllbGRfdCBkZXNpZ25LaW5kLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBzZXBhcmF0b3IgPSAiICIpOworCisJc3RhdGljIHN0ZDo6c3RyaW5nIHhzdHJEZXNpZ24oYml0X2ZpZWxkX3QgZGVzaWduS2luZCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgc2VwYXJhdG9yID0gIiAiKTsKKworCisJLyoqCisJICogU2VyaWFsaXphdGlvbgorCSAqLworCXN0YXRpYyBzdGQ6OnN0cmluZyBTRVBBUkFUT1I7CisKKworCWlubGluZSBzdGQ6OnN0cmluZyBzdHIoYml0X2ZpZWxkX3QgZW5hYmxlZEZpZWxkcywKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgc2VwYXJhdG9yID0gU0VQQVJBVE9SKSBjb25zdAorCXsKKwkJcmV0dXJuKCBTdHJpbmdUb29sczo6cmVtb3ZlTGFzdElmRW5kc1dpdGgoCisJCQkJdG9TdHJpbmcoZW5hYmxlZEZpZWxkcywgc2VwYXJhdG9yICksIHNlcGFyYXRvcikgKTsKKwl9CisKKwlpbmxpbmUgc3RkOjpzdHJpbmcgc3RyKGNvbnN0IHN0ZDo6c3RyaW5nICYgc2VwYXJhdG9yID0gU0VQQVJBVE9SKSBjb25zdAorCXsKKwkJcmV0dXJuKCBTdHJpbmdUb29sczo6cmVtb3ZlTGFzdElmRW5kc1dpdGgoCisJCQkJdG9TdHJpbmcoRU5BQkxFX0FMTF9GSUVMRFMsIHNlcGFyYXRvciApLCBzZXBhcmF0b3IpICk7CisJfQorCisJaW5saW5lIHN0ZDo6c3RyaW5nIHN0cl9vdGhlclRoYW4oCisJCQlTcGVjaWZpZXI6OkNPTVBPTkVOVF9LSU5EIGNvbXBvbmVudEtpbmcsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIHNlcGFyYXRvciA9IFNFUEFSQVRPUikgY29uc3QKKwl7CisJCVNwZWNpZmllciB4U3BlY2lmaWVyKCAqdGhpcyApOworCisJCXhTcGVjaWZpZXIucmVtQ29tcG9uZW50S2luZCggY29tcG9uZW50S2luZyApOworCisJCXJldHVybiggU3RyaW5nVG9vbHM6OnJlbW92ZUxhc3RJZkVuZHNXaXRoKAorCQkJCXhTcGVjaWZpZXIudG9TdHJpbmcoIHNlcGFyYXRvciApLCBzZXBhcmF0b3IpICk7CisKKwl9CisKKwlpbmxpbmUgc3RkOjpzdHJpbmcgc3RyX290aGVyVGhhbigKKwkJCVNwZWNpZmllcjo6Q09NUE9ORU5UX0tJTkQgY29tcG9uZW50S2luZywKKwkJCVNwZWNpZmllcjo6U1RBVEVfTU9DIHN0YXRlTW9jLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBzZXBhcmF0b3IgPSBTRVBBUkFUT1IpIGNvbnN0CisJeworCQlTcGVjaWZpZXIgeFNwZWNpZmllciggKnRoaXMgKTsKKworCQl4U3BlY2lmaWVyLnJlbUNvbXBvbmVudEtpbmQoIGNvbXBvbmVudEtpbmcgKTsKKworCQl4U3BlY2lmaWVyLnJlbVN0YXRlTW9jKCBzdGF0ZU1vYyApOworCisJCXJldHVybiggU3RyaW5nVG9vbHM6OnJlbW92ZUxhc3RJZkVuZHNXaXRoKAorCQkJCXhTcGVjaWZpZXIudG9TdHJpbmcoIHNlcGFyYXRvciApLCBzZXBhcmF0b3IpICk7CisKKwl9CisKKwlzdGQ6OnN0cmluZyB0b1N0cmluZyhiaXRfZmllbGRfdCBlbmFibGVkRmllbGRzID0gRU5BQkxFX0FMTF9GSUVMRFMsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIHNlcGFyYXRvciA9ICIgIikgY29uc3Q7CisKKwlpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJiBzZXBhcmF0b3IpIGNvbnN0CisJeworCQlyZXR1cm4oIHRvU3RyaW5nKCBFTkFCTEVfQUxMX0ZJRUxEUyAsIHNlcGFyYXRvcikgKTsKKwl9CisKKworCXN0ZDo6c3RyaW5nIHRvU3RyaW5nX25vdChERVNJR05fS0lORCBkZXNpZ25LaW5kLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBzZXBhcmF0b3IgPSAiICIpIGNvbnN0CisJeworCQlyZXR1cm4oIFNwZWNpZmllcjo6c3RyQ29tcG9uZW50KCBjb21wb25lbnQgLCBzZXBhcmF0b3IgKSArCisJCQkJU3BlY2lmaWVyOjpzdHJNb2RlbE9mQ29tcHV0YXRpb24oIGNvbXB1dGF0aW9uICwgc2VwYXJhdG9yICkgKworCQkJCVNwZWNpZmllcjo6c3RyR3JvdXAgICAoIGdyb3VwICwgc2VwYXJhdG9yICkgKworCQkJCVNwZWNpZmllcjo6c3RyU3RhdGVNb2MoIHN0YXRlICwgc2VwYXJhdG9yICkgKworCQkJCVNwZWNpZmllcjo6c3RyUHNldWRvc3RhdGVNb2MoIHBzZXVkb3N0YXRlICwgc2VwYXJhdG9yICkgKworCQkJCVNwZWNpZmllcjo6c3RyRmVhdHVyZSggZmVhdHVyZSAsIHNlcGFyYXRvciApICsKKwkJCQlTcGVjaWZpZXI6OnN0ckRlc2lnbl9ub3QoIGRlc2lnbktpbmQgLCBzZXBhcmF0b3IpICk7CisJfQorCit9OworCisKKworY2xhc3MgU3BlY2lmaWVySW1wbAoreworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQVRUUklCVVRFUworCSAqLworCVNwZWNpZmllciBtU3BlY2lmaWVyOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqLworCVNwZWNpZmllckltcGwoKQorCTogbVNwZWNpZmllciggKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJU3BlY2lmaWVySW1wbChjb25zdCBTcGVjaWZpZXIgJiBhU3BlY2lmaWVyKQorCTogbVNwZWNpZmllciggYVNwZWNpZmllciApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlTcGVjaWZpZXJJbXBsKGNvbnN0IFNwZWNpZmllckltcGwgJiBhQ29weSkKKwk6IG1TcGVjaWZpZXIoIGFDb3B5Lm1TcGVjaWZpZXIgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJU3BlY2lmaWVySW1wbChjb25zdCBTcGVjaWZpZXJJbXBsICogYUNvcHkpCisJOiBtU3BlY2lmaWVyKCAoYUNvcHkgIT0gTlVMTCkgPworCQkJYUNvcHktPmdldFNwZWNpZmllcigpIDogU3BlY2lmaWVyOjpFWEVDVVRBQkxFX1VOREVGSU5FRF9TUEVDSUZJRVIgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJflNwZWNpZmllckltcGwoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBtU3BlY2lmaWVyCisJICovCisJaW5saW5lIGNvbnN0IFNwZWNpZmllciAmIGdldFNwZWNpZmllcigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1TcGVjaWZpZXIgKTsKKwl9CisKKwlpbmxpbmUgU3BlY2lmaWVyICYgZ2V0d1NwZWNpZmllcigpCisJeworCQlyZXR1cm4oIG1TcGVjaWZpZXIgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNTcGVjaWZpZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtU3BlY2lmaWVyLmlzRGVmaW5lZCgpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzU3BlY2lmaWVyX290aGVyVGhhbihjb25zdCBTcGVjaWZpZXIgJiBhU3BlY2lmaWVyKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtU3BlY2lmaWVyLmlzRGVmaW5lZF9vdGhlclRoYW4oIGFTcGVjaWZpZXIgKSApOworCX0KKworCWlubGluZSB2b2lkIHNldFNwZWNpZmllcihjb25zdCBTcGVjaWZpZXIgJiB4U3BlY2lmaWVyKQorCXsKKwkJbVNwZWNpZmllciA9IHhTcGVjaWZpZXI7CisJfQorCit9OworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworCisjZW5kaWYgLyogRk1MX0NPTU1PTl9TUEVDSUZJRVJFTEVNRU5UX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvY29tbW9uL1RyYWNlYWJsZUVsZW1lbnQuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2NvbW1vbi9UcmFjZWFibGVFbGVtZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDFhM2QxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2NvbW1vbi9UcmFjZWFibGVFbGVtZW50LmNwcApAQCAtMCwwICsxLDIzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjEgbWFycyAyMDE2CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJUcmFjZWFibGVFbGVtZW50LmgiCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2NvbW1vbi9UcmFjZWFibGVFbGVtZW50LmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvY29tbW9uL1RyYWNlYWJsZUVsZW1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjNkMmZkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2NvbW1vbi9UcmFjZWFibGVFbGVtZW50LmgKQEAgLTAsMCArMSwzOTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyMSBtYXJzIDIwMTYKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBGTUxfQ09NTU9OX1RSQUNFQUJMRUVMRU1FTlRfSF8KKyNkZWZpbmUgRk1MX0NPTU1PTl9UUkFDRUFCTEVFTEVNRU5UX0hfCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxjb21tb24vRWxlbWVudC5oPgorCisjaW5jbHVkZSA8Zm1sL2NvbW1vbi9Mb2NhdGlvbkVsZW1lbnQuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKK2NsYXNzIFRyYWNlYWJsZUVsZW1lbnQKK3sKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlib29sIG1Db21tZW50RmxhZzsKKworCXN0ZDo6c3RyaW5nIG1EZXNjcmlwdGlvbjsKKworCUxvY2F0aW9uRWxlbWVudCAqIG1Mb2NhdGlvbjsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJVHJhY2VhYmxlRWxlbWVudCgpCisJOiBtQ29tbWVudEZsYWcoIGZhbHNlICksCisJbURlc2NyaXB0aW9uKCApLAorCW1Mb2NhdGlvbiggTlVMTCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIENvcHkKKwkgKi8KKwlUcmFjZWFibGVFbGVtZW50KGNvbnN0IFRyYWNlYWJsZUVsZW1lbnQgJiBhbkVsZW1lbnQpCisJOiBtQ29tbWVudEZsYWcoIGFuRWxlbWVudC5tQ29tbWVudEZsYWcgKSwKKwltRGVzY3JpcHRpb24oIGFuRWxlbWVudC5tRGVzY3JpcHRpb24pLAorCW1Mb2NhdGlvbiggKGFuRWxlbWVudC5tTG9jYXRpb24gPT0gTlVMTCkgPyBOVUxMIDoKKwkJCW5ldyBMb2NhdGlvbkVsZW1lbnQoICooYW5FbGVtZW50Lm1Mb2NhdGlvbikgKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5UcmFjZWFibGVFbGVtZW50KCkKKwl7CisJCWRlbGV0ZSggbUxvY2F0aW9uICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtQ29tbWVudEZsYWcKKwkgKi8KKwlpbmxpbmUgYm9vbCBpc0NvbW1lbnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQ29tbWVudEZsYWcgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRDb21tZW50KGJvb2wgaXNDb21tZW50ID0gdHJ1ZSkKKwl7CisJCW1Db21tZW50RmxhZyA9IGlzQ29tbWVudDsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1EZXNjcmlwdGlvbgorCSAqLworCWlubGluZSBzdGQ6OnN0cmluZyBnZXREZXNjcmlwdGlvbigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1EZXNjcmlwdGlvbiApOworCX0KKworCWlubGluZSB2b2lkIHNldERlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nICYgYURlc2NyaXB0aW9uKQorCXsKKwkJbURlc2NyaXB0aW9uID0gYURlc2NyaXB0aW9uOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUxvY2F0aW9uCisJICovCisJaW5saW5lIExvY2F0aW9uRWxlbWVudCAqIGdldExvY2F0aW9uKCkgY29uc3QKKwl7CisJCXJldHVybiggbUxvY2F0aW9uICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzTG9jYXRpb24oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtTG9jYXRpb24gIT0gTlVMTCApOworCX0KKworCisJaW5saW5lIHZvaWQgc2V0TG9jYXRpb24oTG9jYXRpb25FbGVtZW50ICogYUxvY2F0aW9uKQorCXsKKwkJaWYoIG1Mb2NhdGlvbiAhPSBOVUxMICkKKwkJeworCQkJZGVsZXRlKCBtTG9jYXRpb24gKTsKKwkJfQorCQltTG9jYXRpb24gPSBhTG9jYXRpb247CisJfQorCisJaW5saW5lIHZvaWQgY29weUxvY2F0aW9uKExvY2F0aW9uRWxlbWVudCAqIGFMb2NhdGlvbikKKwl7CisJCWlmKCBhTG9jYXRpb24gIT0gTlVMTCApCisJCXsKKwkJCXNldExvY2F0aW9uKGFMb2NhdGlvbi0+Z2V0RmlsZUxvY2F0aW9uKCksCisJCQkJCWFMb2NhdGlvbi0+Z2V0QmVnaW5MaW5lKCksIGFMb2NhdGlvbi0+Z2V0RW5kTGluZSgpKTsKKwkJfQorCQllbHNlIGlmKCBtTG9jYXRpb24gIT0gTlVMTCApCisJCXsKKwkJCWRlbGV0ZSggbUxvY2F0aW9uICk7CisJCQltTG9jYXRpb24gPSBOVUxMOworCQl9CisJfQorCisJaW5saW5lIHZvaWQgc2V0TG9jYXRpb24oY29uc3Qgc3RkOjpzdHJpbmcgJiBhRmlsZUxvY2F0aW9uLAorCQkJY29uc3QgYXZtX3NpemVfdCBiZWdpbkxpbmUsIGNvbnN0IGF2bV9zaXplX3QgZW5kTGluZSkKKwl7CisJCWlmKCBtTG9jYXRpb24gPT0gTlVMTCApCisJCXsKKwkJCW1Mb2NhdGlvbiA9IG5ldyBMb2NhdGlvbkVsZW1lbnQoYUZpbGVMb2NhdGlvbiwgYmVnaW5MaW5lLCBlbmRMaW5lKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW1Mb2NhdGlvbi0+c2V0TG9jYXRpb24oYUZpbGVMb2NhdGlvbiwgYmVnaW5MaW5lLCBlbmRMaW5lKTsKKwkJfQorCX0KKworCisJLyoqCisJICogRkFUQUwgRVJST1IgbG9jYXRpb24KKwkgKi8KKwlpbmxpbmUgc3RkOjpzdHJpbmcgZmF0YWxFcnJvckxvY2F0aW9uKAorCQkJY29uc3QgVHJhY2VhYmxlRWxlbWVudCAqIGNvbnRhaW5lciA9IE5VTEwpIGNvbnN0CisJeworCQlpZiggbUxvY2F0aW9uICE9IE5VTEwgKQorCQl7CisJCQlyZXR1cm4oIG1Mb2NhdGlvbi0+ZmF0YWxFcnJvckxvY2F0aW9uKCkgKTsKKwkJfQorCQllbHNlIGlmKCBjb250YWluZXIgIT0gTlVMTCApCisJCXsKKwkJCXJldHVybiggY29udGFpbmVyLT5mYXRhbEVycm9yTG9jYXRpb24oTlVMTCkgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybiggIjpmYXRhbCBlcnJvcjwgbG9jYXRpb24jdW5kZWZpbmVkID5cblx0IiApOworCQl9CisJfQorCisJaW5saW5lIE91dFN0cmVhbSAmIGZhdGFsRXJyb3JMb2NhdGlvbihPdXRTdHJlYW0gJiBvcywKKwkJCWNvbnN0IFRyYWNlYWJsZUVsZW1lbnQgKiBjb250YWluZXIgPSBOVUxMKSBjb25zdAorCXsKKwkJaWYoIG1Mb2NhdGlvbiAhPSBOVUxMICkKKwkJeworCQkJcmV0dXJuKCBtTG9jYXRpb24tPmZhdGFsRXJyb3JMb2NhdGlvbihvcykgKTsKKwkJfQorCQllbHNlIGlmKCBjb250YWluZXIgIT0gTlVMTCApCisJCXsKKwkJCXJldHVybiggY29udGFpbmVyLT5mYXRhbEVycm9yTG9jYXRpb24ob3MsIE5VTEwpICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4oIG9zIDw8ICI6ZmF0YWwgZXJyb3I8IGxvY2F0aW9uI3VuZGVmaW5lZCA+XG5cdCIgKTsKKwkJfQorCX0KKworCWlubGluZSBQYWlyT3V0U3RyZWFtICYgZmF0YWxFcnJvckxvY2F0aW9uKFBhaXJPdXRTdHJlYW0gJiBvcywKKwkJCWNvbnN0IFRyYWNlYWJsZUVsZW1lbnQgKiBjb250YWluZXIgPSBOVUxMKSBjb25zdAorCXsKKwkJaWYoIG1Mb2NhdGlvbiAhPSBOVUxMICkKKwkJeworCQkJcmV0dXJuKCBtTG9jYXRpb24tPmZhdGFsRXJyb3JMb2NhdGlvbihvcykgKTsKKwkJfQorCQllbHNlIGlmKCBjb250YWluZXIgIT0gTlVMTCApCisJCXsKKwkJCXJldHVybiggY29udGFpbmVyLT5mYXRhbEVycm9yTG9jYXRpb24ob3MsIE5VTEwpICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4oIG9zIDw8ICI6ZmF0YWwgZXJyb3I8IGxvY2F0aW9uI3VuZGVmaW5lZCA+XG5cdCIgKTsKKwkJfQorCX0KKworCWlubGluZSBUcmlwbGVPdXRTdHJlYW0gJiBmYXRhbEVycm9yTG9jYXRpb24oVHJpcGxlT3V0U3RyZWFtICYgb3MsCisJCQlUcmFjZWFibGVFbGVtZW50ICogY29udGFpbmVyID0gTlVMTCkgY29uc3QKKwl7CisJCWlmKCBtTG9jYXRpb24gIT0gTlVMTCApCisJCXsKKwkJCXJldHVybiggbUxvY2F0aW9uLT5mYXRhbEVycm9yTG9jYXRpb24ob3MpICk7CisJCX0KKwkJZWxzZSBpZiggY29udGFpbmVyICE9IE5VTEwgKQorCQl7CisJCQlyZXR1cm4oIGNvbnRhaW5lci0+ZmF0YWxFcnJvckxvY2F0aW9uKG9zLCBOVUxMKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuKCBvcyA8PCAiOmZhdGFsIGVycm9yPCBsb2NhdGlvbiN1bmRlZmluZWQgPlxuXHQiICk7CisJCX0KKwl9CisKKworCS8qKgorCSAqIEVSUk9SIGxvY2F0aW9uCisJICovCisJaW5saW5lIHN0ZDo6c3RyaW5nIGVycm9yTG9jYXRpb24oCisJCQljb25zdCBUcmFjZWFibGVFbGVtZW50ICogY29udGFpbmVyID0gTlVMTCkgY29uc3QKKwl7CisJCWlmKCBtTG9jYXRpb24gIT0gTlVMTCApCisJCXsKKwkJCXJldHVybiggbUxvY2F0aW9uLT5lcnJvckxvY2F0aW9uKCkgKTsKKwkJfQorCQllbHNlIGlmKCBjb250YWluZXIgIT0gTlVMTCApCisJCXsKKwkJCXJldHVybiggY29udGFpbmVyLT5lcnJvckxvY2F0aW9uKE5VTEwpICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4oICI6ZXJyb3I8IGxvY2F0aW9uI3VuZGVmaW5lZCA+XG5cdCIgKTsKKwkJfQorCX0KKworCWlubGluZSBPdXRTdHJlYW0gJiBlcnJvckxvY2F0aW9uKE91dFN0cmVhbSAmIG9zLAorCQkJY29uc3QgVHJhY2VhYmxlRWxlbWVudCAqIGNvbnRhaW5lciA9IE5VTEwpIGNvbnN0CisJeworCQlpZiggbUxvY2F0aW9uICE9IE5VTEwgKQorCQl7CisJCQlyZXR1cm4oIG1Mb2NhdGlvbi0+ZXJyb3JMb2NhdGlvbihvcykgKTsKKwkJfQorCQllbHNlIGlmKCBjb250YWluZXIgIT0gTlVMTCApCisJCXsKKwkJCXJldHVybiggY29udGFpbmVyLT5lcnJvckxvY2F0aW9uKG9zLCBOVUxMKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuKCBvcyA8PCAiOmVycm9yPCBsb2NhdGlvbiN1bmRlZmluZWQgPlxuXHQiICk7CisJCX0KKwl9CisKKwlpbmxpbmUgUGFpck91dFN0cmVhbSAmIGVycm9yTG9jYXRpb24oUGFpck91dFN0cmVhbSAmIG9zLAorCQkJY29uc3QgVHJhY2VhYmxlRWxlbWVudCAqIGNvbnRhaW5lciA9IE5VTEwpIGNvbnN0CisJeworCQlpZiggbUxvY2F0aW9uICE9IE5VTEwgKQorCQl7CisJCQlyZXR1cm4oIG1Mb2NhdGlvbi0+ZXJyb3JMb2NhdGlvbihvcykgKTsKKwkJfQorCQllbHNlIGlmKCBjb250YWluZXIgIT0gTlVMTCApCisJCXsKKwkJCXJldHVybiggY29udGFpbmVyLT5lcnJvckxvY2F0aW9uKG9zLCBOVUxMKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuKCBvcyA8PCAiOmVycm9yPCBsb2NhdGlvbiN1bmRlZmluZWQgPlxuXHQiICk7CisJCX0KKwl9CisKKwlpbmxpbmUgVHJpcGxlT3V0U3RyZWFtICYgZXJyb3JMb2NhdGlvbihUcmlwbGVPdXRTdHJlYW0gJiBvcywKKwkJCWNvbnN0IFRyYWNlYWJsZUVsZW1lbnQgKiBjb250YWluZXIgPSBOVUxMKSBjb25zdAorCXsKKwkJaWYoIG1Mb2NhdGlvbiAhPSBOVUxMICkKKwkJeworCQkJcmV0dXJuKCBtTG9jYXRpb24tPmVycm9yTG9jYXRpb24ob3MpICk7CisJCX0KKwkJZWxzZSBpZiggY29udGFpbmVyICE9IE5VTEwgKQorCQl7CisJCQlyZXR1cm4oIGNvbnRhaW5lci0+ZXJyb3JMb2NhdGlvbihvcywgTlVMTCkgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybiggb3MgPDwgIjplcnJvcjwgbG9jYXRpb24jdW5kZWZpbmVkID5cblx0IiApOworCQl9CisJfQorCisKKwkvKioKKwkgKiBXQVJOSU5HIGxvY2F0aW9uCisJICovCisJaW5saW5lIHN0ZDo6c3RyaW5nIHdhcm5pbmdMb2NhdGlvbigKKwkJCWNvbnN0IFRyYWNlYWJsZUVsZW1lbnQgKiBjb250YWluZXIgPSBOVUxMKSBjb25zdAorCXsKKwkJaWYoIG1Mb2NhdGlvbiAhPSBOVUxMICkKKwkJeworCQkJcmV0dXJuKCBtTG9jYXRpb24tPndhcm5pbmdMb2NhdGlvbigpICk7CisJCX0KKwkJZWxzZSBpZiggY29udGFpbmVyICE9IE5VTEwgKQorCQl7CisJCQlyZXR1cm4oIGNvbnRhaW5lci0+d2FybmluZ0xvY2F0aW9uKE5VTEwpICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4oICI6d2FybmluZzwgbG9jYXRpb24jdW5kZWZpbmVkID5cblx0IiApOworCQl9CisJfQorCisJaW5saW5lIE91dFN0cmVhbSAmIHdhcm5pbmdMb2NhdGlvbihPdXRTdHJlYW0gJiBvcywKKwkJCWNvbnN0IFRyYWNlYWJsZUVsZW1lbnQgKiBjb250YWluZXIgPSBOVUxMKSBjb25zdAorCXsKKwkJaWYoIG1Mb2NhdGlvbiAhPSBOVUxMICkKKwkJeworCQkJcmV0dXJuKCBtTG9jYXRpb24tPndhcm5pbmdMb2NhdGlvbihvcykgKTsKKwkJfQorCQllbHNlIGlmKCBjb250YWluZXIgIT0gTlVMTCApCisJCXsKKwkJCXJldHVybiggY29udGFpbmVyLT53YXJuaW5nTG9jYXRpb24ob3MsIE5VTEwpICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4oIG9zIDw8ICI6d2FybmluZzwgbG9jYXRpb24jdW5kZWZpbmVkID5cblx0IiApOworCQl9CisJfQorCisJaW5saW5lIFBhaXJPdXRTdHJlYW0gJiB3YXJuaW5nTG9jYXRpb24oUGFpck91dFN0cmVhbSAmIG9zLAorCQkJY29uc3QgVHJhY2VhYmxlRWxlbWVudCAqIGNvbnRhaW5lciA9IE5VTEwpIGNvbnN0CisJeworCQlpZiggbUxvY2F0aW9uICE9IE5VTEwgKQorCQl7CisJCQlyZXR1cm4oIG1Mb2NhdGlvbi0+d2FybmluZ0xvY2F0aW9uKG9zKSApOworCQl9CisJCWVsc2UgaWYoIGNvbnRhaW5lciAhPSBOVUxMICkKKwkJeworCQkJcmV0dXJuKCBjb250YWluZXItPndhcm5pbmdMb2NhdGlvbihvcywgTlVMTCkgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybiggb3MgPDwgIjp3YXJuaW5nPCBsb2NhdGlvbiN1bmRlZmluZWQgPlxuXHQiICk7CisJCX0KKwl9CisKKwlpbmxpbmUgVHJpcGxlT3V0U3RyZWFtICYgd2FybmluZ0xvY2F0aW9uKFRyaXBsZU91dFN0cmVhbSAmIG9zLAorCQkJY29uc3QgVHJhY2VhYmxlRWxlbWVudCAqIGNvbnRhaW5lciA9IE5VTEwpIGNvbnN0CisJeworCQlpZiggbUxvY2F0aW9uICE9IE5VTEwgKQorCQl7CisJCQlyZXR1cm4oIG1Mb2NhdGlvbi0+d2FybmluZ0xvY2F0aW9uKG9zKSApOworCQl9CisJCWVsc2UgaWYoIGNvbnRhaW5lciAhPSBOVUxMICkKKwkJeworCQkJcmV0dXJuKCBjb250YWluZXItPndhcm5pbmdMb2NhdGlvbihvcywgTlVMTCkgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybiggb3MgPDwgIjp3YXJuaW5nPCBsb2NhdGlvbiN1bmRlZmluZWQgPlxuXHQiICk7CisJCX0KKwl9CisKKwkvKioKKwkgKiB0cmFjZUxpbmUgaW5mbworCSAqLworCWlubGluZSBzdGQ6OnN0cmluZyB0cmFjZUxpbmUoY29uc3Qgc3RkOjpzdHJpbmcgJiB0YWIsCisJCQlib29sIHNpbmdsZUxpbmVDb21tZW50ID0gdHJ1ZSkgY29uc3QKKwl7CisJCXJldHVybiggKG1Mb2NhdGlvbiAhPSBOVUxMICkgPworCQkJCW1Mb2NhdGlvbi0+dHJhY2VMaW5lKHRhYiwgc2luZ2xlTGluZUNvbW1lbnQpIDogIiIgKTsKKwl9CisKK307CisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworCisjZW5kaWYgLyogRk1MX0NPTU1PTl9UUkFDRUFCTEVFTEVNRU5UX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhlY3V0YWJsZS9Bdm1MYW1iZGEuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4ZWN1dGFibGUvQXZtTGFtYmRhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjhiMmJjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4ZWN1dGFibGUvQXZtTGFtYmRhLmNwcApAQCAtMCwwICsxLDI0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDcgb2N0LiAyMDA4CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJBdm1MYW1iZGEuaCIKKworI2luY2x1ZGUgPGZtbC9jb21tb24vU3BlY2lmaWVyRWxlbWVudC5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvQXZtUHJvZ3JhbS5oPgorCisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yTWFuYWdlci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitzdGQ6OnN0cmluZyBBdm1MYW1iZGE6OkFOT05ZTV9VRkkgPSAibGFtYmRhI2Fub255bSI7CisKK3N0ZDo6c3RyaW5nIEF2bUxhbWJkYTo6QVBQX1VGSSA9ICJsYW1iZGE6OmFwcCI7CisKK3N0ZDo6c3RyaW5nIEF2bUxhbWJkYTo6RlVOX1VGSSA9ICJsYW1iZGE6OmZ1biI7CisKK3N0ZDo6c3RyaW5nIEF2bUxhbWJkYTo6TEVUX1VGSSA9ICJsYW1iZGE6OmxldCI7CisKKworCisvKioKKyAqIFNFVFRFUgorICogdXBkYXRlRnVsbHlRdWFsaWZpZWROYW1lSUQoKQorICovCit2b2lkIEF2bUxhbWJkYTo6dXBkYXRlRnVsbHlRdWFsaWZpZWROYW1lSUQoKQoreworCXN3aXRjaCggbUxhbWJkYU5hdHVyZSApCisJeworCQljYXNlIEFWTV9MQU1CREFfQVBQX05BVFVSRToKKwkJeworCQkJc2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoIEFQUF9VRkkgKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBBVk1fTEFNQkRBX0xFVF9OQVRVUkU6CisJCXsKKwkJCXNldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCBMRVRfVUZJICk7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgQVZNX0xBTUJEQV9GVU5fTkFUVVJFOgorCQlkZWZhdWx0OgorCQl7CisJCQlpZiggaGFzQXN0RWxlbWVudCgpICkKKwkJCXsKKwkJCQlzdGQ6OnN0cmluZyBhRnVsbHlRdWFsaWZpZWROYW1lSUQgPSBnZXRBc3RGdWxseVF1YWxpZmllZE5hbWVJRCgpOworCQkJCXNldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCAicHJvZ3JhbSIgKworCQkJCQlhRnVsbHlRdWFsaWZpZWROYW1lSUQuc3Vic3RyKAorCQkJCQkJYUZ1bGx5UXVhbGlmaWVkTmFtZUlELmZpbmQoRlFOX0lEX1JPT1RfU0VQQVJBVE9SKSkgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlzZXRBbGxOYW1lSUQoIEFOT05ZTV9VRkkgLCAibGFtYmRhI2Fub255bSIgKTsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKworLyoqCisgKiBTZXJpYWxpemF0aW9uCisgKi8KK3ZvaWQgQXZtTGFtYmRhOjp0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlzd2l0Y2goIG1MYW1iZGFOYXR1cmUgKQorCXsKKwkJY2FzZSBBVk1fTEFNQkRBX0FQUF9OQVRVUkU6CisJCXsKKwkJCXRvU3RyZWFtQXBwKG9zKTsKKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEFWTV9MQU1CREFfTEVUX05BVFVSRToKKwkJeworCQkJdG9TdHJlYW1MZXQob3MpOworCisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgQVZNX0xBTUJEQV9GVU5fTkFUVVJFOgorCQlkZWZhdWx0OgorCQl7CisJCQl0b1N0cmVhbUxhbWJkYShvcyk7CisKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisKK3ZvaWQgQXZtTGFtYmRhOjp0b1N0cmVhbUFwcChPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwkvL29zIDw8IFRBQiA8PCAiYXBwbHkgKCAiOworCW9zIDw8IFRBQiA8PCAiJHsgYXBwICIgPDwgQVZNX1NUUl9JTkRFTlQ7CisJdG9TdHJlYW1MYW1iZGEob3MpOworCW9zIDw8IEVORF9JTkRFTlQ7CisJLy9vcyA8PCAiICkoICI7CisKKwlUYWJsZU9mSW5zdGFuY2VPZkRhdGE6OmNvbnN0X3Jhd19pdGVyYXRvciBpdERhdGEgPSBnZXREYXRhKCkuYmVnaW4oKTsKKwlUYWJsZU9mSW5zdGFuY2VPZkRhdGE6OmNvbnN0X3Jhd19pdGVyYXRvciBlbmREYXRhID0gZ2V0RGF0YSgpLmVuZCgpOworCWZvciggOyBpdERhdGEgIT0gZW5kRGF0YSA7ICsraXREYXRhICkKKwl7CisJCWlmKCAoaXREYXRhKS0+aGFzVmFsdWUoKSApCisJCXsKKwkJCW9zIDw8IFRBQiA8PCAiICR7IDo9ICIgPDwgKGl0RGF0YSktPnN0cigpIDw8ICIgIgorCQkJCQk8PCAoaXREYXRhKS0+c3RyVmFsdWUoKSA8PCAiIH0iOworCQl9CisJfQorCS8vb3MgPDwgIiApIiA8PCBFT0w7CisJb3MgPDwgIiB9IiA8PCBFT0wgPDwgc3RkOjpmbHVzaDsKK30KKworCit2b2lkIEF2bUxhbWJkYTo6dG9TdHJlYW1MYW1iZGEoT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJVGFibGVPZkluc3RhbmNlT2ZEYXRhOjpjb25zdF9yYXdfaXRlcmF0b3IgaXREYXRhID0gZ2V0RGF0YSgpLmJlZ2luKCk7CisJVGFibGVPZkluc3RhbmNlT2ZEYXRhOjpjb25zdF9yYXdfaXRlcmF0b3IgZW5kRGF0YSA9IGdldERhdGEoKS5lbmQoKTsKKworCS8vb3MgPDwgVEFCIDw8ICJsYW1iZGEgIjsKKwlvcyA8PCBUQUIgPDwgIiR7IGxhbWJkYSAiOworCisJZm9yKCA7IGl0RGF0YSAhPSBlbmREYXRhIDsgKytpdERhdGEgKQorCXsKKwkJb3MgPDwgKGl0RGF0YSktPnN0cigpIDw8ICIgIjsKKwl9CisJb3MgPDwgc3RkOjpmbHVzaDsKKworCS8vb3MgPDwgIi0+IjsKKworCW9zIDw8IHN0cl9pbmRlbnQoIGdldEV4cHJlc3Npb24oKSApOworCisJLy9vcyA8PCBFT0w7CisJb3MgPDwgIiB9IiA8PCBFT0xfRkxVU0g7Cit9CisKKwordm9pZCBBdm1MYW1iZGE6OnRvU3RyZWFtTGV0KE91dFN0cmVhbSAmIG9zKSBjb25zdAoreworCVRhYmxlT2ZJbnN0YW5jZU9mRGF0YTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGl0RGF0YSA9IGdldERhdGEoKS5iZWdpbigpOworCVRhYmxlT2ZJbnN0YW5jZU9mRGF0YTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGVuZERhdGEgPSBnZXREYXRhKCkuZW5kKCk7CisKKwlpZiggb3MuSU5ERU5ULlRBQlMuZW1wdHkoKSApCisJeworCQkvL29zIDw8ICJsZXQgIjsKKwkJb3MgPDwgIiR7IGxldCAiOworCQlmb3IoIDsgaXREYXRhICE9IGVuZERhdGEgOyArK2l0RGF0YSApCisJCXsKKwkJCWlmKCAoaXREYXRhKS0+aGFzVmFsdWUoKSApCisJCQl7CisJCQkJb3MgPDwgIiR7ICIKKwkJCQkJCTw8IE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQVNTSUdOLT5zdHJPcCgpIDw8ICIgIgorCQkJCQkJPDwgKGl0RGF0YSktPnN0cigpIDw8ICIgIiA8PCAoaXREYXRhKS0+c3RyVmFsdWUoKQorCQkJCQkJPDwgIiB9ICI7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJb3MgPDwgKGl0RGF0YSktPnN0cigpIDw8ICIgIjsKKwkJCX0KKwkJfQorCQlvcyA8PCBzdGQ6OmZsdXNoOworCisJCS8vb3MgPDwgImluIjsKKworCQlvcyA8PCBzdHJfaW5kZW50KCBnZXRFeHByZXNzaW9uKCkgKSA8PCAiIH0iOworCX0KKwllbHNlCisJeworCQkvL29zIDw8IFRBQiA8PCAibGV0ICIgPDwgRU9MOworCQlvcyA8PCBUQUIgPDwgIiR7IGxldCAiIDw8IEVPTDsKKworCQlmb3IoIDsgaXREYXRhICE9IGVuZERhdGEgOyArK2l0RGF0YSApCisJCXsKKwkJCWlmKCAoaXREYXRhKS0+aGFzVmFsdWUoKSApCisJCQl7CisJCQkJb3MgPDwgVEFCMiA8PCAiJHsgIgorCQkJCQk8PCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FTU0lHTi0+c3RyT3AoKSA8PCAiICIKKwkJCQkJPDwgKGl0RGF0YSktPnN0cigpIDw8ICIgIiA8PCAoaXREYXRhKS0+c3RyVmFsdWUoKQorCQkJCQk8PCAiIH0iOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW9zIDw8IFRBQjIgPDwgKGl0RGF0YSktPnN0cigpOworCQkJfQorCisJCQlvcyA8PCBFT0w7CisJCX0KKwkJb3MgPDwgc3RkOjpmbHVzaDsKKworCQkvL29zIDw8IFRBQiA8PCAiaW4iIDw8IEVPTDsKKworCQlvcyA8PCBpbmNyX3N0cmVhbSggZ2V0RXhwcmVzc2lvbigpICkgPDwgVEFCIDw8ICJ9IiA8PCBFT0w7CisJfQorCisJb3MgPDwgc3RkOjpmbHVzaDsKK30KKworCisKKworLyoKKyAqIENvbnZlcnQgdG8gQXZtUHJvZ3JhbQorICovCitCRiBBdm1MYW1iZGE6OmNvbnZlcnRUb1Byb2dyYW0oY29uc3Qgc3RkOjpzdHJpbmcgJiBpZCkKK3sKKwlBdm1Qcm9ncmFtICogYVByb2dyYW0gPSBuZXcgQXZtUHJvZ3JhbShTcGVjaWZpZXI6OlNDT1BFX1JPVVRJTkVfS0lORCwKKwkJCWdldENvbnRhaW5lcigpLT5hczwgQXZtUHJvZ3JhbSA+KCksIGdldEFzdEVsZW1lbnQoKSwgZ2V0RGF0YVNpemUoKSk7CisKKwlhUHJvZ3JhbS0+c2V0QWxsTmFtZUlEKCBhUHJvZ3JhbS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSArICIuIiArIGlkICwgaWQgKTsKKwlhUHJvZ3JhbS0+c2V0UGFyYW1PZmZzZXRDb3VudCgwLCBnZXREYXRhU2l6ZSgpKTsKKworCWF2bV9zaXplX3QgZW5kT2Zmc2V0ID0gZ2V0RGF0YSgpLnNpemUoKTsKKwlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMCA7IG9mZnNldCA8IGVuZE9mZnNldCA7ICsrb2Zmc2V0ICkKKwl7CisJCWFQcm9ncmFtLT5zZXREYXRhKG9mZnNldCwgZ2V0RGF0YSgpLmdldChvZmZzZXQpKTsKKwl9CisKKwlhUHJvZ3JhbS0+c2V0Q29kZSggZ2V0RXhwcmVzc2lvbigpLmJmQ29kZSgpICk7CisKKwlyZXR1cm4oIEJGKGFQcm9ncmFtKSApOworfQorCisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4ZWN1dGFibGUvQXZtTGFtYmRhLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhlY3V0YWJsZS9Bdm1MYW1iZGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjZmOTI0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4ZWN1dGFibGUvQXZtTGFtYmRhLmgKQEAgLTAsMCArMSwyNDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiA3IG9jdC4gMjAwOAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEFWTUxBTUJEQV9IXworI2RlZmluZSBBVk1MQU1CREFfSF8KKworCisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9CYXNlQXZtUHJvZ3JhbS5oPgorCisjaW5jbHVkZSA8Y29tbW9uL0F2bVBvaW50ZXIuaD4KKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0F2bVByb2dyYW0uaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0F2bUNvZGUuaD4KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vVHlwZWRlZi5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvKioKKyAqIFRZUEUgREVDTEFSQVRJT05TCisgKi8KKworZW51bSBBVk1fTEFNQkRBX05BVFVSRQoreworCUFWTV9MQU1CREFfQVBQX05BVFVSRSwKKworCUFWTV9MQU1CREFfRlVOX05BVFVSRSwKKworCUFWTV9MQU1CREFfTEVUX05BVFVSRSwKKworCUFWTV9MQU1CREFfVU5ERUZJTkVEX05BVFVSRQorfTsKKworCisKK2NsYXNzIEF2bUxhbWJkYSA6CisJCXB1YmxpYyBCYXNlQXZtUHJvZ3JhbSAsCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggQXZtTGFtYmRhICkKK3sKKworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBBdm1MYW1iZGEgKQorCisKK3Byb3RlY3RlZDoKKwkvKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlBVk1fTEFNQkRBX05BVFVSRSBtTGFtYmRhTmF0dXJlOworCisJQkYgbUV4cHJlc3Npb247CisKKwlib29sIG1DbG9zdXJlRmxhZzsKKworCitwdWJsaWM6CisJLyoqCisJICogUFJFREVGSU5FRCBVRkkKKwkgKi8KKwlzdGF0aWMgc3RkOjpzdHJpbmcgQU5PTllNX1VGSTsKKworCXN0YXRpYyBzdGQ6OnN0cmluZyBBUFBfVUZJOworCisJc3RhdGljIHN0ZDo6c3RyaW5nIEZVTl9VRkk7CisKKwlzdGF0aWMgc3RkOjpzdHJpbmcgTEVUX1VGSTsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQXZtTGFtYmRhKEJhc2VBdm1Qcm9ncmFtICogYUNvbnRhaW5lciwgYXZtX3NpemVfdCBhU2l6ZSwKKwkJCUFWTV9MQU1CREFfTkFUVVJFIGFMYW1iZGFOYXR1cmUgPSBBVk1fTEFNQkRBX0ZVTl9OQVRVUkUpCisJOiBCYXNlQXZtUHJvZ3JhbShDTEFTU19LSU5EX1QoIEF2bUxhbWJkYSApLCBhQ29udGFpbmVyLCBOVUxMLCBhU2l6ZSksCisJbUxhbWJkYU5hdHVyZSggYUxhbWJkYU5hdHVyZSApLAorCW1FeHByZXNzaW9uKCApLAorCW1DbG9zdXJlRmxhZyggZmFsc2UgKQorCXsKKwkJdXBkYXRlRnVsbHlRdWFsaWZpZWROYW1lSUQoKTsKKworLy8JCUFWTV9PU19DT1VUIDw8ICJuZXc6QXZtTGFtYmRhPiAiIDw8ICgobG9uZykgdGhpcykgPDwgIiA9PT4gIiA8PCBzdGQ6OmVuZGw7CisJfQorCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+QXZtTGFtYmRhKCkKKwl7CisvLwkJQVZNX09TX0NPVVQgPDwgImRlbDpBdm1MYW1iZGE+ICIgPDwgKChsb25nKSB0aGlzKSA8PCAiID09PiAiIDw8IHRvU3RyaW5nKCkgPDwgc3RkOjplbmRsOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUxhbWJkYU5hdHVyZQorCSAqLworCisJaW5saW5lIEFWTV9MQU1CREFfTkFUVVJFIGdldE5hdHVyZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1MYW1iZGFOYXR1cmUgKTsKKwl9CisKKworCisJaW5saW5lIGJvb2wgaXNBcHAoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtTGFtYmRhTmF0dXJlID09IEFWTV9MQU1CREFfQVBQX05BVFVSRSApOworCX0KKworCWlubGluZSBib29sIGlzTGFtYmRhKCkgY29uc3QKKwl7CisJCXJldHVybiggbUxhbWJkYU5hdHVyZSA9PSBBVk1fTEFNQkRBX0ZVTl9OQVRVUkUgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc0xldCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1MYW1iZGFOYXR1cmUgPT0gQVZNX0xBTUJEQV9MRVRfTkFUVVJFICk7CisJfQorCisKKwkvKioKKwkgKiBTRVRURVIKKwkgKiBtRnVsbHlRdWFsaWZpZWROYW1lSUQKKwkgKi8KKwl2aXJ0dWFsIHZvaWQgdXBkYXRlRnVsbHlRdWFsaWZpZWROYW1lSUQoKTsKKworCWlubGluZSBib29sIGlzQW5vbnltKCkgY29uc3QKKwl7CisJCXJldHVybiggZnFuRXF1YWxzKCBBTk9OWU1fVUZJICkgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1FeHByZXNzaW9uCisJICovCisJaW5saW5lIEJGICYgZ2V0RXhwcmVzc2lvbigpCisJeworCQlyZXR1cm4oIG1FeHByZXNzaW9uICk7CisJfQorCisJaW5saW5lIGNvbnN0IEJGICYgZ2V0RXhwcmVzc2lvbigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1FeHByZXNzaW9uICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzRXhwcmVzc2lvbigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1FeHByZXNzaW9uLnZhbGlkKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRFeHByZXNzaW9uKGNvbnN0IEJGICYgYUV4cHJlc3Npb24pCisJeworCQltRXhwcmVzc2lvbiA9IGFFeHByZXNzaW9uOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUNsb3N1cmVGbGFnCisJICovCisJaW5saW5lIGJvb2wgaXNDbG9zZWQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQ2xvc3VyZUZsYWcgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRDbG9zZWQoKQorCXsKKwkJbUNsb3N1cmVGbGFnID0gdHJ1ZTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRGcmVlKCkKKwl7CisJCW1DbG9zdXJlRmxhZyA9IGZhbHNlOworCX0KKworCWlubGluZSB2b2lkIHNldENsb3N1cmVGbGFnKGJvb2wgYUNsb3N1cmVGbGFnKQorCXsKKwkJbUNsb3N1cmVGbGFnID0gYUNsb3N1cmVGbGFnOworCX0KKworCisJaW5saW5lIGF2bV9zaXplX3QgYm91bmRWYXJDb3VudCgpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldERhdGEoKS5zaXplKCkgKTsKKwl9CisKKy8vCWlubGluZSBhdm1fc2l6ZV90IGZyZWVWYXJDb3VudCgpCisvLwl7CisvLwkJcmV0dXJuKCAoIGlzQ2xvc2VkKCkgKT8gMCA6ICc/JyApOworLy8JfQorCisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJaW5saW5lIHZvaWQgc3RySGVhZGVyKE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJb3MgPDwgc3RyX2luZGVudCggdGhpcyApOworCX0KKworCXZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCisJdm9pZCB0b1N0cmVhbUFwcChPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKKwl2b2lkIHRvU3RyZWFtTGFtYmRhKE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworCXZvaWQgdG9TdHJlYW1MZXQoT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCisKKwkvKgorCSAqIENvbnZlcnQgdG8gQXZtUHJvZ3JhbQorCSAqLworCUJGIGNvbnZlcnRUb1Byb2dyYW0oY29uc3Qgc3RkOjpzdHJpbmcgJiBpZCk7CisKK307CisKKworfQorCisjZW5kaWYgLyogQVZNTEFNQkRBX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhlY3V0YWJsZS9Bdm1Qcm9ncmFtLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leGVjdXRhYmxlL0F2bVByb2dyYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYzUyNjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhlY3V0YWJsZS9Bdm1Qcm9ncmFtLmNwcApAQCAtMCwwICsxLDQ5MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgIkF2bVByb2dyYW0uaCIKKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVGb3JtLmg+CisKKworCituYW1lc3BhY2Ugc2VwCit7CisKKworc3RkOjpzdHJpbmcgQXZtUHJvZ3JhbTo6QU5PTllNX1VGSSA9ICJwcm9nI2Fub255bSI7CisKKworCisvKioKKyAqIFNFVFRFUgorICogdXBkYXRlRnVsbHlRdWFsaWZpZWROYW1lSUQoKQorICovCit2b2lkIEF2bVByb2dyYW06OnVwZGF0ZUZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKK3sKKwlzdGQ6OnN0cmluZyBzY2hlbWEgPSBTcGVjaWZpZXI6OnN0clNjb3BlKCBtU2NvcGUgKTsKKworCWlmKCBoYXNBc3RFbGVtZW50KCkgKQorCXsKKwkJc3RkOjpzdHJpbmcgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEID0gZ2V0QXN0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsKKwkJc3RkOjpzdHJpbmcgYU5hbWVJRCAgPQorCQkJCU5hbWVkRWxlbWVudDo6ZXh0cmFjdE5hbWVJRCggYUZ1bGx5UXVhbGlmaWVkTmFtZUlEICk7CisKKwkJc2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoc2NoZW1hICsgYUZ1bGx5UXVhbGlmaWVkTmFtZUlELnN1YnN0cigKKwkJCQkJCWFGdWxseVF1YWxpZmllZE5hbWVJRC5maW5kKEZRTl9JRF9ST09UX1NFUEFSQVRPUikpICk7CisKKwkJc2V0TmFtZUlEKCBhTmFtZUlEICk7CisJfQorCWVsc2UgaWYoIGhhc0Z1bGx5UXVhbGlmaWVkTmFtZUlEKCkgKQorCXsKKwkJaWYoIG5vdCBoYXNOYW1lSUQoKSApCisJCXsKKwkJCXNldE5hbWVJRCggTmFtZWRFbGVtZW50OjpleHRyYWN0TmFtZUlEKAorCQkJCQlnZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpICkgKTsKKwkJfQorCX0KKwllbHNlIGlmKCBoYXNOYW1lSUQoKSApCisJeworCQlpZiggaGFzQ29udGFpbmVyKCkgKQorCQl7CisJCQlzdGQ6OnN0cmluZyBhRnVsbHlRdWFsaWZpZWROYW1lSUQgPQorCQkJCQlnZXRDb250YWluZXIoKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsKKworCQkJc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBwb3MgPQorCQkJCQlhRnVsbHlRdWFsaWZpZWROYW1lSUQuZmluZChGUU5fSURfUk9PVF9TRVBBUkFUT1IpOworCQkJc2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoIChwb3MgIT0gc3RkOjpzdHJpbmc6Om5wb3MpID8KKwkJCQkJc2NoZW1hICsgYUZ1bGx5UXVhbGlmaWVkTmFtZUlELnN1YnN0cigpIDogZ2V0TmFtZUlEKCkgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXNldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCBnZXROYW1lSUQoKSApOworCQl9CisJfQorCWVsc2UKKwl7CisJCXNldEFsbE5hbWVJRCggQU5PTllNX1VGSSAsIHNjaGVtYSArICIjYW5vbnltIiApOworCX0KK30KKworCisKKy8qKgorICogR0VUVEVSCisgKiBhbnkgU1lNQk9MIGZpbHRlcmluZyBieSBhbiBvcHRpb25hbCB0eXBlIHNwZWNpZmllciBmYW1pbHkKKyAqLworY29uc3QgQkYgJiBBdm1Qcm9ncmFtOjpnZXRTeW1ib2woCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlELAorCQlhdm1fdHlwZV9zcGVjaWZpZXJfa2luZF90IHR5cGVGYW1pbHkpIGNvbnN0Cit7CisJeworCQljb25zdCBCRiAmIGZvdW5kU3ltYm9sID0gQmFzZUF2bVByb2dyYW06OgorCQkJCWdldFN5bWJvbChhRnVsbHlRdWFsaWZpZWROYW1lSUQsIHR5cGVGYW1pbHkpOworCQlpZiggZm91bmRTeW1ib2wudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRTeW1ib2wgKTsKKwkJfQorCX0KKworCXsKKwkJY29uc3QgQkYgJiBmb3VuZFN5bWJvbCA9CisJCQkJZ2V0Q29uc3REYXRhKCkuZ2V0QnlGUU5hbWVJRChhRnVsbHlRdWFsaWZpZWROYW1lSUQpOworCisJCWlmKCBmb3VuZFN5bWJvbC52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCBmb3VuZFN5bWJvbCApOworCQl9CisJfQorCisJeworCQljb25zdCBCRiAmIGZvdW5kU3ltYm9sID0gZ2V0U3ltYm9sRGF0YShhRnVsbHlRdWFsaWZpZWROYW1lSUQpOworCisJCWlmKCBmb3VuZFN5bWJvbC52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCBmb3VuZFN5bWJvbCApOworCQl9CisJfQorCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKK30KKworCitjb25zdCBCRiAmIEF2bVByb2dyYW06OmdldFN5bWJvbEJ5UXVhbGlmaWVkTmFtZUlEKAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQsCisJCWF2bV90eXBlX3NwZWNpZmllcl9raW5kX3QgdHlwZUZhbWlseSkgY29uc3QKK3sKKwl7CisJCWNvbnN0IEJGICYgZm91bmRTeW1ib2wgPQorCQkJCUJhc2VBdm1Qcm9ncmFtOjpnZXRTeW1ib2xCeVF1YWxpZmllZE5hbWVJRCgKKwkJCQkJCWFRdWFsaWZpZWROYW1lSUQsIHR5cGVGYW1pbHkpOworCQlpZiggZm91bmRTeW1ib2wudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRTeW1ib2wgKTsKKwkJfQorCX0KKworCXsKKwkJY29uc3QgQkYgJiBmb3VuZFN5bWJvbCA9CisJCQkJZ2V0Q29uc3REYXRhKCkuZ2V0QnlRdWFsaWZpZWROYW1lSUQoYVF1YWxpZmllZE5hbWVJRCk7CisKKwkJaWYoIGZvdW5kU3ltYm9sLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kU3ltYm9sICk7CisJCX0KKwl9CisKKwl7CisJCWNvbnN0IEJGICYgZm91bmRTeW1ib2wgPQorCQkJCWdldFN5bWJvbERhdGFCeVF1YWxpZmllZE5hbWVJRChhUXVhbGlmaWVkTmFtZUlEKTsKKworCQlpZiggZm91bmRTeW1ib2wudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRTeW1ib2wgKTsKKwkJfQorCX0KKworCXJldHVybiggQkY6OlJFRl9OVUxMICk7Cit9CisKKworY29uc3QgQkYgJiBBdm1Qcm9ncmFtOjpnZXRTeW1ib2xCeU5hbWVJRCgKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBpZCwgYXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCB0eXBlRmFtaWx5KSBjb25zdAoreworCXsKKwkJY29uc3QgQkYgJiBmb3VuZFN5bWJvbCA9CisJCQkJQmFzZUF2bVByb2dyYW06OmdldFN5bWJvbEJ5TmFtZUlEKGlkLCB0eXBlRmFtaWx5KTsKKwkJaWYoIGZvdW5kU3ltYm9sLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kU3ltYm9sICk7CisJCX0KKwl9CisKKwl7CisJCWNvbnN0IEJGICYgZm91bmRTeW1ib2wgPSBnZXRDb25zdERhdGEoKS5nZXRCeU5hbWVJRChpZCk7CisKKwkJaWYoIGZvdW5kU3ltYm9sLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kU3ltYm9sICk7CisJCX0KKwl9CisKKwl7CisJCWNvbnN0IEJGICYgZm91bmRTeW1ib2wgPSBnZXRTeW1ib2xEYXRhQnlOYW1lSUQoaWQpOworCisJCWlmKCBmb3VuZFN5bWJvbC52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCBmb3VuZFN5bWJvbCApOworCQl9CisJfQorCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKK30KKworCitjb25zdCBCRiAmIEF2bVByb2dyYW06OmdldHltYm9sQnlBc3RFbGVtZW50KGNvbnN0IE9iamVjdEVsZW1lbnQgKiBhc3RFbGVtZW50LAorCQlhdm1fdHlwZV9zcGVjaWZpZXJfa2luZF90IHR5cGVGYW1pbHkpIGNvbnN0Cit7CisJeworCQljb25zdCBCRiAmIGZvdW5kU3ltYm9sID0KKwkJCQlCYXNlQXZtUHJvZ3JhbTo6Z2V0U3ltYm9sQnlBc3RFbGVtZW50KGFzdEVsZW1lbnQsIHR5cGVGYW1pbHkpOworCQlpZiggZm91bmRTeW1ib2wudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRTeW1ib2wgKTsKKwkJfQorCX0KKworCXsKKwkJY29uc3QgQkYgJiBmb3VuZFN5bWJvbCA9IGdldENvbnN0RGF0YSgpLmdldEJ5QXN0RWxlbWVudChhc3RFbGVtZW50KTsKKworCQlpZiggZm91bmRTeW1ib2wudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRTeW1ib2wgKTsKKwkJfQorCX0KKworCXsKKwkJY29uc3QgQkYgJiBmb3VuZFN5bWJvbCA9IGdldFN5bWJvbERhdGFCeUFzdEVsZW1lbnQoYXN0RWxlbWVudCk7CisKKwkJaWYoIGZvdW5kU3ltYm9sLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kU3ltYm9sICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworfQorCisKKy8qKgorICogU2VyaWFsaXphdGlvbgorICovCit2b2lkIEF2bVByb2dyYW06OnN0ckhlYWRlcihPdXRTdHJlYW0gJiBvdXQpIGNvbnN0Cit7CisJb3V0IDw8IGdldE1vZGlmaWVyKCkudG9TdHJpbmcoKQorCQk8PCBTcGVjaWZpZXI6OnN0clNjb3BlKCBtU2NvcGUgKQorCQk8PCAiPCBpZDoiIDw8IGdldE9mZnNldCgpIDw8ICIgPiAiOworCitBVk1fSUZfREVCVUdfRkxBR19BTkQoIENPTVBJTElORyAsICBoYXNBc3RFbGVtZW50KCkgKQorCW91dCA8PCAiJiIgPDwgZ2V0QXN0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiICI7CitBVk1fRU5ESUZfREVCVUdfRkxBR19BTkQoIENPTVBJTElORyApCisKKwlvdXQgPDwgLyooaXNTY29wZVRyYW5zaXRpb24oKSA/IGdldE5hbWVJRCgpIDoqLyBnZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOworfQorCisKK3ZvaWQgQXZtUHJvZ3JhbTo6dG9TdHJlYW1EYXRhKE91dFN0cmVhbSAmIG91dCkgY29uc3QKK3sKKwlUYWJsZU9mSW5zdGFuY2VPZkRhdGE6OmNvbnN0X3Jhd19pdGVyYXRvciBpdERhdGEgID0gZ2V0RGF0YSgpLmJlZ2luKCk7CisJVGFibGVPZkluc3RhbmNlT2ZEYXRhOjpjb25zdF9yYXdfaXRlcmF0b3IgZW5kRGF0YSA9IGdldERhdGEoKS5lbmQoKTsKKworCWlmKCBoYXNQYXJhbSgpICkKKwl7CisJCW91dCA8PCBUQUIgPDwgInBhcmFtZXRlcjoiIDw8IEVPTF9JTkNSX0lOREVOVDsKKwkJYXZtX3NpemVfdCBwYXJhbSA9IGdldFBhcmFtQ291bnQoKTsKKwkJZm9yKCA7IHBhcmFtID4gMCA7IC0tcGFyYW0gLCArK2l0RGF0YSApCisJCXsKKwkJCShpdERhdGEpLT50b1N0cmVhbShvdXQpOworCQl9CisJCW91dCA8PCBERUNSX0lOREVOVDsKKwl9CisKKwlpZiggaGFzUmV0dXJuKCkgKQorCXsKKwkJb3V0IDw8IFRBQiA8PCAicmV0dXJuczoiIDw8IEVPTF9JTkNSX0lOREVOVDsKKwkJZm9yKCBhdm1fc2l6ZV90IHJldCA9IGdldFJldHVybkNvdW50KCkgOyByZXQgPiAwIDsgLS1yZXQgLCArK2l0RGF0YSApCisJCXsKKwkJCShpdERhdGEpLT50b1N0cmVhbShvdXQpOworCQl9CisJCW91dCA8PCBERUNSX0lOREVOVDsKKwl9CisKKwlpZiggaGFzVHlwZVNwZWNpZmllcigpICkKKwl7CisJCW91dCA8PCBUQUIgPDwgInR5cGU6IiA8PCBFT0xfSU5DUl9JTkRFTlQ7CisKKwkJZ2V0VHlwZVNwZWNpZmllcigpLnRvU3RyZWFtKG91dCk7CisKKwkJb3V0IDw8IERFQ1JfSU5ERU5UOworCX0KKworCisJaWYoIChoYXNEYXRhKCkgJiYgKGdldERhdGEoKS5zaXplKCkgPiBnZXRQYXJhbVJldHVybkNvdW50KCkpKQorCQkJfHwgaGFzQ29uc3REYXRhKCkgfHwgaGFzVHlwZVNwZWNpZmllcigpICkKKwl7CisJCW91dCA8PCBUQUIgPDwgInZhcmlhYmxlOiIgPDwgRU9MX0lOQ1JfSU5ERU5UOworCisJCWlmKCBoYXNDb25zdERhdGEoKSApCisJCXsKKwkJCWdldENvbnN0RGF0YSgpLnRvU3RyZWFtKG91dCk7CisKKwkJCW91dCA8PCBFT0w7CisJCX0KKworCQlmb3IoIDsgaXREYXRhICE9IGVuZERhdGEgOyArK2l0RGF0YSApCisJCXsKKwkJCShpdERhdGEpLT50b1N0cmVhbShvdXQpOworCQl9CisKKwkJb3V0IDw8IERFQ1JfSU5ERU5UOworCitBVk1fSUZfREVCVUdfRkxBRyggREFUQSApCisJCWlmKCBtQWxsRGF0YSAhPSAmbURhdGEgKQorCQl7CisJCQlvdXQgPDwgVEFCIDw8ICJ2YXJpYWJsZSNhbGw6IiA8PCBFT0xfSU5DUl9JTkRFTlQ7CisJCQlpdERhdGEgPSBnZXRBbGxEYXRhKCkuYmVnaW4oKTsKKwkJCWVuZERhdGEgPSBnZXRBbGxEYXRhKCkuZW5kKCk7CisJCQlmb3IoIDsgaXREYXRhICE9IGVuZERhdGEgOyArK2l0RGF0YSApCisJCQl7CisJCQkJKGl0RGF0YSktPnRvU3RyZWFtKG91dCk7CisJCQl9CisJCQlvdXQgPDwgREVDUl9JTkRFTlQ7CisKKwkJfQorCQlpZiggbUJhc2ljRGF0YSAhPSAmbURhdGEgKQorCQl7CisJCQlvdXQgPDwgVEFCIDw8ICJ2YXJpYWJsZSNiYXNpYzoiIDw8IEVPTF9JTkNSX0lOREVOVDsKKwkJCWl0RGF0YSA9IGdldEJhc2ljRGF0YSgpLmJlZ2luKCk7CisJCQllbmREYXRhID0gZ2V0QmFzaWNEYXRhKCkuZW5kKCk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9HVEVfSElHSAorCQkJZm9yKCA7IGl0RGF0YSAhPSBlbmREYXRhIDsgKytpdERhdGEgKQorCQkJeworCQkJCShpdERhdGEpLT50b1N0cmVhbShvdXQpOworCQkJfQorQVZNX0VMU0UKKwkJCWZvciggOyBpdERhdGEgIT0gZW5kRGF0YSA7ICsraXREYXRhICkKKwkJCXsKKwkJCQlvdXQgPDwgVEFCMiA8PCBzdHJfaGVhZGVyKCAqaXREYXRhICkKKwkJCQkJCTw8ICI7IiA8PCBFT0w7CisJCQl9CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfR1RFX0hJR0gKKworCQkJb3V0IDw8IERFQ1JfSU5ERU5UOworCQl9CitBVk1fRU5ESUZfREVCVUdfRkxBRyggREFUQSApCisJfQorCisJaWYoIGdldERhdGFBbGlhcygpLm5vbmVtcHR5KCkgKQorCXsKKwkJb3V0IDw8IFRBQiA8PCAiYWxpYXM6IiA8PCBFT0xfSU5DUl9JTkRFTlQ7CisKKwkJVGFibGVPZkluc3RhbmNlT2ZEYXRhOjpjb25zdF9yYXdfaXRlcmF0b3IgaXRBbGlhcyA9IGdldERhdGFBbGlhcygpLmJlZ2luKCk7CisJCVRhYmxlT2ZJbnN0YW5jZU9mRGF0YTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGVuZEFsaWFzID0gZ2V0RGF0YUFsaWFzKCkuZW5kKCk7CisJCWZvciggOyBpdEFsaWFzICE9IGVuZEFsaWFzIDsgKytpdEFsaWFzICkKKwkJeworCQkJKGl0QWxpYXMpLT50b1N0cmVhbShvdXQpOworCQl9CisJCW91dCA8PCBERUNSX0lOREVOVDsKKwl9Cit9CisKKwordm9pZCBBdm1Qcm9ncmFtOjp0b1N0cmVhbVN0YXRpY0NvbShPdXRTdHJlYW0gJiBvdXQpIGNvbnN0Cit7CisvL0FWTV9JRl9ERUJVR19GTEFHKCBDT01NVU5JQ0FUSU9OICkKKwlpZiAoIGhhc0NvbW11bmljYXRpb25Db2RlKCkgKQorCXsKKwkJb3V0IDw8IFRBQiA8PCAiY29tbXVuaWNhdGlvbiIKKwkJCQk8PCAoaXNNdXRhYmxlQ29tbXVuaWNhdGlvbigpID8gIiIgOiAiPGZpbmFsPiIpOworCQlCYXNlQ29tcGlsZWRGb3JtOjp0b1N0cmVhbVN0YXRpY0NvbShvdXQsIGdldENvbW11bmljYXRpb25Db2RlKCkpOworCX0KKworCWlmICggaGFzSW50ZXJuYWxDb21tdW5pY2F0aW9uQ29kZSgpICkKKwl7CisJCW91dCA8PCBUQUIgPDwgImNvbSNpbnRlcm5hbCI7CisJCUJhc2VDb21waWxlZEZvcm06OnRvU3RyZWFtU3RhdGljQ29tKG91dCwgZ2V0SW50ZXJuYWxDb21tdW5pY2F0aW9uQ29kZSgpKTsKKwl9CisKKworCWlmICggaGFzSW5wdXRDb20oKSApCisJeworCQlvdXQgPDwgVEFCIDw8ICJjb20jaW5wdXR7IiA8PCBFT0w7CisJCUJhc2VDb21waWxlZEZvcm06OnRvU3RyZWFtU3RhdGljQ29tKG91dCwgZ2V0SW5wdXRDb20oKSk7CisJCW91dCA8PCBUQUIgPDwgIn0iIDw8IEVPTDsKKwl9CisKKwlpZiAoIGhhc091dHB1dENvbSgpICkKKwl7CisJCW91dCA8PCBUQUIgPDwgImNvbSNvdXRwdXR7IiA8PCBFT0w7CisJCUJhc2VDb21waWxlZEZvcm06OnRvU3RyZWFtU3RhdGljQ29tKG91dCwgZ2V0T3V0cHV0Q29tKCkpOworCQlvdXQgPDwgVEFCIDw8ICJ9IiA8PCBFT0w7CisJfQorCisKKwlpZiAoIGhhc0lucHV0RW5hYmxlZEJ1ZmZlcigpICkKKwl7CisJCW91dCA8PCBUQUIgPDwgImJ1ZmZlciNpbnB1dF9lbmFibGVkeyIgPDwgRU9MOworCQlCYXNlQ29tcGlsZWRGb3JtOjp0b1N0cmVhbVN0YXRpY0NvbShvdXQsIGdldElucHV0RW5hYmxlZEJ1ZmZlcigpKTsKKwkJb3V0IDw8IFRBQiA8PCAifSIgPDwgRU9MOworCX0KKworCWlmICggaGFzSW5wdXRFbmFibGVkQ29tKCkgKQorCXsKKwkJb3V0IDw8IFRBQiA8PCAiY29tI2lucHV0X2VuYWJsZWR7IiA8PCBFT0w7CisJCUJhc2VDb21waWxlZEZvcm06OnRvU3RyZWFtU3RhdGljQ29tKG91dCwgZ2V0SW5wdXRFbmFibGVkQ29tKCkpOworCQlvdXQgPDwgVEFCIDw8ICJ9IiA8PCBFT0w7CisJfQorCisJaWYgKCBoYXNJbnB1dEVuYWJsZWRTYXZlKCkgKQorCXsKKwkJb3V0IDw8IFRBQiA8PCAiY29tI2lucHV0X2VuYWJsZWQjc2F2ZXsiIDw8IEVPTDsKKwkJQmFzZUNvbXBpbGVkRm9ybTo6dG9TdHJlYW1TdGF0aWNDb20ob3V0LCBnZXRJbnB1dEVuYWJsZWRTYXZlKCkpOworCQlvdXQgPDwgVEFCIDw8ICJ9IiA8PCBFT0w7CisJfQorCisKKwlpZiAoIGhhc0Vudmlyb25tZW50Q29tKCkgKQorCXsKKwkJb3V0IDw8IFRBQiA8PCAiY29tI2VudiI7CisJCUJhc2VDb21waWxlZEZvcm06OnRvU3RyZWFtU3RhdGljQ29tKG91dCwgZ2V0RW52aXJvbm1lbnRDb20oKSk7CisJfQorCisJaWYgKCBoYXNFbnZpcm9ubWVudElucHV0Q29tKCkgKQorCXsKKwkJb3V0IDw8IFRBQiA8PCAiY29tI2lucHV0I2VudiI7CisJCUJhc2VDb21waWxlZEZvcm06OnRvU3RyZWFtU3RhdGljQ29tKG91dCwgZ2V0RW52aXJvbm1lbnRJbnB1dENvbSgpKTsKKwl9CisKKwlpZiAoIGhhc0Vudmlyb25tZW50T3V0cHV0Q29tKCkgKQorCXsKKwkJb3V0IDw8IFRBQiA8PCAiY29tI291dHB1dCNlbnYiOworCQlCYXNlQ29tcGlsZWRGb3JtOjp0b1N0cmVhbVN0YXRpY0NvbShvdXQsIGdldEVudmlyb25tZW50T3V0cHV0Q29tKCkpOworCX0KKy8vQVZNX0VORElGX0RFQlVHX0ZMQUcoIENPTU1VTklDQVRJT04gKQorfQorCisKK3ZvaWQgQXZtUHJvZ3JhbTo6dG9TdHJlYW0oT3V0U3RyZWFtICYgb3V0KSBjb25zdAoreworCS8vIFJFRkVSRU5DRSBQUk9HUkFNCisJaWYoIG91dC5wcmVmZXJhYmx5RlFOKCkgKQorCXsKKwkJb3V0IDw8IFRBQiA8PCAoIGlzU2NvcGVUcmFuc2l0aW9uKCkgPworCQkJCWdldE5hbWVJRCgpIDogZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSApOworCisJCUFWTV9ERUJVR19SRUZfQ09VTlRFUihvdXQpOworCisJCXJldHVybjsKKwl9CisKKwlvdXQgPDwgVEFCIDw8IGdldE1vZGlmaWVyKCkudG9TdHJpbmcoKQorCQk8PCBTcGVjaWZpZXI6OnN0clNjb3BlKCBtU2NvcGUgKQorCQk8PCAiPCBpZDoiIDw8IGdldE9mZnNldCgpIDw8ICIgPiAiOworCitBVk1fSUZfREVCVUdfRkxBR19BTkQoIENPTVBJTElORyAsIGhhc0FzdEVsZW1lbnQoKSApCisJb3V0IDw8ICImIiA8PCBnZXRBc3RGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8ICIgIjsKK0FWTV9FTkRJRl9ERUJVR19GTEFHX0FORCggQ09NUElMSU5HICkKKworCW91dCA8PCAoIGlzU2NvcGVUcmFuc2l0aW9uKCkgPworCQkJZ2V0TmFtZUlEKCkgOiBnZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpICkgPDwgIiB7IjsKKwlBVk1fREVCVUdfUkVGX0NPVU5URVIob3V0KTsKKwlvdXQgPDwgRU9MOworCitBVk1fSUZfREVCVUdfRkxBRyggQ09NUElMSU5HICkKKwlpZiggaGFzQ29udGFpbmVyKCkgKQorCXsKKwkJb3V0IDw8IFRBQjIgPDwgIi8vY29udGFpbmVyID0gIgorCQkJCTw8IHN0cl9oZWFkZXIoIGdldENvbnRhaW5lcigpLT5hczwgQXZtUHJvZ3JhbSA+KCkgKQorCQkJCTw8ICI7IiA8PCBFT0w7CisJfQorQVZNX0VORElGX0RFQlVHX0ZMQUcoIENPTVBJTElORyApCisKKy8vCW91dCA8PCBUQUIyIDw8ICJvZmZzZXQgPSAiIDw8IGdldE9mZnNldCgpIDw8ICI7IiA8PCBFT0w7CisKKworCS8vIEFueSBwcm9ncmFtIGRhdGEKKwl0b1N0cmVhbURhdGEob3V0KTsKKworCisJb3V0IDw8IFRBQiA8PCAibW9lOiIgPDwgRU9MOworCisJaWYoIGhhc0NvZGUoKSApCisJeworCQlvdXQgPDwgVEFCMiA8PCAiQHJ1bnsiIDw8IElOQ1IyX0lOREVOVDsKKworCQlnZXRDb2RlKCktPnRvU3RyZWFtUm91dGluZSggb3V0ICk7CisKKwkJb3V0PDwgREVDUjJfSU5ERU5UX1RBQjIgPDwgIiB9IiA8PCBFT0w7CisJfQorCisJaWYoIGhhc1N0YXRlbWVudEZhbWlseSgpICkKKwl7CisJCW91dCA8PCBUQUIgPDwgIm9wY29kZSNmYW1pbHkgPSAiIDw8IHN0clN0YXRlbWVudEZhbWlseSgpIDw8ICI7IiA8PCBFT0w7CisJfQorCisJLy8gc3RhdGljIGNsYXNzIG9mIFBvcnQvTWVzc2FnZS9TaWduYWwgaW4gY29tbXVuaWNhdGVkIHRyYW5zaXRpb24KKwlvdXQgPDwgSU5DUl9JTkRFTlQ7CisJdG9TdHJlYW1TdGF0aWNDb20ob3V0KTsKKwlvdXQgPDwgREVDUl9JTkRFTlQ7CisKKwlvdXQgPDwgVEFCIDw8ICJ9IiA8PCBFT0wgPDwgc3RkOjpmbHVzaDsKK30KKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhlY3V0YWJsZS9Bdm1Qcm9ncmFtLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhlY3V0YWJsZS9Bdm1Qcm9ncmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJjMGZkOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leGVjdXRhYmxlL0F2bVByb2dyYW0uaApAQCAtMCwwICsxLDEyNzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgQVZNUFJPR1JBTV9IXworI2RlZmluZSBBVk1QUk9HUkFNX0hfCisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9CYXNlQXZtUHJvZ3JhbS5oPgorCisjaW5jbHVkZSA8Y29tbW9uL0F2bVBvaW50ZXIuaD4KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vTGlzdC5oPgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQXZtQ29kZS5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZkJ1ZmZlci5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZEYXRhLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZlBvcnQuaD4KKworI2luY2x1ZGUgPGZtbC9jb21tb24vTW9kaWZpZXJFbGVtZW50Lmg+CisjaW5jbHVkZSA8Zm1sL2NvbW1vbi9TcGVjaWZpZXJFbGVtZW50Lmg+CisKKyNpbmNsdWRlIDxmbWwvdHlwZS9UYWJsZU9mVHlwZVNwZWNpZmllci5oPgorCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1RyYW5zaXRpb24uaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworY2xhc3MgRXhlY3V0YWJsZUZvcm07CisKK2NsYXNzIE9iamVjdEVsZW1lbnQ7CisKK2NsYXNzIFRhYmxlT2ZBdm1Qcm9ncmFtOworCisKK2NsYXNzIEF2bVByb2dyYW0gOgorCQlwdWJsaWMgQmFzZUF2bVByb2dyYW0gLAorCQlwdWJsaWMgSVN0YXRlbWVudEZhbWlseSAsCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggQXZtUHJvZ3JhbSApCit7CisKKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggQXZtUHJvZ3JhbSApCisKKworcHJvdGVjdGVkOgorCS8qCisJICogQVRUUklCVVRFUworCSAqLworCWF2bV9vZmZzZXRfdCBtT2Zmc2V0OworCisJU3BlY2lmaWVyOjpTQ09QRV9LSU5EIG1TY29wZTsKKworCisJYXZtX29mZnNldF90IG1QYXJhbU9mZnNldDsKKwlhdm1fc2l6ZV90ICAgbVBhcmFtQ291bnQ7CisKKwlhdm1fb2Zmc2V0X3QgbVJldHVybk9mZnNldDsKKwlhdm1fc2l6ZV90ICAgbVJldHVybkNvdW50OworCisJVGFibGVPZkluc3RhbmNlT2ZEYXRhIG1Db25zdERhdGE7CisKKwlUYWJsZU9mVHlwZVNwZWNpZmllciBtVGFibGVPZlR5cGVTcGVjaWZpZXI7CisKKwlCRkNvZGUgbUNvZGU7CisKKwkvLyBzdGF0aWMgY2xhc3Mgb2YgUG9ydC9NZXNzYWdlL1NpZ25hbCBpbiBjb21tdW5pY2F0ZWQgc3RhdGVtZW50CisJQkYgbUNvbW11bmljYXRpb25Db2RlOworCisJQkYgbUludGVybmFsQ29tbXVuaWNhdGlvbkNvZGU7CisKKwlMaXN0T2ZJbnN0YW5jZU9mUG9ydCBtSW5wdXRDb207CisJTGlzdE9mSW5zdGFuY2VPZlBvcnQgbU91dHB1dENvbTsKKworCUxpc3RPZkluc3RhbmNlT2ZCdWZmZXIgbUlucHV0RW5hYmxlZEJ1ZmZlcjsKKwlMaXN0T2ZJbnN0YW5jZU9mUG9ydCBtSW5wdXRFbmFibGVkQ29tOworCUxpc3RPZkluc3RhbmNlT2ZQb3J0IG1JbnB1dEVuYWJsZWRTYXZlOworCisJYm9vbCBtTXV0YWJsZUNvbW11bmljYXRpb25GbGFnOworCisJQkYgbUVudmlyb25tZW50Q29tOworCUJGIG1FbnZpcm9ubWVudElucHV0Q29tOworCUJGIG1FbnZpcm9ubWVudE91dHB1dENvbTsKKworcHVibGljOgorCS8qKgorCSAqIFNUQVRJQworCSAqLworCXN0YXRpYyBzdGQ6OnN0cmluZyBBTk9OWU1fVUZJOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlBdm1Qcm9ncmFtKFNwZWNpZmllcjo6U0NPUEVfS0lORCBhU2NvcGUsIEF2bVByb2dyYW0gKiBhQ29udGFpbmVyLAorCQkJY29uc3QgT2JqZWN0RWxlbWVudCAqIGFzdFByb2dyYW0sIGF2bV9zaXplX3QgYVNpemUpCisJOiBCYXNlQXZtUHJvZ3JhbShDTEFTU19LSU5EX1QoIEF2bVByb2dyYW0gKSwgYUNvbnRhaW5lciwgYXN0UHJvZ3JhbSwgYVNpemUpLAorCUlTdGF0ZW1lbnRGYW1pbHkoIEFWTV9TVEFURU1FTlRfVU5ERUZJTkVEX0ZBTUlMWSApLAorCisJbU9mZnNldCggMCApLAorCW1TY29wZSggYVNjb3BlICksCisKKwltUGFyYW1PZmZzZXQoIDAgKSwKKwltUGFyYW1Db3VudCggMCApLAorCW1SZXR1cm5PZmZzZXQoIDAgKSwKKwltUmV0dXJuQ291bnQoIDAgKSwKKworCW1Db25zdERhdGEoICksCisJbVRhYmxlT2ZUeXBlU3BlY2lmaWVyKCApLAorCisJbUNvZGUoICksCisKKwltQ29tbXVuaWNhdGlvbkNvZGUoICksCisJbUludGVybmFsQ29tbXVuaWNhdGlvbkNvZGUoICksCisKKwltSW5wdXRDb20oICksCisJbU91dHB1dENvbSggKSwKKworCW1JbnB1dEVuYWJsZWRCdWZmZXIoICksCisJbUlucHV0RW5hYmxlZENvbSggKSwKKwltSW5wdXRFbmFibGVkU2F2ZSggKSwKKworCW1NdXRhYmxlQ29tbXVuaWNhdGlvbkZsYWcoIGZhbHNlICksCisKKwltRW52aXJvbm1lbnRDb20oICksCisJbUVudmlyb25tZW50SW5wdXRDb20oICksCisJbUVudmlyb25tZW50T3V0cHV0Q29tKCApCisJeworCQl1cGRhdGVGdWxseVF1YWxpZmllZE5hbWVJRCgpOworCX0KKworCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0IGZvciBSb3V0aW5lCisJICovCisJQXZtUHJvZ3JhbShTcGVjaWZpZXI6OlNDT1BFX0tJTkQgYVNjb3BlLCBBdm1Qcm9ncmFtICogYUNvbnRhaW5lciwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgaWQsIGF2bV9zaXplX3QgYVNpemUpCisJOiBCYXNlQXZtUHJvZ3JhbShDTEFTU19LSU5EX1QoIEF2bVByb2dyYW0gKSwgYUNvbnRhaW5lciwgaWQsIGFTaXplKSwKKwlJU3RhdGVtZW50RmFtaWx5KCBBVk1fU1RBVEVNRU5UX1VOREVGSU5FRF9GQU1JTFkgKSwKKworCW1PZmZzZXQoIDAgKSwKKwltU2NvcGUoIGFTY29wZSApLAorCisJbVBhcmFtT2Zmc2V0KCAwICksCisJbVBhcmFtQ291bnQoIDAgKSwKKwltUmV0dXJuT2Zmc2V0KCAwICksCisJbVJldHVybkNvdW50KCAwICksCisKKwltQ29uc3REYXRhKCApLAorCW1UYWJsZU9mVHlwZVNwZWNpZmllciggKSwKKworCW1Db2RlKCApLAorCisJbUNvbW11bmljYXRpb25Db2RlKCApLAorCW1JbnRlcm5hbENvbW11bmljYXRpb25Db2RlKCApLAorCisJbUlucHV0Q29tKCApLAorCW1PdXRwdXRDb20oICksCisKKwltSW5wdXRFbmFibGVkQnVmZmVyKCApLAorCW1JbnB1dEVuYWJsZWRDb20oICksCisJbUlucHV0RW5hYmxlZFNhdmUoICksCisKKwltTXV0YWJsZUNvbW11bmljYXRpb25GbGFnKCBmYWxzZSApLAorCisJbUVudmlyb25tZW50Q29tKCApLAorCW1FbnZpcm9ubWVudElucHV0Q29tKCApLAorCW1FbnZpcm9ubWVudE91dHB1dENvbSggKQorCXsKKwkJdXBkYXRlRnVsbHlRdWFsaWZpZWROYW1lSUQoKTsKKwl9CisKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCUF2bVByb2dyYW0oY29uc3QgQXZtUHJvZ3JhbSAmIGFQcm9ncmFtKQorCTogQmFzZUF2bVByb2dyYW0oIGFQcm9ncmFtICksCisJSVN0YXRlbWVudEZhbWlseSggYVByb2dyYW0gKSwKKworCW1PZmZzZXQoIGFQcm9ncmFtLm1PZmZzZXQgKSwKKwltU2NvcGUoIGFQcm9ncmFtLm1TY29wZSApLAorCisJbVBhcmFtT2Zmc2V0KCBhUHJvZ3JhbS5tUGFyYW1PZmZzZXQgKSwKKwltUGFyYW1Db3VudCggYVByb2dyYW0ubVBhcmFtQ291bnQgKSwKKwltUmV0dXJuT2Zmc2V0KCBhUHJvZ3JhbS5tUmV0dXJuT2Zmc2V0ICksCisJbVJldHVybkNvdW50KCBhUHJvZ3JhbS5tUmV0dXJuQ291bnQgKSwKKworCW1Db25zdERhdGEoIGFQcm9ncmFtLm1Db25zdERhdGEgKSwKKwltVGFibGVPZlR5cGVTcGVjaWZpZXIoIGFQcm9ncmFtLm1UYWJsZU9mVHlwZVNwZWNpZmllciApLAorCisJbUNvZGUoIGFQcm9ncmFtLm1Db2RlICksCisKKwltQ29tbXVuaWNhdGlvbkNvZGUoIGFQcm9ncmFtLm1Db21tdW5pY2F0aW9uQ29kZSApLAorCW1JbnRlcm5hbENvbW11bmljYXRpb25Db2RlKCBhUHJvZ3JhbS5tSW50ZXJuYWxDb21tdW5pY2F0aW9uQ29kZSApLAorCisJbUlucHV0Q29tKCBhUHJvZ3JhbS5tSW5wdXRDb20gKSwKKwltT3V0cHV0Q29tKCBhUHJvZ3JhbS5tT3V0cHV0Q29tICksCisKKwltSW5wdXRFbmFibGVkQnVmZmVyKCBhUHJvZ3JhbS5tSW5wdXRFbmFibGVkQnVmZmVyICksCisJbUlucHV0RW5hYmxlZENvbSggYVByb2dyYW0ubUlucHV0RW5hYmxlZENvbSApLAorCW1JbnB1dEVuYWJsZWRTYXZlKCBhUHJvZ3JhbS5tSW5wdXRFbmFibGVkU2F2ZSApLAorCisJbU11dGFibGVDb21tdW5pY2F0aW9uRmxhZyggYVByb2dyYW0ubU11dGFibGVDb21tdW5pY2F0aW9uRmxhZyApLAorCisJbUVudmlyb25tZW50Q29tKCBhUHJvZ3JhbS5tRW52aXJvbm1lbnRDb20gKSwKKwltRW52aXJvbm1lbnRJbnB1dENvbSggYVByb2dyYW0ubUVudmlyb25tZW50SW5wdXRDb20gKSwKKwltRW52aXJvbm1lbnRPdXRwdXRDb20oIGFQcm9ncmFtLm1FbnZpcm9ubWVudE91dHB1dENvbSApCisJeworCQkvLyAhISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIE90aGVyCisJICovCisJQXZtUHJvZ3JhbShjbGFzc19raW5kX3QgYUNsYXNzS2luZCwKKwkJCVNwZWNpZmllcjo6U0NPUEVfS0lORCBhU2NvcGUsIEF2bVByb2dyYW0gKiBhQ29udGFpbmVyLAorCQkJT2JqZWN0RWxlbWVudCAqIGFDb21waWxlZCwgYXZtX3NpemVfdCBhU2l6ZSkKKwk6IEJhc2VBdm1Qcm9ncmFtKGFDbGFzc0tpbmQsIGFDb250YWluZXIsIGFDb21waWxlZCwgYVNpemUpLAorCUlTdGF0ZW1lbnRGYW1pbHkoIEFWTV9TVEFURU1FTlRfVU5ERUZJTkVEX0ZBTUlMWSApLAorCisJbU9mZnNldCggMCApLAorCW1TY29wZSggYVNjb3BlICksCisKKwltUGFyYW1PZmZzZXQoIDAgKSwKKwltUGFyYW1Db3VudCggMCApLAorCW1SZXR1cm5PZmZzZXQoIDAgKSwKKwltUmV0dXJuQ291bnQoIDAgKSwKKworCW1Db25zdERhdGEoICksCisJbVRhYmxlT2ZUeXBlU3BlY2lmaWVyKCApLAorCisJbUNvZGUoICksCisKKwltQ29tbXVuaWNhdGlvbkNvZGUoICksCisJbUludGVybmFsQ29tbXVuaWNhdGlvbkNvZGUoICksCisKKwltSW5wdXRDb20oICksCisJbU91dHB1dENvbSggKSwKKworCW1JbnB1dEVuYWJsZWRCdWZmZXIoICksCisJbUlucHV0RW5hYmxlZENvbSggKSwKKwltSW5wdXRFbmFibGVkU2F2ZSggKSwKKworCW1NdXRhYmxlQ29tbXVuaWNhdGlvbkZsYWcoIGZhbHNlICksCisKKwltRW52aXJvbm1lbnRDb20oICksCisJbUVudmlyb25tZW50SW5wdXRDb20oICksCisJbUVudmlyb25tZW50T3V0cHV0Q29tKCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+QXZtUHJvZ3JhbSgpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1PZmZzZXQKKwkgKi8KKwlpbmxpbmUgYXZtX29mZnNldF90IGdldE9mZnNldCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1PZmZzZXQgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRPZmZzZXQoYXZtX29mZnNldF90IGFuT2Zmc2V0KQorCXsKKwkJbU9mZnNldCA9IGFuT2Zmc2V0OworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVNjb3BlCisJICovCisJaW5saW5lIFNwZWNpZmllcjo6U0NPUEVfS0lORCBnZXRTY29wZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1TY29wZSApOworCX0KKworCWlubGluZSBib29sIGlzU2NvcGUoU3BlY2lmaWVyOjpTQ09QRV9LSU5EIGFTY29wZSkgY29uc3QKKwl7CisJCXJldHVybiggKG1TY29wZSA9PSBhU2NvcGUpCisJCQkJfHwgKCBhU2NvcGUgPT0gU3BlY2lmaWVyOjpTQ09QRV9VTkRFRklORURfS0lORCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRTY29wZShTcGVjaWZpZXI6OlNDT1BFX0tJTkQgYVNjb3BlKQorCXsKKwkJbVNjb3BlID0gYVNjb3BlOworCX0KKworCisJaW5saW5lIGJvb2wgaXNTY29wZVRyYW5zaXRpb24oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtU2NvcGUgPT0gU3BlY2lmaWVyOjpTQ09QRV9UUkFOU0lUSU9OX0tJTkQgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRTY29wZVRyYW5zaXRpb24oKQorCXsKKwkJbVNjb3BlID0gU3BlY2lmaWVyOjpTQ09QRV9UUkFOU0lUSU9OX0tJTkQ7CisJfQorCisJaW5saW5lIGJvb2wgaXNTY29wZU1hY2hpbmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtU2NvcGUgPT0gU3BlY2lmaWVyOjpTQ09QRV9NQUNISU5FX0tJTkQgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRTY29wZU1hY2hpbmUoKQorCXsKKwkJbVNjb3BlID0gU3BlY2lmaWVyOjpTQ09QRV9NQUNISU5FX0tJTkQ7CisJfQorCisKKwlpbmxpbmUgYm9vbCBpc1Njb3BlUm91dGluZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1TY29wZSA9PSBTcGVjaWZpZXI6OlNDT1BFX1JPVVRJTkVfS0lORCApOworCX0KKworCWlubGluZSB2b2lkIHNldFNjb3BlUm91dGluZSgpCisJeworCQltU2NvcGUgPSBTcGVjaWZpZXI6OlNDT1BFX1JPVVRJTkVfS0lORDsKKwl9CisKKworCWlubGluZSBib29sIGlzU2NvcGVQcm9ncmFtKCkgY29uc3QKKwl7CisJCXJldHVybiggbVNjb3BlID09IFNwZWNpZmllcjo6U0NPUEVfUFJPR1JBTV9LSU5EICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0U2NvcGVQcm9ncmFtKCkKKwl7CisJCW1TY29wZSA9IFNwZWNpZmllcjo6U0NPUEVfUFJPR1JBTV9LSU5EOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVBhcmFtT2Zmc2V0CisJICogbVBhcmFtQ291bnQKKwkgKi8KKwlpbmxpbmUgY29uc3QgQkYgJiBnZXRQYXJhbShhdm1fb2Zmc2V0X3Qgb2Zmc2V0KSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXREYXRhKCkuYXQob2Zmc2V0KSApOworCX0KKworCWlubGluZSBCYXNlVHlwZVNwZWNpZmllciAqIGdldFBhcmFtVHlwZVNwZWNpZmllcihhdm1fb2Zmc2V0X3Qgb2Zmc2V0KSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXREYXRhKCkucmF3QXQob2Zmc2V0KS0+Z2V0VHlwZVNwZWNpZmllcigpICk7CisJfQorCisKKwlpbmxpbmUgYXZtX29mZnNldF90IGdldFBhcmFtT2Zmc2V0KCkgY29uc3QKKwl7CisJCXJldHVybiggbVBhcmFtT2Zmc2V0ICk7CisJfQorCisJaW5saW5lIGF2bV9zaXplX3QgZ2V0UGFyYW1Db3VudCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1QYXJhbUNvdW50ICk7CisJfQorCisKKwlpbmxpbmUgSW5zdGFuY2VPZkRhdGEgKiByYXdQYXJhbURhdGEoYXZtX29mZnNldF90IG9mZnNldCkgY29uc3QKKwl7CisJCUFWTV9PU19BU1NFUlRfRkFUQUxfQVJSQVlfT0ZGU0VUX0VYSVQoIG9mZnNldCAsIG1QYXJhbUNvdW50ICkKKwkJCQk8PCAiVW5ib3VuZCBJbnN0YW5jZSBwYXJhbWV0ZXIgb2Zmc2V0ICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJcmV0dXJuKCBtRGF0YS5yYXdBdChtUGFyYW1PZmZzZXQgKyBvZmZzZXQpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzUGFyYW0oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUGFyYW1Db3VudCA+IDAgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRQYXJhbU9mZnNldENvdW50KGF2bV9vZmZzZXRfdCBhUGFyYW1PZmZzZXQsCisJCQlhdm1fc2l6ZV90IGFQYXJhbUNvdW50KQorCXsKKwkJbVBhcmFtT2Zmc2V0ID0gYVBhcmFtT2Zmc2V0OworCQltUGFyYW1Db3VudCAgPSBhUGFyYW1Db3VudDsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1SZXR1cm5PZmZzZXQKKwkgKiBtUmV0dXJuQ291bnQKKwkgKi8KKwlpbmxpbmUgY29uc3QgQkYgJiBnZXRSZXR1cm4oYXZtX29mZnNldF90IG9mZnNldCkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0RGF0YSgpLmF0KG1SZXR1cm5PZmZzZXQgKyBvZmZzZXQpICk7CisJfQorCisJaW5saW5lIEJhc2VUeXBlU3BlY2lmaWVyICogZ2V0UmV0dXJuVHlwZVNwZWNpZmllcihhdm1fb2Zmc2V0X3Qgb2Zmc2V0KSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXREYXRhKCkucmF3QXQobVJldHVybk9mZnNldCArIG9mZnNldCktPmdldFR5cGVTcGVjaWZpZXIoKSApOworCX0KKworCisJaW5saW5lIGF2bV9vZmZzZXRfdCBnZXRSZXR1cm5PZmZzZXQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUmV0dXJuT2Zmc2V0ICk7CisJfQorCisJaW5saW5lIGF2bV9vZmZzZXRfdCByZXR1cm5PZmZzZXQoYXZtX29mZnNldF90IG9mZnNldCkgY29uc3QKKwl7CisJCXJldHVybiggbVJldHVybk9mZnNldCArIG9mZnNldCApOworCX0KKworCWlubGluZSBhdm1fc2l6ZV90IGdldFJldHVybkNvdW50KCkgY29uc3QKKwl7CisJCXJldHVybiggbVJldHVybkNvdW50ICk7CisJfQorCisKKwlpbmxpbmUgSW5zdGFuY2VPZkRhdGEgKiByYXdSZXR1cm5EYXRhKGF2bV9vZmZzZXRfdCBvZmZzZXQpIGNvbnN0CisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX0FSUkFZX09GRlNFVF9FWElUKCBvZmZzZXQgLCBtUmV0dXJuQ291bnQgKQorCQkJCTw8ICJVbmJvdW5kIEluc3RhbmNlIHBhcmFtZXRlciBvZmZzZXQgISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQlyZXR1cm4oIG1EYXRhLnJhd0F0KG1SZXR1cm5PZmZzZXQgKyBvZmZzZXQpICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBoYXNSZXR1cm4oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUmV0dXJuQ291bnQgPiAwICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0UmV0dXJuT2Zmc2V0Q291bnQoYXZtX29mZnNldF90IGFSZXR1cm5PZmZzZXQsCisJCQlhdm1fc2l6ZV90IGFSZXR1cm5Db3VudCkKKwl7CisJCW1SZXR1cm5PZmZzZXQgPSBhUmV0dXJuT2Zmc2V0OworCQltUmV0dXJuQ291bnQgID0gYVJldHVybkNvdW50OworCX0KKworCisJLyoqCisJICogR0VUVEVSCisJICogbVBhcmFtQ291bnQKKwkgKiBtUmV0dXJuQ291bnQKKwkgKi8KKwlpbmxpbmUgYXZtX3NpemVfdCBnZXRQYXJhbVJldHVybkNvdW50KCkgY29uc3QKKwl7CisJCXJldHVybiggbVBhcmFtQ291bnQgKyBtUmV0dXJuQ291bnQgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNQYXJhbVJldHVybigpIGNvbnN0CisJeworCQlyZXR1cm4oIChtUGFyYW1Db3VudCArIG1SZXR1cm5Db3VudCkgPiAwICk7CisJfQorCisKKwkvKioKKwkgKiBTRVRURVIKKwkgKiBtRnVsbHlRdWFsaWZpZWROYW1lSUQKKwkgKi8KKwl2aXJ0dWFsIHZvaWQgdXBkYXRlRnVsbHlRdWFsaWZpZWROYW1lSUQoKTsKKworCWlubGluZSBib29sIGlzQW5vbnltKCkgY29uc3QKKwl7CisJCXJldHVybiggZnFuRXF1YWxzKCBBTk9OWU1fVUZJICkgKTsKKwl9CisKKworCS8qCisJICogY29udGFpbnMgREFUQQorCSAqLworCWlubGluZSBib29sIGNvbnRhaW5zRGF0YShJbnN0YW5jZU9mRGF0YSAqIGFuSW5zdGFuY2UpIGNvbnN0CisJeworCQlyZXR1cm4oIEJhc2VBdm1Qcm9ncmFtOjpjb250YWluc0RhdGEoYW5JbnN0YW5jZSkgfHwKKwkJCQltQ29uc3REYXRhLmNvbnRhaW5zKGFuSW5zdGFuY2UpICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtQ29uc3REYXRhCisJICovCisJaW5saW5lIHZvaWQgYXBwZW5kQ29uc3REYXRhKGNvbnN0IEJGICYgYW5JbnN0YW5jZSkKKwl7CisJCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9TTUFSVF9QT0lOVEVSX0VYSVQoIGFuSW5zdGFuY2UgKQorCQkJCTw8ICJJbnN0YW5jZU9mRGF0YSAhISEiCisJCQkJPDwgU0VORF9FWElUOworCisJCWFuSW5zdGFuY2UudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCktPnNldENvbnRhaW5lcih0aGlzKTsKKworCQltQ29uc3REYXRhLmFwcGVuZChhbkluc3RhbmNlKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzYXZlQ29uc3REYXRhKEluc3RhbmNlT2ZEYXRhICogYW5JbnN0YW5jZSkKKwl7CisJCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9QT0lOVEVSX0VYSVQoIGFuSW5zdGFuY2UgKQorCQkJCTw8ICJJbnN0YW5jZU9mRGF0YSAhISEiCisJCQkJPDwgU0VORF9FWElUOworCisJCWFuSW5zdGFuY2UtPnNldENvbnRhaW5lcih0aGlzKTsKKworCQltQ29uc3REYXRhLnNhdmUoYW5JbnN0YW5jZSk7CisJfQorCisJaW5saW5lIGNvbnN0IFRhYmxlT2ZJbnN0YW5jZU9mRGF0YSAmIGdldENvbnN0RGF0YSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Db25zdERhdGEgKTsKKwl9CisKKworCWlubGluZSBib29sIGhhc0NvbnN0RGF0YSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Db25zdERhdGEubm9uZW1wdHkoKSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVR5cGVTcGVjaWZpZXIKKwkgKi8KKwlpbmxpbmUgdm9pZCBhcHBlbmRUeXBlU3BlY2lmaWVyKGNvbnN0IFR5cGVTcGVjaWZpZXIgJiBhVHlwZVNwZWNpZmllcikKKwl7CisJCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9TTUFSVF9QT0lOVEVSX0VYSVQoIGFUeXBlU3BlY2lmaWVyICkKKwkJCQk8PCAiVHlwZVNwZWNpZmllciAhISEiCisJCQkJPDwgU0VORF9FWElUOworCisJCW1UYWJsZU9mVHlwZVNwZWNpZmllci5hcHBlbmQoYVR5cGVTcGVjaWZpZXIpOworCX0KKworCWlubGluZSBUYWJsZU9mVHlwZVNwZWNpZmllciAmIGdldFR5cGVTcGVjaWZpZXIoKQorCXsKKwkJcmV0dXJuKCBtVGFibGVPZlR5cGVTcGVjaWZpZXIgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgVGFibGVPZlR5cGVTcGVjaWZpZXIgJiBnZXRUeXBlU3BlY2lmaWVyKCkgY29uc3QKKwl7CisJCXJldHVybiggbVRhYmxlT2ZUeXBlU3BlY2lmaWVyICk7CisJfQorCisKKwlpbmxpbmUgY29uc3QgVHlwZVNwZWNpZmllciAmIGdldFR5cGVTcGVjaWZpZXIoYXZtX29mZnNldF90IG9mZnNldCkgY29uc3QKKwl7CisJCXJldHVybiggbVRhYmxlT2ZUeXBlU3BlY2lmaWVyLmdldChvZmZzZXQpICk7CisJfQorCisJaW5saW5lIGNvbnN0IFR5cGVTcGVjaWZpZXIgJiBnZXRUeXBlU3BlY2lmaWVyKAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZU9mVHlwZVNwZWNpZmllci5nZXRCeUZRTmFtZUlEKAorCQkJCWFGdWxseVF1YWxpZmllZE5hbWVJRCApICk7CisJfQorCisKKwlpbmxpbmUgY29uc3QgVHlwZVNwZWNpZmllciAmIGdldFR5cGVTcGVjaWZpZXIoCisJCQljb25zdCBPYmplY3RFbGVtZW50ICogYXN0RWxlbWVudCkgY29uc3QKKwl7CisJCXJldHVybiggbVRhYmxlT2ZUeXBlU3BlY2lmaWVyLmdldEJ5QXN0RWxlbWVudChhc3RFbGVtZW50KSApOworCX0KKworCisJaW5saW5lIGJvb2wgaGFzVHlwZVNwZWNpZmllcigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZU9mVHlwZVNwZWNpZmllci5ub25lbXB0eSgpICk7CisJfQorCisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIGZvciBFbnVtU3ltYm9sRGF0YQorCSAqLworCWlubGluZSBjb25zdCBCRiAmIGdldFN5bWJvbERhdGEoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCkgY29uc3QKKwl7CisJCXJldHVybiggbVRhYmxlT2ZUeXBlU3BlY2lmaWVyLmdldFN5bWJvbERhdGEoIGFGdWxseVF1YWxpZmllZE5hbWVJRCApICk7CisJfQorCisJaW5saW5lIGNvbnN0IEJGICYgZ2V0U3ltYm9sRGF0YUJ5UXVhbGlmaWVkTmFtZUlEKAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVGFibGVPZlR5cGVTcGVjaWZpZXIuCisJCQkJZ2V0U3ltYm9sRGF0YUJ5UXVhbGlmaWVkTmFtZUlEKGFRdWFsaWZpZWROYW1lSUQpICk7CisJfQorCisJaW5saW5lIGNvbnN0IEJGICYgZ2V0U3ltYm9sRGF0YUJ5TmFtZUlEKGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkgY29uc3QKKwl7CisJCXJldHVybiggbVRhYmxlT2ZUeXBlU3BlY2lmaWVyLmdldFN5bWJvbERhdGFCeU5hbWVJRCggYU5hbWVJRCApICk7CisJfQorCisJaW5saW5lIGNvbnN0IEJGICYgZ2V0U3ltYm9sRGF0YUJ5QXN0RWxlbWVudCgKKwkJCWNvbnN0IE9iamVjdEVsZW1lbnQgKiBhc3RFbGVtZW50KSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVGFibGVPZlR5cGVTcGVjaWZpZXIuZ2V0U3ltYm9sRGF0YUJ5QXN0RWxlbWVudChhc3RFbGVtZW50KSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUNvZGUKKwkgKi8KKwlpbmxpbmUgQkZDb2RlICYgZ2V0Q29kZSgpCisJeworCQlyZXR1cm4oIG1Db2RlICk7CisJfQorCisJaW5saW5lIGNvbnN0IEJGQ29kZSAmIGdldENvZGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQ29kZSApOworCX0KKworCWlubGluZSBib29sIGhhc0NvZGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQ29kZS52YWxpZCgpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0Q29kZShjb25zdCBCRkNvZGUgJiBhUHJvZ3JhbSkKKwl7CisJCW1Db2RlID0gYVByb2dyYW07CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBJT3Bjb2RlRmFtaWx5CisJICovCisJaW5saW5lIHZpcnR1YWwgdm9pZCB1cGRhdGVPcGNvZGVGYW1pbHkoKQorCXsKKwkJSVN0YXRlbWVudEZhbWlseTo6dXBkYXRlU3RhdGVtZW50RmFtaWx5KCBtQ29kZSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSCisJICogYW55IFNZTUJPTCBmaWx0ZXJpbmcgYnkgYW4gb3B0aW9uYWwgdHlwZSBzcGVjaWZpZXIgZmFtaWx5CisJICovCisJdmlydHVhbCBjb25zdCBCRiAmIGdldFN5bWJvbCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlELAorCQkJYXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCB0eXBlRmFtaWx5KSBjb25zdDsKKworCXZpcnR1YWwgY29uc3QgQkYgJiBnZXRTeW1ib2xCeVF1YWxpZmllZE5hbWVJRCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCwKKwkJCWF2bV90eXBlX3NwZWNpZmllcl9raW5kX3QgdHlwZUZhbWlseSkgY29uc3Q7CisKKwl2aXJ0dWFsIGNvbnN0IEJGICYgZ2V0U3ltYm9sQnlOYW1lSUQoY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELAorCQkJYXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCB0eXBlRmFtaWx5KSBjb25zdDsKKworCisJdmlydHVhbCBjb25zdCBCRiAmIGdldHltYm9sQnlBc3RFbGVtZW50KGNvbnN0IE9iamVjdEVsZW1lbnQgKiBhc3RFbGVtZW50LAorCQkJYXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCB0eXBlRmFtaWx5KSBjb25zdDsKKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUNvbW11bmljYXRpb25Db2RlCisJICovCisJaW5saW5lIEJGICYgZ2V0Q29tbXVuaWNhdGlvbkNvZGUoKQorCXsKKwkJcmV0dXJuKCBtQ29tbXVuaWNhdGlvbkNvZGUgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQkYgJiBnZXRDb21tdW5pY2F0aW9uQ29kZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Db21tdW5pY2F0aW9uQ29kZSApOworCX0KKworCWlubGluZSBib29sIGhhc0NvbW11bmljYXRpb25Db2RlKCkgY29uc3QKKwl7CisJCXJldHVybiggbUNvbW11bmljYXRpb25Db2RlLnZhbGlkKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRDb21tdW5pY2F0aW9uQ29kZShjb25zdCBCRiAmIGNvbUNvZGUpCisJeworCQltQ29tbXVuaWNhdGlvbkNvZGUgPSBjb21Db2RlOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUludGVybmFsQ29tbXVuaWNhdGlvbkNvZGUKKwkgKi8KKwlpbmxpbmUgQkYgJiBnZXRJbnRlcm5hbENvbW11bmljYXRpb25Db2RlKCkKKwl7CisJCXJldHVybiggbUludGVybmFsQ29tbXVuaWNhdGlvbkNvZGUgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQkYgJiBnZXRJbnRlcm5hbENvbW11bmljYXRpb25Db2RlKCkgY29uc3QKKwl7CisJCXJldHVybiggbUludGVybmFsQ29tbXVuaWNhdGlvbkNvZGUgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNJbnRlcm5hbENvbW11bmljYXRpb25Db2RlKCkgY29uc3QKKwl7CisJCXJldHVybiggbUludGVybmFsQ29tbXVuaWNhdGlvbkNvZGUudmFsaWQoKSApOworCX0KKworCWlubGluZSB2b2lkIHNldEludGVybmFsQ29tbXVuaWNhdGlvbkNvZGUoY29uc3QgQkYgJiBjb21Db2RlKQorCXsKKwkJbUludGVybmFsQ29tbXVuaWNhdGlvbkNvZGUgPSBjb21Db2RlOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUlucHV0Q29tCisJICovCisJaW5saW5lIHZvaWQgYWRkSW5wdXRDb20oSW5zdGFuY2VPZlBvcnQgKiBhUG9ydCkKKwl7CisJCW1JbnB1dENvbS5hZGRfdW5pb24oIGFQb3J0ICk7CisJfQorCisJaW5saW5lIHZvaWQgYWRkSW5wdXRDb20oTGlzdE9mSW5zdGFuY2VPZlBvcnQgJiBpbnB1dEVuYWJsZWRQb3J0KQorCXsKKwkJbUlucHV0Q29tLmFkZF91bmlvbiggaW5wdXRFbmFibGVkUG9ydCApOworCX0KKworCisJaW5saW5lIExpc3RPZkluc3RhbmNlT2ZQb3J0ICYgZ2V0SW5wdXRDb20oKQorCXsKKwkJcmV0dXJuKCBtSW5wdXRDb20gKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgTGlzdE9mSW5zdGFuY2VPZlBvcnQgJiBnZXRJbnB1dENvbSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1JbnB1dENvbSApOworCX0KKworCisJYm9vbCBjb250YWluc0lucHV0Q29tKEluc3RhbmNlT2ZQb3J0ICogYVBvcnQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1JbnB1dENvbS5jb250YWlucyhhUG9ydCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNJbnB1dENvbSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1JbnB1dENvbS5ub25lbXB0eSgpICk7CisJfQorCisKKwlpbmxpbmUgdm9pZCBzZXRJbnB1dENvbShMaXN0T2ZJbnN0YW5jZU9mUG9ydCAmIGlucHV0RW5hYmxlZFBvcnQpCisJeworCQltSW5wdXRDb20uY2xlYXIoKTsKKworCQltSW5wdXRDb20uYWRkX3VuaW9uKCBpbnB1dEVuYWJsZWRQb3J0ICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtT3V0cHV0Q29tCisJICovCisJaW5saW5lIHZvaWQgYWRkT3V0cHV0Q29tKEluc3RhbmNlT2ZQb3J0ICogYVBvcnQpCisJeworCQltT3V0cHV0Q29tLmFkZF91bmlvbiggYVBvcnQgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBhZGRPdXRwdXRDb20oTGlzdE9mSW5zdGFuY2VPZlBvcnQgJiBpbnB1dEVuYWJsZWRQb3J0KQorCXsKKwkJbU91dHB1dENvbS5hZGRfdW5pb24oIGlucHV0RW5hYmxlZFBvcnQgKTsKKwl9CisKKworCWlubGluZSBMaXN0T2ZJbnN0YW5jZU9mUG9ydCAmIGdldE91dHB1dENvbSgpCisJeworCQlyZXR1cm4oIG1PdXRwdXRDb20gKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgTGlzdE9mSW5zdGFuY2VPZlBvcnQgJiBnZXRPdXRwdXRDb20oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtT3V0cHV0Q29tICk7CisJfQorCisKKwlib29sIGNvbnRhaW5zT3V0cHV0Q29tKEluc3RhbmNlT2ZQb3J0ICogYVBvcnQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1PdXRwdXRDb20uY29udGFpbnMoYVBvcnQpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzT3V0cHV0Q29tKCkgY29uc3QKKwl7CisJCXJldHVybiggbU91dHB1dENvbS5ub25lbXB0eSgpICk7CisJfQorCisKKwlpbmxpbmUgdm9pZCBzZXRPdXRwdXRDb20oTGlzdE9mSW5zdGFuY2VPZlBvcnQgJiBpbnB1dEVuYWJsZWRQb3J0KQorCXsKKwkJbU91dHB1dENvbS5jbGVhcigpOworCisJCW1PdXRwdXRDb20uYWRkX3VuaW9uKCBpbnB1dEVuYWJsZWRQb3J0ICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtSW5wdXRFbmFibGVkQnVmZmVyCisJICovCisJaW5saW5lIHZvaWQgYWRkSW5wdXRFbmFibGVkQnVmZmVyKEluc3RhbmNlT2ZCdWZmZXIgKiBhQnVmZmVyKQorCXsKKwkJbUlucHV0RW5hYmxlZEJ1ZmZlci5hZGRfdW5pb24oIGFCdWZmZXIgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBhZGRJbnB1dEVuYWJsZWRCdWZmZXIoTGlzdE9mSW5zdGFuY2VPZkJ1ZmZlciAmIGlucHV0RW5hYmxlZEJ1ZmZlcikKKwl7CisJCW1JbnB1dEVuYWJsZWRCdWZmZXIuYWRkX3VuaW9uKCBpbnB1dEVuYWJsZWRCdWZmZXIgKTsKKwl9CisKKworCWlubGluZSBMaXN0T2ZJbnN0YW5jZU9mQnVmZmVyICYgZ2V0SW5wdXRFbmFibGVkQnVmZmVyKCkKKwl7CisJCXJldHVybiggbUlucHV0RW5hYmxlZEJ1ZmZlciApOworCX0KKworCWlubGluZSBjb25zdCBMaXN0T2ZJbnN0YW5jZU9mQnVmZmVyICYgZ2V0SW5wdXRFbmFibGVkQnVmZmVyKCkgY29uc3QKKwl7CisJCXJldHVybiggbUlucHV0RW5hYmxlZEJ1ZmZlciApOworCX0KKworCisJYm9vbCBjb250YWluc0lucHV0RW5hYmxlZEJ1ZmZlcihJbnN0YW5jZU9mQnVmZmVyICogYUJ1ZmZlcikgY29uc3QKKwl7CisJCXJldHVybiggbUlucHV0RW5hYmxlZEJ1ZmZlci5jb250YWlucyhhQnVmZmVyKSApOworCX0KKworCWlubGluZSBib29sIGhhc0lucHV0RW5hYmxlZEJ1ZmZlcigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1JbnB1dEVuYWJsZWRCdWZmZXIubm9uZW1wdHkoKSApOworCX0KKworCisJaW5saW5lIHZvaWQgc2V0SW5wdXRFbmFibGVkQnVmZmVyKExpc3RPZkluc3RhbmNlT2ZCdWZmZXIgJiBpbnB1dEVuYWJsZWRCdWZmZXIpCisJeworCQltSW5wdXRFbmFibGVkQnVmZmVyLmNsZWFyKCk7CisKKwkJbUlucHV0RW5hYmxlZEJ1ZmZlci5hZGRfdW5pb24oIGlucHV0RW5hYmxlZEJ1ZmZlciApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUlucHV0RW5hYmxlZENvbQorCSAqLworCWlubGluZSB2b2lkIGFkZElucHV0RW5hYmxlZENvbShJbnN0YW5jZU9mUG9ydCAqIGFQb3J0KQorCXsKKwkJbUlucHV0RW5hYmxlZENvbS5hZGRfdW5pb24oIGFQb3J0ICk7CisJfQorCisJaW5saW5lIHZvaWQgYWRkSW5wdXRFbmFibGVkQ29tKExpc3RPZkluc3RhbmNlT2ZQb3J0ICYgaW5wdXRFbmFibGVkUG9ydCkKKwl7CisJCW1JbnB1dEVuYWJsZWRDb20uYWRkX3VuaW9uKCBpbnB1dEVuYWJsZWRQb3J0ICk7CisJfQorCisKKwlpbmxpbmUgTGlzdE9mSW5zdGFuY2VPZlBvcnQgJiBnZXRJbnB1dEVuYWJsZWRDb20oKQorCXsKKwkJcmV0dXJuKCBtSW5wdXRFbmFibGVkQ29tICk7CisJfQorCisJaW5saW5lIGNvbnN0IExpc3RPZkluc3RhbmNlT2ZQb3J0ICYgZ2V0SW5wdXRFbmFibGVkQ29tKCkgY29uc3QKKwl7CisJCXJldHVybiggbUlucHV0RW5hYmxlZENvbSApOworCX0KKworCisJYm9vbCBjb250YWluc0lucHV0RW5hYmxlZENvbShJbnN0YW5jZU9mUG9ydCAqIGFQb3J0KSBjb25zdAorCXsKKwkJcmV0dXJuKCBtSW5wdXRFbmFibGVkQ29tLmNvbnRhaW5zKGFQb3J0KSApOworCX0KKworCWlubGluZSBib29sIGhhc0lucHV0RW5hYmxlZENvbSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1JbnB1dEVuYWJsZWRDb20ubm9uZW1wdHkoKSApOworCX0KKworCisJaW5saW5lIHZvaWQgc2V0SW5wdXRFbmFibGVkQ29tKExpc3RPZkluc3RhbmNlT2ZQb3J0ICYgaW5wdXRFbmFibGVkUG9ydCkKKwl7CisJCW1JbnB1dEVuYWJsZWRDb20uY2xlYXIoKTsKKworCQltSW5wdXRFbmFibGVkQ29tLmFkZF91bmlvbiggaW5wdXRFbmFibGVkUG9ydCApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUlucHV0RW5hYmxlZFNhdmUKKwkgKi8KKwlpbmxpbmUgdm9pZCBhZGRJbnB1dEVuYWJsZWRTYXZlKEluc3RhbmNlT2ZQb3J0ICogYVBvcnQpCisJeworCQltSW5wdXRFbmFibGVkU2F2ZS5hZGRfdW5pb24oIGFQb3J0ICk7CisJfQorCisJaW5saW5lIHZvaWQgYWRkSW5wdXRFbmFibGVkU2F2ZShMaXN0T2ZJbnN0YW5jZU9mUG9ydCAmIGlucHV0RW5hYmxlZFNhdmVQb3J0KQorCXsKKwkJbUlucHV0RW5hYmxlZFNhdmUuYWRkX3VuaW9uKCBpbnB1dEVuYWJsZWRTYXZlUG9ydCApOworCX0KKworCisJaW5saW5lIExpc3RPZkluc3RhbmNlT2ZQb3J0ICYgZ2V0SW5wdXRFbmFibGVkU2F2ZSgpCisJeworCQlyZXR1cm4oIG1JbnB1dEVuYWJsZWRTYXZlICk7CisJfQorCisJaW5saW5lIGNvbnN0IExpc3RPZkluc3RhbmNlT2ZQb3J0ICYgZ2V0SW5wdXRFbmFibGVkU2F2ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1JbnB1dEVuYWJsZWRTYXZlICk7CisJfQorCisKKwlib29sIGNvbnRhaW5zSW5wdXRFbmFibGVkU2F2ZShJbnN0YW5jZU9mUG9ydCAqIGFQb3J0KSBjb25zdAorCXsKKwkJcmV0dXJuKCBtSW5wdXRFbmFibGVkU2F2ZS5jb250YWlucyhhUG9ydCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNJbnB1dEVuYWJsZWRTYXZlKCkgY29uc3QKKwl7CisJCXJldHVybiggbUlucHV0RW5hYmxlZFNhdmUubm9uZW1wdHkoKSApOworCX0KKworCisJaW5saW5lIHZvaWQgc2V0SW5wdXRFbmFibGVkU2F2ZShMaXN0T2ZJbnN0YW5jZU9mUG9ydCAmIGlucHV0RW5hYmxlZFNhdmVQb3J0KQorCXsKKwkJbUlucHV0RW5hYmxlZFNhdmUuY2xlYXIoKTsKKworCQltSW5wdXRFbmFibGVkU2F2ZS5hZGRfdW5pb24oIGlucHV0RW5hYmxlZFNhdmVQb3J0ICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtTXV0YWJsZUNvbW11bmljYXRpb25GbGFnCisJICogTU9DIEF0dHJpYnV0ZSBmb3IgbXV0YWJsZSBTY2hlZHVsZQorCSAqLworCWJvb2wgaXNNdXRhYmxlQ29tbXVuaWNhdGlvbigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1NdXRhYmxlQ29tbXVuaWNhdGlvbkZsYWcgKTsKKwl9CisKKwl2b2lkIHNldE11dGFibGVDb21tdW5pY2F0aW9uKGJvb2wgaXNNdXRhYmxlQ29tbXVuaWNhdGlvbiA9IHRydWUpCisJeworCQltTXV0YWJsZUNvbW11bmljYXRpb25GbGFnID0gaXNNdXRhYmxlQ29tbXVuaWNhdGlvbjsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1FbnZpcm9ubWVudENvbQorCSAqLworCWlubGluZSBCRiAmIGdldEVudmlyb25tZW50Q29tKCkKKwl7CisJCXJldHVybiggbUVudmlyb25tZW50Q29tICk7CisJfQorCisJaW5saW5lIGNvbnN0IEJGICYgZ2V0RW52aXJvbm1lbnRDb20oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRW52aXJvbm1lbnRDb20gKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNFbnZpcm9ubWVudENvbSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1FbnZpcm9ubWVudENvbS52YWxpZCgpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0RW52aXJvbm1lbnRDb20oY29uc3QgQkYgJiBjb21Db2RlKQorCXsKKwkJbUVudmlyb25tZW50Q29tID0gY29tQ29kZTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1FbnZpcm9ubWVudElucHV0Q29tCisJICovCisJaW5saW5lIEJGICYgZ2V0RW52aXJvbm1lbnRJbnB1dENvbSgpCisJeworCQlyZXR1cm4oIG1FbnZpcm9ubWVudElucHV0Q29tICk7CisJfQorCisJaW5saW5lIGNvbnN0IEJGICYgZ2V0RW52aXJvbm1lbnRJbnB1dENvbSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1FbnZpcm9ubWVudElucHV0Q29tICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzRW52aXJvbm1lbnRJbnB1dENvbSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1FbnZpcm9ubWVudElucHV0Q29tLnZhbGlkKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRFbnZpcm9ubWVudElucHV0Q29tKGNvbnN0IEJGICYgY29tQ29kZSkKKwl7CisJCW1FbnZpcm9ubWVudElucHV0Q29tID0gY29tQ29kZTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1FbnZpcm9ubWVudE91dHB1dENvbQorCSAqLworCWlubGluZSBCRiAmIGdldEVudmlyb25tZW50T3V0cHV0Q29tKCkKKwl7CisJCXJldHVybiggbUVudmlyb25tZW50T3V0cHV0Q29tICk7CisJfQorCisJaW5saW5lIGNvbnN0IEJGICYgZ2V0RW52aXJvbm1lbnRPdXRwdXRDb20oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRW52aXJvbm1lbnRPdXRwdXRDb20gKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNFbnZpcm9ubWVudE91dHB1dENvbSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1FbnZpcm9ubWVudE91dHB1dENvbS52YWxpZCgpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0RW52aXJvbm1lbnRPdXRwdXRDb20oY29uc3QgQkYgJiBjb21Db2RlKQorCXsKKwkJbUVudmlyb25tZW50T3V0cHV0Q29tID0gY29tQ29kZTsKKwl9CisKKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwl2aXJ0dWFsIHZvaWQgc3RySGVhZGVyKE91dFN0cmVhbSAmIG91dCkgY29uc3Q7CisKKwl2b2lkIHRvU3RyZWFtRGF0YShPdXRTdHJlYW0gJiBvdXQpIGNvbnN0OworCisJdm9pZCB0b1N0cmVhbVN0YXRpY0NvbShPdXRTdHJlYW0gJiBvdXQpIGNvbnN0OworCisJdmlydHVhbCB2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG91dCkgY29uc3Q7CisKK307CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBdm1Qcm9ncmFtCisvLyBUWVBFIERFRklOSVRJT04gZm9yIFRBQkxFICwgU01BUlQgUE9JTlRFUiBhbmQgQ09OVEFJTkVSCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY2xhc3MgVGFibGVPZkF2bVByb2dyYW0gOgorCQlwdWJsaWMgVGFibGVPZkJGX1Q8IEF2bVByb2dyYW0gPiwKKwkJQVZNX0lOSkVDVF9JTlNUQU5DRV9DT1VOVEVSX0NMQVNTKCBUYWJsZU9mQXZtUHJvZ3JhbSApCit7CisKKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggVGFibGVPZkF2bVByb2dyYW0gKQorCisKKy8qKgorICogVFlQRURFRgorICovCit0eXBlZGVmICBUYWJsZU9mQkZfVDwgQXZtUHJvZ3JhbSA+ICBCYXNlVGFibGVPZkF2bVByb2dyYW07CisKKworcHVibGljOgorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJVGFibGVPZkF2bVByb2dyYW0oKQorCTogQmFzZVRhYmxlT2ZBdm1Qcm9ncmFtKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCVRhYmxlT2ZBdm1Qcm9ncmFtKGNvbnN0IFRhYmxlT2ZBdm1Qcm9ncmFtICYgYVRhYmxlKQorCTogQmFzZVRhYmxlT2ZBdm1Qcm9ncmFtKCBhVGFibGUgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+VGFibGVPZkF2bVByb2dyYW0oKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBGb3IgSW5zdGFuY2UKKwkgKi8KKwlpbmxpbmUgY29uc3QgQkYgJiBnZXRCeVF1YWxpZmllZE5hbWVJRCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCwKKwkJCU5hbWVkRWxlbWVudDo6b3BfY29tcGFyZXJfdCBvcCwKKwkJCVNwZWNpZmllcjo6U0NPUEVfS0lORCBhU2NvcGUpIGNvbnN0CisJeworCQlCYXNlVGFibGVPZkF2bVByb2dyYW06OmNvbnN0X3Jhd19pdGVyYXRvciBpdFByb2cgPSBiZWdpbigpOworCQlCYXNlVGFibGVPZkF2bVByb2dyYW06OmNvbnN0X3Jhd19pdGVyYXRvciBlbmRQcm9nID0gZW5kKCk7CisJCWZvciggOyBpdFByb2cgIT0gZW5kUHJvZyA7ICsraXRQcm9nICkKKwkJeworCQkJaWYoIGl0UHJvZy0+aXNTY29wZShhU2NvcGUpCisJCQkJJiYgc3RhdGljX2Nhc3Q8IEF2bVByb2dyYW0gKj4oCisJCQkJCQlpdFByb2cgKS0+Y29tcGFyZUlEKGFRdWFsaWZpZWROYW1lSUQsIG9wKSApCisJCQl7CisJCQkJcmV0dXJuKCAqaXRQcm9nICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCX0KKworCWlubGluZSBBdm1Qcm9ncmFtICogcmF3QnlRdWFsaWZpZWROYW1lSUQoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQsCisJCQlOYW1lZEVsZW1lbnQ6Om9wX2NvbXBhcmVyX3Qgb3AsCisJCQlTcGVjaWZpZXI6OlNDT1BFX0tJTkQgYVNjb3BlKSBjb25zdAorCXsKKwkJQmFzZVRhYmxlT2ZBdm1Qcm9ncmFtOjpjb25zdF9yYXdfaXRlcmF0b3IgaXRQcm9nID0gYmVnaW4oKTsKKwkJQmFzZVRhYmxlT2ZBdm1Qcm9ncmFtOjpjb25zdF9yYXdfaXRlcmF0b3IgZW5kUHJvZyA9IGVuZCgpOworCQlmb3IoIDsgaXRQcm9nICE9IGVuZFByb2cgOyArK2l0UHJvZyApCisJCXsKKwkJCWlmKCBpdFByb2ctPmlzU2NvcGUoYVNjb3BlKQorCQkJCSYmIHN0YXRpY19jYXN0PCBBdm1Qcm9ncmFtICo+KAorCQkJCQkJaXRQcm9nICktPmNvbXBhcmVJRChhUXVhbGlmaWVkTmFtZUlELCBvcCkgKQorCQkJeworCQkJCXJldHVybiggaXRQcm9nICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4oIE5VTEwgKTsKKwl9CisKKworCisJaW5saW5lIGNvbnN0IEJGICYgZ2V0QnlGUU5hbWVJRChjb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCwKKwkJU3BlY2lmaWVyOjpTQ09QRV9LSU5EIGFTY29wZSA9IFNwZWNpZmllcjo6U0NPUEVfVU5ERUZJTkVEX0tJTkQpIGNvbnN0CisJeworCQlCYXNlVGFibGVPZkF2bVByb2dyYW06OmNvbnN0X3Jhd19pdGVyYXRvciBpdFByb2cgPSBiZWdpbigpOworCQlCYXNlVGFibGVPZkF2bVByb2dyYW06OmNvbnN0X3Jhd19pdGVyYXRvciBlbmRQcm9nID0gZW5kKCk7CisJCWZvciggOyBpdFByb2cgIT0gZW5kUHJvZyA7ICsraXRQcm9nICkKKwkJeworCQkJLy8gU1RSSUNUOj4gY29tcGFyZSBMT0NBVE9SICYgTE9DQVRJT04gKHRydWU6LSByZXRyeSBvbmx5IExPQ0FUSU9OKQorCQkJaWYoIGl0UHJvZy0+aXNTY29wZShhU2NvcGUpCisJCQkJJiYgaXRQcm9nLT5mcW5FcXVhbHMoIGFGdWxseVF1YWxpZmllZE5hbWVJRCAsIHRydWUgKSApCisJCQl7CisJCQkJcmV0dXJuKCAqaXRQcm9nICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCX0KKworCWlubGluZSBjb25zdCBCRiAmIGdldEJ5UXVhbGlmaWVkTmFtZUlEKAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlELAorCQkJU3BlY2lmaWVyOjpTQ09QRV9LSU5EIGFTY29wZSA9CisJCQkJCVNwZWNpZmllcjo6U0NPUEVfVU5ERUZJTkVEX0tJTkQpIGNvbnN0CisJeworCQlCYXNlVGFibGVPZkF2bVByb2dyYW06OmNvbnN0X3Jhd19pdGVyYXRvciBpdFByb2cgPSBiZWdpbigpOworCQlCYXNlVGFibGVPZkF2bVByb2dyYW06OmNvbnN0X3Jhd19pdGVyYXRvciBlbmRQcm9nID0gZW5kKCk7CisJCWZvciggOyBpdFByb2cgIT0gZW5kUHJvZyA7ICsraXRQcm9nICkKKwkJeworCQkJaWYoIGl0UHJvZy0+aXNTY29wZShhU2NvcGUpCisJCQkJJiYgaXRQcm9nLT5mcW5FbmRzV2l0aChhUXVhbGlmaWVkTmFtZUlEKSApCisJCQl7CisJCQkJcmV0dXJuKCAqaXRQcm9nICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCX0KKworCisJaW5saW5lIGF2bV9zaXplX3QgZ2V0QnlRdWFsaWZpZWROYW1lSUQoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQsCisJCQlTcGVjaWZpZXI6OlNDT1BFX0tJTkQgYVNjb3BlLCBCRkxpc3QgJiBsaXN0b2ZQcm9ncmFtKSBjb25zdAorCXsKKwkJYXZtX3NpemVfdCBjb3VudCA9IDA7CisKKwkJQmFzZVRhYmxlT2ZBdm1Qcm9ncmFtOjpjb25zdF9yYXdfaXRlcmF0b3IgaXRQcm9nID0gYmVnaW4oKTsKKwkJQmFzZVRhYmxlT2ZBdm1Qcm9ncmFtOjpjb25zdF9yYXdfaXRlcmF0b3IgZW5kUHJvZyA9IGVuZCgpOworCQlmb3IoIDsgaXRQcm9nICE9IGVuZFByb2cgOyArK2l0UHJvZyApCisJCXsKKwkJCWlmKCBpdFByb2ctPmlzU2NvcGUoYVNjb3BlKQorCQkJCSYmIGl0UHJvZy0+ZnFuRW5kc1dpdGgoYVF1YWxpZmllZE5hbWVJRCkgKQorCQkJeworCQkJCWxpc3RvZlByb2dyYW0uYXBwZW5kKCAqaXRQcm9nICk7CisKKwkJCQkrK2NvdW50OworCQkJfQorCQl9CisKKwkJcmV0dXJuKCBjb3VudCApOworCX0KKworCWlubGluZSBjb25zdCBCRiAmIGdldEJ5TmFtZUlEKGNvbnN0IHN0ZDo6c3RyaW5nICYgaWQsCisJCQlTcGVjaWZpZXI6OlNDT1BFX0tJTkQgYVNjb3BlID0KKwkJCQkJU3BlY2lmaWVyOjpTQ09QRV9VTkRFRklORURfS0lORCkgY29uc3QKKwl7CisJCUJhc2VUYWJsZU9mQXZtUHJvZ3JhbTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGl0UHJvZyA9IGJlZ2luKCk7CisJCUJhc2VUYWJsZU9mQXZtUHJvZ3JhbTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGVuZFByb2cgPSBlbmQoKTsKKwkJZm9yKCA7IGl0UHJvZyAhPSBlbmRQcm9nIDsgKytpdFByb2cgKQorCQl7CisJCQlpZiggaXRQcm9nLT5pc1Njb3BlKGFTY29wZSkgJiYgKGl0UHJvZy0+Z2V0TmFtZUlEKCkgPT0gaWQpICkKKwkJCXsKKwkJCQlyZXR1cm4oICppdFByb2cgKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiggQkY6OlJFRl9OVUxMICk7CisJfQorCisKKwlpbmxpbmUgY29uc3QgQkYgJiBnZXRCeUFzdEVsZW1lbnQoY29uc3QgT2JqZWN0RWxlbWVudCAqIGFzdEVsZW1lbnQpIGNvbnN0CisJeworCQlCYXNlVGFibGVPZkF2bVByb2dyYW06OmNvbnN0X3Jhd19pdGVyYXRvciBpdCA9IGJlZ2luKCk7CisJCUJhc2VUYWJsZU9mQXZtUHJvZ3JhbTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGVuZEl0ID0gZW5kKCk7CisJCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCQl7CisJCQlpZiggKGl0KS0+aXNBc3RFbGVtZW50KCBhc3RFbGVtZW50ICkgKQorCQkJeworCQkJCXJldHVybiggKml0ICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCX0KKworCisJLyoqCisJICogU2VyaWFsaXphdGlvbgorCSAqLworCWlubGluZSB2aXJ0dWFsIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQlCYXNlVGFibGVPZkF2bVByb2dyYW06OmNvbnN0X3Jhd19pdGVyYXRvciBpdFByb2cgPSBiZWdpbigpOworCQlCYXNlVGFibGVPZkF2bVByb2dyYW06OmNvbnN0X3Jhd19pdGVyYXRvciBlbmRQcm9nID0gZW5kKCk7CisJCWZvciggOyBpdFByb2cgIT0gZW5kUHJvZyA7ICsraXRQcm9nICkKKwkJeworCQkJaXRQcm9nLT50b1N0cmVhbShvcyk7CisJCQlvcyA8PCBFT0w7CisJCX0KKwl9CisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIGZxblN0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCUJhc2VUYWJsZU9mQXZtUHJvZ3JhbTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGl0UHJvZyA9IGJlZ2luKCk7CisJCUJhc2VUYWJsZU9mQXZtUHJvZ3JhbTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGVuZFByb2cgPSBlbmQoKTsKKwkJZm9yKCA7IGl0UHJvZyAhPSBlbmRQcm9nIDsgKytpdFByb2cgKQorCQl7CisJCQlvcyA8PCBUQUIgPDwgaXRQcm9nLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8ICI7IiA8PCBFT0w7CisJCX0KKwl9CisKK307CisKKworfQorCisjZW5kaWYgLypBVk1QUk9HUkFNX0hfKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leGVjdXRhYmxlL0F2bVRyYW5zaXRpb24uY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4ZWN1dGFibGUvQXZtVHJhbnNpdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFkYzRlZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leGVjdXRhYmxlL0F2bVRyYW5zaXRpb24uY3BwCkBAIC0wLDAgKzEsMjk2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogNSBqYW52LiAyMDE1CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJBdm1UcmFuc2l0aW9uLmgiCisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlRm9ybS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvKioKKyAqIEdFVFRFUiAtIFNFVFRFUgorICogbVRhcmdldCBtYWNoaW5lCisgKi8KK0luc3RhbmNlT2ZNYWNoaW5lICogQXZtVHJhbnNpdGlvbjo6Z2V0VGFyZ2V0TWFyY2hpbmUoKSBjb25zdAoreworCWlmKCBnZXRUYXJnZXQoKS5pczwgSW5zdGFuY2VPZk1hY2hpbmUgPigpICkKKwl7CisJCXJldHVybiggZ2V0VGFyZ2V0KCkudG9fcHRyPCBJbnN0YW5jZU9mTWFjaGluZSA+KCkgKTsKKwl9CisJZWxzZSBpZiggZ2V0VGFyZ2V0KCkuaXM8IFJ1bnRpbWVJRCA+KCkgKQorCXsKKwkJcmV0dXJuKCBnZXRUYXJnZXQoKS5iZlJJRCgpLmdldEluc3RhbmNlKCkgKTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuKCBOVUxMICk7CisJfQorfQorCisKK3N0ZDo6c3RyaW5nIEF2bVRyYW5zaXRpb246OnN0clRhcmdldElkKCkgY29uc3QKK3sKKwlpZiggZ2V0VGFyZ2V0KCkuaXM8IEluc3RhbmNlT2ZNYWNoaW5lID4oKSApCisJeworCQlyZXR1cm4oIGdldFRhcmdldCgpLnRvX3B0cjwgSW5zdGFuY2VPZk1hY2hpbmUgPigpLT5nZXROYW1lSUQoKSApOworCX0KKwllbHNlIGlmKCBnZXRUYXJnZXQoKS5pczwgUnVudGltZUlEID4oKSApCisJeworCQlyZXR1cm4oIGdldFRhcmdldCgpLmJmUklEKCkuc3RyVW5pcUlkKCkgKTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuKCAiWy1dIiApOworCX0KK30KKworCisvKioKKyAqIENvbnRyb2wgZmxvdyBhbmFseXNpcworICogc291cmNlICYgdGFyZ2V0cyBFeGVjdXRhYmxlPG1hY2hpbmU+IGZvciBUcmFuc2l0aW9uCisgKi8KK0V4ZWN1dGFibGVGb3JtICogQXZtVHJhbnNpdGlvbjo6Z2V0VHJhbnNpdGlvblNvdXJjZSgpIGNvbnN0Cit7CisJcmV0dXJuKCBnZXRDb250YWluZXIoKS0+aXM8IEV4ZWN1dGFibGVGb3JtID4oKSA/CisJCQlnZXRDb250YWluZXIoKS0+dG88IEV4ZWN1dGFibGVGb3JtID4oKSA6IE5VTEwgKTsKK30KKworCitJbnN0YW5jZU9mTWFjaGluZSAqIEF2bVRyYW5zaXRpb246OmdldHJlY1RhcmdldE1hY2hpbmUoQXZtQ29kZSAqIGFDb2RlKQoreworCXN3aXRjaCggYUNvZGUtPmdldEF2bU9wQ29kZSgpICkKKwl7CisJCWNhc2UgQVZNX09QQ09ERV9FTkFCTEVfU0VUOgorCQljYXNlIEFWTV9PUENPREVfR09UTzoKKwkJeworCQkJY29uc3QgQkYgJiB0YXJnZXRNYWNoaW5lID0gYUNvZGUtPmZpcnN0KCk7CisKKwkJCWlmKCB0YXJnZXRNYWNoaW5lLmlzPCBJbnN0YW5jZU9mTWFjaGluZSA+KCkgKQorCQkJeworCQkJCXJldHVybiggdGFyZ2V0TWFjaGluZS50b19wdHI8IEluc3RhbmNlT2ZNYWNoaW5lID4oKSApOworCQkJfQorCQkJZWxzZSBpZiggdGFyZ2V0TWFjaGluZS5pczwgUnVudGltZUlEID4oKSApCisJCQl7CisJCQkJcmV0dXJuKCB0YXJnZXRNYWNoaW5lLmJmUklEKCkuZ2V0SW5zdGFuY2UoKSApOworCQkJfQorCisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OgorCQl7CisJCQlJbnN0YW5jZU9mTWFjaGluZSAqIHRhcmdldE1hY2hpbmUgPSBOVUxMOworCisJCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdCA9IGFDb2RlLT5iZWdpbigpOworCQkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBhQ29kZS0+ZW5kKCk7CisJCQlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJCXsKKwkJCQlpZiggKCppdCkuaXM8IEF2bUNvZGUgPigpICkKKwkJCQl7CisJCQkJCXRhcmdldE1hY2hpbmUgPQlnZXRyZWNUYXJnZXRNYWNoaW5lKCAoKml0KS50b19wdHI8IEF2bUNvZGUgPigpICk7CisJCQkJCWlmKCB0YXJnZXRNYWNoaW5lICE9IE5VTEwgKQorCQkJCQl7CisJCQkJCQlyZXR1cm4oIHRhcmdldE1hY2hpbmUgKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuKCBOVUxMICk7Cit9CisKKwordm9pZCBBdm1UcmFuc2l0aW9uOjpnZXRyZWNUYXJnZXRNYWNoaW5lKAorCQlMaXN0T2ZJbnN0YW5jZU9mTWFjaGluZSAmIGxpc3RPZlRhcmdldHMsIEF2bUNvZGUgKiBhQ29kZSkKK3sKKwlzd2l0Y2goIGFDb2RlLT5nZXRBdm1PcENvZGUoKSApCisJeworCQljYXNlIEFWTV9PUENPREVfRU5BQkxFX0lOVk9LRToKKwkJY2FzZSBBVk1fT1BDT0RFX0VOQUJMRV9TRVQ6CisJCWNhc2UgQVZNX09QQ09ERV9HT1RPOgorCQl7CisJCQljb25zdCBCRiAmIHRhcmdldE1hY2hpbmUgPSBhQ29kZS0+Zmlyc3QoKTsKKworCQkJaWYoIHRhcmdldE1hY2hpbmUuaXM8IEluc3RhbmNlT2ZNYWNoaW5lID4oKSApCisJCQl7CisJCQkJbGlzdE9mVGFyZ2V0cy5hZGRfdW5pb24oCisJCQkJCQl0YXJnZXRNYWNoaW5lLnRvX3B0cjwgSW5zdGFuY2VPZk1hY2hpbmUgPigpICk7CisJCQl9CisJCQllbHNlIGlmKCB0YXJnZXRNYWNoaW5lLmlzPCBSdW50aW1lSUQgPigpICkKKwkJCXsKKwkJCQlsaXN0T2ZUYXJnZXRzLmFkZF91bmlvbiggdGFyZ2V0TWFjaGluZS5iZlJJRCgpLmdldEluc3RhbmNlKCkgKTsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKwkJZGVmYXVsdDoKKwkJeworCQkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBhQ29kZS0+YmVnaW4oKTsKKwkJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gYUNvZGUtPmVuZCgpOworCQkJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJCQl7CisJCQkJaWYoICgqaXQpLmlzPCBBdm1Db2RlID4oKSApCisJCQkJeworCQkJCQlnZXRyZWNUYXJnZXRNYWNoaW5lKGxpc3RPZlRhcmdldHMsICgqaXQpLnRvX3B0cjwgQXZtQ29kZSA+KCkpOworCQkJCX0KKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKworLyoqCisgKiBURVNUCisgKiB0aGUgc291cmNlL3RhcmdldCBtYWNoaW5lCisgKi8KK2Jvb2wgQXZtVHJhbnNpdGlvbjo6aXNVbnN0YWJsZVNvdXJjZSgpIGNvbnN0Cit7CisJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggZ2V0VHJhbnNpdGlvblNvdXJjZSgpICkKKwkJCTw8ICJUcmFuc2l0aW9uIFNvdXJjZSAhISEiCisJCQk8PCBTRU5EX0VYSVQ7CisKKwlyZXR1cm4oIGdldFRyYW5zaXRpb25Tb3VyY2UoKS0+Z2V0U3BlY2lmaWVyKCkuaXNQc2V1ZG9zdGF0ZSgpICk7Cit9CisKKworYm9vbCBBdm1UcmFuc2l0aW9uOjppc1Vuc3RhYmxlVGFyZ2V0KCkgY29uc3QKK3sKKwlpZiggZ2V0VGFyZ2V0KCkuaXM8IEluc3RhbmNlT2ZNYWNoaW5lID4oKSApCisJeworCQlyZXR1cm4oIGdldFRhcmdldCgpLnRvX3B0cjwgSW5zdGFuY2VPZk1hY2hpbmUgPigpLT4KKwkJCQlnZXRTcGVjaWZpZXIoKS5pc1BzZXVkb3N0YXRlKCkgKTsKKwl9CisJZWxzZSBpZiggZ2V0VGFyZ2V0KCkuaXM8IFJ1bnRpbWVJRCA+KCkgKQorCXsKKwkJcmV0dXJuKCBnZXRUYXJnZXQoKS5iZlJJRCgpLmdldFNwZWNpZmllcigpLmlzUHNldWRvc3RhdGUoKSApOworCX0KKwllbHNlCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorfQorCisKKy8qKgorICogU2VyaWFsaXphdGlvbgorICovCit2b2lkIEF2bVRyYW5zaXRpb246OnN0ckhlYWRlcihPdXRTdHJlYW0gJiBvdXQpIGNvbnN0Cit7CisJb3V0IDw8IGdldE1vZGlmaWVyKCkudG9TdHJpbmcoKQorCQk8PCBTcGVjaWZpZXI6OnN0clNjb3BlKCBtU2NvcGUgKQorCQk8PCAiPCBpZDoiIDw8IGdldE9mZnNldCgpIDw8ICIgPiAiOworCitBVk1fSUZfREVCVUdfRkxBR19BTkQoIENPTVBJTElORyAsICBoYXNBc3RFbGVtZW50KCkgKQorCW91dCA8PCAiJiIgPDwgZ2V0QXN0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiICI7CitBVk1fRU5ESUZfREVCVUdfRkxBR19BTkQoIENPTVBJTElORyApCisKKwlvdXQgPDwgLyogZ2V0TmFtZUlEKCkgKi8gZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsKK30KKworCit2b2lkIEF2bVRyYW5zaXRpb246OnRvU3RyZWFtKE91dFN0cmVhbSAmIG91dCkgY29uc3QKK3sKKwkvLyBSRUZFUkVOQ0UgUFJPR1JBTQorCWlmKCBvdXQucHJlZmVyYWJseUZRTigpICkKKwl7CisJCW91dCA8PCBUQUIgPDwgZ2V0TmFtZUlEKCk7CisKKwkJQVZNX0RFQlVHX1JFRl9DT1VOVEVSKG91dCk7CisKKwkJcmV0dXJuOworCX0KKworCW91dCA8PCBUQUIgPDwgZ2V0TW9kaWZpZXIoKS50b1N0cmluZygpCisJCTw8IFNwZWNpZmllcjo6c3RyU2NvcGUoIG1TY29wZSApCisJCTw8ICI8IGlkOiIgPDwgZ2V0T2Zmc2V0KCkgPDwgIiA+ICI7CisKK0FWTV9JRl9ERUJVR19GTEFHX0FORCggQ09NUElMSU5HICwgaGFzQXN0RWxlbWVudCgpICkKKwlvdXQgPDwgIiYiIDw8IGdldEFzdEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIiAiOworQVZNX0VORElGX0RFQlVHX0ZMQUdfQU5EKCBDT01QSUxJTkcgKQorCisJb3V0IDw8IGdldE5hbWVJRCgpOworCWlmKCBoYXNUYXJnZXQoKSApCisJeworCQlvdXQgPDwgIiAtLT4gIiA8PCAoIGdldFRhcmdldCgpLmlzPCBPYmplY3RFbGVtZW50ID4oKQorCQkJCT8gZ2V0VGFyZ2V0KCkudG9fcHRyPCBPYmplY3RFbGVtZW50ID4oKS0+Z2V0TmFtZUlEKCkKKwkJCQk6IGdldFRhcmdldCgpLnN0cigpICk7CisJfQorCW91dCA8PCAiIHsiOworCUFWTV9ERUJVR19SRUZfQ09VTlRFUihvdXQpOworCW91dCA8PCBFT0w7CisKK0FWTV9JRl9ERUJVR19GTEFHKCBDT01QSUxJTkcgKQorCWlmKCBoYXNDb250YWluZXIoKSApCisJeworCQlvdXQgPDwgVEFCMiA8PCAiLy9jb250YWluZXIgPSAiCisJCQkJPDwgc3RyX2hlYWRlciggZ2V0Q29udGFpbmVyKCktPmFzPCBBdm1Qcm9ncmFtID4oKSApCisJCQkJPDwgIjsiIDw8IEVPTDsKKwl9CitBVk1fRU5ESUZfREVCVUdfRkxBRyggQ09NUElMSU5HICkKKworLy8Jb3V0IDw8IFRBQjIgPDwgIm9mZnNldCA9ICIgPDwgZ2V0T2Zmc2V0KCkgPDwgIjsiIDw8IEVPTDsKKworCisJLy8gQW55IHByb2dyYW0gZGF0YQorCXRvU3RyZWFtRGF0YShvdXQpOworCisKKwlvdXQgPDwgVEFCIDw8ICJtb2U6IiA8PCBFT0w7CisKKwlpZiggaGFzQ29kZSgpICkKKwl7CisJCW91dCA8PCBUQUIyIDw8ICJAcnVueyIgPDwgSU5DUjJfSU5ERU5UOworCisJCWdldENvZGUoKS0+dG9TdHJlYW1Sb3V0aW5lKCBvdXQgKTsKKworCQlvdXQgPDwgREVDUjJfSU5ERU5UX1RBQjIgPDwgIn0iIDw8IEVPTDsKKwl9CisKKwlpZiggaGFzU3RhdGVtZW50RmFtaWx5KCkgKQorCXsKKwkJb3V0IDw8IFRBQjIgPDwgIm9wY29kZSNmYW1pbHkgPSAiIDw8IHN0clN0YXRlbWVudEZhbWlseSgpIDw8ICI7IiA8PCBFT0w7CisJfQorCisJLy8gc3RhdGljIGNsYXNzIG9mIFBvcnQvTWVzc2FnZS9TaWduYWwgaW4gY29tbXVuaWNhdGVkIHRyYW5zaXRpb24KKwlvdXQgPDwgSU5DUl9JTkRFTlQ7CisJdG9TdHJlYW1TdGF0aWNDb20ob3V0KTsKKwlvdXQgPDwgREVDUl9JTkRFTlQ7CisKKwlvdXQgPDwgVEFCIDw8ICJ9IiA8PCBFT0wgPDwgc3RkOjpmbHVzaDsKK30KKworCit2b2lkIEF2bVRyYW5zaXRpb246OnRvU3RyZWFtKE91dFN0cmVhbSAmIG91dCwKKwkJY29uc3QgTGlzdE9mQXZtVHJhbnNpdGlvbiAmIGxpc3RvZlRyYW5zaXRpb24pCit7CisJTGlzdE9mQXZtVHJhbnNpdGlvbjo6Y29uc3RfaXRlcmF0b3IgaXRUcmFuc2l0aW9uID0gbGlzdG9mVHJhbnNpdGlvbi5iZWdpbigpOworCUxpc3RPZkF2bVRyYW5zaXRpb246OmNvbnN0X2l0ZXJhdG9yIGVuZFRyYW5zaXRpb24gPSBsaXN0b2ZUcmFuc2l0aW9uLmVuZCgpOworCWZvciggOyBpdFRyYW5zaXRpb24gIT0gZW5kVHJhbnNpdGlvbiA7ICsraXRUcmFuc2l0aW9uICkKKwl7CisJCW91dCA8PCBUQUI7CisJCSgqaXRUcmFuc2l0aW9uKS0+dG9TdHJlYW1IZWFkZXIoIG91dCApOworCQlvdXQgPDwgIjsiIDw8IEVPTDsKKwl9Cit9CisKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leGVjdXRhYmxlL0F2bVRyYW5zaXRpb24uaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leGVjdXRhYmxlL0F2bVRyYW5zaXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTdhNTJiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4ZWN1dGFibGUvQXZtVHJhbnNpdGlvbi5oCkBAIC0wLDAgKzEsMjEwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogNSBqYW52LiAyMDE1CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQVZNVFJBTlNJVElPTl9IXworI2RlZmluZSBBVk1UUkFOU0lUSU9OX0hfCisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9Bdm1Qcm9ncmFtLmg+CisKKyNpbmNsdWRlIDxjb2xsZWN0aW9uL1R5cGVkZWYuaD4KKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZNYWNoaW5lLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9Bdm1Db2RlLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBBdm1UcmFuc2l0aW9uOworCitjbGFzcyBFeGVjdXRhYmxlRm9ybTsKKworY2xhc3MgT2JqZWN0RWxlbWVudDsKKworCitjbGFzcyBBdm1UcmFuc2l0aW9uIDoKKwkJcHVibGljIEF2bVByb2dyYW0gLAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIEF2bVRyYW5zaXRpb24gKQoreworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIEF2bVRyYW5zaXRpb24gKQorCitwcm90ZWN0ZWQ6CisJLyoKKwkgKiBBVFRSSUJVVEVTCisJICovCisJLy8gVHJhbnNpdGlvbiBUYXJnZXQgbWFjaGluZQorCUJGIG1UYXJnZXQ7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUF2bVRyYW5zaXRpb24oQXZtUHJvZ3JhbSAqIGFDb250YWluZXIsCisJCQlPYmplY3RFbGVtZW50ICogYUNvbXBpbGVkLCBhdm1fc2l6ZV90IGFTaXplKQorCTogQXZtUHJvZ3JhbShDTEFTU19LSU5EX1QoIEF2bVRyYW5zaXRpb24gKSwKKwkJCVNwZWNpZmllcjo6U0NPUEVfVFJBTlNJVElPTl9LSU5ELCBhQ29udGFpbmVyLCBhQ29tcGlsZWQsIGFTaXplKSwKKwltVGFyZ2V0KCApCisJeworCQl1cGRhdGVGdWxseVF1YWxpZmllZE5hbWVJRCgpOworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5Bdm1UcmFuc2l0aW9uKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogR0VUVEVSCisJICogdGhlQ29tcGlsZWRGb3JtCisJICovCisJaW5saW5lIGNvbnN0IFRyYW5zaXRpb24gKiBnZXRBc3RUcmFuc2l0aW9uKCkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0QXN0RWxlbWVudCgpLT5hczwgVHJhbnNpdGlvbiA+KCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc0FzdFRyYW5zaXRpb24oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRBc3RFbGVtZW50KCktPmlzPCBUcmFuc2l0aW9uID4oKSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVRhcmdldCBtYWNoaW5lCisJICovCisJaW5saW5lIEJGICYgZ2V0VGFyZ2V0KCkKKwl7CisJCXJldHVybiggbVRhcmdldCApOworCX0KKworCWlubGluZSBjb25zdCBCRiAmIGdldFRhcmdldCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYXJnZXQgKTsKKwl9CisKKwlJbnN0YW5jZU9mTWFjaGluZSAqIGdldFRhcmdldE1hcmNoaW5lKCkgY29uc3Q7CisKKwlpbmxpbmUgYm9vbCBoYXNUYXJnZXQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVGFyZ2V0LnZhbGlkKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRUYXJnZXQoY29uc3QgQkYgJiBhVGFyZ2V0KQorCXsKKwkJbVRhcmdldCA9IGFUYXJnZXQ7CisJfQorCisKKwlzdGQ6OnN0cmluZyBzdHJUYXJnZXRJZCgpIGNvbnN0OworCisKKwkvKioKKwkgKiBDb250cm9sIGZsb3cgYW5hbHlzaXMKKwkgKiBzb3VyY2UgJiB0YXJnZXRzIEV4ZWN1dGFibGU8bWFjaGluZT4gZm9yIFByb2dyYW08dHJhbnNpdGlvbj4KKwkgKi8KKwlFeGVjdXRhYmxlRm9ybSAqIGdldFRyYW5zaXRpb25Tb3VyY2UoKSBjb25zdDsKKworCisJc3RhdGljIEluc3RhbmNlT2ZNYWNoaW5lICogZ2V0cmVjVGFyZ2V0TWFjaGluZShBdm1Db2RlICogYUNvZGUpOworCisJaW5saW5lIEluc3RhbmNlT2ZNYWNoaW5lICogZ2V0VHJhbnNpdGlvblRhcmdldCgpIGNvbnN0CisJeworCQlpZiggaGFzVGFyZ2V0KCkgKQorCQl7CisJCQlyZXR1cm4oIGdldFRhcmdldE1hcmNoaW5lKCkgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybiggaGFzQ29kZSgpID8gZ2V0cmVjVGFyZ2V0TWFjaGluZSggZ2V0Q29kZSgpICkgOiBOVUxMICk7CisJCX0KKwl9CisKKworCXN0YXRpYyB2b2lkIGdldHJlY1RhcmdldE1hY2hpbmUoCisJCQlMaXN0T2ZJbnN0YW5jZU9mTWFjaGluZSAmIGxpc3RPZlRhcmdldHMsIEF2bUNvZGUgKiBhQ29kZSk7CisKKwlpbmxpbmUgdm9pZCBnZXRUcmFuc2l0aW9uVGFyZ2V0KExpc3RPZkluc3RhbmNlT2ZNYWNoaW5lICYgbGlzdE9mVGFyZ2V0cykgY29uc3QKKwl7CisJCWlmKCBoYXNDb2RlKCkgKQorCQl7CisJCQlBdm1UcmFuc2l0aW9uOjpnZXRyZWNUYXJnZXRNYWNoaW5lKGxpc3RPZlRhcmdldHMsIGdldENvZGUoKSk7CisJCX0KKwl9CisKKworCS8qKgorCSAqIFRFU1QKKwkgKiB0aGUgc291cmNlL3RhcmdldCBtYWNoaW5lCisJICovCisJYm9vbCBpc1Vuc3RhYmxlU291cmNlKCkgY29uc3Q7CisJYm9vbCBpc1Vuc3RhYmxlVGFyZ2V0KCkgY29uc3Q7CisKKwlib29sIGlzVW5zdGFibGVTb3VyY2VPclRhcmdldCgpIGNvbnN0OworCisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJdmlydHVhbCB2b2lkIHN0ckhlYWRlcihPdXRTdHJlYW0gJiBvdXQpIGNvbnN0OworCisJaW5saW5lIHN0ZDo6c3RyaW5nIHN0clRyYW5zaXRpb25IZWFkZXIoKSBjb25zdAorCXsKKwkJU3RyaW5nT3V0U3RyZWFtIG9zczsKKworCQl0b1N0cmVhbUhlYWRlciggb3NzICk7CisKKwkJcmV0dXJuKCBvc3Muc3RyKCkgKTsKKwl9CisKKwl2b2lkIHRvU3RyZWFtSGVhZGVyKE91dFN0cmVhbSAmIG91dCkgY29uc3QKKwl7CisJCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggaXNBc3RUcmFuc2l0aW9uKCkgKQorCQkJCTw8ICJVbmV4cGVjdGVkIGEgbm9uIFRyYW5zaXRpb24gcHJvZ3JhbSBzY29wZSAhISEiCisJCQkJPDwgU0VORF9FWElUOworCisJCWdldEFzdFRyYW5zaXRpb24oKS0+dG9TdHJlYW1IZWFkZXIob3V0KTsKKwl9CisKKworCXZpcnR1YWwgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvdXQpIGNvbnN0OworCisJc3RhdGljIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3V0LAorCQkJY29uc3QgTGlzdE9mQXZtVHJhbnNpdGlvbiAmIGxpc3RvZlRyYW5zaXRpb24pOworCit9OworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQXZtVHJhbnNpdGlvbgorLy8gVFlQRSBERUZJTklUSU9OIGZvciBUQUJMRSAsIFNNQVJUIFBPSU5URVIgYW5kIENPTlRBSU5FUgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3R5cGVkZWYgIFRhYmxlT2ZCRl9UPCBBdm1UcmFuc2l0aW9uID4gIFRhYmxlT2ZUcmFuc2l0aW9uOworCisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKiBBVk1UUkFOU0lUSU9OX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhlY3V0YWJsZS9CYXNlQXZtUHJvZ3JhbS5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhlY3V0YWJsZS9CYXNlQXZtUHJvZ3JhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEyZTk2NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leGVjdXRhYmxlL0Jhc2VBdm1Qcm9ncmFtLmNwcApAQCAtMCwwICsxLDM2NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDggb2N0LiAyMDA4CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJCYXNlQXZtUHJvZ3JhbS5oIgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvQXZtUHJvZ3JhbS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVGb3JtLmg+CisKKyNpbmNsdWRlIDxmbWwvdHlwZS9CYXNlU3ltYm9sVHlwZVNwZWNpZmllci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvKioKKyAqIEdFVFRFUgorICogYW55IFNZTUJPTCBmaWx0ZXJpbmcgYnkgYW4gb3B0aW9uYWwgdHlwZSBzcGVjaWZpZXIgZmFtaWx5CisgKi8KK2NvbnN0IEJGICYgQmFzZUF2bVByb2dyYW06OmdldFN5bWJvbCgKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQsCisJCWF2bV90eXBlX3NwZWNpZmllcl9raW5kX3QgdHlwZUZhbWlseSkgY29uc3QKK3sKKwljb25zdCBCRiAmIGZvdW5kU3ltYm9sID0KKwkJCWdldEFsbERhdGEoKS5nZXRCeUZRTmFtZUlEKCBhRnVsbHlRdWFsaWZpZWROYW1lSUQgKTsKKworCWlmKCBmb3VuZFN5bWJvbC52YWxpZCgpICkKKwl7CisJCXJldHVybiggZm91bmRTeW1ib2wgKTsKKwl9CisKKwlyZXR1cm4oIGdldERhdGFBbGlhcygpLmdldEJ5RlFOYW1lSUQoIGFGdWxseVF1YWxpZmllZE5hbWVJRCApICk7Cit9CisKKworY29uc3QgQkYgJiBCYXNlQXZtUHJvZ3JhbTo6Z2V0U3ltYm9sQnlRdWFsaWZpZWROYW1lSUQoCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCwKKwkJYXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCB0eXBlRmFtaWx5KSBjb25zdAoreworCWNvbnN0IEJGICYgZm91bmRTeW1ib2wgPQorCQkJZ2V0QWxsRGF0YSgpLmdldEJ5UXVhbGlmaWVkTmFtZUlEKCBhUXVhbGlmaWVkTmFtZUlEICk7CisKKwlpZiggZm91bmRTeW1ib2wudmFsaWQoKSApCisJeworCQlyZXR1cm4oIGZvdW5kU3ltYm9sICk7CisJfQorCisJcmV0dXJuKCBnZXREYXRhQWxpYXMoKS5nZXRCeVF1YWxpZmllZE5hbWVJRCggYVF1YWxpZmllZE5hbWVJRCApICk7Cit9CisKKworY29uc3QgQkYgJiBCYXNlQXZtUHJvZ3JhbTo6Z2V0U3ltYm9sQnlOYW1lSUQoCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwgYXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCB0eXBlRmFtaWx5KSBjb25zdAoreworCWNvbnN0IEJGICYgZm91bmRTeW1ib2wgPSBnZXRBbGxEYXRhKCkuZ2V0QnlOYW1lSUQoIGFOYW1lSUQgKTsKKworCWlmKCBmb3VuZFN5bWJvbC52YWxpZCgpICkKKwl7CisJCXJldHVybiggZm91bmRTeW1ib2wgKTsKKwl9CisKKwlyZXR1cm4oIGdldERhdGFBbGlhcygpLmdldEJ5TmFtZUlEKGFOYW1lSUQpICk7Cit9CisKKworY29uc3QgQkYgJiBCYXNlQXZtUHJvZ3JhbTo6Z2V0U3ltYm9sQnlBc3RFbGVtZW50KAorCQljb25zdCBPYmplY3RFbGVtZW50ICogYXN0RWxlbWVudCwKKwkJYXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCB0eXBlRmFtaWx5KSBjb25zdAoreworCWNvbnN0IEJGICYgZm91bmRTeW1ib2wgPSBnZXRBbGxEYXRhKCkuZ2V0QnlBc3RFbGVtZW50KCBhc3RFbGVtZW50ICk7CisKKwlpZiggZm91bmRTeW1ib2wudmFsaWQoKSApCisJeworCQlyZXR1cm4oIGZvdW5kU3ltYm9sICk7CisJfQorCisJcmV0dXJuKCBnZXREYXRhQWxpYXMoKS5nZXRCeUFzdEVsZW1lbnQoIGFzdEVsZW1lbnQgKSApOworfQorCisKKy8qKgorICogR0VUVEVSCisgKiBGb3IgQXZtUHJvZ3JhbSAtIEV4ZWN1dGFibGVGb3JtIENvbnRhaW5lcgorICovCitjb25zdCBBdm1Qcm9ncmFtICogQmFzZUF2bVByb2dyYW06OmdldEF2bVByb2dyYW1Db250YWluZXIoKSBjb25zdAoreworCUJhc2VBdm1Qcm9ncmFtICogYUNvbnRhaW5lciA9IGdldENvbnRhaW5lcigpOworCisJd2hpbGUoIChhQ29udGFpbmVyICE9IE5VTEwpICYmIChub3QgYUNvbnRhaW5lci0+aXM8IEF2bVByb2dyYW0gPigpKSApCisJeworCQlhQ29udGFpbmVyID0gYUNvbnRhaW5lci0+Z2V0Q29udGFpbmVyKCk7CisJfQorCisJcmV0dXJuKCBzdGF0aWNfY2FzdDwgY29uc3QgQXZtUHJvZ3JhbSAqID4oIGFDb250YWluZXIgKSApOworfQorCitjb25zdCBBdm1Qcm9ncmFtICogQmFzZUF2bVByb2dyYW06OmdldEF2bVByb2dyYW0oKSBjb25zdAoreworCWlmKCB0aGlzLT5pczwgQXZtUHJvZ3JhbSA+KCkgKQorCXsKKwkJcmV0dXJuKCBzdGF0aWNfY2FzdDwgY29uc3QgQXZtUHJvZ3JhbSAqID4oIHRoaXMgKSApOworCX0KKworCXJldHVybiggZ2V0QXZtUHJvZ3JhbUNvbnRhaW5lcigpICk7Cit9CisKKworCitFeGVjdXRhYmxlRm9ybSAqIEJhc2VBdm1Qcm9ncmFtOjpnZXRFeGVjdXRhYmxlQ29udGFpbmVyKCkgY29uc3QKK3sKKwlCYXNlQXZtUHJvZ3JhbSAqIGFDb250YWluZXIgPSBnZXRDb250YWluZXIoKTsKKworCXdoaWxlKCAoYUNvbnRhaW5lciAhPSBOVUxMKSAmJiBhQ29udGFpbmVyLT5pc25vdDwgRXhlY3V0YWJsZUZvcm0gPigpICkKKwl7CisJCWFDb250YWluZXIgPSBhQ29udGFpbmVyLT5nZXRDb250YWluZXIoKTsKKwl9CisKKwlyZXR1cm4oIHN0YXRpY19jYXN0PCBFeGVjdXRhYmxlRm9ybSAqID4oIGFDb250YWluZXIgKSApOworfQorCitFeGVjdXRhYmxlRm9ybSAqIEJhc2VBdm1Qcm9ncmFtOjpnZXRFeGVjdXRhYmxlKCkgY29uc3QKK3sKKwlpZiggdGhpcy0+aXM8IEV4ZWN1dGFibGVGb3JtID4oKSApCisJeworCQlyZXR1cm4oIHN0YXRpY19jYXN0PCBFeGVjdXRhYmxlRm9ybSAqID4oCisJCQkJY29uc3RfY2FzdDwgQmFzZUF2bVByb2dyYW0gKiA+KHRoaXMpICkgKTsKKwl9CisKKwlyZXR1cm4oIGdldEV4ZWN1dGFibGVDb250YWluZXIoKSApOworfQorCisKKy8qKgorICogVVBEQVRFIERBVEEgVEFCTEUKKyAqIG1CYXNpY0RhdGEKKyAqIG1hbGxEYXRhCisgKi8KKwordm9pZCBCYXNlQXZtUHJvZ3JhbTo6dXBkYXRlRGF0YVRhYmxlKCkKK3sKKwlpZiggZ2V0RGF0YSgpLmVtcHR5KCkgKQorCXsKKwkJcmV0dXJuOworCX0KKworCVRhYmxlT2ZJbnN0YW5jZU9mRGF0YTo6cmF3X2l0ZXJhdG9yIGl0RGF0YSA9IG1EYXRhLmJlZ2luKCk7CisJVGFibGVPZkluc3RhbmNlT2ZEYXRhOjpyYXdfaXRlcmF0b3IgZW5kRGF0YSA9IG1EYXRhLmVuZCgpOworCWZvciggOyBpdERhdGEgIT0gZW5kRGF0YSA7ICsraXREYXRhICkKKwl7CisJCWlmKCAoaXREYXRhKS0+Z2V0VHlwZVNwZWNpZmllcigpLT5oYXNUeXBlQXJyYXlPclN0cnVjdHVyZSgpICYmCisJCQkobm90IChpdERhdGEpLT5nZXRNb2RpZmllcigpLmhhc05hdHVyZVJlZmVyZW5jZSgpKSApCisJCXsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYoIGl0RGF0YSA9PSBlbmREYXRhICkKKwl7CisJCW1CYXNpY0RhdGEgPSAmbURhdGE7CisJCW1BbGxEYXRhID0gJm1EYXRhOworCisJCXJldHVybjsKKwl9CisKKworCWlmKCBtQmFzaWNEYXRhICE9ICZtRGF0YSApCisJeworCQlzZXA6OmRlc3Ryb3koIG1CYXNpY0RhdGEgKTsKKwl9CisJaWYoIG1BbGxEYXRhICE9ICZtRGF0YSApCisJeworCQlzZXA6OmRlc3Ryb3koIG1BbGxEYXRhICk7CisJfQorCisvLwlJbnN0YW5jZU9mRGF0YSAqIGFuSW5zdGFuY2UgPSBnZXREYXRhKCkubGFzdCgpOworCisJVGFibGVPZkluc3RhbmNlT2ZEYXRhIHRhYmxlb2ZBbGxEYXRhOworCVRhYmxlT2ZJbnN0YW5jZU9mRGF0YSB0YWJsZW9mQmFzaWNEYXRhOworCVRhYmxlT2ZTeW1ib2wgcmVsYXRpdmVEYXRhUGF0aDsKKworCS8vIGJlZ2luKCkgLS0+IGl0ICBpcyB0eXBlZCBzaW1wbGUKKwlUYWJsZU9mSW5zdGFuY2VPZkRhdGE6OmNvbnN0X2l0ZXJhdG9yIGl0MiA9IG1EYXRhLmJlZ2luKCk7CisJZm9yKCA7IGl0MiAhPSBpdERhdGEgOyArK2l0MiApCisJeworCQl0YWJsZW9mQWxsRGF0YS5hcHBlbmQoICgqaXQyKSApOworCQl0YWJsZW9mQmFzaWNEYXRhLmFwcGVuZCggKCppdDIpICk7CisJfQorCisJQmFzZVR5cGVTcGVjaWZpZXIgKiBhVHlwZVNwZWNpZmllciA9IE5VTEw7CisKKwkvLyBBbmFseXNlIGZvciBpdCAtLT4gZW5kKCkKKwlmb3IoIDsgaXREYXRhICE9IGVuZERhdGEgOyArK2l0RGF0YSApCisJeworCQl0YWJsZW9mQWxsRGF0YS5hcHBlbmQoICgqaXREYXRhKSApOworCisJCWFUeXBlU3BlY2lmaWVyID0gKGl0RGF0YSktPnJlZmVyZWRUeXBlU3BlY2lmaWVyKCk7CisKKwkJaWYoIChpdERhdGEpLT5nZXRNb2RpZmllcigpLmhhc05hdHVyZVJlZmVyZW5jZSgpICkKKwkJeworCQkJdGFibGVvZkJhc2ljRGF0YS5hcHBlbmQoICgqaXREYXRhKSApOworCQl9CisJCWVsc2UgaWYoIGFUeXBlU3BlY2lmaWVyLT5oYXNUeXBlQXJyYXlPclN0cnVjdHVyZSgpICkKKwkJeworCQkJY29sbGVjdEFsbERhdGEodGFibGVvZkFsbERhdGEsIHRhYmxlb2ZCYXNpY0RhdGEsCisJCQkJCShpdERhdGEpLCByZWxhdGl2ZURhdGFQYXRoLCAoaXREYXRhKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJdGFibGVvZkJhc2ljRGF0YS5hcHBlbmQoICgqaXREYXRhKSApOworCQl9CisJfQorCisJbUFsbERhdGEgICA9IG5ldyBUYWJsZU9mSW5zdGFuY2VPZkRhdGEodGFibGVvZkFsbERhdGEpOworCW1CYXNpY0RhdGEgPSBuZXcgVGFibGVPZkluc3RhbmNlT2ZEYXRhKHRhYmxlb2ZCYXNpY0RhdGEpOworfQorCisKK3ZvaWQgQmFzZUF2bVByb2dyYW06OmNvbGxlY3RBbGxEYXRhKFRhYmxlT2ZJbnN0YW5jZU9mRGF0YSAmIHRhYmxlb2ZBbGxEYXRhLAorCQlUYWJsZU9mSW5zdGFuY2VPZkRhdGEgJiB0YWJsZW9mQmFzaWNEYXRhLCBJbnN0YW5jZU9mRGF0YSAqIG1haW5JbnN0YW5jZSwKKwkJVGFibGVPZlN5bWJvbCAmIHJlbGF0aXZlRGF0YVBhdGgsIEluc3RhbmNlT2ZEYXRhICogYW5JbnN0YW5jZSkKK3sKKwlzdGQ6OnN0cmluZyBwZWZpeElEID0gYW5JbnN0YW5jZS0+Z2V0TmFtZUlEKCk7CisJc3RkOjpvc3RyaW5nc3RyZWFtIG9zc0lEOworCisJaWYoIGFuSW5zdGFuY2UtPmdldFR5cGVTcGVjaWZpZXIoKS0+aGFzVHlwZVN0cnVjdHVyZU9yQ2hvaWNlT3JVbmlvbigpICkKKwl7CisJCVRhYmxlT2ZTeW1ib2w6Oml0ZXJhdG9yIGl0RmllbGQgPSBhbkluc3RhbmNlLT5nZXRUeXBlU3BlY2lmaWVyKCktPgorCQkJCXRvPCBCYXNlU3ltYm9sVHlwZVNwZWNpZmllciA+KCktPmdldFN5bWJvbERhdGEoKS5iZWdpbigpOworCisJCVRhYmxlT2ZTeW1ib2w6Oml0ZXJhdG9yIGl0ID0gYW5JbnN0YW5jZS0+Z2V0QXR0cmlidXRlKCktPmJlZ2luKCk7CisJCVRhYmxlT2ZTeW1ib2w6Oml0ZXJhdG9yIGl0RW5kID0gYW5JbnN0YW5jZS0+Z2V0QXR0cmlidXRlKCktPmVuZCgpOworCQlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICwgKytpdEZpZWxkICkKKwkJeworCQkJb3NzSUQuc3RyKCAiIiApOworCQkJb3NzSUQgPDwgcGVmaXhJRCA8PCAiLiIKKwkJCQkJPDwgTmFtZWRFbGVtZW50OjpleHRyYWN0TmFtZUlEKAorCQkJCQkJCSgqaXQpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgKTsKKworCQkJSW5zdGFuY2VPZkRhdGEgKiBuZXdJbnN0YW5jZSA9IG5ldyBJbnN0YW5jZU9mRGF0YSgKKwkJCQkJSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX1VGSV9PRkZTRVRfTkFUVVJFLAorCQkJCQltYWluSW5zdGFuY2UtPmdldENvbnRhaW5lcigpLCAoKml0KS5yYXdEYXRhKCkpOworCQkJbmV3SW5zdGFuY2UtPnNldFNoYXJlZERhdGEoIG1haW5JbnN0YW5jZSApOworCQkJbmV3SW5zdGFuY2UtPnNldE5hbWVJRCggb3NzSUQuc3RyKCkgKTsKKwkJCXJlbGF0aXZlRGF0YVBhdGguYXBwZW5kKCAqaXRGaWVsZCApOworCQkJbmV3SW5zdGFuY2UtPnNldERhdGFQYXRoKCByZWxhdGl2ZURhdGFQYXRoICk7CisKKwkJCW5ld0luc3RhbmNlLT5zZXRBbGlhc1RhcmdldCggKCppdCkucmF3RGF0YSgpICk7CisJCQkoKml0KS5zZXRBbGlhc1RhcmdldCggbmV3SW5zdGFuY2UgKTsKKworCQkJY29uc3QgQkYgJiBzYXZlSW5zdGFuY2UgPSB0YWJsZW9mQWxsRGF0YS5zYXZlKCBuZXdJbnN0YW5jZSApOworCQkJaWYoIG5ld0luc3RhbmNlLT5nZXRUeXBlU3BlY2lmaWVyKCktPmhhc1R5cGVTaW1wbGVPckNvbGxlY3Rpb24oKSApCisJCQl7CisJCQkJdGFibGVvZkJhc2ljRGF0YS5hcHBlbmQoIHNhdmVJbnN0YW5jZSApOworCQkJfQorCisJCQljb2xsZWN0QWxsRGF0YSh0YWJsZW9mQWxsRGF0YSwgdGFibGVvZkJhc2ljRGF0YSAsIG1haW5JbnN0YW5jZSwKKwkJCQkJcmVsYXRpdmVEYXRhUGF0aCwgKCppdCkucmF3RGF0YSgpKTsKKworCQkJcmVsYXRpdmVEYXRhUGF0aC5wb3BfbGFzdCgpOworCQl9CisJfQorCisJZWxzZSBpZiggYW5JbnN0YW5jZS0+Z2V0VHlwZVNwZWNpZmllcigpLT5pc1R5cGVkQXJyYXkoKSApCisJeworCQlUYWJsZU9mU3ltYm9sOjppdGVyYXRvciBpdCA9IGFuSW5zdGFuY2UtPmdldEF0dHJpYnV0ZSgpLT5iZWdpbigpOworCQlUYWJsZU9mU3ltYm9sOjppdGVyYXRvciBpdEVuZCA9IGFuSW5zdGFuY2UtPmdldEF0dHJpYnV0ZSgpLT5lbmQoKTsKKwkJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApCisJCXsKKwkJCW9zc0lELnN0ciggIiIgKTsKKwkJCW9zc0lEIDw8IHBlZml4SUQgPDwgIlsiIDw8ICgqaXQpLmdldE9mZnNldCgpIDw8ICJdIjsKKworCQkJSW5zdGFuY2VPZkRhdGEgKiBuZXdJbnN0YW5jZSA9IG5ldyBJbnN0YW5jZU9mRGF0YSgKKwkJCQkJSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX1VGSV9PRkZTRVRfTkFUVVJFLAorCQkJCQltYWluSW5zdGFuY2UtPmdldENvbnRhaW5lcigpLCAoKml0KS5yYXdEYXRhKCkpOworCQkJbmV3SW5zdGFuY2UtPnNldFNoYXJlZERhdGEoIG1haW5JbnN0YW5jZSApOworCQkJbmV3SW5zdGFuY2UtPnNldE5hbWVJRCggb3NzSUQuc3RyKCkgKTsKKwkJCXJlbGF0aXZlRGF0YVBhdGguYXBwZW5kKCAqaXQgKTsKKwkJCW5ld0luc3RhbmNlLT5zZXREYXRhUGF0aCggcmVsYXRpdmVEYXRhUGF0aCApOworCisJCQkoKml0KS5zZXRBbGlhc1RhcmdldCggbmV3SW5zdGFuY2UgKTsKKworCQkJY29uc3QgQkYgJiBzYXZlSW5zdGFuY2UgPSB0YWJsZW9mQWxsRGF0YS5zYXZlKCBuZXdJbnN0YW5jZSApOworCQkJaWYoIG5ld0luc3RhbmNlLT5nZXRUeXBlU3BlY2lmaWVyKCktPmhhc1R5cGVTaW1wbGVPckNvbGxlY3Rpb24oKSApCisJCQl7CisJCQkJdGFibGVvZkJhc2ljRGF0YS5hcHBlbmQoIHNhdmVJbnN0YW5jZSApOworCQkJfQorCisJCQljb2xsZWN0QWxsRGF0YSh0YWJsZW9mQWxsRGF0YSwgdGFibGVvZkJhc2ljRGF0YSAsCisJCQkJCW1haW5JbnN0YW5jZSwgcmVsYXRpdmVEYXRhUGF0aCwgKCppdCkucmF3RGF0YSgpKTsKKworCQkJcmVsYXRpdmVEYXRhUGF0aC5wb3BfbGFzdCgpOworCQl9CisJfQorfQorCisKKy8qKgorICogU2VyaWFsaXphdGlvbgorICovCit2b2lkIEJhc2VBdm1Qcm9ncmFtOjp0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlvcyA8PCBUQUIgPDwgZ2V0TW9kaWZpZXIoKS50b1N0cmluZygpCisJCQk8PCAiYXZtcHJvZ3JhbSAiIDw8IGdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7CisJQVZNX0RFQlVHX1JFRl9DT1VOVEVSKG9zKTsKKwlvcyA8PCAiIHsiIDw8IEVPTDsKKworCWlmKCBoYXNEYXRhQWxpYXMoKSApCisJeworCQlvcyA8PCBFT0wgPDwgVEFCIDw8ICJhbGlhczoiIDw8IEVPTF9JTkNSX0lOREVOVDsKKworCQlnZXREYXRhQWxpYXMoKS50b1N0cmVhbShvcyk7CisKKwkJb3MgPDwgREVDUl9JTkRFTlQ7CisJfQorCisJaWYoIGhhc0RhdGEoKSApCisJeworCQlvcyA8PCBFT0wgPDwgVEFCIDw8ICJ2YXJpYWJsZToiIDw8IEVPTF9JTkNSX0lOREVOVDsKKworCQlnZXREYXRhKCkudG9TdHJlYW0ob3MpOworCisJCW9zIDw8IERFQ1JfSU5ERU5UOworCitBVk1fSUZfREVCVUdfRkxBRyggREFUQSApCisJCWlmKCBtQWxsRGF0YSAhPSAmbURhdGEgKQorCQl7CisJCQlvcyA8PCBFT0w7CisJCQlvcyA8PCBUQUIgPDwgInZhcmlhYmxlI2FsbDoiIDw8IEVPTF9JTkNSX0lOREVOVDsKKworCQkJZ2V0QWxsRGF0YSgpLnRvU3RyZWFtKG9zKTsKKworCQkJb3MgPDwgREVDUl9JTkRFTlQ7CisJCX0KKwkJaWYoIG1CYXNpY0RhdGEgIT0gJm1EYXRhICkKKwkJeworCQkJb3MgPDwgRU9MOworCQkJb3MgPDwgVEFCIDw8ICJ2YXJpYWJsZSNiYXNpYzoiIDw8IEVPTDsKKworCQkJVGFibGVPZkluc3RhbmNlT2ZEYXRhOjpjb25zdF9yYXdfaXRlcmF0b3IgaXREYXRhID0KKwkJCQkJZ2V0QmFzaWNEYXRhKCkuYmVnaW4oKTsKKwkJCVRhYmxlT2ZJbnN0YW5jZU9mRGF0YTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGVuZERhdGEgPQorCQkJCQlnZXRCYXNpY0RhdGEoKS5lbmQoKTsKKwkJCWZvciggOyBpdERhdGEgIT0gZW5kRGF0YSA7ICsraXREYXRhICkKKwkJCXsKKwkJCQlvcyA8PCBUQUIyIDw8IHN0cl9oZWFkZXIoICppdERhdGEgKSA8PCAiOyIgPDwgRU9MOworCQkJfQorCQl9CitBVk1fRU5ESUZfREVCVUdfRkxBRyggREFUQSApCisJfQorCisJb3MgPDwgVEFCIDw8ICJ9IiA8PCBFT0wgPDwgc3RkOjpmbHVzaDsKK30KKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhlY3V0YWJsZS9CYXNlQXZtUHJvZ3JhbS5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4ZWN1dGFibGUvQmFzZUF2bVByb2dyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGZiZjRlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4ZWN1dGFibGUvQmFzZUF2bVByb2dyYW0uaApAQCAtMCwwICsxLDU5OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDggb2N0LiAyMDA4CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQkFTRUFWTVBST0dSQU1fSF8KKyNkZWZpbmUgQkFTRUFWTVBST0dSQU1fSF8KKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0Jhc2VDb21waWxlZEZvcm0uaD4KKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZEYXRhLmg+CisKKyNpbmNsdWRlIDxmbWwvbGliL0F2bUFuYWx5c2lzLmg+CisjaW5jbHVkZSA8Zm1sL2xpYi9JVHlwZVNwZWNpZmllci5oPgorCisjaW5jbHVkZSA8Zm1sL3N5bWJvbC9UYWJsZU9mU3ltYm9sLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBBdm1Qcm9ncmFtOworY2xhc3MgRXhlY3V0YWJsZUZvcm07CitjbGFzcyBPYmplY3RFbGVtZW50OworCisKK2NsYXNzIEJhc2VBdm1Qcm9ncmFtIDoKKwkJcHVibGljIEJhc2VDb21waWxlZEZvcm0gLAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIEJhc2VBdm1Qcm9ncmFtICkKK3sKKworcHVibGljOgorCS8qKgorCSAqIFRZUEVERUYKKwkgKi8KKwl0eXBlZGVmIGF2bV91aW50OF90ICAgICAgICAgICAgVEZMQUc7CisKKwllbnVtCisJeworCQlFWEVDVVRBQkxFX1VOREVGSU5FRF9GTEFHICA9IDB4MDAsCisKKwkJRVhFQ1VUQUJMRV9DT01QSUxFRF9GTEFHICAgPSAweDAxLAorCisJCUVYRUNVVEFCTEVfT1BUSU1JWkVEX0ZMQUcgID0gMHgwMiwKKworCQlFWEVDVVRBQkxFX0ZJTkFMSVpFRF9GTEFHICA9IEVYRUNVVEFCTEVfQ09NUElMRURfRkxBRworCQkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVYRUNVVEFCTEVfT1BUSU1JWkVEX0ZMQUcKKwl9OworCisKK3Byb3RlY3RlZDoKKwkvKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlURkxBRyBtRmxhZzsKKworCVRhYmxlT2ZJbnN0YW5jZU9mRGF0YSBtRGF0YTsKKworCVRhYmxlT2ZJbnN0YW5jZU9mRGF0YSAqIG1CYXNpY0RhdGE7CisJVGFibGVPZkluc3RhbmNlT2ZEYXRhICogbUFsbERhdGE7CisKKworCVRhYmxlT2ZJbnN0YW5jZU9mRGF0YSBtRGF0YUFsaWFzOworCisJLy8gU3RhdGljIEFuYWx5c2lzIERhdGEKKwkvLyBUaGUgbGlzdCBvZiByZWFjaGFibGUgbWFjaGluZSBwZXIgbWFjaGluZQorCVNUQVRJQ19BTkFMWVNJUzo6VkFSSUFCTEVfREVQRU5ERU5DWV9SSU5HIG1WYXJpYWJsZURlcGVuZGVuY3lGbGFnOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlCYXNlQXZtUHJvZ3JhbShjbGFzc19raW5kX3QgYUNsYXNzS2luZCwgQmFzZUF2bVByb2dyYW0gKiBhQ29udGFpbmVyLAorCQkJY29uc3QgT2JqZWN0RWxlbWVudCAqIGFzdFByb2dyYW0sIGF2bV9zaXplX3QgYVNpemUpCisJOiBCYXNlQ29tcGlsZWRGb3JtKGFDbGFzc0tpbmQsIGFDb250YWluZXIsIGFzdFByb2dyYW0pLAorCW1GbGFnKCBFWEVDVVRBQkxFX1VOREVGSU5FRF9GTEFHICksCisKKwltRGF0YSggYVNpemUgKSwKKwltQmFzaWNEYXRhKCAmbURhdGEgKSwKKwltQWxsRGF0YSggJm1EYXRhICksCisJbURhdGFBbGlhcyggKSwKKworCW1WYXJpYWJsZURlcGVuZGVuY3lGbGFnKCBTVEFUSUNfQU5BTFlTSVM6OlVOREVGSU5FRF9ERVBFTkRFTkNZICkKKwl7CisJCS8vICEhIE5PVEhJTkcKKwl9CisKKwlCYXNlQXZtUHJvZ3JhbShjbGFzc19raW5kX3QgYUNsYXNzS2luZCwgQmFzZUF2bVByb2dyYW0gKiBhQ29udGFpbmVyLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELCBhdm1fc2l6ZV90IGFTaXplKQorCTogQmFzZUNvbXBpbGVkRm9ybShhQ2xhc3NLaW5kLCBhQ29udGFpbmVyLCBhTmFtZUlEKSwKKwltRmxhZyggRVhFQ1VUQUJMRV9VTkRFRklORURfRkxBRyApLAorCisJbURhdGEoIGFTaXplICksCisJbUJhc2ljRGF0YSggJm1EYXRhICksCisJbUFsbERhdGEoICZtRGF0YSApLAorCW1EYXRhQWxpYXMoICksCisKKwltVmFyaWFibGVEZXBlbmRlbmN5RmxhZyggU1RBVElDX0FOQUxZU0lTOjpVTkRFRklORURfREVQRU5ERU5DWSApCisJeworCQkvLyAhISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIENvcHkKKwkgKi8KKwlCYXNlQXZtUHJvZ3JhbShjb25zdCBCYXNlQXZtUHJvZ3JhbSAmIGFQcm9ncmFtKQorCTogQmFzZUNvbXBpbGVkRm9ybSggYVByb2dyYW0gKSwKKwltRmxhZyggYVByb2dyYW0ubUZsYWcgKSwKKworCW1EYXRhKCBhUHJvZ3JhbS5tRGF0YSApLAorCisJbUJhc2ljRGF0YSggKGFQcm9ncmFtLm1CYXNpY0RhdGEgPT0gJihhUHJvZ3JhbS5tRGF0YSkgKQorCQkJPyAmbURhdGEgOiBhUHJvZ3JhbS5tQmFzaWNEYXRhICksCisKKwltQWxsRGF0YSggKGFQcm9ncmFtLm1BbGxEYXRhID09ICYoYVByb2dyYW0ubURhdGEpICkKKwkJCT8gJm1EYXRhIDogYVByb2dyYW0ubUFsbERhdGEgKSwKKwltRGF0YUFsaWFzKCBhUHJvZ3JhbS5tRGF0YUFsaWFzICksCisKKwltVmFyaWFibGVEZXBlbmRlbmN5RmxhZyggYVByb2dyYW0ubVZhcmlhYmxlRGVwZW5kZW5jeUZsYWcgKQorCXsKKwkJLy8gISEgTk9USElORworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkJhc2VBdm1Qcm9ncmFtKCkKKwl7CisJCWlmKCBtQmFzaWNEYXRhICE9ICZtRGF0YSApCisJCXsKKwkJCXNlcDo6ZGVzdHJveSggbUJhc2ljRGF0YSApOworCQl9CisKKwkJaWYoIG1BbGxEYXRhICE9ICZtRGF0YSApCisJCXsKKwkJCXNlcDo6ZGVzdHJveSggbUFsbERhdGEgKTsKKwkJfQorCX0KKworCisJLyoqCisJICogR0VUVEVSCisJICogbUNvbnRhaW5lcgorCSAqLworCWlubGluZSBCYXNlQXZtUHJvZ3JhbSAqIGdldENvbnRhaW5lcigpIGNvbnN0CisJeworCQlyZXR1cm4oIHN0YXRpY19jYXN0PCBCYXNlQXZtUHJvZ3JhbSAqID4oIG1Db250YWluZXIgKSApOworCX0KKworCS8qKgorCSAqIEdFVFRFUgorCSAqIEZvciBBdm1Qcm9ncmFtIC0gRXhlY3V0YWJsZUZvcm0gQ29udGFpbmVyCisJICovCisJY29uc3QgQXZtUHJvZ3JhbSAqIGdldEF2bVByb2dyYW1Db250YWluZXIoKSBjb25zdDsKKwljb25zdCBBdm1Qcm9ncmFtICogZ2V0QXZtUHJvZ3JhbSgpIGNvbnN0OworCisJRXhlY3V0YWJsZUZvcm0gKiBnZXRFeGVjdXRhYmxlQ29udGFpbmVyKCkgY29uc3Q7CisJRXhlY3V0YWJsZUZvcm0gKiBnZXRFeGVjdXRhYmxlKCkgY29uc3Q7CisKKwlpbmxpbmUgYm9vbCBpc0FuY2VzdG9yKEJhc2VBdm1Qcm9ncmFtICogb21yUHJvZykKKwl7CisJCUJhc2VBdm1Qcm9ncmFtICogYVByb2cgPSBnZXRDb250YWluZXIoKTsKKwkJZm9yKCA7IGFQcm9nICE9IE5VTEwgOyBhUHJvZyA9IGFQcm9nLT5nZXRDb250YWluZXIoKSApCisJCXsKKwkJCWlmKCBhUHJvZyA9PSBvbXJQcm9nICkKKwkJCXsKKwkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtRmxhZworCSAqLworCWJvb2wgaXNDb21waWxlZEZsYWcoKQorCXsKKwkJcmV0dXJuKCAobUZsYWcgJiBFWEVDVVRBQkxFX0NPTVBJTEVEX0ZMQUcpICE9IDAgKTsKKwl9CisKKwl2b2lkIHNldENvbXBpbGVkRmxhZygpCisJeworCQltRmxhZyA9IG1GbGFnIHwgRVhFQ1VUQUJMRV9DT01QSUxFRF9GTEFHOworCX0KKworCisJYm9vbCBpc09wdGltaXplZEZsYWcoKQorCXsKKwkJcmV0dXJuKCAobUZsYWcgJiBFWEVDVVRBQkxFX09QVElNSVpFRF9GTEFHKSAhPSAwICk7CisJfQorCisJdm9pZCBzZXRPcHRpbWl6ZWRGbGFnKCkKKwl7CisJCW1GbGFnID0gbUZsYWcgfCBFWEVDVVRBQkxFX09QVElNSVpFRF9GTEFHOworCX0KKworCisJYm9vbCBpc0ZpbmFsaXplZEZsYWcoKQorCXsKKwkJcmV0dXJuKCAobUZsYWcgJiBFWEVDVVRBQkxFX0ZJTkFMSVpFRF9GTEFHKSAhPSAwICk7CisJfQorCisKKwkvKioKKwkgKiBJbml0aWFsaXplCisJICovCisJaW5saW5lIHZvaWQgaW5pdChCYXNlQXZtUHJvZ3JhbSAqIGFDb250YWluZXIsIGF2bV9zaXplX3QgYVNpemUpCisJeworCQlzZXRDb250YWluZXIoIGFDb250YWluZXIgKTsKKworCQltRGF0YS5yZXNpemUoYVNpemUpOworCisJCW1CYXNpY0RhdGEgPSAmbURhdGE7CisJCW1BbGxEYXRhID0gJm1EYXRhOworCX0KKworCisJLyoKKwkgKiBjb250YWlucyBEQVRBCisJICovCisJaW5saW5lIGJvb2wgY29udGFpbnNEYXRhKEluc3RhbmNlT2ZEYXRhICogYW5JbnN0YW5jZSkgY29uc3QKKwl7CisJCXJldHVybiggbURhdGEuY29udGFpbnMoYW5JbnN0YW5jZSkgfHwKKwkJCQltRGF0YUFsaWFzLmNvbnRhaW5zKGFuSW5zdGFuY2UpICk7CisJfQorCisJaW5saW5lIGJvb2wgY29udGFpbnNEYXRhKGNvbnN0IEJGICYgYW5JbnN0YW5jZSkgY29uc3QKKwl7CisJCXJldHVybiggbURhdGEuY29udGFpbnMoYW5JbnN0YW5jZSkgfHwKKwkJCQltRGF0YUFsaWFzLmNvbnRhaW5zKGFuSW5zdGFuY2UpICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBjb250YWluc0FsbERhdGEoSW5zdGFuY2VPZkRhdGEgKiBhbkluc3RhbmNlKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQWxsRGF0YS0+Y29udGFpbnMoYW5JbnN0YW5jZSkgfHwKKwkJCQltRGF0YUFsaWFzLmNvbnRhaW5zKGFuSW5zdGFuY2UpICk7CisJfQorCisvLwlpbmxpbmUgYm9vbCBjb250YWluc0FsbERhdGEoY29uc3QgQkYgJiBhbkluc3RhbmNlKSBjb25zdAorLy8JeworLy8JCXJldHVybiggbUFsbERhdGEtPmNvbnRhaW5zKGFuSW5zdGFuY2UpIHx8CisvLwkJCQltRGF0YUFsaWFzLmNvbnRhaW5zKGFuSW5zdGFuY2UpICk7CisvLwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1EYXRhCisJICovCisJaW5saW5lIGNvbnN0IEJGICYgc2F2ZURhdGEoSW5zdGFuY2VPZkRhdGEgKiBhbkluc3RhbmNlKQorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggYW5JbnN0YW5jZSApCisJCQkJPDwgIkluc3RhbmNlT2ZEYXRhICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJYW5JbnN0YW5jZS0+c2V0Q29udGFpbmVyKHRoaXMpOworCisJCXJldHVybiggbURhdGEuc2F2ZShhbkluc3RhbmNlKSApOworCX0KKworCWlubGluZSB2b2lkIGFwcGVuZERhdGEoY29uc3QgQkZMaXN0ICYgZGF0YUxpc3QpCisJeworCQltRGF0YS5hcHBlbmQoIGRhdGFMaXN0ICk7CisJfQorCisJaW5saW5lIHZvaWQgYXBwZW5kRGF0YShjb25zdCBCRlZlY3RvciAmIGRhdGFMaXN0KQorCXsKKwkJbURhdGEuYXBwZW5kKCBkYXRhTGlzdCApOworCX0KKworCisJaW5saW5lIGNvbnN0IFRhYmxlT2ZJbnN0YW5jZU9mRGF0YSAmIGdldERhdGEoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRGF0YSApOworCX0KKworCisJaW5saW5lIGF2bV9zaXplX3QgZ2V0RGF0YVNpemUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRGF0YS5zaXplKCkgKTsKKwl9CisKKworCWlubGluZSBib29sIGhhc0RhdGEoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRGF0YS5ub25lbXB0eSgpICk7CisJfQorCisKKwlpbmxpbmUgdm9pZCBzZXREYXRhKGF2bV9vZmZzZXRfdCBvZmZzZXQsIEluc3RhbmNlT2ZEYXRhICogYW5JbnN0YW5jZSkKKwl7CisJCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9QT0lOVEVSX0VYSVQoIGFuSW5zdGFuY2UgKQorCQkJCTw8ICJJbnN0YW5jZU9mRGF0YSAhISEiCisJCQkJPDwgU0VORF9FWElUOworCisJCWFuSW5zdGFuY2UtPnNldENvbnRhaW5lcih0aGlzKTsKKworCQltRGF0YS5zZXQob2Zmc2V0LCBhbkluc3RhbmNlKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXREYXRhKGF2bV9vZmZzZXRfdCBvZmZzZXQsIGNvbnN0IEJGICYgYW5JbnN0YW5jZSkKKwl7CisJCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9TTUFSVF9QT0lOVEVSX0VYSVQoIGFuSW5zdGFuY2UgKQorCQkJCTw8ICJJbnN0YW5jZU9mRGF0YSAhISEiCisJCQkJPDwgU0VORF9FWElUOworCisJCWFuSW5zdGFuY2UudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCktPnNldENvbnRhaW5lcih0aGlzKTsKKworCQltRGF0YS5zZXQob2Zmc2V0LCBhbkluc3RhbmNlKTsKKwl9CisKKworCWlubGluZSB2b2lkIHNldERhdGEoVGFibGVPZkluc3RhbmNlT2ZEYXRhICYgdGFibGVPZkRhdGEpCisJeworCQlyZXNldERhdGEoIHRhYmxlT2ZEYXRhICk7CisKKwkJdXBkYXRlRGF0YVRhYmxlKCk7CisJfQorCisJaW5saW5lIHZvaWQgcmVzZXREYXRhKFRhYmxlT2ZJbnN0YW5jZU9mRGF0YSAmIHRhYmxlT2ZEYXRhKQorCXsKKy8vCQltRGF0YS5yZWFsbG9jKCB0YWJsZU9mRGF0YSApOworCisJCW1EYXRhLmNsZWFyKCk7CisJCW1EYXRhLmFwcGVuZCggdGFibGVPZkRhdGEgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1CYXNpY0RhdGEKKwkgKi8KKwlpbmxpbmUgY29uc3QgVGFibGVPZkluc3RhbmNlT2ZEYXRhICYgZ2V0QmFzaWNEYXRhKCkgY29uc3QKKwl7CisJCXJldHVybiggKiBtQmFzaWNEYXRhICk7CisJfQorCisJaW5saW5lIGF2bV9zaXplX3QgZ2V0QmFzaWNEYXRhU2l6ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldEJhc2ljRGF0YSgpLnNpemUoKSApOworCX0KKworCWlubGluZSBib29sIGhhc0Jhc2ljRGF0YSgpIGNvbnN0CisJeworCQlyZXR1cm4oIChtQmFzaWNEYXRhICE9IE5VTEwpICYmIG1CYXNpY0RhdGEtPm5vbmVtcHR5KCkgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1BbGxEYXRhCisJICovCisJaW5saW5lIGNvbnN0IFRhYmxlT2ZJbnN0YW5jZU9mRGF0YSAmIGdldEFsbERhdGEoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAqIG1BbGxEYXRhICk7CisJfQorCisJaW5saW5lIGF2bV9zaXplX3QgZ2V0QWxsRGF0YVNpemUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobUFsbERhdGEgIT0gTlVMTCkgPyBtQWxsRGF0YS0+c2l6ZSgpIDogMCApOworCX0KKworCWlubGluZSBib29sIGhhc0FsbERhdGEoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobUFsbERhdGEgIT0gTlVMTCkgJiYgbUFsbERhdGEtPm5vbmVtcHR5KCkgKTsKKwl9CisKKworCS8qKgorCSAqIFVQREFURSBEQVRBIFRBQkxFCisJICogbUJhc2ljRGF0YQorCSAqIG1hbGxEYXRhCisJICovCisJdm9pZCB1cGRhdGVEYXRhVGFibGUoKTsKKworCXZvaWQgY29sbGVjdEFsbERhdGEoVGFibGVPZkluc3RhbmNlT2ZEYXRhICYgdGFibGVvZkFsbERhdGEsCisJCQlUYWJsZU9mSW5zdGFuY2VPZkRhdGEgJiB0YWJsZW9mQmFzaWNEYXRhLCBJbnN0YW5jZU9mRGF0YSAqIG1haW5JbnN0YW5jZSwKKwkJCVRhYmxlT2ZTeW1ib2wgJiByZWxhdGl2ZURhdGFQYXRoLCBJbnN0YW5jZU9mRGF0YSAqIGFuSW5zdGFuY2UpOworCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtRGF0YUFsaWFzCisJICovCisKKwlpbmxpbmUgdm9pZCBhcHBlbmREYXRhQWxpYXMoY29uc3QgU3ltYm9sICYgYW5BbGlhcykKKwl7CisJCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9TTUFSVF9QT0lOVEVSX0VYSVQoIGFuQWxpYXMgKQorCQkJCTw8ICJJbnN0YW5jZU9mRGF0YSAhISEiCisJCQkJPDwgU0VORF9FWElUOworCisJCW1EYXRhQWxpYXMuYXBwZW5kKGFuQWxpYXMpOworCX0KKworCWlubGluZSBjb25zdCBCRiAmIHNhdmVEYXRhQWxpYXMoSW5zdGFuY2VPZkRhdGEgKiBhbkluc3RhbmNlKQorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggYW5JbnN0YW5jZSApCisJCQkJPDwgIkluc3RhbmNlT2ZEYXRhICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJcmV0dXJuKCBtRGF0YUFsaWFzLnNhdmUoYW5JbnN0YW5jZSkgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgVGFibGVPZkluc3RhbmNlT2ZEYXRhICYgZ2V0RGF0YUFsaWFzKCkgY29uc3QKKwl7CisJCXJldHVybiggbURhdGFBbGlhcyApOworCX0KKworCisJYm9vbCBoYXNEYXRhQWxpYXMoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRGF0YUFsaWFzLm5vbmVtcHR5KCkgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIGFueSBTWU1CT0wgZmlsdGVyaW5nIGJ5IGFuIG9wdGlvbmFsIHR5cGUgc3BlY2lmaWVyIGZhbWlseQorCSAqLworCXZpcnR1YWwgY29uc3QgQkYgJiBnZXRTeW1ib2woCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCwKKwkJCWF2bV90eXBlX3NwZWNpZmllcl9raW5kX3QgdHlwZUZhbWlseSkgY29uc3Q7CisKKwl2aXJ0dWFsIGNvbnN0IEJGICYgZ2V0U3ltYm9sQnlRdWFsaWZpZWROYW1lSUQoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQsCisJCQlhdm1fdHlwZV9zcGVjaWZpZXJfa2luZF90IHR5cGVGYW1pbHkpIGNvbnN0OworCisJdmlydHVhbCBjb25zdCBCRiAmIGdldFN5bWJvbEJ5TmFtZUlEKGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwKKwkJCWF2bV90eXBlX3NwZWNpZmllcl9raW5kX3QgdHlwZUZhbWlseSkgY29uc3Q7CisKKworCXZpcnR1YWwgY29uc3QgQkYgJiBnZXRTeW1ib2xCeUFzdEVsZW1lbnQoCisJCQljb25zdCBPYmplY3RFbGVtZW50ICogYXN0RWxlbWVudCwKKwkJCWF2bV90eXBlX3NwZWNpZmllcl9raW5kX3QgdHlwZUZhbWlseSkgY29uc3Q7CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIGFueSBTWU1CT0wgZmlsdGVyaW5nIGJ5IGFuIG9wdGlvbmFsIHR5cGUgc3BlY2lmaWVyIGZhbWlseQorCSAqIHJlY3Vyc2l2ZWx5IGluIGNvbnRhaW5lcgorCSAqLworCWlubGluZSBjb25zdCBCRiAmIGdldFNlbVN5bWJvbCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlELAorCQkJYXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCB0eXBlRmFtaWx5KSBjb25zdAorCXsKKwkJY29uc3QgQmFzZUF2bVByb2dyYW0gKiBhUHJvZ3JhbSA9IHRoaXM7CisJCWZvciggOyBhUHJvZ3JhbSAhPSBOVUxMIDsgYVByb2dyYW0gPSBhUHJvZ3JhbS0+Z2V0Q29udGFpbmVyKCkgKQorCQl7CisJCQljb25zdCBCRiAmIHRoZVN5bWJvbCA9CisJCQkJCWFQcm9ncmFtLT5nZXRTeW1ib2woYUZ1bGx5UXVhbGlmaWVkTmFtZUlELCB0eXBlRmFtaWx5KTsKKwkJCWlmKCB0aGVTeW1ib2wudmFsaWQoKSApCisJCQl7CisJCQkJcmV0dXJuKCB0aGVTeW1ib2wgKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiggQkY6OlJFRl9OVUxMICk7CisJfQorCisKKwlpbmxpbmUgY29uc3QgQkYgJiBnZXRTZW1TeW1ib2xCeVF1YWxpZmllZE5hbWVJRCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCwKKwkJCWF2bV90eXBlX3NwZWNpZmllcl9raW5kX3QgdHlwZUZhbWlseSkgY29uc3QKKwl7CisJCWNvbnN0IEJhc2VBdm1Qcm9ncmFtICogYVByb2dyYW0gPSB0aGlzOworCQlmb3IoIDsgYVByb2dyYW0gIT0gTlVMTCA7IGFQcm9ncmFtID0gYVByb2dyYW0tPmdldENvbnRhaW5lcigpICkKKwkJeworCQkJY29uc3QgQkYgJiB0aGVTeW1ib2wgPSBhUHJvZ3JhbS0+CisJCQkJCWdldFN5bWJvbEJ5UXVhbGlmaWVkTmFtZUlEKGFRdWFsaWZpZWROYW1lSUQsIHR5cGVGYW1pbHkpOworCQkJaWYoIHRoZVN5bWJvbC52YWxpZCgpICkKKwkJCXsKKwkJCQlyZXR1cm4oIHRoZVN5bWJvbCApOworCQkJfQorCQl9CisKKwkJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKKwl9CisKKworCWlubGluZSBjb25zdCBCRiAmIGdldFNlbVN5bWJvbEJ5TmFtZUlEKGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwKKwkJCWF2bV90eXBlX3NwZWNpZmllcl9raW5kX3QgdHlwZUZhbWlseSkgY29uc3QKKwl7CisJCWNvbnN0IEJhc2VBdm1Qcm9ncmFtICogYVByb2dyYW0gPSB0aGlzOworCQlmb3IoIDsgYVByb2dyYW0gIT0gTlVMTCA7IGFQcm9ncmFtID0gYVByb2dyYW0tPmdldENvbnRhaW5lcigpICkKKwkJeworCQkJY29uc3QgQkYgJiB0aGVTeW1ib2wgPQorCQkJCQlhUHJvZ3JhbS0+Z2V0U3ltYm9sQnlOYW1lSUQoYU5hbWVJRCwgdHlwZUZhbWlseSk7CisJCQlpZiggdGhlU3ltYm9sLnZhbGlkKCkgKQorCQkJeworCQkJCXJldHVybiggdGhlU3ltYm9sICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCX0KKworCisJaW5saW5lIGNvbnN0IEJGICYgZ2V0eW1ib2xCeUFzdEVsZW1lbnQoCisJCQljb25zdCBPYmplY3RFbGVtZW50ICogYXN0RWxlbWVudCwKKwkJCWF2bV90eXBlX3NwZWNpZmllcl9raW5kX3QgdHlwZUZhbWlseSkgY29uc3QKKwl7CisJCWNvbnN0IEJhc2VBdm1Qcm9ncmFtICogYVByb2dyYW0gPSB0aGlzOworCQlmb3IoIDsgYVByb2dyYW0gIT0gTlVMTCA7IGFQcm9ncmFtID0gYVByb2dyYW0tPmdldENvbnRhaW5lcigpICkKKwkJeworCQkJY29uc3QgQkYgJiB0aGVTeW1ib2wgPQorCQkJCQlhUHJvZ3JhbS0+Z2V0U3ltYm9sQnlBc3RFbGVtZW50KGFzdEVsZW1lbnQsIHR5cGVGYW1pbHkpOworCQkJaWYoIHRoZVN5bWJvbC52YWxpZCgpICkKKwkJCXsKKwkJCQlyZXR1cm4oIHRoZVN5bWJvbCApOworCQkJfQorCQl9CisKKwkJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gU1RBVElDIEFOQUxZU0lTIEFUVFJJQlVURQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtVmFyaWFibGVEZXBlbmRlbmN5RmxhZworCSAqLworCisJU1RBVElDX0FOQUxZU0lTOjpWQVJJQUJMRV9ERVBFTkRFTkNZX1JJTkcgZ2V0VmFyaWFibGVEZXBlbmRlbnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVmFyaWFibGVEZXBlbmRlbmN5RmxhZyApOworCX0KKworCWJvb2wgaXNWYXJpYWJsZURlcGVuZGVudCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1WYXJpYWJsZURlcGVuZGVuY3lGbGFnID09IFNUQVRJQ19BTkFMWVNJUzo6REVQRU5ERU5UICk7CisJfQorCisJYm9vbCBpc1ZhcmlhYmxlSW5kZXBlbmRlbnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVmFyaWFibGVEZXBlbmRlbmN5RmxhZyA9PSBTVEFUSUNfQU5BTFlTSVM6OklOREVQRU5ERU5UICk7CisJfQorCisJYm9vbCBoYXNWYXJpYWJsZURlcGVuZGVuY3koKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVmFyaWFibGVEZXBlbmRlbmN5RmxhZyAhPSBTVEFUSUNfQU5BTFlTSVM6OlVOREVGSU5FRF9ERVBFTkRFTkNZICk7CisJfQorCisKKwl2b2lkIHNldFZhcmlhYmxlRGVwZW5kZW50KGJvb2wgaXNEZXBlbmRlbnQgPSB0cnVlKQorCXsKKwkJbVZhcmlhYmxlRGVwZW5kZW5jeUZsYWcgPSAoIGlzRGVwZW5kZW50ID8KKwkJCQlTVEFUSUNfQU5BTFlTSVM6OkRFUEVOREVOVCA6IFNUQVRJQ19BTkFMWVNJUzo6SU5ERVBFTkRFTlQgKTsKKwl9CisKKwl2b2lkIHNldFZhcmlhYmxlRGVwZW5kZW50KCkKKwl7CisJCW1WYXJpYWJsZURlcGVuZGVuY3lGbGFnID0gU1RBVElDX0FOQUxZU0lTOjpERVBFTkRFTlQ7CisJfQorCisJdm9pZCBzZXRWYXJpYWJsZUluZGVwZW5kZW50KCkKKwl7CisJCW1WYXJpYWJsZURlcGVuZGVuY3lGbGFnID0gU1RBVElDX0FOQUxZU0lTOjpJTkRFUEVOREVOVDsKKwl9CisKKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwl2aXJ0dWFsIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCisJdmlydHVhbCB2b2lkIHRvRnNjbihPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCXRvU3RyZWFtKG9zKTsKKwl9CisKK307CisKKworfQorCisjZW5kaWYgLyogQkFTRUFWTVBST0dSQU1fSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leGVjdXRhYmxlL0Jhc2VDb21waWxlZEZvcm0uY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4ZWN1dGFibGUvQmFzZUNvbXBpbGVkRm9ybS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE1ODljMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leGVjdXRhYmxlL0Jhc2VDb21waWxlZEZvcm0uY3BwCkBAIC0wLDAgKzEsMTYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiQmFzZUNvbXBpbGVkRm9ybS5oIgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvQmFzZUF2bVByb2dyYW0uaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mQnVmZmVyLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZlBvcnQuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworYm9vbCBCYXNlQ29tcGlsZWRGb3JtOjpVU0VfT05MWV9JRCA9IGZhbHNlOworCisKKworLyoqCisgKiBDT05TVFJVQ1RPUgorICogRGVmYXVsdAorICovCitCYXNlQ29tcGlsZWRGb3JtOjpCYXNlQ29tcGlsZWRGb3JtKGNsYXNzX2tpbmRfdCBhQ2xhc3NLaW5kLAorCQlCYXNlQXZtUHJvZ3JhbSAqIGFDb250YWluZXIsIGNvbnN0IE9iamVjdEVsZW1lbnQgKiBhc3RFbGVtZW50KQorOiBPYmplY3RFbGVtZW50KCBhQ2xhc3NLaW5kICwgYUNvbnRhaW5lciAsICggKGFzdEVsZW1lbnQgIT0gTlVMTCkgPworCQlhc3RFbGVtZW50LT5nZXRNb2RpZmllcigpIDogTW9kaWZpZXI6OlBST1BFUlRZX1VOREVGSU5FRF9NT0RJRklFUiApICksCittQXN0RWxlbWVudCggYXN0RWxlbWVudCApCit7CisJLy8hISBOT1RISU5HCisKKy8vCQl1cGRhdGVGdWxseVF1YWxpZmllZE5hbWVJRCgpOworfQorCitCYXNlQ29tcGlsZWRGb3JtOjpCYXNlQ29tcGlsZWRGb3JtKGNsYXNzX2tpbmRfdCBhQ2xhc3NLaW5kLAorCQlCYXNlQXZtUHJvZ3JhbSAqIGFDb250YWluZXIsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkKKzogT2JqZWN0RWxlbWVudCggYUNsYXNzS2luZCAsIGFDb250YWluZXIsIGFOYW1lSUQgKSwKK21Bc3RFbGVtZW50KCBOVUxMICkKK3sKKwkvLyEhIE5PVEhJTkcKK30KKworQmFzZUNvbXBpbGVkRm9ybTo6QmFzZUNvbXBpbGVkRm9ybSgKKwkJY2xhc3Nfa2luZF90IGFDbGFzc0tpbmQsIEJhc2VBdm1Qcm9ncmFtICogYUNvbnRhaW5lciwKKwkJY29uc3QgT2JqZWN0RWxlbWVudCAqIGFzdEVsZW1lbnQsIGNvbnN0IE1vZGlmaWVyICYgYU1vZGlmaWVyKQorOiBPYmplY3RFbGVtZW50KCBhQ2xhc3NLaW5kICwgYUNvbnRhaW5lciAsIGFNb2RpZmllciApLAorbUFzdEVsZW1lbnQoIGFzdEVsZW1lbnQgKQoreworCXVwZGF0ZU5hbWVJRCgpOworfQorCisvKioKKyAqIENPTlNUUlVDVE9SCisgKiBPdGhlcgorICovCitCYXNlQ29tcGlsZWRGb3JtOjpCYXNlQ29tcGlsZWRGb3JtKGNsYXNzX2tpbmRfdCBhQ2xhc3NLaW5kLAorCQlCYXNlQXZtUHJvZ3JhbSAqIGFDb250YWluZXIsIGNvbnN0IE9iamVjdEVsZW1lbnQgKiBhc3RFbGVtZW50LAorCQljb25zdCBNb2RpZmllciAmIGFNb2RpZmllciwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQpCis6IE9iamVjdEVsZW1lbnQoIGFDbGFzc0tpbmQgLCBhQ29udGFpbmVyICwKKwkJYU1vZGlmaWVyICwgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEICwgIiIgKSwKK21Bc3RFbGVtZW50KCBhc3RFbGVtZW50ICkKK3sKKwl1cGRhdGVOYW1lSUQoKTsKK30KKworQmFzZUNvbXBpbGVkRm9ybTo6QmFzZUNvbXBpbGVkRm9ybSgKKwkJY2xhc3Nfa2luZF90IGFDbGFzc0tpbmQsIEJhc2VBdm1Qcm9ncmFtICogYUNvbnRhaW5lciwKKwkJY29uc3QgT2JqZWN0RWxlbWVudCAqIGFzdEVsZW1lbnQsIGNvbnN0IE1vZGlmaWVyICYgYU1vZGlmaWVyLAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKQorOiBPYmplY3RFbGVtZW50KCBhQ2xhc3NLaW5kICwgYUNvbnRhaW5lciAsCisJCWFNb2RpZmllciAsIGFGdWxseVF1YWxpZmllZE5hbWVJRCAsIGFOYW1lSUQgKSwKK21Bc3RFbGVtZW50KCBhc3RFbGVtZW50ICkKK3sKKwkvLyEhIE5PVEhJTkcKK30KKworCisvKioKKyAqIFNlcmlhbGl6YXRpb24KKyAqLwordm9pZCBCYXNlQ29tcGlsZWRGb3JtOjp0b1N0cmVhbVN0YXRpY0NvbShPdXRTdHJlYW0gJiBvdXQsIGNvbnN0IEJGICYgY29tQkYpCit7CisJb3V0IDw8IC8qVEFCIDw8Ki8gInsiOworCisJaWYoIGNvbUJGLmlzPCBCYXNlSW5zdGFuY2VGb3JtID4oKSApCisJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIENPTU1VTklDQVRJT04gKQorCisJCW91dCA8PCBFT0xfVEFCMiA8PCBzdHJfaGVhZGVyKCBjb21CRi50b19wdHI8IEJhc2VJbnN0YW5jZUZvcm0gPigpICkgPDwgRU9MOworCitBVk1fRUxTRQorCisJCW91dCA8PCBFT0xfVEFCMgorCQkJPDwgY29tQkYudG9fcHRyPCBCYXNlSW5zdGFuY2VGb3JtID4oKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJPDwgRU9MOworCitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgQ09NTVVOSUNBVElPTiApCisJfQorCWVsc2UgaWYoIGNvbUJGLmlzPCBBdm1Db2RlID4oKSApCisJeworCQlpZiggY29tQkYudG9fcHRyPCBBdm1Db2RlID4oKS0+bm9uZW1wdHkoKSApCisJCXsKKwkJCVNjb3BlSW5jckluZGVudCBhc2lpKG91dCk7CisKKwkJCWNvbUJGLnRvX3B0cjwgQXZtQ29kZSA+KCktPnRvU3RyZWFtUm91dGluZSggb3V0ICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyEhIEVNUFRZCisJCX0KKwl9CisJZWxzZQorCXsKKwkJY29tQkYudG9TdHJlYW0oIG91dCA8PCBFT0xfSU5DUl9JTkRFTlQgKTsKKwkJb3V0IDw8IERFQ1JfRU9MOworCX0KKworCW91dCA8PCBUQUIgPDwgIn0iIDw8IEVPTDsKK30KKworCit2b2lkIEJhc2VDb21waWxlZEZvcm06OnRvU3RyZWFtU3RhdGljQ29tKE91dFN0cmVhbSAmIG91dCwKKwkJY29uc3QgTGlzdE9mSW5zdGFuY2VPZkJ1ZmZlciAmIGllQnVmZmVycykKK3sKKwlMaXN0T2ZJbnN0YW5jZU9mQnVmZmVyOjpjb25zdF9pdGVyYXRvciBpdEJ1ZmZlciA9IGllQnVmZmVycy5iZWdpbigpOworCUxpc3RPZkluc3RhbmNlT2ZCdWZmZXI6OmNvbnN0X2l0ZXJhdG9yIGl0QnVmZmVyRW5kID0gaWVCdWZmZXJzLmVuZCgpOworCWZvciggOyBpdEJ1ZmZlciAhPSBpdEJ1ZmZlckVuZCA7ICsraXRCdWZmZXIgKQorCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBDT01NVU5JQ0FUSU9OICkKKwkJb3V0IDw8IFRBQjIgPDwgc3RyX2hlYWRlciggKml0QnVmZmVyICkgPDwgRU9MOworQVZNX0VMU0UKKwkJb3V0IDw8IFRBQjIgPDwgKCppdEJ1ZmZlciktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgRU9MOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIENPTU1VTklDQVRJT04gKQorCX0KK30KKworCit2b2lkIEJhc2VDb21waWxlZEZvcm06OnRvU3RyZWFtU3RhdGljQ29tKE91dFN0cmVhbSAmIG91dCwKKwkJY29uc3QgTGlzdE9mSW5zdGFuY2VPZlBvcnQgJiBpZVBvcnRzKQoreworCUxpc3RPZkluc3RhbmNlT2ZQb3J0Ojpjb25zdF9pdGVyYXRvciBpdFBvcnQgPSBpZVBvcnRzLmJlZ2luKCk7CisJTGlzdE9mSW5zdGFuY2VPZlBvcnQ6OmNvbnN0X2l0ZXJhdG9yIGl0UG9ydEVuZCA9IGllUG9ydHMuZW5kKCk7CisJZm9yKCA7IGl0UG9ydCAhPSBpdFBvcnRFbmQgOyArK2l0UG9ydCApCisJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIENPTU1VTklDQVRJT04gKQorCQlvdXQgPDwgVEFCMiA8PCBzdHJfaGVhZGVyKCAqaXRQb3J0ICkgPDwgRU9MOworQVZNX0VMU0UKKwkJb3V0IDw8IFRBQjIgPDwgKCppdFBvcnQpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IEVPTDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBDT01NVU5JQ0FUSU9OICkKKwl9Cit9CisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4ZWN1dGFibGUvQmFzZUNvbXBpbGVkRm9ybS5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4ZWN1dGFibGUvQmFzZUNvbXBpbGVkRm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YmVjYzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhlY3V0YWJsZS9CYXNlQ29tcGlsZWRGb3JtLmgKQEAgLTAsMCArMSwyMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgQkFTRUNPTVBJTEVERk9STV9IXworI2RlZmluZSBCQVNFQ09NUElMRURGT1JNX0hfCisKKyNpbmNsdWRlIDxmbWwvY29tbW9uL09iamVjdEVsZW1lbnQuaD4KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vVHlwZWRlZi5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworY2xhc3MgQmFzZUF2bVByb2dyYW07CitjbGFzcyBCRjsKK2NsYXNzIE91dFN0cmVhbTsKKworCitjbGFzcyBCYXNlQ29tcGlsZWRGb3JtIDoKKwkJcHVibGljIE9iamVjdEVsZW1lbnQgLAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIEJhc2VDb21waWxlZEZvcm0gKQoreworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQVRUUklCVVRFUworCSAqLworCWNvbnN0IE9iamVjdEVsZW1lbnQgKiBtQXN0RWxlbWVudDsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQmFzZUNvbXBpbGVkRm9ybShjbGFzc19raW5kX3QgYUNsYXNzS2luZCwKKwkJCUJhc2VBdm1Qcm9ncmFtICogYUNvbnRhaW5lciwgY29uc3QgT2JqZWN0RWxlbWVudCAqIGFzdEVsZW1lbnQpOworCisJQmFzZUNvbXBpbGVkRm9ybShjbGFzc19raW5kX3QgYUNsYXNzS2luZCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlELAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKQorCTogT2JqZWN0RWxlbWVudCggYUNsYXNzS2luZCAsIE5VTEwgLCBhRnVsbHlRdWFsaWZpZWROYW1lSUQgLCBhTmFtZUlEKSwKKwltQXN0RWxlbWVudCggTlVMTCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlCYXNlQ29tcGlsZWRGb3JtKGNsYXNzX2tpbmRfdCBhQ2xhc3NLaW5kLAorCQkJQmFzZUF2bVByb2dyYW0gKiBhQ29udGFpbmVyLCBjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpOworCisKKwlCYXNlQ29tcGlsZWRGb3JtKGNsYXNzX2tpbmRfdCBhQ2xhc3NLaW5kLCBCYXNlQXZtUHJvZ3JhbSAqIGFDb250YWluZXIsCisJCQljb25zdCBPYmplY3RFbGVtZW50ICogYXN0RWxlbWVudCwgY29uc3QgTW9kaWZpZXIgJiBhTW9kaWZpZXIpOworCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBPdGhlcgorCSAqLworCUJhc2VDb21waWxlZEZvcm0oY2xhc3Nfa2luZF90IGFDbGFzc0tpbmQsIEJhc2VBdm1Qcm9ncmFtICogYUNvbnRhaW5lciwKKwkJCWNvbnN0IE9iamVjdEVsZW1lbnQgKiBhc3RFbGVtZW50LCBjb25zdCBNb2RpZmllciAmIGFNb2RpZmllciwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEKTsKKworCUJhc2VDb21waWxlZEZvcm0oY2xhc3Nfa2luZF90IGFDbGFzc0tpbmQsIEJhc2VBdm1Qcm9ncmFtICogYUNvbnRhaW5lciwKKwkJCWNvbnN0IE9iamVjdEVsZW1lbnQgKiBhc3RFbGVtZW50LCBjb25zdCBNb2RpZmllciAmIGFNb2RpZmllciwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlELAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKTsKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCUJhc2VDb21waWxlZEZvcm0oY29uc3QgQmFzZUNvbXBpbGVkRm9ybSAmIGFDb21waWxlZEZvcm0pCisJOiBPYmplY3RFbGVtZW50KCBhQ29tcGlsZWRGb3JtICksCisJbUFzdEVsZW1lbnQoIGFDb21waWxlZEZvcm0ubUFzdEVsZW1lbnQgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkJhc2VDb21waWxlZEZvcm0oKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtQXN0RWxlbWVudAorCSAqLworCWlubGluZSBjb25zdCBPYmplY3RFbGVtZW50ICogZ2V0QXN0RWxlbWVudCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Bc3RFbGVtZW50ICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNBc3RFbGVtZW50KGNvbnN0IE9iamVjdEVsZW1lbnQgKiBhc3RFbGVtZW50KSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQXN0RWxlbWVudCA9PSBhc3RFbGVtZW50ICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzQXN0RWxlbWVudCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Bc3RFbGVtZW50ICE9IE5VTEwgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRBc3RFbGVtZW50KGNvbnN0IE9iamVjdEVsZW1lbnQgKiBhc3RFbGVtZW50KQorCXsKKwkJbUFzdEVsZW1lbnQgPSBhc3RFbGVtZW50OworCisJCXVwZGF0ZUZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7CisJfQorCisJaW5saW5lIHN0ZDo6c3RyaW5nIGdldEFzdEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgY29uc3QKKwl7CisJCXJldHVybiggKG1Bc3RFbGVtZW50ICE9IE5VTEwpPworCQkJCW1Bc3RFbGVtZW50LT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDogIjxmcW4taWQ6bnVsbD4iICk7CisJfQorCisJaW5saW5lIHN0ZDo6c3RyaW5nIGdldEFzdE5hbWVJRCgpIGNvbnN0CisJeworCQlyZXR1cm4oIChtQXN0RWxlbWVudCAhPSBOVUxMKT8KKwkJCQltQXN0RWxlbWVudC0+Z2V0TmFtZUlEKCkgOiAiPG5hbWUtaWQ6bnVsbD4iICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtRnVsbHlRdWFsaWZpZWROYW1lSUQKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyAmIGdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgY29uc3QKKwl7CisJCXJldHVybiggVVNFX09OTFlfSUQgPyBnZXROYW1lSUQoKSA6IG1GdWxseVF1YWxpZmllZE5hbWVJRCApOworCX0KKworCXZpcnR1YWwgdm9pZCB1cGRhdGVGdWxseVF1YWxpZmllZE5hbWVJRCgpID0gMDsKKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbU5hbWVJRAorCSAqLworCWlubGluZSB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nICYgZ2V0TmFtZUlEKCkgY29uc3QKKwl7CisJCWlmKCBtTmFtZUlELmVtcHR5KCkgKQorCQl7CisJCQkvLz8gdXBkYXRlTmFtZUlEKCk7CisJCQlyZXR1cm4oIE5hbWVkRWxlbWVudDo6VU5OQU1FRF9JRCApOworCQl9CisJCXJldHVybiggbU5hbWVJRCApOworCX0KKworCXZpcnR1YWwgdm9pZCB1cGRhdGVOYW1lSUQoKQorCXsKKwkJbU5hbWVJRCA9IGdldEFzdE5hbWVJRCgpOworCQlpZiggbU5hbWVJRC5lbXB0eSgpIHx8IE5hbWVkRWxlbWVudDo6aXNOdWxsKG1OYW1lSUQpICkKKwkJeworCQkJbU5hbWVJRCA9IE5hbWVkRWxlbWVudDo6ZXh0cmFjdE5hbWVJRCggbUZ1bGx5UXVhbGlmaWVkTmFtZUlEICk7CisJCX0KKwl9CisKKworCXZpcnR1YWwgdm9pZCB1cGRhdGVVZmlkKGF2bV9zaXplX3QgaW5zdGFuY2VJZCkKKwl7CisJCW1GdWxseVF1YWxpZmllZE5hbWVJRCA9CisJCQkJKE9TUygpIDw8IG1GdWxseVF1YWxpZmllZE5hbWVJRCA8PCAnIycgPDwgaW5zdGFuY2VJZCk7CisKKwkJbU5hbWVJRCAgPSAoT1NTKCkgPDwgbU5hbWVJRCAgPDwgJyMnIDw8IGluc3RhbmNlSWQpOworCX0KKworCXZpcnR1YWwgdm9pZCB1cGRhdGVVZmlkKGNvbnN0IHN0ZDo6c3RyaW5nICYgZGllc2VFeHRlbnNpb24pCisJeworCQltRnVsbHlRdWFsaWZpZWROYW1lSUQgPQorCQkJCShPU1MoKSA8PCBtRnVsbHlRdWFsaWZpZWROYW1lSUQgPDwgZGllc2VFeHRlbnNpb24pOworCisJCW1OYW1lSUQgID0gKE9TUygpIDw8IG1OYW1lSUQgIDw8IGRpZXNlRXh0ZW5zaW9uKTsKKwl9CisKKworCXN0YXRpYyBib29sIFVTRV9PTkxZX0lEOworCisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBDb21waWxlZCBFbGVtZW50IE5hbWUKKwkgKi8KKwlpbmxpbmUgc3RkOjpzdHJpbmcgZ2V0VW5yZXN0cmljdGVkTmFtZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldEFzdE5hbWVJRCgpICk7CisJfQorCisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJdmlydHVhbCB2b2lkIHN0ckhlYWRlcihPdXRTdHJlYW0gJiBvdXQpIGNvbnN0ID0gMDsKKworCXZpcnR1YWwgc3RkOjpzdHJpbmcgc3RySGVhZGVyKCkgY29uc3QKKwl7CisJCVN0cmluZ091dFN0cmVhbSBvc3M7CisKKwkJc3RySGVhZGVyKCBvc3MgKTsKKworCQlyZXR1cm4oIG9zcy5zdHIoKSApOworCX0KKworCisJc3RhdGljIHZvaWQgdG9TdHJlYW1TdGF0aWNDb20oT3V0U3RyZWFtICYgb3V0LCBjb25zdCBCRiAmIGNvbUJGKTsKKworCXN0YXRpYyB2b2lkIHRvU3RyZWFtU3RhdGljQ29tKE91dFN0cmVhbSAmIG91dCwKKwkJCWNvbnN0IExpc3RPZkluc3RhbmNlT2ZCdWZmZXIgJiBpZUJ1ZmZlcnMpOworCisJc3RhdGljIHZvaWQgdG9TdHJlYW1TdGF0aWNDb20oT3V0U3RyZWFtICYgb3V0LAorCQkJY29uc3QgTGlzdE9mSW5zdGFuY2VPZlBvcnQgJiBpZVBvcnRzKTsKKworfTsKKworCit9CisKKyNlbmRpZiAvKkJBU0VDT01QSUxFREZPUk1fSF8qLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4ZWN1dGFibGUvQmFzZUluc3RhbmNlRm9ybS5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhlY3V0YWJsZS9CYXNlSW5zdGFuY2VGb3JtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzQ5MjRkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4ZWN1dGFibGUvQmFzZUluc3RhbmNlRm9ybS5jcHAKQEAgLTAsMCArMSw2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDUgYW/Du3QgMjAwOAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQmFzZUluc3RhbmNlRm9ybS5oIgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvQmFzZUF2bVByb2dyYW0uaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlRm9ybS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZEYXRhLmg+CisKKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lSUQuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKy8qKgorICogR0VUVEVSCisgKiBtQ29udGFpbmVyCisgKi8KK0Jhc2VBdm1Qcm9ncmFtICogQmFzZUluc3RhbmNlRm9ybTo6Z2V0Q29udGFpbmVyKCkgY29uc3QKK3sKKwlyZXR1cm4oIHN0YXRpY19jYXN0PCBCYXNlQXZtUHJvZ3JhbSAqID4oIG1Db250YWluZXIgKSApOworfQorCisKKy8qKgorICogU0VUVEVSCisgKiBtRnVsbHlRdWFsaWZpZWROYW1lSUQKKyAqLwordm9pZCBCYXNlSW5zdGFuY2VGb3JtOjp1cGRhdGVGdWxseVF1YWxpZmllZE5hbWVJRCgpCit7CisJaWYoIGhhc0FzdEVsZW1lbnQoKSApCisJeworCQlzdGQ6OnN0cmluZyBhRnVsbHlRdWFsaWZpZWROYW1lSUQgPSBnZXRBc3RGdWxseVF1YWxpZmllZE5hbWVJRCgpOworCisJCXN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgcG9zID0KKwkJCQlhRnVsbHlRdWFsaWZpZWROYW1lSUQuZmluZChGUU5fSURfUk9PVF9TRVBBUkFUT1IpOworCQlpZiggcG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKwkJeworCQkJc2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoCisJCQkJCSJpbnN0IiArIGFGdWxseVF1YWxpZmllZE5hbWVJRC5zdWJzdHIocG9zKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJc2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoIGFGdWxseVF1YWxpZmllZE5hbWVJRCApOworCQl9CisJfQorCWVsc2UKKwl7CisJCXNldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCIiKTsKKwl9CisKKwl1cGRhdGVOYW1lSUQoKTsKK30KKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhlY3V0YWJsZS9CYXNlSW5zdGFuY2VGb3JtLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhlY3V0YWJsZS9CYXNlSW5zdGFuY2VGb3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc2YzA4MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leGVjdXRhYmxlL0Jhc2VJbnN0YW5jZUZvcm0uaApAQCAtMCwwICsxLDU1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDUgYW/Du3QgMjAwOAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEJBU0VJTlNUQU5DRUZPUk1fSF8KKyNkZWZpbmUgQkFTRUlOU1RBTkNFRk9STV9IXworCisjaW5jbHVkZSA8YmFzZS9TbWFydFBvaW50ZXIuaD4KKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0Jhc2VDb21waWxlZEZvcm0uaD4KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vQXJyYXkuaD4KKworI2luY2x1ZGUgPGNvbW1vbi9Bdm1Qb2ludGVyLmg+CisKKyNpbmNsdWRlIDxmbWwvY29tbW9uL01vZGlmaWVyRWxlbWVudC5oPgorI2luY2x1ZGUgPGZtbC9jb21tb24vT2JqZWN0RWxlbWVudC5oPgorCisjaW5jbHVkZSA8Zm1sL2xpYi9JVHlwZVNwZWNpZmllci5oPgorCisjaW5jbHVkZSA8Zm1sL3R5cGUvQmFzZVR5cGVTcGVjaWZpZXIuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL1J1bnRpbWVJRC5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvKioKKyAqIFRZUEVERURFRgorICovCit0eXBlZGVmIEFycmF5PCBJbnN0YW5jZU9mTWFjaGluZSAqID4gIEFycmF5T2ZJbnN0YW5jZU9mTWFjaGluZTsKKworCitjbGFzcyBCYXNlQXZtUHJvZ3JhbTsKK2NsYXNzIEluc3RhbmNlT2ZNYWNoaW5lOworCisKK2NsYXNzIEJhc2VJbnN0YW5jZUZvcm0gOgorCQlwdWJsaWMgQmFzZUNvbXBpbGVkRm9ybSAsCisJCXB1YmxpYyBJVHlwZVNwZWNpZmllciAsCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggQmFzZUluc3RhbmNlRm9ybSApCit7CisKK3Byb3RlY3RlZDoKKwkvKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwkvLyB0aGUgVHlwZSBTcGVjaWZpZXIKKwlCYXNlVHlwZVNwZWNpZmllciAqIG1UeXBlU3BlY2lmaWVyOworCisJYXZtX29mZnNldF90IG1PZmZzZXQ7CisKKworCS8vIFRoZSBydW50aW1lIG1hY2hpbmUgY29udGFpbmVyIGZvciBydW50aW1lIHBhcmFtZXRlcnMgY3JlYXRpb24KKwlSdW50aW1lSUQgbUNyZWF0b3JDb250YWluZXJSSUQ7CisKKwkvLyBUaGUgcnVudGltZSBtYWNoaW5lIGNvbnRhaW5lciBmb3IgcnVudGltZSBkYXRhIGFjY2VzcyBvcHRpbWl6YXRpb24KKwlSdW50aW1lSUQgbVJ1bnRpbWVDb250YWluZXJSSUQ7CisKKwkvLyB0aGUgUmVsYXRpdmUgTWFjaGluZSBQYXRoIGZvciBhbiBBbGlhcyBJbnN0YW5jZSBmcm9tIHRoaXMgTWFjaGluZSBDb250YWluZXIKKwlBcnJheU9mSW5zdGFuY2VPZk1hY2hpbmUgKiBtUmVsYXRpdmVNYWNoaW5lUGF0aDsKKworCUJhc2VJbnN0YW5jZUZvcm0gKiBtQWxpYXNUYXJnZXQ7CisKKwlhdm1fdWludDMyX3QgbUluc3RhbmNpYXRpb25Db3VudDsKKworCitwdWJsaWM6CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIGNvcHkKKwkgKi8KKwlCYXNlSW5zdGFuY2VGb3JtKGNvbnN0IEJhc2VJbnN0YW5jZUZvcm0gJiBhbkluc3RhbmNlKQorCTogQmFzZUNvbXBpbGVkRm9ybSggYW5JbnN0YW5jZSApLAorCW1UeXBlU3BlY2lmaWVyKCBhbkluc3RhbmNlLm1UeXBlU3BlY2lmaWVyICksCisJbU9mZnNldCggYW5JbnN0YW5jZS5tT2Zmc2V0ICksCisKKwltQ3JlYXRvckNvbnRhaW5lclJJRCggYW5JbnN0YW5jZS5tQ3JlYXRvckNvbnRhaW5lclJJRCApLAorCW1SdW50aW1lQ29udGFpbmVyUklEKCBhbkluc3RhbmNlLm1SdW50aW1lQ29udGFpbmVyUklEICksCisJbVJlbGF0aXZlTWFjaGluZVBhdGgoCisJCQkoYW5JbnN0YW5jZS5tUmVsYXRpdmVNYWNoaW5lUGF0aCAhPSBOVUxMKSA/CisJCQkJCW5ldyBBcnJheU9mSW5zdGFuY2VPZk1hY2hpbmUoCisJCQkJCQkJKihhbkluc3RhbmNlLm1SZWxhdGl2ZU1hY2hpbmVQYXRoKSkgOiBOVUxMICksCisKKwltQWxpYXNUYXJnZXQoIE5VTEwgKSwKKwltSW5zdGFuY2lhdGlvbkNvdW50KCBhbkluc3RhbmNlLm1JbnN0YW5jaWF0aW9uQ291bnQgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQmFzZUluc3RhbmNlRm9ybShjbGFzc19raW5kX3QgYUNsYXNzS2luZCwKKwkJCUJhc2VBdm1Qcm9ncmFtICogYUNvbnRhaW5lciwgY29uc3QgT2JqZWN0RWxlbWVudCAqIGFzdEVsZW1lbnQsCisJCQlCYXNlVHlwZVNwZWNpZmllciAqIGFUeXBlU3BlY2lmaWVyLCBhdm1fb2Zmc2V0X3QgYW5PZmZzZXQpCisJOiBCYXNlQ29tcGlsZWRGb3JtKGFDbGFzc0tpbmQsIGFDb250YWluZXIsIGFzdEVsZW1lbnQpLAorCW1UeXBlU3BlY2lmaWVyKCBhVHlwZVNwZWNpZmllciApLAorCW1PZmZzZXQoIGFuT2Zmc2V0ICksCisKKwltQ3JlYXRvckNvbnRhaW5lclJJRCggKSwKKwltUnVudGltZUNvbnRhaW5lclJJRCggKSwKKwltUmVsYXRpdmVNYWNoaW5lUGF0aCggKSwKKworCW1BbGlhc1RhcmdldCggTlVMTCApLAorCW1JbnN0YW5jaWF0aW9uQ291bnQoIDAgKQorCXsKKwkJdXBkYXRlRnVsbHlRdWFsaWZpZWROYW1lSUQoKTsKKwl9CisKKwlCYXNlSW5zdGFuY2VGb3JtKGNsYXNzX2tpbmRfdCBhQ2xhc3NLaW5kLCBCYXNlQXZtUHJvZ3JhbSAqIGFDb250YWluZXIsCisJCQljb25zdCBPYmplY3RFbGVtZW50ICogYXN0RWxlbWVudCwgQmFzZVR5cGVTcGVjaWZpZXIgKiBhVHlwZVNwZWNpZmllciwKKwkJCWF2bV9vZmZzZXRfdCBhbk9mZnNldCwgY29uc3QgTW9kaWZpZXIgJiBhTW9kaWZpZXIpCisJOiBCYXNlQ29tcGlsZWRGb3JtKGFDbGFzc0tpbmQsIGFDb250YWluZXIsIGFzdEVsZW1lbnQsIGFNb2RpZmllciksCisJbVR5cGVTcGVjaWZpZXIoIGFUeXBlU3BlY2lmaWVyICksCisJbU9mZnNldCggYW5PZmZzZXQgKSwKKworCW1DcmVhdG9yQ29udGFpbmVyUklEKCApLAorCW1SdW50aW1lQ29udGFpbmVyUklEKCApLAorCW1SZWxhdGl2ZU1hY2hpbmVQYXRoKCApLAorCisJbUFsaWFzVGFyZ2V0KCBOVUxMICksCisJbUluc3RhbmNpYXRpb25Db3VudCggMCApCisJeworCQl1cGRhdGVGdWxseVF1YWxpZmllZE5hbWVJRCgpOworCX0KKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogT3RoZXIKKwkgKi8KKwlCYXNlSW5zdGFuY2VGb3JtKGNsYXNzX2tpbmRfdCBhQ2xhc3NLaW5kLCBCYXNlQXZtUHJvZ3JhbSAqIGFDb250YWluZXIsCisJCQljb25zdCBPYmplY3RFbGVtZW50ICogYXN0RWxlbWVudCwgQmFzZVR5cGVTcGVjaWZpZXIgKiBhVHlwZVNwZWNpZmllciwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlELCBhdm1fb2Zmc2V0X3QgYW5PZmZzZXQsCisJCQljb25zdCBNb2RpZmllciAmIGFNb2RpZmllciA9IE1vZGlmaWVyOjpQUk9QRVJUWV9VTkRFRklORURfTU9ESUZJRVIpCisJOiBCYXNlQ29tcGlsZWRGb3JtKGFDbGFzc0tpbmQsIGFDb250YWluZXIsCisJCQlhc3RFbGVtZW50LCBhTW9kaWZpZXIsIGFGdWxseVF1YWxpZmllZE5hbWVJRCksCisJbVR5cGVTcGVjaWZpZXIoIGFUeXBlU3BlY2lmaWVyICksCisJbU9mZnNldCggYW5PZmZzZXQgKSwKKworCW1DcmVhdG9yQ29udGFpbmVyUklEKCApLAorCW1SdW50aW1lQ29udGFpbmVyUklEKCApLAorCW1SZWxhdGl2ZU1hY2hpbmVQYXRoKCBOVUxMICksCisKKwltQWxpYXNUYXJnZXQoIE5VTEwgKSwKKwltSW5zdGFuY2lhdGlvbkNvdW50KCAwICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJQmFzZUluc3RhbmNlRm9ybShjbGFzc19raW5kX3QgYUNsYXNzS2luZCwgQmFzZUF2bVByb2dyYW0gKiBhQ29udGFpbmVyLAorCQkJY29uc3QgT2JqZWN0RWxlbWVudCAqIGFzdEVsZW1lbnQsIEJhc2VUeXBlU3BlY2lmaWVyICogYVR5cGVTcGVjaWZpZXIsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCwKKwkJCWF2bV9vZmZzZXRfdCBhbk9mZnNldCwgQmFzZUluc3RhbmNlRm9ybSAqIGFQYXJlbnQpCisJOiBCYXNlQ29tcGlsZWRGb3JtKGFDbGFzc0tpbmQsIGFDb250YWluZXIsIGFzdEVsZW1lbnQsCisJCQlhUGFyZW50LT5nZXRNb2RpZmllcigpLCBhRnVsbHlRdWFsaWZpZWROYW1lSUQpLAorCW1UeXBlU3BlY2lmaWVyKCBhVHlwZVNwZWNpZmllciApLAorCW1PZmZzZXQoIGFuT2Zmc2V0ICksCisKKwltQ3JlYXRvckNvbnRhaW5lclJJRCggKSwKKwltUnVudGltZUNvbnRhaW5lclJJRCggKSwKKwltUmVsYXRpdmVNYWNoaW5lUGF0aCggTlVMTCApLAorCisJbUFsaWFzVGFyZ2V0KCBOVUxMICksCisJbUluc3RhbmNpYXRpb25Db3VudCggMCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCUJhc2VJbnN0YW5jZUZvcm0oCisJCQljbGFzc19raW5kX3QgYUNsYXNzS2luZCwgQmFzZVR5cGVTcGVjaWZpZXIgKiBhVHlwZVNwZWNpZmllciwKKwkJCXN0ZDo6c3RyaW5nIGFGdWxseVF1YWxpZmllZE5hbWVJRCwgYXZtX29mZnNldF90IGFuT2Zmc2V0LAorCQkJY29uc3QgTW9kaWZpZXIgJiBhTW9kaWZpZXIgPSBNb2RpZmllcjo6UFJPUEVSVFlfVU5ERUZJTkVEX01PRElGSUVSKQorCTogQmFzZUNvbXBpbGVkRm9ybShhQ2xhc3NLaW5kLAorCQkJTlVMTCwgTlVMTCwgYU1vZGlmaWVyLCBhRnVsbHlRdWFsaWZpZWROYW1lSUQpLAorCW1UeXBlU3BlY2lmaWVyKCBhVHlwZVNwZWNpZmllciApLAorCW1PZmZzZXQoIGFuT2Zmc2V0ICksCisKKwltQ3JlYXRvckNvbnRhaW5lclJJRCggKSwKKwltUnVudGltZUNvbnRhaW5lclJJRCggKSwKKwltUmVsYXRpdmVNYWNoaW5lUGF0aCggTlVMTCApLAorCisJbUFsaWFzVGFyZ2V0KCBOVUxMICksCisJbUluc3RhbmNpYXRpb25Db3VudCggMCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogZm9yIFVGSQorCSAqLworCUJhc2VJbnN0YW5jZUZvcm0oY2xhc3Nfa2luZF90IGFDbGFzc0tpbmQsCisJCQlCYXNlQXZtUHJvZ3JhbSAqIGFDb250YWluZXIsIEJhc2VJbnN0YW5jZUZvcm0gKiBhUGFyZW50KQorCTogQmFzZUNvbXBpbGVkRm9ybSggYUNsYXNzS2luZCwgYUNvbnRhaW5lciwKKwkJCWFQYXJlbnQtPmdldEFzdEVsZW1lbnQoKSwgYVBhcmVudC0+Z2V0TW9kaWZpZXIoKSwKKwkJCWFQYXJlbnQtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCksIGFQYXJlbnQtPmdldE5hbWVJRCgpICksCisJbVR5cGVTcGVjaWZpZXIoIGFQYXJlbnQtPm1UeXBlU3BlY2lmaWVyICksCisJbU9mZnNldCggYVBhcmVudC0+bU9mZnNldCApLAorCisJbUNyZWF0b3JDb250YWluZXJSSUQoICksCisJbVJ1bnRpbWVDb250YWluZXJSSUQoICksCisJbVJlbGF0aXZlTWFjaGluZVBhdGgoCisJCQkoIGFQYXJlbnQtPmhhc01hY2hpbmVQYXRoKCkgKSA/CisJCQkJCW5ldyBBcnJheU9mSW5zdGFuY2VPZk1hY2hpbmUoCisJCQkJCQkJKihhUGFyZW50LT5nZXRNYWNoaW5lUGF0aCgpKSkgOiBOVUxMICksCisKKwltQWxpYXNUYXJnZXQoIE5VTEwgKSwKKwltSW5zdGFuY2lhdGlvbkNvdW50KCBhUGFyZW50LT5tSW5zdGFuY2lhdGlvbkNvdW50ICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJQmFzZUluc3RhbmNlRm9ybShjbGFzc19raW5kX3QgYUNsYXNzS2luZCwgQmFzZUF2bVByb2dyYW0gKiBhQ29udGFpbmVyLAorCQkJY29uc3QgT2JqZWN0RWxlbWVudCAqIGFzdEVsZW1lbnQsIEJhc2VJbnN0YW5jZUZvcm0gKiBhTW9kZWwpCisJOiBCYXNlQ29tcGlsZWRGb3JtKCBhQ2xhc3NLaW5kLCBhQ29udGFpbmVyLCBhc3RFbGVtZW50KSwKKwltVHlwZVNwZWNpZmllciggYU1vZGVsLT5tVHlwZVNwZWNpZmllciApLAorCW1PZmZzZXQoIGFNb2RlbC0+bU9mZnNldCApLAorCisJbUNyZWF0b3JDb250YWluZXJSSUQoICksCisJbVJ1bnRpbWVDb250YWluZXJSSUQoICksCisJbVJlbGF0aXZlTWFjaGluZVBhdGgoICggYU1vZGVsLT5oYXNNYWNoaW5lUGF0aCgpICkgPworCQluZXcgQXJyYXlPZkluc3RhbmNlT2ZNYWNoaW5lKCAqKGFNb2RlbC0+Z2V0TWFjaGluZVBhdGgoKSkgKSA6IE5VTEwgKSwKKworCW1BbGlhc1RhcmdldCggTlVMTCApLAorCW1JbnN0YW5jaWF0aW9uQ291bnQoIGFNb2RlbC0+bUluc3RhbmNpYXRpb25Db3VudCApCisJeworCQl1cGRhdGVGdWxseVF1YWxpZmllZE5hbWVJRCgpOworCX0KKworCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBmb3IgQWxpYXMKKwkgKi8KKwlCYXNlSW5zdGFuY2VGb3JtKGNsYXNzX2tpbmRfdCBhQ2xhc3NLaW5kLCBCYXNlQXZtUHJvZ3JhbSAqIGFDb250YWluZXIsCisJCQlCYXNlSW5zdGFuY2VGb3JtICogYW5BbGlhc1RhcmdldCwKKwkJCUFycmF5T2ZJbnN0YW5jZU9mTWFjaGluZSAqIGFSZWxhdGl2ZU1hY2hpbmVQYXRoKQorCTogQmFzZUNvbXBpbGVkRm9ybSggYUNsYXNzS2luZCAsIGFDb250YWluZXIsCisJCQlhbkFsaWFzVGFyZ2V0LT5nZXRBc3RFbGVtZW50KCksIGFuQWxpYXNUYXJnZXQtPmdldE1vZGlmaWVyKCksCisJCQlhbkFsaWFzVGFyZ2V0LT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpLAorCQkJYW5BbGlhc1RhcmdldC0+Z2V0TmFtZUlEKCkgKSwKKwltVHlwZVNwZWNpZmllciggYW5BbGlhc1RhcmdldC0+bVR5cGVTcGVjaWZpZXIgKSwKKwltT2Zmc2V0KCBhbkFsaWFzVGFyZ2V0LT5tT2Zmc2V0ICksCisKKwltQ3JlYXRvckNvbnRhaW5lclJJRCggKSwKKwltUnVudGltZUNvbnRhaW5lclJJRCggKSwKKwltUmVsYXRpdmVNYWNoaW5lUGF0aCggYVJlbGF0aXZlTWFjaGluZVBhdGggKSwKKworCW1BbGlhc1RhcmdldCggYW5BbGlhc1RhcmdldCApLAorCW1JbnN0YW5jaWF0aW9uQ291bnQoIGFuQWxpYXNUYXJnZXQtPm1JbnN0YW5jaWF0aW9uQ291bnQgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwlCYXNlSW5zdGFuY2VGb3JtKGNsYXNzX2tpbmRfdCBhQ2xhc3NLaW5kLCBCYXNlQXZtUHJvZ3JhbSAqIGFDb250YWluZXIsCisJCQlCYXNlSW5zdGFuY2VGb3JtICogYW5BbGlhc1RhcmdldCwKKwkJCVZlY3Rvck9mSW5zdGFuY2VPZk1hY2hpbmUgJiBhUmVsYXRpdmVNYWNoaW5lUGF0aCkKKwk6IEJhc2VDb21waWxlZEZvcm0oIGFDbGFzc0tpbmQgLCBhQ29udGFpbmVyICwKKwkJCWFuQWxpYXNUYXJnZXQtPmdldEFzdEVsZW1lbnQoKSwgYW5BbGlhc1RhcmdldC0+Z2V0TW9kaWZpZXIoKSwKKwkJCWFuQWxpYXNUYXJnZXQtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCksCisJCQlhbkFsaWFzVGFyZ2V0LT5nZXROYW1lSUQoKSApLAorCW1UeXBlU3BlY2lmaWVyKCBhbkFsaWFzVGFyZ2V0LT5tVHlwZVNwZWNpZmllciApLAorCW1PZmZzZXQoIGFuQWxpYXNUYXJnZXQtPm1PZmZzZXQgKSwKKworCW1DcmVhdG9yQ29udGFpbmVyUklEKCApLAorCW1SdW50aW1lQ29udGFpbmVyUklEKCApLAorCW1SZWxhdGl2ZU1hY2hpbmVQYXRoKAorCQkJKCBhUmVsYXRpdmVNYWNoaW5lUGF0aC5ub25lbXB0eSgpICkgPworCQkJCQluZXcgQXJyYXlPZkluc3RhbmNlT2ZNYWNoaW5lKGFSZWxhdGl2ZU1hY2hpbmVQYXRoKSA6IE5VTEwgKSwKKworCW1BbGlhc1RhcmdldCggYW5BbGlhc1RhcmdldCApLAorCW1JbnN0YW5jaWF0aW9uQ291bnQoIGFuQWxpYXNUYXJnZXQtPm1JbnN0YW5jaWF0aW9uQ291bnQgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+QmFzZUluc3RhbmNlRm9ybSgpCisJeworCQlkZWxldGUoIG1SZWxhdGl2ZU1hY2hpbmVQYXRoICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBtQ29udGFpbmVyCisJICovCisJQmFzZUF2bVByb2dyYW0gKiBnZXRDb250YWluZXIoKSBjb25zdDsKKworCisJLyoqCisJICogU0VUVEVSCisJICogbUZ1bGx5UXVhbGlmaWVkTmFtZUlECisJICovCisJdmlydHVhbCB2b2lkIHVwZGF0ZUZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUiAtIFRFU1RFUgorCSAqIG1UeXBlU3BlY2lmaWVyCisJICovCisJaW5saW5lIHZpcnR1YWwgY29uc3QgQmFzZVR5cGVTcGVjaWZpZXIgKiB0aGlzVHlwZVNwZWNpZmllcigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UeXBlU3BlY2lmaWVyICk7CisJfQorCisKKwlpbmxpbmUgQmFzZVR5cGVTcGVjaWZpZXIgKiBnZXRUeXBlU3BlY2lmaWVyKCkgY29uc3QKKwl7CisJCXJldHVybiggbVR5cGVTcGVjaWZpZXIgKTsKKwl9CisKKwlpbmxpbmUgQmFzZVR5cGVTcGVjaWZpZXIgKiByZWZlcmVkVHlwZVNwZWNpZmllcigpIGNvbnN0CisJeworCQlyZXR1cm4oIChtVHlwZVNwZWNpZmllciAhPSBOVUxMKSA/CisJCQkJbVR5cGVTcGVjaWZpZXItPnJlZmVyZWRUeXBlU3BlY2lmaWVyKCkgOiBtVHlwZVNwZWNpZmllciApOworCX0KKworCisJdmlydHVhbCBhdm1fdHlwZV9zcGVjaWZpZXJfa2luZF90IGdldFR5cGVTcGVjaWZpZXJLaW5kKCkgY29uc3QKKwl7CisJCXJldHVybiggKG1UeXBlU3BlY2lmaWVyICE9IE5VTEwpID8KKwkJCQltVHlwZVNwZWNpZmllci0+Z2V0VHlwZVNwZWNpZmllcktpbmQoKSA6IFRZUEVfTlVMTF9TUEVDSUZJRVIgKTsKKwl9CisKKworCWlubGluZSBib29sIGhhc1R5cGVTcGVjaWZpZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVHlwZVNwZWNpZmllciAhPSBOVUxMICk7CisJfQorCisKKwlpbmxpbmUgdm9pZCBzZXRUeXBlU3BlY2lmaWVyKEJhc2VUeXBlU3BlY2lmaWVyICogYVR5cGVTcGVjaWZpZXIpCisJeworCQltVHlwZVNwZWNpZmllciA9IGFUeXBlU3BlY2lmaWVyOworCX0KKworCisJaW5saW5lIGJvb2wgaXNUeXBlRmFtaWx5KGF2bV90eXBlX3NwZWNpZmllcl9raW5kX3QgdHlwZUZhbWlseSkKKwl7CisJCXJldHVybiggKG1UeXBlU3BlY2lmaWVyID09IE5VTEwpIHx8CisJCQkJbVR5cGVTcGVjaWZpZXItPmlzVHlwZUZhbWlseSggdHlwZUZhbWlseSApICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtT2Zmc2V0CisJICovCisJaW5saW5lIGF2bV9vZmZzZXRfdCBnZXRPZmZzZXQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtT2Zmc2V0ICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0T2Zmc2V0KGF2bV9vZmZzZXRfdCBhbk9mZnNldCkKKwl7CisJCW1PZmZzZXQgPSBhbk9mZnNldDsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1DcmVhdG9yQ29udGFpbmVySUQKKwkgKi8KKwlpbmxpbmUgY29uc3QgUnVudGltZUlEICYgZ2V0Q3JlYXRvckNvbnRhaW5lclJJRCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1DcmVhdG9yQ29udGFpbmVyUklEICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzQ3JlYXRvckNvbnRhaW5lclJJRCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1DcmVhdG9yQ29udGFpbmVyUklELnZhbGlkKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRDcmVhdG9yQ29udGFpbmVyUklEKGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQpCisJeworCQltQ3JlYXRvckNvbnRhaW5lclJJRCA9IGFSSUQ7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtUnVudGltZUNvbnRhaW5lcklECisJICovCisJaW5saW5lIGNvbnN0IFJ1bnRpbWVJRCAmIGdldFJ1bnRpbWVDb250YWluZXJSSUQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUnVudGltZUNvbnRhaW5lclJJRCApOworCX0KKworCWlubGluZSBib29sIGhhc1J1bnRpbWVDb250YWluZXJSSUQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUnVudGltZUNvbnRhaW5lclJJRC52YWxpZCgpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0UnVudGltZUNvbnRhaW5lclJJRChjb25zdCBSdW50aW1lSUQgJiBhUklEKQorCXsKKwkJbVJ1bnRpbWVDb250YWluZXJSSUQgPSBhUklEOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVJlbGF0aXZlTWFjaGluZVBhdGgKKwkgKi8KKwlpbmxpbmUgdm9pZCBhcHBlbmRNYWNoaW5lUGF0aChBcnJheU9mSW5zdGFuY2VPZk1hY2hpbmUgJiBhbGlhc1BhdGgpCisJeworCQlpZiggbVJlbGF0aXZlTWFjaGluZVBhdGggPT0gTlVMTCApCisJCXsKKwkJCW1SZWxhdGl2ZU1hY2hpbmVQYXRoID0gbmV3IEFycmF5T2ZJbnN0YW5jZU9mTWFjaGluZShhbGlhc1BhdGgpOworCQl9CisJCWVsc2UKKwkJeworCQkJbVJlbGF0aXZlTWFjaGluZVBhdGgtPnJlYWxsb2MoYWxpYXNQYXRoKTsKKwkJfQorCX0KKworCWlubGluZSBBcnJheU9mSW5zdGFuY2VPZk1hY2hpbmUgKiBnZXRNYWNoaW5lUGF0aCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1SZWxhdGl2ZU1hY2hpbmVQYXRoICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzTWFjaGluZVBhdGgoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobVJlbGF0aXZlTWFjaGluZVBhdGggIT0gTlVMTCkgJiYKKwkJCQltUmVsYXRpdmVNYWNoaW5lUGF0aC0+bm9uZW1wdHkoKSApOworCX0KKworCisJaW5saW5lIGJvb2wgaXNBbGlhcygpIGNvbnN0CisJeworCQlyZXR1cm4oIChtUmVsYXRpdmVNYWNoaW5lUGF0aCAhPSBOVUxMKSAmJgorCQkJCW1SZWxhdGl2ZU1hY2hpbmVQYXRoLT5ub25lbXB0eSgpICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtQWxpYXNUYXJnZXQKKwkgKi8KKwlpbmxpbmUgQmFzZUluc3RhbmNlRm9ybSAqIGdldEFsaWFzVGFyZ2V0KCkgY29uc3QKKwl7CisJCXJldHVybiggbUFsaWFzVGFyZ2V0ICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzQWxpYXNUYXJnZXQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQWxpYXNUYXJnZXQgIT0gTlVMTCApOworCX0KKworCWlubGluZSB2b2lkIHNldEFsaWFzVGFyZ2V0KEJhc2VJbnN0YW5jZUZvcm0gKiBhbkFsaWFzVGFyZ2V0KQorCXsKKwkJbUFsaWFzVGFyZ2V0ID0gYW5BbGlhc1RhcmdldDsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtSW5zdGFuY2lhdGlvbkNvdW50CisJICovCisJaW5saW5lIHZvaWQgaW5jckluc3RhbmNpYXRpb25Db3VudChhdm1fdWludDMyX3Qgb2Zmc2V0ID0gMSkKKwl7CisJCW1JbnN0YW5jaWF0aW9uQ291bnQgKz0gb2Zmc2V0OworCX0KKworCWlubGluZSBhdm1fdWludDMyX3QgaW5zdGFuY2lhdGlvbkNvdW50SW5jcigpCisJeworCQlyZXR1cm4oIG1JbnN0YW5jaWF0aW9uQ291bnQrKyApOworCX0KKworCWlubGluZSBhdm1fdWludDMyX3QgZ2V0SW5zdGFuY2lhdGlvbkNvdW50KCkgY29uc3QKKwl7CisJCXJldHVybiggbUluc3RhbmNpYXRpb25Db3VudCApOworCX0KKworCWlubGluZSB2b2lkIHNldEluc3RhbmNpYXRpb25Db3VudChhdm1fdWludDMyX3QgYW5JbmRleCkKKwl7CisJCW1JbnN0YW5jaWF0aW9uQ291bnQgPSBhbkluZGV4OworCX0KKworCisJLyoqCisJICogaXMgZXF1YWxzCisJICovCisJaW5saW5lIHZpcnR1YWwgYm9vbCBlcXVhbHMoQmFzZUluc3RhbmNlRm9ybSAqIGFuSW5zdGFuY2UpIGNvbnN0CisJeworCQlpZiggdGhpcyA9PSBhbkluc3RhbmNlICkKKwkJeworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwkJZWxzZSBpZiggYW5JbnN0YW5jZSAhPSBOVUxMICkKKwkJeworCQkJcmV0dXJuKCAodGhpcy0+Z2V0QWxpYXNUYXJnZXQoKSA9PSBhbkluc3RhbmNlKQorCQkJCQl8fCAodGhpcyA9PSBhbkluc3RhbmNlLT5nZXRBbGlhc1RhcmdldCgpKQorCQkJCQl8fCAodGhpcy0+ZnFuRXF1YWxzKAorCQkJCQkJCWFuSW5zdGFuY2UtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgKSkgKTsKKwkJfQorCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisvLwl2aXJ0dWFsIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCisJaW5saW5lIHZpcnR1YWwgdm9pZCB0b0ZzY24oT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQlvcyA8PCBUQUIyIDw8IGdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgRU9MX0ZMVVNIOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgc3RyKCkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSApOworCX0KKworfTsKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVFlQRSBERUZJTklUSU9OIENPTlRBSU5FUgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0RFRklORV9WRUNUT1JfUFRSKCBCYXNlSW5zdGFuY2VGb3JtICkKKworCit9CisKKyNlbmRpZiAvKiBCQVNFSU5TVEFOQ0VGT1JNX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhlY3V0YWJsZS9Db21Sb3V0ZURhdGEuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4ZWN1dGFibGUvQ29tUm91dGVEYXRhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDkwNzcyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4ZWN1dGFibGUvQ29tUm91dGVEYXRhLmNwcApAQCAtMCwwICsxLDkwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTggb2N0LiAyMDEzCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9Db21Sb3V0ZURhdGEuaD4KKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZNYWNoaW5lLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZlBvcnQuaD4KKworI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Db21Qcm90b2NvbC5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Qb3J0Lmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK3N0YXRpYyB2b2lkIHN0clBNKE91dFN0cmVhbSAmIG9zLCBQYWlyTWFjaGluZVBvcnQgKiBtcCkKK3sKKy8vCWlmKCAobXAtPmZpcnN0KCkgPT0gTlVMTCkgfHwgbXAtPmZpcnN0KCktPmlzVGhpcygpIHx8CisvLwkJCU5hbWVkRWxlbWVudDo6ZnFuU3RhcnRzV2l0aChtcC0+c2Vjb25kKCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCksCisvLwkJCQkJbXAtPmZpcnN0KCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkpICkKKy8vCXsKKy8vCQlvcyA8PCBtcC0+c2Vjb25kKCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7CisvLwl9CisvLwllbHNlCisvLwl7CisvLwkJb3MgPDwgbXAtPmZpcnN0KCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKy8vCQkJCTw8ICItPiIgPDwgbXAtPnNlY29uZCgpLT5nZXROYW1lSUQoKTsKKy8vCX0KKworCWlmKCBtcCAhPSBOVUxMICkKKwl7CisJCW9zIDw8ICggKG1wLT5maXJzdCgpICE9IE5VTEwpID8JbXAtPmZpcnN0KCktPmdldE5hbWVJRCgpIDogIm1hY2hpbmU8bnVsbD4gIiApCisJCQkJPDwgIi0+Igk8PCAoIChtcC0+c2Vjb25kKCkgIT0gTlVMTCkgPworCQkJCQkJbXAtPnNlY29uZCgpLT5nZXROYW1lSUQoKSA6ICJwb3J0PG51bGw+IiApOworCX0KKwllbHNlCisJeworCQlvcyA8PCAiKG1hY2hpbmUtPnBvcnQpPG51bGw+IjsKKwl9Cit9CisKKworLyoqCisgKiBTZXJpYWxpemF0aW9uCisgKi8KK3ZvaWQgQ29tUm91dGVEYXRhOjp0b1N0cmVhbShPdXRTdHJlYW0gJiBvdXQpIGNvbnN0Cit7CisJb3V0IDw8IFRBQiA8PCBnZXRNb2RpZmllcigpLnN0ckRpcmVjdGlvbigpOworCWlmKCBoYXNDYXN0KCkgKQorCXsKKwkJb3V0IDw8ICI8ICIgPDwgQ29tUHJvdG9jb2w6OnRvX3N0cmluZyggZ2V0Q2FzdCgpICkgPDwgIiA+IjsKKwl9CisKKwlpZiggZ2V0TWFjaGluZVBvcnRzKCkuc2luZ2xldG9uKCkgKQorCXsKKwkJb3V0IDw8ICIgIjsKKwkJc3RyUE0ob3V0LCBnZXRNYWNoaW5lUG9ydHMoKS5maXJzdCgpKTsKKwkJb3V0IDw8ICI7IiA8PCBFT0xfRkxVU0g7CisJfQorCWVsc2UgaWYoIGdldE1hY2hpbmVQb3J0cygpLm5vbmVtcHR5KCkgKQorCXsKKwkJb3V0IDw8ICIgeyIgPDwgRU9MOworCQlWZWN0b3JPZlBhaXJNYWNoaW5lUG9ydDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBnZXRNYWNoaW5lUG9ydHMoKS5iZWdpbigpOworCQlWZWN0b3JPZlBhaXJNYWNoaW5lUG9ydDo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBnZXRNYWNoaW5lUG9ydHMoKS5lbmQoKTsKKwkJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJCXsKKwkJCW91dCA8PCBUQUIyOworCQkJc3RyUE0ob3V0LCAoKml0KSk7CisJCQlvdXQgPDwgIjsiIDw8IEVPTDsKKwkJfQorCQlvdXQgPDwgVEFCIDw8ICJ9IiA8PCBFT0xfRkxVU0g7CisJfQorfQorCisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhlY3V0YWJsZS9Db21Sb3V0ZURhdGEuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leGVjdXRhYmxlL0NvbVJvdXRlRGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNWQxYzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhlY3V0YWJsZS9Db21Sb3V0ZURhdGEuaApAQCAtMCwwICsxLDIwNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDE4IG9jdC4gMjAxMworICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIENPTVJPVVRFREFUQV9IXworI2RlZmluZSBDT01ST1VURURBVEFfSF8KKworI2luY2x1ZGUgPGNvbW1vbi9Bdm1Qb2ludGVyLmg+CisKKyNpbmNsdWRlIDxjb2xsZWN0aW9uL1R5cGVkZWYuaD4KKworI2luY2x1ZGUgPGZtbC9saWIvSUNvbVBvaW50Lmg+CisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9CYXNlQ29tcGlsZWRGb3JtLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZk1hY2hpbmUuaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mUG9ydC5oPgorCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0NvbVByb3RvY29sLmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0Nvbm5lY3Rvci5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvUnVudGltZUlELmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorICogVFlQRURFRgorICogUGFpcgorICogSW5zdGFuY2VPZk1hY2hpbmUKKyAqIEluc3RhbmNlT2ZQb3J0CisgKi8KK3R5cGVkZWYgUGFpcjwgSW5zdGFuY2VPZk1hY2hpbmUgKiAsIEluc3RhbmNlT2ZQb3J0ICogPiAgUGFpck1hY2hpbmVQb3J0OworCitERUZJTkVfTElTVF9QVFIoIFBhaXJNYWNoaW5lUG9ydCApCisKK0RFRklORV9WRUNUT1JfUFRSKCBQYWlyTWFjaGluZVBvcnQgKQorCisKK2NsYXNzIENvbVJvdXRlRGF0YSA6CisJCXB1YmxpYyBCYXNlQ29tcGlsZWRGb3JtLAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIENvbVJvdXRlRGF0YSApCit7CisKKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggQ29tUm91dGVEYXRhICkKKworCitwcm90ZWN0ZWQ6CisJLyoKKwkgKiBBVFRSSUJVVEVTCisJICovCisJLy8gVGhlIGxpc3Qgb2YgT1VUUFVUIFBvcnQKKwlWZWN0b3JPZlBhaXJNYWNoaW5lUG9ydCBtTWFjaGluZVBvcnRzOworCisJQ29tUHJvdG9jb2w6OlBST1RPQ09MX0tJTkQgbUNhc3Q7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUNvbVJvdXRlRGF0YShjb25zdCBDb25uZWN0b3IgKiBhQ29ubmVjdG9yLAorCQkJTW9kaWZpZXI6OkRJUkVDVElPTl9LSU5EIGlvRGlyZWN0aW9uKQorCTogQmFzZUNvbXBpbGVkRm9ybSggQ0xBU1NfS0lORF9UKCBDb21Sb3V0ZURhdGEgKSAsIE5VTEwsIGFDb25uZWN0b3IgKSwKKwltTWFjaGluZVBvcnRzKCApLAorCW1DYXN0KCBDb21Qcm90b2NvbDo6UFJPVE9DT0xfVU5ERUZJTkVEX0tJTkQgKQorCXsKKwkJZ2V0d01vZGlmaWVyKCkuc2V0RGlyZWN0aW9uS2luZCggaW9EaXJlY3Rpb24gKTsKKwl9CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIENvcHkKKwkgKi8KKwlDb21Sb3V0ZURhdGEoY29uc3QgQ29tUm91dGVEYXRhICYgYUNSRCkKKwk6IEJhc2VDb21waWxlZEZvcm0oIGFDUkQgKSwKKwltTWFjaGluZVBvcnRzKCBhQ1JELm1NYWNoaW5lUG9ydHMgKSwKKwltQ2FzdCggYUNSRC5tQ2FzdCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5Db21Sb3V0ZURhdGEoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBTRVRURVIKKwkgKiBtVUZJCisJICogbUlECisJICovCisJdmlydHVhbCB2b2lkIHVwZGF0ZUZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKwl7CisJCWlmKCBoYXNBc3RFbGVtZW50KCkgKQorCQl7CisJCQlzdGQ6OnN0cmluZyBhRnVsbHlRdWFsaWZpZWROYW1lSUQgPSBnZXRBc3RGdWxseVF1YWxpZmllZE5hbWVJRCgpOworCisJCQlzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIHBvcyA9CisJCQkJCWFGdWxseVF1YWxpZmllZE5hbWVJRC5maW5kKEZRTl9JRF9ST09UX1NFUEFSQVRPUik7CisJCQlpZiggcG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKwkJCXsKKwkJCQlzZXRGdWxseVF1YWxpZmllZE5hbWVJRCgKKwkJCQkJCSJjb20iICsgYUZ1bGx5UXVhbGlmaWVkTmFtZUlELnN1YnN0cihwb3MpICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJc2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoIGFGdWxseVF1YWxpZmllZE5hbWVJRCApOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJc2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoIiIpOworCQl9CisKKwkJdXBkYXRlTmFtZUlEKCk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtQ2FzdAorCSAqLworCWlubGluZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfS0lORCBnZXRDYXN0KCkgY29uc3QKKwl7CisJCXJldHVybiggbUNhc3QgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNDYXN0KCkgY29uc3QKKwl7CisJCXJldHVybiggbUNhc3QgIT0gQ29tUHJvdG9jb2w6OlBST1RPQ09MX1VOREVGSU5FRF9LSU5EICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0Q2FzdChDb21Qcm90b2NvbDo6UFJPVE9DT0xfS0lORCBhQ2FzdCkKKwl7CisJCW1DYXN0ID0gYUNhc3Q7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtTWFjaGluZVBvcnRzCisJICovCisJaW5saW5lIFZlY3Rvck9mUGFpck1hY2hpbmVQb3J0ICYgZ2V0TWFjaGluZVBvcnRzKCkKKwl7CisJCXJldHVybiggbU1hY2hpbmVQb3J0cyApOworCX0KKworCWlubGluZSBjb25zdCBWZWN0b3JPZlBhaXJNYWNoaW5lUG9ydCAmIGdldE1hY2hpbmVQb3J0cygpIGNvbnN0CisJeworCQlyZXR1cm4oIG1NYWNoaW5lUG9ydHMgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNNYWNoaW5lUG9ydHMoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtTWFjaGluZVBvcnRzLm5vbmVtcHR5KCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBhcHBlbmRNYWNoaW5lUG9ydChQYWlyTWFjaGluZVBvcnQgJiBhTWFjaGluZVBvcnQpCisJeworCQltTWFjaGluZVBvcnRzLmFwcGVuZCgmYU1hY2hpbmVQb3J0KTsKKwl9CisKKwlpbmxpbmUgdm9pZCBhcHBlbmRNYWNoaW5lUG9ydCgKKwkJCUluc3RhbmNlT2ZNYWNoaW5lICogYU1hY2hpbmUsIEluc3RhbmNlT2ZQb3J0ICogYVBvcnQpCisJeworCQltTWFjaGluZVBvcnRzLmFwcGVuZChuZXcgUGFpck1hY2hpbmVQb3J0KGFNYWNoaW5lLCBhUG9ydCkpOworCX0KKworCisJLyoqCisJICogU2VyaWFsaXphdGlvbgorCSAqLworCWlubGluZSB2b2lkIHN0ckhlYWRlcihPdXRTdHJlYW0gJiBvdXQpIGNvbnN0CisJeworCQlvdXQgPDwgc3RyX2luZGVudCggdGhpcyApOworCX0KKworCXZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3V0KSBjb25zdDsKKworfTsKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qIENPTVJPVVRFREFUQV9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZUZvcm0uY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZUZvcm0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NzRmZWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlRm9ybS5jcHAKQEAgLTAsMCArMSwxNTAxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiRXhlY3V0YWJsZUZvcm0uaCIKKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vTGlzdC5oPgorCisjaW5jbHVkZSA8Zm1sL2NvbW1vbi9TcGVjaWZpZXJFbGVtZW50Lmg+CisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlU3lzdGVtLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9TdGF0ZW1lbnRUeXBlQ2hlY2tlci5oPgorCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0JlaGF2aW9yYWxQYXJ0Lmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1RyYW5zaXRpb24uaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoqCisgKiBTRVRURVIKKyAqIHVwZGF0ZUZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKyAqLwordm9pZCBFeGVjdXRhYmxlRm9ybTo6dXBkYXRlRnVsbHlRdWFsaWZpZWROYW1lSUQoCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEKQoreworCXN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgcG9zID0KKwkJCWFGdWxseVF1YWxpZmllZE5hbWVJRC5maW5kKEZRTl9JRF9ST09UX1NFUEFSQVRPUik7CisJaWYoIHBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisJeworCQlzZXRGdWxseVF1YWxpZmllZE5hbWVJRCggImV4ZWMiICsgYUZ1bGx5UXVhbGlmaWVkTmFtZUlELnN1YnN0cihwb3MpICk7CisJfQorCWVsc2UKKwl7CisJCXNldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCAiZXhlYzo6IiArIGFGdWxseVF1YWxpZmllZE5hbWVJRCApOworCisJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJPDwgIlVuZXhwZWN0ZWQgVUZJIHdpdGhvdXQgTE9DQVRPUiBmb3IgZXhlY3V0YWJsZTo+ICIKKwkJCQk8PCBhRnVsbHlRdWFsaWZpZWROYW1lSUQgPDwgIiAhISEiCisJCQkJPDwgU0VORF9FWElUOworCX0KKworCXNldE5hbWVJRCggTmFtZWRFbGVtZW50OjpleHRyYWN0TmFtZUlEKCBhRnVsbHlRdWFsaWZpZWROYW1lSUQgKSApOworfQorCisKKworLyoqCisgKiBHRVRURVIKKyAqIGFueSBTWU1CT0wgZmlsdGVyaW5nIGJ5IGFuIG9wdGlvbmFsIHR5cGUgc3BlY2lmaWVyIGZhbWlseQorICovCisKKyNkZWZpbmUgSUZfTVVTVF9CRV9NQUNISU5FX1NZTUJPTCAgXAorCQlpZiggKHR5cGVGYW1pbHkgPT0gVFlQRV9NQUNISU5FX1NQRUNJRklFUikgICB8fCAgXAorCQkJKHR5cGVGYW1pbHkgPT0gVFlQRV9VTklWRVJTQUxfU1BFQ0lGSUVSKSB8fCAgXAorCQkJKHR5cGVGYW1pbHkgPT0gVFlQRV9VTkRFRklORURfU1BFQ0lGSUVSKSApCisKKworI2RlZmluZSBJRl9NVVNUX0JFX0dFTkVSSUNfUE9SVF9TWU1CT0wgIFwKKwkJaWYoICh0eXBlRmFtaWx5ID09IFRZUEVfUE9SVF9TUEVDSUZJRVIpICAgICAgfHwgIFwKKwkJCSh0eXBlRmFtaWx5ID09IFRZUEVfU0lHTkFMX1NQRUNJRklFUikgICAgfHwgIFwKKwkJCSh0eXBlRmFtaWx5ID09IFRZUEVfTUVTU0FHRV9TUEVDSUZJRVIpICAgfHwgIFwKKwkJCSh0eXBlRmFtaWx5ID09IFRZUEVfVU5JVkVSU0FMX1NQRUNJRklFUikgfHwgIFwKKwkJCSh0eXBlRmFtaWx5ID09IFRZUEVfVU5ERUZJTkVEX1NQRUNJRklFUikgKQorCisKKyNkZWZpbmUgSUZfTVVTVF9CRV9DSEFOTkVMX1NZTUJPTCAgXAorCQlpZiggKHR5cGVGYW1pbHkgPT0gVFlQRV9DSEFOTkVMX1NQRUNJRklFUikgICB8fCAgXAorCQkJKHR5cGVGYW1pbHkgPT0gVFlQRV9VTklWRVJTQUxfU1BFQ0lGSUVSKSB8fCAgXAorCQkJKHR5cGVGYW1pbHkgPT0gVFlQRV9VTkRFRklORURfU1BFQ0lGSUVSKSApCisKKworI2RlZmluZSBJRl9NVVNUX0JFX0JVRkZFUl9TWU1CT0wgIFwKKwkJaWYoICh0eXBlRmFtaWx5ID09IFRZUEVfQlVGRkVSX1NQRUNJRklFUikgICAgfHwgIFwKKwkJCSh0eXBlRmFtaWx5ID09IFRZUEVfVU5JVkVSU0FMX1NQRUNJRklFUikgfHwgIFwKKwkJCSh0eXBlRmFtaWx5ID09IFRZUEVfVU5ERUZJTkVEX1NQRUNJRklFUikgKQorCisKKyNkZWZpbmUgSUZfTVVTVF9CRV9DT05ORUNUT1JfU1lNQk9MICBcCisJCWlmKCAodHlwZUZhbWlseSA9PSBUWVBFX0NPTk5FQ1RPUl9TUEVDSUZJRVIpIHx8ICBcCisJCQkodHlwZUZhbWlseSA9PSBUWVBFX1VOSVZFUlNBTF9TUEVDSUZJRVIpICB8fCAgXAorCQkJKHR5cGVGYW1pbHkgPT0gVFlQRV9VTkRFRklORURfU1BFQ0lGSUVSKSApCisKKworI2RlZmluZSBBTllUSElOR19FTFNFX0NPTkRJVElPTiAgKCAgXAorCSggdHlwZUZhbWlseSAhPSBUWVBFX01BQ0hJTkVfU1BFQ0lGSUVSICAgICkgJiYgIFwKKwkoIHR5cGVGYW1pbHkgIT0gVFlQRV9QT1JUX1NQRUNJRklFUiAgICAgICApICYmICBcCisJKCB0eXBlRmFtaWx5ICE9IFRZUEVfU0lHTkFMX1NQRUNJRklFUiAgICAgKSAmJiAgXAorCSggdHlwZUZhbWlseSAhPSBUWVBFX01FU1NBR0VfU1BFQ0lGSUVSICAgICkgJiYgIFwKKwkoIHR5cGVGYW1pbHkgIT0gVFlQRV9DSEFOTkVMX1NQRUNJRklFUiAgICApICYmICBcCisJKCB0eXBlRmFtaWx5ICE9IFRZUEVfQlVGRkVSX1NQRUNJRklFUiAgICAgKSAmJiAgXAorCSggdHlwZUZhbWlseSAhPSBUWVBFX0NPTk5FQ1RPUl9TUEVDSUZJRVIgKSApCisKKworI2RlZmluZSBJRl9DT1VMRF9CRV9UWVBFX1NQRUNJRklFUl9TWU1CT0wgIFwKKwkJaWYoIEFOWVRISU5HX0VMU0VfQ09ORElUSU9OICkKKworCisjZGVmaW5lIElGX0NPVUxEX0JFX1RSQU5TSVRJT05fU1lNQk9MICBcCisJCWlmKCBBTllUSElOR19FTFNFX0NPTkRJVElPTiApCisKKworI2RlZmluZSBJRl9DT1VMRF9CRV9HRU5FUklDX1BST0dSQU1fU1lNQk9MICBcCisJCWlmKCBBTllUSElOR19FTFNFX0NPTkRJVElPTiApCisKKworCitjb25zdCBCRiAmIEV4ZWN1dGFibGVGb3JtOjpnZXRTeW1ib2woCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlELAorCQlhdm1fdHlwZV9zcGVjaWZpZXJfa2luZF90IHR5cGVGYW1pbHkpIGNvbnN0Cit7CisJSUZfTVVTVF9CRV9HRU5FUklDX1BPUlRfU1lNQk9MCisJeworCQljb25zdCBTeW1ib2wgJiBmb3VuZFN5bWJvbCA9CisJCQkJbVRhYmxlT2ZQb3J0LmdldEJ5RlFOYW1lSUQoIGFGdWxseVF1YWxpZmllZE5hbWVJRCApOworCQlpZiggZm91bmRTeW1ib2wudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRTeW1ib2wgKTsKKwkJfQorCX0KKworCUlGX01VU1RfQkVfTUFDSElORV9TWU1CT0wKKwl7CisJCWNvbnN0IFN5bWJvbCAmIGZvdW5kU3ltYm9sID0KKwkJCQltVGFibGVPZkluc3RhbmNlU3RhdGljLmdldEJ5RlFOYW1lSUQoIGFGdWxseVF1YWxpZmllZE5hbWVJRCApOworCQlpZiggZm91bmRTeW1ib2wudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRTeW1ib2wgKTsKKwkJfQorCX0KKy8vCUlGX01VU1RfQkVfTUFDSElORV9TWU1CT0wKKy8vCXsKKy8vCQljb25zdCBTeW1ib2wgJiBmb3VuZFN5bWJvbCA9CisJCQkJbVRhYmxlT2ZJbnN0YW5jZU1vZGVsLmdldEJ5RlFOYW1lSUQoIGFGdWxseVF1YWxpZmllZE5hbWVJRCApOworLy8JCWlmKCBmb3VuZFN5bWJvbC52YWxpZCgpICkKKy8vCQl7CisvLwkJCXJldHVybiggZm91bmRTeW1ib2wgKTsKKy8vCQl9CisvLwl9CisKKwlJRl9NVVNUX0JFX0JVRkZFUl9TWU1CT0wKKwl7CisJCWNvbnN0IFN5bWJvbCAmIGZvdW5kU3ltYm9sID0KKwkJCQltVGFibGVPZkJ1ZmZlci5nZXRCeUZRTmFtZUlEKCBhRnVsbHlRdWFsaWZpZWROYW1lSUQgKTsKKwkJaWYoIGZvdW5kU3ltYm9sLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kU3ltYm9sICk7CisJCX0KKwl9CisKKwlJRl9NVVNUX0JFX0NPTk5FQ1RPUl9TWU1CT0wKKwl7CisJCWNvbnN0IFN5bWJvbCAmIGZvdW5kU3ltYm9sID0KKwkJCQltVGFibGVPZkNoYW5uZWwuZ2V0QnlGUU5hbWVJRCggYUZ1bGx5UXVhbGlmaWVkTmFtZUlEICk7CisJCWlmKCBmb3VuZFN5bWJvbC52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCBmb3VuZFN5bWJvbCApOworCQl9CisJfQorCisJSUZfTVVTVF9CRV9DT05ORUNUT1JfU1lNQk9MCisJeworCQljb25zdCBTeW1ib2wgJiBmb3VuZFN5bWJvbCA9CisJCQkJbVRhYmxlT2ZDb25uZWN0LmdldEJ5RlFOYW1lSUQoIGFGdWxseVF1YWxpZmllZE5hbWVJRCApOworCQlpZiggZm91bmRTeW1ib2wudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRTeW1ib2wgKTsKKwkJfQorCX0KKworCisJLy8gVU5DT05ESVRJT05BTAorCXsKKwkJY29uc3QgQkYgJiBmb3VuZFN5bWJvbCA9CisJCQkJQXZtUHJvZ3JhbTo6Z2V0U3ltYm9sKGFGdWxseVF1YWxpZmllZE5hbWVJRCwgdHlwZUZhbWlseSk7CisJCWlmKCBmb3VuZFN5bWJvbC52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCBmb3VuZFN5bWJvbCApOworCQl9CisJfQorCisKKwlJRl9DT1VMRF9CRV9UWVBFX1NQRUNJRklFUl9TWU1CT0wKKwl7CisJCWNvbnN0IEJGICYgZm91bmRTeW1ib2wgPQorCQkJCWdldFR5cGVTcGVjaWZpZXIoKS5nZXRCeUZRTmFtZUlEKCBhRnVsbHlRdWFsaWZpZWROYW1lSUQgKTsKKwkJaWYoIGZvdW5kU3ltYm9sLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kU3ltYm9sICk7CisJCX0KKwl9CisKKwlJRl9DT1VMRF9CRV9UUkFOU0lUSU9OX1NZTUJPTAorCXsKKwkJY29uc3QgQkYgJiBmb3VuZFN5bWJvbCA9CisJCQkJZ2V0VHJhbnNpdGlvbigpLmdldEJ5RlFOYW1lSUQoIGFGdWxseVF1YWxpZmllZE5hbWVJRCApOworCQlpZiggZm91bmRTeW1ib2wudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRTeW1ib2wgKTsKKwkJfQorCX0KKworCUlGX0NPVUxEX0JFX0dFTkVSSUNfUFJPR1JBTV9TWU1CT0wKKwl7CisJCWNvbnN0IEJGICYgZm91bmRTeW1ib2wgPQorCQkJCWdldFByb2dyYW0oKS5nZXRCeUZRTmFtZUlEKCBhRnVsbHlRdWFsaWZpZWROYW1lSUQgKTsKKwkJaWYoIGZvdW5kU3ltYm9sLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kU3ltYm9sICk7CisJCX0KKwl9CisKKwkvLyBVTkNPTkRJVElPTkFMCisJeworCQljb25zdCBTeW1ib2wgJiBmb3VuZFN5bWJvbCA9CisJCQkJZ2V0QWxpYXMoKS5nZXRCeUZRTmFtZUlEKCBhRnVsbHlRdWFsaWZpZWROYW1lSUQgKTsKKwkJaWYoIGZvdW5kU3ltYm9sLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kU3ltYm9sICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworfQorCisKK2NvbnN0IEJGICYgRXhlY3V0YWJsZUZvcm06OmdldFN5bWJvbEJ5UXVhbGlmaWVkTmFtZUlEKAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQsCisJCWF2bV90eXBlX3NwZWNpZmllcl9raW5kX3QgdHlwZUZhbWlseSkgY29uc3QKK3sKKwlJRl9NVVNUX0JFX0dFTkVSSUNfUE9SVF9TWU1CT0wKKwl7CisJCWNvbnN0IFN5bWJvbCAmIGZvdW5kU3ltYm9sID0KKwkJCQltVGFibGVPZlBvcnQuZ2V0QnlRdWFsaWZpZWROYW1lSUQoIGFRdWFsaWZpZWROYW1lSUQgKTsKKwkJaWYoIGZvdW5kU3ltYm9sLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kU3ltYm9sICk7CisJCX0KKwl9CisKKwlJRl9NVVNUX0JFX01BQ0hJTkVfU1lNQk9MCisJeworCQljb25zdCBTeW1ib2wgJiBmb3VuZFN5bWJvbCA9IG1UYWJsZU9mSW5zdGFuY2VTdGF0aWMuCisJCQkJZ2V0QnlRdWFsaWZpZWROYW1lSUQoIGFRdWFsaWZpZWROYW1lSUQgKTsKKwkJaWYoIGZvdW5kU3ltYm9sLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kU3ltYm9sICk7CisJCX0KKwl9CisJSUZfTVVTVF9CRV9NQUNISU5FX1NZTUJPTAorCXsKKwkJY29uc3QgU3ltYm9sICYgZm91bmRTeW1ib2wgPSBtVGFibGVPZkluc3RhbmNlRHluYW1pYy4KKwkJCQlnZXRCeVF1YWxpZmllZE5hbWVJRCggYVF1YWxpZmllZE5hbWVJRCApOworCQlpZiggZm91bmRTeW1ib2wudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRTeW1ib2wgKTsKKwkJfQorCX0KKy8vCUlGX01VU1RfQkVfTUFDSElORV9TWU1CT0wKKy8vCXsKKy8vCQljb25zdCBTeW1ib2wgJiBmb3VuZFN5bWJvbCA9CisvLwkJCQltVGFibGVPZkluc3RhbmNlTW9kZWwuZ2V0QnlRdWFsaWZpZWROYW1lSUQoYVF1YWxpZmllZE5hbWVJRCk7CisvLwkJaWYoIGZvdW5kU3ltYm9sLnZhbGlkKCkgKQorLy8JCXsKKy8vCQkJcmV0dXJuKCBmb3VuZFN5bWJvbCApOworLy8JCX0KKy8vCX0KKworCUlGX01VU1RfQkVfQlVGRkVSX1NZTUJPTAorCXsKKwkJY29uc3QgU3ltYm9sICYgZm91bmRTeW1ib2wgPQorCQkJCW1UYWJsZU9mQnVmZmVyLmdldEJ5UXVhbGlmaWVkTmFtZUlEKGFRdWFsaWZpZWROYW1lSUQpOworCQlpZiggZm91bmRTeW1ib2wudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRTeW1ib2wgKTsKKwkJfQorCX0KKworCUlGX01VU1RfQkVfQ09OTkVDVE9SX1NZTUJPTAorCXsKKwkJY29uc3QgU3ltYm9sICYgZm91bmRTeW1ib2wgPQorCQkJCW1UYWJsZU9mQ29ubmVjdC5nZXRCeVF1YWxpZmllZE5hbWVJRChhUXVhbGlmaWVkTmFtZUlEKTsKKwkJaWYoIGZvdW5kU3ltYm9sLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kU3ltYm9sICk7CisJCX0KKwl9CisKKworCS8vIFVOQ09ORElUSU9OQUwKKwl7CisJCWNvbnN0IEJGICYgZm91bmRTeW1ib2wgPQorCQkJCUF2bVByb2dyYW06OmdldFN5bWJvbEJ5UXVhbGlmaWVkTmFtZUlEKAorCQkJCQkJYVF1YWxpZmllZE5hbWVJRCwgdHlwZUZhbWlseSk7CisJCWlmKCBmb3VuZFN5bWJvbC52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCBmb3VuZFN5bWJvbCApOworCQl9CisJfQorCisKKwlJRl9DT1VMRF9CRV9UWVBFX1NQRUNJRklFUl9TWU1CT0wKKwl7CisJCWNvbnN0IEJGICYgZm91bmRTeW1ib2wgPSBtVGFibGVPZlR5cGVTcGVjaWZpZXIuCisJCQkJZ2V0QnlRdWFsaWZpZWROYW1lSUQoIGFRdWFsaWZpZWROYW1lSUQgKTsKKwkJaWYoIGZvdW5kU3ltYm9sLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kU3ltYm9sICk7CisJCX0KKwl9CisKKwlJRl9DT1VMRF9CRV9UUkFOU0lUSU9OX1NZTUJPTAorCXsKKwkJY29uc3QgQkYgJiBmb3VuZFN5bWJvbCA9IG1UYWJsZU9mVHJhbnNpdGlvbi4KKwkJCQlnZXRCeVF1YWxpZmllZE5hbWVJRCggYVF1YWxpZmllZE5hbWVJRCApOworCQlpZiggZm91bmRTeW1ib2wudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRTeW1ib2wgKTsKKwkJfQorCX0KKworCUlGX0NPVUxEX0JFX0dFTkVSSUNfUFJPR1JBTV9TWU1CT0wKKwl7CisJCWNvbnN0IEJGICYgZm91bmRTeW1ib2wgPSBtVGFibGVPZlByb2dyYW0uCisJCQkJZ2V0QnlRdWFsaWZpZWROYW1lSUQoIGFRdWFsaWZpZWROYW1lSUQgKTsKKwkJaWYoIGZvdW5kU3ltYm9sLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kU3ltYm9sICk7CisJCX0KKwl9CisKKworLy8JLy8gVU5DT05ESVRJT05BTAorLy8JeworLy8JCWNvbnN0IFN5bWJvbCAmIGZvdW5kU3ltYm9sID0KKy8vCQkJCW1UYWJsZU9mQWxpYXMuZ2V0QnlRdWFsaWZpZWROYW1lSUQoIGFRdWFsaWZpZWROYW1lSUQgKTsKKy8vCQlpZiggZm91bmRTeW1ib2wudmFsaWQoKSApCisvLwkJeworLy8JCQlyZXR1cm4oIGZvdW5kU3ltYm9sICk7CisvLwkJfQorLy8JfQorCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKK30KKworCitjb25zdCBCRiAmIEV4ZWN1dGFibGVGb3JtOjpnZXRTeW1ib2xCeU5hbWVJRChjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsCisJCWF2bV90eXBlX3NwZWNpZmllcl9raW5kX3QgdHlwZUZhbWlseSkgY29uc3QKK3sKKwlJRl9NVVNUX0JFX0dFTkVSSUNfUE9SVF9TWU1CT0wKKwl7CisJCWNvbnN0IFN5bWJvbCAmIGZvdW5kU3ltYm9sID0gbVRhYmxlT2ZQb3J0LmdldEJ5TmFtZUlEKGFOYW1lSUQpOworCQlpZiggZm91bmRTeW1ib2wudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRTeW1ib2wgKTsKKwkJfQorCX0KKworCUlGX01VU1RfQkVfTUFDSElORV9TWU1CT0wKKwl7CisJCWNvbnN0IFN5bWJvbCAmIGZvdW5kU3ltYm9sID0KKwkJCQltVGFibGVPZkluc3RhbmNlU3RhdGljLmdldEJ5TmFtZUlEKGFOYW1lSUQpOworCQlpZiggZm91bmRTeW1ib2wudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRTeW1ib2wgKTsKKwkJfQorCX0KKy8vCUlGX01VU1RfQkVfTUFDSElORV9TWU1CT0wKKy8vCXsKKy8vCQljb25zdCBTeW1ib2wgJiBmb3VuZFN5bWJvbCA9CisvLwkJCQltVGFibGVPZkluc3RhbmNlTW9kZWwuZ2V0QnlOYW1lSUQoYU5hbWVJRCk7CisvLwkJaWYoIGZvdW5kU3ltYm9sLnZhbGlkKCkgKQorLy8JCXsKKy8vCQkJcmV0dXJuKCBmb3VuZFN5bWJvbCApOworLy8JCX0KKy8vCX0KKworCUlGX01VU1RfQkVfQlVGRkVSX1NZTUJPTAorCXsKKwkJY29uc3QgU3ltYm9sICYgZm91bmRTeW1ib2wgPSBtVGFibGVPZkJ1ZmZlci5nZXRCeU5hbWVJRChhTmFtZUlEKTsKKwkJaWYoIGZvdW5kU3ltYm9sLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kU3ltYm9sICk7CisJCX0KKwl9CisKKwlJRl9NVVNUX0JFX0NPTk5FQ1RPUl9TWU1CT0wKKwl7CisJCWNvbnN0IFN5bWJvbCAmIGZvdW5kU3ltYm9sID0gbVRhYmxlT2ZDb25uZWN0LmdldEJ5TmFtZUlEKGFOYW1lSUQpOworCQlpZiggZm91bmRTeW1ib2wudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRTeW1ib2wgKTsKKwkJfQorCX0KKworCisJLy8gVU5DT05ESVRJT05BTAorCXsKKwkJY29uc3QgQkYgJiBmb3VuZFN5bWJvbCA9CisJCQkJQXZtUHJvZ3JhbTo6Z2V0U3ltYm9sQnlOYW1lSUQoYU5hbWVJRCwgdHlwZUZhbWlseSk7CisJCWlmKCBmb3VuZFN5bWJvbC52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCBmb3VuZFN5bWJvbCApOworCQl9CisJfQorCisKKwlJRl9DT1VMRF9CRV9UWVBFX1NQRUNJRklFUl9TWU1CT0wKKwl7CisJCWNvbnN0IEJGICYgZm91bmRTeW1ib2wgPSBtVGFibGVPZlR5cGVTcGVjaWZpZXIuZ2V0QnlOYW1lSUQoYU5hbWVJRCk7CisJCWlmKCBmb3VuZFN5bWJvbC52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCBmb3VuZFN5bWJvbCApOworCQl9CisJfQorCisJSUZfQ09VTERfQkVfVFJBTlNJVElPTl9TWU1CT0wKKwl7CisJCWNvbnN0IEJGICYgZm91bmRTeW1ib2wgPSBtVGFibGVPZlRyYW5zaXRpb24uZ2V0QnlOYW1lSUQoYU5hbWVJRCk7CisJCWlmKCBmb3VuZFN5bWJvbC52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCBmb3VuZFN5bWJvbCApOworCQl9CisJfQorCisJSUZfQ09VTERfQkVfR0VORVJJQ19QUk9HUkFNX1NZTUJPTAorCXsKKwkJY29uc3QgQkYgJiBmb3VuZFN5bWJvbCA9IG1UYWJsZU9mUHJvZ3JhbS5nZXRCeU5hbWVJRChhTmFtZUlEKTsKKwkJaWYoIGZvdW5kU3ltYm9sLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kU3ltYm9sICk7CisJCX0KKwl9CisKKworLy8JLy8gVU5DT05ESVRJT05BTAorLy8JeworLy8JCWNvbnN0IFN5bWJvbCAmIGZvdW5kU3ltYm9sID0gbVRhYmxlT2ZBbGlhcy5nZXRCeU5hbWVJRChpZCk7CisvLwkJaWYoIGZvdW5kU3ltYm9sLnZhbGlkKCkgKQorLy8JCXsKKy8vCQkJcmV0dXJuKCBmb3VuZFN5bWJvbCApOworLy8JCX0KKy8vCX0KKworCXJldHVybiggQkY6OlJFRl9OVUxMICk7Cit9CisKKworY29uc3QgQkYgJiBFeGVjdXRhYmxlRm9ybTo6Z2V0U3ltYm9sQnlBc3RFbGVtZW50KAorCQljb25zdCBPYmplY3RFbGVtZW50ICogYXN0RWxlbWVudCwKKwkJYXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCB0eXBlRmFtaWx5KSBjb25zdAoreworCUlGX01VU1RfQkVfR0VORVJJQ19QT1JUX1NZTUJPTAorCXsKKwkJY29uc3QgU3ltYm9sICYgZm91bmRTeW1ib2wgPSBtVGFibGVPZlBvcnQuZ2V0QnlBc3RFbGVtZW50KGFzdEVsZW1lbnQpOworCQlpZiggZm91bmRTeW1ib2wudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRTeW1ib2wgKTsKKwkJfQorCX0KKworCUlGX01VU1RfQkVfTUFDSElORV9TWU1CT0wKKwl7CisJCWNvbnN0IFN5bWJvbCAmIGZvdW5kU3ltYm9sID0gZ2V0QnlBc3RJbnN0YW5jZVN0YXRpYyhhc3RFbGVtZW50KTsKKwkJaWYoIGZvdW5kU3ltYm9sLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kU3ltYm9sICk7CisJCX0KKwl9CisKKwlJRl9NVVNUX0JFX0JVRkZFUl9TWU1CT0wKKwl7CisJCWNvbnN0IFN5bWJvbCAmIGZvdW5kU3ltYm9sID0gbVRhYmxlT2ZCdWZmZXIuZ2V0QnlBc3RFbGVtZW50KGFzdEVsZW1lbnQpOworCQlpZiggZm91bmRTeW1ib2wudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRTeW1ib2wgKTsKKwkJfQorCX0KKworCUlGX01VU1RfQkVfQ0hBTk5FTF9TWU1CT0wKKwl7CisJCWNvbnN0IFN5bWJvbCAmIGZvdW5kU3ltYm9sID0gbVRhYmxlT2ZDaGFubmVsLmdldEJ5QXN0RWxlbWVudChhc3RFbGVtZW50KTsKKwkJaWYoIGZvdW5kU3ltYm9sLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kU3ltYm9sICk7CisJCX0KKwl9CisKKwlJRl9NVVNUX0JFX0NPTk5FQ1RPUl9TWU1CT0wKKwl7CisJCWNvbnN0IFN5bWJvbCAmIGZvdW5kU3ltYm9sID0gbVRhYmxlT2ZDb25uZWN0LmdldEJ5QXN0RWxlbWVudChhc3RFbGVtZW50KTsKKwkJaWYoIGZvdW5kU3ltYm9sLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kU3ltYm9sICk7CisJCX0KKwl9CisKKworCS8vIFVOQ09ORElUSU9OQUwKKwl7CisJCWNvbnN0IEJGICYgZm91bmRTeW1ib2wgPQorCQkJCUF2bVByb2dyYW06OmdldFN5bWJvbEJ5QXN0RWxlbWVudChhc3RFbGVtZW50LCB0eXBlRmFtaWx5KTsKKwkJaWYoIGZvdW5kU3ltYm9sLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kU3ltYm9sICk7CisJCX0KKwl9CisKKworCUlGX0NPVUxEX0JFX1RZUEVfU1BFQ0lGSUVSX1NZTUJPTAorCXsKKwkJY29uc3QgQkYgJiBmb3VuZFN5bWJvbCA9IGdldFR5cGVTcGVjaWZpZXIoKS5nZXRCeUFzdEVsZW1lbnQoYXN0RWxlbWVudCk7CisJCWlmKCBmb3VuZFN5bWJvbC52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCBmb3VuZFN5bWJvbCApOworCQl9CisJfQorCisJSUZfQ09VTERfQkVfVFJBTlNJVElPTl9TWU1CT0wKKwl7CisJCWNvbnN0IEJGICYgZm91bmRTeW1ib2wgPSBnZXRUcmFuc2l0aW9uKCkuZ2V0QnlBc3RFbGVtZW50KGFzdEVsZW1lbnQpOworCQlpZiggZm91bmRTeW1ib2wudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRTeW1ib2wgKTsKKwkJfQorCX0KKworCUlGX0NPVUxEX0JFX0dFTkVSSUNfUFJPR1JBTV9TWU1CT0wKKwl7CisJCWNvbnN0IEJGICYgZm91bmRTeW1ib2wgPSBnZXRQcm9ncmFtKCkuZ2V0QnlBc3RFbGVtZW50KGFzdEVsZW1lbnQpOworCQlpZiggZm91bmRTeW1ib2wudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRTeW1ib2wgKTsKKwkJfQorCX0KKworCisJLy8gVU5DT05ESVRJT05BTAorCXsKKwkJY29uc3QgU3ltYm9sICYgZm91bmRTeW1ib2wgPSBnZXRBbGlhcygpLmdldEJ5QXN0RWxlbWVudChhc3RFbGVtZW50KTsKKwkJaWYoIGZvdW5kU3ltYm9sLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kU3ltYm9sICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworfQorCisKKy8qKgorICogR0VUVEVSIC0gU0VUVEVSCisgKiBNYWNoaW5lIENvdW50CisgKi8KK2F2bV9zaXplX3QgRXhlY3V0YWJsZUZvcm06OmdldHJlY01hY2hpbmVDb3VudCgpIGNvbnN0Cit7CisJYXZtX3NpemVfdCBjb3VudCA9IDA7CisKKwlpZiggaGFzSW5zdGFuY2VTdGF0aWMoKSApCisJeworCQlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBpdE1hY2hpbmUgPSBpbnN0YW5jZV9zdGF0aWNfYmVnaW4oKTsKKwkJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBpbnN0YW5jZV9zdGF0aWNfZW5kKCk7CisJCWZvciggOyBpdE1hY2hpbmUgIT0gZW5kSXQgOyArK2l0TWFjaGluZSApCisJCXsKKwkJCWNvdW50ICs9IDE7CisKKwkJCWlmKCAoKml0TWFjaGluZSkuaGFzRXhlY3V0YWJsZSgpICkKKwkJCXsKKwkJCQljb3VudCArPSAoKml0TWFjaGluZSkuZ2V0RXhlY3V0YWJsZSgpLT5nZXRyZWNNYWNoaW5lQ291bnQoKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4oIGNvdW50ICk7Cit9CisKKworCisvKioKKyAqIEV4ZWN1dGFibGVGb3JtOjpMQ0EKKyAqCisgKi8KK2NvbnN0IEV4ZWN1dGFibGVGb3JtICogRXhlY3V0YWJsZUZvcm06OkxDQSgKKwkJY29uc3QgRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGUpIGNvbnN0Cit7CisJTGlzdDwgY29uc3QgRXhlY3V0YWJsZUZvcm0gKiA+IGNvbnRhaW5lckxpc3RPZlRoaXM7CisJY29udGFpbmVyTGlzdE9mVGhpcy5wdXNoX2JhY2sodGhpcyk7CisKKwlFeGVjdXRhYmxlRm9ybSAqIGNvbnRhaW5lck9mVGhpcyA9IHRoaXMtPmdldEV4ZWN1dGFibGVDb250YWluZXIoKTsKKwlmb3IgKCA7IGNvbnRhaW5lck9mVGhpcyAhPSBOVUxMIDsKKwkJCWNvbnRhaW5lck9mVGhpcyA9IGNvbnRhaW5lck9mVGhpcy0+Z2V0RXhlY3V0YWJsZUNvbnRhaW5lcigpICkKKwl7CisJCWNvbnRhaW5lckxpc3RPZlRoaXMucHVzaF9iYWNrKGNvbnRhaW5lck9mVGhpcyk7CisJfQorCisJTGlzdDwgY29uc3QgRXhlY3V0YWJsZUZvcm0gKiA+IGNvbnRhaW5lckxpc3RPZk90aGVyRXhlY3V0YWJsZTsKKwljb250YWluZXJMaXN0T2ZPdGhlckV4ZWN1dGFibGUucHVzaF9iYWNrKGFuRXhlY3V0YWJsZSk7CisKKwlFeGVjdXRhYmxlRm9ybSAqIGNvbnRhaW5lck9mT3RoZXJGb3JtID0gYW5FeGVjdXRhYmxlLT5nZXRFeGVjdXRhYmxlQ29udGFpbmVyKCk7CisJZm9yICggOyBjb250YWluZXJPZk90aGVyRm9ybSAhPSBOVUxMIDsKKwkJY29udGFpbmVyT2ZPdGhlckZvcm0gPSBjb250YWluZXJPZk90aGVyRm9ybS0+Z2V0RXhlY3V0YWJsZUNvbnRhaW5lcigpICkKKwl7CisJCWNvbnRhaW5lckxpc3RPZk90aGVyRXhlY3V0YWJsZS5wdXNoX2JhY2soY29udGFpbmVyT2ZPdGhlckZvcm0pOworCX0KKworCUxpc3Q8IGNvbnN0IEV4ZWN1dGFibGVGb3JtICogPjo6Y29uc3RfaXRlcmF0b3Igb3RoZXJJdDsKKwlMaXN0PCBjb25zdCBFeGVjdXRhYmxlRm9ybSAqID46OgorCWNvbnN0X2l0ZXJhdG9yIG9uZUl0ID0gY29udGFpbmVyTGlzdE9mVGhpcy5iZWdpbigpOworCWZvciAoIDsgb25lSXQgIT0gY29udGFpbmVyTGlzdE9mVGhpcy5lbmQoKSA7IG9uZUl0KysgKQorCXsKKwkJb3RoZXJJdCA9IGNvbnRhaW5lckxpc3RPZk90aGVyRXhlY3V0YWJsZS5iZWdpbigpOworCQlmb3IgKCA7IG90aGVySXQgIT0gY29udGFpbmVyTGlzdE9mT3RoZXJFeGVjdXRhYmxlLmVuZCgpIDsgKytvdGhlckl0ICkKKwkJeworCQkJaWYoICgqb25lSXQpID09ICgqb3RoZXJJdCkgKQorCQkJeworLy8JCQkJQVZNX09TX0xPRyA8PCAiTENBICggIgorLy8JCQkJCTw8IG9uZUV4ZWN1dGFibGUtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKy8vCQkJCQk8PCAiICwgIiA8PCBvdGhlckV4ZWN1dGFibGUtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKy8vCQkJCQk8PCAiICkgPSAiIDw8ICgqb25lSXQpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOworCisJCQkJcmV0dXJuKCAqb25lSXQgKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiggTlVMTCApOworfQorCisKKy8qCisgKiBHRVRURVIgLSBTRVRURVIKKyAqIFNpbmdsZSBvciBNdWx0aXBsZQorICogSW5zdGFuY2lhdGlvbiBJbmZvcm1hdGlvbgorICogZm9yIERhdGEgQWNjZXNzIG9wdGltaXNhdGlvbgorICovCit2b2lkIEV4ZWN1dGFibGVGb3JtOjppbmNyUG9zc2libGVTdGF0aWNJbnN0YW5jaWF0aW9uQ291bnQoYXZtX29mZnNldF90IG9mZnNldCkKK3sKKwltUG9zc2libGVTdGF0aWNJbnN0YW5jaWF0aW9uQ291bnQgKz0gb2Zmc2V0OworCisJaWYoIG1Qb3NzaWJsZVN0YXRpY0luc3RhbmNpYXRpb25Db3VudCA+IDEgKQorCXsKKwkJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgaXRJbnN0YWJjZSA9IGluc3RhbmNlX3N0YXRpY19iZWdpbigpOworCQlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBlbmRJbnN0YWJjZSA9IGluc3RhbmNlX3N0YXRpY19lbmQoKTsKKwkJZm9yKCA7IGl0SW5zdGFiY2UgIT0gZW5kSW5zdGFiY2UgOyArK2l0SW5zdGFiY2UgKQorCQl7CisJCQkoKml0SW5zdGFiY2UpLmdldEV4ZWN1dGFibGUoKS0+CisJCQkJCWluY3JQb3NzaWJsZVN0YXRpY0luc3RhbmNpYXRpb25Db3VudChvZmZzZXQpOworCQl9CisJfQorfQorCisKK3ZvaWQgRXhlY3V0YWJsZUZvcm06OmluY3JQb3NzaWJsZUR5bmFtaWNJbnN0YW5jaWF0aW9uQ291bnQoYXZtX3NpemVfdCBvZmZzZXQpCit7CisJbVBvc3NpYmxlRHluYW1pY0luc3RhbmNpYXRpb25Db3VudCArPSBvZmZzZXQ7CisKKwlpZiggbVBvc3NpYmxlRHluYW1pY0luc3RhbmNpYXRpb25Db3VudCA+IDEgKQorCXsKKwkJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgaXRJbnN0YWJjZSA9IGluc3RhbmNlX3N0YXRpY19iZWdpbigpOworCQlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBlbmRJbnN0YWJjZSA9IGluc3RhbmNlX3N0YXRpY19lbmQoKTsKKwkJZm9yKCA7IGl0SW5zdGFiY2UgIT0gZW5kSW5zdGFiY2UgOyArK2l0SW5zdGFiY2UgKQorCQl7CisJCQkoKml0SW5zdGFiY2UpLmdldEV4ZWN1dGFibGUoKS0+CisJCQkJCWluY3JQb3NzaWJsZUR5bmFtaWNJbnN0YW5jaWF0aW9uQ291bnQob2Zmc2V0KTsKKwkJfQorCX0KK30KKworCitib29sIEV4ZWN1dGFibGVGb3JtOjpoYXNTaW5nbGVSdW50aW1lSW5zdGFuY2UoKQoreworLy8JQVZNX09TX0NPVVQgPDwgc3RyTW9kaWZpZXIoKSA8PCAiZXhlY3V0YWJsZTwgbW9rOiIKKy8vCQkJPDwgZ2V0U3BlY2lmaWVyKCkuc3RyKCkKKy8vCQkJPDwgIiAsIGlkOiIgPDwgZ2V0T2Zmc2V0KCkKKy8vCQkJPDwgIiAsIHBpYzooc3RhdGljOiIgPDwgbVBvc3NpYmxlU3RhdGljSW5zdGFuY2lhdGlvbkNvdW50CisvLwkJCTw8ICIgLCBkeW5hbWljOiIgPDwgbVBvc3NpYmxlRHluYW1pY0luc3RhbmNpYXRpb25Db3VudCA8PCAiKSIKKy8vCQkJPDwgIiAsIGluc3RhbmNlOihpbml0OiIgPDwgbUluaXRpYWxJbnN0YW5jZUNvdW50CisvLwkJCTw8ICIgLCBtYXg6IiA8PCAoIChtTWF4aW1hbEluc3RhbmNlQ291bnQgPT0gQVZNX05VTUVSSUNfTUFYX1NJWkVfVCkgPworLy8JCQkJCS0xIDogc3RhdGljX2Nhc3Q8IGF2bV9pbnQ2NF90ID4obU1heGltYWxJbnN0YW5jZUNvdW50KSApCisvLwkJCTw8ICIpID4gIiA8PCBnZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbDsKKworCWlmKCAobVBvc3NpYmxlU3RhdGljSW5zdGFuY2lhdGlvbkNvdW50ID4gMSkgfHwKKwkJKG1Qb3NzaWJsZUR5bmFtaWNJbnN0YW5jaWF0aW9uQ291bnQgPiAwKSApCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJZWxzZQorCXsKKwkJRXhlY3V0YWJsZUZvcm0gKiBjb250YWluZXJFeGVjID0gZ2V0RXhlY3V0YWJsZUNvbnRhaW5lcigpOworCisJCWlmKCAoY29udGFpbmVyRXhlYyAhPSBOVUxMKSAmJgorCQkJKG5vdCBjb250YWluZXJFeGVjLT5oYXNTaW5nbGVSdW50aW1lSW5zdGFuY2UoKSkgKQorCQl7CisJCQltUG9zc2libGVEeW5hbWljSW5zdGFuY2lhdGlvbkNvdW50ID0gMTsKKworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorfQorCisKKy8qKgorICogR0VUVEVSIC0gU0VUVEVSCisgKiBtTXV0YWJsZVNjaGVkdWxlRmxhZworICogTU9DIEF0dHJpYnV0ZSBmb3IgbXV0YWJsZSBTY2hlZHVsZQorICovCisKK2Jvb2wgRXhlY3V0YWJsZUZvcm06OmlzSW5saW5hYmxlU2NoZWR1bGUoKSBjb25zdAoreworLy8JaWYoIG5vdCBoYXNTaW5nbGVSdW50aW1lSW5zdGFuY2UoKSApCisvLwl7CisvLwkJcmV0dXJuKCBmYWxzZSApOworLy8JfQorCisJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgaXRNb2RlbCA9IGluc3RhbmNlX21vZGVsX2JlZ2luKCk7CisJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgZW5kTW9kZWwgPSBpbnN0YW5jZV9tb2RlbF9lbmQoKTsKKwlmb3IoIDsgaXRNb2RlbCAhPSBlbmRNb2RlbCA7ICsraXRNb2RlbCApCisJeworCQlpZiggbm90ICgqaXRNb2RlbCkuZ2V0RXhlY3V0YWJsZSgpLT5oYXNTaW5nbGVSdW50aW1lSW5zdGFuY2UoKSApCisJCXsKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KKworCXJldHVybiggKG5vdCBtTXV0YWJsZVNjaGVkdWxlRmxhZykgKTsKK30KKworCisKKy8qKgorICogR0VUVEVSCisgKiBvbiBhY3Rpdml0eSBieSBvcGNvZGUKKyAqLworQXZtUHJvZ3JhbSAmIEV4ZWN1dGFibGVGb3JtOjpnZXRPbkFjdGl2aXR5Um91dGluZShBVk1fT1BDT0RFIG9wQ29kZSkKK3sKKwlzd2l0Y2goIG9wQ29kZSApCisJeworCQljYXNlIEFWTV9PUENPREVfSU5JVDoKKwkJeworCQkJcmV0dXJuKCBnZXRPbkluaXRSb3V0aW5lKCkgKTsKKwkJfQorCQljYXNlIEFWTV9PUENPREVfRklOQUw6CisJCWNhc2UgQVZNX09QQ09ERV9ERVNUUk9ZOgorCQl7CisJCQlyZXR1cm4oIGdldE9uRmluYWxSb3V0aW5lKCkgKTsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9SRVRVUk46CisJCXsKKwkJCXJldHVybiggZ2V0T25SZXR1cm5Sb3V0aW5lKCkgKTsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9TVEFSVDoKKwkJY2FzZSBBVk1fT1BDT0RFX1JFU1RBUlQ6CisJCXsKKwkJCXJldHVybiggZ2V0T25TdGFydFJvdXRpbmUoKSApOworCQl9CisJCWNhc2UgQVZNX09QQ09ERV9TVE9QOgorCQl7CisJCQlyZXR1cm4oIGdldE9uU3RvcFJvdXRpbmUoKSApOworCQl9CisKKy8vCQljYXNlIEFWTV9PUENPREVfV0FJVDoKKy8vCQljYXNlIEFWTV9PUENPREVfU1VTUEVORDoKKy8vCQljYXNlIEFWTV9PUENPREVfUkVTVU1FOgorCisJCWNhc2UgQVZNX09QQ09ERV9JRU5BQkxFX0lOVk9LRToKKwkJeworCQkJcmV0dXJuKCBnZXRPbklFbmFibGVSb3V0aW5lKCkgKTsKKwkJfQorCQljYXNlIEFWTV9PUENPREVfRU5BQkxFX0lOVk9LRToKKwkJeworCQkJcmV0dXJuKCBnZXRPbkVuYWJsZVJvdXRpbmUoKSApOworCQl9CisvLwkJY2FzZSBBVk1fT1BDT0RFX0VOQUJMRV9TRVQ6CisKKwkJY2FzZSBBVk1fT1BDT0RFX0lESVNBQkxFX0lOVk9LRToKKwkJeworCQkJcmV0dXJuKCBnZXRPbklEaXNhYmxlUm91dGluZSgpICk7CisJCX0KKwkJY2FzZSBBVk1fT1BDT0RFX0RJU0FCTEVfSU5WT0tFOgorCQl7CisJCQlyZXR1cm4oIGdldE9uRGlzYWJsZVJvdXRpbmUoKSApOworCQl9CisvLwkJY2FzZSBBVk1fT1BDT0RFX0RJU0FCTEVfU0VUOgorCisvLwkJY2FzZSBBVk1fT1BDT0RFX0RJU0FCTEVfQ0hJTEQ6CisvLwkJY2FzZSBBVk1fT1BDT0RFX0RJU0FCTEVfU0VMRjoKKy8vCQljYXNlIEFWTV9PUENPREVfRElTQUJMRV9TRUxWRVM6CisKKwkJY2FzZSBBVk1fT1BDT0RFX0lBQk9SVF9JTlZPS0U6CisJCXsKKwkJCXJldHVybiggZ2V0T25JQWJvcnRSb3V0aW5lKCkgKTsKKwkJfQorCQljYXNlIEFWTV9PUENPREVfQUJPUlRfSU5WT0tFOgorCQl7CisJCQlyZXR1cm4oIGdldE9uQWJvcnRSb3V0aW5lKCkgKTsKKwkJfQorLy8JCWNhc2UgQVZNX09QQ09ERV9BQk9SVF9TRVQ6CisKKy8vCQljYXNlIEFWTV9PUENPREVfQUJPUlRfQ0hJTEQ6CisvLwkJY2FzZSBBVk1fT1BDT0RFX0FCT1JUX1NFTEY6CisvLwkJY2FzZSBBVk1fT1BDT0RFX0FCT1JUX1NFTFZFUzoKKworCQljYXNlIEFWTV9PUENPREVfSVJVTjoKKwkJeworCQkJcmV0dXJuKCBnZXRPbklSdW5Sb3V0aW5lKCkgKTsKKwkJfQorCQljYXNlIEFWTV9PUENPREVfUlVOOgorCQl7CisJCQlyZXR1cm4oIGdldE9uUnVuUm91dGluZSgpICk7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfUlRDOgorCQl7CisJCQlyZXR1cm4oIGdldE9uUnRjUm91dGluZSgpICk7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfU0NIRURVTEVfSU5WT0tFOgorCQl7CisJCQlyZXR1cm4oIGdldE9uU2NoZWR1bGVSb3V0aW5lKCkgKTsKKwkJfQorCisvLwkJY2FzZSBBVk1fT1BDT0RFX0RFRkVSX0lOVk9LRToKKworCQlkZWZhdWx0OgorCQl7CisJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQk8PCAiRXhlY3V0YWJsZUZvcm06OmdldE9uQWN0aXZpdHlSb3V0aW5lOj4gIgorCQkJCQkJIlVuZXhwZWN0ZWQgQVZNX09QQ09ERSAhISEiCisJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJcmV0dXJuKCBnZXRPblNjaGVkdWxlUm91dGluZSgpICk7CisJCX0KKwl9Cit9CisKKworY29uc3QgQkZDb2RlICYgRXhlY3V0YWJsZUZvcm06OmdldE9uQWN0aXZpdHkoQVZNX09QQ09ERSBvcENvZGUpIGNvbnN0Cit7CisJc3dpdGNoKCBvcENvZGUgKQorCXsKKwkJY2FzZSBBVk1fT1BDT0RFX0lOSVQ6CisJCXsKKwkJCXJldHVybiggZ2V0T25Jbml0KCkgKTsKKwkJfQorCQljYXNlIEFWTV9PUENPREVfRklOQUw6CisJCWNhc2UgQVZNX09QQ09ERV9ERVNUUk9ZOgorCQl7CisJCQlyZXR1cm4oIGdldE9uRmluYWwoKSApOworCQl9CisKKwkJY2FzZSBBVk1fT1BDT0RFX1JFVFVSTjoKKwkJeworCQkJcmV0dXJuKCBnZXRPblJldHVybigpICk7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfU1RBUlQ6CisJCWNhc2UgQVZNX09QQ09ERV9SRVNUQVJUOgorCQl7CisJCQlyZXR1cm4oIGdldE9uU3RhcnQoKSApOworCQl9CisJCWNhc2UgQVZNX09QQ09ERV9TVE9QOgorCQl7CisJCQlyZXR1cm4oIGdldE9uU3RvcCgpICk7CisJCX0KKworLy8JCWNhc2UgQVZNX09QQ09ERV9XQUlUOgorLy8JCWNhc2UgQVZNX09QQ09ERV9TVVNQRU5EOgorLy8JCWNhc2UgQVZNX09QQ09ERV9SRVNVTUU6CisKKwkJY2FzZSBBVk1fT1BDT0RFX0lFTkFCTEVfSU5WT0tFOgorCQl7CisJCQlyZXR1cm4oIGdldE9uSUVuYWJsZSgpICk7CisJCX0KKwkJY2FzZSBBVk1fT1BDT0RFX0VOQUJMRV9JTlZPS0U6CisJCXsKKwkJCXJldHVybiggZ2V0T25FbmFibGUoKSApOworCQl9CisvLwkJY2FzZSBBVk1fT1BDT0RFX0VOQUJMRV9TRVQ6CisKKwkJY2FzZSBBVk1fT1BDT0RFX0lESVNBQkxFX0lOVk9LRToKKwkJeworCQkJcmV0dXJuKCBnZXRPbklEaXNhYmxlKCkgKTsKKwkJfQorCQljYXNlIEFWTV9PUENPREVfRElTQUJMRV9JTlZPS0U6CisJCXsKKwkJCXJldHVybiggZ2V0T25EaXNhYmxlKCkgKTsKKwkJfQorLy8JCWNhc2UgQVZNX09QQ09ERV9ESVNBQkxFX1NFVDoKKworLy8JCWNhc2UgQVZNX09QQ09ERV9ESVNBQkxFX0NISUxEOgorLy8JCWNhc2UgQVZNX09QQ09ERV9ESVNBQkxFX1NFTEY6CisvLwkJY2FzZSBBVk1fT1BDT0RFX0RJU0FCTEVfU0VMVkVTOgorCisJCWNhc2UgQVZNX09QQ09ERV9JQUJPUlRfSU5WT0tFOgorCQl7CisJCQlyZXR1cm4oIGdldE9uSUFib3J0KCkgKTsKKwkJfQorCQljYXNlIEFWTV9PUENPREVfQUJPUlRfSU5WT0tFOgorCQl7CisJCQlyZXR1cm4oIGdldE9uQWJvcnQoKSApOworCQl9CisvLwkJY2FzZSBBVk1fT1BDT0RFX0FCT1JUX1NFVDoKKworLy8JCWNhc2UgQVZNX09QQ09ERV9BQk9SVF9DSElMRDoKKy8vCQljYXNlIEFWTV9PUENPREVfQUJPUlRfU0VMRjoKKy8vCQljYXNlIEFWTV9PUENPREVfQUJPUlRfU0VMVkVTOgorCisJCWNhc2UgQVZNX09QQ09ERV9JUlVOOgorCQl7CisJCQlyZXR1cm4oIGdldE9uSVJ1bigpICk7CisJCX0KKwkJY2FzZSBBVk1fT1BDT0RFX1JVTjoKKwkJeworCQkJcmV0dXJuKCBnZXRPblJ1bigpICk7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfUlRDOgorCQl7CisJCQlyZXR1cm4oIGdldE9uUnRjKCkgKTsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9TQ0hFRFVMRV9JTlZPS0U6CisJCXsKKwkJCXJldHVybiggZ2V0T25TY2hlZHVsZSgpICk7CisJCX0KKworLy8JCWNhc2UgQVZNX09QQ09ERV9ERUZFUl9JTlZPS0U6CisKKwkJZGVmYXVsdDoKKwkJeworCQkJcmV0dXJuKCBCRkNvZGU6OlJFRl9OVUxMICk7CisJCX0KKwl9Cit9CisKKworLyoqCisgKiBTZXJpYWxpemF0aW9uCisgKi8KK3ZvaWQgRXhlY3V0YWJsZUZvcm06OmhlYWRlcihPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlvcyA8PCBnZXRNb2RpZmllcigpLnRvU3RyaW5nKCkKKwkJCTw8IGdldFNwZWNpZmllcigpLnRvU3RyaW5nKCBTcGVjaWZpZXI6OkVOQUJMRV9GRUFUVVJFX0RFU0lHTl9GSUVMRCApCisJCQk8PCAiZXhlY3V0YWJsZTwgbW9jOiAiCisJCQk8PCBnZXRTcGVjaWZpZXIoKS5zdHIoIFNwZWNpZmllcjo6RElTQUJMRV9GRUFUVVJFX0RFU0lHTl9GSUVMRCApCisJCQk8PCAiICwgaWQ6IiA8PCBnZXRPZmZzZXQoKTsKKworCUluc3RhbmNlU3BlY2lmaWVyUGFydDo6c3RyTXVsdGlwbGljaXR5KAorCQkJb3MsIG1Qb3NzaWJsZVN0YXRpY0luc3RhbmNpYXRpb25Db3VudCwKKwkJCW1Qb3NzaWJsZUR5bmFtaWNJbnN0YW5jaWF0aW9uQ291bnQsCisJCQltTWF4aW1hbEluc3RhbmNlQ291bnQsICIsIGluc3RhbmNpYXRpb246IFsgIiwgIiBdIik7CisKKy8vQVZNX0lGX0RFQlVHX0VOQUJMRURfQU5EKAorLy8JCWdldFNwZWNpZmllcigpLmlzRmFtaWx5Q29tcG9uZW50Q29tcG9zaXRlKCkKKy8vCQkmJiAoIChtUG9zc2libGVTdGF0aWNJbnN0YW5jaWF0aW9uQ291bnQgIT0gMSkKKy8vCQkJfHwgKG1Qb3NzaWJsZUR5bmFtaWNJbnN0YW5jaWF0aW9uQ291bnQgPiAwKSApICkKKy8vCW9zIDw8ICIgLCBwaWM6KHN0YXRpYzoiIDw8IG1Qb3NzaWJsZVN0YXRpY0luc3RhbmNpYXRpb25Db3VudAorLy8JCQk8PCAiICwgZHluYW1pYzoiIDw8IG1Qb3NzaWJsZUR5bmFtaWNJbnN0YW5jaWF0aW9uQ291bnQgPDwgIikiOworLy9BVk1fRU5ESUZfREVCVUdfRU5BQkxFRAorLy8KKy8vQVZNX0lGX0RFQlVHX0VOQUJMRURfQU5EKAorLy8JCWdldFNwZWNpZmllcigpLmlzRmFtaWx5Q29tcG9uZW50Q29tcG9zaXRlKCkKKy8vCQkmJiAoIChtSW5pdGlhbEluc3RhbmNlQ291bnQgIT0gMSkKKy8vCQkJfHwgKG1NYXhpbWFsSW5zdGFuY2VDb3VudCAhPSBBVk1fTlVNRVJJQ19NQVhfU0laRV9UKSApICkKKy8vCW9zIDw8ICIgLCBpbnN0YW5jZTooaW5pdDoiIDw8IG1Jbml0aWFsSW5zdGFuY2VDb3VudCA8PCAiICwgbWF4OiIKKy8vCQkJPDwgKCAobU1heGltYWxJbnN0YW5jZUNvdW50ID09IEFWTV9OVU1FUklDX01BWF9TSVpFX1QpID8KKy8vCQkJCQktMSA6IHN0YXRpY19jYXN0PCBhdm1faW50NjRfdCA+KG1NYXhpbWFsSW5zdGFuY2VDb3VudCkgKQorLy8JCQk8PCAiICkiOworLy9BVk1fRU5ESUZfREVCVUdfRU5BQkxFRAorCisJb3MgPDwgIiA+ICI7Cit9OworCisKK3ZvaWQgRXhlY3V0YWJsZUZvcm06OnN0ckhlYWRlcihPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwloZWFkZXIoIG9zICk7CisKK0FWTV9JRl9ERUJVR19GTEFHX0FORCggQ09NUElMSU5HICwgaGFzQXN0RWxlbWVudCgpICkKKwlvcyA8PCAiJiIgPDwgZ2V0QXN0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiICI7CitBVk1fRU5ESUZfREVCVUdfRkxBR19BTkQoIENPTVBJTElORyApCisKKwlvcyA8PCBnZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOworfQorCisKK3ZvaWQgRXhlY3V0YWJsZUZvcm06OnRvU3RyZWFtKE91dFN0cmVhbSAmIG9zLAorCQljb25zdCBUYWJsZU9mUm91dGVyICYgYVRhYmxlT2ZSb3V0ZXIsIGNvbnN0IHN0ZDo6c3RyaW5nICYgc2VjdGlvbk5hbWUpCit7CisJaWYoIGFUYWJsZU9mUm91dGVyLm5vbmVtcHR5KCkgKQorCXsKKwkJb3MgPDwgVEFCIDw8IHNlY3Rpb25OYW1lIDw8IEVPTF9JTkNSX0lOREVOVDsKKworCQlUYWJsZU9mUm91dGVyOjpjb25zdF9pdGVyYXRvciBpdFJvdXRlciA9IGFUYWJsZU9mUm91dGVyLmJlZ2luKCk7CisJCVRhYmxlT2ZSb3V0ZXI6OmNvbnN0X2l0ZXJhdG9yIGVuZFJvdXRlciA9IGFUYWJsZU9mUm91dGVyLmVuZCgpOworCisJCWZvciggOyBpdFJvdXRlciAhPSBlbmRSb3V0ZXIgOyArK2l0Um91dGVyICkKKwkJeworCQkJaWYoICgqaXRSb3V0ZXIpLnZhbGlkKCkgKQorCQkJeworCQkJCSgqaXRSb3V0ZXIpLnRvU3RyZWFtKG9zKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlvcyA8PCBUQUIgPDwgInJvdXRldXI8bnVsbD4iOworCQkJfQorCisJCQlvcyA8PCBFT0xfRkxVU0g7CisJCX0KKworCQlpZiggYVRhYmxlT2ZSb3V0ZXIubGFzdCgpLmludmFsaWQoKSApCisJCXsKKwkJCW9zIDw8IEVPTDsKKwkJfQorCisJCW9zIDw8IERFQ1JfSU5ERU5UOworCX0KK30KKworCit2b2lkIEV4ZWN1dGFibGVGb3JtOjp0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlpZiggIG9zLnByZWZlcmFibHlGUU4oKSApCisJeworCQlvcyA8PCBUQUIgPDwgZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsKKworCQlBVk1fREVCVUdfUkVGX0NPVU5URVIob3MpOworCisJCXJldHVybjsKKwl9CisKKwloZWFkZXIoIG9zIDw8IFRBQiApOworCitBVk1fSUZfREVCVUdfRkxBR19BTkQoIENPTVBJTElORyAsIGhhc0FzdEVsZW1lbnQoKSApCisJb3MgPDwgIiYiIDw8IGdldEFzdEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIiAiOworQVZNX0VORElGX0RFQlVHX0ZMQUdfQU5EKCBDT01QSUxJTkcgKQorCisJb3MgPDwgZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiIHsiIDw8IEVPTDsKKworLy9BVk1fSUZfREVCVUdfRU5BQkxFRF9BTkQoCisvLwkJZ2V0U3BlY2lmaWVyKCkuaXNGYW1pbHlDb21wb25lbnRDb21wb3NpdGUoKQorLy8JCSYmICggKG1Qb3NzaWJsZVN0YXRpY0luc3RhbmNpYXRpb25Db3VudCAhPSAxKQorLy8JCQl8fCAobVBvc3NpYmxlRHluYW1pY0luc3RhbmNpYXRpb25Db3VudCA+IDApICkgKQorLy8Jb3MgPDwgVEFCMiA8PCAiLy9wb3NzaWJsZV9pbnN0YW5jaWF0aW9uX2NvdW50ID0gKHN0YXRpYzoiCisvLwkJCTw8IG1Qb3NzaWJsZVN0YXRpY0luc3RhbmNpYXRpb25Db3VudCA8PCAiICwgZHluYW1pYzoiCisvLwkJCTw8IG1Qb3NzaWJsZUR5bmFtaWNJbnN0YW5jaWF0aW9uQ291bnQgPDwgIik7IiA8PCBFT0w7CisvL0FWTV9FTkRJRl9ERUJVR19FTkFCTEVECisKKworQVZNX0lGX0RFQlVHX0ZMQUcoIENPTVBJTElORyApCisJaWYoIGhhc0NvbnRhaW5lcigpICkKKwl7CisJCW9zIDw8IFRBQjIgPDwgIi8vY29udGFpbmVyID0gIgorCQkJCTw8IHN0cl9oZWFkZXIoIGdldENvbnRhaW5lcigpLT5hczwgRXhlY3V0YWJsZUZvcm0gPigpICkKKwkJCQk8PCAiOyIgPDwgRU9MOworCX0KKworCWlmKCBoYXNQcm90b3R5cGVJbnN0YW5jZSgpICkKKwl7CisJCW9zIDw8IFRBQjIgPDwgIi8vcHJvdG90eXBlID0gIgorCQkJCTw8IHN0cl9oZWFkZXIoIGdldFByb3RvdHlwZUluc3RhbmNlKCkgKQorCQkJCTw8ICI7IiA8PCBFT0w7CisJfQorQVZNX0VORElGX0RFQlVHX0ZMQUcoIENPTVBJTElORyApCisKKwkvLyBNT0MgQXR0cmlidXRlCisJaWYoIGlzSW5wdXRFbmFibGVkQ29tbXVuaWNhdGlvbigpICkKKwl7CisJCW9zIDw8IFRBQjIgPDwgImlucHV0X2VuYWJsZWQgPSB0cnVlOyIgPDwgRU9MIDw8IHN0ZDo6Zmx1c2g7CisJfQorCisKKwkvLyBBbnkgcHJvZ3JhbSBkYXRhCisJdG9TdHJlYW1EYXRhKG9zKTsKKworCWlmKCBoYXNBbGlhcygpICkKKwl7CisJCSggaGFzRGF0YUFsaWFzKCkgPyBvcyA6IG9zIDw8IFRBQiA8PCAiYWxpYXM6IiApIDw8IEVPTF9JTkNSX0lOREVOVDsKKworCQlnZXRBbGlhcygpLnRvU3RyZWFtKG9zKTsKKworCQlvcyA8PCBERUNSX0lOREVOVDsKKwl9CisKKworCWlmKCBoYXNQb3J0KCkgKQorCXsKKwkJaWYoIChtTWVzc2FnZVNpZ25hbENvdW50ID09IDApIHx8CisJCQkobU1lc3NhZ2VTaWduYWxDb3VudCA9PSBnZXRQb3J0KCkuc2l6ZSgpKSApCisJCXsKKwkJCW9zIDw8IFRBQiA8PCAicG9ydDoiIDw8IEVPTDsKKwkJfQorCQllbHNlCisJCXsKKwkJCW9zIDw8IFRBQiA8PCAicG9ydDwgbXM6ICIgPDwgbU1lc3NhZ2VTaWduYWxDb3VudCA8PCAiID46IiA8PCBFT0w7CisJCX0KKworCQlvcyA8PCBpbmNyX3N0cmVhbSggZ2V0UG9ydCgpICk7CisJfQorCisKKwlpZiggaGFzQnVmZmVyKCkgKQorCXsKKwkJb3MgPDwgVEFCIDw8ICJidWZmZXI6IiA8PCBFT0xfSU5DUl9JTkRFTlQ7CisKKwkJZ2V0QnVmZmVyKCkudG9TdHJlYW0ob3MpOworCisJCW9zIDw8IERFQ1JfSU5ERU5UOworCX0KKworCWlmKCBoYXNDaGFubmVsKCkgKQorCXsKKwkJb3MgPDwgVEFCIDw8ICJjaGFubmVsOiIgPDwgRU9MX0lOQ1JfSU5ERU5UOworCisJCWdldENoYW5uZWwoKS50b1N0cmVhbShvcyk7CisKKwkJb3MgPDwgREVDUl9JTkRFTlQ7CisJfQorCisJaWYoIGhhc0Nvbm5lY3QoKSApCisJeworCQlvcyA8PCBUQUIgPDwgImNvbm5lY3Rpb246IiA8PCAiLyogPCAiIDw8IGdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIiA+ICovIgorCQkJCTw8IEVPTF9JTkNSX0lOREVOVDsKKworCQlnZXRDb25uZWN0KCkudG9TdHJlYW0ob3MpOworCisJCW9zIDw8IERFQ1JfSU5ERU5UOworCX0KKworCWlmKCBoYXNSZHZDb21tdW5pY2F0aW9uKCkgKQorCXsKKwkJb3MgPDwgRU9MX1RBQjIgPDwgInJkdl9jb21tdW5pY2F0aW9uID0gdHJ1ZTsiIDw8IEVPTCA8PCBFT0w7CisJfQorCisJLy8gVGFibGUgb2YgUm91dGVyIGZvciBJbnN0YW5jZQorCXRvU3RyZWFtKG9zLCBtVGFibGVPZlJvdXRlcjRJbnN0YW5jZSwgInJvdXRlcjoiKTsKKworCS8vIFRhYmxlIG9mIFJvdXRlciBmb3IgTW9kZWwKKwl0b1N0cmVhbShvcywgbVRhYmxlT2ZSb3V0ZXI0TW9kZWwsICJyb3V0ZXIjbW9kZWw6Iik7CisKKworCWlmKCBoYXNFeGVjdXRhYmxlKCkgKQorCXsKKwkJb3MgPDwgVEFCIDw8ICJwcm9jZWR1cmU6IiA8PCBFT0xfSU5DUl9JTkRFTlQ7CisKKwkJZ2V0RXhlY3V0YWJsZXMoKS50b1N0cmVhbShvcyk7CisKKwkJb3MgPDwgREVDUl9JTkRFTlQ7CisJfQorCisKKwlpZiggaGFzSW5zdGFuY2VNb2RlbCgpICkKKwl7CisJCW9zIDw8IFRBQiA8PCAibW9kZWw6IiA8PCBFT0xfSU5DUl9JTkRFTlQ7CisKKwkJZ2V0SW5zdGFuY2VNb2RlbCgpLnRvU3RyZWFtKG9zKTsKKworCQlvcyA8PCBERUNSX0lOREVOVDsKKwl9CisKKwlpZiggaGFzSW5zdGFuY2VTdGF0aWMoKSApCisJeworCQlvcyA8PCBUQUIgPDwgImluc3RhbmNlOiIgPDwgRU9MX0lOQ1JfSU5ERU5UOworCisJCWdldEluc3RhbmNlU3RhdGljKCkudG9TdHJlYW0ob3MpOworCisJCW9zIDw8IERFQ1JfSU5ERU5UOworCX0KKworCWlmKCBoYXNJbnN0YW5jZUR5bmFtaWMoKSApCisJeworCQlvcyA8PCBUQUIgPDwgImluc3RhbmNlI2R5bmFtaWM6IiA8PCBFT0xfSU5DUl9JTkRFTlQ7CisKKwkJZ2V0SW5zdGFuY2VEeW5hbWljKCkudG9TdHJlYW0ob3MpOworCisJCW9zIDw8IERFQ1JfSU5ERU5UOworCX0KKworCisJaWYoIGhhc1RyYW5zaXRpb24oKSApCisJeworCQlvcyA8PCBUQUIgPDwgInRyYW5zaXRpb246IiA8PCBFT0xfSU5DUl9JTkRFTlQ7CisKKwkJZ2V0VHJhbnNpdGlvbigpLnRvU3RyZWFtKG9zKTsKKworCQlvcyA8PCBERUNSX0lOREVOVDsKKwl9CisKKwlpZiggaGFzUHJvZ3JhbSgpICkKKwl7CisJCW9zIDw8IFRBQiA8PCAicHJvZ3JhbToiIDw8IEVPTF9JTkNSX0lOREVOVDsKKworCQlnZXRQcm9ncmFtKCkudG9TdHJlYW0ob3MpOworCisJCW9zIDw8IERFQ1JfSU5ERU5UOworCX0KKworCWlmKCBtVGFibGVPZkFub255bW91c0lubmVyUm91dGluZS5ub25lbXB0eSgpICkKKwl7CisJCW9zIDw8IFRBQiA8PCAicm91dGluZTwgYW5vbnltb3VzI2lubmVyID46IiA8PCBFT0xfSU5DUl9JTkRFTlQ7CisKKwkJbVRhYmxlT2ZBbm9ueW1vdXNJbm5lclJvdXRpbmUuZnFuU3RyZWFtKG9zKTsKKworCQlvcyA8PCBERUNSX0lOREVOVDsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gU1RBVElDIEFOQUxZU0lTIEFUVFJJQlVURQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKworQVZNX0lGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBEQVRBICkKKwlpZiggaGFzVHJhbnNpdGlvbigpIHx8IGhhc1Byb2dyYW0oKSApCisJeworCQlUYWJsZU9mSW5zdGFuY2VPZkRhdGE6OmNvbnN0X3Jhd19pdGVyYXRvciBpdERhdGE7CisJCVRhYmxlT2ZJbnN0YW5jZU9mRGF0YTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGVuZERhdGE7CisKKwkJaWYoIGdldFJlcXVpcmVkRGF0YSgpLm5vbmVtcHR5KCkgKQorCQl7CisJCQlvcyA8PCBUQUIgPDwgImRhdGEjcmVxdWlyZWQ6IiA8PCBFT0w7CisJCQlpdERhdGEgPSBnZXRSZXF1aXJlZERhdGEoKS5iZWdpbigpOworCQkJZW5kRGF0YSA9IGdldFJlcXVpcmVkRGF0YSgpLmVuZCgpOworCQkJZm9yKCA7IGl0RGF0YSAhPSBlbmREYXRhIDsgKytpdERhdGEgKQorCQkJeworCQkJCW9zIDw8IFRBQjIgPDwgaXREYXRhLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8ICI7IiA8PCBFT0w7CisJCQl9CisJCX0KKworCQlpZiggZ2V0VXNlbGVzc0RhdGEoKS5ub25lbXB0eSgpICkKKwkJeworCQkJb3MgPDwgVEFCIDw8ICJkYXRhI3VzZWxlc3M6IiA8PCBFT0w7CisJCQlpdERhdGEgPSBnZXRVc2VsZXNzRGF0YSgpLmJlZ2luKCk7CisJCQllbmREYXRhID0gZ2V0VXNlbGVzc0RhdGEoKS5lbmQoKTsKKwkJCWZvciggOyBpdERhdGEgIT0gZW5kRGF0YSA7ICsraXREYXRhICkKKwkJCXsKKwkJCQlvcyA8PCBUQUIyIDw8IGl0RGF0YS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiOyIgPDwgRU9MOworCQkJfQorCQl9CisJfQorQVZNX0VORElGX0RFQlVHX0ZMQUcyKCBDT01QSUxJTkcgLCBEQVRBICkKKworCisJaWYoIGhhc1ZhcmlhYmxlRGVwZW5kZW5jeSgpICkKKwl7CisJCW9zIDw8IFRBQiA8PCAiZGVwZW5kZW5jeSN2YXJpYWJsZSA9ICIKKwkJCQk8PCBTVEFUSUNfQU5BTFlTSVM6OnRvX3N0cmluZyggZ2V0VmFyaWFibGVEZXBlbmRlbnQoKSApIDw8IEVPTDsKKwl9CisKKworCWlmKCAobm90IGlzUmVhY2hhYmxlU3RhdGVGbGFnKQorCQkmJiAobm90IGdldFNwZWNpZmllcigpLmlzUHNldWRvc3RhdGVJbml0aWFsT3JTdGF0ZVN0YXJ0KCkpICkKKwl7CisJCW9zIDw8IFRBQjIgPDwgInJlYWNoYWJsZSNtYWNoaW5lID0gZmFsc2U7IiA8PCBFT0w7CisJfQorCisJaWYoIGhhc0JhY2t3YXJkUmVhY2hhYmxlTWFjaGluZSgpICkKKwl7CisJCW9zIDw8IFRBQiA8PCAicmVhY2hhYmxlI2JhY2t3YXJkI21hY2hpbmU6IiA8PCBFT0w7CisKKwkJTGlzdE9mSW5zdGFuY2VPZk1hY2hpbmU6OmNvbnN0X2l0ZXJhdG9yIGl0TWFjaGluZSA9CisJCQkJZ2V0QmFja3dhcmRSZWFjaGFibGVNYWNoaW5lKCkuYmVnaW4oKTsKKwkJTGlzdE9mSW5zdGFuY2VPZk1hY2hpbmU6OmNvbnN0X2l0ZXJhdG9yIGVuZE1hY2hpbmUgPQorCQkJCWdldEJhY2t3YXJkUmVhY2hhYmxlTWFjaGluZSgpLmVuZCgpOworCQlmb3IoIDsgaXRNYWNoaW5lICE9IGVuZE1hY2hpbmUgOyArK2l0TWFjaGluZSApCisJCXsKKwkJCW9zIDw8IFRBQjIgPDwgc3RyX2hlYWRlciggKml0TWFjaGluZSApIDw8ICI7IiA8PCBFT0w7CisJCX0KKwl9CisKKwlpZiggaGFzQmFja3dhcmRSZWFjaGFibGVUcmFuc2l0aW9uKCkgKQorCXsKKwkJb3MgPDwgVEFCIDw8ICJyZWFjaGFibGUjYmFja3dhcmQjdHJhbnNpdGlvbjoiIDw8IEVPTDsKKworCQlPdXRTdHJlYW0gb3NIaWVyYXJjaHkoIG9zICk7CisJCW9zSGllcmFyY2h5LklOREVOVC5DSEFSID0gIiAiOworCisJCUxpc3RPZkF2bVRyYW5zaXRpb246OmNvbnN0X2l0ZXJhdG9yIGl0UHJvZyA9CisJCQkJZ2V0QmFja3dhcmRSZWFjaGFibGVUcmFuc2l0aW9uKCkuYmVnaW4oKTsKKwkJTGlzdE9mQXZtVHJhbnNpdGlvbjo6Y29uc3RfaXRlcmF0b3IgZW5kUHJvZyA9CisJCQkJZ2V0QmFja3dhcmRSZWFjaGFibGVUcmFuc2l0aW9uKCkuZW5kKCk7CisJCWZvciggOyBpdFByb2cgIT0gZW5kUHJvZyA7ICsraXRQcm9nICkKKwkJeworCQkJb3MgPDwgVEFCMiA8PCBzdHJfaGVhZGVyKCAqaXRQcm9nICkgPDwgIjsiIDw8IEVPTDsKKwkJfQorCX0KKworCisJaWYoIGhhc0ZvcndhcmRSZWFjaGFibGVNYWNoaW5lKCkgKQorCXsKKwkJb3MgPDwgVEFCIDw8ICJyZWFjaGFibGUjZm9yd2FyZCNtYWNoaW5lOiIgPDwgRU9MOworCisJCU91dFN0cmVhbSBvc0hpZXJhcmNoeSggb3MgKTsKKwkJb3NIaWVyYXJjaHkuSU5ERU5ULkNIQVIgPSAiICI7CisKKwkJTGlzdE9mSW5zdGFuY2VPZk1hY2hpbmU6OmNvbnN0X2l0ZXJhdG9yIGl0TWFjaGluZSA9CisJCQkJZ2V0Rm9yd2FyZFJlYWNoYWJsZU1hY2hpbmUoKS5iZWdpbigpOworCQlMaXN0T2ZJbnN0YW5jZU9mTWFjaGluZTo6Y29uc3RfaXRlcmF0b3IgZW5kTWFjaGluZSA9CisJCQkJZ2V0Rm9yd2FyZFJlYWNoYWJsZU1hY2hpbmUoKS5lbmQoKTsKKwkJZm9yKCA7IGl0TWFjaGluZSAhPSBlbmRNYWNoaW5lIDsgKytpdE1hY2hpbmUgKQorCQl7CisJCQlvcyA8PCBUQUIyIDw8IHN0cl9oZWFkZXIoICppdE1hY2hpbmUgKSA8PCAiOyIgPDwgRU9MOworCQl9CisJfQorCisJaWYoIGhhc0ZvcndhcmRSZWFjaGFibGVUcmFuc2l0aW9uKCkgKQorCXsKKwkJb3MgPDwgVEFCIDw8ICJyZWFjaGFibGUjZm9yd2FyZCN0cmFuc2l0aW9uOiIgPDwgRU9MOworCisJCU91dFN0cmVhbSBvc0hpZXJhcmNoeSggb3MgKTsKKwkJb3NIaWVyYXJjaHkuSU5ERU5ULkNIQVIgPSAiICI7CisKKwkJTGlzdE9mQXZtVHJhbnNpdGlvbjo6Y29uc3RfaXRlcmF0b3IgaXRQcm9nID0KKwkJCQlnZXRGb3J3YXJkUmVhY2hhYmxlVHJhbnNpdGlvbigpLmJlZ2luKCk7CisJCUxpc3RPZkF2bVRyYW5zaXRpb246OmNvbnN0X2l0ZXJhdG9yIGVuZFByb2cgPQorCQkJCWdldEZvcndhcmRSZWFjaGFibGVUcmFuc2l0aW9uKCkuZW5kKCk7CisJCWZvciggOyBpdFByb2cgIT0gZW5kUHJvZyA7ICsraXRQcm9nICkKKwkJeworCQkJb3MgPDwgVEFCMiA8PCBzdHJfaGVhZGVyKCAqaXRQcm9nICkgPDwgIjsiIDw8IEVPTDsKKwkJfQorCX0KKworCisJb3MgPDwgVEFCIDw8ICJtb2U6IiA8PCBFT0w7CisKKwlpZiggaGFzT25DcmVhdGUoKSApCisJeworCQlvcyA8PCBUQUIyIDw8ICJAY3JlYXRleyIgPDwgSU5DUjJfSU5ERU5UOworCQlnZXRPbkNyZWF0ZSgpLT50b1N0cmVhbVJvdXRpbmUoIG9zICk7CisJCW9zIDw8IERFQ1IyX0lOREVOVF9UQUIyIDw8ICJ9IiA8PCBFT0w7CisJfQorCisJaWYoIGhhc09uSW5pdCgpICkKKwl7CisJCW9zIDw8IFRBQjIgPDwgIkBpbml0eyIgPDwgSU5DUjJfSU5ERU5UOworCQlnZXRPbkluaXQoKS0+dG9TdHJlYW1Sb3V0aW5lKCBvcyApOworCQlvcyA8PCBERUNSMl9JTkRFTlRfVEFCMiA8PCAifSIgPDwgRU9MOworCX0KKworCWlmKCBoYXNPblJldHVybigpICkKKwl7CisJCW9zIDw8IFRBQjIgPDwgIkByZXR1cm57IiA8PCBJTkNSMl9JTkRFTlQ7CisJCWdldE9uUmV0dXJuKCktPnRvU3RyZWFtUm91dGluZSggb3MgKTsKKwkJb3MgPDwgREVDUjJfSU5ERU5UX1RBQjIgPDwgIn0iIDw8IEVPTDsKKwl9CisKKwlpZiggaGFzT25GaW5hbCgpICkKKwl7CisJCW9zIDw8IFRBQjIgPDwgIkBmaW5hbHsiIDw8IElOQ1IyX0lOREVOVDsKKwkJZ2V0T25GaW5hbCgpLT50b1N0cmVhbVJvdXRpbmUoIG9zICk7CisJCW9zIDw8IERFQ1IyX0lOREVOVF9UQUIyIDw8ICJ9IiA8PCBFT0w7CisJfQorCisKKwlpZiggaGFzT25TdGFydCgpICkKKwl7CisJCW9zIDw8IFRBQjIgPDwgIkBzdGFydHsiIDw8IElOQ1IyX0lOREVOVDsKKwkJZ2V0T25TdGFydCgpLT50b1N0cmVhbVJvdXRpbmUoIG9zICk7CisJCW9zIDw8IERFQ1IyX0lOREVOVF9UQUIyIDw8ICJ9IiA8PCBFT0w7CisJfQorCisJaWYoIGhhc09uU3RvcCgpICkKKwl7CisJCW9zIDw8IFRBQjIgPDwgIkBzdG9weyIgPDwgSU5DUjJfSU5ERU5UOworCQlnZXRPblN0b3AoKS0+dG9TdHJlYW1Sb3V0aW5lKCBvcyApOworCQlvcyA8PCBERUNSMl9JTkRFTlRfVEFCMiA8PCAifSIgPDwgRU9MOworCX0KKworCisJaWYoIGhhc09uSUVuYWJsZSgpICkKKwl7CisJCW9zIDw8IFRBQjIgPDwgIkBpZW5hYmxleyIgPDwgSU5DUjJfSU5ERU5UOworCQlnZXRPbklFbmFibGUoKS0+dG9TdHJlYW1Sb3V0aW5lKCBvcyApOworCQlvcyA8PCBERUNSMl9JTkRFTlRfVEFCMiA8PCAifSIgPDwgRU9MOworCX0KKworCWlmKCBoYXNPbkVuYWJsZSgpICkKKwl7CisJCW9zIDw8IFRBQjIgPDwgIkBlbmFibGV7IiA8PCBJTkNSMl9JTkRFTlQ7CisJCWdldE9uRW5hYmxlKCktPnRvU3RyZWFtUm91dGluZSggb3MgKTsKKwkJb3MgPDwgREVDUjJfSU5ERU5UX1RBQjIgPDwgIn0iIDw8IEVPTDsKKwl9CisKKworCWlmKCBoYXNPbklEaXNhYmxlKCkgKQorCXsKKwkJb3MgPDwgVEFCMiA8PCAiQGlkaXNhYmxleyIgPDwgSU5DUjJfSU5ERU5UOworCQlnZXRPbklEaXNhYmxlKCktPnRvU3RyZWFtUm91dGluZSggb3MgKTsKKwkJb3MgPDwgREVDUjJfSU5ERU5UX1RBQjIgPDwgIn0iIDw8IEVPTDsKKwl9CisKKwlpZiggaGFzT25EaXNhYmxlKCkgKQorCXsKKwkJb3MgPDwgVEFCMiA8PCAiQGRpc2FibGV7IiA8PCBJTkNSMl9JTkRFTlQ7CisJCWdldE9uRGlzYWJsZSgpLT50b1N0cmVhbVJvdXRpbmUoIG9zICk7CisJCW9zIDw8IERFQ1IyX0lOREVOVF9UQUIyIDw8ICJ9IiA8PCBFT0w7CisJfQorCisKKwlpZiggaGFzT25JQWJvcnQoKSApCisJeworCQlvcyA8PCBUQUIyIDw8ICJAaWFib3J0eyIgPDwgSU5DUjJfSU5ERU5UOworCQlnZXRPbklBYm9ydCgpLT50b1N0cmVhbVJvdXRpbmUoIG9zICk7CisJCW9zIDw8IERFQ1IyX0lOREVOVF9UQUIyIDw8ICJ9IiA8PCBFT0w7CisJfQorCisJaWYoIGhhc09uQWJvcnQoKSApCisJeworCQlvcyA8PCBUQUIyIDw8ICJAYWJvcnR7IiA8PCBJTkNSMl9JTkRFTlQ7CisJCWdldE9uQWJvcnQoKS0+dG9TdHJlYW1Sb3V0aW5lKCBvcyApOworCQlvcyA8PCBERUNSMl9JTkRFTlRfVEFCMiA8PCAifSIgPDwgRU9MOworCX0KKworCisJaWYoIGhhc09uSVJ1bigpICkKKwl7CisJCW9zIDw8IFRBQjIgPDwgIkBpcnVueyIgPDwgSU5DUjJfSU5ERU5UOworCQlnZXRPbklSdW4oKS0+dG9TdHJlYW1Sb3V0aW5lKCBvcyApOworCQlvcyA8PCBERUNSMl9JTkRFTlRfVEFCMiA8PCAifSIgPDwgRU9MOworCX0KKworCWlmKCBoYXNPblJ1bigpICkKKwl7CisJCW9zIDw8IFRBQjIgPDwgIkBydW57IiA8PCBJTkNSMl9JTkRFTlQ7CisJCWdldE9uUnVuKCktPnRvU3RyZWFtUm91dGluZSggb3MgKTsKKwkJb3MgPDwgREVDUjJfSU5ERU5UX1RBQjIgPDwgIn0iIDw8IEVPTDsKKwl9CisKKworCWlmKCBoYXNPblJ0YygpICkKKwl7CisJCW9zIDw8IFRBQjIgPDwgIkBydGN7IiA8PCBJTkNSMl9JTkRFTlQ7CisJCWdldE9uUnRjKCktPnRvU3RyZWFtUm91dGluZSggb3MgKTsKKwkJb3MgPDwgREVDUjJfSU5ERU5UX1RBQjIgPDwgIn0iIDw8IEVPTDsKKwl9CisKKworCWlmKCBoYXNPblNjaGVkdWxlKCkgKQorCXsKKwkJb3MgPDwgVEFCMiA8PCAiQHNjaGVkdWxlIiA8PCAoaXNNdXRhYmxlU2NoZWR1bGUoKSA/ICIiIDogIjxmaW5hbD4iKQorCQkJCTw8ICJ7IiA8PCBJTkNSMl9JTkRFTlQ7CisJCWdldE9uU2NoZWR1bGUoKS0+dG9TdHJlYW1Sb3V0aW5lKCBvcyApOworCQlvcyA8PCBERUNSMl9JTkRFTlRfVEFCMiA8PCAifSIgPDwgRU9MOworCX0KKwllbHNlIGlmKCBpc011dGFibGVTY2hlZHVsZSgpICkKKwl7CisJCW9zIDw8IFRBQjIgPDwgIkBzY2hlZHVsZSNtdXRhYmxleyB9IiA8PCBFT0w7CisJfQorCisKKwlpZiggaGFzT25Db25jdXJyZW5jeSgpICkKKwl7CisJCW9zIDw8IFRBQjIgPDwgIkBjb25jdXJyZW5jeXsiOworCQlpZiggZ2V0T25Db25jdXJyZW5jeSgpLT5lbXB0eSgpICkKKwkJeworCQkJb3MgPDwgIiAiIDw8IGdldE9uQ29uY3VycmVuY3lPcGVyYXRvcigpLT5zdHJPcCgpIDw8ICIgIjsKKwkJfQorCQllbHNlCisJCXsKKwkJCWdldE9uQ29uY3VycmVuY3koKS0+dG9TdHJlYW1Sb3V0aW5lKCBvcyA8PCBJTkNSMl9JTkRFTlQgKQorCQkJCQk8PCBERUNSMl9JTkRFTlRfVEFCMjsKKwkJfQorCQlvcyA8PCAifSIgPDwgRU9MOworCX0KKworCisJaWYoIGhhc09uU3luY2hyb25pemUoKSApCisJeworCQlvcyA8PCBUQUIyIDw8ICJAc3luY2hyb25pemV7IiA8PCBJTkNSMl9JTkRFTlQ7CisJCWdldE9uU3luY2hyb25pemUoKS0+dG9TdHJlYW1Sb3V0aW5lKCBvcyApOworCQlvcyA8PCBERUNSMl9JTkRFTlRfVEFCMiA8PCAifSIgPDwgRU9MOworCX0KKworCisJLy8gc3RhdGljIGNsYXNzIG9mIFBvcnQvTWVzc2FnZS9TaWduYWwgaW4gY29tbXVuaWNhdGVkIHRyYW5zaXRpb24KKwlvcyA8PCBJTkNSX0lOREVOVDsKKwl0b1N0cmVhbVN0YXRpY0NvbShvcyk7CisJb3MgPDwgREVDUl9JTkRFTlQ7CisKKwlvcyA8PCBUQUIgPDwgIn0iIDw8IEVPTCA8PCBzdGQ6OmZsdXNoOworfQorCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVGb3JtLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlRm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZmUxZmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlRm9ybS5oCkBAIC0wLDAgKzEsMjQ2NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBFWEVDVVRBQkxFRk9STV9IXworI2RlZmluZSBFWEVDVVRBQkxFRk9STV9IXworCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvQXZtUHJvZ3JhbS5oPgorI2luY2x1ZGUgPGZtbC9jb21tb24vU3BlY2lmaWVyRWxlbWVudC5oPgorCisjaW5jbHVkZSA8YmFzZS9TbWFydFRhYmxlLmg+CisKKyNpbmNsdWRlIDxjb2xsZWN0aW9uL1R5cGVkZWYuaD4KKyNpbmNsdWRlIDxjb2xsZWN0aW9uL1ZlY3Rvci5oPgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQXZtQ29kZS5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvQXZtVHJhbnNpdGlvbi5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0Jhc2VJbnN0YW5jZUZvcm0uaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mQnVmZmVyLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZkNvbm5lY3QuaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mRGF0YS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZNYWNoaW5lLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZlBvcnQuaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9Sb3V0ZXIuaD4KKworI2luY2x1ZGUgPGZtbC9zeW1ib2wvU3ltYm9sLmg+CisjaW5jbHVkZSA8Zm1sL3N5bWJvbC9UYWJsZU9mU3ltYm9sLmg+CisKKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvSW5zdGFuY2VTcGVjaWZpZXJQYXJ0Lmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL01hY2hpbmUuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvU3lzdGVtLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBBdm1Db2RlOworY2xhc3MgRXhlY3V0YWJsZVN5c3RlbTsKK2NsYXNzIE9iamVjdEVsZW1lbnQ7CitjbGFzcyBTcGVjaWZpZXI7CisKKworLy8gVFlQRSBERUZJTklUSU9OIGZvciBUQUJMRSAsIFNNQVJUIFBPSU5URVIgYW5kIENPTlRBSU5FUgordHlwZWRlZiAgVGFibGVPZkJGX1Q8IEV4ZWN1dGFibGVGb3JtID4gIFRhYmxlT2ZFeGVjdXRhYmxlRm9ybTsKKwordHlwZWRlZiBTbWFydFRhYmxlPCBJbnN0YW5jZU9mQnVmZmVyICAsIERlc3Ryb3lFbGVtZW50UG9saWN5ID4gVGFibGVPZkJ1ZmZlcjsKK3R5cGVkZWYgU21hcnRUYWJsZTwgSW5zdGFuY2VPZkNvbm5lY3QgLCBEZXN0cm95RWxlbWVudFBvbGljeSA+IFRhYmxlT2ZDb25uZWN0VDsKK3R5cGVkZWYgU21hcnRUYWJsZTwgSW5zdGFuY2VPZkRhdGEgICAgLCBEZXN0cm95RWxlbWVudFBvbGljeSA+IFRhYmxlT2ZWYXJpYWJsZVQ7Cit0eXBlZGVmIFNtYXJ0VGFibGU8IEluc3RhbmNlT2ZNYWNoaW5lICwgRGVzdHJveUVsZW1lbnRQb2xpY3kgPiBUYWJsZU9mTWFjaGluZVQ7Cit0eXBlZGVmIFNtYXJ0VGFibGU8IEluc3RhbmNlT2ZQb3J0ICAgICwgRGVzdHJveUVsZW1lbnRQb2xpY3kgPiBUYWJsZU9mUG9ydFQ7CisKKworY2xhc3MgRXhlY3V0YWJsZUZvcm0gOgorCQlwdWJsaWMgQXZtUHJvZ3JhbSAsCisJCXB1YmxpYyBTcGVjaWZpZXJJbXBsLAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIEV4ZWN1dGFibGVGb3JtICkKK3sKKworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBFeGVjdXRhYmxlRm9ybSApCisKKworcHJvdGVjdGVkOgorCS8qCisJICogQVRUUklCVVRFUworCSAqLworCUV4ZWN1dGFibGVTeXN0ZW0gJiBtRXhlY3V0YWJsZVN5c3RlbTsKKworCWF2bV9zaXplX3QgbUluaXRpYWxJbnN0YW5jZUNvdW50OworCWF2bV9zaXplX3QgbU1heGltYWxJbnN0YW5jZUNvdW50OworCisJYXZtX3NpemVfdCBtUG9zc2libGVTdGF0aWNJbnN0YW5jaWF0aW9uQ291bnQ7CisJYXZtX3NpemVfdCBtUG9zc2libGVEeW5hbWljSW5zdGFuY2lhdGlvbkNvdW50OworCisJVGFibGVPZlN5bWJvbCBtVGFibGVPZkNoYW5uZWw7CisKKwlUYWJsZU9mU3ltYm9sIG1UYWJsZU9mUG9ydDsKKwlhdm1fc2l6ZV90IG1NZXNzYWdlU2lnbmFsQ291bnQ7CisKKwlUYWJsZU9mU3ltYm9sIG1UYWJsZU9mQnVmZmVyOworCVRhYmxlT2ZTeW1ib2wgbVRhYmxlT2ZDb25uZWN0OworCisJVGFibGVPZlN5bWJvbCBtVGFibGVPZkluc3RhbmNlTW9kZWw7CisKKwlUYWJsZU9mU3ltYm9sIG1UYWJsZU9mSW5zdGFuY2VTdGF0aWM7CisJSW5zdGFuY2VPZk1hY2hpbmUgKiBtUHJvdG90eXBlSW5zdGFuY2U7CisKKwlUYWJsZU9mU3ltYm9sIG1UYWJsZU9mSW5zdGFuY2VEeW5hbWljOworCisJVGFibGVPZlRyYW5zaXRpb24gbVRhYmxlT2ZUcmFuc2l0aW9uOworCisJVGFibGVPZkF2bVByb2dyYW0gbVRhYmxlT2ZQcm9ncmFtOworCisJVGFibGVPZkF2bVByb2dyYW0gbVRhYmxlT2ZBbm9ueW1vdXNJbm5lclJvdXRpbmU7CisKKwlUYWJsZU9mRXhlY3V0YWJsZUZvcm0gbVRhYmxlT2ZFeGVjdXRhYmxlOworCisJVGFibGVPZlN5bWJvbCBtVGFibGVPZkFsaWFzOworCisKKwkvLyBQcmVkZWZpbmVkIHJvdXRpbmVzCisJQXZtUHJvZ3JhbSBvbkNyZWF0ZVJvdXRpbmU7CisJQXZtUHJvZ3JhbSBvbkluaXRSb3V0aW5lOworCUF2bVByb2dyYW0gb25GaW5hbFJvdXRpbmU7CisKKwlBdm1Qcm9ncmFtIG9uUmV0dXJuUm91dGluZTsKKworCUF2bVByb2dyYW0gb25TdGFydFJvdXRpbmU7CisJQXZtUHJvZ3JhbSBvblN0b3BSb3V0aW5lOworCisJQXZtUHJvZ3JhbSBvbklFbmFibGVSb3V0aW5lOworCUF2bVByb2dyYW0gb25FbmFibGVSb3V0aW5lOworCisJQXZtUHJvZ3JhbSBvbklEaXNhYmxlUm91dGluZTsKKwlBdm1Qcm9ncmFtIG9uRGlzYWJsZVJvdXRpbmU7CisKKwlBdm1Qcm9ncmFtIG9uSUFib3J0Um91dGluZTsKKwlBdm1Qcm9ncmFtIG9uQWJvcnRSb3V0aW5lOworCisJQXZtUHJvZ3JhbSBvbklSdW5Sb3V0aW5lOworCUF2bVByb2dyYW0gb25SdW5Sb3V0aW5lOworCUF2bVByb2dyYW0gb25SdGNSb3V0aW5lOworCisJQXZtUHJvZ3JhbSBvblNjaGVkdWxlUm91dGluZTsKKwlBdm1Qcm9ncmFtIG9uQ29uY3VycmVuY3lSb3V0aW5lOworCisJQXZtUHJvZ3JhbSBvblN5bmNocm9uaXplUm91dGluZTsKKworCisJLy8gU3RydWN0dXJhbCBkZWNvbXBvc2l0b24KKwlib29sIG1NYWluQ29tcG9uZW50RmxhZzsKKworCS8vIE1PQyBBdHRyaWJ1dGUgZm9yIG11dGFibGUgU2NoZWR1bGUKKwlib29sIG1NdXRhYmxlU2NoZWR1bGVGbGFnOworCisKKwkvLyBDb21tdW5pY2F0aW9uIHJvdXRpbmcKKwlUYWJsZU9mUm91dGVyIG1UYWJsZU9mUm91dGVyNEluc3RhbmNlOworCisJVGFibGVPZlJvdXRlciBtVGFibGVPZlJvdXRlcjRNb2RlbDsKKworCWJvb2wgbVJkdkNvbW11bmljYXRpb25GbGFnOworCisJLy8gTU9DIEF0dHJpYnV0ZSBmb3IgQ29tbXVuaWNhdGlvbgorCWJvb2wgbUlucHV0RW5hYmxlZENvbW11bmljYXRpb25GbGFnOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gU3RhdGljIEFuYWx5c2lzIEluZm9ybWF0aW9uCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJVGFibGVPZkluc3RhbmNlT2ZEYXRhIG1SZXF1aXJlZERhdGE7CisJVGFibGVPZkluc3RhbmNlT2ZEYXRhIG1Vc2VsZXNzRGF0YTsKKworCisJLy8gVGhlIGxpc3Qgb2YgYmFja3dhcmQgcmVhY2hhYmxlIG1hY2hpbmUKKwlMaXN0T2ZJbnN0YW5jZU9mTWFjaGluZSBtQmFja3dhcmRSZWFjaGFibGVNYWNoaW5lOworCisJLy8gVGhlIGxpc3Qgb2YgYmFja3dhcmQgcmVhY2hhYmxlIHRyYW5zaXRpb24KKwlMaXN0T2ZBdm1UcmFuc2l0aW9uIG1CYWNrd2FyZFJlYWNoYWJsZVRyYW5zaXRpb247CisKKworCS8vIFRoZSBsaXN0IG9mIGZvcndhcmQgcmVhY2hhYmxlIG1hY2hpbmUKKwlMaXN0T2ZJbnN0YW5jZU9mTWFjaGluZSBtRm9yd2FyZFJlYWNoYWJsZU1hY2hpbmU7CisKKwkvLyBUaGUgbGlzdCBvZiBmb3J3YXJkIHJlYWNoYWJsZSB0cmFuc2l0aW9uCisJTGlzdE9mQXZtVHJhbnNpdGlvbiBtRm9yd2FyZFJlYWNoYWJsZVRyYW5zaXRpb247CisKKwkvLyBEZWZhdWx0IGlzIDw8IHRydWUgPj4KKwlib29sIGlzUmVhY2hhYmxlU3RhdGVGbGFnOworCisKK3B1YmxpYzoKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUV4ZWN1dGFibGVGb3JtKEV4ZWN1dGFibGVTeXN0ZW0gJiBhRXhlY3V0YWJsZVN5c3RlbSwKKwkJCUV4ZWN1dGFibGVGb3JtICogYUNvbnRhaW5lciwKKwkJCU1hY2hpbmUgKiBhc3RNYWNoaW5lLCBhdm1fc2l6ZV90IGFEYXRhU2l6ZSA9IDApCisJOiBBdm1Qcm9ncmFtKENMQVNTX0tJTkRfVCggRXhlY3V0YWJsZUZvcm0gKSwKKwkJCVNwZWNpZmllcjo6U0NPUEVfTUFDSElORV9LSU5ELCBhQ29udGFpbmVyLCBhc3RNYWNoaW5lLCBhRGF0YVNpemUpLAorCVNwZWNpZmllckltcGwoIGFzdE1hY2hpbmUgKSwKKworCW1FeGVjdXRhYmxlU3lzdGVtKCBhRXhlY3V0YWJsZVN5c3RlbSApLAorCisJbUluaXRpYWxJbnN0YW5jZUNvdW50KAorCQkoKGFzdE1hY2hpbmUgIT0gTlVMTCkgJiYgYXN0TWFjaGluZS0+aGFzSW5zdGFuY2VTcGVjaWZpZXIoKSkgPworCQkJYXN0TWFjaGluZS0+Z2V0SW5zdGFuY2VTcGVjaWZpZXIoKS0+Z2V0SW5pdGlhbEluc3RhbmNlQ291bnQoKSA6IDEgKSwKKwltTWF4aW1hbEluc3RhbmNlQ291bnQoCisJCSgoYXN0TWFjaGluZSAhPSBOVUxMKSAmJiBhc3RNYWNoaW5lLT5oYXNJbnN0YW5jZVNwZWNpZmllcigpKSA/CisJCQlhc3RNYWNoaW5lLT5nZXRJbnN0YW5jZVNwZWNpZmllcigpLT5nZXRNYXhpbWFsSW5zdGFuY2VDb3VudCgpIDogMSApLAorCisJbVBvc3NpYmxlU3RhdGljSW5zdGFuY2lhdGlvbkNvdW50KCAwICksCisJbVBvc3NpYmxlRHluYW1pY0luc3RhbmNpYXRpb25Db3VudCggMCApLAorCisJbVRhYmxlT2ZDaGFubmVsKCApLAorCisJbVRhYmxlT2ZQb3J0KCApLAorCW1NZXNzYWdlU2lnbmFsQ291bnQoIDAgKSwKKworCW1UYWJsZU9mQnVmZmVyKCApLAorCW1UYWJsZU9mQ29ubmVjdCggKSwKKworCW1UYWJsZU9mSW5zdGFuY2VNb2RlbCggKSwKKworCW1UYWJsZU9mSW5zdGFuY2VTdGF0aWMoICksCisJbVByb3RvdHlwZUluc3RhbmNlKCApLAorCisJbVRhYmxlT2ZJbnN0YW5jZUR5bmFtaWMoICksCisKKwltVGFibGVPZlRyYW5zaXRpb24oICksCisJbVRhYmxlT2ZQcm9ncmFtKCApLAorCW1UYWJsZU9mQW5vbnltb3VzSW5uZXJSb3V0aW5lKCApLAorCisJbVRhYmxlT2ZFeGVjdXRhYmxlKCApLAorCisJbVRhYmxlT2ZBbGlhcyggKSwKKworCW9uQ3JlYXRlUm91dGluZSggU3BlY2lmaWVyOjpTQ09QRV9ST1VUSU5FX0tJTkQgLCB0aGlzICwgImNyZWF0ZSIgLCAwICksCisKKwlvbkluaXRSb3V0aW5lICggU3BlY2lmaWVyOjpTQ09QRV9ST1VUSU5FX0tJTkQgLCB0aGlzICwgImluaXQiICAsIDAgKSwKKwlvbkZpbmFsUm91dGluZSggU3BlY2lmaWVyOjpTQ09QRV9ST1VUSU5FX0tJTkQgLCB0aGlzICwgImZpbmFsIiAsIDAgKSwKKworCW9uUmV0dXJuUm91dGluZSggU3BlY2lmaWVyOjpTQ09QRV9ST1VUSU5FX0tJTkQgLCB0aGlzICwgInJldHVybiIgLCAwICksCisKKwlvblN0YXJ0Um91dGluZSggU3BlY2lmaWVyOjpTQ09QRV9ST1VUSU5FX0tJTkQgLCB0aGlzICwgInN0YXJ0IiAsIDAgKSwKKwlvblN0b3BSb3V0aW5lICggU3BlY2lmaWVyOjpTQ09QRV9ST1VUSU5FX0tJTkQgLCB0aGlzICwgInN0b3AiICAsIDAgKSwKKworCW9uSUVuYWJsZVJvdXRpbmUoIFNwZWNpZmllcjo6U0NPUEVfUk9VVElORV9LSU5EICwgdGhpcyAsICJpZW5hYmxlIiAsIDAgKSwKKwlvbkVuYWJsZVJvdXRpbmUgKCBTcGVjaWZpZXI6OlNDT1BFX1JPVVRJTkVfS0lORCAsIHRoaXMgLCAiZW5hYmxlIiAgLCAwICksCisKKwlvbklEaXNhYmxlUm91dGluZSggU3BlY2lmaWVyOjpTQ09QRV9ST1VUSU5FX0tJTkQgLCB0aGlzICwgImlkaXNhYmxlIiAsIDAgKSwKKwlvbkRpc2FibGVSb3V0aW5lICggU3BlY2lmaWVyOjpTQ09QRV9ST1VUSU5FX0tJTkQgLCB0aGlzICwgImRpc2FibGUiICAsIDAgKSwKKworCW9uSUFib3J0Um91dGluZSggU3BlY2lmaWVyOjpTQ09QRV9ST1VUSU5FX0tJTkQgLCB0aGlzICwgImlhYm9ydCIgLCAwICksCisJb25BYm9ydFJvdXRpbmUgKCBTcGVjaWZpZXI6OlNDT1BFX1JPVVRJTkVfS0lORCAsIHRoaXMgLCAiYWJvcnQiICAsIDAgKSwKKworCW9uSVJ1blJvdXRpbmUoIFNwZWNpZmllcjo6U0NPUEVfUk9VVElORV9LSU5EICwgdGhpcyAsICJpcnVuIiAsIDAgKSwKKwlvblJ1blJvdXRpbmUgKCBTcGVjaWZpZXI6OlNDT1BFX1JPVVRJTkVfS0lORCAsIHRoaXMgLCAicnVuIiAgLCAwICksCisJb25SdGNSb3V0aW5lICggU3BlY2lmaWVyOjpTQ09QRV9ST1VUSU5FX0tJTkQgLCB0aGlzICwgInJ0YyIgICwgMCApLAorCisJb25TY2hlZHVsZVJvdXRpbmUgICAoIFNwZWNpZmllcjo6U0NPUEVfUk9VVElORV9LSU5EICwgdGhpcyAsICJzY2hlZHVsZSIgICAgLCAwICApLAorCW9uQ29uY3VycmVuY3lSb3V0aW5lKCBTcGVjaWZpZXI6OlNDT1BFX1JPVVRJTkVfS0lORCAsIHRoaXMgLCAiY29uY3VycmVuY3kiICwgMCApLAorCisJb25TeW5jaHJvbml6ZVJvdXRpbmUoIFNwZWNpZmllcjo6U0NPUEVfUk9VVElORV9LSU5EICwgdGhpcyAsICJzeW5jaHJvbml6ZSIgLCAwICksCisKKwltTWFpbkNvbXBvbmVudEZsYWcoICggKGFzdE1hY2hpbmUgPT0gTlVMTCkgfHwKKwkJCWFzdE1hY2hpbmUtPmdldE1vZGlmaWVyKCkuaGFzRmVhdHVyZVRyYW5zaWVudCgpICkgPyBmYWxzZSA6IHRydWUgKSwKKworCW1NdXRhYmxlU2NoZWR1bGVGbGFnKCBmYWxzZSApLAorCisJbVRhYmxlT2ZSb3V0ZXI0SW5zdGFuY2UoICksCisKKwltVGFibGVPZlJvdXRlcjRNb2RlbCggKSwKKworCW1SZHZDb21tdW5pY2F0aW9uRmxhZyggZmFsc2UgKSwKKworCW1JbnB1dEVuYWJsZWRDb21tdW5pY2F0aW9uRmxhZyggZmFsc2UgKSwKKworCW1SZXF1aXJlZERhdGEoICksCisJbVVzZWxlc3NEYXRhKCApLAorCisJbUJhY2t3YXJkUmVhY2hhYmxlTWFjaGluZSggKSwKKwltQmFja3dhcmRSZWFjaGFibGVUcmFuc2l0aW9uKCApLAorCisJbUZvcndhcmRSZWFjaGFibGVNYWNoaW5lKCApLAorCW1Gb3J3YXJkUmVhY2hhYmxlVHJhbnNpdGlvbiggKSwKKworCWlzUmVhY2hhYmxlU3RhdGVGbGFnKCB0cnVlICkKKwl7CisJCXVwZGF0ZUZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7CisJfQorCisJRXhlY3V0YWJsZUZvcm0oRXhlY3V0YWJsZVN5c3RlbSAmIGFFeGVjdXRhYmxlU3lzdGVtLCBhdm1fc2l6ZV90IGFEYXRhU2l6ZSkKKwk6IEF2bVByb2dyYW0oQ0xBU1NfS0lORF9UKCBFeGVjdXRhYmxlRm9ybSApLAorCQkJU3BlY2lmaWVyOjpTQ09QRV9NQUNISU5FX0tJTkQsIE5VTEwsIE5VTEwsIGFEYXRhU2l6ZSksCisJU3BlY2lmaWVySW1wbCggU3BlY2lmaWVyOjpDT01QT05FTlRfRVhFQ1VUQUJMRV9TUEVDSUZJRVIgKSwKKworCW1FeGVjdXRhYmxlU3lzdGVtKCBhRXhlY3V0YWJsZVN5c3RlbSApLAorCisJbUluaXRpYWxJbnN0YW5jZUNvdW50KCAxICksCisJbU1heGltYWxJbnN0YW5jZUNvdW50KCAxICksCisKKwltUG9zc2libGVTdGF0aWNJbnN0YW5jaWF0aW9uQ291bnQoIDAgKSwKKwltUG9zc2libGVEeW5hbWljSW5zdGFuY2lhdGlvbkNvdW50KCAwICksCisKKwltVGFibGVPZkNoYW5uZWwoICksCisKKwltVGFibGVPZlBvcnQoICksCisJbU1lc3NhZ2VTaWduYWxDb3VudCggMCApLAorCisJbVRhYmxlT2ZCdWZmZXIoICksCisJbVRhYmxlT2ZDb25uZWN0KCApLAorCisJbVRhYmxlT2ZJbnN0YW5jZU1vZGVsKCApLAorCisJbVRhYmxlT2ZJbnN0YW5jZVN0YXRpYyggKSwKKwltUHJvdG90eXBlSW5zdGFuY2UoICksCisKKwltVGFibGVPZkluc3RhbmNlRHluYW1pYyggKSwKKworCW1UYWJsZU9mVHJhbnNpdGlvbiggKSwKKwltVGFibGVPZlByb2dyYW0oICksCisJbVRhYmxlT2ZBbm9ueW1vdXNJbm5lclJvdXRpbmUoICksCisKKwltVGFibGVPZkV4ZWN1dGFibGUoICksCisKKwltVGFibGVPZkFsaWFzKCApLAorCisJb25DcmVhdGVSb3V0aW5lKCBTcGVjaWZpZXI6OlNDT1BFX1JPVVRJTkVfS0lORCAsIHRoaXMgLCAiY3JlYXRlIiAsIDAgKSwKKworCW9uSW5pdFJvdXRpbmUgKCBTcGVjaWZpZXI6OlNDT1BFX1JPVVRJTkVfS0lORCAsIHRoaXMgLCAiaW5pdCIgICwgMCApLAorCW9uRmluYWxSb3V0aW5lKCBTcGVjaWZpZXI6OlNDT1BFX1JPVVRJTkVfS0lORCAsIHRoaXMgLCAiZmluYWwiICwgMCApLAorCisJb25SZXR1cm5Sb3V0aW5lKCBTcGVjaWZpZXI6OlNDT1BFX1JPVVRJTkVfS0lORCAsIHRoaXMgLCAicmV0dXJuIiAsIDAgKSwKKworCW9uU3RhcnRSb3V0aW5lKCBTcGVjaWZpZXI6OlNDT1BFX1JPVVRJTkVfS0lORCAsIHRoaXMgLCAic3RhcnQiICwgMCApLAorCW9uU3RvcFJvdXRpbmUgKCBTcGVjaWZpZXI6OlNDT1BFX1JPVVRJTkVfS0lORCAsIHRoaXMgLCAic3RvcCIgICwgMCApLAorCisJb25JRW5hYmxlUm91dGluZSggU3BlY2lmaWVyOjpTQ09QRV9ST1VUSU5FX0tJTkQgLCB0aGlzICwgImllbmFibGUiICwgMCApLAorCW9uRW5hYmxlUm91dGluZSAoIFNwZWNpZmllcjo6U0NPUEVfUk9VVElORV9LSU5EICwgdGhpcyAsICJlbmFibGUiICAsIDAgKSwKKworCW9uSURpc2FibGVSb3V0aW5lKCBTcGVjaWZpZXI6OlNDT1BFX1JPVVRJTkVfS0lORCAsIHRoaXMgLCAiaWRpc2FibGUiICwgMCApLAorCW9uRGlzYWJsZVJvdXRpbmUgKCBTcGVjaWZpZXI6OlNDT1BFX1JPVVRJTkVfS0lORCAsIHRoaXMgLCAiZGlzYWJsZSIgICwgMCApLAorCisJb25JQWJvcnRSb3V0aW5lKCBTcGVjaWZpZXI6OlNDT1BFX1JPVVRJTkVfS0lORCAsIHRoaXMgLCAiaWFib3J0IiAsIDAgKSwKKwlvbkFib3J0Um91dGluZSAoIFNwZWNpZmllcjo6U0NPUEVfUk9VVElORV9LSU5EICwgdGhpcyAsICJhYm9ydCIgICwgMCApLAorCisJb25JUnVuUm91dGluZSggU3BlY2lmaWVyOjpTQ09QRV9ST1VUSU5FX0tJTkQgLCB0aGlzICwgImlydW4iICwgMCApLAorCW9uUnVuUm91dGluZSAoIFNwZWNpZmllcjo6U0NPUEVfUk9VVElORV9LSU5EICwgdGhpcyAsICJydW4iICAsIDAgKSwKKwlvblJ0Y1JvdXRpbmUgKCBTcGVjaWZpZXI6OlNDT1BFX1JPVVRJTkVfS0lORCAsIHRoaXMgLCAicnRjIiAgLCAwICksCisKKwlvblNjaGVkdWxlUm91dGluZSAgICggU3BlY2lmaWVyOjpTQ09QRV9ST1VUSU5FX0tJTkQgLCB0aGlzICwgInNjaGVkdWxlIiAgICAsIDAgICksCisJb25Db25jdXJyZW5jeVJvdXRpbmUoIFNwZWNpZmllcjo6U0NPUEVfUk9VVElORV9LSU5EICwgdGhpcyAsICJjb25jdXJyZW5jeSIgLCAwICksCisKKwlvblN5bmNocm9uaXplUm91dGluZSggU3BlY2lmaWVyOjpTQ09QRV9ST1VUSU5FX0tJTkQgLCB0aGlzICwgInN5bmNocm9uaXplIiAsIDAgKSwKKworCW1NYWluQ29tcG9uZW50RmxhZyggZmFsc2UgKSwKKworCW1NdXRhYmxlU2NoZWR1bGVGbGFnKCBmYWxzZSApLAorCisJbVRhYmxlT2ZSb3V0ZXI0SW5zdGFuY2UoICksCisKKwltVGFibGVPZlJvdXRlcjRNb2RlbCggKSwKKworCW1SZHZDb21tdW5pY2F0aW9uRmxhZyggZmFsc2UgKSwKKworCW1JbnB1dEVuYWJsZWRDb21tdW5pY2F0aW9uRmxhZyggZmFsc2UgKSwKKworCW1SZXF1aXJlZERhdGEoICksCisJbVVzZWxlc3NEYXRhKCApLAorCisJbUJhY2t3YXJkUmVhY2hhYmxlTWFjaGluZSggKSwKKwltQmFja3dhcmRSZWFjaGFibGVUcmFuc2l0aW9uKCApLAorCisJbUZvcndhcmRSZWFjaGFibGVNYWNoaW5lKCApLAorCW1Gb3J3YXJkUmVhY2hhYmxlVHJhbnNpdGlvbiggKSwKKworCWlzUmVhY2hhYmxlU3RhdGVGbGFnKCB0cnVlICkKKwl7CisJCXVwZGF0ZUZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7CisJfQorCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+RXhlY3V0YWJsZUZvcm0oKQorCXsKKwkJbVJlcXVpcmVkRGF0YS5jbGVhcigpOworCQltVXNlbGVzc0RhdGEuY2xlYXIoKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIGlzIGluIFNDT1BFCisJICovCisJaW5saW5lIGJvb2wgaXNBbmNlc3Rvck9mKGNvbnN0IEV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlKQorCXsKKwkJd2hpbGUoIChhbkV4ZWN1dGFibGUgIT0gTlVMTCkgJiYgKGFuRXhlY3V0YWJsZSAhPSB0aGlzKSApCisJCXsKKwkJCWFuRXhlY3V0YWJsZSA9IGFuRXhlY3V0YWJsZS0+Z2V0RXhlY3V0YWJsZUNvbnRhaW5lcigpOworCQl9CisJCXJldHVybiggYW5FeGVjdXRhYmxlID09IHRoaXMgKTsKKwl9CisKKworCS8qKgorCSAqIFNFVFRFUgorCSAqIG1GdWxseVF1YWxpZmllZE5hbWVJRAorCSAqLworCXZpcnR1YWwgdm9pZCB1cGRhdGVGdWxseVF1YWxpZmllZE5hbWVJRCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEKTsKKworCWlubGluZSB2aXJ0dWFsIHZvaWQgdXBkYXRlRnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCXsKKwkJaWYoIGhhc0FzdEVsZW1lbnQoKSApCisJCXsKKwkJCXVwZGF0ZUZ1bGx5UXVhbGlmaWVkTmFtZUlEKCBnZXRBc3RGdWxseVF1YWxpZmllZE5hbWVJRCgpICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlzZXRBbGxOYW1lSUQoICJleGVjI2Fub255bSIgLCAiZXhlYyNhbm9ueW0iICk7CisJCX0KKwl9CisKKworCS8qKgorCSAqIExDQSAtTENSQQorCSAqLworCWNvbnN0IEV4ZWN1dGFibGVGb3JtICogTENBKAorCQkJY29uc3QgRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGUpIGNvbnN0OworCisJaW5saW5lIGNvbnN0IEV4ZWN1dGFibGVGb3JtICogTENSQSgKKwkJCWNvbnN0IEV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlKSBjb25zdAorCXsKKwkJcmV0dXJuKCAodGhpcyA9PSBhbkV4ZWN1dGFibGUpID8gdGhpcyA6IExDQSggYW5FeGVjdXRhYmxlICkgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIENvbXBpbGVkIE9iamVjdEVsZW1lbnQgYXMgQ29tcGlsZWQgTWFjaGluZQorCSAqLworCWlubGluZSBjb25zdCBNYWNoaW5lICogZ2V0QXN0TWFjaGluZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldEFzdEVsZW1lbnQoKS0+YXM8IE1hY2hpbmUgPigpICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNBc3RNYWNoaW5lKCkgY29uc3QKKwl7CisJCXJldHVybiggaGFzQXN0RWxlbWVudCgpICYmIGdldEFzdEVsZW1lbnQoKS0+aXM8IE1hY2hpbmUgPigpICk7CisJfQorCisKKwlpbmxpbmUgY29uc3QgU3lzdGVtICogZ2V0QXN0U3lzdGVtKCkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0QXN0RWxlbWVudCgpLT5hczwgU3lzdGVtID4oKSApOworCX0KKworCWlubGluZSBib29sIGlzQ29tcGlsZWRTeXN0ZW0oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBoYXNBc3RFbGVtZW50KCkgJiYgZ2V0QXN0RWxlbWVudCgpLT5pczwgU3lzdGVtID4oKSApOworCX0KKworCisKKwkvKioKKwkgKiBQcmltaXRpdmUgaW5saW5pbmcKKwkgKi8KKwlib29sIGlzSW5saW5hYmxlRW5hYmxlKCkgY29uc3QKKwl7CisJCXJldHVybiggaGFzQXN0RWxlbWVudCgpICYmIGdldEFzdEVsZW1lbnQoKS0+aXM8IE1hY2hpbmUgPigpICYmCisJCQkJZ2V0QXN0TWFjaGluZSgpLT5pc0lubGluYWJsZUVuYWJsZSgpICk7CisJfQorCisJYm9vbCBpc0lubGluYWJsZVByb2NlZHVyZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGhhc0FzdEVsZW1lbnQoKSAmJiBnZXRBc3RFbGVtZW50KCktPmlzPCBNYWNoaW5lID4oKSAmJgorCQkJCWdldEFzdE1hY2hpbmUoKS0+aXNJbmxpbmFibGVQcm9jZWR1cmUoKSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUluaXRpYWxJbnN0YW5jZUNvdW50CisJICovCisJaW5saW5lIGF2bV9zaXplX3QgZ2V0SW5pdGlhbEluc3RhbmNlQ291bnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtSW5pdGlhbEluc3RhbmNlQ291bnQgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNJbml0aWFsSW5zdGFuY2UoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtSW5pdGlhbEluc3RhbmNlQ291bnQgPiAwICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0SW5pdGlhbEluc3RhbmNlQ291bnQoYXZtX3NpemVfdCBhbkluaXRpYWxJbnN0YW5jZUNvdW50KQorCXsKKwkJbUluaXRpYWxJbnN0YW5jZUNvdW50ID0gYW5Jbml0aWFsSW5zdGFuY2VDb3VudDsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1NYXhpbWFsSW5zdGFuY2VDb3VudAorCSAqLworCWlubGluZSBhdm1fc2l6ZV90IGdldE1heGltYWxJbnN0YW5jZUNvdW50KCkgY29uc3QKKwl7CisJCXJldHVybiggbU1heGltYWxJbnN0YW5jZUNvdW50ICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzTWF4aW1hbEluc3RhbmNlKCkgY29uc3QKKwl7CisJCXJldHVybiggbU1heGltYWxJbnN0YW5jZUNvdW50ICE9IEFWTV9OVU1FUklDX01BWF9TSVpFX1QgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNNYXhpbWFsTmV3SW5zdGFuY2UoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobU1heGltYWxJbnN0YW5jZUNvdW50ID4gbUluaXRpYWxJbnN0YW5jZUNvdW50KSAmJgorCQkJCShtTWF4aW1hbEluc3RhbmNlQ291bnQgIT0gQVZNX05VTUVSSUNfTUFYX1NJWkVfVCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRNYXhpbWFsSW5zdGFuY2VDb3VudChhdm1fc2l6ZV90IGFNYXhpbWFsSW5zdGFuY2VDb3VudCkKKwl7CisJCW1NYXhpbWFsSW5zdGFuY2VDb3VudCA9IGFNYXhpbWFsSW5zdGFuY2VDb3VudDsKKwl9CisKKworCS8qKgorCSAqIFNFVFRFUgorCSAqIG1Jbml0aWFsSW5zdGFuY2VDb3VudAorCSAqIG1NYXhpbWFsSW5zdGFuY2VDb3VudAorCSAqLworCWlubGluZSB2b2lkIHNldEluc3RhbmNlQ291bnQoYXZtX3NpemVfdCBhbkluaXRpYWxJbnN0YW5jZUNvdW50LAorCQkJYXZtX3NpemVfdCBhTWF4aW1hbEluc3RhbmNlQ291bnQpCisJeworCQltSW5pdGlhbEluc3RhbmNlQ291bnQgPSBhbkluaXRpYWxJbnN0YW5jZUNvdW50OworCisJCW1NYXhpbWFsSW5zdGFuY2VDb3VudCA9IGFNYXhpbWFsSW5zdGFuY2VDb3VudDsKKwl9CisKKwlpbmxpbmUgYXZtX3NpemVfdCBnZXRDcmVhdGVkSW5zdGFuY2VDb3VudCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Jbml0aWFsSW5zdGFuY2VDb3VudCApOworCisvLwkJcmV0dXJuKCAobU1heGltYWxJbnN0YW5jZUNvdW50ICE9IEFWTV9OVU1FUklDX01BWF9TSVpFX1QpID8KKy8vCQkJCW1NYXhpbWFsSW5zdGFuY2VDb3VudCA6IG1Jbml0aWFsSW5zdGFuY2VDb3VudCApOworCX0KKworCisJLyoKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtUG9zc2libGVTdGF0aWNJbnN0YW5jaWF0aW9uQ291bnQKKwkgKiBtUG9zc2libGVEeW5hbWljSW5zdGFuY2lhdGlvbkNvdW50CisJICogU2luZ2xlIG9yIE11bHRpcGxlCisJICogSW5zdGFuY2lhdGlvbiBJbmZvcm1hdGlvbgorCSAqIGZvciBEYXRhIEFjY2VzcyBvcHRpbWlzYXRpb24KKwkgKi8KKwlpbmxpbmUgYXZtX3NpemVfdCBnZXRQb3NzaWJsZVN0YXRpY0luc3RhbmNpYXRpb25Db3VudCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Qb3NzaWJsZVN0YXRpY0luc3RhbmNpYXRpb25Db3VudCApOworCX0KKworCWlubGluZSBib29sIGhhc1Bvc3NpYmxlU3RhdGljSW5zdGFuY2lhdGlvbigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Qb3NzaWJsZVN0YXRpY0luc3RhbmNpYXRpb25Db3VudCA+IDAgKTsKKwl9CisKKwl2b2lkIGluY3JQb3NzaWJsZVN0YXRpY0luc3RhbmNpYXRpb25Db3VudChhdm1fb2Zmc2V0X3Qgb2Zmc2V0ID0gMSk7CisKKworCWlubGluZSBhdm1fc2l6ZV90IGdldFBvc3NpYmxlRHluYW1pY0luc3RhbmNpYXRpb25Db3VudCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Qb3NzaWJsZUR5bmFtaWNJbnN0YW5jaWF0aW9uQ291bnQgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNQb3NzaWJsZUR5bmFtaWNJbnN0YW5jaWF0aW9uKCkgY29uc3QKKwl7CisJCXJldHVybiggbVBvc3NpYmxlRHluYW1pY0luc3RhbmNpYXRpb25Db3VudCA+IDAgKTsKKwl9CisKKwl2b2lkIGluY3JQb3NzaWJsZUR5bmFtaWNJbnN0YW5jaWF0aW9uQ291bnQoYXZtX3NpemVfdCBvZmZzZXQgPSAxKTsKKworCisJYm9vbCBoYXNTaW5nbGVSdW50aW1lSW5zdGFuY2UoKTsKKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVRhYmxlT2ZDaGFubmVsCisJICovCisJaW5saW5lIGNvbnN0IFN5bWJvbCAmIHNhdmVDaGFubmVsKEluc3RhbmNlT2ZQb3J0ICogYW5JbnN0YW5jZSkKKwl7CisJCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9QT0lOVEVSX0VYSVQoIGFuSW5zdGFuY2UgKQorCQkJCTw8ICJJbnN0YW5jZU9mUG9ydCAhISEiCisJCQkJPDwgU0VORF9FWElUOworCisJCWFuSW5zdGFuY2UtPnNldENvbnRhaW5lcih0aGlzKTsKKworCQlyZXR1cm4oIG1UYWJsZU9mQ2hhbm5lbC5zYXZlKGFuSW5zdGFuY2UpICk7CisJfQorCisJaW5saW5lIFRhYmxlT2ZTeW1ib2wgJiBnZXRDaGFubmVsKCkKKwl7CisJCXJldHVybiggbVRhYmxlT2ZDaGFubmVsICk7CisJfQorCisJaW5saW5lIGNvbnN0IFRhYmxlT2ZTeW1ib2wgJiBnZXRDaGFubmVsKCkgY29uc3QKKwl7CisJCXJldHVybiggbVRhYmxlT2ZDaGFubmVsICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzQ2hhbm5lbCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZU9mQ2hhbm5lbC5ub25lbXB0eSgpICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtVGFibGVPZlBvcnQKKwkgKi8KKwlpbmxpbmUgY29uc3QgU3ltYm9sICYgc2F2ZVBvcnQoSW5zdGFuY2VPZlBvcnQgKiBhbkluc3RhbmNlKQorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggYW5JbnN0YW5jZSApCisJCQkJPDwgIkluc3RhbmNlT2ZQb3J0ICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJYW5JbnN0YW5jZS0+c2V0Q29udGFpbmVyKHRoaXMpOworCisJCXJldHVybiggbVRhYmxlT2ZQb3J0LnNhdmUoYW5JbnN0YW5jZSkgKTsKKwl9CisKKwlpbmxpbmUgVGFibGVPZlN5bWJvbCAmIGdldFBvcnQoKQorCXsKKwkJcmV0dXJuKCBtVGFibGVPZlBvcnQgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgVGFibGVPZlN5bWJvbCAmIGdldFBvcnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVGFibGVPZlBvcnQgKTsKKwl9CisKKworCWlubGluZSBib29sIGhhc1BvcnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVGFibGVPZlBvcnQubm9uZW1wdHkoKSApOworCX0KKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1NZXNzYWdlU2lnbmFsQ291bnQKKwkgKi8KKwlpbmxpbmUgYXZtX3NpemVfdCBnZXRNZXNzYWdlU2lnbmFsQ291bnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtTWVzc2FnZVNpZ25hbENvdW50ICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzTWVzc2FnZVNpZ25hbENvdW50KCkgY29uc3QKKwl7CisJCXJldHVybiggbU1lc3NhZ2VTaWduYWxDb3VudCA+IDAgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRNZXNzYWdlU2lnbmFsQ291bnQoYXZtX3NpemVfdCBjb3VudCkKKwl7CisJCW1NZXNzYWdlU2lnbmFsQ291bnQgPSBjb3VudDsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1UYWJsZU9mQnVmZmVyCisJICovCisKKwlpbmxpbmUgY29uc3QgU3ltYm9sICYgc2F2ZUJ1ZmZlcihJbnN0YW5jZU9mQnVmZmVyICogYW5JbnN0YW5jZSkKKwl7CisJCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9QT0lOVEVSX0VYSVQoIGFuSW5zdGFuY2UgKQorCQkJCTw8ICJCYXNlSW5zdGFuY2VGb3JtICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJYW5JbnN0YW5jZS0+c2V0Q29udGFpbmVyKHRoaXMpOworCisJCXJldHVybiggbVRhYmxlT2ZCdWZmZXIuc2F2ZShhbkluc3RhbmNlKSApOworCX0KKworCWlubGluZSBUYWJsZU9mU3ltYm9sICYgZ2V0QnVmZmVyKCkKKwl7CisJCXJldHVybiggbVRhYmxlT2ZCdWZmZXIgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgVGFibGVPZlN5bWJvbCAmIGdldEJ1ZmZlcigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZU9mQnVmZmVyICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBoYXNCdWZmZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVGFibGVPZkJ1ZmZlci5ub25lbXB0eSgpICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtVGFibGVPZkNvbm5lY3QKKwkgKi8KKworCWlubGluZSBjb25zdCBTeW1ib2wgJiBzYXZlQ29ubmVjdChJbnN0YW5jZU9mQ29ubmVjdCAqIGFuSW5zdGFuY2UpCisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBhbkluc3RhbmNlICkKKwkJCQk8PCAiQmFzZUluc3RhbmNlRm9ybSAhISEiCisJCQkJPDwgU0VORF9FWElUOworCisJCWFuSW5zdGFuY2UtPnNldENvbnRhaW5lcih0aGlzKTsKKworCQlyZXR1cm4oIG1UYWJsZU9mQ29ubmVjdC5zYXZlKGFuSW5zdGFuY2UpICk7CisJfQorCisJaW5saW5lIFRhYmxlT2ZTeW1ib2wgJiBnZXRDb25uZWN0KCkKKwl7CisJCXJldHVybiggbVRhYmxlT2ZDb25uZWN0ICk7CisJfQorCisJaW5saW5lIGNvbnN0IFRhYmxlT2ZTeW1ib2wgJiBnZXRDb25uZWN0KCkgY29uc3QKKwl7CisJCXJldHVybiggbVRhYmxlT2ZDb25uZWN0ICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBoYXNDb25uZWN0KCkgY29uc3QKKwl7CisJCXJldHVybiggbVRhYmxlT2ZDb25uZWN0Lm5vbmVtcHR5KCkgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIENvbW11bmljYXRlZCBvciBMaWZlbGluZQorCSAqLworCWlubGluZSBib29sIGlzQ29tbXVuaWNhdG9yKCkgY29uc3QKKwl7CisJCXJldHVybiggaGFzUG9ydCgpIHx8IGhhc1JvdXRlcjRUaGlzKCkgfHwgaGFzQ29ubmVjdCgpICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNDb21tdW5pY2F0b3JXaXRoKEluc3RhbmNlT2ZQb3J0ICogYVBvcnQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZU9mUG9ydC5jb250YWlucyhhUG9ydCkKKwkJCXx8IChoYXNSb3V0ZXI0VGhpcygpICYmIGdldFJvdXRlcjRUaGlzKCkuaGFzUm91dGluZyhhUG9ydCkpICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNMaWZlbGluZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldFNwZWNpZmllcigpLmhhc0ZlYXR1cmVMaWZlbGluZSgpICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtRGVmYXVsdCBpbnN0YW5jZSBmb3IgdXNpbmcgbWFjaGluZSBtb2RlbAorCSAqLworCWlubGluZSBjb25zdCBTeW1ib2wgJiBzYXZlSW5zdGFuY2VNb2RlbChJbnN0YW5jZU9mTWFjaGluZSAqIGFuSW5zdGFuY2UpCisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBhbkluc3RhbmNlICkKKwkJCQk8PCAiSW5zdGFuY2VPZk1hY2hpbmUgISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQlhbkluc3RhbmNlLT5zZXRDb250YWluZXIodGhpcyk7CisKKwkJcmV0dXJuKCBtVGFibGVPZkluc3RhbmNlTW9kZWwuc2F2ZSggYW5JbnN0YW5jZSApICk7CisJfQorCisJaW5saW5lIHZvaWQgYXBwZW5kSW5zdGFuY2VNb2RlbChTeW1ib2wgJiBhTWFjaGluZSkKKwl7CisJCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9TTUFSVF9QT0lOVEVSX0VYSVQoIGFNYWNoaW5lICkKKwkJCQk8PCAiSW5zdGFuY2VPZk1hY2hpbmUgISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQlhTWFjaGluZS5zZXRDb250YWluZXIodGhpcyk7CisKKwkJbVRhYmxlT2ZJbnN0YW5jZU1vZGVsLmFwcGVuZCggYU1hY2hpbmUgKTsKKwl9CisKKworCWlubGluZSBUYWJsZU9mU3ltYm9sICYgZ2V0SW5zdGFuY2VNb2RlbCgpCisJeworCQlyZXR1cm4oIG1UYWJsZU9mSW5zdGFuY2VNb2RlbCApOworCX0KKworCWlubGluZSBjb25zdCBUYWJsZU9mU3ltYm9sICYgZ2V0SW5zdGFuY2VNb2RlbCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZU9mSW5zdGFuY2VNb2RlbCApOworCX0KKworCWlubGluZSBjb25zdCBTeW1ib2wgJiBnZXRCeUFzdEluc3RhbmNlTW9kZWwoCisJCQljb25zdCBPYmplY3RFbGVtZW50ICogYXN0RWxlbWVudCkgY29uc3QKKwl7CisJCWNvbnN0IFN5bWJvbCAmIGFNb2RlbCA9CisJCQkJbVRhYmxlT2ZJbnN0YW5jZU1vZGVsLmdldEJ5QXN0RWxlbWVudChhc3RFbGVtZW50KTsKKworCQkvLyBUbyBpZ25vcmUgdGhlIFRISVMgaW5zdGFuY2UgYXQgb2Zmc2V0IDAgISEhCisJCXJldHVybiggKCBhTW9kZWwuaW52YWxpZCgpIHx8IGFNb2RlbC5pc25vdFRoaXModGhpcykgKSA/CisJCQkJCQlhTW9kZWwgOiBTeW1ib2w6OlJFRl9OVUxMICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzSW5zdGFuY2VNb2RlbCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZU9mSW5zdGFuY2VNb2RlbC5ub25lbXB0eSgpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzSW5zdGFuY2VNb2RlbFRoaXMoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVGFibGVPZkluc3RhbmNlTW9kZWwubm9uZW1wdHkoKSAmJgorCQkJCW1UYWJsZU9mSW5zdGFuY2VNb2RlbC5maXJzdCgpLmlzVGhpcygpICk7CisJfQorCisKKwlpbmxpbmUgY29uc3QgU3ltYm9sICYgZmlyc3RJbnN0YW5jZU1vZGVsKCkgY29uc3QKKwl7CisJCXJldHVybiggaGFzSW5zdGFuY2VNb2RlbFRoaXMoKSA/CisJCQkJbVRhYmxlT2ZJbnN0YW5jZU1vZGVsLnNlY29uZCgpIDoKKwkJCQltVGFibGVPZkluc3RhbmNlTW9kZWwuZmlyc3QoKSApOworCX0KKworCWlubGluZSBib29sIGhhc09uZUluc3RhbmNlTW9kZWwoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBoYXNJbnN0YW5jZVN0YXRpY1RoaXMoKQorCQkJCSYmIChtVGFibGVPZkluc3RhbmNlTW9kZWwuc2l6ZSgpID09IDIpICk7CisJfQorCisJaW5saW5lIGF2bV9zaXplX3Qgc2l6ZUluc3RhbmNlTW9kZWwoKSBjb25zdAorCXsKKwkJLy8gZG9uJ3QgZm9yZ2V0IHRoZSBpbnN0YW5jZSBUSElTIGF0IG9mZnNldCAwICEhIQorCQlyZXR1cm4oIG1UYWJsZU9mSW5zdGFuY2VNb2RlbC5zaXplKCkKKwkJCQktIChoYXNJbnN0YW5jZVN0YXRpY1RoaXMoKSA/IDEgOiAwKSApOworCX0KKworCisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBiZWdpbiAtLSBlbmQKKwkgKiBpdGVyYXRvcgorCSAqLworCWlubGluZSBUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBpbnN0YW5jZV9tb2RlbF9iZWdpbigpIGNvbnN0CisJeworCQkvLyBkb24ndCBmb3JnZXQgdGhlIGluc3RhbmNlIFRISVMgYXQgb2Zmc2V0IDAgISEhCisJCXJldHVybiggaGFzSW5zdGFuY2VTdGF0aWNUaGlzKCkgPworCQkJCSsrKG1UYWJsZU9mSW5zdGFuY2VNb2RlbC5iZWdpbigpKSA6CisJCQkJbVRhYmxlT2ZJbnN0YW5jZU1vZGVsLmJlZ2luKCkgKTsKKwl9CisKKwlpbmxpbmUgVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgaW5zdGFuY2VfbW9kZWxfZW5kKCkgY29uc3QKKwl7CisJCXJldHVybiggbVRhYmxlT2ZJbnN0YW5jZU1vZGVsLmVuZCgpICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtVGFibGVPZkluc3RhbmNlU3RhdGljCisJICovCisJaW5saW5lIGNvbnN0IFN5bWJvbCAmIHNhdmVJbnN0YW5jZVN0YXRpYyhJbnN0YW5jZU9mTWFjaGluZSAqIGFuSW5zdGFuY2UpCisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBhbkluc3RhbmNlICkKKwkJCQk8PCAiSW5zdGFuY2VPZk1hY2hpbmUgISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQlhbkluc3RhbmNlLT5zZXRDb250YWluZXIodGhpcyk7CisKKwkJcmV0dXJuKCBtVGFibGVPZkluc3RhbmNlU3RhdGljLnNhdmUoYW5JbnN0YW5jZSkgKTsKKwl9CisKKwlpbmxpbmUgVGFibGVPZlN5bWJvbCAmIGdldEluc3RhbmNlU3RhdGljKCkKKwl7CisJCXJldHVybiggbVRhYmxlT2ZJbnN0YW5jZVN0YXRpYyApOworCX0KKworCWlubGluZSBjb25zdCBUYWJsZU9mU3ltYm9sICYgZ2V0SW5zdGFuY2VTdGF0aWMoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVGFibGVPZkluc3RhbmNlU3RhdGljICk7CisJfQorCisKKwlpbmxpbmUgY29uc3QgU3ltYm9sICYgZ2V0QnlBc3RJbnN0YW5jZVN0YXRpYygKKwkJCWNvbnN0IE9iamVjdEVsZW1lbnQgKiBhc3RFbGVtZW50KSBjb25zdAorCXsKKwkJY29uc3QgU3ltYm9sICYgYW5JbnN0YW5jZSA9CisJCQkJbVRhYmxlT2ZJbnN0YW5jZVN0YXRpYy5nZXRCeUFzdEVsZW1lbnQoYXN0RWxlbWVudCk7CisKKwkJLy8gVG8gaWdub3JlIHRoZSBUSElTIGluc3RhbmNlIGF0IG9mZnNldCAwICEhIQorCQlyZXR1cm4oICggYW5JbnN0YW5jZS5pbnZhbGlkKCkgfHwgYW5JbnN0YW5jZS5pc25vdFRoaXModGhpcykgKSA/CisJCQkJCQlhbkluc3RhbmNlIDogU3ltYm9sOjpSRUZfTlVMTCApOworCX0KKworCisJaW5saW5lIGJvb2wgaGFzSW5zdGFuY2VTdGF0aWMoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVGFibGVPZkluc3RhbmNlU3RhdGljLm5vbmVtcHR5KCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNJbnN0YW5jZVN0YXRpY1RoaXMoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVGFibGVPZkluc3RhbmNlU3RhdGljLm5vbmVtcHR5KCkgJiYKKwkJCQltVGFibGVPZkluc3RhbmNlU3RhdGljLmZpcnN0KCkuaXNUaGlzKCkgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgU3ltYm9sICYgZ2V0SW5zdGFuY2VTdGF0aWNUaGlzKCkgY29uc3QKKwl7CisJCXJldHVybiggbVRhYmxlT2ZJbnN0YW5jZVN0YXRpYy5maXJzdCgpICk7CisJfQorCisJaW5saW5lIGNvbnN0IFN5bWJvbCAmIGZpcnN0SW5zdGFuY2VTdGF0aWMoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBoYXNJbnN0YW5jZVN0YXRpY1RoaXMoKSA/CisJCQkJbVRhYmxlT2ZJbnN0YW5jZVN0YXRpYy5zZWNvbmQoKSA6CisJCQkJbVRhYmxlT2ZJbnN0YW5jZVN0YXRpYy5maXJzdCgpICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBoYXNPbmVJbnN0YW5jZVN0YXRpYygpIGNvbnN0CisJeworCQlyZXR1cm4oIGhhc0luc3RhbmNlU3RhdGljVGhpcygpCisJCQkJJiYgKG1UYWJsZU9mSW5zdGFuY2VTdGF0aWMuc2l6ZSgpID09IDIpICk7CisJfQorCisJaW5saW5lIGF2bV9zaXplX3Qgc2l6ZUluc3RhbmNlU3RhdGljKCkgY29uc3QKKwl7CisJCS8vIGRvbid0IGZvcmdldCB0aGUgaW5zdGFuY2UgVEhJUyBhdCBvZmZzZXQgMCAhISEKKwkJcmV0dXJuKCBtVGFibGVPZkluc3RhbmNlU3RhdGljLnNpemUoKQorCQkJCS0gKGhhc0luc3RhbmNlU3RhdGljVGhpcygpID8gMSA6IDApICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBiZWdpbiAtLSBlbmQKKwkgKiBpdGVyYXRvcgorCSAqLworCWlubGluZSBUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBpbnN0YW5jZV9zdGF0aWNfYmVnaW4oKSBjb25zdAorCXsKKwkJLy8gZG9uJ3QgZm9yZ2V0IHRoZSBpbnN0YW5jZSBUSElTIGF0IG9mZnNldCAwICEhIQorCQlyZXR1cm4oIGhhc0luc3RhbmNlU3RhdGljVGhpcygpID8KKwkJCQkrKyhtVGFibGVPZkluc3RhbmNlU3RhdGljLmJlZ2luKCkpIDoKKwkJCQltVGFibGVPZkluc3RhbmNlU3RhdGljLmJlZ2luKCkgKTsKKwl9CisKKworCWlubGluZSBUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBpbnN0YW5jZV9zdGF0aWNfZW5kKCkgY29uc3QKKwl7CisJCXJldHVybiggbVRhYmxlT2ZJbnN0YW5jZVN0YXRpYy5lbmQoKSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogTWFjaGluZSBDb3VudAorCSAqLworCWF2bV9zaXplX3QgZ2V0cmVjTWFjaGluZUNvdW50KCkgY29uc3Q7CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIG1Qcm90b3R5cGVJbnN0YW5jZQorCSAqLworCWlubGluZSBJbnN0YW5jZU9mTWFjaGluZSAqIGdldFByb3RvdHlwZUluc3RhbmNlKCkgY29uc3QKKwl7CisJCXJldHVybiggbVByb3RvdHlwZUluc3RhbmNlICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzUHJvdG90eXBlSW5zdGFuY2UoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUHJvdG90eXBlSW5zdGFuY2UgIT0gTlVMTCApOworCX0KKworCWlubGluZSB2b2lkIHNldFByb3RvdHlwZUluc3RhbmNlKEluc3RhbmNlT2ZNYWNoaW5lICogYW5JbnN0YW5jZSkKKwl7CisJCW1Qcm90b3R5cGVJbnN0YW5jZSA9IGFuSW5zdGFuY2U7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtVGFibGVPZkluc3RhbmNlU3RhdGljCisJICogbVRhYmxlT2ZJbnN0YW5jZU1vZGVsCisJICogbVRhYmxlT2ZJbnN0YW5jZUR5bmFtaWMKKwkgKi8KKwlpbmxpbmUgVGFibGVPZlN5bWJvbCAmIGdldEluc3RhbmNlQnlEZXNpZ24oU3BlY2lmaWVyOjpERVNJR05fS0lORCBhRGVzaWduKQorCXsKKwkJc3dpdGNoKCBhRGVzaWduICkKKwkJeworCQkJY2FzZSBTcGVjaWZpZXI6OkRFU0lHTl9JTlNUQU5DRV9LSU5EOgorCQkJCXJldHVybiggbVRhYmxlT2ZJbnN0YW5jZVN0YXRpYyApOworCisJCQljYXNlIFNwZWNpZmllcjo6REVTSUdOX01PREVMX0tJTkQ6CisJCQkJcmV0dXJuKCBtVGFibGVPZkluc3RhbmNlTW9kZWwgKTsKKworCQkJY2FzZSBTcGVjaWZpZXI6OkRFU0lHTl9EWU5BTUlDX0tJTkQ6CisJCQkJcmV0dXJuKCBtVGFibGVPZkluc3RhbmNlRHluYW1pYyApOworCisJCQlkZWZhdWx0OgorCQkJeworCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQk8PCAiVW5leHBlY3RlZCBpbnN0YW5jZSBkZXNpZ24gPDwgIgorCQkJCQkJPDwgU3BlY2lmaWVyOjpzdHJEZXNpZ24oYURlc2lnbiwgIiIpIDw8ICIgPj4gISEhIgorCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJcmV0dXJuKCBtVGFibGVPZkluc3RhbmNlU3RhdGljICk7CisJCQl9CisJCX0KKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1EZWZhdWx0IGluc3RhbmNlIGZvciB1c2luZyBtYWNoaW5lIG1vZGVsCisJICovCisJaW5saW5lIGNvbnN0IFN5bWJvbCAmIHNhdmVJbnN0YW5jZUR5bmFtaWMoSW5zdGFuY2VPZk1hY2hpbmUgKiBhbkluc3RhbmNlKQorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggYW5JbnN0YW5jZSApCisJCQkJPDwgIkluc3RhbmNlT2ZNYWNoaW5lICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJYW5JbnN0YW5jZS0+c2V0Q29udGFpbmVyKHRoaXMpOworCisJCXJldHVybiggbVRhYmxlT2ZJbnN0YW5jZUR5bmFtaWMuc2F2ZSggYW5JbnN0YW5jZSApICk7CisJfQorCisJaW5saW5lIHZvaWQgYXBwZW5kSW5zdGFuY2VEeW5hbWljKFN5bWJvbCAmIGFNYWNoaW5lKQorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1NNQVJUX1BPSU5URVJfRVhJVCggYU1hY2hpbmUgKQorCQkJCTw8ICJJbnN0YW5jZU9mTWFjaGluZSAhISEiCisJCQkJPDwgU0VORF9FWElUOworCisJCWFNYWNoaW5lLnNldENvbnRhaW5lcih0aGlzKTsKKworCQltVGFibGVPZkluc3RhbmNlRHluYW1pYy5hcHBlbmQoIGFNYWNoaW5lICk7CisJfQorCisKKwlpbmxpbmUgVGFibGVPZlN5bWJvbCAmIGdldEluc3RhbmNlRHluYW1pYygpCisJeworCQlyZXR1cm4oIG1UYWJsZU9mSW5zdGFuY2VEeW5hbWljICk7CisJfQorCisJaW5saW5lIGNvbnN0IFRhYmxlT2ZTeW1ib2wgJiBnZXRJbnN0YW5jZUR5bmFtaWMoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVGFibGVPZkluc3RhbmNlRHluYW1pYyApOworCX0KKworCWlubGluZSBjb25zdCBTeW1ib2wgJiBnZXRCeUFzdEluc3RhbmNlRHluYW1pYygKKwkJCWNvbnN0IE9iamVjdEVsZW1lbnQgKiBhc3RFbGVtZW50KSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVGFibGVPZkluc3RhbmNlRHluYW1pYy5nZXRCeUFzdEVsZW1lbnQoYXN0RWxlbWVudCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNJbnN0YW5jZUR5bmFtaWMoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVGFibGVPZkluc3RhbmNlRHluYW1pYy5ub25lbXB0eSgpICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBiZWdpbiAtLSBlbmQKKwkgKiBpdGVyYXRvcgorCSAqLworCWlubGluZSBUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBpbnN0YW5jZV9keW5hbWljX2JlZ2luKCkgY29uc3QKKwl7CisJCS8vIGRvbid0IGZvcmdldCB0aGUgaW5zdGFuY2UgVEhJUyBhdCBvZmZzZXQgMCAhISEKKwkJcmV0dXJuKCBtVGFibGVPZkluc3RhbmNlRHluYW1pYy5iZWdpbigpICk7CisJfQorCisJaW5saW5lIFRhYmxlT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGluc3RhbmNlX2R5bmFtaWNfZW5kKCkgY29uc3QKKwl7CisJCXJldHVybiggbVRhYmxlT2ZJbnN0YW5jZUR5bmFtaWMuZW5kKCkgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1UYWJsZU9mVHJhbnNpdGlvbgorCSAqLworCWlubGluZSBjb25zdCBCRiAmIHNhdmVUcmFuc2l0aW9uKEF2bVRyYW5zaXRpb24gKiBhVHJhbnNpdGlvbikKKwl7CisJCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9QT0lOVEVSX0VYSVQoIGFUcmFuc2l0aW9uICkKKwkJCQk8PCAiQXZtVHJhbnNpdGlvbiAhISEiCisJCQkJPDwgU0VORF9FWElUOworCisJCWFUcmFuc2l0aW9uLT5zZXRDb250YWluZXIodGhpcyk7CisJCWFUcmFuc2l0aW9uLT5zZXRPZmZzZXQoIG1UYWJsZU9mVHJhbnNpdGlvbi5zaXplKCkgKTsKKworCQlyZXR1cm4oIG1UYWJsZU9mVHJhbnNpdGlvbi5zYXZlKGFUcmFuc2l0aW9uKSApOworCX0KKworCWlubGluZSBUYWJsZU9mVHJhbnNpdGlvbiAmIGdldFRyYW5zaXRpb24oKQorCXsKKwkJcmV0dXJuKCBtVGFibGVPZlRyYW5zaXRpb24gKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgVGFibGVPZlRyYW5zaXRpb24gJiBnZXRUcmFuc2l0aW9uKCkgY29uc3QKKwl7CisJCXJldHVybiggbVRhYmxlT2ZUcmFuc2l0aW9uICk7CisJfQorCisJaW5saW5lIEF2bVRyYW5zaXRpb24gKiByYXdUcmFuc2l0aW9uKGF2bV9vZmZzZXRfdCBvZmZzZXQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZU9mVHJhbnNpdGlvbi5yYXdBdChvZmZzZXQpICk7CisJfQorCisKKwlpbmxpbmUgY29uc3QgQkYgJiBnZXRUcmFuc2l0aW9uKAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZU9mVHJhbnNpdGlvbi5nZXRCeUZRTmFtZUlEKCBhRnVsbHlRdWFsaWZpZWROYW1lSUQgKSApOworCX0KKworCWlubGluZSBjb25zdCBCRiAmIGdldFRyYW5zaXRpb25CeU5hbWVJRChjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZU9mVHJhbnNpdGlvbi5nZXRCeU5hbWVJRCggYU5hbWVJRCApICk7CisJfQorCisJaW5saW5lIGNvbnN0IEJGICYgZ2V0VHJhbnNpdGlvbkJ5UXVhbGlmaWVkTmFtZUlEKAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVGFibGVPZlRyYW5zaXRpb24uZ2V0QnlRdWFsaWZpZWROYW1lSUQoIGFRdWFsaWZpZWROYW1lSUQgKSApOworCX0KKworCisJaW5saW5lIGNvbnN0IEJGICYgZ2V0VHJhbnNpdGlvbkJ5QXN0RWxlbWVudCgKKwkJCWNvbnN0IE9iamVjdEVsZW1lbnQgKiBhc3RFbGVtZW50KSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVGFibGVPZlRyYW5zaXRpb24uZ2V0QnlBc3RFbGVtZW50KGFzdEVsZW1lbnQpICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBoYXNUcmFuc2l0aW9uKCkgY29uc3QKKwl7CisJCXJldHVybiggbVRhYmxlT2ZUcmFuc2l0aW9uLm5vbmVtcHR5KCkgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1UYWJsZU9mUHJvZ3JhbQorCSAqLworCWlubGluZSB2b2lkIGFwcGVuZFByb2dyYW0oY29uc3QgQkYgJiBhbkF2bVByb2dyYW0pCisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfU01BUlRfUE9JTlRFUl9FWElUKCBhbkF2bVByb2dyYW0gKQorCQkJCTw8ICJBdm1Qcm9ncmFtICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJYW5Bdm1Qcm9ncmFtLnRvX3B0cjwgQXZtUHJvZ3JhbSA+KCktPnNldENvbnRhaW5lcih0aGlzKTsKKwkJYW5Bdm1Qcm9ncmFtLnRvX3B0cjwgQXZtUHJvZ3JhbSA+KCktPnNldE9mZnNldCggbVRhYmxlT2ZQcm9ncmFtLnNpemUoKSApOworCisJCW1UYWJsZU9mUHJvZ3JhbS5hcHBlbmQoYW5Bdm1Qcm9ncmFtKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQkYgJiBzYXZlUHJvZ3JhbShBdm1Qcm9ncmFtICogYW5Bdm1Qcm9ncmFtKQorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggYW5Bdm1Qcm9ncmFtICkKKwkJCQk8PCAiQXZtUHJvZ3JhbSAhISEiCisJCQkJPDwgU0VORF9FWElUOworCisJCWFuQXZtUHJvZ3JhbS0+c2V0Q29udGFpbmVyKHRoaXMpOworCQlhbkF2bVByb2dyYW0tPnNldE9mZnNldCggbVRhYmxlT2ZQcm9ncmFtLnNpemUoKSApOworCisJCXJldHVybiggbVRhYmxlT2ZQcm9ncmFtLnNhdmUoYW5Bdm1Qcm9ncmFtKSApOworCX0KKworCWlubGluZSBUYWJsZU9mQXZtUHJvZ3JhbSAmIGdldFByb2dyYW0oKQorCXsKKwkJcmV0dXJuKCBtVGFibGVPZlByb2dyYW0gKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgVGFibGVPZkF2bVByb2dyYW0gJiBnZXRQcm9ncmFtKCkgY29uc3QKKwl7CisJCXJldHVybiggbVRhYmxlT2ZQcm9ncmFtICk7CisJfQorCisJaW5saW5lIEF2bVByb2dyYW0gKiByYXdQcm9ncmFtKGF2bV9vZmZzZXRfdCBvZmZzZXQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZU9mUHJvZ3JhbS5yYXdBdChvZmZzZXQpICk7CisJfQorCisKKwlpbmxpbmUgY29uc3QgQkYgJiBnZXRQcm9ncmFtKGNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlELAorCQkJU3BlY2lmaWVyOjpTQ09QRV9LSU5EIGFTY29wZSA9CisJCQkJCVNwZWNpZmllcjo6U0NPUEVfVU5ERUZJTkVEX0tJTkQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZU9mUHJvZ3JhbS5nZXRCeUZRTmFtZUlEKGFGdWxseVF1YWxpZmllZE5hbWVJRCwgYVNjb3BlKSApOworCX0KKworCWlubGluZSBjb25zdCBCRiAmIGdldFByb2dyYW1CeU5hbWVJRChjb25zdCBzdGQ6OnN0cmluZyAmIGlkLAorCQkJU3BlY2lmaWVyOjpTQ09QRV9LSU5EIGFTY29wZSA9CisJCQkJCVNwZWNpZmllcjo6U0NPUEVfVU5ERUZJTkVEX0tJTkQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZU9mUHJvZ3JhbS5nZXRCeU5hbWVJRChpZCwgYVNjb3BlKSApOworCX0KKworCWlubGluZSBjb25zdCBCRiAmIGdldFByb2dyYW1CeVF1YWxpZmllZE5hbWVJRCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCwKKwkJCVNwZWNpZmllcjo6U0NPUEVfS0lORCBhU2NvcGUgPQorCQkJCQlTcGVjaWZpZXI6OlNDT1BFX1VOREVGSU5FRF9LSU5EKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVGFibGVPZlByb2dyYW0uCisJCQkJZ2V0QnlRdWFsaWZpZWROYW1lSUQoYVF1YWxpZmllZE5hbWVJRCwgYVNjb3BlKSApOworCX0KKworCisJaW5saW5lIGNvbnN0IEJGICYgZ2V0UHJvZ3JhbUJ5QXN0RWxlbWVudCgKKwkJCWNvbnN0IE9iamVjdEVsZW1lbnQgKiBhc3RFbGVtZW50KSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVGFibGVPZlByb2dyYW0uZ2V0QnlBc3RFbGVtZW50KGFzdEVsZW1lbnQpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzUHJvZ3JhbSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZU9mUHJvZ3JhbS5ub25lbXB0eSgpICk7CisJfQorCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVRhYmxlT2ZBbm9ueW1vdXNJbm5lclJvdXRpbmUKKwkgKiBsaWtlIDw8IHZhcmlhYmxlOjpvbl93cml0ZSA+PiBvciA8PCB0eXBlOjpjb25zdHJhaW50ID4+IHJvdXRpbmVzCisJICovCisJaW5saW5lIGNvbnN0IEJGICYgc2F2ZUFub255bW91c0lubmVyUm91dGluZShBdm1Qcm9ncmFtICogYVJvdXRpbmUpCisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBhUm91dGluZSApCisJCQkJPDwgIkFub255bW91cyBJbm5lciBSb3V0aW5lIGFzIFByb2dyYW0gISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQlhUm91dGluZS0+c2V0Q29udGFpbmVyKHRoaXMpOworCQlhUm91dGluZS0+c2V0T2Zmc2V0KCBtVGFibGVPZkFub255bW91c0lubmVyUm91dGluZS5zaXplKCkgKTsKKworCQlyZXR1cm4oIG1UYWJsZU9mQW5vbnltb3VzSW5uZXJSb3V0aW5lLnNhdmUoYVJvdXRpbmUpICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtVGFibGVPZkV4ZWN1dGFibGUKKwkgKi8KKwlpbmxpbmUgY29uc3QgQkYgJiBzYXZlRXhlY3V0YWJsZShFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZSkKKwl7CisJCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9QT0lOVEVSX0VYSVQoIGFuRXhlY3V0YWJsZSApCisJCQkJPDwgIkV4ZWN1dGFibGVGb3JtICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJYW5FeGVjdXRhYmxlLT5zZXRDb250YWluZXIodGhpcyk7CisJCWFuRXhlY3V0YWJsZS0+c2V0T2Zmc2V0KCBtVGFibGVPZkV4ZWN1dGFibGUuc2l6ZSgpICk7CisKKwkJcmV0dXJuKCBtVGFibGVPZkV4ZWN1dGFibGUuc2F2ZShhbkV4ZWN1dGFibGUpICk7CisJfQorCisJaW5saW5lIGNvbnN0IFRhYmxlT2ZFeGVjdXRhYmxlRm9ybSAmIGdldEV4ZWN1dGFibGVzKCkgY29uc3QKKwl7CisJCXJldHVybiggbVRhYmxlT2ZFeGVjdXRhYmxlICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzRXhlY3V0YWJsZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZU9mRXhlY3V0YWJsZS5ub25lbXB0eSgpICk7CisJfQorCisKKwkvKgorCSAqIGNvbnRhaW5zIERBVEEKKwkgKi8KKwlpbmxpbmUgYm9vbCBjb250YWluc0RhdGEoSW5zdGFuY2VPZkRhdGEgKiBhbkluc3RhbmNlKSBjb25zdAorCXsKKwkJcmV0dXJuKCBBdm1Qcm9ncmFtOjpjb250YWluc0RhdGEoYW5JbnN0YW5jZSkgLyp8fAorCQkJCW1UYWJsZU9mQWxpYXMuY29udGFpbnMoYW5JbnN0YW5jZSkqLyApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVRhYmxlT2ZBbGlhcworCSAqLworCWlubGluZSB2b2lkIGFwcGVuZEFsaWFzKGNvbnN0IFN5bWJvbCAmIGFuSW5zdGFuY2UpCisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfU01BUlRfUE9JTlRFUl9FWElUKCBhbkluc3RhbmNlICkKKwkJCQk8PCAiSW5zdGFuY2VPZkRhdGEgISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQltVGFibGVPZkFsaWFzLmFwcGVuZChhbkluc3RhbmNlKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgU3ltYm9sICYgc2F2ZUFsaWFzKEJhc2VJbnN0YW5jZUZvcm0gKiBhbkluc3RhbmNlKQorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggYW5JbnN0YW5jZSApCisJCQkJPDwgIkluc3RhbmNlT2ZEYXRhICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJcmV0dXJuKCBtVGFibGVPZkFsaWFzLnNhdmUoYW5JbnN0YW5jZSkgKTsKKwl9CisKKwlpbmxpbmUgVGFibGVPZlN5bWJvbCAmIGdldEFsaWFzKCkKKwl7CisJCXJldHVybiggbVRhYmxlT2ZBbGlhcyApOworCX0KKworCWlubGluZSBjb25zdCBUYWJsZU9mU3ltYm9sICYgZ2V0QWxpYXMoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVGFibGVPZkFsaWFzICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBoYXNBbGlhcygpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZU9mQWxpYXMubm9uZW1wdHkoKSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSCisJICogYW55IFNZTUJPTCBmaWx0ZXJpbmcgYnkgYW4gb3B0aW9uYWwgdHlwZSBzcGVjaWZpZXIgZmFtaWx5CisJICovCisJdmlydHVhbCBjb25zdCBCRiAmIGdldFN5bWJvbCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlELAorCQkJYXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCB0eXBlRmFtaWx5KSBjb25zdDsKKworCXZpcnR1YWwgY29uc3QgQkYgJiBnZXRTeW1ib2xCeVF1YWxpZmllZE5hbWVJRCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCwKKwkJCWF2bV90eXBlX3NwZWNpZmllcl9raW5kX3QgdHlwZUZhbWlseSkgY29uc3Q7CisKKwl2aXJ0dWFsIGNvbnN0IEJGICYgZ2V0U3ltYm9sQnlOYW1lSUQoY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELAorCQkJYXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCB0eXBlRmFtaWx5KSBjb25zdDsKKworCXZpcnR1YWwgY29uc3QgQkYgJiBnZXRTeW1ib2xCeUFzdEVsZW1lbnQoY29uc3QgT2JqZWN0RWxlbWVudCAqIGFzdEVsZW1lbnQsCisJCQlhdm1fdHlwZV9zcGVjaWZpZXJfa2luZF90IHR5cGVGYW1pbHkpIGNvbnN0OworCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBvbkNyZWF0ZVJvdXRpbmUKKwkgKi8KKwlpbmxpbmUgQXZtUHJvZ3JhbSAmIGdldE9uQ3JlYXRlUm91dGluZSgpCisJeworCQlyZXR1cm4oIG9uQ3JlYXRlUm91dGluZSApOworCX0KKworCWlubGluZSBCRkNvZGUgJiBnZXRPbkNyZWF0ZSgpCisJeworCQlyZXR1cm4oIG9uQ3JlYXRlUm91dGluZS5nZXRDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQkZDb2RlICYgZ2V0T25DcmVhdGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBvbkNyZWF0ZVJvdXRpbmUuZ2V0Q29kZSgpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzT25DcmVhdGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBvbkNyZWF0ZVJvdXRpbmUuaGFzQ29kZSgpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0T25DcmVhdGUoY29uc3QgQkZDb2RlICYgYVByb2dyYW0pCisJeworCQlvbkNyZWF0ZVJvdXRpbmUuc2V0Q29kZSggYVByb2dyYW0gKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG9uSW5pdFJvdXRpbmUKKwkgKi8KKwlpbmxpbmUgQXZtUHJvZ3JhbSAmIGdldE9uSW5pdFJvdXRpbmUoKQorCXsKKwkJcmV0dXJuKCBvbkluaXRSb3V0aW5lICk7CisJfQorCisJaW5saW5lIEJGQ29kZSAmIGdldE9uSW5pdCgpCisJeworCQlyZXR1cm4oIG9uSW5pdFJvdXRpbmUuZ2V0Q29kZSgpICk7CisJfQorCisJaW5saW5lIGNvbnN0IEJGQ29kZSAmIGdldE9uSW5pdCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uSW5pdFJvdXRpbmUuZ2V0Q29kZSgpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzT25Jbml0KCkgY29uc3QKKwl7CisJCXJldHVybiggb25Jbml0Um91dGluZS5oYXNDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRPbkluaXQoY29uc3QgQkZDb2RlICYgYVByb2dyYW0pCisJeworCQlvbkluaXRSb3V0aW5lLnNldENvZGUoIGFQcm9ncmFtICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBvbkZpbmFsUm91dGluZQorCSAqLworCWlubGluZSBBdm1Qcm9ncmFtICYgZ2V0T25GaW5hbFJvdXRpbmUoKQorCXsKKwkJcmV0dXJuKCBvbkZpbmFsUm91dGluZSApOworCX0KKworCWlubGluZSBCRkNvZGUgJiBnZXRPbkZpbmFsKCkKKwl7CisJCXJldHVybiggb25GaW5hbFJvdXRpbmUuZ2V0Q29kZSgpICk7CisJfQorCisJaW5saW5lIGNvbnN0IEJGQ29kZSAmIGdldE9uRmluYWwoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBvbkZpbmFsUm91dGluZS5nZXRDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNPbkZpbmFsKCkgY29uc3QKKwl7CisJCXJldHVybiggb25GaW5hbFJvdXRpbmUuaGFzQ29kZSgpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0T25GaW5hbChjb25zdCBCRkNvZGUgJiBhUHJvZ3JhbSkKKwl7CisJCW9uRmluYWxSb3V0aW5lLnNldENvZGUoIGFQcm9ncmFtICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBvblJldHVyblJvdXRpbmUKKwkgKi8KKwlpbmxpbmUgQXZtUHJvZ3JhbSAmIGdldE9uUmV0dXJuUm91dGluZSgpCisJeworCQlyZXR1cm4oIG9uUmV0dXJuUm91dGluZSApOworCX0KKworCWlubGluZSBCRkNvZGUgJiBnZXRPblJldHVybigpCisJeworCQlyZXR1cm4oIG9uUmV0dXJuUm91dGluZS5nZXRDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQkZDb2RlICYgZ2V0T25SZXR1cm4oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBvblJldHVyblJvdXRpbmUuZ2V0Q29kZSgpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzT25SZXR1cm4oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBvblJldHVyblJvdXRpbmUuaGFzQ29kZSgpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0T25SZXR1cm4oY29uc3QgQkZDb2RlICYgYVByb2dyYW0pCisJeworCQlvblJldHVyblJvdXRpbmUuc2V0Q29kZSggYVByb2dyYW0gKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG9uU3RhcnRSb3V0aW5lCisJICovCisJaW5saW5lIEF2bVByb2dyYW0gJiBnZXRPblN0YXJ0Um91dGluZSgpCisJeworCQlyZXR1cm4oIG9uU3RhcnRSb3V0aW5lICk7CisJfQorCisJaW5saW5lIEJGQ29kZSAmIGdldE9uU3RhcnQoKQorCXsKKwkJcmV0dXJuKCBvblN0YXJ0Um91dGluZS5nZXRDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQkZDb2RlICYgZ2V0T25TdGFydCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uU3RhcnRSb3V0aW5lLmdldENvZGUoKSApOworCX0KKworCWlubGluZSBib29sIGhhc09uU3RhcnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBvblN0YXJ0Um91dGluZS5oYXNDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRPblN0YXJ0KGNvbnN0IEJGQ29kZSAmIGFQcm9ncmFtKQorCXsKKwkJb25TdGFydFJvdXRpbmUuc2V0Q29kZSggYVByb2dyYW0gKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG9uU3RvcFJvdXRpbmUKKwkgKi8KKwlpbmxpbmUgQXZtUHJvZ3JhbSAmIGdldE9uU3RvcFJvdXRpbmUoKQorCXsKKwkJcmV0dXJuKCBvblN0b3BSb3V0aW5lICk7CisJfQorCisJaW5saW5lIEJGQ29kZSAmIGdldE9uU3RvcCgpCisJeworCQlyZXR1cm4oIG9uU3RvcFJvdXRpbmUuZ2V0Q29kZSgpICk7CisJfQorCisJaW5saW5lIGNvbnN0IEJGQ29kZSAmIGdldE9uU3RvcCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uU3RvcFJvdXRpbmUuZ2V0Q29kZSgpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzT25TdG9wKCkgY29uc3QKKwl7CisJCXJldHVybiggb25TdG9wUm91dGluZS5oYXNDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRPblN0b3AoY29uc3QgQkZDb2RlICYgYVByb2dyYW0pCisJeworCQlvblN0b3BSb3V0aW5lLnNldENvZGUoIGFQcm9ncmFtICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBvbklFbmFibGVSb3V0aW5lCisJICovCisJaW5saW5lIEF2bVByb2dyYW0gJiBnZXRPbklFbmFibGVSb3V0aW5lKCkKKwl7CisJCXJldHVybiggb25JRW5hYmxlUm91dGluZSApOworCX0KKworCWlubGluZSBCRkNvZGUgJiBnZXRPbklFbmFibGUoKQorCXsKKwkJcmV0dXJuKCBvbklFbmFibGVSb3V0aW5lLmdldENvZGUoKSApOworCX0KKworCWlubGluZSBjb25zdCBCRkNvZGUgJiBnZXRPbklFbmFibGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBvbklFbmFibGVSb3V0aW5lLmdldENvZGUoKSApOworCX0KKworCWlubGluZSBib29sIGhhc09uSUVuYWJsZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uSUVuYWJsZVJvdXRpbmUuaGFzQ29kZSgpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0T25JRW5hYmxlKGNvbnN0IEJGQ29kZSAmIGFQcm9ncmFtKQorCXsKKwkJb25JRW5hYmxlUm91dGluZS5zZXRDb2RlKCBhUHJvZ3JhbSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogb25FbmFibGVSb3V0aW5lCisJICovCisJaW5saW5lIEF2bVByb2dyYW0gJiBnZXRPbkVuYWJsZVJvdXRpbmUoKQorCXsKKwkJcmV0dXJuKCBvbkVuYWJsZVJvdXRpbmUgKTsKKwl9CisKKwlpbmxpbmUgQkZDb2RlICYgZ2V0T25FbmFibGUoKQorCXsKKwkJcmV0dXJuKCBvbkVuYWJsZVJvdXRpbmUuZ2V0Q29kZSgpICk7CisJfQorCisJaW5saW5lIGNvbnN0IEJGQ29kZSAmIGdldE9uRW5hYmxlKCkgY29uc3QKKwl7CisJCXJldHVybiggb25FbmFibGVSb3V0aW5lLmdldENvZGUoKSApOworCX0KKworCWlubGluZSBib29sIGhhc09uRW5hYmxlKCkgY29uc3QKKwl7CisJCXJldHVybiggb25FbmFibGVSb3V0aW5lLmhhc0NvZGUoKSApOworCX0KKworCWlubGluZSB2b2lkIHNldE9uRW5hYmxlKGNvbnN0IEJGQ29kZSAmIGFQcm9ncmFtKQorCXsKKwkJb25FbmFibGVSb3V0aW5lLnNldENvZGUoIGFQcm9ncmFtICk7CisJfQorCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogb25JRGlzYWJsZVJvdXRpbmUKKwkgKi8KKwlpbmxpbmUgQXZtUHJvZ3JhbSAmIGdldE9uSURpc2FibGVSb3V0aW5lKCkKKwl7CisJCXJldHVybiggb25JRGlzYWJsZVJvdXRpbmUgKTsKKwl9CisKKwlpbmxpbmUgQkZDb2RlICYgZ2V0T25JRGlzYWJsZSgpCisJeworCQlyZXR1cm4oIG9uSURpc2FibGVSb3V0aW5lLmdldENvZGUoKSApOworCX0KKworCWlubGluZSBjb25zdCBCRkNvZGUgJiBnZXRPbklEaXNhYmxlKCkgY29uc3QKKwl7CisJCXJldHVybiggb25JRGlzYWJsZVJvdXRpbmUuZ2V0Q29kZSgpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzT25JRGlzYWJsZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uSURpc2FibGVSb3V0aW5lLmhhc0NvZGUoKSApOworCX0KKworCWlubGluZSB2b2lkIHNldE9uSURpc2FibGUoY29uc3QgQkZDb2RlICYgYVByb2dyYW0pCisJeworCQlvbklEaXNhYmxlUm91dGluZS5zZXRDb2RlKCBhUHJvZ3JhbSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogb25EaXNhYmxlUm91dGluZQorCSAqLworCWlubGluZSBBdm1Qcm9ncmFtICYgZ2V0T25EaXNhYmxlUm91dGluZSgpCisJeworCQlyZXR1cm4oIG9uRGlzYWJsZVJvdXRpbmUgKTsKKwl9CisKKwlpbmxpbmUgQkZDb2RlICYgZ2V0T25EaXNhYmxlKCkKKwl7CisJCXJldHVybiggb25EaXNhYmxlUm91dGluZS5nZXRDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQkZDb2RlICYgZ2V0T25EaXNhYmxlKCkgY29uc3QKKwl7CisJCXJldHVybiggb25EaXNhYmxlUm91dGluZS5nZXRDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNPbkRpc2FibGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBvbkRpc2FibGVSb3V0aW5lLmhhc0NvZGUoKSApOworCX0KKworCWlubGluZSB2b2lkIHNldE9uRGlzYWJsZShjb25zdCBCRkNvZGUgJiBhUHJvZ3JhbSkKKwl7CisJCW9uRGlzYWJsZVJvdXRpbmUuc2V0Q29kZSggYVByb2dyYW0gKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG9uSUFib3J0Um91dGluZQorCSAqLworCWlubGluZSBBdm1Qcm9ncmFtICYgZ2V0T25JQWJvcnRSb3V0aW5lKCkKKwl7CisJCXJldHVybiggb25JQWJvcnRSb3V0aW5lICk7CisJfQorCisJaW5saW5lIEJGQ29kZSAmIGdldE9uSUFib3J0KCkKKwl7CisJCXJldHVybiggb25JQWJvcnRSb3V0aW5lLmdldENvZGUoKSApOworCX0KKworCWlubGluZSBjb25zdCBCRkNvZGUgJiBnZXRPbklBYm9ydCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uSUFib3J0Um91dGluZS5nZXRDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNPbklBYm9ydCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uSUFib3J0Um91dGluZS5oYXNDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRPbklBYm9ydChjb25zdCBCRkNvZGUgJiBhUHJvZ3JhbSkKKwl7CisJCW9uSUFib3J0Um91dGluZS5zZXRDb2RlKCBhUHJvZ3JhbSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogb25BYm9ydFJvdXRpbmUKKwkgKi8KKwlpbmxpbmUgQXZtUHJvZ3JhbSAmIGdldE9uQWJvcnRSb3V0aW5lKCkKKwl7CisJCXJldHVybiggb25BYm9ydFJvdXRpbmUgKTsKKwl9CisKKwlpbmxpbmUgQkZDb2RlICYgZ2V0T25BYm9ydCgpCisJeworCQlyZXR1cm4oIG9uQWJvcnRSb3V0aW5lLmdldENvZGUoKSApOworCX0KKworCWlubGluZSBjb25zdCBCRkNvZGUgJiBnZXRPbkFib3J0KCkgY29uc3QKKwl7CisJCXJldHVybiggb25BYm9ydFJvdXRpbmUuZ2V0Q29kZSgpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzT25BYm9ydCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uQWJvcnRSb3V0aW5lLmhhc0NvZGUoKSApOworCX0KKworCWlubGluZSB2b2lkIHNldE9uQWJvcnQoY29uc3QgQkZDb2RlICYgYVByb2dyYW0pCisJeworCQlvbkFib3J0Um91dGluZS5zZXRDb2RlKCBhUHJvZ3JhbSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogb25JUnVuUm91dGluZQorCSAqLworCWlubGluZSBBdm1Qcm9ncmFtICYgZ2V0T25JUnVuUm91dGluZSgpCisJeworCQlyZXR1cm4oIG9uSVJ1blJvdXRpbmUgKTsKKwl9CisKKwlpbmxpbmUgQkZDb2RlICYgZ2V0T25JUnVuKCkKKwl7CisJCXJldHVybiggb25JUnVuUm91dGluZS5nZXRDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQkZDb2RlICYgZ2V0T25JUnVuKCkgY29uc3QKKwl7CisJCXJldHVybiggb25JUnVuUm91dGluZS5nZXRDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNPbklSdW4oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBvbklSdW5Sb3V0aW5lLmhhc0NvZGUoKSApOworCX0KKworCWlubGluZSB2b2lkIHNldE9uSVJ1bihjb25zdCBCRkNvZGUgJiBhUHJvZ3JhbSkKKwl7CisJCW9uSVJ1blJvdXRpbmUuc2V0Q29kZSggYVByb2dyYW0gKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG9uUnVuUm91dGluZQorCSAqLworCWlubGluZSBBdm1Qcm9ncmFtICYgZ2V0T25SdW5Sb3V0aW5lKCkKKwl7CisJCXJldHVybiggb25SdW5Sb3V0aW5lICk7CisJfQorCisJaW5saW5lIEJGQ29kZSAmIGdldE9uUnVuKCkKKwl7CisJCXJldHVybiggb25SdW5Sb3V0aW5lLmdldENvZGUoKSApOworCX0KKworCWlubGluZSBjb25zdCBCRkNvZGUgJiBnZXRPblJ1bigpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uUnVuUm91dGluZS5nZXRDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNPblJ1bigpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uUnVuUm91dGluZS5oYXNDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRPblJ1bihjb25zdCBCRkNvZGUgJiBhUHJvZ3JhbSkKKwl7CisJCW9uUnVuUm91dGluZS5zZXRDb2RlKCBhUHJvZ3JhbSApOworCX0KKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG9uUnRjUm91dGluZQorCSAqLworCWlubGluZSBBdm1Qcm9ncmFtICYgZ2V0T25SdGNSb3V0aW5lKCkKKwl7CisJCXJldHVybiggb25SdGNSb3V0aW5lICk7CisJfQorCisJaW5saW5lIEJGQ29kZSAmIGdldE9uUnRjKCkKKwl7CisJCXJldHVybiggb25SdGNSb3V0aW5lLmdldENvZGUoKSApOworCX0KKworCWlubGluZSBjb25zdCBCRkNvZGUgJiBnZXRPblJ0YygpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uUnRjUm91dGluZS5nZXRDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNPblJ0YygpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uUnRjUm91dGluZS5oYXNDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRPblJ0Yyhjb25zdCBCRkNvZGUgJiBhUHJvZ3JhbSkKKwl7CisJCW9uUnRjUm91dGluZS5zZXRDb2RlKCBhUHJvZ3JhbSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVNjaGVkdWxlCisJICovCisJaW5saW5lIEF2bVByb2dyYW0gJiBnZXRPblNjaGVkdWxlUm91dGluZSgpCisJeworCQlyZXR1cm4oIG9uU2NoZWR1bGVSb3V0aW5lICk7CisJfQorCisJaW5saW5lIEJGQ29kZSAmIGdldE9uU2NoZWR1bGUoKQorCXsKKwkJcmV0dXJuKCBvblNjaGVkdWxlUm91dGluZS5nZXRDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQkZDb2RlICYgZ2V0T25TY2hlZHVsZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uU2NoZWR1bGVSb3V0aW5lLmdldENvZGUoKSApOworCX0KKworCWlubGluZSBib29sIGhhc09uU2NoZWR1bGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBvblNjaGVkdWxlUm91dGluZS5oYXNDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRPblNjaGVkdWxlKGNvbnN0IEJGQ29kZSAmIGFQcm9ncmFtKQorCXsKKwkJb25TY2hlZHVsZVJvdXRpbmUuc2V0Q29kZSggYVByb2dyYW0gKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNVc2VyUnVubmluZ0NvZGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBoYXNPblJ1bigpIHx8IGhhc09uUnRjKCkgfHwgaGFzT25TY2hlZHVsZSgpICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBtSW5pdFJvdXRpbmUKKwkgKiBtRW5hYmxlUm91dGluZQorCSAqIG1SdW5Sb3V0aW5lCisJICovCisJaW5saW5lIGJvb2wgaGFzSW5pdE9yUnVuKCkgY29uc3QKKwl7CisJCXJldHVybiggaGFzT25Jbml0KCkgfHwgaGFzT25SdW4oKSApOworCX0KKworCWlubGluZSBib29sIGhhc09uSW5pdE9yRW5hYmxlT3JSdW4oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBoYXNPbkluaXQoKSB8fCBoYXNPbkVuYWJsZSgpIHx8IGhhc09uUnVuKCkgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIG9uIGFjdGl2aXR5IGJ5IG9wY29kZQorCSAqLworCUF2bVByb2dyYW0gJiBnZXRPbkFjdGl2aXR5Um91dGluZShBVk1fT1BDT0RFIG9wQ29kZSk7CisKKwljb25zdCBCRkNvZGUgJiBnZXRPbkFjdGl2aXR5KEFWTV9PUENPREUgb3BDb2RlKSBjb25zdDsKKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUNvbXBvbmVudEZsYWcKKwkgKiBTdHJ1Y3R1cmFsIGRlY29tcG9zaXRvbgorCSAqLworCWJvb2wgaXNNYWluQ29tcG9uZW50KCkgY29uc3QKKwl7CisJCXJldHVybiggbU1haW5Db21wb25lbnRGbGFnICk7CisJfQorCisJdm9pZCBzZXRNYWluQ29tcG9uZW50KGJvb2wgaXNNYWluQ29tcG9uZW50ID0gdHJ1ZSkKKwl7CisJCW1NYWluQ29tcG9uZW50RmxhZyA9IGlzTWFpbkNvbXBvbmVudDsKKwl9CisKKwlib29sIGlzQ29tcG9zaXRlQ29tcG9uZW50KCkgY29uc3QKKwl7CisJCXJldHVybiggaGFzT25Db25jdXJyZW5jeSgpICk7CisJfQorCisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1NdXRhYmxlU2NoZWR1bGVGbGFnCisJICogTU9DIEF0dHJpYnV0ZSBmb3IgbXV0YWJsZSBTY2hlZHVsZQorCSAqLworCWJvb2wgaXNNdXRhYmxlU2NoZWR1bGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtTXV0YWJsZVNjaGVkdWxlRmxhZyApOworCX0KKworCXZvaWQgc2V0TXV0YWJsZVNjaGVkdWxlKGJvb2wgaXNNdXRhYmxlU2NoZWR1bGUgPSB0cnVlKQorCXsKKwkJbU11dGFibGVTY2hlZHVsZUZsYWcgPSBpc011dGFibGVTY2hlZHVsZTsKKwl9CisKKwlib29sIGlzSW5saW5hYmxlU2NoZWR1bGUoKSBjb25zdDsKKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUNvbmN1cnJlbmN5CisJICovCisJaW5saW5lIEF2bVByb2dyYW0gJiBnZXRPbkNvbmN1cnJlbmN5Um91dGluZSgpCisJeworCQlyZXR1cm4oIG9uQ29uY3VycmVuY3lSb3V0aW5lICk7CisJfQorCisJaW5saW5lIEJGQ29kZSAmIGdldE9uQ29uY3VycmVuY3koKQorCXsKKwkJcmV0dXJuKCBvbkNvbmN1cnJlbmN5Um91dGluZS5nZXRDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQkZDb2RlICYgZ2V0T25Db25jdXJyZW5jeSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uQ29uY3VycmVuY3lSb3V0aW5lLmdldENvZGUoKSApOworCX0KKworCWlubGluZSBib29sIGhhc09uQ29uY3VycmVuY3koKSBjb25zdAorCXsKKwkJcmV0dXJuKCBvbkNvbmN1cnJlbmN5Um91dGluZS5oYXNDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRPbkNvbmN1cnJlbmN5KGNvbnN0IEJGQ29kZSAmIGFQcm9ncmFtKQorCXsKKwkJb25Db25jdXJyZW5jeVJvdXRpbmUuc2V0Q29kZSggYVByb2dyYW0gKTsKKwl9CisKKwlpbmxpbmUgT3BlcmF0b3IgKiBnZXRPbkNvbmN1cnJlbmN5T3BlcmF0b3IoKSBjb25zdAorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1NNQVJUX1BPSU5URVJfRVhJVCgKKwkJCQlvbkNvbmN1cnJlbmN5Um91dGluZS5nZXRDb2RlKCkgKQorCQkJCTw8ICIgQ29uY3VycmVuY3kgT3BlcmF0b3IgZm9yICIKKwkJCQk8PCBzdHJfaGVhZGVyKCB0aGlzICkgPDwgIiAhISEiCisJCQkJPDwgU0VORF9FWElUOworCisJCXJldHVybiggb25Db25jdXJyZW5jeVJvdXRpbmUuZ2V0Q29kZSgpLT5nZXRPcGVyYXRvcigpICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtU3luY2hyb25pemUKKwkgKi8KKwlpbmxpbmUgQXZtUHJvZ3JhbSAmIGdldE9uU3luY2hyb25pemVSb3V0aW5lKCkKKwl7CisJCXJldHVybiggb25TeW5jaHJvbml6ZVJvdXRpbmUgKTsKKwl9CisKKwlpbmxpbmUgQkZDb2RlICYgZ2V0T25TeW5jaHJvbml6ZSgpCisJeworCQlyZXR1cm4oIG9uU3luY2hyb25pemVSb3V0aW5lLmdldENvZGUoKSApOworCX0KKworCWlubGluZSBjb25zdCBCRkNvZGUgJiBnZXRPblN5bmNocm9uaXplKCkgY29uc3QKKwl7CisJCXJldHVybiggb25TeW5jaHJvbml6ZVJvdXRpbmUuZ2V0Q29kZSgpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzT25TeW5jaHJvbml6ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uU3luY2hyb25pemVSb3V0aW5lLmhhc0NvZGUoKSApOworCX0KKworCWlubGluZSB2b2lkIHNldE9uU3luY2hyb25pemUoY29uc3QgQkZDb2RlICYgYVByb2dyYW0pCisJeworCQlvblN5bmNocm9uaXplUm91dGluZS5zZXRDb2RlKCBhUHJvZ3JhbSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSCisJICogdGhlIFNjaGVkdWxhYmlsaXR5IHByb3BlcnR5CisJICovCisJaW5saW5lIGJvb2wgaXNTY2hlZHVsYWJsZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGhhc09uSW5pdCgpICYmIGhhc09uUnVuKCkgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1UYWJsZU9mUm91dGVyNEluc3RhbmNlCisJICovCisJaW5saW5lIFRhYmxlT2ZSb3V0ZXIgJiBnZXRSb3V0ZXJzNEluc3RhbmNlKCkKKwl7CisJCXJldHVybiggbVRhYmxlT2ZSb3V0ZXI0SW5zdGFuY2UgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgVGFibGVPZlJvdXRlciAmIGdldFJvdXRlcnM0SW5zdGFuY2UoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVGFibGVPZlJvdXRlcjRJbnN0YW5jZSApOworCX0KKworCWlubGluZSBib29sIGhhc1JvdXRlcjRJbnN0YW5jZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZU9mUm91dGVyNEluc3RhbmNlLm5vbmVtcHR5KCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRSb3V0ZXJzNEluc3RhbmNlKGNvbnN0IFRhYmxlT2ZSb3V0ZXIgJiBhUm91dGVyVGFibGUpCisJeworCQltVGFibGVPZlJvdXRlcjRJbnN0YW5jZSA9IGFSb3V0ZXJUYWJsZTsKKwl9CisKKworCWlubGluZSB2b2lkIGFwcGVuZFJvdXRlcjRJbnN0YW5jZShjb25zdCBSb3V0ZXIgJiBhUm91dGVyKQorCXsKKwkJbVRhYmxlT2ZSb3V0ZXI0SW5zdGFuY2UuYXBwZW5kKCBhUm91dGVyICk7CisJfQorCisKKwlpbmxpbmUgUm91dGVyICYgZ2V0Um91dGVyNEluc3RhbmNlKGF2bV9zaXplX3Qgb2Zmc2V0KQorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9BUlJBWV9JTkRFWF9FWElUKAorCQkJCW9mZnNldCAsIG1UYWJsZU9mUm91dGVyNEluc3RhbmNlLnNpemUoKSApCisJCQkJPDwgU0VORF9FWElUOworCisKKwkJcmV0dXJuKCBtVGFibGVPZlJvdXRlcjRJbnN0YW5jZS5nZXQob2Zmc2V0KSApOworCX0KKworCWlubGluZSBjb25zdCBSb3V0ZXIgJiBnZXRSb3V0ZXI0SW5zdGFuY2UoYXZtX3NpemVfdCBvZmZzZXQpIGNvbnN0CisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX0FSUkFZX0lOREVYX0VYSVQoCisJCQkJb2Zmc2V0ICwgbVRhYmxlT2ZSb3V0ZXI0SW5zdGFuY2Uuc2l6ZSgpICkKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKworCQlyZXR1cm4oIG1UYWJsZU9mUm91dGVyNEluc3RhbmNlLmdldChvZmZzZXQpICk7CisJfQorCisKKwlpbmxpbmUgUm91dGVyICYgZ2V0Um91dGVyNFRoaXMoKQorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9FTVBUWV9DT0xMRUNUSU9OX0VYSVQoIG1UYWJsZU9mUm91dGVyNEluc3RhbmNlICkKKwkJCQk8PCAiVGFibGUgb2YgUm91dGVyIGZvciBJbnN0YW5jZSAhISEiCisJCQkJPDwgU0VORF9FWElUOworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoIGhhc0luc3RhbmNlU3RhdGljVGhpcygpICkKKwkJCQk8PCAiVW5leHBlY3RlZCBhbiBleGVjdXRhYmxlIHdpdGhvdXQgbWFjaGluZTwgdGhpcyA+ICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJcmV0dXJuKCBtVGFibGVPZlJvdXRlcjRJbnN0YW5jZS5nZXQoCisJCQkJZ2V0SW5zdGFuY2VTdGF0aWNUaGlzKCkuZ2V0T2Zmc2V0KCkgKSApOworCX0KKworCWlubGluZSBjb25zdCBSb3V0ZXIgJiBnZXRSb3V0ZXI0VGhpcygpIGNvbnN0CisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX0VNUFRZX0NPTExFQ1RJT05fRVhJVCggbVRhYmxlT2ZSb3V0ZXI0SW5zdGFuY2UgKQorCQkJCTw8ICJUYWJsZSBvZiBSb3V0ZXIgZm9yIEluc3RhbmNlICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisJCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggaGFzSW5zdGFuY2VTdGF0aWNUaGlzKCkgKQorCQkJCTw8ICJVbmV4cGVjdGVkIGFuIGV4ZWN1dGFibGUgd2l0aG91dCBtYWNoaW5lPCB0aGlzID4gISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQlyZXR1cm4oIG1UYWJsZU9mUm91dGVyNEluc3RhbmNlLmdldCgKKwkJCQlnZXRJbnN0YW5jZVN0YXRpY1RoaXMoKS5nZXRPZmZzZXQoKSApICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBoYXNSb3V0ZXI0VGhpcygpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZU9mUm91dGVyNEluc3RhbmNlLm5vbmVtcHR5KCkKKwkJCQkmJiBoYXNJbnN0YW5jZVN0YXRpY1RoaXMoKQorCQkJCSYmIG1UYWJsZU9mUm91dGVyNEluc3RhbmNlLmdldCgKKwkJCQkJCWdldEluc3RhbmNlU3RhdGljVGhpcygpLmdldE9mZnNldCgpICkudmFsaWQoKSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVJvdXRlclRhYmxlNFByb3RvdHlwZQorCSAqLworCWlubGluZSBjb25zdCBSb3V0ZXIgJiBnZXRSb3V0ZXI0UHJvdG90eXBlKEV4ZWN1dGFibGVGb3JtICogYU1vZGVsKSBjb25zdAorCXsKKwkJaWYoIG1UYWJsZU9mUm91dGVyNEluc3RhbmNlLm5vbmVtcHR5KCkgKQorCQl7CisJCQlUYWJsZU9mUm91dGVyOjpjb25zdF9pdGVyYXRvciBpdCA9IG1UYWJsZU9mUm91dGVyNEluc3RhbmNlLmJlZ2luKCk7CisJCQlUYWJsZU9mUm91dGVyOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IG1UYWJsZU9mUm91dGVyNEluc3RhbmNlLmVuZCgpOworCisJCQlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJCXsKKwkJCQlpZiggKCppdCkudmFsaWQoKQorCQkJCQkmJiAoKCppdCkuZ2V0TWFjaGluZSgpLT5nZXRFeGVjdXRhYmxlKCkgPT0gYU1vZGVsKQorCQkJCQkmJiAoKml0KS5nZXRNYWNoaW5lKCktPgorCQkJCQkJCWdldFNwZWNpZmllcigpLmlzRGVzaWduUHJvdG90eXBlU3RhdGljKCkgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCAqaXQgKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4oIFJvdXRlcjo6X05VTExfICk7CisJfQorCisJaW5saW5lIGNvbnN0IFJvdXRlciAmIGdldFJvdXRlcjRQcm90b3R5cGUoSW5zdGFuY2VPZk1hY2hpbmUgKiBhTWFjaGluZSkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0Um91dGVyNFByb3RvdHlwZShhTWFjaGluZS0+Z2V0RXhlY3V0YWJsZSgpKSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVRhYmxlT2ZSb3V0ZXI0TW9kZWwKKwkgKi8KKwlpbmxpbmUgVGFibGVPZlJvdXRlciAmIGdldFJvdXRlcnM0TW9kZWwoKQorCXsKKwkJcmV0dXJuKCBtVGFibGVPZlJvdXRlcjRNb2RlbCApOworCX0KKworCWlubGluZSBjb25zdCBUYWJsZU9mUm91dGVyICYgZ2V0Um91dGVyczRNb2RlbCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZU9mUm91dGVyNE1vZGVsICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzUm91dGVyNE1vZGVsKCkgY29uc3QKKwl7CisJCXJldHVybiggbVRhYmxlT2ZSb3V0ZXI0TW9kZWwubm9uZW1wdHkoKSApOworCX0KKworCWlubGluZSB2b2lkIHNldFJvdXRlcnM0TW9kZWwoY29uc3QgVGFibGVPZlJvdXRlciAmIGFSb3V0ZXJUYWJsZSkKKwl7CisJCW1UYWJsZU9mUm91dGVyNE1vZGVsID0gYVJvdXRlclRhYmxlOworCX0KKworCisJaW5saW5lIHZvaWQgYXBwZW5kUm91dGVyNE1vZGVsKGNvbnN0IFJvdXRlciAmIGFSb3V0ZXIpCisJeworCQltVGFibGVPZlJvdXRlcjRNb2RlbC5hcHBlbmQoIGFSb3V0ZXIgKTsKKwl9CisKKworCWlubGluZSBSb3V0ZXIgJiBnZXRSb3V0ZXI0TW9kZWwoYXZtX3NpemVfdCBvZmZzZXQpCisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX0FSUkFZX0lOREVYX0VYSVQoCisJCQkJb2Zmc2V0ICwgbVRhYmxlT2ZSb3V0ZXI0TW9kZWwuc2l6ZSgpICkKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJcmV0dXJuKCBtVGFibGVPZlJvdXRlcjRNb2RlbC5nZXQob2Zmc2V0KSApOworCX0KKworCWlubGluZSBjb25zdCBSb3V0ZXIgJiBnZXRSb3V0ZXI0TW9kZWwoYXZtX3NpemVfdCBvZmZzZXQpIGNvbnN0CisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX0FSUkFZX0lOREVYX0VYSVQoCisJCQkJb2Zmc2V0ICwgbVRhYmxlT2ZSb3V0ZXI0TW9kZWwuc2l6ZSgpICkKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJcmV0dXJuKCBtVGFibGVPZlJvdXRlcjRNb2RlbC5nZXQob2Zmc2V0KSApOworCX0KKworCisJaW5saW5lIGNvbnN0IFJvdXRlciAmIGdldFJvdXRlcjRNb2RlbChjb25zdCBFeGVjdXRhYmxlRm9ybSAqIGFNb2RlbCkgY29uc3QKKwl7CisJCWlmKCBtVGFibGVPZlJvdXRlcjRNb2RlbC5ub25lbXB0eSgpICkKKwkJeworCQkJVGFibGVPZlJvdXRlcjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtVGFibGVPZlJvdXRlcjRNb2RlbC5iZWdpbigpOworCQkJVGFibGVPZlJvdXRlcjo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBtVGFibGVPZlJvdXRlcjRNb2RlbC5lbmQoKTsKKworCQkJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJCQl7CisJCQkJaWYoICgqaXQpLnZhbGlkKCkKKwkJCQkJJiYgKCgqaXQpLmdldE1hY2hpbmUoKS0+Z2V0RXhlY3V0YWJsZSgpID09IGFNb2RlbCkgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCAqaXQgKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4oIFJvdXRlcjo6X05VTExfICk7CisJfQorCisJaW5saW5lIGNvbnN0IFJvdXRlciAmIGdldFJvdXRlcjRNb2RlbCgKKwkJCWNvbnN0IEluc3RhbmNlT2ZNYWNoaW5lICogYU1hY2hpbmUpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldFJvdXRlcjRNb2RlbChhTWFjaGluZS0+Z2V0RXhlY3V0YWJsZSgpKSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVJkdkNvbW11bmljYXRpb25GbGFnCisJICovCisJaW5saW5lIGJvb2wgaGFzUmR2Q29tbXVuaWNhdGlvbigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1SZHZDb21tdW5pY2F0aW9uRmxhZyApOworCX0KKworCXZvaWQgc2V0UmR2Q29tbXVuaWNhdGlvbihib29sIGFGbGFnID0gdHJ1ZSkKKwl7CisJCW1SZHZDb21tdW5pY2F0aW9uRmxhZyA9IGFGbGFnOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUlucHV0RW5hYmxlZENvbW11bmljYXRpb25GbGFnCisJICogTU9DIEF0dHJpYnV0ZSBmb3IgQ29tbXVuaWNhdGlvbgorCSAqLworCWJvb2wgaXNJbnB1dEVuYWJsZWRDb21tdW5pY2F0aW9uKCkgY29uc3QKKwl7CisJCXJldHVybiggbUlucHV0RW5hYmxlZENvbW11bmljYXRpb25GbGFnICk7CisJfQorCisJdm9pZCBzZXRJbnB1dEVuYWJsZWRDb21tdW5pY2F0aW9uKGJvb2wgaXNJbnB1dEVuYWJsZWQgPSB0cnVlKQorCXsKKwkJbUlucHV0RW5hYmxlZENvbW11bmljYXRpb25GbGFnID0gaXNJbnB1dEVuYWJsZWQ7CisJfQorCisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gU1RBVElDIEFOQUxZU0lTIEFUVFJJQlVURQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtUmVxdWlyZWREYXRhCisJICovCisJaW5saW5lIFRhYmxlT2ZJbnN0YW5jZU9mRGF0YSAmIGdldFJlcXVpcmVkRGF0YSgpCisJeworCQlyZXR1cm4oIG1SZXF1aXJlZERhdGEgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgVGFibGVPZkluc3RhbmNlT2ZEYXRhICYgZ2V0UmVxdWlyZWREYXRhKCkgY29uc3QKKwl7CisJCXJldHVybiggbVJlcXVpcmVkRGF0YSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVVzZWxlc3NEYXRhCisJICovCisJaW5saW5lIFRhYmxlT2ZJbnN0YW5jZU9mRGF0YSAmIGdldFVzZWxlc3NEYXRhKCkKKwl7CisJCXJldHVybiggbVVzZWxlc3NEYXRhICk7CisJfQorCisJaW5saW5lIGNvbnN0IFRhYmxlT2ZJbnN0YW5jZU9mRGF0YSAmIGdldFVzZWxlc3NEYXRhKCkgY29uc3QKKwl7CisJCXJldHVybiggbVVzZWxlc3NEYXRhICk7CisJfQorCisKKwkvKioKKwkgKiBDb250cm9sIGZsb3cgYW5hbHlzaXMKKwkgKiBzb3VyY2UgJiB0YXJnZXRzIEV4ZWN1dGFibGU8IFtzdGF0ZV1tYWNoaW5lID4gZm9yIFRyYW5zaXRpb24KKwkgKi8KKwlpbmxpbmUgdm9pZCBnZXRPdXRnb2luZ01hY2hpbmUoTGlzdE9mSW5zdGFuY2VPZk1hY2hpbmUgJiBsaXN0T2ZNYWNoaW5lKQorCXsKKwkJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDAgOyBvZmZzZXQgPCBnZXRUcmFuc2l0aW9uKCkuc2l6ZSgpIDsgKytvZmZzZXQgKQorCQl7CisJCQlnZXRUcmFuc2l0aW9uKCkucmF3QXQob2Zmc2V0KS0+Z2V0VHJhbnNpdGlvblRhcmdldCggbGlzdE9mTWFjaGluZSApOworCQl9CisJfQorCisJaW5saW5lIHZvaWQgZ2V0T3V0Z29pbmdUcmFuc2l0aW9uKExpc3RPZkF2bVRyYW5zaXRpb24gJiBsaXN0T2ZUcmFuc2l0aW9uKQorCXsKKwkJQXZtVHJhbnNpdGlvbiAqIGFUcmFuc2l0aW9uOworCisJCWZvciggYXZtX3NpemVfdCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgZ2V0VHJhbnNpdGlvbigpLnNpemUoKSA7ICsrb2Zmc2V0ICkKKwkJeworCQkJYVRyYW5zaXRpb24gPSBnZXRUcmFuc2l0aW9uKCkucmF3QXQob2Zmc2V0KTsKKworCQkJbGlzdE9mVHJhbnNpdGlvbi5hcHBlbmQoIGFUcmFuc2l0aW9uICk7CisJCX0KKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1MaXN0T2ZCYWNrd2FyZFJlYWNoYWJsZU1hY2hpbmUKKwkgKi8KKwlpbmxpbmUgdm9pZCBhZGRCYWNrd2FyZFJlYWNoYWJsZU1hY2hpbmUoSW5zdGFuY2VPZk1hY2hpbmUgKiBhTWFjaGluZSkKKwl7CisJCW1CYWNrd2FyZFJlYWNoYWJsZU1hY2hpbmUuYWRkX3VuaW9uKCBhTWFjaGluZSApOworCX0KKworCWlubGluZSB2b2lkIGFkZEJhY2t3YXJkUmVhY2hhYmxlTWFjaGluZSgKKwkJCUxpc3RPZkluc3RhbmNlT2ZNYWNoaW5lICYgcmVhY2hhYmxlTWFjaGluZXMpCisJeworCQltQmFja3dhcmRSZWFjaGFibGVNYWNoaW5lLmFkZF91bmlvbiggcmVhY2hhYmxlTWFjaGluZXMgKTsKKwl9CisKKworCWlubGluZSBMaXN0T2ZJbnN0YW5jZU9mTWFjaGluZSAmIGdldEJhY2t3YXJkUmVhY2hhYmxlTWFjaGluZSgpCisJeworCQlyZXR1cm4oIG1CYWNrd2FyZFJlYWNoYWJsZU1hY2hpbmUgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgTGlzdE9mSW5zdGFuY2VPZk1hY2hpbmUgJiBnZXRCYWNrd2FyZFJlYWNoYWJsZU1hY2hpbmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQmFja3dhcmRSZWFjaGFibGVNYWNoaW5lICk7CisJfQorCisKKwlib29sIGNvbnRhaW5zQmFja3dhcmRSZWFjaGFibGVNYWNoaW5lKEluc3RhbmNlT2ZNYWNoaW5lICogYU1hY2hpbmUpIGNvbnN0CisJeworCQlyZXR1cm4oIG1CYWNrd2FyZFJlYWNoYWJsZU1hY2hpbmUuY29udGFpbnMoYU1hY2hpbmUpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzQmFja3dhcmRSZWFjaGFibGVNYWNoaW5lKCkgY29uc3QKKwl7CisJCXJldHVybiggbUJhY2t3YXJkUmVhY2hhYmxlTWFjaGluZS5ub25lbXB0eSgpICk7CisJfQorCisKKwlpbmxpbmUgdm9pZCByZW1vdmVCYWNrd2FyZFJlYWNoYWJsZU1hY2hpbmUoSW5zdGFuY2VPZk1hY2hpbmUgKiBhTWFjaGluZSkKKwl7CisJCWlmKCBtQmFja3dhcmRSZWFjaGFibGVNYWNoaW5lLm5vbmVtcHR5KCkgKQorCQl7CisJCQltQmFja3dhcmRSZWFjaGFibGVNYWNoaW5lLnJlbW92ZSggYU1hY2hpbmUgKTsKKwkJfQorCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUxpc3RPZkJhY2t3YXJkUmVhY2hhYmxlTWFjaGluZQorCSAqLworCWlubGluZSB2b2lkIGFkZEJhY2t3YXJkUmVhY2hhYmxlVHJhbnNpdGlvbihBdm1UcmFuc2l0aW9uICogYVRyYW5zaXRpb24pCisJeworCQltQmFja3dhcmRSZWFjaGFibGVUcmFuc2l0aW9uLmFkZF91bmlvbiggYVRyYW5zaXRpb24gKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBhZGRCYWNrd2FyZFJlYWNoYWJsZVRyYW5zaXRpb24oCisJCQlMaXN0T2ZBdm1UcmFuc2l0aW9uICYgcmVhY2hhYmxlVHJhbnNpdGlvbnMpCisJeworCQltQmFja3dhcmRSZWFjaGFibGVUcmFuc2l0aW9uLmFkZF91bmlvbiggcmVhY2hhYmxlVHJhbnNpdGlvbnMgKTsKKwl9CisKKworCWlubGluZSBMaXN0T2ZBdm1UcmFuc2l0aW9uICYgZ2V0QmFja3dhcmRSZWFjaGFibGVUcmFuc2l0aW9uKCkKKwl7CisJCXJldHVybiggbUJhY2t3YXJkUmVhY2hhYmxlVHJhbnNpdGlvbiApOworCX0KKworCWlubGluZSBjb25zdCBMaXN0T2ZBdm1UcmFuc2l0aW9uICYgZ2V0QmFja3dhcmRSZWFjaGFibGVUcmFuc2l0aW9uKCkgY29uc3QKKwl7CisJCXJldHVybiggbUJhY2t3YXJkUmVhY2hhYmxlVHJhbnNpdGlvbiApOworCX0KKworCisJYm9vbCBjb250YWluc0JhY2t3YXJkUmVhY2hhYmxlVHJhbnNpdGlvbihBdm1UcmFuc2l0aW9uICogYVRyYW5zaXRpb24pIGNvbnN0CisJeworCQlyZXR1cm4oIG1CYWNrd2FyZFJlYWNoYWJsZVRyYW5zaXRpb24uY29udGFpbnMoYVRyYW5zaXRpb24pICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzQmFja3dhcmRSZWFjaGFibGVUcmFuc2l0aW9uKCkgY29uc3QKKwl7CisJCXJldHVybiggbUJhY2t3YXJkUmVhY2hhYmxlVHJhbnNpdGlvbi5ub25lbXB0eSgpICk7CisJfQorCisKKwlpbmxpbmUgdm9pZCByZW1vdmVCYWNrd2FyZFJlYWNoYWJsZVRyYW5zaXRpb24oQXZtVHJhbnNpdGlvbiAqIGFUcmFuc2l0aW9uKQorCXsKKwkJaWYoIG1CYWNrd2FyZFJlYWNoYWJsZVRyYW5zaXRpb24ubm9uZW1wdHkoKSApCisJCXsKKwkJCW1CYWNrd2FyZFJlYWNoYWJsZVRyYW5zaXRpb24ucmVtb3ZlKCBhVHJhbnNpdGlvbiApOworCQl9CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtTGlzdE9mRm9yd2FyZFJlYWNoYWJsZU1hY2hpbmUKKwkgKi8KKwlpbmxpbmUgdm9pZCBhZGRGb3J3YXJkUmVhY2hhYmxlTWFjaGluZShJbnN0YW5jZU9mTWFjaGluZSAqIGFNYWNoaW5lKQorCXsKKwkJbUZvcndhcmRSZWFjaGFibGVNYWNoaW5lLmFkZF91bmlvbiggYU1hY2hpbmUgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBhZGRGb3J3YXJkUmVhY2hhYmxlTWFjaGluZSgKKwkJCUxpc3RPZkluc3RhbmNlT2ZNYWNoaW5lICYgcmVhY2hhYmxlTWFjaGluZXMpCisJeworCQltRm9yd2FyZFJlYWNoYWJsZU1hY2hpbmUuYWRkX3VuaW9uKCByZWFjaGFibGVNYWNoaW5lcyApOworCX0KKworCisJaW5saW5lIExpc3RPZkluc3RhbmNlT2ZNYWNoaW5lICYgZ2V0Rm9yd2FyZFJlYWNoYWJsZU1hY2hpbmUoKQorCXsKKwkJcmV0dXJuKCBtRm9yd2FyZFJlYWNoYWJsZU1hY2hpbmUgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgTGlzdE9mSW5zdGFuY2VPZk1hY2hpbmUgJiBnZXRGb3J3YXJkUmVhY2hhYmxlTWFjaGluZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Gb3J3YXJkUmVhY2hhYmxlTWFjaGluZSApOworCX0KKworCisJYm9vbCBjb250YWluc0ZvcndhcmRSZWFjaGFibGVNYWNoaW5lKEluc3RhbmNlT2ZNYWNoaW5lICogYU1hY2hpbmUpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Gb3J3YXJkUmVhY2hhYmxlTWFjaGluZS5jb250YWlucyhhTWFjaGluZSkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNGb3J3YXJkUmVhY2hhYmxlTWFjaGluZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Gb3J3YXJkUmVhY2hhYmxlTWFjaGluZS5ub25lbXB0eSgpICk7CisJfQorCisKKwlpbmxpbmUgdm9pZCByZW1vdmVGb3J3YXJkUmVhY2hhYmxlTWFjaGluZShJbnN0YW5jZU9mTWFjaGluZSAqIGFNYWNoaW5lKQorCXsKKwkJaWYoIG1Gb3J3YXJkUmVhY2hhYmxlTWFjaGluZS5ub25lbXB0eSgpICkKKwkJeworCQkJbUZvcndhcmRSZWFjaGFibGVNYWNoaW5lLnJlbW92ZSggYU1hY2hpbmUgKTsKKwkJfQorCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUxpc3RPZkZvcndhcmRSZWFjaGFibGVNYWNoaW5lCisJICovCisJaW5saW5lIHZvaWQgYWRkRm9yd2FyZFJlYWNoYWJsZVRyYW5zaXRpb24oQXZtVHJhbnNpdGlvbiAqIGFUcmFuc2l0aW9uKQorCXsKKwkJbUZvcndhcmRSZWFjaGFibGVUcmFuc2l0aW9uLmFkZF91bmlvbiggYVRyYW5zaXRpb24gKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBhZGRGb3J3YXJkUmVhY2hhYmxlVHJhbnNpdGlvbigKKwkJCUxpc3RPZkF2bVRyYW5zaXRpb24gJiByZWFjaGFibGVUcmFuc2l0aW9ucykKKwl7CisJCW1Gb3J3YXJkUmVhY2hhYmxlVHJhbnNpdGlvbi5hZGRfdW5pb24oIHJlYWNoYWJsZVRyYW5zaXRpb25zICk7CisJfQorCisKKwlpbmxpbmUgTGlzdE9mQXZtVHJhbnNpdGlvbiAmIGdldEZvcndhcmRSZWFjaGFibGVUcmFuc2l0aW9uKCkKKwl7CisJCXJldHVybiggbUZvcndhcmRSZWFjaGFibGVUcmFuc2l0aW9uICk7CisJfQorCisJaW5saW5lIGNvbnN0IExpc3RPZkF2bVRyYW5zaXRpb24gJiBnZXRGb3J3YXJkUmVhY2hhYmxlVHJhbnNpdGlvbigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Gb3J3YXJkUmVhY2hhYmxlVHJhbnNpdGlvbiApOworCX0KKworCisJYm9vbCBjb250YWluc0ZvcndhcmRSZWFjaGFibGVUcmFuc2l0aW9uKEF2bVRyYW5zaXRpb24gKiBhVHJhbnNpdGlvbikgY29uc3QKKwl7CisJCXJldHVybiggbUZvcndhcmRSZWFjaGFibGVUcmFuc2l0aW9uLmNvbnRhaW5zKGFUcmFuc2l0aW9uKSApOworCX0KKworCWlubGluZSBib29sIGhhc0ZvcndhcmRSZWFjaGFibGVUcmFuc2l0aW9uKCkgY29uc3QKKwl7CisJCXJldHVybiggbUZvcndhcmRSZWFjaGFibGVUcmFuc2l0aW9uLm5vbmVtcHR5KCkgKTsKKwl9CisKKworCWlubGluZSB2b2lkIHJlbW92ZUZvcndhcmRSZWFjaGFibGVUcmFuc2l0aW9uKEF2bVRyYW5zaXRpb24gKiBhVHJhbnNpdGlvbikKKwl7CisJCWlmKCBtRm9yd2FyZFJlYWNoYWJsZVRyYW5zaXRpb24ubm9uZW1wdHkoKSApCisJCXsKKwkJCW1Gb3J3YXJkUmVhY2hhYmxlVHJhbnNpdGlvbi5yZW1vdmUoIGFUcmFuc2l0aW9uICk7CisJCX0KKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIGlzUmVhY2hhYmxlU3RhdGVGbGFnCisJICovCisJYm9vbCBpc1JlYWNoYWJsZVN0YXRlKCkKKwl7CisJCXJldHVybiggaXNSZWFjaGFibGVTdGF0ZUZsYWcgKTsKKwl9CisKKwl2b2lkIHNldFJlYWNoYWJsZVN0YXRlKGJvb2wgYVJlYWNoYWJsZVN0YXRlRmxhZykKKwl7CisJCWlzUmVhY2hhYmxlU3RhdGVGbGFnID0gYVJlYWNoYWJsZVN0YXRlRmxhZzsKKwl9CisKKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwl2b2lkIGhlYWRlcihPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKKwl2b2lkIHN0ckhlYWRlcihPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKKwlzdGF0aWMgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcywgY29uc3QgVGFibGVPZlJvdXRlciAmIGFUYWJsZU9mUm91dGVyLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBzZWN0aW9uTmFtZSA9ICJyb3V0ZXI6Iik7CisKKwl2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworfTsKKworCit9CisKKyNlbmRpZiAvKkVYRUNVVEFCTEVGT1JNX0hfKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVMaWIuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZUxpYi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI2NWZkZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVMaWIuY3BwCkBAIC0wLDAgKzEsMTkyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMiBqdWlsLiAyMDA4CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJFeGVjdXRhYmxlTGliLmgiCisKKyNpbmNsdWRlIDxmbWwvY29tbW9uL01vZGlmaWVyRWxlbWVudC5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvQmFzZUluc3RhbmNlRm9ybS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVGb3JtLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZkRhdGEuaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mTWFjaGluZS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZQb3J0Lmg+CisKKyNpbmNsdWRlIDxmbWwvdHlwZS9UeXBlTWFuYWdlci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworLyoqCisgKiBQUkUgREVGSU5FRCBNQUNISU5FIFZBUklBQkxFCisgKi8KK1N5bWJvbCBFeGVjdXRhYmxlTGliOjpNQUNISU5FX05VTEw7CitTeW1ib2wgRXhlY3V0YWJsZUxpYjo6TUFDSElORV9FTlZJUk9OTUVOVDsKKworU3ltYm9sIEV4ZWN1dGFibGVMaWI6Ok1BQ0hJTkVfU0VMRjsKK1N5bWJvbCBFeGVjdXRhYmxlTGliOjpNQUNISU5FX1BBUkVOVDsKK1N5bWJvbCBFeGVjdXRhYmxlTGliOjpNQUNISU5FX0NPTU1VTklDQVRPUjsKKworU3ltYm9sIEV4ZWN1dGFibGVMaWI6Ok1BQ0hJTkVfQ09NUE9ORU5UX1NFTEY7CitTeW1ib2wgRXhlY3V0YWJsZUxpYjo6TUFDSElORV9DT01QT05FTlRfUEFSRU5UOworU3ltYm9sIEV4ZWN1dGFibGVMaWI6Ok1BQ0hJTkVfQ09NUE9ORU5UX0NPTU1VTklDQVRPUjsKKworU3ltYm9sIEV4ZWN1dGFibGVMaWI6Ok1BQ0hJTkVfU1lTVEVNOworCisKKy8qKgorICogUFJFIERFRklORUQgTlVMTCBGT1JNCisgKi8KK1N5bWJvbCBFeGVjdXRhYmxlTGliOjpDSEFOTkVMX05JTDsKK1N5bWJvbCBFeGVjdXRhYmxlTGliOjpQT1JUX05JTDsKK1N5bWJvbCBFeGVjdXRhYmxlTGliOjpCVUZGRVJfTklMOworCisKKy8qKgorICogQk9UVE9NCisgKiBUT1AKKyAqLworU3ltYm9sIEV4ZWN1dGFibGVMaWI6OkJPVFRPTTsKK1N5bWJvbCBFeGVjdXRhYmxlTGliOjpUT1A7CisKK1N5bWJvbCBFeGVjdXRhYmxlTGliOjpfTlVMTF87CisKK1N5bWJvbCBFeGVjdXRhYmxlTGliOjpfSU5GSU5JVFlfOworCisKKy8qKgorICogTE9BREVSCisgKi8KK3ZvaWQgRXhlY3V0YWJsZUxpYjo6bG9hZCgpCit7CisJTUFDSElORV9OVUxMID0gbmV3IEluc3RhbmNlT2ZNYWNoaW5lKE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAsCisJCQlTcGVjaWZpZXI6OkRFU0lHTl9JTlNUQU5DRV9TVEFUSUNfU1BFQ0lGSUVSKTsKKwlNQUNISU5FX05VTEwubWFjaGluZSgpLmdldHdNb2RpZmllcigpLnNldE1vZGlmaWVyUHVibGljRmluYWxTdGF0aWMoKTsKKwlNQUNISU5FX05VTEwuc2V0QWxsTmFtZUlEKCJudWxsI21hY2hpbmUiLCAibnVsbCNtYWNoaW5lIik7CisvLwlNQUNISU5FX05VTEwuc2V0QWxsTmFtZUlEKCJudWxsPCBtYWNoaW5lID4iLCAibnVsbDwgbWFjaGluZSA+Iik7CisJTUFDSElORV9OVUxMLm1hY2hpbmUoKS5zZXRJbnN0YW5jZU1vZGVsKE1BQ0hJTkVfTlVMTC5yYXdNYWNoaW5lKCkpOworCisJTUFDSElORV9TRUxGID0gbmV3IEluc3RhbmNlT2ZEYXRhKAorCQkJSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX1NUQU5EQVJEX05BVFVSRSwKKwkJCVR5cGVNYW5hZ2VyOjpNQUNISU5FLCAiY29uc3Q6OnNlbGYiLCAwLAorCQkJTW9kaWZpZXI6OlBST1BFUlRZX1BVQkxJQ19GSU5BTF9TVEFUSUNfTU9ESUZJRVIpOworCisJTUFDSElORV9QQVJFTlQgPSBuZXcgSW5zdGFuY2VPZkRhdGEoCisJCQlJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfU1RBTkRBUkRfTkFUVVJFLAorCQkJVHlwZU1hbmFnZXI6Ok1BQ0hJTkUsICJjb25zdDo6cGFyZW50IiwgMCwKKwkJCU1vZGlmaWVyOjpQUk9QRVJUWV9QVUJMSUNfRklOQUxfU1RBVElDX01PRElGSUVSKTsKKworCU1BQ0hJTkVfQ09NTVVOSUNBVE9SID0gbmV3IEluc3RhbmNlT2ZEYXRhKAorCQkJSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX1NUQU5EQVJEX05BVFVSRSwKKwkJCVR5cGVNYW5hZ2VyOjpNQUNISU5FLCAiY29uc3Q6Om1hY2hpbmUjY29tIiwgMCwKKwkJCU1vZGlmaWVyOjpQUk9QRVJUWV9QVUJMSUNfRklOQUxfU1RBVElDX01PRElGSUVSKTsKKworCisJTUFDSElORV9DT01QT05FTlRfU0VMRiA9IG5ldyBJbnN0YW5jZU9mRGF0YSgKKwkJCUlQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9TVEFOREFSRF9OQVRVUkUsCisJCQlUeXBlTWFuYWdlcjo6TUFDSElORSwgImNvbnN0OjptYWNoaW5lI2NvbXBvbmVudCNzZWxmIiwgMCwKKwkJCU1vZGlmaWVyOjpQUk9QRVJUWV9QVUJMSUNfRklOQUxfU1RBVElDX01PRElGSUVSKTsKKworCU1BQ0hJTkVfQ09NUE9ORU5UX1BBUkVOVCA9IG5ldyBJbnN0YW5jZU9mRGF0YSgKKwkJCUlQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9TVEFOREFSRF9OQVRVUkUsCisJCQlUeXBlTWFuYWdlcjo6TUFDSElORSwgImNvbnN0OjptYWNoaW5lI2NvbXBvbmVudCNwYXJlbnQiLCAwLAorCQkJTW9kaWZpZXI6OlBST1BFUlRZX1BVQkxJQ19GSU5BTF9TVEFUSUNfTU9ESUZJRVIpOworCisJTUFDSElORV9DT01QT05FTlRfQ09NTVVOSUNBVE9SID0gbmV3IEluc3RhbmNlT2ZEYXRhKAorCQkJSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX1NUQU5EQVJEX05BVFVSRSwKKwkJCVR5cGVNYW5hZ2VyOjpNQUNISU5FLCAiY29uc3Q6Om1hY2hpbmUjY29tcG9uZW50I2NvbW11bmljYXRvciIsIDAsCisJCQlNb2RpZmllcjo6UFJPUEVSVFlfUFVCTElDX0ZJTkFMX1NUQVRJQ19NT0RJRklFUik7CisKKworCU1BQ0hJTkVfU1lTVEVNID0gbmV3IEluc3RhbmNlT2ZEYXRhKAorCQkJSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX1NUQU5EQVJEX05BVFVSRSwKKwkJCVR5cGVNYW5hZ2VyOjpNQUNISU5FLCAiY29uc3Q6OnN5c3RlbSIsIDAsCisJCQlNb2RpZmllcjo6UFJPUEVSVFlfUFVCTElDX0ZJTkFMX1NUQVRJQ19NT0RJRklFUik7CisKKwlNQUNISU5FX0VOVklST05NRU5UID0gbmV3IEluc3RhbmNlT2ZEYXRhKAorCQkJSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX1NUQU5EQVJEX05BVFVSRSwKKwkJCVR5cGVNYW5hZ2VyOjpNQUNISU5FLCAiY29uc3Q6OmVudiIsIDAsCisJCQlNb2RpZmllcjo6UFJPUEVSVFlfUFVCTElDX0ZJTkFMX1NUQVRJQ19NT0RJRklFUik7CisKKworCUNIQU5ORUxfTklMID0gSW5zdGFuY2VPZlBvcnQ6Om5ld0NoYW5uZWwoCisJCQlOVUxMLCBOVUxMLCBBVk1fTlVNRVJJQ19NQVhfT0ZGU0VUKTsKKwlDSEFOTkVMX05JTC5zZXRBbGxOYW1lSUQoIm51bGwjY2hhbm5lbCIsICJudWxsI2NoYW5uZWwiKTsKKy8vCUNIQU5ORUxfTklMLnNldEFsbE5hbWVJRCgibnVsbDwgY2hhbm5lbCA+IiwgIm51bGw8IGNoYW5uZWwgPiIpOworCisJUE9SVF9OSUwgPSBuZXcgSW5zdGFuY2VPZlBvcnQoTlVMTCwgTlVMTCwKKwkJCUFWTV9OVU1FUklDX01BWF9PRkZTRVQsIDAsIElDb21Qb2ludDo6SU9fVU5ERUZJTkVEX05BVFVSRSk7CisJUE9SVF9OSUwuc2V0QWxsTmFtZUlEKCJudWxsI3BvcnQiLCAibnVsbCNwb3J0Iik7CisvLwlQT1JUX05JTC5zZXRBbGxOYW1lSUQoIm51bGw8IHBvcnQgPiIsICJudWxsPCBwb3J0ID4iKTsKKworCUJVRkZFUl9OSUwgPSBuZXcgSW5zdGFuY2VPZkJ1ZmZlcihOVUxMLCBOVUxMLCBBVk1fTlVNRVJJQ19NQVhfT0ZGU0VULAorCQkJVFlQRV9VTkRFRklORURfU1BFQ0lGSUVSLCAtMSk7CisJQlVGRkVSX05JTC5zZXRBbGxOYW1lSUQoIm51bGwjYnVmZmVyIiwgIm51bGwjYnVmZmVyIik7CisvLwlCVUZGRVJfTklMLnNldEFsbE5hbWVJRCgibnVsbDwgYnVmZmVyID4iLCAibnVsbDwgYnVmZmVyID4iKTsKKworCisJQk9UVE9NID0gbmV3IEluc3RhbmNlT2ZEYXRhKAorCQkJSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX1NUQU5EQVJEX05BVFVSRSwKKwkJCVR5cGVNYW5hZ2VyOjpVTklWRVJTQUwsICJjb25zdDo6Qk9UVE9NIiwgMCwKKwkJCU1vZGlmaWVyOjpQUk9QRVJUWV9QVUJMSUNfRklOQUxfU1RBVElDX01PRElGSUVSKTsKKworCVRPUCA9IG5ldyBJbnN0YW5jZU9mRGF0YSgKKwkJCUlQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9TVEFOREFSRF9OQVRVUkUsCisJCQlUeXBlTWFuYWdlcjo6VU5JVkVSU0FMLCAiY29uc3Q6OlRPUCIsIDAsCisJCQlNb2RpZmllcjo6UFJPUEVSVFlfUFVCTElDX0ZJTkFMX1NUQVRJQ19NT0RJRklFUik7CisKKwlfTlVMTF8gPSBuZXcgSW5zdGFuY2VPZkRhdGEoCisJCQlJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfU1RBTkRBUkRfTkFUVVJFLAorCQkJVHlwZU1hbmFnZXI6OlVOSVZFUlNBTCwgImNvbnN0OjpOVUxMIiwgMCwKKwkJCU1vZGlmaWVyOjpQUk9QRVJUWV9QVUJMSUNfRklOQUxfU1RBVElDX01PRElGSUVSKTsKKworCV9JTkZJTklUWV8gPSBuZXcgSW5zdGFuY2VPZkRhdGEoCisJCQlJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfU1RBTkRBUkRfTkFUVVJFLAorCQkJVHlwZU1hbmFnZXI6OlVOSVZFUlNBTCwgImNvbnN0OjpJTkZJTklUWSIsIDAsCisJCQlNb2RpZmllcjo6UFJPUEVSVFlfUFVCTElDX0ZJTkFMX1NUQVRJQ19NT0RJRklFUik7Cit9CisKKworLyoqCisgKiBESVNQT1NFUgorICovCit2b2lkIEV4ZWN1dGFibGVMaWI6OmRpc3Bvc2UoKQoreworCU1BQ0hJTkVfTlVMTC5kZXN0cm95KCk7CisJTUFDSElORV9FTlZJUk9OTUVOVC5kZXN0cm95KCk7CisKKwlNQUNISU5FX1NFTEYuZGVzdHJveSgpOworCU1BQ0hJTkVfUEFSRU5ULmRlc3Ryb3koKTsKKwlNQUNISU5FX0NPTU1VTklDQVRPUi5kZXN0cm95KCk7CisJTUFDSElORV9DT01QT05FTlRfU0VMRi5kZXN0cm95KCk7CisJTUFDSElORV9DT01QT05FTlRfUEFSRU5ULmRlc3Ryb3koKTsKKwlNQUNISU5FX0NPTVBPTkVOVF9DT01NVU5JQ0FUT1IuZGVzdHJveSgpOworCU1BQ0hJTkVfU1lTVEVNLmRlc3Ryb3koKTsKKworCUNIQU5ORUxfTklMLmRlc3Ryb3koKTsKKwlQT1JUX05JTC5kZXN0cm95KCk7CisJQlVGRkVSX05JTC5kZXN0cm95KCk7CisKKwlCT1RUT00uZGVzdHJveSgpOworCVRPUC5kZXN0cm95KCk7CisKKwlfTlVMTF8uZGVzdHJveSgpOworCisJX0lORklOSVRZXy5kZXN0cm95KCk7Cit9CisKKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlTGliLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlTGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZlMmYyNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVMaWIuaApAQCAtMCwwICsxLDk5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMiBqdWlsLiAyMDA4CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRVhFQ1VUQUJMRUxJQl9IXworI2RlZmluZSBFWEVDVVRBQkxFTElCX0hfCisKKyNpbmNsdWRlIDxjb21tb24vQkYuaD4KKworI2luY2x1ZGUgPGZtbC9zeW1ib2wvU3ltYm9sLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIEV4ZWN1dGFibGVMaWIKK3sKKworcHVibGljOgorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJRXhlY3V0YWJsZUxpYigpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+RXhlY3V0YWJsZUxpYigpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBMT0FERVIgLSBESVNQT1NFUgorCSAqLworCXN0YXRpYyB2b2lkIGxvYWQoKTsKKwlzdGF0aWMgdm9pZCBkaXNwb3NlKCk7CisKKworCS8qKgorCSAqIFBSRSBERUZJTkVEIE1BQ0hJTkUgVkFSSUFCTEUKKwkgKi8KKwlzdGF0aWMgU3ltYm9sIE1BQ0hJTkVfTlVMTDsKKwlzdGF0aWMgU3ltYm9sIE1BQ0hJTkVfRU5WSVJPTk1FTlQ7CisKKwlzdGF0aWMgU3ltYm9sIE1BQ0hJTkVfU0VMRjsKKwlzdGF0aWMgU3ltYm9sIE1BQ0hJTkVfUEFSRU5UOworCXN0YXRpYyBTeW1ib2wgTUFDSElORV9DT01NVU5JQ0FUT1I7CisKKwlzdGF0aWMgU3ltYm9sIE1BQ0hJTkVfQ09NUE9ORU5UX1NFTEY7CisJc3RhdGljIFN5bWJvbCBNQUNISU5FX0NPTVBPTkVOVF9QQVJFTlQ7CisJc3RhdGljIFN5bWJvbCBNQUNISU5FX0NPTVBPTkVOVF9DT01NVU5JQ0FUT1I7CisKKwlzdGF0aWMgU3ltYm9sIE1BQ0hJTkVfU1lTVEVNOworCisJLyoqCisJICogUFJFIERFRklORUQgTlVMTCBGT1JNCisJICovCisJc3RhdGljIFN5bWJvbCBDSEFOTkVMX05JTDsKKwlzdGF0aWMgU3ltYm9sIFBPUlRfTklMOworCXN0YXRpYyBTeW1ib2wgQlVGRkVSX05JTDsKKworCisKKwkvKioKKwkgKiBCT1RUT00KKwkgKiBUT1AKKwkgKi8KKwlzdGF0aWMgU3ltYm9sIEJPVFRPTTsKKwlzdGF0aWMgU3ltYm9sIFRPUDsKKworCXN0YXRpYyBTeW1ib2wgX05VTExfOworCisJc3RhdGljIFN5bWJvbCBfSU5GSU5JVFlfOworCisKK307CisKKworfQorCisjZW5kaWYgLyogRVhFQ1VUQUJMRUxJQl9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZVF1ZXJ5LmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVRdWVyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE1OGMxZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVRdWVyeS5jcHAKQEAgLTAsMCArMSwxMTM4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogOCBtYXJzIDIwMTcKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkV4ZWN1dGFibGVRdWVyeS5oIgorCisjaW5jbHVkZSA8Y29sbGVjdGlvbi9Db2xsZWN0aW9uLmg+CisKKyNpbmNsdWRlIDxjb21tb24vTmFtZWRFbGVtZW50Lmg+CisKKyNpbmNsdWRlIDxmbWwvc3ltYm9sL1RhYmxlT2ZTeW1ib2wuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoqCisgKiBHRVRURVIKKyAqIExpc3Qgb2YgYWxsIFJVTlRJTUUgRXhlY3V0YWJsZSBFbGVtZW50CisgKi8KK3ZvaWQgRXhlY3V0YWJsZVF1ZXJ5OjpnZXRSdW50aW1lRXhlY3V0YWJsZShJbnN0YW5jZU9mTWFjaGluZSAqIGFNYWNoaW5lLAorCQlDb2xsZWN0aW9uPCBFeGVjdXRhYmxlRm9ybSAqID4gJiBsaXN0T2ZFeGVjdXRhYmxlKQoreworCWxpc3RPZkV4ZWN1dGFibGUuYWRkX3VuaW9uKCBhTWFjaGluZS0+Z2V0RXhlY3V0YWJsZSgpICk7CisKKwlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBpdDsKKwlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBpdEVuZDsKKworCWl0ID0gYU1hY2hpbmUtPmdldEV4ZWN1dGFibGUoKS0+aW5zdGFuY2VfbW9kZWxfYmVnaW4oKTsKKwlpdEVuZCA9IGFNYWNoaW5lLT5nZXRFeGVjdXRhYmxlKCktPmluc3RhbmNlX21vZGVsX2VuZCgpOworCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQorCXsKKwkJZ2V0UnVudGltZUV4ZWN1dGFibGUoKCppdCkucmF3TWFjaGluZSgpLCBsaXN0T2ZFeGVjdXRhYmxlKTsKKwl9CisKKwlpdCA9IGFNYWNoaW5lLT5nZXRFeGVjdXRhYmxlKCktPmluc3RhbmNlX3N0YXRpY19iZWdpbigpOworCWl0RW5kID0gYU1hY2hpbmUtPmdldEV4ZWN1dGFibGUoKS0+aW5zdGFuY2Vfc3RhdGljX2VuZCgpOworCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQorCXsKKwkJZ2V0UnVudGltZUV4ZWN1dGFibGUoKCppdCkucmF3TWFjaGluZSgpLCBsaXN0T2ZFeGVjdXRhYmxlKTsKKwl9Cit9CisKKworCisvKioKKyAqIFNFQVJDSAorICogQXZtVHJhbnNpdGlvbgorICovCitjb25zdCBCRiAmIEV4ZWN1dGFibGVRdWVyeTo6Z2V0VHJhbnNpdGlvbkJ5QXN0RWxlbWVudCgKKwkJY29uc3QgT2JqZWN0RWxlbWVudCAqIGFzdEVsZW1lbnQpIGNvbnN0Cit7CisJLy8gUkVWRVJTRSBiZWNhdXNlIG1hY2hpbmVzIGFyZSBpbnNlcnQgYWZ0ZXIgY2hpbGRyZW4KKwljb25zdF9leGVjX2l0ZXJhdG9yIGl0RXhlYyAgPSBnZXRTeXN0ZW0oKS5nZXRFeGVjdXRhYmxlcygpLmJlZ2luKCk7CisJY29uc3RfZXhlY19pdGVyYXRvciBlbmRFeGVjICA9IGdldFN5c3RlbSgpLmdldEV4ZWN1dGFibGVzKCkuZW5kKCk7CisJZm9yKCA7IGl0RXhlYyAhPSBlbmRFeGVjIDsgKytpdEV4ZWMgKQorCXsKKwkJY29uc3QgQkYgJiBmb3VuZFRyYW5zaXRpb24gPQorCQkJCShpdEV4ZWMpLT5nZXRUcmFuc2l0aW9uQnlBc3RFbGVtZW50KGFzdEVsZW1lbnQpOworCQlpZiggZm91bmRUcmFuc2l0aW9uLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kVHJhbnNpdGlvbiApOworCQl9CisJfQorCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKK30KKworCitjb25zdCBCRiAmIEV4ZWN1dGFibGVRdWVyeTo6Z2V0VHJhbnNpdGlvbigKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQpIGNvbnN0Cit7CisJLy8gUkVWRVJTRSBiZWNhdXNlIG1hY2hpbmVzIGFyZSBpbnNlcnQgYWZ0ZXIgY2hpbGRyZW4KKwljb25zdF9leGVjX2l0ZXJhdG9yIGl0RXhlYyAgPSBnZXRTeXN0ZW0oKS5nZXRFeGVjdXRhYmxlcygpLmJlZ2luKCk7CisJY29uc3RfZXhlY19pdGVyYXRvciBlbmRFeGVjICA9IGdldFN5c3RlbSgpLmdldEV4ZWN1dGFibGVzKCkuZW5kKCk7CisJZm9yKCA7IGl0RXhlYyAhPSBlbmRFeGVjIDsgKytpdEV4ZWMgKQorCXsKKwkJY29uc3QgQkYgJiBmb3VuZFRyYW5zaXRpb24gPQorCQkJCShpdEV4ZWMpLT5nZXRUcmFuc2l0aW9uKGFGdWxseVF1YWxpZmllZE5hbWVJRCk7CisKKwkJaWYoIGZvdW5kVHJhbnNpdGlvbi52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCBmb3VuZFRyYW5zaXRpb24gKTsKKwkJfQorCX0KKworCXJldHVybiggQkY6OlJFRl9OVUxMICk7Cit9CisKKworY29uc3QgQkYgJiBFeGVjdXRhYmxlUXVlcnk6OmdldFRyYW5zaXRpb25CeU5hbWVJRCgKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKSBjb25zdAoreworCS8vIFJFVkVSU0UgYmVjYXVzZSBtYWNoaW5lcyBhcmUgaW5zZXJ0IGFmdGVyIGNoaWxkcmVuCisJY29uc3RfZXhlY19pdGVyYXRvciBpdEV4ZWMgID0gZ2V0U3lzdGVtKCkuZ2V0RXhlY3V0YWJsZXMoKS5iZWdpbigpOworCWNvbnN0X2V4ZWNfaXRlcmF0b3IgZW5kRXhlYyAgPSBnZXRTeXN0ZW0oKS5nZXRFeGVjdXRhYmxlcygpLmVuZCgpOworCWZvciggOyBpdEV4ZWMgIT0gZW5kRXhlYyA7ICsraXRFeGVjICkKKwl7CisJCWNvbnN0IEJGICYgZm91bmRUcmFuc2l0aW9uID0gKGl0RXhlYyktPmdldFRyYW5zaXRpb25CeU5hbWVJRCggYU5hbWVJRCApOworCQlpZiggZm91bmRUcmFuc2l0aW9uLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kVHJhbnNpdGlvbiApOworCQl9CisJfQorCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKK30KKworY29uc3QgQkYgJiBFeGVjdXRhYmxlUXVlcnk6OmdldFRyYW5zaXRpb25CeVF1YWxpZmllZE5hbWVJRCgKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKSBjb25zdAoreworCS8vIFJFVkVSU0UgYmVjYXVzZSBtYWNoaW5lcyBhcmUgaW5zZXJ0IGFmdGVyIGNoaWxkcmVuCisJY29uc3RfZXhlY19pdGVyYXRvciBpdEV4ZWMgID0gZ2V0U3lzdGVtKCkuZ2V0RXhlY3V0YWJsZXMoKS5iZWdpbigpOworCWNvbnN0X2V4ZWNfaXRlcmF0b3IgZW5kRXhlYyAgPSBnZXRTeXN0ZW0oKS5nZXRFeGVjdXRhYmxlcygpLmVuZCgpOworCWZvciggOyBpdEV4ZWMgIT0gZW5kRXhlYyA7ICsraXRFeGVjICkKKwl7CisJCWNvbnN0IEJGICYgZm91bmRUcmFuc2l0aW9uID0KKwkJCQkoaXRFeGVjKS0+Z2V0VHJhbnNpdGlvbkJ5UXVhbGlmaWVkTmFtZUlEKGFRdWFsaWZpZWROYW1lSUQpOworCisJCWlmKCBmb3VuZFRyYW5zaXRpb24udmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRUcmFuc2l0aW9uICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworfQorCisKKy8qKgorICogU0VBUkNICisgKiBBdm1Qcm9ncmFtCisgKi8KK2NvbnN0IEJGICYgRXhlY3V0YWJsZVF1ZXJ5OjpnZXRQcm9ncmFtKAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCkgY29uc3QKK3sKKwkvLyBSRVZFUlNFIGJlY2F1c2UgbWFjaGluZXMgYXJlIGluc2VydCBhZnRlciBjaGlsZHJlbgorCWNvbnN0X2V4ZWNfaXRlcmF0b3IgaXRFeGVjICA9IGdldFN5c3RlbSgpLmdldEV4ZWN1dGFibGVzKCkuYmVnaW4oKTsKKwljb25zdF9leGVjX2l0ZXJhdG9yIGVuZEV4ZWMgID0gZ2V0U3lzdGVtKCkuZ2V0RXhlY3V0YWJsZXMoKS5lbmQoKTsKKwlmb3IoIDsgaXRFeGVjICE9IGVuZEV4ZWMgOyArK2l0RXhlYyApCisJeworCQljb25zdCBCRiAmIGZvdW5kUHJvZ3JhbSA9IChpdEV4ZWMpLT5nZXRQcm9ncmFtKGFGdWxseVF1YWxpZmllZE5hbWVJRCk7CisKKwkJaWYoIGZvdW5kUHJvZ3JhbS52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCBmb3VuZFByb2dyYW0gKTsKKwkJfQorCX0KKworCXJldHVybiggQkY6OlJFRl9OVUxMICk7Cit9CisKKworCisvKioKKyAqIFNFQVJDSAorICogQXZtUHJvZ3JhbQorICogRXhlY3V0YWJsZUZvcm0KKyAqLworY29uc3QgQkYgJiBFeGVjdXRhYmxlUXVlcnk6OmdldEV4ZWN1dGFibGVPclByb2dyYW0oCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEKSBjb25zdAoreworCS8vIFJFVkVSU0UgYmVjYXVzZSBtYWNoaW5lcyBhcmUgaW5zZXJ0IGFmdGVyIGNoaWxkcmVuCisJY29uc3RfZXhlY19pdGVyYXRvciBpdEV4ZWMgID0gZ2V0U3lzdGVtKCkuZ2V0RXhlY3V0YWJsZXMoKS5iZWdpbigpOworCWNvbnN0X2V4ZWNfaXRlcmF0b3IgZW5kRXhlYyAgPSBnZXRTeXN0ZW0oKS5nZXRFeGVjdXRhYmxlcygpLmVuZCgpOworCWZvciggOyBpdEV4ZWMgIT0gZW5kRXhlYyA7ICsraXRFeGVjICkKKwl7CisJCWlmKCBOYW1lZEVsZW1lbnQ6OmNvbXBhcmVMb2NhdGlvbigKKwkJCQlpdEV4ZWMtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCksIGFGdWxseVF1YWxpZmllZE5hbWVJRCkgKQorCQl7CisJCQlyZXR1cm4oICgqaXRFeGVjKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJeworCQkJCWNvbnN0IEJGICYgZm91bmRUcmFuc2l0aW9uID0KKwkJCQkJCWl0RXhlYy0+Z2V0VHJhbnNpdGlvbihhRnVsbHlRdWFsaWZpZWROYW1lSUQpOworCisJCQkJaWYoIGZvdW5kVHJhbnNpdGlvbi52YWxpZCgpICkKKwkJCQl7CisJCQkJCXJldHVybiggZm91bmRUcmFuc2l0aW9uICk7CisJCQkJfQorCQkJfQorCQkJeworCQkJCWNvbnN0IEJGICYgZm91bmRQcm9ncmFtID0KKwkJCQkJCWl0RXhlYy0+Z2V0UHJvZ3JhbShhRnVsbHlRdWFsaWZpZWROYW1lSUQpOworCisJCQkJaWYoIGZvdW5kUHJvZ3JhbS52YWxpZCgpICkKKwkJCQl7CisJCQkJCXJldHVybiggZm91bmRQcm9ncmFtICk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKK30KKworCisvLyBHZXR0ZXIgYnkgQVNULUVsZW1lbnQKK2NvbnN0IEJGICYgRXhlY3V0YWJsZVF1ZXJ5OjpnZXRFeGVjdXRhYmxlT3JQcm9ncmFtKAorCQljb25zdCBPYmplY3RFbGVtZW50ICogYXN0RWxlbWVudCkgY29uc3QKK3sKKwkvLyBSRVZFUlNFIGJlY2F1c2UgbWFjaGluZXMgYXJlIGluc2VydCBhZnRlciBjaGlsZHJlbgorCWNvbnN0X2V4ZWNfaXRlcmF0b3IgaXRFeGVjICA9IGdldFN5c3RlbSgpLmdldEV4ZWN1dGFibGVzKCkuYmVnaW4oKTsKKwljb25zdF9leGVjX2l0ZXJhdG9yIGVuZEV4ZWMgID0gZ2V0U3lzdGVtKCkuZ2V0RXhlY3V0YWJsZXMoKS5lbmQoKTsKKwlmb3IoIDsgaXRFeGVjICE9IGVuZEV4ZWMgOyArK2l0RXhlYyApCisJeworCQlpZiggaXRFeGVjLT5pc0FzdEVsZW1lbnQoIGFzdEVsZW1lbnQgKSApCisJCXsKKwkJCXJldHVybiggKCppdEV4ZWMpICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQl7CisJCQkJY29uc3QgQkYgJiBmb3VuZFRyYW5zaXRpb24gPQorCQkJCQkJaXRFeGVjLT5nZXRUcmFuc2l0aW9uQnlBc3RFbGVtZW50KGFzdEVsZW1lbnQpOworCisJCQkJaWYoIGZvdW5kVHJhbnNpdGlvbi52YWxpZCgpICkKKwkJCQl7CisJCQkJCXJldHVybiggZm91bmRUcmFuc2l0aW9uICk7CisJCQkJfQorCQkJfQorCQkJeworCQkJCWNvbnN0IEJGICYgZm91bmRQcm9ncmFtID0KKwkJCQkJCWl0RXhlYy0+Z2V0UHJvZ3JhbUJ5QXN0RWxlbWVudChhc3RFbGVtZW50KTsKKwkJCQlpZiggZm91bmRQcm9ncmFtLnZhbGlkKCkgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCBmb3VuZFByb2dyYW0gKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworfQorCisKKy8qKgorICogU0VBUkNICisgKiBJbnN0YW5jZU9mQnVmZmVyCisgKi8KK2NvbnN0IFN5bWJvbCAmIEV4ZWN1dGFibGVRdWVyeTo6Z2V0QnVmZmVyKAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCkgY29uc3QKK3sKKwkvLyBSRVZFUlNFIGJlY2F1c2UgbWFjaGluZXMgYXJlIGluc2VydCBhZnRlciBjaGlsZHJlbgorCWNvbnN0X2V4ZWNfaXRlcmF0b3IgaXRFeGVjICA9IGdldFN5c3RlbSgpLmdldEV4ZWN1dGFibGVzKCkuYmVnaW4oKTsKKwljb25zdF9leGVjX2l0ZXJhdG9yIGVuZEV4ZWMgID0gZ2V0U3lzdGVtKCkuZ2V0RXhlY3V0YWJsZXMoKS5lbmQoKTsKKwlmb3IoIDsgaXRFeGVjICE9IGVuZEV4ZWMgOyArK2l0RXhlYyApCisJeworCQljb25zdCBTeW1ib2wgJiBmb3VuZEVsZW1lbnQgPQorCQkJCShpdEV4ZWMpLT5nZXRCdWZmZXIoKS5nZXRCeUZRTmFtZUlEKCBhRnVsbHlRdWFsaWZpZWROYW1lSUQgKTsKKworCQlpZiggZm91bmRFbGVtZW50LnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kRWxlbWVudCApOworCQl9CisJfQorCisJcmV0dXJuKCBTeW1ib2w6OlJFRl9OVUxMICk7Cit9CisKK2NvbnN0IFN5bWJvbCAmIEV4ZWN1dGFibGVRdWVyeTo6Z2V0QnVmZmVyQnlOYW1lSUQoCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkgY29uc3QKK3sKKwkvLyBSRVZFUlNFIGJlY2F1c2UgbWFjaGluZXMgYXJlIGluc2VydCBhZnRlciBjaGlsZHJlbgorCWNvbnN0X2V4ZWNfaXRlcmF0b3IgaXRFeGVjICA9IGdldFN5c3RlbSgpLmdldEV4ZWN1dGFibGVzKCkuYmVnaW4oKTsKKwljb25zdF9leGVjX2l0ZXJhdG9yIGVuZEV4ZWMgID0gZ2V0U3lzdGVtKCkuZ2V0RXhlY3V0YWJsZXMoKS5lbmQoKTsKKwlmb3IoIDsgaXRFeGVjICE9IGVuZEV4ZWMgOyArK2l0RXhlYyApCisJeworCQljb25zdCBTeW1ib2wgJiBmb3VuZEVsZW1lbnQgPQorCQkJCShpdEV4ZWMpLT5nZXRCdWZmZXIoKS5nZXRCeU5hbWVJRCggYU5hbWVJRCApOworCisJCWlmKCBmb3VuZEVsZW1lbnQudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRFbGVtZW50ICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIFN5bWJvbDo6UkVGX05VTEwgKTsKK30KKworY29uc3QgU3ltYm9sICYgRXhlY3V0YWJsZVF1ZXJ5OjpnZXRCdWZmZXJCeVF1YWxpZmllZE5hbWVJRCgKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKSBjb25zdAoreworCS8vIFJFVkVSU0UgYmVjYXVzZSBtYWNoaW5lcyBhcmUgaW5zZXJ0IGFmdGVyIGNoaWxkcmVuCisJY29uc3RfZXhlY19pdGVyYXRvciBpdEV4ZWMgID0gZ2V0U3lzdGVtKCkuZ2V0RXhlY3V0YWJsZXMoKS5iZWdpbigpOworCWNvbnN0X2V4ZWNfaXRlcmF0b3IgZW5kRXhlYyAgPSBnZXRTeXN0ZW0oKS5nZXRFeGVjdXRhYmxlcygpLmVuZCgpOworCWZvciggOyBpdEV4ZWMgIT0gZW5kRXhlYyA7ICsraXRFeGVjICkKKwl7CisJCWNvbnN0IFN5bWJvbCAmIGZvdW5kRWxlbWVudCA9CisJCQkJKGl0RXhlYyktPmdldEJ1ZmZlcigpLmdldEJ5UXVhbGlmaWVkTmFtZUlEKGFRdWFsaWZpZWROYW1lSUQpOworCisJCWlmKCBmb3VuZEVsZW1lbnQudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRFbGVtZW50ICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIFN5bWJvbDo6UkVGX05VTEwgKTsKK30KKworY29uc3QgU3ltYm9sICYgRXhlY3V0YWJsZVF1ZXJ5OjpnZXRCdWZmZXJCeUFzdEVsZW1lbnQoCisJCWNvbnN0IE9iamVjdEVsZW1lbnQgKiBhc3RFbGVtZW50KSBjb25zdAoreworCS8vIFJFVkVSU0UgYmVjYXVzZSBtYWNoaW5lcyBhcmUgaW5zZXJ0IGFmdGVyIGNoaWxkcmVuCisJY29uc3RfZXhlY19pdGVyYXRvciBpdEV4ZWMgID0gZ2V0U3lzdGVtKCkuZ2V0RXhlY3V0YWJsZXMoKS5iZWdpbigpOworCWNvbnN0X2V4ZWNfaXRlcmF0b3IgZW5kRXhlYyAgPSBnZXRTeXN0ZW0oKS5nZXRFeGVjdXRhYmxlcygpLmVuZCgpOworCWZvciggOyBpdEV4ZWMgIT0gZW5kRXhlYyA7ICsraXRFeGVjICkKKwl7CisJCWNvbnN0IFN5bWJvbCAmIGZvdW5kRWxlbWVudCA9CisJCQkJKGl0RXhlYyktPmdldEJ1ZmZlcigpLmdldEJ5QXN0RWxlbWVudChhc3RFbGVtZW50KTsKKworCQlpZiggZm91bmRFbGVtZW50LnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kRWxlbWVudCApOworCQl9CisJfQorCisJcmV0dXJuKCBTeW1ib2w6OlJFRl9OVUxMICk7Cit9CisKKworCisKKy8qKgorICogU0VBUkNICisgKiBJbnN0YW5jZU9mRGF0YQorICovCitjb25zdCBCRiAmIEV4ZWN1dGFibGVRdWVyeTo6Z2V0RGF0YUJ5TmFtZUlEKGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkgY29uc3QKK3sKKwkvLyBSRVZFUlNFIGJlY2F1c2UgbWFjaGluZXMgYXJlIGluc2VydCBhZnRlciBjaGlsZHJlbgorCWNvbnN0X2V4ZWNfaXRlcmF0b3IgaXRFeGVjICA9IGdldFN5c3RlbSgpLmdldEV4ZWN1dGFibGVzKCkuYmVnaW4oKTsKKwljb25zdF9leGVjX2l0ZXJhdG9yIGVuZEV4ZWMgID0gZ2V0U3lzdGVtKCkuZ2V0RXhlY3V0YWJsZXMoKS5lbmQoKTsKKwlmb3IoIDsgaXRFeGVjICE9IGVuZEV4ZWMgOyArK2l0RXhlYyApCisJeworCQl7CisJCQljb25zdCBCRiAmIGZvdW5kRWxlbWVudCA9CisJCQkJCShpdEV4ZWMpLT5nZXRBbGxEYXRhKCkuZ2V0QnlOYW1lSUQoIGFOYW1lSUQgKTsKKworCQkJaWYoIGZvdW5kRWxlbWVudC52YWxpZCgpICkKKwkJCXsKKwkJCQlyZXR1cm4oIGZvdW5kRWxlbWVudCApOworCQkJfQorCQl9CisJCXsKKwkJCWNvbnN0IEJGICYgZm91bmRFbGVtZW50ID0KKwkJCQkJKGl0RXhlYyktPmdldENvbnN0RGF0YSgpLmdldEJ5TmFtZUlEKCBhTmFtZUlEICk7CisKKwkJCWlmKCBmb3VuZEVsZW1lbnQudmFsaWQoKSApCisJCQl7CisJCQkJcmV0dXJuKCBmb3VuZEVsZW1lbnQgKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiggQkY6OlJFRl9OVUxMICk7Cit9CisKK2NvbnN0IEJGICYgRXhlY3V0YWJsZVF1ZXJ5OjpnZXREYXRhQnlRdWFsaWZpZWROYW1lSUQoCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkgY29uc3QKK3sKKwkvLyBSRVZFUlNFIGJlY2F1c2UgbWFjaGluZXMgYXJlIGluc2VydCBhZnRlciBjaGlsZHJlbgorCWNvbnN0X2V4ZWNfaXRlcmF0b3IgaXRFeGVjICA9IGdldFN5c3RlbSgpLmdldEV4ZWN1dGFibGVzKCkuYmVnaW4oKTsKKwljb25zdF9leGVjX2l0ZXJhdG9yIGVuZEV4ZWMgID0gZ2V0U3lzdGVtKCkuZ2V0RXhlY3V0YWJsZXMoKS5lbmQoKTsKKwlmb3IoIDsgaXRFeGVjICE9IGVuZEV4ZWMgOyArK2l0RXhlYyApCisJeworCQl7CisJCQljb25zdCBCRiAmIGZvdW5kRWxlbWVudCA9IChpdEV4ZWMpLT5nZXRBbGxEYXRhKCkuCisJCQkJCWdldEJ5UXVhbGlmaWVkTmFtZUlEKGFRdWFsaWZpZWROYW1lSUQpOworCisJCQlpZiggZm91bmRFbGVtZW50LnZhbGlkKCkgKQorCQkJeworCQkJCXJldHVybiggZm91bmRFbGVtZW50ICk7CisJCQl9CisJCX0KKwkJeworCQkJY29uc3QgQkYgJiBmb3VuZEVsZW1lbnQgPSAoaXRFeGVjKS0+Z2V0Q29uc3REYXRhKCkuCisJCQkJCWdldEJ5UXVhbGlmaWVkTmFtZUlEKGFRdWFsaWZpZWROYW1lSUQpOworCisJCQlpZiggZm91bmRFbGVtZW50LnZhbGlkKCkgKQorCQkJeworCQkJCXJldHVybiggZm91bmRFbGVtZW50ICk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworfQorCisKK2NvbnN0IEJGICYgRXhlY3V0YWJsZVF1ZXJ5OjpnZXREYXRhKAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCkgY29uc3QKK3sKKwkvLyBSRVZFUlNFIGJlY2F1c2UgbWFjaGluZXMgYXJlIGluc2VydCBhZnRlciBjaGlsZHJlbgorCWNvbnN0X2V4ZWNfaXRlcmF0b3IgaXRFeGVjICA9IGdldFN5c3RlbSgpLmdldEV4ZWN1dGFibGVzKCkuYmVnaW4oKTsKKwljb25zdF9leGVjX2l0ZXJhdG9yIGVuZEV4ZWMgID0gZ2V0U3lzdGVtKCkuZ2V0RXhlY3V0YWJsZXMoKS5lbmQoKTsKKwlmb3IoIDsgaXRFeGVjICE9IGVuZEV4ZWMgOyArK2l0RXhlYyApCisJeworCQl7CisJCQljb25zdCBCRiAmIGZvdW5kRWxlbWVudCA9CisJCQkJKGl0RXhlYyktPmdldEFsbERhdGEoKS5nZXRCeUZRTmFtZUlEKCBhRnVsbHlRdWFsaWZpZWROYW1lSUQgKTsKKworCQkJaWYoIGZvdW5kRWxlbWVudC52YWxpZCgpICkKKwkJCXsKKwkJCQlyZXR1cm4oIGZvdW5kRWxlbWVudCApOworCQkJfQorCQl9CisJCXsKKwkJCWNvbnN0IEJGICYgZm91bmRFbGVtZW50ID0KKwkJCQkoaXRFeGVjKS0+Z2V0Q29uc3REYXRhKCkuZ2V0QnlGUU5hbWVJRCggYUZ1bGx5UXVhbGlmaWVkTmFtZUlEICk7CisKKwkJCWlmKCBmb3VuZEVsZW1lbnQudmFsaWQoKSApCisJCQl7CisJCQkJcmV0dXJuKCBmb3VuZEVsZW1lbnQgKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiggQkY6OlJFRl9OVUxMICk7Cit9CisKKworY29uc3QgQkYgJiBFeGVjdXRhYmxlUXVlcnk6OmdldERhdGFCeUFzdEVsZW1lbnQoCisJCWNvbnN0IE9iamVjdEVsZW1lbnQgKiBhc3RFbGVtZW50KSBjb25zdAoreworCS8vIFJFVkVSU0UgYmVjYXVzZSBtYWNoaW5lcyBhcmUgaW5zZXJ0IGFmdGVyIGNoaWxkcmVuCisJY29uc3RfZXhlY19pdGVyYXRvciBpdEV4ZWMgID0gZ2V0U3lzdGVtKCkuZ2V0RXhlY3V0YWJsZXMoKS5iZWdpbigpOworCWNvbnN0X2V4ZWNfaXRlcmF0b3IgZW5kRXhlYyAgPSBnZXRTeXN0ZW0oKS5nZXRFeGVjdXRhYmxlcygpLmVuZCgpOworCWZvciggOyBpdEV4ZWMgIT0gZW5kRXhlYyA7ICsraXRFeGVjICkKKwl7CisJCXsKKwkJCWNvbnN0IEJGICYgZm91bmRFbGVtZW50ID0KKwkJCQkJKGl0RXhlYyktPmdldEFsbERhdGEoKS5nZXRCeUFzdEVsZW1lbnQoYXN0RWxlbWVudCk7CisKKwkJCWlmKCBmb3VuZEVsZW1lbnQudmFsaWQoKSApCisJCQl7CisJCQkJcmV0dXJuKCBmb3VuZEVsZW1lbnQgKTsKKwkJCX0KKwkJfQorCQl7CisJCQljb25zdCBCRiAmIGZvdW5kRWxlbWVudCA9CisJCQkJCShpdEV4ZWMpLT5nZXRDb25zdERhdGEoKS5nZXRCeUFzdEVsZW1lbnQoYXN0RWxlbWVudCk7CisKKwkJCWlmKCBmb3VuZEVsZW1lbnQudmFsaWQoKSApCisJCQl7CisJCQkJcmV0dXJuKCBmb3VuZEVsZW1lbnQgKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiggQkY6OlJFRl9OVUxMICk7Cit9CisKKworLyoqCisgKiBTRUFSQ0gKKyAqIFN5bWJvbCBhcyBJbnN0YW5jZU9mUG9ydAorICogYnkgSUQKKyAqLworY29uc3QgU3ltYm9sICYgRXhlY3V0YWJsZVF1ZXJ5OjpnZXRQb3J0QnlOYW1lSUQoY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELAorCQlNb2RpZmllcjo6RElSRUNUSU9OX0tJTkQgaW9EaXJlY3Rpb24pIGNvbnN0Cit7CisJLy8gUkVWRVJTRSBiZWNhdXNlIG1hY2hpbmVzIGFyZSBpbnNlcnQgYWZ0ZXIgY2hpbGRyZW4KKwljb25zdF9leGVjX2l0ZXJhdG9yIGl0RXhlYyAgPSBnZXRTeXN0ZW0oKS5nZXRFeGVjdXRhYmxlcygpLmJlZ2luKCk7CisJY29uc3RfZXhlY19pdGVyYXRvciBlbmRFeGVjICA9IGdldFN5c3RlbSgpLmdldEV4ZWN1dGFibGVzKCkuZW5kKCk7CisJZm9yKCA7IGl0RXhlYyAhPSBlbmRFeGVjIDsgKytpdEV4ZWMgKQorCXsKKwkJY29uc3QgU3ltYm9sICYgZm91bmRFbGVtZW50ID0gKGl0RXhlYyktPmdldFBvcnQoKS5nZXRCeU5hbWVJRChhTmFtZUlEKTsKKworCQlpZiggZm91bmRFbGVtZW50LnZhbGlkKCkKKwkJCSYmIGZvdW5kRWxlbWVudC5nZXRNb2RpZmllcigpLmlzRGlyZWN0aW9uS2luZChpb0RpcmVjdGlvbikgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kRWxlbWVudCApOworCQl9CisJfQorCisJcmV0dXJuKCBTeW1ib2w6OlJFRl9OVUxMICk7Cit9CisKKworY29uc3QgU3ltYm9sICYgRXhlY3V0YWJsZVF1ZXJ5OjpnZXRQb3J0QnlOYW1lSUQoCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkgY29uc3QKK3sKKwkvLyBSRVZFUlNFIGJlY2F1c2UgbWFjaGluZXMgYXJlIGluc2VydCBhZnRlciBjaGlsZHJlbgorCWNvbnN0X2V4ZWNfaXRlcmF0b3IgaXRFeGVjICA9IGdldFN5c3RlbSgpLmdldEV4ZWN1dGFibGVzKCkuYmVnaW4oKTsKKwljb25zdF9leGVjX2l0ZXJhdG9yIGVuZEV4ZWMgID0gZ2V0U3lzdGVtKCkuZ2V0RXhlY3V0YWJsZXMoKS5lbmQoKTsKKwlmb3IoIDsgaXRFeGVjICE9IGVuZEV4ZWMgOyArK2l0RXhlYyApCisJeworCQljb25zdCBTeW1ib2wgJiBmb3VuZEVsZW1lbnQgPSAoaXRFeGVjKS0+Z2V0UG9ydCgpLmdldEJ5TmFtZUlEKGFOYW1lSUQpOworCisJCWlmKCBmb3VuZEVsZW1lbnQudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRFbGVtZW50ICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIFN5bWJvbDo6UkVGX05VTEwgKTsKK30KKworCisKK2F2bV9zaXplX3QgRXhlY3V0YWJsZVF1ZXJ5OjpnZXRQb3J0QnlOYW1lSUQoCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwgTGlzdE9mU3ltYm9sICYgbGlzdG9mUG9ydCwKKwkJTW9kaWZpZXI6OkRJUkVDVElPTl9LSU5EIGlvRGlyZWN0aW9uLCBib29sIGlzU3Ryb25nbHkpIGNvbnN0Cit7CisJYXZtX3NpemVfdCBjb3VudCA9IDA7CisKKwkvLyBSRVZFUlNFIGJlY2F1c2UgbWFjaGluZXMgYXJlIGluc2VydCBhZnRlciBjaGlsZHJlbgorCWNvbnN0X2V4ZWNfaXRlcmF0b3IgaXRFeGVjICA9IGdldFN5c3RlbSgpLmdldEV4ZWN1dGFibGVzKCkuYmVnaW4oKTsKKwljb25zdF9leGVjX2l0ZXJhdG9yIGVuZEV4ZWMgID0gZ2V0U3lzdGVtKCkuZ2V0RXhlY3V0YWJsZXMoKS5lbmQoKTsKKwlmb3IoIDsgaXRFeGVjICE9IGVuZEV4ZWMgOyArK2l0RXhlYyApCisJeworCQljb3VudCArPSAoaXRFeGVjKS0+Z2V0UG9ydCgpLmdldEJ5TmFtZUlEKGFOYW1lSUQsIGxpc3RvZlBvcnQpOworCX0KKworCUxpc3RPZlN5bWJvbDo6aXRlcmF0b3IgaXRQb3J0ICA9IGxpc3RvZlBvcnQuYmVnaW4oKTsKKwlMaXN0T2ZTeW1ib2w6Oml0ZXJhdG9yIGVuZFBvcnQgPSBsaXN0b2ZQb3J0LmVuZCgpOworCWZvciggOyBpdFBvcnQgIT0gZW5kUG9ydCA7ICkKKwl7CisJCWlmKCAoKml0UG9ydCkuZ2V0TW9kaWZpZXIoKS4KKwkJCQlpc25vdERpcmVjdGlvbktpbmQoaW9EaXJlY3Rpb24sIGlzU3Ryb25nbHkpICkKKwkJeworCQkJaXRQb3J0ID0gbGlzdG9mUG9ydC5lcmFzZShpdFBvcnQpOworCQl9CisJCWVsc2UKKwkJeworCQkJKytpdFBvcnQ7CisJCX0KKwl9CisKKworCXJldHVybiggY291bnQgKTsKK30KKworCithdm1fc2l6ZV90IEV4ZWN1dGFibGVRdWVyeTo6Z2V0UG9ydEJ5TmFtZUlEKAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsIExpc3RPZlN5bWJvbCAmIGxpc3RvZlBvcnQpIGNvbnN0Cit7CisJYXZtX3NpemVfdCBjb3VudCA9IDA7CisKKwkvLyBSRVZFUlNFIGJlY2F1c2UgbWFjaGluZXMgYXJlIGluc2VydCBhZnRlciBjaGlsZHJlbgorCWNvbnN0X2V4ZWNfaXRlcmF0b3IgaXRFeGVjICA9IGdldFN5c3RlbSgpLmdldEV4ZWN1dGFibGVzKCkuYmVnaW4oKTsKKwljb25zdF9leGVjX2l0ZXJhdG9yIGVuZEV4ZWMgID0gZ2V0U3lzdGVtKCkuZ2V0RXhlY3V0YWJsZXMoKS5lbmQoKTsKKwlmb3IoIDsgaXRFeGVjICE9IGVuZEV4ZWMgOyArK2l0RXhlYyApCisJeworCQljb3VudCArPSAoaXRFeGVjKS0+Z2V0UG9ydCgpLmdldEJ5TmFtZUlEKGFOYW1lSUQsIGxpc3RvZlBvcnQpOworCX0KKworCXJldHVybiggY291bnQgKTsKK30KKworCisvKioKKyAqIFNFQVJDSAorICogU3ltYm9sIGFzIEluc3RhbmNlT2ZQb3J0CisgKiBieSBbIFsgRlVMTFkgXSBRVUFMSUZJRUQgXSBOQU1FIElECisgKi8KK2NvbnN0IFN5bWJvbCAmIEV4ZWN1dGFibGVRdWVyeTo6Z2V0UG9ydEJ5UXVhbGlmaWVkTmFtZUlEKAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQsCisJCU1vZGlmaWVyOjpESVJFQ1RJT05fS0lORCBpb0RpcmVjdGlvbiwgYm9vbCBpc1N0cm9uZ2x5KSBjb25zdAoreworCS8vIFJFVkVSU0UgYmVjYXVzZSBtYWNoaW5lcyBhcmUgaW5zZXJ0IGFmdGVyIGNoaWxkcmVuCisJY29uc3RfZXhlY19pdGVyYXRvciBpdEV4ZWMgID0gZ2V0U3lzdGVtKCkuZ2V0RXhlY3V0YWJsZXMoKS5iZWdpbigpOworCWNvbnN0X2V4ZWNfaXRlcmF0b3IgZW5kRXhlYyAgPSBnZXRTeXN0ZW0oKS5nZXRFeGVjdXRhYmxlcygpLmVuZCgpOworCWZvciggOyBpdEV4ZWMgIT0gZW5kRXhlYyA7ICsraXRFeGVjICkKKwl7CisJCWNvbnN0IFN5bWJvbCAmIGZvdW5kRWxlbWVudCA9CisJCQkJKGl0RXhlYyktPmdldFBvcnQoKS5nZXRCeVF1YWxpZmllZE5hbWVJRChhUXVhbGlmaWVkTmFtZUlEKTsKKworCQlpZiggZm91bmRFbGVtZW50LnZhbGlkKCkKKwkJCSYmIGZvdW5kRWxlbWVudC5nZXRNb2RpZmllcigpLgorCQkJCQlpc0RpcmVjdGlvbktpbmQoaW9EaXJlY3Rpb24sIGlzU3Ryb25nbHkpICkKKwkJeworCQkJcmV0dXJuKCBmb3VuZEVsZW1lbnQgKTsKKwkJfQorCX0KKworCXJldHVybiggU3ltYm9sOjpSRUZfTlVMTCApOworfQorCisKK2F2bV9zaXplX3QgRXhlY3V0YWJsZVF1ZXJ5OjpnZXRQb3J0QnlRdWFsaWZpZWROYW1lSUQoCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCwgTGlzdE9mU3ltYm9sICYgbGlzdG9mUG9ydCwKKwkJTW9kaWZpZXI6OkRJUkVDVElPTl9LSU5EIGlvRGlyZWN0aW9uLCBib29sIGlzU3Ryb25nbHkpIGNvbnN0Cit7CisJYXZtX3NpemVfdCBjb3VudCA9IDA7CisKKwkvLyBSRVZFUlNFIGJlY2F1c2UgbWFjaGluZXMgYXJlIGluc2VydCBhZnRlciBjaGlsZHJlbgorCWNvbnN0X2V4ZWNfaXRlcmF0b3IgaXRFeGVjICA9IGdldFN5c3RlbSgpLmdldEV4ZWN1dGFibGVzKCkuYmVnaW4oKTsKKwljb25zdF9leGVjX2l0ZXJhdG9yIGVuZEV4ZWMgID0gZ2V0U3lzdGVtKCkuZ2V0RXhlY3V0YWJsZXMoKS5lbmQoKTsKKwlmb3IoIDsgaXRFeGVjICE9IGVuZEV4ZWMgOyArK2l0RXhlYyApCisJeworCQljb3VudCArPSAoaXRFeGVjKS0+Z2V0UG9ydCgpLgorCQkJCWdldEJ5UXVhbGlmaWVkTmFtZUlEKGFRdWFsaWZpZWROYW1lSUQsIGxpc3RvZlBvcnQpOworCX0KKworCUxpc3RPZlN5bWJvbDo6aXRlcmF0b3IgaXRQb3J0ICA9IGxpc3RvZlBvcnQuYmVnaW4oKTsKKwlMaXN0T2ZTeW1ib2w6Oml0ZXJhdG9yIGVuZFBvcnQgPSBsaXN0b2ZQb3J0LmVuZCgpOworCWZvciggOyBpdFBvcnQgIT0gZW5kUG9ydCA7ICkKKwl7CisJCWlmKCAoKml0UG9ydCkuZ2V0TW9kaWZpZXIoKS5pc25vdERpcmVjdGlvbktpbmQoaW9EaXJlY3Rpb24sIGlzU3Ryb25nbHkpICkKKwkJeworCQkJaXRQb3J0ID0gbGlzdG9mUG9ydC5lcmFzZShpdFBvcnQpOworCQl9CisJCWVsc2UKKwkJeworCQkJKytpdFBvcnQ7CisJCX0KKwl9CisKKworCXJldHVybiggY291bnQgKTsKK30KKworCithdm1fc2l6ZV90IEV4ZWN1dGFibGVRdWVyeTo6Z2V0UG9ydEJ5UXVhbGlmaWVkTmFtZUlEKAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQsIExpc3RPZlN5bWJvbCAmIGxpc3RvZlBvcnQpIGNvbnN0Cit7CisJYXZtX3NpemVfdCBjb3VudCA9IDA7CisKKwkvLyBSRVZFUlNFIGJlY2F1c2UgbWFjaGluZXMgYXJlIGluc2VydCBhZnRlciBjaGlsZHJlbgorCWNvbnN0X2V4ZWNfaXRlcmF0b3IgaXRFeGVjICA9IGdldFN5c3RlbSgpLmdldEV4ZWN1dGFibGVzKCkuYmVnaW4oKTsKKwljb25zdF9leGVjX2l0ZXJhdG9yIGVuZEV4ZWMgID0gZ2V0U3lzdGVtKCkuZ2V0RXhlY3V0YWJsZXMoKS5lbmQoKTsKKwlmb3IoIDsgaXRFeGVjICE9IGVuZEV4ZWMgOyArK2l0RXhlYyApCisJeworCQljb3VudCArPSAoaXRFeGVjKS0+Z2V0UG9ydCgpLgorCQkJCWdldEJ5UXVhbGlmaWVkTmFtZUlEKGFRdWFsaWZpZWROYW1lSUQsIGxpc3RvZlBvcnQpOworCX0KKworCXJldHVybiggY291bnQgKTsKK30KKworCitjb25zdCBTeW1ib2wgJiBFeGVjdXRhYmxlUXVlcnk6OmdldFBvcnQoCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEKSBjb25zdAoreworCS8vIFJFVkVSU0UgYmVjYXVzZSBtYWNoaW5lcyBhcmUgaW5zZXJ0IGFmdGVyIGNoaWxkcmVuCisJY29uc3RfZXhlY19pdGVyYXRvciBpdEV4ZWMgID0gZ2V0U3lzdGVtKCkuZ2V0RXhlY3V0YWJsZXMoKS5iZWdpbigpOworCWNvbnN0X2V4ZWNfaXRlcmF0b3IgZW5kRXhlYyAgPSBnZXRTeXN0ZW0oKS5nZXRFeGVjdXRhYmxlcygpLmVuZCgpOworCWZvciggOyBpdEV4ZWMgIT0gZW5kRXhlYyA7ICsraXRFeGVjICkKKwl7CisJCWNvbnN0IFN5bWJvbCAmIGZvdW5kRWxlbWVudCA9CisJCQkJKGl0RXhlYyktPmdldFBvcnQoKS5nZXRCeUZRTmFtZUlEKCBhRnVsbHlRdWFsaWZpZWROYW1lSUQgKTsKKworCQlpZiggZm91bmRFbGVtZW50LnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kRWxlbWVudCApOworCQl9CisJfQorCisJcmV0dXJuKCBTeW1ib2w6OlJFRl9OVUxMICk7Cit9CisKK2NvbnN0IFN5bWJvbCAmIEV4ZWN1dGFibGVRdWVyeTo6Z2V0U2VtUG9ydChjb25zdCBFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZSwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQpCit7CisJZm9yKCA7IGFuRXhlY3V0YWJsZSAhPSBOVUxMIDsKKwkJCWFuRXhlY3V0YWJsZSA9IGFuRXhlY3V0YWJsZS0+Z2V0RXhlY3V0YWJsZUNvbnRhaW5lcigpICkKKwl7CisJCWNvbnN0IFN5bWJvbCAmIGZvdW5kRWxlbWVudCA9CisJCQkJYW5FeGVjdXRhYmxlLT5nZXRQb3J0KCkuZ2V0QnlGUU5hbWVJRCggYUZ1bGx5UXVhbGlmaWVkTmFtZUlEICk7CisJCWlmKCBmb3VuZEVsZW1lbnQudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiBmb3VuZEVsZW1lbnQ7CisJCX0KKwl9CisKKwlyZXR1cm4oIFN5bWJvbDo6UkVGX05VTEwgKTsKK30KKworCitjb25zdCBTeW1ib2wgJiBFeGVjdXRhYmxlUXVlcnk6OmdldFBvcnRCeUFzdEVsZW1lbnQoCisJCWNvbnN0IE9iamVjdEVsZW1lbnQgKiBhc3RFbGVtZW50KSBjb25zdAoreworCS8vIFJFVkVSU0UgYmVjYXVzZSBtYWNoaW5lcyBhcmUgaW5zZXJ0IGFmdGVyIGNoaWxkcmVuCisJY29uc3RfZXhlY19pdGVyYXRvciBpdEV4ZWMgID0gZ2V0U3lzdGVtKCkuZ2V0RXhlY3V0YWJsZXMoKS5iZWdpbigpOworCWNvbnN0X2V4ZWNfaXRlcmF0b3IgZW5kRXhlYyAgPSBnZXRTeXN0ZW0oKS5nZXRFeGVjdXRhYmxlcygpLmVuZCgpOworCWZvciggOyBpdEV4ZWMgIT0gZW5kRXhlYyA7ICsraXRFeGVjICkKKwl7CisJCWNvbnN0IFN5bWJvbCAmIGZvdW5kRWxlbWVudCA9CisJCQkJKGl0RXhlYyktPmdldFBvcnQoKS5nZXRCeUFzdEVsZW1lbnQoYXN0RWxlbWVudCk7CisKKwkJaWYoIGZvdW5kRWxlbWVudC52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCBmb3VuZEVsZW1lbnQgKTsKKwkJfQorCX0KKworCXJldHVybiggU3ltYm9sOjpSRUZfTlVMTCApOworfQorCisKK2NvbnN0IFN5bWJvbCAmIEV4ZWN1dGFibGVRdWVyeTo6Z2V0U2VtUG9ydEJ5QXN0RWxlbWVudCgKKwkJY29uc3QgRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGUsIGNvbnN0IE9iamVjdEVsZW1lbnQgKiBhc3RFbGVtZW50KQoreworCWZvciggOyBhbkV4ZWN1dGFibGUgIT0gTlVMTCA7CisJCQlhbkV4ZWN1dGFibGUgPSBhbkV4ZWN1dGFibGUtPmdldEV4ZWN1dGFibGVDb250YWluZXIoKSApCisJeworCQljb25zdCBTeW1ib2wgJiBmb3VuZEVsZW1lbnQgPQorCQkJCWFuRXhlY3V0YWJsZS0+Z2V0UG9ydCgpLmdldEJ5QXN0RWxlbWVudCggYXN0RWxlbWVudCApOworCQlpZiggZm91bmRFbGVtZW50LnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4gZm91bmRFbGVtZW50OworCQl9CisJfQorCisJcmV0dXJuKCBTeW1ib2w6OlJFRl9OVUxMICk7Cit9CisKKworLyoqCisgKiBTRUFSQ0gKKyAqIEluc3RhbmNlT2ZDaGFubmVsCisgKi8KK2NvbnN0IFN5bWJvbCAmIEV4ZWN1dGFibGVRdWVyeTo6Z2V0Q2hhbm5lbCgKKwkJY29uc3QgT2JqZWN0RWxlbWVudCAqIGFzdEVsZW1lbnQpIGNvbnN0Cit7CisJLy8gUkVWRVJTRSBiZWNhdXNlIG1hY2hpbmVzIGFyZSBpbnNlcnQgYWZ0ZXIgY2hpbGRyZW4KKwljb25zdF9leGVjX2l0ZXJhdG9yIGl0RXhlYyAgPSBnZXRTeXN0ZW0oKS5nZXRFeGVjdXRhYmxlcygpLmJlZ2luKCk7CisJY29uc3RfZXhlY19pdGVyYXRvciBlbmRFeGVjICA9IGdldFN5c3RlbSgpLmdldEV4ZWN1dGFibGVzKCkuZW5kKCk7CisJZm9yKCA7IGl0RXhlYyAhPSBlbmRFeGVjIDsgKytpdEV4ZWMgKQorCXsKKwkJY29uc3QgU3ltYm9sICYgZm91bmRFbGVtZW50ID0KKwkJCQkoaXRFeGVjKS0+Z2V0Q2hhbm5lbCgpLmdldEJ5QXN0RWxlbWVudChhc3RFbGVtZW50KTsKKworCQlpZiggZm91bmRFbGVtZW50LnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kRWxlbWVudCApOworCQl9CisJfQorCisJcmV0dXJuKCBTeW1ib2w6OlJFRl9OVUxMICk7Cit9CisKKworLyoqCisgKiBTRUFSQ0gKKyAqIEluc3RhbmNlT2ZNYWNoaW5lCisgKi8KK2NvbnN0IFN5bWJvbCAmIEV4ZWN1dGFibGVRdWVyeTo6Z2V0TWFjaGluZSgKKwkJU3BlY2lmaWVyOjpERVNJR05fS0lORCBhRGVzaWduLAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCkgY29uc3QKK3sKKwkvLyBTVFJJQ1Q6PiBjb21wYXJlIExPQ0FUT1IgJiBMT0NBVElPTiBbdHJ1ZTotIHJldHJ5IG9ubHkgb25seSBMT0NBVElPTl0KKwlpZiggZ2V0U3lzdGVtKCkuZnFuRXF1YWxzKCBhRnVsbHlRdWFsaWZpZWROYW1lSUQgLCB0cnVlICkgKQorCXsKKwkJcmV0dXJuKCBnZXRTeXN0ZW0oKS5nZXRTeXN0ZW1JbnN0YW5jZSgpICk7CisJfQorCisJLy8gUkVWRVJTRSBiZWNhdXNlIG1hY2hpbmVzIGFyZSBpbnNlcnQgYWZ0ZXIgY2hpbGRyZW4KKwljb25zdF9leGVjX2l0ZXJhdG9yIGl0RXhlYyAgPSBnZXRTeXN0ZW0oKS5nZXRFeGVjdXRhYmxlcygpLmJlZ2luKCk7CisJY29uc3RfZXhlY19pdGVyYXRvciBlbmRFeGVjICA9IGdldFN5c3RlbSgpLmdldEV4ZWN1dGFibGVzKCkuZW5kKCk7CisJZm9yKCA7IGl0RXhlYyAhPSBlbmRFeGVjIDsgKytpdEV4ZWMgKQorCXsKKwkJY29uc3QgU3ltYm9sICYgZm91bmRFbGVtZW50ID0gKGl0RXhlYyktPmdldEluc3RhbmNlQnlEZXNpZ24oCisJCQkJYURlc2lnbiApLmdldEJ5RlFOYW1lSUQoIGFGdWxseVF1YWxpZmllZE5hbWVJRCApOworCisJCWlmKCBmb3VuZEVsZW1lbnQudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRFbGVtZW50ICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIFN5bWJvbDo6UkVGX05VTEwgKTsKK30KKworY29uc3QgU3ltYm9sICYgRXhlY3V0YWJsZVF1ZXJ5OjpnZXRNYWNoaW5lQnlOYW1lSUQoCisJCVNwZWNpZmllcjo6REVTSUdOX0tJTkQgYURlc2lnbiwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtbGVJRCkgY29uc3QKK3sKKwkvLyBSRVZFUlNFIGJlY2F1c2UgbWFjaGluZXMgYXJlIGluc2VydCBhZnRlciBjaGlsZHJlbgorCWNvbnN0X2V4ZWNfaXRlcmF0b3IgaXRFeGVjICA9IGdldFN5c3RlbSgpLmdldEV4ZWN1dGFibGVzKCkuYmVnaW4oKTsKKwljb25zdF9leGVjX2l0ZXJhdG9yIGVuZEV4ZWMgID0gZ2V0U3lzdGVtKCkuZ2V0RXhlY3V0YWJsZXMoKS5lbmQoKTsKKwlmb3IoIDsgaXRFeGVjICE9IGVuZEV4ZWMgOyArK2l0RXhlYyApCisJeworCQljb25zdCBTeW1ib2wgJiBmb3VuZEVsZW1lbnQgPQorCQkJCShpdEV4ZWMpLT5nZXRJbnN0YW5jZUJ5RGVzaWduKGFEZXNpZ24pLmdldEJ5TmFtZUlEKGFOYW1sZUlEKTsKKworCQlpZiggZm91bmRFbGVtZW50LnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kRWxlbWVudCApOworCQl9CisJfQorCisJcmV0dXJuKCBTeW1ib2w6OlJFRl9OVUxMICk7Cit9CisKK2NvbnN0IFN5bWJvbCAmIEV4ZWN1dGFibGVRdWVyeTo6Z2V0TWFjaGluZUJ5UXVhbGlmaWVkTmFtZUlEKAorCQlTcGVjaWZpZXI6OkRFU0lHTl9LSU5EIGFEZXNpZ24sCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkgY29uc3QKK3sKKwkvLyBSRVZFUlNFIGJlY2F1c2UgbWFjaGluZXMgYXJlIGluc2VydCBhZnRlciBjaGlsZHJlbgorCWNvbnN0X2V4ZWNfaXRlcmF0b3IgaXRFeGVjICA9IGdldFN5c3RlbSgpLmdldEV4ZWN1dGFibGVzKCkuYmVnaW4oKTsKKwljb25zdF9leGVjX2l0ZXJhdG9yIGVuZEV4ZWMgID0gZ2V0U3lzdGVtKCkuZ2V0RXhlY3V0YWJsZXMoKS5lbmQoKTsKKwlmb3IoIDsgaXRFeGVjICE9IGVuZEV4ZWMgOyArK2l0RXhlYyApCisJeworCQljb25zdCBTeW1ib2wgJiBmb3VuZEVsZW1lbnQgPSAoaXRFeGVjKS0+Z2V0SW5zdGFuY2VCeURlc2lnbihhRGVzaWduKS4KKwkJCQlnZXRCeVF1YWxpZmllZE5hbWVJRChhUXVhbGlmaWVkTmFtZUlEKTsKKworCQlpZiggZm91bmRFbGVtZW50LnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kRWxlbWVudCApOworCQl9CisJfQorCisJcmV0dXJuKCBTeW1ib2w6OlJFRl9OVUxMICk7Cit9CisKKworSW5zdGFuY2VPZk1hY2hpbmUgKiBFeGVjdXRhYmxlUXVlcnk6OnJhd01hY2hpbmVCeU5hbWVJRCgKKwkJU3BlY2lmaWVyOjpERVNJR05fS0lORCBhRGVzaWduLCBjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpIGNvbnN0Cit7CisJLy8gUkVWRVJTRSBiZWNhdXNlIG1hY2hpbmVzIGFyZSBpbnNlcnQgYWZ0ZXIgY2hpbGRyZW4KKwljb25zdF9leGVjX2l0ZXJhdG9yIGl0RXhlYyAgPSBnZXRTeXN0ZW0oKS5nZXRFeGVjdXRhYmxlcygpLmJlZ2luKCk7CisJY29uc3RfZXhlY19pdGVyYXRvciBlbmRFeGVjICA9IGdldFN5c3RlbSgpLmdldEV4ZWN1dGFibGVzKCkuZW5kKCk7CisJZm9yKCA7IGl0RXhlYyAhPSBlbmRFeGVjIDsgKytpdEV4ZWMgKQorCXsKKwkJSW5zdGFuY2VPZk1hY2hpbmUgKiBmb3VuZEVsZW1lbnQgPQorCQkJCShpdEV4ZWMpLT5nZXRJbnN0YW5jZUJ5RGVzaWduKAorCQkJCQkJYURlc2lnbiApLmdldEJ5TmFtZUlEKGFOYW1lSUQpLnJhd01hY2hpbmUoKTsKKworCQlpZiggZm91bmRFbGVtZW50ICE9IE5VTEwgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kRWxlbWVudCApOworCQl9CisJfQorCisJcmV0dXJuKCBOVUxMICk7Cit9CisKK0luc3RhbmNlT2ZNYWNoaW5lICogRXhlY3V0YWJsZVF1ZXJ5OjpyYXdNYWNoaW5lQnlRdWFsaWZpZWROYW1lSUQoCisJCVNwZWNpZmllcjo6REVTSUdOX0tJTkQgYURlc2lnbiwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKSBjb25zdAoreworCS8vIFJFVkVSU0UgYmVjYXVzZSBtYWNoaW5lcyBhcmUgaW5zZXJ0IGFmdGVyIGNoaWxkcmVuCisJY29uc3RfZXhlY19pdGVyYXRvciBpdEV4ZWMgID0gZ2V0U3lzdGVtKCkuZ2V0RXhlY3V0YWJsZXMoKS5iZWdpbigpOworCWNvbnN0X2V4ZWNfaXRlcmF0b3IgZW5kRXhlYyAgPSBnZXRTeXN0ZW0oKS5nZXRFeGVjdXRhYmxlcygpLmVuZCgpOworCWZvciggOyBpdEV4ZWMgIT0gZW5kRXhlYyA7ICsraXRFeGVjICkKKwl7CisJCUluc3RhbmNlT2ZNYWNoaW5lICogZm91bmRFbGVtZW50ID0gKGl0RXhlYyktPmdldEluc3RhbmNlQnlEZXNpZ24oCisJCQkJYURlc2lnbiApLmdldEJ5UXVhbGlmaWVkTmFtZUlEKGFRdWFsaWZpZWROYW1lSUQpLnJhd01hY2hpbmUoKTsKKworCQlpZiggZm91bmRFbGVtZW50ICE9IE5VTEwgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kRWxlbWVudCApOworCQl9CisJfQorCisJcmV0dXJuKCBOVUxMICk7Cit9CisKKworY29uc3QgU3ltYm9sICYgRXhlY3V0YWJsZVF1ZXJ5OjpnZXRNYWNoaW5lQnlBc3RFbGVtZW50KAorCQlTcGVjaWZpZXI6OkRFU0lHTl9LSU5EIGFEZXNpZ24sIGNvbnN0IE9iamVjdEVsZW1lbnQgKiBhc3RFbGVtZW50KSBjb25zdAoreworCWlmKCBnZXRTeXN0ZW0oKS5yYXdTeXN0ZW1JbnN0YW5jZSgpLT5pc0FzdEVsZW1lbnQoIGFzdEVsZW1lbnQgKSApCisJeworCQlyZXR1cm4oIGdldFN5c3RlbSgpLmdldFN5c3RlbUluc3RhbmNlKCkgKTsKKwl9CisKKwkvLyBSRVZFUlNFIGJlY2F1c2UgbWFjaGluZXMgYXJlIGluc2VydCBhZnRlciBjaGlsZHJlbgorCWNvbnN0X2V4ZWNfaXRlcmF0b3IgaXRFeGVjICA9IGdldFN5c3RlbSgpLmdldEV4ZWN1dGFibGVzKCkuYmVnaW4oKTsKKwljb25zdF9leGVjX2l0ZXJhdG9yIGVuZEV4ZWMgID0gZ2V0U3lzdGVtKCkuZ2V0RXhlY3V0YWJsZXMoKS5lbmQoKTsKKwlmb3IoIDsgaXRFeGVjICE9IGVuZEV4ZWMgOyArK2l0RXhlYyApCisJeworCQljb25zdCBTeW1ib2wgJiBmb3VuZEVsZW1lbnQgPQorCQkJKGl0RXhlYyktPmdldEluc3RhbmNlQnlEZXNpZ24oYURlc2lnbikuZ2V0QnlBc3RFbGVtZW50KGFzdEVsZW1lbnQpOworCisJCWlmKCBmb3VuZEVsZW1lbnQudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRFbGVtZW50ICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIFN5bWJvbDo6UkVGX05VTEwgKTsKK30KKworCisvKioKKyAqIFNFQVJDSAorICogTWFjaGluZQorICovCitjb25zdCBCRiAmIEV4ZWN1dGFibGVRdWVyeTo6c2VhcmNoTWFjaGluZSgKKwkJU3BlY2lmaWVyOjpERVNJR05fS0lORCBhRGVzaWduLCBjb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQgKQoreworCXN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgcG9zID0gYVF1YWxpZmllZE5hbWVJRC5maW5kKCItPiIpOworCisJaWYoIHBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisJeworCQlzdGQ6OnN0cmluZyBtaWQgPSBhUXVhbGlmaWVkTmFtZUlELnN1YnN0cigwLCBwb3MpOworCQlzdGQ6OnN0cmluZyBvYmogPSBhUXVhbGlmaWVkTmFtZUlELnN1YnN0cihwb3MgKyAyKTsKKworCQlJbnN0YW5jZU9mTWFjaGluZSAqIG1haW5NYWNoaW5lID0gTlVMTDsKKworCQlpZiggbWlkLmZpbmQoJy4nKSA9PSBzdGQ6OnN0cmluZzo6bnBvcyApCisJCXsKKwkJCW1haW5NYWNoaW5lID0gcmF3TWFjaGluZUJ5TmFtZUlEKGFEZXNpZ24sIG1pZCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQltYWluTWFjaGluZSA9IHJhd01hY2hpbmVCeVF1YWxpZmllZE5hbWVJRChhRGVzaWduLCBtaWQpOworCQl9CisKKwkJaWYoIG1haW5NYWNoaW5lICE9IE5VTEwgKQorCQl7CisJCQlpZiggb2JqICE9ICJbKl0iICkKKwkJCXsKKwkJCQljb25zdCBCRiAmIG1hY2hpbmUgPSBtYWluTWFjaGluZS0+Z2V0RXhlY3V0YWJsZSgpLT4KKwkJCQkJCWdldEluc3RhbmNlQnlEZXNpZ24oIGFEZXNpZ24gKS5nZXRCeU5hbWVJRCggb2JqICk7CisJCQkJaWYoIG1hY2hpbmUudmFsaWQoKSApCisJCQkJeworCQkJCQlyZXR1cm4oIG1hY2hpbmUgKTsKKwkJCQl9CisKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWNvbnN0IEJGICYgbWFjaGluZSA9CisJCQkJCWdldE1hY2hpbmVCeVF1YWxpZmllZE5hbWVJRChhRGVzaWduLCBtaWQgKyAiLiIgKyBvYmopOworCQkJaWYoIG1hY2hpbmUudmFsaWQoKSApCisJCQl7CisJCQkJcmV0dXJuKCBtYWNoaW5lICk7CisJCQl9CisJCX0KKwl9CisJZWxzZQorCXsKKwkJaWYoIGFRdWFsaWZpZWROYW1lSUQuZmluZCgnLicpID09IHN0ZDo6c3RyaW5nOjpucG9zICkKKwkJeworCQkJY29uc3QgQkYgJiBtYWNoaW5lID0gZ2V0TWFjaGluZUJ5TmFtZUlEKGFEZXNpZ24sIGFRdWFsaWZpZWROYW1lSUQpOworCQkJaWYoIG1hY2hpbmUudmFsaWQoKSApCisJCQl7CisJCQkJcmV0dXJuKCBtYWNoaW5lICk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQljb25zdCBCRiAmIG1hY2hpbmUgPQorCQkJCQlnZXRNYWNoaW5lQnlRdWFsaWZpZWROYW1lSUQoYURlc2lnbiwgYVF1YWxpZmllZE5hbWVJRCk7CisJCQlpZiggbWFjaGluZS52YWxpZCgpICkKKwkJCXsKKwkJCQlyZXR1cm4oIG1hY2hpbmUgKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiggQkY6OlJFRl9OVUxMICk7Cit9CisKKworLyoqCisgKiBTRUFSQ0gKKyAqIGZvciBNYWNoaW5lIEluc3RhbmNlIE1vZGVsCisgKi8KK2NvbnN0IFN5bWJvbCAmIEV4ZWN1dGFibGVRdWVyeTo6Z2V0SW5zdGFuY2VNb2RlbCgKKwkJY29uc3QgT2JqZWN0RWxlbWVudCAqIGFzdEVsZW1lbnQpIGNvbnN0Cit7CisJLy8gUkVWRVJTRSBiZWNhdXNlIG1hY2hpbmVzIGFyZSBpbnNlcnQgYWZ0ZXIgY2hpbGRyZW4KKwljb25zdF9leGVjX2l0ZXJhdG9yIGl0RXhlYyAgPSBnZXRTeXN0ZW0oKS5nZXRFeGVjdXRhYmxlcygpLmJlZ2luKCk7CisJY29uc3RfZXhlY19pdGVyYXRvciBlbmRFeGVjICA9IGdldFN5c3RlbSgpLmdldEV4ZWN1dGFibGVzKCkuZW5kKCk7CisJZm9yKCA7IGl0RXhlYyAhPSBlbmRFeGVjIDsgKytpdEV4ZWMgKQorCXsKKwkJY29uc3QgU3ltYm9sICYgZm91bmRFbGVtZW50ID0KKwkJCQkoaXRFeGVjKS0+Z2V0QnlBc3RJbnN0YW5jZU1vZGVsKCBhc3RFbGVtZW50ICk7CisKKwkJaWYoIGZvdW5kRWxlbWVudC52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCBmb3VuZEVsZW1lbnQgKTsKKwkJfQorCX0KKworCXJldHVybiggU3ltYm9sOjpSRUZfTlVMTCApOworfQorCitjb25zdCBTeW1ib2wgJiBFeGVjdXRhYmxlUXVlcnk6OmdldFNlbUluc3RhbmNlTW9kZWwoCisJCWNvbnN0IEV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlLAorCQljb25zdCBPYmplY3RFbGVtZW50ICogYXN0RWxlbWVudCkgY29uc3QKK3sKKwlmb3IoIDsgYW5FeGVjdXRhYmxlICE9IE5VTEwgOworCQkJYW5FeGVjdXRhYmxlID0gYW5FeGVjdXRhYmxlLT5nZXRFeGVjdXRhYmxlQ29udGFpbmVyKCkgKQorCXsKKwkJY29uc3QgU3ltYm9sICYgZm91bmRJbnN0YW5jZSA9CisJCQkJYW5FeGVjdXRhYmxlLT5nZXRCeUFzdEluc3RhbmNlTW9kZWwoIGFzdEVsZW1lbnQgKTsKKwkJaWYoIGZvdW5kSW5zdGFuY2UudmFsaWQoKSAmJiBmb3VuZEluc3RhbmNlLm1hY2hpbmUoKS5pc25vdFRoaXMoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRJbnN0YW5jZSApOworCQl9CisJfQorCisJcmV0dXJuKCBnZXRJbnN0YW5jZU1vZGVsKCBhc3RFbGVtZW50ICkgKTsKK30KKworCisvKioKKyAqIFNFQVJDSAorICogZm9yIE1hY2hpbmUgSW5zdGFuY2UgU3RhdGljCisgKi8KK2NvbnN0IFN5bWJvbCAmIEV4ZWN1dGFibGVRdWVyeTo6Z2V0SW5zdGFuY2VTdGF0aWMoCisJCWNvbnN0IE9iamVjdEVsZW1lbnQgKiBhc3RFbGVtZW50KSBjb25zdAoreworCS8vIFJFVkVSU0UgYmVjYXVzZSBtYWNoaW5lcyBhcmUgaW5zZXJ0IGFmdGVyIGNoaWxkcmVuCisJY29uc3RfZXhlY19pdGVyYXRvciBpdEV4ZWMgID0gZ2V0U3lzdGVtKCkuZ2V0RXhlY3V0YWJsZXMoKS5iZWdpbigpOworCWNvbnN0X2V4ZWNfaXRlcmF0b3IgZW5kRXhlYyAgPSBnZXRTeXN0ZW0oKS5nZXRFeGVjdXRhYmxlcygpLmVuZCgpOworCWZvciggOyBpdEV4ZWMgIT0gZW5kRXhlYyA7ICsraXRFeGVjICkKKwl7CisJCWNvbnN0IFN5bWJvbCAmIGZvdW5kRWxlbWVudCA9CisJCQkJKGl0RXhlYyktPmdldEJ5QXN0SW5zdGFuY2VTdGF0aWMoIGFzdEVsZW1lbnQgKTsKKworCQlpZiggZm91bmRFbGVtZW50LnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kRWxlbWVudCApOworCQl9CisJfQorCisJcmV0dXJuKCBTeW1ib2w6OlJFRl9OVUxMICk7Cit9CisKK2NvbnN0IFN5bWJvbCAmIEV4ZWN1dGFibGVRdWVyeTo6Z2V0U2VtSW5zdGFuY2VTdGF0aWMoCisJCWNvbnN0IEV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlLAorCQljb25zdCBPYmplY3RFbGVtZW50ICogYXN0RWxlbWVudCkgY29uc3QKK3sKKwlmb3IoIDsgYW5FeGVjdXRhYmxlICE9IE5VTEwgOworCQkJYW5FeGVjdXRhYmxlID0gYW5FeGVjdXRhYmxlLT5nZXRFeGVjdXRhYmxlQ29udGFpbmVyKCkgKQorCXsKKwkJY29uc3QgU3ltYm9sICYgZm91bmRJbnN0YW5jZSA9CisJCQkJYW5FeGVjdXRhYmxlLT5nZXRCeUFzdEluc3RhbmNlU3RhdGljKCBhc3RFbGVtZW50ICk7CisJCWlmKCBmb3VuZEluc3RhbmNlLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kSW5zdGFuY2UgKTsKKwkJfQorCX0KKworCXJldHVybiggZ2V0SW5zdGFuY2VTdGF0aWMoIGFzdEVsZW1lbnQgKSApOworfQorCisKKy8qKgorICogU0VBUkNICisgKiBmb3IgTWFjaGluZSBJbnN0YW5jZSBEeW5hbWljCisgKi8KK2NvbnN0IFN5bWJvbCAmIEV4ZWN1dGFibGVRdWVyeTo6Z2V0SW5zdGFuY2VEeW5hbWljKAorCQljb25zdCBPYmplY3RFbGVtZW50ICogYXN0RWxlbWVudCkgY29uc3QKK3sKKwkvLyBSRVZFUlNFIGJlY2F1c2UgbWFjaGluZXMgYXJlIGluc2VydCBhZnRlciBjaGlsZHJlbgorCWNvbnN0X2V4ZWNfaXRlcmF0b3IgaXRFeGVjICA9IGdldFN5c3RlbSgpLmdldEV4ZWN1dGFibGVzKCkuYmVnaW4oKTsKKwljb25zdF9leGVjX2l0ZXJhdG9yIGVuZEV4ZWMgID0gZ2V0U3lzdGVtKCkuZ2V0RXhlY3V0YWJsZXMoKS5lbmQoKTsKKwlmb3IoIDsgaXRFeGVjICE9IGVuZEV4ZWMgOyArK2l0RXhlYyApCisJeworCQljb25zdCBTeW1ib2wgJiBmb3VuZEVsZW1lbnQgPQorCQkJCShpdEV4ZWMpLT5nZXRCeUFzdEluc3RhbmNlRHluYW1pYyggYXN0RWxlbWVudCApOworCisJCWlmKCBmb3VuZEVsZW1lbnQudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRFbGVtZW50ICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIFN5bWJvbDo6UkVGX05VTEwgKTsKK30KKworY29uc3QgU3ltYm9sICYgRXhlY3V0YWJsZVF1ZXJ5OjpnZXRTZW1JbnN0YW5jZUR5bmFtaWMoCisJCWNvbnN0IEV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlLAorCQljb25zdCBPYmplY3RFbGVtZW50ICogYXN0RWxlbWVudCkgY29uc3QKK3sKKwlmb3IoIDsgYW5FeGVjdXRhYmxlICE9IE5VTEwgOyBhbkV4ZWN1dGFibGUgPSBhbkV4ZWN1dGFibGUtPmdldEV4ZWN1dGFibGVDb250YWluZXIoKSApCisJeworCQljb25zdCBTeW1ib2wgJiBmb3VuZEluc3RhbmNlID0KKwkJCQlhbkV4ZWN1dGFibGUtPmdldEJ5QXN0SW5zdGFuY2VEeW5hbWljKCBhc3RFbGVtZW50ICk7CisJCWlmKCBmb3VuZEluc3RhbmNlLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kSW5zdGFuY2UgKTsKKwkJfQorCX0KKworCXJldHVybiggZ2V0SW5zdGFuY2VEeW5hbWljKCBhc3RFbGVtZW50ICkgKTsKK30KKworCisvKioKKyAqIFNFQVJDSAorICogYW55IEluc3RhbmNlCisgKi8KK2NvbnN0IEJGICYgRXhlY3V0YWJsZVF1ZXJ5OjpnZXRJbnN0YW5jZUJ5QXN0RWxlbWVudCgKKwkJY29uc3QgT2JqZWN0RWxlbWVudCAqIGFzdEVsZW1lbnQpIGNvbnN0Cit7CisJaWYoIGdldFN5c3RlbSgpLnJhd1N5c3RlbUluc3RhbmNlKCktPmlzQXN0RWxlbWVudCggYXN0RWxlbWVudCApICkKKwl7CisJCXJldHVybiggZ2V0U3lzdGVtKCkuZ2V0U3lzdGVtSW5zdGFuY2UoKSApOworCX0KKworCXsKKwkJY29uc3QgQkYgJiBmb3VuZEVsZW1lbnQgPSBnZXREYXRhQnlBc3RFbGVtZW50KGFzdEVsZW1lbnQpOworCQlpZiggZm91bmRFbGVtZW50LnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kRWxlbWVudCApOworCQl9CisJfQorCXsKKwkJY29uc3QgU3ltYm9sICYgZm91bmRFbGVtZW50ID0gZ2V0UG9ydEJ5QXN0RWxlbWVudChhc3RFbGVtZW50KTsKKwkJaWYoIGZvdW5kRWxlbWVudC52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCBmb3VuZEVsZW1lbnQgKTsKKwkJfQorCX0KKwl7CisJCWNvbnN0IFN5bWJvbCAmIGZvdW5kRWxlbWVudCA9IGdldE1hY2hpbmVCeUFzdEVsZW1lbnQoCisJCQkJU3BlY2lmaWVyOjpERVNJR05fSU5TVEFOQ0VfS0lORCwgYXN0RWxlbWVudCk7CisJCWlmKCBmb3VuZEVsZW1lbnQudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRFbGVtZW50ICk7CisJCX0KKwl9CisJeworCQljb25zdCBTeW1ib2wgJiBmb3VuZEVsZW1lbnQgPSBnZXRCdWZmZXJCeUFzdEVsZW1lbnQoYXN0RWxlbWVudCk7CisJCWlmKCBmb3VuZEVsZW1lbnQudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggZm91bmRFbGVtZW50ICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworfQorCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZVF1ZXJ5LmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlUXVlcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWQwYzZhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZVF1ZXJ5LmgKQEAgLTAsMCArMSwzMDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiA4IG1hcnMgMjAxNworICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEZNTF9FWEVDVVRBQkxFX0VYRUNVVEFCTEVRVUVSWV9IXworI2RlZmluZSBGTUxfRVhFQ1VUQUJMRV9FWEVDVVRBQkxFUVVFUllfSF8KKworI2luY2x1ZGUgPGZtbC9jb21tb24vTW9kaWZpZXJFbGVtZW50Lmg+CisjaW5jbHVkZSA8Zm1sL2NvbW1vbi9TcGVjaWZpZXJFbGVtZW50Lmg+CisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlRm9ybS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVTeXN0ZW0uaD4KKworI2luY2x1ZGUgPHNldy9Db25maWd1cmF0aW9uLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBCRjsKK2NsYXNzIE9iamVjdEVsZW1lbnQ7CitjbGFzcyBTeW1ib2w7CisKKworY2xhc3MgRXhlY3V0YWJsZVF1ZXJ5Cit7CisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBUWVBFREVGCisJICovCisJdHlwZWRlZiBUYWJsZU9mRXhlY3V0YWJsZUZvcm06OmNvbnN0X3Jhd19pdGVyYXRvciAgY29uc3RfZXhlY19pdGVyYXRvcjsKKworCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwljb25zdCBDb25maWd1cmF0aW9uICYgbUNvbmZpZ3VyYXRpb247CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICovCisJRXhlY3V0YWJsZVF1ZXJ5KGNvbnN0IENvbmZpZ3VyYXRpb24gJiBhQ29uZmlndXJhdGlvbikKKwk6IG1Db25maWd1cmF0aW9uKCBhQ29uZmlndXJhdGlvbiApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+RXhlY3V0YWJsZVF1ZXJ5KCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoKKwkgKiBHRVRURVIKKwkgKiB0aGUgRXhlY3V0YWJsZSBTeXN0ZW0KKwkgKi8KKwlpbmxpbmUgY29uc3QgRXhlY3V0YWJsZVN5c3RlbSAmIGdldFN5c3RlbSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Db25maWd1cmF0aW9uLmdldEV4ZWN1dGFibGVTeXN0ZW0oKSApOworCX0KKworCisJLyoqCisJICogU0VBUkNICisJICogRXhlY3V0YWJsZUZvcm0KKwkgKi8KKwlpbmxpbmUgY29uc3QgQkYgJiBnZXRFeGVjdXRhYmxlKAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldFN5c3RlbSgpLmdldEV4ZWN1dGFibGVzKCkuZ2V0QnlGUU5hbWVJRCgKKwkJCQlhRnVsbHlRdWFsaWZpZWROYW1lSUQgKSApOworCX0KKworCisJaW5saW5lIGNvbnN0IEJGICYgIGdldEV4ZWN1dGFibGVCeVF1YWxpZmllZE5hbWVJRCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0U3lzdGVtKCkuZ2V0RXhlY3V0YWJsZXMoKS4KKwkJCQlnZXRCeVF1YWxpZmllZE5hbWVJRChhUXVhbGlmaWVkTmFtZUlEKSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSCisJICogTGlzdCBvZiBhbGwgUlVOVElNRSBFeGVjdXRhYmxlIEVsZW1lbnQKKwkgKi8KKwlpbmxpbmUgdm9pZCBnZXRSdW50aW1lRXhlY3V0YWJsZSgKKwkJCUNvbGxlY3Rpb248IEV4ZWN1dGFibGVGb3JtICogPiAmIGxpc3RPZkV4ZWN1dGFibGUpCisJeworCQlsaXN0T2ZFeGVjdXRhYmxlLmFwcGVuZCgKKwkJCQlnZXRTeXN0ZW0oKS5yYXdTeXN0ZW1JbnN0YW5jZSgpLT5nZXRFeGVjdXRhYmxlKCkgKTsKKworCQlnZXRSdW50aW1lRXhlY3V0YWJsZShnZXRTeXN0ZW0oKS5yYXdTeXN0ZW1JbnN0YW5jZSgpLCBsaXN0T2ZFeGVjdXRhYmxlKTsKKwl9CisKKwl2b2lkIGdldFJ1bnRpbWVFeGVjdXRhYmxlKEluc3RhbmNlT2ZNYWNoaW5lICogYU1hY2hpbmUsCisJCQlDb2xsZWN0aW9uPCBFeGVjdXRhYmxlRm9ybSAqID4gJiBsaXN0T2ZFeGVjdXRhYmxlKTsKKworCisJLyoqCisJICogU0VBUkNICisJICogQXZtVHJhbnNpdGlvbgorCSAqLworCWNvbnN0IEJGICYgZ2V0VHJhbnNpdGlvbkJ5QXN0RWxlbWVudCgKKwkJCWNvbnN0IE9iamVjdEVsZW1lbnQgKiBhc3RFbGVtZW50KSBjb25zdDsKKworCWNvbnN0IEJGICYgZ2V0VHJhbnNpdGlvbihjb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCkgY29uc3Q7CisKKwljb25zdCBCRiAmIGdldFRyYW5zaXRpb25CeU5hbWVJRChjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpIGNvbnN0OworCisJY29uc3QgQkYgJiBnZXRUcmFuc2l0aW9uQnlRdWFsaWZpZWROYW1lSUQoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpIGNvbnN0OworCisKKwkvKioKKwkgKiBTRUFSQ0gKKwkgKiBBdm1Qcm9ncmFtCisJICovCisJY29uc3QgQkYgJiBnZXRQcm9ncmFtKGNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEKSBjb25zdDsKKworCisJLyoqCisJICogU0VBUkNICisJICogQXZtUHJvZ3JhbQorCSAqIEV4ZWN1dGFibGVGb3JtCisJICovCisJY29uc3QgQkYgJiBnZXRFeGVjdXRhYmxlT3JQcm9ncmFtKAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQpIGNvbnN0OworCisJLy8gR2V0dGVyIGJ5IEFTVC1FbGVtZW50CisJY29uc3QgQkYgJiBnZXRFeGVjdXRhYmxlT3JQcm9ncmFtKGNvbnN0IE9iamVjdEVsZW1lbnQgKiBhc3RFbGVtZW50KSBjb25zdDsKKworCisJLyoqCisJICogU0VBUkNICisJICogSW5zdGFuY2VPZkJ1ZmZlcgorCSAqLworCWNvbnN0IFN5bWJvbCAmIGdldEJ1ZmZlcihjb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCkgY29uc3Q7CisKKwljb25zdCBTeW1ib2wgJiBnZXRCdWZmZXJCeU5hbWVJRChjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpIGNvbnN0OworCisJY29uc3QgU3ltYm9sICYgZ2V0QnVmZmVyQnlRdWFsaWZpZWROYW1lSUQoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpIGNvbnN0OworCisJY29uc3QgU3ltYm9sICYgZ2V0QnVmZmVyQnlBc3RFbGVtZW50KAorCQkJY29uc3QgT2JqZWN0RWxlbWVudCAqIGFzdEVsZW1lbnQpIGNvbnN0OworCisKKwkvKioKKwkgKiBTRUFSQ0gKKwkgKiBJbnN0YW5jZU9mRGF0YQorCSAqLworCWNvbnN0IEJGICYgZ2V0RGF0YUJ5TmFtZUlEKGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkgY29uc3Q7CisJY29uc3QgQkYgJiBnZXREYXRhQnlRdWFsaWZpZWROYW1lSUQoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpIGNvbnN0OworCisJY29uc3QgQkYgJiBnZXREYXRhKGNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEKSBjb25zdDsKKwljb25zdCBCRiAmIGdldERhdGFCeUFzdEVsZW1lbnQoY29uc3QgT2JqZWN0RWxlbWVudCAqIGFzdEVsZW1lbnQpIGNvbnN0OworCisKKwkvKioKKwkgKiBTRUFSQ0gKKwkgKiBTeW1ib2wgYXMgSW5zdGFuY2VPZlBvcnQKKwkgKiBieSBJRAorCSAqLworCWNvbnN0IFN5bWJvbCAmIGdldFBvcnRCeU5hbWVJRChjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsCisJCQlNb2RpZmllcjo6RElSRUNUSU9OX0tJTkQgZGlyZWN0aW9uKSBjb25zdDsKKworCWNvbnN0IFN5bWJvbCAmIGdldFBvcnRCeU5hbWVJRChjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpIGNvbnN0OworCisJYXZtX3NpemVfdCBnZXRQb3J0QnlOYW1lSUQoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsIExpc3RPZlN5bWJvbCAmIGxpc3RvZlBvcnQsCisJCQlNb2RpZmllcjo6RElSRUNUSU9OX0tJTkQgZGlyZWN0aW9uLCBib29sIGlzU3Ryb25nbHkgPSB0cnVlKSBjb25zdDsKKworCWF2bV9zaXplX3QgZ2V0UG9ydEJ5TmFtZUlEKAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELCBMaXN0T2ZTeW1ib2wgJiBsaXN0b2ZQb3J0KSBjb25zdDsKKworCisJLyoqCisJICogU0VBUkNICisJICogU3ltYm9sIGFzIEluc3RhbmNlT2ZQb3J0CisJICogYnkgWyBbIEZVTExZIF0gUVVBTElGSUVEIF0gTkFNRSBJRAorCSAqLworCWNvbnN0IFN5bWJvbCAmIGdldFBvcnRCeVF1YWxpZmllZE5hbWVJRCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCwKKwkJCU1vZGlmaWVyOjpESVJFQ1RJT05fS0lORCBkaXJlY3Rpb24sYm9vbCBpc1N0cm9uZ2x5ID0gdHJ1ZSkgY29uc3Q7CisKKwlhdm1fc2l6ZV90IGdldFBvcnRCeVF1YWxpZmllZE5hbWVJRCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCwgTGlzdE9mU3ltYm9sICYgbGlzdG9mUG9ydCwKKwkJCU1vZGlmaWVyOjpESVJFQ1RJT05fS0lORCBkaXJlY3Rpb24sIGJvb2wgaXNTdHJvbmdseSA9IHRydWUpIGNvbnN0OworCisJYXZtX3NpemVfdCBnZXRQb3J0QnlRdWFsaWZpZWROYW1lSUQoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQsCisJCQlMaXN0T2ZTeW1ib2wgJiBsaXN0b2ZQb3J0KSBjb25zdDsKKworCisJY29uc3QgU3ltYm9sICYgZ2V0UG9ydChjb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCkgY29uc3Q7CisKKwlzdGF0aWMgY29uc3QgU3ltYm9sICYgZ2V0U2VtUG9ydChjb25zdCBFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZSwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEKTsKKworCWNvbnN0IFN5bWJvbCAmIGdldFBvcnRCeUFzdEVsZW1lbnQoY29uc3QgT2JqZWN0RWxlbWVudCAqIGFzdEVsZW1lbnQpIGNvbnN0OworCisJc3RhdGljIGNvbnN0IFN5bWJvbCAmIGdldFNlbVBvcnRCeUFzdEVsZW1lbnQoCisJCQljb25zdCBFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZSwKKwkJCWNvbnN0IE9iamVjdEVsZW1lbnQgKiBhc3RFbGVtZW50KTsKKworCisJLyoqCisJICogU0VBUkNICisJICogSW5zdGFuY2VPZkNoYW5uZWwKKwkgKi8KKwljb25zdCBTeW1ib2wgJiBnZXRDaGFubmVsKGNvbnN0IE9iamVjdEVsZW1lbnQgKiBhc3RFbGVtZW50KSBjb25zdDsKKworCisJLyoqCisJICogU0VBUkNICisJICogSW5zdGFuY2VPZk1hY2hpbmUKKwkgKi8KKwljb25zdCBTeW1ib2wgJiBnZXRNYWNoaW5lKFNwZWNpZmllcjo6REVTSUdOX0tJTkQgYURlc2lnbiwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEKSBjb25zdDsKKworCWNvbnN0IFN5bWJvbCAmIGdldE1hY2hpbmVCeU5hbWVJRChTcGVjaWZpZXI6OkRFU0lHTl9LSU5EIGFEZXNpZ24sCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpIGNvbnN0OworCisJY29uc3QgU3ltYm9sICYgZ2V0TWFjaGluZUJ5UXVhbGlmaWVkTmFtZUlEKFNwZWNpZmllcjo6REVTSUdOX0tJTkQgYURlc2lnbiwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkgY29uc3Q7CisKKwlJbnN0YW5jZU9mTWFjaGluZSAqIHJhd01hY2hpbmVCeU5hbWVJRCgKKwkJCVNwZWNpZmllcjo6REVTSUdOX0tJTkQgYURlc2lnbiwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKSBjb25zdDsKKworCUluc3RhbmNlT2ZNYWNoaW5lICogcmF3TWFjaGluZUJ5UXVhbGlmaWVkTmFtZUlEKAorCQkJU3BlY2lmaWVyOjpERVNJR05fS0lORCBhRGVzaWduLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKSBjb25zdDsKKworCWNvbnN0IFN5bWJvbCAmIGdldE1hY2hpbmVCeUFzdEVsZW1lbnQoU3BlY2lmaWVyOjpERVNJR05fS0lORCBhRGVzaWduLAorCQkJY29uc3QgT2JqZWN0RWxlbWVudCAqIGFzdEVsZW1lbnQpIGNvbnN0OworCisJY29uc3QgQkYgJiBzZWFyY2hNYWNoaW5lKAorCQkJU3BlY2lmaWVyOjpERVNJR05fS0lORCBhRGVzaWduLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKTsKKworCisJLyoqCisJICogU0VBUkNICisJICogZm9yIE1hY2hpbmUgSW5zdGFuY2UgTW9kZWwKKwkgKi8KKwljb25zdCBTeW1ib2wgJiBnZXRJbnN0YW5jZU1vZGVsKGNvbnN0IE9iamVjdEVsZW1lbnQgKiBhc3RFbGVtZW50KSBjb25zdDsKKworCWNvbnN0IFN5bWJvbCAmIGdldFNlbUluc3RhbmNlTW9kZWwoCisJCQljb25zdCBFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZSwKKwkJCWNvbnN0IE9iamVjdEVsZW1lbnQgKiBhc3RFbGVtZW50KSBjb25zdDsKKworCS8qKgorCSAqIFNFQVJDSAorCSAqIGZvciBNYWNoaW5lIEluc3RhbmNlIFN0YXRpYworCSAqLworCWNvbnN0IFN5bWJvbCAmIGdldEluc3RhbmNlU3RhdGljKGNvbnN0IE9iamVjdEVsZW1lbnQgKiBhc3RFbGVtZW50KSBjb25zdDsKKworCWNvbnN0IFN5bWJvbCAmIGdldFNlbUluc3RhbmNlU3RhdGljKAorCQkJY29uc3QgRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGUsCisJCQljb25zdCBPYmplY3RFbGVtZW50ICogYXN0RWxlbWVudCkgY29uc3Q7CisKKwkvKioKKwkgKiBTRUFSQ0gKKwkgKiBmb3IgTWFjaGluZSBJbnN0YW5jZSBEeW5hbWljCisJICovCisJY29uc3QgU3ltYm9sICYgZ2V0SW5zdGFuY2VEeW5hbWljKGNvbnN0IE9iamVjdEVsZW1lbnQgKiBhc3RFbGVtZW50KSBjb25zdDsKKworCWNvbnN0IFN5bWJvbCAmIGdldFNlbUluc3RhbmNlRHluYW1pYygKKwkJCWNvbnN0IEV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlLAorCQkJY29uc3QgT2JqZWN0RWxlbWVudCAqIGFzdEVsZW1lbnQpIGNvbnN0OworCisKKwkvKioKKwkgKiBTRUFSQ0gKKwkgKiBhbnkgSW5zdGFuY2UKKwkgKi8KKwljb25zdCBCRiAmIGdldEluc3RhbmNlQnlBc3RFbGVtZW50KGNvbnN0IE9iamVjdEVsZW1lbnQgKiBhc3RFbGVtZW50KSBjb25zdDsKKworfTsKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qIEZNTF9FWEVDVVRBQkxFX0VYRUNVVEFCTEVRVUVSWV9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZVN5c3RlbS5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlU3lzdGVtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjdkODEyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZVN5c3RlbS5jcHAKQEAgLTAsMCArMSwxMTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkV4ZWN1dGFibGVTeXN0ZW0uaCIKKworI2luY2x1ZGUgPGZtbC9jb21tb24vTW9kaWZpZXJFbGVtZW50Lmg+CisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9CYXNlSW5zdGFuY2VGb3JtLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZVF1ZXJ5Lmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZkRhdGEuaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mUG9ydC5oPgorCisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1VuaUZvcm1JZGVudGlmaWVyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorICogU0VUVEVSCisgKiB1cGRhdGVGdWxseVF1YWxpZmllZE5hbWVJRCgpCisgKi8KK3ZvaWQgRXhlY3V0YWJsZVN5c3RlbTo6dXBkYXRlRnVsbHlRdWFsaWZpZWROYW1lSUQoKQoreworCWlmKCBoYXNBc3RFbGVtZW50KCkgKQorCXsKKwkJc3RkOjpzdHJpbmcgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEID0gZ2V0QXN0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsKKworCQlzZXRBbGxOYW1lSUQoInN5cyIgKyBhRnVsbHlRdWFsaWZpZWROYW1lSUQuc3Vic3RyKAorCQkJCQlhRnVsbHlRdWFsaWZpZWROYW1lSUQuZmluZChGUU5fSURfUk9PVF9TRVBBUkFUT1IpICkgLAorCQkJCU5hbWVkRWxlbWVudDo6ZXh0cmFjdE5hbWVJRCggYUZ1bGx5UXVhbGlmaWVkTmFtZUlEICkpOworCX0KKwllbHNlCisJeworCQlzZXRBbGxOYW1lSUQoICJzeXMjYW5vbnltIiAsICJzeXMjYW5vbnltIiApOworCX0KK30KKworCisvKioKKyAqIFNlcmlhbGl6YXRpb24KKyAqLwordm9pZCBFeGVjdXRhYmxlU3lzdGVtOjpzdHJIZWFkZXIoT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJb3MgPDwgZ2V0TW9kaWZpZXIoKS50b1N0cmluZygpIDw8ICJzeXN0ZW0iOworCWlmKCBoYXNTeXN0ZW1JbnN0YW5jZSgpICkKKwl7CisJCW9zIDw8IFRBQiA8PCAiPCBtb2M6ICIgPDwgZ2V0U3BlY2lmaWVyKCkuc3RyKCkgPDwgIiA+IjsKKwl9CisJb3MgPDwgIiAiIDw8IGdldE5hbWVJRCgpOworfQorCisKK3ZvaWQgRXhlY3V0YWJsZVN5c3RlbTo6dG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJb3MgPDwgVEFCIDw8ICJ4ZnNwPCBleGVjdXRhYmxlICwgMS4wID46IiA8PCBFT0wyOworCisKKwlvcyA8PCBUQUIgPDwgIi8vICIgPDwgZ2V0TW9kaWZpZXIoKS50b1N0cmluZygpCisJCQk8PCBnZXRTcGVjaWZpZXIoKS50b1N0cmluZyggU3BlY2lmaWVyOjpFTkFCTEVfRkVBVFVSRV9ERVNJR05fRklFTEQgKQorCQkJPDwgInN5c3RlbTwgbW9jOiAiCisJCQk8PCBnZXRTcGVjaWZpZXIoKS5zdHIoIFNwZWNpZmllcjo6RElTQUJMRV9GRUFUVVJFX0RFU0lHTl9GSUVMRCApCisJCQk8PCAiID4gIiA8PCBnZXROYW1lSUQoKSA8PCAiIHsiIDw8IEVPTDsKKworCW9zIDw8IFRBQiA8PCAiaGVhZGVyOiIgPDwgRU9MPDwgVEFCMgorCQkJPDwgImZxbl9pZCA9ICIgPDwgZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJPDwgRU9MX1RBQjIKKwkJCTw8ICJkZXNjcmlwdGlvbiA9IFwidGhlIHJlc3VsdCBvZiB0aGUgc3lzdGVtIGNvbXBpbGF0aW9uXCIiCisJCQk8PCBFT0xfVEFCMgorCQkJPDwgImNvdW50ID0gIiA8PCBnZXRNYWNoaW5lQ291bnQoKSA8PCBFT0w7CisKKwlpZiggaGFzU3lzdGVtSW5zdGFuY2UoKSApCisJeworCQlvcyA8PCBFT0xfVEFCIDw8ICJpbnN0YW5jZToiCisJCQkJPDwgRU9MX0lOQ1JfSU5ERU5UIDw8IFRBQgorCQkJCTw8ICIvLyBUaGUgUGFyYW1ldGVycyBNYWNoaW5lIEluc3RhbmNlIiA8PCBFT0w7CisJCW1QYXJhbWV0ZXJzSW5zdGFuY2UudG9TdHJlYW0ob3MpOworCisJCW9zIDw8IEVPTF9UQUIgPDwgIi8vIFRoZSBTeXN0ZW0gTWFjaGluZSBJbnN0YW5jZSIgPDwgRU9MOworCQlyYXdTeXN0ZW1JbnN0YW5jZSgpLT50b1N0cmVhbShvcyk7CisJCW9zIDw8IERFQ1JfSU5ERU5UOworCX0KKworCW9zIDw8IEVPTF9UQUIgPDwgImV4ZWN1dGFibGU6IiA8PCBFT0xfSU5DUl9JTkRFTlQ7CisKKwltUGFyYW1ldGVyc0V4ZWN1dGFibGUudG9TdHJlYW0ob3MpOworCisJVGFibGVPZkV4ZWN1dGFibGVGb3JtOjpjb25zdF9yYXdfaXRlcmF0b3IgaXRFeGVjID0gbUV4ZWN1dGFibGVzLmJlZ2luKCk7CisJZm9yKCA7IGl0RXhlYyAhPSBtRXhlY3V0YWJsZXMuZW5kKCkgOyArK2l0RXhlYyApCisJeworCQlvcyA8PCBFT0w7CisJCShpdEV4ZWMpLT50b1N0cmVhbShvcyk7CisJfQorCisJb3MgPDwgRU9MX0RFQ1JfSU5ERU5UIDw8ICIvLyAiIDw8IFRBQiA8PCAifSIgPDwgRU9MX0ZMVVNIOworfQorCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVTeXN0ZW0uaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVTeXN0ZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWIwYWIwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZVN5c3RlbS5oCkBAIC0wLDAgKzEsMjg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIEVYRUNVVEFCTEVTWVNURU1fSF8KKyNkZWZpbmUgRVhFQ1VUQUJMRVNZU1RFTV9IXworCisjaW5jbHVkZSA8Y29tbW9uL0F2bVBvaW50ZXIuaD4KKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0Jhc2VDb21waWxlZEZvcm0uaD4KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vVHlwZWRlZi5oPgorCisjaW5jbHVkZSA8Zm1sL2NvbW1vbi9TcGVjaWZpZXJFbGVtZW50Lmg+CisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlRm9ybS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVMaWIuaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mTWFjaGluZS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZQb3J0Lmg+CisKKyNpbmNsdWRlIDxmbWwvc3ltYm9sL1N5bWJvbC5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvUnVudGltZUZvcm0uaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lSUQuaD4KKworCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjbGFzcyBBdm1Db2RlOworCitjbGFzcyBPYmplY3RFbGVtZW50OworCitjbGFzcyBTeXN0ZW07CisKKworY2xhc3MgRXhlY3V0YWJsZVN5c3RlbSA6CisJCXB1YmxpYyBCYXNlQ29tcGlsZWRGb3JtICwKKwkJQVZNX0lOSkVDVF9JTlNUQU5DRV9DT1VOVEVSX0NMQVNTKCBFeGVjdXRhYmxlU3lzdGVtICkKKworeworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIEV4ZWN1dGFibGVTeXN0ZW0gKQorCisKK3Byb3RlY3RlZDoKKwkvKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlUYWJsZU9mRXhlY3V0YWJsZUZvcm0gbUV4ZWN1dGFibGVzOworCisJRXhlY3V0YWJsZUZvcm0gICAgbU51bGxFeGVjdXRhYmxlOworCVN5bWJvbCAgICAgICAgICAgIG1OdWxsSW5zdGFuY2U7CisKKwlFeGVjdXRhYmxlRm9ybSAgICBtUGFyYW1ldGVyc0V4ZWN1dGFibGU7CisJSW5zdGFuY2VPZk1hY2hpbmUgbVBhcmFtZXRlcnNJbnN0YW5jZTsKKworCVN5bWJvbCBtU3lzdGVtSW5zdGFuY2U7CisKKwlFeGVjdXRhYmxlRm9ybSAqIG1EZWZhdWx0UHJvY2Vzc0V4ZWN1dGFibGVGb3JtOworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJRXhlY3V0YWJsZVN5c3RlbShTeXN0ZW0gJiBhc3RTeXN0ZW0pCisJOiBCYXNlQ29tcGlsZWRGb3JtKCBDTEFTU19LSU5EX1QoIEV4ZWN1dGFibGVTeXN0ZW0gKSAsIE5VTEwsICZhc3RTeXN0ZW0gKSwKKwltRXhlY3V0YWJsZXMoICksCisKKwltTnVsbEV4ZWN1dGFibGUoICp0aGlzICwgMCApLAorCW1OdWxsSW5zdGFuY2UoIG5ldyBJbnN0YW5jZU9mTWFjaGluZSgKKwkJCSZtTnVsbEV4ZWN1dGFibGUsIE5VTEwsICZtTnVsbEV4ZWN1dGFibGUsIE5VTEwsIDAsCisJCQlTcGVjaWZpZXI6OkRFU0lHTl9JTlNUQU5DRV9TVEFUSUNfU1BFQ0lGSUVSKSApLAorCisJbVBhcmFtZXRlcnNFeGVjdXRhYmxlKCAqdGhpcywgTlVMTCwgJmFzdFN5c3RlbSwgMCApLAorCW1QYXJhbWV0ZXJzSW5zdGFuY2UoIE5VTEwsICZhc3RTeXN0ZW0sICZtUGFyYW1ldGVyc0V4ZWN1dGFibGUsIE5VTEwsIDAgKSwKKworCW1TeXN0ZW1JbnN0YW5jZSggKSwKKwltRGVmYXVsdFByb2Nlc3NFeGVjdXRhYmxlRm9ybSggTlVMTCApCisJeworCQltTnVsbEluc3RhbmNlLm1hY2hpbmUoKS5zZXRJbnN0YW5jZU1vZGVsKG1OdWxsSW5zdGFuY2UucmF3TWFjaGluZSgpKTsKKworCQlFeGVjdXRhYmxlTGliOjpNQUNISU5FX05VTEwuc2V0RXhlY3V0YWJsZSggJm1OdWxsRXhlY3V0YWJsZSApOworCisJCW1QYXJhbWV0ZXJzRXhlY3V0YWJsZS5pbmNyUG9zc2libGVTdGF0aWNJbnN0YW5jaWF0aW9uQ291bnQoMSk7CisJCW1QYXJhbWV0ZXJzRXhlY3V0YWJsZS5zZXRBbGxOYW1lSUQoImV4ZWM6OiNQQVJBTUVURVJTIyIgLCAiI1BBUkFNRVRFUlMjIik7CisKKwkJbVBhcmFtZXRlcnNJbnN0YW5jZS5zZXRBbGxOYW1lSUQoImluc3Q6OiNQQVJBTUVURVJTIyIgLCAiI1BBUkFNRVRFUlMjIik7CisKKwkJdXBkYXRlRnVsbHlRdWFsaWZpZWROYW1lSUQoKTsKKwl9CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIENvcHkKKwkgKi8KKwlFeGVjdXRhYmxlU3lzdGVtKGNvbnN0IEV4ZWN1dGFibGVTeXN0ZW0gJiBhbkV4ZWN1dGFibGUpCisJOiBCYXNlQ29tcGlsZWRGb3JtKCBhbkV4ZWN1dGFibGUgKSwKKwltRXhlY3V0YWJsZXMoIGFuRXhlY3V0YWJsZS5tRXhlY3V0YWJsZXMgKSwKKworCW1OdWxsRXhlY3V0YWJsZSggYW5FeGVjdXRhYmxlLm1OdWxsRXhlY3V0YWJsZSApLAorCW1OdWxsSW5zdGFuY2UoIGFuRXhlY3V0YWJsZS5tTnVsbEluc3RhbmNlICksCisKKwltUGFyYW1ldGVyc0V4ZWN1dGFibGUoIGFuRXhlY3V0YWJsZS5tUGFyYW1ldGVyc0V4ZWN1dGFibGUgKSwKKwltUGFyYW1ldGVyc0luc3RhbmNlKCBhbkV4ZWN1dGFibGUubVBhcmFtZXRlcnNJbnN0YW5jZSApLAorCisJbVN5c3RlbUluc3RhbmNlKCBhbkV4ZWN1dGFibGUubVN5c3RlbUluc3RhbmNlICksCisJbURlZmF1bHRQcm9jZXNzRXhlY3V0YWJsZUZvcm0oCisJCShhbkV4ZWN1dGFibGUubURlZmF1bHRQcm9jZXNzRXhlY3V0YWJsZUZvcm0gPT0gTlVMTCkgPyBOVUxMIDoKKwkJCW5ldyBFeGVjdXRhYmxlRm9ybSggKihhbkV4ZWN1dGFibGUubURlZmF1bHRQcm9jZXNzRXhlY3V0YWJsZUZvcm0pICkgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+RXhlY3V0YWJsZVN5c3RlbSgpCisJeworCQlpZiggbURlZmF1bHRQcm9jZXNzRXhlY3V0YWJsZUZvcm0gIT0gTlVMTCApCisJCXsKKwkJCWRlbGV0ZSggbURlZmF1bHRQcm9jZXNzRXhlY3V0YWJsZUZvcm0gKTsKKwkJfQorCX0KKworCisJLyoqCisJICogU0VUVEVSCisJICogdXBkYXRlRnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCSAqLworCXZpcnR1YWwgdm9pZCB1cGRhdGVGdWxseVF1YWxpZmllZE5hbWVJRCgpOworCisKKwkvKioKKwkgKiBHRVRURVIgIEFQSQorCSAqIFNwZWNpZmllcgorCSAqLworCWNvbnN0IFNwZWNpZmllciAmIGdldFNwZWNpZmllcigpIGNvbnN0CisJeworCQlyZXR1cm4oIHJhd1N5c3RlbUluc3RhbmNlKCktPmdldEV4ZWN1dGFibGUoKS0+Z2V0U3BlY2lmaWVyKCkgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIFRhYmxlT2ZFeGVjdXRhYmxlRm9ybQorCSAqLworCWlubGluZSBjb25zdCBUYWJsZU9mRXhlY3V0YWJsZUZvcm0gJiBnZXRFeGVjdXRhYmxlcygpIGNvbnN0CisJeworCQlyZXR1cm4oIG1FeGVjdXRhYmxlcyApOworCX0KKworCisJaW5saW5lIGF2bV9zaXplX3Qgc2l6ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1FeGVjdXRhYmxlcy5zaXplKCkgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1FeGVjdXRhYmxlRm9ybQorCSAqLworLy8JaW5saW5lIEV4ZWN1dGFibGVGb3JtICYgbmV3RXhlY3V0YWJsZShFeGVjdXRhYmxlRm9ybSAqIGFDb250YWluZXIsCisvLwkJCWNvbnN0IE9iamVjdEVsZW1lbnQgKiBhQ29tcGlsZWQsIGF2bV9zaXplX3QgYURhdGFTaXplID0gMCkKKy8vCXsKKy8vCQltRXhlY3V0YWJsZXMucHVzaF9mcm9udCgKKy8vCQkJCUV4ZWN1dGFibGVGb3JtKGFDb250YWluZXIsIGFDb21waWxlZCwgYURhdGFTaXplKSApOworLy8KKy8vCQlFeGVjdXRhYmxlRm9ybSAmIG5ld0V4ZWMgPSBtRXhlY3V0YWJsZXMuZnJvbnQoKTsKKy8vCisvLwkJbmV3RXhlYy5zZXRPZmZzZXQoIHNpemUoKSAtIDEgKTsKKy8vCisvLwkJcmV0dXJuKCBuZXdFeGVjICk7CisvLwl9CisKKwlpbmxpbmUgY29uc3QgQkYgJiBzYXZlRXhlY3V0YWJsZShFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZUZvcm0pCisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBhbkV4ZWN1dGFibGVGb3JtICkKKwkJCQk8PCAiRXhlY3V0YWJsZUZvcm0gISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQlhbkV4ZWN1dGFibGVGb3JtLT5zZXRPZmZzZXQoIG1FeGVjdXRhYmxlcy5zaXplKCkgKTsKKworCQlyZXR1cm4oIG1FeGVjdXRhYmxlcy5zYXZlKCBhbkV4ZWN1dGFibGVGb3JtICkgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1QYXJhbWV0ZXJzSW5zdGFuY2UKKwkgKi8KKwlpbmxpbmUgY29uc3QgSW5zdGFuY2VPZk1hY2hpbmUgKiByYXdQYXJhbWV0ZXJzSW5zdGFuY2UoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAmIG1QYXJhbWV0ZXJzSW5zdGFuY2UgKTsKKwl9CisKKwlpbmxpbmUgSW5zdGFuY2VPZk1hY2hpbmUgKiByYXdQYXJhbWV0ZXJzSW5zdGFuY2UoKQorCXsKKwkJcmV0dXJuKCAmIG1QYXJhbWV0ZXJzSW5zdGFuY2UgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1TeXN0ZW1JbnN0YW5jZQorCSAqLworCWlubGluZSBJbnN0YW5jZU9mTWFjaGluZSAqIHJhd1N5c3RlbUluc3RhbmNlKCkgY29uc3QKKwl7CisJCXJldHVybiggbVN5c3RlbUluc3RhbmNlLnJhd01hY2hpbmUoKSApOworCX0KKworCWlubGluZSBjb25zdCBTeW1ib2wgJiBnZXRTeXN0ZW1JbnN0YW5jZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1TeXN0ZW1JbnN0YW5jZSApOworCX0KKworCWlubGluZSBib29sIGhhc1N5c3RlbUluc3RhbmNlKCkgY29uc3QKKwl7CisJCXJldHVybiggbVN5c3RlbUluc3RhbmNlLnZhbGlkKCkgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgU3ltYm9sICYgc2V0U3lzdGVtSW5zdGFuY2UoSW5zdGFuY2VPZk1hY2hpbmUgKiBhbkluc3RhbmNlKQorCXsKKwkJbVN5c3RlbUluc3RhbmNlLnJlbmV3KCBhbkluc3RhbmNlICk7CisKKwkJcmV0dXJuKCBtU3lzdGVtSW5zdGFuY2UgKTsKKwl9CisKKworCS8qKgorCSAqIG1EZWZhdWx0UHJvY2Vzc0V4ZWN1dGFibGVGb3JtCisJICovCisJaW5saW5lIEV4ZWN1dGFibGVGb3JtICogZGVmYXVsdEV4ZWN1dGFibGVGb3JtKCkKKwl7CisJCWlmKCBtRGVmYXVsdFByb2Nlc3NFeGVjdXRhYmxlRm9ybSAhPSBOVUxMICkKKwkJeworCQkJbURlZmF1bHRQcm9jZXNzRXhlY3V0YWJsZUZvcm0gPSBuZXcgRXhlY3V0YWJsZUZvcm0oICp0aGlzICwgMCApOworCQl9CisJCXJldHVybiggbURlZmF1bHRQcm9jZXNzRXhlY3V0YWJsZUZvcm0gKTsKKwl9CisKKwkvKioKKwkgKiBORVcgVE1QIEVYRUNVVEFCTEUKKwkgKi8KKwlpbmxpbmUgdm9pZCBpbml0UHJvY2Vzc0V4ZWN1dGFibGVGb3JtKAorCQkJRXhlY3V0YWJsZUZvcm0gJiBhbkV4ZWN1dGFibGVGb3JtLCBhdm1fc2l6ZV90IGFEYXRhU2l6ZSA9IDApIGNvbnN0CisJeworCQlhbkV4ZWN1dGFibGVGb3JtLmluaXQoCisJCQkJcmF3U3lzdGVtSW5zdGFuY2UoKS0+Z2V0RXhlY3V0YWJsZSgpLCBhRGF0YVNpemUpOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogTWFjaGluZSBDb3VudAorCSAqLworCWlubGluZSBhdm1fc2l6ZV90IGdldE1hY2hpbmVDb3VudCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHJhd1N5c3RlbUluc3RhbmNlKCktPmdldEV4ZWN1dGFibGUoKS0+Z2V0cmVjTWFjaGluZUNvdW50KCkgKzEgKTsKKwl9CisKKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwl2b2lkIHN0ckhlYWRlcihPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKKwl2aXJ0dWFsIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCit9OworCisKK30KKworI2VuZGlmIC8qRVhFQ1VUQUJMRVNZU1RFTV9IXyovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mQnVmZmVyLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZCdWZmZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYmNkMDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mQnVmZmVyLmNwcApAQCAtMCwwICsxLDE3MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDIxIG1hcnMgMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiSW5zdGFuY2VPZkJ1ZmZlci5oIgorCisjaW5jbHVkZSA8Zm1sL2NvbW1vbi9PYmplY3RFbGVtZW50Lmg+CisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlRm9ybS5oPgorCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0J1ZmZlci5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvUnVudGltZUlELmg+CisKKyNpbmNsdWRlIDxmbWwvdHlwZS9CYXNlVHlwZVNwZWNpZmllci5oPgorI2luY2x1ZGUgPGZtbC90eXBlL1R5cGVNYW5hZ2VyLmg+CisKKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvQnVmZmVyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK3N0YXRpYyBjb25zdCBUeXBlU3BlY2lmaWVyICYgZ2V0U3BlY2lmaWVyVHlwZSgKKwkJQmFzZUF2bVByb2dyYW0gKiBhQ29udGFpbmVyLCBCdWZmZXIgKiBhQnVmZmVyKQoreworLy8JVHlwZVNwZWNpZmllciBiZlRTKCBUeXBlTWFuYWdlcjo6bmV3Q29sbGVjdGlvbigKKy8vCQkJYUJ1ZmZlciwgYUJ1ZmZlci0+Z2V0UG9saWN5U3BlY2lmaWVyS2luZCgpLAorLy8JCQlUeXBlTWFuYWdlcjo6VU5JVkVSU0FMLCBhQnVmZmVyLT5nZXRDYXBhY2l0eSgpKSApOworLy8KKy8vCXJldHVybiggYmZUUyApOworCisJcmV0dXJuKCBUeXBlTWFuYWdlcjo6QlVGRkVSICk7Cit9CisKK3N0YXRpYyBjb25zdCBUeXBlU3BlY2lmaWVyICYgZ2V0U3BlY2lmaWVyVHlwZShCYXNlQXZtUHJvZ3JhbSAqIGFDb250YWluZXIsCisJCWF2bV90eXBlX3NwZWNpZmllcl9raW5kX3QgYVNwZWNpZmllcktpbmQsIGF2bV9zaXplX3QgYUNhcGFjaXR5KQoreworLy8JVHlwZVNwZWNpZmllciBiZlRTKCBUeXBlTWFuYWdlcjo6bmV3Q29sbGVjdGlvbihEYXRhVHlwZTo6QlVGRkVSLAorLy8JCQlhU3BlY2lmaWVyS2luZCwgVHlwZU1hbmFnZXI6OlVOSVZFUlNBTCwgYUNhcGFjaXR5KSApOworLy8KKy8vCXJldHVybiggYmZUUyApOworCisJcmV0dXJuKCBUeXBlTWFuYWdlcjo6QlVGRkVSICk7Cit9CisKKworLyoqCisgKiBDT05TVFJVQ1RPUgorICogRGVmYXVsdAorICovCitJbnN0YW5jZU9mQnVmZmVyOjpJbnN0YW5jZU9mQnVmZmVyKAorCQlCYXNlQXZtUHJvZ3JhbSAqIGFDb250YWluZXIsIEJ1ZmZlciAqIGFCdWZmZXIsIGF2bV9vZmZzZXRfdCBhbk9mZnNldCkKKzogQmFzZUluc3RhbmNlRm9ybShDTEFTU19LSU5EX1QoIEluc3RhbmNlT2ZCdWZmZXIgKSwgYUNvbnRhaW5lciwgYUJ1ZmZlciwKKwkJZ2V0U3BlY2lmaWVyVHlwZShhQ29udGFpbmVyLCBhQnVmZmVyKSwgYW5PZmZzZXQpLAorbVBvbGljeVNwZWNpZmllcktpbmQoIGFCdWZmZXItPmdldFBvbGljeVNwZWNpZmllcktpbmQoKSApLAorbUNhcGFjaXR5KCBhQnVmZmVyLT5nZXRDYXBhY2l0eSgpICkKK3sKKworfQorCisKK0luc3RhbmNlT2ZCdWZmZXI6Okluc3RhbmNlT2ZCdWZmZXIoCUJhc2VBdm1Qcm9ncmFtICogYUNvbnRhaW5lciwKKwkJQnVmZmVyICogYUNvbXBpbGVkLCBhdm1fb2Zmc2V0X3QgYW5PZmZzZXQsCisJCWF2bV90eXBlX3NwZWNpZmllcl9raW5kX3QgYVNwZWNpZmllcktpbmQsIGxvbmcgYUNhcGFjaXR5KQorOiBCYXNlSW5zdGFuY2VGb3JtKENMQVNTX0tJTkRfVCggSW5zdGFuY2VPZkJ1ZmZlciApLCBhQ29udGFpbmVyLCBhQ29tcGlsZWQsCisJCWdldFNwZWNpZmllclR5cGUoYUNvbnRhaW5lciwgYVNwZWNpZmllcktpbmQsIGFDYXBhY2l0eSksIGFuT2Zmc2V0KSwKK21Qb2xpY3lTcGVjaWZpZXJLaW5kKCBhU3BlY2lmaWVyS2luZCApLAorbUNhcGFjaXR5KCAoYUNhcGFjaXR5IDwgMCkgPyBBVk1fTlVNRVJJQ19NQVhfU0laRV9UIDogYUNhcGFjaXR5ICkKK3sKKwkvLyEhIE5PVEhJTkcKK30KKworCisvKioKKyAqIFNlcmlhbGl6YXRpb24KKyAqLwordm9pZCBJbnN0YW5jZU9mQnVmZmVyOjpzdHJIZWFkZXIoT3V0U3RyZWFtICYgb3V0KSBjb25zdAoreworCW91dCA8PCAiYnVmZmVyPCBpZDoiIDw8IGdldE9mZnNldCgpIDw8ICIgPiAiCisJCTw8IEJ1ZmZlcjo6c3RyKG1Qb2xpY3lTcGVjaWZpZXJLaW5kLCByZWFsQ2FwYWNpdHkoKSkgPDwgIiAiCisJCTw8IGdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7Cit9CisKKwordm9pZCBJbnN0YW5jZU9mQnVmZmVyOjp0b1N0cmVhbShPdXRTdHJlYW0gJiBvdXQpIGNvbnN0Cit7CisJaWYoIG91dC5wcmVmZXJhYmx5RlFOKCkgKQorCXsKKwkJb3V0IDw8IFRBQiA8PCBnZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOworCisJCUFWTV9ERUJVR19SRUZfQ09VTlRFUihvdXQpOworCisJCXJldHVybjsKKwl9CisKKwlib29sIGlzRW1wdHkgPSB0cnVlOworCisJb3V0IDw8IFRBQiA8PCBnZXRNb2RpZmllcigpLnRvU3RyaW5nKCkKKwkJPDwgImJ1ZmZlcjwgaWQ6IiA8PCBnZXRPZmZzZXQoKSA8PCAiID4gIgorCQk8PCBCdWZmZXI6OnN0cihtUG9saWN5U3BlY2lmaWVyS2luZCwgcmVhbENhcGFjaXR5KCkpCisJCTw8ICIgIiA8PCBnZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOworCUFWTV9ERUJVR19SRUZfQ09VTlRFUihvdXQpOworCisKK0FWTV9JRl9ERUJVR19GTEFHKCBDT01QSUxJTkcgKQorCW91dCA8PCAiIHsiIDw8IEVPTDsgaXNFbXB0eSA9IGZhbHNlOworCisJaWYoIGhhc0FzdEVsZW1lbnQoKSApCisJeworCQlvdXQgPDwgVEFCMiA8PCAiLy9jb21waWxlZCA9ICIKKwkJCTw8IGdldEFzdEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIjsiIDw8IEVPTDsKKwl9CisKKwlvdXQgPDwgVEFCMiA8PCAiLy9jb250YWluZXIgPSAiCisJCTw8IChoYXNDb250YWluZXIoKSA/IGdldENvbnRhaW5lcigpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDogIk5VTEwiKQorCQk8PCAiOyIgPDwgRU9MOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIENPTVBJTElORyApCisKKwlpZiggaGFzQWxpYXNUYXJnZXQoKSApCisJeworCQlpZiggaXNFbXB0eSApIHsgb3V0IDw8ICIgeyIgPDwgRU9MOyBpc0VtcHR5ID0gZmFsc2U7IH0KKwkJb3V0IDw8IFRBQjIgPDwgInRhcmdldCA9ICIKKwkJCTw8IHN0cl9oZWFkZXIoIGdldEFsaWFzVGFyZ2V0KCktPmFzPCBJbnN0YW5jZU9mQnVmZmVyID4oKSApCisJCQk8PCAiOyIgPDwgRU9MOworCX0KKworCWlmKCBoYXNDcmVhdG9yQ29udGFpbmVyUklEKCkgKQorCXsKKwkJaWYoIGlzRW1wdHkgKSB7IG91dCA8PCAiIHsiIDw8IEVPTDsgaXNFbXB0eSA9IGZhbHNlOyB9CisJCW91dCA8PCBUQUIyIDw8ICJyaWQjY3JlYXRvciA9ICIgPDwgZ2V0Q3JlYXRvckNvbnRhaW5lclJJRCgpLnN0cigpCisJCQk8PCAiOyIgPDwgRU9MOworCX0KKworCWlmKCBoYXNSdW50aW1lQ29udGFpbmVyUklEKCkgKQorCXsKKwkJaWYoIGlzRW1wdHkgKSB7IG91dCA8PCAiIHsiIDw8IEVPTDsgaXNFbXB0eSA9IGZhbHNlOyB9CisJCW91dCA8PCBUQUIyIDw8ICJyaWQjY29udGFpbmVyID0gIiA8PCBnZXRSdW50aW1lQ29udGFpbmVyUklEKCkuc3RyKCkKKwkJCTw8ICI7IiA8PCBFT0w7CisJfQorCisJaWYoIGhhc01hY2hpbmVQYXRoKCkgKQorCXsKKwkJaWYoIGlzRW1wdHkgKSB7IG91dCA8PCAiIHsiIDw8IEVPTDsgaXNFbXB0eSA9IGZhbHNlOyB9CisKKwkJb3V0IDw8IFRBQiA8PCAicGF0aCNtYWNoaW5lOiIgPDwgRU9MOworCQlBcnJheU9mSW5zdGFuY2VPZk1hY2hpbmU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZ2V0TWFjaGluZVBhdGgoKS0+YmVnaW4oKTsKKwkJQXJyYXlPZkluc3RhbmNlT2ZNYWNoaW5lOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IGdldE1hY2hpbmVQYXRoKCktPmVuZCgpOworCQlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJeworCQkJb3V0IDw8IFRBQjIgPDwgKCppdCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgRU9MOworCQl9CisJfQorCisJKCBpc0VtcHR5ID8gKG91dCA8PCAiOyIpIDogKG91dCA8PCBUQUIgPDwgIn0iKSApIDw8IEVPTF9GTFVTSDsKK30KKworCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZCdWZmZXIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZCdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODU5MjI1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZkJ1ZmZlci5oCkBAIC0wLDAgKzEsMTU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjEgbWFycyAyMDExCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgSU5TVEFOQ0VPRkJVRkZFUl9IXworI2RlZmluZSBJTlNUQU5DRU9GQlVGRkVSX0hfCisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9CYXNlSW5zdGFuY2VGb3JtLmg+CisKKyNpbmNsdWRlIDxjb21tb24vQXZtUG9pbnRlci5oPgorCisjaW5jbHVkZSA8Zm1sL2xpYi9JVHlwZVNwZWNpZmllci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworY2xhc3MgQmFzZUF2bVByb2dyYW07CitjbGFzcyBCdWZmZXI7CisKKworY2xhc3MgSW5zdGFuY2VPZkJ1ZmZlciA6CisJCXB1YmxpYyBCYXNlSW5zdGFuY2VGb3JtLAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIEluc3RhbmNlT2ZCdWZmZXIgKQoreworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIEluc3RhbmNlT2ZCdWZmZXIgKQorCisKK3Byb3RlY3RlZDoKKwkvKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlhdm1fdHlwZV9zcGVjaWZpZXJfa2luZF90IG1Qb2xpY3lTcGVjaWZpZXJLaW5kOworCisJYXZtX3NpemVfdCBtQ2FwYWNpdHk7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUluc3RhbmNlT2ZCdWZmZXIoQmFzZUF2bVByb2dyYW0gKiBhQ29udGFpbmVyLAorCQkJQnVmZmVyICogYUJ1ZmZlciwgYXZtX29mZnNldF90IGFuT2Zmc2V0KTsKKworCUluc3RhbmNlT2ZCdWZmZXIoQmFzZUF2bVByb2dyYW0gKiBhQ29udGFpbmVyLCBCdWZmZXIgKiBhQ29tcGlsZWQsCisJCQlhdm1fb2Zmc2V0X3QgYW5PZmZzZXQsIGF2bV90eXBlX3NwZWNpZmllcl9raW5kX3QgYVNwZWNpZmllcktpbmQsCisJCQlsb25nIGFDYXBhY2l0eSk7CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIGNvcHkKKwkgKi8KKwlJbnN0YW5jZU9mQnVmZmVyKGNvbnN0IEluc3RhbmNlT2ZCdWZmZXIgJiBhQnVmZmVyKQorCTogQmFzZUluc3RhbmNlRm9ybSggYUJ1ZmZlciApLAorCW1Qb2xpY3lTcGVjaWZpZXJLaW5kKCBhQnVmZmVyLm1Qb2xpY3lTcGVjaWZpZXJLaW5kICksCisJbUNhcGFjaXR5KCBhQnVmZmVyLm1DYXBhY2l0eSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIGZvciBBbGlhcworCSAqLworCUluc3RhbmNlT2ZCdWZmZXIoQmFzZUF2bVByb2dyYW0gKiBhQ29udGFpbmVyLCBJbnN0YW5jZU9mQnVmZmVyICogYVRhcmdldCwKKwkJCVZlY3Rvck9mSW5zdGFuY2VPZk1hY2hpbmUgJiBhUmVsYXRpdmVNYWNoaW5lUGF0aCkKKwk6IEJhc2VJbnN0YW5jZUZvcm0oQ0xBU1NfS0lORF9UKCBJbnN0YW5jZU9mQnVmZmVyICksCisJCQlhQ29udGFpbmVyLCBhVGFyZ2V0LCBhUmVsYXRpdmVNYWNoaW5lUGF0aCksCisJbVBvbGljeVNwZWNpZmllcktpbmQoIGFUYXJnZXQtPm1Qb2xpY3lTcGVjaWZpZXJLaW5kICksCisJbUNhcGFjaXR5KCBhVGFyZ2V0LT5tQ2FwYWNpdHkgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+SW5zdGFuY2VPZkJ1ZmZlcigpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1Qb2xpY3lTcGVjaWZpZXJLaW5kCisJICovCisJaW5saW5lIGF2bV90eXBlX3NwZWNpZmllcl9raW5kX3QgZ2V0UG9saWN5U3BlY2lmaWVyS2luZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Qb2xpY3lTcGVjaWZpZXJLaW5kICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0UG9saWN5U3BlY2lmaWVyS2luZChhdm1fdHlwZV9zcGVjaWZpZXJfa2luZF90IGFTcGVjaWZpZXJLaW5kKQorCXsKKwkJbVBvbGljeVNwZWNpZmllcktpbmQgPSBhU3BlY2lmaWVyS2luZDsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1DYXBhY2l0eQorCSAqLworCWlubGluZSBhdm1fc2l6ZV90IGNhcGFjaXR5KCkgY29uc3QKKwl7CisJCXJldHVybiggbUNhcGFjaXR5ICk7CisJfQorCisJaW5saW5lIGxvbmcgcmVhbENhcGFjaXR5KCkgY29uc3QKKwl7CisJCXJldHVybiggKG1DYXBhY2l0eSA9PSBBVk1fTlVNRVJJQ19NQVhfU0laRV9UKT8gLTEgOiBtQ2FwYWNpdHkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRDYXBhY2l0eShsb25nIGFDYXBhY2l0eSkKKwl7CisJCW1DYXBhY2l0eSA9IChhQ2FwYWNpdHkgPCAwKSA/IEFWTV9OVU1FUklDX01BWF9TSVpFX1QgOiBhQ2FwYWNpdHk7CisJfQorCisJaW5saW5lIGJvb2wgaXNGaW5pdGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQ2FwYWNpdHkgPCBBVk1fTlVNRVJJQ19NQVhfU0laRV9UICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNJbmZpbml0ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1DYXBhY2l0eSA9PSBBVk1fTlVNRVJJQ19NQVhfU0laRV9UICk7CisJfQorCisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJdm9pZCBzdHJIZWFkZXIoT3V0U3RyZWFtICYgb3V0KSBjb25zdDsKKworCXZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3V0KSBjb25zdDsKKworfTsKKworCit9CisKKyNlbmRpZiAvKiBJTlNUQU5DRU9GQlVGRkVSX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mQ29ubmVjdC5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mQ29ubmVjdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU5MGQ1ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZDb25uZWN0LmNwcApAQCAtMCwwICsxLDE0NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDIxIG1hcnMgMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiSW5zdGFuY2VPZkNvbm5lY3QuaCIKKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVGb3JtLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZk1hY2hpbmUuaD4KKworI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Db25uZWN0b3IuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL1J1bnRpbWVJRC5oPgorCisjaW5jbHVkZSA8Zm1sL3R5cGUvVHlwZU1hbmFnZXIuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoqCisgKiBDT05TVFJVQ1RPUgorICogRGVmYXVsdAorICovCitJbnN0YW5jZU9mQ29ubmVjdDo6SW5zdGFuY2VPZkNvbm5lY3QoQmFzZUF2bVByb2dyYW0gKiBhQ29udGFpbmVyLAorCQljb25zdCBDb25uZWN0b3IgKiBhQ29ubmVjdG9yLCBhdm1fb2Zmc2V0X3QgYW5PZmZzZXQsCisJCUNvbVByb3RvY29sOjpQUk9UT0NPTF9LSU5EIGFQcm90b2NvbCwgQ29tUHJvdG9jb2w6OlBST1RPQ09MX0tJTkQgYUNhc3QpCis6IEJhc2VJbnN0YW5jZUZvcm0oQ0xBU1NfS0lORF9UKCBJbnN0YW5jZU9mQ29ubmVjdCApLCBhQ29udGFpbmVyLCBhQ29ubmVjdG9yLAorCQlUeXBlTWFuYWdlcjo6Q09OTkVDVE9SLCBhbk9mZnNldCksCittVHJhbnNmZXJ0RmxhZyggZmFsc2UgKSwKKworbU1JRCggMCApLAorCittUHJvdG9jb2woIGFQcm90b2NvbCApLAorbUNhc3QoIGFDYXN0ICksCisKK21PdXRwdXRDb21Sb3V0ZURhdGEoIGFDb25uZWN0b3IgLCBNb2RpZmllcjo6RElSRUNUSU9OX09VVFBVVF9LSU5EICksCittSW5wdXRDb21Sb3V0ZURhdGEgKCBhQ29ubmVjdG9yICwgTW9kaWZpZXI6OkRJUkVDVElPTl9JTlBVVF9LSU5EICApCit7CisJLy8hISBOT1RISU5HCit9CisKKworCisvKioKKyAqIFNlcmlhbGl6YXRpb24KKyAqLwordm9pZCBJbnN0YW5jZU9mQ29ubmVjdDo6c3RySGVhZGVyKE91dFN0cmVhbSAmIG91dCkgY29uc3QKK3sKKwlvdXQgPDwgImNvbm5lY3RvcjwgaWQ6IiA8PCBnZXRPZmZzZXQoKSA8PCAiICwgbWlkOiIgPDwgZ2V0TUlEKCkgPDwgIiA+ICIKKwkJPDwgQ29ubmVjdG9yOjpzdHJQcm90b2NvbChtUHJvdG9jb2wsIG1DYXN0KQorCQk8PCAiICIgPDwgZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsKK30KKworCit2b2lkIEluc3RhbmNlT2ZDb25uZWN0Ojp0b1N0cmVhbShPdXRTdHJlYW0gJiBvdXQpIGNvbnN0Cit7CisJaWYoIG91dC5wcmVmZXJhYmx5RlFOKCkgKQorCXsKKwkJb3V0IDw8IFRBQiA8PCBnZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOworCisJCUFWTV9ERUJVR19SRUZfQ09VTlRFUihvdXQpOworCisJCXJldHVybjsKKwl9CisKKwlvdXQgPDwgVEFCIDw8IGdldE1vZGlmaWVyKCkudG9TdHJpbmcoKSA8PCAiY29ubmVjdG9yPCBpZDoiIDw8IGdldE9mZnNldCgpCisJCTw8ICIgLCBtaWQ6IiA8PCBnZXRNSUQoKSA8PCAiICwgIgorCQk8PCBDb25uZWN0b3I6OnN0clByb3RvY29sKG1Qcm90b2NvbCwgbUNhc3QpIDw8ICIgPiAiCisJCTw8IGdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7CisJQVZNX0RFQlVHX1JFRl9DT1VOVEVSKG91dCk7CisJb3V0IDw8ICIgeyIgPDwgRU9MOworCitBVk1fSUZfREVCVUdfRkxBRyggQ09NUElMSU5HICkKKwlpZiggaGFzQXN0RWxlbWVudCgpICkKKwl7CisJCW91dCA8PCBUQUIyIDw8ICIvL2NvbXBpbGVkID0gIgorCQkJPDwgZ2V0QXN0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiOyIgPDwgRU9MOworCX0KKworCW91dCA8PCBUQUIyIDw8ICIvL2NvbnRhaW5lciA9ICIKKwkJPDwgKGhhc0NvbnRhaW5lcigpID8gZ2V0Q29udGFpbmVyKCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgOiAiTlVMTCIpCisJCTw8ICI7IiA8PCBFT0w7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggQ09NUElMSU5HICkKKworCWlmKCBoYXNBbGlhc1RhcmdldCgpICkKKwl7CisJCW91dCA8PCBUQUIyIDw8ICJ0YXJnZXQgPSAiCisJCQk8PCBzdHJfaGVhZGVyKCBnZXRBbGlhc1RhcmdldCgpLT5hczwgSW5zdGFuY2VPZkNvbm5lY3QgPigpICkKKwkJCTw8ICI7IiA8PCBFT0w7CisJfQorCisJaWYoIGhhc0NyZWF0b3JDb250YWluZXJSSUQoKSApCisJeworCQlvdXQgPDwgVEFCMiA8PCAicmlkI2NyZWF0b3IgPSAiIDw8IGdldENyZWF0b3JDb250YWluZXJSSUQoKS5zdHIoKQorCQkJPDwgIjsiIDw8IEVPTDsKKwl9CisKKwlpZiggaGFzUnVudGltZUNvbnRhaW5lclJJRCgpICkKKwl7CisJCW91dCA8PCBUQUIyIDw8ICJyaWQjY29udGFpbmVyID0gIiA8PCBnZXRSdW50aW1lQ29udGFpbmVyUklEKCkuc3RyKCkKKwkJCTw8ICI7IiA8PCBFT0w7CisJfQorCisJaWYoIGhhc01hY2hpbmVQYXRoKCkgKQorCXsKKwkJb3V0IDw8IFRBQiA8PCAicGF0aCNtYWNoaW5lOiIgPDwgRU9MOworCQlBcnJheU9mSW5zdGFuY2VPZk1hY2hpbmU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZ2V0TWFjaGluZVBhdGgoKS0+YmVnaW4oKTsKKwkJQXJyYXlPZkluc3RhbmNlT2ZNYWNoaW5lOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IGdldE1hY2hpbmVQYXRoKCktPmVuZCgpOworCQlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJeworCQkJb3V0IDw8IFRBQjIgPDwgKCppdCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgRU9MOworCQl9CisJfQorCisJb3V0IDw8IElOQ1JfSU5ERU5UOworCisJaWYoIGhhc091dHB1dENvbVJvdXRlRGF0YSgpICkKKwl7CisJCWdldE91dHB1dENvbVJvdXRlRGF0YSgpLnRvU3RyZWFtKG91dCk7CisJfQorCisJaWYoIGhhc0lucHV0Q29tUm91dGVEYXRhKCkgKQorCXsKKwkJZ2V0SW5wdXRDb21Sb3V0ZURhdGEoKS50b1N0cmVhbShvdXQpOworCX0KKworCW91dCA8PCBERUNSX0lOREVOVF9UQUIgPDwgIn0iIDw8IEVPTF9GTFVTSDsKK30KKworCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZDb25uZWN0LmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mQ29ubmVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YmM2ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mQ29ubmVjdC5oCkBAIC0wLDAgKzEsMjYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjEgbWFycyAyMDExCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgSU5TVEFOQ0VPRkNPTk5FQ1RfSF8KKyNkZWZpbmUgSU5TVEFOQ0VPRkNPTk5FQ1RfSF8KKworI2luY2x1ZGUgPGNvbW1vbi9Bdm1Qb2ludGVyLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9CYXNlSW5zdGFuY2VGb3JtLmg+CisKKyNpbmNsdWRlIDxjb2xsZWN0aW9uL1R5cGVkZWYuaD4KKworI2luY2x1ZGUgPGZtbC9saWIvSUNvbVBvaW50Lmg+CisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9Db21Sb3V0ZURhdGEuaD4KKworI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Db21Qcm90b2NvbC5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Db25uZWN0b3IuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworY2xhc3MgQmFzZUF2bVByb2dyYW07CitjbGFzcyBDb25uZWN0b3I7CisKKworY2xhc3MgSW5zdGFuY2VPZkNvbm5lY3QgOgorCQlwdWJsaWMgQmFzZUluc3RhbmNlRm9ybSAsCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggSW5zdGFuY2VPZkNvbm5lY3QgKQoreworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIEluc3RhbmNlT2ZDb25uZWN0ICkKKworCitwcm90ZWN0ZWQ6CisJLyoKKwkgKiBBVFRSSUJVVEVTCisJICovCisJLy8gVGhlIFRyYW5zZmVydCBGbGFnCisJYm9vbCBtVHJhbnNmZXJ0RmxhZzsKKworCS8vIFRoZSBNZXNzYWdlIElEZW50aWZpZXIKKwlhdm1fc2l6ZV90IG1NSUQ7CisKKwkvLyBnbG9iYWwgQ29tUm91dGUgcHJvdG9jb2wgJiBjYXN0CisJQ29tUHJvdG9jb2w6OlBST1RPQ09MX0tJTkQgbVByb3RvY29sOworCUNvbVByb3RvY29sOjpQUk9UT0NPTF9LSU5EIG1DYXN0OworCisJQ29tUm91dGVEYXRhIG1PdXRwdXRDb21Sb3V0ZURhdGE7CisJQ29tUm91dGVEYXRhIG1JbnB1dENvbVJvdXRlRGF0YTsKKworCitwdWJsaWM6CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlJbnN0YW5jZU9mQ29ubmVjdChCYXNlQXZtUHJvZ3JhbSAqIGFDb250YWluZXIsIGNvbnN0IENvbm5lY3RvciAqIGFDb25uZWN0b3IsCisJCQlhdm1fb2Zmc2V0X3QgYW5PZmZzZXQsIENvbVByb3RvY29sOjpQUk9UT0NPTF9LSU5EIGFQcm90b2NvbCwKKwkJCUNvbVByb3RvY29sOjpQUk9UT0NPTF9LSU5EIGFDYXN0KTsKKworCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBjb3B5CisJICovCisJSW5zdGFuY2VPZkNvbm5lY3QoY29uc3QgSW5zdGFuY2VPZkNvbm5lY3QgJiBhQ29ubmVjdCkKKwk6IEJhc2VJbnN0YW5jZUZvcm0oIGFDb25uZWN0ICksCisJbVRyYW5zZmVydEZsYWcoIGFDb25uZWN0Lm1UcmFuc2ZlcnRGbGFnICksCisKKwltTUlEKCBhQ29ubmVjdC5tTUlEICksCisKKwltUHJvdG9jb2woIGFDb25uZWN0Lm1Qcm90b2NvbCApLAorCW1DYXN0KCBhQ29ubmVjdC5tQ2FzdCApLAorCisJbU91dHB1dENvbVJvdXRlRGF0YSggYUNvbm5lY3QubU91dHB1dENvbVJvdXRlRGF0YSApLAorCW1JbnB1dENvbVJvdXRlRGF0YSggYUNvbm5lY3QubUlucHV0Q29tUm91dGVEYXRhICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBmb3IgQWxpYXMKKwkgKi8KKwlJbnN0YW5jZU9mQ29ubmVjdChCYXNlQXZtUHJvZ3JhbSAqIGFDb250YWluZXIsIEluc3RhbmNlT2ZDb25uZWN0ICogYVRhcmdldCwKKwkJCVZlY3Rvck9mSW5zdGFuY2VPZk1hY2hpbmUgJiBhUmVsYXRpdmVNYWNoaW5lUGF0aCkKKwk6IEJhc2VJbnN0YW5jZUZvcm0oQ0xBU1NfS0lORF9UKCBJbnN0YW5jZU9mQ29ubmVjdCApLAorCQkJYUNvbnRhaW5lciwgYVRhcmdldCwgYVJlbGF0aXZlTWFjaGluZVBhdGgpLAorCW1UcmFuc2ZlcnRGbGFnKCBhVGFyZ2V0LT5tVHJhbnNmZXJ0RmxhZyApLAorCisJbU1JRCggYVRhcmdldC0+bU1JRCApLAorCisJbVByb3RvY29sKCBhVGFyZ2V0LT5tUHJvdG9jb2wgKSwKKwltQ2FzdCggYVRhcmdldC0+bUNhc3QgKSwKKworCW1PdXRwdXRDb21Sb3V0ZURhdGEoIGFUYXJnZXQtPm1PdXRwdXRDb21Sb3V0ZURhdGEgKSwKKwltSW5wdXRDb21Sb3V0ZURhdGEoIGFUYXJnZXQtPm1JbnB1dENvbVJvdXRlRGF0YSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5JbnN0YW5jZU9mQ29ubmVjdCgpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIENvbXBpbGVkIE9iamVjdEVsZW1lbnQgYXMgQ29tcGlsZWQgQ09ubmVjdG9yCisJICovCisJaW5saW5lIGNvbnN0IENvbm5lY3RvciAqIGdldEFzdENvbm5lY3RvcigpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldEFzdEVsZW1lbnQoKS0+YXM8IENvbm5lY3RvciA+KCkgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1NSUQKKwkgKi8KKwlpbmxpbmUgYXZtX3NpemVfdCBnZXRNSUQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtTUlEICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0TUlEKGF2bV9zaXplX3QgbWlkKQorCXsKKwkJbU1JRCA9IG1pZDsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1Qcm90b2NvbAorCSAqLworCWlubGluZSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfS0lORCBnZXRQcm90b2NvbCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Qcm90b2NvbCApOworCX0KKworCWlubGluZSBib29sIGhhc1Byb3RvY29sKCkgY29uc3QKKwl7CisJCXJldHVybiggbVByb3RvY29sICE9IENvbVByb3RvY29sOjpQUk9UT0NPTF9VTkRFRklORURfS0lORCApOworCX0KKworCWlubGluZSB2b2lkIHNldFByb3RvY29sKENvbVByb3RvY29sOjpQUk9UT0NPTF9LSU5EIGFQcm90b2NvbCkKKwl7CisJCW1Qcm90b2NvbCA9IGFQcm90b2NvbDsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1DYXN0CisJICovCisJaW5saW5lIENvbVByb3RvY29sOjpQUk9UT0NPTF9LSU5EIGdldENhc3QoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQ2FzdCApOworCX0KKworCWlubGluZSBib29sIGhhc0Nhc3QoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQ2FzdCAhPSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfVU5ERUZJTkVEX0tJTkQgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRDYXN0KENvbVByb3RvY29sOjpQUk9UT0NPTF9LSU5EIGFDYXN0KQorCXsKKwkJbUNhc3QgPSBhQ2FzdDsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRQcm90b2NvbENhc3QoQ29tUHJvdG9jb2w6OlBST1RPQ09MX0tJTkQgYVByb3RvY29sLAorCQkJQ29tUHJvdG9jb2w6OlBST1RPQ09MX0tJTkQgYUNhc3QpCisJeworCQltUHJvdG9jb2wgPSBhUHJvdG9jb2w7CisJCW1DYXN0ID0gYUNhc3Q7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtT3V0cHV0Q29tUm91dGVEYXRhCisJICovCisJaW5saW5lIENvbVJvdXRlRGF0YSAmIGdldE91dHB1dENvbVJvdXRlRGF0YSgpCisJeworCQlyZXR1cm4oIG1PdXRwdXRDb21Sb3V0ZURhdGEgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQ29tUm91dGVEYXRhICYgZ2V0T3V0cHV0Q29tUm91dGVEYXRhKCkgY29uc3QKKwl7CisJCXJldHVybiggbU91dHB1dENvbVJvdXRlRGF0YSApOworCX0KKworCWlubGluZSBib29sIGhhc091dHB1dENvbVJvdXRlRGF0YSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1PdXRwdXRDb21Sb3V0ZURhdGEuaGFzTWFjaGluZVBvcnRzKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBhcHBlbmRPdXRwdXRDb21Sb3V0ZURhdGEoUGFpck1hY2hpbmVQb3J0ICYgYU1hY2hpbmVQb3J0KQorCXsKKwkJbU91dHB1dENvbVJvdXRlRGF0YS5hcHBlbmRNYWNoaW5lUG9ydChhTWFjaGluZVBvcnQpOworCX0KKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1JbnB1dENvbVJvdXRlRGF0YQorCSAqLworCWlubGluZSBDb21Sb3V0ZURhdGEgJiBnZXRJbnB1dENvbVJvdXRlRGF0YSgpCisJeworCQlyZXR1cm4oIG1JbnB1dENvbVJvdXRlRGF0YSApOworCX0KKworCWlubGluZSBjb25zdCBDb21Sb3V0ZURhdGEgJiBnZXRJbnB1dENvbVJvdXRlRGF0YSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1JbnB1dENvbVJvdXRlRGF0YSApOworCX0KKworCWlubGluZSBib29sIGhhc0lucHV0Q29tUm91dGVEYXRhKCkgY29uc3QKKwl7CisJCXJldHVybiggbUlucHV0Q29tUm91dGVEYXRhLmhhc01hY2hpbmVQb3J0cygpICk7CisJfQorCisJaW5saW5lIHZvaWQgYXBwZW5kSW5wdXRDb21Sb3V0ZURhdGEoUGFpck1hY2hpbmVQb3J0ICYgYU1hY2hpbmVQb3J0KQorCXsKKwkJbUlucHV0Q29tUm91dGVEYXRhLmFwcGVuZE1hY2hpbmVQb3J0KGFNYWNoaW5lUG9ydCk7CisJfQorCisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJdm9pZCBzdHJIZWFkZXIoT3V0U3RyZWFtICYgb3V0KSBjb25zdDsKKworCXZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3V0KSBjb25zdDsKKworfTsKKworCit9CisKKyNlbmRpZiAvKiBJTlNUQU5DRU9GQ09OTkVDVF9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZkRhdGEuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZkRhdGEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNDgyMjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mRGF0YS5jcHAKQEAgLTAsMCArMSw1MDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiA1IGFvw7t0IDIwMDgKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkluc3RhbmNlT2ZEYXRhLmgiCisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9Bdm1Qcm9ncmFtLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvQmFzZUF2bVByb2dyYW0uaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mTWFjaGluZS5oPgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQnVpbHRpbkFycmF5Lmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkZhY3RvcnkuaD4KKworI2luY2x1ZGUgPGZtbC9zeW1ib2wvVGFibGVPZlN5bWJvbC5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvUnVudGltZUlELmg+CisKKyNpbmNsdWRlIDxmbWwvdHlwZS9Db250YWluZXJUeXBlU3BlY2lmaWVyLmg+CisjaW5jbHVkZSA8Zm1sL3R5cGUvRW51bVR5cGVTcGVjaWZpZXIuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoqCisgKiBERUZBVUxUCisgKiBFbXB0eSBUYWJsZU9mU3ltYm9sCisgKi8KK1RhYmxlT2ZTeW1ib2wgSW5zdGFuY2VPZkRhdGE6Ok5VTExfVEFCTEVfT0ZfU1lNQk9MKDApOworCisKKy8qKgorICogU0VUVEVSCisgKiB1cGRhdGVGdWxseVF1YWxpZmllZE5hbWVJRCgpCisgKi8KK3ZvaWQgSW5zdGFuY2VPZkRhdGE6OnVwZGF0ZUZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKK3sKKwlpZiggaGFzQXN0RWxlbWVudCgpICkKKwl7CisJCXN0ZDo6c3RyaW5nIGFGdWxseVF1YWxpZmllZE5hbWVJRCA9IGdldEFzdEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7CisKKwkJc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBwb3MgPQorCQkJCWFGdWxseVF1YWxpZmllZE5hbWVJRC5maW5kKEZRTl9JRF9ST09UX1NFUEFSQVRPUik7CisJCWlmKCBwb3MgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorCQl7CisJCQlzZXRGdWxseVF1YWxpZmllZE5hbWVJRCggKGdldE1vZGlmaWVyKCkuaGFzRmVhdHVyZUNvbnN0KCkgPworCQkJCQkiY29uc3QiIDogImluc3QiKSArIGFGdWxseVF1YWxpZmllZE5hbWVJRC5zdWJzdHIocG9zKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJc2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoIGFGdWxseVF1YWxpZmllZE5hbWVJRCApOworCQl9CisJfQorCWVsc2UgaWYoIGlzVHlwZWRFbnVtKCkgKQorCXsKKwkJc3RkOjpzdHJpbmcgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEID0gZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsKKworCQlzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIHBvcyA9CisJCQkJYUZ1bGx5UXVhbGlmaWVkTmFtZUlELmZpbmQoRlFOX0lEX1JPT1RfU0VQQVJBVE9SKTsKKworCQlpZiggcG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKwkJeworCQkJc2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoICJlbnVtIiArIGFGdWxseVF1YWxpZmllZE5hbWVJRC5zdWJzdHIocG9zKSApOworCQl9CisJfQorCWVsc2UKKwl7CisJCXNldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCIiKTsKKwl9CisKKwl1cGRhdGVOYW1lSUQoKTsKK30KKworCisvKioKKyAqIEdFVFRFUiAtIFNFVFRFUgorICogVGhlIElkZW50aWZpZXIKKyAqLwordm9pZCBJbnN0YW5jZU9mRGF0YTo6dXBkYXRlTmFtZUlEKCkKK3sKKwlpZiggaGFzUGFyZW50KCkgKQorCXsKKwkJc3RkOjpzdHJpbmcgdWZpU3VmZml4ID0KKwkJCQlOYW1lZEVsZW1lbnQ6OmV4dHJhY3ROYW1lSUQoIG1GdWxseVF1YWxpZmllZE5hbWVJRCApOworCisJCWlmKCBnZXRQYXJlbnQoKS0+Z2V0VHlwZVNwZWNpZmllcigpLT5pc1R5cGVkQXJyYXkoKSApCisJCXsKKwkJCUluc3RhbmNlT2ZEYXRhICogYVBhcmVudCA9IGdldFBhcmVudCgpOworCQkJd2hpbGUoIChhUGFyZW50ICE9IE5VTEwpICYmCisJCQkJCWFQYXJlbnQtPmdldFR5cGVTcGVjaWZpZXIoKS0+aXNUeXBlZEFycmF5KCkgKQorCQkJeworCQkJCWFQYXJlbnQgPSBhUGFyZW50LT5nZXRQYXJlbnQoKTsKKwkJCX0KKworCQkJaWYoIGFQYXJlbnQgIT0gTlVMTCApCisJCQl7CisJCQkJc2V0TmFtZUlEKCBhUGFyZW50LT5nZXROYW1lSUQoKSArICIuIiArIHVmaVN1ZmZpeCApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXNldE5hbWVJRCggdWZpU3VmZml4ICk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlzZXROYW1lSUQoIGdldFBhcmVudCgpLT5nZXROYW1lSUQoKSArICIuIiArIHVmaVN1ZmZpeCApOworCQl9CisJfQorCWVsc2UgaWYoIGhhc0RhdGFQYXRoKCkgKQorCXsKKwkJc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKworCQlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBpdCA9IGdldERhdGFQYXRoKCktPmJlZ2luKCk7CisJCVRhYmxlT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gZ2V0RGF0YVBhdGgoKS0+ZW5kKCk7CisJCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQorCQl7CisJCQlzd2l0Y2goICgqaXQpLmdldFBvaW50ZXJOYXR1cmUoKSApCisJCQl7CisJCQkJY2FzZSBJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfRklFTERfQ0xBU1NfQVRUUklCVVRFX05BVFVSRToKKwkJCQljYXNlIElQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9GSUVMRF9DSE9JQ0VfQVRUUklCVVRFX05BVFVSRToKKwkJCQljYXNlIElQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9GSUVMRF9VTklPTl9BVFRSSUJVVEVfTkFUVVJFOgorCQkJCXsKKwkJCQkJb3NzIDw8ICIuIiA8PCBOYW1lZEVsZW1lbnQ6OmV4dHJhY3ROYW1lSUQoICgqaXQpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWNhc2UgSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX0ZJRUxEX0FSUkFZX09GRlNFVF9OQVRVUkU6CisJCQkJeworCQkJCQlvc3MgPDwgIlsiIDw8ICgqaXQpLmdldE9mZnNldCgpIDw8ICJdIjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWNhc2UgSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX0ZJRUxEX0FSUkFZX0lOREVYX05BVFVSRToKKwkJCQl7CisJCQkJCW9zcyA8PCAiWyIgPDwgKCppdCkuc3RyVmFsdWUoKSA8PCAiXSI7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJCQk8PCAiSW5zdGFuY2VPZkRhdGE6OnVwZGF0ZU5hbWVJRDo+IFVuZXhwZWN0ZWQgIgorCQkJCQkJCQkiUE9JTlRFUiBOQVRVUkUgZm9yIHRoZSBpbnN0YW5jZSBvZiBkYXRhIDo+XG4iCisJCQkJCQkJPDwgKCppdCkudG9TdHJpbmcoIEFWTV9UQUIxX0lOREVOVCApCisJCQkJCQkJPDwgU0VORF9FWElUOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJc2V0TmFtZUlEKCBvc3Muc3RyKCkgKTsKKwl9CisJZWxzZQorCXsKKwkJQmFzZUluc3RhbmNlRm9ybTo6dXBkYXRlTmFtZUlEKCk7CisJfQorfQorCisKKy8qKgorICogR0VUVEVSCisgKiBtT25Xcml0ZVJvdXRpbmUKKyAqLworY29uc3QgQkZDb2RlICYgSW5zdGFuY2VPZkRhdGE6OmdldE9uV3JpdGVDb2RlKCkgY29uc3QKK3sKKwlyZXR1cm4oIChtT25Xcml0ZVJvdXRpbmUgIT0gTlVMTCkgPworCQkJbU9uV3JpdGVSb3V0aW5lLT5nZXRDb2RlKCkgOiBCRkNvZGU6OlJFRl9OVUxMICk7Cit9CisKKworLyoqCisgKiBHRVRURVIgLSBTRVRURVIKKyAqIG1WYWx1ZQorICovCitBcnJheUJGICogSW5zdGFuY2VPZkRhdGE6OmdldEFycmF5VmFsdWUoKSBjb25zdAoreworCXJldHVybiggbVZhbHVlLmFzX3B0cjwgQXJyYXlCRiA+KCkgKTsKK30KKworYm9vbCBJbnN0YW5jZU9mRGF0YTo6aGFzQXJyYXlWYWx1ZSgpIGNvbnN0Cit7CisJcmV0dXJuKCBtVmFsdWUuaXM8IEFycmF5QkYgPigpICk7Cit9CisKKworQnVpbHRpbkFycmF5ICogSW5zdGFuY2VPZkRhdGE6OmdldEJ1aWx0aW5BcnJheVZhbHVlKCkgY29uc3QKK3sKKwlyZXR1cm4oIG1WYWx1ZS5hc19wdHI8IEJ1aWx0aW5BcnJheSA+KCkgKTsKK30KKworYm9vbCBJbnN0YW5jZU9mRGF0YTo6aGFzQnVpbHRpbkFycmF5VmFsdWUoKSBjb25zdAoreworCXJldHVybiggbVZhbHVlLmlzPCBCdWlsdGluQXJyYXkgPigpICk7Cit9CisKKworLyoqCisgKiBHRVRURVIgLSBTRVRURVIKKyAqIG1SZWxhdGl2ZU9mZnNldFBhdGgKKyAqLworc3RkOjpzdHJpbmcgSW5zdGFuY2VPZkRhdGE6OnN0ck9mZnNldFBhdGgoY29uc3Qgc3RkOjpzdHJpbmcgJiB0YWIpIGNvbnN0Cit7CisJaWYoIGhhc0RhdGFQYXRoKCkgKQorCXsKKwkJc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKworCQkvLyArMSBmb3IgPDwgdGhpcyA+PiB3aGljaCBpcyB0aGUgcm9vdCBvZiB0aGUgcGF0aAorCQlhdm1fc2l6ZV90IHBhdGhMZW5ndGggPSBtUmVsYXRpdmVEYXRhUGF0aC0+c2l6ZSgpICsgMTsKKworCQlvc3MgPDwgdGFiIDw8ICJbICIgPDwgbVJlbGF0aXZlT2Zmc2V0UGF0aFswXTsKKwkJZm9yKCBhdm1fc2l6ZV90IGsgPSAxIDsgayA8IHBhdGhMZW5ndGggOyArK2sgKQorCQl7CisJCQlvc3MgPDwgIiAsICIgPDwgbVJlbGF0aXZlT2Zmc2V0UGF0aFtrXTsKKwkJfQorCQlvc3MgPDwgIiBdIjsKKworCQlyZXR1cm4oIG9zcy5zdHIoKSApOworCX0KKworCXJldHVybiggIiIgKTsKK30KKwordm9pZCBJbnN0YW5jZU9mRGF0YTo6dXBkYXRlT2Zmc2V0UGF0aCgpCit7CisJaWYoIGlzVWZpT2Zmc2V0UG9pbnRlcigpICYmIGhhc0RhdGFQYXRoKCkgKQorCXsKKwkJLy8gKzEgZm9yIDw8IHRoaXMgPj4gd2hpY2ggaXMgdGhlIHJvb3Qgb2YgdGhlIHBhdGgKKwkJYXZtX3NpemVfdCBwYXRoTGVuZ3RoID0gbVJlbGF0aXZlRGF0YVBhdGgtPnNpemUoKSArIDE7CisKKwkJbVJlbGF0aXZlT2Zmc2V0UGF0aCA9IG5ldyBhdm1fc2l6ZV90WyBwYXRoTGVuZ3RoIF07CisKKwkJbVJlbGF0aXZlT2Zmc2V0UGF0aFswXSA9IHRoaXMtPmdldE9mZnNldCgpOworCQlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBpdFBhdGggPSBnZXREYXRhUGF0aCgpLT5iZWdpbigpOworCQlmb3IoIGF2bV9zaXplX3QgayA9IDEgOyBrIDwgcGF0aExlbmd0aCA7ICsraywgKytpdFBhdGggKQorCQl7CisJCQltUmVsYXRpdmVPZmZzZXRQYXRoW2tdID0gKCppdFBhdGgpLmdldE9mZnNldCgpOworCQl9CisJfQorfQorCisKKy8qKgorICogR0VUVEVSIC0gU0VUVEVSCisgKiBtUG9pbnRlck5hdHVyZQorICovCitib29sIEluc3RhbmNlT2ZEYXRhOjppc0NvbmNyZXRlQXJyYXlJbmRleCgpCit7CisJcmV0dXJuKCBpc1VmaU9mZnNldFBvaW50ZXIoKSAmJiBoYXNQYXJlbnQoKQorCQkJJiYgZ2V0UGFyZW50KCktPmlzVHlwZWRBcnJheSgpICk7Cit9CisKK2Jvb2wgSW5zdGFuY2VPZkRhdGE6OmlzQ29uY3JldGVTdHJ1Y3RBdHRyaWJ1dGUoKQoreworCXJldHVybiggaGFzUGFyZW50KCkgJiYgaXNVZmlPZmZzZXRQb2ludGVyKCkKKwkJCSYmIGdldFBhcmVudCgpLT5oYXNUeXBlU3RydWN0dXJlT3JDaG9pY2VPclVuaW9uKCkgKTsKK30KKworCisvKioKKyAqIEZvcm1hdCBhIHZhbHVlIHcuci50LiBpdHMgdHlwZQorICovCit2b2lkIEluc3RhbmNlT2ZEYXRhOjpmb3JtYXRTdHJlYW0oCisJCU91dFN0cmVhbSAmIG91dCwgY29uc3QgQkYgJiBiZlZhbHVlKSBjb25zdAoreworCWlmKCBiZlZhbHVlLmlzPCBBcnJheUJGID4oKSApCisJeworCQlmb3JtYXRTdHJlYW0ob3V0LCBiZlZhbHVlLmFzX3JlZjwgQXJyYXlCRiA+KCkpOworCX0KKwllbHNlIGlmKCBoYXNUeXBlU3BlY2lmaWVyKCkgKQorCXsKKwkJZ2V0VHlwZVNwZWNpZmllcigpLT5mb3JtYXRTdHJlYW0ob3V0LCBiZlZhbHVlKTsKKwl9CisJZWxzZQorCXsKKwkJb3V0IDw8IGJmVmFsdWUuc3RyKCk7CisJfQorfQorCisKK3ZvaWQgSW5zdGFuY2VPZkRhdGE6OmZvcm1hdFN0cmVhbSgKKwkJT3V0U3RyZWFtICYgb3V0LCBjb25zdCBBcnJheUJGICYgYXJyYXlWYWx1ZSkgY29uc3QKK3sKKwlpZiggaGFzVHlwZVNwZWNpZmllcigpICkKKwl7CisJCWdldFR5cGVTcGVjaWZpZXIoKS0+Zm9ybWF0U3RyZWFtKG91dCwgYXJyYXlWYWx1ZSk7CisJfQorCWVsc2UKKwl7CisJCW91dCA8PCBhcnJheVZhbHVlWzBdLnN0cigpOworCQlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMSA7IG9mZnNldCA8IGFycmF5VmFsdWUuc2l6ZSgpIDsgKytvZmZzZXQgKQorCQl7CisJCQlvdXQgPDwgIiAsICIgPDwgYXJyYXlWYWx1ZVtvZmZzZXRdLnN0cigpOworCQl9CisJfQorfQorCisKKy8qKgorICogU2VyaWFsaXphdGlvbgorICovCit2b2lkIEluc3RhbmNlT2ZEYXRhOjpzdHJIZWFkZXIoT3V0U3RyZWFtICYgb3V0KSBjb25zdAoreworCW91dCA8PCBnZXRNb2RpZmllcigpLnRvU3RyaW5nKCkgPDwgInZhcjwgaWQ6IiA8PCBnZXRPZmZzZXQoKSA8PCAiLCBwdHI6IgorCQk8PCBJUG9pbnRlckRhdGFOYXR1cmU6OnN0clBvaW50ZXIoIGdldFBvaW50ZXJOYXR1cmUoKSApCisJCTw8ICggaGFzT2Zmc2V0UGF0aCgpID8gc3RyT2Zmc2V0UGF0aCgiLCBtZW06IikgOiAiIiApIDw8ICIgPiAiCisJCTw8ICggaGFzVHlwZVNwZWNpZmllcigpID8gZ2V0VHlwZVNwZWNpZmllcigpLT5zdHJUKCkgOiAiIiApCisJCTw8ICIgIiA8PCBnZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOworCitBVk1fSUZfREVCVUdfRkxBRzJfQU5EKCBDT01QSUxJTkcgLCBRVUFMSUZJRURfTkFNRV9JRCAsIGhhc1ZhbHVlKCkgKQorCW91dCA8PCAiID0iOworCXN0clZhbHVlKCBvdXQgKTsKK0FWTV9FTkRJRl9ERUJVR19GTEFHMl9BTkQoIENPTVBJTElORyAsIFFVQUxJRklFRF9OQU1FX0lEICkKKworCUFWTV9ERUJVR19SRUZfQ09VTlRFUihvdXQpOworfQorCitzdGQ6OnN0cmluZyBJbnN0YW5jZU9mRGF0YTo6c3RySGVhZGVySWQoKSBjb25zdAoreworCVN0cmluZ091dFN0cmVhbSBvc3M7CisKKwlvc3MgPDwgZ2V0TW9kaWZpZXIoKS50b1N0cmluZygpIDw8ICJ2YXI8IGlkOiIgPDwgZ2V0T2Zmc2V0KCkgPDwgIiwgcHRyOiIKKwkJCTw8IElQb2ludGVyRGF0YU5hdHVyZTo6c3RyUG9pbnRlciggZ2V0UG9pbnRlck5hdHVyZSgpICkKKwkJCTw8ICggaGFzT2Zmc2V0UGF0aCgpID8gc3RyT2Zmc2V0UGF0aCgiLCBtZW06IikgOiAiIiApIDw8ICIgPiAiCisJCQk8PCAoIGhhc1R5cGVTcGVjaWZpZXIoKSA/IGdldFR5cGVTcGVjaWZpZXIoKS0+c3RyVCgpIDogIiIgKQorCQkJPDwgIiAiIDw8IGdldE5hbWVJRCgpOworCitBVk1fSUZfREVCVUdfRkxBRzJfQU5EKCBDT01QSUxJTkcgLCBRVUFMSUZJRURfTkFNRV9JRCAsIGhhc1ZhbHVlKCkgKQorCW9zcyA8PCAiID0iOworCXN0clZhbHVlKCBvc3MgKTsKK0FWTV9FTkRJRl9ERUJVR19GTEFHMl9BTkQoIENPTVBJTElORyAsIFFVQUxJRklFRF9OQU1FX0lEICkKKworCXJldHVybiggb3NzLnN0cigpICk7Cit9CisKKwordm9pZCBJbnN0YW5jZU9mRGF0YTo6dG9TdHJlYW0oT3V0U3RyZWFtICYgb3V0KSBjb25zdAoreworCWlmKCBvdXQucHJlZmVyYWJseUZRTigpICkKKwl7CisJCW91dCA8PCBUQUIgPDwgZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsKKworCQlBVk1fREVCVUdfUkVGX0NPVU5URVIob3V0KTsKKworCQlyZXR1cm47CisJfQorCisJYm9vbCBpc0VtcHR5ID0gdHJ1ZTsKKworCW91dCA8PCBUQUIgPDwgZ2V0TW9kaWZpZXIoKS50b1N0cmluZ19ub3QoIE1vZGlmaWVyOjpGRUFUVVJFX0NPTlNUX0tJTkQgKQorCQk8PCAoIGdldE1vZGlmaWVyKCkuaGFzRmVhdHVyZUNvbnN0KCkgPyAiY29uc3QiIDogInZhciIgKQorCQk8PCAiPCBpZDoiIDw8IGdldE9mZnNldCgpIDw8ICIsIHB0cjoiCisJCTw8IElQb2ludGVyRGF0YU5hdHVyZTo6c3RyUG9pbnRlciggZ2V0UG9pbnRlck5hdHVyZSgpICkKKwkJPDwgKCBoYXNPZmZzZXRQYXRoKCkgPyBzdHJPZmZzZXRQYXRoKCIsIG1lbToiKSA6ICIiICkKKwkJPDwgIiA+ICIgOworCisJaWYoIGhhc1R5cGVTcGVjaWZpZXIoKSApCisJeworCQlvdXQgPDwgZ2V0VHlwZVNwZWNpZmllcigpLT5zdHJUKCk7CisJfQorCisJb3V0IDw8ICIgIiA8PCBnZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8ICIgJyIgPDwgZ2V0TmFtZUlEKCkgPDwgIiciOworCUFWTV9ERUJVR19SRUZfQ09VTlRFUihvdXQpOworCisKK0FWTV9JRl9ERUJVR19GTEFHKCBDT01QSUxJTkcgKQorCW91dCA8PCAiIHsiIDw8IEVPTDsgaXNFbXB0eSA9IGZhbHNlOworCisJaWYoIGhhc0FzdEVsZW1lbnQoKSApCisJeworCQlvdXQgPDwgVEFCMiA8PCAiLy9jb21waWxlZCA9ICIKKwkJCTw8IGdldEFzdEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIjsiIDw8IEVPTDsKKwl9CisKKwlvdXQgPDwgVEFCMiA8PCAiLy9jb250YWluZXIgPSAiCisJCTw8IChoYXNDb250YWluZXIoKSA/IGdldENvbnRhaW5lcigpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDogIk5VTEwiKQorCQk8PCAiOyIgPDwgRU9MOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIENPTVBJTElORyApCisKKwlpZiggaGFzUGFyZW50KCkgKQorCXsKKwkJaWYoIGlzRW1wdHkgKSB7IG91dCA8PCAiIHsiIDw8IEVPTDsgaXNFbXB0eSA9IGZhbHNlOyB9CisJCW91dCA8PCBUQUIyIDw8ICJwYXJlbnQgPSAiIDw8IHN0cl9oZWFkZXIoIGdldFBhcmVudCgpICkgPDwgIjsiIDw8IEVPTDsKKwl9CisKKwlpZiggaGFzQWxpYXNUYXJnZXQoKSApCisJeworCQlpZiggaXNFbXB0eSApIHsgb3V0IDw8ICIgeyIgPDwgRU9MOyBpc0VtcHR5ID0gZmFsc2U7IH0KKwkJb3V0IDw8IFRBQjIgPDwgInRhcmdldCA9ICIKKwkJCTw8IHN0cl9oZWFkZXIoIGdldEFsaWFzVGFyZ2V0KCktPmFzPCBJbnN0YW5jZU9mRGF0YSA+KCkgKQorCQkJPDwgIjsiIDw8IEVPTDsKKwl9CisKKwlpZiggaGFzQ3JlYXRvckNvbnRhaW5lclJJRCgpICkKKwl7CisJCWlmKCBpc0VtcHR5ICkgeyBvdXQgPDwgIiB7IiA8PCBFT0w7IGlzRW1wdHkgPSBmYWxzZTsgfQorCQlvdXQgPDwgVEFCMiA8PCAicmlkI2NyZWF0b3IgPSAiIDw8IGdldENyZWF0b3JDb250YWluZXJSSUQoKS5zdHIoKQorCQkJPDwgIjsiIDw8IEVPTDsKKwl9CisKKwlpZiggaGFzUnVudGltZUNvbnRhaW5lclJJRCgpICkKKwl7CisJCWlmKCBpc0VtcHR5ICkgeyBvdXQgPDwgIiB7IiA8PCBFT0w7IGlzRW1wdHkgPSBmYWxzZTsgfQorCQlvdXQgPDwgVEFCMiA8PCAicmlkI2NvbnRhaW5lciA9ICIgPDwgZ2V0UnVudGltZUNvbnRhaW5lclJJRCgpLnN0cigpCisJCQk8PCAiOyIgPDwgRU9MOworCX0KKworCWlmKCBoYXNWYWx1ZSgpICkKKwl7CisJCWlmKCBpc0VtcHR5ICkgeyBvdXQgPDwgIiB7IiA8PCBFT0w7IGlzRW1wdHkgPSBmYWxzZTsgfQorCQlvdXQgPDwgVEFCMiA8PCAidmFsdWUgPSI7CisJCWlmKCBnZXRWYWx1ZSgpLmlzPCBBdm1Db2RlID4oKSApCisJCXsKKwkJCW91dCA8PCBzdHJfaW5kZW50KCBnZXRWYWx1ZSgpLnRvX3B0cjwgQXZtQ29kZSA+KCkgKSA8PCAiOyIgPDwgRU9MOworCQl9CisJCWVsc2UKKwkJeworCQkJc3RyVmFsdWUoIG91dCApOworCQkJb3V0IDw8ICI7IiA8PCBFT0w7CisJCX0KKwl9CisKKwlpZiggaGFzQlZhbHVlKCkgKQorCXsKKwkJaWYoIGlzRW1wdHkgKSB7IG91dCA8PCAiIHsiIDw8IEVPTDsgaXNFbXB0eSA9IGZhbHNlOyB9CisJCW91dCA8PCBUQUIyIDw8ICJidmFsdWUgPSI7CisJCWlmKCBnZXRCVmFsdWUoKS5pczwgQXZtQ29kZSA+KCkgKQorCQl7CisJCQlvdXQgPDwgc3RyX2luZGVudCggZ2V0QlZhbHVlKCkudG9fcHRyPCBBdm1Db2RlID4oKSApIDw8ICI7IiA8PCBFT0w7CisJCX0KKwkJZWxzZQorCQl7CisJCQlzdHJCVmFsdWUoIG91dCApOworCQkJb3V0IDw8ICI7IiA8PCBFT0w7CisJCX0KKwl9CisKKwlpZiggaGFzTWFjaGluZVBhdGgoKSApCisJeworCQlpZiggaXNFbXB0eSApIHsgb3V0IDw8ICIgeyIgPDwgRU9MOyBpc0VtcHR5ID0gZmFsc2U7IH0KKworCQlvdXQgPDwgVEFCIDw8ICJwYXRoI21hY2hpbmU6IiA8PCBFT0w7CisJCUFycmF5T2ZJbnN0YW5jZU9mTWFjaGluZTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBnZXRNYWNoaW5lUGF0aCgpLT5iZWdpbigpOworCQlBcnJheU9mSW5zdGFuY2VPZk1hY2hpbmU6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gZ2V0TWFjaGluZVBhdGgoKS0+ZW5kKCk7CisJCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQorCQl7CisJCQlvdXQgPDwgVEFCMiA8PCAoKml0KS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCBFT0w7CisJCX0KKwl9CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgREFUQSApCisJaWYoIGhhc0RhdGFQYXRoKCkgKQorCXsKKwkJaWYoIGlzRW1wdHkgKSB7IG91dCA8PCAiIHsiIDw8IEVPTDsgaXNFbXB0eSA9IGZhbHNlOyB9CisKKwkJb3V0IDw8IFRBQiA8PCAicGF0aCNkYXRhOiIgPDwgRU9MX0lOQ1JfSU5ERU5UOworCisJCWdldERhdGFQYXRoKCktPnRvU3RyZWFtKG91dCk7CisKKwkJb3V0IDw8IERFQ1JfSU5ERU5UOworICAgfQorQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBEQVRBICkKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBEQVRBICkKKwlpZiggaGFzQXR0cmlidXRlKCkgKQorCXsKKwkJaWYoIGlzRW1wdHkgKSB7IG91dCA8PCAiIHsiIDw8IEVPTDsgaXNFbXB0eSA9IGZhbHNlOyB9CisKKwkJb3V0IDw8IFRBQiA8PCAiYXR0cmlidXRlOiIgPDwgRU9MX0lOQ1JfSU5ERU5UOworCisJCWdldEF0dHJpYnV0ZSgpLT50b1N0cmVhbShvdXQpOworCisJCW91dCA8PCBERUNSX0lOREVOVDsKKwl9CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIERBVEEgKQorCisJaWYoaGFzT25Xcml0ZVJvdXRpbmUoKSApCisJeworCQlpZiggaXNFbXB0eSApIHsgb3V0IDw8ICIgeyIgPDwgRU9MOyBpc0VtcHR5ID0gZmFsc2U7IH0KKworCQlvdXQgPDwgVEFCIDw8ICJtb2U6IiA8PCBFT0w7CisKKwkJaWYoIGhhc09uV3JpdGVSb3V0aW5lKCkgKQorCQl7CisJCQlvdXQgPDwgVEFCMiA8PCAib25fd3JpdGUgPSAiIDw8IEVPTF9JTkNSMl9JTkRFTlQ7CisJCQlnZXRPbldyaXRlUm91dGluZSgpLT50b1N0cmVhbShvdXQpOworCQkJb3V0IDw8IERFQ1IyX0lOREVOVDsKKwkJfQorCX0KKworCSggaXNFbXB0eSA/IChvdXQgPDwgIjsiKSA6IChvdXQgPDwgVEFCIDw8ICJ9IikgKSA8PCBFT0xfRkxVU0g7Cit9CisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZkRhdGEuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZEYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ5MDQ5MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZEYXRhLmgKQEAgLTAsMCArMSw4MzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiA1IGFvw7t0IDIwMDgKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBJTlNUQU5DRU9GREFUQV9IXworI2RlZmluZSBJTlNUQU5DRU9GREFUQV9IXworCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvQmFzZUluc3RhbmNlRm9ybS5oPgorCisjaW5jbHVkZSA8Y29tbW9uL0F2bVBvaW50ZXIuaD4KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vQkZDb250YWluZXIuaD4KKworI2luY2x1ZGUgPGZtbC9saWIvQXZtTGFuZy5oPgorCisjaW5jbHVkZSA8Zm1sL3N5bWJvbC9UYWJsZU9mU3ltYm9sLmg+CisKKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvVmFyaWFibGUuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworY2xhc3MgQXJyYXlCRjsKK2NsYXNzIEF2bVByb2dyYW07CisKK2NsYXNzIEJ1aWx0aW5BcnJheTsKK2NsYXNzIEJhc2VBdm1Qcm9ncmFtOworCitjbGFzcyBFbGVtZW50OworCitjbGFzcyBPYmplY3RFbGVtZW50OworCitjbGFzcyBTeW1ib2w7CisKKworY2xhc3MgSW5zdGFuY2VPZkRhdGEgOgorCQlwdWJsaWMgQmFzZUluc3RhbmNlRm9ybSwKKwkJcHVibGljIElQb2ludGVyRGF0YU5hdHVyZSwKKwkJQVZNX0lOSkVDVF9JTlNUQU5DRV9DT1VOVEVSX0NMQVNTKCBJbnN0YW5jZU9mRGF0YSApCit7CisKKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggSW5zdGFuY2VPZkRhdGEgKQorCisKK3Byb3RlY3RlZDoKKwkvKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlQT0lOVEVSX0RBVEFfTkFUVVJFIG1Qb2ludGVyTmF0dXJlOworCisJLy8gVXNlZCB0byB0aGUgY29udGFpbmVyIG9mIHN0b3JlIHJlY29yZC9jbGFzcyBvciBhcnJheSBkYXRhIGZpZWxkIGluc3RhbmNlCisJSW5zdGFuY2VPZkRhdGEgKiBtUGFyZW50OworCisJLy8gVGhlIE1vbml0b3IgUm91dGluZSBmb3IgQXNzaWduYXRpb24KKwlBdm1Qcm9ncmFtICogbU9uV3JpdGVSb3V0aW5lOworCisJLy8gVGhlIGluaXRpYWwgdmFsdWUKKwlCRiBtVmFsdWU7CisKKwkvLyBUaGUgaW5pdGlhbCBidWZmZXIgdmFsdWUKKwlCRiBtQnVmZmVyVmFsdWU7CisKKwkvLyBUaGUgdmFyaWFibGUgRmllbGQgdGFibGUKKwkvLyBVc2VkIHRvIHN0b3JlIHJlY29yZC9jbGFzcyBvciBhcnJheSBkYXRhIGZpZWxkIGluc3RhbmNlCisJVGFibGVPZlN5bWJvbCAqIG1BdHRyaWJ1dGVUYWJsZTsKKworCS8vIFRoZSBSZWxhdGl2ZSBEYXRhIFBhdGggZm9yIGFuIEluc3RhbmNlIGZyb20gdGhpcyBEYXRhIENvbnRhaW5lcgorCVRhYmxlT2ZTeW1ib2wgKiBtUmVsYXRpdmVEYXRhUGF0aDsKKwlhdm1fc2l6ZV90ICogbVJlbGF0aXZlT2Zmc2V0UGF0aDsKKworCS8vIE1hcmsgdXNlIGJ5IHNvbWUgdG9vbHMgbGlrZSBTb2x2ZXIKKwlhdm1fb2Zmc2V0X3QgbU1hcms7CisKKworcHVibGljOgorCS8qKgorCSAqIERFRkFVTFQKKwkgKiBFbXB0eSBUYWJsZU9mU3ltYm9sCisJICovCisJc3RhdGljIFRhYmxlT2ZTeW1ib2wgTlVMTF9UQUJMRV9PRl9TWU1CT0w7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogY29weQorCSAqLworCUluc3RhbmNlT2ZEYXRhKGNvbnN0IEluc3RhbmNlT2ZEYXRhICYgYURhdGEpCisJOiBCYXNlSW5zdGFuY2VGb3JtKCBhRGF0YSApLAorCW1Qb2ludGVyTmF0dXJlKCBhRGF0YS5tUG9pbnRlck5hdHVyZSApLAorCW1QYXJlbnQoIGFEYXRhLm1QYXJlbnQgKSwKKworCW1PbldyaXRlUm91dGluZSggYURhdGEubU9uV3JpdGVSb3V0aW5lICksCisKKwltVmFsdWUoIGFEYXRhLm1WYWx1ZSApLAorCW1CdWZmZXJWYWx1ZSggYURhdGEubUJ1ZmZlclZhbHVlICksCisKKwltQXR0cmlidXRlVGFibGUoICYgTlVMTF9UQUJMRV9PRl9TWU1CT0wgKSwKKworCW1SZWxhdGl2ZURhdGFQYXRoKCAmIE5VTExfVEFCTEVfT0ZfU1lNQk9MICksCisJbVJlbGF0aXZlT2Zmc2V0UGF0aCggTlVMTCApLAorCisJbU1hcmsoIGFEYXRhLm1NYXJrICkKKwl7CisJCWNvcHlBdHRyaWJ1dGUoIGFEYXRhLm1BdHRyaWJ1dGVUYWJsZSApOworCisJCWNvcHlEYXRhUGF0aCggYURhdGEubVJlbGF0aXZlRGF0YVBhdGggKTsKKwl9CisKKworCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJSW5zdGFuY2VPZkRhdGEoUE9JTlRFUl9EQVRBX05BVFVSRSBhUG9pbnRlck5hdHVyZSwKKwkJCUJhc2VBdm1Qcm9ncmFtICogYUNvbnRhaW5lciwgY29uc3QgT2JqZWN0RWxlbWVudCAqIGFzdEVsZW1lbnQsCisJCQlCYXNlVHlwZVNwZWNpZmllciAqIGFUeXBlU3BlY2lmaWVyLCBhdm1fb2Zmc2V0X3QgYW5PZmZzZXQpCisJOiBCYXNlSW5zdGFuY2VGb3JtKENMQVNTX0tJTkRfVCggSW5zdGFuY2VPZkRhdGEgKSwgYUNvbnRhaW5lciwKKwkJCWFzdEVsZW1lbnQsIGFUeXBlU3BlY2lmaWVyLCBhbk9mZnNldCksCisJbVBvaW50ZXJOYXR1cmUoIGFQb2ludGVyTmF0dXJlICksCisJbVBhcmVudCggTlVMTCApLAorCisJbU9uV3JpdGVSb3V0aW5lKCBOVUxMICksCisKKwltVmFsdWUoICksCisJbUJ1ZmZlclZhbHVlKCApLAorCisJbUF0dHJpYnV0ZVRhYmxlKCAmIE5VTExfVEFCTEVfT0ZfU1lNQk9MICksCisKKwltUmVsYXRpdmVEYXRhUGF0aCggJiBOVUxMX1RBQkxFX09GX1NZTUJPTCApLAorCW1SZWxhdGl2ZU9mZnNldFBhdGgoIE5VTEwgKSwKKworCW1NYXJrKCAwICkKKwl7CisJCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9QT0lOVEVSX0VYSVQoIGFUeXBlU3BlY2lmaWVyICkKKwkJCQk8PCAiSW5zdGFuY2VPZkRhdGE6PiBVbmV4cGVjdGVkIGFuIGluc3RhbmNlIDw8ICIKKwkJCQk8PCB0aGlzLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQkJPDwgIiA+PiAgd2l0aG91dCB0eXBlU3BlY2lmaWVyICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisJfQorCisJSW5zdGFuY2VPZkRhdGEoUE9JTlRFUl9EQVRBX05BVFVSRSBhUG9pbnRlck5hdHVyZSwKKwkJCUJhc2VBdm1Qcm9ncmFtICogYUNvbnRhaW5lciwgY29uc3QgT2JqZWN0RWxlbWVudCAqIGFzdEVsZW1lbnQsCisJCQlCYXNlVHlwZVNwZWNpZmllciAqIGFUeXBlU3BlY2lmaWVyLAorCQkJYXZtX29mZnNldF90IGFuT2Zmc2V0LCBjb25zdCBNb2RpZmllciAmIGFNb2RpZmllcikKKwk6IEJhc2VJbnN0YW5jZUZvcm0oQ0xBU1NfS0lORF9UKCBJbnN0YW5jZU9mRGF0YSApLCBhQ29udGFpbmVyLAorCQkJYXN0RWxlbWVudCwgYVR5cGVTcGVjaWZpZXIsIGFuT2Zmc2V0LCBhTW9kaWZpZXIpLAorCW1Qb2ludGVyTmF0dXJlKCBhUG9pbnRlck5hdHVyZSApLAorCW1QYXJlbnQoIE5VTEwgKSwKKworCW1PbldyaXRlUm91dGluZSggTlVMTCApLAorCisJbVZhbHVlKCApLAorCW1CdWZmZXJWYWx1ZSggKSwKKworCW1BdHRyaWJ1dGVUYWJsZSggJiBOVUxMX1RBQkxFX09GX1NZTUJPTCApLAorCisJbVJlbGF0aXZlRGF0YVBhdGgoICYgTlVMTF9UQUJMRV9PRl9TWU1CT0wgKSwKKwltUmVsYXRpdmVPZmZzZXRQYXRoKCBOVUxMICksCisKKwltTWFyayggMCApCisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBhVHlwZVNwZWNpZmllciApCisJCQkJPDwgIkluc3RhbmNlT2ZEYXRhOj4gVW5leHBlY3RlZCBhbiBpbnN0YW5jZSA8PCAiCisJCQkJPDwgdGhpcy0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJCTw8ICIgPj4gIHdpdGhvdXQgdHlwZVNwZWNpZmllciAhISEiCisJCQkJPDwgU0VORF9FWElUOworCX0KKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogT3RoZXIKKwkgKi8KKwlJbnN0YW5jZU9mRGF0YShQT0lOVEVSX0RBVEFfTkFUVVJFIGFQb2ludGVyTmF0dXJlLAorCQkJQmFzZUF2bVByb2dyYW0gKiBhQ29udGFpbmVyLCBjb25zdCBPYmplY3RFbGVtZW50ICogYXN0RWxlbWVudCwKKwkJCUJhc2VUeXBlU3BlY2lmaWVyICogYVR5cGVTcGVjaWZpZXIsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCwgYXZtX29mZnNldF90IGFuT2Zmc2V0LAorCQkJY29uc3QgTW9kaWZpZXIgJiBhTW9kaWZpZXIgPSBNb2RpZmllcjo6UFJPUEVSVFlfVU5ERUZJTkVEX01PRElGSUVSKQorCTogQmFzZUluc3RhbmNlRm9ybShDTEFTU19LSU5EX1QoIEluc3RhbmNlT2ZEYXRhICksIGFDb250YWluZXIsIGFzdEVsZW1lbnQsCisJCQlhVHlwZVNwZWNpZmllciwgYUZ1bGx5UXVhbGlmaWVkTmFtZUlELCBhbk9mZnNldCwgYU1vZGlmaWVyKSwKKwltUG9pbnRlck5hdHVyZSggYVBvaW50ZXJOYXR1cmUgKSwKKwltUGFyZW50KCBOVUxMICksCisKKwltT25Xcml0ZVJvdXRpbmUoIE5VTEwgKSwKKworCW1WYWx1ZSggKSwKKwltQnVmZmVyVmFsdWUoICksCisKKwltQXR0cmlidXRlVGFibGUoICYgTlVMTF9UQUJMRV9PRl9TWU1CT0wgKSwKKworCW1SZWxhdGl2ZURhdGFQYXRoKCAmIE5VTExfVEFCTEVfT0ZfU1lNQk9MICksCisJbVJlbGF0aXZlT2Zmc2V0UGF0aCggTlVMTCApLAorCisJbU1hcmsoIDAgKQorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggYVR5cGVTcGVjaWZpZXIgKQorCQkJCTw8ICJJbnN0YW5jZU9mRGF0YTo+IFVuZXhwZWN0ZWQgYW4gaW5zdGFuY2UgPDwgIgorCQkJCTw8IHRoaXMtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKwkJCQk8PCAiID4+ICB3aXRob3V0IHR5cGVTcGVjaWZpZXIgISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKwl9CisKKworCUluc3RhbmNlT2ZEYXRhKFBPSU5URVJfREFUQV9OQVRVUkUgYVBvaW50ZXJOYXR1cmUsCisJCQlCYXNlQXZtUHJvZ3JhbSAqIGFDb250YWluZXIsIGNvbnN0IE9iamVjdEVsZW1lbnQgKiBhc3RFbGVtZW50LAorCQkJQmFzZVR5cGVTcGVjaWZpZXIgKiBhVHlwZVNwZWNpZmllciwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlELAorCQkJYXZtX29mZnNldF90IGFuT2Zmc2V0LCBJbnN0YW5jZU9mRGF0YSAqIGFQYXJlbnQpCisJOiBCYXNlSW5zdGFuY2VGb3JtKENMQVNTX0tJTkRfVCggSW5zdGFuY2VPZkRhdGEgKSwgYUNvbnRhaW5lciwgYXN0RWxlbWVudCwKKwkJCWFUeXBlU3BlY2lmaWVyLCBhRnVsbHlRdWFsaWZpZWROYW1lSUQsIGFuT2Zmc2V0LCBhUGFyZW50KSwKKwltUG9pbnRlck5hdHVyZSggYVBvaW50ZXJOYXR1cmUgKSwKKwltUGFyZW50KCBOVUxMICksCisKKwltT25Xcml0ZVJvdXRpbmUoIE5VTEwgKSwKKworCW1WYWx1ZSggKSwKKwltQnVmZmVyVmFsdWUoICksCisKKwltQXR0cmlidXRlVGFibGUoICYgTlVMTF9UQUJMRV9PRl9TWU1CT0wgKSwKKworCW1SZWxhdGl2ZURhdGFQYXRoKCAmIE5VTExfVEFCTEVfT0ZfU1lNQk9MICksCisJbVJlbGF0aXZlT2Zmc2V0UGF0aCggTlVMTCApLAorCisJbU1hcmsoIDAgKQorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggYVR5cGVTcGVjaWZpZXIgKQorCQkJCTw8ICJJbnN0YW5jZU9mRGF0YTo+IFVuZXhwZWN0ZWQgYW4gaW5zdGFuY2UgPDwgIgorCQkJCTw8IHRoaXMtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIiA+PiAgd2l0aG91dCB0eXBlU3BlY2lmaWVyICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisJfQorCisKKwlJbnN0YW5jZU9mRGF0YShQT0lOVEVSX0RBVEFfTkFUVVJFIGFQb2ludGVyTmF0dXJlLAorCQkJQmFzZVR5cGVTcGVjaWZpZXIgKiBhVHlwZVNwZWNpZmllciwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlELCBhdm1fb2Zmc2V0X3QgYW5PZmZzZXQsCisJCQljb25zdCBNb2RpZmllciAmIGFNb2RpZmllciA9IE1vZGlmaWVyOjpQUk9QRVJUWV9VTkRFRklORURfTU9ESUZJRVIpCisJOiBCYXNlSW5zdGFuY2VGb3JtKENMQVNTX0tJTkRfVCggSW5zdGFuY2VPZkRhdGEgKSwKKwkJCWFUeXBlU3BlY2lmaWVyLCBhRnVsbHlRdWFsaWZpZWROYW1lSUQsIGFuT2Zmc2V0LCBhTW9kaWZpZXIpLAorCW1Qb2ludGVyTmF0dXJlKCBhUG9pbnRlck5hdHVyZSApLAorCW1QYXJlbnQoIE5VTEwgKSwKKworCW1PbldyaXRlUm91dGluZSggTlVMTCApLAorCisJbVZhbHVlKCApLAorCW1CdWZmZXJWYWx1ZSggKSwKKworCW1BdHRyaWJ1dGVUYWJsZSggJiBOVUxMX1RBQkxFX09GX1NZTUJPTCApLAorCisJbVJlbGF0aXZlRGF0YVBhdGgoICYgTlVMTF9UQUJMRV9PRl9TWU1CT0wgKSwKKwltUmVsYXRpdmVPZmZzZXRQYXRoKCBOVUxMICksCisKKwltTWFyayggMCApCisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBhVHlwZVNwZWNpZmllciApCisJCQkJPDwgIkluc3RhbmNlT2ZEYXRhOj4gVW5leHBlY3RlZCBhbiBpbnN0YW5jZSA8PCAiCisJCQkJPDwgdGhpcy0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiID4+ICB3aXRob3V0IHR5cGVTcGVjaWZpZXIgISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKwl9CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIGZvciBVRkkKKwkgKi8KKwlJbnN0YW5jZU9mRGF0YShQT0lOVEVSX0RBVEFfTkFUVVJFIGFQb2ludGVyTmF0dXJlLAorCQkJQmFzZUF2bVByb2dyYW0gKiBhQ29udGFpbmVyLCBJbnN0YW5jZU9mRGF0YSAqIGFQYXJlbnQsCisJCQljb25zdCBUYWJsZU9mU3ltYm9sICYgYVJlbGF0aXZlRGF0YVBhdGggPSBOVUxMX1RBQkxFX09GX1NZTUJPTCkKKwk6IEJhc2VJbnN0YW5jZUZvcm0oQ0xBU1NfS0lORF9UKCBJbnN0YW5jZU9mRGF0YSApLCBhQ29udGFpbmVyLCBhUGFyZW50KSwKKwltUG9pbnRlck5hdHVyZSggYVBvaW50ZXJOYXR1cmUgKSwKKwltUGFyZW50KCBhUGFyZW50LT5tUGFyZW50ICksCisKKwltT25Xcml0ZVJvdXRpbmUoIGFQYXJlbnQtPm1PbldyaXRlUm91dGluZSApLAorCisJbVZhbHVlKCBhUGFyZW50LT5tVmFsdWUgKSwKKwltQnVmZmVyVmFsdWUoIGFQYXJlbnQtPm1CdWZmZXJWYWx1ZSApLAorCisJbUF0dHJpYnV0ZVRhYmxlKCBOVUxMICksCisJbVJlbGF0aXZlRGF0YVBhdGgoIG5ldyBUYWJsZU9mU3ltYm9sKGFSZWxhdGl2ZURhdGFQYXRoKSApLAorCW1SZWxhdGl2ZU9mZnNldFBhdGgoIE5VTEwgKSwKKworCW1NYXJrKCAwICkKKwl7CisJCXVwZGF0ZU9mZnNldFBhdGgoKTsKKworCQlpZiggYVJlbGF0aXZlRGF0YVBhdGgubm9uZW1wdHkoKSApCisJCXsKKwkJCXNldFR5cGVTcGVjaWZpZXIoIGFSZWxhdGl2ZURhdGFQYXRoLmJhY2soKS5nZXRUeXBlU3BlY2lmaWVyKCkgKTsKKwkJCXNldEFzdEVsZW1lbnQoIGFSZWxhdGl2ZURhdGFQYXRoLmJhY2soKS5nZXRBc3RFbGVtZW50KCkgKTsKKworCQkJc2V0T25Xcml0ZVJvdXRpbmUoCisJCQkJCWFSZWxhdGl2ZURhdGFQYXRoLmJhY2soKS5kYXRhKCkuZ2V0T25Xcml0ZVJvdXRpbmUoKSApOworCisJCQlzZXRWYWx1ZSggYVJlbGF0aXZlRGF0YVBhdGguYmFjaygpLmdldFZhbHVlKCkgKTsKKworCQkJc2V0QlZhbHVlKCBhUmVsYXRpdmVEYXRhUGF0aC5iYWNrKCkuZGF0YSgpLmdldEJWYWx1ZSgpICk7CisJCX0KKworCQlzZXRBbGlhc1RhcmdldCggYVBhcmVudCApOworCX0KKworCUluc3RhbmNlT2ZEYXRhKFBPSU5URVJfREFUQV9OQVRVUkUgYVBvaW50ZXJOYXR1cmUsCisJCQlCYXNlQXZtUHJvZ3JhbSAqIGFDb250YWluZXIsIEluc3RhbmNlT2ZEYXRhICogYVBhcmVudCwKKwkJCWNvbnN0IFRhYmxlT2ZTeW1ib2wgJiBhUmVsYXRpdmVEYXRhUGF0aCwgY29uc3QgU3ltYm9sICYgcGF0aExlYWYpCisJOiBCYXNlSW5zdGFuY2VGb3JtKENMQVNTX0tJTkRfVCggSW5zdGFuY2VPZkRhdGEgKSwgYUNvbnRhaW5lciwgYVBhcmVudCksCisJbVBvaW50ZXJOYXR1cmUoIGFQb2ludGVyTmF0dXJlICksCisJbVBhcmVudCggYVBhcmVudC0+bVBhcmVudCApLAorCisJbU9uV3JpdGVSb3V0aW5lKCBwYXRoTGVhZi5kYXRhKCkubU9uV3JpdGVSb3V0aW5lICksCisKKwltVmFsdWUoIHBhdGhMZWFmLmRhdGEoKS5tVmFsdWUgKSwKKwltQnVmZmVyVmFsdWUoIHBhdGhMZWFmLmRhdGEoKS5tQnVmZmVyVmFsdWUgKSwKKworCW1BdHRyaWJ1dGVUYWJsZSggTlVMTCApLAorCW1SZWxhdGl2ZURhdGFQYXRoKCBuZXcgVGFibGVPZlN5bWJvbChhUmVsYXRpdmVEYXRhUGF0aCwgcGF0aExlYWYpICksCisJbVJlbGF0aXZlT2Zmc2V0UGF0aCggTlVMTCApLAorCisJbU1hcmsoIDAgKQorCXsKKwkJdXBkYXRlT2Zmc2V0UGF0aCgpOworCisJCXNldFR5cGVTcGVjaWZpZXIoIHBhdGhMZWFmLmdldFR5cGVTcGVjaWZpZXIoKSApOworCQlzZXRBc3RFbGVtZW50KCBwYXRoTGVhZi5nZXRBc3RFbGVtZW50KCkgKTsKKworCQlzZXRBbGlhc1RhcmdldCggYVBhcmVudCApOworCX0KKworCisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIGZvciBSVU5USU1FIFVGSSBPRkZTRVQKKwkgKi8KKwlJbnN0YW5jZU9mRGF0YShJbnN0YW5jZU9mRGF0YSAqIGFNb2RlbCwKKwkJCUluc3RhbmNlT2ZEYXRhICogYVJvb3QsIGF2bV9zaXplX3QgKiBhUmVsYXRpdmVPZmZzZXRQYXRoKQorCTogQmFzZUluc3RhbmNlRm9ybShDTEFTU19LSU5EX1QoIEluc3RhbmNlT2ZEYXRhICksCisJCQlhTW9kZWwtPmdldENvbnRhaW5lcigpLCBhUm9vdCksCisJbVBvaW50ZXJOYXR1cmUoIFBPSU5URVJfVUZJX1JVTlRJTUVfTkFUVVJFICksCisJbVBhcmVudCggYU1vZGVsICksCisKKwltT25Xcml0ZVJvdXRpbmUoIGFNb2RlbC0+bU9uV3JpdGVSb3V0aW5lICksCisKKwltVmFsdWUoIGFNb2RlbC0+bVZhbHVlICksCisJbUJ1ZmZlclZhbHVlKCBhTW9kZWwtPm1CdWZmZXJWYWx1ZSApLAorCisJbUF0dHJpYnV0ZVRhYmxlKCBhTW9kZWwtPmdldEF0dHJpYnV0ZSgpICksCisJbVJlbGF0aXZlRGF0YVBhdGgoIGFNb2RlbC0+Z2V0RGF0YVBhdGgoKSApLAorCW1SZWxhdGl2ZU9mZnNldFBhdGgoIGFSZWxhdGl2ZU9mZnNldFBhdGggKSwKKworCW1NYXJrKCAwICkKKwl7CisJCXNldEFsbE5hbWVJRChhTW9kZWwtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCksIGFNb2RlbC0+Z2V0TmFtZUlEKCkpOworCisJCXNldFJ1bnRpbWVDb250YWluZXJSSUQoIGFSb290LT5nZXRSdW50aW1lQ29udGFpbmVyUklEKCkgKTsKKwl9CisKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogZm9yIEFsaWFzCisJICovCisJSW5zdGFuY2VPZkRhdGEoQmFzZUF2bVByb2dyYW0gKiBhQ29udGFpbmVyLCBJbnN0YW5jZU9mRGF0YSAqIGFUYXJnZXQsCisJCQlWZWN0b3JPZkluc3RhbmNlT2ZNYWNoaW5lICYgYVJlbGF0aXZlTWFjaGluZVBhdGgpCisJOiBCYXNlSW5zdGFuY2VGb3JtKENMQVNTX0tJTkRfVCggSW5zdGFuY2VPZkRhdGEgKSwgYUNvbnRhaW5lciwgYVRhcmdldCwKKwkJCWFSZWxhdGl2ZU1hY2hpbmVQYXRoKSwKKwltUG9pbnRlck5hdHVyZSggYVRhcmdldC0+bVBvaW50ZXJOYXR1cmUgKSwKKwltUGFyZW50KCBhVGFyZ2V0LT5tUGFyZW50ICksCisKKwltT25Xcml0ZVJvdXRpbmUoIGFUYXJnZXQtPm1PbldyaXRlUm91dGluZSApLAorCisJbVZhbHVlKCBhVGFyZ2V0LT5tVmFsdWUgKSwKKwltQnVmZmVyVmFsdWUoIGFUYXJnZXQtPm1CdWZmZXJWYWx1ZSApLAorCisJbUF0dHJpYnV0ZVRhYmxlKCAmIE5VTExfVEFCTEVfT0ZfU1lNQk9MICksCisJbVJlbGF0aXZlRGF0YVBhdGgoICYgTlVMTF9UQUJMRV9PRl9TWU1CT0wgKSwKKwltUmVsYXRpdmVPZmZzZXRQYXRoKCBOVUxMICksCisKKwltTWFyayggMCApCisJeworCQljb3B5RGF0YVBhdGgoIGFUYXJnZXQtPm1SZWxhdGl2ZURhdGFQYXRoICk7CisJfQorCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+SW5zdGFuY2VPZkRhdGEoKQorCXsKKwkJdXBkYXRlT2Zmc2V0UGF0aCgpOworCisJCWlmKCAobUF0dHJpYnV0ZVRhYmxlICE9ICgmIE5VTExfVEFCTEVfT0ZfU1lNQk9MKSkgJiYKKwkJCShtUG9pbnRlck5hdHVyZSAhPSBQT0lOVEVSX1VGSV9SVU5USU1FX05BVFVSRSkgKQorCQl7CisJCQlkZWxldGUoIG1BdHRyaWJ1dGVUYWJsZSApOworCQkJbUF0dHJpYnV0ZVRhYmxlID0gTlVMTDsKKwkJfQorCisJCWlmKCAobVJlbGF0aXZlRGF0YVBhdGggIT0gKCYgTlVMTF9UQUJMRV9PRl9TWU1CT0wpKSAmJgorCQkJKG1Qb2ludGVyTmF0dXJlICE9IFBPSU5URVJfVUZJX1JVTlRJTUVfTkFUVVJFKSApCisJCXsKKwkJCWRlbGV0ZSggbVJlbGF0aXZlRGF0YVBhdGggKTsKKwkJCW1SZWxhdGl2ZURhdGFQYXRoID0gTlVMTDsKKwkJfQorCisJCWRlbGV0ZSggbVJlbGF0aXZlT2Zmc2V0UGF0aCApOworCQltUmVsYXRpdmVPZmZzZXRQYXRoID0gTlVMTDsKKworLy8JCUFWTV9PU19UUkFDRSA8PCAiSW5zdGFuY2VPZkRhdGE6OmRlbCA6PiAiCisvLy8vCQkJCTw8ICJvZmZzZXQjIiA8PCBnZXRPZmZzZXQoKSA8PCBGUU5fSURfUk9PVF9TRVBBUkFUT1IKKy8vCQkJCTw8IG1GdWxseVF1YWxpZmllZE5hbWVJRCA8PCBzdGQ6OmVuZGw7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBDb21waWxlZCBPYmplY3RFbGVtZW50IGFzIENvbXBpbGVkIFZhcmlhYmxlCisJICovCisJaW5saW5lIGNvbnN0IFZhcmlhYmxlICogZ2V0QXN0VmFyaWFibGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRBc3RFbGVtZW50KCktPmFzPCBWYXJpYWJsZSA+KCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNBc3RWYXJpYWJsZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGhhc0FzdEVsZW1lbnQoKSAmJiBnZXRBc3RFbGVtZW50KCktPmlzPCBWYXJpYWJsZSA+KCkgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIFF1YWxpZmllZCBOYW1lIElEZW50aWZpZXIKKwkgKiBRdWFsaWZpZWROYW1lSUQgdXNpbmcgbUZ1bGx5UXVhbGlmaWVkTmFtZUlEICYgbU5hbWVJRAorCSAqLworCWlubGluZSB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldFF1YWxpZmllZE5hbWVJRCgpIGNvbnN0CisJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSwgREFUQSApCisKKwkJcmV0dXJuKCBnZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpICk7CisKK0FWTV9FTFNFCisKKwkJcmV0dXJuKCAoaXNTdGFuZGFyZFBvaW50ZXIoKSB8fCBpc0VudW1TeW1ib2xQb2ludGVyKCkpCisJCQkJPyBtYWtlUXVhbGlmaWVkTmFtZUlEKCBnZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpLCBnZXROYW1lSUQoKSApCisJCQkJOiBtYWtlUXVhbGlmaWVkTmFtZUlEKCBnZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpICkgKTsKKworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSwgREFUQSApCisJfQorCisJLyoqCisJICogR0VUVEVSCisJICogbUZ1bGx5UXVhbGlmaWVkTmFtZUlECisJICogbU5hbWVJRAorCSAqLworCXZpcnR1YWwgdm9pZCB1cGRhdGVGdWxseVF1YWxpZmllZE5hbWVJRCgpOworCisJaW5saW5lIHZvaWQgdXBkYXRlRnVsbHlRdWFsaWZpZWROYW1lSUQoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBpZCkKKwl7CisJCXNldEFsbE5hbWVJRCggYUZ1bGx5UXVhbGlmaWVkTmFtZUlEICwgaWQgKTsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtSWQKKwkgKi8KKwl2b2lkIHVwZGF0ZU5hbWVJRCgpOworCisKKwkvKioKKwkgKiBTRVRURVIKKwkgKiB0aGUgU2hhcmVkRGF0YQorCSAqLworCWlubGluZSB2b2lkIHNldFNoYXJlZERhdGEoSW5zdGFuY2VPZkRhdGEgKiBzRGF0YSkKKwl7CisJCXNldE9mZnNldCggc0RhdGEtPmdldE9mZnNldCgpICk7CisKKy8vCQlzZXRNb2RpZmllciggc0RhdGEtPmdldE1vZGlmaWVyKCkgKTsKKworCQltT25Xcml0ZVJvdXRpbmUgPSBzRGF0YS0+bU9uV3JpdGVSb3V0aW5lOworCisJCW1WYWx1ZSA9IHNEYXRhLT5tVmFsdWU7CisKKwkJbUJ1ZmZlclZhbHVlICA9IHNEYXRhLT5tQnVmZmVyVmFsdWU7CisJfQorCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVBhcmVudAorCSAqLworCWlubGluZSBJbnN0YW5jZU9mRGF0YSAqIGdldFBhcmVudCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1QYXJlbnQgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNQYXJlbnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUGFyZW50ICE9IE5VTEwgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRQYXJlbnQoSW5zdGFuY2VPZkRhdGEgKiBhUGFyZW50KQorCXsKKwkJbVBhcmVudCA9IGFQYXJlbnQ7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtQXR0cmlidXRlVGFibGUKKwkgKi8KKwlpbmxpbmUgVGFibGVPZlN5bWJvbCAqIGdldEF0dHJpYnV0ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1BdHRyaWJ1dGVUYWJsZSApOworCX0KKworCWlubGluZSBib29sIGhhc0F0dHJpYnV0ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIChtQXR0cmlidXRlVGFibGUgIT0gKCYgTlVMTF9UQUJMRV9PRl9TWU1CT0wpKSAmJgorCQkJCShtQXR0cmlidXRlVGFibGUgIT0gTlVMTCkgJiYgbUF0dHJpYnV0ZVRhYmxlLT5ub25lbXB0eSgpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0QXR0cmlidXRlKFRhYmxlT2ZTeW1ib2wgKiBhbkF0dHJpYnV0ZVRhYmxlKQorCXsKKwkJbUF0dHJpYnV0ZVRhYmxlID0gKCBhbkF0dHJpYnV0ZVRhYmxlICE9IE5VTEwgKSA/CisJCQkJYW5BdHRyaWJ1dGVUYWJsZSA6ICgmIE5VTExfVEFCTEVfT0ZfU1lNQk9MKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBjb3B5QXR0cmlidXRlKFRhYmxlT2ZTeW1ib2wgKiBhbkF0dHJpYnV0ZVRhYmxlKQorCXsKKwkJbUF0dHJpYnV0ZVRhYmxlID0gKCBhbkF0dHJpYnV0ZVRhYmxlICE9IE5VTEwgKSA/CisJCQluZXcgVGFibGVPZlN5bWJvbCgqYW5BdHRyaWJ1dGVUYWJsZSkgOiAoJiBOVUxMX1RBQkxFX09GX1NZTUJPTCk7CisJfQorCisKKwlpbmxpbmUgdm9pZCBzZXRBdHRyaWJ1dGUoYXZtX29mZnNldF90IG9mZnNldCwgY29uc3QgU3ltYm9sICYgYVdQcm9wZXJ0eSkKKwl7CisJCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggaGFzQXR0cmlidXRlKCkgKQorCQkJCTw8ICJzZXRBdHRyaWJ1dGU6PiBVbmV4cGVjdGVkIGEgPG51bGw+IEF0dHJpYnV0ZVRhYmxlICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJbUF0dHJpYnV0ZVRhYmxlLT5zZXQob2Zmc2V0LCBhV1Byb3BlcnR5KTsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtT25Xcml0ZVJvdXRpbmUKKwkgKi8KKwlpbmxpbmUgQXZtUHJvZ3JhbSAqIGdldE9uV3JpdGVSb3V0aW5lKCkgY29uc3QKKwl7CisJCXJldHVybiggbU9uV3JpdGVSb3V0aW5lICk7CisJfQorCisJY29uc3QgQkZDb2RlICYgZ2V0T25Xcml0ZUNvZGUoKSBjb25zdDsKKworCisJaW5saW5lIGJvb2wgaGFzT25Xcml0ZVJvdXRpbmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtT25Xcml0ZVJvdXRpbmUgIT0gTlVMTCApOworCX0KKworCWlubGluZSB2b2lkIHNldE9uV3JpdGVSb3V0aW5lKEF2bVByb2dyYW0gKiBvbldyaXRlUm91dGluZSkKKwl7CisJCW1PbldyaXRlUm91dGluZSA9IG9uV3JpdGVSb3V0aW5lOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVZhbHVlCisJICovCisKKwlpbmxpbmUgQkYgJiBnZXRWYWx1ZSgpCisJeworCQlyZXR1cm4oIG1WYWx1ZSApOworCX0KKworCisJaW5saW5lIGNvbnN0IEJGICYgZ2V0VmFsdWUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVmFsdWUgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNWYWx1ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1WYWx1ZS52YWxpZCgpICk7CisJfQorCisKKwlpbmxpbmUgdm9pZCBzZXRWYWx1ZShjb25zdCBCRiAmIGFWYWx1ZSkKKwl7CisJCW1WYWx1ZSA9IGFWYWx1ZTsKKwl9CisKKworCS8vIEFycmF5VmFsdWUKKwlBcnJheUJGICogZ2V0QXJyYXlWYWx1ZSgpIGNvbnN0OworCisJYm9vbCBoYXNBcnJheVZhbHVlKCkgY29uc3Q7CisKKwkvLyBCdWlsdGluQXJyYXlWYWx1ZQorCUJ1aWx0aW5BcnJheSAqIGdldEJ1aWx0aW5BcnJheVZhbHVlKCkgY29uc3Q7CisKKwlib29sIGhhc0J1aWx0aW5BcnJheVZhbHVlKCkgY29uc3Q7CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtQnVmZmVyVmFsdWUKKwkgKi8KKworCWlubGluZSBCRiAmIGdldEJWYWx1ZSgpCisJeworCQlyZXR1cm4oIG1CdWZmZXJWYWx1ZSApOworCX0KKworCWlubGluZSBjb25zdCBCRiAmIGdldEJWYWx1ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1CdWZmZXJWYWx1ZSApOworCX0KKworCWlubGluZSBib29sIGhhc0JWYWx1ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1CdWZmZXJWYWx1ZS52YWxpZCgpICk7CisJfQorCisKKwlpbmxpbmUgdm9pZCBzZXRCVmFsdWUoY29uc3QgQkYgJiBhQnVmZmVyVmFsdWUpCisJeworCQltQnVmZmVyVmFsdWUgPSBhQnVmZmVyVmFsdWU7CisJfQorCisJaW5saW5lIHZvaWQgcmVzZXRCVmFsdWUoRWxlbWVudCAqIGFCdWZmZXJWYWx1ZSkKKwl7CisJCW1CdWZmZXJWYWx1ZS5yZXBsYWNlUG9pbnRlciggYUJ1ZmZlclZhbHVlICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtUmVsYXRpdmVEYXRhUGF0aAorCSAqLworCWlubGluZSBUYWJsZU9mU3ltYm9sICogZ2V0RGF0YVBhdGgoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUmVsYXRpdmVEYXRhUGF0aCApOworCX0KKworCWlubGluZSBib29sIGhhc0RhdGFQYXRoKCkgY29uc3QKKwl7CisJCXJldHVybiggKG1SZWxhdGl2ZURhdGFQYXRoICE9ICgmIE5VTExfVEFCTEVfT0ZfU1lNQk9MKSkgJiYKKwkJCQkobVJlbGF0aXZlRGF0YVBhdGggIT0gTlVMTCkgJiYgbVJlbGF0aXZlRGF0YVBhdGgtPm5vbmVtcHR5KCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXREYXRhUGF0aChUYWJsZU9mU3ltYm9sICogYVJlbGF0aXZlRGF0YVBhdGgpCisJeworCQltUmVsYXRpdmVEYXRhUGF0aCA9IChhUmVsYXRpdmVEYXRhUGF0aCAhPSBOVUxMKSA/CisJCQkJYVJlbGF0aXZlRGF0YVBhdGggOiAoJiBOVUxMX1RBQkxFX09GX1NZTUJPTCk7CisKKwkJdXBkYXRlT2Zmc2V0UGF0aCgpOworCX0KKworCWlubGluZSB2b2lkIGNvcHlEYXRhUGF0aChUYWJsZU9mU3ltYm9sICogYVJlbGF0aXZlRGF0YVBhdGgpCisJeworCQltUmVsYXRpdmVEYXRhUGF0aCA9IChhUmVsYXRpdmVEYXRhUGF0aCAhPSBOVUxMKSA/CisJCQluZXcgVGFibGVPZlN5bWJvbCgqYVJlbGF0aXZlRGF0YVBhdGgpIDogKCYgTlVMTF9UQUJMRV9PRl9TWU1CT0wpOworCisJCXVwZGF0ZU9mZnNldFBhdGgoKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXREYXRhUGF0aChjb25zdCBUYWJsZU9mU3ltYm9sICYgYVJlbGF0aXZlRGF0YVBhdGgpCisJeworCQltUmVsYXRpdmVEYXRhUGF0aCA9IG5ldyBUYWJsZU9mU3ltYm9sKCBhUmVsYXRpdmVEYXRhUGF0aCApOworCisJCXVwZGF0ZU9mZnNldFBhdGgoKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1SZWxhdGl2ZU9mZnNldFBhdGgKKwkgKi8KKwlpbmxpbmUgYXZtX3NpemVfdCAqIGdldE9mZnNldFBhdGgoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUmVsYXRpdmVPZmZzZXRQYXRoICk7CisJfQorCisJaW5saW5lIGF2bV9zaXplX3QgZ2V0T2Zmc2V0UGF0aChhdm1fc2l6ZV90IGlkeCkgY29uc3QKKwl7CisJCXJldHVybiggbVJlbGF0aXZlT2Zmc2V0UGF0aFtpZHhdICk7CisJfQorCisJYm9vbCBoYXNPZmZzZXRQYXRoKCkgY29uc3QKKwl7CisJCXJldHVybiggbVJlbGF0aXZlT2Zmc2V0UGF0aCAhPSBOVUxMICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0T2Zmc2V0UGF0aChhdm1fc2l6ZV90ICogYW5PZmZzZXRQYXRoKQorCXsKKwkJbVJlbGF0aXZlT2Zmc2V0UGF0aCA9IGFuT2Zmc2V0UGF0aDsKKwl9CisKKwlzdGQ6OnN0cmluZyBzdHJPZmZzZXRQYXRoKGNvbnN0IHN0ZDo6c3RyaW5nICYgdGFiID0gIiIpIGNvbnN0OworCisJdm9pZCB1cGRhdGVPZmZzZXRQYXRoKCk7CisKKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVBvaW50ZXJOYXR1cmUKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCBQT0lOVEVSX0RBVEFfTkFUVVJFIGdldFBvaW50ZXJOYXR1cmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUG9pbnRlck5hdHVyZSApOworCX0KKworCWJvb2wgaXNDb25jcmV0ZUFycmF5SW5kZXgoKTsKKworCWJvb2wgaXNDb25jcmV0ZVN0cnVjdEF0dHJpYnV0ZSgpOworCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtTWFyaworCSAqLworCWlubGluZSBhdm1fb2Zmc2V0X3QgZ2V0TWFyaygpCisJeworCQlyZXR1cm4oIG1NYXJrICk7CisJfQorCisJaW5saW5lIHZvaWQgZXJhc2VNYXJrKCkKKwl7CisJCW1NYXJrID0gMDsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRNYXJrKGF2bV9vZmZzZXRfdCBhTWFyaykKKwl7CisJCW1NYXJrID0gYU1hcms7CisJfQorCisKKworCS8qKgorCSAqIEZvcm1hdCBhIHZhbHVlIHcuci50LiBpdHMgdHlwZQorCSAqLworCXZpcnR1YWwgdm9pZCBmb3JtYXRTdHJlYW0oT3V0U3RyZWFtICYgb3MsIGNvbnN0IEJGICYgYmZWYWx1ZSkgY29uc3Q7CisKKwl2aXJ0dWFsIHZvaWQgZm9ybWF0U3RyZWFtKE91dFN0cmVhbSAmIG9zLCBjb25zdCBBcnJheUJGICYgYXJyYXlWYWx1ZSkgY29uc3Q7CisKKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwl2b2lkIHN0ckhlYWRlcihPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKKwlzdGQ6OnN0cmluZyBzdHJIZWFkZXJJZCgpIGNvbnN0OworCisJdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKKworCWlubGluZSB2b2lkIHN0clZhbHVlKE91dFN0cmVhbSAmIG9zLCBjb25zdCBCRiAmIGFWYWx1ZSkgY29uc3QKKwl7CisJCW9zIDw8IEFWTV9TVFJfSU5ERU5UOyAvLzw8IElHTk9SRV9GSVJTVF9UQUI7CisKKwkJaWYoIGFWYWx1ZS52YWxpZCgpICkKKwkJeworCQkJZm9ybWF0U3RyZWFtKCBvcyA8PCBUQUIgLCBhVmFsdWUgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWFWYWx1ZS50b1N0cmVhbSggb3MgKTsKKwkJfQorCisJCW9zIDw8IEVORF9JTkRFTlQ7CisJfQorCisJaW5saW5lIHZvaWQgc3RyVmFsdWUoT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQlzdHJWYWx1ZSggb3MsIG1WYWx1ZSApOworCX0KKworCWlubGluZSB2b2lkIHN0ckJWYWx1ZShPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCXN0clZhbHVlKCBvcywgbUJ1ZmZlclZhbHVlICk7CisJfQorCisKKwlpbmxpbmUgc3RkOjpzdHJpbmcgc3RyVmFsdWUoY29uc3QgQkYgJiBhVmFsdWUpIGNvbnN0CisJeworCQlTdHJpbmdPdXRTdHJlYW0gb3NzOworCisJCWZvcm1hdFN0cmVhbSggb3NzICwgYVZhbHVlICk7CisKKwkJcmV0dXJuKCBvc3Muc3RyKCkgKTsKKwl9CisKKworCWlubGluZSBzdGQ6OnN0cmluZyBzdHJWYWx1ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1WYWx1ZS52YWxpZCgpID8gc3RyVmFsdWUobVZhbHVlKSA6IG1WYWx1ZS5zdHIoKSApOworCX0KKworCWlubGluZSBzdGQ6OnN0cmluZyBzdHJCVmFsdWUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQnVmZmVyVmFsdWUudmFsaWQoKSA/CisJCQkJc3RyVmFsdWUobUJ1ZmZlclZhbHVlKSA6IG1CdWZmZXJWYWx1ZS5zdHIoKSApOworCX0KKworfTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEluc3RhbmNlT2ZEYXRhCisvLyBUWVBFIERFRklOSVRJT04gZm9yIFRBQkxFICwgU01BUlQgUE9JTlRFUiBhbmQgQ09OVEFJTkVSCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordHlwZWRlZiAgVGFibGVPZkJGX1Q8IEluc3RhbmNlT2ZEYXRhID4gIFRhYmxlT2ZJbnN0YW5jZU9mRGF0YTsKKworCit9CisKKyNlbmRpZiAvKiBJTlNUQU5DRU9GREFUQV9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZk1hY2hpbmUuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZk1hY2hpbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MThmMDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mTWFjaGluZS5jcHAKQEAgLTAsMCArMSw0ODggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiA1IGFvw7t0IDIwMDgKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkluc3RhbmNlT2ZNYWNoaW5lLmgiCisKKyNpbmNsdWRlIDxmbWwvY29tbW9uL1NwZWNpZmllckVsZW1lbnQuaD4KKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0F2bVByb2dyYW0uaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlRm9ybS5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvUnVudGltZUlELmg+CisKKyNpbmNsdWRlIDxmbWwvdHlwZS9UeXBlTWFuYWdlci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitzdGQ6OnN0cmluZyBJbnN0YW5jZU9mTWFjaGluZTo6VEhJU19GUU5fU1VGRklYID0gIi4kdGhpcyI7CitzdGQ6OnN0cmluZyBJbnN0YW5jZU9mTWFjaGluZTo6VEhJU19JRCAgPSAiJHRoaXMiOworCisKKy8qKgorICogQ09OU1RSVUNUT1IKKyAqIERlZmF1bHQKKyAqLworSW5zdGFuY2VPZk1hY2hpbmU6Okluc3RhbmNlT2ZNYWNoaW5lKEV4ZWN1dGFibGVGb3JtICogYUNvbnRhaW5lciwKKwkJY29uc3QgTWFjaGluZSAqIGFzdE1hY2hpbmUsIEV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlLAorCQlJbnN0YW5jZU9mTWFjaGluZSAqIGFuSW5zdGFuY2VNb2RlbCwgYXZtX29mZnNldF90IGFuT2Zmc2V0KQorOiBCYXNlSW5zdGFuY2VGb3JtKENMQVNTX0tJTkRfVCggSW5zdGFuY2VPZk1hY2hpbmUgKSwKKwkJYUNvbnRhaW5lciwgYXN0TWFjaGluZSwgVHlwZU1hbmFnZXI6Ok1BQ0hJTkUsIGFuT2Zmc2V0KSwKK1NwZWNpZmllckltcGwoIGFzdE1hY2hpbmUgKSwKKworbUV4ZWN1dGFibGUoIGFuRXhlY3V0YWJsZSApLAorCittVGhpc0ZsYWcoIGZhbHNlICksCisKK29uQ3JlYXRlUm91dGluZSAoIFNwZWNpZmllcjo6U0NPUEVfUk9VVElORV9LSU5EICwgYW5FeGVjdXRhYmxlICwgImNyZWF0ZSIgICwgMCApLAorb25TdGFydFJvdXRpbmUoIFNwZWNpZmllcjo6U0NPUEVfUk9VVElORV9LSU5EICwgYW5FeGVjdXRhYmxlICwgImluaXQiICwgMCApLAorCittUG9zc2libGVEeW5hbWljSW5zdGFuY2lhdGlvbkNvdW50KCAwICksCittTWF4aW1hbEluc3RhbmNlQ291bnQoIDEgKSwKK21QYXJhbVJldHVyblRhYmxlKCApLAorbVJldHVybk9mZnNldCggMCApLAorbUluc3RhbmNlTW9kZWwoIGFuSW5zdGFuY2VNb2RlbCApLAorbVJ1bnRpbWVSSUQoICksCittTW9kaWZpZXJBdXRvU3RhcnQoIHRydWUgKSwKKworbUlucHV0RW5hYmxlZEJ1ZmZlciggKSwKK21JbnB1dEVuYWJsZWRDb20oICksCittSW5wdXRFbmFibGVkU2F2ZSggKQoreworCXVwZGF0ZUZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7Cit9CisKKworSW5zdGFuY2VPZk1hY2hpbmU6Okluc3RhbmNlT2ZNYWNoaW5lKEV4ZWN1dGFibGVGb3JtICogYUNvbnRhaW5lciwKKwkJY29uc3QgTWFjaGluZSAqIGFzdE1hY2hpbmUsIEV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlLAorCQlJbnN0YW5jZU9mTWFjaGluZSAqIGFuSW5zdGFuY2VNb2RlbCwKKwkJYXZtX29mZnNldF90IGFuT2Zmc2V0LCBjb25zdCBTcGVjaWZpZXIgJiBhU3BlY2lmaWVyKQorOiBCYXNlSW5zdGFuY2VGb3JtKENMQVNTX0tJTkRfVCggSW5zdGFuY2VPZk1hY2hpbmUgKSwKKwkJYUNvbnRhaW5lciwgYXN0TWFjaGluZSwgVHlwZU1hbmFnZXI6Ok1BQ0hJTkUsIGFuT2Zmc2V0KSwKK1NwZWNpZmllckltcGwoIGFTcGVjaWZpZXIgKSwKKworbUV4ZWN1dGFibGUoIGFuRXhlY3V0YWJsZSApLAorCittVGhpc0ZsYWcoIGZhbHNlICksCisKK29uQ3JlYXRlUm91dGluZSAoIFNwZWNpZmllcjo6U0NPUEVfUk9VVElORV9LSU5EICwgYW5FeGVjdXRhYmxlICwgImNyZWF0ZSIgICwgMCApLAorb25TdGFydFJvdXRpbmUoIFNwZWNpZmllcjo6U0NPUEVfUk9VVElORV9LSU5EICwgYW5FeGVjdXRhYmxlICwgImluaXQiICwgMCApLAorCittUG9zc2libGVEeW5hbWljSW5zdGFuY2lhdGlvbkNvdW50KCAwICksCittTWF4aW1hbEluc3RhbmNlQ291bnQoIDEgKSwKK21QYXJhbVJldHVyblRhYmxlKCApLAorbVJldHVybk9mZnNldCggMCApLAorbUluc3RhbmNlTW9kZWwoIGFuSW5zdGFuY2VNb2RlbCApLAorbVJ1bnRpbWVSSUQoICksCittTW9kaWZpZXJBdXRvU3RhcnQoIHRydWUgKSwKKworbUlucHV0RW5hYmxlZEJ1ZmZlciggKSwKK21JbnB1dEVuYWJsZWRDb20oICksCittSW5wdXRFbmFibGVkU2F2ZSggKQoreworCXVwZGF0ZUZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7Cit9CisKKworLyoqCisgKiBDT05TVFJVQ1RPUgorICogZm9yIHRoZSBpbnN0YW5jZSA8PCB0aGlzID4+CisgKi8KK0luc3RhbmNlT2ZNYWNoaW5lICogSW5zdGFuY2VPZk1hY2hpbmU6Om5ld1RoaXMoRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGUsCisJCQlJbnN0YW5jZU9mTWFjaGluZSAqIGFuSW5zdGFuY2VNb2RlbCwgYXZtX29mZnNldF90IGFuT2Zmc2V0KQoreworCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggYW5PZmZzZXQgPT0gMCApCisJCQk8PCAiVW5leHBlY3RlZCBhIG5vbi16ZXJvIG9mZnNldDwgIiA8PCBhbk9mZnNldAorCQkJPDwgIiA+IGZvciB0aGUgaW5zdGFuY2UgPDwgdGhpcyA+PiAhISEiIDw8IHN0ZDo6ZW5kbAorCQkJPDwgc3RyX2hlYWRlciggYW5FeGVjdXRhYmxlLT5nZXRJbnN0YW5jZVN0YXRpYygpICkKKwkJCTw8IHN0cl9oZWFkZXIoIGFuSW5zdGFuY2VNb2RlbCApCisJCQk8PCBTRU5EX0VYSVQ7CisKKwlJbnN0YW5jZU9mTWFjaGluZSAqIHRoaXNJbnN0YW5jZSA9CisJCQluZXcgSW5zdGFuY2VPZk1hY2hpbmUoYW5FeGVjdXRhYmxlLAorCQkJCQlhbkV4ZWN1dGFibGUtPmdldEFzdE1hY2hpbmUoKSwKKwkJCQkJYW5FeGVjdXRhYmxlLCBhbkluc3RhbmNlTW9kZWwsIDApOworCisJdGhpc0luc3RhbmNlLT5nZXR3U3BlY2lmaWVyKCkuc2V0RGVzaWduSW5zdGFuY2VTdGF0aWMoKTsKKwl0aGlzSW5zdGFuY2UtPnNldEluc3RhbmNpYXRpb25Db3VudCgxKTsKKworCWFuSW5zdGFuY2VNb2RlbC0+aW5jckluc3RhbmNpYXRpb25Db3VudCgpOworCisJdGhpc0luc3RhbmNlLT5zZXRBbGxOYW1lSUQoCisJCQl0aGlzSW5zdGFuY2UtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgKyBUSElTX0ZRTl9TVUZGSVgsCisJCQlUSElTX0lEICk7CisKKwl0aGlzSW5zdGFuY2UtPnNldFRoaXMoIHRydWUgKTsKKworCXJldHVybiggdGhpc0luc3RhbmNlICk7Cit9CisKKworSW5zdGFuY2VPZk1hY2hpbmUgKiBJbnN0YW5jZU9mTWFjaGluZTo6bmV3SW5zdGFuY2VNb2RlbFRoaXMoCisJCUV4ZWN1dGFibGVGb3JtICogYUNvbnRhaW5lciwgTWFjaGluZSAqIGFDb21waWxlZCwKKwkJRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGUsIEluc3RhbmNlT2ZNYWNoaW5lICogYW5JbnN0YW5jZU1vZGVsLAorCQlhdm1fb2Zmc2V0X3QgYW5PZmZzZXQsIGNvbnN0IFNwZWNpZmllciAmIGFTcGVjaWZpZXIpCit7CisJQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKCBhbk9mZnNldCA9PSAwICkKKwkJCTw8ICJVbmV4cGVjdGVkIGEgbm9uLXplcm8gb2Zmc2V0PCAiIDw8IGFuT2Zmc2V0CisJCQk8PCAiID4gZm9yIHRoZSBpbnN0YW5jZSA8PCB0aGlzID4+ICEhISIgPDwgc3RkOjplbmRsCisJCQk8PCBzdHJfaGVhZGVyKCBhbkV4ZWN1dGFibGUtPmdldEluc3RhbmNlU3RhdGljKCkgKQorCQkJPDwgc3RyX2hlYWRlciggYW5JbnN0YW5jZU1vZGVsICkKKwkJCTw8IFNFTkRfRVhJVDsKKworCUluc3RhbmNlT2ZNYWNoaW5lICogdGhpc0luc3RhbmNlID0gbmV3IEluc3RhbmNlT2ZNYWNoaW5lKGFDb250YWluZXIsCisJCQlhQ29tcGlsZWQsIGFuRXhlY3V0YWJsZSwgTlVMTCwgYW5PZmZzZXQsIGFTcGVjaWZpZXIgKTsKKworCXRoaXNJbnN0YW5jZS0+c2V0QWxsTmFtZUlEKAorCQkJdGhpc0luc3RhbmNlLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpICsgVEhJU19GUU5fU1VGRklYLAorCQkJVEhJU19JRCApOworCisJdGhpc0luc3RhbmNlLT5zZXRUaGlzKCB0cnVlICk7CisKKwlyZXR1cm4oIHRoaXNJbnN0YW5jZSApOworfQorCisKKy8qKgorICogR0VUVEVSIC0gU0VUVEVSCisgKiBtUGFyYW1SZXR1cm5UYWJsZQorICogbVJldHVybk9mZnNldAorICovCitCYXNlVHlwZVNwZWNpZmllciAqIEluc3RhbmNlT2ZNYWNoaW5lOjpnZXRQYXJhbVR5cGUoYXZtX3NpemVfdCBvZmZzZXQpIGNvbnN0Cit7CisJcmV0dXJuKCBoYXNFeGVjdXRhYmxlKCkgPworCQkJZ2V0RXhlY3V0YWJsZSgpLT5yYXdQYXJhbURhdGEob2Zmc2V0KS0+Z2V0VHlwZVNwZWNpZmllcigpIDogTlVMTCApOworfQorCisKKy8qKgorICogU0VUVEVSCisgKiBtRnVsbHlRdWFsaWZpZWROYW1lSUQKKyAqLwordm9pZCBJbnN0YW5jZU9mTWFjaGluZTo6dXBkYXRlRnVsbHlRdWFsaWZpZWROYW1lSUQoKQoreworCXN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgcG9zID0KKwkJCW1GdWxseVF1YWxpZmllZE5hbWVJRC5maW5kKEZRTl9JRF9ST09UX1NFUEFSQVRPUik7CisJaWYoIHBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisJeworCQlzZXRGdWxseVF1YWxpZmllZE5hbWVJRCggKCBnZXRTcGVjaWZpZXIoKS5pc0Rlc2lnbk1vZGVsKCkgPyAibW9kZWwiIDoKKwkJCQkoIGdldFNwZWNpZmllcigpLmlzRGVzaWduUHJvdG90eXBlU3RhdGljKCkgPyAicHJvdCIgOiAiaW5zdCIgKSApCisJCQkJKyBtRnVsbHlRdWFsaWZpZWROYW1lSUQuc3Vic3RyKHBvcykgKTsKKwl9Cit9CisKKworLyoqCisgKiBHRVRURVIgLSBTRVRURVIKKyAqIG1Qb3NzaWJsZUR5bmFtaWNJbnN0YW5jaWF0aW9uQ291bnQKKyAqLwordm9pZCBJbnN0YW5jZU9mTWFjaGluZTo6aW5jclBvc3NpYmxlRHluYW1pY0luc3RhbmNpYXRpb25Db3VudChhdm1fc2l6ZV90IG9mZnNldCkKK3sKKwlpZiggbUluc3RhbmNlTW9kZWwgIT0gTlVMTCApCisJeworCQltSW5zdGFuY2VNb2RlbC0+bVBvc3NpYmxlRHluYW1pY0luc3RhbmNpYXRpb25Db3VudCArPSBvZmZzZXQ7CisJfQorLy8JZWxzZQorCXsKKwkJbVBvc3NpYmxlRHluYW1pY0luc3RhbmNpYXRpb25Db3VudCArPSBvZmZzZXQ7CisJfQorCisJaWYoIG1FeGVjdXRhYmxlICE9IE5VTEwgKQorCXsKKwkJbUV4ZWN1dGFibGUtPmluY3JQb3NzaWJsZUR5bmFtaWNJbnN0YW5jaWF0aW9uQ291bnQob2Zmc2V0KTsKKwl9Cit9CisKKworLyoqCisgKiBTZXJpYWxpemF0aW9uCisgKi8KK3ZvaWQgSW5zdGFuY2VPZk1hY2hpbmU6OmhlYWRlcihPdXRTdHJlYW0gJiBvdXQpIGNvbnN0Cit7CisJb3V0IDw8IGdldE1vZGlmaWVyKCkudG9TdHJpbmcoKSA8PCBnZXRTcGVjaWZpZXIoKS5zdHJGZWF0dXJlKCkKKwkJPDwgZ2V0U3BlY2lmaWVyKCkuc3RyRGVzaWduX25vdCggU3BlY2lmaWVyOjpERVNJR05fSU5TVEFOQ0VfS0lORCApCisJCTw8ICJpbnN0YW5jZTwgaWQ6IiA8PCBnZXRPZmZzZXQoKTsKKworCUluc3RhbmNlU3BlY2lmaWVyUGFydDo6c3RyTXVsdGlwbGljaXR5KAorCQkJb3V0LCBtSW5zdGFuY2lhdGlvbkNvdW50LAorCQkJbVBvc3NpYmxlRHluYW1pY0luc3RhbmNpYXRpb25Db3VudCwKKwkJCW1NYXhpbWFsSW5zdGFuY2VDb3VudCwgIiwgbXVsdGlwbGljaXR5OiBbICIsICIgXSIpOworCisvLwlpZiggbUluc3RhbmNpYXRpb25Db3VudCAhPSAxICkKKy8vCXsKKy8vCQlvdXQgPDwgIiwgaW5pdDoiIDw8IG1JbnN0YW5jaWF0aW9uQ291bnQ7CisvLwl9CisvLwlpZiggbVBvc3NpYmxlRHluYW1pY0luc3RhbmNpYXRpb25Db3VudCA+IDAgKQorLy8JeworLy8JCW91dCA8PCAiLCBkeW5hOiIgPDwgbVBvc3NpYmxlRHluYW1pY0luc3RhbmNpYXRpb25Db3VudDsKKy8vCX0KKy8vCWlmKCBoYXNNYXhpbWFsTmV3SW5zdGFuY2UoKSApCisvLwl7CisvLwkJb3V0IDw8ICIsIG1heDoiIDw8IGdldE1heGltYWxJbnN0YW5jZUNvdW50KCk7CisvLwl9CisKKwlpZiggaXNUaGlzKCkgKQorCXsKKwkJb3V0IDw8ICIsIHRoaXMiOworCX0KKwlpZiggbm90IGlzQXV0b1N0YXJ0KCkgKQorCXsKKwkJb3V0IDw8ICIsIGF1dG9zdGFydCA9IGZhbHNlIjsKKwl9CisKKwlvdXQgPDwgIiA+IjsKKworQVZNX0lGX0RFQlVHX0ZMQUdfT1IoIENPTVBJTElORyAsIGdldFNwZWNpZmllcigpLmlzRGVzaWduSW5zdGFuY2VTdGF0aWMoKSApCisKKwlvdXQgPDwgIiAmIiA8PCAoIGhhc0V4ZWN1dGFibGUoKSA/CisJCWdldEV4ZWN1dGFibGUoKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA6ICJudWxsPCBleGVjdXRhYmxlID4iICk7CisKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBDT01QSUxJTkcgKQorCisJb3V0IDw8ICIgIiA8PCBnZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOworfQorCit2b2lkIEluc3RhbmNlT2ZNYWNoaW5lOjpzdHJIZWFkZXIoT3V0U3RyZWFtICYgb3V0KSBjb25zdAoreworCWhlYWRlciggb3V0ICk7CisKKwlpZiggaGFzUGFyYW0oKSApCisJeworCQlvdXQgPDwgIiggIjsKKwkJVGFibGVPZkRhdGE6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZ2V0UGFyYW1SZXR1cm5UYWJsZSgpLT5iZWdpbigpOworCQlvdXQgPDwgKCppdCkuc3RyKCk7CisKKwkJVGFibGVPZkRhdGE6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gZ2V0UGFyYW1SZXR1cm5UYWJsZSgpLT5lbmQoKTsKKwkJZm9yKCArK2l0IDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJeworCQkJb3V0IDw8ICIsICIgPDwgKCppdCkuc3RyKCk7CisJCX0KKwkJb3V0IDw8ICIgKSI7CisJfQorfQorCisKK3ZvaWQgSW5zdGFuY2VPZk1hY2hpbmU6OnRvU3RyZWFtKE91dFN0cmVhbSAmIG91dCkgY29uc3QKK3sKKwlpZiggb3V0LnByZWZlcmFibHlGUU4oKSApCisJeworCQlvdXQgPDwgVEFCIDw8IGdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7CisKKwkJQVZNX0RFQlVHX1JFRl9DT1VOVEVSKG91dCk7CisKKwkJcmV0dXJuOworCX0KKworCWJvb2wgaXNFbXB0eSA9IHRydWU7CisKKwloZWFkZXIoIG91dCA8PCBUQUIgKTsKKworCUFWTV9ERUJVR19SRUZfQ09VTlRFUihvdXQpOworCitBVk1fSUZfREVCVUdfRkxBRyggQ09NUElMSU5HICkKKwlvdXQgPDwgIiB7IiA8PCBFT0w7IGlzRW1wdHkgPSBmYWxzZTsKKworCW91dCA8PCBUQUIgPDwgIi8vcHJvcGVydHk6IiA8PCBFT0w7CisKKwlpZiggaGFzQXN0RWxlbWVudCgpICkKKwl7CisJCW91dCA8PCBUQUIyIDw8ICIvL2NvbXBpbGVkID0gIgorCQkJPDwgZ2V0QXN0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiOyIgPDwgRU9MOworCX0KKworCW91dCA8PCBUQUIyIDw8ICIvL2NvbnRhaW5lciA9ICIKKwkJPDwgKGhhc0NvbnRhaW5lcigpID8gZ2V0Q29udGFpbmVyKCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgOiAibnVsbCIpCisJCTw8ICI7IiA8PCBFT0w7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggQ09NUElMSU5HICkKKworCWlmKCBoYXNJbnN0YW5jZU1vZGVsKCkgKQorCXsKKwkJaWYoIGlzRW1wdHkgKSB7IG91dCA8PCAiIHsiIDw8IEVPTDsgaXNFbXB0eSA9IGZhbHNlOyB9CisKKwkJb3V0IDw8IFRBQjIgPDwgIi8vbW9kZWwgPSAiCisJCQk8PCBnZXRJbnN0YW5jZU1vZGVsKCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIjsiIDw8IEVPTDsKKwl9CisKKwlpZiggaGFzQWxpYXNUYXJnZXQoKSApCisJeworCQlpZiggaXNFbXB0eSApIHsgb3V0IDw8ICIgeyIgPDwgRU9MOyBpc0VtcHR5ID0gZmFsc2U7IH0KKwkJb3V0IDw8IFRBQjIgPDwgInRhcmdldCA9ICIKKwkJCTw8IHN0cl9oZWFkZXIoIGdldEFsaWFzVGFyZ2V0KCktPmFzPCBJbnN0YW5jZU9mTWFjaGluZSA+KCkgKQorCQkJPDwgIjsiIDw8IEVPTDsKKwl9CisKKwlpZiggaGFzQ3JlYXRvckNvbnRhaW5lclJJRCgpICkKKwl7CisJCWlmKCBpc0VtcHR5ICkgeyBvdXQgPDwgIiB7IiA8PCBFT0w7IGlzRW1wdHkgPSBmYWxzZTsgfQorCQlvdXQgPDwgVEFCMiA8PCAicmlkI2NyZWF0b3IgPSAiIDw8IGdldENyZWF0b3JDb250YWluZXJSSUQoKS5zdHIoKQorCQkJPDwgIjsiIDw8IEVPTDsKKwl9CisKKwlpZiggaGFzUnVudGltZUNvbnRhaW5lclJJRCgpICkKKwl7CisJCWlmKCBpc0VtcHR5ICkgeyBvdXQgPDwgIiB7IiA8PCBFT0w7IGlzRW1wdHkgPSBmYWxzZTsgfQorCQlvdXQgPDwgVEFCMiA8PCAicmlkI2NvbnRhaW5lciA9ICIgPDwgZ2V0UnVudGltZUNvbnRhaW5lclJJRCgpLnN0cigpCisJCQk8PCAiOyIgPDwgRU9MOworCX0KKworCWlmKCBoYXNSdW50aW1lUklEKCkgKQorCXsKKwkJaWYoIGlzRW1wdHkgKSB7IG91dCA8PCAiIHsiIDw8IEVPTDsgaXNFbXB0eSA9IGZhbHNlOyB9CisJCW91dCA8PCBUQUIyIDw8ICJyaWQjcnVudGltZSA9ICIgPDwgZ2V0UnVudGltZVJJRCgpLnN0cigpIDw8ICI7IiA8PCBFT0w7CisJfQorCisJaWYoIGhhc01hY2hpbmVQYXRoKCkgKQorCXsKKwkJaWYoIGlzRW1wdHkgKSB7IG91dCA8PCAiIHsiIDw8IEVPTDsgaXNFbXB0eSA9IGZhbHNlOyB9CisKKwkJb3V0IDw8IFRBQiA8PCAicGF0aCNtYWNoaW5lOiIgPDwgRU9MOworCQlBcnJheU9mSW5zdGFuY2VPZk1hY2hpbmU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZ2V0TWFjaGluZVBhdGgoKS0+YmVnaW4oKTsKKwkJQXJyYXlPZkluc3RhbmNlT2ZNYWNoaW5lOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IGdldE1hY2hpbmVQYXRoKCktPmVuZCgpOworCQlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJeworCQkJb3V0IDw8IFRBQjIgPDwgKCppdCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgRU9MOworCQl9CisJfQorCisJaWYoIGhhc1BhcmFtUmV0dXJuVGFibGUoKSApCisJeworCQlpZiggaXNFbXB0eSApIHsgb3V0IDw8ICIgeyIgPDwgRU9MOyBpc0VtcHR5ID0gZmFsc2U7IH0KKworCQlUYWJsZU9mRGF0YTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBnZXRQYXJhbVJldHVyblRhYmxlKCktPmJlZ2luKCk7CisJCWF2bV9vZmZzZXRfdCBvZmZzZXQgPSAwOworCQlhdm1fb2Zmc2V0X3QgZW5kT2Zmc2V0ID0gMDsKKworCQlpZiggaGFzUGFyYW0oKSApCisJCXsKKwkJCW91dCA8PCBUQUIgPDwgInBhcmFtZXRlcjoiIDw8IEVPTDsKKwkJCWVuZE9mZnNldCA9IGdldFBhcmFtQ291bnQoKTsKKwkJCWZvciggb2Zmc2V0ID0gMCA7IG9mZnNldCA8IGVuZE9mZnNldCA7ICsraXQgLCArK29mZnNldCApCisJCQl7CisJCQkJb3V0IDw8IFRBQjI7CisJCQkJaWYoIGhhc0V4ZWN1dGFibGUoKSApCisJCQkJeworCQkJCQlvdXQgPDwgc3RyX2hlYWRlciggZ2V0RXhlY3V0YWJsZSgpLT5yYXdQYXJhbURhdGEob2Zmc2V0KSApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlvdXQgPDwgIiQiIDw8IG9mZnNldDsKKwkJCQl9CisKKwkJCQlpZiggKCppdCkudmFsaWQoKSApCisJCQkJeworCQkJCQlpZiggKCppdCkuaXM8IEJhc2VJbnN0YW5jZUZvcm0gPigpICkKKwkJCQkJeworCQkJCQkJb3V0IDw8ICIgPSAmIiA8PCAoKml0KS50b19wdHI8CisJCQkJCQkJQmFzZUluc3RhbmNlRm9ybSA+KCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlvdXQgPDwgIiA9ICIgPDwgKCppdCkuc3RyKCk7CisJCQkJCX0KKwkJCQl9CisJCQkJb3V0IDw8ICI7IiA8PCBFT0w7CisJCQl9CisJCX0KKworCQlpZiggaGFzUmV0dXJuKCkgKQorCQl7CisJCQlvdXQgPDwgVEFCIDw8ICJyZXR1cm5zOiIgPDwgRU9MOworCQkJZW5kT2Zmc2V0ID0gZ2V0UmV0dXJuQ291bnQoKTsKKwkJCWZvciggb2Zmc2V0ID0gMCA7IG9mZnNldCA8IGVuZE9mZnNldCA7ICsraXQgLCArK29mZnNldCApCisJCQl7CisJCQkJb3V0IDw8IFRBQjI7CisJCQkJaWYoIGhhc0V4ZWN1dGFibGUoKSApCisJCQkJeworCQkJCQlvdXQgPDwgc3RyX2hlYWRlciggZ2V0RXhlY3V0YWJsZSgpLT5yYXdSZXR1cm5EYXRhKG9mZnNldCkgKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJb3V0IDw8ICIkIiA8PCBvZmZzZXQ7CisJCQkJfQorCisJCQkJaWYoICgqaXQpLnZhbGlkKCkgKQorCQkJCXsKKwkJCQkJaWYoICgqaXQpLmlzPCBCYXNlSW5zdGFuY2VGb3JtID4oKSApCisJCQkJCXsKKwkJCQkJCW91dCA8PCAiID0gJiIgPDwgKCppdCkudG9fcHRyPAorCQkJCQkJCUJhc2VJbnN0YW5jZUZvcm0gPigpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJb3V0IDw8ICIgPSAiIDw8ICgqaXQpLnN0cigpOworCQkJCQl9CisJCQkJfQorCQkJCW91dCA8PCAiOyIgPDwgRU9MOworCQkJfQorCQl9CisJfQorCisvL0FWTV9JRl9ERUJVR19GTEFHKCBDT01NVU5JQ0FUSU9OICkKKwlpZiAoIGhhc0lucHV0RW5hYmxlZEJ1ZmZlcigpICkKKwl7CisJCWlmKCBpc0VtcHR5ICkgeyBvdXQgPDwgIiB7IiA8PCBFT0w7IGlzRW1wdHkgPSBmYWxzZTsgfQorCisJCW91dCA8PCBUQUIgPDwgImJ1ZmZlciNpbnB1dF9lbmFibGVkeyIgPDwgRU9MOworCQl0b1N0cmVhbVN0YXRpY0NvbShvdXQsIGdldElucHV0RW5hYmxlZEJ1ZmZlcigpKTsKKwkJb3V0IDw8IFRBQiA8PCAifSIgPDwgRU9MOworCX0KKworCWlmICggaGFzSW5wdXRFbmFibGVkQ29tKCkgKQorCXsKKwkJaWYoIGlzRW1wdHkgKSB7IG91dCA8PCAiIHsiIDw8IEVPTDsgaXNFbXB0eSA9IGZhbHNlOyB9CisKKwkJb3V0IDw8IFRBQiA8PCAiY29tI2lucHV0X2VuYWJsZWR7IiA8PCBFT0w7CisJCXRvU3RyZWFtU3RhdGljQ29tKG91dCwgZ2V0SW5wdXRFbmFibGVkQ29tKCkpOworCQlvdXQgPDwgVEFCIDw8ICJ9IiA8PCBFT0w7CisJfQorCisJaWYgKCBoYXNJbnB1dEVuYWJsZWRTYXZlKCkgKQorCXsKKwkJaWYoIGlzRW1wdHkgKSB7IG91dCA8PCAiIHsiIDw8IEVPTDsgaXNFbXB0eSA9IGZhbHNlOyB9CisKKwkJb3V0IDw8IFRBQiA8PCAiY29tI2lucHV0X2VuYWJsZWQjc2F2ZXsiIDw8IEVPTDsKKwkJdG9TdHJlYW1TdGF0aWNDb20ob3V0LCBnZXRJbnB1dEVuYWJsZWRTYXZlKCkpOworCQlvdXQgPDwgVEFCIDw8ICJ9IiA8PCBFT0w7CisJfQorLy9BVk1fRU5ESUZfREVCVUdfRkxBRyggQ09NTVVOSUNBVElPTiApCisKKwlpZiggaGFzUGFyYW1SZXR1cm4oKSAmJiAoaGFzT25DcmVhdGUoKSB8fCBoYXNPblN0YXJ0KCkpICkKKwl7CisJCW91dCA8PCBUQUIgPDwgIm1vZToiIDw8IEVPTDsKKworCX0KKwlpZiggaGFzT25DcmVhdGUoKSApCisJeworCQlvdXQgPDwgVEFCMiA8PCAiQGNyZWF0ZXsiIDw8IElOQ1IyX0lOREVOVDsKKwkJZ2V0T25DcmVhdGUoKS0+dG9TdHJlYW1Sb3V0aW5lKCBvdXQgKTsKKwkJb3V0IDw8IERFQ1IyX0lOREVOVF9UQUIyIDw8ICJ9IiA8PCBFT0w7CisJfQorCisJaWYoIGhhc09uU3RhcnQoKSApCisJeworCQlvdXQgPDwgVEFCMiA8PCAiQHN0YXJ0eyIgPDwgSU5DUjJfSU5ERU5UOworCQlnZXRPblN0YXJ0KCktPnRvU3RyZWFtUm91dGluZSggb3V0ICk7CisJCW91dCA8PCBERUNSMl9JTkRFTlRfVEFCMiA8PCAifSIgPDwgRU9MOworCX0KKworCisJKCBpc0VtcHR5ID8gKG91dCA8PCAiOyIpIDogKG91dCA8PCBUQUIgPDwgIn0iKSApIDw8IEVPTF9GTFVTSDsKK30KKworCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZNYWNoaW5lLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mTWFjaGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNWI0MzAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mTWFjaGluZS5oCkBAIC0wLDAgKzEsNzMxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogNSBhb8O7dCAyMDA4CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgSU5TVEFOQ0VPRk1BQ0hJTkVfSF8KKyNkZWZpbmUgSU5TVEFOQ0VPRk1BQ0hJTkVfSF8KKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0Jhc2VJbnN0YW5jZUZvcm0uaD4KKyNpbmNsdWRlIDxmbWwvY29tbW9uL1NwZWNpZmllckVsZW1lbnQuaD4KKworI2luY2x1ZGUgPGNvbW1vbi9Bdm1Qb2ludGVyLmg+CisKKyNpbmNsdWRlIDxjb2xsZWN0aW9uL1R5cGVkZWYuaD4KKworI2luY2x1ZGUgPGZtbC9jb21tb24vTW9kaWZpZXJFbGVtZW50Lmg+CisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9Bdm1Qcm9ncmFtLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZkJ1ZmZlci5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZEYXRhLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZlBvcnQuaD4KKworI2luY2x1ZGUgPGZtbC9saWIvSUNvbVBvaW50Lmg+CisKKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lSUQuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9UYWJsZU9mRGF0YS5oPgorCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL01hY2hpbmUuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKK2NsYXNzIEJhc2VBdm1Qcm9ncmFtOworCitjbGFzcyBFeGVjdXRhYmxlRm9ybTsKKworY2xhc3MgU3BlY2lmaWVyOworCisKK2NsYXNzIEluc3RhbmNlT2ZNYWNoaW5lIDoKKwkJcHVibGljIEJhc2VJbnN0YW5jZUZvcm0sCisJCXB1YmxpYyBTcGVjaWZpZXJJbXBsLAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIEluc3RhbmNlT2ZNYWNoaW5lICkKK3sKKworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBJbnN0YW5jZU9mTWFjaGluZSApCisKKworcHJvdGVjdGVkOgorCS8qCisJICogQVRUUklCVVRFUworCSAqLworCS8vIHRoZSBFeGVjdXRhYmxlIENvZGUgZm9yIE1hY2hpbmUKKwlFeGVjdXRhYmxlRm9ybSAqIG1FeGVjdXRhYmxlOworCisJYm9vbCBtVGhpc0ZsYWc7CisKKwlBdm1Qcm9ncmFtIG9uQ3JlYXRlUm91dGluZTsKKwlBdm1Qcm9ncmFtIG9uU3RhcnRSb3V0aW5lOworCisJYXZtX3NpemVfdCBtUG9zc2libGVEeW5hbWljSW5zdGFuY2lhdGlvbkNvdW50OworCWF2bV9zaXplX3QgbU1heGltYWxJbnN0YW5jZUNvdW50OworCisJQVBUYWJsZU9mRGF0YSBtUGFyYW1SZXR1cm5UYWJsZTsKKworCWF2bV9zaXplX3QgbVJldHVybk9mZnNldDsKKworCUluc3RhbmNlT2ZNYWNoaW5lICogbUluc3RhbmNlTW9kZWw7CisKKwkvLyBUaGUgcnVudGltZSBtYWNoaW5lIFJJRCBmb3IgUklEIGFjY2VzcyBvcHRpbWl6YXRpb24KKwlSdW50aW1lSUQgbVJ1bnRpbWVSSUQ7CisKKwlib29sIG1Nb2RpZmllckF1dG9TdGFydDsKKworCS8vIHN0YXRpYyBjbGFzcyBvZiBQb3J0L01lc3NhZ2UvU2lnbmFsIGluIGNvbW11bmljYXRlZCBzdGF0ZW1lbnQKKwlMaXN0T2ZJbnN0YW5jZU9mQnVmZmVyIG1JbnB1dEVuYWJsZWRCdWZmZXI7CisJTGlzdE9mSW5zdGFuY2VPZlBvcnQgbUlucHV0RW5hYmxlZENvbTsKKwlMaXN0T2ZJbnN0YW5jZU9mUG9ydCBtSW5wdXRFbmFibGVkU2F2ZTsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJSW5zdGFuY2VPZk1hY2hpbmUoRXhlY3V0YWJsZUZvcm0gKiBhQ29udGFpbmVyLAorCQkJY29uc3QgTWFjaGluZSAqIGFzdE1hY2hpbmUsIEV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlLAorCQkJSW5zdGFuY2VPZk1hY2hpbmUgKiBhbkluc3RhbmNlTW9kZWwsIGF2bV9vZmZzZXRfdCBhbk9mZnNldCk7CisKKwlJbnN0YW5jZU9mTWFjaGluZShFeGVjdXRhYmxlRm9ybSAqIGFDb250YWluZXIsIGNvbnN0IE1hY2hpbmUgKiBhc3RNYWNoaW5lLAorCQkJRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGUsIEluc3RhbmNlT2ZNYWNoaW5lICogYW5JbnN0YW5jZU1vZGVsLAorCQkJYXZtX29mZnNldF90IGFuT2Zmc2V0LCBjb25zdCBTcGVjaWZpZXIgJiBhU3BlY2lmaWVyKTsKKworCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBjb3B5CisJICovCisJSW5zdGFuY2VPZk1hY2hpbmUoY29uc3QgSW5zdGFuY2VPZk1hY2hpbmUgJiBhTWFjaGluZSkKKwk6IEJhc2VJbnN0YW5jZUZvcm0oIGFNYWNoaW5lICksCisJU3BlY2lmaWVySW1wbCggYU1hY2hpbmUgKSwKKworCW1FeGVjdXRhYmxlKCBhTWFjaGluZS5tRXhlY3V0YWJsZSApLAorCisJbVRoaXNGbGFnKCBhTWFjaGluZS5tVGhpc0ZsYWcgKSwKKworCW9uQ3JlYXRlUm91dGluZSAoIGFNYWNoaW5lLm9uQ3JlYXRlUm91dGluZSApLAorCW9uU3RhcnRSb3V0aW5lKCBhTWFjaGluZS5vblN0YXJ0Um91dGluZSApLAorCisJbVBvc3NpYmxlRHluYW1pY0luc3RhbmNpYXRpb25Db3VudCgKKwkJCWFNYWNoaW5lLm1Qb3NzaWJsZUR5bmFtaWNJbnN0YW5jaWF0aW9uQ291bnQgKSwKKwltTWF4aW1hbEluc3RhbmNlQ291bnQoIGFNYWNoaW5lLm1NYXhpbWFsSW5zdGFuY2VDb3VudCApLAorCW1QYXJhbVJldHVyblRhYmxlKCBhTWFjaGluZS5tUGFyYW1SZXR1cm5UYWJsZSApLAorCW1SZXR1cm5PZmZzZXQoIGFNYWNoaW5lLm1SZXR1cm5PZmZzZXQgKSwKKwltSW5zdGFuY2VNb2RlbCggIGFNYWNoaW5lLm1JbnN0YW5jZU1vZGVsICksCisJbVJ1bnRpbWVSSUQoIGFNYWNoaW5lLm1SdW50aW1lUklEICksCisJbU1vZGlmaWVyQXV0b1N0YXJ0KCAgYU1hY2hpbmUubU1vZGlmaWVyQXV0b1N0YXJ0ICksCisKKwltSW5wdXRFbmFibGVkQnVmZmVyKCBhTWFjaGluZS5tSW5wdXRFbmFibGVkQnVmZmVyICksCisJbUlucHV0RW5hYmxlZENvbSggYU1hY2hpbmUubUlucHV0RW5hYmxlZENvbSApLAorCW1JbnB1dEVuYWJsZWRTYXZlKCBhTWFjaGluZS5tSW5wdXRFbmFibGVkU2F2ZSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIGZvciBBbGlhcworCSAqLworCUluc3RhbmNlT2ZNYWNoaW5lKEJhc2VBdm1Qcm9ncmFtICogYUNvbnRhaW5lciwgSW5zdGFuY2VPZk1hY2hpbmUgKiBhVGFyZ2V0LAorCQkJVmVjdG9yT2ZJbnN0YW5jZU9mTWFjaGluZSAmIGFSZWxhdGl2ZU1hY2hpbmVQYXRoKQorCTogQmFzZUluc3RhbmNlRm9ybShDTEFTU19LSU5EX1QoIEluc3RhbmNlT2ZNYWNoaW5lICksCisJCQlhQ29udGFpbmVyLCBhVGFyZ2V0LCBhUmVsYXRpdmVNYWNoaW5lUGF0aCksCisJU3BlY2lmaWVySW1wbCggYVRhcmdldC0+Z2V0U3BlY2lmaWVyKCkgKSwKKworCW1FeGVjdXRhYmxlKCBhVGFyZ2V0LT5tRXhlY3V0YWJsZSApLAorCisJbVRoaXNGbGFnKCBhVGFyZ2V0LT5tVGhpc0ZsYWcgKSwKKworCW9uQ3JlYXRlUm91dGluZSAoIGFUYXJnZXQtPm9uQ3JlYXRlUm91dGluZSApLAorCW9uU3RhcnRSb3V0aW5lKCBhVGFyZ2V0LT5vblN0YXJ0Um91dGluZSApLAorCisJbVBvc3NpYmxlRHluYW1pY0luc3RhbmNpYXRpb25Db3VudCgKKwkJCWFUYXJnZXQtPm1Qb3NzaWJsZUR5bmFtaWNJbnN0YW5jaWF0aW9uQ291bnQgKSwKKwltTWF4aW1hbEluc3RhbmNlQ291bnQoIGFUYXJnZXQtPm1NYXhpbWFsSW5zdGFuY2VDb3VudCApLAorCW1QYXJhbVJldHVyblRhYmxlKCBhVGFyZ2V0LT5tUGFyYW1SZXR1cm5UYWJsZSApLAorCW1SZXR1cm5PZmZzZXQoIGFUYXJnZXQtPm1SZXR1cm5PZmZzZXQgKSwKKwltSW5zdGFuY2VNb2RlbCggIGFUYXJnZXQtPm1JbnN0YW5jZU1vZGVsICksCisJbVJ1bnRpbWVSSUQoIGFUYXJnZXQtPm1SdW50aW1lUklEICksCisJbU1vZGlmaWVyQXV0b1N0YXJ0KCAgYVRhcmdldC0+bU1vZGlmaWVyQXV0b1N0YXJ0ICksCisKKwltSW5wdXRFbmFibGVkQnVmZmVyKCBhVGFyZ2V0LT5tSW5wdXRFbmFibGVkQnVmZmVyICksCisJbUlucHV0RW5hYmxlZENvbSggYVRhcmdldC0+bUlucHV0RW5hYmxlZENvbSApLAorCW1JbnB1dEVuYWJsZWRTYXZlKCBhVGFyZ2V0LT5tSW5wdXRFbmFibGVkU2F2ZSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5JbnN0YW5jZU9mTWFjaGluZSgpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIENvbXBpbGVkIE9iamVjdEVsZW1lbnQgYXMgQ29tcGlsZWQgTWFjaGluZQorCSAqLworCWlubGluZSBjb25zdCBNYWNoaW5lICogZ2V0QXN0TWFjaGluZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldEFzdEVsZW1lbnQoKS0+YXM8IE1hY2hpbmUgPigpICk7CisJfQorCisKKwkvKioKKwkgKiBTRVRURVIKKwkgKiBtRnVsbHlRdWFsaWZpZWROYW1lSUQKKwkgKi8KKwl2aXJ0dWFsIHZvaWQgdXBkYXRlRnVsbHlRdWFsaWZpZWROYW1lSUQoKTsKKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUV4ZWN1dGFibGUKKwkgKi8KKwlpbmxpbmUgRXhlY3V0YWJsZUZvcm0gKiBnZXRFeGVjdXRhYmxlKCkgY29uc3QKKwl7CisJCXJldHVybiggbUV4ZWN1dGFibGUgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNFeGVjdXRhYmxlKCkgY29uc3QKKwl7CisJCXJldHVybiggbUV4ZWN1dGFibGUgIT0gTlVMTCApOworCX0KKworCWlubGluZSB2b2lkIHNldEV4ZWN1dGFibGUoRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGUpCisJeworCQltRXhlY3V0YWJsZSA9IGFuRXhlY3V0YWJsZTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1FeGVjdXRhYmxlCisJICovCisJaW5saW5lIGJvb2wgaXNUaGlzKCkgY29uc3QKKwl7CisJCXJldHVybiggbVRoaXNGbGFnICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNub3RUaGlzKCkgY29uc3QKKwl7CisJCXJldHVybiggbm90IG1UaGlzRmxhZyApOworCX0KKworCWlubGluZSBib29sIGlzVGhpcyhjb25zdCBFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZSkgY29uc3QKKwl7CisJCXJldHVybiggbVRoaXNGbGFnICYmIChtRXhlY3V0YWJsZSA9PSBhbkV4ZWN1dGFibGUpICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNub3RUaGlzKGNvbnN0IEV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobUV4ZWN1dGFibGUgIT0gYW5FeGVjdXRhYmxlKSB8fCAobm90IG1UaGlzRmxhZykgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRUaGlzKGJvb2wgaXNUaGlzRmxhZyA9IHRydWUpCisJeworCQltVGhpc0ZsYWcgPSBpc1RoaXNGbGFnOworCX0KKworCS8qKgorCSAqIENPTlNUUlVDVElPTgorCSAqIHRoZSBpbnN0YW5jZSA8PCB0aGlzID4+CisJICovCisJc3RhdGljIHN0ZDo6c3RyaW5nIFRISVNfRlFOX1NVRkZJWDsKKwlzdGF0aWMgc3RkOjpzdHJpbmcgVEhJU19JRDsKKworCXN0YXRpYyBJbnN0YW5jZU9mTWFjaGluZSAqIG5ld1RoaXMoRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGUsCisJCQlJbnN0YW5jZU9mTWFjaGluZSAqIGFuSW5zdGFuY2VNb2RlbCwgYXZtX29mZnNldF90IGFuT2Zmc2V0KTsKKworCXN0YXRpYyBJbnN0YW5jZU9mTWFjaGluZSAqIG5ld0luc3RhbmNlTW9kZWxUaGlzKAorCQkJRXhlY3V0YWJsZUZvcm0gKiBhQ29udGFpbmVyLCBNYWNoaW5lICogYUNvbXBpbGVkLAorCQkJRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGUsIEluc3RhbmNlT2ZNYWNoaW5lICogYW5JbnN0YW5jZU1vZGVsLAorCQkJYXZtX29mZnNldF90IGFuT2Zmc2V0LCBjb25zdCBTcGVjaWZpZXIgJiBhU3BlY2lmaWVyKTsKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG9uQ3JlYXRlUm91dGluZQorCSAqLworCWlubGluZSBBdm1Qcm9ncmFtICYgZ2V0T25DcmVhdGVSb3V0aW5lKCkKKwl7CisJCXJldHVybiggb25DcmVhdGVSb3V0aW5lICk7CisJfQorCisJaW5saW5lIEJGQ29kZSAmIGdldE9uQ3JlYXRlKCkKKwl7CisJCXJldHVybiggb25DcmVhdGVSb3V0aW5lLmdldENvZGUoKSApOworCX0KKworCWlubGluZSBjb25zdCBCRkNvZGUgJiBnZXRPbkNyZWF0ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uQ3JlYXRlUm91dGluZS5nZXRDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNPbkNyZWF0ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uQ3JlYXRlUm91dGluZS5oYXNDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRPbkNyZWF0ZShjb25zdCBCRkNvZGUgJiBhUHJvZ3JhbSkKKwl7CisJCW9uQ3JlYXRlUm91dGluZS5zZXRDb2RlKCBhUHJvZ3JhbSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogb25TdGFydFJvdXRpbmUKKwkgKi8KKwlpbmxpbmUgQXZtUHJvZ3JhbSAmIGdldE9uU3RhcnRSb3V0aW5lKCkKKwl7CisJCXJldHVybiggb25TdGFydFJvdXRpbmUgKTsKKwl9CisKKwlpbmxpbmUgQkZDb2RlICYgZ2V0T25TdGFydCgpCisJeworCQlyZXR1cm4oIG9uU3RhcnRSb3V0aW5lLmdldENvZGUoKSApOworCX0KKworCWlubGluZSBjb25zdCBCRkNvZGUgJiBnZXRPblN0YXJ0KCkgY29uc3QKKwl7CisJCXJldHVybiggb25TdGFydFJvdXRpbmUuZ2V0Q29kZSgpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzT25TdGFydCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uU3RhcnRSb3V0aW5lLmhhc0NvZGUoKSApOworCX0KKworCWlubGluZSB2b2lkIHNldE9uU3RhcnQoY29uc3QgQkZDb2RlICYgYVByb2dyYW0pCisJeworCQlvblN0YXJ0Um91dGluZS5zZXRDb2RlKCBhUHJvZ3JhbSApOworCX0KKworCisJLyoqCisJICogVVRJTAorCSAqLworCWlubGluZSBib29sIGhhc0JlaGF2aW9yKCkgY29uc3QKKwl7CisJCXJldHVybiggaGFzT25DcmVhdGUoKSB8fCBoYXNPblN0YXJ0KCkgKTsKKwl9CisKKwkvKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1Qb3NzaWJsZUR5bmFtaWNJbnN0YW5jaWF0aW9uQ291bnQKKwkgKiBTaW5nbGUgb3IgTXVsdGlwbGUKKwkgKiBJbnN0YW5jaWF0aW9uIEluZm9ybWF0aW9uCisJICogZm9yIERhdGEgQWNjZXNzIG9wdGltaXNhdGlvbgorCSAqLworCWlubGluZSBhdm1fc2l6ZV90IGdldFN0YXRpY0luc3RhbmNpYXRpb25Db3VudCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1JbnN0YW5jaWF0aW9uQ291bnQgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNTdGF0aWNJbnN0YW5jaWF0aW9uKCkgY29uc3QKKwl7CisJCXJldHVybiggbUluc3RhbmNpYXRpb25Db3VudCA+IDAgKTsKKwl9CisKKworCWlubGluZSBhdm1fc2l6ZV90IGdldFBvc3NpYmxlRHluYW1pY0luc3RhbmNpYXRpb25Db3VudCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Qb3NzaWJsZUR5bmFtaWNJbnN0YW5jaWF0aW9uQ291bnQgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNQb3NzaWJsZUR5bmFtaWNJbnN0YW5jaWF0aW9uKCkgY29uc3QKKwl7CisJCXJldHVybiggbVBvc3NpYmxlRHluYW1pY0luc3RhbmNpYXRpb25Db3VudCA+IDAgKTsKKwl9CisKKwl2b2lkIGluY3JQb3NzaWJsZUR5bmFtaWNJbnN0YW5jaWF0aW9uQ291bnQoYXZtX3NpemVfdCBvZmZzZXQgPSAxKTsKKworCisJaW5saW5lIGJvb2wgaGFzU2luZ2xlUnVudGltZUluc3RhbmNlKCkKKwl7CisJCXJldHVybiggKG1JbnN0YW5jaWF0aW9uQ291bnQgPiAxKSB8fAorCQkJCShtUG9zc2libGVEeW5hbWljSW5zdGFuY2lhdGlvbkNvdW50ID4gMCkgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1NYXhpbWFsSW5zdGFuY2VDb3VudAorCSAqLworCWlubGluZSBhdm1fc2l6ZV90IGdldE1heGltYWxJbnN0YW5jZUNvdW50KCkgY29uc3QKKwl7CisJCXJldHVybiggbU1heGltYWxJbnN0YW5jZUNvdW50ICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzTWF4aW1hbEluc3RhbmNlKCkgY29uc3QKKwl7CisJCXJldHVybiggbU1heGltYWxJbnN0YW5jZUNvdW50ICE9IEFWTV9OVU1FUklDX01BWF9TSVpFX1QgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNNYXhpbWFsTmV3SW5zdGFuY2UoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobU1heGltYWxJbnN0YW5jZUNvdW50ID4gMSkKKwkJCQkmJiAobU1heGltYWxJbnN0YW5jZUNvdW50ICE9IEFWTV9OVU1FUklDX01BWF9TSVpFX1QpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0TWF4aW1hbEluc3RhbmNlQ291bnQoYXZtX3NpemVfdCBhTWF4aW1hbEluc3RhbmNlQ291bnQpCisJeworCQltTWF4aW1hbEluc3RhbmNlQ291bnQgPSBhTWF4aW1hbEluc3RhbmNlQ291bnQ7CisJfQorCisKKwlpbmxpbmUgdm9pZCBzZXRJbnN0YW5jZUNvdW50KAorCQkJYXZtX3VpbnQzMl90IGFuSW5pdGlhbENvdW50LCBhdm1fc2l6ZV90IGFNYXhpbWFsSW5zdGFuY2VDb3VudCkKKwl7CisJCUJhc2VJbnN0YW5jZUZvcm06OnNldEluc3RhbmNpYXRpb25Db3VudCggYW5Jbml0aWFsQ291bnQgKTsKKworCQltTWF4aW1hbEluc3RhbmNlQ291bnQgPSBhTWF4aW1hbEluc3RhbmNlQ291bnQ7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtUGFyYW1SZXR1cm5UYWJsZQorCSAqLworCWlubGluZSBBUFRhYmxlT2ZEYXRhICYgZ2V0UGFyYW1SZXR1cm5UYWJsZSgpCisJeworCQlyZXR1cm4oIG1QYXJhbVJldHVyblRhYmxlICk7CisJfQorCisJaW5saW5lIGNvbnN0IEFQVGFibGVPZkRhdGEgJiBnZXRQYXJhbVJldHVyblRhYmxlKCkgY29uc3QKKwl7CisJCXJldHVybiggbVBhcmFtUmV0dXJuVGFibGUgKTsKKwl9CisKKworCWlubGluZSBib29sIGhhc1BhcmFtUmV0dXJuVGFibGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUGFyYW1SZXR1cm5UYWJsZS52YWxpZCgpICk7CisJfQorCisKKwlpbmxpbmUgdm9pZCBzZXRQYXJhbVJldHVyblRhYmxlKGNvbnN0IEFQVGFibGVPZkRhdGEgJiBhUGFyYW1UYWJsZSkKKwl7CisJCW1QYXJhbVJldHVyblRhYmxlID0gYVBhcmFtVGFibGU7CisJfQorCisKKwlpbmxpbmUgQkYgJiBnZXRQYXJhbVJldHVybihhdm1fc2l6ZV90IG9mZnNldCkKKwl7CisJCXJldHVybiggbVBhcmFtUmV0dXJuVGFibGUtPmF0KG9mZnNldCkgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQkYgJiBnZXRQYXJhbVJldHVybihhdm1fc2l6ZV90IG9mZnNldCkgY29uc3QKKwl7CisJCXJldHVybiggbVBhcmFtUmV0dXJuVGFibGUtPmF0KG9mZnNldCkgKTsKKwl9CisKKworCWlubGluZSBib29sIGhhc1BhcmFtUmV0dXJuKCkgY29uc3QKKwl7CisJCXJldHVybiggbVBhcmFtUmV0dXJuVGFibGUudmFsaWQoKSAmJiBtUGFyYW1SZXR1cm5UYWJsZS0+bm9uZW1wdHkoKSApOworCX0KKworCWlubGluZSB2b2lkIHNldFBhcmFtUmV0dXJuKGF2bV9zaXplX3Qgb2Zmc2V0LCBjb25zdCBCRiAmIGFQYXJhbSkKKwl7CisJCW1QYXJhbVJldHVyblRhYmxlLT5zZXQob2Zmc2V0LCBhUGFyYW0pOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVBhcmFtUmV0dXJuVGFibGUKKwkgKiBtUmV0dXJuT2Zmc2V0CisJICovCisKKwlpbmxpbmUgYXZtX3NpemVfdCBnZXRQYXJhbU9mZnNldCgpIGNvbnN0CisJeworCQlyZXR1cm4oIDAgKTsKKwl9CisKKwlpbmxpbmUgYXZtX3NpemVfdCBnZXRQYXJhbUNvdW50KCkgY29uc3QKKwl7CisJCXJldHVybiggbVJldHVybk9mZnNldCApOworCX0KKworCWlubGluZSBCRiAmIGdldFBhcmFtKGF2bV9zaXplX3Qgb2Zmc2V0KQorCXsKKwkJcmV0dXJuKCBtUGFyYW1SZXR1cm5UYWJsZS0+YXQob2Zmc2V0KSApOworCX0KKworCWlubGluZSBjb25zdCBCRiAmIGdldFBhcmFtKGF2bV9zaXplX3Qgb2Zmc2V0KSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUGFyYW1SZXR1cm5UYWJsZS0+YXQob2Zmc2V0KSApOworCX0KKworCisJQmFzZVR5cGVTcGVjaWZpZXIgKiBnZXRQYXJhbVR5cGUoYXZtX3NpemVfdCBvZmZzZXQpIGNvbnN0OworCisKKwlpbmxpbmUgYm9vbCBoYXNQYXJhbSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1QYXJhbVJldHVyblRhYmxlLnZhbGlkKCkKKwkJCQkmJiBtUGFyYW1SZXR1cm5UYWJsZS0+bm9uZW1wdHkoKQorCQkJCSYmIChtUmV0dXJuT2Zmc2V0ID4gMCkgKTsKKwl9CisKKworCWlubGluZSB2b2lkIHNldFBhcmFtKGF2bV9zaXplX3Qgb2Zmc2V0LCBjb25zdCBCRiAmIGFQYXJhbSkKKwl7CisJCW1QYXJhbVJldHVyblRhYmxlLT5zZXQob2Zmc2V0LCBhUGFyYW0pOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVBhcmFtUmV0dXJuVGFibGUKKwkgKiBtUmV0dXJuT2Zmc2V0CisJICovCisJaW5saW5lIHZvaWQgc2V0UmV0dXJuT2Zmc2V0KGF2bV9zaXplX3QgYVJldHVybk9mZnNldCkKKwl7CisJCW1SZXR1cm5PZmZzZXQgPSBhUmV0dXJuT2Zmc2V0OworCX0KKworCWlubGluZSBhdm1fc2l6ZV90IGdldFJldHVybkNvdW50KCkgY29uc3QKKwl7CisJCXJldHVybiggbVBhcmFtUmV0dXJuVGFibGUtPnNpemUoKSAtIG1SZXR1cm5PZmZzZXQgKTsKKwl9CisKKworCWlubGluZSBib29sIGhhc1JldHVybigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1QYXJhbVJldHVyblRhYmxlLnZhbGlkKCkKKwkJCQkmJiAobVJldHVybk9mZnNldCA8ICBtUGFyYW1SZXR1cm5UYWJsZS0+c2l6ZSgpKSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUluc3RhbmNlTW9kZWwKKwkgKi8KKwlpbmxpbmUgSW5zdGFuY2VPZk1hY2hpbmUgKiBnZXRJbnN0YW5jZU1vZGVsKCkgY29uc3QKKwl7CisJCXJldHVybiggbUluc3RhbmNlTW9kZWwgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNJbnN0YW5jZU1vZGVsKCkgY29uc3QKKwl7CisJCXJldHVybiggbUluc3RhbmNlTW9kZWwgIT0gTlVMTCApOworCX0KKworCWlubGluZSBib29sIGlzSW5zdGFuY2VNb2RlbChJbnN0YW5jZU9mTWFjaGluZSAqIGFuT3RoZXJNb2RlbCkgY29uc3QKKwl7CisJCXJldHVybiggKG1JbnN0YW5jZU1vZGVsICE9IE5VTEwpCisJCQkJJiYgKCAobUluc3RhbmNlTW9kZWwgPT0gYW5PdGhlck1vZGVsKQorCQkJCQl8fCAoYW5PdGhlck1vZGVsLT5nZXRTcGVjaWZpZXIoKS5pc0Rlc2lnblByb3RvdHlwZVN0YXRpYygpCisJCQkJCQkmJiAobUluc3RhbmNlTW9kZWwKKwkJCQkJCQk9PSBhbk90aGVyTW9kZWwtPmdldEluc3RhbmNlTW9kZWwoKSkgKSkpOworCX0KKworCWlubGluZSB2b2lkIHNldEluc3RhbmNlTW9kZWwoSW5zdGFuY2VPZk1hY2hpbmUgKiBhbkluc3RhbmNlTW9kZWwpCisJeworCQltSW5zdGFuY2VNb2RlbCA9IGFuSW5zdGFuY2VNb2RlbDsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1SdW50aW1lUklECisJICovCisJaW5saW5lIGNvbnN0IFJ1bnRpbWVJRCAmIGdldFJ1bnRpbWVSSUQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUnVudGltZVJJRCApOworCX0KKworCWlubGluZSBib29sIGhhc1J1bnRpbWVSSUQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUnVudGltZVJJRC52YWxpZCgpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0UnVudGltZVJJRChjb25zdCBSdW50aW1lSUQgJiBhUklEKQorCXsKKwkJbVJ1bnRpbWVSSUQgPSBhUklEOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogImF1dG9zdGFydCIgbW9kaWZpZXIgb2YgSW5zdGFuY2UKKwkgKi8KKwlpbmxpbmUgYm9vbCBpc0F1dG9TdGFydCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Nb2RpZmllckF1dG9TdGFydCApOworCX0KKworCWlubGluZSB2b2lkIHNldEF1dG9TdGFydChib29sIGJBdXRvU3RhcnQgPSB0cnVlKQorCXsKKwkJbU1vZGlmaWVyQXV0b1N0YXJ0ID0gYkF1dG9TdGFydDsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1JbnB1dEVuYWJsZWRCdWZmZXIKKwkgKi8KKwlpbmxpbmUgdm9pZCBhZGRJbnB1dEVuYWJsZWRCdWZmZXIoSW5zdGFuY2VPZkJ1ZmZlciAqIGFCdWZmZXIpCisJeworCQltSW5wdXRFbmFibGVkQnVmZmVyLmFkZF91bmlvbiggYUJ1ZmZlciApOworCX0KKworCWlubGluZSB2b2lkIGFkZElucHV0RW5hYmxlZEJ1ZmZlcihMaXN0T2ZJbnN0YW5jZU9mQnVmZmVyICYgaW5wdXRFbmFibGVkQnVmZmVyKQorCXsKKwkJbUlucHV0RW5hYmxlZEJ1ZmZlci5hZGRfdW5pb24oIGlucHV0RW5hYmxlZEJ1ZmZlciApOworCX0KKworCisJaW5saW5lIExpc3RPZkluc3RhbmNlT2ZCdWZmZXIgJiBnZXRJbnB1dEVuYWJsZWRCdWZmZXIoKQorCXsKKwkJcmV0dXJuKCBtSW5wdXRFbmFibGVkQnVmZmVyICk7CisJfQorCisJaW5saW5lIGNvbnN0IExpc3RPZkluc3RhbmNlT2ZCdWZmZXIgJiBnZXRJbnB1dEVuYWJsZWRCdWZmZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtSW5wdXRFbmFibGVkQnVmZmVyICk7CisJfQorCisKKwlib29sIGNvbnRhaW5zSW5wdXRFbmFibGVkQnVmZmVyKEluc3RhbmNlT2ZCdWZmZXIgKiBhQnVmZmVyKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtSW5wdXRFbmFibGVkQnVmZmVyLmNvbnRhaW5zKGFCdWZmZXIpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzSW5wdXRFbmFibGVkQnVmZmVyKCkgY29uc3QKKwl7CisJCXJldHVybiggbUlucHV0RW5hYmxlZEJ1ZmZlci5ub25lbXB0eSgpICk7CisJfQorCisKKwlpbmxpbmUgdm9pZCBzZXRJbnB1dEVuYWJsZWRCdWZmZXIoTGlzdE9mSW5zdGFuY2VPZkJ1ZmZlciAmIGlucHV0RW5hYmxlZEJ1ZmZlcikKKwl7CisJCW1JbnB1dEVuYWJsZWRCdWZmZXIuY2xlYXIoKTsKKworCQltSW5wdXRFbmFibGVkQnVmZmVyLmFkZF91bmlvbiggaW5wdXRFbmFibGVkQnVmZmVyICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtSW5wdXRFbmFibGVkQ29tCisJICovCisJaW5saW5lIHZvaWQgYWRkSW5wdXRFbmFibGVkQ29tKEluc3RhbmNlT2ZQb3J0ICogYVBvcnQpCisJeworCQltSW5wdXRFbmFibGVkQ29tLmFkZF91bmlvbiggYVBvcnQgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBhZGRJbnB1dEVuYWJsZWRDb20oTGlzdE9mSW5zdGFuY2VPZlBvcnQgJiBpbnB1dEVuYWJsZWRQb3J0KQorCXsKKwkJbUlucHV0RW5hYmxlZENvbS5hZGRfdW5pb24oIGlucHV0RW5hYmxlZFBvcnQgKTsKKwl9CisKKworCWlubGluZSBMaXN0T2ZJbnN0YW5jZU9mUG9ydCAmIGdldElucHV0RW5hYmxlZENvbSgpCisJeworCQlyZXR1cm4oIG1JbnB1dEVuYWJsZWRDb20gKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgTGlzdE9mSW5zdGFuY2VPZlBvcnQgJiBnZXRJbnB1dEVuYWJsZWRDb20oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtSW5wdXRFbmFibGVkQ29tICk7CisJfQorCisKKwlib29sIGNvbnRhaW5zSW5wdXRFbmFibGVkQ29tKEluc3RhbmNlT2ZQb3J0ICogYVBvcnQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1JbnB1dEVuYWJsZWRDb20uY29udGFpbnMoYVBvcnQpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzSW5wdXRFbmFibGVkQ29tKCkgY29uc3QKKwl7CisJCXJldHVybiggbUlucHV0RW5hYmxlZENvbS5ub25lbXB0eSgpICk7CisJfQorCisKKwlpbmxpbmUgdm9pZCBzZXRJbnB1dEVuYWJsZWRDb20oTGlzdE9mSW5zdGFuY2VPZlBvcnQgJiBpbnB1dEVuYWJsZWRQb3J0KQorCXsKKwkJbUlucHV0RW5hYmxlZENvbS5jbGVhcigpOworCisJCW1JbnB1dEVuYWJsZWRDb20uYWRkX3VuaW9uKCBpbnB1dEVuYWJsZWRQb3J0ICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtSW5wdXRFbmFibGVkU2F2ZQorCSAqLworCWlubGluZSB2b2lkIGFkZElucHV0RW5hYmxlZFNhdmUoSW5zdGFuY2VPZlBvcnQgKiBhUG9ydCkKKwl7CisJCW1JbnB1dEVuYWJsZWRTYXZlLmFkZF91bmlvbiggYVBvcnQgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBhZGRJbnB1dEVuYWJsZWRTYXZlKExpc3RPZkluc3RhbmNlT2ZQb3J0ICYgaW5wdXRFbmFibGVkU2F2ZVBvcnQpCisJeworCQltSW5wdXRFbmFibGVkU2F2ZS5hZGRfdW5pb24oIGlucHV0RW5hYmxlZFNhdmVQb3J0ICk7CisJfQorCisKKwlpbmxpbmUgTGlzdE9mSW5zdGFuY2VPZlBvcnQgJiBnZXRJbnB1dEVuYWJsZWRTYXZlKCkKKwl7CisJCXJldHVybiggbUlucHV0RW5hYmxlZFNhdmUgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgTGlzdE9mSW5zdGFuY2VPZlBvcnQgJiBnZXRJbnB1dEVuYWJsZWRTYXZlKCkgY29uc3QKKwl7CisJCXJldHVybiggbUlucHV0RW5hYmxlZFNhdmUgKTsKKwl9CisKKworCWJvb2wgY29udGFpbnNJbnB1dEVuYWJsZWRTYXZlKEluc3RhbmNlT2ZQb3J0ICogYVBvcnQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1JbnB1dEVuYWJsZWRTYXZlLmNvbnRhaW5zKGFQb3J0KSApOworCX0KKworCWlubGluZSBib29sIGhhc0lucHV0RW5hYmxlZFNhdmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtSW5wdXRFbmFibGVkU2F2ZS5ub25lbXB0eSgpICk7CisJfQorCisKKwlpbmxpbmUgdm9pZCBzZXRJbnB1dEVuYWJsZWRTYXZlKExpc3RPZkluc3RhbmNlT2ZQb3J0ICYgaW5wdXRFbmFibGVkU2F2ZVBvcnQpCisJeworCQltSW5wdXRFbmFibGVkU2F2ZS5jbGVhcigpOworCisJCW1JbnB1dEVuYWJsZWRTYXZlLmFkZF91bmlvbiggaW5wdXRFbmFibGVkU2F2ZVBvcnQgKTsKKwl9CisKKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwl2b2lkIGhlYWRlcihPdXRTdHJlYW0gJiBvdXQpIGNvbnN0OworCisJdm9pZCBzdHJIZWFkZXIoT3V0U3RyZWFtICYgb3V0KSBjb25zdDsKKworCXZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3V0KSBjb25zdDsKKworfTsKKworCit9CisKKyNlbmRpZiAvKiBJTlNUQU5DRU9GTUFDSElORV9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZlBvcnQuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZlBvcnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NDg4MGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mUG9ydC5jcHAKQEAgLTAsMCArMSwzMTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiA1IGFvw7t0IDIwMDgKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkluc3RhbmNlT2ZQb3J0LmgiCisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlRm9ybS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZEYXRhLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9CdWlsdGluQXJyYXkuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL1J1bnRpbWVJRC5oPgorCisjaW5jbHVkZSA8Zm1sL3R5cGUvQmFzZVR5cGVTcGVjaWZpZXIuaD4KKyNpbmNsdWRlIDxmbWwvdHlwZS9UeXBlTWFuYWdlci5oPgorCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1BvcnQuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoqCisgKiBDT05TVFJVQ1RPUgorICogRGVmYXVsdAorICovCitJbnN0YW5jZU9mUG9ydDo6SW5zdGFuY2VPZlBvcnQoQmFzZUF2bVByb2dyYW0gKiBhQ29udGFpbmVyLAorCQlQcm9wZXJ0eUVsZW1lbnQgKiBhQ29tcGlsZWQsIGF2bV9vZmZzZXRfdCBhbk9mZnNldCwKKwkJYXZtX3NpemVfdCBhUGFyYW1ldGVyQ291bnQsIEVOVU1fSU9fTkFUVVJFIGFOYXR1cmUpCis6IEJhc2VJbnN0YW5jZUZvcm0oIENMQVNTX0tJTkRfVCggSW5zdGFuY2VPZlBvcnQgKSwKKwkJYUNvbnRhaW5lciwgYUNvbXBpbGVkLCBUeXBlTWFuYWdlcjo6UE9SVCwgYW5PZmZzZXQpLAorbVJvdXRlT2Zmc2V0KCBhbk9mZnNldCApLAorbUNvbVBvaW50TmF0dXJlKCBhTmF0dXJlICksCisKK21QYXJhbWV0ZXJzKGFQYXJhbWV0ZXJDb3VudCksCittQ29udGVudHMoICksCisKK21Sb3V0aW5nQ2hhbm5lbCggTlVMTCApLAorCittSW5wdXRSb3V0aW5nRGF0YSggKSwKK21PdXRwdXRSb3V0aW5nRGF0YSggKQoreworLy8JQVZNX09TX1RSQUNFIDw8ICJwb3J0OjpuZXcgOj4gIiA8PCBnZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbDsKK30KKworCisvKioKKyAqIEZvcm1hdCBhIHZhbHVlIHcuci50LiBpdHMgdHlwZQorICovCit2b2lkIEluc3RhbmNlT2ZQb3J0Ojpmb3JtYXRTdHJlYW0oCisJCU91dFN0cmVhbSAmIG91dCwgY29uc3QgQkYgJiBiZlZhbHVlKSBjb25zdAoreworCWlmKCBiZlZhbHVlLmlzPCBBcnJheUJGID4oKSApCisJeworCQlmb3JtYXRTdHJlYW0ob3V0LCBiZlZhbHVlLmFzX3JlZjwgQXJyYXlCRiA+KCkpOworCX0KKwllbHNlIGlmKCBoYXNQYXJhbWV0ZXJUeXBlKDApICkKKwl7CisJCWdldFBhcmFtZXRlclR5cGUoMCktPmZvcm1hdFN0cmVhbShvdXQsIGJmVmFsdWUpOworCX0KKwllbHNlCisJeworCQlvdXQgPDwgYmZWYWx1ZS5zdHIoKTsKKwl9CisKK30KKwordm9pZCBJbnN0YW5jZU9mUG9ydDo6Zm9ybWF0U3RyZWFtKAorCQlPdXRTdHJlYW0gJiBvdXQsIGNvbnN0IEFycmF5QkYgJiBhcnJheVZhbHVlKSBjb25zdAoreworCW91dCA8PCBvdXQuVkFMVUVfUEFSQU1TX0NTUy5CRUdJTjsKKworCWlmKCBoYXNQYXJhbWV0ZXJUeXBlKDApICkKKwl7CisJCWdldFBhcmFtZXRlclR5cGUoMCktPmZvcm1hdFN0cmVhbShvdXQsIGFycmF5VmFsdWVbMF0pOworCX0KKwllbHNlCisJeworCQlvdXQgPDwgYXJyYXlWYWx1ZVswXS5zdHIoKTsKKwl9CisJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDEgOyBvZmZzZXQgPCBhcnJheVZhbHVlLnNpemUoKSA7ICsrb2Zmc2V0ICkKKwl7CisJCW91dCA8PCBvdXQuVkFMVUVfUEFSQU1TX0NTUy5TRVBBUkFUT1I7CisKKwkJaWYoIGhhc1BhcmFtZXRlclR5cGUob2Zmc2V0KSApCisJCXsKKwkJCWdldFBhcmFtZXRlclR5cGUob2Zmc2V0KS0+Zm9ybWF0U3RyZWFtKG91dCwgYXJyYXlWYWx1ZVtvZmZzZXRdKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW91dCA8PCBhcnJheVZhbHVlW29mZnNldF0uc3RyKCk7CisJCX0KKwl9CisKKwlvdXQgPDwgb3V0LlZBTFVFX1BBUkFNU19DU1MuRU5EOworfQorCisvKioKKyAqIFNlcmlhbGl6YXRpb24KKyAqLworCit2b2lkIEluc3RhbmNlT2ZQb3J0OjpzdHJQYXJhbWV0ZXIoT3V0U3RyZWFtICYgb3V0LCBjb25zdCBCRiAmIGFQYXJhbWV0ZXIpIGNvbnN0Cit7CisJaWYoIGFQYXJhbWV0ZXIuaXM8IEJhc2VUeXBlU3BlY2lmaWVyID4oKSApCisJeworCQlvdXQgPDwgYVBhcmFtZXRlci50b19wdHI8IEJhc2VUeXBlU3BlY2lmaWVyID4oKS0+c3RyVCgpOworCX0KKwllbHNlIGlmKCBhUGFyYW1ldGVyLmlzPCBJbnN0YW5jZU9mRGF0YSA+KCkgKQorCXsKKwkJSW5zdGFuY2VPZkRhdGEgKiBhVmFyID0gYVBhcmFtZXRlci50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKTsKKworCQlvdXQgPDwgYVZhci0+c3RySGVhZGVySWQoKTsKKwkJaWYoIGFWYXItPmhhc1ZhbHVlKCkgKQorCQl7CisJCQlvdXQgPDwgIiA9ICIgPDwgYVZhci0+c3RyVmFsdWUoKTsKKwkJfQorCX0KKwkvLyAjYmluZCBleHByZXNzaW9uIHBhcmFtZXRlcgorCWVsc2UKKwl7CisJCW91dCA8PCAiI2JpbmQgIiA8PCBhUGFyYW1ldGVyLnN0cigpOworCX0KK30KKwordm9pZCBJbnN0YW5jZU9mUG9ydDo6c3RyUGFyYW1ldGVyKE91dFN0cmVhbSAmIG91dCkgY29uc3QKK3sKKwlpZiggaGFzUGFyYW1ldGVyKCkgKQorCXsKKwkJQXJyYXlPZkJGOjpjb25zdF9pdGVyYXRvciBpdCA9IGdldFBhcmFtZXRlcnMoKS5iZWdpbigpOworCQlBcnJheU9mQkY6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gZ2V0UGFyYW1ldGVycygpLmVuZCgpOworCisJCW91dCA8PCAiWyAiOworCQlzdHJQYXJhbWV0ZXIob3V0LCAoKml0KSk7CisJCWZvciggKytpdCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJCXsKKwkJCW91dCA8PCAiICwgIjsKKwkJCXN0clBhcmFtZXRlcihvdXQsICgqaXQpKTsKKwkJfQorCQlvdXQgPDwgIiBdIjsKKwl9Cit9CisKKworCisKK3ZvaWQgSW5zdGFuY2VPZlBvcnQ6OnN0ckhlYWRlcihPdXRTdHJlYW0gJiBvdXQpIGNvbnN0Cit7CisJb3V0IDw8IGdldE1vZGlmaWVyKCkudG9TdHJpbmcoKSA8PCBzdHJDb21Qb2ludE5hdHVyZSgpCisJCTw8ICI8IGlkOiIgPDwgZ2V0T2Zmc2V0KCkgPDwgIiAsIHJvdXRlOiIgPDwgZ2V0Um91dGVPZmZzZXQoKQorCQk8PCAiID4gIiA8PCBnZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOworCisJc3RyUGFyYW1ldGVyKG91dCk7Cit9CisKKworc3RkOjpzdHJpbmcgSW5zdGFuY2VPZlBvcnQ6OnN0ckFyZygpIGNvbnN0Cit7CisJU3RyaW5nT3V0U3RyZWFtIG9zczsKKworCW9zcyA8PCBnZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOy8vIDw8ICIgJyIgPDwgZ2V0TmFtZUlEKCkgPDwgIiciOworCisJaWYoIG1Sb3V0aW5nQ2hhbm5lbCAhPSBOVUxMICkKKwl7CisJCW9zcyA8PCAiPCAjdmlhICIgPDwgbVJvdXRpbmdDaGFubmVsLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8ICIgPiI7CisJfQorCisJcmV0dXJuKCBvc3Muc3RyKCkgKTsKK30KKworCit2b2lkIEluc3RhbmNlT2ZQb3J0Ojp0b1N0cmVhbShPdXRTdHJlYW0gJiBvdXQpIGNvbnN0Cit7CisJaWYoIG91dC5wcmVmZXJhYmx5RlFOKCkgKQorCXsKKwkJb3V0IDw8IFRBQiA8PCBnZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOworCisJCUFWTV9ERUJVR19SRUZfQ09VTlRFUihvdXQpOworCisJCXJldHVybjsKKwl9CisKKwlib29sIGlzRW1wdHkgPSB0cnVlOworCisJb3V0IDw8IFRBQiA8PCBnZXRNb2RpZmllcigpLnRvU3RyaW5nKCkgPDwgc3RyQ29tUG9pbnROYXR1cmUoKQorCQk8PCAiPCBpZDoiIDw8IGdldE9mZnNldCgpIDw8ICIgLCByb3V0ZToiIDw8IGdldFJvdXRlT2Zmc2V0KCkKKwkJPDwgIiA+ICIgPDwgZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsKKworCUFWTV9ERUJVR19SRUZfQ09VTlRFUihvdXQpOworCitBVk1fSUZfREVCVUdfRkxBRyggQ09NUElMSU5HICkKKwlvdXQgPDwgIiB7IiA8PCBFT0w7IGlzRW1wdHkgPSBmYWxzZTsKKworCWlmKCBoYXNBc3RFbGVtZW50KCkgKQorCXsKKwkJb3V0IDw8IFRBQjIgPDwgIi8vY29tcGlsZWQgPSAiCisJCQk8PCBnZXRBc3RGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8ICI7IiA8PCBFT0w7CisJfQorCisJb3V0IDw8IFRBQjIgPDwgIi8vY29udGFpbmVyID0gIgorCQk8PCAoaGFzQ29udGFpbmVyKCkgPyBnZXRDb250YWluZXIoKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA6ICJOVUxMIikKKwkJPDwgIjsiIDw8IEVPTDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBDT01QSUxJTkcgKQorCisJaWYoIGhhc0FsaWFzVGFyZ2V0KCkgKQorCXsKKwkJaWYoIGlzRW1wdHkgKSB7IG91dCA8PCAiIHsiIDw8IEVPTDsgaXNFbXB0eSA9IGZhbHNlOyB9CisJCW91dCA8PCBUQUIyIDw8ICJ0YXJnZXQgPSAiCisJCQk8PCBzdHJfaGVhZGVyKCBnZXRBbGlhc1RhcmdldCgpLT5hczwgSW5zdGFuY2VPZlBvcnQgPigpICkKKwkJCTw8ICI7IiA8PCBFT0w7CisJfQorCisJaWYoIGhhc0NyZWF0b3JDb250YWluZXJSSUQoKSApCisJeworCQlpZiggaXNFbXB0eSApIHsgb3V0IDw8ICIgeyIgPDwgRU9MOyBpc0VtcHR5ID0gZmFsc2U7IH0KKwkJb3V0IDw8IFRBQjIgPDwgInJpZCNjcmVhdG9yID0gIiA8PCBnZXRDcmVhdG9yQ29udGFpbmVyUklEKCkuc3RyKCkKKwkJCTw8ICI7IiA8PCBFT0w7CisJfQorCisJaWYoIGhhc1J1bnRpbWVDb250YWluZXJSSUQoKSApCisJeworCQlpZiggaXNFbXB0eSApIHsgb3V0IDw8ICIgeyIgPDwgRU9MOyBpc0VtcHR5ID0gZmFsc2U7IH0KKwkJb3V0IDw8IFRBQjIgPDwgInJpZCNjb250YWluZXIgPSAiIDw8IGdldFJ1bnRpbWVDb250YWluZXJSSUQoKS5zdHIoKQorCQkJPDwgIjsiIDw8IEVPTDsKKwl9CisKKwlpZiggaGFzSW5wdXRSb3V0aW5nRGF0YSgpICkKKwl7CisJCWlmKCBpc0VtcHR5ICkgeyBvdXQgPDwgIiB7IiA8PCBFT0w7IGlzRW1wdHkgPSBmYWxzZTsgfQorCQlvdXQgPDwgVEFCMiA8PCAicm91dGluZyNpbnB1dCNkYXRhID0gIgorCQkJPDwgZ2V0SW5wdXRSb3V0aW5nRGF0YSgpLnN0cigpIDw8ICI7IiA8PCBFT0w7CisJfQorCisJaWYoIGhhc091dHB1dFJvdXRpbmdEYXRhKCkgKQorCXsKKwkJaWYoIGlzRW1wdHkgKSB7IG91dCA8PCAiIHsiIDw8IEVPTDsgaXNFbXB0eSA9IGZhbHNlOyB9CisJCW91dCA8PCBUQUIyIDw8ICJyb3V0aW5nI291dHB1dCNkYXRhID0gIgorCQkJPDwgZ2V0T3V0cHV0Um91dGluZ0RhdGEoKS5zdHIoKSA8PCAiOyIgPDwgRU9MOworCX0KKworLy8Jb3MgPDwgVEFCMiA8PCAib2Zmc2V0ID0gIiA8PCBnZXRPZmZzZXQoKSA8PCAiOyIgPDwgRU9MOworCisJaWYoIGhhc01hY2hpbmVQYXRoKCkgKQorCXsKKwkJaWYoIGlzRW1wdHkgKSB7IG91dCA8PCAiIHsiIDw8IEVPTDsgaXNFbXB0eSA9IGZhbHNlOyB9CisKKwkJb3V0IDw8IFRBQiA8PCAicGF0aCNtYWNoaW5lOiIgPDwgRU9MOworCQlBcnJheU9mSW5zdGFuY2VPZk1hY2hpbmU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZ2V0TWFjaGluZVBhdGgoKS0+YmVnaW4oKTsKKwkJQXJyYXlPZkluc3RhbmNlT2ZNYWNoaW5lOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IGdldE1hY2hpbmVQYXRoKCktPmVuZCgpOworCQlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJeworCQkJb3V0IDw8IFRBQjIgPDwgKCppdCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgRU9MOworCQl9CisJfQorCisJaWYoIGhhc1BhcmFtZXRlcigpICkKKwl7CisJCWlmKCBpc0VtcHR5ICkgeyBvdXQgPDwgIiB7IiA8PCBFT0w7IGlzRW1wdHkgPSBmYWxzZTsgfQorCisJCW91dCA8PCBUQUIgPDwgInBhcmFtZXRlcjoiIDw8IEVPTDsKKwkJQXJyYXlPZkJGOjpjb25zdF9pdGVyYXRvciBpdCA9IGdldFBhcmFtZXRlcnMoKS5iZWdpbigpOworCQlBcnJheU9mQkY6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gZ2V0UGFyYW1ldGVycygpLmVuZCgpOworCQlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJeworCQkJaWYoICgqaXQpLmlzPCBCYXNlVHlwZVNwZWNpZmllciA+KCkgKQorCQkJeworCQkJCW91dCA8PCBUQUIyIDw8ICgqaXQpLnRvX3B0cjwgQmFzZVR5cGVTcGVjaWZpZXIgPigpLT5zdHJUKCkKKwkJCQkJPDwgIjsiIDw8IEVPTDsKKwkJCX0KKwkJCWVsc2UgaWYoICgqaXQpLmlzPCBJbnN0YW5jZU9mRGF0YSA+KCkgKQorCQkJeworCQkJCUluc3RhbmNlT2ZEYXRhICogYVZhciA9ICgqaXQpLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpOworCisJCQkJb3V0IDw8IFRBQjIgPDwgYVZhci0+c3RySGVhZGVySWQoKTsKKwkJCQlpZiggYVZhci0+aGFzVmFsdWUoKSApCisJCQkJeworCQkJCQlvdXQgPDwgIiA9ICIgPDwgYVZhci0+c3RyVmFsdWUoKTsKKwkJCQl9CisJCQkJb3V0IDw8ICI7IiA8PCBFT0w7CisJCQl9CisJCQkvLyAjYmluZCBleHByZXNzaW9uIHBhcmFtZXRlcgorCQkJZWxzZQorCQkJeworCQkJCW91dCA8PCBUQUIyIDw8ICIjYmluZCAiIDw8ICgqaXQpLnN0cigpIDw8ICI7IiA8PCBFT0w7CisJCQl9CisJCX0KKwl9CisKKwlpZiggaGFzQ29udGVudCgpICkKKwl7CisJCWlmKCBpc0VtcHR5ICkgeyBvdXQgPDwgIiB7IiA8PCBFT0w7IGlzRW1wdHkgPSBmYWxzZTsgfQorCisJCW91dCA8PCBUQUIgPDwgImNvbnRlbnRzOiIgPDwgRU9MOworCQlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBpdCA9IGdldENvbnRlbnRzKCkuYmVnaW4oKTsKKwkJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBnZXRDb250ZW50cygpLmVuZCgpOworCQlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJeworCQkJb3V0IDw8IFRBQjIgPDwgc3RyX2hlYWRlciggKml0ICkgPDwgRU9MOworCQl9CisJfQorCisJKCBpc0VtcHR5ID8gKG91dCA8PCAiOyIpIDogKG91dCA8PCBUQUIgPDwgIn0iKSApIDw8IEVPTF9GTFVTSDsKK30KKworCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZQb3J0LmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mUG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNzM5MjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mUG9ydC5oCkBAIC0wLDAgKzEsNDIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogNSBhb8O7dCAyMDA4CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgSU5TVEFOQ0VPRlBPUlRfSF8KKyNkZWZpbmUgSU5TVEFOQ0VPRlBPUlRfSF8KKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0Jhc2VJbnN0YW5jZUZvcm0uaD4KKworI2luY2x1ZGUgPGNvbW1vbi9Bdm1Qb2ludGVyLmg+CisKKyNpbmNsdWRlIDxmbWwvbGliL0lDb21Qb2ludC5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZkRhdGEuaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9Sb3V0aW5nRGF0YS5oPgorCisjaW5jbHVkZSA8Zm1sL3R5cGUvQmFzZVR5cGVTcGVjaWZpZXIuaD4KKworI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9DaGFubmVsLmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1BvcnQuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKK2NsYXNzIEFycmF5QkY7CitjbGFzcyBCYXNlQXZtUHJvZ3JhbTsKK2NsYXNzIFJvdXRpbmdEYXRhOworCisKK2NsYXNzIEluc3RhbmNlT2ZQb3J0IDoKKwkJcHVibGljIEJhc2VJbnN0YW5jZUZvcm0sCisJCXB1YmxpYyBJQ29tUG9pbnQsCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggSW5zdGFuY2VPZlBvcnQgKQoreworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIEluc3RhbmNlT2ZQb3J0ICkKKworCitwcm90ZWN0ZWQ6CisJLyoKKwkgKiBBVFRSSUJVVEVTCisJICovCisJYXZtX3NpemVfdCBtUm91dGVPZmZzZXQ7CisKKwkvLyB0aGUgbmF0dXJlCisJRU5VTV9JT19OQVRVUkUgbUNvbVBvaW50TmF0dXJlOworCisJLy8gdGhlIFBhcmFtZXRlciBUeXBlIFNwZWNpZmllcgorCUFycmF5T2ZCRiBtUGFyYW1ldGVyczsKKworCS8vIHRoZSBDb250ZW50cyBvZiB0aGUgcG9ydCBhcyBjaGFubmVsCisJVGFibGVPZlN5bWJvbCBtQ29udGVudHM7CisKKwlJbnN0YW5jZU9mUG9ydCAqIG1Sb3V0aW5nQ2hhbm5lbDsKKworCS8vIFRoZSByb3V0aW5nIGRhdGEgYWNjZXNzIG9wdGltaXphdGlvbgorCVJvdXRpbmdEYXRhIG1JbnB1dFJvdXRpbmdEYXRhOworCVJvdXRpbmdEYXRhIG1PdXRwdXRSb3V0aW5nRGF0YTsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJSW5zdGFuY2VPZlBvcnQoQmFzZUF2bVByb2dyYW0gKiBhQ29udGFpbmVyLAorCQkJUHJvcGVydHlFbGVtZW50ICogYUNvbXBpbGVkLCBhdm1fb2Zmc2V0X3QgYW5PZmZzZXQsCisJCQlhdm1fc2l6ZV90IGFQYXJhbWV0ZXJDb3VudCwgRU5VTV9JT19OQVRVUkUgYU5hdHVyZSk7CisKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogY29weQorCSAqLworCUluc3RhbmNlT2ZQb3J0KGNvbnN0IEluc3RhbmNlT2ZQb3J0ICYgYVBvcnQpCisJOiBCYXNlSW5zdGFuY2VGb3JtKCBhUG9ydCApLAorCW1Sb3V0ZU9mZnNldCggYVBvcnQubVJvdXRlT2Zmc2V0ICksCisJbUNvbVBvaW50TmF0dXJlKCBhUG9ydC5tQ29tUG9pbnROYXR1cmUgKSwKKworCW1QYXJhbWV0ZXJzKCBhUG9ydC5tUGFyYW1ldGVycyApLAorCW1Db250ZW50cyggYVBvcnQubUNvbnRlbnRzICksCisKKwltUm91dGluZ0NoYW5uZWwoIGFQb3J0Lm1Sb3V0aW5nQ2hhbm5lbCApLAorCisJbUlucHV0Um91dGluZ0RhdGEoIGFQb3J0Lm1JbnB1dFJvdXRpbmdEYXRhICksCisJbU91dHB1dFJvdXRpbmdEYXRhKCBhUG9ydC5tT3V0cHV0Um91dGluZ0RhdGEgKQorCXsKKwkJLy8hISBOT1RISU5HCisvLwkJQVZNX09TX1RSQUNFIDw8ICJwb3J0OjpuZXcgOj4gIiA8PCBnZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbDsKKwl9CisKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogdmlhIENoYW5uZWwKKwkgKi8KKwlJbnN0YW5jZU9mUG9ydChCYXNlQXZtUHJvZ3JhbSAqIGFDb250YWluZXIsIFBvcnQgKiBjaGFuUG9ydENvbXBpbGVkLAorCQkJSW5zdGFuY2VPZlBvcnQgKiBhQ2hhbm5lbCwgSW5zdGFuY2VPZlBvcnQgKiBhVGFyZ2V0KQorCTogQmFzZUluc3RhbmNlRm9ybShDTEFTU19LSU5EX1QoIEluc3RhbmNlT2ZQb3J0ICksCisJCQlhQ29udGFpbmVyLCBjaGFuUG9ydENvbXBpbGVkLCBhVGFyZ2V0KSwKKwltUm91dGVPZmZzZXQoIGFUYXJnZXQtPm1Sb3V0ZU9mZnNldCApLAorCW1Db21Qb2ludE5hdHVyZSggYVRhcmdldC0+bUNvbVBvaW50TmF0dXJlICksCisKKwltUGFyYW1ldGVycyggYVRhcmdldC0+bVBhcmFtZXRlcnMgKSwKKwltQ29udGVudHMoIGFUYXJnZXQtPm1Db250ZW50cyApLAorCisJbVJvdXRpbmdDaGFubmVsKCBhQ2hhbm5lbCApLAorCisJbUlucHV0Um91dGluZ0RhdGEoICksCisJbU91dHB1dFJvdXRpbmdEYXRhKCApCisKKwl7CisJCXNldEFsaWFzVGFyZ2V0KCBhVGFyZ2V0ICk7CisvLwkJQVZNX09TX1RSQUNFIDw8ICJwb3J0OjpuZXcgOj4gIiA8PCBnZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbDsKKwl9CisKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogZm9yIEFsaWFzCisJICovCisJSW5zdGFuY2VPZlBvcnQoQmFzZUF2bVByb2dyYW0gKiBhQ29udGFpbmVyLCBJbnN0YW5jZU9mUG9ydCAqIGFUYXJnZXQsCisJCQlWZWN0b3JPZkluc3RhbmNlT2ZNYWNoaW5lICYgYVJlbGF0aXZlTWFjaGluZVBhdGgpCisJOiBCYXNlSW5zdGFuY2VGb3JtKENMQVNTX0tJTkRfVCggSW5zdGFuY2VPZlBvcnQgKSwgYUNvbnRhaW5lciwgYVRhcmdldCwKKwkJCWFSZWxhdGl2ZU1hY2hpbmVQYXRoKSwKKwltUm91dGVPZmZzZXQoIGFUYXJnZXQtPm1Sb3V0ZU9mZnNldCApLAorCW1Db21Qb2ludE5hdHVyZSggYVRhcmdldC0+bUNvbVBvaW50TmF0dXJlICksCisKKwltUGFyYW1ldGVycyggYVRhcmdldC0+bVBhcmFtZXRlcnMgKSwKKwltQ29udGVudHMoIGFUYXJnZXQtPm1Db250ZW50cyApLAorCisJbVJvdXRpbmdDaGFubmVsKCBhVGFyZ2V0LT5tUm91dGluZ0NoYW5uZWwgKSwKKworCW1JbnB1dFJvdXRpbmdEYXRhKCApLAorCW1PdXRwdXRSb3V0aW5nRGF0YSggKQorCisJeworCQkvLyEhIE5PVEhJTkcKKy8vCQlBVk1fT1NfVFJBQ0UgPDwgInBvcnQ6Om5ldyA6PiAiIDw8IGdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgc3RkOjplbmRsOworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkluc3RhbmNlT2ZQb3J0KCkKKwl7CisvLwkJQVZNX09TX1RSQUNFIDw8ICJwb3J0OjpkZWxldGUgOj4gIiA8PCBnZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbDsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBGYWN0b3J5CisJICogbmV3IFBvcnQgw6AgQ2hhbm5lbAorCSAqLworCXN0YXRpYyBJbnN0YW5jZU9mUG9ydCAqIG5ld0NoYW5uZWwoQmFzZUF2bVByb2dyYW0gKiBhQ29udGFpbmVyLAorCQkJQ2hhbm5lbCAqIGFDb21waWxlZCwgYXZtX29mZnNldF90IGFuT2Zmc2V0KQorCXsKKwkJcmV0dXJuKCBuZXcgSW5zdGFuY2VPZlBvcnQoYUNvbnRhaW5lciwgYUNvbXBpbGVkLAorCQkJCWFuT2Zmc2V0LCAwLCBJT19DSEFOTkVMX05BVFVSRSkgKTsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtUm91dGVPZmZzZXQKKwkgKi8KKwlpbmxpbmUgYXZtX3NpemVfdCBnZXRSb3V0ZU9mZnNldCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Sb3V0ZU9mZnNldCApOworCX0KKworCWlubGluZSB2b2lkIHNldFJvdXRlT2Zmc2V0KGF2bV9zaXplX3QgYVJvdXRlT2Zmc2V0KQorCXsKKwkJbVJvdXRlT2Zmc2V0ID0gYVJvdXRlT2Zmc2V0OworCX0KKworCisJLyoqCisJICogQVBJCisJICogSUNvbVBvaW50CisJICogbUNvbVBvaW50TmF0dXJlCisJICogbUNvbVBvaW50RGlyZWN0aW9uCisJICovCisJaW5saW5lIHZpcnR1YWwgRU5VTV9JT19OQVRVUkUgZ2V0Q29tUG9pbnROYXR1cmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQ29tUG9pbnROYXR1cmUgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1QYXJhbWV0ZXJzCisJICovCisJaW5saW5lIEFycmF5T2ZCRiAmIGdldFBhcmFtZXRlcnMoKQorCXsKKwkJcmV0dXJuKCBtUGFyYW1ldGVycyApOworCX0KKworCWlubGluZSBjb25zdCBBcnJheU9mQkYgJiBnZXRQYXJhbWV0ZXJzKCkgY29uc3QKKwl7CisJCXJldHVybiggbVBhcmFtZXRlcnMgKTsKKwl9CisKKworCWlubGluZSBjb25zdCBCRiAmIGdldFBhcmFtZXRlcihhdm1fc2l6ZV90IG9mZnNldCkgY29uc3QKKwl7CisJCXJldHVybiggbVBhcmFtZXRlcnNbb2Zmc2V0XSApOworCX0KKworCWlubGluZSBCYXNlVHlwZVNwZWNpZmllciAqIGdldFBhcmFtZXRlclR5cGUoYXZtX3NpemVfdCBvZmZzZXQpIGNvbnN0CisJeworCQlpZiggbVBhcmFtZXRlcnNbb2Zmc2V0XS5pczwgQmFzZVR5cGVTcGVjaWZpZXIgPigpICkKKwkJeworCQkJcmV0dXJuKCBtUGFyYW1ldGVyc1tvZmZzZXRdLnRvX3B0cjwgQmFzZVR5cGVTcGVjaWZpZXIgPigpICk7CisJCX0KKwkJZWxzZSBpZiggbVBhcmFtZXRlcnNbb2Zmc2V0XS5pczwgQmFzZUluc3RhbmNlRm9ybSA+KCkgKQorCQl7CisJCQlyZXR1cm4oIG1QYXJhbWV0ZXJzW29mZnNldF0uCisJCQkJCXRvX3B0cjwgQmFzZUluc3RhbmNlRm9ybSA+KCktPmdldFR5cGVTcGVjaWZpZXIoKSApOworCQl9CisJCXJldHVybiggTlVMTCApOworCX0KKworCisJaW5saW5lIGF2bV9zaXplX3QgZ2V0UGFyYW1ldGVyQ291bnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUGFyYW1ldGVycy5zaXplKCkgKTsKKwl9CisKKworCWlubGluZSBib29sIGhhc1BhcmFtZXRlcigpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldFBhcmFtZXRlckNvdW50KCkgPiAwICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzUGFyYW1ldGVyVHlwZShhdm1fc2l6ZV90IG9mZnNldCkgY29uc3QKKwl7CisJCWlmKCBvZmZzZXQgPCBnZXRQYXJhbWV0ZXJDb3VudCgpICkKKwkJeworCQkJaWYoIG1QYXJhbWV0ZXJzW29mZnNldF0uaXM8IEJhc2VUeXBlU3BlY2lmaWVyID4oKSApCisJCQl7CisJCQkJcmV0dXJuKCB0cnVlICk7CisJCQl9CisJCQllbHNlIGlmKCBtUGFyYW1ldGVyc1tvZmZzZXRdLmlzPCBCYXNlSW5zdGFuY2VGb3JtID4oKSApCisJCQl7CisJCQkJcmV0dXJuKCBtUGFyYW1ldGVyc1tvZmZzZXRdLgorCQkJCQkJdG9fcHRyPCBCYXNlSW5zdGFuY2VGb3JtID4oKS0+aGFzVHlwZVNwZWNpZmllcigpICk7CisJCQl9CisJCX0KKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCWlubGluZSBib29sIGlzUGFyYW1ldGVyRGF0YShhdm1fc2l6ZV90IG9mZnNldCkgY29uc3QKKwl7CisJCXJldHVybiggbVBhcmFtZXRlcnNbb2Zmc2V0XS5pczwgSW5zdGFuY2VPZkRhdGEgPigpICk7CisJfQorCisKKwlpbmxpbmUgdm9pZCBzZXRQYXJhbWV0ZXIoYXZtX3NpemVfdCBpbmRleCwgY29uc3QgQkYgJiBhUGFyYW0pCisJeworCQltUGFyYW1ldGVyc1tpbmRleF09IGFQYXJhbTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1Db250ZW50cworCSAqLworCWlubGluZSB2b2lkIGFwcGVuZENvbnRlbnQoY29uc3QgU3ltYm9sICYgYVN5bWJvbCkKKwl7CisJCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9TTUFSVF9QT0lOVEVSX0VYSVQoIGFTeW1ib2wgKQorCQkJCTw8ICJTeW1ib2wgYXMgQ2hhbm5lbCBjb250ZW50ICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJbUNvbnRlbnRzLmFwcGVuZChhU3ltYm9sKTsKKwl9CisKKwlpbmxpbmUgVGFibGVPZlN5bWJvbCAmIGdldENvbnRlbnRzKCkKKwl7CisJCXJldHVybiggbUNvbnRlbnRzICk7CisJfQorCisJaW5saW5lIGNvbnN0IFRhYmxlT2ZTeW1ib2wgJiBnZXRDb250ZW50cygpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Db250ZW50cyApOworCX0KKworCisJaW5saW5lIGNvbnN0IEJGICYgZ2V0Q29udGVudChhdm1fc2l6ZV90IG9mZnNldCkgY29uc3QKKwl7CisJCXJldHVybiggbUNvbnRlbnRzW29mZnNldF0gKTsKKwl9CisKKworCWlubGluZSBhdm1fc2l6ZV90IGdldENvbnRlbnRDb3VudCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Db250ZW50cy5zaXplKCkgKTsKKwl9CisKKworCWlubGluZSBib29sIGhhc0NvbnRlbnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRDb250ZW50Q291bnQoKSA+IDAgKTsKKwl9CisKKworCWlubGluZSBib29sIGlzQ29udGVudERhdGEoYXZtX3NpemVfdCBvZmZzZXQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Db250ZW50c1tvZmZzZXRdLmlzPCBJbnN0YW5jZU9mRGF0YSA+KCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc0NvbnRlbnRQb3J0KGF2bV9zaXplX3Qgb2Zmc2V0KSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQ29udGVudHNbb2Zmc2V0XS5pczwgSW5zdGFuY2VPZlBvcnQgPigpICk7CisJfQorCisKKwlpbmxpbmUgdm9pZCBzZXRDb250ZW50KGF2bV9zaXplX3QgaW5kZXgsIGNvbnN0IFN5bWJvbCAmIGFTeW1ib2wpCisJeworCQltQ29udGVudHNbaW5kZXhdPSBhU3ltYm9sOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVJvdXRpbmdDaGFubmVsCisJICovCisJaW5saW5lIEluc3RhbmNlT2ZQb3J0ICogZ2V0Um91dGluZ0NoYW5uZWwoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUm91dGluZ0NoYW5uZWwgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNSb3V0aW5nQ2hhbm5lbCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Sb3V0aW5nQ2hhbm5lbCAhPSBOVUxMICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0Um91dGluZ0NoYW5uZWwoSW5zdGFuY2VPZlBvcnQgKiBhUm91dGluZ0NoYW5uZWwpCisJeworCQltUm91dGluZ0NoYW5uZWwgPSBhUm91dGluZ0NoYW5uZWw7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtSW5wdXRSb3V0aW5nRGF0YQorCSAqLworCWlubGluZSBjb25zdCBSb3V0aW5nRGF0YSAmIGdldElucHV0Um91dGluZ0RhdGEoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtSW5wdXRSb3V0aW5nRGF0YSApOworCX0KKworCWlubGluZSBib29sIGhhc0lucHV0Um91dGluZ0RhdGEoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtSW5wdXRSb3V0aW5nRGF0YSAhPSBOVUxMICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0SW5wdXRSb3V0aW5nRGF0YShjb25zdCBSb3V0aW5nRGF0YSAmIGFuSW5wdXRSb3V0aW5nRGF0YSkKKwl7CisJCW1JbnB1dFJvdXRpbmdEYXRhID0gYW5JbnB1dFJvdXRpbmdEYXRhOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbU91dHB1dFJvdXRpbmdEYXRhCisJICovCisJaW5saW5lIGNvbnN0IFJvdXRpbmdEYXRhICYgZ2V0T3V0cHV0Um91dGluZ0RhdGEoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtT3V0cHV0Um91dGluZ0RhdGEgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNPdXRwdXRSb3V0aW5nRGF0YSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1PdXRwdXRSb3V0aW5nRGF0YSAhPSBOVUxMICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0T3V0cHV0Um91dGluZ0RhdGEoY29uc3QgUm91dGluZ0RhdGEgJiBhbk91dHB1dFJvdXRpbmdEYXRhKQorCXsKKwkJbU91dHB1dFJvdXRpbmdEYXRhID0gYW5PdXRwdXRSb3V0aW5nRGF0YTsKKwl9CisKKworCS8qKgorCSAqIEZvcm1hdCBhIHZhbHVlIHcuci50LiBpdHMgdHlwZQorCSAqLworCXZpcnR1YWwgdm9pZCBmb3JtYXRTdHJlYW0oT3V0U3RyZWFtICYgb3V0LCBjb25zdCBCRiAmIGJmVmFsdWUpIGNvbnN0OworCisJdmlydHVhbCB2b2lkIGZvcm1hdFN0cmVhbShPdXRTdHJlYW0gJiBvdXQsIGNvbnN0IEFycmF5QkYgJiBhcnJheVZhbHVlKSBjb25zdDsKKworCisJLyoqCisJICogU2VyaWFsaXphdGlvbgorCSAqLworCXZvaWQgc3RyUGFyYW1ldGVyKE91dFN0cmVhbSAmIG91dCwgY29uc3QgQkYgJiBhUGFyYW1ldGVyKSBjb25zdDsKKwl2b2lkIHN0clBhcmFtZXRlcihPdXRTdHJlYW0gJiBvdXQpIGNvbnN0OworCisJdm9pZCBzdHJIZWFkZXIoT3V0U3RyZWFtICYgb3V0KSBjb25zdDsKKworCXN0ZDo6c3RyaW5nIHN0ckFyZygpIGNvbnN0OworCisJdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvdXQpIGNvbnN0OworCit9OworCisKK30KKworI2VuZGlmIC8qIElOU1RBTkNFT0ZQT1JUX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhlY3V0YWJsZS9Sb3V0ZXIuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4ZWN1dGFibGUvUm91dGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmQ4YmFhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4ZWN1dGFibGUvUm91dGVyLmNwcApAQCAtMCwwICsxLDIzOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiUm91dGVyLmgiCisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9Bdm1Db2RlLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlRm9ybS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZNYWNoaW5lLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZlBvcnQuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoKKyAqIFNUQVRJQyBBVFRSSUJVVEVTCisgKi8KK1JvdXRlciBSb3V0ZXI6Ol9OVUxMXzsKKworCisvKioKKyAqIFNFVFRFUgorICogbUlucHV0Um91dGluZ1RhYmxlCisgKi8KK3ZvaWQgUm91dGVyOjphcHBlbmRJbnB1dFJvdXRpbmcoSW5zdGFuY2VPZlBvcnQgKiBhUG9ydEluc3RhbmNlLAorCQljb25zdCBSb3V0aW5nRGF0YSAmIGFSb3V0aW5nRGF0YSkKK3sKKwlSb3V0aW5nRGF0YSAmIG9sZFJvdXRpbmdEYXRhID0KKwkJCWdldElucHV0Um91dGluZyggYVBvcnRJbnN0YW5jZS0+Z2V0Um91dGVPZmZzZXQoKSApOworCWlmKCBvbGRSb3V0aW5nRGF0YS52YWxpZCgpICkKKwl7CisJCWlmKCBvbGRSb3V0aW5nRGF0YS5nZXRNSUQoKSA9PSBhUm91dGluZ0RhdGEuZ2V0TUlEKCkgKQorCQl7CisJCQlvbGRSb3V0aW5nRGF0YS5nZXRCdWZmZXJJbnN0YW5jZSgpLmFwcGVuZCgKKwkJCQkJYVJvdXRpbmdEYXRhLmdldEJ1ZmZlckluc3RhbmNlKCkgKTsKKworCQkJb2xkUm91dGluZ0RhdGEuZ2V0QnVmZmVySW5zdGFuY2UoKS5tYWtlVW5pcXVlKCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlBVk1fT1NfV0FSTklOR19BTEVSVAorCQkJCQk8PCAiVW5leHBlY3RlZCBhIHBvcnQgPCAiCisJCQkJCTw8IGFQb3J0SW5zdGFuY2UtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKwkJCQkJPDwgIiA+IHdpdGggYW5vdGhlciByb3V0aW5nPGlucHV0PiBkYXRhIGluIDw8ICIKKwkJCQkJPDwgZ2V0TWFjaGluZSgpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8ICIgPj4gISEhIgorCQkJCQk8PCBTRU5EX0FMRVJUOworCisJCQlBVk1fT1NfTE9HIDw8ICJJbnB1dCBSb3V0aW5nIERhdGEgb2YgcG9ydCA6ICIKKwkJCQkJPDwgYVBvcnRJbnN0YW5jZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCBzdGQ6OmVuZGw7CisJCQlvbGRSb3V0aW5nRGF0YS50b1N0cmVhbShBVk1fT1NfTE9HIDw8IEFWTV9UQUJfSU5ERU5UKTsKKwkJCUFWTV9PU19MT0cgPDwgRU5EX0lOREVOVCA8PCBzdGQ6OmVuZGw7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJc2V0SW5wdXRSb3V0aW5nKGFQb3J0SW5zdGFuY2UtPmdldFJvdXRlT2Zmc2V0KCksIGFSb3V0aW5nRGF0YSk7CisJfQorfQorCit2b2lkIFJvdXRlcjo6c2V0SW5wdXRSb3V0aW5nKEluc3RhbmNlT2ZQb3J0ICogYVBvcnRJbnN0YW5jZSwKKwkJY29uc3QgUm91dGluZ0RhdGEgJiBhUm91dGluZ0RhdGEpIGNvbnN0Cit7CisJaWYoIGdldElucHV0Um91dGluZ1RhYmxlKCkuZ2V0KGFQb3J0SW5zdGFuY2UtPmdldFJvdXRlT2Zmc2V0KCkpLnZhbGlkKCkgKQorCXsKKwkJQVZNX09TX1dBUk5JTkdfQUxFUlQKKwkJCQk8PCAiVW5leHBlY3RlZCBhIHBvcnQgPCAiCisJCQkJPDwgYVBvcnRJbnN0YW5jZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJCTw8ICIgPiB3aXRoIGFub3RoZXIgcm91dGluZzxpbnB1dD4gZGF0YSBpbiA8PCAiCisJCQkJPDwgZ2V0TWFjaGluZSgpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpICsgIiA+PiAhISEiCisJCQkJPDwgU0VORF9BTEVSVDsKKworCQlBVk1fT1NfTE9HIDw8ICJJbnB1dCBSb3V0aW5nIERhdGEgb2YgcG9ydCA6ICIKKwkJCQk8PCBhUG9ydEluc3RhbmNlLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbDsKKworCQlnZXRJbnB1dFJvdXRpbmdUYWJsZSgpLmdldChhUG9ydEluc3RhbmNlLT5nZXRSb3V0ZU9mZnNldCgpKS4KKwkJCQl0b1N0cmVhbShBVk1fT1NfTE9HIDw8IEFWTV9UQUJfSU5ERU5UKTsKKwkJQVZNX09TX0xPRyA8PCBFTkRfSU5ERU5UIDw8IHN0ZDo6ZW5kbDsKKwl9CisKKwlzZXRJbnB1dFJvdXRpbmcoYVBvcnRJbnN0YW5jZS0+Z2V0Um91dGVPZmZzZXQoKSwgYVJvdXRpbmdEYXRhKTsKK30KKworCisvKioKKyAqIEdFVFRFUiAtIFNFVFRFUgorICogbU91dHB1dFJvdXRpbmdUYWJsZQorICovCit2b2lkIFJvdXRlcjo6YXBwZW5kT3V0cHV0Um91dGluZyhJbnN0YW5jZU9mUG9ydCAqIGFQb3J0SW5zdGFuY2UsCisJCWNvbnN0IFJvdXRpbmdEYXRhICYgYVJvdXRpbmdEYXRhKQoreworCVJvdXRpbmdEYXRhICYgb2xkUm91dGluZ0RhdGEgPQorCQkJZ2V0T3V0cHV0Um91dGluZyggYVBvcnRJbnN0YW5jZS0+Z2V0Um91dGVPZmZzZXQoKSApOworCWlmKCBvbGRSb3V0aW5nRGF0YS52YWxpZCgpICkKKwl7CisJCWlmKCBvbGRSb3V0aW5nRGF0YS5nZXRNSUQoKSA9PSBhUm91dGluZ0RhdGEuZ2V0TUlEKCkgKQorCQl7CisJCQlvbGRSb3V0aW5nRGF0YS5nZXRCdWZmZXJJbnN0YW5jZSgpLmFwcGVuZCgKKwkJCQkJYVJvdXRpbmdEYXRhLmdldEJ1ZmZlckluc3RhbmNlKCkgKTsKKworCQkJb2xkUm91dGluZ0RhdGEuZ2V0QnVmZmVySW5zdGFuY2UoKS5tYWtlVW5pcXVlKCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlBVk1fT1NfV0FSTklOR19BTEVSVAorCQkJCQk8PCAiVW5leHBlY3RlZCBhIHBvcnQgPCAiCisJCQkJCTw8IGFQb3J0SW5zdGFuY2UtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKwkJCQkJPDwgIiA+IHdpdGggYW5vdGhlciByb3V0aW5nPG91dHB1dD4gZGF0YSBpbiA8PCAiCisJCQkJCTw8IGdldE1hY2hpbmUoKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiID4+ICEhISIKKwkJCQkJPDwgU0VORF9BTEVSVDsKKworCQkJQVZNX09TX0xPRyA8PCAiT3V0cHV0IFJvdXRpbmcgRGF0YSBvZiBwb3J0IDogIgorCQkJCQk8PCBhUG9ydEluc3RhbmNlLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbDsKKwkJCW9sZFJvdXRpbmdEYXRhLnRvU3RyZWFtKEFWTV9PU19MT0cgPDwgQVZNX1RBQl9JTkRFTlQpOworCisJCQlBVk1fT1NfTE9HIDw8IEVORF9JTkRFTlQgPDwgc3RkOjplbmRsOworCQl9CisJfQorCWVsc2UKKwl7CisJCXNldE91dHB1dFJvdXRpbmcoYVBvcnRJbnN0YW5jZS0+Z2V0Um91dGVPZmZzZXQoKSwgYVJvdXRpbmdEYXRhKTsKKwl9Cit9CisKK3ZvaWQgUm91dGVyOjpzZXRPdXRwdXRSb3V0aW5nKEluc3RhbmNlT2ZQb3J0ICogYVBvcnRJbnN0YW5jZSwKKwkJY29uc3QgUm91dGluZ0RhdGEgJiBhUm91dGluZ0RhdGEpIGNvbnN0Cit7CisJaWYoIGdldE91dHB1dFJvdXRpbmdUYWJsZSgpLmdldChhUG9ydEluc3RhbmNlLT5nZXRSb3V0ZU9mZnNldCgpKS52YWxpZCgpICkKKwl7CisJCUFWTV9PU19XQVJOSU5HX0FMRVJUCisJCQkJPDwgIlVuZXhwZWN0ZWQgYSBwb3J0IDwgIgorCQkJCTw8IGFQb3J0SW5zdGFuY2UtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKwkJCQk8PCAiID4gd2l0aCBhbm90aGVyIHJvdXRpbmc8b3V0cHV0PiBkYXRhIGluIDw8ICIKKwkJCQk8PCBnZXRNYWNoaW5lKCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIiA+PiAhISEiCisJCQkJPDwgU0VORF9BTEVSVDsKKworCQlBVk1fT1NfTE9HIDw8ICJPdXRwdXQgUm91dGluZyBEYXRhIG9mIHBvcnQgOiAiCisJCQkJPDwgYVBvcnRJbnN0YW5jZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCBzdGQ6OmVuZGw7CisKKwkJZ2V0T3V0cHV0Um91dGluZ1RhYmxlKCkuZ2V0KGFQb3J0SW5zdGFuY2UtPmdldFJvdXRlT2Zmc2V0KCkpLgorCQkJCXRvU3RyZWFtKEFWTV9PU19MT0cgPDwgQVZNX1RBQl9JTkRFTlQpOworCisJCUFWTV9PU19MT0cgPDwgRU5EX0lOREVOVCA8PCBzdGQ6OmVuZGw7CisJfQorCisJc2V0T3V0cHV0Um91dGluZyhhUG9ydEluc3RhbmNlLT5nZXRSb3V0ZU9mZnNldCgpLCBhUm91dGluZ0RhdGEpOworfQorCisKKy8qKgorICogVEVTVEVSCisgKi8KK2Jvb2wgUm91dGVyOjpoYXNJbnB1dFJvdXRpbmcoSW5zdGFuY2VPZlBvcnQgKiBhUG9ydCkgY29uc3QKK3sKKwlyZXR1cm4oIGFQb3J0LT5nZXRNb2RpZmllcigpLmhhc0RpcmVjdGlvbklucHV0KCkKKwkJJiYgKGFQb3J0LT5nZXRSb3V0ZU9mZnNldCgpIDwgZ2V0SW5wdXRSb3V0aW5nVGFibGUoKS5zaXplKCkpCisJCSYmIChnZXRJbnB1dFJvdXRpbmcoYVBvcnQtPmdldFJvdXRlT2Zmc2V0KCkpLmdldFBvcnQoKSA9PSBhUG9ydCkgKTsKK30KKworYm9vbCBSb3V0ZXI6Omhhc091dHB1dFJvdXRpbmcoSW5zdGFuY2VPZlBvcnQgKiBhUG9ydCkgY29uc3QKK3sKKwlyZXR1cm4oIGFQb3J0LT5nZXRNb2RpZmllcigpLmhhc0RpcmVjdGlvbk91dHB1dCgpCisJCSYmIChhUG9ydC0+Z2V0Um91dGVPZmZzZXQoKSA8IGdldE91dHB1dFJvdXRpbmdUYWJsZSgpLnNpemUoKSkKKwkJJiYgKGdldE91dHB1dFJvdXRpbmcoYVBvcnQtPmdldFJvdXRlT2Zmc2V0KCkpLmdldFBvcnQoKSA9PSBhUG9ydCkgKTsKK30KKworCisvKioKKyAqIFNlcmlhbGl6YXRpb24KKyAqLwordm9pZCBSb3V0ZXJFbGVtZW50Ojp0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlvcyA8PCBUQUIgPDwgInJvdXRlciAiIDw8IG1NYWNoaW5lLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOworCWlmKCBtTWFjaGluZS0+aXNUaGlzKCkgKQorCXsKKwkJb3MgPDwgIjwgIiA8PCBtTWFjaGluZS0+Z2V0RXhlY3V0YWJsZSgpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQk8PCAiID4iOworCX0KKwlBVk1fREVCVUdfUkVGX0NPVU5URVIob3MpOworCW9zIDw8ICIgeyIgPDwgRU9MOworCisJLy8gcm91dGluZyB0YWJsZSBmb3IgSU5TVEFOQ0UKKwlpZiggbUlucHV0Um91dGluZ1RhYmxlLm5vbmVtcHR5KCkgKQorCXsKKwkJb3MgPDwgVEFCIDw8ICJpbnB1dDoiIDw8IEVPTF9JTkNSX0lOREVOVDsKKworCQlUYWJsZU9mUm91dGluZ0RhdGE6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbUlucHV0Um91dGluZ1RhYmxlLmJlZ2luKCk7CisJCVRhYmxlT2ZSb3V0aW5nRGF0YTo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBtSW5wdXRSb3V0aW5nVGFibGUuZW5kKCk7CisJCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCQl7CisJCQlpZiggKCppdCkudmFsaWQoKSApCisJCQl7CisJCQkJKCppdCkudG9TdHJlYW0ob3MpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW9zIDw8IFRBQiA8PCAiUm91dGluZ0RhdGE8bnVsbD4iIDw8IEVPTDsKKwkJCX0KKwkJfQorCQlvcyA8PCBERUNSX0lOREVOVDsKKwl9CisKKwlpZiggbU91dHB1dFJvdXRpbmdUYWJsZS5ub25lbXB0eSgpICkKKwl7CisJCW9zIDw8IFRBQiA8PCAib3V0cHV0OiIgPDwgRU9MX0lOQ1JfSU5ERU5UOworCisJCVRhYmxlT2ZSb3V0aW5nRGF0YTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtT3V0cHV0Um91dGluZ1RhYmxlLmJlZ2luKCk7CisJCVRhYmxlT2ZSb3V0aW5nRGF0YTo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBtT3V0cHV0Um91dGluZ1RhYmxlLmVuZCgpOworCQlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJeworCQkJaWYoICgqaXQpLnZhbGlkKCkgKQorCQkJeworCQkJCSgqaXQpLnRvU3RyZWFtKG9zKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlvcyA8PCBUQUIgPDwgIlJvdXRpbmdEYXRhPG51bGw+IiA8PCBFT0w7CisJCQl9CisJCX0KKwkJb3MgPDwgREVDUl9JTkRFTlQ7CisJfQorCisJb3MgPDwgVEFCIDw8ICJ9IiA8PCBFT0wgPDwgc3RkOjpmbHVzaDsKK30KKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhlY3V0YWJsZS9Sb3V0ZXIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leGVjdXRhYmxlL1JvdXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMzg5MzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhlY3V0YWJsZS9Sb3V0ZXIuaApAQCAtMCwwICsxLDM3NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBST1VURVJfSF8KKyNkZWZpbmUgUk9VVEVSX0hfCisKKyNpbmNsdWRlIDxiYXNlL1NtYXJ0UG9pbnRlci5oPgorI2luY2x1ZGUgPGNvbW1vbi9FbGVtZW50Lmg+CisKKyNpbmNsdWRlIDxjb2xsZWN0aW9uL1ZlY3Rvci5oPgorI2luY2x1ZGUgPGNvbW1vbi9CRi5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvUm91dGluZ0RhdGEuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworY2xhc3MgSW5zdGFuY2VPZk1hY2hpbmU7CitjbGFzcyBJbnN0YW5jZU9mUG9ydDsKKworY2xhc3MgUm91dGVyOworCisKK2NsYXNzIFJvdXRlckVsZW1lbnQgOgorCQlwdWJsaWMgRWxlbWVudCAsCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggUm91dGVyRWxlbWVudCApCit7CisKKwlmcmllbmQgY2xhc3MgUm91dGVyOworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIFJvdXRlckVsZW1lbnQgKQorCitwcm90ZWN0ZWQ6CisJLyoKKwkgKiBBVFRSSUJVVEVTCisJICovCisJLy8gVGhlIGNvbnRhaW5lciBpbnN0YW5jZQorCUluc3RhbmNlT2ZNYWNoaW5lICogbU1hY2hpbmU7CisKKwlhdm1fc2l6ZV90IG1Sb3V0ZUlEOworCisJVGFibGVPZlJvdXRpbmdEYXRhIG1JbnB1dFJvdXRpbmdUYWJsZTsKKwlUYWJsZU9mUm91dGluZ0RhdGEgbU91dHB1dFJvdXRpbmdUYWJsZTsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJUm91dGVyRWxlbWVudChJbnN0YW5jZU9mTWFjaGluZSAqIGFNYWNoaW5lLAorCQkJYXZtX3NpemVfdCBhUm91dGVJRCwgYXZtX3NpemVfdCBtc2dDb3VudCA9IDApCisJOiBFbGVtZW50KCBDTEFTU19LSU5EX1QoIFJvdXRlciApICksCisJbU1hY2hpbmUoIGFNYWNoaW5lICksCisJbVJvdXRlSUQoIGFSb3V0ZUlEICksCisJbUlucHV0Um91dGluZ1RhYmxlKCBtc2dDb3VudCApLAorCW1PdXRwdXRSb3V0aW5nVGFibGUoIG1zZ0NvdW50ICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCWV4cGxpY2l0IFJvdXRlckVsZW1lbnQoY29uc3QgUm91dGVyRWxlbWVudCAmIGFuRWxlbWVudCkKKwk6IEVsZW1lbnQoIGFuRWxlbWVudCApLAorCW1NYWNoaW5lKCBhbkVsZW1lbnQubU1hY2hpbmUgKSwKKwltUm91dGVJRCggYW5FbGVtZW50Lm1Sb3V0ZUlEICksCisJbUlucHV0Um91dGluZ1RhYmxlKCBhbkVsZW1lbnQubUlucHV0Um91dGluZ1RhYmxlICksCisJbU91dHB1dFJvdXRpbmdUYWJsZSggYW5FbGVtZW50Lm1PdXRwdXRSb3V0aW5nVGFibGUgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+Um91dGVyRWxlbWVudCgpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJdmlydHVhbCB2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworfTsKKworCitjbGFzcyBSb3V0ZXIgOgorCQlwdWJsaWMgU21hcnRQb2ludGVyPCBSb3V0ZXJFbGVtZW50ICwgRGVzdHJveUVsZW1lbnRQb2xpY3kgPiwKKwkJQVZNX0lOSkVDVF9JTlNUQU5DRV9DT1VOVEVSX0NMQVNTKCBSb3V0ZXIgKQoreworCitwcml2YXRlOgorCS8qKgorCSAqIFRZUEVERUYKKwkgKi8KKwl0eXBlZGVmIFNtYXJ0UG9pbnRlcjwgUm91dGVyRWxlbWVudCAsCisJCQkJCQlEZXN0cm95RWxlbWVudFBvbGljeSA+ICBiYXNlX3RoaXNfdHlwZTsKKworCitwdWJsaWM6CisJLyoKKwkgKiBTVEFUSUMgQVRUUklCVVRFUworCSAqLworCXN0YXRpYyBSb3V0ZXIgX05VTExfOworCisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlSb3V0ZXIoKQorCTogYmFzZV90aGlzX3R5cGUoICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCVJvdXRlcihJbnN0YW5jZU9mTWFjaGluZSAqIGFNYWNoaW5lLAorCQkJYXZtX3NpemVfdCBhUm91dGVJRCwgYXZtX3NpemVfdCBtc2dDb3VudCA9IDApCisJOiBiYXNlX3RoaXNfdHlwZSggbmV3IFJvdXRlckVsZW1lbnQoYU1hY2hpbmUsIGFSb3V0ZUlELCBtc2dDb3VudCkgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJUm91dGVyKGNvbnN0IFJvdXRlciAmIGFuRWxlbWVudCkKKwk6IGJhc2VfdGhpc190eXBlKCBhbkVsZW1lbnQgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCitwdWJsaWM6CisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgflJvdXRlcigpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIG9wZXJhdG9yPQorCSAqLworCWlubGluZSBSb3V0ZXIgJiBvcGVyYXRvcj0oY29uc3QgQkYgJiBvdGhlcikKKwl7CisJCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggb3RoZXIuaXM8IFJvdXRlciA+KCkgKQorCQkJCTw8ICJJbnZhbGlkIEFzc2lnbm1lbnQgQ2FzdCBvZiBhbiBpbmhlcml0IEJGIENsYXNzICEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQlpZiggYmFzZV90aGlzX3R5cGU6Om1QVFIgIT0gb3RoZXIucmF3X3BvaW50ZXIoKSApCisJCXsKKwkJCXJlbGVhc2VfYWNxdWlyZSgKKwkJCQkJc3RhdGljX2Nhc3Q8IFJvdXRlckVsZW1lbnQgKiA+KCBvdGhlci5yYXdfcG9pbnRlcigpICkgKTsKKwkJfQorCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtTWFjaGluZQorCSAqLworCWlubGluZSBJbnN0YW5jZU9mTWFjaGluZSAqIGdldE1hY2hpbmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBiYXNlX3RoaXNfdHlwZTo6bVBUUi0+bU1hY2hpbmUgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNNYWNoaW5lKCkgY29uc3QKKwl7CisJCXJldHVybiggYmFzZV90aGlzX3R5cGU6Om1QVFItPm1NYWNoaW5lICE9IE5VTEwgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIG1Sb3V0ZUlECisJICovCisJaW5saW5lIGF2bV9zaXplX3QgZ2V0Um91dGVJRCgpIGNvbnN0CisJeworCQlyZXR1cm4oIGJhc2VfdGhpc190eXBlOjptUFRSLT5tUm91dGVJRCApOworCX0KKworCWlubGluZSBhdm1fc2l6ZV90IGdldFRvdGFsUm91dGVDb3VudCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHN0ZDo6bWF4KGJhc2VfdGhpc190eXBlOjptUFRSLT5tSW5wdXRSb3V0aW5nVGFibGUuc2l6ZSgpLAorCQkJCWJhc2VfdGhpc190eXBlOjptUFRSLT5tT3V0cHV0Um91dGluZ1RhYmxlLnNpemUoKSkgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1JbnB1dFJvdXRpbmdUYWJsZQorCSAqLworCWlubGluZSBUYWJsZU9mUm91dGluZ0RhdGEgJiBnZXRJbnB1dFJvdXRpbmdUYWJsZSgpCisJeworCQlyZXR1cm4oIGJhc2VfdGhpc190eXBlOjptUFRSLT5tSW5wdXRSb3V0aW5nVGFibGUgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgVGFibGVPZlJvdXRpbmdEYXRhICYgZ2V0SW5wdXRSb3V0aW5nVGFibGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBiYXNlX3RoaXNfdHlwZTo6bVBUUi0+bUlucHV0Um91dGluZ1RhYmxlICk7CisJfQorCisJaW5saW5lIFJvdXRpbmdEYXRhICYgZ2V0SW5wdXRSb3V0aW5nKGF2bV9vZmZzZXRfdCBvZmZzZXQpCisJeworCQlyZXR1cm4oIGJhc2VfdGhpc190eXBlOjptUFRSLT5tSW5wdXRSb3V0aW5nVGFibGUuZ2V0KG9mZnNldCkgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgUm91dGluZ0RhdGEgJiBnZXRJbnB1dFJvdXRpbmcoYXZtX29mZnNldF90IG9mZnNldCkgY29uc3QKKwl7CisJCXJldHVybiggYmFzZV90aGlzX3R5cGU6Om1QVFItPm1JbnB1dFJvdXRpbmdUYWJsZS5nZXQob2Zmc2V0KSApOworCX0KKworCWlubGluZSBib29sIGhhc0lucHV0Um91dGluZyhhdm1fb2Zmc2V0X3Qgb2Zmc2V0KSBjb25zdAorCXsKKwkJcmV0dXJuKCBiYXNlX3RoaXNfdHlwZTo6bVBUUi0+bUlucHV0Um91dGluZ1RhYmxlLmdldChvZmZzZXQpLnZhbGlkKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNudElucHV0Um91dGluZyhhdm1fb2Zmc2V0X3Qgb2Zmc2V0KSBjb25zdAorCXsKKwkJcmV0dXJuKCBiYXNlX3RoaXNfdHlwZTo6bVBUUi0+bUlucHV0Um91dGluZ1RhYmxlLmdldChvZmZzZXQpLmludmFsaWQoKSApOworCX0KKworCisJaW5saW5lIHZvaWQgYXBwZW5kSW5wdXRSb3V0aW5nKGNvbnN0IFJvdXRpbmdEYXRhICYgYVJvdXRpbmdEYXRhKSBjb25zdAorCXsKKwkJYmFzZV90aGlzX3R5cGU6Om1QVFItPm1JbnB1dFJvdXRpbmdUYWJsZS5hcHBlbmQoYVJvdXRpbmdEYXRhKTsKKwl9CisKKwl2b2lkIGFwcGVuZElucHV0Um91dGluZyhJbnN0YW5jZU9mUG9ydCAqIGFQb3J0SW5zdGFuY2UsCisJCQljb25zdCBSb3V0aW5nRGF0YSAmIGFSb3V0aW5nRGF0YSk7CisKKworCXZvaWQgc2V0SW5wdXRSb3V0aW5nKEluc3RhbmNlT2ZQb3J0ICogYVBvcnRJbnN0YW5jZSwKKwkJCWNvbnN0IFJvdXRpbmdEYXRhICYgYVJvdXRpbmdEYXRhKSBjb25zdDsKKworCXZvaWQgc2V0SW5wdXRSb3V0aW5nKGF2bV9vZmZzZXRfdCBvZmZzZXQsCisJCQljb25zdCBSb3V0aW5nRGF0YSAmIGFSb3V0aW5nRGF0YSkgY29uc3QKKwl7CisJCWJhc2VfdGhpc190eXBlOjptUFRSLT5tSW5wdXRSb3V0aW5nVGFibGUuc2V0KG9mZnNldCwgYVJvdXRpbmdEYXRhKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1PdXRwdXRSb3V0aW5nVGFibGUKKwkgKi8KKwlpbmxpbmUgVGFibGVPZlJvdXRpbmdEYXRhICYgZ2V0T3V0cHV0Um91dGluZ1RhYmxlKCkKKwl7CisJCXJldHVybiggYmFzZV90aGlzX3R5cGU6Om1QVFItPm1PdXRwdXRSb3V0aW5nVGFibGUgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgVGFibGVPZlJvdXRpbmdEYXRhICYgZ2V0T3V0cHV0Um91dGluZ1RhYmxlKCkgY29uc3QKKwl7CisJCXJldHVybiggYmFzZV90aGlzX3R5cGU6Om1QVFItPm1PdXRwdXRSb3V0aW5nVGFibGUgKTsKKwl9CisKKwlpbmxpbmUgUm91dGluZ0RhdGEgJiBnZXRPdXRwdXRSb3V0aW5nKGF2bV9vZmZzZXRfdCBvZmZzZXQpCisJeworCQlyZXR1cm4oIGJhc2VfdGhpc190eXBlOjptUFRSLT5tT3V0cHV0Um91dGluZ1RhYmxlLmdldChvZmZzZXQpICk7CisJfQorCisJaW5saW5lIGNvbnN0IFJvdXRpbmdEYXRhICYgZ2V0T3V0cHV0Um91dGluZyhhdm1fb2Zmc2V0X3Qgb2Zmc2V0KSBjb25zdAorCXsKKwkJcmV0dXJuKCBiYXNlX3RoaXNfdHlwZTo6bVBUUi0+bU91dHB1dFJvdXRpbmdUYWJsZS5nZXQob2Zmc2V0KSApOworCX0KKworCWlubGluZSBib29sIGhhc091dHB1dFJvdXRpbmcoYXZtX29mZnNldF90IG9mZnNldCkgY29uc3QKKwl7CisJCXJldHVybiggYmFzZV90aGlzX3R5cGU6Om1QVFItPm1PdXRwdXRSb3V0aW5nVGFibGUuZ2V0KG9mZnNldCkudmFsaWQoKSApOworCX0KKworCWlubGluZSBib29sIGhhc250T3V0cHV0Um91dGluZyhhdm1fb2Zmc2V0X3Qgb2Zmc2V0KSBjb25zdAorCXsKKwkJcmV0dXJuKCBiYXNlX3RoaXNfdHlwZTo6bVBUUi0+bU91dHB1dFJvdXRpbmdUYWJsZS5nZXQob2Zmc2V0KS5pbnZhbGlkKCkgKTsKKwl9CisKKworCWlubGluZSB2b2lkIGFwcGVuZE91dHB1dFJvdXRpbmcoY29uc3QgUm91dGluZ0RhdGEgJiBhUm91dGluZ0RhdGEpIGNvbnN0CisJeworCQliYXNlX3RoaXNfdHlwZTo6bVBUUi0+bU91dHB1dFJvdXRpbmdUYWJsZS5hcHBlbmQoYVJvdXRpbmdEYXRhKTsKKwl9CisKKwl2b2lkIGFwcGVuZE91dHB1dFJvdXRpbmcoSW5zdGFuY2VPZlBvcnQgKiBhUG9ydEluc3RhbmNlLAorCQkJY29uc3QgUm91dGluZ0RhdGEgJiBhUm91dGluZ0RhdGEpOworCisKKwl2b2lkIHNldE91dHB1dFJvdXRpbmcoSW5zdGFuY2VPZlBvcnQgKiBhUG9ydEluc3RhbmNlLAorCQkJY29uc3QgUm91dGluZ0RhdGEgJiBhUm91dGluZ0RhdGEpIGNvbnN0OworCisJdm9pZCBzZXRPdXRwdXRSb3V0aW5nKGF2bV9vZmZzZXRfdCBvZmZzZXQsCisJCQljb25zdCBSb3V0aW5nRGF0YSAmIGFSb3V0aW5nRGF0YSkgY29uc3QKKwl7CisJCWJhc2VfdGhpc190eXBlOjptUFRSLT5tT3V0cHV0Um91dGluZ1RhYmxlLnNldChvZmZzZXQsIGFSb3V0aW5nRGF0YSk7CisJfQorCisKKwkvKioKKwkgKiBURVNURVIKKwkgKi8KKwlpbmxpbmUgYm9vbCBoYXNSb3V0aW5nKEluc3RhbmNlT2ZQb3J0ICogYVBvcnQpIGNvbnN0CisJeworCQlyZXR1cm4oIGhhc0lucHV0Um91dGluZyhhUG9ydCkgfHwgaGFzT3V0cHV0Um91dGluZyhhUG9ydCkgKTsKKwl9CisKKwlib29sIGhhc0lucHV0Um91dGluZyhJbnN0YW5jZU9mUG9ydCAqIGFQb3J0KSBjb25zdDsKKworCWJvb2wgaGFzT3V0cHV0Um91dGluZyhJbnN0YW5jZU9mUG9ydCAqIGFQb3J0KSBjb25zdDsKKworCisJLyoqCisJICogU2VyaWFsaXphdGlvbgorCSAqLworCWlubGluZSB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKAorCQkJY29uc3QgQXZtSW5kZW50ICYgaW5kZW50ID0gQVZNX1RBQl9JTkRFTlQpIGNvbnN0CisJeworCQlpZiggYmFzZV90aGlzX3R5cGU6Om1QVFIgIT0gTlVMTCApCisJCXsKKwkJCVN0cmluZ091dFN0cmVhbSBvc3MoaW5kZW50KTsKKworCQkJYmFzZV90aGlzX3R5cGU6Om1QVFItPnRvU3RyZWFtKCBvc3MgKTsKKworCQkJcmV0dXJuKCBvc3Muc3RyKCkgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybiggaW5kZW50LlRBQlMgKyAiUm91dGVyPG51bGw+IiArIGluZGVudC5FT0wgKTsKKwkJfQorCX0KKworCWlubGluZSB2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJaWYoIGJhc2VfdGhpc190eXBlOjptUFRSICE9IE5VTEwgKQorCQl7CisJCQliYXNlX3RoaXNfdHlwZTo6bVBUUi0+dG9TdHJlYW0ob3MpOworCQl9CisJCWVsc2UKKwkJeworCQkJb3MgPDwgIlJvdXRlcjxudWxsPiIgPDwgc3RkOjpmbHVzaDsKKwkJfQorCX0KKworfTsKKworCisvKioKKyAqIFRZUEUgREVGSU5JVElPTgorICogVEFCTEUgb2YgUk9VVEVSCisgKi8KK3R5cGVkZWYgIFZlY3RvcjwgUm91dGVyID4gIFRhYmxlT2ZSb3V0ZXI7CisKKworCisKK30KKworI2VuZGlmIC8qUk9VVEVSX0hfKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leGVjdXRhYmxlL1JvdXRpbmdEYXRhLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leGVjdXRhYmxlL1JvdXRpbmdEYXRhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTAzYzcyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4ZWN1dGFibGUvUm91dGluZ0RhdGEuY3BwCkBAIC0wLDAgKzEsMTI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiUm91dGluZ0RhdGEuaCIKKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZDb25uZWN0Lmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0NvbVByb3RvY29sLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qCisgKiBTVEFUSUMgQVRUUklCVVRFUworICovCitSb3V0aW5nRGF0YSBSb3V0aW5nRGF0YTo6X05VTExfOworCisKKy8qKgorICogQ09OU1RSVUNUT1IKKyAqIERlZmF1bHQKKyAqLworUm91dGluZ0RhdGFFbGVtZW50OjpSb3V0aW5nRGF0YUVsZW1lbnQoSW5zdGFuY2VPZkNvbm5lY3QgKiBhQ29ubmVjdG9yLAorCQlJbnN0YW5jZU9mTWFjaGluZSAqIGFNYWNoaW5lLCBJbnN0YW5jZU9mUG9ydCAqIGFQb3J0KQorOiBFbGVtZW50KCBDTEFTU19LSU5EX1QoIFJvdXRpbmdEYXRhICkgKSwKK21NSUQoIGFDb25uZWN0b3ItPmdldE1JRCgpICksCittUHJvdG9jb2woIGFDb25uZWN0b3ItPmdldFByb3RvY29sKCkgKSwKK21Db25uZWN0KCBhQ29ubmVjdG9yICksCittTWFjaGluZVBvcnQoYU1hY2hpbmUsIGFQb3J0KSwKK21CdWZmZXJJbnN0YW5jZSggKSwKK21SdW50aW1lUklEKCApCit7CisJLy8hISBOT1RISU5HCit9CisKKworLyoqCisgKiBTZXJpYWxpemF0aW9uCisgKi8KK3N0ZDo6c3RyaW5nIFJvdXRpbmdEYXRhOjpzdHIoKSBjb25zdAoreworCVN0cmluZ091dFN0cmVhbSBvc3M7CisKKwlvc3MgPDwgInJvdXRpbmc8ICIgPDwgQ29tUHJvdG9jb2w6OnRvX3N0cmluZyggZ2V0UHJvdG9jb2woKSApCisJCQk8PCAiICwgbWlkOiIgPDwgZ2V0TUlEKCk8PCAiID4iOworCisJaWYoIGhhc1J1bnRpbWVSSUQoKSApCisJeworCQlvc3MgPDwgIiAiIDw8IGdldFJ1bnRpbWVSSUQoKS5zdHIoKTsKKwl9CisKKwlpZiggZ2V0QnVmZmVySW5zdGFuY2UoKS5ub25lbXB0eSgpICkKKwl7CisJCW9zcyA8PCAiIFt8ICI7CisJCUxpc3RPZkluc3RhbmNlT2ZCdWZmZXI6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZ2V0QnVmZmVySW5zdGFuY2UoKS5iZWdpbigpOworCQlmb3IoIDsgaXQgIT0gZ2V0QnVmZmVySW5zdGFuY2UoKS5lbmQoKSA7ICsraXQgKQorCQl7CisJCQlvc3MgPDwgc3RyX2hlYWRlciggKml0ICkgPDwgIiAiOworCQl9CisJCW9zcyA8PCAifF0iOworCX0KKworCXJldHVybiggb3NzLnN0cigpICk7Cit9CisKK3ZvaWQgUm91dGluZ0RhdGFFbGVtZW50Ojp0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlvcyA8PCBUQUIgPDwgInJvdXRpbmc8ICIKKwkJCTw8IENvbVByb3RvY29sOjp0b19zdHJpbmcobVByb3RvY29sKQorCQkJPDwgIiAsIG1pZDoiIDw8IG1NSUQ8PCAiID4gIjsKKwlpZiggZ2V0TWFjaGluZSgpLT5pc25vdFRoaXMoKSApCisJeworCQlvcyA8PCAoIG1SdW50aW1lUklELnZhbGlkKCkgPyAgbVJ1bnRpbWVSSUQuc3RyVW5pcUlkKCkgOgorCQkJCWdldE1hY2hpbmUoKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSApIDw8ICItPiI7CisJfQorCW9zIDw8IGdldFBvcnQoKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiIHsiOworCUFWTV9ERUJVR19SRUZfQ09VTlRFUihvcyk7CisJb3MgPDwgRU9MOworCisvLwlpZiggaGFzUnVudGltZVJJRCgpICkKKy8vCXsKKy8vCQlvcyA8PCBUQUIyIDw8ICJyaWQjcnVudGltZSA9ICIgPDwgZ2V0UnVudGltZVJJRCgpLnN0cigpIDw8ICI7IiA8PCBFT0w7CisvLwl9CisKKwlpZiggbUNvbm5lY3QgIT0gTlVMTCApCisJeworCQlvcyA8PCBUQUIyIDw8ICJjb25uZWN0b3IgPSAiCisJCQkJPDwgbUNvbm5lY3QtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIjsiIDw8ICBFT0w7CisJfQorCisvLwlvcyA8PCBUQUIyIDw8ICJtYWNoaW5lID0gIiA8PCBnZXRNYWNoaW5lKCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIjsiIDw8ICBFT0w7CisvLwlvcyA8PCBUQUIyIDw8ICJwb3J0ID0gIiA8PCBnZXRQb3J0KCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIjsiIDw8ICBFT0w7CisKKwlpZiggbUJ1ZmZlckluc3RhbmNlLm5vbmVtcHR5KCkgKQorCXsKKwkJb3MgPDwgVEFCMiA8PCAiYnVmZmVyID0gW3wiOworCQlpZiggbUJ1ZmZlckluc3RhbmNlLnNpbmdsZXRvbigpICkKKwkJeworCQkJb3MgPDwgIiAiIDw8IHN0cl9oZWFkZXIoIG1CdWZmZXJJbnN0YW5jZS5maXJzdCgpICkgPDwgIiAiOworCQl9CisJCWVsc2UKKwkJeworCQkJTGlzdE9mSW5zdGFuY2VPZkJ1ZmZlcjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtQnVmZmVySW5zdGFuY2UuYmVnaW4oKTsKKwkJCUxpc3RPZkluc3RhbmNlT2ZCdWZmZXI6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gbUJ1ZmZlckluc3RhbmNlLmVuZCgpOworCQkJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApCisJCQl7CisJCQkJb3MgPDwgRU9MX1RBQjMgPDwgc3RyX2hlYWRlciggKml0ICk7CisJCQl9CisJCQlvcyA8PCBFT0xfVEFCMjsKKwkJfQorCQlvcyA8PCAifF07IiA8PCBFT0w7CisJfQorCisJb3MgPDwgVEFCIDw8ICJ9IiA8PCBFT0xfRkxVU0g7Cit9CisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4ZWN1dGFibGUvUm91dGluZ0RhdGEuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leGVjdXRhYmxlL1JvdXRpbmdEYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU5MjllOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leGVjdXRhYmxlL1JvdXRpbmdEYXRhLmgKQEAgLTAsMCArMSw0MDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUk9VVElOR0RBVEFfSF8KKyNkZWZpbmUgUk9VVElOR0RBVEFfSF8KKworI2luY2x1ZGUgPGJhc2UvU21hcnRQb2ludGVyLmg+CisjaW5jbHVkZSA8Y29tbW9uL0VsZW1lbnQuaD4KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vUGFpci5oPgorI2luY2x1ZGUgPGNvbGxlY3Rpb24vVmVjdG9yLmg+CisKKyNpbmNsdWRlIDxmbWwvbGliL0lDb21Qb2ludC5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZkJ1ZmZlci5oPgorCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0NvbVByb3RvY29sLmg+CisKKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lSUQuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworY2xhc3MgSW5zdGFuY2VPZkNvbm5lY3Q7CitjbGFzcyBJbnN0YW5jZU9mTWFjaGluZTsKK2NsYXNzIEluc3RhbmNlT2ZQb3J0OworCitjbGFzcyBSb3V0aW5nRGF0YTsKKworCitjbGFzcyBSb3V0aW5nRGF0YUVsZW1lbnQgOgorCQlwdWJsaWMgRWxlbWVudCAsCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggUm91dGluZ0RhdGFFbGVtZW50ICkKK3sKKworCWZyaWVuZCBjbGFzcyBSb3V0aW5nRGF0YTsKKworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBSb3V0aW5nRGF0YUVsZW1lbnQgKQorCitwdWJsaWM6CisJdHlwZWRlZiBQYWlyIDwgSW5zdGFuY2VPZk1hY2hpbmUgKiAsIEluc3RhbmNlT2ZQb3J0ICogPiAgUGFpck1hY2hpbmVQb3J0OworCisKK3Byb3RlY3RlZDoKKwkvKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwkvLyBUaGUgTWVzc2FnZSBJZGVudGlmaWVyCisJYXZtX3NpemVfdCBtTUlEOworCisJLy8gZ2xvYmFsIHByb3RvY29sCisJQ29tUHJvdG9jb2w6OlBST1RPQ09MX0tJTkQgbVByb3RvY29sOworCisJLy8gVGhlIGNvbm5lY3RvciBpbnN0YW5jZQorCUluc3RhbmNlT2ZDb25uZWN0ICogbUNvbm5lY3Q7CisKKwkvLyBUaGUgY29uY2VybmVkIE1BQ0hJTkUgYW5kIHRoZSBQT1JUCisJUGFpck1hY2hpbmVQb3J0IG1NYWNoaW5lUG9ydDsKKworCS8vIGxpc3Qgb2YgbG9jYWwgcHJvdG9jb2wgYW5kIGJ1ZmZlcgorCUxpc3RPZkluc3RhbmNlT2ZCdWZmZXIgbUJ1ZmZlckluc3RhbmNlOworCisJLy8gVGhlIHJ1bnRpbWUgbWFjaGluZSBSSUQgZm9yIFJJRCBhY2Nlc3Mgb3B0aW1pemF0aW9uCisJUnVudGltZUlEIG1SdW50aW1lUklEOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlSb3V0aW5nRGF0YUVsZW1lbnQoYXZtX3NpemVfdCBtaWQsIEluc3RhbmNlT2ZNYWNoaW5lICogYU1hY2hpbmUsCisJCQlJbnN0YW5jZU9mUG9ydCAqIGFQb3J0LCBDb21Qcm90b2NvbDo6UFJPVE9DT0xfS0lORCBhUHJvdG9jb2wpCisJOiBFbGVtZW50KCBDTEFTU19LSU5EX1QoIFJvdXRpbmdEYXRhICkgKSwKKwltTUlEKCBtaWQgKSwKKwltUHJvdG9jb2woIGFQcm90b2NvbCApLAorCW1Db25uZWN0KCBOVUxMICksCisJbU1hY2hpbmVQb3J0KGFNYWNoaW5lLCBhUG9ydCksCisJbUJ1ZmZlckluc3RhbmNlKCApLAorCW1SdW50aW1lUklEKCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlSb3V0aW5nRGF0YUVsZW1lbnQoSW5zdGFuY2VPZkNvbm5lY3QgKiBhQ29ubmVjdG9yLAorCQkJSW5zdGFuY2VPZk1hY2hpbmUgKiBhTWFjaGluZSwgSW5zdGFuY2VPZlBvcnQgKiBhUG9ydCk7CisKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCWV4cGxpY2l0IFJvdXRpbmdEYXRhRWxlbWVudChjb25zdCBSb3V0aW5nRGF0YUVsZW1lbnQgJiBhbkVsZW1lbnQpCisJOiBFbGVtZW50KCBhbkVsZW1lbnQgKSwKKwltTUlEKCBhbkVsZW1lbnQubU1JRCApLAorCW1Qcm90b2NvbCggYW5FbGVtZW50Lm1Qcm90b2NvbCApLAorCW1Db25uZWN0KCBhbkVsZW1lbnQubUNvbm5lY3QgKSwKKwltTWFjaGluZVBvcnQoIGFuRWxlbWVudC5tTWFjaGluZVBvcnQgKSwKKwltQnVmZmVySW5zdGFuY2UoIGFuRWxlbWVudC5tQnVmZmVySW5zdGFuY2UgKSwKKwltUnVudGltZVJJRCggYW5FbGVtZW50Lm1SdW50aW1lUklEICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgflJvdXRpbmdEYXRhRWxlbWVudCgpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBtTWFjaGluZVBvcnQKKwkgKi8KKwlpbmxpbmUgSW5zdGFuY2VPZk1hY2hpbmUgKiBnZXRNYWNoaW5lKCkgY29uc3QKKwl7CisJCXJldHVybiggbU1hY2hpbmVQb3J0LmZpcnN0KCkgKTsKKwl9CisKKwlpbmxpbmUgSW5zdGFuY2VPZlBvcnQgKiBnZXRQb3J0KCkgY29uc3QKKwl7CisJCXJldHVybiggbU1hY2hpbmVQb3J0LnNlY29uZCgpICk7CisJfQorCisJLyoqCisJICogU2VyaWFsaXphdGlvbgorCSAqLworCXZpcnR1YWwgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKK307CisKKworY2xhc3MgUm91dGluZ0RhdGEgOgorCQlwdWJsaWMgU21hcnRQb2ludGVyPCBSb3V0aW5nRGF0YUVsZW1lbnQgLCBEZXN0cm95RWxlbWVudFBvbGljeSA+LAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIFJvdXRpbmdEYXRhICkKK3sKKworcHJpdmF0ZToKKwkvKioKKwkgKiBUWVBFREVGCisJICovCisJdHlwZWRlZiBTbWFydFBvaW50ZXI8IFJvdXRpbmdEYXRhRWxlbWVudCAsCisJCQkJCQlEZXN0cm95RWxlbWVudFBvbGljeSA+ICBiYXNlX3RoaXNfdHlwZTsKKworCXR5cGVkZWYgUGFpciA8IEluc3RhbmNlT2ZNYWNoaW5lICogLCBJbnN0YW5jZU9mUG9ydCAqID4gIFBhaXJNYWNoaW5lUG9ydDsKKworCitwdWJsaWM6CisJLyoKKwkgKiBTVEFUSUMgQVRUUklCVVRFUworCSAqLworCXN0YXRpYyBSb3V0aW5nRGF0YSBfTlVMTF87CisKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCVJvdXRpbmdEYXRhKCkKKwk6IGJhc2VfdGhpc190eXBlKCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlSb3V0aW5nRGF0YShhdm1fc2l6ZV90IG1pZCwgSW5zdGFuY2VPZk1hY2hpbmUgKiBhTWFjaGluZSwKKwkJCUluc3RhbmNlT2ZQb3J0ICogYVBvcnQsIENvbVByb3RvY29sOjpQUk9UT0NPTF9LSU5EIGFQcm90b2NvbCkKKwk6IGJhc2VfdGhpc190eXBlKCBuZXcgUm91dGluZ0RhdGFFbGVtZW50KG1pZCwgYU1hY2hpbmUsIGFQb3J0LCBhUHJvdG9jb2wpICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCVJvdXRpbmdEYXRhKEluc3RhbmNlT2ZDb25uZWN0ICogYUNvbm5lY3RvciwKKwkJCUluc3RhbmNlT2ZNYWNoaW5lICogYU1hY2hpbmUsIEluc3RhbmNlT2ZQb3J0ICogYVBvcnQpCisJOiBiYXNlX3RoaXNfdHlwZSggbmV3IFJvdXRpbmdEYXRhRWxlbWVudChhQ29ubmVjdG9yLCBhTWFjaGluZSwgYVBvcnQpICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJUm91dGluZ0RhdGEoY29uc3QgUm91dGluZ0RhdGEgJiBhbkVsZW1lbnQpCisJOiBiYXNlX3RoaXNfdHlwZSggYW5FbGVtZW50ICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgflJvdXRpbmdEYXRhKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbU1JRAorCSAqLworCWlubGluZSBhdm1fc2l6ZV90IGdldE1JRCgpIGNvbnN0CisJeworCQlyZXR1cm4oIGJhc2VfdGhpc190eXBlOjptUFRSLT5tTUlEICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0TUlEKGF2bV9zaXplX3QgbWlkKSBjb25zdAorCXsKKwkJYmFzZV90aGlzX3R5cGU6Om1QVFItPm1NSUQgPSBtaWQ7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtUHJvdG9jb2wKKwkgKi8KKwlpbmxpbmUgQ29tUHJvdG9jb2w6OlBST1RPQ09MX0tJTkQgZ2V0UHJvdG9jb2woKSBjb25zdAorCXsKKwkJcmV0dXJuKCBiYXNlX3RoaXNfdHlwZTo6bVBUUi0+bVByb3RvY29sICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNQcm90b2NvbEVOVigpIGNvbnN0CisJeworCQlyZXR1cm4oIGJhc2VfdGhpc190eXBlOjptUFRSLT5tUHJvdG9jb2wKKwkJCQk9PSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfRU5WSVJPTk1FTlRfS0lORCApOworCX0KKworCWlubGluZSBib29sIGlzbm90UHJvdG9jb2xFTlYoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBiYXNlX3RoaXNfdHlwZTo6bVBUUi0+bVByb3RvY29sCisJCQkJIT0gQ29tUHJvdG9jb2w6OlBST1RPQ09MX0VOVklST05NRU5UX0tJTkQgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc1Byb3RvY29sQlVGRkVSKCkgY29uc3QKKwl7CisJCXJldHVybiggYmFzZV90aGlzX3R5cGU6Om1QVFItPm1Qcm90b2NvbAorCQkJCT09IENvbVByb3RvY29sOjpQUk9UT0NPTF9CVUZGRVJfS0lORCApOworCX0KKworCWlubGluZSBib29sIGlzUHJvdG9jb2xSRFYoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBiYXNlX3RoaXNfdHlwZTo6bVBUUi0+bVByb3RvY29sCisJCQkJPT0gQ29tUHJvdG9jb2w6OlBST1RPQ09MX1JEVl9LSU5EICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNQcm90b2NvbE1VTFRJX1JEVigpIGNvbnN0CisJeworCQlyZXR1cm4oIGJhc2VfdGhpc190eXBlOjptUFRSLT5tUHJvdG9jb2wKKwkJCQk9PSBDb21Qcm90b2NvbDo6UFJPVE9DT0xfTVVMVElSRFZfS0lORCApOworCX0KKworCWlubGluZSBib29sIGlzUHJvdG9jb2xBTllDQVNUKCkgY29uc3QKKwl7CisJCXJldHVybiggYmFzZV90aGlzX3R5cGU6Om1QVFItPm1Qcm90b2NvbAorCQkJCT09IENvbVByb3RvY29sOjpQUk9UT0NPTF9BTllDQVNUX0tJTkQgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRQcm90b2NvbChDb21Qcm90b2NvbDo6UFJPVE9DT0xfS0lORCBhUHJvdG9jb2wpIGNvbnN0CisJeworCQliYXNlX3RoaXNfdHlwZTo6bVBUUi0+bVByb3RvY29sID0gYVByb3RvY29sOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUNvbm5lY3QKKwkgKi8KKwlpbmxpbmUgSW5zdGFuY2VPZkNvbm5lY3QgKiBnZXRDb25uZWN0KCkgY29uc3QKKwl7CisJCXJldHVybiggYmFzZV90aGlzX3R5cGU6Om1QVFItPm1Db25uZWN0ICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzQ29ubmVjdCgpIGNvbnN0CisJeworCQlyZXR1cm4oIGJhc2VfdGhpc190eXBlOjptUFRSLT5tQ29ubmVjdCAhPSBOVUxMICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0Q29ubmVjdChJbnN0YW5jZU9mQ29ubmVjdCAqIGFuQ29ubmVjdCkgY29uc3QKKwl7CisJCWJhc2VfdGhpc190eXBlOjptUFRSLT5tQ29ubmVjdCA9IGFuQ29ubmVjdDsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIG1NYWNoaW5lUG9ydAorCSAqLworCWlubGluZSBQYWlyTWFjaGluZVBvcnQgJiBnZXRNYWNoaW5lUG9ydCgpIGNvbnN0CisJeworCQlyZXR1cm4oIGJhc2VfdGhpc190eXBlOjptUFRSLT5tTWFjaGluZVBvcnQgKTsKKwl9CisKKwlpbmxpbmUgSW5zdGFuY2VPZk1hY2hpbmUgKiBnZXRNYWNoaW5lKCkgY29uc3QKKwl7CisJCXJldHVybiggYmFzZV90aGlzX3R5cGU6Om1QVFItPm1NYWNoaW5lUG9ydC5maXJzdCgpICk7CisJfQorCisJaW5saW5lIEluc3RhbmNlT2ZQb3J0ICogZ2V0UG9ydCgpIGNvbnN0CisJeworCQlyZXR1cm4oIGJhc2VfdGhpc190eXBlOjptUFRSLT5tTWFjaGluZVBvcnQuc2Vjb25kKCkgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIHRhYmxlT2ZCdWZmZXJPZmZzZXQKKwkgKi8KKwlpbmxpbmUgTGlzdE9mSW5zdGFuY2VPZkJ1ZmZlciAmIGdldEJ1ZmZlckluc3RhbmNlKCkKKwl7CisJCXJldHVybiggYmFzZV90aGlzX3R5cGU6Om1QVFItPm1CdWZmZXJJbnN0YW5jZSApOworCX0KKworCWlubGluZSBjb25zdCBMaXN0T2ZJbnN0YW5jZU9mQnVmZmVyICYgZ2V0QnVmZmVySW5zdGFuY2UoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBiYXNlX3RoaXNfdHlwZTo6bVBUUi0+bUJ1ZmZlckluc3RhbmNlICk7CisJfQorCisJaW5saW5lIHZvaWQgYXBwZW5kQnVmZmVyKEluc3RhbmNlT2ZCdWZmZXIgKiBhQnVmZmVyKQorCXsKKwkJZ2V0QnVmZmVySW5zdGFuY2UoKS5wdXNoX2JhY2soYUJ1ZmZlcik7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtUnVudGltZVJJRAorCSAqLworCWlubGluZSBjb25zdCBSdW50aW1lSUQgJiBnZXRSdW50aW1lUklEKCkgY29uc3QKKwl7CisJCXJldHVybiggYmFzZV90aGlzX3R5cGU6Om1QVFItPm1SdW50aW1lUklEICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzUnVudGltZVJJRCgpIGNvbnN0CisJeworCQlyZXR1cm4oIGJhc2VfdGhpc190eXBlOjptUFRSLT5tUnVudGltZVJJRC52YWxpZCgpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0UnVudGltZVJJRChjb25zdCBSdW50aW1lSUQgJiBhUklEKSBjb25zdAorCXsKKwkJYmFzZV90aGlzX3R5cGU6Om1QVFItPm1SdW50aW1lUklEID0gYVJJRDsKKwl9CisKKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwl2aXJ0dWFsIHN0ZDo6c3RyaW5nIHN0cigpIGNvbnN0OworCisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgdG9TdHJpbmcoCisJCQljb25zdCBBdm1JbmRlbnQgJiBpbmRlbnQgPSBBVk1fVEFCX0lOREVOVCkgY29uc3QKKwl7CisJCWlmKCBiYXNlX3RoaXNfdHlwZTo6bVBUUiAhPSBOVUxMICkKKwkJeworCQkJU3RyaW5nT3V0U3RyZWFtIG9zcyhpbmRlbnQpOworCisJCQliYXNlX3RoaXNfdHlwZTo6bVBUUi0+dG9TdHJlYW0oIG9zcyApOworCisJCQlyZXR1cm4oIG9zcy5zdHIoKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuKCBpbmRlbnQuVEFCUyArICJSb3V0aW5nRGF0YTxudWxsPiIgKyBpbmRlbnQuRU9MKTsKKwkJfQorCX0KKworCWlubGluZSB2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJaWYoIGJhc2VfdGhpc190eXBlOjptUFRSICE9IE5VTEwgKQorCQl7CisJCQliYXNlX3RoaXNfdHlwZTo6bVBUUi0+dG9TdHJlYW0ob3MpOworCQl9CisJCWVsc2UKKwkJeworCQkJb3MgPDwgIlJvdXRpbmdEYXRhPG51bGw+IiA8PCBzdGQ6OmZsdXNoOworCQl9CisJfQorCit9OworCisKKy8qKgorICogVFlQRSBERUZJTklUSU9OCisgKiBUQUJMRSBvZiBST1VUSU5HIERBVEEKKyAqLwordHlwZWRlZiAgVmVjdG9yPCBSb3V0aW5nRGF0YSA+ICBUYWJsZU9mUm91dGluZ0RhdGE7CisKKworfQorCisjZW5kaWYgLypST1VUSU5HREFUQV9IXyovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhwcmVzc2lvbi9Bdm1Db2RlLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL0F2bUNvZGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMDZkZWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhwcmVzc2lvbi9Bdm1Db2RlLmNwcApAQCAtMCwwICsxLDE0MjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJBdm1Db2RlLmgiCisKKyNpbmNsdWRlIDxmbWwvY29tbW9uL0JlaGF2aW9yYWxFbGVtZW50Lmg+CisjaW5jbHVkZSA8Zm1sL2NvbW1vbi9PYmplY3RFbGVtZW50Lmg+CisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9Bdm1Qcm9ncmFtLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvQmFzZUF2bVByb2dyYW0uaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9CYXNlQ29tcGlsZWRGb3JtLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvQmFzZUluc3RhbmNlRm9ybS5oPgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQnVpbHRpbkFycmF5Lmg+CisjaW5jbHVkZSA8Zm1sL2J1aWx0aW4vQnVpbHRpbkZvcm0uaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29tcGFyZXIuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29tcGFyZXIuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9TdGF0ZW1lbnRUeXBlQ2hlY2tlci5oPgorCisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yTWFuYWdlci5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvUnVudGltZUlELmg+CisKKyNpbmNsdWRlIDxmbWwvdHlwZS9CYXNlVHlwZVNwZWNpZmllci5oPgorCisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1VuaUZvcm1JZGVudGlmaWVyLmg+CisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1dPYmplY3QuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoqCisgKiBERUZBVUxUIE5VTEwKKyAqLworQkZDb2RlIEJGQ29kZTo6UkVGX05VTEw7CisKKworLyoqCisgKiBDT01QQVJJU09OCisgKiBPUEVSQVRPUgorICovCitpbnQgQXZtQ29kZTo6Y29tcGFyZShjb25zdCBBdm1Db2RlICYgb3RoZXIpIGNvbnN0Cit7CisJaWYoIHRoaXMgPT0gJm90aGVyICkKKwl7CisJCXJldHVybiggMCApOworCX0KKwllbHNlIGlmKCBzYW1lT3BlcmF0b3IoIG90aGVyICkgKQorCXsKKwkJaW50ICBjbXBSZXN1bHQgPSAwOworCisJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYmVnaW4oKTsKKwkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBlbmQoKTsKKworCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdE90aGVyID0gb3RoZXIuYmVnaW4oKTsKKwkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kT3RoZXIgPSBvdGhlci5lbmQoKTsKKworCQlmb3IoIDsgKGl0ICE9IGVuZEl0KSAmJiAoaXRPdGhlciAhPSBlbmRPdGhlcikgOyArK2l0ICwgKytpdE90aGVyICkKKwkJeworCQkJY21wUmVzdWx0ID0gKCppdCkuY29tcGFyZSggKml0T3RoZXIgKTsKKwkJCWlmKCBjbXBSZXN1bHQgIT0gMCAgKQorCQkJeworCQkJCXJldHVybiggY21wUmVzdWx0ICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4oIChzaXplKCkgPT0gb3RoZXIuc2l6ZSgpKSA/IDAgOgorCQkJCSgoc2l6ZSgpIDwgb3RoZXIuc2l6ZSgpKSA/IC0xIDogMSkgKTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuKCAoZ2V0QXZtT3BDb2RlKCkgPCBvdGhlci5nZXRBdm1PcENvZGUoKSkgPyAtMSA6IDEgKTsKKwl9Cit9CisKK2Jvb2wgQXZtQ29kZTo6aXNFUShjb25zdCBBdm1Db2RlICYgb3RoZXIpIGNvbnN0Cit7CisJaWYoIHRoaXMgPT0gJm90aGVyICkKKwl7CisJCXJldHVybiggdHJ1ZSApOworCX0KKwllbHNlIGlmKCBzYW1lT3BlcmF0b3IoIG90aGVyICkgJiYgKHNpemUoKSA9PSBvdGhlci5zaXplKCkpICkKKwl7CisJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYmVnaW4oKTsKKwkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBlbmQoKTsKKwkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXRPdGhlciA9IG90aGVyLmJlZ2luKCk7CisJCWZvciggIDsgaXQgIT0gZW5kSXQgOyArK2l0ICwgKytpdE90aGVyICkKKwkJeworCQkJaWYoIG5vdCAoKml0KS5pc0VRKCAqaXRPdGhlciApICkKKwkJCXsKKwkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQl9CisJCX0KKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiggZmFsc2UgKTsKKwl9Cit9CisKKworLyoqCisgKiBBdm1Db2RlOjp0b1N0cmVhbQorICogU2VyaWFsaXphdGlvbgorICovCitPdXRTdHJlYW0gJiBBdm1Db2RlOjp0b0RlYnVnKE91dFN0cmVhbSAmIG91dCkgY29uc3QKK3sKK0FWTV9JRl9ERUJVR19OT1RfRkxBR19BTkQoIEJZVEVDT0RFICwgaGFzSW5zdHJ1Y3Rpb24oKSApCisKKwlBVk1fREVCVUdfRU5BQkxFX0ZMQUcoIEJZVEVDT0RFICkKKworCXRvU3RyZWFtV2l0aEJ5dGVjb2RlKCBvdXQgPDwgVEFCIDw8ICIkIiApIDw8IEVPTF9GTFVTSDsKKworCUFWTV9ERUJVR19ESVNBQkxFX0ZMQUcoIEJZVEVDT0RFICkKKworQVZNX0VMU0UKKworCXRvU3RyZWFtKG91dCk7CisKK0FWTV9FTkRJRl9ERUJVR19OT1RfRkxBR19BTkQoIEJZVEVDT0RFICkKKworCXJldHVybiggb3V0ICk7Cit9CisKKwordm9pZCBBdm1Db2RlOjp0b1N0cmVhbVByZWZpeChPdXRTdHJlYW0gJiBvdXQsIGNvbnN0IEJGICYgYXJnKQoreworCWlmKCBhcmcuaW52YWxpZCgpICkKKwl7CisJCW91dCA8PCBUQUIgPDwgIm51bGw8YXZtY29kZTo6YXJnPiIgPDwgRU9MOworCX0KKworCWVsc2UgaWYoIGFyZy5pczwgQnVpbHRpbkZvcm0gPigpICkKKwl7CisJCW91dCA8PCBUQUIgPDwgYXJnLnRvX3B0cjwgQnVpbHRpbkZvcm0gPigpLT5zdHIoKSA8PCBFT0w7CisJfQorCisJZWxzZSBpZiggYXJnLmlzPCBPcGVyYXRvciA+KCkgKQorCXsKKwkJb3V0IDw8IFRBQiA8PCBhcmcudG9fcHRyPCBPcGVyYXRvciA+KCktPnN0YW5kYXJkU3ltYm9sKCk7CisJCWFyZy5BVk1fREVCVUdfUkVGX0NPVU5URVIob3V0KTsKKwkJb3V0IDw8IEVPTDsKKwl9CisJZWxzZSBpZiggYXJnLmlzPCBSb3V0aW5lID4oKSApCisJeworCQlhcmcudG9fcHRyPCBSb3V0aW5lID4oKS0+dG9TdHJlYW1JbnZva2Uob3V0KTsKKwl9CisKKwllbHNlIGlmKCBhcmcuaXM8IFByb3BlcnR5RWxlbWVudCA+KCkgKQorCXsKKwkJb3V0IDw8IFRBQiA8PCAiJiIKKwkJCTw8IGFyZy50b19wdHI8IFByb3BlcnR5RWxlbWVudCA+KCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7CisJCWFyZy5BVk1fREVCVUdfUkVGX0NPVU5URVIob3V0KTsKKwkJb3V0IDw8IEVPTDsKKwl9CisJZWxzZSBpZiggYXJnLmlzPCBCYXNlSW5zdGFuY2VGb3JtID4oKSApCisJeworCQlvdXQgPDwgVEFCCisJCQk8PCBhcmcudG9fcHRyPCBCYXNlSW5zdGFuY2VGb3JtID4oKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsKKwkJYXJnLkFWTV9ERUJVR19SRUZfQ09VTlRFUihvdXQpOworCQlvdXQgPDwgRU9MOworCX0KKwllbHNlIGlmKCBhcmcuaXM8IEJlaGF2aW9yYWxFbGVtZW50ID4oKSApCisJeworCQlvdXQgPDwgVEFCIDw8ICImIgorCQkJPDwgYXJnLnRvX3B0cjwgQmVoYXZpb3JhbEVsZW1lbnQgPigpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOworCQlhcmcuQVZNX0RFQlVHX1JFRl9DT1VOVEVSKG91dCk7CisJCW91dCA8PCBFT0w7CisJfQorCisJZWxzZSBpZiggV09iamVjdE1hbmFnZXI6OmlzKCBhcmcgKSApCisJeworCQlvdXQgPDwgVEFCIDw8ICImIgorCQkJPDwgV09iamVjdE1hbmFnZXI6OmZyb20oIGFyZyApLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOworCQlhcmcuQVZNX0RFQlVHX1JFRl9DT1VOVEVSKG91dCk7CisJCW91dCA8PCBFT0w7CisJfQorCisJZWxzZSBpZiggYXJnLmlzPCBSdW50aW1lSUQgPigpICkKKwl7CisJCW91dCA8PCBUQUIgPDwgYXJnLmJmUklEKCkuc3RyKCkgPDwgRU9MOworCX0KKworCWVsc2UgaWYoIGFyZy5pc19leGFjdGx5PCBBdm1Qcm9ncmFtID4oKSApCisJeworCQlBdm1Qcm9ncmFtICogYVByb2cgPSBhcmcudG9fcHRyPCBBdm1Qcm9ncmFtID4oKTsKKwkJaWYoIGFQcm9nLT5pc0Fub255bSgpICkKKwkJeworCQkJYVByb2ctPnRvU3RyZWFtKG91dCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlvdXQgPDwgVEFCIDw8IGFQcm9nLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOworCQkJYXJnLkFWTV9ERUJVR19SRUZfQ09VTlRFUihvdXQpOworCQkJb3V0IDw8IEVPTDsKKwkJfQorCX0KKwllbHNlIGlmKCBhcmcuaXM8IEJhc2VBdm1Qcm9ncmFtID4oKSApCisJeworCQlvdXQgPDwgVEFCCisJCQk8PCBhcmcudG9fcHRyPCBCYXNlQXZtUHJvZ3JhbSA+KCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7CisJCWFyZy5BVk1fREVCVUdfUkVGX0NPVU5URVIob3V0KTsKKwkJb3V0IDw8IEVPTDsKKwl9CisKKwllbHNlIGlmKCBhcmcuaXM8IEJhc2VUeXBlU3BlY2lmaWVyID4oKSApCisJeworCQlvdXQgPDwgVEFCCisJCQk8PCBhcmcudG9fcHRyPCBCYXNlVHlwZVNwZWNpZmllciA+KCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7CisJCWFyZy5BVk1fREVCVUdfUkVGX0NPVU5URVIob3V0KTsKKwkJb3V0IDw8IEVPTDsKKwl9CisKKwllbHNlIGlmKCBhcmcuaXM8IE9iamVjdEVsZW1lbnQgPigpICkKKwl7CisJCW91dCA8PCBUQUIgPDwgIiYiCisJCQk8PCBhcmcudG9fcHRyPCBPYmplY3RFbGVtZW50ID4oKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsKKwkJYXJnLkFWTV9ERUJVR19SRUZfQ09VTlRFUihvdXQpOworCQlvdXQgPDwgRU9MOworCX0KKworCWVsc2UgaWYoIGFyZy5pczwgQnVpbHRpbkFycmF5ID4oKSApCisJeworCQlhcmcudG9fcHRyPCBCdWlsdGluQXJyYXkgPigpLT50b1N0cmVhbShvdXQpOworCX0KKworCWVsc2UgaWYgKCBhcmcuaXM8IEF2bUNvZGUgPigpICkKKwl7CisJCWFyZy50b19wdHI8IEF2bUNvZGUgPigpLT50b1N0cmVhbVByZWZpeChvdXQpOworCX0KKworCWVsc2UKKwl7CisJCW91dCA8PCBhcmc7CisJfQorCisJb3V0IDw8IHN0ZDo6Zmx1c2g7Cit9CisKKworT3V0U3RyZWFtICYgQXZtQ29kZTo6dG9TdHJlYW1XaXRoQnl0ZWNvZGUoT3V0U3RyZWFtICYgb3V0KSBjb25zdAoreworCW91dCA8PCAieyAiIDw8IHN0ck9wZXJhdG9yKCkgPDwgIiAiCisJCTw8IG1JbnN0cnVjdGlvbi0+Z2V0TWFpbkJ5dGVjb2RlKCkuc3RyQ29kZSgpCisJCTw8IEVPTF9JTkNSX0lOREVOVDsKKworCWlmKCBub25lbXB0eSgpICkKKwl7CisJCWNvbnN0X2l0ZXJhdG9yIGl0ID0gYmVnaW4oKTsKKwkJY29uc3RfaXRlcmF0b3IgaXRFbmQgPSBlbmQoKTsKKwkJZm9yKCBhdm1fc2l6ZV90IGFyZ09mZnNldCA9IDAgOyBpdCAhPSBpdEVuZCA7ICsraXQgLCArK2FyZ09mZnNldCApCisJCXsKKwkJCW91dCA8PCBUQUIgPDwgIiQoICIgPDwgbUluc3RydWN0aW9uLT5hdChhcmdPZmZzZXQpLnN0ckNvZGUoKTsKKworCQkJaWYoICgqaXQpLmlzPCBBdm1Db2RlID4oKSApCisJCQl7CisJCQkJb3V0IDw8ICIgIjsKKworCQkJCWlmKCAoKml0KS50b19wdHI8IEF2bUNvZGUgPigpLT5oYXNJbnN0cnVjdGlvbigpICkKKwkJCQl7CisJCQkJCSgqaXQpLnRvX3B0cjwgQXZtQ29kZSA+KCktPnRvU3RyZWFtV2l0aEJ5dGVjb2RlKG91dCk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCSgqaXQpLnRvX3B0cjwgQXZtQ29kZSA+KCktPnRvU3RyZWFtUHJlZml4KAorCQkJCQkJCW91dCA8PCBJR05PUkVfRklSU1RfVEFCLCBmYWxzZSApOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlTY29wZU5ld0luZGVudCBhc25pKG91dCwgQVZNX1NUUl9JTkRFTlQpOworCisJCQkJdG9TdHJlYW1QcmVmaXgoIG91dCAsICgqaXQpICk7CisJCQl9CisJCQlvdXQgPDwgIiApIiA8PCBFT0w7CisJCX0KKwl9CisKKwlvdXQgPDwgREVDUl9JTkRFTlRfVEFCIDw8ICJ9IiA8PCBzdGQ6OmZsdXNoOworCisJcmV0dXJuKCBvdXQgKTsKK30KKworCitPdXRTdHJlYW0gJiBBdm1Db2RlOjp0b1N0cmVhbVJvdXRpbmUoT3V0U3RyZWFtICYgb3V0KSBjb25zdAoreworQVZNX0lGX0RFQlVHX0ZMQUcoIEJZVEVDT0RFICkKKworCWlmKCBoYXNJbnN0cnVjdGlvbigpICkKKwl7CisJCXRvU3RyZWFtV2l0aEJ5dGVjb2RlKCBvdXQgPDwgIiQiICkgPDwgRU9MX0ZMVVNIOworCX0KKwllbHNlIGlmKCBPcGVyYXRvck1hbmFnZXI6OmlzU2NoZWR1bGUobU9wZXJhdG9yKSApCisJeworCQlvdXQgPDwgIiAiIDw8IHN0ck9wZXJhdG9yKCkgPDwgRU9MOworCisJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYmVnaW4oKTsKKwkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBlbmQoKTsKKwkJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJCXsKKwkJCXRvU3RyZWFtUHJlZml4KG91dCwgKCppdCkpOworCQl9CisJfQorCWVsc2UKKwl7CisJCXRvU3RyZWFtUHJlZml4KCBvdXQgPDwgRU9MICk7CisJfQorCisJcmV0dXJuKCBvdXQgKTsKKworQVZNX0VORElGX0RFQlVHX0ZMQUcoIEJZVEVDT0RFICkKKworCWlmKCBPcGVyYXRvck1hbmFnZXI6OmlzU2NoZWR1bGUobU9wZXJhdG9yKSApCisJeworCQlvdXQgPDwgIiAiIDw8IHN0ck9wZXJhdG9yKCkgPDwgRU9MOworCisJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYmVnaW4oKTsKKwkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBlbmQoKTsKKwkJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJCXsKKwkJCXByZXR0eVByaW50ZXIob3V0LCAoKml0KSk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJcHJldHR5UHJpbnRlciggb3V0IDw8IEVPTCApOworCX0KKworCXJldHVybiggb3V0ICk7Cit9CisKKwordm9pZCBBdm1Db2RlOjp0b1N0cmVhbVByZWZpeChPdXRTdHJlYW0gJiBvdXQsIGJvb2wgcHJpbnRFT0wpIGNvbnN0Cit7CitBVk1fSUZfREVCVUdfRkxBR19BTkQoIEJZVEVDT0RFICwgaGFzSW5zdHJ1Y3Rpb24oKSApCisKKwl0b1N0cmVhbVdpdGhCeXRlY29kZSggb3V0IDw8IFRBQiA8PCAiJCIgKSA8PCBFT0xfRkxVU0g7CisKK0FWTV9FTFNFX0lGKCBoYXNPcGVyYXRvcigpICkKKworCXN0ZDo6c3RyaW5nIHN0ck9wZXJhdG9yU3RkID0gc3RyT3BlcmF0b3IoKTsKKworCW91dCA8PCBUQUIgPDwgIiR7IiA8PCBzdHJPcGVyYXRvclN0ZDsKKworCWlmKCBPcGVyYXRvck1hbmFnZXI6OmlzU2NoZWR1bGUoIG1PcGVyYXRvciApIHx8CisJCU9wZXJhdG9yTWFuYWdlcjo6aXNDb25kaXRpb25uYWwoIG1PcGVyYXRvciApICkKKwl7CisJCW91dCA8PCBFT0xfSU5DUl9JTkRFTlQ7CisJCWZvciggY29uc3RfaXRlcmF0b3IgaXQgPSBiZWdpbigpIDsgaXQgIT0gZW5kKCkgOyArK2l0ICkKKwkJeworCQkJdG9TdHJlYW1QcmVmaXgob3V0LCAoKml0KSk7CisJCX0KKwkJb3V0IDw8IERFQ1JfSU5ERU5UX1RBQiA8PCAgIn0iIDw8IHN0ZDo6Zmx1c2g7CisJfQorCisJZWxzZSBpZiggT3BlcmF0b3JNYW5hZ2VyOjppc0FjdGl2aXR5KCBtT3BlcmF0b3IgKQorCQkJJiYgcG9wdWxhdGVkKCkKKwkJCSYmIHNlY29uZCgpLmlzPCBBdm1Db2RlID4oKQorCQkJJiYgU3RhdGVtZW50VHlwZUNoZWNrZXI6OmlzQXNzaWduKCBzZWNvbmQoKSApICkKKwl7CisJCWNvbnN0X2l0ZXJhdG9yIGl0ID0gYmVnaW4oKTsKKwkJdG9TdHJlYW1QcmVmaXgoIChvdXQgPDwgQVZNX1NUUl9JTkRFTlQpLCAoKml0KSApOworCQlvdXQgPDwgRU5EX0lOREVOVCA8PCBFT0xfSU5DUl9JTkRFTlQ7CisJCWZvciggKytpdCA7IGl0ICE9IGVuZCgpIDsgKytpdCApCisJCXsKKwkJCXRvU3RyZWFtUHJlZml4KG91dCwgKCppdCkpOworCQl9CisJCW91dCA8PCBERUNSX0lOREVOVF9UQUIgPDwgICJ9IiA8PCBzdGQ6OmZsdXNoOworCX0KKworCWVsc2UgLy9pZiggT3BlcmF0b3JNYW5hZ2VyOjppc1VmaU9yQ3RvciggbU9wZXJhdG9yICkgKQorCXsKKwkJb3V0IDw8IEFWTV9TVFJfSU5ERU5UOworCQlmb3IoIGNvbnN0X2l0ZXJhdG9yIGl0ID0gYmVnaW4oKSA7IGl0ICE9IGVuZCgpIDsgKytpdCApCisJCXsKKwkJCXRvU3RyZWFtUHJlZml4KG91dCwgKCppdCkpOworCQl9CisJCW91dCA8PCBFTkRfSU5ERU5UIDw8ICAiIH0iIDw8IHN0ZDo6Zmx1c2g7CisJfQorCisJaWYoIHByaW50RU9MICkKKwl7CisJCW91dCA8PCBFT0xfRkxVU0g7CisJfQorCisJcmV0dXJuOworCitBVk1fRUxTRV9JRiggbm9uZW1wdHkoKSApCisKKwlvdXQgPDwgVEFCIDw8ICJ7IiA8PCBFT0xfSU5DUl9JTkRFTlQ7CisJZm9yKCBjb25zdF9pdGVyYXRvciBpdCA9IGJlZ2luKCkgOyBpdCAhPSBlbmQoKSA7ICsraXQgKQorCXsKKwkJdG9TdHJlYW1QcmVmaXgob3V0LCAoKml0KSk7CisJfQorCW91dCA8PCBERUNSX0lOREVOVF9UQUIgPDwgIn0iIDw8IEVPTF9GTFVTSDsKKworQVZNX0VORElGX0RFQlVHX0ZMQUdfQU5EKCBCWVRFQ09ERSApCit9CisKKworCit2b2lkIEF2bUNvZGU6OnByZXR0eVByaW50ZXIoT3V0U3RyZWFtICYgb3V0LCBib29sIGlzU3RhdGVtZW50KSBjb25zdAoreworLy8Jc3dpdGNoKCBtT3BlcmF0b3ItPmdldEZpeE5vdGF0aW9uKCkgKQorLy8JeworLy8JCWNhc2UgTk9UQVRJT05fRlVOQ1RJT046CisvLwkJY2FzZSBOT1RBVElPTl9JTkZJWDoKKy8vCQljYXNlIE5PVEFUSU9OX1BSRUZJWDoKKy8vCQljYXNlIE5PVEFUSU9OX1NVRkZJWDoKKy8vCQlkZWZhdWx0OgorLy8JfQorCisJc3dpdGNoKCBtT3BlcmF0b3ItPmdldEF2bU9wQ29kZSgpICkKKwl7CisJCWNhc2UgQVZNX09QQ09ERV9OVUxMOgorCisJCS8vIEFWTSBOT1AgU1RBVEVNRU5UCisJCWNhc2UgQVZNX09QQ09ERV9OT1A6CisKKwkJY2FzZSBBVk1fT1BDT0RFX0ZBSUxFRDoKKwkJY2FzZSBBVk1fT1BDT0RFX1RIUk9XOgorCisJCS8vIEFWTSBNRVRBIFNUQVRFTUVOVAorCQljYXNlIEFWTV9PUENPREVfSU5GT1JNQUw6CisKKwkJY2FzZSBBVk1fT1BDT0RFX1RSQUNFOgorCisJCWNhc2UgQVZNX09QQ09ERV9ERUJVRzoKKworCQljYXNlIEFWTV9PUENPREVfQ09NTUVOVDoKKworCQljYXNlIEFWTV9PUENPREVfUVVPVEU6CisKKwkJY2FzZSBBVk1fT1BDT0RFX01FVEFfRVZBTDoKKwkJY2FzZSBBVk1fT1BDT0RFX01FVEFfUlVOOgorCQl7CisJCQlwcmV0dHlQcmludGVyQmFzaWNTdGF0ZW1lbnQoIG91dCAsIGlzU3RhdGVtZW50ICk7CisKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gQVZNIFVGSSBTVEFURU1FTlQKKwkJY2FzZSBBVk1fT1BDT0RFX1VGSToKKwkJeworCQkJcHJldHR5UHJpbnRlckRlZmF1bHQoIG91dCAsIGZhbHNlICk7CisKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gQVZNIEZPUk0gQ09OU1RSVUNUT1IgU1RBVEVNRU5UCisJCWNhc2UgQVZNX09QQ09ERV9DVE9SOgorCQl7CisJCQlvdXQgPDwgVEFCIDw8ICJjdG9yPCIgPDwgQVZNX1NUUl9JTkRFTlQ7CisKKwkJCXByZXR0eVByaW50ZXIoIG91dCAsIGZpcnN0KCkgLCBmYWxzZSApOworCisJCQlvdXQgPDwgIiA+KCI7CisKKwkJCXByZXR0eVByaW50ZXIoIG91dCAsIHNlY29uZCgpICwgZmFsc2UgKTsKKworCQkJb3V0IDw8ICIgKSIgPDwgRU5EX0lOREVOVF9FT0w7CisKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gQVZNIEZPUk0gUkVHRVggU1RBVEVNRU5UCisJCWNhc2UgQVZNX09QQ09ERV9SRUdFWDoKKwkJeworCQkJcHJldHR5UHJpbnRlckRlZmF1bHQoIG91dCAsIGZhbHNlICk7CisKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gQVZNIE1BQ0hJTkUgTUFOQUdJTkcKKwkJY2FzZSBBVk1fT1BDT0RFX0NPTlRFWFRfU1dJVENIRVI6CisJCXsKKwkJCW91dCA8PCBUQUIgPDwgImN0eDwiIDw8IEFWTV9TVFJfSU5ERU5UOworCisJCQlwcmV0dHlQcmludGVyKCBvdXQgLCBmaXJzdCgpICwgZmFsc2UgKTsKKworCQkJb3V0IDw8IFRBQiA8PCAiPiAiIDw8IEVORF9JTkRFTlQgPDwgSUdOT1JFX0ZJUlNUX1RBQjsKKworCQkJcHJldHR5UHJpbnRlciggb3V0ICwgc2Vjb25kKCkgLCBpc1N0YXRlbWVudCApOworCisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9JTklUOgorCQljYXNlIEFWTV9PUENPREVfRklOQUw6CisJCWNhc2UgQVZNX09QQ09ERV9ERVNUUk9ZOgorCisJCWNhc2UgQVZNX09QQ09ERV9TVEFSVDoKKwkJY2FzZSBBVk1fT1BDT0RFX1JFU1RBUlQ6CisJCWNhc2UgQVZNX09QQ09ERV9TVE9QOgorCisJCWNhc2UgQVZNX09QQ09ERV9XQUlUOgorCisJCWNhc2UgQVZNX09QQ09ERV9TVVNQRU5EOgorCQljYXNlIEFWTV9PUENPREVfUkVTVU1FOgorCisJCWNhc2UgQVZNX09QQ09ERV9JRU5BQkxFX0lOVk9LRToKKwkJY2FzZSBBVk1fT1BDT0RFX0VOQUJMRV9JTlZPS0U6CisJCWNhc2UgQVZNX09QQ09ERV9FTkFCTEVfU0VUOgorCisJCWNhc2UgQVZNX09QQ09ERV9JRElTQUJMRV9JTlZPS0U6CisJCWNhc2UgQVZNX09QQ09ERV9ESVNBQkxFX0lOVk9LRToKKwkJY2FzZSBBVk1fT1BDT0RFX0RJU0FCTEVfU0VUOgorCQljYXNlIEFWTV9PUENPREVfRElTQUJMRV9DSElMRDoKKwkJY2FzZSBBVk1fT1BDT0RFX0RJU0FCTEVfU0VMRjoKKwkJY2FzZSBBVk1fT1BDT0RFX0RJU0FCTEVfU0VMVkVTOgorCisJCWNhc2UgQVZNX09QQ09ERV9JQUJPUlRfSU5WT0tFOgorCQljYXNlIEFWTV9PUENPREVfQUJPUlRfSU5WT0tFOgorCQljYXNlIEFWTV9PUENPREVfQUJPUlRfU0VUOgorCQljYXNlIEFWTV9PUENPREVfQUJPUlRfQ0hJTEQ6CisJCWNhc2UgQVZNX09QQ09ERV9BQk9SVF9TRUxGOgorCQljYXNlIEFWTV9PUENPREVfQUJPUlRfU0VMVkVTOgorCisJCWNhc2UgQVZNX09QQ09ERV9ISVNUT1JZX0NMRUFSOgorCQljYXNlIEFWTV9PUENPREVfREVFUF9ISVNUT1JZX0lOVk9LRToKKwkJY2FzZSBBVk1fT1BDT0RFX1NIQUxMT1dfSElTVE9SWV9JTlZPS0U6CisKKwkJY2FzZSBBVk1fT1BDT0RFX0lSVU46CisJCWNhc2UgQVZNX09QQ09ERV9SVU46CisJCWNhc2UgQVZNX09QQ09ERV9SVEM6CisKKwkJY2FzZSBBVk1fT1BDT0RFX1NDSEVEVUxFX0lOVk9LRToKKwkJY2FzZSBBVk1fT1BDT0RFX1NDSEVEVUxFX0dFVDoKKwkJY2FzZSBBVk1fT1BDT0RFX1NDSEVEVUxFX0lOOgorCQljYXNlIEFWTV9PUENPREVfU0NIRURVTEVfU0VUOgorCisJCWNhc2UgQVZNX09QQ09ERV9ERUZFUl9JTlZPS0U6CisJCWNhc2UgQVZNX09QQ09ERV9ERUZFUl9HRVQ6CisJCWNhc2UgQVZNX09QQ09ERV9ERUZFUl9TRVQ6CisKKwkJY2FzZSBBVk1fT1BDT0RFX0dPVE86CisJCXsKKwkJCXByZXR0eVByaW50ZXJCYXNpY1N0YXRlbWVudCggb3V0ICwgaXNTdGF0ZW1lbnQgKTsKKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfRk9SSzoKKwkJY2FzZSBBVk1fT1BDT0RFX0pPSU46CisKKwkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUX0VOQUJMRUQ6CisKKwkJY2FzZSBBVk1fT1BDT0RFX1JEVjoKKworCQljYXNlIEFWTV9PUENPREVfU1lOQ0hST05JWkU6CisJCXsKKwkJCXByZXR0eVByaW50ZXJEZWZhdWx0KCBvdXQgLCBpc1N0YXRlbWVudCApOworCisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9JTlZPS0VfTkVXOgorCisJCWNhc2UgQVZNX09QQ09ERV9JTlZPS0VfUk9VVElORToKKworCQljYXNlIEFWTV9PUENPREVfSU5WT0tFX1RSQU5TSVRJT046CisKKwkJY2FzZSBBVk1fT1BDT0RFX0lOVk9LRV9NRVRIT0Q6CisJCWNhc2UgQVZNX09QQ09ERV9JTlZPS0VfUFJPR1JBTToKKwkJY2FzZSBBVk1fT1BDT0RFX0lOVk9LRV9GVU5DVElPTjoKKworCQljYXNlIEFWTV9PUENPREVfSU5WT0tFX0xBTUJEQV9BUFBMWToKKwkJY2FzZSBBVk1fT1BDT0RFX0lOVk9LRV9MQU1CREFfTEVUOgorCQl7CisJCQlwcmV0dHlQcmludGVyQmFzaWNTdGF0ZW1lbnQoIG91dCAsIGlzU3RhdGVtZW50ICk7CisKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gQVZNIE1BQ0hJTkUgU1RBVFVTCisJCWNhc2UgQVZNX09QQ09ERV9TVEFUVVNfV0FTOgorCQljYXNlIEFWTV9PUENPREVfU1RBVFVTX0lTOgorCQljYXNlIEFWTV9PUENPREVfU1RBVFVTX0JFSU5HOgorCQljYXNlIEFWTV9PUENPREVfU1RBVFVTX1dJTEw6CisKKwkJY2FzZSBBVk1fT1BDT0RFX0NIQU5HRUQ6CisJCWNhc2UgQVZNX09QQ09ERV9DSEFOR0VEX1RPOgorCQl7CisJCQlwcmV0dHlQcmludGVyRGVmYXVsdCggb3V0ICwgaXNTdGF0ZW1lbnQgKTsKKworCQkJYnJlYWs7CisJCX0KKworCisJCS8vIEFWTSBQUk9HUkFNIFNDSEVEVUxJTkcKKwkJY2FzZSBBVk1fT1BDT0RFX0FTWU5DSFJPTk9VUzoKKwkJY2FzZSBBVk1fT1BDT0RFX1NUUk9OR19TWU5DSFJPTk9VUzoKKwkJY2FzZSBBVk1fT1BDT0RFX1dFQUtfU1lOQ0hST05PVVM6CisKKwkJY2FzZSBBVk1fT1BDT0RFX0lOVEVSTEVBVklORzoKKwkJY2FzZSBBVk1fT1BDT0RFX1BBUlRJQUxfT1JERVJfUkVEVUNUSU9OOgorCisJCWNhc2UgQVZNX09QQ09ERV9QQVJBTExFTDoKKworCQkvLyBPcHRpbWl6ZWQgdmVyc2lvbiBvZiBjb25jdXJyZW5jeSBmb3IgUkRWIHN5bmNocm9uaXphdGlvbgorCQljYXNlIEFWTV9PUENPREVfUkRWX0FTWU5DSFJPTk9VUzoKKwkJY2FzZSBBVk1fT1BDT0RFX1JEVl9TVFJPTkdfU1lOQ0hST05PVVM6CisJCWNhc2UgQVZNX09QQ09ERV9SRFZfV0VBS19TWU5DSFJPTk9VUzoKKworCQljYXNlIEFWTV9PUENPREVfUkRWX0lOVEVSTEVBVklORzoKKwkJY2FzZSBBVk1fT1BDT0RFX1JEVl9QQVJUSUFMX09SREVSX1JFRFVDVElPTjoKKworCQljYXNlIEFWTV9PUENPREVfUkRWX1BBUkFMTEVMOgorCisJCWNhc2UgQVZNX09QQ09ERV9FWENMVVNJVkU6CisKKwkJY2FzZSBBVk1fT1BDT0RFX05PTkRFVEVSTUlOSVNNOgorCisJCWNhc2UgQVZNX09QQ09ERV9QUklPUl9HVDoKKwkJY2FzZSBBVk1fT1BDT0RFX1BSSU9SX0xUOgorCisJCWNhc2UgQVZNX09QQ09ERV9TQ0hFRFVMRV9BTkRfVEhFTjoKKwkJY2FzZSBBVk1fT1BDT0RFX1NDSEVEVUxFX09SX0VMU0U6CisKKwkJY2FzZSBBVk1fT1BDT0RFX0FUT01JQ19TRVFVRU5DRToKKworCQljYXNlIEFWTV9PUENPREVfU0VRVUVOQ0U6CisJCWNhc2UgQVZNX09QQ09ERV9TRVFVRU5DRV9TSURFOgorCQljYXNlIEFWTV9PUENPREVfU0VRVUVOQ0VfV0VBSzoKKworCQljYXNlIEFWTV9PUENPREVfUFJPRFVDVDoKKworCQkvLyBBVk0gQlVGRkVSIE1BTkFHSU5HCisJCWNhc2UgQVZNX09QQ09ERV9VUERBVEVfQlVGRkVSOgorCQl7CisJCQlwcmV0dHlQcmludGVyQmxvY2tTdGF0ZW1lbnQoIG91dCAsIGlzU3RhdGVtZW50ICk7CisKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gTEFNQkRBIFNUQVRFTUVOVAorCQljYXNlIEFWTV9PUENPREVfQVBQTFk6CisKKwkJY2FzZSBBVk1fT1BDT0RFX0xBTUJEQToKKworCQkvLyBGVU5DVElPTkIgU1RBVEVNRU5UCisJCWNhc2UgQVZNX09QQ09ERV9GVU46CisKKworCQkvLyBMRVQgU1RBVEVNRU5UCisJCWNhc2UgQVZNX09QQ09ERV9MRVQ6CisJCXsKKwkJCXByZXR0eVByaW50ZXJEZWZhdWx0KCBvdXQgLCBpc1N0YXRlbWVudCApOworCisJCQlicmVhazsKKwkJfQorCisJCS8vIExPT0tVUCBTVEFURU1FTlQKKwkJY2FzZSBBVk1fT1BDT0RFX0xPT0tVUF9JTlRfRVhUOgorCQljYXNlIEFWTV9PUENPREVfTE9PS1VQX0lOVDoKKwkJY2FzZSBBVk1fT1BDT0RFX0xPT0tVUF9ORUFSRVNUOgorCQljYXNlIEFWTV9PUENPREVfTE9PS1VQX0JFTE9XOgorCQljYXNlIEFWTV9PUENPREVfTE9PS1VQX0FCT1ZFOgorCQljYXNlIEFWTV9PUENPREVfTE9PS1VQMkRfSU5UX0VYVDoKKwkJeworCQkJcHJldHR5UHJpbnRlckZ1bmN0aW9uYWwoIG91dCApOworCisJCQlicmVhazsKKwkJfQorCisJCS8vIEFWTSBQUklNSVRJVkUgU1RBVEVNRU5UCisJCWNhc2UgQVZNX09QQ09ERV9BU1NJR046CisJCWNhc2UgQVZNX09QQ09ERV9BU1NJR05fQUZURVI6CisJCWNhc2UgQVZNX09QQ09ERV9BU1NJR05fT1A6CisJCWNhc2UgQVZNX09QQ09ERV9BU1NJR05fT1BfQUZURVI6CisJCWNhc2UgQVZNX09QQ09ERV9BU1NJR05fUkVGOgorCQljYXNlIEFWTV9PUENPREVfQVNTSUdOX01BQ1JPOgorCQl7CisJCQlvdXQgPDwgVEFCIDw8IEFWTV9TVFJfSU5ERU5UOworCisJCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdCA9IGJlZ2luKCk7CisJCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IGVuZCgpOworCisJCQlwcmV0dHlQcmludGVyKG91dCwgKCppdCksIGZhbHNlKTsKKworCQkJQmFzZVR5cGVTcGVjaWZpZXIgKiBhVHlwZSA9ICgqaXQpLmlzPCBJbnN0YW5jZU9mRGF0YSA+KCkgPworCQkJCSgqaXQpLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpLT5nZXRUeXBlU3BlY2lmaWVyKCkgOiBOVUxMOworCisJCQlmb3IoICsraXQgOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCQkJeworCQkJCW91dCA8PCBUQUIgPDwgc3RyT3BlcmF0b3IoKTsKKworCQkJCXByZXR0eVByaW50ZXIob3V0LCAoKml0KSwgYVR5cGUpOworCQkJfQorCisJCQkoIGlzU3RhdGVtZW50ID8gKG91dCA8PCAiOyIpIDogb3V0ICkgPDwgRU5EX0lOREVOVF9FT0w7CisKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBBVk1fT1BDT0RFX0FTU0lHTl9ORVdGUkVTSDoKKwkJY2FzZSBBVk1fT1BDT0RFX0FTU0lHTl9SRVNFVDoKKwkJeworCQkJcHJldHR5UHJpbnRlckZ1bmN0aW9uYWwoIG91dCApOworCisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9HVUFSRDoKKwkJY2FzZSBBVk1fT1BDT0RFX1RJTUVEX0dVQVJEOgorCisJCWNhc2UgQVZNX09QQ09ERV9FVkVOVDoKKworCQljYXNlIEFWTV9PUENPREVfQ0hFQ0tfU0FUOgorCQl7CisJCQlwcmV0dHlQcmludGVyQmFzaWNTdGF0ZW1lbnQoIG91dCAsIGlzU3RhdGVtZW50ICk7CisKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUOgorCQljYXNlIEFWTV9PUENPREVfSU5QVVRfRlJPTToKKworCQljYXNlIEFWTV9PUENPREVfSU5QVVRfU0FWRToKKworCQkvLyBPcHRpbWl6ZWQgdmVyc2lvbiBvZiBJTlBVVAorCQljYXNlIEFWTV9PUENPREVfSU5QVVRfRU5WOgorCQljYXNlIEFWTV9PUENPREVfSU5QVVRfVkFSOgorCQljYXNlIEFWTV9PUENPREVfSU5QVVRfRkxPVzoKKwkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUX0JVRkZFUjoKKwkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUX1JEVjoKKwkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUX01VTFRJX1JEVjoKKwkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUX0JST0FEQ0FTVDoKKwkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUX0RFTEVHQVRFOgorCisJCWNhc2UgQVZNX09QQ09ERV9PVVRQVVQ6CisJCWNhc2UgQVZNX09QQ09ERV9PVVRQVVRfVE86CisJCS8vIE9wdGltaXplZCB2ZXJzaW9uIG9mIE9VVFBVVAorCQljYXNlIEFWTV9PUENPREVfT1VUUFVUX0VOVjoKKwkJY2FzZSBBVk1fT1BDT0RFX09VVFBVVF9WQVI6CisJCWNhc2UgQVZNX09QQ09ERV9PVVRQVVRfRkxPVzoKKwkJY2FzZSBBVk1fT1BDT0RFX09VVFBVVF9CVUZGRVI6CisJCWNhc2UgQVZNX09QQ09ERV9PVVRQVVRfUkRWOgorCQljYXNlIEFWTV9PUENPREVfT1VUUFVUX01VTFRJX1JEVjoKKwkJY2FzZSBBVk1fT1BDT0RFX09VVFBVVF9CUk9BRENBU1Q6CisJCWNhc2UgQVZNX09QQ09ERV9PVVRQVVRfREVMRUdBVEU6CisJCXsKKwkJCW91dCA8PCBUQUIgPDwgc3RyT3BlcmF0b3IoKSA8PCAiICIgPDwgQVZNX05PX0lOREVOVDsKKworCQkJcHJldHR5UHJpbnRlcihvdXQsIGZpcnN0KCksIGZhbHNlKTsKKworCQkJaWYoIHBvcHVsYXRlZCgpICkKKwkJCXsKKwkJCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdCA9IGJlZ2luKCk7CisJCQkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBlbmQoKTsKKworCQkJCW91dCA8PCAiKCI7CisKKwkJCQlwcmV0dHlQcmludGVyKG91dCwgKigrK2l0KSwgZmFsc2UpOworCisJCQkJZm9yKCArK2l0IDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJCQl7CisJCQkJCW91dCA8PCAiLCAiOworCQkJCQlwcmV0dHlQcmludGVyKG91dCwgKCppdCksIGZhbHNlKTsKKwkJCQl9CisKKwkJCQlvdXQgPDwgIikiOworCQkJfQorCisJCQlvdXQgPDwgIjsiIDw8IEVORF9JTkRFTlRfRU9MOworCisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9QUkVTRU5UOgorCQljYXNlIEFWTV9PUENPREVfQUJTRU5UOgorCQl7CisJCQlvdXQgPDwgVEFCIDw8IHN0ck9wZXJhdG9yKCkgPDwgIiAiIDw8IEFWTV9OT19JTkRFTlQ7CisKKwkJCXByZXR0eVByaW50ZXIob3V0LCBmaXJzdCgpLCBmYWxzZSk7CisKKwkJCWlmKCBwb3B1bGF0ZWQoKSApCisJCQl7CisJCQkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBiZWdpbigpOworCQkJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gZW5kKCk7CisKKwkJCQlvdXQgPDwgIigiOworCisJCQkJcHJldHR5UHJpbnRlcihvdXQsICooKytpdCksIGZhbHNlKTsKKworCQkJCWZvciggKytpdCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJCQkJeworCQkJCQlvdXQgPDwgIiwgIjsKKwkJCQkJcHJldHR5UHJpbnRlcihvdXQsICgqaXQpLCBmYWxzZSk7CisJCQkJfQorCisJCQkJb3V0IDw8ICIpIjsKKwkJCX0KKworCQkJKCBpc1N0YXRlbWVudCA/IChvdXQgPDwgIjsiKSA6IG91dCApIDw8IEVORF9JTkRFTlRfRU9MOworCisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9JRjoKKwkJeworCQkJb3V0IDw8IFRBQiA8PCAiaWYiOworCisJCQlwcmV0dHlQcmludGVyQ29uZGl0aW9uKCBvdXQgLCBmaXJzdCgpICk7CisKKwkJCXByZXR0eVByaW50ZXJCbG9jayggb3V0IDw8IEVPTCAsIHNlY29uZCgpICk7CisKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgQVZNX09QQ09ERV9JRkU6CisJCXsKKwkJCW91dCA8PCBUQUIgPDwgImlmIjsKKworCQkJcHJldHR5UHJpbnRlckNvbmRpdGlvbiggb3V0ICwgZmlyc3QoKSApOworCisJCQlwcmV0dHlQcmludGVyQmxvY2soIG91dCA8PCBFT0wgLCBzZWNvbmQoKSApOworCisJCQlvdXQgPDwgVEFCIDw8ICJlbHNlIiA8PCBFT0w7CisKKwkJCXByZXR0eVByaW50ZXJCbG9jayggb3V0ICwgdGhpcmQoKSApOworCisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9XSEVSRToKKwkJeworCQkJb3V0IDw8IFRBQiA8PCAid2hlcmUiOworCisJCQlwcmV0dHlQcmludGVyQ29uZGl0aW9uKCBvdXQgLCBmaXJzdCgpICk7CisKKwkJCXByZXR0eVByaW50ZXJCbG9jayggb3V0IDw8IEVPTCAsIHNlY29uZCgpICk7CisKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgQVZNX09QQ09ERV9XSEVSRV9FTFNFOgorCQl7CisJCQlwcmV0dHlQcmludGVyQ29uZGl0aW9uKCBvdXQgPDwgVEFCIDw8ICJ3aGVyZSIgLCBmaXJzdCgpICk7CisKKwkJCXByZXR0eVByaW50ZXJCbG9jayggb3V0IDw8IEVPTCAsIHNlY29uZCgpICk7CisKKwkJCXByZXR0eVByaW50ZXJCbG9jayggb3V0IDw8IFRBQiA8PCAiZWxzZSIgPDwgRU9MICwgdGhpcmQoKSApOworCisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9GT1I6CisJCXsKKwkJCW91dCA8PCBUQUIgPDwgImZvciggIiA8PCBBVk1fTk9fSU5ERU5UOworCisJCQlwcmV0dHlQcmludGVyKCBvdXQgLCBmaXJzdCgpICwgZmFsc2UgKTsKKwkJCW91dCA8PCAiIDsgIjsKKwkJCXByZXR0eVByaW50ZXIoIG91dCAsIHNlY29uZCgpICwgZmFsc2UgKTsKKwkJCW91dCA8PCAiIDsgIjsKKwkJCXByZXR0eVByaW50ZXIoIG91dCAsIHRoaXJkKCkgLCBmYWxzZSApOworCisJCQlvdXQgPDwgIiApIiA8PCBFTkRfSU5ERU5UX0VPTDsKKworCQkJcHJldHR5UHJpbnRlckJsb2NrKCBvdXQgLCBmb3VydGgoKSApOworCisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9GT1JFQUNIOgorCQl7CisJCQlvdXQgPDwgVEFCIDw8ICJmb3IoICIgPDwgQVZNX05PX0lOREVOVDsKKworCQkJcHJldHR5UHJpbnRlciggb3V0ICwgZmlyc3QoKSAsIGZhbHNlICk7CisJCQlvdXQgPDwgIiA6ICI7CisJCQlwcmV0dHlQcmludGVyKCBvdXQgLCBzZWNvbmQoKSAsIGZhbHNlICk7CisKKwkJCW91dCA8PCAiICkiIDw8IEVORF9JTkRFTlRfRU9MOworCisJCQlwcmV0dHlQcmludGVyQmxvY2soIG91dCAsIHRoaXJkKCkgKTsKKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfV0hJTEVfRE86CisJCXsKKwkJCXByZXR0eVByaW50ZXJDb25kaXRpb24oIG91dCA8PCBUQUIgPDwgIndoaWxlIiAsIGZpcnN0KCkgKTsKKworCQkJcHJldHR5UHJpbnRlckJsb2NrKCBvdXQgPDwgRU9MICwgc2Vjb25kKCkgKTsKKworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBBVk1fT1BDT0RFX0RPX1dISUxFOgorCQl7CisJCQlwcmV0dHlQcmludGVyQmxvY2soIG91dCA8PCBUQUIgPDwgImRvIiA8PCBFT0wgLCBmaXJzdCgpICk7CisKKwkJCXByZXR0eVByaW50ZXJDb25kaXRpb24oIG91dCA8PCBUQUIgPDwgIndoaWxlIiAsIHNlY29uZCgpICk7CisKKwkJCW91dCA8PCAiOyIgPDwgRU9MOworCisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9CUkVBSzoKKwkJY2FzZSBBVk1fT1BDT0RFX0NPTlRJTlVFOgorCQljYXNlIEFWTV9PUENPREVfUkVUVVJOOgorCQljYXNlIEFWTV9PUENPREVfRVhJVDoKKwkJeworCQkJcHJldHR5UHJpbnRlckJhc2ljU3RhdGVtZW50KCBvdXQgLCBpc1N0YXRlbWVudCApOworCisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9TVEVQX01BUks6CisKKwkJLy8gQVZNIFFVQU5USUZJRVIgRVhQUkVTU0lPTgorCQljYXNlIEFWTV9PUENPREVfRVhJU1Q6CisJCWNhc2UgQVZNX09QQ09ERV9GT1JBTEw6CisJCXsKKwkJCXByZXR0eVByaW50ZXJQcmVmaXgoIG91dCApOworCisJCQlicmVhazsKKwkJfQorCisJCS8vIEFWTSBQUkVESUNBVCBFWFBSRVNTSU9OCisJCWNhc2UgQVZNX09QQ09ERV9OT1Q6CisKKwkJY2FzZSBBVk1fT1BDT0RFX0FORDoKKwkJY2FzZSBBVk1fT1BDT0RFX0FORF9USEVOOgorCisJCWNhc2UgQVZNX09QQ09ERV9OQU5EOgorCisJCWNhc2UgQVZNX09QQ09ERV9YQU5EOgorCisJCWNhc2UgQVZNX09QQ09ERV9PUjoKKwkJY2FzZSBBVk1fT1BDT0RFX09SX0VMU0U6CisKKwkJY2FzZSBBVk1fT1BDT0RFX05PUjoKKworCQljYXNlIEFWTV9PUENPREVfWE9SOgorCQljYXNlIEFWTV9PUENPREVfWE5PUjoKKworCQkvLyBBVk0gSU5URUdFUiBCSVQgQSBCSVQgT1BFUkFUT1IKKwkJY2FzZSBBVk1fT1BDT0RFX0JOT1Q6CisKKwkJY2FzZSBBVk1fT1BDT0RFX0JBTkQ6CisJCWNhc2UgQVZNX09QQ09ERV9CT1I6CisJCWNhc2UgQVZNX09QQ09ERV9CWE9SOgorCisJCWNhc2UgQVZNX09QQ09ERV9MU0hJRlQ6CisJCWNhc2UgQVZNX09QQ09ERV9SU0hJRlQ6CisKKwkJLy8gQVZNIENPTVBBUklTT04gRVhQUkVTU0lPTgorCisJCWNhc2UgQVZNX09QQ09ERV9FUToKKwkJY2FzZSBBVk1fT1BDT0RFX05FUToKKworCQljYXNlIEFWTV9PUENPREVfU0VROgorCQljYXNlIEFWTV9PUENPREVfTlNFUToKKworCQljYXNlIEFWTV9PUENPREVfTFQ6CisJCWNhc2UgQVZNX09QQ09ERV9MVEU6CisJCWNhc2UgQVZNX09QQ09ERV9HVDoKKwkJY2FzZSBBVk1fT1BDT0RFX0dURToKKworCQkvLyBBVk0gQVJJVEhNRVRJQyBFWFBSRVNTSU9OCisKKwkJY2FzZSBBVk1fT1BDT0RFX1BMVVM6CisJCWNhc2UgQVZNX09QQ09ERV9NSU5VUzoKKwkJY2FzZSBBVk1fT1BDT0RFX1VNSU5VUzoKKworCQljYXNlIEFWTV9PUENPREVfTVVMVDoKKwkJY2FzZSBBVk1fT1BDT0RFX1BPVzoKKworCQljYXNlIEFWTV9PUENPREVfRElWOgorCQljYXNlIEFWTV9PUENPREVfTU9EOgorCQl7CisJCQlwcmV0dHlQcmludGVySW5maXgoIG91dCApOworCisJCQlicmVhazsKKwkJfQorCisJCS8vIEFWTSBNQVRIRU1BVElDQUwgRlVOQ1RJT04KKwkJY2FzZSBBVk1fT1BDT0RFX01JTjoKKwkJY2FzZSBBVk1fT1BDT0RFX01BWDoKKworCQkvLyBSQU5ET00KKwkJY2FzZSBBVk1fT1BDT0RFX1JBTkRPTToKKworCQkvLyBST1VORElORworCQljYXNlIEFWTV9PUENPREVfQUJTOgorCisJCWNhc2UgQVZNX09QQ09ERV9DRUlMOgorCQljYXNlIEFWTV9PUENPREVfRkxPT1I6CisJCWNhc2UgQVZNX09QQ09ERV9ST1VORDoKKwkJY2FzZSBBVk1fT1BDT0RFX1RSVU5DQVRFOgorCisJCS8vIEVYUCAtIExPRworCQljYXNlIEFWTV9PUENPREVfU1FSVDoKKworCQljYXNlIEFWTV9PUENPREVfRVhQOgorCQljYXNlIEFWTV9PUENPREVfTE46CisJCWNhc2UgQVZNX09QQ09ERV9MT0c6CisKKwkJLy8gVFJJR09OT01FVFJJQworCQljYXNlIEFWTV9PUENPREVfU0lOOgorCQljYXNlIEFWTV9PUENPREVfQ09TOgorCQljYXNlIEFWTV9PUENPREVfVEFOOgorCisJCWNhc2UgQVZNX09QQ09ERV9TSU5IOgorCQljYXNlIEFWTV9PUENPREVfQ09TSDoKKwkJY2FzZSBBVk1fT1BDT0RFX1RBTkg6CisKKwkJY2FzZSBBVk1fT1BDT0RFX0FTSU46CisJCWNhc2UgQVZNX09QQ09ERV9BQ09TOgorCQljYXNlIEFWTV9PUENPREVfQVRBTjoKKwkJY2FzZSBBVk1fT1BDT0RFX0FUQU4yOgorCisJCWNhc2UgQVZNX09QQ09ERV9BU0lOSDoKKwkJY2FzZSBBVk1fT1BDT0RFX0FDT1NIOgorCQljYXNlIEFWTV9PUENPREVfQVRBTkg6CisJCXsKKwkJCXByZXR0eVByaW50ZXJGdW5jdGlvbmFsKCBvdXQgKTsKKworCQkJYnJlYWs7CisJCX0KKworCQkvLyBBVk0gU1RSSU5HIC8gQ09OVEFJTkVSIE9QRVJBVE9SCisJCWNhc2UgQVZNX09QQ09ERV9DT05UQUlOUzoKKworCQljYXNlIEFWTV9PUENPREVfSU46CisJCWNhc2UgQVZNX09QQ09ERV9OT1RJTjoKKworCQljYXNlIEFWTV9PUENPREVfU1VCU0VUOgorCQljYXNlIEFWTV9PUENPREVfU1VCU0VURVE6CisKKwkJY2FzZSBBVk1fT1BDT0RFX0lOVEVSU0VDVDoKKworCQljYXNlIEFWTV9PUENPREVfU1RBUlRTX1dJVEg6CisJCWNhc2UgQVZNX09QQ09ERV9FTkRTX1dJVEg6CisKKwkJY2FzZSBBVk1fT1BDT0RFX0NPTkNBVDoKKwkJeworCQkJcHJldHR5UHJpbnRlckluZml4KCBvdXQgKTsKKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfQVBQRU5EOgorCisJCWNhc2UgQVZNX09QQ09ERV9SRU1PVkU6CisJCWNhc2UgQVZNX09QQ09ERV9DTEVBUjoKKworCQljYXNlIEFWTV9PUENPREVfUkVTSVpFOgorCisJCWNhc2UgQVZNX09QQ09ERV9TRUxFQ1Q6CisKKwkJY2FzZSBBVk1fT1BDT0RFX1BVU0g6CisJCWNhc2UgQVZNX09QQ09ERV9BU1NJR05fVE9QOgorCQljYXNlIEFWTV9PUENPREVfVE9QOgorCQljYXNlIEFWTV9PUENPREVfUE9QOgorCQljYXNlIEFWTV9PUENPREVfUE9QX0ZST006CisKKwkJY2FzZSBBVk1fT1BDT0RFX0VNUFRZOgorCQljYXNlIEFWTV9PUENPREVfTk9ORU1QVFk6CisJCWNhc2UgQVZNX09QQ09ERV9TSU5HTEVUT046CisJCWNhc2UgQVZNX09QQ09ERV9QT1BVTEFURUQ6CisJCWNhc2UgQVZNX09QQ09ERV9GVUxMOgorCisJCWNhc2UgQVZNX09QQ09ERV9TSVpFOgorCQl7CisJCQlwcmV0dHlQcmludGVyRnVuY3Rpb25hbCggb3V0ICk7CisKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gQ1RMKiAsIElPTFRMIFNUQVRFTUVOVAorCQljYXNlIEFWTV9PUENPREVfTkVDRVNTQVJJTFk6CisJCWNhc2UgQVZNX09QQ09ERV9QT1NTSUJMWToKKworCQljYXNlIEFWTV9PUENPREVfR0xPQkFMTFk6CisJCWNhc2UgQVZNX09QQ09ERV9FVkVOVFVBTExZOgorCisJCWNhc2UgQVZNX09QQ09ERV9ORVhUOgorCQl7CisJCQlwcmV0dHlQcmludGVyUHJlZml4KCBvdXQgKTsKKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfVU5USUw6CisJCWNhc2UgQVZNX09QQ09ERV9VTkxFU1M6CisJCWNhc2UgQVZNX09QQ09ERV9SRUxFQVNFUzoKKworCQljYXNlIEFWTV9PUENPREVfQU5EX1Q6CisJCWNhc2UgQVZNX09QQ09ERV9PUl9UOgorCQljYXNlIEFWTV9PUENPREVfTk9UX1Q6CisJCWNhc2UgQVZNX09QQ09ERV9JTVBfVDoKKwkJeworCQkJcHJldHR5UHJpbnRlckluZml4KCBvdXQgKTsKKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfT0JTOgorCQl7CisJCQlwcmV0dHlQcmludGVyUHJlZml4KCBvdXQgKTsKKworCQkJYnJlYWs7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQl0b1N0cmVhbVByZWZpeCggb3V0ICk7CisKKwkJCWJyZWFrOworCQl9CisJfQorCisJb3V0IDw8IHN0ZDo6Zmx1c2g7Cit9CisKKwordm9pZCBBdm1Db2RlOjpwcmV0dHlQcmludGVyQmFzaWNTdGF0ZW1lbnQoCisJCU91dFN0cmVhbSAmIG91dCwgYm9vbCBpc1N0YXRlbWVudCkgY29uc3QKK3sKKwlvdXQgPDwgVEFCIDw8ICggaXNTdGF0ZW1lbnQgPyAiIiA6ICIoIiApIDw8IHN0ck9wZXJhdG9yKCkKKwkJPDwgQVZNX1NUUl9JTkRFTlQ7CisKKwlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdCA9IGJlZ2luKCk7CisJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBlbmQoKTsKKwlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwl7CisJCXByZXR0eVByaW50ZXIob3V0LCAoKml0KSwgZmFsc2UpOworCX0KKworCW91dCA8PCAoIGlzU3RhdGVtZW50ID8gIjsiIDogIikiICkgPDwgRU5EX0lOREVOVF9FT0w7Cit9CisKKwordm9pZCBBdm1Db2RlOjpwcmV0dHlQcmludGVyQmxvY2tTdGF0ZW1lbnQoCisJCU91dFN0cmVhbSAmIG91dCwgYm9vbCBpc1N0YXRlbWVudCkgY29uc3QKK3sKKwlvdXQgPDwgVEFCIDw8ICJ7ICIgPDwgc3RyT3BlcmF0b3IoKSA8PCBFT0xfSU5DUl9JTkRFTlQ7CisKKwlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdCA9IGJlZ2luKCk7CisJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBlbmQoKTsKKwlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwl7CisJCXByZXR0eVByaW50ZXIob3V0LCAoKml0KSwgaXNTdGF0ZW1lbnQpOworCX0KKworCW91dCA8PCBERUNSX0lOREVOVF9UQUIgPDwgIn0iICA8PCBFT0w7Cit9CisKKwordm9pZCBBdm1Db2RlOjpwcmV0dHlQcmludGVyRGVmYXVsdChPdXRTdHJlYW0gJiBvdXQsIGJvb2wgaXNTdGF0ZW1lbnQpIGNvbnN0Cit7CisJb3V0IDw8IFRBQiA8PCAiJHsgIiA8PCBzdHJPcGVyYXRvcigpIDw8IEVPTF9JTkNSX0lOREVOVDsKKworCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYmVnaW4oKTsKKwlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IGVuZCgpOworCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCXsKKwkJcHJldHR5UHJpbnRlcihvdXQsICgqaXQpLCBpc1N0YXRlbWVudCk7CisJfQorCisJb3V0IDw8IERFQ1JfSU5ERU5UX1RBQiA8PCAifSIgPDwgRU9MOworfQorCisKK3ZvaWQgQXZtQ29kZTo6cHJldHR5UHJpbnRlckZ1bmN0aW9uYWwoT3V0U3RyZWFtICYgb3V0KSBjb25zdAoreworCW91dCA8PCBUQUIgPDwgc3RyT3BlcmF0b3IoKSA8PCAiKCIgPDwgQVZNX05PX0lOREVOVDsKKworCWlmKCBzaW5nbGV0b24oKSApCisJeworCQlwcmV0dHlQcmludGVyKG91dCwgZmlyc3QoKSwgZmFsc2UpOworCX0KKwllbHNlIGlmKCBwb3B1bGF0ZWQoKSApCisJeworCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdCA9IGJlZ2luKCk7CisJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gZW5kKCk7CisKKwkJcHJldHR5UHJpbnRlcihvdXQsICgqaXQpLCBmYWxzZSk7CisKKwkJZm9yKCArK2l0IDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJeworCQkJb3V0IDw8ICIsICI7CisJCQlwcmV0dHlQcmludGVyKG91dCwgKCppdCksIGZhbHNlKTsKKwkJfQorCX0KKworCW91dCA8PCAiKSIgPDwgRU5EX0lOREVOVF9FT0w7Cit9CisKKwordm9pZCBBdm1Db2RlOjpwcmV0dHlQcmludGVySW5maXgoT3V0U3RyZWFtICYgb3V0KSBjb25zdAoreworCW91dCA8PCBUQUIgPDwgIigiIDw8IEFWTV9OT19JTkRFTlQ7CisKKwlpZiggc2luZ2xldG9uKCkgKQorCXsKKwkJb3V0IDw8IHN0ck9wZXJhdG9yKCkgPDwgIiAiOworCisJCXByZXR0eVByaW50ZXIob3V0LCBmaXJzdCgpLCBmYWxzZSk7CisJfQorCWVsc2UgaWYoIHBvcHVsYXRlZCgpICkKKwl7CisJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYmVnaW4oKTsKKwkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBlbmQoKTsKKworCQlwcmV0dHlQcmludGVyKG91dCwgKCppdCksIGZhbHNlKTsKKworCQlmb3IoICsraXQgOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCQl7CisJCQlvdXQgPDwgIiAiIDw8IHN0ck9wZXJhdG9yKCkgPDwgIiAiOworCisJCQlwcmV0dHlQcmludGVyKG91dCwgKCppdCksIGZhbHNlKTsKKwkJfQorCX0KKworCW91dCA8PCAiKSIgPDwgRU5EX0lOREVOVF9FT0w7Cit9CisKKwordm9pZCBBdm1Db2RlOjpwcmV0dHlQcmludGVyUHJlZml4KE91dFN0cmVhbSAmIG91dCkgY29uc3QKK3sKKwlvdXQgPDwgVEFCIDw8ICIoIiA8PCBzdHJPcGVyYXRvcigpIDw8IEFWTV9TVFJfSU5ERU5UOworCisJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBiZWdpbigpOworCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gZW5kKCk7CisJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJeworCQlwcmV0dHlQcmludGVyKG91dCwgKCppdCksIGZhbHNlKTsKKwl9CisKKwlvdXQgPDwgIikiIDw8IEVORF9JTkRFTlRfRU9MOworfQorCisKK3ZvaWQgQXZtQ29kZTo6cHJldHR5UHJpbnRlclN1ZmZpeChPdXRTdHJlYW0gJiBvdXQpIGNvbnN0Cit7CisJb3V0IDw8IFRBQiA8PCAiKCIgPDwgQVZNX1JUU19JTkRFTlQ7CisKKwlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdCA9IGJlZ2luKCk7CisJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBlbmQoKTsKKwlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwl7CisJCXByZXR0eVByaW50ZXIob3V0LCAoKml0KSwgZmFsc2UpOworCX0KKworCW91dCA8PCBzdHJPcGVyYXRvcigpIDw8ICIpIiA8PCBFTkRfSU5ERU5UX0VPTDsKK30KKworCit2b2lkIEF2bUNvZGU6OnByZXR0eVByaW50ZXIoT3V0U3RyZWFtICYgb3V0LCBjb25zdCBCRiAmIGFyZywgYm9vbCBpc1N0YXRlbWVudCkKK3sKKwlpZiggYXJnLmludmFsaWQoKSApCisJeworCQlvdXQgPDwgVEFCIDw8ICJudWxsPGF2bWNvZGU6OmFyZz4iIDw8IEVPTDsKKwl9CisKKwllbHNlIGlmKCBhcmcuaXM8IEF2bUNvZGUgPigpICkKKwl7CisJCWFyZy50b19wdHI8IEF2bUNvZGUgPigpLT5wcmV0dHlQcmludGVyKG91dCwgaXNTdGF0ZW1lbnQpOworCX0KKwllbHNlIGlmKCBhcmcuaXM8IEJ1aWx0aW5Gb3JtID4oKSApCisJeworCQlvdXQgPDwgVEFCIDw8IGFyZy50b19wdHI8IEJ1aWx0aW5Gb3JtID4oKS0+c3RyKCkgPDwgRU9MOworCX0KKworCWVsc2UgaWYoIGFyZy5pczwgT3BlcmF0b3IgPigpICkKKwl7CisJCW91dCA8PCBUQUIgPDwgYXJnLnRvX3B0cjwgT3BlcmF0b3IgPigpLT5zdGFuZGFyZFN5bWJvbCgpOworCQlhcmcuQVZNX0RFQlVHX1JFRl9DT1VOVEVSKG91dCk7CisJCW91dCA8PCBFT0w7CisJfQorCWVsc2UgaWYoIGFyZy5pczwgUm91dGluZSA+KCkgKQorCXsKKwkJYXJnLnRvX3B0cjwgUm91dGluZSA+KCktPnRvU3RyZWFtSW52b2tlKG91dCk7CisJfQorCisJZWxzZSBpZiggYXJnLmlzPCBQcm9wZXJ0eUVsZW1lbnQgPigpICkKKwl7CisJCW91dCA8PCBUQUIgPDwgIiYiCisJCQk8PCBhcmcudG9fcHRyPCBQcm9wZXJ0eUVsZW1lbnQgPigpLT5nZXRRdWFsaWZpZWROYW1lSUQoKTsKKwkJYXJnLkFWTV9ERUJVR19SRUZfQ09VTlRFUihvdXQpOworCQlvdXQgPDwgRU9MOworCX0KKwllbHNlIGlmKCBhcmcuaXM8IEJhc2VJbnN0YW5jZUZvcm0gPigpICkKKwl7CisJCW91dCA8PCBUQUIgLy88PCAiJiIKKwkJCQk8PCBhcmcudG9fcHRyPCBCYXNlSW5zdGFuY2VGb3JtID4oKS0+Z2V0UXVhbGlmaWVkTmFtZUlEKCk7CisJCWFyZy5BVk1fREVCVUdfUkVGX0NPVU5URVIob3V0KTsKKwkJb3V0IDw8IEVPTDsKKwl9CisJZWxzZSBpZiggYXJnLmlzPCBCZWhhdmlvcmFsRWxlbWVudCA+KCkgKQorCXsKKwkJb3V0IDw8IFRBQiA8PCAiJiIKKwkJCTw8IGFyZy50b19wdHI8IEJlaGF2aW9yYWxFbGVtZW50ID4oKS0+Z2V0UXVhbGlmaWVkTmFtZUlEKCk7CisJCWFyZy5BVk1fREVCVUdfUkVGX0NPVU5URVIob3V0KTsKKwkJb3V0IDw8IEVPTDsKKwl9CisKKwllbHNlIGlmKCBXT2JqZWN0TWFuYWdlcjo6aXMoIGFyZyApICkKKwl7CisJCW91dCA8PCBUQUIgPDwgIiYiCisJCQk8PCBXT2JqZWN0TWFuYWdlcjo6ZnJvbSggYXJnICktPmdldFF1YWxpZmllZE5hbWVJRCgpOworCQlhcmcuQVZNX0RFQlVHX1JFRl9DT1VOVEVSKG91dCk7CisJCW91dCA8PCBFT0w7CisJfQorCisJZWxzZSBpZiggYXJnLmlzPCBVbmlGb3JtSWRlbnRpZmllciA+KCkgKQorCXsKKwkJb3V0IDw8IFRBQiA8PCBhcmcudG9fcHRyPCBVbmlGb3JtSWRlbnRpZmllciA+KCktPnN0cigpIDw8IEVPTDsKKwl9CisKKwllbHNlIGlmKCBhcmcuaXM8IFJ1bnRpbWVJRCA+KCkgKQorCXsKKwkJb3V0IDw8IFRBQiA8PCBhcmcuYmZSSUQoKS5zdHIoKSA8PCBFT0w7CisJfQorCisJZWxzZSBpZiggYXJnLmlzX2V4YWN0bHk8IEF2bVByb2dyYW0gPigpICkKKwl7CisJCUF2bVByb2dyYW0gKiBhUHJvZyA9IGFyZy50b19wdHI8IEF2bVByb2dyYW0gPigpOworCQlpZiggYVByb2ctPmlzQW5vbnltKCkgKQorCQl7CisJCQlhUHJvZy0+dG9TdHJlYW0ob3V0KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW91dCA8PCBUQUIgPDwgYVByb2ctPmdldFF1YWxpZmllZE5hbWVJRCgpOworCQkJYXJnLkFWTV9ERUJVR19SRUZfQ09VTlRFUihvdXQpOworCQkJb3V0IDw8IEVPTDsKKwkJfQorCX0KKworCWVsc2UgaWYoIGFyZy5pczwgQmFzZVR5cGVTcGVjaWZpZXIgPigpICkKKwl7CisJCW91dCA8PCBUQUIgPDwgYXJnLnRvX3B0cjwgQmFzZVR5cGVTcGVjaWZpZXIgPigpLT5zdHJUKCk7CisJCWFyZy5BVk1fREVCVUdfUkVGX0NPVU5URVIob3V0KTsKKwkJb3V0IDw8IEVPTDsKKwl9CisKKwllbHNlIGlmKCBhcmcuaXM8IE9iamVjdEVsZW1lbnQgPigpICkKKwl7CisJCW91dCA8PCBUQUIgPDwgIiYiCisJCQk8PCBhcmcudG9fcHRyPCBPYmplY3RFbGVtZW50ID4oKS0+Z2V0UXVhbGlmaWVkTmFtZUlEKCk7CisJCWFyZy5BVk1fREVCVUdfUkVGX0NPVU5URVIob3V0KTsKKwkJb3V0IDw8IEVPTDsKKwl9CisKKwllbHNlIGlmKCBhcmcuaXM8IEJ1aWx0aW5BcnJheSA+KCkgKQorCXsKKwkJYXJnLnRvX3B0cjwgQnVpbHRpbkFycmF5ID4oKS0+dG9TdHJlYW0ob3V0KTsKKwl9CisKKwllbHNlCisJeworCQlhcmcudG9TdHJlYW0oIG91dCApOworCX0KK30KKworCit2b2lkIEF2bUNvZGU6OnByZXR0eVByaW50ZXIoT3V0U3RyZWFtICYgb3V0LAorCQljb25zdCBCRiAmIGFyZywgQmFzZVR5cGVTcGVjaWZpZXIgKiBhVHlwZSkKK3sKKwlpZiggYVR5cGUgIT0gTlVMTCApCisJeworCQlhVHlwZS0+Zm9ybWF0U3RyZWFtKG91dCwgYXJnKTsKKwl9CisJZWxzZQorCXsKKwkJcHJldHR5UHJpbnRlcihvdXQsIGFyZywgZmFsc2UpOworCX0KK30KKworCit2b2lkIEF2bUNvZGU6OnByZXR0eVByaW50ZXJDb25kaXRpb24oT3V0U3RyZWFtICYgb3V0LCBjb25zdCBCRiAmIGFyZykKK3sKKwlvdXQgPDwgQVZNX1NUUl9JTkRFTlQ7CisKKwlpZiggYXJnLmlzPCBBdm1Db2RlID4oKSApCisJeworCQlhcmcudG9fcHRyPCBBdm1Db2RlID4oKS0+cHJldHR5UHJpbnRlciggb3V0ICwgZmFsc2UgKTsKKwl9CisJZWxzZQorCXsKKwkJcHJldHR5UHJpbnRlcihvdXQgPDwgIiggIiwgYXJnLCBmYWxzZSk7CisJCW91dCA8PCAiICkiOworCX0KKworCW91dCA8PCBFTkRfSU5ERU5UOworfQorCisKK3ZvaWQgQXZtQ29kZTo6cHJldHR5UHJpbnRlckJsb2NrKE91dFN0cmVhbSAmIG91dCwgY29uc3QgQkYgJiBhcmcpCit7CisJaWYoIGFyZy5pczwgQXZtQ29kZSA+KCkgKQorCXsKKwkJaWYoIE9wZXJhdG9yTWFuYWdlcjo6aXNTY2hlZHVsZShhcmcudG9fcHRyPCBBdm1Db2RlID4oKS0+bU9wZXJhdG9yKSApCisJCXsKKwkJCWFyZy50b19wdHI8IEF2bUNvZGUgPigpLT5wcmV0dHlQcmludGVyKCBvdXQsIHRydWUgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW91dCA8PCBUQUIgPDwgInsiIDw8IEVPTF9JTkNSX0lOREVOVDsKKwkJCWFyZy50b19wdHI8IEF2bUNvZGUgPigpLT5wcmV0dHlQcmludGVyKCBvdXQsIHRydWUgKTsKKwkJCW91dCA8PCBERUNSX0lOREVOVF9UQUIgPDwgIn0iIDw8IEVPTDsKKwkJfQorCX0KKwllbHNlCisJeworCQlvdXQgPDwgVEFCIDw8ICJ7IiA8PCBFT0xfSU5DUl9JTkRFTlQ7CisJCXByZXR0eVByaW50ZXIob3V0LCBhcmcsIHRydWUpOworCQlvdXQgPDwgREVDUl9JTkRFTlRfVEFCIDw8ICJ9IiA8PCBFT0w7CisJfQorfQorCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL0F2bUNvZGUuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL0F2bUNvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmNlNGYxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4cHJlc3Npb24vQXZtQ29kZS5oCkBAIC0wLDAgKzEsMTE4MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBBVk1DT0RFX0hfCisjZGVmaW5lIEFWTUNPREVfSF8KKworI2luY2x1ZGUgPGNvbW1vbi9Bdm1Qb2ludGVyLmg+CisjaW5jbHVkZSA8Y29tbW9uL0VsZW1lbnQuaD4KKworLy8jaW5jbHVkZSA8Y29sbGVjdGlvbi9CRkNvbnRhaW5lci5oPgorI2luY2x1ZGUgPGNvbGxlY3Rpb24vTGlzdC5oPgorI2luY2x1ZGUgPGNvbGxlY3Rpb24vVmVjdG9yLmg+CisKKyNpbmNsdWRlIDxjb21wdXRlci9pbnN0cnVjdGlvbi9Bdm1JbnN0cnVjdGlvbi5oPgorCisKKyNpbmNsdWRlIDxmbWwvb3BlcmF0b3IvT3BlcmF0b3IuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKK2NsYXNzIEJhc2VUeXBlU3BlY2lmaWVyOworCisKK2NsYXNzIEF2bUNvZGUgOgorCQlwdWJsaWMgRWxlbWVudCAsCisJCXB1YmxpYyBWZWN0b3I8IEJGID4gLAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIEF2bUNvZGUgKQoreworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIEF2bUNvZGUgKQorCitwdWJsaWM6CisJLyoqCisJICogVFlQRURFRgorCSAqLworCXR5cGVkZWYgVmVjdG9yPCBCRiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX2NvbnRhaW5lcl90eXBlOworCisJdHlwZWRlZiB0aGlzX2NvbnRhaW5lcl90eXBlOjpjb25zdF9pdGVyYXRvciAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworCisJdHlwZWRlZiB0aGlzX2NvbnRhaW5lcl90eXBlOjppdGVyYXRvciAgICAgICAgICAgICAgIGl0ZXJhdG9yOworCisJdHlwZWRlZiB0aGlzX2NvbnRhaW5lcl90eXBlOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKwl0eXBlZGVmIHRoaXNfY29udGFpbmVyX3R5cGU6OnJldmVyc2VfaXRlcmF0b3IgICAgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKworCXR5cGVkZWYgdGhpc19jb250YWluZXJfdHlwZTo6c2l6ZV90eXBlICAgICAgICAgICAgICBzaXplX3R5cGU7CisKKworcHJvdGVjdGVkOgorCS8qCisJICogQVRUUklCVVRFUworCSAqLworCU9wZXJhdG9yICogbU9wZXJhdG9yOworCisJQXZtSW5zdHJ1Y3Rpb24gKiBtSW5zdHJ1Y3Rpb247CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUF2bUNvZGUoKQorCTogRWxlbWVudCggQ0xBU1NfS0lORF9UKCBBdm1Db2RlICkgKSwKKwl0aGlzX2NvbnRhaW5lcl90eXBlKCksCisJbU9wZXJhdG9yKCBOVUxMICksCisJbUluc3RydWN0aW9uKCBOVUxMICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCUF2bUNvZGUoY29uc3QgQXZtQ29kZSAmIGFuRWxlbWVudCkKKwk6IEVsZW1lbnQoIGFuRWxlbWVudCApLAorCXRoaXNfY29udGFpbmVyX3R5cGUoIGFuRWxlbWVudCApLAorCW1PcGVyYXRvciggYW5FbGVtZW50Lm1PcGVyYXRvciApLAorCW1JbnN0cnVjdGlvbiggKGFuRWxlbWVudC5tSW5zdHJ1Y3Rpb24gPT0gTlVMTCkgPyBOVUxMCisJCQk6IG5ldyBBdm1JbnN0cnVjdGlvbiggKihhbkVsZW1lbnQubUluc3RydWN0aW9uKSApICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBPdGhlcnMKKwkgKi8KKwlBdm1Db2RlKE9wZXJhdG9yICogYW5PcGVyYXRvcikKKwk6IEVsZW1lbnQoIENMQVNTX0tJTkRfVCggQXZtQ29kZSApICksCisJdGhpc19jb250YWluZXJfdHlwZSggKSwKKwltT3BlcmF0b3IoIGFuT3BlcmF0b3IgKSwKKwltSW5zdHJ1Y3Rpb24oIE5VTEwgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJQXZtQ29kZShPcGVyYXRvciAqIGFuT3BlcmF0b3IsIGNvbnN0IEJGICYgYXJnKQorCTogRWxlbWVudCggQ0xBU1NfS0lORF9UKCBBdm1Db2RlICkgKSwKKwl0aGlzX2NvbnRhaW5lcl90eXBlKCBhcmcgKSwKKwltT3BlcmF0b3IoIGFuT3BlcmF0b3IgKSwKKwltSW5zdHJ1Y3Rpb24oIE5VTEwgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJQXZtQ29kZShPcGVyYXRvciAqIGFuT3BlcmF0b3IsIGNvbnN0IEJGICYgYXJnMSwgY29uc3QgQkYgJiBhcmcyKQorCTogRWxlbWVudCggQ0xBU1NfS0lORF9UKCBBdm1Db2RlICkgKSwKKwl0aGlzX2NvbnRhaW5lcl90eXBlKCBhcmcxICwgYXJnMiApLAorCW1PcGVyYXRvciggYW5PcGVyYXRvciApLAorCW1JbnN0cnVjdGlvbiggTlVMTCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlBdm1Db2RlKE9wZXJhdG9yICogYW5PcGVyYXRvciwgY29uc3QgQkYgJiBhcmcxLAorCQkJY29uc3QgQkYgJiBhcmcyLCBjb25zdCBCRiAmIGFyZzMpCisJOiBFbGVtZW50KCBDTEFTU19LSU5EX1QoIEF2bUNvZGUgKSApLAorCXRoaXNfY29udGFpbmVyX3R5cGUoIGFyZzEgLCBhcmcyICwgYXJnMyApLAorCW1PcGVyYXRvciggYW5PcGVyYXRvciApLAorCW1JbnN0cnVjdGlvbiggTlVMTCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlBdm1Db2RlKE9wZXJhdG9yICogYW5PcGVyYXRvciwgY29uc3QgQkYgJiBhcmcxLAorCQkJY29uc3QgQkYgJiBhcmcyLCBjb25zdCBCRiAmIGFyZzMsIGNvbnN0IEJGICYgYXJnNCkKKwk6IEVsZW1lbnQoIENMQVNTX0tJTkRfVCggQXZtQ29kZSApICksCisJdGhpc19jb250YWluZXJfdHlwZSggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApLAorCW1PcGVyYXRvciggYW5PcGVyYXRvciApLAorCW1JbnN0cnVjdGlvbiggTlVMTCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlBdm1Db2RlKE9wZXJhdG9yICogYW5PcGVyYXRvciwgY29uc3QgQkYgJiBhcmcxLCBjb25zdCBCRiAmIGFyZzIsCisJCQljb25zdCBCRiAmIGFyZzMsIGNvbnN0IEJGICYgYXJnNCwgY29uc3QgQkYgJiBhcmc1KQorCTogRWxlbWVudCggQ0xBU1NfS0lORF9UKCBBdm1Db2RlICkgKSwKKwl0aGlzX2NvbnRhaW5lcl90eXBlKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSApLAorCW1PcGVyYXRvciggYW5PcGVyYXRvciApLAorCW1JbnN0cnVjdGlvbiggTlVMTCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5Bdm1Db2RlKCkKKwl7CisJCWRlbGV0ZSAoIG1JbnN0cnVjdGlvbiApOworCX0KKworCisJLyoqCisJICogR0VUVEVSCisJICogdGhpc19jb250YWluZXJfdHlwZQorCSAqLworCWlubGluZSB0aGlzX2NvbnRhaW5lcl90eXBlICYgZ2V0QXJncygpCisJeworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJaW5saW5lIGNvbnN0IHRoaXNfY29udGFpbmVyX3R5cGUgJiBnZXRBcmdzKCkgY29uc3QKKwl7CisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKworCS8qKgorCSAqIEFQUEVORAorCSAqIHRoaXNfY29udGFpbmVyX3R5cGUKKwkgKi8KKwlpbmxpbmUgdm9pZCBhcHBlbmQoY29uc3QgQkYgJiBhbkVsZW1lbnQpCisJeworLy8JCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggaXNVbmlxdWUoKSApCisvLwkJCQk8PCAiSUxMRUdBTCBNT0RJRklDQVRJT04gT0YgQSBOT04gVU5JUVVFIFJFRkVSRU5DRSA6PiAiCisvLwkJCQk8PCBzdHJSZWZDb3VudCgpIDw8ICIgIiA8PCBzdHIoKSA8PCAiICEhISIgISEhIgorLy8JCQkJPDwgU0VORF9FWElUOworCisJCXRoaXNfY29udGFpbmVyX3R5cGU6OmFwcGVuZCggYW5FbGVtZW50ICk7CisJfQorCisJaW5saW5lIHZvaWQgYXBwZW5kKGNvbnN0IHRoaXNfY29udGFpbmVyX3R5cGUgJiBhbkVsZW1lbnQpCisJeworLy8JCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggaXNVbmlxdWUoKSApCisvLwkJCQk8PCAiSUxMRUdBTCBNT0RJRklDQVRJT04gT0YgQSBOT04gVU5JUVVFIFJFRkVSRU5DRSA6PiAiCisvLwkJCQk8PCBzdHJSZWZDb3VudCgpIDw8ICIgIiA8PCBzdHIoKSA8PCAiICEhISIKKy8vCQkJCTw8IFNFTkRfRVhJVDsKKworCQl0aGlzX2NvbnRhaW5lcl90eXBlOjphcHBlbmQoIGFuRWxlbWVudCApOworCX0KKworCWlubGluZSB2b2lkIGFwcGVuZFRhaWwoY29uc3QgdGhpc19jb250YWluZXJfdHlwZSAmIGFuRWxlbWVudCkKKwl7CisvLwkJQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKCBpc1VuaXF1ZSgpICkKKy8vCQkJCTw8ICJJTExFR0FMIE1PRElGSUNBVElPTiBPRiBBIE5PTiBVTklRVUUgUkVGRVJFTkNFIDo+ICIKKy8vCQkJCTw8IHN0clJlZkNvdW50KCkgPDwgIiAiIDw8IHN0cigpIDw8ICIgISEhIgorLy8JCQkJPDwgU0VORF9FWElUOworCisJCXRoaXNfY29udGFpbmVyX3R5cGU6OmFwcGVuZFRhaWwoIGFuRWxlbWVudCApOworCX0KKworCWlubGluZSB2b2lkIGFwcGVuZChjb25zdCBMaXN0PCBCRiA+ICYgYW5FbGVtZW50KQorCXsKKy8vCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoIGlzVW5pcXVlKCkgKQorLy8JCQkJPDwgIklMTEVHQUwgTU9ESUZJQ0FUSU9OIE9GIEEgTk9OIFVOSVFVRSBSRUZFUkVOQ0UgOj4gIgorLy8JCQkJPDwgc3RyUmVmQ291bnQoKSA8PCAiICIgPDwgc3RyKCkgPDwgIiAhISEiCisvLwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJdGhpc19jb250YWluZXJfdHlwZTo6YXBwZW5kKCBhbkVsZW1lbnQgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBhcHBlbmQoY29uc3QgTGlzdDwgQkZDb2RlID4gJiBhbkVsZW1lbnQpCisJeworLy8JCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggaXNVbmlxdWUoKSApCisvLwkJCQk8PCAiSUxMRUdBTCBNT0RJRklDQVRJT04gT0YgQSBOT04gVU5JUVVFIFJFRkVSRU5DRSA6PiAiCisvLwkJCQk8PCBzdHJSZWZDb3VudCgpIDw8ICIgIiA8PCBzdHIoKSA8PCAiICEhISIKKy8vCQkJCTw8IFNFTkRfRVhJVDsKKworCQl0aGlzX2NvbnRhaW5lcl90eXBlOjphcHBlbmQoIGFuRWxlbWVudCApOworCX0KKworCisJaW5saW5lIHZvaWQgYXBwZW5kRmxhdChjb25zdCBCRiAmIGFuRWxlbWVudCkKKwl7CisJCWlmKCBhbkVsZW1lbnQuaXM8IEF2bUNvZGUgPigpCisJCQkmJiBnZXRPcGVyYXRvcigpLT5pc1dlYWtBc3NvY2lhdGl2ZSgpCisJCQkmJiAoYW5FbGVtZW50LnRvX3B0cjwgQXZtQ29kZSA+KCktPmdldE9wZXJhdG9yKCkgPT0gZ2V0T3BlcmF0b3IoKSkgKQorCQl7CisJCQlhcHBlbmQoIGFuRWxlbWVudC50b19wdHI8IEF2bUNvZGUgPigpLT5nZXRBcmdzKCkgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWFwcGVuZCggYW5FbGVtZW50ICk7CisJCX0KKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIGZvciBlbGVtZW50IG9mIHRoaXNfY29udGFpbmVyX3R5cGUKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCBCRiAmIGF0KGF2bV9zaXplX3Qgb2Zmc2V0KQorCXsKKwkJcmV0dXJuKCB0aGlzX2NvbnRhaW5lcl90eXBlOjphdChvZmZzZXQpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgY29uc3QgQkYgJiBhdChhdm1fc2l6ZV90IG9mZnNldCkgY29uc3QKKwl7CisJCXJldHVybiggdGhpc19jb250YWluZXJfdHlwZTo6YXQob2Zmc2V0KSApOworCX0KKworCisJaW5saW5lIEF2bUNvZGUgKiBjb2RlQXQoYXZtX3NpemVfdCBvZmZzZXQpCisJeworCQlyZXR1cm4oIHRoaXNfY29udGFpbmVyX3R5cGU6OmF0KG9mZnNldCkuYXNfcHRyPCBBdm1Db2RlID4oKSApOworCX0KKworCWlubGluZSBjb25zdCBBdm1Db2RlICogY29kZUF0KGF2bV9zaXplX3Qgb2Zmc2V0KSBjb25zdAorCXsKKwkJcmV0dXJuKCB0aGlzX2NvbnRhaW5lcl90eXBlOjphdChvZmZzZXQpLmFzX3B0cjwgQXZtQ29kZSA+KCkgKTsKKwl9CisKKworCXZpcnR1YWwgQkYgJiBvcGVyYXRvcltdKGF2bV9zaXplX3Qgb2Zmc2V0KQorCXsKKwkJcmV0dXJuKCB0aGlzX2NvbnRhaW5lcl90eXBlOjpvcGVyYXRvcltdKG9mZnNldCkgKTsKKwl9CisKKwl2aXJ0dWFsIGNvbnN0IEJGICYgb3BlcmF0b3JbXShhdm1fc2l6ZV90IG9mZnNldCkgY29uc3QKKwl7CisJCXJldHVybiggdGhpc19jb250YWluZXJfdHlwZTo6b3BlcmF0b3JbXShvZmZzZXQpICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBCRiAmIGdldFdyaXRhYmxlKGF2bV9zaXplX3Qgb2Zmc2V0KQorCXsKKwkJdGhpc19jb250YWluZXJfdHlwZTo6YXQob2Zmc2V0KS5tYWtlV3JpdGFibGUoKTsKKworCQlyZXR1cm4oIHRoaXNfY29udGFpbmVyX3R5cGU6Om9wZXJhdG9yW10ob2Zmc2V0KSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgbWFrZVdyaXRhYmxlKGF2bV9zaXplX3Qgb2Zmc2V0KQorCXsKKwkJdGhpc19jb250YWluZXJfdHlwZTo6YXQob2Zmc2V0KS5tYWtlV3JpdGFibGUoKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIHZvaWQgc2FmZV9zZXQoYXZtX3NpemVfdCBpbmRleCwgY29uc3QgQkYgJiBhbkVsZW1lbnQpCisJeworCQl0aGlzX2NvbnRhaW5lcl90eXBlOjpvcGVyYXRvcltdKGluZGV4KSA9IGFuRWxlbWVudDsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHNldChhdm1fc2l6ZV90IGluZGV4LCBjb25zdCBCRiAmIGFuRWxlbWVudCkKKwl7CisvLwkJQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKCBpc1VuaXF1ZSgpICkKKy8vCQkJCTw8ICJJTExFR0FMIE1PRElGSUNBVElPTiBPRiBBIE5PTiBVTklRVUUgUkVGRVJFTkNFIDo+ICIKKy8vCQkJCTw8IHN0clJlZkNvdW50KCkgPDwgIiAiIDw8IHN0cigpIDw8ICIgISEhIgorLy8JCQkJPDwgU0VORF9FWElUOworCisJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQkvLyEhISBPUFRJTUlTQVRJT04KKwkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLwkJdGhpc19jb250YWluZXJfdHlwZTo6c2V0KGluZGV4LCBhbkVsZW1lbnQpOworCisJCUFWTV9PU19BU1NFUlRfRkFUQUxfQVJSQVlfSU5ERVhfRVhJVCggaW5kZXggLCBzaXplKCkgKQorCQkJCTw8IFNFTkRfRVhJVDsKKworCQl0aGlzX2NvbnRhaW5lcl90eXBlOjpvcGVyYXRvcltdKGluZGV4KSA9IGFuRWxlbWVudDsKKwl9CisKKwlpbmxpbmUgYXZtX3NpemVfdCBzaXplKCkgY29uc3QKKwl7CisJCXJldHVybiggdGhpc19jb250YWluZXJfdHlwZTo6c2l6ZSgpICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBmb3IgbU9wZXJhdG9yCisJICovCisJaW5saW5lIE9wZXJhdG9yICogZ2V0T3BlcmF0b3IoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtT3BlcmF0b3IgKTsKKwl9CisKKwlpbmxpbmUgQVZNX09QQ09ERSBnZXRBdm1PcENvZGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtT3BlcmF0b3ItPmdldEF2bU9wQ29kZSgpICk7CisJfQorCisJaW5saW5lIEFWTV9PUENPREUgZ2V0T3B0aW1pemVkT3BDb2RlKCkgY29uc3QKKwl7CisJCXJldHVybiggbU9wZXJhdG9yLT5nZXRPcHRpbWl6ZWRPcENvZGUoKSApOworCX0KKworCWlubGluZSBhdm1fb2Zmc2V0X3QgZ2V0T3BPZmZzZXQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtT3BlcmF0b3ItPmdldE9mZnNldCgpICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBoYXNPcGVyYXRvcigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1PcGVyYXRvciAhPSBOVUxMICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNPcGVyYXRvcihPcGVyYXRvciAqIG9wKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtT3BlcmF0b3ItPmlzRVEoIG9wICkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc25vdE9wZXJhdG9yKE9wZXJhdG9yICogb3ApIGNvbnN0CisJeworCQlyZXR1cm4oIG1PcGVyYXRvci0+aXNORVEoIG9wICkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc09wQ29kZShBVk1fT1BDT0RFIG9wQ29kZSkgY29uc3QKKwl7CisJCXJldHVybiggbU9wZXJhdG9yLT5pc09wQ29kZSggb3BDb2RlICkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNPcENvZGUoQVZNX09QQ09ERSBvcENvZGUxLCBBVk1fT1BDT0RFIG9wQ29kZTIpIGNvbnN0CisJeworCQlyZXR1cm4oIG1PcGVyYXRvci0+aGFzT3BDb2RlKCBvcENvZGUxICwgb3BDb2RlMiApICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzT3BDb2RlKEFWTV9PUENPREUgb3BDb2RlMSwKKwkJCUFWTV9PUENPREUgb3BDb2RlMiwgQVZNX09QQ09ERSBvcENvZGUzKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtT3BlcmF0b3ItPmhhc09wQ29kZSggb3BDb2RlMSAsIG9wQ29kZTIgLCBvcENvZGUzICkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc09wQ29kZShPcGVyYXRvciAqIG9wKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtT3BlcmF0b3ItPmlzT3BDb2RlKCBvcCApICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNPcHRpbWl6ZWRPcENvZGUoQVZNX09QQ09ERSBvcENvZGUpIGNvbnN0CisJeworCQlyZXR1cm4oIG1PcGVyYXRvci0+aXNPcHRpbWl6ZWRPcENvZGUoIG9wQ29kZSApICk7CisJfQorCisJaW5saW5lIGJvb2wgc2FtZU9wZXJhdG9yKGNvbnN0IEF2bUNvZGUgJiBhQ29kZSkgY29uc3QKKwl7CisJCXJldHVybiggbU9wZXJhdG9yLT5pc0VRKCBhQ29kZS5tT3BlcmF0b3IgKSApOworCX0KKworCWlubGluZSBib29sIHNhbWVPcGVyYXRvcihBdm1Db2RlICogYUNvZGUpIGNvbnN0CisJeworCQlyZXR1cm4oIG1PcGVyYXRvci0+aXNFUSggYUNvZGUtPm1PcGVyYXRvciApICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBpc25vdE9wQ29kZShBVk1fT1BDT0RFIG9wQ29kZSkgY29uc3QKKwl7CisJCXJldHVybiggbU9wZXJhdG9yLT5pc25vdE9wQ29kZSggb3BDb2RlICkgKTsKKwl9CisKKworCWlubGluZSB2b2lkIHNldE9wZXJhdG9yKE9wZXJhdG9yICogYW5PcGVyYXRvcikKKwl7CisJCW1PcGVyYXRvciA9IGFuT3BlcmF0b3I7CisJfQorCisJaW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nICYgc3RyT3BlcmF0b3IoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtT3BlcmF0b3ItPnN0YW5kYXJkU3ltYm9sKCkgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIGZvciBtSW5zdHJ1Y3Rpb24KKwkgKi8KKwlpbmxpbmUgQXZtSW5zdHJ1Y3Rpb24gKiBnZXRJbnN0cnVjdGlvbigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1JbnN0cnVjdGlvbiApOworCX0KKworCWlubGluZSBib29sIGhhc0luc3RydWN0aW9uKCkgY29uc3QKKwl7CisJCXJldHVybiggbUluc3RydWN0aW9uICE9IE5VTEwgKTsKKwl9CisKKworCWlubGluZSBBdm1JbnN0cnVjdGlvbiAqIG5ld0VtcHR5SW5zdHJ1Y3Rpb24oKQorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKCBtSW5zdHJ1Y3Rpb24gPT0gTlVMTCApCisJCQkJPDwgIlVuZXhwZWN0ZWQgYSBjb2RlIHdpdGggQXZtSW5zdHJ1Y3Rpb246ICIKKwkJCQk8PCB0b1N0cmluZ1dpdGhCeXRlY29kZSgpCisJCQkJPDwgU0VORF9FWElUOworCisJCXJldHVybiggbUluc3RydWN0aW9uID0gbmV3IEF2bUluc3RydWN0aW9uKCkgKTsKKwl9CisKKwlpbmxpbmUgQXZtSW5zdHJ1Y3Rpb24gKiBuZXdJbnN0cnVjdGlvbihhdm1fc2l6ZV90IGFTaXplKQorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKCBtSW5zdHJ1Y3Rpb24gPT0gTlVMTCApCisJCQkJPDwgIlVuZXhwZWN0ZWQgYSBjb2RlIHdpdGggQXZtSW5zdHJ1Y3Rpb246ICIKKwkJCQk8PCB0b1N0cmluZ1dpdGhCeXRlY29kZSgpCisJCQkJPDwgU0VORF9FWElUOworCisJCXJldHVybiggbUluc3RydWN0aW9uID0gbmV3IEF2bUluc3RydWN0aW9uKCBhU2l6ZSApICk7CisJfQorCisJaW5saW5lIEF2bUluc3RydWN0aW9uICogZ2VuSW5zdHJ1Y3Rpb24oKQorCXsKKwkJcmV0dXJuKCBuZXdJbnN0cnVjdGlvbiggc2l6ZSgpICkgKTsKKwl9CisKKworCWlubGluZSB2b2lkIHNldEluc3RydWN0aW9uKEF2bUluc3RydWN0aW9uICogYW5JbnN0cnVjdGlvbikKKwl7CisJCW1JbnN0cnVjdGlvbiA9IGFuSW5zdHJ1Y3Rpb247CisJfQorCisKKwkvKioKKwkgKiBDT01QQVJJU09OCisJICogT1BFUkFUT1IKKwkgKi8KKwlpbnQgY29tcGFyZShjb25zdCBBdm1Db2RlICYgb3RoZXIpIGNvbnN0OworCisJaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBBdm1Db2RlICYgb3RoZXIpIGNvbnN0CisJeworCQlyZXR1cm4oIEF2bUNvZGU6OmlzRVEoIG90aGVyICkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBvcGVyYXRvcj09KEF2bUNvZGUgKiBvdGhlcikgY29uc3QKKwl7CisJCXJldHVybiggKG90aGVyICE9IE5VTEwpICYmIEF2bUNvZGU6OmlzRVEoICpvdGhlciApICk7CisJfQorCisJaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBBdm1Db2RlICYgb3RoZXIpIGNvbnN0CisJeworCQlyZXR1cm4oICh0aGlzICE9ICZvdGhlcikgJiYgKG5vdCBBdm1Db2RlOjppc0VRKCBvdGhlciApKSApOworCX0KKworCWlubGluZSBib29sIG9wZXJhdG9yIT0oQXZtQ29kZSAqIG90aGVyKSBjb25zdAorCXsKKwkJcmV0dXJuKCAob3RoZXIgPT0gTlVMTCkKKwkJCQl8fCAoKHRoaXMgIT0gb3RoZXIpCisJCQkJCSYmIChub3QgQXZtQ29kZTo6aXNFUSggKm90aGVyICkgKSApICk7CisJfQorCisKKwlib29sIGlzRVEoY29uc3QgQXZtQ29kZSAmIG90aGVyKSBjb25zdDsKKworCWlubGluZSBib29sIGlzRVEoQXZtQ29kZSAqIG90aGVyKSBjb25zdAorCXsKKwkJcmV0dXJuKCAob3RoZXIgIT0gTlVMTCkgJiYgQXZtQ29kZTo6aXNFUSggKm90aGVyICkgKTsKKwl9CisKKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwlzdGQ6OnN0cmluZyBzdHJEZWJ1Zyhjb25zdCBBdm1JbmRlbnQgJiBpbmRlbnQgPSBBVk1fU1BDX0lOREVOVCkgY29uc3QKKwl7CisJCVN0cmluZ091dFN0cmVhbSBvc3MoaW5kZW50KTsKKworCQl0b0RlYnVnKCBvc3MgKTsKKworCQlyZXR1cm4oIG9zcy5zdHIoKSApOworCX0KKworCU91dFN0cmVhbSAmIHRvRGVidWcoT3V0U3RyZWFtICYgb3V0KSBjb25zdDsKKworCU91dFN0cmVhbSAmIHRvU3RyZWFtV2l0aEJ5dGVjb2RlKE91dFN0cmVhbSAmIG91dCkgY29uc3Q7CisKKwlzdGQ6OnN0cmluZyB0b1N0cmluZ1dpdGhCeXRlY29kZSgKKwkJCWNvbnN0IEF2bUluZGVudCAmIGluZGVudCA9IEFWTV9UQUJfSU5ERU5UKSBjb25zdAorCXsKKwkJU3RyaW5nT3V0U3RyZWFtIG9zcyhpbmRlbnQpOworCisJCXRvU3RyZWFtV2l0aEJ5dGVjb2RlKCBvc3MgKTsKKworCQlyZXR1cm4oIG9zcy5zdHIoKSApOworCX0KKworCU91dFN0cmVhbSAmIHRvU3RyZWFtUm91dGluZShPdXRTdHJlYW0gJiBvdXQpIGNvbnN0OworCisKKwl2b2lkIHRvU3RyZWFtUHJlZml4KE91dFN0cmVhbSAmIG91dCwgYm9vbCBwcmludEVPTCA9IHRydWUpIGNvbnN0OworCisJc3RhdGljIHZvaWQgdG9TdHJlYW1QcmVmaXgoT3V0U3RyZWFtICYgb3V0LCBjb25zdCBCRiAmIGFyZyk7CisKKworCWlubGluZSBzdGF0aWMgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvdXQsIGNvbnN0IEJGICYgYXJnKQorCXsKKy8vCQl0b1N0cmVhbVByZWZpeChvdXQsIGFyZyk7CisKKwkJcHJldHR5UHJpbnRlcihvdXQsIGFyZyk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvdXQpIGNvbnN0CisJeworQVZNX0lGX0RFQlVHX0ZMQUcoIEJZVEVDT0RFICkKKworCXRvU3RyZWFtUHJlZml4KCBvdXQgKTsKKworCXJldHVybjsKKworQVZNX0VORElGX0RFQlVHX0ZMQUcoIEJZVEVDT0RFICkKKworCQlwcmV0dHlQcmludGVyKCBvdXQgKTsKKwl9CisKKworCS8qKgorCSAqIFBSRVRUWSBQUklOVEVSCisJICovCisJdm9pZCBwcmV0dHlQcmludGVyKE91dFN0cmVhbSAmIG91dCwgYm9vbCBpc1N0YXRlbWVudCA9IHRydWUpIGNvbnN0OworCisJdm9pZCBwcmV0dHlQcmludGVyQmFzaWNTdGF0ZW1lbnQoCisJCQlPdXRTdHJlYW0gJiBvdXQsIGJvb2wgaXNTdGF0ZW1lbnQgPSB0cnVlKSBjb25zdDsKKworCXZvaWQgcHJldHR5UHJpbnRlckJsb2NrU3RhdGVtZW50KAorCQkJT3V0U3RyZWFtICYgb3V0LCBib29sIGlzU3RhdGVtZW50ID0gdHJ1ZSkgY29uc3Q7CisKKwl2b2lkIHByZXR0eVByaW50ZXJEZWZhdWx0KE91dFN0cmVhbSAmIG91dCwgYm9vbCBpc1N0YXRlbWVudCA9IHRydWUpIGNvbnN0OworCisJdm9pZCBwcmV0dHlQcmludGVyRnVuY3Rpb25hbChPdXRTdHJlYW0gJiBvdXQpIGNvbnN0OworCXZvaWQgcHJldHR5UHJpbnRlckluZml4KE91dFN0cmVhbSAmIG91dCkgY29uc3Q7CisJdm9pZCBwcmV0dHlQcmludGVyUHJlZml4KE91dFN0cmVhbSAmIG91dCkgY29uc3Q7CisJdm9pZCBwcmV0dHlQcmludGVyU3VmZml4KE91dFN0cmVhbSAmIG91dCkgY29uc3Q7CisKKwlzdGF0aWMgdm9pZCBwcmV0dHlQcmludGVyKE91dFN0cmVhbSAmIG91dCwKKwkJCWNvbnN0IEJGICYgYXJnLCBib29sIGlzU3RhdGVtZW50ID0gdHJ1ZSk7CisKKwlzdGF0aWMgdm9pZCBwcmV0dHlQcmludGVyKE91dFN0cmVhbSAmIG91dCwKKwkJCWNvbnN0IEJGICYgYXJnLCBCYXNlVHlwZVNwZWNpZmllciAqIGFUeXBlKTsKKworCXN0YXRpYyB2b2lkIHByZXR0eVByaW50ZXJDb25kaXRpb24oT3V0U3RyZWFtICYgb3V0LCBjb25zdCBCRiAmIGFyZyk7CisKKwlzdGF0aWMgdm9pZCBwcmV0dHlQcmludGVyQmxvY2soT3V0U3RyZWFtICYgb3V0LCBjb25zdCBCRiAmIGFyZyk7CisKKworCS8qKgorCSAqIHRvU3RyaW5nCisJICovCisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgdG9TdHJpbmcoCisJCQljb25zdCBBdm1JbmRlbnQgJiBpbmRlbnQgPSBBVk1fVEFCX0lOREVOVCkgY29uc3QKKwl7CisJCVN0cmluZ091dFN0cmVhbSBvc3MoaW5kZW50KTsKKworLy8JCXRvU3RyZWFtKG9zcyk7CisJCXByZXR0eVByaW50ZXIob3NzKTsKKworCQlyZXR1cm4oIG9zcy5zdHIoKSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHN0cigpIGNvbnN0CisJeworCQlTdHJpbmdPdXRTdHJlYW0gb3NzKCBBVk1fU1RSX0lOREVOVCApOworCisvLwkJdG9TdHJlYW0ob3NzKTsKKwkJcHJldHR5UHJpbnRlciggb3NzIDw8IElHTk9SRV9GSVJTVF9UQUIgKTsKKworCQlyZXR1cm4oIG9zcy5zdHIoKSApOworCX0KKworfTsKKworCisvKioKKyAqIG9wZXJhdG9yPDwKKyAqLworQVZNX09TX1NUUkVBTSggQXZtQ29kZSApCisKKworCisjZGVmaW5lIEFWTV9ERUJVR19CRkNPREVfUE9JTlRFUiAgdHJ1ZQorI3VuZGVmIEFWTV9ERUJVR19CRkNPREVfUE9JTlRFUgorCisjaWYgZGVmaW5lZChBVk1fREVCVUdfQkZDT0RFX1BPSU5URVIpCisKKy8vCSNkZWZpbmUgQVZNX0RFQ0xBUkVfREVCVUdfQkZDT0RFX1BUUiAgICAgICAgY29uc3QgQXZtQ29kZSAqIGRlYnVnUFRSOworLy8KKy8vCSNkZWZpbmUgQVZNX0lOSVRfREVCVUdfQkZDT0RFX1BUUiggcHRyICkgICAgLCBkZWJ1Z1BUUiggcHRyICkKKy8vCisvLwkjZGVmaW5lIEFWTV9BU1NJR05fU1RNTlRfREVCVUdfQkZDT0RFX1BUUiggcHRyICkgIGRlYnVnUFRSID0gcHRyOworLy8KKy8vCSNkZWZpbmUgQVZNX0FTU0lHTl9FWFBSX0RFQlVHX0JGQ09ERV9QVFIoIHB0ciApICAgZGVidWdQVFIgPSBwdHIKKworCisJI2RlZmluZSBBVk1fREVDTEFSRV9ERUJVR19CRkNPREVfUFRSICAgICAgICBwdWJsaWM6IHN0ZDo6c3RyaW5nIGRiZ1BUUjsKKworCisJI2RlZmluZSBBVk1fU1RSX0JGQ09ERV9QVFIoIHB0ciApICAoIChwdHIgIT0gTlVMTCkgPyBwdHItPnN0cigpIDogIkJGQ29kZTxudWxsPiIgKQorCisJI2RlZmluZSBBVk1fSU5JVF9ERUJVR19CRkNPREVfUFRSX05VTEwgICAgICAsIGRiZ1BUUiggIkJGQ29kZTxudWxsPiIgKQorCisJI2RlZmluZSBBVk1fSU5JVF9ERUJVR19CRkNPREVfUFRSKCBwdHIgKSAgICAsIGRiZ1BUUiggQVZNX1NUUl9CRkNPREVfUFRSKHB0cikgKQorCisJI2RlZmluZSBBVk1fQ09QWV9ERUJVR19CRkNPREVfUFRSKCBiZiApICAgICAsIGRiZ1BUUiggYmYuZGJnUFRSICkKKworCSNkZWZpbmUgQVZNX0FTU0lHTl9ERUJVR19CRkNPREVfUFRSKCBwdHIgKSAgZGJnUFRSID0gQVZNX1NUUl9CRkNPREVfUFRSKHB0cik7CisKKyNlbHNlCisKKwkjZGVmaW5lIEFWTV9ERUNMQVJFX0RFQlVHX0JGQ09ERV9QVFIKKworCSNkZWZpbmUgQVZNX0lOSVRfREVCVUdfQkZDT0RFX1BUUiggcHRyICkKKworCSNkZWZpbmUgQVZNX0FTU0lHTl9TVE1OVF9ERUJVR19CRkNPREVfUFRSKCBwdHIgKQorCisJI2RlZmluZSBBVk1fQVNTSUdOX0VYUFJfREVCVUdfQkZDT0RFX1BUUiggcHRyICkgIHB0cgorCisjZW5kaWYKKworCisKKworY2xhc3MgQkZDb2RlIDoKKwkJcHVibGljIEJGICwKKwkJQVZNX0lOSkVDVF9JTlNUQU5DRV9DT1VOVEVSX0NMQVNTKCBCRkNvZGUgKQoreworCisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBPbmx5IGZvciBkZWJ1ZyBmYWNpbGl0aWVzCisJICovCisJQVZNX0RFQ0xBUkVfREVCVUdfQkZDT0RFX1BUUgorCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQkZDb2RlKCkKKwk6IEJGKCkKKwlBVk1fSU5JVF9ERUJVR19CRkNPREVfUFRSKCBOVUxMICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCUJGQ29kZShjb25zdCBCRkNvZGUgJiBvdGhlcikKKwk6IEJGKCBvdGhlciApCisJQVZNX0lOSVRfREVCVUdfQkZDT0RFX1BUUiggb3RoZXIuZGVidWdQVFIgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisvLwlleHBsaWNpdCBCRkNvZGUoY29uc3QgQkYgJiBvdGhlcikKKy8vCTogQkYoICggb3RoZXIuaXM8IEF2bUNvZGUgPigpICkgPyBvdGhlciA6IEJGQ29kZTo6UkVGX05VTEwgKQorLy8JQVZNX0lOSVRfREVCVUdfQkZDT0RFX1BUUiggKCBvdGhlci5pczwgQXZtQ29kZSA+KCkgKSA/CisvLwkJCXN0YXRpY19jYXN0PCBjb25zdCBBdm1Db2RlICogPiggb3RoZXIucmF3X3BvaW50ZXIoKSApIDogTlVMTCApCisvLwl7CisvLwkJQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKCBvdGhlci5pbnZhbGlkKCkgfHwgb3RoZXIuaXM8IEF2bUNvZGUgPigpICkKKy8vCQkJCTw8ICJJbnZhbGlkIENvbnN0cnVjdG9yIENhc3Qgb2YgYSBCRiB0byBhIEJGQ29kZSAhISEiCisvLwkJCQk8PCBTRU5EX0VYSVQ7CisvLwl9CisKKwlleHBsaWNpdCBCRkNvZGUoQXZtQ29kZSAqIGFDb2RlKQorCTogQkYoIEFWTV9BU1NJR05fRVhQUl9ERUJVR19CRkNPREVfUFRSKCAgYUNvZGUgKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogT3RoZXJzCisJICovCisJQkZDb2RlKE9wZXJhdG9yICogYW5PcGVyYXRvcikKKwk6IEJGKCBBVk1fQVNTSUdOX0VYUFJfREVCVUdfQkZDT0RFX1BUUigKKwkJCW5ldyBBdm1Db2RlKGFuT3BlcmF0b3IpICkgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJQkZDb2RlKE9wZXJhdG9yICogYW5PcGVyYXRvciwgY29uc3QgQkYgJiBhcmcpCisJOiBCRiggQVZNX0FTU0lHTl9FWFBSX0RFQlVHX0JGQ09ERV9QVFIoCisJCQluZXcgQXZtQ29kZShhbk9wZXJhdG9yLCBhcmcpICkgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJQkZDb2RlKE9wZXJhdG9yICogYW5PcGVyYXRvciwgY29uc3QgQkYgJiBhcmcxLCBjb25zdCBCRiAmIGFyZzIpCisJOiBCRiggQVZNX0FTU0lHTl9FWFBSX0RFQlVHX0JGQ09ERV9QVFIoCisJCQluZXcgQXZtQ29kZShhbk9wZXJhdG9yLCBhcmcxLCBhcmcyKSApICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCUJGQ29kZShPcGVyYXRvciAqIGFuT3BlcmF0b3IsIGNvbnN0IEJGICYgYXJnMSwKKwkJCWNvbnN0IEJGICYgYXJnMiwgY29uc3QgQkYgJiBhcmczKQorCTogQkYoIEFWTV9BU1NJR05fRVhQUl9ERUJVR19CRkNPREVfUFRSKAorCQkJbmV3IEF2bUNvZGUoYW5PcGVyYXRvciwgYXJnMSwgYXJnMiwgYXJnMykgKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlCRkNvZGUoT3BlcmF0b3IgKiBhbk9wZXJhdG9yLCBjb25zdCBCRiAmIGFyZzEsIGNvbnN0IEJGICYgYXJnMiwKKwkJCWNvbnN0IEJGICYgYXJnMywgY29uc3QgQkYgJiBhcmc0KQorCTogQkYoIEFWTV9BU1NJR05fRVhQUl9ERUJVR19CRkNPREVfUFRSKAorCQkJbmV3IEF2bUNvZGUoYW5PcGVyYXRvciwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCkgKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlCRkNvZGUoT3BlcmF0b3IgKiBhbk9wZXJhdG9yLCBjb25zdCBCRiAmIGFyZzEsIGNvbnN0IEJGICYgYXJnMiwKKwkJCWNvbnN0IEJGICYgYXJnMywgY29uc3QgQkYgJiBhcmc0LCBjb25zdCBCRiAmIGFyZzUpCisJOiBCRiggQVZNX0FTU0lHTl9FWFBSX0RFQlVHX0JGQ09ERV9QVFIoCisJCQluZXcgQXZtQ29kZShhbk9wZXJhdG9yLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KSApICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5CRkNvZGUoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBDQVNUCisJICovCisKKy8vcHJvdGVjdGVkOgorCWlubGluZSBvcGVyYXRvciBBdm1Db2RlICogKCkgY29uc3QKKwl7CisJCXJldHVybiggc3RhdGljX2Nhc3Q8IEF2bUNvZGUgKiA+KCBtUFRSICkgICk7CisJfQorCisKKwlpbmxpbmUgQXZtQ29kZSAqIHJhd19wb2ludGVyKCkgY29uc3QKKwl7CisJCXJldHVybiggc3RhdGljX2Nhc3Q8IEF2bUNvZGUgKiA+KCBtUFRSICkgICk7CisJfQorCisKKwkvKioKKwkgKiBPUEVSQVRPUlMKKwkgKi8KKwlpbmxpbmUgQXZtQ29kZSAqIG9wZXJhdG9yLT4gKCkgY29uc3QKKwl7CisJCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9QT0lOVEVSX0VYSVQoIG1QVFIgKQorCQkJCTw8ICJVbmV4cGVjdGVkIGEgQkZDb2RlIHdpdGggYSBOVUxMIFBvaW50ZXIgISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQlyZXR1cm4oIHN0YXRpY19jYXN0PCBBdm1Db2RlICogPiggbVBUUiApICApOworCX0KKworCisJLyoqCisJICogQVNTSUdOTUVOVAorCSAqLworCWlubGluZSBCRkNvZGUgJiBvcGVyYXRvcj0oQXZtQ29kZSAqIGFQdHIpCisJeworCQlpZiggbVBUUiAhPSBhUHRyICkKKwkJeworCQkJQVZNX0FTU0lHTl9TVE1OVF9ERUJVR19CRkNPREVfUFRSKCBhUHRyICkKKworCQkJcmVsZWFzZSggYVB0ciApOworCQl9CisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwlpbmxpbmUgQkZDb2RlICYgb3BlcmF0b3I9KGNvbnN0IEJGQ29kZSAmIG90aGVyKQorCXsKKwkJaWYoIG1QVFIgIT0gb3RoZXIubVBUUiApCisJCXsKKwkJCUFWTV9BU1NJR05fU1RNTlRfREVCVUdfQkZDT0RFX1BUUiggb3RoZXIuZGVidWdQVFIgKQorCisJCQlyZWxlYXNlX2FjcXVpcmUoIG90aGVyLm1QVFIgKTsKKwkJfQorCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJaW5saW5lIEJGQ29kZSAmIG9wZXJhdG9yPShjb25zdCBCRiAmIG90aGVyKQorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKAorCQkJCW90aGVyLmludmFsaWQoKSB8fCBvdGhlci5pczwgQXZtQ29kZSA+KCkgKQorCQkJCTw8ICJJbnZhbGlkIEFzc2lnbm1lbnQgQ2FzdCBvZiBhIEJGIHRvIGEgQkZDb2RlICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJaWYoIG1QVFIgIT0gb3RoZXIucmF3X3BvaW50ZXIoKSApCisJCXsKKwkJCUFWTV9BU1NJR05fU1RNTlRfREVCVUdfQkZDT0RFX1BUUigKKwkJCQkJc3RhdGljX2Nhc3Q8IEF2bUNvZGUgKiA+KCBvdGhlci5yYXdfcG9pbnRlcigpICkgKQorCisJCQlyZWxlYXNlX2FjcXVpcmUoIG90aGVyLnJhd19wb2ludGVyKCkgKTsKKwkJfQorCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisKKwkvKioKKwkgKiBDT01QQVJJU09OCisJICogT1BFUkFUT1IKKwkgKi8KKwlpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEF2bUNvZGUgJiBvdGhlcikgY29uc3QKKwl7CisJCXJldHVybiggb3RoZXIub3BlcmF0b3I9PSggcmF3X3BvaW50ZXIoKSApICk7CisJfQorCisJaW5saW5lIGJvb2wgb3BlcmF0b3I9PShBdm1Db2RlICogb3RoZXIpIGNvbnN0CisJeworCQlyZXR1cm4oIChtUFRSID09IG90aGVyKQorCQkJCXx8ICgobVBUUiAhPSBOVUxMKQorCQkJCQkmJiByYXdfcG9pbnRlcigpLT5vcGVyYXRvcj09KCBvdGhlciApICkgKTsKKwl9CisKKworCWlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgQkZDb2RlICYgb3RoZXIpIGNvbnN0CisJeworCQlyZXR1cm4oIChtUFRSID09IG90aGVyLnJhd19wb2ludGVyKCkpCisJCQkJfHwgKChtUFRSICE9IE5VTEwpCisJCQkJCSYmIHJhd19wb2ludGVyKCktPm9wZXJhdG9yPT0oIG90aGVyLnJhd19wb2ludGVyKCkgKSApICk7CisJfQorCisJaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBCRiAmIG90aGVyKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobVBUUiA9PSBvdGhlci5yYXdfcG9pbnRlcigpKQorCQkJCXx8ICgobVBUUiAhPSBOVUxMKQorCQkJCQkmJiBvdGhlci5pczwgQXZtQ29kZSA+KCkKKwkJCQkJJiYgcmF3X3BvaW50ZXIoKS0+b3BlcmF0b3I9PSgKKwkJCQkJCQlvdGhlci50b19wdHI8IEF2bUNvZGUgPigpICkgKSApOworCX0KKworCisJaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBBdm1Db2RlICYgb3RoZXIpIGNvbnN0CisJeworCQlyZXR1cm4oIG90aGVyLm9wZXJhdG9yIT0oIHJhd19wb2ludGVyKCkgKSApOworCX0KKworCWlubGluZSBib29sIG9wZXJhdG9yIT0oQXZtQ29kZSAqIG90aGVyKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobVBUUiAhPSBvdGhlcikKKwkJCQkmJiAoKG1QVFIgPT0gTlVMTCkKKwkJCQkJfHwgcmF3X3BvaW50ZXIoKS0+b3BlcmF0b3IhPSggb3RoZXIgKSApICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEJGQ29kZSAmIG90aGVyKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobVBUUiAhPSBvdGhlci5yYXdfcG9pbnRlcigpKQorCQkJCSYmICgobVBUUiA9PSBOVUxMKQorCQkJCQl8fCByYXdfcG9pbnRlcigpLT5vcGVyYXRvciE9KCBvdGhlci5yYXdfcG9pbnRlcigpICkgKSApOworCX0KKworCWlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgQkYgJiBvdGhlcikgY29uc3QKKwl7CisJCXJldHVybiggKG1QVFIgIT0gb3RoZXIucmF3X3BvaW50ZXIoKSkKKwkJCQkmJiAoKG1QVFIgPT0gTlVMTCkKKwkJCQkJfHwgKG90aGVyLmlzPCBBdm1Db2RlID4oKQorCQkJCQkJJiYgcmF3X3BvaW50ZXIoKS0+b3BlcmF0b3IhPSgKKwkJCQkJCQkJb3RoZXIudG9fcHRyPCBBdm1Db2RlID4oKSApICkgKSApOworCX0KKworCS8qKgorCSAqIENPTVBBUklTT04KKwkgKi8KKwlpbmxpbmUgYm9vbCBpc0VRKGNvbnN0IEJGICYgb3RoZXIpIGNvbnN0CisJeworCQlyZXR1cm4oIEJGOjppc0VRKG90aGVyKSApOworCX0KKworCWlubGluZSBib29sIGlzRVEoY29uc3QgQkZDb2RlICYgb3RoZXIpIGNvbnN0CisJeworCQlyZXR1cm4oIChtUFRSID09IG90aGVyLm1QVFIpCisJCQkJfHwgKChtUFRSICE9IE5VTEwpCisJCQkJCSYmIHJhd19wb2ludGVyKCktPmlzRVEoIG90aGVyLnJhd19wb2ludGVyKCkgKSApICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBpc05FUShjb25zdCBCRiAmIG90aGVyKSBjb25zdAorCXsKKwkJcmV0dXJuKCBCRjo6aXNORVEob3RoZXIpICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNORVEoY29uc3QgQkZDb2RlICYgb3RoZXIpIGNvbnN0CisJeworCQlyZXR1cm4oIG5vdCBCRkNvZGU6OmlzRVEob3RoZXIpICk7CisJfQorCisKK3B1YmxpYzoKKworCS8qKgorCSAqIFNFVFRFUgorCSAqIHRoaXNfY29udGFpbmVyX3R5cGUKKwkgKi8KKwlpbmxpbmUgdm9pZCBhcHBlbmQoY29uc3QgQkYgJiBhbkVsZW1lbnQpCisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoIGlzV3JpdGFibGUoKSApCisJCQkJPDwgIklMTEVHQUwgTU9ESUZJQ0FUSU9OIE9GIEEgTk9OIFVOSVFVRSBSRUZFUkVOQ0UgOj4gIgorCQkJCTw8IHN0clJlZkNvdW50KCkgPDwgIiAiIDw8IHN0cigpIDw8ICIgISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQlzdGF0aWNfY2FzdDwgQXZtQ29kZSAqID4oIG1QVFIgKS0+YXBwZW5kKGFuRWxlbWVudCk7CisJfQorCisJaW5saW5lIHZvaWQgYXBwZW5kKGNvbnN0IExpc3Q8IEJGID4gJiBhbkVsZW1lbnQpCisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoIGlzV3JpdGFibGUoKSApCisJCQkJPDwgIklMTEVHQUwgTU9ESUZJQ0FUSU9OIE9GIEEgTk9OIFVOSVFVRSBSRUZFUkVOQ0UgOj4gIgorCQkJCTw8IHN0clJlZkNvdW50KCkgPDwgIiAiIDw8IHN0cigpIDw8ICIgISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQlzdGF0aWNfY2FzdDwgQXZtQ29kZSAqID4oIG1QVFIgKS0+YXBwZW5kKCBhbkVsZW1lbnQgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBhcHBlbmQoY29uc3QgTGlzdDwgQkZDb2RlID4gJiBhbkVsZW1lbnQpCisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoIGlzV3JpdGFibGUoKSApCisJCQkJPDwgIklMTEVHQUwgTU9ESUZJQ0FUSU9OIE9GIEEgTk9OIFVOSVFVRSBSRUZFUkVOQ0UgOj4gIgorCQkJCTw8IHN0clJlZkNvdW50KCkgPDwgIiAiIDw8IHN0cigpIDw8ICIgISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQlzdGF0aWNfY2FzdDwgQXZtQ29kZSAqID4oIG1QVFIgKS0+YXBwZW5kKCBhbkVsZW1lbnQgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBhcHBlbmQoQXZtQ29kZTo6dGhpc19jb250YWluZXJfdHlwZSAmIGFuRWxlbWVudCkKKwl7CisJCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggaXNXcml0YWJsZSgpICkKKwkJCQk8PCAiSUxMRUdBTCBNT0RJRklDQVRJT04gT0YgQSBOT04gVU5JUVVFIFJFRkVSRU5DRSA6PiAiCisJCQkJPDwgc3RyUmVmQ291bnQoKSA8PCAiICIgPDwgc3RyKCkgPDwgIiAhISEiCisJCQkJPDwgU0VORF9FWElUOworCisJCXN0YXRpY19jYXN0PCBBdm1Db2RlICogPiggbVBUUiApLT5hcHBlbmQoIGFuRWxlbWVudCApOworCX0KKworCisJaW5saW5lIHZvaWQgYXBwZW5kRmxhdChjb25zdCBCRiAmIGFuRWxlbWVudCkKKwl7CisJCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggaXNXcml0YWJsZSgpICkKKwkJCQk8PCAiSUxMRUdBTCBNT0RJRklDQVRJT04gT0YgQSBOT04gVU5JUVVFIFJFRkVSRU5DRSA6PiAiCisJCQkJPDwgc3RyUmVmQ291bnQoKSA8PCAiICIgPDwgc3RyKCkgPDwgIiAhISEiCisJCQkJPDwgU0VORF9FWElUOworCisJCXN0YXRpY19jYXN0PCBBdm1Db2RlICogPiggbVBUUiApLT5hcHBlbmRGbGF0KCBhbkVsZW1lbnQgKTsKKwl9CisKKworCWlubGluZSBBdm1Db2RlOjp0aGlzX2NvbnRhaW5lcl90eXBlICYgZ2V0QXJncygpCisJeworCQlyZXR1cm4oIHN0YXRpY19jYXN0PCBBdm1Db2RlICogPiggbVBUUiApLT5nZXRBcmdzKCkgKTsKKwl9CisKKworCWlubGluZSB2b2lkIHNldChhdm1fc2l6ZV90IGluZGV4LCBjb25zdCBCRiAmIGFuRWxlbWVudCkKKwl7CisJCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggaXNXcml0YWJsZSgpICkKKwkJCQk8PCAiSUxMRUdBTCBNT0RJRklDQVRJT04gT0YgQSBOT04gVU5JUVVFIFJFRkVSRU5DRSA6PiAiCisJCQkJPDwgc3RyUmVmQ291bnQoKSA8PCAiICIgPDwgc3RyKCkgPDwgIiAhISEiCisJCQkJPDwgU0VORF9FWElUOworCisJCXN0YXRpY19jYXN0PCBBdm1Db2RlICogPiggbVBUUiApLT5zZXQoIGluZGV4ICwgYW5FbGVtZW50ICk7CisJfQorCisJLyoqCisJICogR0VUVEVSCisJICogZm9yIEJGQ29kZQorCSAqLworCWlubGluZSB2aXJ0dWFsIEJGQ29kZSAmIGNvZGVBdChhdm1fc2l6ZV90IG9mZnNldCkKKwl7CisJCXJldHVybiggc3RhdGljX2Nhc3Q8IEF2bUNvZGUgKiA+KCBtUFRSICktPmF0KG9mZnNldCkuYmZDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBjb25zdCBCRkNvZGUgJiBjb2RlQXQoYXZtX3NpemVfdCBvZmZzZXQpIGNvbnN0CisJeworCQlyZXR1cm4oIHN0YXRpY19jYXN0PCBBdm1Db2RlICogPiggbVBUUiApLT5hdChvZmZzZXQpLmJmQ29kZSgpICk7CisJfQorCisJLyoqCisJICogR0VUVEVSCisJICogZm9yIGl0ZXJhdG9ycworCSAqLworCWlubGluZSBBdm1Db2RlOjppdGVyYXRvciBiZWdpbigpCisJeworCQlyZXR1cm4oIHN0YXRpY19jYXN0PCBBdm1Db2RlICogPiggbVBUUiApLT5iZWdpbigpICk7CisJfQorCisJaW5saW5lIEF2bUNvZGU6Oml0ZXJhdG9yIGVuZCgpCisJeworCQlyZXR1cm4oIHN0YXRpY19jYXN0PCBBdm1Db2RlICogPiggbVBUUiApLT5lbmQoKSApOworCX0KKworCWlubGluZSBBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0CisJeworCQlyZXR1cm4oIHN0YXRpY19jYXN0PCBBdm1Db2RlICogPiggbVBUUiApLT5iZWdpbigpICk7CisJfQorCisJaW5saW5lIEF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHN0YXRpY19jYXN0PCBBdm1Db2RlICogPiggbVBUUiApLT5lbmQoKSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSCisJICogZm9yIHJldmVyc2VfaXRlcmF0b3JzCisJICovCisJaW5saW5lIEF2bUNvZGU6OnJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkKKwl7CisJCXJldHVybiggc3RhdGljX2Nhc3Q8IEF2bUNvZGUgKiA+KCBtUFRSICktPnJiZWdpbigpICk7CisJfQorCisJaW5saW5lIEF2bUNvZGU6OnJldmVyc2VfaXRlcmF0b3IgcmVuZCgpCisJeworCQlyZXR1cm4oIHN0YXRpY19jYXN0PCBBdm1Db2RlICogPiggbVBUUiApLT5yZW5kKCkgKTsKKwl9CisKKwlpbmxpbmUgQXZtQ29kZTo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBzdGF0aWNfY2FzdDwgQXZtQ29kZSAqID4oIG1QVFIgKS0+cmJlZ2luKCkgKTsKKwl9CisKKwlpbmxpbmUgQXZtQ29kZTo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QKKwl7CisJCXJldHVybiggc3RhdGljX2Nhc3Q8IEF2bUNvZGUgKiA+KCBtUFRSICktPnJlbmQoKSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogZm9yIG1PcGVyYXRvcgorCSAqLworCWlubGluZSBPcGVyYXRvciAqIGdldE9wZXJhdG9yKCkgY29uc3QKKwl7CisJCXJldHVybiggc3RhdGljX2Nhc3Q8IEF2bUNvZGUgKiA+KCBtUFRSICktPmdldE9wZXJhdG9yKCkgKTsKKwl9CisKKwlpbmxpbmUgQVZNX09QQ09ERSBnZXRBdm1PcENvZGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBzdGF0aWNfY2FzdDwgQXZtQ29kZSAqID4oIG1QVFIgKS0+Z2V0QXZtT3BDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNPcGVyYXRvcigpIGNvbnN0CisJeworCQlyZXR1cm4oIHN0YXRpY19jYXN0PCBBdm1Db2RlICogPiggbVBUUiApLT5oYXNPcGVyYXRvcigpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0T3BlcmF0b3IoT3BlcmF0b3IgKiBhbk9wZXJhdG9yKQorCXsKKwkJc3RhdGljX2Nhc3Q8IEF2bUNvZGUgKiA+KCBtUFRSICktPnNldE9wZXJhdG9yKCBhbk9wZXJhdG9yICk7CisJfQorCisKKwkvKioKKwkgKiBERUZBVUxUIE5VTEwKKwkgKi8KKwlzdGF0aWMgQkZDb2RlIFJFRl9OVUxMOworCisJLyoqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFNFUklBTElaQVRJT04KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJaW5saW5lIHZpcnR1YWwgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvdXQpIGNvbnN0CisJeworCQlpZiggbVBUUiAhPSBOVUxMICkKKwkJeworCQkJc3RhdGljX2Nhc3Q8IEF2bUNvZGUgKiA+KCBtUFRSICktPnRvU3RyZWFtKG91dCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlvdXQgPDwgVEFCIDw8ICJCRkNvZGU8bnVsbD4iIDw8IEVPTF9GTFVTSDsKKwkJfQorCX0KKworCisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgdG9TdHJpbmcoCisJCQljb25zdCBBdm1JbmRlbnQgJiBpbmRlbnQgPSBBVk1fVEFCX0lOREVOVCkgY29uc3QKKwl7CisJCVN0cmluZ091dFN0cmVhbSBvc3MoaW5kZW50KTsKKworCQl0b1N0cmVhbShvc3MpOworCisJCXJldHVybiggb3NzLnN0cigpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgc3RyKCkgY29uc3QKKwl7CisJCXJldHVybiggKCBtUFRSID09IE5VTEwgKSA/ICAiQkZDb2RlPG51bGw+IiA6CisJCQkJc3RhdGljX2Nhc3Q8IEF2bUNvZGUgKiA+KCBtUFRSICktPnN0cigpICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIEFWTV9ERUJVR19SRUZfQ09VTlRFUihPdXRTdHJlYW0gJiBvdXQpIGNvbnN0CisJeworCQlpZiggbVBUUiAhPSBOVUxMICkKKwkJeworCQkJbVBUUi0+QVZNX0RFQlVHX1JFRl9DT1VOVEVSKG91dCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlvdXQgPDwgIkJGQ29kZTxudWxsLCByZWY6MD4iIDw8IHN0ZDo6Zmx1c2g7CisJCX0KKwl9CisKKwlpbmxpbmUgdmlydHVhbCBzdGQ6OnN0cmluZyBBVk1fREVCVUdfUkVGX0NPVU5URVIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAoIG1QVFIgIT0gTlVMTCApICA/ICBtUFRSLT5BVk1fREVCVUdfUkVGX0NPVU5URVIoKSA6CisJCQkJIkJGQ29kZTxudWxsLCByZWY6MD4iICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgc3RyUmVmQ291bnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAoIG1QVFIgIT0gTlVMTCApICA/ICBtUFRSLT5zdHJSZWZDb3VudCgpIDoKKwkJCQkiQkZDb2RlPG51bGwsIHJlZjowPiIgKTsKKwl9CisKK307CisKKworLyoqCisgKiBvcGVyYXRvcjw8CisgKi8KK0FWTV9PU19TVFJFQU0oIEJGQ29kZSApCisKKworfQorCisjZW5kaWYgLypBVk1DT0RFX0hfKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL0F2bUNvZGVGYWN0b3J5LmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL0F2bUNvZGVGYWN0b3J5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWNjMDgwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4cHJlc3Npb24vQXZtQ29kZUZhY3RvcnkuY3BwCkBAIC0wLDAgKzEsMTg5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTYgZMOpYy4gMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQXZtQ29kZUZhY3RvcnkuaCIKKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVGb3JtLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZUxpYi5oPgorCisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yTWFuYWdlci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvKioKKyAqIE1FVEhPRFMKKyAqIGZsYXR0ZW4gQXZtQ29kZQorICovCitCRiBBdm1Db2RlRmFjdG9yeTo6ZmxhdHRlbihCRiBhQ29kZSkKK3sKKwlzd2l0Y2goIGFDb2RlLmNsYXNzS2luZCgpICkKKwl7CisJCWNhc2UgRk9STV9BVk1DT0RFX0tJTkQ6CisJCXsKKwkJCXJldHVybiggQXZtQ29kZUZhY3Rvcnk6OmZsYXR0ZW5Db2RlKCBhQ29kZS5iZkNvZGUoKSApICk7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlyZXR1cm4oIGFDb2RlICk7CisJCX0KKwl9Cit9CisKKworCitCRkNvZGUgQXZtQ29kZUZhY3Rvcnk6OmZsYXR0ZW5Db2RlKEJGQ29kZSBhbkF2bUNvZGUpCit7CisJT3BlcmF0b3IgKiBhbk9wZXJhdG9yID0gYW5Bdm1Db2RlLT5nZXRPcGVyYXRvcigpOworCisJQXZtQ29kZTo6dGhpc19jb250YWluZXJfdHlwZSBmbGF0dGVuQXJnczsKKwlCRkNvZGUgYXJnOworCWF2bV9zaXplX3QgZmxhdENvdW50ID0gMDsKKworCUF2bUNvZGU6Oml0ZXJhdG9yIGl0ID0gYW5Bdm1Db2RlLT5iZWdpbigpOworCUF2bUNvZGU6Oml0ZXJhdG9yIGl0RW5kID0gYW5Bdm1Db2RlLT5lbmQoKTsKKwlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwl7CisJCWlmKCAoKml0KS5pczwgQXZtQ29kZSA+KCkgKQorCQl7CisJCQlhcmcgPSBBdm1Db2RlRmFjdG9yeTo6ZmxhdHRlbkNvZGUoICgqaXQpLmJmQ29kZSgpICk7CisKKwkJCWlmKCBhbk9wZXJhdG9yLT5pc1dlYWtBc3NvY2lhdGl2ZSgpICYmCisJCQkJYXJnLT5pc09wZXJhdG9yKCBhbk9wZXJhdG9yICkgKQorCQkJeworCQkJCWZsYXR0ZW5BcmdzLmFwcGVuZCggYXJnLT5nZXRBcmdzKCkgKTsKKworCQkJCSsrZmxhdENvdW50OworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWZsYXR0ZW5BcmdzLmFwcGVuZCggYXJnICk7CisKKwkJCQlpZiggKCppdCkucmF3X3BvaW50ZXIoKSAhPSBhcmcgKQorCQkJCXsKKwkJCQkJKytmbGF0Q291bnQ7CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJZmxhdHRlbkFyZ3MuYXBwZW5kKCAoKml0KSApOworCQl9CisJfQorCisJaWYoIGZsYXRDb3VudCA+IDAgKQorCXsKKwkJaWYoIGFuQXZtQ29kZS0+aXNVbmlxdWUoKSApCisJCXsKKwkJCWFuQXZtQ29kZS0+Y2xlYXIoKTsKKwkJCWFuQXZtQ29kZS0+YXBwZW5kKGZsYXR0ZW5BcmdzKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWFuQXZtQ29kZSA9IEF2bUNvZGVGYWN0b3J5OjpuZXdDb2RlKAorCQkJCQlhbkF2bUNvZGUtPmdldE9wZXJhdG9yKCksIGZsYXR0ZW5BcmdzKTsKKwkJfQorCX0KKworCXJldHVybiggYW5Bdm1Db2RlICk7Cit9CisKKworCisvKioKKyAqIE1FVEhPRFMKKyAqIGNvbnRhaW5zIHN1YkNvZGUgd2l0aCBhIHNwZWNpZmljIG9wZXJhdG9yCisgKi8KK2Jvb2wgQXZtQ29kZUZhY3Rvcnk6OmNvbnRhaW5zKEV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlLAorCQljb25zdCBCRkNvZGUgJiBhQ29kZSwgQVZNX09QQ09ERSBhbk9wY29kZSkKK3sKKwlpZiggYUNvZGUuaW52YWxpZCgpICkKKwl7CisJCXJldHVybiggZmFsc2UgKTsKKwl9CisJZWxzZSBpZiggYUNvZGUtPmlzT3BDb2RlKGFuT3Bjb2RlKSApCisJeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJZWxzZSBpZiggT3BlcmF0b3JNYW5hZ2VyOjppc0FjdGl2aXR5KGFDb2RlLT5nZXRPcGVyYXRvcigpKSAmJgorCQkJKGFDb2RlLT5lbXB0eSgpIHx8IChhQ29kZS0+Zmlyc3QoKSA9PSBFeGVjdXRhYmxlTGliOjpNQUNISU5FX1NFTEYpKSApCisJeworCQlyZXR1cm4oIGNvbnRhaW5zKGFuRXhlY3V0YWJsZSwKKwkJCQlhbkV4ZWN1dGFibGUtPmdldE9uQWN0aXZpdHkoIGFDb2RlLT5nZXRBdm1PcENvZGUoKSApLAorCQkJCWFuT3Bjb2RlKSApOworCX0KKwllbHNlCisJeworCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdCA9IGFDb2RlLT5iZWdpbigpOworCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdEVuZCA9IGFDb2RlLT5lbmQoKTsKKwkJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApCisJCXsKKwkJCWlmKCAoKml0KS5pczwgQXZtQ29kZSA+KCkgKQorCQkJeworCQkJCWlmKCBjb250YWlucyhhbkV4ZWN1dGFibGUsICgqaXQpLmJmQ29kZSgpLCBhbk9wY29kZSkgKQorCQkJCXsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KK30KKworCitib29sIEF2bUNvZGVGYWN0b3J5Ojpjb250YWlucyhFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZSwKKwkJY29uc3QgQkZDb2RlICYgYUNvZGUsIEFWTV9PUENPREUgYW5PcGNvZGUxLCBBVk1fT1BDT0RFIGFuT3Bjb2RlMikKK3sKKwlpZiggYUNvZGUuaW52YWxpZCgpICkKKwl7CisJCXJldHVybiggZmFsc2UgKTsKKwl9CisJZWxzZSBpZiggYUNvZGUtPmlzT3BDb2RlKGFuT3Bjb2RlMSkgfHwgYUNvZGUtPmlzT3BDb2RlKGFuT3Bjb2RlMikgKQorCXsKKwkJcmV0dXJuIHRydWU7CisJfQorCWVsc2UgaWYoIE9wZXJhdG9yTWFuYWdlcjo6aXNBY3Rpdml0eShhQ29kZS0+Z2V0T3BlcmF0b3IoKSkgJiYKKwkJCShhQ29kZS0+ZW1wdHkoKSB8fCAoYUNvZGUtPmZpcnN0KCkgPT0gRXhlY3V0YWJsZUxpYjo6TUFDSElORV9TRUxGKSkgKQorCXsKKwkJcmV0dXJuKCBjb250YWlucyhhbkV4ZWN1dGFibGUsCisJCQkJYW5FeGVjdXRhYmxlLT5nZXRPbkFjdGl2aXR5KCBhQ29kZS0+Z2V0QXZtT3BDb2RlKCkgKSwKKwkJCQlhbk9wY29kZTEsIGFuT3Bjb2RlMikgKTsKKwl9CisJZWxzZQorCXsKKwkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBhQ29kZS0+YmVnaW4oKTsKKwkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBhQ29kZS0+ZW5kKCk7CisJCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQorCQl7CisJCQlpZiggKCppdCkuaXM8IEF2bUNvZGUgPigpICkKKwkJCXsKKwkJCQlpZiggY29udGFpbnMoYW5FeGVjdXRhYmxlLCAoKml0KS5iZkNvZGUoKSwgYW5PcGNvZGUxLCBhbk9wY29kZTIpICkKKwkJCQl7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL0F2bUNvZGVGYWN0b3J5LmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhwcmVzc2lvbi9Bdm1Db2RlRmFjdG9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNjNlMWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhwcmVzc2lvbi9Bdm1Db2RlRmFjdG9yeS5oCkBAIC0wLDAgKzEsNDQwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTYgZMOpYy4gMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEFWTUNPREVGQUNUT1JZX0hfCisjZGVmaW5lIEFWTUNPREVGQUNUT1JZX0hfCisKKyNpbmNsdWRlIDxjb2xsZWN0aW9uL0JGQ29udGFpbmVyLmg+CisjaW5jbHVkZSA8Y29sbGVjdGlvbi9UeXBlZGVmLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9Bdm1Db2RlLmg+CisjaW5jbHVkZSA8Zm1sL2J1aWx0aW4vU3RyaW5nLmg+CisKKyNpbmNsdWRlIDxjb21wdXRlci9pbnN0cnVjdGlvbi9Bdm1CeXRlY29kZS5oPgorCisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yLmg+CisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yTGliLmg+CisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yTWFuYWdlci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjbGFzcyBFeGVjdXRhYmxlRm9ybTsKKworCitjbGFzcyBBdm1Db2RlRmFjdG9yeQoreworCitwdWJsaWM6CisKKwkvKioKKwkgKiBTVEFURU1FTlQgRVhQUkVTU0lPTgorCSAqLworCWlubGluZSBzdGF0aWMgQkZDb2RlIG5ld0NvZGUoKQorCXsKKwkJcmV0dXJuKCBCRkNvZGUoIG5ldyBBdm1Db2RlKCkgKSApOworCX0KKworCWlubGluZSBzdGF0aWMgQkZDb2RlIG5ld0NvZGUoT3BlcmF0b3IgKiBhbk9wZXJhdG9yKQorCXsKKwkJcmV0dXJuKCBCRkNvZGUoIG5ldyBBdm1Db2RlKGFuT3BlcmF0b3IpICkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIEJGQ29kZSBuZXdDb2RlKE9wZXJhdG9yICogYW5PcGVyYXRvciwgY29uc3QgQkYgJiBhcmcpCisJeworCQlyZXR1cm4oIEJGQ29kZSggbmV3IEF2bUNvZGUoIGFuT3BlcmF0b3IsIGFyZykgKSApOworCX0KKworCWlubGluZSBzdGF0aWMgQkZDb2RlIG5ld09wdGlOb3BDb2RlKE9wZXJhdG9yICogYW5PcGVyYXRvciwKKwkJCWNvbnN0IEJGICYgYXJnLCBhdm1fYXJnX29wZXJhbmRfdCBvcGVyYW5kKQorCXsKKwkJQXZtQ29kZSAqIGFDb2RlID0gbmV3IEF2bUNvZGUoIGFuT3BlcmF0b3IsIGFyZyk7CisJCWFDb2RlLT5zZXRJbnN0cnVjdGlvbiggQXZtSW5zdHJ1Y3Rpb246Om5vcHNVbmFyeUNvZGUob3BlcmFuZCkgKTsKKworCQlyZXR1cm4oIEJGQ29kZSggYUNvZGUgKSApOworCX0KKworCisKKwlpbmxpbmUgc3RhdGljIEJGQ29kZSBuZXdDb2RlKE9wZXJhdG9yICogYW5PcGVyYXRvciwKKwkJCWNvbnN0IEJGICYgYXJnMSwgY29uc3QgQkYgJiBhcmcyKQorCXsKKwkJcmV0dXJuKCBCRkNvZGUoIG5ldyBBdm1Db2RlKGFuT3BlcmF0b3IsIGFyZzEsIGFyZzIpICkgKTsKKwl9CisKKworCWlubGluZSBzdGF0aWMgQkZDb2RlIHhuZXdDb2RlKE9wZXJhdG9yICogYW5PcGVyYXRvciwKKwkJCWNvbnN0IEJGQ29kZSAmIGFDb2RlMSwgY29uc3QgQkZDb2RlICYgYUNvZGUyKQorCXsKKwkJaWYoIGFDb2RlMS5pbnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGFDb2RlMiApOworCQl9CisJCWVsc2UgaWYoIGFDb2RlMi5pbnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGFDb2RlMSApOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuKCBuZXdDb2RlKGFuT3BlcmF0b3IsIGFDb2RlMSwgYUNvZGUyKSApOworCQl9CisJfQorCisKKworCWlubGluZSBzdGF0aWMgQkZDb2RlIG5ld0NvZGVGbGF0KE9wZXJhdG9yICogYW5PcGVyYXRvciwgY29uc3QgQkZDb2RlICYgYUNvZGUpCisJeworCQlCRkNvZGUgbmV3Q29kZSggYW5PcGVyYXRvciApOworCisJCWlmKCBhbk9wZXJhdG9yLT5pc1dlYWtBc3NvY2lhdGl2ZSgpICYmCisJCQkJKGFDb2RlLT5nZXRPcGVyYXRvcigpID09IGFuT3BlcmF0b3IpICkKKwkJeworCQkJbmV3Q29kZS0+YXBwZW5kKCBhQ29kZS0+Z2V0QXJncygpICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQluZXdDb2RlLT5hcHBlbmQoIGFDb2RlICk7CisJCX0KKworCQlyZXR1cm4gbmV3Q29kZTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIEJGQ29kZSBuZXdDb2RlRmxhdChPcGVyYXRvciAqIGFuT3BlcmF0b3IsCisJCQljb25zdCBCRkNvZGUgJiBhQ29kZSwgY29uc3QgQkYgJiBhcmcpCisJeworCQlCRkNvZGUgbmV3Q29kZSggYW5PcGVyYXRvciApOworCisJCWlmKCBhbk9wZXJhdG9yLT5pc1dlYWtBc3NvY2lhdGl2ZSgpICYmCisJCQkJKGFDb2RlLT5nZXRPcGVyYXRvcigpID09IGFuT3BlcmF0b3IpICkKKwkJeworCQkJbmV3Q29kZS0+YXBwZW5kKCBhQ29kZS0+Z2V0QXJncygpICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQluZXdDb2RlLT5hcHBlbmQoIGFDb2RlICk7CisJCX0KKworCQluZXdDb2RlLT5hcHBlbmQoIGFyZyApOworCisJCXJldHVybiBuZXdDb2RlOworCX0KKworCWlubGluZSBzdGF0aWMgQkZDb2RlIG5ld0NvZGVGbGF0KE9wZXJhdG9yICogYW5PcGVyYXRvciwKKwkJCWNvbnN0IEJGICYgYXJnLCBjb25zdCBCRkNvZGUgJiBhQ29kZSkKKwl7CisJCUJGQ29kZSBuZXdDb2RlKCBhbk9wZXJhdG9yICwgYXJnICk7CisKKwkJaWYoIGFuT3BlcmF0b3ItPmlzV2Vha0Fzc29jaWF0aXZlKCkgJiYKKwkJCQkoYUNvZGUtPmdldE9wZXJhdG9yKCkgPT0gYW5PcGVyYXRvcikgKQorCQl7CisJCQluZXdDb2RlLT5hcHBlbmQoIGFDb2RlLT5nZXRBcmdzKCkgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW5ld0NvZGUtPmFwcGVuZCggYUNvZGUgKTsKKwkJfQorCisJCXJldHVybiBuZXdDb2RlOworCX0KKworCWlubGluZSBzdGF0aWMgQkZDb2RlIG5ld0NvZGVGbGF0KE9wZXJhdG9yICogYW5PcGVyYXRvciwKKwkJCWNvbnN0IEJGQ29kZSAmIGFDb2RlMSwgY29uc3QgQkZDb2RlICYgYUNvZGUyKQorCXsKKwkJaWYoIGFuT3BlcmF0b3ItPmlzV2Vha0Fzc29jaWF0aXZlKCkgKQorCQl7CisJCQlCRkNvZGUgbmV3Q29kZSggYW5PcGVyYXRvciApOworCisJCQlpZiggYUNvZGUxLT5nZXRPcGVyYXRvcigpID09IGFuT3BlcmF0b3IgKQorCQkJeworCQkJCW5ld0NvZGUtPmFwcGVuZCggYUNvZGUxLT5nZXRBcmdzKCkgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQluZXdDb2RlLT5hcHBlbmQoIGFDb2RlMSApOworCQkJfQorCisJCQlpZiggYUNvZGUyLT5nZXRPcGVyYXRvcigpID09IGFuT3BlcmF0b3IgKQorCQkJeworCQkJCW5ld0NvZGUtPmFwcGVuZCggYUNvZGUyLT5nZXRBcmdzKCkgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQluZXdDb2RlLT5hcHBlbmQoIGFDb2RlMiApOworCQkJfQorCisJCQlyZXR1cm4gbmV3Q29kZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybiggbmV3Q29kZShhbk9wZXJhdG9yLCBhQ29kZTEsIGFDb2RlMikgKTsKKwkJfQorCX0KKworCisJaW5saW5lIHN0YXRpYyBCRkNvZGUgeG5ld0NvZGVGbGF0KE9wZXJhdG9yICogYW5PcGVyYXRvciwKKwkJCWNvbnN0IEJGQ29kZSAmIGFDb2RlMSwgY29uc3QgQkZDb2RlICYgYUNvZGUyKQorCXsKKwkJaWYoIGFDb2RlMS5pbnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGFDb2RlMiApOworCQl9CisJCWVsc2UgaWYoIGFDb2RlMi5pbnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGFDb2RlMSApOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuKCBuZXdDb2RlRmxhdChhbk9wZXJhdG9yLCBhQ29kZTEsIGFDb2RlMikgKTsKKwkJfQorCX0KKworCisJaW5saW5lIHN0YXRpYyBCRkNvZGUgbmV3Q29kZUZsYXQoT3BlcmF0b3IgKiBhbk9wZXJhdG9yLAorCQkJY29uc3QgQkYgJiBhcmcxLCBjb25zdCBCRiAmIGFyZzIpCisJeworCQlpZiggYXJnMS5pczwgQXZtQ29kZSA+KCkgKQorCQl7CisJCQlpZiggYXJnMi5pczwgQXZtQ29kZSA+KCkgKQorCQkJeworCQkJCXJldHVybiggbmV3Q29kZUZsYXQoYW5PcGVyYXRvciwgYXJnMS5iZkNvZGUoKSwgYXJnMi5iZkNvZGUoKSkgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4oIG5ld0NvZGVGbGF0KGFuT3BlcmF0b3IsIGFyZzEuYmZDb2RlKCksIGFyZzIpICk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiggYXJnMi5pczwgQXZtQ29kZSA+KCkgKQorCQl7CisJCQlyZXR1cm4oIG5ld0NvZGVGbGF0KGFuT3BlcmF0b3IsIGFyZzEsIGFyZzIuYmZDb2RlKCkpICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4oIG5ld0NvZGUoYW5PcGVyYXRvciwgYXJnMSwgYXJnMikgKTsKKwkJfQorCX0KKworCWlubGluZSBzdGF0aWMgQkZDb2RlIG5ld0NvZGVGbGF0KE9wZXJhdG9yICogYW5PcGVyYXRvciwKKwkJCWNvbnN0IEJGQ29kZSAmIGFDb2RlMSwgY29uc3QgQkZDb2RlICYgYUNvZGUyLCBjb25zdCBCRkNvZGUgJiBhQ29kZTMpCisJeworCQlpZiggYW5PcGVyYXRvci0+aXNXZWFrQXNzb2NpYXRpdmUoKSApCisJCXsKKwkJCUJGQ29kZSBuZXdDb2RlKCBhbk9wZXJhdG9yICk7CisKKwkJCWlmKCBhQ29kZTEtPmdldE9wZXJhdG9yKCkgPT0gYW5PcGVyYXRvciApCisJCQl7CisJCQkJbmV3Q29kZS0+YXBwZW5kKCBhQ29kZTEtPmdldEFyZ3MoKSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW5ld0NvZGUtPmFwcGVuZCggYUNvZGUxICk7CisJCQl9CisKKwkJCWlmKCBhQ29kZTItPmdldE9wZXJhdG9yKCkgPT0gYW5PcGVyYXRvciApCisJCQl7CisJCQkJbmV3Q29kZS0+YXBwZW5kKCBhQ29kZTItPmdldEFyZ3MoKSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW5ld0NvZGUtPmFwcGVuZCggYUNvZGUyICk7CisJCQl9CisKKwkJCWlmKCBhQ29kZTMtPmdldE9wZXJhdG9yKCkgPT0gYW5PcGVyYXRvciApCisJCQl7CisJCQkJbmV3Q29kZS0+YXBwZW5kKCBhQ29kZTMtPmdldEFyZ3MoKSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW5ld0NvZGUtPmFwcGVuZCggYUNvZGUzICk7CisJCQl9CisKKwkJCXJldHVybiBuZXdDb2RlOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuKCBuZXdDb2RlKGFuT3BlcmF0b3IsIGFDb2RlMSwgYUNvZGUyLCBhQ29kZTMpICk7CisJCX0KKwl9CisKKworCWlubGluZSBzdGF0aWMgQkZDb2RlIHhuZXdDb2RlRmxhdChPcGVyYXRvciAqIGFuT3BlcmF0b3IsCisJCQljb25zdCBCRkNvZGUgJiBhQ29kZTEsIGNvbnN0IEJGQ29kZSAmIGFDb2RlMiwgY29uc3QgQkZDb2RlICYgYUNvZGUzKQorCXsKKwkJaWYoIGFDb2RlMS5pbnZhbGlkKCkgKQorCQl7CisJCQlpZiggYUNvZGUyLmludmFsaWQoKSApCisJCQl7CisJCQkJcmV0dXJuKCBhQ29kZTMgKTsKKwkJCX0KKwkJCWVsc2UgaWYoIGFDb2RlMy5pbnZhbGlkKCkgKQorCQkJeworCQkJCXJldHVybiggYUNvZGUyICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuKCBuZXdDb2RlRmxhdChhbk9wZXJhdG9yLCBhQ29kZTIsIGFDb2RlMykgKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmKCBhQ29kZTIuaW52YWxpZCgpICkKKwkJeworCQkJaWYoIGFDb2RlMy5pbnZhbGlkKCkgKQorCQkJeworCQkJCXJldHVybiggYUNvZGUxICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuKCBuZXdDb2RlRmxhdChhbk9wZXJhdG9yLCBhQ29kZTEsIGFDb2RlMykgKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmKCBhQ29kZTMuaW52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCBuZXdDb2RlRmxhdChhbk9wZXJhdG9yLCBhQ29kZTEsIGFDb2RlMikgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybiggbmV3Q29kZUZsYXQoYW5PcGVyYXRvciwgYUNvZGUxLCBhQ29kZTIsIGFDb2RlMykgKTsKKwkJfQorCX0KKworCisJaW5saW5lIHN0YXRpYyBCRkNvZGUgbmV3Q29kZUZsYXRNaWRkbGUoT3BlcmF0b3IgKiBhbk9wZXJhdG9yLAorCQkJY29uc3QgQkZDb2RlICYgYUNvZGUxLCBjb25zdCBCRkNvZGUgJiBhQ29kZTIsIGNvbnN0IEJGQ29kZSAmIGFDb2RlMykKKwl7CisJCWlmKCBhbk9wZXJhdG9yLT5pc1dlYWtBc3NvY2lhdGl2ZSgpICYmCisJCQkJKGFDb2RlMi0+Z2V0T3BlcmF0b3IoKSA9PSBhbk9wZXJhdG9yKSApCisJCXsKKwkJCUJGQ29kZSBuZXdDb2RlKCBhbk9wZXJhdG9yICwgYUNvZGUxICk7CisKKwkJCW5ld0NvZGUtPmFwcGVuZCggYUNvZGUyLT5nZXRBcmdzKCkgKTsKKworCQkJbmV3Q29kZS0+YXBwZW5kKCBhQ29kZTMgKTsKKworCQkJcmV0dXJuIG5ld0NvZGU7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4oIG5ld0NvZGUoYW5PcGVyYXRvciwgYUNvZGUxLCBhQ29kZTIsIGFDb2RlMykgKTsKKwkJfQorCX0KKworCisJaW5saW5lIHN0YXRpYyBCRkNvZGUgbmV3Q29kZShPcGVyYXRvciAqIGFuT3BlcmF0b3IsCisJCQljb25zdCBCRiAmIGFyZzEsIGNvbnN0IEJGICYgYXJnMiwgY29uc3QgQkYgJiBhcmczKQorCXsKKwkJcmV0dXJuKCBCRkNvZGUoIG5ldyBBdm1Db2RlKGFuT3BlcmF0b3IsIGFyZzEsIGFyZzIsIGFyZzMpICkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIEJGQ29kZSBuZXdDb2RlKE9wZXJhdG9yICogYW5PcGVyYXRvciwKKwkJCWNvbnN0IEJGICYgYXJnMSwgY29uc3QgQkYgJiBhcmcyLCBjb25zdCBCRiAmIGFyZzMsIGNvbnN0IEJGICYgYXJnNCkKKwl7CisJCXJldHVybiggQkZDb2RlKCBuZXcgQXZtQ29kZShhbk9wZXJhdG9yLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0KSApICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBCRkNvZGUgbmV3Q29kZShPcGVyYXRvciAqIGFuT3BlcmF0b3IsIGNvbnN0IEJGICYgYXJnMSwKKwkJCWNvbnN0IEJGICYgYXJnMiwgY29uc3QgQkYgJiBhcmczLCBjb25zdCBCRiAmIGFyZzQsIGNvbnN0IEJGICYgYXJnNSkKKwl7CisJCXJldHVybiggQkZDb2RlKCBuZXcgQXZtQ29kZShhbk9wZXJhdG9yLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KSApICk7CisJfQorCisKKwlpbmxpbmUgc3RhdGljIEJGQ29kZSBuZXdDb2RlKE9wZXJhdG9yICogYW5PcGVyYXRvciwKKwkJCWNvbnN0IEJGQ29kZUxpc3QgJiBsaXN0T2ZBcmcpCisJeworCQlCRkNvZGUgYUNvZGUoIG5ldyBBdm1Db2RlKGFuT3BlcmF0b3IpICk7CisJCWFDb2RlLT5hcHBlbmQobGlzdE9mQXJnKTsKKworCQlyZXR1cm4oIGFDb2RlICk7CisJfQorCisKKwlpbmxpbmUgc3RhdGljIEJGQ29kZSBuZXdDb2RlKE9wZXJhdG9yICogYW5PcGVyYXRvciwKKwkJCWNvbnN0IEJGICYgYXJnLCBjb25zdCBCRkNvZGVMaXN0ICYgbGlzdE9mQXJnKQorCXsKKwkJQkZDb2RlIGFDb2RlKCBuZXcgQXZtQ29kZShhbk9wZXJhdG9yLCBhcmcpICk7CisJCWFDb2RlLT5hcHBlbmQobGlzdE9mQXJnKTsKKworCQlyZXR1cm4oIGFDb2RlICk7CisJfQorCisKKwlpbmxpbmUgc3RhdGljIEJGQ29kZSBuZXdDb2RlKE9wZXJhdG9yICogYW5PcGVyYXRvciwKKwkJCWNvbnN0IEF2bUNvZGU6OnRoaXNfY29udGFpbmVyX3R5cGUgJiBsaXN0T2ZBcmcpCisJeworCQlCRkNvZGUgYUNvZGUoIG5ldyBBdm1Db2RlKGFuT3BlcmF0b3IpICk7CisJCWFDb2RlLT5hcHBlbmQobGlzdE9mQXJnKTsKKworCQlyZXR1cm4oIGFDb2RlICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBCRkNvZGUgbmV3Q29kZShPcGVyYXRvciAqIGFuT3BlcmF0b3IsCisJCQljb25zdCBCRiAmIGFyZywgY29uc3QgQXZtQ29kZTo6dGhpc19jb250YWluZXJfdHlwZSAmIGxpc3RPZkFyZykKKwl7CisJCUJGQ29kZSBhQ29kZSggbmV3IEF2bUNvZGUoYW5PcGVyYXRvciwgYXJnKSApOworCQlhQ29kZS0+YXBwZW5kKGxpc3RPZkFyZyk7CisKKwkJcmV0dXJuKCBhQ29kZSApOworCX0KKworCisJaW5saW5lIHN0YXRpYyBCRkNvZGUgbmV3Q29kZVRhaWwoT3BlcmF0b3IgKiBhbk9wZXJhdG9yLAorCQkJY29uc3QgQXZtQ29kZTo6dGhpc19jb250YWluZXJfdHlwZSAmIGxpc3RPZkFyZykKKwl7CisJCUJGQ29kZSBhQ29kZSggbmV3IEF2bUNvZGUoYW5PcGVyYXRvcikgKTsKKwkJYUNvZGUtPmFwcGVuZFRhaWwobGlzdE9mQXJnKTsKKworCQlyZXR1cm4oIGFDb2RlICk7CisJfQorCisKKwkvKioKKwkgKiBNRVRIT0RTCisJICogJHsgY29tbWVudCBhcmcgfQorCSAqICR7IGNvbW1lbnQgInN0cmluZyIgfQorCSAqLworCWlubGluZSBzdGF0aWMgQkZDb2RlIG5ld0NvbW1lbnQoY29uc3QgQkYgJiBhcmcpCisJeworCQlyZXR1cm4gQkZDb2RlKCBuZXcgQXZtQ29kZShPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0NPTU1FTlQsIGFyZykgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIEJGQ29kZSBuZXdDb21tZW50KGNvbnN0IHN0ZDo6c3RyaW5nICYgY29tbWVudCkKKwl7CisJCXJldHVybiBuZXdDb21tZW50KCBCRihuZXcgU3RyaW5nKGNvbW1lbnQpICkgKTsKKwl9CisKKworCS8qKgorCSAqIE1FVEhPRFMKKwkgKiBmbGF0dGVuCisJICovCisJc3RhdGljIEJGIGZsYXR0ZW4oQkYgYUNvZGUpOworCisJc3RhdGljIEJGQ29kZSBmbGF0dGVuQ29kZShCRkNvZGUgYW5Bdm1Db2RlKTsKKworCisJLyoqCisJICogTUVUSE9EUworCSAqIGNvbnRhaW5zIHN1YkNvZGUgd2l0aCBhIHNwZWNpZmljIG9wZXJhdG9yCisJICovCisJc3RhdGljIGJvb2wgY29udGFpbnMoRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGUsCisJCQljb25zdCBCRkNvZGUgJiBhQ29kZSwgQVZNX09QQ09ERSBhbk9wY29kZSk7CisKKwlzdGF0aWMgYm9vbCBjb250YWlucyhFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZSwKKwkJCWNvbnN0IEJGQ29kZSAmIGFDb2RlLCBBVk1fT1BDT0RFIGFuT3Bjb2RlMSwgQVZNX09QQ09ERSBhbk9wY29kZTIpOworCit9OworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKyNlbmRpZiAvKiBBVk1DT0RFRkFDVE9SWV9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4cHJlc3Npb24vQnVpbHRpbkFycmF5LmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL0J1aWx0aW5BcnJheS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU1MTg2MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL0J1aWx0aW5BcnJheS5jcHAKQEAgLTAsMCArMSw4MzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiA4IGbDqXZyLiAyMDEwCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJCdWlsdGluQXJyYXkuaCIKKworI2luY2x1ZGUgPGNvbXB1dGVyL2luc3RydWN0aW9uL0F2bUluc3RydWN0aW9uLmg+CisKKyNpbmNsdWRlIDxmbWwvYnVpbHRpbi9Cb29sZWFuLmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkNvbnN0cnVjdG9yLmg+CisjaW5jbHVkZSA8Zm1sL2J1aWx0aW4vSWRlbnRpZmllci5oPgorI2luY2x1ZGUgPGZtbC9idWlsdGluL1N0cmluZy5oPgorI2luY2x1ZGUgPGZtbC9idWlsdGluL1F1YWxpZmllZElkZW50aWZpZXIuaD4KKworI2luY2x1ZGUgPGZtbC90eXBlL0Jhc2VTeW1ib2xUeXBlU3BlY2lmaWVyLmg+CisjaW5jbHVkZSA8Zm1sL3R5cGUvVHlwZU1hbmFnZXIuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKy8qKgorICogQ09OU1RSVUNUT1IKKyAqIENvcHkKKyAqLworQXJyYXlCRjo6QXJyYXlCRihjb25zdCBBcnJheUJGICYgYW5BcnJheSkKKzogX0J1aWx0aW5BcnJheV88IEJGID4oIGFuQXJyYXkgKSwKK21FbGVtZW50VHlwZUlkKCBhbkFycmF5Lm1FbGVtZW50VHlwZUlkICksCittSW5zdHJ1Y3Rpb24oIChhbkFycmF5Lm1JbnN0cnVjdGlvbiA9PSBOVUxMKSA/IE5VTEwKKwkJOiBuZXcgQXZtSW5zdHJ1Y3Rpb24oICooYW5BcnJheS5tSW5zdHJ1Y3Rpb24pICkgKQoreworCS8vISEhIE5PVEhJTkcKK30KKworCisvKioKKyAqIElOVEVSRkFDRQorICovCitib29sIEFycmF5QkY6OmNvbnRhaW5zKGNvbnN0IEJGICYgYXJnKSBjb25zdAoreworCWZvciggYXZtX3NpemVfdCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgbVNpemUgOyArK29mZnNldCApCisJeworCQlpZiggbVRhYmxlW29mZnNldF0gPT0gYXJnICkKKwkJeworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKworYm9vbCBBcnJheUJGOjpzdGFydHNXaXRoKGNvbnN0IEFycmF5QkYgJiBvdGhlcikgY29uc3QKK3sKKwlpZiggbVNpemUgPiBvdGhlci5tU2l6ZSApCisJeworCQlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMCA7IG9mZnNldCA8IG90aGVyLm1TaXplIDsgKytvZmZzZXQgKQorCQl7CisJCQlpZiggbVRhYmxlW29mZnNldF0gIT0gb3RoZXIubVRhYmxlW29mZnNldF0gKQorCQkJeworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiggdHJ1ZSApOworCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKworCitib29sIEFycmF5QkY6OmVuZHNXaXRoKGNvbnN0IEFycmF5QkYgJiBvdGhlcikgY29uc3QKK3sKKwlpZiggbVNpemUgPiBvdGhlci5tU2l6ZSApCisJeworCQlhdm1fc2l6ZV90IHBvcyA9IG1TaXplIC0gb3RoZXIubVNpemU7CisJCWZvciggYXZtX3NpemVfdCBvZmZzZXQgPSAwIDsgcG9zIDwgbVNpemUgOyArK3BvcyAsICsrb2Zmc2V0ICkKKwkJeworCQkJaWYoIG1UYWJsZVtwb3NdICE9IG90aGVyLm1UYWJsZVtvZmZzZXRdICkKKwkJCXsKKwkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKworLyoqCisgKiBUUklWSUFMTFkgRVFVQUwKKyAqLworYm9vbCBBcnJheUJGOjppc1RFUShjb25zdCBBcnJheUJGICYgb3RoZXIpIGNvbnN0Cit7CisJaWYoIHRoaXMgPT0gJm90aGVyICkKKwl7CisJCXJldHVybiggdHJ1ZSApOworCX0KKwllbHNlIGlmKCBtU2l6ZSA9PSBvdGhlci5tU2l6ZSApCisJeworCQlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMCA7IG9mZnNldCA8IG90aGVyLm1TaXplIDsgKytvZmZzZXQgKQorCQl7CisJCQlpZiggbm90IG1UYWJsZVtvZmZzZXRdLmlzVEVRKCBvdGhlci5tVGFibGVbb2Zmc2V0XSApICkKKwkJCXsKKwkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKy8qKgorICogVVNVQUwgRVFVQUwKKyAqLworaW50IEFycmF5QkY6OmNvbXBhcmUoY29uc3QgQXJyYXlCRiAmIG90aGVyKSBjb25zdAoreworCWlmKCB0aGlzID09ICZvdGhlciApCisJeworCQlyZXR1cm4oIDAgKTsKKwl9CisJZWxzZQorCXsKKwkJaW50ICBjbXBSZXN1bHQgPSAwOworCisJCWZvciggYXZtX3NpemVfdCBvZmZzZXQgPSAwIDsKKwkJCShvZmZzZXQgPCBtU2l6ZSkgJiYgKG9mZnNldCA8IG90aGVyLm1TaXplKSA7ICsrb2Zmc2V0ICkKKwkJeworCQkJY21wUmVzdWx0ID0gbVRhYmxlW29mZnNldF0uY29tcGFyZSggb3RoZXIubVRhYmxlW29mZnNldF0gKTsKKwkJCWlmKCBjbXBSZXN1bHQgIT0gMCAgKQorCQkJeworCQkJCXJldHVybiggY21wUmVzdWx0ICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4oIChtU2l6ZSA9PSBvdGhlci5tU2l6ZSkgPyAwIDoKKwkJCQkoKG1TaXplIDwgb3RoZXIubVNpemUpID8gLTEgOiAxKSApOworCX0KK30KKworYm9vbCBBcnJheUJGOjppc0VRKGNvbnN0IEFycmF5QkYgJiBvdGhlcikgY29uc3QKK3sKKwlpZiggbVNpemUgPT0gb3RoZXIubVNpemUgKQorCXsKKwkJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDAgOyBvZmZzZXQgPCBvdGhlci5tU2l6ZSA7ICsrb2Zmc2V0ICkKKwkJeworCQkJaWYoIG5vdCBtVGFibGVbb2Zmc2V0XS5pc0VRKCBvdGhlci5tVGFibGVbb2Zmc2V0XSApICkKKwkJCXsKKwkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKy8qKgorICogU1lOVEFYSUMgRVFVQUwKKyAqLworYm9vbCBBcnJheUJGOjppc1NFUShjb25zdCBBcnJheUJGICYgb3RoZXIpIGNvbnN0Cit7CisJaWYoIG1TaXplID09IG90aGVyLm1TaXplICkKKwl7CisJCWZvciggYXZtX3NpemVfdCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgb3RoZXIubVNpemUgOyArK29mZnNldCApCisJCXsKKwkJCWlmKCBub3QgbVRhYmxlW29mZnNldF0uc3RyRVEoIG90aGVyLm1UYWJsZVtvZmZzZXRdICkgKQorCQkJeworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiggdHJ1ZSApOworCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKworCisvKioKKyAqIENPTlNUUlVDVE9SCisgKiBPdGhlcgorICovCitBcnJheUJGOjpBcnJheUJGKGNvbnN0IEJGVmVjdG9yICYgYW5BcnJheSkKKzogX0J1aWx0aW5BcnJheV88IEJGID4oIENMQVNTX0tJTkRfVCggQXJyYXlCRiApLAorCQlUeXBlTWFuYWdlcjo6QVJSQVlfQU5ZLCBhbkFycmF5KSwKK21FbGVtZW50VHlwZUlkKCBDbGFzc0tpbmRJbmZvSW5pdGlhbGl6ZXI6OlRZUEVfVU5ERUZJTkVEX0lEICksCittSW5zdHJ1Y3Rpb24oIE5VTEwgKQoreworCS8vISEhIE5PVEhJTkcKK30KKworQXJyYXlCRjo6QXJyYXlCRihCYXNlVHlwZVNwZWNpZmllciAqIGFUeXBlU3BlY2lmaWVyLCBjb25zdCBCRiAmIGRlZmF1bHRWYWx1ZSkKKzogX0J1aWx0aW5BcnJheV88IEJGID4oIENMQVNTX0tJTkRfVCggQXJyYXlCRiApLAorCQlhVHlwZVNwZWNpZmllciwgYVR5cGVTcGVjaWZpZXItPnNpemUoKSksCittRWxlbWVudFR5cGVJZCggQ2xhc3NLaW5kSW5mb0luaXRpYWxpemVyOjpUWVBFX1VOREVGSU5FRF9JRCApLAorbUluc3RydWN0aW9uKCBOVUxMICkKK3sKKwlzZXRBbGwoIGRlZmF1bHRWYWx1ZSApOworfQorCisKKworQXJyYXlJbnRlZ2VyOjpBcnJheUludGVnZXIoYXZtX3NpemVfdCBhU2l6ZSkKKzogX0J1aWx0aW5BcnJheV88IGF2bV9pbnRlZ2VyX3QgPiggQ0xBU1NfS0lORF9UKCBBcnJheUludGVnZXIgKSwKKwkJVHlwZU1hbmFnZXI6OkFSUkFZX0lOVEVHRVIsIGFTaXplKQoreworCS8vISEhIE5PVEhJTkcKK30KKworQXJyYXlSYXRpb25hbDo6QXJyYXlSYXRpb25hbChhdm1fc2l6ZV90IGFTaXplKQorOiBfQnVpbHRpbkFycmF5XzwgUGFpckludGVnZXIgPiggQ0xBU1NfS0lORF9UKCBBcnJheVJhdGlvbmFsICksCisJCVR5cGVNYW5hZ2VyOjpBUlJBWV9SQVRJT05BTCwgYVNpemUpCit7CisJLy8hISEgTk9USElORworfQorCitBcnJheUZsb2F0OjpBcnJheUZsb2F0KGF2bV9zaXplX3QgYVNpemUpCis6IF9CdWlsdGluQXJyYXlfPCBkb3VibGUgPiggQ0xBU1NfS0lORF9UKCBBcnJheUZsb2F0ICksCisJCVR5cGVNYW5hZ2VyOjpBUlJBWV9GTE9BVCwgYVNpemUpCit7CisJLy8hISEgTk9USElORworfQorCitBcnJheUJvb2xlYW46OkFycmF5Qm9vbGVhbihhdm1fc2l6ZV90IGFTaXplKQorOiBfQnVpbHRpbkFycmF5XzwgYm9vbCA+KCBDTEFTU19LSU5EX1QoIEFycmF5Qm9vbGVhbiApLAorCQlUeXBlTWFuYWdlcjo6QVJSQVlfQk9PTEVBTiwgYVNpemUpCit7CisJLy8hISEgTk9USElORworfQorCitBcnJheUNoYXJhY3Rlcjo6QXJyYXlDaGFyYWN0ZXIoYXZtX3NpemVfdCBhU2l6ZSkKKzogX0J1aWx0aW5BcnJheV88IGNoYXIgPiggQ0xBU1NfS0lORF9UKCBBcnJheUNoYXJhY3RlciApLAorCQlUeXBlTWFuYWdlcjo6QVJSQVlfQ0hBUkFDVEVSLCBhU2l6ZSkKK3sKKwkvLyEhISBOT1RISU5HCit9CisKK0FycmF5U3RyaW5nOjpBcnJheVN0cmluZyhhdm1fc2l6ZV90IGFTaXplKQorOiBfQnVpbHRpbkFycmF5Xzwgc3RkOjpzdHJpbmcgPiggQ0xBU1NfS0lORF9UKCBBcnJheVN0cmluZyApLAorCQlUeXBlTWFuYWdlcjo6QVJSQVlfU1RSSU5HLCBhU2l6ZSkKK3sKKwkvLyEhISBOT1RISU5HCit9CisKK0FycmF5SWRlbnRpZmllcjo6QXJyYXlJZGVudGlmaWVyKGF2bV9zaXplX3QgYVNpemUpCis6IF9CdWlsdGluQXJyYXlfPCBzdGQ6OnN0cmluZyA+KCBDTEFTU19LSU5EX1QoIEFycmF5SWRlbnRpZmllciApLAorCQlUeXBlTWFuYWdlcjo6QVJSQVlfSURFTlRJRklFUiwgYVNpemUpCit7CisJLy8hISEgTk9USElORworfQorCitBcnJheVF1YWxpZmllZElkZW50aWZpZXI6OkFycmF5UXVhbGlmaWVkSWRlbnRpZmllcihhdm1fc2l6ZV90IGFTaXplKQorOiBfQnVpbHRpbkFycmF5Xzwgc3RkOjpzdHJpbmcgPiggQ0xBU1NfS0lORF9UKCBBcnJheVF1YWxpZmllZElkZW50aWZpZXIgKSwKKwkJVHlwZU1hbmFnZXI6OkFSUkFZX1FVQUxJRklFRF9JREVOVElGSUVSLCBhU2l6ZSkKK3sKKwkvLyEhISBOT1RISU5HCit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFRPIEFSUkFZCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjbGFzc19raW5kX3QgQnVpbHRpbkFycmF5OjpnZXRBcnJheVR5cGVJZChjbGFzc19raW5kX3QgYVR5cGVJZCkKK3sKKwlzd2l0Y2goIGFUeXBlSWQgKQorCXsKKwkJY2FzZSBGT1JNX0JVSUxUSU5fQk9PTEVBTl9LSU5EOgorCQl7CisJCQlyZXR1cm4oIEZPUk1fQVJSQVlfQk9PTEVBTl9LSU5EICk7CisJCX0KKwkJY2FzZSBGT1JNX0JVSUxUSU5fQ0hBUkFDVEVSX0tJTkQ6CisJCXsKKwkJCXJldHVybiggRk9STV9BUlJBWV9DSEFSQUNURVJfS0lORCApOworCQl9CisJCWNhc2UgRk9STV9CVUlMVElOX0lOVEVHRVJfS0lORDoKKwkJeworCQkJcmV0dXJuKCBGT1JNX0FSUkFZX0lOVEVHRVJfS0lORCApOworCQl9CisJCWNhc2UgRk9STV9CVUlMVElOX1JBVElPTkFMX0tJTkQ6CisJCXsKKwkJCXJldHVybiggRk9STV9BUlJBWV9SQVRJT05BTF9LSU5EICk7CisJCX0KKwkJY2FzZSBGT1JNX0JVSUxUSU5fRkxPQVRfS0lORDoKKwkJeworCQkJcmV0dXJuKCBGT1JNX0FSUkFZX0ZMT0FUX0tJTkQgKTsKKwkJfQorCQljYXNlIEZPUk1fQlVJTFRJTl9TVFJJTkdfS0lORDoKKwkJeworCQkJcmV0dXJuKCBGT1JNX0FSUkFZX1NUUklOR19LSU5EICk7CisJCX0KKwkJY2FzZSBGT1JNX0JVSUxUSU5fSURFTlRJRklFUl9LSU5EOgorCQl7CisJCQlyZXR1cm4oIEZPUk1fQVJSQVlfSURFTlRJRklFUl9LSU5EICk7CisJCX0KKwkJY2FzZSBGT1JNX0JVSUxUSU5fUVVBTElGSUVEX0lERU5USUZJRVJfS0lORDoKKwkJeworCQkJcmV0dXJuKCBGT1JNX0FSUkFZX1FVQUxJRklFRF9JREVOVElGSUVSX0tJTkQgKTsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCXJldHVybiggRk9STV9BUlJBWV9CRl9LSU5EICk7CisJCX0KKwl9Cit9CisKK2NsYXNzX2tpbmRfdCBCdWlsdGluQXJyYXk6OmdldEFycmF5VHlwZUlkKAorCQljbGFzc19raW5kX3QgY2xhc3NLaW5kQSwgY2xhc3Nfa2luZF90IGNsYXNzS2luZEIpCit7CisJaWYoIGNsYXNzS2luZEEgPT0gY2xhc3NLaW5kQiApCisJeworCQlyZXR1cm4oIGNsYXNzS2luZEEgKTsKKwl9CisJZWxzZSBpZiggKGNsYXNzS2luZEEgPT0gRk9STV9BUlJBWV9CRl9LSU5EKQorCQkJfHwgKGNsYXNzS2luZEIgPT0gRk9STV9BUlJBWV9CRl9LSU5EKSApCisJeworCQlyZXR1cm4oIEZPUk1fQVJSQVlfQkZfS0lORCApOworCX0KKwllbHNlCisJeworCQlzd2l0Y2goIGNsYXNzS2luZEEgKQorCQl7CisJCQljYXNlIEZPUk1fQlVJTFRJTl9JTlRFR0VSX0tJTkQ6CisJCQljYXNlIEZPUk1fQlVJTFRJTl9SQVRJT05BTF9LSU5EOgorCQkJeworCQkJCWlmKCBjbGFzc0tpbmRCID09IEZPUk1fQlVJTFRJTl9GTE9BVF9LSU5EICkKKwkJCQl7CisJCQkJCXJldHVybiggRk9STV9CVUlMVElOX0ZMT0FUX0tJTkQgKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcmV0dXJuKCBGT1JNX0FSUkFZX0JGX0tJTkQgKTsKKwkJCQl9CisJCQl9CisJCQljYXNlIEZPUk1fQlVJTFRJTl9GTE9BVF9LSU5EOgorCQkJeworCQkJCWlmKCBjbGFzc0tpbmRCID09IEZPUk1fQlVJTFRJTl9JTlRFR0VSX0tJTkQgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCBGT1JNX0JVSUxUSU5fRkxPQVRfS0lORCApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlyZXR1cm4oIEZPUk1fQVJSQVlfQkZfS0lORCApOworCQkJCX0KKwkJCX0KKworCQkJY2FzZSBGT1JNX0JVSUxUSU5fSURFTlRJRklFUl9LSU5EOgorCQkJeworCQkJCWlmKCBjbGFzc0tpbmRCID09IEZPUk1fQlVJTFRJTl9RVUFMSUZJRURfSURFTlRJRklFUl9LSU5EICkKKwkJCQl7CisJCQkJCXJldHVybiggRk9STV9CVUlMVElOX1FVQUxJRklFRF9JREVOVElGSUVSX0tJTkQgKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcmV0dXJuKCBGT1JNX0FSUkFZX0JGX0tJTkQgKTsKKwkJCQl9CisJCQl9CisJCQljYXNlIEZPUk1fQlVJTFRJTl9RVUFMSUZJRURfSURFTlRJRklFUl9LSU5EOgorCQkJeworCQkJCWlmKCBjbGFzc0tpbmRCID09IEZPUk1fQlVJTFRJTl9JREVOVElGSUVSX0tJTkQgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCBGT1JNX0JVSUxUSU5fUVVBTElGSUVEX0lERU5USUZJRVJfS0lORCApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlyZXR1cm4oIEZPUk1fQVJSQVlfQkZfS0lORCApOworCQkJCX0KKwkJCX0KKworCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQlyZXR1cm4oIEZPUk1fQVJSQVlfQkZfS0lORCApOworCQkJfQorCQl9CisJfQorfQorCisKK0JGIEJ1aWx0aW5BcnJheTo6Y3JlYXRlKGNvbnN0IEJGVmVjdG9yICYgYXJyYXkpCit7CisJaWYoIGFycmF5Lm5vbmVtcHR5KCkgKQorCXsKKwkJQkZWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gYXJyYXkuZW5kKCk7CisJCUJGVmVjdG9yOjpjb25zdF9pdGVyYXRvciBpdCA9IGFycmF5LmJlZ2luKCk7CisKKwkJY2xhc3Nfa2luZF90IGFUeXBlSWQgPSAoKml0KS5jbGFzc0tpbmQoKTsKKworCQlmb3IoICsraXQgOyBpdCAhPSBpdEVuZCA7ICsraXQgKQorCQl7CisJCQlhVHlwZUlkID0gQnVpbHRpbkFycmF5OjpnZXRBcnJheVR5cGVJZCggYVR5cGVJZCAsICgqaXQpLmNsYXNzS2luZCgpICk7CisJCQlpZiggYVR5cGVJZCA9PSBGT1JNX0FSUkFZX0JGX0tJTkQgKQorCQkJeworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJc3dpdGNoKCBhVHlwZUlkID0gQnVpbHRpbkFycmF5OjpnZXRBcnJheVR5cGVJZCggYVR5cGVJZCApICkKKwkJeworCQkJY2FzZSBGT1JNX0FSUkFZX0JPT0xFQU5fS0lORDoKKwkJCXsKKwkJCQlBcnJheUJvb2xlYW4gKiBidWlsdGluQXJyYXkgPSBuZXcgQXJyYXlCb29sZWFuKCBhcnJheS5zaXplKCkgKTsKKwkJCQlhdm1fc2l6ZV90IGlkeCA9IDA7CisJCQkJZm9yKCBpdCA9IGFycmF5LmJlZ2luKCkgOyBpdCAhPSBpdEVuZCA7ICsraXQsICsraWR4ICkKKwkJCQl7CisJCQkJCWJ1aWx0aW5BcnJheS0+c2V0KGlkeCwgKCppdCkudG9Cb29sZWFuKCkpOworCQkJCX0KKworCQkJCXJldHVybiggQkYoYnVpbHRpbkFycmF5KSApOworCQkJfQorCQkJY2FzZSBGT1JNX0FSUkFZX0NIQVJBQ1RFUl9LSU5EOgorCQkJeworCQkJCUFycmF5Q2hhcmFjdGVyICogYnVpbHRpbkFycmF5ID0gbmV3IEFycmF5Q2hhcmFjdGVyKCBhcnJheS5zaXplKCkgKTsKKwkJCQlhdm1fc2l6ZV90IGlkeCA9IDA7CisJCQkJZm9yKCBpdCA9IGFycmF5LmJlZ2luKCkgOyBpdCAhPSBpdEVuZCA7ICsraXQsICsraWR4ICkKKwkJCQl7CisJCQkJCWJ1aWx0aW5BcnJheS0+c2V0KGlkeCwgKCppdCkudG9Cb29sZWFuKCkpOworCQkJCX0KKworCQkJCXJldHVybiggQkYoYnVpbHRpbkFycmF5KSApOworCQkJfQorCQkJY2FzZSBGT1JNX0FSUkFZX0lOVEVHRVJfS0lORDoKKwkJCXsKKwkJCQlBcnJheUludGVnZXIgKiBidWlsdGluQXJyYXkgPSBuZXcgQXJyYXlJbnRlZ2VyKCBhcnJheS5zaXplKCkgKTsKKwkJCQlhdm1fc2l6ZV90IGlkeCA9IDA7CisJCQkJZm9yKCBpdCA9IGFycmF5LmJlZ2luKCkgOyBpdCAhPSBpdEVuZCA7ICsraXQsICsraWR4ICkKKwkJCQl7CisJCQkJCWJ1aWx0aW5BcnJheS0+c2V0KGlkeCwgKCppdCkudG9JbnRlZ2VyKCkpOworCQkJCX0KKworCQkJCXJldHVybiggQkYoYnVpbHRpbkFycmF5KSApOworCQkJfQorCQkJY2FzZSBGT1JNX0FSUkFZX1JBVElPTkFMX0tJTkQ6CisJCQl7CisJCQkJQXJyYXlSYXRpb25hbCAqIGJ1aWx0aW5BcnJheSA9IG5ldyBBcnJheVJhdGlvbmFsKCBhcnJheS5zaXplKCkgKTsKKwkJCQlhdm1fc2l6ZV90IGlkeCA9IDA7CisJCQkJZm9yKCBpdCA9IGFycmF5LmJlZ2luKCkgOyBpdCAhPSBpdEVuZCA7ICsraXQsICsraWR4ICkKKwkJCQl7CisJCQkJCWJ1aWx0aW5BcnJheS0+c2V0KGlkeCwKKwkJCQkJCQkoKml0KS50b051bWVyYXRvcigpLCAoKml0KS50b0Rlbm9taW5hdG9yKCkpOworCQkJCX0KKworCQkJCXJldHVybiggQkYoYnVpbHRpbkFycmF5KSApOworCQkJfQorCQkJY2FzZSBGT1JNX0FSUkFZX0ZMT0FUX0tJTkQ6CisJCQl7CisJCQkJQXJyYXlGbG9hdCAqIGJ1aWx0aW5BcnJheSA9IG5ldyBBcnJheUZsb2F0KCBhcnJheS5zaXplKCkgKTsKKwkJCQlhdm1fc2l6ZV90IGlkeCA9IDA7CisJCQkJZm9yKCBpdCA9IGFycmF5LmJlZ2luKCkgOyBpdCAhPSBpdEVuZCA7ICsraXQsICsraWR4ICkKKwkJCQl7CisJCQkJCWJ1aWx0aW5BcnJheS0+c2V0KGlkeCwgKCppdCkudG9GbG9hdCgpKTsKKwkJCQl9CisKKwkJCQlyZXR1cm4oIEJGKGJ1aWx0aW5BcnJheSkgKTsKKwkJCX0KKwkJCWNhc2UgRk9STV9BUlJBWV9TVFJJTkdfS0lORDoKKwkJCXsKKwkJCQlBcnJheVN0cmluZyAqIGJ1aWx0aW5BcnJheSA9IG5ldyBBcnJheVN0cmluZyggYXJyYXkuc2l6ZSgpICk7CisJCQkJYXZtX3NpemVfdCBpZHggPSAwOworCQkJCWZvciggaXQgPSBhcnJheS5iZWdpbigpIDsgaXQgIT0gaXRFbmQgOyArK2l0LCArK2lkeCApCisJCQkJeworCQkJCQlidWlsdGluQXJyYXktPnNldChpZHgsICgqaXQpLnRvQnVpbHRpblN0cmluZygpKTsKKwkJCQl9CisKKwkJCQlyZXR1cm4oIEJGKGJ1aWx0aW5BcnJheSkgKTsKKwkJCX0KKwkJCWNhc2UgRk9STV9BUlJBWV9JREVOVElGSUVSX0tJTkQ6CisJCQl7CisJCQkJQXJyYXlJZGVudGlmaWVyICogYnVpbHRpbkFycmF5ID0gbmV3IEFycmF5SWRlbnRpZmllciggYXJyYXkuc2l6ZSgpICk7CisJCQkJYXZtX3NpemVfdCBpZHggPSAwOworCQkJCWZvciggaXQgPSBhcnJheS5iZWdpbigpIDsgaXQgIT0gaXRFbmQgOyArK2l0LCArK2lkeCApCisJCQkJeworCQkJCQlidWlsdGluQXJyYXktPnNldChpZHgsICgqaXQpLnRvSWRlbnRpZmllcigpKTsKKwkJCQl9CisKKwkJCQlyZXR1cm4oIEJGKGJ1aWx0aW5BcnJheSkgKTsKKwkJCX0KKwkJCWNhc2UgRk9STV9BUlJBWV9RVUFMSUZJRURfSURFTlRJRklFUl9LSU5EOgorCQkJeworCQkJCUFycmF5UXVhbGlmaWVkSWRlbnRpZmllciAqIGJ1aWx0aW5BcnJheSA9CisJCQkJCQluZXcgQXJyYXlRdWFsaWZpZWRJZGVudGlmaWVyKCBhcnJheS5zaXplKCkgKTsKKwkJCQlhdm1fc2l6ZV90IGlkeCA9IDA7CisJCQkJZm9yKCBpdCA9IGFycmF5LmJlZ2luKCkgOyBpdCAhPSBpdEVuZCA7ICsraXQsICsraWR4ICkKKwkJCQl7CisJCQkJCWJ1aWx0aW5BcnJheS0+c2V0KGlkeCwgKCppdCkudG9VZmkoKSk7CisJCQkJfQorCisJCQkJcmV0dXJuKCBCRihidWlsdGluQXJyYXkpICk7CisJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJcmV0dXJuKCBCRihuZXcgQXJyYXlCRihUeXBlTWFuYWdlcjo6QVJSQVlfQU5ZLCBhcnJheSkpICk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4oIEJGKG5ldyBBcnJheUJGKFR5cGVNYW5hZ2VyOjpBUlJBWV9BTlksIGFycmF5KSkgKTsKK30KKworCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENBU1QKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0FycmF5QkYgKiBBcnJheUludGVnZXI6OmdldEFycmF5QkYoKQoreworCUFycmF5QkYgKiBiZkFycmF5ID0gbmV3IEFycmF5QkYoIENMQVNTX0tJTkRfVCggSW50ZWdlciApLAorCQkJVHlwZU1hbmFnZXI6OkFSUkFZX0lOVEVHRVIsIHNpemUoKSApOworCisJZm9yKCBhdm1fc2l6ZV90IGlkeCA9IDAgOyBpZHggPCBzaXplKCkgOyArK2lkeCApCisJeworCQliZkFycmF5LT5zZXQoaWR4LCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0ludGVnZXIoZ2V0KGlkeCkpKTsKKwl9CisKKwlyZXR1cm4oIGJmQXJyYXkgKTsKK30KKworCisKK0FycmF5QkYgKiBBcnJheVJhdGlvbmFsOjpnZXRBcnJheUJGKCkKK3sKKwlBcnJheUJGICogYmZBcnJheSA9IG5ldyBBcnJheUJGKCBDTEFTU19LSU5EX1QoIFJhdGlvbmFsICksCisJCQlUeXBlTWFuYWdlcjo6QVJSQVlfUkFUSU9OQUwsIHNpemUoKSApOworCisJZm9yKCBhdm1fc2l6ZV90IGlkeCA9IDAgOyBpZHggPCBzaXplKCkgOyArK2lkeCApCisJeworCQliZkFycmF5LT5zZXQoaWR4LCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld1JhdGlvbmFsKAorCQkJCWdldChpZHgpLmZpcnN0KCksIGdldChpZHgpLnNlY29uZCgpKSk7CisJfQorCisJcmV0dXJuKCBiZkFycmF5ICk7Cit9CisKK0FycmF5QkYgKiBBcnJheUZsb2F0OjpnZXRBcnJheUJGKCkKK3sKKwlBcnJheUJGICogYmZBcnJheSA9IG5ldyBBcnJheUJGKCBDTEFTU19LSU5EX1QoIEZsb2F0ICksCisJCQlUeXBlTWFuYWdlcjo6QVJSQVlfRkxPQVQsIHNpemUoKSApOworCisJZm9yKCBhdm1fc2l6ZV90IGlkeCA9IDAgOyBpZHggPCBzaXplKCkgOyArK2lkeCApCisJeworCQliZkFycmF5LT5zZXQoaWR4LCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Zsb2F0KGdldChpZHgpKSk7CisJfQorCisJcmV0dXJuKCBiZkFycmF5ICk7Cit9CisKKworQXJyYXlCRiAqIEFycmF5Q2hhcmFjdGVyOjpnZXRBcnJheUJGKCkKK3sKKwlBcnJheUJGICogYmZBcnJheSA9IG5ldyBBcnJheUJGKCBDTEFTU19LSU5EX1QoIENoYXJhY3RlciApLAorCQkJVHlwZU1hbmFnZXI6OkFSUkFZX0NIQVJBQ1RFUiwgc2l6ZSgpICk7CisKKwlmb3IoIGF2bV9zaXplX3QgaWR4ID0gMCA7IGlkeCA8IHNpemUoKSA7ICsraWR4ICkKKwl7CisJCWJmQXJyYXktPnNldChpZHgsIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q2hhcihnZXQoaWR4KSkpOworCX0KKworCXJldHVybiggYmZBcnJheSApOworfQorCisKKworQXJyYXlCRiAqIEFycmF5Qm9vbGVhbjo6Z2V0QXJyYXlCRigpCit7CisJQXJyYXlCRiAqIGJmQXJyYXkgPSBuZXcgQXJyYXlCRiggQ0xBU1NfS0lORF9UKCBCb29sZWFuICksCisJCQlUeXBlTWFuYWdlcjo6QVJSQVlfQk9PTEVBTiwgc2l6ZSgpICk7CisKKwlmb3IoIGF2bV9zaXplX3QgaWR4ID0gMCA7IGlkeCA8IHNpemUoKSA7ICsraWR4ICkKKwl7CisJCWJmQXJyYXktPnNldChpZHgsIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbihnZXQoaWR4KSkpOworCX0KKworCXJldHVybiggYmZBcnJheSApOworfQorCisKKworQXJyYXlCRiAqIEFycmF5U3RyaW5nOjpnZXRBcnJheUJGKCkKK3sKKwlBcnJheUJGICogYmZBcnJheSA9IG5ldyBBcnJheUJGKCBDTEFTU19LSU5EX1QoIFN0cmluZyApLAorCQkJVHlwZU1hbmFnZXI6OkFSUkFZX1NUUklORywgc2l6ZSgpICk7CisKKwlmb3IoIGF2bV9zaXplX3QgaWR4ID0gMCA7IGlkeCA8IHNpemUoKSA7ICsraWR4ICkKKwl7CisJCWJmQXJyYXktPnNldChpZHgsIEJGKG5ldyBTdHJpbmcoZ2V0KGlkeCkpKSk7CisJfQorCisJcmV0dXJuKCBiZkFycmF5ICk7Cit9CisKKworCitBcnJheUJGICogQXJyYXlJZGVudGlmaWVyOjpnZXRBcnJheUJGKCkKK3sKKwlBcnJheUJGICogYmZBcnJheSA9IG5ldyBBcnJheUJGKCBDTEFTU19LSU5EX1QoIElkZW50aWZpZXIgKSwKKwkJCVR5cGVNYW5hZ2VyOjpBUlJBWV9JREVOVElGSUVSLCBzaXplKCkgKTsKKworCWZvciggYXZtX3NpemVfdCBpZHggPSAwIDsgaWR4IDwgc2l6ZSgpIDsgKytpZHggKQorCXsKKwkJYmZBcnJheS0+c2V0KGlkeCwgQkYobmV3IElkZW50aWZpZXIoZ2V0KGlkeCkpKSk7CisJfQorCisJcmV0dXJuKCBiZkFycmF5ICk7Cit9CisKKworQXJyYXlCRiAqIEFycmF5UXVhbGlmaWVkSWRlbnRpZmllcjo6Z2V0QXJyYXlCRigpCit7CisJQXJyYXlCRiAqIGJmQXJyYXkgPSBuZXcgQXJyYXlCRiggQ0xBU1NfS0lORF9UKCBRdWFsaWZpZWRJZGVudGlmaWVyICksCisJCQlUeXBlTWFuYWdlcjo6QVJSQVlfUVVBTElGSUVEX0lERU5USUZJRVIsIHNpemUoKSApOworCisJZm9yKCBhdm1fc2l6ZV90IGlkeCA9IDAgOyBpZHggPCBzaXplKCkgOyArK2lkeCApCisJeworCQliZkFycmF5LT5zZXQoaWR4LCBCRihuZXcgUXVhbGlmaWVkSWRlbnRpZmllcihnZXQoaWR4KSkpKTsKKwl9CisKKwlyZXR1cm4oIGJmQXJyYXkgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ09QWQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBBcnJheUJGOjpjb3B5KEJ1aWx0aW5BcnJheSAqIGludHB1dEFycmF5LCBhdm1fc2l6ZV90IGNvdW50KQoreworCXN3aXRjaCggaW50cHV0QXJyYXktPmNsYXNzS2luZCgpICkKKwl7CisJCWNhc2UgRk9STV9BUlJBWV9CT09MRUFOX0tJTkQ6CisJCXsKKwkJCUFycmF5Qm9vbGVhbiAqIGJ1aWx0aW5BcnJheSA9IGludHB1dEFycmF5LT50bzwgQXJyYXlCb29sZWFuID4oKTsKKwkJCWZvciggYXZtX3NpemVfdCBpZHggPSAwIDsgaWR4IDwgY291bnQgOyArK2lkeCApCisJCQl7CisJCQkJc2V0KGlkeCwgRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKGJ1aWx0aW5BcnJheS0+Z2V0KGlkeCkpKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgRk9STV9BUlJBWV9DSEFSQUNURVJfS0lORDoKKwkJeworCQkJQXJyYXlDaGFyYWN0ZXIgKiBidWlsdGluQXJyYXkgPSBpbnRwdXRBcnJheS0+dG88IEFycmF5Q2hhcmFjdGVyID4oKTsKKwkJCWZvciggYXZtX3NpemVfdCBpZHggPSAwIDsgaWR4IDwgY291bnQgOyArK2lkeCApCisJCQl7CisJCQkJc2V0KGlkeCwgRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDaGFyKGJ1aWx0aW5BcnJheS0+Z2V0KGlkeCkpKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgRk9STV9BUlJBWV9JTlRFR0VSX0tJTkQ6CisJCXsKKwkJCUFycmF5SW50ZWdlciAqIGJ1aWx0aW5BcnJheSA9IGludHB1dEFycmF5LT50bzwgQXJyYXlJbnRlZ2VyID4oKTsKKwkJCWZvciggYXZtX3NpemVfdCBpZHggPSAwIDsgaWR4IDwgY291bnQgOyArK2lkeCApCisJCQl7CisJCQkJc2V0KGlkeCwgRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdJbnRlZ2VyKGJ1aWx0aW5BcnJheS0+Z2V0KGlkeCkpKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgRk9STV9BUlJBWV9SQVRJT05BTF9LSU5EOgorCQl7CisJCQlBcnJheVJhdGlvbmFsICogYnVpbHRpbkFycmF5ID0gaW50cHV0QXJyYXktPnRvPCBBcnJheVJhdGlvbmFsID4oKTsKKwkJCWZvciggYXZtX3NpemVfdCBpZHggPSAwIDsgaWR4IDwgY291bnQgOyArK2lkeCApCisJCQl7CisJCQkJc2V0KGlkeCwgRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdSYXRpb25hbCgKKwkJCQkJCQkJYnVpbHRpbkFycmF5LT5nZXQoaWR4KS5maXJzdCgpLAorCQkJCQkJCQlidWlsdGluQXJyYXktPmdldChpZHgpLnNlY29uZCgpKSk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQljYXNlIEZPUk1fQVJSQVlfRkxPQVRfS0lORDoKKwkJeworCQkJQXJyYXlGbG9hdCAqIGJ1aWx0aW5BcnJheSA9IGludHB1dEFycmF5LT50bzwgQXJyYXlGbG9hdCA+KCk7CisJCQlmb3IoIGF2bV9zaXplX3QgaWR4ID0gMCA7IGlkeCA8IGNvdW50IDsgKytpZHggKQorCQkJeworCQkJCXNldChpZHgsIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3RmxvYXQoYnVpbHRpbkFycmF5LT5nZXQoaWR4KSkpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBGT1JNX0FSUkFZX1NUUklOR19LSU5EOgorCQl7CisJCQlBcnJheVN0cmluZyAqIGJ1aWx0aW5BcnJheSA9IGludHB1dEFycmF5LT50bzwgQXJyYXlTdHJpbmcgPigpOworCQkJZm9yKCBhdm1fc2l6ZV90IGlkeCA9IDAgOyBpZHggPCBjb3VudCA7ICsraWR4ICkKKwkJCXsKKwkJCQlzZXQoaWR4LCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld1N0cmluZyhidWlsdGluQXJyYXktPmdldChpZHgpKSk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQljYXNlIEZPUk1fQVJSQVlfSURFTlRJRklFUl9LSU5EOgorCQl7CisJCQlBcnJheUlkZW50aWZpZXIgKiBidWlsdGluQXJyYXkgPSBpbnRwdXRBcnJheS0+dG88IEFycmF5SWRlbnRpZmllciA+KCk7CisJCQlmb3IoIGF2bV9zaXplX3QgaWR4ID0gMCA7IGlkeCA8IGNvdW50IDsgKytpZHggKQorCQkJeworCQkJCXNldChpZHgsIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3SWRlbnRpZmllcihidWlsdGluQXJyYXktPmdldChpZHgpKSk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQljYXNlIEZPUk1fQVJSQVlfUVVBTElGSUVEX0lERU5USUZJRVJfS0lORDoKKwkJeworCQkJQXJyYXlRdWFsaWZpZWRJZGVudGlmaWVyICogYnVpbHRpbkFycmF5ID0KKwkJCQkJaW50cHV0QXJyYXktPnRvPCBBcnJheVF1YWxpZmllZElkZW50aWZpZXIgPigpOworCQkJZm9yKCBhdm1fc2l6ZV90IGlkeCA9IDAgOyBpZHggPCBjb3VudCA7ICsraWR4ICkKKwkJCXsKKwkJCQlzZXQoaWR4LCBFeHByZXNzaW9uQ29uc3RydWN0b3I6OgorCQkJCQkJbmV3UXVhbGlmaWVkSWRlbnRpZmllcihidWlsdGluQXJyYXktPmdldChpZHgpKSk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgRk9STV9BUlJBWV9CRl9LSU5EOgorCQl7CisJCQlBcnJheUJGICogYnVpbHRpbkFycmF5ID0gaW50cHV0QXJyYXktPnRvPCBBcnJheUJGID4oKTsKKwkJCWZvciggYXZtX3NpemVfdCBpZHggPSAwIDsgaWR4IDwgY291bnQgOyArK2lkeCApCisJCQl7CisJCQkJaWYoIGJ1aWx0aW5BcnJheS0+Z2V0KGlkeCkuaXNfc3RyaWN0bHk8IEJ1aWx0aW5BcnJheSA+KCkgKQorCQkJCXsKKwkJCQkJc2V0KGlkeCwgQkYoYnVpbHRpbkFycmF5LT5nZXQoaWR4KS4KKwkJCQkJCQl0b19wdHI8IEJ1aWx0aW5BcnJheSA+KCktPmdldEFycmF5QkYoKSkpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlzZXQoaWR4LCBidWlsdGluQXJyYXktPmdldChpZHgpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCTw8ICJBcnJheU1hbmFnZXI6OmNvcHk6PiBVbmV4cGVjdGVkIGlucHV0IGFycmF5IGZvciBjb3B5ICEhISIKKwkJCQkJPDwgU0VORF9FWElUOworCisJCQlicmVhazsKKwkJfQorCX0KK30KKworCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU0VSSUFMSVpBVElPTgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK3N0ZDo6c3RyaW5nIEFycmF5QkY6OnN0cigpIGNvbnN0Cit7CisJU3RyaW5nT3V0U3RyZWFtIG9zcyggQVZNX1NUUl9JTkRFTlQgKTsKKworQVZNX0lGX0RFQlVHX0ZMQUdfQU5EKCBCWVRFQ09ERSAsIGhhc0luc3RydWN0aW9uKCkgKQorCisJQVZNX0RFQlVHX0RJU0FCTEVfRkxBRyggQllURUNPREUgKQorCisJdG9TdHJlYW0oIG9zcyA8PCBJR05PUkVfRklSU1RfVEFCICk7CisKKwlBVk1fREVCVUdfRU5BQkxFX0ZMQUcoIEJZVEVDT0RFICkKKworQVZNX0VMU0UKKworCXRvU3RyZWFtKCBvc3MgPDwgSUdOT1JFX0ZJUlNUX1RBQiApOworCitBVk1fRU5ESUZfREVCVUdfRkxBR19BTkQoIEJZVEVDT0RFICkKKworCXJldHVybiggb3NzLnN0cigpICk7Cit9CisKK3ZvaWQgQXJyYXlCRjo6dG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJb3MgPDwgVEFCIDw8IEFWTV9ERUJVR19SRUZfQ09VTlRFUigpOworCitBVk1fSUZfREVCVUdfRkxBR19BTkQoIEJZVEVDT0RFICwgaGFzSW5zdHJ1Y3Rpb24oKSApCisJZ2V0SW5zdHJ1Y3Rpb24oKS0+dG9TdHJlYW0ob3MpOworQVZNX0VORElGX0RFQlVHX0ZMQUdfQU5EKCBCWVRFQ09ERSApCisKKwlpZiggbVR5cGVTcGVjaWZpZXItPmhhc1R5cGVTdHJ1Y3R1cmVPckNob2ljZU9yVW5pb24oKSApCisJeworCQlCYXNlU3ltYm9sVHlwZVNwZWNpZmllciAqIHN0cnVjVCA9CisJCQkJbVR5cGVTcGVjaWZpZXItPmFzPCBCYXNlU3ltYm9sVHlwZVNwZWNpZmllciA+KCk7CisKK0FWTV9JRl9ERUJVR19GTEFHKCBEQVRBICkKKwlvcyA8PCAiPCIgPDwgc3RydWNULT5zdHJUKCkgPDwgIj4iOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIERBVEEgKQorCisJCW9zIDw8ICJ7ICI7CisJCWlmKCBtU2l6ZSA+IDAgKQorCQl7CisJCQlvcyA8PCBzdHJ1Y1QtPmdldFN5bWJvbERhdGEoMCkuc3RyVmFsdWUoIG1UYWJsZVswXSApOworCQkJZm9yKCBhdm1fc2l6ZV90IGlkeCA9IDEgOyBpZHggPCBtU2l6ZSA7ICsraWR4ICkKKwkJCXsKKwkJCQlvcyA8PCAiICwgIiA8PCBzdHJ1Y1QtPmdldFN5bWJvbERhdGEoaWR4KS5zdHJWYWx1ZSggbVRhYmxlW2lkeF0gKTsKKwkJCX0KKwkJfQorCQlvcyA8PCAiIH0iOworCX0KKwllbHNlCisJeworQVZNX0lGX0RFQlVHX0ZMQUcoIERBVEEgKQorCW9zIDw8ICI8IiA8PCBtVHlwZVNwZWNpZmllci0+c3RyVCgpIDw8ICI+IjsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBEQVRBICkKKworCQlvcyA8PCAoIG1UeXBlU3BlY2lmaWVyLT5pc1R5cGVkQXJyYXkoKSA/ICAiWyAiICA6ICAieyAiICk7CisJCWlmKCBtU2l6ZSA+IDAgKQorCQl7CisJCQlvcyA8PCBtVGFibGVbMF0uc3RyKCk7CisJCQlmb3IoIGF2bV9zaXplX3QgaWR4ID0gMSA7IGlkeCA8IG1TaXplIDsgKytpZHggKQorCQkJeworCQkJCW9zIDw8ICIgLCAiIDw8IG1UYWJsZVtpZHhdLnN0cigpOworCQkJfQorCQl9CisJCW9zIDw8ICggbVR5cGVTcGVjaWZpZXItPmlzVHlwZWRBcnJheSgpID8gIiBdIiA6ICIgfSIgKTsKKwl9CisKKwlvcyA8PCBFT0w7Cit9CisKKworCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL0J1aWx0aW5BcnJheS5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4cHJlc3Npb24vQnVpbHRpbkFycmF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg0Mzk3MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL0J1aWx0aW5BcnJheS5oCkBAIC0wLDAgKzEsMTQwMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDggZsOpdnIuIDIwMTAKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBCVUlMVElOQVJSQVlfSF8KKyNkZWZpbmUgQlVJTFRJTkFSUkFZX0hfCisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9CdWlsdGluQ29udGFpbmVyLmg+CisKKyNpbmNsdWRlIDxjb2xsZWN0aW9uL1BhaXIuaD4KKworI2luY2x1ZGUgPGNvbW1vbi9CRi5oPgorCisjaW5jbHVkZSA8Zm1sL3R5cGUvQmFzZVR5cGVTcGVjaWZpZXIuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworY2xhc3MgQXJyYXlCRjsKK2NsYXNzIEF2bUluc3RydWN0aW9uOworCisKK2NsYXNzIEJ1aWx0aW5BcnJheSA6CisJCXB1YmxpYyBCdWlsdGluQ29sbGVjdGlvbiAsCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggQnVpbHRpbkFycmF5ICkKK3sKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlCYXNlVHlwZVNwZWNpZmllciAqIG1UeXBlU3BlY2lmaWVyOworCisJYXZtX3NpemVfdCBtU2l6ZTsKKworCitwdWJsaWM6CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlCdWlsdGluQXJyYXkoY2xhc3Nfa2luZF90IGFUeXBlSWQsCisJCQlCYXNlVHlwZVNwZWNpZmllciAqIGFUeXBlU3BlY2lmaWVyLCBhdm1fc2l6ZV90IGFTaXplID0gMCkKKwk6IEJ1aWx0aW5Db2xsZWN0aW9uKCBhVHlwZUlkICksCisJbVR5cGVTcGVjaWZpZXIoIGFUeXBlU3BlY2lmaWVyICksCisJbVNpemUoIGFTaXplICkKKwl7CisJCS8vISEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIENvcHkKKwkgKi8KKwlCdWlsdGluQXJyYXkoY29uc3QgQnVpbHRpbkFycmF5ICYgYW5BcnJheSkKKwk6IEJ1aWx0aW5Db2xsZWN0aW9uKCBhbkFycmF5ICksCisJbVR5cGVTcGVjaWZpZXIoIGFuQXJyYXkubVR5cGVTcGVjaWZpZXIgKSwKKwltU2l6ZSggYW5BcnJheS5tU2l6ZSApCisJeworCQkvLyEhISBOT1RISU5HCisJfQorCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkJ1aWx0aW5BcnJheSgpCisJeworCQltU2l6ZSA9IDA7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtVHlwZVNwZWNpZmllcgorCSAqLworCWlubGluZSBCYXNlVHlwZVNwZWNpZmllciAqIGdldFR5cGVTcGVjaWZpZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVHlwZVNwZWNpZmllciApOworCX0KKworCWlubGluZSBhdm1fdHlwZV9zcGVjaWZpZXJfa2luZF90IGdldFR5cGVTcGVjaWZpZXJLaW5kKCkgY29uc3QKKwl7CisJCXJldHVybiggKG1UeXBlU3BlY2lmaWVyICE9IE5VTEwpID8KKwkJCQltVHlwZVNwZWNpZmllci0+Z2V0VHlwZVNwZWNpZmllcktpbmQoKSA6IFRZUEVfTlVMTF9TUEVDSUZJRVIgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNUeXBlU3BlY2lmaWVyKCkgY29uc3QKKwl7CisJCXJldHVybiggbVR5cGVTcGVjaWZpZXIgIT0gTlVMTCApOworCX0KKworCisJaW5saW5lIHZvaWQgc2V0VHlwZVNwZWNpZmllcihCYXNlVHlwZVNwZWNpZmllciAqIGFUeXBlU3BlY2lmaWVyKQorCXsKKwkJbVR5cGVTcGVjaWZpZXIgPSBhVHlwZVNwZWNpZmllcjsKKwl9CisKKworCS8vIHNpemUgaXMgY29uc3RhbnQKKwlpbmxpbmUgYXZtX3NpemVfdCBzaXplKCkgY29uc3QKKwl7CisJCXJldHVybiggbVNpemUgKTsKKwl9CisKKwlpbmxpbmUgYXZtX3NpemVfdCBjYXBhY2l0eSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1TaXplICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0Q2FwYWNpdHkobG9uZyBhQ2FwYWNpdHkpCisJeworCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVCA8PCAiTk8gU0VOU0UgSEVSRSAhISEiIDw8IFNFTkRfRVhJVDsKKwl9CisKKworCWlubGluZSBib29sIGVtcHR5KCkgY29uc3QKKwl7CisJCXJldHVybiggbVNpemUgPT0gMCApOworCX0KKworCWlubGluZSBib29sIG5vbmVtcHR5KCkgY29uc3QKKwl7CisJCXJldHVybiggbVNpemUgPiAwICk7CisJfQorCisJaW5saW5lIGJvb2wgc2luZ2xldG9uKCkgY29uc3QKKwl7CisJCXJldHVybiggbVNpemUgPT0gMSApOworCX0KKworCWlubGluZSBib29sIHBvcHVsYXRlZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1TaXplID4gMSApOworCX0KKworCisKKwlpbmxpbmUgdmlydHVhbCBib29sIGNvbnRhaW5zKGNvbnN0IEJGICYgYXJnKSBjb25zdAorCXsKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCisJLy8gQ0FTVAorCXZpcnR1YWwgQXJyYXlCRiAqIGdldEFycmF5QkYoKSA9IDA7CisKKworCXN0YXRpYyBjbGFzc19raW5kX3QgZ2V0QXJyYXlUeXBlSWQoY2xhc3Nfa2luZF90IGFUeXBlSWQpOworCisJc3RhdGljIGNsYXNzX2tpbmRfdCBnZXRBcnJheVR5cGVJZCgKKwkJCWNsYXNzX2tpbmRfdCBjbGFzc0tpbmRBLCBjbGFzc19raW5kX3QgY2xhc3NLaW5kQik7CisKKwlzdGF0aWMgQkYgY3JlYXRlKGNvbnN0IEJGVmVjdG9yICYgYXJyYXkpOworCisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJdmlydHVhbCBzdGQ6OnN0cmluZyBzdHIoYXZtX3NpemVfdCBvZmZzZXQpIGNvbnN0ID0gMDsKKworfTsKKworCisKK3RlbXBsYXRlPCB0eXBlbmFtZSBUID4KK2NsYXNzIF9CdWlsdGluQXJyYXlfICA6ICBwdWJsaWMgQnVpbHRpbkFycmF5Cit7CisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBBVFRSSUJVVEVTCisJICovCisKKwlUICogbVRhYmxlOworCisKK3B1YmxpYzoKKworCS8qKgorCSAqIFRZUEVERUYKKwkgKiBpdGVyYXRvcgorCSAqIHJlZmVyZW5jZQorCSAqLworCXR5cGVkZWYgICAgICAgVCAqIGl0ZXJhdG9yOworCXR5cGVkZWYgY29uc3QgVCAqIGNvbnN0X2l0ZXJhdG9yOworCisJdHlwZWRlZiAgICAgICBUICYgcmVmZXJlbmNlOworCXR5cGVkZWYgY29uc3QgVCAmIGNvbnN0X3JlZmVyZW5jZTsKKworCXR5cGVkZWYgc3RkOjp2ZWN0b3I8IFQgPiBCYXNlVmVjdG9yOworCisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlfQnVpbHRpbkFycmF5XyhjbGFzc19raW5kX3QgYVR5cGVJZCwgQmFzZVR5cGVTcGVjaWZpZXIgKiBhVHlwZVNwZWNpZmllciwKKwkJCWF2bV9zaXplX3QgYVNpemUgPSAwKQorCTogQnVpbHRpbkFycmF5KCBhVHlwZUlkICwgYVR5cGVTcGVjaWZpZXIsIGFTaXplICksCisJbVRhYmxlKCBOVUxMICkKKwl7CisJCWFsbG9jKCBhU2l6ZSApOworCX0KKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCV9CdWlsdGluQXJyYXlfKGNvbnN0IF9CdWlsdGluQXJyYXlfICYgYW5BcnJheSkKKwk6IEJ1aWx0aW5BcnJheSggYW5BcnJheSApLAorCW1UYWJsZSggTlVMTCApCisJeworCQlhbGxvYyggYW5BcnJheSApOworCX0KKworCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBPdGhlcgorCSAqLworCV9CdWlsdGluQXJyYXlfKGNsYXNzX2tpbmRfdCBhVHlwZUlkLCBCYXNlVHlwZVNwZWNpZmllciAqIGFUeXBlU3BlY2lmaWVyLAorCQkJYXZtX3NpemVfdCBhU2l6ZSwgVCBkZWZhdWx0VmFsdWUpCisJOiBCdWlsdGluQXJyYXkoIGFUeXBlSWQgLCBhVHlwZVNwZWNpZmllciAsIGFTaXplICksCisJbVRhYmxlKCBOVUxMICkKKwl7CisJCWFsbG9jKCBhU2l6ZSAsIGRlZmF1bHRWYWx1ZSApOworCX0KKworCV9CdWlsdGluQXJyYXlfKGNsYXNzX2tpbmRfdCBhVHlwZUlkLCBCYXNlVHlwZVNwZWNpZmllciAqIGFUeXBlU3BlY2lmaWVyLAorCQkJY29uc3QgQmFzZVZlY3RvciAmIGFuQXJyYXkpCisJOiBCdWlsdGluQXJyYXkoIGFUeXBlSWQgLCBhVHlwZVNwZWNpZmllciAsIGFuQXJyYXkuc2l6ZSgpICksCisJbVRhYmxlKCBOVUxMICkKKwl7CisJCWFsbG9jKCBhbkFycmF5ICk7CisJfQorCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+X0J1aWx0aW5BcnJheV8oKQorCXsKKwkJZGVzdHJveUNvbnRlbnQoKTsKKworCQlkZWxldGVbXSAoIG1UYWJsZSApOworCisJCW1UYWJsZSA9IE5VTEw7CisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCBkZXN0cm95Q29udGVudCgpCisJeworLy8JCWZvciggYXZtX3NpemVfdCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgbVNpemUgOyArK29mZnNldCApCisvLwkJeworLy8JCQlzZXA6OmRlc3Ryb3koIG1UYWJsZVtvZmZzZXRdICk7CisvLwkJfQorCX0KKworCisJLyoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogUkVTRVQKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisKKwl2b2lkIHJlc2V0KFQgdmFsdWUpCisJeworCQlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMCA7IG9mZnNldCA8IG1TaXplIDsgKytvZmZzZXQgKQorCQl7CisJCQltVGFibGVbb2Zmc2V0XSA9IHZhbHVlOworCQl9CisJfQorCisKKwkvKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBBTExPQ0FUSU9OCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCisJaW5saW5lIHZvaWQgYWxsb2MoYXZtX3NpemVfdCBhU2l6ZSkKKwl7CisJCW1TaXplID0gYVNpemU7CisKKwkJbVRhYmxlID0gKCAobVNpemUgPiAwKT8gKG5ldyBUWyBtU2l6ZSBdKSA6IE5VTEwgKTsKKwl9CisKKworCWlubGluZSB2b2lkIGFsbG9jKGF2bV9zaXplX3QgYVNpemUsIFQgZGVmYXVsdFZhbHVlKQorCXsKKwkJYWxsb2MoIGFTaXplICk7CisKKwkJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDAgOyBvZmZzZXQgPCBtU2l6ZSA7ICsrb2Zmc2V0ICkKKwkJeworCQkJbVRhYmxlW29mZnNldF0gPSBkZWZhdWx0VmFsdWU7CisJCX0KKwl9CisKKworCWlubGluZSB2b2lkIGFsbG9jKGNvbnN0IF9CdWlsdGluQXJyYXlfICYgYW5BcnJheSkKKwl7CisJCWFsbG9jKCBhbkFycmF5LnNpemUoKSApOworCisJCWZvciggYXZtX3NpemVfdCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgbVNpemUgOyArK29mZnNldCApCisJCXsKKy8vCQkJbVRhYmxlW29mZnNldF0gPSBhbkFycmF5W29mZnNldF07CisJCQltVGFibGVbb2Zmc2V0XSA9IGFuQXJyYXkuZ2V0KG9mZnNldCk7CisJCX0KKwl9CisKKworCWlubGluZSB2b2lkIGFsbG9jKGNvbnN0IEJhc2VWZWN0b3IgJiBhbkFycmF5KQorCXsKKwkJYWxsb2MoIGFuQXJyYXkuc2l6ZSgpICk7CisKKwkJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDAgOyBvZmZzZXQgPCBtU2l6ZSA7ICsrb2Zmc2V0ICkKKwkJeworCQkJbVRhYmxlW29mZnNldF0gPSBhbkFycmF5W29mZnNldF07CisJCX0KKwl9CisKKworCisJLyoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogUkUtQUxMT0NBVElPTgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKi8KKworCWlubGluZSB2b2lkIHJlYWxsb2MoYXZtX3NpemVfdCBhU2l6ZSkKKwl7CisJCWRlc3Ryb3lDb250ZW50KCk7CisKKwkJaWYoIG1TaXplICE9IGFTaXplICkKKwkJeworCQkJZGVsZXRlW10gKCBtVGFibGUgKTsKKworCQkJYWxsb2MoIGFTaXplICk7CisJCX0KKwl9CisKKworCWlubGluZSB2b2lkIHJlYWxsb2MoYXZtX3NpemVfdCBhU2l6ZSwgVCBkZWZhdWx0VmFsdWUpCisJeworCQlkZXN0cm95Q29udGVudCgpOworCisJCWlmKCBtU2l6ZSAhPSBhU2l6ZSApCisJCXsKKwkJCWRlbGV0ZVtdICggbVRhYmxlICk7CisKKwkJCWFsbG9jKCBhU2l6ZSApOworCQl9CisKKwkJcmVzZXQoIGRlZmF1bHRWYWx1ZSApOworCX0KKworCisJaW5saW5lIHZvaWQgcmVhbGxvYyhjb25zdCBfQnVpbHRpbkFycmF5XyAmIGFuQXJyYXkpCisJeworCQlkZXN0cm95Q29udGVudCgpOworCisJCWlmKCBtU2l6ZSAhPSBhbkFycmF5LnNpemUoKSApCisJCXsKKwkJCWRlbGV0ZVtdICggbVRhYmxlICk7CisKKwkJCWFsbG9jKCBhbkFycmF5LnNpemUoKSApOworCQl9CisKKwkJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDAgOyBvZmZzZXQgPCBtU2l6ZSA7ICsrb2Zmc2V0ICkKKwkJeworCQkJbVRhYmxlW29mZnNldF0gPSBhbkFycmF5W29mZnNldF07CisJCX0KKwl9CisKKworCWlubGluZSB2b2lkIHJlYWxsb2MoY29uc3QgQmFzZVZlY3RvciAmIGFuQXJyYXkpCisJeworCQlkZXN0cm95Q29udGVudCgpOworCisJCWlmKCBtU2l6ZSAhPSBhbkFycmF5LnNpemUoKSApCisJCXsKKwkJCWRlbGV0ZVtdICggbVRhYmxlICk7CisKKwkJCWFsbG9jKCBhbkFycmF5LnNpemUoKSApOworCQl9CisKKwkJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDAgOyBvZmZzZXQgPCBtU2l6ZSA7ICsrb2Zmc2V0ICkKKwkJeworCQkJbVRhYmxlW29mZnNldF0gPSBhbkFycmF5W29mZnNldF07CisJCX0KKwl9CisKKworCS8qCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFJFLVNJWkUKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisKKwlpbmxpbmUgdm9pZCByZXNpemUoYXZtX3NpemVfdCBhU2l6ZSkKKwl7CisJCWlmKCBtU2l6ZSA+IDAgKQorCQl7CisJCQlhdm1fc2l6ZV90IG9sZFNpemUgPSBtU2l6ZTsKKwkJCVQgKiBvbGRUYWJsZSA9IG1UYWJsZTsKKworCQkJYWxsb2MoIGFTaXplICk7CisKKwkJCWlmKCBhU2l6ZSA+IG9sZFNpemUgKQorCQkJeworCQkJCWFTaXplID0gb2xkU2l6ZTsKKwkJCX0KKworCQkJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDAgOyBvZmZzZXQgPCBhU2l6ZSA7ICsrb2Zmc2V0ICkKKwkJCXsKKwkJCQltVGFibGVbb2Zmc2V0XSA9IG9sZFRhYmxlW29mZnNldF07CisJCQl9CisKKwkJCWRlbGV0ZVtdIG9sZFRhYmxlOworCQl9CisKKwkJZWxzZQorCQl7CisJCQlhbGxvYyhhU2l6ZSk7CisJCX0KKwl9CisKKwlpbmxpbmUgdm9pZCByZXNpemUoYXZtX3NpemVfdCBhU2l6ZSwgVCBkZWZhdWx0VmFsdWUpCisJeworCQlpZiggbVNpemUgPiAwICkKKwkJeworCQkJYXZtX3NpemVfdCBvbGRTaXplID0gbVNpemU7CisJCQlUICogb2xkVGFibGUgPSBtVGFibGU7CisKKwkJCWFsbG9jKCBhU2l6ZSApOworCisJCQlhdm1fc2l6ZV90IG9mZnNldCA9IDA7CisKKwkJCWlmKCBhU2l6ZSA+IG9sZFNpemUgKQorCQkJeworCQkJCWFTaXplID0gb2xkU2l6ZTsKKwkJCX0KKworCQkJZm9yKCA7IG9mZnNldCA8IGFTaXplIDsgKytvZmZzZXQgKQorCQkJeworCQkJCW1UYWJsZVtvZmZzZXRdID0gb2xkVGFibGVbb2Zmc2V0XTsKKwkJCX0KKworCQkJZm9yKCA7IG9mZnNldCA8IG1TaXplIDsgKytvZmZzZXQgKQorCQkJeworCQkJCW1UYWJsZVtvZmZzZXRdID0gZGVmYXVsdFZhbHVlOworCQkJfQorCisJCQlkZWxldGVbXSBvbGRUYWJsZTsKKwkJfQorCisJCWVsc2UKKwkJeworCQkJYWxsb2MoYVNpemUsIGRlZmF1bHRWYWx1ZSk7CisJCX0KKwl9CisKKworCS8qKgorCSAqIElURVJBVE9SCisJICovCisKKwlpbmxpbmUgaXRlcmF0b3IgYmVnaW4oKQorCXsKKwkJcmV0dXJuKCBtVGFibGUgKTsKKwl9CisKKwlpbmxpbmUgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVGFibGUgKTsKKwl9CisKKwlpbmxpbmUgaXRlcmF0b3IgZW5kKCkKKwl7CisJCXJldHVybiggbVRhYmxlICsgbVNpemUgKTsKKwl9CisKKwlpbmxpbmUgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QKKwl7CisJCXJldHVybiggbVRhYmxlICsgbVNpemUgKTsKKwl9CisKKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVRhYmxlCisJICovCisvLwlpbmxpbmUgY29uc3RfcmVmZXJlbmNlIGF0KGF2bV9zaXplX3Qgb2Zmc2V0KSBjb25zdAorLy8JeworLy8JCUFWTV9PU19BU1NFUlRfRkFUQUxfQVJSQVlfSU5ERVhfRVhJVCggb2Zmc2V0ICwgbVNpemUgKSA8PCBTRU5EX0VYSVQ7CisvLworLy8JCXJldHVybiggbVRhYmxlW29mZnNldF0gKTsKKy8vCX0KKworCWlubGluZSByZWZlcmVuY2UgZ2V0KGF2bV9zaXplX3Qgb2Zmc2V0KQorCXsKKwkJcmV0dXJuKCBtVGFibGVbb2Zmc2V0XSApOworCX0KKworCisJaW5saW5lIGNvbnN0X3JlZmVyZW5jZSBnZXQoYXZtX3NpemVfdCBvZmZzZXQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZVtvZmZzZXRdICk7CisJfQorCisKKwlpbmxpbmUgdm9pZCBzZXQoYXZtX3NpemVfdCBvZmZzZXQsIFQgYXJnKQorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9BUlJBWV9JTkRFWF9FWElUKCBvZmZzZXQgLCBtU2l6ZSApIDw8IFNFTkRfRVhJVDsKKworCQltVGFibGVbb2Zmc2V0XSA9IGFyZzsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXQoYXZtX3NpemVfdCBvZmZzZXQsIHJlZmVyZW5jZSBhcmcpCisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX0FSUkFZX0lOREVYX0VYSVQoIG9mZnNldCAsIG1TaXplICkgPDwgU0VORF9FWElUOworCisJCW1UYWJsZVtvZmZzZXRdID0gYXJnOworCX0KKworCisKKwkvLyBvcGVyYXRvcltdCisvLwlpbmxpbmUgcmVmZXJlbmNlIG9wZXJhdG9yW10oYXZtX3NpemVfdCBvZmZzZXQpCisvLwl7CisvLwkJcmV0dXJuKCBtVGFibGVbb2Zmc2V0XSApOworLy8JfQorLy8KKy8vCWlubGluZSBjb25zdF9yZWZlcmVuY2Ugb3BlcmF0b3JbXShhdm1fc2l6ZV90IG9mZnNldCkgY29uc3QKKy8vCXsKKy8vCQlyZXR1cm4oIG1UYWJsZVtvZmZzZXRdICk7CisvLwl9CisKKwkvLyBmcm9udCgpIGFuZCBiYWNrKCkKKwlpbmxpbmUgcmVmZXJlbmNlIGZyb250KCkKKwl7CisJCXJldHVybiBtVGFibGVbMF07CisJfQorCisJaW5saW5lIGNvbnN0X3JlZmVyZW5jZSBmcm9udCgpIGNvbnN0CisJeworCQlyZXR1cm4gbVRhYmxlWzBdOworCX0KKworCWlubGluZSByZWZlcmVuY2UgYmFjaygpCisJeworCQlyZXR1cm4gbVRhYmxlW21TaXplIC0gMV07CisJfQorCisJaW5saW5lIGNvbnN0X3JlZmVyZW5jZSBiYWNrKCkgY29uc3QKKwl7CisJCXJldHVybiBtVGFibGVbbVNpemUgLSAxXTsKKwl9CisKKworCWlubGluZSByZWZlcmVuY2UgZmlyc3QoKQorCXsKKwkJcmV0dXJuKCBtVGFibGVbMF0gKTsKKwl9CisKKwlpbmxpbmUgY29uc3RfcmVmZXJlbmNlIGZpcnN0KCkgY29uc3QKKwl7CisJCXJldHVybiggbVRhYmxlWzBdICk7CisJfQorCisKKwlpbmxpbmUgcmVmZXJlbmNlIHNlY29uZCgpCisJeworCQlyZXR1cm4oIG1UYWJsZVsxXSApOworCX0KKworCWlubGluZSBjb25zdF9yZWZlcmVuY2Ugc2Vjb25kKCkgY29uc3QKKwl7CisJCXJldHVybiggbVRhYmxlWzFdICk7CisJfQorCisKKwlpbmxpbmUgcmVmZXJlbmNlIHRoaXJkKCkKKwl7CisJCXJldHVybiggbVRhYmxlWzJdICk7CisJfQorCisJaW5saW5lIGNvbnN0X3JlZmVyZW5jZSB0aGlyZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZVsyXSApOworCX0KKworCisJLyoqCisJICogY29udGFpbnMgYSBwYXJ0aWN1bGFyIGVsZW1lbnQKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCBib29sIGNvbnRhaW5zKFQgYW5BcnJheSkgY29uc3QKKwl7CisJCWZvciggYXZtX3NpemVfdCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgbVNpemUgOyArK29mZnNldCApCisJCXsKKwkJCWlmKCBtVGFibGVbb2Zmc2V0XSA9PSBhbkFycmF5ICkKKwkJCXsKKwkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKK307CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBcnJheUJGCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY2xhc3MgQXJyYXlCRiA6CisJCXB1YmxpYyBfQnVpbHRpbkFycmF5XzwgQkYgPiwKKwkJQVZNX0lOSkVDVF9JTlNUQU5DRV9DT1VOVEVSX0NMQVNTKCBBcnJheUJGICkKK3sKKworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBBcnJheUJGICkKKworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQVRUUklCVVRFUworCSAqLworCWNsYXNzX2tpbmRfdCBtRWxlbWVudFR5cGVJZDsKKworCUF2bUluc3RydWN0aW9uICogbUluc3RydWN0aW9uOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIENvcHkKKwkgKi8KKwlBcnJheUJGKGNvbnN0IEFycmF5QkYgJiBhbkFycmF5KTsKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogT3RoZXIKKwkgKi8KKwlBcnJheUJGKGNvbnN0IEJGVmVjdG9yICYgYW5BcnJheSk7CisKKwlBcnJheUJGKEJhc2VUeXBlU3BlY2lmaWVyICogYVR5cGVTcGVjaWZpZXIsIGNvbnN0IEJGVmVjdG9yICYgYVZlY3RvcikKKwk6IF9CdWlsdGluQXJyYXlfPCBCRiA+KENMQVNTX0tJTkRfVCggQXJyYXlCRiApLCBhVHlwZVNwZWNpZmllciwgYVZlY3RvciksCisJbUVsZW1lbnRUeXBlSWQoIENsYXNzS2luZEluZm9Jbml0aWFsaXplcjo6VFlQRV9VTkRFRklORURfSUQgKSwKKwltSW5zdHJ1Y3Rpb24oIE5VTEwgKQorCXsKKwkJLy8hISEgTk9USElORworCX0KKworCUFycmF5QkYoQmFzZVR5cGVTcGVjaWZpZXIgKiBhVHlwZVNwZWNpZmllciwgYXZtX3NpemVfdCBhU2l6ZSA9IDApCisJOiBfQnVpbHRpbkFycmF5XzwgQkYgPihDTEFTU19LSU5EX1QoIEFycmF5QkYgKSwgYVR5cGVTcGVjaWZpZXIsIGFTaXplKSwKKwltRWxlbWVudFR5cGVJZCggQ2xhc3NLaW5kSW5mb0luaXRpYWxpemVyOjpUWVBFX1VOREVGSU5FRF9JRCApLAorCW1JbnN0cnVjdGlvbiggTlVMTCApCisJeworCQkvLyEhISBOT1RISU5HCisJfQorCisKKwlBcnJheUJGKGNsYXNzX2tpbmRfdCBlbHRUeXBlSWQsIEJhc2VUeXBlU3BlY2lmaWVyICogYVR5cGVTcGVjaWZpZXIsCisJCQlhdm1fc2l6ZV90IGFTaXplID0gMCkKKwk6IF9CdWlsdGluQXJyYXlfPCBCRiA+KENMQVNTX0tJTkRfVCggQXJyYXlCRiApLCBhVHlwZVNwZWNpZmllciwgYVNpemUpLAorCW1FbGVtZW50VHlwZUlkKCBlbHRUeXBlSWQgKSwKKwltSW5zdHJ1Y3Rpb24oIE5VTEwgKQorCXsKKwkJLy8hISEgTk9USElORworCX0KKworCisJQXJyYXlCRihCYXNlVHlwZVNwZWNpZmllciAqIGFUeXBlU3BlY2lmaWVyLCBhdm1fc2l6ZV90IGFTaXplLAorCQkJY29uc3QgQkYgJiBkZWZhdWx0VmFsdWUpCisJOiBfQnVpbHRpbkFycmF5XzwgQkYgPihDTEFTU19LSU5EX1QoIEFycmF5QkYgKSwJYVR5cGVTcGVjaWZpZXIsIGFTaXplICksCisJbUVsZW1lbnRUeXBlSWQoIGRlZmF1bHRWYWx1ZS5jbGFzc0tpbmQoKSApLAorCW1JbnN0cnVjdGlvbiggTlVMTCApCisJeworCQlzZXRBbGwoIGRlZmF1bHRWYWx1ZSApOworCX0KKworCUFycmF5QkYoQmFzZVR5cGVTcGVjaWZpZXIgKiBhVHlwZVNwZWNpZmllciwgY29uc3QgQkYgJiBkZWZhdWx0VmFsdWUpOworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkFycmF5QkYoKQorCXsKKwkJZGVsZXRlW10gKCBtVGFibGUgKTsKKworCQltU2l6ZSA9IDA7CisJCW1UYWJsZSA9IE5VTEw7CisJfQorCisKKwkvKioKKwkgKiBJTlRFUkZBQ0UKKwkgKi8KKwlib29sIGNvbnRhaW5zKGNvbnN0IEJGICYgYXJnKSBjb25zdDsKKworCWJvb2wgc3RhcnRzV2l0aChjb25zdCBBcnJheUJGICYgb3RoZXIpIGNvbnN0OworCisJYm9vbCBlbmRzV2l0aChjb25zdCBBcnJheUJGICYgb3RoZXIpIGNvbnN0OworCisKKwkvKioKKwkgKiBUUklWSUFMTFkgRVFVQUwKKwkgKi8KKwlib29sIGlzVEVRKGNvbnN0IEFycmF5QkYgJiBvdGhlcikgY29uc3Q7CisKKwlpbmxpbmUgYm9vbCBpc05URVEoY29uc3QgQXJyYXlCRiAmIG90aGVyKSBjb25zdAorCXsKKwkJcmV0dXJuKCBub3QgQXJyYXlCRjo6aXNURVEoIG90aGVyICkgKTsKKwl9CisKKwkvKioKKwkgKiBVU1VBTCBFUVVBTAorCSAqLworCWludCBjb21wYXJlKGNvbnN0IEFycmF5QkYgJiBvdGhlcikgY29uc3Q7CisKKwlib29sIGlzRVEoY29uc3QgQXJyYXlCRiAmIG90aGVyKSBjb25zdDsKKworCWlubGluZSBib29sIGlzTkVRKGNvbnN0IEFycmF5QkYgJiBvdGhlcikgY29uc3QKKwl7CisJCXJldHVybiggbm90IGlzRVEoIG90aGVyICkgKTsKKwl9CisKKwkvKioKKwkgKiBTWU5UQVhJQyBFUVVBTAorCSAqLworCWJvb2wgaXNTRVEoY29uc3QgQXJyYXlCRiAmIG90aGVyKSBjb25zdDsKKworCWlubGluZSBib29sIGlzTlNFUShjb25zdCBBcnJheUJGICYgb3RoZXIpIGNvbnN0CisJeworCisJCXJldHVybiggbm90IEFycmF5QkY6OmlzU0VRKCBvdGhlciApICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBmb3IgY29udGFpbmVyIG9mIEJGCisJICovCisJaW5saW5lIHZpcnR1YWwgQkYgJiBhdChhdm1fc2l6ZV90IG9mZnNldCkKKwl7CisvLwkJQVZNX09TX0FTU0VSVF9GQVRBTF9BUlJBWV9JTkRFWF9FWElUKCBvZmZzZXQgLCBtU2l6ZSApIDw8IFNFTkRfRVhJVDsKKworCQlyZXR1cm4oIG1UYWJsZVtvZmZzZXRdICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgY29uc3QgQkYgJiBhdChhdm1fc2l6ZV90IG9mZnNldCkgY29uc3QKKwl7CisvLwkJQVZNX09TX0FTU0VSVF9GQVRBTF9BUlJBWV9JTkRFWF9FWElUKCBvZmZzZXQgLCBtU2l6ZSApIDw8IFNFTkRfRVhJVDsKKworCQlyZXR1cm4oIG1UYWJsZVtvZmZzZXRdICk7CisJfQorCisKKwlpbmxpbmUgQkYgJiBvcGVyYXRvcltdKGF2bV9zaXplX3Qgb2Zmc2V0KQorCXsKKwkJcmV0dXJuKCBtVGFibGVbb2Zmc2V0XSApOworCX0KKworCWlubGluZSBjb25zdCBCRiAmIG9wZXJhdG9yW10oYXZtX3NpemVfdCBvZmZzZXQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZVtvZmZzZXRdICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBCRiAmIGdldChhdm1fc2l6ZV90IG9mZnNldCkKKwl7CisvLwkJQVZNX09TX0FTU0VSVF9GQVRBTF9BUlJBWV9JTkRFWF9FWElUKCBvZmZzZXQgLCBtU2l6ZSApIDw8IFNFTkRfRVhJVDsKKworCQlyZXR1cm4oIG1UYWJsZVtvZmZzZXRdICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgY29uc3QgQkYgJiBnZXQoYXZtX3NpemVfdCBvZmZzZXQpIGNvbnN0CisJeworLy8JCUFWTV9PU19BU1NFUlRfRkFUQUxfQVJSQVlfSU5ERVhfRVhJVCggb2Zmc2V0ICwgbVNpemUgKSA8PCBTRU5EX0VYSVQ7CisKKwkJcmV0dXJuKCBtVGFibGVbb2Zmc2V0XSApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgQkYgJiBnZXRXcml0YWJsZShhdm1fc2l6ZV90IG9mZnNldCkKKwl7CisvLwkJQVZNX09TX0FTU0VSVF9GQVRBTF9BUlJBWV9JTkRFWF9FWElUKCBvZmZzZXQgLCBtU2l6ZSApIDw8IFNFTkRfRVhJVDsKKworCQltVGFibGVbb2Zmc2V0XS5tYWtlV3JpdGFibGUoKTsKKworCQlyZXR1cm4oIG1UYWJsZVtvZmZzZXRdICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCBtYWtlV3JpdGFibGUoYXZtX3NpemVfdCBvZmZzZXQpCisJeworLy8JCUFWTV9PU19BU1NFUlRfRkFUQUxfQVJSQVlfSU5ERVhfRVhJVCggb2Zmc2V0ICwgbVNpemUgKSA8PCBTRU5EX0VYSVQ7CisKKwkJbVRhYmxlW29mZnNldF0ubWFrZVdyaXRhYmxlKCk7CisJfQorCisKKwlpbmxpbmUgdm9pZCBzZXQoYXZtX3NpemVfdCBvZmZzZXQsIGNvbnN0IEJGICYgYXJnKQorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9BUlJBWV9JTkRFWF9FWElUKCBvZmZzZXQgLCBtU2l6ZSApIDw8IFNFTkRfRVhJVDsKKworCQlpZiggKG1FbGVtZW50VHlwZUlkICE9IENsYXNzS2luZEluZm9Jbml0aWFsaXplcjo6VFlQRV9VTkRFRklORURfSUQpCisJCQkmJiAobUVsZW1lbnRUeXBlSWQgIT0gYXJnLmNsYXNzS2luZCgpKSApCisJCXsKKwkJCW1FbGVtZW50VHlwZUlkID0gQ2xhc3NLaW5kSW5mb0luaXRpYWxpemVyOjpUWVBFX1VOREVGSU5FRF9JRDsKKwkJfQorCisJCW1UYWJsZVtvZmZzZXRdID0gYXJnOworCX0KKworCWlubGluZSB2b2lkIHNldEFsbChjb25zdCBCRiAmIGFyZykKKwl7CisJCWZvciggYXZtX3NpemVfdCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgbVNpemUgOyArK29mZnNldCApCisJCXsKKwkJCW1UYWJsZVtvZmZzZXRdID0gYXJnOworCQl9CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtRWxlbWVudFR5cGVJZAorCSAqLworCWlubGluZSB2aXJ0dWFsIGNsYXNzX2tpbmRfdCBnZXRFbGVtZW50VHlwZUlkKCkgY29uc3QKKwl7CisJCXJldHVybiggbUVsZW1lbnRUeXBlSWQgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRFbGVtZW50VHlwZUlkKGNsYXNzX2tpbmRfdCBhVHlwZUlkKQorCXsKKwkJbUVsZW1lbnRUeXBlSWQgPSBhVHlwZUlkOworCX0KKworCisJLy8gQ0FTVAorCUFycmF5QkYgKiBnZXRBcnJheUJGKCkKKwl7CisJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJPDwgIlVuZXhwZWN0ZWQgaW52b2NhdGlvbiBvZiBBcnJheUJGOjpnZXRBcnJheUJGKCkgISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQlyZXR1cm4oIHRoaXMgKTsKKwl9CisKKwkvLyBDT1BZCisJdm9pZCBjb3B5KEJ1aWx0aW5BcnJheSAqIGludHB1dEFycmF5LCBhdm1fc2l6ZV90IGNvdW50KTsKKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogZm9yIG1JbnN0cnVjdGlvbgorCSAqLworCWlubGluZSBBdm1JbnN0cnVjdGlvbiAqIGdldEluc3RydWN0aW9uKCkgY29uc3QKKwl7CisJCXJldHVybiggbUluc3RydWN0aW9uICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzSW5zdHJ1Y3Rpb24oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtSW5zdHJ1Y3Rpb24gIT0gTlVMTCApOworCX0KKworCWlubGluZSB2b2lkIHNldEluc3RydWN0aW9uKEF2bUluc3RydWN0aW9uICogYW5JbnN0cnVjdGlvbikKKwl7CisJCW1JbnN0cnVjdGlvbiA9IGFuSW5zdHJ1Y3Rpb247CisJfQorCisKKwkvKioKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogU0VSSUFMSVpBVElPTgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCBzdGQ6OnN0cmluZyBzdHIoYXZtX3NpemVfdCBvZmZzZXQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZVtvZmZzZXRdLnN0cigpICk7CisJfQorCisJdmlydHVhbCBzdGQ6OnN0cmluZyBzdHIoKSBjb25zdDsKKworCisJdmlydHVhbCB2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworfTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFycmF5IG9mIEJ1aWx0aW4gVHlwZQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NsYXNzIEFycmF5SW50ZWdlciA6CisJCXB1YmxpYyBfQnVpbHRpbkFycmF5XzwgYXZtX2ludGVnZXJfdCA+LAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIEFycmF5SW50ZWdlciApCit7CisKKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggQXJyYXlJbnRlZ2VyICkKKworCitwdWJsaWM6CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIENvcHkKKwkgKi8KKwlBcnJheUludGVnZXIoY29uc3QgQXJyYXlJbnRlZ2VyICYgYW5BcnJheSkKKwk6IF9CdWlsdGluQXJyYXlfPCBhdm1faW50ZWdlcl90ID4oIGFuQXJyYXkgKQorCXsKKwkvLyEhISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBPdGhlcgorCSAqLworCUFycmF5SW50ZWdlcihhdm1fc2l6ZV90IGFTaXplID0gMCk7CisKKworCS8vIENBU1QKKwlBcnJheUJGICogZ2V0QXJyYXlCRigpOworCisKKwkvKioKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogU0VSSUFMSVpBVElPTgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCBzdGQ6OnN0cmluZyBzdHIoYXZtX3NpemVfdCBvZmZzZXQpIGNvbnN0CisJeworCQlyZXR1cm4oIE9TUygpIDw8IG1UYWJsZVtvZmZzZXRdICk7CisJfQorCisJaW5saW5lIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQlvcyA8PCBUQUIgPDwgLyoiJWkiKi8gIlsgIjsKKwkJaWYoIG1TaXplID4gMCApCisJCXsKKwkJCW9zIDw8IG1UYWJsZVswXTsKKwkJCWZvciggYXZtX3NpemVfdCBvZmZzZXQgPSAxIDsgb2Zmc2V0IDwgbVNpemUgOyArK29mZnNldCApCisJCQl7CisJCQkJb3MgPDwgIiAsICIgPDwgbVRhYmxlW29mZnNldF07CisJCQl9CisJCX0KKwkJb3MgPDwgIiBdIiA8PCBFT0xfRkxVU0g7CisJfQorCit9OyAvLyBlbmQgY2xhc3MgQXJyYXlJbnRlZ2VyCisKKworCitjbGFzcyBBcnJheVJhdGlvbmFsIDoKKwkJcHVibGljIF9CdWlsdGluQXJyYXlfPCBQYWlyPCBhdm1faW50ZWdlcl90ICwgYXZtX2ludGVnZXJfdCA+ID4sCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggQXJyYXlSYXRpb25hbCApCit7CisKKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggQXJyYXlSYXRpb25hbCApCisKKwkvKioKKwkgKiBUWVBFREVGCisJICovCisJdHlwZWRlZiBQYWlyPCBhdm1faW50ZWdlcl90ICwgYXZtX2ludGVnZXJfdCA+ICBQYWlySW50ZWdlcjsKKworCitwdWJsaWM6CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIENvcHkKKwkgKi8KKwlBcnJheVJhdGlvbmFsKGNvbnN0IEFycmF5UmF0aW9uYWwgJiBhbkFycmF5KQorCTogX0J1aWx0aW5BcnJheV88IFBhaXJJbnRlZ2VyID4oIGFuQXJyYXkgKQorCXsKKwkvLyEhISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBPdGhlcgorCSAqLworCUFycmF5UmF0aW9uYWwoYXZtX3NpemVfdCBhU2l6ZSA9IDApOworCisKKwkvLyBDQVNUCisJQXJyYXlCRiAqIGdldEFycmF5QkYoKTsKKworCisJaW5saW5lIHZvaWQgc2V0KGF2bV9zaXplX3Qgb2Zmc2V0LAorCQkJYXZtX2ludGVnZXJfdCBhTnVtZXIsIGF2bV9pbnRlZ2VyX3QgYURlbm9tKQorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9BUlJBWV9JTkRFWF9FWElUKCBvZmZzZXQgLCBtU2l6ZSApIDw8IFNFTkRfRVhJVDsKKworCQltVGFibGVbb2Zmc2V0XSA9IFBhaXJJbnRlZ2VyKGFOdW1lciwgYURlbm9tKTsKKwl9CisKKwkvKioKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogU0VSSUFMSVpBVElPTgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCBzdGQ6OnN0cmluZyBzdHIoYXZtX3NpemVfdCBvZmZzZXQpIGNvbnN0CisJeworCQlyZXR1cm4oIE9TUygpICA8PCBtVGFibGVbb2Zmc2V0XS5maXJzdCgpCisJCQkJPDwgJy8nIDw8IG1UYWJsZVtvZmZzZXRdLnNlY29uZCgpICk7CisJfQorCisJaW5saW5lIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQlvcyA8PCBUQUIgPDwgLyoiJXIiKi8gIlsgIjsKKwkJaWYoIG1TaXplID4gMCApCisJCXsKKwkJCW9zIDw8IG1UYWJsZVswXS5maXJzdCgpIDw8ICcvJyA8PCBtVGFibGVbMF0uc2Vjb25kKCk7CisJCQlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMSA7IG9mZnNldCA8IG1TaXplIDsgKytvZmZzZXQgKQorCQkJeworCQkJCW9zIDw8ICIgLCAiIDw8IG1UYWJsZVtvZmZzZXRdLmZpcnN0KCkKKwkJCQkJCTw8ICcvJyA8PCBtVGFibGVbb2Zmc2V0XS5zZWNvbmQoKTsKKwkJCX0KKwkJfQorCQlvcyA8PCAiIF0iIDw8IEVPTF9GTFVTSDsKKwl9CisKK307IC8vIGVuZCBjbGFzcyBBcnJheVJhdGlvbmFsCisKKworCitjbGFzcyBBcnJheUZsb2F0IDoKKwkJcHVibGljIF9CdWlsdGluQXJyYXlfPCBhdm1fZmxvYXRfdCA+LAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIEFycmF5RmxvYXQgKQoreworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIEFycmF5RmxvYXQgKQorCisKK3B1YmxpYzoKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCUFycmF5RmxvYXQoY29uc3QgQXJyYXlGbG9hdCAmIGFuQXJyYXkpCisJOiBfQnVpbHRpbkFycmF5XzwgZG91YmxlID4oIGFuQXJyYXkgKQorCXsKKwkvLyEhISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBPdGhlcgorCSAqLworCUFycmF5RmxvYXQoYXZtX3NpemVfdCBhU2l6ZSA9IDApOworCisKKwkvLyBDQVNUCisJQXJyYXlCRiAqIGdldEFycmF5QkYoKTsKKworCisJLyoqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFNFUklBTElaQVRJT04KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgc3RyKGF2bV9zaXplX3Qgb2Zmc2V0KSBjb25zdAorCXsKKwkJcmV0dXJuKCBPU1MoKSA8PCBtVGFibGVbb2Zmc2V0XSApOworCX0KKworCWlubGluZSB2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJb3MgPDwgVEFCIDw8IC8qIiVmIiovICJbICI7CisJCWlmKCBtU2l6ZSA+IDAgKQorCQl7CisJCQlvcyA8PCBtVGFibGVbMF07CisJCQlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMSA7IG9mZnNldCA8IG1TaXplIDsgKytvZmZzZXQgKQorCQkJeworCQkJCW9zIDw8ICIgLCAiIDw8IG1UYWJsZVtvZmZzZXRdOworCQkJfQorCQl9CisJCW9zIDw8ICIgXSIgPDwgRU9MX0ZMVVNIOworCX0KKworfTsgLy8gZW5kIGNsYXNzIEFycmF5RmxvYXQKKworCisKK2NsYXNzIEFycmF5Qm9vbGVhbiA6CisJCXB1YmxpYyBfQnVpbHRpbkFycmF5XzwgYm9vbCA+LAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIEFycmF5Qm9vbGVhbiApCit7CisKKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggQXJyYXlCb29sZWFuICkKKworCitwdWJsaWM6CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIENvcHkKKwkgKi8KKwlBcnJheUJvb2xlYW4oY29uc3QgQXJyYXlCb29sZWFuICYgYW5BcnJheSkKKwk6IF9CdWlsdGluQXJyYXlfPCBib29sID4oIGFuQXJyYXkgKQorCXsKKwkvLyEhISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBPdGhlcgorCSAqLworCUFycmF5Qm9vbGVhbihhdm1fc2l6ZV90IGFTaXplID0gMCk7CisKKworCS8vIENBU1QKKwlBcnJheUJGICogZ2V0QXJyYXlCRigpOworCisKKwkvKioKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogU0VSSUFMSVpBVElPTgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCBzdGQ6OnN0cmluZyBzdHIoYXZtX3NpemVfdCBvZmZzZXQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZVtvZmZzZXRdID8gInRydWUiIDogImZhbHNlIiApOworCX0KKworCWlubGluZSB2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJb3MgPDwgVEFCIDw8IC8qIiViIiovICJbICI7CisJCWlmKCBtU2l6ZSA+IDAgKQorCQl7CisJCQlvcyA8PCAobVRhYmxlWzBdID8gInRydWUiIDogImZhbHNlIik7CisJCQlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMSA7IG9mZnNldCA8IG1TaXplIDsgKytvZmZzZXQgKQorCQkJeworCQkJCW9zIDw8ICIgLCAiIDw8IChtVGFibGVbb2Zmc2V0XSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworCQkJfQorCQl9CisJCW9zIDw8ICIgXSIgPDwgRU9MX0ZMVVNIOworCX0KKworfTsgLy8gZW5kIGNsYXNzIEFycmF5Qm9vbGVhbgorCisKKworY2xhc3MgQXJyYXlDaGFyYWN0ZXIgOgorCQlwdWJsaWMgX0J1aWx0aW5BcnJheV88IGNoYXIgPiwKKwkJQVZNX0lOSkVDVF9JTlNUQU5DRV9DT1VOVEVSX0NMQVNTKCBBcnJheUNoYXJhY3RlciApCit7CisKKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggQXJyYXlDaGFyYWN0ZXIgKQorCisKK3B1YmxpYzoKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCUFycmF5Q2hhcmFjdGVyKGNvbnN0IEFycmF5Q2hhcmFjdGVyICYgYW5BcnJheSkKKwk6IF9CdWlsdGluQXJyYXlfPCBjaGFyID4oIGFuQXJyYXkgKQorCXsKKwkvLyEhISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBPdGhlcgorCSAqLworCUFycmF5Q2hhcmFjdGVyKGF2bV9zaXplX3QgYVNpemUgPSAwKTsKKworCisJLy8gQ0FTVAorCUFycmF5QkYgKiBnZXRBcnJheUJGKCk7CisKKworCS8qKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBTRVJJQUxJWkFUSU9OCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCWlubGluZSB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHN0cihhdm1fc2l6ZV90IG9mZnNldCkgY29uc3QKKwl7CisJCXJldHVybiggT1NTKCkgPDwgbVRhYmxlW29mZnNldF0gKTsKKwl9CisKKwlpbmxpbmUgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCW9zIDw8IFRBQiA8PCAvKiIlYyIqLyAiWyAiOworCQlpZiggbVNpemUgPiAwICkKKwkJeworCQkJb3MgPDwgIiciIDw8IG1UYWJsZVswXSA8PCAiJyI7CisKKwkJCWZvciggYXZtX3NpemVfdCBvZmZzZXQgPSAxIDsgb2Zmc2V0IDwgbVNpemUgOyArK29mZnNldCApCisJCQl7CisJCQkJb3MgPDwgIiAsICciIDw8IG1UYWJsZVtvZmZzZXRdIDw8ICInIjsKKwkJCX0KKwkJfQorCQlvcyA8PCAiIF0iIDw8IEVPTF9GTFVTSDsKKwl9Cit9OyAvLyBlbmQgY2xhc3MgQXJyYXlDaGFyYWN0ZXIKKworCisKK2NsYXNzIEFycmF5U3RyaW5nIDoKKwkJcHVibGljIF9CdWlsdGluQXJyYXlfPCBzdGQ6OnN0cmluZyA+LAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIEFycmF5U3RyaW5nICkKK3sKKworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBBcnJheVN0cmluZyApCisKKworcHVibGljOgorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJQXJyYXlTdHJpbmcoY29uc3QgQXJyYXlTdHJpbmcgJiBhbkFycmF5KQorCTogX0J1aWx0aW5BcnJheV88IHN0ZDo6c3RyaW5nID4oIGFuQXJyYXkgKQorCXsKKwkvLyEhISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBPdGhlcgorCSAqLworCUFycmF5U3RyaW5nKGF2bV9zaXplX3QgYVNpemUgPSAwKTsKKworCisJLy8gQ0FTVAorCUFycmF5QkYgKiBnZXRBcnJheUJGKCk7CisKKworCS8qKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBTRVJJQUxJWkFUSU9OCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCWlubGluZSB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHN0cihhdm1fc2l6ZV90IG9mZnNldCkgY29uc3QKKwl7CisJCXJldHVybiggT1NTKCkgPDwgIlwiIiA8PCBtVGFibGVbb2Zmc2V0XSA8PCAiXCIiICk7CisvLwkJcmV0dXJuKCBPU1MoKSA8PCBtVGFibGVbb2Zmc2V0XSApOworCX0KKworCWlubGluZSB2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJb3MgPDwgVEFCIDw8IC8qIiVzIiovICJbICI7CisJCWlmKCBtU2l6ZSA+IDAgKQorCQl7CisJCQlvcyA8PCAiXCIiIDw8IG1UYWJsZVswXSA8PCAiXCIiOworCisJCQlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMSA7IG9mZnNldCA8IG1TaXplIDsgKytvZmZzZXQgKQorCQkJeworCQkJCW9zIDw8ICIgLCBcIiIgPDwgbVRhYmxlW29mZnNldF0gPDwgIlwiIjsKKwkJCX0KKwkJfQorCQlvcyA8PCAiIF0iIDw8IEVPTF9GTFVTSDsKKwl9Cit9OyAvLyBlbmQgY2xhc3MgQXJyYXlTdHJpbmcKKworCisKK2NsYXNzIEFycmF5SWRlbnRpZmllciA6CisJCXB1YmxpYyBfQnVpbHRpbkFycmF5Xzwgc3RkOjpzdHJpbmcgPiwKKwkJQVZNX0lOSkVDVF9JTlNUQU5DRV9DT1VOVEVSX0NMQVNTKCBBcnJheUlkZW50aWZpZXIgKQoreworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIEFycmF5SWRlbnRpZmllciApCisKKworcHVibGljOgorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJQXJyYXlJZGVudGlmaWVyKGNvbnN0IEFycmF5SWRlbnRpZmllciAmIGFuQXJyYXkpCisJOiBfQnVpbHRpbkFycmF5Xzwgc3RkOjpzdHJpbmcgPiggYW5BcnJheSApCisJeworCS8vISEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIE90aGVyCisJICovCisJQXJyYXlJZGVudGlmaWVyKGF2bV9zaXplX3QgYVNpemUgPSAwKTsKKworCisJLy8gQ0FTVAorCUFycmF5QkYgKiBnZXRBcnJheUJGKCk7CisKKworCS8qKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBTRVJJQUxJWkFUSU9OCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCWlubGluZSB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHN0cihhdm1fc2l6ZV90IG9mZnNldCkgY29uc3QKKwl7CisJCXJldHVybiggT1NTKCkgPDwgbVRhYmxlW29mZnNldF0gKTsKKwl9CisKKwlpbmxpbmUgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCW9zIDw8IFRBQiA8PCAvKiIlaWQiKi8gIlsgIjsKKwkJaWYoIG1TaXplID4gMCApCisJCXsKKwkJCW9zIDw8IG1UYWJsZVswXTsKKwkJCWZvciggYXZtX3NpemVfdCBvZmZzZXQgPSAxIDsgb2Zmc2V0IDwgbVNpemUgOyArK29mZnNldCApCisJCQl7CisJCQkJb3MgPDwgIiAsICIgPDwgbVRhYmxlW29mZnNldF07CisJCQl9CisJCX0KKwkJb3MgPDwgIiBdIiA8PCBFT0xfRkxVU0g7CisJfQorCit9OyAvLyBlbmQgY2xhc3MgQXJyYXlJZGVudGlmaWVyCisKKworCitjbGFzcyBBcnJheVF1YWxpZmllZElkZW50aWZpZXIgOgorCQlwdWJsaWMgX0J1aWx0aW5BcnJheV88IHN0ZDo6c3RyaW5nID4sCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggQXJyYXlRdWFsaWZpZWRJZGVudGlmaWVyICkKK3sKKworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBBcnJheVF1YWxpZmllZElkZW50aWZpZXIgKQorCisKK3B1YmxpYzoKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCUFycmF5UXVhbGlmaWVkSWRlbnRpZmllcihjb25zdCBBcnJheVF1YWxpZmllZElkZW50aWZpZXIgJiBhbkFycmF5KQorCTogX0J1aWx0aW5BcnJheV88IHN0ZDo6c3RyaW5nID4oIGFuQXJyYXkgKQorCXsKKwkvLyEhISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBPdGhlcgorCSAqLworCUFycmF5UXVhbGlmaWVkSWRlbnRpZmllcihhdm1fc2l6ZV90IGFTaXplID0gMCk7CisKKworCS8vIENBU1QKKwlBcnJheUJGICogZ2V0QXJyYXlCRigpOworCisKKwkvKioKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogU0VSSUFMSVpBVElPTgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCBzdGQ6OnN0cmluZyBzdHIoYXZtX3NpemVfdCBvZmZzZXQpIGNvbnN0CisJeworCQlyZXR1cm4oIE9TUygpIDw8IG1UYWJsZVtvZmZzZXRdICk7CisJfQorCisJaW5saW5lIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQlvcyA8PCBUQUIgPDwgLyoiJXVmaSIqLyAiWyAiOworCQlpZiggbVNpemUgPiAwICkKKwkJeworCQkJb3MgPDwgbVRhYmxlWzBdOworCQkJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDEgOyBvZmZzZXQgPCBtU2l6ZSA7ICsrb2Zmc2V0ICkKKwkJCXsKKwkJCQlvcyA8PCAiICwgIiA8PCBtVGFibGVbb2Zmc2V0XTsKKwkJCX0KKwkJfQorCQlvcyA8PCAiIF0iIDw8IEVPTF9GTFVTSDsKKwl9CisKK307IC8vIGVuZCBjbGFzcyBBcnJheVF1YWxpZmllZElkZW50aWZpZXIKKworCit9CisKKyNlbmRpZiAvKiBCVUlMVElOQVJSQVlfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL0J1aWx0aW5Db250YWluZXIuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4cHJlc3Npb24vQnVpbHRpbkNvbnRhaW5lci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QxNzRiYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL0J1aWx0aW5Db250YWluZXIuY3BwCkBAIC0wLDAgKzEsMjAwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogNiBhdnIuIDIwMTEKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkJ1aWx0aW5Db250YWluZXIuaCIKKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0J1aWx0aW5BcnJheS5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0J1aWx0aW5RdWV1ZS5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25Db25zdHJ1Y3Rvci5oPgorCisjaW5jbHVkZSA8Zm1sL3R5cGUvQ29udGFpbmVyVHlwZVNwZWNpZmllci5oPgorCisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorICogQ1JFQVRJT04KKyAqLworQnVpbHRpbkNvbnRhaW5lciAqIEJ1aWx0aW5Db250YWluZXI6OmNyZWF0ZShDb250YWluZXJUeXBlU3BlY2lmaWVyICogY29udGFpbmVyVCkKK3sKKwlzd2l0Y2goIGNvbnRhaW5lclQtPmdldFR5cGVTcGVjaWZpZXJLaW5kKCkgKQorCXsKKwkJY2FzZSBUWVBFX1ZFQ1RPUl9TUEVDSUZJRVI6CisJCXsKKwkJCXJldHVybiggbmV3IEJ1aWx0aW5WZWN0b3IoY29udGFpbmVyVC0+c2l6ZSgpKSApOworCQl9CisJCWNhc2UgVFlQRV9SRVZFUlNFX1ZFQ1RPUl9TUEVDSUZJRVI6CisJCXsKKwkJCXJldHVybiggbmV3IEJ1aWx0aW5SZXZlcnNlVmVjdG9yKGNvbnRhaW5lclQtPnNpemUoKSkgKTsKKwkJfQorCisJCWNhc2UgVFlQRV9MSVNUX1NQRUNJRklFUjoKKwkJeworCQkJcmV0dXJuKCBuZXcgQnVpbHRpbkxpc3QoY29udGFpbmVyVC0+c2l6ZSgpKSApOworCQl9CisKKwkJY2FzZSBUWVBFX1NFVF9TUEVDSUZJRVI6CisJCXsKKwkJCXJldHVybiggbmV3IEJ1aWx0aW5TZXQoY29udGFpbmVyVC0+c2l6ZSgpKSApOworCQl9CisKKwkJY2FzZSBUWVBFX01VTFRJU0VUX1NQRUNJRklFUjoKKwkJeworCQkJcmV0dXJuKCBuZXcgQnVpbHRpbkJhZyhjb250YWluZXJULT5zaXplKCkpICk7CisJCX0KKworCisJCWNhc2UgVFlQRV9GSUZPX1NQRUNJRklFUjoKKwkJY2FzZSBUWVBFX01VTFRJX0ZJRk9fU1BFQ0lGSUVSOgorCQl7CisJCQlyZXR1cm4oIG5ldyBCdWlsdGluRmlmbyhjb250YWluZXJULT5zaXplKCkpICk7CisJCX0KKworCQljYXNlIFRZUEVfTElGT19TUEVDSUZJRVI6CisJCWNhc2UgVFlQRV9NVUxUSV9MSUZPX1NQRUNJRklFUjoKKwkJeworCQkJcmV0dXJuKCBuZXcgQnVpbHRpbkxpZm8oY29udGFpbmVyVC0+c2l6ZSgpKSApOworCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJPDwgIkJ1aWx0aW5Db250YWluZXI6OmNyZWF0ZTo+IFVuZXhwZWN0ZWQgIgorCQkJCQkJIkNPTlRBSU5FUiB0eXBlIGZvciBpbnN0YW50aWF0aW9uID4gISEhIgorCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCXJldHVybiggbmV3IEJ1aWx0aW5MaXN0KGNvbnRhaW5lclQtPnNpemUoKSkgKTsKKwkJfQorCX0KK30KKworCit2b2lkIEJ1aWx0aW5Db250YWluZXI6OmNvcHkoQnVpbHRpbkFycmF5ICogaW50cHV0QXJyYXksIGF2bV9zaXplX3QgY291bnQpCit7CisJc3dpdGNoKCBpbnRwdXRBcnJheS0+Y2xhc3NLaW5kKCkgKQorCXsKKwkJY2FzZSBGT1JNX0FSUkFZX0JPT0xFQU5fS0lORDoKKwkJeworCQkJQXJyYXlCb29sZWFuICogYnVpbHRpbkFycmF5ID0gaW50cHV0QXJyYXktPnRvPCBBcnJheUJvb2xlYW4gPigpOworCQkJZm9yKCBhdm1fc2l6ZV90IGlkeCA9IDAgOyBpZHggPCBjb3VudCA7ICsraWR4ICkKKwkJCXsKKwkJCQlhZGQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3RXhwcihidWlsdGluQXJyYXktPmdldChpZHgpKSApOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBGT1JNX0FSUkFZX0NIQVJBQ1RFUl9LSU5EOgorCQl7CisJCQlBcnJheUNoYXJhY3RlciAqIGJ1aWx0aW5BcnJheSA9IGludHB1dEFycmF5LT50bzwgQXJyYXlDaGFyYWN0ZXIgPigpOworCQkJZm9yKCBhdm1fc2l6ZV90IGlkeCA9IDAgOyBpZHggPCBjb3VudCA7ICsraWR4ICkKKwkJCXsKKwkJCQlhZGQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q2hhcihidWlsdGluQXJyYXktPmdldChpZHgpKSApOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBGT1JNX0FSUkFZX0lOVEVHRVJfS0lORDoKKwkJeworCQkJQXJyYXlJbnRlZ2VyICogYnVpbHRpbkFycmF5ID0gaW50cHV0QXJyYXktPnRvPCBBcnJheUludGVnZXIgPigpOworCQkJZm9yKCBhdm1fc2l6ZV90IGlkeCA9IDAgOyBpZHggPCBjb3VudCA7ICsraWR4ICkKKwkJCXsKKwkJCQlhZGQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3RXhwcihidWlsdGluQXJyYXktPmdldChpZHgpKSApOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBGT1JNX0FSUkFZX1JBVElPTkFMX0tJTkQ6CisJCXsKKwkJCUFycmF5UmF0aW9uYWwgKiBidWlsdGluQXJyYXkgPSBpbnRwdXRBcnJheS0+dG88IEFycmF5UmF0aW9uYWwgPigpOworCQkJZm9yKCBhdm1fc2l6ZV90IGlkeCA9IDAgOyBpZHggPCBjb3VudCA7ICsraWR4ICkKKwkJCXsKKwkJCQlhZGQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3RXhwcigKKwkJCQkJCWJ1aWx0aW5BcnJheS0+Z2V0KGlkeCkuZmlyc3QoKSwKKwkJCQkJCWJ1aWx0aW5BcnJheS0+Z2V0KGlkeCkuc2Vjb25kKCkpICk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQljYXNlIEZPUk1fQVJSQVlfRkxPQVRfS0lORDoKKwkJeworCQkJQXJyYXlGbG9hdCAqIGJ1aWx0aW5BcnJheSA9IGludHB1dEFycmF5LT50bzwgQXJyYXlGbG9hdCA+KCk7CisJCQlmb3IoIGF2bV9zaXplX3QgaWR4ID0gMCA7IGlkeCA8IGNvdW50IDsgKytpZHggKQorCQkJeworCQkJCWFkZCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdFeHByKGJ1aWx0aW5BcnJheS0+Z2V0KGlkeCkpICk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQljYXNlIEZPUk1fQVJSQVlfU1RSSU5HX0tJTkQ6CisJCXsKKwkJCUFycmF5U3RyaW5nICogYnVpbHRpbkFycmF5ID0gaW50cHV0QXJyYXktPnRvPCBBcnJheVN0cmluZyA+KCk7CisJCQlmb3IoIGF2bV9zaXplX3QgaWR4ID0gMCA7IGlkeCA8IGNvdW50IDsgKytpZHggKQorCQkJeworCQkJCWFkZCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdTdHJpbmcoCisJCQkJCQlidWlsdGluQXJyYXktPmdldChpZHgpKSApOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBGT1JNX0FSUkFZX0lERU5USUZJRVJfS0lORDoKKwkJeworCQkJQXJyYXlJZGVudGlmaWVyICogYnVpbHRpbkFycmF5ID0gaW50cHV0QXJyYXktPnRvPCBBcnJheUlkZW50aWZpZXIgPigpOworCQkJZm9yKCBhdm1fc2l6ZV90IGlkeCA9IDAgOyBpZHggPCBjb3VudCA7ICsraWR4ICkKKwkJCXsKKwkJCQlhZGQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3SWRlbnRpZmllcihidWlsdGluQXJyYXktPmdldChpZHgpKSApOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBGT1JNX0FSUkFZX1FVQUxJRklFRF9JREVOVElGSUVSX0tJTkQ6CisJCXsKKwkJCUFycmF5UXVhbGlmaWVkSWRlbnRpZmllciAqIGJ1aWx0aW5BcnJheSA9CisJCQkJCWludHB1dEFycmF5LT50bzwgQXJyYXlRdWFsaWZpZWRJZGVudGlmaWVyID4oKTsKKwkJCWZvciggYXZtX3NpemVfdCBpZHggPSAwIDsgaWR4IDwgY291bnQgOyArK2lkeCApCisJCQl7CisJCQkJYWRkKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6OgorCQkJCQkJbmV3UXVhbGlmaWVkSWRlbnRpZmllcihidWlsdGluQXJyYXktPmdldChpZHgpKSApOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEZPUk1fQVJSQVlfQkZfS0lORDoKKwkJeworCQkJQXJyYXlCRiAqIGJ1aWx0aW5BcnJheSA9IGludHB1dEFycmF5LT50bzwgQXJyYXlCRiA+KCk7CisJCQlmb3IoIGF2bV9zaXplX3QgaWR4ID0gMCA7IGlkeCA8IGNvdW50IDsgKytpZHggKQorCQkJeworCQkJCWlmKCBidWlsdGluQXJyYXktPmdldChpZHgpLmlzX3N0cmljdGx5PCBCdWlsdGluQXJyYXkgPigpICkKKwkJCQl7CisJCQkJCWFkZCggQkYoYnVpbHRpbkFycmF5LT5nZXQoaWR4KS4KKwkJCQkJCQl0b19wdHI8IEJ1aWx0aW5BcnJheSA+KCktPmdldEFycmF5QkYoKSkgKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJYWRkKCBidWlsdGluQXJyYXktPmdldChpZHgpICk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQk8PCAiQnVpbHRpbkNvbnRhaW5lcjo6Y29weTo+ICIKKwkJCQkJCSJVbmV4cGVjdGVkIGlucHV0IGFycmF5IGZvciBjb3B5ICEhISIKKwkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4cHJlc3Npb24vQnVpbHRpbkNvbnRhaW5lci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4cHJlc3Npb24vQnVpbHRpbkNvbnRhaW5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0OGIzNmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhwcmVzc2lvbi9CdWlsdGluQ29udGFpbmVyLmgKQEAgLTAsMCArMSwxMDY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogNiBhdnIuIDIwMTEKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBCVUlMVElOQ09OVEFJTkVSX0hfCisjZGVmaW5lIEJVSUxUSU5DT05UQUlORVJfSF8KKworI2luY2x1ZGUgPGZtbC9idWlsdGluL0J1aWx0aW5Gb3JtLmg+CisKKyNpbmNsdWRlIDxjb2xsZWN0aW9uL0JGQ29udGFpbmVyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIEJ1aWx0aW5BcnJheTsKK2NsYXNzIENvbnRhaW5lclR5cGVTcGVjaWZpZXI7CisKKworY2xhc3MgQnVpbHRpbkNvbGxlY3Rpb24gIDoKKwkJcHVibGljIEJ1aWx0aW5Gb3JtICwKKwkJQVZNX0lOSkVDVF9JTlNUQU5DRV9DT1VOVEVSX0NMQVNTKCBCdWlsdGluQ29sbGVjdGlvbiApCit7CisKK3B1YmxpYzoKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUJ1aWx0aW5Db2xsZWN0aW9uKGNsYXNzX2tpbmRfdCBhQ2xhc3NLaW5kKQorCTogQnVpbHRpbkZvcm0oIGFDbGFzc0tpbmQgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJQnVpbHRpbkNvbGxlY3Rpb24oY29uc3QgQnVpbHRpbkNvbGxlY3Rpb24gJiBhQnVpbHRpbkNvbGxlY3Rpb24pCisJOiBCdWlsdGluRm9ybSggYUJ1aWx0aW5Db2xsZWN0aW9uICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5CdWlsdGluQ29sbGVjdGlvbigpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1DYXBhY2l0eQorCSAqLworCXZpcnR1YWwgYXZtX3NpemVfdCBjYXBhY2l0eSgpIGNvbnN0ID0gMDsKKworCWlubGluZSBsb25nIHJlYWxDYXBhY2l0eSgpIGNvbnN0CisJeworCQlyZXR1cm4oIChjYXBhY2l0eSgpID09IEFWTV9OVU1FUklDX01BWF9TSVpFX1QpPyAtMSA6IGNhcGFjaXR5KCkgKTsKKwl9CisKKwl2aXJ0dWFsIHZvaWQgc2V0Q2FwYWNpdHkobG9uZyBhQ2FwYWNpdHkpID0gMDsKKworCWlubGluZSBib29sIGlzRmluaXRlKCkgY29uc3QKKwl7CisJCXJldHVybiggY2FwYWNpdHkoKSA8IEFWTV9OVU1FUklDX01BWF9TSVpFX1QgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc0luZmluaXRlKCkgY29uc3QKKwl7CisJCXJldHVybiggY2FwYWNpdHkoKSA9PSBBVk1fTlVNRVJJQ19NQVhfU0laRV9UICk7CisJfQorCisKKwkvKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBHRVRURVIKKwkgKiBlbXB0aW5lc3MKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJdmlydHVhbCBib29sIGVtcHR5KCkgY29uc3QgPSAwOworCisJdmlydHVhbCBib29sIG5vbmVtcHR5KCkgY29uc3QgPSAwOworCisJdmlydHVhbCBib29sIHNpbmdsZXRvbigpIGNvbnN0ID0gMDsKKworCXZpcnR1YWwgYm9vbCBwb3B1bGF0ZWQoKSBjb25zdCA9IDA7CisKKwlpbmxpbmUgdmlydHVhbCBib29sIGZ1bGwoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBzaXplKCkgPT0gY2FwYWNpdHkoKSApOworCX0KKworCisJdmlydHVhbCBhdm1fc2l6ZV90IHNpemUoKSBjb25zdCA9IDA7CisKKwl2aXJ0dWFsIHZvaWQgcmVzaXplKGF2bV9zaXplX3QgbmV3U2l6ZSkgPSAwOworCisKKwkvKioKKwkgKiBJTlRFUkZBQ0UKKwkgKi8KKwl2aXJ0dWFsIGJvb2wgY29udGFpbnMoY29uc3QgQkYgJiBhcmcpIGNvbnN0ID0gMDsKKworfTsKKworCitjbGFzcyBCdWlsdGluQ29udGFpbmVyICA6CisJCXB1YmxpYyBCdWlsdGluQ29sbGVjdGlvbiwKKwkJQVZNX0lOSkVDVF9JTlNUQU5DRV9DT1VOVEVSX0NMQVNTKCBCdWlsdGluQ29udGFpbmVyICkKK3sKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlhdm1fc2l6ZV90IG1DYXBhY2l0eTsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQnVpbHRpbkNvbnRhaW5lcihjbGFzc19raW5kX3QgYUNsYXNzS2luZCkKKwk6IEJ1aWx0aW5Db2xsZWN0aW9uKCBhQ2xhc3NLaW5kICksCisJbUNhcGFjaXR5KCBBVk1fTlVNRVJJQ19NQVhfU0laRV9UICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCUJ1aWx0aW5Db250YWluZXIoY2xhc3Nfa2luZF90IGFDbGFzc0tpbmQsIGF2bV9zaXplX3QgYUNhcGFjaXR5KQorCTogQnVpbHRpbkNvbGxlY3Rpb24oIGFDbGFzc0tpbmQgKSwKKwltQ2FwYWNpdHkoIGFDYXBhY2l0eSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIENvcHkKKwkgKi8KKwlCdWlsdGluQ29udGFpbmVyKGNvbnN0IEJ1aWx0aW5Db250YWluZXIgJiBhQnVpbHRpbkNvbnRhaW5lcikKKwk6IEJ1aWx0aW5Db2xsZWN0aW9uKCBhQnVpbHRpbkNvbnRhaW5lciApLAorCW1DYXBhY2l0eSggYUJ1aWx0aW5Db250YWluZXIubUNhcGFjaXR5ICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5CdWlsdGluQ29udGFpbmVyKCkKKwl7CisJCW1DYXBhY2l0eSA9IDA7CisJfQorCisKKwkvKioKKwkgKiBDUkVBVElPTgorCSAqLworCXN0YXRpYyBCdWlsdGluQ29udGFpbmVyICogY3JlYXRlKENvbnRhaW5lclR5cGVTcGVjaWZpZXIgKiBjb250YWluZXJUKTsKKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUNhcGFjaXR5CisJICovCisJaW5saW5lIGF2bV9zaXplX3QgY2FwYWNpdHkoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQ2FwYWNpdHkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRDYXBhY2l0eShsb25nIGFDYXBhY2l0eSkKKwl7CisJCW1DYXBhY2l0eSA9IChhQ2FwYWNpdHkgPCAwKSA/IEFWTV9OVU1FUklDX01BWF9TSVpFX1QgOiBhQ2FwYWNpdHk7CisJfQorCisKKwkvKioKKwkgKiBJTlRFUkZBQ0UKKwkgKi8KKwl2aXJ0dWFsICAgICAgIEJGICYgYXQoYXZtX3NpemVfdCBpZHgpID0gMDsKKwl2aXJ0dWFsIGNvbnN0IEJGICYgYXQoYXZtX3NpemVfdCBpZHgpIGNvbnN0ID0gMDsKKworCisJaW5saW5lIHZpcnR1YWwgQkYgJiBvcGVyYXRvcltdKGF2bV9zaXplX3Qgb2Zmc2V0KQorCXsKKwkJcmV0dXJuKCBhdChvZmZzZXQpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgY29uc3QgQkYgJiBvcGVyYXRvcltdKGF2bV9zaXplX3Qgb2Zmc2V0KSBjb25zdAorCXsKKwkJcmV0dXJuKCBhdChvZmZzZXQpICk7CisJfQorCisJdmlydHVhbCAgICAgICBCRiAmIGdldChhdm1fc2l6ZV90IGlkeCkgPSAwOworCXZpcnR1YWwgY29uc3QgQkYgJiBnZXQoYXZtX3NpemVfdCBpZHgpIGNvbnN0ID0gMDsKKworCXZpcnR1YWwgQkYgJiBnZXRXcml0YWJsZShhdm1fc2l6ZV90IG9mZnNldCkgPSAwOworCisJdmlydHVhbCB2b2lkIG1ha2VXcml0YWJsZShhdm1fc2l6ZV90IG9mZnNldCkgPSAwOworCisJdmlydHVhbCB2b2lkIHNldChhdm1fc2l6ZV90IGlkeCwgY29uc3QgQkYgJiBhcmcpID0gMDsKKworCisJLyoqCisJICogSU5URVJGQUNFCisJICovCisJdmlydHVhbCBib29sIGFkZChjb25zdCBCRiAmIGFyZykgPSAwOworCisJaW5saW5lIHZpcnR1YWwgYm9vbCBwdXNoKGNvbnN0IEJGICYgYXJnKQorCXsKKwkJcmV0dXJuKCBhZGQoIGFyZyApICk7CisJfQorCisKKwl2aXJ0dWFsIHZvaWQgZXJhc2UoYXZtX3NpemVfdCBpZHgpID0gMDsKKworCXZpcnR1YWwgdm9pZCByZW1vdmUoY29uc3QgQkYgJiBhcmcpID0gMDsKKworCXZpcnR1YWwgdm9pZCBjbGVhcigpID0gMDsKKworCXZvaWQgY29weShCdWlsdGluQXJyYXkgKiBpbnRwdXRBcnJheSwgYXZtX3NpemVfdCBjb3VudCk7CisKK307CisKKworCitjbGFzcyBCdWlsdGluTGlzdCA6CisJCXB1YmxpYyBCdWlsdGluQ29udGFpbmVyLAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIEJ1aWx0aW5MaXN0ICkKK3sKKworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBCdWlsdGluTGlzdCApCisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBUWVBFREVGCisJICovCisJdHlwZWRlZiBCRkxpc3QgICAgICAgICAgICAgICAgICAgICBsaXN0X3R5cGU7CisKK3B1YmxpYzoKKwl0eXBlZGVmIGxpc3RfdHlwZTo6aXRlcmF0b3IgICAgICAgIGl0ZXJhdG9yOworCXR5cGVkZWYgbGlzdF90eXBlOjpjb25zdF9pdGVyYXRvciAgY29uc3RfaXRlcmF0b3I7CisKKwl0eXBlZGVmIGxpc3RfdHlwZTo6cmV2ZXJzZV9pdGVyYXRvciAgICAgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKwl0eXBlZGVmIGxpc3RfdHlwZTo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQVRUUklCVVRFUworCSAqLworCWxpc3RfdHlwZSBtRGF0YTsKKworcHVibGljOgorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQnVpbHRpbkxpc3QoKQorCTogQnVpbHRpbkNvbnRhaW5lcihDTEFTU19LSU5EX1QoIEJ1aWx0aW5MaXN0ICkgKSwKKwltRGF0YSggKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJQnVpbHRpbkxpc3QoYXZtX3NpemVfdCBhQ2FwYWNpdHkpCisJOiBCdWlsdGluQ29udGFpbmVyKENMQVNTX0tJTkRfVCggQnVpbHRpbkxpc3QgKSwgYUNhcGFjaXR5ICksCisJbURhdGEoICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBPdGhlcgorCSAqLworCUJ1aWx0aW5MaXN0KGNsYXNzX2tpbmRfdCBhQ2xhc3NLaW5kKQorCTogQnVpbHRpbkNvbnRhaW5lciggYUNsYXNzS2luZCApLAorCW1EYXRhKCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlCdWlsdGluTGlzdChjbGFzc19raW5kX3QgYUNsYXNzS2luZCwgYXZtX3NpemVfdCBhQ2FwYWNpdHkpCisJOiBCdWlsdGluQ29udGFpbmVyKCBhQ2xhc3NLaW5kICwgYUNhcGFjaXR5ICksCisJbURhdGEoICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCUJ1aWx0aW5MaXN0KGNvbnN0IEJ1aWx0aW5MaXN0ICYgYUJ1aWx0aW5MaXN0KQorCTogQnVpbHRpbkNvbnRhaW5lciggYUJ1aWx0aW5MaXN0ICksCisJbURhdGEoIGFCdWlsdGluTGlzdC5tRGF0YSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+QnVpbHRpbkxpc3QoKQorCXsKKwkJY2xlYXIoKTsKKwl9CisKKworCS8qKgorCSAqIElURVJBVE9SCisJICovCisJaW5saW5lIGl0ZXJhdG9yIGJlZ2luKCkKKwl7CisJCXJldHVybiggbURhdGEuYmVnaW4oKSApOworCX0KKworCWlubGluZSBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1EYXRhLmJlZ2luKCkgKTsKKwl9CisKKworCWlubGluZSBpdGVyYXRvciBlbmQoKQorCXsKKwkJcmV0dXJuKCBtRGF0YS5lbmQoKSApOworCX0KKworCWlubGluZSBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRGF0YS5lbmQoKSApOworCX0KKworCisJLyoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogR0VUVEVSCisJICogZW1wdGluZXNzCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCWlubGluZSB2aXJ0dWFsIGJvb2wgZW1wdHkoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRGF0YS5lbXB0eSgpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgYm9vbCBub25lbXB0eSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1EYXRhLm5vbmVtcHR5KCkgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBib29sIHNpbmdsZXRvbigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1EYXRhLnNpbmdsZXRvbigpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgYm9vbCBwb3B1bGF0ZWQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRGF0YS5wb3B1bGF0ZWQoKSApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgYXZtX3NpemVfdCBzaXplKCkgY29uc3QKKwl7CisJCXJldHVybiggbURhdGEuc2l6ZSgpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCByZXNpemUoYXZtX3NpemVfdCBuZXdTaXplKQorCXsKKwkJbURhdGEucmVzaXplKG5ld1NpemUpOworCX0KKworCisJLyoqCisJICogSU5URVJGQUNFCisJICovCisJdmlydHVhbCBCRiAmIGF0KGF2bV9zaXplX3QgaWR4KQorCXsKKwkJcmV0dXJuKCBtRGF0YS5hdChpZHgpICk7CisJfQorCisJdmlydHVhbCBjb25zdCBCRiAmIGF0KGF2bV9zaXplX3QgaWR4KSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRGF0YS5hdChpZHgpICk7CisJfQorCisKKwl2aXJ0dWFsIEJGICYgZ2V0KGF2bV9zaXplX3QgaWR4KQorCXsKKwkJcmV0dXJuKCBtRGF0YS5nZXQoaWR4KSApOworCX0KKworCXZpcnR1YWwgY29uc3QgQkYgJiBnZXQoYXZtX3NpemVfdCBpZHgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1EYXRhLmdldChpZHgpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgQkYgJiBnZXRXcml0YWJsZShhdm1fc2l6ZV90IGlkeCkKKwl7CisJCWl0ZXJhdG9yIGl0ID0gbURhdGEuYmVnaW4oKTsKKwkJaXRlcmF0b3IgZW5kSXQgPSBtRGF0YS5lbmQoKTsKKwkJZm9yKCA7IChpdCAhPSBlbmRJdCkgJiYgKGlkeCA+IDApIDsgKytpdCAsIC0taWR4ICkKKwkJeworCQkJLy8hISEgTk9USElORworCQl9CisKKwkJaWYoIChpZHggPT0gMCkgJiYgKGl0ICE9IGVuZEl0KSApCisJCXsKKwkJCSgqaXQpLm1ha2VXcml0YWJsZSgpOworCisJCQlyZXR1cm4oICppdCApOworCQl9CisJCWVsc2UKKwkJeworCQkJbURhdGEubGFzdCgpLm1ha2VXcml0YWJsZSgpOworCisJCQlyZXR1cm4oIG1EYXRhLmxhc3QoKSApOworCQl9CisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCBtYWtlV3JpdGFibGUoYXZtX3NpemVfdCBpZHgpCisJeworCQlpdGVyYXRvciBpdCA9IG1EYXRhLmJlZ2luKCk7CisJCWl0ZXJhdG9yIGVuZEl0ID0gbURhdGEuZW5kKCk7CisJCWZvciggOyAoaXQgIT0gZW5kSXQpICYmIChpZHggPiAwKSA7ICsraXQgLCAtLWlkeCApCisJCXsKKwkJCS8vISEhIE5PVEhJTkcKKwkJfQorCisJCWlmKCAoaWR4ID09IDApICYmIChpdCAhPSBlbmRJdCkgKQorCQl7CisJCQkoKml0KS5tYWtlV3JpdGFibGUoKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW1EYXRhLmxhc3QoKS5tYWtlV3JpdGFibGUoKTsKKwkJfQorCX0KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgc2V0KGF2bV9zaXplX3QgaWR4LCBjb25zdCBCRiAmIGFyZykKKwl7CisJCWl0ZXJhdG9yIGl0ID0gbURhdGEuYmVnaW4oKTsKKwkJaXRlcmF0b3IgZW5kSXQgPSBtRGF0YS5lbmQoKTsKKwkJZm9yKCA7IChpdCAhPSBlbmRJdCkgJiYgKGlkeCA+IDApIDsgKytpdCAsIC0taWR4ICkKKwkJeworCQkJLy8hISEgTk9USElORworCQl9CisKKwkJaWYoIChpZHggPT0gMCkgJiYgKGl0ICE9IGVuZEl0KSApCisJCXsKKwkJCSgqaXQpID0gYXJnOworCQl9CisJCWVsc2UKKwkJeworCQkJYWRkKGFyZyk7CisJCX0KKwl9CisKKworCWlubGluZSB2aXJ0dWFsIGJvb2wgYWRkKGNvbnN0IEJGICYgYXJnKQorCXsKKwkJaWYoIHNpemUoKSA8IG1DYXBhY2l0eSkKKwkJeworCQkJbURhdGEuYXBwZW5kKGFyZyk7CisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBib29sIGNvbnRhaW5zKGNvbnN0IEJGICYgYXJnKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRGF0YS5jb250YWlucyhhcmcpICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBib29sIGludGVyc2VjdChjb25zdCBCdWlsdGluTGlzdCAmIGFCdWlsdGluKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRGF0YS5pbnRlcnNlY3QoYUJ1aWx0aW4ubURhdGEpICk7CisJfQorCisKKworCWlubGluZSB2aXJ0dWFsIHZvaWQgZXJhc2UoYXZtX3NpemVfdCBpZHgpCisJeworCQlpZiggbURhdGEubm9uZW1wdHkoKSApCisJCXsKKwkJCWl0ZXJhdG9yIGl0ID0gbURhdGEuYmVnaW4oKTsKKwkJCWl0ZXJhdG9yIGVuZEl0ID0gbURhdGEuZW5kKCk7CisJCQlmb3IoIDsgKGl0ICE9IGVuZEl0KSAmJiAoaWR4ID4gMCkgOyArK2l0ICwgLS1pZHggKQorCQkJeworCQkJCS8vISEhIE5PVEhJTkcKKwkJCX0KKworCQkJaWYoIChpZHggPT0gMCkgJiYgKGl0ICE9IGVuZEl0KSApCisJCQl7CisJCQkJbURhdGEuZXJhc2UoaXQpOworCQkJfQorCQl9CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHJlbW92ZShjb25zdCBCRiAmIGFyZykKKwl7CisJCW1EYXRhLnJlbW92ZShhcmcpOworCX0KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgY2xlYXIoKQorCXsKKwkJbURhdGEuY2xlYXIoKTsKKwl9CisKKworCS8qKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBTRVJJQUxJWkFUSU9OCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCXZpcnR1YWwgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCW9zIDw8IFRBQjsKKworQVZNX0lGX0RFQlVHX0ZMQUcoIERBVEEgKQorCisJCW9zIDw8ICI8IiA8PCBjbGFzc0tpbmROYW1lKCkgPDwgIj4iOworCitBVk1fRU5ESUZfREVCVUdfRkxBRyggREFUQSApCisKKwkJb3MgPDwgInsgIjsKKwkJaWYoIG1EYXRhLm5vbmVtcHR5KCkgKQorCQl7CisJCQljb25zdF9pdGVyYXRvciBpdCA9IG1EYXRhLmJlZ2luKCk7CisJCQljb25zdF9pdGVyYXRvciBlbmRJdCA9IG1EYXRhLmVuZCgpOworCQkJb3MgPDwgKCppdCkuc3RyKCk7CisJCQlmb3IoICsraXQgOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCQkJeworCQkJCW9zIDw8ICIgLCAiIDw8ICgqaXQpLnN0cigpOworCQkJfQorCQl9CisJCW9zIDw8ICIgfSIgPDwgRU9MX0ZMVVNIOworCX0KKworfTsKKworCitjbGFzcyBCdWlsdGluVmVjdG9yIDoKKwkJcHVibGljIEJ1aWx0aW5Db250YWluZXIsCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggQnVpbHRpblZlY3RvciApCit7CisKKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggQnVpbHRpblZlY3RvciApCisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBUWVBFREVGCisJICovCisJdHlwZWRlZiBCRlZlY3RvciAgICAgICAgICAgICAgICAgICAgIHZlY3Rvcl90eXBlOworCitwdWJsaWM6CisJdHlwZWRlZiB2ZWN0b3JfdHlwZTo6aXRlcmF0b3IgICAgICAgIGl0ZXJhdG9yOworCXR5cGVkZWYgdmVjdG9yX3R5cGU6OmNvbnN0X2l0ZXJhdG9yICBjb25zdF9pdGVyYXRvcjsKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwl2ZWN0b3JfdHlwZSBtRGF0YTsKKworcHVibGljOgorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQnVpbHRpblZlY3RvcigpCisJOiBCdWlsdGluQ29udGFpbmVyKCBDTEFTU19LSU5EX1QoIEJ1aWx0aW5WZWN0b3IgKSApLAorCW1EYXRhKCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlCdWlsdGluVmVjdG9yKGF2bV9zaXplX3QgYUNhcGFjaXR5KQorCTogQnVpbHRpbkNvbnRhaW5lciggQ0xBU1NfS0lORF9UKCBCdWlsdGluVmVjdG9yICksIGFDYXBhY2l0eSksCisJbURhdGEoICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCUJ1aWx0aW5WZWN0b3IoY29uc3QgQnVpbHRpblZlY3RvciAmIGFCdWlsdGluVmVjdG9yKQorCTogQnVpbHRpbkNvbnRhaW5lciggYUJ1aWx0aW5WZWN0b3IgKSwKKwkgbURhdGEoIGFCdWlsdGluVmVjdG9yLm1EYXRhICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUJ1aWx0aW5WZWN0b3IoY2xhc3Nfa2luZF90IGFDbGFzc0tpbmQpCisJOiBCdWlsdGluQ29udGFpbmVyKCBhQ2xhc3NLaW5kICksCisJbURhdGEoICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCUJ1aWx0aW5WZWN0b3IoY2xhc3Nfa2luZF90IGFDbGFzc0tpbmQsIGF2bV9zaXplX3QgYUNhcGFjaXR5KQorCTogQnVpbHRpbkNvbnRhaW5lciggYUNsYXNzS2luZCAsIGFDYXBhY2l0eSApLAorCW1EYXRhKCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+QnVpbHRpblZlY3RvcigpCisJeworCQljbGVhcigpOworCX0KKworCisJLyoqCisJICogSVRFUkFUT1IKKwkgKi8KKwlpbmxpbmUgaXRlcmF0b3IgYmVnaW4oKQorCXsKKwkJcmV0dXJuKCBtRGF0YS5iZWdpbigpICk7CisJfQorCisJaW5saW5lIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QKKwl7CisJCXJldHVybiggbURhdGEuYmVnaW4oKSApOworCX0KKworCisJaW5saW5lIGl0ZXJhdG9yIGVuZCgpCisJeworCQlyZXR1cm4oIG1EYXRhLmVuZCgpICk7CisJfQorCisJaW5saW5lIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1EYXRhLmVuZCgpICk7CisJfQorCisKKwkvKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBHRVRURVIKKwkgKiBlbXB0aW5lc3MKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJaW5saW5lIHZpcnR1YWwgYm9vbCBlbXB0eSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1EYXRhLmVtcHR5KCkgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBib29sIG5vbmVtcHR5KCkgY29uc3QKKwl7CisJCXJldHVybiggbURhdGEubm9uZW1wdHkoKSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGJvb2wgc2luZ2xldG9uKCkgY29uc3QKKwl7CisJCXJldHVybiggbURhdGEuc2luZ2xldG9uKCkgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBib29sIHBvcHVsYXRlZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1EYXRhLnBvcHVsYXRlZCgpICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBhdm1fc2l6ZV90IHNpemUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRGF0YS5zaXplKCkgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHJlc2l6ZShhdm1fc2l6ZV90IG5ld1NpemUpCisJeworCQltRGF0YS5yZXNpemUobmV3U2l6ZSk7CisJfQorCisKKworCisJLyoqCisJICogSU5URVJGQUNFCisJICovCisJdmlydHVhbCBCRiAmIGF0KGF2bV9zaXplX3QgaWR4KQorCXsKKwkJcmV0dXJuKCBtRGF0YS5hdChpZHgpICk7CisJfQorCisJdmlydHVhbCBjb25zdCBCRiAmIGF0KGF2bV9zaXplX3QgaWR4KSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRGF0YS5hdChpZHgpICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBCRiAmIG9wZXJhdG9yW10oYXZtX3NpemVfdCBvZmZzZXQpCisJeworCQlyZXR1cm4oIG1EYXRhLm9wZXJhdG9yW10ob2Zmc2V0KSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGNvbnN0IEJGICYgb3BlcmF0b3JbXShhdm1fc2l6ZV90IG9mZnNldCkgY29uc3QKKwl7CisJCXJldHVybiggbURhdGEub3BlcmF0b3JbXShvZmZzZXQpICk7CisJfQorCisKKwl2aXJ0dWFsIEJGICYgZ2V0KGF2bV9zaXplX3QgaWR4KQorCXsKKwkJcmV0dXJuKCBtRGF0YS5nZXQoaWR4KSApOworCX0KKworCXZpcnR1YWwgY29uc3QgQkYgJiBnZXQoYXZtX3NpemVfdCBpZHgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1EYXRhLmdldChpZHgpICk7CisJfQorCisKKwlpbmxpbmUgQkYgJiBnZXRXcml0YWJsZShhdm1fc2l6ZV90IG9mZnNldCkKKwl7CisJCW1EYXRhW29mZnNldF0ubWFrZVdyaXRhYmxlKCk7CisKKwkJcmV0dXJuKCBtRGF0YVtvZmZzZXRdICk7CisJfQorCisJaW5saW5lIHZvaWQgbWFrZVdyaXRhYmxlKGF2bV9zaXplX3Qgb2Zmc2V0KQorCXsKKwkJbURhdGFbb2Zmc2V0XS5tYWtlV3JpdGFibGUoKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIHZvaWQgc2V0KGF2bV9zaXplX3QgaWR4LCBjb25zdCBCRiAmIGFyZykKKwl7CisJCW1EYXRhLnNldChpZHgsIGFyZyk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBib29sIGFkZChjb25zdCBCRiAmIGFyZykKKwl7CisJCWlmKCBzaXplKCkgPCBtQ2FwYWNpdHkpCisJCXsKKwkJCW1EYXRhLmFwcGVuZChhcmcpOworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgYm9vbCBjb250YWlucyhjb25zdCBCRiAmIGFyZykgY29uc3QKKwl7CisJCXJldHVybiggbURhdGEuY29udGFpbnMoYXJnKSApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgdm9pZCBlcmFzZShhdm1fc2l6ZV90IGlkeCkKKwl7CisJCW1EYXRhLmVyYXNlKCBtRGF0YS5iZWdpbigpICsgaWR4ICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHJlbW92ZShjb25zdCBCRiAmIGFyZykKKwl7CisJCW1EYXRhLnJlbW92ZShhcmcpOworCX0KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgY2xlYXIoKQorCXsKKwkJbURhdGEuY2xlYXIoKTsKKwl9CisKKworCS8qKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBTRVJJQUxJWkFUSU9OCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCXZpcnR1YWwgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCW9zIDw8IFRBQjsKKworQVZNX0lGX0RFQlVHX0ZMQUcoIERBVEEgKQorCisJCW9zIDw8ICI8IiA8PCBjbGFzc0tpbmROYW1lKCkgPDwgIj4iOworCitBVk1fRU5ESUZfREVCVUdfRkxBRyggREFUQSApCisKKwkJb3MgPDwgIlsgIjsKKwkJaWYoIG1EYXRhLm5vbmVtcHR5KCkgKQorCQl7CisJCQljb25zdF9pdGVyYXRvciBpdCA9IG1EYXRhLmJlZ2luKCk7CisJCQljb25zdF9pdGVyYXRvciBlbmRJdCA9IG1EYXRhLmVuZCgpOworCQkJb3MgPDwgKCppdCkuc3RyKCk7CisJCQlmb3IoICsraXQgOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCQkJeworCQkJCW9zIDw8ICIgLCAiIDw8ICgqaXQpLnN0cigpOworCQkJfQorCQl9CisJCW9zIDw8ICIgXSIgPDwgRU9MX0ZMVVNIOworCX0KKworfTsKKworCisKK2NsYXNzIEJ1aWx0aW5SZXZlcnNlVmVjdG9yICA6ICBwdWJsaWMgQnVpbHRpblZlY3RvciAsCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggQnVpbHRpblJldmVyc2VWZWN0b3IgKQoreworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIEJ1aWx0aW5SZXZlcnNlVmVjdG9yICkKKworCitwdWJsaWM6CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlCdWlsdGluUmV2ZXJzZVZlY3RvcigpCisJOiBCdWlsdGluVmVjdG9yKENMQVNTX0tJTkRfVCggQnVpbHRpblJldmVyc2VWZWN0b3IgKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlCdWlsdGluUmV2ZXJzZVZlY3Rvcihhdm1fc2l6ZV90IGFDYXBhY2l0eSkKKwk6IEJ1aWx0aW5WZWN0b3IoQ0xBU1NfS0lORF9UKCBCdWlsdGluUmV2ZXJzZVZlY3RvciApLCBhQ2FwYWNpdHkpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIENvcHkKKwkgKi8KKwlCdWlsdGluUmV2ZXJzZVZlY3Rvcihjb25zdCBCdWlsdGluUmV2ZXJzZVZlY3RvciAmIGFCdWlsdGluUlZlY3RvcikKKwk6IEJ1aWx0aW5WZWN0b3IoIGFCdWlsdGluUlZlY3RvciApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+QnVpbHRpblJldmVyc2VWZWN0b3IoKQorCXsKKwkJY2xlYXIoKTsKKwl9CisKKworCS8qKgorCSAqIElOVEVSRkFDRQorCSAqLworCXZpcnR1YWwgQkYgJiBhdChhdm1fc2l6ZV90IGlkeCkKKwl7CisJCXJldHVybiggbURhdGEucmV2ZXJzZV9hdChpZHgpICk7CisJfQorCisJdmlydHVhbCBjb25zdCBCRiAmIGF0KGF2bV9zaXplX3QgaWR4KSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRGF0YS5yZXZlcnNlX2F0KGlkeCkgKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIEJGICYgb3BlcmF0b3JbXShhdm1fc2l6ZV90IG9mZnNldCkKKwl7CisJCXJldHVybiggbURhdGEucmV2ZXJzZV9hdChvZmZzZXQpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgY29uc3QgQkYgJiBvcGVyYXRvcltdKGF2bV9zaXplX3Qgb2Zmc2V0KSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRGF0YS5yZXZlcnNlX2F0KG9mZnNldCkgKTsKKwl9CisKKworCXZpcnR1YWwgQkYgJiBnZXQoYXZtX3NpemVfdCBpZHgpCisJeworCQlyZXR1cm4oIG1EYXRhLnJldmVyc2VfZ2V0KGlkeCkgKTsKKwl9CisKKwl2aXJ0dWFsIGNvbnN0IEJGICYgZ2V0KGF2bV9zaXplX3QgaWR4KSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRGF0YS5yZXZlcnNlX2dldChpZHgpICk7CisJfQorCisJaW5saW5lIEJGICYgZ2V0V3JpdGFibGUoYXZtX3NpemVfdCBvZmZzZXQpCisJeworCQltRGF0YS5yZXZlcnNlX2dldChvZmZzZXQpLm1ha2VXcml0YWJsZSgpOworCisJCXJldHVybiggbURhdGEucmV2ZXJzZV9nZXQob2Zmc2V0KSApOworCX0KKworCWlubGluZSB2b2lkIG1ha2VXcml0YWJsZShhdm1fc2l6ZV90IG9mZnNldCkKKwl7CisJCW1EYXRhLnJldmVyc2VfZ2V0KG9mZnNldCkubWFrZVdyaXRhYmxlKCk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHNldChhdm1fc2l6ZV90IGlkeCwgY29uc3QgQkYgJiBhcmcpCisJeworCQltRGF0YS5yZXZlcnNlX3NldChpZHgsIGFyZyk7CisJfQorCit9OworCisKKworY2xhc3MgQnVpbHRpblNldCAgOiAgcHVibGljIEJ1aWx0aW5MaXN0ICwKKwkJQVZNX0lOSkVDVF9JTlNUQU5DRV9DT1VOVEVSX0NMQVNTKCBCdWlsdGluU2V0ICkKK3sKKworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBCdWlsdGluU2V0ICkKKworCitwdWJsaWM6CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlCdWlsdGluU2V0KCkKKwk6IEJ1aWx0aW5MaXN0KCBDTEFTU19LSU5EX1QoIEJ1aWx0aW5TZXQgKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlCdWlsdGluU2V0KGF2bV9zaXplX3QgYUNhcGFjaXR5KQorCTogQnVpbHRpbkxpc3QoIENMQVNTX0tJTkRfVCggQnVpbHRpblNldCApICwgYUNhcGFjaXR5ICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCUJ1aWx0aW5TZXQoY29uc3QgQnVpbHRpblNldCAmIGFCdWlsdGluU2V0KQorCTogQnVpbHRpbkxpc3QoIGFCdWlsdGluU2V0ICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5CdWlsdGluU2V0KCkKKwl7CisJfQorCisKKwkvKioKKwkgKiBJTlRFUkZBQ0UKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCBib29sIGFkZChjb25zdCBCRiAmIGFyZykKKwl7CisJCWlmKCBzaXplKCkgPCBtQ2FwYWNpdHkgKQorCQl7CisJCQlpZiggbm90IGNvbnRhaW5zKGFyZykgKQorCQkJeworCQkJCW1EYXRhLnB1c2hfYmFjayggYXJnICk7CisJCQl9CisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCBzZXQoYXZtX3NpemVfdCBpZHgsIGNvbnN0IEJGICYgYXJnKQorCXsKKwkJQnVpbHRpbkxpc3Q6OnJlbW92ZShhcmcpOworCQlCdWlsdGluTGlzdDo6c2V0KGlkeCwgYXJnKTsKKwl9CisKK307CisKKworCitjbGFzcyBCdWlsdGluQmFnICA6ICBwdWJsaWMgQnVpbHRpbkxpc3QgLAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIEJ1aWx0aW5CYWcgKQoreworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIEJ1aWx0aW5CYWcgKQorCisKK3B1YmxpYzoKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUJ1aWx0aW5CYWcoKQorCTogQnVpbHRpbkxpc3QoIENMQVNTX0tJTkRfVCggQnVpbHRpbkJhZyApICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCUJ1aWx0aW5CYWcoYXZtX3NpemVfdCBhQ2FwYWNpdHkpCisJOiBCdWlsdGluTGlzdCggQ0xBU1NfS0lORF9UKCBCdWlsdGluQmFnICkgLCBhQ2FwYWNpdHkgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJQnVpbHRpbkJhZyhjb25zdCBCdWlsdGluQmFnICYgYUJ1aWx0aW5CYWcpCisJOiBCdWlsdGluTGlzdCggYUJ1aWx0aW5CYWcgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkJ1aWx0aW5CYWcoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBJTlRFUkZBQ0UKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCB2b2lkIHNldChhdm1fc2l6ZV90IGlkeCwgY29uc3QgQkYgJiBhcmcpCisJeworCQlCdWlsdGluTGlzdDo6c2V0KGlkeCwgYXJnKTsKKwl9CisKK307CisKKworCit9CisKKyNlbmRpZiAvKiBCVUlMVElOQ09OVEFJTkVSX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhwcmVzc2lvbi9CdWlsdGluUXVldWUuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4cHJlc3Npb24vQnVpbHRpblF1ZXVlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzk3ZmQyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4cHJlc3Npb24vQnVpbHRpblF1ZXVlLmNwcApAQCAtMCwwICsxLDIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMzEgbWFycyAyMDExCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJCdWlsdGluUXVldWUuaCIKKworbmFtZXNwYWNlIHNlcAoreworCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL0J1aWx0aW5RdWV1ZS5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4cHJlc3Npb24vQnVpbHRpblF1ZXVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY5NGE1YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL0J1aWx0aW5RdWV1ZS5oCkBAIC0wLDAgKzEsNDMyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMzEgbWFycyAyMDExCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQlVJTFRJTlFVRVVFX0hfCisjZGVmaW5lIEJVSUxUSU5RVUVVRV9IXworCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQnVpbHRpbkNvbnRhaW5lci5oPgorCisjaW5jbHVkZSA8Y29tbW9uL0JGLmg+CisKKyNpbmNsdWRlIDxjb2xsZWN0aW9uL1R5cGVkZWYuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworY2xhc3MgQnVpbHRpblF1ZXVlICA6ICBwdWJsaWMgQnVpbHRpbkxpc3QgLAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIEJ1aWx0aW5RdWV1ZSApCit7CisKKworcHVibGljOgorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQnVpbHRpblF1ZXVlKGNsYXNzX2tpbmRfdCBhQ2xhc3NLaW5kICkKKwk6IEJ1aWx0aW5MaXN0KCBhQ2xhc3NLaW5kICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCUJ1aWx0aW5RdWV1ZShjbGFzc19raW5kX3QgYUNsYXNzS2luZCwgYXZtX3NpemVfdCBhQ2FwYWNpdHkpCisJOiBCdWlsdGluTGlzdCggYUNsYXNzS2luZCAsIGFDYXBhY2l0eSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIENvcHkKKwkgKi8KKwlCdWlsdGluUXVldWUoY29uc3QgQnVpbHRpblF1ZXVlICYgYVF1ZXVlKQorCTogQnVpbHRpbkxpc3QoIGFRdWV1ZSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+QnVpbHRpblF1ZXVlKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogSU5URVJGQUNFCisJICovCisJaW5saW5lIHZpcnR1YWwgdm9pZCBzZXQoYXZtX3NpemVfdCBpZHgsIGNvbnN0IEJGICYgYXJnKQorCXsKKwkJaXRlcmF0b3IgaXQgPSBtRGF0YS5iZWdpbigpOworCQlpdGVyYXRvciBlbmRJdCA9IG1EYXRhLmVuZCgpOworCQlmb3IoIDsgKGl0ICE9IGVuZEl0KSAmJiAoaWR4ID4gMCkgOyArK2l0ICwgLS1pZHggKQorCQl7CisJCQkvLyEhISBOT1RISU5HCisJCX0KKworCQlpZiggKGlkeCA9PSAwKSAmJiAoaXQgIT0gZW5kSXQpICkKKwkJeworCQkJKCppdCkgPSBhcmc7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwdXNoKGFyZyk7CisJCX0KKwl9CisKKworCWlubGluZSB2aXJ0dWFsIHZvaWQgcmVzaXplKGF2bV9zaXplX3QgbmV3U2l6ZSkKKwl7CisJCWlmKCBtQ2FwYWNpdHkgPiBuZXdTaXplICkKKwkJeworCQkJaWYoIChtQ2FwYWNpdHkgPSBzaXplKCkpID4gbmV3U2l6ZSApCisJCQl7CisJCQkJZm9yKCA7IG1DYXBhY2l0eSA+IG5ld1NpemUgOyAtLW1DYXBhY2l0eSApCisJCQkJeworCQkJCQlwb3AoKTsKKwkJCQl9CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCW1DYXBhY2l0eSA9IG5ld1NpemU7CisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCByZXNpemUoYXZtX3NpemVfdCBuZXdTaXplLCBjb25zdCBCRiAmIGFyZykKKwl7CisJCWlmKCBtQ2FwYWNpdHkgPiBuZXdTaXplICkKKwkJeworCQkJaWYoIChtQ2FwYWNpdHkgPSBzaXplKCkpID4gbmV3U2l6ZSApCisJCQl7CisJCQkJZm9yKCA7IG1DYXBhY2l0eSA+IG5ld1NpemUgOyAtLW1DYXBhY2l0eSApCisJCQkJeworCQkJCQlwb3AoKTsKKwkJCQl9CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisKKwkJaWYoIChtQ2FwYWNpdHkgPSBzaXplKCkpIDwgbmV3U2l6ZSApCisJCXsKKwkJCWZvciggOyBtQ2FwYWNpdHkgPCBuZXdTaXplIDsgKyttQ2FwYWNpdHkgKQorCQkJeworCQkJCXB1c2goYXJnKTsKKwkJCX0KKwkJfQorCisJCW1DYXBhY2l0eSA9IG5ld1NpemU7CisJfQorCisKKwl2aXJ0dWFsIGJvb2wgcHVzaChjb25zdCBCRiAmIGFyZykgPSAwOworCisJLy8gYXNzaWduX3RvcAorCXZpcnR1YWwgYm9vbCB0b3AoY29uc3QgQkYgJiBhcmcpID0gMDsKKworCXZpcnR1YWwgQkYgJiB0b3AoKSA9IDA7CisJdmlydHVhbCBjb25zdCBCRiAmIHRvcCgpIGNvbnN0ID0gMDsKKworCXZpcnR1YWwgQkYgcG9wKCkgPSAwOworCisJaW5saW5lIHZpcnR1YWwgQkYgcG9wKGF2bV9zaXplX3QgY291bnQpCisJeworCQlCRiBlbHQ7CisKKwkJaXRlcmF0b3IgZW5kSXQgPSBtRGF0YS5lbmQoKTsKKwkJZm9yKCBpdGVyYXRvciBpdCA9IG1EYXRhLmJlZ2luKCkgOyAoaXQgIT0gZW5kSXQpICYmIChjb3VudCA+PSAwKSA7IC0tY291bnQgKQorCQl7CisJCQllbHQgPSBwb3AoKTsKKwkJfQorCisJCXJldHVybiggcG9wKCkgKTsKKwl9CisKKworCXZpcnR1YWwgQkYgcG9wX2Zyb20oY29uc3QgQnVpbHRpbkxpc3QgJiBhTGlzdCkgY29uc3QgPSAwOworCisJdmlydHVhbCB2b2lkIHJlbW92ZV9wb3BhYmxlKGNvbnN0IEJGICYgYXJnKSA9IDA7CisKK307CisKKworCitjbGFzcyBCdWlsdGluRmlmbyAgOiAgcHVibGljIEJ1aWx0aW5RdWV1ZSAsCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggQnVpbHRpbkZpZm8gKQoreworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIEJ1aWx0aW5GaWZvICkKKworCitwdWJsaWM6CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlCdWlsdGluRmlmbygpCisJOiBCdWlsdGluUXVldWUoIENMQVNTX0tJTkRfVCggQnVpbHRpbkZpZm8gKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlCdWlsdGluRmlmbyhhdm1fc2l6ZV90IGFDYXBhY2l0eSkKKwk6IEJ1aWx0aW5RdWV1ZSggQ0xBU1NfS0lORF9UKCBCdWlsdGluRmlmbyApICwgYUNhcGFjaXR5ICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCUJ1aWx0aW5GaWZvKGNvbnN0IEJ1aWx0aW5GaWZvICYgYUZpZm8pCisJOiBCdWlsdGluUXVldWUoIGFGaWZvICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5CdWlsdGluRmlmbygpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIElOVEVSRkFDRQorCSAqLworCWlubGluZSB2aXJ0dWFsIGJvb2wgcHVzaChjb25zdCBCRiAmIGFyZykKKwl7CisJCWlmKCBzaXplKCkgPCBtQ2FwYWNpdHkgKQorCQl7CisJCQltRGF0YS5wdXNoX2JhY2soIGFyZyApOworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGJvb2wgdG9wKGNvbnN0IEJGICYgYXJnKQorCXsKKwkJaWYoIG5vbmVtcHR5KCkgKQorCQl7CisJCQltRGF0YS5wb3BfZnJvbnQoKTsKKwkJCW1EYXRhLnB1c2hfZnJvbnQoIGFyZyApOworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIEJGICYgdG9wKCkKKwl7CisJCWlmICggbm9uZW1wdHkoKSApCisJCXsKKwkJCXJldHVybiggbURhdGEuZnJvbnQoKSApOworCQl9CisJCXJldHVybiggQkY6OlJFRl9OVUxMICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgY29uc3QgQkYgJiB0b3AoKSBjb25zdAorCXsKKwkJaWYgKCBub25lbXB0eSgpICkKKwkJeworCQkJcmV0dXJuKCBtRGF0YS5mcm9udCgpICk7CisJCX0KKwkJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIEJGIHBvcCgpCisJeworCQlpZiAoIG5vbmVtcHR5KCkgKQorCQl7CisJCQlyZXR1cm4oIG1EYXRhLnBvcF9maXJzdCgpICk7CisJCX0KKwkJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIEJGIHBvcF9mcm9tKGNvbnN0IEJ1aWx0aW5MaXN0ICYgYUxpc3QpIGNvbnN0CisJeworCQljb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGVuZEl0ID0gbURhdGEucmVuZCgpOworCQlmb3IoIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgaXQgPSBtRGF0YS5yYmVnaW4oKSA7IChpdCAhPSBlbmRJdCkgOyArK2l0ICkKKwkJeworCQkJaWYoIGFMaXN0LmNvbnRhaW5zKCppdCkgKQorCQkJeworCQkJCXJldHVybiggKml0ICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCX0KKworCisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHJlbW92ZV9wb3BhYmxlKGNvbnN0IEJGICYgYXJnKQorCXsKKwkJcmV2ZXJzZV9pdGVyYXRvciBlbmRJdCA9IG1EYXRhLnJlbmQoKTsKKwkJZm9yKCByZXZlcnNlX2l0ZXJhdG9yIGl0ID0gbURhdGEucmJlZ2luKCkgOyAoaXQgIT0gZW5kSXQpIDsgKytpdCApCisJCXsKKwkJCWlmKCAoKml0KSA9PSBhcmcgKQorCQkJeworCQkJCW1EYXRhLmVyYXNlKCAtLSggaXQuYmFzZSgpICkgKTsKKworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCit9OworCisKKworY2xhc3MgQnVpbHRpbkxpZm8gIDogIHB1YmxpYyBCdWlsdGluUXVldWUgLAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIEJ1aWx0aW5MaWZvICkKK3sKKworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBCdWlsdGluTGlmbyApCisKKworcHVibGljOgorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQnVpbHRpbkxpZm8oKQorCTogQnVpbHRpblF1ZXVlKCBDTEFTU19LSU5EX1QoIEJ1aWx0aW5MaWZvICkgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJQnVpbHRpbkxpZm8oYXZtX3NpemVfdCBhQ2FwYWNpdHkpCisJOiBCdWlsdGluUXVldWUoIENMQVNTX0tJTkRfVCggQnVpbHRpbkxpZm8gKSAsIGFDYXBhY2l0eSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIENvcHkKKwkgKi8KKwlCdWlsdGluTGlmbyhjb25zdCBCdWlsdGluTGlmbyAmIGFMaWZvKQorCTogQnVpbHRpblF1ZXVlKCBhTGlmbyApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+QnVpbHRpbkxpZm8oKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBJTlRFUkZBQ0UKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCBib29sIHB1c2goY29uc3QgQkYgJiBhcmcpCisJeworCQlpZiggc2l6ZSgpIDwgbUNhcGFjaXR5ICkKKwkJeworCQkJbURhdGEucHVzaF9iYWNrKCBhcmcgKTsKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIGJvb2wgdG9wKGNvbnN0IEJGICYgYXJnKQorCXsKKwkJaWYoIG5vbmVtcHR5KCkgKQorCQl7CisJCQltRGF0YS5wb3BfYmFjaygpOworCQkJbURhdGEucHVzaF9iYWNrKCBhcmcgKTsKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBCRiAmIHRvcCgpCisJeworCQlpZiAoIG5vbmVtcHR5KCkgKQorCQl7CisJCQlyZXR1cm4oIG1EYXRhLmJhY2soKSApOworCQl9CisJCXJldHVybiggQkY6OlJFRl9OVUxMICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgY29uc3QgQkYgJiB0b3AoKSBjb25zdAorCXsKKwkJaWYgKCBub25lbXB0eSgpICkKKwkJeworCQkJcmV0dXJuKCBtRGF0YS5iYWNrKCkgKTsKKwkJfQorCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgQkYgcG9wKCkKKwl7CisJCWlmICggbm9uZW1wdHkoKSApCisJCXsKKwkJCXJldHVybiggbURhdGEucG9wX2xhc3QoKSApOworCQl9CisJCXJldHVybiggQkY6OlJFRl9OVUxMICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBCRiBwb3BfZnJvbShjb25zdCBCdWlsdGluTGlzdCAmIGFMaXN0KSBjb25zdAorCXsKKwkJY29uc3RfaXRlcmF0b3IgZW5kSXQgPSBtRGF0YS5lbmQoKTsKKwkJZm9yKCBjb25zdF9pdGVyYXRvciBpdCA9IG1EYXRhLmJlZ2luKCkgOyAoaXQgIT0gZW5kSXQpIDsgKytpdCApCisJCXsKKwkJCWlmKCBhTGlzdC5jb250YWlucygqaXQpICkKKwkJCXsKKwkJCQlyZXR1cm4oICppdCApOworCQkJfQorCQl9CisKKwkJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIHZvaWQgcmVtb3ZlX3BvcGFibGUoY29uc3QgQkYgJiBhcmcpCisJeworCQlpdGVyYXRvciBlbmRJdCA9IG1EYXRhLmVuZCgpOworCQlmb3IoIGl0ZXJhdG9yIGl0ID0gbURhdGEuYmVnaW4oKSA7IChpdCAhPSBlbmRJdCkgOyArK2l0ICkKKwkJeworCQkJaWYoICgqaXQpID09IGFyZyApCisJCQl7CisJCQkJbURhdGEuZXJhc2UoIGl0ICk7CisKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworfTsKKworCit9CisKKyNlbmRpZiAvKiBCVUlMVElOUVVFVUVfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25Db21wYXJlci5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29tcGFyZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNjFkMmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29tcGFyZXIuY3BwCkBAIC0wLDAgKzEsMjg1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTAgZMOpYy4gMjAwOQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiRXhwcmVzc2lvbkNvbXBhcmVyLmgiCisKKyNpbmNsdWRlIDxmbWwvY29tbW9uL09iamVjdEVsZW1lbnQuaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0F2bUNvZGUuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9CdWlsdGluQXJyYXkuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29uc3RydWN0b3IuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkNvbmZpZ3VyYXRpb24uaD4KKworI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9VbmlGb3JtSWRlbnRpZmllci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworLyoqCisgKiBVU1VBTCBDT01QQVJJU09OCisgKi8KK2ludCBFeHByZXNzaW9uQ29tcGFyZXI6OmNvbXBhcmUoY29uc3QgQkYgJiBmcnN0LCBjb25zdCBCRiAmIHNuZCkKK3sKKwlpZiggZnJzdC5yYXdfcG9pbnRlcigpID09IHNuZC5yYXdfcG9pbnRlcigpICkKKwl7CisJCXJldHVybiggMCApOworCX0KKwllbHNlIGlmKCBmcnN0LnZhbGlkKCkgJiYgc25kLnZhbGlkKCkgKQorCXsKKwkJaWYoIGZyc3QuY2xhc3NLaW5kKCkgPT0gc25kLmNsYXNzS2luZCgpICkKKwkJeworCQkJc3dpdGNoKCBmcnN0LmNsYXNzS2luZCgpICkKKwkJCXsKKwkJCQljYXNlIEZPUk1fSU5TVEFOQ0VfQlVGRkVSX0tJTkQ6CisJCQkJY2FzZSBGT1JNX0lOU1RBTkNFX0NPTk5FQ1RPUl9LSU5EOgorCQkJCWNhc2UgRk9STV9JTlNUQU5DRV9EQVRBX0tJTkQ6CisJCQkJY2FzZSBGT1JNX0lOU1RBTkNFX01BQ0hJTkVfS0lORDoKKwkJCQljYXNlIEZPUk1fSU5TVEFOQ0VfUE9SVF9LSU5EOgorCisJCQkJY2FzZSBGT1JNX0VYRUNVVEFCTEVfTUFDSElORV9LSU5EOgorCQkJCWNhc2UgRk9STV9BVk1UUkFOU0lUSU9OX0tJTkQ6CisJCQkJY2FzZSBGT1JNX0FWTVBST0dSQU1fS0lORDoKKwkJCQljYXNlIEZPUk1fQVZNTEFNQkRBX0tJTkQ6CisJCQkJeworCQkJCQlyZXR1cm4oIGZyc3QudG9fcmVmPCBPYmplY3RFbGVtZW50ID4oKS5jb21wYXJlRlFOKAorCQkJCQkJCXNuZC50b19yZWY8IE9iamVjdEVsZW1lbnQgPigpICkgKTsKKwkJCQl9CisKKworCQkJCWNhc2UgRk9STV9CVUlMVElOX0JPT0xFQU5fS0lORDoKKwkJCQl7CisJCQkJCXJldHVybiggZnJzdC50b19yZWY8IEJvb2xlYW4gPigpLmNvbXBhcmUoCisJCQkJCQkJc25kLnRvX3JlZjwgQm9vbGVhbiA+KCkgKSApOworCQkJCX0KKwkJCQljYXNlIEZPUk1fQlVJTFRJTl9DSEFSQUNURVJfS0lORDoKKwkJCQl7CisJCQkJCXJldHVybiggZnJzdC50b19yZWY8IENoYXJhY3RlciA+KCkuY29tcGFyZSgKKwkJCQkJCQlzbmQudG9fcmVmPCBDaGFyYWN0ZXIgPigpICkgKTsKKwkJCQl9CisJCQkJY2FzZSBGT1JNX0JVSUxUSU5fSU5URUdFUl9LSU5EOgorCQkJCXsKKwkJCQkJcmV0dXJuKCBmcnN0LnRvX3JlZjwgSW50ZWdlciA+KCkuY29tcGFyZSgKKwkJCQkJCQlzbmQudG9fcmVmPCBJbnRlZ2VyID4oKSApICk7CisJCQkJfQorCisJCQkJY2FzZSBGT1JNX0JVSUxUSU5fUkFUSU9OQUxfS0lORDoKKwkJCQl7CisJCQkJCXJldHVybiggZnJzdC50b19yZWY8IFJhdGlvbmFsID4oKS5jb21wYXJlKAorCQkJCQkJCXNuZC50b19yZWY8IFJhdGlvbmFsID4oKSApICk7CisJCQkJfQorCisJCQkJY2FzZSBGT1JNX0JVSUxUSU5fRkxPQVRfS0lORDoKKwkJCQl7CisJCQkJCXJldHVybiggZnJzdC50b19yZWY8IEZsb2F0ID4oKS5jb21wYXJlKAorCQkJCQkJCXNuZC50b19yZWY8IEZsb2F0ID4oKSApICk7CisJCQkJfQorCisJCQkJY2FzZSBGT1JNX0JVSUxUSU5fU1RSSU5HX0tJTkQ6CisJCQkJeworCQkJCQlyZXR1cm4oIGZyc3QudG9fcmVmPCBTdHJpbmcgPigpLmNvbXBhcmUoCisJCQkJCQkJc25kLnRvX3JlZjwgU3RyaW5nID4oKSApICk7CisJCQkJfQorCQkJCWNhc2UgRk9STV9CVUlMVElOX0lERU5USUZJRVJfS0lORDoKKwkJCQl7CisJCQkJCXJldHVybiggZnJzdC50b19yZWY8IElkZW50aWZpZXIgPigpLmNvbXBhcmUoCisJCQkJCQkJc25kLnRvX3JlZjwgSWRlbnRpZmllciA+KCkgKSApOworCQkJCX0KKwkJCQljYXNlIEZPUk1fQlVJTFRJTl9RVUFMSUZJRURfSURFTlRJRklFUl9LSU5EOgorCQkJCXsKKwkJCQkJcmV0dXJuKCBmcnN0LnRvX3JlZjwgUXVhbGlmaWVkSWRlbnRpZmllciA+KCkuY29tcGFyZSgKKwkJCQkJCQlzbmQudG9fcmVmPCBRdWFsaWZpZWRJZGVudGlmaWVyID4oKSApICk7CisJCQkJfQorCisJCQkJY2FzZSBGT1JNX1JVTlRJTUVfSURfS0lORDoKKwkJCQl7CisJCQkJCXJldHVybiggZnJzdC5iZlJJRCgpLmNvbXBhcmUoIHNuZC5iZlJJRCgpICkgKTsKKwkJCQl9CisKKwkJCQljYXNlIEZPUk1fRVhFQ1VUSU9OX0NPTkZJR1VSQVRJT05fS0lORDoKKwkJCQl7CisJCQkJCXJldHVybiggZnJzdC50b19wdHI8IEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24gPigpLT5jb21wYXJlKAorCQkJCQkJCXNuZC50b19yZWY8IEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24gPigpICkgKTsKKwkJCQl9CisKKwkJCQljYXNlIEZPUk1fVUZJX0tJTkQ6CisJCQkJeworCQkJCQlyZXR1cm4oIGZyc3QudG9fcmVmPCBVbmlGb3JtSWRlbnRpZmllciA+KCkuY29tcGFyZSgKKwkJCQkJCQlzbmQudG9fcmVmPCBVbmlGb3JtSWRlbnRpZmllciA+KCkgKSApOworCQkJCX0KKworCisJCQkJY2FzZSBGT1JNX0FWTUNPREVfS0lORDoKKwkJCQl7CisJCQkJCXJldHVybiggZnJzdC50b19yZWY8IEF2bUNvZGUgPigpLmNvbXBhcmUoCisJCQkJCQkJc25kLnRvX3JlZjwgQXZtQ29kZSA+KCkgKSApOworCQkJCX0KKworCQkJCWNhc2UgRk9STV9BUlJBWV9CRl9LSU5EOgorCQkJCXsKKwkJCQkJcmV0dXJuKCBmcnN0LnRvX3JlZjwgQXJyYXlCRiA+KCkuY29tcGFyZSgKKwkJCQkJCQlzbmQudG9fcmVmPCBBcnJheUJGID4oKSApICk7CisJCQkJfQorCisJCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCXJldHVybiggZnJzdC5pczwgQXZtQ29kZSA+KCkgPyAxIDogKAorCQkJCQkJCXNuZC5pczwgQXZtQ29kZSA+KCkgPyAtMSA6CisJCQkJCQkJCQlmcnN0LnN0cigpLmNvbXBhcmUoIHNuZC5zdHIoKSApICkgKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQllbHNlCisJCXsKKwkJCXJldHVybiggKCBmcnN0LmNsYXNzS2luZCgpIDwgc25kLmNsYXNzS2luZCgpICkgPyAtMSA6IDEgKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlyZXR1cm4oIGZyc3QudmFsaWQoKSA/IDEgOiAtMSApOworCX0KK30KKworCisKKy8qKgorICogVVNVQUwgRVFVQUxJVFkKKyAqLworYm9vbCBFeHByZXNzaW9uQ29tcGFyZXI6OmlzRVEoY29uc3QgQkYgJiBmcnN0LCBjb25zdCBCRiAmIHNuZCkKK3sKKwlpZiggZnJzdC5yYXdfcG9pbnRlcigpID09IHNuZC5yYXdfcG9pbnRlcigpICkKKwl7CisJCXJldHVybiggdHJ1ZSApOworCX0KKwllbHNlIGlmKCBmcnN0LnZhbGlkKCkgJiYgc25kLnZhbGlkKCkgKQorCXsKKwkJaWYoIGZyc3QuY2xhc3NLaW5kKCkgPT0gc25kLmNsYXNzS2luZCgpICkKKwkJeworCQkJc3dpdGNoKCBmcnN0LmNsYXNzS2luZCgpICkKKwkJCXsKKwkJCQljYXNlIEZPUk1fSU5TVEFOQ0VfQlVGRkVSX0tJTkQ6CisJCQkJY2FzZSBGT1JNX0lOU1RBTkNFX0NPTk5FQ1RPUl9LSU5EOgorCQkJCWNhc2UgRk9STV9JTlNUQU5DRV9EQVRBX0tJTkQ6CisJCQkJY2FzZSBGT1JNX0lOU1RBTkNFX01BQ0hJTkVfS0lORDoKKwkJCQljYXNlIEZPUk1fSU5TVEFOQ0VfUE9SVF9LSU5EOgorCisJCQkJY2FzZSBGT1JNX0VYRUNVVEFCTEVfTUFDSElORV9LSU5EOgorCQkJCWNhc2UgRk9STV9BVk1UUkFOU0lUSU9OX0tJTkQ6CisJCQkJY2FzZSBGT1JNX0FWTVBST0dSQU1fS0lORDoKKwkJCQljYXNlIEZPUk1fQVZNTEFNQkRBX0tJTkQ6CisJCQkJeworCQkJCQlyZXR1cm4oIGZyc3QuaXNURVEoIHNuZCApICk7CisJCQkJfQorCisJCQkJY2FzZSBGT1JNX0JVSUxUSU5fQk9PTEVBTl9LSU5EOgorCQkJCXsKKwkJCQkJcmV0dXJuKCBmcnN0LnRvX3JlZjwgQm9vbGVhbiA+KCkub3BlcmF0b3I9PSgKKwkJCQkJCQlzbmQudG9fcmVmPCBCb29sZWFuID4oKSApICk7CisJCQkJfQorCQkJCWNhc2UgRk9STV9CVUlMVElOX0NIQVJBQ1RFUl9LSU5EOgorCQkJCXsKKwkJCQkJcmV0dXJuKCBmcnN0LnRvX3JlZjwgQ2hhcmFjdGVyID4oKS5vcGVyYXRvcj09KAorCQkJCQkJCXNuZC50b19yZWY8IENoYXJhY3RlciA+KCkgKSApOworCQkJCX0KKwkJCQljYXNlIEZPUk1fQlVJTFRJTl9JTlRFR0VSX0tJTkQ6CisJCQkJeworCQkJCQlyZXR1cm4oIGZyc3QudG9fcmVmPCBJbnRlZ2VyID4oKS5vcGVyYXRvcj09KAorCQkJCQkJCXNuZC50b19yZWY8IEludGVnZXIgPigpICkgKTsKKwkJCQl9CisKKwkJCQljYXNlIEZPUk1fQlVJTFRJTl9SQVRJT05BTF9LSU5EOgorCQkJCXsKKwkJCQkJcmV0dXJuKCBmcnN0LnRvX3JlZjwgUmF0aW9uYWwgPigpLm9wZXJhdG9yPT0oCisJCQkJCQkJc25kLnRvX3JlZjwgUmF0aW9uYWwgPigpICkgKTsKKwkJCQl9CisKKwkJCQljYXNlIEZPUk1fQlVJTFRJTl9GTE9BVF9LSU5EOgorCQkJCXsKKwkJCQkJcmV0dXJuKCBmcnN0LnRvX3JlZjwgRmxvYXQgPigpLm9wZXJhdG9yPT0oCisJCQkJCQkJc25kLnRvX3JlZjwgRmxvYXQgPigpICkgKTsKKwkJCQl9CisKKwkJCQljYXNlIEZPUk1fQlVJTFRJTl9TVFJJTkdfS0lORDoKKwkJCQl7CisJCQkJCXJldHVybiggZnJzdC50b19yZWY8IFN0cmluZyA+KCkub3BlcmF0b3I9PSgKKwkJCQkJCQlzbmQudG9fcmVmPCBTdHJpbmcgPigpICkgKTsKKwkJCQl9CisJCQkJY2FzZSBGT1JNX0JVSUxUSU5fSURFTlRJRklFUl9LSU5EOgorCQkJCXsKKwkJCQkJcmV0dXJuKCBmcnN0LnRvX3JlZjwgSWRlbnRpZmllciA+KCkub3BlcmF0b3I9PSgKKwkJCQkJCQlzbmQudG9fcmVmPCBJZGVudGlmaWVyID4oKSApICk7CisJCQkJfQorCQkJCWNhc2UgRk9STV9CVUlMVElOX1FVQUxJRklFRF9JREVOVElGSUVSX0tJTkQ6CisJCQkJeworCQkJCQlyZXR1cm4oIGZyc3QudG9fcmVmPCBRdWFsaWZpZWRJZGVudGlmaWVyID4oKS5vcGVyYXRvcj09KAorCQkJCQkJCXNuZC50b19yZWY8IFF1YWxpZmllZElkZW50aWZpZXIgPigpICkgKTsKKwkJCQl9CisKKwkJCQljYXNlIEZPUk1fUlVOVElNRV9JRF9LSU5EOgorCQkJCXsKKwkJCQkJcmV0dXJuKCBmcnN0LmJmUklEKCkgPT0gc25kLmJmUklEKCkgKTsKKwkJCQl9CisKKwkJCQljYXNlIEZPUk1fRVhFQ1VUSU9OX0NPTkZJR1VSQVRJT05fS0lORDoKKwkJCQl7CisJCQkJCXJldHVybiggZnJzdC50b19wdHI8IEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24gPigpLT4KKwkJCQkJCQkJZ2V0UnVudGltZUlEKCkuaXNURVEoIHNuZC50b19wdHI8CisJCQkJCQkJCQlFeGVjdXRpb25Db25maWd1cmF0aW9uID4oKS0+Z2V0UnVudGltZUlEKCkpICYmCisJCQkJCQkJZnJzdC50b19wdHI8IEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24gPigpLT5nZXRDb2RlKCkuaXNFUSgKKwkJCQkJCQkJc25kLnRvX3B0cjwgRXhlY3V0aW9uQ29uZmlndXJhdGlvbiA+KCktPmdldENvZGUoKSkgKTsKKwkJCQl9CisKKwkJCQljYXNlIEZPUk1fVUZJX0tJTkQ6CisJCQkJeworCQkJCQlyZXR1cm4oIGZyc3QudG9fcmVmPCBVbmlGb3JtSWRlbnRpZmllciA+KCkuaXNFUSgKKwkJCQkJCQlzbmQudG9fcmVmPCBVbmlGb3JtSWRlbnRpZmllciA+KCkgKSApOworCQkJCX0KKworCisJCQkJY2FzZSBGT1JNX0FWTUNPREVfS0lORDoKKwkJCQl7CisJCQkJCXJldHVybiggZnJzdC50b19yZWY8IEF2bUNvZGUgPigpLmlzRVEoCisJCQkJCQkJc25kLnRvX3JlZjwgQXZtQ29kZSA+KCkgKSApOworCQkJCX0KKworCQkJCWNhc2UgRk9STV9BUlJBWV9CRl9LSU5EOgorCQkJCXsKKwkJCQkJcmV0dXJuKCBmcnN0LnRvX3JlZjwgQXJyYXlCRiA+KCkuaXNFUSgKKwkJCQkJCQlzbmQudG9fcmVmPCBBcnJheUJGID4oKSApICk7CisJCQkJfQorCisJCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCXJldHVybiggZnJzdC5zdHIoKSA9PSBzbmQuc3RyKCkgKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQllbHNlCisJCXsKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorfQorCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29tcGFyZXIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25Db21wYXJlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMGNiYzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29tcGFyZXIuaApAQCAtMCwwICsxLDcxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTAgZMOpYy4gMjAwOQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEVYUFJFU1NJT05DT01QQVJFUl9IXworI2RlZmluZSBFWFBSRVNTSU9OQ09NUEFSRVJfSF8KKworI2luY2x1ZGUgPGNvbW1vbi9CRi5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworY2xhc3MgQXJyYXlCRjsKK2NsYXNzIEJGQ29kZTsKK2NsYXNzIFVuaUZvcm1JZGVudGlmaWVyOworCisKK2NsYXNzIEV4cHJlc3Npb25Db21wYXJlcgoreworCitwdWJsaWM6CisKKwkvKioKKwkgKiBVU1VBTCBDT01QQVJJU09OCisJICovCisJc3RhdGljIGludCBjb21wYXJlKGNvbnN0IEJGICYgZnJzdCwgY29uc3QgQkYgJiBzbmQpOworCisKKwkvKioKKwkgKiBVU1VBTCBFUVVBTElUWQorCSAqLworCXN0YXRpYyBib29sIGlzRVEoY29uc3QgQkYgJiBmcnN0LCBjb25zdCBCRiAmIHNuZCk7CisKKworCXN0YXRpYyBpbmxpbmUgYm9vbCBpc05FUShjb25zdCBCRiAmIGZyc3QsIGNvbnN0IEJGICYgc25kKQorCXsKKwkJcmV0dXJuKCAhIEV4cHJlc3Npb25Db21wYXJlcjo6aXNFUShmcnN0LCBzbmQpICk7CisJfQorCisKKwkvKioKKwkgKiBUUklWSUFMIEVRVUFMSVRZCisJICovCisJc3RhdGljIGlubGluZSBib29sIGlzVEVRKGNvbnN0IEJGICYgZnJzdCwgY29uc3QgQkYgJiBzbmQpCisJeworCQlyZXR1cm4oIGZyc3QucmF3X3BvaW50ZXIoKSA9PSBzbmQucmF3X3BvaW50ZXIoKSApOworCX0KKworCXN0YXRpYyBpbmxpbmUgYm9vbCBpc05URVEoY29uc3QgQkYgJiBmcnN0LCBjb25zdCBCRiAmIHNuZCkKKwl7CisJCXJldHVybiggZnJzdC5yYXdfcG9pbnRlcigpICE9IHNuZC5yYXdfcG9pbnRlcigpICk7CisJfQorCit9OworCisKK30KKworI2VuZGlmIC8qIEVYUFJFU1NJT05DT01QQVJFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkNvbnN0YW50LmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25Db25zdGFudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ2OGY0YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25Db25zdGFudC5jcHAKQEAgLTAsMCArMSw5NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDEwIHNlcHQuIDIwMTUKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkV4cHJlc3Npb25Db25zdGFudC5oIgorCisjaW5jbHVkZSA8Zm1sL2J1aWx0aW4vQm9vbGVhbi5oPgorI2luY2x1ZGUgPGZtbC9idWlsdGluL0NoYXJhY3Rlci5oPgorI2luY2x1ZGUgPGZtbC9udW1lcmljL0ludGVnZXIuaD4KKyNpbmNsdWRlIDxmbWwvYnVpbHRpbi9TdHJpbmcuaD4KKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorICogQ09OU1RBTlQgRVhQUkVTU0lPTgorICovCitCRiBFeHByZXNzaW9uQ29uc3RhbnQ6OkJPT0xFQU5fVFJVRTsKKworQkYgRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX0ZBTFNFOworCisKK0JGIEV4cHJlc3Npb25Db25zdGFudDo6Q0hBUkFDVEVSX05VTEw7CisKK0JGIEV4cHJlc3Npb25Db25zdGFudDo6U1RSSU5HX0VNUFRZOworCisKK051bWVyaWMgRXhwcmVzc2lvbkNvbnN0YW50OjpJTlRFR0VSX01JTlVTX1RXTzsKKworTnVtZXJpYyBFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfTUlOVVNfT05FOworCitOdW1lcmljIEV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9aRVJPOworCitOdW1lcmljIEV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9PTkU7CisKK051bWVyaWMgRXhwcmVzc2lvbkNvbnN0YW50OjpJTlRFR0VSX1RXTzsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTE9BREVSIC8gRElTUE9TRVIgIEFQSQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBFeHByZXNzaW9uQ29uc3RhbnQ6OmxvYWQoKQoreworCUJPT0xFQU5fVFJVRSAgICAgID0gQm9vbGVhbjo6Y3JlYXRlKHRydWUpOworCisJQk9PTEVBTl9GQUxTRSAgICAgPSBCb29sZWFuOjpjcmVhdGUoZmFsc2UpOworCisKKwlJTlRFR0VSX01JTlVTX1RXTyA9IC0yOworCisJSU5URUdFUl9NSU5VU19PTkUgPSAtMTsKKworCUlOVEVHRVJfWkVSTyAgICAgID0gMDsKKworCUlOVEVHRVJfT05FICAgICAgID0gMTsKKworCUlOVEVHRVJfVFdPICAgICAgID0gMjsKKworCisJQ0hBUkFDVEVSX05VTEwgICAgPSBuZXcgQ2hhcmFjdGVyKCdcMCcpOworCisJU1RSSU5HX0VNUFRZICAgICAgPSBTdHJpbmc6OmNyZWF0ZSgiIik7Cit9CisKKwordm9pZCBFeHByZXNzaW9uQ29uc3RhbnQ6OmRpc3Bvc2UoKQoreworCUJPT0xFQU5fVFJVRS5kZXN0cm95KCk7CisJQk9PTEVBTl9GQUxTRS5kZXN0cm95KCk7CisKKwlJTlRFR0VSX01JTlVTX1RXTy5kZXN0cm95KCk7CisJSU5URUdFUl9NSU5VU19PTkUuZGVzdHJveSgpOworCisJSU5URUdFUl9aRVJPLmRlc3Ryb3koKTsKKworCUlOVEVHRVJfT05FLmRlc3Ryb3koKTsKKwlJTlRFR0VSX1RXTy5kZXN0cm95KCk7CisKKwlDSEFSQUNURVJfTlVMTC5kZXN0cm95KCk7CisJU1RSSU5HX0VNUFRZLmRlc3Ryb3koKTsKK30KKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25Db25zdGFudC5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkNvbnN0YW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYwOWMyZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25Db25zdGFudC5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxMCBzZXB0LiAyMDE1CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQVZNX01PREVMX0VYUFJFU1NJT05fRVhQUkVTU0lPTkNPTlNUQU5UX0hfCisjZGVmaW5lIEFWTV9NT0RFTF9FWFBSRVNTSU9OX0VYUFJFU1NJT05DT05TVEFOVF9IXworCisjaW5jbHVkZSA8Y29tbW9uL0JGLmg+CisKKyNpbmNsdWRlIDxmbWwvbnVtZXJpYy9OdW1lcmljLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIEV4cHJlc3Npb25Db25zdGFudAoreworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RBTlQgRVhQUkVTU0lPTgorCSAqLworCXN0YXRpYyBCRiBCT09MRUFOX1RSVUU7CisJc3RhdGljIEJGIEJPT0xFQU5fRkFMU0U7CisKKwlzdGF0aWMgQkYgQ0hBUkFDVEVSX05VTEw7CisKKwlzdGF0aWMgQkYgU1RSSU5HX0VNUFRZOworCisJc3RhdGljIE51bWVyaWMgSU5URUdFUl9NSU5VU19UV087CisJc3RhdGljIE51bWVyaWMgSU5URUdFUl9NSU5VU19PTkU7CisJc3RhdGljIE51bWVyaWMgSU5URUdFUl9aRVJPOworCXN0YXRpYyBOdW1lcmljIElOVEVHRVJfT05FOworCXN0YXRpYyBOdW1lcmljIElOVEVHRVJfVFdPOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gTE9BREVSIC8gRElTUE9TRVIgIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwlzdGF0aWMgdm9pZCBsb2FkKCk7CisJc3RhdGljIHZvaWQgZGlzcG9zZSgpOworCit9OworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qIEFWTV9NT0RFTF9FWFBSRVNTSU9OX0VYUFJFU1NJT05DT05TVEFOVF9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkNvbnN0cnVjdG9yLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25Db25zdHJ1Y3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg3ZmRlOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25Db25zdHJ1Y3Rvci5jcHAKQEAgLTAsMCArMSw0NzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxMSBzZXB0LiAyMDA5CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJFeHByZXNzaW9uQ29uc3RydWN0b3IuaCIKKworI2luY2x1ZGUgPHV0aWwvYXZtX3N0cmluZy5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZUxpYi5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVRdWVyeS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVTeXN0ZW0uaD4KKworI2luY2x1ZGUgPGZtbC9vcGVyYXRvci9PcGVyYXRvck1hbmFnZXIuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL1J1bnRpbWVMaWIuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lUXVlcnkuaD4KKworI2luY2x1ZGUgPGZtbC90eXBlL0VudW1UeXBlU3BlY2lmaWVyLmg+CisKKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvTWFjaGluZS5oPgorCisjaW5jbHVkZSA8c2V3L0NvbmZpZ3VyYXRpb24uaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERlY2ltYWwgLyBVRGVjaW1hbAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkYgRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdEZWNpbWFsKGNvbnN0IHN0ZDo6c3RyaW5nICYgYVZhbHVlLCBjaGFyIHNlcCkKK3sKKwlzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IGFWYWx1ZS5maW5kKHNlcCk7CisJaWYoIHBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisJeworCQlhdm1faW50ZWdlcl90IGFEZWNpbWFsUGFydDsKKwkJaWYoIHNlcDo6ZnJvbV9zdHJpbmc8IGF2bV9pbnRlZ2VyX3QgPigKKwkJCQlhVmFsdWUuc3Vic3RyKHBvcysxKSwgYURlY2ltYWxQYXJ0KSApCisJCXsKKwkJCWlmKCBhRGVjaW1hbFBhcnQgPT0gMCApCisJCQl7CisJCQkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0ludGVnZXIoCisJCQkJCQlhVmFsdWUuc3Vic3RyKDAsIHBvcykgKSApOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJPDwgImZhaWw6PiBzZXA6OmZyb21fc3RyaW5nPCBpbnRlZ2VyX3Q+KCAiCisJCQkJCTw8IGFWYWx1ZS5zdWJzdHIocG9zKzEpIDw8ICIpICEhISIKKwkJCQkJPDwgU0VORF9FWElUOworCisJCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCQl9CisKKwkJc3RkOjpzdHJpbmcgc3RyTnVtZXIgPSBzdGQ6OnN0cmluZyhhVmFsdWUpLmVyYXNlKHBvcywgMSk7CisKKwkJc3RkOjpzdHJpbmcgc3RyRGVub20gPSBPU1MoKSA8PAorCQkJCSggc3RkOjpwb3coMTAuMCwgYVZhbHVlLnNpemUoKSAtIChwb3MgKyAxKSkgKTsKKworCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3UmF0aW9uYWwoc3RyTnVtZXIsIHN0ckRlbm9tKSApOworCX0KKwllbHNlCisJeworCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3SW50ZWdlcihhVmFsdWUpICk7CisJfQorfQorCisKK0JGIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3VURlY2ltYWwoY29uc3Qgc3RkOjpzdHJpbmcgJiBhVmFsdWUsIGNoYXIgc2VwKQoreworCXN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgcG9zID0gYVZhbHVlLmZpbmQoc2VwKTsKKwlpZiggcG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKwl7CisJCWF2bV91aW50ZWdlcl90IGFEZWNpbWFsUGFydDsKKwkJaWYoIHNlcDo6ZnJvbV9zdHJpbmc8IGF2bV91aW50ZWdlcl90ID4oCisJCQkJYVZhbHVlLnN1YnN0cihwb3MrMSksIGFEZWNpbWFsUGFydCkgKQorCQl7CisJCQlpZiggYURlY2ltYWxQYXJ0ID09IDAgKQorCQkJeworCQkJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdJbnRlZ2VyKAorCQkJCQkJYVZhbHVlLnN1YnN0cigwLCBwb3MpICkgKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCTw8ICJmYWlsOj4gc2VwOjpmcm9tX3N0cmluZzwgdWludGVnZXJfdD4oICIKKwkJCQkJPDwgYVZhbHVlLnN1YnN0cihwb3MrMSkgPDwgIikgISEhIgorCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCXJldHVybiggQkY6OlJFRl9OVUxMICk7CisJCX0KKworCQlzdGQ6OnN0cmluZyBzdHJOdW1lciA9IHN0ZDo6c3RyaW5nKGFWYWx1ZSkuZXJhc2UocG9zLCAxKTsKKworCQlzdGQ6OnN0cmluZyBzdHJEZW5vbSA9IE9TUygpIDw8CisJCQkJKCBzdGQ6OnBvdygxMC4wLCBhVmFsdWUuc2l6ZSgpIC0gKHBvcyArIDEpKSApOworCisJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdSYXRpb25hbChzdHJOdW1lciwgc3RyRGVub20pICk7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdJbnRlZ2VyKGFWYWx1ZSkgKTsKKwl9Cit9CisKKworQkYgRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdRdWFsaWZpZWRJZGVudGlmaWVyKAorCQlNYWNoaW5lICogbWFjaGluZSwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKQoreworCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdRdWFsaWZpZWRJZGVudGlmaWVyKAorCQkJT1NTKCkgPDwgbWFjaGluZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAnLicgPDwgYU5hbWVJRCApICk7Cit9CisKKy8vIG5ldyBpbnN0YW5jZSBvZiBFbGVtZW50IEFjY2VzcyBGUU4tSUQgOj4gbWFjaGluZTxmcW4+LmVsZW1lbnQ8bmFtZS1pZD4KK0JGIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3UXVhbGlmaWVkSWRlbnRpZmllcigKKwkJTWFjaGluZSAqIG1hY2hpbmUsIGNvbnN0IE9iamVjdEVsZW1lbnQgKiBvYmpFbGVtZW50KQoreworCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdRdWFsaWZpZWRJZGVudGlmaWVyKAorCQkJT1NTKCkgPDwgbWFjaGluZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJCQk8PCAnLicgPDwgb2JqRWxlbWVudC0+Z2V0TmFtZUlEKCkgKSApOworfQorCisKK0JGIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3UXVhbGlmaWVkUG9zaXRpb25hbElkZW50aWZpZXIoCisJCU1hY2hpbmUgKiBtYWNoaW5lLCBhdm1fb2Zmc2V0X3QgYVBvc2l0aW9uT2Zmc2V0ICkKK3sKKwlyZXR1cm4oIEJGKG5ldyBRdWFsaWZpZWRJZGVudGlmaWVyKAorCQkJbWFjaGluZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSwgYVBvc2l0aW9uT2Zmc2V0ICkgKSApOworfQorCisKKy8qKgorICogU1BFQ0lGSUMgVFlQRUQgU1RSSU5HIFZBTFVFIGFzIEJVSUxUSU4gRVhQUkVTU0lPTgorICovCitCRiBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0V4cHIoY29uc3QgQ29uZmlndXJhdGlvbiAmIGFDb25maWd1cmF0aW9uLAorCQljb25zdCBJVHlwZVNwZWNpZmllciAmIGFUeXBlU3BlY2lmaWVyLCBjb25zdCBzdGQ6OnN0cmluZyAmIGFWYWx1ZSkKK3sKKwlpZiggYVR5cGVTcGVjaWZpZXIuaXNUeXBlZEJvb2xlYW4oKSApCisJeworCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbihhVmFsdWUpICk7CisJfQorCisJaWYoIGFUeXBlU3BlY2lmaWVyLmlzVHlwZWRDaGFyYWN0ZXIoKSApCisJeworCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q2hhcihhVmFsdWUpICk7CisJfQorCWlmKCBhVHlwZVNwZWNpZmllci5pc1R5cGVkU3RyaW5nKCkgKQorCXsKKwkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld1N0cmluZyhhVmFsdWUpICk7CisJfQorCisJZWxzZSBpZiggYVR5cGVTcGVjaWZpZXIud2Vha2x5VHlwZWRVSW50ZWdlcigpICkKKwl7CisJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdJbnRlZ2VyKGFWYWx1ZSkgKTsKKwl9CisJZWxzZSBpZiggYVR5cGVTcGVjaWZpZXIud2Vha2x5VHlwZWRJbnRlZ2VyKCkgKQorCXsKKwkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0ludGVnZXIoYVZhbHVlKSApOworCX0KKworCWVsc2UgaWYoIGFUeXBlU3BlY2lmaWVyLndlYWtseVR5cGVkVVJhdGlvbmFsKCkgKQorCXsKKwkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld1JhdGlvbmFsKGFWYWx1ZSkgKTsKKwl9CisJZWxzZSBpZiggYVR5cGVTcGVjaWZpZXIud2Vha2x5VHlwZWRSYXRpb25hbCgpICkKKwl7CisJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdSYXRpb25hbChhVmFsdWUpICk7CisJfQorCisJZWxzZSBpZiggYVR5cGVTcGVjaWZpZXIud2Vha2x5VHlwZWRGbG9hdCgpICkKKwl7CisJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdGbG9hdChhVmFsdWUpICk7CisJfQorCisJZWxzZSBpZiggYVR5cGVTcGVjaWZpZXIud2Vha2x5VHlwZWRVUmVhbCgpICkKKwl7CisJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdVRGVjaW1hbChhVmFsdWUpICk7CisJfQorCWVsc2UgaWYoIGFUeXBlU3BlY2lmaWVyLndlYWtseVR5cGVkUmVhbCgpICkKKwl7CisJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdEZWNpbWFsKGFWYWx1ZSkgKTsKKwl9CisKKwllbHNlIGlmKCBhVHlwZVNwZWNpZmllci5pc1R5cGVkTWFjaGluZSgpICkKKwl7CisJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjoKKwkJCQluZXdFeHByTWFjaGluZShhQ29uZmlndXJhdGlvbiwgYVZhbHVlKSApOworCX0KKworCWVsc2UgaWYoIGFUeXBlU3BlY2lmaWVyLmlzVHlwZWRFbnVtKCkgKQorCXsKKwkJcmV0dXJuKCBhVHlwZVNwZWNpZmllci50aGlzVHlwZVNwZWNpZmllcigpLT4KKwkJCQlhczwgRW51bVR5cGVTcGVjaWZpZXIgPigpLT5nZXREYXRhQnlOYW1lSUQoYVZhbHVlKSApOworCX0KKworCXJldHVybiggQkY6OlJFRl9OVUxMICk7Cit9CisKKworQkYgRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdFeHByTWFjaGluZSgKKwkJY29uc3QgQ29uZmlndXJhdGlvbiAmIGFDb25maWd1cmF0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyAmIGFWYWx1ZSkKK3sKKwlFeGVjdXRhYmxlUXVlcnkgWFF1ZXJ5KCBhQ29uZmlndXJhdGlvbiApOworCisJY29uc3QgU3ltYm9sICYgZm91bmRNYWNoaW5lID0KKwkJCVhRdWVyeS5nZXRNYWNoaW5lQnlRdWFsaWZpZWROYW1lSUQoCisJCQkJCVNwZWNpZmllcjo6REVTSUdOX0lOU1RBTkNFX0tJTkQsIGFWYWx1ZSk7CisKKwlpZiggZm91bmRNYWNoaW5lLnZhbGlkKCkgKQorCXsKKwkJcmV0dXJuKCBmb3VuZE1hY2hpbmUgKTsKKwl9CisJZWxzZSBpZiggYVZhbHVlID09IEV4ZWN1dGFibGVMaWI6Ok1BQ0hJTkVfRU5WSVJPTk1FTlQuZ2V0TmFtZUlEKCkgKQorCXsKKwkJcmV0dXJuKCBFeGVjdXRhYmxlTGliOjpNQUNISU5FX0VOVklST05NRU5UICk7CisJfQorCWVsc2UgaWYoIGFWYWx1ZSA9PSBFeGVjdXRhYmxlTGliOjpNQUNISU5FX05VTEwuZ2V0TmFtZUlEKCkgKQorCXsKKwkJcmV0dXJuKCBFeGVjdXRhYmxlTGliOjpNQUNISU5FX05VTEwgKTsKKwl9CisKKwlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworfQorCitCRiBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0V4cHJSdW50aW5lKAorCQljb25zdCBDb25maWd1cmF0aW9uICYgYUNvbmZpZ3VyYXRpb24sIGNvbnN0IHN0ZDo6c3RyaW5nICYgYVZhbHVlKQoreworCVJ1bnRpbWVRdWVyeSBSUXVlcnkoIGFDb25maWd1cmF0aW9uICk7CisKKwljb25zdCBSdW50aW1lSUQgJiBmb3VuZFJ1bnRpbmUgPSBSUXVlcnkuZ2V0UnVudGluZUJ5UXVhbGlmaWVkTmFtZUlEKGFWYWx1ZSk7CisKKwlpZiggZm91bmRSdW50aW5lLnZhbGlkKCkgKQorCXsKKwkJcmV0dXJuKCBmb3VuZFJ1bnRpbmUgKTsKKwl9CisJZWxzZSBpZiggYVZhbHVlID09IFJ1bnRpbWVMaWI6OlJJRF9FTlZJUk9OTUVOVC5nZXROYW1lSUQoKSApCisJeworCQlyZXR1cm4oIFJ1bnRpbWVMaWI6OlJJRF9FTlZJUk9OTUVOVCApOworCX0KKwllbHNlIGlmKCBhVmFsdWUgPT0gUnVudGltZUxpYjo6UklEX05JTC5nZXROYW1lSUQoKSApCisJeworCQlyZXR1cm4oIFJ1bnRpbWVMaWI6OlJJRF9OSUwgKTsKKwl9CisKKwlyZXR1cm4oIFJ1bnRpbWVMaWI6OlJJRF9FTlZJUk9OTUVOVCApOworfQorCisKKy8qKgorICogU1BFQ0lGSUMgQVZNQ09ERSBFWFBSRVNTSU9OCisgKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFERCA8IElOQ1IgfCBERUNSID4gRVhQUkVTU0lPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkYgRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjphZGRFeHByKGNvbnN0IEJGICYgYXJnLCBhdm1faW50ZWdlcl90IHZhbCkKK3sKKwlzd2l0Y2goIGFyZy5jbGFzc0tpbmQoKSApCisJeworCQljYXNlIEZPUk1fQlVJTFRJTl9JTlRFR0VSX0tJTkQ6CisJCXsKKwkJCUJGIHJlcyA9IGFyZzsKKwkJCXJlcy5tYWtlV3JpdGFibGUoKTsKKwkJCXJlcy50b19wdHI8IEludGVnZXIgPigpLT5hZGRFeHByKHZhbCk7CisKKwkJCXJldHVybiggcmVzICk7CisJCX0KKworCQljYXNlIEZPUk1fQlVJTFRJTl9SQVRJT05BTF9LSU5EOgorCQl7CisJCQlCRiByZXMgPSBhcmc7CisJCQlyZXMubWFrZVdyaXRhYmxlKCk7CisJCQlyZXMudG9fcHRyPCBSYXRpb25hbCA+KCktPmFkZEV4cHIodmFsKTsKKworCQkJcmV0dXJuKCByZXMgKTsKKwkJfQorCisJCWNhc2UgRk9STV9CVUlMVElOX0ZMT0FUX0tJTkQ6CisJCXsKKwkJCUJGIHJlcyA9IGFyZzsKKwkJCXJlcy5tYWtlV3JpdGFibGUoKTsKKwkJCXJlcy50b19wdHI8IEZsb2F0ID4oKS0+YWRkRXhwcih2YWwpOworCisJCQlyZXR1cm4oIHJlcyApOworCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJcmV0dXJuKCBhZGRFeHByKGFyZywgbmV3VUludGVnZXIodmFsKSkgKTsKKwkJfQorCX0KK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRk9SIEFMTCBFWFBSRVNTSU9OIElNUExFTUVOVEFUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitCRiBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0V4cHIoT3BlcmF0b3IgKiBhbk9wZXJhdG9yLCBjb25zdCBCRiAmIGFyZykKK3sKKwlzd2l0Y2goIGFuT3BlcmF0b3ItPmdldEF2bU9wQ29kZSgpICkKKwl7CisJCWNhc2UgQVZNX09QQ09ERV9BTkQ6CisJCWNhc2UgQVZNX09QQ09ERV9PUjoKKwkJY2FzZSBBVk1fT1BDT0RFX1BMVVM6CisJCWNhc2UgQVZNX09QQ09ERV9NVUxUOgorCQljYXNlIEFWTV9PUENPREVfUE9XOgorCQljYXNlIEFWTV9PUENPREVfRElWOgorCQl7CisJCQlyZXR1cm4oIGFyZyApOworCQl9CisKKwkJY2FzZSBBVk1fT1BDT0RFX05PVDoKKwkJeworCQkJcmV0dXJuKCBub3RFeHByKGFyZykgKTsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9VTUlOVVM6CisJCXsKKwkJCXJldHVybiggdW1pbnVzRXhwcihhcmcpICk7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlyZXR1cm4oIG5ld0NvZGUoYW5PcGVyYXRvciwgYXJnKSApOworCQl9CisJfQorfQorCitCRiBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0V4cHIoCisJCU9wZXJhdG9yICogYW5PcGVyYXRvciwgY29uc3QgQkYgJiBhcmcxLCBjb25zdCBCRiAmIGFyZzIpCit7CisJc3dpdGNoKCBhbk9wZXJhdG9yLT5nZXRBdm1PcENvZGUoKSApCisJeworCQljYXNlIEFWTV9PUENPREVfQU5EOgorCQl7CisJCQlyZXR1cm4oIGFuZEV4cHIoYXJnMSwgYXJnMikgKTsKKwkJfQorCQljYXNlIEFWTV9PUENPREVfT1I6CisJCXsKKwkJCXJldHVybiggb3JFeHByKGFyZzEsIGFyZzIpICk7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfRVhJU1Q6CisJCXsKKwkJCXJldHVybiggZXhpc3RFeHByKGFyZzEsIGFyZzIpICk7CisJCX0KKwkJY2FzZSBBVk1fT1BDT0RFX0ZPUkFMTDoKKwkJeworCQkJcmV0dXJuKCBmb3JhbGxFeHByKGFyZzEsIGFyZzIpICk7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfRVE6CisJCXsKKwkJCXJldHVybiggZXFFeHByKGFyZzEsIGFyZzIpICk7CisJCX0KKwkJY2FzZSBBVk1fT1BDT0RFX05FUToKKwkJeworCQkJcmV0dXJuKCBuZXFFeHByKGFyZzEsIGFyZzIpICk7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfU0VROgorCQl7CisJCQlyZXR1cm4oIHNlcUV4cHIoYXJnMSwgYXJnMikgKTsKKwkJfQorCQljYXNlIEFWTV9PUENPREVfTlNFUToKKwkJeworCQkJcmV0dXJuKCBuc2VxRXhwcihhcmcxLCBhcmcyKSApOworCQl9CisKKwkJY2FzZSBBVk1fT1BDT0RFX0xUOgorCQl7CisJCQlyZXR1cm4oIGx0RXhwcihhcmcxLCBhcmcyKSApOworCQl9CisJCWNhc2UgQVZNX09QQ09ERV9MVEU6CisJCXsKKwkJCXJldHVybiggbHRlRXhwcihhcmcxLCBhcmcyKSApOworCQl9CisJCWNhc2UgQVZNX09QQ09ERV9HVDoKKwkJeworCQkJcmV0dXJuKCBndEV4cHIoYXJnMSwgYXJnMikgKTsKKwkJfQorCQljYXNlIEFWTV9PUENPREVfR1RFOgorCQl7CisJCQlyZXR1cm4oIGd0ZUV4cHIoYXJnMSwgYXJnMikgKTsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9QTFVTOgorCQl7CisJCQlyZXR1cm4oIGFkZEV4cHIoYXJnMSwgYXJnMikgKTsKKwkJfQorCQljYXNlIEFWTV9PUENPREVfTUlOVVM6CisJCXsKKwkJCXJldHVybiggbWludXNFeHByKGFyZzEsIGFyZzIpICk7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfTVVMVDoKKwkJeworCQkJcmV0dXJuKCBtdWx0RXhwcihhcmcxLCBhcmcyKSApOworCQl9CisJCWNhc2UgQVZNX09QQ09ERV9QT1c6CisJCXsKKwkJCXJldHVybiggcG93RXhwcihhcmcxLCBhcmcyKSApOworCQl9CisKKwkJY2FzZSBBVk1fT1BDT0RFX0RJVjoKKwkJeworCQkJcmV0dXJuKCBkaXZFeHByKGFyZzEsIGFyZzIpICk7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlyZXR1cm4oIG5ld0NvZGUoYW5PcGVyYXRvciwgYXJnMSwgYXJnMikgKTsKKwkJfQorCX0KK30KKworCitCRiBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0V4cHIoCisJCU9wZXJhdG9yICogYW5PcGVyYXRvciwgY29uc3QgQXZtQ29kZTo6dGhpc19jb250YWluZXJfdHlwZSAmIGxpc3RPZkFyZykKK3sKKwlzd2l0Y2goIGFuT3BlcmF0b3ItPmdldEF2bU9wQ29kZSgpICkKKwl7CisJCWNhc2UgQVZNX09QQ09ERV9BTkQ6CisJCXsKKwkJCXJldHVybiggYW5kRXhwcihsaXN0T2ZBcmcpICk7CisJCX0KKwkJY2FzZSBBVk1fT1BDT0RFX09SOgorCQl7CisJCQlyZXR1cm4oIG9yRXhwcihsaXN0T2ZBcmcpICk7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfRVhJU1Q6CisJCXsKKwkJCXJldHVybiggZXhpc3RFeHByKGxpc3RPZkFyZykgKTsKKwkJfQorCQljYXNlIEFWTV9PUENPREVfRk9SQUxMOgorCQl7CisJCQlyZXR1cm4oIGZvcmFsbEV4cHIobGlzdE9mQXJnKSApOworCQl9CisKKwkJY2FzZSBBVk1fT1BDT0RFX1BMVVM6CisJCXsKKwkJCXJldHVybiggYWRkRXhwcihsaXN0T2ZBcmcpICk7CisJCX0KKwkJY2FzZSBBVk1fT1BDT0RFX01VTFQ6CisJCXsKKwkJCXJldHVybiggbXVsdEV4cHIobGlzdE9mQXJnKSApOworCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJcmV0dXJuKCBuZXdDb2RlKGFuT3BlcmF0b3IsIGxpc3RPZkFyZykgKTsKKwkJfQorCX0KK30KKworCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25Db25zdHJ1Y3Rvci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkNvbnN0cnVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYwNGEzZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25Db25zdHJ1Y3Rvci5oCkBAIC0wLDAgKzEsODY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTEgc2VwdC4gMjAwOQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEVYUFJFU1NJT05DT05TVFJVQ1RPUl9IXworI2RlZmluZSBFWFBSRVNTSU9OQ09OU1RSVUNUT1JfSF8KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0F2bUNvZGVGYWN0b3J5Lmg+CisKKyNpbmNsdWRlIDxjb21tb24vQkYuaD4KKworI2luY2x1ZGUgPGZtbC9idWlsdGluL0Jvb2xlYW4uaD4KKyNpbmNsdWRlIDxmbWwvYnVpbHRpbi9DaGFyYWN0ZXIuaD4KKyNpbmNsdWRlIDxmbWwvYnVpbHRpbi9JZGVudGlmaWVyLmg+CisjaW5jbHVkZSA8Zm1sL2J1aWx0aW4vU3RyaW5nLmg+CisjaW5jbHVkZSA8Zm1sL2J1aWx0aW4vUXVhbGlmaWVkSWRlbnRpZmllci5oPgorCisjaW5jbHVkZSA8Zm1sL251bWVyaWMvRmxvYXQuaD4KKyNpbmNsdWRlIDxmbWwvbnVtZXJpYy9JbnRlZ2VyLmg+CisjaW5jbHVkZSA8Zm1sL251bWVyaWMvUmF0aW9uYWwuaD4KKworI2luY2x1ZGUgPGZtbC9udW1lcmljL051bWVyaWMuaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0F2bUNvZGUuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29uc3RhbnQuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29uc3RydWN0b3JJbXBsLmg+CisKKyNpbmNsdWRlIDxmbWwvbGliL0lUeXBlU3BlY2lmaWVyLmg+CisKKyNpbmNsdWRlIDxmbWwvb3BlcmF0b3IvT3BlcmF0b3IuaD4KKyNpbmNsdWRlIDxmbWwvb3BlcmF0b3IvT3BlcmF0b3JNYW5hZ2VyLmg+CisKKyNpbmNsdWRlIDxmbWwvd29ya2Zsb3cvVW5pRm9ybUlkZW50aWZpZXIuaD4KKworI2luY2x1ZGUgPGNtYXRoPgorCisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBDb25maWd1cmF0aW9uOworY2xhc3MgT2JqZWN0RWxlbWVudDsKK2NsYXNzIE1hY2hpbmU7CisKKworY2xhc3MgRXhwcmVzc2lvbkNvbnN0cnVjdG9yICA6ICAgcHVibGljIEF2bUNvZGVGYWN0b3J5Cit7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERFRkFVTFQgRVhQUkVTU0lPTiBDT05TVFJVQ1RPUiBJTVBMRU1FTlRBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNpZiggdHJ1ZSApCisKKwkjZGVmaW5lIERFRkFVTFRfRVhQUkVTU0lPTl9JTVBMICBFWFBSRVNTSU9OOjpOQVRJVkVfSU1QTAorCisjZW5kaWYKKworCitwdWJsaWM6CisKKwkvKioKKwkgKiBQUklNSVRJVkUgRVhQUkVTU0lPTgorCSAqLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBERUZBVUxUIE5FVyBCT09MRUFOIFZBTFVFCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJaW5saW5lIHN0YXRpYyBjb25zdCBCRiAmIG5ld0Jvb2xlYW4oYm9vbCBhVmFsdWUgPSBmYWxzZSkKKwl7CisJCXJldHVybiggKCBhVmFsdWUgKQorCQkJCT8gRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX1RSVUUKKwkJCQk6IEV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9GQUxTRSApOworCX0KKworCWlubGluZSBzdGF0aWMgQkYgbmV3Qm9vbGVhbihjb25zdCBjaGFyICogYVZhbHVlKQorCXsKKwkJcmV0dXJuKCAoIDo6c3RyY2FzZWNtcCgidHJ1ZSIsIGFWYWx1ZSkgPT0gMCApCisJCQkJPyBFeHByZXNzaW9uQ29uc3RhbnQ6OkJPT0xFQU5fVFJVRQorCQkJCTogRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX0ZBTFNFICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBCRiBuZXdCb29sZWFuKGNvbnN0IHN0ZDo6c3RyaW5nICYgYVZhbHVlKQorCXsKKwkJcmV0dXJuKCAoIDo6c3RyY2FzZWNtcCgidHJ1ZSIsIGFWYWx1ZS5jX3N0cigpKSA9PSAgMCkKKwkJCQk/IEV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9UUlVFCisJCQkJOiBFeHByZXNzaW9uQ29uc3RhbnQ6OkJPT0xFQU5fRkFMU0UgKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBERUZBVUxUIE5FVyBJTlRFR0VSIFZBTFVFCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJaW5saW5lIHN0YXRpYyBCRiBuZXdJbnRlZ2VyKEludGVnZXIgKiBhVmFsdWUpCisJeworCQlyZXR1cm4oIEJGKCBhVmFsdWUgKSApOworCX0KKworCWlubGluZSBzdGF0aWMgQkYgbmV3SW50ZWdlcihhdm1faW50ZWdlcl90IGFWYWx1ZSkKKwl7CisJCXN3aXRjaCggYVZhbHVlICkKKwkJeworCQkJY2FzZSAgMDogcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfWkVSTyApOworCisJCQljYXNlICAxOiByZXR1cm4oIEV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9PTkUgKTsKKwkJCWNhc2UgIDI6IHJldHVybiggRXhwcmVzc2lvbkNvbnN0YW50OjpJTlRFR0VSX1RXTyApOworCisJCQljYXNlIC0xOiByZXR1cm4oIEV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9NSU5VU19PTkUgKTsKKwkJCWNhc2UgLTI6IHJldHVybiggRXhwcmVzc2lvbkNvbnN0YW50OjpJTlRFR0VSX01JTlVTX1RXTyApOworCisJCQlkZWZhdWx0OiByZXR1cm4oIEJGKCBuZXcgSW50ZWdlcihhVmFsdWUpICkgKTsKKwkJfQorCX0KKworCWlubGluZSBzdGF0aWMgQkYgbmV3VUludGVnZXIoYXZtX3VpbnRlZ2VyX3QgYVZhbHVlKQorCXsKKwkJc3dpdGNoKCBhVmFsdWUgKQorCQl7CisJCQljYXNlICAwOiByZXR1cm4oIEV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9aRVJPICk7CisKKwkJCWNhc2UgIDE6IHJldHVybiggRXhwcmVzc2lvbkNvbnN0YW50OjpJTlRFR0VSX09ORSApOworCQkJY2FzZSAgMjogcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfVFdPICk7CisKKwkJCWRlZmF1bHQ6IHJldHVybiggQkYoIG5ldyBJbnRlZ2VyKGFWYWx1ZSkgKSApOworCQl9CisJfQorCisJaW5saW5lIHN0YXRpYyBCRiBuZXdJbnRlZ2VyKGNvbnN0IHN0ZDo6c3RyaW5nICYgYVZhbHVlKQorCXsKKwkJcmV0dXJuKCBCRiggbmV3IEludGVnZXIoYVZhbHVlKSApICk7CisJfQorCisKKyNpZiBkZWZpbmVkKCBfQVZNX0JVSUxUSU5fTlVNRVJJQ19CT09TVF8gKQorCisJaW5saW5lIHN0YXRpYyBCRiBuZXdJbnRlZ2VyKGNvbnN0IEludGVnZXI6OlJhd1ZhbHVlVHlwZSAmIGFWYWx1ZSkKKwl7CisJCXJldHVybiggQkYoIG5ldyBJbnRlZ2VyKGFWYWx1ZSkgKSApOworCX0KKworI2VuZGlmIC8qIF9BVk1fQlVJTFRJTl9OVU1FUklDX0dNUF8gKi8KKworCisjaWYgZGVmaW5lZCggX0FWTV9CVUlMVElOX05VTUVSSUNfR01QXyApCisKKwlpbmxpbmUgc3RhdGljIEJGIG5ld0ludGVnZXIoY29uc3QgbXB6X3QgJiBhVmFsdWUpCisJeworCQlyZXR1cm4oIEJGKCBuZXcgSW50ZWdlcihhVmFsdWUpICkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIEJGIG5ld0ludGVnZXIoY29uc3QgSW50ZWdlcjo6UmF3VmFsdWVUeXBlICYgYVZhbHVlKQorCXsKKwkJcmV0dXJuKCBCRiggbmV3IEludGVnZXIoYVZhbHVlKSApICk7CisJfQorCisjZW5kaWYgLyogX0FWTV9CVUlMVElOX05VTUVSSUNfR01QXyAqLworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gREVGQVVMVCBORVcgUkFUSU9OQUwgVkFMVUUKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlpbmxpbmUgc3RhdGljIEJGIG5ld1JhdGlvbmFsKFJhdGlvbmFsICogYVZhbHVlKQorCXsKKwkJcmV0dXJuKCBCRiggYVZhbHVlICkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIEJGIG5ld1JhdGlvbmFsKGF2bV9pbnRlZ2VyX3QgYU51bWVyKQorCXsKKwkJcmV0dXJuKCBCRiggbmV3IFJhdGlvbmFsKGFOdW1lcikgKSApOworCX0KKworCWlubGluZSBzdGF0aWMgQkYgbmV3VVJhdGlvbmFsKGF2bV91aW50ZWdlcl90IGFOdW1lcikKKwl7CisJCXJldHVybiggQkYoIG5ldyBSYXRpb25hbChhTnVtZXIpICkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIEJGIG5ld1JhdGlvbmFsKGF2bV9pbnRlZ2VyX3QgYU51bWVyLCBhdm1faW50ZWdlcl90IGFEZW5vbSkKKwl7CisJCWlmKCBhRGVub20gIT0gMCApCisJCXsKKwkJCXJldHVybiggKGFOdW1lciA9PSAwKSA/IEV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9aRVJPIDoKKwkJCQkJQkYoIG5ldyBSYXRpb25hbChhTnVtZXIsIGFEZW5vbSkgKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJPDwgImZhaWw6PiBuZXdSYXRpb25hbDwgIgorCQkJCQk8PCBhTnVtZXIgPDwgIiAvICIgPDwgYURlbm9tIDw8ICIgPiAhISEiCisJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKKwkJfQorCX0KKworCWlubGluZSBzdGF0aWMgQkYgbmV3UmF0aW9uYWwoYXZtX2ludGVnZXJfdCBhTnVtZXIsIGF2bV91aW50ZWdlcl90IGFEZW5vbSkKKwl7CisJCWlmKCBhRGVub20gIT0gMCApCisJCXsKKwkJCXJldHVybiggKGFOdW1lciA9PSAwKSA/IEV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9aRVJPIDoKKwkJCQkJQkYoIG5ldyBSYXRpb25hbChhTnVtZXIsIGFEZW5vbSkgKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJPDwgImZhaWw6PiBuZXdSYXRpb25hbDwgIgorCQkJCQk8PCBhTnVtZXIgPDwgIiAvICIgPDwgYURlbm9tIDw8ICIgPiAhISEiCisJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKKwkJfQorCX0KKworCWlubGluZSBzdGF0aWMgQkYgbmV3VVJhdGlvbmFsKGF2bV91aW50ZWdlcl90IGFOdW1lciwgYXZtX3VpbnRlZ2VyX3QgYURlbm9tKQorCXsKKwkJaWYoIGFEZW5vbSAhPSAwICkKKwkJeworCQkJcmV0dXJuKCAoYU51bWVyID09IDApID8gRXhwcmVzc2lvbkNvbnN0YW50OjpJTlRFR0VSX1pFUk8gOgorCQkJCQlCRiggbmV3IFJhdGlvbmFsKGFOdW1lciwgYURlbm9tKSApICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQk8PCAiZmFpbDo+IG5ld1JhdGlvbmFsPCAiCisJCQkJCTw8IGFOdW1lciA8PCAiIC8gIiA8PCBhRGVub20gPDwgIiA+ICEhISIKKwkJCQkJPDwgU0VORF9FWElUOworCisJCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCQl9CisJfQorCisJaW5saW5lIHN0YXRpYyBCRiBuZXdSYXRpb25hbChjb25zdCBzdGQ6OnN0cmluZyAmIGFWYWx1ZSkKKwl7CisJCXJldHVybiggQkYoIG5ldyBSYXRpb25hbChhVmFsdWUpICkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIEJGIG5ld1JhdGlvbmFsKAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBzdHJOdW1lciwgY29uc3Qgc3RkOjpzdHJpbmcgJiBzdHJEZW5vbSkKKwl7CisJCXJldHVybiggQkYoIG5ldyBSYXRpb25hbChzdHJOdW1lciwgc3RyRGVub20pICkgKTsKKwl9CisKKworI2lmIGRlZmluZWQoIF9BVk1fQlVJTFRJTl9OVU1FUklDX0JPT1NUXyApCisKKwlpbmxpbmUgc3RhdGljIEJGIG5ld1JhdGlvbmFsKAorCQkJY29uc3QgSW50ZWdlcjo6UmF3VmFsdWVUeXBlICYgYU51bWVyLAorCQkJY29uc3QgSW50ZWdlcjo6UmF3VmFsdWVUeXBlICYgYURlbm9tKQorCXsKKwkJcmV0dXJuKCBCRiggbmV3IFJhdGlvbmFsKGFOdW1lciwgYURlbm9tKSApICk7CisJfQorCisjZW5kaWYgLyogX0FWTV9CVUlMVElOX05VTUVSSUNfR01QXyAqLworCisKKyNpZiBkZWZpbmVkKCBfQVZNX0JVSUxUSU5fTlVNRVJJQ19HTVBfICkKKworCWlubGluZSBzdGF0aWMgQkYgbmV3UmF0aW9uYWwoY29uc3QgbXB6X3QgJiBhTnVtZXIsIGNvbnN0IG1wel90ICYgYURlbm9tKQorCXsKKwkJcmV0dXJuKCBCRiggbmV3IFJhdGlvbmFsKGFOdW1lciwgYURlbm9tKSApICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBCRiBuZXdSYXRpb25hbCgKKwkJCWNvbnN0IEludGVnZXI6OlJhd1ZhbHVlVHlwZSAmIGFOdW1lciwKKwkJCWNvbnN0IEludGVnZXI6OlJhd1ZhbHVlVHlwZSAmIGFEZW5vbSkKKwl7CisJCXJldHVybiggQkYoIG5ldyBSYXRpb25hbChhTnVtZXIsIGFEZW5vbSkgKSApOworCX0KKworCisJaW5saW5lIHN0YXRpYyBCRiBuZXdSYXRpb25hbChjb25zdCBtcHFfdCAmIGFWYWx1ZSkKKwl7CisJCXJldHVybiggQkYoIG5ldyBSYXRpb25hbCggYVZhbHVlICkgKSApOworCX0KKworI2VuZGlmIC8qIF9BVk1fQlVJTFRJTl9OVU1FUklDX0dNUF8gKi8KKworCWlubGluZSBzdGF0aWMgQkYgbmV3UmF0aW9uYWwoY29uc3QgUmF0aW9uYWw6OlJhd1ZhbHVlVHlwZSAmIGFWYWx1ZSkKKwl7CisJCXJldHVybiggQkYoIG5ldyBSYXRpb25hbChhVmFsdWUpICkgKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBEZWNpbWFsIC8gVURlY2ltYWwKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlzdGF0aWMgQkYgbmV3RGVjaW1hbChjb25zdCBzdGQ6OnN0cmluZyAmIGFWYWx1ZSwgY2hhciBzZXAgPSAnLicpOworCisJc3RhdGljIEJGIG5ld1VEZWNpbWFsKGNvbnN0IHN0ZDo6c3RyaW5nICYgYVZhbHVlLCBjaGFyIHNlcCA9ICcuJyk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBERUZBVUxUIE5FVyBGTE9BVCBWQUxVRQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlubGluZSBzdGF0aWMgQkYgbmV3RmxvYXQoRmxvYXQgKiBhVmFsdWUpCisJeworCQlyZXR1cm4oIEJGKCBhVmFsdWUgKSApOworCX0KKworCWlubGluZSBzdGF0aWMgQkYgbmV3RmxvYXQoYXZtX2ludGVnZXJfdCBhVmFsdWUpCisJeworCQlyZXR1cm4oIEJGKCBuZXcgRmxvYXQoc3RhdGljX2Nhc3Q8IGF2bV9mbG9hdF90ID4oYVZhbHVlKSkgKSApOworCX0KKworCWlubGluZSBzdGF0aWMgQkYgbmV3VUZsb2F0KGF2bV91aW50ZWdlcl90IGFWYWx1ZSkKKwl7CisJCXJldHVybiggQkYoIG5ldyBGbG9hdChzdGF0aWNfY2FzdDwgYXZtX2Zsb2F0X3QgPihhVmFsdWUpKSApICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBCRiBuZXdGbG9hdChhdm1fZmxvYXRfdCBhVmFsdWUpCisJeworCQlyZXR1cm4oIEJGKCBuZXcgRmxvYXQoYVZhbHVlKSApICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBCRiBuZXdGbG9hdChjb25zdCBzdGQ6OnN0cmluZyAmIGFWYWx1ZSkKKwl7CisJCXJldHVybiggQkYoIG5ldyBGbG9hdChhVmFsdWUpICkgKTsKKwl9CisKKworI2lmIGRlZmluZWQoIF9BVk1fQlVJTFRJTl9OVU1FUklDX0JPT1NUXyApCisKKwlpbmxpbmUgc3RhdGljIEJGIG5ld0Zsb2F0KGNvbnN0IFJhdGlvbmFsOjpSYXdWYWx1ZVR5cGUgJiBhVmFsdWUpCisJeworCQlyZXR1cm4oIEJGKCBuZXcgRmxvYXQoIEZsb2F0OjpSYXdWYWx1ZVR5cGUoYVZhbHVlKSApICkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIEJGIG5ld0Zsb2F0KGNvbnN0IEZsb2F0OjpSYXdWYWx1ZVR5cGUgJiBhVmFsdWUpCisJeworCQlyZXR1cm4oIEJGKCBuZXcgRmxvYXQoYVZhbHVlKSApICk7CisJfQorCisjZW5kaWYgLyogX0FWTV9CVUlMVElOX05VTUVSSUNfR01QXyAqLworCisKKyNpZiBkZWZpbmVkKCBfQVZNX0JVSUxUSU5fTlVNRVJJQ19HTVBfICkKKworCWlubGluZSBzdGF0aWMgQkYgbmV3RmxvYXQoY29uc3QgbXBxX3QgJiBhVmFsdWUpCisJeworCQlyZXR1cm4oIEJGKCBuZXcgRmxvYXQoIEZsb2F0OjpSYXdWYWx1ZVR5cGUoCisJCQkJUmF0aW9uYWw6OlJhd1ZhbHVlVHlwZShhVmFsdWUpKSApICkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIEJGIG5ld0Zsb2F0KGNvbnN0IFJhdGlvbmFsOjpSYXdWYWx1ZVR5cGUgJiBhVmFsdWUpCisJeworCQlyZXR1cm4oIEJGKCBuZXcgRmxvYXQoIEZsb2F0OjpSYXdWYWx1ZVR5cGUoYVZhbHVlKSApICkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIEJGIG5ld0Zsb2F0KGNvbnN0IG1wZl90ICYgYVZhbHVlKQorCXsKKwkJcmV0dXJuKCBCRiggbmV3IEZsb2F0KCBGbG9hdDo6UmF3VmFsdWVUeXBlKGFWYWx1ZSkgKSApICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBCRiBuZXdGbG9hdChjb25zdCBGbG9hdDo6UmF3VmFsdWVUeXBlICYgYVZhbHVlKQorCXsKKwkJcmV0dXJuKCBCRiggbmV3IEZsb2F0KGFWYWx1ZSkgKSApOworCX0KKworI2VuZGlmIC8qIF9BVk1fQlVJTFRJTl9OVU1FUklDX0dNUF8gKi8KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIERFRkFVTFQgTkVXIE5VTUVSSUMgVkFMVUUKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlpbmxpbmUgc3RhdGljIEJGIG5ld051bWVyaWMoY29uc3QgTnVtZXJpYyAmIGFOdW1lcmljKQorCXsKKwkJcmV0dXJuKCBCRiggYU51bWVyaWMgKSApOworCX0KKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBDaGFyIC8gU3RyaW5nIC8gSWRlbnRpZmllciAvIFF1YWxpZmllZElkZW50aWZpZXIKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlpbmxpbmUgc3RhdGljIEJGIG5ld0NoYXIoQ2hhcmFjdGVyICogYVZhbHVlKQorCXsKKwkJcmV0dXJuKCBCRiggYVZhbHVlICkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIEJGIG5ld0NoYXIoY2hhciBhVmFsdWUgPSAnICcpCisJeworCQlyZXR1cm4oIEJGKCBuZXcgQ2hhcmFjdGVyKGFWYWx1ZSkgKSApOworCX0KKworCWlubGluZSBzdGF0aWMgQkYgbmV3Q2hhcihjb25zdCBzdGQ6OnN0cmluZyAmIGFWYWx1ZSkKKwl7CisJCXJldHVybiggQkYoIG5ldyBDaGFyYWN0ZXIoYVZhbHVlLmF0KDApKSApICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBCRiBuZXdTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJiBhVmFsdWUgPSAiIiwKKwkJCWNoYXIgYVF1b3RlID0gU3RyaW5nOjpERUZBVUxUX0RFTElNSVRFUikKKwl7CisJCXJldHVybiggU3RyaW5nOjpjcmVhdGUoYVZhbHVlLCBhUXVvdGUpICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBCRiBuZXdTaW5nbGVRdW90ZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmIGFWYWx1ZSA9ICIiLAorCQkJY2hhciBhUXVvdGUgPSBTdHJpbmc6OlNJTkdMRV9RVU9URV9ERUxJTUlURVIpCisJeworCQlyZXR1cm4oIFN0cmluZzo6Y3JlYXRlKGFWYWx1ZSwgYVF1b3RlKSApOworCX0KKworCWlubGluZSBzdGF0aWMgQkYgbmV3RG91YmxlUXVvdGVTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJiBhVmFsdWUgPSAiIiwKKwkJCWNoYXIgYVF1b3RlID0gU3RyaW5nOjpET1VCTEVfUVVPVEVfREVMSU1JVEVSKQorCXsKKwkJcmV0dXJuKCBTdHJpbmc6OmNyZWF0ZShhVmFsdWUsIGFRdW90ZSkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIEJGIG5ld0lkZW50aWZpZXIoY29uc3Qgc3RkOjpzdHJpbmcgJiBhVmFsdWUgPSAiIikKKwl7CisJCXJldHVybiggQkYoIG5ldyBJZGVudGlmaWVyKGFWYWx1ZSkgKSApOworCX0KKworCWlubGluZSBzdGF0aWMgQkYgbmV3UXVhbGlmaWVkSWRlbnRpZmllcihjb25zdCBzdGQ6OnN0cmluZyAmIGFWYWx1ZSA9ICIiKQorCXsKKwkJcmV0dXJuKCBCRiggbmV3IFF1YWxpZmllZElkZW50aWZpZXIoYVZhbHVlKSApICk7CisJfQorCisJLy8gbmV3IGluc3RhbmNlIG9mIEVsZW1lbnQgQWNjZXNzIEZRTi1JRCA6PiBtYWNoaW5lPGZxbj4uZWxlbWVudDxuYW1lLWlkPgorCXN0YXRpYyBCRiBuZXdRdWFsaWZpZWRJZGVudGlmaWVyKAorCQkJTWFjaGluZSAqIG1hY2hpbmUsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCk7CisKKwlzdGF0aWMgQkYgbmV3UXVhbGlmaWVkSWRlbnRpZmllcihNYWNoaW5lICogbWFjaGluZSwKKwkJCWNvbnN0IE9iamVjdEVsZW1lbnQgKiBvYmpFbGVtZW50KTsKKworCXN0YXRpYyBCRiBuZXdRdWFsaWZpZWRQb3NpdGlvbmFsSWRlbnRpZmllcigKKwkJCU1hY2hpbmUgKiBtYWNoaW5lLCBhdm1fb2Zmc2V0X3QgYVBvc2l0aW9uT2Zmc2V0ICk7CisKKworCWlubGluZSBzdGF0aWMgQkYgbmV3TWFjaGluZVZhclVGSSgKKwkJCWNvbnN0IEJGICYgYU1hY2hpbmUsIGNvbnN0IEJGICYgYVZhcmlhYmxlKQorCXsKKwkJVW5pRm9ybUlkZW50aWZpZXIgKiBhblVGSSA9IG5ldyBVbmlGb3JtSWRlbnRpZmllcihmYWxzZSk7CisJCWFuVUZJLT5hcHBlbmRGaWVsZE1hY2hpbmUoIGFNYWNoaW5lICk7CisJCWFuVUZJLT5hcHBlbmRGaWVsZFZhcmlhYmxlKCBhVmFyaWFibGUgKTsKKworCQlyZXR1cm4oIEJGKCBhblVGSSApICk7CisJfQorCisKKwkvKioKKwkgKiBTUEVDSUZJQyBOVU1FUklDIEVYUFJFU1NJT04KKwkgKi8KKwlpbmxpbmUgc3RhdGljIEJGIG5ld0V4cHIoYm9vbCBhVmFsdWUpCisJeworCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3RvckltcGw8CisJCQkJREVGQVVMVF9FWFBSRVNTSU9OX0lNUEwgPjo6bmV3RXhwciggYVZhbHVlICkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIEJGIG5ld0V4cHIoYXZtX2ludGVnZXJfdCBhVmFsdWUpCisJeworCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3RvckltcGw8CisJCQkJREVGQVVMVF9FWFBSRVNTSU9OX0lNUEwgPjo6bmV3RXhwciggYVZhbHVlICkgKTsKKwl9CisKKworCWlubGluZSBzdGF0aWMgQkYgbmV3RXhwcihhdm1faW50ZWdlcl90ICBhTnVtZXIsIGF2bV9pbnRlZ2VyX3QgIGFEZW5vbSkKKwl7CisJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9ySW1wbDwKKwkJCQlERUZBVUxUX0VYUFJFU1NJT05fSU1QTCA+OjpuZXdFeHByKCBhTnVtZXIsIGFEZW5vbSApICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBCRiBuZXdFeHByKGF2bV9pbnRlZ2VyX3QgYU51bWVyLCBhdm1fdWludGVnZXJfdCBhRGVub20pCisJeworCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3RvckltcGw8CisJCQkJREVGQVVMVF9FWFBSRVNTSU9OX0lNUEwgPjo6bmV3RXhwciggYU51bWVyLCBhRGVub20gKSApOworCX0KKworCWlubGluZSBzdGF0aWMgQkYgbmV3RXhwcihhdm1fdWludGVnZXJfdCBhTnVtZXIsIGF2bV91aW50ZWdlcl90IGFEZW5vbSkKKwl7CisJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9ySW1wbDwKKwkJCQlERUZBVUxUX0VYUFJFU1NJT05fSU1QTCA+OjpuZXdFeHByKCBhTnVtZXIsIGFEZW5vbSApICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBCRiBuZXdFeHByKAorCQkJY29uc3QgSW50ZWdlciAmIGFOdW1lciwgY29uc3QgSW50ZWdlciAmIGFEZW5vbSkKKwl7CisJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9ySW1wbDwKKwkJCQlERUZBVUxUX0VYUFJFU1NJT05fSU1QTCA+OjpuZXdFeHByKCBhTnVtZXIsIGFEZW5vbSApICk7CisJfQorCisKKwlpbmxpbmUgc3RhdGljIEJGIG5ld0V4cHIoZmxvYXQgYVZhbHVlKQorCXsKKwkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3JJbXBsPAorCQkJCURFRkFVTFRfRVhQUkVTU0lPTl9JTVBMID46Om5ld0V4cHIoIGFWYWx1ZSApICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBCRiBuZXdFeHByKGRvdWJsZSBhVmFsdWUpCisJeworCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3RvckltcGw8CisJCQkJREVGQVVMVF9FWFBSRVNTSU9OX0lNUEwgPjo6bmV3RXhwciggYVZhbHVlICkgKTsKKwl9CisKKworCS8qKgorCSAqIFNQRUNJRklDIFNUUklORyBWQUxVRSBhcyBCVUlMVElOIEVYUFJFU1NJT04KKwkgKi8KKwlpbmxpbmUgc3RhdGljIEJGIG5ld0V4cHJCb29sZWFuKGNvbnN0IHN0ZDo6c3RyaW5nICYgYVZhbHVlKQorCXsKKwkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3JJbXBsPAorCQkJCURFRkFVTFRfRVhQUkVTU0lPTl9JTVBMID46Om5ld0Jvb2xlYW4oIGFWYWx1ZSApICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBCRiBuZXdFeHByQm9vbGVhbihjb25zdCBjaGFyICogYVZhbHVlKQorCXsKKwkJcmV0dXJuKCAoYVZhbHVlICE9IE5VTEwpCisJCQkJPyBFeHByZXNzaW9uQ29uc3RydWN0b3JJbXBsPCBERUZBVUxUX0VYUFJFU1NJT05fSU1QTCA+OjoKKwkJCQkJCW5ld0Jvb2xlYW4oIHN0ZDo6c3RyaW5nKGFWYWx1ZSkgKQorCQkJCTogRXhwcmVzc2lvbkNvbnN0cnVjdG9ySW1wbDwgREVGQVVMVF9FWFBSRVNTSU9OX0lNUEwgPjo6CisJCQkJCQluZXdCb29sZWFuKCBmYWxzZSApICk7CisJfQorCisKKwlpbmxpbmUgc3RhdGljIEJGIG5ld0V4cHJJbnRlZ2VyKGNvbnN0IHN0ZDo6c3RyaW5nICYgYVZhbHVlKQorCXsKKwkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3JJbXBsPAorCQkJCURFRkFVTFRfRVhQUkVTU0lPTl9JTVBMID46Om5ld0ludGVnZXIoIGFWYWx1ZSApICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBCRiBuZXdFeHBySW50ZWdlcihjb25zdCBjaGFyICogYVZhbHVlKQorCXsKKwkJcmV0dXJuKCAoYVZhbHVlICE9IE5VTEwpCisJCQkJPyBFeHByZXNzaW9uQ29uc3RydWN0b3JJbXBsPCBERUZBVUxUX0VYUFJFU1NJT05fSU1QTCA+OjoKKwkJCQkJCW5ld0ludGVnZXIoIHN0ZDo6c3RyaW5nKGFWYWx1ZSkgKQorCQkJCTogRXhwcmVzc2lvbkNvbnN0cnVjdG9ySW1wbDwgREVGQVVMVF9FWFBSRVNTSU9OX0lNUEwgPjo6CisJCQkJCQluZXdJbnRlZ2VyKCAwICkgKTsKKwl9CisKKworCWlubGluZSBzdGF0aWMgQkYgbmV3RXhwclJhdGlvbmFsKGNvbnN0IHN0ZDo6c3RyaW5nICYgYVZhbHVlKQorCXsKKwkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3JJbXBsPAorCQkJCURFRkFVTFRfRVhQUkVTU0lPTl9JTVBMID46Om5ld1JhdGlvbmFsKCBhVmFsdWUgKSApOworCX0KKworCWlubGluZSBzdGF0aWMgQkYgbmV3RXhwclJhdGlvbmFsKGNvbnN0IGNoYXIgKiBhVmFsdWUpCisJeworCQlyZXR1cm4oIChhVmFsdWUgIT0gTlVMTCkKKwkJCQk/IEV4cHJlc3Npb25Db25zdHJ1Y3RvckltcGw8IERFRkFVTFRfRVhQUkVTU0lPTl9JTVBMID46OgorCQkJCQkJbmV3UmF0aW9uYWwoIHN0ZDo6c3RyaW5nKGFWYWx1ZSkgKQorCQkJCTogRXhwcmVzc2lvbkNvbnN0cnVjdG9ySW1wbDwgREVGQVVMVF9FWFBSRVNTSU9OX0lNUEwgPjo6CisJCQkJCQluZXdSYXRpb25hbCggMCApICk7CisJfQorCisKKwlpbmxpbmUgc3RhdGljIEJGIG5ld0V4cHJGbG9hdChjb25zdCBzdGQ6OnN0cmluZyAmIGFWYWx1ZSkKKwl7CisJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9ySW1wbDwKKwkJCQlERUZBVUxUX0VYUFJFU1NJT05fSU1QTCA+OjpuZXdGbG9hdCggYVZhbHVlICkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIEJGIG5ld0V4cHJGbG9hdChjb25zdCBjaGFyICogYVZhbHVlKQorCXsKKwkJcmV0dXJuKCAoYVZhbHVlICE9IE5VTEwpCisJCQkJPyBFeHByZXNzaW9uQ29uc3RydWN0b3JJbXBsPCBERUZBVUxUX0VYUFJFU1NJT05fSU1QTCA+OjoKKwkJCQkJCW5ld0Zsb2F0KCBzdGQ6OnN0cmluZyhhVmFsdWUpICkKKwkJCQk6IEV4cHJlc3Npb25Db25zdHJ1Y3RvckltcGw8IERFRkFVTFRfRVhQUkVTU0lPTl9JTVBMID46OgorCQkJCQkJbmV3RmxvYXQoIDAuMCApICk7CisJfQorCisKKwlpbmxpbmUgc3RhdGljIEJGIG5ld0V4cHJOdW1iZXIoY29uc3Qgc3RkOjpzdHJpbmcgJiBhVmFsdWUpCisJeworCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3RvckltcGw8CisJCQkJREVGQVVMVF9FWFBSRVNTSU9OX0lNUEwgPjo6bmV3RXhwck51bWJlciggYVZhbHVlICkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIEJGIG5ld0V4cHJOdW1iZXIoY29uc3QgY2hhciAqIGFWYWx1ZSkKKwl7CisJCXJldHVybiggKGFWYWx1ZSAhPSBOVUxMKQorCQkJCT8gRXhwcmVzc2lvbkNvbnN0cnVjdG9ySW1wbDwgREVGQVVMVF9FWFBSRVNTSU9OX0lNUEwgPjo6CisJCQkJCQluZXdFeHByTnVtYmVyKCBzdGQ6OnN0cmluZyhhVmFsdWUpICkKKwkJCQk6IEV4cHJlc3Npb25Db25zdHJ1Y3RvckltcGw8IERFRkFVTFRfRVhQUkVTU0lPTl9JTVBMID46OgorCQkJCQkJbmV3SW50ZWdlciggMCApICk7CisJfQorCisKKwlzdGF0aWMgQkYgbmV3RXhwck1hY2hpbmUoY29uc3QgQ29uZmlndXJhdGlvbiAmIGFDb25maWd1cmF0aW9uLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhVmFsdWUpOworCisJc3RhdGljIEJGIG5ld0V4cHJSdW50aW5lKGNvbnN0IENvbmZpZ3VyYXRpb24gJiBhQ29uZmlndXJhdGlvbiwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVZhbHVlKTsKKworCisJLyoqCisJICogU1BFQ0lGSUMgVFlQRUQgU1RSSU5HIFZBTFVFIGFzIEJVSUxUSU4gRVhQUkVTU0lPTgorCSAqLworCXN0YXRpYyBCRiBuZXdFeHByKGNvbnN0IENvbmZpZ3VyYXRpb24gJiBhQ29uZmlndXJhdGlvbiwKKwkJCWNvbnN0IElUeXBlU3BlY2lmaWVyICYgYVR5cGVTcGVjaWZpZXIsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYVZhbHVlKTsKKworCisJLyoqCisJICogU1BFQ0lGSUMgQVZNQ09ERSBFWFBSRVNTSU9OCisJICovCisJaW5saW5lIHN0YXRpYyBCRiBuZXdFeHByKGNvbnN0IEJGICYgYW5FbGVtZW50KQorCXsKKwkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3JJbXBsPAorCQkJCURFRkFVTFRfRVhQUkVTU0lPTl9JTVBMID46Om5ld0V4cHIoIGFuRWxlbWVudCApICk7CisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gUVVBTlRJRklFUiBFWFBSRVNTSU9OCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJc3RhdGljIEJGIGV4aXN0RXhwcihjb25zdCBCRiAmIGJvdW5kVmFyLCBjb25zdCBCRiAmIGZvcm11bGEpCisJeworCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3RvckltcGw8CisJCQkJREVGQVVMVF9FWFBSRVNTSU9OX0lNUEwgPjo6ZXhpc3RFeHByKCBib3VuZFZhciwgZm9ybXVsYSApICk7CisJfQorCisJc3RhdGljIEJGIGV4aXN0RXhwcihjb25zdCBBdm1Db2RlOjp0aGlzX2NvbnRhaW5lcl90eXBlICYgbGlzdE9mQXJnKQorCXsKKwkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3JJbXBsPAorCQkJCURFRkFVTFRfRVhQUkVTU0lPTl9JTVBMID46OmV4aXN0RXhwciggbGlzdE9mQXJnICkgKTsKKwl9CisKKworCXN0YXRpYyBCRiBmb3JhbGxFeHByKGNvbnN0IEJGICYgYm91bmRWYXIsIGNvbnN0IEJGICYgZm9ybXVsYSkKKwl7CisJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9ySW1wbDwKKwkJCQlERUZBVUxUX0VYUFJFU1NJT05fSU1QTCA+Ojpmb3JhbGxFeHByKCBib3VuZFZhciwgZm9ybXVsYSApICk7CisJfQorCisJc3RhdGljIEJGIGZvcmFsbEV4cHIoY29uc3QgQXZtQ29kZTo6dGhpc19jb250YWluZXJfdHlwZSAmIGxpc3RPZkFyZykKKwl7CisJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9ySW1wbDwKKwkJCQlERUZBVUxUX0VYUFJFU1NJT05fSU1QTCA+Ojpmb3JhbGxFeHByKCBsaXN0T2ZBcmcgKSApOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIEFORCBFWFBSRVNTSU9OCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJaW5saW5lIHN0YXRpYyBCRiBhbmRFeHByKGNvbnN0IEJGICYgYXJnMCwgY29uc3QgQkYgJiBhcmcxKQorCXsKKwkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3JJbXBsPAorCQkJCURFRkFVTFRfRVhQUkVTU0lPTl9JTVBMID46OmFuZEV4cHIoIGFyZzAsIGFyZzEgKSApOworCX0KKworCWlubGluZSBzdGF0aWMgQkYgYW5kRXhwcihjb25zdCBBdm1Db2RlOjp0aGlzX2NvbnRhaW5lcl90eXBlICYgbGlzdE9mQXJnKQorCXsKKwkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3JJbXBsPAorCQkJCURFRkFVTFRfRVhQUkVTU0lPTl9JTVBMID46OmFuZEV4cHIoIGxpc3RPZkFyZyApICk7CisJfQorCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIE9SIEVYUFJFU1NJT04KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlpbmxpbmUgc3RhdGljIEJGIG9yRXhwcihjb25zdCBCRiAmIGFyZzAsIGNvbnN0IEJGICYgYXJnMSkKKwl7CisJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9ySW1wbDwKKwkJCQlERUZBVUxUX0VYUFJFU1NJT05fSU1QTCA+OjpvckV4cHIoIGFyZzAsIGFyZzEgKSApOworCX0KKworCWlubGluZSBzdGF0aWMgQkYgb3JFeHByKGNvbnN0IEF2bUNvZGU6OnRoaXNfY29udGFpbmVyX3R5cGUgJiBsaXN0T2ZBcmcpCisJeworCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3RvckltcGw8CisJCQkJREVGQVVMVF9FWFBSRVNTSU9OX0lNUEwgPjo6b3JFeHByKCBsaXN0T2ZBcmcgKSApOworCX0KKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBOT1QgRVhQUkVTU0lPTgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlubGluZSBzdGF0aWMgQkYgbm90RXhwcihjb25zdCBCRiAmIGFyZykKKwl7CisJCWlmKCBhcmcuaXNFcXVhbFRydWUoKSApCisJCXsKKwkJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX0ZBTFNFICk7CisKKy8vCQkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3JJbXBsPAorLy8JCQkJCURFRkFVTFRfRVhQUkVTU0lPTl9JTVBMID46Om5ld0V4cHIoIGZhbHNlICkgKTsKKwkJfQorCQllbHNlIGlmKCBhcmcuaXNFcXVhbEZhbHNlKCkgKQorCQl7CisJCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9UUlVFICk7CisKKy8vCQkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3JJbXBsPAorLy8JCQkJCURFRkFVTFRfRVhQUkVTU0lPTl9JTVBMID46Om5ld0V4cHIoIHRydWUgKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3JJbXBsPAorCQkJCQlERUZBVUxUX0VYUFJFU1NJT05fSU1QTCA+Ojpub3RFeHByKCBhcmcgKSApOworCQl9CisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gWyBOT1QgXSBFUVVBTCBFWFBSRVNTSU9OCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJaW5saW5lIHN0YXRpYyBCRiBlcUV4cHIoY29uc3QgQkYgJiBhcmcwLCBjb25zdCBCRiAmIGFyZzEpCisJeworCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3RvckltcGw8CisJCQkJREVGQVVMVF9FWFBSRVNTSU9OX0lNUEwgPjo6ZXFFeHByKCBhcmcwLCBhcmcxICkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIEJGIG5lcUV4cHIoY29uc3QgQkYgJiBhcmcwLCBjb25zdCBCRiAmIGFyZzEpCisJeworCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3RvckltcGw8CisJCQkJREVGQVVMVF9FWFBSRVNTSU9OX0lNUEwgPjo6bmVxRXhwciggYXJnMCwgYXJnMSApICk7CisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gWyBOT1QgXSBTWU5UQVhJQyBFUVVBTCBFWFBSRVNTSU9OCisJLy8gRk9SIEFMTCBFWFBSRVNTSU9OIElNUExFTUVOVEFUSU9OCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJaW5saW5lIHN0YXRpYyBCRiBzZXFFeHByKGNvbnN0IEJGICYgYXJnMCwgY29uc3QgQkYgJiBhcmcxKQorCXsKKwkJcmV0dXJuKCBuZXdDb2RlKE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU0VRLCBhcmcwLCBhcmcxKSApOworCX0KKworCWlubGluZSBzdGF0aWMgQkYgbnNlcUV4cHIoY29uc3QgQkYgJiBhcmcwLCBjb25zdCBCRiAmIGFyZzEpCisJeworCQlyZXR1cm4oIG5ld0NvZGUoT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9OU0VRLCBhcmcwLCBhcmcxKSApOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIENPTVBBUkUgRVhQUkVTU0lPTgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlubGluZSBzdGF0aWMgQkYgZ3RFeHByKGNvbnN0IEJGICYgYXJnMCwgY29uc3QgQkYgJiBhcmcxKQorCXsKKwkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3JJbXBsPAorCQkJCURFRkFVTFRfRVhQUkVTU0lPTl9JTVBMID46Omd0RXhwciggYXJnMCwgYXJnMSApICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBCRiBndGVFeHByKGNvbnN0IEJGICYgYXJnMCwgY29uc3QgQkYgJiBhcmcxKQorCXsKKwkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3JJbXBsPAorCQkJCURFRkFVTFRfRVhQUkVTU0lPTl9JTVBMID46Omd0ZUV4cHIoIGFyZzAsIGFyZzEgKSApOworCX0KKworCWlubGluZSBzdGF0aWMgQkYgbHRFeHByKGNvbnN0IEJGICYgYXJnMCwgY29uc3QgQkYgJiBhcmcxKQorCXsKKwkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3JJbXBsPAorCQkJCURFRkFVTFRfRVhQUkVTU0lPTl9JTVBMID46Omx0RXhwciggYXJnMCwgYXJnMSApICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBCRiBsdGVFeHByKGNvbnN0IEJGICYgYXJnMCwgY29uc3QgQkYgJiBhcmcxKQorCXsKKwkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3JJbXBsPAorCQkJCURFRkFVTFRfRVhQUkVTU0lPTl9JTVBMID46Omx0ZUV4cHIoIGFyZzAsIGFyZzEgKSApOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIEFERCBFWFBSRVNTSU9OCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJc3RhdGljIEJGIGFkZEV4cHIoY29uc3QgQkYgJiBhcmcsIGF2bV9pbnRlZ2VyX3QgdmFsKTsKKworCWlubGluZSBzdGF0aWMgQkYgYWRkRXhwcihjb25zdCBCRiAmIGFyZzAsIGNvbnN0IEJGICYgYXJnMSkKKwl7CisJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9ySW1wbDwKKwkJCQlERUZBVUxUX0VYUFJFU1NJT05fSU1QTCA+OjphZGRFeHByKCBhcmcwLCBhcmcxICkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIEJGIGFkZEV4cHIoY29uc3QgQXZtQ29kZTo6dGhpc19jb250YWluZXJfdHlwZSAmIGxpc3RPZkFyZykKKwl7CisJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9ySW1wbDwKKwkJCQlERUZBVUxUX0VYUFJFU1NJT05fSU1QTCA+OjphZGRFeHByKCBsaXN0T2ZBcmcgKSApOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFVNSU5VUyBFWFBSRVNTSU9OCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJaW5saW5lIHN0YXRpYyBCRiB1bWludXNFeHByKGNvbnN0IEJGICYgYXJnKQorCXsKKwkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3JJbXBsPAorCQkJCURFRkFVTFRfRVhQUkVTU0lPTl9JTVBMID46OnVtaW51c0V4cHIoIGFyZyApICk7CisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gTUlOVVMgRVhQUkVTU0lPTgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlubGluZSBzdGF0aWMgQkYgbWludXNFeHByKGNvbnN0IEJGICYgYXJnMCwgY29uc3QgQkYgJiBhcmcxKQorCXsKKwkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3JJbXBsPAorCQkJCURFRkFVTFRfRVhQUkVTU0lPTl9JTVBMID46Om1pbnVzRXhwciggYXJnMCwgYXJnMSApICk7CisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gTVVMVCBFWFBSRVNTSU9OCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJaW5saW5lIHN0YXRpYyBCRiBtdWx0RXhwcihjb25zdCBCRiAmIGFyZzAsIGNvbnN0IEJGICYgYXJnMSkKKwl7CisJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9ySW1wbDwKKwkJCQlERUZBVUxUX0VYUFJFU1NJT05fSU1QTCA+OjptdWx0RXhwciggYXJnMCwgYXJnMSApICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBCRiBtdWx0RXhwcihjb25zdCBBdm1Db2RlOjp0aGlzX2NvbnRhaW5lcl90eXBlICYgbGlzdE9mQXJnKQorCXsKKwkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3JJbXBsPAorCQkJCURFRkFVTFRfRVhQUkVTU0lPTl9JTVBMID46Om11bHRFeHByKCBsaXN0T2ZBcmcgKSApOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFBPVyBFWFBSRVNTSU9OCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJaW5saW5lIHN0YXRpYyBCRiBwb3dFeHByKGNvbnN0IEJGICYgYXJnMCwgY29uc3QgQkYgJiBhcmcxKQorCXsKKwkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3JJbXBsPAorCQkJCURFRkFVTFRfRVhQUkVTU0lPTl9JTVBMID46OnBvd0V4cHIoIGFyZzAsIGFyZzEgKSApOworCX0KKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBESVYgRVhQUkVTU0lPTgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlubGluZSBzdGF0aWMgQkYgZGl2RXhwcihjb25zdCBCRiAmIGFyZzAsIGNvbnN0IEJGICYgYXJnMSkKKwl7CisJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9ySW1wbDwKKwkJCQlERUZBVUxUX0VYUFJFU1NJT05fSU1QTCA+OjpkaXZFeHByKCBhcmcwLCBhcmcxICkgKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBGT1IgQUxMIEVYUFJFU1NJT04gSU1QTEVNRU5UQVRJT04KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlzdGF0aWMgQkYgbmV3RXhwcihPcGVyYXRvciAqIGFuT3BlcmF0b3IsIGNvbnN0IEJGICYgYXJnKTsKKworCXN0YXRpYyBCRiBuZXdFeHByKE9wZXJhdG9yICogYW5PcGVyYXRvciwgY29uc3QgQkYgJiBhcmcxLCBjb25zdCBCRiAmIGFyZzIpOworCisJc3RhdGljIEJGIG5ld0V4cHIoT3BlcmF0b3IgKiBhbk9wZXJhdG9yLAorCQkJY29uc3QgQXZtQ29kZTo6dGhpc19jb250YWluZXJfdHlwZSAmIGxpc3RPZkFyZyk7CisKK307CisKKworfQorCisjZW5kaWYgLyogRVhQUkVTU0lPTkNPTlNUUlVDVE9SX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29uc3RydWN0b3JJbXBsLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25Db25zdHJ1Y3RvckltcGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNTUyZDUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29uc3RydWN0b3JJbXBsLmNwcApAQCAtMCwwICsxLDE0OTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyNiBqdWluIDIwMTMKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkV4cHJlc3Npb25Db25zdHJ1Y3RvckltcGwuaCIKKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25Db25zdGFudC5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25Db25zdHJ1Y3Rvci5oPgorCisjaW5jbHVkZSA8Zm1sL251bWVyaWMvTnVtZXJpYy5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworLyoqCisgKiBTUEVDSUZJQyBBVk1DT0RFIEVYUFJFU1NJT04KKyAqLworc3RhdGljIGJvb2wgYXBwZW5kTG9naWNUZXJtKGNvbnN0IEJGICYgdGVybSwKKwkJQXZtQ29kZTo6dGhpc19jb250YWluZXJfdHlwZSAmIHJlc0FyZ3MpCit7CisJaWYoIHJlc0FyZ3MuZW1wdHkoKSApCisJeworCQlyZXNBcmdzLmFwcGVuZCggdGVybSApOworCX0KKwllbHNlCisJeworCQlBdm1Db2RlICogYUNvZGU7CisKKwkJaW50IGNtcFJlc3VsdDsKKworCQlib29sIGNvZWYxOworCQlCRiBleHByMTsKKworCQlib29sIGNvZWYyID0gdHJ1ZTsKKwkJQkYgZXhwcjIgPSB0ZXJtOworCQlpZiggdGVybS5pczwgQXZtQ29kZSA+KCkgKQorCQl7CisJCQlhQ29kZSA9IHRlcm0udG9fcHRyPCBBdm1Db2RlID4oKTsKKworCQkJaWYoIGFDb2RlLT5pc09wQ29kZShBVk1fT1BDT0RFX05PVCkgKQorCQkJeworCQkJCWNvZWYyID0gZmFsc2U7CisJCQkJZXhwcjIgPSBhQ29kZS0+Zmlyc3QoKTsKKwkJCX0KKwkJfQorCisJCUF2bUNvZGU6Oml0ZXJhdG9yIGl0QXJnID0gcmVzQXJncy5iZWdpbigpOworCQlBdm1Db2RlOjppdGVyYXRvciBlbmRBcmcgPSByZXNBcmdzLmVuZCgpOworCQlmb3IoIDsgaXRBcmcgIT0gZW5kQXJnIDsgKytpdEFyZyApCisJCXsKKwkJCS8vY2FzZSBBICogKDxzaWduPiBCKSArIEMgKyAuLi4gIHdpdGggICg8c2lnbj4gQikKKwkJCWNvZWYxID0gdHJ1ZTsKKwkJCWV4cHIxID0gKCppdEFyZyk7CisJCQlpZiggKCppdEFyZykuaXM8IEF2bUNvZGUgPigpICkKKwkJCXsKKwkJCQlhQ29kZSA9ICgqaXRBcmcpLnRvX3B0cjwgQXZtQ29kZSA+KCk7CisKKwkJCQlpZiggYUNvZGUtPmlzT3BDb2RlKEFWTV9PUENPREVfTk9UKSApCisJCQkJeworCQkJCQljb2VmMSA9IGZhbHNlOworCQkJCQlleHByMSA9IGFDb2RlLT5maXJzdCgpOworCQkJCX0KKwkJCX0KKworCQkJaWYoIChjbXBSZXN1bHQgPSBleHByMS5jb21wYXJlKCBleHByMiApKSA9PSAwICkKKwkJCXsKKwkJCQlyZXR1cm4oIGNvZWYxID09IGNvZWYyICk7CisJCQl9CisJCQllbHNlIGlmKCBjbXBSZXN1bHQgPiAwICkKKwkJCXsKKwkJCQlyZXNBcmdzLmluc2VydChpdEFyZywgdGVybSk7CisKKwkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCX0KKwkJfQorCisJCXJlc0FyZ3MuYXBwZW5kKCB0ZXJtICk7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFORCBFWFBSRVNTSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitpbmxpbmUgc3RhdGljIGJvb2wgYW5kRmxhdEV4cHIoY29uc3QgQkYgJiB0ZXJtLAorCQlBdm1Db2RlOjp0aGlzX2NvbnRhaW5lcl90eXBlICYgcmVzQXJncykKK3sKKwlpZiggdGVybS5pczwgQXZtQ29kZSA+KCkgKQorCXsKKwkJQXZtQ29kZSAqIGFyZ0NvZGUgPSB0ZXJtLnRvX3B0cjwgQXZtQ29kZSA+KCk7CisKKwkJaWYoIHRlcm0udG9fcHRyPCBBdm1Db2RlID4oKS0+aXNPcENvZGUoQVZNX09QQ09ERV9BTkQpICkKKwkJeworCQkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXRBcmcgPSBhcmdDb2RlLT5iZWdpbigpOworCQkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kQXJnID0gYXJnQ29kZS0+ZW5kKCk7CisJCQlmb3IoIDsgaXRBcmcgIT0gZW5kQXJnIDsgKytpdEFyZyApCisJCQl7CisJCQkJaWYoICgqaXRBcmcpLmlzRXF1YWxUcnVlKCkgKQorCQkJCXsKKwkJCQkJLy9jb250aW51ZTsKKwkJCQl9CisJCQkJZWxzZSBpZiggKCppdEFyZykuaXNFcXVhbEZhbHNlKCkgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCX0KKwkJCQllbHNlIGlmKCBub3QgYXBwZW5kTG9naWNUZXJtKCppdEFyZywgcmVzQXJncykgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCX0KKwkJCX0KKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4oIGFwcGVuZExvZ2ljVGVybSh0ZXJtLCByZXNBcmdzKSApOworCQl9CisJfQorCWVsc2UKKwl7CisJCXJldHVybiggYXBwZW5kTG9naWNUZXJtKHRlcm0sIHJlc0FyZ3MpICk7CisJfQorfQorCisKK0JGIEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6YW5kRXhwcihjb25zdCBCRiAmIGFyZzAsIGNvbnN0IEJGICYgYXJnMSkKK3sKKwlpZiggYXJnMC5pc0VxdWFsRmFsc2UoKSB8fCBhcmcxLmlzRXF1YWxGYWxzZSgpICkKKwl7CisJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX0ZBTFNFICk7CisJfQorCWVsc2UgaWYoIGFyZzAuaXNFcXVhbFRydWUoKSApCisJeworCQlyZXR1cm4oIGFyZzEgKTsKKwl9CisJZWxzZSBpZiggYXJnMS5pc0VxdWFsVHJ1ZSgpICkKKwl7CisJCXJldHVybiggYXJnMCApOworCX0KKworCWVsc2UKKwl7CisJCUJGQ29kZSByZXNDb2RlKCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FORCApOworCisJCWlmKCBhbmRGbGF0RXhwcihhcmcwLCByZXNDb2RlLT5nZXRBcmdzKCkpICkKKwkJeworCQkJaWYoIGFuZEZsYXRFeHByKGFyZzEsIHJlc0NvZGUtPmdldEFyZ3MoKSkgKQorCQkJeworCQkJCWlmKCByZXNDb2RlLT5lbXB0eSgpICkKKwkJCQl7CisJCQkJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX1RSVUUgKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcmV0dXJuKCByZXNDb2RlLT5zaW5nbGV0b24oKSA/IHJlc0NvZGUtPmZpcnN0KCkgOiByZXNDb2RlICk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RhbnQ6OkJPT0xFQU5fRkFMU0UgKTsKKwl9Cit9CisKKworQkYgRXhwcmVzc2lvbkNvbnN0cnVjdG9yTmF0aXZlOjphbmRFeHByKAorCQljb25zdCBBdm1Db2RlOjp0aGlzX2NvbnRhaW5lcl90eXBlICYgbGlzdE9mQXJnKQoreworCWlmKCBsaXN0T2ZBcmcubm9uZW1wdHkoKSApCisJeworCQlCRkNvZGUgcmVzQ29kZSggT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BTkQgKTsKKworCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdEFyZyA9IGxpc3RPZkFyZy5iZWdpbigpOworCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBlbmRBcmcgPSBsaXN0T2ZBcmcuZW5kKCk7CisJCWZvciggOyBpdEFyZyAhPSBlbmRBcmcgOyArK2l0QXJnICkKKwkJeworCQkJaWYoICgqaXRBcmcpLmlzRXF1YWxUcnVlKCkgKQorCQkJeworCQkJCS8vY29udGludWU7CisJCQl9CisJCQllbHNlIGlmKCAoKml0QXJnKS5pc0VxdWFsRmFsc2UoKSApCisJCQl7CisJCQkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RhbnQ6OkJPT0xFQU5fRkFMU0UgKTsKKwkJCX0KKwkJCWVsc2UgaWYoIG5vdCBhbmRGbGF0RXhwcigqaXRBcmcsIHJlc0NvZGUtPmdldEFyZ3MoKSkgKQorCQkJeworCQkJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX0ZBTFNFICk7CisJCQl9CisJCX0KKworCQlpZiggcmVzQ29kZS0+ZW1wdHkoKSApCisJCXsKKwkJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX1RSVUUgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybiggcmVzQ29kZS0+c2luZ2xldG9uKCkgPyByZXNDb2RlLT5maXJzdCgpIDogcmVzQ29kZSApOworCQl9CisJfQorCWVsc2UKKwl7CisJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJPDwgIlVuZXhwZWN0ZWQgRXhwcmVzc2lvbkNvbnN0cnVjdG9yTmF0aXZlOjphbmRFeHByKC4uLikgIgorCQkJCQkid2l0aCBhbiBlbXB0eSBhcmd1bWVudCBsaXN0IgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9GQUxTRSApOworCX0KK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gT1IgRVhQUkVTU0lPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworaW5saW5lIHN0YXRpYyBib29sIG9yRmxhdEV4cHIoY29uc3QgQkYgJiB0ZXJtLAorCQlBdm1Db2RlOjp0aGlzX2NvbnRhaW5lcl90eXBlICYgcmVzQXJncykKK3sKKwlpZiggdGVybS5pczwgQXZtQ29kZSA+KCkgKQorCXsKKwkJQXZtQ29kZSAqIGFyZ0NvZGUgPSB0ZXJtLnRvX3B0cjwgQXZtQ29kZSA+KCk7CisKKwkJaWYoIHRlcm0udG9fcHRyPCBBdm1Db2RlID4oKS0+aXNPcENvZGUoQVZNX09QQ09ERV9PUikgKQorCQl7CisJCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdEFyZyA9IGFyZ0NvZGUtPmJlZ2luKCk7CisJCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBlbmRBcmcgPSBhcmdDb2RlLT5lbmQoKTsKKwkJCWZvciggOyBpdEFyZyAhPSBlbmRBcmcgOyArK2l0QXJnICkKKwkJCXsKKwkJCQlpZiggKCppdEFyZykuaXNFcXVhbFRydWUoKSApCisJCQkJeworCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJfQorCQkJCWVsc2UgaWYoICgqaXRBcmcpLmlzRXF1YWxGYWxzZSgpICkKKwkJCQl7CisJCQkJCS8vY29udGludWU7CisJCQkJfQorCQkJCWVsc2UgaWYoIG5vdCBhcHBlbmRMb2dpY1Rlcm0oKml0QXJnLCByZXNBcmdzKSApCisJCQkJeworCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybiggYXBwZW5kTG9naWNUZXJtKHRlcm0sIHJlc0FyZ3MpICk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuKCBhcHBlbmRMb2dpY1Rlcm0odGVybSwgcmVzQXJncykgKTsKKwl9Cit9CisKKworQkYgRXhwcmVzc2lvbkNvbnN0cnVjdG9yTmF0aXZlOjpvckV4cHIoY29uc3QgQkYgJiBhcmcwLCBjb25zdCBCRiAmIGFyZzEpCit7CisJaWYoIGFyZzAuaXNFcXVhbFRydWUoKSB8fCBhcmcxLmlzRXF1YWxUcnVlKCkgKQorCXsKKwkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RhbnQ6OkJPT0xFQU5fVFJVRSApOworCX0KKwllbHNlIGlmKCBhcmcwLmlzRXF1YWxGYWxzZSgpICkKKwl7CisJCXJldHVybiggYXJnMSApOworCX0KKwllbHNlIGlmKCBhcmcxLmlzRXF1YWxGYWxzZSgpICkKKwl7CisJCXJldHVybiggYXJnMCApOworCX0KKworCWVsc2UKKwl7CisJCUJGQ29kZSByZXNDb2RlKCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX09SICk7CisKKwkJaWYoIG9yRmxhdEV4cHIoYXJnMCwgcmVzQ29kZS0+Z2V0QXJncygpKSApCisJCXsKKwkJCWlmKCBvckZsYXRFeHByKGFyZzEsIHJlc0NvZGUtPmdldEFyZ3MoKSkgKQorCQkJeworCQkJCWlmKCByZXNDb2RlLT5lbXB0eSgpICkKKwkJCQl7CisJCQkJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX1RSVUUgKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcmV0dXJuKCByZXNDb2RlLT5zaW5nbGV0b24oKSA/IHJlc0NvZGUtPmZpcnN0KCkgOiByZXNDb2RlICk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RhbnQ6OkJPT0xFQU5fVFJVRSApOworCX0KK30KKworCitCRiBFeHByZXNzaW9uQ29uc3RydWN0b3JOYXRpdmU6Om9yRXhwcigKKwkJY29uc3QgQXZtQ29kZTo6dGhpc19jb250YWluZXJfdHlwZSAmIGxpc3RPZkFyZykKK3sKKwlpZiggbGlzdE9mQXJnLm5vbmVtcHR5KCkgKQorCXsKKwkJQkZDb2RlIHJlc0NvZGUoIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfT1IgKTsKKworCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdEFyZyA9IGxpc3RPZkFyZy5iZWdpbigpOworCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBlbmRBcmcgPSBsaXN0T2ZBcmcuZW5kKCk7CisJCWZvciggOyBpdEFyZyAhPSBlbmRBcmcgOyArK2l0QXJnICkKKwkJeworCQkJaWYoICgqaXRBcmcpLmlzRXF1YWxUcnVlKCkgKQorCQkJeworCQkJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX1RSVUUgKTsKKwkJCX0KKwkJCWVsc2UgaWYoICgqaXRBcmcpLmlzRXF1YWxGYWxzZSgpICkKKwkJCXsKKwkJCQkvL2NvbnRpbnVlOworCQkJfQorCQkJZWxzZSBpZiggbm90IG9yRmxhdEV4cHIoKml0QXJnLCByZXNDb2RlLT5nZXRBcmdzKCkpICkKKwkJCXsKKwkJCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9UUlVFICk7CisJCQl9CisJCX0KKworCQlpZiggcmVzQ29kZS0+ZW1wdHkoKSApCisJCXsKKwkJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX0ZBTFNFKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybiggcmVzQ29kZS0+c2luZ2xldG9uKCkgPyByZXNDb2RlLT5maXJzdCgpIDogcmVzQ29kZSApOworCQl9CisJfQorCWVsc2UKKwl7CisJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJPDwgIlVuZXhwZWN0ZWQgRXhwcmVzc2lvbkNvbnN0cnVjdG9yTmF0aXZlOjpvckV4cHIoLi4uKSAiCisJCQkJCSJ3aXRoIGFuIGVtcHR5IGFyZ3VtZW50IGxpc3QiCisJCQkJPDwgU0VORF9FWElUOworCisJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX0ZBTFNFKTsKKwl9Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBRVUFOVElGSUVSIEVYUFJFU1NJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitCRiBFeHByZXNzaW9uQ29uc3RydWN0b3JOYXRpdmU6OmV4aXN0RXhwcigKKwkJY29uc3QgQkYgJiBib3VuZFZhciwgY29uc3QgQkYgJiBmb3JtdWxhKQoreworCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9FWElTVCwgYm91bmRWYXIsIGZvcm11bGEpICk7Cit9CisKK0JGIEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6ZXhpc3RFeHByKAorCQljb25zdCBBdm1Db2RlOjp0aGlzX2NvbnRhaW5lcl90eXBlICYgbGlzdE9mQXJnKQoreworCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0VYSVNULCBsaXN0T2ZBcmcpICk7Cit9CisKKworQkYgRXhwcmVzc2lvbkNvbnN0cnVjdG9yTmF0aXZlOjpmb3JhbGxFeHByKAorCQljb25zdCBCRiAmIGJvdW5kVmFyLCBjb25zdCBCRiAmIGZvcm11bGEpCit7CisJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0ZPUkFMTCwgYm91bmRWYXIsIGZvcm11bGEpICk7Cit9CisKK0JGIEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6Zm9yYWxsRXhwcigKKwkJY29uc3QgQXZtQ29kZTo6dGhpc19jb250YWluZXJfdHlwZSAmIGxpc3RPZkFyZykKK3sKKwlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9GT1JBTEwsIGxpc3RPZkFyZykgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIE5PVCBFWFBSRVNTSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkYgRXhwcmVzc2lvbkNvbnN0cnVjdG9yTmF0aXZlOjpub3RFeHByKGNvbnN0IEJGICYgYXJnKQoreworCWlmKCBhcmcuaXNFcXVhbFRydWUoKSApCisJeworCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9GQUxTRSApOworCX0KKwllbHNlIGlmKCBhcmcuaXNFcXVhbEZhbHNlKCkgKQorCXsKKwkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RhbnQ6OkJPT0xFQU5fVFJVRSApOworCX0KKwllbHNlIGlmKCBhcmcuaXM8IEF2bUNvZGUgPigpICkKKwl7CisJCUF2bUNvZGUgKiBhQ29kZSA9IGFyZy50b19wdHI8IEF2bUNvZGUgPigpOworCisJCXN3aXRjaCggYUNvZGUtPmdldEF2bU9wQ29kZSgpICkKKwkJeworCQkJY2FzZSBBVk1fT1BDT0RFX0VROgorCQkJeworCQkJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9ORVEsIGFDb2RlLT5nZXRBcmdzKCkpICk7CisJCQl9CisJCQljYXNlIEFWTV9PUENPREVfTkVROgorCQkJeworCQkJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9FUSwgYUNvZGUtPmdldEFyZ3MoKSkgKTsKKwkJCX0KKworCQkJY2FzZSBBVk1fT1BDT0RFX1NFUToKKwkJCXsKKwkJCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfTlNFUSwgYUNvZGUtPmdldEFyZ3MoKSkgKTsKKwkJCX0KKwkJCWNhc2UgQVZNX09QQ09ERV9OU0VROgorCQkJeworCQkJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TRVEsIGFDb2RlLT5nZXRBcmdzKCkpICk7CisJCQl9CisKKwkJCWNhc2UgQVZNX09QQ09ERV9MVDoKKwkJCXsKKwkJCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfR1RFLCBhQ29kZS0+Z2V0QXJncygpKSApOworCQkJfQorCQkJY2FzZSBBVk1fT1BDT0RFX0xURToKKwkJCXsKKwkJCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfR1QsIGFDb2RlLT5nZXRBcmdzKCkpICk7CisJCQl9CisJCQljYXNlIEFWTV9PUENPREVfR1Q6CisJCQl7CisJCQkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0xURSwgYUNvZGUtPmdldEFyZ3MoKSkgKTsKKwkJCX0KKwkJCWNhc2UgQVZNX09QQ09ERV9HVEU6CisJCQl7CisJCQkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0xULCBhQ29kZS0+Z2V0QXJncygpKSApOworCQkJfQorCisJCQljYXNlIEFWTV9PUENPREVfTk9UOgorCQkJeworCQkJCXJldHVybiggYUNvZGUtPmZpcnN0KCkgKTsKKwkJCX0KKworCQkJY2FzZSBBVk1fT1BDT0RFX0FORDoKKwkJCXsKKwkJCQlCRkNvZGUgcmVzQ29kZSggT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9PUiApOworCisJCQkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXRBcmcgPSBhQ29kZS0+YmVnaW4oKTsKKwkJCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBlbmRBcmcgPSBhQ29kZS0+ZW5kKCk7CisJCQkJZm9yKCA7IGl0QXJnICE9IGVuZEFyZyA7ICsraXRBcmcgKQorCQkJCXsKKwkJCQkJcmVzQ29kZS0+YXBwZW5kKCBub3RFeHByKCAqaXRBcmcgKSApOworCQkJCX0KKworCQkJCXJldHVybiggcmVzQ29kZSApOworCQkJfQorCQkJY2FzZSBBVk1fT1BDT0RFX05BTkQ6CisJCQl7CisJCQkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FORCwgYUNvZGUtPmdldEFyZ3MoKSkgKTsKKwkJCX0KKworLy8JCQljYXNlIEFWTV9PUENPREVfWEFORDoKKy8vCQkJeworLy8JCQkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NvZGUoCisvLwkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfT1IsIGFDb2RlLT5nZXRBcmdzKCkpICk7CisvLwkJCX0KKworCQkJY2FzZSBBVk1fT1BDT0RFX09SOgorCQkJeworCQkJCUJGQ29kZSByZXNDb2RlKCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FORCApOworCisJCQkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXRBcmcgPSBhQ29kZS0+YmVnaW4oKTsKKwkJCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBlbmRBcmcgPSBhQ29kZS0+ZW5kKCk7CisJCQkJZm9yKCA7IGl0QXJnICE9IGVuZEFyZyA7ICsraXRBcmcgKQorCQkJCXsKKwkJCQkJcmVzQ29kZS0+YXBwZW5kKCBub3RFeHByKCAqaXRBcmcgKSApOworCQkJCX0KKworCQkJCXJldHVybiggcmVzQ29kZSApOworCQkJfQorCQkJY2FzZSBBVk1fT1BDT0RFX05PUjoKKwkJCXsKKwkJCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfT1IsIGFDb2RlLT5nZXRBcmdzKCkpICk7CisJCQl9CisKKwkJCWNhc2UgQVZNX09QQ09ERV9YT1I6CisJCQl7CisJCQkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1hOT1IsIGFDb2RlLT5nZXRBcmdzKCkpICk7CisJCQl9CisJCQljYXNlIEFWTV9PUENPREVfWE5PUjoKKwkJCXsKKwkJCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfWE9SLCBhQ29kZS0+Z2V0QXJncygpKSApOworCQkJfQorCisJCQlkZWZhdWx0OgorCQkJeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX05PVCwgYXJnKSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ09NUEFSRSBFWFBSRVNTSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordGVtcGxhdGU8IHR5cGVuYW1lIE9QX1QgPiBCRiBjb21wYXJlKAorCQljb25zdCBCRiAmIGxoQXJnLCBjb25zdCBCRiAmIHJoQXJnLCBPcGVyYXRvciAqIGNtcE9wLCBPUF9UIGNtcCkKK3sKKwkvL2Nhc2UgWCByZWxfb3AgWSAgPT0+IGRpZmYgOj0gWCAtIFkKKwlCRiBkaWZmID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yTmF0aXZlOjptaW51c0V4cHIobGhBcmcsIHJoQXJnKTsKKworCS8vY2FzZSBkaWZmID0gPG51bT4KKwlpZiggZGlmZi5pczwgTnVtYmVyID4oKSApCisJeworCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6bmV3Qm9vbGVhbigKKwkJCQljbXAoZGlmZi50b19wdHI8IE51bWJlciA+KCktPnNpZ24oKSwgMCkgKSApOworCX0KKworCS8vY2FzZSBkaWZmID0gPHRlcm0+CisJZWxzZSBpZiggZGlmZi5pczwgQXZtQ29kZSA+KCkgKQorCXsKKwkJQXZtQ29kZSAqIGRpZmZDb2RlID0gZGlmZi50b19wdHI8IEF2bUNvZGUgPigpOworCisJCS8vY2FzZSBkaWZmID0gQSArIEIgKyAuLi4KKwkJaWYoIGRpZmZDb2RlLT5pc09wQ29kZShBVk1fT1BDT0RFX1BMVVMpICkKKwkJeworCQkJQkZDb2RlIGxoQ29kZSggT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9QTFVTICk7CisJCQlCRkNvZGUgcmhDb2RlKCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1BMVVMgKTsKKworCQkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXRBcmcgPSBkaWZmQ29kZS0+YmVnaW4oKTsKKwkJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGVuZEFyZyA9IGRpZmZDb2RlLT5lbmQoKTsKKwkJCWZvciggOyBpdEFyZyAhPSBlbmRBcmcgOyArK2l0QXJnICkKKwkJCXsKKwkJCQkvL2Nhc2UgZGlmZiA9IEEgKyBCICsgLi4uICsgPG51bT4KKwkJCQlpZiggKCppdEFyZykuaXM8IE51bWJlciA+KCkgKQorCQkJCXsKKwkJCQkJcmhDb2RlLT5hcHBlbmQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6CisJCQkJCQkJdW1pbnVzRXhwciggKml0QXJnICkgKTsKKwkJCQl9CisKKwkJCQllbHNlIGlmKCAoKml0QXJnKS5pczwgQXZtQ29kZSA+KCkgKQorCQkJCXsKKwkJCQkJQXZtQ29kZSAqIGFyZ0NvZGUgPSAoKml0QXJnKS50b19wdHI8IEF2bUNvZGUgPigpOworCisJCQkJCS8vY2FzZSBkaWZmID0gKC0gQSkgKyBCICsgQyArLi4uCisJCQkJCWlmKCBhcmdDb2RlLT5pc09wQ29kZShBVk1fT1BDT0RFX1VNSU5VUykgKQorCQkJCQl7CisJCQkJCQlyaENvZGUtPmFwcGVuZCggYXJnQ29kZS0+Zmlyc3QoKSApOworCQkJCQl9CisJCQkJCS8vY2FzZSBkaWZmID0gKC0gPG51bT4gKiBYICogWSAqIC4uLikgKyBBICsgQiArIC4uLgorCQkJCQllbHNlIGlmKCBhcmdDb2RlLT5pc09wQ29kZShBVk1fT1BDT0RFX01VTFQpCisJCQkJCQkJJiYgYXJnQ29kZS0+Zmlyc3QoKS5pczwgTnVtYmVyID4oKQorCQkJCQkJCSYmIGFyZ0NvZGUtPmZpcnN0KCkudG9fcHRyPAorCQkJCQkJCQkJTnVtYmVyID4oKS0+c3RyaWN0bHlOZWdhdGl2ZSgpICkKKwkJCQkJeworCQkJCQkJcmhDb2RlLT5hcHBlbmQoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6CisJCQkJCQkJCXVtaW51c0V4cHIoICppdEFyZyApICk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlsaENvZGUtPmFwcGVuZCggKml0QXJnICk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJbGhDb2RlLT5hcHBlbmQoICppdEFyZyApOworCQkJCX0KKwkJCX0KKworCQkJQkZDb2RlIGNtcENvZGUoIGNtcE9wICk7CisKKwkJCWlmKCBsaENvZGUtPnNpbmdsZXRvbigpICkKKwkJCXsKKwkJCQljbXBDb2RlLT5hcHBlbmQoIGxoQ29kZS0+Zmlyc3QoKSApOworCQkJfQorCQkJZWxzZSBpZiggbGhDb2RlLT5wb3B1bGF0ZWQoKSApCisJCQl7CisJCQkJY21wQ29kZS0+YXBwZW5kKCBsaENvZGUgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQljbXBDb2RlLT5hcHBlbmQoIEV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9aRVJPICk7CisJCQl9CisKKwkJCWlmKCByaENvZGUtPnNpbmdsZXRvbigpICkKKwkJCXsKKwkJCQljbXBDb2RlLT5hcHBlbmQoIHJoQ29kZS0+Zmlyc3QoKSApOworCQkJfQorCQkJZWxzZSBpZiggcmhDb2RlLT5wb3B1bGF0ZWQoKSApCisJCQl7CisJCQkJY21wQ29kZS0+YXBwZW5kKCByaENvZGUgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQljbXBDb2RlLT5hcHBlbmQoIEV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9aRVJPICk7CisJCQl9CisKKwkJCXJldHVybiggY21wQ29kZSApOworCQl9CisJfQorCisJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NvZGUoY21wT3AsIGRpZmYsCisJCQlFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfWkVSTykgKTsKK30KKworCitCRiBFeHByZXNzaW9uQ29uc3RydWN0b3JOYXRpdmU6OmVxRXhwcihjb25zdCBCRiAmIGFyZzAsIGNvbnN0IEJGICYgYXJnMSkKK3sKKwlyZXR1cm4oIGNvbXBhcmUoYXJnMCwgYXJnMSwKKwkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfRVEsIHN0ZDo6ZXF1YWxfdG88aW50PigpKSApOworfQorCitCRiBFeHByZXNzaW9uQ29uc3RydWN0b3JOYXRpdmU6Om5lcUV4cHIoY29uc3QgQkYgJiBhcmcwLCBjb25zdCBCRiAmIGFyZzEpCit7CisJcmV0dXJuKCBjb21wYXJlKGFyZzAsIGFyZzEsCisJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX05FUSwgc3RkOjpub3RfZXF1YWxfdG88aW50PigpKSApOworfQorCisKK0JGIEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6Z3RFeHByKGNvbnN0IEJGICYgYXJnMCwgY29uc3QgQkYgJiBhcmcxKQoreworCXJldHVybiggY29tcGFyZShhcmcwLCBhcmcxLAorCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9HVCwgc3RkOjpncmVhdGVyPGludD4oKSkgKTsKK30KKworCitCRiBFeHByZXNzaW9uQ29uc3RydWN0b3JOYXRpdmU6Omd0ZUV4cHIoY29uc3QgQkYgJiBhcmcwLCBjb25zdCBCRiAmIGFyZzEpCit7CisJcmV0dXJuKCBjb21wYXJlKGFyZzAsIGFyZzEsCisJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0dURSwgc3RkOjpncmVhdGVyX2VxdWFsPGludD4oKSkgKTsKK30KKworQkYgRXhwcmVzc2lvbkNvbnN0cnVjdG9yTmF0aXZlOjpsdEV4cHIoY29uc3QgQkYgJiBhcmcwLCBjb25zdCBCRiAmIGFyZzEpCit7CisJcmV0dXJuKCBjb21wYXJlKGFyZzAsIGFyZzEsCisJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0xULCBzdGQ6Omxlc3M8aW50PigpKSApOworfQorCitCRiBFeHByZXNzaW9uQ29uc3RydWN0b3JOYXRpdmU6Omx0ZUV4cHIoY29uc3QgQkYgJiBhcmcwLCBjb25zdCBCRiAmIGFyZzEpCit7CisJcmV0dXJuKCBjb21wYXJlKGFyZzAsIGFyZzEsCisJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0xURSwgc3RkOjpsZXNzX2VxdWFsPGludD4oKSkgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQUREIEVYUFJFU1NJT04KKy8vIE5vcm1hbGl6YXRpb24gOiA8dGVybT4gKyA8dGVybT4gKyAuLi4gKyA8bnVtPgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkYgRXhwcmVzc2lvbkNvbnN0cnVjdG9yTmF0aXZlOjphZGROdW1iZXIoY29uc3QgQkYgJiBudW0wLCBjb25zdCBCRiAmIG51bTEpCit7CisJaWYoIG51bTAuaXM8IE51bWJlciA+KCkgKQorCXsKKwkJaWYoIG51bTAudG9fcHRyPCBOdW1iZXIgPigpLT5pc1plcm8oKSApCisJCXsKKwkJCXJldHVybiggbnVtMSApOworCQl9CisJCWVsc2UgaWYoIG51bTEuaXM8IE51bWJlciA+KCkgKQorCQl7CisJCQlpZiggbnVtMS50b19wdHI8IE51bWJlciA+KCktPmlzWmVybygpICkKKwkJCXsKKwkJCQlyZXR1cm4oIG51bTAgKTsKKwkJCX0KKworCQkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld051bWVyaWMoCisJCQkJCU51bWVyaWM6OmFjcXVpcmUoIG51bTAudG9fcHRyPCBOdW1iZXIgPigpICkuYWRkKAorCQkJCQlOdW1lcmljOjphY3F1aXJlKCBudW0xLnRvX3B0cjwgTnVtYmVyID4oKSApICkgKSApOworCQl9CisKKwkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9QTFVTLCBudW0xLCBudW0wKSApOworCX0KKwllbHNlIGlmKCBudW0xLmlzPCBOdW1iZXIgPigpICkKKwl7CisJCWlmKCBudW0xLnRvX3B0cjwgTnVtYmVyID4oKS0+aXNaZXJvKCkgKQorCQl7CisJCQlyZXR1cm4oIG51bTAgKTsKKwkJfQorCX0KKworCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9QTFVTLCBudW0wLCBudW0xKSApOworfQorCisKK3N0YXRpYyB2b2lkIGFkZEV4cHIoY29uc3QgQkYgJiB0ZXJtLAorCQlBdm1Db2RlOjp0aGlzX2NvbnRhaW5lcl90eXBlICYgcmVzQXJncywgTnVtZXJpYyAmIHJlc051bWJlckFyZykKK3sKKwlpZiggdGVybS5pczwgTnVtYmVyID4oKSApCisJeworCQlyZXNOdW1iZXJBcmcgKz0gdGVybTsKKwl9CisJZWxzZSBpZiggcmVzQXJncy5lbXB0eSgpICkKKwl7CisJCXJlc0FyZ3MuYXBwZW5kKCB0ZXJtICk7CisJfQorCWVsc2UKKwl7CisJCUF2bUNvZGUgKiBhQ29kZTsKKworCQlOdW1lcmljIGNvZWZfc3VtOworCisJCWludCBjbXBSZXN1bHQ7CisKKwkJTnVtZXJpYyBjb2VmMTsKKwkJQkYgZXhwcjE7CisKKwkJTnVtZXJpYyBjb2VmMiA9IEV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9PTkU7CisJCUJGIGV4cHIyID0gdGVybTsKKwkJaWYoIHRlcm0uaXM8IEF2bUNvZGUgPigpICkKKwkJeworCQkJYUNvZGUgPSB0ZXJtLnRvX3B0cjwgQXZtQ29kZSA+KCk7CisKKwkJCWlmKCBhQ29kZS0+aXNPcENvZGUoQVZNX09QQ09ERV9NVUxUKQorCQkJCSYmIGFDb2RlLT5maXJzdCgpLmlzPCBOdW1iZXIgPigpICkKKwkJCXsKKwkJCQljb2VmMiA9IGFDb2RlLT5maXJzdCgpOworCQkJCWlmKCBhQ29kZS0+c2l6ZSgpID09IDIgKQorCQkJCXsKKwkJCQkJZXhwcjIgPSBhQ29kZS0+c2Vjb25kKCk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWV4cHIyID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlVGFpbCgKKwkJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX01VTFQsIGFDb2RlLT5nZXRBcmdzKCkpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYoIGFDb2RlLT5pc09wQ29kZShBVk1fT1BDT0RFX1VNSU5VUykgKQorCQkJeworCQkJCWNvZWYyID0gRXhwcmVzc2lvbkNvbnN0YW50OjpJTlRFR0VSX01JTlVTX09ORTsKKwkJCQlleHByMiA9IGFDb2RlLT5maXJzdCgpOworCQkJfQorCQl9CisKKwkJQXZtQ29kZTo6aXRlcmF0b3IgaXRBcmcgPSByZXNBcmdzLmJlZ2luKCk7CisJCUF2bUNvZGU6Oml0ZXJhdG9yIGVuZEFyZyA9IHJlc0FyZ3MuZW5kKCk7CisJCWZvciggOyBpdEFyZyAhPSBlbmRBcmcgOyArK2l0QXJnICkKKwkJeworCQkJLy9jYXNlIEEgKyAoPG51bT4qQikgKyBDICsgLi4uIHdpdGggIDxudW0+ICogQgorCQkJY29lZjEgPSBFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfT05FOworCQkJZXhwcjEgPSAoKml0QXJnKTsKKwkJCWlmKCAoKml0QXJnKS5pczwgQXZtQ29kZSA+KCkgKQorCQkJeworCQkJCWFDb2RlID0gKCppdEFyZykudG9fcHRyPCBBdm1Db2RlID4oKTsKKworCQkJCWlmKCBhQ29kZS0+aXNPcENvZGUoQVZNX09QQ09ERV9NVUxUKQorCQkJCQkmJiBhQ29kZS0+Zmlyc3QoKS5pczwgTnVtYmVyID4oKSApCisJCQkJeworCQkJCQljb2VmMSA9IGFDb2RlLT5maXJzdCgpOworCQkJCQlpZiggYUNvZGUtPnNpemUoKSA9PSAyICkKKwkJCQkJeworCQkJCQkJZXhwcjEgPSBhQ29kZS0+c2Vjb25kKCk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlleHByMSA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q29kZVRhaWwoCisJCQkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfTVVMVCwgYUNvZGUtPmdldEFyZ3MoKSk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZiggYUNvZGUtPmlzT3BDb2RlKEFWTV9PUENPREVfVU1JTlVTKSApCisJCQkJeworCQkJCQljb2VmMSA9IEV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9NSU5VU19PTkU7CisJCQkJCWV4cHIxID0gYUNvZGUtPmZpcnN0KCk7CisJCQkJfQorCQkJfQorCisJCQkvLz09PiBBICsgKDxudW0+ICsgPG51bT4pKkIgKyBDICsgLi4uCisJCQlpZiggKGNtcFJlc3VsdCA9IGV4cHIxLmNvbXBhcmUoIGV4cHIyICkpID09IDAgKQorCQkJeworCQkJCWNvZWZfc3VtID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yTmF0aXZlOjphZGROdW1iZXIoY29lZjEsIGNvZWYyKTsKKwkJCQlpZiggY29lZl9zdW0uaXNaZXJvKCkgKQorCQkJCXsKKwkJCQkJaXRBcmcgPSByZXNBcmdzLmVyYXNlKCBpdEFyZyApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQkoKml0QXJnKSA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6bXVsdEV4cHIoCisJCQkJCQkJY29lZl9zdW0sIGV4cHIxKTsKKwkJCQl9CisKKwkJCQlyZXR1cm47CisJCQl9CisJCQllbHNlIGlmKCBjbXBSZXN1bHQgPiAwICkKKwkJCXsKKwkJCQlyZXNBcmdzLmluc2VydChpdEFyZywgdGVybSk7CisKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKworCQlyZXNBcmdzLmFwcGVuZCggdGVybSApOworCX0KK30KKworCitpbmxpbmUgc3RhdGljIHZvaWQgYWRkRmxhdEV4cHIoY29uc3QgQkYgJiB0ZXJtLAorCQlBdm1Db2RlOjp0aGlzX2NvbnRhaW5lcl90eXBlICYgcmVzQXJncywgTnVtZXJpYyAmIHJlc051bWJlckFyZykKK3sKKwlpZiggdGVybS5pczwgQXZtQ29kZSA+KCkgKQorCXsKKwkJQXZtQ29kZSAqIGFyZ0NvZGUgPSB0ZXJtLnRvX3B0cjwgQXZtQ29kZSA+KCk7CisKKwkJaWYodGVybS50b19wdHI8IEF2bUNvZGUgPigpLT5pc09wQ29kZShBVk1fT1BDT0RFX1BMVVMpICkKKwkJeworCQkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXRBcmcgPSBhcmdDb2RlLT5iZWdpbigpOworCQkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kQXJnID0gYXJnQ29kZS0+ZW5kKCk7CisJCQlmb3IoIDsgaXRBcmcgIT0gZW5kQXJnIDsgKytpdEFyZyApCisJCQl7CisJCQkJYWRkRXhwcigqaXRBcmcsIHJlc0FyZ3MsIHJlc051bWJlckFyZyk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlhZGRFeHByKHRlcm0sIHJlc0FyZ3MsIHJlc051bWJlckFyZyk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJYWRkRXhwcih0ZXJtLCByZXNBcmdzLCByZXNOdW1iZXJBcmcpOworCX0KK30KKworCitCRiBFeHByZXNzaW9uQ29uc3RydWN0b3JOYXRpdmU6OmFkZEV4cHIoY29uc3QgQkYgJiBhcmcwLCBjb25zdCBCRiAmIGFyZzEpCit7CisJaWYoIGFyZzAuaXNFcXVhbFplcm8oKSApCisJeworCQlyZXR1cm4oIGFyZzEgKTsKKwl9CisJZWxzZSBpZiggYXJnMS5pc0VxdWFsWmVybygpICkKKwl7CisJCXJldHVybiggYXJnMCApOworCX0KKwllbHNlIGlmKCBhcmcwLmlzPCBOdW1iZXIgPigpICYmIGFyZzEuaXM8IE51bWJlciA+KCkgKQorCXsKKwkJcmV0dXJuKCBhZGROdW1iZXIoYXJnMCwgYXJnMSkgKTsKKwl9CisJZWxzZQorCXsKKwkJQkZDb2RlIHJlc0NvZGUoIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfUExVUyApOworCisJCU51bWVyaWMgbnVtVGVybSA9IEV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9aRVJPOworCisJCWFkZEZsYXRFeHByKGFyZzAsIHJlc0NvZGUtPmdldEFyZ3MoKSwgbnVtVGVybSk7CisKKwkJYWRkRmxhdEV4cHIoYXJnMSwgcmVzQ29kZS0+Z2V0QXJncygpLCBudW1UZXJtKTsKKworCQlpZiggcmVzQ29kZS0+ZW1wdHkoKSApCisJCXsKKwkJCXJldHVybiggbnVtVGVybSApOworCQl9CisJCWVsc2UgaWYoIG5vdCBudW1UZXJtLmlzWmVybygpICkKKwkJeworCQkJcmVzQ29kZS0+YXBwZW5kKCBudW1UZXJtICk7CisJCX0KKworCQlyZXR1cm4oIHJlc0NvZGUtPnNpbmdsZXRvbigpID8gcmVzQ29kZS0+Zmlyc3QoKSA6IHJlc0NvZGUgKTsKKwl9Cit9CisKKworQkYgRXhwcmVzc2lvbkNvbnN0cnVjdG9yTmF0aXZlOjphZGRFeHByKAorCQljb25zdCBBdm1Db2RlOjp0aGlzX2NvbnRhaW5lcl90eXBlICYgbGlzdE9mQXJnKQoreworCUJGQ29kZSByZXNDb2RlKCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1BMVVMgKTsKKworCU51bWVyaWMgbnVtVGVybSA9IEV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9aRVJPOworCisJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXRBcmcgPSBsaXN0T2ZBcmcuYmVnaW4oKTsKKwlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBlbmRBcmcgPSBsaXN0T2ZBcmcuZW5kKCk7CisJZm9yKCA7IGl0QXJnICE9IGVuZEFyZyA7ICsraXRBcmcgKQorCXsKKwkJYWRkRmxhdEV4cHIoKml0QXJnLCByZXNDb2RlLT5nZXRBcmdzKCksIG51bVRlcm0pOworCX0KKworCWlmKCByZXNDb2RlLT5lbXB0eSgpICkKKwl7CisJCXJldHVybiggbnVtVGVybSApOworCX0KKwllbHNlIGlmKCBub3QgbnVtVGVybS5pc1plcm8oKSApCisJeworCQlyZXNDb2RlLT5hcHBlbmQoIG51bVRlcm0gKTsKKwl9CisKKwlyZXR1cm4oIHJlc0NvZGUtPnNpbmdsZXRvbigpID8gcmVzQ29kZS0+Zmlyc3QoKSA6IHJlc0NvZGUgKTsKK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBNSU5VUyBFWFBSRVNTSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitCRiBFeHByZXNzaW9uQ29uc3RydWN0b3JOYXRpdmU6Om1pbnVzRXhwcihjb25zdCBCRiAmIGFyZzAsIGNvbnN0IEJGICYgYXJnMSkKK3sKKwlyZXR1cm4oIGFkZEV4cHIoYXJnMCwgdW1pbnVzRXhwcihhcmcxKSkgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVU1JTlVTIEVYUFJFU1NJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0JGIEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6dW1pbnVzRXhwcihjb25zdCBCRiAmIGFyZykKK3sKKy8vCXN3aXRjaCggYXJnLmNsYXNzS2luZCgpICkKKy8vCXsKKy8vCQkvL2Nhc2UgLSA8aW50ZWdlcj4KKy8vCQljYXNlIEZPUk1fQlVJTFRJTl9JTlRFR0VSX0tJTkQ6CisvLwkJeworLy8JCQlCRiByZXMgPSBhcmc7CisvLwkJCXJlcy5tYWtlV3JpdGFibGUoKTsKKy8vCQkJcmVzLnRvX3B0cjwgSW50ZWdlciA+KCktPnVtaW51cygpOworLy8KKy8vCQkJcmV0dXJuKCByZXMgKTsKKy8vCQl9CisvLworLy8JCS8vY2FzZSAtIDxyYXRpb25hbD4KKy8vCQljYXNlIEZPUk1fQlVJTFRJTl9SQVRJT05BTF9LSU5EOgorLy8JCXsKKy8vCQkJQkYgcmVzID0gYXJnOworLy8JCQlyZXMubWFrZVdyaXRhYmxlKCk7CisvLwkJCXJlcy50b19wdHI8IFJhdGlvbmFsID4oKS0+dW1pbnVzKCk7CisvLworLy8JCQlyZXR1cm4oIHJlcyApOworLy8JCX0KKy8vCisvLwkJLy9jYXNlIC0gPGZsb2F0PgorLy8JCWNhc2UgRk9STV9CVUlMVElOX0ZMT0FUX0tJTkQ6CisvLwkJeworLy8JCQlCRiByZXMgPSBhcmc7CisvLwkJCXJlcy5tYWtlV3JpdGFibGUoKTsKKy8vCQkJcmVzLnRvX3B0cjwgRmxvYXQgPigpLT51bWludXMoKTsKKy8vCisvLwkJCXJldHVybiggcmVzICk7CisvLwkJfQorLy8KKy8vCQlkZWZhdWx0OgorLy8JCXsKKy8vCQkJYnJlYWs7CisvLwkJfQorLy8JfQorCisKKwlpZiggYXJnLmlzPCBOdW1iZXIgPigpICkKKwl7CisJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdOdW1lcmljKAorCQkJCU51bWVyaWM6OmFjcXVpcmUoIGFyZy50b19wdHI8IE51bWJlciA+KCkgKS51bWludXMoKSApICk7CisJfQorCisJLy9jYXNlIC0gPHRlcm0+CisJZWxzZSBpZiggYXJnLmlzPCBBdm1Db2RlID4oKSApCisJeworCQlBdm1Db2RlICogYUNvZGUgPSBhcmcudG9fcHRyPCBBdm1Db2RlID4oKTsKKworCQlzd2l0Y2goIGFDb2RlLT5nZXRBdm1PcENvZGUoKSApCisJCXsKKwkJCS8vY2FzZSAtIChBICsgQiArIC4uLikKKwkJCWNhc2UgQVZNX09QQ09ERV9QTFVTOgorCQkJeworCQkJCUJGQ29kZSByZXNDb2RlKCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1BMVVMgKTsKKworCQkJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0QXJnID0gYUNvZGUtPmJlZ2luKCk7CisJCQkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kQXJnID0gYUNvZGUtPmVuZCgpOworCQkJCWZvciggOyBpdEFyZyAhPSBlbmRBcmcgOyArK2l0QXJnICkKKwkJCQl7CisJCQkJCXJlc0NvZGUtPmFwcGVuZCggdW1pbnVzRXhwciggKml0QXJnICkgKTsKKwkJCQl9CisKKwkJCQlyZXR1cm4oIHJlc0NvZGUgKTsKKwkJCX0KKworCQkJLy9jYXNlIC0gKEEgLSBCIC0gLi4uKQorCQkJY2FzZSBBVk1fT1BDT0RFX01JTlVTOgorCQkJeworCQkJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0QXJnID0gYUNvZGUtPmJlZ2luKCk7CisKKwkJCQlCRkNvZGUgcmVzQ29kZSggT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9QTFVTLAorCQkJCQkJdW1pbnVzRXhwciggKml0QXJnICkgKTsKKworCQkJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGVuZEFyZyA9IGFDb2RlLT5lbmQoKTsKKwkJCQlmb3IoICsraXRBcmcgOyBpdEFyZyAhPSBlbmRBcmcgOyArK2l0QXJnICkKKwkJCQl7CisJCQkJCXJlc0NvZGUtPmFwcGVuZCggKml0QXJnICk7CisJCQkJfQorCisJCQkJcmV0dXJuKCByZXNDb2RlICk7CisJCQl9CisKKwkJCS8vY2FzZSAtICgtIDx0ZXJtPikKKwkJCWNhc2UgQVZNX09QQ09ERV9VTUlOVVM6CisJCQl7CisJCQkJcmV0dXJuKCBhQ29kZS0+Zmlyc3QoKSApOworCQkJfQorCisJCQkvL2Nhc2UgLSAoQSAqIEIgKiAuLi4pCisJCQljYXNlIEFWTV9PUENPREVfTVVMVDoKKwkJCXsKKwkJCQkvL2Nhc2UgKy0gKDxudW0+ICogQSAqIEIgKiAuLi4pCisJCQkJaWYoIGFDb2RlLT5maXJzdCgpLmlzPCBOdW1iZXIgPigpICkKKwkJCQl7CisJCQkJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0QXJnID0gYUNvZGUtPmJlZ2luKCk7CisKKwkJCQkJQkZDb2RlIHJlc0NvZGUoIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfTVVMVCApOworCisJCQkJCWlmKCBub3QgKCppdEFyZykudG9fcHRyPCBOdW1iZXIgPigpLT5pc05lZ2F0aXZlT25lKCkgKQorCQkJCQl7CisJCQkJCQlyZXNDb2RlLT5hcHBlbmQoIHVtaW51c0V4cHIoICppdEFyZyApICk7CisJCQkJCX0KKworCQkJCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBlbmRBcmcgPSBhQ29kZS0+ZW5kKCk7CisJCQkJCWZvciggKytpdEFyZyA7IGl0QXJnICE9IGVuZEFyZyA7ICsraXRBcmcgKQorCQkJCQl7CisJCQkJCQlyZXNDb2RlLT5hcHBlbmQoICppdEFyZyApOworCQkJCQl9CisKKwkJCQkJLy89PT4gKC0gPG51bT4pICogQSAqIEIgKiAuLi4KKwkJCQkJcmV0dXJuKCByZXNDb2RlICk7CisJCQkJfQorCisJCQkJLy89PT4gKC0gMSkgKiBBICogQiAqIC4uLgorCQkJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9NVUxUICwKKwkJCQkJCUV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9NSU5VU19PTkUsCisJCQkJCQlhQ29kZS0+Z2V0QXJncygpKSApOworCQkJfQorCisJCQkvL2Nhc2UgLSAoQSAvIEIgKQorCQkJY2FzZSBBVk1fT1BDT0RFX0RJVjoKKwkJCXsKKwkJCQkvLz09PiAoKC0gMSkgKiBBKSAvIEIKKwkJCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfRElWICwKKwkJCQkJCXVtaW51c0V4cHIoIGFDb2RlLT5maXJzdCgpICksIGFDb2RlLT5zZWNvbmQoKSkgKTsKKwkJCX0KKworCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9VTUlOVVMsIGFyZykgKTsKK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBNVUxUIEVYUFJFU1NJT04KKy8vIE5vcm1hbGl6YXRpb24gOiA8bnVtPiAqIDx0ZXJtPiAqIDx0ZXJtPiAqIC4uLgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIGJvb2wgbXVsdEV4cHIoY29uc3QgQkYgJiB0ZXJtLAorCQlBdm1Db2RlOjp0aGlzX2NvbnRhaW5lcl90eXBlICYgcmVzTXVsdEFyZ3MsCisJCU51bWVyaWMgJiByZXNOdW1iZXJDb2VmLCBib29sICYgZXhwYW5kQWRkRXhwcikKK3sKKwlpZiggcmVzTnVtYmVyQ29lZi5pc1plcm8oKSApCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCWVsc2UgaWYoIHRlcm0uaXM8IE51bWJlciA+KCkgKQorCXsKKwkJaWYoIHRlcm0udG9fcHRyPCBOdW1iZXIgPigpLT5pc1plcm8oKSApCisJCXsKKwkJCXJlc051bWJlckNvZWYgPSBFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfWkVSTzsKKworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJCWVsc2UKKwkJeworCQkJcmVzTnVtYmVyQ29lZiAqPSB0ZXJtOworCQl9CisJfQorCWVsc2UgaWYoIHJlc011bHRBcmdzLmVtcHR5KCkgKQorCXsKKwkJaWYoIHRlcm0uaXM8IEF2bUNvZGUgPigpICYmCisJCQl0ZXJtLnRvX3B0cjwgQXZtQ29kZSA+KCktPmlzT3BDb2RlKEFWTV9PUENPREVfUExVUykgKQorCQl7CisJCQlyZXNNdWx0QXJncy5hcHBlbmQoIHRlcm0udG9fcHRyPCBBdm1Db2RlID4oKS0+Z2V0QXJncygpICk7CisKKwkJCWV4cGFuZEFkZEV4cHIgPSB0cnVlOworCQl9CisJCWVsc2UKKwkJeworCQkJcmVzTXVsdEFyZ3MuYXBwZW5kKCB0ZXJtICk7CisJCX0KKwl9CisJZWxzZSBpZiggZXhwYW5kQWRkRXhwciApCisJeworCQlBdm1Db2RlOjp0aGlzX2NvbnRhaW5lcl90eXBlIHJlc0FkZEFyZ3MoIHJlc011bHRBcmdzICk7CisJCXJlc011bHRBcmdzLmNsZWFyKCk7CisKKwkJTnVtZXJpYyBudW1UZXJtID0gRXhwcmVzc2lvbkNvbnN0YW50OjpJTlRFR0VSX1pFUk87CisKKwkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXRBcmcgPSByZXNBZGRBcmdzLmJlZ2luKCk7CisJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGVuZEFyZyA9IHJlc0FkZEFyZ3MuZW5kKCk7CisJCWZvciggOyBpdEFyZyAhPSBlbmRBcmcgOyArK2l0QXJnICkKKwkJeworCQkJYWRkRmxhdEV4cHIoRXhwcmVzc2lvbkNvbnN0cnVjdG9yTmF0aXZlOjptdWx0RXhwcih0ZXJtLCAqaXRBcmcpLAorCQkJCQlyZXNNdWx0QXJncywgbnVtVGVybSk7CisJCX0KKworCQlpZiggbm90IG51bVRlcm0uaXNaZXJvKCkgKQorCQl7CisJCQlpZiggcmVzTXVsdEFyZ3MuZW1wdHkoKSApCisJCQl7CisJCQkJcmVzTXVsdEFyZ3MuYXBwZW5kKCBudW1UZXJtICk7CisJCQl9CisJCX0KKwl9CisJZWxzZSBpZiggdGVybS5pczwgQXZtQ29kZSA+KCkgJiYKKwkJCXRlcm0udG9fcHRyPCBBdm1Db2RlID4oKS0+aXNPcENvZGUoQVZNX09QQ09ERV9QTFVTKSApCisJeworCQlCRiBtdWx0QXJnID0gcmVzTXVsdEFyZ3Muc2luZ2xldG9uKCkgPyByZXNNdWx0QXJncy5maXJzdCgpIDoKKwkJCQlFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX01VTFQsIHJlc011bHRBcmdzKTsKKworCQlyZXNNdWx0QXJncy5jbGVhcigpOworCQlOdW1lcmljIG51bVRlcm0gPSBFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfWkVSTzsKKworCQlBdm1Db2RlICogYUNvZGUgPSB0ZXJtLnRvX3B0cjwgQXZtQ29kZSA+KCk7CisJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0QXJnID0gYUNvZGUtPmJlZ2luKCk7CisJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGVuZEFyZyA9IGFDb2RlLT5lbmQoKTsKKwkJZm9yKCA7IGl0QXJnICE9IGVuZEFyZyA7ICsraXRBcmcgKQorCQl7CisJCQlhZGRGbGF0RXhwcihFeHByZXNzaW9uQ29uc3RydWN0b3JOYXRpdmU6Om11bHRFeHByKG11bHRBcmcsICppdEFyZyksCisJCQkJCXJlc011bHRBcmdzLCBudW1UZXJtKTsKKwkJfQorCisJCWlmKCBub3QgbnVtVGVybS5pc1plcm8oKSApCisJCXsKKwkJCWlmKCByZXNNdWx0QXJncy5lbXB0eSgpICkKKwkJCXsKKwkJCQlyZXNNdWx0QXJncy5hcHBlbmQoIG51bVRlcm0gKTsKKwkJCX0KKwkJfQorCisJCWV4cGFuZEFkZEV4cHIgPSB0cnVlOworCX0KKworCWVsc2UKKwl7CisJCUF2bUNvZGUgKiBhQ29kZTsKKworCQlOdW1lcmljIGNvZWZfc3VtOworCisJCWludCBjbXBSZXN1bHQ7CisKKwkJTnVtZXJpYyBleHBvbmVudDE7CisJCUJGIGV4cHIxOworCisJCU51bWVyaWMgZXhwb25lbnQyID0gRXhwcmVzc2lvbkNvbnN0YW50OjpJTlRFR0VSX09ORTsKKwkJQkYgZXhwcjIgPSB0ZXJtOworCQlpZiggdGVybS5pczwgQXZtQ29kZSA+KCkgKQorCQl7CisJCQlhQ29kZSA9IHRlcm0udG9fcHRyPCBBdm1Db2RlID4oKTsKKworCQkJaWYoIGFDb2RlLT5pc09wQ29kZShBVk1fT1BDT0RFX1BPVykKKwkJCQkmJiBhQ29kZS0+c2Vjb25kKCkuaXM8IE51bWJlciA+KCkgKQorCQkJeworCQkJCWV4cHIyID0gYUNvZGUtPmZpcnN0KCk7CisJCQkJZXhwb25lbnQyID0gYUNvZGUtPnNlY29uZCgpOworCQkJfQorCQl9CisKKwkJQXZtQ29kZTo6aXRlcmF0b3IgaXRBcmcgPSByZXNNdWx0QXJncy5iZWdpbigpOworCQlBdm1Db2RlOjppdGVyYXRvciBlbmRBcmcgPSByZXNNdWx0QXJncy5lbmQoKTsKKwkJZm9yKCA7IGl0QXJnICE9IGVuZEFyZyA7ICsraXRBcmcgKQorCQl7CisJCQkvL2Nhc2UgQSAqIChCXjxudW0+KSArIEMgKyAuLi4gIHdpdGggIEIgXiA8bnVtPgorCQkJZXhwb25lbnQxID0gRXhwcmVzc2lvbkNvbnN0YW50OjpJTlRFR0VSX09ORTsKKwkJCWV4cHIxID0gKCppdEFyZyk7CisJCQlpZiggKCppdEFyZykuaXM8IEF2bUNvZGUgPigpICkKKwkJCXsKKwkJCQlhQ29kZSA9ICgqaXRBcmcpLnRvX3B0cjwgQXZtQ29kZSA+KCk7CisKKwkJCQlpZiggYUNvZGUtPmlzT3BDb2RlKEFWTV9PUENPREVfUE9XKQorCQkJCQkmJiBhQ29kZS0+c2Vjb25kKCkuaXM8IE51bWJlciA+KCkgKQorCQkJCXsKKwkJCQkJZXhwcjEgPSBhQ29kZS0+Zmlyc3QoKTsKKwkJCQkJZXhwb25lbnQxID0gYUNvZGUtPnNlY29uZCgpOworCQkJCX0KKwkJCX0KKworCQkJaWYoIChjbXBSZXN1bHQgPSBleHByMS5jb21wYXJlKCBleHByMiApKSA9PSAwICkKKwkJCXsKKwkJCQljb2VmX3N1bSA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6CisJCQkJCQlhZGROdW1iZXIoZXhwb25lbnQxLCBleHBvbmVudDIpOworCQkJCWlmKCBjb2VmX3N1bS5pc1plcm8oKSApCisJCQkJeworCQkJCQlpdEFyZyA9IHJlc011bHRBcmdzLmVyYXNlKCBpdEFyZyApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQkvLz09PiBBICsgQl4oPG51bT4gKyA8bnVtPikgKyBDICsgLi4uCisJCQkJCSgqaXRBcmcpID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yTmF0aXZlOjpwb3dFeHByKAorCQkJCQkJZXhwcjEsIGNvZWZfc3VtICk7CisJCQkJfQorCisJCQkJcmV0dXJuKCB0cnVlICk7CisJCQl9CisJCQllbHNlIGlmKCBjbXBSZXN1bHQgPiAwICkKKwkJCXsKKwkJCQlyZXNNdWx0QXJncy5pbnNlcnQoaXRBcmcsIHRlcm0pOworCisJCQkJcmV0dXJuKCB0cnVlICk7CisJCQl9CisJCX0KKworCQlyZXNNdWx0QXJncy5hcHBlbmQoIHRlcm0gKTsKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCitpbmxpbmUgc3RhdGljIGJvb2wgbXVsdEZsYXRFeHByKGNvbnN0IEJGICYgdGVybSwKKwkJQXZtQ29kZTo6dGhpc19jb250YWluZXJfdHlwZSAmIHJlc0FyZ3MsCisJCU51bWVyaWMgJiByZXNOdW1iZXJDb2VmLCBib29sICYgZXhwYW5kQWRkRXhwcikKK3sKKwlpZiggdGVybS5pczwgQXZtQ29kZSA+KCkgKQorCXsKKwkJQXZtQ29kZSAqIGFyZ0NvZGUgPSB0ZXJtLnRvX3B0cjwgQXZtQ29kZSA+KCk7CisKKwkJaWYoIHRlcm0udG9fcHRyPCBBdm1Db2RlID4oKS0+aXNPcENvZGUoQVZNX09QQ09ERV9NVUxUKSApCisJCXsKKwkJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0QXJnID0gYXJnQ29kZS0+YmVnaW4oKTsKKwkJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGVuZEFyZyA9IGFyZ0NvZGUtPmVuZCgpOworCQkJZm9yKCA7IGl0QXJnICE9IGVuZEFyZyA7ICsraXRBcmcgKQorCQkJeworCQkJCWlmKCAoKml0QXJnKS5pc0VxdWFsWmVybygpICkKKwkJCQl7CisJCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJbXVsdEV4cHIoKml0QXJnLCByZXNBcmdzLCByZXNOdW1iZXJDb2VmLCBleHBhbmRBZGRFeHByKTsKKwkJCQl9CisJCQl9CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisJCWVsc2UgaWYoIGFyZ0NvZGUtPmlzT3BDb2RlKEFWTV9PUENPREVfVU1JTlVTKSApCisJCXsKKwkJCS8vPT0+IG51bVRlcm0gOj0gKC0gbnVtVGVybSkKKwkJCXJlc051bWJlckNvZWYgPSAoIC0gcmVzTnVtYmVyQ29lZiApOworCisJCQkvLz09PiBBICogQyAqIC4uLiAqIDxleHByPgorCQkJcmV0dXJuKCBtdWx0RXhwcihhcmdDb2RlLT5maXJzdCgpLCByZXNBcmdzLAorCQkJCQlyZXNOdW1iZXJDb2VmLCBleHBhbmRBZGRFeHByKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuKCBtdWx0RXhwcih0ZXJtLCByZXNBcmdzLCByZXNOdW1iZXJDb2VmLCBleHBhbmRBZGRFeHByKSApOworCQl9CisJfQorCWVsc2UKKwl7CisJCXJldHVybiggbXVsdEV4cHIodGVybSwgcmVzQXJncywgcmVzTnVtYmVyQ29lZiwgZXhwYW5kQWRkRXhwcikgKTsKKwl9Cit9CisKKworaW5saW5lIHN0YXRpYyBCRiBtdWx0Q29lZkV4cHIoY29uc3QgTnVtZXJpYyAmIG51bUNvZWYsCisJCUJGQ29kZSAmIHJlc0NvZGUsIGJvb2wgZXhwYW5kQWRkRXhwcikKK3sKKwlpZiggcmVzQ29kZS0+ZW1wdHkoKSB8fCBudW1Db2VmLmlzWmVybygpICkKKwl7CisJCXJldHVybiggbnVtQ29lZiApOworCX0KKwllbHNlCisJeworCQlpZiggZXhwYW5kQWRkRXhwciApCisJCXsKKwkJCXJlc0NvZGUtPnNldE9wZXJhdG9yKCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1BMVVMgKTsKKwkJfQorCisJCWlmKCBudW1Db2VmLmlzT25lKCkgKQorCQl7CisJCQlyZXR1cm4oIHJlc0NvZGUtPnNpbmdsZXRvbigpID8gcmVzQ29kZS0+Zmlyc3QoKSA6IHJlc0NvZGUgKTsKKwkJfQorCisJCWVsc2UgaWYoIGV4cGFuZEFkZEV4cHIgKQorCQl7CisJCQlBdm1Db2RlOjppdGVyYXRvciBpdFJlcyA9IHJlc0NvZGUtPmJlZ2luKCk7CisJCQlBdm1Db2RlOjppdGVyYXRvciBlbmRSZXMgPSByZXNDb2RlLT5lbmQoKTsKKwkJCWZvciggOyBpdFJlcyAhPSBlbmRSZXMgOyArK2l0UmVzICkKKwkJCXsKKwkJCQkoKml0UmVzKSA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6bXVsdEV4cHIobnVtQ29lZiwgKml0UmVzKTsKKwkJCX0KKworCQkJcmV0dXJuKCByZXNDb2RlICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9NVUxULAorCQkJCQludW1Db2VmLCByZXNDb2RlLT5nZXRBcmdzKCkpICk7CisJCX0KKwl9Cit9CisKKworQkYgRXhwcmVzc2lvbkNvbnN0cnVjdG9yTmF0aXZlOjptdWx0RXhwcihjb25zdCBCRiAmIGFyZzAsIGNvbnN0IEJGICYgYXJnMSkKK3sKKwlpZiggYXJnMC5pczwgTnVtYmVyID4oKSApCisJeworCQlpZiggYXJnMC50b19wdHI8IE51bWJlciA+KCktPmlzWmVybygpICkKKwkJeworCQkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfWkVSTyApOworCQl9CisJCWVsc2UgaWYoIGFyZzAudG9fcHRyPCBOdW1iZXIgPigpLT5pc09uZSgpICkKKwkJeworCQkJcmV0dXJuKCBhcmcxICk7CisJCX0KKworCQlpZiggYXJnMS5pczwgTnVtYmVyID4oKSApCisJCXsKKwkJCWlmKCBhcmcxLnRvX3B0cjwgTnVtYmVyID4oKS0+aXNaZXJvKCkgKQorCQkJeworCQkJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0YW50OjpJTlRFR0VSX1pFUk8gKTsKKwkJCX0KKwkJCWVsc2UgaWYoIGFyZzEudG9fcHRyPCBOdW1iZXIgPigpLT5pc09uZSgpICkKKwkJCXsKKwkJCQlyZXR1cm4oIGFyZzAgKTsKKwkJCX0KKworCQkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld051bWVyaWMoCisJCQkJCU51bWVyaWM6OmFjcXVpcmUoIGFyZzAudG9fcHRyPCBOdW1iZXIgPigpICkubXVsdCgKKwkJCQkJTnVtZXJpYzo6YWNxdWlyZSggYXJnMS50b19wdHI8IE51bWJlciA+KCkgKSApICkgKTsKKwkJfQorCisJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfTVVMVCwgYXJnMCwgYXJnMSkgKTsKKwl9CisKKwllbHNlIGlmKCBhcmcxLmlzPCBOdW1iZXIgPigpICkKKwl7CisJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfTVVMVCwgYXJnMSwgYXJnMCkgKTsKKwl9CisKKwllbHNlCisJeworCQlCRkNvZGUgcmVzQ29kZSggT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9NVUxUICk7CisKKwkJTnVtZXJpYyBudW1UZXJtID0gRXhwcmVzc2lvbkNvbnN0YW50OjpJTlRFR0VSX09ORTsKKwkJYm9vbCBleHBhbmRBZGRFeHByID0gZmFsc2U7CisKKwkJaWYoIG11bHRGbGF0RXhwcihhcmcwLCByZXNDb2RlLT5nZXRBcmdzKCksIG51bVRlcm0sIGV4cGFuZEFkZEV4cHIpICkKKwkJeworCQkJaWYoIG11bHRGbGF0RXhwcihhcmcxLCByZXNDb2RlLT5nZXRBcmdzKCksIG51bVRlcm0sIGV4cGFuZEFkZEV4cHIpICkKKwkJCXsKKwkJCQlyZXR1cm4oIG11bHRDb2VmRXhwcihudW1UZXJtLCByZXNDb2RlLCBleHBhbmRBZGRFeHByKSApOworCQkJfQorCQl9CisKKwkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfWkVSTyApOworCX0KK30KKworCitCRiBFeHByZXNzaW9uQ29uc3RydWN0b3JOYXRpdmU6Om11bHRFeHByKAorCQljb25zdCBBdm1Db2RlOjp0aGlzX2NvbnRhaW5lcl90eXBlICYgbGlzdE9mQXJnKQoreworCUJGQ29kZSByZXNDb2RlKCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX01VTFQgKTsKKworCU51bWVyaWMgbnVtVGVybSA9IEV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9PTkU7CisJYm9vbCBleHBhbmRBZGRFeHByID0gZmFsc2U7CisKKwlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdEFyZyA9IGxpc3RPZkFyZy5iZWdpbigpOworCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGVuZEFyZyA9IGxpc3RPZkFyZy5lbmQoKTsKKwlmb3IoIDsgaXRBcmcgIT0gZW5kQXJnIDsgKytpdEFyZyApCisJeworCQlpZiggKCppdEFyZykuaXNFcXVhbFplcm8oKSApCisJCXsKKwkJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0YW50OjpJTlRFR0VSX1pFUk8gKTsKKwkJfQorCQllbHNlIGlmKCBub3QgbXVsdEZsYXRFeHByKCppdEFyZywKKwkJCQlyZXNDb2RlLT5nZXRBcmdzKCksIG51bVRlcm0sIGV4cGFuZEFkZEV4cHIpICkKKwkJeworCQkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfWkVSTyApOworCQl9CisJfQorCisJcmV0dXJuKCBtdWx0Q29lZkV4cHIobnVtVGVybSwgcmVzQ29kZSwgZXhwYW5kQWRkRXhwcikgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUE9XIEVYUFJFU1NJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0JGIEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6cG93RXhwcihjb25zdCBCRiAmIGFyZzAsIGNvbnN0IEJGICYgYXJnMSkKK3sKKwlpZiggYXJnMS5pczwgTnVtYmVyID4oKSApCisJeworCQlpZiggYXJnMS50b19wdHI8IE51bWJlciA+KCktPmlzWmVybygpICkKKwkJeworCQkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfT05FICk7CisJCX0KKwkJZWxzZSBpZiggYXJnMS50b19wdHI8IE51bWJlciA+KCktPmlzT25lKCkgKQorCQl7CisJCQlyZXR1cm4oIGFyZzAgKTsKKwkJfQorCisJCWlmKCBhcmcwLmlzPCBOdW1iZXIgPigpICkKKwkJeworCQkJaWYoIGFyZzAudG9fcHRyPCBOdW1iZXIgPigpLT5pc1plcm8oKQorCQkJCXx8IGFyZzAudG9fcHRyPCBOdW1iZXIgPigpLT5pc09uZSgpICkKKwkJCXsKKwkJCQlyZXR1cm4oIGFyZzAgKTsKKwkJCX0KKwkJCWVsc2UgaWYoIGFyZzEudG9fcHRyPCBOdW1iZXIgPigpLT5pc1VJbnRlZ2VyKCkgKQorCQkJeworCQkJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdOdW1lcmljKAorCQkJCQkJTnVtZXJpYzo6YWNxdWlyZSggYXJnMC50b19wdHI8IE51bWJlciA+KCkgKS5wb3coCisJCQkJCQlhcmcxLnRvX3B0cjwgTnVtYmVyID4oKS0+dG9VSW50ZWdlcigpICkgKSApOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1BPVywgYXJnMCwgYXJnMSkgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRElWIEVYUFJFU1NJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0JGIEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6ZGl2RXhwcihjb25zdCBCRiAmIGFyZzAsIGNvbnN0IEJGICYgYXJnMSkKK3sKKwlpZiggYXJnMS5pczwgTnVtYmVyID4oKSApCisJeworCQlpZiggYXJnMS50b19wdHI8IE51bWJlciA+KCktPmlzWmVybygpICkKKwkJeworCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJPDwgIkRpdmlzaW9uIG9mICIgPDwgYXJnMC5zdHIoKSA8PCAiIGJ5IHplcm8gISEhIgorCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCXJldHVybiggQkY6OlJFRl9OVUxMICk7CisJCX0KKwkJZWxzZSBpZiggYXJnMS50b19wdHI8IE51bWJlciA+KCktPmlzT25lKCkgKQorCQl7CisJCQlyZXR1cm4oIGFyZzAgKTsKKwkJfQorCQllbHNlIGlmKCBhcmcwLmlzPCBOdW1iZXIgPigpICkKKwkJeworCQkJaWYoIGFyZzAudG9fcHRyPCBOdW1iZXIgPigpLT5pc1plcm8oKSApCisJCQl7CisJCQkJcmV0dXJuKCBhcmcwICk7CisJCQl9CisKKwkJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdOdW1lcmljKAorCQkJCQlOdW1lcmljOjphY3F1aXJlKCBhcmcwLnRvX3B0cjwgTnVtYmVyID4oKSApLmRpdigKKwkJCQkJTnVtZXJpYzo6YWNxdWlyZSggYXJnMS50b19wdHI8IE51bWJlciA+KCkgKSApICkgKTsKKwkJfQorCX0KKworCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9ESVYsIGFyZzAsIGFyZzEpICk7Cit9CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29uc3RydWN0b3JJbXBsLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29uc3RydWN0b3JJbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdkNjI1NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25Db25zdHJ1Y3RvckltcGwuaApAQCAtMCwwICsxLDY5NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDI2IGp1aW4gMjAxMworICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEVYUFJFU1NJT05DT05TVFJVQ1RPUklNUExfSF8KKyNkZWZpbmUgRVhQUkVTU0lPTkNPTlNUUlVDVE9SSU1QTF9IXworCisvKioKKyAqIERFRklORSBNQUNSTyBXLlIuVC4gTElDRU5TRSBDT05TVFJBSU5UCisgKi8KKyNpZiBkZWZpbmVkKCBfRUNMSVBTRV9QVUJMSUNfTElDRU5TRV8gKQorCisjZWxzZQorCisjZW5kaWYgLyogX0VDTElQU0VfUFVCTElDX0xJQ0VOU0VfICovCisKKworI2luY2x1ZGUgPGZtbC9saWIvQXZtTGFuZy5oPgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQXZtQ29kZS5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0F2bUNvZGVGYWN0b3J5Lmg+CisjaW5jbHVkZSA8Zm1sL2J1aWx0aW4vQm9vbGVhbi5oPgorI2luY2x1ZGUgPGZtbC9idWlsdGluL0NoYXJhY3Rlci5oPgorI2luY2x1ZGUgPGZtbC9udW1lcmljL0Zsb2F0Lmg+CisjaW5jbHVkZSA8Zm1sL2J1aWx0aW4vSWRlbnRpZmllci5oPgorI2luY2x1ZGUgPGZtbC9udW1lcmljL0ludGVnZXIuaD4KKyNpbmNsdWRlIDxmbWwvbnVtZXJpYy9SYXRpb25hbC5oPgorI2luY2x1ZGUgPGZtbC9idWlsdGluL1N0cmluZy5oPgorI2luY2x1ZGUgPGZtbC9idWlsdGluL1F1YWxpZmllZElkZW50aWZpZXIuaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25Db25zdGFudC5oPgorCisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8Y3N0cmluZz4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDT01NT04gSU1QTEVNRU5UQVRJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit0ZW1wbGF0ZTwgY2xhc3MgRXByZXNzaW9uQ3RyID4KK2NsYXNzIENvbW1vbkV4cHJlc3Npb25Db25zdHJ1Y3RvckltcGwKK3sKKworcHVibGljOgorCWlubGluZSBzdGF0aWMgQkYgc2VxRXhwcihjb25zdCBCRiAmIGFyZzAsIGNvbnN0IEJGICYgYXJnMSkKKwl7CisJCXJldHVybiggRXByZXNzaW9uQ3RyOjpuZXdCb29sZWFuKCBhcmcwLmlzRVEoYXJnMSkgKSApOworCX0KKworCWlubGluZSBzdGF0aWMgQkYgbnNlcUV4cHIoY29uc3QgQkYgJiBhcmcwLCBjb25zdCBCRiAmIGFyZzEpCisJeworCQlyZXR1cm4oIEVwcmVzc2lvbkN0cjo6bmV3Qm9vbGVhbiggYXJnMC5pc05FUShhcmcxKSApICk7CisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gT1BFUkFUT1IgRVhQUkVTU0lPTgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlubGluZSBzdGF0aWMgQkYgbmV3RXhwcihPcGVyYXRvciAqIGFuT3BlcmF0b3IsIGNvbnN0IEJGICYgYXJnKQorCXsKKwkJc3dpdGNoKCBhbk9wZXJhdG9yLT5nZXRBdm1PcENvZGUoKSApCisJCXsKKwkJCWNhc2UgQVZNX09QQ09ERV9BTkQ6CisJCQljYXNlIEFWTV9PUENPREVfT1I6CisJCQljYXNlIEFWTV9PUENPREVfUExVUzoKKwkJCWNhc2UgQVZNX09QQ09ERV9NVUxUOgorCQkJY2FzZSBBVk1fT1BDT0RFX1BPVzoKKwkJCWNhc2UgQVZNX09QQ09ERV9ESVY6CisJCQl7CisJCQkJcmV0dXJuKCBhcmcgKTsKKwkJCX0KKworCQkJY2FzZSBBVk1fT1BDT0RFX05PVDoKKwkJCXsKKwkJCQlyZXR1cm4oIEVwcmVzc2lvbkN0cjo6bm90RXhwcihhcmcpICk7CisJCQl9CisKKwkJCWNhc2UgQVZNX09QQ09ERV9VTUlOVVM6CisJCQl7CisJCQkJcmV0dXJuKCBFcHJlc3Npb25DdHI6OnVtaW51c0V4cHIoYXJnKSApOworCQkJfQorCisJCQlkZWZhdWx0OgorCQkJeworCQkJCXJldHVybiggQXZtQ29kZUZhY3Rvcnk6Om5ld0NvZGUoYW5PcGVyYXRvciwgYXJnKSApOworCQkJfQorCQl9CisJfQorCisJaW5saW5lIHN0YXRpYyBCRiBuZXdFeHByKAorCQkJT3BlcmF0b3IgKiBhbk9wZXJhdG9yLCBjb25zdCBCRiAmIGFyZzEsIGNvbnN0IEJGICYgYXJnMikKKwl7CisJCXN3aXRjaCggYW5PcGVyYXRvci0+Z2V0QXZtT3BDb2RlKCkgKQorCQl7CisJCQljYXNlIEFWTV9PUENPREVfQU5EOgorCQkJeworCQkJCXJldHVybiggRXByZXNzaW9uQ3RyOjphbmRFeHByKGFyZzEsIGFyZzIpICk7CisJCQl9CisJCQljYXNlIEFWTV9PUENPREVfT1I6CisJCQl7CisJCQkJcmV0dXJuKCBFcHJlc3Npb25DdHI6Om9yRXhwcihhcmcxLCBhcmcyKSApOworCQkJfQorCisJCQljYXNlIEFWTV9PUENPREVfRVhJU1Q6CisJCQl7CisJCQkJcmV0dXJuKCBFcHJlc3Npb25DdHI6OmV4aXN0RXhwcihhcmcxLCBhcmcyKSApOworCQkJfQorCQkJY2FzZSBBVk1fT1BDT0RFX0ZPUkFMTDoKKwkJCXsKKwkJCQlyZXR1cm4oIEVwcmVzc2lvbkN0cjo6Zm9yYWxsRXhwcihhcmcxLCBhcmcyKSApOworCQkJfQorCisJCQljYXNlIEFWTV9PUENPREVfRVE6CisJCQl7CisJCQkJcmV0dXJuKCBFcHJlc3Npb25DdHI6OmVxRXhwcihhcmcxLCBhcmcyKSApOworCQkJfQorCQkJY2FzZSBBVk1fT1BDT0RFX05FUToKKwkJCXsKKwkJCQlyZXR1cm4oIEVwcmVzc2lvbkN0cjo6bmVxRXhwcihhcmcxLCBhcmcyKSApOworCQkJfQorCisJCQljYXNlIEFWTV9PUENPREVfU0VROgorCQkJeworCQkJCXJldHVybiggRXByZXNzaW9uQ3RyOjpzZXFFeHByKGFyZzEsIGFyZzIpICk7CisJCQl9CisJCQljYXNlIEFWTV9PUENPREVfTlNFUToKKwkJCXsKKwkJCQlyZXR1cm4oIEVwcmVzc2lvbkN0cjo6bnNlcUV4cHIoYXJnMSwgYXJnMikgKTsKKwkJCX0KKworCQkJY2FzZSBBVk1fT1BDT0RFX0xUOgorCQkJeworCQkJCXJldHVybiggRXByZXNzaW9uQ3RyOjpsdEV4cHIoYXJnMSwgYXJnMikgKTsKKwkJCX0KKwkJCWNhc2UgQVZNX09QQ09ERV9MVEU6CisJCQl7CisJCQkJcmV0dXJuKCBFcHJlc3Npb25DdHI6Omx0ZUV4cHIoYXJnMSwgYXJnMikgKTsKKwkJCX0KKwkJCWNhc2UgQVZNX09QQ09ERV9HVDoKKwkJCXsKKwkJCQlyZXR1cm4oIEVwcmVzc2lvbkN0cjo6Z3RFeHByKGFyZzEsIGFyZzIpICk7CisJCQl9CisJCQljYXNlIEFWTV9PUENPREVfR1RFOgorCQkJeworCQkJCXJldHVybiggRXByZXNzaW9uQ3RyOjpndGVFeHByKGFyZzEsIGFyZzIpICk7CisJCQl9CisKKwkJCWNhc2UgQVZNX09QQ09ERV9QTFVTOgorCQkJeworCQkJCXJldHVybiggRXByZXNzaW9uQ3RyOjphZGRFeHByKGFyZzEsIGFyZzIpICk7CisJCQl9CisJCQljYXNlIEFWTV9PUENPREVfTUlOVVM6CisJCQl7CisJCQkJcmV0dXJuKCBFcHJlc3Npb25DdHI6Om1pbnVzRXhwcihhcmcxLCBhcmcyKSApOworCQkJfQorCisJCQljYXNlIEFWTV9PUENPREVfTVVMVDoKKwkJCXsKKwkJCQlyZXR1cm4oIEVwcmVzc2lvbkN0cjo6bXVsdEV4cHIoYXJnMSwgYXJnMikgKTsKKwkJCX0KKwkJCWNhc2UgQVZNX09QQ09ERV9QT1c6CisJCQl7CisJCQkJcmV0dXJuKCBFcHJlc3Npb25DdHI6OnBvd0V4cHIoYXJnMSwgYXJnMikgKTsKKwkJCX0KKworCQkJY2FzZSBBVk1fT1BDT0RFX0RJVjoKKwkJCXsKKwkJCQlyZXR1cm4oIEVwcmVzc2lvbkN0cjo6ZGl2RXhwcihhcmcxLCBhcmcyKSApOworCQkJfQorCisJCQlkZWZhdWx0OgorCQkJeworCQkJCXJldHVybiggQXZtQ29kZUZhY3Rvcnk6Om5ld0NvZGUoYW5PcGVyYXRvciwgYXJnMSwgYXJnMikgKTsKKwkJCX0KKwkJfQorCX0KKworCisJaW5saW5lIHN0YXRpYyBCRiBuZXdFeHByKE9wZXJhdG9yICogYW5PcGVyYXRvciwKKwkJCWNvbnN0IEF2bUNvZGU6OnRoaXNfY29udGFpbmVyX3R5cGUgJiBsaXN0T2ZBcmcpCisJeworCQlzd2l0Y2goIGFuT3BlcmF0b3ItPmdldEF2bU9wQ29kZSgpICkKKwkJeworCQkJY2FzZSBBVk1fT1BDT0RFX0FORDoKKwkJCXsKKwkJCQlyZXR1cm4oIEVwcmVzc2lvbkN0cjo6YW5kRXhwcihsaXN0T2ZBcmcpICk7CisJCQl9CisJCQljYXNlIEFWTV9PUENPREVfT1I6CisJCQl7CisJCQkJcmV0dXJuKCBFcHJlc3Npb25DdHI6Om9yRXhwcihsaXN0T2ZBcmcpICk7CisJCQl9CisKKwkJCWNhc2UgQVZNX09QQ09ERV9QTFVTOgorCQkJeworCQkJCXJldHVybiggRXByZXNzaW9uQ3RyOjphZGRFeHByKGxpc3RPZkFyZykgKTsKKwkJCX0KKwkJCWNhc2UgQVZNX09QQ09ERV9NVUxUOgorCQkJeworCQkJCXJldHVybiggRXByZXNzaW9uQ3RyOjptdWx0RXhwcihsaXN0T2ZBcmcpICk7CisJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJcmV0dXJuKCBBdm1Db2RlRmFjdG9yeTo6bmV3Q29kZShhbk9wZXJhdG9yLCBsaXN0T2ZBcmcpICk7CisJCQl9CisJCX0KKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBJTkNSIC8gREVDUiAgRVhQUkVTU0lPTgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlubGluZSBzdGF0aWMgQkYgYWRkRXhwcihjb25zdCBCRiAmIGFyZywgYXZtX2ludGVnZXJfdCB2YWwpCisJeworCQlzd2l0Y2goIGFyZy5jbGFzc0tpbmQoKSApCisJCXsKKwkJCWNhc2UgRk9STV9CVUlMVElOX0lOVEVHRVJfS0lORDoKKwkJCXsKKwkJCQlCRiByZXMgPSBhcmc7CisJCQkJcmVzLm1ha2VXcml0YWJsZSgpOworCQkJCXJlcy50b19wdHI8IEludGVnZXIgPigpLT5hZGRFeHByKHZhbCk7CisJCQkJcmV0dXJuKCByZXMgKTsKKwkJCX0KKworCQkJY2FzZSBGT1JNX0JVSUxUSU5fUkFUSU9OQUxfS0lORDoKKwkJCXsKKwkJCQlCRiByZXMgPSBhcmc7CisJCQkJcmVzLm1ha2VXcml0YWJsZSgpOworCQkJCXJlcy50b19wdHI8IFJhdGlvbmFsID4oKS0+YWRkRXhwcih2YWwpOworCQkJCXJldHVybiggcmVzICk7CisJCQl9CisKKwkJCWNhc2UgRk9STV9CVUlMVElOX0ZMT0FUX0tJTkQ6CisJCQl7CisJCQkJQkYgcmVzID0gYXJnOworCQkJCXJlcy5tYWtlV3JpdGFibGUoKTsKKwkJCQlyZXMudG9fcHRyPCBGbG9hdCA+KCktPmFkZEV4cHIodmFsKTsKKwkJCQlyZXR1cm4oIHJlcyApOworCQkJfQorCisJCQlkZWZhdWx0OgorCQkJeworCQkJCXJldHVybiggRXByZXNzaW9uQ3RyOjphZGRFeHByKGFyZywKKwkJCQkJCUVwcmVzc2lvbkN0cjo6bmV3SW50ZWdlcih2YWwpKSApOworCQkJfQorCQl9CisJfQorCisJaW5saW5lIHN0YXRpYyBCRiBwb3dFeHByKGNvbnN0IEJGICYgYXJnLCBhdm1fdWludGVnZXJfdCB2YWwpCisJeworCQlzd2l0Y2goIGFyZy5jbGFzc0tpbmQoKSApCisJCXsKKwkJCWNhc2UgRk9STV9CVUlMVElOX0lOVEVHRVJfS0lORDoKKwkJCXsKKwkJCQlCRiByZXMgPSBhcmc7CisJCQkJcmVzLm1ha2VXcml0YWJsZSgpOworCQkJCXJlcy50b19wdHI8IEludGVnZXIgPigpLT5zZXRfcG93KHZhbCk7CisJCQkJcmV0dXJuKCByZXMgKTsKKwkJCX0KKworCQkJY2FzZSBGT1JNX0JVSUxUSU5fUkFUSU9OQUxfS0lORDoKKwkJCXsKKwkJCQlCRiByZXMgPSBhcmc7CisJCQkJcmVzLm1ha2VXcml0YWJsZSgpOworCQkJCXJlcy50b19wdHI8IFJhdGlvbmFsID4oKS0+c2V0X3Bvdyh2YWwpOworCQkJCXJldHVybiggcmVzICk7CisJCQl9CisKKwkJCWNhc2UgRk9STV9CVUlMVElOX0ZMT0FUX0tJTkQ6CisJCQl7CisJCQkJQkYgcmVzID0gYXJnOworCQkJCXJlcy5tYWtlV3JpdGFibGUoKTsKKwkJCQlyZXMudG9fcHRyPCBGbG9hdCA+KCktPnNldF9wb3codmFsKTsKKwkJCQlyZXR1cm4oIHJlcyApOworCQkJfQorCisJCQlkZWZhdWx0OgorCQkJeworCQkJCXJldHVybiggRXByZXNzaW9uQ3RyOjpwb3dFeHByKGFyZywKKwkJCQkJCUVwcmVzc2lvbkN0cjo6bmV3VUludGVnZXIodmFsKSkgKTsKKwkJCX0KKwkJfQorCX0KKworfTsKKworCisvKioKKyAqIEV4cHJlc3Npb25Db25zdHJ1Y3RvckltcGwKKyAqIFRSQUlUUworICovCit0ZW1wbGF0ZTwgRVhQUkVTU0lPTjo6SU1QTEVNRU5UQVRJT05fS0lORCBleHByX2ltcGxfa2luZCA+CitjbGFzcyBFeHByZXNzaW9uQ29uc3RydWN0b3JJbXBsOworCisKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTkFUSVZFX0lNUEwKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjbGFzcyBFeHByZXNzaW9uQ29uc3RydWN0b3JOYXRpdmUgIDoKKwkJcHVibGljIENvbW1vbkV4cHJlc3Npb25Db25zdHJ1Y3RvckltcGw8IEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZSA+Cit7CisKK3B1YmxpYzoKKwkvKioKKwkgKiBQUklNSVRJVkUgRVhQUkVTU0lPTgorCSAqLworCWlubGluZSBzdGF0aWMgY29uc3QgQkYgJiBuZXdCb29sZWFuKGJvb2wgYVZhbHVlID0gZmFsc2UpCisJeworCQlyZXR1cm4oICggYVZhbHVlICkKKwkJCQk/IEV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9UUlVFCisJCQkJOiBFeHByZXNzaW9uQ29uc3RhbnQ6OkJPT0xFQU5fRkFMU0UgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIEJGIG5ld0Jvb2xlYW4oY29uc3QgY2hhciAqIGFWYWx1ZSkKKwl7CisJCXJldHVybiggKCA6OnN0cmNhc2VjbXAoInRydWUiLCBhVmFsdWUpID09IDAgKQorCQkJCT8gRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX1RSVUUKKwkJCQk6IEV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9GQUxTRSApOworCX0KKworCWlubGluZSBzdGF0aWMgQkYgbmV3Qm9vbGVhbihjb25zdCBzdGQ6OnN0cmluZyAmIGFWYWx1ZSkKKwl7CisJCXJldHVybiggKCA6OnN0cmNhc2VjbXAoInRydWUiLCBhVmFsdWUuY19zdHIoKSkgPT0gIDApCisJCQkJPyBFeHByZXNzaW9uQ29uc3RhbnQ6OkJPT0xFQU5fVFJVRQorCQkJCTogRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX0ZBTFNFICk7CisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gTkVXIElOVEVHRVIgVkFMVUUKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlpbmxpbmUgc3RhdGljIEJGIG5ld0ludGVnZXIoYXZtX2ludGVnZXJfdCBhVmFsdWUpCisJeworCQlzd2l0Y2goIGFWYWx1ZSApCisJCXsKKwkJCWNhc2UgIDA6IHJldHVybiggRXhwcmVzc2lvbkNvbnN0YW50OjpJTlRFR0VSX1pFUk8gKTsKKworCQkJY2FzZSAgMTogcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfT05FICk7CisJCQljYXNlICAyOiByZXR1cm4oIEV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9UV08gKTsKKworCQkJY2FzZSAtMTogcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfTUlOVVNfT05FICk7CisJCQljYXNlIC0yOiByZXR1cm4oIEV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9NSU5VU19UV08gKTsKKworCQkJZGVmYXVsdDogcmV0dXJuKCBCRiggbmV3IEludGVnZXIoYVZhbHVlKSApICk7CisJCX0KKwl9CisKKwlpbmxpbmUgc3RhdGljIEJGIG5ld1VJbnRlZ2VyKGF2bV91aW50ZWdlcl90IGFWYWx1ZSkKKwl7CisJCXN3aXRjaCggYVZhbHVlICkKKwkJeworCQkJY2FzZSAgMDogcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfWkVSTyApOworCisJCQljYXNlICAxOiByZXR1cm4oIEV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9PTkUgKTsKKwkJCWNhc2UgIDI6IHJldHVybiggRXhwcmVzc2lvbkNvbnN0YW50OjpJTlRFR0VSX1RXTyApOworCisJCQlkZWZhdWx0OiByZXR1cm4oIEJGKCBuZXcgSW50ZWdlcihhVmFsdWUpICkgKTsKKwkJfQorCX0KKworCWlubGluZSBzdGF0aWMgQkYgbmV3SW50ZWdlcihjb25zdCBzdGQ6OnN0cmluZyAmIGFWYWx1ZSkKKwl7CisJCXJldHVybiggQkYoIG5ldyBJbnRlZ2VyKGFWYWx1ZSkgKSApOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIE5FVyBSQVRJT05BTCBWQUxVRQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlubGluZSBzdGF0aWMgQkYgbmV3UmF0aW9uYWwoYXZtX2ludGVnZXJfdCBhTnVtZXIpCisJeworCQlyZXR1cm4oIEJGKCBuZXcgUmF0aW9uYWwoYU51bWVyKSApICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBCRiBuZXdVUmF0aW9uYWwoYXZtX3VpbnRlZ2VyX3QgYU51bWVyKQorCXsKKwkJcmV0dXJuKCBCRiggbmV3IFJhdGlvbmFsKGFOdW1lcikgKSApOworCX0KKworCWlubGluZSBzdGF0aWMgQkYgbmV3UmF0aW9uYWwoYXZtX2ludGVnZXJfdCBhTnVtZXIsIGF2bV9pbnRlZ2VyX3QgYURlbm9tKQorCXsKKwkJcmV0dXJuKCBCRiggbmV3IFJhdGlvbmFsKGFOdW1lciwgYURlbm9tKSApICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBCRiBuZXdSYXRpb25hbChhdm1faW50ZWdlcl90IGFOdW1lciwgYXZtX3VpbnRlZ2VyX3QgYURlbm9tKQorCXsKKwkJcmV0dXJuKCBCRiggbmV3IFJhdGlvbmFsKGFOdW1lciwgYURlbm9tKSApICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBCRiBuZXdVUmF0aW9uYWwoYXZtX3VpbnRlZ2VyX3QgYU51bWVyLCBhdm1fdWludGVnZXJfdCBhRGVub20pCisJeworCQlyZXR1cm4oIEJGKCBuZXcgUmF0aW9uYWwoYU51bWVyLCBhRGVub20pICkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIEJGIG5ld1JhdGlvbmFsKGNvbnN0IHN0ZDo6c3RyaW5nICYgYVZhbHVlKQorCXsKKwkJc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSBhVmFsdWUuZmluZCgnLycpOworCQlpZiggcG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKwkJeworCQkJcmV0dXJuKCBCRiggbmV3IFJhdGlvbmFsKAorCQkJCQlhVmFsdWUuc3Vic3RyKDAsIHBvcyksIGFWYWx1ZS5zdWJzdHIocG9zKzEpKSApICk7CisJCX0KKwkJZWxzZSBpZiggKHBvcyA9IGFWYWx1ZS5maW5kKCcuJykpICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKwkJeworCQkJSW50ZWdlciBhTnVtZXIoIHN0ZDo6c3RyaW5nKGFWYWx1ZSkuZXJhc2UocG9zLCAxKSApOworCisJCQlJbnRlZ2VyIGFEZW5vbSggMTAgKTsKKwkJCWFEZW5vbS5zZXRfcG93KCBhVmFsdWUuc2l6ZSgpIC0gKHBvcyArIDEpICk7CisKKwkJCXJldHVybiggQkYoIG5ldyBSYXRpb25hbChhTnVtZXIsIGFEZW5vbSkgKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuKCBCRiggbmV3IFJhdGlvbmFsKGFWYWx1ZSwgMSkgKSApOworCQkJfQorCQkJfQorCisJaW5saW5lIHN0YXRpYyBCRiBuZXdSYXRpb25hbCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgc3RyTnVtZXIsIGNvbnN0IHN0ZDo6c3RyaW5nICYgc3RyRGVub20pCisJCQl7CisJCXJldHVybiggQkYoIG5ldyBSYXRpb25hbChzdHJOdW1lciwgIHN0ckRlbm9tKSApICk7CisJfQorCisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBORVcgRkxPQVQgVkFMVUUKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlpbmxpbmUgc3RhdGljIEJGIG5ld0Zsb2F0KGF2bV9pbnRlZ2VyX3QgYVZhbHVlKQorCXsKKwkJcmV0dXJuKCBCRiggbmV3IEZsb2F0KHN0YXRpY19jYXN0PCBhdm1fZmxvYXRfdCA+KGFWYWx1ZSkpICkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIEJGIG5ld1VGbG9hdChhdm1fdWludGVnZXJfdCBhVmFsdWUpCisJeworCQlyZXR1cm4oIEJGKCBuZXcgRmxvYXQoc3RhdGljX2Nhc3Q8IGF2bV9mbG9hdF90ID4oYVZhbHVlKSkgKSApOworCX0KKworCWlubGluZSBzdGF0aWMgQkYgbmV3RmxvYXQoYXZtX2Zsb2F0X3QgYVZhbHVlKQorCXsKKwkJcmV0dXJuKCBCRiggbmV3IEZsb2F0KGFWYWx1ZSkgKSApOworCX0KKworCWlubGluZSBzdGF0aWMgQkYgbmV3RmxvYXQoY29uc3Qgc3RkOjpzdHJpbmcgJiBhVmFsdWUpCisJeworCQlyZXR1cm4oIEJGKCBuZXcgRmxvYXQoYVZhbHVlKSApICk7CisJfQorCisKKwkvKioKKwkgKiBTUEVDSUZJQyBOVU1FUklDIEVYUFJFU1NJT04KKwkgKi8KKwlpbmxpbmUgc3RhdGljIEJGIG5ld0V4cHIoYm9vbCBhVmFsdWUpCisJeworCQlyZXR1cm4oIG5ld0Jvb2xlYW4oYVZhbHVlKSApOworCX0KKworCisJaW5saW5lIHN0YXRpYyBCRiBuZXdFeHByKGF2bV9pbnRlZ2VyX3QgYVZhbHVlKQorCXsKKwkJc3dpdGNoKCBhVmFsdWUgKQorCQl7CisJCQljYXNlICAwOiByZXR1cm4oIEV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9aRVJPICk7CisKKwkJCWNhc2UgIDE6IHJldHVybiggRXhwcmVzc2lvbkNvbnN0YW50OjpJTlRFR0VSX09ORSApOworCQkJY2FzZSAgMjogcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfVFdPICk7CisKKwkJCWNhc2UgLTE6IHJldHVybiggRXhwcmVzc2lvbkNvbnN0YW50OjpJTlRFR0VSX01JTlVTX09ORSApOworCQkJY2FzZSAtMjogcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfTUlOVVNfVFdPICk7CisKKwkJCWRlZmF1bHQ6IHJldHVybiggQkYoIG5ldyBJbnRlZ2VyKGFWYWx1ZSkgKSApOworCQl9CisJfQorCisKKwlpbmxpbmUgc3RhdGljIEJGIG5ld0V4cHIoYXZtX2ludGVnZXJfdCBhTnVtZXIsIGF2bV9pbnRlZ2VyX3QgYURlbm9tKQorCXsKKwkJcmV0dXJuKCBCRiggbmV3IFJhdGlvbmFsKGFOdW1lciwgYURlbm9tKSApICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBCRiBuZXdFeHByKGF2bV9pbnRlZ2VyX3QgYU51bWVyLCBhdm1fdWludGVnZXJfdCBhRGVub20pCisJeworCQlyZXR1cm4oIEJGKCBuZXcgUmF0aW9uYWwoYU51bWVyLCBhRGVub20pICkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIEJGIG5ld0V4cHIoYXZtX3VpbnRlZ2VyX3QgYU51bWVyLCBhdm1fdWludGVnZXJfdCBhRGVub20pCisJeworCQlyZXR1cm4oIEJGKCBuZXcgUmF0aW9uYWwoYU51bWVyLCBhRGVub20pICkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIEJGIG5ld0V4cHIoCisJCQljb25zdCBJbnRlZ2VyICYgYU51bWVyLCBjb25zdCBJbnRlZ2VyICYgYURlbm9tKQorCXsKKwkJcmV0dXJuKCBCRiggbmV3IFJhdGlvbmFsKGFOdW1lciwgYURlbm9tKSApICk7CisJfQorCisKKwlpbmxpbmUgc3RhdGljIEJGIG5ld0V4cHIoZmxvYXQgYVZhbHVlKQorCXsKKwkJcmV0dXJuKCBCRiggbmV3IEZsb2F0KGFWYWx1ZSkgKSApOworCX0KKworCWlubGluZSBzdGF0aWMgQkYgbmV3RXhwcihkb3VibGUgYVZhbHVlKQorCXsKKwkJcmV0dXJuKCBCRiggbmV3IEZsb2F0KGFWYWx1ZSkgKSApOworCX0KKworCisJaW5saW5lIHN0YXRpYyBCRiBuZXdFeHByTnVtYmVyKGNvbnN0IHN0ZDo6c3RyaW5nICYgYVZhbHVlKQorCXsKKwkJc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSBhVmFsdWUuZmluZCgnLycpOworCQlpZiggcG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKwkJeworCQkJcmV0dXJuKCBCRiggbmV3IFJhdGlvbmFsKAorCQkJCQlhVmFsdWUuc3Vic3RyKDAsIHBvcyksIGFWYWx1ZS5zdWJzdHIocG9zKzEpKSApICk7CisJCX0KKwkJZWxzZSBpZiggKHBvcyA9IGFWYWx1ZS5maW5kKCcuJykpICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKwkJeworCQkJSW50ZWdlciBhTnVtZXIoIHN0ZDo6c3RyaW5nKGFWYWx1ZSkuZXJhc2UocG9zLCAxKSApOworCisJCQlJbnRlZ2VyIGFEZW5vbSggMTAgKTsKKwkJCWFEZW5vbS5zZXRfcG93KCBhVmFsdWUuc2l6ZSgpIC0gKHBvcyArIDEpICk7CisKKwkJCXJldHVybiggQkYoIG5ldyBSYXRpb25hbChhTnVtZXIsIGFEZW5vbSkgKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuKCBCRiggbmV3IEludGVnZXIoYVZhbHVlKSApICk7CisJCX0KKwl9CisKKworCS8qKgorCSAqIFNQRUNJRklDIEFWTUNPREUgRVhQUkVTU0lPTgorCSAqLworCisJaW5saW5lIHN0YXRpYyBCRiBuZXdFeHByKGNvbnN0IEJGICYgYW5FbGVtZW50KQorCXsKKwkJcmV0dXJuKCBhbkVsZW1lbnQgKTsKKwl9CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQU5EIEVYUFJFU1NJT04KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlzdGF0aWMgQkYgYW5kRXhwcihjb25zdCBCRiAmIGFyZzAsIGNvbnN0IEJGICYgYXJnMSk7CisKKwlzdGF0aWMgQkYgYW5kRXhwcihjb25zdCBBdm1Db2RlOjp0aGlzX2NvbnRhaW5lcl90eXBlICYgbGlzdE9mQXJnKTsKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBPUiBFWFBSRVNTSU9OCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJc3RhdGljIEJGIG9yRXhwcihjb25zdCBCRiAmIGFyZzAsIGNvbnN0IEJGICYgYXJnMSk7CisKKwlzdGF0aWMgQkYgb3JFeHByKGNvbnN0IEF2bUNvZGU6OnRoaXNfY29udGFpbmVyX3R5cGUgJiBsaXN0T2ZBcmcpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gUVVBTlRJRklFUiBFWFBSRVNTSU9OCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJc3RhdGljIEJGIGV4aXN0RXhwcihjb25zdCBCRiAmIGJvdW5kVmFyLCBjb25zdCBCRiAmIGZvcm11bGEpOworCisJc3RhdGljIEJGIGV4aXN0RXhwcihjb25zdCBBdm1Db2RlOjp0aGlzX2NvbnRhaW5lcl90eXBlICYgbGlzdE9mQXJnKTsKKworCisJc3RhdGljIEJGIGZvcmFsbEV4cHIoY29uc3QgQkYgJiBib3VuZFZhciwgY29uc3QgQkYgJiBmb3JtdWxhKTsKKworCXN0YXRpYyBCRiBmb3JhbGxFeHByKGNvbnN0IEF2bUNvZGU6OnRoaXNfY29udGFpbmVyX3R5cGUgJiBsaXN0T2ZBcmcpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gTk9UIEVYUFJFU1NJT04KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlzdGF0aWMgQkYgbm90RXhwcihjb25zdCBCRiAmIGFyZyk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBDT01QQVJFIEVYUFJFU1NJT04KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlzdGF0aWMgQkYgZXFFeHByKGNvbnN0IEJGICYgYXJnMCwgY29uc3QgQkYgJiBhcmcxKTsKKworCXN0YXRpYyBCRiBuZXFFeHByKGNvbnN0IEJGICYgYXJnMCwgY29uc3QgQkYgJiBhcmcxKTsKKworCXN0YXRpYyBCRiBndEV4cHIoY29uc3QgQkYgJiBhcmcwLCBjb25zdCBCRiAmIGFyZzEpOworCisJc3RhdGljIEJGIGd0ZUV4cHIoY29uc3QgQkYgJiBhcmcwLCBjb25zdCBCRiAmIGFyZzEpOworCisJc3RhdGljIEJGIGx0RXhwcihjb25zdCBCRiAmIGFyZzAsIGNvbnN0IEJGICYgYXJnMSk7CisKKwlzdGF0aWMgQkYgbHRlRXhwcihjb25zdCBCRiAmIGFyZzAsIGNvbnN0IEJGICYgYXJnMSk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBBREQgRVhQUkVTU0lPTgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXN0YXRpYyBCRiBhZGROdW1iZXIoY29uc3QgQkYgJiBudW0wLCBjb25zdCBCRiAmIG51bTEpOworCisJc3RhdGljIEJGIGFkZEV4cHIoY29uc3QgQkYgJiBhcmcwLCBjb25zdCBCRiAmIGFyZzEpOworCisJc3RhdGljIEJGIGFkZEV4cHIoY29uc3QgQXZtQ29kZTo6dGhpc19jb250YWluZXJfdHlwZSAmIGxpc3RPZkFyZyk7CisKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIE1JTlVTIEVYUFJFU1NJT04KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlzdGF0aWMgQkYgbWludXNFeHByKGNvbnN0IEJGICYgYXJnMCwgY29uc3QgQkYgJiBhcmcxKTsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFVNSU5VUyBFWFBSRVNTSU9OCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJc3RhdGljIEJGIHVtaW51c0V4cHIoY29uc3QgQkYgJiBhcmcpOworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIE1VTFQgRVhQUkVTU0lPTgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXN0YXRpYyBCRiBtdWx0RXhwcihjb25zdCBCRiAmIGFyZzAsIGNvbnN0IEJGICYgYXJnMSk7CisKKwlzdGF0aWMgQkYgbXVsdEV4cHIoY29uc3QgQXZtQ29kZTo6dGhpc19jb250YWluZXJfdHlwZSAmIGxpc3RPZkFyZyk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBQT1cgRVhQUkVTU0lPTgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXN0YXRpYyBCRiBwb3dFeHByKGNvbnN0IEJGICYgYXJnMCwgY29uc3QgQkYgJiBhcmcxKTsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIERJViBFWFBSRVNTSU9OCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJc3RhdGljIEJGIGRpdkV4cHIoY29uc3QgQkYgJiBhcmcwLCBjb25zdCBCRiAmIGFyZzEpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gT1BFUkFUT1IgRVhQUkVTU0lPTgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlubGluZSBzdGF0aWMgQkYgbmV3RXhwcihPcGVyYXRvciAqIGFuT3BlcmF0b3IsCisJCQljb25zdCBBdm1Db2RlOjp0aGlzX2NvbnRhaW5lcl90eXBlICYgbGlzdE9mQXJnKQorCXsKKwkJcmV0dXJuKCBDb21tb25FeHByZXNzaW9uQ29uc3RydWN0b3JJbXBsOjpuZXdFeHByKGFuT3BlcmF0b3IsIGxpc3RPZkFyZykgKTsKKwl9CisKK307CisKKwordGVtcGxhdGU8ID4KK2NsYXNzIEV4cHJlc3Npb25Db25zdHJ1Y3RvckltcGw8IEVYUFJFU1NJT046Ok5BVElWRV9JTVBMID4gIDoKKwkJcHVibGljIEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZQoreworCS8qIE5PVEhJTkcgRUxTRSAqLworfTsKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKyNlbmRpZiAvKiBFWFBSRVNTSU9OQ09OU1RSVUNUT1JJTVBMX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uRXZhbC5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uRXZhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ3YmU3ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25FdmFsLmNwcApAQCAtMCwwICsxLDU4NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDEwIGTDqWMuIDIwMDkKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkV4cHJlc3Npb25FdmFsLmgiCisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlTGliLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9Bdm1Db2RlLmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkNvbnN0cnVjdG9yLmg+CisKKyNpbmNsdWRlIDxmbWwvb3BlcmF0b3IvT3BlcmF0b3JNYW5hZ2VyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK0JGIEV4cHJlc3Npb25FdmFsOjp2YWx1ZShjb25zdCBCRkNvZGUgJiBhQ29kZSwgYm9vbCBkZXN0cm95X2FyZykKK3sKKwlzd2l0Y2goIGFDb2RlLmdldEF2bU9wQ29kZSgpICkKKwl7CisJCWNhc2UgQVZNX09QQ09ERV9SQU5ET006CisJCXsKKwkJCXJldHVybiggRXhwcmVzc2lvbkV2YWw6OnJhbmRvbShhQ29kZS0+Zmlyc3QoKSkgKTsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9BQlM6CisJCXsKKwkJCXJldHVybiggRXhwcmVzc2lvbkV2YWw6OmFicyhhQ29kZS0+Zmlyc3QoKSkgKTsKKwkJfQorCQljYXNlIEFWTV9PUENPREVfQ0VJTDoKKwkJeworCQkJcmV0dXJuKCBFeHByZXNzaW9uRXZhbDo6Y2VpbChhQ29kZS0+Zmlyc3QoKSkgKTsKKwkJfQorCQljYXNlIEFWTV9PUENPREVfRkxPT1I6CisJCXsKKwkJCXJldHVybiggRXhwcmVzc2lvbkV2YWw6OmZsb29yKGFDb2RlLT5maXJzdCgpKSApOworCQl9CisJCWNhc2UgQVZNX09QQ09ERV9ST1VORDoKKwkJeworCQkJcmV0dXJuKCBFeHByZXNzaW9uRXZhbDo6cm91bmQoYUNvZGUtPmZpcnN0KCkpICk7CisJCX0KKwkJY2FzZSBBVk1fT1BDT0RFX1RSVU5DQVRFOgorCQl7CisJCQlyZXR1cm4oIEV4cHJlc3Npb25FdmFsOjp0cnVuY2F0ZShhQ29kZS0+Zmlyc3QoKSkgKTsKKwkJfQorCisKKwkJY2FzZSBBVk1fT1BDT0RFX01JTjoKKwkJeworCQkJcmV0dXJuKCBFeHByZXNzaW9uRXZhbDo6bWluKGFDb2RlKSApOworCQl9CisJCWNhc2UgQVZNX09QQ09ERV9NQVg6CisJCXsKKwkJCXJldHVybiggRXhwcmVzc2lvbkV2YWw6Om1heChhQ29kZSkgKTsKKwkJfQorCisKKwkJY2FzZSBBVk1fT1BDT0RFX01PRDoKKwkJeworCQkJcmV0dXJuKCBFeHByZXNzaW9uRXZhbDo6bW9kKGFDb2RlLT5maXJzdCgpLAorCQkJCQlhQ29kZS0+c2Vjb25kKCkpICk7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfU1FSVDoKKwkJeworCQkJcmV0dXJuKCBFeHByZXNzaW9uRXZhbDo6c3FydChhQ29kZS0+Zmlyc3QoKSkgKTsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9FWFA6CisJCXsKKwkJCXJldHVybiggRXhwcmVzc2lvbkV2YWw6OmV4cChhQ29kZS0+Zmlyc3QoKSkgKTsKKwkJfQorCQljYXNlIEFWTV9PUENPREVfTE46CisJCXsKKwkJCXJldHVybiggRXhwcmVzc2lvbkV2YWw6OmxuKGFDb2RlLT5maXJzdCgpKSApOworCQl9CisJCWNhc2UgQVZNX09QQ09ERV9MT0c6CisJCXsKKwkJCXJldHVybiggRXhwcmVzc2lvbkV2YWw6OmxvZyhhQ29kZS0+Zmlyc3QoKSkgKTsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9TSU46CisJCXsKKwkJCXJldHVybiggRXhwcmVzc2lvbkV2YWw6OnNpbihhQ29kZS0+Zmlyc3QoKSkgKTsKKwkJfQorCQljYXNlIEFWTV9PUENPREVfQ09TOgorCQl7CisJCQlyZXR1cm4oIEV4cHJlc3Npb25FdmFsOjpjb3MoYUNvZGUtPmZpcnN0KCkpICk7CisJCX0KKwkJY2FzZSBBVk1fT1BDT0RFX1RBTjoKKwkJeworCQkJcmV0dXJuKCBFeHByZXNzaW9uRXZhbDo6dGFuKGFDb2RlLT5maXJzdCgpKSApOworCQl9CisKKwkJY2FzZSBBVk1fT1BDT0RFX1NJTkg6CisJCXsKKwkJCXJldHVybiggRXhwcmVzc2lvbkV2YWw6OnNpbmgoYUNvZGUtPmZpcnN0KCkpICk7CisJCX0KKwkJY2FzZSBBVk1fT1BDT0RFX0NPU0g6CisJCXsKKwkJCXJldHVybiggRXhwcmVzc2lvbkV2YWw6OmNvc2goYUNvZGUtPmZpcnN0KCkpICk7CisJCX0KKwkJY2FzZSBBVk1fT1BDT0RFX1RBTkg6CisJCXsKKwkJCXJldHVybiggRXhwcmVzc2lvbkV2YWw6OnRhbmgoYUNvZGUtPmZpcnN0KCkpICk7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfQVNJTjoKKwkJeworCQkJcmV0dXJuKCBFeHByZXNzaW9uRXZhbDo6YXNpbihhQ29kZS0+Zmlyc3QoKSkgKTsKKwkJfQorCQljYXNlIEFWTV9PUENPREVfQUNPUzoKKwkJeworCQkJcmV0dXJuKCBFeHByZXNzaW9uRXZhbDo6YWNvcyhhQ29kZS0+Zmlyc3QoKSkgKTsKKwkJfQorCQljYXNlIEFWTV9PUENPREVfQVRBTjoKKwkJeworCQkJcmV0dXJuKCBFeHByZXNzaW9uRXZhbDo6YXRhbihhQ29kZS0+Zmlyc3QoKSkgKTsKKwkJfQorCQljYXNlIEFWTV9PUENPREVfQVRBTjI6CisJCXsKKwkJCXJldHVybiggRXhwcmVzc2lvbkV2YWw6OmF0YW4yKGFDb2RlLT5maXJzdCgpLAorCQkJCQlhQ29kZS0+c2Vjb25kKCkpICk7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfQVNJTkg6CisJCXsKKwkJCXJldHVybiggRXhwcmVzc2lvbkV2YWw6OmFzaW5oKGFDb2RlLT5maXJzdCgpKSApOworCQl9CisJCWNhc2UgQVZNX09QQ09ERV9BQ09TSDoKKwkJeworCQkJcmV0dXJuKCBFeHByZXNzaW9uRXZhbDo6YWNvc2goYUNvZGUtPmZpcnN0KCkpICk7CisJCX0KKwkJY2FzZSBBVk1fT1BDT0RFX0FUQU5IOgorCQl7CisJCQlyZXR1cm4oIEV4cHJlc3Npb25FdmFsOjphdGFuaChhQ29kZS0+Zmlyc3QoKSkgKTsKKwkJfQorCisKKwkJZGVmYXVsdDoKKwkJeworCQkJcmV0dXJuKCBhQ29kZSApOworCQl9CisJfQorfQorCisKK0JGIEV4cHJlc3Npb25FdmFsOjpyYW5kb20oY29uc3QgQkYgJiBhQ29kZSkKK3sKKwlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3RXhwcigKKwkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfUkFORE9NLCBhQ29kZSkgKTsKK30KKworCitCRiBFeHByZXNzaW9uRXZhbDo6YWJzKGNvbnN0IEJGICYgYUNvZGUpCit7CisJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0V4cHIoCisJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FCUywgYUNvZGUpICk7Cit9CisKKworQkYgRXhwcmVzc2lvbkV2YWw6OmNlaWwoY29uc3QgQkYgJiBhQ29kZSkKK3sKKwlpZiggYUNvZGUuaXNJbnRlZ2VyKCkgKQorCXsKKwkJcmV0dXJuKCBhQ29kZSApOworCX0KKworCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdFeHByKAorCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9DRUlMLCBhQ29kZSkgKTsKK30KKworCitCRiBFeHByZXNzaW9uRXZhbDo6Zmxvb3IoY29uc3QgQkYgJiBhQ29kZSkKK3sKKwlpZiggYUNvZGUuaXNJbnRlZ2VyKCkgKQorCXsKKwkJcmV0dXJuKCBhQ29kZSApOworCX0KKworCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdFeHByKAorCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9GTE9PUiwgYUNvZGUpICk7Cit9CisKKworQkYgRXhwcmVzc2lvbkV2YWw6OnJvdW5kKGNvbnN0IEJGICYgYUNvZGUpCit7CisJaWYoIGFDb2RlLmlzSW50ZWdlcigpICkKKwl7CisJCXJldHVybiggYUNvZGUgKTsKKwl9CisKKwlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3RXhwcigKKwkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfUk9VTkQsIGFDb2RlKSApOworfQorCisKK0JGIEV4cHJlc3Npb25FdmFsOjp0cnVuY2F0ZShjb25zdCBCRiAmIGFDb2RlKQoreworCWlmKCBhQ29kZS5pc0ludGVnZXIoKSApCisJeworCQlyZXR1cm4oIGFDb2RlICk7CisJfQorCisJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0V4cHIoCisJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1RSVU5DQVRFLCBhQ29kZSkgKTsKK30KKworCitCRiBFeHByZXNzaW9uRXZhbDo6bWluKGNvbnN0IEJGICYgYUNvZGUxLCBjb25zdCBCRiAmIGFDb2RlMikKK3sKKwlpZiggYUNvZGUxID09IEV4ZWN1dGFibGVMaWI6Ol9JTkZJTklUWV8gKQorCXsKKwkJcmV0dXJuKCBhQ29kZTIgKTsKKwl9CisJZWxzZSBpZiggYUNvZGUyID09IEV4ZWN1dGFibGVMaWI6Ol9JTkZJTklUWV8gKQorCXsKKwkJcmV0dXJuKCBhQ29kZTEgKTsKKwl9CisKKwlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfTUlOLCBhQ29kZTEsIGFDb2RlMikgKTsKK30KKworCitCRiBFeHByZXNzaW9uRXZhbDo6bWF4KGNvbnN0IEJGICYgYUNvZGUxLCBjb25zdCBCRiAmIGFDb2RlMikKK3sKKwlpZiggYUNvZGUxID09IEV4ZWN1dGFibGVMaWI6Ol9JTkZJTklUWV8gKQorCXsKKwkJcmV0dXJuKCBhQ29kZTEgKTsKKwl9CisJZWxzZSBpZiggYUNvZGUyID09IEV4ZWN1dGFibGVMaWI6Ol9JTkZJTklUWV8gKQorCXsKKwkJcmV0dXJuKCBhQ29kZTIgKTsKKwl9CisKKwlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfTUFYLCBhQ29kZTEsIGFDb2RlMikgKTsKK30KKworCisKK0JGIEV4cHJlc3Npb25FdmFsOjptaW4oY29uc3QgQkZDb2RlICYgYUNvZGUpCit7CisJQXZtQ29kZTo6c2l6ZV90eXBlIGFyZ0NvdW50ID0gYUNvZGUtPnNpemUoKTsKKworCWlmKCBhcmdDb3VudCA+IDIgKQorCXsKKwkJQkZMaXN0IHN5bWJvbGljVmFsdWU7CisJCUJGIG1pblZhbHVlOworCisJCUF2bUNvZGU6Oml0ZXJhdG9yIGl0QXJnID0gYUNvZGUtPmJlZ2luKCk7CisJCUF2bUNvZGU6Oml0ZXJhdG9yIGVuZEFyZyA9IGFDb2RlLT5lbmQoKTsKKwkJZm9yKCA7IGl0QXJnICE9IGVuZEFyZyA7ICsraXRBcmcgKQorCQl7CisJCQlpZiAoICgqaXRBcmcpLmlzTnVtZXJpYygpICkKKwkJCXsKKwkJCQltaW5WYWx1ZSA9ICgqaXRBcmcpOworCisJCQkJLy8gTkVYVAorCQkJCSsraXRBcmc7CisKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UgaWYoICgqaXRBcmcpICE9IEV4ZWN1dGFibGVMaWI6Ol9JTkZJTklUWV8gKQorCQkJeworCQkJCXN5bWJvbGljVmFsdWUuYWRkX3VuaW9uKCAoKml0QXJnKSApOworCQkJfQorCQl9CisKKwkJZm9yKCA7IGl0QXJnICE9IGVuZEFyZyA7ICsraXRBcmcgKQorCQl7CisJCQlpZiggKCppdEFyZykgPT0gRXhlY3V0YWJsZUxpYjo6X0lORklOSVRZXyApCisJCQl7CisvLwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJZWxzZSBpZiAoICgqaXRBcmcpLmlzTnVtZXJpYygpICkKKwkJCXsKKwkJCQltaW5WYWx1ZSA9IEV4cHJlc3Npb25FdmFsOjptaW4obWluVmFsdWUsICppdEFyZyk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJc3ltYm9saWNWYWx1ZS5hZGRfdW5pb24oICgqaXRBcmcpICk7CisJCQl9CisJCX0KKworCQlpZiggc3ltYm9saWNWYWx1ZS5ub25lbXB0eSgpICkKKwkJeworCQkJQkZDb2RlIG5ld0NvZGUoT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9NSU4pOworCQkJaWYoIG1pblZhbHVlLnZhbGlkKCkgKQorCQkJeworCQkJCW5ld0NvZGUtPmFwcGVuZCggbWluVmFsdWUgKTsKKwkJCX0KKwkJCW5ld0NvZGUtPmFwcGVuZCggc3ltYm9saWNWYWx1ZSApOworCisJCQlyZXR1cm4oIG5ld0NvZGUgKTsKKwkJfQorCQllbHNlIGlmKCBtaW5WYWx1ZS52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCBtaW5WYWx1ZSApOworCQl9CisJCWVsc2UgaWYoIGFDb2RlLT5ub25lbXB0eSgpICkKKwkJeworCQkJcmV0dXJuKCBhQ29kZS0+Zmlyc3QoKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuKCBhQ29kZSApOworCQl9CisJfQorCWVsc2UgaWYoIGFyZ0NvdW50ID09IDIgKQorCXsKKwkJcmV0dXJuKCBFeHByZXNzaW9uRXZhbDo6bWluKGFDb2RlLT5maXJzdCgpLCBhQ29kZS0+c2Vjb25kKCkpICk7CisJfQorCWVsc2UgaWYoIGFyZ0NvdW50ID09IDEgKQorCXsKKwkJcmV0dXJuKCBhQ29kZS0+Zmlyc3QoKSApOworCX0KKwllbHNlCisJeworCQlyZXR1cm4oIGFDb2RlICk7CisJfQorfQorCitCRiBFeHByZXNzaW9uRXZhbDo6bWF4KGNvbnN0IEJGQ29kZSAmIGFDb2RlKQoreworCUF2bUNvZGU6OnNpemVfdHlwZSBhcmdDb3VudCA9IGFDb2RlLT5zaXplKCk7CisKKwlpZiggYXJnQ291bnQgPiAyICkKKwl7CisJCUJGTGlzdCBzeW1ib2xpY1ZhbHVlOworCQlCRiBtYXhWYWx1ZTsKKworCQlBdm1Db2RlOjppdGVyYXRvciBpdEFyZyA9IGFDb2RlLT5iZWdpbigpOworCQlBdm1Db2RlOjppdGVyYXRvciBlbmRBcmcgPSBhQ29kZS0+ZW5kKCk7CisJCWZvciggOyBpdEFyZyAhPSBlbmRBcmcgOyArK2l0QXJnICkKKwkJeworCQkJaWYoICgqaXRBcmcpID09IEV4ZWN1dGFibGVMaWI6Ol9JTkZJTklUWV8gKQorCQkJeworCQkJCXJldHVybiggKml0QXJnICk7CisJCQl9CisKKwkJCWVsc2UgaWYgKCAoKml0QXJnKS5pc051bWVyaWMoKSApCisJCQl7CisJCQkJbWF4VmFsdWUgPSAoKml0QXJnKTsKKworCQkJCS8vIE5FWFQKKwkJCQkrK2l0QXJnOworCisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJc3ltYm9saWNWYWx1ZS5hZGRfdW5pb24oICgqaXRBcmcpICk7CisJCQl9CisJCX0KKworCQlmb3IoIDsgaXRBcmcgIT0gZW5kQXJnIDsgKytpdEFyZyApCisJCXsKKwkJCWlmKCAoKml0QXJnKSA9PSBFeGVjdXRhYmxlTGliOjpfSU5GSU5JVFlfICkKKwkJCXsKKwkJCQlyZXR1cm4oICgqaXRBcmcpICk7CisJCQl9CisKKwkJCWVsc2UgaWYgKCAoKml0QXJnKS5pc051bWVyaWMoKSApCisJCQl7CisJCQkJbWF4VmFsdWUgPSBFeHByZXNzaW9uRXZhbDo6bWF4KG1heFZhbHVlLCAqaXRBcmcpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXN5bWJvbGljVmFsdWUuYWRkX3VuaW9uKCAoKml0QXJnKSApOworCQkJfQorCQl9CisKKwkJaWYoIHN5bWJvbGljVmFsdWUubm9uZW1wdHkoKSApCisJCXsKKwkJCUJGQ29kZSBuZXdDb2RlKE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfTUFYKTsKKwkJCWlmKCBtYXhWYWx1ZS52YWxpZCgpICkKKwkJCXsKKwkJCQluZXdDb2RlLT5hcHBlbmQoIG1heFZhbHVlICk7CisJCQl9CisJCQluZXdDb2RlLT5hcHBlbmQoIHN5bWJvbGljVmFsdWUgKTsKKworCQkJcmV0dXJuKCBuZXdDb2RlICk7CisJCX0KKwkJZWxzZSBpZiggbWF4VmFsdWUudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggbWF4VmFsdWUgKTsKKwkJfQorCQllbHNlIGlmKCBhQ29kZS0+bm9uZW1wdHkoKSApCisJCXsKKwkJCXJldHVybiggYUNvZGUtPmZpcnN0KCkgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybiggYUNvZGUgKTsKKwkJfQorCX0KKwllbHNlIGlmKCBhcmdDb3VudCA9PSAyICkKKwl7CisJCXJldHVybiggRXhwcmVzc2lvbkV2YWw6Om1heChhQ29kZS0+Zmlyc3QoKSwgYUNvZGUtPnNlY29uZCgpKSApOworCX0KKwllbHNlIGlmKCBhcmdDb3VudCA9PSAxICkKKwl7CisJCXJldHVybiggYUNvZGUtPmZpcnN0KCkgKTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuKCBhQ29kZSApOworCX0KK30KKworCisKK0JGIEV4cHJlc3Npb25FdmFsOjptb2QoY29uc3QgQkYgJiBhQ29kZTEsIGNvbnN0IEJGICYgYUNvZGUyKQoreworCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdFeHByKAorCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9NT0QsIGFDb2RlMSwgYUNvZGUyKSApOworfQorCisKKworCitCRiBFeHByZXNzaW9uRXZhbDo6c3FydChjb25zdCBCRiAmIGFDb2RlKQoreworCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdFeHByKAorCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TUVJULCBhQ29kZSkgKTsKK30KKworCitCRiBFeHByZXNzaW9uRXZhbDo6ZXhwKGNvbnN0IEJGICYgYUNvZGUpCit7CisJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0V4cHIoCisJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0VYUCwgYUNvZGUpICk7Cit9CisKKworQkYgRXhwcmVzc2lvbkV2YWw6OmxuKGNvbnN0IEJGICYgYUNvZGUpCit7CisJc3dpdGNoKCBhQ29kZS5jbGFzc0tpbmQoKSApCisJeworCQljYXNlIEZPUk1fQlVJTFRJTl9JTlRFR0VSX0tJTkQ6CisJCXsKKwkJCWlmKCBhQ29kZS50b19wdHI8IEludGVnZXIgPigpLT50b0ludGVnZXIoKSA+IDAgKQorCQkJeworLy8JCQkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Zsb2F0KAorLy8JCQkJCQk6OmxuKGFDb2RlLnRvX3B0cjwgSW50ZWdlciA+KCktPnRvSW50ZWdlcigpKSkgKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBGT1JNX0JVSUxUSU5fRkxPQVRfS0lORDoKKwkJeworCQkJaWYoIGFDb2RlLnRvRmxvYXQoKSA+IDAgKQorCQkJeworLy8JCQkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Zsb2F0KAorLy8JCQkJCQk6OmxuKGFDb2RlLnRvRmxvYXQoKSkpICk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisKKwkJZGVmYXVsdDoKKwkJeworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3RXhwcigKKwkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfTE4sIGFDb2RlKSApOworfQorCisKK0JGIEV4cHJlc3Npb25FdmFsOjpsb2coY29uc3QgQkYgJiBhQ29kZSkKK3sKKwlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3RXhwcigKKwkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfTE9HLCBhQ29kZSkgKTsKK30KKworCisKKworQkYgRXhwcmVzc2lvbkV2YWw6OnNpbihjb25zdCBCRiAmIGFDb2RlKQoreworCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdFeHByKAorCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TSU4sIGFDb2RlKSApOworfQorCitCRiBFeHByZXNzaW9uRXZhbDo6Y29zKGNvbnN0IEJGICYgYUNvZGUpCit7CisJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0V4cHIoCisJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0NPUywgYUNvZGUpICk7Cit9CisKK0JGIEV4cHJlc3Npb25FdmFsOjp0YW4oY29uc3QgQkYgJiBhQ29kZSkKK3sKKwlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3RXhwcigKKwkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfVEFOLCBhQ29kZSkgKTsKK30KKworCisKKworCitCRiBFeHByZXNzaW9uRXZhbDo6c2luaChjb25zdCBCRiAmIGFDb2RlKQoreworCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdFeHByKAorCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TSU5ILCBhQ29kZSkgKTsKK30KKworQkYgRXhwcmVzc2lvbkV2YWw6OmNvc2goY29uc3QgQkYgJiBhQ29kZSkKK3sKKwlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3RXhwcigKKwkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQ09TSCwgYUNvZGUpICk7Cit9CisKK0JGIEV4cHJlc3Npb25FdmFsOjp0YW5oKGNvbnN0IEJGICYgYUNvZGUpCit7CisJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0V4cHIoCisJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1RBTkgsIGFDb2RlKSApOworfQorCisKKworQkYgRXhwcmVzc2lvbkV2YWw6OmFzaW4oY29uc3QgQkYgJiBhQ29kZSkKK3sKKwlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3RXhwcigKKwkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQVNJTiwgYUNvZGUpICk7Cit9CisKK0JGIEV4cHJlc3Npb25FdmFsOjphY29zKGNvbnN0IEJGICYgYUNvZGUpCit7CisJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0V4cHIoCisJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FDT1MsIGFDb2RlKSApOworfQorCitCRiBFeHByZXNzaW9uRXZhbDo6YXRhbihjb25zdCBCRiAmIGFDb2RlKQoreworCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdFeHByKAorCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BVEFOLCBhQ29kZSkgKTsKK30KKworCitCRiBFeHByZXNzaW9uRXZhbDo6YXRhbjIoY29uc3QgQkYgJiBhQ29kZTEsIGNvbnN0IEJGICYgYUNvZGUyKQoreworCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdFeHByKAorCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BVEFOMiwgYUNvZGUxLCBhQ29kZTIpICk7Cit9CisKKworCitCRiBFeHByZXNzaW9uRXZhbDo6YXNpbmgoY29uc3QgQkYgJiBhQ29kZSkKK3sKKwlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3RXhwcigKKwkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQVNJTkgsIGFDb2RlKSApOworfQorCitCRiBFeHByZXNzaW9uRXZhbDo6YWNvc2goY29uc3QgQkYgJiBhQ29kZSkKK3sKKwlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3RXhwcigKKwkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQUNPU0gsIGFDb2RlKSApOworfQorCitCRiBFeHByZXNzaW9uRXZhbDo6YXRhbmgoY29uc3QgQkYgJiBhQ29kZSkKK3sKKwlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3RXhwcigKKwkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQVRBTkgsIGFDb2RlKSApOworfQorCisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkV2YWwuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25FdmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYyZTQwYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25FdmFsLmgKQEAgLTAsMCArMSw4NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDEwIGTDqWMuIDIwMDkKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBFWFBSRVNTSU9ORVZBTF9IXworI2RlZmluZSBFWFBSRVNTSU9ORVZBTF9IXworCisjaW5jbHVkZSA8Y29tbW9uL0JGLmg+CisKKworCituYW1lc3BhY2Ugc2VwCit7CisKKworY2xhc3MgQXZtQ29kZTsKKworCisKK2NsYXNzIEV4cHJlc3Npb25FdmFsCit7CisKK3B1YmxpYzoKKworCXN0YXRpYyBCRiB2YWx1ZShjb25zdCBCRkNvZGUgJiBhQ29kZSwgYm9vbCBkZXN0cm95X2FyZyA9IHRydWUpOworCisKKwlzdGF0aWMgQkYgcmFuZG9tKGNvbnN0IEJGICYgYUNvZGUpOworCisJc3RhdGljIEJGIGFicyhjb25zdCBCRiAmIGFDb2RlKTsKKwlzdGF0aWMgQkYgY2VpbChjb25zdCBCRiAmIGFDb2RlKTsKKwlzdGF0aWMgQkYgZmxvb3IoY29uc3QgQkYgJiBhQ29kZSk7CisJc3RhdGljIEJGIHJvdW5kKGNvbnN0IEJGICYgYUNvZGUpOworCXN0YXRpYyBCRiB0cnVuY2F0ZShjb25zdCBCRiAmIGFDb2RlKTsKKworCisJc3RhdGljIEJGIG1pbihjb25zdCBCRiAmIGZyc3QsIGNvbnN0IEJGICYgc25kKTsKKwlzdGF0aWMgQkYgbWF4KGNvbnN0IEJGICYgZnJzdCwgY29uc3QgQkYgJiBzbmQpOworCisJc3RhdGljIEJGIG1pbihjb25zdCBCRkNvZGUgJiBhQ29kZSk7CisJc3RhdGljIEJGIG1heChjb25zdCBCRkNvZGUgJiBhQ29kZSk7CisKKworCXN0YXRpYyBCRiBtb2QoY29uc3QgQkYgJiBhQ29kZTEsIGNvbnN0IEJGICYgYUNvZGUyKTsKKworCXN0YXRpYyBCRiBzcXJ0KGNvbnN0IEJGICYgYUNvZGUpOworCisJc3RhdGljIEJGIGV4cChjb25zdCBCRiAmIGFDb2RlKTsKKwlzdGF0aWMgQkYgbG4oY29uc3QgQkYgJiBhQ29kZSk7CisJc3RhdGljIEJGIGxvZyhjb25zdCBCRiAmIGFDb2RlKTsKKworCXN0YXRpYyBCRiBzaW4oY29uc3QgQkYgJiBhQ29kZSk7CisJc3RhdGljIEJGIGNvcyhjb25zdCBCRiAmIGFDb2RlKTsKKwlzdGF0aWMgQkYgdGFuKGNvbnN0IEJGICYgYUNvZGUpOworCisJc3RhdGljIEJGIHNpbmgoY29uc3QgQkYgJiBhQ29kZSk7CisJc3RhdGljIEJGIGNvc2goY29uc3QgQkYgJiBhQ29kZSk7CisJc3RhdGljIEJGIHRhbmgoY29uc3QgQkYgJiBhQ29kZSk7CisKKwlzdGF0aWMgQkYgYXNpbihjb25zdCBCRiAmIGFDb2RlKTsKKwlzdGF0aWMgQkYgYWNvcyhjb25zdCBCRiAmIGFDb2RlKTsKKwlzdGF0aWMgQkYgYXRhbihjb25zdCBCRiAmIGFDb2RlKTsKKwlzdGF0aWMgQkYgYXRhbjIoY29uc3QgQkYgJiBhQ29kZTEsIGNvbnN0IEJGICYgYUNvZGUyKTsKKworCXN0YXRpYyBCRiBhc2luaChjb25zdCBCRiAmIGFDb2RlKTsKKwlzdGF0aWMgQkYgYWNvc2goY29uc3QgQkYgJiBhQ29kZSk7CisJc3RhdGljIEJGIGF0YW5oKGNvbnN0IEJGICYgYUNvZGUpOworCisKKworfTsKKworfQorCisjZW5kaWYgLyogRVhQUkVTU0lPTkVWQUxfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25GYWN0b3J5LmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25GYWN0b3J5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjg5YjdiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkZhY3RvcnkuY3BwCkBAIC0wLDAgKzEsMTI3MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDkganVpbC4gMjAwOQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiRXhwcmVzc2lvbkZhY3RvcnkuaCIKKworI2luY2x1ZGUgPGZtbC9idWlsdGluL0Jvb2xlYW4uaD4KKyNpbmNsdWRlIDxmbWwvYnVpbHRpbi9DaGFyYWN0ZXIuaD4KKyNpbmNsdWRlIDxmbWwvYnVpbHRpbi9JZGVudGlmaWVyLmg+CisjaW5jbHVkZSA8Zm1sL2J1aWx0aW4vU3RyaW5nLmg+CisjaW5jbHVkZSA8Zm1sL2J1aWx0aW4vUXVhbGlmaWVkSWRlbnRpZmllci5oPgorCisjaW5jbHVkZSA8Zm1sL251bWVyaWMvRmxvYXQuaD4KKyNpbmNsdWRlIDxmbWwvbnVtZXJpYy9JbnRlZ2VyLmg+CisjaW5jbHVkZSA8Zm1sL251bWVyaWMvUmF0aW9uYWwuaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25Db25zdGFudC5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25UeXBlQ2hlY2tlci5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL1N0YXRlbWVudENvbnN0cnVjdG9yLmg+CisKKyNpbmNsdWRlIDxmbWwvb3BlcmF0b3IvT3BlcmF0b3JNYW5hZ2VyLmg+CisKKyNpbmNsdWRlIDxmbWwvbGliL0F2bU9wZXJhdGlvbkZhY3RvcnkuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoqCisgKiBMT0FERVIKKyAqLwordm9pZCBFeHByZXNzaW9uRmFjdG9yeTo6bG9hZCgpCit7CisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFNQRUNJRklDIEVERU4gSU1QTEVNRU5UQVRJT04gIG9yIE5PVAorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlFeHByZXNzaW9uQ29uc3RhbnQ6OmxvYWQoKTsKKworCVN0cmluZzo6bG9hZCgpOworCisJT3BlcmF0b3JNYW5hZ2VyOjpsb2FkKCk7CisKKwlBdm1PcGVyYXRpb25GYWN0b3J5Ojpsb2FkKCk7Cit9CisKKworLyoqCisgKiBESVNQT1NFUgorICovCit2b2lkIEV4cHJlc3Npb25GYWN0b3J5OjpkaXNwb3NlKCkKK3sKKwlBdm1PcGVyYXRpb25GYWN0b3J5OjpkaXNwb3NlKCk7CisKKwlPcGVyYXRvck1hbmFnZXI6OmRpc3Bvc2UoKTsKKworCVN0cmluZzo6ZGlzcG9zZSgpOworCisJRXhwcmVzc2lvbkNvbnN0YW50OjpkaXNwb3NlKCk7Cit9CisKKworLyoqCisgKiBDT05GSUdVUkUKKyAqLworYm9vbCBFeHByZXNzaW9uRmFjdG9yeTo6Y29uZmlndXJlKCkKK3sKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisKKy8qKgorICogQ09NUEFSSVNPTgorICogd2l0aCBUUlVFICYgRkFMU0UKKyAqLworCitib29sIEV4cHJlc3Npb25GYWN0b3J5Ojppc0Jvb2xlYW4oY29uc3QgQkYgJiB2YWx1ZSkKK3sKKwlzd2l0Y2goIHZhbHVlLmNsYXNzS2luZCgpICkKKwl7CisJCS8vY2FzZSBDTEFTU19LSU5EX1QoIEJvb2xlYW4gKToKKwkJY2FzZSBGT1JNX0JVSUxUSU5fQk9PTEVBTl9LSU5EOgorCQl7CisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KK30KKworYm9vbCBFeHByZXNzaW9uRmFjdG9yeTo6dG9Cb29sZWFuKGNvbnN0IEJGICYgdmFsdWUpCit7CisJc3dpdGNoKCB2YWx1ZS5jbGFzc0tpbmQoKSApCisJeworCQljYXNlIEZPUk1fQlVJTFRJTl9CT09MRUFOX0tJTkQ6CisJCXsKKwkJCXJldHVybiggdmFsdWUudG9fcHRyPCBCb29sZWFuID4oKS0+Z2V0VmFsdWUoKSApOworCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorfQorCisKK2Jvb2wgRXhwcmVzc2lvbkZhY3Rvcnk6OmlzRXF1YWxGYWxzZShjb25zdCBCRiAmIHZhbHVlKQoreworCXN3aXRjaCAoIHZhbHVlLmNsYXNzS2luZCgpICkKKwl7CisJCWNhc2UgRk9STV9CVUlMVElOX0JPT0xFQU5fS0lORDoKKwkJeworCQkJcmV0dXJuKCB2YWx1ZS50b19wdHI8IEJvb2xlYW4gPigpLT5nZXRWYWx1ZSgpID09IGZhbHNlICk7CisJCX0KKworCQlkZWZhdWx0IDoKKwkJeworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorfQorCitib29sIEV4cHJlc3Npb25GYWN0b3J5Ojppc05vdEVxdWFsRmFsc2UoY29uc3QgQkYgJiB2YWx1ZSkKK3sKKwlzd2l0Y2ggKCB2YWx1ZS5jbGFzc0tpbmQoKSApCisJeworCQljYXNlIEZPUk1fQlVJTFRJTl9CT09MRUFOX0tJTkQ6CisJCXsKKwkJCXJldHVybiggdmFsdWUudG9fcHRyPCBCb29sZWFuID4oKS0+Z2V0VmFsdWUoKSAhPSBmYWxzZSApOworCQl9CisKKwkJZGVmYXVsdCA6CisJCXsKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisJfQorfQorCisKK2Jvb2wgRXhwcmVzc2lvbkZhY3Rvcnk6OmlzRXF1YWxUcnVlKGNvbnN0IEJGICYgdmFsdWUpCit7CisJc3dpdGNoICggdmFsdWUuY2xhc3NLaW5kKCkgKQorCXsKKwkJY2FzZSBGT1JNX0JVSUxUSU5fQk9PTEVBTl9LSU5EOgorCQl7CisJCQlyZXR1cm4oIHZhbHVlLnRvX3B0cjwgQm9vbGVhbiA+KCktPmdldFZhbHVlKCkgPT0gdHJ1ZSApOworCQl9CisKKwkJZGVmYXVsdCA6CisJCXsKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KK30KKworYm9vbCBFeHByZXNzaW9uRmFjdG9yeTo6aXNOb3RFcXVhbFRydWUoY29uc3QgQkYgJiB2YWx1ZSkKK3sKKwlzd2l0Y2ggKCB2YWx1ZS5jbGFzc0tpbmQoKSApCisJeworCQljYXNlIEZPUk1fQlVJTFRJTl9CT09MRUFOX0tJTkQ6CisJCXsKKwkJCXJldHVybiggdmFsdWUudG9fcHRyPCBCb29sZWFuID4oKS0+Z2V0VmFsdWUoKSAhPSB0cnVlICk7CisJCX0KKworCQlkZWZhdWx0IDoKKwkJeworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwl9Cit9CisKKworCisKKworLyoqCisgKiBHRVRURVIKKyAqIGZvciBzaW1wbGUgb3IgbnVtZXJpYyBraW5kCisgKi8KKworYm9vbCBFeHByZXNzaW9uRmFjdG9yeTo6aXNOdW1iZXIoY29uc3QgQkYgJiB2YWx1ZSkKK3sKKwlzd2l0Y2goIHZhbHVlLmNsYXNzS2luZCgpICkKKwl7CisJCWNhc2UgRk9STV9CVUlMVElOX0lOVEVHRVJfS0lORDoKKwkJY2FzZSBGT1JNX0JVSUxUSU5fUkFUSU9OQUxfS0lORDoKKwkJY2FzZSBGT1JNX0JVSUxUSU5fRkxPQVRfS0lORDoKKwkJeworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKwl9Cit9CisKKworYm9vbCBFeHByZXNzaW9uRmFjdG9yeTo6aXNJbnQzMihjb25zdCBCRiAmIHZhbHVlKQoreworCXN3aXRjaCggdmFsdWUuY2xhc3NLaW5kKCkgKQorCXsKKwkJY2FzZSBGT1JNX0JVSUxUSU5fSU5URUdFUl9LSU5EOgorCQl7CisJCQlyZXR1cm4oIHZhbHVlLnRvX3B0cjwgSW50ZWdlciA+KCktPmlzSW50MzIoKSApOworCQl9CisKKwkJY2FzZSBGT1JNX0JVSUxUSU5fUkFUSU9OQUxfS0lORDoKKwkJeworCQkJcmV0dXJuKCB2YWx1ZS50b19wdHI8IFJhdGlvbmFsID4oKS0+aXNJbnQzMigpICk7CisJCX0KKworCQljYXNlIEZPUk1fQlVJTFRJTl9GTE9BVF9LSU5EOgorCQl7CisJCQlyZXR1cm4oIHZhbHVlLnRvX3B0cjwgRmxvYXQgPigpLT5pc0ludDMyKCkgKTsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KK30KKworYXZtX2ludDMyX3QgRXhwcmVzc2lvbkZhY3Rvcnk6OnRvSW50MzIoY29uc3QgQkYgJiB2YWx1ZSkKK3sKKwlzd2l0Y2goIHZhbHVlLmNsYXNzS2luZCgpICkKKwl7CisJCWNhc2UgRk9STV9CVUlMVElOX0lOVEVHRVJfS0lORDoKKwkJeworCQkJcmV0dXJuKCB2YWx1ZS50b19wdHI8IEludGVnZXIgPigpLT50b0ludDMyKCkgKTsKKwkJfQorCisJCWNhc2UgRk9STV9CVUlMVElOX1JBVElPTkFMX0tJTkQ6CisJCXsKKwkJCXJldHVybiggdmFsdWUudG9fcHRyPCBSYXRpb25hbCA+KCktPnRvSW50MzIoKSApOworCQl9CisKKwkJY2FzZSBGT1JNX0JVSUxUSU5fRkxPQVRfS0lORDoKKwkJeworCQkJcmV0dXJuKCB2YWx1ZS50b19wdHI8IEZsb2F0ID4oKS0+dG9JbnQzMigpICk7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlyZXR1cm4oIDAgKTsKKwkJfQorCX0KK30KKworCitib29sIEV4cHJlc3Npb25GYWN0b3J5Ojppc0ludDY0KGNvbnN0IEJGICYgdmFsdWUpCit7CisJc3dpdGNoKCB2YWx1ZS5jbGFzc0tpbmQoKSApCisJeworCQljYXNlIEZPUk1fQlVJTFRJTl9JTlRFR0VSX0tJTkQ6CisJCXsKKwkJCXJldHVybiggdmFsdWUudG9fcHRyPCBJbnRlZ2VyID4oKS0+aXNJbnQ2NCgpICk7CisJCX0KKworCQljYXNlIEZPUk1fQlVJTFRJTl9SQVRJT05BTF9LSU5EOgorCQl7CisJCQlyZXR1cm4oIHZhbHVlLnRvX3B0cjwgUmF0aW9uYWwgPigpLT5pc0ludDY0KCkgKTsKKwkJfQorCisJCWNhc2UgRk9STV9CVUlMVElOX0ZMT0FUX0tJTkQ6CisJCXsKKwkJCXJldHVybiggdmFsdWUudG9fcHRyPCBGbG9hdCA+KCktPmlzSW50NjQoKSApOworCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorfQorCithdm1faW50NjRfdCBFeHByZXNzaW9uRmFjdG9yeTo6dG9JbnQ2NChjb25zdCBCRiAmIHZhbHVlKQoreworCXN3aXRjaCggdmFsdWUuY2xhc3NLaW5kKCkgKQorCXsKKwkJY2FzZSBGT1JNX0JVSUxUSU5fSU5URUdFUl9LSU5EOgorCQl7CisJCQlyZXR1cm4oIHZhbHVlLnRvX3B0cjwgSW50ZWdlciA+KCktPnRvSW50NjQoKSApOworCQl9CisKKwkJY2FzZSBGT1JNX0JVSUxUSU5fUkFUSU9OQUxfS0lORDoKKwkJeworCQkJcmV0dXJuKCB2YWx1ZS50b19wdHI8IFJhdGlvbmFsID4oKS0+dG9JbnQ2NCgpICk7CisJCX0KKworCQljYXNlIEZPUk1fQlVJTFRJTl9GTE9BVF9LSU5EOgorCQl7CisJCQlyZXR1cm4oIHZhbHVlLnRvX3B0cjwgRmxvYXQgPigpLT50b0ludDY0KCkgKTsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCXJldHVybiggMCApOworCQl9CisJfQorfQorCisKK2Jvb2wgRXhwcmVzc2lvbkZhY3Rvcnk6OmlzSW50ZWdlcihjb25zdCBCRiAmIHZhbHVlKQoreworCXN3aXRjaCggdmFsdWUuY2xhc3NLaW5kKCkgKQorCXsKKwkJY2FzZSBGT1JNX0JVSUxUSU5fSU5URUdFUl9LSU5EOgorCQl7CisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWNhc2UgRk9STV9CVUlMVElOX1JBVElPTkFMX0tJTkQ6CisJCXsKKwkJCXJldHVybiggdmFsdWUudG9fcHRyPCBSYXRpb25hbCA+KCktPmlzSW50ZWdlcigpICk7CisJCX0KKworCQljYXNlIEZPUk1fQlVJTFRJTl9GTE9BVF9LSU5EOgorCQl7CisJCQlyZXR1cm4oIHZhbHVlLnRvX3B0cjwgRmxvYXQgPigpLT5pc0ludGVnZXIoKSApOworCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorfQorCithdm1faW50ZWdlcl90IEV4cHJlc3Npb25GYWN0b3J5Ojp0b0ludGVnZXIoY29uc3QgQkYgJiB2YWx1ZSkKK3sKKwlzd2l0Y2goIHZhbHVlLmNsYXNzS2luZCgpICkKKwl7CisJCWNhc2UgRk9STV9CVUlMVElOX0lOVEVHRVJfS0lORDoKKwkJeworCQkJcmV0dXJuKCB2YWx1ZS50b19wdHI8IEludGVnZXIgPigpLT50b0ludGVnZXIoKSApOworCQl9CisKKwkJY2FzZSBGT1JNX0JVSUxUSU5fUkFUSU9OQUxfS0lORDoKKwkJeworCQkJcmV0dXJuKCB2YWx1ZS50b19wdHI8IFJhdGlvbmFsID4oKS0+dG9JbnRlZ2VyKCkgKTsKKwkJfQorCisJCWNhc2UgRk9STV9CVUlMVElOX0ZMT0FUX0tJTkQ6CisJCXsKKwkJCXJldHVybiggdmFsdWUudG9fcHRyPCBGbG9hdCA+KCktPnRvSW50ZWdlcigpICk7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlyZXR1cm4oIDAgKTsKKwkJfQorCX0KK30KKworCitib29sIEV4cHJlc3Npb25GYWN0b3J5Ojppc1Bvc0ludGVnZXIoY29uc3QgQkYgJiB2YWx1ZSkKK3sKKwlzd2l0Y2goIHZhbHVlLmNsYXNzS2luZCgpICkKKwl7CisJCWNhc2UgRk9STV9CVUlMVElOX0lOVEVHRVJfS0lORDoKKwkJeworCQkJcmV0dXJuKCB2YWx1ZS50b19wdHI8IEludGVnZXIgPigpLT5pc1Bvc0ludGVnZXIoKSApOworCQl9CisKKwkJY2FzZSBGT1JNX0JVSUxUSU5fUkFUSU9OQUxfS0lORDoKKwkJeworCQkJcmV0dXJuKCB2YWx1ZS50b19wdHI8IFJhdGlvbmFsID4oKS0+aXNQb3NJbnRlZ2VyKCkgKTsKKwkJfQorCisJCWNhc2UgRk9STV9CVUlMVElOX0ZMT0FUX0tJTkQ6CisJCXsKKwkJCXJldHVybiggdmFsdWUudG9fcHRyPCBGbG9hdCA+KCktPmlzUG9zSW50ZWdlcigpICk7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKwl9Cit9CisKKworYm9vbCBFeHByZXNzaW9uRmFjdG9yeTo6aXNVSW50ZWdlcihjb25zdCBCRiAmIHZhbHVlKQoreworCXN3aXRjaCggdmFsdWUuY2xhc3NLaW5kKCkgKQorCXsKKwkJY2FzZSBGT1JNX0JVSUxUSU5fSU5URUdFUl9LSU5EOgorCQl7CisJCQlyZXR1cm4oIHZhbHVlLnRvX3B0cjwgSW50ZWdlciA+KCktPmlzVUludGVnZXIoKSApOworCQl9CisKKwkJY2FzZSBGT1JNX0JVSUxUSU5fUkFUSU9OQUxfS0lORDoKKwkJeworCQkJcmV0dXJuKCB2YWx1ZS50b19wdHI8IFJhdGlvbmFsID4oKS0+aXNVSW50ZWdlcigpICk7CisJCX0KKworCQljYXNlIEZPUk1fQlVJTFRJTl9GTE9BVF9LSU5EOgorCQl7CisJCQlyZXR1cm4oIHZhbHVlLnRvX3B0cjwgRmxvYXQgPigpLT5pc1VJbnRlZ2VyKCkgKTsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KK30KKworYXZtX3VpbnRlZ2VyX3QgRXhwcmVzc2lvbkZhY3Rvcnk6OnRvVUludGVnZXIoY29uc3QgQkYgJiB2YWx1ZSkKK3sKKwlzd2l0Y2goIHZhbHVlLmNsYXNzS2luZCgpICkKKwl7CisJCWNhc2UgRk9STV9CVUlMVElOX0lOVEVHRVJfS0lORDoKKwkJeworCQkJcmV0dXJuKCB2YWx1ZS50b19wdHI8IEludGVnZXIgPigpLT50b1VJbnRlZ2VyKCkgKTsKKwkJfQorCisJCWNhc2UgRk9STV9CVUlMVElOX1JBVElPTkFMX0tJTkQ6CisJCXsKKwkJCXJldHVybiggdmFsdWUudG9fcHRyPCBSYXRpb25hbCA+KCktPnRvVUludGVnZXIoKSApOworCQl9CisKKwkJY2FzZSBGT1JNX0JVSUxUSU5fRkxPQVRfS0lORDoKKwkJeworCQkJcmV0dXJuKCB2YWx1ZS50b19wdHI8IEZsb2F0ID4oKS0+dG9VSW50ZWdlcigpICk7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlyZXR1cm4oIDAgKTsKKwkJfQorCX0KK30KKworCisKKworCitib29sIEV4cHJlc3Npb25GYWN0b3J5Ojppc1JhdGlvbmFsKGNvbnN0IEJGICYgdmFsdWUpCit7CisJc3dpdGNoKCB2YWx1ZS5jbGFzc0tpbmQoKSApCisJeworCQljYXNlIEZPUk1fQlVJTFRJTl9JTlRFR0VSX0tJTkQ6CisJCWNhc2UgRk9STV9CVUlMVElOX1JBVElPTkFMX0tJTkQ6CisJCXsKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisKKwkJY2FzZSBGT1JNX0JVSUxUSU5fRkxPQVRfS0lORDoKKwkJeworCQkJcmV0dXJuKCB2YWx1ZS50b19wdHI8IEZsb2F0ID4oKS0+aXNSYXRpb25hbCgpICk7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKwl9Cit9CisKK2F2bV9pbnRlZ2VyX3QgRXhwcmVzc2lvbkZhY3Rvcnk6OnRvRGVub21pbmF0b3IoY29uc3QgQkYgJiB2YWx1ZSkKK3sKKwlzd2l0Y2goIHZhbHVlLmNsYXNzS2luZCgpICkKKwl7CisJCWNhc2UgRk9STV9CVUlMVElOX0lOVEVHRVJfS0lORDoKKwkJeworCQkJcmV0dXJuKCB2YWx1ZS50b19wdHI8IEludGVnZXIgPigpLT50b0Rlbm9taW5hdG9yKCkgKTsKKwkJfQorCisJCWNhc2UgRk9STV9CVUlMVElOX1JBVElPTkFMX0tJTkQ6CisJCXsKKwkJCXJldHVybiggdmFsdWUudG9fcHRyPCBSYXRpb25hbCA+KCktPnRvRGVub21pbmF0b3IoKSApOworCQl9CisKKwkJY2FzZSBGT1JNX0JVSUxUSU5fRkxPQVRfS0lORDoKKwkJeworCQkJcmV0dXJuKCB2YWx1ZS50b19wdHI8IEZsb2F0ID4oKS0+dG9EZW5vbWluYXRvcigpICk7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlyZXR1cm4oIDAgKTsKKwkJfQorCX0KK30KK2F2bV9pbnRlZ2VyX3QgRXhwcmVzc2lvbkZhY3Rvcnk6OnRvTnVtZXJhdG9yKGNvbnN0IEJGICYgdmFsdWUpCit7CisJc3dpdGNoKCB2YWx1ZS5jbGFzc0tpbmQoKSApCisJeworCQljYXNlIEZPUk1fQlVJTFRJTl9JTlRFR0VSX0tJTkQ6CisJCXsKKwkJCXJldHVybiggdmFsdWUudG9fcHRyPCBJbnRlZ2VyID4oKS0+dG9OdW1lcmF0b3IoKSApOworCQl9CisKKwkJY2FzZSBGT1JNX0JVSUxUSU5fUkFUSU9OQUxfS0lORDoKKwkJeworCQkJcmV0dXJuKCB2YWx1ZS50b19wdHI8IFJhdGlvbmFsID4oKS0+dG9OdW1lcmF0b3IoKSApOworCQl9CisKKwkJY2FzZSBGT1JNX0JVSUxUSU5fRkxPQVRfS0lORDoKKwkJeworCQkJcmV0dXJuKCB2YWx1ZS50b19wdHI8IEZsb2F0ID4oKS0+dG9OdW1lcmF0b3IoKSApOworCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJcmV0dXJuKCAwICk7CisJCX0KKwl9Cit9CisKKworYm9vbCBFeHByZXNzaW9uRmFjdG9yeTo6aXNGbG9hdChjb25zdCBCRiAmIHZhbHVlKQoreworCXN3aXRjaCggdmFsdWUuY2xhc3NLaW5kKCkgKQorCXsKKwkJY2FzZSBGT1JNX0JVSUxUSU5fSU5URUdFUl9LSU5EOgorCQljYXNlIEZPUk1fQlVJTFRJTl9SQVRJT05BTF9LSU5EOgorCQljYXNlIEZPUk1fQlVJTFRJTl9GTE9BVF9LSU5EOgorCQl7CisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KK30KKworYXZtX2Zsb2F0X3QgRXhwcmVzc2lvbkZhY3Rvcnk6OnRvRmxvYXQoY29uc3QgQkYgJiB2YWx1ZSkKK3sKKwlzd2l0Y2goIHZhbHVlLmNsYXNzS2luZCgpICkKKwl7CisJCWNhc2UgRk9STV9CVUlMVElOX0lOVEVHRVJfS0lORDoKKwkJeworCQkJcmV0dXJuKCB2YWx1ZS50b19wdHI8IEludGVnZXIgPigpLT50b0Zsb2F0KCkgKTsKKwkJfQorCisJCWNhc2UgRk9STV9CVUlMVElOX1JBVElPTkFMX0tJTkQ6CisJCXsKKwkJCXJldHVybiggdmFsdWUudG9fcHRyPCBSYXRpb25hbCA+KCktPnRvRmxvYXQoKSApOworCQl9CisKKwkJY2FzZSBGT1JNX0JVSUxUSU5fRkxPQVRfS0lORDoKKwkJeworCQkJcmV0dXJuKCB2YWx1ZS50b19wdHI8IEZsb2F0ID4oKS0+dG9GbG9hdCgpICk7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlyZXR1cm4oIDAgKTsKKwkJfQorCX0KK30KKworCitib29sIEV4cHJlc3Npb25GYWN0b3J5Ojppc1JlYWwoY29uc3QgQkYgJiB2YWx1ZSkKK3sKKwlzd2l0Y2goIHZhbHVlLmNsYXNzS2luZCgpICkKKwl7CisJCWNhc2UgRk9STV9CVUlMVElOX0lOVEVHRVJfS0lORDoKKwkJY2FzZSBGT1JNX0JVSUxUSU5fUkFUSU9OQUxfS0lORDoKKwkJY2FzZSBGT1JNX0JVSUxUSU5fRkxPQVRfS0lORDoKKwkJeworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKwl9Cit9CisKK2F2bV9yZWFsX3QgRXhwcmVzc2lvbkZhY3Rvcnk6OnRvUmVhbChjb25zdCBCRiAmIHZhbHVlKQoreworCXN3aXRjaCggdmFsdWUuY2xhc3NLaW5kKCkgKQorCXsKKwkJY2FzZSBGT1JNX0JVSUxUSU5fSU5URUdFUl9LSU5EOgorCQl7CisJCQlyZXR1cm4oIHZhbHVlLnRvX3B0cjwgSW50ZWdlciA+KCktPnRvUmVhbCgpICk7CisJCX0KKworCQljYXNlIEZPUk1fQlVJTFRJTl9SQVRJT05BTF9LSU5EOgorCQl7CisJCQlyZXR1cm4oIHZhbHVlLnRvX3B0cjwgUmF0aW9uYWwgPigpLT50b1JlYWwoKSApOworCQl9CisKKwkJY2FzZSBGT1JNX0JVSUxUSU5fRkxPQVRfS0lORDoKKwkJeworCQkJcmV0dXJuKCB2YWx1ZS50b19wdHI8IEZsb2F0ID4oKS0+dG9SZWFsKCkgKTsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCXJldHVybiggMCApOworCQl9CisJfQorfQorCisKKworYm9vbCBFeHByZXNzaW9uRmFjdG9yeTo6aXNDaGFyYWN0ZXIoY29uc3QgQkYgJiB2YWx1ZSkKK3sKKwlzd2l0Y2goIHZhbHVlLmNsYXNzS2luZCgpICkKKwl7CisJCWNhc2UgRk9STV9CVUlMVElOX0NIQVJBQ1RFUl9LSU5EOgorCQl7CisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KK30KKworY2hhciBFeHByZXNzaW9uRmFjdG9yeTo6dG9DaGFyYWN0ZXIoY29uc3QgQkYgJiB2YWx1ZSkKK3sKKwlzd2l0Y2goIHZhbHVlLmNsYXNzS2luZCgpICkKKwl7CisJCWNhc2UgRk9STV9CVUlMVElOX0NIQVJBQ1RFUl9LSU5EOgorCQl7CisJCQlyZXR1cm4oIHZhbHVlLnRvX3B0cjwgQ2hhcmFjdGVyID4oKS0+Z2V0VmFsdWUoKSApOworCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJcmV0dXJuKCAwICk7CisJCX0KKwl9Cit9CisKKworCitib29sIEV4cHJlc3Npb25GYWN0b3J5Ojppc0lkZW50aWZpZXIoY29uc3QgQkYgJiB2YWx1ZSkKK3sKKwlzd2l0Y2goIHZhbHVlLmNsYXNzS2luZCgpICkKKwl7CisJCWNhc2UgRk9STV9CVUlMVElOX0lERU5USUZJRVJfS0lORDoKKwkJeworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKK3N0ZDo6c3RyaW5nIEV4cHJlc3Npb25GYWN0b3J5Ojp0b0lkZW50aWZpZXIoY29uc3QgQkYgJiB2YWx1ZSkKK3sKKwlzd2l0Y2goIHZhbHVlLmNsYXNzS2luZCgpICkKKwl7CisJCWNhc2UgRk9STV9CVUlMVElOX0lERU5USUZJRVJfS0lORDoKKwkJeworCQkJcmV0dXJuKCB2YWx1ZS50b19wdHI8IElkZW50aWZpZXIgPigpLT5nZXRWYWx1ZSgpICk7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlyZXR1cm4oICIiICk7CisJCX0KKwl9Cit9CisKKworYm9vbCBFeHByZXNzaW9uRmFjdG9yeTo6aXNVZmkoY29uc3QgQkYgJiB2YWx1ZSkKK3sKKwlzd2l0Y2goIHZhbHVlLmNsYXNzS2luZCgpICkKKwl7CisJCWNhc2UgRk9STV9CVUlMVElOX1FVQUxJRklFRF9JREVOVElGSUVSX0tJTkQ6CisJCXsKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorfQorCitzdGQ6OnN0cmluZyBFeHByZXNzaW9uRmFjdG9yeTo6dG9VZmkoY29uc3QgQkYgJiB2YWx1ZSkKK3sKKwlzd2l0Y2goIHZhbHVlLmNsYXNzS2luZCgpICkKKwl7CisJCWNhc2UgRk9STV9CVUlMVElOX1FVQUxJRklFRF9JREVOVElGSUVSX0tJTkQ6CisJCXsKKwkJCXJldHVybiggdmFsdWUudG9fcHRyPCBRdWFsaWZpZWRJZGVudGlmaWVyID4oKS0+Z2V0VmFsdWUoKSApOworCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJcmV0dXJuKCAiIiApOworCQl9CisJfQorfQorCisKK2Jvb2wgRXhwcmVzc2lvbkZhY3Rvcnk6OmlzVWZpZChjb25zdCBCRiAmIHZhbHVlKQoreworCXN3aXRjaCggdmFsdWUuY2xhc3NLaW5kKCkgKQorCXsKKwkJY2FzZSBGT1JNX0JVSUxUSU5fSURFTlRJRklFUl9LSU5EOgorCQljYXNlIEZPUk1fQlVJTFRJTl9RVUFMSUZJRURfSURFTlRJRklFUl9LSU5EOgorCQl7CisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KK30KKworc3RkOjpzdHJpbmcgRXhwcmVzc2lvbkZhY3Rvcnk6OnRvVWZpZChjb25zdCBCRiAmIHZhbHVlKQoreworCXN3aXRjaCggdmFsdWUuY2xhc3NLaW5kKCkgKQorCXsKKwkJY2FzZSBGT1JNX0JVSUxUSU5fSURFTlRJRklFUl9LSU5EOgorCQl7CisJCQlyZXR1cm4oIHZhbHVlLnRvX3B0cjwgSWRlbnRpZmllciA+KCktPmdldFZhbHVlKCkgKTsKKwkJfQorCQljYXNlIEZPUk1fQlVJTFRJTl9RVUFMSUZJRURfSURFTlRJRklFUl9LSU5EOgorCQl7CisJCQlyZXR1cm4oIHZhbHVlLnRvX3B0cjwgUXVhbGlmaWVkSWRlbnRpZmllciA+KCktPmdldFZhbHVlKCkgKTsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCXJldHVybiggIiIgKTsKKwkJfQorCX0KK30KKworCitib29sIEV4cHJlc3Npb25GYWN0b3J5Ojppc0VudW1TeW1ib2woY29uc3QgQkYgJiB2YWx1ZSkKK3sKKwlzd2l0Y2goIHZhbHVlLmNsYXNzS2luZCgpICkKKwl7CisJCWNhc2UgRk9STV9JTlNUQU5DRV9EQVRBX0tJTkQ6CisJCXsKKwkJCXJldHVybiggdmFsdWUudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCktPmlzRW51bVN5bWJvbFBvaW50ZXIoKSApOworCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCitzdGQ6OnN0cmluZyBFeHByZXNzaW9uRmFjdG9yeTo6c3RyRW51bVN5bWJvbChjb25zdCBCRiAmIHZhbHVlKQoreworCXN3aXRjaCggdmFsdWUuY2xhc3NLaW5kKCkgKQorCXsKKwkJY2FzZSBGT1JNX0lOU1RBTkNFX0RBVEFfS0lORDoKKwkJeworCQkJcmV0dXJuKCB2YWx1ZS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSApOworCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJcmV0dXJuKCAiIiApOworCQl9CisJfQorfQorCisKK2Jvb2wgRXhwcmVzc2lvbkZhY3Rvcnk6OmlzQnVpbHRpblN0cmluZyhjb25zdCBCRiAmIHZhbHVlKQoreworCXN3aXRjaCggdmFsdWUuY2xhc3NLaW5kKCkgKQorCXsKKwkJY2FzZSBGT1JNX0JVSUxUSU5fU1RSSU5HX0tJTkQ6CisJCXsKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCitzdGQ6OnN0cmluZyBFeHByZXNzaW9uRmFjdG9yeTo6dG9CdWlsdGluU3RyaW5nKGNvbnN0IEJGICYgdmFsdWUpCit7CisJc3dpdGNoKCB2YWx1ZS5jbGFzc0tpbmQoKSApCisJeworCQljYXNlIEZPUk1fQlVJTFRJTl9TVFJJTkdfS0lORDoKKwkJeworCQkJcmV0dXJuKCB2YWx1ZS50b19wdHI8IFN0cmluZyA+KCktPmdldFZhbHVlKCkgKTsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCXJldHVybiggIiIgKTsKKwkJfQorCX0KK30KKworCisKK2Jvb2wgRXhwcmVzc2lvbkZhY3Rvcnk6OmlzQnVpbHRpblZhbHVlKGNvbnN0IEJGICYgdmFsdWUpCit7CisJc3dpdGNoKCB2YWx1ZS5jbGFzc0tpbmQoKSApCisJeworCQlkZWZhdWx0OgorCQl7CisJCQlyZXR1cm4oIHZhbHVlLmlzPCBCdWlsdGluRm9ybSA+KCkgKTsKKwkJfQorCX0KK30KKworCisKK2Jvb2wgRXhwcmVzc2lvbkZhY3Rvcnk6OmlzQ29uc3RWYWx1ZShjb25zdCBCRiAmIHZhbHVlKQoreworCXN3aXRjaCggdmFsdWUuY2xhc3NLaW5kKCkgKQorCXsKKwkJLy8gQlVJTFRJTiBWQUxVRQorCQljYXNlIEZPUk1fQlVJTFRJTl9CT09MRUFOX0tJTkQ6CisJCWNhc2UgRk9STV9CVUlMVElOX0lOVEVHRVJfS0lORDoKKwkJY2FzZSBGT1JNX0JVSUxUSU5fUkFUSU9OQUxfS0lORDoKKwkJY2FzZSBGT1JNX0JVSUxUSU5fRkxPQVRfS0lORDoKKworCQljYXNlIEZPUk1fQlVJTFRJTl9DSEFSQUNURVJfS0lORDoKKwkJY2FzZSBGT1JNX0JVSUxUSU5fU1RSSU5HX0tJTkQ6CisKKwkJY2FzZSBGT1JNX0JVSUxUSU5fSURFTlRJRklFUl9LSU5EOgorCQljYXNlIEZPUk1fQlVJTFRJTl9RVUFMSUZJRURfSURFTlRJRklFUl9LSU5EOgorCisJCQkvLyBCVUlMVElOIE9QRVJBVE9SCisJCWNhc2UgRk9STV9PUEVSQVRPUl9LSU5EOgorCisJCS8vIEJVSUxUSU4gQVJSQVkKKwkJY2FzZSBGT1JNX0FSUkFZX0JPT0xFQU5fS0lORDoKKwkJY2FzZSBGT1JNX0FSUkFZX0NIQVJBQ1RFUl9LSU5EOgorCQljYXNlIEZPUk1fQVJSQVlfSU5URUdFUl9LSU5EOgorCQljYXNlIEZPUk1fQVJSQVlfUkFUSU9OQUxfS0lORDoKKwkJY2FzZSBGT1JNX0FSUkFZX0ZMT0FUX0tJTkQ6CisJCWNhc2UgRk9STV9BUlJBWV9TVFJJTkdfS0lORDoKKwkJY2FzZSBGT1JNX0FSUkFZX0lERU5USUZJRVJfS0lORDoKKwkJY2FzZSBGT1JNX0FSUkFZX1FVQUxJRklFRF9JREVOVElGSUVSX0tJTkQ6CisKKwkJeworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQljYXNlIEZPUk1fSU5TVEFOQ0VfREFUQV9LSU5EOgorCQl7CisJCQlyZXR1cm4oIHZhbHVlLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpLT5pc0VudW1TeW1ib2xQb2ludGVyKCkgKTsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KK30KKworCisvKioKKyAqIENPTExFQ1QgVkFSSUFCTEUgT1IgQ0xBVVNFCisgKi8KKwordm9pZCBFeHByZXNzaW9uRmFjdG9yeTo6Y29sbGVjdFZhcmlhYmxlKAorCQljb25zdCBCRiAmIGFuRXhwciwgQkZDb2xsZWN0aW9uICYgbGlzdE9mVmFyKQoreworCXN3aXRjaCggYW5FeHByLmNsYXNzS2luZCgpICkKKwl7CisJCWNhc2UgRk9STV9BVk1DT0RFX0tJTkQ6CisJCXsKKwkJCWNvbGxlY3RWYXJpYWJsZShhbkV4cHIuYmZDb2RlKCksIGxpc3RPZlZhcik7CisKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBGT1JNX0lOU1RBTkNFX0RBVEFfS0lORDoKKwkJeworCQkJbGlzdE9mVmFyLmFkZF91bmlvbiggYW5FeHByICk7CisKKwkJCWJyZWFrOworCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKwordm9pZCBFeHByZXNzaW9uRmFjdG9yeTo6Y29sbGVjdFZhcmlhYmxlKAorCQljb25zdCBCRkNvZGUgJiBhQ29kZSwgQkZDb2xsZWN0aW9uICYgbGlzdE9mVmFyKQoreworCUF2bUNvZGU6Oml0ZXJhdG9yIGl0ID0gYUNvZGUtPmJlZ2luKCk7CisJQXZtQ29kZTo6aXRlcmF0b3IgaXRFbmQgPSBhQ29kZS0+ZW5kKCk7CisJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApCisJeworCQljb2xsZWN0VmFyaWFibGUoKCppdCksIGxpc3RPZlZhcik7CisJfQorfQorCisKK3ZvaWQgRXhwcmVzc2lvbkZhY3Rvcnk6OmNvbGxlY3RzRnJlZVZhcmlhYmxlKGNvbnN0IEJGICYgYW5FeHByLAorCQlCRkNvbGxlY3Rpb24gJiBsaXN0T2ZCb3VuZFZhciwgQkZDb2xsZWN0aW9uICYgbGlzdE9mVmFyKQoreworCXN3aXRjaCggYW5FeHByLmNsYXNzS2luZCgpICkKKwl7CisJCWNhc2UgRk9STV9BVk1DT0RFX0tJTkQ6CisJCXsKKwkJCWNvbGxlY3RzRnJlZVZhcmlhYmxlKGFuRXhwci5iZkNvZGUoKSwgbGlzdE9mQm91bmRWYXIsIGxpc3RPZlZhcik7CisKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBGT1JNX0lOU1RBTkNFX0RBVEFfS0lORDoKKwkJeworCQkJaWYoIG5vdCBsaXN0T2ZCb3VuZFZhci5jb250YWlucyhhbkV4cHIpICkKKwkJCXsKKwkJCQlsaXN0T2ZWYXIuYWRkX3VuaW9uKCBhbkV4cHIgKTsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlicmVhazsKKwkJfQorCX0KK30KKwordm9pZCBFeHByZXNzaW9uRmFjdG9yeTo6Y29sbGVjdHNGcmVlVmFyaWFibGUoY29uc3QgQkZDb2RlICYgYUNvZGUsCisJCUJGQ29sbGVjdGlvbiAmIGxpc3RPZkJvdW5kVmFyLCBCRkNvbGxlY3Rpb24gJiBsaXN0T2ZWYXIpCit7CisJQXZtQ29kZTo6aXRlcmF0b3IgaXQgPSBhQ29kZS0+YmVnaW4oKTsKKwlBdm1Db2RlOjppdGVyYXRvciBpdEVuZCA9IGFDb2RlLT5lbmQoKTsKKwlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwl7CisJCWNvbGxlY3RzRnJlZVZhcmlhYmxlKCgqaXQpLCBsaXN0T2ZCb3VuZFZhciwgbGlzdE9mVmFyKTsKKwl9Cit9CisKKworYm9vbCBFeHByZXNzaW9uRmFjdG9yeTo6Y29udGFpbnNWYXJpYWJsZSgKKwkJY29uc3QgQkYgJiBhbkV4cHIsIEluc3RhbmNlT2ZEYXRhICogYVZhcmlhYmxlKQoreworCXN3aXRjaCggYW5FeHByLmNsYXNzS2luZCgpICkKKwl7CisJCWNhc2UgRk9STV9BVk1DT0RFX0tJTkQ6CisJCXsKKwkJCXJldHVybiggY29udGFpbnNWYXJpYWJsZShhbkV4cHIuYmZDb2RlKCkgLCBhVmFyaWFibGUpICk7CisJCX0KKworCQljYXNlIEZPUk1fSU5TVEFOQ0VfREFUQV9LSU5EOgorCQl7CisJCQlpZiggYW5FeHByLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpID09IGFWYXJpYWJsZSApCisJCQl7CisJCQkJcmV0dXJuKCB0cnVlICk7CisJCQl9CisKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KK30KKworYm9vbCBFeHByZXNzaW9uRmFjdG9yeTo6Y29udGFpbnNWYXJpYWJsZSgKKwkJY29uc3QgQkZDb2RlICYgYUNvZGUsIEluc3RhbmNlT2ZEYXRhICogYVZhcmlhYmxlKQoreworCisJQXZtQ29kZTo6aXRlcmF0b3IgaXQgPSBhQ29kZS0+YmVnaW4oKTsKKwlBdm1Db2RlOjppdGVyYXRvciBpdEVuZCA9IGFDb2RlLT5lbmQoKTsKKwlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwl7CisJCWlmKCBjb250YWluc1ZhcmlhYmxlKCgqaXQpLCBhVmFyaWFibGUpICkKKwkJeworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKworYm9vbCBFeHByZXNzaW9uRmFjdG9yeTo6Y29udGFpbnNWYXJpYWJsZSgKKwkJY29uc3QgQkYgJiBhbkV4cHIsIEJGQ29sbGVjdGlvbiAmIGxpc3RPZlZhcikKK3sKKwlzd2l0Y2goIGFuRXhwci5jbGFzc0tpbmQoKSApCisJeworCQljYXNlIEZPUk1fQVZNQ09ERV9LSU5EOgorCQl7CisJCQlyZXR1cm4oIGNvbnRhaW5zVmFyaWFibGUoYW5FeHByLmJmQ29kZSgpICwgbGlzdE9mVmFyKSApOworCQl9CisKKwkJY2FzZSBGT1JNX0lOU1RBTkNFX0RBVEFfS0lORDoKKwkJeworCQkJaWYoIGxpc3RPZlZhci5jb250YWlucyggYW5FeHByICkgKQorCQkJeworCQkJCXJldHVybiggdHJ1ZSApOworCQkJfQorCisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKwl9Cit9CisKKworYm9vbCBFeHByZXNzaW9uRmFjdG9yeTo6Y29udGFpbnNWYXJpYWJsZSgKKwkJY29uc3QgQkZDb2RlICYgYUNvZGUsIEJGQ29sbGVjdGlvbiAmIGxpc3RPZlZhcikKK3sKKwlBdm1Db2RlOjppdGVyYXRvciBpdCA9IGFDb2RlLT5iZWdpbigpOworCUF2bUNvZGU6Oml0ZXJhdG9yIGl0RW5kID0gYUNvZGUtPmVuZCgpOworCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQorCXsKKwkJaWYoIGNvbnRhaW5zVmFyaWFibGUoKCppdCksIGxpc3RPZlZhcikgKQorCQl7CisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKworCisvKioKKyAqIENPTExFQ1QgVkFSSUFCTEUgT1IgQ0xBVVNFCisgKi8KKworCit2b2lkIEV4cHJlc3Npb25GYWN0b3J5Ojpjb2xsZWN0c0NsYXVzZSgKKwkJY29uc3QgQkYgJiBhbkV4cHIsIEJGQ29sbGVjdGlvbiAmIGxpc3RPZkNsYXVzZSkKK3sKKwlzd2l0Y2goIGFuRXhwci5jbGFzc0tpbmQoKSApCisJeworCQljYXNlIEZPUk1fQVZNQ09ERV9LSU5EOgorCQl7CisJCQljb2xsZWN0c0NsYXVzZShhbkV4cHIuYmZDb2RlKCkgLCBsaXN0T2ZDbGF1c2UpOworCisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgRk9STV9JTlNUQU5DRV9EQVRBX0tJTkQ6CisJCXsKKwkJCWxpc3RPZkNsYXVzZS5hcHBlbmQoIGFuRXhwciApOworCisJCQlicmVhazsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCit2b2lkIEV4cHJlc3Npb25GYWN0b3J5Ojpjb2xsZWN0c0NsYXVzZSgKKwkJY29uc3QgQkZDb2RlICYgYUNvZGUsIEJGQ29sbGVjdGlvbiAmIGxpc3RPZkNsYXVzZSkKK3sKKwlpZiggYUNvZGUtPmlzT3BDb2RlKCBBVk1fT1BDT0RFX0FORCApICkKKwl7CisJCUF2bUNvZGU6Oml0ZXJhdG9yIGl0ID0gYUNvZGUtPmJlZ2luKCk7CisJCUF2bUNvZGU6Oml0ZXJhdG9yIGl0RW5kID0gYUNvZGUtPmVuZCgpOworCQlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwkJeworCQkJbGlzdE9mQ2xhdXNlLmFwcGVuZCggKCppdCkgKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlsaXN0T2ZDbGF1c2UuYXBwZW5kKCBhQ29kZSApOworCX0KK30KKworCit2b2lkIEV4cHJlc3Npb25GYWN0b3J5Ojpjb2xsZWN0c0NsYXVzZSgKKwkJY29uc3QgQkYgJiBhbkV4cHIsIEJGQ29sbGVjdGlvbiAmIGxpc3RPZkJvdW5kVmFyLAorCQlCRkNvbGxlY3Rpb24gJiBsaXN0T2ZCb3VuZENsYXVzZSwgQkZDb2xsZWN0aW9uICYgbGlzdE9mRnJlZUNsYXVzZSkKK3sKKwlzd2l0Y2goIGFuRXhwci5jbGFzc0tpbmQoKSApCisJeworCQljYXNlIEZPUk1fQVZNQ09ERV9LSU5EOgorCQl7CisJCQljb2xsZWN0c0NsYXVzZSggYW5FeHByLmJmQ29kZSgpICwgbGlzdE9mQm91bmRWYXIsCisJCQkJCWxpc3RPZkJvdW5kQ2xhdXNlLCBsaXN0T2ZGcmVlQ2xhdXNlICk7CisKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBGT1JNX0lOU1RBTkNFX0RBVEFfS0lORDoKKwkJeworCQkJaWYoIEV4cHJlc3Npb25GYWN0b3J5Ojpjb250YWluc1ZhcmlhYmxlKGFuRXhwciwgbGlzdE9mQm91bmRWYXIpICkKKwkJCXsKKwkJCQlsaXN0T2ZCb3VuZENsYXVzZS5hcHBlbmQoIGFuRXhwciApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWxpc3RPZkZyZWVDbGF1c2UuYXBwZW5kKCBhbkV4cHIgKTsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworCit2b2lkIEV4cHJlc3Npb25GYWN0b3J5Ojpjb2xsZWN0c0NsYXVzZSgKKwkJY29uc3QgQkZDb2RlICYgYUNvZGUsIEJGQ29sbGVjdGlvbiAmIGxpc3RPZkJvdW5kVmFyLAorCQlCRkNvbGxlY3Rpb24gJiBsaXN0T2ZCb3VuZENsYXVzZSwgQkZDb2xsZWN0aW9uICYgbGlzdE9mRnJlZUNsYXVzZSkKK3sKKwlpZiggYUNvZGUtPmlzT3BDb2RlKCBBVk1fT1BDT0RFX0FORCApICkKKwl7CisJCUF2bUNvZGU6Oml0ZXJhdG9yIGl0ID0gYUNvZGUtPmJlZ2luKCk7CisJCUF2bUNvZGU6Oml0ZXJhdG9yIGl0RW5kID0gYUNvZGUtPmVuZCgpOworCQlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwkJeworCQkJaWYoIGNvbnRhaW5zVmFyaWFibGUoKCppdCksIGxpc3RPZkJvdW5kVmFyKSApCisJCQl7CisJCQkJbGlzdE9mQm91bmRDbGF1c2UuYXBwZW5kKCAoKml0KSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWxpc3RPZkZyZWVDbGF1c2UuYXBwZW5kKCAoKml0KSApOworCQkJfQorCQl9CisJfQorCWVsc2UKKwl7CisJCWlmKCBFeHByZXNzaW9uRmFjdG9yeTo6Y29udGFpbnNWYXJpYWJsZShhQ29kZSwgbGlzdE9mQm91bmRWYXIpICkKKwkJeworCQkJbGlzdE9mQm91bmRDbGF1c2UuYXBwZW5kKCBhQ29kZSApOworCQl9CisJCWVsc2UKKwkJeworCQkJbGlzdE9mRnJlZUNsYXVzZS5hcHBlbmQoIGFDb2RlICk7CisJCX0KKwl9Cit9CisKKwordm9pZCBFeHByZXNzaW9uRmFjdG9yeTo6ZGVkdWNlVHJpdmlhbEFzc2lnbm1lbnRzRnJvbUNvbmpvbmN0aW9uKAorCQljb25zdCBCRiAmIGFuRXhwciwgQkZDb2RlQ29sbGVjdGlvbiAmIGxpc3RPZkFzc2lnbm1lbnRzKQoreworCXN3aXRjaCggYW5FeHByLmNsYXNzS2luZCgpICkKKwl7CisJCWNhc2UgRk9STV9BVk1DT0RFX0tJTkQ6CisJCXsKKwkJCWNvbnN0IEJGQ29kZSAmIGFDb2RlID0gYW5FeHByLmJmQ29kZSgpOworCisJCQlpZiggYUNvZGUtPmlzT3BDb2RlKCBBVk1fT1BDT0RFX0FORCApICkKKwkJCXsKKwkJCQlBdm1Db2RlOjppdGVyYXRvciBpdCA9IGFDb2RlLT5iZWdpbigpOworCQkJCUF2bUNvZGU6Oml0ZXJhdG9yIGl0RW5kID0gYUNvZGUtPmVuZCgpOworCQkJCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQorCQkJCXsKKwkJCQkJZGVkdWNlVHJpdmlhbEFzc2lnbm1lbnRzRnJvbUNvbmpvbmN0aW9uKAorCQkJCQkJCSgqaXQpLCBsaXN0T2ZBc3NpZ25tZW50cyk7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiggYUNvZGUtPmhhc09wQ29kZSggQVZNX09QQ09ERV9FUSwgQVZNX09QQ09ERV9TRVEgKSApCisJCQl7CisJCQkJaWYoIGFDb2RlLT5maXJzdCgpLmlzPCBJbnN0YW5jZU9mRGF0YSA+KCkKKwkJCQkJJiYgYUNvZGUtPmZpcnN0KCkudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCktPgorCQkJCQkJCWdldE1vZGlmaWVyKCkubm9uZU1vZGlmaWVyRmluYWxSZWZlcmVuY2VNYWNybygpCisJCQkJCSYmIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6CisJCQkJCQkJaXNGaW5hbFN5bWJvbGljQmFzaWNTeW1ib2woYUNvZGUtPnNlY29uZCgpKSApCisJCQkJeworCQkJCQlsaXN0T2ZBc3NpZ25tZW50cy5hcHBlbmQoIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQVNTSUdOLAorCQkJCQkJCWFDb2RlLT5maXJzdCgpLCBhQ29kZS0+c2Vjb25kKCkpICk7CisJCQkJfQorCQkJCWVsc2UgaWYoIGFDb2RlLT5zZWNvbmQoKS5pczwgSW5zdGFuY2VPZkRhdGEgPigpCisJCQkJCQkmJiBhQ29kZS0+c2Vjb25kKCkudG9fcHRyPEluc3RhbmNlT2ZEYXRhID4oKS0+CisJCQkJCQkJCWdldE1vZGlmaWVyKCkubm9uZU1vZGlmaWVyRmluYWxSZWZlcmVuY2VNYWNybygpCisJCQkJCQkmJiBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OgorCQkJCQkJCQlpc0ZpbmFsU3ltYm9saWNCYXNpY1N5bWJvbChhQ29kZS0+Zmlyc3QoKSkgKQorCQkJCXsKKwkJCQkJbGlzdE9mQXNzaWdubWVudHMuYXBwZW5kKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FTU0lHTiwKKwkJCQkJCQlhQ29kZS0+c2Vjb25kKCksIGFDb2RlLT5maXJzdCgpKSApOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYoIGFDb2RlLT5pc09wQ29kZSggQVZNX09QQ09ERV9OT1QgKSApCisJCQl7CisJCQkJaWYoIGFDb2RlLT5maXJzdCgpLmlzPCBJbnN0YW5jZU9mRGF0YSA+KCkKKwkJCQkJJiYgYUNvZGUtPmZpcnN0KCkudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCktPgorCQkJCQkJCWdldE1vZGlmaWVyKCkubm9uZU1vZGlmaWVyRmluYWxSZWZlcmVuY2VNYWNybygpCisJCQkJCSYmIGFDb2RlLT5maXJzdCgpLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpLT5pc1R5cGVkQm9vbGVhbigpICkKKwkJCQl7CisJCQkJCWxpc3RPZkFzc2lnbm1lbnRzLmFwcGVuZCggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BU1NJR04sCisJCQkJCQkJYUNvZGUtPmZpcnN0KCksIEV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9GQUxTRSkgKTsKKwkJCQl9CisJCQl9CisKKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEZPUk1fSU5TVEFOQ0VfREFUQV9LSU5EOgorCQl7CisJCQlpZiggYW5FeHByLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpLT4KKwkJCQkJZ2V0TW9kaWZpZXIoKS5ub25lTW9kaWZpZXJGaW5hbFJlZmVyZW5jZU1hY3JvKCkKKwkJCQkmJiBhbkV4cHIudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCktPmlzVHlwZWRCb29sZWFuKCkgKQorCQkJeworCQkJCWxpc3RPZkFzc2lnbm1lbnRzLmFwcGVuZCggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FTU0lHTiwKKwkJCQkJCWFuRXhwciwgRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX1RSVUUpICk7CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKworCit9CisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25GYWN0b3J5LmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uRmFjdG9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YTYwNjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uRmFjdG9yeS5oCkBAIC0wLDAgKzEsMTg1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogOSBqdWlsLiAyMDA5CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRVhQUkVTU0lPTkZBQ1RPUllfSF8KKyNkZWZpbmUgRVhQUkVTU0lPTkZBQ1RPUllfSF8KKworI2luY2x1ZGUgPGNvbW1vbi9CRi5oPgorCisjaW5jbHVkZSA8Y29sbGVjdGlvbi9CRkNvbnRhaW5lci5oPgorI2luY2x1ZGUgPGNvbGxlY3Rpb24vVHlwZWRlZi5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvQmFzZUluc3RhbmNlRm9ybS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZEYXRhLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9Bdm1Db2RlLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIEV4cHJlc3Npb25GYWN0b3J5Cit7CitwdWJsaWM6CisKKwkvKioKKwkgKiBMT0FERVIgLSBESVNQT1NFUgorCSAqLworCXN0YXRpYyB2b2lkIGxvYWQoKTsKKwlzdGF0aWMgdm9pZCBkaXNwb3NlKCk7CisKKworCS8qKgorCSAqIENPTkZJR1VSRQorCSAqLworCXN0YXRpYyBib29sIGNvbmZpZ3VyZSgpOworCisKKwkvKioKKwkqIE5VTUVSSUMgb3IgU0lNUExFIFRZUEUgVEVTVCAmIENBU1QKKwkqLworCXN0YXRpYyBib29sIGlzQm9vbGVhbihjb25zdCBCRiAmIHZhbHVlKTsKKwlzdGF0aWMgYm9vbCB0b0Jvb2xlYW4oY29uc3QgQkYgJiB2YWx1ZSk7CisKKwkvKioKKwkgKiBDT01QQVJJU09OCisJICogd2l0aCBUUlVFICYgRkFMU0UKKwkgKi8KKwlzdGF0aWMgYm9vbCBpc0VxdWFsRmFsc2UoY29uc3QgQkYgJiB2YWx1ZSk7CisJc3RhdGljIGJvb2wgaXNOb3RFcXVhbEZhbHNlKGNvbnN0IEJGICYgdmFsdWUpOworCisJc3RhdGljIGJvb2wgaXNFcXVhbFRydWUoY29uc3QgQkYgJiB2YWx1ZSk7CisJc3RhdGljIGJvb2wgaXNOb3RFcXVhbFRydWUoY29uc3QgQkYgJiB2YWx1ZSk7CisKKworCXN0YXRpYyBib29sIGlzTnVtYmVyKGNvbnN0IEJGICYgdmFsdWUpOworCisJaW5saW5lIHN0YXRpYyBib29sIGlzTnVtZXJpYyhjb25zdCBCRiAmIHZhbHVlKQorCXsKKwkJcmV0dXJuKCBpc051bWJlcih2YWx1ZSkgKTsKKwl9CisKKwlzdGF0aWMgYm9vbCBpc0ludDMyKGNvbnN0IEJGICYgdmFsdWUpOworCXN0YXRpYyBhdm1faW50MzJfdCB0b0ludDMyKGNvbnN0IEJGICYgdmFsdWUpOworCisJc3RhdGljIGJvb2wgaXNJbnQ2NChjb25zdCBCRiAmIHZhbHVlKTsKKwlzdGF0aWMgYXZtX2ludDY0X3QgdG9JbnQ2NChjb25zdCBCRiAmIHZhbHVlKTsKKworCXN0YXRpYyBib29sIGlzSW50ZWdlcihjb25zdCBCRiAmIHZhbHVlKTsKKwlzdGF0aWMgYXZtX2ludGVnZXJfdCB0b0ludGVnZXIoY29uc3QgQkYgJiB2YWx1ZSk7CisKKwlzdGF0aWMgYm9vbCBpc1Bvc0ludGVnZXIoY29uc3QgQkYgJiB2YWx1ZSk7CisKKwlzdGF0aWMgYm9vbCBpc1VJbnRlZ2VyKGNvbnN0IEJGICYgdmFsdWUpOworCXN0YXRpYyBhdm1fdWludGVnZXJfdCB0b1VJbnRlZ2VyKGNvbnN0IEJGICYgdmFsdWUpOworCisJc3RhdGljIGJvb2wgaXNSYXRpb25hbChjb25zdCBCRiAmIHZhbHVlKTsKKwlzdGF0aWMgYXZtX2ludGVnZXJfdCB0b0Rlbm9taW5hdG9yKGNvbnN0IEJGICYgdmFsdWUpOworCXN0YXRpYyBhdm1faW50ZWdlcl90IHRvTnVtZXJhdG9yKGNvbnN0IEJGICYgdmFsdWUpOworCisJc3RhdGljIGJvb2wgaXNGbG9hdChjb25zdCBCRiAmIHZhbHVlKTsKKwlzdGF0aWMgYXZtX2Zsb2F0X3QgdG9GbG9hdChjb25zdCBCRiAmIHZhbHVlKTsKKworCXN0YXRpYyBib29sIGlzUmVhbChjb25zdCBCRiAmIHZhbHVlKTsKKwlzdGF0aWMgYXZtX3JlYWxfdCB0b1JlYWwoY29uc3QgQkYgJiB2YWx1ZSk7CisKKworCXN0YXRpYyBib29sIGlzQ2hhcmFjdGVyKGNvbnN0IEJGICYgdmFsdWUpOworCXN0YXRpYyBjaGFyIHRvQ2hhcmFjdGVyKGNvbnN0IEJGICYgdmFsdWUpOworCisJc3RhdGljIGJvb2wgaXNJZGVudGlmaWVyKGNvbnN0IEJGICYgdmFsdWUpOworCXN0YXRpYyBzdGQ6OnN0cmluZyB0b0lkZW50aWZpZXIoY29uc3QgQkYgJiB2YWx1ZSk7CisKKwlzdGF0aWMgYm9vbCBpc1VmaShjb25zdCBCRiAmIHZhbHVlKTsKKwlzdGF0aWMgc3RkOjpzdHJpbmcgdG9VZmkoY29uc3QgQkYgJiB2YWx1ZSk7CisKKwlzdGF0aWMgYm9vbCBpc1VmaWQoY29uc3QgQkYgJiB2YWx1ZSk7CisJc3RhdGljIHN0ZDo6c3RyaW5nIHRvVWZpZChjb25zdCBCRiAmIHZhbHVlKTsKKworCXN0YXRpYyBib29sIGlzRW51bVN5bWJvbChjb25zdCBCRiAmIHZhbHVlKTsKKwlzdGF0aWMgc3RkOjpzdHJpbmcgc3RyRW51bVN5bWJvbChjb25zdCBCRiAmIHZhbHVlKTsKKworCXN0YXRpYyBib29sIGlzQnVpbHRpblN0cmluZyhjb25zdCBCRiAmIHZhbHVlKTsKKwlzdGF0aWMgc3RkOjpzdHJpbmcgdG9CdWlsdGluU3RyaW5nKGNvbnN0IEJGICYgdmFsdWUpOworCisKKwlzdGF0aWMgYm9vbCBpc0J1aWx0aW5WYWx1ZShjb25zdCBCRiAmIHZhbHVlKTsKKworCXN0YXRpYyBib29sIGlzQ29uc3RWYWx1ZShjb25zdCBCRiAmIHZhbHVlKTsKKworCisJLyoqCisJICogQ09MTEVDVCBWQVJJQUJMRSBPUiBDTEFVU0UKKwkgKi8KKwlzdGF0aWMgdm9pZCBjb2xsZWN0VmFyaWFibGUoY29uc3QgQkYgJiBhbkV4cHIsIEJGQ29sbGVjdGlvbiAmIGxpc3RPZlZhcik7CisKKwlzdGF0aWMgdm9pZCBjb2xsZWN0VmFyaWFibGUoY29uc3QgQkZDb2RlICYgYUNvZGUsIEJGQ29sbGVjdGlvbiAmIGxpc3RPZlZhcik7CisKKworCWlubGluZSBzdGF0aWMgdm9pZCBjb2xsZWN0VmFyaWFibGUoY29uc3QgQkYgJiBhbkV4cHIsCisJCQlWZWN0b3JPZkJhc2VJbnN0YW5jZUZvcm0gJiBsaXN0T2ZFbGVtZW50KQorCXsKKwkJQkZWZWN0b3IgbGlzdE9mVmFyOworCisJCWNvbGxlY3RWYXJpYWJsZShhbkV4cHIsIGxpc3RPZlZhcik7CisKKwkJQkZWZWN0b3I6OnJhd19pdGVyYXRvcjwgSW5zdGFuY2VPZkRhdGEgPiBpdFZhciA9IGxpc3RPZlZhci5iZWdpbigpOworCQlCRlZlY3Rvcjo6cmF3X2l0ZXJhdG9yPCBJbnN0YW5jZU9mRGF0YSA+IGVuZFZhciA9IGxpc3RPZlZhci5lbmQoKTsKKwkJZm9yKCA7IGl0VmFyICE9IGVuZFZhciA7ICsraXRWYXIgKQorCQl7CisJCQlsaXN0T2ZFbGVtZW50LmFwcGVuZCggaXRWYXIgKTsKKwkJfQorCX0KKworCisJc3RhdGljIHZvaWQgY29sbGVjdHNGcmVlVmFyaWFibGUoY29uc3QgQkYgJiBhbkV4cHIsCisJCQlCRkNvbGxlY3Rpb24gJiBsaXN0T2ZCb3VuZFZhciwgQkZDb2xsZWN0aW9uICYgbGlzdE9mVmFyKTsKKworCXN0YXRpYyB2b2lkIGNvbGxlY3RzRnJlZVZhcmlhYmxlKGNvbnN0IEJGQ29kZSAmIGFDb2RlLAorCQkJQkZDb2xsZWN0aW9uICYgbGlzdE9mQm91bmRWYXIsIEJGQ29sbGVjdGlvbiAmIGxpc3RPZlZhcik7CisKKworCXN0YXRpYyBib29sIGNvbnRhaW5zVmFyaWFibGUoY29uc3QgQkYgJiBhbkV4cHIsIEluc3RhbmNlT2ZEYXRhICogYVZhcmlhYmxlKTsKKworCXN0YXRpYyBib29sIGNvbnRhaW5zVmFyaWFibGUoY29uc3QgQkZDb2RlICYgYUNvZGUsIEluc3RhbmNlT2ZEYXRhICogYVZhcmlhYmxlKTsKKworCisJc3RhdGljIGJvb2wgY29udGFpbnNWYXJpYWJsZShjb25zdCBCRiAmIGFuRXhwciwgQkZDb2xsZWN0aW9uICYgbGlzdE9mVmFyKTsKKworCXN0YXRpYyBib29sIGNvbnRhaW5zVmFyaWFibGUoY29uc3QgQkZDb2RlICYgYUNvZGUsIEJGQ29sbGVjdGlvbiAmIGxpc3RPZlZhcik7CisKKworCXN0YXRpYyB2b2lkIGNvbGxlY3RzQ2xhdXNlKGNvbnN0IEJGICYgYW5FeHByLCBCRkNvbGxlY3Rpb24gJiBsaXN0T2ZDbGF1c2UpOworCisJc3RhdGljIHZvaWQgY29sbGVjdHNDbGF1c2UoY29uc3QgQkZDb2RlICYgYUNvZGUsIEJGQ29sbGVjdGlvbiAmIGxpc3RPZkNsYXVzZSk7CisKKworCXN0YXRpYyB2b2lkIGNvbGxlY3RzQ2xhdXNlKGNvbnN0IEJGICYgYW5FeHByLCBCRkNvbGxlY3Rpb24gJiBsaXN0T2ZCb3VuZFZhciwKKwkJCUJGQ29sbGVjdGlvbiAmIGxpc3RPZkJvdW5kQ2xhdXNlLCBCRkNvbGxlY3Rpb24gJiBsaXN0T2ZGcmVlQ2xhdXNlKTsKKworCXN0YXRpYyB2b2lkIGNvbGxlY3RzQ2xhdXNlKGNvbnN0IEJGQ29kZSAmIGFDb2RlLCBCRkNvbGxlY3Rpb24gJiBsaXN0T2ZCb3VuZFZhciwKKwkJCUJGQ29sbGVjdGlvbiAmIGxpc3RPZkJvdW5kQ2xhdXNlLCBCRkNvbGxlY3Rpb24gJiBsaXN0T2ZGcmVlQ2xhdXNlKTsKKworCisJc3RhdGljIHZvaWQgZGVkdWNlVHJpdmlhbEFzc2lnbm1lbnRzRnJvbUNvbmpvbmN0aW9uKAorCQkJY29uc3QgQkYgJiBhbkV4cHIsIEJGQ29kZUNvbGxlY3Rpb24gJiBsaXN0T2ZBc3NpZ25tZW50cyk7CisKK307CisKKworfQorCisjZW5kaWYgLyogRVhQUkVTU0lPTkZBQ1RPUllfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25TaW1wbGlmaWVyLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25TaW1wbGlmaWVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzYyZjRjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvblNpbXBsaWZpZXIuY3BwCkBAIC0wLDAgKzEsNjIwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTIgamFudi4gMjAxMgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiRXhwcmVzc2lvblNpbXBsaWZpZXIuaCIKKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0Jhc2VJbnN0YW5jZUZvcm0uaD4KKworI2luY2x1ZGUgPGZtbC9idWlsdGluL0Jvb2xlYW4uaD4KKyNpbmNsdWRlIDxmbWwvYnVpbHRpbi9CdWlsdGluRm9ybS5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25Db25zdGFudC5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25Db25zdHJ1Y3Rvci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQVJJVEhNRVRJQyBTSU1QTElGSUVSCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitCRiBFeHByZXNzaW9uU2ltcGxpZmllcjo6UExVUyhjb25zdCBCRiAmIGxocywgY29uc3QgQkYgJiByaHMpCit7CisJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1BMVVMsIGxocywgcmhzKSApOworfQorCitCRiBFeHByZXNzaW9uU2ltcGxpZmllcjo6UExVUyhWZWN0b3I8IEJGID4gJiBhcmdzKQoreworCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9QTFVTLCBhcmdzKSApOworfQorCisKK0JGIEV4cHJlc3Npb25TaW1wbGlmaWVyOjpNSU5VUyhjb25zdCBCRiAmIGxocywgY29uc3QgQkYgJiByaHMpCit7CisJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX01JTlVTLCBsaHMsIHJocykgKTsKK30KKworQkYgRXhwcmVzc2lvblNpbXBsaWZpZXI6OlVNSU5VUyhjb25zdCBCRiAmIGFyZykKK3sKKwlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfVU1JTlVTLCBhcmcpICk7Cit9CisKKworQkYgRXhwcmVzc2lvblNpbXBsaWZpZXI6Ok1VTFQoY29uc3QgQkYgJiBsaHMsIGNvbnN0IEJGICYgcmhzKQoreworCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9NVUxULCBsaHMsIHJocykgKTsKK30KKworQkYgRXhwcmVzc2lvblNpbXBsaWZpZXI6Ok1VTFQoVmVjdG9yPCBCRiA+ICYgYXJncykKK3sKKwlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfTVVMVCwgYXJncykgKTsKK30KKworCitCRiBFeHByZXNzaW9uU2ltcGxpZmllcjo6UE9XKGNvbnN0IEJGICYgbGhzLCBjb25zdCBCRiAmIHJocykKK3sKKwlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfUE9XLCBsaHMsIHJocykgKTsKK30KKworQkYgRXhwcmVzc2lvblNpbXBsaWZpZXI6OkRJVihjb25zdCBCRiAmIGxocywgY29uc3QgQkYgJiByaHMpCit7CisJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0RJViwgbGhzLCByaHMpICk7Cit9CisKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDT01QQVJFUiBTSU1QTElGSUVSCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitCRiBFeHByZXNzaW9uU2ltcGxpZmllcjo6RVEoY29uc3QgQkYgJiBsaHMsIGNvbnN0IEJGICYgcmhzKQoreworCWlmKCBsaHMuaXNURVEocmhzKSApCisJeworCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9UUlVFICk7CisJfQorCWVsc2UgaWYoIGxocy5jbGFzc0tpbmQoKSA9PSByaHMuY2xhc3NLaW5kKCkgKQorCXsKKwkJaWYoIGxocy5pc0VRKCByaHMgKSApCisJCXsKKwkJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX1RSVUUgKTsKKwkJfQorCX0KKworCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjplcUV4cHIobGhzLCByaHMpICk7Cit9CisKK0JGIEV4cHJlc3Npb25TaW1wbGlmaWVyOjpORVEoY29uc3QgQkYgJiBsaHMsIGNvbnN0IEJGICYgcmhzKQoreworCWlmKCBsaHMuaXNURVEocmhzKSApCisJeworCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9GQUxTRSApOworCX0KKwllbHNlIGlmKCBsaHMuY2xhc3NLaW5kKCkgPT0gcmhzLmNsYXNzS2luZCgpICkKKwl7CisJCWlmKCBsaHMuaXNFUSggcmhzICkgKQorCQl7CisJCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9GQUxTRSApOworCQl9CisJfQorCisJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5lcUV4cHIobGhzLCByaHMpICk7Cit9CisKKworCitCRiBFeHByZXNzaW9uU2ltcGxpZmllcjo6U0VRKGNvbnN0IEJGICYgbGhzLCBjb25zdCBCRiAmIHJocykKK3sKKwlyZXR1cm4oICggbGhzLmlzVEVRKHJocykgfHwgKGxocy5zdHIoKSA9PSByaHMuc3RyKCkpICkKKwkJCT8gRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX1RSVUUKKwkJCTogRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX0ZBTFNFICk7Cit9CisKK0JGIEV4cHJlc3Npb25TaW1wbGlmaWVyOjpOU0VRKGNvbnN0IEJGICYgbGhzLCBjb25zdCBCRiAmIHJocykKK3sKKwlyZXR1cm4oICggbGhzLmlzVEVRKHJocykgfHwgKGxocy5zdHIoKSA9PSByaHMuc3RyKCkpICkKKwkJCT8gRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX0ZBTFNFCisJCQk6IEV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9UUlVFICk7Cit9CisKKworCitCRiBFeHByZXNzaW9uU2ltcGxpZmllcjo6TFQoY29uc3QgQkYgJiBsaHMsIGNvbnN0IEJGICYgcmhzKQoreworCWlmKCBsaHMuaXNURVEocmhzKSApCisJeworCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9UUlVFICk7CisJfQorCWVsc2UgaWYoIGxocy5jbGFzc0tpbmQoKSA9PSByaHMuY2xhc3NLaW5kKCkgKQorCXsKKwkJaWYoIGxocy5pczwgTnVtYmVyID4oKSApCisJCXsKKwkJCXJldHVybiggbGhzLmlzRVEoIHJocyApCisJCQkJCT8gRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX1RSVUUKKwkJCQkJOiBFeHByZXNzaW9uQ29uc3RhbnQ6OkJPT0xFQU5fRkFMU0UgKTsKKwkJfQorCX0KKworCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpsdEV4cHIobGhzLCByaHMpICk7Cit9CisKK0JGIEV4cHJlc3Npb25TaW1wbGlmaWVyOjpMVEUoY29uc3QgQkYgJiBsaHMsIGNvbnN0IEJGICYgcmhzKQoreworCWlmKCBsaHMuaXNURVEocmhzKSApCisJeworCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9UUlVFICk7CisJfQorCWVsc2UgaWYoIGxocy5jbGFzc0tpbmQoKSA9PSByaHMuY2xhc3NLaW5kKCkgKQorCXsKKwkJaWYoIGxocy5pczwgQnVpbHRpbkZvcm0gPigpICYmIHJocy5pczwgQnVpbHRpbkZvcm0gPigpICkKKwkJeworCQkJcmV0dXJuKCBsaHMuaXNFUSggcmhzICkKKwkJCQkJPyBFeHByZXNzaW9uQ29uc3RhbnQ6OkJPT0xFQU5fVFJVRQorCQkJCQk6IEV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9GQUxTRSApOworCQl9CisJfQorCisJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Omx0ZUV4cHIobGhzLCByaHMpICk7Cit9CisKK0JGIEV4cHJlc3Npb25TaW1wbGlmaWVyOjpHVChjb25zdCBCRiAmIGxocywgY29uc3QgQkYgJiByaHMpCit7CisJaWYoIGxocy5pc1RFUShyaHMpICkKKwl7CisJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX1RSVUUgKTsKKwl9CisJZWxzZSBpZiggbGhzLmNsYXNzS2luZCgpID09IHJocy5jbGFzc0tpbmQoKSApCisJeworCQlpZiggbGhzLmlzPCBCdWlsdGluRm9ybSA+KCkgJiYgcmhzLmlzPCBCdWlsdGluRm9ybSA+KCkgKQorCQl7CisJCQlyZXR1cm4oIGxocy5pc0VRKCByaHMgKQorCQkJCQk/IEV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9UUlVFCisJCQkJCTogRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX0ZBTFNFICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6Z3RFeHByKGxocywgcmhzKSApOworfQorCitCRiBFeHByZXNzaW9uU2ltcGxpZmllcjo6R1RFKGNvbnN0IEJGICYgbGhzLCBjb25zdCBCRiAmIHJocykKK3sKKwlpZiggbGhzLmlzVEVRKHJocykgKQorCXsKKwkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RhbnQ6OkJPT0xFQU5fVFJVRSApOworCX0KKwllbHNlIGlmKCBsaHMuY2xhc3NLaW5kKCkgPT0gcmhzLmNsYXNzS2luZCgpICkKKwl7CisJCWlmKCBsaHMuaXM8IEJ1aWx0aW5Gb3JtID4oKSAmJiByaHMuaXM8IEJ1aWx0aW5Gb3JtID4oKSApCisJCXsKKwkJCXJldHVybiggbGhzLmlzRVEoIHJocyApCisJCQkJCT8gRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX1RSVUUKKwkJCQkJOiBFeHByZXNzaW9uQ29uc3RhbnQ6OkJPT0xFQU5fRkFMU0UgKTsKKwkJfQorCX0KKworCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpndGVFeHByKGxocywgcmhzKSApOworfQorCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIExPR0lDIFNJTVBMSUZJRVIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0JGIEV4cHJlc3Npb25TaW1wbGlmaWVyOjpOT1QoY29uc3QgQkYgJiBhcmcpCit7CisJaWYoIGFyZy5pc0VxdWFsVHJ1ZSgpICkKKwl7CisJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX0ZBTFNFICk7CisJfQorCWVsc2UgaWYoIGFyZy5pc0VxdWFsRmFsc2UoKSApCisJeworCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9UUlVFICk7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfTk9ULCBhcmcpICk7CisJfQorfQorCitCRiBFeHByZXNzaW9uU2ltcGxpZmllcjo6QU5EKGNvbnN0IEJGICYgbGhzLCBjb25zdCBCRiAmIHJocykKK3sKKwlpZiggbGhzLmlzRXF1YWxGYWxzZSgpIHx8IHJocy5pc0VxdWFsRmFsc2UoKSApCisJeworCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9GQUxTRSApOworCX0KKwllbHNlIGlmKCBsaHMuaXNFcXVhbFRydWUoKSApCisJeworCQlyZXR1cm4oIHJocyApOworCX0KKwllbHNlIGlmKCByaHMuaXNFcXVhbFRydWUoKSB8fCAobGhzID09IHJocykgKQorCXsKKwkJcmV0dXJuKCBsaHMgKTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BTkQsIGxocywgcmhzKSApOworCX0KK30KKworQkYgRXhwcmVzc2lvblNpbXBsaWZpZXI6OkFORChWZWN0b3I8IEJGID4gJiBhcmdzKQoreworCUJGQ29kZSByZXNFWFBSKCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FORCApOworCisJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXRSZXM7CisJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kUmVzOworCisJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXRBcmcgPSBhcmdzLmJlZ2luKCk7CisJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kQXJnID0gYXJncy5lbmQoKTsKKwlmb3IoIDsgaXRBcmcgIT0gZW5kQXJnIDsgKytpdEFyZyApCisJeworCQlpZiggKCppdEFyZykuaXNFcXVhbEZhbHNlKCkgKQorCQl7CisJCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9GQUxTRSApOworCQl9CisJCWVsc2UgaWYoICgqaXRBcmcpLmlzTm90RXF1YWxUcnVlKCkgKQorCQl7CisJCQllbmRSZXMgPSByZXNFWFBSLT5lbmQoKTsKKwkJCWZvciggaXRSZXMgPSByZXNFWFBSLT5iZWdpbigpIDsgaXRSZXMgIT0gZW5kUmVzIDsgKytpdFJlcyApCisJCQl7CisJCQkJaWYoICgqaXRBcmcpLmlzRVEoICppdFJlcyApICApCisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmKCBpdFJlcyA9PSBlbmRSZXMgKQorCQkJeworCQkJCXJlc0VYUFItPmFwcGVuZCggKCppdEFyZykgKTsKKwkJCX0KKwkJfQorCX0KKworCWlmKCByZXNFWFBSLT5wb3B1bGF0ZWQoKSApCisJeworCQlyZXR1cm4oIHJlc0VYUFIgKTsKKwl9CisJZWxzZSBpZiggcmVzRVhQUi0+bm9uZW1wdHkoKSApCisJeworCQlyZXR1cm4oIHJlc0VYUFItPmZpcnN0KCkgKTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RhbnQ6OkJPT0xFQU5fVFJVRSApOworCX0KK30KKworCitCRiBFeHByZXNzaW9uU2ltcGxpZmllcjo6TkFORChjb25zdCBCRiAmIGxocywgY29uc3QgQkYgJiByaHMpCit7CisJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FORCwgbGhzLCByaHMpICk7Cit9CisKK0JGIEV4cHJlc3Npb25TaW1wbGlmaWVyOjpOQU5EKFZlY3RvcjwgQkYgPiAmIGFyZ3MpCit7CisJQkZDb2RlIHJlc0VYUFIoIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfTkFORCApOworCisJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXRSZXM7CisJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kUmVzOworCisJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXRBcmcgPSBhcmdzLmJlZ2luKCk7CisJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kQXJnID0gYXJncy5lbmQoKTsKKwlmb3IoIDsgaXRBcmcgIT0gZW5kQXJnIDsgKytpdEFyZyApCisJeworCQlpZiggKCppdEFyZykuaXNFcXVhbEZhbHNlKCkgKQorCQl7CisJCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9UUlVFICk7CisJCX0KKwkJZWxzZSBpZiggKCppdEFyZykuaXNOb3RFcXVhbFRydWUoKSApCisJCXsKKwkJCWVuZFJlcyA9IHJlc0VYUFItPmVuZCgpOworCQkJZm9yKCBpdFJlcyA9IHJlc0VYUFItPmJlZ2luKCkgOyBpdFJlcyAhPSBlbmRSZXMgOyArK2l0UmVzICkKKwkJCXsKKwkJCQlpZiggKCppdEFyZykuaXNFUSggKml0UmVzICkgICkKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJaWYoIGl0UmVzID09IGVuZFJlcyApCisJCQl7CisJCQkJcmVzRVhQUi0+YXBwZW5kKCAoKml0QXJnKSApOworCQkJfQorCQl9CisJfQorCisJaWYoIHJlc0VYUFItPnBvcHVsYXRlZCgpICkKKwl7CisJCXJldHVybiggcmVzRVhQUiApOworCX0KKwllbHNlIGlmKCByZXNFWFBSLT5ub25lbXB0eSgpICkKKwl7CisJCXJldHVybiggcmVzRVhQUi0+Zmlyc3QoKSApOworCX0KKwllbHNlCisJeworCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9GQUxTRSApOworCX0KK30KKworCitCRiBFeHByZXNzaW9uU2ltcGxpZmllcjo6WEFORChjb25zdCBCRiAmIGxocywgY29uc3QgQkYgJiByaHMpCit7CisJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1hBTkQsIGxocywgcmhzKSApOworfQorCitCRiBFeHByZXNzaW9uU2ltcGxpZmllcjo6WEFORChWZWN0b3I8IEJGID4gJiBhcmdzKQoreworCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9YQU5ELCBhcmdzKSApOworfQorCisKKworCitCRiBFeHByZXNzaW9uU2ltcGxpZmllcjo6T1IoY29uc3QgQkYgJiBsaHMsIGNvbnN0IEJGICYgcmhzKQoreworCWlmKCBsaHMuaXNFcXVhbFRydWUoKSB8fCByaHMuaXNFcXVhbFRydWUoKSApCisJeworCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9UUlVFICk7CisJfQorCWVsc2UgaWYoIGxocy5pc0VxdWFsRmFsc2UoKSApCisJeworCQlyZXR1cm4oIHJocyApOworCX0KKwllbHNlIGlmKCByaHMuaXNFcXVhbEZhbHNlKCkgfHwgKGxocyA9PSByaHMpICkKKwl7CisJCXJldHVybiggbGhzICk7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfT1IsIGxocywgcmhzKSApOworCX0KK30KKworQkYgRXhwcmVzc2lvblNpbXBsaWZpZXI6Ok9SKFZlY3RvcjwgQkYgPiAmIGFyZ3MpCit7CisJQkZDb2RlIHJlc0VYUFIoIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfT1IgKTsKKworCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0UmVzOworCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGVuZFJlczsKKworCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0QXJnID0gYXJncy5iZWdpbigpOworCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGVuZEFyZyA9IGFyZ3MuZW5kKCk7CisJZm9yKCA7IGl0QXJnICE9IGVuZEFyZyA7ICsraXRBcmcgKQorCXsKKwkJaWYoICgqaXRBcmcpLmlzRXF1YWxUcnVlKCkgKQorCQl7CisJCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9UUlVFICk7CisJCX0KKwkJZWxzZSBpZiggKCppdEFyZykuaXNOb3RFcXVhbEZhbHNlKCkgKQorCQl7CisJCQllbmRSZXMgPSByZXNFWFBSLT5lbmQoKTsKKwkJCWZvciggaXRSZXMgPSByZXNFWFBSLT5iZWdpbigpIDsgaXRSZXMgIT0gZW5kUmVzIDsgKytpdFJlcyApCisJCQl7CisJCQkJaWYoICgqaXRBcmcpLmlzRVEoICppdFJlcyApICApCisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmKCBpdFJlcyA9PSBlbmRSZXMgKQorCQkJeworCQkJCXJlc0VYUFItPmFwcGVuZCggKCppdEFyZykgKTsKKwkJCX0KKwkJfQorCX0KKworCWlmKCByZXNFWFBSLT5wb3B1bGF0ZWQoKSApCisJeworCQlyZXR1cm4oIHJlc0VYUFIgKTsKKwl9CisJZWxzZSBpZiggcmVzRVhQUi0+bm9uZW1wdHkoKSApCisJeworCQlyZXR1cm4oIHJlc0VYUFItPmZpcnN0KCkgKTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RhbnQ6OkJPT0xFQU5fVFJVRSApOworCX0KK30KKworCitCRiBFeHByZXNzaW9uU2ltcGxpZmllcjo6Tk9SKGNvbnN0IEJGICYgbGhzLCBjb25zdCBCRiAmIHJocykKK3sKKwlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfTk9SLCBsaHMsIHJocykgKTsKK30KKworQkYgRXhwcmVzc2lvblNpbXBsaWZpZXI6Ok5PUihWZWN0b3I8IEJGID4gJiBhcmdzKQoreworCUJGQ29kZSByZXNFWFBSKCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX05PUiApOworCisJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXRSZXM7CisJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kUmVzOworCisJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXRBcmcgPSBhcmdzLmJlZ2luKCk7CisJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kQXJnID0gYXJncy5lbmQoKTsKKwlmb3IoIDsgaXRBcmcgIT0gZW5kQXJnIDsgKytpdEFyZyApCisJeworCQlpZiggKCppdEFyZykuaXNFcXVhbFRydWUoKSApCisJCXsKKwkJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX0ZBTFNFICk7CisJCX0KKwkJZWxzZSBpZiggKCppdEFyZykuaXNOb3RFcXVhbEZhbHNlKCkgKQorCQl7CisJCQllbmRSZXMgPSByZXNFWFBSLT5lbmQoKTsKKwkJCWZvciggaXRSZXMgPSByZXNFWFBSLT5iZWdpbigpIDsgaXRSZXMgIT0gZW5kUmVzIDsgKytpdFJlcyApCisJCQl7CisJCQkJaWYoICgqaXRBcmcpLmlzRVEoICppdFJlcyApICApCisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmKCBpdFJlcyA9PSBlbmRSZXMgKQorCQkJeworCQkJCXJlc0VYUFItPmFwcGVuZCggKCppdEFyZykgKTsKKwkJCX0KKwkJfQorCX0KKworCWlmKCByZXNFWFBSLT5wb3B1bGF0ZWQoKSApCisJeworCQlyZXR1cm4oIHJlc0VYUFIgKTsKKwl9CisJZWxzZSBpZiggcmVzRVhQUi0+bm9uZW1wdHkoKSApCisJeworCQlyZXR1cm4oIHJlc0VYUFItPmZpcnN0KCkgKTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RhbnQ6OkJPT0xFQU5fRkFMU0UgKTsKKwl9Cit9CisKKworCitCRiBFeHByZXNzaW9uU2ltcGxpZmllcjo6WE9SKGNvbnN0IEJGICYgbGhzLCBjb25zdCBCRiAmIHJocykKK3sKKwlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfWE9SLCBsaHMsIHJocykgKTsKK30KKworQkYgRXhwcmVzc2lvblNpbXBsaWZpZXI6OlhPUihWZWN0b3I8IEJGID4gJiBhcmdzKQoreworCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9YT1IsIGFyZ3MpICk7Cit9CisKKworQkYgRXhwcmVzc2lvblNpbXBsaWZpZXI6OlhOT1IoY29uc3QgQkYgJiBsaHMsIGNvbnN0IEJGICYgcmhzKQoreworCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9YTk9SLCBsaHMsIHJocykgKTsKK30KKworQkYgRXhwcmVzc2lvblNpbXBsaWZpZXI6OlhOT1IoVmVjdG9yPCBCRiA+ICYgYXJncykKK3sKKwlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfWE5PUiwgYXJncykgKTsKK30KKworCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFBSRURJQ0FURSBTSU1QTElGSUVSCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitCRiBFeHByZXNzaW9uU2ltcGxpZmllcjo6c2ltcGxpZihjb25zdCBCRiAmIGV4cHIpCit7CisJaWYgKCBleHByLnZhbGlkKCkgKQorCXsKKwkJcmV0dXJuKCBleHByICk7CisKKwkJQVZNX09TX1dBUk5JTkdfQUxFUlQKKwkJCQk8PCAiVG9kbzogc2ltcGxpZiB0aGUgRXhwcmVzc2lvblxuIgorCQkJCTw8IGV4cHIudG9TdHJpbmcoIEFWTV9UQUIxX0lOREVOVCApCisJCQkJPDwgU0VORF9BTEVSVDsKKwl9CisKKwlyZXR1cm4oIGV4cHIgKTsKK30KKworCisKK0JGIEV4cHJlc3Npb25TaW1wbGlmaWVyOjpzaW1wbGlmX2FuZChjb25zdCBCRiAmIGFyZzAsIGNvbnN0IEJGICYgYXJnMSkKK3sKKwlpZiggYXJnMC5pc0VxdWFsRmFsc2UoKSB8fCBhcmcxLmlzRXF1YWxGYWxzZSgpICkKKwl7CisJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX0ZBTFNFICk7CisJfQorCWVsc2UgaWYoIGFyZzEuaXNFcXVhbFRydWUoKSApCisJeworCQlyZXR1cm4oIGFyZzAgKTsKKwl9CisJZWxzZSBpZiggYXJnMC5pc0VxdWFsVHJ1ZSgpIHx8IChhcmcwID09IGFyZzEpICkKKwl7CisJCXJldHVybiggYXJnMSApOworCX0KKworCWVsc2UKKwl7CisJCXJldHVybiggRXhwcmVzc2lvblNpbXBsaWZpZXI6OnNpbXBsaWYoCisJCQkJRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjphbmRFeHByKGFyZzAsIGFyZzEpKSApOworCX0KK30KKworCitCRiBFeHByZXNzaW9uU2ltcGxpZmllcjo6c2ltcGxpZl9vcihjb25zdCBCRiAmIGFyZzAsIGNvbnN0IEJGICYgYXJnMSkKK3sKKwlpZiggYXJnMC5pc0VxdWFsVHJ1ZSgpIHx8IGFyZzEuaXNFcXVhbFRydWUoKSApCisJeworCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9UUlVFICk7CisJfQorCWVsc2UgaWYoIGFyZzEuaXNFcXVhbEZhbHNlKCkgKQorCXsKKwkJcmV0dXJuKCBhcmcwICk7CisJfQorCWVsc2UgaWYoIGFyZzAuaXNFcXVhbEZhbHNlKCkgfHwgKGFyZzAgPT0gYXJnMSkgKQorCXsKKwkJcmV0dXJuKCBhcmcxICk7CisJfQorCisJZWxzZQorCXsKKwkJcmV0dXJuKCBFeHByZXNzaW9uU2ltcGxpZmllcjo6c2ltcGxpZigKKwkJCQlFeHByZXNzaW9uQ29uc3RydWN0b3I6Om9yRXhwcihhcmcwLCBhcmcxKSkgKTsKKwl9Cit9CisKKworQkYgRXhwcmVzc2lvblNpbXBsaWZpZXI6OnNpbXBsaWZfbm90KGNvbnN0IEJGICYgYXJnMCkKK3sKKwlpZiggYXJnMC5pc0VxdWFsVHJ1ZSgpICkKKwl7CisJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX0ZBTFNFICk7CisJfQorCWVsc2UgaWYoIGFyZzAuaXNFcXVhbEZhbHNlKCkgKQorCXsKKwkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RhbnQ6OkJPT0xFQU5fVFJVRSApOworCX0KKworCWVsc2UKKwl7CisJCXJldHVybiggRXhwcmVzc2lvblNpbXBsaWZpZXI6OnNpbXBsaWYoCisJCQkJRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpub3RFeHByKGFyZzApKSAgKTsKKwl9Cit9CisKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25TaW1wbGlmaWVyLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uU2ltcGxpZmllci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNzMwNTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uU2ltcGxpZmllci5oCkBAIC0wLDAgKzEsMTE1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTIgamFudi4gMjAxMgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEVYUFJFU1NJT05TSU1QTElGSUVSX0hfCisjZGVmaW5lIEVYUFJFU1NJT05TSU1QTElGSUVSX0hfCisKKyNpbmNsdWRlIDxjb21tb24vQkYuaD4KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vVmVjdG9yLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9Bdm1Db2RlLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIEV4cHJlc3Npb25TaW1wbGlmaWVyCit7CisKK3B1YmxpYzoKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBBUklUSE1FVElDIFNJTVBMSUZJRVIKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlzdGF0aWMgQkYgUExVUyhjb25zdCBCRiAmIGxocywgY29uc3QgQkYgJiByaHMpOworCXN0YXRpYyBCRiBQTFVTKFZlY3RvcjwgQkYgPiAmIGFyZ3MpOworCisJc3RhdGljIEJGIE1JTlVTKGNvbnN0IEJGICYgbGhzLCBjb25zdCBCRiAmIHJocyk7CisKKwlzdGF0aWMgQkYgVU1JTlVTKGNvbnN0IEJGICYgYXJnKTsKKworCXN0YXRpYyBCRiBNVUxUKGNvbnN0IEJGICYgbGhzLCBjb25zdCBCRiAmIHJocyk7CisJc3RhdGljIEJGIE1VTFQoVmVjdG9yPCBCRiA+ICYgYXJncyk7CisKKwlzdGF0aWMgQkYgUE9XKGNvbnN0IEJGICYgbGhzLCBjb25zdCBCRiAmIHJocyk7CisKKwlzdGF0aWMgQkYgRElWKGNvbnN0IEJGICYgbGhzLCBjb25zdCBCRiAmIHJocyk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBDT01QQVJFUiBTSU1QTElGSUVSCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJc3RhdGljIEJGIEVRKGNvbnN0IEJGICYgbGhzLCBjb25zdCBCRiAmIHJocyk7CisJc3RhdGljIEJGIE5FUShjb25zdCBCRiAmIGxocywgY29uc3QgQkYgJiByaHMpOworCisJc3RhdGljIEJGIFNFUShjb25zdCBCRiAmIGxocywgY29uc3QgQkYgJiByaHMpOworCXN0YXRpYyBCRiBOU0VRKGNvbnN0IEJGICYgbGhzLCBjb25zdCBCRiAmIHJocyk7CisKKwlzdGF0aWMgQkYgTFQoY29uc3QgQkYgJiBsaHMsIGNvbnN0IEJGICYgcmhzKTsKKwlzdGF0aWMgQkYgTFRFKGNvbnN0IEJGICYgbGhzLCBjb25zdCBCRiAmIHJocyk7CisKKwlzdGF0aWMgQkYgR1QoY29uc3QgQkYgJiBsaHMsIGNvbnN0IEJGICYgcmhzKTsKKwlzdGF0aWMgQkYgR1RFKGNvbnN0IEJGICYgbGhzLCBjb25zdCBCRiAmIHJocyk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBMT0dJQyBTSU1QTElGSUVSCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJc3RhdGljIEJGIE5PVChjb25zdCBCRiAmIGFyZyk7CisKKwlzdGF0aWMgQkYgQU5EKGNvbnN0IEJGICYgbGhzLCBjb25zdCBCRiAmIHJocyk7CisJc3RhdGljIEJGIEFORChWZWN0b3I8IEJGID4gJiBhcmdzKTsKKworCXN0YXRpYyBCRiBOQU5EKGNvbnN0IEJGICYgbGhzLCBjb25zdCBCRiAmIHJocyk7CisJc3RhdGljIEJGIE5BTkQoVmVjdG9yPCBCRiA+ICYgYXJncyk7CisKKwlzdGF0aWMgQkYgWEFORChjb25zdCBCRiAmIGxocywgY29uc3QgQkYgJiByaHMpOworCXN0YXRpYyBCRiBYQU5EKFZlY3RvcjwgQkYgPiAmIGFyZ3MpOworCisJc3RhdGljIEJGIE9SKGNvbnN0IEJGICYgbGhzLCBjb25zdCBCRiAmIHJocyk7CisJc3RhdGljIEJGIE9SKFZlY3RvcjwgQkYgPiAmIGFyZ3MpOworCisJc3RhdGljIEJGIE5PUihjb25zdCBCRiAmIGxocywgY29uc3QgQkYgJiByaHMpOworCXN0YXRpYyBCRiBOT1IoVmVjdG9yPCBCRiA+ICYgYXJncyk7CisKKwlzdGF0aWMgQkYgWE9SKGNvbnN0IEJGICYgbGhzLCBjb25zdCBCRiAmIHJocyk7CisJc3RhdGljIEJGIFhPUihWZWN0b3I8IEJGID4gJiBhcmdzKTsKKworCXN0YXRpYyBCRiBYTk9SKGNvbnN0IEJGICYgbGhzLCBjb25zdCBCRiAmIHJocyk7CisJc3RhdGljIEJGIFhOT1IoVmVjdG9yPCBCRiA+ICYgYXJncyk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBQUkVESUNBVEUgU0lNUExJRklFUgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXN0YXRpYyBCRiBzaW1wbGlmKGNvbnN0IEJGICYgZXhwcik7CisKKwlzdGF0aWMgQkYgc2ltcGxpZl9hbmQoY29uc3QgQkYgJiBhcmcwLCBjb25zdCBCRiAmIGFyZzEpOworCisJc3RhdGljIEJGIHNpbXBsaWZfb3IoY29uc3QgQkYgJiBhcmcwLCBjb25zdCBCRiAmIGFyZzEpOworCisJc3RhdGljIEJGIHNpbXBsaWZfbm90KGNvbnN0IEJGICYgYXJnMCk7CisKK307CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisjZW5kaWYgLyogRVhQUkVTU0lPTlNJTVBMSUZJRVJfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25UeXBlQ2hlY2tlci5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uVHlwZUNoZWNrZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MzNlYzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uVHlwZUNoZWNrZXIuY3BwCkBAIC0wLDAgKzEsMTMyNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuDQorICoNCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ3JlYXRlZCBvbjogMTggc2VwdC4gMjAwOQ0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyDQorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2luY2x1ZGUgIkV4cHJlc3Npb25UeXBlQ2hlY2tlci5oIg0KKw0KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mTWFjaGluZS5oPg0KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9CdWlsdGluQXJyYXkuaD4NCisjaW5jbHVkZSA8Zm1sL2J1aWx0aW4vSWRlbnRpZmllci5oPg0KKyNpbmNsdWRlIDxmbWwvYnVpbHRpbi9RdWFsaWZpZWRJZGVudGlmaWVyLmg+DQorDQorI2luY2x1ZGUgPGZtbC90eXBlL0Jhc2VUeXBlU3BlY2lmaWVyLmg+DQorI2luY2x1ZGUgPGZtbC90eXBlL0NsYXNzVHlwZVNwZWNpZmllci5oPg0KKyNpbmNsdWRlIDxmbWwvdHlwZS9Db250YWluZXJUeXBlU3BlY2lmaWVyLmg+DQorI2luY2x1ZGUgPGZtbC90eXBlL0VudW1UeXBlU3BlY2lmaWVyLmg+DQorI2luY2x1ZGUgPGZtbC90eXBlL0ludGVydmFsVHlwZVNwZWNpZmllci5oPg0KKyNpbmNsdWRlIDxmbWwvdHlwZS9UeXBlQWxpYXNTcGVjaWZpZXIuaD4NCisjaW5jbHVkZSA8Zm1sL3R5cGUvVHlwZU1hbmFnZXIuaD4NCisNCisNCituYW1lc3BhY2Ugc2VwDQorew0KKw0KKw0KK2Jvb2wgRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc0ZpbmFsU3ltYm9saWNCYXNpY1N5bWJvbChjb25zdCBCRiAmIGFuRWxlbWVudCkNCit7DQorCWlmKCBhbkVsZW1lbnQuaXM8IElkZW50aWZpZXIgPigpIHx8IGFuRWxlbWVudC5pczwgUXVhbGlmaWVkSWRlbnRpZmllciA+KCkgKQ0KKwl7DQorCQlyZXR1cm4oIGZhbHNlICk7DQorCX0NCisJZWxzZSBpZiggYW5FbGVtZW50LmlzPCBCdWlsdGluRm9ybSA+KCkgKQ0KKwl7DQorCQlyZXR1cm4oIHRydWUgKTsNCisJfQ0KKw0KKwllbHNlIGlmKCBhbkVsZW1lbnQuaXM8IEluc3RhbmNlT2ZEYXRhID4oKSAgKQ0KKwl7DQorCQlJbnN0YW5jZU9mRGF0YSAqIGFuSW5zdGFuY2UgPSBhbkVsZW1lbnQudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCk7DQorDQorCQlpZiggYW5JbnN0YW5jZS0+aXNUeXBlZEVudW0oKSApDQorCQl7DQorCQkJcmV0dXJuKCBhbkluc3RhbmNlLT5pc0VudW1TeW1ib2xQb2ludGVyKCkgKTsNCisJCX0NCisJCWVsc2UgaWYoIGFuSW5zdGFuY2UtPmlzVHlwZWRNYWNoaW5lKCkgKQ0KKwkJew0KKwkJCXJldHVybiggdHJ1ZSApOw0KKwkJfQ0KKy8vCQllbHNlIGlmKCBhbkluc3RhbmNlLT5nZXRNb2RpZmllcigpLmhhc01vZGlmaWVyUHVibGljRmluYWxTdGF0aWMoKSApDQorLy8JCXsNCisvLwkJCXJldHVybiggdHJ1ZSApOw0KKy8vCQl9DQorCX0NCisNCisJZWxzZSBpZiggYW5FbGVtZW50LmlzPCBJbnN0YW5jZU9mTWFjaGluZSA+KCkNCisJCQkmJiBhbkVsZW1lbnQudG9fcHRyPCBJbnN0YW5jZU9mTWFjaGluZSA+KCktPg0KKwkJCQkJZ2V0TW9kaWZpZXIoKS5oYXNNb2RpZmllclB1YmxpY0ZpbmFsU3RhdGljKCkgKQ0KKwl7DQorCQlyZXR1cm4oIHRydWUgKTsNCisJfQ0KKw0KKwllbHNlIGlmKCBhbkVsZW1lbnQuaXM8IEJhc2VJbnN0YW5jZUZvcm0gPigpDQorCQkJJiYgYW5FbGVtZW50LnRvX3B0cjwgQmFzZUluc3RhbmNlRm9ybSA+KCktPg0KKwkJCQkJZ2V0TW9kaWZpZXIoKS5oYXNNb2RpZmllclB1YmxpY0ZpbmFsU3RhdGljKCkgKQ0KKwl7DQorCQlyZXR1cm4oIHRydWUgKTsNCisJfQ0KKw0KKwllbHNlIGlmKCBhbkVsZW1lbnQuaXNfc3RyaWN0bHk8IEJ1aWx0aW5BcnJheSA+KCkgKQ0KKwl7DQorCQlyZXR1cm4oIHRydWUgKTsNCisJfQ0KKw0KKwlyZXR1cm4oIGZhbHNlICk7DQorfQ0KKw0KKw0KK2Jvb2wgRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc0ZpbmFsU3ltYm9saWNDb21wb3NpdGVTeW1ib2woY29uc3QgQkYgJiBhbkVsZW1lbnQpDQorew0KKwlpZiggYW5FbGVtZW50LmlzPCBCdWlsdGluQXJyYXkgPigpICkNCisJew0KKwkJcmV0dXJuKCBpc0ZpbmFsU3ltYm9saWNDb21wb3NpdGVTeW1ib2woYW5FbGVtZW50LnRvX3B0cjwgQnVpbHRpbkFycmF5ID4oKSkgKTsNCisJfQ0KKwllbHNlDQorCXsNCisJCXJldHVybiggZmFsc2UgKTsNCisJfQ0KK30NCisNCisNCitib29sIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNGaW5hbFN5bWJvbGljQ29tcG9zaXRlU3ltYm9sKA0KKwkJQnVpbHRpbkFycmF5ICogYXJyYXlGb3JtKQ0KK3sNCisJaWYoIGFycmF5Rm9ybS0+aXNfc3RyaWN0bHk8IEFycmF5QkYgPigpICkNCisJew0KKwkJcmV0dXJuKCB0cnVlICk7DQorCX0NCisJaWYoIGFycmF5Rm9ybS0+aXM8IEFycmF5QkYgPigpICkNCisJew0KKwkJQXJyYXlCRiAqIGJmQXJyYXkgPSBhcnJheUZvcm0tPnRvPCBBcnJheUJGID4oKTsNCisJCWZvciggYXZtX3NpemVfdCBpZHggPSAwIDsgaWR4IDwgYmZBcnJheS0+c2l6ZSgpIDsgKytpZHggKQ0KKwkJew0KKwkJCWlmKCBub3QgaXNGaW5hbFN5bWJvbGljU3ltYm9sKCBiZkFycmF5LT5hdChpZHgpICkgKQ0KKwkJCXsNCisJCQkJcmV0dXJuKCBmYWxzZSApOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwlyZXR1cm4oIGZhbHNlICk7DQorfQ0KKw0KKw0KK2Jvb2wgRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc01hY2hpbmUoY29uc3QgQkYgJiBhbkV4cHIpDQorew0KKwlpZiggKGFuRXhwci5pczwgQmFzZUluc3RhbmNlRm9ybSA+KCkgJiYNCisJCWFuRXhwci50b19wdHI8IEJhc2VJbnN0YW5jZUZvcm0gPigpLT5pc1R5cGVkTWFjaGluZSgpKSB8fA0KKwkJYW5FeHByLmlzPCBSdW50aW1lSUQgPigpICkNCisJew0KKwkJcmV0dXJuKCB0cnVlICk7DQorCX0NCisJZWxzZQ0KKwl7DQorCQlyZXR1cm4oIFN0YXRlbWVudFR5cGVDaGVja2VyOjppc01hY2hpbmUoIGFuRXhwciApICk7DQorCX0NCit9DQorDQorDQorYm9vbCBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzQXJyYXkoDQorCQlDb250YWluZXJUeXBlU3BlY2lmaWVyICogcmVmVHlwZVNwZWNpZmllciwgY29uc3QgQkYgJiBhbkV4cHIpDQorew0KKwlpZiggYW5FeHByLmlzPCBBcnJheUJGID4oKSApDQorCXsNCisJCUFycmF5QkYgKiBiQXJyYXkgPSBhbkV4cHIudG9fcHRyPCBBcnJheUJGID4oKTsNCisJCWZvciggYXZtX3NpemVfdCBpZHggPSAxIDsgaWR4IDwgYkFycmF5LT5zaXplKCkgOyArK2lkeCApDQorCQl7DQorCQkJaWYoIG5vdCBpc1R5cGVkKHJlZlR5cGVTcGVjaWZpZXItPmdldENvbnRlbnRzVHlwZVNwZWNpZmllcigpLA0KKwkJCQkJYkFycmF5LT5hdChpZHgpKSApDQorCQkJew0KKwkJCQlyZXR1cm4oIGZhbHNlICk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuKCB0cnVlICk7DQorCX0NCisJZWxzZSBpZiggYW5FeHByLmlzPCBCdWlsdGluQXJyYXkgPigpICkNCisJew0KKwkJQnVpbHRpbkFycmF5ICogYkFycmF5ID0gYW5FeHByLnRvX3B0cjwgQnVpbHRpbkFycmF5ID4oKTsNCisNCisJCWlmKCByZWZUeXBlU3BlY2lmaWVyID09IGJBcnJheS0+Z2V0VHlwZVNwZWNpZmllcigpICkNCisJCXsNCisJCQlyZXR1cm4oIHRydWUgKTsNCisJCX0NCisJCWVsc2UgaWYoIGJBcnJheS0+Z2V0VHlwZVNwZWNpZmllcigpLT5pc1R5cGVkQXJyYXkoKSAmJg0KKwkJCQkocmVmVHlwZVNwZWNpZmllci0+Z2V0Q29udGVudHNUeXBlU3BlY2lmaWVyKCkgPT0gYkFycmF5LT4NCisJCQkJCQlnZXRUeXBlU3BlY2lmaWVyKCktPmFzPCBDb250YWluZXJUeXBlU3BlY2lmaWVyID4oKS0+DQorCQkJCQkJZ2V0Q29udGVudHNUeXBlU3BlY2lmaWVyKCkpICkNCisJCXsNCisJCQlyZXR1cm4oIHRydWUgKTsNCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQlBVk1fT1NfV0FSTiA8PCAiRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc0FycmF5IDo+IHJlZjwgQCAiDQorCQkJCQk8PCByZWZUeXBlU3BlY2lmaWVyIDw8ICItPiIgPDwgcmVmVHlwZVNwZWNpZmllci0+c3RyVCgpDQorCQkJCQk8PCAiID4gPS89ICBkdHlwZTwgQCAiDQorCQkJCQk8PCBiQXJyYXktPmdldFR5cGVTcGVjaWZpZXIoKQ0KKwkJCQkJPDwgIi0+ICIgPDwgYkFycmF5LT5nZXRUeXBlU3BlY2lmaWVyKCktPnN0clQoKQ0KKwkJCQkJPDwgIiA+IiA8PCBzdGQ6OmVuZGw7DQorDQorLy8JCQliQXJyYXktPmdldFR5cGVTcGVjaWZpZXIoKS0+dG9TdHJlYW0oQVZNX09TX1dBUk4pOw0KKwkJfQ0KKwkJcmV0dXJuKCBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OndlYWtseVR5cGVkKA0KKwkJCQlyZWZUeXBlU3BlY2lmaWVyLT5nZXRDb250ZW50c1R5cGVTcGVjaWZpZXIoKSwNCisJCQkJYkFycmF5LT5nZXRUeXBlU3BlY2lmaWVyKCkpICk7DQorCX0NCisJZWxzZSBpZiggYW5FeHByLmlzPCBCYXNlSW5zdGFuY2VGb3JtID4oKSApDQorCXsNCisJCXJldHVybiggRXhwcmVzc2lvblR5cGVDaGVja2VyOjp3ZWFrbHlUeXBlZCgNCisJCQkJcmVmVHlwZVNwZWNpZmllci0+Z2V0Q29udGVudHNUeXBlU3BlY2lmaWVyKCksDQorCQkJCWFuRXhwci50b19wdHI8IEJhc2VJbnN0YW5jZUZvcm0gPigpLT5nZXRUeXBlU3BlY2lmaWVyKCkpICk7DQorCX0NCisNCisJZWxzZSByZXR1cm4oIGZhbHNlICk7DQorfQ0KKw0KKw0KK2Jvb2wgRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc0NsYXNzKA0KKwkJQ2xhc3NUeXBlU3BlY2lmaWVyICogcmVmVHlwZVNwZWNpZmllciwgY29uc3QgQkYgJiBhbkV4cHIpDQorew0KKwlpZiggYW5FeHByLmlzPCBCdWlsdGluQXJyYXkgPigpICkNCisJew0KKwkJQnVpbHRpbkFycmF5ICogYkFycmF5ID0gYW5FeHByLnRvX3B0cjwgQnVpbHRpbkFycmF5ID4oKTsNCisNCisJCWlmKCByZWZUeXBlU3BlY2lmaWVyID09IGJBcnJheS0+Z2V0VHlwZVNwZWNpZmllcigpICkNCisJCXsNCisJCQlyZXR1cm4oIHRydWUgKTsNCisJCX0NCisJCWVsc2UgaWYoIHJlZlR5cGVTcGVjaWZpZXItPnNpemUoKSAhPSBiQXJyYXktPnNpemUoKSApDQorCQl7DQorCQkJcmV0dXJuKCBmYWxzZSApOw0KKwkJfQ0KKwkJZWxzZSBpZiggYkFycmF5LT5oYXNUeXBlU3BlY2lmaWVyKCkgJiYNCisJCQkJYW5FeHByLmlzX3N0cmljdGx5PCBCdWlsdGluQXJyYXkgPigpICYmDQorCQkJCWJBcnJheS0+Z2V0VHlwZVNwZWNpZmllcigpLT5oYXNUeXBlQ29udGFpbmVyKCkgKQ0KKwkJew0KKwkJCUJhc2VUeXBlU3BlY2lmaWVyICogZWx0VFMgPSBiQXJyYXktPmdldFR5cGVTcGVjaWZpZXIoKS0+DQorCQkJCQlhczwgQ29udGFpbmVyVHlwZVNwZWNpZmllciA+KCktPmdldENvbnRlbnRzVHlwZVNwZWNpZmllcigpOw0KKw0KKwkJCVRhYmxlT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGl0ID0NCisJCQkJCXJlZlR5cGVTcGVjaWZpZXItPmdldFN5bWJvbERhdGEoKS5iZWdpbigpOw0KKwkJCVRhYmxlT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0NCisJCQkJCXJlZlR5cGVTcGVjaWZpZXItPmdldFN5bWJvbERhdGEoKS5lbmQoKTsNCisJCQlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkNCisJCQl7DQorCQkJCWlmKCBub3QgRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc1R5cGVkKA0KKwkJCQkJCSgqaXQpLmdldFR5cGVTcGVjaWZpZXIoKSwgZWx0VFMpICkNCisJCQkJew0KKwkJCQkJQVZNX09TX1dBUk4gPDwgIkV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNDbGFzcyA6PiByZWY8ICINCisJCQkJCQkJPDwgKCppdCkuZ2V0VHlwZVNwZWNpZmllcigpLT5zdHJUKCkNCisJCQkJCQkJPDwgIiA+ID0vPSAgZHR5cGU8ICIgPDwgZWx0VFMtPnN0clQoKSA8PCAiID4iDQorCQkJCQkJCTw8IHN0ZDo6ZW5kbDsNCisNCisJCQkJCXJldHVybiggZmFsc2UgKTsNCisJCQkJfQ0KKwkJCX0NCisJCQlyZXR1cm4oIHRydWUgKTsNCisJCX0NCisJCWVsc2UgaWYoIGJBcnJheS0+aXM8IEFycmF5QkYgPigpICkNCisJCXsNCisJCQlBcnJheUJGICogYmZBcnJheSA9IGJBcnJheS0+dG88IEFycmF5QkYgPigpOw0KKw0KKwkJCVRhYmxlT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGl0ID0NCisJCQkJCXJlZlR5cGVTcGVjaWZpZXItPmdldFN5bWJvbERhdGEoKS5iZWdpbigpOw0KKwkJCVRhYmxlT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0NCisJCQkJCXJlZlR5cGVTcGVjaWZpZXItPmdldFN5bWJvbERhdGEoKS5lbmQoKTsNCisJCQlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMDsgaXQgIT0gZW5kSXQgOyArK2l0ICwgKytvZmZzZXQgKQ0KKwkJCXsNCisJCQkJaWYoIG5vdCBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzVHlwZWQoDQorCQkJCQkJKCppdCkuZ2V0VHlwZVNwZWNpZmllcigpLCBiZkFycmF5LT5hdChvZmZzZXQpKSApDQorCQkJCXsNCisJCQkJCUFWTV9PU19XQVJOIDw8ICJFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzQ2xhc3MgOj4gcmVmPCAiDQorCQkJCQkJCTw8ICgqaXQpLmdldFR5cGVTcGVjaWZpZXIoKS0+c3RyVCgpIDw8ICIgPiA9Lz0gYXJnPCINCisJCQkJCQkJPDwgc3RyX2luZGVudCggYmZBcnJheS0+YXQob2Zmc2V0KSApIDw8ICIgPiINCisJCQkJCQkJPDwgc3RkOjplbmRsOw0KKw0KKwkJCQkJcmV0dXJuKCBmYWxzZSApOw0KKwkJCQl9DQorCQkJfQ0KKwkJCXJldHVybiggdHJ1ZSApOw0KKwkJfQ0KKwl9DQorCWVsc2UgaWYoIGFuRXhwci5pczwgQmFzZUluc3RhbmNlRm9ybSA+KCkgKQ0KKwl7DQorCQlyZXR1cm4oIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNUeXBlZChyZWZUeXBlU3BlY2lmaWVyLA0KKwkJCQlhbkV4cHIudG9fcHRyPCBCYXNlSW5zdGFuY2VGb3JtID4oKS0+Z2V0VHlwZVNwZWNpZmllcigpKSApOw0KKwl9DQorCWVsc2UgaWYoIGFuRXhwci5pczwgQXJyYXlCRiA+KCkgKQ0KKwl7DQorCQlBcnJheUJGICogYmZBcnJheSA9IGFuRXhwci50b19wdHI8IEFycmF5QkYgPigpOw0KKw0KKwkJaWYoIHJlZlR5cGVTcGVjaWZpZXItPmdldFN5bWJvbERhdGEoKS5zaXplKCkgIT0gIGJmQXJyYXktPnNpemUoKSApDQorCQl7DQorCQkJcmV0dXJuKCBmYWxzZSApOw0KKwkJfQ0KKw0KKwkJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgaXQgPQ0KKwkJCQlyZWZUeXBlU3BlY2lmaWVyLT5nZXRTeW1ib2xEYXRhKCkuYmVnaW4oKTsNCisJCVRhYmxlT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0NCisJCQkJcmVmVHlwZVNwZWNpZmllci0+Z2V0U3ltYm9sRGF0YSgpLmVuZCgpOw0KKwkJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDA7IGl0ICE9IGVuZEl0IDsgKytpdCAsICsrb2Zmc2V0ICkNCisJCXsNCisJCQlpZiggbm90IEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNUeXBlZCgNCisJCQkJCSgqaXQpLmdldFR5cGVTcGVjaWZpZXIoKSwgYmZBcnJheS0+Z2V0KG9mZnNldCkpICkNCisJCQl7DQorCQkJCUFWTV9PU19XQVJOIDw8ICJFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzQ2xhc3MgOj4gcmVmPCAiDQorCQkJCQkJPDwgKCppdCkuZ2V0VHlwZVNwZWNpZmllcigpLT5zdHJUKCkNCisJCQkJCQk8PCAiID4gPS89ICBkdHlwZTwgIiA8PCBiZkFycmF5LT5nZXQob2Zmc2V0KS5zdHIoKQ0KKwkJCQkJCTw8ICIgPiIgPDwgc3RkOjplbmRsOw0KKwkJCQlyZXR1cm4oIGZhbHNlICk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuKCB0cnVlICk7DQorCX0NCisNCisJcmV0dXJuKCBmYWxzZSApOw0KK30NCisNCisNCitib29sIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNDb2xsZWN0aW9uKA0KKwkJQ29udGFpbmVyVHlwZVNwZWNpZmllciAqIHJlZlR5cGVTcGVjaWZpZXIsIGNvbnN0IEJGICYgYW5FeHByKQ0KK3sNCisJaWYoICBhbkV4cHIuaXM8IEFycmF5QkYgPigpICkNCisJew0KKwkJQXJyYXlCRiAqIGJBcnJheSA9IGFuRXhwci50b19wdHI8IEFycmF5QkYgPigpOw0KKwkJZm9yKCBhdm1fc2l6ZV90IGlkeCA9IDEgOyBpZHggPCBiQXJyYXktPnNpemUoKSA7ICsraWR4ICkNCisJCXsNCisJCQlpZiggbm90IGlzVHlwZWQocmVmVHlwZVNwZWNpZmllci0+Z2V0Q29udGVudHNUeXBlU3BlY2lmaWVyKCksDQorCQkJCQliQXJyYXktPmF0KGlkeCkpICkNCisJCQl7DQorCQkJCXJldHVybiggZmFsc2UgKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4oIHRydWUgKTsNCisJfQ0KKwllbHNlIGlmKCAgYW5FeHByLmlzPCBCdWlsdGluQ29udGFpbmVyID4oKSApDQorCXsNCisJCUJ1aWx0aW5Db250YWluZXIgKiBiQXJyYXkgPSBhbkV4cHIudG9fcHRyPCBCdWlsdGluQ29udGFpbmVyID4oKTsNCisJCWZvciggYXZtX3NpemVfdCBpZHggPSAxIDsgaWR4IDwgYkFycmF5LT5zaXplKCkgOyArK2lkeCApDQorCQl7DQorCQkJaWYoIG5vdCBpc1R5cGVkKHJlZlR5cGVTcGVjaWZpZXItPmdldENvbnRlbnRzVHlwZVNwZWNpZmllcigpLA0KKwkJCQkJYkFycmF5LT5hdChpZHgpKSApDQorCQkJew0KKwkJCQlyZXR1cm4oIGZhbHNlICk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuKCB0cnVlICk7DQorCX0NCisJZWxzZSBpZiggYW5FeHByLmlzPCBCdWlsdGluQXJyYXkgPigpICkNCisJew0KKwkJQnVpbHRpbkFycmF5ICogYkFycmF5ID0gYW5FeHByLnRvX3B0cjwgQnVpbHRpbkFycmF5ID4oKTsNCisNCisJCWlmKCByZWZUeXBlU3BlY2lmaWVyID09IGJBcnJheS0+Z2V0VHlwZVNwZWNpZmllcigpICkNCisJCXsNCisJCQlyZXR1cm4oIHRydWUgKTsNCisJCX0NCisJCWVsc2UgaWYoIGJBcnJheS0+Z2V0VHlwZVNwZWNpZmllcigpLT5pc1R5cGVkQXJyYXkoKSAmJg0KKwkJCQkocmVmVHlwZVNwZWNpZmllci0+Z2V0Q29udGVudHNUeXBlU3BlY2lmaWVyKCkgPT0gYkFycmF5LT4NCisJCQkJCQlnZXRUeXBlU3BlY2lmaWVyKCktPmFzPCBDb250YWluZXJUeXBlU3BlY2lmaWVyID4oKS0+DQorCQkJCQkJZ2V0Q29udGVudHNUeXBlU3BlY2lmaWVyKCkpICkNCisJCXsNCisJCQlyZXR1cm4oIHRydWUgKTsNCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQlBVk1fT1NfV0FSTiA8PCAiRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc0NvbGxlY3Rpb24gOj4gcmVmPCBAICINCisJCQkJCTw8IHJlZlR5cGVTcGVjaWZpZXIgPDwgIi0+IiA8PCByZWZUeXBlU3BlY2lmaWVyLT5zdHJUKCkNCisJCQkJCTw8ICIgPiA9Lz0gIGR0eXBlPCBAICINCisJCQkJCTw8IGJBcnJheS0+Z2V0VHlwZVNwZWNpZmllcigpDQorCQkJCQk8PCAiLT4gIiA8PCBiQXJyYXktPmdldFR5cGVTcGVjaWZpZXIoKS0+c3RyVCgpDQorCQkJCQk8PCAiID4iIDw8IHN0ZDo6ZW5kbDsNCisNCisvLwkJCWJBcnJheS0+Z2V0VHlwZVNwZWNpZmllcigpLT50b1N0cmVhbShBVk1fT1NfV0FSTik7DQorCQl9DQorCQlyZXR1cm4oIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6d2Vha2x5VHlwZWQoDQorCQkJCXJlZlR5cGVTcGVjaWZpZXItPmdldENvbnRlbnRzVHlwZVNwZWNpZmllcigpLA0KKwkJCQliQXJyYXktPmdldFR5cGVTcGVjaWZpZXIoKSkgKTsNCisJfQ0KKwllbHNlIGlmKCBhbkV4cHIuaXM8IEJhc2VJbnN0YW5jZUZvcm0gPigpICkNCisJew0KKwkJcmV0dXJuKCBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OndlYWtseVR5cGVkKA0KKwkJCQlyZWZUeXBlU3BlY2lmaWVyLT5nZXRDb250ZW50c1R5cGVTcGVjaWZpZXIoKSwNCisJCQkJYW5FeHByLnRvX3B0cjwgQmFzZUluc3RhbmNlRm9ybSA+KCktPmdldFR5cGVTcGVjaWZpZXIoKSkgKTsNCisJfQ0KKwllbHNlIGlmKCBhbkV4cHIuaXM8IEF2bUNvZGUgPigpICkNCisJew0KKwkJQXZtQ29kZSAqIGFDb2RlID0gYW5FeHByLnRvX3B0cjwgQXZtQ29kZSA+KCk7DQorDQorCQlpZiggT3BlcmF0b3JNYW5hZ2VyOjppc0NvbnRhaW5lck9wZXJhdGlvbihhQ29kZS0+Z2V0T3BlcmF0b3IoKSkgKQ0KKwkJew0KKwkJCXJldHVybiggRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc1R5cGVkKA0KKwkJCQkJcmVmVHlwZVNwZWNpZmllciwgYUNvZGUtPmZpcnN0KCkpICk7DQorCQl9DQorCQlpZiggT3BlcmF0b3JNYW5hZ2VyOjppc0NvbnRhaW5lckVsZW1lbnRBY2Nlc3MoYUNvZGUtPmdldE9wZXJhdG9yKCkpICkNCisJCXsNCisJCQlpZiggYUNvZGUtPmZpcnN0KCkuaXM8IEJhc2VJbnN0YW5jZUZvcm0gPigpICkNCisJCQl7DQorCQkJCUJhc2VUeXBlU3BlY2lmaWVyICogYnRzID0gYUNvZGUtPmZpcnN0KCkuDQorCQkJCQkJdG9fcHRyPCBCYXNlSW5zdGFuY2VGb3JtID4oKS0+Z2V0VHlwZVNwZWNpZmllcigpOw0KKw0KKwkJCQlyZXR1cm4oIGJ0cy0+aGFzVHlwZUNvbnRhaW5lcigpICYmDQorCQkJCQkJRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc1R5cGVkKHJlZlR5cGVTcGVjaWZpZXIsDQorCQkJCQkJCQlidHMtPmFzPCBDb250YWluZXJUeXBlU3BlY2lmaWVyID4oKS0+DQorCQkJCQkJCQlnZXRDb250ZW50c1R5cGVTcGVjaWZpZXIoKSkgKTsNCisJCQl9DQorCQkJZWxzZQ0KKwkJCXsNCisJCQkJcmV0dXJuKCBmYWxzZSApOw0KKwkJCX0NCisJCX0NCisNCisJCWVsc2UgcmV0dXJuKCBmYWxzZSApOw0KKwl9DQorDQorCWVsc2UgcmV0dXJuKCBmYWxzZSApOw0KK30NCisNCisNCitib29sIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNWZWN0b3IoY29uc3QgQkYgJiBhbkV4cHIpDQorew0KKwlpZiggIGFuRXhwci5pczwgQnVpbHRpblZlY3RvciA+KCkgKQ0KKwl7DQorCQlyZXR1cm4oIHRydWUgKTsNCisJfQ0KKwllbHNlIGlmKCBhbkV4cHIuaXM8IEJhc2VJbnN0YW5jZUZvcm0gPigpICkNCisJew0KKwkJcmV0dXJuKCBhbkV4cHIudG9fcHRyPCBCYXNlSW5zdGFuY2VGb3JtID4oKS0+DQorCQkJCWdldFR5cGVTcGVjaWZpZXIoKS0+aGFzVHlwZVZlY3RvcigpICk7DQorCX0NCisJZWxzZSBpZiggYW5FeHByLmlzPCBBdm1Db2RlID4oKSApDQorCXsNCisJCUF2bUNvZGUgKiBhQ29kZSA9IGFuRXhwci50b19wdHI8IEF2bUNvZGUgPigpOw0KKw0KKwkJaWYoIE9wZXJhdG9yTWFuYWdlcjo6aXNDb250YWluZXJPcGVyYXRpb24oYUNvZGUtPmdldE9wZXJhdG9yKCkpICkNCisJCXsNCisJCQlyZXR1cm4oIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNWZWN0b3IoIGFDb2RlLT5maXJzdCgpICkgKTsNCisJCX0NCisJCWVsc2UgaWYoIE9wZXJhdG9yTWFuYWdlcjo6aXNDdG9yKCBhQ29kZS0+Z2V0T3BlcmF0b3IoKSApICkNCisJCXsNCisJCQlyZXR1cm4oIGFDb2RlLT5maXJzdCgpLmlzPCBCYXNlVHlwZVNwZWNpZmllciA+KCkgJiYNCisJCQkJCWFDb2RlLT5maXJzdCgpLnRvX3B0cjwNCisJCQkJCQkJQmFzZVR5cGVTcGVjaWZpZXIgPigpLT5oYXNUeXBlVmVjdG9yKCkgKTsNCisJCX0NCisNCisJCWVsc2UgcmV0dXJuKCBmYWxzZSApOw0KKwl9DQorDQorCWVsc2UgcmV0dXJuKCBmYWxzZSApOw0KK30NCisNCisNCitib29sIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNFbnVtKA0KKwkJRW51bVR5cGVTcGVjaWZpZXIgKiByZWZUeXBlU3BlY2lmaWVyLCBjb25zdCBCRiAmIGFuRXhwcikNCit7DQorCWlmKCBhbkV4cHIuaXM8IEluc3RhbmNlT2ZEYXRhID4oKSApDQorCXsNCisJCWlmKCByZWZUeXBlU3BlY2lmaWVyID09IGFuRXhwci50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKS0+Z2V0VHlwZVNwZWNpZmllcigpICkNCisJCXsNCisJCQlyZXR1cm4oIHRydWUgKTsNCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQlBVk1fT1NfV0FSTiA8PCAiRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc0VudW0gOj4gcmVmPCBAICINCisJCQkJCTw8IHJlZlR5cGVTcGVjaWZpZXItPnN0clQoKSA8PCAiID4gPS89ICBkdHlwZTwgQCAiDQorCQkJCQk8PCBhbkV4cHIudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCktPmdldFR5cGVTcGVjaWZpZXIoKS0+c3RyVCgpDQorCQkJCQk8PCAiID4iIDw8IHN0ZDo6ZW5kbDsNCisNCisJCQlyZXR1cm4oIGZhbHNlKTsNCisJCX0NCisJfQ0KKwllbHNlIGlmKCBhbkV4cHIuaXM8IEJhc2VJbnN0YW5jZUZvcm0gPigpICkNCisJew0KKwkJcmV0dXJuKCBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzVHlwZWQocmVmVHlwZVNwZWNpZmllciwNCisJCQkJYW5FeHByLnRvX3B0cjwgQmFzZUluc3RhbmNlRm9ybSA+KCktPmdldFR5cGVTcGVjaWZpZXIoKSkgKTsNCisJfQ0KKw0KKwllbHNlIGlmKCBhbkV4cHIuaXNOdW1lcmljKCkgKQ0KKwl7DQorCQlyZXR1cm4oIHJlZlR5cGVTcGVjaWZpZXItPmhhc1N5bWJvbERhdGFXaXRoVmFsdWUoYW5FeHByKSApOw0KKwl9DQorDQorCWVsc2UgaWYoIGFuRXhwci5pczwgQXZtQ29kZSA+KCkgKQ0KKwl7DQorCQlBdm1Db2RlICogYUNvZGUgPSBhbkV4cHIudG9fcHRyPCBBdm1Db2RlID4oKTsNCisNCisJCWlmKCBPcGVyYXRvck1hbmFnZXI6OmlzQ29udGFpbmVyRWxlbWVudEFjY2VzcyhhQ29kZS0+Z2V0T3BlcmF0b3IoKSkgKQ0KKwkJew0KKwkJCWlmKCBhQ29kZS0+Zmlyc3QoKS5pczwgQmFzZUluc3RhbmNlRm9ybSA+KCkgKQ0KKwkJCXsNCisJCQkJQmFzZVR5cGVTcGVjaWZpZXIgKiBidHMgPSBhQ29kZS0+Zmlyc3QoKS4NCisJCQkJCQl0b19wdHI8IEJhc2VJbnN0YW5jZUZvcm0gPigpLT5nZXRUeXBlU3BlY2lmaWVyKCk7DQorDQorCQkJCXJldHVybiggYnRzLT5oYXNUeXBlQ29udGFpbmVyKCkgJiYNCisJCQkJCQlFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzVHlwZWQocmVmVHlwZVNwZWNpZmllciwNCisJCQkJCQkJCWJ0cy0+YXM8IENvbnRhaW5lclR5cGVTcGVjaWZpZXIgPigpLT4NCisJCQkJCQkJCWdldENvbnRlbnRzVHlwZVNwZWNpZmllcigpKSApOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwlyZXR1cm4oIGZhbHNlICk7DQorfQ0KKw0KKw0KKw0KK2Jvb2wgRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc0VudW0oY29uc3QgQkYgJiBhbkV4cHIpDQorew0KKwlpZiggYW5FeHByLmlzPCBCYXNlSW5zdGFuY2VGb3JtID4oKSApDQorCXsNCisJCXJldHVybiggYW5FeHByLnRvX3B0cjwgQmFzZUluc3RhbmNlRm9ybSA+KCktPmlzVHlwZWRFbnVtKCkgKTsNCisJfQ0KKw0KKwllbHNlIHJldHVybiggZmFsc2UgKTsNCit9DQorDQorDQorDQorYm9vbCBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzQ2hhcmFjdGVyKGNvbnN0IEJGICYgYW5FeHByKQ0KK3sNCisJaWYoIGFuRXhwci5pc0NoYXJhY3RlcigpICkNCisJew0KKwkJcmV0dXJuKCB0cnVlICk7DQorCX0NCisJZWxzZSBpZiggYW5FeHByLmlzPCBCYXNlSW5zdGFuY2VGb3JtID4oKSApDQorCXsNCisJCXJldHVybiggYW5FeHByLnRvX3B0cjwgQmFzZUluc3RhbmNlRm9ybSA+KCktPmlzVHlwZWRDaGFyYWN0ZXIoKSApOw0KKwl9DQorCWVsc2UgaWYoIGFuRXhwci5pczwgQXZtQ29kZSA+KCkgKQ0KKwl7DQorCQlBdm1Db2RlICogYUNvZGUgPSBhbkV4cHIudG9fcHRyPCBBdm1Db2RlID4oKTsNCisNCisJCWlmKCBhQ29kZS0+aGFzSW5zdHJ1Y3Rpb24oKSAmJiAoYUNvZGUtPmdldEluc3RydWN0aW9uKCktPg0KKwkJCQlnZXRNYWluUHJvY2Vzc29yKCkgPT0gQVZNX0FSR19DSEFSQUNURVJfQ1BVKSApDQorCQl7DQorCQkJcmV0dXJuKCB0cnVlICk7DQorCQl9DQorDQorCQllbHNlIGlmKCBPcGVyYXRvck1hbmFnZXI6OmlzQ3RvciggYUNvZGUtPmdldE9wZXJhdG9yKCkgKSApDQorCQl7DQorCQkJcmV0dXJuKCBhQ29kZS0+Zmlyc3QoKS5pczwgQmFzZVR5cGVTcGVjaWZpZXIgPigpICYmDQorCQkJCQlhQ29kZS0+Zmlyc3QoKS50b19wdHI8IEJhc2VUeXBlU3BlY2lmaWVyID4oKS0+DQorCQkJCQkJCWlzVHlwZWRDaGFyYWN0ZXIoKSApOw0KKwkJfQ0KKwkJZWxzZSBpZiggT3BlcmF0b3JNYW5hZ2VyOjppc0Fzc2lnbiggYUNvZGUtPmdldE9wZXJhdG9yKCkgKSApDQorCQl7DQorCQkJaWYoIGFDb2RlLT5maXJzdCgpLmlzPCBCYXNlSW5zdGFuY2VGb3JtID4oKSApDQorCQkJew0KKwkJCQlyZXR1cm4oIGFDb2RlLT5maXJzdCgpLnRvX3B0cjwgQmFzZUluc3RhbmNlRm9ybSA+KCkNCisJCQkJCQktPmlzVHlwZWRDaGFyYWN0ZXIoKSApOw0KKwkJCX0NCisJCQllbHNlIGlmKCBPcGVyYXRvck1hbmFnZXI6OmlzQXNzaWduQmluYXJ5KCBhQ29kZS0+Z2V0T3BlcmF0b3IoKSApICkNCisJCQl7DQorCQkJCXJldHVybiggRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc0NoYXJhY3RlcihhQ29kZS0+c2Vjb25kKCkpICk7DQorCQkJfQ0KKwkJCXJldHVybiggZmFsc2UgKTsNCisJCX0NCisJCWVsc2UgaWYoIE9wZXJhdG9yTWFuYWdlcjo6aXNDaGFyYWN0ZXIoIGFDb2RlLT5nZXRPcGVyYXRvcigpICkgKQ0KKwkJew0KKwkJCWZvcihBdm1Db2RlOjppdGVyYXRvciBpdCA9IGFDb2RlLT5iZWdpbigpIDsgaXQgIT0gYUNvZGUtPmVuZCgpIDsgKytpdCkNCisJCQl7DQorCQkJCWlmKCBub3QgRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc0NoYXJhY3RlciggKml0ICkgKQ0KKwkJCQl7DQorCQkJCQlyZXR1cm4oIGZhbHNlICk7DQorCQkJCX0NCisJCQl9DQorCQkJcmV0dXJuKCB0cnVlICk7DQorCQl9DQorCQllbHNlIGlmKCBPcGVyYXRvck1hbmFnZXI6OmlzQ29udGFpbmVyRWxlbWVudEFjY2VzcygNCisJCQkJYUNvZGUtPmdldE9wZXJhdG9yKCkgKSApDQorCQl7DQorCQkJaWYoIGFDb2RlLT5maXJzdCgpLmlzPCBCYXNlSW5zdGFuY2VGb3JtID4oKSApDQorCQkJew0KKwkJCQlCYXNlVHlwZVNwZWNpZmllciAqIGJ0cyA9IGFDb2RlLT5maXJzdCgpLg0KKwkJCQkJCXRvX3B0cjwgQmFzZUluc3RhbmNlRm9ybSA+KCktPmdldFR5cGVTcGVjaWZpZXIoKTsNCisNCisJCQkJcmV0dXJuKCBidHMtPmhhc1R5cGVDb250YWluZXIoKSAmJg0KKwkJCQkJCWJ0cy0+YXM8IENvbnRhaW5lclR5cGVTcGVjaWZpZXIgPigpLT4NCisJCQkJCQlnZXRDb250ZW50c1R5cGVTcGVjaWZpZXIoKS5pc1R5cGVkQ2hhcmFjdGVyKCkgKTsNCisJCQl9DQorCQkJZWxzZQ0KKwkJCXsNCisJCQkJcmV0dXJuKCBmYWxzZSApOw0KKwkJCX0NCisJCX0NCisJCWVsc2UgcmV0dXJuKCBmYWxzZSApOw0KKwl9DQorDQorCWVsc2UgcmV0dXJuKCBmYWxzZSApOw0KK30NCisNCisNCitib29sIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNTdHJpbmcoY29uc3QgQkYgJiBhbkV4cHIpDQorew0KKwlpZiggYW5FeHByLmlzQnVpbHRpblN0cmluZygpICkNCisJew0KKwkJcmV0dXJuKCB0cnVlICk7DQorCX0NCisJZWxzZSBpZiggYW5FeHByLmlzPCBCYXNlSW5zdGFuY2VGb3JtID4oKSApDQorCXsNCisJCXJldHVybiggYW5FeHByLnRvX3B0cjwgQmFzZUluc3RhbmNlRm9ybSA+KCktPmlzVHlwZWRTdHJpbmcoKSApOw0KKwl9DQorCWVsc2UgaWYoIGFuRXhwci5pczwgQXZtQ29kZSA+KCkgKQ0KKwl7DQorCQlBdm1Db2RlICogYUNvZGUgPSBhbkV4cHIudG9fcHRyPCBBdm1Db2RlID4oKTsNCisNCisJCWlmKCBhQ29kZS0+aGFzSW5zdHJ1Y3Rpb24oKSAmJiAoYUNvZGUtPmdldEluc3RydWN0aW9uKCktPg0KKwkJCQlnZXRNYWluUHJvY2Vzc29yKCkgPT0gQVZNX0FSR19TVFJJTkdfQ1BVKSApDQorCQl7DQorCQkJcmV0dXJuKCB0cnVlICk7DQorCQl9DQorDQorCQllbHNlIGlmKCBPcGVyYXRvck1hbmFnZXI6OmlzQ3RvciggYUNvZGUtPmdldE9wZXJhdG9yKCkgKSApDQorCQl7DQorCQkJcmV0dXJuKCBhQ29kZS0+Zmlyc3QoKS5pczwgQmFzZVR5cGVTcGVjaWZpZXIgPigpICYmDQorCQkJCWFDb2RlLT5maXJzdCgpLnRvX3B0cjwgQmFzZVR5cGVTcGVjaWZpZXIgPigpLT5pc1R5cGVkU3RyaW5nKCkgKTsNCisJCX0NCisJCWVsc2UgaWYoIE9wZXJhdG9yTWFuYWdlcjo6aXNBc3NpZ24oIGFDb2RlLT5nZXRPcGVyYXRvcigpICkgKQ0KKwkJew0KKwkJCWlmKCBhQ29kZS0+Zmlyc3QoKS5pczwgQmFzZUluc3RhbmNlRm9ybSA+KCkgKQ0KKwkJCXsNCisJCQkJcmV0dXJuKCBhQ29kZS0+Zmlyc3QoKS50b19wdHI8IEJhc2VJbnN0YW5jZUZvcm0gPigpDQorCQkJCQkJLT5pc1R5cGVkU3RyaW5nKCkgKTsNCisJCQl9DQorCQkJZWxzZSBpZiggT3BlcmF0b3JNYW5hZ2VyOjppc0Fzc2lnbkJpbmFyeSggYUNvZGUtPmdldE9wZXJhdG9yKCkgKSApDQorCQkJew0KKwkJCQlyZXR1cm4oIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNTdHJpbmcoYUNvZGUtPnNlY29uZCgpKSApOw0KKwkJCX0NCisJCQlyZXR1cm4oIGZhbHNlICk7DQorCQl9DQorCQllbHNlIGlmKCBPcGVyYXRvck1hbmFnZXI6OmlzU3RyaW5nKCBhQ29kZS0+Z2V0T3BlcmF0b3IoKSApICkNCisJCXsNCisJCQlmb3IoQXZtQ29kZTo6aXRlcmF0b3IgaXQgPSBhQ29kZS0+YmVnaW4oKSA7IGl0ICE9IGFDb2RlLT5lbmQoKSA7ICsraXQpDQorCQkJew0KKwkJCQlpZiggbm90IEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNTdHJpbmcoICppdCApICkNCisJCQkJew0KKwkJCQkJcmV0dXJuKCBmYWxzZSApOw0KKwkJCQl9DQorCQkJfQ0KKwkJCXJldHVybiggdHJ1ZSApOw0KKwkJfQ0KKwkJZWxzZSBpZiggT3BlcmF0b3JNYW5hZ2VyOjppc0NvbnRhaW5lckVsZW1lbnRBY2Nlc3MoDQorCQkJCWFDb2RlLT5nZXRPcGVyYXRvcigpICkgKQ0KKwkJew0KKwkJCWlmKCBhQ29kZS0+Zmlyc3QoKS5pczwgQmFzZUluc3RhbmNlRm9ybSA+KCkgKQ0KKwkJCXsNCisJCQkJQmFzZVR5cGVTcGVjaWZpZXIgKiBidHMgPSBhQ29kZS0+Zmlyc3QoKS4NCisJCQkJCQl0b19wdHI8IEJhc2VJbnN0YW5jZUZvcm0gPigpLT5nZXRUeXBlU3BlY2lmaWVyKCk7DQorDQorCQkJCXJldHVybiggYnRzLT5oYXNUeXBlQ29udGFpbmVyKCkgJiYNCisJCQkJCQlidHMtPmFzPCBDb250YWluZXJUeXBlU3BlY2lmaWVyID4oKS0+DQorCQkJCQkJZ2V0Q29udGVudHNUeXBlU3BlY2lmaWVyKCkuaXNUeXBlZFN0cmluZygpICk7DQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCXJldHVybiggZmFsc2UgKTsNCisJCQl9DQorCQl9DQorCQllbHNlIHJldHVybiggZmFsc2UgKTsNCisJfQ0KKw0KKwllbHNlIHJldHVybiggZmFsc2UgKTsNCit9DQorDQorDQorDQorYm9vbCBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzQm9vbGVhbihjb25zdCBCRiAmIGFuRXhwciwgYm9vbCBzdHJvbmdseVR5cGVkRmxhZykNCit7DQorCWlmKCBhbkV4cHIuaXNCb29sZWFuKCkgKQ0KKwl7DQorCQlyZXR1cm4oIHRydWUgKTsNCisJfQ0KKwllbHNlIGlmKCBhbkV4cHIuaXM8IEJhc2VJbnN0YW5jZUZvcm0gPigpICkNCisJew0KKwkJcmV0dXJuKCBhbkV4cHIudG9fcHRyPCBCYXNlSW5zdGFuY2VGb3JtID4oKS0+aXNUeXBlZEJvb2xlYW4oKSApOw0KKwl9DQorCWVsc2UgaWYoIGFuRXhwci5pczwgQXZtQ29kZSA+KCkgKQ0KKwl7DQorCQlBdm1Db2RlICogYUNvZGUgPSBhbkV4cHIudG9fcHRyPCBBdm1Db2RlID4oKTsNCisNCisJCWlmKCBPcGVyYXRvck1hbmFnZXI6OmlzQ3RvciggYUNvZGUtPmdldE9wZXJhdG9yKCkgKSApDQorCQl7DQorCQkJcmV0dXJuKCBhQ29kZS0+Zmlyc3QoKS5pczwgQmFzZVR5cGVTcGVjaWZpZXIgPigpICYmDQorCQkJCQlhQ29kZS0+Zmlyc3QoKS50b19wdHI8IEJhc2VUeXBlU3BlY2lmaWVyID4oKS0+DQorCQkJCQkJCWlzVHlwZWRCb29sZWFuKCkgKTsNCisJCX0NCisJCWVsc2UgaWYoIE9wZXJhdG9yTWFuYWdlcjo6aXNBc3NpZ24oIGFDb2RlLT5nZXRPcGVyYXRvcigpICkgKQ0KKwkJew0KKwkJCWlmKCBhQ29kZS0+Zmlyc3QoKS5pczwgQmFzZUluc3RhbmNlRm9ybSA+KCkgKQ0KKwkJCXsNCisJCQkJcmV0dXJuKGFDb2RlLT5maXJzdCgpLnRvX3B0cjwgQmFzZUluc3RhbmNlRm9ybSA+KCkNCisJCQkJCQktPmlzVHlwZWRCb29sZWFuKCkgKTsNCisJCQl9DQorCQkJZWxzZSBpZiggT3BlcmF0b3JNYW5hZ2VyOjppc0Fzc2lnbkJpbmFyeSggYUNvZGUtPmdldE9wZXJhdG9yKCkgKSApDQorCQkJew0KKwkJCQlyZXR1cm4oIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNCb29sZWFuKGFDb2RlLT5zZWNvbmQoKSwNCisJCQkJCQlzdHJvbmdseVR5cGVkRmxhZykgKTsNCisJCQl9DQorCQkJcmV0dXJuKCBmYWxzZSApOw0KKwkJfQ0KKwkJZWxzZSBpZiggT3BlcmF0b3JNYW5hZ2VyOjppc1JlbGF0aW9uYWwoIGFDb2RlLT5nZXRPcGVyYXRvcigpICkgKQ0KKwkJew0KKwkJCXJldHVybiggdHJ1ZSApOw0KKwkJfQ0KKw0KKwkJZWxzZSBpZiggT3BlcmF0b3JNYW5hZ2VyOjppc1Byb3Bvc2l0aW9uYWwoIGFDb2RlLT5nZXRPcGVyYXRvcigpICkgKQ0KKwkJew0KKwkJCWlmKCBzdHJvbmdseVR5cGVkRmxhZyApDQorCQkJew0KKwkJCQlmb3IoQXZtQ29kZTo6aXRlcmF0b3IgaXQgPSBhQ29kZS0+YmVnaW4oKSA7IGl0ICE9IGFDb2RlLT5lbmQoKSA7ICsraXQpDQorCQkJCXsNCisJCQkJCWlmKCBub3QgRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc0Jvb2xlYW4oICppdCApICkNCisJCQkJCXsNCisJCQkJCQlyZXR1cm4oIGZhbHNlICk7DQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJcmV0dXJuKCB0cnVlICk7DQorCQl9DQorDQorCQllbHNlIGlmKCBPcGVyYXRvck1hbmFnZXI6OmlzQ29udGFpbmVyRWxlbWVudEFjY2VzcygNCisJCQkJYUNvZGUtPmdldE9wZXJhdG9yKCkgKSApDQorCQl7DQorCQkJaWYoIGFDb2RlLT5maXJzdCgpLmlzPCBCYXNlSW5zdGFuY2VGb3JtID4oKSApDQorCQkJew0KKwkJCQlCYXNlVHlwZVNwZWNpZmllciAqIGJ0cyA9IGFDb2RlLT5maXJzdCgpLg0KKwkJCQkJCXRvX3B0cjwgQmFzZUluc3RhbmNlRm9ybSA+KCktPmdldFR5cGVTcGVjaWZpZXIoKTsNCisNCisJCQkJcmV0dXJuKCBidHMtPmhhc1R5cGVDb250YWluZXIoKSAmJg0KKwkJCQkJCWJ0cy0+YXM8IENvbnRhaW5lclR5cGVTcGVjaWZpZXIgPigpLT4NCisJCQkJCQlnZXRDb250ZW50c1R5cGVTcGVjaWZpZXIoKS5pc1R5cGVkQm9vbGVhbigpICk7DQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCXJldHVybiggZmFsc2UgKTsNCisJCQl9DQorCQl9DQorCQllbHNlIHJldHVybiggZmFsc2UgKTsNCisJfQ0KKw0KKwllbHNlIHJldHVybiggZmFsc2UgKTsNCit9DQorDQorDQorYm9vbCBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzSW50ZWdlcihjb25zdCBCRiAmIGFuRXhwcikNCit7DQorCWlmKCBhbkV4cHIuaXNXZWFrSW50ZWdlcigpICkNCisJew0KKwkJcmV0dXJuKCB0cnVlICk7DQorCX0NCisJZWxzZSBpZiggYW5FeHByLmlzPCBCYXNlSW5zdGFuY2VGb3JtID4oKSApDQorCXsNCisJCXJldHVybiggYW5FeHByLnRvX3B0cjwgQmFzZUluc3RhbmNlRm9ybSA+KCktPndlYWtseVR5cGVkSW50ZWdlcigpICk7DQorCX0NCisJZWxzZSBpZiggYW5FeHByLmlzPCBBdm1Db2RlID4oKSApDQorCXsNCisJCUF2bUNvZGUgKiBhQ29kZSA9IGFuRXhwci50b19wdHI8IEF2bUNvZGUgPigpOw0KKw0KKwkJaWYoIE9wZXJhdG9yTWFuYWdlcjo6aXNDdG9yKCBhQ29kZS0+Z2V0T3BlcmF0b3IoKSApICkNCisJCXsNCisJCQlyZXR1cm4oIGFDb2RlLT5maXJzdCgpLmlzPCBCYXNlVHlwZVNwZWNpZmllciA+KCkgJiYNCisJCQkJCWFDb2RlLT5maXJzdCgpLnRvX3B0cjwgQmFzZVR5cGVTcGVjaWZpZXIgPigpLT4NCisJCQkJCQkJd2Vha2x5VHlwZWRJbnRlZ2VyKCkgKTsNCisJCX0NCisJCWVsc2UgaWYoIE9wZXJhdG9yTWFuYWdlcjo6aXNBc3NpZ24oIGFDb2RlLT5nZXRPcGVyYXRvcigpICkgKQ0KKwkJew0KKwkJCWlmKCBhQ29kZS0+Zmlyc3QoKS5pczwgQmFzZUluc3RhbmNlRm9ybSA+KCkgKQ0KKwkJCXsNCisJCQkJcmV0dXJuKCBhQ29kZS0+Zmlyc3QoKS50b19wdHI8IEJhc2VJbnN0YW5jZUZvcm0gPigpDQorCQkJCQkJLT53ZWFrbHlUeXBlZEludGVnZXIoKSApOw0KKwkJCX0NCisJCQllbHNlIGlmKCBPcGVyYXRvck1hbmFnZXI6OmlzQXNzaWduQmluYXJ5KCBhQ29kZS0+Z2V0T3BlcmF0b3IoKSApICkNCisJCQl7DQorCQkJCXJldHVybiggRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc0ludGVnZXIoYUNvZGUtPnNlY29uZCgpKSApOw0KKwkJCX0NCisJCQlyZXR1cm4oIGZhbHNlICk7DQorCQl9DQorCQllbHNlIGlmKCBPcGVyYXRvck1hbmFnZXI6OmlzQXJpdGhtZXRpYyggYUNvZGUtPmdldE9wZXJhdG9yKCkgKSApDQorCQl7DQorCQkJZm9yKEF2bUNvZGU6Oml0ZXJhdG9yIGl0ID0gYUNvZGUtPmJlZ2luKCkgOyBpdCAhPSBhQ29kZS0+ZW5kKCkgOyArK2l0KQ0KKwkJCXsNCisJCQkJaWYoIG5vdCBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzSW50ZWdlciggKml0ICkgKQ0KKwkJCQl7DQorCQkJCQlyZXR1cm4oIGZhbHNlICk7DQorCQkJCX0NCisJCQl9DQorCQkJcmV0dXJuKCB0cnVlICk7DQorCQl9DQorCQllbHNlIGlmKCBPcGVyYXRvck1hbmFnZXI6OmlzQ29kb21haW5JbnRlZ2VyKCBhQ29kZS0+Z2V0T3BlcmF0b3IoKSApICkNCisJCXsNCisJCQlyZXR1cm4oIHRydWUgKTsNCisJCX0NCisJCWVsc2UgaWYoIE9wZXJhdG9yTWFuYWdlcjo6aXNDb250YWluZXJFbGVtZW50QWNjZXNzKA0KKwkJCQlhQ29kZS0+Z2V0T3BlcmF0b3IoKSApICkNCisJCXsNCisJCQlpZiggYUNvZGUtPmZpcnN0KCkuaXM8IEJhc2VJbnN0YW5jZUZvcm0gPigpICkNCisJCQl7DQorCQkJCUJhc2VUeXBlU3BlY2lmaWVyICogYnRzID0gYUNvZGUtPmZpcnN0KCkuDQorCQkJCQkJdG9fcHRyPCBCYXNlSW5zdGFuY2VGb3JtID4oKS0+Z2V0VHlwZVNwZWNpZmllcigpOw0KKw0KKwkJCQlyZXR1cm4oIGJ0cy0+aGFzVHlwZUNvbnRhaW5lcigpICYmDQorCQkJCQkJYnRzLT5hczwgQ29udGFpbmVyVHlwZVNwZWNpZmllciA+KCktPg0KKwkJCQkJCWdldENvbnRlbnRzVHlwZVNwZWNpZmllcigpLndlYWtseVR5cGVkSW50ZWdlcigpICk7DQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCXJldHVybiggZmFsc2UgKTsNCisJCQl9DQorCQl9DQorCQllbHNlIHJldHVybiggZmFsc2UgKTsNCisJfQ0KKw0KKwllbHNlIHJldHVybiggZmFsc2UgKTsNCit9DQorDQorDQorYm9vbCBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzUmF0aW9uYWwoY29uc3QgQkYgJiBhbkV4cHIpDQorew0KKwlpZiggYW5FeHByLmlzV2Vha1JhdGlvbmFsKCkgKQ0KKwl7DQorCQlyZXR1cm4oIHRydWUgKTsNCisJfQ0KKwllbHNlIGlmKCBhbkV4cHIuaXM8IEJhc2VJbnN0YW5jZUZvcm0gPigpICkNCisJew0KKwkJcmV0dXJuKCBhbkV4cHIudG9fcHRyPCBCYXNlSW5zdGFuY2VGb3JtID4oKS0+d2Vha2x5VHlwZWRSYXRpb25hbCgpICk7DQorCX0NCisJZWxzZSBpZiggYW5FeHByLmlzPCBBdm1Db2RlID4oKSApDQorCXsNCisJCUF2bUNvZGUgKiBhQ29kZSA9IGFuRXhwci50b19wdHI8IEF2bUNvZGUgPigpOw0KKw0KKwkJaWYoIE9wZXJhdG9yTWFuYWdlcjo6aXNDdG9yKCBhQ29kZS0+Z2V0T3BlcmF0b3IoKSApICkNCisJCXsNCisJCQlyZXR1cm4oIGFDb2RlLT5maXJzdCgpLmlzPCBCYXNlVHlwZVNwZWNpZmllciA+KCkgJiYNCisJCQkJCWFDb2RlLT5maXJzdCgpLnRvX3B0cjwgQmFzZVR5cGVTcGVjaWZpZXIgPigpLT4NCisJCQkJCQkJd2Vha2x5VHlwZWRSYXRpb25hbCgpICk7DQorCQl9DQorCQllbHNlIGlmKCBPcGVyYXRvck1hbmFnZXI6OmlzQXNzaWduKCBhQ29kZS0+Z2V0T3BlcmF0b3IoKSApICkNCisJCXsNCisJCQlpZiggYUNvZGUtPmZpcnN0KCkuaXM8IEJhc2VJbnN0YW5jZUZvcm0gPigpICkNCisJCQl7DQorCQkJCXJldHVybiggYUNvZGUtPmZpcnN0KCkudG9fcHRyPCBCYXNlSW5zdGFuY2VGb3JtID4oKQ0KKwkJCQkJCS0+d2Vha2x5VHlwZWRSYXRpb25hbCgpICk7DQorCQkJfQ0KKwkJCWVsc2UgaWYoIE9wZXJhdG9yTWFuYWdlcjo6aXNBc3NpZ25CaW5hcnkoIGFDb2RlLT5nZXRPcGVyYXRvcigpICkgKQ0KKwkJCXsNCisJCQkJcmV0dXJuKCBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzUmF0aW9uYWwoYUNvZGUtPnNlY29uZCgpKSApOw0KKwkJCX0NCisJCQlyZXR1cm4oIGZhbHNlICk7DQorCQl9DQorCQllbHNlIGlmKCBPcGVyYXRvck1hbmFnZXI6OmlzQXJpdGhtZXRpYyggYUNvZGUtPmdldE9wZXJhdG9yKCkgKSApDQorCQl7DQorCQkJZm9yKEF2bUNvZGU6Oml0ZXJhdG9yIGl0ID0gYUNvZGUtPmJlZ2luKCkgOyBpdCAhPSBhQ29kZS0+ZW5kKCkgOyArK2l0KQ0KKwkJCXsNCisJCQkJaWYoIG5vdCBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzUmF0aW9uYWwoICppdCApICkNCisJCQkJew0KKwkJCQkJcmV0dXJuKCBmYWxzZSApOw0KKwkJCQl9DQorCQkJfQ0KKwkJCXJldHVybiggdHJ1ZSApOw0KKwkJfQ0KKwkJZWxzZSBpZiggT3BlcmF0b3JNYW5hZ2VyOjppc0NvZG9tYWluUmF0aW9uYWwoIGFDb2RlLT5nZXRPcGVyYXRvcigpICkgKQ0KKwkJew0KKwkJCXJldHVybiggdHJ1ZSApOw0KKwkJfQ0KKwkJZWxzZSBpZiggT3BlcmF0b3JNYW5hZ2VyOjppc0NvbnRhaW5lckVsZW1lbnRBY2Nlc3MoDQorCQkJCWFDb2RlLT5nZXRPcGVyYXRvcigpICkgKQ0KKwkJew0KKwkJCWlmKCBhQ29kZS0+Zmlyc3QoKS5pczwgQmFzZUluc3RhbmNlRm9ybSA+KCkgKQ0KKwkJCXsNCisJCQkJQmFzZVR5cGVTcGVjaWZpZXIgKiBidHMgPSBhQ29kZS0+Zmlyc3QoKS4NCisJCQkJCQl0b19wdHI8IEJhc2VJbnN0YW5jZUZvcm0gPigpLT5nZXRUeXBlU3BlY2lmaWVyKCk7DQorDQorCQkJCXJldHVybiggYnRzLT5oYXNUeXBlQ29udGFpbmVyKCkgJiYNCisJCQkJCQlidHMtPmFzPCBDb250YWluZXJUeXBlU3BlY2lmaWVyID4oKS0+DQorCQkJCQkJZ2V0Q29udGVudHNUeXBlU3BlY2lmaWVyKCkud2Vha2x5VHlwZWRSYXRpb25hbCgpICk7DQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCXJldHVybiggZmFsc2UgKTsNCisJCQl9DQorCQl9DQorCQllbHNlIHJldHVybiggZmFsc2UgKTsNCisJfQ0KKw0KKwllbHNlIHJldHVybiggZmFsc2UgKTsNCit9DQorDQorDQorYm9vbCBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzRmxvYXQoY29uc3QgQkYgJiBhbkV4cHIpDQorew0KKwlpZiggYW5FeHByLmlzV2Vha0Zsb2F0KCkgKQ0KKwl7DQorCQlyZXR1cm4oIHRydWUgKTsNCisJfQ0KKwllbHNlIGlmKCBhbkV4cHIuaXM8IEJhc2VJbnN0YW5jZUZvcm0gPigpICkNCisJew0KKwkJcmV0dXJuKCBhbkV4cHIudG9fcHRyPCBCYXNlSW5zdGFuY2VGb3JtID4oKS0+d2Vha2x5VHlwZWRGbG9hdCgpICk7DQorCX0NCisJZWxzZSBpZiggYW5FeHByLmlzPCBBdm1Db2RlID4oKSApDQorCXsNCisJCUF2bUNvZGUgKiBhQ29kZSA9IGFuRXhwci50b19wdHI8IEF2bUNvZGUgPigpOw0KKw0KKwkJaWYoIE9wZXJhdG9yTWFuYWdlcjo6aXNDdG9yKCBhQ29kZS0+Z2V0T3BlcmF0b3IoKSApICkNCisJCXsNCisJCQlyZXR1cm4oIGFDb2RlLT5maXJzdCgpLmlzPCBCYXNlVHlwZVNwZWNpZmllciA+KCkgJiYNCisJCQkJCWFDb2RlLT5maXJzdCgpLnRvX3B0cjwgQmFzZVR5cGVTcGVjaWZpZXIgPigpLT4NCisJCQkJCQkJd2Vha2x5VHlwZWRGbG9hdCgpICk7DQorCQl9DQorCQllbHNlIGlmKCBPcGVyYXRvck1hbmFnZXI6OmlzQXNzaWduKCBhQ29kZS0+Z2V0T3BlcmF0b3IoKSApICkNCisJCXsNCisJCQlpZiggYUNvZGUtPmZpcnN0KCkuaXM8IEJhc2VJbnN0YW5jZUZvcm0gPigpICkNCisJCQl7DQorCQkJCXJldHVybiggYUNvZGUtPmZpcnN0KCkudG9fcHRyPCBCYXNlSW5zdGFuY2VGb3JtID4oKQ0KKwkJCQkJCS0+d2Vha2x5VHlwZWRGbG9hdCgpICk7DQorCQkJfQ0KKwkJCWVsc2UgaWYoIE9wZXJhdG9yTWFuYWdlcjo6aXNBc3NpZ25CaW5hcnkoIGFDb2RlLT5nZXRPcGVyYXRvcigpICkgKQ0KKwkJCXsNCisJCQkJcmV0dXJuKCBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzRmxvYXQoYUNvZGUtPnNlY29uZCgpKSApOw0KKwkJCX0NCisJCQlyZXR1cm4oIGZhbHNlICk7DQorCQl9DQorCQllbHNlIGlmKCBPcGVyYXRvck1hbmFnZXI6OmlzQXJpdGhtZXRpYyggYUNvZGUtPmdldE9wZXJhdG9yKCkgKSApDQorCQl7DQorCQkJZm9yKEF2bUNvZGU6Oml0ZXJhdG9yIGl0ID0gYUNvZGUtPmJlZ2luKCkgOyBpdCAhPSBhQ29kZS0+ZW5kKCkgOyArK2l0KQ0KKwkJCXsNCisJCQkJaWYoIG5vdCBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzRmxvYXQoICppdCApICkNCisJCQkJew0KKwkJCQkJcmV0dXJuKCBmYWxzZSApOw0KKwkJCQl9DQorCQkJfQ0KKwkJCXJldHVybiggdHJ1ZSApOw0KKwkJfQ0KKwkJZWxzZSBpZiggT3BlcmF0b3JNYW5hZ2VyOjppc0NvZG9tYWluRmxvYXQoIGFDb2RlLT5nZXRPcGVyYXRvcigpICkgKQ0KKwkJew0KKwkJCXJldHVybiggdHJ1ZSApOw0KKwkJfQ0KKwkJZWxzZSBpZiggT3BlcmF0b3JNYW5hZ2VyOjppc0NvbnRhaW5lckVsZW1lbnRBY2Nlc3MoDQorCQkJCWFDb2RlLT5nZXRPcGVyYXRvcigpICkgKQ0KKwkJew0KKwkJCWlmKCBhQ29kZS0+Zmlyc3QoKS5pczwgQmFzZUluc3RhbmNlRm9ybSA+KCkgKQ0KKwkJCXsNCisJCQkJQmFzZVR5cGVTcGVjaWZpZXIgKiBidHMgPSBhQ29kZS0+Zmlyc3QoKS4NCisJCQkJCQl0b19wdHI8IEJhc2VJbnN0YW5jZUZvcm0gPigpLT5nZXRUeXBlU3BlY2lmaWVyKCk7DQorDQorCQkJCXJldHVybiggYnRzLT5oYXNUeXBlQ29udGFpbmVyKCkgJiYNCisJCQkJCQlidHMtPmFzPCBDb250YWluZXJUeXBlU3BlY2lmaWVyID4oKS0+DQorCQkJCQkJZ2V0Q29udGVudHNUeXBlU3BlY2lmaWVyKCkud2Vha2x5VHlwZWRGbG9hdCgpICk7DQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCXJldHVybiggZmFsc2UgKTsNCisJCQl9DQorCQl9DQorCQllbHNlIHJldHVybiggZmFsc2UgKTsNCisJfQ0KKw0KKwllbHNlIHJldHVybiggZmFsc2UgKTsNCit9DQorDQorDQorYm9vbCBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzUmVhbChjb25zdCBCRiAmIGFuRXhwcikNCit7DQorCWlmKCBhbkV4cHIuaXNXZWFrUmVhbCgpICkNCisJew0KKwkJcmV0dXJuKCB0cnVlICk7DQorCX0NCisJZWxzZSBpZiggYW5FeHByLmlzPCBCYXNlSW5zdGFuY2VGb3JtID4oKSApDQorCXsNCisJCXJldHVybiggYW5FeHByLnRvX3B0cjwgQmFzZUluc3RhbmNlRm9ybSA+KCktPndlYWtseVR5cGVkUmVhbCgpICk7DQorCX0NCisJZWxzZSBpZiggYW5FeHByLmlzPCBBdm1Db2RlID4oKSApDQorCXsNCisJCUF2bUNvZGUgKiBhQ29kZSA9IGFuRXhwci50b19wdHI8IEF2bUNvZGUgPigpOw0KKw0KKwkJaWYoIE9wZXJhdG9yTWFuYWdlcjo6aXNDdG9yKCBhQ29kZS0+Z2V0T3BlcmF0b3IoKSApICkNCisJCXsNCisJCQlyZXR1cm4oIGFDb2RlLT5maXJzdCgpLmlzPCBCYXNlVHlwZVNwZWNpZmllciA+KCkgJiYNCisJCQkJCWFDb2RlLT5maXJzdCgpLnRvX3B0cjwgQmFzZVR5cGVTcGVjaWZpZXIgPigpLT4NCisJCQkJCQkJd2Vha2x5VHlwZWRSZWFsKCkgKTsNCisJCX0NCisJCWVsc2UgaWYoIE9wZXJhdG9yTWFuYWdlcjo6aXNBc3NpZ24oIGFDb2RlLT5nZXRPcGVyYXRvcigpICkgKQ0KKwkJew0KKwkJCWlmKCBhQ29kZS0+Zmlyc3QoKS5pczwgQmFzZUluc3RhbmNlRm9ybSA+KCkgKQ0KKwkJCXsNCisJCQkJcmV0dXJuKCBhQ29kZS0+Zmlyc3QoKS50b19wdHI8DQorCQkJCQkJQmFzZUluc3RhbmNlRm9ybSA+KCktPndlYWtseVR5cGVkUmVhbCgpICk7DQorCQkJfQ0KKwkJCWVsc2UgaWYoIE9wZXJhdG9yTWFuYWdlcjo6aXNBc3NpZ25CaW5hcnkoIGFDb2RlLT5nZXRPcGVyYXRvcigpICkgKQ0KKwkJCXsNCisJCQkJcmV0dXJuKCBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzUmVhbChhQ29kZS0+c2Vjb25kKCkpICk7DQorCQkJfQ0KKwkJCXJldHVybiggZmFsc2UgKTsNCisJCX0NCisJCWVsc2UgaWYoIE9wZXJhdG9yTWFuYWdlcjo6aXNBcml0aG1ldGljKCBhQ29kZS0+Z2V0T3BlcmF0b3IoKSApICkNCisJCXsNCisJCQlmb3IoQXZtQ29kZTo6aXRlcmF0b3IgaXQgPSBhQ29kZS0+YmVnaW4oKSA7IGl0ICE9IGFDb2RlLT5lbmQoKSA7ICsraXQpDQorCQkJew0KKwkJCQlpZiggbm90IEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNSZWFsKCAqaXQgKSApDQorCQkJCXsNCisJCQkJCXJldHVybiggZmFsc2UgKTsNCisJCQkJfQ0KKwkJCX0NCisJCQlyZXR1cm4oIHRydWUgKTsNCisJCX0NCisJCWVsc2UgaWYoIE9wZXJhdG9yTWFuYWdlcjo6aXNDb2RvbWFpblJlYWwoIGFDb2RlLT5nZXRPcGVyYXRvcigpICkgKQ0KKwkJew0KKwkJCXJldHVybiggdHJ1ZSApOw0KKwkJfQ0KKwkJZWxzZSBpZiggT3BlcmF0b3JNYW5hZ2VyOjppc0NvbnRhaW5lckVsZW1lbnRBY2Nlc3MoDQorCQkJCWFDb2RlLT5nZXRPcGVyYXRvcigpICkgKQ0KKwkJew0KKwkJCWlmKCBhQ29kZS0+Zmlyc3QoKS5pczwgQmFzZUluc3RhbmNlRm9ybSA+KCkgKQ0KKwkJCXsNCisJCQkJQmFzZVR5cGVTcGVjaWZpZXIgKiBidHMgPSBhQ29kZS0+Zmlyc3QoKS4NCisJCQkJCQl0b19wdHI8IEJhc2VJbnN0YW5jZUZvcm0gPigpLT5nZXRUeXBlU3BlY2lmaWVyKCk7DQorDQorCQkJCXJldHVybiggYnRzLT5oYXNUeXBlQ29udGFpbmVyKCkgJiYNCisJCQkJCQlidHMtPmFzPCBDb250YWluZXJUeXBlU3BlY2lmaWVyID4oKS0+DQorCQkJCQkJZ2V0Q29udGVudHNUeXBlU3BlY2lmaWVyKCkud2Vha2x5VHlwZWRSZWFsKCkgKTsNCisJCQl9DQorCQkJZWxzZQ0KKwkJCXsNCisJCQkJcmV0dXJuKCBmYWxzZSApOw0KKwkJCX0NCisJCX0NCisJCWVsc2UgcmV0dXJuKCBmYWxzZSApOw0KKwl9DQorDQorCWVsc2UgcmV0dXJuKCBmYWxzZSApOw0KK30NCisNCisNCitib29sIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNPcGVyYXRvcihjb25zdCBCRiAmIGFuRXhwcikNCit7DQorCWlmKCBhbkV4cHIuaXM8IE9wZXJhdG9yID4oKSApDQorCXsNCisJCXJldHVybiggdHJ1ZSApOw0KKwl9DQorCWVsc2UgaWYoIGFuRXhwci5pczwgQmFzZUluc3RhbmNlRm9ybSA+KCkgKQ0KKwl7DQorCQlyZXR1cm4oIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6d2Vha2x5VHlwZWQoVHlwZU1hbmFnZXI6Ok9QRVJBVE9SLA0KKwkJCQlhbkV4cHIudG9fcHRyPCBCYXNlSW5zdGFuY2VGb3JtID4oKS0+Z2V0VHlwZVNwZWNpZmllcigpKSApOw0KKwl9DQorDQorCWVsc2UgcmV0dXJuKCBmYWxzZSApOw0KK30NCisNCisNCitib29sIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNBdm1Db2RlKGNvbnN0IEJGICYgYW5FeHByKQ0KK3sNCisJaWYoIGFuRXhwci5pczwgQXZtQ29kZSA+KCkgKQ0KKwl7DQorCQlyZXR1cm4oIHRydWUgKTsNCisJfQ0KKw0KKwllbHNlIGlmKCBhbkV4cHIuaXM8IEJhc2VJbnN0YW5jZUZvcm0gPigpICkNCisJew0KKwkJcmV0dXJuKCBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OndlYWtseVR5cGVkKFR5cGVNYW5hZ2VyOjpBVk1DT0RFLA0KKwkJCQlhbkV4cHIudG9fcHRyPCBCYXNlSW5zdGFuY2VGb3JtID4oKS0+Z2V0VHlwZVNwZWNpZmllcigpKSApOw0KKwl9DQorDQorCWVsc2UgcmV0dXJuKCBmYWxzZSApOw0KK30NCisNCisNCitib29sIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNDdG9yKA0KKwkJQmFzZVR5cGVTcGVjaWZpZXIgKiByZWZUeXBlU3BlY2lmaWVyLCBBdm1Db2RlICogYUNvZGUpDQorew0KKwlBVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoDQorCQlPcGVyYXRvck1hbmFnZXI6OmlzQ3RvciggYUNvZGUtPmdldE9wZXJhdG9yKCkgKSApDQorCQkJPDwgIlVuZXhwZWN0ZWQgY3RvcjwgPyA+KCA/ICkgZXhwcmVzc2lvbiA6PiAiDQorCQkJPDwgSUdOT1JFX0ZJUlNUX1RBQiA8PCBhQ29kZQ0KKwkJCTw8IFNFTkRfRVhJVDsNCisNCisJcmV0dXJuKCBhQ29kZS0+Zmlyc3QoKS5pczwgQmFzZVR5cGVTcGVjaWZpZXIgPigpICYmDQorCQkJRXhwcmVzc2lvblR5cGVDaGVja2VyOjp3ZWFrbHlUeXBlZChyZWZUeXBlU3BlY2lmaWVyLA0KKwkJCQkJYUNvZGUtPmZpcnN0KCkudG9fcHRyPCBCYXNlVHlwZVNwZWNpZmllciA+KCkpICk7DQorfQ0KKw0KKw0KK2Jvb2wgRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc05ld2ZyZXNoKA0KKwkJQmFzZVR5cGVTcGVjaWZpZXIgKiByZWZUeXBlU3BlY2lmaWVyLCBBdm1Db2RlICogYUNvZGUpDQorew0KKwlBVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoDQorCQlPcGVyYXRvck1hbmFnZXI6OmlzTmV3ZnJlc2goIGFDb2RlLT5nZXRPcGVyYXRvcigpICkgKQ0KKwkJCTw8ICJVbmV4cGVjdGVkIG5ld2ZyZXNoKCA/ICkgZXhwcmVzc2lvbiA6PiAiDQorCQkJPDwgSUdOT1JFX0ZJUlNUX1RBQiA8PCBhQ29kZQ0KKwkJCTw8IFNFTkRfRVhJVDsNCisNCisJcmV0dXJuKCBhQ29kZS0+Zmlyc3QoKS5pczwgQmFzZUluc3RhbmNlRm9ybSA+KCkgJiYNCisJCQlFeHByZXNzaW9uVHlwZUNoZWNrZXI6OndlYWtseVR5cGVkKHJlZlR5cGVTcGVjaWZpZXIsDQorCQkJCWFDb2RlLT5maXJzdCgpLnRvX3B0cjwgQmFzZUluc3RhbmNlRm9ybSA+KCktPmdldFR5cGVTcGVjaWZpZXIoKSkgKTsNCit9DQorDQorDQorYm9vbCBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzVHlwZWQoQmFzZVR5cGVTcGVjaWZpZXIgKiByZWZUeXBlU3BlY2lmaWVyLA0KKwkJQmFzZVR5cGVTcGVjaWZpZXIgKiBhVHlwZVNwZWNpZmllcikNCit7DQorCWlmKCByZWZUeXBlU3BlY2lmaWVyID09IGFUeXBlU3BlY2lmaWVyICkNCisJew0KKwkJcmV0dXJuKCB0cnVlICk7DQorCX0NCisNCisJd2hpbGUoIHRydWUgKQ0KKwl7DQorCQlpZiggcmVmVHlwZVNwZWNpZmllci0+aXM8IFR5cGVBbGlhc1NwZWNpZmllciA+KCkgKQ0KKwkJew0KKwkJCXJlZlR5cGVTcGVjaWZpZXIgPSByZWZUeXBlU3BlY2lmaWVyLT4NCisJCQkJCXRvPCBUeXBlQWxpYXNTcGVjaWZpZXIgPigpLT50YXJnZXRUeXBlU3BlY2lmaWVyKCk7DQorCQl9DQorCQllbHNlIGlmKCByZWZUeXBlU3BlY2lmaWVyLT5pczwgSW50ZXJ2YWxUeXBlU3BlY2lmaWVyID4oKSApDQorCQl7DQorCQkJcmVmVHlwZVNwZWNpZmllciA9IHJlZlR5cGVTcGVjaWZpZXItPg0KKwkJCQkJdG88IEludGVydmFsVHlwZVNwZWNpZmllciA+KCktPmdldFN1cHBvcnRUeXBlU3BlY2lmaWVyKCk7DQorCQl9DQorCQllbHNlDQorCQl7DQorCQkJYnJlYWs7DQorCQl9DQorCX0NCisNCisJd2hpbGUoIHRydWUgKQ0KKwl7DQorCQlpZiggYVR5cGVTcGVjaWZpZXItPmlzPCBUeXBlQWxpYXNTcGVjaWZpZXIgPigpICkNCisJCXsNCisJCQlhVHlwZVNwZWNpZmllciA9IGFUeXBlU3BlY2lmaWVyLT4NCisJCQkJCXRvPCBUeXBlQWxpYXNTcGVjaWZpZXIgPigpLT50YXJnZXRUeXBlU3BlY2lmaWVyKCk7DQorCQl9DQorCQllbHNlIGlmKCBhVHlwZVNwZWNpZmllci0+aXM8IEludGVydmFsVHlwZVNwZWNpZmllciA+KCkgKQ0KKwkJew0KKwkJCWFUeXBlU3BlY2lmaWVyID0gYVR5cGVTcGVjaWZpZXItPg0KKwkJCQkJdG88IEludGVydmFsVHlwZVNwZWNpZmllciA+KCktPmdldFN1cHBvcnRUeXBlU3BlY2lmaWVyKCk7DQorCQl9DQorCQllbHNlDQorCQl7DQorCQkJYnJlYWs7DQorCQl9DQorCX0NCisNCisJaWYoIHJlZlR5cGVTcGVjaWZpZXIgPT0gYVR5cGVTcGVjaWZpZXIgKQ0KKwl7DQorCQlyZXR1cm4oIHRydWUgKTsNCisJfQ0KKw0KKw0KKy8vCWVsc2UgaWYoIHJlZlR5cGVTcGVjaWZpZXItPmlzVHlwZVNwZWNpZmllcktpbmQoIGFUeXBlU3BlY2lmaWVyICkgKQ0KKy8vCXsNCisvLwkJcmV0dXJuKCB0cnVlICk7DQorLy8JfQ0KKw0KKwlyZXR1cm4oIGZhbHNlICk7DQorfQ0KKw0KKw0KKw0KK2Jvb2wgRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc1R5cGVkKA0KKwkJQmFzZVR5cGVTcGVjaWZpZXIgKiByZWZUeXBlU3BlY2lmaWVyLCBjb25zdCBCRiAmIGFyZykNCit7DQorCXdoaWxlKCB0cnVlICkNCisJew0KKwkJaWYoIHJlZlR5cGVTcGVjaWZpZXItPmlzPCBUeXBlQWxpYXNTcGVjaWZpZXIgPigpICkNCisJCXsNCisJCQlyZWZUeXBlU3BlY2lmaWVyID0gcmVmVHlwZVNwZWNpZmllci0+DQorCQkJCQl0bzwgVHlwZUFsaWFzU3BlY2lmaWVyID4oKS0+dGFyZ2V0VHlwZVNwZWNpZmllcigpOw0KKwkJfQ0KKwkJZWxzZSBpZiggcmVmVHlwZVNwZWNpZmllci0+aXM8IEludGVydmFsVHlwZVNwZWNpZmllciA+KCkgKQ0KKwkJew0KKwkJCXJlZlR5cGVTcGVjaWZpZXIgPSByZWZUeXBlU3BlY2lmaWVyLT4NCisJCQkJCXRvPCBJbnRlcnZhbFR5cGVTcGVjaWZpZXIgPigpLT5nZXRTdXBwb3J0VHlwZVNwZWNpZmllcigpOw0KKwkJfQ0KKwkJZWxzZQ0KKwkJew0KKwkJCWJyZWFrOw0KKwkJfQ0KKwl9DQorDQorCWlmKCByZWZUeXBlU3BlY2lmaWVyLT5oYXNUeXBlZENsb2NrVGltZSgpICkNCisJew0KKwkJaWYoIHJlZlR5cGVTcGVjaWZpZXItPmlzPCBDb250YWluZXJUeXBlU3BlY2lmaWVyID4oKSApDQorCQl7DQorCQkJcmVmVHlwZVNwZWNpZmllciA9IHJlZlR5cGVTcGVjaWZpZXItPg0KKwkJCQkJdG88IENvbnRhaW5lclR5cGVTcGVjaWZpZXIgPigpLT5nZXRDb250ZW50c1R5cGVTcGVjaWZpZXIoKTsNCisJCX0NCisJfQ0KKw0KKwlpZiggYXJnLmlzPCBCYXNlSW5zdGFuY2VGb3JtID4oKSApDQorCXsNCisJCXJldHVybiggRXhwcmVzc2lvblR5cGVDaGVja2VyOjp3ZWFrbHlUeXBlZChyZWZUeXBlU3BlY2lmaWVyLA0KKwkJCQlhcmcudG9fcHRyPCBCYXNlSW5zdGFuY2VGb3JtID4oKS0+Z2V0VHlwZVNwZWNpZmllcigpKSApOw0KKwl9DQorDQorCWVsc2UgaWYoIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNDdG9yKGFyZykgKQ0KKwl7DQorCQlyZXR1cm4oIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNDdG9yKA0KKwkJCQlyZWZUeXBlU3BlY2lmaWVyLCBhcmcudG9fcHRyPCBBdm1Db2RlID4oKSApICk7DQorCX0NCisNCisJZWxzZSBpZiggRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc05ld2ZyZXNoKGFyZykgKQ0KKwl7DQorCQlyZXR1cm4oIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNOZXdmcmVzaCgNCisJCQkJcmVmVHlwZVNwZWNpZmllciwgYXJnLnRvX3B0cjwgQXZtQ29kZSA+KCkgKSApOw0KKwl9DQorDQorCXN3aXRjaCggcmVmVHlwZVNwZWNpZmllci0+Z2V0VHlwZVNwZWNpZmllcktpbmQoKSApDQorCXsNCisJCWNhc2UgVFlQRV9CT09MRUFOX1NQRUNJRklFUjoNCisJCXsNCisJCQlyZXR1cm4oIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNCb29sZWFuKGFyZykgKTsNCisJCX0NCisNCisJCWNhc2UgVFlQRV9DSEFSQUNURVJfU1BFQ0lGSUVSOg0KKwkJew0KKwkJCXJldHVybiggRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc0NoYXJhY3RlcihhcmcpICk7DQorCQl9DQorDQorCQljYXNlIFRZUEVfU1RSSU5HX1NQRUNJRklFUjoNCisJCXsNCisJCQlyZXR1cm4oIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNTdHJpbmcoYXJnKSApOw0KKwkJfQ0KKw0KKwkJY2FzZSBUWVBFX0lOVEVHRVJfU1BFQ0lGSUVSOg0KKwkJY2FzZSBUWVBFX1VJTlRFR0VSX1NQRUNJRklFUjoNCisJCWNhc2UgVFlQRV9QT1NfSU5URUdFUl9TUEVDSUZJRVI6DQorCQl7DQorCQkJcmV0dXJuKCBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzSW50ZWdlcihhcmcpICk7DQorCQl9DQorDQorCQljYXNlIFRZUEVfUkFUSU9OQUxfU1BFQ0lGSUVSOg0KKwkJY2FzZSBUWVBFX1VSQVRJT05BTF9TUEVDSUZJRVI6DQorCQl7DQorCQkJcmV0dXJuKCBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzUmF0aW9uYWwoYXJnKSApOw0KKwkJfQ0KKw0KKwkJY2FzZSBUWVBFX0ZMT0FUX1NQRUNJRklFUjoNCisJCWNhc2UgVFlQRV9VRkxPQVRfU1BFQ0lGSUVSOg0KKwkJew0KKwkJCXJldHVybiggRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc0Zsb2F0KGFyZykgKTsNCisJCX0NCisNCisJCWNhc2UgVFlQRV9SRUFMX1NQRUNJRklFUjoNCisJCWNhc2UgVFlQRV9VUkVBTF9TUEVDSUZJRVI6DQorCQl7DQorCQkJcmV0dXJuKCBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzUmVhbChhcmcpICk7DQorCQl9DQorDQorDQorCQljYXNlIFRZUEVfSU5URVJWQUxfU1BFQ0lGSUVSOg0KKwkJew0KKwkJCXJldHVybiggRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc1R5cGVkKCByZWZUeXBlU3BlY2lmaWVyLT50bzwNCisJCQkJCUludGVydmFsVHlwZVNwZWNpZmllciA+KCktPmdldFN1cHBvcnRUeXBlU3BlY2lmaWVyKCksIGFyZykgKTsNCisJCX0NCisNCisNCisJCWNhc2UgVFlQRV9DTE9DS19TUEVDSUZJRVI6DQorCQl7DQorCQkJcmV0dXJuKCBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzQ2xvY2soYXJnKSApOw0KKwkJfQ0KKw0KKwkJY2FzZSBUWVBFX1RJTUVfU1BFQ0lGSUVSOg0KKwkJew0KKwkJCXJldHVybiggRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc1RpbWUoYXJnKSApOw0KKwkJfQ0KKwkJY2FzZSBUWVBFX0NPTlRJTlVPVVNfVElNRV9TUEVDSUZJRVI6DQorCQl7DQorCQkJcmV0dXJuKCBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzQ1RpbWUoYXJnKSApOw0KKwkJfQ0KKwkJY2FzZSBUWVBFX0RJU0NSRVRFX1RJTUVfU1BFQ0lGSUVSOg0KKwkJew0KKwkJCXJldHVybiggRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc0RUaW1lKGFyZykgKTsNCisJCX0NCisNCisNCisJCWNhc2UgVFlQRV9NQUNISU5FX1NQRUNJRklFUjoNCisJCXsNCisJCQlyZXR1cm4oIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNNYWNoaW5lKGFyZykgKTsNCisJCX0NCisNCisJCWNhc2UgVFlQRV9QT1JUX1NQRUNJRklFUjoNCisJCXsNCisJCQlyZXR1cm4oIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNQb3J0KGFyZykgKTsNCisJCX0NCisNCisJCWNhc2UgVFlQRV9CVUZGRVJfU1BFQ0lGSUVSOg0KKwkJew0KKwkJCXJldHVybiggRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc0J1ZmZlcihhcmcpICk7DQorCQl9DQorDQorCQljYXNlIFRZUEVfTUVTU0FHRV9TUEVDSUZJRVI6DQorCQl7DQorCQkJcmV0dXJuKCBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzTWVzc2FnZShhcmcpICk7DQorCQl9DQorDQorDQorCQljYXNlIFRZUEVfT1BFUkFUT1JfU1BFQ0lGSUVSOg0KKwkJew0KKwkJCXJldHVybiggRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc09wZXJhdG9yKGFyZykgKTsNCisJCX0NCisNCisJCWNhc2UgVFlQRV9BVk1DT0RFX1NQRUNJRklFUjoNCisJCXsNCisJCQlyZXR1cm4oIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNBdm1Db2RlKGFyZykgKTsNCisJCX0NCisNCisJCWNhc2UgVFlQRV9FTlVNX1NQRUNJRklFUjoNCisJCXsNCisJCQlyZXR1cm4oIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNFbnVtKA0KKwkJCQkJcmVmVHlwZVNwZWNpZmllci0+dG88IEVudW1UeXBlU3BlY2lmaWVyID4oKSwgYXJnKSApOw0KKwkJfQ0KKw0KKwkJY2FzZSBUWVBFX0FSUkFZX1NQRUNJRklFUjoNCisJCXsNCisJCQlyZXR1cm4oIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNBcnJheSgNCisJCQkJCXJlZlR5cGVTcGVjaWZpZXItPnRvPCBDb250YWluZXJUeXBlU3BlY2lmaWVyID4oKSwgYXJnKSApOw0KKwkJfQ0KKw0KKwkJY2FzZSBUWVBFX0NMQVNTX1NQRUNJRklFUjoNCisJCXsNCisJCQlyZXR1cm4oIEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNDbGFzcygNCisJCQkJCXJlZlR5cGVTcGVjaWZpZXItPnRvPCBDbGFzc1R5cGVTcGVjaWZpZXIgPigpLCBhcmcpICk7DQorCQl9DQorDQorCQljYXNlIFRZUEVfVU5JVkVSU0FMX1NQRUNJRklFUjoNCisJCXsNCisJCQlyZXR1cm4oIHRydWUgKTsNCisJCX0NCisNCisJCWRlZmF1bHQ6DQorCQl7DQorCQkJaWYoIHJlZlR5cGVTcGVjaWZpZXItPmhhc1R5cGVDb2xsZWN0aW9uKCkgKQ0KKwkJCXsNCisJCQkJcmV0dXJuKCBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzQ29sbGVjdGlvbigNCisJCQkJCQlyZWZUeXBlU3BlY2lmaWVyLT50bzwgQ29udGFpbmVyVHlwZVNwZWNpZmllciA+KCksIGFyZykgKTsNCisJCQl9DQorDQorCQkJZWxzZSBpZiggYXJnLmlzPCBBdm1Db2RlID4oKSApDQorCQkJew0KKw0KKwkJCX0NCisNCisJCQlyZXR1cm4oIGZhbHNlICk7DQorCQl9DQorCX0NCisNCisJcmV0dXJuKCB0cnVlICk7DQorfQ0KKw0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uVHlwZUNoZWNrZXIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25UeXBlQ2hlY2tlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MmNiYTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uVHlwZUNoZWNrZXIuaApAQCAtMCwwICsxLDI1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuDQorICoNCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ3JlYXRlZCBvbjogMTggc2VwdC4gMjAwOQ0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyDQorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2lmbmRlZiBFWFBSRVNTSU9OVFlQRUNIRUNLRVJfSF8NCisjZGVmaW5lIEVYUFJFU1NJT05UWVBFQ0hFQ0tFUl9IXw0KKw0KKyNpbmNsdWRlIDxjb21tb24vQkYuaD4NCisNCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvQmFzZUluc3RhbmNlRm9ybS5oPg0KKw0KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9Bdm1Db2RlLmg+DQorDQorI2luY2x1ZGUgPGZtbC9saWIvSVR5cGVTcGVjaWZpZXIuaD4NCisNCisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yTWFuYWdlci5oPg0KKw0KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lSUQuaD4NCisNCisjaW5jbHVkZSA8Zm1sL3R5cGUvQmFzZVR5cGVTcGVjaWZpZXIuaD4NCisNCisNCituYW1lc3BhY2Ugc2VwDQorew0KKw0KKw0KK2NsYXNzIEVsZW1lbnQ7DQorY2xhc3MgQ29udGFpbmVyVHlwZVNwZWNpZmllcjsNCitjbGFzcyBDbGFzc1R5cGVTcGVjaWZpZXI7DQorY2xhc3MgRW51bVR5cGVTcGVjaWZpZXI7DQorDQorDQorY2xhc3MgRXhwcmVzc2lvblR5cGVDaGVja2VyDQorew0KK3B1YmxpYzoNCisNCisJc3RhdGljIGJvb2wgaXNGaW5hbFN5bWJvbGljQmFzaWNTeW1ib2woY29uc3QgQkYgJiBhbkVsZW1lbnQpOw0KKw0KKwlzdGF0aWMgYm9vbCBpc0ZpbmFsU3ltYm9saWNDb21wb3NpdGVTeW1ib2woY29uc3QgQkYgJiBhbkVsZW1lbnQpOw0KKw0KKwlzdGF0aWMgYm9vbCBpc0ZpbmFsU3ltYm9saWNDb21wb3NpdGVTeW1ib2woQnVpbHRpbkFycmF5ICogYXJyYXlGb3JtKTsNCisNCisJaW5saW5lIHN0YXRpYyBib29sIGlzRmluYWxTeW1ib2xpY1N5bWJvbChjb25zdCBCRiAmIGFuRWxlbWVudCkNCisJew0KKwkJcmV0dXJuKCBpc0ZpbmFsU3ltYm9saWNCYXNpY1N5bWJvbChhbkVsZW1lbnQpIHx8DQorCQkJCWlzRmluYWxTeW1ib2xpY0NvbXBvc2l0ZVN5bWJvbChhbkVsZW1lbnQpICk7DQorCX0NCisNCisNCisJaW5saW5lIHN0YXRpYyBib29sIGlzTWFjcm8oY29uc3QgQkYgJiBhbkV4cHIpDQorCXsNCisJCXJldHVybiggKGFuRXhwci5pczwgQmFzZUluc3RhbmNlRm9ybSA+KCkgJiYNCisJCQkJYW5FeHByLnRvX3B0cjwgQmFzZUluc3RhbmNlRm9ybSA+KCktPmdldE1vZGlmaWVyKCkuaGFzTmF0dXJlTWFjcm8oKSkgfHwNCisJCQkJKGFuRXhwci5pczwgQXZtQ29kZSA+KCkgJiYNCisJCQkJCQlpc01hY3JvKGFuRXhwci50b19wdHI8IEF2bUNvZGUgPigpKSkgKTsNCisJfQ0KKw0KKwlpbmxpbmUgc3RhdGljIGJvb2wgaXNNYWNybyhBdm1Db2RlICogYUNvZGUpDQorCXsNCisJCXJldHVybiggT3BlcmF0b3JNYW5hZ2VyOjppc1F1b3RlKCBhQ29kZS0+Z2V0T3BlcmF0b3IoKSApICk7DQorCX0NCisNCisNCisJc3RhdGljIGJvb2wgaXNNYWNoaW5lKGNvbnN0IEJGICYgYW5FeHByKTsNCisNCisJaW5saW5lIHN0YXRpYyBib29sIGlzUG9ydChjb25zdCBCRiAmIGFuRXhwcikNCisJew0KKwkJcmV0dXJuKCBhbkV4cHIuaXM8IEJhc2VJbnN0YW5jZUZvcm0gPigpICYmDQorCQkJCWFuRXhwci50b19wdHI8IEJhc2VJbnN0YW5jZUZvcm0gPigpLT5pc1R5cGVkUG9ydCgpICApOw0KKwl9DQorDQorCWlubGluZSBzdGF0aWMgYm9vbCBpc0J1ZmZlcihjb25zdCBCRiAmIGFuRXhwcikNCisJew0KKwkJcmV0dXJuKCBhbkV4cHIuaXM8IEJhc2VJbnN0YW5jZUZvcm0gPigpICYmDQorCQkJCWFuRXhwci50b19wdHI8IEJhc2VJbnN0YW5jZUZvcm0gPigpLT5pc1R5cGVkQnVmZmVyKCkgKTsNCisJfQ0KKw0KKwlpbmxpbmUgc3RhdGljIGJvb2wgaXNNZXNzYWdlKGNvbnN0IEJGICYgYW5FeHByKQ0KKwl7DQorCQlyZXR1cm4oIGFuRXhwci5pczwgQmFzZUluc3RhbmNlRm9ybSA+KCkgJiYNCisJCQkJYW5FeHByLnRvX3B0cjwgQmFzZUluc3RhbmNlRm9ybSA+KCktPmlzVHlwZWRNZXNzYWdlKCkgKTsNCisJfQ0KKw0KKw0KKwlpbmxpbmUgc3RhdGljIGJvb2wgaXNFbnVtZXJhdGlvbihjb25zdCBCRiAmIGFuRXhwcikNCisJew0KKwkJcmV0dXJuKCBpc0VudW0oYW5FeHByKSB8fCBpc0NoYXJhY3RlcihhbkV4cHIpIHx8IGlzQm9vbGVhbihhbkV4cHIpICk7DQorCX0NCisNCisJc3RhdGljIGJvb2wgaXNBcnJheSgNCisJCQlDb250YWluZXJUeXBlU3BlY2lmaWVyICogcmVmVHlwZVNwZWNpZmllciwgY29uc3QgQkYgJiBhbkV4cHIpOw0KKw0KKwlzdGF0aWMgYm9vbCBpc0NsYXNzKA0KKwkJCUNsYXNzVHlwZVNwZWNpZmllciAqIHJlZlR5cGVTcGVjaWZpZXIsIGNvbnN0IEJGICYgYW5FeHByKTsNCisNCisJc3RhdGljIGJvb2wgaXNDb2xsZWN0aW9uKA0KKwkJCUNvbnRhaW5lclR5cGVTcGVjaWZpZXIgKiByZWZUeXBlU3BlY2lmaWVyLCBjb25zdCBCRiAmIGFuRXhwcik7DQorDQorCXN0YXRpYyBib29sIGlzVmVjdG9yKGNvbnN0IEJGICYgYW5FeHByKTsNCisNCisNCisJc3RhdGljIGJvb2wgaXNFbnVtKA0KKwkJCUVudW1UeXBlU3BlY2lmaWVyICogcmVmVHlwZVNwZWNpZmllciwgY29uc3QgQkYgJiBhbkV4cHIpOw0KKw0KKwlzdGF0aWMgYm9vbCBpc0VudW0oY29uc3QgQkYgJiBhbkV4cHIpOw0KKw0KKwlzdGF0aWMgYm9vbCBpc0NoYXJhY3Rlcihjb25zdCBCRiAmIGFuRXhwcik7DQorDQorCXN0YXRpYyBib29sIGlzU3RyaW5nKGNvbnN0IEJGICYgYW5FeHByKTsNCisNCisNCisJc3RhdGljIGJvb2wgaXNCb29sZWFuKGNvbnN0IEJGICYgYW5FeHByLCBib29sIHN0cm9uZ2x5VHlwZWRGbGFnID0gdHJ1ZSk7DQorDQorCWlubGluZSBzdGF0aWMgYm9vbCBpc051bWVyaWMoY29uc3QgQkYgJiBhbkV4cHIpDQorCXsNCisJCXJldHVybiggaXNSZWFsKGFuRXhwcikgfHwgaXNFbnVtKGFuRXhwcikgKTsNCisvLwkJCQl8fCBpc0Zsb2F0KGFuRXhwcikgfHwgaXNSYXRpb25hbChhbkV4cHIpIHx8IGlzSW50ZWdlcihhbkV4cHIpICk7DQorCX0NCisNCisJc3RhdGljIGJvb2wgaXNJbnRlZ2VyKGNvbnN0IEJGICYgYW5FeHByKTsNCisNCisJc3RhdGljIGJvb2wgaXNSYXRpb25hbChjb25zdCBCRiAmIGFuRXhwcik7DQorDQorCXN0YXRpYyBib29sIGlzRmxvYXQoY29uc3QgQkYgJiBhbkV4cHIpOw0KKw0KKwlzdGF0aWMgYm9vbCBpc1JlYWwoY29uc3QgQkYgJiBhbkV4cHIpOw0KKw0KKw0KKwlzdGF0aWMgYm9vbCBpc09wZXJhdG9yKGNvbnN0IEJGICYgYW5FeHByKTsNCisNCisJc3RhdGljIGJvb2wgaXNBdm1Db2RlKGNvbnN0IEJGICYgYW5FeHByKTsNCisNCisNCisJaW5saW5lIHN0YXRpYyBib29sIGlzQ2xvY2soY29uc3QgQkYgJiBhbkV4cHIpDQorCXsNCisJCXJldHVybiggaXNSZWFsKGFuRXhwcikgKTsNCisJfQ0KKw0KKwlpbmxpbmUgc3RhdGljIGJvb2wgaXNUaW1lKGNvbnN0IEJGICYgYW5FeHByKQ0KKwl7DQorCQlyZXR1cm4oIGlzUmVhbChhbkV4cHIpICk7DQorCX0NCisNCisJaW5saW5lIHN0YXRpYyBib29sIGlzQ1RpbWUoY29uc3QgQkYgJiBhbkV4cHIpDQorCXsNCisJCXJldHVybiggaXNSZWFsKGFuRXhwcikgKTsNCisJfQ0KKw0KKwlpbmxpbmUgc3RhdGljIGJvb2wgaXNEVGltZShjb25zdCBCRiAmIGFuRXhwcikNCisJew0KKwkJcmV0dXJuKCBpc0ludGVnZXIoYW5FeHByKSApOw0KKwl9DQorDQorDQorCWlubGluZSBzdGF0aWMgYm9vbCBpc0N0b3IoY29uc3QgQkYgJiBhbkV4cHIpDQorCXsNCisJCXJldHVybiggYW5FeHByLmlzPCBBdm1Db2RlID4oKSAmJg0KKwkJCQlpc0N0b3IoYW5FeHByLnRvX3B0cjwgQXZtQ29kZSA+KCkpICk7DQorCX0NCisNCisJaW5saW5lIHN0YXRpYyBib29sIGlzQ3RvcihBdm1Db2RlICogYUNvZGUpDQorCXsNCisJCXJldHVybiggT3BlcmF0b3JNYW5hZ2VyOjppc0N0b3IoIGFDb2RlLT5nZXRPcGVyYXRvcigpICkgKTsNCisJfQ0KKw0KKwlzdGF0aWMgYm9vbCBpc0N0b3IoQmFzZVR5cGVTcGVjaWZpZXIgKiByZWZUeXBlU3BlY2lmaWVyLCBBdm1Db2RlICogYUNvZGUpOw0KKw0KKw0KKwlpbmxpbmUgc3RhdGljIGJvb2wgaXNOZXdmcmVzaChjb25zdCBCRiAmIGFuRXhwcikNCisJew0KKwkJcmV0dXJuKCBhbkV4cHIuaXM8IEF2bUNvZGUgPigpICYmDQorCQkJCWlzTmV3ZnJlc2goYW5FeHByLnRvX3B0cjwgQXZtQ29kZSA+KCkpICk7DQorCX0NCisNCisJaW5saW5lIHN0YXRpYyBib29sIGlzTmV3ZnJlc2goQXZtQ29kZSAqIGFDb2RlKQ0KKwl7DQorCQlyZXR1cm4oIE9wZXJhdG9yTWFuYWdlcjo6aXNOZXdmcmVzaCggYUNvZGUtPmdldE9wZXJhdG9yKCkgKSApOw0KKwl9DQorDQorCXN0YXRpYyBib29sIGlzTmV3ZnJlc2goQmFzZVR5cGVTcGVjaWZpZXIgKiByZWZUeXBlU3BlY2lmaWVyLCBBdm1Db2RlICogYUNvZGUpOw0KKw0KKw0KKwlpbmxpbmUgc3RhdGljIGJvb2wgaXNMb29rdXAoY29uc3QgQkYgJiBhbkV4cHIpDQorCXsNCisJCXJldHVybiggYW5FeHByLmlzPCBBdm1Db2RlID4oKSAmJg0KKwkJCQlpc0xvb2t1cChhbkV4cHIudG9fcHRyPCBBdm1Db2RlID4oKSkgKTsNCisJfQ0KKw0KKwlpbmxpbmUgc3RhdGljIGJvb2wgaXNMb29rdXAoQXZtQ29kZSAqIGFDb2RlKQ0KKwl7DQorCQlyZXR1cm4oIE9wZXJhdG9yTWFuYWdlcjo6aXNMb29rdXAoIGFDb2RlLT5nZXRPcGVyYXRvcigpICkgKTsNCisJfQ0KKw0KKw0KKwlpbmxpbmUgc3RhdGljIGJvb2wgaXNMb29rdXAxRChjb25zdCBCRiAmIGFuRXhwcikNCisJew0KKwkJcmV0dXJuKCBhbkV4cHIuaXM8IEF2bUNvZGUgPigpICYmDQorCQkJCWlzTG9va3VwMUQoYW5FeHByLnRvX3B0cjwgQXZtQ29kZSA+KCkpICk7DQorCX0NCisNCisJaW5saW5lIHN0YXRpYyBib29sIGlzTG9va3VwMUQoQXZtQ29kZSAqIGFDb2RlKQ0KKwl7DQorCQlyZXR1cm4oIE9wZXJhdG9yTWFuYWdlcjo6aXNMb29rdXAxRCggYUNvZGUtPmdldE9wZXJhdG9yKCkgKSApOw0KKwl9DQorDQorDQorCWlubGluZSBzdGF0aWMgYm9vbCBpc0xvb2t1cDJEKGNvbnN0IEJGICYgYW5FeHByKQ0KKwl7DQorCQlyZXR1cm4oIGFuRXhwci5pczwgQXZtQ29kZSA+KCkgJiYNCisJCQkJaXNMb29rdXAyRChhbkV4cHIudG9fcHRyPCBBdm1Db2RlID4oKSkgKTsNCisJfQ0KKw0KKwlpbmxpbmUgc3RhdGljIGJvb2wgaXNMb29rdXAyRChBdm1Db2RlICogYUNvZGUpDQorCXsNCisJCXJldHVybiggT3BlcmF0b3JNYW5hZ2VyOjppc0xvb2t1cDJEKCBhQ29kZS0+Z2V0T3BlcmF0b3IoKSApICk7DQorCX0NCisNCisNCisJc3RhdGljIGJvb2wgaXNUeXBlZChCYXNlVHlwZVNwZWNpZmllciAqIHJlZlR5cGVTcGVjaWZpZXIsDQorCQkJQmFzZVR5cGVTcGVjaWZpZXIgKiBhVHlwZVNwZWNpZmllcik7DQorDQorDQorCWlubGluZSBzdGF0aWMgYm9vbCB3ZWFrbHlUeXBlZChCYXNlVHlwZVNwZWNpZmllciAqIHJlZlR5cGVTcGVjaWZpZXIsDQorCQkJQmFzZVR5cGVTcGVjaWZpZXIgKiBhVHlwZVNwZWNpZmllcikNCisJew0KKwkJaWYoIGlzVHlwZWQocmVmVHlwZVNwZWNpZmllciwgYVR5cGVTcGVjaWZpZXIpICkNCisJCXsNCisJCQlyZXR1cm4oIHRydWUgKTsNCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQlyZXR1cm4oIHJlZlR5cGVTcGVjaWZpZXItPndlYWtseVR5cGVkKA0KKwkJCQkJYVR5cGVTcGVjaWZpZXItPmdldFR5cGVTcGVjaWZpZXJLaW5kKCkpICk7DQorCQl9DQorCX0NCisNCisNCisJc3RhdGljIGJvb2wgaXNUeXBlZChCYXNlVHlwZVNwZWNpZmllciAqIHJlZlR5cGVTcGVjaWZpZXIsIGNvbnN0IEJGICYgYXJnKTsNCisNCisNCit9Ow0KKw0KK30NCisNCisjZW5kaWYgLyogRVhQUkVTU0lPTlRZUEVDSEVDS0VSX0hfICovDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4cHJlc3Npb24vUkVBRE1FLm1kIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4cHJlc3Npb24vUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlOTdjNTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhwcmVzc2lvbi9SRUFETUUubWQKQEAgLTAsMCArMSwxMyBAQAorIyBFRk0tU1lNQkVYIDogRXhwcmVzc2lvbgorCisjIyBTb3VyY2UgY29kZSBzdHJ1Y3R1cmUKKworIyMjIEludGVyZmFjZXMKKyogKipJRXhwcmVzc2lvbioqCisKKyMjIyBDbGFzc2VzCisqICoqRXhwcmVzc2lvbkltcGwqKgorCisjIyMgRmFjdG9yaWVzCisqICoqRXhwcmVzc2lvbioqIGFzIFNtYXJ0IFBvaW50ZXIKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4cHJlc3Npb24vU3RhdGVtZW50Q29uc3RydWN0b3IuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4cHJlc3Npb24vU3RhdGVtZW50Q29uc3RydWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMmZjNTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhwcmVzc2lvbi9TdGF0ZW1lbnRDb25zdHJ1Y3Rvci5jcHAKQEAgLTAsMCArMSwyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDIzIHNlcHQuIDIwMDkKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlN0YXRlbWVudENvbnN0cnVjdG9yLmgiCisKK25hbWVzcGFjZSBzZXAKK3sKKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhwcmVzc2lvbi9TdGF0ZW1lbnRDb25zdHJ1Y3Rvci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4cHJlc3Npb24vU3RhdGVtZW50Q29uc3RydWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTFjYjhkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4cHJlc3Npb24vU3RhdGVtZW50Q29uc3RydWN0b3IuaApAQCAtMCwwICsxLDQ0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjMgc2VwdC4gMjAwOQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFNUQVRFTUVOVENPTlNUUlVDVE9SX0hfCisjZGVmaW5lIFNUQVRFTUVOVENPTlNUUlVDVE9SX0hfCisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9Bdm1Db2RlRmFjdG9yeS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworY2xhc3MgU3RhdGVtZW50Q29uc3RydWN0b3IgIDogIHB1YmxpYyBBdm1Db2RlRmFjdG9yeQoreworCitwdWJsaWM6CisJLyoqCisJICogTk9QIFNUQVRFTUVOVAorCSAqLworCWlubGluZSBzdGF0aWMgQkZDb2RlIG5vcENvZGUoKQorCXsKKwkJcmV0dXJuKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSggT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9OT1AgKSApOworCX0KKworCisKK307CisKKworfQorCisjZW5kaWYgLyogU1RBVEVNRU5UQ09OU1RSVUNUT1JfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL1N0YXRlbWVudEZhY3RvcnkuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4cHJlc3Npb24vU3RhdGVtZW50RmFjdG9yeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVkOTA1MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL1N0YXRlbWVudEZhY3RvcnkuY3BwCkBAIC0wLDAgKzEsMzkxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjMgc2VwdC4gMjAwOQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiU3RhdGVtZW50RmFjdG9yeS5oIgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvQXZtUHJvZ3JhbS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVGb3JtLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZUxpYi5oPgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQXZtQ29kZS5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uRGF0YS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvKioKKyAqIENPTExFQ1QKKyAqIFtzdGF0ZV1tYWNoaW5lCisgKi8KK3ZvaWQgU3RhdGVtZW50RmFjdG9yeTo6Y29sbGVjdFJ1bk1hY2hpbmUoRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGVGb3JtLAorCQljb25zdCBCRiAmIGFTdGF0ZW1lbnQsIExpc3RPZkluc3RhbmNlT2ZNYWNoaW5lICYgbGlzdE9mTWFjaGluZSkKK3sKKwlzd2l0Y2goIGFTdGF0ZW1lbnQuY2xhc3NLaW5kKCkgKQorCXsKKwkJY2FzZSBGT1JNX0FWTUNPREVfS0lORDoKKwkJeworCQkJQXZtQ29kZSogYUNvZGUgPSBhU3RhdGVtZW50LnRvX3B0cjwgQXZtQ29kZSA+KCk7CisKKwkJCXN3aXRjaCggYUNvZGUtPmdldEF2bU9wQ29kZSgpICkKKwkJCXsKKwkJCQljYXNlIEFWTV9PUENPREVfUlVOOgorCisvLwkJCQljYXNlIEFWTV9PUENPREVfUkVTVU1FOgorLy8JCQkJY2FzZSBBVk1fT1BDT0RFX1JFU1RBUlQ6CisJCQkJY2FzZSBBVk1fT1BDT0RFX1NUQVJUOgorCQkJCXsKKwkJCQkJaWYoIGFDb2RlLT5maXJzdCgpLmlzPCBJbnN0YW5jZU9mTWFjaGluZSA+KCkgKQorCQkJCQl7CisJCQkJCQlsaXN0T2ZNYWNoaW5lLmFkZF91bmlvbigKKwkJCQkJCQkJYUNvZGUtPmZpcnN0KCkudG9fcHRyPCBJbnN0YW5jZU9mTWFjaGluZSA+KCkgKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJQXZtQ29kZTo6aXRlcmF0b3IgaXQgPSBhQ29kZS0+YmVnaW4oKTsKKwkJCQkJQXZtQ29kZTo6aXRlcmF0b3IgaXRFbmQgPSBhQ29kZS0+ZW5kKCk7CisJCQkJCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQorCQkJCQl7CisJCQkJCQljb2xsZWN0UnVuTWFjaGluZShhbkV4ZWN1dGFibGVGb3JtLCAoKml0KSwgbGlzdE9mTWFjaGluZSk7CisJCQkJCX0KKworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBGT1JNX0lOU1RBTkNFX01BQ0hJTkVfS0lORDoKKwkJeworLy8JCQlsaXN0T2ZNYWNoaW5lLmFkZF91bmlvbiggYVN0YXRlbWVudC50b19wdHI8IEluc3RhbmNlT2ZNYWNoaW5lID4oKSApOworCisJCQlicmVhazsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisKK3ZvaWQgU3RhdGVtZW50RmFjdG9yeTo6Y29sbGVjdEFjdGl2aXR5TWFjaGluZSgKKwkJRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGVGb3JtLCBBVk1fT1BDT0RFIG9wQ29kZSwKKwkJY29uc3QgQkYgJiBhU3RhdGVtZW50LCBMaXN0T2ZJbnN0YW5jZU9mTWFjaGluZSAmIGxpc3RPZk1hY2hpbmUpCit7CisJc3dpdGNoKCBhU3RhdGVtZW50LmNsYXNzS2luZCgpICkKKwl7CisJCWNhc2UgRk9STV9BVk1DT0RFX0tJTkQ6CisJCXsKKwkJCUF2bUNvZGUqIGFDb2RlID0gYVN0YXRlbWVudC50b19wdHI8IEF2bUNvZGUgPigpOworCisJCQlpZiggYUNvZGUtPmlzT3BDb2RlKG9wQ29kZSkgKQorCQkJeworCQkJCWlmKCBhQ29kZS0+Zmlyc3QoKS5pczwgSW5zdGFuY2VPZk1hY2hpbmUgPigpICkKKwkJCQl7CisJCQkJCWxpc3RPZk1hY2hpbmUuYWRkX3VuaW9uKAorCQkJCQkJCWFDb2RlLT5maXJzdCgpLnRvX3B0cjwgSW5zdGFuY2VPZk1hY2hpbmUgPigpICk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUF2bUNvZGU6Oml0ZXJhdG9yIGl0ID0gYUNvZGUtPmJlZ2luKCk7CisJCQkJQXZtQ29kZTo6aXRlcmF0b3IgaXRFbmQgPSBhQ29kZS0+ZW5kKCk7CisJCQkJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApCisJCQkJeworCQkJCQljb2xsZWN0QWN0aXZpdHlNYWNoaW5lKAorCQkJCQkJCWFuRXhlY3V0YWJsZUZvcm0sIG9wQ29kZSwgKCppdCksIGxpc3RPZk1hY2hpbmUpOworCQkJCX0KKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEZPUk1fSU5TVEFOQ0VfTUFDSElORV9LSU5EOgorCQl7CisvLwkJCWxpc3RPZk1hY2hpbmUuYWRkX3VuaW9uKCBhU3RhdGVtZW50LnRvX3B0cjwgSW5zdGFuY2VPZk1hY2hpbmUgPigpICk7CisKKwkJCWJyZWFrOworCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKwordm9pZCBTdGF0ZW1lbnRGYWN0b3J5Ojpjb2xsZWN0QWN0aXZpdHlNYWNoaW5lKEV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlRm9ybSwKKwkJQVZNX09QQ09ERSBvcENvZGUxLCBBVk1fT1BDT0RFIG9wQ29kZTIsCisJCWNvbnN0IEJGICYgYVN0YXRlbWVudCwgTGlzdE9mSW5zdGFuY2VPZk1hY2hpbmUgJiBsaXN0T2ZNYWNoaW5lKQoreworCXN3aXRjaCggYVN0YXRlbWVudC5jbGFzc0tpbmQoKSApCisJeworCQljYXNlIEZPUk1fQVZNQ09ERV9LSU5EOgorCQl7CisJCQlBdm1Db2RlKiBhQ29kZSA9IGFTdGF0ZW1lbnQudG9fcHRyPCBBdm1Db2RlID4oKTsKKworCQkJaWYoIGFDb2RlLT5pc09wQ29kZShvcENvZGUxKSB8fCBhQ29kZS0+aXNPcENvZGUob3BDb2RlMikgKQorCQkJeworCQkJCWlmKCBhQ29kZS0+Zmlyc3QoKS5pczwgSW5zdGFuY2VPZk1hY2hpbmUgPigpICkKKwkJCQl7CisJCQkJCWxpc3RPZk1hY2hpbmUuYWRkX3VuaW9uKAorCQkJCQkJCWFDb2RlLT5maXJzdCgpLnRvX3B0cjwgSW5zdGFuY2VPZk1hY2hpbmUgPigpICk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUF2bUNvZGU6Oml0ZXJhdG9yIGl0ID0gYUNvZGUtPmJlZ2luKCk7CisJCQkJQXZtQ29kZTo6aXRlcmF0b3IgaXRFbmQgPSBhQ29kZS0+ZW5kKCk7CisJCQkJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApCisJCQkJeworCQkJCQljb2xsZWN0QWN0aXZpdHlNYWNoaW5lKGFuRXhlY3V0YWJsZUZvcm0sCisJCQkJCQkJb3BDb2RlMSwgb3BDb2RlMiwgKCppdCksIGxpc3RPZk1hY2hpbmUpOworCQkJCX0KKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEZPUk1fSU5TVEFOQ0VfTUFDSElORV9LSU5EOgorCQl7CisvLwkJCWxpc3RPZk1hY2hpbmUuYWRkX3VuaW9uKCBhU3RhdGVtZW50LnRvX3B0cjwgSW5zdGFuY2VPZk1hY2hpbmUgPigpICk7CisKKwkJCWJyZWFrOworCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKworLyoqCisgKiBDT0xMRUNUCisgKiBUcmFuc2l0aW9uCisgKi8KK3ZvaWQgU3RhdGVtZW50RmFjdG9yeTo6Y29sbGVjdEludm9rZVRyYW5zaXRpb24oRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGVGb3JtLAorCQljb25zdCBCRiAmIGFTdGF0ZW1lbnQsIExpc3RPZkF2bVRyYW5zaXRpb24gJiBsaXN0T2ZUcmFuc2l0aW9uKQoreworCXN3aXRjaCggYVN0YXRlbWVudC5jbGFzc0tpbmQoKSApCisJeworCQljYXNlIEZPUk1fQVZNQ09ERV9LSU5EOgorCQl7CisJCQlBdm1Db2RlKiBhQ29kZSA9IGFTdGF0ZW1lbnQudG9fcHRyPCBBdm1Db2RlID4oKTsKKworCQkJc3dpdGNoKCBhQ29kZS0+Z2V0QXZtT3BDb2RlKCkgKQorCQkJeworCQkJCWNhc2UgQVZNX09QQ09ERV9JTlZPS0VfVFJBTlNJVElPTjoKKwkJCQl7CisJCQkJCWlmKCBhQ29kZS0+Zmlyc3QoKS5pczwgQXZtVHJhbnNpdGlvbiA+KCkgKQorCQkJCQl7CisJCQkJCQlsaXN0T2ZUcmFuc2l0aW9uLmFkZF91bmlvbigKKwkJCQkJCQkJYUNvZGUtPmZpcnN0KCkudG9fcHRyPCBBdm1UcmFuc2l0aW9uID4oKSApOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWNhc2UgQVZNX09QQ09ERV9TQ0hFRFVMRV9JTlZPS0U6CisJCQkJeworCQkJCQlpZiggYUNvZGUtPmVtcHR5KCkgKQorCQkJCQl7CisJCQkJCQljb2xsZWN0SW52b2tlVHJhbnNpdGlvbihhbkV4ZWN1dGFibGVGb3JtLAorCQkJCQkJCQlhbkV4ZWN1dGFibGVGb3JtLT5nZXRPblNjaGVkdWxlKCksCisJCQkJCQkJCWxpc3RPZlRyYW5zaXRpb24gKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJQXZtQ29kZTo6aXRlcmF0b3IgaXQgPSBhQ29kZS0+YmVnaW4oKTsKKwkJCQkJQXZtQ29kZTo6aXRlcmF0b3IgaXRFbmQgPSBhQ29kZS0+ZW5kKCk7CisJCQkJCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQorCQkJCQl7CisJCQkJCQljb2xsZWN0SW52b2tlVHJhbnNpdGlvbigKKwkJCQkJCQkJYW5FeGVjdXRhYmxlRm9ybSwgKCppdCksIGxpc3RPZlRyYW5zaXRpb24pOworCQkJCQl9CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlicmVhazsKKwkJfQorCisKKwkJY2FzZSBGT1JNX0FWTVRSQU5TSVRJT05fS0lORDoKKwkJeworLy8JCQlsaXN0T2ZUcmFuc2l0aW9uLmFkZF91bmlvbiggYVN0YXRlbWVudC50b19wdHI8IEF2bVRyYW5zaXRpb24gPigpICk7CisKKwkJCWJyZWFrOworCQl9CisKKworCQlkZWZhdWx0OgorCQl7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworCisKKy8qKgorICogQ09MTEVDVAorICogUklECisgKi8KK3ZvaWQgU3RhdGVtZW50RmFjdG9yeTo6Y29sbGVjdFJJRChjb25zdCBCRiAmIGFTdGF0ZW1lbnQsCisJCUxpc3Q8IFJ1bnRpbWVJRCA+ICYgbGlzdE9mUklEKQoreworCXN3aXRjaCggYVN0YXRlbWVudC5jbGFzc0tpbmQoKSApCisJeworCQljYXNlIEZPUk1fQVZNQ09ERV9LSU5EOgorCQl7CisJCQlBdm1Db2RlOjppdGVyYXRvciBpdCA9IGFTdGF0ZW1lbnQudG9fcHRyPCBBdm1Db2RlID4oKS0+YmVnaW4oKTsKKwkJCUF2bUNvZGU6Oml0ZXJhdG9yIGl0RW5kID0gYVN0YXRlbWVudC50b19wdHI8IEF2bUNvZGUgPigpLT5lbmQoKTsKKwkJCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQorCQkJeworCQkJCWNvbGxlY3RSSUQoKCppdCksIGxpc3RPZlJJRCk7CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBGT1JNX1JVTlRJTUVfSURfS0lORDoKKwkJeworCQkJbGlzdE9mUklELmFkZF91bmlvbiggYVN0YXRlbWVudC5iZlJJRCgpICk7CisKKwkJCWJyZWFrOworCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKworCisvKioKKyAqIENPTlRBSU5TCisgKiBBY3Rpdml0eSBvbiBSSUQKKyAqLworYm9vbCBTdGF0ZW1lbnRGYWN0b3J5Ojpjb250YWluc09wZXJhdGlvbk9uUklEKEF2bUNvZGUgKiBhQ29kZSwKKwkJY29uc3QgQVZNX09QQ09ERSBvcEFjdGl2aXR5LCBjb25zdCBSdW50aW1lSUQgJiBhUklEKQoreworCWlmKCBhQ29kZS0+bm9uZW1wdHkoKSApCisJeworCQlBdm1Db2RlOjppdGVyYXRvciBpdCA9IGFDb2RlLT5iZWdpbigpOworCisJCWlmKCBhQ29kZS0+aXNPcENvZGUob3BBY3Rpdml0eSkgJiYgKChhUklEID09ICgqaXQpKQorCQkJCS8qfHwgYUNvZGUtPmNvbnRhaW5zKGFSSUQpKi8pICkKKwkJeworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQlBdm1Db2RlOjppdGVyYXRvciBpdEVuZCA9IGFDb2RlLT5lbmQoKTsKKwkJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApCisJCXsKKwkJCWlmKCAoKml0KS5pczwgQXZtQ29kZSA+KCkgJiYgY29udGFpbnNPcGVyYXRpb25PblJJRCgKKwkJCQkJKCppdCkudG9fcHRyPCBBdm1Db2RlID4oKSwgb3BBY3Rpdml0eSwgYVJJRCkgKQorCQkJeworCQkJCXJldHVybiggdHJ1ZSApOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKKy8qKgorICogZ2V0IGFjdGl2aXR5CisgKiBFeGVjdXRhYmxlRm9ybQorICogb3IKKyAqIFJ1bnRpbWVJRAorICovCitFeGVjdXRhYmxlRm9ybSAqIFN0YXRlbWVudEZhY3Rvcnk6OmdldEFjdGl2aXR5VGFyZ2V0RXhlY3V0YWJsZSgKKwkJQXZtUHJvZ3JhbSAqIGFuQXZtUHJvZ3JhbSwgQXZtQ29kZSAqIGFDb2RlKQoreworLy8JCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9QT0lOVEVSX0VYSVQoIGFDb2RlICkJPDwgIkF2bUNvZGUgISEhIgorLy8JCQkJPDwgU0VORF9FWElUOworCisJaWYoIGFDb2RlLT5lbXB0eSgpICkKKwl7CisJCXJldHVybiggYW5Bdm1Qcm9ncmFtLT5nZXRFeGVjdXRhYmxlKCkgKTsKKwl9CisJZWxzZSAvLyBpZiggYUNvZGUtPnNpbmdsZXRvbigpICkKKwl7CisJCWlmKCBhQ29kZS0+Zmlyc3QoKSA9PSBFeGVjdXRhYmxlTGliOjpNQUNISU5FX1NFTEYgKQorCQl7CisJCQlyZXR1cm4oIGFuQXZtUHJvZ3JhbS0+Z2V0RXhlY3V0YWJsZSgpICk7CisJCX0KKwkJZWxzZSBpZiggYUNvZGUtPmZpcnN0KCkuaXM8IEluc3RhbmNlT2ZNYWNoaW5lID4oKSApCisJCXsKKwkJCXJldHVybiggYUNvZGUtPmZpcnN0KCkudG9fcHRyPCBJbnN0YW5jZU9mTWFjaGluZSA+KCkKKwkJCQkJLT5nZXRFeGVjdXRhYmxlKCkgKTsKKwkJfQorCQllbHNlIGlmKCBhQ29kZS0+Zmlyc3QoKS5pczwgUnVudGltZUlEID4oKSApCisJCXsKKwkJCXJldHVybiggYUNvZGUtPmZpcnN0KCkuYXNfYmY8IFJ1bnRpbWVJRCA+KCkuZ2V0RXhlY3V0YWJsZSgpICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIE5VTEwgKTsKK30KKworCitjb25zdCBSdW50aW1lSUQgJiBTdGF0ZW1lbnRGYWN0b3J5OjpnZXRBY3Rpdml0eVRhcmdldFJJRCgKKwkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsIEF2bUNvZGUgKiBhQ29kZSkKK3sKKwlpZiggYUNvZGUtPmVtcHR5KCkgKQorCXsKKwkJcmV0dXJuKCBhUklEICk7CisJfQorCWVsc2UgLy8gaWYoIGFDb2RlLT5zaW5nbGV0b24oKSApCisJeworCQlpZiggYUNvZGUtPmZpcnN0KCkgPT0gRXhlY3V0YWJsZUxpYjo6TUFDSElORV9TRUxGICkKKwkJeworCQkJcmV0dXJuKCBhUklEICk7CisJCX0KKwkJZWxzZSBpZiggYUNvZGUtPmZpcnN0KCkuaXM8IFJ1bnRpbWVJRCA+KCkgKQorCQl7CisJCQlyZXR1cm4oIGFDb2RlLT5maXJzdCgpLmFzX2JmPCBSdW50aW1lSUQgPigpICk7CisJCX0KKwkJZWxzZSBpZiggYUNvZGUtPmZpcnN0KCkuaXM8IEluc3RhbmNlT2ZNYWNoaW5lID4oKSApCisJCXsKKwkJCXJldHVybiggYW5FRC5nZXRSdW50aW1lSUQoCisJCQkJCWFDb2RlLT5maXJzdCgpLnRvX3B0cjwgSW5zdGFuY2VPZk1hY2hpbmUgPigpKSApOworCQl9CisJfQorCisJcmV0dXJuKCBSdW50aW1lSUQ6OlJFRl9OVUxMICk7Cit9CisKKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhwcmVzc2lvbi9TdGF0ZW1lbnRGYWN0b3J5LmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhwcmVzc2lvbi9TdGF0ZW1lbnRGYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIyYzljZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL1N0YXRlbWVudEZhY3RvcnkuaApAQCAtMCwwICsxLDEyMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDIzIHNlcHQuIDIwMDkKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBTVEFURU1FTlRGQUNUT1JZX0hfCisjZGVmaW5lIFNUQVRFTUVOVEZBQ1RPUllfSF8KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vVHlwZWRlZi5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvQXZtVHJhbnNpdGlvbi5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVMaWIuaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mTWFjaGluZS5oPgorCisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yTGliLmg+CisKKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lSUQuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKK2NsYXNzIEF2bUNvZGU7CitjbGFzcyBBdm1Qcm9ncmFtOworY2xhc3MgRXhlY3V0YWJsZUZvcm07CitjbGFzcyBFeGVjdXRpb25EYXRhOworY2xhc3MgT3BlcmF0b3I7CisKKworY2xhc3MgU3RhdGVtZW50RmFjdG9yeQoreworCitwdWJsaWM6CisKKwkvKioKKwkgKiBDT0xMRUNUCisJICogW3N0YXRlXW1hY2hpbmUKKwkgKi8KKwlzdGF0aWMgdm9pZCBjb2xsZWN0UnVuTWFjaGluZShFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZUZvcm0sCisJCQljb25zdCBCRiAmIGFTdGF0ZW1lbnQsIExpc3RPZkluc3RhbmNlT2ZNYWNoaW5lICYgbGlzdE9mTWFjaGluZSk7CisKKwlzdGF0aWMgdm9pZCBjb2xsZWN0QWN0aXZpdHlNYWNoaW5lKAorCQkJRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGVGb3JtLCBBVk1fT1BDT0RFIG9wQ29kZSwKKwkJCWNvbnN0IEJGICYgYVN0YXRlbWVudCwgTGlzdE9mSW5zdGFuY2VPZk1hY2hpbmUgJiBsaXN0T2ZNYWNoaW5lKTsKKworCXN0YXRpYyB2b2lkIGNvbGxlY3RBY3Rpdml0eU1hY2hpbmUoRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGVGb3JtLAorCQkJQVZNX09QQ09ERSBvcENvZGUxLCBBVk1fT1BDT0RFIG9wQ29kZTIsCisJCQljb25zdCBCRiAmIGFTdGF0ZW1lbnQsIExpc3RPZkluc3RhbmNlT2ZNYWNoaW5lICYgbGlzdE9mTWFjaGluZSk7CisKKworCS8qKgorCSAqIENPTExFQ1QKKwkgKiBUcmFuc2l0aW9uCisJICovCisJc3RhdGljIHZvaWQgY29sbGVjdEludm9rZVRyYW5zaXRpb24oRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGVGb3JtLAorCQkJY29uc3QgQkYgJiBhU3RhdGVtZW50LCBMaXN0T2ZBdm1UcmFuc2l0aW9uICYgbGlzdE9mVHJhbnNpdGlvbik7CisKKworCS8qKgorCSAqIENPTExFQ1QKKwkgKiBSSUQKKwkgKi8KKwlzdGF0aWMgdm9pZCBjb2xsZWN0UklEKGNvbnN0IEJGICYgYVN0YXRlbWVudCwKKwkJCUxpc3Q8IFJ1bnRpbWVJRCA+ICYgbGlzdE9mUklEKTsKKworCisJLyoqCisJICogQ09OVEFJTlMKKwkgKiBBY3Rpdml0eSBvbiBSSUQKKwkgKi8KKwlzdGF0aWMgYm9vbCBjb250YWluc09wZXJhdGlvbk9uUklEKEF2bUNvZGUgKiBhQ29kZSwKKwkJCWNvbnN0IEFWTV9PUENPREUgb3BBY3Rpdml0eSwgY29uc3QgUnVudGltZUlEICYgYVJJRCk7CisKKworCS8qKgorCSAqIGlzIGFjdGl2aXR5IHN0YXRlbWVudCBpcworCSAqIHZvaWQKKwkgKiBvcgorCSAqIHNpbmdsZXRvbiBjb25zdDo6bWFjaGluZSNzZWxmCisJICovCisJaW5saW5lIHN0YXRpYyBib29sIGlzQWN0aXZpdHlPblNlbGYoQXZtQ29kZSAqIGFDb2RlKQorCXsKKy8vCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBhQ29kZSApIDw8ICJBdm1Db2RlIiApOyAhISEiCisvLwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJcmV0dXJuKCBhQ29kZS0+ZW1wdHkoKSB8fCAoYUNvZGUtPnNpbmdsZXRvbigpICYmCisJCQkJYUNvZGUtPmZpcnN0KCkgPT0gRXhlY3V0YWJsZUxpYjo6TUFDSElORV9TRUxGKSApOworCX0KKworCisJLyoqCisJICogZ2V0IGFjdGl2aXR5CisJICogRXhlY3V0YWJsZUZvcm0KKwkgKiBvcgorCSAqIFJ1bnRpbWVJRAorCSAqLworCXN0YXRpYyBFeGVjdXRhYmxlRm9ybSAqIGdldEFjdGl2aXR5VGFyZ2V0RXhlY3V0YWJsZSgKKwkJCUF2bVByb2dyYW0gKiBhbkF2bVByb2dyYW0sIEF2bUNvZGUgKiBhQ29kZSk7CisKKworCXN0YXRpYyBjb25zdCBSdW50aW1lSUQgJiBnZXRBY3Rpdml0eVRhcmdldFJJRCgKKwkJCWNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVELAorCQkJY29uc3QgUnVudGltZUlEICYgYVJJRCwgQXZtQ29kZSAqIGFDb2RlKTsKKworCit9OworCisKK30KKworI2VuZGlmIC8qIFNUQVRFTUVOVEZBQ1RPUllfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL1N0YXRlbWVudFR5cGVDaGVja2VyLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9leHByZXNzaW9uL1N0YXRlbWVudFR5cGVDaGVja2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjU4ZTA3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4cHJlc3Npb24vU3RhdGVtZW50VHlwZUNoZWNrZXIuY3BwCkBAIC0wLDAgKzEsMjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyNSBzZXB0LiAyMDA5CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJTdGF0ZW1lbnRUeXBlQ2hlY2tlci5oIgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvZXhwcmVzc2lvbi9TdGF0ZW1lbnRUeXBlQ2hlY2tlci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4cHJlc3Npb24vU3RhdGVtZW50VHlwZUNoZWNrZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTA5MjM4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2V4cHJlc3Npb24vU3RhdGVtZW50VHlwZUNoZWNrZXIuaApAQCAtMCwwICsxLDIzOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDI1IHNlcHQuIDIwMDkKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBTVEFURU1FTlRUWVBFQ0hFQ0tFUl9IXworI2RlZmluZSBTVEFURU1FTlRUWVBFQ0hFQ0tFUl9IXworCisjaW5jbHVkZSA8Y29tbW9uL0JGLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9Bdm1Db2RlLmg+CisKKyNpbmNsdWRlIDxmbWwvb3BlcmF0b3IvT3BlcmF0b3JNYW5hZ2VyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIEVsZW1lbnQ7CisKKworY2xhc3MgU3RhdGVtZW50VHlwZUNoZWNrZXIKK3sKKworcHVibGljOgorCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIEtJTkQgQ0hFQ0tFUgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlubGluZSBzdGF0aWMgYm9vbCBpc1N0cnVjdHVyZWQoY29uc3QgQkYgJiBhQ29kZSkKKwl7CisJCXJldHVybiggYUNvZGUuaXM8IEF2bUNvZGUgPigpICYmCisJCQkJaXNTdHJ1Y3R1cmVkKGFDb2RlLnRvX3B0cjwgQXZtQ29kZSA+KCkpICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBib29sIGlzU3RydWN0dXJlZChBdm1Db2RlICogYUNvZGUpCisJeworCQlyZXR1cm4oIE9wZXJhdG9yTWFuYWdlcjo6aXNTY2hlZHVsZSggYUNvZGUtPmdldE9wZXJhdG9yKCkgKSB8fAorCQkJCU9wZXJhdG9yTWFuYWdlcjo6aXNDb25kaXRpb25uYWwoIGFDb2RlLT5nZXRPcGVyYXRvcigpICkgKTsKKwl9CisKKworCWlubGluZSBzdGF0aWMgYm9vbCBpc0Fzc2lnbihjb25zdCBCRiAmIGFDb2RlKQorCXsKKwkJcmV0dXJuKCBhQ29kZS5pczwgQXZtQ29kZSA+KCkgJiYKKwkJCQlpc0Fzc2lnbihhQ29kZS50b19wdHI8IEF2bUNvZGUgPigpKSApOworCX0KKworCWlubGluZSBzdGF0aWMgYm9vbCBpc0Fzc2lnbihBdm1Db2RlICogYUNvZGUpCisJeworCQlyZXR1cm4oIE9wZXJhdG9yTWFuYWdlcjo6aXNBc3NpZ24oIGFDb2RlLT5nZXRPcGVyYXRvcigpICkgKTsKKwl9CisKKworCWlubGluZSBzdGF0aWMgYm9vbCBpc1NlcXVlbmNlKGNvbnN0IEJGICYgYUNvZGUpCisJeworCQlyZXR1cm4oIGFDb2RlLmlzPCBBdm1Db2RlID4oKSAmJgorCQkJCWlzU2VxdWVuY2UoYUNvZGUudG9fcHRyPCBBdm1Db2RlID4oKSkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIGJvb2wgaXNTZXF1ZW5jZShBdm1Db2RlICogYUNvZGUpCisJeworCQlyZXR1cm4oIE9wZXJhdG9yTWFuYWdlcjo6aXNTZXF1ZW5jZSggYUNvZGUtPmdldE9wZXJhdG9yKCkgKSApOworCX0KKworCisJaW5saW5lIHN0YXRpYyBib29sIGlzU2NoZWR1bGUoY29uc3QgQkYgJiBhQ29kZSkKKwl7CisJCXJldHVybiggYUNvZGUuaXM8IEF2bUNvZGUgPigpICYmCisJCQkJaXNTY2hlZHVsZShhQ29kZS50b19wdHI8IEF2bUNvZGUgPigpKSApOworCX0KKworCWlubGluZSBzdGF0aWMgYm9vbCBpc1NjaGVkdWxlKEF2bUNvZGUgKiBhQ29kZSkKKwl7CisJCXJldHVybiggT3BlcmF0b3JNYW5hZ2VyOjppc1NjaGVkdWxlKCBhQ29kZS0+Z2V0T3BlcmF0b3IoKSApICk7CisJfQorCisKKwlpbmxpbmUgc3RhdGljIGJvb2wgaXNNYWNoaW5lKGNvbnN0IEJGICYgYUNvZGUpCisJeworCQlyZXR1cm4oIGFDb2RlLmlzPCBBdm1Db2RlID4oKSAmJgorCQkJCWlzTWFjaGluZShhQ29kZS50b19wdHI8IEF2bUNvZGUgPigpKSApOworCX0KKworCWlubGluZSBzdGF0aWMgYm9vbCBpc01hY2hpbmUoQXZtQ29kZSAqIGFDb2RlKQorCXsKKwkJcmV0dXJuKCBPcGVyYXRvck1hbmFnZXI6OmlzTWFjaGluZSggYUNvZGUtPmdldE9wZXJhdG9yKCkgKSApOworCX0KKworCisJaW5saW5lIHN0YXRpYyBib29sIGlzQWN0aXZpdHkoY29uc3QgQkYgJiBhQ29kZSkKKwl7CisJCXJldHVybiggYUNvZGUuaXM8IEF2bUNvZGUgPigpICYmCisJCQkJaXNBY3Rpdml0eShhQ29kZS50b19wdHI8IEF2bUNvZGUgPigpKSApOworCX0KKworCWlubGluZSBzdGF0aWMgYm9vbCBpc0FjdGl2aXR5KEF2bUNvZGUgKiBhQ29kZSkKKwl7CisJCXJldHVybiggT3BlcmF0b3JNYW5hZ2VyOjppc0FjdGl2aXR5KCBhQ29kZS0+Z2V0T3BlcmF0b3IoKSApICk7CisJfQorCisKKwlpbmxpbmUgc3RhdGljIGJvb2wgaXNJbnZva2VOZXcoY29uc3QgQkYgJiBhQ29kZSkKKwl7CisJCXJldHVybiggYUNvZGUuaXM8IEF2bUNvZGUgPigpICYmCisJCQkJaXNJbnZva2VOZXcoYUNvZGUudG9fcHRyPCBBdm1Db2RlID4oKSkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIGJvb2wgaXNJbnZva2VOZXcoQXZtQ29kZSAqIGFDb2RlKQorCXsKKwkJcmV0dXJuKCBhQ29kZS0+Z2V0T3BlcmF0b3IoKSA9PSBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0lOVk9LRV9ORVcgKTsKKwl9CisKKworCWlubGluZSBzdGF0aWMgYm9vbCBpc0NvbW11bmljYXRpb24oY29uc3QgQkYgJiBhQ29kZSkKKwl7CisJCXJldHVybiggYUNvZGUuaXM8IEF2bUNvZGUgPigpICYmCisJCQkJaXNDb21tdW5pY2F0aW9uKGFDb2RlLnRvX3B0cjwgQXZtQ29kZSA+KCkpICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBib29sIGlzQ29tbXVuaWNhdGlvbihBdm1Db2RlICogYUNvZGUpCisJeworCQlyZXR1cm4oIE9wZXJhdG9yTWFuYWdlcjo6aXNDb21tdW5pY2F0aW9uKCBhQ29kZS0+Z2V0T3BlcmF0b3IoKSApICk7CisJfQorCisKKwlpbmxpbmUgc3RhdGljIGJvb2wgaXNDb25kaXRpb25uYWwoY29uc3QgQkYgJiBhQ29kZSkKKwl7CisJCXJldHVybiggYUNvZGUuaXM8IEF2bUNvZGUgPigpICYmCisJCQkJaXNDb25kaXRpb25uYWwoYUNvZGUudG9fcHRyPCBBdm1Db2RlID4oKSkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIGJvb2wgaXNDb25kaXRpb25uYWwoQXZtQ29kZSAqIGFDb2RlKQorCXsKKwkJcmV0dXJuKCBPcGVyYXRvck1hbmFnZXI6OmlzQ29uZGl0aW9ubmFsKCBhQ29kZS0+Z2V0T3BlcmF0b3IoKSApICk7CisJfQorCisKKwlpbmxpbmUgc3RhdGljIGJvb2wgaXNTdGF0ZW1lbnQoY29uc3QgQkYgJiBhQ29kZSkKKwl7CisJCXJldHVybiggYUNvZGUuaXM8IEF2bUNvZGUgPigpICYmCisJCQkJaXNTdGF0ZW1lbnQoYUNvZGUudG9fcHRyPCBBdm1Db2RlID4oKSkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIGJvb2wgaXNTdGF0ZW1lbnQoQXZtQ29kZSAqIGFDb2RlKQorCXsKKwkJcmV0dXJuKCBPcGVyYXRvck1hbmFnZXI6OmlzU3RhdGVtZW50KCBhQ29kZS0+Z2V0T3BlcmF0b3IoKSApICk7CisJfQorCisKKwlpbmxpbmUgc3RhdGljIGJvb2wgaXNBdG9taWNTdGF0ZW1lbnQoY29uc3QgQkYgJiBhQ29kZSkKKwl7CisJCXJldHVybiggYUNvZGUuaXM8IEF2bUNvZGUgPigpICYmCisJCQkJaXNBdG9taWNTdGF0ZW1lbnQoYUNvZGUudG9fcHRyPCBBdm1Db2RlID4oKSkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIGJvb2wgaXNBdG9taWNTdGF0ZW1lbnQoQXZtQ29kZSAqIGFDb2RlKQorCXsKKwkJcmV0dXJuKCBPcGVyYXRvck1hbmFnZXI6OmlzQXRvbWljU3RhdGVtZW50KCBhQ29kZS0+Z2V0T3BlcmF0b3IoKSApICk7CisJfQorCisKKwlpbmxpbmUgc3RhdGljIGJvb2wgaXNBdG9taWNTZXF1ZW5jZShjb25zdCBCRiAmIGFDb2RlKQorCXsKKwkJcmV0dXJuKCBhQ29kZS5pczwgQXZtQ29kZSA+KCkgJiYKKwkJCQlpc0F0b21pY1NlcXVlbmNlKGFDb2RlLnRvX3B0cjwgQXZtQ29kZSA+KCkpICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBib29sIGlzQXRvbWljU2VxdWVuY2UoQXZtQ29kZSAqIGFDb2RlKQorCXsKKwkJcmV0dXJuKCBhQ29kZS0+aXNPcENvZGUoIEFWTV9PUENPREVfQVRPTUlDX1NFUVVFTkNFICkgKTsKKwl9CisKKworCWlubGluZSBzdGF0aWMgYm9vbCBpc1N0cm9uZ0F0b21pY1NlcXVlbmNlKGNvbnN0IEJGICYgYUNvZGUpCisJeworCQlyZXR1cm4oIGFDb2RlLmlzPCBBdm1Db2RlID4oKSAmJgorCQkJCWlzU3Ryb25nQXRvbWljU2VxdWVuY2UoYUNvZGUudG9fcHRyPCBBdm1Db2RlID4oKSkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIGJvb2wgaXNTdHJvbmdBdG9taWNTZXF1ZW5jZShBdm1Db2RlICogYUNvZGUpCisJeworCQlyZXR1cm4oIGFDb2RlLT5pc09wQ29kZSggQVZNX09QQ09ERV9BVE9NSUNfU0VRVUVOQ0UgKSAmJgorCQkJCShhQ29kZS0+ZW1wdHkoKSB8fCBpc0F0b21pY1N0YXRlbWVudChhQ29kZS0+bGFzdCgpKSkgICk7CisJfQorCisKKwlpbmxpbmUgc3RhdGljIGJvb2wgaXNDb21tZW50KGNvbnN0IEJGICYgYUNvZGUpCisJeworCQlyZXR1cm4oIGFDb2RlLmlzPCBBdm1Db2RlID4oKSAmJgorCQkJCWlzQ29tbWVudChhQ29kZS50b19wdHI8IEF2bUNvZGUgPigpKSApOworCX0KKworCWlubGluZSBzdGF0aWMgYm9vbCBpc0NvbW1lbnQoQXZtQ29kZSAqIGFDb2RlKQorCXsKKwkJcmV0dXJuKCBhQ29kZS0+aXNPcENvZGUoIEFWTV9PUENPREVfQ09NTUVOVCApICk7CisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gRU1QVFlORVNTIENIRUNLRVIKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlpbmxpbmUgc3RhdGljIGJvb2wgaXNFbXB0eVNjaGVkdWxlKEF2bUNvZGUgKiBhQ29kZSkKKwl7CisJCXJldHVybiggYUNvZGUtPmVtcHR5KCkgJiYKKwkJCQlPcGVyYXRvck1hbmFnZXI6OmlzU2NoZWR1bGUoIGFDb2RlLT5nZXRPcGVyYXRvcigpICkgKTsKKwl9CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gRE8gU09NRVRISU5HIENIRUNLRVIKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlpbmxpbmUgc3RhdGljIGJvb2wgZG9Tb21ldGhpbmcoQXZtQ29kZSAqIGFDb2RlKQorCXsKKwkJcmV0dXJuKCBhQ29kZS0+bm9uZW1wdHkoKSB8fCAoISBpc1NjaGVkdWxlKGFDb2RlKSkgKTsKKwl9CisKKworCisKK307CisKKworfQorCisjZW5kaWYgLyogU1RBVEVNRU5UVFlQRUNIRUNLRVJfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9CZWhhdmlvcmFsUGFydC5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvaW5mcmFzdHJ1Y3R1cmUvQmVoYXZpb3JhbFBhcnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNzliN2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvaW5mcmFzdHJ1Y3R1cmUvQmVoYXZpb3JhbFBhcnQuY3BwCkBAIC0wLDAgKzEsMjk0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjIgZsOpdnIuIDIwMTEKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkJlaGF2aW9yYWxQYXJ0LmgiCisKKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvTWFjaGluZS5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9UcmFuc2l0aW9uLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorICogVVRJTAorICovCitSb3V0aW5lICYgQmVoYXZpb3JhbFBhcnQ6OmdldEFjdGl2aXR5KEFWTV9PUENPREUgb3Bjb2RlQWN0aXZpdHkpCit7CisJc3dpdGNoKCBvcGNvZGVBY3Rpdml0eSApCisJeworCQljYXNlIEFWTV9PUENPREVfSU5WT0tFX05FVyA6IHJldHVybiggb25DcmVhdGVSb3V0aW5lICApOworCisJCWNhc2UgQVZNX09QQ09ERV9JTklUICAgOiByZXR1cm4oIG9uSW5pdFJvdXRpbmUgICk7CisJCWNhc2UgQVZNX09QQ09ERV9GSU5BTCAgOiByZXR1cm4oIG9uUmV0dXJuUm91dGluZSApOworCisJCWNhc2UgQVZNX09QQ09ERV9SRVRVUk4gOiByZXR1cm4oIG9uUmV0dXJuUm91dGluZSApOworCisJCWNhc2UgQVZNX09QQ09ERV9TVEFSVCAgOiByZXR1cm4oIG9uU3RhcnRSb3V0aW5lICk7CisJCWNhc2UgQVZNX09QQ09ERV9TVE9QICAgOiByZXR1cm4oIG9uU3RvcFJvdXRpbmUgICk7CisKKwkJY2FzZSBBVk1fT1BDT0RFX0lFTkFCTEVfSU5WT0tFIDogcmV0dXJuKCBvbklFbmFibGVSb3V0aW5lICk7CisJCWNhc2UgQVZNX09QQ09ERV9FTkFCTEVfSU5WT0tFICA6IHJldHVybiggb25FbmFibGVSb3V0aW5lICApOworCisJCWNhc2UgQVZNX09QQ09ERV9JRElTQUJMRV9JTlZPS0U6IHJldHVybiggb25JRGlzYWJsZVJvdXRpbmUgKTsKKwkJY2FzZSBBVk1fT1BDT0RFX0RJU0FCTEVfSU5WT0tFIDogcmV0dXJuKCBvbkRpc2FibGVSb3V0aW5lICApOworCisJCWNhc2UgQVZNX09QQ09ERV9JQUJPUlRfSU5WT0tFICA6IHJldHVybiggb25JQWJvcnRSb3V0aW5lICk7CisJCWNhc2UgQVZNX09QQ09ERV9BQk9SVF9JTlZPS0UgICA6IHJldHVybiggb25BYm9ydFJvdXRpbmUgICk7CisKKwkJY2FzZSBBVk1fT1BDT0RFX0lSVU46IHJldHVybiggb25JUnVuUm91dGluZSApOworCQljYXNlIEFWTV9PUENPREVfUlVOIDogcmV0dXJuKCBvblJ1blJvdXRpbmUgICk7CisJCWNhc2UgQVZNX09QQ09ERV9SVEMgOiByZXR1cm4oIG9uUnRjUm91dGluZSAgKTsKKworCQljYXNlIEFWTV9PUENPREVfU0NIRURVTEVfSU5WT0tFOiByZXR1cm4oIG9uU2NoZWR1bGVSb3V0aW5lICk7CisKKwkJY2FzZSBBVk1fT1BDT0RFX1NZTkNIUk9OSVpFICAgIDogcmV0dXJuKCBvblN5bmNocm9uaXplUm91dGluZSApOworCisJCWRlZmF1bHQ6CisJCXsKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCTw8ICJCZWhhdmlvcmFsUGFydDo6Z2V0QWN0aXZpdHk6PiBVbmtub3duIEFjdGl2aXR5ICEhISIKKwkJCQkJPDwgU0VORF9FWElUOworCisJCQlyZXR1cm4oIG9uUnVuUm91dGluZSApOworCQl9CisJfQorfQorCitjb25zdCBSb3V0aW5lICYgQmVoYXZpb3JhbFBhcnQ6OmdldEFjdGl2aXR5KEFWTV9PUENPREUgb3Bjb2RlQWN0aXZpdHkpIGNvbnN0Cit7CisJc3dpdGNoKCBvcGNvZGVBY3Rpdml0eSApCisJeworCQljYXNlIEFWTV9PUENPREVfSU5WT0tFX05FVyAgICA6IHJldHVybiggb25DcmVhdGVSb3V0aW5lICApOworCisJCWNhc2UgQVZNX09QQ09ERV9JTklUICAgOiByZXR1cm4oIG9uSW5pdFJvdXRpbmUgICk7CisJCWNhc2UgQVZNX09QQ09ERV9GSU5BTCAgOiByZXR1cm4oIG9uUmV0dXJuUm91dGluZSApOworCisJCWNhc2UgQVZNX09QQ09ERV9SRVRVUk4gOiByZXR1cm4oIG9uUmV0dXJuUm91dGluZSApOworCisJCWNhc2UgQVZNX09QQ09ERV9TVEFSVCAgOiByZXR1cm4oIG9uU3RhcnRSb3V0aW5lICk7CisJCWNhc2UgQVZNX09QQ09ERV9TVE9QICAgOiByZXR1cm4oIG9uU3RvcFJvdXRpbmUgICk7CisKKwkJY2FzZSBBVk1fT1BDT0RFX0lFTkFCTEVfSU5WT0tFIDogcmV0dXJuKCBvbklFbmFibGVSb3V0aW5lICk7CisJCWNhc2UgQVZNX09QQ09ERV9FTkFCTEVfSU5WT0tFICA6IHJldHVybiggb25FbmFibGVSb3V0aW5lICApOworCisJCWNhc2UgQVZNX09QQ09ERV9JRElTQUJMRV9JTlZPS0U6IHJldHVybiggb25JRGlzYWJsZVJvdXRpbmUgKTsKKwkJY2FzZSBBVk1fT1BDT0RFX0RJU0FCTEVfSU5WT0tFIDogcmV0dXJuKCBvbkRpc2FibGVSb3V0aW5lICApOworCisJCWNhc2UgQVZNX09QQ09ERV9JQUJPUlRfSU5WT0tFICA6IHJldHVybiggb25JQWJvcnRSb3V0aW5lICk7CisJCWNhc2UgQVZNX09QQ09ERV9BQk9SVF9JTlZPS0UgICA6IHJldHVybiggb25BYm9ydFJvdXRpbmUgICk7CisKKwkJY2FzZSBBVk1fT1BDT0RFX0lSVU46IHJldHVybiggb25JUnVuUm91dGluZSApOworCQljYXNlIEFWTV9PUENPREVfUlVOIDogcmV0dXJuKCBvblJ1blJvdXRpbmUgICk7CisJCWNhc2UgQVZNX09QQ09ERV9SVEMgOiByZXR1cm4oIG9uUnRjUm91dGluZSAgKTsKKworCQljYXNlIEFWTV9PUENPREVfU0NIRURVTEVfSU5WT0tFOiByZXR1cm4oIG9uU2NoZWR1bGVSb3V0aW5lICk7CisKKwkJY2FzZSBBVk1fT1BDT0RFX1NZTkNIUk9OSVpFICAgIDogcmV0dXJuKCBvblN5bmNocm9uaXplUm91dGluZSApOworCisJCWRlZmF1bHQ6CisJCXsKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCTw8ICJCZWhhdmlvcmFsUGFydDo6Z2V0QWN0aXZpdHk6PiBVbmtub3duIEFjdGl2aXR5ICEhISIKKwkJCQkJPDwgU0VORF9FWElUOworCisJCQlyZXR1cm4oIG9uUnVuUm91dGluZSApOworCQl9CisJfQorfQorCisKKy8qKgorICogU2VyaWFsaXphdGlvbgorICovCit2b2lkIEJlaGF2aW9yYWxQYXJ0Ojp0b1N0cmVhbVJvdXRpbmUoT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJb3MgPDwgVEFCIDw8ICJyb3V0aW5lOiIgPDwgRU9MX0lOQ1JfSU5ERU5UOworCisJY29uc3Rfcm91dGluZV9pdGVyYXRvciBpdCA9IG1Sb3V0aW5lcy5iZWdpbigpOworCWNvbnN0X3JvdXRpbmVfaXRlcmF0b3IgZW5kSXQgPSBtUm91dGluZXMuZW5kKCk7CisJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJeworCQkoaXQpLT50b1N0cmVhbShvcyk7CisJfQorCisJb3MgPDwgREVDUl9JTkRFTlQ7Cit9CisKK3ZvaWQgQmVoYXZpb3JhbFBhcnQ6OnRvU3RyZWFtQW5vbnltb3VzSW5uZXJSb3V0aW5lKE91dFN0cmVhbSAmIG9zKSBjb25zdAoreworCW9zIDw8IFRBQiA8PCAiLypyb3V0aW5lPCBhbm9ueW1vdXMjaW5uZXIgPjogWyIgPDwgRU9MOworCisJY29uc3Rfcm91dGluZV9pdGVyYXRvciBpdCA9IG1Bbm9ueW1vdXNJbm5lclJvdXRpbmVzLmJlZ2luKCk7CisJY29uc3Rfcm91dGluZV9pdGVyYXRvciBlbmRJdCA9IG1Bbm9ueW1vdXNJbm5lclJvdXRpbmVzLmVuZCgpOworCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCXsKKwkJb3MgPDwgVEFCMiA8PCAoaXQpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8ICI7IiA8PCBFT0w7CisvLwkJb3MgPDwgVEFCMiA8PCBzdHJfaGVhZGVyKCAqaXQgKSA8PCAiOyIgPDwgRU9MOworCX0KKwlvcyA8PCBUQUIgPDwgIl0gLy8gZW5kIHJvdXRpbmUiIDw8ICIqLyIgPDwgRU9MMl9GTFVTSDsKK30KKworCit2b2lkIEJlaGF2aW9yYWxQYXJ0Ojp0b1N0cmVhbU1vZShPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwkvKioKKwkgKiBUcmFuc2l0aW9ucyBQYXJ0CisJICovCisJaWYoIGhhc091dGdvaW5nVHJhbnNpdGlvbigpICkKKwl7CisJCWlmKCBub3QgZ2V0Q29udGFpbmVyTWFjaGluZSgpLT5nZXRTcGVjaWZpZXIoKS5pc1N0YXRlQmFzaWMoKSApCisJCXsKKwkJCW9zIDw8IFRBQiA8PCAidHJhbnNpdGlvbiIgLyo8PCAiPCBvdXRnb2luZyA+IiovIDw8ICI6IiA8PCBFT0w7CisJCX0KKworCQlvcyA8PCBJTkNSX0lOREVOVDsKKwkJY29uc3RfdHJhbnNpdGlvbl9pdGVyYXRvciBpdCA9IG91dGdvaW5nX3RyYW5zaXRpb25fYmVnaW4oKTsKKwkJY29uc3RfdHJhbnNpdGlvbl9pdGVyYXRvciBlbmRJdCA9IG91dGdvaW5nX3RyYW5zaXRpb25fZW5kKCk7CisJCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCQl7CisJCQkoaXQpLT50b1N0cmVhbShvcyk7CisJCX0KKwkJb3MgPDwgREVDUl9JTkRFTlQ7CisJfQorCisJaWYoIGhhc0luY29taW5nVHJhbnNpdGlvbigpICkKKwl7CisJCW9zIDw8IFRBQiA8PCAiLyp0cmFuc2l0aW9uPCBpbmNvbWluZyA+OiBbIiA8PCBFT0xfSU5DUl9JTkRFTlQ7CisJCWNvbnN0X3RyYW5zaXRpb25faXRlcmF0b3IgaXQgPSBpbmNvbWluZ190cmFuc2l0aW9uX2JlZ2luKCk7CisJCWNvbnN0X3RyYW5zaXRpb25faXRlcmF0b3IgZW5kSXQgPSBpbmNvbWluZ190cmFuc2l0aW9uX2VuZCgpOworCQlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJeworCQkJb3MgPDwgVEFCMiA8PCBzdHJfaGVhZGVyKCAqaXQgKSA8PCAiOyIgPDwgRU9MOworCQl9CisJCW9zIDw8IERFQ1JfSU5ERU5UX1RBQiA8PCAiXSAvLyBlbmQgdHJhbnNpdGlvbiIgPDwgIiovIiA8PCBFT0xfRkxVU0g7CisJfQorCisKKwlpZiggZ2V0Q29udGFpbmVyKCktPmlzbm90PCBNYWNoaW5lID4oKSB8fAorCQkobm90IGdldENvbnRhaW5lck1hY2hpbmUoKS0+Z2V0U3BlY2lmaWVyKCkuaXNTdGF0ZUJhc2ljKCkpICkKKwl7CisJCW9zIDw8IFRBQiA8PCBnZXROYW1lSUQoKSA8PCAiOiIgPDwgRU9MOworCX0KKworCS8qKgorCSAqIFJvdXRpbmVzIFBhcnQKKwkgKi8KKwlvcyA8PCBJTkNSX0lOREVOVDsKKworCWlmKCBoYXNPbkNyZWF0ZSgpICkKKwl7CisJCWdldE9uQ3JlYXRlUm91dGluZSgpLnRvU3RyZWFtKG9zKTsKKwl9CisKKwlpZiggaGFzT25Jbml0KCkgKQorCXsKKwkJZ2V0T25Jbml0Um91dGluZSgpLnRvU3RyZWFtKG9zKTsKKwl9CisKKwlpZiggaGFzT25GaW5hbCgpICkKKwl7CisJCWdldE9uRmluYWxSb3V0aW5lKCkudG9TdHJlYW0ob3MpOworCX0KKworCWlmKCBoYXNPblJldHVybigpICkKKwl7CisJCWdldE9uUmV0dXJuUm91dGluZSgpLnRvU3RyZWFtKG9zKTsKKwl9CisKKworCWlmKCBoYXNPblN0YXJ0KCkgKQorCXsKKwkJZ2V0T25TdGFydFJvdXRpbmUoKS50b1N0cmVhbShvcyk7CisJfQorCisJaWYoIGhhc09uU3RvcCgpICkKKwl7CisJCWdldE9uU3RvcFJvdXRpbmUoKS50b1N0cmVhbShvcyk7CisJfQorCisKKwlpZiggaGFzT25JRW5hYmxlKCkgKQorCXsKKwkJZ2V0T25JRW5hYmxlUm91dGluZSgpLnRvU3RyZWFtKG9zKTsKKwl9CisKKwlpZiggaGFzT25FbmFibGUoKSApCisJeworCQlnZXRPbkVuYWJsZVJvdXRpbmUoKS50b1N0cmVhbShvcyk7CisJfQorCisKKwlpZiggaGFzT25JRGlzYWJsZSgpICkKKwl7CisJCWdldE9uSURpc2FibGVSb3V0aW5lKCkudG9TdHJlYW0ob3MpOworCX0KKworCWlmKCBoYXNPbkRpc2FibGUoKSApCisJeworCQlnZXRPbkRpc2FibGVSb3V0aW5lKCkudG9TdHJlYW0ob3MpOworCX0KKworCisJaWYoIGhhc09uSUFib3J0KCkgKQorCXsKKwkJZ2V0T25JQWJvcnRSb3V0aW5lKCkudG9TdHJlYW0ob3MpOworCX0KKworCWlmKCBoYXNPbkFib3J0KCkgKQorCXsKKwkJZ2V0T25BYm9ydFJvdXRpbmUoKS50b1N0cmVhbShvcyk7CisJfQorCisKKwlpZiggaGFzT25JUnVuKCkgKQorCXsKKwkJZ2V0T25JUnVuUm91dGluZSgpLnRvU3RyZWFtKG9zKTsKKwl9CisKKwlpZiggaGFzT25SdW4oKSApCisJeworCQlnZXRPblJ1blJvdXRpbmUoKS50b1N0cmVhbShvcyk7CisJfQorCisKKwlpZiggaGFzT25SdGMoKSApCisJeworCQlnZXRPblJ0Y1JvdXRpbmUoKS50b1N0cmVhbShvcyk7CisJfQorCisKKwlpZiggaGFzT25Db25jdXJyZW5jeSgpICkKKwl7CisJCWdldE9uQ29uY3VycmVuY3lSb3V0aW5lKCkudG9TdHJlYW0ob3MpOworCX0KKworCWlmKCBoYXNPblNjaGVkdWxlKCkgKQorCXsKKwkJZ2V0T25TY2hlZHVsZVJvdXRpbmUoKS50b1N0cmVhbShvcyk7CisJfQorCisJaWYoIGhhc09uU3luY2hyb25pemUoKSApCisJeworCQlnZXRPblN5bmNocm9uaXplUm91dGluZSgpLnRvU3RyZWFtKG9zKTsKKwl9CisKKwlvcyA8PCBERUNSX0lOREVOVDsKK30KKworCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9CZWhhdmlvcmFsUGFydC5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL0JlaGF2aW9yYWxQYXJ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIyZDQ2YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9CZWhhdmlvcmFsUGFydC5oCkBAIC0wLDAgKzEsOTgyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjIgZsOpdnIuIDIwMTEKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBGTUxfSU5GUkFTVFJVQ1RVUkVfQkVIQVZJT1JBTFBBUlRfSF8KKyNkZWZpbmUgRk1MX0lORlJBU1RSVUNUVVJFX0JFSEFWSU9SQUxQQVJUX0hfCisKKyNpbmNsdWRlIDxmbWwvY29tbW9uL09iamVjdENsYXNzaWZpZXIuaD4KKyNpbmNsdWRlIDxmbWwvY29tbW9uL09iamVjdEVsZW1lbnQuaD4KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vQkZDb250YWluZXIuaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0F2bUNvZGUuaD4KKworI2luY2x1ZGUgPGZtbC9vcGVyYXRvci9PcGVyYXRvckxpYi5oPgorCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1JvdXRpbmUuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvVHJhbnNpdGlvbi5oPgorCisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1dPYmplY3QuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKK2NsYXNzIE1hY2hpbmU7CisKKworY2xhc3MgQmVoYXZpb3JhbFBhcnQgOiBwdWJsaWMgT2JqZWN0Q2xhc3NpZmllciAsCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggQmVoYXZpb3JhbFBhcnQgKQoreworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIEJlaGF2aW9yYWxQYXJ0ICkKKworcHVibGljOgorCS8qKgorCSAqIFRZUEVERUYKKwkgKi8KKwl0eXBlZGVmIFRhYmxlT2ZCRl9UPCBUcmFuc2l0aW9uID4gIFRhYmxlT2ZUcmFuc2l0aW9uOworCisJdHlwZWRlZiBUYWJsZU9mVHJhbnNpdGlvbjo6Y29uc3RfcmF3X2l0ZXJhdG9yICBjb25zdF90cmFuc2l0aW9uX2l0ZXJhdG9yOworCisKKwl0eXBlZGVmIFRhYmxlT2ZCRl9UPCBSb3V0aW5lID4gIFRhYmxlT2ZSb3V0aW5lOworCisJdHlwZWRlZiBUYWJsZU9mUm91dGluZTo6Y29uc3RfcmF3X2l0ZXJhdG9yICBjb25zdF9yb3V0aW5lX2l0ZXJhdG9yOworCisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBBVFRSSUJVVEVTCisJICovCisJVGFibGVPZlRyYW5zaXRpb24gbU91dGdvaW5nVHJhbnNpdGlvbnM7CisKKwlUYWJsZU9mVHJhbnNpdGlvbiBtSW5jb21pbmdUcmFuc2l0aW9uczsKKworCVJvdXRpbmUgb25DcmVhdGVSb3V0aW5lOworCisJUm91dGluZSBvbkluaXRSb3V0aW5lOworCVJvdXRpbmUgb25GaW5hbFJvdXRpbmU7CisKKwlSb3V0aW5lIG9uUmV0dXJuUm91dGluZTsKKworCVJvdXRpbmUgb25TdGFydFJvdXRpbmU7CisJUm91dGluZSBvblN0b3BSb3V0aW5lOworCisJUm91dGluZSBvbklFbmFibGVSb3V0aW5lOworCVJvdXRpbmUgb25FbmFibGVSb3V0aW5lOworCisJUm91dGluZSBvbklEaXNhYmxlUm91dGluZTsKKwlSb3V0aW5lIG9uRGlzYWJsZVJvdXRpbmU7CisKKwlSb3V0aW5lIG9uSUFib3J0Um91dGluZTsKKwlSb3V0aW5lIG9uQWJvcnRSb3V0aW5lOworCisJUm91dGluZSBvbklSdW5Sb3V0aW5lOworCVJvdXRpbmUgb25SdW5Sb3V0aW5lOworCVJvdXRpbmUgb25SdGNSb3V0aW5lOworCisJUm91dGluZSBvbkNvbmN1cnJlbmN5Um91dGluZTsKKwlSb3V0aW5lIG9uU2NoZWR1bGVSb3V0aW5lOworCisJUm91dGluZSBvblN5bmNocm9uaXplUm91dGluZTsKKworCisJVGFibGVPZlJvdXRpbmUgbVJvdXRpbmVzOworCisJVGFibGVPZlJvdXRpbmUgbUFub255bW91c0lubmVyUm91dGluZXM7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUJlaGF2aW9yYWxQYXJ0KE9iamVjdEVsZW1lbnQgKiBhQ29udGFpbmVyLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEID0gIm1vZSIpCisJOiBPYmplY3RDbGFzc2lmaWVyKCBDTEFTU19LSU5EX1QoIEJlaGF2aW9yYWxQYXJ0ICkgLCBhQ29udGFpbmVyICwgYU5hbWVJRCApLAorCW1PdXRnb2luZ1RyYW5zaXRpb25zKCApLAorCW1JbmNvbWluZ1RyYW5zaXRpb25zKCApLAorCisJb25DcmVhdGVSb3V0aW5lKCAqdGhpcyAsICJjcmVhdGUiICksCisJb25Jbml0Um91dGluZSggKnRoaXMgLCAiaW5pdCIgKSwKKwlvbkZpbmFsUm91dGluZSggKnRoaXMgLCAiZmluYWwiICksCisKKwlvblJldHVyblJvdXRpbmUoICp0aGlzICwgInJldHVybiIgKSwKKworCW9uU3RhcnRSb3V0aW5lKCAqdGhpcyAsICJzdGFydCIgKSwKKwlvblN0b3BSb3V0aW5lKCAqdGhpcyAsICJzdG9wIiApLAorCisJb25JRW5hYmxlUm91dGluZSggKnRoaXMgLCAiaWVuYWJsZSIgKSwKKwlvbkVuYWJsZVJvdXRpbmUoICp0aGlzICwgImVuYWJsZSIgKSwKKworCW9uSURpc2FibGVSb3V0aW5lKCAqdGhpcyAsICJpZGlzYWJsZSIgKSwKKwlvbkRpc2FibGVSb3V0aW5lKCAqdGhpcyAsICJkaXNhYmxlIiApLAorCisJb25JQWJvcnRSb3V0aW5lKCAqdGhpcyAsICJpYWJvcnQiICksCisJb25BYm9ydFJvdXRpbmUoICp0aGlzICwgImFib3J0IiApLAorCisJb25JUnVuUm91dGluZSggKnRoaXMgLCAiaXJ1biIgKSwKKwlvblJ1blJvdXRpbmUoICp0aGlzICwgInJ1biIgKSwKKwlvblJ0Y1JvdXRpbmUoICp0aGlzICwgInJ0YyIgKSwKKworCW9uQ29uY3VycmVuY3lSb3V0aW5lKCAqdGhpcyAsICJjb25jdXJyZW5jeSIgICksCisJb25TY2hlZHVsZVJvdXRpbmUoICp0aGlzICwgInNjaGVkdWxlIiApLAorCisJb25TeW5jaHJvbml6ZVJvdXRpbmUoICp0aGlzICwgInN5bmNocm9uaXplZCIgKSwKKworCW1Sb3V0aW5lcyggKSwKKwltQW5vbnltb3VzSW5uZXJSb3V0aW5lcyggKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkJlaGF2aW9yYWxQYXJ0KCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbU91dGdvaW5nVHJhbnNpdGlvbnMKKwkgKi8KKwlpbmxpbmUgY29uc3QgVGFibGVPZlRyYW5zaXRpb24gJiBnZXRPdXRnb2luZ1RyYW5zaXRpb25zKCkgY29uc3QKKwl7CisJCXJldHVybiggbU91dGdvaW5nVHJhbnNpdGlvbnMgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNPdXRnb2luZ1RyYW5zaXRpb24oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtT3V0Z29pbmdUcmFuc2l0aW9ucy5ub25lbXB0eSgpICk7CisJfQorCisJaW5saW5lIHZvaWQgYXBwZW5kT3V0Z29pbmdUcmFuc2l0aW9uKGNvbnN0IEJGICYgYVRyYW5zaXRpb24pCisJeworCQltT3V0Z29pbmdUcmFuc2l0aW9ucy5hcHBlbmQoIGFUcmFuc2l0aW9uICk7CisJfQorCisJaW5saW5lIHZvaWQgc2F2ZU91dGdvaW5nVHJhbnNpdGlvbihUcmFuc2l0aW9uICogYVRyYW5zaXRpb24pCisJeworCQltT3V0Z29pbmdUcmFuc2l0aW9ucy5hcHBlbmQoIEJGKGFUcmFuc2l0aW9uKSApOworCX0KKworCS8qKgorCSAqIFsgQ09OU1QgXSBJVEVSQVRPUgorCSAqLworCWlubGluZSBjb25zdF90cmFuc2l0aW9uX2l0ZXJhdG9yIG91dGdvaW5nX3RyYW5zaXRpb25fYmVnaW4oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtT3V0Z29pbmdUcmFuc2l0aW9ucy5iZWdpbigpICk7CisJfQorCisJaW5saW5lIGNvbnN0X3RyYW5zaXRpb25faXRlcmF0b3Igb3V0Z29pbmdfdHJhbnNpdGlvbl9lbmQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtT3V0Z29pbmdUcmFuc2l0aW9ucy5lbmQoKSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVRyYW5zaXRpb25zCisJICogQXR0ZW50aW9uICEgcGFzIGRlIFNtYXJ0UG9pbnRlciBwb3VyIGNldCBhdHRyaWJ1dAorCSAqIFByb2Jsw6htZSBkZSByw6lmw6lyZW5jZSBjaXJjdWxhaXJlIGF1IDw8IGRlbGV0ZSBhdmVjIGxlIG1vZGVsIEFSQyA+PgorCSAqLworCWlubGluZSBjb25zdCBUYWJsZU9mVHJhbnNpdGlvbiAmIGdldEluY29taW5nVHJhbnNpdGlvbnMoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtSW5jb21pbmdUcmFuc2l0aW9ucyApOworCX0KKworCWlubGluZSBib29sIGhhc0luY29taW5nVHJhbnNpdGlvbigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1JbmNvbWluZ1RyYW5zaXRpb25zLm5vbmVtcHR5KCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBhcHBlbmRJbmNvbWluZ1RyYW5zaXRpb24oY29uc3QgQkYgJiBhVHJhbnNpdGlvbikKKwl7CisJCW1JbmNvbWluZ1RyYW5zaXRpb25zLmFwcGVuZCggYVRyYW5zaXRpb24gKTsKKwl9CisKKworCS8qKgorCSAqIFsgQ09OU1QgXSBJVEVSQVRPUgorCSAqLworCWlubGluZSBjb25zdF90cmFuc2l0aW9uX2l0ZXJhdG9yIGluY29taW5nX3RyYW5zaXRpb25fYmVnaW4oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtSW5jb21pbmdUcmFuc2l0aW9ucy5iZWdpbigpICk7CisJfQorCisJaW5saW5lIGNvbnN0X3RyYW5zaXRpb25faXRlcmF0b3IgaW5jb21pbmdfdHJhbnNpdGlvbl9lbmQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtSW5jb21pbmdUcmFuc2l0aW9ucy5lbmQoKSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogb25DcmVhdGVSb3V0aW5lCisJICovCisJaW5saW5lIFJvdXRpbmUgJiBnZXRPbkNyZWF0ZVJvdXRpbmUoKQorCXsKKwkJcmV0dXJuKCBvbkNyZWF0ZVJvdXRpbmUgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgUm91dGluZSAmIGdldE9uQ3JlYXRlUm91dGluZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uQ3JlYXRlUm91dGluZSApOworCX0KKworCWlubGluZSBjb25zdCBCRkNvZGUgJiBnZXRPbkNyZWF0ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uQ3JlYXRlUm91dGluZS5nZXRDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNPbkNyZWF0ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uQ3JlYXRlUm91dGluZS5oYXNDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRPbkNyZWF0ZShjb25zdCBCRkNvZGUgJiBhQ29kZSkKKwl7CisJCW9uQ3JlYXRlUm91dGluZS5zZXRDb2RlKCBhQ29kZSApOworCX0KKworCWlubGluZSB2b2lkIHNlcU9uQ3JlYXRlKGNvbnN0IEJGQ29kZSAmIGFDb2RlKQorCXsKKwkJb25DcmVhdGVSb3V0aW5lLnNlcUNvZGUoIGFDb2RlICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBvbkluaXRSb3V0aW5lCisJICovCisJaW5saW5lIFJvdXRpbmUgJiBnZXRPbkluaXRSb3V0aW5lKCkKKwl7CisJCXJldHVybiggb25Jbml0Um91dGluZSApOworCX0KKworCWlubGluZSBjb25zdCBSb3V0aW5lICYgZ2V0T25Jbml0Um91dGluZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uSW5pdFJvdXRpbmUgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQkZDb2RlICYgZ2V0T25Jbml0KCkgY29uc3QKKwl7CisJCXJldHVybiggb25Jbml0Um91dGluZS5nZXRDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNPbkluaXQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBvbkluaXRSb3V0aW5lLmhhc0NvZGUoKSApOworCX0KKworCWlubGluZSB2b2lkIHNldE9uSW5pdChjb25zdCBCRkNvZGUgJiBhQ29kZSkKKwl7CisJCW9uSW5pdFJvdXRpbmUuc2V0Q29kZSggYUNvZGUgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXFPbkluaXQoY29uc3QgQkZDb2RlICYgYUNvZGUpCisJeworCQlvbkluaXRSb3V0aW5lLnNlcUNvZGUoIGFDb2RlICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBvbkZpbmFsUm91dGluZQorCSAqLworCWlubGluZSBSb3V0aW5lICYgZ2V0T25GaW5hbFJvdXRpbmUoKQorCXsKKwkJcmV0dXJuKCBvbkZpbmFsUm91dGluZSApOworCX0KKworCWlubGluZSBjb25zdCBSb3V0aW5lICYgZ2V0T25GaW5hbFJvdXRpbmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBvbkZpbmFsUm91dGluZSApOworCX0KKworCWlubGluZSBjb25zdCBCRkNvZGUgJiBnZXRPbkZpbmFsKCkgY29uc3QKKwl7CisJCXJldHVybiggb25GaW5hbFJvdXRpbmUuZ2V0Q29kZSgpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzT25GaW5hbCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uRmluYWxSb3V0aW5lLmhhc0NvZGUoKSApOworCX0KKworCWlubGluZSB2b2lkIHNldE9uRmluYWwoY29uc3QgQkZDb2RlICYgYUNvZGUpCisJeworCQlvbkZpbmFsUm91dGluZS5zZXRDb2RlKCBhQ29kZSApOworCX0KKworCWlubGluZSB2b2lkIHNlcU9uRmluYWwoY29uc3QgQkZDb2RlICYgYUNvZGUpCisJeworCQlvbkZpbmFsUm91dGluZS5zZXFDb2RlKCBhQ29kZSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogb25SZXR1cm5Sb3V0aW5lCisJICovCisJaW5saW5lIFJvdXRpbmUgJiBnZXRPblJldHVyblJvdXRpbmUoKQorCXsKKwkJcmV0dXJuKCBvblJldHVyblJvdXRpbmUgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgUm91dGluZSAmIGdldE9uUmV0dXJuUm91dGluZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uUmV0dXJuUm91dGluZSApOworCX0KKworCWlubGluZSBjb25zdCBCRkNvZGUgJiBnZXRPblJldHVybigpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uUmV0dXJuUm91dGluZS5nZXRDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNPblJldHVybigpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uUmV0dXJuUm91dGluZS5oYXNDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRPblJldHVybihjb25zdCBCRkNvZGUgJiBhQ29kZSkKKwl7CisJCW9uUmV0dXJuUm91dGluZS5zZXRDb2RlKCBhQ29kZSApOworCX0KKworCWlubGluZSB2b2lkIHNlcU9uUmV0dXJuKGNvbnN0IEJGQ29kZSAmIGFDb2RlKQorCXsKKwkJb25SZXR1cm5Sb3V0aW5lLnNlcUNvZGUoIGFDb2RlICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBvblN0YXJ0Um91dGluZQorCSAqLworCWlubGluZSBSb3V0aW5lICYgZ2V0T25TdGFydFJvdXRpbmUoKQorCXsKKwkJcmV0dXJuKCBvblN0YXJ0Um91dGluZSApOworCX0KKworCWlubGluZSBjb25zdCBSb3V0aW5lICYgZ2V0T25TdGFydFJvdXRpbmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBvblN0YXJ0Um91dGluZSApOworCX0KKworCWlubGluZSBjb25zdCBCRkNvZGUgJiBnZXRPblN0YXJ0KCkgY29uc3QKKwl7CisJCXJldHVybiggb25TdGFydFJvdXRpbmUuZ2V0Q29kZSgpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzT25TdGFydCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uU3RhcnRSb3V0aW5lLmhhc0NvZGUoKSApOworCX0KKworCWlubGluZSB2b2lkIHNldE9uU3RhcnQoY29uc3QgQkZDb2RlICYgYUNvZGUpCisJeworCQlvblN0YXJ0Um91dGluZS5zZXRDb2RlKCBhQ29kZSApOworCX0KKworCWlubGluZSB2b2lkIHNlcU9uU3RhcnQoY29uc3QgQkZDb2RlICYgYUNvZGUpCisJeworCQlvblN0YXJ0Um91dGluZS5zZXFDb2RlKCBhQ29kZSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogb25TdG9wUm91dGluZQorCSAqLworCWlubGluZSBSb3V0aW5lICYgZ2V0T25TdG9wUm91dGluZSgpCisJeworCQlyZXR1cm4oIG9uU3RvcFJvdXRpbmUgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgUm91dGluZSAmIGdldE9uU3RvcFJvdXRpbmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBvblN0b3BSb3V0aW5lICk7CisJfQorCisJaW5saW5lIGNvbnN0IEJGQ29kZSAmIGdldE9uU3RvcCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uU3RvcFJvdXRpbmUuZ2V0Q29kZSgpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzT25TdG9wKCkgY29uc3QKKwl7CisJCXJldHVybiggb25TdG9wUm91dGluZS5oYXNDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRPblN0b3AoY29uc3QgQkZDb2RlICYgYUNvZGUpCisJeworCQlvblN0b3BSb3V0aW5lLnNldENvZGUoIGFDb2RlICk7CisJfQorCisJaW5saW5lIHZvaWQgc2VxT25TdG9wKGNvbnN0IEJGQ29kZSAmIGFDb2RlKQorCXsKKwkJb25TdG9wUm91dGluZS5zZXFDb2RlKCBhQ29kZSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogb25FbmFibGVSb3V0aW5lCisJICovCisJaW5saW5lIFJvdXRpbmUgJiBnZXRPbkVuYWJsZVJvdXRpbmUoKQorCXsKKwkJcmV0dXJuKCBvbkVuYWJsZVJvdXRpbmUgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgUm91dGluZSAmIGdldE9uRW5hYmxlUm91dGluZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uRW5hYmxlUm91dGluZSApOworCX0KKworCWlubGluZSBjb25zdCBCRkNvZGUgJiBnZXRPbkVuYWJsZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uRW5hYmxlUm91dGluZS5nZXRDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNPbkVuYWJsZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uRW5hYmxlUm91dGluZS5oYXNDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRPbkVuYWJsZShjb25zdCBCRkNvZGUgJiBhQ29kZSkKKwl7CisJCW9uRW5hYmxlUm91dGluZS5zZXRDb2RlKCBhQ29kZSApOworCX0KKworCWlubGluZSB2b2lkIHNlcU9uRW5hYmxlKGNvbnN0IEJGQ29kZSAmIGFDb2RlKQorCXsKKwkJb25FbmFibGVSb3V0aW5lLnNlcUNvZGUoIGFDb2RlICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBvbklFbmFibGVSb3V0aW5lCisJICovCisJaW5saW5lIFJvdXRpbmUgJiBnZXRPbklFbmFibGVSb3V0aW5lKCkKKwl7CisJCXJldHVybiggb25JRW5hYmxlUm91dGluZSApOworCX0KKworCWlubGluZSBjb25zdCBSb3V0aW5lICYgZ2V0T25JRW5hYmxlUm91dGluZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uSUVuYWJsZVJvdXRpbmUgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQkZDb2RlICYgZ2V0T25JRW5hYmxlKCkgY29uc3QKKwl7CisJCXJldHVybiggb25JRW5hYmxlUm91dGluZS5nZXRDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNPbklFbmFibGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBvbklFbmFibGVSb3V0aW5lLmhhc0NvZGUoKSApOworCX0KKworCWlubGluZSB2b2lkIHNldE9uSUVuYWJsZShjb25zdCBCRkNvZGUgJiBhQ29kZSkKKwl7CisJCW9uSUVuYWJsZVJvdXRpbmUuc2V0Q29kZSggYUNvZGUgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXFPbklFbmFibGUoY29uc3QgQkZDb2RlICYgYUNvZGUpCisJeworCQlvbklFbmFibGVSb3V0aW5lLnNlcUNvZGUoIGFDb2RlICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBvbkRpc2FibGVSb3V0aW5lCisJICovCisJaW5saW5lIFJvdXRpbmUgJiBnZXRPbkRpc2FibGVSb3V0aW5lKCkKKwl7CisJCXJldHVybiggb25EaXNhYmxlUm91dGluZSApOworCX0KKworCWlubGluZSBjb25zdCBSb3V0aW5lICYgZ2V0T25EaXNhYmxlUm91dGluZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uRGlzYWJsZVJvdXRpbmUgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQkZDb2RlICYgZ2V0T25EaXNhYmxlKCkgY29uc3QKKwl7CisJCXJldHVybiggb25EaXNhYmxlUm91dGluZS5nZXRDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNPbkRpc2FibGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBvbkRpc2FibGVSb3V0aW5lLmhhc0NvZGUoKSApOworCX0KKworCWlubGluZSB2b2lkIHNldE9uRGlzYWJsZShjb25zdCBCRkNvZGUgJiBhQ29kZSkKKwl7CisJCW9uRGlzYWJsZVJvdXRpbmUuc2V0Q29kZSggYUNvZGUgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXFPbkRpc2FibGUoY29uc3QgQkZDb2RlICYgYUNvZGUpCisJeworCQlvbkRpc2FibGVSb3V0aW5lLnNlcUNvZGUoIGFDb2RlICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBvbklEaXNhYmxlUm91dGluZQorCSAqLworCWlubGluZSBSb3V0aW5lICYgZ2V0T25JRGlzYWJsZVJvdXRpbmUoKQorCXsKKwkJcmV0dXJuKCBvbklEaXNhYmxlUm91dGluZSApOworCX0KKworCWlubGluZSBjb25zdCBSb3V0aW5lICYgZ2V0T25JRGlzYWJsZVJvdXRpbmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBvbklEaXNhYmxlUm91dGluZSApOworCX0KKworCWlubGluZSBjb25zdCBCRkNvZGUgJiBnZXRPbklEaXNhYmxlKCkgY29uc3QKKwl7CisJCXJldHVybiggb25JRGlzYWJsZVJvdXRpbmUuZ2V0Q29kZSgpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzT25JRGlzYWJsZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uSURpc2FibGVSb3V0aW5lLmhhc0NvZGUoKSApOworCX0KKworCWlubGluZSB2b2lkIHNldE9uSURpc2FibGUoY29uc3QgQkZDb2RlICYgYUNvZGUpCisJeworCQlvbklEaXNhYmxlUm91dGluZS5zZXRDb2RlKCBhQ29kZSApOworCX0KKworCWlubGluZSB2b2lkIHNlcU9uSURpc2FibGUoY29uc3QgQkZDb2RlICYgYUNvZGUpCisJeworCQlvbklEaXNhYmxlUm91dGluZS5zZXFDb2RlKCBhQ29kZSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogb25BYm9ydFJvdXRpbmUKKwkgKi8KKwlpbmxpbmUgUm91dGluZSAmIGdldE9uQWJvcnRSb3V0aW5lKCkKKwl7CisJCXJldHVybiggb25BYm9ydFJvdXRpbmUgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgUm91dGluZSAmIGdldE9uQWJvcnRSb3V0aW5lKCkgY29uc3QKKwl7CisJCXJldHVybiggb25BYm9ydFJvdXRpbmUgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQkZDb2RlICYgZ2V0T25BYm9ydCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uQWJvcnRSb3V0aW5lLmdldENvZGUoKSApOworCX0KKworCWlubGluZSBib29sIGhhc09uQWJvcnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBvbkFib3J0Um91dGluZS5oYXNDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRPbkFib3J0KGNvbnN0IEJGQ29kZSAmIGFDb2RlKQorCXsKKwkJb25BYm9ydFJvdXRpbmUuc2V0Q29kZSggYUNvZGUgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXFPbkFib3J0KGNvbnN0IEJGQ29kZSAmIGFDb2RlKQorCXsKKwkJb25BYm9ydFJvdXRpbmUuc2VxQ29kZSggYUNvZGUgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG9uSUFib3J0Um91dGluZQorCSAqLworCWlubGluZSBSb3V0aW5lICYgZ2V0T25JQWJvcnRSb3V0aW5lKCkKKwl7CisJCXJldHVybiggb25JQWJvcnRSb3V0aW5lICk7CisJfQorCisJaW5saW5lIGNvbnN0IFJvdXRpbmUgJiBnZXRPbklBYm9ydFJvdXRpbmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBvbklBYm9ydFJvdXRpbmUgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQkZDb2RlICYgZ2V0T25JQWJvcnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBvbklBYm9ydFJvdXRpbmUuZ2V0Q29kZSgpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzT25JQWJvcnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBvbklBYm9ydFJvdXRpbmUuaGFzQ29kZSgpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0T25JQWJvcnQoY29uc3QgQkZDb2RlICYgYUNvZGUpCisJeworCQlvbklBYm9ydFJvdXRpbmUuc2V0Q29kZSggYUNvZGUgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXFPbklBYm9ydChjb25zdCBCRkNvZGUgJiBhQ29kZSkKKwl7CisJCW9uSUFib3J0Um91dGluZS5zZXFDb2RlKCBhQ29kZSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogb25JUnVuUm91dGluZQorCSAqLworCWlubGluZSBSb3V0aW5lICYgZ2V0T25JUnVuUm91dGluZSgpCisJeworCQlyZXR1cm4oIG9uSVJ1blJvdXRpbmUgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgUm91dGluZSAmIGdldE9uSVJ1blJvdXRpbmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBvbklSdW5Sb3V0aW5lICk7CisJfQorCisJaW5saW5lIGNvbnN0IEJGQ29kZSAmIGdldE9uSVJ1bigpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uSVJ1blJvdXRpbmUuZ2V0Q29kZSgpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzT25JUnVuKCkgY29uc3QKKwl7CisJCXJldHVybiggb25JUnVuUm91dGluZS5oYXNDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRPbklSdW4oY29uc3QgQkZDb2RlICYgYUNvZGUpCisJeworCQlvbklSdW5Sb3V0aW5lLnNldENvZGUoIGFDb2RlICk7CisJfQorCisJaW5saW5lIHZvaWQgc2VxT25JUnVuKGNvbnN0IEJGQ29kZSAmIGFDb2RlKQorCXsKKwkJb25JUnVuUm91dGluZS5zZXFDb2RlKCBhQ29kZSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogb25SdW5Sb3V0aW5lCisJICovCisJaW5saW5lIFJvdXRpbmUgJiBnZXRPblJ1blJvdXRpbmUoKQorCXsKKwkJcmV0dXJuKCBvblJ1blJvdXRpbmUgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgUm91dGluZSAmIGdldE9uUnVuUm91dGluZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uUnVuUm91dGluZSApOworCX0KKworCWlubGluZSBjb25zdCBCRkNvZGUgJiBnZXRPblJ1bigpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uUnVuUm91dGluZS5nZXRDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNPblJ1bigpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uUnVuUm91dGluZS5oYXNDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRPblJ1bihjb25zdCBCRkNvZGUgJiBhQ29kZSkKKwl7CisJCW9uUnVuUm91dGluZS5zZXRDb2RlKCBhQ29kZSApOworCX0KKworCWlubGluZSB2b2lkIHNlcU9uUnVuKGNvbnN0IEJGQ29kZSAmIGFDb2RlKQorCXsKKwkJb25SdW5Sb3V0aW5lLnNlcUNvZGUoIGFDb2RlICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBvblJ0Y1JvdXRpbmUKKwkgKi8KKwlpbmxpbmUgUm91dGluZSAmIGdldE9uUnRjUm91dGluZSgpCisJeworCQlyZXR1cm4oIG9uUnRjUm91dGluZSApOworCX0KKworCWlubGluZSBjb25zdCBSb3V0aW5lICYgZ2V0T25SdGNSb3V0aW5lKCkgY29uc3QKKwl7CisJCXJldHVybiggb25SdGNSb3V0aW5lICk7CisJfQorCisJaW5saW5lIGNvbnN0IEJGQ29kZSAmIGdldE9uUnRjKCkgY29uc3QKKwl7CisJCXJldHVybiggb25SdGNSb3V0aW5lLmdldENvZGUoKSApOworCX0KKworCWlubGluZSBib29sIGhhc09uUnRjKCkgY29uc3QKKwl7CisJCXJldHVybiggb25SdGNSb3V0aW5lLmhhc0NvZGUoKSApOworCX0KKworCWlubGluZSB2b2lkIHNldE9uUnRjKGNvbnN0IEJGQ29kZSAmIGFDb2RlKQorCXsKKwkJb25SdGNSb3V0aW5lLnNldENvZGUoIGFDb2RlICk7CisJfQorCisJaW5saW5lIHZvaWQgc2VxT25SdGMoY29uc3QgQkZDb2RlICYgYUNvZGUpCisJeworCQlvblJ0Y1JvdXRpbmUuc2VxQ29kZSggYUNvZGUgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIHRoZVNjaGVkdWxlCisJICovCisJaW5saW5lIFJvdXRpbmUgJiBnZXRPblNjaGVkdWxlUm91dGluZSgpCisJeworCQlyZXR1cm4oIG9uU2NoZWR1bGVSb3V0aW5lICk7CisJfQorCisJaW5saW5lIGNvbnN0IFJvdXRpbmUgJiBnZXRPblNjaGVkdWxlUm91dGluZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uU2NoZWR1bGVSb3V0aW5lICk7CisJfQorCisJaW5saW5lIGNvbnN0IEJGQ29kZSAmIGdldE9uU2NoZWR1bGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBvblNjaGVkdWxlUm91dGluZS5nZXRDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNPblNjaGVkdWxlKCkgY29uc3QKKwl7CisJCXJldHVybiggb25TY2hlZHVsZVJvdXRpbmUuaGFzQ29kZSgpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0T25TY2hlZHVsZShjb25zdCBCRkNvZGUgJiBhQ29kZSkKKwl7CisJCW9uU2NoZWR1bGVSb3V0aW5lLnNldENvZGUoIGFDb2RlICk7CisJfQorCisJaW5saW5lIHZvaWQgc2VxT25TY2hlZHVsZShjb25zdCBCRkNvZGUgJiBhQ29kZSkKKwl7CisJCW9uU2NoZWR1bGVSb3V0aW5lLnNlcUNvZGUoIGFDb2RlICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiB0aGVDb25jdXJyZW5jeQorCSAqLworCWlubGluZSBSb3V0aW5lICYgZ2V0T25Db25jdXJyZW5jeVJvdXRpbmUoKQorCXsKKwkJcmV0dXJuKCBvbkNvbmN1cnJlbmN5Um91dGluZSApOworCX0KKworCWlubGluZSBjb25zdCBSb3V0aW5lICYgZ2V0T25Db25jdXJyZW5jeVJvdXRpbmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBvbkNvbmN1cnJlbmN5Um91dGluZSApOworCX0KKworCWlubGluZSBjb25zdCBCRkNvZGUgJiBnZXRPbkNvbmN1cnJlbmN5KCkgY29uc3QKKwl7CisJCXJldHVybiggb25Db25jdXJyZW5jeVJvdXRpbmUuZ2V0Q29kZSgpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzT25Db25jdXJyZW5jeSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uQ29uY3VycmVuY3lSb3V0aW5lLmhhc0NvZGUoKSApOworCX0KKworCWlubGluZSB2b2lkIHNldE9uQ29uY3VycmVuY3koY29uc3QgQkZDb2RlICYgYUNvZGUpCisJeworCQlvbkNvbmN1cnJlbmN5Um91dGluZS5zZXRDb2RlKCBhQ29kZSApOworCX0KKworCWlubGluZSB2b2lkIHNlcU9uQ29uY3VycmVuY3koY29uc3QgQkZDb2RlICYgYUNvZGUpCisJeworCQlvbkNvbmN1cnJlbmN5Um91dGluZS5zZXFDb2RlKCBhQ29kZSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogdGhlU3luY2hyb25pemUKKwkgKi8KKwlpbmxpbmUgUm91dGluZSAmIGdldE9uU3luY2hyb25pemVSb3V0aW5lKCkKKwl7CisJCXJldHVybiggb25TeW5jaHJvbml6ZVJvdXRpbmUgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgUm91dGluZSAmIGdldE9uU3luY2hyb25pemVSb3V0aW5lKCkgY29uc3QKKwl7CisJCXJldHVybiggb25TeW5jaHJvbml6ZVJvdXRpbmUgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQkZDb2RlICYgZ2V0T25TeW5jaHJvbml6ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG9uU3luY2hyb25pemVSb3V0aW5lLmdldENvZGUoKSApOworCX0KKworCWlubGluZSBib29sIGhhc09uU3luY2hyb25pemUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBvblN5bmNocm9uaXplUm91dGluZS5oYXNDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRPblN5bmNocm9uaXplKGNvbnN0IEJGQ29kZSAmIGFDb2RlKQorCXsKKwkJb25TeW5jaHJvbml6ZVJvdXRpbmUuc2V0Q29kZSggYUNvZGUgKTsKKwl9CisKKworCS8qKgorCSAqIFVUSUwKKwkgKi8KKwlSb3V0aW5lICYgZ2V0QWN0aXZpdHkoQVZNX09QQ09ERSBvcGNvZGVBY3Rpdml0eSk7CisKKwljb25zdCBSb3V0aW5lICYgZ2V0QWN0aXZpdHkoQVZNX09QQ09ERSBvcGNvZGVBY3Rpdml0eSkgY29uc3Q7CisKKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogVXNlciBSb3V0aW5lcworCSAqLworCWlubGluZSB2b2lkIGFwcGVuZFJvdXRpbmUoY29uc3QgQkYgJiByb3V0aW5lKQorCXsKKwkJbVJvdXRpbmVzLmFwcGVuZChyb3V0aW5lKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzYXZlUm91dGluZShSb3V0aW5lICogcm91dGluZSkKKwl7CisJCW1Sb3V0aW5lcy5hcHBlbmQoIEJGKHJvdXRpbmUpICk7CisJfQorCisJUm91dGluZSAqIHJhd1JvdXRpbmVCeU5hbWVJRChjb25zdCBzdGQ6OnN0cmluZyAmIGlkKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUm91dGluZXMucmF3QnlOYW1lSUQoaWQpICk7CisJfQorCisJY29uc3QgVGFibGVPZlJvdXRpbmUgJiBnZXRSb3V0aW5lcygpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Sb3V0aW5lcyApOworCX0KKworCisJaW5saW5lIGJvb2wgaGFzUm91dGluZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Sb3V0aW5lcy5ub25lbXB0eSgpICk7CisJfQorCisKKwkvKioKKwkgKiBbIENPTlNUIF0gSVRFUkFUT1IKKwkgKi8KKwlpbmxpbmUgY29uc3Rfcm91dGluZV9pdGVyYXRvciByb3V0aW5lX2JlZ2luKCkgY29uc3QKKwl7CisJCXJldHVybiggbVJvdXRpbmVzLmJlZ2luKCkgKTsKKwl9CisKKwlpbmxpbmUgY29uc3Rfcm91dGluZV9pdGVyYXRvciByb3V0aW5lX2VuZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Sb3V0aW5lcy5lbmQoKSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUFub255bW91c0lubmVyUm91dGluZXMKKwkgKiBsaWtlIDw8IHZhcmlhYmxlOjpvbl93cml0ZSA+PiBvciA8PCB0eXBlOjpjb25zdHJhaW50ID4+IHJvdXRpbmVzCisJICovCisJaW5saW5lIHZvaWQgc2F2ZUFub255bW91c0lubmVyUm91dGluZShSb3V0aW5lICogcm91dGluZSkKKwl7CisJCW1Bbm9ueW1vdXNJbm5lclJvdXRpbmVzLmFwcGVuZCggQkYocm91dGluZSkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNBbm9ueW1vdXNJbm5lclJvdXRpbmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQW5vbnltb3VzSW5uZXJSb3V0aW5lcy5ub25lbXB0eSgpICk7CisJfQorCisJLyoqCisJICogVEVTVEVSCisJICogbVJvdXRpbmVzCisJICogbUF1dG9tYXRpY1JvdXRpbmVzCisJICovCisJaW5saW5lIGJvb2wgaGFzQW55Um91dGluZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Sb3V0aW5lcy5ub25lbXB0eSgpIHx8IG1Bbm9ueW1vdXNJbm5lclJvdXRpbmVzLm5vbmVtcHR5KCkgKTsKKwl9CisKKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwl2aXJ0dWFsIHZvaWQgc3RySGVhZGVyKE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJb3MgPDwgIm1vZToiOworCX0KKworCisJdm9pZCB0b1N0cmVhbVJvdXRpbmUoT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCisJdm9pZCB0b1N0cmVhbUFub255bW91c0lubmVyUm91dGluZShPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKKwlpbmxpbmUgdm9pZCB0b1N0cmVhbUFueVJvdXRpbmUoT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQlpZiggbUFub255bW91c0lubmVyUm91dGluZXMubm9uZW1wdHkoKSApCisJCXsKKwkJCXRvU3RyZWFtQW5vbnltb3VzSW5uZXJSb3V0aW5lKG9zKTsKKwkJfQorCisJCWlmKCBtUm91dGluZXMubm9uZW1wdHkoKSApCisJCXsKKwkJCXRvU3RyZWFtUm91dGluZSggb3MgKTsKKwkJfQorCX0KKworCXZvaWQgdG9TdHJlYW1Nb2UoT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCisJaW5saW5lIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQlpZiggbUFub255bW91c0lubmVyUm91dGluZXMubm9uZW1wdHkoKSApCisJCXsKKwkJCXRvU3RyZWFtQW5vbnltb3VzSW5uZXJSb3V0aW5lKG9zKTsKKwkJfQorCisJCWlmKCBtUm91dGluZXMubm9uZW1wdHkoKSApCisJCXsKKwkJCXRvU3RyZWFtUm91dGluZSggb3MgKTsKKwkJfQorCisJCXRvU3RyZWFtTW9lKG9zKTsKKwl9CisKK307CisKKworfQorCisjZW5kaWYgLyogRk1MX0lORlJBU1RSVUNUVVJFX0JFSEFWSU9SQUxQQVJUX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvaW5mcmFzdHJ1Y3R1cmUvQnVmZmVyLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9CdWZmZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3M2M1ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvaW5mcmFzdHJ1Y3R1cmUvQnVmZmVyLmNwcApAQCAtMCwwICsxLDIzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDE4IGbDqXZyLiAyMDExCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJCdWZmZXIuaCIKKworI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9NYWNoaW5lLmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1Byb3BlcnR5UGFydC5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworc3RkOjpzdHJpbmcgQnVmZmVyOjpBTk9OWU1fSUQgPSAiXyNidWZmZXIiOworCisKKy8qKgorICogQ09OU1RSVUNUT1IKKyAqIERlZmF1bHQKKyAqLworQnVmZmVyOjpCdWZmZXIoTWFjaGluZSAqIGFDb250YWluZXIsIGNvbnN0IHN0ZDo6c3RyaW5nICYgaWQsCisJCWF2bV90eXBlX3NwZWNpZmllcl9raW5kX3QgYVNwZWNpZmllcktpbmQsIGludCBhU2l6ZSkKKzogUHJvcGVydHlFbGVtZW50KENMQVNTX0tJTkRfVCggQnVmZmVyICksIGFDb250YWluZXIsIGlkKSwKK21Qb2xpY3lTcGVjaWZpZXJLaW5kKCBhU3BlY2lmaWVyS2luZCApLAorbVNpemUoIGFTaXplICksCittTWVzc2FnZSggKQoreworCS8vISEgTk9USElORworfQorCitCdWZmZXI6OkJ1ZmZlcihjb25zdCBQcm9wZXJ0eVBhcnQgJiBhUHJvcGVydHlQYXJ0LCBjb25zdCBzdGQ6OnN0cmluZyAmIGlkLAorCQlhdm1fdHlwZV9zcGVjaWZpZXJfa2luZF90IGFTcGVjaWZpZXJLaW5kLCBpbnQgYVNpemUpCis6IFByb3BlcnR5RWxlbWVudChDTEFTU19LSU5EX1QoIEJ1ZmZlciApLCBhUHJvcGVydHlQYXJ0LmdldENvbnRhaW5lcigpLCBpZCksCittUG9saWN5U3BlY2lmaWVyS2luZCggYVNwZWNpZmllcktpbmQgKSwKK21TaXplKCBhU2l6ZSApLAorbU1lc3NhZ2UoICkKK3sKKwkvLyEhIE5PVEhJTkcKK30KKworCisvKioKKyAqIFNlcmlhbGl6YXRpb24KKyAqLworc3RkOjpzdHJpbmcgQnVmZmVyOjpzdHIoYXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCBhU3BlY2lmaWVyS2luZCkKK3sKKwlzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisKKwlzd2l0Y2goIGFTcGVjaWZpZXJLaW5kICkKKwl7CisJCWNhc2UgVFlQRV9GSUZPX1NQRUNJRklFUjoKKwkJeworCQkJb3MgPDwgImZpZm8iOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBUWVBFX0xJRk9fU1BFQ0lGSUVSOgorCQl7CisJCQlvcyA8PCAibGlmbyI7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgVFlQRV9NVUxUSV9GSUZPX1NQRUNJRklFUjoKKwkJeworCQkJb3MgPDwgIm11bHRpZmlmbyI7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFRZUEVfTVVMVElfTElGT19TUEVDSUZJRVI6CisJCXsKKwkJCW9zIDw8ICJtdWx0aWxpZm8iOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFRZUEVfTVVMVElTRVRfU1BFQ0lGSUVSOgorCQl7CisJCQlvcyA8PCAibXVsdGlzZXQiOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFRZUEVfU0VUX1NQRUNJRklFUjoKKwkJeworCQkJb3MgPDwgInNldCI7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgVFlQRV9SQU1fU1BFQ0lGSUVSOgorCQl7CisJCQlvcyA8PCAicmFtIjsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBUWVBFX1VOREVGSU5FRF9TUEVDSUZJRVI6CisJCXsKKwkJCW9zIDw8ICJ1bmRlZmluZWQ8YnVmZmVyI2tpbmQ+IjsKKwkJCWJyZWFrOworCQl9CisJCWRlZmF1bHQ6CisJCXsKKwkJCW9zIDw8ICJ1bmtub3duPGJ1ZmZlciNraW5kPiI7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiggb3Muc3RyKCkgKTsKK30KKworCitzdGQ6OnN0cmluZyBCdWZmZXI6OnN0cihhdm1fdHlwZV9zcGVjaWZpZXJfa2luZF90IGFTcGVjaWZpZXJLaW5kLCBsb25nIGFTaXplKQoreworCXN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKwlzd2l0Y2goIGFTcGVjaWZpZXJLaW5kICkKKwl7CisJCWNhc2UgVFlQRV9GSUZPX1NQRUNJRklFUjoKKwkJeworCQkJb3MgPDwgImZpZm88IjsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgVFlQRV9MSUZPX1NQRUNJRklFUjoKKwkJeworCQkJb3MgPDwgImxpZm88IjsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBUWVBFX01VTFRJX0ZJRk9fU1BFQ0lGSUVSOgorCQl7CisJCQlvcyA8PCAibXVsdGlmaWZvPCI7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFRZUEVfTVVMVElfTElGT19TUEVDSUZJRVI6CisJCXsKKwkJCW9zIDw8ICJtdWx0aWxpZm88IjsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBUWVBFX01VTFRJU0VUX1NQRUNJRklFUjoKKwkJeworCQkJb3MgPDwgIm11bHRpc2V0PCI7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgVFlQRV9TRVRfU1BFQ0lGSUVSOgorCQl7CisJCQlvcyA8PCAic2V0PCI7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgVFlQRV9SQU1fU1BFQ0lGSUVSOgorCQl7CisJCQlvcyA8PCAicmFtIjsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBUWVBFX1VOREVGSU5FRF9TUEVDSUZJRVI6CisJCXsKKwkJCW9zIDw8ICJ1bmRlZmluZWQ8YnVmZmVyI2tpbmQgLCAiOworCQkJYnJlYWs7CisJCX0KKwkJZGVmYXVsdDoKKwkJeworCQkJb3MgPDwgInVua25vd248YnVmZmVyI2tpbmQgLCAiOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiggYVNwZWNpZmllcktpbmQgIT0gVFlQRV9SQU1fU1BFQ0lGSUVSICkKKwl7CisJCWlmKCBhU2l6ZSA+IDAgKQorCQl7CisJCQlvcyA8PCBhU2l6ZSA8PCAiPiI7CisJCX0KKwkJZWxzZQorCQl7CisJCQlvcyA8PCAiKj4iOworCQl9CisJfQorCisJcmV0dXJuKCBvcy5zdHIoKSApOworfQorCisKK3ZvaWQgQnVmZmVyOjpzdHJNZXNzYWdlKE91dFN0cmVhbSAmIG9zKSBjb25zdAoreworCWlmKCBtTWVzc2FnZS5ub25lbXB0eSgpICkKKwl7CisJCUJGTGlzdDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtTWVzc2FnZS5iZWdpbigpOworCQlCRkxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gbU1lc3NhZ2UuZW5kKCk7CisKKwkJb3MgPDwgIlsgIiA8PCAoKml0KS5zdHIoKTsKKwkJZm9yKCArK2l0IDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJeworCQkJb3MgPDwgIiAsICIgPDwgKCppdCkuc3RyKCk7CisJCX0KKwkJb3MgPDwgIiBdIjsKKwl9Cit9CisKKwordm9pZCBCdWZmZXI6OnN0ckhlYWRlcihPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlvcyA8PCBnZXRNb2RpZmllcigpLnRvU3RyaW5nKCkgPDwgImJ1ZmZlciAiCisJCQk8PCBCdWZmZXI6OnN0cihtUG9saWN5U3BlY2lmaWVyS2luZCwgbVNpemUpCisJCQk8PCAiICIgPDwgZ2V0TmFtZUlEKCkgOworCisJc3RyTWVzc2FnZSggb3MgKTsKK30KKworCit2b2lkIEJ1ZmZlcjo6dG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJb3MgPDwgVEFCIDw8IGdldE1vZGlmaWVyKCkudG9TdHJpbmcoKSA8PCAiYnVmZmVyICIKKwkJCTw8IEJ1ZmZlcjo6c3RyKG1Qb2xpY3lTcGVjaWZpZXJLaW5kLCBtU2l6ZSkKKwkJCTw8ICIgIiA8PCBnZXROYW1lSUQoKTsKKworCXN0ck1lc3NhZ2UoIG9zICk7CisKKwlvcyA8PCAiOyIgPDwgRU9MX0ZMVVNIOworfQorCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9CdWZmZXIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9CdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzEzMjE5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL0J1ZmZlci5oCkBAIC0wLDAgKzEsMTU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTggZsOpdnIuIDIwMTEKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBCVUZGRVJfSF8KKyNkZWZpbmUgQlVGRkVSX0hfCisKKyNpbmNsdWRlIDxmbWwvY29tbW9uL1Byb3BlcnR5RWxlbWVudC5oPgorCisjaW5jbHVkZSA8Y29sbGVjdGlvbi9CRkNvbnRhaW5lci5oPgorCisjaW5jbHVkZSA8Zm1sL2xpYi9JVHlwZVNwZWNpZmllci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworY2xhc3MgQkY7CitjbGFzcyBPYmplY3RFbGVtZW50OworY2xhc3MgUHJvcGVydHlQYXJ0OworCisKK2NsYXNzIEJ1ZmZlciA6IHB1YmxpYyBQcm9wZXJ0eUVsZW1lbnQgLAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIEJ1ZmZlciApCit7CisKKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggQnVmZmVyICkKKworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQVRUUklCVVRFUworCSAqLworCWF2bV90eXBlX3NwZWNpZmllcl9raW5kX3QgbVBvbGljeVNwZWNpZmllcktpbmQ7CisKKwlpbnQgbVNpemU7CisKKwlCRkxpc3QgbU1lc3NhZ2U7CisKKworcHVibGljOgorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQnVmZmVyKE1hY2hpbmUgKiBhQ29udGFpbmVyLCBjb25zdCBzdGQ6OnN0cmluZyAmIGlkLAorCQkJYXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCBhU3BlY2lmaWVyS2luZCwgaW50IGFTaXplKTsKKworCUJ1ZmZlcihjb25zdCBQcm9wZXJ0eVBhcnQgJiBhUHJvcGVydHlQYXJ0LCBjb25zdCBzdGQ6OnN0cmluZyAmIGlkLAorCQkJYXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCBhU3BlY2lmaWVyS2luZCwgaW50IGFTaXplKTsKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5CdWZmZXIoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtUG9saWN5U3BlY2lmaWVyS2luZAorCSAqLworCWlubGluZSBhdm1fdHlwZV9zcGVjaWZpZXJfa2luZF90IGdldFBvbGljeVNwZWNpZmllcktpbmQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUG9saWN5U3BlY2lmaWVyS2luZCApOworCX0KKworCWlubGluZSB2b2lkIHNldFBvbGljeVNwZWNpZmllcktpbmQoYXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCBhU3BlY2lmaWVyS2luZCkKKwl7CisJCW1Qb2xpY3lTcGVjaWZpZXJLaW5kID0gYVNwZWNpZmllcktpbmQ7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtU2l6ZQorCSAqLworCWlubGluZSBhdm1fc2l6ZV90IGdldENhcGFjaXR5KCkgY29uc3QKKwl7CisJCXJldHVybiggKCBtU2l6ZSA8IDAgKSA/ICBBVk1fTlVNRVJJQ19NQVhfU0laRV9UIDogbVNpemUgKTsKKwl9CisKKwlpbmxpbmUgaW50IGdldFNpemUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtU2l6ZSApOworCX0KKworCWlubGluZSB2b2lkIHNldFNpemUoaW50IGFTaXplKQorCXsKKwkJbVNpemUgPSBhU2l6ZTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1NZXNzYWdlCisJICovCisJaW5saW5lIEJGTGlzdCAmIGdldE1lc3NhZ2VzKCkKKwl7CisJCXJldHVybiggbU1lc3NhZ2UgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNNZXNzYWdlKCkgY29uc3QKKwl7CisJCXJldHVybiggbU1lc3NhZ2Uubm9uZW1wdHkoKSApOworCX0KKworCWlubGluZSB2b2lkIGFwcGVuZE1lc3NhZ2UoY29uc3QgQkYgJiBhUGFyYW1ldGVyKQorCXsKKwkJbU1lc3NhZ2UuYXBwZW5kKCBhUGFyYW1ldGVyICk7CisJfQorCisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJc3RhdGljIHN0ZDo6c3RyaW5nIHN0cihhdm1fdHlwZV9zcGVjaWZpZXJfa2luZF90IGFTcGVjaWZpZXJLaW5kKTsKKwlzdGF0aWMgc3RkOjpzdHJpbmcgc3RyKGF2bV90eXBlX3NwZWNpZmllcl9raW5kX3QgYVNwZWNpZmllcktpbmQsIGxvbmcgYVNpemUpOworCisJdm9pZCBzdHJNZXNzYWdlKE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworCXZvaWQgc3RySGVhZGVyKE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworCXZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCisKK3B1YmxpYzoKKworCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlzdGF0aWMgc3RkOjpzdHJpbmcgQU5PTllNX0lEOworCisJaW5saW5lIGJvb2wgaXNBbm9ueW1JRCgpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldE5hbWVJRCgpLmVtcHR5KCkgfHwgKGdldE5hbWVJRCgpLmZpbmQoQU5PTllNX0lEKSA9PSAwKSApOworCX0KKworfTsKKworCit9CisKKyNlbmRpZiAvKiBCVUZGRVJfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9DaGFubmVsLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9DaGFubmVsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjAwMDZmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL0NoYW5uZWwuY3BwCkBAIC0wLDAgKzEsMTIzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjYgZsOpdnIuIDIwMTEKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkNoYW5uZWwuaCIKKworI2luY2x1ZGUgPHV0aWwvYXZtX2Fzc2VydC5oPgorCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL01hY2hpbmUuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvUG9ydC5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Qcm9wZXJ0eVBhcnQuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKy8qKgorICogQ09OU1RSVUNUT1IKKyAqIERlZmF1bHQKKyAqLworQ2hhbm5lbDo6Q2hhbm5lbChjb25zdCBQcm9wZXJ0eVBhcnQgJiBhUHJvcGVydHlQYXJ0LAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsIGNvbnN0IE1vZGlmaWVyICYgYU1vZGlmaWVyKQorOiBQcm9wZXJ0eUVsZW1lbnQoQ0xBU1NfS0lORF9UKCBDaGFubmVsICksCisJCWFQcm9wZXJ0eVBhcnQuZ2V0Q29udGFpbmVyKCksIGFNb2RpZmllciwgYU5hbWVJRCksCitDb21Qcm90b2NvbCggUFJPVE9DT0xfVU5ERUZJTkVEX0tJTkQgLCBJQ29tUG9pbnQ6OklPX0NIQU5ORUxfTkFUVVJFICksCittQ29udGVudHMoIG5ldyBQcm9wZXJ0eVBhcnQodGhpcywgImNvbnRlbnRzIikgKQoreworCS8vISEgTk9USElORworfQorCisKKworLyoqCisgKiBHRVRURVIKKyAqIHRoZSBjb250YWluZXIKKyAqLworTWFjaGluZSAqIENoYW5uZWw6OmdldENvbnRhaW5lck1hY2hpbmUoKSBjb25zdAoreworCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggZ2V0Q29udGFpbmVyKCktPmlzPCBNYWNoaW5lID4oKSApCisJCQk8PCAiSW52YWxpZCA8PCBDaGFubmVsIENvbnRhaW5lciA+PiBUeXBlIDwiCisJCQk8PCBnZXRDb250YWluZXIoKS0+Y2xhc3NLaW5kTmFtZSgpIDw8ICI+IENhc3QgISEhIgorCQkJPDwgU0VORF9FWElUOworCisJcmV0dXJuKCBnZXRDb250YWluZXIoKS0+dG88IE1hY2hpbmUgPigpICk7Cit9CisKKworLyoqCisgKiBHRVRURVIKKyAqIG1Db250ZW50cworICovCitib29sIENoYW5uZWw6Omhhc0NvbnRlbnRzKCkgY29uc3QKK3sKKwlyZXR1cm4oIChtQ29udGVudHMgIT0gTlVMTCkgJiYgbUNvbnRlbnRzLT5ub25lbXB0eSgpICk7Cit9CisKKy8qKgorICogR0VUVEVSIC0gU0VUVEVSCisgKiBtQ29udGVudHMKKyAqIFNpZ25hbHMKKyAqLwordm9pZCBDaGFubmVsOjphcHBlbmRTaWduYWwoY29uc3QgTW9kaWZpZXIgJiBhTW9kaWZpZXIsIGNvbnN0IEJGICYgYVNpZ25hbCkKK3sKKwltQ29udGVudHMtPmFwcGVuZFNpZ25hbCggQkYoIG5ldyBTaWduYWwodGhpcywgYU1vZGlmaWVyLCBhU2lnbmFsKSApICk7Cit9CisKK0JGIENoYW5uZWw6OmdldFNpZ25hbChNb2RpZmllcjo6RElSRUNUSU9OX0tJTkQgaW9EaXJlY3Rpb24sIGNvbnN0IEJGICYgYVNpZ25hbCkKK3sKKwlQcm9wZXJ0eVBhcnQ6OlRhYmxlT2ZTaWduYWw6OmNvbnN0X3Jhd19pdGVyYXRvciBpdFNpZ25hbCA9CisJCQltQ29udGVudHMtPmdldFNpZ25hbHMoKS5iZWdpbigpOworCVByb3BlcnR5UGFydDo6VGFibGVPZlNpZ25hbDo6Y29uc3RfcmF3X2l0ZXJhdG9yIGVuZFNpZ25hbCA9CisJCQltQ29udGVudHMtPmdldFNpZ25hbHMoKS5lbmQoKTsKKwlmb3IoIDsgaXRTaWduYWwgIT0gZW5kU2lnbmFsIDsgKytpdFNpZ25hbCApCisJeworCQlpZiggKGFTaWduYWwgPT0gKGl0U2lnbmFsKS0+Z2V0U2lnbmFsTW9kZWwoKSkKKwkJCSYmIChpdFNpZ25hbCktPmdldE1vZGlmaWVyKCkuaXNEaXJlY3Rpb25LaW5kKGlvRGlyZWN0aW9uKSApCisJCXsKKwkJCXJldHVybiggKml0U2lnbmFsICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworfQorCisKKy8qKgorICogU2VyaWFsaXphdGlvbgorICovCit2b2lkIENoYW5uZWw6OnRvU3RyZWFtKE91dFN0cmVhbSAmIG91dCkgY29uc3QKK3sKKwlvdXQgPDwgVEFCIDw8IGdldE1vZGlmaWVyKCkudG9TdHJpbmcoTW9kaWZpZXI6OkRJU0FCTEVfRElSRUNUSU9OX0ZJRUxEKQorCQk8PCAiY2hhbm5lbCI7CisKKwl0b1N0cmVhbVByb3RvY29sQ2FzdCggb3V0ICwgZmFsc2UgKTsKKworCWlmKCBub3QgZ2V0TW9kaWZpZXIoKS5pc0RpcmVjdGlvbklub3V0KCkgKQorCXsKKwkJb3V0IDw8ICIgIiA8PCBnZXRNb2RpZmllcigpLnN0ckRpcmVjdGlvbigpOworCX0KKworCW91dCA8PCAiICIgPDwgZ2V0TmFtZUlEKCkgPDwgIiB7IiA8PCBFT0w7CisKKwlpZiggaGFzQ29udGVudHMoKSApCisJeworCQlnZXRDb250ZW50cygpLT50b1N0cmVhbShvdXQpOworCX0KKworCW91dCA8PCBUQUIgPDwgIn0iIDw8IEVPTF9GTFVTSDsKK30KKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9DaGFubmVsLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvaW5mcmFzdHJ1Y3R1cmUvQ2hhbm5lbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MTcyNTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvaW5mcmFzdHJ1Y3R1cmUvQ2hhbm5lbC5oCkBAIC0wLDAgKzEsMTE3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjYgZsOpdnIuIDIwMTEKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBDSEFOTkVMX0hfCisjZGVmaW5lIENIQU5ORUxfSF8KKworI2luY2x1ZGUgPGZtbC9jb21tb24vUHJvcGVydHlFbGVtZW50Lmg+CisKKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvQ29tUHJvdG9jb2wuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKK2NsYXNzIEJGOworY2xhc3MgTWFjaGluZTsKK2NsYXNzIE1vZGlmaWVyOworY2xhc3MgT2JqZWN0RWxlbWVudDsKK2NsYXNzIFByb3BlcnR5UGFydDsKKworCitjbGFzcyBDaGFubmVsIDoKKwkJcHVibGljIFByb3BlcnR5RWxlbWVudCwKKwkJcHVibGljIENvbVByb3RvY29sLAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIENoYW5uZWwgKQoreworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIENoYW5uZWwgKQorCisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBBVFRSSUJVVEVTCisJICovCisJUHJvcGVydHlQYXJ0ICogbUNvbnRlbnRzOworCitwdWJsaWM6CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlDaGFubmVsKGNvbnN0IFByb3BlcnR5UGFydCAmIGFQcm9wZXJ0eVBhcnQsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwKKwkJCWNvbnN0IE1vZGlmaWVyICYgYU1vZGlmaWVyID0gTW9kaWZpZXI6OlBST1BFUlRZX0lOT1VUX0RJUkVDVElPTik7CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5DaGFubmVsKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogR0VUVEVSCisJICogdGhlIGNvbnRhaW5lcgorCSAqLworCXZpcnR1YWwgTWFjaGluZSAqIGdldENvbnRhaW5lck1hY2hpbmUoKSBjb25zdCA7CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1Db250ZW50cworCSAqLworCWlubGluZSBQcm9wZXJ0eVBhcnQgKiBnZXRDb250ZW50cygpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Db250ZW50cyApOworCX0KKworCWJvb2wgaGFzQ29udGVudHMoKSBjb25zdDsKKworCWlubGluZSB2b2lkIHNldENvbnRlbnRzKFByb3BlcnR5UGFydCAqIGFDb250ZW50cykKKwl7CisJCW1Db250ZW50cyA9IGFDb250ZW50czsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1Db250ZW50cworCSAqIFNpZ25hbHMKKwkgKi8KKwl2b2lkIGFwcGVuZFNpZ25hbChjb25zdCBNb2RpZmllciAmIGFNb2RpZmllciwgY29uc3QgQkYgJiBhU2lnbmFsKTsKKworCUJGIGdldFNpZ25hbChNb2RpZmllcjo6RElSRUNUSU9OX0tJTkQgaW9EaXJlY3Rpb24sIGNvbnN0IEJGICYgYVNpZ25hbCk7CisKKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwl2b2lkIHN0ckhlYWRlcihPdXRTdHJlYW0gJiBvdXQpIGNvbnN0CisJeworCQlvdXQgPDwgc3RyX2luZGVudCggdGhpcyApOworCX0KKworCXZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3V0KSBjb25zdDsKKworfTsKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qIENIQU5ORUxfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9Db21Qb2ludC5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvaW5mcmFzdHJ1Y3R1cmUvQ29tUG9pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZTQ3NzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvaW5mcmFzdHJ1Y3R1cmUvQ29tUG9pbnQuY3BwCkBAIC0wLDAgKzEsNjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyMCBqdWlsLiAyMDExCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJDb21Qb2ludC5oIgorCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL01hY2hpbmUuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvUG9ydC5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworLyoqCisgKiBTZXJpYWxpemF0aW9uCisgKi8KK3ZvaWQgQ29tUG9pbnQ6OnRvU3RyZWFtKE91dFN0cmVhbSAmIG91dCkgY29uc3QKK3sKKwlpZiggbU1hY2hpbmVQb3J0UXVhbGlmaWVkTmFtZUlELnZhbGlkKCkgKQorCXsKKwkJaWYoIG1NYWNoaW5lICE9IE5VTEwgKQorCQl7CisJCQlvdXQgPDwgbU1hY2hpbmUtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIi0+IjsKKwkJfQorCisJCXRvU3RyZWFtUHJvdG9jb2xDYXN0KCBvdXQgPDwgbU1hY2hpbmVQb3J0UXVhbGlmaWVkTmFtZUlELnN0cigpICk7CisJfQorCWVsc2UgaWYoIG1Qb3J0ICE9IE5VTEwgKQorCXsKKwkJaWYoIChtTWFjaGluZSAhPSBOVUxMKSAmJiAobVBvcnQtPmdldENvbnRhaW5lcigpICE9IG1NYWNoaW5lKSApCisJCXsKKwkJCW91dCA8PCBtTWFjaGluZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJCTw8ICItPiIgPDwgbVBvcnQtPmdldE5hbWVJRCgpOworCQl9CisJCWVsc2UKKwkJeworCQkJb3V0IDw8IG1Qb3J0LT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOworCQl9CisKKwkJdG9TdHJlYW1Qcm90b2NvbENhc3QoIG91dCApOworCX0KKwllbHNlCisJeworCQlvdXQgPDwgIkNvbVBvaW50PG51bGw+IjsKKwl9Cit9CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvaW5mcmFzdHJ1Y3R1cmUvQ29tUG9pbnQuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9Db21Qb2ludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNTIwYTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvaW5mcmFzdHJ1Y3R1cmUvQ29tUG9pbnQuaApAQCAtMCwwICsxLDE4NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDIwIGp1aWwuIDIwMTEKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBGTUxfSU5GUkFTVFJVQ1RVUkVfQ09OTkVDVE9SX0VORF9IXworI2RlZmluZSBGTUxfSU5GUkFTVFJVQ1RVUkVfQ09OTkVDVE9SX0VORF9IXworCisjaW5jbHVkZSA8Y29tbW9uL0VsZW1lbnQuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvQ29tUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxmbWwvY29tbW9uL1RyYWNlYWJsZUVsZW1lbnQuaD4KKworI2luY2x1ZGUgPGNvbW1vbi9Bdm1Qb2ludGVyLmg+CisjaW5jbHVkZSA8Y29tbW9uL0JGLmg+CisKKyNpbmNsdWRlIDxmbWwvY29tbW9uL09iamVjdEVsZW1lbnQuaD4KKworI2luY2x1ZGUgPGZtbC9saWIvQXZtTGFuZy5oPgorI2luY2x1ZGUgPGZtbC9saWIvSUNvbVBvaW50Lmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBNYWNoaW5lOworY2xhc3MgUG9ydDsKKworCitjbGFzcyBDb21Qb2ludCA6CisJCXB1YmxpYyBFbGVtZW50LAorCQlwdWJsaWMgQ29tUHJvdG9jb2wsCisJCXB1YmxpYyBUcmFjZWFibGVFbGVtZW50LAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIENvbVBvaW50ICkKK3sKKworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBDb21Qb2ludCApCisKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlNYWNoaW5lICogbU1hY2hpbmU7CisJUG9ydCAgICAqIG1Qb3J0OworCisJQkYgbU1hY2hpbmVQb3J0UXVhbGlmaWVkTmFtZUlEOworCisKK3B1YmxpYzoKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUNvbVBvaW50KCkKKwk6IEVsZW1lbnQoIENMQVNTX0tJTkRfVCggQ29tUG9pbnQgKSApLAorCUNvbVByb3RvY29sKCBQUk9UT0NPTF9VTkRFRklORURfS0lORCApLAorCVRyYWNlYWJsZUVsZW1lbnQoICksCisJbU1hY2hpbmUoIE5VTEwgKSwKKwltUG9ydCggTlVMTCApLAorCW1NYWNoaW5lUG9ydFF1YWxpZmllZE5hbWVJRCggKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkNvbVBvaW50KCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbU1hY2hpbmUKKwkgKi8KKwlpbmxpbmUgTWFjaGluZSAqIGdldE1hY2hpbmUoKQorCXsKKwkJcmV0dXJuKCBtTWFjaGluZSApOworCX0KKworCWlubGluZSBib29sIGhhc01hY2hpbmUoKQorCXsKKwkJcmV0dXJuKCBtTWFjaGluZSAhPSBOVUxMICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0TWFjaGluZShNYWNoaW5lICogYU1hY2hpbmUpCisJeworCQltTWFjaGluZSA9IGFNYWNoaW5lOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVBvcnQKKwkgKi8KKwlpbmxpbmUgUG9ydCAqIGdldFBvcnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUG9ydCApOworCX0KKworCWlubGluZSBib29sIGhhc1BvcnQoKQorCXsKKwkJcmV0dXJuKCBtUG9ydCAhPSBOVUxMICk7CisJfQorCisKKwkvKioKKwkgKiBTRVRURVIKKwkgKiBtTWFjaGluZQorCSAqIG1Qb3J0CisJICovCisJaW5saW5lIHZvaWQgc2V0TWFjaGluZVBvcnQoTWFjaGluZSAqIGFNYWNoaW5lLCBQb3J0ICogYVBvcnQpCisJeworCQltTWFjaGluZSA9IGFNYWNoaW5lOworCisJCW1Qb3J0ID0gYVBvcnQ7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtTWFjaGluZVBvcnRRdWFsaWZpZWROYW1lSUQKKwkgKi8KKwlpbmxpbmUgQkYgJiBnZXRNYWNoaW5lUG9ydFF1YWxpZmllZE5hbWVJRCgpCisJeworCQlyZXR1cm4oIG1NYWNoaW5lUG9ydFF1YWxpZmllZE5hbWVJRCApOworCX0KKworCWlubGluZSBib29sIGhhc01hY2hpbmVQb3J0UXVhbGlmaWVkTmFtZUlEKCkKKwl7CisJCXJldHVybiggbU1hY2hpbmVQb3J0UXVhbGlmaWVkTmFtZUlELnZhbGlkKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRNYWNoaW5lUG9ydChjb25zdCBCRiAmIGJmKQorCXsKKwkJbU1hY2hpbmVQb3J0UXVhbGlmaWVkTmFtZUlEID0gYmY7CisJfQorCisKKwlpbmxpbmUgYm9vbCBpc01hY2hpbmVBbGxQb3J0KCkKKwl7CisJCXJldHVybiggbU1hY2hpbmVQb3J0UXVhbGlmaWVkTmFtZUlEID09IFhMSUFfU1lOVEFYOjpJRF9BTEwgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRNYWNoaW5lQWxsU2lnbmFsKE1hY2hpbmUgKiBhTWFjaGluZSkKKwl7CisJCW1NYWNoaW5lID0gYU1hY2hpbmU7CisJCW1NYWNoaW5lUG9ydFF1YWxpZmllZE5hbWVJRCA9IFhMSUFfU1lOVEFYOjpJRF9BTEw7CisJfQorCisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgc3RyKCkgY29uc3QKKwl7CisJCVN0cmluZ091dFN0cmVhbSBvc3MoIEFWTV9OT19JTkRFTlQgKTsKKworCQl0b1N0cmVhbSggb3NzICk7CisKKwkJcmV0dXJuKCBvc3Muc3RyKCkgKTsKKwl9CisKKwl2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG91dCkgY29uc3Q7CisKK307CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKiBGTUxfSU5GUkFTVFJVQ1RVUkVfQ09OTkVDVE9SX0VORF9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL0NvbVByb3RvY29sLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9Db21Qcm90b2NvbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ1YTM5YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9Db21Qcm90b2NvbC5jcHAKQEAgLTAsMCArMSwzMTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyNiBmw6l2ci4gMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQ29tUHJvdG9jb2wuaCIKKworI2luY2x1ZGUgPHV0aWwvYXZtX3N0cmluZy5oPgorCituYW1lc3BhY2Ugc2VwCit7CisKK0NvbVByb3RvY29sOjpQUk9UT0NPTF9LSU5EIENvbVByb3RvY29sOjp0b19jYXN0KFBST1RPQ09MX0tJTkQgcHJvdG9jb2wpCit7CisJc3dpdGNoKCBwcm90b2NvbCApCisJeworCQljYXNlIFBST1RPQ09MX0VOVklST05NRU5UX0tJTkQgOiByZXR1cm4oIFBST1RPQ09MX1VOREVGSU5FRF9LSU5EICk7CisKKwkJY2FzZSBQUk9UT0NPTF9UUkFOU0ZFUlRfS0lORCAgIDogcmV0dXJuKCBQUk9UT0NPTF9VTkRFRklORURfS0lORCApOworCisJCWNhc2UgUFJPVE9DT0xfQlVGRkVSX0tJTkQgICAgICA6IHJldHVybiggUFJPVE9DT0xfVU5ERUZJTkVEX0tJTkQgKTsKKworCQljYXNlIFBST1RPQ09MX1JEVl9LSU5EICAgICAgICAgOiByZXR1cm4oIFBST1RPQ09MX1VOSUNBU1RfS0lORCApOworCQljYXNlIFBST1RPQ09MX01VTFRJUkRWX0tJTkQgICAgOiByZXR1cm4oIFBST1RPQ09MX01VTFRJQ0FTVF9LSU5EICk7CisKKwkJY2FzZSBQUk9UT0NPTF9GTE9XX0tJTkQgICAgICAgIDogcmV0dXJuKCBQUk9UT0NPTF9VTkRFRklORURfS0lORCApOworCisJCWNhc2UgUFJPVE9DT0xfQlJPQURDQVNUX0tJTkQgICA6IHJldHVybiggcHJvdG9jb2wgKTsKKwkJY2FzZSBQUk9UT0NPTF9NVUxUSUNBU1RfS0lORCAgIDogcmV0dXJuKCBwcm90b2NvbCApOworCQljYXNlIFBST1RPQ09MX1VOSUNBU1RfS0lORCAgICAgOiByZXR1cm4oIHByb3RvY29sICk7CisJCWNhc2UgUFJPVE9DT0xfQU5ZQ0FTVF9LSU5EICAgICA6IHJldHVybiggcHJvdG9jb2wgKTsKKworCQljYXNlIFBST1RPQ09MX1VOREVGSU5FRF9LSU5EICAgOiByZXR1cm4oIHByb3RvY29sICk7CisKKwkJZGVmYXVsdCAgICAgICAgICAgICAgICAgICAgICAgIDogcmV0dXJuKCBQUk9UT0NPTF9VTkRFRklORURfS0lORCApOworCX0KK30KKworc3RkOjpzdHJpbmcgQ29tUHJvdG9jb2w6OnRvX3N0cmluZyhQUk9UT0NPTF9LSU5EIHByb3RvY29sKQoreworCXN3aXRjaCggcHJvdG9jb2wgKQorCXsKKwkJY2FzZSBQUk9UT0NPTF9FTlZJUk9OTUVOVF9LSU5EIDogcmV0dXJuKCAiZW52IiApOworCisJCWNhc2UgUFJPVE9DT0xfVFJBTlNGRVJUX0tJTkQgICA6IHJldHVybiggInRyYW5zZmVydCIgKTsKKworCQljYXNlIFBST1RPQ09MX0JVRkZFUl9LSU5EICAgICAgOiByZXR1cm4oICJidWZmZXIiICk7CisKKwkJY2FzZSBQUk9UT0NPTF9SRFZfS0lORCAgICAgICAgIDogcmV0dXJuKCAicmR2IiApOworCQljYXNlIFBST1RPQ09MX01VTFRJUkRWX0tJTkQgICAgOiByZXR1cm4oICJtdWx0aXJkdiIgKTsKKworCQljYXNlIFBST1RPQ09MX0ZMT1dfS0lORCAgICAgICAgOiByZXR1cm4oICJmbG93IiApOworCisJCWNhc2UgUFJPVE9DT0xfQlJPQURDQVNUX0tJTkQgICA6IHJldHVybiggImJyb2FkY2FzdCIgKTsKKworCQljYXNlIFBST1RPQ09MX01VTFRJQ0FTVF9LSU5EICAgOiByZXR1cm4oICJtdWx0aWNhc3QiICk7CisJCWNhc2UgUFJPVE9DT0xfVU5JQ0FTVF9LSU5EICAgICA6IHJldHVybiggInVuaWNhc3QiICk7CisJCWNhc2UgUFJPVE9DT0xfQU5ZQ0FTVF9LSU5EICAgICA6IHJldHVybiggImFueWNhc3QiICk7CisKKwkJY2FzZSBQUk9UT0NPTF9VTkRFRklORURfS0lORCAgIDogcmV0dXJuKCAidW5kZWZpbmVkPHByb3RvY29sI2tpbmQ+IiApOworCisJCWRlZmF1bHQgICAgICAgICAgICAgICAgICAgICAgICA6IHJldHVybiggInVua25vd248cHJvdG9jb2wja2luZD4iICk7CisJfQorfQorCisKK3N0ZDo6c3RyaW5nIENvbVByb3RvY29sOjpzdHJQcm90b2NvbCgKKwkJUFJPVE9DT0xfS0lORCBhUHJvdG9jb2wsIFBST1RPQ09MX0tJTkQgYUNhc3QpCit7CisJc3dpdGNoICggYVByb3RvY29sICkKKwl7CisJCWNhc2UgUFJPVE9DT0xfRU5WSVJPTk1FTlRfS0lORDoKKwkJeworCQkJcmV0dXJuKCAiZW52IiApOworCQl9CisKKwkJY2FzZSBQUk9UT0NPTF9CVUZGRVJfS0lORDoKKwkJeworCQkJcmV0dXJuKCBPU1MoKSA8PCAiYnVmZmVyICwgIiA8PCBDb21Qcm90b2NvbDo6c3RyQ2FzdChhQ2FzdCkgKTsKKwkJfQorCisJCWNhc2UgUFJPVE9DT0xfUkRWX0tJTkQ6CisJCXsKKwkJCXJldHVybiggT1NTKCkgPDwgInJkdiAsICIgPDwgQ29tUHJvdG9jb2w6OnN0ckNhc3QoYUNhc3QpICk7CisJCX0KKwkJY2FzZSBQUk9UT0NPTF9NVUxUSVJEVl9LSU5EOgorCQl7CisJCQlyZXR1cm4oIE9TUygpIDw8ICJtdWx0aXJkdiAsICIgPDwgQ29tUHJvdG9jb2w6OnN0ckNhc3QoYUNhc3QpICk7CisJCX0KKworCQljYXNlIFBST1RPQ09MX0ZMT1dfS0lORDoKKwkJeworCQkJcmV0dXJuKCBPU1MoKSA8PCAiZmxvdyAsICIgPDwgQ29tUHJvdG9jb2w6OnN0ckNhc3QoYUNhc3QpICk7CisJCX0KKworCQljYXNlIFBST1RPQ09MX1VOREVGSU5FRF9LSU5EOgorCQl7CisJCQlyZXR1cm4oIE9TUygpIDw8ICJ1bmRlZmluZWQ8cHJvdG9jb2wja2luZD4gLCAiCisJCQkJCTw8IENvbVByb3RvY29sOjpzdHJDYXN0KGFDYXN0KSApOworCQl9CisKKwkJZGVmYXVsdCA6CisJCXsKKwkJCXJldHVybiggT1NTKCkgPDwgInVuZXhwZWN0ZWQ8IgorCQkJCQk8PCB0b19zdHJpbmcoYVByb3RvY29sKSA8PCAiICwgIgorCQkJCQk8PCB0b19zdHJpbmcoYUNhc3QpIDw8ICI+IiApOworCQl9CisJfQorfQorCisKK3N0ZDo6c3RyaW5nIENvbVByb3RvY29sOjpzdHJQcm90b2NvbChQUk9UT0NPTF9LSU5EIGFQcm90b2NvbCkKK3sKKwlzd2l0Y2ggKCBhUHJvdG9jb2wgKQorCXsKKwkJY2FzZSBQUk9UT0NPTF9FTlZJUk9OTUVOVF9LSU5EOgorCQl7CisJCQlyZXR1cm4oICJlbnYiICk7CisJCX0KKworCQljYXNlIFBST1RPQ09MX0JVRkZFUl9LSU5EOgorCQl7CisJCQlyZXR1cm4oICJidWZmZXIiICk7CisJCX0KKworCQljYXNlIFBST1RPQ09MX1JEVl9LSU5EOgorCQl7CisJCQlyZXR1cm4oICJyZHYiICk7CisJCX0KKwkJY2FzZSBQUk9UT0NPTF9NVUxUSVJEVl9LSU5EOgorCQl7CisJCQlyZXR1cm4oICJtdWx0aXJkdiIgKTsKKwkJfQorCisJCWNhc2UgUFJPVE9DT0xfRkxPV19LSU5EOgorCQl7CisJCQlyZXR1cm4oICJmbG93IiApOworCQl9CisKKworCQljYXNlIFBST1RPQ09MX0FOWUNBU1RfS0lORDoKKwkJeworCQkJcmV0dXJuKCAiYW55Y2FzdCIgKTsKKwkJfQorCQljYXNlIFBST1RPQ09MX1VOSUNBU1RfS0lORDoKKwkJeworCQkJcmV0dXJuKCAidW5pY2FzdCIgKTsKKwkJfQorCQljYXNlIFBST1RPQ09MX0JST0FEQ0FTVF9LSU5EOgorCQl7CisJCQlyZXR1cm4oICJicm9hZGNhc3QiICk7CisJCX0KKwkJY2FzZSBQUk9UT0NPTF9NVUxUSUNBU1RfS0lORDoKKwkJeworCQkJcmV0dXJuKCAibXVsdGljYXN0IiApOworCQl9CisJCWNhc2UgUFJPVE9DT0xfVU5ERUZJTkVEX0tJTkQ6CisJCXsKKwkJCXJldHVybiggInVuZGVmaW5lZDxwcm90b2NvbCNraW5kPiIgKTsKKwkJfQorCisJCWRlZmF1bHQgOgorCQl7CisJCQlyZXR1cm4oIE9TUygpIDw8ICJ1bmV4cGVjdGVkPCIKKwkJCQkJPDwgdG9fc3RyaW5nKGFQcm90b2NvbCkgPDwgIj4iICk7CisJCX0KKwl9Cit9CisKKworc3RkOjpzdHJpbmcgQ29tUHJvdG9jb2w6OnN0ckNhc3QoUFJPVE9DT0xfS0lORCBhQ2FzdCkKK3sKKwlzd2l0Y2ggKCBhQ2FzdCApCisJeworCQljYXNlIFBST1RPQ09MX1VOSUNBU1RfS0lORDoKKwkJeworCQkJcmV0dXJuKCAidW5pY2FzdCIgKTsKKwkJfQorCisJCWNhc2UgUFJPVE9DT0xfQU5ZQ0FTVF9LSU5EOgorCQl7CisJCQlyZXR1cm4oICJhbnljYXN0IiApOworCQl9CisKKwkJY2FzZSBQUk9UT0NPTF9CUk9BRENBU1RfS0lORDoKKwkJeworCQkJcmV0dXJuKCAiYnJvYWRjYXN0IiApOworCQl9CisJCWNhc2UgUFJPVE9DT0xfTVVMVElDQVNUX0tJTkQ6CisJCXsKKwkJCXJldHVybiggIm11bHRpY2FzdCIgKTsKKwkJfQorCisJCWNhc2UgUFJPVE9DT0xfVU5ERUZJTkVEX0tJTkQ6CisJCXsKKwkJCXJldHVybiggInVuZGVmaW5lZDxjYXN0I2tpbmQ+IiApOworCQl9CisKKwkJZGVmYXVsdCA6CisJCXsKKwkJCXJldHVybiggT1NTKCkgPDwgInVuZXhwZWN0ZWQ8IgorCQkJCQk8PCB0b19zdHJpbmcoYUNhc3QpIDw8ICI+IiApOworCQl9CisJfQorfQorCisKK091dFN0cmVhbSAmIENvbVByb3RvY29sOjp0b1N0cmVhbVByb3RvY29sQ2FzdCgKKwkJT3V0U3RyZWFtICYgb3V0LCBib29sIG11c3RCZURlZmluZWQpIGNvbnN0Cit7CisJaWYoIG1Qcm90b2NvbCA9PSBQUk9UT0NPTF9VTkRFRklORURfS0lORCApCisJeworCQlpZiggKG1DYXN0ICE9IFBST1RPQ09MX1VOREVGSU5FRF9LSU5EKSB8fCBtdXN0QmVEZWZpbmVkICkKKwkJeworCQkJb3V0IDw8ICI8ICIgPDwgQ29tUHJvdG9jb2w6OnN0ckNhc3QobUNhc3QpIDw8ICIgPiI7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJb3V0IDw8ICI8ICI7CisKKwkJc3dpdGNoICggbVByb3RvY29sICkKKwkJeworCQkJY2FzZSBQUk9UT0NPTF9FTlZJUk9OTUVOVF9LSU5EOgorCQkJeworCQkJCW91dCA8PCAiZW52IjsKKworCQkJCWJyZWFrOworCQkJfQorCisJCQljYXNlIFBST1RPQ09MX0JVRkZFUl9LSU5EOgorCQkJeworCQkJCW91dCA8PCAiYnVmZmVyIjsKKworCQkJCWlmKCBtQnVmZmVyICE9IE5VTEwgKQorCQkJCXsKKwkJCQkJb3V0IDw8ICI6ICI7CisJCQkJCWlmKCBtQnVmZmVyLT5pc0Fub255bUlEKCkgKQorCQkJCQl7CisJCQkJCQlvdXQgPDwgQnVmZmVyOjpzdHIobUJ1ZmZlci0+Z2V0UG9saWN5U3BlY2lmaWVyS2luZCgpLAorCQkJCQkJCQltQnVmZmVyLT5nZXRTaXplKCkpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJb3V0IDw8IG1CdWZmZXItPmdldE5hbWVJRCgpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYoIG1CdWZmZXJVZmlkLnZhbGlkKCkgKQorCQkJCXsKKwkJCQkJb3V0IDw8ICI6ICIgPDwgbUJ1ZmZlclVmaWQuc3RyKCk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCW91dCA8PCAiICwgIiA8PCBDb21Qcm90b2NvbDo6c3RyQ2FzdChtQ2FzdCk7CisJCQkJfQorCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNhc2UgUFJPVE9DT0xfUkRWX0tJTkQ6CisJCQl7CisJCQkJb3V0IDw8ICJyZHYiIDw8ICIgLCAiIDw8IENvbVByb3RvY29sOjpzdHJDYXN0KG1DYXN0KTsKKworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBQUk9UT0NPTF9NVUxUSVJEVl9LSU5EOgorCQkJeworCQkJCW91dCA8PCAibXVsdGlyZHYiIDw8ICIgLCAiIDw8IENvbVByb3RvY29sOjpzdHJDYXN0KG1DYXN0KTsKKworCQkJCWJyZWFrOworCQkJfQorCisJCQljYXNlIFBST1RPQ09MX0ZMT1dfS0lORDoKKwkJCXsKKwkJCQlvdXQgPDwgImZsb3ciIDw8ICIgLCAiIDw8IENvbVByb3RvY29sOjpzdHJDYXN0KG1DYXN0KTsKKworCQkJCWJyZWFrOworCQkJfQorCisJCQljYXNlIFBST1RPQ09MX1VOREVGSU5FRF9LSU5EOgorCQkJeworCQkJCW91dCA8PCAidW5kZWZpbmVkPHByb3RvY29sI2tpbmQ+IiA8PCAiICwgIgorCQkJCQk8PCBDb21Qcm90b2NvbDo6c3RyQ2FzdChtQ2FzdCk7CisKKwkJCQlicmVhazsKKwkJCX0KKworCQkJZGVmYXVsdCA6CisJCQl7CisJCQkJb3V0IDw8ICJ1bmV4cGVjdGVkPCIgPDwgdG9fc3RyaW5nKG1Qcm90b2NvbCkKKwkJCQkJPDwgIiAsICIgPDwgdG9fc3RyaW5nKG1DYXN0KSA8PCAiPiI7CisKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCW91dCA8PCAiID4iOworCX0KKworCXJldHVybiggb3V0ICk7Cit9CisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL0NvbVByb3RvY29sLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvaW5mcmFzdHJ1Y3R1cmUvQ29tUHJvdG9jb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmUwMzc1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL0NvbVByb3RvY29sLmgKQEAgLTAsMCArMSwyNzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyNiBmw6l2ci4gMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIENPTVBST1RPQ09MX0hfCisjZGVmaW5lIENPTVBST1RPQ09MX0hfCisKKworI2luY2x1ZGUgPGZtbC9saWIvSUNvbVBvaW50Lmg+CisKKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvQnVmZmVyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBDb21Qcm90b2NvbAoreworCitwdWJsaWM6CisJLyoqCisJICogRU5VTSBUWVBFREVGCisJICovCisJZW51bSBQUk9UT0NPTF9LSU5ECisJeworCQlQUk9UT0NPTF9FTlZJUk9OTUVOVF9LSU5ELAorCisJCVBST1RPQ09MX1RSQU5TRkVSVF9LSU5ELAorCisJCVBST1RPQ09MX0JVRkZFUl9LSU5ELAorCisJCVBST1RPQ09MX1JEVl9LSU5ELAorCQlQUk9UT0NPTF9NVUxUSVJEVl9LSU5ELAorCisJCVBST1RPQ09MX0ZMT1dfS0lORCwKKworCQlQUk9UT0NPTF9CUk9BRENBU1RfS0lORCwKKworCQlQUk9UT0NPTF9NVUxUSUNBU1RfS0lORCwKKwkJUFJPVE9DT0xfVU5JQ0FTVF9LSU5ELAorCisJCVBST1RPQ09MX0FOWUNBU1RfS0lORCwKKworCQlQUk9UT0NPTF9VTkRFRklORURfS0lORAorCX07CisKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlJQ29tUG9pbnQ6OkVOVU1fSU9fTkFUVVJFIG1Db21Qb2ludE5hdHVyZTsKKworCVBST1RPQ09MX0tJTkQgbVByb3RvY29sOworCVBST1RPQ09MX0tJTkQgbUNhc3Q7CisKKwlCdWZmZXIgKiBtQnVmZmVyOworCisJQkYgbUJ1ZmZlclVmaWQ7CisKKworcHVibGljOgorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQ29tUHJvdG9jb2woUFJPVE9DT0xfS0lORCBhUHJvdG9jb2wsCisJCQlJQ29tUG9pbnQ6OkVOVU1fSU9fTkFUVVJFIGFOYXR1cmUgPSBJQ29tUG9pbnQ6OklPX1BPUlRfTkFUVVJFKQorCTogbUNvbVBvaW50TmF0dXJlKCBhTmF0dXJlICksCisJbVByb3RvY29sKCBhUHJvdG9jb2wgKSwKKwltQ2FzdCggdG9fY2FzdChhUHJvdG9jb2wpICksCisJbUJ1ZmZlciggTlVMTCApLAorCW1CdWZmZXJVZmlkKCApCisJeworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkNvbVByb3RvY29sKCkKKwl7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBURVNURVIgLSBTRVRURVIKKwkgKiBtQ29tUG9pbnROYXR1cmUKKwkgKi8KKwlpbmxpbmUgSUNvbVBvaW50OjpFTlVNX0lPX05BVFVSRSBnZXROYXR1cmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQ29tUG9pbnROYXR1cmUgKTsKKwl9CisKKworCWlubGluZSBib29sIGlzUG9ydCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Db21Qb2ludE5hdHVyZSA9PSBJQ29tUG9pbnQ6OklPX1BPUlRfTkFUVVJFICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNTaWduYWwoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQ29tUG9pbnROYXR1cmUgPT0gSUNvbVBvaW50OjpJT19TSUdOQUxfTkFUVVJFICk7CisJfQorCisKKwlpbmxpbmUgdm9pZCBzZXROYXR1cmUoSUNvbVBvaW50OjpFTlVNX0lPX05BVFVSRSBhTmF0dXJlKQorCXsKKwkJbUNvbVBvaW50TmF0dXJlID0gYU5hdHVyZTsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtUHJvdG9jb2wKKwkgKi8KKwlpbmxpbmUgUFJPVE9DT0xfS0lORCBnZXRQcm90b2NvbCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Qcm90b2NvbCApOworCX0KKworCWlubGluZSBib29sIGhhc1Byb3RvY29sKCkgY29uc3QKKwl7CisJCXJldHVybiggbVByb3RvY29sICE9IFBST1RPQ09MX1VOREVGSU5FRF9LSU5EICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0UHJvdG9jb2woUFJPVE9DT0xfS0lORCBhUHJvdG9jb2wpCisJeworCQltUHJvdG9jb2wgPSBhUHJvdG9jb2w7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtQ2FzdAorCSAqLworCWlubGluZSBQUk9UT0NPTF9LSU5EIGdldENhc3QoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQ2FzdCApOworCX0KKworCWlubGluZSBib29sIGhhc0Nhc3QoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQ2FzdCAhPSBQUk9UT0NPTF9VTkRFRklORURfS0lORCApOworCX0KKworCWlubGluZSB2b2lkIHNldENhc3QoUFJPVE9DT0xfS0lORCBhQ2FzdCkKKwl7CisJCW1DYXN0ID0gYUNhc3Q7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtUHJvdG9jb2wKKwkgKiBtQ2FzdAorCSAqLworCWlubGluZSB2b2lkIHNldFByb3RvY29sQ2FzdChQUk9UT0NPTF9LSU5EIGFQcm90b2NvbCwKKwkJCVBST1RPQ09MX0tJTkQgYUNhc3QpCisJeworCQltUHJvdG9jb2wgPSBhUHJvdG9jb2w7CisJCW1DYXN0ID0gYUNhc3Q7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtQnVmZmVyCisJICovCisJaW5saW5lIEJ1ZmZlciAqIGdldEJ1ZmZlcigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1CdWZmZXIgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNCdWZmZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQnVmZmVyICE9IE5VTEwgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRCdWZmZXIoY29uc3QgQkYgJiBhQnVmZmVyKQorCXsKKwkJaWYoIGFCdWZmZXIuaXM8IEJ1ZmZlciA+KCkgKQorCQl7CisJCQltQnVmZmVyID0gYUJ1ZmZlci50b19wdHI8IEJ1ZmZlciA+KCk7CisJCQltQnVmZmVyVWZpZCA9IGFCdWZmZXI7CisJCX0KKwkJZWxzZQorCQl7CisJCQltQnVmZmVyVWZpZCA9IGFCdWZmZXI7CisJCX0KKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1CdWZmZXJVZmlkCisJICovCisJaW5saW5lIEJGICYgZ2V0QnVmZmVyVWZpZCgpCisJeworCQlyZXR1cm4oIG1CdWZmZXJVZmlkICk7CisJfQorCisJaW5saW5lIGNvbnN0IEJGICYgZ2V0QnVmZmVyVWZpZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1CdWZmZXJVZmlkICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzQnVmZmVyVWZpZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1CdWZmZXJVZmlkLnZhbGlkKCkgKTsKKwl9CisKKwlpbmxpbmUgc3RkOjpzdHJpbmcgc3RyQnVmZmVyVWZpZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1CdWZmZXJVZmlkLnN0cigpICk7CisJfQorCisJLyoqCisJICogVXBkYXRlCisJICovCisJaW5saW5lIHZvaWQgdXBkYXRlKENvbVByb3RvY29sICogY3ApCisJeworCQltUHJvdG9jb2wgICA9IGNwLT5tUHJvdG9jb2w7CisJCW1DYXN0ICAgICAgID0gY3AtPm1DYXN0OworCQltQnVmZmVyICAgICA9IGNwLT5tQnVmZmVyOworCQltQnVmZmVyVWZpZCA9IGNwLT5tQnVmZmVyVWZpZDsKKwl9CisKKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwlzdGF0aWMgUFJPVE9DT0xfS0lORCB0b19jYXN0KFBST1RPQ09MX0tJTkQgcHJvdG9jb2wpOworCisJc3RhdGljIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyhQUk9UT0NPTF9LSU5EIHByb3RvY29sKTsKKworCisJc3RhdGljIHN0ZDo6c3RyaW5nIHN0clByb3RvY29sKFBST1RPQ09MX0tJTkQgYVByb3RvY29sKTsKKworCXN0YXRpYyBzdGQ6OnN0cmluZyBzdHJQcm90b2NvbCgKKwkJCVBST1RPQ09MX0tJTkQgYVByb3RvY29sLCBQUk9UT0NPTF9LSU5EIGFDYXN0KTsKKworCXN0YXRpYyBzdGQ6OnN0cmluZyBzdHJDYXN0KFBST1RPQ09MX0tJTkQgYUNhc3QpOworCisKKwlpbmxpbmUgc3RkOjpzdHJpbmcgc3RyUHJvdG9jb2xDYXN0KGJvb2wgbXVzdEJlRGVmaW5lZCA9IGZhbHNlKSBjb25zdAorCXsKKwkJU3RyaW5nT3V0U3RyZWFtIG9zcyggQVZNX05PX0lOREVOVCApOworCisJCXRvU3RyZWFtUHJvdG9jb2xDYXN0KCBvc3MgKTsKKworCQlyZXR1cm4oIG9zcy5zdHIoKSApOworCX0KKworCU91dFN0cmVhbSAmIHRvU3RyZWFtUHJvdG9jb2xDYXN0KAorCQkJT3V0U3RyZWFtICYgb3V0LCBib29sIG11c3RCZURlZmluZWQgPSBmYWxzZSkgY29uc3Q7CisKK307CisKKworfQorCisjZW5kaWYgLyogQ09NUFJPVE9DT0xfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9Db21Sb3V0ZS5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvaW5mcmFzdHJ1Y3R1cmUvQ29tUm91dGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjOWY3YzQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvaW5mcmFzdHJ1Y3R1cmUvQ29tUm91dGUuY3BwCkBAIC0wLDAgKzEsODcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxOCBvY3QuIDIwMTMKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkNvbVJvdXRlLmgiCisKKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvQ29ubmVjdG9yLmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1BvcnQuaD4KKworCisKK25hbWVzcGFjZSBzZXAKK3sKKworLyoqCisgKiBDT05TVFJVQ1RPUgorICogRGVmYXVsdAorICovCitDb21Sb3V0ZTo6Q29tUm91dGUoQ29ubmVjdG9yICogYUNvbnRhaW5lciwgY29uc3QgTW9kaWZpZXIgJiBhTW9kaWZpZXIpCis6IE9iamVjdEVsZW1lbnQoIENMQVNTX0tJTkRfVCggQ29tUm91dGUgKSAsIGFDb250YWluZXIgLCBhTW9kaWZpZXIgKSwKK0NvbVByb3RvY29sKCBQUk9UT0NPTF9VTkRFRklORURfS0lORCApLAorbUNvbVBvaW50cyggKQoreworCS8vISEgTk9USElORworfQorCisKKy8qKgorICogU0VUVEVSCisgKiBtQ29tUG9pbnRzCisgKi8KK3ZvaWQgQ29tUm91dGU6OnNldENvbVBvaW50KENvbVBvaW50ICogYUNvbVBvaW50LAorCQlNb2RpZmllcjo6RElSRUNUSU9OX0tJTkQgaW9EaXJlY3Rpb24pCit7CisJbUNvbVBvaW50cy5hcHBlbmQoIEJGKGFDb21Qb2ludCkgKTsKKworCWlmKCBnZXRNb2RpZmllcigpLmlzRGlyZWN0aW9uVW5kZWZpbmVkKCkgKQorCXsKKwkJZ2V0d01vZGlmaWVyKCkuc2V0RGlyZWN0aW9uS2luZCggYUNvbVBvaW50LT5oYXNQb3J0KCkKKwkJCQk/IGFDb21Qb2ludC0+Z2V0UG9ydCgpLT5nZXRNb2RpZmllcigpLmdldERpcmVjdGlvbktpbmQoKQorCQkJCTogaW9EaXJlY3Rpb24gKTsKKwl9Cit9CisKKworLyoqCisgKiBTZXJpYWxpemF0aW9uCisgKi8KK3ZvaWQgQ29tUm91dGU6OnRvU3RyZWFtKE91dFN0cmVhbSAmIG91dCkgY29uc3QKK3sKKwlvdXQgPDwgVEFCIDw8IGdldE1vZGlmaWVyKCkuc3RyRGlyZWN0aW9uKCk7CisKKwl0b1N0cmVhbVByb3RvY29sQ2FzdCggb3V0ICkgPDwgIiAiIDsKKworCWlmKCBtQ29tUG9pbnRzLnNpbmdsZXRvbigpICkKKwl7CisJCW91dCA8PCBtQ29tUG9pbnRzLmZpcnN0KCkudG9fcHRyPCBDb21Qb2ludCA+KCktPnN0cigpIDw8ICI7IiA8PCBFT0w7CisJfQorCWVsc2UKKwl7CisJCW91dCA8PCAieyIgPDwgRU9MOworCQlpZiggbUNvbVBvaW50cy5ub25lbXB0eSgpICkKKwkJeworCQkJQkZMaXN0Ojpjb25zdF9yYXdfaXRlcmF0b3I8IENvbVBvaW50ID4gaXQgPSBtQ29tUG9pbnRzLmJlZ2luKCk7CisJCQlCRkxpc3Q6OmNvbnN0X3Jhd19pdGVyYXRvcjwgQ29tUG9pbnQgPiBlbmRJdCA9IG1Db21Qb2ludHMuZW5kKCk7CisJCQlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJCXsKKwkJCQlvdXQgPDwgVEFCMiA8PCAoaXQpLT5zdHIoKSA8PCAiOyIgPDwgRU9MOworCQkJfQorCQl9CisJCW91dCA8PCBUQUIgPDwgIn0iIDw8IEVPTF9GTFVTSDsKKwl9Cit9CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvaW5mcmFzdHJ1Y3R1cmUvQ29tUm91dGUuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9Db21Sb3V0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwOWMwYjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvaW5mcmFzdHJ1Y3R1cmUvQ29tUm91dGUuaApAQCAtMCwwICsxLDEwMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDE4IG9jdC4gMjAxMworICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIENPTVJPVVRFX0hfCisjZGVmaW5lIENPTVJPVVRFX0hfCisKKyNpbmNsdWRlIDxmbWwvY29tbW9uL09iamVjdEVsZW1lbnQuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvQ29tUHJvdG9jb2wuaD4KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vQkZDb250YWluZXIuaD4KKworI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Db21Qb2ludC5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Qb3J0Lmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBDb25uZWN0b3I7CitjbGFzcyBNb2RpZmllcjsKKworCitjbGFzcyBDb21Sb3V0ZSA6CisJCXB1YmxpYyBPYmplY3RFbGVtZW50LAorCQlwdWJsaWMgQ29tUHJvdG9jb2wsCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggQ29tUm91dGUgKQoreworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIENvbVJvdXRlICkKKworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQVRUUklCVVRFUworCSAqLworCUJGTGlzdCBtQ29tUG9pbnRzOworCisKK3B1YmxpYzoKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUNvbVJvdXRlKENvbm5lY3RvciAqIGFDb250YWluZXIsCisJCQljb25zdCBNb2RpZmllciAmIGFNb2RpZmllciA9IE1vZGlmaWVyOjpQUk9QRVJUWV9JTk9VVF9ESVJFQ1RJT04pOworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkNvbVJvdXRlKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUNvbVBvaW50cworCSAqLworCWlubGluZSBjb25zdCBCRkxpc3QgJiBnZXRDb21Qb2ludHMoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQ29tUG9pbnRzICk7CisJfQorCisJaW5saW5lIHZvaWQgYXBwZW5kQ29tUG9pbnQoY29uc3QgQkYgJiBhQ29tUG9pbnQpCisJeworCQltQ29tUG9pbnRzLmFwcGVuZCggYUNvbVBvaW50ICk7CisJfQorCisJaW5saW5lIHZvaWQgc2F2ZUNvbVBvaW50KENvbVBvaW50ICogYUNvbVBvaW50KQorCXsKKwkJbUNvbVBvaW50cy5hcHBlbmQoIEJGKGFDb21Qb2ludCkgKTsKKwl9CisKKwl2b2lkIHNldENvbVBvaW50KENvbVBvaW50ICogYUNvbVBvaW50LAorCQkJTW9kaWZpZXI6OkRJUkVDVElPTl9LSU5EIGlvRGlyZWN0aW9uKTsKKworCisJLyoqCisJICogU2VyaWFsaXphdGlvbgorCSAqLworCXZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3V0KSBjb25zdDsKKworfTsKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qIENPTVJPVVRFX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvaW5mcmFzdHJ1Y3R1cmUvQ29tcG9zaXRlUGFydC5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvaW5mcmFzdHJ1Y3R1cmUvQ29tcG9zaXRlUGFydC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcyMTk4OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9Db21wb3NpdGVQYXJ0LmNwcApAQCAtMCwwICsxLDMyNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDI5IG1hcnMgMjAxNgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQ29tcG9zaXRlUGFydC5oIgorCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0JlaGF2aW9yYWxQYXJ0Lmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1RyYW5zaXRpb24uaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoqCisgKiBDT1BZIFRPCisgKi8KK3ZvaWQgQ29tcG9zaXRlUGFydDo6Y29weU1hY2hpbmVUbygKKwkJQ29sbGVjdGlvbjwgTWFjaGluZSAqID4gJiByYXdDb250YWluZXIpIGNvbnN0Cit7CisJY29uc3RfbWFjaGluZV9pdGVyYXRvciBpdCA9IG1hY2hpbmVfYmVnaW4oKTsKKwljb25zdF9tYWNoaW5lX2l0ZXJhdG9yIGVuZEl0ID0gbWFjaGluZV9lbmQoKTsKKwlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwl7CisJCXJhd0NvbnRhaW5lci5hcHBlbmQoIGl0ICk7CisJfQorfQorCisKKy8qKgorICogR0VUVEVSIGZvciBQQVJTRVIgLyBDT01QSUxFUgorICogTWFjaGluZQorICovCitNYWNoaW5lICogQ29tcG9zaXRlUGFydDo6cmF3RXhlY3V0YWJsZU1hY2hpbmVCeVF1YWxpZmllZE5hbWVJRCgKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKSBjb25zdAoreworCXJldHVybiggbU1hY2hpbmVzLnJhd0J5TmFtZUlEKGFRdWFsaWZpZWROYW1lSUQpICk7CisKKwljb25zdF9tYWNoaW5lX2l0ZXJhdG9yIGl0ID0gbWFjaGluZV9iZWdpbigpOworCWNvbnN0X21hY2hpbmVfaXRlcmF0b3IgZW5kSXQgPSBtYWNoaW5lX2VuZCgpOworCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCXsKKwkJaWYoIChpdCktPmdldFNwZWNpZmllcigpLmhhc0Rlc2lnbk1vZGVsKCkKKwkJCSYmIChpdCktPmZxbkVuZHNXaXRoKGFRdWFsaWZpZWROYW1lSUQpICkKKwkJeworCQkJcmV0dXJuKCBpdCApOworCQl9CisJfQorCXJldHVybiggTlVMTCApOworfQorCisKKy8qKgorICogRElTUEFUQ0gKKyAqIG1Pd25lZEVsZW1lbnRzCisgKi8KK3ZvaWQgQ29tcG9zaXRlUGFydDo6ZGlzcGF0Y2hPd25lZEVsZW1lbnQoY29uc3QgQkYgJiBhbkVsZW1lbnQpCit7CisJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1NNQVJUX1BPSU5URVJfRVhJVCggYW5FbGVtZW50ICkKKwkJCTw8ICJFeGVjdXRhYmxlIE1hY2hpbmUgb3duZWQgZWxlbWVudCAhISEiCisJCQk8PCBTRU5EX0VYSVQ7CisKKwlNYWNoaW5lICogYU1hY2hpbmUgPSBhbkVsZW1lbnQudG9fcHRyPCBNYWNoaW5lID4oKTsKKworCWlmKCBhTWFjaGluZS0+Z2V0U3BlY2lmaWVyKCkuaXNEZXNpZ25JbnN0YW5jZVN0YXRpYygpICkKKwl7CisJCWFwcGVuZE1hY2hpbmUoIGFuRWxlbWVudCApOworCisJCWFwcGVuZEluc3RhbmNlU3RhdGljKCBhbkVsZW1lbnQgKTsKKwl9CisJZWxzZSBpZiggYU1hY2hpbmUtPmdldFNwZWNpZmllcigpLmlzRGVzaWduSW5zdGFuY2VEeW5hbWljKCkgKQorCXsKKwkJYXBwZW5kSW5zdGFuY2VEeW5hbWljKCBhbkVsZW1lbnQgKTsKKwl9CisJZWxzZSBpZiggYU1hY2hpbmUtPmdldFNwZWNpZmllcigpLmlzRmFtaWx5Q29tcG9uZW50U3RhdGUoKSApCisJeworCQlhcHBlbmRNYWNoaW5lKCBhbkVsZW1lbnQgKTsKKworCQlhcHBlbmRTdGF0ZSggYW5FbGVtZW50ICk7CisJfQorCWVsc2UgaWYoIGFNYWNoaW5lLT5nZXRTcGVjaWZpZXIoKS5pc0NvbXBvbmVudFByb2NlZHVyZSgpICkKKwl7CisJCWFwcGVuZFByb2NlZHVyZSggYW5FbGVtZW50ICk7CisJfQorCWVsc2UKKwl7CisJCWFwcGVuZE1hY2hpbmUoIGFuRWxlbWVudCApOworCX0KK30KKworCisvKioKKyAqIEdFVFRFUiAtIFNFVFRFUgorICogbU91dGdvaW5nVHJhbnNpdGlvbnMKKyAqLwordm9pZCBDb21wb3NpdGVQYXJ0OjphcHBlbmRPdXRnb2luZ1RyYW5zaXRpb25Ub0V2ZXJ5U3RhdGUoTWFjaGluZSAqIGFHcm91cFN0YXRlKQoreworCWlmKCBhR3JvdXBTdGF0ZS0+aGFzT3V0Z29pbmdUcmFuc2l0aW9uKCkgKQorCXsKKwkJQmVoYXZpb3JhbFBhcnQgKiBhR3JvdXBTdGF0ZUJlaGF2aW9yID0gYUdyb3VwU3RhdGUtPmdldEJlaGF2aW9yKCk7CisJCUJlaGF2aW9yYWxQYXJ0Ojpjb25zdF90cmFuc2l0aW9uX2l0ZXJhdG9yIGVuZFRyYW5zaXRpb24gPQorCQkJCWFHcm91cFN0YXRlQmVoYXZpb3ItPm91dGdvaW5nX3RyYW5zaXRpb25fZW5kKCk7CisJCUJlaGF2aW9yYWxQYXJ0Ojpjb25zdF90cmFuc2l0aW9uX2l0ZXJhdG9yIGl0VHJhbnNpdGlvbjsKKwkJVHJhbnNpdGlvbiAqIG5ld1RyYW5zaXRpb247CisKKwkJQ29tcG9zaXRlUGFydCAqIGFHcm91cENvbXBvc2l0ZVBhcnQgPSBhR3JvdXBTdGF0ZS0+Z2V0Q29tcG9zaXRlUGFydCgpOworCQljb25zdF9zdGF0ZV9pdGVyYXRvciBpdE1hY2hpbmUgPSBhR3JvdXBDb21wb3NpdGVQYXJ0LT5zdGF0ZV9iZWdpbigpOworCQljb25zdF9zdGF0ZV9pdGVyYXRvciBlbmRNYWNoaW5lID0gYUdyb3VwQ29tcG9zaXRlUGFydC0+c3RhdGVfZW5kKCk7CisJCWZvciggOyBpdE1hY2hpbmUgIT0gZW5kTWFjaGluZSA7ICsraXRNYWNoaW5lICkKKwkJeworCQkJaWYoIChpdE1hY2hpbmUpLT5nZXRTcGVjaWZpZXIoKS5pc1N0YXRlU2ltcGxlKCkKKwkJCQkmJiAobm90IChpdE1hY2hpbmUpLT5nZXRTcGVjaWZpZXIoKS5oYXNHcm91cE1hc2soKSkgKQorCQkJeworCQkJCWl0VHJhbnNpdGlvbiA9IGFHcm91cFN0YXRlQmVoYXZpb3ItPm91dGdvaW5nX3RyYW5zaXRpb25fYmVnaW4oKTsKKwkJCQlmb3IoIDsgaXRUcmFuc2l0aW9uICE9IGVuZFRyYW5zaXRpb24gOyArK2l0VHJhbnNpdGlvbiApCisJCQkJeworCQkJCQluZXdUcmFuc2l0aW9uID0gbmV3IFRyYW5zaXRpb24oKGl0TWFjaGluZSksIChpdFRyYW5zaXRpb24pKTsKKworCQkJCQkoaXRNYWNoaW5lKS0+Z2V0VW5pcUJlaGF2aW9yUGFydCgpLT4KKwkJCQkJCQlzYXZlT3V0Z29pbmdUcmFuc2l0aW9uKCBuZXdUcmFuc2l0aW9uICk7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCisKK3ZvaWQgQ29tcG9zaXRlUGFydDo6YXBwZW5kT3V0Z29pbmdUcmFuc2l0aW9uVG9Tb21lU3RhdGUoTWFjaGluZSAqIGFHcm91cFN0YXRlKQoreworCWlmKCBhR3JvdXBTdGF0ZS0+aGFzT3V0Z29pbmdUcmFuc2l0aW9uKCkgKQorCXsKKwkJQmVoYXZpb3JhbFBhcnQgKiBhR3JvdXBTdGF0ZUJlaGF2aW9yID0gYUdyb3VwU3RhdGUtPmdldEJlaGF2aW9yKCk7CisJCUJlaGF2aW9yYWxQYXJ0Ojpjb25zdF90cmFuc2l0aW9uX2l0ZXJhdG9yIGVuZFRyYW5zaXRpb24gPQorCQkJCWFHcm91cFN0YXRlQmVoYXZpb3ItPm91dGdvaW5nX3RyYW5zaXRpb25fZW5kKCk7CisJCUJlaGF2aW9yYWxQYXJ0Ojpjb25zdF90cmFuc2l0aW9uX2l0ZXJhdG9yIGl0VHJhbnNpdGlvbjsKKwkJVHJhbnNpdGlvbiAqIG5ld1RyYW5zaXRpb247CisKKwkJY29uc3QgTGlzdE9mU3RyaW5nICYgbGlzdG9mSWQgPSBhR3JvdXBTdGF0ZS0+Z2V0R3JvdXBJZCgpOworCisJCUNvbXBvc2l0ZVBhcnQgKiBhR3JvdXBDb21wb3NpdGVQYXJ0ID0gYUdyb3VwU3RhdGUtPmdldENvbXBvc2l0ZVBhcnQoKTsKKwkJY29uc3Rfc3RhdGVfaXRlcmF0b3IgaXRNYWNoaW5lID0gYUdyb3VwQ29tcG9zaXRlUGFydC0+c3RhdGVfYmVnaW4oKTsKKwkJY29uc3Rfc3RhdGVfaXRlcmF0b3IgZW5kTWFjaGluZSA9IGFHcm91cENvbXBvc2l0ZVBhcnQtPnN0YXRlX2VuZCgpOworCQlmb3IoIDsgaXRNYWNoaW5lICE9IGVuZE1hY2hpbmUgOyArK2l0TWFjaGluZSApCisJCXsKKwkJCWlmKCAoaXRNYWNoaW5lKS0+Z2V0U3BlY2lmaWVyKCkuaXNTdGF0ZVNpbXBsZSgpCisJCQkJJiYgKG5vdCAoaXRNYWNoaW5lKS0+Z2V0U3BlY2lmaWVyKCkuaGFzR3JvdXBNYXNrKCkpCisJCQkJJiYgbGlzdG9mSWQuY29udGFpbnMoKGl0TWFjaGluZSktPmdldE5hbWVJRCgpKSApCisJCQl7CisJCQkJaXRUcmFuc2l0aW9uID0gYUdyb3VwU3RhdGVCZWhhdmlvci0+b3V0Z29pbmdfdHJhbnNpdGlvbl9iZWdpbigpOworCQkJCWZvciggOyBpdFRyYW5zaXRpb24gIT0gZW5kVHJhbnNpdGlvbiA7ICsraXRUcmFuc2l0aW9uICkKKwkJCQl7CisJCQkJCW5ld1RyYW5zaXRpb24gPSBuZXcgVHJhbnNpdGlvbigoaXRNYWNoaW5lKSwgKGl0VHJhbnNpdGlvbikpOworCisJCQkJCShpdE1hY2hpbmUpLT5nZXRVbmlxQmVoYXZpb3JQYXJ0KCktPgorCQkJCQkJCXNhdmVPdXRnb2luZ1RyYW5zaXRpb24oIG5ld1RyYW5zaXRpb24gKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKK3ZvaWQgQ29tcG9zaXRlUGFydDo6YXBwZW5kT3V0Z29pbmdUcmFuc2l0aW9uVG9FeGNlcHRTdGF0ZShNYWNoaW5lICogYUdyb3VwU3RhdGUpCit7CisJaWYoIGFHcm91cFN0YXRlLT5oYXNPdXRnb2luZ1RyYW5zaXRpb24oKSApCisJeworCQlCZWhhdmlvcmFsUGFydCAqIGFHcm91cFN0YXRlQmVoYXZpb3IgPSBhR3JvdXBTdGF0ZS0+Z2V0QmVoYXZpb3IoKTsKKwkJQmVoYXZpb3JhbFBhcnQ6OmNvbnN0X3RyYW5zaXRpb25faXRlcmF0b3IgZW5kVHJhbnNpdGlvbiA9CisJCQkJYUdyb3VwU3RhdGVCZWhhdmlvci0+b3V0Z29pbmdfdHJhbnNpdGlvbl9lbmQoKTsKKwkJQmVoYXZpb3JhbFBhcnQ6OmNvbnN0X3RyYW5zaXRpb25faXRlcmF0b3IgaXRUcmFuc2l0aW9uOworCQlUcmFuc2l0aW9uICogbmV3VHJhbnNpdGlvbjsKKworCQljb25zdCBMaXN0T2ZTdHJpbmcgJiBsaXN0b2ZJZCA9IGFHcm91cFN0YXRlLT5nZXRHcm91cElkKCk7CisKKwkJQ29tcG9zaXRlUGFydCAqIGFHcm91cENvbXBvc2l0ZVBhcnQgPSBhR3JvdXBTdGF0ZS0+Z2V0Q29tcG9zaXRlUGFydCgpOworCQljb25zdF9zdGF0ZV9pdGVyYXRvciBpdE1hY2hpbmUgPSBhR3JvdXBDb21wb3NpdGVQYXJ0LT5zdGF0ZV9iZWdpbigpOworCQljb25zdF9zdGF0ZV9pdGVyYXRvciBlbmRNYWNoaW5lID0gYUdyb3VwQ29tcG9zaXRlUGFydC0+c3RhdGVfZW5kKCk7CisJCWZvciggOyBpdE1hY2hpbmUgIT0gZW5kTWFjaGluZSA7ICsraXRNYWNoaW5lICkKKwkJeworCQkJaWYoIChpdE1hY2hpbmUpLT5nZXRTcGVjaWZpZXIoKS5pc1N0YXRlU2ltcGxlKCkKKwkJCQkmJiAobm90IChpdE1hY2hpbmUpLT5nZXRTcGVjaWZpZXIoKS5oYXNHcm91cE1hc2soKSkKKwkJCQkmJiAobm90IGxpc3RvZklkLmNvbnRhaW5zKChpdE1hY2hpbmUpLT5nZXROYW1lSUQoKSkpICkKKwkJCXsKKwkJCQlpdFRyYW5zaXRpb24gPSBhR3JvdXBTdGF0ZUJlaGF2aW9yLT5vdXRnb2luZ190cmFuc2l0aW9uX2JlZ2luKCk7CisJCQkJZm9yKCA7IGl0VHJhbnNpdGlvbiAhPSBlbmRUcmFuc2l0aW9uIDsgKytpdFRyYW5zaXRpb24gKQorCQkJCXsKKwkJCQkJbmV3VHJhbnNpdGlvbiA9IG5ldyBUcmFuc2l0aW9uKChpdE1hY2hpbmUpLCAoaXRUcmFuc2l0aW9uKSk7CisKKwkJCQkJKGl0TWFjaGluZSktPmdldFVuaXFCZWhhdmlvclBhcnQoKS0+CisJCQkJCQkJc2F2ZU91dGdvaW5nVHJhbnNpdGlvbiggbmV3VHJhbnNpdGlvbiApOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworCit2b2lkIENvbXBvc2l0ZVBhcnQ6OmV4cGFuZEdyb3VwU3RhdGVtYWNoaW5lKCkKK3sKKwljb25zdF9zdGF0ZV9pdGVyYXRvciBpdE1hY2hpbmUgPSBzdGF0ZV9iZWdpbigpOworCWNvbnN0X3N0YXRlX2l0ZXJhdG9yIGVuZE1hY2hpbmUgPSBzdGF0ZV9lbmQoKTsKKwlmb3IoIDsgaXRNYWNoaW5lICE9IGVuZE1hY2hpbmUgOyArK2l0TWFjaGluZSApCisJeworCQlpZiggKGl0TWFjaGluZSktPmdldFNwZWNpZmllcigpLmhhc0dyb3VwTWFzaygpICkKKwkJeworCQkJaWYoIChpdE1hY2hpbmUpLT5nZXRTcGVjaWZpZXIoKS5pc0dyb3VwRXZlcnkoKSkKKwkJCXsKKwkJCQlhcHBlbmRPdXRnb2luZ1RyYW5zaXRpb25Ub0V2ZXJ5U3RhdGUoIChpdE1hY2hpbmUpICk7CisJCQl9CisJCQllbHNlIGlmKCAoaXRNYWNoaW5lKS0+Z2V0U3BlY2lmaWVyKCkuaXNHcm91cFNvbWUoKSkKKwkJCXsKKwkJCQlhcHBlbmRPdXRnb2luZ1RyYW5zaXRpb25Ub1NvbWVTdGF0ZSggKGl0TWFjaGluZSkgKTsKKwkJCX0KKwkJCWVsc2UgaWYoIChpdE1hY2hpbmUpLT5nZXRTcGVjaWZpZXIoKS5pc0dyb3VwRXhjZXB0KCkgKQorCQkJeworCQkJCWFwcGVuZE91dGdvaW5nVHJhbnNpdGlvblRvRXhjZXB0U3RhdGUoIChpdE1hY2hpbmUpICk7CisJCQl9CisJCX0KKwl9Cit9CisKKworLyoqCisgKiBTZXJpYWxpemF0aW9uCisgKi8KK3ZvaWQgQ29tcG9zaXRlUGFydDo6dG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJaWYoIGhhc1Byb2NlZHVyZSgpICkKKwl7CisJCW9zIDw8IFRBQiA8PCAicHJvY2VkdXJlOiIgPDwgRU9MX0lOQ1JfSU5ERU5UOworCQljb25zdF9wcm9jZWR1cmVfaXRlcmF0b3IgaXQgPSBwcm9jZWR1cmVfYmVnaW4oKTsKKwkJY29uc3RfcHJvY2VkdXJlX2l0ZXJhdG9yIGVuZEl0ID0gcHJvY2VkdXJlX2VuZCgpOworCQlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJeworCQkJKGl0KS0+dG9TdHJlYW0ob3MpOworCQkJb3MgPDwgRU9MOworCQl9CisJCW9zIDw8IERFQ1JfSU5ERU5UOworCX0KKworCWlmKCBoYXNTdGF0ZSgpICkKKwl7CisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgc2VxdWVuY2VOYW1lID0gKCBnZXRDb250YWluZXJNYWNoaW5lKCktPgorCQkJCWdldFNwZWNpZmllcigpLmlzQ29tcG9uZW50U3RhdGVtYWNoaW5lKCkgPworCQkJCQkJInJlZ2lvbiIgOiAic3RhdGVtYWNoaW5lIiApOworCisJCW9zIDw8IFRBQiA8PCAiLyoiIDw8IHNlcXVlbmNlTmFtZSA8PCAiOiBbIiA8PCBFT0xfSU5DUl9JTkRFTlQKKwkJCQk8PCBzdHJfaGVhZGVyKCBtU3RhdGVzICkgPDwgREVDUl9JTkRFTlRfVEFCCisJCQkJPDwgIl0gLy8gZW5kICIgPDwgc2VxdWVuY2VOYW1lIDw8ICIqLyIgPDwgRU9MMl9GTFVTSDsKKworLy8JCW9zIDw8IFRBQiA8PCBzZXF1ZW5jZU5hbWUgPDwgIjoiIDw8IEVPTF9JTkNSX0lOREVOVDsKKy8vCisvLwkJY29uc3Rfc3RhdGVfaXRlcmF0b3IgaXQgPSBzdGF0ZV9iZWdpbigpOworLy8JCWNvbnN0X3N0YXRlX2l0ZXJhdG9yIGVuZEl0ID0gc3RhdGVfZW5kKCk7CisvLwkJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisvLwkJeworLy8JCQkoaXQpLT50b1N0cmVhbShvcyk7CisvLwkJCW9zIDw8IEVPTDsKKy8vCQl9CisvLwkJb3MgPDwgREVDUl9JTkRFTlQ7CisJfQorCisJaWYoIGhhc01hY2hpbmUoKSApCisJeworCQlvcyA8PCBUQUIgPDwgZ2V0TmFtZUlEKCkgLypjb21wb3NpdGUqLyA8PCAiOiIgPDwgRU9MX0lOQ1JfSU5ERU5UOworCisJCWNvbnN0X21hY2hpbmVfaXRlcmF0b3IgaXQgPSBtYWNoaW5lX2JlZ2luKCk7CisJCWNvbnN0X21hY2hpbmVfaXRlcmF0b3IgZW5kSXQgPSBtYWNoaW5lX2VuZCgpOworCQlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJeworCQkJKGl0KS0+dG9TdHJlYW0ob3MpOworCQkJb3MgPDwgRU9MOworCQl9CisJCW9zIDw8IERFQ1JfSU5ERU5UOworCX0KKworCWlmKCBoYXNJbnN0YW5jZVN0YXRpYygpICkKKwl7CisJCW9zIDw8IFRBQiA8PCAiLyppbnN0YW5jZTogWyIgPDwgRU9MX0lOQ1JfSU5ERU5UCisJCQkJPDwgc3RyX2hlYWRlciggbUluc3RhbmNlU3RhdGljcyApIDw8IERFQ1JfSU5ERU5UX1RBQgorCQkJCTw8ICJdIC8vIGVuZCBpbnN0YW5jZSovIiA8PCBFT0wyX0ZMVVNIOworCisvLwkJb3MgPDwgVEFCIDw8ICJpbnN0YW5jZToiIDw8IEVPTF9JTkNSX0lOREVOVDsKKy8vCisvLwkJY29uc3RfaW5zdGFuY2VfaXRlcmF0b3IgaXQgPSBpbnN0YW5jZV9iZWdpbigpOworLy8JCWNvbnN0X2luc3RhbmNlX2l0ZXJhdG9yIGVuZEl0ID0gaW5zdGFuY2VfZW5kKCk7CisvLwkJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisvLwkJeworLy8JCQkoaXQpLT50b1N0cmVhbShvcyk7CisvLwkJfQorLy8JCW9zIDw8IERFQ1JfSU5ERU5UOworCX0KKworCWlmKCBoYXNJbnN0YW5jZUR5bmFtaWMoKSApCisJeworLy8JCW9zIDw8IFRBQiA8PCAiLyojZHluYW1pYyBpbnN0YW5jZTogWyIgPDwgRU9MX0lOQ1JfSU5ERU5UCisvLwkJCQk8PCBzdHJfaGVhZGVyKCBtSW5zdGFuY2VEeW5hbWljcyApIDw8IERFQ1JfSU5ERU5UX1RBQgorLy8JCQkJPDwgIl0gLy8gZW5kIGR5bmFtaWMqLyIgPDwgRU9MMl9GTFVTSDsKKworCQlvcyA8PCBUQUIgPDwgImluc3RhbmNlI2R5bmFtaWM6IiA8PCBFT0xfSU5DUl9JTkRFTlQ7CisJCWNvbnN0X21hY2hpbmVfaXRlcmF0b3IgaXQgPSBpbnN0YW5jZV9keW5hbWljX2JlZ2luKCk7CisJCWNvbnN0X21hY2hpbmVfaXRlcmF0b3IgZW5kSXQgPSBpbnN0YW5jZV9keW5hbWljX2VuZCgpOworCQlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJeworCQkJKGl0KS0+dG9TdHJlYW0ob3MpOworCQkJb3MgPDwgRU9MOworCQl9CisJCW9zIDw8IERFQ1JfSU5ERU5UOworCX0KKworCW9zIDw8IHN0ZDo6Zmx1c2g7Cit9CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvaW5mcmFzdHJ1Y3R1cmUvQ29tcG9zaXRlUGFydC5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL0NvbXBvc2l0ZVBhcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2IzZDAxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL0NvbXBvc2l0ZVBhcnQuaApAQCAtMCwwICsxLDM2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDI5IG1hcnMgMjAxNgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEZNTF9JTkZSQVNUUlVDVFVSRV9DT01QT1NJVEVQQVJUX0hfCisjZGVmaW5lIEZNTF9JTkZSQVNUUlVDVFVSRV9DT01QT1NJVEVQQVJUX0hfCisKKyNpbmNsdWRlIDxmbWwvY29tbW9uL09iamVjdENsYXNzaWZpZXIuaD4KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vQkZDb250YWluZXIuaD4KKyNpbmNsdWRlIDxjb2xsZWN0aW9uL0NvbGxlY3Rpb24uaD4KKworI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9NYWNoaW5lLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIE1hY2hpbmU7CisKKworY2xhc3MgQ29tcG9zaXRlUGFydCA6CisJCXB1YmxpYyBPYmplY3RDbGFzc2lmaWVyLAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIENvbXBvc2l0ZVBhcnQgKQoreworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIENvbXBvc2l0ZVBhcnQgKQorCisKK3B1YmxpYzoKKwkvKioKKwkgKiBUWVBFREVGCisJICovCisJdHlwZWRlZiBUYWJsZU9mQkZfVDwgTWFjaGluZSA+ICBUYWJsZU9mTWFjaGluZTsKKworCXR5cGVkZWYgVGFibGVPZk1hY2hpbmU6OmNvbnN0X3Jhd19pdGVyYXRvciAgY29uc3RfcHJvY2VkdXJlX2l0ZXJhdG9yOworCisJdHlwZWRlZiBUYWJsZU9mTWFjaGluZTo6Y29uc3RfcmF3X2l0ZXJhdG9yICBjb25zdF9zdGF0ZV9pdGVyYXRvcjsKKworCXR5cGVkZWYgVGFibGVPZk1hY2hpbmU6OmNvbnN0X3Jhd19pdGVyYXRvciAgY29uc3RfbWFjaGluZV9pdGVyYXRvcjsKKworCXR5cGVkZWYgVGFibGVPZk1hY2hpbmU6OmNvbnN0X3Jhd19pdGVyYXRvciAgY29uc3RfaW5zdGFuY2VfaXRlcmF0b3I7CisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBBVFRSSUJVVEVTCisJICovCisJVGFibGVPZk1hY2hpbmUgbVByb2NlZHVyZXM7CisKKwlUYWJsZU9mTWFjaGluZSBtU3RhdGVzOworCisJVGFibGVPZk1hY2hpbmUgbU1hY2hpbmVzOworCisJVGFibGVPZk1hY2hpbmUgbUluc3RhbmNlU3RhdGljczsKKworCVRhYmxlT2ZNYWNoaW5lIG1JbnN0YW5jZUR5bmFtaWNzOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlDb21wb3NpdGVQYXJ0KE1hY2hpbmUgKiBhQ29udGFpbmVyLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEID0gImNvbXBvc2l0ZSIpCisJOiBPYmplY3RDbGFzc2lmaWVyKCBDTEFTU19LSU5EX1QoIENvbXBvc2l0ZVBhcnQgKSAsIGFDb250YWluZXIgLCBhTmFtZUlEICksCisJbVByb2NlZHVyZXMoICksCisJbVN0YXRlcyggKSwKKwltTWFjaGluZXMoICksCisJbUluc3RhbmNlU3RhdGljcyggKSwKKwltSW5zdGFuY2VEeW5hbWljcyggKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkNvbXBvc2l0ZVBhcnQoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBESVNQQVRDSAorCSAqIG1Pd25lZEVsZW1lbnRzCisJICovCisJdm9pZCBkaXNwYXRjaE93bmVkRWxlbWVudChjb25zdCBCRiAmIGFuRWxlbWVudCk7CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1Qcm9jZWR1cmVzCisJICovCisJaW5saW5lIGNvbnN0IFRhYmxlT2ZNYWNoaW5lICYgZ2V0UHJvY2VkdXJlcygpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Qcm9jZWR1cmVzICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzUHJvY2VkdXJlKCkgY29uc3QKKwl7CisJCXJldHVybiggbVByb2NlZHVyZXMubm9uZW1wdHkoKSApOworCX0KKworCWlubGluZSB2b2lkIGFwcGVuZFByb2NlZHVyZShjb25zdCBCRiAmIGFQcm9jZWR1cmUpCisJeworCQltUHJvY2VkdXJlcy5hcHBlbmQoIGFQcm9jZWR1cmUgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzYXZlUHJvY2VkdXJlKE1hY2hpbmUgKiBhUHJvY2VkdXJlKQorCXsKKwkJbVByb2NlZHVyZXMuYXBwZW5kKCBCRihhUHJvY2VkdXJlKSApOworCX0KKworCisJLyoqCisJICogWyBDT05TVCBdIElURVJBVE9SCisJICovCisJaW5saW5lIGNvbnN0X3Byb2NlZHVyZV9pdGVyYXRvciBwcm9jZWR1cmVfYmVnaW4oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUHJvY2VkdXJlcy5iZWdpbigpICk7CisJfQorCisJaW5saW5lIGNvbnN0X3Byb2NlZHVyZV9pdGVyYXRvciBwcm9jZWR1cmVfZW5kKCkgY29uc3QKKwl7CisJCXJldHVybiggbVByb2NlZHVyZXMuZW5kKCkgKTsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIgZm9yIFBBUlNFUiAvIENPTVBJTEVSCisJICogUHJvY2VkdXJlCisJICovCisJaW5saW5lIGNvbnN0IEJGICYgZ2V0UHJvY2VkdXJlQnlOYW1lSUQoY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUHJvY2VkdXJlcy5nZXRCeU5hbWVJRChhTmFtZUlEKSApOworCX0KKworCWlubGluZSBNYWNoaW5lICogcmF3UHJvY2VkdXJlQnlOYW1lSUQoY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUHJvY2VkdXJlcy5yYXdCeU5hbWVJRChhTmFtZUlEKSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVN0YXRlcworCSAqLworCWlubGluZSBjb25zdCBUYWJsZU9mTWFjaGluZSAmIGdldFN0YXRlcygpIGNvbnN0CisJeworCQlyZXR1cm4oIG1TdGF0ZXMgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNTdGF0ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1TdGF0ZXMubm9uZW1wdHkoKSApOworCX0KKworCWlubGluZSB2b2lkIGFwcGVuZFN0YXRlKGNvbnN0IEJGICYgYVN0YXRlKQorCXsKKwkJbVN0YXRlcy5hcHBlbmQoIGFTdGF0ZSApOworCX0KKworCWlubGluZSB2b2lkIHNhdmVTdGF0ZShNYWNoaW5lICogYVN0YXRlKQorCXsKKwkJbVN0YXRlcy5hcHBlbmQoIEJGKGFTdGF0ZSkgKTsKKwl9CisKKworCS8qKgorCSAqIFsgQ09OU1QgXSBJVEVSQVRPUgorCSAqLworCWlubGluZSBjb25zdF9zdGF0ZV9pdGVyYXRvciBzdGF0ZV9iZWdpbigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1TdGF0ZXMuYmVnaW4oKSApOworCX0KKworCWlubGluZSBjb25zdF9zdGF0ZV9pdGVyYXRvciBzdGF0ZV9lbmQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtU3RhdGVzLmVuZCgpICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtT3V0Z29pbmdUcmFuc2l0aW9ucworCSAqLworCXZvaWQgYXBwZW5kT3V0Z29pbmdUcmFuc2l0aW9uVG9FdmVyeVN0YXRlKE1hY2hpbmUgKiBhR3JvdXBTdGF0ZSk7CisKKwl2b2lkIGFwcGVuZE91dGdvaW5nVHJhbnNpdGlvblRvU29tZVN0YXRlKE1hY2hpbmUgKiBhR3JvdXBTdGF0ZSk7CisKKwl2b2lkIGFwcGVuZE91dGdvaW5nVHJhbnNpdGlvblRvRXhjZXB0U3RhdGUoTWFjaGluZSAqIGFHcm91cFN0YXRlKTsKKworCXZvaWQgZXhwYW5kR3JvdXBTdGF0ZW1hY2hpbmUoKTsKKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbU1hY2hpbmVzCisJICovCisJaW5saW5lIGNvbnN0IFRhYmxlT2ZNYWNoaW5lICYgZ2V0TWFjaGluZXMoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtTWFjaGluZXMgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNNYWNoaW5lKCkgY29uc3QKKwl7CisJCXJldHVybiggbU1hY2hpbmVzLm5vbmVtcHR5KCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBhcHBlbmRNYWNoaW5lKGNvbnN0IEJGICYgYU1hY2hpbmUpCisJeworCQltTWFjaGluZXMuYXBwZW5kKCBhTWFjaGluZSApOworCX0KKworCWlubGluZSB2b2lkIHNhdmVNYWNoaW5lKE1hY2hpbmUgKiBhTWFjaGluZSkKKwl7CisJCW1NYWNoaW5lcy5hcHBlbmQoIEJGKGFNYWNoaW5lKSApOworCX0KKworCisJLyoqCisJICogQ09QWSBUTworCSAqLworCXZvaWQgY29weU1hY2hpbmVUbyhDb2xsZWN0aW9uPCBNYWNoaW5lICogPiAmIHJhd0NvbnRhaW5lcikgY29uc3Q7CisKKworCS8qKgorCSAqIFsgQ09OU1QgXSBJVEVSQVRPUgorCSAqLworCWlubGluZSBjb25zdF9tYWNoaW5lX2l0ZXJhdG9yIG1hY2hpbmVfYmVnaW4oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtTWFjaGluZXMuYmVnaW4oKSApOworCX0KKworCWlubGluZSBjb25zdF9tYWNoaW5lX2l0ZXJhdG9yIG1hY2hpbmVfZW5kKCkgY29uc3QKKwl7CisJCXJldHVybiggbU1hY2hpbmVzLmVuZCgpICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgZm9yIFBBUlNFUiAvIENPTVBJTEVSCisJICogTWFjaGluZQorCSAqLworCWlubGluZSBjb25zdCBCRiAmIGdldE1hY2hpbmVCeU5hbWVJRChjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1NYWNoaW5lcy5nZXRCeU5hbWVJRChhTmFtZUlEKSApOworCX0KKworCWlubGluZSBNYWNoaW5lICogcmF3TWFjaGluZUJ5TmFtZUlEKGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkgY29uc3QKKwl7CisJCXJldHVybiggbU1hY2hpbmVzLnJhd0J5TmFtZUlEKGFOYW1lSUQpICk7CisJfQorCisKKwlNYWNoaW5lICogcmF3RXhlY3V0YWJsZU1hY2hpbmVCeVF1YWxpZmllZE5hbWVJRCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkgY29uc3Q7CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1JbnN0YW5jZVN0YXRpY3MKKwkgKi8KKwlpbmxpbmUgY29uc3QgVGFibGVPZk1hY2hpbmUgJiBnZXRJbnN0YW5jZVN0YXRpY3MoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtSW5zdGFuY2VTdGF0aWNzICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzSW5zdGFuY2VTdGF0aWMoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtSW5zdGFuY2VTdGF0aWNzLm5vbmVtcHR5KCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBhcHBlbmRJbnN0YW5jZVN0YXRpYyhjb25zdCBCRiAmIGFuSW5zdGFuY2UpCisJeworCQltSW5zdGFuY2VTdGF0aWNzLmFwcGVuZCggYW5JbnN0YW5jZSApOworCX0KKworCWlubGluZSB2b2lkIHNhdmVJbnN0YW5jZVN0YXRpYyhNYWNoaW5lICogYW5JbnN0YW5jZSkKKwl7CisJCW1JbnN0YW5jZVN0YXRpY3MuYXBwZW5kKCBCRihhbkluc3RhbmNlKSApOworCX0KKworCisJLyoqCisJICogWyBDT05TVCBdIElURVJBVE9SCisJICovCisJaW5saW5lIGNvbnN0X2luc3RhbmNlX2l0ZXJhdG9yIGluc3RhbmNlX3N0YXRpY19iZWdpbigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1JbnN0YW5jZVN0YXRpY3MuYmVnaW4oKSApOworCX0KKworCWlubGluZSBjb25zdF9pbnN0YW5jZV9pdGVyYXRvciBpbnN0YW5jZV9zdGF0aWNfZW5kKCkgY29uc3QKKwl7CisJCXJldHVybiggbUluc3RhbmNlU3RhdGljcy5lbmQoKSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUluc3RhbmNlRHluYW1pY3MKKwkgKi8KKwlpbmxpbmUgY29uc3QgVGFibGVPZk1hY2hpbmUgJiBnZXRJbnN0YW5jZUR5bmFtaWNzKCkgY29uc3QKKwl7CisJCXJldHVybiggbUluc3RhbmNlRHluYW1pY3MgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNJbnN0YW5jZUR5bmFtaWMoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtSW5zdGFuY2VEeW5hbWljcy5ub25lbXB0eSgpICk7CisJfQorCisJaW5saW5lIHZvaWQgYXBwZW5kSW5zdGFuY2VEeW5hbWljKGNvbnN0IEJGICYgYW5JbnN0YW5jZUR5bmFtaWMpCisJeworCQltSW5zdGFuY2VEeW5hbWljcy5hcHBlbmQoIGFuSW5zdGFuY2VEeW5hbWljICk7CisJfQorCisJaW5saW5lIHZvaWQgc2F2ZUluc3RhbmNlRHluYW1pYyhNYWNoaW5lICogYW5JbnN0YW5jZUR5bmFtaWMpCisJeworCQltSW5zdGFuY2VEeW5hbWljcy5hcHBlbmQoIEJGKGFuSW5zdGFuY2VEeW5hbWljKSApOworCX0KKworCisJLyoqCisJICogWyBDT05TVCBdIElURVJBVE9SCisJICovCisJaW5saW5lIGNvbnN0X2luc3RhbmNlX2l0ZXJhdG9yIGluc3RhbmNlX2R5bmFtaWNfYmVnaW4oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtSW5zdGFuY2VEeW5hbWljcy5iZWdpbigpICk7CisJfQorCisJaW5saW5lIGNvbnN0X2luc3RhbmNlX2l0ZXJhdG9yIGluc3RhbmNlX2R5bmFtaWNfZW5kKCkgY29uc3QKKwl7CisJCXJldHVybiggbUluc3RhbmNlRHluYW1pY3MuZW5kKCkgKTsKKwl9CisKKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwl2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworfTsKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qIEZNTF9JTkZSQVNUUlVDVFVSRV9DT01QT1NJVEVQQVJUX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvaW5mcmFzdHJ1Y3R1cmUvQ29ubmVjdG9yLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9Db25uZWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZWE5NTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvaW5mcmFzdHJ1Y3R1cmUvQ29ubmVjdG9yLmNwcApAQCAtMCwwICsxLDY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTggZsOpdnIuIDIwMTEKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkNvbm5lY3Rvci5oIgorCisjaW5jbHVkZSA8Zm1sL2xpYi9JQ29tUG9pbnQuaD4KKworI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9JbnRlcmFjdGlvblBhcnQuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvTWFjaGluZS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitzdGQ6OnN0cmluZyBDb25uZWN0b3I6OkFOT05ZTV9JRCA9ICJfI2Nvbm5lY3RvciI7CisKKworLyoqCisgKiBDT05TVFJVQ1RPUgorICogRGVmYXVsdAorICovCitDb25uZWN0b3I6OkNvbm5lY3Rvcihjb25zdCBJbnRlcmFjdGlvblBhcnQgJiBhbkludGVyYWN0aW9uUGFydCkKKzogT2JqZWN0RWxlbWVudCggQ0xBU1NfS0lORF9UKCBDb25uZWN0b3IgKSwgYW5JbnRlcmFjdGlvblBhcnQuZ2V0Q29udGFpbmVyKCkpLAorQ29tUHJvdG9jb2woIFBST1RPQ09MX1VOREVGSU5FRF9LSU5EICksCittQ29tUm91dGVzKCApCit7CisJLy8hISBOT1RISU5HCit9CisKKworLyoqCisgKiBTZXJpYWxpemF0aW9uCisgKi8KK3ZvaWQgQ29ubmVjdG9yOjp0b1N0cmVhbShPdXRTdHJlYW0gJiBvdXQpIGNvbnN0Cit7CisJb3V0IDw8IFRBQiA8PCBnZXRNb2RpZmllcigpLnRvU3RyaW5nKCkKKwkJPDwgKGlzUG9ydCgpID8gImNvbm5lY3RvciIgOiAicm91dGUiKTsKKworCXRvU3RyZWFtUHJvdG9jb2xDYXN0KCBvdXQgLCB0cnVlICkgPDwgIiAiIDw8IGdldE5hbWVJRCgpIDw8ICAiIHsiIDw8IEVPTDsKKworCWlmKCBtQ29tUm91dGVzLm5vbmVtcHR5KCkgKQorCXsKKwkJU2NvcGVJbmNySW5kZW50IGFzaWkob3V0KTsKKworCQlyb3V0ZV9pdGVyYXRvciBlbmRJdCA9IG1Db21Sb3V0ZXMuZW5kKCk7CisJCWZvciggcm91dGVfaXRlcmF0b3IgaXQgPSBtQ29tUm91dGVzLmJlZ2luKCkgOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCQl7CisJCQkoKml0KS0+dG9TdHJlYW0ob3V0KTsKKwkJfQorCX0KKworCW91dCA8PCBUQUIgPDwgIn0iIDw8IEVPTCA8PCBzdGQ6OmZsdXNoOworfQorCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9Db25uZWN0b3IuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9Db25uZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjE4OTNhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL0Nvbm5lY3Rvci5oCkBAIC0wLDAgKzEsMTM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTggZsOpdnIuIDIwMTEKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBGTUxfSU5GUkFTVFJVQ1RVUkVfQ09OTkVDVE9SX0hfCisjZGVmaW5lIEZNTF9JTkZSQVNUUlVDVFVSRV9DT05ORUNUT1JfSF8KKworI2luY2x1ZGUgPGZtbC9jb21tb24vT2JqZWN0RWxlbWVudC5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Db21Qcm90b2NvbC5oPgorCisjaW5jbHVkZSA8Y29tbW9uL0F2bVBvaW50ZXIuaD4KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vVHlwZWRlZi5oPgorCisKKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvQ29tUm91dGUuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworY2xhc3MgSW50ZXJhY3Rpb25QYXJ0OworCisKK2NsYXNzIENvbm5lY3RvciA6CisJCXB1YmxpYyBPYmplY3RFbGVtZW50LAorCQlwdWJsaWMgQ29tUHJvdG9jb2wsCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggQ29ubmVjdG9yICkKK3sKKworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBDb25uZWN0b3IgKQorCitwcm90ZWN0ZWQ6CisJLyoqCisJICogVFlQRURFRgorCSAqLworCXR5cGVkZWYgQVBMaXN0IDwgQ29tUm91dGUgKiA+IEFQTGlzdE9mQ29tUm91dGU7CisKK3B1YmxpYzoKKwkvKioKKwkgKiBUWVBFREVGCisJICovCisJdHlwZWRlZiBBUExpc3RPZkNvbVJvdXRlOjpjb25zdF9pdGVyYXRvciAgcm91dGVfaXRlcmF0b3I7CisKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlBUExpc3RPZkNvbVJvdXRlIG1Db21Sb3V0ZXM7CisKKworcHVibGljOgorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQ29ubmVjdG9yKGNvbnN0IEludGVyYWN0aW9uUGFydCAmIGFuSW50ZXJhY3Rpb25QYXJ0KTsKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5Db25uZWN0b3IoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtQ29tUm91dGVzCisJICovCisJaW5saW5lIHJvdXRlX2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QKKwl7CisJCXJldHVybiggbUNvbVJvdXRlcy5iZWdpbigpICk7CisJfQorCisJaW5saW5lIHJvdXRlX2l0ZXJhdG9yIGVuZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Db21Sb3V0ZXMuZW5kKCkgKTsKKwl9CisKKworCWlubGluZSBBUExpc3RPZkNvbVJvdXRlICYgZ2V0Q29tUm91dGVzKCkKKwl7CisJCXJldHVybiggbUNvbVJvdXRlcyApOworCX0KKworCWlubGluZSBjb25zdCBBUExpc3RPZkNvbVJvdXRlICYgZ2V0Q29tUm91dGVzKCkgY29uc3QKKwl7CisJCXJldHVybiggbUNvbVJvdXRlcyApOworCX0KKworCWlubGluZSB2b2lkIGFwcGVuZENvbVJvdXRlKENvbVJvdXRlICogYUNvbVJvdXRlKQorCXsKKwkJbUNvbVJvdXRlcy5hcHBlbmQoIGFDb21Sb3V0ZSApOworCX0KKworCisJLyoqCisJICogU2VyaWFsaXphdGlvbgorCSAqLworCXZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3V0KSBjb25zdDsKKworCitwdWJsaWM6CisKKwkvKioKKwkgKiBBVFRSSUJVVEVTCisJICovCisJc3RhdGljIHN0ZDo6c3RyaW5nIEFOT05ZTV9JRDsKKworCWlubGluZSBib29sIGlzQW5vbnltSUQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXROYW1lSUQoKS5lbXB0eSgpIHx8IChnZXROYW1lSUQoKS5maW5kKEFOT05ZTV9JRCkgPT0gMCkgKTsKKwl9CisKK307CisKKworfQorCisjZW5kaWYgLyogRk1MX0lORlJBU1RSVUNUVVJFX0NPTk5FQ1RPUl9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL0RhdGFUeXBlLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9EYXRhVHlwZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q0OGRmMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9EYXRhVHlwZS5jcHAKQEAgLTAsMCArMSw3OTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxNSBqYW52LiAyMDE0CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJEYXRhVHlwZS5oIgorCisjaW5jbHVkZSA8Zm1sL3R5cGUvQmFzZVR5cGVTcGVjaWZpZXIuaD4KKyNpbmNsdWRlIDxmbWwvdHlwZS9Db250YWluZXJUeXBlU3BlY2lmaWVyLmg+CisjaW5jbHVkZSA8Zm1sL3R5cGUvVHlwZU1hbmFnZXIuaD4KKworI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9CZWhhdmlvcmFsUGFydC5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9NYWNoaW5lLmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1JvdXRpbmUuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvUHJvcGVydHlQYXJ0Lmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK3N0ZDo6c3RyaW5nIERhdGFUeXBlOjpBTk9OWU1fSUQgPSAiXyN0eXBlIjsKKworCisvKioKKyAqIENPTlNUUlVDVE9SCisgKiBJbnRlcnZhbAorICovCitEYXRhVHlwZTo6RGF0YVR5cGUoTWFjaGluZSAqIGFDb250YWluZXIsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwKKwkJY29uc3QgQkYgJiBhVHlwZVNwZWNpZmllciwgSUludGVydmFsS2luZDo6S0lORCBhbkludGVydmFsS2luZCwKKwkJY29uc3QgQkYgJiBhbkluZmltdW0sIGNvbnN0IEJGICYgYVN1cHJlbXVtKQorOiBPYmplY3RFbGVtZW50KENMQVNTX0tJTkRfVCggRGF0YVR5cGUgKSwgYUNvbnRhaW5lciwgYU5hbWVJRCksCittU3BlY2lmaWVyS2luZCggVFlQRV9JTlRFUlZBTF9TUEVDSUZJRVIgKSwKK21UeXBlU3BlY2lmaWVyKCBhVHlwZVNwZWNpZmllciApLAorbUNvbnN0cmFpbnRSb3V0aW5lKCBOVUxMICksCisKK21NaW5pbXVtU2l6ZSggMSApLAorbU1heGltdW1TaXplKCAxICksCisKK21Qcm9wZXJ0eVBhcnQoIE5VTEwgKSwKK21CZWhhdmlvcmFsU3BlY2lmaWNhdGlvbiggTlVMTCApLAorCittSW50ZXJ2YWxLaW5kKCBhbkludGVydmFsS2luZCApLAorbUluZmltdW0oIGFuSW5maW11bSApLAorbVN1cHJlbXVtKCBhU3VwcmVtdW0gKQoreworLy8hISBOT1RISU5HCit9CisKKy8qKgorICogQ09OU1RSVUNUT1IKKyAqIENvbnRhaW5lcgorICogQWxpYXMKKyAqLworRGF0YVR5cGU6OkRhdGFUeXBlKE9iamVjdEVsZW1lbnQgKiBhQ29udGFpbmVyLAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsCisJCWF2bV90eXBlX3NwZWNpZmllcl9raW5kX3QgYVNwZWNpZmllcktpbmQsCisJCWNvbnN0IEJGICYgYVR5cGVTcGVjaWZpZXIsIGxvbmcgbWF4U2l6ZSkKKzogT2JqZWN0RWxlbWVudChDTEFTU19LSU5EX1QoIERhdGFUeXBlICksIGFDb250YWluZXIsIGFOYW1lSUQpLAorbVNwZWNpZmllcktpbmQoIGFTcGVjaWZpZXJLaW5kICksCittVHlwZVNwZWNpZmllciggYVR5cGVTcGVjaWZpZXIgKSwKK21Db25zdHJhaW50Um91dGluZSggTlVMTCApLAorCittTWluaW11bVNpemUoIDAgKSwKK21NYXhpbXVtU2l6ZSggbWF4U2l6ZSApLAorCittUHJvcGVydHlQYXJ0KCBOVUxMICksCittQmVoYXZpb3JhbFNwZWNpZmljYXRpb24oIE5VTEwgKSwKKworbUludGVydmFsS2luZCggSUludGVydmFsS2luZDo6Q0xPU0VEICksCittSW5maW11bSggKSwKK21TdXByZW11bSggKQoreworCS8vISEgTk9USElORworfQorCisvKioKKyAqIENPTlNUUlVDVE9SCisgKiBFbnVtCisgKiBTdHJ1Y3R1cmUKKyAqIFVuaW9uCisgKi8KK0RhdGFUeXBlOjpEYXRhVHlwZShPYmplY3RFbGVtZW50ICogYUNvbnRhaW5lciwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELAorCQlhdm1fdHlwZV9zcGVjaWZpZXJfa2luZF90IGFTcGVjaWZpZXJLaW5kKQorOiBPYmplY3RFbGVtZW50KENMQVNTX0tJTkRfVCggRGF0YVR5cGUgKSwgYUNvbnRhaW5lciwgYU5hbWVJRCksCittU3BlY2lmaWVyS2luZCggYVNwZWNpZmllcktpbmQgKSwKK21UeXBlU3BlY2lmaWVyKCApLAorbUNvbnN0cmFpbnRSb3V0aW5lKCBOVUxMICksCisKK21NaW5pbXVtU2l6ZSggMSApLAorbU1heGltdW1TaXplKCAxICksCisKK21Qcm9wZXJ0eVBhcnQoIE5VTEwgKSwKK21CZWhhdmlvcmFsU3BlY2lmaWNhdGlvbiggTlVMTCApLAorCittSW50ZXJ2YWxLaW5kKCBJSW50ZXJ2YWxLaW5kOjpDTE9TRUQgKSwKK21JbmZpbXVtKCApLAorbVN1cHJlbXVtKCApCit7CisJLy8hISBOT1RISU5HCit9CisKKworLyoqCisgKiBDT05TVFJVQ1RPUgorICogQ29weQorICovCitEYXRhVHlwZTo6RGF0YVR5cGUoY29uc3QgRGF0YVR5cGUgJiBhRGF0YVR5cGUpCis6IE9iamVjdEVsZW1lbnQoIGFEYXRhVHlwZSApLAorbVNwZWNpZmllcktpbmQoIGFEYXRhVHlwZS5tU3BlY2lmaWVyS2luZCApLAorbVR5cGVTcGVjaWZpZXIoIGFEYXRhVHlwZS5tVHlwZVNwZWNpZmllciApLAorbUNvbnN0cmFpbnRSb3V0aW5lKCBhRGF0YVR5cGUubUNvbnN0cmFpbnRSb3V0aW5lICksCisKK21NaW5pbXVtU2l6ZSggYURhdGFUeXBlLm1NaW5pbXVtU2l6ZSApLAorbU1heGltdW1TaXplKCBhRGF0YVR5cGUubU1heGltdW1TaXplICksCisKK21Qcm9wZXJ0eVBhcnQoIChhRGF0YVR5cGUubVByb3BlcnR5UGFydCA9PSBOVUxMKSA/CisJTlVMTCA6IG5ldyBQcm9wZXJ0eVBhcnQoICooYURhdGFUeXBlLm1Qcm9wZXJ0eVBhcnQpICkgKSwKKworbUJlaGF2aW9yYWxTcGVjaWZpY2F0aW9uKCAoYURhdGFUeXBlLm1CZWhhdmlvcmFsU3BlY2lmaWNhdGlvbiA9PSBOVUxMKSA/CisJTlVMTCA6IG5ldyBCZWhhdmlvcmFsUGFydCggKihhRGF0YVR5cGUubUJlaGF2aW9yYWxTcGVjaWZpY2F0aW9uKSApICksCisKKworbUludGVydmFsS2luZCggYURhdGFUeXBlLm1JbnRlcnZhbEtpbmQgKSwKK21JbmZpbXVtKCBhRGF0YVR5cGUubUluZmltdW0gKSwKK21TdXByZW11bSggYURhdGFUeXBlLm1TdXByZW11bSApCit7CisJLy8hISBOT1RISU5HCit9CisKKworLyoqCisgKiBERVNUUlVDVE9SCisgKi8KK0RhdGFUeXBlOjp+RGF0YVR5cGUoKQoreworCWRlbGV0ZSggbVByb3BlcnR5UGFydCApOworCisJZGVsZXRlKCBtQmVoYXZpb3JhbFNwZWNpZmljYXRpb24gKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIElOVEVSVkFMCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8qKgorICogQ09OU1RSVUNUT1IKKyAqIEludGVydmFsCisgKi8KK0RhdGFUeXBlICogRGF0YVR5cGU6Om5ld0ludGVydmFsKAorCQlNYWNoaW5lICogYUNvbnRhaW5lciwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELAorCQljb25zdCBCRiAmIGFUeXBlU3BlY2lmaWVyLCBJSW50ZXJ2YWxLaW5kOjpLSU5EIGFuSW50ZXJ2YWxLaW5kLAorCQljb25zdCBCRiAmIGFuSW5maW11bSwgY29uc3QgQkYgJiBhU3VwcmVtdW0pCit7CisJcmV0dXJuKCBuZXcgRGF0YVR5cGUoYUNvbnRhaW5lciwgYU5hbWVJRCwgYVR5cGVTcGVjaWZpZXIsCisJCQlhbkludGVydmFsS2luZCwgYW5JbmZpbXVtLCBhU3VwcmVtdW0pICk7Cit9CisKKy8qKgorICogR0VUVEVSCisgKiBJbnRlcnZhbCBMZW5ndGgKKyAqLworYXZtX2ludGVnZXJfdCBEYXRhVHlwZTo6Z2V0SW50ZXJ2YWxMZW5ndGgoKQoreworCWF2bV9pbnRlZ2VyX3QgaW5mQm91bmQgPSBBVk1fTlVNRVJJQ19NSU5fSU5URUdFUjsKKwlhdm1faW50ZWdlcl90IHN1cEJvdW5kID0gQVZNX05VTUVSSUNfTUFYX0lOVEVHRVI7CisKKwlpZiggbUluZmltdW0uaXNVSW50ZWdlcigpICkKKwl7CisJCWluZkJvdW5kID0gbUluZmltdW0udG9VSW50ZWdlcigpOworCX0KKwllbHNlIGlmKCBtSW5maW11bS5pczwgVmFyaWFibGUgPigpICkKKwl7CisJCVZhcmlhYmxlICogYVZhciA9IG1JbmZpbXVtLnRvX3B0cjwgVmFyaWFibGUgPigpOworCisJCWlmKCBhVmFyLT5oYXNWYWx1ZSgpICYmIGFWYXItPmdldFZhbHVlKCkuaXNVSW50ZWdlcigpICkKKwkJeworCQkJaW5mQm91bmQgPSBhVmFyLT5nZXRWYWx1ZSgpLnRvVUludGVnZXIoKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybiggLTEgKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlyZXR1cm4oIC0xICk7CisJfQorCisKKwlpZiggbVN1cHJlbXVtLmlzVUludGVnZXIoKSApCisJeworCQlzdXBCb3VuZCA9IG1TdXByZW11bS50b1VJbnRlZ2VyKCk7CisJfQorCWVsc2UgaWYoIG1TdXByZW11bS5pczwgVmFyaWFibGUgPigpICkKKwl7CisJCVZhcmlhYmxlICogYVZhciA9IG1TdXByZW11bS50b19wdHI8IFZhcmlhYmxlID4oKTsKKworCQlpZiggYVZhci0+aGFzVmFsdWUoKSAmJiBhVmFyLT5nZXRWYWx1ZSgpLmlzVUludGVnZXIoKSApCisJCXsKKwkJCXN1cEJvdW5kID0gYVZhci0+Z2V0VmFsdWUoKS50b1VJbnRlZ2VyKCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4oIC0xICk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuKCAtMSApOworCX0KKworCisJcmV0dXJuKCBzdXBCb3VuZCAtIGluZkJvdW5kICsgKCBpc0NMT1NFRCgpID8gMSA6IDAgKSApOworfQorCisKKworLyoqCisgKiBTZXJpYWxpemF0aW9uCisgKi8KK3ZvaWQgRGF0YVR5cGU6OnRvU3RyZWFtSW50ZXJ2YWwoT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJb3MgPDwgIiBpbnRlcnZhbDwgIiA8PCBnZXRUeXBlU3BlY2lmaWVyKCkuc3RyKCkgPDwgc3RySXNvX0ludGVydmFsKCkgPDwgIiA+IjsKKworCWlmKCBoYXNDb25zdHJhaW50Um91dGluZSgpICkKKwl7CisJCW9zIDw8ICIgeyIgPDwgRU9MX0lOQ1JfSU5ERU5UOworCQlnZXRDb25zdHJhaW50Um91dGluZSgpLT50b1N0cmVhbShvcyk7CisJCW9zIDw8IERFQ1JfSU5ERU5UX1RBQiA8PCAifSI7CisJfQorCWVsc2UKKwl7CisJCW9zIDw8ICI7IjsKKwl9Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ09OVEFJTkVSCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKKyAqIENPTlNUUlVDVE9SCisgKiBDb250YWluZXIKKyAqLworRGF0YVR5cGUgKiBEYXRhVHlwZTo6bmV3Q29udGFpbmVyKAorCQlNYWNoaW5lICogYUNvbnRhaW5lciwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELAorCQlhdm1fdHlwZV9zcGVjaWZpZXJfa2luZF90IGFTcGVjaWZpZXJLaW5kLCBsb25nIGFTaXplKQoreworCXJldHVybiggbmV3IERhdGFUeXBlKGFDb250YWluZXIsIGFOYW1lSUQsCisJCQlhU3BlY2lmaWVyS2luZCwgVHlwZU1hbmFnZXI6OlVOSVZFUlNBTCwgYVNpemUpICk7Cit9CisKK0RhdGFUeXBlICogRGF0YVR5cGU6Om5ld0NvbnRhaW5lcigKKwkJTWFjaGluZSAqIGFDb250YWluZXIsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwKKwkJYXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCBhU3BlY2lmaWVyS2luZCwKKwkJY29uc3QgQkYgJiBhVHlwZVNwZWNpZmllciwgbG9uZyBhU2l6ZSkKK3sKKwlyZXR1cm4oIG5ldyBEYXRhVHlwZShhQ29udGFpbmVyLCBhTmFtZUlELAorCQkJYVNwZWNpZmllcktpbmQsIGFUeXBlU3BlY2lmaWVyLCBhU2l6ZSkgKTsKK30KKworLyoqCisgKiBTZXJpYWxpemF0aW9uCisgKi8KK3N0ZDo6c3RyaW5nIERhdGFUeXBlOjpzdHJDb250YWluZXJJZCgKKwkJYXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCBhU3BlY2lmaWVyS2luZCwgY29uc3QgQkYgJiBiYXNlVCwgbG9uZyBhU2l6ZSkKK3sKKwlzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworCisJaWYoIGFTcGVjaWZpZXJLaW5kICE9IFRZUEVfQVJSQVlfU1BFQ0lGSUVSICkKKwl7CisJCW9zcyA8PCBDb250YWluZXJUeXBlU3BlY2lmaWVyOjpzdHJTcGVjaWZpZXJLaW5nKGFTcGVjaWZpZXJLaW5kKSA8PCAiPCI7CisJfQorCisJaWYoIGJhc2VULnZhbGlkKCkgKQorCXsKKwkJaWYoIGJhc2VUID09IFR5cGVNYW5hZ2VyOjpVTklWRVJTQUwpCisJCXsKKwkJCW9zcyA8PCAiPHVuaXZlcnNhbD4iOworCQl9CisJCWVsc2UgaWYoIGJhc2VULmlzPCBCYXNlVHlwZVNwZWNpZmllciA+KCkgKQorCQl7CisJCQlvc3MgPDwgYmFzZVQudG9fcHRyPCBCYXNlVHlwZVNwZWNpZmllciA+KCktPnN0clQoKTsKKwkJfQorCQllbHNlIGlmKCBiYXNlVC5pczwgRGF0YVR5cGUgPigpICkKKwkJeworCQkJb3NzIDw8IGJhc2VULnRvX3B0cjwgRGF0YVR5cGUgPigpLT5zdHJUKCk7CisJCX0KKwkJZWxzZSBpZiggYmFzZVQuaXM8IE9iamVjdEVsZW1lbnQgPigpICkKKwkJeworCQkJb3NzIDw8IGJhc2VULnRvX3B0cjwgT2JqZWN0RWxlbWVudCA+KCktPmdldE5hbWVJRCgpOworCQl9CisJCWVsc2UKKwkJeworCQkJb3NzIDw8ICI8dHlwZT4iOworCQl9CisJfQorCWVsc2UKKwl7CisJCW9zcyA8PCAiPG51bGw+IjsKKwl9CisKKwlpZiggYVNwZWNpZmllcktpbmQgIT0gVFlQRV9BUlJBWV9TUEVDSUZJRVIgKQorCXsKKwkJaWYoIGFTaXplID49IDAgKQorCQl7CisJCQlvc3MgPDwgIiAsICIgIDw8IGFTaXplIDw8ICI+IjsKKwkJfQorCQllbHNlCisJCXsKKwkJCW9zcyA8PCAiICwgKiA+IjsKKwkJfQorCX0KKwllbHNlCisJeworCQlvc3MgPDwgIlsgIiAgPDwgYVNpemUgPDwgIiBdIjsKKwl9CisKKwlyZXR1cm4oIG9zcy5zdHIoKSApOworfQorCisKK3N0ZDo6c3RyaW5nIERhdGFUeXBlOjpzdHJDb250YWluZXJJZCgKKwkJYXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCBhU3BlY2lmaWVyS2luZCwgbG9uZyBhU2l6ZSkKK3sKKwlzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisKKwlvcyA8PCBDb250YWluZXJUeXBlU3BlY2lmaWVyOjpzdHJTcGVjaWZpZXJLaW5nKGFTcGVjaWZpZXJLaW5kKTsKKworCWlmKCBhU2l6ZSA+PSAwICkKKwl7CisJCW9zIDw8ICI8IiA8PCBhU2l6ZSA8PCAiPiI7CisJfQorCWVsc2UKKwl7CisJCW9zIDw8ICI8Kj4iOworCX0KKworCXJldHVybiggb3Muc3RyKCkgKTsKK30KKworCitzdGQ6OnN0cmluZyBEYXRhVHlwZTo6c3RyQ29udGFpbmVyVHlwZSgpIGNvbnN0Cit7CisJc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKworCWlmKCBpc1R5cGVkQXJyYXkoKSApCisJeworCQlpZiggbVR5cGVTcGVjaWZpZXIuaXM8IEJhc2VUeXBlU3BlY2lmaWVyID4oKSApCisJCXsKKwkJCW9zcyA8PCBtVHlwZVNwZWNpZmllci50b19wdHI8IEJhc2VUeXBlU3BlY2lmaWVyID4oKS0+c3RyVCgpOworCQl9CisJCWVsc2UgaWYoIG1UeXBlU3BlY2lmaWVyLmlzPCBEYXRhVHlwZSA+KCkgKQorCQl7CisJCQlvc3MgPDwgbVR5cGVTcGVjaWZpZXIudG9fcHRyPCBEYXRhVHlwZSA+KCktPnN0clQoKTsKKwkJfQorCisJCW9zcyA8PCAiWyAiIDw8IG1NYXhpbXVtU2l6ZSA8PCAiIF0iOworCX0KKwllbHNlCisJeworCQlvc3MgPDwgQ29udGFpbmVyVHlwZVNwZWNpZmllcjo6c3RyU3BlY2lmaWVyS2luZyhtU3BlY2lmaWVyS2luZCk7CisKKwkJaWYoIG1UeXBlU3BlY2lmaWVyLnZhbGlkKCkgKQorCQl7CisJCQlpZiggbVR5cGVTcGVjaWZpZXIuaXM8IEJhc2VUeXBlU3BlY2lmaWVyID4oKSApCisJCQl7CisJCQkJb3NzIDw8ICI8ICIgPDwgbVR5cGVTcGVjaWZpZXIudG9fcHRyPAorCQkJCQkJQmFzZVR5cGVTcGVjaWZpZXIgPigpLT5zdHJUKCk7CisJCQl9CisJCQllbHNlIGlmKCBtVHlwZVNwZWNpZmllci5pczwgRGF0YVR5cGUgPigpICkKKwkJCXsKKwkJCQlvc3MgPDwgIjwgIiA8PCBtVHlwZVNwZWNpZmllci50b19wdHI8IERhdGFUeXBlID4oKS0+c3RyVCgpOworCQkJfQorCQkJZWxzZSBpZiggbVR5cGVTcGVjaWZpZXIuaXM8IE9iamVjdEVsZW1lbnQgPigpICkKKwkJCXsKKwkJCQlvc3MgPDwgIjwgIgorCQkJCQk8PCBtVHlwZVNwZWNpZmllci50b19wdHI8IE9iamVjdEVsZW1lbnQgPigpLT5nZXROYW1lSUQoKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlvc3MgPDwgIjwgPyI7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlvc3MgPDwgIjwgbnVsbDx0eXBlPiI7CisJCX0KKworCQlpZiggbU1heGltdW1TaXplID49IDAgKQorCQl7CisJCQlvc3MgPDwgIiAsICIgPDwgbU1heGltdW1TaXplOworCQl9CisKKwkJb3NzIDw8ICIgPiI7CisJfQorCisJcmV0dXJuKCBvc3Muc3RyKCkgKTsKK30KKworCit2b2lkIERhdGFUeXBlOjp0b1N0cmVhbUNvbnRhaW5lcihPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlvcyA8PCAiICIgPDwgc3RyQ29udGFpbmVyVHlwZSgpOworCisJaWYoIGhhc0NvbnN0cmFpbnRSb3V0aW5lKCkgKQorCXsKKwkJb3MgPDwgIiB7IiA8PCBFT0xfSU5DUl9JTkRFTlQ7CisJCWdldENvbnN0cmFpbnRSb3V0aW5lKCktPnRvU3RyZWFtKG9zKTsKKwkJb3MgPDwgREVDUl9JTkRFTlRfVEFCIDw8ICJ9IjsKKwl9CisJZWxzZQorCXsKKwkJb3MgPDwgIjsiOworCX0KK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRU5VTUVSQVRJT0lOCisvLyBTVFJVQ1RVUkUKKy8vIFVOSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLyoqCisgKiBHRVRURVIKKyAqIG1Qcm9wZXJ0eVBhcnQKKyAqLworYm9vbCBEYXRhVHlwZTo6aGFzUHJvcGVydHkoKSBjb25zdAoreworCXJldHVybiggKG1Qcm9wZXJ0eVBhcnQgIT0gTlVMTCkKKwkJCSYmIG1Qcm9wZXJ0eVBhcnQtPm5vbmVtcHR5KCkgKTsKK30KKworLyoqCisgKiBHRVRURVIgLSBTRVRURVIKKyAqIG1CZWhhdmlvcmFsU3BlY2lmaWNhdGlvbgorICovCitCZWhhdmlvcmFsUGFydCAqIERhdGFUeXBlOjpnZXRVbmlxQmVoYXZpb3JQYXJ0KCkKK3sKKwlpZiggbUJlaGF2aW9yYWxTcGVjaWZpY2F0aW9uID09IE5VTEwgKQorCXsKKwkJbUJlaGF2aW9yYWxTcGVjaWZpY2F0aW9uID0gbmV3IEJlaGF2aW9yYWxQYXJ0KHRoaXMsICJtb2UiKTsKKwl9CisKKwlyZXR1cm4oIG1CZWhhdmlvcmFsU3BlY2lmaWNhdGlvbiApOworfQorCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEVOVU1FUkFUSU9JTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCisgKiBDT05TVFJVQ1RPUgorICogRW51bQorICovCitEYXRhVHlwZSAqIERhdGFUeXBlOjpuZXdFbnVtKAorCQljb25zdCBQcm9wZXJ0eVBhcnQgJiBhUHJvcGVydHlQYXJ0LCBjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpCit7CisJRGF0YVR5cGUgKiBuZXdEYXRhVHlwZSA9IG5ldyBEYXRhVHlwZSgKKwkJCWFQcm9wZXJ0eVBhcnQuZ2V0Q29udGFpbmVyKCksIGFOYW1lSUQsIFRZUEVfRU5VTV9TUEVDSUZJRVIgKTsKKworCW5ld0RhdGFUeXBlLT5zZXRQcm9wZXJ0eVBhcnQoIG5ldyBQcm9wZXJ0eVBhcnQobmV3RGF0YVR5cGUsICJzeW1ib2wiKSApOworCisJcmV0dXJuKCBuZXdEYXRhVHlwZSApOworfQorCisvKioKKyAqIEdFVFRFUgorICogRW51bWVyYXRpb24gU2l6ZQorICogSW50ZXJ2YWwgTGVuZ3RoCisgKi8KK2F2bV9zaXplX3QgRGF0YVR5cGU6OmdldEVudW1TaXplKCkKK3sKKwlyZXR1cm4oIChtUHJvcGVydHlQYXJ0ICE9IE5VTEwpID8gbVByb3BlcnR5UGFydC0+Z2V0VmFyaWFibGVzKCkuc2l6ZSgpIDogMCApOworfQorCisvKioKKyAqIEdFVFRFUiAtIFNFVFRFUgorICogbVZhcmlhYmxlcworICovCit2b2lkIERhdGFUeXBlOjphcHBlbmRWYXJpYWJsZShjb25zdCBCRiAmIGFWYXJpYWJsZSkKK3sKKwltUHJvcGVydHlQYXJ0LT5hcHBlbmRWYXJpYWJsZSggYVZhcmlhYmxlICk7Cit9CisKK3ZvaWQgRGF0YVR5cGU6OnNhdmVWYXJpYWJsZShWYXJpYWJsZSAqIGFWYXJpYWJsZSkKK3sKKwltUHJvcGVydHlQYXJ0LT5zYXZlT3duZWRWYXJpYWJsZSggYVZhcmlhYmxlICk7Cit9CisKKworLyoqCisgKiBTZXJpYWxpemF0aW9uCisgKi8KK3ZvaWQgRGF0YVR5cGU6OnRvU3RyZWFtRW51bShPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlvcyA8PCAiIGVudW0geyIgPDwgRU9MX0ZMVVNIOworCisJaWYoIG1Qcm9wZXJ0eVBhcnQtPmhhc1ZhcmlhYmxlKCkgKQorCXsKKwkJVGFibGVPZlZhcmlhYmxlOjpjb25zdF9yYXdfaXRlcmF0b3IgaXQgPQorCQkJCW1Qcm9wZXJ0eVBhcnQtPmdldFZhcmlhYmxlcygpLmJlZ2luKCk7CisJCVRhYmxlT2ZWYXJpYWJsZTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGVuZEl0ID0KKwkJCQltUHJvcGVydHlQYXJ0LT5nZXRWYXJpYWJsZXMoKS5lbmQoKTsKKworCQlvcyA8PCBUQUIyIDw8IChpdCktPmdldE5hbWVJRCgpOworCQlpZiggKGl0KS0+aGFzVmFsdWUoKSApCisJCXsKKwkJCW9zIDw8ICIgPSAiIDw8IChpdCktPnN0clZhbHVlKCk7CisJCX0KKwkJZm9yKCArK2l0IDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJeworCQkJb3MgPDwgIiwiIDw8IEVPTDsKKworCQkJb3MgPDwgVEFCMiA8PCAoaXQpLT5nZXROYW1lSUQoKTsKKwkJCWlmKCAoaXQpLT5oYXNWYWx1ZSgpICkKKwkJCXsKKwkJCQlvcyA8PCAiID0gIiA8PCAoaXQpLT5zdHJWYWx1ZSgpOworCQkJfQorCQl9CisJCW9zIDw8IEVPTDsKKwl9CisKKwlvcyA8PCBUQUIgPDwgIn0iOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTVFJVQ1RVUkUKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvKioKKyAqIENPTlNUUlVDVE9SCisgKiBTdHJ1Y3R1cmUKKyAqLworRGF0YVR5cGUgKiBEYXRhVHlwZTo6bmV3U3RydWN0dXJlKAorCQljb25zdCBQcm9wZXJ0eVBhcnQgJiBhUHJvcGVydHlQYXJ0LCBjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpCit7CisJRGF0YVR5cGUgKiBuZXdEYXRhVHlwZSA9IG5ldyBEYXRhVHlwZSgKKwkJCWFQcm9wZXJ0eVBhcnQuZ2V0Q29udGFpbmVyKCksIGFOYW1lSUQsIFRZUEVfQ0xBU1NfU1BFQ0lGSUVSICk7CisKKwluZXdEYXRhVHlwZS0+c2V0UHJvcGVydHlQYXJ0KCBuZXcgUHJvcGVydHlQYXJ0KG5ld0RhdGFUeXBlLCAicHJvcGVydHkiKSApOworCisJcmV0dXJuKCBuZXdEYXRhVHlwZSApOworfQorCisvKioKKyAqIFNlcmlhbGl6YXRpb24KKyAqLwordm9pZCBEYXRhVHlwZTo6dG9TdHJlYW1TdHJ1Y3R1cmUoT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJb3MgPDwgIiBzdHJ1Y3QgeyIgPDwgRU9MX0ZMVVNIOworCisJaWYoIGhhc1Byb3BlcnR5KCkgKQorCXsKKwkJbVByb3BlcnR5UGFydC0+dG9TdHJlYW0ob3MpOworCX0KKworCWlmKCBoYXNCZWhhdmlvcigpICYmIG1CZWhhdmlvcmFsU3BlY2lmaWNhdGlvbi0+aGFzQW55Um91dGluZSgpICkKKwl7CisJCW1CZWhhdmlvcmFsU3BlY2lmaWNhdGlvbi0+dG9TdHJlYW1BbnlSb3V0aW5lKCBvcyA8PCBFT0wgKTsKKwl9CisKKwlvcyA8PCBUQUIgPDwgIn0iOworfQorCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENIT0lDRQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8qKgorICogQ09OU1RSVUNUT1IKKyAqIENob2ljZQorICovCitEYXRhVHlwZSAqIERhdGFUeXBlOjpuZXdDaG9pY2UoCisJCWNvbnN0IFByb3BlcnR5UGFydCAmIGFQcm9wZXJ0eVBhcnQsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkKK3sKKwlEYXRhVHlwZSAqIG5ld0RhdGFUeXBlID0gbmV3IERhdGFUeXBlKAorCQkJYVByb3BlcnR5UGFydC5nZXRDb250YWluZXIoKSwgYU5hbWVJRCwgVFlQRV9DSE9JQ0VfU1BFQ0lGSUVSICk7CisKKwluZXdEYXRhVHlwZS0+c2V0UHJvcGVydHlQYXJ0KCBuZXcgUHJvcGVydHlQYXJ0KG5ld0RhdGFUeXBlLCAicHJvcGVydHkiKSApOworCisJcmV0dXJuKCBuZXdEYXRhVHlwZSApOworfQorCisvKioKKyAqIFNlcmlhbGl6YXRpb24KKyAqLwordm9pZCBEYXRhVHlwZTo6dG9TdHJlYW1DaG9pY2UoT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJb3MgPDwgIiBjaG9pY2UgeyIgPDwgRU9MX0ZMVVNIOworCisJaWYoIGhhc1Byb3BlcnR5KCkgKQorCXsKKwkJbVByb3BlcnR5UGFydC0+dG9TdHJlYW0ob3MpOworCX0KKworCW9zIDw8IFRBQiA8PCAifSI7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLyoqCisgKiBDT05TVFJVQ1RPUgorICogVW5pb24KKyAqLworRGF0YVR5cGUgKiBEYXRhVHlwZTo6bmV3VW5pb24oCisJCWNvbnN0IFByb3BlcnR5UGFydCAmIGFQcm9wZXJ0eVBhcnQsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkKK3sKKwlEYXRhVHlwZSAqIG5ld0RhdGFUeXBlID0gbmV3IERhdGFUeXBlKAorCQkJYVByb3BlcnR5UGFydC5nZXRDb250YWluZXIoKSwgYU5hbWVJRCwgVFlQRV9VTklPTl9TUEVDSUZJRVIgKTsKKworCW5ld0RhdGFUeXBlLT5zZXRQcm9wZXJ0eVBhcnQoIG5ldyBQcm9wZXJ0eVBhcnQobmV3RGF0YVR5cGUsICJwcm9wZXJ0eSIpICk7CisKKwlyZXR1cm4oIG5ld0RhdGFUeXBlICk7Cit9CisKKy8qKgorICogU2VyaWFsaXphdGlvbgorICovCit2b2lkIERhdGFUeXBlOjp0b1N0cmVhbVVuaW9uKE91dFN0cmVhbSAmIG9zKSBjb25zdAoreworCW9zIDw8ICIgdW5pb24geyIgPDwgRU9MX0ZMVVNIOworCisJaWYoIGhhc1Byb3BlcnR5KCkgKQorCXsKKwkJbVByb3BlcnR5UGFydC0+dG9TdHJlYW0ob3MpOworCX0KKworCW9zIDw8IFRBQiA8PCAifSI7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFMSUFTCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKKyAqIENPTlNUUlVDVE9SCisgKiBBbGlhcworICovCitEYXRhVHlwZSAqIERhdGFUeXBlOjpuZXdBbGlhcyhjb25zdCBQcm9wZXJ0eVBhcnQgJiBhUHJvcGVydHlQYXJ0LAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsIGNvbnN0IEJGICYgYVR5cGVTcGVjaWZpZXIpCit7CisJcmV0dXJuKCBuZXcgRGF0YVR5cGUoYVByb3BlcnR5UGFydC5nZXRDb250YWluZXIoKSwKKwkJCWFOYW1lSUQsIFRZUEVfQUxJQVNfU1BFQ0lGSUVSLCBhVHlwZVNwZWNpZmllciwgMSkgKTsKK30KKworLyoqCisgKiBTZXJpYWxpemF0aW9uCisgKi8KK3ZvaWQgRGF0YVR5cGU6OnRvU3RyZWFtQWxpYXMoT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJaWYoIG1UeXBlU3BlY2lmaWVyLmlzPCBCYXNlVHlwZVNwZWNpZmllciA+KCkgKQorCXsKKwkJb3MgPDwgIiAiIDw8IG1UeXBlU3BlY2lmaWVyLnRvX3B0cjwgQmFzZVR5cGVTcGVjaWZpZXIgPigpLT5zdHJUKCk7CisJfQorCWVsc2UgaWYoIG1UeXBlU3BlY2lmaWVyLmlzPCBEYXRhVHlwZSA+KCkgKQorCXsKKwkJb3MgPDwgIiAiIDw8IG1UeXBlU3BlY2lmaWVyLnRvX3B0cjwgRGF0YVR5cGUgPigpLT5zdHJUKCk7CisJfQorCWVsc2UKKwl7CisJCW9zIDw8IHN0cl9pbmRlbnQoIG1UeXBlU3BlY2lmaWVyICk7CisJfQorCisJaWYoIG1Db25zdHJhaW50Um91dGluZSE9IE5VTEwgKQorCXsKKwkJb3MgPDwgIiB7IiA8PCBFT0xfSU5DUl9JTkRFTlQ7CisJCW1Db25zdHJhaW50Um91dGluZS0+dG9TdHJlYW0ob3MpOworCQlvcyA8PCBERUNSX0lOREVOVF9UQUIgPDwgIn0iOworCX0KKwllbHNlCisJeworCQlvcyA8PCAiOyI7CisJfQorfQorCisKKworCisvKioKKyAqIFNlcmlhbGl6YXRpb24KKyAqLworc3RkOjpzdHJpbmcgRGF0YVR5cGU6OnN0clR5cGVTcGVjaWZpZXIoY29uc3QgQkYgJiBhVHlwZVNwZWNpZmllcikKK3sKKwlpZiggYVR5cGVTcGVjaWZpZXIudmFsaWQoKSApCisJeworCQlpZiggYVR5cGVTcGVjaWZpZXIuaXM8IEJhc2VUeXBlU3BlY2lmaWVyID4oKSApCisJCXsKKwkJCXJldHVybiBhVHlwZVNwZWNpZmllci50b19wdHI8IEJhc2VUeXBlU3BlY2lmaWVyID4oKS0+c3RyVCgpOworCQl9CisJCWVsc2UgaWYoIGFUeXBlU3BlY2lmaWVyLmlzPCBEYXRhVHlwZSA+KCkgKQorCQl7CisJCQlyZXR1cm4gYVR5cGVTcGVjaWZpZXIudG9fcHRyPCBEYXRhVHlwZSA+KCktPnN0clQoKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybiggT1NTKCkgPDwgInR5cGU8ICIgPDwgYVR5cGVTcGVjaWZpZXIuc3RyKCkgPDwgIj4iICk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuKCAidHlwZTxudWxsPiIgKTsKKwl9Cit9CisKKwordm9pZCBEYXRhVHlwZTo6c3RySGVhZGVyKE91dFN0cmVhbSAmIG9zKSBjb25zdAoreworCW9zIDw8IGdldE1vZGlmaWVyKCkudG9TdHJpbmcoKQorCQkJPDwgInR5cGUgIiA8PCBnZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOyAvLzw8IGdldE5hbWVJRCgpOworCisJaWYoIGhhc1VucmVzdHJpY3RlZE5hbWUoKSApCisJeworCQlvcyA8PCAiIFwiIiA8PCBnZXRVbnJlc3RyaWN0ZWROYW1lKCkgPDwgIlwiIjsKKwl9Cit9CisKKwordm9pZCBEYXRhVHlwZTo6dG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJaWYoIG9zLnByZWZlcmFibHlGUU4oKSApCisJeworCQlvcyA8PCBUQUIgPDwgZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsKKworCQlBVk1fREVCVUdfUkVGX0NPVU5URVIob3MpOworCisJCXJldHVybjsKKwl9CisKKwlvcyA8PCBUQUIgPDwgZ2V0TW9kaWZpZXIoKS50b1N0cmluZygpIDw8ICJ0eXBlICIgPDwgZ2V0TmFtZUlEKCk7CisKKworCWlmKCBoYXNUeXBlQ29udGFpbmVyKCkgKQorCXsKKwkJdG9TdHJlYW1Db250YWluZXIob3MpOworCX0KKwllbHNlIGlmKCBpc1R5cGVkSW50ZXJ2YWwoKSApCisJeworCQl0b1N0cmVhbUludGVydmFsKG9zKTsKKwl9CisJZWxzZSBpZiggaXNUeXBlZEVudW0oKSApCisJeworCQl0b1N0cmVhbUVudW0ob3MpOworCX0KKwllbHNlIGlmKCBpc1R5cGVkU3RydWN0dXJlKCkgKQorCXsKKwkJdG9TdHJlYW1TdHJ1Y3R1cmUob3MpOworCX0KKworCWVsc2UgaWYoIGlzVHlwZWRDaG9pY2UoKSApCisJeworCQl0b1N0cmVhbUNob2ljZShvcyk7CisJfQorCisJZWxzZSBpZiggaXNUeXBlZFVuaW9uKCkgKQorCXsKKwkJdG9TdHJlYW1Vbmlvbihvcyk7CisJfQorCisJZWxzZS8vIGlmKCBpc1R5cGVkQWxpYXMoKSApCisJeworCQl0b1N0cmVhbUFsaWFzKG9zKTsKKwl9CisKKworCW9zIDw8IEVPTF9GTFVTSDsKK30KKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9EYXRhVHlwZS5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL0RhdGFUeXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJhYTRiYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9EYXRhVHlwZS5oCkBAIC0wLDAgKzEsNTcyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTUgamFudi4gMjAxNAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFRZUEVERUZfSF8KKyNkZWZpbmUgVFlQRURFRl9IXworCisjaW5jbHVkZSA8Zm1sL2NvbW1vbi9PYmplY3RFbGVtZW50Lmg+CisKKyNpbmNsdWRlIDxjb21tb24vQkYuaD4KKworI2luY2x1ZGUgPGZtbC9saWIvSVR5cGVTcGVjaWZpZXIuaD4KKworI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Sb3V0aW5lLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBCZWhhdmlvcmFsUGFydDsKKworY2xhc3MgTWFjaGluZTsKKworY2xhc3MgUHJvcGVydHlQYXJ0OworCisKKworY2xhc3MgRGF0YVR5cGUgOgorCQlwdWJsaWMgT2JqZWN0RWxlbWVudCAsCisJCXB1YmxpYyBJVHlwZVNwZWNpZmllciwKKwkJcHVibGljIElJbnRlcnZhbEtpbmQsCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggRGF0YVR5cGUgKQoreworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIERhdGFUeXBlICkKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlhdm1fdHlwZV9zcGVjaWZpZXJfa2luZF90IG1TcGVjaWZpZXJLaW5kOworCisJLy8gZm9yIEFsaWFzLCBJbnRlcnZhbCBTdXBwb3J0LCBDb250YWluZXIgQ29udGVudHMKKwlCRiBtVHlwZVNwZWNpZmllcjsKKworCS8vIGZvciBnZW5lcmFsIHB1cnBvc2UKKwlSb3V0aW5lICogbUNvbnN0cmFpbnRSb3V0aW5lOworCisJLy8gZm9yIENvbnRhaW5lcgorCWxvbmcgbU1pbmltdW1TaXplOworCWxvbmcgbU1heGltdW1TaXplOworCisJLy8gZm9yIFN0cnVjdHVyZSBvciBVbmlvbgorCVByb3BlcnR5UGFydCAgICogbVByb3BlcnR5UGFydDsKKwlCZWhhdmlvcmFsUGFydCAqIG1CZWhhdmlvcmFsU3BlY2lmaWNhdGlvbjsKKworCisJLy8gZm9yIEludGVydmFsCisJSUludGVydmFsS2luZDo6S0lORCBtSW50ZXJ2YWxLaW5kOworCisJQkYgbUluZmltdW07CisJQkYgbVN1cHJlbXVtOworCisKK3ByaXZhdGU6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBJbnRlcnZhbAorCSAqLworCURhdGFUeXBlKE1hY2hpbmUgKiBhQ29udGFpbmVyLCBjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsCisJCQljb25zdCBCRiAmIGFUeXBlU3BlY2lmaWVyLCBJSW50ZXJ2YWxLaW5kOjpLSU5EIGFuSW50ZXJ2YWxLaW5kLAorCQkJY29uc3QgQkYgJiBhbkluZmltdW0sIGNvbnN0IEJGICYgYVN1cHJlbXVtKTsKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29udGFpbmVyCisJICogQWxpYXMKKwkgKi8KKwlEYXRhVHlwZShPYmplY3RFbGVtZW50ICogYUNvbnRhaW5lciwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELAorCQkJYXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCBhU3BlY2lmaWVyS2luZCwKKwkJCWNvbnN0IEJGICYgYVR5cGVTcGVjaWZpZXIsIGxvbmcgYVNpemUpOworCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBFbnVtCisJICogU3RydWN0dXJlCisJICogVW5pb24KKwkgKi8KKwlEYXRhVHlwZShPYmplY3RFbGVtZW50ICogYUNvbnRhaW5lciwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELAorCQkJYXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCBhU3BlY2lmaWVyS2luZCk7CisKKworcHVibGljOgorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJRGF0YVR5cGUoY29uc3QgRGF0YVR5cGUgJiBhRGF0YVR5cGUpOworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkRhdGFUeXBlKCk7CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIElUeXBlU3BlY2lmaWVyIEFQSQorCSAqLworCisJaW5saW5lIHZpcnR1YWwgY29uc3QgQmFzZVR5cGVTcGVjaWZpZXIgKiB0aGlzVHlwZVNwZWNpZmllcigpIGNvbnN0CisJeworCQlyZXR1cm4oIE5VTEwgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBhdm1fdHlwZV9zcGVjaWZpZXJfa2luZF90IGdldFR5cGVTcGVjaWZpZXJLaW5kKCkgY29uc3QKKwl7CisJCXJldHVybiggbVNwZWNpZmllcktpbmQgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1UeXBlU3BlY2lmaWVyCisJICovCisJaW5saW5lIGNvbnN0IEJGICYgZ2V0VHlwZVNwZWNpZmllcigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UeXBlU3BlY2lmaWVyICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzVHlwZVNwZWNpZmllcigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UeXBlU3BlY2lmaWVyLnZhbGlkKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRUeXBlU3BlY2lmaWVyKGNvbnN0IEJGICYgYVR5cGUpCisJeworCQltVHlwZVNwZWNpZmllciA9IGFUeXBlOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUNvbnN0cmFpbnQKKwkgKi8KKwlpbmxpbmUgUm91dGluZSAqIGdldENvbnN0cmFpbnRSb3V0aW5lKCkgY29uc3QKKwl7CisJCXJldHVybiggbUNvbnN0cmFpbnRSb3V0aW5lICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzQ29uc3RyYWludFJvdXRpbmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQ29uc3RyYWludFJvdXRpbmUgIT0gTlVMTCApOworCX0KKworCWlubGluZSB2b2lkIHNldENvbnN0cmFpbnRSb3V0aW5lKFJvdXRpbmUgKiBhQ29uc3RyYWludFJvdXRpbmUpCisJeworCQltQ29uc3RyYWludFJvdXRpbmUgPSBhQ29uc3RyYWludFJvdXRpbmU7CisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gSU5URVJWQUwKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBJbnRlcnZhbAorCSAqLworCXN0YXRpYyBEYXRhVHlwZSAqIG5ld0ludGVydmFsKAorCQkJTWFjaGluZSAqIGFDb250YWluZXIsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwKKwkJCWNvbnN0IEJGICYgYVR5cGVTcGVjaWZpZXIsIElJbnRlcnZhbEtpbmQ6OktJTkQgYW5JbnRlcnZhbEtpbmQsCisJCQljb25zdCBCRiAmIGFuSW5maW11bSwgY29uc3QgQkYgJiBhU3VwcmVtdW0pOworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUludGVydmFsS2luZAorCSAqIElJbnRlcnZhbEtpbmQgQVBJCisJICovCisJaW5saW5lIHZpcnR1YWwgSUludGVydmFsS2luZDo6S0lORCBnZXRJbnRlcnZhbEtpbmQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtSW50ZXJ2YWxLaW5kICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiB0aGUgSW50ZXJ2YWwgVHlwZVNwZWNpZmllciBTdXBwb3J0CisJICovCisJaW5saW5lIGNvbnN0IEJGICYgZ2V0SW50ZXJ2YWxUeXBlU3BlY2lmaWVyKCkgY29uc3QKKwl7CisJCXJldHVybiggbVR5cGVTcGVjaWZpZXIgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1JbmZpbXVtCisJICovCisJaW5saW5lIGNvbnN0IEJGICYgZ2V0SW50ZXJ2YWxJbmZpbXVtKCkgY29uc3QKKwl7CisJCXJldHVybiggbUluZmltdW0gKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNJbnRlcnZhbEluZmltdW0oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtSW5maW11bS52YWxpZCgpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0SW50ZXJ2YWxJbmZpbXVtKGNvbnN0IEJGICYgYW5JbmZpbXVtKQorCXsKKwkJbUluZmltdW0gPSBhbkluZmltdW07CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtU3VwcmVtdW0KKwkgKi8KKwlpbmxpbmUgY29uc3QgQkYgJiBnZXRJbnRlcnZhbFN1cHJlbXVtKCljb25zdAorCXsKKwkJcmV0dXJuKCBtU3VwcmVtdW0gKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNJbnRlcnZhbFN1cHJlbXVtKCkgY29uc3QKKwl7CisJCXJldHVybiggbVN1cHJlbXVtLnZhbGlkKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRJbnRlcnZhbFN1cHJlbXVtKGNvbnN0IEJGICYgYVN1cHJlbXVtKQorCXsKKwkJbVN1cHJlbXVtID0gYVN1cHJlbXVtOworCX0KKworCisJLyoqCisJICogR0VUVEVSCisJICogSW50ZXJ2YWwgTGVuZ3RoCisJICovCisJYXZtX2ludGVnZXJfdCBnZXRJbnRlcnZhbExlbmd0aCgpOworCisJLyoqCisJICogU2VyaWFsaXphdGlvbgorCSAqLworCWlubGluZSBzdGQ6OnN0cmluZyBzdHJJc29fSW50ZXJ2YWwoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBJSW50ZXJ2YWxLaW5kOjp0b19zdHJpbmcoCisJCQkJbUludGVydmFsS2luZCwgbUluZmltdW0sIG1TdXByZW11bSkgKTsKKwl9CisKKwlpbmxpbmUgc3RkOjpzdHJpbmcgc3RyVF9JbnRlcnZhbCgpIGNvbnN0CisJeworCQlpZiggZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKS5lbXB0eSgpIHx8IGdldE5hbWVJRCgpLmVtcHR5KCkgKQorCQl7CisJCQlyZXR1cm4oIHN0cklzb19JbnRlcnZhbCgpICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4oIGdldE5hbWVJRCgpICk7CisJCX0KKwl9CisKKwl2b2lkIHRvU3RyZWFtSW50ZXJ2YWwoT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQ09OVEFJTkVSCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29udGFpbmVyCisJICovCisJc3RhdGljIERhdGFUeXBlICogbmV3Q29udGFpbmVyKAorCQkJTWFjaGluZSAqIGFDb250YWluZXIsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwKKwkJCWF2bV90eXBlX3NwZWNpZmllcl9raW5kX3QgYVNwZWNpZmllcktpbmQsIGxvbmcgYVNpemUpOworCisJc3RhdGljIERhdGFUeXBlICogbmV3Q29udGFpbmVyKAorCQkJTWFjaGluZSAqIGFDb250YWluZXIsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwKKwkJCWF2bV90eXBlX3NwZWNpZmllcl9raW5kX3QgYVNwZWNpZmllcktpbmQsCisJCQljb25zdCBCRiAmIGFUeXBlU3BlY2lmaWVyLCBsb25nIGFTaXplKTsKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIHRoZSBDb250YWluZXIgVHlwZVNwZWNpZmllciBvZiBjb250ZW50cworCSAqLworCWlubGluZSBjb25zdCBCRiAmIGdldENvbnRlbnRzVHlwZVNwZWNpZmllcigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UeXBlU3BlY2lmaWVyICk7CisJfQorCisJaW5saW5lIGF2bV90eXBlX3NwZWNpZmllcl9raW5kX3QgZ2V0Q29udGFpbmVyU3BlY2lmaWVyS2luZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1TcGVjaWZpZXJLaW5kICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtTWluaW11bVNpemUKKwkgKi8KKwlpbmxpbmUgbG9uZyBnZXRNaW5pbXVtU2l6ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1NaW5pbXVtU2l6ZSApOworCX0KKworCWlubGluZSB2b2lkIHNldE1pbmltdW1TaXplKGxvbmcgbWluU2l6ZSkKKwl7CisJCW1NaW5pbXVtU2l6ZSA9IG1pblNpemU7CisJfQorCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbU1heGltdW1TaXplCisJICovCisJaW5saW5lIGxvbmcgZ2V0TWF4aW11bVNpemUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtTWF4aW11bVNpemUgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRNYXhpbXVtU2l6ZShsb25nIG1heFNpemUpCisJeworCQltTWF4aW11bVNpemUgPSBtYXhTaXplOworCX0KKworCisJaW5saW5lIGxvbmcgc2l6ZSgpCisJeworCQlyZXR1cm4oIG1NYXhpbXVtU2l6ZSApOworCX0KKworCWlubGluZSB2b2lkIHNldFNpemUobG9uZyBtYXhTaXplKQorCXsKKwkJbU1heGltdW1TaXplID0gbWF4U2l6ZTsKKwl9CisKKwkvKioKKwkgKiBTRVRURVIKKwkgKiBtTWluaW11bVNpemUKKwkgKiBtTWF4aW11bVNpemUKKwkgKi8KKwlpbmxpbmUgdm9pZCBzZXRTaXplKGxvbmcgbWluU2l6ZSwgbG9uZyBtYXhTaXplKQorCXsKKwkJbU1pbmltdW1TaXplID0gbWluU2l6ZTsKKwkJbU1heGltdW1TaXplID0gbWF4U2l6ZTsKKwl9CisKKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwlpbmxpbmUgc3RhdGljIHN0ZDo6c3RyaW5nIHN0ckNvbnRhaW5lcklkKHN0ZDo6c3RyaW5nIGFOYW1lSUQsCisJCWF2bV90eXBlX3NwZWNpZmllcl9raW5kX3QgYVNwZWNpZmllcktpbmQsIGNvbnN0IEJGICYgYmFzZVQsIGxvbmcgYVNpemUpCisJeworCQlyZXR1cm4oIGFOYW1lSUQuZW1wdHkoKSA/CisJCQkJc3RyQ29udGFpbmVySWQoYVNwZWNpZmllcktpbmQsIGJhc2VULCBhU2l6ZSkgIDogIGFOYW1lSUQgKTsKKwl9CisKKwlzdGF0aWMgc3RkOjpzdHJpbmcgc3RyQ29udGFpbmVySWQoCisJCQlhdm1fdHlwZV9zcGVjaWZpZXJfa2luZF90IGFTcGVjaWZpZXJLaW5kLAorCQkJY29uc3QgQkYgJiBiYXNlVCwgbG9uZyBhU2l6ZSk7CisKKwlzdGF0aWMgc3RkOjpzdHJpbmcgc3RyQ29udGFpbmVySWQoCisJCQlhdm1fdHlwZV9zcGVjaWZpZXJfa2luZF90IGFTcGVjaWZpZXJLaW5kLCBsb25nIGFTaXplKTsKKworCisJc3RkOjpzdHJpbmcgc3RyQ29udGFpbmVyVHlwZSgpIGNvbnN0OworCisJc3RkOjpzdHJpbmcgc3RyVF9Db250YWluZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBpc0Fub255bUlEKCkgPyBzdHJDb250YWluZXJUeXBlKCkgOiBnZXROYW1lSUQoKSApOworCX0KKworCXZvaWQgdG9TdHJlYW1Db250YWluZXIoT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gRU5VTUVSQVRJT0lOCisJLy8gU1RSVUNUVVJFCisJLy8gVU5JT04KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVByb3BlcnR5UGFydAorCSAqLworCWlubGluZSBQcm9wZXJ0eVBhcnQgKiBnZXRQcm9wZXJ0eVBhcnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUHJvcGVydHlQYXJ0ICk7CisJfQorCisJYm9vbCBoYXNQcm9wZXJ0eSgpIGNvbnN0OworCisJaW5saW5lIHZvaWQgc2V0UHJvcGVydHlQYXJ0KFByb3BlcnR5UGFydCAqIGFQcm9wZXJ0eVBhcnQpCisJeworCQltUHJvcGVydHlQYXJ0ID0gYVByb3BlcnR5UGFydDsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBCZWhhdmlvcmFsUGFydAorCSAqLworCUJlaGF2aW9yYWxQYXJ0ICogZ2V0VW5pcUJlaGF2aW9yUGFydCgpOworCisJaW5saW5lIEJlaGF2aW9yYWxQYXJ0ICogZ2V0QmVoYXZpb3JQYXJ0KCkgY29uc3QKKwl7CisJCXJldHVybiggbUJlaGF2aW9yYWxTcGVjaWZpY2F0aW9uICk7CisJfQorCisJYm9vbCBoYXNCZWhhdmlvcigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1CZWhhdmlvcmFsU3BlY2lmaWNhdGlvbiAhPSBOVUxMICk7CisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gRU5VTUVSQVRJT0lOCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRW51bWVyYXRpb24KKwkgKi8KKwlzdGF0aWMgRGF0YVR5cGUgKiBuZXdFbnVtKAorCQkJY29uc3QgUHJvcGVydHlQYXJ0ICYgYVByb3BlcnR5UGFydCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKTsKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIEVudW1lcmF0aW9uIFNpemUKKwkgKi8KKwlhdm1fc2l6ZV90IGdldEVudW1TaXplKCk7CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtVmFyaWFibGVzCisJICovCisJdm9pZCBhcHBlbmRWYXJpYWJsZShjb25zdCBCRiAmIGFWYXJpYWJsZSk7CisKKwl2b2lkIHNhdmVWYXJpYWJsZShWYXJpYWJsZSAqIGFWYXJpYWJsZSk7CisKKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwl2b2lkIHRvU3RyZWFtRW51bShPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFNUUlVDVFVSRQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIFN0cnVjdHVyZQorCSAqLworCXN0YXRpYyBEYXRhVHlwZSAqIG5ld1N0cnVjdHVyZSgKKwkJCWNvbnN0IFByb3BlcnR5UGFydCAmIGFQcm9wZXJ0eVBhcnQsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCk7CisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJdm9pZCB0b1N0cmVhbVN0cnVjdHVyZShPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFVOSU9OCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogVW5pb24KKwkgKi8KKwlzdGF0aWMgRGF0YVR5cGUgKiBuZXdVbmlvbigKKwkJCWNvbnN0IFByb3BlcnR5UGFydCAmIGFQcm9wZXJ0eVBhcnQsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCk7CisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJdm9pZCB0b1N0cmVhbVVuaW9uKE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIENIT0lDRQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIFVuaW9uCisJICovCisJc3RhdGljIERhdGFUeXBlICogbmV3Q2hvaWNlKAorCQkJY29uc3QgUHJvcGVydHlQYXJ0ICYgYVByb3BlcnR5UGFydCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKTsKKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwl2b2lkIHRvU3RyZWFtQ2hvaWNlKE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworCisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBBTElBUworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIEFsaWFzCisJICovCisJc3RhdGljIERhdGFUeXBlICogbmV3QWxpYXMoY29uc3QgUHJvcGVydHlQYXJ0ICYgYVByb3BlcnR5UGFydCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwgY29uc3QgQkYgJiBhVHlwZVNwZWNpZmllcik7CisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJdm9pZCB0b1N0cmVhbUFsaWFzKE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworCisKKworCisJLyoqCisJICogU2VyaWFsaXphdGlvbgorCSAqLworCXN0YXRpYyBzdGQ6OnN0cmluZyBzdHJUeXBlU3BlY2lmaWVyKGNvbnN0IEJGICYgYVR5cGUpOworCisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgc3RyVCgpIGNvbnN0CisJeworCQlpZiggaGFzVHlwZUNvbnRhaW5lcigpICkKKwkJeworCQkJcmV0dXJuKCBzdHJUX0NvbnRhaW5lcigpICk7CisJCX0KKwkJZWxzZSBpZiggaXNUeXBlZEludGVydmFsKCkgKQorCQl7CisJCQlyZXR1cm4oIHN0clRfSW50ZXJ2YWwoKSApOworCQl9CisKKwkJcmV0dXJuKCBnZXROYW1lSUQoKSApOworCX0KKworCisJdmlydHVhbCB2b2lkIHN0ckhlYWRlcihPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKKwl2aXJ0dWFsIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCisKK3B1YmxpYzoKKworCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlzdGF0aWMgc3RkOjpzdHJpbmcgQU5PTllNX0lEOworCisJaW5saW5lIGJvb2wgaXNBbm9ueW1JRCgpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldE5hbWVJRCgpLmVtcHR5KCkKKwkJCQl8fCAoZ2V0TmFtZUlEKCkuZmluZChBTk9OWU1fSUQpID09IDApICk7CisJfQorCit9OworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworCisKKworI2VuZGlmIC8qIFRZUEVERUZfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9JbnN0YW5jZVNwZWNpZmllclBhcnQuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL0luc3RhbmNlU3BlY2lmaWVyUGFydC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFlNTdkMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9JbnN0YW5jZVNwZWNpZmllclBhcnQuY3BwCkBAIC0wLDAgKzEsMTcyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMSBhdnIuIDIwMTYKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkluc3RhbmNlU3BlY2lmaWVyUGFydC5oIgorCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL01hY2hpbmUuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoqCisgKiBDT05TVFJVQ1RPUgorICogRGVmYXVsdAorICovCitJbnN0YW5jZVNwZWNpZmllclBhcnQ6Okluc3RhbmNlU3BlY2lmaWVyUGFydCgKKwkJTWFjaGluZSAqIGFDb250YWluZXIsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkKKzogT2JqZWN0Q2xhc3NpZmllciggQ0xBU1NfS0lORF9UKCBJbnN0YW5jZVNwZWNpZmllclBhcnQgKSAsCisJCWFDb250YWluZXIgLCBhTmFtZUlEKSwKK21Nb2RlbCggKSwKKworbUluaXRpYWxJbnN0YW5jZUNvdW50KCAxICksCittTWF4aW1hbEluc3RhbmNlQ291bnQoIEFWTV9OVU1FUklDX01BWF9TSVpFX1QgKSwKKworbVBvc3NpYmxlRHluYW1pY0luc3RhbmNpYXRpb25Db3VudCggMCApLAorCittTW9kaWZpZXJBdXRvU3RhcnQoIHRydWUgKQoreworCS8vISEgTk9USElORworfQorCitJbnN0YW5jZVNwZWNpZmllclBhcnQ6Okluc3RhbmNlU3BlY2lmaWVyUGFydChNYWNoaW5lICogYUNvbnRhaW5lciwKKwkJY29uc3QgQkYgJiBhTW9kZWwsIGF2bV9zaXplX3QgYW5Jbml0aWFsSW5zdGFuY2VDb3VudCwKKwkJYXZtX3NpemVfdCBhTWF4aW1hbEluc3RhbmNlQ291bnQsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkKKzogT2JqZWN0Q2xhc3NpZmllciggQ0xBU1NfS0lORF9UKCBJbnN0YW5jZVNwZWNpZmllclBhcnQgKSAsCisJCWFDb250YWluZXIgLCBhTmFtZUlEKSwKK21Nb2RlbCggYU1vZGVsICksCisKK21Jbml0aWFsSW5zdGFuY2VDb3VudCggYW5Jbml0aWFsSW5zdGFuY2VDb3VudCApLAorbU1heGltYWxJbnN0YW5jZUNvdW50KCBhTWF4aW1hbEluc3RhbmNlQ291bnQgKSwKKworbVBvc3NpYmxlRHluYW1pY0luc3RhbmNpYXRpb25Db3VudCggMCApLAorCittTW9kaWZpZXJBdXRvU3RhcnQoIHRydWUgKQoreworCS8vISEgTk9USElORworfQorCisKKy8qKgorICogU2VyaWFsaXphdGlvbgorICovCit2b2lkIEluc3RhbmNlU3BlY2lmaWVyUGFydDo6c3RyTXVsdGlwbGljaXR5KE91dFN0cmVhbSAmIG9zLAorCQlhdm1fc2l6ZV90IGFuSW5pdGlhbENvdW50LCBhdm1fc2l6ZV90IGFNYXhpbWFsQ291bnQsCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgbGVmdFNlcGFyYXRvciwgY29uc3Qgc3RkOjpzdHJpbmcgJiByaWdodFNlcGFyYXRvcikKK3sKKwlpZiggYU1heGltYWxDb3VudCA9PSBBVk1fTlVNRVJJQ19NQVhfU0laRV9UICkKKwl7CisJCWlmKCBhbkluaXRpYWxDb3VudCA9PSAwICkKKwkJeworCQkJb3MgPDwgbGVmdFNlcGFyYXRvciA8PCAiKiIgPDwgcmlnaHRTZXBhcmF0b3I7CisJCX0KKwkJZWxzZSBpZiggYW5Jbml0aWFsQ291bnQgPT0gMSApCisJCXsKKwkJCW9zIDw8IGxlZnRTZXBhcmF0b3IgPDwgIisiIDw8IHJpZ2h0U2VwYXJhdG9yOworCQl9CisJCWVsc2UKKwkJeworCQkJb3MgPDwgbGVmdFNlcGFyYXRvciA8PCBhbkluaXRpYWxDb3VudCA8PCAiLCArIiA8PCByaWdodFNlcGFyYXRvcjsKKwkJfQorCX0KKwllbHNlIGlmKCBhbkluaXRpYWxDb3VudCAhPSBhTWF4aW1hbENvdW50ICkKKwl7CisJCW9zIDw8IGxlZnRTZXBhcmF0b3IgPDwgYW5Jbml0aWFsQ291bnQKKwkJCQk8PCAiLCAiIDw8IGFNYXhpbWFsQ291bnQgPDwgcmlnaHRTZXBhcmF0b3I7CisJfQorCWVsc2UKKwl7CisJCW9zIDw8IGxlZnRTZXBhcmF0b3IgPDwgYW5Jbml0aWFsQ291bnQgPDwgcmlnaHRTZXBhcmF0b3I7CisJfQorfQorCisKK3ZvaWQgSW5zdGFuY2VTcGVjaWZpZXJQYXJ0OjpzdHJNdWx0aXBsaWNpdHkoCisJCU91dFN0cmVhbSAmIG9zLCBhdm1fc2l6ZV90IGFuSW5pdGlhbENvdW50LAorCQlhdm1fc2l6ZV90IGFQb3NzaWJsZUR5bmFtaWNDb3VudCwgYXZtX3NpemVfdCBhTWF4aW1hbENvdW50LAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGxlZnRTZXBhcmF0b3IsIGNvbnN0IHN0ZDo6c3RyaW5nICYgcmlnaHRTZXBhcmF0b3IpCit7CisJaWYoIGFQb3NzaWJsZUR5bmFtaWNDb3VudCA+IDAgKQorCXsKKwkJb3MgPDwgbGVmdFNlcGFyYXRvciA8PCBhbkluaXRpYWxDb3VudAorCQkJCTw8ICIsICIgPDwgYVBvc3NpYmxlRHluYW1pY0NvdW50IDw8ICIsICI7CisKKwkJaWYoIGFNYXhpbWFsQ291bnQgIT0gQVZNX05VTUVSSUNfTUFYX1NJWkVfVCApCisJCXsKKwkJCW9zIDw8IGFNYXhpbWFsQ291bnQgPDwgcmlnaHRTZXBhcmF0b3I7CisJCX0KKwkJZWxzZQorCQl7CisJCQlvcyA8PCAiKyIgPDwgcmlnaHRTZXBhcmF0b3I7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJSW5zdGFuY2VTcGVjaWZpZXJQYXJ0OjpzdHJNdWx0aXBsaWNpdHkob3MsIGFuSW5pdGlhbENvdW50LAorCQkJCWFNYXhpbWFsQ291bnQsIGxlZnRTZXBhcmF0b3IsIHJpZ2h0U2VwYXJhdG9yKTsKKwl9Cit9CisKKworaW5saW5lIHN0YXRpYyBib29sIHNob3dNdWx0aXBsaWNpdHkoCisJCWNvbnN0IE1hY2hpbmUgKiBhTWFjaGluZSwgYXZtX3NpemVfdCBhbkluaXRpYWxDb3VudCwKKwkJYXZtX3NpemVfdCBhUG9zc2libGVEeW5hbWljQ291bnQsIGF2bV9zaXplX3QgYU1heGltYWxDb3VudCkKK3sKKwlyZXR1cm4oICggYU1hY2hpbmUtPmdldFNwZWNpZmllcigpLmlzRmFtaWx5Q29tcG9uZW50U3RhdGUoKQorCQkJJiYgKGFuSW5pdGlhbENvdW50ID09IDEpICYmIChhUG9zc2libGVEeW5hbWljQ291bnQgPT0gMCkKKwkJCSYmIChhTWF4aW1hbENvdW50ID09IEFWTV9OVU1FUklDX01BWF9TSVpFX1QpICkgPyBmYWxzZSA6IHRydWUgKTsKK30KKwordm9pZCBJbnN0YW5jZVNwZWNpZmllclBhcnQ6OmhlYWRlcihPdXRTdHJlYW0gJiBvcywgYm9vbCAmIGhhc0NoZXZyb24pIGNvbnN0Cit7CisJaWYoIGhhc01vZGVsKCkgKQorCXsKKwkJaWYoIGhhc0NoZXZyb24gKSB7IG9zIDw8ICIgLCAiOyB9CisJCWVsc2UgeyBvcyA8PCAiPCAiOyBoYXNDaGV2cm9uID0gdHJ1ZTsgfQorCisJCW9zIDw8ICJtb2RlbDogIiA8PCAoKGdldE1vZGVsKCkuaXM8IE1hY2hpbmUgPigpKSA/CisJCQkJZ2V0TW9kZWwoKS50b19wdHI8IE1hY2hpbmUgPigpLT5nZXROYW1lSUQoKSA6IGdldE1vZGVsKCkuc3RyKCkpOworCX0KKworCWlmKCBzaG93TXVsdGlwbGljaXR5KGdldENvbnRhaW5lck1hY2hpbmUoKSwgbUluaXRpYWxJbnN0YW5jZUNvdW50LAorCQkJbVBvc3NpYmxlRHluYW1pY0luc3RhbmNpYXRpb25Db3VudCwgbU1heGltYWxJbnN0YW5jZUNvdW50KSApCisJeworCQlpZiggaGFzQ2hldnJvbiApIHsgb3MgPDwgIiAsICI7IH0KKwkJZWxzZSB7IG9zIDw8ICI8ICI7IGhhc0NoZXZyb24gPSB0cnVlOyB9CisKKwkJSW5zdGFuY2VTcGVjaWZpZXJQYXJ0OjpzdHJNdWx0aXBsaWNpdHkoCisJCQkJb3MsIG1Jbml0aWFsSW5zdGFuY2VDb3VudCwKKwkJCQltUG9zc2libGVEeW5hbWljSW5zdGFuY2lhdGlvbkNvdW50LAorCQkJCW1NYXhpbWFsSW5zdGFuY2VDb3VudCwgImluc3RhbmNlOiBbICIsICIgXSIpOworCX0KKworCWlmKCBub3QgaXNBdXRvU3RhcnQoKSApCisJeworCQlpZiggaGFzQ2hldnJvbiApIHsgb3MgPDwgIiAsICI7IH0KKwkJZWxzZSB7IG9zIDw8ICI8ICI7IGhhc0NoZXZyb24gPSB0cnVlOyB9CisJCW9zIDw8ICJhdXRvc3RhcnQgPSBmYWxzZSI7CisJfQorfQorCisKK3ZvaWQgSW5zdGFuY2VTcGVjaWZpZXJQYXJ0Ojp0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlvcyA8PCBUQUIgPDwgIkAiIDw8IGdldE5hbWVJRCgpIDw8ICI6IiA8PCBFT0w7Cit9CisKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9JbnN0YW5jZVNwZWNpZmllclBhcnQuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9JbnN0YW5jZVNwZWNpZmllclBhcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTQ1MjlmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL0luc3RhbmNlU3BlY2lmaWVyUGFydC5oCkBAIC0wLDAgKzEsMjAzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMSBhdnIuIDIwMTYKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBGTUxfSU5GUkFTVFJVQ1RVUkVfSU5TVEFOQ0VTUEVDSUZJRVJQQVJUX0hfCisjZGVmaW5lIEZNTF9JTkZSQVNUUlVDVFVSRV9JTlNUQU5DRVNQRUNJRklFUlBBUlRfSF8KKworI2luY2x1ZGUgPGZtbC9jb21tb24vT2JqZWN0Q2xhc3NpZmllci5oPgorI2luY2x1ZGUgPGZtbC9jb21tb24vT2JqZWN0RWxlbWVudC5oPgorCisjaW5jbHVkZSA8Y29tbW9uL0F2bVBvaW50ZXIuaD4KKyNpbmNsdWRlIDxjb21tb24vQkYuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKK2NsYXNzIE1hY2hpbmU7CisKKworY2xhc3MgSW5zdGFuY2VTcGVjaWZpZXJQYXJ0IDoKKwkJcHVibGljIE9iamVjdENsYXNzaWZpZXIsCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggSW5zdGFuY2VTcGVjaWZpZXJQYXJ0ICkKK3sKKworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBJbnN0YW5jZVNwZWNpZmllclBhcnQgKQorCisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBBVFRSSUJVVEVTCisJICovCisJQkYgbU1vZGVsOworCisJYXZtX3NpemVfdCBtSW5pdGlhbEluc3RhbmNlQ291bnQ7CisJYXZtX3NpemVfdCBtTWF4aW1hbEluc3RhbmNlQ291bnQ7CisKKwlhdm1fc2l6ZV90IG1Qb3NzaWJsZUR5bmFtaWNJbnN0YW5jaWF0aW9uQ291bnQ7CisKKwlib29sIG1Nb2RpZmllckF1dG9TdGFydDsKKworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlJbnN0YW5jZVNwZWNpZmllclBhcnQoTWFjaGluZSAqIGFDb250YWluZXIsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQgPSAiaW5zdGFuY2UiKTsKKworCUluc3RhbmNlU3BlY2lmaWVyUGFydChNYWNoaW5lICogYUNvbnRhaW5lciwgY29uc3QgQkYgJiBhTW9kZWwsCisJCQlhdm1fc2l6ZV90IGFuSW5pdGlhbEluc3RhbmNlQ291bnQgPSAxLAorCQkJYXZtX3NpemVfdCBhTWF4aW1hbEluc3RhbmNlQ291bnQgPSBBVk1fTlVNRVJJQ19NQVhfU0laRV9ULAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEID0gImluc3RhbmNlIik7CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5JbnN0YW5jZVNwZWNpZmllclBhcnQoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiB0aGUgTW9kZWwgU3BlY2lmaWVyCisJICovCisJaW5saW5lIGNvbnN0IEJGICYgZ2V0TW9kZWwoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtTW9kZWwgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNNb2RlbCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Nb2RlbC52YWxpZCgpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0TW9kZWwoY29uc3QgQkYgJiBhTW9kZWwpCisJeworCQltTW9kZWwgPSBhTW9kZWw7CisJfQorCisJaW5saW5lIHN0ZDo6c3RyaW5nIHN0ck1vZGVsKCkgY29uc3QKKwl7CisJCXJldHVybiggbU1vZGVsLmlzPCBPYmplY3RFbGVtZW50ID4oKSA/CisJCQkJbU1vZGVsLnRvX3B0cjwgT2JqZWN0RWxlbWVudCA+KCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgOgorCQkJCW1Nb2RlbC5zdHIoKSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUluaXRpYWxJbnN0YW5jZUNvdW50CisJICovCisJaW5saW5lIGF2bV9zaXplX3QgZ2V0SW5pdGlhbEluc3RhbmNlQ291bnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtSW5pdGlhbEluc3RhbmNlQ291bnQgKTsKKwl9CisKKwlib29sIGhhc0luaXRpYWxJbnN0YW5jZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Jbml0aWFsSW5zdGFuY2VDb3VudCA+IDAgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRJbml0aWFsSW5zdGFuY2VDb3VudChhdm1fc2l6ZV90IGFuSW5pdGlhbEluc3RhbmNlQ291bnQpCisJeworCQltSW5pdGlhbEluc3RhbmNlQ291bnQgPSBhbkluaXRpYWxJbnN0YW5jZUNvdW50OworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbU1heGltYWxJbnN0YW5jZUNvdW50CisJICovCisJaW5saW5lIGF2bV9zaXplX3QgZ2V0TWF4aW1hbEluc3RhbmNlQ291bnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtTWF4aW1hbEluc3RhbmNlQ291bnQgKTsKKwl9CisKKwlib29sIGhhc01heGltYWxJbnN0YW5jZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1NYXhpbWFsSW5zdGFuY2VDb3VudCAhPSBBVk1fTlVNRVJJQ19NQVhfU0laRV9UICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzTWF4aW1hbE5ld0luc3RhbmNlKCkgY29uc3QKKwl7CisJCXJldHVybiggKG1NYXhpbWFsSW5zdGFuY2VDb3VudCA+IDEpICYmCisJCQkJKG1NYXhpbWFsSW5zdGFuY2VDb3VudCAhPSBBVk1fTlVNRVJJQ19NQVhfU0laRV9UKSApOworCX0KKworCWlubGluZSB2b2lkIHNldE1heGltYWxJbnN0YW5jZUNvdW50KGF2bV9zaXplX3QgYU1heGltYWxJbnN0YW5jZUNvdW50KQorCXsKKwkJbU1heGltYWxJbnN0YW5jZUNvdW50ID0gYU1heGltYWxJbnN0YW5jZUNvdW50OworCX0KKworCisJLyoqCisJICogU0VUVEVSCisJICogbUluaXRpYWxJbnN0YW5jZUNvdW50CisJICogbU1heGltYWxJbnN0YW5jZUNvdW50CisJICovCisJaW5saW5lIHZvaWQgc2V0SW5zdGFuY2VDb3VudCgKKwkJCWF2bV9zaXplX3QgYW5Jbml0aWFsSW5zdGFuY2VDb3VudCwKKwkJCWF2bV9zaXplX3QgYU1heGltYWxJbnN0YW5jZUNvdW50KQorCXsKKwkJbUluaXRpYWxJbnN0YW5jZUNvdW50ID0gYW5Jbml0aWFsSW5zdGFuY2VDb3VudDsKKworCQltTWF4aW1hbEluc3RhbmNlQ291bnQgPSBhTWF4aW1hbEluc3RhbmNlQ291bnQ7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAiYXV0b3N0YXJ0IiBtb2RpZmllciBvZiBJbnN0YW5jZQorCSAqLworCWlubGluZSBib29sIGlzQXV0b1N0YXJ0KCkgY29uc3QKKwl7CisJCXJldHVybiggbU1vZGlmaWVyQXV0b1N0YXJ0ICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0QXV0b1N0YXJ0KGJvb2wgYkF1dG9TdGFydCA9IHRydWUpCisJeworCQltTW9kaWZpZXJBdXRvU3RhcnQgPSBiQXV0b1N0YXJ0OworCX0KKworCisJLyoqCisJICogU2VyaWFsaXphdGlvbgorCSAqLworCXN0YXRpYyB2b2lkIHN0ck11bHRpcGxpY2l0eShPdXRTdHJlYW0gJiBvcywKKwkJCWF2bV9zaXplX3QgYW5Jbml0aWFsQ291bnQsIGF2bV9zaXplX3QgYU1heGltYWxDb3VudCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgbGVmdFNlcGFyYXRvciA9ICJbICIsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIHJpZ2h0U2VwYXJhdG9yID0gIiBdIik7CisKKwlzdGF0aWMgdm9pZCBzdHJNdWx0aXBsaWNpdHkoT3V0U3RyZWFtICYgb3MsIGF2bV9zaXplX3QgYW5Jbml0aWFsQ291bnQsCisJCQlhdm1fc2l6ZV90IGFQb3NzaWJsZUR5bmFtaWNDb3VudCwgYXZtX3NpemVfdCBhTWF4aW1hbENvdW50LAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBsZWZ0U2VwYXJhdG9yID0gIlsgIiwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgcmlnaHRTZXBhcmF0b3IgPSAiIF0iKTsKKworCXZvaWQgaGVhZGVyKE91dFN0cmVhbSAmIG9zLCBib29sICYgaGFzQ2hldnJvbikgY29uc3Q7CisKKwl2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworfTsKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qIEZNTF9JTkZSQVNUUlVDVFVSRV9JTlNUQU5DRVNQRUNJRklFUlBBUlRfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9JbnRlcmFjdGlvblBhcnQuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL0ludGVyYWN0aW9uUGFydC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRhNzBmNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9JbnRlcmFjdGlvblBhcnQuY3BwCkBAIC0wLDAgKzEsNjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyMiBmw6l2ci4gMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiSW50ZXJhY3Rpb25QYXJ0LmgiCisKKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvTWFjaGluZS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvKioKKyAqIENPTlNUUlVDVE9SCisgKiBEZWZhdWx0CisgKi8KK0ludGVyYWN0aW9uUGFydDo6SW50ZXJhY3Rpb25QYXJ0KAorCQlNYWNoaW5lICogYUNvbnRhaW5lciwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKQorOiBPYmplY3RDbGFzc2lmaWVyKCBDTEFTU19LSU5EX1QoIEludGVyYWN0aW9uUGFydCApICwgYUNvbnRhaW5lciwgYU5hbWVJRCksCitDb21Qcm90b2NvbCggUFJPVE9DT0xfVU5ERUZJTkVEX0tJTkQgKSwKK21Db25uZWN0b3JzKCApCit7CisJLy8hISBOT1RISU5HCit9CisKKworLyoqCisgKiBTZXJpYWxpemF0aW9uCisgKi8KK3ZvaWQgSW50ZXJhY3Rpb25QYXJ0Ojp0b1N0cmVhbShPdXRTdHJlYW0gJiBvdXQpIGNvbnN0Cit7CisJb3V0IDw8IFRBQiA8PCAiQCIgPDwgZ2V0TmFtZUlEKCk7CisKKwl0b1N0cmVhbVByb3RvY29sQ2FzdCggb3V0ICkgPDwgIjoiIDw8IEVPTF9GTFVTSDsKKworCWlmKCBtQ29ubmVjdG9ycy5ub25lbXB0eSgpICkKKwl7CisJCVNjb3BlSW5jckluZGVudCBhc2RpaShvdXQpOworCisJCWNvbnN0X2Nvbm5lY3Rvcl9pdGVyYXRvciBpdCA9IG1Db25uZWN0b3JzLmJlZ2luKCk7CisJCWNvbnN0X2Nvbm5lY3Rvcl9pdGVyYXRvciBlbmRJdCA9IG1Db25uZWN0b3JzLmVuZCgpOworCQlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJeworCQkJKGl0KS0+dG9TdHJlYW0ob3V0KTsKKwkJfQorCX0KK30KKworCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9JbnRlcmFjdGlvblBhcnQuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9JbnRlcmFjdGlvblBhcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2Y4ZDhkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL0ludGVyYWN0aW9uUGFydC5oCkBAIC0wLDAgKzEsMTI2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjIgZsOpdnIuIDIwMTEKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBGTUxfSU5GUkFTVFJVQ1RVUkVfSU5URVJBQ1RJT05QQVJUX0hfCisjZGVmaW5lIEZNTF9JTkZSQVNUUlVDVFVSRV9JTlRFUkFDVElPTlBBUlRfSF8KKworI2luY2x1ZGUgPGZtbC9jb21tb24vT2JqZWN0Q2xhc3NpZmllci5oPgorCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0NvbVByb3RvY29sLmg+CisKKyNpbmNsdWRlIDxjb2xsZWN0aW9uL0JGQ29udGFpbmVyLmg+CisKKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvQ29ubmVjdG9yLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIE1hY2hpbmU7CisKKworY2xhc3MgSW50ZXJhY3Rpb25QYXJ0IDoKKwkJcHVibGljIE9iamVjdENsYXNzaWZpZXIsCisJCXB1YmxpYyBDb21Qcm90b2NvbCwKKwkJQVZNX0lOSkVDVF9JTlNUQU5DRV9DT1VOVEVSX0NMQVNTKCBJbnRlcmFjdGlvblBhcnQgKQoreworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIEludGVyYWN0aW9uUGFydCApCisKKworcHVibGljOgorCS8qKgorCSAqIFRZUEVERUYKKwkgKi8KKwl0eXBlZGVmIFRhYmxlT2ZCRl9UPCBDb25uZWN0b3IgPiAgVGFibGVPZkNvbm5lY3RvcjsKKworCXR5cGVkZWYgVGFibGVPZkNvbm5lY3Rvcjo6cmF3X2l0ZXJhdG9yICAgICAgICBjb25uZWN0b3JfaXRlcmF0b3I7CisJdHlwZWRlZiBUYWJsZU9mQ29ubmVjdG9yOjpjb25zdF9yYXdfaXRlcmF0b3IgIGNvbnN0X2Nvbm5lY3Rvcl9pdGVyYXRvcjsKKworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQVRUUklCVVRFUworCSAqLworCVRhYmxlT2ZDb25uZWN0b3IgbUNvbm5lY3RvcnM7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUludGVyYWN0aW9uUGFydChNYWNoaW5lICogYUNvbnRhaW5lciwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEID0gImNvbSIpOworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkludGVyYWN0aW9uUGFydCgpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1Db25uZWN0b3JzCisJICovCisJaW5saW5lIGNvbnN0IFRhYmxlT2ZDb25uZWN0b3IgJiBnZXRDb25uZWN0b3JzKCkgY29uc3QKKwl7CisJCXJldHVybiggbUNvbm5lY3RvcnMgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNDb25uZWN0b3IoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQ29ubmVjdG9ycy5lbXB0eSgpICk7CisJfQorCisJaW5saW5lIHZvaWQgYXBwZW5kQ29ubmVjdG9yKGNvbnN0IEJGICYgYUNvbm5lY3RvcikKKwl7CisJCW1Db25uZWN0b3JzLmFwcGVuZCggYUNvbm5lY3RvciApOworCX0KKworCWlubGluZSB2b2lkIHNhdmVDb25uZWN0b3IoQ29ubmVjdG9yICogYUNvbm5lY3RvcikKKwl7CisJCW1Db25uZWN0b3JzLmFwcGVuZCggQkYoYUNvbm5lY3RvcikgKTsKKwl9CisKKworCS8qKgorCSAqIFsgQ09OU1QgXSBJVEVSQVRPUgorCSAqLworCWlubGluZSBjb25zdF9jb25uZWN0b3JfaXRlcmF0b3IgY29ubmVjdG9yX2JlZ2luKCkgY29uc3QKKwl7CisJCXJldHVybiggbUNvbm5lY3RvcnMuYmVnaW4oKSApOworCX0KKworCWlubGluZSBjb25zdF9jb25uZWN0b3JfaXRlcmF0b3IgY29ubmVjdG9yX2VuZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Db25uZWN0b3JzLmVuZCgpICk7CisJfQorCisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvdXQpIGNvbnN0OworCit9OworCisKK30KKworI2VuZGlmIC8qIEZNTF9JTkZSQVNUUlVDVFVSRV9JTlRFUkFDVElPTlBBUlRfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9NYWNoaW5lLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9NYWNoaW5lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjg5ODM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL01hY2hpbmUuY3BwCkBAIC0wLDAgKzEsNjczIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTggZsOpdnIuIDIwMTEKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIk1hY2hpbmUuaCIKKworI2luY2x1ZGUgPGZtbC90eXBlL1R5cGVNYW5hZ2VyLmg+CisKKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvQnVmZmVyLmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0NoYW5uZWwuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvQ29ubmVjdG9yLmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1BvcnQuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvUm91dGluZS5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9WYXJpYWJsZS5oPgorCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0JlaGF2aW9yYWxQYXJ0Lmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0NvbXBvc2l0ZVBhcnQuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvSW5zdGFuY2VTcGVjaWZpZXJQYXJ0Lmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0ludGVyYWN0aW9uUGFydC5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Nb2RlbE9mQ29tcHV0YXRpb25QYXJ0Lmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1Byb3BlcnR5UGFydC5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIE1BQ0hJTkUgUE9JTlRFUgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTUFDSElORSBTTUFSVCBQT0lOVEVSCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKKyAqIENPTlNUUlVDVE9SCisgKiBEZWZhdWx0CisgKi8KK01hY2hpbmU6Ok1hY2hpbmUoTWFjaGluZSAqIGFDb250YWluZXIsCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwgY29uc3QgU3BlY2lmaWVyICYgYU1vY1NwZWNpZmllcikKKzogQmVoYXZpb3JhbEVsZW1lbnQoQ0xBU1NfS0lORF9UKCBNYWNoaW5lICksIGFDb250YWluZXIsIGFOYW1lSUQpLAorU3BlY2lmaWVySW1wbCggYU1vY1NwZWNpZmllciApLAorCittR3JvdXBJZCggKSwKK21Pd25lZEVsZW1lbnRzKCApLAorbU93bmVkRWxlbWVudHNTcGVjaWZpZXIoICksCittTW9kZWwoICksCisKK21Qcm9wZXJ0eURlY2xhcmF0aW9uKCB0aGlzICwgInByb3BlcnR5IiApLAorCittTW9kZWxPZkNvbXB1dGF0aW9uKCBOVUxMICksCisKK21Db21wb3NpdGVTcGVjaWZpY2F0aW9uKCBuZXcgQ29tcG9zaXRlUGFydCh0aGlzLCAiY29tcG9zaXRlIikgKSwKKworbUludGVyYWN0aW9uU3BlY2lmaWNhdGlvbiggTlVMTCApLAorbUJlaGF2aW9yYWxTcGVjaWZpY2F0aW9uKCBOVUxMICksCittSW5zdGFuY2VTcGVjaWZpZXIoIG5ldyBJbnN0YW5jZVNwZWNpZmllclBhcnQodGhpcywgImluc3RhbmNlIikgKQoreworCS8vISEgTk9USElORworfQorCisKKy8qKgorICogQ09OU1RSVUNUT1IKKyAqIE90aGVyCisgKi8KK01hY2hpbmU6Ok1hY2hpbmUoTWFjaGluZSAqIGFDb250YWluZXIsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwKKwkJY29uc3QgU3BlY2lmaWVyICYgYU1vY1NwZWNpZmllciwgY29uc3QgQkYgJiBhTW9kZWwsCisJCWF2bV9zaXplX3QgYW5Jbml0aWFsSW5zdGFuY2VDb3VudCwgYXZtX3NpemVfdCBhTWF4aW1hbEluc3RhbmNlQ291bnQpCis6IEJlaGF2aW9yYWxFbGVtZW50KENMQVNTX0tJTkRfVCggTWFjaGluZSApLCBhQ29udGFpbmVyLCBhTmFtZUlEKSwKK1NwZWNpZmllckltcGwoIGFNb2NTcGVjaWZpZXIgKSwKKworbUdyb3VwSWQoICksCittT3duZWRFbGVtZW50cyggKSwKK21Pd25lZEVsZW1lbnRzU3BlY2lmaWVyKCApLAorbU1vZGVsKCBhTW9kZWwgKSwKKworbVByb3BlcnR5RGVjbGFyYXRpb24oIHRoaXMgLCAicHJvcGVydHkiICksCisKK21Nb2RlbE9mQ29tcHV0YXRpb24oIE5VTEwgKSwKKworbUNvbXBvc2l0ZVNwZWNpZmljYXRpb24oIG5ldyBDb21wb3NpdGVQYXJ0KHRoaXMsICJjb21wb3NpdGUiKSApLAorCittSW50ZXJhY3Rpb25TcGVjaWZpY2F0aW9uKCBOVUxMICksCittQmVoYXZpb3JhbFNwZWNpZmljYXRpb24oIE5VTEwgKSwKK21JbnN0YW5jZVNwZWNpZmllciggbmV3IEluc3RhbmNlU3BlY2lmaWVyUGFydCh0aGlzLCBhTW9kZWwsCisJCWFuSW5pdGlhbEluc3RhbmNlQ291bnQsIGFNYXhpbWFsSW5zdGFuY2VDb3VudCwgImluc3RhbmNlIikgKQoreworCS8vISEgTk9USElORworfQorCitNYWNoaW5lOjpNYWNoaW5lKGNsYXNzX2tpbmRfdCBhQ2xhc3NLaW5kLCBNYWNoaW5lICogYUNvbnRhaW5lciwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBuYW1lLCBjb25zdCBTcGVjaWZpZXIgJiBhTW9jU3BlY2lmaWVyKQorOiBCZWhhdmlvcmFsRWxlbWVudChhQ2xhc3NLaW5kLCBhQ29udGFpbmVyLCBhRnVsbHlRdWFsaWZpZWROYW1lSUQsIGFOYW1lSUQsIG5hbWUpLAorU3BlY2lmaWVySW1wbCggYU1vY1NwZWNpZmllciApLAorCittR3JvdXBJZCggKSwKK21Pd25lZEVsZW1lbnRzKCApLAorbU93bmVkRWxlbWVudHNTcGVjaWZpZXIoICksCittTW9kZWwoICksCisKK21Qcm9wZXJ0eURlY2xhcmF0aW9uKCB0aGlzICwgInByb3BlcnR5IiApLAorCittTW9kZWxPZkNvbXB1dGF0aW9uKCBOVUxMICksCisKK21Db21wb3NpdGVTcGVjaWZpY2F0aW9uKCBuZXcgQ29tcG9zaXRlUGFydCh0aGlzLCAiY29tcG9zaXRlIikgKSwKKworbUludGVyYWN0aW9uU3BlY2lmaWNhdGlvbiggTlVMTCApLAorbUJlaGF2aW9yYWxTcGVjaWZpY2F0aW9uKCBOVUxMICksCittSW5zdGFuY2VTcGVjaWZpZXIoIG5ldyBJbnN0YW5jZVNwZWNpZmllclBhcnQodGhpcywgImluc3RhbmNlIikgKQoreworCS8vISEgTk9USElORworfQorCisKKy8qKgorICogREVTVFJVQ1RPUgorICovCitNYWNoaW5lOjp+TWFjaGluZSgpCit7CisJZGVsZXRlIG1Nb2RlbE9mQ29tcHV0YXRpb247CisJZGVsZXRlIG1Db21wb3NpdGVTcGVjaWZpY2F0aW9uOworCWRlbGV0ZSBtSW50ZXJhY3Rpb25TcGVjaWZpY2F0aW9uOworCWRlbGV0ZSBtQmVoYXZpb3JhbFNwZWNpZmljYXRpb247CisJZGVsZXRlIG1JbnN0YW5jZVNwZWNpZmllcjsKK30KKworCisvKioKKyAqIFNFVFRFUgorICogbUdyb3VwSWQKKyAqLwordm9pZCBNYWNoaW5lOjpzZXRHcm91cElkKCkKK3sKKwlpZiggZ2V0U3BlY2lmaWVyKCkuaGFzR3JvdXBNYXNrKCkgKQorCXsKKwkJU3RyaW5nT3V0U3RyZWFtIG9zczsKKworCQlvc3MgPDwgKCBnZXRTcGVjaWZpZXIoKS5pc0dyb3VwRXZlcnkoKSA/ICJbKiIgOgorCQkJCSggZ2V0U3BlY2lmaWVyKCkuaXNHcm91cEV4Y2VwdCgpID8gIlteIiA6ICJbIiApICk7CisJCWlmKCBtR3JvdXBJZC5ub25lbXB0eSgpICkKKwkJeworCQkJTGlzdE9mU3RyaW5nOjpjb25zdF9pdGVyYXRvciBpdCA9IG1Hcm91cElkLmJlZ2luKCk7CisJCQlMaXN0T2ZTdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gbUdyb3VwSWQuZW5kKCk7CisJCQlvc3MgPDwgKCppdCk7CisJCQlmb3IoICsraXQgOyBpdCAhPSBlbmRJdCA7ICsraXQpCisJCQl7CisJCQkJb3NzIDw8ICIgLCAiIDw8ICgqaXQpOworCQkJfQorCQl9CisJCW9zcyA8PCAiXSI7CisKKwkJZnVsbHlVcGRhdGVBbGxOYW1lSUQoIG9zcy5zdHIoKSApOworCX0KK30KKwordm9pZCBNYWNoaW5lOjpleHBhbmRHcm91cFN0YXRlbWFjaGluZSgpCit7CisJaWYoIG1Db21wb3NpdGVTcGVjaWZpY2F0aW9uICE9IE5VTEwgKQorCXsKKwkJbUNvbXBvc2l0ZVNwZWNpZmljYXRpb24tPmV4cGFuZEdyb3VwU3RhdGVtYWNoaW5lKCk7CisJfQorfQorCisKKy8qKgorICogR0VUVEVSCisgKiB0aGUgbWFjaGluZSBjb250YWluZXIKKyAqIExDW1JdQQorICovCitjb25zdCBNYWNoaW5lICogTWFjaGluZTo6TENBKGNvbnN0IE1hY2hpbmUgKiBhTWFjaGluZSkgY29uc3QKK3sKKwlMaXN0PCBjb25zdCBNYWNoaW5lICogPiBjb250YWluZXJMaXN0T2ZUaGlzOworCWNvbnN0IE1hY2hpbmUgKiBpdENvbnRhaW5lciA9IHRoaXMtPmdldENvbnRhaW5lck1hY2hpbmUoKTsKKwlmb3IgKCA7IGl0Q29udGFpbmVyICE9IE5VTEwgOworCQkJaXRDb250YWluZXIgPSBpdENvbnRhaW5lci0+Z2V0Q29udGFpbmVyTWFjaGluZSgpICkKKwl7CisJCWNvbnRhaW5lckxpc3RPZlRoaXMucHVzaF9iYWNrKGl0Q29udGFpbmVyKTsKKwl9CisKKwlMaXN0PCBjb25zdCBNYWNoaW5lICogPjo6aXRlcmF0b3IgaXQ7CisJTGlzdDwgY29uc3QgTWFjaGluZSAqID46Oml0ZXJhdG9yIGVuZEl0ID0gY29udGFpbmVyTGlzdE9mVGhpcy5lbmQoKTsKKwlpdENvbnRhaW5lciA9IGFNYWNoaW5lLT5nZXRDb250YWluZXJNYWNoaW5lKCk7CisJZm9yICggOyBpdENvbnRhaW5lciAhPSBOVUxMIDsKKwkJCWl0Q29udGFpbmVyID0gaXRDb250YWluZXItPmdldENvbnRhaW5lck1hY2hpbmUoKSApCisJeworCQlmb3IgKCBpdCA9IGNvbnRhaW5lckxpc3RPZlRoaXMuYmVnaW4oKSA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJCXsKKwkJCWlmICggKCppdCkgPT0gaXRDb250YWluZXIgKQorCQkJeworLy8JCQkJQVZNX09TX0xPRyA8PCAiTENBKCAiIDw8IHRoaXMtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKy8vCQkJCQkJPDwgIiAsICIgPDwgYU1hY2hpbmUtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKy8vCQkJCQkJPDwgIiApID0gIiA8PCBpdENvbnRhaW5lci0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsKKworCQkJCXJldHVybiggaXRDb250YWluZXIgKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiggTlVMTCApOworfQorCisKKworLyoqCisgKiBESVNQQVRDSAorICogbU93bmVkRWxlbWVudHMKKyAqLwordm9pZCBNYWNoaW5lOjpkaXNwYXRjaE93bmVkRWxlbWVudChjb25zdCBCRiAmIGFuRWxlbWVudCkKK3sKKwlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfU01BUlRfUE9JTlRFUl9FWElUKCBhbkVsZW1lbnQgKQorCQkJPDwgIkV4ZWN1dGFibGUgTWFjaGluZSBvd25lZCBlbGVtZW50ICEhISIKKwkJCTw8IFNFTkRfRVhJVDsKKworCXN3aXRjaCggYW5FbGVtZW50LmNsYXNzS2luZCgpICkKKwl7CisJCS8vIFBST1BFUlRZIEVMRU1FTlQKKwkJY2FzZSBGT1JNX1hGU1BfVkFSSUFCTEVfS0lORDoKKwkJY2FzZSBGT1JNX1hGU1BfREFUQVRZUEVfS0lORDoKKwkJY2FzZSBGT1JNX1hGU1BfQlVGRkVSX0tJTkQ6CisJCWNhc2UgRk9STV9YRlNQX0NIQU5ORUxfS0lORDoKKwkJY2FzZSBGT1JNX1hGU1BfUE9SVF9LSU5EOgorCQl7CisJCQltUHJvcGVydHlEZWNsYXJhdGlvbi5kaXNwYXRjaE93bmVkRWxlbWVudCggYW5FbGVtZW50ICk7CisJCQlicmVhazsKKwkJfQorCisJCS8vIENPTVBPU0lURSBTVFJVQ1RVUkUgRUxFTUVOVAorCisJCWNhc2UgRk9STV9YRlNQX01BQ0hJTkVfS0lORDoKKwkJeworCQkJYWRkT3duZWRFbGVtZW50U3BlY2lmaWVyKAorCQkJCQlhbkVsZW1lbnQudG9fcHRyPCBNYWNoaW5lID4oKS0+Z2V0U3BlY2lmaWVyKCkgKTsKKworCQkJZ2V0VW5pcUNvbXBvc2l0ZVBhcnQoKS0+ZGlzcGF0Y2hPd25lZEVsZW1lbnQoIGFuRWxlbWVudCApOworCisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgRk9STV9YRlNQX1RSQU5TSVRJT05fS0lORDoKKwkJeworCQkJZ2V0VW5pcUJlaGF2aW9yUGFydCgpLT5hcHBlbmRPdXRnb2luZ1RyYW5zaXRpb24oIGFuRWxlbWVudCApOworCQkJYnJlYWs7CisJCX0KKworCQkvLyBJTlRFUkFDVElPTiBFTEVNRU5UCisJCWNhc2UgRk9STV9YRlNQX0NPTk5FQ1RPUl9LSU5EOgorCQl7CisJCQlnZXRVbmlxSW50ZXJhY3Rpb24oKS0+YXBwZW5kQ29ubmVjdG9yKCBhbkVsZW1lbnQgKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gQkVIQVZJT1JBTCBFTEVNRU5UCisJCWNhc2UgRk9STV9YRlNQX1JPVVRJTkVfS0lORDoKKwkJeworCQkJZ2V0VW5pcUJlaGF2aW9yUGFydCgpLT5hcHBlbmRSb3V0aW5lKCBhbkVsZW1lbnQgKTsKKwkJCWJyZWFrOworCQl9CisKKworCQljYXNlIEZPUk1fWEZTUF9QQUNLQUdFX0tJTkQ6CisKKwkJZGVmYXVsdDoKKwkJeyAvLyBUT0RPCisJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQk8PCAiZGlzcGF0Y2hPd25lZEVsZW1lbnQoKSB1bmV4cGVjdGVkIG9iamVjdCwgdHlwZWluZm86ICIKKwkJCQkJPDwgYW5FbGVtZW50LmNsYXNzS2luZEluZm8oKSA8PCAiXG5cdDw8ICIKKwkJCQkJPDwgYW5FbGVtZW50LnRvX3B0cjwgT2JqZWN0RWxlbWVudCA+KCktPnN0ckhlYWRlcigpCisJCQkJCTw8ICIgPj4gISEhIgorCQkJCQk8PCBTRU5EX0VYSVQ7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworCisvKioKKyAqIEdFVFRFUiAtIFNFVFRFUgorICogbU1vZGVsT2ZDb21wdXRhdGlvbgorICovCitNb2RlbE9mQ29tcHV0YXRpb25QYXJ0ICogTWFjaGluZTo6Z2V0VW5pcU1vZGVsT2ZDb21wdXRhdGlvbigpCit7CisJaWYoIG1Nb2RlbE9mQ29tcHV0YXRpb24gPT0gTlVMTCApCisJeworCQltTW9kZWxPZkNvbXB1dGF0aW9uID0gbmV3IE1vZGVsT2ZDb21wdXRhdGlvblBhcnQodGhpcywgIm1vYyIpOworCX0KKworCXJldHVybiggbU1vZGVsT2ZDb21wdXRhdGlvbiApOworfQorCisvKioKKyAqIEdFVFRFUiAtIFNFVFRFUgorICogbUNvbXBvc2l0ZVNwZWNpZmljYXRpb24KKyAqLworQ29tcG9zaXRlUGFydCAqIE1hY2hpbmU6OmdldFVuaXFDb21wb3NpdGVQYXJ0KCkKK3sKKwlpZiggbUNvbXBvc2l0ZVNwZWNpZmljYXRpb24gPT0gTlVMTCApCisJeworCQltQ29tcG9zaXRlU3BlY2lmaWNhdGlvbiA9IG5ldyBDb21wb3NpdGVQYXJ0KHRoaXMsICJjb21wb3NpdGUiKTsKKwl9CisKKwlyZXR1cm4oIG1Db21wb3NpdGVTcGVjaWZpY2F0aW9uICk7Cit9CisKKworLyoqCisgKiBHRVRURVIgLSBTRVRURVIKKyAqIG1Db21wb3NpdGVTcGVjaWZpY2F0aW9uLT5tUHJvY2VkdXJlcworICovCitib29sIE1hY2hpbmU6Omhhc1Byb2NlZHVyZSgpIGNvbnN0Cit7CisJcmV0dXJuKCAobUNvbXBvc2l0ZVNwZWNpZmljYXRpb24gIT0gTlVMTCkgJiYKKwkJCW1Db21wb3NpdGVTcGVjaWZpY2F0aW9uLT5oYXNQcm9jZWR1cmUoKSApOworfQorCit2b2lkIE1hY2hpbmU6OnNhdmVQcm9jZWR1cmUoTWFjaGluZSAqIGFQcm9jZWR1cmUpCit7CisJbUNvbXBvc2l0ZVNwZWNpZmljYXRpb24tPnNhdmVQcm9jZWR1cmUoIGFQcm9jZWR1cmUgKTsKK30KKworLyoqCisgKiBHRVRURVIgLSBTRVRURVIKKyAqIG1Db21wb3NpdGVTcGVjaWZpY2F0aW9uLT5tU3RhdGVzCisgKi8KK2Jvb2wgTWFjaGluZTo6aGFzU3RhdGUoKSBjb25zdAoreworCXJldHVybiggKG1Db21wb3NpdGVTcGVjaWZpY2F0aW9uICE9IE5VTEwpICYmCisJCQltQ29tcG9zaXRlU3BlY2lmaWNhdGlvbi0+aGFzU3RhdGUoKSApOworfQorCisKKy8qKgorICogR0VUVEVSIC0gU0VUVEVSCisgKiBtQ29tcG9zaXRlU3BlY2lmaWNhdGlvbi0+bU1hY2hpbmVzCisgKi8KK2Jvb2wgTWFjaGluZTo6aGFzTWFjaGluZSgpIGNvbnN0Cit7CisJcmV0dXJuKCAobUNvbXBvc2l0ZVNwZWNpZmljYXRpb24gIT0gTlVMTCkgJiYKKwkJCW1Db21wb3NpdGVTcGVjaWZpY2F0aW9uLT5oYXNNYWNoaW5lKCkgKTsKK30KKwordm9pZCBNYWNoaW5lOjpzYXZlTWFjaGluZShNYWNoaW5lICogYU1hY2hpbmUpCit7CisJbUNvbXBvc2l0ZVNwZWNpZmljYXRpb24tPnNhdmVNYWNoaW5lKCBhTWFjaGluZSApOworfQorCisKKy8qKgorICogR0VUVEVSIC0gU0VUVEVSCisgKiBtSW50ZXJhY3Rpb25TcGVjaWZpY2F0aW9uCisgKi8KK0ludGVyYWN0aW9uUGFydCAqIE1hY2hpbmU6OmdldFVuaXFJbnRlcmFjdGlvbigpCit7CisJaWYoIG1JbnRlcmFjdGlvblNwZWNpZmljYXRpb24gPT0gTlVMTCApCisJeworCQltSW50ZXJhY3Rpb25TcGVjaWZpY2F0aW9uID0gbmV3IEludGVyYWN0aW9uUGFydCh0aGlzLCAiY29tIik7CisJfQorCisJcmV0dXJuKCBtSW50ZXJhY3Rpb25TcGVjaWZpY2F0aW9uICk7Cit9CisKKworLyoqCisgKiBHRVRURVIgLSBTRVRURVIKKyAqIG1CZWhhdmlvcmFsU3BlY2lmaWNhdGlvbgorICovCitCZWhhdmlvcmFsUGFydCAqIE1hY2hpbmU6OmdldFVuaXFCZWhhdmlvclBhcnQoKQoreworCWlmKCBtQmVoYXZpb3JhbFNwZWNpZmljYXRpb24gPT0gTlVMTCApCisJeworCQltQmVoYXZpb3JhbFNwZWNpZmljYXRpb24gPSBuZXcgQmVoYXZpb3JhbFBhcnQodGhpcywgIm1vZSIpOworCX0KKworCXJldHVybiggbUJlaGF2aW9yYWxTcGVjaWZpY2F0aW9uICk7Cit9CisKKworYm9vbCBNYWNoaW5lOjpoYXNSdW5uYWJsZUJlaGF2aW9yKCkgY29uc3QKK3sKKwlyZXR1cm4oIChtQmVoYXZpb3JhbFNwZWNpZmljYXRpb24gIT0gTlVMTCkKKwkJCSYmIChtQmVoYXZpb3JhbFNwZWNpZmljYXRpb24tPmhhc09uUnVuKCkKKwkJCQl8fCBtQmVoYXZpb3JhbFNwZWNpZmljYXRpb24tPmhhc09uU2NoZWR1bGUoKQorCQkJCXx8IG1CZWhhdmlvcmFsU3BlY2lmaWNhdGlvbi0+aGFzT25Db25jdXJyZW5jeSgpKSApOworfQorCitib29sIE1hY2hpbmU6Omhhc09uRW5hYmxlKCkgY29uc3QKK3sKKwlyZXR1cm4oICggKG1CZWhhdmlvcmFsU3BlY2lmaWNhdGlvbiAhPSBOVUxMKQorCQkJCSYmIG1CZWhhdmlvcmFsU3BlY2lmaWNhdGlvbi0+aGFzT25FbmFibGUoKSApCisJCQl8fCBnZXRTcGVjaWZpZXIoKS5oYXNQc2V1ZG9zdGF0ZUhpc3RvcnkoKSApOworfQorCitib29sIE1hY2hpbmU6OmlzSW5saW5hYmxlRW5hYmxlKCkgY29uc3QKK3sKKwlyZXR1cm4oIChub3QgZ2V0U3BlY2lmaWVyKCkuaXNQc2V1ZG9zdGF0ZSgpKQorCQkJJiYgKG1CZWhhdmlvcmFsU3BlY2lmaWNhdGlvbiAhPSBOVUxMKQorCQkJJiYgKG1CZWhhdmlvcmFsU3BlY2lmaWNhdGlvbi0+aGFzT25FbmFibGUoKQorCQkJCXx8IG1CZWhhdmlvcmFsU3BlY2lmaWNhdGlvbi0+aGFzT25JRW5hYmxlKCkpICk7Cit9CisKKworLyoqCisgKiBHRVRURVIgLSBTRVRURVIKKyAqIG1CZWhhdmlvcmFsU3BlY2lmaWNhdGlvbi0+bU91dGdvaW5nVHJhbnNpdGlvbnMKKyAqIG1CZWhhdmlvcmFsU3BlY2lmaWNhdGlvbi0+bUluY29taW5nVHJhbnNpdGlvbnMKKyAqLworYm9vbCBNYWNoaW5lOjpoYXNPdXRnb2luZ1RyYW5zaXRpb24oKSBjb25zdAoreworCXJldHVybiggKG1CZWhhdmlvcmFsU3BlY2lmaWNhdGlvbiAhPSBOVUxMKQorCQkJJiYgbUJlaGF2aW9yYWxTcGVjaWZpY2F0aW9uLT5oYXNPdXRnb2luZ1RyYW5zaXRpb24oKSApOworfQorCitib29sIE1hY2hpbmU6Omhhc0luY29taW5nVHJhbnNpdGlvbigpIGNvbnN0Cit7CisJcmV0dXJuKCAobUJlaGF2aW9yYWxTcGVjaWZpY2F0aW9uICE9IE5VTEwpCisJCQkmJiBtQmVoYXZpb3JhbFNwZWNpZmljYXRpb24tPmhhc0luY29taW5nVHJhbnNpdGlvbigpICk7Cit9CisKKworLyoqCisgKiBHRVRURVIgLSBTRVRURVIKKyAqIG1JbnN0YW5jZVNwZWNpZmllcgorICovCitJbnN0YW5jZVNwZWNpZmllclBhcnQgKiBNYWNoaW5lOjpnZXRVbmlxSW5zdGFuY2VTcGVjaWZpZXIoKQoreworCWlmKCBtSW5zdGFuY2VTcGVjaWZpZXIgPT0gTlVMTCApCisJeworCQltSW5zdGFuY2VTcGVjaWZpZXIgPSBuZXcgSW5zdGFuY2VTcGVjaWZpZXJQYXJ0KHRoaXMsICJpbnN0YW5jZSIpOworCX0KKworCXJldHVybiggbUluc3RhbmNlU3BlY2lmaWVyICk7Cit9CisKKy8qKgorICogR0VUVEVSIC0gU0VUVEVSCisgKiAiYXV0b3N0YXJ0IiBtb2RpZmllciBvZiBJbnN0YW5jZQorICovCitib29sIE1hY2hpbmU6OmlzQXV0b1N0YXJ0KCkgY29uc3QKK3sKKwlyZXR1cm4oIGhhc0luc3RhbmNlU3BlY2lmaWVyKCkKKwkJCSYmIGdldEluc3RhbmNlU3BlY2lmaWVyKCktPmlzQXV0b1N0YXJ0KCkgKTsKK30KKwordm9pZCBNYWNoaW5lOjpzZXRBdXRvU3RhcnQoYm9vbCBiQXV0b1N0YXJ0KQoreworCWdldFVuaXFJbnN0YW5jZVNwZWNpZmllcigpLT5zZXRBdXRvU3RhcnQoIGJBdXRvU3RhcnQgKTsKK30KKworCisvKioKKyAqIEdFVFRFUiAtIFNFVFRFUgorICogbURlY2xhcmF0aW9uUGFyYW1ldGVyCisgKi8KK2NvbnN0IFRhYmxlT2ZWYXJpYWJsZSAmIE1hY2hpbmU6OmdldFZhcmlhYmxlUGFyYW1ldGVycygpIGNvbnN0Cit7CisJcmV0dXJuKCBtUHJvcGVydHlEZWNsYXJhdGlvbi5nZXRWYXJpYWJsZVBhcmFtZXRlcnMoKSApOworfQorCitjb25zdCBCRiAmIE1hY2hpbmU6OmdldFZhcmlhYmxlUGFyYW1ldGVyKGF2bV9zaXplX3Qgb2Zmc2V0KSBjb25zdAoreworCXJldHVybiggbVByb3BlcnR5RGVjbGFyYXRpb24uZ2V0VmFyaWFibGVQYXJhbWV0ZXIob2Zmc2V0KSApOworfQorCithdm1fc2l6ZV90IE1hY2hpbmU6OmdldFZhcmlhYmxlUGFyYW1ldGVyc0NvdW50KCkgY29uc3QKK3sKKwlyZXR1cm4oIG1Qcm9wZXJ0eURlY2xhcmF0aW9uLmdldFZhcmlhYmxlUGFyYW1ldGVyc0NvdW50KCkgKTsKK30KKworYXZtX29mZnNldF90IE1hY2hpbmU6OmdldFZhcmlhYmxlUGFyYW1ldGVyT2Zmc2V0KGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkgY29uc3QKK3sKKwlyZXR1cm4oIG1Qcm9wZXJ0eURlY2xhcmF0aW9uLmdldFZhcmlhYmxlUGFyYW1ldGVyT2Zmc2V0QnlOYW1lSUQoYU5hbWVJRCkgKTsKK30KKworCisvKioKKyAqIEdFVFRFUiAtIFNFVFRFUgorICogbURlY2xhcmF0aW9uUmV0dXJuCisgKi8KK2NvbnN0IFRhYmxlT2ZWYXJpYWJsZSAmIE1hY2hpbmU6OmdldFZhcmlhYmxlUmV0dXJucygpIGNvbnN0Cit7CisJcmV0dXJuKCBtUHJvcGVydHlEZWNsYXJhdGlvbi5nZXRWYXJpYWJsZVJldHVybnMoKSApOworfQorCitjb25zdCBCRiAmIE1hY2hpbmU6OmdldFZhcmlhYmxlUmV0dXJuKGF2bV9zaXplX3Qgb2Zmc2V0KSBjb25zdAoreworCXJldHVybiggbVByb3BlcnR5RGVjbGFyYXRpb24uZ2V0VmFyaWFibGVSZXR1cm4ob2Zmc2V0KSApOworfQorCithdm1fb2Zmc2V0X3QgTWFjaGluZTo6Z2V0VmFyaWFibGVSZXR1cm5zQ291bnQoKSBjb25zdAoreworCXJldHVybiggbVByb3BlcnR5RGVjbGFyYXRpb24uZ2V0VmFyaWFibGVSZXR1cm5zQ291bnQoKSApOworfQorCithdm1fb2Zmc2V0X3QgTWFjaGluZTo6Z2V0VmFyaWFibGVSZXR1cm5PZmZzZXQoY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKSBjb25zdAoreworCXJldHVybiggbVByb3BlcnR5RGVjbGFyYXRpb24uZ2V0VmFyaWFibGVSZXR1cm5PZmZzZXRCeU5hbWVJRChhTmFtZUlEKSApOworfQorCisKKy8qKgorICogR0VUVEVSIC0gU0VUVEVSCisgKiBtUHJvcGVydHlQYXJ0CisgKi8KK2Jvb2wgTWFjaGluZTo6aGFzUHJvcGVydHkoKSBjb25zdAoreworCXJldHVybiggbVByb3BlcnR5RGVjbGFyYXRpb24ubm9uZW1wdHkoKSApOworfQorCitib29sIE1hY2hpbmU6Omhhc1BvcnRTaWduYWwoKSBjb25zdAoreworCXJldHVybiggbVByb3BlcnR5RGVjbGFyYXRpb24uaGFzUG9ydCgpCisJCQl8fCBtUHJvcGVydHlEZWNsYXJhdGlvbi5oYXNTaWduYWwoKSApOworfQorCisKKy8qKgorICogU2VyaWFsaXphdGlvbgorICovCit2b2lkIE1hY2hpbmU6OmhlYWRlcihPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlvcyA8PCBnZXRNb2RpZmllcigpLnRvU3RyaW5nKCkKKwkJCTw8IGdldFNwZWNpZmllcigpLnN0ckRlc2lnbl9ub3QoCisJCQkJCVNwZWNpZmllcjo6REVTSUdOX1BST1RPVFlQRV9TVEFUSUNfS0lORCkKKwkJCTw8IGdldFNwZWNpZmllcigpLmtleXdvcmRDb21wb25lbnQoKTsKKworCWJvb2wgaGFzQ2hldnJvbiA9IGZhbHNlOworCisJaWYoIGhhc1NwZWNpZmllcl9vdGhlclRoYW4oIFNwZWNpZmllcigKKwkJCWdldFNwZWNpZmllcigpLmdldENvbXBvbmVudEtpbmQoKSApLnNldFN0YXRlTW9jU0lNUExFKCkgKSApCisJeworCQlTcGVjaWZpZXIgYVNwZWNpZmllciggZ2V0U3BlY2lmaWVyKCkgKTsKKwkJYVNwZWNpZmllci51bnNldENvbXBvbmVudEtpbmQoKTsKKwkJYVNwZWNpZmllci5yZW1TdGF0ZU1vYyggU3BlY2lmaWVyOjpTVEFURV9TSU1QTEVfTU9DICk7CisJCWFTcGVjaWZpZXIudW5zZXREZXNpZ25LaW5kKCk7CisKKwkJaWYoIGFTcGVjaWZpZXIuaXNEZWZpbmVkKCkgKQorCQl7CisJCQloYXNDaGV2cm9uID0gdHJ1ZTsKKworCQkJb3MgPDwgIjwgIiA8PCBhU3BlY2lmaWVyLnN0cigpOworCQl9CisJfQorCisJaWYoIGhhc093bmVkRWxlbWVudHNTcGVjaWZpZXIoKSApCisJeworCQlTcGVjaWZpZXIgYVNwZWNpZmllciggZ2V0T3duZWRFbGVtZW50c1NwZWNpZmllcigpICk7CisJCWFTcGVjaWZpZXIudW5zZXREZXNpZ25LaW5kKCk7CisKKwkJaWYoIGFTcGVjaWZpZXIuaXNEZWZpbmVkKCkgKQorCQl7CisJCQlpZiggaGFzQ2hldnJvbiApIHsgb3MgPDwgIiAsICI7IH0KKwkJCWVsc2UgeyBvcyA8PCAiPCAiOyBoYXNDaGV2cm9uID0gdHJ1ZTsgfQorCisJCQlvcyA8PCAib3duZWQ6ICIgPDwgYVNwZWNpZmllci5zdHIoKTsKKwkJfQorCX0KKworCWlmKCBoYXNJbnN0YW5jZVNwZWNpZmllcigpICkKKwl7CisJCW1JbnN0YW5jZVNwZWNpZmllci0+aGVhZGVyKG9zLCBoYXNDaGV2cm9uKTsKKwl9CisKKwlvcyA8PCAoIGhhc0NoZXZyb24gPyAiID4gIiA6ICIgIiApOworCisJaWYoIGdldFNwZWNpZmllcigpLmhhc0dyb3VwTWFzaygpICkKKwl7CisJCW9zIDw8ICggZ2V0U3BlY2lmaWVyKCkuaXNHcm91cEV2ZXJ5KCkgPyAiWyoiIDoKKwkJCQkoIGdldFNwZWNpZmllcigpLmlzR3JvdXBFeGNlcHQoKSA/ICJbXiIgOiAiWyIgKSApOworCQlpZiggbUdyb3VwSWQubm9uZW1wdHkoKSApCisJCXsKKwkJCUxpc3RPZlN0cmluZzo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtR3JvdXBJZC5iZWdpbigpOworCQkJTGlzdE9mU3RyaW5nOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IG1Hcm91cElkLmVuZCgpOworCQkJb3MgPDwgKCppdCk7CisJCQlmb3IoICsraXQgOyBpdCAhPSBlbmRJdCA7ICsraXQpCisJCQl7CisJCQkJb3MgPDwgIiAsICIgPDwgKCppdCk7CisJCQl9CisJCX0KKwkJb3MgPDwgIl0iOworCX0KKwllbHNlCisJeworCQlvcyA8PCBnZXROYW1lSUQoKTsKKwl9Cit9CisKKwordm9pZCBNYWNoaW5lOjpzdHJIZWFkZXIoT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJaGVhZGVyKCBvcyApOworCisJbVByb3BlcnR5RGVjbGFyYXRpb24uc3RyVmFyaWFibGVQYXJhbWV0ZXJzKG9zLCAiIFsgIiwgIiBdIiwgIiwgIik7CisKKwltUHJvcGVydHlEZWNsYXJhdGlvbi5zdHJWYXJpYWJsZVJldHVybnMob3MsICIgcmV0dXJuczogWyAiLCAiIF0iLCAiLCAiKTsKK30KKworCit2b2lkIE1hY2hpbmU6OnRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdAoreworCW9zIDw8IFRBQjsKKworCWhlYWRlciggb3MgKTsKKworCW9zIDw8ICIgeyIgPDwgRU9MOworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8KKwlpZiggbU93bmVkRWxlbWVudHMubm9uZW1wdHkoKSApCisJeworCQlvcyA8PCBUQUIgPDwgIi8qb3duZWQ6IFsiIDw8IEVPTF9JTkNSX0lOREVOVAorCQkJCTw8IHN0cl9oZWFkZXIoIG1Pd25lZEVsZW1lbnRzICkgPDwgREVDUl9JTkRFTlRfVEFCCisJCQkJPDwgIl0gLy8gZW5kIG93bmVkKi8iIDw8IEVPTDJfRkxVU0g7CisJfQorCS8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKworCWlmKCBoYXNQcm9wZXJ0eSgpICkKKwl7CisJCW1Qcm9wZXJ0eURlY2xhcmF0aW9uLnRvU3RyZWFtKG9zKTsKKwkJb3MgPDwgRU9MOworCX0KKworCWlmKCAobUJlaGF2aW9yYWxTcGVjaWZpY2F0aW9uICE9IE5VTEwpICYmCisJCW1CZWhhdmlvcmFsU3BlY2lmaWNhdGlvbi0+aGFzQW55Um91dGluZSgpICkKKwl7CisJCW1CZWhhdmlvcmFsU3BlY2lmaWNhdGlvbi0+dG9TdHJlYW1BbnlSb3V0aW5lKCBvcyApOworCX0KKworCWlmKCBtQ29tcG9zaXRlU3BlY2lmaWNhdGlvbiAhPSBOVUxMICkKKwl7CisJCW1Db21wb3NpdGVTcGVjaWZpY2F0aW9uLT50b1N0cmVhbSggb3MgKTsKKwl9CisKKwlpZiggbU1vZGVsT2ZDb21wdXRhdGlvbiAhPSBOVUxMICkKKwl7CisJCW1Nb2RlbE9mQ29tcHV0YXRpb24tPnRvU3RyZWFtKG9zKTsKKwl9CisKKwlpZiggbUludGVyYWN0aW9uU3BlY2lmaWNhdGlvbiAhPSBOVUxMICApCisJeworCQltSW50ZXJhY3Rpb25TcGVjaWZpY2F0aW9uLT50b1N0cmVhbShvcyk7CisJCW9zIDw8IEVPTDsKKwl9CisKKwlpZiggbUJlaGF2aW9yYWxTcGVjaWZpY2F0aW9uICE9IE5VTEwgICkKKwl7CisJCW1CZWhhdmlvcmFsU3BlY2lmaWNhdGlvbi0+dG9TdHJlYW1Nb2Uob3MpOworCQlvcyA8PCBFT0w7CisJfQorCisJb3MgPDwgVEFCIDw8ICJ9IiA8PCBFT0xfRkxVU0g7Cit9CisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL01hY2hpbmUuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9NYWNoaW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFiMjkwZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9NYWNoaW5lLmgKQEAgLTAsMCArMSw2NjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxOCBmw6l2ci4gMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIE1BQ0hJTkVfSF8KKyNkZWZpbmUgTUFDSElORV9IXworCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL01hY2hpbmVRdWVyeS5oPgorCisjaW5jbHVkZSA8Zm1sL2NvbW1vbi9CZWhhdmlvcmFsRWxlbWVudC5oPgorI2luY2x1ZGUgPGZtbC9jb21tb24vU3BlY2lmaWVyRWxlbWVudC5oPgorCisjaW5jbHVkZSA8Y29tbW9uL0F2bVBvaW50ZXIuaD4KKyNpbmNsdWRlIDxjb21tb24vQkYuaD4KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vQkZDb250YWluZXIuaD4KKyNpbmNsdWRlIDxjb2xsZWN0aW9uL1R5cGVkZWYuaD4KKworI2luY2x1ZGUgPGZtbC9jb21tb24vT2JqZWN0RWxlbWVudC5oPgorCisvLyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvQmVoYXZpb3JhbFBhcnQuaD4KKy8vI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Db21wb3NpdGVQYXJ0Lmg+CisvLyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvSW50ZXJhY3Rpb25QYXJ0Lmg+CisvLyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvTW9kZWxPZkNvbXB1dGF0aW9uUGFydC5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Qcm9wZXJ0eVBhcnQuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKK2NsYXNzIEJlaGF2aW9yYWxQYXJ0OworY2xhc3MgQ29tcG9zaXRlUGFydDsKK2NsYXNzIEluc3RhbmNlU3BlY2lmaWVyUGFydDsKK2NsYXNzIEludGVyYWN0aW9uUGFydDsKK2NsYXNzIE1vZGVsT2ZDb21wdXRhdGlvblBhcnQ7CitjbGFzcyBQcm9wZXJ0eVBhcnQ7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIE1BQ0hJTkUgUE9JTlRFUgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTUFDSElORSBTTUFSVCBQT0lOVEVSCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjbGFzcyBNYWNoaW5lIDoKKwkJcHVibGljIE1hY2hpbmVRdWVyeSwKKwkJcHVibGljIEJlaGF2aW9yYWxFbGVtZW50LAorCQlwdWJsaWMgU3BlY2lmaWVySW1wbCwKKwkJQVZNX0lOSkVDVF9JTlNUQU5DRV9DT1VOVEVSX0NMQVNTKCBNYWNoaW5lICkKK3sKKworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBNYWNoaW5lICkKKworCitwdWJsaWM6CisJLyoqCisJICogVFlQRURFRgorCSAqLworCXR5cGVkZWYgVGFibGVPZkJGX1Q8IE9iamVjdEVsZW1lbnQgPiAgVGFibGVPZk93bmVkRWxlbWVudDsKKworCXR5cGVkZWYgVGFibGVPZk93bmVkRWxlbWVudDo6Y29uc3RfcmF3X2l0ZXJhdG9yICBjb25zdF9vd25lZF9pdGVyYXRvcjsKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlMaXN0T2ZTdHJpbmcgbUdyb3VwSWQ7CisKKwlUYWJsZU9mT3duZWRFbGVtZW50IG1Pd25lZEVsZW1lbnRzOworCVNwZWNpZmllciBtT3duZWRFbGVtZW50c1NwZWNpZmllcjsKKworCisJQkYgbU1vZGVsOworCisJUHJvcGVydHlQYXJ0ICAgICAgICAgICAgIG1Qcm9wZXJ0eURlY2xhcmF0aW9uOworCisJTW9kZWxPZkNvbXB1dGF0aW9uUGFydCAqIG1Nb2RlbE9mQ29tcHV0YXRpb247CisKKwlDb21wb3NpdGVQYXJ0ICAgICAgICAgICogbUNvbXBvc2l0ZVNwZWNpZmljYXRpb247CisKKwlJbnRlcmFjdGlvblBhcnQgICAgICAgICogbUludGVyYWN0aW9uU3BlY2lmaWNhdGlvbjsKKworCUJlaGF2aW9yYWxQYXJ0ICAgICAgICAgKiBtQmVoYXZpb3JhbFNwZWNpZmljYXRpb247CisKKwlJbnN0YW5jZVNwZWNpZmllclBhcnQgICogbUluc3RhbmNlU3BlY2lmaWVyOworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBFeGVjdXRhYmxlCisJICovCisJTWFjaGluZShNYWNoaW5lICogYUNvbnRhaW5lciwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELAorCQkJY29uc3QgU3BlY2lmaWVyICYgYU1vY1NwZWNpZmllcik7CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIEluc3RhbmNlCisJICovCisJTWFjaGluZShNYWNoaW5lICogYUNvbnRhaW5lciwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELAorCQkJY29uc3QgU3BlY2lmaWVyICYgYU1vY1NwZWNpZmllciwgY29uc3QgQkYgJiBtb2RlbCwKKwkJCWF2bV9zaXplX3QgYW5Jbml0aWFsSW5zdGFuY2VDb3VudCA9IDEsCisJCQlhdm1fc2l6ZV90IGFNYXhpbWFsSW5zdGFuY2VDb3VudCA9IEFWTV9OVU1FUklDX01BWF9TSVpFX1QpOworCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBPdGhlcgorCSAqLworCU1hY2hpbmUoY2xhc3Nfa2luZF90IGFDbGFzc0tpbmQsIE1hY2hpbmUgKiBhQ29udGFpbmVyLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsIGNvbnN0IHN0ZDo6c3RyaW5nICYgbmFtZSwKKwkJCWNvbnN0IFNwZWNpZmllciAmIGFNb2NTcGVjaWZpZXIpOworCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+TWFjaGluZSgpOworCisJLyoqCisJICogQVBJCisJICogTWFjaGluZVF1ZXJ5CisJICovCisJaW5saW5lIHZpcnR1YWwgY29uc3QgTWFjaGluZSAqIHRoaXNNYWNoaW5lKCkgY29uc3QKKwl7CisJCXJldHVybiggdGhpcyApOworCX0KKworCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBleGVjdXRhYmxlCisJICovCisJaW5saW5lIHN0YXRpYyBNYWNoaW5lICogbmV3RXhlY3V0YWJsZShNYWNoaW5lICogYUNvbnRhaW5lciwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwgU3BlY2lmaWVyIGFNb2NTcGVjaWZpZXIpCisJeworCQlpZiggYU1vY1NwZWNpZmllci5ub25lQ29tcG9uZW50S2luZCgpICkKKwkJeworCQkJYU1vY1NwZWNpZmllci5zZXRDb21wb25lbnRFeGVjdXRhYmxlKCk7CisJCX0KKwkJaWYoIGFNb2NTcGVjaWZpZXIubm9uZURlc2lnbktpbmQoKSApCisJCXsKKwkJCWFNb2NTcGVjaWZpZXIuc2V0RGVzaWduUHJvdG90eXBlU3RhdGljKCk7CisJCX0KKworCQlyZXR1cm4oIG5ldyBNYWNoaW5lKGFDb250YWluZXIsIGFOYW1lSUQsIGFNb2NTcGVjaWZpZXIpICk7CisJfQorCisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIFN0YXRlbWFjaGluZQorCSAqLworCWlubGluZSBzdGF0aWMgTWFjaGluZSAqIG5ld1N0YXRlKE1hY2hpbmUgKiBhQ29udGFpbmVyLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELCBTcGVjaWZpZXIgYU1vY1NwZWNpZmllcikKKwl7CisJCWlmKCBhTW9jU3BlY2lmaWVyLm5vbmVEZXNpZ25LaW5kKCkgKQorCQl7CisJCQlhTW9jU3BlY2lmaWVyLnNldERlc2lnblByb3RvdHlwZVN0YXRpYygpOworCQl9CisKKwkJYU1vY1NwZWNpZmllci5oYXNQc2V1ZG9zdGF0ZU1vYygpCisJCQkJPyBhTW9jU3BlY2lmaWVyLnNldENvbXBvbmVudFBzZXVkb3N0YXRlKCkKKwkJCQk6IGFNb2NTcGVjaWZpZXIuc2V0Q29tcG9uZW50U3RhdGUoKTsKKworCQlyZXR1cm4oIG5ldyBNYWNoaW5lKGFDb250YWluZXIsIGFOYW1lSUQsIGFNb2NTcGVjaWZpZXIpICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBNYWNoaW5lICogbmV3UHNldWRvdGF0ZShNYWNoaW5lICogYUNvbnRhaW5lciwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwgU3BlY2lmaWVyIGFNb2NTcGVjaWZpZXIpCisJeworCQlpZiggYU1vY1NwZWNpZmllci5ub25lRGVzaWduS2luZCgpICkKKwkJeworCQkJYU1vY1NwZWNpZmllci5zZXREZXNpZ25Qcm90b3R5cGVTdGF0aWMoKTsKKwkJfQorCisJCXJldHVybiggbmV3IE1hY2hpbmUoYUNvbnRhaW5lciwgYU5hbWVJRCwKKwkJCQlhTW9jU3BlY2lmaWVyLnNldENvbXBvbmVudFBzZXVkb3N0YXRlKCkgKSApOworCX0KKworCWlubGluZSBzdGF0aWMgTWFjaGluZSAqIG5ld1N0YXRlbWFjaGluZShNYWNoaW5lICogYUNvbnRhaW5lciwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwgU3BlY2lmaWVyIGFNb2NTcGVjaWZpZXIpCisJeworCQlpZiggYU1vY1NwZWNpZmllci5ub25lRGVzaWduS2luZCgpICkKKwkJeworCQkJYU1vY1NwZWNpZmllci5zZXREZXNpZ25Qcm90b3R5cGVTdGF0aWMoKTsKKwkJfQorCisJCXJldHVybiggbmV3IE1hY2hpbmUoYUNvbnRhaW5lciwgYU5hbWVJRCwKKwkJCQlhTW9jU3BlY2lmaWVyLnNldENvbXBvbmVudFN0YXRlbWFjaGluZSgpICkgKTsKKwl9CisKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogSW5zdGFuY2UKKwkgKi8KKwlzdGF0aWMgTWFjaGluZSAqIG5ld0luc3RhbmNlKE1hY2hpbmUgKiBhQ29udGFpbmVyLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELCBjb25zdCBCRiAmIGFNb2RlbCwKKwkJCWF2bV9zaXplX3QgYW5Jbml0aWFsSW5zdGFuY2VDb3VudCA9IDEsCisJCQlhdm1fc2l6ZV90IGFNYXhpbWFsSW5zdGFuY2VDb3VudCA9IEFWTV9OVU1FUklDX01BWF9TSVpFX1QpCisJeworCQlTcGVjaWZpZXIgYVNwZWNpZmllcigKKwkJCQlTcGVjaWZpZXI6OkNPTVBPTkVOVF9FWEVDVVRBQkxFX0tJTkQsCisJCQkJU3BlY2lmaWVyOjpERVNJR05fSU5TVEFOQ0VfU1RBVElDX0tJTkQpOworCisJCXJldHVybiggbmV3IE1hY2hpbmUoYUNvbnRhaW5lciwgYU5hbWVJRCwgYVNwZWNpZmllciwgYU1vZGVsLAorCQkJCWFuSW5pdGlhbEluc3RhbmNlQ291bnQsIGFNYXhpbWFsSW5zdGFuY2VDb3VudCkgKTsKKwl9CisKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogUHJvY2VkdXJlCisJICovCisJaW5saW5lIHN0YXRpYyBNYWNoaW5lICogbmV3UHJvY2VkdXJlKAorCQkJTWFjaGluZSAqIGFDb250YWluZXIsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwKKwkJCWNvbnN0IFNwZWNpZmllciAmIGFNb2NTcGVjaWZpZXIpCisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoIGFNb2NTcGVjaWZpZXIuaXNDb21wb25lbnRQcm9jZWR1cmUoKSApCisJCQkJPDwgIk1hY2hpbmU6Om5ld1Byb2NlZHVyZTo+IFVuZXhwZWN0ZWQgU3BlY2lmaWVyIDw8ICIKKwkJCQk8PCBhTW9jU3BlY2lmaWVyLnN0cigpIDw8ICIgPj4gISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQlyZXR1cm4oIG5ldyBNYWNoaW5lKGFDb250YWluZXIsIGFOYW1lSUQsIGFNb2NTcGVjaWZpZXIgKSApOworCX0KKworCWlubGluZSBzdGF0aWMgTWFjaGluZSAqIG5ld1Byb2NlZHVyZUluc3RhbmNlKE1hY2hpbmUgKiBhQ29udGFpbmVyLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELCBjb25zdCBCRiAmIGFNb2RlbCkKKwl7CisJCXJldHVybiggbmV3IE1hY2hpbmUoYUNvbnRhaW5lciwgYU5hbWVJRCwKKwkJCQlTcGVjaWZpZXI6OkVYRUNVVEFCTEVfUFJPQ0VEVVJFX0lOU1RBTkNFX1NUQVRJQ19TUEVDSUZJRVIsCisJCQkJYU1vZGVsKSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSCisJICogdGhlIG1hY2hpbmUgY29udGFpbmVyCisJICogTENbUl1BCisJICovCisJaW5saW5lIHZpcnR1YWwgTWFjaGluZSAqIGdldENvbnRhaW5lck1hY2hpbmUoKSBjb25zdAorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKAorCQkJaGFzQ29udGFpbmVyKCkgJiYgZ2V0Q29udGFpbmVyKCktPmlzPCBNYWNoaW5lID4oKSApCisJCQkJPDwgIkludmFsaWQgPDwgTWFjaGluZSBDb250YWluZXIgPj4gVHlwZSA8IgorCQkJCTw8IChoYXNDb250YWluZXIoKSA/CisJCQkJCQlnZXRDb250YWluZXIoKS0+Y2xhc3NLaW5kTmFtZSgpIDogIm51bGw8Y29udGFpbmVyPiIpCisJCQkJPDwgIj4gQ2FzdCAhISEiCisJCQkJPDwgU0VORF9FWElUOworCisJCXJldHVybiggZ2V0Q29udGFpbmVyKCktPnRvPCBNYWNoaW5lID4oKSApOworCX0KKworCWNvbnN0IE1hY2hpbmUgKiBMQ0EoY29uc3QgTWFjaGluZSAqIGFNYWNoaW5lKSBjb25zdDsKKworCWlubGluZSBjb25zdCBNYWNoaW5lICogTENSQShjb25zdCBNYWNoaW5lICogYU1hY2hpbmUpIGNvbnN0CisJeworCQlyZXR1cm4oICh0aGlzID09IGFNYWNoaW5lKSA/IHRoaXMgOiBMQ0EoIGFNYWNoaW5lICkgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIERJU1BBVENIIC0gU0FWRQorCSAqIG1Pd25lZEVsZW1lbnRzCisJICovCisJaW5saW5lIGNvbnN0IFRhYmxlT2ZPd25lZEVsZW1lbnQgJiBnZXRPd25lZEVsZW1lbnRzKCkgY29uc3QKKwl7CisJCXJldHVybiggbU93bmVkRWxlbWVudHMgKTsKKwl9CisKKwl2b2lkIGRpc3BhdGNoT3duZWRFbGVtZW50KGNvbnN0IEJGICYgYW5FbGVtZW50KTsKKworCWlubGluZSBjb25zdCBCRiAmIHNhdmVPd25lZEVsZW1lbnQoT2JqZWN0RWxlbWVudCAqIHB0ckVsZW1lbnQpCisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBwdHJFbGVtZW50ICkKKwkJCQk8PCAiRXhlY3V0YWJsZSBNYWNoaW5lIG93bmVkIGVsZW1lbnQgISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQlwdHJFbGVtZW50LT5zZXRPZmZzZXQoIG1Pd25lZEVsZW1lbnRzLnNpemUoKSApOworCisJCW1Pd25lZEVsZW1lbnRzLmFwcGVuZCggSU5DUl9CRiggcHRyRWxlbWVudCApICk7CisKKwkJZGlzcGF0Y2hPd25lZEVsZW1lbnQoIG1Pd25lZEVsZW1lbnRzLmxhc3QoKSApOworCisJCXJldHVybiggbU93bmVkRWxlbWVudHMubGFzdCgpICk7CisJfQorCisKKwkvKioKKwkgKiBbIENPTlNUIF0gSVRFUkFUT1IKKwkgKi8KKwlpbmxpbmUgY29uc3Rfb3duZWRfaXRlcmF0b3Igb3duZWRfYmVnaW4oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtT3duZWRFbGVtZW50cy5iZWdpbigpICk7CisJfQorCisJaW5saW5lIGNvbnN0X293bmVkX2l0ZXJhdG9yIG93bmVkX2VuZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Pd25lZEVsZW1lbnRzLmVuZCgpICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBtT3duZWRFbGVtZW50c1NwZWNpZmllcgorCSAqLworCWlubGluZSBjb25zdCBTcGVjaWZpZXIgJiBnZXRPd25lZEVsZW1lbnRzU3BlY2lmaWVyKCkgY29uc3QKKwl7CisJCXJldHVybiggbU93bmVkRWxlbWVudHNTcGVjaWZpZXIgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNPd25lZEVsZW1lbnRzU3BlY2lmaWVyKCkgY29uc3QKKwl7CisJCXJldHVybiggbU93bmVkRWxlbWVudHNTcGVjaWZpZXIuaXNEZWZpbmVkKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBhZGRPd25lZEVsZW1lbnRTcGVjaWZpZXIoY29uc3QgU3BlY2lmaWVyICYgb3duZWRTcGVjaWZpZXIpCisJeworCQltT3duZWRFbGVtZW50c1NwZWNpZmllciB8PSBvd25lZFNwZWNpZmllcjsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIHRoZSBUeXBlIFNwZWNpZmllcgorCSAqLworCWlubGluZSBjb25zdCBCRiAmIGdldFR5cGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtTW9kZWwgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNUeXBlKCkgY29uc3QKKwl7CisJCXJldHVybiggbU1vZGVsLnZhbGlkKCkgKTsKKwl9CisKKwlpbmxpbmUgc3RkOjpzdHJpbmcgc3RyVHlwZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Nb2RlbC5pczwgTWFjaGluZSA+KCkgPworCQkJCW1Nb2RlbC50b19wdHI8IE1hY2hpbmUgPigpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDoKKwkJCQltTW9kZWwuc3RyKCkgKTsKKwl9CisKKworCS8qKgorCSAgKiBHRVRURVIKKwkgKiB0aGUgbWFjaGluZSB0eXBlIG1vZGVsCisJICovCisJaW5saW5lIGNvbnN0IE1hY2hpbmUgKiBnZXRNb2RlbE1hY2hpbmUoKSBjb25zdAorCXsKKwkJaWYoIGdldFNwZWNpZmllcigpLmhhc0Rlc2lnbk1vZGVsKCkgKQorCQl7CisJCQlyZXR1cm4oIHRoaXMgKTsKKwkJfQorCQllbHNlIC8vaWYoIGlzRGVzaWduSW5zdGFuY2UoKSApCisJCXsKKwkJCXJldHVybiggbU1vZGVsLmlzPCBNYWNoaW5lID4oKSA/CisJCQkJCW1Nb2RlbC50b19wdHI8IE1hY2hpbmUgPigpIDogTlVMTCApOworCQl9CisJfQorCisJaW5saW5lIGJvb2wgaGFzTW9kZWxNYWNoaW5lKCkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0U3BlY2lmaWVyKCkuaGFzRGVzaWduTW9kZWwoKQorCQkJCXx8IChnZXRTcGVjaWZpZXIoKS5oYXNEZXNpZ25JbnN0YW5jZSgpCisJCQkJCSYmIG1Nb2RlbC5pczwgTWFjaGluZSA+KCkpICk7CisJfQorCisKKwkvKioKKwkgICogR0VUVEVSIC0gVEVTVAorCSAqIE1hY2hpbmVNb2NLaW5kSW1wbAorCSAqLworCWlubGluZSBib29sIGlzRmFtaWx5TWFjaGluZUNvbXBvc2l0ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldFNwZWNpZmllcigpLmlzRmFtaWx5Q29tcG9uZW50Q29tcG9zaXRlKCkKKwkJCQl8fCAoIG1Nb2RlbC52YWxpZCgpICYmIG1Nb2RlbC5pc19leGFjdGx5PCBNYWNoaW5lID4oKQorCQkJCQkmJiBtTW9kZWwudG9fcHRyPCBNYWNoaW5lID4oKS0+aXNGYW1pbHlNYWNoaW5lQ29tcG9zaXRlKCkgKSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbURlY2xhcmF0aW9uUGFyYW1ldGVyCisJICovCisJY29uc3QgVGFibGVPZlZhcmlhYmxlICYgZ2V0VmFyaWFibGVQYXJhbWV0ZXJzKCkgY29uc3Q7CisKKwljb25zdCBCRiAmIGdldFZhcmlhYmxlUGFyYW1ldGVyKGF2bV9zaXplX3Qgb2Zmc2V0KSBjb25zdDsKKworCWF2bV9zaXplX3QgZ2V0VmFyaWFibGVQYXJhbWV0ZXJzQ291bnQoKSBjb25zdDsKKworCWF2bV9vZmZzZXRfdCBnZXRWYXJpYWJsZVBhcmFtZXRlck9mZnNldChjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpIGNvbnN0OworCisJaW5saW5lIGJvb2wgaGFzVmFyaWFibGVQYXJhbWV0ZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRWYXJpYWJsZVBhcmFtZXRlcnNDb3VudCgpID4gMCApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbURlY2xhcmF0aW9uUmV0dXJuCisJICovCisJY29uc3QgVGFibGVPZlZhcmlhYmxlICYgZ2V0VmFyaWFibGVSZXR1cm5zKCkgY29uc3Q7CisKKwljb25zdCBCRiAmIGdldFZhcmlhYmxlUmV0dXJuKGF2bV9zaXplX3Qgb2Zmc2V0KSBjb25zdDsKKworCWF2bV9vZmZzZXRfdCBnZXRWYXJpYWJsZVJldHVybnNDb3VudCgpIGNvbnN0OworCisJYXZtX29mZnNldF90IGdldFZhcmlhYmxlUmV0dXJuT2Zmc2V0KGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkgY29uc3Q7CisKKwlpbmxpbmUgYm9vbCBoYXNWYXJpYWJsZVJldHVybigpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldFZhcmlhYmxlUmV0dXJuc0NvdW50KCkgPiAwICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBtRGVjbGFyYXRpb25QYXJhbWV0ZXIKKwkgKiBtRGVjbGFyYXRpb25SZXR1cm4KKwkgKi8KKwlpbmxpbmUgYXZtX29mZnNldF90IGdldFBhcmFtUmV0dXJuQ291bnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRWYXJpYWJsZVBhcmFtZXRlcnNDb3VudCgpICsgZ2V0VmFyaWFibGVSZXR1cm5zQ291bnQoKSApOworCX0KKworCWlubGluZSBib29sIGhhc1BhcmFtUmV0dXJuKCkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0UGFyYW1SZXR1cm5Db3VudCgpID4gMCApOworCX0KKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1Qcm9wZXJ0eVBhcnQKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCBjb25zdCBQcm9wZXJ0eVBhcnQgJiBnZXRQcm9wZXJ0eVBhcnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUHJvcGVydHlEZWNsYXJhdGlvbiApOworCX0KKworCWlubGluZSBQcm9wZXJ0eVBhcnQgJiBnZXRQcm9wZXJ0eVBhcnQoKQorCXsKKwkJcmV0dXJuKCBtUHJvcGVydHlEZWNsYXJhdGlvbiApOworCX0KKworCisJYm9vbCBoYXNQcm9wZXJ0eSgpIGNvbnN0OworCisJYm9vbCBoYXNQb3J0U2lnbmFsKCkgY29uc3Q7CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1Hcm91cElkCisJICovCisJaW5saW5lIGNvbnN0IExpc3RPZlN0cmluZyAmIGdldEdyb3VwSWQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtR3JvdXBJZCApOworCX0KKworCWJvb2wgaGFzR3JvdXBJZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Hcm91cElkLmVtcHR5KCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBhcHBlbmRHcm91cElkKGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkKKwl7CisJCW1Hcm91cElkLmFwcGVuZChhTmFtZUlEKTsKKwl9CisKKwl2b2lkIHNldEdyb3VwSWQoKTsKKworCXZvaWQgZXhwYW5kR3JvdXBTdGF0ZW1hY2hpbmUoKTsKKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbU1vZGVsT2ZDb21wdXRhdGlvbgorCSAqLworCWlubGluZSBNb2RlbE9mQ29tcHV0YXRpb25QYXJ0ICogZ2V0TW9kZWxPZkNvbXB1dGF0aW9uKCkKKwl7CisJCXJldHVybiggbU1vZGVsT2ZDb21wdXRhdGlvbiApOworCX0KKworCU1vZGVsT2ZDb21wdXRhdGlvblBhcnQgKiBnZXRVbmlxTW9kZWxPZkNvbXB1dGF0aW9uKCk7CisKKwlpbmxpbmUgYm9vbCBoYXNNb2RlbE9mQ29tcHV0YXRpb24oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtTW9kZWxPZkNvbXB1dGF0aW9uICE9IE5VTEwgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1Db21wb3NpdGVTcGVjaWZpY2F0aW9uCisJICovCisJaW5saW5lIHZpcnR1YWwgY29uc3QgQ29tcG9zaXRlUGFydCAqIGdldENvbXBvc2l0ZVBhcnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQ29tcG9zaXRlU3BlY2lmaWNhdGlvbiApOworCX0KKworCWlubGluZSBDb21wb3NpdGVQYXJ0ICogZ2V0Q29tcG9zaXRlUGFydCgpCisJeworCQlyZXR1cm4oIG1Db21wb3NpdGVTcGVjaWZpY2F0aW9uICk7CisJfQorCisJQ29tcG9zaXRlUGFydCAqIGdldFVuaXFDb21wb3NpdGVQYXJ0KCk7CisKKwlpbmxpbmUgYm9vbCBoYXNDb21wb3NpdGVQYXJ0KCkgY29uc3QKKwl7CisJCXJldHVybiggbUNvbXBvc2l0ZVNwZWNpZmljYXRpb24gIT0gTlVMTCApOworCX0KKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1Db21wb3NpdGVTcGVjaWZpY2F0aW9uLT5tUHJvY2VkdXJlcworCSAqLworCWJvb2wgaGFzUHJvY2VkdXJlKCkgY29uc3Q7CisKKwl2b2lkIHNhdmVQcm9jZWR1cmUoTWFjaGluZSAqIGFQcm9jZWR1cmUpOworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUNvbXBvc2l0ZVNwZWNpZmljYXRpb24tPm1TdGF0ZXMKKwkgKi8KKwlib29sIGhhc1N0YXRlKCkgY29uc3Q7CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtQ29tcG9zaXRlU3BlY2lmaWNhdGlvbi0+bU1hY2hpbmVzCisJICovCisJYm9vbCBoYXNNYWNoaW5lKCkgY29uc3Q7CisKKwl2b2lkIHNhdmVNYWNoaW5lKE1hY2hpbmUgKiBhTWFjaGluZSk7CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1JbnRlcmFjdGlvblNwZWNpZmljYXRpb24KKwkgKi8KKwlpbmxpbmUgY29uc3QgSW50ZXJhY3Rpb25QYXJ0ICogZ2V0SW50ZXJhY3Rpb24oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtSW50ZXJhY3Rpb25TcGVjaWZpY2F0aW9uICk7CisJfQorCisJSW50ZXJhY3Rpb25QYXJ0ICogZ2V0VW5pcUludGVyYWN0aW9uKCk7CisKKwlpbmxpbmUgYm9vbCBoYXNJbnRlcmFjdGlvbigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1JbnRlcmFjdGlvblNwZWNpZmljYXRpb24gIT0gTlVMTCApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUJlaGF2aW9yYWxTcGVjaWZpY2F0aW9uCisJICovCisJQmVoYXZpb3JhbFBhcnQgKiBnZXRVbmlxQmVoYXZpb3JQYXJ0KCk7CisKKwlpbmxpbmUgdmlydHVhbCBCZWhhdmlvcmFsUGFydCAqIGdldEJlaGF2aW9yUGFydCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1CZWhhdmlvcmFsU3BlY2lmaWNhdGlvbiApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGJvb2wgaGFzQmVoYXZpb3JQYXJ0KCkgY29uc3QKKwl7CisJCXJldHVybiggbUJlaGF2aW9yYWxTcGVjaWZpY2F0aW9uICE9IE5VTEwgKTsKKwl9CisKKworCWlubGluZSBCZWhhdmlvcmFsUGFydCAqIGdldEJlaGF2aW9yKCkgY29uc3QKKwl7CisJCXJldHVybiggbUJlaGF2aW9yYWxTcGVjaWZpY2F0aW9uICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzQmVoYXZpb3IoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobUJlaGF2aW9yYWxTcGVjaWZpY2F0aW9uICE9IE5VTEwpCisJCQkJLyomJiBtQmVoYXZpb3JhbFNwZWNpZmljYXRpb24tPm5vbmVtcHR5KCkqLyApOworCX0KKworCWlubGluZSBib29sIG5vQmVoYXZpb3IoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobUJlaGF2aW9yYWxTcGVjaWZpY2F0aW9uID09IE5VTEwpCisJCQkJLyp8fCBtQmVoYXZpb3JhbFNwZWNpZmljYXRpb24tPmVtcHR5KCkqLyApOworCX0KKworCisJYm9vbCBoYXNSdW5uYWJsZUJlaGF2aW9yKCkgY29uc3Q7CisKKwlib29sIGhhc09uRW5hYmxlKCkgY29uc3Q7CisKKwlib29sIGlzSW5saW5hYmxlRW5hYmxlKCkgY29uc3Q7CisKKwlib29sIGlzSW5saW5hYmxlUHJvY2VkdXJlKCkgY29uc3QKKwl7CisJCXJldHVybiggdHJ1ZSApOworCX0KKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1CZWhhdmlvcmFsU3BlY2lmaWNhdGlvbi0+bU91dGdvaW5nVHJhbnNpdGlvbnMKKwkgKiBtQmVoYXZpb3JhbFNwZWNpZmljYXRpb24tPm1JbmNvbWluZ1RyYW5zaXRpb25zCisJICovCisJYm9vbCBoYXNPdXRnb2luZ1RyYW5zaXRpb24oKSBjb25zdDsKKworCWJvb2wgaGFzSW5jb21pbmdUcmFuc2l0aW9uKCkgY29uc3Q7CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1JbnN0YW5jZVNwZWNpZmllcgorCSAqLworCWlubGluZSBJbnN0YW5jZVNwZWNpZmllclBhcnQgKiBnZXRJbnN0YW5jZVNwZWNpZmllcigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1JbnN0YW5jZVNwZWNpZmllciApOworCX0KKworCUluc3RhbmNlU3BlY2lmaWVyUGFydCAqIGdldFVuaXFJbnN0YW5jZVNwZWNpZmllcigpOworCisJaW5saW5lIGJvb2wgaGFzSW5zdGFuY2VTcGVjaWZpZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtSW5zdGFuY2VTcGVjaWZpZXIgIT0gTlVMTCApOworCX0KKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqICJhdXRvc3RhcnQiIG1vZGlmaWVyIG9mIEluc3RhbmNlCisJICovCisJYm9vbCBpc0F1dG9TdGFydCgpIGNvbnN0OworCisJdm9pZCBzZXRBdXRvU3RhcnQoYm9vbCBiQXV0b1N0YXJ0ID0gdHJ1ZSk7CisKKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwl2b2lkIGhlYWRlcihPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKKwl2aXJ0dWFsIHZvaWQgc3RySGVhZGVyKE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworCXZpcnR1YWwgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKK307CisKKworfQorCisjZW5kaWYgLyogTUFDSElORV9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL01hY2hpbmVRdWVyeS5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvaW5mcmFzdHJ1Y3R1cmUvTWFjaGluZVF1ZXJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjRiYzJkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL01hY2hpbmVRdWVyeS5jcHAKQEAgLTAsMCArMSw4MDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULg0KKyAqDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENyZWF0ZWQgb246IDggbWFycyAyMDE3DQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnINCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSAiTWFjaGluZS5oIg0KKw0KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvQmVoYXZpb3JhbFBhcnQuaD4NCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0NvbXBvc2l0ZVBhcnQuaD4NCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1Byb3BlcnR5UGFydC5oPg0KKw0KKw0KK25hbWVzcGFjZSBzZXANCit7DQorDQorDQorLyoqDQorICogR0VUVEVSIGZvciBQQVJTRVIgLyBDT01QSUxFUg0KKyAqIGFueSBPYmplY3QgRWxlbWVudA0KKyAqLw0KK2NvbnN0IEJGICYgTWFjaGluZVF1ZXJ5OjpnZXRQcm9wZXJ0eUJ5TmFtZUlEKGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkgY29uc3QNCit7DQorCXJldHVybiggZ2V0UHJvcGVydHlQYXJ0KCkuZ2V0UHJvcGVydHlCeU5hbWVJRChhTmFtZUlEKSApOw0KK30NCisNCitjb25zdCBCRiAmIE1hY2hpbmVRdWVyeTo6Z2V0cmVjRm9ybUJ5TmFtZUlEKGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkgY29uc3QNCit7DQorCWNvbnN0IEJGICYgZm9ybSA9IGdldFByb3BlcnR5QnlOYW1lSUQoYU5hbWVJRCk7DQorCWlmKCBmb3JtLnZhbGlkKCkgKQ0KKwl7DQorCQlyZXR1cm4oIGZvcm0gKTsNCisJfQ0KKw0KKwlDb21wb3NpdGVQYXJ0Ojpjb25zdF9tYWNoaW5lX2l0ZXJhdG9yIGl0TWFjaGluZSA9DQorCQkJZ2V0Q29tcG9zaXRlUGFydCgpLT5tYWNoaW5lX2JlZ2luKCk7DQorCUNvbXBvc2l0ZVBhcnQ6OmNvbnN0X21hY2hpbmVfaXRlcmF0b3IgZW5kTWFjaGluZSA9DQorCQkJZ2V0Q29tcG9zaXRlUGFydCgpLT5tYWNoaW5lX2VuZCgpOw0KKwlmb3IoIDsgaXRNYWNoaW5lICE9IGVuZE1hY2hpbmUgOyArK2l0TWFjaGluZSApDQorCXsNCisJCWNvbnN0IEJGICYgZm9ybSA9IChpdE1hY2hpbmUpLT5nZXRQcm9wZXJ0eUJ5TmFtZUlEKGFOYW1lSUQpOw0KKwkJaWYoIGZvcm0udmFsaWQoKSApDQorCQl7DQorCQkJcmV0dXJuKCBmb3JtICk7DQorCQl9DQorCX0NCisNCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsNCit9DQorDQorY29uc3QgQkYgJiBNYWNoaW5lUXVlcnk6OmdldHNlbUZvcm1CeU5hbWVJRChjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpIGNvbnN0DQorew0KKwljb25zdCBNYWNoaW5lICogbWFjaGluZSA9IHRoaXNNYWNoaW5lKCk7DQorDQorCWNvbnN0IEJGICYgZm9ybSA9IG1hY2hpbmUtPmdldFByb3BlcnR5QnlOYW1lSUQoYU5hbWVJRCk7DQorCWlmKCBmb3JtLnZhbGlkKCkgKQ0KKwl7DQorCQlyZXR1cm4oIGZvcm0gKTsNCisJfQ0KKw0KKwl3aGlsZSggbWFjaGluZS0+aGFzQ29udGFpbmVyKCkgJiYNCisJCQltYWNoaW5lLT5nZXRDb250YWluZXIoKS0+aXM8IE1hY2hpbmUgPigpICkNCisJew0KKwkJbWFjaGluZSA9IG1hY2hpbmUtPmdldENvbnRhaW5lcigpLT50bzwgTWFjaGluZSA+KCk7DQorDQorCQljb25zdCBCRiAmIGZvcm0gPSBtYWNoaW5lLT5nZXRQcm9wZXJ0eUJ5TmFtZUlEKGFOYW1lSUQpOw0KKwkJaWYoIGZvcm0udmFsaWQoKSApDQorCQl7DQorCQkJcmV0dXJuKCBmb3JtICk7DQorCQl9DQorCX0NCisNCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsNCit9DQorDQorDQorY29uc3QgQkYgJiBNYWNoaW5lUXVlcnk6OmdldFByb3BlcnR5QnlRdWFsaWZpZWROYW1lSUQoDQorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpIGNvbnN0DQorew0KKwlyZXR1cm4oIGdldFByb3BlcnR5UGFydCgpLg0KKwkJCWdldFByb3BlcnR5QnlRdWFsaWZpZWROYW1lSUQoYVF1YWxpZmllZE5hbWVJRCkgKTsNCit9DQorDQorY29uc3QgQkYgJiBNYWNoaW5lUXVlcnk6OmdldHJlY0Zvcm1CeVF1YWxpZmllZE5hbWVJRCgNCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkgY29uc3QNCit7DQorCWNvbnN0IEJGICYgZm9ybSA9IGdldFByb3BlcnR5QnlRdWFsaWZpZWROYW1lSUQoYVF1YWxpZmllZE5hbWVJRCk7DQorCWlmKCBmb3JtLnZhbGlkKCkgKQ0KKwl7DQorCQlyZXR1cm4oIGZvcm0gKTsNCisJfQ0KKw0KKwlDb21wb3NpdGVQYXJ0Ojpjb25zdF9tYWNoaW5lX2l0ZXJhdG9yIGl0TWFjaGluZSA9DQorCQkJZ2V0Q29tcG9zaXRlUGFydCgpLT5tYWNoaW5lX2JlZ2luKCk7DQorCUNvbXBvc2l0ZVBhcnQ6OmNvbnN0X21hY2hpbmVfaXRlcmF0b3IgZW5kTWFjaGluZSA9DQorCQkJZ2V0Q29tcG9zaXRlUGFydCgpLT5tYWNoaW5lX2VuZCgpOw0KKwlmb3IoIDsgaXRNYWNoaW5lICE9IGVuZE1hY2hpbmUgOyArK2l0TWFjaGluZSApDQorCXsNCisJCWNvbnN0IEJGICYgZm9ybSA9DQorCQkJCShpdE1hY2hpbmUpLT5nZXRQcm9wZXJ0eUJ5UXVhbGlmaWVkTmFtZUlEKGFRdWFsaWZpZWROYW1lSUQpOw0KKwkJaWYoIGZvcm0udmFsaWQoKSApDQorCQl7DQorCQkJcmV0dXJuKCBmb3JtICk7DQorCQl9DQorCX0NCisNCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsNCisNCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsNCit9DQorDQorY29uc3QgQkYgJiBNYWNoaW5lUXVlcnk6OmdldHNlbUZvcm1CeVF1YWxpZmllZE5hbWVJRCgNCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkgY29uc3QNCit7DQorCWNvbnN0IE1hY2hpbmUgKiBtYWNoaW5lID0gdGhpc01hY2hpbmUoKTsNCisNCisJY29uc3QgQkYgJiBmb3JtID0gbWFjaGluZS0+Z2V0UHJvcGVydHlCeVF1YWxpZmllZE5hbWVJRChhUXVhbGlmaWVkTmFtZUlEKTsNCisJaWYoIGZvcm0udmFsaWQoKSApDQorCXsNCisJCXJldHVybiggZm9ybSApOw0KKwl9DQorDQorCXdoaWxlKCBtYWNoaW5lLT5oYXNDb250YWluZXIoKQ0KKwkJCSYmIG1hY2hpbmUtPmdldENvbnRhaW5lcigpLT5pczwgTWFjaGluZSA+KCkgKQ0KKwl7DQorCQltYWNoaW5lID0gbWFjaGluZS0+Z2V0Q29udGFpbmVyKCktPnRvPCBNYWNoaW5lID4oKTsNCisNCisJCWNvbnN0IEJGICYgZm9ybSA9DQorCQkJCW1hY2hpbmUtPmdldFByb3BlcnR5QnlRdWFsaWZpZWROYW1lSUQoYVF1YWxpZmllZE5hbWVJRCk7DQorCQlpZiggZm9ybS52YWxpZCgpICkNCisJCXsNCisJCQlyZXR1cm4oIGZvcm0gKTsNCisJCX0NCisJfQ0KKw0KKwlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOw0KK30NCisNCisNCisvKioNCisgKiBHRVRURVIgZm9yIFBBUlNFUiAvIENPTVBJTEVSDQorICogVmFyaWFibGUNCisgKi8NCitjb25zdCBCRiAmIE1hY2hpbmVRdWVyeTo6Z2V0VmFyaWFibGUoY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKSBjb25zdA0KK3sNCisJcmV0dXJuKCBnZXRQcm9wZXJ0eVBhcnQoKS5nZXRWYXJpYWJsZShhUXVhbGlmaWVkTmFtZUlEKSApOw0KK30NCisNCitjb25zdCBCRiAmIE1hY2hpbmVRdWVyeTo6Z2V0cmVjVmFyaWFibGUoDQorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpIGNvbnN0DQorew0KKwljb25zdCBCRiAmIHZhciA9IGdldFZhcmlhYmxlKGFRdWFsaWZpZWROYW1lSUQpOw0KKwlpZiggdmFyLnZhbGlkKCkgKQ0KKwl7DQorCQlyZXR1cm4oIHZhciApOw0KKwl9DQorDQorCUNvbXBvc2l0ZVBhcnQ6OmNvbnN0X21hY2hpbmVfaXRlcmF0b3IgaXRNYWNoaW5lID0NCisJCQlnZXRDb21wb3NpdGVQYXJ0KCktPm1hY2hpbmVfYmVnaW4oKTsNCisJQ29tcG9zaXRlUGFydDo6Y29uc3RfbWFjaGluZV9pdGVyYXRvciBlbmRNYWNoaW5lID0NCisJCQlnZXRDb21wb3NpdGVQYXJ0KCktPm1hY2hpbmVfZW5kKCk7DQorCWZvciggOyBpdE1hY2hpbmUgIT0gZW5kTWFjaGluZSA7ICsraXRNYWNoaW5lICkNCisJew0KKwkJY29uc3QgQkYgJiB2YXIgPSAoaXRNYWNoaW5lKS0+Z2V0cmVjVmFyaWFibGUoYVF1YWxpZmllZE5hbWVJRCk7DQorCQlpZiggdmFyLnZhbGlkKCkgKQ0KKwkJew0KKwkJCXJldHVybiggdmFyICk7DQorCQl9DQorCX0NCisNCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsNCit9DQorDQorY29uc3QgQkYgJiBNYWNoaW5lUXVlcnk6OmdldHNlbVZhcmlhYmxlKA0KKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKSBjb25zdA0KK3sNCisJY29uc3QgTWFjaGluZSAqIG1hY2hpbmUgPSB0aGlzTWFjaGluZSgpOw0KKw0KKwljb25zdCBCRiAmIHZhciA9IG1hY2hpbmUtPmdldFZhcmlhYmxlKGFRdWFsaWZpZWROYW1lSUQpOw0KKwlpZiggdmFyLnZhbGlkKCkgKQ0KKwl7DQorCQlyZXR1cm4oIHZhciApOw0KKwl9DQorDQorCXdoaWxlKCBtYWNoaW5lLT5oYXNDb250YWluZXIoKQ0KKwkJCSYmIG1hY2hpbmUtPmdldENvbnRhaW5lcigpLT5pczwgTWFjaGluZSA+KCkgKQ0KKwl7DQorCQltYWNoaW5lID0gbWFjaGluZS0+Z2V0Q29udGFpbmVyKCktPnRvPCBNYWNoaW5lID4oKTsNCisNCisJCWNvbnN0IEJGICYgdmFyID0gbWFjaGluZS0+Z2V0VmFyaWFibGUoYVF1YWxpZmllZE5hbWVJRCk7DQorCQlpZiggdmFyLnZhbGlkKCkgKQ0KKwkJew0KKwkJCXJldHVybiggdmFyICk7DQorCQl9DQorCX0NCisNCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsNCit9DQorDQorDQorLyoNCisgKiBUWVBFREVGIFZBUklBQkxFDQorICogYXMgRU5VTUVSQVRJT04gfCBTVFJVQ1RVUkUNCisgKi8NCisNCitjb25zdCBCRiAmIE1hY2hpbmVRdWVyeTo6Z2V0RGF0YVR5cGUoY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKSBjb25zdA0KK3sNCisJcmV0dXJuKCBnZXRQcm9wZXJ0eVBhcnQoKS5nZXREYXRhVHlwZShhUXVhbGlmaWVkTmFtZUlEKSApOw0KK30NCisNCitjb25zdCBCRiAmIE1hY2hpbmVRdWVyeTo6Z2V0cmVjRGF0YVR5cGUoDQorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpIGNvbnN0DQorew0KKwljb25zdCBCRiAmIHZhciA9IGdldERhdGFUeXBlKGFRdWFsaWZpZWROYW1lSUQpOw0KKwlpZiggdmFyLnZhbGlkKCkgKQ0KKwl7DQorCQlyZXR1cm4oIHZhciApOw0KKwl9DQorDQorCUNvbXBvc2l0ZVBhcnQ6OmNvbnN0X21hY2hpbmVfaXRlcmF0b3IgaXRNYWNoaW5lID0NCisJCQlnZXRDb21wb3NpdGVQYXJ0KCktPm1hY2hpbmVfYmVnaW4oKTsNCisJQ29tcG9zaXRlUGFydDo6Y29uc3RfbWFjaGluZV9pdGVyYXRvciBlbmRNYWNoaW5lID0NCisJCQlnZXRDb21wb3NpdGVQYXJ0KCktPm1hY2hpbmVfZW5kKCk7DQorCWZvciggOyBpdE1hY2hpbmUgIT0gZW5kTWFjaGluZSA7ICsraXRNYWNoaW5lICkNCisJew0KKwkJY29uc3QgQkYgJiB2YXIgPSAoaXRNYWNoaW5lKS0+Z2V0cmVjRGF0YVR5cGUoYVF1YWxpZmllZE5hbWVJRCk7DQorCQlpZiggdmFyLnZhbGlkKCkgKQ0KKwkJew0KKwkJCXJldHVybiggdmFyICk7DQorCQl9DQorCX0NCisNCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsNCit9DQorDQorY29uc3QgQkYgJiBNYWNoaW5lUXVlcnk6OmdldHNlbURhdGFUeXBlKA0KKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKSBjb25zdA0KK3sNCisJY29uc3QgTWFjaGluZSAqIG1hY2hpbmUgPSB0aGlzTWFjaGluZSgpOw0KKw0KKwljb25zdCBCRiAmIHZhciA9IG1hY2hpbmUtPmdldERhdGFUeXBlKGFRdWFsaWZpZWROYW1lSUQpOw0KKwlpZiggdmFyLnZhbGlkKCkgKQ0KKwl7DQorCQlyZXR1cm4oIHZhciApOw0KKwl9DQorDQorCXdoaWxlKCBtYWNoaW5lLT5oYXNDb250YWluZXIoKQ0KKwkJCSYmIG1hY2hpbmUtPmdldENvbnRhaW5lcigpLT5pczwgTWFjaGluZSA+KCkgKQ0KKwl7DQorCQltYWNoaW5lID0gbWFjaGluZS0+Z2V0Q29udGFpbmVyKCktPnRvPCBNYWNoaW5lID4oKTsNCisNCisJCWNvbnN0IEJGICYgdmFyID0gbWFjaGluZS0+Z2V0RGF0YVR5cGUoYVF1YWxpZmllZE5hbWVJRCk7DQorCQlpZiggdmFyLnZhbGlkKCkgKQ0KKwkJew0KKwkJCXJldHVybiggdmFyICk7DQorCQl9DQorCX0NCisNCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsNCit9DQorDQorDQorLyoqDQorICogR0VUVEVSIGZvciBQQVJTRVIgLyBDT01QSUxFUg0KKyAqIEJ1ZmZlcg0KKyAqLw0KK2NvbnN0IEJGICYgTWFjaGluZVF1ZXJ5OjpnZXRCdWZmZXIoY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKSBjb25zdA0KK3sNCisJcmV0dXJuKCBnZXRQcm9wZXJ0eVBhcnQoKS5nZXRCdWZmZXIoYVF1YWxpZmllZE5hbWVJRCkgKTsNCit9DQorDQorY29uc3QgQkYgJiBNYWNoaW5lUXVlcnk6OmdldHJlY0J1ZmZlcihjb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpIGNvbnN0DQorew0KKwljb25zdCBCRiAmIHZhciA9IGdldEJ1ZmZlcihhUXVhbGlmaWVkTmFtZUlEKTsNCisJaWYoIHZhci52YWxpZCgpICkNCisJew0KKwkJcmV0dXJuKCB2YXIgKTsNCisJfQ0KKw0KKwlDb21wb3NpdGVQYXJ0Ojpjb25zdF9tYWNoaW5lX2l0ZXJhdG9yIGl0TWFjaGluZSA9DQorCQkJZ2V0Q29tcG9zaXRlUGFydCgpLT5tYWNoaW5lX2JlZ2luKCk7DQorCUNvbXBvc2l0ZVBhcnQ6OmNvbnN0X21hY2hpbmVfaXRlcmF0b3IgZW5kTWFjaGluZSA9DQorCQkJZ2V0Q29tcG9zaXRlUGFydCgpLT5tYWNoaW5lX2VuZCgpOw0KKwlmb3IoIDsgaXRNYWNoaW5lICE9IGVuZE1hY2hpbmUgOyArK2l0TWFjaGluZSApDQorCXsNCisJCWNvbnN0IEJGICYgdmFyID0gKGl0TWFjaGluZSktPmdldHJlY0J1ZmZlcihhUXVhbGlmaWVkTmFtZUlEKTsNCisJCWlmKCB2YXIudmFsaWQoKSApDQorCQl7DQorCQkJcmV0dXJuKCB2YXIgKTsNCisJCX0NCisJfQ0KKw0KKwlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOw0KK30NCisNCitjb25zdCBCRiAmIE1hY2hpbmVRdWVyeTo6Z2V0c2VtQnVmZmVyKA0KKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKSBjb25zdA0KK3sNCisJY29uc3QgTWFjaGluZSAqIG1hY2hpbmUgPSB0aGlzTWFjaGluZSgpOw0KKw0KKwljb25zdCBCRiAmIHZhciA9IG1hY2hpbmUtPmdldEJ1ZmZlcihhUXVhbGlmaWVkTmFtZUlEKTsNCisJaWYoIHZhci52YWxpZCgpICkNCisJew0KKwkJcmV0dXJuKCB2YXIgKTsNCisJfQ0KKw0KKwl3aGlsZSggbWFjaGluZS0+aGFzQ29udGFpbmVyKCkNCisJCQkmJiBtYWNoaW5lLT5nZXRDb250YWluZXIoKS0+aXM8IE1hY2hpbmUgPigpICkNCisJew0KKwkJbWFjaGluZSA9IG1hY2hpbmUtPmdldENvbnRhaW5lcigpLT50bzwgTWFjaGluZSA+KCk7DQorDQorCQljb25zdCBCRiAmIHZhciA9IG1hY2hpbmUtPmdldEJ1ZmZlcihhUXVhbGlmaWVkTmFtZUlEKTsNCisJCWlmKCB2YXIudmFsaWQoKSApDQorCQl7DQorCQkJcmV0dXJuKCB2YXIgKTsNCisJCX0NCisJfQ0KKw0KKwlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOw0KK30NCisNCisNCisvKioNCisgKiBHRVRURVIgZm9yIFBBUlNFUiAvIENPTVBJTEVSDQorICogQ2hhbm5lbA0KKyAqLw0KK2NvbnN0IEJGICYgTWFjaGluZVF1ZXJ5OjpnZXRDaGFubmVsKGNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkgY29uc3QNCit7DQorCXJldHVybiggZ2V0UHJvcGVydHlQYXJ0KCkuZ2V0Q2hhbm5lbChhUXVhbGlmaWVkTmFtZUlEKSApOw0KK30NCisNCitjb25zdCBCRiAmIE1hY2hpbmVRdWVyeTo6Z2V0cmVjQ2hhbm5lbCgNCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkgY29uc3QNCit7DQorCWNvbnN0IEJGICYgdmFyID0gZ2V0Q2hhbm5lbChhUXVhbGlmaWVkTmFtZUlEKTsNCisJaWYoIHZhci52YWxpZCgpICkNCisJew0KKwkJcmV0dXJuKCB2YXIgKTsNCisJfQ0KKw0KKwlDb21wb3NpdGVQYXJ0Ojpjb25zdF9tYWNoaW5lX2l0ZXJhdG9yIGl0TWFjaGluZSA9DQorCQkJZ2V0Q29tcG9zaXRlUGFydCgpLT5tYWNoaW5lX2JlZ2luKCk7DQorCUNvbXBvc2l0ZVBhcnQ6OmNvbnN0X21hY2hpbmVfaXRlcmF0b3IgZW5kTWFjaGluZSA9DQorCQkJZ2V0Q29tcG9zaXRlUGFydCgpLT5tYWNoaW5lX2VuZCgpOw0KKwlmb3IoIDsgaXRNYWNoaW5lICE9IGVuZE1hY2hpbmUgOyArK2l0TWFjaGluZSApDQorCXsNCisJCWNvbnN0IEJGICYgdmFyID0gKGl0TWFjaGluZSktPmdldHJlY0NoYW5uZWwoYVF1YWxpZmllZE5hbWVJRCk7DQorCQlpZiggdmFyLnZhbGlkKCkgKQ0KKwkJew0KKwkJCXJldHVybiggdmFyICk7DQorCQl9DQorCX0NCisNCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsNCit9DQorDQorY29uc3QgQkYgJiBNYWNoaW5lUXVlcnk6OmdldHNlbUNoYW5uZWwoDQorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpIGNvbnN0DQorew0KKwljb25zdCBNYWNoaW5lICogbWFjaGluZSA9IHRoaXNNYWNoaW5lKCk7DQorDQorCWNvbnN0IEJGICYgdmFyID0gbWFjaGluZS0+Z2V0Q2hhbm5lbChhUXVhbGlmaWVkTmFtZUlEKTsNCisJaWYoIHZhci52YWxpZCgpICkNCisJew0KKwkJcmV0dXJuKCB2YXIgKTsNCisJfQ0KKw0KKwl3aGlsZSggbWFjaGluZS0+aGFzQ29udGFpbmVyKCkNCisJCQkmJiBtYWNoaW5lLT5nZXRDb250YWluZXIoKS0+aXM8IE1hY2hpbmUgPigpICkNCisJew0KKwkJbWFjaGluZSA9IG1hY2hpbmUtPmdldENvbnRhaW5lcigpLT50bzwgTWFjaGluZSA+KCk7DQorDQorCQljb25zdCBCRiAmIHZhciA9IG1hY2hpbmUtPmdldENoYW5uZWwoYVF1YWxpZmllZE5hbWVJRCk7DQorCQlpZiggdmFyLnZhbGlkKCkgKQ0KKwkJew0KKwkJCXJldHVybiggdmFyICk7DQorCQl9DQorCX0NCisNCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsNCit9DQorDQorDQorLyoqDQorICogR0VUVEVSIGZvciBQQVJTRVIgLyBDT01QSUxFUg0KKyAqIFBvcnQNCisgKi8NCitjb25zdCBCRiAmIE1hY2hpbmVRdWVyeTo6Z2V0UG9ydChjb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpIGNvbnN0DQorew0KKwlyZXR1cm4oIGdldFByb3BlcnR5UGFydCgpLmdldFBvcnQoYVF1YWxpZmllZE5hbWVJRCkgKTsNCit9DQorDQorY29uc3QgQkYgJiBNYWNoaW5lUXVlcnk6OmdldHJlY1BvcnQoY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKSBjb25zdA0KK3sNCisJY29uc3QgQkYgJiB2YXIgPSBnZXRQb3J0KGFRdWFsaWZpZWROYW1lSUQpOw0KKwlpZiggdmFyLnZhbGlkKCkgKQ0KKwl7DQorCQlyZXR1cm4oIHZhciApOw0KKwl9DQorDQorCUNvbXBvc2l0ZVBhcnQ6OmNvbnN0X21hY2hpbmVfaXRlcmF0b3IgaXRNYWNoaW5lID0NCisJCQlnZXRDb21wb3NpdGVQYXJ0KCktPm1hY2hpbmVfYmVnaW4oKTsNCisJQ29tcG9zaXRlUGFydDo6Y29uc3RfbWFjaGluZV9pdGVyYXRvciBlbmRNYWNoaW5lID0NCisJCQlnZXRDb21wb3NpdGVQYXJ0KCktPm1hY2hpbmVfZW5kKCk7DQorCWZvciggOyBpdE1hY2hpbmUgIT0gZW5kTWFjaGluZSA7ICsraXRNYWNoaW5lICkNCisJew0KKwkJY29uc3QgQkYgJiB2YXIgPSAoaXRNYWNoaW5lKS0+Z2V0cmVjUG9ydChhUXVhbGlmaWVkTmFtZUlEKTsNCisJCWlmKCB2YXIudmFsaWQoKSApDQorCQl7DQorCQkJcmV0dXJuKCB2YXIgKTsNCisJCX0NCisJfQ0KKw0KKwlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOw0KK30NCisNCitjb25zdCBCRiAmIE1hY2hpbmVRdWVyeTo6Z2V0c2VtUG9ydChjb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpIGNvbnN0DQorew0KKwljb25zdCBNYWNoaW5lICogbWFjaGluZSA9IHRoaXNNYWNoaW5lKCk7DQorDQorCWNvbnN0IEJGICYgdmFyID0gbWFjaGluZS0+Z2V0UG9ydChhUXVhbGlmaWVkTmFtZUlEKTsNCisJaWYoIHZhci52YWxpZCgpICkNCisJew0KKwkJcmV0dXJuKCB2YXIgKTsNCisJfQ0KKw0KKwl3aGlsZSggbWFjaGluZS0+aGFzQ29udGFpbmVyKCkNCisJCQkmJiBtYWNoaW5lLT5nZXRDb250YWluZXIoKS0+aXM8IE1hY2hpbmUgPigpICkNCisJew0KKwkJbWFjaGluZSA9IG1hY2hpbmUtPmdldENvbnRhaW5lcigpLT50bzwgTWFjaGluZSA+KCk7DQorDQorCQljb25zdCBCRiAmIHZhciA9IG1hY2hpbmUtPmdldFBvcnQoYVF1YWxpZmllZE5hbWVJRCk7DQorCQlpZiggdmFyLnZhbGlkKCkgKQ0KKwkJew0KKwkJCXJldHVybiggdmFyICk7DQorCQl9DQorCX0NCisNCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsNCit9DQorDQorDQorLyoqDQorICogR0VUVEVSIGZvciBQQVJTRVIgLyBDT01QSUxFUg0KKyAqIFNpZ25hbA0KKyAqLw0KK2NvbnN0IEJGICYgTWFjaGluZVF1ZXJ5OjpnZXRTaWduYWwoY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKSBjb25zdA0KK3sNCisJcmV0dXJuKCBnZXRQcm9wZXJ0eVBhcnQoKS5nZXRTaWduYWwoYVF1YWxpZmllZE5hbWVJRCkgKTsNCit9DQorDQorY29uc3QgQkYgJiBNYWNoaW5lUXVlcnk6OmdldHJlY1NpZ25hbCgNCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkgY29uc3QNCit7DQorCWNvbnN0IEJGICYgdmFyID0gZ2V0U2lnbmFsKGFRdWFsaWZpZWROYW1lSUQpOw0KKwlpZiggdmFyLnZhbGlkKCkgKQ0KKwl7DQorCQlyZXR1cm4oIHZhciApOw0KKwl9DQorDQorCUNvbXBvc2l0ZVBhcnQ6OmNvbnN0X21hY2hpbmVfaXRlcmF0b3IgaXRNYWNoaW5lID0NCisJCQlnZXRDb21wb3NpdGVQYXJ0KCktPm1hY2hpbmVfYmVnaW4oKTsNCisJQ29tcG9zaXRlUGFydDo6Y29uc3RfbWFjaGluZV9pdGVyYXRvciBlbmRNYWNoaW5lID0NCisJCQlnZXRDb21wb3NpdGVQYXJ0KCktPm1hY2hpbmVfZW5kKCk7DQorCWZvciggOyBpdE1hY2hpbmUgIT0gZW5kTWFjaGluZSA7ICsraXRNYWNoaW5lICkNCisJew0KKwkJY29uc3QgQkYgJiB2YXIgPSAoaXRNYWNoaW5lKS0+Z2V0cmVjU2lnbmFsKGFRdWFsaWZpZWROYW1lSUQpOw0KKwkJaWYoIHZhci52YWxpZCgpICkNCisJCXsNCisJCQlyZXR1cm4oIHZhciApOw0KKwkJfQ0KKwl9DQorDQorCXJldHVybiggQkY6OlJFRl9OVUxMICk7DQorfQ0KKw0KK2NvbnN0IEJGICYgTWFjaGluZVF1ZXJ5OjpnZXRzZW1TaWduYWwoDQorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpIGNvbnN0DQorew0KKwljb25zdCBNYWNoaW5lICogbWFjaGluZSA9IHRoaXNNYWNoaW5lKCk7DQorDQorCWNvbnN0IEJGICYgdmFyID0gbWFjaGluZS0+Z2V0U2lnbmFsKGFRdWFsaWZpZWROYW1lSUQpOw0KKwlpZiggdmFyLnZhbGlkKCkgKQ0KKwl7DQorCQlyZXR1cm4oIHZhciApOw0KKwl9DQorCXdoaWxlKCBtYWNoaW5lLT5oYXNDb250YWluZXIoKQ0KKwkJCSYmIG1hY2hpbmUtPmdldENvbnRhaW5lcigpLT5pczwgTWFjaGluZSA+KCkgKQ0KKwl7DQorCQltYWNoaW5lID0gbWFjaGluZS0+Z2V0Q29udGFpbmVyKCktPnRvPCBNYWNoaW5lID4oKTsNCisNCisJCWNvbnN0IEJGICYgdmFyID0gbWFjaGluZS0+Z2V0U2lnbmFsKGFRdWFsaWZpZWROYW1lSUQpOw0KKwkJaWYoIHZhci52YWxpZCgpICkNCisJCXsNCisJCQlyZXR1cm4oIHZhciApOw0KKwkJfQ0KKwl9DQorDQorCXJldHVybiggQkY6OlJFRl9OVUxMICk7DQorfQ0KKw0KKw0KKy8qKg0KKyAqIEdFVFRFUiBmb3IgUEFSU0VSIC8gQ09NUElMRVINCisgKiBQb3J0IC8gU2lnbmFsDQorICovDQorY29uc3QgQkYgJiBNYWNoaW5lUXVlcnk6OmdldFBvcnRTaWduYWwoDQorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpIGNvbnN0DQorew0KKwlyZXR1cm4oIGdldFByb3BlcnR5UGFydCgpLmdldFBvcnRTaWduYWwoYVF1YWxpZmllZE5hbWVJRCkgKTsNCit9DQorDQorY29uc3QgQkYgJiBNYWNoaW5lUXVlcnk6OmdldHJlY1BvcnRTaWduYWwoDQorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpIGNvbnN0DQorew0KKwl7DQorCQljb25zdCBCRiAmIHZhciA9IGdldFBvcnRTaWduYWwoYVF1YWxpZmllZE5hbWVJRCk7DQorCQlpZiggdmFyLnZhbGlkKCkgKQ0KKwkJew0KKwkJCXJldHVybiggdmFyICk7DQorCQl9DQorCX0NCisNCisJQ29tcG9zaXRlUGFydDo6Y29uc3RfbWFjaGluZV9pdGVyYXRvciBpdE1hY2hpbmUgPQ0KKwkJCWdldENvbXBvc2l0ZVBhcnQoKS0+bWFjaGluZV9iZWdpbigpOw0KKwlDb21wb3NpdGVQYXJ0Ojpjb25zdF9tYWNoaW5lX2l0ZXJhdG9yIGVuZE1hY2hpbmUgPQ0KKwkJCWdldENvbXBvc2l0ZVBhcnQoKS0+bWFjaGluZV9lbmQoKTsNCisJZm9yKCA7IGl0TWFjaGluZSAhPSBlbmRNYWNoaW5lIDsgKytpdE1hY2hpbmUgKQ0KKwl7DQorCQljb25zdCBCRiAmIHZhciA9IChpdE1hY2hpbmUpLT5nZXRyZWNQb3J0U2lnbmFsKGFRdWFsaWZpZWROYW1lSUQpOw0KKwkJaWYoIHZhci52YWxpZCgpICkNCisJCXsNCisJCQlyZXR1cm4oIHZhciApOw0KKwkJfQ0KKwl9DQorDQorCXJldHVybiggQkY6OlJFRl9OVUxMICk7DQorfQ0KKw0KK2NvbnN0IEJGICYgTWFjaGluZVF1ZXJ5OjpnZXRzZW1Qb3J0U2lnbmFsKA0KKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKSBjb25zdA0KK3sNCisJY29uc3QgTWFjaGluZSAqIG1hY2hpbmUgPSB0aGlzTWFjaGluZSgpOw0KKw0KKwl7DQorCQljb25zdCBCRiAmIHZhciA9IG1hY2hpbmUtPmdldFBvcnRTaWduYWwoYVF1YWxpZmllZE5hbWVJRCk7DQorCQlpZiggdmFyLnZhbGlkKCkgKQ0KKwkJew0KKwkJCXJldHVybiggdmFyICk7DQorCQl9DQorCX0NCisJd2hpbGUoIG1hY2hpbmUtPmhhc0NvbnRhaW5lcigpDQorCQkJJiYgbWFjaGluZS0+Z2V0Q29udGFpbmVyKCktPmlzPCBNYWNoaW5lID4oKSApDQorCXsNCisJCW1hY2hpbmUgPSBtYWNoaW5lLT5nZXRDb250YWluZXIoKS0+dG88IE1hY2hpbmUgPigpOw0KKw0KKwkJY29uc3QgQkYgJiB2YXIgPSBtYWNoaW5lLT5nZXRQb3J0U2lnbmFsKGFRdWFsaWZpZWROYW1lSUQpOw0KKwkJaWYoIHZhci52YWxpZCgpICkNCisJCXsNCisJCQlyZXR1cm4oIHZhciApOw0KKwkJfQ0KKwl9DQorDQorCXJldHVybiggQkY6OlJFRl9OVUxMICk7DQorfQ0KKw0KKw0KKy8qKg0KKyAqIEdFVFRFUiBmb3IgUEFSU0VSIC8gQ09NUElMRVINCisgKiBSb3V0aW5lDQorICovDQorUm91dGluZSAqIE1hY2hpbmVRdWVyeTo6cmF3Um91dGluZUJ5TmFtZUlEKGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkgY29uc3QNCit7DQorCXJldHVybiggKG5vdCBoYXNCZWhhdmlvclBhcnQoKSkgPyBOVUxMIDoNCisJCQlnZXRCZWhhdmlvclBhcnQoKS0+cmF3Um91dGluZUJ5TmFtZUlEKGFOYW1lSUQpICk7DQorfQ0KKw0KK1JvdXRpbmUgKiBNYWNoaW5lUXVlcnk6OnJhd3NlbVJvdXRpbmVCeU5hbWVJRChjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpIGNvbnN0DQorew0KKwljb25zdCBNYWNoaW5lICogbWFjaGluZSA9IHRoaXNNYWNoaW5lKCk7DQorDQorCVJvdXRpbmUgKiByb3V0aW5lID0gbWFjaGluZS0+cmF3Um91dGluZUJ5TmFtZUlEKGFOYW1lSUQpOw0KKw0KKwl3aGlsZSggKHJvdXRpbmUgPT0gTlVMTCkgJiYgbWFjaGluZS0+aGFzQ29udGFpbmVyKCkgJiYNCisJCQltYWNoaW5lLT5nZXRDb250YWluZXIoKS0+aXM8IE1hY2hpbmUgPigpICkNCisJew0KKwkJbWFjaGluZSA9IG1hY2hpbmUtPmdldENvbnRhaW5lcigpLT50bzwgTWFjaGluZSA+KCk7DQorDQorCQlyb3V0aW5lID0gbWFjaGluZS0+cmF3Um91dGluZUJ5TmFtZUlEKGFOYW1lSUQpOw0KKwl9DQorDQorCXJldHVybiggcm91dGluZSApOw0KK30NCisNCisNCisvKioNCisgKiBHRVRURVIgZm9yIFBBUlNFUiAvIENPTVBJTEVSDQorICogUHJvY2VkdXJlDQorICovDQorTWFjaGluZSAqIE1hY2hpbmVRdWVyeTo6cmF3UHJvY2VkdXJlQnlOYW1lSUQoY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKSBjb25zdA0KK3sNCisJcmV0dXJuKCAoZ2V0Q29tcG9zaXRlUGFydCgpID09IE5VTEwpID8gTlVMTCA6DQorCQkJZ2V0Q29tcG9zaXRlUGFydCgpLT5yYXdQcm9jZWR1cmVCeU5hbWVJRChhTmFtZUlEKSApOw0KK30NCisNCitNYWNoaW5lICogTWFjaGluZVF1ZXJ5OjpyYXdzZW1Qcm9jZWR1cmVCeU5hbWVJRCgNCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkgY29uc3QNCit7DQorCWNvbnN0IE1hY2hpbmUgKiBtYWNoaW5lID0gdGhpc01hY2hpbmUoKTsNCisNCisJTWFjaGluZSAqIHByb2NlZHVyZSA9IG1hY2hpbmUtPnJhd1Byb2NlZHVyZUJ5TmFtZUlEKGFOYW1lSUQpOw0KKw0KKwl3aGlsZSggKHByb2NlZHVyZSA9PSBOVUxMKSAmJiBtYWNoaW5lLT5oYXNDb250YWluZXIoKSAmJg0KKwkJCW1hY2hpbmUtPmdldENvbnRhaW5lcigpLT5pczwgTWFjaGluZSA+KCkgKQ0KKwl7DQorCQltYWNoaW5lID0gbWFjaGluZS0+Z2V0Q29udGFpbmVyKCktPnRvPCBNYWNoaW5lID4oKTsNCisNCisJCXByb2NlZHVyZSA9IG1hY2hpbmUtPnJhd1Byb2NlZHVyZUJ5TmFtZUlEKGFOYW1lSUQpOw0KKwl9DQorDQorCXJldHVybiggcHJvY2VkdXJlICk7DQorfQ0KKw0KKw0KKy8qKg0KKyAqIEdFVFRFUiBmb3IgUEFSU0VSIC8gQ09NUElMRVINCisgKiBNYWNoaW5lDQorICovDQorTWFjaGluZSAqIE1hY2hpbmVRdWVyeTo6Z2V0TWFjaGluZUJ5TmFtZUlEKGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkgY29uc3QNCit7DQorCWlmKCB0aGlzTWFjaGluZSgpLT5nZXROYW1lSUQoKSA9PSBhTmFtZUlEICkNCisJew0KKwkJcmV0dXJuKCBjb25zdF9jYXN0PCBNYWNoaW5lICogPiggdGhpc01hY2hpbmUoKSApICk7DQorCX0NCisNCisJcmV0dXJuKCAoZ2V0Q29tcG9zaXRlUGFydCgpID09IE5VTEwpID8gTlVMTCA6DQorCQkJZ2V0Q29tcG9zaXRlUGFydCgpLT5yYXdNYWNoaW5lQnlOYW1lSUQoYU5hbWVJRCkgKTsNCit9DQorDQorDQorTWFjaGluZSAqIE1hY2hpbmVRdWVyeTo6Z2V0c2VtTWFjaGluZUJ5TmFtZUlEKGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkgY29uc3QNCit7DQorCU1hY2hpbmUgKiBtYWNoaW5lID0gY29uc3RfY2FzdDwgTWFjaGluZSAqID4oIHRoaXNNYWNoaW5lKCkgKTsNCisJTWFjaGluZSAqIHNtID0gbWFjaGluZS0+Z2V0TWFjaGluZUJ5TmFtZUlEKGFOYW1lSUQpOw0KKw0KKwl3aGlsZSggKHNtID09IE5VTEwpICYmICBtYWNoaW5lLT5oYXNDb250YWluZXIoKSAmJg0KKwkJCW1hY2hpbmUtPmdldENvbnRhaW5lcigpLT5pczwgTWFjaGluZSA+KCkgKQ0KKwl7DQorCQltYWNoaW5lID0gbWFjaGluZS0+Z2V0Q29udGFpbmVyKCktPnRvPCBNYWNoaW5lID4oKTsNCisNCisJCXNtID0gbWFjaGluZS0+Z2V0TWFjaGluZUJ5TmFtZUlEKGFOYW1lSUQpOw0KKwl9DQorDQorCXJldHVybiggc20gKTsNCit9DQorDQorDQorTWFjaGluZSAqIE1hY2hpbmVRdWVyeTo6Z2V0TWFjaGluZSgNCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkgY29uc3QNCit7DQorCU1hY2hpbmUgKiBtYWNoaW5lID0gZ2V0Q29tcG9zaXRlUGFydCgpLT4NCisJCQlnZXRNYWNoaW5lcygpLnJhd0J5UXVhbGlmaWVkTmFtZUlEKGFRdWFsaWZpZWROYW1lSUQpOw0KKwlpZiggbWFjaGluZSAhPSBOVUxMICkNCisJew0KKwkJcmV0dXJuKCBtYWNoaW5lICk7DQorCX0NCisNCisJaWYoIHRoaXNNYWNoaW5lKCktPmZxbkVxdWFscyggYVF1YWxpZmllZE5hbWVJRCAsIGZhbHNlICkgKQ0KKwl7DQorCQlyZXR1cm4oIGNvbnN0X2Nhc3Q8IE1hY2hpbmUgKiA+KCB0aGlzTWFjaGluZSgpICkgKTsNCisJfQ0KKw0KKwlyZXR1cm4oIG1hY2hpbmUgKTsNCit9DQorDQorTWFjaGluZSAqIE1hY2hpbmVRdWVyeTo6Z2V0cmVjTWFjaGluZShjb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQsDQorCQlNYWNoaW5lICogaWdub3JlQ2hpbGRNYWNoaW5lKSBjb25zdA0KK3sNCisJTWFjaGluZSAqIG1hY2hpbmUgPSBOVUxMOw0KKw0KKwlpZiggKG1hY2hpbmUgPSBnZXRNYWNoaW5lKGFRdWFsaWZpZWROYW1lSUQpKSAhPSBOVUxMICkNCisJew0KKwkJcmV0dXJuKCBtYWNoaW5lICk7DQorCX0NCisNCisJQ29tcG9zaXRlUGFydDo6Y29uc3RfbWFjaGluZV9pdGVyYXRvciBpdE1hY2hpbmUgPQ0KKwkJCWdldENvbXBvc2l0ZVBhcnQoKS0+bWFjaGluZV9iZWdpbigpOw0KKwlDb21wb3NpdGVQYXJ0Ojpjb25zdF9tYWNoaW5lX2l0ZXJhdG9yIGVuZE1hY2hpbmUgPQ0KKwkJCWdldENvbXBvc2l0ZVBhcnQoKS0+bWFjaGluZV9lbmQoKTsNCisJZm9yKCA7IGl0TWFjaGluZSAhPSBlbmRNYWNoaW5lIDsgKytpdE1hY2hpbmUgKQ0KKwl7DQorCQlpZiggKChpdE1hY2hpbmUpICE9IGlnbm9yZUNoaWxkTWFjaGluZSkgJiYNCisJCQkoKG1hY2hpbmUgPSAoaXRNYWNoaW5lKS0+Z2V0cmVjTWFjaGluZShhUXVhbGlmaWVkTmFtZUlEKSkgIT0gTlVMTCkgKQ0KKwkJew0KKwkJCXJldHVybiggbWFjaGluZSApOw0KKwkJfQ0KKwl9DQorDQorCXJldHVybiggbWFjaGluZSApOw0KK30NCisNCitNYWNoaW5lICogTWFjaGluZVF1ZXJ5OjpnZXRzZW1NYWNoaW5lKA0KKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKSBjb25zdA0KK3sNCisJY29uc3QgTWFjaGluZSAqIG1hY2hpbmUgPSB0aGlzTWFjaGluZSgpOw0KKw0KKwlNYWNoaW5lICogc20gPSBtYWNoaW5lLT5nZXRNYWNoaW5lKGFRdWFsaWZpZWROYW1lSUQpOw0KKw0KKwl3aGlsZSggKHNtID09IE5VTEwpICYmIG1hY2hpbmUtPmhhc0NvbnRhaW5lcigpICYmDQorCQkJbWFjaGluZS0+Z2V0Q29udGFpbmVyKCktPmlzPCBNYWNoaW5lID4oKSApDQorCXsNCisJCW1hY2hpbmUgPSBtYWNoaW5lLT5nZXRDb250YWluZXIoKS0+dG88IE1hY2hpbmUgPigpOw0KKw0KKwkJc20gPSBtYWNoaW5lLT5nZXRNYWNoaW5lKGFRdWFsaWZpZWROYW1lSUQpOw0KKwl9DQorDQorCXJldHVybiggc20gKTsNCit9DQorDQorDQorDQorTWFjaGluZSAqIE1hY2hpbmVRdWVyeTo6Z2V0c2VtTWFjaGluZSgNCisJCWNvbnN0IHN0ZDo6dmVjdG9yPCBzdGQ6OnN0cmluZyA+ICYgYVF1YWxpZmllZE5hbWVJRCkgY29uc3QNCit7DQorCXN0ZDo6dmVjdG9yPCBzdGQ6OnN0cmluZyA+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGFRdWFsaWZpZWROYW1lSUQuYmVnaW4oKTsNCisJc3RkOjp2ZWN0b3I8IHN0ZDo6c3RyaW5nID46OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gYVF1YWxpZmllZE5hbWVJRC5lbmQoKTsNCisNCisJTWFjaGluZSAqIHNtID0gdGhpc01hY2hpbmUoKS0+Z2V0c2VtTWFjaGluZUJ5TmFtZUlEKCppdCk7DQorDQorCWZvciggKytpdDsgKHNtICE9IE5VTEwpICYmIChpdCAhPSBlbmRJdCkgOyArK2l0KQ0KKwl7DQorCQlzbSA9IHNtLT5nZXRNYWNoaW5lQnlOYW1lSUQoKml0KTsNCisJfQ0KKw0KKwlyZXR1cm4oIHNtICk7DQorfQ0KKw0KKw0KKw0KK01hY2hpbmUgKiBNYWNoaW5lUXVlcnk6OmdldEV4ZWN1dGFibGVNYWNoaW5lKA0KKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKSBjb25zdA0KK3sNCisJTWFjaGluZSAqIG1hY2hpbmUgPSBnZXRDb21wb3NpdGVQYXJ0KCktPg0KKwkJCXJhd0V4ZWN1dGFibGVNYWNoaW5lQnlRdWFsaWZpZWROYW1lSUQoYVF1YWxpZmllZE5hbWVJRCk7DQorCWlmKCBtYWNoaW5lICE9IE5VTEwgKQ0KKwl7DQorCQlyZXR1cm4oIG1hY2hpbmUgKTsNCisJfQ0KKw0KKwlyZXR1cm4oIG1hY2hpbmUgKTsNCit9DQorDQorTWFjaGluZSAqIE1hY2hpbmVRdWVyeTo6Z2V0cmVjRXhlY3V0YWJsZU1hY2hpbmUoDQorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpIGNvbnN0DQorew0KKwlNYWNoaW5lICogbWFjaGluZSA9IE5VTEw7DQorDQorCWlmKCAobWFjaGluZSA9IGdldEV4ZWN1dGFibGVNYWNoaW5lKGFRdWFsaWZpZWROYW1lSUQpKSAhPSBOVUxMICkNCisJew0KKwkJcmV0dXJuKCBtYWNoaW5lICk7DQorCX0NCisNCisJQ29tcG9zaXRlUGFydDo6Y29uc3RfbWFjaGluZV9pdGVyYXRvciBpdE1hY2hpbmUgPQ0KKwkJCWdldENvbXBvc2l0ZVBhcnQoKS0+bWFjaGluZV9iZWdpbigpOw0KKwlDb21wb3NpdGVQYXJ0Ojpjb25zdF9tYWNoaW5lX2l0ZXJhdG9yIGVuZE1hY2hpbmUgPQ0KKwkJCWdldENvbXBvc2l0ZVBhcnQoKS0+bWFjaGluZV9lbmQoKTsNCisJZm9yKCA7IGl0TWFjaGluZSAhPSBlbmRNYWNoaW5lIDsgKytpdE1hY2hpbmUgKQ0KKwl7DQorCQlpZiggKG1hY2hpbmUgPSAoaXRNYWNoaW5lKS0+Z2V0cmVjRXhlY3V0YWJsZU1hY2hpbmUoYVF1YWxpZmllZE5hbWVJRCkpICE9IE5VTEwgKQ0KKwkJew0KKwkJCXJldHVybiggbWFjaGluZSApOw0KKwkJfQ0KKwl9DQorDQorCXJldHVybiggbWFjaGluZSApOw0KK30NCisNCitNYWNoaW5lICogTWFjaGluZVF1ZXJ5OjpnZXRzZW1FeGVjdXRhYmxlTWFjaGluZSgNCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkgY29uc3QNCit7DQorCWNvbnN0IE1hY2hpbmUgKiBtYWNoaW5lID0gdGhpc01hY2hpbmUoKTsNCisNCisJTWFjaGluZSAqIHNtID0gbWFjaGluZS0+Z2V0RXhlY3V0YWJsZU1hY2hpbmUoYVF1YWxpZmllZE5hbWVJRCk7DQorDQorCXdoaWxlKCAoc20gPT0gTlVMTCkgJiYgbWFjaGluZS0+aGFzQ29udGFpbmVyKCkgJiYNCisJCQltYWNoaW5lLT5nZXRDb250YWluZXIoKS0+aXM8IE1hY2hpbmUgPigpICkNCisJew0KKwkJbWFjaGluZSA9IG1hY2hpbmUtPmdldENvbnRhaW5lcigpLT50bzwgTWFjaGluZSA+KCk7DQorDQorCQlzbSA9IG1hY2hpbmUtPmdldEV4ZWN1dGFibGVNYWNoaW5lKGFRdWFsaWZpZWROYW1lSUQpOw0KKwl9DQorDQorCXJldHVybiggc20gKTsNCit9DQorDQorDQorDQorfSAvKiBuYW1lc3BhY2Ugc2VwICovDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL01hY2hpbmVRdWVyeS5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL01hY2hpbmVRdWVyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMmIyMTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvaW5mcmFzdHJ1Y3R1cmUvTWFjaGluZVF1ZXJ5LmgKQEAgLTAsMCArMSwxNzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULg0KKyAqDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENyZWF0ZWQgb246IDggbWFycyAyMDE3DQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnINCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaWZuZGVmIEZNTF9JTkZSQVNUUlVDVFVSRV9NQUNISU5FUVVFUllfSF8NCisjZGVmaW5lIEZNTF9JTkZSQVNUUlVDVFVSRV9NQUNISU5FUVVFUllfSF8NCisNCisjaW5jbHVkZSA8Y3N0ZGRlZj4NCisjaW5jbHVkZSA8c3RyaW5nPg0KKyNpbmNsdWRlIDx2ZWN0b3I+DQorDQorDQorbmFtZXNwYWNlIHNlcA0KK3sNCisNCitjbGFzcyBCRjsNCitjbGFzcyBCZWhhdmlvcmFsUGFydDsNCitjbGFzcyBDb21wb3NpdGVQYXJ0Ow0KK2NsYXNzIFByb3BlcnR5UGFydDsNCitjbGFzcyBNYWNoaW5lOw0KK2NsYXNzIFJvdXRpbmU7DQorDQorDQorY2xhc3MgTWFjaGluZVF1ZXJ5DQorew0KKw0KK3B1YmxpYzoNCisJLyoqDQorCSAqIENPTlNUUlVDVE9SDQorCSAqIEV4ZWN1dGFibGUNCisJICovDQorCU1hY2hpbmVRdWVyeSgpDQorCXsNCisJCS8vISEgTk9USElORw0KKwl9DQorDQorCS8qKg0KKwkgKiBERVNUUlVDVE9SDQorCSAqLw0KKwl2aXJ0dWFsIH5NYWNoaW5lUXVlcnkoKQ0KKwl7DQorCQkvLyEhIE5PVEhJTkcNCisJfQ0KKw0KKwkvKioNCisJICogQVBJDQorCSAqLw0KKwl2aXJ0dWFsIGNvbnN0IE1hY2hpbmUgKiB0aGlzTWFjaGluZSgpIGNvbnN0ID0gMDsNCisNCisJdmlydHVhbCBjb25zdCBQcm9wZXJ0eVBhcnQgJiBnZXRQcm9wZXJ0eVBhcnQoKSBjb25zdCA9IDA7DQorDQorCXZpcnR1YWwgY29uc3QgQ29tcG9zaXRlUGFydCAqIGdldENvbXBvc2l0ZVBhcnQoKSBjb25zdCA9IDA7DQorDQorCXZpcnR1YWwgQmVoYXZpb3JhbFBhcnQgKiBnZXRCZWhhdmlvclBhcnQoKSBjb25zdCA9IDA7DQorDQorCXZpcnR1YWwgYm9vbCBoYXNCZWhhdmlvclBhcnQoKSBjb25zdCA9IDA7DQorDQorDQorCS8qKg0KKwkgKiBHRVRURVIgZm9yIFBBUlNFUiAvIENPTVBJTEVSDQorCSAqIGFueSBPYmplY3QgRWxlbWVudA0KKwkgKi8NCisNCisJY29uc3QgQkYgJiBnZXRQcm9wZXJ0eUJ5TmFtZUlEKGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkgY29uc3Q7DQorCWNvbnN0IEJGICYgZ2V0cmVjRm9ybUJ5TmFtZUlEKGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkgY29uc3Q7DQorCWNvbnN0IEJGICYgZ2V0c2VtRm9ybUJ5TmFtZUlEKGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkgY29uc3Q7DQorDQorCWNvbnN0IEJGICYgZ2V0UHJvcGVydHlCeVF1YWxpZmllZE5hbWVJRChjb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpIGNvbnN0Ow0KKwljb25zdCBCRiAmIGdldHJlY0Zvcm1CeVF1YWxpZmllZE5hbWVJRChjb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpIGNvbnN0Ow0KKwljb25zdCBCRiAmIGdldHNlbUZvcm1CeVF1YWxpZmllZE5hbWVJRChjb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpIGNvbnN0Ow0KKw0KKw0KKwkvKioNCisJICogR0VUVEVSIGZvciBQQVJTRVIgLyBDT01QSUxFUg0KKwkgKiBWYXJpYWJsZQ0KKwkgKi8NCisJY29uc3QgQkYgJiBnZXRWYXJpYWJsZShjb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpIGNvbnN0Ow0KKwljb25zdCBCRiAmIGdldHJlY1ZhcmlhYmxlKGNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkgY29uc3Q7DQorCWNvbnN0IEJGICYgZ2V0c2VtVmFyaWFibGUoY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKSBjb25zdDsNCisNCisJY29uc3QgQkYgJiBnZXREYXRhVHlwZShjb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpIGNvbnN0Ow0KKwljb25zdCBCRiAmIGdldHJlY0RhdGFUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkgY29uc3Q7DQorCWNvbnN0IEJGICYgZ2V0c2VtRGF0YVR5cGUoY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKSBjb25zdDsNCisNCisJLyoqDQorCSAqIEdFVFRFUiBmb3IgUEFSU0VSIC8gQ09NUElMRVINCisJICogQnVmZmVyDQorCSAqLw0KKwljb25zdCBCRiAmIGdldEJ1ZmZlcihjb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpIGNvbnN0Ow0KKwljb25zdCBCRiAmIGdldHJlY0J1ZmZlcihjb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpIGNvbnN0Ow0KKwljb25zdCBCRiAmIGdldHNlbUJ1ZmZlcihjb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpIGNvbnN0Ow0KKw0KKwkvKioNCisJICogR0VUVEVSIGZvciBQQVJTRVIgLyBDT01QSUxFUg0KKwkgKiBDaGFubmVsDQorCSAqLw0KKwljb25zdCBCRiAmIGdldENoYW5uZWwoY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKSBjb25zdDsNCisJY29uc3QgQkYgJiBnZXRyZWNDaGFubmVsKGNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkgY29uc3Q7DQorCWNvbnN0IEJGICYgZ2V0c2VtQ2hhbm5lbChjb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpIGNvbnN0Ow0KKw0KKwkvKioNCisJICogR0VUVEVSIGZvciBQQVJTRVIgLyBDT01QSUxFUg0KKwkgKiBQb3J0DQorCSAqLw0KKwljb25zdCBCRiAmIGdldFBvcnQoY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKSBjb25zdDsNCisJY29uc3QgQkYgJiBnZXRyZWNQb3J0KGNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkgY29uc3Q7DQorCWNvbnN0IEJGICYgZ2V0c2VtUG9ydChjb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpIGNvbnN0Ow0KKw0KKw0KKwkvKioNCisJICogR0VUVEVSIGZvciBQQVJTRVIgLyBDT01QSUxFUg0KKwkgKiBTaWduYWwNCisJICovDQorCWNvbnN0IEJGICYgZ2V0U2lnbmFsKGNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkgY29uc3Q7DQorCWNvbnN0IEJGICYgZ2V0cmVjU2lnbmFsKGNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkgY29uc3Q7DQorCWNvbnN0IEJGICYgZ2V0c2VtU2lnbmFsKGNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkgY29uc3Q7DQorDQorDQorCS8qKg0KKwkgKiBHRVRURVIgZm9yIFBBUlNFUiAvIENPTVBJTEVSDQorCSAqIFBvcnQgLyBTaWduYWwNCisJICovDQorCWNvbnN0IEJGICYgZ2V0UG9ydFNpZ25hbChjb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpIGNvbnN0Ow0KKwljb25zdCBCRiAmIGdldHJlY1BvcnRTaWduYWwoY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKSBjb25zdDsNCisJY29uc3QgQkYgJiBnZXRzZW1Qb3J0U2lnbmFsKGNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkgY29uc3Q7DQorDQorDQorCS8qKg0KKwkgKiBHRVRURVIgZm9yIFBBUlNFUiAvIENPTVBJTEVSDQorCSAqIFJvdXRpbmUNCisJICovDQorCVJvdXRpbmUgKiByYXdSb3V0aW5lQnlOYW1lSUQoY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKSBjb25zdDsNCisJUm91dGluZSAqIHJhd3NlbVJvdXRpbmVCeU5hbWVJRChjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpIGNvbnN0Ow0KKw0KKwkvKioNCisJICogR0VUVEVSIGZvciBQQVJTRVIgLyBDT01QSUxFUg0KKwkgKiBQcm9jZWR1cmUNCisJICovDQorCU1hY2hpbmUgKiByYXdQcm9jZWR1cmVCeU5hbWVJRChjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpIGNvbnN0Ow0KKwlNYWNoaW5lICogcmF3c2VtUHJvY2VkdXJlQnlOYW1lSUQoY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKSBjb25zdDsNCisNCisJLyoqDQorCSAqIEdFVFRFUiBmb3IgUEFSU0VSIC8gQ09NUElMRVINCisJICogTWFjaGluZQ0KKwkgKi8NCisJTWFjaGluZSAqIGdldE1hY2hpbmVCeU5hbWVJRChjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpIGNvbnN0Ow0KKwlNYWNoaW5lICogZ2V0c2VtTWFjaGluZUJ5TmFtZUlEKGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkgY29uc3Q7DQorDQorCU1hY2hpbmUgKiBnZXRNYWNoaW5lKGNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkgY29uc3Q7DQorCU1hY2hpbmUgKiBnZXRyZWNNYWNoaW5lKGNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCwNCisJCQlNYWNoaW5lICogaWdub3JlQ2hpbGRNYWNoaW5lID0gTlVMTCkgY29uc3Q7DQorCU1hY2hpbmUgKiBnZXRzZW1NYWNoaW5lKGNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkgY29uc3Q7DQorDQorCU1hY2hpbmUgKiBnZXRzZW1NYWNoaW5lKGNvbnN0IHN0ZDo6dmVjdG9yPCBzdGQ6OnN0cmluZyA+ICYgYVF1YWxpZmllZE5hbWVJRCkgY29uc3Q7DQorDQorCU1hY2hpbmUgKiBnZXRFeGVjdXRhYmxlTWFjaGluZShjb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpIGNvbnN0Ow0KKwlNYWNoaW5lICogZ2V0cmVjRXhlY3V0YWJsZU1hY2hpbmUoY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKSBjb25zdDsNCisJTWFjaGluZSAqIGdldHNlbUV4ZWN1dGFibGVNYWNoaW5lKGNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkgY29uc3Q7DQorDQorfTsNCisNCisNCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8NCisNCisjZW5kaWYgLyogRk1MX0lORlJBU1RSVUNUVVJFX01BQ0hJTkVRVUVSWV9IXyAqLw0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9Nb2RlbE9mQ29tcHV0YXRpb25QYXJ0LmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9Nb2RlbE9mQ29tcHV0YXRpb25QYXJ0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2NiMWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL01vZGVsT2ZDb21wdXRhdGlvblBhcnQuY3BwCkBAIC0wLDAgKzEsNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyMiBmw6l2ci4gMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTW9kZWxPZkNvbXB1dGF0aW9uUGFydC5oIgorCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL01hY2hpbmUuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKy8qKgorICogQ09OU1RSVUNUT1IKKyAqIERlZmF1bHQKKyAqLworTW9kZWxPZkNvbXB1dGF0aW9uUGFydDo6TW9kZWxPZkNvbXB1dGF0aW9uUGFydCgKKwkJTWFjaGluZSAqIGFDb250YWluZXIsIGNvbnN0IHN0ZDo6c3RyaW5nIGFOYW1lSUQpCis6IE9iamVjdENsYXNzaWZpZXIoIENMQVNTX0tJTkRfVCggTW9kZWxPZkNvbXB1dGF0aW9uUGFydCApICwKKwkJYUNvbnRhaW5lciAsIGFOYW1lSUQpCit7CisJLy8hISBOT1RISU5HCit9CisKKworLyoqCisgKiBTZXJpYWxpemF0aW9uCisgKi8KK3ZvaWQgTW9kZWxPZkNvbXB1dGF0aW9uUGFydDo6dG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJb3MgPDwgVEFCIDw8ICJAIiA8PCBnZXROYW1lSUQoKSA8PCAiOiIgPDwgRU9MOworfQorCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9Nb2RlbE9mQ29tcHV0YXRpb25QYXJ0LmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvaW5mcmFzdHJ1Y3R1cmUvTW9kZWxPZkNvbXB1dGF0aW9uUGFydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiOTA2N2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvaW5mcmFzdHJ1Y3R1cmUvTW9kZWxPZkNvbXB1dGF0aW9uUGFydC5oCkBAIC0wLDAgKzEsNjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyMiBmw6l2ci4gMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEZNTF9JTkZSQVNUUlVDVFVSRV9NT0RFTE9GQ09NUFVUQVRJT05QQVJUX0hfCisjZGVmaW5lIEZNTF9JTkZSQVNUUlVDVFVSRV9NT0RFTE9GQ09NUFVUQVRJT05QQVJUX0hfCisKKyNpbmNsdWRlIDxmbWwvY29tbW9uL09iamVjdENsYXNzaWZpZXIuaD4KKworI2luY2x1ZGUgPGNvbW1vbi9Bdm1Qb2ludGVyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBNYWNoaW5lOworCisKK2NsYXNzIE1vZGVsT2ZDb21wdXRhdGlvblBhcnQgOgorCQlwdWJsaWMgT2JqZWN0Q2xhc3NpZmllciAsCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggTW9kZWxPZkNvbXB1dGF0aW9uUGFydCApCit7CisKKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggTW9kZWxPZkNvbXB1dGF0aW9uUGFydCApCisKKworcHVibGljOgorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJTW9kZWxPZkNvbXB1dGF0aW9uUGFydChNYWNoaW5lICogYUNvbnRhaW5lciwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nIGFOYW1lSUQgPSAibW9jIik7CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5Nb2RlbE9mQ29tcHV0YXRpb25QYXJ0KCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogU2VyaWFsaXphdGlvbgorCSAqLworCXZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCisKK307CisKKworfQorCisjZW5kaWYgLyogRk1MX0lORlJBU1RSVUNUVVJFX01PREVMT0ZDT01QVVRBVElPTlBBUlRfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9QYWNrYWdlLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9QYWNrYWdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTVhNmZhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL1BhY2thZ2UuY3BwCkBAIC0wLDAgKzEsNjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyMiBmw6l2ci4gMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiUGFja2FnZS5oIgorCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0NvbXBvc2l0ZVBhcnQuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvUHJvcGVydHlQYXJ0Lmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisvKioKKyAqIFNlcmlhbGl6YXRpb24KKyAqLworCit2b2lkIFBhY2thZ2U6OnN0ckhlYWRlcihPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlvcyA8PCBnZXRNb2RpZmllcigpLnRvU3RyaW5nKCkgPDwgInBhY2thZ2UgIiA8PCBnZXROYW1lSUQoKTsKK30KKworCit2b2lkIFBhY2thZ2U6OnRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdAoreworCW9zIDw8IFRBQiA8PCBnZXRNb2RpZmllcigpLnRvU3RyaW5nKCkKKwkJCTw8ICJwYWNrYWdlICIgPDwgZ2V0TmFtZUlEKCkgPDwgRU9MIDw8IHN0ZDo6Zmx1c2g7CisKKwlpZiggbVBhY2thZ2VzLm5vbmVtcHR5KCkgKQorCXsKKwkJb3MgPDwgVEFCIDw8ICJpbXBvcnQ6IiA8PCBFT0w7CisJCW9zIDw8IFRBQjIgPDwgImluY2x1ZGUgeyIgPDwgRU9MOworCQlUYWJsZU9mTWFjaGluZTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGl0ID0gbVBhY2thZ2VzLmJlZ2luKCk7CisJCVRhYmxlT2ZNYWNoaW5lOjpjb25zdF9yYXdfaXRlcmF0b3IgZW5kSXQgPSBtUGFja2FnZXMuZW5kKCk7CisJCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCQl7CisJCQlvcyA8PCBUQUIzIDw8IChpdCktPmFzPCBQYWNrYWdlID4oKS0+Z2V0TG9jYXRpb24oKSA8PCAiOyIgPDwgRU9MOworCQl9CisKKwkJb3MgPDwgVEFCMiA8PCAifSIgPDwgRU9MMl9GTFVTSDsKKwl9CisKKwlpZiggaGFzUHJvcGVydHkoKSApCisJeworCQlnZXRQcm9wZXJ0eVBhcnQoKS50b1N0cmVhbShvcyk7CisJCW9zIDw8IEVPTDsKKwl9CisKKwlpZiggbUNvbXBvc2l0ZVNwZWNpZmljYXRpb24gIT0gTlVMTCApCisJeworCQltQ29tcG9zaXRlU3BlY2lmaWNhdGlvbi0+dG9TdHJlYW0oIG9zICk7CisJfQorCisJb3MgPDwgc3RkOjpmbHVzaDsKK30KKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvaW5mcmFzdHJ1Y3R1cmUvUGFja2FnZS5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL1BhY2thZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGVjZjkxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL1BhY2thZ2UuaApAQCAtMCwwICsxLDEyMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDIyIGbDqXZyLiAyMDExCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgTElCUkFSWV9IXworI2RlZmluZSBMSUJSQVJZX0hfCisKKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvTWFjaGluZS5oPgorCisjaW5jbHVkZSA8Zm1sL2NvbW1vbi9TcGVjaWZpZXJFbGVtZW50Lmg+CisKKyNpbmNsdWRlIDxjb2xsZWN0aW9uL0JGQ29udGFpbmVyLmg+CisKKyNpbmNsdWRlIDxjb21tb24vQXZtUG9pbnRlci5oPgorI2luY2x1ZGUgPGNvbW1vbi9CRi5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworY2xhc3MgTWFjaGluZTsKKworCitjbGFzcyBQYWNrYWdlIDogcHVibGljIE1hY2hpbmUgLAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIFBhY2thZ2UgKQoreworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIFBhY2thZ2UgKQorCisKK3B1YmxpYzoKKwkvKioKKwkgKiBUWVBFREVGCisJICovCisJdHlwZWRlZiBUYWJsZU9mQkZfVDwgTWFjaGluZSA+ICBUYWJsZU9mTWFjaGluZTsKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlUYWJsZU9mTWFjaGluZSBtUGFja2FnZXM7CisKKwlzdGQ6OnN0cmluZyBtTG9jYXRpb247CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCVBhY2thZ2UoY29uc3Qgc3RkOjpzdHJpbmcgJiBpZCkKKwk6IE1hY2hpbmUoQ0xBU1NfS0lORF9UKCBQYWNrYWdlICksIE5VTEwsICJwYWNrOjoiICsgaWQsCisJCQlpZCwgaWQsIFNwZWNpZmllcjo6Q09NUE9ORU5UX1BBQ0tBR0VfU1BFQ0lGSUVSKSwKKwltUGFja2FnZXMoICksCisJbUxvY2F0aW9uKCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5QYWNrYWdlKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUxvY2F0aW9uCisJICovCisJaW5saW5lIHN0ZDo6c3RyaW5nIGdldExvY2F0aW9uKCkgY29uc3QKKwl7CisJCXJldHVybiggbUxvY2F0aW9uICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0TG9jYXRpb24oY29uc3Qgc3RkOjpzdHJpbmcgJiBhTG9jYXRpb24pCisJeworCQltTG9jYXRpb24gPSBhTG9jYXRpb247CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtUGFja2FnZXMKKwkgKi8KKwlpbmxpbmUgY29uc3QgVGFibGVPZk1hY2hpbmUgJiBnZXRQYWNrYWdlcygpIGNvbnN0CisJeworCQlyZXR1cm4oIG1QYWNrYWdlcyApOworCX0KKworCWlubGluZSB2b2lkIGFwcGVuZFBhY2thZ2UoY29uc3QgQkYgJiBhUGFja2FnZSkKKwl7CisJCW1QYWNrYWdlcy5hcHBlbmQoIGFQYWNrYWdlICk7CisJfQorCisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJdm9pZCBzdHJIZWFkZXIoT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCisJdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKK307CisKKworfQorCisjZW5kaWYgLyogTElCUkFSWV9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL1BvcnQuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL1BvcnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYjM0NzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvaW5mcmFzdHJ1Y3R1cmUvUG9ydC5jcHAKQEAgLTAsMCArMSwxODAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxNyBmw6l2ci4gMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiUG9ydC5oIgorCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0NoYW5uZWwuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvTWFjaGluZS5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Qcm9wZXJ0eVBhcnQuaD4KKworI2luY2x1ZGUgPGZtbC90eXBlL1R5cGVNYW5hZ2VyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorICogQ09OU1RSVUNUT1IKKyAqIERlZmF1bHQKKyAqLworUG9ydDo6UG9ydChjb25zdCBQcm9wZXJ0eVBhcnQgJiBhUHJvcGVydHlQYXJ0LCBjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsCisJCUlDb21Qb2ludDo6RU5VTV9JT19OQVRVUkUgYU5hdHVyZSwgY29uc3QgTW9kaWZpZXIgJiBhTW9kaWZpZXIpCis6IFByb3BlcnR5RWxlbWVudCggQ0xBU1NfS0lORF9UKCBQb3J0ICksCisJCWFQcm9wZXJ0eVBhcnQuZ2V0Q29udGFpbmVyKCkgLCBhTW9kaWZpZXIgLCBhTmFtZUlEICksCittTW9kZWwoICksCittQ29tUG9pbnROYXR1cmUoIGFOYXR1cmUgKSwKK21Db21wb3NpdGUoIGZhbHNlICksCisKK21Db250ZW50cyggbmV3IFByb3BlcnR5UGFydCh0aGlzLCAiY29udGVudHMiKSApLAorCittUm91dGluZ0NoYW5uZWwoIE5VTEwgKQoreworCS8vISEgTk9USElORworfQorCisKK1BvcnQ6OlBvcnQoQ2hhbm5lbCAqIGFDaGFubmVsLAorCQljb25zdCBNb2RpZmllciAmIGFNb2RpZmllciwgY29uc3QgQkYgJiBwb3J0UGF0dGVybikKKzogUHJvcGVydHlFbGVtZW50KENMQVNTX0tJTkRfVCggUG9ydCApLCBhQ2hhbm5lbCwgcG9ydFBhdHRlcm4udG9fcmVmPCBQb3J0ID4oKSksCittTW9kZWwoIHBvcnRQYXR0ZXJuICksCittQ29tUG9pbnROYXR1cmUoIHBvcnRQYXR0ZXJuLnRvX3B0cjwgUG9ydCA+KCktPm1Db21Qb2ludE5hdHVyZSApLAorbUNvbXBvc2l0ZSggZmFsc2UgKSwKKworbUNvbnRlbnRzKCBuZXcgUHJvcGVydHlQYXJ0KHRoaXMsICJjb250ZW50cyIpICksCisKK21Sb3V0aW5nQ2hhbm5lbCggYUNoYW5uZWwgKQoreworCWdldHdNb2RpZmllcigpLm92ZXJyaWRlX2lmZGVmKCBhTW9kaWZpZXIgKTsKK30KKworCisvKioKKyAqIEdFVFRFUgorICogbUNvbnRlbnRzCisgKi8KK2Jvb2wgUG9ydDo6aGFzQ29udGVudHMoKSBjb25zdAoreworCXJldHVybiggKG1Db250ZW50cyAhPSBOVUxMKSAmJiBtQ29udGVudHMtPm5vbmVtcHR5KCkgKTsKK30KKworCisvKioKKyAqIEdFVFRFUiAtIFNFVFRFUgorICogbVBhcmFtZXRlcnMKKyAqLworY29uc3QgVGFibGVPZlZhcmlhYmxlICYgUG9ydDo6Z2V0UGFyYW1ldGVycygpIGNvbnN0Cit7CisJcmV0dXJuKCBtQ29udGVudHMtPmdldFZhcmlhYmxlcygpICk7Cit9CisKK2F2bV9zaXplX3QgUG9ydDo6Z2V0UGFyYW1ldGVyc0NvdW50KCkgY29uc3QKK3sKKwlyZXR1cm4oIG1Db250ZW50cy0+Z2V0VmFyaWFibGVzKCkuc2l6ZSgpICk7Cit9CisKK2F2bV9vZmZzZXRfdCBQb3J0OjpnZXRQYXJhbWV0ZXJPZmZzZXQoY29uc3Qgc3RkOjpzdHJpbmcgJiBsYWJlbCkgY29uc3QKK3sKKwlyZXR1cm4oIG1Db250ZW50cy0+Z2V0VmFyaWFibGVzKCkuZ2V0T2Zmc2V0QnlOYW1lSUQobGFiZWwpICk7Cit9CisKK3ZvaWQgUG9ydDo6YXBwZW5kUGFyYW1ldGVyKGNvbnN0IEJGICYgYVBhcmFtKQoreworCW1Db250ZW50cy0+YXBwZW5kVmFyaWFibGUoIGFQYXJhbSApOworfQorCit2b2lkIFBvcnQ6OnNhdmVQYXJhbWV0ZXIoVmFyaWFibGUgKiBhUGFyYW0pCit7CisJbUNvbnRlbnRzLT5zYXZlT3duZWRWYXJpYWJsZSggYVBhcmFtICk7Cit9CisKKworLyoqCisgKiBHRVRURVIKKyAqIHRoZSBjb250YWluZXIKKyAqLworTWFjaGluZSAqIFBvcnQ6OmdldENvbnRhaW5lck1hY2hpbmUoKQoreworCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggZ2V0Q29udGFpbmVyKCktPmlzPCBNYWNoaW5lID4oKSApCisJCQk8PCAiSW52YWxpZCA8PCBQb3J0IENvbnRhaW5lciA+PiBUeXBlIDwiCisJCQk8PCBnZXRDb250YWluZXIoKS0+Y2xhc3NLaW5kTmFtZSgpIDw8ICI+IENhc3QgISEhIgorCQkJPDwgU0VORF9FWElUOworCisJcmV0dXJuKCBnZXRDb250YWluZXIoKS0+dG88IE1hY2hpbmUgPigpICk7Cit9CisKKworLyoqCisgKiBTZXJpYWxpemF0aW9uCisgKi8KK3ZvaWQgUG9ydDo6dG9TdHJlYW0oT3V0U3RyZWFtICYgb3V0KSBjb25zdAoreworCW91dCA8PCBUQUIgPDwgZ2V0TW9kaWZpZXIoKS50b1N0cmluZygpCisJCTw8IElDb21Qb2ludDo6c3RyX25hdHVyZSggZ2V0Q29tUG9pbnROYXR1cmUoKSApOworCisJaWYoIGhhc1NpZ25hbE1vZGVsKCkgKQorCXsKKwkJb3V0IDw8ICI8ICIgPDwgZ2V0U2lnbmFsTW9kZWwoKS0+Z2V0TmFtZUlEKCkgPDwgIiA+IjsKKwl9CisKKwlvdXQgPDwgIiAiIDw8IGdldE5hbWVJRCgpOworCisJaWYoIG1Db250ZW50cy0+aGFzVmFyaWFibGUoKSApCisJeworCQlUYWJsZU9mVmFyaWFibGU6OmNvbnN0X3Jhd19pdGVyYXRvciBpdCA9CisJCQkJbUNvbnRlbnRzLT5nZXRWYXJpYWJsZXMoKS5iZWdpbigpOworCQlUYWJsZU9mVmFyaWFibGU6OmNvbnN0X3Jhd19pdGVyYXRvciBlbmRJdCA9CisJCQkJbUNvbnRlbnRzLT5nZXRWYXJpYWJsZXMoKS5lbmQoKTsKKworCQlvdXQgPDwgIigiOworCQlmb3IoIHN0ZDo6c3RyaW5nIHNlcCA9ICIiIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJeworCQkJb3V0IDw8IHNlcDsgaWYoIHNlcC5lbXB0eSgpICkgeyBzZXAgPSAiLCAiOyB9CisKKwkJCWlmKCAoaXQpLT5nZXRNb2RpZmllcigpLmhhc05hdHVyZVBhcmFtZXRlckJpbmQoKSApCisJCQl7CisJCQkJb3V0IDw8ICIjYmluZCAiIDw8IChpdCktPnN0clZhbHVlKCk7CisJCQl9CisJCQllbHNlIGlmKCAoaXQpLT5nZXRNb2RpZmllcigpLmhhc05hdHVyZVBhcmFtZXRlcigpICkKKwkJCXsKKwkJCQlvdXQgPDwgKGl0KS0+c3RyVHlwZVNwZWNpZmllcigpOworCisJCQkJaWYoIG5vdCAoaXQpLT5nZXROYW1lSUQoKS5lbXB0eSgpICkKKwkJCQl7CisJCQkJCW91dCA8PCAiICIgPDwgKGl0KS0+Z2V0TmFtZUlEKCk7CisKKwkJCQkJaWYoIChpdCktPmhhc1ZhbHVlKCkgKQorCQkJCQl7CisJCQkJCQlvdXQgPDwgIiA9ICIgPDwgKGl0KS0+c3RyVmFsdWUoKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmKCAoaXQpLT5oYXNWYWx1ZSgpICkKKwkJCQl7CisJCQkJCW91dCA8PCAiICIgPDwgKGl0KS0+c3RyVmFsdWUoKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJb3V0IDw8IHN0cl9oZWFkZXIoICppdCApOworCQkJfQorCQl9CisJCW91dCA8PCAiKSI7CisJfQorCisJb3V0IDw8ICI7IiA8PCBFT0xfRkxVU0g7Cit9CisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL1BvcnQuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9Qb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE3NmY1MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9Qb3J0LmgKQEAgLTAsMCArMSwyMTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxNyBmw6l2ci4gMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFBPUlRfSF8KKyNkZWZpbmUgUE9SVF9IXworCisjaW5jbHVkZSA8Zm1sL2NvbW1vbi9Qcm9wZXJ0eUVsZW1lbnQuaD4KKworI2luY2x1ZGUgPGZtbC9saWIvSUNvbVBvaW50Lmg+CisKKyNpbmNsdWRlIDxjb21tb24vQkYuaD4KKworI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9WYXJpYWJsZS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjbGFzcyBDaGFubmVsOworY2xhc3MgTWFjaGluZTsKK2NsYXNzIE1vZGlmaWVyOworY2xhc3MgT2JqZWN0RWxlbWVudDsKK2NsYXNzIFByb3BlcnR5UGFydDsKKworCisvKioKKyAqIFRZUEVERUYKKyAqLworY2xhc3MgUG9ydDsKKwordHlwZWRlZiBQb3J0ICBTaWduYWw7CisKKworCitjbGFzcyBQb3J0IDoKKwkJcHVibGljIFByb3BlcnR5RWxlbWVudCwKKwkJQVZNX0lOSkVDVF9JTlNUQU5DRV9DT1VOVEVSX0NMQVNTKCBQb3J0ICkKK3sKKworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBQb3J0ICkKKworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQVRUUklCVVRFUworCSAqLworCUJGIG1Nb2RlbDsKKworCUlDb21Qb2ludDo6RU5VTV9JT19OQVRVUkUgbUNvbVBvaW50TmF0dXJlOworCisJYm9vbCBtQ29tcG9zaXRlOworCisJUHJvcGVydHlQYXJ0ICogbUNvbnRlbnRzOworCisJQ2hhbm5lbCAqIG1Sb3V0aW5nQ2hhbm5lbDsKKworCitwdWJsaWM6CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlQb3J0KGNvbnN0IFByb3BlcnR5UGFydCAmIGFQcm9wZXJ0eVBhcnQsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsIElDb21Qb2ludDo6RU5VTV9JT19OQVRVUkUgYU5hdHVyZSwKKwkJCWNvbnN0IE1vZGlmaWVyICYgYU1vZGlmaWVyID0gTW9kaWZpZXI6OlBST1BFUlRZX0lOT1VUX0RJUkVDVElPTik7CisKKwlQb3J0KENoYW5uZWwgKiBhQ2hhbm5lbCwKKwkJCWNvbnN0IE1vZGlmaWVyICYgYU1vZGlmaWVyLCBjb25zdCBCRiAmIGFQb3J0UGF0dGVybik7CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+UG9ydCgpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIHRoZSBjb250YWluZXIKKwkgKi8KKwl2aXJ0dWFsIE1hY2hpbmUgKiBnZXRDb250YWluZXJNYWNoaW5lKCk7CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1Nb2RlbAorCSAqLworCWlubGluZSBTaWduYWwgKiBnZXRTaWduYWxNb2RlbCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Nb2RlbC50b19wdHI8IFBvcnQgPigpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzU2lnbmFsTW9kZWwoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtTW9kZWwuaXM8IFBvcnQgPigpICk7CisJfQorCisKKwkvKioKKwkgKiBtQ29tUG9pbnROYXR1cmUKKwkgKi8KKwlpbmxpbmUgSUNvbVBvaW50OjpFTlVNX0lPX05BVFVSRSBnZXRDb21Qb2ludE5hdHVyZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Db21Qb2ludE5hdHVyZSApOworCX0KKworCWlubGluZSBib29sIGlzU2lnbmFsKCkgY29uc3QKKwl7CisJCXJldHVybiggbUNvbVBvaW50TmF0dXJlID09IElDb21Qb2ludDo6SU9fU0lHTkFMX05BVFVSRSApOworCX0KKworCisJLyoqCisJICogaXNDb21wb3NpdGUKKwkgKi8KKwlpbmxpbmUgYm9vbCBpc0NvbXBvc2l0ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Db21wb3NpdGUgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc0Jhc2ljKCkgY29uc3QKKwl7CisJCXJldHVybiggbm90IG1Db21wb3NpdGUgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1Db250ZW50cworCSAqLworCWlubGluZSBQcm9wZXJ0eVBhcnQgKiBnZXRDb250ZW50cygpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Db250ZW50cyApOworCX0KKworCWJvb2wgaGFzQ29udGVudHMoKSBjb25zdDsKKworCWlubGluZSB2b2lkIHNldENvbnRlbnRzKFByb3BlcnR5UGFydCAqIGFDb250ZW50cykKKwl7CisJCW1Db250ZW50cyA9IGFDb250ZW50czsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1QYXJhbWV0ZXJzCisJICovCisJY29uc3QgVGFibGVPZlZhcmlhYmxlICYgZ2V0UGFyYW1ldGVycygpIGNvbnN0OworCisJYXZtX3NpemVfdCBnZXRQYXJhbWV0ZXJzQ291bnQoKSBjb25zdDsKKworCWF2bV9vZmZzZXRfdCBnZXRQYXJhbWV0ZXJPZmZzZXQoY29uc3Qgc3RkOjpzdHJpbmcgJiBsYWJlbCkgY29uc3Q7CisKKwl2b2lkIGFwcGVuZFBhcmFtZXRlcihjb25zdCBCRiAmIGFQYXJhbSk7CisKKwl2b2lkIHNhdmVQYXJhbWV0ZXIoVmFyaWFibGUgKiBhUGFyYW0pOworCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtUm91dGluZ0NoYW5uZWwKKwkgKi8KKwlpbmxpbmUgQ2hhbm5lbCAqIGdldFJvdXRpbmdDaGFubmVsKCkgY29uc3QKKwl7CisJCXJldHVybiggbVJvdXRpbmdDaGFubmVsICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzUm91dGluZ0NoYW5uZWwoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUm91dGluZ0NoYW5uZWwgIT0gTlVMTCApOworCX0KKworCWlubGluZSB2b2lkIHNldFJvdXRpbmdDaGFubmVsKENoYW5uZWwgKiBhUm91dGluZ0NoYW5uZWwpCisJeworCQltUm91dGluZ0NoYW5uZWwgPSBhUm91dGluZ0NoYW5uZWw7CisJfQorCisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJdm9pZCBzdHJIZWFkZXIoT3V0U3RyZWFtICYgb3V0KSBjb25zdAorCXsKKwkJb3V0IDw8IHN0cl9pbmRlbnQoIHRoaXMgKTsKKwl9CisKKwl2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG91dCkgY29uc3Q7CisKK307CisKKworfQorCisjZW5kaWYgLyogUE9SVF9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL1Byb3BlcnR5UGFydC5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvaW5mcmFzdHJ1Y3R1cmUvUHJvcGVydHlQYXJ0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWI4OTU5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL1Byb3BlcnR5UGFydC5jcHAKQEAgLTAsMCArMSwxOTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyMiBmw6l2ci4gMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiUHJvcGVydHlQYXJ0LmgiCisKKworbmFtZXNwYWNlIHNlcAoreworCisvKioKKyAqIERJU1BBVENICisgKiBtT3duZWRFbGVtZW50cworICovCit2b2lkIFByb3BlcnR5UGFydDo6ZGlzcGF0Y2hPd25lZEVsZW1lbnQoY29uc3QgQkYgJiBhbkVsZW1lbnQpCit7CisJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1NNQVJUX1BPSU5URVJfRVhJVCggYW5FbGVtZW50ICkKKwkJCTw8ICJFeGVjdXRhYmxlIE1hY2hpbmUgb3duZWQgZWxlbWVudCAhISEiCisJCQk8PCBTRU5EX0VYSVQ7CisKKwlzd2l0Y2goIGFuRWxlbWVudC5jbGFzc0tpbmQoKSApCisJeworCQkvLyBQUk9QRVJUWSBFTEVNRU5UCisJCWNhc2UgRk9STV9YRlNQX1ZBUklBQkxFX0tJTkQ6CisJCXsKKwkJCWRpc3BhdGNoT3duZWRWYXJpYWJsZSggYW5FbGVtZW50ICk7CisKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBGT1JNX1hGU1BfREFUQVRZUEVfS0lORDoKKwkJeworCQkJbURhdGFUeXBlcy5hcHBlbmQoIGFuRWxlbWVudCApOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEZPUk1fWEZTUF9CVUZGRVJfS0lORDoKKwkJeworCQkJbUJ1ZmZlcnMuYXBwZW5kKCBhbkVsZW1lbnQgKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBGT1JNX1hGU1BfQ0hBTk5FTF9LSU5EOgorCQl7CisJCQltQ2hhbm5lbHMuYXBwZW5kKCBhbkVsZW1lbnQgKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBGT1JNX1hGU1BfUE9SVF9LSU5EOgorCQl7CisJCQltUG9ydHMuYXBwZW5kKCBhbkVsZW1lbnQgKTsKKwkJCWJyZWFrOworCQl9CisKKworCQlkZWZhdWx0OgorCQl7IC8vIFRPRE8KKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCTw8ICJkaXNwYXRjaE93bmVkRWxlbWVudCgpIHVuZXhwZWN0ZWQgb2JqZWN0LCB0eXBlaW5mbzogIgorCQkJCQk8PCBhbkVsZW1lbnQuY2xhc3NLaW5kSW5mbygpIDw8ICJcblx0PDwgIgorCQkJCQk8PCBhbkVsZW1lbnQudG9fcHRyPCBPYmplY3RFbGVtZW50ID4oKS0+c3RySGVhZGVyKCkKKwkJCQkJPDwgIiA+PiAhISEiCisJCQkJCTw8IFNFTkRfRVhJVDsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisKKy8qKgorICogRElTUEFUQ0ggLSBTQVZFCisgKiB1c2luZyBWYXJpYWJsZTo6TW9kaWZpZXIKKyAqIG1WYXJpYWJsZXMKKyAqIG1WYXJpYWJsZVBhcmFtZXRlcnMKKyAqIG1WYXJpYWJsZVJldHVybnMKKyAqLwordm9pZCBQcm9wZXJ0eVBhcnQ6OmRpc3BhdGNoT3duZWRWYXJpYWJsZShjb25zdCBCRiAmIGFWYXJpYWJsZSkKK3sKKwltVmFyaWFibGVzLmFwcGVuZCggYVZhcmlhYmxlICk7CisKKwljb25zdCBNb2RpZmllciAmIGFNb2RpZmllciA9CisJCQlhVmFyaWFibGUudG9fcHRyPCBWYXJpYWJsZSA+KCktPmdldE1vZGlmaWVyKCk7CisKKwlpZiggYU1vZGlmaWVyLmhhc05hdHVyZVBhcmFtZXRlcigpICkKKwl7CisJCWlmKCBhTW9kaWZpZXIuaXNEaXJlY3Rpb25SZXR1cm4oKSApCisJCXsKKwkJCW1WYXJpYWJsZVJldHVybnMuYXBwZW5kKCBhVmFyaWFibGUgKTsKKwkJfQorCQllbHNlIC8vaWYoIGFNb2RpZmllci5oYXNEaXJlY3Rpb25PdGhlVGhhblJldHVybigpICkKKwkJeworCQkJbVZhcmlhYmxlUGFyYW1ldGVycy5hcHBlbmQoIGFWYXJpYWJsZSApOworCQl9CisJfQorfQorCisKKy8qKgorICogU2VyaWFsaXphdGlvbgorICovCit2b2lkIFByb3BlcnR5UGFydDo6c3RyVmFyaWFibGVQYXJhbWV0ZXJzKE91dFN0cmVhbSAmIG9zLAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGJlZ2luLCBjb25zdCBzdGQ6OnN0cmluZyAmIGVuZCwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBzZXApIGNvbnN0Cit7CisJaWYoIG1WYXJpYWJsZVBhcmFtZXRlcnMubm9uZW1wdHkoKSApCisJeworCQlvcyA8PCBiZWdpbjsKKworCQljb25zdF92YXJpYWJsZV9pdGVyYXRvciBpdCA9IHZhcl9wYXJhbWV0ZXJfYmVnaW4oKTsKKwkJY29uc3RfdmFyaWFibGVfaXRlcmF0b3IgZW5kSXQgPSB2YXJfcGFyYW1ldGVyX2VuZCgpOworCisJCShpdCktPnN0clBhcmFtZXRlcihvcyk7CisJCWZvciggKytpdCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJCXsKKwkJCShpdCktPnN0clBhcmFtZXRlciggb3MgPDwgc2VwICk7CisJCX0KKworCQlvcyA8PCBlbmQ7CisJfQorfQorCit2b2lkIFByb3BlcnR5UGFydDo6c3RyVmFyaWFibGVSZXR1cm5zKE91dFN0cmVhbSAmIG9zLAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGJlZ2luLCBjb25zdCBzdGQ6OnN0cmluZyAmIGVuZCwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBzZXApIGNvbnN0Cit7CisJaWYoIG1WYXJpYWJsZVJldHVybnMubm9uZW1wdHkoKSApCisJeworCQlvcyA8PCBiZWdpbjsKKworCQljb25zdF92YXJpYWJsZV9pdGVyYXRvciBpdCA9IHZhcl9yZXR1cm5fYmVnaW4oKTsKKwkJY29uc3RfdmFyaWFibGVfaXRlcmF0b3IgZW5kSXQgPSB2YXJfcmV0dXJuX2VuZCgpOworCisJCShpdCktPnN0clJldHVybihvcyk7CisJCWZvciggKytpdCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJCXsKKwkJCShpdCktPnN0clJldHVybiggb3MgPDwgc2VwICk7CisJCX0KKworCQlvcyA8PCBlbmQ7CisJfQorfQorCisKK3ZvaWQgUHJvcGVydHlQYXJ0Ojp0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlvcyA8PCBUQUIgPDwgIkAiIDw8IGdldE5hbWVJRCgpIDw8ICI6IiA8PCBFT0xfSU5DUl9JTkRFTlQ7CisKKwlpZiggbU93bmVkRWxlbWVudHMubm9uZW1wdHkoKSApCisJeworCQltT3duZWRFbGVtZW50cy50b1N0cmVhbShvcyk7CisJfQorCisvLwlpZiggbURhdGFUeXBlcy5ub25lbXB0eSgpICkKKy8vCXsKKy8vCQltRGF0YVR5cGVzLnRvU3RyZWFtKG9zKTsKKy8vCX0KKy8vCisvLwlpZiggbUJ1ZmZlcnMubm9uZW1wdHkoKSApCisvLwl7CisvLwkJbUJ1ZmZlcnMudG9TdHJlYW0ob3MpOworLy8JfQorLy8KKy8vCWlmKCBtUG9ydHMubm9uZW1wdHkoKSApCisvLwl7CisvLwkJbVBvcnRzLnRvU3RyZWFtKG9zKTsKKy8vCX0KKy8vCisvLwlpZiggbVNpZ25hbHMubm9uZW1wdHkoKSApCisvLwl7CisvLwkJbVNpZ25hbHMudG9TdHJlYW0ob3MpOworLy8JfQorLy8KKy8vCWlmKCBtQ2hhbm5lbHMubm9uZW1wdHkoKSApCisvLwl7CisvLwkJbUNoYW5uZWxzLnRvU3RyZWFtKG9zKTsKKy8vCX0KKy8vCisvLwlpZiggbVZhcmlhYmxlcy5ub25lbXB0eSgpICkKKy8vCXsKKy8vCQltVmFyaWFibGVzLnRvU3RyZWFtKG9zKTsKKy8vCX0KKworCW9zIDw8IERFQ1JfSU5ERU5UIDw8IHN0ZDo6Zmx1c2g7Cit9CisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL1Byb3BlcnR5UGFydC5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL1Byb3BlcnR5UGFydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NThkNWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvaW5mcmFzdHJ1Y3R1cmUvUHJvcGVydHlQYXJ0LmgKQEAgLTAsMCArMSw1OTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyMiBmw6l2ci4gMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEZNTF9JTkZSQVNUUlVDVFVSRV9QUk9QRVJUWVBBUlRfSF8KKyNkZWZpbmUgRk1MX0lORlJBU1RSVUNUVVJFX1BST1BFUlRZUEFSVF9IXworCisjaW5jbHVkZSA8Zm1sL2NvbW1vbi9PYmplY3RDbGFzc2lmaWVyLmg+CisjaW5jbHVkZSA8Zm1sL2NvbW1vbi9PYmplY3RFbGVtZW50Lmg+CisKKyNpbmNsdWRlIDxjb2xsZWN0aW9uL0JGQ29udGFpbmVyLmg+CisKKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvQnVmZmVyLmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0NoYW5uZWwuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvRGF0YVR5cGUuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvUG9ydC5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9WYXJpYWJsZS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjbGFzcyBQcm9wZXJ0eVBhcnQgOiBwdWJsaWMgT2JqZWN0Q2xhc3NpZmllciAsCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggUHJvcGVydHlQYXJ0ICkKK3sKKworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBQcm9wZXJ0eVBhcnQgKQorCisKK3B1YmxpYzoKKwkvKioKKwkgKiBUWVBFREVGCisJICovCisJdHlwZWRlZiBUYWJsZU9mQkZfVDwgQnVmZmVyICAgICAgICA+ICBUYWJsZU9mQnVmZmVyOworCisJdHlwZWRlZiBUYWJsZU9mQkZfVDwgUG9ydCAgICAgICAgICA+ICBUYWJsZU9mUG9ydDsKKworCXR5cGVkZWYgVGFibGVPZkJGX1Q8IFNpZ25hbCAgICAgICAgPiAgVGFibGVPZlNpZ25hbDsKKworCXR5cGVkZWYgVGFibGVPZkJGX1Q8IENoYW5uZWwgICAgICAgPiAgVGFibGVPZkNoYW5uZWw7CisKKwl0eXBlZGVmIFRhYmxlT2ZCRl9UPCBEYXRhVHlwZSAgICAgID4gIFRhYmxlT2ZEYXRhVHlwZTsKKworCXR5cGVkZWYgVGFibGVPZkJGX1Q8IFZhcmlhYmxlICAgICAgPiAgVGFibGVPZlZhcmlhYmxlOworCisJdHlwZWRlZiBUYWJsZU9mQkZfVDwgT2JqZWN0RWxlbWVudCA+ICBUYWJsZU9mT3duZWRFbGVtZW50OworCisJLyoqCisJICogSVRFUkFUT1JTCisJICovCisKKwl0eXBlZGVmIFRhYmxlT2ZPd25lZEVsZW1lbnQ6OmNvbnN0X3Jhd19pdGVyYXRvciAgY29uc3Rfb3duZWRfaXRlcmF0b3I7CisKKwl0eXBlZGVmIFRhYmxlT2ZEYXRhVHlwZTo6Y29uc3RfcmF3X2l0ZXJhdG9yICAgICAgY29uc3RfdHlwZV9pdGVyYXRvcjsKKworCXR5cGVkZWYgVGFibGVPZlZhcmlhYmxlOjpjb25zdF9yYXdfaXRlcmF0b3IgICAgICBjb25zdF92YXJpYWJsZV9pdGVyYXRvcjsKKworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQVRUUklCVVRFUworCSAqLworCVRhYmxlT2ZPd25lZEVsZW1lbnQgbU93bmVkRWxlbWVudHM7CisKKwlUYWJsZU9mQnVmZmVyICAgICAgIG1CdWZmZXJzOworCisJVGFibGVPZlBvcnQgICAgICAgICBtUG9ydHM7CisKKwlUYWJsZU9mU2lnbmFsICAgICAgIG1TaWduYWxzOworCisJVGFibGVPZkNoYW5uZWwgICAgICBtQ2hhbm5lbHM7CisKKwlUYWJsZU9mRGF0YVR5cGUgICAgIG1EYXRhVHlwZXM7CisKKwlUYWJsZU9mVmFyaWFibGUgICAgIG1WYXJpYWJsZXM7CisKKwlUYWJsZU9mVmFyaWFibGUgICAgIG1WYXJpYWJsZVBhcmFtZXRlcnM7CisKKwlUYWJsZU9mVmFyaWFibGUgICAgIG1WYXJpYWJsZVJldHVybnM7CisKKworcHVibGljOgorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJUHJvcGVydHlQYXJ0KE9iamVjdEVsZW1lbnQgKiBhQ29udGFpbmVyLCBjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpCisJOiBPYmplY3RDbGFzc2lmaWVyKCBDTEFTU19LSU5EX1QoIFByb3BlcnR5UGFydCApICwgYUNvbnRhaW5lciAsIGFOYW1lSUQgKSwKKwltT3duZWRFbGVtZW50cyggKSwKKwltQnVmZmVycyggKSwKKwltUG9ydHMoICksCisJbVNpZ25hbHMoICksCisJbUNoYW5uZWxzKCApLAorCW1EYXRhVHlwZXMoICksCisJbVZhcmlhYmxlcyggKSwKKwltVmFyaWFibGVQYXJhbWV0ZXJzKCApLAorCW1WYXJpYWJsZVJldHVybnMoICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCVByb3BlcnR5UGFydChjb25zdCBQcm9wZXJ0eVBhcnQgJiBhUGFydCkKKwk6IE9iamVjdENsYXNzaWZpZXIoIGFQYXJ0ICksCisJbU93bmVkRWxlbWVudHMoIGFQYXJ0Lm1Pd25lZEVsZW1lbnRzICksCisJbUJ1ZmZlcnMoIGFQYXJ0Lm1CdWZmZXJzICksCisJbVBvcnRzKCBhUGFydC5tUG9ydHMgKSwKKwltU2lnbmFscyggYVBhcnQubVNpZ25hbHMgKSwKKwltQ2hhbm5lbHMoIGFQYXJ0Lm1DaGFubmVscyApLAorCW1EYXRhVHlwZXMoIGFQYXJ0Lm1EYXRhVHlwZXMgKSwKKwltVmFyaWFibGVzKCBhUGFydC5tVmFyaWFibGVzICksCisJbVZhcmlhYmxlUGFyYW1ldGVycyggYVBhcnQubVZhcmlhYmxlUGFyYW1ldGVycyApLAorCW1WYXJpYWJsZVJldHVybnMoIGFQYXJ0Lm1WYXJpYWJsZVJldHVybnMgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+UHJvcGVydHlQYXJ0KCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gRElTUEFUQ0ggLSBTQVZFCisJICogbU93bmVkRWxlbWVudHMKKwkgKi8KKwlpbmxpbmUgY29uc3QgVGFibGVPZk93bmVkRWxlbWVudCAmIGdldE93bmVkRWxlbWVudHMoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtT3duZWRFbGVtZW50cyApOworCX0KKworCisJLyoqCisJICogWyBDT05TVCBdIElURVJBVE9SCisJICovCisJaW5saW5lIGNvbnN0X293bmVkX2l0ZXJhdG9yIG93bmVkX2JlZ2luKCkgY29uc3QKKwl7CisJCXJldHVybiggbU93bmVkRWxlbWVudHMuYmVnaW4oKSApOworCX0KKworCWlubGluZSBjb25zdF9vd25lZF9pdGVyYXRvciBvd25lZF9lbmQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtT3duZWRFbGVtZW50cy5lbmQoKSApOworCX0KKworCisJLyoqCisJICogRElTUEFUQ0ggLSBTQVZFCisJICogbU93bmVkRWxlbWVudHMKKwkgKi8KKwl2b2lkIGRpc3BhdGNoT3duZWRFbGVtZW50KGNvbnN0IEJGICYgYW5FbGVtZW50KTsKKworCWlubGluZSBjb25zdCBCRiAmIHNhdmVPd25lZEVsZW1lbnQoT2JqZWN0RWxlbWVudCAqIHB0ckVsZW1lbnQpCisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBwdHJFbGVtZW50ICkKKwkJCQk8PCAiUHJvcGVydHkgb3duZWQgZWxlbWVudCAhISEiCisJCQkJPDwgU0VORF9FWElUOworCisJCS8vIFNob3VsZCBiZSBzZXQgYnkgdGhlIGV4ZWN1dGFibGUgbWFjaGluZSBjb250YWluZXIgIQorCQlwdHJFbGVtZW50LT5zZXRPZmZzZXQoIG1Pd25lZEVsZW1lbnRzLnNpemUoKSApOworCisJCW1Pd25lZEVsZW1lbnRzLmFwcGVuZCggSU5DUl9CRiggcHRyRWxlbWVudCApICk7CisKKwkJZGlzcGF0Y2hPd25lZEVsZW1lbnQoIG1Pd25lZEVsZW1lbnRzLmxhc3QoKSApOworCisJCXJldHVybiggbU93bmVkRWxlbWVudHMubGFzdCgpICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtQnVmZmVycworCSAqLworCWlubGluZSB2b2lkIGFwcGVuZEJ1ZmZlcihjb25zdCBCRiAmIGFCdWZmZXIpCisJeworCQltQnVmZmVycy5hcHBlbmQoIGFCdWZmZXIgKTsKKworCQltT3duZWRFbGVtZW50cy5hcHBlbmQoIGFCdWZmZXIgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgVGFibGVPZkJ1ZmZlciAmIGdldEJ1ZmZlcnMoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQnVmZmVycyApOworCX0KKworCWlubGluZSBjb25zdCBCRiAmIGdldEJ1ZmZlcihjb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1CdWZmZXJzLmdldEJ5UXVhbGlmaWVkTmFtZUlEKGFRdWFsaWZpZWROYW1lSUQpICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtUG9ydHMKKwkgKi8KKwlpbmxpbmUgdm9pZCBhcHBlbmRQb3J0KGNvbnN0IEJGICYgYVBvcnQpCisJeworCQltUG9ydHMuYXBwZW5kKCBhUG9ydCApOworCisJCW1Pd25lZEVsZW1lbnRzLmFwcGVuZCggYVBvcnQgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgVGFibGVPZlBvcnQgJiBnZXRQb3J0cygpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Qb3J0cyApOworCX0KKworCWlubGluZSBjb25zdCBCRiAmIGdldFBvcnQoY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUG9ydHMuZ2V0QnlRdWFsaWZpZWROYW1lSUQoYVF1YWxpZmllZE5hbWVJRCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNQb3J0KCkgY29uc3QKKwl7CisJCXJldHVybiggbVBvcnRzLm5vbmVtcHR5KCkgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1TaWduYWxzCisJICovCisJaW5saW5lIHZvaWQgYXBwZW5kU2lnbmFsKGNvbnN0IEJGICYgYVNpZ25hbCkKKwl7CisJCW1TaWduYWxzLmFwcGVuZCggYVNpZ25hbCApOworCisJCW1Pd25lZEVsZW1lbnRzLmFwcGVuZCggYVNpZ25hbCApOworCX0KKworCWlubGluZSBjb25zdCBUYWJsZU9mU2lnbmFsICYgZ2V0U2lnbmFscygpIGNvbnN0CisJeworCQlyZXR1cm4oIG1TaWduYWxzICk7CisJfQorCisJaW5saW5lIGNvbnN0IEJGICYgZ2V0U2lnbmFsKGNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkgY29uc3QKKwl7CisJCXJldHVybiggbVNpZ25hbHMuZ2V0QnlRdWFsaWZpZWROYW1lSUQoYVF1YWxpZmllZE5hbWVJRCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNTaWduYWwoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtU2lnbmFscy5ub25lbXB0eSgpICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtUG9ydHMgLyBtU2lnbmFscworCSAqLworCWlubGluZSBjb25zdCBCRiAmIGdldFBvcnRTaWduYWwoY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKSBjb25zdAorCXsKKwkJY29uc3QgQkYgJiBwb3J0ID0gbVBvcnRzLmdldEJ5UXVhbGlmaWVkTmFtZUlEKGFRdWFsaWZpZWROYW1lSUQpOworCQlpZiggcG9ydC52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCBwb3J0ICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4oIG1TaWduYWxzLmdldEJ5UXVhbGlmaWVkTmFtZUlEKGFRdWFsaWZpZWROYW1lSUQpICk7CisJCX0KKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1CdWZmZXJzCisJICovCisJaW5saW5lIHZvaWQgYXBwZW5kQ2hhbm5lbChjb25zdCBCRiAmIGFDaGFubmVsKQorCXsKKwkJbUNoYW5uZWxzLmFwcGVuZCggYUNoYW5uZWwgKTsKKworCQltT3duZWRFbGVtZW50cy5hcHBlbmQoIGFDaGFubmVsICk7CisJfQorCisJaW5saW5lIGNvbnN0IFRhYmxlT2ZDaGFubmVsICYgZ2V0Q2hhbm5lbHMoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQ2hhbm5lbHMgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQkYgJiBnZXRDaGFubmVsKGNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkgY29uc3QKKwl7CisJCXJldHVybiggbUNoYW5uZWxzLmdldEJ5UXVhbGlmaWVkTmFtZUlEKGFRdWFsaWZpZWROYW1lSUQpICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtRGF0YVR5cGVzCisJICovCisJaW5saW5lIHZvaWQgYXBwZW5kRGF0YVR5cGUoY29uc3QgQkYgJiBhRGF0YVR5cGUpCisJeworCQltRGF0YVR5cGVzLmFwcGVuZCggYURhdGFUeXBlICk7CisKKwkJbU93bmVkRWxlbWVudHMuYXBwZW5kKCBhRGF0YVR5cGUgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgVGFibGVPZkRhdGFUeXBlICYgZ2V0RGF0YVR5cGVzKCkgY29uc3QKKwl7CisJCXJldHVybiggbURhdGFUeXBlcyApOworCX0KKworCWlubGluZSBjb25zdCBCRiAmIGdldERhdGFUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkgY29uc3QKKwl7CisJCXJldHVybiggbURhdGFUeXBlcy5nZXRCeVF1YWxpZmllZE5hbWVJRChhUXVhbGlmaWVkTmFtZUlEKSApOworCX0KKworCisJLyoqCisJICogWyBDT05TVCBdIElURVJBVE9SCisJICovCisJaW5saW5lIGNvbnN0X3R5cGVfaXRlcmF0b3IgdHlwZV9iZWdpbigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1EYXRhVHlwZXMuYmVnaW4oKSApOworCX0KKworCWlubGluZSBjb25zdF90eXBlX2l0ZXJhdG9yIHR5cGVfZW5kKCkgY29uc3QKKwl7CisJCXJldHVybiggbURhdGFUeXBlcy5lbmQoKSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVZhcmlhYmxlcworCSAqLworCWlubGluZSB2b2lkIGFwcGVuZFZhcmlhYmxlKGNvbnN0IEJGICYgYVZhcmlhYmxlKQorCXsKKwkJbVZhcmlhYmxlcy5hcHBlbmQoIGFWYXJpYWJsZSApOworCisJCW1Pd25lZEVsZW1lbnRzLmFwcGVuZCggYVZhcmlhYmxlICk7CisJfQorCisJaW5saW5lIGNvbnN0IFRhYmxlT2ZWYXJpYWJsZSAmIGdldFZhcmlhYmxlcygpIGNvbnN0CisJeworCQlyZXR1cm4oIG1WYXJpYWJsZXMgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQkYgJiBnZXRWYXJpYWJsZShjb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1WYXJpYWJsZXMuZ2V0QnlRdWFsaWZpZWROYW1lSUQoYVF1YWxpZmllZE5hbWVJRCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNWYXJpYWJsZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1WYXJpYWJsZXMubm9uZW1wdHkoKSApOworCX0KKworLy8JaW5saW5lIHZvaWQgc2F2ZVZhcmlhYmxlKFZhcmlhYmxlICogYVZhcmlhYmxlKQorLy8JeworLy8JCWFwcGVuZFZhcmlhYmxlKCBCRihhVmFyaWFibGUpICk7CisvLwl9CisKKworCS8qKgorCSAqIFsgQ09OU1QgXSBJVEVSQVRPUgorCSAqLworCWlubGluZSBjb25zdF92YXJpYWJsZV9pdGVyYXRvciB2YXJpYWJsZV9iZWdpbigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1WYXJpYWJsZXMuYmVnaW4oKSApOworCX0KKworCWlubGluZSBjb25zdF92YXJpYWJsZV9pdGVyYXRvciB2YXJpYWJsZV9lbmQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVmFyaWFibGVzLmVuZCgpICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtVmFyaWFibGVQYXJhbWV0ZXJzCisJICovCisJaW5saW5lIHZvaWQgYXBwZW5kVmFyaWFibGVQYXJhbWV0ZXIoY29uc3QgQkYgJiBhVmFyaWFibGUpCisJeworCQltVmFyaWFibGVQYXJhbWV0ZXJzLmFwcGVuZCggYVZhcmlhYmxlICk7CisKKwkJbU93bmVkRWxlbWVudHMuYXBwZW5kKCBhVmFyaWFibGUgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgVGFibGVPZlZhcmlhYmxlICYgZ2V0VmFyaWFibGVQYXJhbWV0ZXJzKCkgY29uc3QKKwl7CisJCXJldHVybiggbVZhcmlhYmxlUGFyYW1ldGVycyApOworCX0KKworCWlubGluZSBjb25zdCBCRiAmIGdldFZhcmlhYmxlUGFyYW1ldGVyKAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVmFyaWFibGVQYXJhbWV0ZXJzLmdldEJ5UXVhbGlmaWVkTmFtZUlEKGFRdWFsaWZpZWROYW1lSUQpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzVmFyaWFibGVQYXJhbWV0ZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVmFyaWFibGVQYXJhbWV0ZXJzLm5vbmVtcHR5KCkgKTsKKwl9CisKKworCS8qKgorCSAqIFsgQ09OU1QgXSBJVEVSQVRPUgorCSAqLworCWlubGluZSBjb25zdF92YXJpYWJsZV9pdGVyYXRvciB2YXJfcGFyYW1ldGVyX2JlZ2luKCkgY29uc3QKKwl7CisJCXJldHVybiggbVZhcmlhYmxlUGFyYW1ldGVycy5iZWdpbigpICk7CisJfQorCisJaW5saW5lIGNvbnN0X3ZhcmlhYmxlX2l0ZXJhdG9yIHZhcl9wYXJhbWV0ZXJfZW5kKCkgY29uc3QKKwl7CisJCXJldHVybiggbVZhcmlhYmxlUGFyYW1ldGVycy5lbmQoKSApOworCX0KKworCisJLyoqCisJICogVVRJTAorCSAqIG1WYXJpYWJsZXMgYXMgUGFyYW1ldGVycworCSAqLworCWlubGluZSBjb25zdCBCRiAmIGdldFZhcmlhYmxlUGFyYW1ldGVyKGF2bV9zaXplX3Qgb2Zmc2V0KSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVmFyaWFibGVQYXJhbWV0ZXJzLmdldCggb2Zmc2V0ICkgKTsKKwl9CisKKwlpbmxpbmUgYXZtX29mZnNldF90IGdldFZhcmlhYmxlUGFyYW1ldGVyc0NvdW50KCkgY29uc3QKKwl7CisJCXJldHVybiggbVZhcmlhYmxlUGFyYW1ldGVycy5zaXplKCkgKTsKKwl9CisKKwlpbmxpbmUgYXZtX29mZnNldF90IGdldFZhcmlhYmxlUGFyYW1ldGVyT2Zmc2V0QnlOYW1lSUQoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1WYXJpYWJsZVBhcmFtZXRlcnMuZ2V0T2Zmc2V0QnlOYW1lSUQoIGFOYW1lSUQgKSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVZhcmlhYmxlUmV0dXJucworCSAqLworCWlubGluZSB2b2lkIGFwcGVuZFZhcmlhYmxlUmV0dXJuKGNvbnN0IEJGICYgYVZhcmlhYmxlKQorCXsKKwkJbVZhcmlhYmxlUmV0dXJucy5hcHBlbmQoIGFWYXJpYWJsZSApOworCisJCW1Pd25lZEVsZW1lbnRzLmFwcGVuZCggYVZhcmlhYmxlICk7CisJfQorCisJaW5saW5lIGNvbnN0IFRhYmxlT2ZWYXJpYWJsZSAmIGdldFZhcmlhYmxlUmV0dXJucygpIGNvbnN0CisJeworCQlyZXR1cm4oIG1WYXJpYWJsZVJldHVybnMgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQkYgJiBnZXRWYXJpYWJsZVJldHVybigKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkgY29uc3QKKwl7CisJCXJldHVybiggbVZhcmlhYmxlUmV0dXJucy5nZXRCeVF1YWxpZmllZE5hbWVJRChhUXVhbGlmaWVkTmFtZUlEKSApOworCX0KKworCWlubGluZSBib29sIGhhc1ZhcmlhYmxlUmV0dXJuKCkgY29uc3QKKwl7CisJCXJldHVybiggbVZhcmlhYmxlUmV0dXJucy5ub25lbXB0eSgpICk7CisJfQorCisKKwkvKioKKwkgKiBbIENPTlNUIF0gSVRFUkFUT1IKKwkgKi8KKwlpbmxpbmUgY29uc3RfdmFyaWFibGVfaXRlcmF0b3IgdmFyX3JldHVybl9iZWdpbigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1WYXJpYWJsZVJldHVybnMuYmVnaW4oKSApOworCX0KKworCWlubGluZSBjb25zdF92YXJpYWJsZV9pdGVyYXRvciB2YXJfcmV0dXJuX2VuZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1WYXJpYWJsZVJldHVybnMuZW5kKCkgKTsKKwl9CisKKworCS8qKgorCSAqIFVUSUwKKwkgKiBtVmFyaWFibGVzIGFzIFJldHVybnMKKwkgKi8KKwlpbmxpbmUgY29uc3QgQkYgJiBnZXRWYXJpYWJsZVJldHVybihhdm1fc2l6ZV90IG9mZnNldCkgY29uc3QKKwl7CisJCXJldHVybiggbVZhcmlhYmxlUmV0dXJucy5nZXQoIG9mZnNldCApICk7CisJfQorCisJaW5saW5lIGF2bV9vZmZzZXRfdCBnZXRWYXJpYWJsZVJldHVybnNDb3VudCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1WYXJpYWJsZVJldHVybnMuc2l6ZSgpICk7CisJfQorCisJaW5saW5lIGF2bV9vZmZzZXRfdCBnZXRWYXJpYWJsZVJldHVybk9mZnNldEJ5TmFtZUlEKAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVmFyaWFibGVSZXR1cm5zLmdldE9mZnNldEJ5TmFtZUlEKCBhTmFtZUlEICkgKTsKKwl9CisKKworCS8qKgorCSAqIERJU1BBVENIIC0gU0FWRQorCSAqIHVzaW5nIFZhcmlhYmxlOjpNb2RpZmllcgorCSAqIG1WYXJpYWJsZXMKKwkgKiBtVmFyaWFibGVQYXJhbWV0ZXJzCisJICogbVZhcmlhYmxlUmV0dXJucworCSAqIG1WYXJpYWJsZUludGVybmFscworCSAqLworCXZvaWQgZGlzcGF0Y2hPd25lZFZhcmlhYmxlKGNvbnN0IEJGICYgYVZhcmlhYmxlKTsKKworCWlubGluZSBjb25zdCBCRiAmIHNhdmVPd25lZFZhcmlhYmxlKFZhcmlhYmxlICogYVZhcmlhYmxlKQorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggYVZhcmlhYmxlICkKKwkJCQk8PCAiUHJvcGVydHkgVmFyaWFibGUgb3duZWQgZWxlbWVudCAhISEiCisJCQkJPDwgU0VORF9FWElUOworCisJCS8vIFNob3VsZCBiZSBzZXQgYnkgdGhlIGV4ZWN1dGFibGUgbWFjaGluZSBjb250YWluZXIgIQorCQlhVmFyaWFibGUtPnNldE9mZnNldCggbU93bmVkRWxlbWVudHMuc2l6ZSgpICk7CisKKwkJbU93bmVkRWxlbWVudHMuYXBwZW5kKCBJTkNSX0JGKCBhVmFyaWFibGUgKSApOworCisJCWRpc3BhdGNoT3duZWRWYXJpYWJsZSggbU93bmVkRWxlbWVudHMubGFzdCgpICk7CisKKwkJcmV0dXJuKCBtT3duZWRFbGVtZW50cy5sYXN0KCkgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIGdlbmVyYWwKKwkgKi8KKwlpbmxpbmUgYm9vbCBlbXB0eSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Pd25lZEVsZW1lbnRzLmVtcHR5KCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBub25lbXB0eSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Pd25lZEVsZW1lbnRzLm5vbmVtcHR5KCkgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiBmb3IKKwkgKiBQQVJTRVIKKwkgKiBDT01QSUxFUgorCSAqLworCWlubGluZSBjb25zdCBCRiAmIGdldFByb3BlcnR5QnlOYW1lSUQoY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtT3duZWRFbGVtZW50cy5nZXRCeU5hbWVJRChhTmFtZUlEKSApOworCX0KKworCWlubGluZSBjb25zdCBCRiAmIGdldFByb3BlcnR5QnlRdWFsaWZpZWROYW1lSUQoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Pd25lZEVsZW1lbnRzLmdldEJ5UXVhbGlmaWVkTmFtZUlEKGFRdWFsaWZpZWROYW1lSUQpICk7CisJfQorCisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJdm9pZCBzdHJWYXJpYWJsZVBhcmFtZXRlcnMoT3V0U3RyZWFtICYgb3MsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGJlZ2luID0gIiBbICIsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGVuZCA9ICIgXSIsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIHNlcCA9ICIsICIpIGNvbnN0OworCisJdm9pZCBzdHJWYXJpYWJsZVJldHVybnMoT3V0U3RyZWFtICYgb3MsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGJlZ2luID0gIiByZXR1cm5zOiBbICIsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGVuZCA9ICIgXSIsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIHNlcCA9ICIsICIpIGNvbnN0OworCisJdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKK307CisKKworfQorCisjZW5kaWYgLyogRk1MX0lORlJBU1RSVUNUVVJFX1BST1BFUlRZUEFSVF9IXyAqLworCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9SRUFETUUubWQgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvaW5mcmFzdHJ1Y3R1cmUvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YzU4MDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvaW5mcmFzdHJ1Y3R1cmUvUkVBRE1FLm1kCkBAIC0wLDAgKzEsODAgQEAKKyMgRUZNLVNZTUJFWCA6IEluZnJhc3RydWN0dXJlCisKKyMjIE9iamVjdCBseWZlIGN5Y2xlIC8gc3RhZ2UKKworIyMjIE1vZGVsaW5nCisKKyMjIyBDb21waWxlZAorCisjIyMgUnVudGltZQorCisKKyMjIEVsZW1lbnRzCisKK01vZGVsaW5nICAgICAgICAgICB8ICBDb21waWxlZCAgICAgICAgIHwgIFJ1bnRpbWUKKy0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tCitTeXN0ZW0gICAgICAgICAgICAgfCBFeGVjdXRhYmxlU3lzdGVtICB8IEV4ZWN1dGlvbiBDb250ZXh0L0RhdGEKK1N5c3RlbSAgICAgICAgICAgICB8IEV4ZWN1dGFibGVGb3JtICAgIHwgUnVudGltZUZvcm0KKyAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgCitNYWNoaW5lICAgICAgICAgICAgfCBFeGVjdXRhYmxlRm9ybSAgICB8IFJ1bnRpbWVGb3JtCitNYWNoaW5lICAgICAgICAgICAgfCBJbnN0YW5jZU9mTWFjaGluZSB8IE9wdGltaXplZCBSdW50aW1lIFByb2Nlc3MgQWNjZXNzCisgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIAorU3RhdGVtYWNoaW5lICAgICAgIHwgRXhlY3V0YWJsZUZvcm0gICAgfCBSdW50aW1lRm9ybQorU3RhdGVtYWNoaW5lICAgICAgIHwgSW5zdGFuY2VPZk1hY2hpbmUgfCBPcHRpbWl6ZWQgUnVudGltZSBQcm9jZXNzIEFjY2VzcworICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAKK1N0YXRlICAgICAgICAgICAgICB8IEV4ZWN1dGFibGVGb3JtICAgIHwgPz8gUnVudGltZUZvcm0KK1N0YXRlICAgICAgICAgICAgICB8IEluc3RhbmNlT2ZNYWNoaW5lIHwgPz8gT3B0aW1pemVkIFJ1bnRpbWUgUHJvY2VzcyBBY2Nlc3MKKyAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgCitQcm9jZWR1cmUgICAgICAgICAgfCBFeGVjdXRhYmxlRm9ybSAgICB8IFJ1bnRpbWVGb3JtCitQcm9jZWR1cmUgICAgICAgICAgfCBJbnN0YW5jZU9mTWFjaGluZSB8IE9wdGltaXplZCBSdW50aW1lIFByb2Nlc3MgQWNjZXNzCisgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIAorSW5zdGFuY2UgICAgICAgICAgIHwgSW5zdGFuY2VPZk1hY2hpbmUgfCBPcHRpbWl6ZWQgUnVudGltZSBQcm9jZXNzIEFjY2VzcyAKK0luc3RhbmNlICAgICAgICAgICB8IEluc3RhbmNlT2ZNYWNoaW5lIHwgU3BlY2lmaWMgUHJpbWl0aXZlIFJvdXRpbmUgQ29kZSAKKyAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgCitQcmltaXRpdmUgUm91dGluZSAgfCBQcm9ncmFtICAgICAgICAgICB8IE9wdGltaXplZCAKK1JvdXRpbmUgICAgICAgICAgICB8IFByb2dyYW0gICAgICAgICAgIHwgT3B0aW1pemVkIAorVHJhbnNpdGlvbiAgICAgICAgIHwgUHJvZ3JhbSAgICAgICAgICAgfCBPcHRpbWl6ZWQKK1RyYW5zaXRpb24gICAgICAgICB8IFByb2dyYW0gICAgICAgICAgIHwgT3B0aW1pemVkCisgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIAorVmFyaWFibGUgICAgICAgICAgIHwgSW5zdGFuY2VPZkRhdGEgICAgfCBPcHRpbWl6ZWQgUnVudGltZSBbTC9SXSBWYWx1ZSBBY2Nlc3MgCitCdWZmZXIgICAgICAgICAgICAgfCBJbnN0YW5jZU9mQnVmZmVyICB8IE9wdGltaXplZCBSdW50aW1lIENvbmNyZXRlIEJ1ZmZlciBBY2Nlc3MgIAorUG9ydCAgICAgICAgICAgICAgIHwgSW5zdGFuY2VPZlBvcnQgICAgfCBPcHRpbWl6ZWQgUnVudGltZSBSb3V0aW5nIERhdGEgQWNjZXNzCitTaWduYWwvTWVzc2FnZSAgICAgfCAgICAgICAgICAgICAgICAgICB8IE1lc3NhZ2UgRGF0YSAgICAgICAgICAgICAgICAgIAorQ29ubmVjdG9yICAgICAgICAgIHwgSW5zdGFuY2VPZkNvbm5lY3RvciB8ICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIAorRXhwcmVzc2lvbiAgICAgICAgIHwgQnl0ZWNvZGUgICAgICAgICAgfCBPcHRpbWl6ZWQgQnl0ZWNvZGUKK0luc3RydWN0aW9uICAgICAgICB8IEJ5dGVjb2RlICAgICAgICAgIHwgT3B0aW1pemVkIEJ5dGVjb2RlCisgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIAorCisjIyBTb3VyY2UgY29kZSBzdHJ1Y3R1cmUKKworIyMjIEludGVyZmFjZXMKKworIyMjIENsYXNzZXMKKyogKipTeXN0ZW0qKgorKiAqKk1hY2hpbmUqKgorKiAqKkJlaGF2aW9yKioKKyogKipSb3V0aW5lKioKKyogKipQcm9jZWR1cmUqKgorKiAqKkluc3RhbmNlKioKKyogKipDb25uZWN0b3IqKgorKiAqKlJvdXRlcioqCisqICoqTWVzc2FnZSoqCisKKyMjIyMgQmVoYXZpb3IKKyogKipTdGF0ZW1hY2hpbmUqKgorKiAqKlJlZ2lvbioqCisqICoqU3RhdGUqKgorKiAqKlBzZXVkc3RhdGUqKgorKiAqKlRyYW5zaXRpb24qKgorCisjIyMjIFN0YXRlbWFjaGluZSBCZWhhdmlvcgorKiAqKlN0YXRlbWFjaGluZSoqCisqICoqUmVnaW9uKioKKyogKipTdGF0ZSoqCisqICoqUHNldWRzdGF0ZSoqCisqICoqVHJhbnNpdGlvbioqCisKKyMjIyBGYWN0b3JpZXMKKworCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvaW5mcmFzdHJ1Y3R1cmUvUm91dGluZS5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvaW5mcmFzdHJ1Y3R1cmUvUm91dGluZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ3ODFjOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9Sb3V0aW5lLmNwcApAQCAtMCwwICsxLDUwNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDcgZMOpYy4gMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiUm91dGluZS5oIgorCisjaW5jbHVkZSA8Zm1sL2NvbW1vbi9CZWhhdmlvcmFsRWxlbWVudC5oPgorCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0JlaGF2aW9yYWxQYXJ0Lmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL01hY2hpbmUuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvVmFyaWFibGUuaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0J1aWx0aW5BcnJheS5oPgorCisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yTWFuYWdlci5oPgorI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9VbmlGb3JtSWRlbnRpZmllci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvKioKKyAqIENPTlNUUlVDVE9SCisgKiBEZWZhdWx0CisgKi8KK1JvdXRpbmU6OlJvdXRpbmUoTWFjaGluZSAqIGFDb250YWluZXIsCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwgY29uc3QgTW9kaWZpZXIgJiBhTW9kaWZpZXIsCisJCWNvbnN0IFNwZWNpZmllciAmIGFTcGVjaWZpZXIsIGNvbnN0IEJGICYgYU1vZGVsKQorOiBCZWhhdmlvcmFsRWxlbWVudCggQ0xBU1NfS0lORF9UKCBSb3V0aW5lICkgLAorCQlhQ29udGFpbmVyLCBhTW9kaWZpZXIgLCBhTmFtZUlEICksCitTcGVjaWZpZXJJbXBsKCBhU3BlY2lmaWVyICksCisKK21Nb2RlbCggYU1vZGVsICksCisKK21QYXJhbWV0ZXJzKCApLAorbVJldHVybnMoICksCittQ29kZSggKQoreworCS8vISEgTk9USElORworfQorCisKK1JvdXRpbmU6OlJvdXRpbmUoY29uc3QgQmVoYXZpb3JhbFBhcnQgJiBhQmVoYXZpb3JhbFBhcnQsCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwgY29uc3QgU3BlY2lmaWVyICYgYVNwZWNpZmllcikKKzogQmVoYXZpb3JhbEVsZW1lbnQoIENMQVNTX0tJTkRfVCggUm91dGluZSApLAorCQlhQmVoYXZpb3JhbFBhcnQuZ2V0Q29udGFpbmVyKCksIGFOYW1lSUQgKSwKK1NwZWNpZmllckltcGwoIGFTcGVjaWZpZXIgKSwKKworbU1vZGVsKCBCRjo6UkVGX05VTEwgKSwKKworbVBhcmFtZXRlcnMoICksCittUmV0dXJucyggKSwKK21Db2RlKCApCit7CisJLy8hISBOT1RISU5HCit9CisKKworUm91dGluZSAqIFJvdXRpbmU6Om5ld0RlZmluZShNYWNoaW5lICogYUNvbnRhaW5lciwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKQoreworCXJldHVybiggbmV3IFJvdXRpbmUoYUNvbnRhaW5lciwgYU5hbWVJRCwKKwkJCVNwZWNpZmllcjo6REVTSUdOX01PREVMX1NQRUNJRklFUikgKTsKK30KKworUm91dGluZSAqIFJvdXRpbmU6Om5ld0ludm9rZShNYWNoaW5lICogYUNvbnRhaW5lciwgY29uc3QgQkYgJiBhTW9kZWwpCit7CisJcmV0dXJuKCBuZXcgUm91dGluZShhQ29udGFpbmVyLAorCQkJYU1vZGVsLmFzX3B0cjwgUm91dGluZSA+KCktPmdldE5hbWVJRCgpLAorCQkJU3BlY2lmaWVyOjpERVNJR05fSU5TVEFOQ0VfRFlOQU1JQ19TUEVDSUZJRVIsIGFNb2RlbCkgKTsKK30KKworCisvKioKKyAqIEdFVFRFUgorICogZnJvbSB2ZWN0b3Igb2YgcGFyYW1ldGVycyAvIHJldHVybnMKKyAqLworY29uc3QgQkYgJiBSb3V0aW5lOjpnZXRCeU5hbWVJRCgKKwkJY29uc3QgQkZWZWN0b3IgJiBwYXJhbXMsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkKK3sKKwlCRlZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBwYXJhbXMuYmVnaW4oKTsKKwlCRlZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBwYXJhbXMuZW5kKCk7CisJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJeworCQlpZiggKCppdCkuaXM8IFZhcmlhYmxlID4oKSAmJgorCQkJCSgoKml0KS50b19wdHI8IFZhcmlhYmxlID4oKS0+Z2V0TmFtZUlEKCkgPT0gYU5hbWVJRCkgKQorCQl7CisJCQlyZXR1cm4oICppdCApOworCQl9CisJfQorCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKK30KKworCithdm1fb2Zmc2V0X3QgUm91dGluZTo6Z2V0T2Zmc2V0QnlOYW1lSUQoCisJCWNvbnN0IEJGVmVjdG9yICYgcGFyYW1zLCBjb25zdCBzdGQ6OnN0cmluZyAmIGxhYmVsKQoreworCUJGVmVjdG9yOjpjb25zdF9pdGVyYXRvciBpdCA9IHBhcmFtcy5iZWdpbigpOworCUJGVmVjdG9yOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IHBhcmFtcy5lbmQoKTsKKwlmb3IoIGF2bV9vZmZzZXRfdCBvZmZzZXQgOyBpdCAhPSBlbmRJdCA7ICsraXQgLCArK29mZnNldCApCisJeworCQlpZiggKCppdCkuaXM8IFZhcmlhYmxlID4oKSAmJgorCQkJCSgoKml0KS50b19wdHI8IFZhcmlhYmxlID4oKS0+Z2V0TmFtZUlEKCkgPT0gbGFiZWwpICkKKwkJeworCQkJcmV0dXJuKCBvZmZzZXQgKTsKKwkJfQorCX0KKworCXJldHVybiggQVZNX05PX09GRlNFVCApOworfQorCisKKy8qKgorICogVEVTVEVSCisgKiBtUGFyYW1ldGVycworICogbVJldHVybnMKKyAqLworLy8hISBXYXJuaW5nOiBVbnVzZWQgc3RhdGljIGZ1bmN0aW9uCisvL3N0YXRpYyBib29sIGlzQ29udGFpbmVkKGNvbnN0IEJGVmVjdG9yICYgcGFyYW1zLCBWYXJpYWJsZSAqIGFQYXJhbSkKKy8veworLy8JQkZWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gcGFyYW1zLmJlZ2luKCk7CisvLwlCRlZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBwYXJhbXMuZW5kKCk7CisvLwlmb3IoIGF2bV9vZmZzZXRfdCBvZmZzZXQgOyBpdCAhPSBlbmRJdCA7ICsraXQgLCArK29mZnNldCApCisvLwl7CisvLwkJaWYoICgqaXQpLmlzVEVRKGFQYXJhbSkgKQorLy8JCXsKKy8vCQkJcmV0dXJuKCB0cnVlICk7CisvLwkJfQorLy8JfQorLy8KKy8vCXJldHVybiggZmFsc2UgKTsKKy8vfQorCisKK2Jvb2wgUm91dGluZTo6aGFzUGFyYW1ldGVyT2Zmc2V0KFZhcmlhYmxlICogYVBhcmFtZXRlcikgY29uc3QKK3sKKwlyZXR1cm4oIChhUGFyYW1ldGVyLT5nZXRPZmZzZXQoKSA8IG1QYXJhbWV0ZXJzLnNpemUoKSkgJiYKKwkJbVBhcmFtZXRlcnNbIGFQYXJhbWV0ZXItPmdldE9mZnNldCgpIF0uaXNURVEoYVBhcmFtZXRlcikgKTsKK30KKwordm9pZCBSb3V0aW5lOjpzYXZlUGFyYW1ldGVyKFZhcmlhYmxlICogYW5JbnB1dCkKK3sKKwltUGFyYW1ldGVycy5hcHBlbmQoIEJGKGFuSW5wdXQpICk7Cit9CisKKworYm9vbCBSb3V0aW5lOjpoYXNSZXR1cm5PZmZzZXQoVmFyaWFibGUgKiBhUmV0dXJuKSBjb25zdAoreworCXJldHVybiggKGFSZXR1cm4tPmdldE9mZnNldCgpIDwgbVJldHVybnMuc2l6ZSgpKSAmJgorCQltUmV0dXJuc1sgYVJldHVybi0+Z2V0T2Zmc2V0KCkgXS5pc1RFUShhUmV0dXJuKSApOworfQorCit2b2lkIFJvdXRpbmU6OnNhdmVSZXR1cm4oVmFyaWFibGUgKiBhbk91dHB1dCkKK3sKKwltUmV0dXJucy5hcHBlbmQoIEJGKGFuT3V0cHV0KSApOworfQorCisKKy8qKgorICogTUFDUk8KKyAqIElOTElOSU5HCisgKi8KK0JGQ29kZSBSb3V0aW5lOjppbmxpbmVDb2RlKGNvbnN0IEJGQ29kZSAmIGFDb2RlKSBjb25zdAoreworCWlmKCBhQ29kZS0+aXNPcENvZGUoIEFWTV9PUENPREVfUkVUVVJOICkgKQorCXsKKwkJcmV0dXJuKCBCRkNvZGU6OlJFRl9OVUxMICk7CisJfQorCWVsc2UKKwl7CisJCUJGQ29kZSBuZXdDb2RlKCBhQ29kZS0+Z2V0T3BlcmF0b3IoKSApOworCQlCRiBzdWJzdEFyZzsKKworCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdEFyZyA9IGFDb2RlLT5iZWdpbigpOworCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdEVuZEFyZyA9IGFDb2RlLT5lbmQoKTsKKwkJZm9yKCA7IGl0QXJnICE9IGl0RW5kQXJnIDsgKytpdEFyZyApCisJCXsKKwkJCWlmKCAoc3Vic3RBcmcgPSBpbmxpbmVDb2RlKCppdEFyZykpLnZhbGlkKCkgKQorCQkJeworCQkJCW5ld0NvZGUtPmFwcGVuZCggc3Vic3RBcmcgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4oIEJGQ29kZTo6UkVGX05VTEwgKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiggbmV3Q29kZSApOworCX0KK30KKworCitCRiBSb3V0aW5lOjppbmxpbmVDb2RlKGNvbnN0IEJGICYgYUNvZGUpIGNvbnN0Cit7CisJc3dpdGNoKCBhQ29kZS5jbGFzc0tpbmQoKSApCisJeworCQljYXNlIEZPUk1fQVZNQ09ERV9LSU5EOgorCQl7CisJCQlyZXR1cm4oIGlubGluZUNvZGUoIGFDb2RlLmJmQ29kZSgpICkgKTsKKwkJfQorCisJCWNhc2UgRk9STV9YRlNQX1ZBUklBQkxFX0tJTkQ6CisJCXsKKwkJCVZhcmlhYmxlICogYVZhciA9IGFDb2RlLnRvX3B0cjwgVmFyaWFibGUgPigpOworCisJCQlpZiggZ2V0TW9kZWwoKS0+aGFzUGFyYW1ldGVyT2Zmc2V0KCBhVmFyICkgKQorCQkJeworCQkJCWlmKCAoYVZhci0+Z2V0T2Zmc2V0KCkgPCBtUGFyYW1ldGVycy5zaXplKCkpICYmCisJCQkJCW1QYXJhbWV0ZXJzWyBhVmFyLT5nZXRPZmZzZXQoKSBdLnZhbGlkKCkgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCBtUGFyYW1ldGVyc1sgYVZhci0+Z2V0T2Zmc2V0KCkgXSApOworCQkJCX0KKwkJCQllbHNlIGlmKCBhVmFyLT5oYXNWYWx1ZSgpICkKKwkJCQl7CisJCQkJCXJldHVybiggYVZhci0+Z2V0VmFsdWUoKSApOworCQkJCX0KKwkJCQllbHNlIGlmKCBhVmFyLT5nZXRNb2RpZmllcigpLmhhc05hdHVyZU1hY3JvKCkKKwkJCQkJCSYmIGFWYXItPmhhc0JpbmRpbmcoKSApCisJCQkJeworCQkJCQlyZXR1cm4oIGFWYXItPmdldEJpbmRpbmcoKSApOworCQkJCX0KKworCQkJCXJldHVybiggQkZDb2RlOjpSRUZfTlVMTCApOworCQkJfQorCQkJZWxzZSBpZiggZ2V0TW9kZWwoKS0+aGFzUmV0dXJuT2Zmc2V0KCBhVmFyICkgKQorCQkJeworCQkJCWlmKCAoYVZhci0+Z2V0T2Zmc2V0KCkgPCBtUmV0dXJucy5zaXplKCkpICYmCisJCQkJCQltUmV0dXJuc1sgYVZhci0+Z2V0T2Zmc2V0KCkgXS52YWxpZCgpICkKKwkJCQl7CisJCQkJCXJldHVybiggbVJldHVybnNbIGFWYXItPmdldE9mZnNldCgpIF0gKTsKKwkJCQl9CisJCQkJZWxzZSBpZiggYVZhci0+aGFzVmFsdWUoKSApCisJCQkJeworCQkJCQlyZXR1cm4oIGFWYXItPmdldFZhbHVlKCkgKTsKKwkJCQl9CisJCQkJZWxzZSBpZiggYVZhci0+Z2V0TW9kaWZpZXIoKS5oYXNOYXR1cmVNYWNybygpCisJCQkJCQkmJiBhVmFyLT5oYXNCaW5kaW5nKCkgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCBhVmFyLT5nZXRCaW5kaW5nKCkgKTsKKwkJCQl9CisKKwkJCQlyZXR1cm4oIEJGQ29kZTo6UkVGX05VTEwgKTsKKwkJCX0KKworCQkJcmV0dXJuKCBhQ29kZSApOworCQl9CisKKwkJY2FzZSBGT1JNX1VGSV9LSU5EOgorCQl7CisJCQlVbmlGb3JtSWRlbnRpZmllciAqIGFuVUZJID0gYUNvZGUudG9fcHRyPCBVbmlGb3JtSWRlbnRpZmllciA+KCk7CisKKwkJCVVuaUZvcm1JZGVudGlmaWVyOjpMaXN0T2ZGaWVsZDo6Y29uc3RfaXRlcmF0b3IgaXRGaWVsZCA9IGFuVUZJLT5iZWdpbigpOworCQkJVW5pRm9ybUlkZW50aWZpZXI6Okxpc3RPZkZpZWxkOjpjb25zdF9pdGVyYXRvciBlbmRGaWVsZCA9IGFuVUZJLT5lbmQoKTsKKworCQkJQkYgbmV3Q29kZTsKKwkJCUJGIHN1YnN0QXJnOworCisJCQlpZiggKHN1YnN0QXJnID0gaW5saW5lQ29kZSgqaXRGaWVsZCkpLnZhbGlkKCkgKQorCQkJeworCQkJCWlmKCBzdWJzdEFyZy5pczwgVW5pRm9ybUlkZW50aWZpZXIgPigpICkKKwkJCQl7CisJCQkJCW5ld0NvZGUgPSBhblVGSSA9IG5ldyBVbmlGb3JtSWRlbnRpZmllcigKKwkJCQkJCQlzdWJzdEFyZy50b19yZWY8IFVuaUZvcm1JZGVudGlmaWVyID4oKSApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQluZXdDb2RlID0gYW5VRkkgPSBuZXcgVW5pRm9ybUlkZW50aWZpZXIoYW5VRkktPmdldExvY2F0b3IoKSk7CisKKwkJCQkJYW5VRkktPmFwcGVuZEZpZWxkKCBzdWJzdEFyZyAsICgqaXRGaWVsZCkuZ2V0U2NoZW1lKCkgKTsKKwkJCQl9CisKKwkJCQlmb3IoICsraXRGaWVsZCA7IGl0RmllbGQgIT0gZW5kRmllbGQgOyArK2l0RmllbGQgKQorCQkJCXsKKwkJCQkJaWYoIChzdWJzdEFyZyA9IGlubGluZUNvZGUoKml0RmllbGQpKS52YWxpZCgpICkKKwkJCQkJeworCQkJCQkJYW5VRkktPmFwcGVuZEZpZWxkKCBzdWJzdEFyZyAsICgqaXRGaWVsZCkuZ2V0U2NoZW1lKCkgKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXJldHVybiggQkZDb2RlOjpSRUZfTlVMTCApOworCQkJCQl9CisJCQkJfQorCisJCQkJcmV0dXJuKCBuZXdDb2RlICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuKCBCRkNvZGU6OlJFRl9OVUxMICk7CisJCQl9CisJCX0KKworCQljYXNlIEZPUk1fQVJSQVlfQkZfS0lORDoKKwkJeworCQkJQXJyYXlCRiAqIGFycmF5SW4gPSBhQ29kZS50b19wdHI8IEFycmF5QkYgPigpOworCisJCQlBcnJheUJGICogYXJyYXlPdXQgPSBuZXcgQXJyYXlCRigKKwkJCQkJYXJyYXlJbi0+Z2V0VHlwZVNwZWNpZmllcigpLCBhcnJheUluLT5zaXplKCkpOworCisJCQlCRiBuZXdDb2RlKCBhcnJheU91dCApOworCQkJQkYgc3Vic3RBcmc7CisKKwkJCWZvciggYXZtX3NpemVfdCBpZHggPSAwIDsgaWR4IDwgYXJyYXlJbi0+c2l6ZSgpIDsgKytpZHggKQorCQkJeworCQkJCWlmKCAoc3Vic3RBcmcgPSBpbmxpbmVDb2RlKGFycmF5SW4tPmF0KGlkeCkpKS52YWxpZCgpICkKKwkJCQl7CisJCQkJCWFycmF5T3V0LT5zZXQoaWR4LCBzdWJzdEFyZyk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXJldHVybiggQkZDb2RlOjpSRUZfTlVMTCApOworCQkJCX0KKwkJCX0KKworCQkJcmV0dXJuKCBuZXdDb2RlICk7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlyZXR1cm4oIGFDb2RlICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIGFDb2RlICk7Cit9CisKKworLyoqCisgKiBTZXJpYWxpemF0aW9uCisgKi8KK3ZvaWQgUm91dGluZTo6c3RyUGFyYW1ldGVycyhPdXRTdHJlYW0gJiBvcywgY29uc3Qgc3RkOjpzdHJpbmcgJiBzZXApIGNvbnN0Cit7CisJQkZWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbVBhcmFtZXRlcnMuYmVnaW4oKTsKKwlCRlZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBtUGFyYW1ldGVycy5lbmQoKTsKKworCW9zIDw8ICIoIjsKKwlpZiggKCppdCkuaXM8IFZhcmlhYmxlID4oKSApCisJeworCQlvcyA8PCAiJCIgPDwgKCppdCkudG9fcHRyPCBWYXJpYWJsZSA+KCktPmdldE9mZnNldCgpIDw8ICI6ICI7CisJCSgqaXQpLnRvX3B0cjwgVmFyaWFibGUgPigpLT5zdHJQYXJhbWV0ZXIob3MpOworCX0KKwllbHNlCisJeworCQlvcyA8PCAoKml0KS5zdHIoKTsKKwl9CisJZm9yKCArK2l0IDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwl7CisJCW9zIDw8ICIsICI7CisJCWlmKCAoKml0KS5pczwgVmFyaWFibGUgPigpICkKKwkJeworCQkJb3MgPDwgIiQiIDw8ICgqaXQpLnRvX3B0cjwgVmFyaWFibGUgPigpLT5nZXRPZmZzZXQoKSA8PCAiOiAiOworCQkJKCppdCkudG9fcHRyPCBWYXJpYWJsZSA+KCktPnN0clBhcmFtZXRlcihvcyk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlvcyA8PCAoKml0KS5zdHIoKTsKKwkJfQorCX0KKwlvcyA8PCAiKSI7Cit9CisKK3ZvaWQgUm91dGluZTo6c3RyUmV0dXJucyhPdXRTdHJlYW0gJiBvcywgY29uc3Qgc3RkOjpzdHJpbmcgJiBzZXApIGNvbnN0Cit7CisJQkZWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbVJldHVybnMuYmVnaW4oKTsKKwlCRlZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBtUmV0dXJucy5lbmQoKTsKKworCW9zIDw8ICIoIjsKKwlpZiggKCppdCkuaXM8IFZhcmlhYmxlID4oKSApCisJeworCQlvcyA8PCAiJCIgPDwgKCppdCkudG9fcHRyPCBWYXJpYWJsZSA+KCktPmdldE9mZnNldCgpIDw8ICI6ICI7CisJCSgqaXQpLnRvX3B0cjwgVmFyaWFibGUgPigpLT5zdHJSZXR1cm4ob3MpOworCX0KKwllbHNlCisJeworCQlvcyA8PCAoKml0KS5zdHIoKTsKKwl9CisJZm9yKCArK2l0IDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwl7CisJCW9zIDw8ICIsICI7CisJCWlmKCAoKml0KS5pczwgVmFyaWFibGUgPigpICkKKwkJeworCQkJb3MgPDwgIiQiIDw8ICgqaXQpLnRvX3B0cjwgVmFyaWFibGUgPigpLT5nZXRPZmZzZXQoKSA8PCAiOiAiOworCQkJKCppdCkudG9fcHRyPCBWYXJpYWJsZSA+KCktPnN0clJldHVybihvcyk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlvcyA8PCAoKml0KS5zdHIoKTsKKwkJfQorCX0KKwlvcyA8PCAiKSI7Cit9CisKKwordm9pZCBSb3V0aW5lOjpzdHJIZWFkZXIoT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJb3MgPDwgZ2V0TW9kaWZpZXIoKS50b1N0cmluZygpOworCisJaWYoIGdldFNwZWNpZmllcigpLmlzRGVzaWduUHJvdG90eXBlU3RhdGljKCkgKQorCXsKKwkJb3MgPDwgZ2V0U3BlY2lmaWVyKCkudG9TdHJpbmdfbm90KAorCQkJCVNwZWNpZmllcjo6REVTSUdOX1BST1RPVFlQRV9TVEFUSUNfS0lORCkgPDwgIkAiOworCX0KKwllbHNlCisJeworCQlvcyA8PCBnZXRTcGVjaWZpZXIoKS50b1N0cmluZygpIDw8ICJyb3V0aW5lICI7CisJfQorCisJb3MgPDwgZ2V0TmFtZUlEKCk7CisKKwlpZiggbVBhcmFtZXRlcnMubm9uZW1wdHkoKSApCisJeworCQlzdHJQYXJhbWV0ZXJzKG9zKTsKKwl9CisJaWYoIG1SZXR1cm5zLm5vbmVtcHR5KCkgKQorCXsKKwkJb3MgPDwgIiAtLT4gIjsKKworCQlzdHJSZXR1cm5zKG9zKTsKKwl9Cit9CisKKwordm9pZCBSb3V0aW5lOjp0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlzdHJIZWFkZXIoIG9zIDw8IFRBQiApOworCisJb3MgPDwgInsiOworCWlmKCBtQ29kZS52YWxpZCgpICkKKwl7CisJCW1Db2RlLT50b1N0cmVhbVJvdXRpbmUoIG9zIDw8IElOQ1JfSU5ERU5UICkgPDwgREVDUl9JTkRFTlRfVEFCOworCX0KKwlvcyA8PCAifSIgPDwgRU9MX0ZMVVNIOworfQorCisKKwordm9pZCBSb3V0aW5lOjpzdHJJbnZva2VQYXJhbWV0ZXJzKE91dFN0cmVhbSAmIG9zLCBjb25zdCBzdGQ6OnN0cmluZyAmIHNlcCkgY29uc3QKK3sKKwlCRlZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtUGFyYW1ldGVycy5iZWdpbigpOworCUJGVmVjdG9yOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IG1QYXJhbWV0ZXJzLmVuZCgpOworCisJb3MgPDwgIigiOworCUF2bUNvZGU6OnRvU3RyZWFtKG9zLCAqaXQpOworCWZvciggKytpdCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJeworCQlvcyA8PCAiLCAiOworCQlBdm1Db2RlOjp0b1N0cmVhbShvcywgKml0KTsKKwl9CisJb3MgPDwgIikiOworfQorCit2b2lkIFJvdXRpbmU6OnN0ckludm9rZVJldHVybnMoT3V0U3RyZWFtICYgb3MsIGNvbnN0IHN0ZDo6c3RyaW5nICYgc2VwKSBjb25zdAoreworCUJGVmVjdG9yOjpjb25zdF9pdGVyYXRvciBpdCA9IG1SZXR1cm5zLmJlZ2luKCk7CisJQkZWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gbVJldHVybnMuZW5kKCk7CisKKwlvcyA8PCAiKCI7CisJQXZtQ29kZTo6dG9TdHJlYW0ob3MsICppdCk7CisJZm9yKCArK2l0IDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwl7CisJCW9zIDw8ICIsICI7CisJCUF2bUNvZGU6OnRvU3RyZWFtKG9zLCAqaXQpOworCX0KKwlvcyA8PCAiKSI7Cit9CisKKwordm9pZCBSb3V0aW5lOjp0b1N0cmVhbUludm9rZShPdXRTdHJlYW0gJiBvcywgY29uc3Qgc3RkOjpzdHJpbmcgJiBzZXApIGNvbnN0Cit7CisJb3MgPDwgVEFCIDw8IGdldE5hbWVJRCgpIDw8IEFWTV9OT19JTkRFTlQ7CisKKwlpZiggbVBhcmFtZXRlcnMubm9uZW1wdHkoKSApCisJeworCQlzdHJJbnZva2VQYXJhbWV0ZXJzKG9zLCBzZXApOworCX0KKwllbHNlCisJeworCQlvcyA8PCAiKCkiOworCX0KKworCWlmKCBtUmV0dXJucy5ub25lbXB0eSgpICkKKwl7CisJCW9zIDw8ICIgLS0+ICI7CisJCXN0ckludm9rZVJldHVybnMob3MsIHNlcCk7CisJfQorCisJQVZNX0RFQlVHX1JFRl9DT1VOVEVSKG9zKTsKKworCW9zIDw8IEVORF9JTkRFTlQgPDwgRU9MX0ZMVVNIOworfQorCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL1JvdXRpbmUuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9Sb3V0aW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcxZDQ2NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9Sb3V0aW5lLmgKQEAgLTAsMCArMSw0MTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiA3IGTDqWMuIDIwMTEKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBST1VUSU5FX0hfCisjZGVmaW5lIFJPVVRJTkVfSF8KKworI2luY2x1ZGUgPGZtbC9jb21tb24vQmVoYXZpb3JhbEVsZW1lbnQuaD4KKyNpbmNsdWRlIDxmbWwvY29tbW9uL1NwZWNpZmllckVsZW1lbnQuaD4KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vQkZDb250YWluZXIuaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0F2bUNvZGUuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9TdGF0ZW1lbnRDb25zdHJ1Y3Rvci5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL1N0YXRlbWVudFR5cGVDaGVja2VyLmg+CisKKyNpbmNsdWRlIDxmbWwvb3BlcmF0b3IvT3BlcmF0b3IuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKK2NsYXNzIEJlaGF2aW9yYWxQYXJ0OworCitjbGFzcyBNYWNoaW5lOworCitjbGFzcyBPYmplY3RFbGVtZW50OworCitjbGFzcyBWYXJpYWJsZTsKKworCitjbGFzcyBSb3V0aW5lIDoKKwkJcHVibGljIEJlaGF2aW9yYWxFbGVtZW50LAorCQlwdWJsaWMgU3BlY2lmaWVySW1wbCwKKwkJQVZNX0lOSkVDVF9JTlNUQU5DRV9DT1VOVEVSX0NMQVNTKCBSb3V0aW5lICkKK3sKKworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBSb3V0aW5lICkKKworCitwcm90ZWN0ZWQ6CisJLyoqCisJKiBBVFRSSUJVVEVTCisJKi8KKwlCRiBtTW9kZWw7CisKKwlCRlZlY3RvciBtUGFyYW1ldGVyczsKKworCUJGVmVjdG9yIG1SZXR1cm5zOworCisJQkZDb2RlIG1Db2RlOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlSb3V0aW5lKE1hY2hpbmUgKiBhQ29udGFpbmVyLCBjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsCisJCQljb25zdCBNb2RpZmllciAmIGFNb2RpZmllciwgY29uc3QgU3BlY2lmaWVyICYgYVNwZWNpZmllciwKKwkJCWNvbnN0IEJGICYgYU1vZGVsID0gQkY6OlJFRl9OVUxMKTsKKworCisJUm91dGluZShCZWhhdmlvcmFsRWxlbWVudCAqIGFDb250YWluZXIsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwKKwkJCWNvbnN0IFNwZWNpZmllciAmIGFTcGVjaWZpZXIgPQorCQkJCQlTcGVjaWZpZXI6OkRFU0lHTl9QUk9UT1RZUEVfU1RBVElDX1NQRUNJRklFUiwKKwkJCWNvbnN0IEJGICYgYU1vZGVsID0gQkY6OlJFRl9OVUxMKQorCTogQmVoYXZpb3JhbEVsZW1lbnQoIENMQVNTX0tJTkRfVCggUm91dGluZSApLCBhQ29udGFpbmVyLCBhTmFtZUlEICksCisJU3BlY2lmaWVySW1wbCggYVNwZWNpZmllciApLAorCisJbU1vZGVsKCBhTW9kZWwgKSwKKworCW1QYXJhbWV0ZXJzKCApLAorCW1SZXR1cm5zKCApLAorCW1Db2RlKCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlSb3V0aW5lKGNvbnN0IEJlaGF2aW9yYWxQYXJ0ICYgYUJlaGF2aW9yYWxQYXJ0LAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELAorCQkJY29uc3QgU3BlY2lmaWVyICYgYVNwZWNpZmllciA9CisJCQkJCVNwZWNpZmllcjo6REVTSUdOX1BST1RPVFlQRV9TVEFUSUNfU1BFQ0lGSUVSKTsKKworCitwdWJsaWM6CisJaW5saW5lIHN0YXRpYyBSb3V0aW5lICogbmV3RGVmaW5lKAorCQkJTWFjaGluZSAqIGFDb250YWluZXIsIE1vZGlmaWVyIGFNb2RpZmllciwKKwkJCVNwZWNpZmllciBhU3BlY2lmaWVyLCBjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpCisJeworCisJCXJldHVybiggbmV3IFJvdXRpbmUoYUNvbnRhaW5lciwgYU5hbWVJRCwgYU1vZGlmaWVyLAorCQkJCWFTcGVjaWZpZXIuc2V0RGVzaWduTW9kZWwoKSkgKTsKKwl9CisKKwlzdGF0aWMgUm91dGluZSAqIG5ld0RlZmluZSgKKwkJCU1hY2hpbmUgKiBhQ29udGFpbmVyLCBjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpOworCisJaW5saW5lIHN0YXRpYyBSb3V0aW5lICogbmV3RGVmaW5lKAorCQkJY29uc3QgQmVoYXZpb3JhbFBhcnQgJiBhQmVoYXZpb3JhbFBhcnQsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpCisJeworCisJCXJldHVybiggbmV3IFJvdXRpbmUoYUJlaGF2aW9yYWxQYXJ0LCBhTmFtZUlELAorCQkJCVNwZWNpZmllcjo6REVTSUdOX01PREVMX1NQRUNJRklFUikgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIFJvdXRpbmUgKiBuZXdJbnZva2UoCisJCQlCZWhhdmlvcmFsRWxlbWVudCAqIGFDb250YWluZXIsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkKKwl7CisJCXJldHVybiggbmV3IFJvdXRpbmUoYUNvbnRhaW5lciwgYU5hbWVJRCwKKwkJCQlTcGVjaWZpZXI6OkRFU0lHTl9JTlNUQU5DRV9EWU5BTUlDX1NQRUNJRklFUikgKTsKKwl9CisKKwlzdGF0aWMgUm91dGluZSAqIG5ld0ludm9rZShNYWNoaW5lICogYUNvbnRhaW5lciwgY29uc3QgQkYgJiBhTW9kZWwpOworCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+Um91dGluZSgpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIHRoZSBUeXBlIFNwZWNpZmllcgorCSAqLworCWlubGluZSBjb25zdCBCRiAmIGdldFR5cGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtTW9kZWwgKTsKKwl9CisKKy8vCWlubGluZSBib29sIGhhc1R5cGUoKSBjb25zdAorLy8gICAgeworLy8JCXJldHVybiggbU1vZGVsLnZhbGlkKCkgKTsKKy8vICAgIH0KKy8vCisvLwlpbmxpbmUgdm9pZCBzZXRUeXBlKGNvbnN0IEJGICYgYVR5cGUpCisvLwl7CisvLwkJbU1vZGVsID0gYVR5cGU7CisvLwl9CisvLworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbU1vZGVsIGFzIFJvdXRpbmUgTW9kZWwKKwkgKi8KKwlpbmxpbmUgUm91dGluZSAqIGdldE1vZGVsKCkgY29uc3QKKwl7CisJCXJldHVybiggbU1vZGVsLmFzX3B0cjwgUm91dGluZSA+KCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNNb2RlbCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Nb2RlbC5pczwgUm91dGluZSA+KCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRNb2RlbChjb25zdCBCRiAmIGFNb2RlbCkKKwl7CisJCW1Nb2RlbCA9IGFNb2RlbDsKKworCQlpZiggYU1vZGVsLmlzPCBSb3V0aW5lID4oKSApCisJCXsKKwkJCUJlaGF2aW9yYWxFbGVtZW50OjpzZXROYW1lSUQoCisJCQkJCWFNb2RlbC50b19wdHI8IFJvdXRpbmUgPigpLT5nZXROYW1lSUQoKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJQmVoYXZpb3JhbEVsZW1lbnQ6OnNldE5hbWVJRCggYU1vZGVsLnN0cigpICk7CisJCX0KKwl9CisKKwkvLyBNb2RlbCBhcyBJbnZva2FibGUgT3BlcmF0b3IKKwlpbmxpbmUgT3BlcmF0b3IgKiBnZXRNb2RlbE9wZXJhdG9yKCkgY29uc3QKKwl7CisJCXJldHVybiggbU1vZGVsLmFzX3B0cjwgT3BlcmF0b3IgPigpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzTW9kZWxPcGVyYXRvcigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Nb2RlbC5pczwgT3BlcmF0b3IgPigpICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtQ29kZQorCSAqLworCWlubGluZSBCRkNvZGUgJiBnZXRDb2RlKCkKKwl7CisJCXJldHVybiggbUNvZGUgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQkZDb2RlICYgZ2V0Q29kZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Db2RlICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzQ29kZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Db2RlLnZhbGlkKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBkb1NvbWV0aGluZygpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Db2RlLnZhbGlkKCkgJiYgU3RhdGVtZW50VHlwZUNoZWNrZXI6OmRvU29tZXRoaW5nKG1Db2RlKSApOworCX0KKworCWlubGluZSB2b2lkIHNldENvZGUoY29uc3QgQkZDb2RlICYgYUNvZGUpCisJeworCQltQ29kZSA9IGFDb2RlOworCX0KKworCWlubGluZSB2b2lkIHNlcUNvZGUoY29uc3QgQkZDb2RlICYgYUNvZGUpCisJeworCQlpZiggbUNvZGUudmFsaWQoKSApCisJCXsKKwkJCW1Db2RlID0gU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGVGbGF0KAorCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NFUVVFTkNFLCBtQ29kZSwgYUNvZGUpOworCQl9CisJCWVsc2UKKwkJeworCQkJbUNvZGUgPSBhQ29kZTsKKwkJfQorCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVBhcmFtZXRlcnMKKwkgKi8KKwlpbmxpbmUgQkZWZWN0b3IgJiBnZXRQYXJhbWV0ZXJzKCkKKwl7CisJCXJldHVybiggbVBhcmFtZXRlcnMgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQkYgJiBnZXRQYXJhbWV0ZXIoYXZtX29mZnNldF90IG9mZnNldCkgY29uc3QKKwl7CisJCXJldHVybiggbVBhcmFtZXRlcnNbb2Zmc2V0XSApOworCX0KKworCWlubGluZSBjb25zdCBCRiAmIGdldFBhcmFtZXRlcihjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldEJ5TmFtZUlEKG1QYXJhbWV0ZXJzLCBhTmFtZUlEKSApOworCX0KKworCWF2bV9vZmZzZXRfdCBnZXRQYXJhbWV0ZXJPZmZzZXQoY29uc3Qgc3RkOjpzdHJpbmcgJiBsYWJlbCkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0T2Zmc2V0QnlOYW1lSUQobVBhcmFtZXRlcnMsIGxhYmVsKSApOworCX0KKworCisJaW5saW5lIGJvb2wgaGFzUGFyYW1ldGVycygpIGNvbnN0CisJeworCQlyZXR1cm4oIG1QYXJhbWV0ZXJzLm5vbmVtcHR5KCkgKTsKKwl9CisKKwlib29sIGhhc1BhcmFtZXRlck9mZnNldChWYXJpYWJsZSAqIGFQYXJhbWV0ZXIpIGNvbnN0OworCisKKwlpbmxpbmUgdm9pZCBhcHBlbmRQYXJhbWV0ZXIoY29uc3QgQkYgJiBhbklucHV0KQorCXsKKwkJbVBhcmFtZXRlcnMuYXBwZW5kKCBhbklucHV0ICk7CisJfQorCisJdm9pZCBzYXZlUGFyYW1ldGVyKFZhcmlhYmxlICogYW5JbnB1dCk7CisKKwlpbmxpbmUgdm9pZCBhcHBlbmRQYXJhbWV0ZXIoY29uc3Qgc3RkOjpzdHJpbmcgJiBsYWJlbCwgY29uc3QgQkYgJiBhbklucHV0KQorCXsKKwkJbVBhcmFtZXRlcnMuYXBwZW5kKCBhbklucHV0ICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtUmV0dXJucworCSAqLworCWlubGluZSBCRlZlY3RvciAmIGdldFJldHVybnMoKQorCXsKKwkJcmV0dXJuKCBtUmV0dXJucyApOworCX0KKworCWlubGluZSBjb25zdCBCRiAmIGdldFJldHVybihhdm1fb2Zmc2V0X3Qgb2Zmc2V0KSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUmV0dXJuc1tvZmZzZXRdICk7CisJfQorCisJaW5saW5lIGNvbnN0IEJGICYgZ2V0UmV0dXJuKGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0QnlOYW1lSUQobVJldHVybnMsIGFOYW1lSUQpICk7CisJfQorCisJYXZtX29mZnNldF90IGdldFJldHVybk9mZnNldChjb25zdCBzdGQ6OnN0cmluZyAmIGxhYmVsKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRPZmZzZXRCeU5hbWVJRChtUmV0dXJucywgbGFiZWwpICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBoYXNSZXR1cm5zKCkgY29uc3QKKwl7CisJCXJldHVybiggbVJldHVybnMubm9uZW1wdHkoKSApOworCX0KKworCWJvb2wgaGFzUmV0dXJuT2Zmc2V0KFZhcmlhYmxlICogYVJldHVybikgY29uc3Q7CisKKworCWlubGluZSB2b2lkIGFwcGVuZFJldHVybihjb25zdCBCRiAmIGFuT3V0cHV0KQorCXsKKwkJbVJldHVybnMuYXBwZW5kKCBhbk91dHB1dCApOworCX0KKworCXZvaWQgc2F2ZVJldHVybihWYXJpYWJsZSAqIGFuT3V0cHV0KTsKKworCWlubGluZSB2b2lkIGFwcGVuZFJldHVybihjb25zdCBzdGQ6OnN0cmluZyAmIGxhYmVsLCBjb25zdCBCRiAmIGFuT3V0cHV0KQorCXsKKwkJbVJldHVybnMuYXBwZW5kKCBhbk91dHB1dCApOworCX0KKworCisJLyoqCisJICogR0VUVEVSCisJICogdGhlIHBhcmFtZXRlcnMgLyByZXR1cm5zCisJICovCisJaW5saW5lIGNvbnN0IEJGICYgZ2V0UGFyYW1SZXR1cm4oY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKSBjb25zdAorCXsKKwkJY29uc3QgQkYgJiBiZlBhcmFtID0gZ2V0UGFyYW1ldGVyKGFOYW1lSUQpOworCisJCXJldHVybiggYmZQYXJhbS52YWxpZCgpID8gYmZQYXJhbSA6IGdldFJldHVybihhTmFtZUlEKSAgKTsKKworCX0KKworCXN0YXRpYyBjb25zdCBCRiAmIGdldEJ5TmFtZUlEKAorCQkJY29uc3QgQkZWZWN0b3IgJiBwYXJhbXMsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCk7CisKKwlzdGF0aWMgYXZtX29mZnNldF90IGdldE9mZnNldEJ5TmFtZUlEKAorCQkJY29uc3QgQkZWZWN0b3IgJiBwYXJhbXMsIGNvbnN0IHN0ZDo6c3RyaW5nICYgbGFiZWwpOworCisKKwkvKioKKwkgKiBNQUNSTworCSAqIElOTElOSU5HCisJICovCisJaW5saW5lIGJvb2wgaXNJbmxpbmFibGVTdGF0ZW1lbnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRTcGVjaWZpZXIoKS5pc0Rlc2lnbkluc3RhbmNlRHluYW1pYygpICYmIGhhc01vZGVsKCkKKwkJCQkmJiBnZXRNb2RlbCgpLT5nZXRNb2RpZmllcigpLmhhc05hdHVyZU1hY3JvKCkgKTsKKwl9CisKKwlpbmxpbmUgQkZDb2RlIGlubGluZVN0YXRlbWVudCgpIGNvbnN0CisJeworCQlyZXR1cm4oIGlubGluZUNvZGUoIGdldE1vZGVsKCktPm1Db2RlICkgKTsKKwl9CisKKworCWlubGluZSBib29sIGlzSW5saW5hYmxlRXhwcmVzc2lvbigpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldFNwZWNpZmllcigpLmlzRGVzaWduSW5zdGFuY2VEeW5hbWljKCkgJiYgaGFzTW9kZWwoKQorCQkJCSYmIGdldE1vZGVsKCktPmdldE1vZGlmaWVyKCkuaGFzTmF0dXJlTWFjcm8oKQorCQkJCSYmIGdldE1vZGVsKCktPmdldFJldHVybnMoKS5zaW5nbGV0b24oKQorCQkJCSYmIGdldE1vZGVsKCktPmdldENvZGUoKS0+aXNPcENvZGUoIEFWTV9PUENPREVfUkVUVVJOICkgKTsKKwl9CisKKwlpbmxpbmUgQkYgaW5saW5lRXhwcmVzc2lvbigpIGNvbnN0CisJeworCQlyZXR1cm4oIGlubGluZUNvZGUoIGdldE1vZGVsKCktPm1Db2RlLT5maXJzdCgpICkgKTsKKwl9CisKKworCUJGQ29kZSBpbmxpbmVDb2RlKGNvbnN0IEJGQ29kZSAmIGFDb2RlKSBjb25zdDsKKworCUJGIGlubGluZUNvZGUoY29uc3QgQkYgJiBhQ29kZSkgY29uc3Q7CisKKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwl2b2lkIHN0clBhcmFtZXRlcnMoT3V0U3RyZWFtICYgb3MsIGNvbnN0IHN0ZDo6c3RyaW5nICYgc2VwID0gIiwgIikgY29uc3Q7CisKKwl2b2lkIHN0clJldHVybnMoT3V0U3RyZWFtICYgb3MsIGNvbnN0IHN0ZDo6c3RyaW5nICYgc2VwID0gIiwgIikgY29uc3Q7CisKKwl2b2lkIHN0ckhlYWRlcihPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKKwl2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworCisJdm9pZCBzdHJJbnZva2VQYXJhbWV0ZXJzKE91dFN0cmVhbSAmIG9zLCBjb25zdCBzdGQ6OnN0cmluZyAmIHNlcCA9ICIsICIpIGNvbnN0OworCisJdm9pZCBzdHJJbnZva2VSZXR1cm5zKE91dFN0cmVhbSAmIG9zLCBjb25zdCBzdGQ6OnN0cmluZyAmIHNlcCA9ICIsICIpIGNvbnN0OworCisJdm9pZCB0b1N0cmVhbUludm9rZShPdXRTdHJlYW0gJiBvcywgY29uc3Qgc3RkOjpzdHJpbmcgJiBzZXAgPSAiLCAiKSBjb25zdDsKKworfTsKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKyNlbmRpZiAvKiBST1VUSU5FX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvaW5mcmFzdHJ1Y3R1cmUvU3lzdGVtLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9TeXN0ZW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYjVkNTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvaW5mcmFzdHJ1Y3R1cmUvU3lzdGVtLmNwcApAQCAtMCwwICsxLDYzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTcgZsOpdnIuIDIwMTEKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlN5c3RlbS5oIgorCisjaW5jbHVkZSA8Y29sbGVjdGlvbi9UeXBlZGVmLmg+CisKKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvUGFja2FnZS5oPgorCisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1dPYmplY3QuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoqCisgKiBTZXJpYWxpemF0aW9uCisgKi8KKwordm9pZCBTeXN0ZW06OnN0ckhlYWRlcihPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlvcyA8PCBnZXRNb2RpZmllcigpLnRvU3RyaW5nKCkKKwkJCTw8IGdldFNwZWNpZmllcigpLnN0ckRlc2lnbl9ub3QoCisJCQkJCVNwZWNpZmllcjo6REVTSUdOX1BST1RPVFlQRV9TVEFUSUNfS0lORCkKKwkJCTw8IGdldFNwZWNpZmllcigpLmtleXdvcmRDb21wb25lbnQoKTsKKworCWlmKCBnZXRTcGVjaWZpZXIoKS5pc0RlZmluZWQoU3BlY2lmaWVyOjpESVNBQkxFX0NPTVBPTkVOVF9ERVNJR05fRklFTEQpICkKKwl7CisJCW9zIDw8ICI8ICIgPDwgZ2V0U3BlY2lmaWVyKCkuc3RyKAorCQkJCVNwZWNpZmllcjo6RElTQUJMRV9DT01QT05FTlRfREVTSUdOX0ZJRUxEKSA8PCAiID4iOworCX0KKworCW9zIDw8ICIgIiA8PCBnZXROYW1lSUQoKTsKK30KKworCit2b2lkIFN5c3RlbTo6dG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJaWYoIGhhc1dPYmplY3QoKSApCisJeworCQlnZXRXT2JqZWN0KCktPnRvU3RyZWFtKG9zKTsKKwl9CisKKwlvcyA8PCBUQUIgPDwgIkBGb3JtYWxNTDwgc3lzdGVtICwgMS4wID46IiA8PCBFT0wyX0ZMVVNIOworCisJTWFjaGluZTo6dG9TdHJlYW0ob3MpOworfQorCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9TeXN0ZW0uaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9TeXN0ZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzE2YzRkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL1N5c3RlbS5oCkBAIC0wLDAgKzEsMTIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTcgZsOpdnIuIDIwMTEKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBTWVNURU1fSF8KKyNkZWZpbmUgU1lTVEVNX0hfCisKKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvTWFjaGluZS5oPgorCisjaW5jbHVkZSA8Y29sbGVjdGlvbi9CRkNvbnRhaW5lci5oPgorCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1BhY2thZ2UuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNZU1RFTSBQT0lOVEVSCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTWVNURU0gU01BUlQgUE9JTlRFUgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCisKK2NsYXNzIFN5c3RlbSA6CisJCXB1YmxpYyBNYWNoaW5lLAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIFN5c3RlbSApCit7CisKKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggU3lzdGVtICkKKworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQVRUUklCVVRFUworCSAqLworCUJGTGlzdCBtUGFja2FnZXM7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCVN5c3RlbShjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpCisJOiBNYWNoaW5lKENMQVNTX0tJTkRfVCggU3lzdGVtICksIE5VTEwsICJzcGVjOjoiICsgYU5hbWVJRCwKKwkJCWFOYW1lSUQsIGFOYW1lSUQsIFNwZWNpZmllcjo6Q09NUE9ORU5UX1NZU1RFTV9TUEVDSUZJRVIpLAorCW1QYWNrYWdlcyggKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+U3lzdGVtKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogR0VUVEVSCisJICogdGhlIG1hY2hpbmUgY29udGFpbmVyCisJICogTENbUl1BCisJICovCisJaW5saW5lIHZpcnR1YWwgTWFjaGluZSAqIGdldENvbnRhaW5lck1hY2hpbmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBoYXNDb250YWluZXIoKSA/IGdldENvbnRhaW5lcigpLT50bzwgTWFjaGluZSA+KCkgOiBOVUxMICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtUGFja2FnZXMKKwkgKi8KKwlpbmxpbmUgQkZMaXN0ICYgZ2V0UGFja2FnZXMoKQorCXsKKwkJcmV0dXJuKCBtUGFja2FnZXMgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQkZMaXN0ICYgZ2V0UGFja2FnZXMoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUGFja2FnZXMgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBhcHBlbmRQYWNrYWdlKGNvbnN0IEJGICYgYVBhY2thZ2UpCisJeworCQltUGFja2FnZXMuYXBwZW5kKCBhUGFja2FnZSApOworCX0KKworCisJLyoqCisJICogU2VyaWFsaXphdGlvbgorCSAqLworCXZvaWQgc3RySGVhZGVyKE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworCXZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCit9OworCisKK30KKworI2VuZGlmIC8qIFNZU1RFTV9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL1RyYW5zaXRpb24uY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL1RyYW5zaXRpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MjNmOTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvaW5mcmFzdHJ1Y3R1cmUvVHJhbnNpdGlvbi5jcHAKQEAgLTAsMCArMSwzNjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxOCBmw6l2ci4gMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVHJhbnNpdGlvbi5oIgorCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL01hY2hpbmUuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvUHJvcGVydHlQYXJ0Lmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorICogQ09OU1RSVUNUT1IKKyAqIERlZmF1bHQKKyAqLworLyoqCisgKiBDT05TVFJVQ1RPUgorICogRGVmYXVsdAorICovCitUcmFuc2l0aW9uOjpUcmFuc2l0aW9uKE1hY2hpbmUgKiBhQ29udGFpbmVyKQorOiBCZWhhdmlvcmFsRWxlbWVudCggQ0xBU1NfS0lORF9UKCBUcmFuc2l0aW9uICksIGFDb250YWluZXIpLAorU3BlY2lmaWVySW1wbCggKSwKKworbU1vY0tpbmQoIE1PQ19TSU1QTEVfS0lORCApLAorCittUHJpb3JpdHkoIDAgKSwKK21Qcm9iYWJpbGl0eSggMC4wICksCittVG9rZW5Db3VudCggMCApLAorCittU291cmNlKCBhQ29udGFpbmVyICksCittVGFyZ2V0KCApLAorCittRGVjbGFyYXRpb24oIE5VTEwgKSwKK21TdGF0ZW1lbnQoICkKK3sKKwkvLyEhIE5PVEhJTkcKK30KKworVHJhbnNpdGlvbjo6VHJhbnNpdGlvbihNYWNoaW5lICogYUNvbnRhaW5lciwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELCBNT0NfS0lORCBhS2luZCkKKzogQmVoYXZpb3JhbEVsZW1lbnQoIENMQVNTX0tJTkRfVCggVHJhbnNpdGlvbiApLCBhQ29udGFpbmVyLCBhTmFtZUlEKSwKK1NwZWNpZmllckltcGwoICksCisKK21Nb2NLaW5kKCBhS2luZCApLAorCittUHJpb3JpdHkoIDAgKSwKK21Qcm9iYWJpbGl0eSggMC4wICksCittVG9rZW5Db3VudCggMCApLAorCittU291cmNlKCBhQ29udGFpbmVyICksCittVGFyZ2V0KCApLAorCittRGVjbGFyYXRpb24oIE5VTEwgKSwKK21TdGF0ZW1lbnQoICkKK3sKKwkvLyEhIE5PVEhJTkcKK30KKworVHJhbnNpdGlvbjo6VHJhbnNpdGlvbihNYWNoaW5lICogYUNvbnRhaW5lciwgY29uc3QgVHJhbnNpdGlvbiAqIGFUcmFuc1BhdHRlcm4pCis6IEJlaGF2aW9yYWxFbGVtZW50KENMQVNTX0tJTkRfVCggVHJhbnNpdGlvbiApLCBhQ29udGFpbmVyLCAoKmFUcmFuc1BhdHRlcm4pKSwKKyBTcGVjaWZpZXJJbXBsKCBhVHJhbnNQYXR0ZXJuICksCisKK21Nb2NLaW5kKCBhVHJhbnNQYXR0ZXJuLT5tTW9jS2luZCApLAorCittUHJpb3JpdHkoIGFUcmFuc1BhdHRlcm4tPm1Qcmlvcml0eSApLAorbVByb2JhYmlsaXR5KCBhVHJhbnNQYXR0ZXJuLT5tUHJvYmFiaWxpdHkgKSwKK21Ub2tlbkNvdW50KCBhVHJhbnNQYXR0ZXJuLT5tVG9rZW5Db3VudCApLAorCittU291cmNlKCBhQ29udGFpbmVyICksCittVGFyZ2V0KCBhVHJhbnNQYXR0ZXJuLT5tVGFyZ2V0ICksCisKK21EZWNsYXJhdGlvbiggKGFUcmFuc1BhdHRlcm4tPm1EZWNsYXJhdGlvbiA9PSBOVUxMKSA/IE5VTEwgOgorCQluZXcgUHJvcGVydHlQYXJ0KCAqKGFUcmFuc1BhdHRlcm4tPm1EZWNsYXJhdGlvbikgKSApLAorbVN0YXRlbWVudCggYVRyYW5zUGF0dGVybi0+bVN0YXRlbWVudCApCit7CisKK30KKworCisvKioKKyAqIERFU1RSVUNUT1IKKyAqLworVHJhbnNpdGlvbjo6flRyYW5zaXRpb24oKQoreworCWRlbGV0ZSBtRGVjbGFyYXRpb247Cit9CisKKworLyoqCisgKiBHRVRURVIgLSBTRVRURVIKKyAqIG1EZWNsYXJhdGlvbgorICovCisKK2Jvb2wgVHJhbnNpdGlvbjo6aGFzRGVjbGFyYXRpb24oKSBjb25zdAoreworCXJldHVybiggKG1EZWNsYXJhdGlvbiAhPSBOVUxMKSAmJiBtRGVjbGFyYXRpb24tPm5vbmVtcHR5KCkgKTsKK30KKworCisKKy8qKgorICAqIEdFVFRFUiAtIFNFVFRFUgorICogVUZJICwgSUQKKyAqLwordm9pZCBUcmFuc2l0aW9uOjp1cGRhdGVOYW1lSUQoY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKQoreworCXNldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKAorCQkJT2JqZWN0RWxlbWVudDo6bWFrZUZ1bGx5UXVhbGlmaWVkTmFtZUlEKAorCQkJCQlnZXRDb250YWluZXIoKS0+YXM8IE1hY2hpbmUgPigpLCBhTmFtZUlEKSApOworCisJc2V0TmFtZUlEKGFOYW1lSUQpOworCisJc2V0VW5yZXN0cmljdGVkTmFtZShhTmFtZUlEKTsKK30KKworCisvKioKKyAqIEdFVFRFUiAtIFNFVFRFUgorICogbVNvdXJjZQorICovCitNYWNoaW5lICogVHJhbnNpdGlvbjo6Z2V0U291cmNlQ29udGFpbmVyKCkgY29uc3QKK3sKKwlyZXR1cm4oIG1Tb3VyY2UtPmdldENvbnRhaW5lck1hY2hpbmUoKSApOworfQorCisKKy8qKgorICogU2VyaWFsaXphdGlvbgorICovCitUcmFuc2l0aW9uOjpNT0NfS0lORCBUcmFuc2l0aW9uOjp0b01vY0tpbmQoY29uc3Qgc3RkOjpzdHJpbmcgJiBpZCkKK3sKKwlpZiggaWQgPT0gInNpbXBsZSIgICApIHJldHVybiBNT0NfU0lNUExFX0tJTkQ7CisKKwlpZiggaWQgPT0gImFib3J0IiAgICApIHJldHVybiBNT0NfQUJPUlRfS0lORDsKKworCWlmKCBpZCA9PSAiZmluYWwiICAgICkgcmV0dXJuIE1PQ19GSU5BTF9LSU5EOworCisJaWYoIGlkID09ICJlbHNlIiAgICAgKSByZXR1cm4gTU9DX0VMU0VfS0lORDsKKworCWlmKCBpZCA9PSAiaW50ZXJuYWwiICkgcmV0dXJuIE1PQ19JTlRFUk5BTF9LSU5EOworCisJaWYoIGlkID09ICJhdXRvIiAgICAgKSByZXR1cm4gTU9DX0FVVE9fS0lORDsKKworCWlmKCBpZCA9PSAiZmxvdyIgICAgICkgcmV0dXJuIE1PQ19GTE9XX0tJTkQ7CisKKwlyZXR1cm4gTU9DX1VOREVGSU5FRF9LSU5EOworfQorCisKK3N0ZDo6c3RyaW5nIFRyYW5zaXRpb246OnN0ck1vY0tpbmQoCisJCW1vY19raW5kX3QgbWFzaywgY29uc3Qgc3RkOjpzdHJpbmcgJiBTRVBBUkFUT1IpIGNvbnN0Cit7CisJbW9jX2tpbmRfdCBraW5kID0gbU1vY0tpbmQgJiBtYXNrOworCisJc3dpdGNoKCBraW5kICkKKwl7CisJCWNhc2UgTU9DX1NJTVBMRV9LSU5EICAgIDogcmV0dXJuKCAic2ltcGxlIiAgKTsKKwkJY2FzZSBNT0NfQUJPUlRfS0lORCAgICAgOiByZXR1cm4oICJhYm9ydCIgICApOworCQljYXNlIE1PQ19GSU5BTF9LSU5EICAgICA6IHJldHVybiggImZpbmFsIiAgICk7CisKKwkJY2FzZSBNT0NfRUxTRV9LSU5EICAgICAgOiByZXR1cm4oICJlbHNlIiAgICApOworCisJCWNhc2UgTU9DX0lOVEVSTkFMX0tJTkQgIDogcmV0dXJuKCAiaW50ZXJuYWwiKTsKKworCQljYXNlIE1PQ19BVVRPX0tJTkQgICAgICA6IHJldHVybiggImF1dG8iICAgICk7CisKKwkJY2FzZSBNT0NfRkxPV19LSU5EICAgICAgOiByZXR1cm4oICJmbG93IiAgICApOworCisJCWNhc2UgTU9DX1VOREVGSU5FRF9LSU5EIDogcmV0dXJuKCAidW5kZWZpbmVkPHRyYW5zaXRpb24ja2luZD4iICk7CisKKwkJZGVmYXVsdCAgICAgICAgICAgICAgICAgOgorCQl7CisJCQlzdGQ6OnN0cmluZyBzdHJLaW5kID0gIiI7CisJCQlzdGQ6OnN0cmluZyBzZXAgPSAiIjsKKworCQkJaWYoIGtpbmQgJiBNT0NfU0lNUExFX0tJTkQgKQorCQkJeworCQkJCXN0cktpbmQgPSAic2ltcGxlIjsKKwkJCQlzZXAgPSBTRVBBUkFUT1I7CisJCQl9CisJCQllbHNlIGlmKCBraW5kICYgTU9DX0FCT1JUX0tJTkQgKQorCQkJeworCQkJCXN0cktpbmQgPSAiYWJvcnQiOworCQkJCXNlcCA9IFNFUEFSQVRPUjsKKwkJCX0KKwkJCWVsc2UgaWYoIGtpbmQgJiBNT0NfRklOQUxfS0lORCApCisJCQl7CisJCQkJc3RyS2luZCA9ICJmaW5hbCI7CisJCQkJc2VwID0gU0VQQVJBVE9SOworCQkJfQorCisJCQlpZigga2luZCAmIE1PQ19FTFNFX0tJTkQgKQorCQkJeworCQkJCXN0cktpbmQgPSBzdHJLaW5kICsgc2VwICsgImVsc2UiOworCQkJfQorCisJCQlpZiggc3RyS2luZC5lbXB0eSgpICkKKwkJCXsKKwkJCQlyZXR1cm4oICJ1bmtub3duPHRyYW5zaXRpb24ja2luZD4iICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuKCBzdHJLaW5kICk7CisJCQl9CisKKwkJfQorCX0KK30KKworCit2b2lkIFRyYW5zaXRpb246OnN0ckhlYWRlcihPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlvcyA8PCBnZXRNb2RpZmllcigpLnRvU3RyaW5nKCkgPDwgInRyYW5zaXRpb24iOworCWlmKCBub3QgaXNNb2NTaW1wbGUoKSApCisJeworCQlvcyA8PCAiPCAiIDw8IHN0ck1vY0tpbmQoIH4gTU9DX1NJTVBMRV9LSU5EICk7CisJCWlmKCBtUHJpb3JpdHkgIT0gMCApCisJCXsKKwkJCW9zIDw8ICIgLCAiIDw8IG1Qcmlvcml0eTsKKwkJfQorCQlpZiggbVByb2JhYmlsaXR5ICE9IDAgKQorCQl7CisJCQlvcyA8PCAiICwgIiA8PCBtUHJvYmFiaWxpdHk7CisJCX0KKwkJb3MgPDwgIiA+IjsKKwl9CisJZWxzZSBpZiggbVByaW9yaXR5ICE9IDAgKQorCXsKKwkJb3MgPDwgIjwgIiA8PCBtUHJpb3JpdHk7CisJCWlmKCBtUHJvYmFiaWxpdHkgIT0gMCApCisJCXsKKwkJCW9zIDw8ICIgLCAiIDw8IG1Qcm9iYWJpbGl0eTsKKwkJfQorCQlvcyA8PCAiID4iOworCX0KKwllbHNlIGlmKCBtUHJvYmFiaWxpdHkgIT0gMCApCisJeworCQlvcyA8PCAiPCAiIDw8IG1Qcm9iYWJpbGl0eSA8PCAiID4iOworCX0KKworCW9zIDw8ICIgIiA8PCBnZXROYW1lSUQoKTsKKworCWlmKCBtVGFyZ2V0LnZhbGlkKCkgKQorCXsKKwkJaWYoIG1Ub2tlbkNvdW50ICE9IDAgKQorCQl7CisJCQlvcyA8PCAiKCIgPDwgbVRva2VuQ291bnQgPDwgIikiOworCQl9CisKKwkJb3MgPDwgIiA6ICIgPDwgc3RyX2hlYWRlciggZ2V0Q29udGFpbmVyKCktPmFzPCBNYWNoaW5lID4oKSApIDw8ICIgLS0+ICIKKwkJCQk8PCAobVRhcmdldC5pczwgTWFjaGluZSA+KCkgPworCQkJCQltVGFyZ2V0LnRvX3B0cjwgTWFjaGluZSA+KCktPmdldE5hbWVJRCgpIDogbVRhcmdldC5zdHIoKSk7CisJfQorfQorCisKK3ZvaWQgVHJhbnNpdGlvbjo6dG9TdHJlYW1IZWFkZXIoT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJb3MgPDwgZ2V0TW9kaWZpZXIoKS50b1N0cmluZygpCisJCQk8PCAidHJhbnNpdGlvbiAiIDw8IGdldE5hbWVJRCgpIDw8ICIgOiAiCisJCQk8PCBnZXRTb3VyY2UoKS0+Z2V0TmFtZUlEKCk7CisKKwlpZiggbVRhcmdldC5pczwgTWFjaGluZSA+KCkgfHwgbVRhcmdldC5pczwgVmFyaWFibGUgPigpICkKKwl7CisJCW9zIDw8ICIgLS0+ICIgPDwgbVRhcmdldC50b19wdHI8IE9iamVjdEVsZW1lbnQgPigpLT5nZXROYW1lSUQoKTsKKwl9CisJZWxzZSBpZiggbVRhcmdldC52YWxpZCgpICkKKwl7CisJCW9zIDw8ICIgLS0+ICIgPDwgbVRhcmdldC5zdHIoKTsKKwl9CisKKwlvcyA8PCBzdGQ6OmZsdXNoOworfQorCisKK3ZvaWQgVHJhbnNpdGlvbjo6dG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJb3MgPDwgVEFCIDw8ICJ0cmFuc2l0aW9uIjsKKwlpZiggbm90IGlzTW9jU2ltcGxlKCkgKQorCXsKKwkJb3MgPDwgIjwgIiA8PCBzdHJNb2NLaW5kKCB+IE1PQ19TSU1QTEVfS0lORCApOworCQlpZiggbVByaW9yaXR5ICE9IDAgKQorCQl7CisJCQlvcyA8PCAiICwgIiA8PCBtUHJpb3JpdHk7CisJCX0KKwkJaWYoIG1Qcm9iYWJpbGl0eSAhPSAwICkKKwkJeworCQkJb3MgPDwgIiAsICIgPDwgbVByb2JhYmlsaXR5OworCQl9CisJCW9zIDw8ICIgPiI7CisJfQorCWVsc2UgaWYoIG1Qcmlvcml0eSAhPSAwICkKKwl7CisJCW9zIDw8ICI8ICIgPDwgbVByaW9yaXR5OworCQlpZiggbVByb2JhYmlsaXR5ICE9IDAgKQorCQl7CisJCQlvcyA8PCAiICwgIiA8PCBtUHJvYmFiaWxpdHk7CisJCX0KKwkJb3MgPDwgIiA+IjsKKwl9CisJZWxzZSBpZiggbVByb2JhYmlsaXR5ICE9IDAgKQorCXsKKwkJb3MgPDwgIjwgIiA8PCBtUHJvYmFiaWxpdHkgPDwgIiA+IjsKKwl9CisKKwlpZiggbVRva2VuQ291bnQgIT0gMCApCisJeworCQlvcyA8PCAiKCIgPDwgbVRva2VuQ291bnQgPDwgIikiOworCX0KKworCW9zIDw8ICIgIiA8PCBnZXROYW1lSUQoKTsKKworCWlmKCBtVGFyZ2V0LnZhbGlkKCkgKQorCXsKKwkJb3MgPDwgIiAtLT4gIiA8PCBtVGFyZ2V0LnN0cigpOworCX0KKworCWlmKCBoYXNEZWNsYXJhdGlvbigpICkKKwl7CisJCW9zIDw8ICIgeyIgPDwgRU9MOworCisJCW1EZWNsYXJhdGlvbi0+dG9TdHJlYW0ob3MpOworCQlvcyA8PCBFT0w7CisKKwkJaWYoIG1TdGF0ZW1lbnQudmFsaWQoKSApCisJCXsKKwkJCW9zIDw8IFRBQiA8PCAibW9lOiIgPDwgRU9MOworCisJCQlvcyA8PCBUQUIyIDw8ICJAcnVueyIgPDwgSU5DUjJfSU5ERU5UOworCQkJbVN0YXRlbWVudC0+dG9TdHJlYW1Sb3V0aW5lKCBvcyApOworCQkJb3MgPDwgREVDUjJfSU5ERU5UX1RBQjIgPDwgIn0iIDw8IEVPTDsKKwkJfQorCisJCW9zIDw8IFRBQiA8PCAifSIgPDwgRU9MOworCX0KKworCWVsc2UgaWYoIG1TdGF0ZW1lbnQudmFsaWQoKSApCisJeworCQltU3RhdGVtZW50LT50b1N0cmVhbVJvdXRpbmUoIG9zIDw8ICIgeyIgPDwgSU5DUl9JTkRFTlQgKQorCQkJCTw8IERFQ1JfSU5ERU5UX1RBQiA8PCAifSI7CisJfQorCWVsc2UKKwl7CisJCW9zIDw8ICI7IjsKKwl9CisKKwlvcyA8PCBFT0wgPDwgc3RkOjpmbHVzaDsKK30KKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvaW5mcmFzdHJ1Y3R1cmUvVHJhbnNpdGlvbi5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL1RyYW5zaXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGQ5ODY4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL1RyYW5zaXRpb24uaApAQCAtMCwwICsxLDM3OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDE4IGbDqXZyLiAyMDExCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgVFJBTlNJVElPTl9IXworI2RlZmluZSBUUkFOU0lUSU9OX0hfCisKKyNpbmNsdWRlIDxmbWwvY29tbW9uL0JlaGF2aW9yYWxFbGVtZW50Lmg+CisjaW5jbHVkZSA8Zm1sL2NvbW1vbi9TcGVjaWZpZXJFbGVtZW50Lmg+CisKKyNpbmNsdWRlIDxjb21tb24vQXZtUG9pbnRlci5oPgorI2luY2x1ZGUgPGNvbW1vbi9CRi5oPgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQXZtQ29kZS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworY2xhc3MgTWFjaGluZTsKK2NsYXNzIFByb3BlcnR5UGFydDsKKworCitjbGFzcyBUcmFuc2l0aW9uIDoKKwkJcHVibGljIEJlaGF2aW9yYWxFbGVtZW50LAorCQlwdWJsaWMgU3BlY2lmaWVySW1wbCwKKwkJQVZNX0lOSkVDVF9JTlNUQU5DRV9DT1VOVEVSX0NMQVNTKCBUcmFuc2l0aW9uICkKK3sKKworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBUcmFuc2l0aW9uICkKKworCitwdWJsaWM6CisJLyoqCisJICogVFlQRURFRgorCSAqLworCXR5cGVkZWYgYXZtX3VpbnQ4X3QgICAgICAgICBtb2Nfa2luZF90OworCisJZW51bSBNT0NfS0lORAorCXsKKwkJTU9DX1VOREVGSU5FRF9LSU5EICAgICAgPSAweDAwMCwKKworCisJCU1PQ19TSU1QTEVfS0lORCAgICAgICAgID0gMHgwMDEsCisKKwkJTU9DX0FCT1JUX0tJTkQgICAgICAgICAgPSAweDAwMiwKKworCQlNT0NfRklOQUxfS0lORCAgICAgICAgICA9IDB4MDA0LAorCisKKwkJTU9DX0VMU0VfS0lORCAgICAgICAgICAgPSAweDAxMCwKKworCisJCU1PQ19JTlRFUk5BTF9LSU5EICAgICAgID0gMHgwMjAsCisKKwkJTU9DX0FVVE9fS0lORCAgICAgICAgICAgPSAweDA0MCwKKworCisJCU1PQ19GTE9XX0tJTkQgICAgICAgICAgID0gMHgwODAsCisKKwkJLy9FTFNFIENBU0UKKwkJTU9DX1NJTVBMRV9FTFNFX0tJTkQgICAgPSBNT0NfRUxTRV9LSU5EIHwgTU9DX1NJTVBMRV9LSU5ELAorCQlNT0NfQUJPUlRfRUxTRV9LSU5EICAgICA9IE1PQ19FTFNFX0tJTkQgfCBNT0NfQUJPUlRfS0lORCwKKwkJTU9DX0ZJTkFMX0VMU0VfS0lORCAgICAgPSBNT0NfRUxTRV9LSU5EIHwgTU9DX0ZJTkFMX0tJTkQsCisKKwkJTU9DX0lOVEVSTkFMX0VMU0VfS0lORCAgPSBNT0NfRUxTRV9LSU5EIHwgTU9DX0lOVEVSTkFMX0tJTkQsCisJCU1PQ19BVVRPX0VMU0VfS0lORCAgICAgID0gTU9DX0VMU0VfS0lORCB8IE1PQ19BVVRPX0tJTkQsCisJCU1PQ19GTE9XX0VMU0VfS0lORCAgICAgID0gTU9DX0VMU0VfS0lORCB8IE1PQ19GTE9XX0tJTkQsCisKKworCQlNT0NfTUFTS19BTExfS0lORCAgICAgICA9IDB4MEZGCisJfTsKKworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQVRUUklCVVRFUworCSAqLworCW1vY19raW5kX3QgbU1vY0tpbmQ7CisKKwlpbnQgICBtUHJpb3JpdHk7CisKKwlmbG9hdCBtUHJvYmFiaWxpdHk7CisKKwlpbnQgICBtVG9rZW5Db3VudDsKKworCU1hY2hpbmUgKiBtU291cmNlOworCUJGICAgICAgICBtVGFyZ2V0OworCisJUHJvcGVydHlQYXJ0ICogbURlY2xhcmF0aW9uOworCisJQkZDb2RlIG1TdGF0ZW1lbnQ7CisKKworcHVibGljOgorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJVHJhbnNpdGlvbihNYWNoaW5lICogYUNvbnRhaW5lcik7CisKKwlUcmFuc2l0aW9uKE1hY2hpbmUgKiBhQ29udGFpbmVyLCBjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsCisJCQlNT0NfS0lORCBhS2luZCA9IE1PQ19TSU1QTEVfS0lORCk7CisKKwlUcmFuc2l0aW9uKE1hY2hpbmUgKiBhQ29udGFpbmVyLCBjb25zdCBUcmFuc2l0aW9uICogYVRyYW5zaXRpb25QYXR0ZXJuKTsKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5UcmFuc2l0aW9uKCk7CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIFVGSSAsIElECisJICovCisJdm9pZCB1cGRhdGVOYW1lSUQoY29uc3Qgc3RkOjpzdHJpbmcgJiBpZCk7CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1Nb2NLaW5kCisJICovCisJaW5saW5lIG1vY19raW5kX3QgZ2V0TW9jS2luZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Nb2NLaW5kICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0TW9jS2luZChtb2Nfa2luZF90IGFNb2NLaW5kKQorCXsKKwkJbU1vY0tpbmQgPSBhTW9jS2luZDsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNNb2NTaW1wbGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtTW9jS2luZCAmIE1PQ19TSU1QTEVfS0lORCApOworCX0KKworCWlubGluZSBib29sIGlzTW9jU2ltcGxlKCkgY29uc3QKKwl7CisJCXJldHVybiggbU1vY0tpbmQgPT0gTU9DX1NJTVBMRV9LSU5EICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNNb2NTaW1wbGVPckVsc2UoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobU1vY0tpbmQgPT0gTU9DX0VMU0VfS0lORCkKKwkJCQl8fCAobU1vY0tpbmQgPT0gTU9DX1NJTVBMRV9FTFNFX0tJTkQpICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBoYXNNb2NBYm9ydCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Nb2NLaW5kICYgTU9DX0FCT1JUX0tJTkQgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc01vY0Fib3J0KCkgY29uc3QKKwl7CisJCXJldHVybiggbU1vY0tpbmQgPT0gTU9DX0FCT1JUX0tJTkQgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc01vY0Fib3J0RWxzZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Nb2NLaW5kID09IE1PQ19BQk9SVF9FTFNFX0tJTkQgKTsKKwl9CisKKworCWlubGluZSBib29sIGhhc01vY0ZpbmFsKCkgY29uc3QKKwl7CisJCXJldHVybiggbU1vY0tpbmQgJiBNT0NfRklOQUxfS0lORCApOworCX0KKworCWlubGluZSBib29sIGlzTW9jRmluYWwoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtTW9jS2luZCA9PSBNT0NfRklOQUxfS0lORCApOworCX0KKworCWlubGluZSBib29sIGlzTW9jRmluYWxFbHNlKCkgY29uc3QKKwl7CisJCXJldHVybiggbU1vY0tpbmQgPT0gTU9DX0ZJTkFMX0VMU0VfS0lORCApOworCX0KKworCisJaW5saW5lIGJvb2wgaGFzTW9jRWxzZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Nb2NLaW5kICYgTU9DX0VMU0VfS0lORCApOworCX0KKworCWlubGluZSBib29sIGlzTW9jRWxzZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Nb2NLaW5kID09IE1PQ19FTFNFX0tJTkQgKTsKKwl9CisKKworCWlubGluZSBib29sIGlzTW9jSW50ZXJuYWwoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtTW9jS2luZCA9PSBNT0NfSU5URVJOQUxfS0lORCApOworCX0KKworCWlubGluZSBib29sIGlzTW9jQXV0bygpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Nb2NLaW5kID09IE1PQ19BVVRPX0tJTkQgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc01vY0Zsb3coKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtTW9jS2luZCA9PSBNT0NfQVVUT19LSU5EICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtUHJpb3JpdHkKKwkgKi8KKwlpbmxpbmUgaW50IGdldFByaW9yaXR5KCkgY29uc3QKKwl7CisJCXJldHVybiggbVByaW9yaXR5ICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0UHJpb3JpdHkoaW50IGFQcmlvcml0eSkKKwl7CisJCW1Qcmlvcml0eSA9IGFQcmlvcml0eTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1Qcm9iYWJpbGl0eQorCSAqLworCWlubGluZSBmbG9hdCBnZXRQcm9iYWJpbGl0eSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Qcm9iYWJpbGl0eSApOworCX0KKworCWlubGluZSB2b2lkIHNldFByb2JhYmlsaXR5KGZsb2F0IGFQcm9iYWJpbGl0eSkKKwl7CisJCW1Qcm9iYWJpbGl0eSA9IGFQcm9iYWJpbGl0eTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1Ub2tlbkNvdW50CisJICovCisJaW5saW5lIGludCBnZXRUb2tlbkNvdW50KCkgY29uc3QKKwl7CisJCXJldHVybiggbVRva2VuQ291bnQgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRUb2tlbkNvdW50KGludCBhVG9rZW5Db3VudCkKKwl7CisJCW1Ub2tlbkNvdW50ID0gYVRva2VuQ291bnQ7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtU291cmNlCisJICovCisJaW5saW5lIE1hY2hpbmUgKiBnZXRTb3VyY2UoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtU291cmNlICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0U291cmNlKE1hY2hpbmUgKiBhU291cmNlKQorCXsKKwkJbVNvdXJjZSA9IGFTb3VyY2U7CisJfQorCisJTWFjaGluZSAqIGdldFNvdXJjZUNvbnRhaW5lcigpIGNvbnN0OworCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtVGFyZ2V0CisJICovCisJaW5saW5lIEJGICYgZ2V0VGFyZ2V0KCkKKwl7CisJCXJldHVybiggbVRhcmdldCApOworCX0KKworCWlubGluZSBjb25zdCBCRiAmIGdldFRhcmdldCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYXJnZXQgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNUYXJnZXQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVGFyZ2V0LnZhbGlkKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRUYXJnZXQoY29uc3QgQkYgJiBhVGFyZ2V0KQorCXsKKwkJbVRhcmdldCA9IGFUYXJnZXQ7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtRGVjbGFyYXRpb24KKwkgKi8KKwlpbmxpbmUgUHJvcGVydHlQYXJ0ICogZ2V0RGVjbGFyYXRpb24oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRGVjbGFyYXRpb24gKTsKKwl9CisKKwlib29sIGhhc0RlY2xhcmF0aW9uKCkgY29uc3Q7CisKKwlpbmxpbmUgdm9pZCBzZXREZWNsYXJhdGlvbihQcm9wZXJ0eVBhcnQgKiBhRGVjbGFyYXRpb24pCisJeworCQltRGVjbGFyYXRpb24gPSBhRGVjbGFyYXRpb247CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtU3RhdGVtZW50CisJICovCisJaW5saW5lIGNvbnN0IEJGQ29kZSAmIGdldFN0YXRlbWVudCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1TdGF0ZW1lbnQgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNTdGF0ZW1lbnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtU3RhdGVtZW50LnZhbGlkKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRTdGF0ZW1lbnQoY29uc3QgQkZDb2RlICYgYVN0YXRlbWVudCkKKwl7CisJCW1TdGF0ZW1lbnQgPSBhU3RhdGVtZW50OworCX0KKworCisJLyoqCisJICogU2VyaWFsaXphdGlvbgorCSAqLworCXN0YXRpYyBNT0NfS0lORCB0b01vY0tpbmQoY29uc3Qgc3RkOjpzdHJpbmcgJiBpZCk7CisKKwlzdGQ6OnN0cmluZyBzdHJNb2NLaW5kKAorCQkJbW9jX2tpbmRfdCBtYXNrID0gTU9DX01BU0tfQUxMX0tJTkQsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIFNFUEFSQVRPUiA9ICIlIikgY29uc3Q7CisKKworCXZpcnR1YWwgdm9pZCBzdHJIZWFkZXIoT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCisKKwlpbmxpbmUgc3RkOjpzdHJpbmcgc3RyVHJhbnNpdGlvbkhlYWRlcigpIGNvbnN0CisJeworCQlTdHJpbmdPdXRTdHJlYW0gb3NzOworCisJCXRvU3RyZWFtSGVhZGVyKCBvc3MgKTsKKworCQlyZXR1cm4oIG9zcy5zdHIoKSApOworCX0KKworCXZvaWQgdG9TdHJlYW1IZWFkZXIoT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCisKKwl2aXJ0dWFsIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCit9OworCisKK30KKworI2VuZGlmIC8qIFRSQU5TSVRJT05fSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9UcmFuc2l0aW9uTW9jLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9UcmFuc2l0aW9uTW9jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODllMmFlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL1RyYW5zaXRpb25Nb2MuY3BwCkBAIC0wLDAgKzEsMjY2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjAgc2VwdC4gMjAxMgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVHJhbnNpdGlvbk1vYy5oIgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQXZtQ29kZS5oPgorCisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1F1ZXJ5Lmg+CisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1dPYmplY3QuaD4KKworI2luY2x1ZGUgPGZtbC9vcGVyYXRvci9PcGVyYXRvci5oPgorI2luY2x1ZGUgPGZtbC9vcGVyYXRvci9PcGVyYXRvck1hbmFnZXIuaD4KKworI2luY2x1ZGUgPHByaW50ZXIvT3V0U3RyZWFtLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1PREVMIE9GIENPTVBJTEFUSU9OCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKK3Byb3RvdHlwZSBzcGVjOjpzeXN0ZW0uc3RhdGVtYWNoaW5lLm1vczR0cmFuc2l0aW9uICJtb3M0dHJhbnNpdGlvbiIgYXMgJm1ldGE6OnhsaWEubW9jLlRyYW5zaXRpb24gaXMKK3NlY3Rpb24gUFJJT1JJVFkKKwlAdXNlciA9IHw+fDsKKworCUBsY2EgPSB8Pnw7CisJQHNvdXJjZSA9IHw+fDsKKwlAdGFyZ2V0ID0gfD58OworZW5kc2VjdGlvbiBQUklPUklUWQorc2VjdGlvbiBNT0UKKwlAcnVueworCQkkeyB8O3wKKwkJCSR7IGRpc2FibGUgfQorCQkJJHsgcnVuIH0KKwkJCSR7IGVuYWJsZSB9CisJCX0KKwl9CitlbmRzZWN0aW9uIE1PRQorZW5kcHJvdG90eXBlCisqLworCisKK3ZvaWQgVHJhbnNpdGlvbk1vYzo6c2V0RmxhZ3MoV09iamVjdCAqIG1vYykKK3sKKy8vISFbTUlHUkFUSU9OXQorLy8JV09iamVjdCAqIHRoZVBSSU9SSVRZID0gUXVlcnk6OmdldFJlZ2V4V1NlcXVlbmNlKG1vYywKKy8vCQkJT1JfV0lEMigicHJpb3JpdHkiLCAiUFJJT1JJVFkiKSk7CisvLworLy8JaWYoIHRoZVBSSU9SSVRZICE9IFdPYmplY3Q6Ol9OVUxMXyApCisvLwl7CisvLwkJV09iamVjdCAqIGFXUHJvcGVydHkgPQorLy8JCQkJUXVlcnk6OmdldFdQcm9wZXJ0eSh0aGVQUklPUklUWSwgInByaW9yaXR5IiwgV09iamVjdDo6X05VTExfKTsKKy8vCQlpZiggYVdQcm9wZXJ0eSA9PSBXT2JqZWN0OjpfTlVMTF8gKQorLy8JCXsKKy8vCQkJYVdQcm9wZXJ0eSA9IFF1ZXJ5OjpnZXRXUHJvcGVydHkoCisvLwkJCQkJdGhlUFJJT1JJVFksICJ1c2VyIiwgV09iamVjdDo6X05VTExfKTsKKy8vCQl9CisvLworLy8JCS8vIERFRkFVTFQKKy8vCQl0aGVVc2VyUHJpb3JpdHlFbmFibGVkRmxhZyA9IGZhbHNlOworLy8JCWlmKCBhV1Byb3BlcnR5ICE9IFdPYmplY3Q6Ol9OVUxMXyAgKQorLy8JCXsKKy8vCQkJdGhlVXNlclByaW9yaXR5RW5hYmxlZEZsYWcgPSB0cnVlOworLy8KKy8vCQkJLy8gREVGQVVMVAorLy8JCQl0aGVVc2VyUHJpb3JpdHlNaW5GaXJzdEZsYWcgPSB0cnVlOworLy8JCQlpZiggYVdQcm9wZXJ0eS0+Z2V0VmFsdWUoKS5pczwgT3BlcmF0b3IgPigpICkKKy8vCQkJeworLy8JCQkJdGhlVXNlclByaW9yaXR5TWluRmlyc3RGbGFnID0gKCBhV1Byb3BlcnR5LT5nZXRPcGVyYXRvclZhbHVlKCkgPT0KKy8vCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9QUklPUl9MVCApOworLy8JCQl9CisvLwkJfQorLy8KKy8vCisvLwkJYVdQcm9wZXJ0eSA9IFF1ZXJ5OjpnZXRXUHJvcGVydHkodGhlUFJJT1JJVFksICJsY2EiLCBOVUxMKTsKKy8vCisvLwkJLy8gREVGQVVMVAorLy8JCXRoZUxjYUVuYWJsZWRGbGFnID0gZmFsc2U7CisvLwkJaWYoIGFXUHJvcGVydHkgIT0gTlVMTCApCisvLwkJeworLy8JCQl0aGVMY2FFbmFibGVkRmxhZyA9IHRydWU7CisvLworLy8JCQkvLyBERUZBVUxUCisvLwkJCXRoZUxjYU1pbkZpcnN0RmxhZyA9IHRydWU7CisvLwkJCWlmKCBhV1Byb3BlcnR5LT5nZXRWYWx1ZSgpLmlzPCBPcGVyYXRvciA+KCkgKQorLy8JCQl7CisvLwkJCQl0aGVMY2FNaW5GaXJzdEZsYWcgPSAoIGFXUHJvcGVydHktPmdldE9wZXJhdG9yVmFsdWUoKSA9PQorLy8JCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1BSSU9SX0xUICk7CisvLwkJCX0KKy8vCQl9CisvLworLy8KKy8vCQlhV1Byb3BlcnR5ID0gUXVlcnk6OmdldFdQcm9wZXJ0eSggdGhlUFJJT1JJVFksICJzb3VyY2UiLCBOVUxMKTsKKy8vCisvLwkJLy8gREVGQVVMVAorLy8JCXRoZVNvdXJjZUVuYWJsZWRGbGFnID0gZmFsc2U7CisvLwkJaWYoIGFXUHJvcGVydHkgIT0gTlVMTCApCisvLwkJeworLy8JCQl0aGVTb3VyY2VFbmFibGVkRmxhZyA9IHRydWU7CisvLworLy8JCQkvLyBERUZBVUxUCisvLwkJCXRoZVNvdXJjZU1pbkZpcnN0RmxhZyA9IHRydWU7CisvLwkJCWlmKCBhV1Byb3BlcnR5LT5nZXRWYWx1ZSgpLmlzPCBPcGVyYXRvciA+KCkgKQorLy8JCQl7CisvLwkJCQl0aGVTb3VyY2VNaW5GaXJzdEZsYWcgPSAoIGFXUHJvcGVydHktPmdldE9wZXJhdG9yVmFsdWUoKSA9PQorLy8JCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1BSSU9SX0xUICk7CisvLwkJCX0KKy8vCQl9CisvLworLy8KKy8vCQlhV1Byb3BlcnR5ID0gUXVlcnk6OmdldFdQcm9wZXJ0eSh0aGVQUklPUklUWSwgInRhcmdldCIsIE5VTEwpOworLy8KKy8vCQkvLyBERUZBVUxUCisvLwkJdGhlVGFyZ2V0RW5hYmxlZEZsYWcgPSBmYWxzZTsKKy8vCQlpZiggYVdQcm9wZXJ0eSAhPSBOVUxMICkKKy8vCQl7CisvLwkJCXRoZVRhcmdldEVuYWJsZWRGbGFnID0gdHJ1ZTsKKy8vCisvLwkJCS8vIERFRkFVTFQKKy8vCQkJdGhlVGFyZ2V0TWluRmlyc3RGbGFnID0gdHJ1ZTsKKy8vCQkJaWYoIGFXUHJvcGVydHktPmdldFZhbHVlKCkuaXM8IE9wZXJhdG9yID4oKSApCisvLwkJCXsKKy8vCQkJCXRoZVRhcmdldE1pbkZpcnN0RmxhZyA9ICggYVdQcm9wZXJ0eS0+Z2V0T3BlcmF0b3JWYWx1ZSgpID09CisvLwkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfUFJJT1JfTFQgKTsKKy8vCQkJfQorLy8JCX0KKy8vCisvLworLy8JCVdPYmplY3QgKiB0aGVNT0UgPSBRdWVyeTo6Z2V0UmVnZXhXU2VxdWVuY2UobW9jLCBPUl9XSUQyKCJtb2UiLCAiTU9FIikpOworLy8KKy8vCQlpZiggdGhlTU9FICE9IFdPYmplY3Q6Ol9OVUxMXyApCisvLwkJeworLy8JCQkvLyBERUZBVUxUCisvLwkJCXRoZU1vZVJ1biA9IE1PRV9EUkVfUlVOOworLy8KKy8vCQkJY29uc3QgQkZDb2RlICYgbW9lUnVuID0gUXVlcnk6OmdldFdQcm9wZXJ0eUF2bUNvZGUodGhlTU9FLCAicnVuIik7CisvLwkJCWlmKCBtb2VSdW4udmFsaWQoKSAmJiAobW9lUnVuLT5zaXplKCkgPT0gMykgKQorLy8JCQl7CisvLwkJCQlpZiggKG1vZVJ1bi0+Zmlyc3QoKS5pczwgT3BlcmF0b3IgPigpICYmIG1vZVJ1bi0+Zmlyc3QoKS4KKy8vCQkJCQkJdG9fcHRyPCBPcGVyYXRvciA+KCktPmlzT3BDb2RlKCBBVk1fT1BDT0RFX1JVTiApKSB8fAorLy8JCQkJCShtb2VSdW4tPmZpcnN0KCkuaXM8IEF2bUNvZGUgPigpICYmIG1vZVJ1bi0+Zmlyc3QoKS4KKy8vCQkJCQkJCXRvX3B0cjwgQXZtQ29kZSA+KCktPmlzT3BDb2RlKCBBVk1fT1BDT0RFX1JVTiApKSApCisvLwkJCQl7CisvLwkJCQkJdGhlTW9lUnVuID0gTU9FX1JERV9SVU47CisvLwkJCQl9CisvLwkJCQlpZiggKG1vZVJ1bi0+c2Vjb25kKCkuaXM8IE9wZXJhdG9yID4oKSAmJiBtb2VSdW4tPnNlY29uZCgpLgorLy8JCQkJCQl0b19wdHI8IE9wZXJhdG9yID4oKS0+aXNPcENvZGUoIEFWTV9PUENPREVfUlVOICkpIHx8CisvLwkJCQkJKG1vZVJ1bi0+c2Vjb25kKCkuaXM8IEF2bUNvZGUgPigpICYmIG1vZVJ1bi0+c2Vjb25kKCkuCisvLwkJCQkJCQl0b19wdHI8IEF2bUNvZGUgPigpLT5pc09wQ29kZSggQVZNX09QQ09ERV9SVU4gKSkgKQorLy8JCQkJeworLy8JCQkJCXRoZU1vZVJ1biA9IE1PRV9EUkVfUlVOOworLy8JCQkJfQorLy8JCQkJaWYoIChtb2VSdW4tPnRoaXJkKCkuaXM8IE9wZXJhdG9yID4oKSAmJiBtb2VSdW4tPnRoaXJkKCkuCisvLwkJCQkJCXRvX3B0cjwgT3BlcmF0b3IgPigpLT5pc09wQ29kZSggQVZNX09QQ09ERV9SVU4gKSkgfHwKKy8vCQkJCQkobW9lUnVuLT50aGlyZCgpLmlzPCBBdm1Db2RlID4oKSAmJiBtb2VSdW4tPnRoaXJkKCkuCisvLwkJCQkJCQl0b19wdHI8IEF2bUNvZGUgPigpLT5pc09wQ29kZSggQVZNX09QQ09ERV9SVU4gKSkgKQorLy8JCQkJeworLy8JCQkJCXRoZU1vZVJ1biA9IE1PRV9ERVJfUlVOOworLy8JCQkJfQorLy8JCQl9CisvLwkJfQorLy8JCWVsc2UKKy8vCQl7CisvLwkJCXRoZU1vZVJ1biA9IE1PRV9VTkRFRklORURfUlVOOworLy8JCX0KKy8vCX0KK30KKworLyoqCisgKiBTZXJpYWxpemF0aW9uCisgKi8KK3ZvaWQgVHJhbnNpdGlvbk1vYzo6dG9TdHJlYW0oT3V0U3RyZWFtICYgb3V0KSBjb25zdAoreworCW91dCA8PCBUQUIgPDwgInRyYW5zaXRpb24geyIgPDwgRU9MOworCisJaWYoIHRoZVVzZXJQcmlvcml0eUVuYWJsZWRGbGFnIHx8IHRoZUxjYUVuYWJsZWRGbGFnCisJCXx8IHRoZVNvdXJjZUVuYWJsZWRGbGFnICAgIHx8IHRoZVRhcmdldEVuYWJsZWRGbGFnICkKKwl7CisJCW91dCA8PCBUQUIyIDw8ICJwcmlvcml0eToiIDw8IEVPTDsKKwl9CisKKwkvLyBVc2VyIHNwZWNpZmljIHByaW9yaXR5IG51bWJlcgorCWlmKCB0aGVVc2VyUHJpb3JpdHlFbmFibGVkRmxhZyApCisJeworCQlvdXQgPDwgVEFCMyA8PCAidXNlciA9ICIKKwkJCTw8ICgodGhlVXNlclByaW9yaXR5TWluRmlyc3RGbGFnKT8gInw8fCIgOiAifD58IikgPDwgIjsiIDw8IEVPTDsKKwl9CisKKwkvLyBJbXBsaWNpdCBmb3JtYWxpc20gcHJpb3JpdHkKKwlpZiggdGhlTGNhRW5hYmxlZEZsYWcgKQorCXsKKwkJb3V0IDw8IFRBQjMgPDwgImxjYSA9ICIKKwkJCTw8ICgodGhlTGNhTWluRmlyc3RGbGFnKT8gInw8fCIgOiAifD58IikgPDwgIjsiIDw8IEVPTDsKKwl9CisJaWYoIHRoZVNvdXJjZUVuYWJsZWRGbGFnICkKKwl7CisJCW91dCA8PCBUQUIzIDw8ICJzb3VyY2UgPSAiCisJCQk8PCAoKHRoZVNvdXJjZU1pbkZpcnN0RmxhZyk/ICJ8PHwiIDogInw+fCIpIDw8ICI7IiA8PCBFT0w7CisJfQorCWlmKCB0aGVUYXJnZXRFbmFibGVkRmxhZyApCisJeworCQlvdXQgPDwgVEFCMyA8PCAidGFyZ2V0ID0gIgorCQkJPDwgKCh0aGVUYXJnZXRNaW5GaXJzdEZsYWcpPyAifDx8IiA6ICJ8PnwiKSA8PCAiOyIgPDwgRU9MOworCX0KKworCWlmKCB0aGVNb2VSdW4gIT0gTU9FX1VOREVGSU5FRF9SVU4gKQorCXsKKwkJb3V0IDw8IFRBQjIgPDwgIm1vZToiIDw8IEVPTAorCQkJPDwgVEFCMyA8PCAiQHJ1biB7ICIgPDwgRU9MOworCisJCXN3aXRjaCggdGhlTW9lUnVuICkKKwkJeworCQkJY2FzZSBNT0VfUkRFX1JVTjoKKwkJCXsKKwkJCQlvdXQgPDwgIiR7IHJ1biB9ICR7IGRpc2FibGUgfSAkeyBlbmFibGUgfSI7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNhc2UgTU9FX0RSRV9SVU46CisJCQl7CisJCQkJb3V0IDw8ICIkeyBkaXNhYmxlIH0gJHsgcnVuIH0gJHsgZW5hYmxlIH0iOworCQkJCWJyZWFrOworCQkJfQorCisJCQljYXNlIE1PRV9ERVJfUlVOOgorCQkJeworCQkJCW91dCA8PCAiJHsgZGlzYWJsZSB9ICR7IGVuYWJsZSB9ICR7IHJ1biB9IjsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJY2FzZSBNT0VfVU5ERUZJTkVEX1JVTjoKKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJLy8hISEgTk9USElORworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJb3V0IDw8ICIgfSIgPDwgRU9MOworCisJfQorCisJb3V0IDw8IFRBQiA8PCAifSIgPDwgRU9MX0ZMVVNIOworfQorCisKKworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL1RyYW5zaXRpb25Nb2MuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9UcmFuc2l0aW9uTW9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMxMmMwNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9UcmFuc2l0aW9uTW9jLmgKQEAgLTAsMCArMSwzMjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyMCBzZXB0LiAyMDEyCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgVFJBTlNJVElPTk1PQ19IXworI2RlZmluZSBUUkFOU0lUSU9OTU9DX0hfCisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIFdPYmplY3Q7CisKK2NsYXNzIE91dFN0cmVhbTsKKworCitjbGFzcyBUcmFuc2l0aW9uTW9jCit7CisKK3B1YmxpYzoKKwllbnVtIE1PRV9SVU5fTU9DCisJeworCQkvLyBSVU4gRElTQUJMRSBFTkFCTEUKKwkJTU9FX1VOREVGSU5FRF9SVU4sCisKKwkJTU9FX1JERV9SVU4sCisJCU1PRV9EUkVfUlVOLAorCQlNT0VfREVSX1JVTiwKKwl9OworCisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlUcmFuc2l0aW9uTW9jKCkKKwk6IHRoZU1vZVJ1biggTU9FX1VOREVGSU5FRF9SVU4gKSwKKworCXRoZVVzZXJQcmlvcml0eUVuYWJsZWRGbGFnKCBmYWxzZSApLAorCXRoZVVzZXJQcmlvcml0eU1pbkZpcnN0RmxhZyggdHJ1ZSApLAorCisJdGhlTGNhRW5hYmxlZEZsYWcoIGZhbHNlICksCisJdGhlTGNhTWluRmlyc3RGbGFnKCBmYWxzZSApLAorCisJdGhlU291cmNlRW5hYmxlZEZsYWcoIGZhbHNlICksCisJdGhlU291cmNlTWluRmlyc3RGbGFnKCBmYWxzZSApLAorCisJdGhlVGFyZ2V0RW5hYmxlZEZsYWcoIGZhbHNlICksCisJdGhlVGFyZ2V0TWluRmlyc3RGbGFnKCBmYWxzZSApCisJeworCQkvLyEhISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIE90aGVycworCSAqLworCVRyYW5zaXRpb25Nb2MoTU9FX1JVTl9NT0MgbW9lUnVuKQorCTogdGhlTW9lUnVuKCBtb2VSdW4gKSwKKworCXRoZVVzZXJQcmlvcml0eUVuYWJsZWRGbGFnKCBmYWxzZSApLAorCXRoZVVzZXJQcmlvcml0eU1pbkZpcnN0RmxhZyggdHJ1ZSApLAorCisJdGhlTGNhRW5hYmxlZEZsYWcoIGZhbHNlICksCisJdGhlTGNhTWluRmlyc3RGbGFnKCBmYWxzZSApLAorCisJdGhlU291cmNlRW5hYmxlZEZsYWcoIGZhbHNlICksCisJdGhlU291cmNlTWluRmlyc3RGbGFnKCBmYWxzZSApLAorCisJdGhlVGFyZ2V0RW5hYmxlZEZsYWcoIGZhbHNlICksCisJdGhlVGFyZ2V0TWluRmlyc3RGbGFnKCBmYWxzZSApCisJeworCQkvLyEhISBOT1RISU5HCisJfQorCisJVHJhbnNpdGlvbk1vYyhNT0VfUlVOX01PQyBtb2VSdW4sIGJvb2wgdXNlcikKKwk6IHRoZU1vZVJ1biggbW9lUnVuICksCisKKwl0aGVVc2VyUHJpb3JpdHlFbmFibGVkRmxhZyggdHJ1ZSApLAorCXRoZVVzZXJQcmlvcml0eU1pbkZpcnN0RmxhZyggdXNlciApLAorCisJdGhlTGNhRW5hYmxlZEZsYWcoIGZhbHNlICksCisJdGhlTGNhTWluRmlyc3RGbGFnKCBmYWxzZSApLAorCisJdGhlU291cmNlRW5hYmxlZEZsYWcoIGZhbHNlICksCisJdGhlU291cmNlTWluRmlyc3RGbGFnKCBmYWxzZSApLAorCisJdGhlVGFyZ2V0RW5hYmxlZEZsYWcoIGZhbHNlICksCisJdGhlVGFyZ2V0TWluRmlyc3RGbGFnKCBmYWxzZSApCisJeworCQkvLyEhISBOT1RISU5HCisJfQorCisJVHJhbnNpdGlvbk1vYyhNT0VfUlVOX01PQyBtb2VSdW4sIGJvb2wgdXNlciwgYm9vbCBsY2EpCisJOiB0aGVNb2VSdW4oIG1vZVJ1biApLAorCisJdGhlVXNlclByaW9yaXR5RW5hYmxlZEZsYWcoIHRydWUgKSwKKwl0aGVVc2VyUHJpb3JpdHlNaW5GaXJzdEZsYWcoIHVzZXIgKSwKKworCXRoZUxjYUVuYWJsZWRGbGFnKCB0cnVlICksCisJdGhlTGNhTWluRmlyc3RGbGFnKCBsY2EgKSwKKworCXRoZVNvdXJjZUVuYWJsZWRGbGFnKCBmYWxzZSApLAorCXRoZVNvdXJjZU1pbkZpcnN0RmxhZyggZmFsc2UgKSwKKworCXRoZVRhcmdldEVuYWJsZWRGbGFnKCBmYWxzZSApLAorCXRoZVRhcmdldE1pbkZpcnN0RmxhZyggZmFsc2UgKQorCXsKKwkJLy8hISEgTk9USElORworCX0KKworCVRyYW5zaXRpb25Nb2MoTU9FX1JVTl9NT0MgbW9lUnVuLCBib29sIHVzZXIsIGJvb2wgbGNhLCBib29sIHNvdXJjZSkKKwk6IHRoZU1vZVJ1biggbW9lUnVuICksCisKKwl0aGVVc2VyUHJpb3JpdHlFbmFibGVkRmxhZyggdHJ1ZSApLAorCXRoZVVzZXJQcmlvcml0eU1pbkZpcnN0RmxhZyggdXNlciApLAorCisJdGhlTGNhRW5hYmxlZEZsYWcoIHRydWUgKSwKKwl0aGVMY2FNaW5GaXJzdEZsYWcoIGxjYSApLAorCisJdGhlU291cmNlRW5hYmxlZEZsYWcoIHRydWUgKSwKKwl0aGVTb3VyY2VNaW5GaXJzdEZsYWcoIHNvdXJjZSApLAorCisJdGhlVGFyZ2V0RW5hYmxlZEZsYWcoIGZhbHNlICksCisJdGhlVGFyZ2V0TWluRmlyc3RGbGFnKCBmYWxzZSApCisJeworCQkvLyEhISBOT1RISU5HCisJfQorCisJVHJhbnNpdGlvbk1vYyhNT0VfUlVOX01PQyBtb2VSdW4sIGJvb2wgdXNlciwgYm9vbCBsY2EsIGJvb2wgc291cmNlLCBib29sIHRhcmdldCkKKwk6IHRoZU1vZVJ1biggbW9lUnVuICksCisKKwl0aGVVc2VyUHJpb3JpdHlFbmFibGVkRmxhZyggdHJ1ZSApLAorCXRoZVVzZXJQcmlvcml0eU1pbkZpcnN0RmxhZyggdXNlciApLAorCisJdGhlTGNhRW5hYmxlZEZsYWcoIHRydWUgKSwKKwl0aGVMY2FNaW5GaXJzdEZsYWcoIGxjYSApLAorCisJdGhlU291cmNlRW5hYmxlZEZsYWcoIHRydWUgKSwKKwl0aGVTb3VyY2VNaW5GaXJzdEZsYWcoIHNvdXJjZSApLAorCisJdGhlVGFyZ2V0RW5hYmxlZEZsYWcoIHRydWUgKSwKKwl0aGVUYXJnZXRNaW5GaXJzdEZsYWcoIHRhcmdldCApCisJeworCQkvLyEhISBOT1RISU5HCisJfQorCisKKwlUcmFuc2l0aW9uTW9jKFdPYmplY3QgKiBtb2MpCisJeworCQlzZXRGbGFncyhtb2MpOworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgflRyYW5zaXRpb25Nb2MoKQorCXsKKwkJLy8hISEgTk9USElORworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogU2V0IGFsbCBmbGFncyB1c2luZyBvbGQgRlNQIGZvcm0KKwkgKi8KKwl2b2lkIHNldEZsYWdzKFdPYmplY3QgKiBtb2MpOworCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiB0aGVNb2VSdW4KKwkgKi8KKwlpbmxpbmUgTU9FX1JVTl9NT0MgZ2V0TW9lUnVuKCkgY29uc3QKKwl7CisJCXJldHVybiggdGhlTW9lUnVuICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0TW9lUnVuKE1PRV9SVU5fTU9DIGFNb2NLaW5kKQorCXsKKwkJdGhlTW9lUnVuID0gYU1vY0tpbmQ7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiB0aGVVc2VyUHJpb3JpdHlFbmFibGVkRmxhZworCSAqIHRoZVVzZXJQcmlvcml0eU1pbkZpcnN0RmxhZworCSAqLworCWlubGluZSBib29sIGlzVXNlclByaW9yaXR5RW5hYmxlZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHRoZVVzZXJQcmlvcml0eUVuYWJsZWRGbGFnICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNVc2VyUHJpb3JpdHlNaW5GaXJzdCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHRoZVVzZXJQcmlvcml0eU1pbkZpcnN0RmxhZyApOworCX0KKworCWlubGluZSB2b2lkIHNldFVzZXJQcmlvcml0eU1pbkZpcnN0KGJvb2wgbWluRmlyc3QpCisJeworCQl0aGVVc2VyUHJpb3JpdHlFbmFibGVkRmxhZyA9IHRydWU7CisJCXRoZVVzZXJQcmlvcml0eU1pbkZpcnN0RmxhZyA9IG1pbkZpcnN0OworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogdGhlTGNhRW5hYmxlZEZsYWcKKwkgKiB0aGVMY2FNaW5GaXJzdEZsYWcKKwkgKi8KKwlpbmxpbmUgYm9vbCBpc0xjYUVuYWJsZWQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCB0aGVMY2FFbmFibGVkRmxhZyApOworCX0KKworCWlubGluZSBib29sIGlzTGNhTWluRmlyc3QoKSBjb25zdAorCXsKKwkJcmV0dXJuKCB0aGVMY2FNaW5GaXJzdEZsYWcgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRMY2FNaW5GaXJzdChib29sIG1pbkZpcnN0KQorCXsKKwkJdGhlTGNhRW5hYmxlZEZsYWcgPSB0cnVlOworCQl0aGVMY2FNaW5GaXJzdEZsYWcgPSBtaW5GaXJzdDsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIHRoZVNvdXJjZUVuYWJsZWRGbGFnCisJICogdGhlU291cmNlTWluRmlyc3RGbGFnCisJICovCisJaW5saW5lIGJvb2wgaXNTb3VyY2VFbmFibGVkKCkgY29uc3QKKwl7CisJCXJldHVybiggdGhlU291cmNlRW5hYmxlZEZsYWcgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc1NvdXJjZU1pbkZpcnN0KCkgY29uc3QKKwl7CisJCXJldHVybiggdGhlU291cmNlTWluRmlyc3RGbGFnICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0U291cmNlTWluRmlyc3QoYm9vbCBtaW5GaXJzdCkKKwl7CisJCXRoZVNvdXJjZUVuYWJsZWRGbGFnID0gdHJ1ZTsKKwkJdGhlU291cmNlTWluRmlyc3RGbGFnID0gbWluRmlyc3Q7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiB0aGVUYXJnZXRFbmFibGVkRmxhZworCSAqIHRoZVRhcmdldE1pbkZpcnN0RmxhZworCSAqLworCWlubGluZSBib29sIGlzVGFyZ2V0RW5hYmxlZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHRoZVRhcmdldEVuYWJsZWRGbGFnICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNUYXJnZXRNaW5GaXJzdCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHRoZVRhcmdldE1pbkZpcnN0RmxhZyApOworCX0KKworCWlubGluZSB2b2lkIHNldFRhcmdldE1pbkZpcnN0KGJvb2wgbWluRmlyc3QpCisJeworCQl0aGVUYXJnZXRFbmFibGVkRmxhZyA9IHRydWU7CisJCXRoZVRhcmdldE1pbkZpcnN0RmxhZyA9IG1pbkZpcnN0OworCX0KKworCisJLyoqCisJICogU2VyaWFsaXphdGlvbgorCSAqLworCXZpcnR1YWwgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvdXQpIGNvbnN0OworCisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBBVFRSSUJVVEUKKwkgKi8KKworCS8vIFRSQU5TSVRJT04gQUNUSVZJVFkgU0NIRURVTEVSCisJTU9FX1JVTl9NT0MgdGhlTW9lUnVuOworCisKKwkvLyBNVUxUSSBUUkFOU0lUSU9OIFNDSEVEVUxJTkcKKwkvLyBVc2VyIHNwZWNpZmljIHByaW9yaXR5IG51bWJlcgorCWJvb2wgdGhlVXNlclByaW9yaXR5RW5hYmxlZEZsYWc7CisJYm9vbCB0aGVVc2VyUHJpb3JpdHlNaW5GaXJzdEZsYWc7CisKKwkvLyBJbXBsaWNpdCBmb3JtYWxpc20gcHJpb3JpdHkKKwlib29sIHRoZUxjYUVuYWJsZWRGbGFnOworCWJvb2wgdGhlTGNhTWluRmlyc3RGbGFnOworCisJYm9vbCB0aGVTb3VyY2VFbmFibGVkRmxhZzsKKwlib29sIHRoZVNvdXJjZU1pbkZpcnN0RmxhZzsKKworCWJvb2wgdGhlVGFyZ2V0RW5hYmxlZEZsYWc7CisJYm9vbCB0aGVUYXJnZXRNaW5GaXJzdEZsYWc7CisKKworfTsKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisjZW5kaWYgLyogVFJBTlNJVElPTk1PQ19IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2luZnJhc3RydWN0dXJlL1ZhcmlhYmxlLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9WYXJpYWJsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVlZmU1MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9WYXJpYWJsZS5jcHAKQEAgLTAsMCArMSwxOTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxNyBmw6l2ci4gMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVmFyaWFibGUuaCIKKworI2luY2x1ZGUgPGZtbC90eXBlL0Jhc2VUeXBlU3BlY2lmaWVyLmg+CisKKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvRGF0YVR5cGUuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvTWFjaGluZS5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Qcm9wZXJ0eVBhcnQuaD4KKworI2luY2x1ZGUgPGZtbC9vcGVyYXRvci9PcGVyYXRvck1hbmFnZXIuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKy8qKgorICogQ09OU1RSVUNUT1IKKyAqIERlZmF1bHQKKyAqLworVmFyaWFibGU6OlZhcmlhYmxlKGNvbnN0IFByb3BlcnR5UGFydCAmIGFQcm9wZXJ0eVBhcnQsCisJCWNvbnN0IE1vZGlmaWVyICYgYU1vZGlmaWVyLCBjb25zdCBCRiAmIGFUeXBlLAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsIGNvbnN0IEJGICYgYVZhbHVlKQorOiBQcm9wZXJ0eUVsZW1lbnQoIENMQVNTX0tJTkRfVCggVmFyaWFibGUgKSwKKwkJYVByb3BlcnR5UGFydC5nZXRDb250YWluZXIoKSwgYU1vZGlmaWVyLCBhTmFtZUlEICksCittVHlwZSggYVR5cGUgKSwKK21WYWx1ZSggYVZhbHVlICksCisKK21CaW5kaW5nKCApLAorCitvbldyaXRlUm91dGluZSggTlVMTCApCit7CisJLy8hISBOT1RISU5HCit9CisKKworVmFyaWFibGU6OlZhcmlhYmxlKE1hY2hpbmUgKiBhQ29udGFpbmVyLCBjb25zdCBNb2RpZmllciAmIGFNb2RpZmllciwKKwkJY29uc3QgVmFyaWFibGUgKiBhVmFyaWFibGVQYXR0ZXJuLCBjb25zdCBCRiAmIGFQYXJhbSkKKzogUHJvcGVydHlFbGVtZW50KCBDTEFTU19LSU5EX1QoIFZhcmlhYmxlICkgLAorCQlhQ29udGFpbmVyICwgYU1vZGlmaWVyICwgKCphVmFyaWFibGVQYXR0ZXJuKSApLAorbVR5cGUoIGFWYXJpYWJsZVBhdHRlcm4tPmdldFR5cGUoKSApLAorbVZhbHVlKCBhUGFyYW0gKSwKKworbUJpbmRpbmcoIGFWYXJpYWJsZVBhdHRlcm4tPm1CaW5kaW5nICApLAorCitvbldyaXRlUm91dGluZSggYVZhcmlhYmxlUGF0dGVybi0+b25Xcml0ZVJvdXRpbmUgKQoreworCXNldE1vZGlmaWVyKCBhVmFyaWFibGVQYXR0ZXJuLT5nZXRNb2RpZmllcigpICk7Cit9CisKKworLyoqCisgKiBzdHIgVHlwZQorICovCitzdGQ6OnN0cmluZyBWYXJpYWJsZTo6c3RyVCgpCit7CisJaWYoIGdldFR5cGUoKS5pczwgQmFzZVR5cGVTcGVjaWZpZXIgPigpICkKKwl7CisJCXJldHVybiggZ2V0VHlwZSgpLnRvX3B0cjwgQmFzZVR5cGVTcGVjaWZpZXIgPigpLT5zdHJUKCkgKTsKKwl9CisJZWxzZSBpZiggZ2V0VHlwZSgpLmlzPCBEYXRhVHlwZSA+KCkgKQorCXsKKwkJcmV0dXJuKCBnZXRUeXBlKCkudG9fcHRyPCBEYXRhVHlwZSA+KCktPnN0clQoKSApOworCX0KKwlpZiggZ2V0VHlwZSgpLmlzPCBPYmplY3RFbGVtZW50ID4oKSApCisJeworCQlyZXR1cm4oIGdldFR5cGUoKS50b19wdHI8IE9iamVjdEVsZW1lbnQgPigpLT5nZXROYW1lSUQoKSApOworCX0KKwllbHNlCisJeworCQlyZXR1cm4oIGdldFR5cGUoKS5zdHIoKSApOworCX0KK30KKworCisvKioKKyAqIFVUSUwKKyAqLworT3BlcmF0b3IgKiBWYXJpYWJsZTo6Z2V0QXNzaWduT3BlcmF0b3IoKSBjb25zdAoreworCWlmKCBnZXRNb2RpZmllcigpLmhhc05hdHVyZU1hY3JvKCkgKQorCXsKKwkJcmV0dXJuKCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FTU0lHTl9NQUNSTyApOworCX0KKwllbHNlIGlmKCBnZXRNb2RpZmllcigpLmhhc05hdHVyZVJlZmVyZW5jZSgpICkKKwl7CisJCXJldHVybiggT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BU1NJR05fUkVGICk7CisJfQorCisJcmV0dXJuKCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FTU0lHTiApOworfQorCisKKy8qKgorICogR0VUVEVSCisgKiBCZWhhdmlvcmFsUGFydCBSb3V0aW5lIENvbnRhaW5lcgorICovCitCZWhhdmlvcmFsUGFydCAqIFZhcmlhYmxlOjpnZXRDb250YWluZXJPZlJvdXRpbmVzKCkgY29uc3QKK3sKKwljb25zdCBPYmplY3RFbGVtZW50ICogY29udGFpbmVyID0gdGhpcy0+Z2V0Q29udGFpbmVyKCk7CisJZm9yKCA7IGNvbnRhaW5lciAhPSBOVUxMIDsgY29udGFpbmVyID0gY29udGFpbmVyLT5nZXRDb250YWluZXIoKSApCisJeworCQlpZiggY29udGFpbmVyLT5pczwgTWFjaGluZSA+KCkgKQorCQl7CisJCQlyZXR1cm4oIGNvbnRhaW5lci0+dG88IE1hY2hpbmUgPigpLT5nZXRCZWhhdmlvclBhcnQoKSApOworCQl9CisJCWVsc2UgaWYoIGNvbnRhaW5lci0+aXM8IERhdGFUeXBlID4oKSApCisJCXsKKwkJCXJldHVybiggY29udGFpbmVyLT50bzwgRGF0YVR5cGUgPigpLT5nZXRCZWhhdmlvclBhcnQoKSApOworCQl9CisJfQorCisJcmV0dXJuKCBOVUxMICk7Cit9CisKK0JlaGF2aW9yYWxQYXJ0ICogVmFyaWFibGU6OmdldFVuaXFDb250YWluZXJPZlJvdXRpbmVzKCkgY29uc3QKK3sKKwlPYmplY3RFbGVtZW50ICogY29udGFpbmVyID0gdGhpcy0+Z2V0Q29udGFpbmVyKCk7CisJZm9yKCA7IGNvbnRhaW5lciAhPSBOVUxMIDsgY29udGFpbmVyID0gY29udGFpbmVyLT5nZXRDb250YWluZXIoKSApCisJeworCQlpZiggY29udGFpbmVyLT5pczwgTWFjaGluZSA+KCkgKQorCQl7CisJCQlyZXR1cm4oIGNvbnRhaW5lci0+dG88IE1hY2hpbmUgPigpLT5nZXRVbmlxQmVoYXZpb3JQYXJ0KCkgKTsKKwkJfQorCQllbHNlIGlmKCBjb250YWluZXItPmlzPCBEYXRhVHlwZSA+KCkgKQorCQl7CisJCQlyZXR1cm4oIGNvbnRhaW5lci0+dG88IERhdGFUeXBlID4oKS0+Z2V0VW5pcUJlaGF2aW9yUGFydCgpICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIE5VTEwgKTsKK30KKworCisvKioKKyAqIFNlcmlhbGl6YXRpb24KKyAqLwordm9pZCBWYXJpYWJsZTo6dG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJb3MgPDwgVEFCIDw8IGdldE1vZGlmaWVyKCkudG9TdHJpbmdfbm90KCBNb2RpZmllcjo6RkVBVFVSRV9DT05TVF9LSU5EICkKKwkJCTw8ICggZ2V0TW9kaWZpZXIoKS5oYXNGZWF0dXJlQ29uc3QoKSA/ICJjb25zdCIgLyoidmFsIiovIDogInZhciIgKQorCQkJPDwgIiAiIDw8IHN0clR5cGVTcGVjaWZpZXIoKSA8PCAiICIgPDwgZ2V0TmFtZUlEKCk7CisKKwlpZiggbVZhbHVlLnZhbGlkKCkgKQorCXsKKy8vCQlvcyA8PCAiICIgPDwgZ2V0QXNzaWduT3BlcmF0b3IoKS0+c3RyKCkgPDwgIiAiIDw8IG1WYWx1ZS5zdHIoKTsKKwkJb3MgPDwgIiA9ICIgPDwgbVZhbHVlLnN0cigpOworCX0KKworCWlmKCBvbldyaXRlUm91dGluZSAhPSBOVUxMICkKKwl7CisJCW9zIDw8ICIgeyAiIDw8IEVPTF9JTkNSX0lOREVOVDsKKworCQlvbldyaXRlUm91dGluZS0+dG9TdHJlYW0ob3MpOworCisJCW9zIDw8IERFQ1JfSU5ERU5UX1RBQiA8PCAifSI7CisJfQorCWVsc2UKKwl7CisJCW9zIDw8ICI7IjsKKwl9CisKKwlvcyA8PCBFT0wgPDwgc3RkOjpmbHVzaDsKK30KKworCit2b2lkIFZhcmlhYmxlOjp0b1N0cmVhbVBhcmFtZXRlcihPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlvcyA8PCBUQUIgPDwgZ2V0TW9kaWZpZXIoKS50b1N0cmluZygpCisJCQk8PCBzdHJUeXBlU3BlY2lmaWVyKCkgPDwgIiAiIDw8IGdldE5hbWVJRCgpOworCisJaWYoIG1WYWx1ZS52YWxpZCgpICkKKwl7CisJCW9zIDw8ICIgPSAiIDw8IG1WYWx1ZS5zdHIoKTsKKwl9CisKKwlvcyA8PCBFT0xfRkxVU0g7Cit9CisKKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvaW5mcmFzdHJ1Y3R1cmUvVmFyaWFibGUuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9pbmZyYXN0cnVjdHVyZS9WYXJpYWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNDVlODcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvaW5mcmFzdHJ1Y3R1cmUvVmFyaWFibGUuaApAQCAtMCwwICsxLDM0NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuDQorICoNCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ3JlYXRlZCBvbjogMTcgZsOpdnIuIDIwMTENCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcg0KKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpZm5kZWYgVkFSSUFCTEVfSF8NCisjZGVmaW5lIFZBUklBQkxFX0hfDQorDQorI2luY2x1ZGUgPGZtbC9jb21tb24vUHJvcGVydHlFbGVtZW50Lmg+DQorDQorI2luY2x1ZGUgPGNvbW1vbi9CRi5oPg0KKw0KKyNpbmNsdWRlIDxjb2xsZWN0aW9uL0JGQ29udGFpbmVyLmg+DQorDQorI2luY2x1ZGUgPGZtbC90eXBlL0Jhc2VUeXBlU3BlY2lmaWVyLmg+DQorDQorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9EYXRhVHlwZS5oPg0KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvUm91dGluZS5oPg0KKw0KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mRGF0YS5oPg0KKw0KKw0KK25hbWVzcGFjZSBzZXANCit7DQorDQorY2xhc3MgQmVoYXZpb3JhbFBhcnQ7DQorDQorY2xhc3MgTWFjaGluZTsNCisNCitjbGFzcyBPYmplY3RFbGVtZW50Ow0KK2NsYXNzIE9wZXJhdG9yOw0KKw0KK2NsYXNzIFByb3BlcnR5UGFydDsNCisNCisNCitjbGFzcyBWYXJpYWJsZSA6IHB1YmxpYyBQcm9wZXJ0eUVsZW1lbnQgLA0KKwkJQVZNX0lOSkVDVF9JTlNUQU5DRV9DT1VOVEVSX0NMQVNTKCBWYXJpYWJsZSApDQorew0KKw0KKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggVmFyaWFibGUgKQ0KKw0KKw0KK3Byb3RlY3RlZDoNCisJLyoqDQorCSAqIEFUVFJJQlVURVMNCisJICovDQorCUJGIG1UeXBlOw0KKw0KKwlCRiBtVmFsdWU7DQorDQorCUJGIG1CaW5kaW5nOw0KKw0KKwlSb3V0aW5lICogb25Xcml0ZVJvdXRpbmU7DQorDQorDQorcHVibGljOg0KKwkvKioNCisJICogQ09OU1RSVUNUT1INCisJICogRGVmYXVsdA0KKwkgKi8NCisJVmFyaWFibGUoT2JqZWN0RWxlbWVudCAqIGFDb250YWluZXIsIGNvbnN0IEJGICYgYVR5cGUsDQorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlELA0KKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwgY29uc3QgQkYgJiBhVmFsdWUgPSBCRjo6UkVGX05VTEwpDQorCTogUHJvcGVydHlFbGVtZW50KCBDTEFTU19LSU5EX1QoIFZhcmlhYmxlICksDQorCQkJYUNvbnRhaW5lciAsIGFRdWFsaWZpZWROYW1lSUQgLCBhTmFtZUlEICwgYU5hbWVJRCApLA0KKwltVHlwZSggYVR5cGUgKSwNCisJbVZhbHVlKCApLA0KKw0KKwltQmluZGluZyggKSwNCisNCisJb25Xcml0ZVJvdXRpbmUoIE5VTEwgKQ0KKwl7DQorCQkvLyEhIE5PVEhJTkcNCisJfQ0KKw0KKwlWYXJpYWJsZShPYmplY3RFbGVtZW50ICogYUNvbnRhaW5lciwNCisJCQljb25zdCBNb2RpZmllciAmIGFNb2RpZmllciwgY29uc3QgQkYgJiBhVHlwZSwNCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsIGNvbnN0IEJGICYgYVZhbHVlID0gQkY6OlJFRl9OVUxMKQ0KKwk6IFByb3BlcnR5RWxlbWVudChDTEFTU19LSU5EX1QoIFZhcmlhYmxlICksIGFDb250YWluZXIsIGFNb2RpZmllciwgYU5hbWVJRCksDQorCW1UeXBlKCBhVHlwZSApLA0KKwltVmFsdWUoIGFWYWx1ZSApLA0KKw0KKwltQmluZGluZyggKSwNCisNCisJb25Xcml0ZVJvdXRpbmUoIE5VTEwgKQ0KKwl7DQorCQkvLyEhIE5PVEhJTkcNCisJfQ0KKw0KKwlWYXJpYWJsZShjb25zdCBQcm9wZXJ0eVBhcnQgJiBhUHJvcGVydHlQYXJ0LA0KKwkJCWNvbnN0IE1vZGlmaWVyICYgYU1vZGlmaWVyLCBjb25zdCBCRiAmIGFUeXBlLA0KKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwgY29uc3QgQkYgJiBhVmFsdWUgPSBCRjo6UkVGX05VTEwpOw0KKw0KKwlWYXJpYWJsZShNYWNoaW5lICogYUNvbnRhaW5lciwgY29uc3QgTW9kaWZpZXIgJiBhTW9kaWZpZXIsDQorCQkJY29uc3QgVmFyaWFibGUgKiBhVmFyaWFibGVQYXR0ZXJuLCBjb25zdCBCRiAmIGFQYXJhbSk7DQorDQorDQorCS8qKg0KKwkgKiBERVNUUlVDVE9SDQorCSAqLw0KKwl2aXJ0dWFsIH5WYXJpYWJsZSgpDQorCXsNCisJCS8vISEgTk9USElORw0KKwl9DQorDQorDQorCS8qKg0KKwkgKiBHRVRURVINCisJICogUXVhbGlmaWVkIE5hbWUgSURlbnRpZmllcg0KKwkgKiBRdWFsaWZpZWROYW1lSUQgdXNpbmcgbUZ1bGx5UXVhbGlmaWVkTmFtZUlEICYgbU5hbWVJRA0KKwkgKi8NCisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZUlEKCkgY29uc3QNCisJew0KK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0sIERBVEEgKQ0KKw0KKwkJcmV0dXJuKCBnZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpICk7DQorDQorQVZNX0VMU0UNCisNCisJCXJldHVybiggUHJvcGVydHlFbGVtZW50OjpnZXRRdWFsaWZpZWROYW1lSUQoKSApOw0KKw0KK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0sIERBVEEgKQ0KKwl9DQorDQorDQorCS8qKg0KKwkgKiBVVElMDQorCSAqLw0KKwlPcGVyYXRvciAqIGdldEFzc2lnbk9wZXJhdG9yKCkgY29uc3Q7DQorDQorDQorCS8qKg0KKwkgKiBHRVRURVIgLSBTRVRURVINCisJICogdGhlIFR5cGUgU3BlY2lmaWVyDQorCSAqLw0KKwlpbmxpbmUgY29uc3QgQkYgJiBnZXRUeXBlKCkgY29uc3QNCisJew0KKwkJcmV0dXJuKCBtVHlwZSApOw0KKwl9DQorDQorCWlubGluZSBib29sIGhhc1R5cGUoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIG1UeXBlLnZhbGlkKCkgKTsNCisJfQ0KKw0KKwlzdGQ6OnN0cmluZyBzdHJUKCk7DQorDQorDQorCWlubGluZSBEYXRhVHlwZSAqIGdldERhdGFUeXBlKCkgY29uc3QNCisJew0KKwkJcmV0dXJuKCBnZXRUeXBlKCkuYXNfcHRyPCBEYXRhVHlwZSA+KCkgKTsNCisJfQ0KKw0KKwlpbmxpbmUgYm9vbCBoYXNEYXRhVHlwZSgpDQorCXsNCisJCXJldHVybiggZ2V0VHlwZSgpLmlzPCBEYXRhVHlwZSA+KCkgKTsNCisJfQ0KKw0KKw0KKwlpbmxpbmUgQmFzZVR5cGVTcGVjaWZpZXIgKiBnZXRUeXBlU3BlY2lmaWVyKCkgY29uc3QNCisJew0KKwkJcmV0dXJuKCBnZXRUeXBlKCkuYXNfcHRyPCBCYXNlVHlwZVNwZWNpZmllciA+KCkgKTsNCisJfQ0KKw0KKwlpbmxpbmUgYm9vbCBoYXNUeXBlU3BlY2lmaWVyKCkNCisJew0KKwkJcmV0dXJuKCBnZXRUeXBlKCkuaXM8IEJhc2VUeXBlU3BlY2lmaWVyID4oKSApOw0KKwl9DQorDQorDQorCWlubGluZSBzdGQ6OnN0cmluZyBzdHJUeXBlU3BlY2lmaWVyKCkgY29uc3QNCisJew0KKwkJcmV0dXJuKCBEYXRhVHlwZTo6c3RyVHlwZVNwZWNpZmllciggZ2V0VHlwZSgpICkgKTsNCisJfQ0KKw0KKw0KKwkvKioNCisJICogR0VUVEVSIC0gU0VUVEVSDQorCSAqIG1WYWx1ZQ0KKwkgKi8NCisJaW5saW5lIEJGICYgZ2V0VmFsdWUoKQ0KKwl7DQorCQlyZXR1cm4oIG1WYWx1ZSApOw0KKwl9DQorDQorCWlubGluZSBjb25zdCBCRiAmIGdldFZhbHVlKCkgY29uc3QNCisJew0KKwkJcmV0dXJuKCBtVmFsdWUgKTsNCisJfQ0KKw0KKwlpbmxpbmUgYm9vbCBoYXNWYWx1ZSgpIGNvbnN0DQorCXsNCisJCXJldHVybiggbVZhbHVlLnZhbGlkKCkgKTsNCisJfQ0KKw0KKwlpbmxpbmUgdm9pZCBzZXRWYWx1ZShjb25zdCBCRiAmIGFWYWx1ZSkNCisJew0KKwkJbVZhbHVlID0gYVZhbHVlOw0KKwl9DQorDQorCWlubGluZSBzdGQ6OnN0cmluZyBzdHJWYWx1ZSgpIGNvbnN0DQorCXsNCisJCXJldHVybiggbVZhbHVlLnN0cigpICk7DQorCX0NCisNCisJaW5saW5lIHN0ZDo6c3RyaW5nIHByZXR0eVByaW50YWJsZVZhbHVlKCkgY29uc3QNCisJew0KKwkJcmV0dXJuKCBtVmFsdWUuaXM8IE9iamVjdEVsZW1lbnQgPigpDQorCQkJCT8gbVZhbHVlLnRvX3B0cjwgT2JqZWN0RWxlbWVudCA+KCktPmdldE5hbWVJRCgpDQorCQkJCTogbVZhbHVlLnN0cigpICk7DQorCX0NCisNCisNCisJLyoqDQorCSAqIEdFVFRFUiAtIFNFVFRFUg0KKwkgKiBtQmluZGluZw0KKwkgKi8NCisJaW5saW5lIEJGICYgZ2V0QmluZGluZygpDQorCXsNCisJCXJldHVybiggbUJpbmRpbmcgKTsNCisJfQ0KKw0KKwlpbmxpbmUgY29uc3QgQkYgJiBnZXRCaW5kaW5nKCkgY29uc3QNCisJew0KKwkJcmV0dXJuKCBtQmluZGluZyApOw0KKwl9DQorDQorCWlubGluZSBib29sIGhhc0JpbmRpbmcoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIG1CaW5kaW5nLnZhbGlkKCkgKTsNCisJfQ0KKw0KKwlpbmxpbmUgdm9pZCBzZXRCaW5kaW5nKGNvbnN0IEJGICYgYUJpbmRpbmcpDQorCXsNCisJCW1CaW5kaW5nID0gYUJpbmRpbmc7DQorCX0NCisNCisNCisJLyoqDQorCSAqIEdFVFRFUg0KKwkgKiBCZWhhdmlvcmFsUGFydCBSb3V0aW5lIENvbnRhaW5lcg0KKwkgKi8NCisJQmVoYXZpb3JhbFBhcnQgKiBnZXRDb250YWluZXJPZlJvdXRpbmVzKCkgY29uc3Q7DQorDQorCUJlaGF2aW9yYWxQYXJ0ICogZ2V0VW5pcUNvbnRhaW5lck9mUm91dGluZXMoKSBjb25zdDsNCisNCisJLyoqDQorCSAqIEdFVFRFUiAtIFNFVFRFUg0KKwkgKiBvbldyaXRlDQorCSAqLw0KKwlpbmxpbmUgUm91dGluZSAqIGdldE9uV3JpdGVSb3V0aW5lKCkgY29uc3QNCisJew0KKwkJcmV0dXJuKCBvbldyaXRlUm91dGluZSApOw0KKwl9DQorDQorCWlubGluZSBib29sIGhhc09uV3JpdGUoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIG9uV3JpdGVSb3V0aW5lICE9IE5VTEwgKTsNCisJfQ0KKw0KKwlpbmxpbmUgdm9pZCBzZXRPbldyaXRlUm91dGluZShSb3V0aW5lICogYVdyaXRlUm91dGluZSkNCisJew0KKwkJb25Xcml0ZVJvdXRpbmUgPSBhV3JpdGVSb3V0aW5lOw0KKwl9DQorDQorDQorCS8qKg0KKwkgKiBTZXJpYWxpemF0aW9uDQorCSAqLw0KKwl2b2lkIHN0clBhcmFtZXRlcihPdXRTdHJlYW0gJiBvcykgY29uc3QNCisJew0KKwkJb3MgPDwgZ2V0TW9kaWZpZXIoKS50b1N0cmluZ19ub3QoTW9kaWZpZXI6Ok5BVFVSRV9QQVJBTUVURVJfS0lORCkgLy88PCAidmFyICINCisJCQkJPDwgc3RyVHlwZVNwZWNpZmllcigpIDw8ICIgIiA8PCBnZXROYW1lSUQoKTsNCisNCisJCWlmKCBnZXRNb2RpZmllcigpLmhhc05hdHVyZU1hY3JvKCkgJiYgaGFzQmluZGluZygpICkNCisJCXsNCisJCQlvcyA8PCAiICg6Oj0gIiA8PCBnZXRCaW5kaW5nKCkuc3RyKCkgPDwgIikiOw0KKwkJfQ0KKwkJaWYoIGhhc1ZhbHVlKCkgKQ0KKwkJew0KKwkJCW9zIDw8ICIgPSAiIDw8IHN0clZhbHVlKCk7DQorCQl9DQorCX0NCisNCisJdm9pZCBzdHJSZXR1cm4oT3V0U3RyZWFtICYgb3MpIGNvbnN0DQorCXsNCisJCW9zIDw8IGdldE1vZGlmaWVyKCkudG9TdHJpbmdfbm90KE1vZGlmaWVyOjpESVJFQ1RJT05fUkVUVVJOX0tJTkQpIC8vPDwgInZhciAiDQorCQkJCTw8IHN0clR5cGVTcGVjaWZpZXIoKSA8PCAiICIgPDwgZ2V0TmFtZUlEKCk7DQorDQorCQlpZiggZ2V0TW9kaWZpZXIoKS5oYXNOYXR1cmVNYWNybygpICYmIGhhc0JpbmRpbmcoKSApDQorCQl7DQorCQkJb3MgPDwgIiAoOjo9ICIgPDwgZ2V0QmluZGluZygpLnN0cigpIDw8ICIpIjsNCisJCX0NCisJCWlmKCBoYXNWYWx1ZSgpICkNCisJCXsNCisJCQlvcyA8PCAiID0gIiA8PCBzdHJWYWx1ZSgpOw0KKwkJfQ0KKwl9DQorDQorDQorCXZvaWQgc3RySGVhZGVyKE91dFN0cmVhbSAmIG9zKSBjb25zdA0KKwl7DQorCQlvcyA8PCBnZXRNb2RpZmllcigpLnRvU3RyaW5nKCkgPDwgInZhciAiDQorCQkJPDwgc3RyVHlwZVNwZWNpZmllcigpIDw8ICIgIiA8PCBnZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOw0KKw0KKwkJaWYoIGhhc0JpbmRpbmcoKSApDQorCQl7DQorCQkJb3MgPDwgIiAkYmluZCAiIDw8IGdldEJpbmRpbmcoKS5zdHIoKTsNCisJCX0NCisNCitBVk1fSUZfREVCVUdfRkxBRzJfQU5EKCBDT01QSUxJTkcgLCBRVUFMSUZJRURfTkFNRV9JRCAsIGhhc1ZhbHVlKCkgKQ0KKwlvcyA8PCAiID0gIiA8PCBzdHJWYWx1ZSgpOw0KK0FWTV9FTkRJRl9ERUJVR19GTEFHMl9BTkQoIENPTVBJTElORyAsIFFVQUxJRklFRF9OQU1FX0lEICkNCisJfQ0KKw0KKwl2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdDsNCisNCisJdm9pZCB0b1N0cmVhbVBhcmFtZXRlcihPdXRTdHJlYW0gJiBvcykgY29uc3Q7DQorDQorfTsNCisNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gVFlQRSBERUZJTklUSU9OIGZvciBTTUFSVCBQT0lOVEVSIGFuZCBDT05UQUlORVINCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQordHlwZWRlZiBUYWJsZU9mQkZfVDwgVmFyaWFibGUgPiAgVGFibGVPZlZhcmlhYmxlOw0KKw0KKw0KK30NCisNCisjZW5kaWYgLyogVkFSSUFCTEVfSF8gKi8NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbGliL0F2bUFuYWx5c2lzLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9saWIvQXZtQW5hbHlzaXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzOTliMjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbGliL0F2bUFuYWx5c2lzLmNwcApAQCAtMCwwICsxLDQxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjUganVpbC4gMjAxMworICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQXZtQW5hbHlzaXMuaCIKKworbmFtZXNwYWNlIHNlcAoreworCisKK3N0ZDo6c3RyaW5nICBTVEFUSUNfQU5BTFlTSVM6OnRvX3N0cmluZygKKwkJU1RBVElDX0FOQUxZU0lTOjpWQVJJQUJMRV9ERVBFTkRFTkNZX1JJTkcgc3RhdHVzKQoreworCXN3aXRjaCAoIHN0YXR1cyApCisJeworCQljYXNlIERFUEVOREVOVCAgICAgICAgICAgIDogcmV0dXJuKCAiZGVwZW5kZW50IiApOworCisJCWNhc2UgSU5ERVBFTkRFTlQgICAgICAgICAgOiByZXR1cm4oICJpbmRlcGVuZGVudCIgKTsKKworCisJCWNhc2UgVU5ERUZJTkVEX0RFUEVOREVOQ1kgOiByZXR1cm4oICJ1bmRlZmluZWQ8ZGVwZW5kZW5jeT4iICk7CisKKwkJY2FzZSBVTktOT1dOX0RFUEVOREVOQ1kgICA6CisJCWRlZmF1bHQgICAgICAgICAgICAgICAgICAgOiByZXR1cm4oICJ1bmtub3duPGRlcGVuZGVuY3k+IiApOworCX0KK30KKworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2xpYi9Bdm1BbmFseXNpcy5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2xpYi9Bdm1BbmFseXNpcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MTYyNmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbGliL0F2bUFuYWx5c2lzLmgKQEAgLTAsMCArMSw1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDI1IGp1aWwuIDIwMTMKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBBVk1BTkFMWVNJU19IXworI2RlZmluZSBBVk1BTkFMWVNJU19IXworCisjaW5jbHVkZSA8c3RyaW5nPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjbGFzcyBTVEFUSUNfQU5BTFlTSVMKK3sKKworcHVibGljOgorCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBWQVJJQUJMRV9ERVBFTkRFTkNZCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWVudW0gVkFSSUFCTEVfREVQRU5ERU5DWV9SSU5HIHsKKwkJVU5ERUZJTkVEX0RFUEVOREVOQ1ksCisKKwkJREVQRU5ERU5ULAorCisJCUlOREVQRU5ERU5ULAorCisJCVVOS05PV05fREVQRU5ERU5DWQorCX07CisKKwlzdGF0aWMgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKFZBUklBQkxFX0RFUEVOREVOQ1lfUklORyBzdGF0dXMpOworCisKK307CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisjZW5kaWYgLyogQVZNQU5BTFlTSVNfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9saWIvQXZtTGFuZy5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbGliL0F2bUxhbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNWNhYmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbGliL0F2bUxhbmcuY3BwCkBAIC0wLDAgKzEsMTQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMiBhdnIuIDIwMTIKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkF2bUxhbmcuaCIKKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25Db25zdHJ1Y3Rvci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gR0VORVJJQyBYTElBIFNZTlRBWAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQkYgWExJQV9TWU5UQVg6OklEX0FMTCA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3SWRlbnRpZmllciggIlsqXSIgKTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTE9BREVSIC8gRElTUE9TRVIgIEFQSQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBYTElBX1NZTlRBWDo6bG9hZCgpCit7CisJLy8hISBOT1RISU5HCit9CisKKwordm9pZCBYTElBX1NZTlRBWDo6ZGlzcG9zZSgpCit7CisJSURfQUxMLmRlc3Ryb3koKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVkFSSUFCTEUgREFUQQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCisgKiBDT01NVU5JQ0FUSU9OIFBST1RPQ09MIEtJTkQgVE8gU1RSSU5HCisgKi8KKworI2RlZmluZSBQUklOVF9QT0lOVEVSX05BVFVSRSggT0JKICkgICBcCisJY2FzZSBJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfIyNPQkojI19OQVRVUkUgOiAgXAorCQkJcmV0dXJuKCBRVU9URU1FKCBQT0lOVEVSXyMjT0JKICkgKQorCitzdGQ6OnN0cmluZyBJUG9pbnRlckRhdGFOYXR1cmU6OnN0clBvaW50ZXJEYXRhTmF0dXJlKAorCQlJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfREFUQV9OQVRVUkUgYU5hdHVyZSkKK3sKKwlzd2l0Y2ggKCBhTmF0dXJlICkKKwl7CisJCVBSSU5UX1BPSU5URVJfTkFUVVJFKCBTVEFOREFSRCApOworCisJCVBSSU5UX1BPSU5URVJfTkFUVVJFKCBGSUVMRF9BUlJBWV9JTkRFWCApOworCQlQUklOVF9QT0lOVEVSX05BVFVSRSggRklFTERfQVJSQVlfT0ZGU0VUICk7CisJCVBSSU5UX1BPSU5URVJfTkFUVVJFKCBGSUVMRF9DTEFTU19BVFRSSUJVVEUgKTsKKwkJUFJJTlRfUE9JTlRFUl9OQVRVUkUoIEZJRUxEX1VOSU9OX0FUVFJJQlVURSApOworCisJCVBSSU5UX1BPSU5URVJfTkFUVVJFKCBFTlVNX1NZTUJPTCApOworCisJCVBSSU5UX1BPSU5URVJfTkFUVVJFKCBVRklfT0ZGU0VUICk7CisJCVBSSU5UX1BPSU5URVJfTkFUVVJFKCBVRklfTUlYRUQgKTsKKworCQlQUklOVF9QT0lOVEVSX05BVFVSRSggVUZJX1JVTlRJTUUgKTsKKworCQlQUklOVF9QT0lOVEVSX05BVFVSRSggVU5ERUZJTkVEICk7CisKKwkJZGVmYXVsdCA6ICByZXR1cm4oICJQT0lOVEVSX1VOS05PV05fTkFUVVJFIiApOworCX0KK30KKworc3RkOjpzdHJpbmcgSVBvaW50ZXJEYXRhTmF0dXJlOjpzdHJQb2ludGVyKGNvbnN0IFBPSU5URVJfREFUQV9OQVRVUkUgYU5hdHVyZSkKK3sKKwlzd2l0Y2ggKCBhTmF0dXJlICkKKwl7CisJCWNhc2UgSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX1NUQU5EQVJEX05BVFVSRToKKwkJeworCQkJcmV0dXJuKCAic3RkIiApOworCQl9CisKKwkJY2FzZSBJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfRklFTERfQVJSQVlfSU5ERVhfTkFUVVJFOgorCQl7CisJCQlyZXR1cm4oICJpbmRleCNzeW1iZXgiICk7CisJCX0KKwkJY2FzZSBJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfRklFTERfQVJSQVlfT0ZGU0VUX05BVFVSRToKKwkJeworCQkJcmV0dXJuKCAiaW5kZXgjb2Zmc2V0IiApOworCQl9CisJCWNhc2UgSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX0ZJRUxEX0NMQVNTX0FUVFJJQlVURV9OQVRVUkU6CisJCXsKKwkJCXJldHVybiggImF0dHIiICk7CisJCX0KKwkJY2FzZSBJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfRklFTERfQ0hPSUNFX0FUVFJJQlVURV9OQVRVUkU6CisJCXsKKwkJCXJldHVybiggImNob2ljZSIgKTsKKwkJfQorCQljYXNlIElQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9GSUVMRF9VTklPTl9BVFRSSUJVVEVfTkFUVVJFOgorCQl7CisJCQlyZXR1cm4oICJ1bmlvbiIgKTsKKwkJfQorCQljYXNlIElQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9FTlVNX1NZTUJPTF9OQVRVUkU6CisJCXsKKwkJCXJldHVybiggImVudW0iICk7CisJCX0KKworCQljYXNlIElQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9VRklfT0ZGU0VUX05BVFVSRToKKwkJeworCQkJcmV0dXJuKCAidWZpIiApOworCQl9CisJCWNhc2UgSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX1VGSV9NSVhFRF9OQVRVUkU6CisJCXsKKwkJCXJldHVybiggIm1peCIgKTsKKwkJfQorCisJCWNhc2UgSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX1VGSV9SVU5USU1FX05BVFVSRToKKwkJeworCQkJcmV0dXJuKCAicnVudGltZSIgKTsKKwkJfQorCisJCWNhc2UgSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX1VOREVGSU5FRF9OQVRVUkU6CisJCXsKKwkJCXJldHVybiggInVuZGVmIiApOworCQl9CisKKwkJZGVmYXVsdCA6CisJCXsKKwkJCXJldHVybiggc3RyUG9pbnRlckRhdGFOYXR1cmUoYU5hdHVyZSkgKTsKKwkJfQorCX0KK30KKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9saWIvQXZtTGFuZy5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2xpYi9Bdm1MYW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZmZTM5ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9saWIvQXZtTGFuZy5oCkBAIC0wLDAgKzEsMTk0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMiBhdnIuIDIwMTIKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBBVk1MQU5HX0hfCisjZGVmaW5lIEFWTUxBTkdfSF8KKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPHV0aWwvYXZtX251bWVyaWMuaD4KKyNpbmNsdWRlIDxjb21tb24vQkYuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEdFTkVSSUMgWExJQSBTWU5UQVgKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NsYXNzIFhMSUFfU1lOVEFYCit7CisKK3B1YmxpYzoKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gTE9BREVSIC8gRElTUE9TRVIgIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwlzdGF0aWMgdm9pZCBsb2FkKCk7CisJc3RhdGljIHZvaWQgZGlzcG9zZSgpOworCitwdWJsaWM6CisJc3RhdGljIEJGIElEX0FMTDsKK307CisKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBFWFBSRVNTSU9OIElNUExFTUVOVEFUSU9OIEtJTkQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NsYXNzIEVYUFJFU1NJT04KK3sKKworcHVibGljOgorCisJZW51bSBJTVBMRU1FTlRBVElPTl9LSU5ECisJeworCQlOQVRJVkVfSU1QTCwKKworCQlHSU5BQ19JTVBMLAorCisJCUNWQzRfSU1QTCwKKworCQlVTkRFRklORURfSU1QTAorCX07CisKK307CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVkFSSUFCTEUgREFUQQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY2xhc3MgSVBvaW50ZXJEYXRhTmF0dXJlCit7CisKK3B1YmxpYzoKKworCWVudW0gUE9JTlRFUl9EQVRBX05BVFVSRQorCXsKKwkJUE9JTlRFUl9TVEFOREFSRF9OQVRVUkUsCisKKwkJUE9JTlRFUl9VRklfT0ZGU0VUX05BVFVSRSwKKworCQlQT0lOVEVSX1VGSV9NSVhFRF9OQVRVUkUsCisKKwkJUE9JTlRFUl9VRklfUlVOVElNRV9OQVRVUkUsCisKKwkJUE9JTlRFUl9FTlVNX1NZTUJPTF9OQVRVUkUsCisKKwkJUE9JTlRFUl9GSUVMRF9BUlJBWV9JTkRFWF9OQVRVUkUsCisJCVBPSU5URVJfRklFTERfQVJSQVlfT0ZGU0VUX05BVFVSRSwKKworCQlQT0lOVEVSX0ZJRUxEX0NMQVNTX0FUVFJJQlVURV9OQVRVUkUsCisKKwkJUE9JTlRFUl9GSUVMRF9DSE9JQ0VfQVRUUklCVVRFX05BVFVSRSwKKworCQlQT0lOVEVSX0ZJRUxEX1VOSU9OX0FUVFJJQlVURV9OQVRVUkUsCisKKwkJUE9JTlRFUl9VTkRFRklORURfTkFUVVJFCisJfTsKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5JUG9pbnRlckRhdGFOYXR1cmUoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogU1RBVElDCisJICovCisJc3RhdGljIHN0ZDo6c3RyaW5nIHN0clBvaW50ZXJEYXRhTmF0dXJlKFBPSU5URVJfREFUQV9OQVRVUkUgYU5hdHVyZSk7CisKKwlzdGF0aWMgc3RkOjpzdHJpbmcgc3RyUG9pbnRlcihjb25zdCBQT0lOVEVSX0RBVEFfTkFUVVJFIGFOYXR1cmUpOworCisKKwkvKioKKwkgKiBBUEkKKwkgKi8KKwl2aXJ0dWFsIFBPSU5URVJfREFUQV9OQVRVUkUgZ2V0UG9pbnRlck5hdHVyZSgpIGNvbnN0ID0gMDsKKworCisJaW5saW5lIGJvb2wgaGFzQXJyYXlJbmRleFBvaW50ZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAoZ2V0UG9pbnRlck5hdHVyZSgpID09IFBPSU5URVJfRklFTERfQVJSQVlfSU5ERVhfTkFUVVJFKSB8fAorCQkJCShnZXRQb2ludGVyTmF0dXJlKCkgPT0gUE9JTlRFUl9VRklfTUlYRURfTkFUVVJFKSApOworCX0KKworCWlubGluZSBib29sIGlzRmllbGRBcnJheUluZGV4UG9pbnRlcigpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldFBvaW50ZXJOYXR1cmUoKSA9PSBQT0lOVEVSX0ZJRUxEX0FSUkFZX0lOREVYX05BVFVSRSApOworCX0KKworCWlubGluZSBib29sIGlzRmllbGRBcnJheU9mZnNldFBvaW50ZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRQb2ludGVyTmF0dXJlKCkgPT0gUE9JTlRFUl9GSUVMRF9BUlJBWV9PRkZTRVRfTkFUVVJFICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBpc0ZpZWxkQ2xhc3NBdHRyaWJ1dGVQb2ludGVyKCkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0UG9pbnRlck5hdHVyZSgpID09IFBPSU5URVJfRklFTERfQ0xBU1NfQVRUUklCVVRFX05BVFVSRSApOworCX0KKworCWlubGluZSBib29sIGlzRmllbGRDaG9pY2VBdHRyaWJ1dGVQb2ludGVyKCkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0UG9pbnRlck5hdHVyZSgpID09IFBPSU5URVJfRklFTERfQ0hPSUNFX0FUVFJJQlVURV9OQVRVUkUgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc0ZpZWxkVW5pb25BdHRyaWJ1dGVQb2ludGVyKCkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0UG9pbnRlck5hdHVyZSgpID09IFBPSU5URVJfRklFTERfVU5JT05fQVRUUklCVVRFX05BVFVSRSApOworCX0KKworCisJaW5saW5lIGJvb2wgaXNFbnVtU3ltYm9sUG9pbnRlcigpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldFBvaW50ZXJOYXR1cmUoKSA9PSBQT0lOVEVSX0VOVU1fU1lNQk9MX05BVFVSRSApOworCX0KKworCisJaW5saW5lIGJvb2wgaXNVZmlPZmZzZXRQb2ludGVyKCkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0UG9pbnRlck5hdHVyZSgpID09IFBPSU5URVJfVUZJX09GRlNFVF9OQVRVUkUgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc1VmaU1peGVkUG9pbnRlcigpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldFBvaW50ZXJOYXR1cmUoKSA9PSBQT0lOVEVSX1VGSV9NSVhFRF9OQVRVUkUgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc1VmaVJ1bnRpbWVQb2ludGVyKCkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0UG9pbnRlck5hdHVyZSgpID09IFBPSU5URVJfVUZJX1JVTlRJTUVfTkFUVVJFICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNTdGFuZGFyZFBvaW50ZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRQb2ludGVyTmF0dXJlKCkgPT0gUE9JTlRFUl9TVEFOREFSRF9OQVRVUkUgKTsKKwl9CisKKworfTsKKworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworI2VuZGlmIC8qIEFWTUxBTkdfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9saWIvQXZtT3BlcmF0aW9uRXhwcmVzc2lvbi5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbGliL0F2bU9wZXJhdGlvbkV4cHJlc3Npb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZDdkYzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbGliL0F2bU9wZXJhdGlvbkV4cHJlc3Npb24uY3BwCkBAIC0wLDAgKzEsODQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyNyBub3YuIDIwMTIKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkF2bU9wZXJhdGlvbkV4cHJlc3Npb24uaCIKKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0Jhc2VJbnN0YW5jZUZvcm0uaD4KKworI2luY2x1ZGUgPGZtbC9vcGVyYXRvci9PcGVyYXRvck1hbmFnZXIuaD4KKworI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9WYXJpYWJsZS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitzdGQ6Om1hcDwgc3RkOjpzdHJpbmcgLCBPcGVyYXRvciAqID4gQXZtT3BlcmF0aW9uRXhwcmVzc2lvbjo6dGhlT3RoZXJNYXA7CisKKworCisKKy8qKgorICogTE9BREVSCisgKi8KK3ZvaWQgQXZtT3BlcmF0aW9uRXhwcmVzc2lvbjo6bG9hZCgpCit7CisJcHV0T3RoZXIoInJhbmRvbSIgICwgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9SQU5ET00pOworCisJcHV0T3RoZXIoImFicyIgICAgICwgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BQlMpOworCisJcHV0T3RoZXIoImNlaWwiICAgICwgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9DRUlMKTsKKwlwdXRPdGhlcigiZmxvb3IiICAgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0ZMT09SKTsKKwlwdXRPdGhlcigicm91bmQiICAgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1JPVU5EKTsKKwlwdXRPdGhlcigidHJ1bmMiICAgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1RSVU5DQVRFKTsKKworCS8vIEVYUCAtIExPRworCXB1dE90aGVyKCJzcXJ0IiAgICAsIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU1FSVCk7CisKKwlwdXRPdGhlcigiZXhwIiAgICAgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0VYUCk7CisJcHV0T3RoZXIoImxuIiAgICAgICwgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9MTik7CisJcHV0T3RoZXIoImxvZyIgICAgICwgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9MT0cpOworCisJLy8gVFJJR09OT01FVFJJQworCXB1dE90aGVyKCJzaW4iICAgICAsIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU0lOKTsKKwlwdXRPdGhlcigiY29zIiAgICAgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0NPUyk7CisJcHV0T3RoZXIoInRhbiIgICAgICwgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9UQU4pOworCisJcHV0T3RoZXIoInNpbmgiICAgICwgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TSU5IKTsKKwlwdXRPdGhlcigiY29zaCIgICAgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0NPU0gpOworCXB1dE90aGVyKCJ0YW5oIiAgICAsIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfVEFOSCk7CisKKwlwdXRPdGhlcigiYXNpbiIgICAgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FTSU4pOworCXB1dE90aGVyKCJhY29zIiAgICAsIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQUNPUyk7CisJcHV0T3RoZXIoImF0YW4iICAgICwgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BVEFOKTsKKwlwdXRPdGhlcigiYXRhbjIiICAgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FUQU4yKTsKKworCXB1dE90aGVyKCJhc2luaCIgICAsIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQVNJTkgpOworCXB1dE90aGVyKCJhY29zaCIgICAsIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQUNPU0gpOworCXB1dE90aGVyKCJhdGFuaCIgICAsIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQVRBTkgpOworfQorCisKKy8qKgorICogRElTUE9TRVIKKyAqLwordm9pZCBBdm1PcGVyYXRpb25FeHByZXNzaW9uOjpkaXNwb3NlKCkKK3sKKwl0aGVPdGhlck1hcC5jbGVhcigpOworfQorCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2xpYi9Bdm1PcGVyYXRpb25FeHByZXNzaW9uLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbGliL0F2bU9wZXJhdGlvbkV4cHJlc3Npb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmY0Nzc3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2xpYi9Bdm1PcGVyYXRpb25FeHByZXNzaW9uLmgKQEAgLTAsMCArMSwxMDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyNyBub3YuIDIwMTIKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBBVk1PUEVSQVRJT05FWFBSRVNTSU9OX0hfCisjZGVmaW5lIEFWTU9QRVJBVElPTkVYUFJFU1NJT05fSF8KKworI2luY2x1ZGUgPG1hcD4KKworI2luY2x1ZGUgPGZtbC9vcGVyYXRvci9PcGVyYXRvci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjbGFzcyBCRjsKKworCitjbGFzcyBBdm1PcGVyYXRpb25FeHByZXNzaW9uCit7CisKK3B1YmxpYzoKKwkvKioKKwkgKiBMT0FERVIgLSBESVNQT1NFUgorCSAqLworCXN0YXRpYyB2b2lkIGxvYWQoKTsKKwlzdGF0aWMgdm9pZCBkaXNwb3NlKCk7CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIHRoZU90aGVyTWFwCisJICovCisJc3RhdGljIHN0ZDo6bWFwPCBzdGQ6OnN0cmluZyAsIE9wZXJhdG9yICogPiB0aGVPdGhlck1hcDsKKworCWlubGluZSBzdGF0aWMgT3BlcmF0b3IgKiBnZXRPdGhlcihjb25zdCBzdGQ6OnN0cmluZyAmIG1ldGhvZCkKKwl7CisJCXJldHVybiggdGhlT3RoZXJNYXBbIG1ldGhvZCBdICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBib29sIGlzT3RoZXIoY29uc3Qgc3RkOjpzdHJpbmcgJiBtZXRob2QpCisJeworCQlyZXR1cm4oIHRoZU90aGVyTWFwLmZpbmQoIG1ldGhvZCApICE9IHRoZU90aGVyTWFwLmVuZCgpICk7CisJfQorCisJaW5saW5lIHN0YXRpYyB2b2lkIHB1dE90aGVyKGNvbnN0IHN0ZDo6c3RyaW5nICYgbWV0aG9kLCBPcGVyYXRvciAqIGFuT3BlcmF0b3IpCisJeworCQl0aGVPdGhlck1hcFsgbWV0aG9kIF0gPSBhbk9wZXJhdG9yOworCX0KKworCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKi8KKwlpbmxpbmUgc3RhdGljIE9wZXJhdG9yICogZ2V0KGNvbnN0IHN0ZDo6c3RyaW5nICYgbWV0aG9kKQorCXsKKwkJcmV0dXJuKCBnZXRPdGhlcihtZXRob2QpICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBPcGVyYXRvciAqIGdldChjb25zdCBCRiAmIGFSZWNlaXZlciwgY29uc3Qgc3RkOjpzdHJpbmcgJiBtZXRob2QpCisJeworCQlyZXR1cm4oIGdldChtZXRob2QpICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBib29sIGV4aXN0KGNvbnN0IHN0ZDo6c3RyaW5nICYgbWV0aG9kKQorCXsKKwkJcmV0dXJuKCBpc090aGVyKG1ldGhvZCkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIGJvb2wgZXhpc3QoY29uc3Qgc3RkOjpzdHJpbmcgJiBtZXRob2QsIE9wZXJhdG9yICogYW5PcGVyYXRvcikKKwl7CisJCXJldHVybiggYW5PcGVyYXRvciA9PSBnZXRPdGhlcihtZXRob2QpICk7CisJfQorCisKKwlpbmxpbmUgc3RhdGljIHZvaWQgcHV0KGNvbnN0IHN0ZDo6c3RyaW5nICYgbWV0aG9kLCBPcGVyYXRvciAqIGFuT3BlcmF0b3IpCisJeworCQlwdXRPdGhlcihtZXRob2QsIGFuT3BlcmF0b3IpOworCX0KKworCit9OworCisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisjZW5kaWYgLyogQVZNT1BFUkFUSU9ORVhQUkVTU0lPTl9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2xpYi9Bdm1PcGVyYXRpb25GYWN0b3J5LmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9saWIvQXZtT3BlcmF0aW9uRmFjdG9yeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY4OWEzYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9saWIvQXZtT3BlcmF0aW9uRmFjdG9yeS5jcHAKQEAgLTAsMCArMSwyNDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiA1IGF2ci4gMjAxMgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQXZtT3BlcmF0aW9uRmFjdG9yeS5oIgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvQmFzZUluc3RhbmNlRm9ybS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZEYXRhLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZk1hY2hpbmUuaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0J1aWx0aW5Db250YWluZXIuaD4KKworI2luY2x1ZGUgPGZtbC9saWIvQXZtT3BlcmF0aW9uRXhwcmVzc2lvbi5oPgorI2luY2x1ZGUgPGZtbC9saWIvQXZtT3BlcmF0aW9uTWFjaGluZS5oPgorI2luY2x1ZGUgPGZtbC9saWIvQXZtT3BlcmF0aW9uVmFyaWFibGUuaD4KKworI2luY2x1ZGUgPGZtbC9vcGVyYXRvci9PcGVyYXRvck1hbmFnZXIuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL1J1bnRpbWVJRC5oPgorCisjaW5jbHVkZSA8Zm1sL3R5cGUvQmFzZVR5cGVTcGVjaWZpZXIuaD4KKworI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9NYWNoaW5lLmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1ZhcmlhYmxlLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK3N0ZDo6bWFwPCBzdGQ6OnN0cmluZyAsIE9wZXJhdG9yICogPiBBdm1PcGVyYXRpb25GYWN0b3J5Ojp0aGVHbG9iYWxNYXA7CisKKworLyoqCisgKiBMT0FERVIKKyAqLwordm9pZCBBdm1PcGVyYXRpb25GYWN0b3J5Ojpsb2FkKCkKK3sKKwlBdm1PcGVyYXRpb25FeHByZXNzaW9uOjpsb2FkKCk7CisKKwlBdm1PcGVyYXRpb25NYWNoaW5lOjpsb2FkKCk7CisKKwlBdm1PcGVyYXRpb25WYXJpYWJsZTo6bG9hZCgpOworfQorCisKKy8qKgorICogRElTUE9TRVIKKyAqLwordm9pZCBBdm1PcGVyYXRpb25GYWN0b3J5OjpkaXNwb3NlKCkKK3sKKwlBdm1PcGVyYXRpb25WYXJpYWJsZTo6ZGlzcG9zZSgpOworCisJQXZtT3BlcmF0aW9uTWFjaGluZTo6ZGlzcG9zZSgpOworCisJQXZtT3BlcmF0aW9uRXhwcmVzc2lvbjo6ZGlzcG9zZSgpOworCisJdGhlR2xvYmFsTWFwLmNsZWFyKCk7Cit9CisKKworCisvKioKKyAqIEdFVFRFUiAtIFNFVFRFUgorICovCitPcGVyYXRvciAqIEF2bU9wZXJhdGlvbkZhY3Rvcnk6OmdldChjb25zdCBzdGQ6OnN0cmluZyAmIG1ldGhvZCkKK3sKKwlPcGVyYXRvciAqIG9wID0gTlVMTDsKKworCWlmKCAob3AgPSBnZXRHbG9iYWwobWV0aG9kKSkgIT0gTlVMTCApCisJeworCQlyZXR1cm4oIG9wICk7CisJfQorCisJaWYoIChvcCA9IEF2bU9wZXJhdGlvblZhcmlhYmxlOjpnZXQobWV0aG9kKSkgIT0gTlVMTCApCisJeworCQlyZXR1cm4oIG9wICk7CisJfQorCisJaWYoIChvcCA9IEF2bU9wZXJhdGlvbk1hY2hpbmU6OmdldChtZXRob2QpKSAhPSBOVUxMICkKKwl7CisJCXJldHVybiggb3AgKTsKKwl9CisKKwlyZXR1cm4oIEF2bU9wZXJhdGlvbkV4cHJlc3Npb246OmdldChtZXRob2QpICk7Cit9CisKKworT3BlcmF0b3IgKiBBdm1PcGVyYXRpb25GYWN0b3J5OjpnZXQoY29uc3QgQkYgJiBhUmVjZWl2ZXIsCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgbWV0aG9kKQoreworCWlmKCBhUmVjZWl2ZXIuaXM8IEJhc2VJbnN0YW5jZUZvcm0gPigpICkKKwl7CisJCXJldHVybiggZ2V0KGFSZWNlaXZlci50b19wdHI8IEJhc2VJbnN0YW5jZUZvcm0gPigpLCBtZXRob2QpICk7CisJfQorCWVsc2UgaWYoIGFSZWNlaXZlci5pczwgTWFjaGluZSA+KCkgfHwKKwkJCWFSZWNlaXZlci5pczwgSW5zdGFuY2VPZk1hY2hpbmUgPigpIHx8CisJCQlhUmVjZWl2ZXIuaXM8IFJ1bnRpbWVJRCA+KCkgKQorCXsKKwkJcmV0dXJuKCBBdm1PcGVyYXRpb25NYWNoaW5lOjpnZXQobWV0aG9kKSApOworCX0KKworCWVsc2UgaWYoIGFSZWNlaXZlci5pczwgVmFyaWFibGUgPigpICkKKwl7CisJCVZhcmlhYmxlICogYVZhciA9IGFSZWNlaXZlci50b19wdHI8IFZhcmlhYmxlID4oKTsKKworCQlpZiggYVZhci0+aGFzVHlwZVNwZWNpZmllcigpICkKKwkJeworCQkJQmFzZVR5cGVTcGVjaWZpZXIgKiB2YXJUUyA9IGFWYXItPmdldFR5cGVTcGVjaWZpZXIoKTsKKwkJCWlmKCB2YXJUUy0+aXNUeXBlZE1hY2hpbmUoKSApCisJCQl7CisJCQkJT3BlcmF0b3IgKiBvcFZhciA9IEF2bU9wZXJhdGlvbk1hY2hpbmU6OmdldChtZXRob2QpOworCQkJCWlmKCBvcFZhciAhPSBOVUxMICkKKwkJCQl7CisJCQkJCXJldHVybiggb3BWYXIgKTsKKwkJCQl9CisJCQl9CisKKwkJCU9wZXJhdG9yICogb3BWYXIgPSBBdm1PcGVyYXRpb25WYXJpYWJsZTo6Z2V0KHZhclRTLCBtZXRob2QpOworCQkJaWYoIG9wVmFyICE9IE5VTEwgKQorCQkJeworCQkJCXJldHVybiggb3BWYXIgKTsKKwkJCX0KKwkJfQorCX0KKworCWVsc2UgaWYoIGFSZWNlaXZlci5pczwgSW5zdGFuY2VPZkRhdGEgPigpICkKKwl7CisJCUluc3RhbmNlT2ZEYXRhICogYURhdGEgPSBhUmVjZWl2ZXIudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCk7CisKKwkJaWYoIGFEYXRhLT5oYXNUeXBlU3BlY2lmaWVyKCkgKQorCQl7CisJCQlCYXNlVHlwZVNwZWNpZmllciAqIHZhclRTID0gYURhdGEtPmdldFR5cGVTcGVjaWZpZXIoKTsKKwkJCWlmKCB2YXJUUy0+aXNUeXBlZE1hY2hpbmUoKSApCisJCQl7CisJCQkJcmV0dXJuKCBBdm1PcGVyYXRpb25NYWNoaW5lOjpnZXQobWV0aG9kKSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCU9wZXJhdG9yICogb3BWYXIgPSBBdm1PcGVyYXRpb25WYXJpYWJsZTo6Z2V0KHZhclRTLCBtZXRob2QpOworCQkJCWlmKCBvcFZhciAhPSBOVUxMICkKKwkJCQl7CisJCQkJCXJldHVybiggb3BWYXIgKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwllbHNlIGlmKCBhUmVjZWl2ZXIuaXM8IEJ1aWx0aW5Db2xsZWN0aW9uID4oKSB8fAorCQkJYVJlY2VpdmVyLmlzPCBTdHJpbmcgPigpICkKKwl7CisJCXJldHVybiggQXZtT3BlcmF0aW9uVmFyaWFibGU6OmdldChtZXRob2QpICk7CisJfQorCWVsc2UKKwl7CisJCU9wZXJhdG9yICogb3BFeHByID0gQXZtT3BlcmF0aW9uRXhwcmVzc2lvbjo6Z2V0KGFSZWNlaXZlciwgbWV0aG9kKTsKKwkJaWYoIG9wRXhwciAhPSBOVUxMICkKKwkJeworCQkJcmV0dXJuKCBvcEV4cHIgKTsKKwkJfQorCX0KKworCXJldHVybiggZ2V0KG1ldGhvZCkgKTsKK30KKworT3BlcmF0b3IgKiBBdm1PcGVyYXRpb25GYWN0b3J5OjpnZXQoCisJCUJhc2VJbnN0YW5jZUZvcm0gKiBhbkluc3RhbmNlLCBjb25zdCBzdGQ6OnN0cmluZyAmIG1ldGhvZCkKK3sKKwlpZiggYW5JbnN0YW5jZS0+aXNUeXBlZE1hY2hpbmUoKSB8fCBhbkluc3RhbmNlLT5pczwgSW5zdGFuY2VPZk1hY2hpbmUgPigpICkKKwl7CisJCXJldHVybiggQXZtT3BlcmF0aW9uTWFjaGluZTo6Z2V0KGFuSW5zdGFuY2UsIG1ldGhvZCkgKTsKKwl9CisJZWxzZQorCXsKKwkJT3BlcmF0b3IgKiBvcFZhciA9IEF2bU9wZXJhdGlvblZhcmlhYmxlOjpnZXQoYW5JbnN0YW5jZSwgbWV0aG9kKTsKKwkJaWYoIG9wVmFyICE9IE5VTEwgKQorCQl7CisJCQlyZXR1cm4oIG9wVmFyICk7CisJCX0KKworCQlyZXR1cm4oIGdldEdsb2JhbChtZXRob2QpICk7CisJfQorfQorCisKKworYm9vbCBBdm1PcGVyYXRpb25GYWN0b3J5OjpleGlzdChjb25zdCBzdGQ6OnN0cmluZyAmIG1ldGhvZCkKK3sKKwlyZXR1cm4oIGlzR2xvYmFsKG1ldGhvZCkgfHwKKwkJCUF2bU9wZXJhdGlvblZhcmlhYmxlOjpleGlzdChtZXRob2QpIHx8CisJCQlBdm1PcGVyYXRpb25NYWNoaW5lOjpleGlzdChtZXRob2QpIHx8CisJCQlBdm1PcGVyYXRpb25FeHByZXNzaW9uOjpleGlzdChtZXRob2QpICk7Cit9CisKKworYm9vbCBBdm1PcGVyYXRpb25GYWN0b3J5OjpleGlzdChCYXNlSW5zdGFuY2VGb3JtICogYW5JbnN0YW5jZSwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBtZXRob2QpCit7CisJcmV0dXJuKCBBdm1PcGVyYXRpb25WYXJpYWJsZTo6ZXhpc3QoYW5JbnN0YW5jZSwgbWV0aG9kKSB8fAorCQkJQXZtT3BlcmF0aW9uTWFjaGluZTo6ZXhpc3QoYW5JbnN0YW5jZSwgbWV0aG9kKSAgfHwKKwkJCWlzR2xvYmFsKG1ldGhvZCkgKTsKK30KKworCitib29sIEF2bU9wZXJhdGlvbkZhY3Rvcnk6OmV4aXN0KGNvbnN0IHN0ZDo6c3RyaW5nICYgbWV0aG9kLCBPcGVyYXRvciAqIGFuT3BlcmF0b3IpCit7CisJcmV0dXJuKCAoYW5PcGVyYXRvciA9PSBnZXRHbG9iYWwobWV0aG9kKSkgICAgICAgICAgICAgICAgIHx8CisJCQlBdm1PcGVyYXRpb25WYXJpYWJsZTo6ZXhpc3QobWV0aG9kLCBhbk9wZXJhdG9yKSAgIHx8CisJCQlBdm1PcGVyYXRpb25NYWNoaW5lOjpleGlzdChtZXRob2QsIGFuT3BlcmF0b3IpICAgIHx8CisJCQlBdm1PcGVyYXRpb25FeHByZXNzaW9uOjpleGlzdChtZXRob2QsIGFuT3BlcmF0b3IpICk7Cit9CisKKworCit2b2lkIEF2bU9wZXJhdGlvbkZhY3Rvcnk6OnB1dChjb25zdCBzdGQ6OnN0cmluZyAmIG1ldGhvZCwgT3BlcmF0b3IgKiBhbk9wZXJhdG9yKQoreworCWlmKCBleGlzdChtZXRob2QsIGFuT3BlcmF0b3IpICkKKwl7CisJCXJldHVybjsKKwl9CisJcHV0R2xvYmFsKG1ldGhvZCwgYW5PcGVyYXRvcik7Cit9CisKKwordm9pZCBBdm1PcGVyYXRpb25GYWN0b3J5OjpwdXQoQmFzZUluc3RhbmNlRm9ybSAqIGFuSW5zdGFuY2UsCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgbWV0aG9kLCBPcGVyYXRvciAqIGFuT3BlcmF0b3IpCit7CisJcHV0R2xvYmFsKG1ldGhvZCwgYW5PcGVyYXRvcik7Cit9CisKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9saWIvQXZtT3BlcmF0aW9uRmFjdG9yeS5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2xpYi9Bdm1PcGVyYXRpb25GYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY5NWEyZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9saWIvQXZtT3BlcmF0aW9uRmFjdG9yeS5oCkBAIC0wLDAgKzEsMTAyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogNSBhdnIuIDIwMTIKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBBVk1PUEVSQVRJT05GQUNUT1JZX0hfCisjZGVmaW5lIEFWTU9QRVJBVElPTkZBQ1RPUllfSF8KKworI2luY2x1ZGUgPG1hcD4KKworI2luY2x1ZGUgPGZtbC9vcGVyYXRvci9PcGVyYXRvci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjbGFzcyBCRjsKK2NsYXNzIEJhc2VJbnN0YW5jZUZvcm07CisKKworY2xhc3MgQXZtT3BlcmF0aW9uRmFjdG9yeQoreworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBMT0FERVIgLSBESVNQT1NFUgorCSAqLworCXN0YXRpYyB2b2lkIGxvYWQoKTsKKwlzdGF0aWMgdm9pZCBkaXNwb3NlKCk7CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIHRoZUdsb2JhbE1hcAorCSAqLworCXN0YXRpYyBzdGQ6Om1hcDwgc3RkOjpzdHJpbmcgLCBPcGVyYXRvciAqID4gdGhlR2xvYmFsTWFwOworCisJaW5saW5lIHN0YXRpYyBPcGVyYXRvciAqIGdldEdsb2JhbChjb25zdCBzdGQ6OnN0cmluZyAmIG1ldGhvZCkKKwl7CisJCXJldHVybiggdGhlR2xvYmFsTWFwWyBtZXRob2QgXSApOworCX0KKworCWlubGluZSBzdGF0aWMgYm9vbCBpc0dsb2JhbChjb25zdCBzdGQ6OnN0cmluZyAmIG1ldGhvZCkKKwl7CisJCXJldHVybiggdGhlR2xvYmFsTWFwLmZpbmQoIG1ldGhvZCApICE9IHRoZUdsb2JhbE1hcC5lbmQoKSApOworCX0KKworCWlubGluZSBzdGF0aWMgdm9pZCBwdXRHbG9iYWwoY29uc3Qgc3RkOjpzdHJpbmcgJiBtZXRob2QsCisJCQlPcGVyYXRvciAqIGFuT3BlcmF0b3IpCisJeworCQl0aGVHbG9iYWxNYXBbIG1ldGhvZCBdID0gYW5PcGVyYXRvcjsKKwl9CisKKwlpbmxpbmUgc3RhdGljIHZvaWQgcmVzZXRHbG9iYWwoY29uc3Qgc3RkOjpzdHJpbmcgJiBtZXRob2QpCisJeworCQlyZXR1cm4oIHRoZUdsb2JhbE1hcC5jbGVhcigpICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKi8KKwlzdGF0aWMgT3BlcmF0b3IgKiBnZXQoY29uc3Qgc3RkOjpzdHJpbmcgJiBtZXRob2QpOworCisJc3RhdGljIE9wZXJhdG9yICogZ2V0KGNvbnN0IEJGICYgYVJlY2VpdmVyLCBjb25zdCBzdGQ6OnN0cmluZyAmIG1ldGhvZCk7CisKKwlzdGF0aWMgT3BlcmF0b3IgKiBnZXQoQmFzZUluc3RhbmNlRm9ybSAqIGFuSW5zdGFuY2UsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIG1ldGhvZCk7CisKKworCXN0YXRpYyBib29sIGV4aXN0KGNvbnN0IHN0ZDo6c3RyaW5nICYgbWV0aG9kKTsKKworCXN0YXRpYyBib29sIGV4aXN0KEJhc2VJbnN0YW5jZUZvcm0gKiBhbkluc3RhbmNlLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBtZXRob2QpOworCisJc3RhdGljIGJvb2wgZXhpc3QoY29uc3Qgc3RkOjpzdHJpbmcgJiBtZXRob2QsIE9wZXJhdG9yICogYW5PcGVyYXRvcik7CisKKworCXN0YXRpYyB2b2lkIHB1dChjb25zdCBzdGQ6OnN0cmluZyAmIG1ldGhvZCwgT3BlcmF0b3IgKiBhbk9wZXJhdG9yKTsKKworCXN0YXRpYyB2b2lkIHB1dChCYXNlSW5zdGFuY2VGb3JtICogYW5JbnN0YW5jZSwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgbWV0aG9kLCBPcGVyYXRvciAqIGFuT3BlcmF0b3IpOworCisKK307CisKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKyNlbmRpZiAvKiBBVk1PUEVSQVRJT05GQUNUT1JZX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbGliL0F2bU9wZXJhdGlvbk1hY2hpbmUuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2xpYi9Bdm1PcGVyYXRpb25NYWNoaW5lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjhlNDdiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2xpYi9Bdm1PcGVyYXRpb25NYWNoaW5lLmNwcApAQCAtMCwwICsxLDE1MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDMgYXZyLiAyMDEyCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJBdm1PcGVyYXRpb25NYWNoaW5lLmgiCisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9CYXNlSW5zdGFuY2VGb3JtLmg+CisKKyNpbmNsdWRlIDxmbWwvb3BlcmF0b3IvT3BlcmF0b3JNYW5hZ2VyLmg+CisKKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvTWFjaGluZS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitzdGQ6Om1hcDwgc3RkOjpzdHJpbmcgLCBPcGVyYXRvciAqID4gQXZtT3BlcmF0aW9uTWFjaGluZTo6dGhlQWN0aXZpdHlNYXA7CisKK3N0ZDo6bWFwPCBzdGQ6OnN0cmluZyAsIE9wZXJhdG9yICogPiBBdm1PcGVyYXRpb25NYWNoaW5lOjp0aGVTdGF0dXNNYXA7CisKK3N0ZDo6bWFwPCBzdGQ6OnN0cmluZyAsIE9wZXJhdG9yICogPiBBdm1PcGVyYXRpb25NYWNoaW5lOjp0aGVPdGhlck1hcDsKKworCisKKy8qKgorICogTE9BREVSCisgKi8KK3ZvaWQgQXZtT3BlcmF0aW9uTWFjaGluZTo6bG9hZCgpCit7CisJcHV0QWN0aXZpdHkoImluaXQiICAgICAgICAgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0lOSVQpOworCXB1dEFjdGl2aXR5KCJmaW5hbCIgICAgICAgICwgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9GSU5BTCk7CisJcHV0QWN0aXZpdHkoImRlc3Ryb3kiICAgICAgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0RFU1RST1kpOworCisJcHV0QWN0aXZpdHkoInN0YXJ0IiAgICAgICAgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NUQVJUKTsKKwlwdXRBY3Rpdml0eSgicmVzdGFydCIgICAgICAsIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfUkVTVEFSVCk7CisJcHV0QWN0aXZpdHkoInN0b3AiICAgICAgICAgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NUT1ApOworCisKKwlwdXRBY3Rpdml0eSgiaWVuYWJsZSIgICAgICAsIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfSUVOQUJMRV9JTlZPS0UpOworCXB1dEFjdGl2aXR5KCJlbmFibGUiICAgICAgICwgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9FTkFCTEVfSU5WT0tFKTsKKwlwdXRBY3Rpdml0eSgiZW5hYmxlI3NldCIgICAsIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfRU5BQkxFX1NFVCk7CisKKworCXB1dEFjdGl2aXR5KCJpZGlzYWJsZSIgICAgICwgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9JRElTQUJMRV9JTlZPS0UpOworCXB1dEFjdGl2aXR5KCJkaXNhYmxlIiAgICAgICwgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9ESVNBQkxFX0lOVk9LRSk7CisJcHV0QWN0aXZpdHkoImRpc2FibGUjc2V0IiAgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0RJU0FCTEVfU0VUKTsKKworCXB1dEFjdGl2aXR5KCJkaXNhYmxlI2NoaWxkIiAgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0RJU0FCTEVfQ0hJTEQpOworCXB1dEFjdGl2aXR5KCJkaXNhYmxlI3NlbHZlcyIgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0RJU0FCTEVfU0VMVkVTKTsKKworCisJcHV0QWN0aXZpdHkoImlhYm9ydCIgICAgICAgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0lBQk9SVF9JTlZPS0UpOworCXB1dEFjdGl2aXR5KCJhYm9ydCIgICAgICAgICwgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BQk9SVF9JTlZPS0UpOworCXB1dEFjdGl2aXR5KCJhYm9ydCNzZXQiICAgICwgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BQk9SVF9TRVQpOworCisJcHV0QWN0aXZpdHkoImFib3J0I2NoaWxkIiAgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FCT1JUX0NISUxEKTsKKwlwdXRBY3Rpdml0eSgiYWJvcnQjc2VsdmVzIiAsIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQUJPUlRfU0VMVkVTKTsKKworCisJcHV0QWN0aXZpdHkoImlydW4iICAgICAgICAgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0lSVU4pOworCXB1dEFjdGl2aXR5KCJydW4iICAgICAgICAgICwgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9SVU4pOworCXB1dEFjdGl2aXR5KCJydGMiICAgICAgICAgICwgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9SVEMpOworCisJcHV0QWN0aXZpdHkoInNjaGVkdWxlIiAgICAgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NDSEVEVUxFX0lOVk9LRSk7CisJcHV0QWN0aXZpdHkoInNjaGVkdWxlI3J1biIgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NDSEVEVUxFX0lOVk9LRSk7CisJcHV0QWN0aXZpdHkoInNjaGVkdWxlI2dldCIgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NDSEVEVUxFX0dFVCk7CisJcHV0QWN0aXZpdHkoInNjaGVkdWxlI2luIiAgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NDSEVEVUxFX0lOKTsKKwlwdXRBY3Rpdml0eSgic2NoZWR1bGUjc2V0IiAsIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU0NIRURVTEVfU0VUKTsKKworCXB1dEFjdGl2aXR5KCJkZWZlciIgICAgICAgICwgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9ERUZFUl9JTlZPS0UpOworCXB1dEFjdGl2aXR5KCJkZWZlciNydW4iICAgICwgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9ERUZFUl9JTlZPS0UpOworCXB1dEFjdGl2aXR5KCJkZWZlciNnZXQiICAgICwgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9ERUZFUl9HRVQpOworCXB1dEFjdGl2aXR5KCJkZWZlciNzZXQiICAgICwgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9ERUZFUl9TRVQpOworCisJcHV0QWN0aXZpdHkoInN1c3BlbmQiICAgICAgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NVU1BFTkQpOworCXB1dEFjdGl2aXR5KCJyZXN1bWUiICAgICAgICwgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9SRVNVTUUpOworCXB1dEFjdGl2aXR5KCJ3YWl0IiAgICAgICAgICwgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9XQUlUKTsKKworCisJcHV0U3RhdHVzKCJzdGF0dXNfd2FzIiAgICAgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NUQVRVU19XQVMpOworCXB1dFN0YXR1cygic3RhdHVzX2lzIiAgICAgICwgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TVEFUVVNfSVMpOworCXB1dFN0YXR1cygic3RhdHVzX2JlaW5nIiAgICwgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TVEFUVVNfQkVJTkcpOworCXB1dFN0YXR1cygic3RhdHVzX3dpbGwiICAgICwgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TVEFUVVNfV0lMTCk7CisKKwlwdXRTdGF0dXMoImNoYW5nZWQiICAgICAgICAsIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQ0hBTkdFRCk7CisJcHV0U3RhdHVzKCJjaGFuZ2VkX3RvIiAgICAgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0NIQU5HRURfVE8pOworfQorCisKKy8qKgorICogRElTUE9TRVIKKyAqLwordm9pZCBBdm1PcGVyYXRpb25NYWNoaW5lOjpkaXNwb3NlKCkKK3sKKwl0aGVBY3Rpdml0eU1hcC5jbGVhcigpOworCisJdGhlU3RhdHVzTWFwLmNsZWFyKCk7CisKKwl0aGVPdGhlck1hcC5jbGVhcigpOworfQorCisKKworLyoqCisgKiBHRVRURVIgLSBTRVRURVIKKyAqLworT3BlcmF0b3IgKiBBdm1PcGVyYXRpb25NYWNoaW5lOjpnZXQoY29uc3Qgc3RkOjpzdHJpbmcgJiBtZXRob2QpCit7CisJT3BlcmF0b3IgKiBvcCA9IE5VTEw7CisKKwlpZiggKG9wID0gZ2V0QWN0aXZpdHkobWV0aG9kKSkgIT0gTlVMTCApCisJeworCQlyZXR1cm4oIG9wICk7CisJfQorCisJaWYoIChvcCA9IGdldFN0YXR1cyhtZXRob2QpKSAhPSBOVUxMICkKKwl7CisJCXJldHVybiggb3AgKTsKKwl9CisKKwlyZXR1cm4oIGdldE90aGVyKG1ldGhvZCkgKTsKK30KKworCitPcGVyYXRvciAqIEF2bU9wZXJhdGlvbk1hY2hpbmU6OmdldChjb25zdCBCRiAmIGFSZWNlaXZlciwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBtZXRob2QpCit7CisJaWYoIGFSZWNlaXZlci5pc19leGFjdGx5PCBNYWNoaW5lID4oKSApCisJeworCQlyZXR1cm4oIGdldChhUmVjZWl2ZXIudG9fcHRyPCBNYWNoaW5lID4oKSwgbWV0aG9kKSApOworCX0KKwllbHNlIGlmKCBhUmVjZWl2ZXIuaXM8IEJhc2VJbnN0YW5jZUZvcm0gPigpICkKKwl7CisJCXJldHVybiggZ2V0KGFSZWNlaXZlci50b19wdHI8IEJhc2VJbnN0YW5jZUZvcm0gPigpLCBtZXRob2QpICk7CisJfQorCXJldHVybiggZ2V0KG1ldGhvZCkgKTsKK30KKworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2xpYi9Bdm1PcGVyYXRpb25NYWNoaW5lLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbGliL0F2bU9wZXJhdGlvbk1hY2hpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTg1MDhlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2xpYi9Bdm1PcGVyYXRpb25NYWNoaW5lLmgKQEAgLTAsMCArMSwxNjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAzIGF2ci4gMjAxMgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEFWTU9QRVJBVElPTk1BQ0hJTkVfSF8KKyNkZWZpbmUgQVZNT1BFUkFUSU9OTUFDSElORV9IXworCisjaW5jbHVkZSA8bWFwPgorCisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIEJGOworY2xhc3MgQmFzZUluc3RhbmNlRm9ybTsKK2NsYXNzIE1hY2hpbmU7CisKKworY2xhc3MgQXZtT3BlcmF0aW9uTWFjaGluZQoreworCitwdWJsaWM6CisJLyoqCisJICogTE9BREVSIC0gRElTUE9TRVIKKwkgKi8KKwlzdGF0aWMgdm9pZCBsb2FkKCk7CisJc3RhdGljIHZvaWQgZGlzcG9zZSgpOworCisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIHRoZUFjdGl2aXR5TWFwCisJICovCisJc3RhdGljIHN0ZDo6bWFwPCBzdGQ6OnN0cmluZyAsIE9wZXJhdG9yICogPiB0aGVBY3Rpdml0eU1hcDsKKworCWlubGluZSBzdGF0aWMgT3BlcmF0b3IgKiBnZXRBY3Rpdml0eShjb25zdCBzdGQ6OnN0cmluZyAmIG1ldGhvZCkKKwl7CisJCXJldHVybiggdGhlQWN0aXZpdHlNYXBbIG1ldGhvZCBdICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBib29sIGlzQWN0aXZpdHkoY29uc3Qgc3RkOjpzdHJpbmcgJiBtZXRob2QpCisJeworCQlyZXR1cm4oIHRoZUFjdGl2aXR5TWFwLmZpbmQoIG1ldGhvZCApICE9IHRoZUFjdGl2aXR5TWFwLmVuZCgpICk7CisJfQorCisJaW5saW5lIHN0YXRpYyB2b2lkIHB1dEFjdGl2aXR5KGNvbnN0IHN0ZDo6c3RyaW5nICYgbWV0aG9kLAorCQkJT3BlcmF0b3IgKiBhbk9wZXJhdG9yKQorCXsKKwkJdGhlQWN0aXZpdHlNYXBbIG1ldGhvZCBdID0gYW5PcGVyYXRvcjsKKwl9CisKKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogdGhlU3RhdHVzTWFwCisJICovCisJc3RhdGljIHN0ZDo6bWFwPCBzdGQ6OnN0cmluZyAsIE9wZXJhdG9yICogPiB0aGVTdGF0dXNNYXA7CisKKwlpbmxpbmUgc3RhdGljIE9wZXJhdG9yICogZ2V0U3RhdHVzKGNvbnN0IHN0ZDo6c3RyaW5nICYgbWV0aG9kKQorCXsKKwkJcmV0dXJuKCB0aGVTdGF0dXNNYXBbIG1ldGhvZCBdICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBib29sIGlzU3RhdHVzKGNvbnN0IHN0ZDo6c3RyaW5nICYgbWV0aG9kKQorCXsKKwkJcmV0dXJuKCB0aGVTdGF0dXNNYXAuZmluZCggbWV0aG9kICkgIT0gdGhlU3RhdHVzTWFwLmVuZCgpICk7CisJfQorCisJaW5saW5lIHN0YXRpYyB2b2lkIHB1dFN0YXR1cyhjb25zdCBzdGQ6OnN0cmluZyAmIG1ldGhvZCwKKwkJCU9wZXJhdG9yICogYW5PcGVyYXRvcikKKwl7CisJCXRoZVN0YXR1c01hcFsgbWV0aG9kIF0gPSBhbk9wZXJhdG9yOworCX0KKworCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiB0aGVPdGhlck1hcAorCSAqLworCXN0YXRpYyBzdGQ6Om1hcDwgc3RkOjpzdHJpbmcgLCBPcGVyYXRvciAqID4gdGhlT3RoZXJNYXA7CisKKwlpbmxpbmUgc3RhdGljIE9wZXJhdG9yICogZ2V0T3RoZXIoY29uc3Qgc3RkOjpzdHJpbmcgJiBtZXRob2QpCisJeworCQlyZXR1cm4oIHRoZU90aGVyTWFwWyBtZXRob2QgXSApOworCX0KKworCWlubGluZSBzdGF0aWMgYm9vbCBpc090aGVyKGNvbnN0IHN0ZDo6c3RyaW5nICYgbWV0aG9kKQorCXsKKwkJcmV0dXJuKCB0aGVPdGhlck1hcC5maW5kKCBtZXRob2QgKSAhPSB0aGVPdGhlck1hcC5lbmQoKSApOworCX0KKworCWlubGluZSBzdGF0aWMgdm9pZCBwdXRPdGhlcihjb25zdCBzdGQ6OnN0cmluZyAmIG1ldGhvZCwKKwkJCU9wZXJhdG9yICogYW5PcGVyYXRvcikKKwl7CisJCXRoZU90aGVyTWFwWyBtZXRob2QgXSA9IGFuT3BlcmF0b3I7CisJfQorCisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqLworCXN0YXRpYyBPcGVyYXRvciAqIGdldChjb25zdCBzdGQ6OnN0cmluZyAmIG1ldGhvZCk7CisKKwlzdGF0aWMgT3BlcmF0b3IgKiBnZXQoY29uc3QgQkYgJiBhUmVjZWl2ZXIsIGNvbnN0IHN0ZDo6c3RyaW5nICYgbWV0aG9kKTsKKworCWlubGluZSBzdGF0aWMgT3BlcmF0b3IgKiBnZXQoTWFjaGluZSAqIGFNYWNoaW5lLCBjb25zdCBzdGQ6OnN0cmluZyAmIG1ldGhvZCkKKwl7CisJCXJldHVybiggZ2V0KG1ldGhvZCkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIE9wZXJhdG9yICogZ2V0KEJhc2VJbnN0YW5jZUZvcm0gKiBhbkluc3RhbmNlLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBtZXRob2QpCisJeworCQlyZXR1cm4oIGdldChtZXRob2QpICk7CisJfQorCisKKwlpbmxpbmUgc3RhdGljIGJvb2wgZXhpc3QoY29uc3Qgc3RkOjpzdHJpbmcgJiBtZXRob2QpCisJeworCQlyZXR1cm4oIGlzQWN0aXZpdHkobWV0aG9kKSB8fCBpc1N0YXR1cyhtZXRob2QpIHx8CisJCQkJaXNPdGhlcihtZXRob2QpICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBib29sIGV4aXN0KEJhc2VJbnN0YW5jZUZvcm0gKiBhbkluc3RhbmNlLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBtZXRob2QpCisJeworCQlyZXR1cm4oIGV4aXN0KG1ldGhvZCkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIGJvb2wgZXhpc3QoY29uc3Qgc3RkOjpzdHJpbmcgJiBtZXRob2QsIE9wZXJhdG9yICogYW5PcGVyYXRvcikKKwl7CisJCXJldHVybiggKGFuT3BlcmF0b3IgPT0gZ2V0QWN0aXZpdHkobWV0aG9kKSkgfHwKKwkJCQkoYW5PcGVyYXRvciA9PSBnZXRTdGF0dXMobWV0aG9kKSkgICB8fAorCQkJCShhbk9wZXJhdG9yID09IGdldE90aGVyKG1ldGhvZCkpICAgICk7CisJfQorCisKKwlpbmxpbmUgc3RhdGljIHZvaWQgcHV0KEJhc2VJbnN0YW5jZUZvcm0gKiBhbkluc3RhbmNlLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBtZXRob2QsIE9wZXJhdG9yICogYW5PcGVyYXRvcikKKwl7CisJCXB1dE90aGVyKG1ldGhvZCwgYW5PcGVyYXRvcik7CisJfQorCisKKworCisKK307CisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworI2VuZGlmIC8qIEFWTU9QRVJBVElPTk1BQ0hJTkVfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9saWIvQXZtT3BlcmF0aW9uVmFyaWFibGUuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2xpYi9Bdm1PcGVyYXRpb25WYXJpYWJsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ2YjliYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9saWIvQXZtT3BlcmF0aW9uVmFyaWFibGUuY3BwCkBAIC0wLDAgKzEsNDAyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogNCBhdnIuIDIwMTIKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkF2bU9wZXJhdGlvblZhcmlhYmxlLmgiCisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9CYXNlSW5zdGFuY2VGb3JtLmg+CisKKyNpbmNsdWRlIDxmbWwvb3BlcmF0b3IvT3BlcmF0b3JNYW5hZ2VyLmg+CisKKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvVmFyaWFibGUuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworc3RkOjptYXA8IHN0ZDo6c3RyaW5nICwgT3BlcmF0b3IgKiA+IEF2bU9wZXJhdGlvblZhcmlhYmxlOjp0aGVWYXJpYWJsZU1hcDsKKworc3RkOjptYXA8IHN0ZDo6c3RyaW5nICwgT3BlcmF0b3IgKiA+IEF2bU9wZXJhdGlvblZhcmlhYmxlOjp0aGVDb250YWluZXJNYXA7CisKK3N0ZDo6bWFwPCBzdGQ6OnN0cmluZyAsIE9wZXJhdG9yICogPiBBdm1PcGVyYXRpb25WYXJpYWJsZTo6dGhlUXVldWVNYXA7CisKK3N0ZDo6bWFwPCBzdGQ6OnN0cmluZyAsIE9wZXJhdG9yICogPiBBdm1PcGVyYXRpb25WYXJpYWJsZTo6dGhlVGltZU1hcDsKKworc3RkOjptYXA8IHN0ZDo6c3RyaW5nICwgT3BlcmF0b3IgKiA+IEF2bU9wZXJhdGlvblZhcmlhYmxlOjp0aGVBY3Rpdml0eU1hcDsKKworc3RkOjptYXA8IHN0ZDo6c3RyaW5nICwgT3BlcmF0b3IgKiA+IEF2bU9wZXJhdGlvblZhcmlhYmxlOjp0aGVPdGhlck1hcDsKKworCisKKworLyoqCisgKiBMT0FERVIKKyAqLwordm9pZCBBdm1PcGVyYXRpb25WYXJpYWJsZTo6bG9hZCgpCit7CisJcHV0VmFyaWFibGUoIm5ld2ZyZXNoIiAgICAgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FTU0lHTl9ORVdGUkVTSCk7CisJcHV0VmFyaWFibGUoInJlc2V0IiAgICAgICAgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FTU0lHTl9SRVNFVCk7CisKKwlwdXRWYXJpYWJsZSgiY2hhbmdlZCIgICAgICAsIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQ0hBTkdFRCk7CisJcHV0VmFyaWFibGUoImNoYW5nZWRfdG8iICAgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0NIQU5HRURfVE8pOworCisKKwlwdXRDb250YWluZXIoImNvbnRhaW5zIiAgICAsIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQ09OVEFJTlMpOworCXB1dENvbnRhaW5lcigiaW4iICAgICAgICAgICwgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9JTik7CisJcHV0Q29udGFpbmVyKCJub3RpbiIgICAgICAgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX05PVElOKTsKKwlwdXRDb250YWluZXIoInN1YnNldCIgICAgICAsIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU1VCU0VUKTsKKwlwdXRDb250YWluZXIoInN1YnNldGVxIiAgICAsIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU1VCU0VURVEpOworCXB1dENvbnRhaW5lcigiaW50ZXJzZWN0IiAgICwgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9JTlRFUlNFQ1QpOworCisJcHV0Q29udGFpbmVyKCJzdGFydHNfd2l0aCIgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NUQVJUU19XSVRIKTsKKwlwdXRDb250YWluZXIoImVuZHNfd2l0aCIgICAsIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfRU5EU19XSVRIKTsKKwlwdXRDb250YWluZXIoImNvbmNhdCIgICAgICAsIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQ09OQ0FUKTsKKworCXB1dENvbnRhaW5lcigiZW1wdHkiICAgICAgICwgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9FTVBUWSk7CisJcHV0Q29udGFpbmVyKCJub25lbXB0eSIgICAgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX05PTkVNUFRZKTsKKwlwdXRDb250YWluZXIoInNpbmdsZXRvbiIgICAsIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU0lOR0xFVE9OKTsKKwlwdXRDb250YWluZXIoInBvcHVsYXRlZCIgICAsIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfUE9QVUxBVEVEKTsKKwlwdXRDb250YWluZXIoImZ1bGwiICAgICAgICAsIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfRlVMTCk7CisJcHV0Q29udGFpbmVyKCJzaXplIiAgICAgICAgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NJWkUpOworCisJcHV0Q29udGFpbmVyKCJhcHBlbmQiICAgICAgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FQUEVORCk7CisJcHV0Q29udGFpbmVyKCJyZW1vdmUiICAgICAgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1JFTU9WRSk7CisKKwlwdXRDb250YWluZXIoImNsZWFyIiAgICAgICAsIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQ0xFQVIpOworCXB1dENvbnRhaW5lcigicmVzaXplIiAgICAgICwgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9SRVNJWkUpOworCisJcHV0Q29udGFpbmVyKCJzZWxlY3QiICAgICAgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NFTEVDVCk7CisKKwlwdXRRdWV1ZSgicHVzaCIgICAgICAgICAgICwgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9QVVNIKTsKKwlwdXRRdWV1ZSgiYXNzaWduX3RvcCIgICAgICwgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BU1NJR05fVE9QKTsKKwlwdXRRdWV1ZSgidG9wIiAgICAgICAgICAgICwgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9UT1ApOworCXB1dFF1ZXVlKCJwb3AiICAgICAgICAgICAgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1BPUCk7CisJcHV0UXVldWUoInBvcF9mcm9tIiAgICAgICAsIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfUE9QX0ZST00pOworCXB1dFF1ZXVlKCJyZW1vdmVfcG9wYWJsZSIgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1JFTU9WRSk7CisKKwlwdXRBY3Rpdml0eSgiaWVuYWJsZSIgICAgICwgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9JRU5BQkxFX0lOVk9LRSk7CisJcHV0QWN0aXZpdHkoImVuYWJsZSIgICAgICAsIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfRU5BQkxFX0lOVk9LRSk7CisJcHV0QWN0aXZpdHkoImVuYWJsZSNzZXQiICAsIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfRU5BQkxFX1NFVCk7CisKKwlwdXRBY3Rpdml0eSgiaWRpc2FibGUiICAgICAsIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfSURJU0FCTEVfSU5WT0tFKTsKKwlwdXRBY3Rpdml0eSgiZGlzYWJsZSIgICAgICAsIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfRElTQUJMRV9JTlZPS0UpOworCXB1dEFjdGl2aXR5KCJkaXNhYmxlI3NldCIgICwgT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9ESVNBQkxFX1NFVCk7CisKKwlwdXRBY3Rpdml0eSgiaWFib3J0IiAgICAgICAsIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfSUFCT1JUX0lOVk9LRSk7CisJcHV0QWN0aXZpdHkoImFib3J0IiAgICAgICAgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FCT1JUX0lOVk9LRSk7CisJcHV0QWN0aXZpdHkoImFib3J0I3NldCIgICAgLCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FCT1JUX1NFVCk7Cit9CisKKworLyoqCisgKiBESVNQT1NFUgorICovCit2b2lkIEF2bU9wZXJhdGlvblZhcmlhYmxlOjpkaXNwb3NlKCkKK3sKKwl0aGVWYXJpYWJsZU1hcC5jbGVhcigpOworCisJdGhlQ29udGFpbmVyTWFwLmNsZWFyKCk7CisKKwl0aGVRdWV1ZU1hcC5jbGVhcigpOworCisJdGhlVGltZU1hcC5jbGVhcigpOworCisJdGhlQWN0aXZpdHlNYXAuY2xlYXIoKTsKKworCXRoZU90aGVyTWFwLmNsZWFyKCk7Cit9CisKKworLyoqCisgKiBHRVRURVIgLSBTRVRURVIKKyAqLworT3BlcmF0b3IgKiBBdm1PcGVyYXRpb25WYXJpYWJsZTo6Z2V0KGNvbnN0IHN0ZDo6c3RyaW5nICYgbWV0aG9kKQoreworCU9wZXJhdG9yICogb3AgPSBOVUxMOworCisJaWYoIChvcCA9IGdldENvbnRhaW5lcihtZXRob2QpKSAhPSBOVUxMICkKKwl7CisJCXJldHVybiggb3AgKTsKKwl9CisKKwlpZiggKG9wID0gZ2V0UXVldWUobWV0aG9kKSkgIT0gTlVMTCApCisJeworCQlyZXR1cm4oIG9wICk7CisJfQorCisJaWYoIChvcCA9IGdldFRpbWUobWV0aG9kKSkgIT0gTlVMTCApCisJeworCQlyZXR1cm4oIG9wICk7CisJfQorCisJaWYoIChvcCA9IGdldEFjdGl2aXR5KG1ldGhvZCkpICE9IE5VTEwgKQorCXsKKwkJcmV0dXJuKCBvcCApOworCX0KKworCWlmKCAob3AgPSBnZXRWYXJpYWJsZShtZXRob2QpKSAhPSBOVUxMICkKKwl7CisJCXJldHVybiggb3AgKTsKKwl9CisKKwlyZXR1cm4oIGdldE90aGVyKG1ldGhvZCkgKTsKK30KKworCitPcGVyYXRvciAqIEF2bU9wZXJhdGlvblZhcmlhYmxlOjpnZXQoY29uc3QgQkYgJiBhUmVjZWl2ZXIsCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgbWV0aG9kKQoreworCWlmKCBhUmVjZWl2ZXIuaXM8IFZhcmlhYmxlID4oKSApCisJeworCQlyZXR1cm4oIGdldChhUmVjZWl2ZXIudG9fcHRyPCBWYXJpYWJsZSA+KCksIG1ldGhvZCkgKTsKKwl9CisJZWxzZSBpZiggYVJlY2VpdmVyLmlzPCBCYXNlSW5zdGFuY2VGb3JtID4oKSApCisJeworCQlyZXR1cm4oIGdldChhUmVjZWl2ZXIudG9fcHRyPCBCYXNlSW5zdGFuY2VGb3JtID4oKSwgbWV0aG9kKSApOworCX0KKwlyZXR1cm4oIGdldChtZXRob2QpICk7Cit9CisKKworCisKK09wZXJhdG9yICogQXZtT3BlcmF0aW9uVmFyaWFibGU6OmdldCgKKwkJVmFyaWFibGUgKiBhVmFyaWFibGUsIGNvbnN0IHN0ZDo6c3RyaW5nICYgbWV0aG9kKQoreworCWlmKCAoYVZhcmlhYmxlLT5oYXNUeXBlU3BlY2lmaWVyKCkgJiYKKwkJKGFWYXJpYWJsZS0+Z2V0VHlwZVNwZWNpZmllcigpLT5oYXNUeXBlQ29udGFpbmVyKCkgfHwKKwkJYVZhcmlhYmxlLT5nZXRUeXBlU3BlY2lmaWVyKCktPmlzVHlwZWRCdWZmZXIoKSAgICAgfHwKKwkJYVZhcmlhYmxlLT5nZXRUeXBlU3BlY2lmaWVyKCktPmhhc1R5cGVDb250YWluZXIoKSAgfHwKKwkJYVZhcmlhYmxlLT5nZXRUeXBlU3BlY2lmaWVyKCktPmlzVHlwZWRTdHJpbmcoKSApICkgKQorCXsKKwkJT3BlcmF0b3IgKiBvcENvbnRhaW5lciA9IGdldENvbnRhaW5lcihtZXRob2QpOworCQlpZiggb3BDb250YWluZXIgIT0gTlVMTCApCisJCXsKKwkJCXJldHVybiggb3BDb250YWluZXIgKTsKKwkJfQorCX0KKworCWlmKCBhVmFyaWFibGUtPmhhc1R5cGVTcGVjaWZpZXIoKSAmJgorCQkJYVZhcmlhYmxlLT5nZXRUeXBlU3BlY2lmaWVyKCktPmhhc1R5cGVRdWV1ZSgpICkKKwl7CisJCU9wZXJhdG9yICogb3BRdWV1ZSA9IGdldFF1ZXVlKG1ldGhvZCk7CisJCWlmKCBvcFF1ZXVlICE9IE5VTEwgKQorCQl7CisJCQlyZXR1cm4oIG9wUXVldWUgKTsKKwkJfQorCX0KKworCWlmKCBhVmFyaWFibGUtPmhhc1R5cGVTcGVjaWZpZXIoKSAmJgorCQkoYVZhcmlhYmxlLT5nZXRUeXBlU3BlY2lmaWVyKCktPmlzVHlwZWRNYWNoaW5lKCkgICB8fAorCQlhVmFyaWFibGUtPmdldFR5cGVTcGVjaWZpZXIoKS0+d2Vha2x5VHlwZWRJbnRlZ2VyKCkgKSApCisJeworCQlPcGVyYXRvciAqIG9wQWN0aXZpdHkgPSBnZXRBY3Rpdml0eShtZXRob2QpOworCQlpZiggb3BBY3Rpdml0eSAhPSBOVUxMICkKKwkJeworCQkJcmV0dXJuKCBvcEFjdGl2aXR5ICk7CisJCX0KKwl9CisKKwlpZiggYVZhcmlhYmxlLT5oYXNUeXBlU3BlY2lmaWVyKCkKKwkJJiYgYVZhcmlhYmxlLT5nZXRUeXBlU3BlY2lmaWVyKCktPmhhc1R5cGVkQ2xvY2tUaW1lKCkgKQorCXsKKwkJT3BlcmF0b3IgKiBvcFRpbWUgPSBnZXRUaW1lKG1ldGhvZCk7CisJCWlmKCBvcFRpbWUgIT0gTlVMTCApCisJCXsKKwkJCXJldHVybiggb3BUaW1lICk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJT3BlcmF0b3IgKiBvcFZhciA9IGdldFZhcmlhYmxlKG1ldGhvZCk7CisJCWlmKCBvcFZhciAhPSBOVUxMICkKKwkJeworCQkJcmV0dXJuKCBvcFZhciApOworCQl9CisJfQorCisJcmV0dXJuKCBnZXRPdGhlcihtZXRob2QpICk7Cit9CisKKworT3BlcmF0b3IgKiBBdm1PcGVyYXRpb25WYXJpYWJsZTo6Z2V0KAorCQlCYXNlSW5zdGFuY2VGb3JtICogYW5JbnN0YW5jZSwgY29uc3Qgc3RkOjpzdHJpbmcgJiBtZXRob2QpCit7CisJaWYoIGFuSW5zdGFuY2UtPmhhc1R5cGVDb250YWluZXIoKSAgICB8fAorCQlhbkluc3RhbmNlLT5pc1R5cGVkQnVmZmVyKCkgICAgICAgfHwKKwkJYW5JbnN0YW5jZS0+aXNUeXBlZFN0cmluZygpICkKKwl7CisJCU9wZXJhdG9yICogb3BDb250YWluZXIgPSBnZXRDb250YWluZXIobWV0aG9kKTsKKwkJaWYoIG9wQ29udGFpbmVyICE9IE5VTEwgKQorCQl7CisJCQlyZXR1cm4oIG9wQ29udGFpbmVyICk7CisJCX0KKwl9CisKKwlpZiggYW5JbnN0YW5jZS0+aGFzVHlwZVF1ZXVlKCkgKQorCXsKKwkJT3BlcmF0b3IgKiBvcFF1ZXVlID0gZ2V0UXVldWUobWV0aG9kKTsKKwkJaWYoIG9wUXVldWUgIT0gTlVMTCApCisJCXsKKwkJCXJldHVybiggb3BRdWV1ZSApOworCQl9CisJfQorCisJaWYoIGFuSW5zdGFuY2UtPmhhc1R5cGVTcGVjaWZpZXIoKSAmJiAoCisJCWFuSW5zdGFuY2UtPmdldFR5cGVTcGVjaWZpZXIoKS0+aXNUeXBlZE1hY2hpbmUoKSB8fAorCQlhbkluc3RhbmNlLT5nZXRUeXBlU3BlY2lmaWVyKCktPndlYWtseVR5cGVkSW50ZWdlcigpICkgKQorCXsKKwkJT3BlcmF0b3IgKiBvcEFjdGl2aXR5ID0gZ2V0QWN0aXZpdHkobWV0aG9kKTsKKwkJaWYoIG9wQWN0aXZpdHkgIT0gTlVMTCApCisJCXsKKwkJCXJldHVybiggb3BBY3Rpdml0eSApOworCQl9CisJfQorCisJaWYoIGFuSW5zdGFuY2UtPmhhc1R5cGVkQ2xvY2tUaW1lKCkgKQorCXsKKwkJT3BlcmF0b3IgKiBvcFRpbWUgPSBnZXRUaW1lKG1ldGhvZCk7CisJCWlmKCBvcFRpbWUgIT0gTlVMTCApCisJCXsKKwkJCXJldHVybiggb3BUaW1lICk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJT3BlcmF0b3IgKiBvcFZhciA9IGdldFZhcmlhYmxlKG1ldGhvZCk7CisJCWlmKCBvcFZhciAhPSBOVUxMICkKKwkJeworCQkJcmV0dXJuKCBvcFZhciApOworCQl9CisJfQorCisJcmV0dXJuKCBnZXRPdGhlcihtZXRob2QpICk7Cit9CisKKworT3BlcmF0b3IgKiBBdm1PcGVyYXRpb25WYXJpYWJsZTo6Z2V0KAorCQlCYXNlVHlwZVNwZWNpZmllciAqIGFUeXBlU3BlY2lmaWVyLCBjb25zdCBzdGQ6OnN0cmluZyAmIG1ldGhvZCkKK3sKKwlpZiggYVR5cGVTcGVjaWZpZXItPmhhc1R5cGVDb250YWluZXIoKSB8fAorCQlhVHlwZVNwZWNpZmllci0+aXNUeXBlZEJ1ZmZlcigpICAgIHx8CisJCWFUeXBlU3BlY2lmaWVyLT5pc1R5cGVkU3RyaW5nKCkgKQorCXsKKwkJT3BlcmF0b3IgKiBvcENvbnRhaW5lciA9IGdldENvbnRhaW5lcihtZXRob2QpOworCQlpZiggb3BDb250YWluZXIgIT0gTlVMTCApCisJCXsKKwkJCXJldHVybiggb3BDb250YWluZXIgKTsKKwkJfQorCX0KKworCWlmKCBhVHlwZVNwZWNpZmllci0+aGFzVHlwZVF1ZXVlKCkgKQorCXsKKwkJT3BlcmF0b3IgKiBvcFF1ZXVlID0gZ2V0UXVldWUobWV0aG9kKTsKKwkJaWYoIG9wUXVldWUgIT0gTlVMTCApCisJCXsKKwkJCXJldHVybiggb3BRdWV1ZSApOworCQl9CisJfQorCisJaWYoIGFUeXBlU3BlY2lmaWVyLT5pc1R5cGVkTWFjaGluZSgpIHx8CisJCWFUeXBlU3BlY2lmaWVyLT53ZWFrbHlUeXBlZEludGVnZXIoKSApCisJeworCQlPcGVyYXRvciAqIG9wQWN0aXZpdHkgPSBnZXRBY3Rpdml0eShtZXRob2QpOworCQlpZiggb3BBY3Rpdml0eSAhPSBOVUxMICkKKwkJeworCQkJcmV0dXJuKCBvcEFjdGl2aXR5ICk7CisJCX0KKwl9CisKKwlpZiggYVR5cGVTcGVjaWZpZXItPmhhc1R5cGVkVGltZSgpICkKKwl7CisJCU9wZXJhdG9yICogb3BUaW1lID0gZ2V0VGltZShtZXRob2QpOworCQlpZiggb3BUaW1lICE9IE5VTEwgKQorCQl7CisJCQlyZXR1cm4oIG9wVGltZSApOworCQl9CisJfQorCWVsc2UKKwl7CisJCU9wZXJhdG9yICogb3BWYXIgPSBnZXRWYXJpYWJsZShtZXRob2QpOworCQlpZiggb3BWYXIgIT0gTlVMTCApCisJCXsKKwkJCXJldHVybiggb3BWYXIgKTsKKwkJfQorCX0KKworCXJldHVybiggZ2V0T3RoZXIobWV0aG9kKSApOworfQorCisKK2Jvb2wgQXZtT3BlcmF0aW9uVmFyaWFibGU6OmV4aXN0KEJhc2VJbnN0YW5jZUZvcm0gKiBhbkluc3RhbmNlLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBtZXRob2QpCit7CisJaWYoIChhbkluc3RhbmNlLT5oYXNUeXBlQ29udGFpbmVyKCkgfHwgYW5JbnN0YW5jZS0+aXNUeXBlZEJ1ZmZlcigpKSAmJgorCQlpc0NvbnRhaW5lcihtZXRob2QpICkKKwl7CisJCXJldHVybiggdHJ1ZSApOworCX0KKworCWlmKCBhbkluc3RhbmNlLT5oYXNUeXBlUXVldWUoKSAmJiBpc1F1ZXVlKG1ldGhvZCkgKQorCXsKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisJaWYoIGlzQWN0aXZpdHkobWV0aG9kKSAmJiBhbkluc3RhbmNlLT5oYXNUeXBlU3BlY2lmaWVyKCkgJiYgKAorCQlhbkluc3RhbmNlLT5nZXRUeXBlU3BlY2lmaWVyKCktPmlzVHlwZWRNYWNoaW5lKCkgfHwKKwkJYW5JbnN0YW5jZS0+Z2V0VHlwZVNwZWNpZmllcigpLT53ZWFrbHlUeXBlZEludGVnZXIoKSApICkKKwl7CisJCXJldHVybiggdHJ1ZSApOworCX0KKworCWlmKCBpc1ZhcmlhYmxlKG1ldGhvZCkgKQorCXsKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisJcmV0dXJuKCBpc090aGVyKG1ldGhvZCkgKTsKK30KKworCisKK3ZvaWQgQXZtT3BlcmF0aW9uVmFyaWFibGU6OnB1dChCYXNlSW5zdGFuY2VGb3JtICogYW5JbnN0YW5jZSwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBtZXRob2QsIE9wZXJhdG9yICogYW5PcGVyYXRvcikKK3sKKwlpZiggYW5JbnN0YW5jZS0+aGFzVHlwZWRDbG9ja1RpbWUoKSApCisJeworCQlwdXRUaW1lKG1ldGhvZCwgYW5PcGVyYXRvcik7CisJfQorCWVsc2UgaWYoIGFuSW5zdGFuY2UtPmhhc1R5cGVRdWV1ZSgpICkKKwl7CisJCXB1dFF1ZXVlKG1ldGhvZCwgYW5PcGVyYXRvcik7CisJfQorCWVsc2UgaWYoIGFuSW5zdGFuY2UtPmhhc1R5cGVDb250YWluZXIoKSAgICAgfHwKKwkJCWFuSW5zdGFuY2UtPmlzVHlwZWRCdWZmZXIoKSAgICApCisJeworCQlwdXRDb250YWluZXIobWV0aG9kLCBhbk9wZXJhdG9yKTsKKwl9CisJZWxzZSBpZiggYW5JbnN0YW5jZS0+aGFzVHlwZVNwZWNpZmllcigpICYmICgKKwkJCWFuSW5zdGFuY2UtPmdldFR5cGVTcGVjaWZpZXIoKS0+aXNUeXBlZE1hY2hpbmUoKSB8fAorCQkJYW5JbnN0YW5jZS0+Z2V0VHlwZVNwZWNpZmllcigpLT53ZWFrbHlUeXBlZEludGVnZXIoKSApICkKKwl7CisJCXB1dEFjdGl2aXR5KG1ldGhvZCwgYW5PcGVyYXRvcik7CisJfQorCisJcHV0T3RoZXIobWV0aG9kLCBhbk9wZXJhdG9yKTsKK30KKworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2xpYi9Bdm1PcGVyYXRpb25WYXJpYWJsZS5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2xpYi9Bdm1PcGVyYXRpb25WYXJpYWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YjNlNWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbGliL0F2bU9wZXJhdGlvblZhcmlhYmxlLmgKQEAgLTAsMCArMSwyMjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiA0IGF2ci4gMjAxMgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEFWTU9QRVJBVElPTlZBUklBQkxFX0hfCisjZGVmaW5lIEFWTU9QRVJBVElPTlZBUklBQkxFX0hfCisKKyNpbmNsdWRlIDxtYXA+CisKKyNpbmNsdWRlIDxmbWwvb3BlcmF0b3IvT3BlcmF0b3IuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworY2xhc3MgQkY7CitjbGFzcyBCYXNlSW5zdGFuY2VGb3JtOworY2xhc3MgVmFyaWFibGU7CisKKworCitjbGFzcyBBdm1PcGVyYXRpb25WYXJpYWJsZQoreworCitwdWJsaWM6CisJLyoqCisJICogTE9BREVSIC0gRElTUE9TRVIKKwkgKi8KKwlzdGF0aWMgdm9pZCBsb2FkKCk7CisJc3RhdGljIHZvaWQgZGlzcG9zZSgpOworCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiB0aGVWYXJpYWJsZU1hcAorCSAqLworCXN0YXRpYyBzdGQ6Om1hcDwgc3RkOjpzdHJpbmcgLCBPcGVyYXRvciAqID4gdGhlVmFyaWFibGVNYXA7CisKKwlpbmxpbmUgc3RhdGljIE9wZXJhdG9yICogZ2V0VmFyaWFibGUoY29uc3Qgc3RkOjpzdHJpbmcgJiBtZXRob2QpCisJeworCQlyZXR1cm4oIHRoZVZhcmlhYmxlTWFwWyBtZXRob2QgXSApOworCX0KKworCWlubGluZSBzdGF0aWMgYm9vbCBpc1ZhcmlhYmxlKGNvbnN0IHN0ZDo6c3RyaW5nICYgbWV0aG9kKQorCXsKKwkJcmV0dXJuKCB0aGVWYXJpYWJsZU1hcC5maW5kKCBtZXRob2QgKSAhPSB0aGVWYXJpYWJsZU1hcC5lbmQoKSApOworCX0KKworCWlubGluZSBzdGF0aWMgdm9pZCBwdXRWYXJpYWJsZShjb25zdCBzdGQ6OnN0cmluZyAmIG1ldGhvZCwKKwkJCU9wZXJhdG9yICogYW5PcGVyYXRvcikKKwl7CisJCXRoZVZhcmlhYmxlTWFwWyBtZXRob2QgXSA9IGFuT3BlcmF0b3I7CisJfQorCisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIHRoZUNvbnRhaW5lck1hcAorCSAqLworCXN0YXRpYyBzdGQ6Om1hcDwgc3RkOjpzdHJpbmcgLCBPcGVyYXRvciAqID4gdGhlQ29udGFpbmVyTWFwOworCisJaW5saW5lIHN0YXRpYyBPcGVyYXRvciAqIGdldENvbnRhaW5lcihjb25zdCBzdGQ6OnN0cmluZyAmIG1ldGhvZCkKKwl7CisJCXJldHVybiggdGhlQ29udGFpbmVyTWFwWyBtZXRob2QgXSApOworCX0KKworCWlubGluZSBzdGF0aWMgYm9vbCBpc0NvbnRhaW5lcihjb25zdCBzdGQ6OnN0cmluZyAmIG1ldGhvZCkKKwl7CisJCXJldHVybiggdGhlQ29udGFpbmVyTWFwLmZpbmQoIG1ldGhvZCApICE9IHRoZUNvbnRhaW5lck1hcC5lbmQoKSApOworCX0KKworCWlubGluZSBzdGF0aWMgdm9pZCBwdXRDb250YWluZXIoY29uc3Qgc3RkOjpzdHJpbmcgJiBtZXRob2QsCisJCQlPcGVyYXRvciAqIGFuT3BlcmF0b3IpCisJeworCQl0aGVDb250YWluZXJNYXBbIG1ldGhvZCBdID0gYW5PcGVyYXRvcjsKKwl9CisKKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogdGhlUXVldWVNYXAKKwkgKi8KKwlzdGF0aWMgc3RkOjptYXA8IHN0ZDo6c3RyaW5nICwgT3BlcmF0b3IgKiA+IHRoZVF1ZXVlTWFwOworCisJaW5saW5lIHN0YXRpYyBPcGVyYXRvciAqIGdldFF1ZXVlKGNvbnN0IHN0ZDo6c3RyaW5nICYgbWV0aG9kKQorCXsKKwkJcmV0dXJuKCB0aGVRdWV1ZU1hcFsgbWV0aG9kIF0gKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIGJvb2wgaXNRdWV1ZShjb25zdCBzdGQ6OnN0cmluZyAmIG1ldGhvZCkKKwl7CisJCXJldHVybiggdGhlUXVldWVNYXAuZmluZCggbWV0aG9kICkgIT0gdGhlUXVldWVNYXAuZW5kKCkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIHZvaWQgcHV0UXVldWUoY29uc3Qgc3RkOjpzdHJpbmcgJiBtZXRob2QsIE9wZXJhdG9yICogYW5PcGVyYXRvcikKKwl7CisJCXRoZVF1ZXVlTWFwWyBtZXRob2QgXSA9IGFuT3BlcmF0b3I7CisJfQorCisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIHRoZVRpbWVNYXAKKwkgKi8KKwlzdGF0aWMgc3RkOjptYXA8IHN0ZDo6c3RyaW5nICwgT3BlcmF0b3IgKiA+IHRoZVRpbWVNYXA7CisKKwlpbmxpbmUgc3RhdGljIE9wZXJhdG9yICogZ2V0VGltZShjb25zdCBzdGQ6OnN0cmluZyAmIG1ldGhvZCkKKwl7CisJCXJldHVybiggdGhlVGltZU1hcFsgbWV0aG9kIF0gKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIGJvb2wgaXNUaW1lKGNvbnN0IHN0ZDo6c3RyaW5nICYgbWV0aG9kKQorCXsKKwkJcmV0dXJuKCB0aGVUaW1lTWFwLmZpbmQoIG1ldGhvZCApICE9IHRoZVRpbWVNYXAuZW5kKCkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIHZvaWQgcHV0VGltZShjb25zdCBzdGQ6OnN0cmluZyAmIG1ldGhvZCwgT3BlcmF0b3IgKiBhbk9wZXJhdG9yKQorCXsKKwkJdGhlVGltZU1hcFsgbWV0aG9kIF0gPSBhbk9wZXJhdG9yOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogdGhlQWN0aXZpdHlNYXAKKwkgKi8KKwlzdGF0aWMgc3RkOjptYXA8IHN0ZDo6c3RyaW5nICwgT3BlcmF0b3IgKiA+IHRoZUFjdGl2aXR5TWFwOworCisJaW5saW5lIHN0YXRpYyBPcGVyYXRvciAqIGdldEFjdGl2aXR5KGNvbnN0IHN0ZDo6c3RyaW5nICYgbWV0aG9kKQorCXsKKwkJcmV0dXJuKCB0aGVBY3Rpdml0eU1hcFsgbWV0aG9kIF0gKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIGJvb2wgaXNBY3Rpdml0eShjb25zdCBzdGQ6OnN0cmluZyAmIG1ldGhvZCkKKwl7CisJCXJldHVybiggdGhlQWN0aXZpdHlNYXAuZmluZCggbWV0aG9kICkgIT0gdGhlQWN0aXZpdHlNYXAuZW5kKCkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIHZvaWQgcHV0QWN0aXZpdHkoY29uc3Qgc3RkOjpzdHJpbmcgJiBtZXRob2QsCisJCQlPcGVyYXRvciAqIGFuT3BlcmF0b3IpCisJeworCQl0aGVBY3Rpdml0eU1hcFsgbWV0aG9kIF0gPSBhbk9wZXJhdG9yOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogdGhlT3RoZXJNYXAKKwkgKi8KKwlzdGF0aWMgc3RkOjptYXA8IHN0ZDo6c3RyaW5nICwgT3BlcmF0b3IgKiA+IHRoZU90aGVyTWFwOworCisJaW5saW5lIHN0YXRpYyBPcGVyYXRvciAqIGdldE90aGVyKGNvbnN0IHN0ZDo6c3RyaW5nICYgbWV0aG9kKQorCXsKKwkJcmV0dXJuKCB0aGVPdGhlck1hcFsgbWV0aG9kIF0gKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIGJvb2wgaXNPdGhlcihjb25zdCBzdGQ6OnN0cmluZyAmIG1ldGhvZCkKKwl7CisJCXJldHVybiggdGhlT3RoZXJNYXAuZmluZCggbWV0aG9kICkgIT0gdGhlT3RoZXJNYXAuZW5kKCkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIHZvaWQgcHV0T3RoZXIoY29uc3Qgc3RkOjpzdHJpbmcgJiBtZXRob2QsIE9wZXJhdG9yICogYW5PcGVyYXRvcikKKwl7CisJCXRoZU90aGVyTWFwWyBtZXRob2QgXSA9IGFuT3BlcmF0b3I7CisJfQorCisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqLworCXN0YXRpYyBPcGVyYXRvciAqIGdldChjb25zdCBzdGQ6OnN0cmluZyAmIG1ldGhvZCk7CisKKwlzdGF0aWMgT3BlcmF0b3IgKiBnZXQoY29uc3QgQkYgJiBhUmVjZWl2ZXIsIGNvbnN0IHN0ZDo6c3RyaW5nICYgbWV0aG9kKTsKKworCXN0YXRpYyBPcGVyYXRvciAqIGdldChWYXJpYWJsZSAqIGFWYXJpYWJsZSwgY29uc3Qgc3RkOjpzdHJpbmcgJiBtZXRob2QpOworCisJc3RhdGljIE9wZXJhdG9yICogZ2V0KEJhc2VJbnN0YW5jZUZvcm0gKiBhbkluc3RhbmNlLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBtZXRob2QpOworCisJc3RhdGljIE9wZXJhdG9yICogZ2V0KEJhc2VUeXBlU3BlY2lmaWVyICogYVR5cGVTcGVjaWZpZXIsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIG1ldGhvZCk7CisKKworCWlubGluZSBzdGF0aWMgYm9vbCBleGlzdChjb25zdCBzdGQ6OnN0cmluZyAmIG1ldGhvZCkKKwl7CisJCXJldHVybiggaXNWYXJpYWJsZShtZXRob2QpIHx8IGlzQ29udGFpbmVyKG1ldGhvZCkgfHwKKwkJCQlpc1F1ZXVlKG1ldGhvZCkgICAgfHwgaXNUaW1lKG1ldGhvZCkgICAgICB8fAorCQkJCWlzQWN0aXZpdHkobWV0aG9kKSB8fCBpc090aGVyKG1ldGhvZCkgKTsKKwl9CisKKwlzdGF0aWMgYm9vbCBleGlzdChCYXNlSW5zdGFuY2VGb3JtICogYW5JbnN0YW5jZSwgY29uc3Qgc3RkOjpzdHJpbmcgJiBtZXRob2QpOworCisJaW5saW5lIHN0YXRpYyBib29sIGV4aXN0KGNvbnN0IHN0ZDo6c3RyaW5nICYgbWV0aG9kLCBPcGVyYXRvciAqIGFuT3BlcmF0b3IpCisJeworCQlyZXR1cm4oIChhbk9wZXJhdG9yID09IGdldFZhcmlhYmxlKG1ldGhvZCkpICB8fAorCQkJCShhbk9wZXJhdG9yID09IGdldENvbnRhaW5lcihtZXRob2QpKSB8fAorCQkJCShhbk9wZXJhdG9yID09IGdldFF1ZXVlKG1ldGhvZCkpICAgICB8fAorCQkJCShhbk9wZXJhdG9yID09IGdldFRpbWUobWV0aG9kKSkgICAgICB8fAorCQkJCShhbk9wZXJhdG9yID09IGdldEFjdGl2aXR5KG1ldGhvZCkpICB8fAorCQkJCShhbk9wZXJhdG9yID09IGdldE90aGVyKG1ldGhvZCkpICk7CisJfQorCisKKwlzdGF0aWMgdm9pZCBwdXQoQmFzZUluc3RhbmNlRm9ybSAqIGFuSW5zdGFuY2UsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIG1ldGhvZCwgT3BlcmF0b3IgKiBhbk9wZXJhdG9yKTsKKworCit9OworCisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisjZW5kaWYgLyogQVZNT1BFUkFUSU9OVkFSSUFCTEVfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9saWIvSUNvbVBvaW50LmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9saWIvSUNvbVBvaW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTAzODIzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2xpYi9JQ29tUG9pbnQuY3BwCkBAIC0wLDAgKzEsNzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyNiBqdWluIDIwMTQKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIklDb21Qb2ludC5oIgorCituYW1lc3BhY2Ugc2VwCit7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDT01NVU5JQ0FUSU9OIFBPSU5UIDogS0lORCAmIERJUkVDVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworSUNvbVBvaW50OjpFTlVNX0lPX05BVFVSRSBJQ29tUG9pbnQ6OnRvX25hdHVyZShjb25zdCBzdGQ6OnN0cmluZyAmIGlkKQoreworCWlmKCBpZCA9PSAibWVzc2FnZSIgICkgcmV0dXJuIElPX01FU1NBR0VfTkFUVVJFOworCisJaWYoIGlkID09ICJwb3J0IiAgICAgKSByZXR1cm4gSU9fUE9SVF9OQVRVUkU7CisKKwlpZiggaWQgPT0gInNpZ25hbCIgICApIHJldHVybiBJT19TSUdOQUxfTkFUVVJFOworCisJcmV0dXJuIElPX1VOREVGSU5FRF9OQVRVUkU7Cit9CisKKworc3RkOjpzdHJpbmcgSUNvbVBvaW50OjpTRVBBUkFUT1IgPSAiJSI7CisKK3N0ZDo6c3RyaW5nIElDb21Qb2ludDo6c3RyX25hdHVyZSgKKwkJSUNvbVBvaW50OjpFTlVNX0lPX05BVFVSRSBuYXR1cmUsIElDb21Qb2ludDo6RU5VTV9JT19OQVRVUkUgbWFzaykKK3sKKwlzdGQ6OnN0cmluZyBzdHJOYXR1cmUgPSAiIjsKKwlzdGQ6OnN0cmluZyBzZXAgPSAiIjsKKworCW5hdHVyZSA9IG5hdHVyZSAmIG1hc2s7CisKKwlpZiggKG5hdHVyZSAmIElPX0NIQU5ORUxfTkFUVVJFKSAhPSAwICkKKwl7CisJCXN0ck5hdHVyZSA9ICJjaGFubmVsIjsKKwkJc2VwID0gU0VQQVJBVE9SOworCX0KKwlpZiggKG5hdHVyZSAmIElPX01FU1NBR0VfTkFUVVJFKSAhPSAwICkKKwl7CisJCXN0ck5hdHVyZSA9ICJtZXNzYWdlIjsKKwkJc2VwID0gU0VQQVJBVE9SOworCX0KKwlpZiggKG5hdHVyZSAmIElPX1BPUlRfTkFUVVJFKSAhPSAwICkKKwl7CisJCXN0ck5hdHVyZSA9ICJwb3J0IjsKKwkJc2VwID0gU0VQQVJBVE9SOworCX0KKwlpZiggKG5hdHVyZSAmIElPX1NJR05BTF9OQVRVUkUpICE9IDAgKQorCXsKKwkJc3RyTmF0dXJlID0gInNpZ25hbCI7CisJCXNlcCA9IFNFUEFSQVRPUjsKKwl9CisKKwlyZXR1cm4oIHN0ck5hdHVyZSApOworfQorCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9saWIvSUNvbVBvaW50LmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbGliL0lDb21Qb2ludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZmZhYWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbGliL0lDb21Qb2ludC5oCkBAIC0wLDAgKzEsMTA5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjYganVpbiAyMDE0CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgSUNPTVBPSU5UX0hfCisjZGVmaW5lIElDT01QT0lOVF9IXworCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8dXRpbC9hdm1fbnVtZXJpYy5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENPTU1VTklDQVRJT04gUE9JTlQgOiBLSU5EICYgRElSRUNUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjbGFzcyBJQ29tUG9pbnQKK3sKKworcHVibGljOgorCS8qKgorCSAqIENvbVBvaW50IE5BVFVSRQorCSAqLworCXR5cGVkZWYgYXZtX3VpbnQ4X3QgICAgICAgICBFTlVNX0lPX05BVFVSRTsKKworCWVudW0KKwl7CisJCUlPX0NIQU5ORUxfTkFUVVJFICAgICAgID0gMHgwMDEsCisKKwkJSU9fTUVTU0FHRV9OQVRVUkUgICAgICAgPSAweDAwMiwKKworCQlJT19QT1JUX05BVFVSRSAgICAgICAgICA9IDB4MDA0LAorCisJCUlPX1NJR05BTF9OQVRVUkUgICAgICAgID0gMHgwMDgsCisKKworCQlJT19NQVNLX0FMTF9OQVRVUkUgICAgICA9IDB4MEZGLAorCisJCUlPX1VOREVGSU5FRF9OQVRVUkUgICAgID0gMHgwMDAKKwl9OworCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+SUNvbVBvaW50KCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBOQVRVUkUKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLyoqCisJICogU1RBVElDCisJICovCisJc3RhdGljIEVOVU1fSU9fTkFUVVJFIHRvX25hdHVyZShjb25zdCBzdGQ6OnN0cmluZyAmIGlkKTsKKworCXN0YXRpYyBzdGQ6OnN0cmluZyBzdHJfbmF0dXJlKEVOVU1fSU9fTkFUVVJFIG5hdHVyZSwKKwkJCUVOVU1fSU9fTkFUVVJFIG1hc2sgPSBJT19NQVNLX0FMTF9OQVRVUkUpOworCisJc3RhdGljIHN0ZDo6c3RyaW5nIFNFUEFSQVRPUjsKKworCS8qKgorCSAqIEFQSQorCSAqLworCXZpcnR1YWwgRU5VTV9JT19OQVRVUkUgZ2V0Q29tUG9pbnROYXR1cmUoKSBjb25zdCA9IDA7CisKKy8vCUVOVU1fSU9fTkFUVVJFIGdldENvbVBvaW50TmF0dXJlKCkgY29uc3QKKy8vCXsKKy8vCQlyZXR1cm4oIG1OYXR1cmUgKTsKKy8vCX0KKworCisJaW5saW5lIGJvb2wgaXNQb3J0KCkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0Q29tUG9pbnROYXR1cmUoKSA9PSBJT19QT1JUX05BVFVSRSApOworCX0KKworCWlubGluZSBib29sIGlzU2lnbmFsKCkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0Q29tUG9pbnROYXR1cmUoKSA9PSBJT19TSUdOQUxfTkFUVVJFICk7CisJfQorCisJaW5saW5lIHN0ZDo6c3RyaW5nIHN0ckNvbVBvaW50TmF0dXJlKCkgY29uc3QKKwl7CisJCXJldHVybiggSUNvbVBvaW50OjpzdHJfbmF0dXJlKCBnZXRDb21Qb2ludE5hdHVyZSgpICkgKTsKKwl9CisKK307CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKiBJQ09NUE9JTlRfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9saWIvSVRyYWNlUG9pbnQuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2xpYi9JVHJhY2VQb2ludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThiZWNjOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9saWIvSVRyYWNlUG9pbnQuY3BwCkBAIC0wLDAgKzEsMzExIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjYganVpbiAyMDE0CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJJVHJhY2VQb2ludC5oIgorCisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1F1ZXJ5Lmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBUUkFDRSBQT0lOVAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTkFUVVJFIEVOVU1fVFJBQ0VfUE9JTlQ6OnRvX25hdHVyZSgKKwkJSUNvbVBvaW50OjpFTlVNX0lPX05BVFVSRSBpbykKK3sKKwlzd2l0Y2goIGlvICkKKwl7CisJCWNhc2UgSUNvbVBvaW50OjpJT19DSEFOTkVMX05BVFVSRSAgIDogcmV0dXJuKCBUUkFDRV9DSEFOTkVMX05BVFVSRSApOworCisJCWNhc2UgSUNvbVBvaW50OjpJT19NRVNTQUdFX05BVFVSRSAgIDogcmV0dXJuKCBUUkFDRV9NRVNTQUdFX05BVFVSRSApOworCisJCWNhc2UgSUNvbVBvaW50OjpJT19QT1JUX05BVFVSRSAgICAgIDogcmV0dXJuKCBUUkFDRV9QT1JUX05BVFVSRSApOworCisJCWNhc2UgSUNvbVBvaW50OjpJT19TSUdOQUxfTkFUVVJFICAgIDogcmV0dXJuKCBUUkFDRV9TSUdOQUxfTkFUVVJFICk7CisKKwkJY2FzZSBJQ29tUG9pbnQ6OklPX1VOREVGSU5FRF9OQVRVUkUgOiByZXR1cm4oIFRSQUNFX1VOREVGSU5FRF9OQVRVUkUgKTsKKworCQlkZWZhdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJldHVybiggVFJBQ0VfVU5ERUZJTkVEX05BVFVSRSApOworCX0KK30KKworCitFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9OQVRVUkUgRU5VTV9UUkFDRV9QT0lOVDo6dG9fbmF0dXJlKAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGlkKQoreworCWlmKCBpZCA9PSAiY29tIiAgICAgICAgICApIHJldHVybiBUUkFDRV9DT01fTkFUVVJFOworCisJaWYoIGlkID09ICJjaGFubmVsIiAgICAgICkgcmV0dXJuIFRSQUNFX0NIQU5ORUxfTkFUVVJFOworCisJaWYoIGlkID09ICJtZXNzYWdlIiAgICAgICkgcmV0dXJuIFRSQUNFX01FU1NBR0VfTkFUVVJFOworCisJaWYoIGlkID09ICJwb3J0IiAgICAgICAgICkgcmV0dXJuIFRSQUNFX1BPUlRfTkFUVVJFOworCisJaWYoIGlkID09ICJzaWduYWwiICAgICAgICkgcmV0dXJuIFRSQUNFX1NJR05BTF9OQVRVUkU7CisKKwlpZiggaWQgPT0gInRpbWUiICAgICAgICAgKSByZXR1cm4gVFJBQ0VfVElNRV9OQVRVUkU7CisKKwlpZiggaWQgPT0gInZhciIgICAgICAgICAgKSByZXR1cm4gVFJBQ0VfVkFSSUFCTEVfTkFUVVJFOworCWlmKCBpZCA9PSAidmFyaWFibGUiICAgICApIHJldHVybiBUUkFDRV9WQVJJQUJMRV9OQVRVUkU7CisvLwlpZiggaWQgPT0gImFzc2lnbiIgICAgICAgKSByZXR1cm4gVFJBQ0VfVkFSSUFCTEVfTkFUVVJFOworLy8JaWYoIGlkID09ICJuZXdmcmVzaCIgICAgICkgcmV0dXJuIFRSQUNFX1ZBUklBQkxFX05BVFVSRTsKKworCWlmKCBpZCA9PSAiYnVmZmVyIiAgICAgICApIHJldHVybiBUUkFDRV9CVUZGRVJfTkFUVVJFOworCisJaWYoIGlkID09ICJmb3JtdWxhIiAgICAgICkgcmV0dXJuIFRSQUNFX0ZPUk1VTEFfTkFUVVJFOworCisJaWYoIGlkID09ICJjb25kaXRpb24iICAgICkgcmV0dXJuIFRSQUNFX0NPTkRJVElPTl9OQVRVUkU7CisJaWYoIGlkID09ICJkZWNpc2lvbiIgICAgICkgcmV0dXJuIFRSQUNFX0RFQ0lTSU9OX05BVFVSRTsKKworCWlmKCBSRUdFWF9NQVRDSChpZCwgQ09OU19XSUQyKCJwYXRoIiwgImNvbmRpdGlvbiIpKSApIHJldHVybiBUUkFDRV9QQVRIX0NPTkRJVElPTl9OQVRVUkU7CisJaWYoIFJFR0VYX01BVENIKGlkLCBDT05TX1dJRDIoIm5vZGUiLCAiY29uZGl0aW9uIikpICkgcmV0dXJuIFRSQUNFX05PREVfQ09ORElUSU9OX05BVFVSRTsKKworCWlmKCBSRUdFWF9NQVRDSChpZCwgQ09OU19XSUQzKCJwYXRoIiwgImNvbmRpdGlvbiIsICJsZWFmIikpICkgeworCQlyZXR1cm4gVFJBQ0VfUEFUSF9DT05ESVRJT05fTkFUVVJFX0xFQUY7CisJfQorCWlmKCBSRUdFWF9NQVRDSChpZCwgQ09OU19XSUQzKCJub2RlIiwgImNvbmRpdGlvbiIsICJsZWFmIikpICkgeworCQlyZXR1cm4gVFJBQ0VfTk9ERV9DT05ESVRJT05fTkFUVVJFX0xFQUY7CisJfQorCisJaWYoIFJFR0VYX01BVENIKGlkLCBDT05TX1dJRDMoInBhdGgiLCAidGltZWQiLCAiY29uZGl0aW9uIikpICkgeworCQlyZXR1cm4gVFJBQ0VfUEFUSF9USU1FRF9DT05ESVRJT05fTkFUVVJFOworCX0KKwlpZiggUkVHRVhfTUFUQ0goaWQsIENPTlNfV0lEMygibm9kZSIsICJ0aW1lZCIsICJjb25kaXRpb24iKSkgKSB7CisJCXJldHVybiBUUkFDRV9OT0RFX1RJTUVEX0NPTkRJVElPTl9OQVRVUkU7CisJfQorCisJaWYoIFJFR0VYX01BVENIKGlkLCBDT05TX1dJRDQoCisJCQkicGF0aCIsICJ0aW1lZCIsICJjb25kaXRpb24iLCAiKGxlYWZ8ZW5kfGxhc3R8dGFpbCkiKSkgKSB7CisJCXJldHVybiBUUkFDRV9QQVRIX1RJTUVEX0NPTkRJVElPTl9OQVRVUkVfTEVBRjsKKwl9CisJaWYoIFJFR0VYX01BVENIKGlkLCBDT05TX1dJRDQoCisJCQkibm9kZSIsICJ0aW1lZCIsICJjb25kaXRpb24iLCAiKGxlYWZ8ZW5kfGxhc3R8dGFpbCkiKSkgKSB7CisJCXJldHVybiBUUkFDRV9OT0RFX1RJTUVEX0NPTkRJVElPTl9OQVRVUkVfTEVBRjsKKwl9CisKKwlpZiggaWQgPT0gIm1hY2hpbmUiICAgICAgKSByZXR1cm4gVFJBQ0VfTUFDSElORV9OQVRVUkU7CisJaWYoIGlkID09ICJzdGF0ZSIgICAgICAgICkgcmV0dXJuIFRSQUNFX1NUQVRFX05BVFVSRTsKKwlpZiggaWQgPT0gInN0YXRlbWFjaGluZSIgKSByZXR1cm4gVFJBQ0VfU1RBVEVNQUNISU5FX05BVFVSRTsKKworCWlmKCBpZCA9PSAidHJhbnNpdGlvbiIgICApIHJldHVybiBUUkFDRV9UUkFOU0lUSU9OX05BVFVSRTsKKwlpZiggaWQgPT0gInJvdXRpbmUiICAgICAgKSByZXR1cm4gVFJBQ0VfUk9VVElORV9OQVRVUkU7CisKKwlpZiggaWQgPT0gInJ1bm5hYmxlIiAgICAgKSByZXR1cm4gVFJBQ0VfUlVOTkFCTEVfTkFUVVJFOworCisJaWYoIFJFR0VYX01BVENIKGlkLCBDT05TX1dJRDIoCisJCQkiaW5pdCIsICJoZWFkZXIiKSkgKSByZXR1cm4gVFJBQ0VfSU5JVF9IRUFERVJfTkFUVVJFOworCisJaWYoIFJFR0VYX01BVENIKGlkLCBDT05TX1dJRDIoCisJCQkiaW5pdCIsICJiZWdpbiIgKSkgKSByZXR1cm4gVFJBQ0VfSU5JVF9CRUdJTl9OQVRVUkU7CisKKwlpZiggUkVHRVhfTUFUQ0goaWQsIENPTlNfV0lEMigKKwkJCSJpbml0IiwgImVuZCIgICApKSApIHJldHVybiBUUkFDRV9JTklUX0VORF9OQVRVUkU7CisKKworCWlmKCBSRUdFWF9NQVRDSChpZCwgQ09OU19XSUQyKAorCQkJInN0ZXAiLCAiaGVhZGVyIikpICkgcmV0dXJuIFRSQUNFX1NURVBfSEVBREVSX05BVFVSRTsKKworCWlmKCBSRUdFWF9NQVRDSChpZCwgQ09OU19XSUQyKAorCQkJInN0ZXAiLCAiYmVnaW4iICkpICkgcmV0dXJuIFRSQUNFX1NURVBfQkVHSU5fTkFUVVJFOworCisJaWYoIFJFR0VYX01BVENIKGlkLCBDT05TX1dJRDIoCisJCQkic3RlcCIsICJlbmQiICAgKSkgKSByZXR1cm4gVFJBQ0VfU1RFUF9FTkRfTkFUVVJFOworCisKKwlpZiggaWQgPT0gImNvbW1lbnQiICAgICAgKSByZXR1cm4gVFJBQ0VfQ09NTUVOVF9OQVRVUkU7CisJaWYoIGlkID09ICJzZXBhcmF0b3IiICAgICkgcmV0dXJuIFRSQUNFX1NFUEFSQVRPUl9OQVRVUkU7CisJaWYoIGlkID09ICJuZXdsaW5lIiAgICAgICkgcmV0dXJuIFRSQUNFX05FV0xJTkVfTkFUVVJFOworCisJaWYoIGlkID09ICJjb21wb3NpdGUiICAgICkgcmV0dXJuIFRSQUNFX0NPTVBPU0lURV9OQVRVUkU7CisJaWYoIGlkID09ICJ0cmFjZSIgICAgICAgICkgcmV0dXJuIFRSQUNFX0NPTVBPU0lURV9OQVRVUkU7CisJaWYoIGlkID09ICJwb2ludCIgICAgICAgICkgcmV0dXJuIFRSQUNFX0NPTVBPU0lURV9OQVRVUkU7CisKKwlyZXR1cm4gVFJBQ0VfVU5ERUZJTkVEX05BVFVSRTsKK30KKworCitib29sIEVOVU1fVFJBQ0VfUE9JTlQ6OmlzX2NvbShFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9OQVRVUkUgbmF0dXJlKQoreworCXN3aXRjaCggbmF0dXJlICkKKwl7CisJCWNhc2UgVFJBQ0VfQ09NX05BVFVSRSAgICAgOgorCQljYXNlIFRSQUNFX0NIQU5ORUxfTkFUVVJFIDoKKwkJY2FzZSBUUkFDRV9NRVNTQUdFX05BVFVSRSA6CisJCWNhc2UgVFJBQ0VfUE9SVF9OQVRVUkUgICAgOgorCQljYXNlIFRSQUNFX1NJR05BTF9OQVRVUkUgIDogcmV0dXJuKCB0cnVlICk7CisKKwkJZGVmYXVsdCAgICAgICAgICAgICAgICAgICA6IHJldHVybiggZmFsc2UgKTsKKwl9Cit9CisKK2Jvb2wgRU5VTV9UUkFDRV9QT0lOVDo6aXNfY29tKGNvbnN0IHN0ZDo6c3RyaW5nICYgaWQpCit7CisJaWYoIChpZCA9PSAiY29tIiAgICAgKSB8fAorCQkoaWQgPT0gImNoYW5uZWwiICkgfHwKKwkJKGlkID09ICJtZXNzYWdlIiApIHx8CisJCShpZCA9PSAicG9ydCIgICAgKSB8fAorCQkoaWQgPT0gInNpZ25hbCIgICkgKQorCXsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKK3N0ZDo6c3RyaW5nIEVOVU1fVFJBQ0VfUE9JTlQ6OnRvX3N0cmluZyhFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9OQVRVUkUgbmF0dXJlKQoreworCXN3aXRjaCggbmF0dXJlICkKKwl7CisJCWNhc2UgVFJBQ0VfQ09NUE9TSVRFX05BVFVSRSAgICA6IHJldHVybiggImNvbXBvc2l0ZSIgKTsKKworCQljYXNlIFRSQUNFX0NPTV9OQVRVUkUgICAgICAgICAgOiByZXR1cm4oICJjb20iICAgICAgICk7CisKKwkJY2FzZSBUUkFDRV9DSEFOTkVMX05BVFVSRSAgICAgIDogcmV0dXJuKCAiY2hhbm5lbCIgICApOworCQljYXNlIFRSQUNFX01FU1NBR0VfTkFUVVJFICAgICAgOiByZXR1cm4oICJtZXNzYWdlIiAgICk7CisKKwkJY2FzZSBUUkFDRV9QT1JUX05BVFVSRSAgICAgICAgIDogcmV0dXJuKCAicG9ydCIgICAgICApOworCQljYXNlIFRSQUNFX1NJR05BTF9OQVRVUkUgICAgICAgOiByZXR1cm4oICJzaWduYWwiICAgICk7CisKKwkJY2FzZSBUUkFDRV9USU1FX05BVFVSRSAgICAgICAgIDogcmV0dXJuKCAidGltZSIgICAgICApOworCQljYXNlIFRSQUNFX1ZBUklBQkxFX05BVFVSRSAgICAgOiByZXR1cm4oICJ2YXJpYWJsZSIgICk7CisJCWNhc2UgVFJBQ0VfQlVGRkVSX05BVFVSRSAgICAgICA6IHJldHVybiggImJ1ZmZlciIgICAgKTsKKworCQljYXNlIFRSQUNFX0ZPUk1VTEFfTkFUVVJFICAgICAgOiByZXR1cm4oICJmb3JtdWxhIiAgICk7CisKKwkJY2FzZSBUUkFDRV9DT05ESVRJT05fTkFUVVJFICAgIDogcmV0dXJuKCAiY29uZGl0aW9uIiApOworCQljYXNlIFRSQUNFX0RFQ0lTSU9OX05BVFVSRSAgICAgOiByZXR1cm4oICJkZWNpc2lvbiIgICk7CisKKwkJY2FzZSBUUkFDRV9QQVRIX0NPTkRJVElPTl9OQVRVUkUgIDogcmV0dXJuKCAicGF0aCNjb25kaXRvbiIgKTsKKwkJY2FzZSBUUkFDRV9OT0RFX0NPTkRJVElPTl9OQVRVUkUgIDogcmV0dXJuKCAibm9kZSNjb25kaXRvbiIgKTsKKworCQljYXNlIFRSQUNFX1BBVEhfQ09ORElUSU9OX05BVFVSRV9MRUFGIDogcmV0dXJuKCAicGF0aCNjb25kaXRvbiNsZWFmIiApOworCQljYXNlIFRSQUNFX05PREVfQ09ORElUSU9OX05BVFVSRV9MRUFGIDogcmV0dXJuKCAibm9kZSNjb25kaXRvbiNsZWFmIiApOworCisJCWNhc2UgVFJBQ0VfUEFUSF9USU1FRF9DT05ESVRJT05fTkFUVVJFOiByZXR1cm4oICJwYXRoI3RpbWVkI2NvbmRpdG9uIiApOworCQljYXNlIFRSQUNFX05PREVfVElNRURfQ09ORElUSU9OX05BVFVSRTogcmV0dXJuKCAibm9kZSN0aW1lZCNjb25kaXRvbiIgKTsKKworCQljYXNlIFRSQUNFX1BBVEhfVElNRURfQ09ORElUSU9OX05BVFVSRV9MRUFGOiByZXR1cm4oICJwYXRoI3RpbWVkI2NvbmRpdG9uI2xlYWYiICk7CisJCWNhc2UgVFJBQ0VfTk9ERV9USU1FRF9DT05ESVRJT05fTkFUVVJFX0xFQUY6IHJldHVybiggIm5vZGUjdGltZWQjY29uZGl0b24jbGVhZiIgKTsKKworCQljYXNlIFRSQUNFX01BQ0hJTkVfTkFUVVJFICAgICAgOiByZXR1cm4oICJtYWNoaW5lIiAgICAgICk7CisJCWNhc2UgVFJBQ0VfU1RBVEVfTkFUVVJFICAgICAgICA6IHJldHVybiggInN0YXRlIiAgICAgICAgKTsKKwkJY2FzZSBUUkFDRV9TVEFURU1BQ0hJTkVfTkFUVVJFIDogcmV0dXJuKCAic3RhdGVtYWNoaW5lIiApOworCisJCWNhc2UgVFJBQ0VfVFJBTlNJVElPTl9OQVRVUkUgICA6IHJldHVybiggInRyYW5zaXRpb24iICk7CisJCWNhc2UgVFJBQ0VfUk9VVElORV9OQVRVUkUgICAgICA6IHJldHVybiggInJvdXRpbmUiICAgICk7CisKKwkJY2FzZSBUUkFDRV9SVU5OQUJMRV9OQVRVUkUgICAgIDogcmV0dXJuKCAicnVubmFibGUiICk7CisKKwkJY2FzZSBUUkFDRV9TVEVQX0hFQURFUl9OQVRVUkUgIDogcmV0dXJuKCAic3RlcCNoZWFkZXIiICk7CisJCWNhc2UgVFJBQ0VfU1RFUF9CRUdJTl9OQVRVUkUgICA6IHJldHVybiggInN0ZXAjYmVnaW4iICApOworCQljYXNlIFRSQUNFX1NURVBfRU5EX05BVFVSRSAgICAgOiByZXR1cm4oICJzdGVwI2VuZCIgICAgKTsKKworCQljYXNlIFRSQUNFX0lOSVRfSEVBREVSX05BVFVSRSAgOiByZXR1cm4oICJpbml0I2hlYWRlciIgKTsKKwkJY2FzZSBUUkFDRV9JTklUX0JFR0lOX05BVFVSRSAgIDogcmV0dXJuKCAiaW5pdCNiZWdpbiIgICk7CisJCWNhc2UgVFJBQ0VfSU5JVF9FTkRfTkFUVVJFICAgICA6IHJldHVybiggImluaXQjZW5kIiAgICApOworCisJCWNhc2UgVFJBQ0VfQ09NTUVOVF9OQVRVUkUgICAgICA6IHJldHVybiggImNvbW1lbnQiICk7CisJCWNhc2UgVFJBQ0VfU0VQQVJBVE9SX05BVFVSRSAgICA6IHJldHVybiggInNlcGFyYXRvciIgKTsKKwkJY2FzZSBUUkFDRV9ORVdMSU5FX05BVFVSRSAgICAgIDogcmV0dXJuKCAibmV3bGluZSIgKTsKKworCQljYXNlIFRSQUNFX1VOREVGSU5FRF9OQVRVUkUgICAgOiByZXR1cm4oICJ1bmRlZmluZWQ8cG9pbnQjbmF0dXJlPiIgKTsKKworCQlkZWZhdWx0ICAgICAgICAgICAgICAgICAgICAgICAgOiByZXR1cm4oICJ1bmtub3duPHBvaW50I25hdHVyZT4iICAgKTsKKwl9Cit9CisKKworc3RkOjpzdHJpbmcgRU5VTV9UUkFDRV9QT0lOVDo6dG9fdWlkKAorCQlFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9OQVRVUkUgbmF0dXJlLCBBVk1fT1BDT0RFIG9wKQoreworCXN3aXRjaCggbmF0dXJlICkKKwl7CisJCWNhc2UgVFJBQ0VfQ09NUE9TSVRFX05BVFVSRSAgICA6IHJldHVybiggImNvbXBvc2l0ZSIgKTsKKworCQljYXNlIFRSQUNFX0NPTV9OQVRVUkUgICAgICAgICAgOiByZXR1cm4oICJjb20iICAgICApOworCisJCWNhc2UgVFJBQ0VfQ0hBTk5FTF9OQVRVUkUgICAgICA6IHJldHVybiggImNoYW5uZWwiICk7CisJCWNhc2UgVFJBQ0VfTUVTU0FHRV9OQVRVUkUgICAgICA6IHJldHVybiggIm1lc3NhZ2UiICk7CisKKwkJY2FzZSBUUkFDRV9QT1JUX05BVFVSRSAgICAgICAgIDogcmV0dXJuKCAicG9ydCIgICAgKTsKKwkJY2FzZSBUUkFDRV9TSUdOQUxfTkFUVVJFICAgICAgIDogcmV0dXJuKCAic2lnbmFsIiAgKTsKKworCQljYXNlIFRSQUNFX1RJTUVfTkFUVVJFICAgICAgICAgOiByZXR1cm4oICJ0aW1lIiAgKTsKKworCQljYXNlIFRSQUNFX1ZBUklBQkxFX05BVFVSRSAgICAgOgorCQl7CisJCQlzd2l0Y2goIG9wICkKKwkJCXsKKwkJCQljYXNlIEFWTV9PUENPREVfQVNTSUdOICAgICAgICAgOiByZXR1cm4oICJhc3NpZ24iICAgKTsKKwkJCQljYXNlIEFWTV9PUENPREVfQVNTSUdOX05FV0ZSRVNIOiByZXR1cm4oICJuZXdmcmVzaCIgKTsKKwkJCQlkZWZhdWx0ICAgICAgICAgICAgICAgICAgICAgICAgOiByZXR1cm4oICJ2YXJpYWJsZSIgKTsKKwkJCX0KKwkJCXJldHVybiggInZhcmlhYmxlIiApOworCQl9CisKKwkJY2FzZSBUUkFDRV9CVUZGRVJfTkFUVVJFICAgICAgIDogcmV0dXJuKCAiYnVmZmVyIiAgICApOworCisJCWNhc2UgVFJBQ0VfRk9STVVMQV9OQVRVUkUgICAgICA6IHJldHVybiggImZvcm11bGEiICAgKTsKKworCQljYXNlIFRSQUNFX0NPTkRJVElPTl9OQVRVUkUgICAgOiByZXR1cm4oICJjb25kaXRpb24iICk7CisJCWNhc2UgVFJBQ0VfREVDSVNJT05fTkFUVVJFICAgICA6IHJldHVybiggImRlY2lzaW9uIiAgKTsKKworCQljYXNlIFRSQUNFX1BBVEhfQ09ORElUSU9OX05BVFVSRSA6IHJldHVybiggInBhdGgjY29uZGl0b24iICk7CisJCWNhc2UgVFJBQ0VfTk9ERV9DT05ESVRJT05fTkFUVVJFIDogcmV0dXJuKCAibm9kZSNjb25kaXRvbiIgKTsKKworCQljYXNlIFRSQUNFX1BBVEhfQ09ORElUSU9OX05BVFVSRV9MRUFGOiByZXR1cm4oICJwYXRoI2NvbmRpdG9uI2xlYWYiICk7CisJCWNhc2UgVFJBQ0VfTk9ERV9DT05ESVRJT05fTkFUVVJFX0xFQUY6IHJldHVybiggIm5vZGUjY29uZGl0b24jbGVhZiIgKTsKKworCQljYXNlIFRSQUNFX1BBVEhfVElNRURfQ09ORElUSU9OX05BVFVSRTogcmV0dXJuKCAicGF0aCN0aW1lZCNjb25kaXRvbiIgKTsKKwkJY2FzZSBUUkFDRV9OT0RFX1RJTUVEX0NPTkRJVElPTl9OQVRVUkU6IHJldHVybiggIm5vZGUjdGltZWQjY29uZGl0b24iICk7CisKKwkJY2FzZSBUUkFDRV9QQVRIX1RJTUVEX0NPTkRJVElPTl9OQVRVUkVfTEVBRjogcmV0dXJuKCAicGF0aCN0aW1lZCNjb25kaXRvbiNsZWFmIiApOworCQljYXNlIFRSQUNFX05PREVfVElNRURfQ09ORElUSU9OX05BVFVSRV9MRUFGOiByZXR1cm4oICJub2RlI3RpbWVkI2NvbmRpdG9uI2xlYWYiICk7CisKKwkJY2FzZSBUUkFDRV9NQUNISU5FX05BVFVSRSAgICAgIDogcmV0dXJuKCAibWFjaGluZSIgICAgICApOworCQljYXNlIFRSQUNFX1NUQVRFX05BVFVSRSAgICAgICAgOiByZXR1cm4oICJzdGF0ZSIgICAgICAgICk7CisJCWNhc2UgVFJBQ0VfU1RBVEVNQUNISU5FX05BVFVSRSA6IHJldHVybiggInN0YXRlbWFjaGluZSIgKTsKKworCQljYXNlIFRSQUNFX1RSQU5TSVRJT05fTkFUVVJFICAgOiByZXR1cm4oICJ0cmFuc2l0aW9uIiAgICk7CisJCWNhc2UgVFJBQ0VfUk9VVElORV9OQVRVUkUgICAgICA6IHJldHVybiggInJvdXRpbmUiICAgICAgKTsKKworCQljYXNlIFRSQUNFX1JVTk5BQkxFX05BVFVSRSAgICAgOiByZXR1cm4oICJydW5uYWJsZSIgICAgICk7CisKKwkJY2FzZSBUUkFDRV9TVEVQX0hFQURFUl9OQVRVUkUgIDogcmV0dXJuKCAic3RlcCNoZWFkZXIiICApOworCQljYXNlIFRSQUNFX1NURVBfQkVHSU5fTkFUVVJFICAgOiByZXR1cm4oICJzdGVwI2JlZ2luIiAgICk7CisJCWNhc2UgVFJBQ0VfU1RFUF9FTkRfTkFUVVJFICAgICA6IHJldHVybiggInN0ZXAjZW5kIiAgICAgKTsKKworCQljYXNlIFRSQUNFX0lOSVRfSEVBREVSX05BVFVSRSAgOiByZXR1cm4oICJpbml0I2hlYWRlciIgICk7CisJCWNhc2UgVFJBQ0VfSU5JVF9CRUdJTl9OQVRVUkUgICA6IHJldHVybiggImluaXQjYmVnaW4iICAgKTsKKwkJY2FzZSBUUkFDRV9JTklUX0VORF9OQVRVUkUgICAgIDogcmV0dXJuKCAiaW5pdCNlbmQiICAgICApOworCisJCWNhc2UgVFJBQ0VfQ09NTUVOVF9OQVRVUkUgICAgICA6IHJldHVybiggImNvbW1lbnQiICAgICAgKTsKKwkJY2FzZSBUUkFDRV9TRVBBUkFUT1JfTkFUVVJFICAgIDogcmV0dXJuKCAic2VwYXJhdG9yIiAgICApOworCQljYXNlIFRSQUNFX05FV0xJTkVfTkFUVVJFICAgICAgOiByZXR1cm4oICJuZXdsaW5lIiAgICAgICk7CisKKwkJY2FzZSBUUkFDRV9VTkRFRklORURfTkFUVVJFICAgIDogcmV0dXJuKCAidW5kZWZpbmVkPHBvaW50I25hdHVyZT4iICk7CisKKwkJZGVmYXVsdCAgICAgICAgICAgICAgICAgICAgICAgIDogcmV0dXJuKCAidW5rbm93bjxwb2ludCNuYXR1cmU+IiAgICk7CisJfQorfQorCisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbGliL0lUcmFjZVBvaW50LmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbGliL0lUcmFjZVBvaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc2NTI1ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9saWIvSVRyYWNlUG9pbnQuaApAQCAtMCwwICsxLDEzNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDI2IGp1aW4gMjAxNAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIElUUkFDRVBPSU5UX0hfCisjZGVmaW5lIElUUkFDRVBPSU5UX0hfCisKKyNpbmNsdWRlIDxmbWwvbGliL0lDb21Qb2ludC5oPgorCisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yTGliLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIElUcmFjZVBvaW50Cit7CitwdWJsaWM6CisKKworfTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVFJBQ0UgUE9JTlQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NsYXNzIEVOVU1fVFJBQ0VfUE9JTlQKK3sKKworcHVibGljOgorCisJZW51bSBUUkFDRV9OQVRVUkUKKwl7CisJCVRSQUNFX0NPTVBPU0lURV9OQVRVUkUsCisKKworCQlUUkFDRV9DT01fTkFUVVJFLAorCisJCVRSQUNFX0NIQU5ORUxfTkFUVVJFLAorCisJCVRSQUNFX01FU1NBR0VfTkFUVVJFLAorCisJCVRSQUNFX1BPUlRfTkFUVVJFLAorCisJCVRSQUNFX1NJR05BTF9OQVRVUkUsCisKKwkJVFJBQ0VfQlVGRkVSX05BVFVSRSwKKworCisJCVRSQUNFX1RJTUVfTkFUVVJFLAorCisJCVRSQUNFX1ZBUklBQkxFX05BVFVSRSwKKworCQlUUkFDRV9GT1JNVUxBX05BVFVSRSwKKworCQlUUkFDRV9DT05ESVRJT05fTkFUVVJFLAorCQlUUkFDRV9ERUNJU0lPTl9OQVRVUkUsCisKKwkJVFJBQ0VfUEFUSF9DT05ESVRJT05fTkFUVVJFLAorCQlUUkFDRV9QQVRIX0NPTkRJVElPTl9OQVRVUkVfTEVBRiwKKworCQlUUkFDRV9QQVRIX1RJTUVEX0NPTkRJVElPTl9OQVRVUkUsCisJCVRSQUNFX1BBVEhfVElNRURfQ09ORElUSU9OX05BVFVSRV9MRUFGLAorCisJCVRSQUNFX05PREVfQ09ORElUSU9OX05BVFVSRSwKKwkJVFJBQ0VfTk9ERV9DT05ESVRJT05fTkFUVVJFX0xFQUYsCisKKwkJVFJBQ0VfTk9ERV9USU1FRF9DT05ESVRJT05fTkFUVVJFLAorCQlUUkFDRV9OT0RFX1RJTUVEX0NPTkRJVElPTl9OQVRVUkVfTEVBRiwKKworCQlUUkFDRV9NQUNISU5FX05BVFVSRSwKKworCQlUUkFDRV9TVEFURV9OQVRVUkUsCisKKwkJVFJBQ0VfU1RBVEVNQUNISU5FX05BVFVSRSwKKworCisJCVRSQUNFX1RSQU5TSVRJT05fTkFUVVJFLAorCisJCVRSQUNFX1JPVVRJTkVfTkFUVVJFLAorCisJCVRSQUNFX1JVTk5BQkxFX05BVFVSRSwKKworCQkvLyBWSVJUVUFMIEVMRU1FTlQKKwkJVFJBQ0VfQ09NTUVOVF9OQVRVUkUsCisJCVRSQUNFX1NFUEFSQVRPUl9OQVRVUkUsCisJCVRSQUNFX05FV0xJTkVfTkFUVVJFLAorCisJCVRSQUNFX0lOSVRfSEVBREVSX05BVFVSRSwKKwkJVFJBQ0VfSU5JVF9CRUdJTl9OQVRVUkUsCisJCVRSQUNFX0lOSVRfRU5EX05BVFVSRSwKKworCQlUUkFDRV9TVEVQX0hFQURFUl9OQVRVUkUsCisJCVRSQUNFX1NURVBfQkVHSU5fTkFUVVJFLAorCQlUUkFDRV9TVEVQX0VORF9OQVRVUkUsCisKKwkJVFJBQ0VfVU5ERUZJTkVEX05BVFVSRQorCX07CisKKwkvKioKKwkgKiBTVEFUSUMKKwkgKi8KKwlzdGF0aWMgVFJBQ0VfTkFUVVJFIHRvX25hdHVyZShJQ29tUG9pbnQ6OkVOVU1fSU9fTkFUVVJFIGlvKTsKKworCXN0YXRpYyBUUkFDRV9OQVRVUkUgdG9fbmF0dXJlKGNvbnN0IHN0ZDo6c3RyaW5nICYgaWQpOworCisKKwlzdGF0aWMgYm9vbCBpc19jb20oVFJBQ0VfTkFUVVJFIG5hdHVyZSk7CisKKwlzdGF0aWMgYm9vbCBpc19jb20oY29uc3Qgc3RkOjpzdHJpbmcgJiBpZCk7CisKKworCXN0YXRpYyBzdGQ6OnN0cmluZyB0b19zdHJpbmcoVFJBQ0VfTkFUVVJFIG5hdHVyZSk7CisKKwlzdGF0aWMgc3RkOjpzdHJpbmcgdG9fdWlkKFRSQUNFX05BVFVSRSBuYXR1cmUsIEFWTV9PUENPREUgb3ApOworCit9OworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworCisjZW5kaWYgLyogSVRSQUNFUE9JTlRfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9saWIvSVR5cGVTcGVjaWZpZXIuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL2xpYi9JVHlwZVNwZWNpZmllci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI1ZjM3MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9saWIvSVR5cGVTcGVjaWZpZXIuY3BwCkBAIC0wLDAgKzEsNTEzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjcgZsOpdnIuIDIwMTMKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIklUeXBlU3BlY2lmaWVyLmgiCisKKyNpbmNsdWRlIDxjb21tb24vQkYuaD4KKworI2luY2x1ZGUgPGZtbC90eXBlL0Jhc2VUeXBlU3BlY2lmaWVyLmg+CisjaW5jbHVkZSA8Zm1sL3R5cGUvQ29udGFpbmVyVHlwZVNwZWNpZmllci5oPgorI2luY2x1ZGUgPGZtbC90eXBlL0ludGVydmFsVHlwZVNwZWNpZmllci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ0xPQ0sgVFlQRQorLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIElUeXBlU3BlY2lmaWVyOjp3ZWFrbHlUeXBlZENsb2NrSW50ZWdlcigpIGNvbnN0Cit7CisJcmV0dXJuKCAoZ2V0VHlwZVNwZWNpZmllcktpbmQoKSA9PSBUWVBFX0NMT0NLX1NQRUNJRklFUikgJiYKKwkJCSggdGhpc1R5cGVTcGVjaWZpZXIoKS0+aXNub3Q8IENvbnRhaW5lclR5cGVTcGVjaWZpZXIgPigpIHx8CisJCQkJdGhpc1R5cGVTcGVjaWZpZXIoKS0+dG88IENvbnRhaW5lclR5cGVTcGVjaWZpZXIgPigpLT4KKwkJCQkJZ2V0Q29udGVudHNUeXBlU3BlY2lmaWVyKCkud2Vha2x5VHlwZWRJbnRlZ2VyKCkgKSApOworfQorCitib29sIElUeXBlU3BlY2lmaWVyOjp3ZWFrbHlUeXBlZENsb2NrUmF0aW9uYWwoKSBjb25zdAoreworCXJldHVybiggKGdldFR5cGVTcGVjaWZpZXJLaW5kKCkgPT0gVFlQRV9DTE9DS19TUEVDSUZJRVIpICYmCisJCQkoIHRoaXNUeXBlU3BlY2lmaWVyKCktPmlzbm90PCBDb250YWluZXJUeXBlU3BlY2lmaWVyID4oKSB8fAorCQkJCXRoaXNUeXBlU3BlY2lmaWVyKCktPnRvPCBDb250YWluZXJUeXBlU3BlY2lmaWVyID4oKS0+CisJCQkJCWdldENvbnRlbnRzVHlwZVNwZWNpZmllcigpLndlYWtseVR5cGVkUmF0aW9uYWwoKSApICk7Cit9CisKK2Jvb2wgSVR5cGVTcGVjaWZpZXI6OndlYWtseVR5cGVkQ2xvY2tGbG9hdCgpIGNvbnN0Cit7CisJcmV0dXJuKCAoZ2V0VHlwZVNwZWNpZmllcktpbmQoKSA9PSBUWVBFX0NMT0NLX1NQRUNJRklFUikgJiYKKwkJCSggdGhpc1R5cGVTcGVjaWZpZXIoKS0+aXNub3Q8IENvbnRhaW5lclR5cGVTcGVjaWZpZXIgPigpIHx8CisJCQkJdGhpc1R5cGVTcGVjaWZpZXIoKS0+dG88IENvbnRhaW5lclR5cGVTcGVjaWZpZXIgPigpLT4KKwkJCQkJZ2V0Q29udGVudHNUeXBlU3BlY2lmaWVyKCkud2Vha2x5VHlwZWRGbG9hdCgpICkgKTsKK30KKworCitib29sIElUeXBlU3BlY2lmaWVyOjp3ZWFrbHlUeXBlZENsb2NrUmVhbCgpIGNvbnN0Cit7CisJcmV0dXJuKCAoZ2V0VHlwZVNwZWNpZmllcktpbmQoKSA9PSBUWVBFX0NMT0NLX1NQRUNJRklFUikgJiYKKwkJCSggdGhpc1R5cGVTcGVjaWZpZXIoKS0+aXNub3Q8IENvbnRhaW5lclR5cGVTcGVjaWZpZXIgPigpIHx8CisJCQkJdGhpc1R5cGVTcGVjaWZpZXIoKS0+dG88IENvbnRhaW5lclR5cGVTcGVjaWZpZXIgPigpLT4KKwkJCQkJZ2V0Q29udGVudHNUeXBlU3BlY2lmaWVyKCkud2Vha2x5VHlwZWRSZWFsKCkgKSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFRJTUUgVFlQRQorLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIElUeXBlU3BlY2lmaWVyOjp3ZWFrbHlUeXBlZFRpbWVJbnRlZ2VyKCkgY29uc3QKK3sKKwlyZXR1cm4oIChnZXRUeXBlU3BlY2lmaWVyS2luZCgpID09IFRZUEVfRElTQ1JFVEVfVElNRV9TUEVDSUZJRVIpIHx8CisJCQkoIGlzVHlwZWRUaW1lKCkgJiYKKwkJCSggdGhpc1R5cGVTcGVjaWZpZXIoKS0+aXNub3Q8IENvbnRhaW5lclR5cGVTcGVjaWZpZXIgPigpIHx8CisJCQl0aGlzVHlwZVNwZWNpZmllcigpLT50bzwgQ29udGFpbmVyVHlwZVNwZWNpZmllciA+KCktPgorCQkJCWdldENvbnRlbnRzVHlwZVNwZWNpZmllcigpLndlYWtseVR5cGVkSW50ZWdlcigpICkgKSApOworfQorCisKK2Jvb2wgSVR5cGVTcGVjaWZpZXI6OndlYWtseVR5cGVkVGltZVJhdGlvbmFsKCkgY29uc3QKK3sKKwlyZXR1cm4oIGhhc1R5cGVkVGltZSgpICYmCisJCQkoIHRoaXNUeXBlU3BlY2lmaWVyKCktPmlzbm90PCBDb250YWluZXJUeXBlU3BlY2lmaWVyID4oKSB8fAorCQkJCXRoaXNUeXBlU3BlY2lmaWVyKCktPnRvPCBDb250YWluZXJUeXBlU3BlY2lmaWVyID4oKS0+CisJCQkJCWdldENvbnRlbnRzVHlwZVNwZWNpZmllcigpLndlYWtseVR5cGVkUmF0aW9uYWwoKSApICk7Cit9CisKK2Jvb2wgSVR5cGVTcGVjaWZpZXI6OndlYWtseVR5cGVkVGltZUZsb2F0KCkgY29uc3QKK3sKKwlyZXR1cm4oIChnZXRUeXBlU3BlY2lmaWVyS2luZCgpID09IFRZUEVfQ09OVElOVU9VU19USU1FX1NQRUNJRklFUikgfHwKKwkJCSggaXNUeXBlZFRpbWUoKSAmJgorCQkJCSggdGhpc1R5cGVTcGVjaWZpZXIoKS0+aXNub3Q8IENvbnRhaW5lclR5cGVTcGVjaWZpZXIgPigpIHx8CisJCQkJCXRoaXNUeXBlU3BlY2lmaWVyKCktPnRvPCBDb250YWluZXJUeXBlU3BlY2lmaWVyID4oKS0+CisJCQkJCWdldENvbnRlbnRzVHlwZVNwZWNpZmllcigpLndlYWtseVR5cGVkRmxvYXQoKSApICkgKTsKKwl9CisKK2Jvb2wgSVR5cGVTcGVjaWZpZXI6OndlYWtseVR5cGVkVGltZVJlYWwoKSBjb25zdAoreworCXJldHVybiggKGdldFR5cGVTcGVjaWZpZXJLaW5kKCkgPT0gVFlQRV9DT05USU5VT1VTX1RJTUVfU1BFQ0lGSUVSKSB8fAorCQkJKCBpc1R5cGVkVGltZSgpICYmCisJCQkJKCB0aGlzVHlwZVNwZWNpZmllcigpLT5pc25vdDwgQ29udGFpbmVyVHlwZVNwZWNpZmllciA+KCkgfHwKKwkJCQl0aGlzVHlwZVNwZWNpZmllcigpLT50bzwgQ29udGFpbmVyVHlwZVNwZWNpZmllciA+KCktPgorCQkJCQlnZXRDb250ZW50c1R5cGVTcGVjaWZpZXIoKS53ZWFrbHlUeXBlZFJlYWwoKSApICkgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDTE9DSy9USU1FIFRZUEUKKy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBJVHlwZVNwZWNpZmllcjo6d2Vha2x5VHlwZWRDbG9ja1RpbWVJbnRlZ2VyKCkgY29uc3QKK3sKKwlyZXR1cm4oIChnZXRUeXBlU3BlY2lmaWVyS2luZCgpID09IFRZUEVfRElTQ1JFVEVfVElNRV9TUEVDSUZJRVIpIHx8CisJCQkoIGlzVHlwZWRDbG9ja1RpbWUoKSAmJgorCQkJCSggdGhpc1R5cGVTcGVjaWZpZXIoKS0+aXNub3Q8IENvbnRhaW5lclR5cGVTcGVjaWZpZXIgPigpIHx8CisJCQkJCXRoaXNUeXBlU3BlY2lmaWVyKCktPnRvPCBDb250YWluZXJUeXBlU3BlY2lmaWVyID4oKS0+CisJCQkJCWdldENvbnRlbnRzVHlwZVNwZWNpZmllcigpLndlYWtseVR5cGVkSW50ZWdlcigpICkgKSApOworfQorCitib29sIElUeXBlU3BlY2lmaWVyOjp3ZWFrbHlUeXBlZENsb2NrVGltZVJhdGlvbmFsKCkgY29uc3QKK3sKKwlyZXR1cm4oIGhhc1R5cGVkQ2xvY2tUaW1lKCkgJiYKKwkJCSggdGhpc1R5cGVTcGVjaWZpZXIoKS0+aXNub3Q8IENvbnRhaW5lclR5cGVTcGVjaWZpZXIgPigpIHx8CisJCQl0aGlzVHlwZVNwZWNpZmllcigpLT50bzwgQ29udGFpbmVyVHlwZVNwZWNpZmllciA+KCktPgorCQkJCWdldENvbnRlbnRzVHlwZVNwZWNpZmllcigpLndlYWtseVR5cGVkUmF0aW9uYWwoKSApICk7Cit9CisKK2Jvb2wgSVR5cGVTcGVjaWZpZXI6OndlYWtseVR5cGVkQ2xvY2tUaW1lRmxvYXQoKSBjb25zdAoreworCXJldHVybiggKGdldFR5cGVTcGVjaWZpZXJLaW5kKCkgPT0gVFlQRV9DT05USU5VT1VTX1RJTUVfU1BFQ0lGSUVSKSB8fAorCQkJKCBpc1R5cGVkQ2xvY2tUaW1lKCkgJiYKKwkJCQkoIHRoaXNUeXBlU3BlY2lmaWVyKCktPmlzbm90PCBDb250YWluZXJUeXBlU3BlY2lmaWVyID4oKSAmJgorCQkJCQl0aGlzVHlwZVNwZWNpZmllcigpLT50bzwgQ29udGFpbmVyVHlwZVNwZWNpZmllciA+KCktPgorCQkJCQlnZXRDb250ZW50c1R5cGVTcGVjaWZpZXIoKS53ZWFrbHlUeXBlZEZsb2F0KCkgKSApICk7Cit9CisKK2Jvb2wgSVR5cGVTcGVjaWZpZXI6OndlYWtseVR5cGVkQ2xvY2tUaW1lUmVhbCgpIGNvbnN0Cit7CisJcmV0dXJuKCAoZ2V0VHlwZVNwZWNpZmllcktpbmQoKSA9PSBUWVBFX0NPTlRJTlVPVVNfVElNRV9TUEVDSUZJRVIpIHx8CisJCQkoIGlzVHlwZWRDbG9ja1RpbWUoKSAmJgorCQkJCSggdGhpc1R5cGVTcGVjaWZpZXIoKS0+aXNub3Q8IENvbnRhaW5lclR5cGVTcGVjaWZpZXIgPigpIHx8CisJCQkJCXRoaXNUeXBlU3BlY2lmaWVyKCktPnRvPCBDb250YWluZXJUeXBlU3BlY2lmaWVyID4oKS0+CisJCQkJCWdldENvbnRlbnRzVHlwZVNwZWNpZmllcigpLndlYWtseVR5cGVkUmVhbCgpICkgKSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIElOVEVHRVIgVFlQRQorLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIElUeXBlU3BlY2lmaWVyOjp3ZWFrbHlUeXBlZFVJbnRlZ2VyKCkgY29uc3QKK3sKKwlyZXR1cm4oIGlzVHlwZWRVSW50ZWdlcigpIHx8CisJCQl3ZWFrbHlUeXBlZENsb2NrVGltZUludGVnZXIoKSB8fAorCQkJKGlzVHlwZWRJbnRlcnZhbCgpICYmICh0aGlzVHlwZVNwZWNpZmllcigpICE9IE5VTEwpICYmCisJCQkJCXRoaXNUeXBlU3BlY2lmaWVyKCktPmFzPCBJbnRlcnZhbFR5cGVTcGVjaWZpZXIgPigpLT4KKwkJCQkJCWdldFN1cHBvcnRUeXBlU3BlY2lmaWVyKCkud2Vha2x5VHlwZWRVSW50ZWdlcigpKSApOworfQorCitib29sIElUeXBlU3BlY2lmaWVyOjp3ZWFrbHlUeXBlZEludGVnZXIoKSBjb25zdAoreworCXJldHVybiggaXNUeXBlZEludGVnZXIoKSB8fCAvL2lzVHlwZWRVSW50ZWdlcigpIHx8CisJCQl3ZWFrbHlUeXBlZENsb2NrVGltZUludGVnZXIoKSB8fAorCQkJKCBpc1R5cGVkSW50ZXJ2YWwoKSAmJiAodGhpc1R5cGVTcGVjaWZpZXIoKSAhPSBOVUxMKSAmJgorCQkJdGhpc1R5cGVTcGVjaWZpZXIoKS0+YXM8IEludGVydmFsVHlwZVNwZWNpZmllciA+KCktPgorCQkJCWdldFN1cHBvcnRUeXBlU3BlY2lmaWVyKCkud2Vha2x5VHlwZWRJbnRlZ2VyKCkgKSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFJBVElPTkFMIFRZUEUKKy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBJVHlwZVNwZWNpZmllcjo6d2Vha2x5VHlwZWRVUmF0aW9uYWwoKSBjb25zdAoreworCXJldHVybiggaXNUeXBlZFVSYXRpb25hbCgpIHx8IHdlYWtseVR5cGVkVUludGVnZXIoKSB8fAorCQkJd2Vha2x5VHlwZWRDbG9ja1RpbWVSYXRpb25hbCgpIHx8CisJCQkoaXNUeXBlZEludGVydmFsKCkgJiYKKwkJCXRoaXNUeXBlU3BlY2lmaWVyKCktPmFzPCBJbnRlcnZhbFR5cGVTcGVjaWZpZXIgPigpCisJCQkJLT5nZXRTdXBwb3J0VHlwZVNwZWNpZmllcigpLndlYWtseVR5cGVkVVJhdGlvbmFsKCkpICk7Cit9CisKK2Jvb2wgSVR5cGVTcGVjaWZpZXI6OndlYWtseVR5cGVkUmF0aW9uYWwoKSBjb25zdAoreworCXJldHVybiggaXNUeXBlZFJhdGlvbmFsKCkgfHwgLy9pc1R5cGVkVVJhdGlvbmFsKCkgfHwKKwkJCXdlYWtseVR5cGVkSW50ZWdlcigpIHx8CisJCQl3ZWFrbHlUeXBlZENsb2NrVGltZVJhdGlvbmFsKCkgfHwKKwkJCSggaXNUeXBlZEludGVydmFsKCkgJiYKKwkJCQl0aGlzVHlwZVNwZWNpZmllcigpLT5hczwgSW50ZXJ2YWxUeXBlU3BlY2lmaWVyID4oKQorCQkJCQktPmdldFN1cHBvcnRUeXBlU3BlY2lmaWVyKCkud2Vha2x5VHlwZWRSYXRpb25hbCgpKSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEZMT0FUIFRZUEUKKy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBJVHlwZVNwZWNpZmllcjo6d2Vha2x5VHlwZWRVRmxvYXQoKSBjb25zdAoreworCXJldHVybiggaXNUeXBlZFVGbG9hdCgpIHx8IHdlYWtseVR5cGVkVVJhdGlvbmFsKCkgfHwKKwkJCXdlYWtseVR5cGVkQ2xvY2tUaW1lRmxvYXQoKSB8fAorCQkJKCBpc1R5cGVkSW50ZXJ2YWwoKSAmJgorCQkJdGhpc1R5cGVTcGVjaWZpZXIoKS0+YXM8IEludGVydmFsVHlwZVNwZWNpZmllciA+KCkKKwkJCQktPmdldFN1cHBvcnRUeXBlU3BlY2lmaWVyKCkud2Vha2x5VHlwZWRVRmxvYXQoKSkgKTsKK30KKworYm9vbCBJVHlwZVNwZWNpZmllcjo6d2Vha2x5VHlwZWRGbG9hdCgpIGNvbnN0Cit7CisJcmV0dXJuKCBpc1R5cGVkRmxvYXQoKSB8fCB3ZWFrbHlUeXBlZFJhdGlvbmFsKCkgfHwKKwkJCXdlYWtseVR5cGVkQ2xvY2tUaW1lRmxvYXQoKSB8fAorCQkJKCBpc1R5cGVkSW50ZXJ2YWwoKSAmJgorCQkJdGhpc1R5cGVTcGVjaWZpZXIoKS0+YXM8IEludGVydmFsVHlwZVNwZWNpZmllciA+KCkKKwkJCQktPmdldFN1cHBvcnRUeXBlU3BlY2lmaWVyKCkud2Vha2x5VHlwZWRGbG9hdCgpKSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFJFQUwgVFlQRQorLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIElUeXBlU3BlY2lmaWVyOjp3ZWFrbHlUeXBlZFVSZWFsKCkgY29uc3QKK3sKKwlyZXR1cm4oIGlzVHlwZWRVUmVhbCgpIHx8IHdlYWtseVR5cGVkVUZsb2F0KCkgfHwgd2Vha2x5VHlwZWRDbG9ja1RpbWVSZWFsKCkgfHwKKwkJCShpc1R5cGVkSW50ZXJ2YWwoKSAmJiB0aGlzVHlwZVNwZWNpZmllcigpLT5hczwgSW50ZXJ2YWxUeXBlU3BlY2lmaWVyID4oKQorCQkJCQktPmdldFN1cHBvcnRUeXBlU3BlY2lmaWVyKCkud2Vha2x5VHlwZWRVUmVhbCgpKSk7Cit9CisKK2Jvb2wgSVR5cGVTcGVjaWZpZXI6OndlYWtseVR5cGVkUmVhbCgpIGNvbnN0Cit7CisJcmV0dXJuKCBpc1R5cGVkUmVhbCgpIHx8IHdlYWtseVR5cGVkRmxvYXQoKSB8fCB3ZWFrbHlUeXBlZENsb2NrVGltZVJlYWwoKSB8fAorCQkJKGlzVHlwZWRJbnRlcnZhbCgpICYmIHRoaXNUeXBlU3BlY2lmaWVyKCktPmFzPCBJbnRlcnZhbFR5cGVTcGVjaWZpZXIgPigpCisJCQkJCS0+Z2V0U3VwcG9ydFR5cGVTcGVjaWZpZXIoKS53ZWFrbHlUeXBlZFJlYWwoKSkpOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVFlQRSBBTEdFQlJBCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBJVHlwZVNwZWNpZmllcjo6aXNUeXBlRmFtaWx5KGF2bV90eXBlX3NwZWNpZmllcl9raW5kX3QgdHlwZUZhbWlseSkKK3sKKwlpZiggKGdldFR5cGVTcGVjaWZpZXJLaW5kKCkgPT0gdHlwZUZhbWlseSkgICB8fAorCQkodHlwZUZhbWlseSA9PSBUWVBFX1VOSVZFUlNBTF9TUEVDSUZJRVIpIHx8CisJCSh0eXBlRmFtaWx5ID09IFRZUEVfVU5ERUZJTkVEX1NQRUNJRklFUikgKQorCXsKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCWVsc2Ugc3dpdGNoKCB0eXBlRmFtaWx5ICkKKwl7CisJCWNhc2UgVFlQRV9VTklWRVJTQUxfU1BFQ0lGSUVSOgorCQljYXNlIFRZUEVfVU5ERUZJTkVEX1NQRUNJRklFUjoKKwkJeworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQljYXNlIFRZUEVfUE9SVF9TUEVDSUZJRVI6CisJCWNhc2UgVFlQRV9TSUdOQUxfU1BFQ0lGSUVSOgorCQljYXNlIFRZUEVfTUVTU0FHRV9TUEVDSUZJRVI6CisJCXsKKwkJCXN3aXRjaCggZ2V0VHlwZVNwZWNpZmllcktpbmQoKSApCisJCQl7CisJCQkJY2FzZSBUWVBFX1BPUlRfU1BFQ0lGSUVSOgorCQkJCWNhc2UgVFlQRV9TSUdOQUxfU1BFQ0lGSUVSOgorCQkJCWNhc2UgVFlQRV9NRVNTQUdFX1NQRUNJRklFUjoKKwkJCQl7CisJCQkJCXJldHVybiggdHJ1ZSApOworCQkJCX0KKworCQkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKwl9Cit9CisKKworYm9vbCBJVHlwZVNwZWNpZmllcjo6d2Vha2x5VHlwZWQoYXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCBvdGhlclRTSykKK3sKKwlpZiggZ2V0VHlwZVNwZWNpZmllcktpbmQoKSA9PSBvdGhlclRTSyApCisJeworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisJZWxzZSBzd2l0Y2goIGdldFR5cGVTcGVjaWZpZXJLaW5kKCkgKQorCXsKKwkJY2FzZSBUWVBFX1BPU19JTlRFR0VSX1NQRUNJRklFUjoKKwkJeworCQkJcmV0dXJuKCB3ZWFrbHlUeXBlZFVJbnRlZ2VyKCkgKTsKKwkJfQorCQljYXNlIFRZUEVfVUlOVEVHRVJfU1BFQ0lGSUVSOgorCQl7CisJCQlyZXR1cm4oIHdlYWtseVR5cGVkVUludGVnZXIoKSApOworCQl9CisJCWNhc2UgVFlQRV9JTlRFR0VSX1NQRUNJRklFUjoKKwkJeworCQkJcmV0dXJuKCB3ZWFrbHlUeXBlZEludGVnZXIoKSApOworCQl9CisKKwkJY2FzZSBUWVBFX1VSQVRJT05BTF9TUEVDSUZJRVI6CisJCXsKKwkJCXJldHVybiggd2Vha2x5VHlwZWRVUmF0aW9uYWwoKSApOworCQl9CisJCWNhc2UgVFlQRV9SQVRJT05BTF9TUEVDSUZJRVI6CisJCXsKKwkJCXJldHVybiggd2Vha2x5VHlwZWRSYXRpb25hbCgpICk7CisJCX0KKworCQljYXNlIFRZUEVfVUZMT0FUX1NQRUNJRklFUjoKKwkJeworCQkJcmV0dXJuKCB3ZWFrbHlUeXBlZFVGbG9hdCgpICk7CisJCX0KKwkJY2FzZSBUWVBFX0ZMT0FUX1NQRUNJRklFUjoKKwkJeworCQkJcmV0dXJuKCB3ZWFrbHlUeXBlZEZsb2F0KCkgKTsKKwkJfQorCisJCWNhc2UgVFlQRV9VUkVBTF9TUEVDSUZJRVI6CisJCXsKKwkJCXJldHVybiggd2Vha2x5VHlwZWRVUmVhbCgpICk7CisJCX0KKwkJY2FzZSBUWVBFX1JFQUxfU1BFQ0lGSUVSOgorCQl7CisJCQlyZXR1cm4oIHdlYWtseVR5cGVkUmVhbCgpICk7CisJCX0KKworCQljYXNlIFRZUEVfQ0xPQ0tfU1BFQ0lGSUVSOgorCQljYXNlIFRZUEVfVElNRV9TUEVDSUZJRVI6CisJCWNhc2UgVFlQRV9DT05USU5VT1VTX1RJTUVfU1BFQ0lGSUVSOgorCQl7CisJCQlyZXR1cm4oIHdlYWtseVR5cGVkUmVhbCgpICk7CisJCX0KKwkJY2FzZSBUWVBFX0RJU0NSRVRFX1RJTUVfU1BFQ0lGSUVSOgorCQl7CisJCQlyZXR1cm4oIHdlYWtseVR5cGVkSW50ZWdlcigpICk7CisJCX0KKwkJZGVmYXVsdDoKKwkJeworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTlVNRVJJQyBUWVBFCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBJVHlwZVNwZWNpZmllcjo6aXNUeXBlZE51bWVyaWMoKSBjb25zdAoreworCXN3aXRjaCggZ2V0VHlwZVNwZWNpZmllcktpbmQoKSApCisJeworCQljYXNlIFRZUEVfSU5URUdFUl9TUEVDSUZJRVI6CisJCWNhc2UgVFlQRV9SQVRJT05BTF9TUEVDSUZJRVI6CisJCWNhc2UgVFlQRV9GTE9BVF9TUEVDSUZJRVI6CisJCWNhc2UgVFlQRV9SRUFMX1NQRUNJRklFUjoKKworCQljYXNlIFRZUEVfUE9TX0lOVEVHRVJfU1BFQ0lGSUVSOgorCisJCWNhc2UgVFlQRV9VSU5URUdFUl9TUEVDSUZJRVI6CisJCWNhc2UgVFlQRV9VUkFUSU9OQUxfU1BFQ0lGSUVSOgorCQljYXNlIFRZUEVfVUZMT0FUX1NQRUNJRklFUjoKKwkJY2FzZSBUWVBFX1VSRUFMX1NQRUNJRklFUjoKKworCQljYXNlIFRZUEVfQ0xPQ0tfU1BFQ0lGSUVSOgorCQljYXNlIFRZUEVfVElNRV9TUEVDSUZJRVI6CisJCWNhc2UgVFlQRV9DT05USU5VT1VTX1RJTUVfU1BFQ0lGSUVSOgorCQljYXNlIFRZUEVfRElTQ1JFVEVfVElNRV9TUEVDSUZJRVI6CisJCQlyZXR1cm4oIHRydWUgKTsKKworCQljYXNlIFRZUEVfSU5URVJWQUxfU1BFQ0lGSUVSOgorCQkJcmV0dXJuKCB0aGlzVHlwZVNwZWNpZmllcigpLT5hczwgSW50ZXJ2YWxUeXBlU3BlY2lmaWVyID4oKS0+CisJCQkJCWdldFN1cHBvcnRUeXBlU3BlY2lmaWVyKCkuaXNUeXBlZE51bWVyaWMoKSApOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4oIGZhbHNlICk7CisJfQorfQorCisKKy8qKgorICogVFlQRSBTUEVDSUZJQ0VSIEtJTkQgVE8gU1RSSU5HCisgKi8KKworc3RkOjpzdHJpbmcgSVR5cGVTcGVjaWZpZXI6OnN0clNwZWNpZmllcktpbmQoKSBjb25zdAoreworI2RlZmluZSBQUklOVF9UWVBFX1NQRUNJRklFUl9LSU5EKCBPQkogKSAgXAorCQljYXNlIFRZUEVfIyNPQkojI19TUEVDSUZJRVIgOiByZXR1cm4oIFFVT1RFTUUoIFRZUEVfIyNPQkogKSApCisKKwlzd2l0Y2ggKCBnZXRUeXBlU3BlY2lmaWVyS2luZCgpICkKKwl7CisJCVBSSU5UX1RZUEVfU1BFQ0lGSUVSX0tJTkQoIEJPT0xFQU4gICAgICk7CisKKwkJUFJJTlRfVFlQRV9TUEVDSUZJRVJfS0lORCggQ0hBUkFDVEVSICAgKTsKKworCQlQUklOVF9UWVBFX1NQRUNJRklFUl9LSU5EKCBQT1NfSU5URUdFUiApOworCisJCVBSSU5UX1RZUEVfU1BFQ0lGSUVSX0tJTkQoIFVJTlRFR0VSICAgICk7CisJCVBSSU5UX1RZUEVfU1BFQ0lGSUVSX0tJTkQoIElOVEVHRVIgICAgICk7CisKKwkJUFJJTlRfVFlQRV9TUEVDSUZJRVJfS0lORCggVVJBVElPTkFMICAgKTsKKwkJUFJJTlRfVFlQRV9TUEVDSUZJRVJfS0lORCggUkFUSU9OQUwgICAgKTsKKworCQlQUklOVF9UWVBFX1NQRUNJRklFUl9LSU5EKCBVRkxPQVQgICAgICApOworCQlQUklOVF9UWVBFX1NQRUNJRklFUl9LSU5EKCBGTE9BVCAgICAgICApOworCisJCVBSSU5UX1RZUEVfU1BFQ0lGSUVSX0tJTkQoIFVSRUFMICAgICAgICk7CisJCVBSSU5UX1RZUEVfU1BFQ0lGSUVSX0tJTkQoIFJFQUwgICAgICAgICk7CisKKwkJUFJJTlRfVFlQRV9TUEVDSUZJRVJfS0lORCggQ09OVElOVU9VU19USU1FICk7CisJCVBSSU5UX1RZUEVfU1BFQ0lGSUVSX0tJTkQoIERJU0NSRVRFX1RJTUUgKTsKKworCQlQUklOVF9UWVBFX1NQRUNJRklFUl9LSU5EKCBJTlRFUlZBTCAgICApOworCisJCVBSSU5UX1RZUEVfU1BFQ0lGSUVSX0tJTkQoIFNUUklORyAgICAgICk7CisKKwkJUFJJTlRfVFlQRV9TUEVDSUZJRVJfS0lORCggSURFTlRJRklFUiAgKTsKKwkJUFJJTlRfVFlQRV9TUEVDSUZJRVJfS0lORCggUVVBTElGSUVEX0lERU5USUZJRVIgKTsKKworCQlQUklOVF9UWVBFX1NQRUNJRklFUl9LSU5EKCBCVUZGRVIgICAgICApOworCQlQUklOVF9UWVBFX1NQRUNJRklFUl9LSU5EKCBDT05ORUNUT1IgICApOworCQlQUklOVF9UWVBFX1NQRUNJRklFUl9LSU5EKCBQT1JUICAgICAgICApOworCQlQUklOVF9UWVBFX1NQRUNJRklFUl9LSU5EKCBNQUNISU5FICAgICApOworCisJCVBSSU5UX1RZUEVfU1BFQ0lGSUVSX0tJTkQoIE9QRVJBVE9SICAgICk7CisKKwkJUFJJTlRfVFlQRV9TUEVDSUZJRVJfS0lORCggTEFNQkRBICAgICAgKTsKKworCQlQUklOVF9UWVBFX1NQRUNJRklFUl9LSU5EKCBBUlJBWSAgICAgICApOworCQlQUklOVF9UWVBFX1NQRUNJRklFUl9LSU5EKCBDTEFTUyAgICAgICApOworCQlQUklOVF9UWVBFX1NQRUNJRklFUl9LSU5EKCBFTlVNICAgICAgICApOworCQlQUklOVF9UWVBFX1NQRUNJRklFUl9LSU5EKCBVTklPTiAgICAgICApOworCisJCVBSSU5UX1RZUEVfU1BFQ0lGSUVSX0tJTkQoIFZFQ1RPUiAgICAgICk7CisJCVBSSU5UX1RZUEVfU1BFQ0lGSUVSX0tJTkQoIExJU1QgICAgICAgICk7CisJCVBSSU5UX1RZUEVfU1BFQ0lGSUVSX0tJTkQoIFNFVCAgICAgICAgICk7CisJCVBSSU5UX1RZUEVfU1BFQ0lGSUVSX0tJTkQoIE1VTFRJU0VUICAgICk7CisKKwkJUFJJTlRfVFlQRV9TUEVDSUZJRVJfS0lORCggRklGTyAgICAgICAgKTsKKwkJUFJJTlRfVFlQRV9TUEVDSUZJRVJfS0lORCggTElGTyAgICAgICAgKTsKKwkJUFJJTlRfVFlQRV9TUEVDSUZJRVJfS0lORCggTVVMVElfRklGTyAgKTsKKwkJUFJJTlRfVFlQRV9TUEVDSUZJRVJfS0lORCggTVVMVElfTElGTyAgKTsKKworCQlQUklOVF9UWVBFX1NQRUNJRklFUl9LSU5EKCBSQU0gICAgICAgICApOworCisJCVBSSU5UX1RZUEVfU1BFQ0lGSUVSX0tJTkQoIEFMSUFTICAgICAgICk7CisKKwkJUFJJTlRfVFlQRV9TUEVDSUZJRVJfS0lORCggVU5JVkVSU0FMICAgKTsKKworCQlQUklOVF9UWVBFX1NQRUNJRklFUl9LSU5EKCBOVUxMICAgICAgICApOworCisJCVBSSU5UX1RZUEVfU1BFQ0lGSUVSX0tJTkQoIFVOREVGSU5FRCAgICk7CisKKwkJZGVmYXVsdCA6ICByZXR1cm4oICJUWVBFX1VOS05PV05fU1BFQ0lGSUVSIiApOworCX0KK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gSU5URVJWQUw6OktJTkQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0ZDo6c3RyaW5nIElJbnRlcnZhbEtpbmQ6OnRvX3N0cmluZyhLSU5EIGtpbmQsIGNvbnN0IEJGICYgaW5mLCBjb25zdCBCRiAmIHN1cCkKK3sKKwljaGFyIGxlZnRDaGFyOworCWNoYXIgcmlnaHRDaGFyOworCisJc3dpdGNoKCBraW5kICkKKwl7CisJCWNhc2UgSUludGVydmFsS2luZDo6Q0xPU0VEOgorCQl7CisJCQlsZWZ0Q2hhciAgPSAnWyc7CisJCQlyaWdodENoYXIgPSAnXSc7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgSUludGVydmFsS2luZDo6TE9QRU46CisJCXsKKwkJCWxlZnRDaGFyICA9ICddJzsKKwkJCXJpZ2h0Q2hhciA9ICddJzsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBJSW50ZXJ2YWxLaW5kOjpST1BFTjoKKwkJeworCQkJbGVmdENoYXIgID0gJ1snOworCQkJcmlnaHRDaGFyID0gJ1snOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIElJbnRlcnZhbEtpbmQ6Ok9QRU46CisJCWRlZmF1bHQ6CisJCXsKKwkJCWxlZnRDaGFyICA9ICddJzsKKwkJCXJpZ2h0Q2hhciA9ICdbJzsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuKCBPU1MoKSA8PCBsZWZ0Q2hhciA8PCBpbmYuc3RyKCkgPDwgJywnIDw8IHN1cC5zdHIoKSA8PCByaWdodENoYXIgKTsKK30KKworCisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbGliL0lUeXBlU3BlY2lmaWVyLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbGliL0lUeXBlU3BlY2lmaWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMzZjlmMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9saWIvSVR5cGVTcGVjaWZpZXIuaApAQCAtMCwwICsxLDk2NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDI3IGbDqXZyLiAyMDEzCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgSVRZUEVTUEVDSUZJRVJfSF8KKyNkZWZpbmUgSVRZUEVTUEVDSUZJRVJfSF8KKworI2luY2x1ZGUgPHN0cmluZz4KKworCituYW1lc3BhY2Ugc2VwCit7CisKK2NsYXNzIEJGOworCisKK2VudW0gVFlQRV9TUEVDSUZJRVIKK3sKKwkvLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gVU5ERUZJTkVECisJLy8vLy8vLy8vLy8vLy8vLy8vLworCisJVFlQRV9VTkRFRklORURfU1BFQ0lGSUVSLAorCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gUFJJTUlUSVZFIFRZUEUKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCS8vIEVOVU1FUkFUSU9OCisJVFlQRV9CT09MRUFOX1NQRUNJRklFUiwKKworCVRZUEVfQ0hBUkFDVEVSX1NQRUNJRklFUiwKKworCVRZUEVfRU5VTV9TUEVDSUZJRVIsCisKKwkvLyBTVFJJTkcKKwlUWVBFX1NUUklOR19TUEVDSUZJRVIsCisKKwlUWVBFX0lERU5USUZJRVJfU1BFQ0lGSUVSLAorCVRZUEVfUVVBTElGSUVEX0lERU5USUZJRVJfU1BFQ0lGSUVSLAorCisJLy8gTlVNRVJJQworCVRZUEVfUE9TX0lOVEVHRVJfU1BFQ0lGSUVSLAorCisJVFlQRV9VSU5URUdFUl9TUEVDSUZJRVIsCisKKwlUWVBFX0lOVEVHRVJfU1BFQ0lGSUVSLAorCisKKwlUWVBFX1VSQVRJT05BTF9TUEVDSUZJRVIsCisKKwlUWVBFX1JBVElPTkFMX1NQRUNJRklFUiwKKworCisJVFlQRV9VRkxPQVRfU1BFQ0lGSUVSLAorCisJVFlQRV9GTE9BVF9TUEVDSUZJRVIsCisKKworCVRZUEVfVVJFQUxfU1BFQ0lGSUVSLAorCisJVFlQRV9SRUFMX1NQRUNJRklFUiwKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIENMT0NLIC8gVElNRSBUWVBFCisJLy8vLy8vLy8vLy8vLy8vLy8vLworCisJVFlQRV9DTE9DS19TUEVDSUZJRVIsCisKKwlUWVBFX1RJTUVfU1BFQ0lGSUVSLAorCisJVFlQRV9DT05USU5VT1VTX1RJTUVfU1BFQ0lGSUVSLAorCisJVFlQRV9ESVNDUkVURV9USU1FX1NQRUNJRklFUiwKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIElOVEVSVkFMIFRZUEUKKwkvLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlUWVBFX0lOVEVSVkFMX1NQRUNJRklFUiwKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gVEFCTEUgU1RSVUNUVVJFCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkvLyBBUlJBWQorCVRZUEVfQVJSQVlfU1BFQ0lGSUVSLAorCisJLy8gQlVJTFRJTiBBUlJBWQorLy8JCVRZUEVfQVJSQVlfQk9PTEVBTl9TUEVDSUZJRVIsCisvLwkJVFlQRV9BUlJBWV9DSEFSQUNURVJfU1BFQ0lGSUVSLAorLy8JCVRZUEVfQVJSQVlfSU5URUdFUl9TUEVDSUZJRVIsCisvLwkJVFlQRV9BUlJBWV9GTE9BVF9TUEVDSUZJRVIsCisvLworLy8JCVRZUEVfQVJSQVlfU1RSSU5HX1NQRUNJRklFUiwKKy8vCQlUWVBFX0FSUkFZX0lERU5USUZJRVJfU1BFQ0lGSUVSLAorLy8JCVRZUEVfQVJSQVlfVUZJX1NQRUNJRklFUiwKKy8vCQlUWVBFX0FSUkFZX0VOVU1fU1BFQ0lGSUVSLAorLy8KKy8vCQlUWVBFX0FSUkFZX0ZPUk1fU1BFQ0lGSUVSLAorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBDT05UQUlORVIgVFlQRQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJVFlQRV9GSUZPX1NQRUNJRklFUiwKKworCVRZUEVfTElGT19TUEVDSUZJRVIsCisKKworCVRZUEVfTVVMVElfRklGT19TUEVDSUZJRVIsCisKKwlUWVBFX01VTFRJX0xJRk9fU1BFQ0lGSUVSLAorCisKKwlUWVBFX1JBTV9TUEVDSUZJRVIsCisKKworCVRZUEVfVkVDVE9SX1NQRUNJRklFUiwKKworCVRZUEVfUkVWRVJTRV9WRUNUT1JfU1BFQ0lGSUVSLAorCisJVFlQRV9MSVNUX1NQRUNJRklFUiwKKworCVRZUEVfU0VUX1NQRUNJRklFUiwKKworCVRZUEVfTVVMVElTRVRfU1BFQ0lGSUVSLAorCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gTEFNQkRBIFRZUEUKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCVRZUEVfTEFNQkRBX1NQRUNJRklFUiwKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQ09NUE9TSVRFIFRZUEUKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCS8vIFVTRVIgQ0xBU1MgU1RSVUNUVVJFCisJVFlQRV9DTEFTU19TUEVDSUZJRVIsCisKKwkvLyBVU0VSIFVOSU9OIFNUUlVDVFVSRQorCVRZUEVfVU5JT05fU1BFQ0lGSUVSLAorCisJLy8gVVNFUiBDSE9JQ0UgU1RSVUNUVVJFCisJVFlQRV9DSE9JQ0VfU1BFQ0lGSUVSLAorCisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBYTElBIEZPUk0gVFlQRQorCS8vLy8vLy8vLy8vLy8vLy8vLy8KKworCS8vIE9QRVJBVE9SCisJVFlQRV9PUEVSQVRPUl9TUEVDSUZJRVIsCisKKwkvLyBBVk1DT0RFCisJVFlQRV9BVk1DT0RFX1NQRUNJRklFUiwKKworCS8vIENIQU5ORUwKKwlUWVBFX0NIQU5ORUxfU1BFQ0lGSUVSLAorCisJLy8gUE9SVAorCVRZUEVfUE9SVF9TUEVDSUZJRVIsCisKKwkvLyBNRVNTQUdFCisJVFlQRV9NRVNTQUdFX1NQRUNJRklFUiwKKworCS8vIFNJR05BTAorCVRZUEVfU0lHTkFMX1NQRUNJRklFUiwKKworCS8vIEJVRkZFUgorCVRZUEVfQlVGRkVSX1NQRUNJRklFUiwKKworCS8vIENPTk5FQ1QKKwlUWVBFX0NPTk5FQ1RPUl9TUEVDSUZJRVIsCisKKwkvLyBNQUNISU5FCisJVFlQRV9NQUNISU5FX1NQRUNJRklFUiwKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIEFMSUFTIFRZUEVERUYKKwkvLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlUWVBFX0FMSUFTX1NQRUNJRklFUiwKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFVOSVZFUlNBTCBUWVBFCisJLy8vLy8vLy8vLy8vLy8vLy8vLworCisJVFlQRV9VTklWRVJTQUxfU1BFQ0lGSUVSLAorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gTlVMTCBUWVBFCisJLy8vLy8vLy8vLy8vLy8vLy8vLworCisJVFlQRV9OVUxMX1NQRUNJRklFUiwKKworCit9OworCisKKy8vdHlwZWRlZiBzdGQ6OnVpbnQ2NF90ICAgICAgICAgYXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdDsKK3R5cGVkZWYgVFlQRV9TUEVDSUZJRVIgIGF2bV90eXBlX3NwZWNpZmllcl9raW5kX3Q7CisKKworY2xhc3MgQmFzZVR5cGVTcGVjaWZpZXI7CisKKworCitjbGFzcyBJVHlwZVNwZWNpZmllcgoreworCisKK3B1YmxpYzoKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5JVHlwZVNwZWNpZmllcigpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqLworCisJdmlydHVhbCBjb25zdCBCYXNlVHlwZVNwZWNpZmllciAqIHRoaXNUeXBlU3BlY2lmaWVyKCkgY29uc3QgPSAwOworCisJdmlydHVhbCBhdm1fdHlwZV9zcGVjaWZpZXJfa2luZF90IGdldFR5cGVTcGVjaWZpZXJLaW5kKCkgY29uc3QgPSAwOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBUWVBFIEFMR0VCUkEKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlubGluZSBib29sIGlzVHlwZWQoYXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCBvdGhlclRTSykKKwl7CisJCXJldHVybiggZ2V0VHlwZVNwZWNpZmllcktpbmQoKSA9PSBvdGhlclRTSyApOworCX0KKworCWJvb2wgaXNUeXBlRmFtaWx5KGF2bV90eXBlX3NwZWNpZmllcl9raW5kX3QgdHlwZUZhbWlseSk7CisKKwlib29sIHdlYWtseVR5cGVkKGF2bV90eXBlX3NwZWNpZmllcl9raW5kX3Qgb3RoZXJUU0spOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBQUklNSVRJVkUgVFlQRQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJaW5saW5lIGJvb2wgaXNUeXBlZEVudW1lcmF0aW9uKCkgY29uc3QKKwl7CisJCXN3aXRjaCggZ2V0VHlwZVNwZWNpZmllcktpbmQoKSApCisJCXsKKwkJCWNhc2UgVFlQRV9CT09MRUFOX1NQRUNJRklFUjoKKwkJCWNhc2UgVFlQRV9DSEFSQUNURVJfU1BFQ0lGSUVSOgorCQkJY2FzZSBUWVBFX0VOVU1fU1BFQ0lGSUVSOgorCQkJCXJldHVybiggdHJ1ZSApOworCisJCQlkZWZhdWx0OgorCQkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KKworCWlubGluZSBib29sIGlzVHlwZWRCb29sZWFuKCkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0VHlwZVNwZWNpZmllcktpbmQoKSA9PSBUWVBFX0JPT0xFQU5fU1BFQ0lGSUVSICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNUeXBlZENoYXJhY3RlcigpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldFR5cGVTcGVjaWZpZXJLaW5kKCkgPT0gVFlQRV9DSEFSQUNURVJfU1BFQ0lGSUVSICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNUeXBlZFN0cmluZygpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldFR5cGVTcGVjaWZpZXJLaW5kKCkgPT0gVFlQRV9TVFJJTkdfU1BFQ0lGSUVSICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNUeXBlZEVudW0oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRUeXBlU3BlY2lmaWVyS2luZCgpID09IFRZUEVfRU5VTV9TUEVDSUZJRVIgKTsKKwl9CisKKworCWlubGluZSBib29sIGlzVHlwZWRJZGVudGlmaWVyKCkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0VHlwZVNwZWNpZmllcktpbmQoKSA9PSBUWVBFX0lERU5USUZJRVJfU1BFQ0lGSUVSICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNUeXBlZFF1YWxpZmllZElkZW50aWZpZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRUeXBlU3BlY2lmaWVyS2luZCgpID09IFRZUEVfUVVBTElGSUVEX0lERU5USUZJRVJfU1BFQ0lGSUVSICk7CisJfQorCisJaW5saW5lIGJvb2wgd2Vha2x5VHlwZWRJZGVudGlmaWVyKCkgY29uc3QKKwl7CisJCXJldHVybiggKGdldFR5cGVTcGVjaWZpZXJLaW5kKCkgPT0gVFlQRV9JREVOVElGSUVSX1NQRUNJRklFUikKKwkJCSB8fCAoZ2V0VHlwZVNwZWNpZmllcktpbmQoKSA9PSBUWVBFX1FVQUxJRklFRF9JREVOVElGSUVSX1NQRUNJRklFUikgKTsKKwl9CisKKworCWJvb2wgaXNUeXBlZE51bWVyaWMoKSBjb25zdDsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIENMT0NLIFRZUEUKKwkvLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlpbmxpbmUgYm9vbCBoYXNUeXBlZENsb2NrKCkgY29uc3QKKwl7CisJCXJldHVybiggaXNUeXBlZENsb2NrKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc1R5cGVkQ2xvY2soKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRUeXBlU3BlY2lmaWVyS2luZCgpID09IFRZUEVfQ0xPQ0tfU1BFQ0lGSUVSICk7CisJfQorCisJYm9vbCB3ZWFrbHlUeXBlZENsb2NrSW50ZWdlcigpIGNvbnN0OworCisJYm9vbCB3ZWFrbHlUeXBlZENsb2NrUmF0aW9uYWwoKSBjb25zdDsKKworCWJvb2wgd2Vha2x5VHlwZWRDbG9ja0Zsb2F0KCkgY29uc3Q7CisKKwlib29sIHdlYWtseVR5cGVkQ2xvY2tSZWFsKCkgY29uc3Q7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBUSU1FIFRZUEUKKwkvLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlpbmxpbmUgYm9vbCBoYXNUeXBlZFRpbWUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAoZ2V0VHlwZVNwZWNpZmllcktpbmQoKSA9PSBUWVBFX1RJTUVfU1BFQ0lGSUVSKQorCQkJIHx8IChnZXRUeXBlU3BlY2lmaWVyS2luZCgpID09IFRZUEVfRElTQ1JFVEVfVElNRV9TUEVDSUZJRVIpCisJCQkgfHwgKGdldFR5cGVTcGVjaWZpZXJLaW5kKCkgPT0gVFlQRV9DT05USU5VT1VTX1RJTUVfU1BFQ0lGSUVSKSApOworCX0KKworCWlubGluZSBib29sIGlzVHlwZWRUaW1lKCkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0VHlwZVNwZWNpZmllcktpbmQoKSA9PSBUWVBFX1RJTUVfU1BFQ0lGSUVSICk7CisJfQorCisJYm9vbCBpc1R5cGVkQ29udGludW91c1RpbWUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRUeXBlU3BlY2lmaWVyS2luZCgpID09IFRZUEVfQ09OVElOVU9VU19USU1FX1NQRUNJRklFUiApOworCX0KKworCWJvb2wgaXNUeXBlZERpc2NyZXRlVGltZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldFR5cGVTcGVjaWZpZXJLaW5kKCkgPT0gVFlQRV9ESVNDUkVURV9USU1FX1NQRUNJRklFUiApOworCX0KKworCWJvb2wgd2Vha2x5VHlwZWRUaW1lSW50ZWdlcigpIGNvbnN0OworCisJYm9vbCB3ZWFrbHlUeXBlZFRpbWVGbG9hdCgpIGNvbnN0OworCisJYm9vbCB3ZWFrbHlUeXBlZFRpbWVSYXRpb25hbCgpIGNvbnN0OworCisJYm9vbCB3ZWFrbHlUeXBlZFRpbWVSZWFsKCkgY29uc3Q7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBDTE9DSy9USU1FIFRZUEUKKwkvLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlpbmxpbmUgYm9vbCBoYXNUeXBlZENsb2NrVGltZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGhhc1R5cGVkQ2xvY2soKSB8fCBoYXNUeXBlZFRpbWUoKSApOworCX0KKworCWlubGluZSBib29sIGlzVHlwZWRDbG9ja1RpbWUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBpc1R5cGVkQ2xvY2soKSB8fCBpc1R5cGVkVGltZSgpICk7CisJfQorCisJYm9vbCB3ZWFrbHlUeXBlZENsb2NrVGltZUludGVnZXIoKSBjb25zdDsKKworCWJvb2wgd2Vha2x5VHlwZWRDbG9ja1RpbWVSYXRpb25hbCgpIGNvbnN0OworCisJYm9vbCB3ZWFrbHlUeXBlZENsb2NrVGltZUZsb2F0KCkgY29uc3Q7CisKKwlib29sIHdlYWtseVR5cGVkQ2xvY2tUaW1lUmVhbCgpIGNvbnN0OworCisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBJTlRFR0VSIFRZUEUKKwkvLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlpbmxpbmUgYm9vbCBpc1R5cGVkUG9zSW50ZWdlcigpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldFR5cGVTcGVjaWZpZXJLaW5kKCkgPT0gVFlQRV9QT1NfSU5URUdFUl9TUEVDSUZJRVIgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc1R5cGVkVUludGVnZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAoZ2V0VHlwZVNwZWNpZmllcktpbmQoKSA9PSBUWVBFX1VJTlRFR0VSX1NQRUNJRklFUikKKwkJCQl8fCBpc1R5cGVkUG9zSW50ZWdlcigpICk7CisJfQorCisJYm9vbCB3ZWFrbHlUeXBlZFVJbnRlZ2VyKCkgY29uc3Q7CisKKwlpbmxpbmUgYm9vbCBpc1R5cGVkSW50ZWdlcigpIGNvbnN0CisJeworCQlyZXR1cm4oIChnZXRUeXBlU3BlY2lmaWVyS2luZCgpID09IFRZUEVfSU5URUdFUl9TUEVDSUZJRVIpCisJCQkJfHwgaXNUeXBlZFVJbnRlZ2VyKCkgKTsKKwl9CisKKwlib29sIHdlYWtseVR5cGVkSW50ZWdlcigpIGNvbnN0OworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gUkFUSU9OQUwgVFlQRQorCS8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlubGluZSBib29sIGlzVHlwZWRVUmF0aW9uYWwoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRUeXBlU3BlY2lmaWVyS2luZCgpID09IFRZUEVfVVJBVElPTkFMX1NQRUNJRklFUiApOworCX0KKworCWJvb2wgd2Vha2x5VHlwZWRVUmF0aW9uYWwoKSBjb25zdDsKKworCWlubGluZSBib29sIGlzVHlwZWRSYXRpb25hbCgpIGNvbnN0CisJeworCQlyZXR1cm4oIChnZXRUeXBlU3BlY2lmaWVyS2luZCgpID09IFRZUEVfUkFUSU9OQUxfU1BFQ0lGSUVSKQorCQkJCXx8IGlzVHlwZWRVUmF0aW9uYWwoKSApOworCX0KKworCWJvb2wgd2Vha2x5VHlwZWRSYXRpb25hbCgpIGNvbnN0OworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gRkxPQVQgVFlQRQorCS8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlubGluZSBib29sIGlzVHlwZWRVRmxvYXQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRUeXBlU3BlY2lmaWVyS2luZCgpID09IFRZUEVfVUZMT0FUX1NQRUNJRklFUiApOworCX0KKworCWJvb2wgd2Vha2x5VHlwZWRVRmxvYXQoKSBjb25zdDsKKworCWlubGluZSBib29sIGlzVHlwZWRGbG9hdCgpIGNvbnN0CisJeworCQlyZXR1cm4oIChnZXRUeXBlU3BlY2lmaWVyS2luZCgpID09IFRZUEVfRkxPQVRfU1BFQ0lGSUVSKQorCQkJCXx8IGlzVHlwZWRVRmxvYXQoKSApOworCX0KKworCWJvb2wgd2Vha2x5VHlwZWRGbG9hdCgpIGNvbnN0OworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gUkVBTCBUWVBFCisJLy8vLy8vLy8vLy8vLy8vLy8vLworCisJaW5saW5lIGJvb2wgaXNUeXBlZFVSZWFsKCkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0VHlwZVNwZWNpZmllcktpbmQoKSA9PSBUWVBFX1VSRUFMX1NQRUNJRklFUiApOworCX0KKworCWJvb2wgd2Vha2x5VHlwZWRVUmVhbCgpIGNvbnN0OworCisJaW5saW5lIGJvb2wgaXNUeXBlZFJlYWwoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAoZ2V0VHlwZVNwZWNpZmllcktpbmQoKSA9PSBUWVBFX1JFQUxfU1BFQ0lGSUVSKQorCQkJCXx8IGlzVHlwZWRVUmVhbCgpICk7CisJfQorCisJYm9vbCB3ZWFrbHlUeXBlZFJlYWwoKSBjb25zdDsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIElOVEVSVkFMIFRZUEUKKwkvLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlpbmxpbmUgYm9vbCBpc1R5cGVkSW50ZXJ2YWwoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRUeXBlU3BlY2lmaWVyS2luZCgpID09IFRZUEVfSU5URVJWQUxfU1BFQ0lGSUVSICk7CisJfQorCisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBYS0lBIEZPUk0gVFlQRQorCS8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlubGluZSBib29sIGlzVHlwZWRPcGVyYXRvcigpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldFR5cGVTcGVjaWZpZXJLaW5kKCkgPT0gVFlQRV9PUEVSQVRPUl9TUEVDSUZJRVIgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc1R5cGVkQXZtY29kZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldFR5cGVTcGVjaWZpZXJLaW5kKCkgPT0gVFlQRV9BVk1DT0RFX1NQRUNJRklFUiApOworCX0KKworCWlubGluZSBib29sIGlzVHlwZWRDaGFubmVsKCkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0VHlwZVNwZWNpZmllcktpbmQoKSA9PSBUWVBFX0NIQU5ORUxfU1BFQ0lGSUVSICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNUeXBlZFBvcnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRUeXBlU3BlY2lmaWVyS2luZCgpID09IFRZUEVfUE9SVF9TUEVDSUZJRVIgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc1R5cGVkTWVzc2FnZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldFR5cGVTcGVjaWZpZXJLaW5kKCkgPT0gVFlQRV9NRVNTQUdFX1NQRUNJRklFUiApOworCX0KKworCWlubGluZSBib29sIGlzVHlwZWRTaWduYWwoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRUeXBlU3BlY2lmaWVyS2luZCgpID09IFRZUEVfU0lHTkFMX1NQRUNJRklFUiApOworCX0KKworCWlubGluZSBib29sIGlzVHlwZWRCdWZmZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRUeXBlU3BlY2lmaWVyS2luZCgpID09IFRZUEVfQlVGRkVSX1NQRUNJRklFUiApOworCX0KKworCWlubGluZSBib29sIGlzVHlwZWRDb25uZWN0aW9uKCkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0VHlwZVNwZWNpZmllcktpbmQoKSA9PSBUWVBFX0NPTk5FQ1RPUl9TUEVDSUZJRVIgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc1R5cGVkTWFjaGluZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldFR5cGVTcGVjaWZpZXJLaW5kKCkgPT0gVFlQRV9NQUNISU5FX1NQRUNJRklFUiApOworCX0KKworCisJaW5saW5lIGJvb2wgaGFzVHlwZVhsaWFGb3JtKCkgY29uc3QKKwl7CisJCXN3aXRjaCggZ2V0VHlwZVNwZWNpZmllcktpbmQoKSApCisJCXsKKwkJCWNhc2UgVFlQRV9PUEVSQVRPUl9TUEVDSUZJRVI6CisJCQljYXNlIFRZUEVfQVZNQ09ERV9TUEVDSUZJRVI6CisJCQljYXNlIFRZUEVfUE9SVF9TUEVDSUZJRVI6CisJCQljYXNlIFRZUEVfQlVGRkVSX1NQRUNJRklFUjoKKwkJCWNhc2UgVFlQRV9TSUdOQUxfU1BFQ0lGSUVSOgorCQkJY2FzZSBUWVBFX0NPTk5FQ1RPUl9TUEVDSUZJRVI6CisJCQljYXNlIFRZUEVfTUFDSElORV9TUEVDSUZJRVI6CisJCQkJcmV0dXJuKCB0cnVlICk7CisKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBBUlJBWSBUWVBFCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlpbmxpbmUgYm9vbCBpc1R5cGVkQXJyYXkoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRUeXBlU3BlY2lmaWVyS2luZCgpID09IFRZUEVfQVJSQVlfU1BFQ0lGSUVSICk7CisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBDT05UQUlORVIgVFlQRQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJaW5saW5lIGJvb2wgaXNUeXBlZFZlY3RvcigpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldFR5cGVTcGVjaWZpZXJLaW5kKCkgPT0gVFlQRV9WRUNUT1JfU1BFQ0lGSUVSICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNUeXBlZFJldmVyc2VWZWN0b3IoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRUeXBlU3BlY2lmaWVyS2luZCgpID09IFRZUEVfUkVWRVJTRV9WRUNUT1JfU1BFQ0lGSUVSICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzVHlwZVZlY3RvcigpIGNvbnN0CisJeworCQlzd2l0Y2goIGdldFR5cGVTcGVjaWZpZXJLaW5kKCkgKQorCQl7CisJCQljYXNlIFRZUEVfVkVDVE9SX1NQRUNJRklFUjoKKwkJCWNhc2UgVFlQRV9SRVZFUlNFX1ZFQ1RPUl9TUEVDSUZJRVI6CisJCQkJcmV0dXJuKCB0cnVlICk7CisKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorCisKKwlpbmxpbmUgYm9vbCBpc1R5cGVkTGlzdCgpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldFR5cGVTcGVjaWZpZXJLaW5kKCkgPT0gVFlQRV9MSVNUX1NQRUNJRklFUiApOworCX0KKworCWlubGluZSBib29sIGlzVHlwZWRTZXQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRUeXBlU3BlY2lmaWVyS2luZCgpID09IFRZUEVfU0VUX1NQRUNJRklFUiApOworCX0KKworCWlubGluZSBib29sIGlzVHlwZWRNdWx0aXNldCgpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldFR5cGVTcGVjaWZpZXJLaW5kKCkgPT0gVFlQRV9NVUxUSVNFVF9TUEVDSUZJRVIgKTsKKwl9CisKKworCWlubGluZSBib29sIGlzVHlwZWRGaWZvKCkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0VHlwZVNwZWNpZmllcktpbmQoKSA9PSBUWVBFX0ZJRk9fU1BFQ0lGSUVSICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNUeXBlZExpZm8oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRUeXBlU3BlY2lmaWVyS2luZCgpID09IFRZUEVfTElGT19TUEVDSUZJRVIgKTsKKwl9CisKKworCWlubGluZSBib29sIGlzVHlwZWRNdWx0aUZpZm8oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRUeXBlU3BlY2lmaWVyS2luZCgpID09IFRZUEVfTVVMVElfRklGT19TUEVDSUZJRVIgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc1R5cGVkTXVsdGlMaWZvKCkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0VHlwZVNwZWNpZmllcktpbmQoKSA9PSBUWVBFX01VTFRJX0xJRk9fU1BFQ0lGSUVSICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBpc1R5cGVkUmFtKCkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0VHlwZVNwZWNpZmllcktpbmQoKSA9PSBUWVBFX1JBTV9TUEVDSUZJRVIgKTsKKwl9CisKKworCWlubGluZSBib29sIGhhc1R5cGVBcnJheVZlY3RvcigpIGNvbnN0CisJeworCQlzd2l0Y2goIGdldFR5cGVTcGVjaWZpZXJLaW5kKCkgKQorCQl7CisJCQljYXNlIFRZUEVfQVJSQVlfU1BFQ0lGSUVSOgorCQkJY2FzZSBUWVBFX1ZFQ1RPUl9TUEVDSUZJRVI6CisJCQljYXNlIFRZUEVfUkVWRVJTRV9WRUNUT1JfU1BFQ0lGSUVSOgorCQkJCXJldHVybiggdHJ1ZSApOworCisJCQlkZWZhdWx0OgorCQkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KKworCWlubGluZSBib29sIGhhc1R5cGVRdWV1ZSgpIGNvbnN0CisJeworCQlzd2l0Y2goIGdldFR5cGVTcGVjaWZpZXJLaW5kKCkgKQorCQl7CisJCQljYXNlIFRZUEVfRklGT19TUEVDSUZJRVI6CisJCQljYXNlIFRZUEVfTElGT19TUEVDSUZJRVI6CisKKwkJCWNhc2UgVFlQRV9NVUxUSV9GSUZPX1NQRUNJRklFUjoKKwkJCWNhc2UgVFlQRV9NVUxUSV9MSUZPX1NQRUNJRklFUjoKKworCQkJY2FzZSBUWVBFX1JBTV9TUEVDSUZJRVI6CisJCQkJcmV0dXJuKCB0cnVlICk7CisKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorCisKKwlpbmxpbmUgYm9vbCBoYXNUeXBlTGlzdENvbGxlY3Rpb24oKSBjb25zdAorCXsKKwkJc3dpdGNoKCBnZXRUeXBlU3BlY2lmaWVyS2luZCgpICkKKwkJeworCQkJY2FzZSBUWVBFX0xJU1RfU1BFQ0lGSUVSOgorCQkJY2FzZSBUWVBFX1NFVF9TUEVDSUZJRVI6CisJCQljYXNlIFRZUEVfTVVMVElTRVRfU1BFQ0lGSUVSOgorCQkJCXJldHVybiggdHJ1ZSApOworCisJCQlkZWZhdWx0OgorCQkJCXJldHVybiggaGFzVHlwZVF1ZXVlKCkgKTsKKwkJfQorCX0KKworCWlubGluZSBib29sIGhhc1R5cGVDb2xsZWN0aW9uKCkgY29uc3QKKwl7CisJCXJldHVybiggaGFzVHlwZVZlY3RvcigpIHx8IGhhc1R5cGVMaXN0Q29sbGVjdGlvbigpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzVHlwZUNvbnRhaW5lcigpIGNvbnN0CisJeworCQlyZXR1cm4oIGlzVHlwZWRBcnJheSgpIHx8IGhhc1R5cGVDb2xsZWN0aW9uKCkgKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIENPTVBPU0lURSBUWVBFCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlpbmxpbmUgYm9vbCBpc1R5cGVkU3RydWN0dXJlKCkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0VHlwZVNwZWNpZmllcktpbmQoKSA9PSBUWVBFX0NMQVNTX1NQRUNJRklFUiApOworCX0KKworCWlubGluZSBib29sIGlzVHlwZWRDbGFzcygpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldFR5cGVTcGVjaWZpZXJLaW5kKCkgPT0gVFlQRV9DTEFTU19TUEVDSUZJRVIgKTsKKwl9CisKKworCWlubGluZSBib29sIGlzVHlwZWRDaG9pY2UoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRUeXBlU3BlY2lmaWVyS2luZCgpID09IFRZUEVfQ0hPSUNFX1NQRUNJRklFUiApOworCX0KKworCWlubGluZSBib29sIGlzVHlwZWRVbmlvbigpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldFR5cGVTcGVjaWZpZXJLaW5kKCkgPT0gVFlQRV9VTklPTl9TUEVDSUZJRVIgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNUeXBlQ2hvaWNlT3JVbmlvbigpIGNvbnN0CisJeworCQlyZXR1cm4oIChnZXRUeXBlU3BlY2lmaWVyS2luZCgpID09IFRZUEVfQ0hPSUNFX1NQRUNJRklFUikKKwkJCSB8fCAoZ2V0VHlwZVNwZWNpZmllcktpbmQoKSA9PSBUWVBFX1VOSU9OX1NQRUNJRklFUikgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNUeXBlU3RydWN0dXJlT3JDaG9pY2VPclVuaW9uKCkgY29uc3QKKwl7CisJCXJldHVybiggKGdldFR5cGVTcGVjaWZpZXJLaW5kKCkgPT0gVFlQRV9DTEFTU19TUEVDSUZJRVIgICkKKwkJCSB8fCAoZ2V0VHlwZVNwZWNpZmllcktpbmQoKSA9PSBUWVBFX0NIT0lDRV9TUEVDSUZJRVIgKQorCQkJIHx8IChnZXRUeXBlU3BlY2lmaWVyS2luZCgpID09IFRZUEVfVU5JT05fU1BFQ0lGSUVSKSApOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gTEFNQkRBIFRZUEUKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlubGluZSBib29sIGlzVHlwZWRMYW1iZGEoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRUeXBlU3BlY2lmaWVyS2luZCgpID09IFRZUEVfTEFNQkRBX1NQRUNJRklFUiApOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQUxJQVMgVFlQRQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJaW5saW5lIGJvb2wgaXNUeXBlZEFsaWFzKCkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0VHlwZVNwZWNpZmllcktpbmQoKSA9PSBUWVBFX0FMSUFTX1NQRUNJRklFUiApOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gVU5JVkVSU0FMIFRZUEUKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlubGluZSBib29sIGlzVHlwZWRVbml2ZXJzYWwoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRUeXBlU3BlY2lmaWVyS2luZCgpID09IFRZUEVfVU5JVkVSU0FMX1NQRUNJRklFUiApOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQ0FURUdPUlkgVFlQRQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJaW5saW5lIGJvb2wgaGFzVHlwZVByaW1pdGl2ZSgpIGNvbnN0CisJeworCQlzd2l0Y2goIGdldFR5cGVTcGVjaWZpZXJLaW5kKCkgKQorCQl7CisJCQljYXNlIFRZUEVfQk9PTEVBTl9TUEVDSUZJRVI6CisJCQljYXNlIFRZUEVfQ0hBUkFDVEVSX1NQRUNJRklFUjoKKwkJCWNhc2UgVFlQRV9TVFJJTkdfU1BFQ0lGSUVSOgorCisJCQljYXNlIFRZUEVfSU5URUdFUl9TUEVDSUZJRVI6CisJCQljYXNlIFRZUEVfUkFUSU9OQUxfU1BFQ0lGSUVSOgorCQkJY2FzZSBUWVBFX0ZMT0FUX1NQRUNJRklFUjoKKwkJCWNhc2UgVFlQRV9SRUFMX1NQRUNJRklFUjoKKworCQkJY2FzZSBUWVBFX1BPU19JTlRFR0VSX1NQRUNJRklFUjoKKworCQkJY2FzZSBUWVBFX1VJTlRFR0VSX1NQRUNJRklFUjoKKwkJCWNhc2UgVFlQRV9VUkFUSU9OQUxfU1BFQ0lGSUVSOgorCQkJY2FzZSBUWVBFX1VGTE9BVF9TUEVDSUZJRVI6CisJCQljYXNlIFRZUEVfVVJFQUxfU1BFQ0lGSUVSOgorCisJCQljYXNlIFRZUEVfQ0xPQ0tfU1BFQ0lGSUVSOgorCQkJY2FzZSBUWVBFX1RJTUVfU1BFQ0lGSUVSOgorCQkJY2FzZSBUWVBFX0NPTlRJTlVPVVNfVElNRV9TUEVDSUZJRVI6CisJCQljYXNlIFRZUEVfRElTQ1JFVEVfVElNRV9TUEVDSUZJRVI6CisJCQkJcmV0dXJuKCB0cnVlICk7CisKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorCisJaW5saW5lIGJvb2wgaGFzVHlwZUJhc2ljKCkgY29uc3QKKwl7CisJCXJldHVybiggaXNUeXBlZEJvb2xlYW4oKSAgIHx8IGlzVHlwZWROdW1lcmljKCkgfHwKKwkJCQlpc1R5cGVkQ2hhcmFjdGVyKCkgfHwgaXNUeXBlZFN0cmluZygpICB8fAorCQkJCWhhc1R5cGVYbGlhRm9ybSgpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzVHlwZVNpbXBsZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGhhc1R5cGVCYXNpYygpIHx8IGlzVHlwZWRFbnVtKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNUeXBlU2ltcGxlT3JDb2xsZWN0aW9uKCkgY29uc3QKKwl7CisJCXJldHVybiggaGFzVHlwZVNpbXBsZSgpIHx8IGhhc1R5cGVDb2xsZWN0aW9uKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNUeXBlQXJyYXlPclN0cnVjdHVyZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGlzVHlwZWRBcnJheSgpIHx8IGlzVHlwZWRTdHJ1Y3R1cmUoKSApOworCX0KKworCWlubGluZSBib29sIGhhc1R5cGVDb21wb3NpdGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBoYXNUeXBlQ29udGFpbmVyKCkgfHwgaXNUeXBlZFN0cnVjdHVyZSgpICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBoYXNUeXBlRW51bU9yQ29tcG9zaXRlKCkgY29uc3QKKwl7CisJCXJldHVybiggaXNUeXBlZEVudW0oKSB8fCBoYXNUeXBlQ29tcG9zaXRlKCkgKTsKKwl9CisKKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwlzdGQ6OnN0cmluZyBzdHJTcGVjaWZpZXJLaW5kKCkgY29uc3Q7CisKK307CisKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBJTlRFUlZBTDo6S0lORAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY2xhc3MgSUludGVydmFsS2luZAoreworCitwdWJsaWM6CisKKwllbnVtIEtJTkQKKwl7CisJCUNMT1NFRCA9IDB4MDAsCisKKwkJTE9QRU4gID0gMHgwMSwKKworCQlST1BFTiAgPSAweDAyLAorCisJCU9QRU4gICA9IDB4MDMsCisJfTsKKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfklJbnRlcnZhbEtpbmQoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBBUEkKKwkgKi8KKwl2aXJ0dWFsIEtJTkQgZ2V0SW50ZXJ2YWxLaW5kKCkgY29uc3QgPSAwOworCisKKwlpbmxpbmUgYm9vbCBpc0NMT1NFRCgpY29uc3QKKwl7CisJCXJldHVybiggZ2V0SW50ZXJ2YWxLaW5kKCkgPT0gQ0xPU0VEICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNMT1BFTigpY29uc3QKKwl7CisJCXJldHVybiggZ2V0SW50ZXJ2YWxLaW5kKCkgPT0gTE9QRU4gKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc1JPUEVOKCljb25zdAorCXsKKwkJcmV0dXJuKCBnZXRJbnRlcnZhbEtpbmQoKSA9PSBST1BFTiApOworCX0KKworCWlubGluZSBib29sIGlzT1BFTigpY29uc3QKKwl7CisJCXJldHVybiggZ2V0SW50ZXJ2YWxLaW5kKCkgPT0gT1BFTiApOworCX0KKworCisJaW5saW5lIGJvb2wgaXNMQ2xvc2VkKCljb25zdAorCXsKKwkJcmV0dXJuKCAoZ2V0SW50ZXJ2YWxLaW5kKCkgJiBMT1BFTikgPT0gMCApOworCX0KKworCWlubGluZSBib29sIGlzTE9wZW4oKWNvbnN0CisJeworCQlyZXR1cm4oIChnZXRJbnRlcnZhbEtpbmQoKSAmIExPUEVOKSAhPSAwICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNSQ2xvc2VkKCljb25zdAorCXsKKwkJcmV0dXJuKCAoZ2V0SW50ZXJ2YWxLaW5kKCkgJiBST1BFTikgPT0gMCApOworCX0KKworCWlubGluZSBib29sIGlzUk9wZW4oKWNvbnN0CisJeworCQlyZXR1cm4oIChnZXRJbnRlcnZhbEtpbmQoKSAmIFJPUEVOKSAhPSAwICk7CisJfQorCisKKwkvKioKKwkgKiBTVEFUSUMKKwkgKi8KKwkvKioKKwkgKiBDb21wdXRlIGludGVydmFsIG5hdHVyZQorCSAqLworCWlubGluZSBzdGF0aWMgS0lORCBjb21wdXRlS2luZChjaGFyIGxlZnQsIGNoYXIgcmlnaHQpCisJeworCQlib29sIGxPcGVuID0gKGxlZnQgPT0gJ10nKSB8fCAobGVmdCA9PSAnKCcpIHx8IChsZWZ0ID09ICcpJyk7CisJCWJvb2wgck9wZW4gPSAobGVmdCA9PSAnWycpIHx8IChsZWZ0ID09ICcpJykgfHwgKGxlZnQgPT0gJygnKTsKKworCQlyZXR1cm4oIGxPcGVuID8KKwkJCQkoIHJPcGVuID8gSUludGVydmFsS2luZDo6T1BFTiAgOiBJSW50ZXJ2YWxLaW5kOjpMT1BFTiAgKSA6CisJCQkJKCByT3BlbiA/IElJbnRlcnZhbEtpbmQ6OlJPUEVOIDogSUludGVydmFsS2luZDo6Q0xPU0VEICkgKTsKKwl9CisKKworCXN0YXRpYyBzdGQ6OnN0cmluZyB0b19zdHJpbmcoS0lORCBraW5kLCBjb25zdCBCRiAmIGluZiwgY29uc3QgQkYgJiBzdXApOworCit9OworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworI2VuZGlmIC8qIElUWVBFU1BFQ0lGSUVSX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbnVtZXJpYy9GbG9hdC5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbnVtZXJpYy9GbG9hdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk0YWY3MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9udW1lcmljL0Zsb2F0LmNwcApAQCAtMCwwICsxLDIxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJGbG9hdC5oIgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbnVtZXJpYy9GbG9hdC5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL251bWVyaWMvRmxvYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTY4NmNiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL251bWVyaWMvRmxvYXQuaApAQCAtMCwwICsxLDM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIEZNTF9FWFBSRVNTSU9OX0ZMT0FUX0hfCisjZGVmaW5lIEZNTF9FWFBSRVNTSU9OX0ZMT0FUX0hfCisKKyNpZiBkZWZpbmVkKCBfQVZNX0JVSUxUSU5fTlVNRVJJQ19HTVBfICkKKworI2luY2x1ZGUgPGZtbC9udW1lcmljL2dtcC9GbG9hdEltcGwuaD4KKworI2VsaWYgZGVmaW5lZCggX0FWTV9CVUlMVElOX05VTUVSSUNfQk9PU1RfICkKKworI2luY2x1ZGUgPGZtbC9udW1lcmljL2Jvb3N0L0Zsb2F0SW1wbC5oPgorCisjZWxzZQorCisjaW5jbHVkZSA8Zm1sL251bWVyaWMvYmFzaWMvRmxvYXRJbXBsLmg+CisKKyNlbmRpZiAvKiBfQVZNX0JVSUxUSU5fTlVNRVJJQ19HTVBfICovCisKKworbmFtZXNwYWNlIHNlcAoreworCisKK30KKworI2VuZGlmIC8qRk1MX0VYUFJFU1NJT05fRkxPQVRfSF8qLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL251bWVyaWMvSW50ZWdlci5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbnVtZXJpYy9JbnRlZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmI3ZDRjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL251bWVyaWMvSW50ZWdlci5jcHAKQEAgLTAsMCArMSwyMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiSW50ZWdlci5oIgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbnVtZXJpYy9JbnRlZ2VyLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbnVtZXJpYy9JbnRlZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUwODNjNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9udW1lcmljL0ludGVnZXIuaApAQCAtMCwwICsxLDM4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIEZNTF9FWFBSRVNTSU9OX0lOVEVHRVJfSF8KKyNkZWZpbmUgRk1MX0VYUFJFU1NJT05fSU5URUdFUl9IXworCisjaWYgZGVmaW5lZCggX0FWTV9CVUlMVElOX05VTUVSSUNfR01QXyApCisKKyNpbmNsdWRlIDxmbWwvbnVtZXJpYy9nbXAvSW50ZWdlckltcGwuaD4KKworI2VsaWYgZGVmaW5lZCggX0FWTV9CVUlMVElOX05VTUVSSUNfQk9PU1RfICkKKworI2luY2x1ZGUgPGZtbC9udW1lcmljL2Jvb3N0L0ludGVnZXJJbXBsLmg+CisKKyNlbHNlCisKKyNpbmNsdWRlIDxmbWwvbnVtZXJpYy9iYXNpYy9JbnRlZ2VySW1wbC5oPgorCisjZW5kaWYgLyogX0FWTV9CVUlMVElOX05VTUVSSUNfR01QXyAqLworCisKKworbmFtZXNwYWNlIHNlcAoreworCisKK30KKworI2VuZGlmIC8qRk1MX0VYUFJFU1NJT05fSU5URUdFUl9IXyovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbnVtZXJpYy9OdW1iZXIuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL251bWVyaWMvTnVtYmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjcyNzE4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL251bWVyaWMvTnVtYmVyLmNwcApAQCAtMCwwICsxLDIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjYgbWFycyAyMDEzCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJOdW1iZXIuaCIKKworbmFtZXNwYWNlIHNlcAoreworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL251bWVyaWMvTnVtYmVyLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbnVtZXJpYy9OdW1iZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzY3NjMzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL251bWVyaWMvTnVtYmVyLmgKQEAgLTAsMCArMSw0MDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyNiBtYXJzIDIwMTMKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBGTUxfRVhQUkVTU0lPTl9OVU1CRVJfSF8KKyNkZWZpbmUgRk1MX0VYUFJFU1NJT05fTlVNQkVSX0hfCisKKyNpbmNsdWRlIDxmbWwvYnVpbHRpbi9CdWlsdGluRm9ybS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworY2xhc3MgTnVtYmVyICA6ICBwdWJsaWMgQnVpbHRpbkZvcm0gLAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIE51bWJlciApCit7CisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlOdW1iZXIoY2xhc3Nfa2luZF90IGFDbGFzc0tpbmQpCisJOiBCdWlsdGluRm9ybSggYUNsYXNzS2luZCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIENvcHkKKwkgKi8KKwlOdW1iZXIoY29uc3QgTnVtYmVyICYgYU51bWJlcikKKwk6IEJ1aWx0aW5Gb3JtKCBhTnVtYmVyICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfk51bWJlcigpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIFNJR04gVEVTVFMKKwkgKi8KKwl2aXJ0dWFsIGludCBzaWduKCkgY29uc3QgPSAwOworCisKKwlpbmxpbmUgdmlydHVhbCBib29sIGlzUG9zaXRpdmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBzaWduKCkgPj0gMCApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGJvb2wgc3RyaWN0bHlQb3NpdGl2ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIHNpZ24oKSA+IDAgKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIGJvb2wgaXNOZWdhdGl2ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIHNpZ24oKSA8PSAwICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgYm9vbCBzdHJpY3RseU5lZ2F0aXZlKCkgY29uc3QKKwl7CisJCXJldHVybiggc2lnbigpIDwgMCApOworCX0KKworCisJLyoqCisJICogQkFTSUNTIFRFU1RTCisJICovCisJdmlydHVhbCBib29sIGlzWmVybygpIGNvbnN0ID0gMDsKKworCXZpcnR1YWwgYm9vbCBpc09uZSgpIGNvbnN0ID0gMDsKKworCXZpcnR1YWwgYm9vbCBpc05lZ2F0aXZlT25lKCkgY29uc3QgPSAwOworCisKKwkvKioKKwkgKiBDT05WRVJTSU9OCisJICovCisJdmlydHVhbCBib29sIGlzSW50MzIoKSBjb25zdCA9IDA7CisJdmlydHVhbCBhdm1faW50MzJfdCB0b0ludDMyKCkgY29uc3QgPSAwOworCisJdmlydHVhbCBib29sIGlzSW50NjQoKSBjb25zdCA9IDA7CisJdmlydHVhbCBhdm1faW50NjRfdCB0b0ludDY0KCkgY29uc3QgPSAwOworCisKKwl2aXJ0dWFsIGJvb2wgaXNJbnRlZ2VyKCkgY29uc3QgPSAwOworCXZpcnR1YWwgYXZtX2ludGVnZXJfdCB0b0ludGVnZXIoKSBjb25zdCA9IDA7CisKKwl2aXJ0dWFsIGJvb2wgaXNVSW50ZWdlcigpIGNvbnN0ID0gMDsKKwl2aXJ0dWFsIGF2bV91aW50ZWdlcl90IHRvVUludGVnZXIoKSBjb25zdCA9IDA7CisKKworCXZpcnR1YWwgYm9vbCBpc1JhdGlvbmFsKCkgY29uc3QgPSAwOworCXZpcnR1YWwgYXZtX2ludGVnZXJfdCB0b0Rlbm9taW5hdG9yKCkgY29uc3QgPSAwOworCXZpcnR1YWwgYXZtX2ludGVnZXJfdCB0b051bWVyYXRvcigpIGNvbnN0ID0gMDsKKworCisJdmlydHVhbCBib29sIGlzRmxvYXQoKSBjb25zdCA9IDA7CisJdmlydHVhbCBhdm1fZmxvYXRfdCB0b0Zsb2F0KCkgY29uc3QgPSAwOworCisJdmlydHVhbCBib29sIGlzUmVhbCgpIGNvbnN0ID0gMDsKKwl2aXJ0dWFsIGF2bV9yZWFsX3QgdG9SZWFsKCkgY29uc3QgPSAwOworCisKKy8vCS8qKgorLy8JICogSU5DUkVNRU5UCisvLwkgKiBERUNSRU1FTlQKKy8vCSAqLworLy8JdmlydHVhbCB2b2lkIGFkZEV4cHIoYXZtX2ludGVnZXJfdCBhVmFsdWUgPSAxKSA9IDA7CisvLwl2aXJ0dWFsIHZvaWQgbWluRXhwcihhdm1faW50ZWdlcl90IGFWYWx1ZSA9IDEpID0gMDsKKy8vCisvLwkvKioKKy8vCSAqIHVtaW51cworLy8JICovCisvLwl2aXJ0dWFsIHZvaWQgdW1pbnVzKCkgPSAwOworCit9OworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gR0VORVJJQyBCVUlMVElOIEZPUk0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVmFsdWVfVCAsIGNsYXNzIENsYXNzX1QgPgorY2xhc3MgR2VuZXJpY051bWJlckNsYXNzCit7CisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBBVFRSSUJVVEVTCisJICovCisJVmFsdWVfVCBtVmFsdWU7CisKKworcHVibGljOgorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJR2VuZXJpY051bWJlckNsYXNzKGNvbnN0IFZhbHVlX1QgJiBhVmFsdWUpCisJOiBtVmFsdWUoIGFWYWx1ZSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIENvcHkKKwkgKi8KKwlHZW5lcmljTnVtYmVyQ2xhc3MoY29uc3QgR2VuZXJpY051bWJlckNsYXNzICYgYU51bWJlcikKKwk6IG1WYWx1ZSggYU51bWJlci5tVmFsdWUgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+R2VuZXJpY051bWJlckNsYXNzKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVZhbHVlCisJICovCisJaW5saW5lIFZhbHVlX1QgJiBnZXRWYWx1ZSgpCisJeworCQlyZXR1cm4oIG1WYWx1ZSApOworCX0KKworCWlubGluZSBjb25zdCBWYWx1ZV9UICYgZ2V0VmFsdWUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVmFsdWUgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRWYWx1ZShWYWx1ZV9UIGFWYWx1ZSkKKwl7CisJCW1WYWx1ZSA9IGFWYWx1ZTsKKwl9CisKKworCS8qKgorCSAqIElOQ1JFTUVOVAorCSAqIERFQ1JFTUVOVAorCSAqLworI2lmZGVmIF9BVk1fTkVFRF9JTlQ2NF9UX09WRVJMT0FEU18KKworCXZvaWQgYWRkRXhwcihhdm1faW50ZWdlcl90IGFWYWx1ZSA9IDEpCisJeworCQltVmFsdWUgPSAobVZhbHVlICsgc3RhdGljX2Nhc3Q8IGxvbmcgPiggYVZhbHVlICkpOworCX0KKworCXZvaWQgbWluRXhwcihhdm1faW50ZWdlcl90IGFWYWx1ZSA9IDEpCisJeworCQltVmFsdWUgPSAobVZhbHVlIC0gc3RhdGljX2Nhc3Q8IGxvbmcgPiggYVZhbHVlICkpOworCX0KKworI2Vsc2UKKworCXZvaWQgYWRkRXhwcihhdm1faW50ZWdlcl90IGFWYWx1ZSA9IDEpCisJeworCQltVmFsdWUgPSAobVZhbHVlICsgYVZhbHVlKTsKKwl9CisKKwl2b2lkIG1pbkV4cHIoYXZtX2ludGVnZXJfdCBhVmFsdWUgPSAxKQorCXsKKwkJbVZhbHVlID0gKG1WYWx1ZSAtIGFWYWx1ZSk7CisJfQorCisjZW5kaWYgLyogX0FWTV9ORUVEX0lOVDY0X1RfT1ZFUkxPQURTXyAqLworCisKKwkvKioKKwkgKiB1bWludXMKKwkgKi8KKwl2b2lkIHVtaW51cygpCisJeworCQltVmFsdWUgPSAoLSBtVmFsdWUpOworCX0KKworCisJLyoqCisJICogQVNTSUdOCisJICogT1BFUkFUT1IKKwkgKi8KKwl0ZW1wbGF0ZTwgY2xhc3MgTnVtYmVyX1QgPgorCUNsYXNzX1QgJiBvcGVyYXRvcj0oY29uc3QgTnVtYmVyX1QgJiB4KQorCXsKKwkJaWYoIHRoaXMgPT0gJnggKQorCQl7CisJCQlyZXR1cm4gKnRoaXM7CisJCX0KKworCQltVmFsdWUgPSB4Lm1WYWx1ZTsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisKKwl0ZW1wbGF0ZTwgY2xhc3MgTnVtYmVyX1QgPgorCUNsYXNzX1QgJiBvcGVyYXRvcis9KGNvbnN0IE51bWJlcl9UICYgb3RoZXIpCisJeworCQltVmFsdWUgKz0gb3RoZXIubVZhbHVlOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwl0ZW1wbGF0ZTwgY2xhc3MgTnVtYmVyX1QgPgorCUNsYXNzX1QgJiBvcGVyYXRvci09KGNvbnN0IE51bWJlcl9UICYgb3RoZXIpCisJeworCQltVmFsdWUgLT0gb3RoZXIubVZhbHVlOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKworCXRlbXBsYXRlPCBjbGFzcyBOdW1iZXJfVCA+CisJQ2xhc3NfVCAmIG9wZXJhdG9yKj0oY29uc3QgTnVtYmVyX1QgJiBvdGhlcikKKwl7CisJCW1WYWx1ZSAqPSBvdGhlci5tVmFsdWU7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCXRlbXBsYXRlPCBjbGFzcyBOdW1iZXJfVCA+CisJQ2xhc3NfVCAmIG9wZXJhdG9yLz0oY29uc3QgTnVtYmVyX1QgJiBvdGhlcikKKwl7CisJCW1WYWx1ZSAvPSBvdGhlci5tVmFsdWU7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCisJLyoqCisJICogQVJJVEhNRVRJQworCSAqIE9QRVJBVE9SCisJICovCisJQ2xhc3NfVCBvcGVyYXRvci0oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBDbGFzc19UKCAtIG1WYWx1ZSApICk7CisJfQorCisJdGVtcGxhdGU8IGNsYXNzIE51bWJlcl9UID4KKwlDbGFzc19UIG9wZXJhdG9yKyhjb25zdCBOdW1iZXJfVCAmIG90aGVyKSBjb25zdAorCXsKKwkJcmV0dXJuKCBDbGFzc19UKCBtVmFsdWUgKyBvdGhlci5tVmFsdWUgKSApOworCX0KKworCXRlbXBsYXRlPCBjbGFzcyBOdW1iZXJfVCA+CisJQ2xhc3NfVCBvcGVyYXRvci0oY29uc3QgTnVtYmVyX1QgJiBvdGhlcikgY29uc3QKKwl7CisJCXJldHVybiggQ2xhc3NfVCggbVZhbHVlIC0gb3RoZXIubVZhbHVlICkgKTsKKwl9CisKKworCXRlbXBsYXRlPCBjbGFzcyBOdW1iZXJfVCA+CisJQ2xhc3NfVCBvcGVyYXRvciooY29uc3QgTnVtYmVyX1QgJiBvdGhlcikgY29uc3QKKwl7CisJCXJldHVybiggQ2xhc3NfVCggbVZhbHVlICogb3RoZXIubVZhbHVlICkgKTsKKwl9CisKKwl0ZW1wbGF0ZTwgY2xhc3MgTnVtYmVyX1QgPgorCUNsYXNzX1Qgb3BlcmF0b3IvKGNvbnN0IE51bWJlcl9UICYgb3RoZXIpIGNvbnN0CisJeworCQlyZXR1cm4oIENsYXNzX1QoIG1WYWx1ZSAvIG90aGVyLm1WYWx1ZSApICk7CisJfQorCisKKwkvKioKKwkgKiBDT01QQVJJU09OCisJICogT1BFUkFUT1IKKwkgKi8KKwkvLyBFUVVBTAorCXRlbXBsYXRlPCBjbGFzcyBOdW1iZXJfVCA+CisJaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBOdW1iZXJfVCAmIG90aGVyKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVmFsdWUgPT0gb3RoZXIubVZhbHVlICk7CisJfQorCisJdGVtcGxhdGU8IGNsYXNzIE51bWJlcl9UID4KKwlpbmxpbmUgYm9vbCBpc0VRKGNvbnN0IE51bWJlcl9UICYgb3RoZXIpIGNvbnN0CisJeworCQlyZXR1cm4oIG1WYWx1ZSA9PSBvdGhlci5tVmFsdWUgKTsKKwl9CisKKworCS8vIE5PVCBFUVVBTAorCXRlbXBsYXRlPCBjbGFzcyBOdW1iZXJfVCA+CisJaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBOdW1iZXJfVCAmIG90aGVyKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVmFsdWUgIT0gb3RoZXIubVZhbHVlICk7CisJfQorCisJdGVtcGxhdGU8IGNsYXNzIE51bWJlcl9UID4KKwlpbmxpbmUgYm9vbCBpc05FUShjb25zdCBOdW1iZXJfVCAmIG90aGVyKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVmFsdWUgIT0gb3RoZXIubVZhbHVlICk7CisJfQorCisKKwkvLyBDT01QQVJFCisJdGVtcGxhdGU8IGNsYXNzIE51bWJlcl9UID4KKwlpbmxpbmUgaW50IGNvbXBhcmUoY29uc3QgTnVtYmVyX1QgJiBvdGhlcikgY29uc3QKKwl7CisJCXJldHVybiggKG1WYWx1ZSAgPCBvdGhlci5nZXRWYWx1ZSgpKSA/IC0xIDoKKwkJCQkobVZhbHVlID09IG90aGVyLmdldFZhbHVlKCkpID8gIDAgOiAxICk7CisJfQorCisKKwkvLyA8IDw9ID4gPj0KKwl0ZW1wbGF0ZTwgY2xhc3MgTnVtYmVyX1QgPgorCWJvb2wgb3BlcmF0b3I8IChjb25zdCBOdW1iZXJfVCAmIG90aGVyKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVmFsdWUgPCBvdGhlci5tVmFsdWUgKTsKKwl9CisKKwl0ZW1wbGF0ZTwgY2xhc3MgTnVtYmVyX1QgPgorCWJvb2wgb3BlcmF0b3I8PShjb25zdCBOdW1iZXJfVCAmIG90aGVyKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVmFsdWUgPD0gb3RoZXIubVZhbHVlICk7CisJfQorCisJdGVtcGxhdGU8IGNsYXNzIE51bWJlcl9UID4KKwlib29sIG9wZXJhdG9yPiAoY29uc3QgTnVtYmVyX1QgJiBvdGhlcikgY29uc3QKKwl7CisJCXJldHVybiggbVZhbHVlID4gb3RoZXIubVZhbHVlICk7CisJfQorCisJdGVtcGxhdGU8IGNsYXNzIE51bWJlcl9UID4KKwlib29sIG9wZXJhdG9yPj0oY29uc3QgTnVtYmVyX1QgJiBvdGhlcikgY29uc3QKKwl7CisJCXJldHVybiggbVZhbHVlID49IG90aGVyLm1WYWx1ZSApOworCX0KKworfTsKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKyNlbmRpZiAvKiBGTUxfRVhQUkVTU0lPTl9OVU1CRVJfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9udW1lcmljL051bWVyaWMuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL251bWVyaWMvTnVtZXJpYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY1YTYxYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9udW1lcmljL051bWVyaWMuY3BwCkBAIC0wLDAgKzEsMjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxIG1hcnMgMjAxMgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTnVtZXJpYy5oIgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL251bWVyaWMvTnVtZXJpYy5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL251bWVyaWMvTnVtZXJpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMThlMDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbnVtZXJpYy9OdW1lcmljLmgKQEAgLTAsMCArMSwxNTEwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMSBtYXJzIDIwMTIKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBGTUxfRVhQUkVTU0lPTl9OVU1FUklDX0hfCisjZGVmaW5lIEZNTF9FWFBSRVNTSU9OX05VTUVSSUNfSF8KKworI2luY2x1ZGUgPGJhc2UvQ2xhc3NLaW5kSW5mby5oPgorI2luY2x1ZGUgPGJhc2UvU21hcnRQb2ludGVyLmg+CisjaW5jbHVkZSA8Zm1sL251bWVyaWMvTnVtYmVyLmg+CisKKyNpbmNsdWRlIDx1dGlsL2F2bV9hc3NlcnQuaD4KKyNpbmNsdWRlIDxjb21tb24vQkYuaD4KKworCisjaWYgZGVmaW5lZCggX0FWTV9CVUlMVElOX05VTUVSSUNfR01QXyApCisKKyNpbmNsdWRlIDxmbWwvbnVtZXJpYy9nbXAvTnVtZXJpY0ltcGwuaD4KKworI2VsaWYgZGVmaW5lZCggX0FWTV9CVUlMVElOX05VTUVSSUNfQk9PU1RfICkKKworI2luY2x1ZGUgPGZtbC9udW1lcmljL2Jvb3N0L051bWVyaWNJbXBsLmg+CisKKyNlbHNlCisKKyNpbmNsdWRlIDxmbWwvbnVtZXJpYy9iYXNpYy9OdW1lcmljSW1wbC5oPgorCisjZW5kaWYgLyogX0FWTV9CVUlMVElOX05VTUVSSUNfR01QXyAqLworCisKKyNpbmNsdWRlIDxmbWwvbnVtZXJpYy9JbnRlZ2VyLmg+CisjaW5jbHVkZSA8Zm1sL251bWVyaWMvUmF0aW9uYWwuaD4KKyNpbmNsdWRlIDxmbWwvbnVtZXJpYy9GbG9hdC5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjbGFzcyBPcGVyYXRvcjsKKworCitjbGFzcyBOdW1lcmljIDoKKwkJcHVibGljIFNtYXJ0UG9pbnRlcjwgTnVtYmVyICwgRGVzdHJveUVsZW1lbnRQb2xpY3kgPiwKKwkJQVZNX0lOSkVDVF9JTlNUQU5DRV9DT1VOVEVSX0NMQVNTKCBOdW1lcmljICkKK3sKKworcHJpdmF0ZToKKwkvKioKKwkgKiBUWVBFREVGCisJICovCisJdHlwZWRlZiBTbWFydFBvaW50ZXI8IE51bWJlciAsIERlc3Ryb3lFbGVtZW50UG9saWN5ID4gIGJhc2VfdGhpc190eXBlOworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJTnVtZXJpYygpCisJOiBiYXNlX3RoaXNfdHlwZSggKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJTnVtZXJpYyhOdW1iZXIgKiBhTnVtYmVyKQorCTogYmFzZV90aGlzX3R5cGUoIGFOdW1iZXIgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwlOdW1lcmljKGNvbnN0IEludGVnZXIgJiBhTnVtYmVyKQorCTogYmFzZV90aGlzX3R5cGUoIG5ldyBJbnRlZ2VyKGFOdW1iZXIpICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCU51bWVyaWMoSW50ZWdlciAqIGFOdW1iZXIpCisJOiBiYXNlX3RoaXNfdHlwZSggYU51bWJlciApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlOdW1lcmljKGNvbnN0IFJhdGlvbmFsICYgYU51bWJlcikKKwk6IGJhc2VfdGhpc190eXBlKCBuZXcgUmF0aW9uYWwoYU51bWJlcikgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJTnVtZXJpYyhSYXRpb25hbCAqIGFOdW1iZXIpCisJOiBiYXNlX3RoaXNfdHlwZSggYU51bWJlciApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCU51bWVyaWMoY29uc3QgRmxvYXQgJiBhTnVtYmVyKQorCTogYmFzZV90aGlzX3R5cGUoIG5ldyBGbG9hdChhTnVtYmVyKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlOdW1lcmljKEZsb2F0ICogYU51bWJlcikKKwk6IGJhc2VfdGhpc190eXBlKCBhTnVtYmVyICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQnVpbHRpbgorCSAqLworLy8JLy8gYXZtX2ludDhfdAorLy8JTnVtZXJpYyhhdm1faW50OF90IGFOdW1iZXIpCisvLwk6IGJhc2VfdGhpc190eXBlKCBuZXcgSW50ZWdlciggYU51bWJlciApICkKKy8vCXsKKy8vCQkvLyEhIE5PVEhJTkcKKy8vCX0KKy8vCisvLwkvLyBhdm1fdWludDhfdAorLy8JTnVtZXJpYyhhdm1fdWludDhfdCBhTnVtYmVyKQorLy8JOiBiYXNlX3RoaXNfdHlwZSggbmV3IEludGVnZXIoIGFOdW1iZXIgKSApCisvLwl7CisvLwkJLy8hISBOT1RISU5HCisvLwl9CisvLworLy8JLy8gYXZtX2ludDE2X3QKKy8vCU51bWVyaWMoYXZtX2ludDE2X3QgYU51bWJlcikKKy8vCTogYmFzZV90aGlzX3R5cGUoIG5ldyBJbnRlZ2VyKCBhTnVtYmVyICkgKQorLy8JeworLy8JCS8vISEgTk9USElORworLy8JfQorLy8KKy8vCS8vIGF2bV91aW50MTZfdAorLy8JTnVtZXJpYyhhdm1fdWludDE2X3QgYU51bWJlcikKKy8vCTogYmFzZV90aGlzX3R5cGUoIG5ldyBJbnRlZ2VyKCBhTnVtYmVyICkgKQorLy8JeworLy8JCS8vISEgTk9USElORworLy8JfQorLy8KKy8vCS8vIGF2bV9pbnQzMl90CisvLwlOdW1lcmljKGF2bV9pbnQzMl90IGFOdW1iZXIpCisvLwk6IGJhc2VfdGhpc190eXBlKCBuZXcgSW50ZWdlciggYU51bWJlciApICkKKy8vCXsKKy8vCQkvLyEhIE5PVEhJTkcKKy8vCX0KKy8vCisvLwkvLyBhdm1fdWludDMyX3QKKy8vCU51bWVyaWMoYXZtX3VpbnQzMl90IGFOdW1iZXIpCisvLwk6IGJhc2VfdGhpc190eXBlKCBuZXcgSW50ZWdlciggYU51bWJlciApICkKKy8vCXsKKy8vCQkvLyEhIE5PVEhJTkcKKy8vCX0KKworCS8vIGludAorCU51bWVyaWMoaW50IGFOdW1iZXIpCisJOiBiYXNlX3RoaXNfdHlwZSggbmV3IEludGVnZXIoIGFOdW1iZXIgKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvLyB1aW50MzJfdAorCU51bWVyaWModW5zaWduZWQgaW50IGFOdW1iZXIpCisJOiBiYXNlX3RoaXNfdHlwZSggbmV3IEludGVnZXIoIGFOdW1iZXIgKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKyNpZmRlZiBfQVZNX05FRURfSU5UNjRfVF9PVkVSTE9BRFNfCisKKwkvLyBsb25nCisJTnVtZXJpYyhsb25nIGFOdW1iZXIpCisJOiBiYXNlX3RoaXNfdHlwZSggbmV3IEludGVnZXIoIGFOdW1iZXIgKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvLyB1bnNpZ25lZCBsb25nCisJTnVtZXJpYyh1bnNpZ25lZCBsb25nIGFOdW1iZXIpCisJOiBiYXNlX3RoaXNfdHlwZSggbmV3IEludGVnZXIoIGFOdW1iZXIgKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKyNlbmRpZiAvKiBfQVZNX05FRURfSU5UNjRfVF9PVkVSTE9BRFNfICovCisKKwkvLyBhdm1faW50ZWdlcl90ICBpLmUuICBhdm1faW50NjRfdAorCU51bWVyaWMoYXZtX2ludGVnZXJfdCBhTnVtYmVyKQorCTogYmFzZV90aGlzX3R5cGUoIG5ldyBJbnRlZ2VyKCBhTnVtYmVyICkgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJTnVtZXJpYyhhdm1fdWludGVnZXJfdCBhTnVtYmVyKQorCTogYmFzZV90aGlzX3R5cGUoIG5ldyBJbnRlZ2VyKCBhTnVtYmVyICkgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvLyBJbnRlZ2VyIC8gSW50ZWdlcgorCU51bWVyaWMoY29uc3QgSW50ZWdlciAmIGFOdW1lcmF0b3IsIGNvbnN0IEludGVnZXIgJiBhRGVub21pbmF0b3IpCisJOiBiYXNlX3RoaXNfdHlwZSggbmV3IFJhdGlvbmFsKGFOdW1lcmF0b3IsIGFEZW5vbWluYXRvcikgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLy8gYXZtX2ludGVnZXJfdCAvIGF2bV9pbnRlZ2VyX3QgIGkuZS4gIGF2bV9pbnQ2NF90IC8gYXZtX2ludDY0X3QKKwlOdW1lcmljKGF2bV9pbnRlZ2VyX3QgYU51bWVyYXRvciwgYXZtX2ludGVnZXJfdCBhRGVub21pbmF0b3IpCisJOiBiYXNlX3RoaXNfdHlwZSggbmV3IFJhdGlvbmFsKGFOdW1lcmF0b3IsIGFEZW5vbWluYXRvcikgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLy8gYXZtX3VpbnRlZ2VyX3QgLyBhdm1faW50ZWdlcl90ICBpLmUuICBhdm1fdWludDY0X3QgLyBhdm1faW50NjRfdAorCU51bWVyaWMoYXZtX3VpbnRlZ2VyX3QgYU51bWVyYXRvciwgYXZtX2ludGVnZXJfdCBhRGVub21pbmF0b3IpCisJOiBiYXNlX3RoaXNfdHlwZSggbmV3IFJhdGlvbmFsKGFOdW1lcmF0b3IsIGFEZW5vbWluYXRvcikgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLy8gYXZtX2ludGVnZXJfdCAvIGF2bV91aW50ZWdlcl90ICBpLmUuICBhdm1faW50NjRfdCAvIGF2bV91aW50NjRfdAorCU51bWVyaWMoYXZtX2ludGVnZXJfdCBhTnVtZXJhdG9yLCBhdm1fdWludGVnZXJfdCBhRGVub21pbmF0b3IpCisJOiBiYXNlX3RoaXNfdHlwZSggbmV3IFJhdGlvbmFsKGFOdW1lcmF0b3IsIGFEZW5vbWluYXRvcikgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLy8gc3RkOjpzdHJpbmcgLyBhdm1faW50ZWdlcl90ICBpLmUuICBzdGQ6OnN0cmluZyAvIGF2bV9pbnQ2NF90CisJTnVtZXJpYyhjb25zdCBzdGQ6OnN0cmluZyAmIGFOdW1lcmF0b3IsIGF2bV9pbnRlZ2VyX3QgYURlbm9taW5hdG9yKQorCTogYmFzZV90aGlzX3R5cGUoIG5ldyBSYXRpb25hbChhTnVtZXJhdG9yLCBhRGVub21pbmF0b3IpICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8vIGF2bV9pbnRlZ2VyX3QgLyBzdGQ6OnN0cmluZyAgaS5lLiAgYXZtX2ludGVnZXJfdCAvIHN0ZDo6c3RyaW5nCisJTnVtZXJpYyhhdm1faW50ZWdlcl90IGFOdW1lcmF0b3IsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYURlbm9taW5hdG9yKQorCTogYmFzZV90aGlzX3R5cGUoIG5ldyBSYXRpb25hbChhTnVtZXJhdG9yLCBhRGVub21pbmF0b3IpICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8vIHN0ZDo6c3RyaW5nIC8gc3RkOjpzdHJpbmcKKwlOdW1lcmljKGNvbnN0IHN0ZDo6c3RyaW5nICYgYU51bWVyYXRvciwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhRGVub21pbmF0b3IpCisJOiBiYXNlX3RoaXNfdHlwZSggbmV3IFJhdGlvbmFsKGFOdW1lcmF0b3IsIGFEZW5vbWluYXRvcikgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvLyBmbG9hdAorCU51bWVyaWMoZmxvYXQgYU51bWJlcikKKwk6IGJhc2VfdGhpc190eXBlKCBuZXcgRmxvYXQoIGFOdW1iZXIgKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvLyBhdm1fZmxvYXRfdCAgaS5lLiAgZG91YmxlCisJTnVtZXJpYyhhdm1fZmxvYXRfdCBhTnVtYmVyKQorCTogYmFzZV90aGlzX3R5cGUoIG5ldyBGbG9hdCggYU51bWJlciApICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8vIGNvbnN0IHN0ZDo6c3RyaW5nICYKKwlOdW1lcmljKGNvbnN0IHN0ZDo6c3RyaW5nICYgYU51bWJlcikKKwk6IGJhc2VfdGhpc190eXBlKCApCisJeworCQlzZXRTdHJpbmdOdW1iZXIoIGFOdW1iZXIgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRTdHJpbmdOdW1iZXIoY29uc3Qgc3RkOjpzdHJpbmcgJiBhTnVtYmVyKQorCXsKKwkJc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSBhTnVtYmVyLmZpbmQoJy8nKTsKKwkJaWYoIHBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcykKKwkJeworCQkJcmVsZWFzZSggbmV3IFJhdGlvbmFsKAorCQkJCQlhTnVtYmVyLnN1YnN0cigwLCBwb3MpLCBhTnVtYmVyLnN1YnN0cihwb3MrMSkgKSApOworCQl9CisJCWVsc2UgaWYoIChwb3MgPSBhTnVtYmVyLmZpbmQoJy4nKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorCQl7CisJCQlyZWxlYXNlKCBuZXcgRmxvYXQoIGFOdW1iZXIgKSApOworCisvLwkJCXJlcGxhY2VQb2ludGVyKCBuZXcgUmF0aW9uYWwoCisvLwkJCQkJc3RkOjpzdHJpbmcoYU51bWJlcikuZXJhc2UocG9zLCAxKSwKKy8vCQkJCQlJbnRlZ2VyOjpwb3coMTAsIGFOdW1iZXIuc2l6ZSgpIC0gKHBvcyArIDEpKSApICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZWxlYXNlKCBuZXcgSW50ZWdlciggYU51bWJlciApICk7CisJCX0KKwl9CisKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCU51bWVyaWMoY29uc3QgTnVtZXJpYyAmIGFOdW1lcmljKQorCTogYmFzZV90aGlzX3R5cGUoIGFOdW1lcmljICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfk51bWVyaWMoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBBQ1FVSVJFIFBPSU5URVIKKwkgKi8KKwlzdGF0aWMgTnVtZXJpYyBhY3F1aXJlKE51bWJlciAqIGFOdW1iZXIpCisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBhTnVtYmVyICkKKwkJCQk8PCAiTnVtYmVyIGluIE51bWVyaWM6OmFjcXVpcmUoKSAhISEiCisJCQkJPDwgU0VORF9FWElUOworCisJCWFOdW1iZXItPmluY3JSZWZDb3VudCgpOworCQlyZXR1cm4oIE51bWVyaWMoIGFOdW1iZXIgKSApOworCX0KKworCS8qKgorCSAqIEdFVFRFUgorCSAqIENsYXNzS2luZEluZm8KKwkgKi8KKwlpbmxpbmUgY2xhc3Nfa2luZF90IGNsYXNzS2luZCgpIGNvbnN0CisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBtUFRSICkKKwkJCQk8PCAicmF3X3BvaW50ZXIgaW4gTnVtZXJpYzo6Y2xhc3NLaW5kKCkgISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQlyZXR1cm4oIG1QVFItPmNsYXNzS2luZCgpICk7CisJfQorCisJaW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nICYgY2xhc3NLaW5kTmFtZSgpIGNvbnN0CisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBtUFRSICkKKwkJCQk8PCAicmF3X3BvaW50ZXIgaW4gTnVtZXJpYzo6Y2xhc3NLaW5kTmFtZSgpICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJcmV0dXJuKCBtUFRSLT5jbGFzc0tpbmROYW1lKCkgKTsKKwl9CisKKwlpbmxpbmUgc3RkOjpzdHJpbmcgY2xhc3NLaW5kSW5mbygpIGNvbnN0CisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBtUFRSICkKKwkJCQk8PCAicmF3X3BvaW50ZXIgaW4gTnVtZXJpYzo6Y2xhc3NLaW5kSW5mbygpICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJcmV0dXJuKCBtUFRSLT5jbGFzc0tpbmRJbmZvKCkgKTsKKwl9CisKKwkvLyBDaGVjayBpZiBOdW1lcmljIGlzIGEgaGFuZGxlIHRvIGEgVCwgaW5jbHVkaW5nIGJhc2UgY2xhc3Nlcy4KKwl0ZW1wbGF0ZTxjbGFzcyBUID4KKwlpbmxpbmUgYm9vbCBpcygpIGNvbnN0CisJeworCQlyZXR1cm4oIChtUFRSICE9IE5VTEwpICYmIG1QVFItPmlzPCBUID4oKSApOworCX0KKworCXRlbXBsYXRlPCBjbGFzcyBUID4KKwlpbmxpbmUgY29uc3QgVCAmIHRvX3JlZigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1QVFItPnRvX3JlZjwgVCA+KCkgKTsKKwl9CisKKworCS8qKgorCSAqIG9wZXJhdG9yPSA8ZXhwcmVzc2lvbj4KKwkgKi8KKwlpbmxpbmUgTnVtZXJpYyAmIG9wZXJhdG9yPShjb25zdCBCRiAmIGFuRXhwcmVzc2lvbikKKwl7CisJCWlmKCBtUFRSICE9IGFuRXhwcmVzc2lvbi5yYXdfcG9pbnRlcigpICkKKwkJeworCQkJQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKCBhbkV4cHJlc3Npb24uaXM8IE51bWJlciA+KCkgKQorCQkJCQk8PCAiSW52YWxpZCBBc3NpZ25tZW50IENhc3Qgb2YgYSA8QkY+IHRvIGEgPE51bWVyaWM+ICEhISIKKwkJCQkJPDwgU0VORF9FWElUOworCisJCQlyZWxlYXNlX2FjcXVpcmUoIGFuRXhwcmVzc2lvbi50b19wdHI8IE51bWJlciA+KCkgKTsKKwkJfQorCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwkvKioKKwkgKiBvcGVyYXRvcj0KKwkgKi8KKworCS8vIEludGVnZXIKKwlpbmxpbmUgTnVtZXJpYyAmIG9wZXJhdG9yPShjb25zdCBJbnRlZ2VyICYgYU51bWJlcikKKwl7CisJCXJldHVybiggdGhpcy0+b3BlcmF0b3I9KCBOdW1lcmljKCBhTnVtYmVyICkgKSApOworCX0KKworCS8vIFJhdGlvbmFsCisJaW5saW5lIE51bWVyaWMgJiBvcGVyYXRvcj0oY29uc3QgUmF0aW9uYWwgJiBhTnVtYmVyKQorCXsKKwkJcmV0dXJuKCB0aGlzLT5vcGVyYXRvcj0oIE51bWVyaWMoIGFOdW1iZXIgKSApICk7CisJfQorCisJLy8gRmxvYXQKKwlpbmxpbmUgTnVtZXJpYyAmIG9wZXJhdG9yPShjb25zdCBGbG9hdCAmIGFOdW1iZXIpCisJeworCQlyZXR1cm4oIHRoaXMtPm9wZXJhdG9yPSggTnVtZXJpYyggYU51bWJlciApICkgKTsKKwl9CisKKy8vCS8vIGF2bV9pbnQ4X3QKKy8vCWlubGluZSBOdW1lcmljICYgb3BlcmF0b3I9KGF2bV9pbnQ4X3QgYU51bWJlcikKKy8vCXsKKy8vCQlyZXR1cm4oIHRoaXMtPm9wZXJhdG9yPSggTnVtZXJpYyggYU51bWJlciApICkgKTsKKy8vCX0KKy8vCisvLwkvLyBhdm1fdWludDhfdAorLy8JaW5saW5lIE51bWVyaWMgJiBvcGVyYXRvcj0oYXZtX3VpbnQ4X3QgYU51bWJlcikKKy8vCXsKKy8vCQlyZXR1cm4oIHRoaXMtPm9wZXJhdG9yPSggTnVtZXJpYyggYU51bWJlciApICkgKTsKKy8vCX0KKy8vCisvLwkvLyBhdm1faW50MTZfdAorLy8JaW5saW5lIE51bWVyaWMgJiBvcGVyYXRvcj0oYXZtX2ludDE2X3QgYU51bWJlcikKKy8vCXsKKy8vCQlyZXR1cm4oIHRoaXMtPm9wZXJhdG9yPSggTnVtZXJpYyggYU51bWJlciApICkgKTsKKy8vCX0KKy8vCisvLwkvLyBhdm1fdWludDE2X3QKKy8vCWlubGluZSBOdW1lcmljICYgb3BlcmF0b3I9KGF2bV91aW50MTZfdCBhTnVtYmVyKQorLy8JeworLy8JCXJldHVybiggdGhpcy0+b3BlcmF0b3I9KCBOdW1lcmljKCBhTnVtYmVyICkgKSApOworLy8JfQorLy8KKy8vCS8vIGF2bV9pbnQzMl90CisvLwlpbmxpbmUgTnVtZXJpYyAmIG9wZXJhdG9yPShhdm1faW50MzJfdCBhTnVtYmVyKQorLy8JeworLy8JCXJldHVybiggdGhpcy0+b3BlcmF0b3I9KCBOdW1lcmljKCBhTnVtYmVyICkgKSApOworLy8JfQorLy8KKy8vCS8vIGF2bV91aW50MzJfdAorLy8JaW5saW5lIE51bWVyaWMgJiBvcGVyYXRvcj0oYXZtX3VpbnQzMl90IGFOdW1iZXIpCisvLwl7CisvLwkJcmV0dXJuKCB0aGlzLT5vcGVyYXRvcj0oIE51bWVyaWMoIGFOdW1iZXIgKSApICk7CisvLwl9CisKKwkvLyBpbnQKKwlpbmxpbmUgTnVtZXJpYyAmIG9wZXJhdG9yPShpbnQgYU51bWJlcikKKwl7CisJCXJldHVybiggdGhpcy0+b3BlcmF0b3I9KCBOdW1lcmljKCBhTnVtYmVyICkgKSApOworCX0KKworCS8vIHVuc2lnbmVkIGludAorCWlubGluZSBOdW1lcmljICYgb3BlcmF0b3I9KHVuc2lnbmVkIGludCBhTnVtYmVyKQorCXsKKwkJcmV0dXJuKCB0aGlzLT5vcGVyYXRvcj0oIE51bWVyaWMoIGFOdW1iZXIgKSApICk7CisJfQorCisjaWZkZWYgX0FWTV9ORUVEX0lOVDY0X1RfT1ZFUkxPQURTXworCisJLy8gbG9uZworCWlubGluZSBOdW1lcmljICYgb3BlcmF0b3I9KGxvbmcgYU51bWJlcikKKwl7CisJCXJldHVybiggdGhpcy0+b3BlcmF0b3I9KCBOdW1lcmljKCBhTnVtYmVyICkgKSApOworCX0KKworCS8vIHVuc2lnbmVkIGxvbmcKKwlpbmxpbmUgTnVtZXJpYyAmIG9wZXJhdG9yPSh1bnNpZ25lZCBsb25nIGFOdW1iZXIpCisJeworCQlyZXR1cm4oIHRoaXMtPm9wZXJhdG9yPSggTnVtZXJpYyggYU51bWJlciApICkgKTsKKwl9CisKKyNlbmRpZiAvKiBfQVZNX05FRURfSU5UNjRfVF9PVkVSTE9BRFNfICovCisKKwkvLyBhdm1faW50ZWdlcl90CisJaW5saW5lIE51bWVyaWMgJiBvcGVyYXRvcj0oYXZtX2ludGVnZXJfdCBhTnVtYmVyKQorCXsKKwkJcmV0dXJuKCB0aGlzLT5vcGVyYXRvcj0oIE51bWVyaWMoIGFOdW1iZXIgKSApICk7CisJfQorCisJLy8gYXZtX3VpbnRlZ2VyX3QKKwlpbmxpbmUgTnVtZXJpYyAmIG9wZXJhdG9yPShhdm1fdWludGVnZXJfdCBhTnVtYmVyKQorCXsKKwkJcmV0dXJuKCB0aGlzLT5vcGVyYXRvcj0oIE51bWVyaWMoIGFOdW1iZXIgKSApICk7CisJfQorCisJLy8gZmxvYXQKKwlpbmxpbmUgTnVtZXJpYyAmIG9wZXJhdG9yPShmbG9hdCBhTnVtYmVyKQorCXsKKwkJcmV0dXJuKCB0aGlzLT5vcGVyYXRvcj0oIE51bWVyaWMoIGFOdW1iZXIgKSApICk7CisJfQorCisJLy8gYXZtX2Zsb2F0X3QgIGkuZS4gIGRvdWJsZQorCWlubGluZSBOdW1lcmljICYgb3BlcmF0b3I9KGF2bV9mbG9hdF90IGFOdW1iZXIpCisJeworCQlyZXR1cm4oIHRoaXMtPm9wZXJhdG9yPSggTnVtZXJpYyggYU51bWJlciApICkgKTsKKwl9CisKKworCS8vIGNvbnN0IHN0ZDo6c3RyaW5nICYKKwlpbmxpbmUgTnVtZXJpYyAmIG9wZXJhdG9yPShjb25zdCBzdGQ6OnN0cmluZyAmIGFOdW1iZXIpCisJeworCQlyZXR1cm4oIHRoaXMtPm9wZXJhdG9yPSggTnVtZXJpYyggYU51bWJlciApICkgKTsKKwl9CisKKworCS8qKgorCSAqIFNJR04gVEVTVFMKKwkgKi8KKwlpbmxpbmUgaW50IHNpZ24oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUFRSLT5zaWduKCkgKTsKKwl9CisKKworCWlubGluZSBib29sIGlzUG9zaXRpdmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUFRSLT5pc1Bvc2l0aXZlKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBzdHJpY3RseVBvc2l0aXZlKCkgY29uc3QKKwl7CisJCXJldHVybiggbVBUUi0+c3RyaWN0bHlQb3NpdGl2ZSgpICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBpc05lZ2F0aXZlKCkgY29uc3QKKwl7CisJCXJldHVybiggbVBUUi0+aXNOZWdhdGl2ZSgpICk7CisJfQorCisJaW5saW5lIGJvb2wgc3RyaWN0bHlOZWdhdGl2ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1QVFItPnN0cmljdGx5TmVnYXRpdmUoKSApOworCX0KKworCS8qKgorCSAqIEJBU0lDUyBURVNUUworCSAqLworCWlubGluZSBib29sIGlzWmVybygpIGNvbnN0CisJeworCQlyZXR1cm4oIG1QVFItPmlzWmVybygpICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNPbmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUFRSLT5pc09uZSgpICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNOZWdhdGl2ZU9uZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1QVFItPmlzTmVnYXRpdmVPbmUoKSApOworCX0KKworCS8qKgorCSAqIENPTlZFUlNJT04KKwkgKi8KKwkvLyBJbnQzMgorCWlubGluZSBib29sIGlzSW50MzIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUFRSLT5pc0ludDMyKCkgKTsKKwl9CisKKwlpbmxpbmUgYXZtX2ludDMyX3QgdG9JbnQzMigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1QVFItPnRvSW50MzIoKSApOworCX0KKworCS8vIEludDY0CisJaW5saW5lIGJvb2wgaXNJbnQ2NCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1QVFItPmlzSW50NjQoKSApOworCX0KKworCWlubGluZSBhdm1faW50NjRfdCB0b0ludDY0KCkgY29uc3QKKwl7CisJCXJldHVybiggbVBUUi0+dG9JbnQ2NCgpICk7CisJfQorCisJLy8gSW50ZWdlcgorCWlubGluZSBib29sIGlzSW50ZWdlcigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1QVFItPmlzSW50ZWdlcigpICk7CisJfQorCisJaW5saW5lIGF2bV9pbnRlZ2VyX3QgdG9JbnRlZ2VyKCkgY29uc3QKKwl7CisJCXJldHVybiggbVBUUi0+dG9JbnRlZ2VyKCkgKTsKKwl9CisKKwkvLyBSYXRpb25hbAorCWlubGluZSBib29sIGlzUmF0aW9uYWwoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUFRSLT5zaWduKCkgKTsKKwl9CisKKwlpbmxpbmUgYXZtX2ludGVnZXJfdCB0b0Rlbm9taW5hdG9yKCkgY29uc3QKKwl7CisJCXJldHVybiggbVBUUi0+c2lnbigpICk7CisJfQorCisJaW5saW5lIGF2bV9pbnRlZ2VyX3QgdG9OdW1lcmF0b3IoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUFRSLT5zaWduKCkgKTsKKwl9CisKKwkvLyBGbG9hdAorCWlubGluZSBib29sIGlzRmxvYXQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUFRSLT5zaWduKCkgKTsKKwl9CisKKwlpbmxpbmUgYXZtX2Zsb2F0X3QgdG9GbG9hdCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1QVFItPnNpZ24oKSApOworCX0KKworCS8vIFJlYWwKKwlpbmxpbmUgYm9vbCBpc1JlYWwoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUFRSLT5zaWduKCkgKTsKKwl9CisKKwlpbmxpbmUgYXZtX3JlYWxfdCB0b1JlYWwoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUFRSLT5zaWduKCkgKTsKKwl9CisKKworCS8qKgorCSAqIFBPSU5URVIgVFJJVklBTExZIEVRVUFMIENPTVBBUklTT04KKwkgKi8KKwlpbmxpbmUgYm9vbCBpc1RFUShjb25zdCBOdW1lcmljICYgYU51bWVyaWMpIGNvbnN0CisJeworCQlyZXR1cm4oIG1QVFIgPT0gYU51bWVyaWMubVBUUiApOworCX0KKworCWlubGluZSBib29sIGlzVEVRKGNvbnN0IE51bWJlciAmIGFOdW1iZXIpIGNvbnN0CisJeworCQlyZXR1cm4oIG1QVFIgPT0gJmFOdW1iZXIgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc1RFUShjb25zdCBOdW1iZXIgKiBhTnVtYmVyKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUFRSID09IGFOdW1iZXIgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc1RFUShjb25zdCBCRiAmIGFuRXhwcmVzc2lvbikgY29uc3QKKwl7CisJCXJldHVybiggbVBUUiA9PSBhbkV4cHJlc3Npb24ucmF3X3BvaW50ZXIoKSApOworCX0KKworCisJaW5saW5lIGJvb2wgaXNOVEVRKGNvbnN0IE51bWVyaWMgJiBhTnVtZXJpYykgY29uc3QKKwl7CisJCXJldHVybiggbVBUUiAhPSBhTnVtZXJpYy5tUFRSICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNOVEVRKGNvbnN0IE51bWJlciAmIGFOdW1iZXIpIGNvbnN0CisJeworCQlyZXR1cm4oIG1QVFIgIT0gKCYgYU51bWJlcikgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc05URVEoY29uc3QgTnVtYmVyICogYU51bWJlcikgY29uc3QKKwl7CisJCXJldHVybiggbVBUUiAhPSBhTnVtYmVyICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNOVEVRKGNvbnN0IEJGICYgYW5FeHByZXNzaW9uKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUFRSICE9IGFuRXhwcmVzc2lvbi5yYXdfcG9pbnRlcigpICk7CisJfQorCisKKwkvKioKKwkgKiBDT01QQVJJU09OCisJICovCisJaW5saW5lIGJvb2wgaXNFUShjb25zdCBOdW1lcmljICYgYU51bWVyaWMpIGNvbnN0CisJeworCQlyZXR1cm4oIHRoaXMtPm9wZXJhdG9yPT0oIGFOdW1lcmljICkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc0VRKGNvbnN0IE51bWJlciAmIGFOdW1iZXIpIGNvbnN0CisJeworCQlyZXR1cm4oIHRoaXMtPm9wZXJhdG9yPT0oIGFOdW1iZXIgKSApOworCX0KKworCWlubGluZSBib29sIGlzRVEoY29uc3QgQkYgJiBhbkV4cHJlc3Npb24pIGNvbnN0CisJeworCQlyZXR1cm4oIHRoaXMtPm9wZXJhdG9yPT0oIGFuRXhwcmVzc2lvbi5hc19yZWY8IE51bWJlciA+KCkgKSApOworCX0KKworCisJaW5saW5lIGJvb2wgaXNORVEoY29uc3QgTnVtZXJpYyAmIGFOdW1lcmljKSBjb25zdAorCXsKKwkJcmV0dXJuKCB0aGlzLT5vcGVyYXRvciE9KCBhTnVtZXJpYyApICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNORVEoY29uc3QgTnVtYmVyICYgYU51bWJlcikgY29uc3QKKwl7CisJCXJldHVybiggdGhpcy0+b3BlcmF0b3IhPSggYU51bWJlciApICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNORVEoY29uc3QgQkYgJiBhbkV4cHJlc3Npb24pIGNvbnN0CisJeworCQlyZXR1cm4oIHRoaXMtPm9wZXJhdG9yIT0oIGFuRXhwcmVzc2lvbi5hc19yZWY8IE51bWJlciA+KCkgKSApOworCX0KKworCisJaW5saW5lIGJvb2wgc3RyRVEoY29uc3QgTnVtZXJpYyAmIGFOdW1lcmljKSBjb25zdAorCXsKKwkJcmV0dXJuKCB0aGlzLT5vcGVyYXRvcj09KCBhTnVtZXJpYyApICk7CisJfQorCisJaW5saW5lIGJvb2wgc3RyRVEoY29uc3QgTnVtYmVyICYgYU51bWJlcikgY29uc3QKKwl7CisJCXJldHVybiggdGhpcy0+b3BlcmF0b3I9PSggYU51bWJlciApICk7CisJfQorCisJaW5saW5lIGJvb2wgc3RyRVEoY29uc3QgQkYgJiBhbkV4cHJlc3Npb24pIGNvbnN0CisJeworCQlyZXR1cm4oIHRoaXMtPm9wZXJhdG9yPT0oIGFuRXhwcmVzc2lvbi5hc19yZWY8IE51bWJlciA+KCkgKSApOworCX0KKworCisJaW5saW5lIGJvb2wgc3RyTkVRKGNvbnN0IE51bWVyaWMgJiBhTnVtZXJpYykgY29uc3QKKwl7CisJCXJldHVybiggdGhpcy0+b3BlcmF0b3IhPSggYU51bWVyaWMgKSApOworCX0KKworCWlubGluZSBib29sIHN0ck5FUShjb25zdCBOdW1iZXIgJiBhTnVtYmVyKSBjb25zdAorCXsKKwkJcmV0dXJuKCB0aGlzLT5vcGVyYXRvciE9KCBhTnVtYmVyICkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBzdHJORVEoY29uc3QgQkYgJiBhbkV4cHJlc3Npb24pIGNvbnN0CisJeworCQlyZXR1cm4oIHRoaXMtPm9wZXJhdG9yIT0oIGFuRXhwcmVzc2lvbi5hc19yZWY8IE51bWJlciA+KCkgKSApOworCX0KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gYm9vbCBvcGVyYXRvci4uLgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBCT09MX09QRVJBVElPTl9BVVgob3AsIG51bWJlciwgbnVtZXJpYykgXAorCXN3aXRjaCggbnVtZXJpYy5jbGFzc0tpbmQoKSApIFwKKwl7IFwKKwkJY2FzZSBGT1JNX0JVSUxUSU5fSU5URUdFUl9LSU5EOiAgXAorCQkJcmV0dXJuKCBvcChudW1iZXIsIG51bWVyaWMudG9fcmVmPCBJbnRlZ2VyICA+KCkpICk7IFwKKwkJY2FzZSBGT1JNX0JVSUxUSU5fUkFUSU9OQUxfS0lORDogXAorCQkJcmV0dXJuKCBvcChudW1iZXIsIG51bWVyaWMudG9fcmVmPCBSYXRpb25hbCA+KCkpICk7IFwKKwkJY2FzZSBGT1JNX0JVSUxUSU5fRkxPQVRfS0lORDogICAgXAorCQkJcmV0dXJuKCBvcChudW1iZXIsIG51bWVyaWMudG9fcmVmPCBGbG9hdCAgICA+KCkpICk7IFwKKwkJZGVmYXVsdDogXAorCQl7IFwKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUIDw8ICJVbmV4cGVjdGVkIGEgPE51bWVyaWM+IHR5cGUgaW5mbyA8PCAiIFwKKwkJCQkJPDwgbnVtZXJpYy5jbGFzc0tpbmRJbmZvKCkgPDwgIiA+PiAhISEiIDw8IFNFTkRfRVhJVDsgXAorCQkJcmV0dXJuKCBmYWxzZSApOyBcCisJCX0gXAorCX0KKworI2RlZmluZSBCT09MX09QRVJBVElPTihvcCwgTjEsIE4yKSBcCisJc3dpdGNoKCBOMS5jbGFzc0tpbmQoKSApIFwKKwl7IFwKKwkJY2FzZSBGT1JNX0JVSUxUSU5fSU5URUdFUl9LSU5EOiAgXAorCQkJQk9PTF9PUEVSQVRJT05fQVVYKG9wLCBOMS50b19yZWY8IEludGVnZXIgID4oKSwgTjIpIFwKKwkJY2FzZSBGT1JNX0JVSUxUSU5fUkFUSU9OQUxfS0lORDogXAorCQkJQk9PTF9PUEVSQVRJT05fQVVYKG9wLCBOMS50b19yZWY8IFJhdGlvbmFsID4oKSwgTjIpIFwKKwkJY2FzZSBGT1JNX0JVSUxUSU5fRkxPQVRfS0lORDogICAgXAorCQkJQk9PTF9PUEVSQVRJT05fQVVYKG9wLCBOMS50b19yZWY8IEZsb2F0ICAgID4oKSwgTjIpIFwKKwkJZGVmYXVsdDogXAorCQl7IFwKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUIDw8ICJVbmV4cGVjdGVkIGEgPE51bWVyaWM+IHR5cGUgaW5mbyA8PCAiIFwKKwkJCQkJPDwgTjEuY2xhc3NLaW5kSW5mbygpIDw8ICIgPj4gISEhIiA8PCBTRU5EX0VYSVQ7IFwKKwkJCXJldHVybiggZmFsc2UgKTsgXAorCQl9IFwKKwl9CisKKworCS8qKgorCSAqIGNvbXBhcmUKKwkgKi8KKwlpbnQgY29tcGFyZShjb25zdCBOdW1lcmljICYgYU51bWVyaWMpIGNvbnN0CisJeworCQlpZiggbVBUUiA9PSBhTnVtZXJpYy5tUFRSICkKKwkJeworCQkJcmV0dXJuKCAwICk7CisJCX0KKworCQlCT09MX09QRVJBVElPTiggc2VwOjpudW1lcmljOjpjb21wYXJlICwgKCp0aGlzKSAsIGFOdW1lcmljICkKKwl9CisKKwlpbnQgY29tcGFyZShjb25zdCBOdW1iZXIgJiBhTnVtYmVyKSBjb25zdAorCXsKKwkJaWYoIG1QVFIgPT0gKCYgYU51bWJlcikgKQorCQl7CisJCQlyZXR1cm4oIDAgKTsKKwkJfQorCisJCUJPT0xfT1BFUkFUSU9OKCBzZXA6Om51bWVyaWM6OmNvbXBhcmUgLCAoKnRoaXMpICwgYU51bWJlciApCisJfQorCisJaW50IGNvbXBhcmUoY29uc3QgQkYgJiBhbkV4cHJlc3Npb24pIGNvbnN0CisJeworCQlpZiggbVBUUiA9PSBhbkV4cHJlc3Npb24ucmF3X3BvaW50ZXIoKSApCisJCXsKKwkJCXJldHVybiggMCApOworCQl9CisKKwkJQk9PTF9PUEVSQVRJT04oIHNlcDo6bnVtZXJpYzo6Y29tcGFyZSAsCisJCQkJKCp0aGlzKSAsIGFuRXhwcmVzc2lvbi5hc19yZWY8IE51bWJlciA+KCkgKQorCX0KKworCisJLyoqCisJICogb3BlcmF0b3I9PQorCSAqLworCWlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgTnVtZXJpYyAmIGFOdW1lcmljKSBjb25zdAorCXsKKwkJaWYoIG1QVFIgPT0gYU51bWVyaWMubVBUUiApCisJCXsKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisKKwkJQk9PTF9PUEVSQVRJT04oIHNlcDo6bnVtZXJpYzo6b3BlcmF0b3I9PSAsICgqdGhpcykgLCBhTnVtZXJpYyApCisJfQorCisJaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBOdW1iZXIgJiBhTnVtYmVyKSBjb25zdAorCXsKKwkJaWYoIG1QVFIgPT0gKCYgYU51bWJlcikgKQorCQl7CisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCUJPT0xfT1BFUkFUSU9OKCBzZXA6Om51bWVyaWM6Om9wZXJhdG9yPT0gLCAoKnRoaXMpICwgYU51bWJlciApCisJfQorCisJaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBCRiAmIGFuRXhwcmVzc2lvbikgY29uc3QKKwl7CisJCWlmKCBtUFRSID09IGFuRXhwcmVzc2lvbi5yYXdfcG9pbnRlcigpICkKKwkJeworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQlCT09MX09QRVJBVElPTiggc2VwOjpudW1lcmljOjpvcGVyYXRvcj09ICwKKwkJCQkoKnRoaXMpICwgYW5FeHByZXNzaW9uLmFzX3JlZjwgTnVtYmVyID4oKSApCisJfQorCisKKwkvKioKKwkgKiBvcGVyYXRvciE9CisJICovCisJaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBOdW1lcmljICYgYU51bWVyaWMpIGNvbnN0CisJeworCQlpZiggbVBUUiA9PSBhTnVtZXJpYy5tUFRSICkKKwkJeworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisKKwkJQk9PTF9PUEVSQVRJT04oIHNlcDo6bnVtZXJpYzo6b3BlcmF0b3IhPSAsICgqdGhpcykgLCBhTnVtZXJpYyApCisJfQorCisJaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBOdW1iZXIgJiBhTnVtYmVyKSBjb25zdAorCXsKKwkJaWYoIG1QVFIgPT0gKCYgYU51bWJlcikgKQorCQl7CisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKworCQlCT09MX09QRVJBVElPTiggc2VwOjpudW1lcmljOjpvcGVyYXRvciE9ICwgKCp0aGlzKSAsIGFOdW1iZXIgKQorCX0KKworCWlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgQkYgJiBhbkV4cHJlc3Npb24pIGNvbnN0CisJeworCQlpZiggbVBUUiA9PSBhbkV4cHJlc3Npb24ucmF3X3BvaW50ZXIoKSApCisJCXsKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCisJCUJPT0xfT1BFUkFUSU9OKCBzZXA6Om51bWVyaWM6Om9wZXJhdG9yIT0gLAorCQkJCSgqdGhpcykgLCBhbkV4cHJlc3Npb24uYXNfcmVmPCBOdW1iZXIgPigpICkKKwl9CisKKworCS8qKgorCSAqIG9wZXJhdG9yPAorCSAqLworCWlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBOdW1lcmljICYgYU51bWVyaWMpIGNvbnN0CisJeworCQlpZiggbVBUUiA9PSBhTnVtZXJpYy5tUFRSICkKKwkJeworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisKKwkJQk9PTF9PUEVSQVRJT04oIHNlcDo6bnVtZXJpYzo6b3BlcmF0b3I8ICwgKCp0aGlzKSAsIGFOdW1lcmljICkKKwl9CisKKwlpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgTnVtYmVyICYgYU51bWJlcikgY29uc3QKKwl7CisJCWlmKCBtUFRSID09ICgmIGFOdW1iZXIpICkKKwkJeworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisKKwkJQk9PTF9PUEVSQVRJT04oIHNlcDo6bnVtZXJpYzo6b3BlcmF0b3I8ICwgKCp0aGlzKSAsIGFOdW1iZXIgKQorCX0KKworCWlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBCRiAmIGFuRXhwcmVzc2lvbikgY29uc3QKKwl7CisJCWlmKCBtUFRSID09IGFuRXhwcmVzc2lvbi5yYXdfcG9pbnRlcigpICkKKwkJeworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisKKwkJQk9PTF9PUEVSQVRJT04oIHNlcDo6bnVtZXJpYzo6b3BlcmF0b3I8ICwKKwkJCQkoKnRoaXMpICwgYW5FeHByZXNzaW9uLmFzX3JlZjwgTnVtYmVyID4oKSApCisJfQorCisJLyoqCisJICogb3BlcmF0b3I8PQorCSAqLworCWlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgTnVtZXJpYyAmIGFOdW1lcmljKSBjb25zdAorCXsKKwkJaWYoIG1QVFIgPT0gYU51bWVyaWMubVBUUiApCisJCXsKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisKKwkJQk9PTF9PUEVSQVRJT04oIHNlcDo6bnVtZXJpYzo6b3BlcmF0b3I8PSAsICgqdGhpcykgLCBhTnVtZXJpYyApCisJfQorCisJaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBOdW1iZXIgJiBhTnVtYmVyKSBjb25zdAorCXsKKwkJaWYoIG1QVFIgPT0gKCYgYU51bWJlcikgKQorCQl7CisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCUJPT0xfT1BFUkFUSU9OKCBzZXA6Om51bWVyaWM6Om9wZXJhdG9yPD0gLCAoKnRoaXMpICwgYU51bWJlciApCisJfQorCisJaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBCRiAmIGFuRXhwcmVzc2lvbikgY29uc3QKKwl7CisJCWlmKCBtUFRSID09IGFuRXhwcmVzc2lvbi5yYXdfcG9pbnRlcigpICkKKwkJeworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQlCT09MX09QRVJBVElPTiggc2VwOjpudW1lcmljOjpvcGVyYXRvcjw9ICwKKwkJCQkoKnRoaXMpICwgYW5FeHByZXNzaW9uLmFzX3JlZjwgTnVtYmVyID4oKSApCisJfQorCisKKwkvKioKKwkgKiBvcGVyYXRvcj4KKwkgKi8KKwlpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgTnVtZXJpYyAmIGFOdW1lcmljKSBjb25zdAorCXsKKwkJaWYoIG1QVFIgPT0gYU51bWVyaWMubVBUUiApCisJCXsKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCisJCUJPT0xfT1BFUkFUSU9OKCBzZXA6Om51bWVyaWM6Om9wZXJhdG9yPiAsICgqdGhpcykgLCBhTnVtZXJpYyApCisJfQorCisJaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IE51bWJlciAmIGFOdW1iZXIpIGNvbnN0CisJeworCQlpZiggbVBUUiA9PSAoJiBhTnVtYmVyKSApCisJCXsKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCisJCUJPT0xfT1BFUkFUSU9OKCBzZXA6Om51bWVyaWM6Om9wZXJhdG9yPiAsICgqdGhpcykgLCBhTnVtYmVyICkKKwl9CisKKwlpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgQkYgJiBhbkV4cHJlc3Npb24pIGNvbnN0CisJeworCQlpZiggbVBUUiA9PSBhbkV4cHJlc3Npb24ucmF3X3BvaW50ZXIoKSApCisJCXsKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCisJCUJPT0xfT1BFUkFUSU9OKCBzZXA6Om51bWVyaWM6Om9wZXJhdG9yPiAsCisJCQkJKCp0aGlzKSAsIGFuRXhwcmVzc2lvbi5hc19yZWY8IE51bWJlciA+KCkgKQorCX0KKworCisJLyoqCisJICogb3BlcmF0b3I+PQorCSAqLworCWlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgTnVtZXJpYyAmIGFOdW1lcmljKSBjb25zdAorCXsKKwkJaWYoIG1QVFIgPT0gYU51bWVyaWMubVBUUiApCisJCXsKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisKKwkJQk9PTF9PUEVSQVRJT04oIHNlcDo6bnVtZXJpYzo6b3BlcmF0b3I+PSAsICgqdGhpcykgLCBhTnVtZXJpYyApCisJfQorCisJaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBOdW1iZXIgJiBhTnVtYmVyKSBjb25zdAorCXsKKwkJaWYoIG1QVFIgPT0gKCYgYU51bWJlcikgKQorCQl7CisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCUJPT0xfT1BFUkFUSU9OKCBzZXA6Om51bWVyaWM6Om9wZXJhdG9yPj0gLCAoKnRoaXMpICwgYU51bWJlciApCisJfQorCisJaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBCRiAmIGFuRXhwcmVzc2lvbikgY29uc3QKKwl7CisJCWlmKCBtUFRSID09IGFuRXhwcmVzc2lvbi5yYXdfcG9pbnRlcigpICkKKwkJeworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQlCT09MX09QRVJBVElPTiggc2VwOjpudW1lcmljOjpvcGVyYXRvcj49ICwKKwkJCQkoKnRoaXMpICwgYW5FeHByZXNzaW9uLmFzX3JlZjwgTnVtYmVyID4oKSApCisJfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBOdW1lcmljIG9wZXJhdG9yLi4uCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjZGVmaW5lIEFSSVRITUVUSUNfT1BFUkFUSU9OX0FVWChvcCwgbnVtYmVyLCBudW1lcmljKSBcCisJc3dpdGNoKCBudW1lcmljLmNsYXNzS2luZCgpICkgIFwKKwl7IFwKKwkJY2FzZSBGT1JNX0JVSUxUSU5fSU5URUdFUl9LSU5EOiAgXAorCQkJcmV0dXJuKCBOdW1lcmljKCBvcChudW1iZXIsIG51bWVyaWMudG9fcmVmPCBJbnRlZ2VyICA+KCkpICkgKTsgXAorCQljYXNlIEZPUk1fQlVJTFRJTl9SQVRJT05BTF9LSU5EOiBcCisJCQlyZXR1cm4oIE51bWVyaWMoIG9wKG51bWJlciwgbnVtZXJpYy50b19yZWY8IFJhdGlvbmFsID4oKSkgKSApOyBcCisJCWNhc2UgRk9STV9CVUlMVElOX0ZMT0FUX0tJTkQ6ICAgIFwKKwkJCXJldHVybiggTnVtZXJpYyggb3AobnVtYmVyLCBudW1lcmljLnRvX3JlZjwgRmxvYXQgICAgPigpKSApICk7IFwKKwkJZGVmYXVsdDogXAorCQl7IFwKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUIDw8ICJVbmV4cGVjdGVkIGEgPE51bWVyaWM+IHR5cGUgaW5mbyA8PCAiIFwKKwkJCQkJPDwgbnVtZXJpYy5jbGFzc0tpbmRJbmZvKCkgPDwgIiA+PiAhISEiIDw8IFNFTkRfRVhJVDsgXAorCQkJcmV0dXJuKCBOdW1lcmljKDApICk7IFwKKwkJfSBcCisJfQorCisjZGVmaW5lIEFSSVRITUVUSUNfT1BFUkFUSU9OKG9wLCBOMSwgTjIpIFwKKwlzd2l0Y2goIE4xLmNsYXNzS2luZCgpICkgIFwKKwl7IFwKKwkJY2FzZSBGT1JNX0JVSUxUSU5fSU5URUdFUl9LSU5EOiAgXAorCQkJQVJJVEhNRVRJQ19PUEVSQVRJT05fQVVYKG9wLCBOMS50b19yZWY8IEludGVnZXIgID4oKSwgTjIpIFwKKwkJY2FzZSBGT1JNX0JVSUxUSU5fUkFUSU9OQUxfS0lORDogXAorCQkJQVJJVEhNRVRJQ19PUEVSQVRJT05fQVVYKG9wLCBOMS50b19yZWY8IFJhdGlvbmFsID4oKSwgTjIpIFwKKwkJY2FzZSBGT1JNX0JVSUxUSU5fRkxPQVRfS0lORDogICAgXAorCQkJQVJJVEhNRVRJQ19PUEVSQVRJT05fQVVYKG9wLCBOMS50b19yZWY8IEZsb2F0ICAgID4oKSwgTjIpIFwKKwkJZGVmYXVsdDogXAorCQl7IFwKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUIDw8ICJVbmV4cGVjdGVkIGEgPE51bWVyaWM+IHR5cGUgaW5mbyA8PCAiIFwKKwkJCQkJPDwgTjEuY2xhc3NLaW5kSW5mbygpIDw8ICIgPj4gISEhIiA8PCBTRU5EX0VYSVQ7IFwKKwkJCXJldHVybiggTnVtZXJpYygwKSApOyBcCisJCX0gXAorCX0KKworI2RlZmluZSBBUklUSE1FVElDX1VOQVJZX09QRVJBVElPTihvcCwgTikgXAorCXN3aXRjaCggTi5jbGFzc0tpbmQoKSApICBcCisJeyBcCisJCWNhc2UgRk9STV9CVUlMVElOX0lOVEVHRVJfS0lORDogIFwKKwkJCXJldHVybiggTnVtZXJpYyggb3AoTi50b19yZWY8IEludGVnZXIgID4oKSkgKSApOyBcCisJCWNhc2UgRk9STV9CVUlMVElOX1JBVElPTkFMX0tJTkQ6IFwKKwkJCXJldHVybiggTnVtZXJpYyggb3AoTi50b19yZWY8IFJhdGlvbmFsID4oKSkgKSApOyBcCisJCWNhc2UgRk9STV9CVUlMVElOX0ZMT0FUX0tJTkQ6ICAgIFwKKwkJCXJldHVybiggTnVtZXJpYyggb3AoTi50b19yZWY8IEZsb2F0ICAgID4oKSkgKSApOyBcCisJCWRlZmF1bHQ6IFwKKwkJeyBcCisJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVCA8PCAiVW5leHBlY3RlZCBhIDxOdW1lcmljPiB0eXBlIGluZm8gPDwgIiBcCisJCQkJCTw8IE4uY2xhc3NLaW5kSW5mbygpIDw8ICIgPj4gISEhIiA8PCBTRU5EX0VYSVQ7IFwKKwkJCXJldHVybiggTnVtZXJpYygwKSApOyBcCisJCX0gXAorCX0KKworI2RlZmluZSBBUklUSE1FVElDX09QRVJBVElPTl9OVU0ob3AsIG51bWVyaWMsIG51bWJlcikgXAorCXN3aXRjaCggbnVtZXJpYy5jbGFzc0tpbmQoKSApICBcCisJeyBcCisJCWNhc2UgRk9STV9CVUlMVElOX0lOVEVHRVJfS0lORDogIFwKKwkJCXJldHVybiggTnVtZXJpYyggb3AobnVtZXJpYy50b19yZWY8IEludGVnZXIgID4oKSwgbnVtYmVyKSApICk7IFwKKwkJY2FzZSBGT1JNX0JVSUxUSU5fUkFUSU9OQUxfS0lORDogXAorCQkJcmV0dXJuKCBOdW1lcmljKCBvcChudW1lcmljLnRvX3JlZjwgUmF0aW9uYWwgPigpLCBudW1iZXIpICkgKTsgXAorCQljYXNlIEZPUk1fQlVJTFRJTl9GTE9BVF9LSU5EOiAgICBcCisJCQlyZXR1cm4oIE51bWVyaWMoIG9wKG51bWVyaWMudG9fcmVmPCBGbG9hdCAgICA+KCksIG51bWJlcikgKSApOyBcCisJCWRlZmF1bHQ6IFwKKwkJeyBcCisJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVCA8PCAiVW5leHBlY3RlZCBhIDxOdW1lcmljPiB0eXBlIGluZm8gPDwgIiBcCisJCQkJCTw8IG51bWVyaWMuY2xhc3NLaW5kSW5mbygpIDw8ICIgPj4gISEhIiA8PCBTRU5EX0VYSVQ7IFwKKwkJCXJldHVybiggTnVtZXJpYygwKSApOyBcCisJCX0gXAorCX0KKworCisJLyoqCisJICogb3BlcmF0b3IrCisJICovCisJaW5saW5lIE51bWVyaWMgb3BlcmF0b3IrKGNvbnN0IE51bWVyaWMgJiBhTnVtZXJpYykgY29uc3QKKwl7CisJCWlmKCBhTnVtZXJpYy5pc1plcm8oKSApCisJCXsKKwkJCXJldHVybiggKnRoaXMgKTsKKwkJfQorCisJCUFSSVRITUVUSUNfT1BFUkFUSU9OKCBzZXA6Om51bWVyaWM6Om9wZXJhdG9yKyAsICgqdGhpcykgLCBhTnVtZXJpYyApCisJfQorCisJaW5saW5lIE51bWVyaWMgb3BlcmF0b3IrKGNvbnN0IE51bWJlciAmIGFOdW1iZXIpIGNvbnN0CisJeworCQlpZiggYU51bWJlci5pc1plcm8oKSApCisJCXsKKwkJCXJldHVybiggKnRoaXMgKTsKKwkJfQorCisJCUFSSVRITUVUSUNfT1BFUkFUSU9OKCBzZXA6Om51bWVyaWM6Om9wZXJhdG9yKyAsICgqdGhpcykgLCBhTnVtYmVyICkKKwl9CisKKwlpbmxpbmUgTnVtZXJpYyBvcGVyYXRvcisoY29uc3QgQkYgJiBhbkV4cHJlc3Npb24pIGNvbnN0CisJeworCQlyZXR1cm4oIHRoaXMtPm9wZXJhdG9yKyggYW5FeHByZXNzaW9uLmFzX3JlZjwgTnVtYmVyID4oKSApICk7CisJfQorCisJLy8gb3BlcmF0b3IrPQorCWlubGluZSBOdW1lcmljICYgb3BlcmF0b3IrPShjb25zdCBOdW1lcmljICYgYU51bWVyaWMpCisJeworCQl0aGlzLT5vcGVyYXRvcj0oIHRoaXMtPm9wZXJhdG9yKyggYU51bWVyaWMgKSApOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwlpbmxpbmUgTnVtZXJpYyAmIG9wZXJhdG9yKz0oY29uc3QgQkYgJiBhbkV4cHJlc3Npb24pCisJeworCQl0aGlzLT5vcGVyYXRvcj0oIHRoaXMtPm9wZXJhdG9yKyggYW5FeHByZXNzaW9uICkgKTsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisKKwkvKioKKwkgKiBvcGVyYXRvcisrCisJICovCisJaW5saW5lIE51bWVyaWMgb3BlcmF0b3IrKygpCisJeworCQl0aGlzLT5vcGVyYXRvcj0oIHRoaXMtPm9wZXJhdG9yKyggSW50ZWdlcigxKSApICk7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCWlubGluZSBOdW1lcmljIG9wZXJhdG9yKysoaW50KQorCXsKKwkJTnVtZXJpYyB0bXAoICp0aGlzICk7CisKKwkJdGhpcy0+b3BlcmF0b3I9KCB0aGlzLT5vcGVyYXRvcisoIEludGVnZXIoMSkgKSApOworCisJCXJldHVybiggdG1wICk7CisJfQorCisJLyoqCisJICogb3BlcmF0b3ItCisJICovCisJaW5saW5lIE51bWVyaWMgb3BlcmF0b3ItKCkgY29uc3QKKwl7CisJCUFSSVRITUVUSUNfVU5BUllfT1BFUkFUSU9OKCBzZXA6Om51bWVyaWM6Om9wZXJhdG9yLSAsICgqdGhpcykgKQorCX0KKworCS8qKgorCSAqIG9wZXJhdG9yLS0KKwkgKi8KKwlpbmxpbmUgTnVtZXJpYyBvcGVyYXRvci0tKCkKKwl7CisJCXRoaXMtPm9wZXJhdG9yPSggdGhpcy0+b3BlcmF0b3ItKCBJbnRlZ2VyKDEpICkgKTsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJaW5saW5lIE51bWVyaWMgb3BlcmF0b3ItLShpbnQpCisJeworCQlOdW1lcmljIHRtcCggKnRoaXMgKTsKKworCQl0aGlzLT5vcGVyYXRvcj0oIHRoaXMtPm9wZXJhdG9yLSggSW50ZWdlcigxKSApICk7CisKKwkJcmV0dXJuKCB0bXAgKTsKKwl9CisKKwkvKioKKwkgKiBvcGVyYXRvci0KKwkgKi8KKwlpbmxpbmUgTnVtZXJpYyBvcGVyYXRvci0oY29uc3QgTnVtZXJpYyAmIGFOdW1lcmljKSBjb25zdAorCXsKKwkJaWYoIGFOdW1lcmljLmlzWmVybygpICkKKwkJeworCQkJcmV0dXJuKCAqdGhpcyApOworCQl9CisKKwkJQVJJVEhNRVRJQ19PUEVSQVRJT04oIHNlcDo6bnVtZXJpYzo6b3BlcmF0b3ItICwgKCp0aGlzKSAsIGFOdW1lcmljICkKKwl9CisKKwlpbmxpbmUgTnVtZXJpYyBvcGVyYXRvci0oY29uc3QgTnVtYmVyICYgYU51bWJlcikgY29uc3QKKwl7CisJCWlmKCBhTnVtYmVyLmlzWmVybygpICkKKwkJeworCQkJcmV0dXJuKCAqdGhpcyApOworCQl9CisKKwkJQVJJVEhNRVRJQ19PUEVSQVRJT04oIHNlcDo6bnVtZXJpYzo6b3BlcmF0b3ItICwgKCp0aGlzKSAsIGFOdW1iZXIgKQorCX0KKworCWlubGluZSBOdW1lcmljIG9wZXJhdG9yLShjb25zdCBCRiAmIGFuRXhwcmVzc2lvbikgY29uc3QKKwl7CisJCXJldHVybiggdGhpcy0+b3BlcmF0b3ItKCBhbkV4cHJlc3Npb24uYXNfcmVmPCBOdW1iZXIgPigpICkgKTsKKwl9CisKKwkvLyBvcGVyYXRvci09CisJaW5saW5lIE51bWVyaWMgJiBvcGVyYXRvci09KGNvbnN0IE51bWVyaWMgJiBhTnVtZXJpYykKKwl7CisJCXRoaXMtPm9wZXJhdG9yPSggdGhpcy0+b3BlcmF0b3ItKCBhTnVtZXJpYyApICk7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCWlubGluZSBOdW1lcmljICYgb3BlcmF0b3ItPShjb25zdCBCRiAmIGFuRXhwcmVzc2lvbikKKwl7CisJCXRoaXMtPm9wZXJhdG9yPSggdGhpcy0+b3BlcmF0b3ItKCBhbkV4cHJlc3Npb24gKSApOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKworCS8qKgorCSAqIG9wZXJhdG9yKgorCSAqLworCWlubGluZSBOdW1lcmljIG9wZXJhdG9yKihjb25zdCBOdW1lcmljICYgYU51bWVyaWMpIGNvbnN0CisJeworCQlpZiggYU51bWVyaWMuaXNPbmUoKSApCisJCXsKKwkJCXJldHVybiggKnRoaXMgKTsKKwkJfQorCisJCUFSSVRITUVUSUNfT1BFUkFUSU9OKCBzZXA6Om51bWVyaWM6Om9wZXJhdG9yKiAsICgqdGhpcykgLCBhTnVtZXJpYyApCisJfQorCisJaW5saW5lIE51bWVyaWMgb3BlcmF0b3IqKGNvbnN0IE51bWJlciAmIGFOdW1iZXIpIGNvbnN0CisJeworCQlpZiggYU51bWJlci5pc09uZSgpICkKKwkJeworCQkJcmV0dXJuKCAqdGhpcyApOworCQl9CisKKwkJQVJJVEhNRVRJQ19PUEVSQVRJT04oIHNlcDo6bnVtZXJpYzo6b3BlcmF0b3IqICwgKCp0aGlzKSAsIGFOdW1iZXIgKQorCX0KKworCWlubGluZSBOdW1lcmljIG9wZXJhdG9yKihjb25zdCBCRiAmIGFuRXhwcmVzc2lvbikgY29uc3QKKwl7CisJCXJldHVybiggdGhpcy0+b3BlcmF0b3IqKCBhbkV4cHJlc3Npb24uYXNfcmVmPCBOdW1iZXIgPigpICkgKTsKKwl9CisKKwkvLyBvcGVyYXRvcio9CisJaW5saW5lIE51bWVyaWMgJiBvcGVyYXRvcio9KGNvbnN0IE51bWVyaWMgJiBhTnVtZXJpYykKKwl7CisJCXRoaXMtPm9wZXJhdG9yPSggdGhpcy0+b3BlcmF0b3IqKCBhTnVtZXJpYyApICk7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCWlubGluZSBOdW1lcmljICYgb3BlcmF0b3IqPShjb25zdCBCRiAmIGFuRXhwcmVzc2lvbikKKwl7CisJCXRoaXMtPm9wZXJhdG9yPSggdGhpcy0+b3BlcmF0b3IqKCBhbkV4cHJlc3Npb24gKSApOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKworCS8qKgorCSAqIG9wZXJhdG9yLworCSAqLworCWlubGluZSBOdW1lcmljIG9wZXJhdG9yLyhjb25zdCBOdW1lcmljICYgYU51bWVyaWMpIGNvbnN0CisJeworCQlpZiggYU51bWVyaWMuaXNPbmUoKSApCisJCXsKKwkJCXJldHVybiggKnRoaXMgKTsKKwkJfQorCisJCUFSSVRITUVUSUNfT1BFUkFUSU9OKCBzZXA6Om51bWVyaWM6Om9wZXJhdG9yLyAsICgqdGhpcykgLCBhTnVtZXJpYyApCisJfQorCisJaW5saW5lIE51bWVyaWMgb3BlcmF0b3IvKGNvbnN0IE51bWJlciAmIGFOdW1iZXIpIGNvbnN0CisJeworCQlpZiggYU51bWJlci5pc09uZSgpICkKKwkJeworCQkJcmV0dXJuKCAqdGhpcyApOworCQl9CisKKwkJQVJJVEhNRVRJQ19PUEVSQVRJT04oIHNlcDo6bnVtZXJpYzo6b3BlcmF0b3IvICwgKCp0aGlzKSAsIGFOdW1iZXIgKQorCX0KKworCWlubGluZSBOdW1lcmljIG9wZXJhdG9yLyhjb25zdCBCRiAmIGFuRXhwcmVzc2lvbikgY29uc3QKKwl7CisJCXJldHVybiggdGhpcy0+b3BlcmF0b3IvKCBhbkV4cHJlc3Npb24uYXNfcmVmPCBOdW1iZXIgPigpICkgKTsKKwl9CisKKwkvLyBvcGVyYXRvci89CisJaW5saW5lIE51bWVyaWMgJiBvcGVyYXRvci89KGNvbnN0IE51bWVyaWMgJiBhTnVtZXJpYykKKwl7CisJCXRoaXMtPm9wZXJhdG9yPSggdGhpcy0+b3BlcmF0b3IvKCBhTnVtZXJpYyApICk7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCWlubGluZSBOdW1lcmljICYgb3BlcmF0b3IvPShjb25zdCBCRiAmIGFuRXhwcmVzc2lvbikKKwl7CisJCXRoaXMtPm9wZXJhdG9yPSggdGhpcy0+b3BlcmF0b3IvKCBhbkV4cHJlc3Npb24gKSApOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKworCS8qKgorCSAqIENPTVBBUklTT04gT1BFUkFUSU9OCisJICovCisJaW5saW5lIGJvb2wgZXEoY29uc3QgTnVtZXJpYyAmIGFyZykKKwl7CisJCXJldHVybiggdGhpcy0+b3BlcmF0b3I9PSggYXJnICkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBuZXEoY29uc3QgTnVtZXJpYyAmIGFyZykKKwl7CisJCXJldHVybiggdGhpcy0+b3BlcmF0b3IhPSggYXJnICkgKTsKKwl9CisKKworCWlubGluZSBib29sIGx0KGNvbnN0IE51bWVyaWMgJiBhcmcpCisJeworCQlyZXR1cm4oIHRoaXMtPm9wZXJhdG9yPCggYXJnICkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBsdGUoY29uc3QgTnVtZXJpYyAmIGFyZykKKwl7CisJCXJldHVybiggdGhpcy0+b3BlcmF0b3I8PSggYXJnICkgKTsKKwl9CisKKworCWlubGluZSBib29sIGd0KGNvbnN0IE51bWVyaWMgJiBhcmcpCisJeworCQlyZXR1cm4oIHRoaXMtPm9wZXJhdG9yPiggYXJnICkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBndGUoY29uc3QgTnVtZXJpYyAmIGFyZykKKwl7CisJCXJldHVybiggdGhpcy0+b3BlcmF0b3I+PSggYXJnICkgKTsKKwl9CisKKworCS8qKgorCSAqIEFSSVRITUVUSUMgT1BFUkFUSU9OCisJICovCisJaW5saW5lIE51bWVyaWMgYWRkKGNvbnN0IE51bWVyaWMgJiBhcmcpCisJeworCQlyZXR1cm4oIHRoaXMtPm9wZXJhdG9yKyggYXJnICkgKTsKKwl9CisKKwlpbmxpbmUgTnVtZXJpYyBpbmNyKGF2bV91aW50ZWdlcl90IHZhbCA9IDEpCisJeworCQlyZXR1cm4oIHRoaXMtPm9wZXJhdG9yKyggSW50ZWdlcih2YWwpICkgKTsKKwl9CisKKwlpbmxpbmUgTnVtZXJpYyBtaW51cyhjb25zdCBOdW1lcmljICYgYXJnKQorCXsKKwkJcmV0dXJuKCB0aGlzLT5vcGVyYXRvci0oIGFyZyApICk7CisJfQorCisJaW5saW5lIE51bWVyaWMgdW1pbnVzKCkKKwl7CisJCXJldHVybiggdGhpcy0+b3BlcmF0b3ItKCkgKTsKKwl9CisKKwlpbmxpbmUgTnVtZXJpYyBkZWNyKGF2bV91aW50ZWdlcl90IHZhbCA9IDEpCisJeworCQlyZXR1cm4oIHRoaXMtPm9wZXJhdG9yLSggSW50ZWdlcih2YWwpICkgKTsKKwl9CisKKwlpbmxpbmUgTnVtZXJpYyBtdWx0KGNvbnN0IE51bWVyaWMgJiBhcmcpCisJeworCQlyZXR1cm4oIHRoaXMtPm9wZXJhdG9yKiggYXJnICkgKTsKKwl9CisKKwlpbmxpbmUgTnVtZXJpYyBwb3coYXZtX3VpbnRlZ2VyX3QgYW5FeHBvbmVudCkKKwl7CisJCUFSSVRITUVUSUNfT1BFUkFUSU9OX05VTSggc2VwOjpudW1lcmljOjpwb3cgLCAoKnRoaXMpICwgYW5FeHBvbmVudCApCisJfQorCisJaW5saW5lIE51bWVyaWMgZGl2KGNvbnN0IE51bWVyaWMgJiBhcmcpCisJeworCQlyZXR1cm4oIHRoaXMtPm9wZXJhdG9yLyggYXJnICkgKTsKKwl9CisKKwlpbmxpbmUgTnVtZXJpYyBpbnYoKQorCXsKKwkJQVJJVEhNRVRJQ19VTkFSWV9PUEVSQVRJT04oIHNlcDo6bnVtZXJpYzo6aW52ZXJzZSAsICgqdGhpcykgKQorCX0KKworCisJLyoqCisJICogU2VyaWFsaXphdGlvbgorCSAqLworCWlubGluZSB2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggbVBUUiApCisJCQkJPDwgInJhd19wb2ludGVyIGluIE51bWVyaWM6OnRvU3RyZWFtKE91dFN0cmVhbSAmKSAhISEiCisJCQkJPDwgU0VORF9FWElUOworCisJCW1QVFItPnRvU3RyZWFtKCBvcyApOworCX0KKworCWlubGluZSB2b2lkIHRvU3RyZWFtKFBhaXJPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9QT0lOVEVSX0VYSVQoIG1QVFIgKQorCQkJCTw8ICJyYXdfcG9pbnRlciBpbiBOdW1lcmljOjp0b1N0cmVhbShQYWlyT3V0U3RyZWFtICYpICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJbVBUUi0+dG9TdHJlYW0oIG9zLk9TMSApOworCQltUFRSLT50b1N0cmVhbSggb3MuT1MyICk7CisJfQorCisJaW5saW5lIHZvaWQgdG9TdHJlYW0oVHJpcGxlT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBtUFRSICkKKwkJCQk8PCAicmF3X3BvaW50ZXIgaW4gTnVtZXJpYzo6dG9TdHJlYW0oVHJpcGxlT3V0U3RyZWFtICYpICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJbVBUUi0+dG9TdHJlYW0oIG9zLk9TMSApOworCQltUFRSLT50b1N0cmVhbSggb3MuT1MyICk7CisJCW1QVFItPnRvU3RyZWFtKCBvcy5PUzMgKTsKKwl9CisKKworCWlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZygKKwkJCWNvbnN0IEF2bUluZGVudCAmIGluZGVudCA9IEFWTV9UQUJfSU5ERU5UKSBjb25zdAorCXsKKwkJU3RyaW5nT3V0U3RyZWFtIG9zcyhpbmRlbnQpOworCisJCXRvU3RyZWFtKCBvc3MgKTsKKworCQlyZXR1cm4oIG9zcy5zdHIoKSApOworCX0KKworCWlubGluZSBzdGQ6OnN0cmluZyBzdHIoKSBjb25zdAorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggbVBUUiApCisJCQkJPDwgInJhd19wb2ludGVyIGluIE51bWVyaWM6OnN0cigpICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJcmV0dXJuKCBtUFRSLT5zdHIoKSApOworCX0KKworCit9OworCisKKy8qKgorICogb3BlcmF0b3I8PAorICovCitBVk1fT1NfU1RSRUFNKCBOdW1lcmljICkKKworCitpbmxpbmUgT3V0U3RyZWFtICYgb3BlcmF0b3I8PChPdXRTdHJlYW0gJiBvcywgY29uc3QgSW50ZWdlciAmIGFOdW1iZXIpCit7CisJYU51bWJlci50b1N0cmVhbSggb3MgKTsKKworCXJldHVybiggb3MgKTsKK30KKworLyoqCisgKiBTZXJpYWxpemF0aW9uCisgKi8KK2lubGluZSBPdXRTdHJlYW0gJiBvcGVyYXRvcjw8KE91dFN0cmVhbSAmIG9zLCBjb25zdCBSYXRpb25hbCAmIGFOdW1iZXIpCit7CisJYU51bWJlci50b1N0cmVhbSggb3MgKTsKKworCXJldHVybiggb3MgKTsKK30KKworLyoqCisgKiBTZXJpYWxpemF0aW9uCisgKi8KK2lubGluZSBPdXRTdHJlYW0gJiBvcGVyYXRvcjw8KE91dFN0cmVhbSAmIG9zLCBjb25zdCBGbG9hdCAmIGFOdW1iZXIpCit7CisJYU51bWJlci50b1N0cmVhbSggb3MgKTsKKworCXJldHVybiggb3MgKTsKK30KKworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworI2VuZGlmIC8qIEZNTF9FWFBSRVNTSU9OX05VTUVSSUNfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9udW1lcmljL1JFQURNRS5tZCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9udW1lcmljL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWU1NDdiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL251bWVyaWMvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTYgQEAKKyMgRUZNLVNZTUJFWCA6IE51bWVyaWMKKworIyMgU291cmNlIGNvZGUgc3RydWN0dXJlCisKKyMjIyBJbnRlcmZhY2VzCisqICoqSU51bWVyaWMqKgorCisjIyMgQ2xhc3NlcworKiAqKkludGVnZXIqKgorKiAqKlJhdGlvbmFsKioKKyogKipGbG9hdCoqCisqICoqUmVhbCoqCisKKyMjIyBGYWN0b3JpZXMKKyogKipOdW1lcmljKiogYXMgU21hcnQgUG9pbnRlcgorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbnVtZXJpYy9SYXRpb25hbC5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbnVtZXJpYy9SYXRpb25hbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIyZjEyMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9udW1lcmljL1JhdGlvbmFsLmNwcApAQCAtMCwwICsxLDIzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMSBtYXJzIDIwMTIKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlJhdGlvbmFsLmgiCisKKworbmFtZXNwYWNlIHNlcAoreworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL251bWVyaWMvUmF0aW9uYWwuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9udW1lcmljL1JhdGlvbmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ4MWFiMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9udW1lcmljL1JhdGlvbmFsLmgKQEAgLTAsMCArMSw0MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDEgbWFycyAyMDEyCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRk1MX0VYUFJFU1NJT05fUkFUSU9OQUxfSF8KKyNkZWZpbmUgRk1MX0VYUFJFU1NJT05fUkFUSU9OQUxfSF8KKworI2lmIGRlZmluZWQoIF9BVk1fQlVJTFRJTl9OVU1FUklDX0dNUF8gKQorCisjaW5jbHVkZSA8Zm1sL251bWVyaWMvZ21wL1JhdGlvbmFsSW1wbC5oPgorCisjZWxpZiBkZWZpbmVkKCBfQVZNX0JVSUxUSU5fTlVNRVJJQ19CT09TVF8gKQorCisjaW5jbHVkZSA8Zm1sL251bWVyaWMvYm9vc3QvUmF0aW9uYWxJbXBsLmg+CisKKyNlbHNlCisKKyNpbmNsdWRlIDxmbWwvbnVtZXJpYy9iYXNpYy9SYXRpb25hbEltcGwuaD4KKworI2VuZGlmIC8qIF9BVk1fQlVJTFRJTl9OVU1FUklDX0dNUF8gKi8KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKiBGTUxfRVhQUkVTU0lPTl9SQVRJT05BTF9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL251bWVyaWMvYmFzaWMvRmxvYXRJbXBsLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbnVtZXJpYy9iYXNpYy9GbG9hdEltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjUyNmMxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL251bWVyaWMvYmFzaWMvRmxvYXRJbXBsLmgKQEAgLTAsMCArMSwzNzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxMCBtYWkgMjAxNgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIEltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEZNTF9OVU1FUklDX0JBU0lDX0ZMT0FUSU1QTF9IXworI2RlZmluZSBGTUxfTlVNRVJJQ19CQVNJQ19GTE9BVElNUExfSF8KKworI2luY2x1ZGUgPGZtbC9udW1lcmljL051bWJlci5oPgorCisjaW5jbHVkZSA8Zm1sL251bWVyaWMvSW50ZWdlci5oPgorI2luY2x1ZGUgPGZtbC9udW1lcmljL1JhdGlvbmFsLmg+CisKKyNpbmNsdWRlIDxjbWF0aD4KKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIEZsb2F0IDoKKwkJcHVibGljIE51bWJlciwKKwkJcHVibGljIEdlbmVyaWNOdW1iZXJDbGFzczwgYXZtX2Zsb2F0X3QgLCBGbG9hdCA+Cit7CisKKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggRmxvYXQgKQorCisKKwkvKioKKwkgKiBUWVBFREVGCisJICovCitwdWJsaWM6CisJdHlwZWRlZiAgYXZtX2Zsb2F0X3QgIFJhd1ZhbHVlVHlwZTsKKworcHJpdmF0ZToKKwl0eXBlZGVmICBHZW5lcmljTnVtYmVyQ2xhc3M8IFJhd1ZhbHVlVHlwZSAsIEZsb2F0ID4gIFRoaXNOdW1iZXJDbGFzczsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJRmxvYXQoY29uc3QgUmF0aW9uYWwgJiBhUmF0aW9uYWwpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggRmxvYXQgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKCBhUmF0aW9uYWwudG9GbG9hdCgpICkgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJRmxvYXQoY29uc3QgSW50ZWdlciAmIGFuSW50ZWdlcikKKwk6IE51bWJlciggQ0xBU1NfS0lORF9UKCBGbG9hdCApICksCisJVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoIGFuSW50ZWdlci5nZXRWYWx1ZSgpICkgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvLyBhdm1fZmxvYXRfdCAgaS5lLiAgZG91YmxlCisJRmxvYXQoYXZtX2Zsb2F0X3QgYVZhbHVlKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIEZsb2F0ICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIFJhd1ZhbHVlVHlwZShhVmFsdWUpICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8vIGZsb2F0CisJRmxvYXQoZmxvYXQgYVZhbHVlKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIEZsb2F0ICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIFJhd1ZhbHVlVHlwZShhVmFsdWUpICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8vIGF2bV9pbnRlZ2VyX3QgIGkuZS4gIGF2bV9pbnQ2NF90CisJRmxvYXQoYXZtX2ludGVnZXJfdCBhVmFsdWUpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggRmxvYXQgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKGFWYWx1ZSkgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLy8gYXZtX3VpbnRlZ2VyX3QgIGkuZS4gIGF2bV91aW50NjRfdAorCUZsb2F0KGF2bV91aW50ZWdlcl90IGFWYWx1ZSkKKwk6IE51bWJlciggQ0xBU1NfS0lORF9UKCBGbG9hdCApICksCisJVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoYVZhbHVlKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKyNpZmRlZiBfQVZNX05FRURfSU5UNjRfVF9PVkVSTE9BRFNfCisKKwkvLyBsb25nCisJRmxvYXQobG9uZyBhVmFsdWUpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggRmxvYXQgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKGFWYWx1ZSkgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJRmxvYXQodW5zaWduZWQgbG9uZyBhVmFsdWUpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggRmxvYXQgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKGFWYWx1ZSkgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisjZW5kaWYgLyogX0FWTV9ORUVEX0lOVDY0X1RfT1ZFUkxPQURTXyAqLworCisJLy8gaW50MzJfdAorCUZsb2F0KGludCBhVmFsdWUpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggRmxvYXQgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKGFWYWx1ZSkgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLy8gdWludDMyX3QKKwlGbG9hdCh1bnNpZ25lZCBpbnQgYVZhbHVlKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIEZsb2F0ICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIFJhd1ZhbHVlVHlwZShhVmFsdWUpICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8vIHN0ZDo6c3RyaW5nCisJRmxvYXQoY29uc3Qgc3RkOjpzdHJpbmcgJiBhVmFsdWUpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggRmxvYXQgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggc2VwOjpzdHJpbmdfdG88IGF2bV9mbG9hdF90ID4oYVZhbHVlLCBzdGQ6OmRlYykgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJRmxvYXQoY29uc3QgRmxvYXQgJiBhRmxvYXQpCisJOiBOdW1iZXIoIGFGbG9hdCApLAorCVRoaXNOdW1iZXJDbGFzcyggYUZsb2F0ICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5GbG9hdCgpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIEJBU0lDUyBURVNUUworCSAqLworCWlubGluZSB2aXJ0dWFsIGludCBzaWduKCkgY29uc3QKKwl7CisJCXJldHVybiggKFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlIDwgMCkgPyAtMSA6CisJCQkJKFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlID4gMCkgKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIGJvb2wgaXNQb3NpdGl2ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlID49IDAgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBib29sIHN0cmljdGx5UG9zaXRpdmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSA+IDAgKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIGJvb2wgaXNOZWdhdGl2ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlIDw9IDAgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBib29sIHN0cmljdGx5TmVnYXRpdmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSA8IDAgKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIGJvb2wgaXNaZXJvKCkgY29uc3QKKwl7CisJCXJldHVybiggVGhpc051bWJlckNsYXNzOjptVmFsdWUgPT0gMCApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGJvb2wgaXNPbmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSA9PSAxICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgYm9vbCBpc05lZ2F0aXZlT25lKCkgY29uc3QKKwl7CisJCXJldHVybiggVGhpc051bWJlckNsYXNzOjptVmFsdWUgPT0gLTEgKTsKKwl9CisKKworCS8qKgorCSAqIENPTlZFUlNJT04KKwkgKi8KKwlpbmxpbmUgdmlydHVhbCBib29sIGlzSW50MzIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAoVGhpc051bWJlckNsYXNzOjptVmFsdWUgPT0KKwkJCQkJc3RhdGljX2Nhc3Q8IGF2bV9pbnQzMl90ID4oIFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlICkpICYmCisJCQkJKEFWTV9OVU1FUklDX01JTl9JTlQgPD0gVGhpc051bWJlckNsYXNzOjptVmFsdWUpICYmCisJCQkJKFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlIDw9IEFWTV9OVU1FUklDX01BWF9JTlQpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgYXZtX2ludDMyX3QgdG9JbnQzMigpIGNvbnN0CisJeworCQlyZXR1cm4oIHN0YXRpY19jYXN0PCBhdm1faW50MzJfdCA+KCBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSApICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgYm9vbCBpc0ludDY0KCkgY29uc3QKKwl7CisJCXJldHVybiggKFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlID09CisJCQkJCXN0YXRpY19jYXN0PCBhdm1faW50NjRfdCA+KCBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSApKSAmJgorCQkJCShBVk1fTlVNRVJJQ19NSU5fTE9ORyA8PSBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSkgJiYKKwkJCQkoVGhpc051bWJlckNsYXNzOjptVmFsdWUgPD0gQVZNX05VTUVSSUNfTUlOX0xPTkcpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgYXZtX2ludDY0X3QgdG9JbnQ2NCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHN0YXRpY19jYXN0PCBhdm1faW50NjRfdCA+KCBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSApICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBib29sIGlzSW50ZWdlcigpIGNvbnN0CisJeworCQlyZXR1cm4oIFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlID09CisJCQkJc3RhdGljX2Nhc3Q8IGF2bV9pbnRlZ2VyX3QgPiggVGhpc051bWJlckNsYXNzOjptVmFsdWUgKSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGF2bV9pbnRlZ2VyX3QgdG9JbnRlZ2VyKCkgY29uc3QKKwl7CisJCXJldHVybiggc3RhdGljX2Nhc3Q8IGF2bV9pbnRlZ2VyX3QgPiggVGhpc051bWJlckNsYXNzOjptVmFsdWUgKSApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgYm9vbCBpc1Bvc0ludGVnZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSA9PQorCQkJCXN0YXRpY19jYXN0PCBhdm1fdWludGVnZXJfdCA+KCBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSApICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBib29sIGlzVUludGVnZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSA9PQorCQkJCXN0YXRpY19jYXN0PCBhdm1fdWludGVnZXJfdCA+KCBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSApICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgYXZtX3VpbnRlZ2VyX3QgdG9VSW50ZWdlcigpIGNvbnN0CisJeworCQlyZXR1cm4oIHN0YXRpY19jYXN0PCBhdm1fdWludGVnZXJfdCA+KCBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSApICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBib29sIGlzUmF0aW9uYWwoKSBjb25zdAorCXsKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisJdmlydHVhbCBhdm1faW50ZWdlcl90IHRvRGVub21pbmF0b3IoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBzdGF0aWNfY2FzdDwgYXZtX2ludGVnZXJfdCA+KCBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSApICk7CisJfQorCisJdmlydHVhbCBhdm1faW50ZWdlcl90IHRvTnVtZXJhdG9yKCkgY29uc3QKKwl7CisJCXJldHVybiggc3RhdGljX2Nhc3Q8IGF2bV9pbnRlZ2VyX3QgPiggVGhpc051bWJlckNsYXNzOjptVmFsdWUgKSApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgYm9vbCBpc0Zsb2F0KCkgY29uc3QKKwl7CisJCXJldHVybiggdHJ1ZSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGF2bV9mbG9hdF90IHRvRmxvYXQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgYm9vbCBpc1JlYWwoKSBjb25zdAorCXsKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgYXZtX3JlYWxfdCB0b1JlYWwoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBzdGF0aWNfY2FzdDwgYXZtX3JlYWxfdCA+KCBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSApICk7CisJfQorCisKKwkvKioKKwkgKiBtYXRoIGZ1bmN0aW9uCisJICovCisJaW5saW5lIHZvaWQgc2V0X3Bvdyhhdm1fdWludGVnZXJfdCBhbkV4cG9uZW50KQorCXsKKwkJVGhpc051bWJlckNsYXNzOjptVmFsdWUgPSBzdGQ6OnBvdyhUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSwgYW5FeHBvbmVudCk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0X3Bvdyhkb3VibGUgYVZhbHVlLCBhdm1fdWludGVnZXJfdCBhbkV4cG9uZW50KQorCXsKKwkJVGhpc051bWJlckNsYXNzOjptVmFsdWUgPSBzdGQ6OnBvdyhhVmFsdWUsIGFuRXhwb25lbnQpOworCX0KKworCisJLyoqCisJICogU2VyaWFsaXphdGlvbgorCSAqLworCXZpcnR1YWwgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCW9zIDw8IFRBQiA8PCBPU19GTE9BVF9QUkVDSVNJT04gPDwgbVZhbHVlOworCQlBVk1fREVCVUdfUkVGX0NPVU5URVIob3MpOworCQlvcyA8PCBFT0xfRkxVU0g7CisJfQorCisJdmlydHVhbCBzdGQ6OnN0cmluZyBzdHIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBPU1MoKSA8PCBPU19SRUFMX1BSRUNJU0lPTiA8PCBtVmFsdWUgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBzdGQ6OnN0cmluZyBzdHJOdW0oCisJCQlhdm1fdWludDhfdCBwcmVjaXNpb24gPSBBVk1fTVVNRVJJQ19QUkVDSVNJT04pIGNvbnN0CisJeworCQlyZXR1cm4oIE9TUygpIDw8IHN0ZDo6Zml4ZWQKKwkJCQk8PCBzdGQ6OnNldHByZWNpc2lvbiggcHJlY2lzaW9uICkgPDwgbVZhbHVlICk7CisJfQorCit9OworCisKKy8qKgorICogT3BlcmF0b3JzCisgKi8KK2lubGluZSBGbG9hdDo6UmF3VmFsdWVUeXBlIG9wZXJhdG9yKyAoRmxvYXQ6OlJhd1ZhbHVlVHlwZSBhRkxvYXQsCisJCWNvbnN0IFJhdGlvbmFsOjpSYXdWYWx1ZVR5cGUgJiBhUmF0aW9uYWwpCit7CisJcmV0dXJuKCBzdGF0aWNfY2FzdDwgRmxvYXQ6OlJhd1ZhbHVlVHlwZSA+KCBhRkxvYXQgKyBhUmF0aW9uYWwudG9GbG9hdCgpICkgKTsKK30KKworaW5saW5lIEZsb2F0OjpSYXdWYWx1ZVR5cGUgb3BlcmF0b3ItIChGbG9hdDo6UmF3VmFsdWVUeXBlIGFGTG9hdCwKKwkJY29uc3QgUmF0aW9uYWw6OlJhd1ZhbHVlVHlwZSAmIGFSYXRpb25hbCkKK3sKKwlyZXR1cm4oIHN0YXRpY19jYXN0PCBGbG9hdDo6UmF3VmFsdWVUeXBlID4oIGFGTG9hdCAtIGFSYXRpb25hbC50b0Zsb2F0KCkgKSApOworfQorCitpbmxpbmUgRmxvYXQ6OlJhd1ZhbHVlVHlwZSBvcGVyYXRvciogKEZsb2F0OjpSYXdWYWx1ZVR5cGUgYUZMb2F0LAorCQljb25zdCBSYXRpb25hbDo6UmF3VmFsdWVUeXBlICYgYVJhdGlvbmFsKQoreworCXJldHVybiggc3RhdGljX2Nhc3Q8IEZsb2F0OjpSYXdWYWx1ZVR5cGUgPiggYUZMb2F0ICogYVJhdGlvbmFsLnRvRmxvYXQoKSApICk7Cit9CisKK2lubGluZSBGbG9hdDo6UmF3VmFsdWVUeXBlIG9wZXJhdG9yLyAoRmxvYXQ6OlJhd1ZhbHVlVHlwZSBhRkxvYXQsCisJCWNvbnN0IFJhdGlvbmFsOjpSYXdWYWx1ZVR5cGUgJiBhUmF0aW9uYWwpCit7CisJcmV0dXJuKCBzdGF0aWNfY2FzdDwgRmxvYXQ6OlJhd1ZhbHVlVHlwZSA+KCBhRkxvYXQgLyBhUmF0aW9uYWwudG9GbG9hdCgpICkgKTsKK30KKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qIEZNTF9OVU1FUklDX0JBU0lDX0ZMT0FUSU1QTF9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL251bWVyaWMvYmFzaWMvSW50ZWdlckltcGwuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9udW1lcmljL2Jhc2ljL0ludGVnZXJJbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkwOGQ1ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9udW1lcmljL2Jhc2ljL0ludGVnZXJJbXBsLmgKQEAgLTAsMCArMSwzMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxMCBtYWkgMjAxNgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIEltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEZNTF9OVU1FUklDX0JBU0lDX0lOVEVHRVJJTVBMX0hfCisjZGVmaW5lIEZNTF9OVU1FUklDX0JBU0lDX0lOVEVHRVJJTVBMX0hfCisKKyNpbmNsdWRlIDxmbWwvbnVtZXJpYy9OdW1iZXIuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKK2NsYXNzIEludGVnZXIgOgorCQlwdWJsaWMgTnVtYmVyLAorCQlwdWJsaWMgR2VuZXJpY051bWJlckNsYXNzPCBhdm1faW50ZWdlcl90ICwgSW50ZWdlciA+Cit7CisKKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggSW50ZWdlciApCisKKworCS8qKgorCSAqIFRZUEVERUYKKwkgKi8KK3B1YmxpYzoKKwl0eXBlZGVmICBhdm1faW50ZWdlcl90ICBSYXdWYWx1ZVR5cGU7CisKK3ByaXZhdGU6CisJdHlwZWRlZiAgR2VuZXJpY051bWJlckNsYXNzPCBSYXdWYWx1ZVR5cGUgLCBJbnRlZ2VyID4gIFRoaXNOdW1iZXJDbGFzczsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJLy8gYXZtX2ludGVnZXJfdCAgaS5lLiAgYXZtX2ludDY0X3QKKwlJbnRlZ2VyKGF2bV9pbnRlZ2VyX3QgYVZhbHVlKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIEludGVnZXIgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggYXZtX2ludGVnZXJfdChhVmFsdWUpICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8vIGF2bV91aW50ZWdlcl90ICBpLmUuICBhdm1fdWludDY0X3QKKwlJbnRlZ2VyKGF2bV91aW50ZWdlcl90IGFWYWx1ZSkKKwk6IE51bWJlciggQ0xBU1NfS0lORF9UKCBJbnRlZ2VyICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIGF2bV9pbnRlZ2VyX3QoYVZhbHVlKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKyNpZmRlZiBfQVZNX05FRURfSU5UNjRfVF9PVkVSTE9BRFNfCisKKwkvLyBsb25nCisJSW50ZWdlcihsb25nIGFWYWx1ZSkKKwk6IE51bWJlciggQ0xBU1NfS0lORF9UKCBJbnRlZ2VyICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIGF2bV9pbnRlZ2VyX3QoYVZhbHVlKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvLyB1bnNpZ25lZCBsb25nCisJSW50ZWdlcih1bnNpZ25lZCBsb25nIGFWYWx1ZSkKKwk6IE51bWJlciggQ0xBU1NfS0lORF9UKCBJbnRlZ2VyICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIGF2bV9pbnRlZ2VyX3QoYVZhbHVlKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKyNlbmRpZiAvKiBfQVZNX05FRURfSU5UNjRfVF9PVkVSTE9BRFNfICovCisKKwkvLyBpbnQzMl90CisJSW50ZWdlcihpbnQgYVZhbHVlKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIEludGVnZXIgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggYXZtX2ludGVnZXJfdChhVmFsdWUpICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8vIHVpbnQzMl90CisJSW50ZWdlcih1bnNpZ25lZCBpbnQgYVZhbHVlKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIEludGVnZXIgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggYXZtX2ludGVnZXJfdChhVmFsdWUpICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJSW50ZWdlcihjb25zdCBzdGQ6OnN0cmluZyAmIGFWYWx1ZSkKKwk6IE51bWJlciggQ0xBU1NfS0lORF9UKCBJbnRlZ2VyICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIHNlcDo6c3RyaW5nX3RvPCBhdm1faW50ZWdlcl90ID4oYVZhbHVlLCBzdGQ6OmRlYykgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJSW50ZWdlcihjb25zdCBJbnRlZ2VyICYgYW5JbnRlZ2VyKQorCTogTnVtYmVyKCBhbkludGVnZXIgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIGFuSW50ZWdlciApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+SW50ZWdlcigpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIEJBU0lDUyBURVNUUworCSAqLworCXZpcnR1YWwgaW5saW5lIGludCBzaWduKCkgY29uc3QKKwl7CisJCXJldHVybiggKFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlIDwgMCkgPyAtMSA6CisJCQkJKFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlID4gMCkgKTsKKwl9CisKKwl2aXJ0dWFsIGlubGluZSBib29sIHN0cmljdGx5UG9zaXRpdmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSA+IDAgKTsKKwl9CisKKwl2aXJ0dWFsIGlubGluZSBib29sIHN0cmljdGx5TmVnYXRpdmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSA8IDAgKTsKKwl9CisKKwl2aXJ0dWFsIGlubGluZSBib29sIGlzWmVybygpIGNvbnN0CisJeworCQlyZXR1cm4oIFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlID09IDAgKTsKKwl9CisKKwl2aXJ0dWFsIGlubGluZSBib29sIGlzT25lKCkgY29uc3QKKwl7CisJCXJldHVybiggVGhpc051bWJlckNsYXNzOjptVmFsdWUgPT0gMSApOworCX0KKworCXZpcnR1YWwgaW5saW5lIGJvb2wgaXNOZWdhdGl2ZU9uZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlID09IC0xICk7CisJfQorCisKKwkvKioKKwkgKiBDT05WRVJTSU9OCisJICovCisJaW5saW5lIHZpcnR1YWwgYm9vbCBpc0ludDMyKCkgY29uc3QKKwl7CisJCXJldHVybiggKEFWTV9OVU1FUklDX01JTl9JTlQzMiA8PSBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSkgJiYKKwkJCQkoVGhpc051bWJlckNsYXNzOjptVmFsdWUgPD0gQVZNX05VTUVSSUNfTUFYX0lOVDMyKSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGF2bV9pbnQzMl90IHRvSW50MzIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBzdGF0aWNfY2FzdDwgYXZtX2ludDMyX3QgPiggVGhpc051bWJlckNsYXNzOjptVmFsdWUgKSApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgYm9vbCBpc0ludDY0KCkgY29uc3QKKwl7CisJCXJldHVybiggKEFWTV9OVU1FUklDX01JTl9JTlQ2NCA8PSBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSkgJiYKKwkJCQkoVGhpc051bWJlckNsYXNzOjptVmFsdWUgPD0gQVZNX05VTUVSSUNfTUFYX0lOVDY0KSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGF2bV9pbnQ2NF90IHRvSW50NjQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBzdGF0aWNfY2FzdDwgYXZtX2ludDY0X3QgPiggVGhpc051bWJlckNsYXNzOjptVmFsdWUgKSApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgYm9vbCBpc0ludGVnZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgYXZtX2ludGVnZXJfdCB0b0ludGVnZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBzdGF0aWNfY2FzdDwgYXZtX2ludGVnZXJfdCA+KCBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSApICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBib29sIGlzUG9zSW50ZWdlcigpIGNvbnN0CisJeworCQlyZXR1cm4oIFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlID49IDAgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBib29sIGlzVUludGVnZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSA+PSAwICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBhdm1fdWludGVnZXJfdCB0b1VJbnRlZ2VyKCkgY29uc3QKKwl7CisJCXJldHVybiggc3RhdGljX2Nhc3Q8IGF2bV91aW50ZWdlcl90ID4oIFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlICkgKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIGJvb2wgaXNSYXRpb25hbCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKwl2aXJ0dWFsIGF2bV9pbnRlZ2VyX3QgdG9OdW1lcmF0b3IoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBzdGF0aWNfY2FzdDwgYXZtX2ludGVnZXJfdCA+KCBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSApICk7CisJfQorCisJdmlydHVhbCBhdm1faW50ZWdlcl90IHRvRGVub21pbmF0b3IoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBzdGF0aWNfY2FzdDwgYXZtX2ludGVnZXJfdCA+KCAxICkgKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIGJvb2wgaXNGbG9hdCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBhdm1fZmxvYXRfdCB0b0Zsb2F0KCkgY29uc3QKKwl7CisJCXJldHVybiggc3RhdGljX2Nhc3Q8IGF2bV9mbG9hdF90ID4oIFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlICkgKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIGJvb2wgaXNSZWFsKCkgY29uc3QKKwl7CisJCXJldHVybiggdHJ1ZSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGF2bV9yZWFsX3QgdG9SZWFsKCkgY29uc3QKKwl7CisJCXJldHVybiggc3RhdGljX2Nhc3Q8IGF2bV9yZWFsX3QgPiggVGhpc051bWJlckNsYXNzOjptVmFsdWUgKSApOworCX0KKworCisJLyoqCisJICogbWF0aCBmdW5jdGlvbgorCSAqLworCWlubGluZSBzdGF0aWMgYXZtX3VpbnRlZ2VyX3QgaXBvdygKKwkJCWF2bV91aW50ZWdlcl90IGFWYWx1ZSwgYXZtX3VpbnRlZ2VyX3QgYW5FeHBvbmVudCkKKwl7CisJCWF2bV91aW50ZWdlcl90IGFSZXN1bHQgPSAxOworCQlmb3IoIDsgYW5FeHBvbmVudCA+IDA7IC0tYW5FeHBvbmVudCApCisJCXsKKwkJCWFSZXN1bHQgKj0gYVZhbHVlOworCQl9CisKKy8vCQl3aGlsZSggYW5FeHBvbmVudCAhPSAwICkKKy8vCQl7CisvLwkJCWlmKCAoYW5FeHBvbmVudCAmIDEpID09IDEgKQorLy8JCQl7CisvLwkJCQlhUmVzdWx0ICo9IGFWYWx1ZTsKKy8vCQkJfQorLy8KKy8vCQkJYW5FeHBvbmVudCA+Pj0gMTsKKy8vCQkJYVZhbHVlICo9IGFWYWx1ZTsKKy8vCQl9CisKKwkJcmV0dXJuKCBhUmVzdWx0ICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0X3Bvdyhhdm1fdWludGVnZXJfdCBhbkV4cG9uZW50KQorCXsKKwkJVGhpc051bWJlckNsYXNzOjptVmFsdWUgPQorCQkJCUludGVnZXI6Omlwb3coVGhpc051bWJlckNsYXNzOjptVmFsdWUsIGFuRXhwb25lbnQpOworCX0KKworCWlubGluZSB2b2lkIHNldF9wb3coYXZtX3VpbnRlZ2VyX3QgYVZhbHVlLCBhdm1fdWludGVnZXJfdCBhbkV4cG9uZW50KQorCXsKKwkJVGhpc051bWJlckNsYXNzOjptVmFsdWUgPSBJbnRlZ2VyOjppcG93KGFWYWx1ZSwgYW5FeHBvbmVudCk7CisJfQorCisKKwlpbmxpbmUgSW50ZWdlciBwb3coYXZtX3VpbnRlZ2VyX3QgYW5FeHBvbmVudCkgY29uc3QKKwl7CisJCXJldHVybiggSW50ZWdlciggSW50ZWdlcjo6aXBvdyhUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSwgYW5FeHBvbmVudCkgKSApOworCX0KKworCWlubGluZSBzdGF0aWMgSW50ZWdlciBwb3coYXZtX3VpbnRlZ2VyX3QgYVZhbHVlLCBhdm1fdWludGVnZXJfdCBhbkV4cG9uZW50KQorCXsKKwkJcmV0dXJuKCBJbnRlZ2VyKCBJbnRlZ2VyOjppcG93KGFWYWx1ZSwgYW5FeHBvbmVudCkgKSApOworCX0KKworCisJLyoqCisJICogU2VyaWFsaXphdGlvbgorCSAqLworCWlubGluZSB2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJb3MgPDwgVEFCIDw8IG1WYWx1ZTsKKwkJQVZNX0RFQlVHX1JFRl9DT1VOVEVSKG9zKTsKKwkJb3MgPDwgRU9MIDw8IHN0ZDo6Zmx1c2g7CisJfQorCisJdmlydHVhbCBzdGQ6OnN0cmluZyBzdHIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBPU1MoKSA8PCBtVmFsdWUgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBzdGQ6OnN0cmluZyBzdHJOdW0oCisJCQlhdm1fdWludDhfdCBwcmVjaXNpb24gPSBBVk1fTVVNRVJJQ19QUkVDSVNJT04pIGNvbnN0CisJeworCQlyZXR1cm4oIE9TUygpIDw8IG1WYWx1ZSApOworCX0KKworfTsKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qIEZNTF9OVU1FUklDX0JBU0lDX0lOVEVHRVJJTVBMX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbnVtZXJpYy9iYXNpYy9OdW1lcmljSW1wbC5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL251bWVyaWMvYmFzaWMvTnVtZXJpY0ltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWM5MGEyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL251bWVyaWMvYmFzaWMvTnVtZXJpY0ltcGwuaApAQCAtMCwwICsxLDY5NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDE2IG1haSAyMDE2CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgSW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRk1MX05VTUVSSUNfQkFTSUNfTlVNRVJJQ0lNUExfSF8KKyNkZWZpbmUgRk1MX05VTUVSSUNfQkFTSUNfTlVNRVJJQ0lNUExfSF8KKworI2luY2x1ZGUgPGZtbC9udW1lcmljL2Jhc2ljL0ludGVnZXJJbXBsLmg+CisjaW5jbHVkZSA8Zm1sL251bWVyaWMvYmFzaWMvUmF0aW9uYWxJbXBsLmg+CisjaW5jbHVkZSA8Zm1sL251bWVyaWMvYmFzaWMvRmxvYXRJbXBsLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworbmFtZXNwYWNlIG51bWVyaWMKK3sKKworCisvKioKKyAqIGNvbXBhcmUgRmxvYXQKKyAqIHdpdGggLi4uCisgKi8KK2lubGluZSBpbnQgY29tcGFyZShjb25zdCBGbG9hdCAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuY29tcGFyZSggbnVtMiApICk7Cit9CisKK2lubGluZSBpbnQgY29tcGFyZShjb25zdCBGbG9hdCAmIG51bTEsIGNvbnN0IEludGVnZXIgJiBudW0yKQoreworCXJldHVybiggbnVtMS5jb21wYXJlKCBudW0yICkgKTsKK30KKworaW5saW5lIGludCBjb21wYXJlKGNvbnN0IEZsb2F0ICYgbnVtMSwgY29uc3QgUmF0aW9uYWwgJiBudW0yKQoreworCXJldHVybiggbnVtMS5jb21wYXJlKCBGbG9hdCggbnVtMi50b0Zsb2F0KCkgKSApICk7Cit9CisKKworLyoqCisgKiBjb21wYXJlIFJhdGlvbmFsCisgKiB3aXRoIC4uLgorICovCitpbmxpbmUgaW50IGNvbXBhcmUoY29uc3QgUmF0aW9uYWwgJiBudW0xLCBjb25zdCBSYXRpb25hbCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmNvbXBhcmUoIG51bTIgKSApOworfQorCitpbmxpbmUgaW50IGNvbXBhcmUoY29uc3QgUmF0aW9uYWwgJiBudW0xLCBjb25zdCBJbnRlZ2VyICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuY29tcGFyZSggbnVtMiApICk7Cit9CisKK2lubGluZSBpbnQgY29tcGFyZShjb25zdCBSYXRpb25hbCAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIC0gY29tcGFyZSggbnVtMiwgbnVtMSApICk7Cit9CisKKworLyoqCisgKiBjb21wYXJlIEludGVnZXIKKyAqIHdpdGggLi4uCisgKi8KK2lubGluZSBpbnQgY29tcGFyZShjb25zdCBJbnRlZ2VyICYgbnVtMSwgY29uc3QgSW50ZWdlciAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmNvbXBhcmUoIG51bTIgKSApOworfQorCitpbmxpbmUgaW50IGNvbXBhcmUoY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IFJhdGlvbmFsICYgbnVtMikKK3sKKwlyZXR1cm4oIC0gY29tcGFyZSggbnVtMiwgbnVtMSApICk7Cit9CisKK2lubGluZSBpbnQgY29tcGFyZShjb25zdCBJbnRlZ2VyICYgbnVtMSwgY29uc3QgRmxvYXQgJiBudW0yKQoreworCXJldHVybiggLSBjb21wYXJlKCBudW0yLCBudW0xICkgKTsKK30KKworCisvKioKKyAqIG9wZXJhdG9yPT0KKyAqLworLy8gSW50ZWdlciA9PSBOdW1iZXIKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IEludGVnZXIgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpID09IG51bTIuZ2V0VmFsdWUoKSApOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEludGVnZXIgJiBudW0xLCBjb25zdCBSYXRpb25hbCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPT0gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA9PSBudW0yLmdldFZhbHVlKCkgKTsKK30KKworCisvLyBSYXRpb25hbCA9PSBOdW1iZXIKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgUmF0aW9uYWwgJiBudW0xLCBjb25zdCBSYXRpb25hbCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPT0gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgUmF0aW9uYWwgJiBudW0xLCBjb25zdCBJbnRlZ2VyICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA9PSBudW0yLmdldFZhbHVlKCkgKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBSYXRpb25hbCAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEudG9GbG9hdCgpID09IG51bTIuZ2V0VmFsdWUoKSApOworfQorCisKKy8vIEZsb2F0ID09IE51bWJlcgoraW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBGbG9hdCAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA9PSBudW0yLmdldFZhbHVlKCkgKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBGbG9hdCAmIG51bTEsIGNvbnN0IFJhdGlvbmFsICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA9PSBudW0yLnRvRmxvYXQoKSApOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEZsb2F0ICYgbnVtMSwgY29uc3QgSW50ZWdlciAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPT0gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKKworLyoqCisgKiBvcGVyYXRvciE9CisgKi8KKy8vIEludGVnZXIgIT0gTnVtYmVyCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEludGVnZXIgJiBudW0xLCBjb25zdCBJbnRlZ2VyICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSAhPSBudW0yLmdldFZhbHVlKCkgKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBJbnRlZ2VyICYgbnVtMSwgY29uc3QgUmF0aW9uYWwgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpICE9IG51bTIuZ2V0VmFsdWUoKSApOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEludGVnZXIgJiBudW0xLCBjb25zdCBGbG9hdCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgIT0gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKKworLy8gUmF0aW9uYWwgIT0gTnVtYmVyCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFJhdGlvbmFsICYgbnVtMSwgY29uc3QgUmF0aW9uYWwgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpICE9IG51bTIuZ2V0VmFsdWUoKSApOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFJhdGlvbmFsICYgbnVtMSwgY29uc3QgSW50ZWdlciAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgIT0gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgUmF0aW9uYWwgJiBudW0xLCBjb25zdCBGbG9hdCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLnRvRmxvYXQoKSAhPSBudW0yLmdldFZhbHVlKCkgKTsKK30KKworCisvLyBGbG9hdCAhPSBOdW1iZXIKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBGbG9hdCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgIT0gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBSYXRpb25hbCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgIT0gbnVtMi50b0Zsb2F0KCkgKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBGbG9hdCAmIG51bTEsIGNvbnN0IEludGVnZXIgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpICE9IG51bTIuZ2V0VmFsdWUoKSApOworfQorCisKKy8qKgorICogb3BlcmF0b3I8CisgKi8KKy8vIEludGVnZXIgPCBOdW1iZXIKK2lubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBJbnRlZ2VyICYgbnVtMSwgY29uc3QgSW50ZWdlciAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPCBudW0yLmdldFZhbHVlKCkgKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEludGVnZXIgJiBudW0xLCBjb25zdCBSYXRpb25hbCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPCBudW0yLmdldFZhbHVlKCkgKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEludGVnZXIgJiBudW0xLCBjb25zdCBGbG9hdCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPCBudW0yLmdldFZhbHVlKCkgKTsKK30KKworCisvLyBSYXRpb25hbCA8IE51bWJlcgoraW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFJhdGlvbmFsICYgbnVtMSwgY29uc3QgUmF0aW9uYWwgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpIDwgbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBSYXRpb25hbCAmIG51bTEsIGNvbnN0IEludGVnZXIgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpIDwgbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBSYXRpb25hbCAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEudG9GbG9hdCgpIDwgbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKKworLy8gRmxvYXQgPCBOdW1iZXIKK2lubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBGbG9hdCAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA8IG51bTIuZ2V0VmFsdWUoKSApOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBSYXRpb25hbCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPCBudW0yLnRvRmxvYXQoKSApOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBJbnRlZ2VyICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA8IG51bTIuZ2V0VmFsdWUoKSApOworfQorCisvKioKKyAqIG9wZXJhdG9yPD0KKyAqLworLy8gSW50ZWdlciA8PSBOdW1iZXIKK2lubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IEludGVnZXIgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpIDw9IG51bTIuZ2V0VmFsdWUoKSApOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IEludGVnZXIgJiBudW0xLCBjb25zdCBSYXRpb25hbCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPD0gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA8PSBudW0yLmdldFZhbHVlKCkgKTsKK30KKworCisvLyBSYXRpb25hbCA8PSBOdW1iZXIKK2lubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgUmF0aW9uYWwgJiBudW0xLCBjb25zdCBSYXRpb25hbCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPD0gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgUmF0aW9uYWwgJiBudW0xLCBjb25zdCBJbnRlZ2VyICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA8PSBudW0yLmdldFZhbHVlKCkgKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBSYXRpb25hbCAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEudG9GbG9hdCgpIDw9IG51bTIuZ2V0VmFsdWUoKSApOworfQorCisKKy8vIEZsb2F0IDw9IE51bWJlcgoraW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBGbG9hdCAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA8PSBudW0yLmdldFZhbHVlKCkgKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBGbG9hdCAmIG51bTEsIGNvbnN0IFJhdGlvbmFsICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA8PSBudW0yLnRvRmxvYXQoKSApOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IEZsb2F0ICYgbnVtMSwgY29uc3QgSW50ZWdlciAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPD0gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKKworLyoqCisgKiBvcGVyYXRvcj4KKyAqLworLy8gSW50ZWdlciA+IE51bWJlcgoraW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEludGVnZXIgJiBudW0xLCBjb25zdCBJbnRlZ2VyICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA+IG51bTIuZ2V0VmFsdWUoKSApOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IFJhdGlvbmFsICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA+IG51bTIuZ2V0VmFsdWUoKSApOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA+IG51bTIuZ2V0VmFsdWUoKSApOworfQorCisKKy8vIFJhdGlvbmFsID4gTnVtYmVyCitpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgUmF0aW9uYWwgJiBudW0xLCBjb25zdCBSYXRpb25hbCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPiBudW0yLmdldFZhbHVlKCkgKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IFJhdGlvbmFsICYgbnVtMSwgY29uc3QgSW50ZWdlciAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPiBudW0yLmdldFZhbHVlKCkgKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IFJhdGlvbmFsICYgbnVtMSwgY29uc3QgRmxvYXQgJiBudW0yKQoreworCXJldHVybiggbnVtMS50b0Zsb2F0KCkgPiBudW0yLmdldFZhbHVlKCkgKTsKK30KKworCisvLyBGbG9hdCA+IE51bWJlcgoraW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEZsb2F0ICYgbnVtMSwgY29uc3QgRmxvYXQgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpID4gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBGbG9hdCAmIG51bTEsIGNvbnN0IFJhdGlvbmFsICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA+IG51bTIudG9GbG9hdCgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBGbG9hdCAmIG51bTEsIGNvbnN0IEludGVnZXIgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpID4gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKKy8qKgorICogb3BlcmF0b3I+PQorICovCisvLyBJbnRlZ2VyID49IE51bWJlcgoraW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBJbnRlZ2VyICYgbnVtMSwgY29uc3QgSW50ZWdlciAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPj0gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IFJhdGlvbmFsICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA+PSBudW0yLmdldFZhbHVlKCkgKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBJbnRlZ2VyICYgbnVtMSwgY29uc3QgRmxvYXQgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpID49IG51bTIuZ2V0VmFsdWUoKSApOworfQorCisKKy8vIFJhdGlvbmFsID49IE51bWJlcgoraW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBSYXRpb25hbCAmIG51bTEsIGNvbnN0IFJhdGlvbmFsICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA+PSBudW0yLmdldFZhbHVlKCkgKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBSYXRpb25hbCAmIG51bTEsIGNvbnN0IEludGVnZXIgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpID49IG51bTIuZ2V0VmFsdWUoKSApOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IFJhdGlvbmFsICYgbnVtMSwgY29uc3QgRmxvYXQgJiBudW0yKQoreworCXJldHVybiggbnVtMS50b0Zsb2F0KCkgPj0gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKKworLy8gRmxvYXQgPj0gTnVtYmVyCitpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEZsb2F0ICYgbnVtMSwgY29uc3QgRmxvYXQgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpID49IG51bTIuZ2V0VmFsdWUoKSApOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEZsb2F0ICYgbnVtMSwgY29uc3QgUmF0aW9uYWwgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpID49IG51bTIudG9GbG9hdCgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBJbnRlZ2VyICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA+PSBudW0yLmdldFZhbHVlKCkgKTsKK30KKworCisvKioKKyAqIG9wZXJhdG9yKworICovCisvLyBJbnRlZ2VyICsgTnVtYmVyCitpbmxpbmUgSW50ZWdlciBvcGVyYXRvcisoY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IEludGVnZXIgJiBudW0yKQoreworCXJldHVybiggSW50ZWdlcihudW0xLmdldFZhbHVlKCkgKyBudW0yLmdldFZhbHVlKCkpICk7Cit9CisKK2lubGluZSBSYXRpb25hbCBvcGVyYXRvcisoY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IFJhdGlvbmFsICYgbnVtMikKK3sKKwlyZXR1cm4oIFJhdGlvbmFsKFJhdGlvbmFsKG51bTEpLmdldFZhbHVlKCkgKyBudW0yLmdldFZhbHVlKCkpICk7Cit9CisKK2lubGluZSBGbG9hdCBvcGVyYXRvcisoY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIEZsb2F0KG51bTEuZ2V0VmFsdWUoKSArIG51bTIuZ2V0VmFsdWUoKSkgKTsKK30KKworCisvLyBSYXRpb25hbCArIE51bWJlcgoraW5saW5lIFJhdGlvbmFsIG9wZXJhdG9yKyhjb25zdCBSYXRpb25hbCAmIG51bTEsIGNvbnN0IFJhdGlvbmFsICYgbnVtMikKK3sKKwlyZXR1cm4oIFJhdGlvbmFsKG51bTEuZ2V0VmFsdWUoKSArIG51bTIuZ2V0VmFsdWUoKSkgKTsKK30KKworaW5saW5lIFJhdGlvbmFsIG9wZXJhdG9yKyhjb25zdCBSYXRpb25hbCAmIG51bTEsIGNvbnN0IEludGVnZXIgJiBudW0yKQoreworCXJldHVybiggUmF0aW9uYWwobnVtMS5nZXRWYWx1ZSgpICsgUmF0aW9uYWwobnVtMikuZ2V0VmFsdWUoKSkgKTsKK30KKworaW5saW5lIEZsb2F0IG9wZXJhdG9yKyhjb25zdCBSYXRpb25hbCAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIEZsb2F0KG51bTEudG9GbG9hdCgpICsgbnVtMi5nZXRWYWx1ZSgpKSApOworfQorCisKKy8vIEZsb2F0ICsgTnVtYmVyCitpbmxpbmUgRmxvYXQgb3BlcmF0b3IrKGNvbnN0IEZsb2F0ICYgbnVtMSwgY29uc3QgRmxvYXQgJiBudW0yKQoreworCXJldHVybiggRmxvYXQobnVtMS5nZXRWYWx1ZSgpICsgbnVtMi5nZXRWYWx1ZSgpKSApOworfQorCitpbmxpbmUgRmxvYXQgb3BlcmF0b3IrKGNvbnN0IEZsb2F0ICYgbnVtMSwgY29uc3QgUmF0aW9uYWwgJiBudW0yKQoreworCXJldHVybiggRmxvYXQobnVtMS5nZXRWYWx1ZSgpICsgbnVtMi50b0Zsb2F0KCkpICk7Cit9CisKK2lubGluZSBGbG9hdCBvcGVyYXRvcisoY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBJbnRlZ2VyICYgbnVtMikKK3sKKwlyZXR1cm4oIEZsb2F0KG51bTEuZ2V0VmFsdWUoKSArIG51bTIuZ2V0VmFsdWUoKSApICk7Cit9CisKKworLyoqCisgKiBvcGVyYXRvci0KKyAqLworaW5saW5lIEludGVnZXIgb3BlcmF0b3ItKGNvbnN0IEludGVnZXIgJiBudW0pCit7CisJcmV0dXJuKCBJbnRlZ2VyKC0gbnVtLmdldFZhbHVlKCkpICk7Cit9CisKK2lubGluZSBSYXRpb25hbCBvcGVyYXRvci0oY29uc3QgUmF0aW9uYWwgJiBudW0pCit7CisJcmV0dXJuKCBSYXRpb25hbCgtIG51bS5nZXRWYWx1ZSgpKSApOworfQorCitpbmxpbmUgRmxvYXQgb3BlcmF0b3ItKGNvbnN0IEZsb2F0ICYgbnVtKQoreworCXJldHVybiggRmxvYXQoLSBudW0uZ2V0VmFsdWUoKSkgKTsKK30KKworCisvKioKKyAqIG9wZXJhdG9yLQorICovCisvLyBJbnRlZ2VyIC0gTnVtYmVyCitpbmxpbmUgSW50ZWdlciBvcGVyYXRvci0oY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IEludGVnZXIgJiBudW0yKQoreworCXJldHVybiggSW50ZWdlcihudW0xLmdldFZhbHVlKCkgLSBudW0yLmdldFZhbHVlKCkpICk7Cit9CisKK2lubGluZSBSYXRpb25hbCBvcGVyYXRvci0oY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IFJhdGlvbmFsICYgbnVtMikKK3sKKwlyZXR1cm4oIFJhdGlvbmFsKFJhdGlvbmFsKG51bTEpLmdldFZhbHVlKCkgLSBudW0yLmdldFZhbHVlKCkpICk7Cit9CisKK2lubGluZSBGbG9hdCBvcGVyYXRvci0oY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIEZsb2F0KG51bTEuZ2V0VmFsdWUoKSAtIG51bTIuZ2V0VmFsdWUoKSkgKTsKK30KKworCisvLyBSYXRpb25hbCAtIE51bWJlcgoraW5saW5lIFJhdGlvbmFsIG9wZXJhdG9yLShjb25zdCBSYXRpb25hbCAmIG51bTEsIGNvbnN0IFJhdGlvbmFsICYgbnVtMikKK3sKKwlyZXR1cm4oIFJhdGlvbmFsKG51bTEuZ2V0VmFsdWUoKSAtIG51bTIuZ2V0VmFsdWUoKSkgKTsKK30KKworaW5saW5lIFJhdGlvbmFsIG9wZXJhdG9yLShjb25zdCBSYXRpb25hbCAmIG51bTEsIGNvbnN0IEludGVnZXIgJiBudW0yKQoreworCXJldHVybiggUmF0aW9uYWwobnVtMS5nZXRWYWx1ZSgpIC0gUmF0aW9uYWwobnVtMikuZ2V0VmFsdWUoKSkgKTsKK30KKworaW5saW5lIEZsb2F0IG9wZXJhdG9yLShjb25zdCBSYXRpb25hbCAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIEZsb2F0KG51bTEudG9GbG9hdCgpIC0gbnVtMi5nZXRWYWx1ZSgpKSApOworfQorCisKKy8vIEZsb2F0IC0gTnVtYmVyCitpbmxpbmUgRmxvYXQgb3BlcmF0b3ItKGNvbnN0IEZsb2F0ICYgbnVtMSwgY29uc3QgRmxvYXQgJiBudW0yKQoreworCXJldHVybiggRmxvYXQobnVtMS5nZXRWYWx1ZSgpIC0gbnVtMi5nZXRWYWx1ZSgpKSApOworfQorCitpbmxpbmUgRmxvYXQgb3BlcmF0b3ItKGNvbnN0IEZsb2F0ICYgbnVtMSwgY29uc3QgUmF0aW9uYWwgJiBudW0yKQoreworCXJldHVybiggRmxvYXQobnVtMS5nZXRWYWx1ZSgpIC0gbnVtMi5nZXRWYWx1ZSgpKSApOworfQorCitpbmxpbmUgRmxvYXQgb3BlcmF0b3ItKGNvbnN0IEZsb2F0ICYgbnVtMSwgY29uc3QgSW50ZWdlciAmIG51bTIpCit7CisJcmV0dXJuKCBGbG9hdChudW0xLmdldFZhbHVlKCkgLSBudW0yLmdldFZhbHVlKCkgKSApOworfQorCisKKy8qKgorICogb3BlcmF0b3IqCisgKi8KKy8vIEludGVnZXIgKiBOdW1iZXIKK2lubGluZSBJbnRlZ2VyIG9wZXJhdG9yKihjb25zdCBJbnRlZ2VyICYgbnVtMSwgY29uc3QgSW50ZWdlciAmIG51bTIpCit7CisJcmV0dXJuKCBJbnRlZ2VyKG51bTEuZ2V0VmFsdWUoKSAqIG51bTIuZ2V0VmFsdWUoKSkgKTsKK30KKworaW5saW5lIFJhdGlvbmFsIG9wZXJhdG9yKihjb25zdCBJbnRlZ2VyICYgbnVtMSwgY29uc3QgUmF0aW9uYWwgJiBudW0yKQoreworCXJldHVybiggUmF0aW9uYWwobnVtMS5nZXRWYWx1ZSgpICogbnVtMi5yYXdOdW1lcmF0b3IoKSAsCisJCQludW0yLnJhd0Rlbm9taW5hdG9yKCkpICk7Cit9CisKK2lubGluZSBGbG9hdCBvcGVyYXRvciooY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIEZsb2F0KG51bTEuZ2V0VmFsdWUoKSAqIG51bTIuZ2V0VmFsdWUoKSkgKTsKK30KKworCisvLyBSYXRpb25hbCAqIE51bWJlcgoraW5saW5lIFJhdGlvbmFsIG9wZXJhdG9yKihjb25zdCBSYXRpb25hbCAmIG51bTEsIGNvbnN0IFJhdGlvbmFsICYgbnVtMikKK3sKKwlyZXR1cm4oIFJhdGlvbmFsKG51bTEuZ2V0VmFsdWUoKSAqIG51bTIuZ2V0VmFsdWUoKSkgKTsKK30KKworaW5saW5lIFJhdGlvbmFsIG9wZXJhdG9yKihjb25zdCBSYXRpb25hbCAmIG51bTEsIGNvbnN0IEludGVnZXIgJiBudW0yKQoreworCXJldHVybiggUmF0aW9uYWwobnVtMS5yYXdOdW1lcmF0b3IoKSAqIG51bTIuZ2V0VmFsdWUoKSwKKwkJCW51bTEucmF3RGVub21pbmF0b3IoKSkgKTsKK30KKworaW5saW5lIEZsb2F0IG9wZXJhdG9yKihjb25zdCBSYXRpb25hbCAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIEZsb2F0KG51bTEudG9GbG9hdCgpICogbnVtMi5nZXRWYWx1ZSgpKSApOworfQorCisKKy8vIEZsb2F0ICogTnVtYmVyCitpbmxpbmUgRmxvYXQgb3BlcmF0b3IqKGNvbnN0IEZsb2F0ICYgbnVtMSwgY29uc3QgRmxvYXQgJiBudW0yKQoreworCXJldHVybiggRmxvYXQobnVtMS5nZXRWYWx1ZSgpICogbnVtMi5nZXRWYWx1ZSgpKSApOworfQorCitpbmxpbmUgRmxvYXQgb3BlcmF0b3IqKGNvbnN0IEZsb2F0ICYgbnVtMSwgY29uc3QgUmF0aW9uYWwgJiBudW0yKQoreworCXJldHVybiggRmxvYXQobnVtMS5nZXRWYWx1ZSgpICogbnVtMi50b0Zsb2F0KCkpICk7Cit9CisKK2lubGluZSBGbG9hdCBvcGVyYXRvciooY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBJbnRlZ2VyICYgbnVtMikKK3sKKwlyZXR1cm4oIEZsb2F0KG51bTEuZ2V0VmFsdWUoKSAqIG51bTIuZ2V0VmFsdWUoKSApICk7Cit9CisKKworLyoqCisgKiBwb3cKKyAqLworaW5saW5lIEludGVnZXIgcG93KGNvbnN0IEludGVnZXIgJiBudW0sIGF2bV91aW50ZWdlcl90IGFuRXhwb25lbnQpCit7CisJcmV0dXJuKCBJbnRlZ2VyKCBudW0ucG93KGFuRXhwb25lbnQpICkgKTsKK30KKworaW5saW5lIFJhdGlvbmFsIHBvdyhjb25zdCBSYXRpb25hbCAmIG51bSwgYXZtX3VpbnRlZ2VyX3QgYW5FeHBvbmVudCkKK3sKKwlSYXRpb25hbCByZXN1bHQoIG51bSApOworCXJlc3VsdC5zZXRfcG93KCBhbkV4cG9uZW50ICk7CisKKwlyZXR1cm4oIFJhdGlvbmFsKCByZXN1bHQgKSApOworfQorCitpbmxpbmUgRmxvYXQgcG93KGNvbnN0IEZsb2F0ICYgbnVtLCBhdm1fdWludGVnZXJfdCBhbkV4cG9uZW50KQoreworCUZsb2F0IHJlc3VsdCggbnVtICk7CisJcmVzdWx0LnNldF9wb3coIGFuRXhwb25lbnQgKTsKKworCXJldHVybiggRmxvYXQoIHJlc3VsdCApICk7Cit9CisKKworLyoqCisgKiBvcGVyYXRvci8KKyAqLworLy8gSW50ZWdlciAvIE51bWJlcgoraW5saW5lIFJhdGlvbmFsIG9wZXJhdG9yLyhjb25zdCBJbnRlZ2VyICYgbnVtMSwgY29uc3QgSW50ZWdlciAmIG51bTIpCit7CisJcmV0dXJuKCBSYXRpb25hbCggbnVtMS5nZXRWYWx1ZSgpICwgbnVtMi5nZXRWYWx1ZSgpICkgKTsKK30KKworaW5saW5lIFJhdGlvbmFsIG9wZXJhdG9yLyhjb25zdCBJbnRlZ2VyICYgbnVtMSwgY29uc3QgUmF0aW9uYWwgJiBudW0yKQoreworCXJldHVybiggUmF0aW9uYWwobnVtMS5nZXRWYWx1ZSgpICogbnVtMi5yYXdEZW5vbWluYXRvcigpICwKKwkJCW51bTIucmF3TnVtZXJhdG9yKCkgKSApOworfQorCitpbmxpbmUgRmxvYXQgb3BlcmF0b3IvKGNvbnN0IEludGVnZXIgJiBudW0xLCBjb25zdCBGbG9hdCAmIG51bTIpCit7CisJcmV0dXJuKCBGbG9hdChudW0xLmdldFZhbHVlKCkgLyBudW0yLmdldFZhbHVlKCkpICk7Cit9CisKKworLy8gUmF0aW9uYWwgLyBOdW1iZXIKK2lubGluZSBSYXRpb25hbCBvcGVyYXRvci8oY29uc3QgUmF0aW9uYWwgJiBudW0xLCBjb25zdCBSYXRpb25hbCAmIG51bTIpCit7CisJcmV0dXJuKCBSYXRpb25hbChudW0xLmdldFZhbHVlKCkgLyBudW0yLmdldFZhbHVlKCkpICk7Cit9CisKK2lubGluZSBSYXRpb25hbCBvcGVyYXRvci8oY29uc3QgUmF0aW9uYWwgJiBudW0xLCBjb25zdCBJbnRlZ2VyICYgbnVtMikKK3sKKwlyZXR1cm4oIFJhdGlvbmFsKG51bTEucmF3TnVtZXJhdG9yKCkgLAorCQkJbnVtMS5yYXdEZW5vbWluYXRvcigpICogbnVtMi5nZXRWYWx1ZSgpKSApOworfQorCitpbmxpbmUgRmxvYXQgb3BlcmF0b3IvKGNvbnN0IFJhdGlvbmFsICYgbnVtMSwgY29uc3QgRmxvYXQgJiBudW0yKQoreworCXJldHVybiggRmxvYXQobnVtMS50b0Zsb2F0KCkgLyBudW0yLmdldFZhbHVlKCkpICk7Cit9CisKKy8vIEZsb2F0IC8gTnVtYmVyCitpbmxpbmUgRmxvYXQgb3BlcmF0b3IvKGNvbnN0IEZsb2F0ICYgbnVtMSwgY29uc3QgRmxvYXQgJiBudW0yKQoreworCXJldHVybiggRmxvYXQobnVtMS5nZXRWYWx1ZSgpIC8gbnVtMi5nZXRWYWx1ZSgpKSApOworfQorCitpbmxpbmUgRmxvYXQgb3BlcmF0b3IvKGNvbnN0IEZsb2F0ICYgbnVtMSwgY29uc3QgUmF0aW9uYWwgJiBudW0yKQoreworCXJldHVybiggRmxvYXQobnVtMS5nZXRWYWx1ZSgpIC8gbnVtMi50b0Zsb2F0KCkpICk7Cit9CisKK2lubGluZSBGbG9hdCBvcGVyYXRvci8oY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBJbnRlZ2VyICYgbnVtMikKK3sKKwlyZXR1cm4oIEZsb2F0KG51bTEuZ2V0VmFsdWUoKSAvIG51bTIuZ2V0VmFsdWUoKSApICk7Cit9CisKKworLyoqCisgKiBpbnZlcnNlCisgKi8KK2lubGluZSBSYXRpb25hbCBpbnZlcnNlKGNvbnN0IEludGVnZXIgJiBudW0pCit7CisJcmV0dXJuKCBSYXRpb25hbCggSW50ZWdlcigxKSAsIG51bSApICk7Cit9CisKK2lubGluZSBSYXRpb25hbCBpbnZlcnNlKGNvbnN0IFJhdGlvbmFsICYgbnVtKQoreworCXJldHVybiggUmF0aW9uYWwoIG51bS5yYXdEZW5vbWluYXRvcigpICwgbnVtLnJhd051bWVyYXRvcigpICkgKTsKK30KKworaW5saW5lIEZsb2F0IGludmVyc2UoY29uc3QgRmxvYXQgJiBudW0pCit7CisJcmV0dXJuKCBGbG9hdCggMSAvIG51bS5nZXRWYWx1ZSgpICkgKTsKK30KKworCit9IC8qIG5hbWVzcGFjZSBudW1lcmljICovCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qIEZNTF9OVU1FUklDX0JBU0lDX05VTUVSSUNJTVBMX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbnVtZXJpYy9iYXNpYy9SYXRpb25hbEltcGwuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9udW1lcmljL2Jhc2ljL1JhdGlvbmFsSW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NGM2ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbnVtZXJpYy9iYXNpYy9SYXRpb25hbEltcGwuaApAQCAtMCwwICsxLDgxOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDEwIG1haSAyMDE2CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgSW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRk1MX05VTUVSSUNfQkFTSUNfUkFUSU9OQUxJTVBMX0hfCisjZGVmaW5lIEZNTF9OVU1FUklDX0JBU0lDX1JBVElPTkFMSU1QTF9IXworCisjaW5jbHVkZSA8Zm1sL251bWVyaWMvTnVtYmVyLmg+CisKKyNpbmNsdWRlIDxmbWwvbnVtZXJpYy9JbnRlZ2VyLmg+CisKKyNpbmNsdWRlIDxjbWF0aD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKwordGVtcGxhdGU8IHR5cGVuYW1lIE51bV9UICwgdHlwZW5hbWUgRGVuX1QgPgorY2xhc3MgQmFzaWNSYXRpb25hbAoreworCitwdWJsaWM6CisJLyoqCisJICogVFlQRURFRgorCSAqLworCXR5cGVkZWYgIE51bV9UICBUTnVtOworCXR5cGVkZWYgIERlbl9UICBURGVuOworCisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBBVFRSSUJVVEVTCisJICovCisJTnVtX1QgbU51bWVyYXRvcjsKKwlEZW5fVCBtRGVub21pbmF0b3I7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUJhc2ljUmF0aW9uYWwoTnVtX1QgYU51bWVyYXRvciwgRGVuX1QgYURlbm9taW5hdG9yKQorCTogbU51bWVyYXRvciggYU51bWVyYXRvciApLAorCW1EZW5vbWluYXRvciggYURlbm9taW5hdG9yICkKKwl7CisJCXNpbXBsaWYoKTsKKwl9CisKKworCUJhc2ljUmF0aW9uYWwoY29uc3Qgc3RkOjpzdHJpbmcgJiBhTnVtZXJhdG9yLCBEZW5fVCBhRGVub21pbmF0b3IpCisJOiBtTnVtZXJhdG9yKCBzZXA6OnN0cmluZ190bzwgTnVtX1QgPihhTnVtZXJhdG9yLCBzdGQ6OmRlYykgKSwKKwltRGVub21pbmF0b3IoIGFEZW5vbWluYXRvciApCisJeworCQlzaW1wbGlmKCk7CisJfQorCisJQmFzaWNSYXRpb25hbChOdW1fVCBhTnVtZXJhdG9yLCBjb25zdCBzdGQ6OnN0cmluZyAmIGFEZW5vbWluYXRvcikKKwk6IG1OdW1lcmF0b3IoIGFOdW1lcmF0b3IgKSwKKwltRGVub21pbmF0b3IoIHNlcDo6c3RyaW5nX3RvPCBOdW1fVCA+KGFEZW5vbWluYXRvciwgc3RkOjpkZWMpICkKKwl7CisJCXNpbXBsaWYoKTsKKwl9CisKKwlCYXNpY1JhdGlvbmFsKGNvbnN0IHN0ZDo6c3RyaW5nICYgYU51bWVyYXRvciwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYURlbm9taW5hdG9yKQorCTogbU51bWVyYXRvciggc2VwOjpzdHJpbmdfdG88IE51bV9UID4oYU51bWVyYXRvciAgLCBzdGQ6OmRlYykgKSwKKwltRGVub21pbmF0b3IoIHNlcDo6c3RyaW5nX3RvPCBEZW5fVCA+KGFEZW5vbWluYXRvciwgc3RkOjpkZWMpICkKKwl7CisJCXNpbXBsaWYoKTsKKwl9CisKKwlCYXNpY1JhdGlvbmFsKGNvbnN0IHN0ZDo6c3RyaW5nICYgYVJhdGlvbmFsKQorCTogbU51bWVyYXRvciggMCApLAorCW1EZW5vbWluYXRvciggMSApCisJeworCQlmcm9tU3RyaW5nKHRoaXMsIGFSYXRpb25hbCk7CisKKwkJc2ltcGxpZigpOworCX0KKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCUJhc2ljUmF0aW9uYWwoY29uc3QgQmFzaWNSYXRpb25hbCAmIGFSYXRpb25hbCkKKwk6IG1OdW1lcmF0b3IgICggYVJhdGlvbmFsLm1OdW1lcmF0b3IgKSwKKwltRGVub21pbmF0b3IoIGFSYXRpb25hbC5tRGVub21pbmF0b3IgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+QmFzaWNSYXRpb25hbCgpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCWlubGluZSBzdGF0aWMgdm9pZCBmcm9tU3RyaW5nKEJhc2ljUmF0aW9uYWwgKiByb3AsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYVZhbHVlKQorCXsKKwkJc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSBhVmFsdWUuZmluZCgnLycpOworCQlpZiggcG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zKQorCQl7CisJCQlyb3AtPm1OdW1lcmF0b3IgPSBzZXA6OnN0cmluZ190bzwgTnVtX1QgPigKKwkJCQkJYVZhbHVlLnN1YnN0cigwLCBwb3MpLCBzdGQ6OmRlYyk7CisJCQlyb3AtPm1EZW5vbWluYXRvciA9IHNlcDo6c3RyaW5nX3RvPCBOdW1fVCA+KAorCQkJCQlhVmFsdWUuc3Vic3RyKHBvcysxKSwgc3RkOjpkZWMpOworCQl9CisJCWVsc2UgaWYoIChwb3MgPSBhVmFsdWUuZmluZCgnLicpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisJCXsKKwkJCXJvcC0+bU51bWVyYXRvciA9IHNlcDo6c3RyaW5nX3RvPCBOdW1fVCA+KAorCQkJCQlzdGQ6OnN0cmluZyhhVmFsdWUpLmVyYXNlKHBvcywgMSksIHN0ZDo6ZGVjKTsKKworCQkJcm9wLT5tRGVub21pbmF0b3IgPSBJbnRlZ2VyOjppcG93KDEwLCBhVmFsdWUuc2l6ZSgpIC0gKHBvcyArIDEpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJvcC0+bU51bWVyYXRvciA9IHNlcDo6c3RyaW5nX3RvPCBOdW1fVCA+KGFWYWx1ZSwgc3RkOjpkZWMpOworCQkJcm9wLT5tRGVub21pbmF0b3IgPSAxOworCQl9CisJfQorCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogVGhpc051bWJlckNsYXNzOjptVmFsdWUKKwkgKi8KKwlpbmxpbmUgRGVuX1QgZ2NkKERlbl9UIGEsIERlbl9UIGIpCisJeworCQlEZW5fVCB0bXA7CisJCXdoaWxlKCBiICE9IDAgKQorCQl7CisJCQl0bXAgPSBiOworCQkJYiA9IGEgJSBiOworCQkJYSA9IHRtcDsKKwkJfQorCisJCXJldHVybiggYSApOworCX0KKworCWlubGluZSBib29sIHNpbXBsaWYoKQorCXsKKwkJaWYoIG1EZW5vbWluYXRvciAhPSAxICkKKwkJeworCQkJRGVuX1QgZCA9IGdjZCgobU51bWVyYXRvciA8IDApID8gKC1tTnVtZXJhdG9yKSA6IG1OdW1lcmF0b3IsCisJCQkJCW1EZW5vbWluYXRvcik7CisKKwkJCWlmKCAoZCAhPSAwKSAmJiAoZCAhPSAxKSApCisJCQl7CisJCQkJbU51bWVyYXRvciAgID0gc3RhdGljX2Nhc3Q8IE51bV9UID4oIG1OdW1lcmF0b3IgICAvIGQgKTsKKwkJCQltRGVub21pbmF0b3IgPSBzdGF0aWNfY2FzdDwgRGVuX1QgPiggbURlbm9taW5hdG9yIC8gZCApOworCQkJfQorCQl9CisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZQorCSAqLworCWlubGluZSBOdW1fVCByYXdOdW1lcmF0b3IoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtTnVtZXJhdG9yICk7CisJfQorCisJaW5saW5lIERlbl9UIHJhd0Rlbm9taW5hdG9yKCkgY29uc3QKKwl7CisJCXJldHVybiggbURlbm9taW5hdG9yICk7CisJfQorCisKKwlpbmxpbmUgdm9pZCBzZXRWYWx1ZShOdW1fVCBhTnVtZXJhdG9yLCBEZW5fVCBhRGVub21pbmF0b3IpCisJeworCQltTnVtZXJhdG9yICAgPSBhTnVtZXJhdG9yOworCQltRGVub21pbmF0b3IgPSBhRGVub21pbmF0b3I7CisKKwkJc2ltcGxpZigpOworCX0KKworCWlubGluZSB2b2lkIHNldFZhbHVlKE51bV9UIGFWYWx1ZSkKKwl7CisJCW1OdW1lcmF0b3IgICA9IGFWYWx1ZTsKKwkJbURlbm9taW5hdG9yID0gMTsKKwl9CisKKworCS8qKgorCSAqIENPTlZFUlNJT04KKwkgKi8KKwlpbmxpbmUgdmlydHVhbCBhdm1fZmxvYXRfdCB0b0Zsb2F0KCkgY29uc3QKKwl7CisJCXJldHVybiggc3RhdGljX2Nhc3Q8IGF2bV9mbG9hdF90ID4oIG1OdW1lcmF0b3IgLyBtRGVub21pbmF0b3IgKSApOworCX0KKworCisJLyoqCisJICogQ09NUEFSSVNPTgorCSAqIE9QRVJBVE9SCisJICovCisJLy8gb3BlcmF0b3I9PQorCWlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgQmFzaWNSYXRpb25hbCAmIG90aGVyKSBjb25zdAorCXsKKwkJcmV0dXJuKCAoIG1EZW5vbWluYXRvciA9PSBvdGhlci5tRGVub21pbmF0b3IgKSA/CisJCQkJKG1OdW1lcmF0b3IgPT0gb3RoZXIubU51bWVyYXRvcikgOgorCQkJCShtTnVtZXJhdG9yICogb3RoZXIubURlbm9taW5hdG9yID09CisJCQkJCQltRGVub21pbmF0b3IgKiBvdGhlci5tTnVtZXJhdG9yKSApOworCX0KKworCWlubGluZSBib29sIG9wZXJhdG9yPT0oYXZtX2ludGVnZXJfdCBhVmFsdWUpIGNvbnN0CisJeworCQlyZXR1cm4oIG1OdW1lcmF0b3IgPT0gbURlbm9taW5hdG9yICogYVZhbHVlICk7CisJfQorCisJLy8gb3BlcmF0b3IhPQorCWlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgQmFzaWNSYXRpb25hbCAmIG90aGVyKSBjb25zdAorCXsKKwkJcmV0dXJuKCAhIG9wZXJhdG9yPT0ob3RoZXIpICk7CisJfQorCisJaW5saW5lIGJvb2wgb3BlcmF0b3IhPShhdm1faW50ZWdlcl90IGFWYWx1ZSkgY29uc3QKKwl7CisJCXJldHVybiggbU51bWVyYXRvciAhPSBtRGVub21pbmF0b3IgKiBhVmFsdWUgKTsKKwl9CisKKwkvLyBvcGVyYXRvcjwKKwlpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgQmFzaWNSYXRpb25hbCAmIG90aGVyKSBjb25zdAorCXsKKwkJcmV0dXJuKCAoIG1EZW5vbWluYXRvciA9PSBvdGhlci5tRGVub21pbmF0b3IgKSA/CisJCQkJKG1OdW1lcmF0b3IgPCBvdGhlci5tTnVtZXJhdG9yKSA6CisJCQkJKG1OdW1lcmF0b3IgKiBvdGhlci5tRGVub21pbmF0b3IgPAorCQkJCQkJbURlbm9taW5hdG9yICogb3RoZXIubU51bWVyYXRvcikgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBvcGVyYXRvcjwoYXZtX2ludGVnZXJfdCBhVmFsdWUpIGNvbnN0CisJeworCQlyZXR1cm4oIG1OdW1lcmF0b3IgPCBtRGVub21pbmF0b3IgKiBhVmFsdWUgKTsKKwl9CisKKwkvLyBvcGVyYXRvcjw9CisJaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBCYXNpY1JhdGlvbmFsICYgb3RoZXIpIGNvbnN0CisJeworCQlyZXR1cm4oICggbURlbm9taW5hdG9yID09IG90aGVyLm1EZW5vbWluYXRvciApID8KKwkJCQkobU51bWVyYXRvciA8PSBvdGhlci5tTnVtZXJhdG9yKSA6CisJCQkJKG1OdW1lcmF0b3IgKiBvdGhlci5tRGVub21pbmF0b3IgPD0KKwkJCQkJCW1EZW5vbWluYXRvciAqIG90aGVyLm1OdW1lcmF0b3IpICk7CisJfQorCisJaW5saW5lIGJvb2wgb3BlcmF0b3I8PShhdm1faW50ZWdlcl90IGFWYWx1ZSkgY29uc3QKKwl7CisJCXJldHVybiggbU51bWVyYXRvciA8PSBtRGVub21pbmF0b3IgKiBhVmFsdWUgKTsKKwl9CisKKwkvLyBvcGVyYXRvcj4KKwlpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgQmFzaWNSYXRpb25hbCAmIG90aGVyKSBjb25zdAorCXsKKwkJcmV0dXJuKCAoIG1EZW5vbWluYXRvciA9PSBvdGhlci5tRGVub21pbmF0b3IgKSA/CisJCQkJKG1OdW1lcmF0b3IgPiBvdGhlci5tTnVtZXJhdG9yKSA6CisJCQkJKG1OdW1lcmF0b3IgKiBvdGhlci5tRGVub21pbmF0b3IgPgorCQkJCQkJbURlbm9taW5hdG9yICogb3RoZXIubU51bWVyYXRvcikgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBvcGVyYXRvcj4oYXZtX2ludGVnZXJfdCBhVmFsdWUpIGNvbnN0CisJeworCQlyZXR1cm4oIG1OdW1lcmF0b3IgPiBtRGVub21pbmF0b3IgKiBhVmFsdWUgKTsKKwl9CisKKwkvLyBvcGVyYXRvcj49CisJaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBCYXNpY1JhdGlvbmFsICYgb3RoZXIpIGNvbnN0CisJeworCQlyZXR1cm4oICggbURlbm9taW5hdG9yID09IG90aGVyLm1EZW5vbWluYXRvciApID8KKwkJCQkobU51bWVyYXRvciA+PSBvdGhlci5tTnVtZXJhdG9yKSA6CisJCQkJKG1OdW1lcmF0b3IgKiBvdGhlci5tRGVub21pbmF0b3IgPj0KKwkJCQkJCW1EZW5vbWluYXRvciAqIG90aGVyLm1OdW1lcmF0b3IpICk7CisJfQorCisJaW5saW5lIGJvb2wgb3BlcmF0b3I+PShhdm1faW50ZWdlcl90IGFWYWx1ZSkgY29uc3QKKwl7CisJCXJldHVybiggbU51bWVyYXRvciA+IG1EZW5vbWluYXRvciAqIGFWYWx1ZSApOworCX0KKworCisJLyoqCisJICogQVJJVEhNRVRJQworCSAqIE9QRVJBVE9SCisJICovCisJLy8gb3BlcmF0b3IrCisJaW5saW5lIEJhc2ljUmF0aW9uYWwgb3BlcmF0b3IrKGNvbnN0IEJhc2ljUmF0aW9uYWwgJiBvdGhlcikKKwl7CisJCXJldHVybiggQmFzaWNSYXRpb25hbCgobU51bWVyYXRvciAqIG90aGVyLm1EZW5vbWluYXRvcikgKworCQkJCQkobURlbm9taW5hdG9yICogb3RoZXIubU51bWVyYXRvcikgLAorCQkJCW1EZW5vbWluYXRvciAqIG90aGVyLm1EZW5vbWluYXRvcikgKTsKKwl9CisKKwlpbmxpbmUgQmFzaWNSYXRpb25hbCBvcGVyYXRvcisoYXZtX2ludGVnZXJfdCBhVmFsdWUpCisJeworCQlyZXR1cm4oIEJhc2ljUmF0aW9uYWwobU51bWVyYXRvciArIG1EZW5vbWluYXRvciAqIGFWYWx1ZSAsCisJCQkJbURlbm9taW5hdG9yKSApOworCX0KKworCS8vIG9wZXJhdG9yLQorCWlubGluZSBCYXNpY1JhdGlvbmFsICYgb3BlcmF0b3ItKCkKKwl7CisJCXJldHVybiggQmFzaWNSYXRpb25hbCgtIG1OdW1lcmF0b3IgLCBtRGVub21pbmF0b3IpICk7CisJfQorCisKKwlpbmxpbmUgQmFzaWNSYXRpb25hbCBvcGVyYXRvci0oYXZtX2ludGVnZXJfdCBhVmFsdWUpCisJeworCQlyZXR1cm4oIEJhc2ljUmF0aW9uYWwobU51bWVyYXRvciAtIG1EZW5vbWluYXRvciAqIGFWYWx1ZSAsCisJCQkJbURlbm9taW5hdG9yKSApOworCX0KKworCWlubGluZSBCYXNpY1JhdGlvbmFsIG9wZXJhdG9yLShjb25zdCBCYXNpY1JhdGlvbmFsICYgb3RoZXIpCisJeworCQlyZXR1cm4oIEJhc2ljUmF0aW9uYWwoKG1OdW1lcmF0b3IgKiBvdGhlci5tRGVub21pbmF0b3IpIC0KKwkJCQkJKG1EZW5vbWluYXRvciAqIG90aGVyLm1OdW1lcmF0b3IpICwKKwkJCQltRGVub21pbmF0b3IgKiBvdGhlci5tRGVub21pbmF0b3IpICk7CisJfQorCisJLy8gb3BlcmF0b3IqCisJaW5saW5lIEJhc2ljUmF0aW9uYWwgb3BlcmF0b3IqKGNvbnN0IEJhc2ljUmF0aW9uYWwgJiBvdGhlcikKKwl7CisJCXJldHVybiggQmFzaWNSYXRpb25hbChtTnVtZXJhdG9yICogb3RoZXIubU51bWVyYXRvciAsCisJCQkJbURlbm9taW5hdG9yICogb3RoZXIubURlbm9taW5hdG9yKSApOworCX0KKworCWlubGluZSBCYXNpY1JhdGlvbmFsICYgb3BlcmF0b3IqKGF2bV9pbnRlZ2VyX3QgYVZhbHVlKQorCXsKKwkJcmV0dXJuKCBCYXNpY1JhdGlvbmFsKG1OdW1lcmF0b3IgKiBhVmFsdWUgLCBtRGVub21pbmF0b3IpICk7CisJfQorCisJLy8gb3BlcmF0b3IvCisJaW5saW5lIEJhc2ljUmF0aW9uYWwgb3BlcmF0b3IvKGNvbnN0IEJhc2ljUmF0aW9uYWwgJiBvdGhlcikKKwl7CisJCXJldHVybiggQmFzaWNSYXRpb25hbChtTnVtZXJhdG9yICogb3RoZXIubURlbm9taW5hdG9yICwKKwkJCQltRGVub21pbmF0b3IgKiBvdGhlci5tTnVtZXJhdG9yKSApOworCX0KKworCWlubGluZSBCYXNpY1JhdGlvbmFsIG9wZXJhdG9yLyhhdm1faW50ZWdlcl90IGFWYWx1ZSkKKwl7CisJCXJldHVybiggQmFzaWNSYXRpb25hbChtTnVtZXJhdG9yICwgbURlbm9taW5hdG9yICogYVZhbHVlKSApOworCX0KKworCisJLyoqCisJICogbWF0aCBmdW5jdGlvbgorCSAqLworCWlubGluZSB2b2lkIHNldF9wb3coYXZtX3VpbnRlZ2VyX3QgYW5FeHBvbmVudCkKKwl7CisJCW1OdW1lcmF0b3IgICA9IEludGVnZXI6Omlwb3cobU51bWVyYXRvciwgYW5FeHBvbmVudCk7CisJCW1EZW5vbWluYXRvciA9IEludGVnZXI6Omlwb3cobURlbm9taW5hdG9yLCBhbkV4cG9uZW50KTsKKwl9CisKK307CisKKworCitjbGFzcyBSYXRpb25hbCA6CisJCXB1YmxpYyBOdW1iZXIsCisJCXB1YmxpYyBHZW5lcmljTnVtYmVyQ2xhc3M8CisJCQkJQmFzaWNSYXRpb25hbDwgYXZtX2ludGVnZXJfdCAsIGF2bV9pbnRlZ2VyX3QgPiAsIFJhdGlvbmFsID4KK3sKKworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBSYXRpb25hbCApCisKKworCS8qKgorCSAqIFRZUEVERUYKKwkgKi8KK3B1YmxpYzoKKwl0eXBlZGVmICBCYXNpY1JhdGlvbmFsPCBhdm1faW50ZWdlcl90ICwgYXZtX2ludGVnZXJfdCA+ICBSYXdWYWx1ZVR5cGU7CisKK3ByaXZhdGU6CisJdHlwZWRlZiBHZW5lcmljTnVtYmVyQ2xhc3M8IFJhd1ZhbHVlVHlwZSAsIFJhdGlvbmFsID4gIFRoaXNOdW1iZXJDbGFzczsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJUmF0aW9uYWwoY29uc3QgUmF3VmFsdWVUeXBlICYgYVZhbHVlKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIFJhdGlvbmFsICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIFJhd1ZhbHVlVHlwZShhVmFsdWUpICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8vIEludGVnZXIgLyBJbnRlZ2VyCisJUmF0aW9uYWwoY29uc3QgSW50ZWdlciAmIGFOdW1lcmF0b3IsIGNvbnN0IEludGVnZXIgJiBhRGVub21pbmF0b3IpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggUmF0aW9uYWwgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKGFOdW1lcmF0b3IuZ2V0VmFsdWUoKSwgYURlbm9taW5hdG9yLmdldFZhbHVlKCkpICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCVJhdGlvbmFsKGF2bV9pbnRlZ2VyX3QgYU51bWVyYXRvciwgYXZtX2ludGVnZXJfdCBhRGVub21pbmF0b3IpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggUmF0aW9uYWwgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKGFOdW1lcmF0b3IsIGFEZW5vbWluYXRvcikgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJUmF0aW9uYWwoYXZtX2ludGVnZXJfdCBhTnVtZXJhdG9yLCBhdm1fdWludGVnZXJfdCBhRGVub21pbmF0b3IpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggUmF0aW9uYWwgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKGFOdW1lcmF0b3IsIGFEZW5vbWluYXRvcikgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJUmF0aW9uYWwoYXZtX3VpbnRlZ2VyX3QgYU51bWVyYXRvciwgYXZtX2ludGVnZXJfdCBhRGVub21pbmF0b3IpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggUmF0aW9uYWwgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKGFOdW1lcmF0b3IsIGFEZW5vbWluYXRvcikgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJUmF0aW9uYWwoYXZtX3VpbnRlZ2VyX3QgYU51bWVyYXRvciwgYXZtX3VpbnRlZ2VyX3QgYURlbm9taW5hdG9yKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIFJhdGlvbmFsICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIFJhd1ZhbHVlVHlwZShhTnVtZXJhdG9yLCBhRGVub21pbmF0b3IpICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCVJhdGlvbmFsKGNvbnN0IEludGVnZXIgJiBhTnVtZXJhdG9yKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIFJhdGlvbmFsICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIFJhd1ZhbHVlVHlwZShhTnVtZXJhdG9yLmdldFZhbHVlKCksIDEpICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8vIGF2bV9pbnRlZ2VyX3QgIGkuZS4gIGF2bV9pbnQ2NF90CisJUmF0aW9uYWwoYXZtX2ludGVnZXJfdCBhTnVtZXJhdG9yKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIFJhdGlvbmFsICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIFJhd1ZhbHVlVHlwZShhTnVtZXJhdG9yLCAxKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvLyBhdm1fdWludGVnZXJfdCAgaS5lLiAgYXZtX3VpbnQ2NF90CisJUmF0aW9uYWwoYXZtX3VpbnRlZ2VyX3QgYU51bWVyYXRvcikKKwk6IE51bWJlciggQ0xBU1NfS0lORF9UKCBSYXRpb25hbCApICksCisJVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoYU51bWVyYXRvciwgMSkgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisjaWZkZWYgX0FWTV9ORUVEX0lOVDY0X1RfT1ZFUkxPQURTXworCisJLy8gbG9uZworCVJhdGlvbmFsKGxvbmcgYU51bWVyYXRvcikKKwk6IE51bWJlciggQ0xBU1NfS0lORF9UKCBSYXRpb25hbCApICksCisJVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoYU51bWVyYXRvciwgMSkgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLy8gdW5zaWduZWQgbG9uZworCVJhdGlvbmFsKHVuc2lnbmVkIGxvbmcgYU51bWVyYXRvcikKKwk6IE51bWJlciggQ0xBU1NfS0lORF9UKCBSYXRpb25hbCApICksCisJVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoYU51bWVyYXRvciwgMSkgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisjZW5kaWYgLyogX0FWTV9ORUVEX0lOVDY0X1RfT1ZFUkxPQURTXyAqLworCisJLy8gaW50MzJfdAorCVJhdGlvbmFsKGludCBhTnVtZXJhdG9yKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIFJhdGlvbmFsICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIFJhd1ZhbHVlVHlwZShhTnVtZXJhdG9yLCAxKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvLyB1aW50MzJfdAorCVJhdGlvbmFsKHVuc2lnbmVkIGludCBhTnVtZXJhdG9yKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIFJhdGlvbmFsICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIFJhd1ZhbHVlVHlwZShhTnVtZXJhdG9yLCAxKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvLyBzdGQ6OnN0cmluZyAvIGF2bV9pbnRlZ2VyX3QKKwlSYXRpb25hbChjb25zdCBzdGQ6OnN0cmluZyAmIGFOdW1lcmF0b3IsIGF2bV9pbnRlZ2VyX3QgYURlbm9taW5hdG9yKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIFJhdGlvbmFsICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIFJhd1ZhbHVlVHlwZShhTnVtZXJhdG9yLCBhRGVub21pbmF0b3IpICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8vIGF2bV9pbnRlZ2VyX3QgLyBzdGQ6OnN0cmluZworCVJhdGlvbmFsKGF2bV9pbnRlZ2VyX3QgYU51bWVyYXRvciwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhRGVub21pbmF0b3IpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggUmF0aW9uYWwgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKGFOdW1lcmF0b3IsIGFEZW5vbWluYXRvcikgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLy8gc3RkOjpzdHJpbmcgLyBzdGQ6OnN0cmluZworCVJhdGlvbmFsKGNvbnN0IHN0ZDo6c3RyaW5nICYgYU51bWVyYXRvciwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhRGVub21pbmF0b3IpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggUmF0aW9uYWwgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKGFOdW1lcmF0b3IsIGFEZW5vbWluYXRvcikgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLy8gc3RkOjpzdHJpbmcKKwlSYXRpb25hbChjb25zdCBzdGQ6OnN0cmluZyAmIGFSYXRpb25hbCkKKwk6IE51bWJlciggQ0xBU1NfS0lORF9UKCBSYXRpb25hbCApICksCisJVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoYVJhdGlvbmFsKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCVJhdGlvbmFsKGNvbnN0IFJhdGlvbmFsICYgYVJhdGlvbmFsKQorCTogTnVtYmVyKCBhUmF0aW9uYWwgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIGFSYXRpb25hbCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5SYXRpb25hbCgpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlCisJICovCisJaW5saW5lIEludGVnZXIgZ2V0TnVtZXJhdG9yKCkgY29uc3QKKwl7CisJCXJldHVybiggSW50ZWdlciggVGhpc051bWJlckNsYXNzOjptVmFsdWUucmF3TnVtZXJhdG9yKCkgKSApOworCX0KKworCWlubGluZSBJbnRlZ2VyIGdldERlbm9taW5hdG9yKCkgY29uc3QKKwl7CisJCXJldHVybiggSW50ZWdlciggVGhpc051bWJlckNsYXNzOjptVmFsdWUucmF3RGVub21pbmF0b3IoKSApICk7CisJfQorCisKKwlpbmxpbmUgSW50ZWdlcjo6UmF3VmFsdWVUeXBlIHJhd051bWVyYXRvcigpIGNvbnN0CisJeworCQlyZXR1cm4oIFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLnJhd051bWVyYXRvcigpICk7CisJfQorCisJaW5saW5lIEludGVnZXI6OlJhd1ZhbHVlVHlwZSByYXdEZW5vbWluYXRvcigpIGNvbnN0CisJeworCQlyZXR1cm4oIFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLnJhd0Rlbm9taW5hdG9yKCkgKTsKKwl9CisKKworCWlubGluZSB2b2lkIHNldFZhbHVlKGF2bV9pbnRlZ2VyX3QgYU51bWVyYXRvciwgYXZtX2ludGVnZXJfdCBhRGVub21pbmF0b3IpCisJeworCQlUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSA9IFJhd1ZhbHVlVHlwZShhTnVtZXJhdG9yLCBhRGVub21pbmF0b3IpOworCX0KKworCWlubGluZSB2b2lkIHNldFZhbHVlKGF2bV9pbnRlZ2VyX3QgYVZhbHVlKQorCXsKKwkJVGhpc051bWJlckNsYXNzOjptVmFsdWUgPSBSYXdWYWx1ZVR5cGUoYVZhbHVlLCAxKTsKKwl9CisKKworCS8qKgorCSAqIEJBU0lDUyBURVNUUworCSAqLworCXZpcnR1YWwgaW5saW5lIGludCBzaWduKCkgY29uc3QKKwl7CisJCXJldHVybiggKFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLnJhd051bWVyYXRvcigpIDwgMCkgPyAtMSA6CisJCQkJKFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLnJhd051bWVyYXRvcigpID4gMCkgKTsKKwl9CisKKwl2aXJ0dWFsIGlubGluZSBib29sIHN0cmljdGx5UG9zaXRpdmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZS5yYXdOdW1lcmF0b3IoKSA+IDAgKTsKKwl9CisKKwl2aXJ0dWFsIGlubGluZSBib29sIHN0cmljdGx5TmVnYXRpdmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZS5yYXdOdW1lcmF0b3IoKSA8IDAgKTsKKwl9CisKKwl2aXJ0dWFsIGlubGluZSBib29sIGlzWmVybygpIGNvbnN0CisJeworCQlyZXR1cm4oIFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLnJhd051bWVyYXRvcigpID09IDAgKTsKKwl9CisKKwl2aXJ0dWFsIGlubGluZSBib29sIGlzT25lKCkgY29uc3QKKwl7CisJCXJldHVybiggVGhpc051bWJlckNsYXNzOjptVmFsdWUucmF3TnVtZXJhdG9yKCkgPT0KKwkJCQlUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZS5yYXdEZW5vbWluYXRvcigpICk7CisJfQorCisJdmlydHVhbCBpbmxpbmUgYm9vbCBpc05lZ2F0aXZlT25lKCkgY29uc3QKKwl7CisJCXJldHVybiggKFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLnJhd051bWVyYXRvcigpID09CisJCQkJVGhpc051bWJlckNsYXNzOjptVmFsdWUucmF3RGVub21pbmF0b3IoKSkgJiYKKwkJCQlzdHJpY3RseU5lZ2F0aXZlKCkgKTsKKwl9CisKKworCS8qKgorCSAqIENPTlZFUlNJT04KKwkgKi8KKwlpbmxpbmUgdmlydHVhbCBib29sIGlzSW50MzIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAoVGhpc051bWJlckNsYXNzOjptVmFsdWUucmF3RGVub21pbmF0b3IoKSA9PSAxKSAmJgorCQkJCShzdGF0aWNfY2FzdDwgYXZtX2ludGVnZXJfdCA+KEFWTV9OVU1FUklDX01JTl9JTlQpIDw9CisJCQkJCQlUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZS5yYXdOdW1lcmF0b3IoKSkgJiYKKwkJCQkoVGhpc051bWJlckNsYXNzOjptVmFsdWUucmF3TnVtZXJhdG9yKCkgPD0KKwkJCQkJCXN0YXRpY19jYXN0PCBhdm1faW50ZWdlcl90ID4oQVZNX05VTUVSSUNfTUFYX0lOVCkpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgYXZtX2ludDMyX3QgdG9JbnQzMigpIGNvbnN0CisJeworCQlyZXR1cm4oIHN0YXRpY19jYXN0PCBhdm1faW50MzJfdCA+KAorCQkJCVRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLnJhd051bWVyYXRvcigpICkgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBib29sIGlzSW50NjQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAoVGhpc051bWJlckNsYXNzOjptVmFsdWUucmF3RGVub21pbmF0b3IoKSA9PSAxKSAmJgorCQkJCShzdGF0aWNfY2FzdDwgYXZtX2ludGVnZXJfdCA+KEFWTV9OVU1FUklDX01JTl9MT05HKSA8PQorCQkJCQkJVGhpc051bWJlckNsYXNzOjptVmFsdWUucmF3TnVtZXJhdG9yKCkpICYmCisJCQkJKFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLnJhd051bWVyYXRvcigpIDw9CisJCQkJCQlzdGF0aWNfY2FzdDwgYXZtX2ludGVnZXJfdCA+KEFWTV9OVU1FUklDX01BWF9MT05HKSkgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBhdm1faW50NjRfdCB0b0ludDY0KCkgY29uc3QKKwl7CisJCXJldHVybiggc3RhdGljX2Nhc3Q8IGF2bV9pbnQ2NF90ID4oCisJCQkJVGhpc051bWJlckNsYXNzOjptVmFsdWUucmF3TnVtZXJhdG9yKCkgKSApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgYm9vbCBpc0ludGVnZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZS5yYXdEZW5vbWluYXRvcigpID09IDEgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBhdm1faW50ZWdlcl90IHRvSW50ZWdlcigpIGNvbnN0CisJeworCQlpZiggaXNJbnRlZ2VyKCkgKQorCQl7CisJCQlyZXR1cm4oIFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLnJhd051bWVyYXRvcigpICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4oIHN0YXRpY19jYXN0PCBhdm1faW50ZWdlcl90ID4oIHRvRmxvYXQoKSApICk7CisJCX0KKwl9CisKKworCWlubGluZSB2aXJ0dWFsIGJvb2wgaXNQb3NJbnRlZ2VyKCkgY29uc3QKKwl7CisJCXJldHVybiggKFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLnJhd0Rlbm9taW5hdG9yKCkgPT0gMSkgJiYKKwkJCQkoVGhpc051bWJlckNsYXNzOjptVmFsdWUucmF3TnVtZXJhdG9yKCkgPj0gMCkgKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIGJvb2wgaXNVSW50ZWdlcigpIGNvbnN0CisJeworCQlyZXR1cm4oIChUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZS5yYXdEZW5vbWluYXRvcigpID09IDEpICYmCisJCQkJKFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLnJhd051bWVyYXRvcigpID49IDApICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgYXZtX3VpbnRlZ2VyX3QgdG9VSW50ZWdlcigpIGNvbnN0CisJeworCQlpZiggaXNVSW50ZWdlcigpICkKKwkJeworCQkJcmV0dXJuKCBzdGF0aWNfY2FzdDwgYXZtX3VpbnRlZ2VyX3QgPigKKwkJCQkJVGhpc051bWJlckNsYXNzOjptVmFsdWUucmF3TnVtZXJhdG9yKCkgKSApOworCQl9CisJCWVsc2UgaWYoIHRvRmxvYXQoKSA+PSAwICkKKwkJeworCQkJcmV0dXJuKCBzdGF0aWNfY2FzdDwgYXZtX3VpbnRlZ2VyX3QgPiggdG9GbG9hdCgpICkgKTsKKwkJfQorCisJCXJldHVybiggc3RhdGljX2Nhc3Q8IGF2bV91aW50ZWdlcl90ID4oIC0xICkgKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIGJvb2wgaXNSYXRpb25hbCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKwl2aXJ0dWFsIGF2bV9pbnRlZ2VyX3QgdG9EZW5vbWluYXRvcigpIGNvbnN0CisJeworCQlyZXR1cm4oIFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLnJhd0Rlbm9taW5hdG9yKCkgKTsKKwl9CisKKwl2aXJ0dWFsIGF2bV9pbnRlZ2VyX3QgdG9OdW1lcmF0b3IoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZS5yYXdOdW1lcmF0b3IoKSApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgYm9vbCBpc0Zsb2F0KCkgY29uc3QKKwl7CisJCXJldHVybiggdHJ1ZSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGF2bV9mbG9hdF90IHRvRmxvYXQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBzdGF0aWNfY2FzdDwgYXZtX2Zsb2F0X3QgPigKKwkJCQlUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZS5yYXdOdW1lcmF0b3IoKSAvCisJCQkJVGhpc051bWJlckNsYXNzOjptVmFsdWUucmF3RGVub21pbmF0b3IoKSkgKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIGJvb2wgaXNSZWFsKCkgY29uc3QKKwl7CisJCXJldHVybiggdHJ1ZSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGF2bV9yZWFsX3QgdG9SZWFsKCkgY29uc3QKKwl7CisJCXJldHVybiggc3RhdGljX2Nhc3Q8IGF2bV9yZWFsX3QgPigKKwkJCQlUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZS5yYXdOdW1lcmF0b3IoKSAvCisJCQkJVGhpc051bWJlckNsYXNzOjptVmFsdWUucmF3RGVub21pbmF0b3IoKSkgKTsKKwl9CisKKworCS8qKgorCSAqIG1hdGggZnVuY3Rpb24KKwkgKi8KKwlpbmxpbmUgdm9pZCBzZXRfcG93KGF2bV91aW50ZWdlcl90IGFuRXhwb25lbnQpCisJeworCQlUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZS5zZXRfcG93KCBhbkV4cG9uZW50ICk7CisJfQorCisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJaW5saW5lIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQlvcyA8PCBUQUIgPDwgcmF3TnVtZXJhdG9yKCk7CisJCWlmKCByYXdEZW5vbWluYXRvcigpICE9IDEgKQorCQl7CisJCQlvcyA8PCAiLyIgPDwgcmF3RGVub21pbmF0b3IoKTsKKwkJfQorCQlBVk1fREVCVUdfUkVGX0NPVU5URVIob3MpOworCQlvcyA8PCBFT0xfRkxVU0g7CisJfQorCisJdmlydHVhbCBzdGQ6OnN0cmluZyBzdHIoKSBjb25zdAorCXsKKwkJaWYoIHJhd0Rlbm9taW5hdG9yKCkgIT0gMSApCisJCXsKKwkJCXJldHVybiggT1NTKCkgPDwgcmF3TnVtZXJhdG9yKCkgPDwgJy8nIDw8IHJhd0Rlbm9taW5hdG9yKCkgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybiggT1NTKCkgPDwgcmF3TnVtZXJhdG9yKCkgKTsKKwkJfQorCX0KKworCWlubGluZSB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHN0ck51bSgKKwkJCWF2bV91aW50OF90IHByZWNpc2lvbiA9IEFWTV9NVU1FUklDX1BSRUNJU0lPTikgY29uc3QKKwl7CisJCWlmKCByYXdEZW5vbWluYXRvcigpICE9IDEgKQorCQl7CisJCQlyZXR1cm4oIE9TUygpIDw8IHJhd051bWVyYXRvcigpIDw8ICcvJyA8PCByYXdEZW5vbWluYXRvcigpICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4oIE9TUygpIDw8IHJhd051bWVyYXRvcigpICk7CisJCX0KKwl9CisKKwlpbmxpbmUgdmlydHVhbCBzdGQ6OnN0cmluZyBzdHJOdW1lcmF0b3IoCisJCQlhdm1fdWludDhfdCBwcmVjaXNpb24gPSBBVk1fTVVNRVJJQ19QUkVDSVNJT04pIGNvbnN0CisJeworCQlyZXR1cm4oIE9TUygpIDw8IHJhd051bWVyYXRvcigpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgc3RyRGVub21pbmF0b3IoCisJCQlhdm1fdWludDhfdCBwcmVjaXNpb24gPSBBVk1fTVVNRVJJQ19QUkVDSVNJT04pIGNvbnN0CisJeworCQlyZXR1cm4oIE9TUygpIDw8IHJhd0Rlbm9taW5hdG9yKCkgKTsKKwl9CisKK307CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKiBGTUxfTlVNRVJJQ19CQVNJQ19SQVRJT05BTElNUExfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9udW1lcmljL2Jvb3N0L0Zsb2F0SW1wbC5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL251bWVyaWMvYm9vc3QvRmxvYXRJbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdmMjY5OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9udW1lcmljL2Jvb3N0L0Zsb2F0SW1wbC5oCkBAIC0wLDAgKzEsNDA0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTcgbWFpIDIwMTYKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBJbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBGTUxfTlVNRVJJQ19CT09TVF9GTE9BVElNUExfSF8KKyNkZWZpbmUgRk1MX05VTUVSSUNfQk9PU1RfRkxPQVRJTVBMX0hfCisKKyNpbmNsdWRlIDxib29zdC9tdWx0aXByZWNpc2lvbi9jcHBfZGVjX2Zsb2F0LmhwcD4KKyNpbmNsdWRlIDxib29zdC9tdWx0aXByZWNpc2lvbi9kZXRhaWwvZGVmYXVsdF9vcHMuaHBwPgorCisjaW5jbHVkZSA8Zm1sL251bWVyaWMvTnVtYmVyLmg+CisKKyNpbmNsdWRlIDxmbWwvbnVtZXJpYy9JbnRlZ2VyLmg+CisjaW5jbHVkZSA8Zm1sL251bWVyaWMvUmF0aW9uYWwuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworY2xhc3MgRmxvYXQgOgorCQlwdWJsaWMgTnVtYmVyLAorCQlwdWJsaWMgR2VuZXJpY051bWJlckNsYXNzPCBib29zdDo6bXVsdGlwcmVjaXNpb246Om51bWJlcjwKKwkJCQlib29zdDo6bXVsdGlwcmVjaXNpb246OmNwcF9kZWNfZmxvYXQ8MD4gPiAsIEZsb2F0ID4KK3sKKworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBGbG9hdCApCisKKworCS8qKgorCSAqIFRZUEVERUYKKwkgKi8KK3B1YmxpYzoKKwl0eXBlZGVmIGJvb3N0OjptdWx0aXByZWNpc2lvbjo6bnVtYmVyPAorCQkJCQlib29zdDo6bXVsdGlwcmVjaXNpb246OmNwcF9kZWNfZmxvYXQ8MD4gPiBSYXdWYWx1ZVR5cGU7CisKK3ByaXZhdGU6CisJdHlwZWRlZiAgR2VuZXJpY051bWJlckNsYXNzPCBSYXdWYWx1ZVR5cGUgLCBGbG9hdCA+ICBUaGlzTnVtYmVyQ2xhc3M7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCS8vIFJhd1ZhbHVlVHlwZQorCUZsb2F0KGNvbnN0IFJhd1ZhbHVlVHlwZSAmIGFWYWx1ZSkKKwk6IE51bWJlciggQ0xBU1NfS0lORF9UKCBGbG9hdCApICksCisJVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoIGFWYWx1ZSApICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8vIFJhdGlvbmFsCisJRmxvYXQoY29uc3QgUmF0aW9uYWwgJiBhUmF0aW9uYWwpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggRmxvYXQgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKCBhUmF0aW9uYWwuZ2V0VmFsdWUoKSApICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8vIEludGVnZXIKKwlGbG9hdChjb25zdCBJbnRlZ2VyICYgYW5JbnRlZ2VyKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIEZsb2F0ICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIFJhd1ZhbHVlVHlwZSggYW5JbnRlZ2VyLmdldFZhbHVlKCkgKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvLyBhdm1fZmxvYXRfdCAgaS5lLiAgZG91YmxlCisJRmxvYXQoYXZtX2Zsb2F0X3QgYVZhbHVlKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIEZsb2F0ICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIFJhd1ZhbHVlVHlwZShhVmFsdWUpICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8vIGZsb2F0CisJRmxvYXQoZmxvYXQgYVZhbHVlKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIEZsb2F0ICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIFJhd1ZhbHVlVHlwZShhVmFsdWUpICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworI2lmZGVmIF9BVk1fTkVFRF9JTlQ2NF9UX09WRVJMT0FEU18KKworCS8vIGF2bV9pbnRlZ2VyX3QgIGkuZS4gIGF2bV9pbnQ2NF90CisJRmxvYXQoYXZtX2ludGVnZXJfdCBhVmFsdWUpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggRmxvYXQgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKCBzdGF0aWNfY2FzdDwgbG9uZyA+KGFWYWx1ZSkgKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvLyBhdm1fdWludGVnZXJfdCAgaS5lLiAgYXZtX3VpbnQ2NF90CisJRmxvYXQoYXZtX3VpbnRlZ2VyX3QgYVZhbHVlKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIEZsb2F0ICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIFJhd1ZhbHVlVHlwZSggc3RhdGljX2Nhc3Q8IHVuc2lnbmVkIGxvbmcgPihhVmFsdWUpICkgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLy8gbG9uZworCUZsb2F0KGxvbmcgYVZhbHVlKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIEZsb2F0ICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIFJhd1ZhbHVlVHlwZSggYVZhbHVlICkgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJRmxvYXQodW5zaWduZWQgbG9uZyBhVmFsdWUpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggRmxvYXQgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKCBhVmFsdWUgKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKyNlbHNlCisKKwkvLyBhdm1faW50ZWdlcl90ICBpLmUuICBhdm1faW50NjRfdAorCUZsb2F0KGF2bV9pbnRlZ2VyX3QgYVZhbHVlKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIEZsb2F0ICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIFJhd1ZhbHVlVHlwZShhVmFsdWUpICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8vIGF2bV91aW50ZWdlcl90ICBpLmUuICBhdm1fdWludDY0X3QKKwlGbG9hdChhdm1fdWludGVnZXJfdCBhVmFsdWUpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggRmxvYXQgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKGFWYWx1ZSkgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisjZW5kaWYgLyogX0FWTV9ORUVEX0lOVDY0X1RfT1ZFUkxPQURTXyAqLworCisJLy8gaW50MzJfdAorCUZsb2F0KGludCBhVmFsdWUpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggRmxvYXQgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKGFWYWx1ZSkgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLy8gdWludDMyX3QKKwlGbG9hdCh1bnNpZ25lZCBpbnQgYVZhbHVlKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIEZsb2F0ICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIFJhd1ZhbHVlVHlwZShhVmFsdWUpICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8vIHN0ZDo6c3RyaW5nCisJRmxvYXQoY29uc3Qgc3RkOjpzdHJpbmcgJiBhVmFsdWUpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggRmxvYXQgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKGFWYWx1ZSkgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJRmxvYXQoY29uc3QgRmxvYXQgJiBhRmxvYXQpCisJOiBOdW1iZXIoIGFGbG9hdCApLAorCVRoaXNOdW1iZXJDbGFzcyggYUZsb2F0ICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5GbG9hdCgpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIEJBU0lDUyBURVNUUworCSAqLworCXZpcnR1YWwgaW5saW5lIGludCBzaWduKCkgY29uc3QKKwl7CisJCXJldHVybiggVGhpc051bWJlckNsYXNzOjptVmFsdWUuc2lnbigpICk7CisJfQorCisJdmlydHVhbCBpbmxpbmUgYm9vbCBpc1plcm8oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZS5pc196ZXJvKCkgKTsKKwl9CisKKwl2aXJ0dWFsIGlubGluZSBib29sIGlzT25lKCkgY29uc3QKKwl7CisJCXJldHVybiggVGhpc051bWJlckNsYXNzOjptVmFsdWUgPT0gMSApOworCX0KKworCXZpcnR1YWwgaW5saW5lIGJvb2wgaXNOZWdhdGl2ZU9uZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlID09IC0xICk7CisJfQorCisKKwkvKioKKwkgKiBDT05WRVJTSU9OCisJICovCisjZGVmaW5lIENQUF9GTE9BVF9JU19JTlRFR0VSKENQUF9GTE9BVCwgSU5UX1QpICBcCisJKCBDUFBfRkxPQVQgPT0gQ1BQX0ZMT0FULmNvbnZlcnRfdG88IElOVF9UID4oKSApCisvLwkmJiBib29zdDo6bXVsdGlwcmVjaXNpb246OmRlZmF1bHRfb3BzOjpjaGVja19pbl9yYW5nZTwgSU5UX1QgPiggQ1BQX0ZMT0FUICkKKworI2RlZmluZSBDUFBfRkxPQVRfSVNfUE9TSVRJVkVfSU5URUdFUihDUFBfRkxPQVQsIElOVF9UKSAgXAorCSggQ1BQX0ZMT0FULnNpZ24oKSA+PSAwICkgIFwKKwkmJiAoIENQUF9GTE9BVCA9PSBDUFBfRkxPQVQuY29udmVydF90bzwgSU5UX1QgPigpICkKKy8vCSYmIGJvb3N0OjptdWx0aXByZWNpc2lvbjo6ZGVmYXVsdF9vcHM6OmNoZWNrX2luX3JhbmdlPCBJTlRfVCA+KCBDUFBfRkxPQVQgKQorCisKKwlpbmxpbmUgdmlydHVhbCBib29sIGlzSW50MzIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBDUFBfRkxPQVRfSVNfSU5URUdFUihUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSwgYXZtX2ludDMyX3QpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgYXZtX2ludDMyX3QgdG9JbnQzMigpIGNvbnN0CisJeworCQlyZXR1cm4oIFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLmNvbnZlcnRfdG88IGF2bV9pbnQzMl90ID4oKSApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgYm9vbCBpc0ludDY0KCkgY29uc3QKKwl7CisJCXJldHVybiggQ1BQX0ZMT0FUX0lTX0lOVEVHRVIoVGhpc051bWJlckNsYXNzOjptVmFsdWUsIGF2bV9pbnQ2NF90KSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGF2bV9pbnQ2NF90IHRvSW50NjQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZS5jb252ZXJ0X3RvPCBhdm1faW50NjRfdCA+KCkgKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIGJvb2wgaXNJbnRlZ2VyKCkgY29uc3QKKwl7CisJCXJldHVybiggQ1BQX0ZMT0FUX0lTX0lOVEVHRVIoVGhpc051bWJlckNsYXNzOjptVmFsdWUsIGF2bV9pbnRlZ2VyX3QpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgYXZtX2ludGVnZXJfdCB0b0ludGVnZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZS5jb252ZXJ0X3RvPCBhdm1faW50ZWdlcl90ID4oKSApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgYm9vbCBpc1Bvc0ludGVnZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBDUFBfRkxPQVRfSVNfUE9TSVRJVkVfSU5URUdFUigKKwkJCQlUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSwgYXZtX3VpbnRlZ2VyX3QpICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBib29sIGlzVUludGVnZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBDUFBfRkxPQVRfSVNfUE9TSVRJVkVfSU5URUdFUigKKwkJCQlUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSwgYXZtX3VpbnRlZ2VyX3QpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgYXZtX3VpbnRlZ2VyX3QgdG9VSW50ZWdlcigpIGNvbnN0CisJeworCQlyZXR1cm4oIFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLmNvbnZlcnRfdG88IGF2bV91aW50ZWdlcl90ID4oKSApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgYm9vbCBpc1JhdGlvbmFsKCkgY29uc3QKKwl7CisJCXJldHVybiggaXNJbnRlZ2VyKCkgKTsKKwl9CisKKwl2aXJ0dWFsIGF2bV9pbnRlZ2VyX3QgdG9OdW1lcmF0b3IoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZS5jb252ZXJ0X3RvPCBhdm1faW50ZWdlcl90ID4oKSApOworCX0KKworCXZpcnR1YWwgYXZtX2ludGVnZXJfdCB0b0Rlbm9taW5hdG9yKCkgY29uc3QKKwl7CisJCXJldHVybiggc3RhdGljX2Nhc3Q8IGF2bV9pbnRlZ2VyX3QgPiggMSApICk7CisJfQorCisKKyNkZWZpbmUgQ1BQX0ZMT0FUX0lTX0ZMT0FUKENQUF9GTE9BVCwgRkxPQVRfVCkgIFwKKwkoIENQUF9GTE9BVCA9PSBDUFBfRkxPQVQuY29udmVydF90bzwgRkxPQVRfVCA+KCkgKQorLy8JJiYgYm9vc3Q6Om11bHRpcHJlY2lzaW9uOjpkZWZhdWx0X29wczo6Y2hlY2tfaW5fcmFuZ2U8IEZMT0FUX1QgPiggQ1BQX0ZMT0FUICkKKworCisJaW5saW5lIHZpcnR1YWwgYm9vbCBpc0Zsb2F0KCkgY29uc3QKKwl7CisvLwkJcmV0dXJuKCBmYWxzZSApOworCQlyZXR1cm4oIENQUF9GTE9BVF9JU19GTE9BVChUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSwgYXZtX2Zsb2F0X3QpICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBhdm1fZmxvYXRfdCB0b0Zsb2F0KCkgY29uc3QKKwl7CisJCXJldHVybiggVGhpc051bWJlckNsYXNzOjptVmFsdWUuY29udmVydF90bzwgYXZtX2Zsb2F0X3QgPigpICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBib29sIGlzUmVhbCgpIGNvbnN0CisJeworLy8JCXJldHVybiggZmFsc2UgKTsKKwkJcmV0dXJuKCBDUFBfRkxPQVRfSVNfRkxPQVQoVGhpc051bWJlckNsYXNzOjptVmFsdWUsIGF2bV9yZWFsX3QpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgYXZtX3JlYWxfdCB0b1JlYWwoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZS5jb252ZXJ0X3RvPCBhdm1fcmVhbF90ID4oKSApOworCX0KKworCisJLyoqCisJICogbWF0aCBmdW5jdGlvbgorCSAqLworCWlubGluZSB2b2lkIHNldF9wb3coYXZtX3VpbnRlZ2VyX3QgYW5FeHBvbmVudCkKKwl7CisJCVRoaXNOdW1iZXJDbGFzczo6bVZhbHVlID0gYm9vc3Q6Om11bHRpcHJlY2lzaW9uOjpwb3coCisJCQkJVGhpc051bWJlckNsYXNzOjptVmFsdWUsIGFuRXhwb25lbnQpOworCX0KKworCWlubGluZSB2b2lkIHNldF9wb3coZG91YmxlIGFWYWx1ZSwgYXZtX3VpbnRlZ2VyX3QgYW5FeHBvbmVudCkKKwl7CisJCVRoaXNOdW1iZXJDbGFzczo6bVZhbHVlID0gYm9vc3Q6Om11bHRpcHJlY2lzaW9uOjpwb3coCisJCQkJUmF3VmFsdWVUeXBlKGFWYWx1ZSksIGFuRXhwb25lbnQpOworCX0KKworCisJLyoqCisJICogU2VyaWFsaXphdGlvbgorCSAqLworCXZpcnR1YWwgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCW9zIDw8IFRBQiAvKjw8IE9TX0ZMT0FUX1BSRUNJU0lPTiovIDw8IG1WYWx1ZS5zdHIoKTsKKwkJQVZNX0RFQlVHX1JFRl9DT1VOVEVSKG9zKTsKKwkJb3MgPDwgRU9MX0ZMVVNIOworCX0KKworCXZpcnR1YWwgc3RkOjpzdHJpbmcgc3RyKCkgY29uc3QKKwl7CisJCXJldHVybiggbVZhbHVlLnN0cigpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgc3RyTnVtKAorCQkJYXZtX3VpbnQ4X3QgcHJlY2lzaW9uID0gQVZNX01VTUVSSUNfUFJFQ0lTSU9OKSBjb25zdAorCXsKKwkJcmV0dXJuKCBPU1MoKSA8PCBzdGQ6OmZpeGVkCisJCQkJPDwgc3RkOjpzZXRwcmVjaXNpb24oIHByZWNpc2lvbiApIDw8IG1WYWx1ZSApOworCX0KKworfTsKKworCisvKioKKyAqIE9wZXJhdG9ycworICovCitpbmxpbmUgRmxvYXQ6OlJhd1ZhbHVlVHlwZSBvcGVyYXRvcisgKEZsb2F0OjpSYXdWYWx1ZVR5cGUgYUZMb2F0LAorCQljb25zdCBSYXRpb25hbDo6UmF3VmFsdWVUeXBlICYgYVJhdGlvbmFsKQoreworCXJldHVybiggc3RhdGljX2Nhc3Q8IEZsb2F0OjpSYXdWYWx1ZVR5cGUgPiggYUZMb2F0ICsKKwkJCWFSYXRpb25hbC5jb252ZXJ0X3RvPCBGbG9hdDo6UmF3VmFsdWVUeXBlID4oKSApICk7Cit9CisKK2lubGluZSBGbG9hdDo6UmF3VmFsdWVUeXBlIG9wZXJhdG9yLSAoRmxvYXQ6OlJhd1ZhbHVlVHlwZSBhRkxvYXQsCisJCWNvbnN0IFJhdGlvbmFsOjpSYXdWYWx1ZVR5cGUgJiBhUmF0aW9uYWwpCit7CisJcmV0dXJuKCBzdGF0aWNfY2FzdDwgRmxvYXQ6OlJhd1ZhbHVlVHlwZSA+KCBhRkxvYXQgLQorCQkJYVJhdGlvbmFsLmNvbnZlcnRfdG88IEZsb2F0OjpSYXdWYWx1ZVR5cGUgPigpICkgKTsKK30KKworaW5saW5lIEZsb2F0OjpSYXdWYWx1ZVR5cGUgb3BlcmF0b3IqIChGbG9hdDo6UmF3VmFsdWVUeXBlIGFGTG9hdCwKKwkJY29uc3QgUmF0aW9uYWw6OlJhd1ZhbHVlVHlwZSAmIGFSYXRpb25hbCkKK3sKKwlyZXR1cm4oIHN0YXRpY19jYXN0PCBGbG9hdDo6UmF3VmFsdWVUeXBlID4oIGFGTG9hdCAqCisJCQlhUmF0aW9uYWwuY29udmVydF90bzwgRmxvYXQ6OlJhd1ZhbHVlVHlwZSA+KCkgKSApOworfQorCitpbmxpbmUgRmxvYXQ6OlJhd1ZhbHVlVHlwZSBvcGVyYXRvci8gKEZsb2F0OjpSYXdWYWx1ZVR5cGUgYUZMb2F0LAorCQljb25zdCBSYXRpb25hbDo6UmF3VmFsdWVUeXBlICYgYVJhdGlvbmFsKQoreworCXJldHVybiggc3RhdGljX2Nhc3Q8IEZsb2F0OjpSYXdWYWx1ZVR5cGUgPiggYUZMb2F0IC8KKwkJCWFSYXRpb25hbC5jb252ZXJ0X3RvPCBGbG9hdDo6UmF3VmFsdWVUeXBlID4oKSApICk7Cit9CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKiBGTUxfTlVNRVJJQ19CT09TVF9GTE9BVElNUExfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9udW1lcmljL2Jvb3N0L0ludGVnZXJJbXBsLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbnVtZXJpYy9ib29zdC9JbnRlZ2VySW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NDc5MmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbnVtZXJpYy9ib29zdC9JbnRlZ2VySW1wbC5oCkBAIC0wLDAgKzEsMzQ5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTcgbWFpIDIwMTYKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBJbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBGTUxfTlVNRVJJQ19CT09TVF9JTlRFR0VSSU1QTF9IXworI2RlZmluZSBGTUxfTlVNRVJJQ19CT09TVF9JTlRFR0VSSU1QTF9IXworCisjaW5jbHVkZSA8Ym9vc3QvbXVsdGlwcmVjaXNpb24vY3BwX2ludC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvbXVsdGlwcmVjaXNpb24vZGV0YWlsL2RlZmF1bHRfb3BzLmhwcD4KKyNpbmNsdWRlIDxib29zdC9tdWx0aXByZWNpc2lvbi9jcHBfZGVjX2Zsb2F0LmhwcD4KKworI2luY2x1ZGUgPGZtbC9udW1lcmljL051bWJlci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjbGFzcyBJbnRlZ2VyIDoKKwkJcHVibGljIE51bWJlciwKKwkJcHVibGljIEdlbmVyaWNOdW1iZXJDbGFzczwgYm9vc3Q6Om11bHRpcHJlY2lzaW9uOjpjcHBfaW50ICwgSW50ZWdlciA+Cit7CisKKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggSW50ZWdlciApCisKKworCS8qKgorCSAqIFRZUEVERUYKKwkgKi8KK3B1YmxpYzoKKwl0eXBlZGVmICBib29zdDo6bXVsdGlwcmVjaXNpb246OmNwcF9pbnQgIFJhd1ZhbHVlVHlwZTsKKworcHJpdmF0ZToKKwl0eXBlZGVmICBHZW5lcmljTnVtYmVyQ2xhc3M8IFJhd1ZhbHVlVHlwZSAsIEludGVnZXIgPiAgVGhpc051bWJlckNsYXNzOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlJbnRlZ2VyKGNvbnN0IFJhd1ZhbHVlVHlwZSAmIGFWYWx1ZSkKKwk6IE51bWJlciggQ0xBU1NfS0lORF9UKCBJbnRlZ2VyICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIGFWYWx1ZSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKyNpZmRlZiBfQVZNX05FRURfSU5UNjRfVF9PVkVSTE9BRFNfCisKKwkvLyBhdm1faW50ZWdlcl90ICBpLmUuICBhdm1faW50NjRfdAorCUludGVnZXIoYXZtX2ludGVnZXJfdCBhVmFsdWUpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggSW50ZWdlciApICksCisJVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoIHN0YXRpY19jYXN0PCBsb25nID4oIGFWYWx1ZSApICkgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLy8gYXZtX3VpbnRlZ2VyX3QgIGkuZS4gIGF2bV91aW50NjRfdAorCUludGVnZXIoYXZtX3VpbnRlZ2VyX3QgYVZhbHVlKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIEludGVnZXIgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKCBzdGF0aWNfY2FzdDwgdW5zaWduZWQgbG9uZyA+KCBhVmFsdWUgKSApICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8vIGxvbmcKKwlJbnRlZ2VyKGxvbmcgYVZhbHVlKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIEludGVnZXIgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKCBhVmFsdWUgKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlJbnRlZ2VyKHVuc2lnbmVkIGxvbmcgYVZhbHVlKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIEludGVnZXIgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKCBhVmFsdWUgKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKyNlbHNlCisKKwkvLyBhdm1faW50ZWdlcl90ICBpLmUuICBhdm1faW50NjRfdAorCUludGVnZXIoYXZtX2ludGVnZXJfdCBhVmFsdWUpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggSW50ZWdlciApICksCisJVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoYVZhbHVlKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvLyBhdm1fdWludGVnZXJfdCAgaS5lLiAgYXZtX3VpbnQ2NF90CisJSW50ZWdlcihhdm1fdWludGVnZXJfdCBhVmFsdWUpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggSW50ZWdlciApICksCisJVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoYVZhbHVlKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKyNlbmRpZiAvKiBfQVZNX05FRURfSU5UNjRfVF9PVkVSTE9BRFNfICovCisKKwkvLyBpbnQzMl90CisJSW50ZWdlcihpbnQgYVZhbHVlKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIEludGVnZXIgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKGFWYWx1ZSkgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLy8gdWludDMyX3QKKwlJbnRlZ2VyKHVuc2lnbmVkIGludCBhVmFsdWUpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggSW50ZWdlciApICksCisJVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoYVZhbHVlKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvLyBzdGQ6OnN0cmluZworCUludGVnZXIoY29uc3Qgc3RkOjpzdHJpbmcgJiBhVmFsdWUpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggSW50ZWdlciApICksCisJVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoYVZhbHVlKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIENvcHkKKwkgKi8KKwlJbnRlZ2VyKGNvbnN0IEludGVnZXIgJiBhbkludGVnZXIpCisJOiBOdW1iZXIoIGFuSW50ZWdlciApLAorCVRoaXNOdW1iZXJDbGFzcyggYW5JbnRlZ2VyICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkludGVnZXIoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBCQVNJQ1MgVEVTVFMKKwkgKi8KKwl2aXJ0dWFsIGlubGluZSBpbnQgc2lnbigpIGNvbnN0CisJeworCQlyZXR1cm4oIFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLnNpZ24oKSApOworCX0KKworCXZpcnR1YWwgaW5saW5lIGJvb2wgaXNaZXJvKCkgY29uc3QKKwl7CisJCXJldHVybiggVGhpc051bWJlckNsYXNzOjptVmFsdWUuaXNfemVybygpICk7CisJfQorCisJdmlydHVhbCBpbmxpbmUgYm9vbCBpc09uZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlID09IDEgKTsKKwl9CisKKwl2aXJ0dWFsIGlubGluZSBib29sIGlzTmVnYXRpdmVPbmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSA9PSAtMSApOworCX0KKworCisJLyoqCisJICogQ09OVkVSU0lPTgorCSAqLworI2RlZmluZSBDUFBfSU5UX0lTX0lOVEVHRVIoQ1BQX0lOVCwgSU5UX1QpICBcCisJKCBDUFBfSU5UID09IENQUF9JTlQuY29udmVydF90bzwgSU5UX1QgPigpICkKKy8vCSYmIGJvb3N0OjptdWx0aXByZWNpc2lvbjo6ZGVmYXVsdF9vcHM6OmNoZWNrX2luX3JhbmdlPCBJTlRfVCA+KCBDUFBfSU5UICkKKworI2RlZmluZSBDUFBfSU5UX0lTX1BPU0lUSVZFX0lOVEVHRVIoQ1BQX0lOVCwgSU5UX1QpICBcCisJKCBDUFBfSU5ULnNpZ24oKSA+PSAwICkgIFwKKwkmJiAoIENQUF9JTlQgPT0gQ1BQX0lOVC5jb252ZXJ0X3RvPCBJTlRfVCA+KCkgKQorLy8JJiYgYm9vc3Q6Om11bHRpcHJlY2lzaW9uOjpkZWZhdWx0X29wczo6Y2hlY2tfaW5fcmFuZ2U8IElOVF9UID4oIENQUF9JTlQgKQorCisKKwlpbmxpbmUgdmlydHVhbCBib29sIGlzSW50MzIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBDUFBfSU5UX0lTX0lOVEVHRVIoVGhpc051bWJlckNsYXNzOjptVmFsdWUsIGF2bV9pbnQzMl90KSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGF2bV9pbnQzMl90IHRvSW50MzIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZS5jb252ZXJ0X3RvPCBhdm1faW50MzJfdCA+KCkgKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIGJvb2wgaXNJbnQ2NCgpIGNvbnN0CisJeworCQlyZXR1cm4oIENQUF9JTlRfSVNfSU5URUdFUihUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSwgYXZtX2ludDY0X3QpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgYXZtX2ludDY0X3QgdG9JbnQ2NCgpIGNvbnN0CisJeworCQlyZXR1cm4oIFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLmNvbnZlcnRfdG88IGF2bV9pbnQ2NF90ID4oKSApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgYm9vbCBpc0ludGVnZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBDUFBfSU5UX0lTX0lOVEVHRVIoVGhpc051bWJlckNsYXNzOjptVmFsdWUsIGF2bV9pbnRlZ2VyX3QpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgYXZtX2ludGVnZXJfdCB0b0ludGVnZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZS5jb252ZXJ0X3RvPCBhdm1faW50ZWdlcl90ID4oKSApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgYm9vbCBpc1Bvc0ludGVnZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBDUFBfSU5UX0lTX1BPU0lUSVZFX0lOVEVHRVIoCisJCQkJVGhpc051bWJlckNsYXNzOjptVmFsdWUsIGF2bV91aW50ZWdlcl90KSApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgYm9vbCBpc1VJbnRlZ2VyKCkgY29uc3QKKwl7CisJCXJldHVybiggQ1BQX0lOVF9JU19QT1NJVElWRV9JTlRFR0VSKAorCQkJCVRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLCBhdm1fdWludGVnZXJfdCkgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBhdm1fdWludGVnZXJfdCB0b1VJbnRlZ2VyKCkgY29uc3QKKwl7CisJCXJldHVybiggVGhpc051bWJlckNsYXNzOjptVmFsdWUuY29udmVydF90bzwgYXZtX3VpbnRlZ2VyX3QgPigpICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBib29sIGlzUmF0aW9uYWwoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBpc0ludGVnZXIoKSApOworCX0KKworCXZpcnR1YWwgYXZtX2ludGVnZXJfdCB0b051bWVyYXRvcigpIGNvbnN0CisJeworCQlyZXR1cm4oIFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLmNvbnZlcnRfdG88IGF2bV9pbnRlZ2VyX3QgPigpICk7CisJfQorCisJdmlydHVhbCBhdm1faW50ZWdlcl90IHRvRGVub21pbmF0b3IoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBzdGF0aWNfY2FzdDwgYXZtX2ludGVnZXJfdCA+KCAxICkgKTsKKwl9CisKKworI2RlZmluZSBDUFBfSU5UX0lTX0ZMT0FUKENQUF9JTlQsIEZMT0FUX1QpICBcCisJYm9vc3Q6Om11bHRpcHJlY2lzaW9uOjpkZWZhdWx0X29wczo6Y2hlY2tfaW5fcmFuZ2U8IEZMT0FUX1QgPiggIFwKKwlDUFBfSU5ULmNvbnZlcnRfdG88IGJvb3N0OjptdWx0aXByZWNpc2lvbjo6Y3BwX2RlY19mbG9hdDwwPiA+KCkgKQorLy8JKCBDUFBfSU5UID09IENQUF9JTlQuY29udmVydF90bzwgRkxPQVRfVCA+KCkgKQorCisKKwlpbmxpbmUgdmlydHVhbCBib29sIGlzRmxvYXQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBmYWxzZSApOworLy8JCXJldHVybiggQ1BQX0lOVF9JU19GTE9BVChUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSwgYXZtX2Zsb2F0X3QpICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBhdm1fZmxvYXRfdCB0b0Zsb2F0KCkgY29uc3QKKwl7CisJCXJldHVybiggVGhpc051bWJlckNsYXNzOjptVmFsdWUuY29udmVydF90bzwgYXZtX2Zsb2F0X3QgPigpICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBib29sIGlzUmVhbCgpIGNvbnN0CisJeworCQlyZXR1cm4oIGZhbHNlICk7CisvLwkJcmV0dXJuKCBDUFBfSU5UX0lTX0ZMT0FUKFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLCBhdm1fcmVhbF90KSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGF2bV9yZWFsX3QgdG9SZWFsKCkgY29uc3QKKwl7CisJCXJldHVybiggVGhpc051bWJlckNsYXNzOjptVmFsdWUuY29udmVydF90bzwgYXZtX3JlYWxfdCA+KCkgKTsKKwl9CisKKworCS8qKgorCSAqIG1hdGggZnVuY3Rpb24KKwkgKi8KKwlpbmxpbmUgdm9pZCBzZXRfcG93KGF2bV91aW50ZWdlcl90IGFuRXhwb25lbnQpCisJeworCQlUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSA9IGJvb3N0OjptdWx0aXByZWNpc2lvbjo6cG93KAorCQkJCVRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLCBhbkV4cG9uZW50KTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRfcG93KGF2bV91aW50ZWdlcl90IGFWYWx1ZSwgYXZtX3VpbnRlZ2VyX3QgYW5FeHBvbmVudCkKKwl7CisJCVRoaXNOdW1iZXJDbGFzczo6bVZhbHVlID0gYm9vc3Q6Om11bHRpcHJlY2lzaW9uOjpwb3coCisJCQkJUmF3VmFsdWVUeXBlKGFWYWx1ZSksIGFuRXhwb25lbnQpOworCX0KKworCisJaW5saW5lIEludGVnZXIgcG93KGF2bV91aW50ZWdlcl90IGFuRXhwb25lbnQpIGNvbnN0CisJeworCQlyZXR1cm4oIEludGVnZXIoIGJvb3N0OjptdWx0aXByZWNpc2lvbjo6cG93KAorCQkJCVRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLCBhbkV4cG9uZW50KSApICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBJbnRlZ2VyIHBvdyhhdm1fdWludGVnZXJfdCBhVmFsdWUsIGF2bV91aW50ZWdlcl90IGFuRXhwb25lbnQpCisJeworCQlyZXR1cm4oIEludGVnZXIoIGJvb3N0OjptdWx0aXByZWNpc2lvbjo6cG93KAorCQkJCVJhd1ZhbHVlVHlwZShhVmFsdWUpLCBhbkV4cG9uZW50KSApICk7CisJfQorCisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJaW5saW5lIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQlvcyA8PCBUQUIgPDwgbVZhbHVlOworCQlBVk1fREVCVUdfUkVGX0NPVU5URVIob3MpOworCQlvcyA8PCBFT0wgPDwgc3RkOjpmbHVzaDsKKwl9CisKKwl2aXJ0dWFsIHN0ZDo6c3RyaW5nIHN0cigpIGNvbnN0CisJeworCQlyZXR1cm4oIE9TUygpIDw8IG1WYWx1ZSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHN0ck51bSgKKwkJCWF2bV91aW50OF90IHByZWNpc2lvbiA9IEFWTV9NVU1FUklDX1BSRUNJU0lPTikgY29uc3QKKwl7CisJCXJldHVybiggT1NTKCkgPDwgbVZhbHVlICk7CisJfQorCit9OworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworCisjZW5kaWYgLyogRk1MX05VTUVSSUNfQk9PU1RfSU5URUdFUklNUExfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9udW1lcmljL2Jvb3N0L051bWVyaWNJbXBsLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbnVtZXJpYy9ib29zdC9OdW1lcmljSW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMDNiMWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbnVtZXJpYy9ib29zdC9OdW1lcmljSW1wbC5oCkBAIC0wLDAgKzEsNzA1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTcgbWFpIDIwMTYKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBJbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBGTUxfTlVNRVJJQ19CT09TVF9OVU1FUklDSU1QTF9IXworI2RlZmluZSBGTUxfTlVNRVJJQ19CT09TVF9OVU1FUklDSU1QTF9IXworCisjaW5jbHVkZSA8Zm1sL251bWVyaWMvYm9vc3QvSW50ZWdlckltcGwuaD4KKyNpbmNsdWRlIDxmbWwvbnVtZXJpYy9ib29zdC9SYXRpb25hbEltcGwuaD4KKyNpbmNsdWRlIDxmbWwvbnVtZXJpYy9ib29zdC9GbG9hdEltcGwuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CituYW1lc3BhY2UgbnVtZXJpYworeworCisKKy8qKgorICogY29tcGFyZSBGbG9hdAorICogd2l0aCAuLi4KKyAqLworaW5saW5lIGludCBjb21wYXJlKGNvbnN0IEZsb2F0ICYgbnVtMSwgY29uc3QgRmxvYXQgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpLmNvbXBhcmUoIG51bTIuZ2V0VmFsdWUoKSApICk7Cit9CisKK2lubGluZSBpbnQgY29tcGFyZShjb25zdCBGbG9hdCAmIG51bTEsIGNvbnN0IEludGVnZXIgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpLmNvbXBhcmUoCisJCQludW0yLmdldFZhbHVlKCkuY29udmVydF90bzwgRmxvYXQ6OlJhd1ZhbHVlVHlwZSA+KCkgKSApOworfQorCitpbmxpbmUgaW50IGNvbXBhcmUoY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBSYXRpb25hbCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkuY29tcGFyZSgKKwkJCW51bTIuZ2V0VmFsdWUoKS5jb252ZXJ0X3RvPCBGbG9hdDo6UmF3VmFsdWVUeXBlID4oKSApICk7Cit9CisKKworLyoqCisgKiBjb21wYXJlIFJhdGlvbmFsCisgKiB3aXRoIC4uLgorICovCitpbmxpbmUgaW50IGNvbXBhcmUoY29uc3QgUmF0aW9uYWwgJiBudW0xLCBjb25zdCBSYXRpb25hbCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkuY29tcGFyZSggbnVtMi5nZXRWYWx1ZSgpICkgKTsKK30KKworaW5saW5lIGludCBjb21wYXJlKGNvbnN0IFJhdGlvbmFsICYgbnVtMSwgY29uc3QgSW50ZWdlciAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkuY29tcGFyZSggbnVtMi5nZXRWYWx1ZSgpICkgKTsKK30KKworaW5saW5lIGludCBjb21wYXJlKGNvbnN0IFJhdGlvbmFsICYgbnVtMSwgY29uc3QgRmxvYXQgJiBudW0yKQoreworCXJldHVybiggLSBjb21wYXJlKCBudW0yLCBudW0xICkgKTsKK30KKworCisvKioKKyAqIGNvbXBhcmUgSW50ZWdlcgorICogd2l0aCAuLi4KKyAqLworaW5saW5lIGludCBjb21wYXJlKGNvbnN0IEludGVnZXIgJiBudW0xLCBjb25zdCBJbnRlZ2VyICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKS5jb21wYXJlKCBudW0yLmdldFZhbHVlKCkgKSApOworfQorCitpbmxpbmUgaW50IGNvbXBhcmUoY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IFJhdGlvbmFsICYgbnVtMikKK3sKKwlyZXR1cm4oIC0gY29tcGFyZSggbnVtMiwgbnVtMSApICk7Cit9CisKK2lubGluZSBpbnQgY29tcGFyZShjb25zdCBJbnRlZ2VyICYgbnVtMSwgY29uc3QgRmxvYXQgJiBudW0yKQoreworCXJldHVybiggLSBjb21wYXJlKCBudW0yLCBudW0xICkgKTsKK30KKworCisvKioKKyAqIG9wZXJhdG9yPT0KKyAqLworLy8gSW50ZWdlciA9PSBOdW1iZXIKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IEludGVnZXIgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpID09IG51bTIuZ2V0VmFsdWUoKSApOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEludGVnZXIgJiBudW0xLCBjb25zdCBSYXRpb25hbCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPT0gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKS5jb252ZXJ0X3RvPCBGbG9hdDo6UmF3VmFsdWVUeXBlID4oKSA9PSBudW0yLmdldFZhbHVlKCkgKTsKK30KKworCisvLyBSYXRpb25hbCA9PSBOdW1iZXIKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgUmF0aW9uYWwgJiBudW0xLCBjb25zdCBSYXRpb25hbCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPT0gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgUmF0aW9uYWwgJiBudW0xLCBjb25zdCBJbnRlZ2VyICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA9PSBudW0yLmdldFZhbHVlKCkgKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBSYXRpb25hbCAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA9PSBudW0yLmdldFZhbHVlKCkgKTsKK30KKworCisvLyBGbG9hdCA9PSBOdW1iZXIKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBGbG9hdCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPT0gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBSYXRpb25hbCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPT0gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBJbnRlZ2VyICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA9PQorCQkJbnVtMi5nZXRWYWx1ZSgpLmNvbnZlcnRfdG88IEZsb2F0OjpSYXdWYWx1ZVR5cGUgPigpICk7Cit9CisKKworLyoqCisgKiBvcGVyYXRvciE9CisgKi8KKy8vIEludGVnZXIgIT0gTnVtYmVyCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEludGVnZXIgJiBudW0xLCBjb25zdCBJbnRlZ2VyICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSAhPSBudW0yLmdldFZhbHVlKCkgKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBJbnRlZ2VyICYgbnVtMSwgY29uc3QgUmF0aW9uYWwgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpICE9IG51bTIuZ2V0VmFsdWUoKSApOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEludGVnZXIgJiBudW0xLCBjb25zdCBGbG9hdCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgIT0gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKKworLy8gUmF0aW9uYWwgIT0gTnVtYmVyCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFJhdGlvbmFsICYgbnVtMSwgY29uc3QgUmF0aW9uYWwgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpICE9IG51bTIuZ2V0VmFsdWUoKSApOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFJhdGlvbmFsICYgbnVtMSwgY29uc3QgSW50ZWdlciAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgIT0gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgUmF0aW9uYWwgJiBudW0xLCBjb25zdCBGbG9hdCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgIT0gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKKworLy8gRmxvYXQgIT0gTnVtYmVyCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEZsb2F0ICYgbnVtMSwgY29uc3QgRmxvYXQgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpICE9IG51bTIuZ2V0VmFsdWUoKSApOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEZsb2F0ICYgbnVtMSwgY29uc3QgUmF0aW9uYWwgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpICE9IG51bTIuZ2V0VmFsdWUoKSApOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEZsb2F0ICYgbnVtMSwgY29uc3QgSW50ZWdlciAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgIT0KKwkJCW51bTIuZ2V0VmFsdWUoKS5jb252ZXJ0X3RvPCBGbG9hdDo6UmF3VmFsdWVUeXBlID4oKSApOworfQorCisKKy8qKgorICogb3BlcmF0b3I8CisgKi8KKy8vIEludGVnZXIgPCBOdW1iZXIKK2lubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBJbnRlZ2VyICYgbnVtMSwgY29uc3QgSW50ZWdlciAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPCBudW0yLmdldFZhbHVlKCkgKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEludGVnZXIgJiBudW0xLCBjb25zdCBSYXRpb25hbCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPCBudW0yLmdldFZhbHVlKCkgKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEludGVnZXIgJiBudW0xLCBjb25zdCBGbG9hdCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPCBudW0yLmdldFZhbHVlKCkgKTsKK30KKworCisvLyBSYXRpb25hbCA8IE51bWJlcgoraW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFJhdGlvbmFsICYgbnVtMSwgY29uc3QgUmF0aW9uYWwgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpIDwgbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBSYXRpb25hbCAmIG51bTEsIGNvbnN0IEludGVnZXIgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpIDwgbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBSYXRpb25hbCAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA8IG51bTIuZ2V0VmFsdWUoKSApOworfQorCisKKy8vIEZsb2F0IDwgTnVtYmVyCitpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBGbG9hdCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPCBudW0yLmdldFZhbHVlKCkgKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEZsb2F0ICYgbnVtMSwgY29uc3QgUmF0aW9uYWwgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpIDwgbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBGbG9hdCAmIG51bTEsIGNvbnN0IEludGVnZXIgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpIDwKKwkJCW51bTIuZ2V0VmFsdWUoKS5jb252ZXJ0X3RvPCBGbG9hdDo6UmF3VmFsdWVUeXBlID4oKSApOworfQorCisvKioKKyAqIG9wZXJhdG9yPD0KKyAqLworLy8gSW50ZWdlciA8PSBOdW1iZXIKK2lubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IEludGVnZXIgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpIDw9IG51bTIuZ2V0VmFsdWUoKSApOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IEludGVnZXIgJiBudW0xLCBjb25zdCBSYXRpb25hbCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPD0gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA8PSBudW0yLmdldFZhbHVlKCkgKTsKK30KKworCisvLyBSYXRpb25hbCA8PSBOdW1iZXIKK2lubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgUmF0aW9uYWwgJiBudW0xLCBjb25zdCBSYXRpb25hbCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPD0gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgUmF0aW9uYWwgJiBudW0xLCBjb25zdCBJbnRlZ2VyICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA8PSBudW0yLmdldFZhbHVlKCkgKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBSYXRpb25hbCAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA8PSBudW0yLmdldFZhbHVlKCkgKTsKK30KKworCisvLyBGbG9hdCA8PSBOdW1iZXIKK2lubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBGbG9hdCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPD0gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBSYXRpb25hbCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPD0gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBJbnRlZ2VyICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA8PQorCQkJbnVtMi5nZXRWYWx1ZSgpLmNvbnZlcnRfdG88IEZsb2F0OjpSYXdWYWx1ZVR5cGUgPigpICk7Cit9CisKKworLyoqCisgKiBvcGVyYXRvcj4KKyAqLworLy8gSW50ZWdlciA+IE51bWJlcgoraW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEludGVnZXIgJiBudW0xLCBjb25zdCBJbnRlZ2VyICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA+IG51bTIuZ2V0VmFsdWUoKSApOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IFJhdGlvbmFsICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA+IG51bTIuZ2V0VmFsdWUoKSApOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA+IG51bTIuZ2V0VmFsdWUoKSApOworfQorCisKKy8vIFJhdGlvbmFsID4gTnVtYmVyCitpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgUmF0aW9uYWwgJiBudW0xLCBjb25zdCBSYXRpb25hbCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPiBudW0yLmdldFZhbHVlKCkgKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IFJhdGlvbmFsICYgbnVtMSwgY29uc3QgSW50ZWdlciAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPiBudW0yLmdldFZhbHVlKCkgKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IFJhdGlvbmFsICYgbnVtMSwgY29uc3QgRmxvYXQgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpID4gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKKworLy8gRmxvYXQgPiBOdW1iZXIKK2lubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBGbG9hdCAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA+IG51bTIuZ2V0VmFsdWUoKSApOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBSYXRpb25hbCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPiBudW0yLmdldFZhbHVlKCkgKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEZsb2F0ICYgbnVtMSwgY29uc3QgSW50ZWdlciAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPgorCQkJbnVtMi5nZXRWYWx1ZSgpLmNvbnZlcnRfdG88IEZsb2F0OjpSYXdWYWx1ZVR5cGUgPigpICk7Cit9CisKKy8qKgorICogb3BlcmF0b3I+PQorICovCisvLyBJbnRlZ2VyID49IE51bWJlcgoraW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBJbnRlZ2VyICYgbnVtMSwgY29uc3QgSW50ZWdlciAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPj0gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IFJhdGlvbmFsICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA+PSBudW0yLmdldFZhbHVlKCkgKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBJbnRlZ2VyICYgbnVtMSwgY29uc3QgRmxvYXQgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpID49IG51bTIuZ2V0VmFsdWUoKSApOworfQorCisKKy8vIFJhdGlvbmFsID49IE51bWJlcgoraW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBSYXRpb25hbCAmIG51bTEsIGNvbnN0IFJhdGlvbmFsICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA+PSBudW0yLmdldFZhbHVlKCkgKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBSYXRpb25hbCAmIG51bTEsIGNvbnN0IEludGVnZXIgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpID49IG51bTIuZ2V0VmFsdWUoKSApOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IFJhdGlvbmFsICYgbnVtMSwgY29uc3QgRmxvYXQgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpID49IG51bTIuZ2V0VmFsdWUoKSApOworfQorCisKKy8vIEZsb2F0ID49IE51bWJlcgoraW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBGbG9hdCAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA+PSBudW0yLmdldFZhbHVlKCkgKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBGbG9hdCAmIG51bTEsIGNvbnN0IFJhdGlvbmFsICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA+PSBudW0yLmdldFZhbHVlKCkgKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBGbG9hdCAmIG51bTEsIGNvbnN0IEludGVnZXIgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpID49CisJCQludW0yLmdldFZhbHVlKCkuY29udmVydF90bzwgRmxvYXQ6OlJhd1ZhbHVlVHlwZSA+KCkgKTsKK30KKworCisvKioKKyAqIG9wZXJhdG9yKworICovCisvLyBJbnRlZ2VyICsgTnVtYmVyCitpbmxpbmUgSW50ZWdlciBvcGVyYXRvcisoY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IEludGVnZXIgJiBudW0yKQoreworCXJldHVybiggSW50ZWdlcihudW0xLmdldFZhbHVlKCkgKyBudW0yLmdldFZhbHVlKCkpICk7Cit9CisKK2lubGluZSBSYXRpb25hbCBvcGVyYXRvcisoY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IFJhdGlvbmFsICYgbnVtMikKK3sKKwlyZXR1cm4oIFJhdGlvbmFsKG51bTEuZ2V0VmFsdWUoKSArIG51bTIuZ2V0VmFsdWUoKSkgKTsKK30KKworaW5saW5lIEZsb2F0IG9wZXJhdG9yKyhjb25zdCBJbnRlZ2VyICYgbnVtMSwgY29uc3QgRmxvYXQgJiBudW0yKQoreworCXJldHVybiggRmxvYXQobnVtMS5nZXRWYWx1ZSgpICsgbnVtMi5nZXRWYWx1ZSgpKSApOworfQorCisKKy8vIFJhdGlvbmFsICsgTnVtYmVyCitpbmxpbmUgUmF0aW9uYWwgb3BlcmF0b3IrKGNvbnN0IFJhdGlvbmFsICYgbnVtMSwgY29uc3QgUmF0aW9uYWwgJiBudW0yKQoreworCXJldHVybiggUmF0aW9uYWwobnVtMS5nZXRWYWx1ZSgpICsgbnVtMi5nZXRWYWx1ZSgpKSApOworfQorCitpbmxpbmUgUmF0aW9uYWwgb3BlcmF0b3IrKGNvbnN0IFJhdGlvbmFsICYgbnVtMSwgY29uc3QgSW50ZWdlciAmIG51bTIpCit7CisJcmV0dXJuKCBSYXRpb25hbChudW0xLmdldFZhbHVlKCkgKyBudW0yLmdldFZhbHVlKCkpICk7Cit9CisKK2lubGluZSBGbG9hdCBvcGVyYXRvcisoY29uc3QgUmF0aW9uYWwgJiBudW0xLCBjb25zdCBGbG9hdCAmIG51bTIpCit7CisJcmV0dXJuKCBGbG9hdChudW0xLmdldFZhbHVlKCkgKyBudW0yLmdldFZhbHVlKCkpICk7Cit9CisKKworLy8gRmxvYXQgKyBOdW1iZXIKK2lubGluZSBGbG9hdCBvcGVyYXRvcisoY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBGbG9hdCAmIG51bTIpCit7CisJcmV0dXJuKCBGbG9hdChudW0xLmdldFZhbHVlKCkgKyBudW0yLmdldFZhbHVlKCkpICk7Cit9CisKK2lubGluZSBGbG9hdCBvcGVyYXRvcisoY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBSYXRpb25hbCAmIG51bTIpCit7CisJcmV0dXJuKCBGbG9hdChudW0xLmdldFZhbHVlKCkgKyBudW0yLmdldFZhbHVlKCkpICk7Cit9CisKK2lubGluZSBGbG9hdCBvcGVyYXRvcisoY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBJbnRlZ2VyICYgbnVtMikKK3sKKwlyZXR1cm4oIEZsb2F0KG51bTEuZ2V0VmFsdWUoKSArCisJCQludW0yLmdldFZhbHVlKCkuY29udmVydF90bzwgRmxvYXQ6OlJhd1ZhbHVlVHlwZSA+KCkgKSApOworfQorCisKKy8qKgorICogb3BlcmF0b3ItCisgKi8KK2lubGluZSBJbnRlZ2VyIG9wZXJhdG9yLShjb25zdCBJbnRlZ2VyICYgbnVtKQoreworCXJldHVybiggSW50ZWdlcigtIG51bS5nZXRWYWx1ZSgpKSApOworfQorCitpbmxpbmUgUmF0aW9uYWwgb3BlcmF0b3ItKGNvbnN0IFJhdGlvbmFsICYgbnVtKQoreworCXJldHVybiggUmF0aW9uYWwoLSBudW0uZ2V0VmFsdWUoKSkgKTsKK30KKworaW5saW5lIEZsb2F0IG9wZXJhdG9yLShjb25zdCBGbG9hdCAmIG51bSkKK3sKKwlyZXR1cm4oIEZsb2F0KC0gbnVtLmdldFZhbHVlKCkpICk7Cit9CisKKworLyoqCisgKiBvcGVyYXRvci0KKyAqLworLy8gSW50ZWdlciAtIE51bWJlcgoraW5saW5lIEludGVnZXIgb3BlcmF0b3ItKGNvbnN0IEludGVnZXIgJiBudW0xLCBjb25zdCBJbnRlZ2VyICYgbnVtMikKK3sKKwlyZXR1cm4oIEludGVnZXIobnVtMS5nZXRWYWx1ZSgpIC0gbnVtMi5nZXRWYWx1ZSgpKSApOworfQorCitpbmxpbmUgUmF0aW9uYWwgb3BlcmF0b3ItKGNvbnN0IEludGVnZXIgJiBudW0xLCBjb25zdCBSYXRpb25hbCAmIG51bTIpCit7CisJcmV0dXJuKCBSYXRpb25hbChudW0xLmdldFZhbHVlKCkgLSBudW0yLmdldFZhbHVlKCkpICk7Cit9CisKK2lubGluZSBGbG9hdCBvcGVyYXRvci0oY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIEZsb2F0KG51bTEuZ2V0VmFsdWUoKSAtIG51bTIuZ2V0VmFsdWUoKSkgKTsKK30KKworCisvLyBSYXRpb25hbCAtIE51bWJlcgoraW5saW5lIFJhdGlvbmFsIG9wZXJhdG9yLShjb25zdCBSYXRpb25hbCAmIG51bTEsIGNvbnN0IFJhdGlvbmFsICYgbnVtMikKK3sKKwlyZXR1cm4oIFJhdGlvbmFsKG51bTEuZ2V0VmFsdWUoKSAtIG51bTIuZ2V0VmFsdWUoKSkgKTsKK30KKworaW5saW5lIFJhdGlvbmFsIG9wZXJhdG9yLShjb25zdCBSYXRpb25hbCAmIG51bTEsIGNvbnN0IEludGVnZXIgJiBudW0yKQoreworCXJldHVybiggUmF0aW9uYWwobnVtMS5nZXRWYWx1ZSgpIC0gbnVtMi5nZXRWYWx1ZSgpKSApOworfQorCitpbmxpbmUgRmxvYXQgb3BlcmF0b3ItKGNvbnN0IFJhdGlvbmFsICYgbnVtMSwgY29uc3QgRmxvYXQgJiBudW0yKQoreworCXJldHVybiggRmxvYXQobnVtMS5nZXRWYWx1ZSgpIC0gbnVtMi5nZXRWYWx1ZSgpKSApOworfQorCisKKy8vIEZsb2F0IC0gTnVtYmVyCitpbmxpbmUgRmxvYXQgb3BlcmF0b3ItKGNvbnN0IEZsb2F0ICYgbnVtMSwgY29uc3QgRmxvYXQgJiBudW0yKQoreworCXJldHVybiggRmxvYXQobnVtMS5nZXRWYWx1ZSgpIC0gbnVtMi5nZXRWYWx1ZSgpKSApOworfQorCitpbmxpbmUgRmxvYXQgb3BlcmF0b3ItKGNvbnN0IEZsb2F0ICYgbnVtMSwgY29uc3QgUmF0aW9uYWwgJiBudW0yKQoreworCXJldHVybiggRmxvYXQobnVtMS5nZXRWYWx1ZSgpIC0gbnVtMi5nZXRWYWx1ZSgpKSApOworfQorCitpbmxpbmUgRmxvYXQgb3BlcmF0b3ItKGNvbnN0IEZsb2F0ICYgbnVtMSwgY29uc3QgSW50ZWdlciAmIG51bTIpCit7CisJcmV0dXJuKCBGbG9hdChudW0xLmdldFZhbHVlKCkgLQorCQkJbnVtMi5nZXRWYWx1ZSgpLmNvbnZlcnRfdG88IEZsb2F0OjpSYXdWYWx1ZVR5cGUgPigpICkgKTsKK30KKworCisvKioKKyAqIG9wZXJhdG9yKgorICovCisvLyBJbnRlZ2VyICogTnVtYmVyCitpbmxpbmUgSW50ZWdlciBvcGVyYXRvciooY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IEludGVnZXIgJiBudW0yKQoreworCXJldHVybiggSW50ZWdlcihudW0xLmdldFZhbHVlKCkgKiBudW0yLmdldFZhbHVlKCkpICk7Cit9CisKK2lubGluZSBSYXRpb25hbCBvcGVyYXRvciooY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IFJhdGlvbmFsICYgbnVtMikKK3sKKwlyZXR1cm4oIFJhdGlvbmFsKG51bTEuZ2V0VmFsdWUoKSAqIG51bTIuZ2V0VmFsdWUoKSkgKTsKK30KKworaW5saW5lIEZsb2F0IG9wZXJhdG9yKihjb25zdCBJbnRlZ2VyICYgbnVtMSwgY29uc3QgRmxvYXQgJiBudW0yKQoreworCXJldHVybiggRmxvYXQobnVtMS5nZXRWYWx1ZSgpICogbnVtMi5nZXRWYWx1ZSgpKSApOworfQorCisKKy8vIFJhdGlvbmFsICogTnVtYmVyCitpbmxpbmUgUmF0aW9uYWwgb3BlcmF0b3IqKGNvbnN0IFJhdGlvbmFsICYgbnVtMSwgY29uc3QgUmF0aW9uYWwgJiBudW0yKQoreworCXJldHVybiggUmF0aW9uYWwobnVtMS5nZXRWYWx1ZSgpICogbnVtMi5nZXRWYWx1ZSgpKSApOworfQorCitpbmxpbmUgUmF0aW9uYWwgb3BlcmF0b3IqKGNvbnN0IFJhdGlvbmFsICYgbnVtMSwgY29uc3QgSW50ZWdlciAmIG51bTIpCit7CisJcmV0dXJuKCBSYXRpb25hbChudW0xLmdldFZhbHVlKCkgKiBudW0yLmdldFZhbHVlKCkpICk7Cit9CisKK2lubGluZSBGbG9hdCBvcGVyYXRvciooY29uc3QgUmF0aW9uYWwgJiBudW0xLCBjb25zdCBGbG9hdCAmIG51bTIpCit7CisJcmV0dXJuKCBGbG9hdChudW0xLmdldFZhbHVlKCkgKiBudW0yLmdldFZhbHVlKCkpICk7Cit9CisKKworLy8gRmxvYXQgKiBOdW1iZXIKK2lubGluZSBGbG9hdCBvcGVyYXRvciooY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBGbG9hdCAmIG51bTIpCit7CisJcmV0dXJuKCBGbG9hdChudW0xLmdldFZhbHVlKCkgKiBudW0yLmdldFZhbHVlKCkpICk7Cit9CisKK2lubGluZSBGbG9hdCBvcGVyYXRvciooY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBSYXRpb25hbCAmIG51bTIpCit7CisJcmV0dXJuKCBGbG9hdChudW0xLmdldFZhbHVlKCkgKiBudW0yLmdldFZhbHVlKCkpICk7Cit9CisKK2lubGluZSBGbG9hdCBvcGVyYXRvciooY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBJbnRlZ2VyICYgbnVtMikKK3sKKwlyZXR1cm4oIEZsb2F0KG51bTEuZ2V0VmFsdWUoKSAqCisJCQludW0yLmdldFZhbHVlKCkuY29udmVydF90bzwgRmxvYXQ6OlJhd1ZhbHVlVHlwZSA+KCkgKSApOworfQorCisKKy8qKgorICogcG93CisgKi8KK2lubGluZSBJbnRlZ2VyIHBvdyhjb25zdCBJbnRlZ2VyICYgbnVtLCBhdm1fdWludGVnZXJfdCBhbkV4cG9uZW50KQoreworCXJldHVybiggSW50ZWdlciggbnVtLnBvdyhhbkV4cG9uZW50KSApICk7Cit9CisKK2lubGluZSBSYXRpb25hbCBwb3coY29uc3QgUmF0aW9uYWwgJiBudW0sIGF2bV91aW50ZWdlcl90IGFuRXhwb25lbnQpCit7CisJUmF0aW9uYWwgcmVzdWx0KCBudW0gKTsKKwlyZXN1bHQuc2V0X3BvdyggYW5FeHBvbmVudCApOworCisJcmV0dXJuKCBSYXRpb25hbCggcmVzdWx0ICkgKTsKK30KKworaW5saW5lIEZsb2F0IHBvdyhjb25zdCBGbG9hdCAmIG51bSwgYXZtX3VpbnRlZ2VyX3QgYW5FeHBvbmVudCkKK3sKKwlGbG9hdCByZXN1bHQoIG51bSApOworCXJlc3VsdC5zZXRfcG93KCBhbkV4cG9uZW50ICk7CisKKwlyZXR1cm4oIEZsb2F0KCByZXN1bHQgKSApOworfQorCisKKy8qKgorICogb3BlcmF0b3IvCisgKi8KKy8vIEludGVnZXIgLyBOdW1iZXIKK2lubGluZSBSYXRpb25hbCBvcGVyYXRvci8oY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IEludGVnZXIgJiBudW0yKQoreworCXJldHVybiggUmF0aW9uYWwoIG51bTEuZ2V0VmFsdWUoKSAsIG51bTIuZ2V0VmFsdWUoKSApICk7Cit9CisKK2lubGluZSBSYXRpb25hbCBvcGVyYXRvci8oY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IFJhdGlvbmFsICYgbnVtMikKK3sKKwlyZXR1cm4oIFJhdGlvbmFsKG51bTEuZ2V0VmFsdWUoKSAvIG51bTIuZ2V0VmFsdWUoKSkgKTsKK30KKworaW5saW5lIEZsb2F0IG9wZXJhdG9yLyhjb25zdCBJbnRlZ2VyICYgbnVtMSwgY29uc3QgRmxvYXQgJiBudW0yKQoreworCXJldHVybiggRmxvYXQobnVtMS5nZXRWYWx1ZSgpIC8gbnVtMi5nZXRWYWx1ZSgpKSApOworfQorCisKKy8vIFJhdGlvbmFsIC8gTnVtYmVyCitpbmxpbmUgUmF0aW9uYWwgb3BlcmF0b3IvKGNvbnN0IFJhdGlvbmFsICYgbnVtMSwgY29uc3QgUmF0aW9uYWwgJiBudW0yKQoreworCXJldHVybiggUmF0aW9uYWwobnVtMS5nZXRWYWx1ZSgpIC8gbnVtMi5nZXRWYWx1ZSgpKSApOworfQorCitpbmxpbmUgUmF0aW9uYWwgb3BlcmF0b3IvKGNvbnN0IFJhdGlvbmFsICYgbnVtMSwgY29uc3QgSW50ZWdlciAmIG51bTIpCit7CisJcmV0dXJuKCBSYXRpb25hbChudW0xLmdldFZhbHVlKCkgLyBudW0yLmdldFZhbHVlKCkpICk7Cit9CisKK2lubGluZSBGbG9hdCBvcGVyYXRvci8oY29uc3QgUmF0aW9uYWwgJiBudW0xLCBjb25zdCBGbG9hdCAmIG51bTIpCit7CisJcmV0dXJuKCBGbG9hdChudW0xLmdldFZhbHVlKCkgLyBudW0yLmdldFZhbHVlKCkpICk7Cit9CisKKy8vIEZsb2F0IC8gTnVtYmVyCitpbmxpbmUgRmxvYXQgb3BlcmF0b3IvKGNvbnN0IEZsb2F0ICYgbnVtMSwgY29uc3QgRmxvYXQgJiBudW0yKQoreworCXJldHVybiggRmxvYXQobnVtMS5nZXRWYWx1ZSgpIC8gbnVtMi5nZXRWYWx1ZSgpKSApOworfQorCitpbmxpbmUgRmxvYXQgb3BlcmF0b3IvKGNvbnN0IEZsb2F0ICYgbnVtMSwgY29uc3QgUmF0aW9uYWwgJiBudW0yKQoreworCXJldHVybiggRmxvYXQobnVtMS5nZXRWYWx1ZSgpIC8gbnVtMi5nZXRWYWx1ZSgpKSApOworfQorCitpbmxpbmUgRmxvYXQgb3BlcmF0b3IvKGNvbnN0IEZsb2F0ICYgbnVtMSwgY29uc3QgSW50ZWdlciAmIG51bTIpCit7CisJcmV0dXJuKCBGbG9hdChudW0xLmdldFZhbHVlKCkgLworCQkJbnVtMi5nZXRWYWx1ZSgpLmNvbnZlcnRfdG88IEZsb2F0OjpSYXdWYWx1ZVR5cGUgPigpICkgKTsKK30KKworCisvKioKKyAqIGludmVyc2UKKyAqLworaW5saW5lIFJhdGlvbmFsIGludmVyc2UoY29uc3QgSW50ZWdlciAmIG51bSkKK3sKKwlyZXR1cm4oIFJhdGlvbmFsKCBJbnRlZ2VyKDEpICwgbnVtICkgKTsKK30KKworaW5saW5lIFJhdGlvbmFsIGludmVyc2UoY29uc3QgUmF0aW9uYWwgJiBudW0pCit7CisJcmV0dXJuKCBSYXRpb25hbCggbnVtLnJhd0Rlbm9taW5hdG9yKCkgLCBudW0ucmF3TnVtZXJhdG9yKCkgKSApOworfQorCitpbmxpbmUgRmxvYXQgaW52ZXJzZShjb25zdCBGbG9hdCAmIG51bSkKK3sKKwlyZXR1cm4oIEZsb2F0KCAxIC8gbnVtLmdldFZhbHVlKCkgKSApOworfQorCisKK30gLyogbmFtZXNwYWNlIG51bWVyaWMgKi8KK30gLyogbmFtZXNwYWNlIHNlcCAqLworCisjZW5kaWYgLyogRk1MX05VTUVSSUNfQk9PU1RfTlVNRVJJQ0lNUExfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9udW1lcmljL2Jvb3N0L1JhdGlvbmFsSW1wbC5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL251bWVyaWMvYm9vc3QvUmF0aW9uYWxJbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRkYTUwMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9udW1lcmljL2Jvb3N0L1JhdGlvbmFsSW1wbC5oCkBAIC0wLDAgKzEsNTM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTAgbWFpIDIwMTYKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBJbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBGTUxfTlVNRVJJQ19CT09TVF9SQVRJT05BTElNUExfSF8KKyNkZWZpbmUgRk1MX05VTUVSSUNfQk9PU1RfUkFUSU9OQUxJTVBMX0hfCisKKyNpbmNsdWRlIDxib29zdC9tdWx0aXByZWNpc2lvbi9jcHBfaW50LmhwcD4KKyNpbmNsdWRlIDxib29zdC9tdWx0aXByZWNpc2lvbi9kZXRhaWwvZGVmYXVsdF9vcHMuaHBwPgorCisjaW5jbHVkZSA8Zm1sL251bWVyaWMvTnVtYmVyLmg+CisKKyNpbmNsdWRlIDxmbWwvbnVtZXJpYy9JbnRlZ2VyLmg+CisKKyNpbmNsdWRlIDxjbWF0aD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworY2xhc3MgUmF0aW9uYWwgOgorCQlwdWJsaWMgTnVtYmVyLAorCQlwdWJsaWMgR2VuZXJpY051bWJlckNsYXNzPCBib29zdDo6bXVsdGlwcmVjaXNpb246OmNwcF9yYXRpb25hbCAsIFJhdGlvbmFsID4KK3sKKworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBSYXRpb25hbCApCisKKworCS8qKgorCSAqIFRZUEVERUYKKwkgKi8KK3B1YmxpYzoKKwl0eXBlZGVmICBib29zdDo6bXVsdGlwcmVjaXNpb246OmNwcF9yYXRpb25hbCAgUmF3VmFsdWVUeXBlOworCitwcml2YXRlOgorCXR5cGVkZWYgIEdlbmVyaWNOdW1iZXJDbGFzczwgUmF3VmFsdWVUeXBlICwgUmF0aW9uYWwgPiAgVGhpc051bWJlckNsYXNzOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwkvLyBSYXdWYWx1ZVR5cGUKKwlSYXRpb25hbChjb25zdCBSYXdWYWx1ZVR5cGUgJiBhVmFsdWUpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggUmF0aW9uYWwgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggYVZhbHVlICkKKwl7CisJCXNpbXBsaWYoKTsKKwl9CisKKwkvLyBJbnRlZ2VyIC8gSW50ZWdlcgorCVJhdGlvbmFsKGNvbnN0IEludGVnZXIgJiBhTnVtZXJhdG9yLCBjb25zdCBJbnRlZ2VyICYgYURlbm9taW5hdG9yKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIFJhdGlvbmFsICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIFJhd1ZhbHVlVHlwZSgKKwkJCWFOdW1lcmF0b3IuZ2V0VmFsdWUoKSwgYURlbm9taW5hdG9yLmdldFZhbHVlKCkgKSApCisJeworCQlzaW1wbGlmKCk7CisJfQorCisJLy8gSW50ZWdlcjo6UmF3VmFsdWVUeXBlIC8gSW50ZWdlcjo6UmF3VmFsdWVUeXBlCisJLy8gaS5lIGJvb3N0OjptdWx0aXByZWNpc2lvbjo6Y3BwX2ludCAvIGJvb3N0OjptdWx0aXByZWNpc2lvbjo6Y3BwX2ludAorCVJhdGlvbmFsKGNvbnN0IEludGVnZXI6OlJhd1ZhbHVlVHlwZSAmIGFOdW1lcmF0b3IsCisJCQljb25zdCBJbnRlZ2VyOjpSYXdWYWx1ZVR5cGUgJiBhRGVub21pbmF0b3IpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggUmF0aW9uYWwgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKGFOdW1lcmF0b3IsIGFEZW5vbWluYXRvcikgKQorCXsKKwkJc2ltcGxpZigpOworCX0KKworCS8vIGF2bV9pbnRlZ2VyX3QgLyBhdm1faW50ZWdlcl90ICBpLmUuICBhdm1faW50NjRfdCAvIGF2bV9pbnQ2NF90CisJUmF0aW9uYWwoYXZtX2ludGVnZXJfdCBhTnVtZXJhdG9yLCBhdm1faW50ZWdlcl90IGFEZW5vbWluYXRvcikKKwk6IE51bWJlciggQ0xBU1NfS0lORF9UKCBSYXRpb25hbCApICksCisJVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoCisJCQlJbnRlZ2VyOjpSYXdWYWx1ZVR5cGUoIGFOdW1lcmF0b3IgKSwKKwkJCUludGVnZXI6OlJhd1ZhbHVlVHlwZSggYURlbm9taW5hdG9yICkgKSApCisJeworCQlzaW1wbGlmKCk7CisJfQorCisJLy8gYXZtX2ludGVnZXJfdCAvIGF2bV91aW50ZWdlcl90ICBpLmUuICBhdm1faW50NjRfdCAvIGF2bV91aW50NjRfdAorCVJhdGlvbmFsKGF2bV9pbnRlZ2VyX3QgYU51bWVyYXRvciwgYXZtX3VpbnRlZ2VyX3QgYURlbm9taW5hdG9yKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIFJhdGlvbmFsICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIFJhd1ZhbHVlVHlwZSgKKwkJCUludGVnZXI6OlJhd1ZhbHVlVHlwZSggYU51bWVyYXRvciApLAorCQkJSW50ZWdlcjo6UmF3VmFsdWVUeXBlKCBhRGVub21pbmF0b3IgKSApICkKKwl7CisJCXNpbXBsaWYoKTsKKwl9CisKKwkvLyBhdm1fdWludGVnZXJfdCAvIGF2bV9pbnRlZ2VyX3QgIGkuZS4gIGF2bV91aW50NjRfdCAvIGF2bV9pbnQ2NF90CisJUmF0aW9uYWwoYXZtX3VpbnRlZ2VyX3QgYU51bWVyYXRvciwgYXZtX2ludGVnZXJfdCBhRGVub21pbmF0b3IpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggUmF0aW9uYWwgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKAorCQkJSW50ZWdlcjo6UmF3VmFsdWVUeXBlKCBhTnVtZXJhdG9yICksCisJCQlJbnRlZ2VyOjpSYXdWYWx1ZVR5cGUoIGFEZW5vbWluYXRvciApICkgKQorCXsKKwkJc2ltcGxpZigpOworCX0KKworCS8vIGF2bV91aW50ZWdlcl90IC8gYXZtX3VpbnRlZ2VyX3QgIGkuZS4gIGF2bV91aW50NjRfdCAvIGF2bV91aW50NjRfdAorCVJhdGlvbmFsKGF2bV91aW50ZWdlcl90IGFOdW1lcmF0b3IsIGF2bV91aW50ZWdlcl90IGFEZW5vbWluYXRvcikKKwk6IE51bWJlciggQ0xBU1NfS0lORF9UKCBSYXRpb25hbCApICksCisJVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoCisJCQlJbnRlZ2VyOjpSYXdWYWx1ZVR5cGUoIGFOdW1lcmF0b3IgKSwKKwkJCUludGVnZXI6OlJhd1ZhbHVlVHlwZSggYURlbm9taW5hdG9yICkgKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvLyBzdGQ6OnN0cmluZyAvIGF2bV9pbnRlZ2VyX3QgIGkuZS4gIHN0ZDo6c3RyaW5nIC8gYXZtX2ludDY0X3QKKwlSYXRpb25hbChjb25zdCBzdGQ6OnN0cmluZyAmIGFOdW1lcmF0b3IsIGF2bV9pbnRlZ2VyX3QgYURlbm9taW5hdG9yKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIFJhdGlvbmFsICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIFJhd1ZhbHVlVHlwZSgKKwkJCUludGVnZXI6OlJhd1ZhbHVlVHlwZSggYU51bWVyYXRvciApLAorCQkJSW50ZWdlcjo6UmF3VmFsdWVUeXBlKCBhRGVub21pbmF0b3IgKSApICkKKwl7CisJCXNpbXBsaWYoKTsKKwl9CisKKwkvLyBhdm1faW50ZWdlcl90IC8gc3RkOjpzdHJpbmcgIGkuZS4gIGF2bV9pbnQ2NF90IC8gc3RkOjpzdHJpbmcKKwlSYXRpb25hbChhdm1faW50ZWdlcl90IGFOdW1lcmF0b3IsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYURlbm9taW5hdG9yKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIFJhdGlvbmFsICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIFJhd1ZhbHVlVHlwZSgKKwkJCUludGVnZXI6OlJhd1ZhbHVlVHlwZSggYU51bWVyYXRvciApLAorCQkJSW50ZWdlcjo6UmF3VmFsdWVUeXBlKCBhRGVub21pbmF0b3IgKSApICkKKwl7CisJCXNpbXBsaWYoKTsKKwl9CisKKwkvLyBzdGQ6OnN0cmluZyAvIHN0ZDo6c3RyaW5nCisJUmF0aW9uYWwoY29uc3Qgc3RkOjpzdHJpbmcgJiBhTnVtZXJhdG9yLCBjb25zdCBzdGQ6OnN0cmluZyAmIGFEZW5vbWluYXRvcikKKwk6IE51bWJlciggQ0xBU1NfS0lORF9UKCBSYXRpb25hbCApICksCisJVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoCisJCQlJbnRlZ2VyOjpSYXdWYWx1ZVR5cGUoYU51bWVyYXRvciksCisJCQlJbnRlZ2VyOjpSYXdWYWx1ZVR5cGUoYURlbm9taW5hdG9yKSApICkKKwl7CisJCXNpbXBsaWYoKTsKKwl9CisKKwkvLyBJbnRlZ2VyCisJUmF0aW9uYWwoY29uc3QgSW50ZWdlciAmIGFOdW1lcmF0b3IpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggUmF0aW9uYWwgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKCBhTnVtZXJhdG9yLmdldFZhbHVlKCkgKSApCisJeworCQlzaW1wbGlmKCk7CisJfQorCisJLy8gSW50ZWdlcjo6UmF3VmFsdWVUeXBlIGkuZSBib29zdDo6bXVsdGlwcmVjaXNpb246OmNwcF9pbnQKKwlSYXRpb25hbChjb25zdCBJbnRlZ2VyOjpSYXdWYWx1ZVR5cGUgJiBhTnVtZXJhdG9yKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIFJhdGlvbmFsICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIFJhd1ZhbHVlVHlwZShhTnVtZXJhdG9yKSApCisJeworCQlzaW1wbGlmKCk7CisJfQorCisJLy8gYXZtX2ludGVnZXJfdCBpLmUuIGF2bV9pbnQ2NF90CisJUmF0aW9uYWwoYXZtX2ludGVnZXJfdCBhTnVtZXJhdG9yKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIFJhdGlvbmFsICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIFJhd1ZhbHVlVHlwZSggSW50ZWdlcjo6UmF3VmFsdWVUeXBlKCBhTnVtZXJhdG9yICkgKSApCisJeworCQlzaW1wbGlmKCk7CisJfQorCisJLy8gYXZtX3VpbnRlZ2VyX3QgaS5lLiBhdm1fdWludDY0X3QKKwlSYXRpb25hbChhdm1fdWludGVnZXJfdCBhTnVtZXJhdG9yKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIFJhdGlvbmFsICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIFJhd1ZhbHVlVHlwZSggSW50ZWdlcjo6UmF3VmFsdWVUeXBlKCBhTnVtZXJhdG9yICkgKSApCisJeworCQlzaW1wbGlmKCk7CisJfQorCisjaWZkZWYgX0FWTV9ORUVEX0lOVDY0X1RfT1ZFUkxPQURTXworCisJLy8gbG9uZworCVJhdGlvbmFsKGxvbmcgYU51bWVyYXRvcikKKwk6IE51bWJlciggQ0xBU1NfS0lORF9UKCBSYXRpb25hbCApICksCisJVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoIEludGVnZXI6OlJhd1ZhbHVlVHlwZShhTnVtZXJhdG9yKSApICkKKwl7CisJCXNpbXBsaWYoKTsKKwl9CisKKwkvLyB1bnNpZ25lZCBsb25nCisJUmF0aW9uYWwodW5zaWduZWQgbG9uZyBhTnVtZXJhdG9yKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIFJhdGlvbmFsICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIFJhd1ZhbHVlVHlwZSggSW50ZWdlcjo6UmF3VmFsdWVUeXBlKGFOdW1lcmF0b3IpICkgKQorCXsKKwkJc2ltcGxpZigpOworCX0KKworI2VuZGlmIC8qIF9BVk1fTkVFRF9JTlQ2NF9UX09WRVJMT0FEU18gKi8KKworCS8vIGludDMyX3QKKwlSYXRpb25hbChpbnQgYU51bWVyYXRvcikKKwk6IE51bWJlciggQ0xBU1NfS0lORF9UKCBSYXRpb25hbCApICksCisJVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoIEludGVnZXI6OlJhd1ZhbHVlVHlwZShhTnVtZXJhdG9yKSApICkKKwl7CisJCXNpbXBsaWYoKTsKKwl9CisKKwkvLyB1aW50MzJfdAorCVJhdGlvbmFsKHVuc2lnbmVkIGludCBhTnVtZXJhdG9yKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIFJhdGlvbmFsICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIFJhd1ZhbHVlVHlwZSggSW50ZWdlcjo6UmF3VmFsdWVUeXBlKGFOdW1lcmF0b3IpICkgKQorCXsKKwkJc2ltcGxpZigpOworCX0KKworCS8vIHN0ZDo6c3RyaW5nCisJUmF0aW9uYWwoY29uc3Qgc3RkOjpzdHJpbmcgJiBhUmF0aW9uYWwpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggUmF0aW9uYWwgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKCApICkKKwl7CisJCWZyb21TdHJpbmcoVGhpc051bWJlckNsYXNzOjptVmFsdWUsIGFSYXRpb25hbCk7CisKKwkJc2ltcGxpZigpOworCX0KKworCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJUmF0aW9uYWwoY29uc3QgUmF0aW9uYWwgJiBhUmF0aW9uYWwpCisJOiBOdW1iZXIoIGFSYXRpb25hbCApLAorCVRoaXNOdW1iZXJDbGFzcyggYVJhdGlvbmFsICkKKwl7CisJCXNpbXBsaWYoKTsKKwl9CisKKworCWlubGluZSBzdGF0aWMgdm9pZCBmcm9tU3RyaW5nKFJhd1ZhbHVlVHlwZSAmIHJvcCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhVmFsdWUpCisJeworCQlzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IGFWYWx1ZS5maW5kKCcvJyk7CisJCWlmKCBwb3MgIT0gc3RkOjpzdHJpbmc6Om5wb3MpCisJCXsKKwkJCXJvcCA9IFJhd1ZhbHVlVHlwZSggYVZhbHVlICk7CisJCX0KKwkJZWxzZSBpZiggKHBvcyA9IGFWYWx1ZS5maW5kKCcuJykpICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKwkJeworCQkJSW50ZWdlciBhTnVtZXIoIHN0ZDo6c3RyaW5nKGFWYWx1ZSkuZXJhc2UocG9zLCAxKSApOworCisJCQlJbnRlZ2VyIGFEZW5vbSA9IEludGVnZXI6OnBvdygxMCwgYVZhbHVlLnNpemUoKSAtIChwb3MgKyAxKSk7CisKKwkJCXJvcCA9IFJhd1ZhbHVlVHlwZSggYU51bWVyLmdldFZhbHVlKCksIGFEZW5vbS5nZXRWYWx1ZSgpICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyb3AgPSBSYXdWYWx1ZVR5cGUoIGFWYWx1ZSApOworCQl9CisJfQorCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+UmF0aW9uYWwoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZQorCSAqLworCWJvb2wgc2ltcGxpZigpCisJeworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlCisJICovCisJaW5saW5lIEludGVnZXIgZ2V0TnVtZXJhdG9yKCkgY29uc3QKKwl7CisJCXJldHVybiggSW50ZWdlciggYm9vc3Q6Om11bHRpcHJlY2lzaW9uOjpudW1lcmF0b3IoCisJCQkJVGhpc051bWJlckNsYXNzOjptVmFsdWUgKSApICk7CisJfQorCisJaW5saW5lIEludGVnZXIgZ2V0RGVub21pbmF0b3IoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBJbnRlZ2VyKCBib29zdDo6bXVsdGlwcmVjaXNpb246OmRlbm9taW5hdG9yKAorCQkJCVRoaXNOdW1iZXJDbGFzczo6bVZhbHVlICkgKSApOworCX0KKworCisJaW5saW5lIEludGVnZXI6OlJhd1ZhbHVlVHlwZSByYXdOdW1lcmF0b3IoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBib29zdDo6bXVsdGlwcmVjaXNpb246Om51bWVyYXRvcigKKwkJCQlUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSApICk7CisJfQorCisJaW5saW5lIEludGVnZXI6OlJhd1ZhbHVlVHlwZSByYXdEZW5vbWluYXRvcigpIGNvbnN0CisJeworCQlyZXR1cm4oIGJvb3N0OjptdWx0aXByZWNpc2lvbjo6ZGVub21pbmF0b3IoCisJCQkJVGhpc051bWJlckNsYXNzOjptVmFsdWUgKSApOworCX0KKworCisJaW5saW5lIHZvaWQgc2V0VmFsdWUoYXZtX2ludGVnZXJfdCBhTnVtZXJhdG9yLCBhdm1faW50ZWdlcl90IGFEZW5vbWluYXRvcikKKwl7CisJCVRoaXNOdW1iZXJDbGFzczo6bVZhbHVlID0gUmF3VmFsdWVUeXBlKAorCQkJCUludGVnZXI6OlJhd1ZhbHVlVHlwZSggYU51bWVyYXRvciApLAorCQkJCUludGVnZXI6OlJhd1ZhbHVlVHlwZSggYURlbm9taW5hdG9yICkgKTsKKwl9CisKKworCWlubGluZSB2b2lkIHNldFZhbHVlKGF2bV9pbnRlZ2VyX3QgYVZhbHVlKQorCXsKKwkJVGhpc051bWJlckNsYXNzOjptVmFsdWUgPSBSYXdWYWx1ZVR5cGUoIEludGVnZXIoYVZhbHVlKS5nZXRWYWx1ZSgpICk7CisJfQorCisKKwkvKioKKwkgKiBCQVNJQ1MgVEVTVFMKKwkgKi8KKwl2aXJ0dWFsIGlubGluZSBpbnQgc2lnbigpIGNvbnN0CisJeworCQlyZXR1cm4oIFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLnNpZ24oKSApOworCX0KKworCXZpcnR1YWwgaW5saW5lIGJvb2wgaXNaZXJvKCkgY29uc3QKKwl7CisJCXJldHVybiggVGhpc051bWJlckNsYXNzOjptVmFsdWUuaXNfemVybygpICk7CisJfQorCisJdmlydHVhbCBpbmxpbmUgYm9vbCBpc09uZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlID09IDEgKTsKKwl9CisKKwl2aXJ0dWFsIGlubGluZSBib29sIGlzTmVnYXRpdmVPbmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSA9PSAtMSApOworCX0KKworCisJLyoqCisJICogQ09OVkVSU0lPTgorCSAqLworI2RlZmluZSBDUFBfUkFUX0lTX0lOVEVHRVIoUkFUX05VTV9JTlQsIFJBVF9ERU5fSU5ULCBJTlRfVCkgIFwKKwkoIFJBVF9ERU5fSU5UID09IDEgKSAgXAorCSYmICggUkFUX05VTV9JTlQgPT0gUkFUX05VTV9JTlQuY29udmVydF90bzwgSU5UX1QgPigpICkKKy8vCSYmIGJvb3N0OjptdWx0aXByZWNpc2lvbjo6ZGVmYXVsdF9vcHM6OmNoZWNrX2luX3JhbmdlPCBJTlRfVCA+KCBSQVRfTlVNX0lOVCApCisKKyNkZWZpbmUgQ1BQX1JBVF9JU19QT1NJVElWRV9JTlRFR0VSKFJBVF9OVU1fSU5ULCBSQVRfREVOX0lOVCwgSU5UX1QpICBcCisJKCBSQVRfTlVNX0lOVC5zaWduKCkgPj0gMCApICBcCisJJiYgKCBSQVRfREVOX0lOVCA9PSAxICkgIFwKKwkmJiAoIFJBVF9OVU1fSU5UID09IFJBVF9OVU1fSU5ULmNvbnZlcnRfdG88IElOVF9UID4oKSApCisvLwkmJiBib29zdDo6bXVsdGlwcmVjaXNpb246OmRlZmF1bHRfb3BzOjpjaGVja19pbl9yYW5nZTwgSU5UX1QgPiggUkFUX05VTV9JTlQgKQorCisKKwlpbmxpbmUgdmlydHVhbCBib29sIGlzSW50MzIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBDUFBfUkFUX0lTX0lOVEVHRVIoCisJCQkJcmF3TnVtZXJhdG9yKCksIHJhd0Rlbm9taW5hdG9yKCksIGF2bV9pbnQzMl90KSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGF2bV9pbnQzMl90IHRvSW50MzIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZS5jb252ZXJ0X3RvPCBhdm1faW50MzJfdCA+KCkgKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIGJvb2wgaXNJbnQ2NCgpIGNvbnN0CisJeworCQlyZXR1cm4oIENQUF9SQVRfSVNfSU5URUdFUigKKwkJCQlyYXdOdW1lcmF0b3IoKSwgcmF3RGVub21pbmF0b3IoKSwgYXZtX2ludDY0X3QpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgYXZtX2ludDY0X3QgdG9JbnQ2NCgpIGNvbnN0CisJeworCQlyZXR1cm4oIFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLmNvbnZlcnRfdG88IGF2bV9pbnQ2NF90ID4oKSApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgYm9vbCBpc0ludGVnZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBDUFBfUkFUX0lTX0lOVEVHRVIoCisJCQkJcmF3TnVtZXJhdG9yKCksIHJhd0Rlbm9taW5hdG9yKCksIGF2bV9pbnRlZ2VyX3QpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgYXZtX2ludGVnZXJfdCB0b0ludGVnZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZS5jb252ZXJ0X3RvPCBhdm1faW50ZWdlcl90ID4oKSApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgYm9vbCBpc1Bvc0ludGVnZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBDUFBfUkFUX0lTX1BPU0lUSVZFX0lOVEVHRVIoCisJCQkJcmF3TnVtZXJhdG9yKCksIHJhd0Rlbm9taW5hdG9yKCksIGF2bV91aW50ZWdlcl90KSApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgYm9vbCBpc1VJbnRlZ2VyKCkgY29uc3QKKwl7CisJCXJldHVybiggQ1BQX1JBVF9JU19QT1NJVElWRV9JTlRFR0VSKAorCQkJCXJhd051bWVyYXRvcigpLCByYXdEZW5vbWluYXRvcigpLCBhdm1fdWludGVnZXJfdCkgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBhdm1fdWludGVnZXJfdCB0b1VJbnRlZ2VyKCkgY29uc3QKKwl7CisJCXJldHVybiggVGhpc051bWJlckNsYXNzOjptVmFsdWUuY29udmVydF90bzwgYXZtX3VpbnRlZ2VyX3QgPigpICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBib29sIGlzUmF0aW9uYWwoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBpc0ludGVnZXIoKSApOworCX0KKworCXZpcnR1YWwgYXZtX2ludGVnZXJfdCB0b051bWVyYXRvcigpIGNvbnN0CisJeworCQlyZXR1cm4oIFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLmNvbnZlcnRfdG88IGF2bV9pbnRlZ2VyX3QgPigpICk7CisJfQorCisJdmlydHVhbCBhdm1faW50ZWdlcl90IHRvRGVub21pbmF0b3IoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBzdGF0aWNfY2FzdDwgYXZtX2ludGVnZXJfdCA+KCAxICkgKTsKKwl9CisKKworI2RlZmluZSBDUFBfSU5UX0lTX0ZMT0FUKENQUF9JTlQsIEZMT0FUX1QpICBcCisJYm9vc3Q6Om11bHRpcHJlY2lzaW9uOjpkZWZhdWx0X29wczo6Y2hlY2tfaW5fcmFuZ2U8IEZMT0FUX1QgPiggIFwKKwlDUFBfSU5ULmNvbnZlcnRfdG88IGJvb3N0OjptdWx0aXByZWNpc2lvbjo6Y3BwX2RlY19mbG9hdDwwPiA+KCkgKQorLy8JKCBDUFBfSU5UID09IENQUF9JTlQuY29udmVydF90bzwgRkxPQVRfVCA+KCkgKQorCisKKwlpbmxpbmUgdmlydHVhbCBib29sIGlzRmxvYXQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBmYWxzZSApOworLy8JCXJldHVybiggQ1BQX0lOVF9JU19GTE9BVChUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSwgYXZtX2Zsb2F0X3QpICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBhdm1fZmxvYXRfdCB0b0Zsb2F0KCkgY29uc3QKKwl7CisJCXJldHVybiggVGhpc051bWJlckNsYXNzOjptVmFsdWUuY29udmVydF90bzwgYXZtX2Zsb2F0X3QgPigpICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBib29sIGlzUmVhbCgpIGNvbnN0CisJeworCQlyZXR1cm4oIGZhbHNlICk7CisvLwkJcmV0dXJuKCBDUFBfSU5UX0lTX0ZMT0FUKFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLCBhdm1fcmVhbF90KSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGF2bV9yZWFsX3QgdG9SZWFsKCkgY29uc3QKKwl7CisJCXJldHVybiggVGhpc051bWJlckNsYXNzOjptVmFsdWUuY29udmVydF90bzwgYXZtX3JlYWxfdCA+KCkgKTsKKwl9CisKKworCS8qKgorCSAqIG1hdGggZnVuY3Rpb24KKwkgKi8KKwlpbmxpbmUgdm9pZCBzZXRfcG93KGF2bV91aW50ZWdlcl90IGFuRXhwb25lbnQpCisJeworCQlJbnRlZ2VyOjpSYXdWYWx1ZVR5cGUgbnVtID0gYm9vc3Q6Om11bHRpcHJlY2lzaW9uOjpwb3coCisJCQkJYm9vc3Q6Om11bHRpcHJlY2lzaW9uOjpudW1lcmF0b3IoVGhpc051bWJlckNsYXNzOjptVmFsdWUpLAorCQkJCWFuRXhwb25lbnQpOworCisJCUludGVnZXI6OlJhd1ZhbHVlVHlwZSBkZW4gPSBib29zdDo6bXVsdGlwcmVjaXNpb246OnBvdygKKwkJCQlib29zdDo6bXVsdGlwcmVjaXNpb246OmRlbm9taW5hdG9yKFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlKSwKKwkJCQlhbkV4cG9uZW50KTsKKworCQlUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSA9IGJvb3N0OjptdWx0aXByZWNpc2lvbjo6Y3BwX3JhdGlvbmFsKG51bSwgZGVuKTsKKwl9CisKKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwlpbmxpbmUgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCW9zIDw8IFRBQiA8PCBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZTsKKwkJQVZNX0RFQlVHX1JFRl9DT1VOVEVSKG9zKTsKKwkJb3MgPDwgRU9MX0ZMVVNIOworCX0KKworCXZpcnR1YWwgc3RkOjpzdHJpbmcgc3RyKCkgY29uc3QKKwl7CisJCWlmKCByYXdEZW5vbWluYXRvcigpICE9IDEgKQorCQl7CisJCQlyZXR1cm4oIE9TUygpIDw8IHJhd051bWVyYXRvcigpIDw8ICcvJyA8PCByYXdEZW5vbWluYXRvcigpICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4oIE9TUygpIDw8IHJhd051bWVyYXRvcigpICk7CisJCX0KKwl9CisKKwlpbmxpbmUgdmlydHVhbCBzdGQ6OnN0cmluZyBzdHJOdW0oCisJCQlhdm1fdWludDhfdCBwcmVjaXNpb24gPSBBVk1fTVVNRVJJQ19QUkVDSVNJT04pIGNvbnN0CisJeworCQlpZiggcmF3RGVub21pbmF0b3IoKSAhPSAxICkKKwkJeworCQkJcmV0dXJuKCBPU1MoKSA8PCByYXdOdW1lcmF0b3IoKSA8PCAnLycgPDwgcmF3RGVub21pbmF0b3IoKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuKCBPU1MoKSA8PCByYXdOdW1lcmF0b3IoKSApOworCQl9CisJfQorCisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgc3RyTnVtZXJhdG9yKAorCQkJYXZtX3VpbnQ4X3QgcHJlY2lzaW9uID0gQVZNX01VTUVSSUNfUFJFQ0lTSU9OKSBjb25zdAorCXsKKwkJcmV0dXJuKCBPU1MoKSA8PCByYXdOdW1lcmF0b3IoKSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHN0ckRlbm9taW5hdG9yKAorCQkJYXZtX3VpbnQ4X3QgcHJlY2lzaW9uID0gQVZNX01VTUVSSUNfUFJFQ0lTSU9OKSBjb25zdAorCXsKKwkJcmV0dXJuKCBPU1MoKSA8PCByYXdEZW5vbWluYXRvcigpICk7CisJfQorCit9OworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworCisjZW5kaWYgLyogRk1MX05VTUVSSUNfQk9PU1RfUkFUSU9OQUxJTVBMX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbnVtZXJpYy9nbXAvRmxvYXRJbXBsLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbnVtZXJpYy9nbXAvRmxvYXRJbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc4NmZlOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9udW1lcmljL2dtcC9GbG9hdEltcGwuaApAQCAtMCwwICsxLDQwNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDEwIG1haSAyMDE2CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgSW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRk1MX05VTUVSSUNfR01QX0ZMT0FUSU1QTF9IXworI2RlZmluZSBGTUxfTlVNRVJJQ19HTVBfRkxPQVRJTVBMX0hfCisKKyNpbmNsdWRlIDxnbXB4eC5oPgorCisjaW5jbHVkZSA8Zm1sL251bWVyaWMvTnVtYmVyLmg+CisKKyNpbmNsdWRlIDxmbWwvbnVtZXJpYy9JbnRlZ2VyLmg+CisjaW5jbHVkZSA8Zm1sL251bWVyaWMvUmF0aW9uYWwuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworY2xhc3MgRmxvYXQgOgorCQlwdWJsaWMgTnVtYmVyLAorCQlwdWJsaWMgR2VuZXJpY051bWJlckNsYXNzPCBtcGZfY2xhc3MgLCBGbG9hdCA+Cit7CisKKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggRmxvYXQgKQorCisKKwkvKioKKwkgKiBUWVBFREVGCisJICovCitwdWJsaWM6CisJdHlwZWRlZiAgbXBmX2NsYXNzICBSYXdWYWx1ZVR5cGU7CisKK3ByaXZhdGU6CisJdHlwZWRlZiAgR2VuZXJpY051bWJlckNsYXNzPCBSYXdWYWx1ZVR5cGUgLCBGbG9hdCA+ICBUaGlzTnVtYmVyQ2xhc3M7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCS8vIFJhd1ZhbHVlVHlwZQorCUZsb2F0KGNvbnN0IFJhd1ZhbHVlVHlwZSAmIGFWYWx1ZSkKKwk6IE51bWJlciggQ0xBU1NfS0lORF9UKCBGbG9hdCApICksCisJVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoIGFWYWx1ZSApICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8vIG1wcV9jbGFzcworCUZsb2F0KGNvbnN0IG1wcV9jbGFzcyAmIGFWYWx1ZSkKKwk6IE51bWJlciggQ0xBU1NfS0lORF9UKCBGbG9hdCApICksCisJVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoIGFWYWx1ZSApICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8vIG1wcV90CisJRmxvYXQoY29uc3QgbXBxX3QgJiBhVmFsdWUpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggRmxvYXQgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKCBtcHFfY2xhc3MoYVZhbHVlKSApICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLy8gbXB6X2NsYXNzCisJRmxvYXQoY29uc3QgbXB6X2NsYXNzICYgYVZhbHVlKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIEZsb2F0ICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIFJhd1ZhbHVlVHlwZShhVmFsdWUpICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8vIG1wel90CisJRmxvYXQoY29uc3QgbXB6X3QgJiBhVmFsdWUpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggRmxvYXQgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKCBtcHpfY2xhc3MoYVZhbHVlKSApICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8vIFJhdGlvbmFsCisJRmxvYXQoY29uc3QgUmF0aW9uYWwgJiBhUmF0aW9uYWwpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggRmxvYXQgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKCBhUmF0aW9uYWwuZ2V0VmFsdWUoKSApICkKKwkvL1RoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKCBzdGF0aWNfY2FzdDxzZXA6OkJhc2ljUmF0aW9uYWw+KGFSYXRpb25hbCkuZ2V0VmFsdWUoKSApICkKKwkvL1RoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKCByZWludGVycHJldF9jYXN0PF9fZ21wX2V4cHI+KGFSYXRpb25hbCkuZ2V0VmFsdWUoKSApICkKKwkvL1RoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKCByZWludGVycHJldF9jYXN0PEdlbmVyaWNOdW1iZXJDbGFzcz4oYVJhdGlvbmFsKS5nZXRWYWx1ZSgpICkgKQorCS8vVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoIHJlaW50ZXJwcmV0X2Nhc3Q8R2VuZXJpY051bWJlckNsYXNzPG1wcV9jbGFzcyAsIFJhdGlvbmFsPj4oYVJhdGlvbmFsKS5nZXRWYWx1ZSgpICkgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLy8gSW50ZWdlcgorCUZsb2F0KGNvbnN0IEludGVnZXIgJiBhbkludGVnZXIpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggRmxvYXQgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKCBhbkludGVnZXIuZ2V0VmFsdWUoKSApICkKKwkvL1RoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKCByZWludGVycHJldF9jYXN0PEdlbmVyaWNOdW1iZXJDbGFzcz4oYW5JbnRlZ2VyKS5nZXRWYWx1ZSgpICkgKQorCS8vVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoIHJlaW50ZXJwcmV0X2Nhc3Q8R2VuZXJpY051bWJlckNsYXNzPG1wel9jbGFzcyAsIEludGVnZXI+PihhbkludGVnZXIpLmdldFZhbHVlKCkgKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvLyBhdm1fZmxvYXRfdAorCUZsb2F0KGF2bV9mbG9hdF90IGFWYWx1ZSkKKwk6IE51bWJlciggQ0xBU1NfS0lORF9UKCBGbG9hdCApICksCisJVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoYVZhbHVlKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKyNpZmRlZiBfQVZNX05FRURfSU5UNjRfVF9PVkVSTE9BRFNfCisKKwkvLyBhdm1faW50ZWdlcl90ICBpLmUuICBhdm1faW50NjRfdAorCUZsb2F0KGF2bV9pbnRlZ2VyX3QgYVZhbHVlKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIEZsb2F0ICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIFJhd1ZhbHVlVHlwZSggc3RhdGljX2Nhc3Q8IGxvbmcgPihhVmFsdWUpICkgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLy8gYXZtX3VpbnRlZ2VyX3QgIGkuZS4gIGF2bV91aW50NjRfdAorCUZsb2F0KGF2bV91aW50ZWdlcl90IGFWYWx1ZSkKKwk6IE51bWJlciggQ0xBU1NfS0lORF9UKCBGbG9hdCApICksCisJVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoIHN0YXRpY19jYXN0PCB1bnNpZ25lZCBsb25nID4oYVZhbHVlKSApICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8vIGxvbmcKKwlGbG9hdChsb25nIGFWYWx1ZSkKKwk6IE51bWJlciggQ0xBU1NfS0lORF9UKCBGbG9hdCApICksCisJVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoIGFWYWx1ZSApICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCUZsb2F0KHVuc2lnbmVkIGxvbmcgYVZhbHVlKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIEZsb2F0ICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIFJhd1ZhbHVlVHlwZSggYVZhbHVlICkgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisjZWxzZQorCisJLy8gYXZtX2ludGVnZXJfdCAgaS5lLiAgYXZtX2ludDY0X3QKKwlGbG9hdChhdm1faW50ZWdlcl90IGFWYWx1ZSkKKwk6IE51bWJlciggQ0xBU1NfS0lORF9UKCBGbG9hdCApICksCisJVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoYVZhbHVlKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvLyBhdm1fdWludGVnZXJfdCAgaS5lLiAgYXZtX3VpbnQ2NF90CisJRmxvYXQoYXZtX3VpbnRlZ2VyX3QgYVZhbHVlKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIEZsb2F0ICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIFJhd1ZhbHVlVHlwZShhVmFsdWUpICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworI2VuZGlmIC8qIF9BVk1fTkVFRF9JTlQ2NF9UX09WRVJMT0FEU18gKi8KKworCS8vIGludDMyX3QKKwlGbG9hdChpbnQgYVZhbHVlKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIEZsb2F0ICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIFJhd1ZhbHVlVHlwZShhVmFsdWUpICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8vIHVpbnQzMl90CisJRmxvYXQodW5zaWduZWQgaW50IGFWYWx1ZSkKKwk6IE51bWJlciggQ0xBU1NfS0lORF9UKCBGbG9hdCApICksCisJVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoYVZhbHVlKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvLyBzdGQ6OnN0cmluZworCUZsb2F0KGNvbnN0IHN0ZDo6c3RyaW5nICYgYVZhbHVlKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIEZsb2F0ICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIFJhd1ZhbHVlVHlwZShhVmFsdWUpICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCUZsb2F0KGNvbnN0IEZsb2F0ICYgYUZsb2F0KQorCTogTnVtYmVyKCBhRmxvYXQgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIGFGbG9hdCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+RmxvYXQoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBCQVNJQ1MgVEVTVFMKKwkgKi8KKwl2aXJ0dWFsIGlubGluZSBpbnQgc2lnbigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1wZl9zZ24oVGhpc051bWJlckNsYXNzOjptVmFsdWUuZ2V0X21wZl90KCkpICk7CisJfQorCisJdmlydHVhbCBpbmxpbmUgYm9vbCBpc1plcm8oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBzaWduKCkgPT0gMCApOworCX0KKworCXZpcnR1YWwgaW5saW5lIGJvb2wgaXNPbmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtcGZfY21wX3NpKFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLmdldF9tcGZfdCgpLCAxKSA9PSAwICk7CisJfQorCisJdmlydHVhbCBpbmxpbmUgYm9vbCBpc05lZ2F0aXZlT25lKCkgY29uc3QKKwl7CisJCXJldHVybiggbXBmX2NtcF9zaShUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZS5nZXRfbXBmX3QoKSwgLTEpID09IDAgKTsKKwl9CisKKworCS8qKgorCSAqIENPTlZFUlNJT04KKwkgKi8KKyNkZWZpbmUgTVBGX0lTX0lOVEVHRVIoTVBGX1ZBTCwgSU5GLCBTVVApICAgICAgICAgICAgICAgICAgICAgICAgXAorCShtcGZfY21wX3NpKE1QRl9WQUwuZ2V0X21wZl90KCksIE1QRl9WQUwuZ2V0X3NpKCkpID09IDApICYmICBcCisJKG1wZl9jbXBfc2koTVBGX1ZBTC5nZXRfbXBmX3QoKSwgSU5GKSA+PSAwKSAmJiAgICAgICAgICAgICAgIFwKKwkobXBmX2NtcF91aShNUEZfVkFMLmdldF9tcGZfdCgpLCBTVVApIDw9IDApCisKKyNkZWZpbmUgTVBGX0lTX1BPU0lUSVZFX0lOVEVHRVIoTVBGX1ZBTCwgU1VQKSAgKHNpZ24oKSA+PSAwKSAmJiAgXAorCShtcGZfY21wX3VpKE1QRl9WQUwuZ2V0X21wZl90KCksIE1QRl9WQUwuZ2V0X3VpKCkpID09IDApICYmICBcCisJKG1wZl9jbXBfdWkoTVBGX1ZBTC5nZXRfbXBmX3QoKSwgU1VQKSA8PSAwKQorCisKKwlpbmxpbmUgdmlydHVhbCBib29sIGlzSW50MzIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBNUEZfSVNfSU5URUdFUihUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSwKKwkJCQlBVk1fTlVNRVJJQ19NSU5fSU5UMzIsIEFWTV9OVU1FUklDX01BWF9JTlQzMikgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBhdm1faW50MzJfdCB0b0ludDMyKCkgY29uc3QKKwl7CisJCXJldHVybiggc3RhdGljX2Nhc3Q8IGF2bV9pbnQzMl90ID4oCisJCQkJVGhpc051bWJlckNsYXNzOjptVmFsdWUuZ2V0X3NpKCkgKSApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgYm9vbCBpc0ludDY0KCkgY29uc3QKKwl7CisJCXJldHVybiggTVBGX0lTX0lOVEVHRVIoVGhpc051bWJlckNsYXNzOjptVmFsdWUsCisJCQkJQVZNX05VTUVSSUNfTUlOX0lOVDY0LCBBVk1fTlVNRVJJQ19NQVhfSU5UNjQpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgYXZtX2ludDY0X3QgdG9JbnQ2NCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHN0YXRpY19jYXN0PCBhdm1faW50NjRfdCA+KAorCQkJCVRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLmdldF9zaSgpICkgKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIGJvb2wgaXNJbnRlZ2VyKCkgY29uc3QKKwl7CisJCXJldHVybiggTVBGX0lTX0lOVEVHRVIoVGhpc051bWJlckNsYXNzOjptVmFsdWUsCisJCQkJQVZNX05VTUVSSUNfTUlOX0lOVEVHRVIsIEFWTV9OVU1FUklDX01BWF9JTlRFR0VSKSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGF2bV9pbnRlZ2VyX3QgdG9JbnRlZ2VyKCkgY29uc3QKKwl7CisJCXJldHVybiggc3RhdGljX2Nhc3Q8IGF2bV9pbnRlZ2VyX3QgPigKKwkJCQlUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZS5nZXRfc2koKSApICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBib29sIGlzUG9zSW50ZWdlcigpIGNvbnN0CisJeworCQlyZXR1cm4oIE1QRl9JU19QT1NJVElWRV9JTlRFR0VSKAorCQkJCVRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLCBBVk1fTlVNRVJJQ19NQVhfVUlOVEVHRVIpICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBib29sIGlzVUludGVnZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBNUEZfSVNfUE9TSVRJVkVfSU5URUdFUigKKwkJCQlUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSwgQVZNX05VTUVSSUNfTUFYX1VJTlRFR0VSKSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGF2bV91aW50ZWdlcl90IHRvVUludGVnZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBzdGF0aWNfY2FzdDwgYXZtX3VpbnRlZ2VyX3QgPigKKwkJCQlUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZS5nZXRfdWkoKSApICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBib29sIGlzUmF0aW9uYWwoKSBjb25zdAorCXsKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisJdmlydHVhbCBhdm1faW50ZWdlcl90IHRvRGVub21pbmF0b3IoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBzdGF0aWNfY2FzdDwgYXZtX2ludGVnZXJfdCA+KAorCQkJCW1wcV9jbGFzcyhUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSkuZ2V0X2RlbigpLmdldF9zaSgpICkgKTsKKwl9CisKKwl2aXJ0dWFsIGF2bV9pbnRlZ2VyX3QgdG9OdW1lcmF0b3IoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBzdGF0aWNfY2FzdDwgYXZtX2ludGVnZXJfdCA+KAorCQkJCW1wcV9jbGFzcyhUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSkuZ2V0X251bSgpLmdldF9zaSgpICkgKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIGJvb2wgaXNGbG9hdCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBhdm1fZmxvYXRfdCB0b0Zsb2F0KCkgY29uc3QKKwl7CisJCXJldHVybiggc3RhdGljX2Nhc3Q8IGF2bV9mbG9hdF90ID4oCisJCQkJVGhpc051bWJlckNsYXNzOjptVmFsdWUuZ2V0X2QoKSApICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBib29sIGlzUmVhbCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBhdm1fcmVhbF90IHRvUmVhbCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHN0YXRpY19jYXN0PCBhdm1fcmVhbF90ID4oCisJCQkJVGhpc051bWJlckNsYXNzOjptVmFsdWUuZ2V0X2QoKSApICk7CisJfQorCisKKwkvKioKKwkgKiBtYXRoIGZ1bmN0aW9uCisJICovCisJaW5saW5lIHZvaWQgc2V0X3Bvdyhhdm1fdWludGVnZXJfdCBhbkV4cG9uZW50KQorCXsKKwkJUmF3VmFsdWVUeXBlIG1wUmVzdWx0OworCisJCW1wZl9wb3dfdWkoIG1wUmVzdWx0LmdldF9tcGZfdCgpLAorCQkJCVRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLmdldF9tcGZfdCgpLCBhbkV4cG9uZW50ICk7CisKKwkJVGhpc051bWJlckNsYXNzOjptVmFsdWUgPSBtcFJlc3VsdDsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRfcG93KGRvdWJsZSBhVmFsdWUsIGF2bV91aW50ZWdlcl90IGFuRXhwb25lbnQpCisJeworCQltcGZfcG93X3VpKCBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZS5nZXRfbXBmX3QoKSwKKwkJCQlSYXdWYWx1ZVR5cGUoYVZhbHVlKS5nZXRfbXBmX3QoKSwgYW5FeHBvbmVudCApOworCX0KKworCisJLyoqCisJICogU2VyaWFsaXphdGlvbgorCSAqLworCXZpcnR1YWwgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCW9zIDw8IFRBQiA8PCBPU19GTE9BVF9QUkVDSVNJT04gPDwgbVZhbHVlOworCQlBVk1fREVCVUdfUkVGX0NPVU5URVIob3MpOworCQlvcyA8PCBFT0xfRkxVU0g7CisJfQorCisJdmlydHVhbCBzdGQ6OnN0cmluZyBzdHIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBPU1MoKSAvKjw8IE9TX1JFQUxfUFJFQ0lTSU9OKi8gPDwgbVZhbHVlICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgc3RyTnVtKAorCQkJYXZtX3VpbnQ4X3QgcHJlY2lzaW9uID0gQVZNX01VTUVSSUNfUFJFQ0lTSU9OKSBjb25zdAorCXsKKwkJcmV0dXJuKCBPU1MoKSA8PCBzdGQ6OmZpeGVkCisJCQkJPDwgc3RkOjpzZXRwcmVjaXNpb24oIHByZWNpc2lvbiApIDw8IG1WYWx1ZSApOworCX0KKworfTsKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qIEZNTF9OVU1FUklDX0dNUF9GTE9BVElNUExfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9udW1lcmljL2dtcC9JbnRlZ2VySW1wbC5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL251bWVyaWMvZ21wL0ludGVnZXJJbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg1ZmMyOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9udW1lcmljL2dtcC9JbnRlZ2VySW1wbC5oCkBAIC0wLDAgKzEsMzc1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTAgbWFpIDIwMTYKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBJbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBGTUxfTlVNRVJJQ19HTVBfSU5URUdFUklNUExfSF8KKyNkZWZpbmUgRk1MX05VTUVSSUNfR01QX0lOVEVHRVJJTVBMX0hfCisKKyNpbmNsdWRlIDxnbXB4eC5oPgorCisjaW5jbHVkZSA8Zm1sL251bWVyaWMvTnVtYmVyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIEludGVnZXIgOgorCQlwdWJsaWMgTnVtYmVyLAorCQlwdWJsaWMgR2VuZXJpY051bWJlckNsYXNzPCBtcHpfY2xhc3MgLCBJbnRlZ2VyID4KK3sKKworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBJbnRlZ2VyICkKKworCisJLyoqCisJICogVFlQRURFRgorCSAqLworcHVibGljOgorCXR5cGVkZWYgIG1wel9jbGFzcyAgUmF3VmFsdWVUeXBlOworCitwcml2YXRlOgorCXR5cGVkZWYgIEdlbmVyaWNOdW1iZXJDbGFzczwgUmF3VmFsdWVUeXBlICwgSW50ZWdlciA+ICBUaGlzTnVtYmVyQ2xhc3M7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCS8vIFJhd1ZhbHVlVHlwZSAgaS5lLiAgbXB6X2NsYXNzCisJSW50ZWdlcihjb25zdCBSYXdWYWx1ZVR5cGUgJiBhVmFsdWUpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggSW50ZWdlciApICksCisJVGhpc051bWJlckNsYXNzKCBhVmFsdWUgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLy8gbXB6X3QKKwlJbnRlZ2VyKGNvbnN0IG1wel90ICYgYVZhbHVlKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIEludGVnZXIgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKGFWYWx1ZSkgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKyNpZmRlZiBfQVZNX05FRURfSU5UNjRfVF9PVkVSTE9BRFNfCisKKwkvLyBhdm1faW50ZWdlcl90ICBpLmUuICBhdm1faW50NjRfdAorCUludGVnZXIoYXZtX2ludGVnZXJfdCBhVmFsdWUpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggSW50ZWdlciApICksCisJVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoIHN0YXRpY19jYXN0PCBsb25nID4oIGFWYWx1ZSApICkgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLy8gYXZtX3VpbnRlZ2VyX3QgIGkuZS4gIGF2bV91aW50NjRfdAorCUludGVnZXIoYXZtX3VpbnRlZ2VyX3QgYVZhbHVlKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIEludGVnZXIgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKCBzdGF0aWNfY2FzdDwgdW5zaWduZWQgbG9uZyA+KCBhVmFsdWUgKSApICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8vIGxvbmcKKwlJbnRlZ2VyKGxvbmcgYVZhbHVlKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIEludGVnZXIgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKCBhVmFsdWUgKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlJbnRlZ2VyKHVuc2lnbmVkIGxvbmcgYVZhbHVlKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIEludGVnZXIgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKCBhVmFsdWUgKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKyNlbHNlCisKKwkvLyBhdm1faW50ZWdlcl90ICBpLmUuICBhdm1faW50NjRfdAorCUludGVnZXIoYXZtX2ludGVnZXJfdCBhVmFsdWUpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggSW50ZWdlciApICksCisJVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoYVZhbHVlKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvLyBhdm1fdWludGVnZXJfdCAgaS5lLiAgYXZtX3VpbnQ2NF90CisJSW50ZWdlcihhdm1fdWludGVnZXJfdCBhVmFsdWUpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggSW50ZWdlciApICksCisJVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoYVZhbHVlKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKyNlbmRpZiAvKiBfQVZNX05FRURfSU5UNjRfVF9PVkVSTE9BRFNfICovCisKKwkvLyBpbnQzMl90CisJSW50ZWdlcihpbnQgYVZhbHVlKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIEludGVnZXIgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKGFWYWx1ZSkgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLy8gdWludDMyX3QKKwlJbnRlZ2VyKHVuc2lnbmVkIGludCBhVmFsdWUpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggSW50ZWdlciApICksCisJVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoYVZhbHVlKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvLyBzdGQ6OnN0cmluZworCUludGVnZXIoY29uc3Qgc3RkOjpzdHJpbmcgJiBhVmFsdWUpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggSW50ZWdlciApICksCisJVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoYVZhbHVlKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIENvcHkKKwkgKi8KKwlJbnRlZ2VyKGNvbnN0IEludGVnZXIgJiBhbkludGVnZXIpCisJOiBOdW1iZXIoIGFuSW50ZWdlciApLAorCVRoaXNOdW1iZXJDbGFzcyggYW5JbnRlZ2VyICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkludGVnZXIoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBCQVNJQ1MgVEVTVFMKKwkgKi8KKwl2aXJ0dWFsIGlubGluZSBpbnQgc2lnbigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1wel9zZ24oVGhpc051bWJlckNsYXNzOjptVmFsdWUuZ2V0X21wel90KCkpICk7CisJfQorCisJdmlydHVhbCBpbmxpbmUgYm9vbCBpc1plcm8oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBzaWduKCkgPT0gMCApOworCX0KKworCXZpcnR1YWwgaW5saW5lIGJvb2wgaXNPbmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtcHpfY21wX3NpKFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLmdldF9tcHpfdCgpLCAxKSA9PSAwICk7CisJfQorCisJdmlydHVhbCBpbmxpbmUgYm9vbCBpc05lZ2F0aXZlT25lKCkgY29uc3QKKwl7CisJCXJldHVybiggbXB6X2NtcF9zaShUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZS5nZXRfbXB6X3QoKSwgLTEpID09IDAgKTsKKwl9CisKKworCS8qKgorCSAqIENPTlZFUlNJT04KKwkgKi8KKyNkZWZpbmUgTVBaX0lTX0lOVEVHRVIoTVBaX1ZBTCwgSU5GLCBTVVApICAgICAgICAgICAgICAgICAgICAgICAgXAorCShtcHpfY21wX3NpKE1QWl9WQUwuZ2V0X21wel90KCksIE1QWl9WQUwuZ2V0X3NpKCkpID09IDApICYmICBcCisJKG1wel9jbXBfc2koTVBaX1ZBTC5nZXRfbXB6X3QoKSwgSU5GKSA+PSAwKSAmJiAgICAgICAgICAgICAgIFwKKwkobXB6X2NtcF91aShNUFpfVkFMLmdldF9tcHpfdCgpLCBTVVApIDw9IDApCisKKyNkZWZpbmUgTVBaX0lTX1BPU0lUSVZFX0lOVEVHRVIoTVBaX1ZBTCwgU1VQKSAgXAorCShtcHpfc2duKCBNUFpfVkFMLmdldF9tcHpfdCgpICkgPj0gMCkgJiYgICBcCisJKG1wel9jbXBfdWkoTVBaX1ZBTC5nZXRfbXB6X3QoKSwgTVBaX1ZBTC5nZXRfdWkoKSkgPT0gMCkgJiYgIFwKKwkobXB6X2NtcF91aShNUFpfVkFMLmdldF9tcHpfdCgpLCBTVVApIDw9IDApCisKKworCWlubGluZSB2aXJ0dWFsIGJvb2wgaXNJbnQzMigpIGNvbnN0CisJeworCQlyZXR1cm4oIE1QWl9JU19JTlRFR0VSKFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLAorCQkJCUFWTV9OVU1FUklDX01JTl9JTlQzMiwgQVZNX05VTUVSSUNfTUFYX0lOVDMyKSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGF2bV9pbnQzMl90IHRvSW50MzIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBzdGF0aWNfY2FzdDwgYXZtX2ludDMyX3QgPigKKwkJCQlUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZS5nZXRfc2koKSApICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgYm9vbCBpc0ludDY0KCkgY29uc3QKKwl7CisJCXJldHVybiggTVBaX0lTX0lOVEVHRVIoVGhpc051bWJlckNsYXNzOjptVmFsdWUsCisJCQkJQVZNX05VTUVSSUNfTUlOX0lOVDY0LCBBVk1fTlVNRVJJQ19NQVhfSU5UNjQpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgYXZtX2ludDY0X3QgdG9JbnQ2NCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHN0YXRpY19jYXN0PCBhdm1faW50NjRfdCA+KAorCQkJCVRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLmdldF9zaSgpICkgKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIGJvb2wgaXNJbnRlZ2VyKCkgY29uc3QKKwl7CisJCXJldHVybiggTVBaX0lTX0lOVEVHRVIoVGhpc051bWJlckNsYXNzOjptVmFsdWUsCisJCQkJQVZNX05VTUVSSUNfTUlOX0lOVEVHRVIsIEFWTV9OVU1FUklDX01BWF9JTlRFR0VSKSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGF2bV9pbnRlZ2VyX3QgdG9JbnRlZ2VyKCkgY29uc3QKKwl7CisJCXJldHVybiggc3RhdGljX2Nhc3Q8IGF2bV9pbnRlZ2VyX3QgPigKKwkJCQlUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZS5nZXRfc2koKSApICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBib29sIGlzUG9zSW50ZWdlcigpIGNvbnN0CisJeworCQlyZXR1cm4oIE1QWl9JU19QT1NJVElWRV9JTlRFR0VSKAorCQkJCVRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLCBBVk1fTlVNRVJJQ19NQVhfVUlOVEVHRVIgKSApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgYm9vbCBpc1VJbnRlZ2VyKCkgY29uc3QKKwl7CisJCXJldHVybiggTVBaX0lTX1BPU0lUSVZFX0lOVEVHRVIoCisJCQkJVGhpc051bWJlckNsYXNzOjptVmFsdWUsIEFWTV9OVU1FUklDX01BWF9VSU5URUdFUiApICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgYXZtX3VpbnRlZ2VyX3QgdG9VSW50ZWdlcigpIGNvbnN0CisJeworCQlyZXR1cm4oIHN0YXRpY19jYXN0PCBhdm1fdWludGVnZXJfdCA+KAorCQkJCVRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLmdldF91aSgpICkgKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIGJvb2wgaXNSYXRpb25hbCgpIGNvbnN0CisJeworCQlyZXR1cm4oIGlzSW50ZWdlcigpICk7CisJfQorCisJdmlydHVhbCBhdm1faW50ZWdlcl90IHRvTnVtZXJhdG9yKCkgY29uc3QKKwl7CisJCXJldHVybiggc3RhdGljX2Nhc3Q8IGF2bV9pbnRlZ2VyX3QgPigKKwkJCQlUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZS5nZXRfc2koKSApICk7CisJfQorCisJdmlydHVhbCBhdm1faW50ZWdlcl90IHRvRGVub21pbmF0b3IoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBzdGF0aWNfY2FzdDwgYXZtX2ludGVnZXJfdCA+KCAxICkgKTsKKwl9CisKKworI2RlZmluZSBNUFpfSVNfRkxPQVQoTVBaX1ZBTCwgSU5GLCBTVVApICAgICAgICAgICAgICAgICAgICAgICAgXAorCShtcHpfY21wX2QoTVBaX1ZBTC5nZXRfbXB6X3QoKSwgTVBaX1ZBTC5nZXRfZCgpKSA9PSAwKSAmJiAgXAorCShtcHpfY21wX2QoTVBaX1ZBTC5nZXRfbXB6X3QoKSwgSU5GKSA+PSAwKSAmJiAgICAgICAgICAgICAgXAorCShtcHpfY21wX2QoTVBaX1ZBTC5nZXRfbXB6X3QoKSwgU1VQKSA8PSAwKQorCisKKwlpbmxpbmUgdmlydHVhbCBib29sIGlzRmxvYXQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBNUFpfSVNfSU5URUdFUihUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSwKKwkJCQlBVk1fTlVNRVJJQ19NSU5fRkxPQVRfVCwgQVZNX05VTUVSSUNfTUFYX0ZMT0FUX1QpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgYXZtX2Zsb2F0X3QgdG9GbG9hdCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHN0YXRpY19jYXN0PCBhdm1fZmxvYXRfdCA+KAorCQkJCVRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLmdldF9kKCkgKSApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgYm9vbCBpc1JlYWwoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBNUFpfSVNfSU5URUdFUihUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSwKKwkJCQlBVk1fTlVNRVJJQ19NSU5fUkVBTF9ULCBBVk1fTlVNRVJJQ19NQVhfUkVBTF9UKSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGF2bV9yZWFsX3QgdG9SZWFsKCkgY29uc3QKKwl7CisJCXJldHVybiggc3RhdGljX2Nhc3Q8IGF2bV9yZWFsX3QgPigKKwkJCQlUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZS5nZXRfZCgpICkgKTsKKwl9CisKKworCS8qKgorCSAqIG1hdGggZnVuY3Rpb24KKwkgKi8KKwlpbmxpbmUgdm9pZCBzZXRfcG93KGF2bV91aW50ZWdlcl90IGFuRXhwb25lbnQpCisJeworCQlSYXdWYWx1ZVR5cGUgbXBSZXN1bHQ7CisKKwkJbXB6X3Bvd191aSggbXBSZXN1bHQuZ2V0X21wel90KCksCisJCQkJVGhpc051bWJlckNsYXNzOjptVmFsdWUuZ2V0X21wel90KCksIGFuRXhwb25lbnQgKTsKKworCQlUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSA9IG1wUmVzdWx0OworCX0KKworCWlubGluZSB2b2lkIHNldF9wb3coYXZtX3VpbnRlZ2VyX3QgYVZhbHVlLCBhdm1fdWludGVnZXJfdCBhbkV4cG9uZW50KQorCXsKKwkJbXB6X3VpX3Bvd191aSggVGhpc051bWJlckNsYXNzOjptVmFsdWUuZ2V0X21wel90KCksIGFWYWx1ZSwgYW5FeHBvbmVudCApOworCX0KKworCisJaW5saW5lIEludGVnZXIgcG93KGF2bV91aW50ZWdlcl90IGFuRXhwb25lbnQpIGNvbnN0CisJeworCQlSYXdWYWx1ZVR5cGUgbXBSZXN1bHQ7CisKKwkJbXB6X3Bvd191aSggbXBSZXN1bHQuZ2V0X21wel90KCksCisJCQkJVGhpc051bWJlckNsYXNzOjptVmFsdWUuZ2V0X21wel90KCksIGFuRXhwb25lbnQgKTsKKworCQlyZXR1cm4oIEludGVnZXIobXBSZXN1bHQpICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBJbnRlZ2VyIHBvdyhhdm1fdWludGVnZXJfdCBhVmFsdWUsIGF2bV91aW50ZWdlcl90IGFuRXhwb25lbnQpCisJeworCQlSYXdWYWx1ZVR5cGUgbXBSZXN1bHQ7CisKKwkJbXB6X3VpX3Bvd191aSggbXBSZXN1bHQuZ2V0X21wel90KCksIGFWYWx1ZSwgYW5FeHBvbmVudCApOworCisJCXJldHVybiggSW50ZWdlcihtcFJlc3VsdCkgKTsKKwl9CisKKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwlpbmxpbmUgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCW9zIDw8IFRBQiA8PCBtVmFsdWU7CisJCUFWTV9ERUJVR19SRUZfQ09VTlRFUihvcyk7CisJCW9zIDw8IEVPTCA8PCBzdGQ6OmZsdXNoOworCX0KKworCXZpcnR1YWwgc3RkOjpzdHJpbmcgc3RyKCkgY29uc3QKKwl7CisJCXJldHVybiggT1NTKCkgPDwgbVZhbHVlICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgc3RyTnVtKAorCQkJYXZtX3VpbnQ4X3QgcHJlY2lzaW9uID0gQVZNX01VTUVSSUNfUFJFQ0lTSU9OKSBjb25zdAorCXsKKwkJcmV0dXJuKCBPU1MoKSA8PCBtVmFsdWUgKTsKKwl9CisKK307CisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworCisjZW5kaWYgLyogRk1MX05VTUVSSUNfR01QX0lOVEVHRVJJTVBMX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbnVtZXJpYy9nbXAvTnVtZXJpY0ltcGwuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9udW1lcmljL2dtcC9OdW1lcmljSW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViODU2ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbnVtZXJpYy9nbXAvTnVtZXJpY0ltcGwuaApAQCAtMCwwICsxLDY5OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDE2IG1haSAyMDE2CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgSW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRk1MX05VTUVSSUNfR01QX05VTUVSSUNJTVBMX0hfCisjZGVmaW5lIEZNTF9OVU1FUklDX0dNUF9OVU1FUklDSU1QTF9IXworCisvLyNpbmNsdWRlIDxmbWwvbnVtZXJpYy9OdW1iZXIuaD4KKworI2luY2x1ZGUgPGZtbC9udW1lcmljL2dtcC9JbnRlZ2VySW1wbC5oPgorI2luY2x1ZGUgPGZtbC9udW1lcmljL2dtcC9SYXRpb25hbEltcGwuaD4KKyNpbmNsdWRlIDxmbWwvbnVtZXJpYy9nbXAvRmxvYXRJbXBsLmg+CisKKyNpbmNsdWRlIDxnbXB4eC5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKK25hbWVzcGFjZSBudW1lcmljCit7CisKKworLyoqCisgKiBjb21wYXJlIEludGVnZXIKKyAqIHdpdGggLi4uCisgKi8KK2lubGluZSBpbnQgY29tcGFyZShjb25zdCBJbnRlZ2VyICYgbnVtMSwgY29uc3QgSW50ZWdlciAmIG51bTIpCit7CisJcmV0dXJuKCBjbXAobnVtMS5nZXRWYWx1ZSgpLCBudW0yLmdldFZhbHVlKCkpICk7CisJLy9yZXR1cm4oIGNtcChyZWludGVycHJldF9jYXN0PEdlbmVyaWNOdW1iZXJDbGFzcz4obnVtMSkuZ2V0VmFsdWUoKSwgcmVpbnRlcnByZXRfY2FzdDxHZW5lcmljTnVtYmVyQ2xhc3M+KG51bTIpLmdldFZhbHVlKCkpICk7Cit9CisKK2lubGluZSBpbnQgY29tcGFyZShjb25zdCBJbnRlZ2VyICYgbnVtMSwgY29uc3QgUmF0aW9uYWwgJiBudW0yKQoreworCXJldHVybiggY21wKG51bTEuZ2V0VmFsdWUoKSwgbnVtMi5nZXRWYWx1ZSgpKSApOworfQorCitpbmxpbmUgaW50IGNvbXBhcmUoY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIGNtcChudW0xLmdldFZhbHVlKCksIG51bTIuZ2V0VmFsdWUoKSkgKTsKK30KKworCisvKioKKyAqIGNvbXBhcmUgUmF0aW9uYWwKKyAqIHdpdGggLi4uCisgKi8KK2lubGluZSBpbnQgY29tcGFyZShjb25zdCBSYXRpb25hbCAmIG51bTEsIGNvbnN0IFJhdGlvbmFsICYgbnVtMikKK3sKKwlyZXR1cm4oIGNtcChudW0xLmdldFZhbHVlKCksIG51bTIuZ2V0VmFsdWUoKSkgKTsKK30KKworaW5saW5lIGludCBjb21wYXJlKGNvbnN0IFJhdGlvbmFsICYgbnVtMSwgY29uc3QgSW50ZWdlciAmIG51bTIpCit7CisJcmV0dXJuKCBjbXAobnVtMS5nZXRWYWx1ZSgpLCBudW0yLmdldFZhbHVlKCkpICk7Cit9CisKK2lubGluZSBpbnQgY29tcGFyZShjb25zdCBSYXRpb25hbCAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIGNtcChudW0xLmdldFZhbHVlKCksIG51bTIuZ2V0VmFsdWUoKSkgKTsKK30KKworCisvKioKKyAqIGNvbXBhcmUgRmxvYXQKKyAqIHdpdGggLi4uCisgKi8KK2lubGluZSBpbnQgY29tcGFyZShjb25zdCBGbG9hdCAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIGNtcChudW0xLmdldFZhbHVlKCksIG51bTIuZ2V0VmFsdWUoKSkgKTsKK30KKworaW5saW5lIGludCBjb21wYXJlKGNvbnN0IEZsb2F0ICYgbnVtMSwgY29uc3QgSW50ZWdlciAmIG51bTIpCit7CisJcmV0dXJuKCBjbXAobnVtMS5nZXRWYWx1ZSgpLCBudW0yLmdldFZhbHVlKCkpICk7Cit9CisKK2lubGluZSBpbnQgY29tcGFyZShjb25zdCBGbG9hdCAmIG51bTEsIGNvbnN0IFJhdGlvbmFsICYgbnVtMikKK3sKKwlyZXR1cm4oIGNtcChudW0xLmdldFZhbHVlKCksIG51bTIuZ2V0VmFsdWUoKSkgKTsKK30KKworCisvKioKKyAqIG9wZXJhdG9yPT0KKyAqLworLy8gSW50ZWdlciA9PSBOdW1iZXIKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IEludGVnZXIgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpID09IG51bTIuZ2V0VmFsdWUoKSApOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEludGVnZXIgJiBudW0xLCBjb25zdCBSYXRpb25hbCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPT0gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA9PSBudW0yLmdldFZhbHVlKCkgKTsKK30KKworCisvLyBSYXRpb25hbCA9PSBOdW1iZXIKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgUmF0aW9uYWwgJiBudW0xLCBjb25zdCBSYXRpb25hbCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPT0gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgUmF0aW9uYWwgJiBudW0xLCBjb25zdCBJbnRlZ2VyICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA9PSBudW0yLmdldFZhbHVlKCkgKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBSYXRpb25hbCAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA9PSBudW0yLmdldFZhbHVlKCkgKTsKK30KKworCisvLyBGbG9hdCA9PSBOdW1iZXIKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBGbG9hdCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPT0gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBSYXRpb25hbCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPT0gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBJbnRlZ2VyICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA9PSBudW0yLmdldFZhbHVlKCkgKTsKK30KKworCisvKioKKyAqIG9wZXJhdG9yIT0KKyAqLworLy8gSW50ZWdlciAhPSBOdW1iZXIKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IEludGVnZXIgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpICE9IG51bTIuZ2V0VmFsdWUoKSApOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEludGVnZXIgJiBudW0xLCBjb25zdCBSYXRpb25hbCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgIT0gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSAhPSBudW0yLmdldFZhbHVlKCkgKTsKK30KKworCisvLyBSYXRpb25hbCAhPSBOdW1iZXIKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgUmF0aW9uYWwgJiBudW0xLCBjb25zdCBSYXRpb25hbCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgIT0gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgUmF0aW9uYWwgJiBudW0xLCBjb25zdCBJbnRlZ2VyICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSAhPSBudW0yLmdldFZhbHVlKCkgKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBSYXRpb25hbCAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSAhPSBudW0yLmdldFZhbHVlKCkgKTsKK30KKworCisvLyBGbG9hdCAhPSBOdW1iZXIKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBGbG9hdCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgIT0gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBSYXRpb25hbCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgIT0gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBJbnRlZ2VyICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSAhPSBudW0yLmdldFZhbHVlKCkgKTsKK30KKworCisvKioKKyAqIG9wZXJhdG9yPAorICovCisvLyBJbnRlZ2VyIDwgTnVtYmVyCitpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IEludGVnZXIgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpIDwgbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBJbnRlZ2VyICYgbnVtMSwgY29uc3QgUmF0aW9uYWwgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpIDwgbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBJbnRlZ2VyICYgbnVtMSwgY29uc3QgRmxvYXQgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpIDwgbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKKworLy8gUmF0aW9uYWwgPCBOdW1iZXIKK2lubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBSYXRpb25hbCAmIG51bTEsIGNvbnN0IFJhdGlvbmFsICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA8IG51bTIuZ2V0VmFsdWUoKSApOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgUmF0aW9uYWwgJiBudW0xLCBjb25zdCBJbnRlZ2VyICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA8IG51bTIuZ2V0VmFsdWUoKSApOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgUmF0aW9uYWwgJiBudW0xLCBjb25zdCBGbG9hdCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPCBudW0yLmdldFZhbHVlKCkgKTsKK30KKworCisvLyBGbG9hdCA8IE51bWJlcgoraW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEZsb2F0ICYgbnVtMSwgY29uc3QgRmxvYXQgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpIDwgbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBGbG9hdCAmIG51bTEsIGNvbnN0IFJhdGlvbmFsICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA8IG51bTIuZ2V0VmFsdWUoKSApOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBJbnRlZ2VyICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA8IG51bTIuZ2V0VmFsdWUoKSApOworfQorCisvKioKKyAqIG9wZXJhdG9yPD0KKyAqLworLy8gSW50ZWdlciA8PSBOdW1iZXIKK2lubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IEludGVnZXIgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpIDw9IG51bTIuZ2V0VmFsdWUoKSApOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IEludGVnZXIgJiBudW0xLCBjb25zdCBSYXRpb25hbCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPD0gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA8PSBudW0yLmdldFZhbHVlKCkgKTsKK30KKworCisvLyBSYXRpb25hbCA8PSBOdW1iZXIKK2lubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgUmF0aW9uYWwgJiBudW0xLCBjb25zdCBSYXRpb25hbCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPD0gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgUmF0aW9uYWwgJiBudW0xLCBjb25zdCBJbnRlZ2VyICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA8PSBudW0yLmdldFZhbHVlKCkgKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBSYXRpb25hbCAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA8PSBudW0yLmdldFZhbHVlKCkgKTsKK30KKworCisvLyBGbG9hdCA8PSBOdW1iZXIKK2lubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBGbG9hdCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPD0gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBSYXRpb25hbCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPD0gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBJbnRlZ2VyICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA8PSBudW0yLmdldFZhbHVlKCkgKTsKK30KKworCisvKioKKyAqIG9wZXJhdG9yPgorICovCisvLyBJbnRlZ2VyID4gTnVtYmVyCitpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IEludGVnZXIgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpID4gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBJbnRlZ2VyICYgbnVtMSwgY29uc3QgUmF0aW9uYWwgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpID4gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBJbnRlZ2VyICYgbnVtMSwgY29uc3QgRmxvYXQgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpID4gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKKworLy8gUmF0aW9uYWwgPiBOdW1iZXIKK2lubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBSYXRpb25hbCAmIG51bTEsIGNvbnN0IFJhdGlvbmFsICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA+IG51bTIuZ2V0VmFsdWUoKSApOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgUmF0aW9uYWwgJiBudW0xLCBjb25zdCBJbnRlZ2VyICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA+IG51bTIuZ2V0VmFsdWUoKSApOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgUmF0aW9uYWwgJiBudW0xLCBjb25zdCBGbG9hdCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPiBudW0yLmdldFZhbHVlKCkgKTsKK30KKworCisvLyBGbG9hdCA+IE51bWJlcgoraW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEZsb2F0ICYgbnVtMSwgY29uc3QgRmxvYXQgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpID4gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBGbG9hdCAmIG51bTEsIGNvbnN0IFJhdGlvbmFsICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA+IG51bTIuZ2V0VmFsdWUoKSApOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBJbnRlZ2VyICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA+IG51bTIuZ2V0VmFsdWUoKSApOworfQorCisvKioKKyAqIG9wZXJhdG9yPj0KKyAqLworLy8gSW50ZWdlciA+PSBOdW1iZXIKK2lubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IEludGVnZXIgJiBudW0yKQoreworCXJldHVybiggbnVtMS5nZXRWYWx1ZSgpID49IG51bTIuZ2V0VmFsdWUoKSApOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEludGVnZXIgJiBudW0xLCBjb25zdCBSYXRpb25hbCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPj0gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA+PSBudW0yLmdldFZhbHVlKCkgKTsKK30KKworCisvLyBSYXRpb25hbCA+PSBOdW1iZXIKK2lubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgUmF0aW9uYWwgJiBudW0xLCBjb25zdCBSYXRpb25hbCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPj0gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgUmF0aW9uYWwgJiBudW0xLCBjb25zdCBJbnRlZ2VyICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA+PSBudW0yLmdldFZhbHVlKCkgKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBSYXRpb25hbCAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA+PSBudW0yLmdldFZhbHVlKCkgKTsKK30KKworCisvLyBGbG9hdCA+PSBOdW1iZXIKK2lubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBGbG9hdCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPj0gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBSYXRpb25hbCAmIG51bTIpCit7CisJcmV0dXJuKCBudW0xLmdldFZhbHVlKCkgPj0gbnVtMi5nZXRWYWx1ZSgpICk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBJbnRlZ2VyICYgbnVtMikKK3sKKwlyZXR1cm4oIG51bTEuZ2V0VmFsdWUoKSA+PSBudW0yLmdldFZhbHVlKCkgKTsKK30KKworCisvKioKKyAqIG9wZXJhdG9yKworICovCisvLyBJbnRlZ2VyICsgTnVtYmVyCitpbmxpbmUgSW50ZWdlciBvcGVyYXRvcisoY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IEludGVnZXIgJiBudW0yKQoreworCXJldHVybiggSW50ZWdlcihudW0xLmdldFZhbHVlKCkgKyBudW0yLmdldFZhbHVlKCkpICk7Cit9CisKK2lubGluZSBSYXRpb25hbCBvcGVyYXRvcisoY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IFJhdGlvbmFsICYgbnVtMikKK3sKKwlyZXR1cm4oIFJhdGlvbmFsKG51bTEuZ2V0VmFsdWUoKSArIG51bTIuZ2V0VmFsdWUoKSkgKTsKK30KKworaW5saW5lIEZsb2F0IG9wZXJhdG9yKyhjb25zdCBJbnRlZ2VyICYgbnVtMSwgY29uc3QgRmxvYXQgJiBudW0yKQoreworCXJldHVybiggRmxvYXQobnVtMS5nZXRWYWx1ZSgpICsgbnVtMi5nZXRWYWx1ZSgpKSApOworfQorCisKKy8vIFJhdGlvbmFsICsgTnVtYmVyCitpbmxpbmUgUmF0aW9uYWwgb3BlcmF0b3IrKGNvbnN0IFJhdGlvbmFsICYgbnVtMSwgY29uc3QgUmF0aW9uYWwgJiBudW0yKQoreworCXJldHVybiggUmF0aW9uYWwobnVtMS5nZXRWYWx1ZSgpICsgbnVtMi5nZXRWYWx1ZSgpKSApOworfQorCitpbmxpbmUgUmF0aW9uYWwgb3BlcmF0b3IrKGNvbnN0IFJhdGlvbmFsICYgbnVtMSwgY29uc3QgSW50ZWdlciAmIG51bTIpCit7CisJcmV0dXJuKCBSYXRpb25hbChudW0xLmdldFZhbHVlKCkgKyBudW0yLmdldFZhbHVlKCkpICk7Cit9CisKK2lubGluZSBGbG9hdCBvcGVyYXRvcisoY29uc3QgUmF0aW9uYWwgJiBudW0xLCBjb25zdCBGbG9hdCAmIG51bTIpCit7CisJcmV0dXJuKCBGbG9hdChudW0xLmdldFZhbHVlKCkgKyBudW0yLmdldFZhbHVlKCkpICk7Cit9CisKKworLy8gRmxvYXQgKyBOdW1iZXIKK2lubGluZSBGbG9hdCBvcGVyYXRvcisoY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBGbG9hdCAmIG51bTIpCit7CisJcmV0dXJuKCBGbG9hdChudW0xLmdldFZhbHVlKCkgKyBudW0yLmdldFZhbHVlKCkpICk7Cit9CisKK2lubGluZSBGbG9hdCBvcGVyYXRvcisoY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBSYXRpb25hbCAmIG51bTIpCit7CisJcmV0dXJuKCBGbG9hdChudW0xLmdldFZhbHVlKCkgKyBudW0yLmdldFZhbHVlKCkpICk7Cit9CisKK2lubGluZSBGbG9hdCBvcGVyYXRvcisoY29uc3QgRmxvYXQgJiBudW0xLCBjb25zdCBJbnRlZ2VyICYgbnVtMikKK3sKKwlyZXR1cm4oIEZsb2F0KG51bTEuZ2V0VmFsdWUoKSArIG51bTIuZ2V0VmFsdWUoKSkgKTsKK30KKworCisvKioKKyAqIG9wZXJhdG9yLQorICovCitpbmxpbmUgSW50ZWdlciBvcGVyYXRvci0oY29uc3QgSW50ZWdlciAmIG51bSkKK3sKKwlyZXR1cm4oIEludGVnZXIoLSBudW0uZ2V0VmFsdWUoKSkgKTsKK30KKworaW5saW5lIFJhdGlvbmFsIG9wZXJhdG9yLShjb25zdCBSYXRpb25hbCAmIG51bSkKK3sKKwlyZXR1cm4oIFJhdGlvbmFsKC0gbnVtLmdldFZhbHVlKCkpICk7Cit9CisKK2lubGluZSBGbG9hdCBvcGVyYXRvci0oY29uc3QgRmxvYXQgJiBudW0pCit7CisJcmV0dXJuKCBGbG9hdCgtIG51bS5nZXRWYWx1ZSgpKSApOworfQorCisKKy8qKgorICogb3BlcmF0b3ItCisgKi8KKy8vIEludGVnZXIgLSBOdW1iZXIKK2lubGluZSBJbnRlZ2VyIG9wZXJhdG9yLShjb25zdCBJbnRlZ2VyICYgbnVtMSwgY29uc3QgSW50ZWdlciAmIG51bTIpCit7CisJcmV0dXJuKCBJbnRlZ2VyKG51bTEuZ2V0VmFsdWUoKSAtIG51bTIuZ2V0VmFsdWUoKSkgKTsKK30KKworaW5saW5lIFJhdGlvbmFsIG9wZXJhdG9yLShjb25zdCBJbnRlZ2VyICYgbnVtMSwgY29uc3QgUmF0aW9uYWwgJiBudW0yKQoreworCXJldHVybiggUmF0aW9uYWwobnVtMS5nZXRWYWx1ZSgpIC0gbnVtMi5nZXRWYWx1ZSgpKSApOworfQorCitpbmxpbmUgRmxvYXQgb3BlcmF0b3ItKGNvbnN0IEludGVnZXIgJiBudW0xLCBjb25zdCBGbG9hdCAmIG51bTIpCit7CisJcmV0dXJuKCBGbG9hdChudW0xLmdldFZhbHVlKCkgLSBudW0yLmdldFZhbHVlKCkpICk7Cit9CisKKworLy8gUmF0aW9uYWwgLSBOdW1iZXIKK2lubGluZSBSYXRpb25hbCBvcGVyYXRvci0oY29uc3QgUmF0aW9uYWwgJiBudW0xLCBjb25zdCBSYXRpb25hbCAmIG51bTIpCit7CisJcmV0dXJuKCBSYXRpb25hbChudW0xLmdldFZhbHVlKCkgLSBudW0yLmdldFZhbHVlKCkpICk7Cit9CisKK2lubGluZSBSYXRpb25hbCBvcGVyYXRvci0oY29uc3QgUmF0aW9uYWwgJiBudW0xLCBjb25zdCBJbnRlZ2VyICYgbnVtMikKK3sKKwlyZXR1cm4oIFJhdGlvbmFsKG51bTEuZ2V0VmFsdWUoKSAtIG51bTIuZ2V0VmFsdWUoKSkgKTsKK30KKworaW5saW5lIEZsb2F0IG9wZXJhdG9yLShjb25zdCBSYXRpb25hbCAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIEZsb2F0KG51bTEuZ2V0VmFsdWUoKSAtIG51bTIuZ2V0VmFsdWUoKSkgKTsKK30KKworCisvLyBGbG9hdCAtIE51bWJlcgoraW5saW5lIEZsb2F0IG9wZXJhdG9yLShjb25zdCBGbG9hdCAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIEZsb2F0KG51bTEuZ2V0VmFsdWUoKSAtIG51bTIuZ2V0VmFsdWUoKSkgKTsKK30KKworaW5saW5lIEZsb2F0IG9wZXJhdG9yLShjb25zdCBGbG9hdCAmIG51bTEsIGNvbnN0IFJhdGlvbmFsICYgbnVtMikKK3sKKwlyZXR1cm4oIEZsb2F0KG51bTEuZ2V0VmFsdWUoKSAtIG51bTIuZ2V0VmFsdWUoKSkgKTsKK30KKworaW5saW5lIEZsb2F0IG9wZXJhdG9yLShjb25zdCBGbG9hdCAmIG51bTEsIGNvbnN0IEludGVnZXIgJiBudW0yKQoreworCXJldHVybiggRmxvYXQobnVtMS5nZXRWYWx1ZSgpIC0gbnVtMi5nZXRWYWx1ZSgpKSApOworfQorCisKKy8qKgorICogb3BlcmF0b3IqCisgKi8KKy8vIEludGVnZXIgKiBOdW1iZXIKK2lubGluZSBJbnRlZ2VyIG9wZXJhdG9yKihjb25zdCBJbnRlZ2VyICYgbnVtMSwgY29uc3QgSW50ZWdlciAmIG51bTIpCit7CisJcmV0dXJuKCBJbnRlZ2VyKG51bTEuZ2V0VmFsdWUoKSAqIG51bTIuZ2V0VmFsdWUoKSkgKTsKK30KKworaW5saW5lIFJhdGlvbmFsIG9wZXJhdG9yKihjb25zdCBJbnRlZ2VyICYgbnVtMSwgY29uc3QgUmF0aW9uYWwgJiBudW0yKQoreworCXJldHVybiggUmF0aW9uYWwobnVtMS5nZXRWYWx1ZSgpICogbnVtMi5nZXRWYWx1ZSgpKSApOworfQorCitpbmxpbmUgRmxvYXQgb3BlcmF0b3IqKGNvbnN0IEludGVnZXIgJiBudW0xLCBjb25zdCBGbG9hdCAmIG51bTIpCit7CisJcmV0dXJuKCBGbG9hdChudW0xLmdldFZhbHVlKCkgKiBudW0yLmdldFZhbHVlKCkpICk7Cit9CisKKworLy8gUmF0aW9uYWwgKiBOdW1iZXIKK2lubGluZSBSYXRpb25hbCBvcGVyYXRvciooY29uc3QgUmF0aW9uYWwgJiBudW0xLCBjb25zdCBSYXRpb25hbCAmIG51bTIpCit7CisJcmV0dXJuKCBSYXRpb25hbChudW0xLmdldFZhbHVlKCkgKiBudW0yLmdldFZhbHVlKCkpICk7Cit9CisKK2lubGluZSBSYXRpb25hbCBvcGVyYXRvciooY29uc3QgUmF0aW9uYWwgJiBudW0xLCBjb25zdCBJbnRlZ2VyICYgbnVtMikKK3sKKwlyZXR1cm4oIFJhdGlvbmFsKG51bTEuZ2V0VmFsdWUoKSAqIG51bTIuZ2V0VmFsdWUoKSkgKTsKK30KKworaW5saW5lIEZsb2F0IG9wZXJhdG9yKihjb25zdCBSYXRpb25hbCAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIEZsb2F0KG51bTEuZ2V0VmFsdWUoKSAqIG51bTIuZ2V0VmFsdWUoKSkgKTsKK30KKworCisvLyBGbG9hdCAqIE51bWJlcgoraW5saW5lIEZsb2F0IG9wZXJhdG9yKihjb25zdCBGbG9hdCAmIG51bTEsIGNvbnN0IEZsb2F0ICYgbnVtMikKK3sKKwlyZXR1cm4oIEZsb2F0KG51bTEuZ2V0VmFsdWUoKSAqIG51bTIuZ2V0VmFsdWUoKSkgKTsKK30KKworaW5saW5lIEZsb2F0IG9wZXJhdG9yKihjb25zdCBGbG9hdCAmIG51bTEsIGNvbnN0IFJhdGlvbmFsICYgbnVtMikKK3sKKwlyZXR1cm4oIEZsb2F0KG51bTEuZ2V0VmFsdWUoKSAqIG51bTIuZ2V0VmFsdWUoKSkgKTsKK30KKworaW5saW5lIEZsb2F0IG9wZXJhdG9yKihjb25zdCBGbG9hdCAmIG51bTEsIGNvbnN0IEludGVnZXIgJiBudW0yKQoreworCXJldHVybiggRmxvYXQobnVtMS5nZXRWYWx1ZSgpICogbnVtMi5nZXRWYWx1ZSgpKSApOworfQorCisKKy8qKgorICogcG93CisgKi8KK2lubGluZSBJbnRlZ2VyIHBvdyhjb25zdCBJbnRlZ2VyICYgbnVtLCBhdm1fdWludGVnZXJfdCBhbkV4cG9uZW50KQoreworCXJldHVybiggSW50ZWdlciggbnVtLnBvdyhhbkV4cG9uZW50KSApICk7Cit9CisKK2lubGluZSBSYXRpb25hbCBwb3coY29uc3QgUmF0aW9uYWwgJiBudW0sIGF2bV91aW50ZWdlcl90IGFuRXhwb25lbnQpCit7CisJUmF0aW9uYWwgcmVzdWx0KCBudW0gKTsKKwlyZXN1bHQuc2V0X3BvdyggYW5FeHBvbmVudCApOworCisJcmV0dXJuKCBSYXRpb25hbCggcmVzdWx0ICkgKTsKK30KKworaW5saW5lIEZsb2F0IHBvdyhjb25zdCBGbG9hdCAmIG51bSwgYXZtX3VpbnRlZ2VyX3QgYW5FeHBvbmVudCkKK3sKKwlGbG9hdCByZXN1bHQoIG51bSApOworCXJlc3VsdC5zZXRfcG93KCBhbkV4cG9uZW50ICk7CisKKwlyZXR1cm4oIEZsb2F0KCByZXN1bHQgKSApOworfQorCisKKy8qKgorICogb3BlcmF0b3IvCisgKi8KKy8vIEludGVnZXIgLyBOdW1iZXIKK2lubGluZSBSYXRpb25hbCBvcGVyYXRvci8oY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IEludGVnZXIgJiBudW0yKQoreworCXJldHVybiggUmF0aW9uYWwoIG51bTEuZ2V0VmFsdWUoKSAsIG51bTIuZ2V0VmFsdWUoKSApICk7Cit9CisKK2lubGluZSBSYXRpb25hbCBvcGVyYXRvci8oY29uc3QgSW50ZWdlciAmIG51bTEsIGNvbnN0IFJhdGlvbmFsICYgbnVtMikKK3sKKwlyZXR1cm4oIFJhdGlvbmFsKG51bTEuZ2V0VmFsdWUoKSAvIG51bTIuZ2V0VmFsdWUoKSkgKTsKK30KKworaW5saW5lIEZsb2F0IG9wZXJhdG9yLyhjb25zdCBJbnRlZ2VyICYgbnVtMSwgY29uc3QgRmxvYXQgJiBudW0yKQoreworCXJldHVybiggRmxvYXQobnVtMS5nZXRWYWx1ZSgpIC8gbnVtMi5nZXRWYWx1ZSgpKSApOworfQorCisKKy8vIFJhdGlvbmFsIC8gTnVtYmVyCitpbmxpbmUgUmF0aW9uYWwgb3BlcmF0b3IvKGNvbnN0IFJhdGlvbmFsICYgbnVtMSwgY29uc3QgUmF0aW9uYWwgJiBudW0yKQoreworCXJldHVybiggUmF0aW9uYWwobnVtMS5nZXRWYWx1ZSgpIC8gbnVtMi5nZXRWYWx1ZSgpKSApOworfQorCitpbmxpbmUgUmF0aW9uYWwgb3BlcmF0b3IvKGNvbnN0IFJhdGlvbmFsICYgbnVtMSwgY29uc3QgSW50ZWdlciAmIG51bTIpCit7CisJcmV0dXJuKCBSYXRpb25hbChudW0xLmdldFZhbHVlKCkgLyBudW0yLmdldFZhbHVlKCkpICk7Cit9CisKK2lubGluZSBGbG9hdCBvcGVyYXRvci8oY29uc3QgUmF0aW9uYWwgJiBudW0xLCBjb25zdCBGbG9hdCAmIG51bTIpCit7CisJcmV0dXJuKCBGbG9hdChudW0xLmdldFZhbHVlKCkgLyBudW0yLmdldFZhbHVlKCkpICk7Cit9CisKKy8vIEZsb2F0IC8gTnVtYmVyCitpbmxpbmUgRmxvYXQgb3BlcmF0b3IvKGNvbnN0IEZsb2F0ICYgbnVtMSwgY29uc3QgRmxvYXQgJiBudW0yKQoreworCXJldHVybiggRmxvYXQobnVtMS5nZXRWYWx1ZSgpIC8gbnVtMi5nZXRWYWx1ZSgpKSApOworfQorCitpbmxpbmUgRmxvYXQgb3BlcmF0b3IvKGNvbnN0IEZsb2F0ICYgbnVtMSwgY29uc3QgUmF0aW9uYWwgJiBudW0yKQoreworCXJldHVybiggRmxvYXQobnVtMS5nZXRWYWx1ZSgpIC8gbnVtMi5nZXRWYWx1ZSgpKSApOworfQorCitpbmxpbmUgRmxvYXQgb3BlcmF0b3IvKGNvbnN0IEZsb2F0ICYgbnVtMSwgY29uc3QgSW50ZWdlciAmIG51bTIpCit7CisJcmV0dXJuKCBGbG9hdChudW0xLmdldFZhbHVlKCkgLyBudW0yLmdldFZhbHVlKCkpICk7Cit9CisKKworLyoqCisgKiBpbnZlcnNlCisgKi8KK2lubGluZSBSYXRpb25hbCBpbnZlcnNlKGNvbnN0IEludGVnZXIgJiBudW0pCit7CisJcmV0dXJuKCBSYXRpb25hbCggSW50ZWdlcigxKSAsIG51bSApICk7Cit9CisKK2lubGluZSBSYXRpb25hbCBpbnZlcnNlKGNvbnN0IFJhdGlvbmFsICYgbnVtKQoreworCXJldHVybiggUmF0aW9uYWwoIG51bS5yYXdEZW5vbWluYXRvcigpICwgbnVtLnJhd051bWVyYXRvcigpICkgKTsKK30KKworaW5saW5lIEZsb2F0IGludmVyc2UoY29uc3QgRmxvYXQgJiBudW0pCit7CisJcmV0dXJuKCBGbG9hdCggMSAvIG51bS5nZXRWYWx1ZSgpICkgKTsKK30KKworCit9IC8qIG5hbWVzcGFjZSBudW1lcmljICovCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qIEZNTF9OVU1FUklDX0dNUF9OVU1FUklDSU1QTF9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL251bWVyaWMvZ21wL1JhdGlvbmFsSW1wbC5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL251bWVyaWMvZ21wL1JhdGlvbmFsSW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiOTA2ODMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvbnVtZXJpYy9nbXAvUmF0aW9uYWxJbXBsLmgKQEAgLTAsMCArMSw1NjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxMCBtYWkgMjAxNgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIEltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEZNTF9OVU1FUklDX0dNUF9SQVRJT05BTElNUExfSF8KKyNkZWZpbmUgRk1MX05VTUVSSUNfR01QX1JBVElPTkFMSU1QTF9IXworCisjaW5jbHVkZSA8Z21weHguaD4KKworI2luY2x1ZGUgPGZtbC9udW1lcmljL051bWJlci5oPgorCisjaW5jbHVkZSA8Zm1sL251bWVyaWMvSW50ZWdlci5oPgorCisjaW5jbHVkZSA8Y21hdGg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIFJhdGlvbmFsIDoKKwkJcHVibGljIE51bWJlciwKKwkJcHVibGljIEdlbmVyaWNOdW1iZXJDbGFzczwgbXBxX2NsYXNzICwgUmF0aW9uYWwgPgoreworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIFJhdGlvbmFsICkKKworCisJLyoqCisJICogVFlQRURFRgorCSAqLworcHVibGljOgorCXR5cGVkZWYgIG1wcV9jbGFzcyAgUmF3VmFsdWVUeXBlOworCitwcml2YXRlOgorCXR5cGVkZWYgIEdlbmVyaWNOdW1iZXJDbGFzczwgUmF3VmFsdWVUeXBlICwgUmF0aW9uYWwgPiAgVGhpc051bWJlckNsYXNzOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwkvLyBSYXdWYWx1ZVR5cGUKKwlSYXRpb25hbChjb25zdCBSYXdWYWx1ZVR5cGUgJiBhVmFsdWUpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggUmF0aW9uYWwgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggYVZhbHVlICkKKwl7CisJCXNpbXBsaWYoKTsKKwl9CisKKwkvLyBtcHFfdAorCVJhdGlvbmFsKGNvbnN0IG1wcV90ICYgYVZhbHVlKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIFJhdGlvbmFsICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIFJhd1ZhbHVlVHlwZShhVmFsdWUpICkKKwl7CisJCXNpbXBsaWYoKTsKKwl9CisKKwkvLyBJbnRlZ2VyIC8gSW50ZWdlcgorCVJhdGlvbmFsKGNvbnN0IEludGVnZXIgJiBhTnVtZXJhdG9yLCBjb25zdCBJbnRlZ2VyICYgYURlbm9taW5hdG9yKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIFJhdGlvbmFsICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIFJhd1ZhbHVlVHlwZSgKKwkJCWFOdW1lcmF0b3IuZ2V0VmFsdWUoKSwgYURlbm9taW5hdG9yLmdldFZhbHVlKCkpICkKKwl7CisJCXNpbXBsaWYoKTsKKwl9CisKKwkvLyBJbnRlZ2VyOjpSYXdWYWx1ZVR5cGUgLyBJbnRlZ2VyOjpSYXdWYWx1ZVR5cGUKKwkvLyBpLmUgbXB6X2NsYXNzIC8gbXB6X2NsYXNzCisJUmF0aW9uYWwoY29uc3QgSW50ZWdlcjo6UmF3VmFsdWVUeXBlICYgYU51bWVyYXRvciwKKwkJCWNvbnN0IEludGVnZXI6OlJhd1ZhbHVlVHlwZSAmIGFEZW5vbWluYXRvcikKKwk6IE51bWJlciggQ0xBU1NfS0lORF9UKCBSYXRpb25hbCApICksCisJVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoYU51bWVyYXRvciwgYURlbm9taW5hdG9yKSApCisJeworCQlzaW1wbGlmKCk7CisJfQorCisJLy8gbXB6X3QgLyBtcHpfdAorCVJhdGlvbmFsKGNvbnN0IG1wel90ICYgYU51bWVyYXRvciwgY29uc3QgbXB6X3QgJiBhRGVub21pbmF0b3IpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggUmF0aW9uYWwgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKAorCQkJSW50ZWdlcjo6UmF3VmFsdWVUeXBlKGFOdW1lcmF0b3IpLAorCQkJSW50ZWdlcjo6UmF3VmFsdWVUeXBlKGFEZW5vbWluYXRvcikpICkKKwl7CisJCXNpbXBsaWYoKTsKKwl9CisKKwkvLyBhdm1faW50ZWdlcl90IC8gYXZtX2ludGVnZXJfdCAgaS5lLiAgYXZtX2ludDY0X3QgLyBhdm1faW50NjRfdAorCVJhdGlvbmFsKGF2bV9pbnRlZ2VyX3QgYU51bWVyYXRvciwgYXZtX2ludGVnZXJfdCBhRGVub21pbmF0b3IpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggUmF0aW9uYWwgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKAorCQkJSW50ZWdlciggYU51bWVyYXRvciApLmdldFZhbHVlKCksCisJCQlJbnRlZ2VyKCBhRGVub21pbmF0b3IgKS5nZXRWYWx1ZSgpICkgKQorCXsKKwkJc2ltcGxpZigpOworCX0KKworCS8vIGF2bV9pbnRlZ2VyX3QgLyBhdm1fdWludGVnZXJfdCAgaS5lLiAgYXZtX2ludDY0X3QgLyBhdm1fdWludDY0X3QKKwlSYXRpb25hbChhdm1faW50ZWdlcl90IGFOdW1lcmF0b3IsIGF2bV91aW50ZWdlcl90IGFEZW5vbWluYXRvcikKKwk6IE51bWJlciggQ0xBU1NfS0lORF9UKCBSYXRpb25hbCApICksCisJVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoCisJCQlJbnRlZ2VyKCBhTnVtZXJhdG9yICkuZ2V0VmFsdWUoKSwKKwkJCUludGVnZXIoIGFEZW5vbWluYXRvciApLmdldFZhbHVlKCkgKSApCisJeworCQlzaW1wbGlmKCk7CisJfQorCisJLy8gYXZtX3VpbnRlZ2VyX3QgLyBhdm1faW50ZWdlcl90ICBpLmUuICBhdm1fdWludDY0X3QgLyBhdm1faW50NjRfdAorCVJhdGlvbmFsKGF2bV91aW50ZWdlcl90IGFOdW1lcmF0b3IsIGF2bV9pbnRlZ2VyX3QgYURlbm9taW5hdG9yKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIFJhdGlvbmFsICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIFJhd1ZhbHVlVHlwZSgKKwkJCUludGVnZXIoIGFOdW1lcmF0b3IgKS5nZXRWYWx1ZSgpLAorCQkJSW50ZWdlciggYURlbm9taW5hdG9yICkuZ2V0VmFsdWUoKSApICkKKwl7CisJCXNpbXBsaWYoKTsKKwl9CisKKwkvLyBhdm1fdWludGVnZXJfdCAvIGF2bV91aW50ZWdlcl90ICBpLmUuICBhdm1fdWludDY0X3QgLyBhdm1fdWludDY0X3QKKwlSYXRpb25hbChhdm1fdWludGVnZXJfdCBhTnVtZXJhdG9yLCBhdm1fdWludGVnZXJfdCBhRGVub21pbmF0b3IpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggUmF0aW9uYWwgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKAorCQkJSW50ZWdlciggYU51bWVyYXRvciApLmdldFZhbHVlKCksCisJCQlJbnRlZ2VyKCBhRGVub21pbmF0b3IgKS5nZXRWYWx1ZSgpICkgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLy8gc3RkOjpzdHJpbmcgLyBhdm1faW50ZWdlcl90ICBpLmUuICBzdGQ6OnN0cmluZyAvIGF2bV9pbnQ2NF90CisJUmF0aW9uYWwoY29uc3Qgc3RkOjpzdHJpbmcgJiBhTnVtZXJhdG9yLCBhdm1faW50ZWdlcl90IGFEZW5vbWluYXRvcikKKwk6IE51bWJlciggQ0xBU1NfS0lORF9UKCBSYXRpb25hbCApICksCisJVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoCisJCQlJbnRlZ2VyKCBhTnVtZXJhdG9yICkuZ2V0VmFsdWUoKSwKKwkJCUludGVnZXIoIGFEZW5vbWluYXRvciApLmdldFZhbHVlKCkgKSApCisJeworCQlzaW1wbGlmKCk7CisJfQorCisJLy8gYXZtX2ludGVnZXJfdCAvIHN0ZDo6c3RyaW5nICBpLmUuICBhdm1faW50NjRfdCAvIHN0ZDo6c3RyaW5nCisJUmF0aW9uYWwoYXZtX2ludGVnZXJfdCBhTnVtZXJhdG9yLCBjb25zdCBzdGQ6OnN0cmluZyAmIGFEZW5vbWluYXRvcikKKwk6IE51bWJlciggQ0xBU1NfS0lORF9UKCBSYXRpb25hbCApICksCisJVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoCisJCQlJbnRlZ2VyKCBhTnVtZXJhdG9yICkuZ2V0VmFsdWUoKSwKKwkJCUludGVnZXIoIGFEZW5vbWluYXRvciApLmdldFZhbHVlKCkgKSApCisJeworCQlzaW1wbGlmKCk7CisJfQorCisJLy8gc3RkOjpzdHJpbmcgLyBzdGQ6OnN0cmluZworCVJhdGlvbmFsKGNvbnN0IHN0ZDo6c3RyaW5nICYgYU51bWVyYXRvciwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhRGVub21pbmF0b3IpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggUmF0aW9uYWwgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKAorCQkJSW50ZWdlcjo6UmF3VmFsdWVUeXBlKGFOdW1lcmF0b3IpLAorCQkJSW50ZWdlcjo6UmF3VmFsdWVUeXBlKGFEZW5vbWluYXRvcikgKSApCisJeworCQlzaW1wbGlmKCk7CisJfQorCisJLy8gSW50ZWdlcgorCVJhdGlvbmFsKGNvbnN0IEludGVnZXIgJiBhTnVtZXJhdG9yKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIFJhdGlvbmFsICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIFJhd1ZhbHVlVHlwZSggYU51bWVyYXRvci5nZXRWYWx1ZSgpICkgKQorCXsKKwkJc2ltcGxpZigpOworCX0KKworCS8vIEludGVnZXI6OlJhd1ZhbHVlVHlwZSAgaS5lLiAgbXB6X2NsYXNzCisJUmF0aW9uYWwoY29uc3QgSW50ZWdlcjo6UmF3VmFsdWVUeXBlICYgYU51bWVyYXRvcikKKwk6IE51bWJlciggQ0xBU1NfS0lORF9UKCBSYXRpb25hbCApICksCisJVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoYU51bWVyYXRvcikgKQorCXsKKwkJc2ltcGxpZigpOworCX0KKworCS8vIG1wel90CisJUmF0aW9uYWwoY29uc3QgbXB6X3QgJiBhTnVtZXJhdG9yKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIFJhdGlvbmFsICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIFJhd1ZhbHVlVHlwZSggSW50ZWdlcjo6UmF3VmFsdWVUeXBlKGFOdW1lcmF0b3IpICkgKQorCXsKKwkJc2ltcGxpZigpOworCX0KKworCS8vIGF2bV9pbnRlZ2VyX3QgaS5lLiBhdm1faW50NjRfdAorCVJhdGlvbmFsKGF2bV9pbnRlZ2VyX3QgYU51bWVyYXRvcikKKwk6IE51bWJlciggQ0xBU1NfS0lORF9UKCBSYXRpb25hbCApICksCisJVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoIEludGVnZXIoIGFOdW1lcmF0b3IgKS5nZXRWYWx1ZSgpICkgKQorCXsKKwkJc2ltcGxpZigpOworCX0KKworCS8vIGF2bV91aW50ZWdlcl90IGkuZS4gYXZtX3VpbnQ2NF90CisJUmF0aW9uYWwoYXZtX3VpbnRlZ2VyX3QgYU51bWVyYXRvcikKKwk6IE51bWJlciggQ0xBU1NfS0lORF9UKCBSYXRpb25hbCApICksCisJVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoIEludGVnZXIoIGFOdW1lcmF0b3IgKS5nZXRWYWx1ZSgpICkgKQorCXsKKwkJc2ltcGxpZigpOworCX0KKworI2lmZGVmIF9BVk1fTkVFRF9JTlQ2NF9UX09WRVJMT0FEU18KKworCS8vIGxvbmcKKwlSYXRpb25hbChsb25nIGFOdW1lcmF0b3IpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggUmF0aW9uYWwgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKCBJbnRlZ2VyOjpSYXdWYWx1ZVR5cGUoYU51bWVyYXRvcikgKSApCisJeworCQlzaW1wbGlmKCk7CisJfQorCisJLy8gdW5zaWduZWQgbG9uZworCVJhdGlvbmFsKHVuc2lnbmVkIGxvbmcgYU51bWVyYXRvcikKKwk6IE51bWJlciggQ0xBU1NfS0lORF9UKCBSYXRpb25hbCApICksCisJVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoIEludGVnZXI6OlJhd1ZhbHVlVHlwZShhTnVtZXJhdG9yKSApICkKKwl7CisJCXNpbXBsaWYoKTsKKwl9CisKKyNlbmRpZiAvKiBfQVZNX05FRURfSU5UNjRfVF9PVkVSTE9BRFNfICovCisKKwkvLyBpbnQzMl90CisJUmF0aW9uYWwoaW50IGFOdW1lcmF0b3IpCisJOiBOdW1iZXIoIENMQVNTX0tJTkRfVCggUmF0aW9uYWwgKSApLAorCVRoaXNOdW1iZXJDbGFzcyggUmF3VmFsdWVUeXBlKCBJbnRlZ2VyOjpSYXdWYWx1ZVR5cGUoYU51bWVyYXRvcikgKSApCisJeworCQlzaW1wbGlmKCk7CisJfQorCisJLy8gdWludDMyX3QKKwlSYXRpb25hbCh1bnNpZ25lZCBpbnQgYU51bWVyYXRvcikKKwk6IE51bWJlciggQ0xBU1NfS0lORF9UKCBSYXRpb25hbCApICksCisJVGhpc051bWJlckNsYXNzKCBSYXdWYWx1ZVR5cGUoIEludGVnZXI6OlJhd1ZhbHVlVHlwZShhTnVtZXJhdG9yKSApICkKKwl7CisJCXNpbXBsaWYoKTsKKwl9CisKKwkvLyBzdGQ6OnN0cmluZworCVJhdGlvbmFsKGNvbnN0IHN0ZDo6c3RyaW5nICYgYVJhdGlvbmFsKQorCTogTnVtYmVyKCBDTEFTU19LSU5EX1QoIFJhdGlvbmFsICkgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIFJhd1ZhbHVlVHlwZSggKSApCisJeworCQlmcm9tU3RyaW5nKFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLCBhUmF0aW9uYWwpOworCisJCXNpbXBsaWYoKTsKKwl9CisKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCVJhdGlvbmFsKGNvbnN0IFJhdGlvbmFsICYgYVJhdGlvbmFsKQorCTogTnVtYmVyKCBhUmF0aW9uYWwgKSwKKwlUaGlzTnVtYmVyQ2xhc3MoIGFSYXRpb25hbCApCisJeworCQlzaW1wbGlmKCk7CisJfQorCisKKwlpbmxpbmUgc3RhdGljIHZvaWQgZnJvbVN0cmluZyhSYXdWYWx1ZVR5cGUgJiByb3AsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYVZhbHVlKQorCXsKKwkJc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSBhVmFsdWUuZmluZCgnLycpOworCQlpZiggcG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zKQorCQl7CisJCQlyb3AgPSBSYXdWYWx1ZVR5cGUoIGFWYWx1ZSApOworCQl9CisJCWVsc2UgaWYoIChwb3MgPSBhVmFsdWUuZmluZCgnLicpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisJCXsKKwkJCUludGVnZXIgYU51bWVyKCBzdGQ6OnN0cmluZyhhVmFsdWUpLmVyYXNlKHBvcywgMSkgKTsKKworCQkJSW50ZWdlciBhRGVub20gPSBJbnRlZ2VyOjpwb3coMTAsIGFWYWx1ZS5zaXplKCkgLSAocG9zICsgMSkpOworCisJCQlyb3AgPSBSYXdWYWx1ZVR5cGUoIGFOdW1lci5nZXRWYWx1ZSgpLCBhRGVub20uZ2V0VmFsdWUoKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJcm9wID0gUmF3VmFsdWVUeXBlKCBhVmFsdWUgKTsKKwkJfQorCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgflJhdGlvbmFsKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogVGhpc051bWJlckNsYXNzOjptVmFsdWUKKwkgKi8KKwlib29sIHNpbXBsaWYoKQorCXsKKwkJVGhpc051bWJlckNsYXNzOjptVmFsdWUuY2Fub25pY2FsaXplKCk7CisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZQorCSAqLworCWlubGluZSBJbnRlZ2VyIGdldE51bWVyYXRvcigpIGNvbnN0CisJeworCQlyZXR1cm4oIEludGVnZXIoIFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLmdldF9udW0oKSApICk7CisJfQorCisJaW5saW5lIEludGVnZXIgZ2V0RGVub21pbmF0b3IoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBJbnRlZ2VyKCBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZS5nZXRfZGVuKCkgKSApOworCX0KKworCisJaW5saW5lIGNvbnN0IEludGVnZXI6OlJhd1ZhbHVlVHlwZSAmIHJhd051bWVyYXRvcigpIGNvbnN0CisJeworCQlyZXR1cm4oIFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLmdldF9udW0oKSApOworCX0KKworCWlubGluZSBjb25zdCBJbnRlZ2VyOjpSYXdWYWx1ZVR5cGUgJiByYXdEZW5vbWluYXRvcigpIGNvbnN0CisJeworCQlyZXR1cm4oIFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLmdldF9kZW4oKSApOworCX0KKworCisJaW5saW5lIHZvaWQgc2V0VmFsdWUoYXZtX2ludGVnZXJfdCBhTnVtZXJhdG9yLCBhdm1faW50ZWdlcl90IGFEZW5vbWluYXRvcikKKwl7CisJCVRoaXNOdW1iZXJDbGFzczo6bVZhbHVlID0gUmF3VmFsdWVUeXBlKAorCQkJCUludGVnZXIoIGFOdW1lcmF0b3IgKS5nZXRWYWx1ZSgpLAorCQkJCUludGVnZXIoIGFEZW5vbWluYXRvciApLmdldFZhbHVlKCkgKTsKKwl9CisKKworCWlubGluZSB2b2lkIHNldFZhbHVlKGF2bV9pbnRlZ2VyX3QgYVZhbHVlKQorCXsKKwkJVGhpc051bWJlckNsYXNzOjptVmFsdWUgPSBSYXdWYWx1ZVR5cGUoIEludGVnZXIoIGFWYWx1ZSApLmdldFZhbHVlKCkgKTsKKwl9CisKKworCS8qKgorCSAqIEJBU0lDUyBURVNUUworCSAqLworCXZpcnR1YWwgaW5saW5lIGludCBzaWduKCkgY29uc3QKKwl7CisJCXJldHVybiggbXBxX3NnbihUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZS5nZXRfbXBxX3QoKSkgKTsKKwl9CisKKwl2aXJ0dWFsIGlubGluZSBib29sIGlzWmVybygpIGNvbnN0CisJeworCQlyZXR1cm4oIHNpZ24oKSA9PSAwICk7CisJfQorCisJdmlydHVhbCBpbmxpbmUgYm9vbCBpc09uZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1wcV9jbXBfc2koCisJCQkJVGhpc051bWJlckNsYXNzOjptVmFsdWUuZ2V0X21wcV90KCksIDEsIDEpID09IDAgKTsKKwl9CisKKwl2aXJ0dWFsIGlubGluZSBib29sIGlzTmVnYXRpdmVPbmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtcHFfY21wX3NpKAorCQkJCVRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLmdldF9tcHFfdCgpLCAtMSwgMSkgPT0gMCApOworCX0KKworCisJLyoqCisJICogQ09OVkVSU0lPTgorCSAqLworI2RlZmluZSBNUFFfSVNfSU5URUdFUiggTVBRX05VTSwgIE1QUV9ERU4sIElORiwgU1VQKSAgIFwKKwkobXB6X2NtcF9zaShNUFFfREVOLmdldF9tcHpfdCgpLCAxICApID09IDApICYmICAgXAorCShtcHpfY21wX3NpKE1QUV9OVU0uZ2V0X21wel90KCksIElORikgPj0gMCkgJiYgICBcCisJKG1wel9jbXBfdWkoTVBRX05VTS5nZXRfbXB6X3QoKSwgU1VQKSA8PSAwKQorCisjZGVmaW5lIE1QUV9JU19QT1NJVElWRV9JTlRFR0VSKE1QUV9OVU0sICBNUFFfREVOLCBTVVApICAgICAgICAgIFwKKwkoc2lnbigpID49IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAgXAorCShtcHpfY21wX3NpKE1QUV9ERU4uZ2V0X21wel90KCksIDEgICkgPT0gMCkgICAgICAgICAgICAgICYmICBcCisJKG1wel9jbXBfdWkoTVBRX05VTS5nZXRfbXB6X3QoKSwgTVBRX05VTS5nZXRfdWkoKSkgPT0gMCkgJiYgIFwKKwkobXB6X2NtcF91aShNUFFfTlVNLmdldF9tcHpfdCgpLCBTVVApIDw9IDApCisKKworCWlubGluZSB2aXJ0dWFsIGJvb2wgaXNJbnQzMigpIGNvbnN0CisJeworCQlyZXR1cm4oIE1QUV9JU19JTlRFR0VSKHJhd051bWVyYXRvcigpLCByYXdEZW5vbWluYXRvcigpLAorCQkJCUFWTV9OVU1FUklDX01JTl9JTlQzMiwgQVZNX05VTUVSSUNfTUFYX0lOVDMyKSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGF2bV9pbnQzMl90IHRvSW50MzIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBzdGF0aWNfY2FzdDwgYXZtX2ludDMyX3QgPiggcmF3TnVtZXJhdG9yKCkuZ2V0X3NpKCkgKSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGJvb2wgaXNJbnQ2NCgpIGNvbnN0CisJeworCQlyZXR1cm4oIE1QUV9JU19JTlRFR0VSKHJhd051bWVyYXRvcigpLCByYXdEZW5vbWluYXRvcigpLAorCQkJCUFWTV9OVU1FUklDX01JTl9JTlQ2NCwgQVZNX05VTUVSSUNfTUFYX0lOVDY0KSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGF2bV9pbnQ2NF90IHRvSW50NjQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBzdGF0aWNfY2FzdDwgYXZtX2ludDY0X3QgPiggcmF3TnVtZXJhdG9yKCkuZ2V0X3NpKCkgKSApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgYm9vbCBpc0ludGVnZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBNUFFfSVNfSU5URUdFUihyYXdOdW1lcmF0b3IoKSwgcmF3RGVub21pbmF0b3IoKSwKKwkJCQlBVk1fTlVNRVJJQ19NSU5fSU5URUdFUiwgQVZNX05VTUVSSUNfTUFYX0lOVEVHRVIpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgYXZtX2ludGVnZXJfdCB0b0ludGVnZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCByYXdOdW1lcmF0b3IoKS5nZXRfc2koKSApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgYm9vbCBpc1Bvc0ludGVnZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBNUFFfSVNfUE9TSVRJVkVfSU5URUdFUihyYXdOdW1lcmF0b3IoKSwKKwkJCQlyYXdEZW5vbWluYXRvcigpLCBBVk1fTlVNRVJJQ19NQVhfVUlOVEVHRVIpICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBib29sIGlzVUludGVnZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBNUFFfSVNfUE9TSVRJVkVfSU5URUdFUihyYXdOdW1lcmF0b3IoKSwKKwkJCQlyYXdEZW5vbWluYXRvcigpLCBBVk1fTlVNRVJJQ19NQVhfVUlOVEVHRVIpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgYXZtX3VpbnRlZ2VyX3QgdG9VSW50ZWdlcigpIGNvbnN0CisJeworCQlyZXR1cm4oIHN0YXRpY19jYXN0PCBhdm1fdWludGVnZXJfdCA+KCByYXdOdW1lcmF0b3IoKS5nZXRfdWkoKSApICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBib29sIGlzUmF0aW9uYWwoKSBjb25zdAorCXsKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisJdmlydHVhbCBhdm1faW50ZWdlcl90IHRvRGVub21pbmF0b3IoKSBjb25zdAorCXsKKwkJcmV0dXJuKCByYXdEZW5vbWluYXRvcigpLmdldF9zaSgpICk7CisJfQorCisJdmlydHVhbCBhdm1faW50ZWdlcl90IHRvTnVtZXJhdG9yKCkgY29uc3QKKwl7CisJCXJldHVybiggcmF3TnVtZXJhdG9yKCkuZ2V0X3NpKCkgKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIGJvb2wgaXNGbG9hdCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBhdm1fZmxvYXRfdCB0b0Zsb2F0KCkgY29uc3QKKwl7CisJCXJldHVybiggc3RhdGljX2Nhc3Q8IGF2bV9mbG9hdF90ID4oIFRoaXNOdW1iZXJDbGFzczo6bVZhbHVlLmdldF9kKCkgKSApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgYm9vbCBpc1JlYWwoKSBjb25zdAorCXsKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgYXZtX3JlYWxfdCB0b1JlYWwoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBzdGF0aWNfY2FzdDwgYXZtX3JlYWxfdCA+KCBUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZS5nZXRfZCgpICkgKTsKKwl9CisKKworCS8qKgorCSAqIG1hdGggZnVuY3Rpb24KKwkgKi8KKwlpbmxpbmUgdm9pZCBzZXRfcG93KGF2bV91aW50ZWdlcl90IGFuRXhwb25lbnQpCisJeworLy8JCVJhd1ZhbHVlVHlwZSBtcFJlc3VsdDsKKy8vCisvLwkJbXBxX3Bvd191aSggbXBSZXN1bHQuZ2V0X21wcV90KCksCisvLwkJCQlUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZS5nZXRfbXBxX3QoKSwgYW5FeHBvbmVudCApOworLy8KKy8vCQlUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZSA9IG1wUmVzdWx0OworCisJCW1wel9wb3dfdWkoIG1wcV9udW1yZWYoVGhpc051bWJlckNsYXNzOjptVmFsdWUuZ2V0X21wcV90KCkpLAorCQkJCW1wcV9udW1yZWYoVGhpc051bWJlckNsYXNzOjptVmFsdWUuZ2V0X21wcV90KCkpLCBhbkV4cG9uZW50ICk7CisKKwkJbXB6X3Bvd191aSggbXBxX2RlbnJlZihUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZS5nZXRfbXBxX3QoKSksCisJCQkJbXBxX2RlbnJlZihUaGlzTnVtYmVyQ2xhc3M6Om1WYWx1ZS5nZXRfbXBxX3QoKSksIGFuRXhwb25lbnQgKTsKKwl9CisKKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwlpbmxpbmUgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCW9zIDw8IFRBQiA8PCByYXdOdW1lcmF0b3IoKTsKKwkJaWYoIHJhd0Rlbm9taW5hdG9yKCkgIT0gMSApCisJCXsKKwkJCW9zIDw8ICIvIiA8PCByYXdEZW5vbWluYXRvcigpOworCQl9CisJCUFWTV9ERUJVR19SRUZfQ09VTlRFUihvcyk7CisJCW9zIDw8IEVPTF9GTFVTSDsKKwl9CisKKwl2aXJ0dWFsIHN0ZDo6c3RyaW5nIHN0cigpIGNvbnN0CisJeworCQlpZiggcmF3RGVub21pbmF0b3IoKSAhPSAxICkKKwkJeworCQkJcmV0dXJuKCBPU1MoKSA8PCByYXdOdW1lcmF0b3IoKSA8PCAnLycgPDwgcmF3RGVub21pbmF0b3IoKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuKCBPU1MoKSA8PCByYXdOdW1lcmF0b3IoKSApOworCQl9CisJfQorCisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgc3RyTnVtKAorCQkJYXZtX3VpbnQ4X3QgcHJlY2lzaW9uID0gQVZNX01VTUVSSUNfUFJFQ0lTSU9OKSBjb25zdAorCXsKKwkJaWYoIHJhd0Rlbm9taW5hdG9yKCkgIT0gMSApCisJCXsKKwkJCXJldHVybiggT1NTKCkgPDwgcmF3TnVtZXJhdG9yKCkgPDwgJy8nIDw8IHJhd0Rlbm9taW5hdG9yKCkgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybiggT1NTKCkgPDwgcmF3TnVtZXJhdG9yKCkgKTsKKwkJfQorCX0KKworCWlubGluZSB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHN0ck51bWVyYXRvcigKKwkJCWF2bV91aW50OF90IHByZWNpc2lvbiA9IEFWTV9NVU1FUklDX1BSRUNJU0lPTikgY29uc3QKKwl7CisJCXJldHVybiggT1NTKCkgPDwgcmF3TnVtZXJhdG9yKCkgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBzdGQ6OnN0cmluZyBzdHJEZW5vbWluYXRvcigKKwkJCWF2bV91aW50OF90IHByZWNpc2lvbiA9IEFWTV9NVU1FUklDX1BSRUNJU0lPTikgY29uc3QKKwl7CisJCXJldHVybiggT1NTKCkgPDwgcmF3RGVub21pbmF0b3IoKSApOworCX0KKworfTsKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qIEZNTF9OVU1FUklDX0dNUF9SQVRJT05BTElNUExfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9vcGVyYXRvci9PcGVyYXRvci5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvb3BlcmF0b3IvT3BlcmF0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlOTVlMGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvb3BlcmF0b3IvT3BlcmF0b3IuY3BwCkBAIC0wLDAgKzEsOTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJPcGVyYXRvci5oIgorCisjaW5jbHVkZSA8Y29tbW9uL0JGLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorICogQ09OU1RSVUNUT1IKKyAqIERlZmF1bHQKKyAqLworT3BlcmF0b3I6Ok9wZXJhdG9yKAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELAorCQlBVk1fT1BDT0RFIGFuQXZtT3BDb2RlLCBBVk1fT1BDT0RFIGFuT3B0aW1pemVkT3BDb2RlLAorCQlBTEdFQlJBX1FVQUxJRklFUiBhbkFsZ2VicmFRdWFsaWZpZXIsIEZJWF9OT1RBVElPTiBhRml4Tm90YXRpb24sCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVN0YW5kYXJkU3ltYm9sLAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFTeW50YXhNSVhGSVgsCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVN5bWJvbFFFUENBRCkKKzogTmFtZWRFbGVtZW50KENMQVNTX0tJTkRfVCggT3BlcmF0b3IgKSwKKwkJYUZ1bGx5UXVhbGlmaWVkTmFtZUlELCBhTmFtZUlELCBhU3RhbmRhcmRTeW1ib2wpLAorbUF2bU9wQ29kZSggYW5Bdm1PcENvZGUgKSwKK21PcHRpbWl6ZWRPcENvZGUoIGFuT3B0aW1pemVkT3BDb2RlICksCittT2Zmc2V0KCAwICksCisKK21BbGdlYnJhUXVhbGlmaWVyKCBhbkFsZ2VicmFRdWFsaWZpZXIgKSwKK21GaXhOb3RhdGlvbiggYUZpeE5vdGF0aW9uICksCisKK21TdGFuZGFyZFN5bWJvbCggYVN0YW5kYXJkU3ltYm9sICksCittU3ludGF4TUlYRklYKCBhU3ludGF4TUlYRklYICksCittU3ltYm9sUUVQQ0FEKCBhU3ltYm9sUUVQQ0FEICkKK3sKKwkvLyEhIE5PVEhJTkcKK30KKworCisKKy8qKgorICogU2VyaWFsaXphdGlvbgorICovCit2b2lkIE9wZXJhdG9yOjp0b1N0cmVhbShPdXRTdHJlYW0gJiBvcywKKwkJRU5VTV9QUklOVF9PUEVSQVRPUl9GT1JNQVQgcHJpbnRGb3JtYXQpIGNvbnN0Cit7CisJc3dpdGNoKCBwcmludEZvcm1hdCApCisJeworCQljYXNlIFBSSU5UX09QRVJBVE9SX05BTUVfRk9STUFUOgorCQl7CisJCQlvcyA8PCBnZXROYW1lSUQoKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgUFJJTlRfT1BFUkFUT1JfU1lNQk9MX0ZPUk1BVDoKKwkJeworCQkJb3MgPDwgbVN0YW5kYXJkU3ltYm9sOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBQUklOVF9PUEVSQVRPUl9NSVhGSVhfRk9STUFUOgorCQl7CisJCQlvcyA8PCBtU3ludGF4TUlYRklYOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBQUklOVF9PUEVSQVRPUl9DQVNfUUVQQ0FEX0ZPUk1BVDoKKwkJeworCQkJb3MgPDwgbVN5bWJvbFFFUENBRDsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgUFJJTlRfT1BFUkFUT1JfVU5ERUZJTkVEX0ZPUk1BVDoKKwkJZGVmYXVsdDoKKwkJeworCQkJb3MgPDwgZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJb3MgPDwgc3RkOjpmbHVzaDsKK30KKworCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9vcGVyYXRvci9PcGVyYXRvci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL29wZXJhdG9yL09wZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhkMzc0YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9vcGVyYXRvci9PcGVyYXRvci5oCkBAIC0wLDAgKzEsMjc0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIE9QRVJBVE9SX0hfCisjZGVmaW5lIE9QRVJBVE9SX0hfCisKKyNpbmNsdWRlIDxjb21tb24vTmFtZWRFbGVtZW50Lmg+CisKKyNpbmNsdWRlIDxjb21tb24vQXZtUG9pbnRlci5oPgorCisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yTGliLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIE9wZXJhdG9yIDogcHVibGljIE5hbWVkRWxlbWVudCAsCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggT3BlcmF0b3IgKQoreworCisJQVZNX0RFQ0xBUkVfVU5DTE9OQUJMRV9DTEFTUyggT3BlcmF0b3IgKQorCisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBBVFRSSUJVVEVTCisJICovCisJQVZNX09QQ09ERSBtQXZtT3BDb2RlOworCisJQVZNX09QQ09ERSBtT3B0aW1pemVkT3BDb2RlOworCisJYXZtX29mZnNldF90IG1PZmZzZXQ7CisKKwlBTEdFQlJBX1FVQUxJRklFUiBtQWxnZWJyYVF1YWxpZmllcjsKKwlGSVhfTk9UQVRJT04gbUZpeE5vdGF0aW9uOworCisJc3RkOjpzdHJpbmcgbVN0YW5kYXJkU3ltYm9sOworCisJc3RkOjpzdHJpbmcgbVN5bnRheE1JWEZJWDsKKworCXN0ZDo6c3RyaW5nIG1TeW1ib2xRRVBDQUQ7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCU9wZXJhdG9yKGNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlELAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELAorCQkJQVZNX09QQ09ERSBhbkF2bU9wQ29kZSwgQVZNX09QQ09ERSBhbk9wdGltaXplZE9wQ29kZSwKKwkJCUFMR0VCUkFfUVVBTElGSUVSIGFuQWxnZWJyYVF1YWxpZmllciwgRklYX05PVEFUSU9OIGFGaXhOb3RhdGlvbiwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVN0YW5kYXJkU3ltYm9sLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhU3ludGF4TUlYRklYLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhU3ltYm9sUUVQQ0FEKTsKKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfk9wZXJhdG9yKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoKKwkgKiBHRVRURVIKKwkgKiBtQXZtT3BDb2RlCisJICovCisJaW5saW5lIEFWTV9PUENPREUgZ2V0QXZtT3BDb2RlKCkgY29uc3QKKwl7CisJCXJldHVybiggbUF2bU9wQ29kZSApOworCX0KKworCS8qCisJICogR0VUVEVSCisJICogbU9wdGltaXplZE9wQ29kZQorCSAqLworCWlubGluZSBBVk1fT1BDT0RFIGdldE9wdGltaXplZE9wQ29kZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1PcHRpbWl6ZWRPcENvZGUgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1PZmZzZXQKKwkgKi8KKwlpbmxpbmUgYXZtX29mZnNldF90IGdldE9mZnNldCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1PZmZzZXQgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRPZmZzZXQoYXZtX29mZnNldF90IGFuT2Zmc2V0KQorCXsKKwkJbU9mZnNldCA9IGFuT2Zmc2V0OworCX0KKworCisJLyoKKwkgKiBHRVRURVIKKwkgKiBtQWxnZWJyYVF1YWxpZmllcgorCSAqLworCWlubGluZSBBTEdFQlJBX1FVQUxJRklFUiBnZXRBbGdlYnJhUXVhbGlmaWVyKCkgY29uc3QKKwl7CisJCXJldHVybiggbUFsZ2VicmFRdWFsaWZpZXIgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc0Fzc29jaWF0aXZlKCkgY29uc3QKKwl7CisJCXJldHVybiggKG1BbGdlYnJhUXVhbGlmaWVyID09IEFMR0VCUkFfQVNTT0MgICAgICkgfHwKKwkJCQkobUFsZ2VicmFRdWFsaWZpZXIgPT0gQUxHRUJSQV9BU1NPQ19DT01NKSApOworCX0KKworCWlubGluZSBib29sIGlzV2Vha0Fzc29jaWF0aXZlKCkgY29uc3QKKwl7CisJCXJldHVybiggKG1BbGdlYnJhUXVhbGlmaWVyID09IEFMR0VCUkFfQVNTT0MgICAgICApIHx8CisJCQkJKG1BbGdlYnJhUXVhbGlmaWVyID09IEFMR0VCUkFfQVNTT0NfQ09NTSApIHx8CisJCQkJKG1BbGdlYnJhUXVhbGlmaWVyID09IEFMR0VCUkFfTEVGVF9BU1NPQyApIHx8CisJCQkJKG1BbGdlYnJhUXVhbGlmaWVyID09IEFMR0VCUkFfUklHSFRfQVNTT0MpICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNDb21tdXRhdGl2ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIChtQWxnZWJyYVF1YWxpZmllciA9PSBBTEdFQlJBX0NPTU0gICAgICApIHx8CisJCQkJKG1BbGdlYnJhUXVhbGlmaWVyID09IEFMR0VCUkFfQVNTT0NfQ09NTSkgKTsKKwl9CisKKwkvKgorCSAqIEdFVFRFUgorCSAqIHRoZSBOQU1FCisJICovCisKKwlpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcgJiBzdGFuZGFyZFN5bWJvbCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1TdGFuZGFyZFN5bWJvbCApOworCX0KKworCWlubGluZSBjb25zdCBzdGQ6OnN0cmluZyAmIG1peGZpeFN5bnRheCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1TeW50YXhNSVhGSVggKTsKKwl9CisKKwlpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcgJiBxZXBjYWRTeW1ib2woKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtU3ltYm9sUUVQQ0FEICk7CisJfQorCisKKwkvKgorCSAqIEdFVFRFUgorCSAqIG1GaXhOb3RhdGlvbgorCSAqLworCWlubGluZSBGSVhfTk9UQVRJT04gZ2V0Rml4Tm90YXRpb24oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRml4Tm90YXRpb24gKTsKKwl9CisKKworCS8qKgorCSAqIENPTVBBUklTT04gRVFVQUwKKwkgKiBmb3IgbU9wZXJhdG9yCisJICovCisJaW5saW5lIGJvb2wgaXNFUShPcGVyYXRvciAqIG9wKSBjb25zdAorCXsKKwkJcmV0dXJuKCAodGhpcyA9PSBvcCkgfHwgKG1Bdm1PcENvZGUgPT0gb3AtPm1Bdm1PcENvZGUpICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNORVEoT3BlcmF0b3IgKiBvcCkgY29uc3QKKwl7CisJCXJldHVybiggKHRoaXMgIT0gb3ApICYmIChtQXZtT3BDb2RlICE9IG9wLT5tQXZtT3BDb2RlKSApOworCX0KKworCWlubGluZSBib29sIGlzT3BDb2RlKEFWTV9PUENPREUgb3BDb2RlKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQXZtT3BDb2RlID09IG9wQ29kZSApOworCX0KKworCWlubGluZSBib29sIGhhc09wQ29kZShBVk1fT1BDT0RFIG9wQ29kZTEsIEFWTV9PUENPREUgb3BDb2RlMikgY29uc3QKKwl7CisJCXJldHVybiggKG1Bdm1PcENvZGUgPT0gb3BDb2RlMSkgfHwKKwkJCQkobUF2bU9wQ29kZSA9PSBvcENvZGUyKSApOworCX0KKworCWlubGluZSBib29sIGhhc09wQ29kZShBVk1fT1BDT0RFIG9wQ29kZTEsCisJCQlBVk1fT1BDT0RFIG9wQ29kZTIsIEFWTV9PUENPREUgb3BDb2RlMykgY29uc3QKKwl7CisJCXJldHVybiggKG1Bdm1PcENvZGUgPT0gb3BDb2RlMSkgfHwKKwkJCQkobUF2bU9wQ29kZSA9PSBvcENvZGUyKSB8fAorCQkJCShtQXZtT3BDb2RlID09IG9wQ29kZTMpICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNPcENvZGUoT3BlcmF0b3IgKiBvcCkgY29uc3QKKwl7CisJCXJldHVybiggbUF2bU9wQ29kZSA9PSBvcC0+bUF2bU9wQ29kZSApOworCX0KKworCWlubGluZSBib29sIGlzT3B0aW1pemVkT3BDb2RlKEFWTV9PUENPREUgb3BDb2RlKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtT3B0aW1pemVkT3BDb2RlID09IG9wQ29kZSApOworCX0KKworCisJaW5saW5lIGJvb2wgaXNub3RPcENvZGUoQVZNX09QQ09ERSBvcENvZGUpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Bdm1PcENvZGUgIT0gb3BDb2RlICk7CisJfQorCisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJaW5saW5lIHZpcnR1YWwgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCW9zIDw8IFRBQjsKKwkJdG9TdHJlYW0ob3MsIFBSSU5UX09QRVJBVE9SX1NZTUJPTF9GT1JNQVQpOworCQlvcyA8PCBFT0w7CisJfQorCisJdmlydHVhbCB2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG9zLAorCQkJRU5VTV9QUklOVF9PUEVSQVRPUl9GT1JNQVQgcHJpbnRGb3JtYXQpIGNvbnN0OworCisKKwlpbmxpbmUgdmlydHVhbCBzdGQ6OnN0cmluZyB0b1N0cmluZygKKwkJCWNvbnN0IEF2bUluZGVudCAmIGluZGVudCA9IEFWTV9UQUJfSU5ERU5UKSBjb25zdAorCXsKKwkJU3RyaW5nT3V0U3RyZWFtIG9zczsKKworCQlvc3MgPDwgVEFCOworCQl0b1N0cmVhbShvc3MsIFBSSU5UX09QRVJBVE9SX1NZTUJPTF9GT1JNQVQpOworCQlvc3MgPDwgRU9MOworCisJCXJldHVybiggb3NzLnN0cigpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgc3RyKCkgY29uc3QKKwl7CisJCXJldHVybiggbVN0YW5kYXJkU3ltYm9sICk7CisJfQorCisKKwlpbmxpbmUgc3RkOjpzdHJpbmcgc3RyT3AoRU5VTV9QUklOVF9PUEVSQVRPUl9GT1JNQVQKKwkJCXByaW50Rm9ybWF0ID0gUFJJTlRfT1BFUkFUT1JfU1lNQk9MX0ZPUk1BVCkgY29uc3QKKwl7CisJCVN0cmluZ091dFN0cmVhbSBvc3M7CisKKwkJdG9TdHJlYW0ob3NzLCBwcmludEZvcm1hdCk7CisKKwkJcmV0dXJuKCBvc3Muc3RyKCkgKTsKKwl9CisKKworCWlubGluZSBjb25zdCBzdGQ6OnN0cmluZyAmIHN0clNNVCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1TdGFuZGFyZFN5bWJvbCApOworCX0KKworfTsKKworCit9CisKKyNlbmRpZiAvKk9QRVJBVE9SX0hfKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9vcGVyYXRvci9PcGVyYXRvckxpYi5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvb3BlcmF0b3IvT3BlcmF0b3JMaWIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3Y2EyNzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvb3BlcmF0b3IvT3BlcmF0b3JMaWIuY3BwCkBAIC0wLDAgKzEsMzI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjIganVpbiAyMDEwCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJPcGVyYXRvckxpYi5oIgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQXZtQ29kZS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvKioKKyAqIFRFU1QKKyAqLworYm9vbCBPcGVyYXRvckxpYjo6aXNQcm9wb3NpdGlvbmFsKEFWTV9PUENPREUgb3Bjb2RlKQoreworCXN3aXRjaCggb3Bjb2RlICkKKwl7CisJCS8qCisJCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQkgKiBBVk0gUFJPUE9TSVRJT05BTCBFWFBSRVNTSU9OCisJCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQkgKi8KKwkJY2FzZSBBVk1fT1BDT0RFX05PVDoKKworCQljYXNlIEFWTV9PUENPREVfQU5EOgorCQljYXNlIEFWTV9PUENPREVfTkFORDoKKworCQljYXNlIEFWTV9PUENPREVfWEFORDoKKworCQljYXNlIEFWTV9PUENPREVfT1I6CisJCWNhc2UgQVZNX09QQ09ERV9OT1I6CisKKwkJY2FzZSBBVk1fT1BDT0RFX1hPUjoKKwkJY2FzZSBBVk1fT1BDT0RFX1hOT1I6CisJCXsKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorfQorCisKKworc3RkOjpzdHJpbmcgT3BlcmF0b3JMaWI6OnRvX3N0cmluZyhGSVhfTk9UQVRJT04gZml4KQoreworCXN3aXRjaCggZml4ICkKKwl7CisJCWNhc2UgTk9UQVRJT05fSU5GSVggICAgOiByZXR1cm4oICJpbmZpeCIgICAgICk7CisJCWNhc2UgTk9UQVRJT05fUFJFRklYICAgOiByZXR1cm4oICJwcmVmaXgiICAgICk7CisJCWNhc2UgTk9UQVRJT05fU1VGRklYICAgOiByZXR1cm4oICJzdWZmaXgiICAgICk7CisJCWNhc2UgTk9UQVRJT05fRlVOQ1RJT04gOiByZXR1cm4oICJmdW5jdGlvbiIgICk7CisJCWNhc2UgTk9UQVRJT05fU1RBVEVNRU5UOiByZXR1cm4oICJzdGF0ZW1lbnQiICk7CisKKwkJZGVmYXVsdDogcmV0dXJuKCAiZml4I3Vua25vd24iICk7CisJfQorfQorCitGSVhfTk9UQVRJT04gT3BlcmF0b3JMaWI6OnRvX2ZpeCgKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBmaXgsIEZJWF9OT1RBVElPTiBkZWZhdWx0Rml4KQoreworCWlmKCBmaXggPT0gImluZml4IiAgICAgKSAgcmV0dXJuKCBOT1RBVElPTl9JTkZJWCAgICAgKTsKKwlpZiggZml4ID09ICJwcmVmaXgiICAgICkgIHJldHVybiggTk9UQVRJT05fUFJFRklYICAgICk7CisJaWYoIGZpeCA9PSAic3VmZml4IiAgICApICByZXR1cm4oIE5PVEFUSU9OX1NVRkZJWCAgICApOworCWlmKCBmaXggPT0gImZ1bmN0aW9uIiAgKSAgcmV0dXJuKCBOT1RBVElPTl9GVU5DVElPTiAgKTsKKwlpZiggZml4ID09ICJzdGF0ZW1lbnQiICkgIHJldHVybiggTk9UQVRJT05fU1RBVEVNRU5UICk7CisKKwlyZXR1cm4oIGRlZmF1bHRGaXggKTsKK30KKworCitzdGQ6OnN0cmluZyBPcGVyYXRvckxpYjo6dG9fc3RyaW5nKEFWTV9PUENPREUgb3Bjb2RlLAorCQkJRU5VTV9QUklOVF9PUEVSQVRPUl9GT1JNQVQgcHJpbnRGb3JtYXQpCit7CisJc3dpdGNoKCBvcGNvZGUgKQorCXsKKwkJY2FzZSBBVk1fT1BDT0RFX0FTU0lHTjogICAgICAgIHJldHVybiggIjo9IiAgKTsKKwkJY2FzZSBBVk1fT1BDT0RFX0FTU0lHTl9BRlRFUjogIHJldHVybiggIj06IiAgKTsKKwkJY2FzZSBBVk1fT1BDT0RFX0FTU0lHTl9NQUNSTzogIHJldHVybiggIjo6PSIgKTsKKworCQljYXNlIEFWTV9PUENPREVfRVE6ICAgICAgcmV0dXJuKCAiPSIgKTsKKworCQljYXNlIEFWTV9PUENPREVfTkVROiAgICAgcmV0dXJuKCAiIT0iICApOworCQljYXNlIEFWTV9PUENPREVfU0VROiAgICAgcmV0dXJuKCAiPT09IiApOworCQljYXNlIEFWTV9PUENPREVfTlNFUTogICAgcmV0dXJuKCAiPS89IiApOworCisJCWNhc2UgQVZNX09QQ09ERV9CQU5EOiAgICByZXR1cm4oICImIiApOworCQljYXNlIEFWTV9PUENPREVfQk9SOiAgICAgcmV0dXJuKCAifCIgKTsKKwkJY2FzZSBBVk1fT1BDT0RFX0JYT1I6ICAgIHJldHVybiggIl4iICk7CisJCWNhc2UgQVZNX09QQ09ERV9CTk9UOiAgICByZXR1cm4oICJ+IiApOworCisJCWNhc2UgQVZNX09QQ09ERV9QTFVTIDogICByZXR1cm4oICIrIiApOworCQljYXNlIEFWTV9PUENPREVfTUlOVVM6ICAgcmV0dXJuKCAiLSIgKTsKKwkJY2FzZSBBVk1fT1BDT0RFX1VNSU5VUzogIHJldHVybiggIi0iICk7CisJCWNhc2UgQVZNX09QQ09ERV9NT0Q6ICAgICByZXR1cm4oICIlIiApOworCQljYXNlIEFWTV9PUENPREVfTVVMVDogICAgcmV0dXJuKCAiKiIgKTsKKwkJY2FzZSBBVk1fT1BDT0RFX0RJVjogICAgIHJldHVybiggIi8iICk7CisJCWNhc2UgQVZNX09QQ09ERV9QT1c6ICAgICByZXR1cm4oICJeIiApOworCisJCWNhc2UgQVZNX09QQ09ERV9MVDogICAgICByZXR1cm4oICI8IiAgKTsKKwkJY2FzZSBBVk1fT1BDT0RFX0xURTogICAgIHJldHVybiggIjw9IiApOworCQljYXNlIEFWTV9PUENPREVfR1Q6ICAgICAgcmV0dXJuKCAiPiIgICk7CisJCWNhc2UgQVZNX09QQ09ERV9HVEU6ICAgICByZXR1cm4oICI+PSIgKTsKKworCQljYXNlIEFWTV9PUENPREVfTk9UOiAgICAgcmV0dXJuKCAibm90IiApOworCQljYXNlIEFWTV9PUENPREVfQU5EOiAgICAgcmV0dXJuKCAiYW5kIiApOworCQljYXNlIEFWTV9PUENPREVfT1IgOiAgICAgcmV0dXJuKCAib3IiICApOworCQljYXNlIEFWTV9PUENPREVfWE9SOiAgICAgcmV0dXJuKCAieG9yIiApOworCisJCWNhc2UgQVZNX09QQ09ERV9TRVFVRU5DRSAgICAgICAgOiAgcmV0dXJuKCAifDt8IiAgICAgKTsKKwkJY2FzZSBBVk1fT1BDT0RFX0FUT01JQ19TRVFVRU5DRSA6ICByZXR1cm4oICJ8wqd8IiAgICAgKTsKKwkJY2FzZSBBVk1fT1BDT0RFX1NFUVVFTkNFX1dFQUsgICA6ICByZXR1cm4oICJ8Ozt8IiAgICApOworCisJCWNhc2UgQVZNX09QQ09ERV9JTlRFUkxFQVZJTkcgICAgOiAgcmV0dXJuKCAifGl8IiAgICAgKTsKKworCQljYXNlIEFWTV9PUENPREVfUFJJT1JfR1QgICAgICAgIDogIHJldHVybiggInw8fCIgICAgICk7CisKKwkJY2FzZSBBVk1fT1BDT0RFX1JFR0VYICAgICAgICAgICA6ICByZXR1cm4oICJ8cmVnZXh8IiApOworCisJCWRlZmF1bHQ6ICByZXR1cm4oICJvcGNvZGUjdW5rbm93biIgKTsKKwl9Cit9CisKKworQVZNX09QQ09ERSBPcGVyYXRvckxpYjo6dG9PcGNvZGUoCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgb3AsIEFWTV9PUENPREUgZGVmYXVsdE9wY29kZSkKK3sKKwlpZiggb3AgPT0gIk5PVCIgKSAgcmV0dXJuKCBBVk1fT1BDT0RFX05PVCApOworCWlmKCBvcCA9PSAiQU5EIiApICByZXR1cm4oIEFWTV9PUENPREVfQU5EICk7CisJaWYoIG9wID09ICJPUiIgICkgIHJldHVybiggQVZNX09QQ09ERV9PUiAgKTsKKwlpZiggb3AgPT0gIlhPUiIgKSAgcmV0dXJuKCBBVk1fT1BDT0RFX1hPUiApOworCisJaWYoIG9wID09ICJ8O3wiICApICByZXR1cm4oIEFWTV9PUENPREVfU0VRVUVOQ0UgKTsKKwlpZiggb3AgPT0gInzCp3wiICApICByZXR1cm4oIEFWTV9PUENPREVfQVRPTUlDX1NFUVVFTkNFICk7CisJaWYoIG9wID09ICJ8Ozt8IiApICByZXR1cm4oIEFWTV9PUENPREVfU0VRVUVOQ0VfV0VBSyApOworCisJaWYoIG9wID09ICJ8aXwiICApICByZXR1cm4oIEFWTV9PUENPREVfSU5URVJMRUFWSU5HICk7CisKKwlpZiggb3AgPT0gInw8fCIgICkgIHJldHVybiggQVZNX09QQ09ERV9QUklPUl9HVCApOworCisJaWYoIG9wID09ICJ8cmVnZXh8IiAgKSAgcmV0dXJuKCBBVk1fT1BDT0RFX1JFR0VYICk7CisKKwlyZXR1cm4oIGRlZmF1bHRPcGNvZGUgKTsKK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBPcGVyYXRvckZhbWlseQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworSVN0YXRlbWVudEZhbWlseTo6YXZtX29wY29kZV9mYW1pbHkKK0lTdGF0ZW1lbnRGYW1pbHk6OmNvbXB1dGVTdGF0ZW1lbnRGYW1pbHkoQVZNX09QQ09ERSBvcGNvZGUpCit7CisJc3dpdGNoKCBvcGNvZGUgKQorCXsKKy8vCQljYXNlIEFWTV9PUENPREVfSUYgICAgICAgICAgICAgICA6CisvLwkJY2FzZSBBVk1fT1BDT0RFX0lGRSAgICAgICAgICAgICAgOgorLy8KKy8vCQljYXNlIEFWTV9PUENPREVfV0hFUkUgICAgICAgICAgICA6CisvLwkJY2FzZSBBVk1fT1BDT0RFX1dIRVJFX0VMU0UgICAgICAgOgorLy8KKy8vCQljYXNlIEFWTV9PUENPREVfRk9SICAgICAgICAgICAgICA6CisvLwkJY2FzZSBBVk1fT1BDT0RFX0ZPUkVBQ0ggICAgICAgICAgOgorLy8JCWNhc2UgQVZNX09QQ09ERV9XSElMRV9ETyAgICAgICAgIDoKKy8vCQljYXNlIEFWTV9PUENPREVfRE9fV0hJTEUgICAgICAgICA6CisKKwkJY2FzZSBBVk1fT1BDT0RFX0dVQVJEICAgICAgICAgICAgOgorCQljYXNlIEFWTV9PUENPREVfVElNRURfR1VBUkQgICAgICA6CisJCWNhc2UgQVZNX09QQ09ERV9FVkVOVCAgICAgICAgICAgIDoKKwkJY2FzZSBBVk1fT1BDT0RFX0NIRUNLX1NBVCAgICAgICAgOgorCQkJcmV0dXJuKCBBVk1fU1RBVEVNRU5UX0dVQVJEX0ZBTUlMWSApOworCisKKwkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUICAgICAgICAgICAgOgorCQljYXNlIEFWTV9PUENPREVfSU5QVVRfRlJPTSAgICAgICA6CisJCQlyZXR1cm4gQVZNX1NUQVRFTUVOVF9JTlBVVF9GQU1JTFk7CisKKwkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUX0VOViAgICAgICAgOgorCQkJcmV0dXJuIEFWTV9TVEFURU1FTlRfSU5QVVRfRU5WX0ZBTUlMWTsKKworCQljYXNlIEFWTV9PUENPREVfSU5QVVRfUkRWICAgICAgICA6CisJCQlyZXR1cm4gQVZNX1NUQVRFTUVOVF9JTlBVVF9TWU5DX0ZBTUlMWTsKKworCQljYXNlIEFWTV9PUENPREVfSU5QVVRfTVVMVElfUkRWICA6CisJCQlyZXR1cm4gQVZNX1NUQVRFTUVOVF9JTlBVVF9TWU5DX0ZBTUlMWTsKKworCQljYXNlIEFWTV9PUENPREVfSU5QVVRfQlVGRkVSICAgICA6CisJCQlyZXR1cm4gQVZNX1NUQVRFTUVOVF9JTlBVVF9BU1lOQ19GQU1JTFk7CisJCWNhc2UgQVZNX09QQ09ERV9JTlBVVF9CUk9BRENBU1QgIDoKKwkJCXJldHVybiBBVk1fU1RBVEVNRU5UX0lOUFVUX0FTWU5DX0ZBTUlMWTsKKworCisJCWNhc2UgQVZNX09QQ09ERV9PVVRQVVQgICAgICAgICAgIDoKKwkJY2FzZSBBVk1fT1BDT0RFX09VVFBVVF9UTyAgICAgICAgOgorCQkJcmV0dXJuIEFWTV9TVEFURU1FTlRfT1VUUFVUX0ZBTUlMWTsKKworCQljYXNlIEFWTV9PUENPREVfT1VUUFVUX0VOViAgICAgICA6CisJCQlyZXR1cm4gQVZNX1NUQVRFTUVOVF9PVVRQVVRfRU5WX0ZBTUlMWTsKKworCQljYXNlIEFWTV9PUENPREVfT1VUUFVUX1JEViAgICAgICA6CisJCQlyZXR1cm4gQVZNX1NUQVRFTUVOVF9PVVRQVVRfU1lOQ19GQU1JTFk7CisKKwkJY2FzZSBBVk1fT1BDT0RFX09VVFBVVF9NVUxUSV9SRFYgOgorCQkJcmV0dXJuIEFWTV9TVEFURU1FTlRfT1VUUFVUX1NZTkNfRkFNSUxZOworCisJCWNhc2UgQVZNX09QQ09ERV9PVVRQVVRfQlVGRkVSICAgIDoKKwkJCXJldHVybiBBVk1fU1RBVEVNRU5UX09VVFBVVF9BU1lOQ19GQU1JTFk7CisKKwkJY2FzZSBBVk1fT1BDT0RFX09VVFBVVF9CUk9BRENBU1QgOgorCQkJcmV0dXJuIEFWTV9TVEFURU1FTlRfT1VUUFVUX0FTWU5DX0ZBTUlMWTsKKworCQljYXNlIEFWTV9PUENPREVfQVNTSUdOICAgICAgICAgICA6CisJCWNhc2UgQVZNX09QQ09ERV9BU1NJR05fQUZURVIgICAgIDoKKwkJY2FzZSBBVk1fT1BDT0RFX0FTU0lHTl9PUCAgICAgICAgOgorCQljYXNlIEFWTV9PUENPREVfQVNTSUdOX09QX0FGVEVSICA6CisJCWNhc2UgQVZNX09QQ09ERV9BU1NJR05fUkVGICAgICAgIDoKKwkJY2FzZSBBVk1fT1BDT0RFX0FTU0lHTl9NQUNSTyAgICAgOgorCQljYXNlIEFWTV9PUENPREVfQVNTSUdOX05FV0ZSRVNIICA6CisJCWNhc2UgQVZNX09QQ09ERV9BU1NJR05fUkVTRVQgICAgIDoKKwkJCXJldHVybiBBVk1fU1RBVEVNRU5UX0JBU0lDX0ZBTUlMWTsKKworCQlkZWZhdWx0OiByZXR1cm4gQVZNX1NUQVRFTUVOVF9VTkRFRklORURfRkFNSUxZOworCX0KK30KKworCitJU3RhdGVtZW50RmFtaWx5Ojphdm1fb3Bjb2RlX2ZhbWlseQorSVN0YXRlbWVudEZhbWlseTo6Y29tcHV0ZVN0YXRlbWVudEZhbWlseShBdm1Db2RlICogYUNvZGUpCit7CisJYXZtX29wY29kZV9mYW1pbHkgb3Bjb2RlRmFtaWx5ID0KKwkJCWNvbXB1dGVTdGF0ZW1lbnRGYW1pbHkoIGFDb2RlLT5nZXRPcHRpbWl6ZWRPcENvZGUoKSApOworCisJQXZtQ29kZTo6aXRlcmF0b3IgaXQgPSBhQ29kZS0+YmVnaW4oKTsKKwlBdm1Db2RlOjppdGVyYXRvciBpdEVuZCA9IGFDb2RlLT5lbmQoKTsKKwlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwl7CisJCWlmKCAoKml0KS5pczwgQXZtQ29kZSA+KCkgKQorCQl7CisJCQlvcGNvZGVGYW1pbHkgPSBvcGNvZGVGYW1pbHkgfAorCQkJCQljb21wdXRlU3RhdGVtZW50RmFtaWx5KCAoKml0KS50b19wdHI8IEF2bUNvZGUgPigpICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIG9wY29kZUZhbWlseSApOworfQorCisKK3N0ZDo6c3RyaW5nIElTdGF0ZW1lbnRGYW1pbHk6OnN0clN0YXRlbWVudEZhbWlseShhdm1fb3Bjb2RlX2ZhbWlseSBtYXNrKSBjb25zdAoreworCXN0ZDo6b3N0cmluZ3N0cmVhbSBvc3NGYW1pbHk7CisKKwljb25zdCBzdGQ6OnN0cmluZyBTRVBBUkFUT1IgPSAiIHwgIjsKKwlzdGQ6OnN0cmluZyBzZXAgPSAiIjsKKworCWF2bV9vcGNvZGVfZmFtaWx5IG9wY29kZUZhbWlseSA9IHRoZVN0YXRlbWVudEZhbWlseSAmIG1hc2s7CisKKwlpZiggb3Bjb2RlRmFtaWx5ID09IEFWTV9TVEFURU1FTlRfVU5ERUZJTkVEX0ZBTUlMWSApCisJeworCQlyZXR1cm4oICI8P29wY29kZT4iICk7CisJfQorCisJaWYoIChvcGNvZGVGYW1pbHkgJiBBVk1fU1RBVEVNRU5UX0JBU0lDX0ZBTUlMWSkgIT0gMCApCisJeworCQlvc3NGYW1pbHkgPDwgc2VwIDw8ICJiYXNpYyI7IHNlcCA9IFNFUEFSQVRPUjsKKwl9CisJaWYoIChvcGNvZGVGYW1pbHkgJiBBVk1fU1RBVEVNRU5UX0dVQVJEX0ZBTUlMWSkgIT0gMCApCisJeworCQlvc3NGYW1pbHkgPDwgc2VwIDw8ICJndWFyZCI7IHNlcCA9IFNFUEFSQVRPUjsKKwl9CisKKwlpZiggKG9wY29kZUZhbWlseSAmIEFWTV9TVEFURU1FTlRfSU5QVVRfRkFNSUxZKSAhPSAwICkKKwl7CisJCW9zc0ZhbWlseSA8PCBzZXAgPDwgImlucHV0Ijsgc2VwID0gU0VQQVJBVE9SOworCX0KKwlpZiggKG9wY29kZUZhbWlseSAmIEFWTV9TVEFURU1FTlRfSU5QVVRfRU5WX0ZBTUlMWSkgIT0gMCApCisJeworCQlvc3NGYW1pbHkgPDwgc2VwIDw8ICJpbnB1dCNlbnYiOyBzZXAgPSBTRVBBUkFUT1I7CisJfQorCWlmKCAob3Bjb2RlRmFtaWx5ICYgQVZNX1NUQVRFTUVOVF9JTlBVVF9TWU5DX0ZBTUlMWSkgIT0gMCApCisJeworCQlvc3NGYW1pbHkgPDwgc2VwIDw8ICJpbnB1dCNzeW5jIjsgc2VwID0gU0VQQVJBVE9SOworCX0KKwlpZiggKG9wY29kZUZhbWlseSAmIEFWTV9TVEFURU1FTlRfSU5QVVRfQVNZTkNfRkFNSUxZKSAhPSAwICkKKwl7CisJCW9zc0ZhbWlseSA8PCBzZXAgPDwgImlucHV0I2FzeW5jIjsgc2VwID0gU0VQQVJBVE9SOworCX0KKworCWlmKCAob3Bjb2RlRmFtaWx5ICYgQVZNX1NUQVRFTUVOVF9PVVRQVVRfRkFNSUxZKSAhPSAwICkKKwl7CisJCW9zc0ZhbWlseSA8PCBzZXAgPDwgIm91dHB1dCI7IHNlcCA9IFNFUEFSQVRPUjsKKwl9CisJaWYoIChvcGNvZGVGYW1pbHkgJiBBVk1fU1RBVEVNRU5UX09VVFBVVF9FTlZfRkFNSUxZKSAhPSAwICkKKwl7CisJCW9zc0ZhbWlseSA8PCBzZXAgPDwgIm91dHB1dCNlbnYiOyBzZXAgPSBTRVBBUkFUT1I7CisJfQorCWlmKCAob3Bjb2RlRmFtaWx5ICYgQVZNX1NUQVRFTUVOVF9PVVRQVVRfU1lOQ19GQU1JTFkpICE9IDAgKQorCXsKKwkJb3NzRmFtaWx5IDw8IHNlcCA8PCAib3V0cHV0I3N5bmMiOyBzZXAgPSBTRVBBUkFUT1I7CisJfQorCWlmKCAob3Bjb2RlRmFtaWx5ICYgQVZNX1NUQVRFTUVOVF9PVVRQVVRfQVNZTkNfRkFNSUxZKSAhPSAwICkKKwl7CisJCW9zc0ZhbWlseSA8PCBzZXAgPDwgIm91dHB1dCNhc3luYyI7IHNlcCA9IFNFUEFSQVRPUjsKKwl9CisKKworCXJldHVybiggb3NzRmFtaWx5LnN0cigpICk7Cit9CisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL29wZXJhdG9yL09wZXJhdG9yTGliLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvb3BlcmF0b3IvT3BlcmF0b3JMaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWMzZjIxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL29wZXJhdG9yL09wZXJhdG9yTGliLmgKQEAgLTAsMCArMSw4MzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyMiBqdWluIDIwMTAKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBPUEVSQVRPUkxJQl9IXworI2RlZmluZSBPUEVSQVRPUkxJQl9IXworCisjaW5jbHVkZSA8dXRpbC9hdm1fbnVtZXJpYy5oPgorI2luY2x1ZGUgPHV0aWwvYXZtX3N0cmluZy5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvKioKKyAqIEVOVU1FUkFURSBERUNMQVJBVElPTlMKKyAqLworZW51bSBBTEdFQlJBX1FVQUxJRklFUgoreworCUFMR0VCUkFfU1RELAorCisJQUxHRUJSQV9BU1NPQywKKwlBTEdFQlJBX0xFRlRfQVNTT0MsCisJQUxHRUJSQV9SSUdIVF9BU1NPQywKKworCUFMR0VCUkFfQ09NTSwKKworCUFMR0VCUkFfQVNTT0NfQ09NTQorfTsKKworCitlbnVtIEZJWF9OT1RBVElPTgoreworCU5PVEFUSU9OX0lORklYLAorCU5PVEFUSU9OX1BSRUZJWCwKKwlOT1RBVElPTl9TVUZGSVgsCisKKwlOT1RBVElPTl9GVU5DVElPTiwKKworCU5PVEFUSU9OX1NUQVRFTUVOVAorfTsKKworCitlbnVtIEFWTV9PUENPREUKK3sKKwlBVk1fT1BDT0RFX05VTEwsCisKKwkvKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBBVk0gTk9QIFNUQVRFTUVOVAorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKi8KKwlBVk1fT1BDT0RFX05PUCwKKworCUFWTV9PUENPREVfRkFJTEVELAorCUFWTV9PUENPREVfVEhST1csCisKKworCS8qCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIEFWTSBNRVRBIFNUQVRFTUVOVAorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKi8KKwlBVk1fT1BDT0RFX0lORk9STUFMLAorCisJQVZNX09QQ09ERV9UUkFDRSwKKworCUFWTV9PUENPREVfREVCVUcsCisKKwlBVk1fT1BDT0RFX0NPTU1FTlQsCisKKwlBVk1fT1BDT0RFX1FVT1RFLAorCisJQVZNX09QQ09ERV9NRVRBX0VWQUwsCisJQVZNX09QQ09ERV9NRVRBX1JVTiwKKworCisJLyoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogQVZNIFVGSSBTVEFURU1FTlQKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJQVZNX09QQ09ERV9VRkksCisKKwkvKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBBVk0gRk9STSBDT05TVFJVQ1RPUiBTVEFURU1FTlQKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJQVZNX09QQ09ERV9DVE9SLAorCisJLyoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogQVZNIEZPUk0gUkVHRVggU1RBVEVNRU5UCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCUFWTV9PUENPREVfUkVHRVgsCisKKworCS8qCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIEFWTSBNQUNISU5FIE1BTkFHSU5HCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCUFWTV9PUENPREVfQ09OVEVYVF9TV0lUQ0hFUiwKKworCUFWTV9PUENPREVfSU5JVCwKKwlBVk1fT1BDT0RFX0ZJTkFMLAorCUFWTV9PUENPREVfREVTVFJPWSwKKworCUFWTV9PUENPREVfU1RBUlQsCisJQVZNX09QQ09ERV9SRVNUQVJULAorCUFWTV9PUENPREVfU1RPUCwKKworCUFWTV9PUENPREVfV0FJVCwKKworCUFWTV9PUENPREVfU1VTUEVORCwKKwlBVk1fT1BDT0RFX1JFU1VNRSwKKworCUFWTV9PUENPREVfSUVOQUJMRV9JTlZPS0UsCisJQVZNX09QQ09ERV9FTkFCTEVfSU5WT0tFLAorCUFWTV9PUENPREVfRU5BQkxFX1NFVCwKKworCUFWTV9PUENPREVfSURJU0FCTEVfSU5WT0tFLAorCUFWTV9PUENPREVfRElTQUJMRV9JTlZPS0UsCisJQVZNX09QQ09ERV9ESVNBQkxFX1NFVCwKKwlBVk1fT1BDT0RFX0RJU0FCTEVfQ0hJTEQsCisJQVZNX09QQ09ERV9ESVNBQkxFX1NFTEYsCisJQVZNX09QQ09ERV9ESVNBQkxFX1NFTFZFUywKKworCUFWTV9PUENPREVfSUFCT1JUX0lOVk9LRSwKKwlBVk1fT1BDT0RFX0FCT1JUX0lOVk9LRSwKKwlBVk1fT1BDT0RFX0FCT1JUX1NFVCwKKwlBVk1fT1BDT0RFX0FCT1JUX0NISUxELAorCUFWTV9PUENPREVfQUJPUlRfU0VMRiwKKwlBVk1fT1BDT0RFX0FCT1JUX1NFTFZFUywKKworCUFWTV9PUENPREVfSElTVE9SWV9DTEVBUiwKKwlBVk1fT1BDT0RFX0RFRVBfSElTVE9SWV9JTlZPS0UsCisJQVZNX09QQ09ERV9TSEFMTE9XX0hJU1RPUllfSU5WT0tFLAorCisJQVZNX09QQ09ERV9JUlVOLAorCUFWTV9PUENPREVfUlVOLAorCUFWTV9PUENPREVfUlRDLAorCisJQVZNX09QQ09ERV9TQ0hFRFVMRV9JTlZPS0UsCisJQVZNX09QQ09ERV9TQ0hFRFVMRV9HRVQsCisJQVZNX09QQ09ERV9TQ0hFRFVMRV9JTiwKKwlBVk1fT1BDT0RFX1NDSEVEVUxFX1NFVCwKKworCUFWTV9PUENPREVfREVGRVJfSU5WT0tFLAorCUFWTV9PUENPREVfREVGRVJfR0VULAorCUFWTV9PUENPREVfREVGRVJfU0VULAorCisKKwlBVk1fT1BDT0RFX0dPVE8sCisKKwlBVk1fT1BDT0RFX0ZPUkssCisJQVZNX09QQ09ERV9KT0lOLAorCisJQVZNX09QQ09ERV9JTlBVVF9FTkFCTEVELAorCisJQVZNX09QQ09ERV9SRFYsCisKKwlBVk1fT1BDT0RFX1NZTkNIUk9OSVpFLAorCisKKwlBVk1fT1BDT0RFX0lOVk9LRV9ORVcsCisKKwlBVk1fT1BDT0RFX0lOVk9LRV9ST1VUSU5FLAorCisJQVZNX09QQ09ERV9JTlZPS0VfVFJBTlNJVElPTiwKKworCUFWTV9PUENPREVfSU5WT0tFX01FVEhPRCwKKwlBVk1fT1BDT0RFX0lOVk9LRV9QUk9HUkFNLAorCUFWTV9PUENPREVfSU5WT0tFX0ZVTkNUSU9OLAorCisJQVZNX09QQ09ERV9JTlZPS0VfTEFNQkRBX0FQUExZLAorCUFWTV9PUENPREVfSU5WT0tFX0xBTUJEQV9MRVQsCisKKworCS8qCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIEFWTSBNQUNISU5FIFNUQVRVUworCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKi8KKwlBVk1fT1BDT0RFX1NUQVRVU19XQVMsCisJQVZNX09QQ09ERV9TVEFUVVNfSVMsCisJQVZNX09QQ09ERV9TVEFUVVNfQkVJTkcsCisJQVZNX09QQ09ERV9TVEFUVVNfV0lMTCwKKworCUFWTV9PUENPREVfQ0hBTkdFRCwKKwlBVk1fT1BDT0RFX0NIQU5HRURfVE8sCisKKworCS8qCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIEFWTSBQUk9HUkFNIFNDSEVEVUxJTkcKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJQVZNX09QQ09ERV9BU1lOQ0hST05PVVMsCisJQVZNX09QQ09ERV9TVFJPTkdfU1lOQ0hST05PVVMsCisJQVZNX09QQ09ERV9XRUFLX1NZTkNIUk9OT1VTLAorCisJQVZNX09QQ09ERV9JTlRFUkxFQVZJTkcsCisJQVZNX09QQ09ERV9QQVJUSUFMX09SREVSX1JFRFVDVElPTiwKKworCisJQVZNX09QQ09ERV9QQVJBTExFTCwKKworCS8vIE9wdGltaXplZCB2ZXJzaW9uIG9mIGNvbmN1cnJlbmN5IGZvciBSRFYgc3luY2hyb25pemF0aW9uCisJQVZNX09QQ09ERV9SRFZfQVNZTkNIUk9OT1VTLAorCUFWTV9PUENPREVfUkRWX1NUUk9OR19TWU5DSFJPTk9VUywKKwlBVk1fT1BDT0RFX1JEVl9XRUFLX1NZTkNIUk9OT1VTLAorCisJQVZNX09QQ09ERV9SRFZfSU5URVJMRUFWSU5HLAorCUFWTV9PUENPREVfUkRWX1BBUlRJQUxfT1JERVJfUkVEVUNUSU9OLAorCisJQVZNX09QQ09ERV9SRFZfUEFSQUxMRUwsCisKKwlBVk1fT1BDT0RFX0VYQ0xVU0lWRSwKKworCUFWTV9PUENPREVfTk9OREVURVJNSU5JU00sCisKKwlBVk1fT1BDT0RFX1BSSU9SX0dULAorCUFWTV9PUENPREVfUFJJT1JfTFQsCisKKwlBVk1fT1BDT0RFX1NDSEVEVUxFX0FORF9USEVOLAorCUFWTV9PUENPREVfU0NIRURVTEVfT1JfRUxTRSwKKworCUFWTV9PUENPREVfQVRPTUlDX1NFUVVFTkNFLAorCisJQVZNX09QQ09ERV9TRVFVRU5DRSwKKwlBVk1fT1BDT0RFX1NFUVVFTkNFX1NJREUsCisJQVZNX09QQ09ERV9TRVFVRU5DRV9XRUFLLAorCisJQVZNX09QQ09ERV9QUk9EVUNULAorCisKKwkvKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBBVk0gQlVGRkVSIE1BTkFHSU5HCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCUFWTV9PUENPREVfVVBEQVRFX0JVRkZFUiwKKworCisJLyoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogTEFNQkRBIFNUQVRFTUVOVAorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKi8KKwlBVk1fT1BDT0RFX0FQUExZLAorCisJQVZNX09QQ09ERV9MQU1CREEsCisKKworCS8qCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIEZVTkNUSU9OQiBTVEFURU1FTlQKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJQVZNX09QQ09ERV9GVU4sCisKKworCS8qCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIExFVCBTVEFURU1FTlQKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJQVZNX09QQ09ERV9MRVQsCisKKwkvKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBMT09LVVAgU1RBVEVNRU5UCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCUFWTV9PUENPREVfTE9PS1VQX0lOVF9FWFQsCisJQVZNX09QQ09ERV9MT09LVVBfSU5ULAorCUFWTV9PUENPREVfTE9PS1VQX05FQVJFU1QsCisJQVZNX09QQ09ERV9MT09LVVBfQkVMT1csCisJQVZNX09QQ09ERV9MT09LVVBfQUJPVkUsCisJQVZNX09QQ09ERV9MT09LVVAyRF9JTlRfRVhULAorCisJLyoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogQVZNIFBSSU1JVElWRSBTVEFURU1FTlQKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJQVZNX09QQ09ERV9BU1NJR04sCisJQVZNX09QQ09ERV9BU1NJR05fQUZURVIsCisJQVZNX09QQ09ERV9BU1NJR05fT1AsCisJQVZNX09QQ09ERV9BU1NJR05fT1BfQUZURVIsCisJQVZNX09QQ09ERV9BU1NJR05fUkVGLAorCUFWTV9PUENPREVfQVNTSUdOX01BQ1JPLAorCisJQVZNX09QQ09ERV9BU1NJR05fTkVXRlJFU0gsCisKKwlBVk1fT1BDT0RFX0FTU0lHTl9SRVNFVCwKKworCisJQVZNX09QQ09ERV9HVUFSRCwKKwlBVk1fT1BDT0RFX1RJTUVEX0dVQVJELAorCisJQVZNX09QQ09ERV9FVkVOVCwKKworCUFWTV9PUENPREVfQ0hFQ0tfU0FULAorCisJQVZNX09QQ09ERV9JTlBVVCwKKwlBVk1fT1BDT0RFX0lOUFVUX0ZST00sCisKKwlBVk1fT1BDT0RFX0lOUFVUX1NBVkUsCisKKwkvLyBPcHRpbWl6ZWQgdmVyc2lvbiBvZiBJTlBVVAorCUFWTV9PUENPREVfSU5QVVRfRU5WLAorCUFWTV9PUENPREVfSU5QVVRfVkFSLAorCUFWTV9PUENPREVfSU5QVVRfRkxPVywKKwlBVk1fT1BDT0RFX0lOUFVUX0JVRkZFUiwKKwlBVk1fT1BDT0RFX0lOUFVUX1JEViwKKwlBVk1fT1BDT0RFX0lOUFVUX01VTFRJX1JEViwKKwlBVk1fT1BDT0RFX0lOUFVUX0JST0FEQ0FTVCwKKwlBVk1fT1BDT0RFX0lOUFVUX0RFTEVHQVRFLAorCisJQVZNX09QQ09ERV9PVVRQVVQsCisJQVZNX09QQ09ERV9PVVRQVVRfVE8sCisJLy8gT3B0aW1pemVkIHZlcnNpb24gb2YgT1VUUFVUCisJQVZNX09QQ09ERV9PVVRQVVRfRU5WLAorCUFWTV9PUENPREVfT1VUUFVUX1ZBUiwKKwlBVk1fT1BDT0RFX09VVFBVVF9GTE9XLAorCUFWTV9PUENPREVfT1VUUFVUX0JVRkZFUiwKKwlBVk1fT1BDT0RFX09VVFBVVF9SRFYsCisJQVZNX09QQ09ERV9PVVRQVVRfTVVMVElfUkRWLAorCUFWTV9PUENPREVfT1VUUFVUX0JST0FEQ0FTVCwKKwlBVk1fT1BDT0RFX09VVFBVVF9ERUxFR0FURSwKKworCUFWTV9PUENPREVfUFJFU0VOVCwKKwlBVk1fT1BDT0RFX0FCU0VOVCwKKworCUFWTV9PUENPREVfSUYsCisJQVZNX09QQ09ERV9JRkUsCisKKwlBVk1fT1BDT0RFX1dIRVJFLAorCUFWTV9PUENPREVfV0hFUkVfRUxTRSwKKworCUFWTV9PUENPREVfRk9SLAorCUFWTV9PUENPREVfRk9SRUFDSCwKKwlBVk1fT1BDT0RFX1dISUxFX0RPLAorCUFWTV9PUENPREVfRE9fV0hJTEUsCisKKwlBVk1fT1BDT0RFX0JSRUFLLAorCUFWTV9PUENPREVfQ09OVElOVUUsCisJQVZNX09QQ09ERV9SRVRVUk4sCisJQVZNX09QQ09ERV9FWElULAorCisJQVZNX09QQ09ERV9TVEVQX01BUkssCisKKworCS8qCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIEFWTSBRVUFOVElGSUVSIEVYUFJFU1NJT04KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJQVZNX09QQ09ERV9FWElTVCwKKwlBVk1fT1BDT0RFX0ZPUkFMTCwKKworCisJLyoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogQVZNIFBSRURJQ0FUIEVYUFJFU1NJT04KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJQVZNX09QQ09ERV9OT1QsCisKKwlBVk1fT1BDT0RFX0FORCwKKwlBVk1fT1BDT0RFX0FORF9USEVOLAorCisJQVZNX09QQ09ERV9OQU5ELAorCisJQVZNX09QQ09ERV9YQU5ELAorCisJQVZNX09QQ09ERV9PUiwKKwlBVk1fT1BDT0RFX09SX0VMU0UsCisKKwlBVk1fT1BDT0RFX05PUiwKKworCUFWTV9PUENPREVfWE9SLAorCUFWTV9PUENPREVfWE5PUiwKKworCisJLyoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogQVZNIElOVEVHRVIgQklUIEEgQklUIE9QRVJBVE9SCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCUFWTV9PUENPREVfQk5PVCwKKworCUFWTV9PUENPREVfQkFORCwKKwlBVk1fT1BDT0RFX0JPUiwKKwlBVk1fT1BDT0RFX0JYT1IsCisKKwlBVk1fT1BDT0RFX0xTSElGVCwKKwlBVk1fT1BDT0RFX1JTSElGVCwKKworCisJLyoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogQVZNIENPTVBBUklTT04gRVhQUkVTU0lPTgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKi8KKworCUFWTV9PUENPREVfRVEsCisJQVZNX09QQ09ERV9ORVEsCisKKwlBVk1fT1BDT0RFX1NFUSwKKwlBVk1fT1BDT0RFX05TRVEsCisKKwlBVk1fT1BDT0RFX0xULAorCUFWTV9PUENPREVfTFRFLAorCUFWTV9PUENPREVfR1QsCisJQVZNX09QQ09ERV9HVEUsCisKKworCS8qCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIEFWTSBBUklUSE1FVElDIEVYUFJFU1NJT04KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisKKwlBVk1fT1BDT0RFX1BMVVMsCisJQVZNX09QQ09ERV9NSU5VUywKKwlBVk1fT1BDT0RFX1VNSU5VUywKKworCUFWTV9PUENPREVfTVVMVCwKKwlBVk1fT1BDT0RFX1BPVywKKworCUFWTV9PUENPREVfRElWLAorCUFWTV9PUENPREVfTU9ELAorCisJQVZNX09QQ09ERV9NSU4sCisJQVZNX09QQ09ERV9NQVgsCisKKworCS8qCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIEFWTSBNQVRIRU1BVElDQUwgRlVOQ1RJT04KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJLy8gUkFORE9NCisJQVZNX09QQ09ERV9SQU5ET00sCisKKwkvLyBST1VORElORworCUFWTV9PUENPREVfQUJTLAorCisJQVZNX09QQ09ERV9DRUlMLAorCUFWTV9PUENPREVfRkxPT1IsCisJQVZNX09QQ09ERV9ST1VORCwKKwlBVk1fT1BDT0RFX1RSVU5DQVRFLAorCisKKwkvLyBFWFAgLSBMT0cKKwlBVk1fT1BDT0RFX1NRUlQsCisKKwlBVk1fT1BDT0RFX0VYUCwKKwlBVk1fT1BDT0RFX0xOLAorCUFWTV9PUENPREVfTE9HLAorCisJLy8gVFJJR09OT01FVFJJQworCUFWTV9PUENPREVfU0lOLAorCUFWTV9PUENPREVfQ09TLAorCUFWTV9PUENPREVfVEFOLAorCisJQVZNX09QQ09ERV9TSU5ILAorCUFWTV9PUENPREVfQ09TSCwKKwlBVk1fT1BDT0RFX1RBTkgsCisKKwlBVk1fT1BDT0RFX0FTSU4sCisJQVZNX09QQ09ERV9BQ09TLAorCUFWTV9PUENPREVfQVRBTiwKKwlBVk1fT1BDT0RFX0FUQU4yLAorCisJQVZNX09QQ09ERV9BU0lOSCwKKwlBVk1fT1BDT0RFX0FDT1NILAorCUFWTV9PUENPREVfQVRBTkgsCisKKworCS8qCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIEFWTSBTVFJJTkcgLyBDT05UQUlORVIgT1BFUkFUT1IKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJQVZNX09QQ09ERV9DT05UQUlOUywKKworCUFWTV9PUENPREVfSU4sCisJQVZNX09QQ09ERV9OT1RJTiwKKworCUFWTV9PUENPREVfU1VCU0VULAorCUFWTV9PUENPREVfU1VCU0VURVEsCisKKwlBVk1fT1BDT0RFX0lOVEVSU0VDVCwKKworCUFWTV9PUENPREVfU1RBUlRTX1dJVEgsCisJQVZNX09QQ09ERV9FTkRTX1dJVEgsCisKKwlBVk1fT1BDT0RFX0NPTkNBVCwKKworCisJQVZNX09QQ09ERV9BUFBFTkQsCisKKwlBVk1fT1BDT0RFX1JFTU9WRSwKKwlBVk1fT1BDT0RFX0NMRUFSLAorCisJQVZNX09QQ09ERV9SRVNJWkUsCisKKwlBVk1fT1BDT0RFX1NFTEVDVCwKKworCUFWTV9PUENPREVfUFVTSCwKKwlBVk1fT1BDT0RFX0FTU0lHTl9UT1AsCisJQVZNX09QQ09ERV9UT1AsCisJQVZNX09QQ09ERV9QT1AsCisJQVZNX09QQ09ERV9QT1BfRlJPTSwKKworCUFWTV9PUENPREVfRU1QVFksCisJQVZNX09QQ09ERV9OT05FTVBUWSwKKwlBVk1fT1BDT0RFX1NJTkdMRVRPTiwKKwlBVk1fT1BDT0RFX1BPUFVMQVRFRCwKKwlBVk1fT1BDT0RFX0ZVTEwsCisKKwlBVk1fT1BDT0RFX1NJWkUsCisKKwkvKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBDVEwqICwgSU9MVEwgU1RBVEVNRU5UCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCUFWTV9PUENPREVfTkVDRVNTQVJJTFksICAvLyBBIDo+IGluIEFsbCBwYXRoCisJQVZNX09QQ09ERV9QT1NTSUJMWSwgICAgIC8vIEUgOj4gdGhlIEV4aXN0IGEgcGF0aAorCisJQVZNX09QQ09ERV9HTE9CQUxMWSwgICAgIC8vIEcgLCBcc3F1YXJlICAsIFtdIDo+IGFsd2F5cyBpbiB0aGUgZnV0dXJlCisJQVZNX09QQ09ERV9FVkVOVFVBTExZLCAgIC8vIEYgLCBcZGlhbW9uZCAnIDw+IDo+IChvciBGaW5hbGx5KSBzb21lIHRpbWUgaW4gdGhlIEZ1dHVyZQorCisJQVZNX09QQ09ERV9ORVhULCAgICAgICAgIC8vIFggLCBcY2lyY2xlICAsIG8gIDo+IG5lWHRpbWUKKworCUFWTV9PUENPREVfVU5USUwsICAgICAgICAvLyBVIDo+IChwIFUgcSApIDw9PiBwIGhvbGRzIFVudGlsIHEgaG9sZHMgKGFuZCAhIHApCisKKwlBVk1fT1BDT0RFX1VOTEVTUywgICAgICAgLy8gVyA6PiAocCBXIHEgKSA8PT4gV2VhayBVbnRpbCAob3Igd2FpdGluZyBmb3IpCisJICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDw9PiAoRyBwKSBvciAocCBVIHEpCisJICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIGxvbmcgYXMgcSBpcyBmYWxzZSwgcCBtdXN0IGJlIHRydWUKKworCUFWTV9PUENPREVfUkVMRUFTRVMsICAgICAvLyBSIDo+IChwIFIgcSApIDw9PiBxIGhvbGRzIFVudGlsIHAgaG9sZHMgKHdpdGggcSkKKwkgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPD0+IG5vdCAoKG5vdCBwKSBVIChub3QgcSkpCisJQVZNX09QQ09ERV9BTkRfVCwKKwlBVk1fT1BDT0RFX09SX1QsCisJQVZNX09QQ09ERV9OT1RfVCwKKwlBVk1fT1BDT0RFX0lNUF9ULAorCisJQVZNX09QQ09ERV9PQlMsCisKK307CisKKworCitlbnVtIEVOVU1fUFJJTlRfT1BFUkFUT1JfRk9STUFUCit7CisJUFJJTlRfT1BFUkFUT1JfVU5ERUZJTkVEX0ZPUk1BVCwKKworCVBSSU5UX09QRVJBVE9SX05BTUVfRk9STUFULAorCisJUFJJTlRfT1BFUkFUT1JfU1lNQk9MX0ZPUk1BVCwKKworCVBSSU5UX09QRVJBVE9SX01JWEZJWF9GT1JNQVQsCisKKwlQUklOVF9PUEVSQVRPUl9DQVNfUUVQQ0FEX0ZPUk1BVAorfTsKKworCisKK2NsYXNzIE9wZXJhdG9yTGliCit7CisKK3B1YmxpYzoKKworCS8qKgorCSAqIFRFU1QKKwkgKi8KKwlzdGF0aWMgYm9vbCBpc1Byb3Bvc2l0aW9uYWwoQVZNX09QQ09ERSBvcGNvZGUpOworCisKKwlzdGF0aWMgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKEZJWF9OT1RBVElPTiBmaXgpOworCisJc3RhdGljIEZJWF9OT1RBVElPTiB0b19maXgoY29uc3Qgc3RkOjpzdHJpbmcgJiBvcCwKKwkJCUZJWF9OT1RBVElPTiBkZWZhdWx0Rml4ID0gTk9UQVRJT05fSU5GSVgpOworCisKKwlzdGF0aWMgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKEFWTV9PUENPREUgb3Bjb2RlLAorCQkJRU5VTV9QUklOVF9PUEVSQVRPUl9GT1JNQVQgcHJpbnRGb3JtYXQgPQorCQkJCQlQUklOVF9PUEVSQVRPUl9TWU1CT0xfRk9STUFUKTsKKworCXN0YXRpYyBBVk1fT1BDT0RFIHRvT3Bjb2RlKGNvbnN0IHN0ZDo6c3RyaW5nICYgb3AsCisJCQlBVk1fT1BDT0RFIGRlZmF1bHRPcGNvZGUgPSBBVk1fT1BDT0RFX05VTEwpOworCit9OworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBPcGVyYXRvckZhbWlseQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY2xhc3MgQXZtQ29kZTsKKworCitjbGFzcyBJU3RhdGVtZW50RmFtaWx5Cit7CisKK3B1YmxpYzoKKworCXR5cGVkZWYgYXZtX3VpbnQzMl90ICAgICAgICBhdm1fb3Bjb2RlX2ZhbWlseTsKKworCWVudW0KKwl7CisJCUFWTV9TVEFURU1FTlRfVU5ERUZJTkVEX0ZBTUlMWSAgICA9IDB4MDAwMDAsCisKKwkJQVZNX1NUQVRFTUVOVF9CQVNJQ19GQU1JTFkgICAgICAgID0gMHgwMDAwMSwKKworCQlBVk1fU1RBVEVNRU5UX0dVQVJEX0ZBTUlMWSAgICAgICAgPSAweDAwMDAyLAorCisKKwkJQVZNX1NUQVRFTUVOVF9JTlBVVF9GQU1JTFkgICAgICAgID0gMHgwMDAxMCwKKwkJQVZNX1NUQVRFTUVOVF9JTlBVVF9FTlZfRkFNSUxZICAgID0gMHgwMDAyMCwKKwkJQVZNX1NUQVRFTUVOVF9JTlBVVF9TWU5DX0ZBTUlMWSAgID0gMHgwMDA0MCwKKwkJQVZNX1NUQVRFTUVOVF9JTlBVVF9BU1lOQ19GQU1JTFkgID0gMHgwMDA4MCwKKworCQlBVk1fU1RBVEVNRU5UX0lOUFVUX0FOWV9GQU1JTFkgICAgPSBBVk1fU1RBVEVNRU5UX0lOUFVUX0ZBTUlMWQorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBVk1fU1RBVEVNRU5UX0lOUFVUX0VOVl9GQU1JTFkKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQVZNX1NUQVRFTUVOVF9JTlBVVF9TWU5DX0ZBTUlMWQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBVk1fU1RBVEVNRU5UX0lOUFVUX0FTWU5DX0ZBTUlMWSwKKworCisJCUFWTV9TVEFURU1FTlRfT1VUUFVUX0ZBTUlMWSAgICAgICA9IDB4MDAxMDAsCisJCUFWTV9TVEFURU1FTlRfT1VUUFVUX0VOVl9GQU1JTFkgICA9IDB4MDAyMDAsCisJCUFWTV9TVEFURU1FTlRfT1VUUFVUX1NZTkNfRkFNSUxZICA9IDB4MDA0MDAsCisJCUFWTV9TVEFURU1FTlRfT1VUUFVUX0FTWU5DX0ZBTUlMWSA9IDB4MDA4MDAsCisKKwkJQVZNX1NUQVRFTUVOVF9PVVRQVVRfQU5ZX0ZBTUlMWSAgID0gQVZNX1NUQVRFTUVOVF9PVVRQVVRfRkFNSUxZCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFWTV9TVEFURU1FTlRfT1VUUFVUX0VOVl9GQU1JTFkKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQVZNX1NUQVRFTUVOVF9PVVRQVVRfU1lOQ19GQU1JTFkKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQVZNX1NUQVRFTUVOVF9PVVRQVVRfQVNZTkNfRkFNSUxZLAorCisKKwkJQVZNX1NUQVRFTUVOVF9DT01fRkFNSUxZICAgICAgICAgID0gQVZNX1NUQVRFTUVOVF9JTlBVVF9GQU1JTFkKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQVZNX1NUQVRFTUVOVF9PVVRQVVRfRkFNSUxZLAorCisJCUFWTV9TVEFURU1FTlRfQ09NX0VOVl9GQU1JTFkgICAgICA9IEFWTV9TVEFURU1FTlRfSU5QVVRfRU5WX0ZBTUlMWQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBVk1fU1RBVEVNRU5UX09VVFBVVF9FTlZfRkFNSUxZLAorCisJCUFWTV9TVEFURU1FTlRfQ09NX0FTWU5DX0ZBTUlMWSAgICA9IEFWTV9TVEFURU1FTlRfSU5QVVRfQVNZTkNfRkFNSUxZCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFWTV9TVEFURU1FTlRfT1VUUFVUX0FTWU5DX0ZBTUlMWSwKKworCQlBVk1fU1RBVEVNRU5UX0NPTV9TWU5DX0ZBTUlMWSAgICAgPSBBVk1fU1RBVEVNRU5UX0lOUFVUX1NZTkNfRkFNSUxZCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFWTV9TVEFURU1FTlRfT1VUUFVUX1NZTkNfRkFNSUxZLAorCisJCUFWTV9TVEFURU1FTlRfQ09NX0FOWV9GQU1JTFkgICAgICA9IEFWTV9TVEFURU1FTlRfSU5QVVRfQU5ZX0ZBTUlMWQorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBVk1fU1RBVEVNRU5UX09VVFBVVF9BTllfRkFNSUxZLAorCisKKwkJQVZNX1NUQVRFTUVOVF9VTkNPTkRJT05BTF9DTEFTUyAgID0gQVZNX1NUQVRFTUVOVF9CQVNJQ19GQU1JTFkKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQVZNX1NUQVRFTUVOVF9DT01fRU5WX0ZBTUlMWSwKKworCisJCUFWTV9TVEFURU1FTlRfQ09NX0NPTkRJVElPTkFMX0NMQVNTID0gQVZNX1NUQVRFTUVOVF9DT01fRkFNSUxZCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFWTV9TVEFURU1FTlRfQ09NX0FTWU5DX0ZBTUlMWQorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBVk1fU1RBVEVNRU5UX0NPTV9TWU5DX0ZBTUlMWSwKKworCQlBVk1fU1RBVEVNRU5UX0NPTkRJT05BTF9DTEFTUyAgICAgPSBBVk1fU1RBVEVNRU5UX0dVQVJEX0ZBTUlMWQorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBVk1fU1RBVEVNRU5UX0NPTV9DT05ESVRJT05BTF9DTEFTUywKKworCisJCUFWTV9TVEFURU1FTlRfTUFTS19BTExfRkFNSUxZICAgICA9IDB4RkZGRkYsCisKKwl9OworCisKK3Byb3RlY3RlZDoKKwkvKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlhdm1fb3Bjb2RlX2ZhbWlseSB0aGVTdGF0ZW1lbnRGYW1pbHk7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUlTdGF0ZW1lbnRGYW1pbHkoYXZtX29wY29kZV9mYW1pbHkKKwkJCWFDb2RlRmFtaWx5ID0gQVZNX1NUQVRFTUVOVF9VTkRFRklORURfRkFNSUxZKQorCTogdGhlU3RhdGVtZW50RmFtaWx5KCBhQ29kZUZhbWlseSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+SVN0YXRlbWVudEZhbWlseSgpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiB0aGVDb2RlRmFtaWx5CisJICovCisJaW5saW5lIGF2bV9vcGNvZGVfZmFtaWx5IGdldFN0YXRlbWVudEZhbWlseSgpIGNvbnN0CisJeworCQlyZXR1cm4oIHRoZVN0YXRlbWVudEZhbWlseSApOworCX0KKworCWlubGluZSBib29sIGhhc1N0YXRlbWVudEZhbWlseSgpIGNvbnN0CisJeworCQlyZXR1cm4oIHRoZVN0YXRlbWVudEZhbWlseSAhPSBBVk1fU1RBVEVNRU5UX1VOREVGSU5FRF9GQU1JTFkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRTdGF0ZW1lbnRGYW1pbHkoYXZtX29wY29kZV9mYW1pbHkgYUNvZGVGYW1pbHkpCisJeworCQl0aGVTdGF0ZW1lbnRGYW1pbHkgPSBhQ29kZUZhbWlseTsKKwl9CisKKworCWlubGluZSB2b2lkIHVwZGF0ZVN0YXRlbWVudEZhbWlseShBdm1Db2RlICogYUNvZGUpCisJeworCQl0aGVTdGF0ZW1lbnRGYW1pbHkgPSBjb21wdXRlU3RhdGVtZW50RmFtaWx5KCBhQ29kZSApOworCX0KKworCXN0YXRpYyBhdm1fb3Bjb2RlX2ZhbWlseSBjb21wdXRlU3RhdGVtZW50RmFtaWx5KEFWTV9PUENPREUgb3Bjb2RlKTsKKworCXN0YXRpYyBhdm1fb3Bjb2RlX2ZhbWlseSBjb21wdXRlU3RhdGVtZW50RmFtaWx5KEF2bUNvZGUgKiBhQ29kZSk7CisKKwkvKioKKwkgKiBURVNUCisJICogdGhlQ29kZUZhbWlseQorCSAqLworCWlubGluZSBib29sIGhhc1N0YXRlbWVudEJhc2ljRmFtaWx5KCkgY29uc3QKKwl7CisJCXJldHVybiggKHRoZVN0YXRlbWVudEZhbWlseSAmIEFWTV9TVEFURU1FTlRfQkFTSUNfRkFNSUxZKSAhPSAwICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNTdGF0ZW1lbnRCYXNpY0ZhbWlseSgpIGNvbnN0CisJeworCQlyZXR1cm4oIHRoZVN0YXRlbWVudEZhbWlseSA9PSBBVk1fU1RBVEVNRU5UX0JBU0lDX0ZBTUlMWSApOworCX0KKworCisJaW5saW5lIGJvb2wgaGFzU3RhdGVtZW50R3VhcmRGYW1pbHkoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAodGhlU3RhdGVtZW50RmFtaWx5ICYgQVZNX1NUQVRFTUVOVF9HVUFSRF9GQU1JTFkpICE9IDAgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNTdGF0ZW1lbnRJbnB1dEZhbWlseSgpIGNvbnN0CisJeworCQlyZXR1cm4oICh0aGVTdGF0ZW1lbnRGYW1pbHkgJiBBVk1fU1RBVEVNRU5UX0lOUFVUX0FOWV9GQU1JTFkpICE9IDAgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNTdGF0ZW1lbnRPdXRwdXRGYW1pbHkoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAodGhlU3RhdGVtZW50RmFtaWx5ICYgQVZNX1NUQVRFTUVOVF9PVVRQVVRfQU5ZX0ZBTUlMWSkgIT0gMCApOworCX0KKworCWlubGluZSBib29sIGhhc1N0YXRlbWVudENvbUZhbWlseSgpIGNvbnN0CisJeworCQlyZXR1cm4oICh0aGVTdGF0ZW1lbnRGYW1pbHkgJiBBVk1fU1RBVEVNRU5UX0NPTV9BTllfRkFNSUxZKSAhPSAwICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBoYXNDb25kaXRpb25hbFN0YXRlbWVudEZhbWlseSgpIGNvbnN0CisJeworCQlyZXR1cm4oICh0aGVTdGF0ZW1lbnRGYW1pbHkgJiBBVk1fU1RBVEVNRU5UX0NPTkRJT05BTF9DTEFTUykgIT0gMCApOworCX0KKworCWlubGluZSBib29sIGhhc0NvbmRpdGlvbmFsQ29tU3RhdGVtZW50RmFtaWx5KCkgY29uc3QKKwl7CisJCXJldHVybiggKHRoZVN0YXRlbWVudEZhbWlseSAmIEFWTV9TVEFURU1FTlRfQ09NX0NPTkRJVElPTkFMX0NMQVNTKSAhPSAwICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNHdWFyZENvbmRpdGlvbmFsU3RhdGVtZW50RmFtaWx5KCkgY29uc3QKKwl7CisJCXJldHVybiggKHRoZVN0YXRlbWVudEZhbWlseSAmICh+IChBVk1fU1RBVEVNRU5UX1VOQ09ORElPTkFMX0NMQVNTIHwKKwkJCQlBVk1fU1RBVEVNRU5UX0dVQVJEX0ZBTUlMWSkpICkgPT0gMCApOworCX0KKworCisJaW5saW5lIGJvb2wgaGFzVW5jb25kaXRpb25hbFN0YXRlbWVudEZhbWlseSgpIGNvbnN0CisJeworCQlyZXR1cm4oICh0aGVTdGF0ZW1lbnRGYW1pbHkgJiBBVk1fU1RBVEVNRU5UX1VOQ09ORElPTkFMX0NMQVNTKSAhPSAwICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNVbmNvbmRpdGlvbmFsU3RhdGVtZW50RmFtaWx5KCkgY29uc3QKKwl7CisJCXJldHVybiggKHRoZVN0YXRlbWVudEZhbWlseSAmICh+IEFWTV9TVEFURU1FTlRfVU5DT05ESU9OQUxfQ0xBU1MpKSA9PSAwICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBoYXNVbmNvbmRpdGlvbmFsQ29tU3RhdGVtZW50RmFtaWx5KCkgY29uc3QKKwl7CisJCXJldHVybiggKHRoZVN0YXRlbWVudEZhbWlseSAmIEFWTV9TVEFURU1FTlRfQ09NX0VOVl9GQU1JTFkpICE9IDAgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc1VuY29uZGl0aW9uYWxDb21TdGF0ZW1lbnRGYW1pbHkoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAodGhlU3RhdGVtZW50RmFtaWx5ICYgKH4gKEFWTV9TVEFURU1FTlRfQ09NX0VOVl9GQU1JTFkgfAorCQkJCUFWTV9TVEFURU1FTlRfQkFTSUNfRkFNSUxZKSkpID09IDAgKTsKKwl9CisKKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwlzdGQ6OnN0cmluZyBzdHJTdGF0ZW1lbnRGYW1pbHkoCisJCQlhdm1fb3Bjb2RlX2ZhbWlseSBtYXNrID0gQVZNX1NUQVRFTUVOVF9NQVNLX0FMTF9GQU1JTFkpIGNvbnN0OworCit9OworCisKK30KKworI2VuZGlmIC8qIE9QRVJBVE9STElCX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvb3BlcmF0b3IvT3BlcmF0b3JNYW5hZ2VyLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9vcGVyYXRvci9PcGVyYXRvck1hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5N2NhZTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvb3BlcmF0b3IvT3BlcmF0b3JNYW5hZ2VyLmNwcApAQCAtMCwwICsxLDI3ODAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULg0KKyAqDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENyZWF0ZWQgb246IDE1IGFvw7t0IDIwMDgNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcg0KKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlICJPcGVyYXRvck1hbmFnZXIuaCINCisNCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQXZtQ29kZS5oPg0KKw0KKyNpbmNsdWRlIDxmbWwvb3BlcmF0b3IvT3BlcmF0b3IuaD4NCisNCisNCituYW1lc3BhY2Ugc2VwDQorew0KKw0KKw0KK3N0ZDo6bWFwPCBzdGQ6OnN0cmluZyAsIE9wZXJhdG9yICogPiBPcGVyYXRvck1hbmFnZXI6OnRoZU9wZXJhdG9yc01hcDsNCisNCitCRlZlY3RvciBPcGVyYXRvck1hbmFnZXI6OlRBQkxFX09GX09QRVJBVE9SOw0KKw0KKw0KKw0KKy8qDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBBVk0gTk9QIFNUQVRFTUVOVA0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICovDQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX05PUCA9IE5VTEw7DQorDQorDQorLyoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIEFWTSBNRVRBIFNUQVRFTUVOVA0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICovDQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0lORk9STUFMID0gTlVMTDsNCisNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfVFJBQ0UgPSBOVUxMOw0KKw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9ERUJVRyA9IE5VTEw7DQorDQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0NPTU1FTlQgPSBOVUxMOw0KKw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9RVU9URSA9IE5VTEw7DQorDQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX01FVEFfRVZBTCA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX01FVEFfUlVOID0gTlVMTDsNCisNCisNCisvKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQVZNIFVGSSBTVEFURU1FTlQNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqLw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9VRkkgPSBOVUxMOw0KKw0KKw0KKy8qDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBBVk0gRk9STSBDT05TVFJVQ1RPUiBTVEFURU1FTlQNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqLw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9DVE9SID0gTlVMTDsNCisNCisvKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQVZNIE1BQ0hJTkUgTUFOQUdJTkcNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqLw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9DT05URVhUX1NXSVRDSEVSID0gTlVMTDsNCisNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfSU5JVCA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0ZJTkFMID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfREVTVFJPWSA9IE5VTEw7DQorDQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NUQVJUID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfUkVTVEFSVCA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NUT1AgPSBOVUxMOw0KKw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9XQUlUID0gTlVMTDsNCisNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU1VTUEVORCA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1JFU1VNRSA9IE5VTEw7DQorDQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0lFTkFCTEVfSU5WT0tFID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfRU5BQkxFX0lOVk9LRSA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0VOQUJMRV9TRVQgPSBOVUxMOw0KKw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9JRElTQUJMRV9JTlZPS0UgPSBOVUxMOw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9ESVNBQkxFX0lOVk9LRSA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0RJU0FCTEVfU0VUID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfRElTQUJMRV9DSElMRCA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0RJU0FCTEVfU0VMRiA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0RJU0FCTEVfU0VMVkVTID0gTlVMTDsNCisNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfSUFCT1JUX0lOVk9LRSA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FCT1JUX0lOVk9LRSA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FCT1JUX1NFVCA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FCT1JUX0NISUxEID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQUJPUlRfU0VMRiA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FCT1JUX1NFTFZFUyA9IE5VTEw7DQorDQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0hJU1RPUllfQ0xFQVIgPSBOVUxMOw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9ERUVQX0hJU1RPUllfSU5WT0tFID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU0hBTExPV19ISVNUT1JZX0lOVk9LRSA9IE5VTEw7DQorDQorDQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0lSVU4gPSBOVUxMOw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9SVU4gPSBOVUxMOw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9SVEMgPSBOVUxMOw0KKw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9JTlZPS0VfTkVXID0gTlVMTDsNCisNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfSU5WT0tFX1JPVVRJTkUgPSBOVUxMOw0KKw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9JTlZPS0VfVFJBTlNJVElPTiA9IE5VTEw7DQorDQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0lOVk9LRV9NRVRIT0QgPSBOVUxMOw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9JTlZPS0VfUFJPR1JBTSA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0lOVk9LRV9GVU5DVElPTiA9IE5VTEw7DQorDQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0lOVk9LRV9MQU1CREFfQVBQTFkgPSBOVUxMOw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9JTlZPS0VfTEFNQkRBX0xFVCA9IE5VTEw7DQorDQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0dPVE8gPSBOVUxMOw0KKw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TQ0hFRFVMRV9JTlZPS0UgPSBOVUxMOw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TQ0hFRFVMRV9HRVQgPSBOVUxMOw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TQ0hFRFVMRV9JTiA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NDSEVEVUxFX1NFVCA9IE5VTEw7DQorDQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0RFRkVSX0lOVk9LRSA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0RFRkVSX0dFVCA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0RFRkVSX1NFVCA9IE5VTEw7DQorDQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0ZPUksgPSBOVUxMOw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9KT0lOID0gTlVMTDsNCisNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfSU5QVVRfRU5BQkxFRCA9IE5VTEw7DQorDQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1JEViA9IE5VTEw7DQorDQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NZTkNIUk9OSVpFID0gTlVMTDsNCisNCisNCisvKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQVZNIERBVEEgU1RBVFVTDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKi8NCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU1RBVFVTX1dBUyA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NUQVRVU19JUyA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NUQVRVU19CRUlORyA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NUQVRVU19XSUxMID0gTlVMTDsNCisNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQ0hBTkdFRCA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0NIQU5HRURfVE8gPSBOVUxMOw0KKw0KKw0KKy8qDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBBVk0gUFJPR1JBTSBTQ0hFRFVMSU5HDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKi8NCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQVNZTkNIUk9OT1VTID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU1RST05HX1NZTkNIUk9OT1VTID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfV0VBS19TWU5DSFJPTk9VUyA9IE5VTEw7DQorDQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0lOVEVSTEVBVklORyA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1BBUlRJQUxfT1JERVJfUkVEVUNUSU9OID0gTlVMTDsNCisNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfUEFSQUxMRUwgPSBOVUxMOw0KKw0KKy8vIE9wdGltaXplZCB2ZXJzaW9uIG9mIGNvbmN1cnJlbmN5IGZvciBSRFYgc3luY2hyb25pemF0aW9uDQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1JEVl9BU1lOQ0hST05PVVMgPSBOVUxMOw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9SRFZfU1RST05HX1NZTkNIUk9OT1VTID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfUkRWX1dFQUtfU1lOQ0hST05PVVMgPSBOVUxMOw0KKw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9SRFZfSU5URVJMRUFWSU5HID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfUkRWX1BBUlRJQUxfT1JERVJfUkVEVUNUSU9OID0gTlVMTDsNCisNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfUkRWX1BBUkFMTEVMID0gTlVMTDsNCisNCisNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfRVhDTFVTSVZFID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfTk9OREVURVJNSU5JU00gPSBOVUxMOw0KKw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9QUklPUl9HVCA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1BSSU9SX0xUID0gTlVMTDsNCisNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU0NIRURVTEVfQU5EX1RIRU4gPSBOVUxMOw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TQ0hFRFVMRV9PUl9FTFNFID0gTlVMTDsNCisNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQVRPTUlDX1NFUVVFTkNFID0gTlVMTDsNCisNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU0VRVUVOQ0UgPSBOVUxMOw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TRVFVRU5DRV9TSURFID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU0VRVUVOQ0VfV0VBSyA9IE5VTEw7DQorDQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1BST0RVQ1QgPSBOVUxMOw0KKw0KKw0KKy8qDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBBVk0gQlVGRkVSIE1BTkFHSU5HDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKi8NCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfVVBEQVRFX0JVRkZFUiA9IE5VTEw7DQorDQorDQorLyoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIExBTUJEQSBTVEFURU1FTlQNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqLw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BUFBMWSA9IE5VTEw7DQorDQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0xBTUJEQSA9IE5VTEw7DQorDQorDQorLyoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIExFVCBTVEFURU1FTlQNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqLw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9MRVQgPSBOVUxMOw0KKw0KKw0KKy8qDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBBVk0gUFJJTUlUSVZFIFNUQVRFTUVOVA0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICovDQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FTU0lHTiA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FTU0lHTl9BRlRFUiA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FTU0lHTl9PUCA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FTU0lHTl9PUF9BRlRFUiA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FTU0lHTl9SRUYgPSBOVUxMOw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BU1NJR05fTUFDUk8gPSBOVUxMOw0KKw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BU1NJR05fTkVXRlJFU0ggPSBOVUxMOw0KKw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BU1NJR05fUkVTRVQgPSBOVUxMOw0KKw0KKw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9HVUFSRCA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1RJTUVEX0dVQVJEID0gTlVMTDsNCisNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfRVZFTlQgPSBOVUxMOw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9DSEVDS19TQVQgPSBOVUxMOw0KKw0KKw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9JTlBVVCA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0lOUFVUX0ZST00gPSBOVUxMOw0KKw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9JTlBVVF9TQVZFID0gTlVMTDsNCisNCisvLyBPcHRpbWl6ZWQgdmVyc2lvbiBvZiBJTlBVVA0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9JTlBVVF9WQVIgPSBOVUxMOw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9JTlBVVF9GTE9XID0gTlVMTDsNCisNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfSU5QVVRfRU5WID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfSU5QVVRfQlVGRkVSID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfSU5QVVRfUkRWID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfSU5QVVRfQlJPQURDQVNUID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfSU5QVVRfREVMRUdBVEUgPSBOVUxMOw0KKw0KKw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9PVVRQVVQgPSBOVUxMOw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9PVVRQVVRfVE8gPSBOVUxMOw0KKw0KKy8vIE9wdGltaXplZCB2ZXJzaW9uIG9mIE9VVFBVVA0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9PVVRQVVRfVkFSID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfT1VUUFVUX0ZMT1cgPSBOVUxMOw0KKw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9PVVRQVVRfRU5WID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfT1VUUFVUX0JVRkZFUiA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX09VVFBVVF9SRFYgPSBOVUxMOw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9PVVRQVVRfQlJPQURDQVNUID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfT1VUUFVUX0RFTEVHQVRFID0gTlVMTDsNCisNCisNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfUFJFU0VOVCA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FCU0VOVCA9IE5VTEw7DQorDQorDQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0lGID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfSUZFID0gTlVMTDsNCisNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfRk9SID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfRk9SRUFDSCA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1dISUxFX0RPID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfRE9fV0hJTEUgPSBOVUxMOw0KKw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9CUkVBSyA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0NPTlRJTlVFID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfUkVUVVJOID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfRVhJVCA9IE5VTEw7DQorDQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NURVBfTUFSSyA9IE5VTEw7DQorDQorDQorLyoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIEFWTSBQUkVESUNBVCBFWFBSRVNTSU9ODQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKi8NCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfRVhJU1QgPSBOVUxMOw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9GT1JBTEwgPSBOVUxMOw0KKw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9OT1QgPSBOVUxMOw0KKw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BTkQgPSBOVUxMOw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BTkRfVEhFTiA9IE5VTEw7DQorDQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX05BTkQgPSBOVUxMOw0KKw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9YQU5EID0gTlVMTDsNCisNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfT1IgPSBOVUxMOw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9PUl9FTFNFID0gTlVMTDsNCisNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfTk9SID0gTlVMTDsNCisNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfWE9SID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfWE5PUiA9IE5VTEw7DQorDQorDQorLyoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIEFWTSBDT01QQVJJU09OIEVYUFJFU1NJT04NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqLw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9FUSA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX05FUSA9IE5VTEw7DQorDQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NFUSA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX05TRVEgPSBOVUxMOw0KKw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9MVCA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0xURSA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0dUID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfR1RFID0gTlVMTDsNCisNCisNCisNCisvKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQVZNIEJJVFdJU0UgRVhQUkVTU0lPTg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICovDQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0JOT1QgPSBOVUxMOw0KKw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9CQU5EID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQk9SID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQlhPUiA9IE5VTEw7DQorDQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0xTSElGVCA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1JTSElGVCA9IE5VTEw7DQorDQorDQorLyoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIEFWTSBBUklUSE1FVElDIEVYUFJFU1NJT04NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqLw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9QTFVTID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfTUlOVVMgPSBOVUxMOw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9VTUlOVVMgPSBOVUxMOw0KKw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9NVUxUID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfUE9XID0gTlVMTDsNCisNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfRElWID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfTU9EID0gTlVMTDsNCisNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfTUlOID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfTUFYID0gTlVMTDsNCisNCisNCisvKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogTE9PS1VQIFNUQVRFTUVOVA0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICovDQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0xPT0tVUF9JTlRfRVhUID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfTE9PS1VQX0lOVCA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0xPT0tVUF9ORUFSRVNUID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfTE9PS1VQX0JFTE9XID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfTE9PS1VQX0FCT1ZFID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfTE9PS1VQMkRfSU5UX0VYVCA9IE5VTEw7DQorDQorDQorLyoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIEFWTSBNQVRIRU1BVElDQUwgRlVOQ1RJT04NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqLw0KKyAvLyBSQU5ET00NCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfUkFORE9NID0gTlVMTDsNCisNCisvLyBST1VORElORw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BQlMgPSBOVUxMOw0KKw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9DRUlMID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfRkxPT1IgPSBOVUxMOw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9ST1VORCA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1RSVU5DQVRFID0gTlVMTDsNCisNCisNCisvLyBFWFAgLSBMT0cNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU1FSVCA9IE5VTEw7DQorDQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0VYUCA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0xOID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfTE9HID0gTlVMTDsNCisNCisvLyBUUklHT05PTUVUUklDDQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NJTiA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0NPUyA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1RBTiA9IE5VTEw7DQorDQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NJTkggPSBOVUxMOw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9DT1NIID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfVEFOSCA9IE5VTEw7DQorDQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FTSU4gPSBOVUxMOw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BQ09TID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQVRBTiA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FUQU4yID0gTlVMTDsNCisNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQVNJTkggPSBOVUxMOw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BQ09TSCA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FUQU5IID0gTlVMTDsNCisNCisNCisvKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQVZNIFNUUklORyAvIENPTExFQ1RJT04gT1BFUkFUT1INCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqLw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9DT05UQUlOUyA9IE5VTEw7DQorDQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0lOID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfTk9USU4gPSBOVUxMOw0KKw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TVUJTRVQgPSBOVUxMOw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TVUJTRVRFUSA9IE5VTEw7DQorDQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0lOVEVSU0VDVCA9IE5VTEw7DQorDQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NUQVJUU19XSVRIID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfRU5EU19XSVRIID0gTlVMTDsNCisNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQ09OQ0FUID0gTlVMTDsNCisNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQVBQRU5EID0gTlVMTDsNCisNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfUkVNT1ZFID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQ0xFQVIgPSBOVUxMOw0KKw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9SRVNJWkUgPSBOVUxMOw0KKw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TRUxFQ1QgPSBOVUxMOw0KKw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9QVVNIID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQVNTSUdOX1RPUCA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1RPUCA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1BPUCA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1BPUF9GUk9NID0gTlVMTDsNCisNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfRU1QVFkgPSBOVUxMOw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9OT05FTVBUWSA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NJTkdMRVRPTiA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1BPUFVMQVRFRCA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0ZVTEwgPSBOVUxMOw0KKw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TSVpFID0gTlVMTDsNCisNCisNCisvKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogSU9MVEwgQkVIQVZJT1JBTCBQUkVESUNBVA0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICovDQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0dMT0JBTExZID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfVU5USUwgPSBOVUxMOw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9ORVhUID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfRVZFTlRVQUxMWSA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1JFTEVBU0VTID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfT0JTID0gTlVMTDsNCisNCisNCisvKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogSU9MVEwgTE9HSUNBTCBQUkVESUNBVA0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICovDQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FORF9UID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfT1JfVCA9IE5VTEw7DQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX05PVF9UID0gTlVMTDsNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfSU1QX1QgPSBOVUxMOw0KKw0KKw0KKw0KKy8qKg0KKyAqIExPQURFUg0KKyAqLw0KK3ZvaWQgT3BlcmF0b3JNYW5hZ2VyOjpsb2FkKCkNCit7DQorDQorLy8gT3BlcmF0b3IgcHJpbnQgc3RyaW5nIGZvcm1hdDogTkFNRV9JRCwgQUxHRUJSQV8qLCAqRklYLCBTWU1CT0wsIE1JWEZJWCwgUUVQQ0FEDQorDQorI2RlZmluZSBORVdfU1RBVEVNRU5UKCBPUCAsIE5BTUUgKSAgXA0KKwlPUEVSQVRPUl8jI09QID0gbmV3T3BTdGF0ZW1lbnQoIFwNCisJCQlBVk1fT1BDT0RFXyMjT1AgLCBBVk1fT1BDT0RFXyMjT1AgLCAib3BlcmF0b3I6OiIgI09QICwgTkFNRSApDQorDQorI2RlZmluZSBORVdfU1RBVEVNRU5UX0lOVk9LRSggT1AgLCBOQU1FICkgICAgIFwNCisJT1BFUkFUT1JfIyNPUCMjX0lOVk9LRSA9IG5ld09wU3RhdGVtZW50KCAgXA0KKwkJCUFWTV9PUENPREVfIyNPUCMjX0lOVk9LRSAsIEFWTV9PUENPREVfIyNPUCMjX0lOVk9LRSAsICBcDQorCQkJIm9wZXJhdG9yOjoiICNPUCAiI0lOVk9LRSIgLCBOQU1FICkNCisNCisjZGVmaW5lIE5FV19TVEFURU1FTlRfREVTQyggT1AgLCBERVNDICwgU1RSICkgIFwNCisJT1BFUkFUT1JfIyNPUCMjXyMjREVTQyA9IG5ld09wU3RhdGVtZW50KCAgIFwNCisJCQlBVk1fT1BDT0RFXyMjT1AjI18jI0RFU0MgLCAib3BlcmF0b3I6OiIgI09QICwgU1RSICkNCisNCisjZGVmaW5lIE5FV19TVEFURU1FTlRfRElFU0UoIE9QICwgRElFU0UgLCBOQU1FICkgIFwNCisJT1BFUkFUT1JfIyNPUCMjXyMjRElFU0UgPSBuZXdPcFN0YXRlbWVudCggICAgIFwNCisJCQlBVk1fT1BDT0RFXyMjT1AjI18jI0RJRVNFICwgQVZNX09QQ09ERV8jI09QIyNfIyNESUVTRSAsICBcDQorCQkJIm9wZXJhdG9yOjoiICNPUCAiIyIgI0RJRVNFICwgTkFNRSApDQorDQorI2RlZmluZSBORVdfU1RBVEVNRU5UX09QVEkoIE9QICwgT1BUSSAsIE5BTUUgKSAgXA0KKwlPUEVSQVRPUl8jI09QIyNfIyNPUFRJID0gbmV3T3BTdGF0ZW1lbnQoIEFWTV9PUENPREVfIyNPUCAsICBcDQorCQkJQVZNX09QQ09ERV8jI09QIyNfIyNPUFRJICwgIm9wZXJhdG9yOjoiICNPUCAiXyIgI09QVEkgLCBOQU1FICkNCisNCisNCisjZGVmaW5lIE5FV19GVU5DVElPTiggT1AgLCBOQU1FICkgIFwNCisJT1BFUkFUT1JfIyNPUCA9IG5ld09wZXJhdG9yKCBBVk1fT1BDT0RFXyMjT1AgICwgQVZNX09QQ09ERV8jI09QICAgLCAgXA0KKwkJCSJvcGVyYXRvcjo6IiAjT1AgLCBOQU1FICwgQUxHRUJSQV9TVEQgLCBOT1RBVElPTl9GVU5DVElPTiAsICBcDQorCQkJTkFNRSAsIE5BTUUgIihfKSIgLCBOQU1FICkNCisNCisNCisjZGVmaW5lIE5FV19PUF9BU1NPQ19DT00oIE9QICwgTkFNRSAsIFNZTUJPTCApICBcDQorCU9QRVJBVE9SXyMjT1AgPSBuZXdPcGVyYXRvckFzc29jQ29tKCBBVk1fT1BDT0RFXyMjT1AgLCAgXA0KKwkJCUFWTV9PUENPREVfIyNPUCAsICJvcGVyYXRvcjo6IiAjT1AgLCBOQU1FICwgU1lNQk9MICkNCisNCisjZGVmaW5lIE5FV19PUF9BU1NPQ19DT01fRlVMTCggT1AgLCBOQU1FICwgU1lNQk9MICwgTUlYRklYLCBRRVBDQUQgKSAgXA0KKwlPUEVSQVRPUl8jI09QID0gbmV3T3BlcmF0b3JBc3NvY0NvbSggQVZNX09QQ09ERV8jI09QICwgIFwNCisJCQkib3BlcmF0b3I6OiIgI09QICwgTkFNRSAsIFNZTUJPTCAsIE1JWEZJWCwgUUVQQ0FEICkNCisNCisjZGVmaW5lIE5FV19PUF9BU1NPQ19DT01fUkRWKCBPUCAsIE5BTUUgLCBTWU1CT0wgKSAgXA0KKwlPUEVSQVRPUl9SRFZfIyNPUCA9IG5ld09wZXJhdG9yQXNzb2NDb20oICAgICAgICAgICAgXA0KKwkJCUFWTV9PUENPREVfUkRWXyMjT1AgLCBBVk1fT1BDT0RFX1JEViMjXyMjT1AgLCBcDQorCQkJIm9wZXJhdG9yOjpSRFZfIiAjT1AgLCBOQU1FICwgU1lNQk9MICkNCisNCisNCisjZGVmaW5lIE5FV19PUF9BU1NPQyggT1AgLCBOQU1FICwgU1lNQk9MICkgIFwNCisJT1BFUkFUT1JfIyNPUCA9IG5ld09wZXJhdG9yQXNzb2MoICAgICAgICBcDQorCQkJQVZNX09QQ09ERV8jI09QICwgIm9wZXJhdG9yOjoiICNPUCAsIE5BTUUgLCBTWU1CT0wgKQ0KKw0KKyNkZWZpbmUgTkVXX09QX0xFRlRfQVNTT0MoIE9QICwgTkFNRSAsIFNZTUJPTCApICBcDQorCU9QRVJBVE9SXyMjT1AgPSBuZXdPcGVyYXRvckxlZnRBc3NvYyggICAgICAgIFwNCisJCQlBVk1fT1BDT0RFXyMjT1AgLCAib3BlcmF0b3I6OiIgI09QICwgTkFNRSAsIFNZTUJPTCApDQorDQorI2RlZmluZSBORVdfT1BfUklHSFRfQVNTT0MoIE9QICwgTkFNRSAsIFNZTUJPTCApICBcDQorCU9QRVJBVE9SXyMjT1AgPSBuZXdPcGVyYXRvclJpZ2h0QXNzb2MoICAgICAgICBcDQorCQkJQVZNX09QQ09ERV8jI09QICwgIm9wZXJhdG9yOjoiICNPUCAsIE5BTUUgLCBTWU1CT0wgKQ0KKw0KKyNkZWZpbmUgTkVXX09QX1JJR0hUX0FTU09DX0RJRVNFKCBPUCAsIERJRVNFICwgTkFNRSAsIFNZTUJPTCApICBcDQorCU9QRVJBVE9SXyMjT1AjI18jI0RJRVNFID0gbmV3T3BlcmF0b3JSaWdodEFzc29jKCAgXA0KKwkJCUFWTV9PUENPREVfIyNPUCMjXyMjRElFU0UgLCAgXA0KKwkJCSJvcGVyYXRvcjo6IiAjT1AgIiMiICNESUVTRSAsIE5BTUUgLCBTWU1CT0wgKQ0KKw0KKw0KKyNkZWZpbmUgTkVXX09QX0lORklYKCBPUCAsIE5BTUUgKSAgXA0KKwlPUEVSQVRPUl8jI09QID0gbmV3T3BlcmF0b3JTdGRJbmZpeCggICAgXA0KKwkJCUFWTV9PUENPREVfIyNPUCAsICJvcGVyYXRvcjo6IiAjT1AgLCBOQU1FICwgTkFNRSApDQorDQorI2RlZmluZSBORVdfT1BfSU5GSVhfRlVMTCggT1AgLCBOQU1FICwgU1lNQk9MICwgTUlYRklYLCBRRVBDQUQgKSAgXA0KKwlPUEVSQVRPUl8jI09QID0gbmV3T3BlcmF0b3JTdGRJbmZpeCggQVZNX09QQ09ERV8jI09QICwgIFwNCisJCQkib3BlcmF0b3I6OiIgI09QICwgTkFNRSAsIFNZTUJPTCAsIE1JWEZJWCwgUUVQQ0FEICkNCisNCisNCisjZGVmaW5lIE5FV19PUF9QUkVGSVgoIE9QICwgTkFNRSApICBcDQorCU9QRVJBVE9SXyMjT1AgPSBuZXdPcGVyYXRvclN0ZFByZWZpeCggICAgIFwNCisJCQlBVk1fT1BDT0RFXyMjT1AgLCAib3BlcmF0b3I6OiIgI09QICwgTkFNRSAsIE5BTUUgKQ0KKw0KKyNkZWZpbmUgTkVXX09QX1BSRUZJWF9TWU1CKCBPUCAsIE5BTUUgLCBTWU1CT0wgKSAgXA0KKwlPUEVSQVRPUl8jI09QID0gbmV3T3BlcmF0b3JTdGRQcmVmaXgoICAgICBcDQorCQkJQVZNX09QQ09ERV8jI09QICwgIm9wZXJhdG9yOjoiICNPUCAsIE5BTUUgLCBTWU1CT0wgKQ0KKw0KKyNkZWZpbmUgTkVXX09QX1BSRUZJWF9GVUxMKCBPUCAsIE5BTUUgLCBTWU1CT0wgLCBNSVhGSVgsIFFFUENBRCApICBcDQorCU9QRVJBVE9SXyMjT1AgPSBuZXdPcGVyYXRvclN0ZFByZWZpeCggQVZNX09QQ09ERV8jI09QICwgIFwNCisJCQkib3BlcmF0b3I6OiIgI09QICwgTkFNRSAsIFNZTUJPTCAsIE1JWEZJWCwgUUVQQ0FEICkNCisNCisNCisJLyoNCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKiBBVk0gTk9QIFNUQVRFTUVOVA0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqLw0KKwlORVdfU1RBVEVNRU5UKCBOT1AgLCAibm9wIiApOw0KKw0KKwkvKg0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqIEFWTSBNRVRBIFNUQVRFTUVOVA0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqLw0KKwlORVdfU1RBVEVNRU5UKCBJTkZPUk1BTCAgLCAiaW5mb3JtYWwiICApOw0KKwlORVdfU1RBVEVNRU5UKCBUUkFDRSAgICAgLCAidHJhY2UiICAgICApOw0KKwlORVdfU1RBVEVNRU5UKCBERUJVRyAgICAgLCAiZGVidWciICAgICApOw0KKwlORVdfU1RBVEVNRU5UKCBDT01NRU5UICAgLCAiY29tbWVudCIgICApOw0KKwlORVdfU1RBVEVNRU5UKCBRVU9URSAgICAgLCAicXVvdGUiICAgICApOw0KKwlORVdfU1RBVEVNRU5UKCBNRVRBX0VWQUwgLCAibWV0YV9ldmFsIiApOw0KKwlORVdfU1RBVEVNRU5UKCBNRVRBX1JVTiAgLCAibWV0YV9ydW4iICApOw0KKw0KKwkvKg0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqIEFWTSBVRkkgU1RBVEVNRU5UDQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICovDQorCU5FV19TVEFURU1FTlQoIFVGSSAsICJ1ZmkiICk7DQorDQorCS8qDQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICogQVZNIENPTlNUUlVDVE9SICYgQ0FTVCBTVEFURU1FTlQNCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKi8NCisJTkVXX1NUQVRFTUVOVCggQ1RPUiAsICJjdG9yIiApOw0KKw0KKwkvKg0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqIEFWTSBNQUNISU5FIE1BTkFHSU5HDQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICovDQorCU5FV19TVEFURU1FTlQoIENPTlRFWFRfU1dJVENIRVIsICJjdHgiICk7DQorDQorCU5FV19TVEFURU1FTlQoIElOSVQgICAgLCAiaW5pdCIgICAgKTsNCisJTkVXX1NUQVRFTUVOVCggRklOQUwgICAsICJmaW5hbCIgICApOw0KKwlORVdfU1RBVEVNRU5UKCBERVNUUk9ZICwgImRlc3Ryb3kiICk7DQorDQorCU5FV19TVEFURU1FTlQoIFNUQVJUICAgLCAic3RhcnQiICAgKTsNCisJTkVXX1NUQVRFTUVOVCggUkVTVEFSVCAsICJyZXN0YXJ0IiApOw0KKw0KKwlORVdfU1RBVEVNRU5UKCBTVE9QICwgInN0b3AiICk7DQorCU5FV19TVEFURU1FTlQoIFdBSVQgLCAid2FpdCIgKTsNCisNCisJTkVXX1NUQVRFTUVOVCggU1VTUEVORCAsICJzdXNwZW5kIiApOw0KKwlORVdfU1RBVEVNRU5UKCBSRVNVTUUgICwgInJlc3VtZSIgICk7DQorDQorCU5FV19TVEFURU1FTlRfSU5WT0tFKCBJRU5BQkxFICwgImllbmFibGUiICk7DQorCU5FV19TVEFURU1FTlRfSU5WT0tFKCBFTkFCTEUgICwgImVuYWJsZSIgICk7DQorDQorCU5FV19TVEFURU1FTlRfRElFU0UoIEVOQUJMRSAsIFNFVCAsICJlbmFibGUjc2V0IiApOw0KKw0KKwlORVdfU1RBVEVNRU5UX0lOVk9LRSggSURJU0FCTEUgLCAiaWRpc2FibGUiICk7DQorCU5FV19TVEFURU1FTlRfSU5WT0tFKCBESVNBQkxFICAsICJkaXNhYmxlIiAgKTsNCisNCisJTkVXX1NUQVRFTUVOVF9ESUVTRSggRElTQUJMRSAgLCBTRVQgICAgLCAiZGlzYWJsZSNzZXQiICAgKTsNCisJTkVXX1NUQVRFTUVOVF9ESUVTRSggRElTQUJMRSAgLCBDSElMRCAgLCAiZGlzYWJsZSNjaGlsZCIgKTsNCisJTkVXX1NUQVRFTUVOVF9ESUVTRSggRElTQUJMRSAgLCBTRUxGICAgLCAiZGlzYWJsZSNzZWxmIiAgKTsNCisJTkVXX1NUQVRFTUVOVF9ESUVTRSggRElTQUJMRSAgLCBTRUxWRVMgLCAiZGlzYWJsZSNzZWx2ZXMiKTsNCisNCisJTkVXX1NUQVRFTUVOVF9JTlZPS0UoIElBQk9SVCAsICJpYWJvcnQiICk7DQorCU5FV19TVEFURU1FTlRfSU5WT0tFKCBBQk9SVCAgLCAiYWJvcnQiICApOw0KKw0KKwlORVdfU1RBVEVNRU5UX0RJRVNFKCBBQk9SVCAsIFNFVCAgICAsICJhYm9ydCNzZXQiICAgKTsNCisJTkVXX1NUQVRFTUVOVF9ESUVTRSggQUJPUlQgLCBDSElMRCAgLCAiYWJvcnQjY2hpbGQiICk7DQorCU5FV19TVEFURU1FTlRfRElFU0UoIEFCT1JUICwgU0VMRiAgICwgImFib3J0I3NlbGYiICApOw0KKwlORVdfU1RBVEVNRU5UX0RJRVNFKCBBQk9SVCAsIFNFTFZFUyAsICJhYm9ydCNzZWx2ZXMiKTsNCisNCisJTkVXX1NUQVRFTUVOVF9ESUVTRSggSElTVE9SWSAsIENMRUFSICAsICJoaXN0b3J5I2NsZWFyIiAgICAgICAgICApOw0KKwlORVdfU1RBVEVNRU5UX0lOVk9LRSggREVFUF9ISVNUT1JZICAgICwgImRlZXBfaGlzdG9yeSNpbnZva2UiICAgICk7DQorCU5FV19TVEFURU1FTlRfSU5WT0tFKCBTSEFMTE9XX0hJU1RPUlkgLCAic2hhbGxvd19oaXN0b3J5I2ludm9rZSIgKTsNCisNCisJTkVXX1NUQVRFTUVOVCggSVJVTiwgImlydW4iKTsNCisJTkVXX1NUQVRFTUVOVCggUlVOICwgInJ1biIgKTsNCisJTkVXX1NUQVRFTUVOVCggUlRDICwgInJ0YyIgKTsNCisNCisJTkVXX1NUQVRFTUVOVCggSU5WT0tFX05FVyAgICAgICAsICJpbnZva2UjbmV3IiAgICAgICApOw0KKw0KKwlORVdfU1RBVEVNRU5UKCBJTlZPS0VfUk9VVElORSAgICwgImludm9rZSNyb3V0aW5lIiAgICk7DQorDQorCU5FV19TVEFURU1FTlQoIElOVk9LRV9UUkFOU0lUSU9OLCAiaW52b2tlI3RyYW5zaXRpb24iKTsNCisNCisJTkVXX1NUQVRFTUVOVCggSU5WT0tFX01FVEhPRCAgICAsICJpbnZva2UjbWV0aG9kIiAgICApOw0KKwlORVdfU1RBVEVNRU5UKCBJTlZPS0VfUFJPR1JBTSAgICwgImludm9rZSNwcm9ncmFtIiAgICk7DQorCU5FV19TVEFURU1FTlQoIElOVk9LRV9GVU5DVElPTiAgLCAiaW52b2tlI2Z1bmN0aW9uIiAgKTsNCisNCisJTkVXX1NUQVRFTUVOVCggSU5WT0tFX0xBTUJEQV9BUFBMWSwgImludm9rZSNhcHBseSIgICApOw0KKwlORVdfU1RBVEVNRU5UKCBJTlZPS0VfTEFNQkRBX0xFVCAgLCAiaW52b2tlI2xldCIgICAgICk7DQorDQorCU5FV19TVEFURU1FTlQoIEdPVE8sICJnb3RvIik7DQorDQorCU5FV19TVEFURU1FTlRfRElFU0UoIFNDSEVEVUxFICwgSU5WT0tFLCAic2NoZWR1bGUiICAgICk7DQorCU5FV19TVEFURU1FTlRfRElFU0UoIFNDSEVEVUxFICwgR0VUICAgLCAic2NoZWR1bGUjZ2V0Iik7DQorCU5FV19TVEFURU1FTlRfRElFU0UoIFNDSEVEVUxFICwgSU4gICAgLCAic2NoZWR1bGUjaW4iICk7DQorCU5FV19TVEFURU1FTlRfRElFU0UoIFNDSEVEVUxFICwgU0VUICAgLCAic2NoZWR1bGUjc2V0Iik7DQorDQorCU5FV19TVEFURU1FTlRfRElFU0UoIERFRkVSICwgSU5WT0tFLCAiZGVmZXIiICAgICk7DQorCU5FV19TVEFURU1FTlRfRElFU0UoIERFRkVSICwgR0VUICAgLCAiZGVmZXIjZ2V0Iik7DQorCU5FV19TVEFURU1FTlRfRElFU0UoIERFRkVSICwgU0VUICAgLCAiZGVmZXIjc2V0Iik7DQorDQorCU5FV19PUF9BU1NPQ19DT00oIEZPUksgLCAiZm9yayIgLCAifGZvcmt8IiApOw0KKwlORVdfT1BfQVNTT0NfQ09NKCBKT0lOICwgImpvaW4iICwgInxqb2lufCIgKTsNCisNCisJTkVXX1NUQVRFTUVOVCggSU5QVVRfRU5BQkxFRCwgImlucHV0X2VuYWJsZWQiKTsNCisNCisJTkVXX1NUQVRFTUVOVCggUkRWLCAicmR2Iik7DQorDQorCU5FV19TVEFURU1FTlQoIFNZTkNIUk9OSVpFLCAic3luY2hyb25pemUiKTsNCisNCisJLyoNCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKiBBVk0gREFUQSBTVEFUVVMNCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKi8NCisJTkVXX0ZVTkNUSU9OKCBTVEFUVVNfV0FTICAgLCAic3RhdHVzI3dhcyIgICApOw0KKwlORVdfRlVOQ1RJT04oIFNUQVRVU19JUyAgICAsICJzdGF0dXMjaXMiICAgICk7DQorCU5FV19GVU5DVElPTiggU1RBVFVTX0JFSU5HICwgInN0YXR1cyNiZWluZyIgKTsNCisJTkVXX0ZVTkNUSU9OKCBTVEFUVVNfV0lMTCAgLCAic3RhdHVzI3dpbGwiICApOw0KKwlORVdfRlVOQ1RJT04oIENIQU5HRUQgICAgICAsICJjaGFuZ2VkIiAgICAgICk7DQorCU5FV19GVU5DVElPTiggQ0hBTkdFRF9UTyAgICwgImNoYW5nZWQjdG8iICAgKTsNCisNCisJLyoNCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKiBBVk0gUFJPR1JBTSBTQ0hFRFVMSU5HDQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICovDQorCU5FV19PUF9BU1NPQ19DT00oIEFTWU5DSFJPTk9VUyAsICJhc3luYyIgLCAifGF8Iik7DQorDQorCU5FV19PUF9BU1NPQ19DT00oIFNUUk9OR19TWU5DSFJPTk9VUyAsICJzdHJvbmdfc3luYyIgLCAifGFuZHwiKTsNCisNCisJTkVXX09QX0FTU09DX0NPTSggV0VBS19TWU5DSFJPTk9VUyAsICJ3ZWFrX3N5bmMiICwgInxvcnwiKTsNCisNCisJTkVXX09QX0FTU09DX0NPTSggSU5URVJMRUFWSU5HICwgImludGVybGVhdmluZyIgLCAifGl8Iik7DQorDQorCU5FV19PUF9BU1NPQ19DT00oIFBBUlRJQUxfT1JERVJfUkVEVUNUSU9OICwgInBhcnRpYWxfb3JkZXJfcmVkdWN0aW9uIiAsICJ8cG9yfCIpOw0KKw0KKwlORVdfT1BfQVNTT0NfQ09NKCBQQVJBTExFTCAsICJwYXJhbGxlbCIgLCAifCx8Iik7DQorDQorCS8vIE9wdGltaXplZCB2ZXJzaW9uIG9mIGNvbmN1cnJlbmN5IGZvciBSRFYgc3luY2hyb25pemF0aW9uDQorCU5FV19PUF9BU1NPQ19DT01fUkRWKCBBU1lOQ0hST05PVVMgLCAicmR2X2FzeW5jIiAsICJ8fGF8fCIpOw0KKw0KKwlORVdfT1BfQVNTT0NfQ09NX1JEViggU1RST05HX1NZTkNIUk9OT1VTICwgInJkdl9zdHJvbmdfc3luYyIgLCAifHxhbmR8fCIpOw0KKw0KKwlORVdfT1BfQVNTT0NfQ09NX1JEViggV0VBS19TWU5DSFJPTk9VUyAsICJyZHZfd2Vha19zeW5jIiAsICJ8fG9yfHwiKTsNCisNCisJTkVXX09QX0FTU09DX0NPTV9SRFYoIElOVEVSTEVBVklORyAsICJyZHZfaW50ZXJsZWF2aW5nIiAsICJ8fGl8fCIpOw0KKw0KKwlORVdfT1BfQVNTT0NfQ09NKCBSRFZfUEFSVElBTF9PUkRFUl9SRURVQ1RJT04gLA0KKwkJCSJyZHZfcGFydGlhbF9vcmRlcl9yZWR1Y3Rpb24iICwgInx8cG9yfHwiKTsNCisNCisJTkVXX09QX0FTU09DX0NPTV9SRFYoIFBBUkFMTEVMICwgInJkdl9wYXJhbGxlbCIgLCAifHwsfHwiKTsNCisNCisJTkVXX09QX0FTU09DX0NPTSggRVhDTFVTSVZFICwgImV4Y2x1c2l2ZSIgLCAifHhvcnwiKTsNCisNCisJTkVXX09QX0FTU09DX0NPTSggTk9OREVURVJNSU5JU00gLCAiaW5kZXRlcm1pbmlzbSIgLCAifC9cXHwiKTsNCisNCisJTkVXX09QX0xFRlRfQVNTT0MoIFBSSU9SX0dUICwgInByaW9yX2d0IiAsICJ8PnwiKTsNCisJTkVXX09QX0xFRlRfQVNTT0MoIFBSSU9SX0xUICwgInByaW9yX2x0IiAsICJ8PHwiKTsNCisNCisJTkVXX09QX0FTU09DX0NPTSggU0NIRURVTEVfQU5EX1RIRU4gLCAifGFuZCN0aGVufCIgLCAifGFuZCN0aGVufCIpOw0KKwlORVdfT1BfQVNTT0NfQ09NKCBTQ0hFRFVMRV9PUl9FTFNFICAsICJ8b3IjZWxzZXwiICAsICJ8b3IjZWxzZXwiICk7DQorDQorCU5FV19PUF9BU1NPQyggQVRPTUlDX1NFUVVFTkNFICwgImF0b21pYyIgICAsICJ8wqd8IiAgKTsNCisJTkVXX09QX0FTU09DKCBTRVFVRU5DRSAgICAgICAgLCAic2VxIiAgICAgICwgInw7fCIgICk7DQorCU5FV19PUF9BU1NPQyggU0VRVUVOQ0VfU0lERSAgICwgInNlcV9zaWRlIiAsICJ8Lzt8IiApOw0KKwlORVdfT1BfQVNTT0MoIFNFUVVFTkNFX1dFQUsgICAsICJzZXFfd2VhayIgLCAifDs7fCIgKTsNCisNCisJTkVXX09QX0FTU09DX0NPTSggUFJPRFVDVCAsICJwcm9kIiAsICJ8eHwiKTsNCisNCisJLyoNCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKiBBVk0gQlVGRkVSIE1BTkFHSU5HDQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICovDQorCU5FV19GVU5DVElPTiggVVBEQVRFX0JVRkZFUiAsICJVcGRhdGVCdWZmZXIiICk7DQorDQorCS8qDQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICogTEFNQkRBIFNUQVRFTUVOVA0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqLw0KKwlORVdfRlVOQ1RJT04oIEFQUExZICAsICJhcHBseSIgICk7DQorCU5FV19GVU5DVElPTiggTEFNQkRBICwgImxhbWJkYSIgKTsNCisNCisJLyoNCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKiBMRVQgU1RBVEVNRU5UDQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICovDQorCU5FV19PUF9QUkVGSVgoIExFVCAsICJsZXQiICk7DQorDQorCS8qDQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICogTE9PS1VQIFNUQVRFTUVOVA0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqLw0KKwlORVdfRlVOQ1RJT04oIExPT0tVUF9JTlRfRVhUICAgLCAibG9va3VwaWUiICAgKTsNCisJTkVXX0ZVTkNUSU9OKCBMT09LVVBfSU5UICAgICAgICwgImxvb2t1cGkiICAgICk7DQorCU5FV19GVU5DVElPTiggTE9PS1VQX05FQVJFU1QgICAsICJsb29rdXBuIiAgICApOw0KKwlORVdfRlVOQ1RJT04oIExPT0tVUF9CRUxPVyAgICAgLCAibG9va3VwYiIgICAgKTsNCisJTkVXX0ZVTkNUSU9OKCBMT09LVVBfQUJPVkUgICAgICwgImxvb2t1cGEiICAgICk7DQorCU5FV19GVU5DVElPTiggTE9PS1VQMkRfSU5UX0VYVCAsICJsb29rdXAyZGllIiApOw0KKw0KKw0KKwkvKg0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqIEFWTSBQUklNSVRJVkUgU1RBVEVNRU5UDQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICovDQorCU5FV19PUF9SSUdIVF9BU1NPQyggQVNTSUdOICwgImFzc2lnbiIgICAgICAgICAgLCAiOj0iICk7DQorDQorCU5FV19PUF9SSUdIVF9BU1NPQ19ESUVTRSggQVNTSUdOICwgQUZURVIgICAsICJhc3NpZ24jYWZ0ZXIiICAgLCAiPToiICk7DQorCU5FV19PUF9SSUdIVF9BU1NPQ19ESUVTRSggQVNTSUdOICwgT1AgICAgICAsICJhc3NpZ24jb3AiICAgICAgLCAiOj0iICk7DQorCU5FV19PUF9SSUdIVF9BU1NPQ19ESUVTRSggQVNTSUdOICwgT1BfQUZURVIsICJhc3NpZ24jb3AjYWZ0ZXIiLCAiPToiICk7DQorCU5FV19PUF9SSUdIVF9BU1NPQ19ESUVTRSggQVNTSUdOICwgUkVGICAgICAsICJhc3NpZ24jcmVmIiAgICAgLCAiPC0iICk7DQorCU5FV19PUF9SSUdIVF9BU1NPQ19ESUVTRSggQVNTSUdOICwgTUFDUk8gICAsICJhc3NpZ24jbWFjcm8iICAgLCAiOjo9Iik7DQorDQorCU5FV19GVU5DVElPTiggQVNTSUdOX05FV0ZSRVNIICwgIm5ld2ZyZXNoIiApOw0KKwlORVdfRlVOQ1RJT04oIEFTU0lHTl9SRVNFVCAgICAsICJyZXNldCIgICAgKTsNCisNCisJTkVXX1NUQVRFTUVOVCggR1VBUkQgICAgICAsICJndWFyZCIgICAgICk7DQorCU5FV19TVEFURU1FTlQoIFRJTUVEX0dVQVJELCAidGd1YXJkIiAgICApOw0KKw0KKwlORVdfU1RBVEVNRU5UKCBFVkVOVCAgICAgICwgImV2ZW50IiAgICAgKTsNCisNCisJTkVXX1NUQVRFTUVOVCggQ0hFQ0tfU0FUICAsICJjaGVja19zYXQiICk7DQorDQorCU5FV19TVEFURU1FTlQoIElOUFVUICAgICAgLCAiaW5wdXQiICAgICApOw0KKw0KKwlORVdfU1RBVEVNRU5UKCBJTlBVVF9GUk9NICwgImlucHV0X2Zyb20iKTsNCisJTkVXX1NUQVRFTUVOVCggSU5QVVRfU0FWRSAsICJpbnB1dCNzYXZlIik7DQorDQorCS8vIE9wdGltaXplZCB2ZXJzaW9uIG9mIElOUFVUDQorCU5FV19TVEFURU1FTlRfT1BUSSggSU5QVVQgLCBWQVIgICAsICJpbnB1dCN2YXIiICAgKTsNCisJTkVXX1NUQVRFTUVOVF9PUFRJKCBJTlBVVCAsIEZMT1cgICwgImlucHV0I2Zsb3ciICApOw0KKw0KKwlORVdfU1RBVEVNRU5UX09QVEkoIElOUFVUICwgRU5WICAgLCAiaW5wdXQjZW52IiAgICk7DQorCU5FV19TVEFURU1FTlRfT1BUSSggSU5QVVQgLCBCVUZGRVIsICJpbnB1dCNidWZmZXIiKTsNCisJTkVXX1NUQVRFTUVOVF9PUFRJKCBJTlBVVCAsIFJEViAgICwgImlucHV0I3JkdiIgICApOw0KKw0KKwlORVdfU1RBVEVNRU5UX09QVEkoIElOUFVUICwgQlJPQURDQVNULCAiaW5wdXQjYnJvYWRjYXN0Iik7DQorCU5FV19TVEFURU1FTlRfT1BUSSggSU5QVVQgLCBERUxFR0FURSAsICJpbnB1dCNkZWxlZ2F0ZSIgKTsNCisNCisJTkVXX1NUQVRFTUVOVCggT1VUUFVULCAib3V0cHV0Iik7DQorDQorCU5FV19TVEFURU1FTlQoIE9VVFBVVF9UTywgIm91dHB1dF90byIpOw0KKw0KKwkvLyBPcHRpbWl6ZWQgdmVyc2lvbiBvZiBPVVRQVVQNCisJTkVXX1NUQVRFTUVOVF9PUFRJKCBPVVRQVVQgLCBWQVIgICAsICJvdXRwdXQjdmFyIiAgICk7DQorCU5FV19TVEFURU1FTlRfT1BUSSggT1VUUFVUICwgRkxPVyAgLCAib3V0cHV0I2Zsb3ciICApOw0KKw0KKwlORVdfU1RBVEVNRU5UX09QVEkoIE9VVFBVVCAsIEVOViAgICwgIm91dHB1dCNlbnYiICAgKTsNCisJTkVXX1NUQVRFTUVOVF9PUFRJKCBPVVRQVVQgLCBCVUZGRVIsICJvdXRwdXQjYnVmZmVyIik7DQorCU5FV19TVEFURU1FTlRfT1BUSSggT1VUUFVUICwgUkRWICAgLCAib3V0cHV0I3JkdiIgICApOw0KKw0KKwlORVdfU1RBVEVNRU5UX09QVEkoIE9VVFBVVCAsIEJST0FEQ0FTVCwgIm91dHB1dCNicm9hZGNhc3QiKTsNCisJTkVXX1NUQVRFTUVOVF9PUFRJKCBPVVRQVVQgLCBERUxFR0FURSAsICJvdXRwdXQjZGVsZWdhdGUiICk7DQorDQorCU5FV19TVEFURU1FTlQoIFBSRVNFTlQsICJwcmVzZW50Iik7DQorCU5FV19TVEFURU1FTlQoIEFCU0VOVCAsICJhYnNlbnQiICk7DQorDQorCU5FV19PUF9QUkVGSVgoSUYgICwgImlmIiAgKTsNCisJTkVXX09QX1BSRUZJWChJRkUgLCAiaWZlIiApOw0KKw0KKwlORVdfU1RBVEVNRU5UKCBGT1IgICAgICAgLCAiZm9yIiAgICAgICApOw0KKwlORVdfU1RBVEVNRU5UKCBGT1JFQUNIICAgLCAiZm9yZWFjaCIgICApOw0KKwlORVdfU1RBVEVNRU5UKCBXSElMRV9ETyAgLCAid2hpbGVfZG8iICApOw0KKwlORVdfU1RBVEVNRU5UKCBET19XSElMRSAgLCAiZG9fd2hpbGUiICApOw0KKw0KKwlORVdfU1RBVEVNRU5UKCBCUkVBSyAgICAgLCAiYnJlYWsiICAgICApOw0KKwlORVdfU1RBVEVNRU5UKCBDT05USU5VRSAgLCAiY29udGludWUiICApOw0KKw0KKwlORVdfU1RBVEVNRU5UKCBSRVRVUk4gICAgLCAicmV0dXJuIiAgICApOw0KKwlORVdfU1RBVEVNRU5UKCBFWElUICAgICAgLCAiZXhpdCIgICAgICApOw0KKw0KKwlORVdfU1RBVEVNRU5UKCBTVEVQX01BUksgLCAic3RlcF9tYXJrIiApOw0KKw0KKwkvKg0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqIEFWTSBQUkVESUNBVCBFWFBSRVNTSU9ODQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICovDQorCU5FV19PUF9QUkVGSVgoIEVYSVNUICAsICJleGlzdCIgKTsNCisJTkVXX09QX1BSRUZJWCggRk9SQUxMICwgImZvcmFsbCIgKTsNCisNCisJTkVXX09QX1BSRUZJWF9GVUxMKE5PVCAsICJub3QiLCAiISIsICIhXyIsICJ+Iik7DQorDQorCU5FV19PUF9BU1NPQ19DT01fRlVMTCggQU5EICwgImFuZCIgLCAiJiYiLCAiXyZfIiwgIi9cXCIpOw0KKw0KKwlORVdfT1BfSU5GSVgoIEFORF9USEVOICwgImFuZCN0aGVuIiApOw0KKw0KKwlORVdfT1BfQVNTT0NfQ09NKCBOQU5EICwgIm5hbmQiICwgIm5hbmQiICk7DQorCU5FV19PUF9BU1NPQ19DT00oIFhBTkQgLCAieGFuZCIgLCAieGFuZCIgKTsNCisNCisJTkVXX09QX0FTU09DX0NPTV9GVUxMKCBPUiAsICJvciIgLCAifHwiLCAiX3xfIiwgIlxcLyIpOw0KKw0KKwlORVdfT1BfSU5GSVgoIE9SX0VMU0UgLCAib3IjZWxzZSIgKTsNCisNCisJTkVXX09QX0FTU09DX0NPTSggTk9SICAsICJub3IiICAsICJub3IiICApOw0KKwlORVdfT1BfQVNTT0NfQ09NKCBYT1IgICwgInhvciIgICwgInhvciIgICk7DQorCU5FV19PUF9BU1NPQ19DT00oIFhOT1IgLCAieG5vciIgLCAieG5vciIgKTsNCisNCisJLyoNCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKiBBVk0gQ09NUEFSSVNPTiBFWFBSRVNTSU9ODQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICovDQorCU5FV19PUF9JTkZJWF9GVUxMKCBTRVEgICwgInNlcSIgICwgIj09PSIsICJfPT09XyIsICI9PT0iKTsNCisJTkVXX09QX0lORklYX0ZVTEwoIE5TRVEgLCAibnNlcSIgLCAiPSE9IiwgIl89IT1fIiwgIj0vPSIpOw0KKw0KKwkvKg0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqIEFWTSBDT01QQVJJU09OIEVYUFJFU1NJT04NCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKi8NCisJTkVXX09QX0lORklYX0ZVTEwoIEVRICAsICJlcSIgICwgIj09IiwgIl89PV8iLCAiPSIgKTsNCisJTkVXX09QX0lORklYX0ZVTEwoIE5FUSAsICJuZXEiICwgIiE9IiwgIl8hPV8iLCAiLz0iKTsNCisNCisJTkVXX09QX0lORklYX0ZVTEwoIExUICAsICJsdCIgICwgIjwiICwgIl88XyIgLCAiPCIgKTsNCisJTkVXX09QX0lORklYX0ZVTEwoIExURSAsICJsdGUiICwgIjw9IiwgIl88PV8iLCAiPD0iKTsNCisNCisJTkVXX09QX0lORklYX0ZVTEwoIEdUICAsICJndCIgICwgIj4iICwgIl8+XyIgLCAiPiIgKTsNCisJTkVXX09QX0lORklYX0ZVTEwoIEdURSAsICJndGUiICwgIj49IiwgIl8+PV8iLCAiPj0iKTsNCisNCisJLyoNCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKiBBVk0gQklUV0lTRSBFWFBSRVNTSU9ODQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICovDQorCU5FV19PUF9QUkVGSVhfRlVMTCggQk5PVCAsICJibm90IiAsICJ+IiAsICJfYm5vdF8iLCAiYm5vdCIpOw0KKw0KKwlORVdfT1BfSU5GSVgoIEJBTkQgLCAiYmFuZCIgKTsNCisJTkVXX09QX0lORklYKCBCT1IgICwgImJvciIgICk7DQorCU5FV19PUF9JTkZJWCggQlhPUiAsICJieG9yIiApOw0KKw0KKwlORVdfT1BfSU5GSVhfRlVMTCggTFNISUZUICwgImxzaGlmdCIgLCAiPDwiLCAiX2xzaGlmdF8iLCAibHNoaWZ0Iik7DQorCU5FV19PUF9JTkZJWF9GVUxMKCBSU0hJRlQgLCAicnNoaWZ0IiAsICI+PiIsICJfcnNoaWZ0XyIsICJyc2hpZnQiKTsNCisNCisJLyoNCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKiBBVk0gQVJJVEhNRVRJQyBFWFBSRVNTSU9ODQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICovDQorCU5FV19PUF9BU1NPQ19DT00oIFBMVVMgLCAicGx1cyIgLCAiKyIpOw0KKw0KKwlORVdfT1BfTEVGVF9BU1NPQyggTUlOVVMgLCAibWludXMiICwgIi0iKTsNCisNCisJTkVXX09QX1BSRUZJWF9TWU1CKCBVTUlOVVMgLCAidW1pbnVzIiAsICItIik7DQorDQorCU5FV19PUF9BU1NPQ19DT01fRlVMTCggTVVMVCAsICJtdWx0IiAsICIqIiwgIl8qXyIsICIgIik7DQorDQorCU5FV19PUF9SSUdIVF9BU1NPQyggUE9XICAsICJwb3ciICAsICJeIik7DQorDQorCU5FV19PUF9MRUZUX0FTU09DKCBESVYgLCAiZGl2IiAsICIvIik7DQorCU5FV19PUF9MRUZUX0FTU09DKCBNT0QgLCAibW9kIiAsICIlIik7DQorDQorCU5FV19PUF9BU1NPQ19DT00oIE1JTiAsICJtaW4iICwgIm1pbiIgKTsNCisJTkVXX09QX0FTU09DX0NPTSggTUFYICwgIm1heCIgLCAibWF4IiApOw0KKw0KKwkvKg0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqIEFWTSBNQVRIRU1BVElDQUwgRlVOQ1RJT04NCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKi8NCisJLy8gUkFORE9NDQorCU5FV19GVU5DVElPTiggUkFORE9NICwgInJhbmRvbSIgKTsNCisNCisJLy8gQUJTDQorCU5FV19GVU5DVElPTiggQUJTICAgICwgImFicyIgICk7DQorDQorCS8vIFJPVU5ESU5HDQorCU5FV19GVU5DVElPTiggQ0VJTCAgLCAiY2VpbCIgICk7DQorCU5FV19GVU5DVElPTiggRkxPT1IgLCAiZmxvb3IiICk7DQorCU5FV19GVU5DVElPTiggUk9VTkQgLCAicm91bmQiICk7DQorDQorCU5FV19GVU5DVElPTiggVFJVTkNBVEUgLCAidHJ1bmMiICk7DQorDQorCS8vIEVYUCAtIExPRw0KKwlORVdfRlVOQ1RJT04oIFNRUlQgICwgInNxcnQiICApOw0KKwlORVdfRlVOQ1RJT04oIEVYUCAgICwgImV4cCIgICApOw0KKwlORVdfRlVOQ1RJT04oIExOICAgICwgImxuIiAgICApOw0KKwlORVdfRlVOQ1RJT04oIExPRyAgICwgImxvZyIgICApOw0KKw0KKw0KKwkvLyBUUklHT05PTUVUUklDDQorCU5FV19GVU5DVElPTiggU0lOICAgLCAic2luIiAgICk7DQorCU5FV19GVU5DVElPTiggQ09TICAgLCAiY29zIiAgICk7DQorCU5FV19GVU5DVElPTiggVEFOICAgLCAidGFuIiAgICk7DQorDQorCU5FV19GVU5DVElPTiggU0lOSCAgLCAic2luaCIgICk7DQorCU5FV19GVU5DVElPTiggQ09TSCAgLCAiY29zaCIgICk7DQorCU5FV19GVU5DVElPTiggVEFOSCAgLCAidGFuaCIgICk7DQorDQorCU5FV19GVU5DVElPTiggQVNJTiAgLCAiYXNpbiIgICk7DQorCU5FV19GVU5DVElPTiggQUNPUyAgLCAiYWNvcyIgICk7DQorCU5FV19GVU5DVElPTiggQVRBTiAgLCAiYXRhbiIgICk7DQorDQorCU5FV19GVU5DVElPTiggQVRBTjIgLCAiYXRhbjIiICk7DQorDQorCU5FV19GVU5DVElPTiggQVNJTkggLCAiYXNpbmgiICk7DQorCU5FV19GVU5DVElPTiggQUNPU0ggLCAiYWNvc2giICk7DQorCU5FV19GVU5DVElPTiggQVRBTkggLCAiYXRhbmgiICk7DQorDQorCS8qDQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICogQVZNIFNUUklORyAvIENPTExFQ1RJT04gT1BFUkFUT1INCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKi8NCisJTkVXX09QX0lORklYKCBDT05UQUlOUyAsICJjb250YWlucyIgKTsNCisNCisJTkVXX09QX0lORklYKCBJTiAgICAsICJpbiIgICAgKTsNCisJTkVXX09QX0lORklYKCBOT1RJTiAsICJub3RpbiIgKTsNCisNCisJTkVXX09QX0lORklYKCBTVUJTRVQgICAsICJzdWJzZXQiICAgKTsNCisJTkVXX09QX0lORklYKCBTVUJTRVRFUSAsICJzdWJzZXRlcSIgKTsNCisNCisJTkVXX09QX0lORklYKCBJTlRFUlNFQ1QgLCAiaW50ZXJzZWN0IiApOw0KKw0KKwlORVdfT1BfSU5GSVgoIFNUQVJUU19XSVRIICwgInN0YXJ0X3dpdGgiICk7DQorCU5FV19PUF9JTkZJWCggRU5EU19XSVRIICAgLCAiZW5kX3dpdGgiICAgKTsNCisNCisJTkVXX09QX0lORklYKCBDT05DQVQgLCAiY29uY2F0IiAgKTsNCisJTkVXX09QX1BSRUZJWCggQVBQRU5EICwgImFwcGVuZCIgKTsNCisJTkVXX09QX1BSRUZJWCggUkVNT1ZFICwgInJlbW92ZSIgKTsNCisJTkVXX09QX1BSRUZJWCggQ0xFQVIgICwgImNsZWFyIiAgKTsNCisJTkVXX09QX1BSRUZJWCggUkVTSVpFICwgInJlc2l6ZSIgKTsNCisJTkVXX09QX1BSRUZJWCggU0VMRUNUICwgInNlbGVjdCIgKTsNCisNCisJTkVXX09QX1BSRUZJWF9TWU1CKCBQVVNIICwgInB1c2giICwgIjw9PCIpOw0KKw0KKwlORVdfT1BfUFJFRklYX1NZTUIoIEFTU0lHTl9UT1AgLCAiYXNzaWduX3RvcCIgLCAiXj08Iik7DQorDQorCU5FV19PUF9QUkVGSVhfU1lNQiggVE9QICwgInRvcCIgLCAiXj0+Iik7DQorCU5FV19PUF9QUkVGSVhfU1lNQiggUE9QICwgInBvcCIgLCAiPj0+Iik7DQorDQorCU5FV19PUF9QUkVGSVhfU1lNQiggUE9QX0ZST00gLCAicG9wX2Zyb20iICwgIj4/PiIpOw0KKw0KKwlORVdfRlVOQ1RJT04oIEVNUFRZICAgICAsICJlbXB0eSIgICAgICk7DQorCU5FV19GVU5DVElPTiggTk9ORU1QVFkgICwgIm5vbmVtcHR5IiAgKTsNCisJTkVXX0ZVTkNUSU9OKCBTSU5HTEVUT04gLCAic2luZ2xldG9uIiApOw0KKwlORVdfRlVOQ1RJT04oIFBPUFVMQVRFRCAsICJwb3B1bGF0ZWQiICk7DQorDQorCU5FV19GVU5DVElPTiggRlVMTCAgICAgICwgImZ1bGwiICAgICAgKTsNCisJTkVXX0ZVTkNUSU9OKCBTSVpFICAgICAgLCAic2l6ZSIgICAgICApOw0KKw0KKwkvKg0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqIElPTFRMIEJFSEFWSU9SQUwgUFJFRElDQVQNCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKi8NCisJTkVXX09QX1BSRUZJWCggR0xPQkFMTFkgLCAiZ2xvYmFsbHkiICk7DQorCU5FV19PUF9JTkZJWCAoIFVOVElMICAgICwgInVudGlsIiAgICApOw0KKwlORVdfT1BfUFJFRklYKCBORVhUICAgICAsICJuZXh0IiAgICAgKTsNCisNCisJTkVXX09QX1BSRUZJWF9TWU1CKCBFVkVOVFVBTExZICwgImV2ZW50dWFsbHkiICwgImV2dGx5Iik7DQorCU5FV19PUF9QUkVGSVhfU1lNQiggUkVMRUFTRVMgICAsICJyZWxlYXNlcyIgICAsICJyZWxzIiApOw0KKw0KKwlORVdfT1BfUFJFRklYKCBPQlMgLCAib2JzIiApOw0KKw0KKw0KKwkvKg0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqIElPTFRMIExPR0lDQUwgUFJFRElDQVQNCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKi8NCisJTkVXX09QX0lORklYX0ZVTEwgKCBBTkRfVCAsICJhbmRfdCIgLCAiJiIsICJfJl8iLCAiIC9cXCIpOw0KKwlORVdfT1BfSU5GSVhfRlVMTCAoIE9SX1QgICwgIm9yX3QiICAsICJ8IiwgIl98XyIsICJPUi1UIik7DQorDQorCU5FV19PUF9QUkVGSVhfRlVMTCggTk9UX1QgLCAibm90X3QiICwgIiEiLCAiIV8iLCAiTk9ULVQiKTsNCisNCisJTkVXX09QX0lORklYX0ZVTEwgKCBJTVBfVCAsICJpbXBfdCIgLCAiLT4iLCAiXy0+XyIsICJJTVBMSUVTLVQiKTsNCit9DQorDQorDQorLyoqDQorICogRElTUE9TRVINCisgKi8NCit2b2lkIE9wZXJhdG9yTWFuYWdlcjo6ZGlzcG9zZSgpDQorew0KKwl0aGVPcGVyYXRvcnNNYXAuY2xlYXIoKTsNCisNCisJVEFCTEVfT0ZfT1BFUkFUT1IuY2xlYXIoKTsNCisNCisJLyoNCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKiBBVk0gTk9QIFNUQVRFTUVOVA0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqLw0KKwlPUEVSQVRPUl9OT1AgPSBOVUxMOw0KKw0KKwkvKg0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqIEFWTSBOT1AgU1RBVEVNRU5UDQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICovDQorCU9QRVJBVE9SX0lORk9STUFMID0gTlVMTDsNCisNCisJT1BFUkFUT1JfVFJBQ0UgPSBOVUxMOw0KKwlPUEVSQVRPUl9ERUJVRyA9IE5VTEw7DQorDQorCU9QRVJBVE9SX0NPTU1FTlQgPSBOVUxMOw0KKwlPUEVSQVRPUl9RVU9URSAgID0gTlVMTDsNCisNCisJT1BFUkFUT1JfTUVUQV9FVkFMID0gTlVMTDsNCisJT1BFUkFUT1JfTUVUQV9SVU4gID0gTlVMTDsNCisNCisNCisJLyoNCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKiBBVk0gVUZJIFNUQVRFTUVOVA0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqLw0KKwlPUEVSQVRPUl9VRkkgPSBOVUxMOw0KKw0KKwkvKg0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqIEFWTSBGT1JNIENPTlNUUlVDVE9SIFNUQVRFTUVOVA0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqLw0KKwlPUEVSQVRPUl9DVE9SID0gTlVMTDsNCisNCisJLyoNCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKiBBVk0gTUFDSElORSBNQU5BR0lORw0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqLw0KKwlPUEVSQVRPUl9DT05URVhUX1NXSVRDSEVSID0gTlVMTDsNCisNCisJT1BFUkFUT1JfSU5JVCA9IE5VTEw7DQorCU9QRVJBVE9SX0ZJTkFMID0gTlVMTDsNCisJT1BFUkFUT1JfREVTVFJPWSA9IE5VTEw7DQorDQorCU9QRVJBVE9SX1NUQVJUID0gTlVMTDsNCisJT1BFUkFUT1JfUkVTVEFSVCA9IE5VTEw7DQorCU9QRVJBVE9SX1NUT1AgPSBOVUxMOw0KKw0KKwlPUEVSQVRPUl9XQUlUID0gTlVMTDsNCisNCisJT1BFUkFUT1JfU1VTUEVORCA9IE5VTEw7DQorCU9QRVJBVE9SX1JFU1VNRSA9IE5VTEw7DQorDQorCU9QRVJBVE9SX0lFTkFCTEVfSU5WT0tFID0gTlVMTDsNCisJT1BFUkFUT1JfRU5BQkxFX0lOVk9LRSA9IE5VTEw7DQorCU9QRVJBVE9SX0VOQUJMRV9TRVQgPSBOVUxMOw0KKw0KKwlPUEVSQVRPUl9JRElTQUJMRV9JTlZPS0UgPSBOVUxMOw0KKwlPUEVSQVRPUl9ESVNBQkxFX0lOVk9LRSA9IE5VTEw7DQorCU9QRVJBVE9SX0RJU0FCTEVfU0VUID0gTlVMTDsNCisJT1BFUkFUT1JfRElTQUJMRV9DSElMRCA9IE5VTEw7DQorCU9QRVJBVE9SX0RJU0FCTEVfU0VMRiA9IE5VTEw7DQorCU9QRVJBVE9SX0RJU0FCTEVfU0VMVkVTID0gTlVMTDsNCisNCisJT1BFUkFUT1JfSUFCT1JUX0lOVk9LRSA9IE5VTEw7DQorCU9QRVJBVE9SX0FCT1JUX0lOVk9LRSA9IE5VTEw7DQorCU9QRVJBVE9SX0FCT1JUX1NFVCA9IE5VTEw7DQorCU9QRVJBVE9SX0FCT1JUX0NISUxEID0gTlVMTDsNCisJT1BFUkFUT1JfQUJPUlRfU0VMRiA9IE5VTEw7DQorCU9QRVJBVE9SX0FCT1JUX1NFTFZFUyA9IE5VTEw7DQorDQorCU9QRVJBVE9SX0hJU1RPUllfQ0xFQVIgPSBOVUxMOw0KKwlPUEVSQVRPUl9ERUVQX0hJU1RPUllfSU5WT0tFID0gTlVMTDsNCisJT1BFUkFUT1JfU0hBTExPV19ISVNUT1JZX0lOVk9LRSA9IE5VTEw7DQorDQorCU9QRVJBVE9SX0lSVU4gPSBOVUxMOw0KKwlPUEVSQVRPUl9SVU4gPSBOVUxMOw0KKwlPUEVSQVRPUl9SVEMgPSBOVUxMOw0KKw0KKwlPUEVSQVRPUl9JTlZPS0VfTkVXID0gTlVMTDsNCisNCisJT1BFUkFUT1JfSU5WT0tFX1JPVVRJTkUgPSBOVUxMOw0KKw0KKwlPUEVSQVRPUl9JTlZPS0VfVFJBTlNJVElPTiA9IE5VTEw7DQorDQorCU9QRVJBVE9SX0lOVk9LRV9NRVRIT0QgPSBOVUxMOw0KKwlPUEVSQVRPUl9JTlZPS0VfUFJPR1JBTSA9IE5VTEw7DQorCU9QRVJBVE9SX0lOVk9LRV9GVU5DVElPTiA9IE5VTEw7DQorDQorCU9QRVJBVE9SX0lOVk9LRV9MQU1CREFfQVBQTFkgPSBOVUxMOw0KKwlPUEVSQVRPUl9JTlZPS0VfTEFNQkRBX0xFVCA9IE5VTEw7DQorDQorCU9QRVJBVE9SX0dPVE8gPSBOVUxMOw0KKw0KKwlPUEVSQVRPUl9TQ0hFRFVMRV9JTlZPS0UgPSBOVUxMOw0KKwlPUEVSQVRPUl9TQ0hFRFVMRV9HRVQgPSBOVUxMOw0KKwlPUEVSQVRPUl9TQ0hFRFVMRV9JTiA9IE5VTEw7DQorCU9QRVJBVE9SX1NDSEVEVUxFX1NFVCA9IE5VTEw7DQorDQorCU9QRVJBVE9SX0RFRkVSX0lOVk9LRSA9IE5VTEw7DQorCU9QRVJBVE9SX0RFRkVSX0dFVCA9IE5VTEw7DQorCU9QRVJBVE9SX0RFRkVSX1NFVCA9IE5VTEw7DQorDQorCU9QRVJBVE9SX0ZPUksgPSBOVUxMOw0KKwlPUEVSQVRPUl9KT0lOID0gTlVMTDsNCisNCisJT1BFUkFUT1JfSU5QVVRfRU5BQkxFRCA9IE5VTEw7DQorDQorCU9QRVJBVE9SX1JEViA9IE5VTEw7DQorDQorCU9QRVJBVE9SX1NZTkNIUk9OSVpFID0gTlVMTDsNCisNCisJLyoNCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKiBBVk0gREFUQSBTVEFUVVMNCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKi8NCisNCisJT1BFUkFUT1JfU1RBVFVTX1dBUyA9IE5VTEw7DQorCU9QRVJBVE9SX1NUQVRVU19JUyA9IE5VTEw7DQorCU9QRVJBVE9SX1NUQVRVU19CRUlORyA9IE5VTEw7DQorCU9QRVJBVE9SX1NUQVRVU19XSUxMID0gTlVMTDsNCisNCisJT1BFUkFUT1JfQ0hBTkdFRCA9IE5VTEw7DQorCU9QRVJBVE9SX0NIQU5HRURfVE8gPSBOVUxMOw0KKw0KKw0KKwkvKg0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqIEFWTSBQUk9HUkFNIFNDSEVEVUxJTkcNCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKi8NCisJT1BFUkFUT1JfQVNZTkNIUk9OT1VTID0gTlVMTDsNCisJT1BFUkFUT1JfU1RST05HX1NZTkNIUk9OT1VTID0gTlVMTDsNCisJT1BFUkFUT1JfV0VBS19TWU5DSFJPTk9VUyA9IE5VTEw7DQorDQorCU9QRVJBVE9SX0lOVEVSTEVBVklORyA9IE5VTEw7DQorCU9QRVJBVE9SX1BBUlRJQUxfT1JERVJfUkVEVUNUSU9OID0gTlVMTDsNCisNCisJT1BFUkFUT1JfUEFSQUxMRUwgPSBOVUxMOw0KKw0KKwkvLy8vIE9wdGltaXplZCB2ZXJzaW9uIG9mIGNvbmN1cnJlbmN5IGZvciBSRFYgc3luY2hyb25pemF0aW9uDQorCU9QRVJBVE9SX1JEVl9BU1lOQ0hST05PVVMgPSBOVUxMOw0KKwlPUEVSQVRPUl9SRFZfU1RST05HX1NZTkNIUk9OT1VTID0gTlVMTDsNCisJT1BFUkFUT1JfUkRWX1dFQUtfU1lOQ0hST05PVVMgPSBOVUxMOw0KKw0KKwlPUEVSQVRPUl9SRFZfSU5URVJMRUFWSU5HID0gTlVMTDsNCisJT1BFUkFUT1JfUkRWX1BBUlRJQUxfT1JERVJfUkVEVUNUSU9OID0gTlVMTDsNCisNCisJT1BFUkFUT1JfUkRWX1BBUkFMTEVMID0gTlVMTDsNCisNCisJT1BFUkFUT1JfRVhDTFVTSVZFID0gTlVMTDsNCisNCisJT1BFUkFUT1JfTk9OREVURVJNSU5JU00gPSBOVUxMOw0KKw0KKwlPUEVSQVRPUl9QUklPUl9HVCA9IE5VTEw7DQorCU9QRVJBVE9SX1BSSU9SX0xUID0gTlVMTDsNCisNCisJT1BFUkFUT1JfU0NIRURVTEVfQU5EX1RIRU4gPSBOVUxMOw0KKwlPUEVSQVRPUl9TQ0hFRFVMRV9PUl9FTFNFID0gTlVMTDsNCisNCisJT1BFUkFUT1JfQVRPTUlDX1NFUVVFTkNFID0gTlVMTDsNCisNCisJT1BFUkFUT1JfU0VRVUVOQ0UgPSBOVUxMOw0KKwlPUEVSQVRPUl9TRVFVRU5DRV9TSURFID0gTlVMTDsNCisJT1BFUkFUT1JfU0VRVUVOQ0VfV0VBSyA9IE5VTEw7DQorDQorCU9QRVJBVE9SX1BST0RVQ1QgPSBOVUxMOw0KKw0KKwkvKg0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqIEFWTSBCVUZGRVIgTUFOQUdJTkcNCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKi8NCisJT1BFUkFUT1JfVVBEQVRFX0JVRkZFUiA9IE5VTEw7DQorDQorCS8qDQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqIExBTUJEQSBTVEFURU1FTlQNCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKi8NCisJT1BFUkFUT1JfQVBQTFkgID0gTlVMTDsNCisJT1BFUkFUT1JfTEFNQkRBID0gTlVMTDsNCisNCisJLyoNCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKiBMRVQgU1RBVEVNRU5UDQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICovDQorCU9QRVJBVE9SX0xFVCA9IE5VTEw7DQorDQorCS8qDQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICogTE9PS1VQIFNUQVRFTUVOVA0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqLw0KKwlPUEVSQVRPUl9MT09LVVBfSU5UX0VYVCA9IE5VTEw7DQorCU9QRVJBVE9SX0xPT0tVUF9JTlQgPSBOVUxMOw0KKwlPUEVSQVRPUl9MT09LVVBfTkVBUkVTVCA9IE5VTEw7DQorCU9QRVJBVE9SX0xPT0tVUF9CRUxPVyA9IE5VTEw7DQorCU9QRVJBVE9SX0xPT0tVUF9BQk9WRSA9IE5VTEw7DQorCU9QRVJBVE9SX0xPT0tVUDJEX0lOVF9FWFQgPSBOVUxMOw0KKw0KKwkvKg0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqIEFWTSBQUklNSVRJVkUgU1RBVEVNRU5UDQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICovDQorCU9QRVJBVE9SX0FTU0lHTiA9IE5VTEw7DQorCU9QRVJBVE9SX0FTU0lHTl9BRlRFUiA9IE5VTEw7DQorCU9QRVJBVE9SX0FTU0lHTl9PUCA9IE5VTEw7DQorCU9QRVJBVE9SX0FTU0lHTl9PUF9BRlRFUiA9IE5VTEw7DQorCU9QRVJBVE9SX0FTU0lHTl9SRUYgPSBOVUxMOw0KKwlPUEVSQVRPUl9BU1NJR05fTUFDUk8gPSBOVUxMOw0KKw0KKwlPUEVSQVRPUl9BU1NJR05fTkVXRlJFU0ggPSBOVUxMOw0KKwlPUEVSQVRPUl9BU1NJR05fUkVTRVQgICAgPSBOVUxMOw0KKw0KKwlPUEVSQVRPUl9HVUFSRCAgICAgICA9IE5VTEw7DQorCU9QRVJBVE9SX1RJTUVEX0dVQVJEID0gTlVMTDsNCisNCisJT1BFUkFUT1JfRVZFTlQgPSBOVUxMOw0KKw0KKwlPUEVSQVRPUl9DSEVDS19TQVQgPSBOVUxMOw0KKw0KKw0KKwlPUEVSQVRPUl9JTlBVVCA9IE5VTEw7DQorCU9QRVJBVE9SX0lOUFVUX0ZST00gPSBOVUxMOw0KKw0KKwlPUEVSQVRPUl9JTlBVVF9TQVZFID0gTlVMTDsNCisNCisJT1BFUkFUT1JfSU5QVVRfVkFSID0gTlVMTDsNCisJT1BFUkFUT1JfSU5QVVRfRkxPVyA9IE5VTEw7DQorDQorCU9QRVJBVE9SX0lOUFVUX0VOViAgICAgICA9IE5VTEw7DQorCU9QRVJBVE9SX0lOUFVUX0JVRkZFUiAgICA9IE5VTEw7DQorCU9QRVJBVE9SX0lOUFVUX1JEViAgICAgICA9IE5VTEw7DQorCU9QRVJBVE9SX0lOUFVUX0JST0FEQ0FTVCA9IE5VTEw7DQorCU9QRVJBVE9SX0lOUFVUX0RFTEVHQVRFICA9IE5VTEw7DQorDQorDQorCU9QRVJBVE9SX09VVFBVVCAgICA9IE5VTEw7DQorCU9QRVJBVE9SX09VVFBVVF9UTyA9IE5VTEw7DQorDQorCU9QRVJBVE9SX09VVFBVVF9WQVIgID0gTlVMTDsNCisJT1BFUkFUT1JfT1VUUFVUX0ZMT1cgPSBOVUxMOw0KKw0KKwlPUEVSQVRPUl9PVVRQVVRfRU5WICAgICAgID0gTlVMTDsNCisJT1BFUkFUT1JfT1VUUFVUX0JVRkZFUiAgICA9IE5VTEw7DQorCU9QRVJBVE9SX09VVFBVVF9SRFYgICAgICAgPSBOVUxMOw0KKwlPUEVSQVRPUl9PVVRQVVRfQlJPQURDQVNUID0gTlVMTDsNCisJT1BFUkFUT1JfT1VUUFVUX0RFTEVHQVRFICA9IE5VTEw7DQorDQorDQorCU9QRVJBVE9SX1BSRVNFTlQgPSBOVUxMOw0KKwlPUEVSQVRPUl9BQlNFTlQgID0gTlVMTDsNCisNCisNCisJT1BFUkFUT1JfSUYgID0gTlVMTDsNCisJT1BFUkFUT1JfSUZFID0gTlVMTDsNCisNCisJT1BFUkFUT1JfRk9SICAgICA9IE5VTEw7DQorCU9QRVJBVE9SX0ZPUkVBQ0ggPSBOVUxMOw0KKw0KKwlPUEVSQVRPUl9XSElMRV9ETyA9IE5VTEw7DQorCU9QRVJBVE9SX0RPX1dISUxFID0gTlVMTDsNCisNCisJT1BFUkFUT1JfQlJFQUsgICAgPSBOVUxMOw0KKwlPUEVSQVRPUl9DT05USU5VRSA9IE5VTEw7DQorCU9QRVJBVE9SX1JFVFVSTiAgID0gTlVMTDsNCisNCisJT1BFUkFUT1JfRVhJVCA9IE5VTEw7DQorDQorCU9QRVJBVE9SX1NURVBfTUFSSyA9IE5VTEw7DQorDQorDQorCS8qDQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICogQVZNIFBSRURJQ0FUIEVYUFJFU1NJT04NCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKi8NCisJT1BFUkFUT1JfRVhJU1QgPSBOVUxMOw0KKwlPUEVSQVRPUl9GT1JBTEwgPSBOVUxMOw0KKw0KKwlPUEVSQVRPUl9OT1QgPSBOVUxMOw0KKw0KKwlPUEVSQVRPUl9BTkQgID0gTlVMTDsNCisJT1BFUkFUT1JfQU5EX1RIRU4gPSBOVUxMOw0KKwlPUEVSQVRPUl9OQU5EID0gTlVMTDsNCisJT1BFUkFUT1JfWEFORCA9IE5VTEw7DQorDQorCU9QRVJBVE9SX09SICAgPSBOVUxMOw0KKwlPUEVSQVRPUl9PUl9FTFNFID0gTlVMTDsNCisJT1BFUkFUT1JfTk9SICA9IE5VTEw7DQorCU9QRVJBVE9SX1hPUiAgPSBOVUxMOw0KKwlPUEVSQVRPUl9YTk9SID0gTlVMTDsNCisNCisNCisJLyoNCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKiBBVk0gQ09NUEFSSVNPTiBFWFBSRVNTSU9ODQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICovDQorCU9QRVJBVE9SX1NFUSAgPSBOVUxMOw0KKwlPUEVSQVRPUl9OU0VRID0gTlVMTDsNCisNCisNCisJLyoNCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKiBBVk0gQ09NUEFSSVNPTiBFWFBSRVNTSU9ODQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICovDQorCU9QRVJBVE9SX0VRICA9IE5VTEw7DQorCU9QRVJBVE9SX05FUSA9IE5VTEw7DQorDQorCU9QRVJBVE9SX0xUICA9IE5VTEw7DQorCU9QRVJBVE9SX0xURSA9IE5VTEw7DQorDQorCU9QRVJBVE9SX0dUICA9IE5VTEw7DQorCU9QRVJBVE9SX0dURSA9IE5VTEw7DQorDQorCS8qDQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICogQVZNIEJJVFdJU0UgRVhQUkVTU0lPTg0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqLw0KKwlPUEVSQVRPUl9CTk9UID0gTlVMTDsNCisJT1BFUkFUT1JfQkFORCA9IE5VTEw7DQorDQorCU9QRVJBVE9SX0JPUiAgPSBOVUxMOw0KKwlPUEVSQVRPUl9CWE9SID0gTlVMTDsNCisNCisJT1BFUkFUT1JfTFNISUZUID0gTlVMTDsNCisJT1BFUkFUT1JfUlNISUZUID0gTlVMTDsNCisNCisNCisJLyoNCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKiBBVk0gQVJJVEhNRVRJQyBFWFBSRVNTSU9ODQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICovDQorCU9QRVJBVE9SX1BMVVMgPSBOVUxMOw0KKw0KKwlPUEVSQVRPUl9NSU5VUyA9IE5VTEw7DQorCU9QRVJBVE9SX1VNSU5VUyA9IE5VTEw7DQorDQorCU9QRVJBVE9SX01VTFQgPSBOVUxMOw0KKw0KKwlPUEVSQVRPUl9QT1cgPSBOVUxMOw0KKw0KKwlPUEVSQVRPUl9ESVYgPSBOVUxMOw0KKw0KKwlPUEVSQVRPUl9NT0QgPSBOVUxMOw0KKw0KKwlPUEVSQVRPUl9NSU4gPSBOVUxMOw0KKwlPUEVSQVRPUl9NQVggPSBOVUxMOw0KKw0KKw0KKwkvKg0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqIEFWTSBNQVRIRU1BVElDQUwgRlVOQ1RJT04NCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKi8NCisNCisJLy8vLyBSQU5ET00NCisJT1BFUkFUT1JfUkFORE9NID0gTlVMTDsNCisNCisJLy8vLyBST1VORElORw0KKwlPUEVSQVRPUl9BQlMgICA9IE5VTEw7DQorCU9QRVJBVE9SX0NFSUwgID0gTlVMTDsNCisJT1BFUkFUT1JfRkxPT1IgPSBOVUxMOw0KKwlPUEVSQVRPUl9ST1VORCA9IE5VTEw7DQorDQorCU9QRVJBVE9SX1RSVU5DQVRFID0gTlVMTDsNCisNCisNCisJLy8vLyBFWFAgLSBMT0cNCisJT1BFUkFUT1JfU1FSVCA9IE5VTEw7DQorDQorCU9QRVJBVE9SX0VYUCA9IE5VTEw7DQorCU9QRVJBVE9SX0xOICA9IE5VTEw7DQorCU9QRVJBVE9SX0xPRyA9IE5VTEw7DQorDQorDQorCS8vLy8gVFJJR09OT01FVFJJQw0KKwlPUEVSQVRPUl9TSU4gPSBOVUxMOw0KKwlPUEVSQVRPUl9DT1MgPSBOVUxMOw0KKwlPUEVSQVRPUl9UQU4gPSBOVUxMOw0KKw0KKwlPUEVSQVRPUl9TSU5IID0gTlVMTDsNCisJT1BFUkFUT1JfQ09TSCA9IE5VTEw7DQorCU9QRVJBVE9SX1RBTkggPSBOVUxMOw0KKw0KKwlPUEVSQVRPUl9BU0lOID0gTlVMTDsNCisJT1BFUkFUT1JfQUNPUyA9IE5VTEw7DQorCU9QRVJBVE9SX0FUQU4gPSBOVUxMOw0KKwlPUEVSQVRPUl9BVEFOMiA9IE5VTEw7DQorDQorCU9QRVJBVE9SX0FTSU5IID0gTlVMTDsNCisJT1BFUkFUT1JfQUNPU0ggPSBOVUxMOw0KKwlPUEVSQVRPUl9BVEFOSCA9IE5VTEw7DQorDQorCS8qDQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICogQVZNIFNUUklORyAvLyBDT0xMRUNUSU9OIE9QRVJBVE9SDQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICovDQorCU9QRVJBVE9SX0NPTlRBSU5TID0gTlVMTDsNCisNCisJT1BFUkFUT1JfSU4gICAgPSBOVUxMOw0KKwlPUEVSQVRPUl9OT1RJTiA9IE5VTEw7DQorDQorCU9QRVJBVE9SX1NVQlNFVCAgID0gTlVMTDsNCisJT1BFUkFUT1JfU1VCU0VURVEgPSBOVUxMOw0KKw0KKwlPUEVSQVRPUl9JTlRFUlNFQ1QgPSBOVUxMOw0KKw0KKwlPUEVSQVRPUl9TVEFSVFNfV0lUSCA9IE5VTEw7DQorCU9QRVJBVE9SX0VORFNfV0lUSCAgID0gTlVMTDsNCisNCisJT1BFUkFUT1JfQ09OQ0FUID0gTlVMTDsNCisJT1BFUkFUT1JfQVBQRU5EID0gTlVMTDsNCisNCisJT1BFUkFUT1JfUkVNT1ZFID0gTlVMTDsNCisJT1BFUkFUT1JfQ0xFQVIgID0gTlVMTDsNCisJT1BFUkFUT1JfUkVTSVpFID0gTlVMTDsNCisJT1BFUkFUT1JfU0VMRUNUID0gTlVMTDsNCisNCisJT1BFUkFUT1JfUFVTSCA9IE5VTEw7DQorCU9QRVJBVE9SX0FTU0lHTl9UT1AgPSBOVUxMOw0KKwlPUEVSQVRPUl9UT1AgPSBOVUxMOw0KKwlPUEVSQVRPUl9QT1AgPSBOVUxMOw0KKwlPUEVSQVRPUl9QT1BfRlJPTSA9IE5VTEw7DQorDQorCU9QRVJBVE9SX0VNUFRZICAgID0gTlVMTDsNCisJT1BFUkFUT1JfTk9ORU1QVFkgPSBOVUxMOw0KKw0KKwlPUEVSQVRPUl9TSU5HTEVUT04gPSBOVUxMOw0KKwlPUEVSQVRPUl9QT1BVTEFURUQgPSBOVUxMOw0KKw0KKwlPUEVSQVRPUl9GVUxMID0gTlVMTDsNCisNCisJT1BFUkFUT1JfU0laRSA9IE5VTEw7DQorDQorCS8qDQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICogSU9MVEwgQkVIQVZJT1JBTCBQUkVESUNBVA0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqLw0KKwlPUEVSQVRPUl9HTE9CQUxMWSAgICA9IE5VTEw7DQorCU9QRVJBVE9SX1VOVElMICAgICAgPSBOVUxMOw0KKwlPUEVSQVRPUl9ORVhUICAgICAgID0gTlVMTDsNCisJT1BFUkFUT1JfRVZFTlRVQUxMWSA9IE5VTEw7DQorCU9QRVJBVE9SX1JFTEVBU0VTICAgPSBOVUxMOw0KKwlPUEVSQVRPUl9PQlMgICAgICAgID0gTlVMTDsNCisNCisJLyoNCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKiBJT0xUTCBMT0dJQ0FMIFBSRURJQ0FUDQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICovDQorCU9QRVJBVE9SX0FORF9UID0gTlVMTDsNCisJT1BFUkFUT1JfT1JfVCAgPSBOVUxMOw0KKwlPUEVSQVRPUl9OT1RfVCA9IE5VTEw7DQorCU9QRVJBVE9SX0lNUF9UID0gTlVMTDsNCisvLwkqLw0KK30NCisNCisNCisvKioNCisgKiBPcGVyYXRvcg0KKyAqLw0KK09wZXJhdG9yICogT3BlcmF0b3JNYW5hZ2VyOjpuZXdPcGVyYXRvcigNCisJCUFWTV9PUENPREUgYW5Bdm1PcENvZGUsIEFWTV9PUENPREUgYW5PcHRpbWl6ZWRPcENvZGUsDQorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELA0KKwkJQUxHRUJSQV9RVUFMSUZJRVIgYW5BbGdlYnJhUXVhbGlmaWVyLCBGSVhfTk9UQVRJT04gYUZpeFF1YWxpZmllciwNCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVN0YW5kYXJkU3ltYm9sLCBjb25zdCBzdGQ6OnN0cmluZyAmIGFTeW50YXhNSVhGSVgsDQorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFTeW1ib2xRRVBDQUQpDQorew0KKwlPcGVyYXRvciAqIHRoZU5ld09wZXJhdG9yKCBuZXcgT3BlcmF0b3IoYUZ1bGx5UXVhbGlmaWVkTmFtZUlELCBhTmFtZUlELA0KKwkJCWFuQXZtT3BDb2RlLCBhbk9wdGltaXplZE9wQ29kZSwgYW5BbGdlYnJhUXVhbGlmaWVyLCBhRml4UXVhbGlmaWVyLA0KKwkJCWFTdGFuZGFyZFN5bWJvbCwgYVN5bnRheE1JWEZJWCwgYVN5bWJvbFFFUENBRCkgKTsNCisNCisJcmVnaXN0ZXJPcCggdGhlTmV3T3BlcmF0b3IgKTsNCisNCisJcmV0dXJuKCB0aGVOZXdPcGVyYXRvciApOw0KK30NCisNCisNCisNCisvKioNCisgKiBURVNURVINCisgKi8NCisNCitib29sIE9wZXJhdG9yTWFuYWdlcjo6aXNRdW90ZShjb25zdCBPcGVyYXRvciAqIGFuT3BlcmF0b3IpDQorew0KKwlzd2l0Y2goIGFuT3BlcmF0b3ItPmdldEF2bU9wQ29kZSgpICkNCisJew0KKwkJY2FzZSBBVk1fT1BDT0RFX1FVT1RFOg0KKwkJew0KKwkJCXJldHVybiggdHJ1ZSApOw0KKwkJfQ0KKw0KKwkJZGVmYXVsdDoNCisJCXsNCisJCQlyZXR1cm4oIGZhbHNlICk7DQorCQl9DQorCX0NCit9DQorDQorYm9vbCBPcGVyYXRvck1hbmFnZXI6OmlzTWV0YShjb25zdCBPcGVyYXRvciAqIGFuT3BlcmF0b3IpDQorew0KKwlzd2l0Y2goIGFuT3BlcmF0b3ItPmdldEF2bU9wQ29kZSgpICkNCisJew0KKwkJY2FzZSBBVk1fT1BDT0RFX01FVEFfRVZBTDoNCisJCWNhc2UgQVZNX09QQ09ERV9NRVRBX1JVTjoNCisJCXsNCisJCQlyZXR1cm4oIHRydWUgKTsNCisJCX0NCisNCisJCWRlZmF1bHQ6DQorCQl7DQorCQkJcmV0dXJuKCBmYWxzZSApOw0KKwkJfQ0KKwl9DQorfQ0KKw0KK2Jvb2wgT3BlcmF0b3JNYW5hZ2VyOjppc01ldGFFdmFsKGNvbnN0IE9wZXJhdG9yICogYW5PcGVyYXRvcikNCit7DQorCXN3aXRjaCggYW5PcGVyYXRvci0+Z2V0QXZtT3BDb2RlKCkgKQ0KKwl7DQorCQljYXNlIEFWTV9PUENPREVfTUVUQV9FVkFMOg0KKwkJew0KKwkJCXJldHVybiggdHJ1ZSApOw0KKwkJfQ0KKw0KKwkJZGVmYXVsdDoNCisJCXsNCisJCQlyZXR1cm4oIGZhbHNlICk7DQorCQl9DQorCX0NCit9DQorDQorYm9vbCBPcGVyYXRvck1hbmFnZXI6OmlzTWV0YVJ1bihjb25zdCBPcGVyYXRvciAqIGFuT3BlcmF0b3IpDQorew0KKwlzd2l0Y2goIGFuT3BlcmF0b3ItPmdldEF2bU9wQ29kZSgpICkNCisJew0KKwkJY2FzZSBBVk1fT1BDT0RFX01FVEFfUlVOOg0KKwkJew0KKwkJCXJldHVybiggdHJ1ZSApOw0KKwkJfQ0KKw0KKwkJZGVmYXVsdDoNCisJCXsNCisJCQlyZXR1cm4oIGZhbHNlICk7DQorCQl9DQorCX0NCit9DQorDQorYm9vbCBPcGVyYXRvck1hbmFnZXI6OmlzQXNzaWduQmluYXJ5KGNvbnN0IE9wZXJhdG9yICogYW5PcGVyYXRvcikNCit7DQorCXN3aXRjaCggYW5PcGVyYXRvci0+Z2V0QXZtT3BDb2RlKCkgKQ0KKwl7DQorCQljYXNlIEFWTV9PUENPREVfQVNTSUdOOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0FTU0lHTl9BRlRFUjoNCisJCWNhc2UgQVZNX09QQ09ERV9BU1NJR05fT1BfQUZURVI6DQorCQljYXNlIEFWTV9PUENPREVfQVNTSUdOX1JFRjoNCisJCWNhc2UgQVZNX09QQ09ERV9BU1NJR05fTUFDUk86DQorCQl7DQorCQkJcmV0dXJuKCB0cnVlICk7DQorCQl9DQorDQorCQlkZWZhdWx0Og0KKwkJew0KKwkJCXJldHVybiggZmFsc2UgKTsNCisJCX0NCisJfQ0KK30NCisNCitib29sIE9wZXJhdG9yTWFuYWdlcjo6aXNBc3NpZ25VbmFyeShjb25zdCBPcGVyYXRvciAqIGFuT3BlcmF0b3IpDQorew0KKwlzd2l0Y2goIGFuT3BlcmF0b3ItPmdldEF2bU9wQ29kZSgpICkNCisJew0KKwkJY2FzZSBBVk1fT1BDT0RFX0FTU0lHTl9ORVdGUkVTSDoNCisJCWNhc2UgQVZNX09QQ09ERV9BU1NJR05fUkVTRVQ6DQorCQl7DQorCQkJcmV0dXJuKCB0cnVlICk7DQorCQl9DQorDQorCQlkZWZhdWx0Og0KKwkJew0KKwkJCXJldHVybiggZmFsc2UgKTsNCisJCX0NCisJfQ0KK30NCisNCisNCitib29sIE9wZXJhdG9yTWFuYWdlcjo6aXNVZmkoY29uc3QgT3BlcmF0b3IgKiBhbk9wZXJhdG9yKQ0KK3sNCisJc3dpdGNoKCBhbk9wZXJhdG9yLT5nZXRBdm1PcENvZGUoKSApDQorCXsNCisJCWNhc2UgQVZNX09QQ09ERV9VRkk6DQorCQl7DQorCQkJcmV0dXJuKCB0cnVlICk7DQorCQl9DQorDQorCQlkZWZhdWx0Og0KKwkJew0KKwkJCXJldHVybiggZmFsc2UgKTsNCisJCX0NCisJfQ0KK30NCisNCitib29sIE9wZXJhdG9yTWFuYWdlcjo6aXNDdG9yKGNvbnN0IE9wZXJhdG9yICogYW5PcGVyYXRvcikNCit7DQorCXN3aXRjaCggYW5PcGVyYXRvci0+Z2V0QXZtT3BDb2RlKCkgKQ0KKwl7DQorCQljYXNlIEFWTV9PUENPREVfQ1RPUjoNCisJCXsNCisJCQlyZXR1cm4oIHRydWUgKTsNCisJCX0NCisNCisJCWRlZmF1bHQ6DQorCQl7DQorCQkJcmV0dXJuKCBmYWxzZSApOw0KKwkJfQ0KKwl9DQorfQ0KKw0KKw0KK2Jvb2wgT3BlcmF0b3JNYW5hZ2VyOjppc1VmaU9yQ3Rvcihjb25zdCBPcGVyYXRvciAqIGFuT3BlcmF0b3IpDQorew0KKwlzd2l0Y2goIGFuT3BlcmF0b3ItPmdldEF2bU9wQ29kZSgpICkNCisJew0KKwkJY2FzZSBBVk1fT1BDT0RFX1VGSToNCisJCWNhc2UgQVZNX09QQ09ERV9DVE9SOg0KKwkJew0KKwkJCXJldHVybiggdHJ1ZSApOw0KKwkJfQ0KKw0KKwkJZGVmYXVsdDoNCisJCXsNCisJCQlyZXR1cm4oIGZhbHNlICk7DQorCQl9DQorCX0NCit9DQorDQorYm9vbCBPcGVyYXRvck1hbmFnZXI6OmlzTmV3ZnJlc2goY29uc3QgT3BlcmF0b3IgKiBhbk9wZXJhdG9yKQ0KK3sNCisJc3dpdGNoKCBhbk9wZXJhdG9yLT5nZXRBdm1PcENvZGUoKSApDQorCXsNCisJCWNhc2UgQVZNX09QQ09ERV9BU1NJR05fTkVXRlJFU0g6DQorCQl7DQorCQkJcmV0dXJuKCB0cnVlICk7DQorCQl9DQorDQorCQlkZWZhdWx0Og0KKwkJew0KKwkJCXJldHVybiggZmFsc2UgKTsNCisJCX0NCisJfQ0KK30NCisNCisNCisNCitib29sIE9wZXJhdG9yTWFuYWdlcjo6aXNTZXF1ZW5jZShjb25zdCBPcGVyYXRvciAqIGFuT3BlcmF0b3IpDQorew0KKwlzd2l0Y2goIGFuT3BlcmF0b3ItPmdldEF2bU9wQ29kZSgpICkNCisJew0KKwkJY2FzZSBBVk1fT1BDT0RFX0FUT01JQ19TRVFVRU5DRToNCisNCisJCWNhc2UgQVZNX09QQ09ERV9TRVFVRU5DRToNCisJCWNhc2UgQVZNX09QQ09ERV9TRVFVRU5DRV9TSURFOg0KKwkJY2FzZSBBVk1fT1BDT0RFX1NFUVVFTkNFX1dFQUs6DQorCQl7DQorCQkJcmV0dXJuKCB0cnVlICk7DQorCQl9DQorDQorCQlkZWZhdWx0Og0KKwkJew0KKwkJCXJldHVybiggZmFsc2UgKTsNCisJCX0NCisJfQ0KK30NCisNCisNCitib29sIE9wZXJhdG9yTWFuYWdlcjo6aXNTY2hlZHVsZShjb25zdCBPcGVyYXRvciAqIGFuT3BlcmF0b3IpDQorew0KKwlzd2l0Y2goIGFuT3BlcmF0b3ItPmdldEF2bU9wQ29kZSgpICkNCisJew0KKwkJLyoNCisJCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJCSAqIEFWTSBQUk9HUkFNIFNDSEVEVUxJTkcNCisJCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJCSAqLw0KKwkJY2FzZSBBVk1fT1BDT0RFX0FUT01JQ19TRVFVRU5DRToNCisNCisJCWNhc2UgQVZNX09QQ09ERV9TRVFVRU5DRToNCisJCWNhc2UgQVZNX09QQ09ERV9TRVFVRU5DRV9TSURFOg0KKwkJY2FzZSBBVk1fT1BDT0RFX1NFUVVFTkNFX1dFQUs6DQorDQorCQljYXNlIEFWTV9PUENPREVfSU5QVVRfRU5BQkxFRDoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9BU1lOQ0hST05PVVM6DQorCQljYXNlIEFWTV9PUENPREVfU1RST05HX1NZTkNIUk9OT1VTOg0KKwkJY2FzZSBBVk1fT1BDT0RFX1dFQUtfU1lOQ0hST05PVVM6DQorCQljYXNlIEFWTV9PUENPREVfSU5URVJMRUFWSU5HOg0KKwkJY2FzZSBBVk1fT1BDT0RFX1BBUkFMTEVMOg0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX0VYQ0xVU0lWRToNCisJCWNhc2UgQVZNX09QQ09ERV9OT05ERVRFUk1JTklTTToNCisNCisJCWNhc2UgQVZNX09QQ09ERV9QUklPUl9HVDoNCisJCWNhc2UgQVZNX09QQ09ERV9QUklPUl9MVDoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9TQ0hFRFVMRV9BTkRfVEhFTjoNCisJCWNhc2UgQVZNX09QQ09ERV9TQ0hFRFVMRV9PUl9FTFNFOg0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX0ZPUks6DQorDQorCQljYXNlIEFWTV9PUENPREVfUFJPRFVDVDoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9DT05URVhUX1NXSVRDSEVSOg0KKwkJew0KKwkJCXJldHVybiggdHJ1ZSApOw0KKwkJfQ0KKw0KKwkJZGVmYXVsdDoNCisJCXsNCisJCQlyZXR1cm4oIGZhbHNlICk7DQorCQl9DQorCX0NCit9DQorDQorYm9vbCBPcGVyYXRvck1hbmFnZXI6OmlzTWFjaGluZShjb25zdCBPcGVyYXRvciAqIGFuT3BlcmF0b3IpDQorew0KKwlzd2l0Y2goIGFuT3BlcmF0b3ItPmdldEF2bU9wQ29kZSgpICkNCisJew0KKwkJLyoNCisJCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJCSAqIEFWTSBNQUNISU5FIEFDVElWSVRZDQorCQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCQkgKi8NCisJCWNhc2UgQVZNX09QQ09ERV9TQ0hFRFVMRV9HRVQ6DQorDQorCQljYXNlIEFWTV9PUENPREVfSU5WT0tFX05FVzoNCisJCXsNCisJCQlyZXR1cm4oIHRydWUgKTsNCisJCX0NCisNCisJCWRlZmF1bHQ6DQorCQl7DQorCQkJcmV0dXJuKCBmYWxzZSApOw0KKwkJfQ0KKwl9DQorfQ0KKw0KKw0KK2Jvb2wgT3BlcmF0b3JNYW5hZ2VyOjppc0FjdGl2aXR5KGNvbnN0IE9wZXJhdG9yICogYW5PcGVyYXRvcikNCit7DQorCXN3aXRjaCggYW5PcGVyYXRvci0+Z2V0QXZtT3BDb2RlKCkgKQ0KKwl7DQorCQkvKg0KKwkJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkJICogQVZNIFBST0dSQU0gQUNUSVZJVFkNCisJCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJCSAqLw0KKwkJY2FzZSBBVk1fT1BDT0RFX0lOSVQ6DQorCQljYXNlIEFWTV9PUENPREVfRklOQUw6DQorCQljYXNlIEFWTV9PUENPREVfREVTVFJPWToNCisNCisJCWNhc2UgQVZNX09QQ09ERV9TVEFSVDoNCisJCWNhc2UgQVZNX09QQ09ERV9SRVNUQVJUOg0KKwkJY2FzZSBBVk1fT1BDT0RFX1NUT1A6DQorDQorCQljYXNlIEFWTV9PUENPREVfV0FJVDoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9TVVNQRU5EOg0KKwkJY2FzZSBBVk1fT1BDT0RFX1JFU1VNRToNCisNCisJCWNhc2UgQVZNX09QQ09ERV9JRU5BQkxFX0lOVk9LRToNCisJCWNhc2UgQVZNX09QQ09ERV9FTkFCTEVfSU5WT0tFOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0VOQUJMRV9TRVQ6DQorDQorCQljYXNlIEFWTV9PUENPREVfSURJU0FCTEVfSU5WT0tFOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0RJU0FCTEVfSU5WT0tFOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0RJU0FCTEVfU0VUOg0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX0RJU0FCTEVfQ0hJTEQ6DQorCQljYXNlIEFWTV9PUENPREVfRElTQUJMRV9TRUxGOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0RJU0FCTEVfU0VMVkVTOg0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX0lBQk9SVF9JTlZPS0U6DQorCQljYXNlIEFWTV9PUENPREVfQUJPUlRfSU5WT0tFOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0FCT1JUX1NFVDoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9BQk9SVF9DSElMRDoNCisJCWNhc2UgQVZNX09QQ09ERV9BQk9SVF9TRUxGOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0FCT1JUX1NFTFZFUzoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9JUlVOOg0KKwkJY2FzZSBBVk1fT1BDT0RFX1JVTjoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9SVEM6DQorDQorCQljYXNlIEFWTV9PUENPREVfU0NIRURVTEVfSU5WT0tFOg0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX0RFRkVSX0lOVk9LRToNCisJCXsNCisJCQlyZXR1cm4oIHRydWUgKTsNCisJCX0NCisNCisJCWRlZmF1bHQ6DQorCQl7DQorCQkJcmV0dXJuKCBmYWxzZSApOw0KKwkJfQ0KKwl9DQorfQ0KKw0KKw0KK2Jvb2wgT3BlcmF0b3JNYW5hZ2VyOjppc0NvbW11bmljYXRpb24oY29uc3QgT3BlcmF0b3IgKiBhbk9wZXJhdG9yKQ0KK3sNCisJc3dpdGNoKCBhbk9wZXJhdG9yLT5nZXRBdm1PcENvZGUoKSApDQorCXsNCisJCS8qDQorCQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCQkgKiBBVk0gUFJPR1JBTSBDT01NVU5JQ0FUSU9ODQorCQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCQkgKi8NCisJCWNhc2UgQVZNX09QQ09ERV9JTlBVVDoNCisJCWNhc2UgQVZNX09QQ09ERV9JTlBVVF9GUk9NOg0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUX1NBVkU6DQorDQorCQljYXNlIEFWTV9PUENPREVfT1VUUFVUOg0KKwkJY2FzZSBBVk1fT1BDT0RFX09VVFBVVF9UTzoNCisJCXsNCisJCQlyZXR1cm4oIHRydWUgKTsNCisJCX0NCisNCisJCWRlZmF1bHQ6DQorCQl7DQorCQkJcmV0dXJuKCBmYWxzZSApOw0KKwkJfQ0KKwl9DQorfQ0KKw0KKw0KK2Jvb2wgT3BlcmF0b3JNYW5hZ2VyOjppc0FyaXRobWV0aWMoY29uc3QgT3BlcmF0b3IgKiBhbk9wZXJhdG9yKQ0KK3sNCisJc3dpdGNoKCBhbk9wZXJhdG9yLT5nZXRBdm1PcENvZGUoKSApDQorCXsNCisJCS8qDQorCQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJCSAqIEFWTSBBUklUSE1FVElDIEVYUFJFU1NJT04NCisJCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkJICovDQorDQorCQljYXNlIEFWTV9PUENPREVfUExVUzoNCisJCWNhc2UgQVZNX09QQ09ERV9NSU5VUzoNCisJCWNhc2UgQVZNX09QQ09ERV9VTUlOVVM6DQorDQorCQljYXNlIEFWTV9PUENPREVfTVVMVDoNCisJCWNhc2UgQVZNX09QQ09ERV9QT1c6DQorDQorCQljYXNlIEFWTV9PUENPREVfRElWOg0KKwkJY2FzZSBBVk1fT1BDT0RFX01PRDoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9CTk9UOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0JBTkQ6DQorCQljYXNlIEFWTV9PUENPREVfQk9SOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0JYT1I6DQorCQljYXNlIEFWTV9PUENPREVfTFNISUZUOg0KKwkJY2FzZSBBVk1fT1BDT0RFX1JTSElGVDoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9SQU5ET006DQorDQorCQljYXNlIEFWTV9PUENPREVfQUJTOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0NFSUw6DQorCQljYXNlIEFWTV9PUENPREVfRkxPT1I6DQorCQljYXNlIEFWTV9PUENPREVfUk9VTkQ6DQorCQljYXNlIEFWTV9PUENPREVfVFJVTkNBVEU6DQorDQorCQljYXNlIEFWTV9PUENPREVfU1FSVDoNCisJCWNhc2UgQVZNX09QQ09ERV9FWFA6DQorCQljYXNlIEFWTV9PUENPREVfTE46DQorCQljYXNlIEFWTV9PUENPREVfTE9HOg0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX1NJTjoNCisJCWNhc2UgQVZNX09QQ09ERV9DT1M6DQorCQljYXNlIEFWTV9PUENPREVfVEFOOg0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX1NJTkg6DQorCQljYXNlIEFWTV9PUENPREVfQ09TSDoNCisJCWNhc2UgQVZNX09QQ09ERV9UQU5IOg0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX0FTSU46DQorCQljYXNlIEFWTV9PUENPREVfQUNPUzoNCisJCWNhc2UgQVZNX09QQ09ERV9BVEFOOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0FUQU4yOg0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX0FTSU5IOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0FDT1NIOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0FUQU5IOg0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX01BWDoNCisJCWNhc2UgQVZNX09QQ09ERV9NSU46DQorCQl7DQorCQkJcmV0dXJuKCB0cnVlICk7DQorCQl9DQorDQorCQlkZWZhdWx0Og0KKwkJew0KKwkJCXJldHVybiggZmFsc2UgKTsNCisJCX0NCisJfQ0KK30NCisNCisNCitib29sIE9wZXJhdG9yTWFuYWdlcjo6aXNCb29sZWFuKGNvbnN0IE9wZXJhdG9yICogYW5PcGVyYXRvcikNCit7DQorCXJldHVybiggaXNSZWxhdGlvbmFsKGFuT3BlcmF0b3IpIHx8IGlzUHJvcG9zaXRpb25hbChhbk9wZXJhdG9yKSApOw0KK30NCisNCisNCitib29sIE9wZXJhdG9yTWFuYWdlcjo6aXNSZWxhdGlvbmFsKGNvbnN0IE9wZXJhdG9yICogYW5PcGVyYXRvcikNCit7DQorCXN3aXRjaCggYW5PcGVyYXRvci0+Z2V0QXZtT3BDb2RlKCkgKQ0KKwl7DQorCQkvKg0KKwkJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCQkgKiBBVk0gUkVMQVRJT05BTCBFWFBSRVNTSU9ODQorCQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJCSAqLw0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX0VROg0KKwkJY2FzZSBBVk1fT1BDT0RFX05FUToNCisNCisJCWNhc2UgQVZNX09QQ09ERV9TRVE6DQorCQljYXNlIEFWTV9PUENPREVfTlNFUToNCisNCisJCWNhc2UgQVZNX09QQ09ERV9MVDoNCisJCWNhc2UgQVZNX09QQ09ERV9MVEU6DQorCQljYXNlIEFWTV9PUENPREVfR1Q6DQorCQljYXNlIEFWTV9PUENPREVfR1RFOg0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX0VNUFRZOg0KKwkJY2FzZSBBVk1fT1BDT0RFX05PTkVNUFRZOg0KKwkJY2FzZSBBVk1fT1BDT0RFX1NJTkdMRVRPTjoNCisJCWNhc2UgQVZNX09QQ09ERV9QT1BVTEFURUQ6DQorCQljYXNlIEFWTV9PUENPREVfRlVMTDoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9JTjoNCisJCWNhc2UgQVZNX09QQ09ERV9OT1RJTjoNCisJCWNhc2UgQVZNX09QQ09ERV9DT05UQUlOUzoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9TVUJTRVQ6DQorCQljYXNlIEFWTV9PUENPREVfU1VCU0VURVE6DQorDQorCQljYXNlIEFWTV9PUENPREVfSU5URVJTRUNUOg0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX1NUQVJUU19XSVRIOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0VORFNfV0lUSDoNCisNCisNCisJCWNhc2UgQVZNX09QQ09ERV9QUkVTRU5UOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0FCU0VOVDoNCisNCisNCisJCWNhc2UgQVZNX09QQ09ERV9TQ0hFRFVMRV9JTjoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9TVEFUVVNfQkVJTkc6DQorCQljYXNlIEFWTV9PUENPREVfU1RBVFVTX0lTOg0KKwkJY2FzZSBBVk1fT1BDT0RFX1NUQVRVU19XQVM6DQorCQljYXNlIEFWTV9PUENPREVfU1RBVFVTX1dJTEw6DQorCQl7DQorCQkJcmV0dXJuKCB0cnVlICk7DQorCQl9DQorDQorCQlkZWZhdWx0Og0KKwkJew0KKwkJCXJldHVybiggZmFsc2UgKTsNCisJCX0NCisJfQ0KK30NCisNCisNCitib29sIE9wZXJhdG9yTWFuYWdlcjo6aXNQcm9wb3NpdGlvbmFsKGNvbnN0IE9wZXJhdG9yICogYW5PcGVyYXRvcikNCit7DQorCXN3aXRjaCggYW5PcGVyYXRvci0+Z2V0QXZtT3BDb2RlKCkgKQ0KKwl7DQorCQkvKg0KKwkJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCQkgKiBBVk0gUFJPUE9TSVRJT05BTCBFWFBSRVNTSU9ODQorCQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJCSAqLw0KKwkJY2FzZSBBVk1fT1BDT0RFX0VYSVNUOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0ZPUkFMTDoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9OT1Q6DQorDQorCQljYXNlIEFWTV9PUENPREVfQU5EOg0KKwkJY2FzZSBBVk1fT1BDT0RFX05BTkQ6DQorDQorCQljYXNlIEFWTV9PUENPREVfWEFORDoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9PUjoNCisJCWNhc2UgQVZNX09QQ09ERV9OT1I6DQorDQorCQljYXNlIEFWTV9PUENPREVfWE9SOg0KKwkJY2FzZSBBVk1fT1BDT0RFX1hOT1I6DQorCQl7DQorCQkJcmV0dXJuKCB0cnVlICk7DQorCQl9DQorDQorCQlkZWZhdWx0Og0KKwkJew0KKwkJCXJldHVybiggZmFsc2UgKTsNCisJCX0NCisJfQ0KK30NCisNCisNCisNCisNCitib29sIE9wZXJhdG9yTWFuYWdlcjo6aXNUZW1wb3JhbExvZ2ljKGNvbnN0IE9wZXJhdG9yICogYW5PcGVyYXRvcikNCit7DQorCXN3aXRjaCggYW5PcGVyYXRvci0+Z2V0QXZtT3BDb2RlKCkgKQ0KKwl7DQorCQkvKg0KKwkJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCQkgKiBJT0xUTCBTVEFURU1FTlQNCisJCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkJICovDQorCQljYXNlIEFWTV9PUENPREVfR0xPQkFMTFk6DQorCQljYXNlIEFWTV9PUENPREVfVU5USUw6DQorCQljYXNlIEFWTV9PUENPREVfTkVYVDoNCisJCWNhc2UgQVZNX09QQ09ERV9FVkVOVFVBTExZOg0KKwkJY2FzZSBBVk1fT1BDT0RFX1JFTEVBU0VTOg0KKwkJY2FzZSBBVk1fT1BDT0RFX09CUzoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9BTkRfVDoNCisJCWNhc2UgQVZNX09QQ09ERV9PUl9UOg0KKwkJY2FzZSBBVk1fT1BDT0RFX05PVF9UOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0lNUF9UOg0KKwkJew0KKwkJCXJldHVybiggdHJ1ZSApOw0KKwkJfQ0KKw0KKwkJZGVmYXVsdDoNCisJCXsNCisJCQlyZXR1cm4oIGZhbHNlICk7DQorCQl9DQorCX0NCit9DQorDQorDQorDQorYm9vbCBPcGVyYXRvck1hbmFnZXI6OmlzQ29uZGl0aW9ubmFsKGNvbnN0IE9wZXJhdG9yICogYW5PcGVyYXRvcikNCit7DQorCXN3aXRjaCggYW5PcGVyYXRvci0+Z2V0QXZtT3BDb2RlKCkgKQ0KKwl7DQorCQljYXNlIEFWTV9PUENPREVfSUY6DQorCQljYXNlIEFWTV9PUENPREVfSUZFOg0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX0FORF9USEVOOg0KKwkJY2FzZSBBVk1fT1BDT0RFX09SX0VMU0U6DQorDQorCQljYXNlIEFWTV9PUENPREVfRk9SOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0ZPUkVBQ0g6DQorCQljYXNlIEFWTV9PUENPREVfV0hJTEVfRE86DQorCQljYXNlIEFWTV9PUENPREVfRE9fV0hJTEU6DQorCQl7DQorCQkJcmV0dXJuKCB0cnVlICk7DQorCQl9DQorDQorCQlkZWZhdWx0Og0KKwkJew0KKwkJCXJldHVybiggZmFsc2UgKTsNCisJCX0NCisJfQ0KK30NCisNCisNCisNCitib29sIE9wZXJhdG9yTWFuYWdlcjo6aXNTdGF0ZW1lbnQoY29uc3QgT3BlcmF0b3IgKiBhbk9wZXJhdG9yKQ0KK3sNCisJc3dpdGNoKCBhbk9wZXJhdG9yLT5nZXRBdm1PcENvZGUoKSApDQorCXsNCisJCS8qDQorCQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJCSAqIEFWTSBOT1AgU1RBVEVNRU5UDQorCQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJCSAqLw0KKwkJY2FzZSBBVk1fT1BDT0RFX05PUDoNCisNCisNCisJCS8qDQorCQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJCSAqIEFWTSBNQUNISU5FIEFDVElWSVRZDQorCQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJCSAqLw0KKwkJY2FzZSBBVk1fT1BDT0RFX0lOSVQ6DQorCQljYXNlIEFWTV9PUENPREVfRklOQUw6DQorCQljYXNlIEFWTV9PUENPREVfREVTVFJPWToNCisNCisJCWNhc2UgQVZNX09QQ09ERV9TVEFSVDoNCisJCWNhc2UgQVZNX09QQ09ERV9SRVNUQVJUOg0KKwkJY2FzZSBBVk1fT1BDT0RFX1NUT1A6DQorDQorCQljYXNlIEFWTV9PUENPREVfV0FJVDoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9TVVNQRU5EOg0KKwkJY2FzZSBBVk1fT1BDT0RFX1JFU1VNRToNCisNCisJCWNhc2UgQVZNX09QQ09ERV9JRU5BQkxFX0lOVk9LRToNCisJCWNhc2UgQVZNX09QQ09ERV9FTkFCTEVfSU5WT0tFOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0VOQUJMRV9TRVQ6DQorDQorCQljYXNlIEFWTV9PUENPREVfSURJU0FCTEVfSU5WT0tFOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0RJU0FCTEVfSU5WT0tFOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0RJU0FCTEVfU0VUOg0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX0RJU0FCTEVfQ0hJTEQ6DQorCQljYXNlIEFWTV9PUENPREVfRElTQUJMRV9TRUxGOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0RJU0FCTEVfU0VMVkVTOg0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX0lBQk9SVF9JTlZPS0U6DQorCQljYXNlIEFWTV9PUENPREVfQUJPUlRfSU5WT0tFOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0FCT1JUX1NFVDoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9BQk9SVF9DSElMRDoNCisJCWNhc2UgQVZNX09QQ09ERV9BQk9SVF9TRUxGOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0FCT1JUX1NFTFZFUzoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9ISVNUT1JZX0NMRUFSOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0RFRVBfSElTVE9SWV9JTlZPS0U6DQorCQljYXNlIEFWTV9PUENPREVfU0hBTExPV19ISVNUT1JZX0lOVk9LRToNCisNCisJCWNhc2UgQVZNX09QQ09ERV9JUlVOOg0KKwkJY2FzZSBBVk1fT1BDT0RFX1JVTjoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9SVEM6DQorDQorCQljYXNlIEFWTV9PUENPREVfU0NIRURVTEVfSU5WT0tFOg0KKwkJY2FzZSBBVk1fT1BDT0RFX1NDSEVEVUxFX0dFVDoNCisJCWNhc2UgQVZNX09QQ09ERV9TQ0hFRFVMRV9TRVQ6DQorDQorCQljYXNlIEFWTV9PUENPREVfREVGRVJfSU5WT0tFOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0RFRkVSX0dFVDoNCisJCWNhc2UgQVZNX09QQ09ERV9ERUZFUl9TRVQ6DQorDQorCQljYXNlIEFWTV9PUENPREVfRk9SSzoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9KT0lOOg0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX1JEVjoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9JTlBVVF9FTkFCTEVEOg0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX1NZTkNIUk9OSVpFOg0KKw0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX0lOVk9LRV9ORVc6DQorDQorDQorCQkvKg0KKwkJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCQkgKiBBVk0gTUFDSElORSBTVEFUVVMNCisJCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkJICovDQorCQljYXNlIEFWTV9PUENPREVfU1RBVFVTX0JFSU5HOg0KKwkJY2FzZSBBVk1fT1BDT0RFX1NUQVRVU19JUzoNCisJCWNhc2UgQVZNX09QQ09ERV9TVEFUVVNfV0FTOg0KKwkJY2FzZSBBVk1fT1BDT0RFX1NUQVRVU19XSUxMOg0KKw0KKw0KKwkJLyoNCisJCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkJICogQVZNIFBST0dSQU0gU0NIRURVTElORw0KKwkJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCQkgKi8NCisJCWNhc2UgQVZNX09QQ09ERV9BU1lOQ0hST05PVVM6DQorCQljYXNlIEFWTV9PUENPREVfU1RST05HX1NZTkNIUk9OT1VTOg0KKwkJY2FzZSBBVk1fT1BDT0RFX1dFQUtfU1lOQ0hST05PVVM6DQorCQljYXNlIEFWTV9PUENPREVfSU5URVJMRUFWSU5HOg0KKwkJY2FzZSBBVk1fT1BDT0RFX1BBUkFMTEVMOg0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX0VYQ0xVU0lWRToNCisNCisJCWNhc2UgQVZNX09QQ09ERV9OT05ERVRFUk1JTklTTToNCisNCisNCisJCWNhc2UgQVZNX09QQ09ERV9QUklPUl9HVDoNCisJCWNhc2UgQVZNX09QQ09ERV9QUklPUl9MVDoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9BVE9NSUNfU0VRVUVOQ0U6DQorDQorCQljYXNlIEFWTV9PUENPREVfU0VRVUVOQ0U6DQorCQljYXNlIEFWTV9PUENPREVfU0VRVUVOQ0VfU0lERToNCisJCWNhc2UgQVZNX09QQ09ERV9TRVFVRU5DRV9XRUFLOg0KKw0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX1BST0RVQ1Q6DQorDQorDQorCQkvKg0KKwkJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCQkgKiBBVk0gQlVGRkVSIE1BTkFHSU5HDQorCQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJCSAqLw0KKwkJY2FzZSBBVk1fT1BDT0RFX1VQREFURV9CVUZGRVI6DQorDQorDQorCQkvKg0KKwkJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCQkgKiBMQU1CREEgU1RBVEVNRU5UDQorCQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJCSAqLw0KKwkJY2FzZSBBVk1fT1BDT0RFX0FQUExZOg0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX0xBTUJEQToNCisNCisJCWNhc2UgQVZNX09QQ09ERV9JTlZPS0VfUk9VVElORToNCisNCisJCWNhc2UgQVZNX09QQ09ERV9JTlZPS0VfVFJBTlNJVElPTjoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9JTlZPS0VfTUVUSE9EOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0lOVk9LRV9QUk9HUkFNOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0lOVk9LRV9GVU5DVElPTjoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9JTlZPS0VfTEFNQkRBX0FQUExZOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0lOVk9LRV9MQU1CREFfTEVUOg0KKw0KKw0KKwkJLyoNCisJCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkJICogTEVUIFNUQVRFTUVOVA0KKwkJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCQkgKi8NCisJCWNhc2UgQVZNX09QQ09ERV9MRVQ6DQorDQorDQorCQkvKg0KKwkJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCQkgKiBBVk0gUFJJTUlUSVZFIFNUQVRFTUVOVA0KKwkJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCQkgKi8NCisJCWNhc2UgQVZNX09QQ09ERV9BU1NJR046DQorCQljYXNlIEFWTV9PUENPREVfQVNTSUdOX0FGVEVSOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0FTU0lHTl9PUF9BRlRFUjoNCisJCWNhc2UgQVZNX09QQ09ERV9BU1NJR05fUkVGOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0FTU0lHTl9NQUNSTzoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9BU1NJR05fTkVXRlJFU0g6DQorCQljYXNlIEFWTV9PUENPREVfQVNTSUdOX1JFU0VUOg0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX0dVQVJEOg0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX0NIRUNLX1NBVDoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9JTlBVVDoNCisJCWNhc2UgQVZNX09QQ09ERV9JTlBVVF9GUk9NOg0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUX1NBVkU6DQorDQorCQljYXNlIEFWTV9PUENPREVfT1VUUFVUOg0KKwkJY2FzZSBBVk1fT1BDT0RFX09VVFBVVF9UTzoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9QUkVTRU5UOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0FCU0VOVDoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9JRjoNCisJCWNhc2UgQVZNX09QQ09ERV9JRkU6DQorDQorCQljYXNlIEFWTV9PUENPREVfRk9SOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0ZPUkVBQ0g6DQorCQljYXNlIEFWTV9PUENPREVfV0hJTEVfRE86DQorCQljYXNlIEFWTV9PUENPREVfRE9fV0hJTEU6DQorDQorCQljYXNlIEFWTV9PUENPREVfQlJFQUs6DQorCQljYXNlIEFWTV9PUENPREVfQ09OVElOVUU6DQorCQljYXNlIEFWTV9PUENPREVfUkVUVVJOOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0VYSVQ6DQorDQorCQljYXNlIEFWTV9PUENPREVfU1RFUF9NQVJLOg0KKw0KKwkJew0KKwkJCXJldHVybiggdHJ1ZSApOw0KKwkJfQ0KKw0KKwkJZGVmYXVsdDoNCisJCXsNCisJCQlyZXR1cm4oIGZhbHNlICk7DQorCQl9DQorCX0NCit9DQorDQorDQorYm9vbCBPcGVyYXRvck1hbmFnZXI6OmlzQXRvbWljU3RhdGVtZW50KGNvbnN0IE9wZXJhdG9yICogYW5PcGVyYXRvcikNCit7DQorCXN3aXRjaCggYW5PcGVyYXRvci0+Z2V0T3B0aW1pemVkT3BDb2RlKCkgKQ0KKwl7DQorCQljYXNlIEFWTV9PUENPREVfTk9QOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0NPTU1FTlQ6DQorCQljYXNlIEFWTV9PUENPREVfSU5GT1JNQUw6DQorCQljYXNlIEFWTV9PUENPREVfUVVPVEU6DQorCQljYXNlIEFWTV9PUENPREVfVFJBQ0U6DQorDQorCQljYXNlIEFWTV9PUENPREVfQVNTSUdOOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0FTU0lHTl9BRlRFUjoNCisJCWNhc2UgQVZNX09QQ09ERV9BU1NJR05fT1BfQUZURVI6DQorCQljYXNlIEFWTV9PUENPREVfQVNTSUdOX1JFRjoNCisJCWNhc2UgQVZNX09QQ09ERV9BU1NJR05fTUFDUk86DQorDQorCQljYXNlIEFWTV9PUENPREVfQVNTSUdOX05FV0ZSRVNIOg0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX0FTU0lHTl9SRVNFVDoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9HVUFSRDoNCisJCWNhc2UgQVZNX09QQ09ERV9USU1FRF9HVUFSRDoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9FVkVOVDoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9DSEVDS19TQVQ6DQorDQorDQorCQljYXNlIEFWTV9PUENPREVfSUVOQUJMRV9JTlZPS0U6DQorCQljYXNlIEFWTV9PUENPREVfRU5BQkxFX0lOVk9LRToNCisJCWNhc2UgQVZNX09QQ09ERV9FTkFCTEVfU0VUOg0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX0lESVNBQkxFX0lOVk9LRToNCisJCWNhc2UgQVZNX09QQ09ERV9ESVNBQkxFX0lOVk9LRToNCisJCWNhc2UgQVZNX09QQ09ERV9ESVNBQkxFX1NFVDoNCisJCWNhc2UgQVZNX09QQ09ERV9ESVNBQkxFX0NISUxEOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0RJU0FCTEVfU0VMRjoNCisJCWNhc2UgQVZNX09QQ09ERV9ESVNBQkxFX1NFTFZFUzoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9JQUJPUlRfSU5WT0tFOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0FCT1JUX0lOVk9LRToNCisJCWNhc2UgQVZNX09QQ09ERV9BQk9SVF9TRVQ6DQorCQljYXNlIEFWTV9PUENPREVfQUJPUlRfQ0hJTEQ6DQorCQljYXNlIEFWTV9PUENPREVfQUJPUlRfU0VMRjoNCisJCWNhc2UgQVZNX09QQ09ERV9BQk9SVF9TRUxWRVM6DQorDQorDQorCQljYXNlIEFWTV9PUENPREVfSU5QVVRfRU5WOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUX1ZBUjoNCisJCWNhc2UgQVZNX09QQ09ERV9JTlBVVF9GTE9XOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUX0JVRkZFUjoNCisJCWNhc2UgQVZNX09QQ09ERV9JTlBVVF9CUk9BRENBU1Q6DQorDQorCQljYXNlIEFWTV9PUENPREVfT1VUUFVUX0VOVjoNCisJCWNhc2UgQVZNX09QQ09ERV9PVVRQVVRfVkFSOg0KKwkJY2FzZSBBVk1fT1BDT0RFX09VVFBVVF9GTE9XOg0KKwkJY2FzZSBBVk1fT1BDT0RFX09VVFBVVF9CVUZGRVI6DQorCQljYXNlIEFWTV9PUENPREVfT1VUUFVUX0JST0FEQ0FTVDoNCisNCisNCisJCWNhc2UgQVZNX09QQ09ERV9QUkVTRU5UOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0FCU0VOVDoNCisNCisNCisJCWNhc2UgQVZNX09QQ09ERV9DT05DQVQ6DQorDQorCQljYXNlIEFWTV9PUENPREVfUkVNT1ZFOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0NMRUFSOg0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX1JFU0laRToNCisNCisJCWNhc2UgQVZNX09QQ09ERV9TRUxFQ1Q6DQorDQorCQljYXNlIEFWTV9PUENPREVfUFVTSDoNCisJCWNhc2UgQVZNX09QQ09ERV9QT1A6DQorCQl7DQorCQkJcmV0dXJuKCB0cnVlICk7DQorCQl9DQorDQorCQlkZWZhdWx0Og0KKwkJew0KKwkJCXJldHVybiggZmFsc2UgKTsNCisJCX0NCisJfQ0KK30NCisNCisNCisNCitib29sIE9wZXJhdG9yTWFuYWdlcjo6aXNDaGFyYWN0ZXIoY29uc3QgT3BlcmF0b3IgKiBhbk9wZXJhdG9yKQ0KK3sNCisJc3dpdGNoKCBhbk9wZXJhdG9yLT5nZXRBdm1PcENvZGUoKSApDQorCXsNCisvLwkJY2FzZSBBVk1fT1BDT0RFX1VOSUNPREU6DQorLy8JCXsNCisvLwkJCXJldHVybiggdHJ1ZSApOw0KKy8vCQl9DQorDQorCQlkZWZhdWx0Og0KKwkJew0KKwkJCXJldHVybiggZmFsc2UgKTsNCisJCX0NCisJfQ0KK30NCisNCisNCitib29sIE9wZXJhdG9yTWFuYWdlcjo6aXNTdHJpbmcoY29uc3QgT3BlcmF0b3IgKiBhbk9wZXJhdG9yKQ0KK3sNCisJc3dpdGNoKCBhbk9wZXJhdG9yLT5nZXRBdm1PcENvZGUoKSApDQorCXsNCisJCWNhc2UgQVZNX09QQ09ERV9DT05DQVQ6DQorCQljYXNlIEFWTV9PUENPREVfUExVUzoNCisJCWNhc2UgQVZNX09QQ09ERV9SRU1PVkU6DQorCQl7DQorCQkJcmV0dXJuKCB0cnVlICk7DQorCQl9DQorDQorCQlkZWZhdWx0Og0KKwkJew0KKwkJCXJldHVybiggZmFsc2UgKTsNCisJCX0NCisJfQ0KK30NCisNCisNCitib29sIE9wZXJhdG9yTWFuYWdlcjo6aXNMb29rdXAoY29uc3QgT3BlcmF0b3IgKiBhbk9wZXJhdG9yKQ0KK3sNCisJc3dpdGNoKCBhbk9wZXJhdG9yLT5nZXRBdm1PcENvZGUoKSApDQorCXsNCisJCS8qDQorCQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJCSAqIEFWTSBMT09LVVAgRVhQUkVTU0lPTg0KKwkJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCQkgKi8NCisNCisJCWNhc2UgQVZNX09QQ09ERV9MT09LVVBfSU5UX0VYVDoNCisJCWNhc2UgQVZNX09QQ09ERV9MT09LVVBfSU5UOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0xPT0tVUF9ORUFSRVNUOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0xPT0tVUF9CRUxPVzoNCisJCWNhc2UgQVZNX09QQ09ERV9MT09LVVBfQUJPVkU6DQorCQljYXNlIEFWTV9PUENPREVfTE9PS1VQMkRfSU5UX0VYVDoNCisJCXsNCisJCQlyZXR1cm4oIHRydWUgKTsNCisJCX0NCisNCisJCWRlZmF1bHQ6DQorCQl7DQorCQkJcmV0dXJuKCBmYWxzZSApOw0KKwkJfQ0KKwl9DQorfQ0KKw0KK2Jvb2wgT3BlcmF0b3JNYW5hZ2VyOjppc0xvb2t1cDFEKGNvbnN0IE9wZXJhdG9yICogYW5PcGVyYXRvcikNCit7DQorCXN3aXRjaCggYW5PcGVyYXRvci0+Z2V0QXZtT3BDb2RlKCkgKQ0KKwl7DQorCQkvKg0KKwkJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCQkgKiBBVk0gTE9PS1VQMUQgRVhQUkVTU0lPTg0KKwkJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCQkgKi8NCisNCisJCWNhc2UgQVZNX09QQ09ERV9MT09LVVBfSU5UX0VYVDoNCisJCWNhc2UgQVZNX09QQ09ERV9MT09LVVBfSU5UOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0xPT0tVUF9ORUFSRVNUOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0xPT0tVUF9CRUxPVzoNCisJCWNhc2UgQVZNX09QQ09ERV9MT09LVVBfQUJPVkU6DQorCQl7DQorCQkJcmV0dXJuKCB0cnVlICk7DQorCQl9DQorDQorCQlkZWZhdWx0Og0KKwkJew0KKwkJCXJldHVybiggZmFsc2UgKTsNCisJCX0NCisJfQ0KK30NCisNCitib29sIE9wZXJhdG9yTWFuYWdlcjo6aXNMb29rdXAyRChjb25zdCBPcGVyYXRvciAqIGFuT3BlcmF0b3IpDQorew0KKwlpZiggYW5PcGVyYXRvci0+aXNPcENvZGUoIEFWTV9PUENPREVfTE9PS1VQMkRfSU5UX0VYVCApICkNCisJew0KKwkJcmV0dXJuKCB0cnVlICk7DQorCX0NCisJZWxzZQ0KKwl7DQorCQlyZXR1cm4oIGZhbHNlICk7DQorCX0NCit9DQorDQorDQorYm9vbCBPcGVyYXRvck1hbmFnZXI6OmlzQ29udGFpbmVyRWxlbWVudEFjY2Vzcyhjb25zdCBPcGVyYXRvciAqIGFuT3BlcmF0b3IpDQorew0KKwlzd2l0Y2goIGFuT3BlcmF0b3ItPmdldEF2bU9wQ29kZSgpICkNCisJew0KKwkJY2FzZSBBVk1fT1BDT0RFX1RPUDoNCisJCWNhc2UgQVZNX09QQ09ERV9QT1A6DQorCQljYXNlIEFWTV9PUENPREVfUE9QX0ZST006DQorCQl7DQorCQkJcmV0dXJuKCB0cnVlICk7DQorCQl9DQorDQorCQlkZWZhdWx0Og0KKwkJew0KKwkJCXJldHVybiggZmFsc2UgKTsNCisJCX0NCisJfQ0KK30NCisNCisNCitib29sIE9wZXJhdG9yTWFuYWdlcjo6aXNDb250YWluZXJPcGVyYXRpb24oY29uc3QgT3BlcmF0b3IgKiBhbk9wZXJhdG9yKQ0KK3sNCisJc3dpdGNoKCBhbk9wZXJhdG9yLT5nZXRBdm1PcENvZGUoKSApDQorCXsNCisJCWNhc2UgQVZNX09QQ09ERV9BUFBFTkQ6DQorCQljYXNlIEFWTV9PUENPREVfUkVNT1ZFOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0NMRUFSOg0KKwkJY2FzZSBBVk1fT1BDT0RFX1JFU0laRToNCisNCisJCWNhc2UgQVZNX09QQ09ERV9TRUxFQ1Q6DQorDQorCQljYXNlIEFWTV9PUENPREVfSU5URVJTRUNUOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0NPTkNBVA0KKwkJOg0KKwkJY2FzZSBBVk1fT1BDT0RFX1BVU0g6DQorCQl7DQorCQkJcmV0dXJuKCB0cnVlICk7DQorCQl9DQorDQorCQlkZWZhdWx0Og0KKwkJew0KKwkJCXJldHVybiggZmFsc2UgKTsNCisJCX0NCisJfQ0KK30NCisNCisNCisvKioNCisgKiBDb2RvbWFpbiBvZiBmdW5jdGlvbg0KKyAqLw0KK2Jvb2wgT3BlcmF0b3JNYW5hZ2VyOjppc0NvZG9tYWluQm9vbGVhbihjb25zdCBPcGVyYXRvciAqIGFuT3BlcmF0b3IpDQorew0KKwlzd2l0Y2goIGFuT3BlcmF0b3ItPmdldEF2bU9wQ29kZSgpICkNCisJew0KKwkJZGVmYXVsdDoNCisJCXsNCisJCQlyZXR1cm4oIGZhbHNlICk7DQorCQl9DQorCX0NCit9DQorDQorYm9vbCBPcGVyYXRvck1hbmFnZXI6OmlzQ29kb21haW5DaGFyYWN0ZXIoY29uc3QgT3BlcmF0b3IgKiBhbk9wZXJhdG9yKQ0KK3sNCisJc3dpdGNoKCBhbk9wZXJhdG9yLT5nZXRBdm1PcENvZGUoKSApDQorCXsNCisJCWRlZmF1bHQ6DQorCQl7DQorCQkJcmV0dXJuKCBmYWxzZSApOw0KKwkJfQ0KKwl9DQorfQ0KKw0KK2Jvb2wgT3BlcmF0b3JNYW5hZ2VyOjppc0NvZG9tYWluU3RyaW5nKGNvbnN0IE9wZXJhdG9yICogYW5PcGVyYXRvcikNCit7DQorCXN3aXRjaCggYW5PcGVyYXRvci0+Z2V0QXZtT3BDb2RlKCkgKQ0KKwl7DQorCQlkZWZhdWx0Og0KKwkJew0KKwkJCXJldHVybiggZmFsc2UgKTsNCisJCX0NCisJfQ0KK30NCisNCitib29sIE9wZXJhdG9yTWFuYWdlcjo6aXNDb2RvbWFpbkludGVnZXIoY29uc3QgT3BlcmF0b3IgKiBhbk9wZXJhdG9yKQ0KK3sNCisJc3dpdGNoKCBhbk9wZXJhdG9yLT5nZXRBdm1PcENvZGUoKSApDQorCXsNCisJCWNhc2UgQVZNX09QQ09ERV9TSVpFOg0KKwkJew0KKwkJCXJldHVybiggdHJ1ZSApOw0KKwkJfQ0KKw0KKwkJZGVmYXVsdDoNCisJCXsNCisJCQlyZXR1cm4oIGZhbHNlICk7DQorCQl9DQorCX0NCit9DQorDQorYm9vbCBPcGVyYXRvck1hbmFnZXI6OmlzQ29kb21haW5SYXRpb25hbChjb25zdCBPcGVyYXRvciAqIGFuT3BlcmF0b3IpDQorew0KKwlzd2l0Y2goIGFuT3BlcmF0b3ItPmdldEF2bU9wQ29kZSgpICkNCisJew0KKwkJY2FzZSBBVk1fT1BDT0RFX1NJWkU6DQorCQl7DQorCQkJcmV0dXJuKCB0cnVlICk7DQorCQl9DQorDQorCQlkZWZhdWx0Og0KKwkJew0KKwkJCXJldHVybiggaXNDb2RvbWFpbkludGVnZXIoYW5PcGVyYXRvcikgKTsNCisJCX0NCisJfQ0KK30NCisNCitib29sIE9wZXJhdG9yTWFuYWdlcjo6aXNDb2RvbWFpbkZsb2F0KGNvbnN0IE9wZXJhdG9yICogYW5PcGVyYXRvcikNCit7DQorCXN3aXRjaCggYW5PcGVyYXRvci0+Z2V0QXZtT3BDb2RlKCkgKQ0KKwl7DQorCQljYXNlIEFWTV9PUENPREVfU0laRToNCisJCXsNCisJCQlyZXR1cm4oIHRydWUgKTsNCisJCX0NCisNCisJCWRlZmF1bHQ6DQorCQl7DQorCQkJcmV0dXJuKCBpc0NvZG9tYWluUmF0aW9uYWwoYW5PcGVyYXRvcikgKTsNCisJCX0NCisJfQ0KK30NCisNCitib29sIE9wZXJhdG9yTWFuYWdlcjo6aXNDb2RvbWFpblJlYWwoY29uc3QgT3BlcmF0b3IgKiBhbk9wZXJhdG9yKQ0KK3sNCisJc3dpdGNoKCBhbk9wZXJhdG9yLT5nZXRBdm1PcENvZGUoKSApDQorCXsNCisJCWNhc2UgQVZNX09QQ09ERV9TSVpFOg0KKwkJew0KKwkJCXJldHVybiggdHJ1ZSApOw0KKwkJfQ0KKw0KKwkJZGVmYXVsdDoNCisJCXsNCisJCQlyZXR1cm4oIGlzQ29kb21haW5GbG9hdChhbk9wZXJhdG9yKSApOw0KKwkJfQ0KKwl9DQorfQ0KKw0KKw0KKw0KKy8qKg0KKyAqIFJFR0lTVFJBVElPTg0KKyAqLw0KK3ZvaWQgT3BlcmF0b3JNYW5hZ2VyOjpyZWdpc3Rlck9wKE9wZXJhdG9yICogYW5PcGVyYXRvcikNCit7DQorCWlmKCBpc2FscGhhKCAqKGFuT3BlcmF0b3ItPmdldE5hbWVJRCgpLmJlZ2luKCkpICkgKQ0KKwl7DQorCQl0aGVPcGVyYXRvcnNNYXBbIGFuT3BlcmF0b3ItPmdldE5hbWVJRCgpIF0gPSBhbk9wZXJhdG9yOw0KKwl9DQorDQorCWFuT3BlcmF0b3ItPnNldE9mZnNldCggVEFCTEVfT0ZfT1BFUkFUT1Iuc2l6ZSgpICk7DQorDQorCVRBQkxFX09GX09QRVJBVE9SLnB1c2hfYmFjayggQkYoYW5PcGVyYXRvcikgKTsNCit9DQorDQorDQorT3BlcmF0b3IgKiBPcGVyYXRvck1hbmFnZXI6OmdldE9wKGNvbnN0IHN0ZDo6c3RyaW5nICYgc3RyT3BlcmF0b3IpDQorew0KKwlyZXR1cm4oIHRoZU9wZXJhdG9yc01hcFsgc3RyT3BlcmF0b3IgXSApOw0KK30NCisNCisNCitPcGVyYXRvciAqIE9wZXJhdG9yTWFuYWdlcjo6dG9PcGVyYXRvcigNCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgb3AsIE9wZXJhdG9yICogZGVmYXVsdE9wKQ0KK3sNCisJaWYoIG9wID09ICJOT1QiICkgIHJldHVybiggT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9OT1QgKTsNCisJaWYoIG9wID09ICJBTkQiICkgIHJldHVybiggT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BTkQgKTsNCisJaWYoIG9wID09ICJPUiIgICkgIHJldHVybiggT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9PUiAgKTsNCisJaWYoIG9wID09ICJYT1IiICkgIHJldHVybiggT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9YT1IgKTsNCisNCisJaWYoIG9wID09ICJ8O3wiICApICByZXR1cm4oIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU0VRVUVOQ0UgKTsNCisJaWYoIG9wID09ICJ8Ozt8IiApICByZXR1cm4oIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU0VRVUVOQ0VfV0VBSyAgKTsNCisJaWYoIG9wID09ICJ8aXwiICApICByZXR1cm4oIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfSU5URVJMRUFWSU5HICk7DQorDQorCXJldHVybiggZGVmYXVsdE9wICk7DQorfQ0KKw0KKw0KKw0KKw0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvb3BlcmF0b3IvT3BlcmF0b3JNYW5hZ2VyLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvb3BlcmF0b3IvT3BlcmF0b3JNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZlOGY5NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9vcGVyYXRvci9PcGVyYXRvck1hbmFnZXIuaApAQCAtMCwwICsxLDc4MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuDQorICoNCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ3JlYXRlZCBvbjogMTUgYW/Du3QgMjAwOA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyDQorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2lmbmRlZiBPUEVSQVRPUk1BTkFHRVJfSF8NCisjZGVmaW5lIE9QRVJBVE9STUFOQUdFUl9IXw0KKw0KKyNpbmNsdWRlIDxtYXA+DQorDQorI2luY2x1ZGUgPGNvbGxlY3Rpb24vQkZDb250YWluZXIuaD4NCisNCisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yLmg+DQorI2luY2x1ZGUgPGZtbC9vcGVyYXRvci9PcGVyYXRvckxpYi5oPg0KKw0KKw0KK25hbWVzcGFjZSBzZXANCit7DQorDQorDQorY2xhc3MgT3BlcmF0b3JNYW5hZ2VyDQorew0KKw0KK3B1YmxpYzoNCisNCisJLyoqDQorCSAqIExPQURFUiAtIERJU1BPU0VSDQorCSAqLw0KKwlzdGF0aWMgdm9pZCBsb2FkKCk7DQorCXN0YXRpYyB2b2lkIGRpc3Bvc2UoKTsNCisNCisNCisJc3RhdGljIE9wZXJhdG9yICogbmV3T3BlcmF0b3IoDQorCQkJQVZNX09QQ09ERSBhbkF2bU9wQ29kZSwgQVZNX09QQ09ERSBhbk9wdGltaXplZE9wQ29kZSwNCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCwNCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsDQorCQkJQUxHRUJSQV9RVUFMSUZJRVIgYW5BbGdlYnJhUXVhbGlmaWVyLA0KKwkJCUZJWF9OT1RBVElPTiBhRml4UXVhbGlmaWVyLA0KKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVN0YW5kYXJkU3ltYm9sLA0KKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVN5bnRheE1JWEZJWCwNCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFTeW1ib2xRRVBDQUQpOw0KKw0KKw0KKwlzdGF0aWMgaW5saW5lIE9wZXJhdG9yICogbmV3T3BlcmF0b3JBc3NvY0NvbShBVk1fT1BDT0RFIGFuQXZtT3BDb2RlLA0KKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlELA0KKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwNCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFTdGFuZGFyZFN5bWJvbCwNCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFTeW50YXhNSVhGSVgsDQorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhU3ltYm9sUUVQQ0FEKQ0KKwl7DQorCQlyZXR1cm4oIG5ld09wZXJhdG9yKGFuQXZtT3BDb2RlLCBhbkF2bU9wQ29kZSwNCisJCQkJYUZ1bGx5UXVhbGlmaWVkTmFtZUlELCBhTmFtZUlELA0KKwkJCQlBTEdFQlJBX0FTU09DX0NPTU0sIE5PVEFUSU9OX0lORklYLA0KKwkJCQlhU3RhbmRhcmRTeW1ib2wsIGFTeW50YXhNSVhGSVgsIGFTeW1ib2xRRVBDQUQpICk7DQorCX0NCisNCisJc3RhdGljIGlubGluZSBPcGVyYXRvciAqIG5ld09wZXJhdG9yQXNzb2NDb20oQVZNX09QQ09ERSBhbkF2bU9wQ29kZSwNCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCwNCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsDQorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhU3RhbmRhcmRTeW1ib2wpDQorCXsNCisJCXJldHVybiggbmV3T3BlcmF0b3IoYW5Bdm1PcENvZGUsIGFuQXZtT3BDb2RlLA0KKwkJCQlhRnVsbHlRdWFsaWZpZWROYW1lSUQsIGFOYW1lSUQsDQorCQkJCUFMR0VCUkFfQVNTT0NfQ09NTSwgTk9UQVRJT05fSU5GSVgsDQorCQkJCWFTdGFuZGFyZFN5bWJvbCwgIl8iICsgYVN0YW5kYXJkU3ltYm9sICsgIl8iLCBhU3RhbmRhcmRTeW1ib2wpICk7DQorCX0NCisNCisJc3RhdGljIGlubGluZSBPcGVyYXRvciAqIG5ld09wZXJhdG9yQXNzb2NDb20oDQorCQkJQVZNX09QQ09ERSBhbkF2bU9wQ29kZSwgQVZNX09QQ09ERSBhbk9wdGltaXplZE9wQ29kZSwNCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCwNCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsDQorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhU3RhbmRhcmRTeW1ib2wpDQorCXsNCisJCXJldHVybiggbmV3T3BlcmF0b3IoYW5Bdm1PcENvZGUsIGFuT3B0aW1pemVkT3BDb2RlLA0KKwkJCQlhRnVsbHlRdWFsaWZpZWROYW1lSUQsIGFOYW1lSUQsDQorCQkJCUFMR0VCUkFfQVNTT0NfQ09NTSwgTk9UQVRJT05fSU5GSVgsDQorCQkJCWFTdGFuZGFyZFN5bWJvbCwgIl8iICsgYVN0YW5kYXJkU3ltYm9sICsgIl8iLCBhU3RhbmRhcmRTeW1ib2wpICk7DQorCX0NCisNCisNCisJc3RhdGljIGlubGluZSBPcGVyYXRvciAqIG5ld09wZXJhdG9yQXNzb2MoQVZNX09QQ09ERSBhbkF2bU9wQ29kZSwNCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCwNCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsDQorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhU3RhbmRhcmRTeW1ib2wpDQorCXsNCisJCXJldHVybiggbmV3T3BlcmF0b3IoYW5Bdm1PcENvZGUsIGFuQXZtT3BDb2RlLA0KKwkJCQlhRnVsbHlRdWFsaWZpZWROYW1lSUQsIGFOYW1lSUQsDQorCQkJCUFMR0VCUkFfQVNTT0MsIE5PVEFUSU9OX0lORklYLA0KKwkJCQlhU3RhbmRhcmRTeW1ib2wsICJfIiArIGFTdGFuZGFyZFN5bWJvbCArICJfIiwgYVN0YW5kYXJkU3ltYm9sKSApOw0KKwl9DQorDQorCXN0YXRpYyBpbmxpbmUgT3BlcmF0b3IgKiBuZXdPcGVyYXRvckxlZnRBc3NvYyhBVk1fT1BDT0RFIGFuQXZtT3BDb2RlLA0KKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlELA0KKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwNCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFTdGFuZGFyZFN5bWJvbCkNCisJew0KKwkJcmV0dXJuKCBuZXdPcGVyYXRvcihhbkF2bU9wQ29kZSwgYW5Bdm1PcENvZGUsDQorCQkJCWFGdWxseVF1YWxpZmllZE5hbWVJRCwgYU5hbWVJRCwNCisJCQkJQUxHRUJSQV9MRUZUX0FTU09DLCBOT1RBVElPTl9JTkZJWCwNCisJCQkJYVN0YW5kYXJkU3ltYm9sLCAiXyIgKyBhU3RhbmRhcmRTeW1ib2wgKyAiXyIsIGFTdGFuZGFyZFN5bWJvbCkgKTsNCisJfQ0KKw0KKwlzdGF0aWMgaW5saW5lIE9wZXJhdG9yICogbmV3T3BlcmF0b3JSaWdodEFzc29jKEFWTV9PUENPREUgYW5Bdm1PcENvZGUsDQorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQsDQorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELA0KKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVN0YW5kYXJkU3ltYm9sKQ0KKwl7DQorCQlyZXR1cm4oIG5ld09wZXJhdG9yKGFuQXZtT3BDb2RlLCBhbkF2bU9wQ29kZSwNCisJCQkJYUZ1bGx5UXVhbGlmaWVkTmFtZUlELCBhTmFtZUlELA0KKwkJCQlBTEdFQlJBX1JJR0hUX0FTU09DLCBOT1RBVElPTl9JTkZJWCwNCisJCQkJYVN0YW5kYXJkU3ltYm9sLCAiXyIgKyBhU3RhbmRhcmRTeW1ib2wgKyAiXyIsIGFTdGFuZGFyZFN5bWJvbCkgKTsNCisJfQ0KKw0KKw0KKwlzdGF0aWMgaW5saW5lIE9wZXJhdG9yICogbmV3T3BlcmF0b3JTdGRJbmZpeChBVk1fT1BDT0RFIGFuQXZtT3BDb2RlLA0KKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlELA0KKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwNCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFTdGFuZGFyZFN5bWJvbCwNCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFTeW50YXhNSVhGSVgsDQorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhU3ltYm9sUUVQQ0FEKQ0KKwl7DQorCQlyZXR1cm4oIG5ld09wZXJhdG9yKGFuQXZtT3BDb2RlLCBhbkF2bU9wQ29kZSwNCisJCQkJYUZ1bGx5UXVhbGlmaWVkTmFtZUlELCBhTmFtZUlELA0KKwkJCQlBTEdFQlJBX1NURCwgTk9UQVRJT05fSU5GSVgsDQorCQkJCWFTdGFuZGFyZFN5bWJvbCwgYVN5bnRheE1JWEZJWCwgYVN5bWJvbFFFUENBRCkgKTsNCisJfQ0KKw0KKwlzdGF0aWMgaW5saW5lIE9wZXJhdG9yICogbmV3T3BlcmF0b3JTdGRJbmZpeChBVk1fT1BDT0RFIGFuQXZtT3BDb2RlLA0KKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlELA0KKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwNCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFTdGFuZGFyZFN5bWJvbCkNCisJew0KKwkJcmV0dXJuKCBuZXdPcGVyYXRvcihhbkF2bU9wQ29kZSwgYW5Bdm1PcENvZGUsDQorCQkJCWFGdWxseVF1YWxpZmllZE5hbWVJRCwgYU5hbWVJRCwNCisJCQkJQUxHRUJSQV9TVEQsIE5PVEFUSU9OX0lORklYLA0KKwkJCQlhU3RhbmRhcmRTeW1ib2wsICJfIiArIGFTdGFuZGFyZFN5bWJvbCArICJfIiwgYVN0YW5kYXJkU3ltYm9sKSApOw0KKwl9DQorDQorDQorCXN0YXRpYyBpbmxpbmUgT3BlcmF0b3IgKiBuZXdPcGVyYXRvclN0ZFByZWZpeChBVk1fT1BDT0RFIGFuQXZtT3BDb2RlLA0KKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlELA0KKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwNCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFTdGFuZGFyZFN5bWJvbCwNCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFTeW50YXhNSVhGSVgsDQorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhU3ltYm9sUUVQQ0FEKQ0KKwl7DQorCQlyZXR1cm4oIG5ld09wZXJhdG9yKGFuQXZtT3BDb2RlLCBhbkF2bU9wQ29kZSwNCisJCQkJYUZ1bGx5UXVhbGlmaWVkTmFtZUlELCBhTmFtZUlELA0KKwkJCQlBTEdFQlJBX1NURCwgTk9UQVRJT05fUFJFRklYLA0KKwkJCQlhU3RhbmRhcmRTeW1ib2wsIGFTeW50YXhNSVhGSVgsIGFTeW1ib2xRRVBDQUQpICk7DQorCX0NCisNCisJc3RhdGljIGlubGluZSBPcGVyYXRvciAqIG5ld09wZXJhdG9yU3RkUHJlZml4KEFWTV9PUENPREUgYW5Bdm1PcENvZGUsDQorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQsDQorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELCBjb25zdCBzdGQ6OnN0cmluZyAmIGFTdGFuZGFyZFN5bWJvbCkNCisJew0KKwkJcmV0dXJuKCBuZXdPcGVyYXRvcihhbkF2bU9wQ29kZSwgYW5Bdm1PcENvZGUsDQorCQkJCWFGdWxseVF1YWxpZmllZE5hbWVJRCwgYU5hbWVJRCwNCisJCQkJQUxHRUJSQV9TVEQsIE5PVEFUSU9OX1BSRUZJWCwNCisJCQkJYVN0YW5kYXJkU3ltYm9sLCBhU3RhbmRhcmRTeW1ib2wgKyAiXyIsIGFTdGFuZGFyZFN5bWJvbCkgKTsNCisJfQ0KKw0KKw0KKwlzdGF0aWMgaW5saW5lIE9wZXJhdG9yICogbmV3T3BTdGF0ZW1lbnQoDQorCQkJQVZNX09QQ09ERSBhbkF2bU9wQ29kZSwgQVZNX09QQ09ERSBhbk9wdGltaXplZE9wQ29kZSwNCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCwNCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpDQorCXsNCisJCXJldHVybiggbmV3T3BlcmF0b3IoYW5Bdm1PcENvZGUsIGFuT3B0aW1pemVkT3BDb2RlLA0KKwkJCQlhRnVsbHlRdWFsaWZpZWROYW1lSUQsIGFOYW1lSUQsDQorCQkJCUFMR0VCUkFfU1RELCBOT1RBVElPTl9TVEFURU1FTlQsDQorCQkJCWFOYW1lSUQsIGFOYW1lSUQsIGFOYW1lSUQpICk7DQorCX0NCisNCisNCisJLyoqDQorCSAqIFRFU1RFUg0KKwkgKi8NCisJc3RhdGljIGJvb2wgaXNRdW90ZShjb25zdCBPcGVyYXRvciAqIGFuT3BlcmF0b3IpOw0KKw0KKwlzdGF0aWMgYm9vbCBpc01ldGEoY29uc3QgT3BlcmF0b3IgKiBhbk9wZXJhdG9yKTsNCisJc3RhdGljIGJvb2wgaXNNZXRhRXZhbChjb25zdCBPcGVyYXRvciAqIGFuT3BlcmF0b3IpOw0KKwlzdGF0aWMgYm9vbCBpc01ldGFSdW4oY29uc3QgT3BlcmF0b3IgKiBhbk9wZXJhdG9yKTsNCisNCisNCisJc3RhdGljIGlubGluZSBib29sIGlzQXNzaWduKGNvbnN0IE9wZXJhdG9yICogYW5PcGVyYXRvcikNCisJew0KKwkJcmV0dXJuKCBpc0Fzc2lnbkJpbmFyeShhbk9wZXJhdG9yKSB8fCBpc0Fzc2lnblVuYXJ5KGFuT3BlcmF0b3IpICk7DQorCX0NCisNCisJc3RhdGljIGJvb2wgaXNBc3NpZ25CaW5hcnkoY29uc3QgT3BlcmF0b3IgKiBhbk9wZXJhdG9yKTsNCisJc3RhdGljIGJvb2wgaXNBc3NpZ25VbmFyeShjb25zdCBPcGVyYXRvciAqIGFuT3BlcmF0b3IpOw0KKw0KKw0KKwlzdGF0aWMgYm9vbCBpc1VmaShjb25zdCBPcGVyYXRvciAqIGFuT3BlcmF0b3IpOw0KKwlzdGF0aWMgYm9vbCBpc0N0b3IoY29uc3QgT3BlcmF0b3IgKiBhbk9wZXJhdG9yKTsNCisNCisJc3RhdGljIGJvb2wgaXNVZmlPckN0b3IoY29uc3QgT3BlcmF0b3IgKiBhbk9wZXJhdG9yKTsNCisNCisJc3RhdGljIGJvb2wgaXNOZXdmcmVzaChjb25zdCBPcGVyYXRvciAqIGFuT3BlcmF0b3IpOw0KKw0KKwlzdGF0aWMgYm9vbCBpc1NlcXVlbmNlKGNvbnN0IE9wZXJhdG9yICogYW5PcGVyYXRvcik7DQorDQorCXN0YXRpYyBib29sIGlzU2NoZWR1bGUoY29uc3QgT3BlcmF0b3IgKiBhbk9wZXJhdG9yKTsNCisNCisJc3RhdGljIGJvb2wgaXNNYWNoaW5lKGNvbnN0IE9wZXJhdG9yICogYW5PcGVyYXRvcik7DQorDQorCXN0YXRpYyBib29sIGlzQWN0aXZpdHkoY29uc3QgT3BlcmF0b3IgKiBhbk9wZXJhdG9yKTsNCisNCisJc3RhdGljIGJvb2wgaXNDb21tdW5pY2F0aW9uKGNvbnN0IE9wZXJhdG9yICogYW5PcGVyYXRvcik7DQorDQorCXN0YXRpYyBib29sIGlzQ29uZGl0aW9ubmFsKGNvbnN0IE9wZXJhdG9yICogYW5PcGVyYXRvcik7DQorDQorCXN0YXRpYyBib29sIGlzU3RhdGVtZW50KGNvbnN0IE9wZXJhdG9yICogYW5PcGVyYXRvcik7DQorDQorCXN0YXRpYyBib29sIGlzQXRvbWljU3RhdGVtZW50KGNvbnN0IE9wZXJhdG9yICogYW5PcGVyYXRvcik7DQorDQorDQorCXN0YXRpYyBib29sIGlzQXJpdGhtZXRpYyhjb25zdCBPcGVyYXRvciAqIGFuT3BlcmF0b3IpOw0KKw0KKwlzdGF0aWMgYm9vbCBpc0Jvb2xlYW4oY29uc3QgT3BlcmF0b3IgKiBhbk9wZXJhdG9yKTsNCisJc3RhdGljIGJvb2wgaXNSZWxhdGlvbmFsKGNvbnN0IE9wZXJhdG9yICogYW5PcGVyYXRvcik7DQorCXN0YXRpYyBib29sIGlzUHJvcG9zaXRpb25hbChjb25zdCBPcGVyYXRvciAqIGFuT3BlcmF0b3IpOw0KKw0KKwlzdGF0aWMgYm9vbCBpc1RlbXBvcmFsTG9naWMoY29uc3QgT3BlcmF0b3IgKiBhbk9wZXJhdG9yKTsNCisNCisNCisJc3RhdGljIGJvb2wgaXNDaGFyYWN0ZXIoY29uc3QgT3BlcmF0b3IgKiBhbk9wZXJhdG9yKTsNCisJc3RhdGljIGJvb2wgaXNTdHJpbmcoY29uc3QgT3BlcmF0b3IgKiBhbk9wZXJhdG9yKTsNCisNCisJc3RhdGljIGJvb2wgaXNMb29rdXAoY29uc3QgT3BlcmF0b3IgKiBhbk9wZXJhdG9yKTsNCisJc3RhdGljIGJvb2wgaXNMb29rdXAxRChjb25zdCBPcGVyYXRvciAqIGFuT3BlcmF0b3IpOw0KKwlzdGF0aWMgYm9vbCBpc0xvb2t1cDJEKGNvbnN0IE9wZXJhdG9yICogYW5PcGVyYXRvcik7DQorDQorCXN0YXRpYyBib29sIGlzQ29udGFpbmVyRWxlbWVudEFjY2Vzcyhjb25zdCBPcGVyYXRvciAqIGFuT3BlcmF0b3IpOw0KKw0KKwlzdGF0aWMgYm9vbCBpc0NvbnRhaW5lck9wZXJhdGlvbihjb25zdCBPcGVyYXRvciAqIGFuT3BlcmF0b3IpOw0KKw0KKw0KKwkvKioNCisJICogQ29kb21haW4gb2YgZnVuY3Rpb24NCisJICovDQorCXN0YXRpYyBib29sIGlzQ29kb21haW5Cb29sZWFuKGNvbnN0IE9wZXJhdG9yICogYW5PcGVyYXRvcik7DQorDQorCXN0YXRpYyBib29sIGlzQ29kb21haW5DaGFyYWN0ZXIoY29uc3QgT3BlcmF0b3IgKiBhbk9wZXJhdG9yKTsNCisNCisJc3RhdGljIGJvb2wgaXNDb2RvbWFpblN0cmluZyhjb25zdCBPcGVyYXRvciAqIGFuT3BlcmF0b3IpOw0KKw0KKwlzdGF0aWMgYm9vbCBpc0NvZG9tYWluSW50ZWdlcihjb25zdCBPcGVyYXRvciAqIGFuT3BlcmF0b3IpOw0KKw0KKwlzdGF0aWMgYm9vbCBpc0NvZG9tYWluUmF0aW9uYWwoY29uc3QgT3BlcmF0b3IgKiBhbk9wZXJhdG9yKTsNCisNCisJc3RhdGljIGJvb2wgaXNDb2RvbWFpbkZsb2F0KGNvbnN0IE9wZXJhdG9yICogYW5PcGVyYXRvcik7DQorDQorCXN0YXRpYyBib29sIGlzQ29kb21haW5SZWFsKGNvbnN0IE9wZXJhdG9yICogYW5PcGVyYXRvcik7DQorDQorDQorDQorCS8qKg0KKwkgKiBSRUdJU1RSQVRJT04NCisJICovDQorCXN0YXRpYyB2b2lkIHJlZ2lzdGVyT3AoT3BlcmF0b3IgKiBhbk9wZXJhdG9yKTsNCisJc3RhdGljIE9wZXJhdG9yICogZ2V0T3AoY29uc3Qgc3RkOjpzdHJpbmcgJiBzdHJPcGVyYXRvcik7DQorDQorCXN0YXRpYyBPcGVyYXRvciAqIHRvT3BlcmF0b3IoY29uc3Qgc3RkOjpzdHJpbmcgJiBvcCwgT3BlcmF0b3IgKiBkZWZhdWx0T3ApOw0KKw0KKwkvKioNCisJICogQVRUUklCVVRFUw0KKwkgKi8NCisJc3RhdGljIHN0ZDo6bWFwPCBzdGQ6OnN0cmluZyAsIE9wZXJhdG9yICogPiB0aGVPcGVyYXRvcnNNYXA7DQorDQorCXN0YXRpYyBCRlZlY3RvciBUQUJMRV9PRl9PUEVSQVRPUjsNCisNCisNCisjZGVmaW5lIENPTlNUX0JGX09QKG9wKSAgIFwNCisJc2VwOjpPcGVyYXRvck1hbmFnZXI6OlRBQkxFX09GX09QRVJBVE9SWyBvcC0+Z2V0T2Zmc2V0KCkgXQ0KKw0KKyNkZWZpbmUgQ09OU1RfQkZfT1BFUkFUT1Iob3ApICAgXA0KKwlzZXA6Ok9wZXJhdG9yTWFuYWdlcjo6VEFCTEVfT0ZfT1BFUkFUT1JbICAgXA0KKwkJc2VwOjpPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SXyMjb3AtPmdldE9mZnNldCgpIF0NCisNCisNCisNCisNCisJLyoNCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKiBBVk0gTk9QIFNUQVRFTUVOVA0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqLw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9OT1A7DQorDQorDQorCS8qDQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICogQVZNIE1FVEEgU1RBVEVNRU5UDQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICovDQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0lORk9STUFMOw0KKw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9UUkFDRTsNCisNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfREVCVUc7DQorDQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0NPTU1FTlQ7DQorDQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX1FVT1RFOw0KKw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9NRVRBX0VWQUw7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX01FVEFfUlVOOw0KKw0KKwkvKg0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqIEFWTSBVRkkgU1RBVEVNRU5UDQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICovDQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX1VGSTsNCisNCisNCisJLyoNCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKiBBVk0gRk9STSBDT05TVFJVQ1RPUiBTVEFURU1FTlQNCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKi8NCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfQ1RPUjsNCisNCisNCisJLyoNCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKiBBVk0gTUFDSElORSBNQU5BR0lORw0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqLw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9DT05URVhUX1NXSVRDSEVSOw0KKw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9JTklUOw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9GSU5BTDsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfREVTVFJPWTsNCisNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfU1RBUlQ7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX1JFU1RBUlQ7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX1NUT1A7DQorDQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX1dBSVQ7DQorDQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX1NVU1BFTkQ7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX1JFU1VNRTsNCisNCisNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfSUVOQUJMRV9JTlZPS0U7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0VOQUJMRV9JTlZPS0U7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0VOQUJMRV9TRVQ7DQorDQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0lESVNBQkxFX0lOVk9LRTsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfRElTQUJMRV9JTlZPS0U7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0RJU0FCTEVfU0VUOw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9ESVNBQkxFX0NISUxEOw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9ESVNBQkxFX1NFTEY7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0RJU0FCTEVfU0VMVkVTOw0KKw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9JQUJPUlRfSU5WT0tFOw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9BQk9SVF9JTlZPS0U7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0FCT1JUX1NFVDsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfQUJPUlRfQ0hJTEQ7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0FCT1JUX1NFTEY7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0FCT1JUX1NFTFZFUzsNCisNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfSElTVE9SWV9DTEVBUjsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfREVFUF9ISVNUT1JZX0lOVk9LRTsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfU0hBTExPV19ISVNUT1JZX0lOVk9LRTsNCisNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfSVJVTjsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfUlVOOw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9SVEM7DQorDQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0lOVk9LRV9ORVc7DQorDQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0lOVk9LRV9ST1VUSU5FOw0KKw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9JTlZPS0VfVFJBTlNJVElPTjsNCisNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfSU5WT0tFX01FVEhPRDsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfSU5WT0tFX1BST0dSQU07DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0lOVk9LRV9GVU5DVElPTjsNCisNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfSU5WT0tFX0xBTUJEQV9BUFBMWTsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfSU5WT0tFX0xBTUJEQV9MRVQ7DQorDQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0dPVE87DQorDQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX1NDSEVEVUxFX0lOVk9LRTsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfU0NIRURVTEVfR0VUOw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9TQ0hFRFVMRV9JTjsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfU0NIRURVTEVfU0VUOw0KKw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9ERUZFUl9JTlZPS0U7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0RFRkVSX0dFVDsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfREVGRVJfU0VUOw0KKw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9GT1JLOw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9KT0lOOw0KKw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9JTlBVVF9FTkFCTEVEOw0KKw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9SRFY7DQorDQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX1NZTkNIUk9OSVpFOw0KKw0KKw0KKwkvKg0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqIEFWTSBEQVRBIFNUQVRVUw0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqLw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9TVEFUVVNfV0FTOw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9TVEFUVVNfSVM7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX1NUQVRVU19CRUlORzsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfU1RBVFVTX1dJTEw7DQorDQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0NIQU5HRUQ7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0NIQU5HRURfVE87DQorDQorDQorCS8qDQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICogQVZNIFBST0dSQU0gU0NIRURVTElORw0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqLw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9BU1lOQ0hST05PVVM7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX1NUUk9OR19TWU5DSFJPTk9VUzsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfV0VBS19TWU5DSFJPTk9VUzsNCisNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfSU5URVJMRUFWSU5HOw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9QQVJUSUFMX09SREVSX1JFRFVDVElPTjsNCisNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfUEFSQUxMRUw7DQorDQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX1JEVl9BU1lOQ0hST05PVVM7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX1JEVl9TVFJPTkdfU1lOQ0hST05PVVM7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX1JEVl9XRUFLX1NZTkNIUk9OT1VTOw0KKw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9SRFZfSU5URVJMRUFWSU5HOw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9SRFZfUEFSVElBTF9PUkRFUl9SRURVQ1RJT047DQorDQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX1JEVl9QQVJBTExFTDsNCisNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfRVhDTFVTSVZFOw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9OT05ERVRFUk1JTklTTTsNCisNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfUFJJT1JfR1Q7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX1BSSU9SX0xUOw0KKw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9TQ0hFRFVMRV9BTkRfVEhFTjsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfU0NIRURVTEVfT1JfRUxTRTsNCisNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfQVRPTUlDX1NFUVVFTkNFOw0KKw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9TRVFVRU5DRTsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfU0VRVUVOQ0VfU0lERTsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfU0VRVUVOQ0VfV0VBSzsNCisNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfUFJPRFVDVDsNCisNCisNCisJLyoNCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKiBBVk0gQlVGRkVSIE1BTkFHSU5HDQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICovDQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX1VQREFURV9CVUZGRVI7DQorDQorDQorCS8qDQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICogTEFNQkRBIFNUQVRFTUVOVA0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqLw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9BUFBMWTsNCisNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfTEFNQkRBOw0KKw0KKw0KKwkvKg0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqIExFVCBTVEFURU1FTlQNCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKi8NCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfTEVUOw0KKw0KKw0KKwkvKg0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqIEFWTSBQUklNSVRJVkUgU1RBVEVNRU5UDQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICovDQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0FTU0lHTjsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfQVNTSUdOX0FGVEVSOw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9BU1NJR05fT1A7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0FTU0lHTl9PUF9BRlRFUjsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfQVNTSUdOX1JFRjsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfQVNTSUdOX01BQ1JPOw0KKw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9BU1NJR05fTkVXRlJFU0g7DQorDQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0FTU0lHTl9SRVNFVDsNCisNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfR1VBUkQ7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX1RJTUVEX0dVQVJEOw0KKw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9FVkVOVDsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfQ0hFQ0tfU0FUOw0KKw0KKw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9JTlBVVDsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfSU5QVVRfRlJPTTsNCisNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfSU5QVVRfU0FWRTsNCisNCisJLy8gT3B0aW1pemVkIHZlcnNpb24gb2YgSU5QVVQNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfSU5QVVRfVkFSOw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9JTlBVVF9GTE9XOw0KKw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9JTlBVVF9FTlY7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0lOUFVUX0JVRkZFUjsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfSU5QVVRfUkRWOw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9JTlBVVF9CUk9BRENBU1Q7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0lOUFVUX0RFTEVHQVRFOw0KKw0KKw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9PVVRQVVQ7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX09VVFBVVF9UTzsNCisNCisJLy8gT3B0aW1pemVkIHZlcnNpb24gb2YgT1VUUFVUDQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX09VVFBVVF9WQVI7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX09VVFBVVF9GTE9XOw0KKw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9PVVRQVVRfRU5WOw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9PVVRQVVRfQlVGRkVSOw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9PVVRQVVRfUkRWOw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9PVVRQVVRfQlJPQURDQVNUOw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9PVVRQVVRfREVMRUdBVEU7DQorDQorDQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX1BSRVNFTlQ7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0FCU0VOVDsNCisNCisNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfSUY7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0lGRTsNCisNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfRk9SOw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9GT1JFQUNIOw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9XSElMRV9ETzsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfRE9fV0hJTEU7DQorDQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0JSRUFLOw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9DT05USU5VRTsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfUkVUVVJOOw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9FWElUOw0KKw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9TVEVQX01BUks7DQorDQorDQorCS8qDQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICogQVZNIFBSRURJQ0FUIEVYUFJFU1NJT04NCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKi8NCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfRVhJU1Q7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0ZPUkFMTDsNCisNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfTk9UOw0KKw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9BTkQ7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0FORF9USEVOOw0KKw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9OQU5EOw0KKw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9YQU5EOw0KKw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9PUjsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfT1JfRUxTRTsNCisNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfTk9SOw0KKw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9YT1I7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX1hOT1I7DQorDQorDQorCS8qDQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICogQVZNIEJJVFdJU0UgRVhQUkVTU0lPTg0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqLw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9CTk9UOw0KKw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9CQU5EOw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9CT1I7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0JYT1I7DQorDQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0xTSElGVDsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfUlNISUZUOw0KKw0KKw0KKwkvKg0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqIEFWTSBTWU5UQVhJQyBDT01QQVJJU09OIEVYUFJFU1NJT04NCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKi8NCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfU0VROw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9OU0VROw0KKw0KKw0KKwkvKg0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqIEFWTSBDT01QQVJJU09OIEVYUFJFU1NJT04NCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKi8NCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfRVE7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX05FUTsNCisNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfTFQ7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0xURTsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfR1Q7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0dURTsNCisNCisNCisJLyoNCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKiBBVk0gQVJJVEhNRVRJQyBFWFBSRVNTSU9ODQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICovDQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX1BMVVM7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX01JTlVTOw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9VTUlOVVM7DQorDQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX01VTFQ7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX1BPVzsNCisNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfRElWOw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9NT0Q7DQorDQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX01JTjsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfTUFYOw0KKw0KKw0KKwkvKg0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqIExPT0tVUCBTVEFURU1FTlQNCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKi8NCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfTE9PS1VQX0lOVF9FWFQ7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0xPT0tVUF9JTlQ7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0xPT0tVUF9ORUFSRVNUOw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9MT09LVVBfQkVMT1c7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0xPT0tVUF9BQk9WRTsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfTE9PS1VQMkRfSU5UX0VYVDsNCisNCisNCisJLyoNCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKiBBVk0gTUFUSEVNQVRJQ0FMIEZVTkNUSU9ODQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICovDQorCS8vIFJPVU5ESU5HDQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX1JBTkRPTTsNCisNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfQUJTOw0KKw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9DRUlMOw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9GTE9PUjsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfUk9VTkQ7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX1RSVU5DQVRFOw0KKw0KKwkvLyBFWFAgLSBMT0cNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfU1FSVDsNCisNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfRVhQOw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9MTjsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfTE9HOw0KKw0KKwkvLyBUUklHT05PTUVUUklDDQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX1NJTjsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfQ09TOw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9UQU47DQorDQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX1NJTkg7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0NPU0g7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX1RBTkg7DQorDQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0FTSU47DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0FDT1M7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0FUQU47DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0FUQU4yOw0KKw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9BU0lOSDsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfQUNPU0g7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0FUQU5IOw0KKw0KKwkvKg0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqIEFWTSBTVFJJTkcgLyBDT0xMRUNUSU9OIE9QRVJBVE9SDQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICovDQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0NPTlRBSU5TOw0KKw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9JTjsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfTk9USU47DQorDQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX1NVQlNFVDsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfU1VCU0VURVE7DQorDQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0lOVEVSU0VDVDsNCisNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfU1RBUlRTX1dJVEg7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0VORFNfV0lUSDsNCisNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfQ09OQ0FUOw0KKw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9BUFBFTkQ7DQorDQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX1JFTU9WRTsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfQ0xFQVI7DQorDQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX1JFU0laRTsNCisNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfU0VMRUNUOw0KKw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9QVVNIOw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9BU1NJR05fVE9QOw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9UT1A7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX1BPUDsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfUE9QX0ZST007DQorDQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0VNUFRZOw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9OT05FTVBUWTsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfU0lOR0xFVE9OOw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9QT1BVTEFURUQ7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0ZVTEw7DQorDQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX1NJWkU7DQorDQorDQorCS8qDQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICogSU9MVEwgQkVIQVZJT1JBTCBQUkVESUNBVA0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqLw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9HTE9CQUxMWTsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfVU5USUw7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX05FWFQ7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0VWRU5UVUFMTFk7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX1JFTEVBU0VTOw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9PQlM7DQorDQorDQorCS8qDQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICogSU9MVEwgTE9HSUNBTCBQUkVESUNBVA0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqLw0KKwlzdGF0aWMgT3BlcmF0b3IgKiBPUEVSQVRPUl9BTkRfVDsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfT1JfVDsNCisJc3RhdGljIE9wZXJhdG9yICogT1BFUkFUT1JfTk9UX1Q7DQorCXN0YXRpYyBPcGVyYXRvciAqIE9QRVJBVE9SX0lNUF9UOw0KKw0KKw0KKw0KKw0KK307DQorDQorfQ0KKw0KKyNlbmRpZiAvKiBPUEVSQVRPUk1BTkFHRVJfSF8gKi8NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvb3BlcmF0b3IvUkVBRE1FLm1kIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL29wZXJhdG9yL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTljN2JlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL29wZXJhdG9yL1JFQURNRS5tZApAQCAtMCwwICsxLDEyIEBACisjIEVGTS1TWU1CRVggOiBPcGVyYXRvcgorCisjIyBTb3VyY2UgY29kZSBzdHJ1Y3R1cmUKKworIyMjIEludGVyZmFjZXMKKyogKipJT3BlcmF0b3IqKgorCisjIyMgQ2xhc3NlcworCisjIyMgRmFjdG9yaWVzCisqICoqT3BlcmF0b3IqKiBhcyBTbWFydCBQb2ludGVyCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL0V4ZWN1dGlvbkNvbmZpZ3VyYXRpb24uY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3J1bnRpbWUvRXhlY3V0aW9uQ29uZmlndXJhdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk1ZTcxMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL0V4ZWN1dGlvbkNvbmZpZ3VyYXRpb24uY3BwCkBAIC0wLDAgKzEsNjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJFeGVjdXRpb25Db25maWd1cmF0aW9uLmgiCisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorICogU2VyaWFsaXphdGlvbgorICovCitzdGQ6OnN0cmluZyBFeGVjdXRpb25Db25maWd1cmF0aW9uOjpzdHIoKSBjb25zdAoreworCWlmKCBpczwgT3BlcmF0b3IgPigpICkKKwl7CisJCXJldHVybiggT1NTKCkgPDwgZ2V0UnVudGltZUlEKCkuc3RyKCkKKwkJCQk8PCBGUU5fSURfUk9PVF9TRVBBUkFUT1IgPDwgZ2V0T3BlcmF0b3IoKS0+c3RyT3AoKSApOworCX0KKwllbHNlCisJeworCQlTdHJpbmdPdXRTdHJlYW0gb3NzKCBBVk1fU1RSX0lOREVOVCApOworCisJCXRvU3RyZWFtKCBvc3MgPDwgSUdOT1JFX0ZJUlNUX1RBQiApOworCisJCXJldHVybiggb3NzLnN0cigpICk7CisJfQorfQorCit2b2lkIEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb246OnRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdAoreworCXN0ZDo6c3RyaW5nIHN0cjRQcm9ncmFtOworCisJb3MgPDwgVEFCIDw8ICIoOnBpZCMiIDw8IGdldFJ1bnRpbWVJRCgpLmdldFJpZCgpIDw8ICIgLCI7IC8vIDw8ICIgfD0gIjsKKworCWlmKCBpc1dlYWtQcm9ncmFtKCkgKQorCXsKKwkJb3MgPDwgIiAiIDw8IHRvUHJvZ3JhbSgpLT5nZXROYW1lSUQoKTsKKwl9CisJZWxzZSBpZiggaXNBdm1Db2RlKCkgKQorCXsKKwkJdG9Bdm1Db2RlKCktPnRvU3RyZWFtUHJlZml4KCBvcyA8PCBBVk1fU1RSX0lOREVOVCApOworCQlvcyA8PCBFTkRfSU5ERU5UOworCX0KKwllbHNlCisJeworCQlvcyA8PCBzdHJfaW5kZW50KCBnZXRDb2RlKCkgKTsKKwl9CisKKwlBVk1fREVCVUdfUkVGX0NPVU5URVIob3MpOworCisJb3MgPDwgIikiIDw8IEVPTF9GTFVTSDsKK30KKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvcnVudGltZS9FeGVjdXRpb25Db25maWd1cmF0aW9uLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvcnVudGltZS9FeGVjdXRpb25Db25maWd1cmF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFmNDBjZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL0V4ZWN1dGlvbkNvbmZpZ3VyYXRpb24uaApAQCAtMCwwICsxLDI4NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBFWEVDVVRJT05DT05GSUdVUkFUSU9OX0hfCisjZGVmaW5lIEVYRUNVVElPTkNPTkZJR1VSQVRJT05fSF8KKworI2luY2x1ZGUgPGNvbW1vbi9Bdm1Qb2ludGVyLmg+CisjaW5jbHVkZSA8Y29tbW9uL0VsZW1lbnQuaD4KKyNpbmNsdWRlIDxjb21tb24vQkYuaD4KKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0F2bVByb2dyYW0uaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9Bdm1UcmFuc2l0aW9uLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9Bdm1Db2RlLmg+CisKKyNpbmNsdWRlIDxmbWwvb3BlcmF0b3IvT3BlcmF0b3IuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL01lc3NhZ2UuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lSUQuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworY2xhc3MgRXhlY3V0aW9uQ29uZmlndXJhdGlvbiA6IHB1YmxpYyBFbGVtZW50ICwKKwkJQVZNX0lOSkVDVF9JTlNUQU5DRV9DT1VOVEVSX0NMQVNTKCBFeGVjdXRpb25Db25maWd1cmF0aW9uICkKK3sKKworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBFeGVjdXRpb25Db25maWd1cmF0aW9uICkKKworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQVRUUklCVVRFUworCSAqLworCVJ1bnRpbWVJRCBtUnVudGltZUlEOworCisJTWVzc2FnZSBtSU9NZXNzYWdlOworCisJQkYgbUNvZGU7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24oY29uc3QgUnVudGltZUlEICYgYVJJRCwgY29uc3QgQkYgJiBhQ29kZSkKKwk6IEVsZW1lbnQoIENMQVNTX0tJTkRfVCggRXhlY3V0aW9uQ29uZmlndXJhdGlvbiApICksCisJbVJ1bnRpbWVJRCggYVJJRCApLAorCW1JT01lc3NhZ2UoICksCisJbUNvZGUoIGFDb2RlICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCUV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24oY29uc3QgUnVudGltZUlEICYgYVJJRCwKKwkJCWNvbnN0IEJGICYgYUNvZGUsIGNvbnN0IE1lc3NhZ2UgJiBpb01lc3NhZ2UpCisJOiBFbGVtZW50KCBDTEFTU19LSU5EX1QoIEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24gKSApLAorCW1SdW50aW1lSUQoIGFSSUQgKSwKKwltSU9NZXNzYWdlKCBpb01lc3NhZ2UgKSwKKwltQ29kZSggYUNvZGUgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJRXhlY3V0aW9uQ29uZmlndXJhdGlvbihjb25zdCBFeGVjdXRpb25Db25maWd1cmF0aW9uICYgYW5FeGVjQ29uZikKKwk6IEVsZW1lbnQoIGFuRXhlY0NvbmYgKSwKKwltUnVudGltZUlEKCBhbkV4ZWNDb25mLm1SdW50aW1lSUQgKSwKKwltSU9NZXNzYWdlKCBhbkV4ZWNDb25mLm1JT01lc3NhZ2UgKSwKKwltQ29kZSggYW5FeGVjQ29uZi5tQ29kZSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5FeGVjdXRpb25Db25maWd1cmF0aW9uKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogU2VyaWFsaXphdGlvbgorCSAqLworCXZpcnR1YWwgc3RkOjpzdHJpbmcgc3RyKCkgY29uc3Q7CisKKwl2aXJ0dWFsIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1SdW50aW1lSUQKKwkgKi8KKwlpbmxpbmUgY29uc3QgUnVudGltZUlEICYgZ2V0UnVudGltZUlEKCkgY29uc3QKKwl7CisJCXJldHVybiggbVJ1bnRpbWVJRCApOworCX0KKworCWlubGluZSBib29sIGhhc1J1bnRpbWVJRCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1SdW50aW1lSUQudmFsaWQoKSApOworCX0KKworCWlubGluZSB2b2lkIHNldFJ1bnRpbWVJRChjb25zdCBSdW50aW1lSUQgJiBhUklEKQorCXsKKwkJbVJ1bnRpbWVJRCA9IGFSSUQ7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtTWVzc2FnZQorCSAqLworCWlubGluZSBjb25zdCBNZXNzYWdlICYgZ2V0SU9NZXNzYWdlKCkKKwl7CisJCWlmKCBtSU9NZXNzYWdlLmludmFsaWQoKQorCQkJJiYgbUNvZGUuaXM8IEF2bUNvZGUgPigpICYmIG1Db2RlLnRvX3B0cjwgQXZtQ29kZSA+KCktPm5vbmVtcHR5KCkKKwkJCSYmIG1Db2RlLnRvX3B0cjwgQXZtQ29kZSA+KCktPmZpcnN0KCkuaXM8IE1lc3NhZ2UgPigpICkKKwkJeworCQkJbUlPTWVzc2FnZSA9IG1Db2RlLnRvX3B0cjwgQXZtQ29kZSA+KCktPmZpcnN0KCk7CisJCX0KKworCQlyZXR1cm4oIG1JT01lc3NhZ2UgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNJT01lc3NhZ2UoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtSU9NZXNzYWdlLnZhbGlkKCkKKwkJCXx8IChtQ29kZS5pczwgQXZtQ29kZSA+KCkKKwkJCQkmJiBtQ29kZS50b19wdHI8IEF2bUNvZGUgPigpLT5ub25lbXB0eSgpCisJCQkJJiYgbUNvZGUudG9fcHRyPCBBdm1Db2RlID4oKS0+Zmlyc3QoKS5pczwgTWVzc2FnZSA+KCkpICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtQ29kZQorCSAqLworCWlubGluZSBjb25zdCBCRiAmIGdldENvZGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQ29kZSApOworCX0KKworCWlubGluZSBib29sIGhhc0NvZGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQ29kZS52YWxpZCgpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0Q29kZShjb25zdCBCRiAmIGFDb2RlKQorCXsKKwkJbUNvZGUgPSBhQ29kZTsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBQYXJhbWV0ZXIgaXRlcmF0b3IKKwkgKi8KKworCS8vIE9wZXJhdG9yCisJaW5saW5lIGJvb2wgaXNPcGVyYXRvcigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Db2RlLmlzPCBPcGVyYXRvciA+KCkgKTsKKwl9CisKKwlpbmxpbmUgT3BlcmF0b3IgKiBnZXRPcGVyYXRvcigpIGNvbnN0CisJeworCQlyZXR1cm4oIGlzT3BlcmF0b3IoKSA/IGdldENvZGUoKS50b19wdHI8IE9wZXJhdG9yID4oKSA6IE5VTEwgKTsKKwl9CisKKworCS8vIEF2bUNvZGUKKwlpbmxpbmUgYm9vbCBpc0F2bUNvZGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQ29kZS5pczwgQXZtQ29kZSA+KCkgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQkZDb2RlICYgZ2V0QXZtQ29kZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGlzQXZtQ29kZSgpID8gZ2V0Q29kZSgpLmJmQ29kZSgpIDogQkZDb2RlOjpSRUZfTlVMTCApOworCX0KKworCWlubGluZSBjb25zdCBCRkNvZGUgJiB0b0F2bUNvZGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRDb2RlKCkuYmZDb2RlKCkgKTsKKwl9CisKKwlpbmxpbmUgQVZNX09QQ09ERSBnZXRBdm1PcENvZGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBpc0F2bUNvZGUoKSA/IG1Db2RlLnRvX3B0cjwgQXZtQ29kZSA+KCktPmdldEF2bU9wQ29kZSgpCisJCQkJOiBBVk1fT1BDT0RFX05VTEwgKTsKKwl9CisKKwlpbmxpbmUgQVZNX09QQ09ERSBnZXRPcHRpbWl6ZWRPcENvZGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBpc0F2bUNvZGUoKSA/IG1Db2RlLnRvX3B0cjwgQXZtQ29kZSA+KCktPmdldE9wdGltaXplZE9wQ29kZSgpCisJCQkJOiBBVk1fT1BDT0RFX05VTEwgKTsKKwl9CisKKworCS8vIEF2bVByb2dyYW0gLSBBdm1UcmFuc2l0aW9uIC0gQXZtUm91dGluZQorCWlubGluZSBib29sIGlzVHJhbnNpdGlvbigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Db2RlLmlzPCBBdm1UcmFuc2l0aW9uID4oKSApOworCX0KKworCWlubGluZSBBdm1UcmFuc2l0aW9uICogZ2V0VHJhbnNpdGlvbigpIGNvbnN0CisJeworCQlyZXR1cm4oIGlzVHJhbnNpdGlvbigpID8gZ2V0Q29kZSgpLnRvX3B0cjwgQXZtVHJhbnNpdGlvbiA+KCkgOiBOVUxMICk7CisJfQorCisJaW5saW5lIEF2bVRyYW5zaXRpb24gKiB0b1RyYW5zaXRpb24oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRDb2RlKCkudG9fcHRyPCBBdm1UcmFuc2l0aW9uID4oKSApOworCX0KKworCWlubGluZSBib29sIGlzUm91dGluZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Db2RlLmlzX2V4YWN0bHk8IEF2bVByb2dyYW0gPigpICYmCisJCQkJZ2V0Q29kZSgpLnRvX3B0cjwgQXZtUHJvZ3JhbSA+KCktPmlzU2NvcGVSb3V0aW5lKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc1J1bm5hYmxlKCkgY29uc3QKKwl7CisJCXJldHVybiggbUNvZGUuaXNfZXhhY3RseTwgQXZtUHJvZ3JhbSA+KCkgJiYKKwkJCQlnZXRDb2RlKCkudG9fcHRyPCBBdm1Qcm9ncmFtID4oKS0+aXNTY29wZVJvdXRpbmUoKSApOworCX0KKworCisJaW5saW5lIGJvb2wgaXNQcm9ncmFtKCkgY29uc3QKKwl7CisJCXJldHVybiggbUNvZGUuaXNfZXhhY3RseTwgQXZtUHJvZ3JhbSA+KCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc1dlYWtQcm9ncmFtKCkgY29uc3QKKwl7CisJCXJldHVybiggbUNvZGUuaXM8IEF2bVByb2dyYW0gPigpICk7CisJfQorCisJaW5saW5lIEF2bVByb2dyYW0gKiBnZXRQcm9ncmFtKCkgY29uc3QKKwl7CisJCXJldHVybiggaXNXZWFrUHJvZ3JhbSgpID8gZ2V0Q29kZSgpLnRvX3B0cjwgQXZtUHJvZ3JhbSA+KCkgOiBOVUxMICk7CisJfQorCisJaW5saW5lIEF2bVByb2dyYW0gKiB0b1Byb2dyYW0oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRDb2RlKCkudG9fcHRyPCBBdm1Qcm9ncmFtID4oKSApOworCX0KKworCisJLyoqCisJICogQ09NUEFSSVNPTgorCSAqIE9QRVJBVE9SCisJICovCisJaW5saW5lIGludCBjb21wYXJlKGNvbnN0IEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24gJiBvdGhlcikgY29uc3QKKwl7CisJCWludCBjbXBSZXN1bHQgPSBtUnVudGltZUlELmNvbXBhcmUoIG90aGVyLm1SdW50aW1lSUQgKTsKKworCQlyZXR1cm4oIChjbXBSZXN1bHQgPT0gMCkgPyBtQ29kZS5jb21wYXJlKCBvdGhlci5tQ29kZSApIDogY21wUmVzdWx0ICk7CisJfQorCisKK307CisKKworCit9CisKKyNlbmRpZiAvKkVYRUNVVElPTkNPTkZJR1VSQVRJT05fSF8qLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3J1bnRpbWUvRXhlY3V0aW9uQ29udGV4dC5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvcnVudGltZS9FeGVjdXRpb25Db250ZXh0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTgxYWM2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3J1bnRpbWUvRXhlY3V0aW9uQ29udGV4dC5jcHAKQEAgLTAsMCArMSw4NzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkNvbnRleHQuaD4KKworCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vU3RhdGVtZW50Q29uc3RydWN0b3IuaD4KKworI2luY2x1ZGUgPGZtbC9vcGVyYXRvci9PcGVyYXRvck1hbmFnZXIuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoqCisgKiBJRF9OVU1CRVIKKyAqLworYXZtX3VpbnQzMl90IEV4ZWN1dGlvbkNvbnRleHRIZWFkZXI6OklEX05VTUJFUiA9IDA7CisKKworLyoqCisgKiBUUkFDRSBDT05TVEFOVAorICovCithdm1fc2l6ZV90IEV4ZWN1dGlvbkNvbnRleHQ6OkVDX0NISUxEX1RSQUNFX0RFRkFVTFRfU0laRSA9IDQyOworCithdm1fc2l6ZV90IEV4ZWN1dGlvbkNvbnRleHQ6OkVYRUNVVElPTl9DT05URVhUX0NISUxEX1RSQUNFX01BWCA9CisJCUVDX0NISUxEX1RSQUNFX0RFRkFVTFRfU0laRTsKKworCisvKgorICogREVGQVVMVCBOVUxMIFJFRkVSRU5DRQorICovCitFeGVjdXRpb25Db250ZXh0IEV4ZWN1dGlvbkNvbnRleHQ6Ol9OVUxMXzsKKworLyoqCisgKiBMQ0EgLUxDUkEKKyAqLworY29uc3QgRXhlY3V0aW9uQ29udGV4dCAqIEV4ZWN1dGlvbkNvbnRleHQ6OkxDQSgKKwkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpIGNvbnN0Cit7CisJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAqIGNvbnRhaW5lck9mVGhpcyA9IHRoaXM7CisJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAqIGNvbnRhaW5lck9mRUMgPSBhbkVDOworCisJd2hpbGUoIGNvbnRhaW5lck9mVGhpcy0+Z2V0SGVpZ2h0KCkgPCBjb250YWluZXJPZkVDLT5nZXRIZWlnaHQoKSApCisJeworCQljb250YWluZXJPZkVDID0gY29udGFpbmVyT2ZFQy0+Z2V0Q29udGFpbmVyKCk7CisJfQorCXdoaWxlKCBjb250YWluZXJPZkVDLT5nZXRIZWlnaHQoKSA8IGNvbnRhaW5lck9mVGhpcy0+Z2V0SGVpZ2h0KCkgKQorCXsKKwkJY29udGFpbmVyT2ZUaGlzID0gY29udGFpbmVyT2ZUaGlzLT5nZXRDb250YWluZXIoKTsKKwl9CisKKwl3aGlsZSggY29udGFpbmVyT2ZUaGlzICE9IGNvbnRhaW5lck9mRUMgKQorCXsKKwkJY29udGFpbmVyT2ZUaGlzID0gY29udGFpbmVyT2ZUaGlzLT5nZXRDb250YWluZXIoKTsKKwkJY29udGFpbmVyT2ZFQyA9IGNvbnRhaW5lck9mRUMtPmdldENvbnRhaW5lcigpOworCX0KKworCXJldHVybiggY29udGFpbmVyT2ZUaGlzICk7Cit9CisKKworLyoqCisgKiBTZXJpYWxpemF0aW9uCisgKi8KK3ZvaWQgRXhlY3V0aW9uQ29udGV4dDo6dG9EZWJ1ZyhPdXRTdHJlYW0gJiBvdXQpIGNvbnN0Cit7CisJb3V0IDw8IFRBQiA8PCAiRUM6IiA8PCAiPCIKKwkJPDwgIklkOiIgPDwgZ2V0SWROdW1iZXIoKSAgIDw8ICI7IgorCQk8PCAiRXY6IiA8PCBnZXRFdmFsTnVtYmVyKCkgPDwgIjsiCisJCTw8ICAiSDoiIDw8IGdldEhlaWdodCgpICAgICA8PCAiOyIKKwkJPDwgICJXOiIgPDwgZ2V0V2lkdGgoKSAgICAvLzw8ICI7IgorLy8JCTw8ICAiUToiIDw8ICgoYXZtX3VpbnQzMl90KSBnZXRXZWlnaHQoKSkKKwkJPDwgIj57IiAgPDwgSU5DUl9JTkRFTlQ7CisKKwlpZiggaGFzRXhlY3V0aW9uRGF0YSgpICkKKwl7CisJCW91dCA8PCAiIFNDOiAiIDw8IHJlZkV4ZWN1dGlvbkRhdGEoKS5zdHJTdGF0ZUNvbmZUb0ZzY24oKSA8PCBFT0w7CisJfQorCisJaWYoIGhhc1J1bm5hYmxlRWxlbWVudFRyYWNlKCkgKQorCXsKKwkJb3V0IDw8IFRBQiA8PCAiRVhFICAgOiAiOyAgZ2V0UnVubmFibGVFbGVtZW50VHJhY2UoKS50b1N0cmVhbShvdXQpOworCX0KKworCWlmKCBoYXNJT0VsZW1lbnRUcmFjZSgpICkKKwl7CisJCW91dCA8PCBUQUIgPDwgIlRSQUNFIDogIjsgZ2V0SU9FbGVtZW50VHJhY2UoKS50b1N0cmVhbShvdXQpOworCX0KKworCS8vIEZMQUdTCisJaWYoIGhhc0ZsYWdzKCkgKQorCXsKKwkJb3V0IDw8IFRBQiA8PCAiLypGTEFHU3sgIiA8PCBnZXRGbGFncygpLnN0cigpIDw8ICIgfSovIiA8PCBFT0w7CisJfQorCisJLy8gSU5GT1JNQVRJT04KKwlpZiggaGFzSW5mb3JtYXRpb24oKSkKKwl7CisJCWlmKCBnZXRJbmZvcm1hdGlvbigpLT5oYXNJbmZvKCkgKQorCQl7CisJCQlvdXQgPDwgVEFCIDw8ICJJTkZPeyIgPDwgRU9MX0lOQ1JfSU5ERU5UOworCQkJZ2V0SW5mb3JtYXRpb24oKS0+dG9Gc2NuSW5mbyhvdXQpOworCQkJb3V0IDw8IERFQ1JfSU5ERU5UX1RBQiA8PCAifSIgPDwgRU9MX0ZMVVNIOworCQl9CisKKwkJaWYoIGdldEluZm9ybWF0aW9uKCktPmhhc1NwZWNpZmljSW5mbygpICkKKwkJeworCQkJb3V0IDw8IFRBQiA8PCAiLypJTkZPUk1BVElPTnsiIDw8IEVPTF9JTkNSX0lOREVOVDsKKwkJCWdldEluZm9ybWF0aW9uKCktPnRvRnNjbihvdXQpOworCQkJb3V0IDw8IERFQ1JfSU5ERU5UX1RBQiA8PCAifSovIiA8PCBFT0xfRkxVU0g7CisJCX0KKwl9CisJLy8gRU5EIElORk9STUFUSU9OCisKKworCWlmKCBoYXNOb2RlQ29uZGl0aW9uKCkgJiYgZ2V0Tm9kZUNvbmRpdGlvbigpLmlzTm90RXF1YWxUcnVlKCkgKQorCXsKKwkJb3V0IDw8IERFRkFVTFRfV1JBUF9EQVRBIDw8IFRBQiA8PCAiTkM6IgorCQkJPDwgc3RyX2luZGVudCggZ2V0Tm9kZUNvbmRpdGlvbigpICkgPDwgRU5EX1dSQVBfRU9MOworCX0KKworCWlmKCBoYXNOb2RlVGltZWRDb25kaXRpb24oKSAmJgorCQkJZ2V0Tm9kZVRpbWVkQ29uZGl0aW9uKCkuaXNOb3RFcXVhbFRydWUoKSApCisJeworCQlvdXQgPDwgREVGQVVMVF9XUkFQX0RBVEEgPDwgVEFCIDw8ICJOdEM6IgorCQkJPDwgc3RyX2luZGVudCggZ2V0Tm9kZVRpbWVkQ29uZGl0aW9uKCkgKSA8PCBFTkRfV1JBUF9FT0w7CisJfQorCisJaWYoIGhhc0V4ZWN1dGlvbkRhdGEoKSApCisJeworCQlTY29wZUluY3JJbmRlbnQgYXNpaShvdXQpOworCisJCXJlZkV4ZWN1dGlvbkRhdGEoKS50b0ZzY24ob3V0LCBoYXNQcmV2aW91cygpID8KKwkJCQlnZXRQcmV2aW91cygpLT5nZXRFeGVjdXRpb25EYXRhKCkgOiBOVUxMKTsKKwl9CisKKwlvdXQgPDwgREVDUl9JTkRFTlRfVEFCIDw8ICJ9IiA8PCBFT0w7Cit9CisKKwordm9pZCBFeGVjdXRpb25Db250ZXh0Ojp0b0RlYnVnRmV0KE91dFN0cmVhbSAmIG91dCkgY29uc3QKK3sKKwlvdXQgPDwgVEFCIDw8ICJlYyggIgorCQk8PCAiSWQ6IiA8PCBnZXRJZE51bWJlcigpICAgICA8PCAiICwgIgorCQk8PCAiUHI6IiA8PCBnZXRQcmV2SWROdW1iZXIoKSA8PCAiICwgIgorCQk8PCAiRXY6IiA8PCBnZXRFdmFsTnVtYmVyKCkgICA8PCAiICwgIgorCQk8PCAiSDoiICA8PCBnZXRIZWlnaHQoKSAgICAgICA8PCAiICwgIgorCQk8PCAiVzoiICA8PCBnZXRXaWR0aCgpICAgICAgICA8PCAiICwgIgorCQk8PCAiUToiICA8PCBnZXRTdHJXZWlnaHQoKQorCQk8PCAiICkiIDsKKworCUFWTV9ERUJVR19SRUZfQ09VTlRFUihvdXQpOworCW91dCA8PCAiIHsiIDw8IEVPTF9JTkNSX0lOREVOVDsKKworCWlmKCBoYXNOb2RlQ29uZGl0aW9uKCkgJiYKKwkJZ2V0Tm9kZUNvbmRpdGlvbigpLmlzTm90RXF1YWxUcnVlKCkgKQorCXsKKwkJb3V0IDw8IERFRkFVTFRfV1JBUF9EQVRBIDw8IFRBQiA8PCAiZmlyZWQjY29uZGl0aW9uID0iCisJCQk8PCBzdHJfaW5kZW50KCBnZXROb2RlQ29uZGl0aW9uKCkgKQorCQkJPDwgIjsiIDw8IEVORF9XUkFQX0VPTDsKKwl9CisKKwlpZiggaGFzTm9kZVRpbWVkQ29uZGl0aW9uKCkgJiYKKwkJZ2V0Tm9kZVRpbWVkQ29uZGl0aW9uKCkuaXNOb3RFcXVhbFRydWUoKSApCisJeworCQlvdXQgPDwgREVGQVVMVF9XUkFQX0RBVEEgPDwgVEFCIDw8ICJmaXJlZCN0aW1lZCNjb25kaXRpb24gPSIKKwkJCTw8IHN0cl9pbmRlbnQoIGdldE5vZGVUaW1lZENvbmRpdGlvbigpICkgPDwgIjsiIDw8IEVORF9XUkFQX0VPTDsKKwl9CisKKwlpZiggaGFzUnVubmFibGVFbGVtZW50VHJhY2UoKSApCisJeworCQlvdXQgPDwgVEFCIDw8ICJmaXJlZCA9IiA8PCBzdHJfaW5kZW50KCBnZXRSdW5uYWJsZUVsZW1lbnRUcmFjZSgpICkKKwkJCTw8ICI7IiA8PCBFT0xfRkxVU0g7CisJfQorCisJaWYoIGhhc0lPRWxlbWVudFRyYWNlKCkgKQorCXsKKwkJb3V0IDw8IFRBQiA8PCAidHJhY2UgPSIgPDwgc3RyX2luZGVudCggZ2V0SU9FbGVtZW50VHJhY2UoKSApCisJCQk8PCAiOyIgPDwgRU9MX0ZMVVNIOworCX0KKworCisJaWYoIGhhc0luZm9ybWF0aW9uKCkgKQorCXsKKwkJZ2V0SW5mb3JtYXRpb24oKS0+dG9TdHJlYW0ob3V0KTsKKwl9CisKKwlpZiggaGFzRXhlY3V0aW9uRGF0YSgpICkKKwl7CisJCXJlZkV4ZWN1dGlvbkRhdGEoKS50b1N0cmVhbShvdXQpOworCX0KKworCisJb3V0IDw8IERFQ1JfSU5ERU5UX1RBQiA8PCAifSIgPDwgRU9MX0ZMVVNIOworfQorCisKKwordm9pZCBFeGVjdXRpb25Db250ZXh0Ojp0b1N0cmVhbShPdXRTdHJlYW0gJiBvdXQpIGNvbnN0Cit7CisJb3V0IDw8IFRBQiA8PCBnZXRGbGFncygpLnRvU3RyaW5nKCIgIikgPDwgImVjKCAiCisJCTw8ICJJZDoiIDw8IGdldElkTnVtYmVyKCkgICAgIDw8ICIgLCAiCisJCTw8ICJQcjoiIDw8IGdldFByZXZJZE51bWJlcigpIDw8ICIgLCAiCisJCTw8ICJFdjoiIDw8IGdldEV2YWxOdW1iZXIoKSAgIDw8ICIgLCAiCisJCTw8ICAiSDoiIDw8IGdldEhlaWdodCgpICAgICAgIDw8ICIgLCAiCisJCTw8ICAiVzoiIDw8IGdldFdpZHRoKCkgICAgICAgIDw8ICIgLCAiCisJCTw8ICAiUToiIDw8IGdldFN0cldlaWdodCgpCisJCTw8ICIgKSIgOworCisJQVZNX0RFQlVHX1JFRl9DT1VOVEVSKG91dCk7CisJb3V0IDw8ICIgeyIgPDwgRU9MX0lOQ1JfSU5ERU5UOworCisJaWYoIGhhc05vZGVDb25kaXRpb24oKSAmJiBnZXROb2RlQ29uZGl0aW9uKCkuaXNOb3RFcXVhbFRydWUoKSApCisJeworCQlvdXQgPDwgREVGQVVMVF9XUkFQX0RBVEEgPDwgVEFCIDw8ICJub2RlY29uZGl0aW9uID0iCisJCQk8PCBzdHJfaW5kZW50KCBnZXROb2RlQ29uZGl0aW9uKCkgKSA8PCAiOyIgPDwgRU5EX1dSQVBfRU9MOworCX0KKworCWlmKCBoYXNOb2RlVGltZWRDb25kaXRpb24oKSAmJiBnZXROb2RlVGltZWRDb25kaXRpb24oKS5pc05vdEVxdWFsVHJ1ZSgpICkKKwl7CisJCW91dCA8PCBERUZBVUxUX1dSQVBfREFUQSA8PCBUQUIgPDwgIm5vZGV0aW1lZGNvbmRpdGlvbiA9IgorCQkJPDwgc3RyX2luZGVudCggZ2V0Tm9kZVRpbWVkQ29uZGl0aW9uKCkgKSA8PCAiOyIgPDwgRU5EX1dSQVBfRU9MOworCX0KKworCWlmKCBoYXNSdW5uYWJsZUVsZW1lbnRUcmFjZSgpICkKKwl7CisJCW91dCA8PCBUQUIgPDwgImZpcmVkID0iIDw8IHN0cl9pbmRlbnQoIGdldFJ1bm5hYmxlRWxlbWVudFRyYWNlKCkgKQorCQkJPDwgIjsiIDw8IEVPTF9GTFVTSDsKKwl9CisKKwlpZiggaGFzSU9FbGVtZW50VHJhY2UoKSApCisJeworCQlvdXQgPDwgVEFCIDw8ICJ0cmFjZSA9IiA8PCBzdHJfaW5kZW50KCBnZXRJT0VsZW1lbnRUcmFjZSgpICkKKwkJCTw8ICI7IiA8PCBFT0xfRkxVU0g7CisJfQorCisKKwlpZiggaGFzSW5mb3JtYXRpb24oKSApCisJeworCQlnZXRJbmZvcm1hdGlvbigpLT50b1N0cmVhbShvdXQpOworCX0KKworCWlmKCBoYXNFeGVjdXRpb25EYXRhKCkgKQorCXsKKwkJcmVmRXhlY3V0aW9uRGF0YSgpLnRvU3RyZWFtKG91dCk7CisJfQorCisJb3V0IDw8IERFQ1JfSU5ERU5UOworCisKKwlpZiggaGFzQ2hpbGRDb250ZXh0KCkgKQorCXsKKwkJb3V0IDw8IEVPTF9UQUIgPDwgImVjOiIgPDwgRU9MX0lOQ1JfSU5ERU5UOworCQlmb3IoIGNoaWxkX2l0ZXJhdG9yIGl0ID0gYmVnaW4oKSA7IGl0ICE9IGVuZCgpIDsgKytpdCApCisJCXsKKwkJCSgqaXQpLT50b1N0cmVhbShvdXQpOworCQl9CisJCW91dCA8PCBERUNSX0lOREVOVDsKKwl9CisKKwlvdXQgPDwgVEFCIDw8ICJ9IiA8PCBFT0xfRkxVU0g7Cit9CisKKwordm9pZCBFeGVjdXRpb25Db250ZXh0Ojp0b0ZzY24oT3V0U3RyZWFtICYgb3V0LAorCQljb25zdCBFeGVjdXRpb25EYXRhICogYVByZXZpb3VzRXhlY0RhdGEpIGNvbnN0Cit7CisJb3V0IDw8IFRBQiA8PCAiRUM6IiA8PCAiPCIKKwkJPDwgIklkOiIgPDwgZ2V0SWROdW1iZXIoKSAgIDw8ICI7IgorCQk8PCAiRXY6IiA8PCBnZXRFdmFsTnVtYmVyKCkgPDwgIjsiCisJCTw8ICAiSDoiIDw8IGdldEhlaWdodCgpICAgICA8PCAiOyIKKwkJPDwgICJXOiIgPDwgZ2V0V2lkdGgoKSAgICAvLzw8ICI7IgorLy8JCTw8ICAiUToiIDw8ICgoYXZtX3VpbnQzMl90KSBnZXRXZWlnaHQoKSkKKwkJPDwgICI+eyIgOworCisJaWYoIGhhc0V4ZWN1dGlvbkRhdGEoKSApCisJeworCQlvdXQgPDwgIiBTQzogIiA8PCByZWZFeGVjdXRpb25EYXRhKCkuc3RyU3RhdGVDb25mVG9Gc2NuKCkgPDwgRU9MOworCisJCWF2bV9zaXplX3QgaW5kZXhBbGlhcyA9IDA7CisJCWJvb2wgaXNBbGlhcyA9IGZhbHNlOworCQlpZiggKGdldFByZXZpb3VzKCkgIT0gTlVMTCkgKQorCQl7CisJCQkvLyBSZWNoZXJjaGUgZGVzIG5vdXZlYXV4IFBJRAorCQkJaWYocmVmRXhlY3V0aW9uRGF0YSgpLmdldFRhYmxlT2ZSdW50aW1lKCkuc2l6ZSgpCisJCQkJPiBnZXRQcmV2aW91cygpLT5yZWZFeGVjdXRpb25EYXRhKCkuZ2V0VGFibGVPZlJ1bnRpbWUoKS5zaXplKCkpCisJCQl7CisJCQkJaW5kZXhBbGlhcyA9IGdldFByZXZpb3VzKCkKKwkJCQkJCS0+cmVmRXhlY3V0aW9uRGF0YSgpLmdldFRhYmxlT2ZSdW50aW1lKCkuc2l6ZSgpOworCQkJCWlzQWxpYXMgPSB0cnVlOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJaXNBbGlhcyA9IHRydWU7CisJCX0KKworCQlpZiggaXNBbGlhcyApCisJCXsKKwkJCW91dCA8PCBUQUIyIDw8ICJBTElBU3siIDw8IEVPTDsKKworCQkJZm9yKCBhdm1fc2l6ZV90IGkgPSBpbmRleEFsaWFzIDsKKwkJCQkJaSA8IHJlZkV4ZWN1dGlvbkRhdGEoKS5nZXRUYWJsZU9mUnVudGltZSgpLnNpemUoKSA7ICsraSkKKwkJCXsKKwkJCQljb25zdCBSdW50aW1lSUQgJiBjdXJyZW50UklEID0KKwkJCQkJcmVmRXhlY3V0aW9uRGF0YSgpLmdldFRhYmxlT2ZSdW50aW1lKCkuYXQoaSktPmdldFJJRCgpOworCisJCQkJb3V0IDw8IFRBQjMgPDwgIjpwcGlkIyIgPDwgY3VycmVudFJJRC5nZXRQUmlkKCkKKwkJCQkJPDwgIjoiIDw8ICJwaWQjIiA8PCBjdXJyZW50UklELmdldFJpZCgpOworCisJCQkJaWYoIGN1cnJlbnRSSUQuZ2V0SW5zdGFuY2UoKS0+CisJCQkJCQlnZXRTcGVjaWZpZXIoKS5pc0Rlc2lnblByb3RvdHlwZVN0YXRpYygpICkKKwkJCQl7CisJCQkJCW91dCA8PCAiID0gIgorCQkJCQkJPDwgY3VycmVudFJJRC5nZXRJbnN0YW5jZSgpLT5nZXRBc3RGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQkJCQk8PCAiOyIgPDwgRU9MOworCQkJCX0KKwkJCQllbHNlIGlmKCBjdXJyZW50UklELmdldEluc3RhbmNlKCktPgorCQkJCQkJZ2V0U3BlY2lmaWVyKCkuaXNEZXNpZ25JbnN0YW5jZSgpICkKKwkJCQl7CisJCQkJCW91dCA8PCAiID0gIgorCQkJCQkJPDwgY3VycmVudFJJRC5nZXRJbnN0YW5jZSgpLT5nZXRBc3RGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQkJCQk8PCAiOyI7CisKKwkJCQkJb3V0IDw8ICIgLy8gbW9kZWwgaXMgIgorCQkJCQkJPDwgY3VycmVudFJJRC5nZXRFeGVjdXRhYmxlKCktPmdldEFzdEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKwkJCQkJCTw8ICI7IiA8PCBFT0w7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCW91dCA8PCAiID0gIiA8PCBjdXJyZW50UklELmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIjsiCisJCQkJCQk8PCAiIC8vIG1vZGVsIGlzICIKKwkJCQkJCTw8IGN1cnJlbnRSSUQuZ2V0RXhlY3V0YWJsZSgpLT5nZXRBc3RGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQkJCQk8PCAiOyIgPDwgRU9MOworCQkJCX0KKworCisJCQkJaWYoIGN1cnJlbnRSSUQuZ2V0SW5zdGFuY2UoKS0+aGFzRXhlY3V0YWJsZSgpICkKKwkJCQl7CisJCQkJCWNvbnN0IFRhYmxlT2ZTeW1ib2wgJiByZkJ1ZmZlcnMgPQorCQkJCQkJCWN1cnJlbnRSSUQuZ2V0RXhlY3V0YWJsZSgpLT5nZXRCdWZmZXIoKTsKKwkJCQkJaWYocmZCdWZmZXJzLm5vbmVtcHR5KCkpeworCQkJCQkJb3V0IDw8IFRBQjQgPDwgIkJVRkZFUiBOVU1CRVIgPSAiIDw8IHJmQnVmZmVycy5zaXplKCkKKwkJCQkJCQkJPDwgIjsiIDw8IEVPTDsKKworCQkJCQkJb3V0IDw8IFRBQjQgPDwgIi8qQlVGRkVSeyIgPDwgRU9MOworCisJCQkJCQlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBpdEJ1ZmZlciA9IHJmQnVmZmVycy5iZWdpbigpOworCQkJCQkJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgZW5kQnVmZmVyID0gcmZCdWZmZXJzLmVuZCgpOworCQkJCQkJZm9yKCA7IGl0QnVmZmVyICE9IGVuZEJ1ZmZlciA7ICsraXRCdWZmZXIgKQorCQkJCQkJeworCQkJCQkJCW91dCA8PCBUQUI1IDw8ICI6cHBpZCMiIDw8IGN1cnJlbnRSSUQuZ2V0UFJpZCgpCisJCQkJCQkJCQk8PCAiOiIgPDwgInBpZCMiIDw8IGN1cnJlbnRSSUQuZ2V0UmlkKCkKKwkJCQkJCQkJCTw8ICI6IiA8PCAoKml0QnVmZmVyKS5nZXROYW1lSUQoKSA8PCAiID0gIjsKKwkJCQkJCQlvdXQgPDwgKCAoKCppdEJ1ZmZlcikuaGFzQXN0RWxlbWVudCgpKSA/CisJCQkJCQkJCQkoKml0QnVmZmVyKS5nZXRBc3RGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQkJCQkJCQk6ICgqaXRCdWZmZXIpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgKQorCQkJCQkJCQkJPDwgIjsiIDw8IEVPTDsKKwkJCQkJCX0KKworCQkJCQkJb3V0IDw8IFRBQjQgPDwgIn0qLyIgPDwgRU9MOworCQkJCQl9CisKKwkJCQkJaWYoIGN1cnJlbnRSSUQuZ2V0RXhlY3V0YWJsZSgpLT5oYXNEYXRhKCkgKQorCQkJCQl7CisJCQkJCQlvdXQgPDwgVEFCNCA8PCAiREFUQXsiIDw8IEVPTDsKKworCQkJCQkJVGFibGVPZkluc3RhbmNlT2ZEYXRhOjpjb25zdF9yYXdfaXRlcmF0b3IgaXREYXRhID0KKwkJCQkJCQkJY3VycmVudFJJRC5nZXRFeGVjdXRhYmxlKCktPmdldEJhc2ljRGF0YSgpLmJlZ2luKCk7CisJCQkJCQlUYWJsZU9mSW5zdGFuY2VPZkRhdGE6OmNvbnN0X3Jhd19pdGVyYXRvciBlbmREYXRhID0KKwkJCQkJCQkJY3VycmVudFJJRC5nZXRFeGVjdXRhYmxlKCktPmdldEJhc2ljRGF0YSgpLmVuZCgpOworCQkJCQkJZm9yKCA7IChpdERhdGEgIT0gZW5kRGF0YSkgOyArK2l0RGF0YSApCisJCQkJCQl7CisJCQkJCQkJb3V0IDw8IFRBQjUgPDwgIjpwcGlkIyIgPDwgY3VycmVudFJJRC5nZXRQUmlkKCkKKwkJCQkJCQkJPDwgIjpwaWQjIiA8PCBjdXJyZW50UklELmdldFJpZCgpIDw8ICI6IgorCQkJCQkJCQk8PCAoaXREYXRhKS0+Z2V0TmFtZUlEKCkgPDwgIiA9ICIKKwkJCQkJCQkJPDwgKCAoIChpdERhdGEpLT5oYXNBc3RFbGVtZW50KCkgKQorCQkJCQkJCQkJCT8gKGl0RGF0YSktPmdldEFzdEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKwkJCQkJCQkJCQk6IChpdERhdGEpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpICkKKwkJCQkJCQkJPDwgIjsiIDw8IEVPTDsKKwkJCQkJCX0KKworCQkJCQkJb3V0IDw8IFRBQjQgPDwgIn0iIDw8IEVPTDsKKwkJCQkJfQorCisJCQkJCWlmKCBjdXJyZW50UklELmdldEV4ZWN1dGFibGUoKS0+aGFzUG9ydCgpICkKKwkJCQkJeworCQkJCQkJb3V0IDw8IFRBQjQgPDwgIklOVEVSRkFDRXsiIDw8IEVPTDsKKworCQkJCQkJVGFibGVPZlN5bWJvbCAmIHJmSW50ZXJmYWNlID0KKwkJCQkJCQkJY3VycmVudFJJRC5nZXRFeGVjdXRhYmxlKCktPmdldFBvcnQoKTsKKwkJCQkJCVRhYmxlT2ZTeW1ib2w6Oml0ZXJhdG9yIGl0UG9ydCA9IHJmSW50ZXJmYWNlLmJlZ2luKCk7CisJCQkJCQlmb3IoICA7IGl0UG9ydCAhPSByZkludGVyZmFjZS5lbmQoKSA7ICsraXRQb3J0ICkKKwkJCQkJCXsKKwkJCQkJCQlvdXQgPDwgVEFCNSA8PCAiOnBwaWQjIiA8PCBjdXJyZW50UklELmdldFBSaWQoKQorCQkJCQkJCQk8PCAiOnBpZCMiIDw8IGN1cnJlbnRSSUQuZ2V0UmlkKCkgPDwgIjoiCisJCQkJCQkJCTw8ICAoKml0UG9ydCkuZ2V0TmFtZUlEKCkgPDwgIiA9ICIKKwkJCQkJCQkJPDwgICgqaXRQb3J0KS5nZXRBc3RGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQkJCQkJCTw8ICI7IiA8PCBFT0w7CisJCQkJCQl9CisKKwkJCQkJCW91dCA8PCBUQUI0IDw8ICJ9IiA8PCBFT0w7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlvdXQgPDwgVEFCMiA8PCAifSIgPDwgRU9MOworCQl9CisJfQorCisJaWYoIGhhc1J1bm5hYmxlRWxlbWVudFRyYWNlKCkgKQorCXsKKwkJb3V0IDw8IERFRkFVTFRfV1JBUF9EQVRBIDw8IFRBQjIgPDwgIkVYRToiCisJCQk8PCBzdHJfaW5kZW50KCBnZXRSdW5uYWJsZUVsZW1lbnRUcmFjZSgpICkgPDwgRU5EX1dSQVBfRU9MOworCX0KKworCWlmKCBoYXNJT0VsZW1lbnRUcmFjZSgpICkKKwl7CisJCW91dCA8PCBERUZBVUxUX1dSQVBfREFUQSA8PCBUQUIyIDw8ICJUUkFDRToiCisJCQk8PCBzdHJfaW5kZW50KCBnZXRJT0VsZW1lbnRUcmFjZSgpICkgPDwgRU5EX1dSQVBfRU9MOworCX0KKworCS8vIEZMQUdTCisJaWYoIGhhc0ZsYWdzKCkgKQorCXsKKwkJb3V0IDw8IFRBQjIgPDwgIi8qRkxBR1N7ICIgPDwgZ2V0RmxhZ3MoKS5zdHIoKSA8PCAiIH0qLyIgPDwgRU9MOworCX0KKworCS8vIElORk9STUFUSU9OCisJaWYoIGhhc0luZm9ybWF0aW9uKCkgKQorCXsKKwkJaWYoIGdldEluZm9ybWF0aW9uKCktPmhhc0luZm8oKSApCisJCXsKKwkJCW91dCA8PCBUQUIyIDw8ICJJTkZPeyIgPDwgRU9MX0lOQ1IyX0lOREVOVDsKKwkJCWdldEluZm9ybWF0aW9uKCktPnRvRnNjbkluZm8ob3V0KTsKKwkJCW91dCA8PCBERUNSMl9JTkRFTlRfVEFCMiA8PCAifSIgPDwgRU9MX0ZMVVNIOworCQl9CisKKwkJaWYoIGdldEluZm9ybWF0aW9uKCktPmhhc1NwZWNpZmljSW5mbygpICkKKwkJeworCQkJb3V0IDw8IFRBQjIgPDwgIi8qSU5GT1JNQVRJT057IiA8PCBFT0xfSU5DUjJfSU5ERU5UOworCQkJZ2V0SW5mb3JtYXRpb24oKS0+dG9Gc2NuKG91dCk7CisJCQlvdXQgPDwgREVDUjJfSU5ERU5UX1RBQjIgPDwgIn0qLyIgPDwgRU9MX0ZMVVNIOworCQl9CisJfQorCS8vIEVORCBJTkZPUk1BVElPTgorCisKKwlpZiggaGFzTm9kZUNvbmRpdGlvbigpICYmIGdldE5vZGVDb25kaXRpb24oKS5pc05vdEVxdWFsVHJ1ZSgpICkKKwl7CisJCW91dCA8PCBERUZBVUxUX1dSQVBfREFUQSA8PCBUQUIyIDw8ICJOQzoiCisJCQk8PCBzdHJfaW5kZW50KCBnZXROb2RlQ29uZGl0aW9uKCkgKSA8PCBFTkRfV1JBUF9FT0w7CisJfQorCisJaWYoIGhhc05vZGVUaW1lZENvbmRpdGlvbigpICYmCisJCQlnZXROb2RlVGltZWRDb25kaXRpb24oKS5pc05vdEVxdWFsVHJ1ZSgpICkKKwl7CisJCW91dCA8PCBERUZBVUxUX1dSQVBfREFUQSA8PCBUQUIyIDw8ICJOdEM6IgorCQkJPDwgc3RyX2luZGVudCggZ2V0Tm9kZVRpbWVkQ29uZGl0aW9uKCkgKSA8PCBFTkRfV1JBUF9FT0w7CisJfQorCisJaWYoIGhhc0V4ZWN1dGlvbkRhdGEoKSApCisJeworCQlTY29wZUluY3JJbmRlbnQgYXNpaShvdXQpOworCisJCXJlZkV4ZWN1dGlvbkRhdGEoKS50b0ZzY24ob3V0LCBhUHJldmlvdXNFeGVjRGF0YSk7CisJfQorCisKKwlpZiggaGFzQ2hpbGRDb250ZXh0KCkgKQorCXsKKwkJb3V0IDw8IElOQ1JfSU5ERU5UOworCisJCWZvciggY2hpbGRfaXRlcmF0b3IgaXQgPSBiZWdpbigpIDsgaXQgIT0gZW5kKCkgOyArK2l0ICkKKwkJeworCQkJKCppdCktPnRvRnNjbihvdXQsIGdldEV4ZWN1dGlvbkRhdGEoKSk7CisJCX0KKworCQlvdXQgPDwgREVDUl9JTkRFTlQ7CisJfQorCisJb3V0IDw8IFRBQiA8PCAifSIgPDwgRU9MOworfQorCisKKy8qKgorICogRXhlY3V0aW9uQ29udGV4dDo6c3RyX21pbgorICoKKyAqLworc3RkOjpzdHJpbmcgRXhlY3V0aW9uQ29udGV4dDo6c3RyX21pbigpIGNvbnN0Cit7CisJcmV0dXJuKCBPU1MoKSA8PCBzdHJfcG9zaXRpb24oKSA8PCAiICIKKwkJCTw8IHJlZkV4ZWN1dGlvbkRhdGEoKS5zdHJTdGF0ZUNvbmYoKSApOworfQorCisKKy8qKgorICogRXhlY3V0aW9uQ29udGV4dDo6c3RyX1Bvc2l0aW9ucworICoKKyAqLworc3RkOjpzdHJpbmcgRXhlY3V0aW9uQ29udGV4dDo6c3RyX3Bvc2l0aW9uKCkgY29uc3QKK3sKKwlzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworCisJb3NzIDw8ICJJZDoiIC8qPDwgc3RkOjpzZXR3KDQpKi8gPDwgZ2V0SWROdW1iZXIoKTsKKworCW9zcyA8PCAiIFBFOiI7CisJaWYoIGhhc0NvbnRhaW5lcigpICkKKwl7CisJCS8vb3NzIC8qPDwgc3RkOjpzZXR3KDQpKi8gPDwgZ2V0Q29udGFpbmVyKCktPmdldElkTnVtYmVyKCk7CisJCW9zcyAvKjw8IHN0ZDo6c2V0dyg0KSovIDw8IGdldENvbnRhaW5lcigpLT5nZXRFdmFsTnVtYmVyKCk7CisJfQorCWVsc2UKKwl7CisJCW9zcyA8PCAiUk9PVCI7CisJfQorCisJb3NzIDw8ICIgSDoiIC8qPDwgc3RkOjpzZXR3KDQpKi8gPDwgZ2V0SGVpZ2h0KCk7CisJb3NzIDw8ICIgVzoiIC8qPDwgc3RkOjpzZXR3KDQpKi8gPDwgZ2V0V2lkdGgoKTsKKwlvc3MgPDwgIiBROiIgLyo8PCBzdGQ6OnNldHcoMikqLyA8PCBnZXRTdHJXZWlnaHQoKTsKKworCXJldHVybiggb3NzLnN0cigpICk7Cit9CisKKworLyoqCisgKiB0cmFjZU1pbmltdW0KKyAqCisgKi8KK3ZvaWQgRXhlY3V0aW9uQ29udGV4dDo6dHJhY2VNaW5pbXVtKE91dFN0cmVhbSAmIG91dCkgY29uc3QKK3sKKwlvdXQgPDwgVEFCIDw8ICJjdHg6IiA8PCBnZXRJZE51bWJlcigpOworCisJaWYoIGdldFdlaWdodCgpICE9IDAgKQorCXsKKwkJb3V0IDw8ICIgUToiIDw8IGdldFN0cldlaWdodCgpOworCX0KKwlvdXQgPDwgIiAiIDw8IHJlZkV4ZWN1dGlvbkRhdGEoKS5zdHJTdGF0ZUNvbmYoKSA8PCBFT0w7Cit9CisKK3ZvaWQgRXhlY3V0aW9uQ29udGV4dDo6dHJhY2VEZWZhdWx0KE91dFN0cmVhbSAmIG91dCkgY29uc3QKK3sKKwlvdXQgPDwgVEFCIDw8ICJjdHg6IiA8PCBnZXRJZE51bWJlcigpOworCWlmKCBnZXRXZWlnaHQoKSAhPSAwICkKKwl7CisJCW91dCA8PCAiIFE6IiA8PCBnZXRTdHJXZWlnaHQoKTsKKwl9CisKKwlvdXQgPDwgIiAiIDw8IHJlZkV4ZWN1dGlvbkRhdGEoKS5zdHJTdGF0ZUNvbmYoKSA8PCAifD0+IGZpcmVkICI7CisKKwlpZiggaGFzUnVubmFibGVFbGVtZW50VHJhY2UoKSApCisJeworCQlvdXQgPDwgZ2V0UnVubmFibGVFbGVtZW50VHJhY2UoKS5zdHIoKTsKKwl9CisJZWxzZQorCXsKKwkJb3V0IDw8ICJub3RoaW5nIGluICIgPDwgcmVmRXhlY3V0aW9uRGF0YSgpLmdldFN5c3RlbVJJRCgpLnN0cigpOworCX0KKworCW91dCA8PCBFT0w7Cit9CisKK3ZvaWQgRXhlY3V0aW9uQ29udGV4dDo6ZGVidWdEZWZhdWx0KE91dFN0cmVhbSAmIG91dCkgY29uc3QKK3sKKwlvdXQgPDwgVEFCIDw8ICJjdHg6IiA8PCBnZXRJZE51bWJlcigpOworCWlmKCBnZXRXZWlnaHQoKSAhPSAwICkKKwl7CisJCW91dCA8PCAiIFE6IiA8PCBnZXRTdHJXZWlnaHQoKTsKKwl9CisJb3V0IDw8ICIgIiA8PCByZWZFeGVjdXRpb25EYXRhKCkuc3RyU3RhdGVDb25mKCkgPDwgRU9MOworCisJaWYoIGhhc1J1bm5hYmxlRWxlbWVudFRyYWNlKCkgKQorCXsKKwkJZ2V0UnVubmFibGVFbGVtZW50VHJhY2UoKS50b1N0cmVhbShvdXQgPDwgVEFCIDw8ICJFWEUgICA6ICIpOworCX0KKwlpZiggaGFzSU9FbGVtZW50VHJhY2UoKSApCisJeworCQlnZXRJT0VsZW1lbnRUcmFjZSgpLnRvU3RyZWFtKG91dCA8PCBUQUIgPDwgIlRSQUNFIDogIik7CisJfQorfQorCisKK3ZvaWQgRXhlY3V0aW9uQ29udGV4dDo6dHJhY2VNaW5pbXVtKE91dFN0cmVhbSAmIG91dCwKKwkJTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGxpc3RvZkVDLCBjb25zdCBzdGQ6OnN0cmluZyAmIGhlYWRlcikKK3sKKwlvdXQgPDwgVEFCIDw8IGhlYWRlciA8PCAiIHsiIDw8IEVPTF9JTkNSX0lOREVOVDsKKwlMaXN0T2ZFeGVjdXRpb25Db250ZXh0Ojpjb25zdF9pdGVyYXRvciBpdEVDID0gbGlzdG9mRUMuYmVnaW4oKTsKKwlMaXN0T2ZFeGVjdXRpb25Db250ZXh0Ojpjb25zdF9pdGVyYXRvciBlbmRFQyA9IGxpc3RvZkVDLmVuZCgpOworCWZvciggOyBpdEVDICE9IGVuZEVDIDsgKytpdEVDICkKKwl7CisJCSgqaXRFQyktPnRyYWNlTWluaW11bShvdXQpOworCX0KKworCW91dCA8PCBERUNSX0lOREVOVF9UQUIgPDwgIn0iIDw8IEVPTF9GTFVTSDsKK30KKwordm9pZCBFeGVjdXRpb25Db250ZXh0Ojp0cmFjZU1pbmltdW0oT3V0U3RyZWFtICYgb3V0LAorCQlWZWN0b3JPZkV4ZWN1dGlvbkNvbnRleHQgJiBsaXN0b2ZFQywgY29uc3Qgc3RkOjpzdHJpbmcgJiBoZWFkZXIpCit7CisJb3V0IDw8IFRBQiA8PCBoZWFkZXIgPDwgIiB7IiA8PCBFT0xfSU5DUl9JTkRFTlQ7CisJVmVjdG9yT2ZFeGVjdXRpb25Db250ZXh0Ojpjb25zdF9pdGVyYXRvciBpdEVDID0gbGlzdG9mRUMuYmVnaW4oKTsKKwlWZWN0b3JPZkV4ZWN1dGlvbkNvbnRleHQ6OmNvbnN0X2l0ZXJhdG9yIGVuZEVDID0gbGlzdG9mRUMuZW5kKCk7CisJZm9yKCA7IGl0RUMgIT0gZW5kRUMgOyArK2l0RUMgKQorCXsKKwkJKCppdEVDKS0+dHJhY2VNaW5pbXVtKG91dCk7CisJfQorCisJb3V0IDw8IERFQ1JfSU5ERU5UX1RBQiA8PCAifSIgPDwgRU9MX0ZMVVNIOworfQorCisKK3ZvaWQgRXhlY3V0aW9uQ29udGV4dDo6dHJhY2VEZWZhdWx0KE91dFN0cmVhbSAmIG91dCwKKwkJTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGxpc3RvZkVDLCBjb25zdCBzdGQ6OnN0cmluZyAmIGhlYWRlcikKK3sKKwlvdXQgPDwgVEFCIDw8IGhlYWRlciA8PCAiIHsiIDw8IEVPTF9JTkNSX0lOREVOVDsKKwlMaXN0T2ZFeGVjdXRpb25Db250ZXh0Ojpjb25zdF9pdGVyYXRvciBpdEVDID0gbGlzdG9mRUMuYmVnaW4oKTsKKwlMaXN0T2ZFeGVjdXRpb25Db250ZXh0Ojpjb25zdF9pdGVyYXRvciBlbmRFQyA9IGxpc3RvZkVDLmVuZCgpOworCWZvciggOyBpdEVDICE9IGVuZEVDIDsgKytpdEVDICkKKwl7CisJCSgqaXRFQyktPnRyYWNlRGVmYXVsdChvdXQpOworCX0KKworCW91dCA8PCBERUNSX0lOREVOVF9UQUIgPDwgIn0iIDw8IEVPTF9GTFVTSDsKK30KKwordm9pZCBFeGVjdXRpb25Db250ZXh0Ojp0cmFjZURlZmF1bHQoT3V0U3RyZWFtICYgb3V0LAorCQlWZWN0b3JPZkV4ZWN1dGlvbkNvbnRleHQgJiBsaXN0b2ZFQywgY29uc3Qgc3RkOjpzdHJpbmcgJiBoZWFkZXIpCit7CisJb3V0IDw8IFRBQiA8PCBoZWFkZXIgPDwgIiB7IiA8PCBFT0xfSU5DUl9JTkRFTlQ7CisJVmVjdG9yT2ZFeGVjdXRpb25Db250ZXh0Ojpjb25zdF9pdGVyYXRvciBpdEVDID0gbGlzdG9mRUMuYmVnaW4oKTsKKwlWZWN0b3JPZkV4ZWN1dGlvbkNvbnRleHQ6OmNvbnN0X2l0ZXJhdG9yIGVuZEVDID0gbGlzdG9mRUMuZW5kKCk7CisJZm9yKCA7IGl0RUMgIT0gZW5kRUMgOyArK2l0RUMgKQorCXsKKwkJKCppdEVDKS0+dHJhY2VEZWZhdWx0KG91dCk7CisJfQorCisJb3V0IDw8IERFQ1JfSU5ERU5UX1RBQiA8PCAifSIgPDwgRU9MX0ZMVVNIOworfQorCisKK3ZvaWQgRXhlY3V0aW9uQ29udGV4dDo6ZGVidWdEZWZhdWx0KE91dFN0cmVhbSAmIG91dCwKKwkJTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGxpc3RvZkVDLCBjb25zdCBzdGQ6OnN0cmluZyAmIGhlYWRlcikKK3sKKwlvdXQgPDwgVEFCIDw8IGhlYWRlciA8PCAiIHsiIDw8IEVPTF9JTkNSX0lOREVOVDsKKwlMaXN0T2ZFeGVjdXRpb25Db250ZXh0Ojpjb25zdF9pdGVyYXRvciBpdEVDID0gbGlzdG9mRUMuYmVnaW4oKTsKKwlMaXN0T2ZFeGVjdXRpb25Db250ZXh0Ojpjb25zdF9pdGVyYXRvciBlbmRFQyA9IGxpc3RvZkVDLmVuZCgpOworCWZvciggOyBpdEVDICE9IGVuZEVDIDsgKytpdEVDICkKKwl7CisJCSgqaXRFQyktPmRlYnVnRGVmYXVsdChvdXQpOworCX0KKworCW91dCA8PCBERUNSX0lOREVOVF9UQUIgPDwgIn0iIDw8IEVPTF9GTFVTSDsKK30KKwordm9pZCBFeGVjdXRpb25Db250ZXh0OjpkZWJ1Z0RlZmF1bHQoT3V0U3RyZWFtICYgb3V0LAorCQlWZWN0b3JPZkV4ZWN1dGlvbkNvbnRleHQgJiBsaXN0b2ZFQywgY29uc3Qgc3RkOjpzdHJpbmcgJiBoZWFkZXIpCit7CisJb3V0IDw8IFRBQiA8PCBoZWFkZXIgPDwgIiB7IiA8PCBFT0xfSU5DUl9JTkRFTlQ7CisJVmVjdG9yT2ZFeGVjdXRpb25Db250ZXh0Ojpjb25zdF9pdGVyYXRvciBpdEVDID0gbGlzdG9mRUMuYmVnaW4oKTsKKwlWZWN0b3JPZkV4ZWN1dGlvbkNvbnRleHQ6OmNvbnN0X2l0ZXJhdG9yIGVuZEVDID0gbGlzdG9mRUMuZW5kKCk7CisJZm9yKCA7IGl0RUMgIT0gZW5kRUMgOyArK2l0RUMgKQorCXsKKwkJKCppdEVDKS0+ZGVidWdEZWZhdWx0KG91dCk7CisJfQorCisJb3V0IDw8IERFQ1JfSU5ERU5UX1RBQiA8PCAifSIgPDwgRU9MX0ZMVVNIOworfQorCisKKy8qKgorICogT0sKKyAqLwordm9pZCBFeGVjdXRpb25Db250ZXh0Ojp3cml0ZVRyYWNlQWZ0ZXJFeGVjKE91dFN0cmVhbSAmIG91dCkgY29uc3QKK3sKKwlhdm1fc2l6ZV90IGNvdW50ID0gMTsKKwljaGlsZF9pdGVyYXRvciBpdCA9IGJlZ2luKCk7CisJY2hpbGRfaXRlcmF0b3IgZW5kSXQgPSBlbmQoKTsKKwlmb3IoIDsgKGl0ICE9IGVuZEl0KSAmJiAoY291bnQgPCBFWEVDVVRJT05fQ09OVEVYVF9DSElMRF9UUkFDRV9NQVgpOworCQkJKytpdCAsICsrY291bnQgKQorCXsKKwkJb3V0IDw8IFRBQiA8PCAiPT0+RVs/XSAiIDw8ICgqaXQpLT5zdHJfbWluKCkgPDwgInw9PiBmaXJlZCAiOworCisJCWlmKCAoKml0KS0+aGFzUnVubmFibGVFbGVtZW50VHJhY2UoKSApCisJCXsKKwkJCW91dCA8PCAoKml0KS0+Z2V0UnVubmFibGVFbGVtZW50VHJhY2UoKS5zdHIoKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW91dCA8PCAibWFjaGluZSNtYWluICIgPDwgcmVmRXhlY3V0aW9uRGF0YSgpLmdldFN5c3RlbVJJRCgpLnN0cigpOworCQl9CisKKwkJb3V0IDw8IEVPTDsKKwl9CisKKwlpZiggaXQgIT0gZW5kSXQgKQorCXsKKwkJb3V0IDw8IFRBQiA8PCAiPT0+RVs/XSAiIDw8IG1DaGlsZENvbnRleHRzLmxhc3QoKS0+c3RyX21pbigpCisJCQk8PCAifD0+IGZpcmVkICI7CisKKwkJaWYoIG1DaGlsZENvbnRleHRzLmxhc3QoKS0+aGFzUnVubmFibGVFbGVtZW50VHJhY2UoKSApCisJCXsKKwkJCW91dCA8PCBtQ2hpbGRDb250ZXh0cy5sYXN0KCktPmdldFJ1bm5hYmxlRWxlbWVudFRyYWNlKCkuc3RyKCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlvdXQgPDwgIm1hY2hpbmUjbWFpbiAiIDw8IHJlZkV4ZWN1dGlvbkRhdGEoKS5nZXRTeXN0ZW1SSUQoKS5zdHIoKTsKKwkJfQorCisJCW91dCA8PCBFT0w7CisJfQorCisJaWYoIGNvdW50ID09IEVYRUNVVElPTl9DT05URVhUX0NISUxEX1RSQUNFX01BWCApCisJeworCQlvdXQgPDwgUkVQRUFUKCItLS0tLS0tLSIsIDEwKSA8PCBFT0wKKwkJCTw8ICI8PCBQUklOVCAiIDw8IEVYRUNVVElPTl9DT05URVhUX0NISUxEX1RSQUNFX01BWCA8PCAiIE9GICIKKwkJCTw8IHNpemUoKSA8PCAiIEVYRUNVVElPTiBDT05URVhUIFJFU1VMVCA+PiAiIDw8IEVPTDsKKworCQlpZiggRVhFQ1VUSU9OX0NPTlRFWFRfQ0hJTERfVFJBQ0VfTUFYID09IEVDX0NISUxEX1RSQUNFX0RFRkFVTFRfU0laRSApCisJCXsKKwkJCW91dCA8PCBSRVBFQVQoIi0tLS0tLS0tIiwgMTApIDw8IEVPTAorCQkJCTw8ICI9PT4gWW91IGNvdWxkIGZpeCB0aGF0IGxpbWl0IHVzaW5nIHRoZSBpbnRlZ2VyIGF0dHJpYnV0ZSIKKwkJCQkiIDw8IEBlY19zaXplID0gPGludGVnZXI+OyA+PiBpbiB0aGUgc2VjdGlvbiBUUkFDRSAiIDw8IEVPTDsKKwkJfQorCX0KKworCW91dCA8PCBSRVBFQVQoIi0tLS0tLS0tIiwgMTApIDw8IEVPTF9GTFVTSDsKK30KKworCit2b2lkIEV4ZWN1dGlvbkNvbnRleHQ6OnRyYWNlRGVmYXVsdFBvc3RFdmFsKE91dFN0cmVhbSAmIG91dCkgY29uc3QKK3sKKwlhdm1fc2l6ZV90IGNvdW50ID0gMTsKKworCWNoaWxkX2l0ZXJhdG9yIGl0ID0gYmVnaW4oKTsKKwljaGlsZF9pdGVyYXRvciBlbmRJdCA9IGVuZCgpOworCWZvciggOyAoaXQgIT0gZW5kSXQpICYmCisJCQkoY291bnQgPCBFeGVjdXRpb25Db250ZXh0OjpFWEVDVVRJT05fQ09OVEVYVF9DSElMRF9UUkFDRV9NQVgpOworCQkJKytpdCAsICsrY291bnQgKQorCXsKKwkJb3V0IDw8IFRBQiA8PCAiPT0+IGN0eDoiIDw8ICgqaXQpLT5nZXRJZE51bWJlcigpOworCQlpZiggKCppdCktPmdldFdlaWdodCgpICE9IDAgKQorCQl7CisJCQlvdXQgPDwgIiBROiIgPDwgKCppdCktPmdldFN0cldlaWdodCgpOworCQl9CisJCW91dCA8PCAiICIgPDwgKCppdCktPnJlZkV4ZWN1dGlvbkRhdGEoKS5zdHJTdGF0ZUNvbmYoKTsKKworCQlvdXQgPDwgRU9MX1RBQiA8PCAifD0+IGZpcmVkICI7CisKKwkJaWYoICgqaXQpLT5oYXNSdW5uYWJsZUVsZW1lbnRUcmFjZSgpICkKKwkJeworCQkJb3V0IDw8ICgqaXQpLT5nZXRSdW5uYWJsZUVsZW1lbnRUcmFjZSgpLnN0cigpOworCQl9CisJCWVsc2UKKwkJeworCQkJb3V0IDw8ICJub3RoaW5nIGluICIgPDwgcmVmRXhlY3V0aW9uRGF0YSgpLmdldFN5c3RlbVJJRCgpLnN0cigpOworCQl9CisKKwkJb3V0IDw8IEVPTDsKKwl9CisKKwlpZiggaXQgIT0gZW5kSXQgKQorCXsKKwkJb3V0IDw8IFRBQiA8PCAiPT0+IGN0eDoiIDw8IG1DaGlsZENvbnRleHRzLmxhc3QoKS0+Z2V0SWROdW1iZXIoKTsKKwkJaWYoIG1DaGlsZENvbnRleHRzLmxhc3QoKS0+Z2V0V2VpZ2h0KCkgIT0gMCApCisJCXsKKwkJCW91dCA8PCAiIFE6IiA8PCBtQ2hpbGRDb250ZXh0cy5sYXN0KCktPmdldFN0cldlaWdodCgpOworCQl9CisJCW91dCA8PCAiICIgPDwgbUNoaWxkQ29udGV4dHMubGFzdCgpLT5yZWZFeGVjdXRpb25EYXRhKCkuc3RyU3RhdGVDb25mKCk7CisKKwkJb3V0IDw8IEVPTF9UQUIgPDwgInw9PiBmaXJlZCAiOworCisJCWlmKCBtQ2hpbGRDb250ZXh0cy5sYXN0KCktPmhhc1J1bm5hYmxlRWxlbWVudFRyYWNlKCkgKQorCQl7CisJCQlvdXQgPDwgbUNoaWxkQ29udGV4dHMubGFzdCgpLT5nZXRSdW5uYWJsZUVsZW1lbnRUcmFjZSgpLnN0cigpOworCQl9CisJCWVsc2UKKwkJeworCQkJb3V0IDw8ICJub3RoaW5nIGluICIgPDwgcmVmRXhlY3V0aW9uRGF0YSgpLmdldFN5c3RlbVJJRCgpLnN0cigpOworCQl9CisKKwkJb3V0IDw8IEVPTDsKKwl9CisKKwlpZiggY291bnQgPT0gRVhFQ1VUSU9OX0NPTlRFWFRfQ0hJTERfVFJBQ0VfTUFYICkKKwl7CisJCW91dCA8PCBSRVBFQVQoIi0tLS0tLS0tIiwgMTApIDw8IEVPTAorCQkJPDwgIjw8IFBSSU5UICIgPDwgRVhFQ1VUSU9OX0NPTlRFWFRfQ0hJTERfVFJBQ0VfTUFYIDw8ICIgT0YgIgorCQkJPDwgc2l6ZSgpIDw8ICIgRVhFQ1VUSU9OIENPTlRFWFQgUkVTVUxUID4+ICIgPDwgRU9MOworCisJCWlmKCBFWEVDVVRJT05fQ09OVEVYVF9DSElMRF9UUkFDRV9NQVggPT0gRUNfQ0hJTERfVFJBQ0VfREVGQVVMVF9TSVpFICkKKwkJeworCQkJb3V0IDw8IFJFUEVBVCgiLS0tLS0tLS0iLCAxMCkgPDwgRU9MCisJCQkJPDwgIj09PiBZb3UgY291bGQgZml4IHRoYXQgbGltaXQgdXNpbmcgdGhlIGludGVnZXIgYXR0cmlidXRlIgorCQkJCSIgPDwgQGVjX3NpemUgPSA8aW50ZWdlcj47ID4+IGluIHRoZSBzZWN0aW9uIFRSQUNFICIgPDwgRU9MOworCQl9CisJfQorCisJb3V0IDw8IFJFUEVBVCgiLS0tLS0tLS0iLCAxMCkgPDwgRU9MX0ZMVVNIOworfQorCisKKy8qKgorICogT0sKKyAqLwordm9pZCBFeGVjdXRpb25Db250ZXh0Ojp3cml0ZVRyYWNlQmVmb3JlRXhlYyhPdXRTdHJlYW0gJiBvdXQpIGNvbnN0Cit7CitBVk1fVkVSQk9TSVRZX1NXSVRDSF9TSUxFTlQKKworCW91dCA8PCBUQUIgPDwgInN0ZXBbIiA8PCBzdGQ6OnNldHcoNCkgPDwgZ2V0RXZhbE51bWJlcigpIDw8ICJdICAiCisJCTw8ICJjb250ZXh0WyIgPDwgc3RkOjpzZXR3KDYpIDw8IGdldElkTnVtYmVyKCkKKwkJPDwgIiAvICIgPDwgc3RkOjpzZXR3KDYpIDw8IEV4ZWN1dGlvbkNvbnRleHRIZWFkZXI6OklEX05VTUJFUgorCQk8PCAiXSAgICAiIDw8IHN0ZDo6Zmx1c2g7CisKK0FWTV9WRVJCT1NJVFlfU1dJVENIX0NBU0VfTUlOSU1VTQorCisJb3V0IDw8IFRBQiA8PCAic3RlcFsiIDw8IHN0ZDo6c2V0dyg0KSA8PCBnZXRFdmFsTnVtYmVyKCkgPDwgIl0gICIKKwkJPDwgImNvbnRleHRbIiA8PCBzdGQ6OnNldHcoNikgPDwgZ2V0SWROdW1iZXIoKQorCQk8PCAiIC8gIiA8PCBzdGQ6OnNldHcoNikgPDwgRXhlY3V0aW9uQ29udGV4dEhlYWRlcjo6SURfTlVNQkVSCisJCTw8ICJdICAgICIgPDwgc3RkOjpmbHVzaDsKKworQVZNX1ZFUkJPU0lUWV9TV0lUQ0hfQ0FTRV9NRURJVU0KKworCW91dCA8PCBUQUIgPDwgIkVbIiA8PCBzdGQ6OnNldHcoNCkgPDwgZ2V0RXZhbE51bWJlcigpIDw8ICJdICIKKwkJPDwgc3RyX21pbigpIDw8IEVPTF9GTFVTSDsKKworQVZNX1ZFUkJPU0lUWV9TV0lUQ0hfQ0FTRV9NQVhJTVVNCisKKwlvdXQgPDwgVEFCIDw8ICJFWyIgPDwgc3RkOjpzZXR3KDQpIDw8IGdldEV2YWxOdW1iZXIoKSA8PCAiXSAiCisJCTw8IHN0cl9taW4oKSA8PCBFT0xfRkxVU0g7CisKK0FWTV9WRVJCT1NJVFlfU1dJVENIX0VORAorfQorCisKKy8qKgorICogT0sKKyAqLwordm9pZCBFeGVjdXRpb25Db250ZXh0Ojp3cml0ZVRyYWNlRm9yRGVhZGxvY2soT3V0U3RyZWFtICYgb3V0LAorCQlhdm1fdWludDMyX3QgbkRlYWRsb2NrQ291bnRlcikgY29uc3QKK3sKKwlvdXQgPDwgVEFCIDw8ICIgPT0+IERFQURMT0NLIDogIiA8PCBuRGVhZGxvY2tDb3VudGVyIDw8ICI8PT0iCisJCTw8IFRBQiA8PCAiIDw8IE5PIEZJUkVBQkxFIFRSQU5TSVRJT05TIEZPVU5EID4+IiA8PCBFT0wKKwkJPDwgVEFCIDw8IFJFUEVBVCgiLS0tLS0tLSIsIDYpIDw8IEVPTF9GTFVTSDsKK30KKworLyoqCisgKiBPSworICovCit2b2lkIEV4ZWN1dGlvbkNvbnRleHQ6OndyaXRlVHJhY2VGb3JSZWR1bmRhbmN5KE91dFN0cmVhbSAmIG91dCwKKwkJRXhlY3V0aW9uQ29udGV4dCAqIGFSZWR1bmRhbnRFeGVjQ29udGV4dCwKKwkJYXZtX3VpbnQzMl90IG5SZWR1bmRhbmN5Q291bnRlcikgY29uc3QKK3sKKwlvdXQgPDwgVEFCIDw8ICIgPT0+IFJFRFVOREFOQ0UgOiAiIDw8IG5SZWR1bmRhbmN5Q291bnRlciA8PCAiIDw9PSIKKwkJPDwgc3RkOjplbmRsCisJCTw8IFRBQiA8PCAiIEVbIiA8PCBzdGQ6OnNldHcoNCkKKwkJPDwgYVJlZHVuZGFudEV4ZWNDb250ZXh0LT5nZXRFdmFsTnVtYmVyKCkKKwkJPDwgIl0gIiA8PCBhUmVkdW5kYW50RXhlY0NvbnRleHQtPnN0cl9taW4oKQorCQk8PCBzdGQ6OmVuZGwKKwkJPDwgVEFCIDw8IFJFUEVBVCgiLS0tLS0tLSIsIDYpIDw8IEVPTF9GTFVTSDsKK30KKworCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL0V4ZWN1dGlvbkNvbnRleHQuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL0V4ZWN1dGlvbkNvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjk0MGEwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3J1bnRpbWUvRXhlY3V0aW9uQ29udGV4dC5oCkBAIC0wLDAgKzEsMTMxOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBFWEVDVVRJT05DT05URVhUX0hfCisjZGVmaW5lIEVYRUNVVElPTkNPTlRFWFRfSF8KKworI2luY2x1ZGUgPGNvbW1vbi9FbGVtZW50Lmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uQ29udGV4dEZsYWdzLmg+CisKKyNpbmNsdWRlIDxjb2xsZWN0aW9uL0xpc3QuaD4KKyNpbmNsdWRlIDxjb2xsZWN0aW9uL1ZlY3Rvci5oPgorCisjaW5jbHVkZSA8Y29tbW9uL0JGLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29uc3RhbnQuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29uc3RydWN0b3IuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkRhdGEuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25JbmZvcm1hdGlvbi5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworY2xhc3MgQWJzdHJhY3RQcm9jZXNzb3JVbml0OworY2xhc3MgRXhlY3V0aW9uQ29udGV4dDsKK2NsYXNzIFJ1bnRpbWVJRDsKKworCisvKioKKyAqIFRZUEVERUYKKyAqLwordHlwZWRlZiBMaXN0ICA8IEV4ZWN1dGlvbkNvbnRleHQgKiA+ICBMaXN0T2ZFeGVjdXRpb25Db250ZXh0OwordHlwZWRlZiBWZWN0b3I8IEV4ZWN1dGlvbkNvbnRleHQgKiA+ICBWZWN0b3JPZkV4ZWN1dGlvbkNvbnRleHQ7CisKK3R5cGVkZWYgTGlzdCAgPCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICogPiAgTGlzdE9mQ29uc3RFeGVjdXRpb25Db250ZXh0OwordHlwZWRlZiBWZWN0b3I8IGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgKiA+ICBWZWN0b3JPZkNvbnN0RXhlY3V0aW9uQ29udGV4dDsKKworCitjbGFzcyBFeGVjdXRpb25Db250ZXh0SGVhZGVyIDoKKwkJcHVibGljIEVsZW1lbnQgLAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIEV4ZWN1dGlvbkNvbnRleHRIZWFkZXIgKQoreworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIEV4ZWN1dGlvbkNvbnRleHRIZWFkZXIgKQorCisKK3B1YmxpYzoKKyAgIC8qKgorCSogQVRUUklCVVRFUworCSogc3RhdGljCisJKi8KKwlzdGF0aWMgYXZtX3VpbnQzMl90IElEX05VTUJFUjsKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlhdm1fdWludDMyX3QgbUlkTnVtYmVyOworCWF2bV91aW50MzJfdCBtRXZhbE51bWJlcjsKKworCWF2bV91aW50MzJfdCBtSGVpZ2h0OworCWF2bV91aW50MzJfdCBtV2lkdGg7CisKKwlhdm1fdWludDhfdCAgbVdlaWdodDsKKworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlFeGVjdXRpb25Db250ZXh0SGVhZGVyKCkKKwk6IEVsZW1lbnQoIENMQVNTX0tJTkRfVCggRXhlY3V0aW9uQ29udGV4dEhlYWRlciApICksCisJbUlkTnVtYmVyKCBJRF9OVU1CRVIrKyApLAorCW1FdmFsTnVtYmVyKCAwICksCisJbUhlaWdodCggMCApLAorCW1XaWR0aCggMSApLAorCW1XZWlnaHQoIDAgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJRXhlY3V0aW9uQ29udGV4dEhlYWRlcihjb25zdCBFeGVjdXRpb25Db250ZXh0SGVhZGVyICYgYUhlYWRlcikKKwk6IEVsZW1lbnQoIGFIZWFkZXIgKSwKKwltSWROdW1iZXIoIElEX05VTUJFUisrICksCisJbUV2YWxOdW1iZXIoIGFIZWFkZXIubUV2YWxOdW1iZXIgKSwKKwltSGVpZ2h0KCBhSGVhZGVyLm1IZWlnaHQgKSwKKwltV2lkdGgoIGFIZWFkZXIubVdpZHRoICksCisJbVdlaWdodCggMCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogT3RoZXIKKwkgKi8KKwlFeGVjdXRpb25Db250ZXh0SGVhZGVyKGF2bV91aW50MzJfdCBhSGVpZ2h0LCBhdm1fdWludDMyX3QgYVdpZHRoKQorCTogRWxlbWVudCggQ0xBU1NfS0lORF9UKCBFeGVjdXRpb25Db250ZXh0SGVhZGVyICkgKSwKKwltSWROdW1iZXIoIElEX05VTUJFUisrICksCisJbUV2YWxOdW1iZXIoIDAgKSwKKwltSGVpZ2h0KCBhSGVpZ2h0ICksCisJbVdpZHRoKCBhV2lkdGggKSwKKwltV2VpZ2h0KCAwICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkV4ZWN1dGlvbkNvbnRleHRIZWFkZXIoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBJRF9OVU1CRVIKKwkgKi8KKwlpbmxpbmUgc3RhdGljIGF2bV91aW50MzJfdCBnZXRDcmVhdGVDb3VudGVyKCkKKwl7CisJCXJldHVybiggSURfTlVNQkVSICk7CisJfQorCisJaW5saW5lIHN0YXRpYyB2b2lkIHNldENyZWF0ZUNvdW50ZXIoYXZtX3VpbnQzMl90IGFDcmVhdGVDb3VudGVyKQorCXsKKwkJSURfTlVNQkVSID0gYUNyZWF0ZUNvdW50ZXI7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtSWROdW1iZXIKKwkgKi8KKwlpbmxpbmUgYXZtX3VpbnQzMl90IGdldElkTnVtYmVyKCkgY29uc3QKKwl7CisJCXJldHVybiggbUlkTnVtYmVyICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0SWROdW1iZXIoYXZtX3VpbnQzMl90IGFuSWROdW1iZXIpCisJeworCQltSWROdW1iZXIgPSBhbklkTnVtYmVyOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICoKKwkgKi8KKwlpbmxpbmUgYXZtX3VpbnQzMl90IGdldEV2YWxOdW1iZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRXZhbE51bWJlciApOworCX0KKworCWlubGluZSB2b2lkIHNldEV2YWxOdW1iZXIoYXZtX3VpbnQzMl90IGFuRXZhbE51bWJlcikKKwl7CisJCW1FdmFsTnVtYmVyID0gYW5FdmFsTnVtYmVyOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUhlaWdodAorCSAqLworCWlubGluZSBhdm1fdWludDMyX3QgZ2V0SGVpZ2h0KCkgY29uc3QKKwl7CisJCXJldHVybiggbUhlaWdodCApOworCX0KKworCWlubGluZSB2b2lkIHNldEhlaWdodChhdm1fdWludDMyX3QgYUhlaWdodCkKKwl7CisJCW1IZWlnaHQgPSBhSGVpZ2h0OworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVdpZHRoCisJICovCisJaW5saW5lIGF2bV91aW50MzJfdCBnZXRXaWR0aCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1XaWR0aCApOworCX0KKworCWlubGluZSB2b2lkIHNldFdpZHRoKGF2bV91aW50MzJfdCBhV2lkdGgpCisJeworCQltV2lkdGggPSBhV2lkdGg7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtV2VpZ2h0CisJICovCisJaW5saW5lIGF2bV91aW50OF90IGdldFdlaWdodCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1XZWlnaHQgKTsKKwl9CisKKwlpbmxpbmUgYXZtX3VpbnQzMl90IGdldFN0cldlaWdodCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1XZWlnaHQgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIGF2bV91aW50OF90IGdldFdlaWdodE1heCgpCisJeworCQlyZXR1cm4oIEFWTV9OVU1FUklDX01BWF9VSU5UOCApOworCX0KKworCWlubGluZSBib29sIGlzV2VpZ2h0TWF4KCkgY29uc3QKKwl7CisJCXJldHVybiggbVdlaWdodCA9PSBBVk1fTlVNRVJJQ19NQVhfVUlOVDggKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc1dlaWdodChhdm1fdWludDhfdCBhV2VpZ2h0KSBjb25zdAorCXsKKwkJcmV0dXJuKCBtV2VpZ2h0ID09IGFXZWlnaHQgKTsKKwl9CisKKworCWlubGluZSB2b2lkIHNldFdlaWdodChhdm1fdWludDhfdCBhV2VpZ2h0KQorCXsKKwkJbVdlaWdodCA9IGFXZWlnaHQ7CisJfQorCisKKwlpbmxpbmUgdm9pZCBzZXRXZWlnaHRNYXgoKQorCXsKKwkJbVdlaWdodCA9IEFWTV9OVU1FUklDX01BWF9VSU5UODsKKwl9CisKKworCWlubGluZSB2b2lkIGRlY3JXZWlnaHQoYXZtX3VpbnQ4X3QgYVdlaWdodCA9IDEpCisJeworCQlpZiggbVdlaWdodCAhPSBBVk1fTlVNRVJJQ19NQVhfVUlOVDggKQorCQl7CisJCQltV2VpZ2h0IC09IGFXZWlnaHQ7CisJCX0KKwl9CisKKwlpbmxpbmUgdm9pZCBpbmNyV2VpZ2h0KGF2bV91aW50OF90IGFXZWlnaHQgPSAxKQorCXsKKwkJaWYoIG1XZWlnaHQgIT0gQVZNX05VTUVSSUNfTUFYX1VJTlQ4ICkKKwkJeworCQkJbVdlaWdodCArPSBhV2VpZ2h0OworCQl9CisJfQorCisKKwkvKioKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogU0VSSUFMSVpBVElPTgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKi8KKworCWlubGluZSB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHN0cigpIGNvbnN0CisJeworCQlTdHJpbmdPdXRTdHJlYW0gb3NzOworCisJCW9zcyA8PCAgICJJZDoiIDw8IGdldElkTnVtYmVyKCkJPDwgIiwgRXY6IiA8PCBnZXRFdmFsTnVtYmVyKCkKKwkJCTw8ICAiLCBIOiIgPDwgZ2V0SGVpZ2h0KCkJPDwgICIsIFc6IiA8PCBnZXRXaWR0aCgpOworCQlpZiggZ2V0V2VpZ2h0KCkgPiAwICkKKwkJeworCQkJb3NzIDw8ICIsIFE6IiA8PCBnZXRTdHJXZWlnaHQoKTsKKwkJfQorCisJCXJldHVybiggb3NzLnN0cigpICk7CisJfQorCisJdmlydHVhbCB2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG91dCkgY29uc3QKKwl7CisJCW91dCA8PCBUQUIKKwkJCTw8ICAgICJJZDoiIDw8IGdldElkTnVtYmVyKCkgPDwgIiAsIEV2OiIgPDwgZ2V0RXZhbE51bWJlcigpCisJCQk8PCAgIiAsIEg6IiA8PCBnZXRIZWlnaHQoKSAgIDw8ICAiICwgVzoiIDw8IGdldFdpZHRoKCkKKwkJCTw8ICAiICwgUToiIDw8IGdldFN0cldlaWdodCgpCisJCQk8PCBFT0xfRkxVU0g7CisJfQorCit9OworCisKKworY2xhc3MgRXhlY3V0aW9uQ29udGV4dCA6IHB1YmxpYyBFbGVtZW50ICwKKwkJcHVibGljIEV4ZWN1dGlvbkNvbnRleHRGbGFnc0ltcGwgLAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIEV4ZWN1dGlvbkNvbnRleHQgKQoreworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIEV4ZWN1dGlvbkNvbnRleHQgKQorCitwdWJsaWM6CisJLyoqCisJICogVFJBQ0UgQ09OU1RBTlQKKwkgKi8KKwlzdGF0aWMgYXZtX3NpemVfdCBFQ19DSElMRF9UUkFDRV9ERUZBVUxUX1NJWkU7CisKKwlzdGF0aWMgYXZtX3NpemVfdCBFWEVDVVRJT05fQ09OVEVYVF9DSElMRF9UUkFDRV9NQVg7CisKKwkvKgorCSAqIERFRkFVTFQgTlVMTCBSRUZFUkVOQ0UKKwkgKi8KKwlzdGF0aWMgRXhlY3V0aW9uQ29udGV4dCBfTlVMTF87CisKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIFRZUEVERUYKKwkgKi8KKwl0eXBlZGVmIEFQTGlzdCA8IEV4ZWN1dGlvbkNvbnRleHQgKiA+ICBBUExpc3RPZkV4ZWN1dGlvbkNvbnRleHQ7CisKK3B1YmxpYzoKKwl0eXBlZGVmIEFQTGlzdE9mRXhlY3V0aW9uQ29udGV4dDo6aXRlcmF0b3IgICAgICAgIHJ3X2NoaWxkX2l0ZXJhdG9yOworCisJdHlwZWRlZiBBUExpc3RPZkV4ZWN1dGlvbkNvbnRleHQ6OmNvbnN0X2l0ZXJhdG9yICBjaGlsZF9pdGVyYXRvcjsKKworCisgICAvKioKKwkqIEFUVFJJQlVURVMKKwkqLworCUV4ZWN1dGlvbkNvbnRleHQgKiBtQ29udGFpbmVyOworCUFQTGlzdE9mRXhlY3V0aW9uQ29udGV4dCBtQ2hpbGRDb250ZXh0czsKKworCUJGIG1IZWFkZXI7CisKKwlBUEV4ZWN1dGlvbkRhdGEgbUV4ZWN1dGlvbkRhdGE7CisKKwlCRiBtTm9kZUNvbmRpdGlvbjsKKwlCRiBtTm9kZVRpbWVkQ29uZGl0aW9uOworCisJQkYgbVJ1bm5hYmxlRWxlbWVudFRyYWNlOworCUJGIG1JT0VsZW1lbnRUcmFjZTsKKworCVRhYmxlT2ZSdW50aW1lRm9ybVN0YXRlOjpUYWJsZU9mQXNzaWduZWRGbGFnIG1UYWJsZU9mQXNzaWduZWRGbGFnOworCisJQkYgbUluZm9ybWF0aW9uOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlFeGVjdXRpb25Db250ZXh0KCkKKwk6IEVsZW1lbnQoIENMQVNTX0tJTkRfVCggRXhlY3V0aW9uQ29udGV4dCApICksCisJbUNvbnRhaW5lciggTlVMTCApLAorCW1DaGlsZENvbnRleHRzKCApLAorCW1IZWFkZXIoKSwKKwltRXhlY3V0aW9uRGF0YSggKSwKKwltTm9kZUNvbmRpdGlvbiggKSwKKwltTm9kZVRpbWVkQ29uZGl0aW9uKCApLAorCW1SdW5uYWJsZUVsZW1lbnRUcmFjZSggKSwKKwltSU9FbGVtZW50VHJhY2UoICksCisJbVRhYmxlT2ZBc3NpZ25lZEZsYWcoIE5VTEwgKSwKKwltSW5mb3JtYXRpb24oICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCUV4ZWN1dGlvbkNvbnRleHQoY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFDb250ZXh0KQorCTogRWxlbWVudCggYUNvbnRleHQgKSwKKwltQ29udGFpbmVyKCBhQ29udGV4dC5tQ29udGFpbmVyICksCisJbUNoaWxkQ29udGV4dHMoIGFDb250ZXh0Lm1DaGlsZENvbnRleHRzICksCisKKwltSGVhZGVyKCBhQ29udGV4dC5tSGVhZGVyICksCisJbUV4ZWN1dGlvbkRhdGEoIGFDb250ZXh0Lm1FeGVjdXRpb25EYXRhICksCisJbU5vZGVDb25kaXRpb24oIGFDb250ZXh0Lm1Ob2RlQ29uZGl0aW9uICksCisJbU5vZGVUaW1lZENvbmRpdGlvbiggYUNvbnRleHQubU5vZGVUaW1lZENvbmRpdGlvbiApLAorCW1SdW5uYWJsZUVsZW1lbnRUcmFjZSggYUNvbnRleHQubVJ1bm5hYmxlRWxlbWVudFRyYWNlICksCisJbUlPRWxlbWVudFRyYWNlKCBhQ29udGV4dC5tSU9FbGVtZW50VHJhY2UgKSwKKwltVGFibGVPZkFzc2lnbmVkRmxhZyggYUNvbnRleHQubVRhYmxlT2ZBc3NpZ25lZEZsYWcgKSwKKwltSW5mb3JtYXRpb24oIGFDb250ZXh0Lm1JbmZvcm1hdGlvbiApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogT3RoZXJzCisJICovCisJRXhlY3V0aW9uQ29udGV4dChBUEV4ZWN1dGlvbkRhdGEgJiBhbkV4ZWN1dGlvbkRhdGEsCisJCQlhdm1fdWludDMyX3QgYUhlaWdodCwgYXZtX3VpbnQzMl90IGFXaWR0aCkKKwk6IEVsZW1lbnQoIENMQVNTX0tJTkRfVCggRXhlY3V0aW9uQ29udGV4dCApICksCisJbUNvbnRhaW5lciggTlVMTCApLAorCW1DaGlsZENvbnRleHRzKCApLAorCisJbUhlYWRlciggbmV3IEV4ZWN1dGlvbkNvbnRleHRIZWFkZXIoYUhlaWdodCAsIGFXaWR0aCkgKSwKKwltRXhlY3V0aW9uRGF0YSggYW5FeGVjdXRpb25EYXRhICksCisJbU5vZGVDb25kaXRpb24oIGFuRXhlY3V0aW9uRGF0YS0+Z2V0Tm9kZUNvbmRpdGlvbigpICksCisJbU5vZGVUaW1lZENvbmRpdGlvbiggYW5FeGVjdXRpb25EYXRhLT5nZXROb2RlVGltZWRDb25kaXRpb24oKSApLAorCW1SdW5uYWJsZUVsZW1lbnRUcmFjZSggYW5FeGVjdXRpb25EYXRhLT5nZXRSdW5uYWJsZUVsZW1lbnRUcmFjZSgpICksCisJbUlPRWxlbWVudFRyYWNlKCBhbkV4ZWN1dGlvbkRhdGEtPmdldElPRWxlbWVudFRyYWNlKCkgKSwKKwltVGFibGVPZkFzc2lnbmVkRmxhZyggYW5FeGVjdXRpb25EYXRhLT5nZXRUYWJsZU9mQXNzaWduZWRGbGFnKCkgKSwKKwltSW5mb3JtYXRpb24oICkKKwl7CisJCWFuRXhlY3V0aW9uRGF0YS0+c2V0RXhlY3V0aW9uQ29udGV4dCggdGhpcyApOworCX0KKworCUV4ZWN1dGlvbkNvbnRleHQoY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFDb250YWluZXIsCisJCQlBUEV4ZWN1dGlvbkRhdGEgJiBhbkV4ZWN1dGlvbkRhdGEsCisJCQlhdm1fdWludDMyX3QgYUhlaWdodCwgYXZtX3VpbnQzMl90IGFXaWR0aCkKKwk6IEVsZW1lbnQoIENMQVNTX0tJTkRfVCggRXhlY3V0aW9uQ29udGV4dCApICksCisJbUNvbnRhaW5lciggY29uc3RfY2FzdDwgRXhlY3V0aW9uQ29udGV4dCAqID4oJiBhQ29udGFpbmVyKSApLAorCW1DaGlsZENvbnRleHRzKCApLAorCisJbUhlYWRlciggbmV3IEV4ZWN1dGlvbkNvbnRleHRIZWFkZXIoYUhlaWdodCAsIGFXaWR0aCkgKSwKKwltRXhlY3V0aW9uRGF0YSggYW5FeGVjdXRpb25EYXRhICksCisJbU5vZGVDb25kaXRpb24oIGFuRXhlY3V0aW9uRGF0YS0+Z2V0Tm9kZUNvbmRpdGlvbigpICksCisJbU5vZGVUaW1lZENvbmRpdGlvbiggYW5FeGVjdXRpb25EYXRhLT5nZXROb2RlVGltZWRDb25kaXRpb24oKSApLAorCW1SdW5uYWJsZUVsZW1lbnRUcmFjZSggYW5FeGVjdXRpb25EYXRhLT5nZXRSdW5uYWJsZUVsZW1lbnRUcmFjZSgpICksCisJbUlPRWxlbWVudFRyYWNlKCBhbkV4ZWN1dGlvbkRhdGEtPmdldElPRWxlbWVudFRyYWNlKCkgKSwKKwltVGFibGVPZkFzc2lnbmVkRmxhZyggYW5FeGVjdXRpb25EYXRhLT5nZXRUYWJsZU9mQXNzaWduZWRGbGFnKCkgKSwKKwltSW5mb3JtYXRpb24oICkKKwl7CisJCWFuRXhlY3V0aW9uRGF0YS0+c2V0RXhlY3V0aW9uQ29udGV4dCggdGhpcyApOworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkV4ZWN1dGlvbkNvbnRleHQoKQorCXsKKwkJaWYoIGhhc0NvbnRhaW5lcigpICkKKwkJeworCQkJLy9nZXRDb250YWluZXIoKS0+cmVtb3ZlKHRoaXMpOworCQl9CisJfQorCisJaW5saW5lIHZvaWQgZGVzdHJveSgpCisJeworCQltQ2hpbGRDb250ZXh0cy5jbGVhcigpOworCisJCW1IZWFkZXIuZGVzdHJveSgpOworCisJCW1FeGVjdXRpb25EYXRhLmRlc3Ryb3koKTsKKworCQltTm9kZUNvbmRpdGlvbi5kZXN0cm95KCk7CisJCW1Ob2RlVGltZWRDb25kaXRpb24uZGVzdHJveSgpOworCisJCW1SdW5uYWJsZUVsZW1lbnRUcmFjZS5kZXN0cm95KCk7CisJCW1JT0VsZW1lbnRUcmFjZS5kZXN0cm95KCk7CisKKwkJbUluZm9ybWF0aW9uLmRlc3Ryb3koKTsKKwl9CisKKwkvKioKKwkgKiBfTlVMTF8KKwkgKi8KKwlpbmxpbmUgYm9vbCBpc051bGwoKSBjb25zdAorCXsKKwkJcmV0dXJuKCB0aGlzID09ICgmIEV4ZWN1dGlvbkNvbnRleHQ6Ol9OVUxMXykgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc25vdE51bGwoKSBjb25zdAorCXsKKwkJcmV0dXJuKCB0aGlzICE9ICgmIEV4ZWN1dGlvbkNvbnRleHQ6Ol9OVUxMXykgKTsKKwl9CisKKwkvKioKKwkgKiBjYXN0IHRvIHJlZmVyZW5jZQorCSAqLworCWlubGluZSBzdGF0aWMgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIFJFRihjb25zdCBFeGVjdXRpb25Db250ZXh0ICogYW5FQykKKwl7CisJCXJldHVybiggKCBhbkVDICE9IE5VTEwgKSA/ICAoKiBhbkVDKSA6IEV4ZWN1dGlvbkNvbnRleHQ6Ol9OVUxMXyApOworCX0KKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1Db250YWluZXIKKwkgKi8KKwlpbmxpbmUgRXhlY3V0aW9uQ29udGV4dCAqIGdldENvbnRhaW5lcigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Db250YWluZXIgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIHJlZkNvbnRhaW5lcigpIGNvbnN0CisJeworCQlyZXR1cm4oICogbUNvbnRhaW5lciApOworCX0KKworCisJaW5saW5lIGJvb2wgaGFzQ29udGFpbmVyKCkgY29uc3QKKwl7CisJCXJldHVybiggbUNvbnRhaW5lciAhPSBOVUxMICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0Q29udGFpbmVyKEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDKQorCXsKKwkJbUNvbnRhaW5lciA9IGFuRUM7CisJfQorCisKKwkvKioKKwkgKiBDTE9ORQorCSAqLworCWlubGluZSB2aXJ0dWFsIEV4ZWN1dGlvbkNvbnRleHQgKiBjbG9uZURhdGEoKSBjb25zdAorCXsKKwkJRXhlY3V0aW9uQ29udGV4dCAqIG1DbG9uZUVDID0gbmV3IEV4ZWN1dGlvbkNvbnRleHQoICp0aGlzICk7CisJCW1DbG9uZUVDLT5nZXRBUEV4ZWN1dGlvbkRhdGEoKS5tYWtlV3JpdGFibGUoKTsKKworCQlyZXR1cm4oIG1DbG9uZUVDICk7CisJfQorCisKKwkvKioKKwkgKiBJTklUSUFMSVpBVElPTiB3aXRoIEVYRUNVVElPTiBEQVRBIC8gQ09OVEVYVAorCSAqLworCWlubGluZSB2b2lkIGluaXRpYWxpemUoY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuSW5pdGlhbENvbnRleHQpCisJeworCQltQ29udGFpbmVyID0gYW5Jbml0aWFsQ29udGV4dC5tQ29udGFpbmVyOworCQltQ2hpbGRDb250ZXh0cyA9IGFuSW5pdGlhbENvbnRleHQubUNoaWxkQ29udGV4dHM7CisKKwkJbUhlYWRlciA9IGFuSW5pdGlhbENvbnRleHQubUhlYWRlcjsKKwkJbUV4ZWN1dGlvbkRhdGEgPSBhbkluaXRpYWxDb250ZXh0Lm1FeGVjdXRpb25EYXRhOworCisJCW1Ob2RlQ29uZGl0aW9uID0gYW5Jbml0aWFsQ29udGV4dC5tTm9kZUNvbmRpdGlvbjsKKwkJbU5vZGVUaW1lZENvbmRpdGlvbiA9IGFuSW5pdGlhbENvbnRleHQubU5vZGVUaW1lZENvbmRpdGlvbjsKKworCQltUnVubmFibGVFbGVtZW50VHJhY2UgPSBhbkluaXRpYWxDb250ZXh0Lm1SdW5uYWJsZUVsZW1lbnRUcmFjZTsKKwkJbUlPRWxlbWVudFRyYWNlID0gYW5Jbml0aWFsQ29udGV4dC5tSU9FbGVtZW50VHJhY2U7CisKKwkJbVRhYmxlT2ZBc3NpZ25lZEZsYWcgPSBhbkluaXRpYWxDb250ZXh0Lm1UYWJsZU9mQXNzaWduZWRGbGFnOworCisJCW1JbmZvcm1hdGlvbiA9IGFuSW5pdGlhbENvbnRleHQubUluZm9ybWF0aW9uOworCX0KKworCWlubGluZSB2b2lkIGluaXRpYWxpemUoY29uc3QgQVBFeGVjdXRpb25EYXRhICYgYW5Jbml0aWFsRGF0YSwKKwkJCWF2bV91aW50MzJfdCBhSGVpZ2h0ID0gMCwgYXZtX3VpbnQzMl90IGFXaWR0aCA9IDEpCisJeworCQltQ29udGFpbmVyID0gTlVMTDsKKworCQltSGVhZGVyID0gbmV3IEV4ZWN1dGlvbkNvbnRleHRIZWFkZXIoYUhlaWdodCwgYVdpZHRoKTsKKwkJbUV4ZWN1dGlvbkRhdGEgPSBhbkluaXRpYWxEYXRhOworCisJCWlmKCBhbkluaXRpYWxEYXRhLnZhbGlkKCkgKQorCQl7CisJCQltTm9kZUNvbmRpdGlvbiA9IGFuSW5pdGlhbERhdGEtPmdldE5vZGVDb25kaXRpb24oKTsKKwkJCW1Ob2RlVGltZWRDb25kaXRpb24gPSBhbkluaXRpYWxEYXRhLT5nZXROb2RlVGltZWRDb25kaXRpb24oKTsKKworCQkJbVJ1bm5hYmxlRWxlbWVudFRyYWNlID0gYW5Jbml0aWFsRGF0YS0+Z2V0UnVubmFibGVFbGVtZW50VHJhY2UoKTsKKwkJCW1JT0VsZW1lbnRUcmFjZSA9IGFuSW5pdGlhbERhdGEtPmdldElPRWxlbWVudFRyYWNlKCk7CisKKwkJCW1UYWJsZU9mQXNzaWduZWRGbGFnID0gYW5Jbml0aWFsRGF0YS0+Z2V0VGFibGVPZkFzc2lnbmVkRmxhZygpOworCQl9CisJfQorCisKKwkvKioKKwkgKiBSRVNFVCBEQVRBIEJFRk9SRSBFVkFMVUFUSU9OCisJICovCisJaW5saW5lIHZvaWQgcmVzZXREYXRhQmVmb3JlRXZhbHVhdGlvbigpCisJeworCQltRXhlY3V0aW9uRGF0YS0+c2V0Tm9kZUNvbmRpdGlvbiggRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX1RSVUUgKTsKKwkJbUV4ZWN1dGlvbkRhdGEtPnNldE5vZGVUaW1lZENvbmRpdGlvbiggRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX1RSVUUgKTsKKworCQltRXhlY3V0aW9uRGF0YS0+c2V0UnVubmFibGVFbGVtZW50VHJhY2UoIEJGOjpSRUZfTlVMTCApOworCQltRXhlY3V0aW9uRGF0YS0+c2V0SU9FbGVtZW50VHJhY2UoIEJGOjpSRUZfTlVMTCApOworCisJCS8vIER1ZSB0byBiYXNpYyBwb2ludGVyLCBub3Qgc21hcnQgcG9pbnRlcgorCQltVGFibGVPZkFzc2lnbmVkRmxhZyA9IG1FeGVjdXRpb25EYXRhLT5nZXRUYWJsZU9mQXNzaWduZWRGbGFnKCk7CisJCW1FeGVjdXRpb25EYXRhLT5zZXRUYWJsZU9mQXNzaWduZWRGbGFnKCBOVUxMICk7CisJfQorCisKKwkvKioKKwkgKiBSRVNUT1JFIERBVEEgQUZURVIgRVZBTFVBVElPTgorCSAqLworCWlubGluZSB2b2lkIHJlc3RvcmVEYXRhQWZ0ZXJFdmFsdWF0aW9uKCkKKwl7CisJCW1FeGVjdXRpb25EYXRhLT5zZXROb2RlQ29uZGl0aW9uKCBtTm9kZUNvbmRpdGlvbiApOworCQltRXhlY3V0aW9uRGF0YS0+c2V0Tm9kZVRpbWVkQ29uZGl0aW9uKCBtTm9kZVRpbWVkQ29uZGl0aW9uICk7CisKKwkJbUV4ZWN1dGlvbkRhdGEtPnNldFJ1bm5hYmxlRWxlbWVudFRyYWNlKCBtUnVubmFibGVFbGVtZW50VHJhY2UgKTsKKwkJbUV4ZWN1dGlvbkRhdGEtPnNldElPRWxlbWVudFRyYWNlKCBtSU9FbGVtZW50VHJhY2UgKTsKKworCQltRXhlY3V0aW9uRGF0YS0+c2V0VGFibGVPZkFzc2lnbmVkRmxhZyggbVRhYmxlT2ZBc3NpZ25lZEZsYWcgKTsKKwl9CisKKworCisJLyoqCisJICogR0VUVEVSCisJICogbUNoaWxkQ29udGV4dHMKKwkgKiBJdGVyYXRvcnMKKwkgKi8KKwlpbmxpbmUgcndfY2hpbGRfaXRlcmF0b3IgYmVnaW4oKQorCXsKKwkJcmV0dXJuKCBtQ2hpbGRDb250ZXh0cy5iZWdpbigpICk7CisJfQorCisJaW5saW5lIHJ3X2NoaWxkX2l0ZXJhdG9yIGVuZCgpCisJeworCQlyZXR1cm4oIG1DaGlsZENvbnRleHRzLmVuZCgpICk7CisJfQorCisJaW5saW5lIHJ3X2NoaWxkX2l0ZXJhdG9yIGVyYXNlQ2hpbGRDb250ZXh0KAorCQkJY29uc3QgcndfY2hpbGRfaXRlcmF0b3IgJiBpdENoaWxkQ3R4KQorCXsKKwkJcmV0dXJuKCBtQ2hpbGRDb250ZXh0cy5lcmFzZSggaXRDaGlsZEN0eCApICk7CisJfQorCisKKwlpbmxpbmUgY2hpbGRfaXRlcmF0b3IgYmVnaW4oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQ2hpbGRDb250ZXh0cy5iZWdpbigpICk7CisJfQorCisJaW5saW5lIGNoaWxkX2l0ZXJhdG9yIGVuZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1DaGlsZENvbnRleHRzLmVuZCgpICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBtQ2hpbGRDb250ZXh0cworCSAqLworCWlubGluZSBFeGVjdXRpb25Db250ZXh0ICogZmlyc3RDaGlsZENvbnRleHQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQ2hpbGRDb250ZXh0cy5maXJzdCgpICk7CisJfQorCisJaW5saW5lIEV4ZWN1dGlvbkNvbnRleHQgKiBsYXN0Q2hpbGRDb250ZXh0KCkgY29uc3QKKwl7CisJCXJldHVybiggbUNoaWxkQ29udGV4dHMubGFzdCgpICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBoYXNDaGlsZENvbnRleHQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQ2hpbGRDb250ZXh0cy5ub25lbXB0eSgpICk7CisJfQorCisJaW5saW5lIGJvb2wgbm9DaGlsZENvbnRleHQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQ2hpbGRDb250ZXh0cy5lbXB0eSgpICk7CisJfQorCisJaW5saW5lIGJvb2wgcG9wdWxhdGVkQ2hpbGRDb250ZXh0KCkgY29uc3QKKwl7CisJCXJldHVybiggbUNoaWxkQ29udGV4dHMucG9wdWxhdGVkKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBzaW5nbGVDaGlsZENvbnRleHQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQ2hpbGRDb250ZXh0cy5zaW5nbGV0b24oKSApOworCX0KKworCisJaW5saW5lIGJvb2wgaXNMZWFmTm9kZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1DaGlsZENvbnRleHRzLmVtcHR5KCkgKTsKKwl9CisKKwlpbmxpbmUgYXZtX3NpemVfdCBzaXplKCkgY29uc3QKKwl7CisJCXJldHVybiggbUNoaWxkQ29udGV4dHMuc2l6ZSgpICk7CisJfQorCisKKwkvKioKKwkgKiBTRVRURVIKKwkgKiBtQ2hpbGRDb250ZXh0cworCSAqLworCWlubGluZSB2b2lkIGFwcGVuZENoaWxkQ29udGV4dChFeGVjdXRpb25Db250ZXh0ICogYW5FQykKKwl7CisJCW1DaGlsZENvbnRleHRzLmFwcGVuZCggYW5FQyApOworCX0KKworCWlubGluZSB2b2lkIGNsZWFyQ2hpbGRDb250ZXh0KCkKKwl7CisJCW1DaGlsZENvbnRleHRzLmNsZWFyKCk7CisJfQorCisJaW5saW5lIHZvaWQgcG9wTGFzdENoaWxkQ29udGV4dFRvKEV4ZWN1dGlvbkNvbnRleHQgKiAmIGFuRUMpCisJeworCQltQ2hpbGRDb250ZXh0cy5wb3BfbGFzdF90byggYW5FQyApOworCX0KKworCWlubGluZSB2b2lkIHJlbW92ZUNoaWxkQ29udGV4dChFeGVjdXRpb25Db250ZXh0ICogYW5FQykKKwl7CisJCW1DaGlsZENvbnRleHRzLnJlbW92ZSggYW5FQyApOworCX0KKworCisKKwlpbmxpbmUgQVBMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgZ2V0TmV4dCgpCisJeworCQlyZXR1cm4oIG1DaGlsZENvbnRleHRzICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzTmV4dCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1DaGlsZENvbnRleHRzLm5vbmVtcHR5KCkgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1IZWFkZXIKKwkgKi8KKwlpbmxpbmUgY29uc3QgQkYgJiBnZXRIZWFkZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtSGVhZGVyICk7CisJfQorCisJaW5saW5lIEV4ZWN1dGlvbkNvbnRleHRIZWFkZXIgKiByYXdIZWFkZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtSGVhZGVyLnRvX3B0cjwgRXhlY3V0aW9uQ29udGV4dEhlYWRlciA+KCkgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIENvbnRhaW5lcgorCSAqLworCWlubGluZSAgYm9vbCBpc1Jvb3QoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBub3QgaGFzQ29udGFpbmVyKCkgKTsKKwl9CisKKwlpbmxpbmUgIGJvb2wgaXNub3RSb290KCkgY29uc3QKKwl7CisJCXJldHVybiggaGFzQ29udGFpbmVyKCkgKTsKKwl9CisKKworCWlubGluZSBFeGVjdXRpb25Db250ZXh0ICogZ2V0UHJldmlvdXMoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRDb250YWluZXIoKSApOworCX0KKworCisJaW5saW5lIEFQRXhlY3V0aW9uRGF0YSAmIGdldFByZXZpb3VzRXhlY3V0aW9uRGF0YSgpCisJeworCQlyZXR1cm4oIGdldENvbnRhaW5lcigpLT5nZXRBUEV4ZWN1dGlvbkRhdGEoKSApOworCX0KKworCWlubGluZSBjb25zdCBBUEV4ZWN1dGlvbkRhdGEgJiBnZXRQcmV2aW91c0V4ZWN1dGlvbkRhdGEoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRDb250YWluZXIoKS0+Z2V0QVBFeGVjdXRpb25EYXRhKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNQcmV2aW91cygpIGNvbnN0CisJeworCQlyZXR1cm4oIGhhc0NvbnRhaW5lcigpICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtSGVhZGVyIHRyYWNlIGluZGljZXMKKwkgKi8KKwlpbmxpbmUgc3RhdGljIGF2bV91aW50MzJfdCBnZXRDcmVhdGVDb3VudGVyKCkKKwl7CisJCXJldHVybiggRXhlY3V0aW9uQ29udGV4dEhlYWRlcjo6SURfTlVNQkVSICk7CisJfQorCisJaW5saW5lIGF2bV91aW50MzJfdCBnZXRJZE51bWJlcigpIGNvbnN0CisJeworCQlyZXR1cm4oIHJhd0hlYWRlcigpLT5nZXRJZE51bWJlcigpICk7CisJfQorCisKKwlpbmxpbmUgYXZtX3VpbnQzMl90IGdldEV2YWxOdW1iZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCByYXdIZWFkZXIoKS0+Z2V0RXZhbE51bWJlcigpICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNFdmFsdWF0ZWQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCByYXdIZWFkZXIoKS0+Z2V0RXZhbE51bWJlcigpID4gMCApOworCX0KKworCWlubGluZSB2b2lkIHNldEV2YWxOdW1iZXIoYXZtX3VpbnQzMl90IGFuRXZhbE51bWJlcikKKwl7CisJCXJhd0hlYWRlcigpLT5zZXRFdmFsTnVtYmVyKGFuRXZhbE51bWJlcik7CisJfQorCisKKwlpbmxpbmUgYXZtX3VpbnQzMl90IGdldEhlaWdodCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHJhd0hlYWRlcigpLT5nZXRIZWlnaHQoKSApOworCX0KKworCWlubGluZSB2b2lkIHNldEhlaWdodChhdm1fdWludDMyX3QgYUhlaWdodCkKKwl7CisJCXJhd0hlYWRlcigpLT5zZXRIZWlnaHQoYUhlaWdodCk7CisJfQorCisKKwlpbmxpbmUgYXZtX3VpbnQzMl90IGdldFdpZHRoKCkgY29uc3QKKwl7CisJCXJldHVybiggcmF3SGVhZGVyKCktPmdldFdpZHRoKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRXaWR0aChhdm1fdWludDMyX3QgYVdpZHRoKQorCXsKKwkJcmF3SGVhZGVyKCktPnNldFdpZHRoKGFXaWR0aCk7CisJfQorCisKKwlpbmxpbmUgYXZtX3VpbnQ4X3QgZ2V0V2VpZ2h0KCkgY29uc3QKKwl7CisJCXJldHVybiggcmF3SGVhZGVyKCktPmdldFdlaWdodCgpICk7CisJfQorCisJaW5saW5lIGF2bV91aW50MzJfdCBnZXRTdHJXZWlnaHQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCByYXdIZWFkZXIoKS0+Z2V0U3RyV2VpZ2h0KCkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIGF2bV91aW50OF90IGdldFdlaWdodE1heCgpCisJeworCQlyZXR1cm4oIEV4ZWN1dGlvbkNvbnRleHRIZWFkZXI6OmdldFdlaWdodE1heCgpICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNXZWlnaHRNYXgoKSBjb25zdAorCXsKKwkJcmV0dXJuKCByYXdIZWFkZXIoKS0+aXNXZWlnaHRNYXgoKSApOworCX0KKworCWlubGluZSBib29sIGlzV2VpZ2h0KGF2bV91aW50OF90IGFXZWlnaHQpIGNvbnN0CisJeworCQlyZXR1cm4oIHJhd0hlYWRlcigpLT5pc1dlaWdodChhV2VpZ2h0KSApOworCX0KKworCisJaW5saW5lIHZvaWQgc2V0V2VpZ2h0KGF2bV91aW50OF90IGFXZWlnaHQpCisJeworCQlyYXdIZWFkZXIoKS0+c2V0V2VpZ2h0KGFXZWlnaHQpOworCX0KKworCWlubGluZSB2b2lkIHNldFdlaWdodE1heCgpCisJeworCQlyYXdIZWFkZXIoKS0+c2V0V2VpZ2h0TWF4KCk7CisJfQorCisKKwlpbmxpbmUgYXZtX3VpbnQzMl90IGdldFByZXZFdmFsTnVtYmVyKCkgY29uc3QKKwl7CisJCXJldHVybiggaXNSb290KCkgPyAwIDogZ2V0Q29udGFpbmVyKCktPmdldEV2YWxOdW1iZXIoKSApOworCX0KKworCWlubGluZSBhdm1fdWludDMyX3QgZ2V0UHJldkhlaWdodCgpIGNvbnN0CisJeworCQlyZXR1cm4oIGlzUm9vdCgpID8gMCA6IGdldENvbnRhaW5lcigpLT5nZXRIZWlnaHQoKSApOworCX0KKworCWlubGluZSBhdm1fdWludDMyX3QgZ2V0UHJldklkTnVtYmVyKCkgY29uc3QKKwl7CisJCXJldHVybiggaXNSb290KCkgPyAwIDogZ2V0Q29udGFpbmVyKCktPmdldElkTnVtYmVyKCkgKTsKKwl9CisKKwlpbmxpbmUgYXZtX3VpbnQzMl90IGdldFByZXZXaWR0aCgpIGNvbnN0CisJeworCQlyZXR1cm4oIGlzUm9vdCgpID8gMCA6IGdldENvbnRhaW5lcigpLT5nZXRXaWR0aCgpICk7CisJfQorCisJaW5saW5lIGF2bV91aW50OF90IGdldFByZXZzV2VpZ2h0KCkgY29uc3QKKwl7CisJCXJldHVybiggaXNSb290KCkgPyAwIDogZ2V0Q29udGFpbmVyKCktPmdldFdlaWdodCgpICk7CisJfQorCisKKwkvKioKKwkgKiBMQ0EgLUxDUkEKKwkgKi8KKwljb25zdCBFeGVjdXRpb25Db250ZXh0ICogTENBKGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDKSBjb25zdCA7CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtRXhlY3V0aW9uRGF0YQorCSAqLworCWlubGluZSBBUEV4ZWN1dGlvbkRhdGEgJiBnZXRBUEV4ZWN1dGlvbkRhdGEoKQorCXsKKwkJcmV0dXJuKCBtRXhlY3V0aW9uRGF0YSApOworCX0KKworCWlubGluZSBjb25zdCBBUEV4ZWN1dGlvbkRhdGEgJiBnZXRBUEV4ZWN1dGlvbkRhdGEoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRXhlY3V0aW9uRGF0YSApOworCX0KKworCWlubGluZSBFeGVjdXRpb25EYXRhICogZ2V0RXhlY3V0aW9uRGF0YSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1FeGVjdXRpb25EYXRhICk7CisJfQorCisJaW5saW5lIGNvbnN0IEV4ZWN1dGlvbkRhdGEgJiByZWZFeGVjdXRpb25EYXRhKCkgY29uc3QKKwl7CisJCXJldHVybiggKiBtRXhlY3V0aW9uRGF0YSApOworCX0KKworCWlubGluZSBFeGVjdXRpb25EYXRhICYgcndFeGVjdXRpb25EYXRhKCkgY29uc3QKKwl7CisJCXJldHVybiggKiBtRXhlY3V0aW9uRGF0YSApOworCX0KKworCisJaW5saW5lICBib29sIGhhc0V4ZWN1dGlvbkRhdGEoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRXhlY3V0aW9uRGF0YS52YWxpZCgpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0RXhlY3V0aW9uRGF0YShjb25zdCBBUEV4ZWN1dGlvbkRhdGEgJiBhbkV4ZWN1dGlvbkRhdGEpCisJeworCQltRXhlY3V0aW9uRGF0YSA9IGFuRXhlY3V0aW9uRGF0YTsKKwl9CisKKwlpbmxpbmUgdm9pZCBtYWtlV3JpdGFibGVFeGVjdXRpb25EYXRhKCkKKwl7CisJCW1FeGVjdXRpb25EYXRhLm1ha2VXcml0YWJsZSgpOworCX0KKworCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtUnVubmFibGVFbGVtZW50VHJhY2UKKwkgKi8KKwlpbmxpbmUgQkYgJiBnZXRSdW5uYWJsZUVsZW1lbnRUcmFjZSgpCisJeworCQlyZXR1cm4oIG1SdW5uYWJsZUVsZW1lbnRUcmFjZSApOworCX0KKworCWlubGluZSBjb25zdCBCRiAmIGdldFJ1bm5hYmxlRWxlbWVudFRyYWNlKCkgY29uc3QKKwl7CisJCXJldHVybiggbVJ1bm5hYmxlRWxlbWVudFRyYWNlICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzUnVubmFibGVFbGVtZW50VHJhY2UoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUnVubmFibGVFbGVtZW50VHJhY2UudmFsaWQoKSApOworCX0KKworCWlubGluZSB2b2lkIHNldFJ1bm5hYmxlRWxlbWVudFRyYWNlKGNvbnN0IEJGICYgYVJ1bm5hYmxlRWxlbWVudFRyYWNlKQorCXsKKwkJbVJ1bm5hYmxlRWxlbWVudFRyYWNlID0gYVJ1bm5hYmxlRWxlbWVudFRyYWNlOworCX0KKworCisJLyoqCisJICogR0VUVEVSCisJICogdGFibGVPZlJ1bnRpbWVGb3JtU3RhdGUKKwkgKi8KKworCWJvb2wgY2hlY2tSdW5uaW5nRm9ybShjb25zdCBSdW50aW1lSUQgJiBhUklEKQorCXsKKwkJcmV0dXJuKCBnZXRBUEV4ZWN1dGlvbkRhdGEoKS0+Y2hlY2tSdW5uaW5nRm9ybSgKKwkJCQlnZXRSdW5uYWJsZUVsZW1lbnRUcmFjZSgpLCBhUklEKSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSCisJICogbVRhYmxlT2ZBc3NpZ25lZEZsYWcKKwkgKi8KKwlUYWJsZU9mUnVudGltZUZvcm1TdGF0ZTo6VGFibGVPZkFzc2lnbmVkRmxhZyBnZXRUYWJsZU9mQXNzaWduZWRGbGFnKCkgY29uc3QKKwl7CisJCXJldHVybiggbVRhYmxlT2ZBc3NpZ25lZEZsYWcgKTsKKwl9CisKKwl2b2lkIHNldFRhYmxlT2ZBc3NpZ25lZEZsYWcoCisJCQlUYWJsZU9mUnVudGltZUZvcm1TdGF0ZTo6VGFibGVPZkFzc2lnbmVkRmxhZyBhVGFibGVPZkFzc2lnbmVkRmxhZykKKwl7CisJCW1UYWJsZU9mQXNzaWduZWRGbGFnID0gYVRhYmxlT2ZBc3NpZ25lZEZsYWc7CisJfQorCisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIG1Ob2RlQ29uZGl0aW9uICAmJiAgbU5vZGVUaW1lZENvbmRpdGlvbgorCSAqLworCWlubGluZSBCRiBnZXRBbGxOb2RlQ29uZGl0aW9uKCkgY29uc3QKKwl7CisJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjphbmRFeHByKAorCQkJCW1Ob2RlQ29uZGl0aW9uLCBtTm9kZVRpbWVkQ29uZGl0aW9uKSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbU5vZGVDb25kaXRpb24KKwkgKi8KKwlpbmxpbmUgQkYgJiBnZXROb2RlQ29uZGl0aW9uKCkKKwl7CisJCXJldHVybiggbU5vZGVDb25kaXRpb24gKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQkYgJiBnZXROb2RlQ29uZGl0aW9uKCkgY29uc3QKKwl7CisJCXJldHVybiggbU5vZGVDb25kaXRpb24gKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNOb2RlQ29uZGl0aW9uKCkgY29uc3QKKwl7CisJCXJldHVybiggbU5vZGVDb25kaXRpb24udmFsaWQoKSApOworCX0KKworCWlubGluZSB2b2lkIHNldE5vZGVDb25kaXRpb24oY29uc3QgQkYgJiBhQ29uZGl0aW9uKQorCXsKKwkJbU5vZGVDb25kaXRpb24gPSBhQ29uZGl0aW9uOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbU5vZGVUaW1lZENvbmRpdGlvbgorCSAqLworCWlubGluZSBCRiAmIGdldE5vZGVUaW1lZENvbmRpdGlvbigpCisJeworCQlyZXR1cm4oIG1Ob2RlVGltZWRDb25kaXRpb24gKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQkYgJiBnZXROb2RlVGltZWRDb25kaXRpb24oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtTm9kZVRpbWVkQ29uZGl0aW9uICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzTm9kZVRpbWVkQ29uZGl0aW9uKCkgY29uc3QKKwl7CisJCXJldHVybiggbU5vZGVUaW1lZENvbmRpdGlvbi52YWxpZCgpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0Tm9kZVRpbWVkQ29uZGl0aW9uKGNvbnN0IEJGICYgYVRpbWVkQ29uZGl0aW9uKQorCXsKKwkJbU5vZGVUaW1lZENvbmRpdGlvbiA9IGFUaW1lZENvbmRpdGlvbjsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1JT0VsZW1lbnRUcmFjZQorCSAqLworCWlubGluZSBCRiAmIGdldElPRWxlbWVudFRyYWNlKCkKKwl7CisJCXJldHVybiggbUlPRWxlbWVudFRyYWNlICk7CisJfQorCisJaW5saW5lIGNvbnN0IEJGICYgZ2V0SU9FbGVtZW50VHJhY2UoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtSU9FbGVtZW50VHJhY2UgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNJT0VsZW1lbnRUcmFjZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1JT0VsZW1lbnRUcmFjZS52YWxpZCgpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0SU9FbGVtZW50VHJhY2UoY29uc3QgQkYgJiBhbklPRWxlbWVudFRyYWNlKQorCXsKKwkJbUlPRWxlbWVudFRyYWNlID0gYW5JT0VsZW1lbnRUcmFjZTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUiAtIFRFU1RFUgorCSAqIG1JbmZvcm1hdGlvbgorCSAqLworCWlubGluZSB2b2lkIGFkZEluZm8oCisJCQljb25zdCBBYnN0cmFjdFByb2Nlc3NvclVuaXQgJiBhUHJvY2Vzc29yLCBjb25zdCBCRiAmIGFEYXRhKQorCXsKKwkJZ2V0VW5pcUluZm9ybWF0aW9uKCktPmFkZEluZm8oYVByb2Nlc3NvciwgYURhdGEpOworCX0KKworCWlubGluZSB2b2lkIGFkZEluZm8oY29uc3QgQWJzdHJhY3RQcm9jZXNzb3JVbml0ICYgYVByb2Nlc3NvciwKKwkJCWNvbnN0IEJGICYgYW5JRCwgY29uc3QgQkYgJiBhRGF0YSkKKwl7CisJCWdldFVuaXFJbmZvcm1hdGlvbigpLT5hZGRJbmZvKGFQcm9jZXNzb3IsIGFuSUQsIGFEYXRhKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIHZvaWQgYWRkSW5mbyhMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgbGlzdE9mRUMsCisJCQljb25zdCBBYnN0cmFjdFByb2Nlc3NvclVuaXQgJiBhUHJvY2Vzc29yLCBjb25zdCBCRiAmIGFEYXRhKQorCXsKKwkJTGlzdE9mRXhlY3V0aW9uQ29udGV4dDo6aXRlcmF0b3IgaXQgPSBsaXN0T2ZFQy5iZWdpbigpOworCQlMaXN0T2ZFeGVjdXRpb25Db250ZXh0OjppdGVyYXRvciBpdEVuZCA9IGxpc3RPZkVDLmVuZCgpOworCQlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwkJeworCQkJKCppdCktPmFkZEluZm8oYVByb2Nlc3NvcixhRGF0YSk7CisJCX0KKwl9CisKKwlpbmxpbmUgR2VuZXJpY0luZm9EYXRhICogZ2V0SW5mbygKKwkJCWNvbnN0IEFic3RyYWN0UHJvY2Vzc29yVW5pdCAmIGFQcm9jZXNzb3IsIGNvbnN0IEJGICYgYW5JRCkgY29uc3QKKwl7CisJCXJldHVybiggbUluZm9ybWF0aW9uLmludmFsaWQoKSA/ICBOVUxMIDoKKwkJCQltSW5mb3JtYXRpb24udG9fcHRyPCBFeGVjdXRpb25JbmZvcm1hdGlvbiA+KCktPgorCQkJCWdldEluZm8oYVByb2Nlc3NvciwgYW5JRCkgKTsKKwl9CisKKworCWlubGluZSBjb25zdCBCRiAmIGdldEluZm9EYXRhKAorCQkJY29uc3QgSVByb2Nlc3NvclVuaXRSZWdpc3RyYXRpb24gJiBhUmVnaXN0ZXJUb29sKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtSW5mb3JtYXRpb24uaW52YWxpZCgpID8gIEJGOjpSRUZfTlVMTCA6CisJCQkJbUluZm9ybWF0aW9uLnRvX3B0cjwgRXhlY3V0aW9uSW5mb3JtYXRpb24gPigpLT4KKwkJCQlnZXRJbmZvRGF0YShhUmVnaXN0ZXJUb29sKSApOworCX0KKworCWlubGluZSBjb25zdCBCRiAmIGdldEluZm9EYXRhKGNvbnN0IEFic3RyYWN0UHJvY2Vzc29yVW5pdCAmIGFQcm9jZXNzb3IpIGNvbnN0CisJeworCQlyZXR1cm4oIG1JbmZvcm1hdGlvbi5pbnZhbGlkKCkgPyAgQkY6OlJFRl9OVUxMIDoKKwkJCQltSW5mb3JtYXRpb24udG9fcHRyPCBFeGVjdXRpb25JbmZvcm1hdGlvbiA+KCktPgorCQkJCWdldEluZm9EYXRhKGFQcm9jZXNzb3IpICk7CisJfQorCisJaW5saW5lIGNvbnN0IEJGICYgZ2V0SW5mb0RhdGEoCisJCQljb25zdCBBYnN0cmFjdFByb2Nlc3NvclVuaXQgJiBhUHJvY2Vzc29yLCBjb25zdCBCRiAmIGFuSUQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1JbmZvcm1hdGlvbi5pbnZhbGlkKCkgPyAgQkY6OlJFRl9OVUxMIDoKKwkJCQltSW5mb3JtYXRpb24udG9fcHRyPCBFeGVjdXRpb25JbmZvcm1hdGlvbiA+KCktPgorCQkJCWdldEluZm9EYXRhKGFQcm9jZXNzb3IsIGFuSUQpICk7CisJfQorCisKKwlpbmxpbmUgY29uc3QgQkZMaXN0ICYgZ2V0SW5mb3MoKSBjb25zdAorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggbUluZm9ybWF0aW9uICkKKwkJCQk8PCAiRXhlY3V0aW9uIEluZm9ybWF0aW9uICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJcmV0dXJuKCBnZXRJbmZvcm1hdGlvbigpLT5nZXRJbmZvcygpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzSW5mbygpIGNvbnN0CisJeworCQlyZXR1cm4oIG1JbmZvcm1hdGlvbi52YWxpZCgpICYmCisJCQkJbUluZm9ybWF0aW9uLnRvX3B0cjwgRXhlY3V0aW9uSW5mb3JtYXRpb24gPigpLT5oYXNJbmZvKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNJbmZvKGNvbnN0IEFic3RyYWN0UHJvY2Vzc29yVW5pdCAmIGFQcm9jZXNzb3IpIGNvbnN0CisJeworCQlyZXR1cm4oIG1JbmZvcm1hdGlvbi52YWxpZCgpICYmIG1JbmZvcm1hdGlvbi50b19wdHI8CisJCQkJRXhlY3V0aW9uSW5mb3JtYXRpb24gPigpLT5oYXNJbmZvKGFQcm9jZXNzb3IpICk7CisJfQorCisJaW5saW5lIGJvb2wgbm9uZUluZm8oY29uc3QgQWJzdHJhY3RQcm9jZXNzb3JVbml0ICYgYVByb2Nlc3NvcikgY29uc3QKKwl7CisJCXJldHVybiggbUluZm9ybWF0aW9uLmludmFsaWQoKSB8fCBtSW5mb3JtYXRpb24udG9fcHRyPAorCQkJCUV4ZWN1dGlvbkluZm9ybWF0aW9uID4oKS0+bm9uZUluZm8oYVByb2Nlc3NvcikgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNJbmZvKAorCQkJY29uc3QgQWJzdHJhY3RQcm9jZXNzb3JVbml0ICYgYVByb2Nlc3NvciwgY29uc3QgQkYgJiBhbklEKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtSW5mb3JtYXRpb24udmFsaWQoKSAmJiBtSW5mb3JtYXRpb24udG9fcHRyPAorCQkJCUV4ZWN1dGlvbkluZm9ybWF0aW9uID4oKS0+IGhhc0luZm8oYVByb2Nlc3NvciwgYW5JRCkgKTsKKwl9CisKKworCWlubGluZSBib29sIGhhc0luZm9XaXRoRGF0YSgKKwkJCWNvbnN0IEFic3RyYWN0UHJvY2Vzc29yVW5pdCAmIGFQcm9jZXNzb3IsIGNvbnN0IEJGICYgYURhdGEpIGNvbnN0CisJeworCQlyZXR1cm4oIG1JbmZvcm1hdGlvbi52YWxpZCgpICYmIG1JbmZvcm1hdGlvbi50b19wdHI8CisJCQkJRXhlY3V0aW9uSW5mb3JtYXRpb24gPigpLT5oYXNJbmZvV2l0aERhdGEoYVByb2Nlc3NvciwgYURhdGEpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzSW5mbyhjb25zdCBCRiAmIGFuSUQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1JbmZvcm1hdGlvbi52YWxpZCgpICYmCisJCQkJbUluZm9ybWF0aW9uLnRvX3B0cjwgRXhlY3V0aW9uSW5mb3JtYXRpb24gPigpLT5oYXNJbmZvKGFuSUQpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzSW5mbyhFbGVtZW50ICogYW5JRCkgY29uc3QKKwl7CisJCXJldHVybiggbUluZm9ybWF0aW9uLnZhbGlkKCkgJiYKKwkJCQltSW5mb3JtYXRpb24udG9fcHRyPCBFeGVjdXRpb25JbmZvcm1hdGlvbiA+KCktPmhhc0luZm8oYW5JRCkgKTsKKwl9CisKKworCWlubGluZSBFeGVjdXRpb25JbmZvcm1hdGlvbiAqIGdldFVuaXFJbmZvcm1hdGlvbigpCisJeworCQlpZiggbm90IGhhc0luZm9ybWF0aW9uKCkgKQorCQl7CisJCQltSW5mb3JtYXRpb24uc2V0UG9pbnRlciggbmV3IEV4ZWN1dGlvbkluZm9ybWF0aW9uKCkgKTsKKwkJfQorCQlyZXR1cm4oIG1JbmZvcm1hdGlvbi50b19wdHI8IEV4ZWN1dGlvbkluZm9ybWF0aW9uID4oKSApOworCX0KKworCWlubGluZSBFeGVjdXRpb25JbmZvcm1hdGlvbiAqIGdldEluZm9ybWF0aW9uKCkgY29uc3QKKwl7CisJCXJldHVybiggbUluZm9ybWF0aW9uLnRvX3B0cjwgRXhlY3V0aW9uSW5mb3JtYXRpb24gPigpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzSW5mb3JtYXRpb24oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtSW5mb3JtYXRpb24udmFsaWQoKSApOworCX0KKworCWlubGluZSB2b2lkIHNldEluZm9ybWF0aW9uKEV4ZWN1dGlvbkluZm9ybWF0aW9uICogYW5JbmZvcm1hdGlvbikKKwl7CisJCW1JbmZvcm1hdGlvbi5zZXRQb2ludGVyKCBhbkluZm9ybWF0aW9uICk7CisJfQorCisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJdm9pZCB0b0RlYnVnKE91dFN0cmVhbSAmIG91dCkgY29uc3Q7CisKKwl2b2lkIHRvRGVidWdGZXQoT3V0U3RyZWFtICYgb3V0KSBjb25zdDsKKworCisJdGVtcGxhdGU8IGNsYXNzIE9TX1QgPgorCU9TX1QgJiBvc1N0clBvc2l0aW9uKE9TX1QgJiBvdXQpIGNvbnN0CisJeworCQlvdXQgPDwgIklkOiIgLyo8PCBzdGQ6OnNldHcoNCkqLyA8PCBnZXRJZE51bWJlcigpOworCisJCW91dCA8PCAiIFBFOiI7CisJCWlmICggaGFzQ29udGFpbmVyKCkgKQorCQl7CisJCQlvdXQgLyo8PCBzdGQ6OnNldHcoNCkqLyA8PCBnZXRDb250YWluZXIoKS0+Z2V0RXZhbE51bWJlcigpOworCQl9CisJCWVsc2UKKwkJeworCQkJb3V0IDw8ICAiUk9PVCI7CisJCX0KKworCQlvdXQgPDwgIiBIOiIgLyo8PCBzdGQ6OnNldHcoNCkqLyA8PCBnZXRIZWlnaHQoKQorCQkJPDwgIiBXOiIgLyo8PCBzdGQ6OnNldHcoNCkqLyA8PCBnZXRXaWR0aCgpCisJCQk8PCAiIFE6IiAvKjw8IHN0ZDo6c2V0dygyKSovIDw8IGdldFN0cldlaWdodCgpOworCisJCXJldHVybiggb3V0ICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBzdGQ6OnN0cmluZyBzdHIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBvc1N0clBvc2l0aW9uKCBPU1MoKSA8PCAiRUM8ICIgKSA8PCAiID4gIgorCQkJCTw8IHJlZkV4ZWN1dGlvbkRhdGEoKS5zdHJTdGF0ZUNvbmYoKSApOworCX0KKworCXZpcnR1YWwgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvdXQpIGNvbnN0OworCisJdmlydHVhbCB2b2lkIHRvRnNjbihPdXRTdHJlYW0gJiBvdXQsCisJCQljb25zdCBFeGVjdXRpb25EYXRhICogYVByZXZpb3VzRXhlY0RhdGEpIGNvbnN0OworCisJc3RkOjpzdHJpbmcgc3RyX21pbigpIGNvbnN0OworCXN0ZDo6c3RyaW5nIHN0cl9wb3NpdGlvbigpIGNvbnN0OworCisJdm9pZCB0cmFjZU1pbmltdW0oT3V0U3RyZWFtICYgb3V0KSBjb25zdDsKKwl2b2lkIHRyYWNlRGVmYXVsdChPdXRTdHJlYW0gJiBvdXQpIGNvbnN0OworCXZvaWQgZGVidWdEZWZhdWx0KE91dFN0cmVhbSAmIG91dCkgY29uc3Q7CisKKworCXN0YXRpYyB2b2lkIHRyYWNlTWluaW11bShPdXRTdHJlYW0gJiBvdXQsCisJCQlMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgbGlzdG9mRUMsIGNvbnN0IHN0ZDo6c3RyaW5nICYgaGVhZGVyID0gIiIpOworCisJc3RhdGljIHZvaWQgdHJhY2VNaW5pbXVtKE91dFN0cmVhbSAmIG91dCwKKwkJCVZlY3Rvck9mRXhlY3V0aW9uQ29udGV4dCAmIGxpc3RvZkVDLCBjb25zdCBzdGQ6OnN0cmluZyAmIGhlYWRlciA9ICIiKTsKKworCisJc3RhdGljIHZvaWQgdHJhY2VEZWZhdWx0KE91dFN0cmVhbSAmIG91dCwKKwkJCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBsaXN0b2ZFQywgY29uc3Qgc3RkOjpzdHJpbmcgJiBoZWFkZXIgPSAiIik7CisKKwlzdGF0aWMgdm9pZCB0cmFjZURlZmF1bHQoT3V0U3RyZWFtICYgb3V0LAorCQkJVmVjdG9yT2ZFeGVjdXRpb25Db250ZXh0ICYgbGlzdG9mRUMsIGNvbnN0IHN0ZDo6c3RyaW5nICYgaGVhZGVyID0gIiIpOworCisJc3RhdGljIHZvaWQgZGVidWdEZWZhdWx0KE91dFN0cmVhbSAmIG91dCwKKwkJCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBsaXN0b2ZFQywgY29uc3Qgc3RkOjpzdHJpbmcgJiBoZWFkZXIgPSAiIik7CisKKwlzdGF0aWMgdm9pZCBkZWJ1Z0RlZmF1bHQoT3V0U3RyZWFtICYgb3V0LAorCQkJVmVjdG9yT2ZFeGVjdXRpb25Db250ZXh0ICYgbGlzdG9mRUMsIGNvbnN0IHN0ZDo6c3RyaW5nICYgaGVhZGVyID0gIiIpOworCisKKwl2b2lkIHdyaXRlVHJhY2VBZnRlckV4ZWMoT3V0U3RyZWFtICYgb3V0KSBjb25zdDsKKwl2b2lkIHRyYWNlRGVmYXVsdFBvc3RFdmFsKE91dFN0cmVhbSAmIG91dCkgY29uc3Q7CisKKwlpbmxpbmUgdm9pZCB0cmFjZURlZmF1bHRFdmFsKE91dFN0cmVhbSAmIG91dCkgY29uc3QKKwl7CisJCXRyYWNlRGVmYXVsdChvdXQpOworCQlpZiggaGFzTmV4dCgpICkKKwkJeworCQkJdHJhY2VEZWZhdWx0UG9zdEV2YWwob3V0KTsKKwkJfQorCX0KKworCisJdm9pZCB3cml0ZVRyYWNlQmVmb3JlRXhlYyhPdXRTdHJlYW0gJiBvdXQpIGNvbnN0OworCisJdm9pZCB3cml0ZVRyYWNlRm9yRGVhZGxvY2soT3V0U3RyZWFtICYgb3V0LAorCQkJYXZtX3VpbnQzMl90IG5EZWFkbG9ja0NvdW50ZXIpIGNvbnN0OworCisJdm9pZCB3cml0ZVRyYWNlRm9yUmVkdW5kYW5jeShPdXRTdHJlYW0gJiBvdXQsCisJCQlFeGVjdXRpb25Db250ZXh0ICogYVJlZHVuZGFudEV4ZWNDb250ZXh0LAorCQkJYXZtX3VpbnQzMl90IG5SZWR1bmRhbmN5Q291bnRlcikgY29uc3Q7CisKK307CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKkVYRUNVVElPTkNPTlRFWFRfSF8qLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3J1bnRpbWUvRXhlY3V0aW9uQ29udGV4dEZsYWdzLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL0V4ZWN1dGlvbkNvbnRleHRGbGFncy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdkZjY2OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL0V4ZWN1dGlvbkNvbnRleHRGbGFncy5jcHAKQEAgLTAsMCArMSwxNzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyNiBhdnIuIDIwMTYKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBJbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkV4ZWN1dGlvbkNvbnRleHRGbGFncy5oIgorCisjaW5jbHVkZSA8c3N0cmVhbT4KKworbmFtZXNwYWNlIHNlcAoreworCisvKioKKyAqIERlZmF1bHQgU2VwYXJhdG9yCisgKi8KK3N0ZDo6c3RyaW5nIEV4ZWN1dGlvbkNvbnRleHRGbGFnczo6U0VQQVJBVE9SID0gIiAmICI7CisKKworLyoqCisgKiBSRUFDSEVEIExJTUlUIHRvIFNUUklORworICovCitzdGQ6OnN0cmluZyBFeGVjdXRpb25Db250ZXh0RmxhZ3M6OnN0clJlYWNoZWRMaW1pdCgKKwkJYml0X2ZpZWxkX3QgcmVhY2hlZExpbWl0LCBjb25zdCBzdGQ6OnN0cmluZyAmIHNlcGFyYXRvcikKK3sKKwlpZiggKHJlYWNoZWRMaW1pdCAhPSBSRUFDSEVEX1VOREVGSU5FRF9MSU1JVCkgKQorCXsKKwkJc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKworCQlvc3MgPDwgIlJFQUNIRUQtIjsKKworCQlpZiggKHJlYWNoZWRMaW1pdCAmIFJFQUNIRURfTk9ERV9IRUlHSFRfTElNSVQpICE9IDAgKQorCQl7CisJCQlvc3MgPDwgIk5PREUtSEVJR0hULSI7CisJCX0KKwkJaWYoIChyZWFjaGVkTGltaXQgJiBSRUFDSEVEX05PREVfV0lEVEhfTElNSVQpICE9IDAgKQorCQl7CisJCQlvc3MgPDwgIk5PREUtV0lEVEgtIjsKKwkJfQorCQlpZiggKHJlYWNoZWRMaW1pdCAmIFJFQUNIRURfTk9ERV9DT1VOVF9MSU1JVCkgIT0gMCApCisJCXsKKwkJCW9zcyA8PCAiTk9ERS1DT1VOVC0iOworCQl9CisJCWlmKCAocmVhY2hlZExpbWl0ICYgUkVBQ0hFRF9TWU1CRVhfU1RFUF9MSU1JVCkgIT0gMCApCisJCXsKKwkJCW9zcyA8PCAiU1lNQkVYLVNURVAtIjsKKwkJfQorCisJCW9zcyA8PCAiTElNSVQiIDw8IHNlcGFyYXRvcjsKKworCQlyZXR1cm4oIG9zcy5zdHIoKSApOworCX0KKworCXJldHVybiggIiIgLyoiPGxpbWl0OnVucmVhY2hlZD4iKi8gKTsKK30KKworCisvKioKKyAqIElOVEVSUlVQVCBSRVFVRVNUIHRvIFNUUklORworICovCitzdGQ6OnN0cmluZyBFeGVjdXRpb25Db250ZXh0RmxhZ3M6OnN0ckludGVycnVwdFJlcXVlc3QoCisJCWJpdF9maWVsZF90IGludGVycnVwdFJlcXVlc3QsIGNvbnN0IHN0ZDo6c3RyaW5nICYgc2VwYXJhdG9yKQoreworCXN3aXRjaCggaW50ZXJydXB0UmVxdWVzdCApCisJeworCQljYXNlIElOVEVSUlVQVF9VTkRFRklORURfUkVRVUVTVDoKKwkJCXJldHVybiggIiIgKTsKKy8vCQkJcmV0dXJuKCAiPGludGVycnVwdDp1bmRlZj4iICsgc2VwYXJhdG9yICk7CisKKwkJY2FzZSBJTlRFUlJVUFRfRkFNX1JFUVVFU1Q6CisJCQlyZXR1cm4oICJGQU1fSVJRIiArIHNlcGFyYXRvciApOworCisJCWNhc2UgSU5URVJSVVBUX1VTRVJfUkVRVUVTVDoKKwkJCXJldHVybiggIlVTRVJfSVJRIiArIHNlcGFyYXRvciApOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4oICI8aW50ZXJydXB0OnVua25vd24+IiArIHNlcGFyYXRvciApOworCX0KK30KKworCisvKioKKyAqIEVYRUNVVElPTiBUUkFDRSB0byBTVFJJTkcKKyAqLworc3RkOjpzdHJpbmcgRXhlY3V0aW9uQ29udGV4dEZsYWdzOjpzdHJFeGVjdXRpb25UcmFjZSgKKwkJYml0X2ZpZWxkX3QgZXhlY3V0aW9uVHJhY2UsIGNvbnN0IHN0ZDo6c3RyaW5nICYgc2VwYXJhdG9yKQoreworCXN3aXRjaCggZXhlY3V0aW9uVHJhY2UgKQorCXsKKwkJY2FzZSBFWEVDVVRJT05fVU5ERUZJTkVEX1RSQUNFOgorCQkJcmV0dXJuKCAiIiApOworLy8JCQlyZXR1cm4oICI8Y29tcG9uZW50OnVuZGVmPiIgKyBzZXBhcmF0b3IgKTsKKworCQljYXNlIEVYRUNVVElPTl9ERUFETE9DS19UUkFDRToKKwkJCXJldHVybiggIkRFQURMT0NLIiArIHNlcGFyYXRvciApOworCisJCWNhc2UgRVhFQ1VUSU9OX1RSSVZJQUxfTE9PUF9UUkFDRToKKwkJCXJldHVybiggIlRSSVZJQUwtTE9PUCIgKyBzZXBhcmF0b3IgKTsKKworCQljYXNlIEVYRUNVVElPTl9MSVZFTE9DS19UUkFDRToKKwkJCXJldHVybiggIkxJVkVMT0NLIiArIHNlcGFyYXRvciApOworCisJCWNhc2UgRVhFQ1VUSU9OX1JFRFVOREFOQ1lfVFJBQ0U6CisJCQlyZXR1cm4oICJSRURVTkRBTkNZLUxFQUYiICsgc2VwYXJhdG9yICk7CisKKwkJY2FzZSBFWEVDVVRJT05fUkVEVU5EQU5DWV9UQVJHRVRfVFJBQ0U6CisJCQlyZXR1cm4oICJSRURVTkRBTkNZLVRBUkdFVCIgKyBzZXBhcmF0b3IgKTsKKworCQljYXNlIEVYRUNVVElPTl9TVEFURU1FTlRfRVhJVF9UUkFDRToKKwkJCXJldHVybiggIlNUQVRFTUVOVC1FWElUIiArIHNlcGFyYXRvciApOworCisJCWNhc2UgRVhFQ1VUSU9OX0ZBVEFMX0VSUk9SX1RSQUNFOgorCQkJcmV0dXJuKCAiRkFUQUwtRVJST1IiICsgc2VwYXJhdG9yICk7CisKKwkJY2FzZSBFWEVDVVRJT05fU1lNQkVYX0xJTUlUX1RSQUNFOgorCQkJcmV0dXJuKCAiU1lNQkVYLUxJTUlUQVRJT04iICsgc2VwYXJhdG9yICk7CisKKwkJY2FzZSBFWEVDVVRJT05fRVhDRVBUSU9OX1RSQUNFOgorCQkJcmV0dXJuKCAiRVhDRVBUSU9OIiArIHNlcGFyYXRvciApOworCisJCWNhc2UgRVhFQ1VUSU9OX1NURVBfTUFSS19UUkFDRToKKwkJCXJldHVybiggIlNURVAtTUFSSyIgKyBzZXBhcmF0b3IgKTsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuKCAiPGV4ZWN1dGlvbjp1bmtub3duPiIgKyBzZXBhcmF0b3IgKTsKKwl9Cit9CisKKworLyoqCisgKiBBTkFMWVNJUyBUUkFDRSB0byBTVFJJTkcKKyAqLworc3RkOjpzdHJpbmcgRXhlY3V0aW9uQ29udGV4dEZsYWdzOjpzdHJBbmFseXNpc1RyYWNlKAorCQliaXRfZmllbGRfdCBhbmFseXNpc1RyYWNlLCBjb25zdCBzdGQ6OnN0cmluZyAmIHNlcGFyYXRvcikKK3sKKwlpZiggYW5hbHlzaXNUcmFjZSAhPSBGQU1fVU5ERUZJTkVEX1RSQUNFICkKKwl7CisJCXN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisKKwkJaWYoIChhbmFseXNpc1RyYWNlICYgRkFNX0NPVkVSQUdFX0VMRU1FTlRfVFJBQ0UpICE9IDAgKQorCQl7CisJCQlvc3MgPDwgIkNPVkVSQUdFLUVMRU1FTlQiIDw8IHNlcGFyYXRvcjsKKwkJfQorCisJCWlmKCAoYW5hbHlzaXNUcmFjZSAmIEZBTV9PQkpFQ1RJVkVfQUNISUVWRURfVFJBQ0UpICE9IDAgKQorCQl7CisJCQlvc3MgPDwgIk9CSkVDVElWRS1BQ0hJRVZFRCIgPDwgc2VwYXJhdG9yOworCQl9CisKKwkJaWYoIChhbmFseXNpc1RyYWNlICYgRkFNX09CSkVDVElWRV9GQUlMRURfVFJBQ0UpICE9IDAgKQorCQl7CisJCQlvc3MgPDwgIk9CSkVDVElWRS1GQUlMRUQiIDw8IHNlcGFyYXRvcjsKKwkJfQorCisJCWlmKCAoYW5hbHlzaXNUcmFjZSAmIEZBTV9PQkpFQ1RJVkVfQUJPUlRFRF9UUkFDRSkgIT0gMCApCisJCXsKKwkJCW9zcyA8PCAiT0JKRUNUSVZFLUFCT1JURUQiIDw8IHNlcGFyYXRvcjsKKwkJfQorCisJCXJldHVybiggb3NzLnN0cigpICk7CisJfQorCisJcmV0dXJuKCAiIiApOworLy8JcmV0dXJuKCAiPGFuYWx5c2lzOnVuZGVmPiIgKyBzZXBhcmF0b3IgKTsKK30KKworCisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvcnVudGltZS9FeGVjdXRpb25Db250ZXh0RmxhZ3MuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL0V4ZWN1dGlvbkNvbnRleHRGbGFncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMGFjNjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvcnVudGltZS9FeGVjdXRpb25Db250ZXh0RmxhZ3MuaApAQCAtMCwwICsxLDEwMjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyNiBhdnIuIDIwMTYKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBJbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBGTUxfUlVOVElNRV9FWEVDVVRJT05DT05URVhURkxBR1NfSF8KKyNkZWZpbmUgRk1MX1JVTlRJTUVfRVhFQ1VUSU9OQ09OVEVYVEZMQUdTX0hfCisKKyNpbmNsdWRlIDx1dGlsL2F2bV9zdHJpbmcuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKK3N0cnVjdCBFeGVjdXRpb25Db250ZXh0RmxhZ3MKK3sKKworCS8qKgorCSAqIFJFQUNIRURfTElNSVQKKwkgKiA0IGJpdHMKKwkgKi8KKwllbnVtIFJFQUNIRURfTElNSVQKKwl7CisJCVJFQUNIRURfVU5ERUZJTkVEX0xJTUlUICAgICAgICAgID0gMHgwMCwKKworCQlSRUFDSEVEX05PREVfSEVJR0hUX0xJTUlUICAgICAgICA9IDB4MDEsCisKKwkJUkVBQ0hFRF9OT0RFX1dJRFRIX0xJTUlUICAgICAgICAgPSAweDAyLAorCisJCVJFQUNIRURfTk9ERV9DT1VOVF9MSU1JVCAgICAgICAgID0gMHgwNCwKKworCQlSRUFDSEVEX1NZTUJFWF9TVEVQX0xJTUlUICAgICAgICA9IDB4MDgsCisKKwl9OworCisJLyoqCisJICogSU5URVJSVVBUX1JFUVVFU1QKKwkgKiAyIGJpdHMKKwkgKi8KKwllbnVtIElOVEVSUlVQVF9SRVFVRVNUCisJeworCQlJTlRFUlJVUFRfVU5ERUZJTkVEX1JFUVVFU1QgICAgICA9IDB4MDAsCisKKwkJSU5URVJSVVBUX0ZBTV9SRVFVRVNUICAgICAgICAgICAgPSAweDAxLAorCisJCUlOVEVSUlVQVF9VU0VSX1JFUVVFU1QgICAgICAgICAgID0gMHgwMiwKKworCX07CisKKwkvKioKKwkgKiBFWEVDVVRJT05fVFJBQ0UKKwkgKiA0IGJpdHMKKwkgKi8KKwllbnVtIEVYRUNVVElPTl9UUkFDRQorCXsKKwkJRVhFQ1VUSU9OX1VOREVGSU5FRF9UUkFDRSAgICAgICAgID0gMHgwMCwKKworCQlFWEVDVVRJT05fREVBRExPQ0tfVFJBQ0UgICAgICAgICAgPSAweDAxLAorCisJCUVYRUNVVElPTl9UUklWSUFMX0xPT1BfVFJBQ0UgICAgICA9IDB4MDIsCisKKwkJRVhFQ1VUSU9OX0xJVkVMT0NLX1RSQUNFICAgICAgICAgID0gMHgwMywKKworCQlFWEVDVVRJT05fUkVEVU5EQU5DWV9UUkFDRSAgICAgICAgPSAweDA0LAorCisJCUVYRUNVVElPTl9SRURVTkRBTkNZX1RBUkdFVF9UUkFDRSA9IDB4MDUsCisKKwkJRVhFQ1VUSU9OX1NUQVRFTUVOVF9FWElUX1RSQUNFICAgID0gMHgwNiwKKworCQlFWEVDVVRJT05fRkFUQUxfRVJST1JfVFJBQ0UgICAgICAgPSAweDA3LAorCisJCUVYRUNVVElPTl9TWU1CRVhfTElNSVRfVFJBQ0UgICAgICA9IDB4MDgsCisKKwkJRVhFQ1VUSU9OX0VYQ0VQVElPTl9UUkFDRSAgICAgICAgID0gMHgwOSwKKworCQlFWEVDVVRJT05fU1RFUF9NQVJLX1RSQUNFICAgICAgICAgPSAweDBBCisKKwl9OworCisJLyoqCisJICogRk9STUFMIEFOQUxZU0lTIE1PRFVMRSBhcyBGQU1fVFJBQ0UKKwkgKiAzIGJpdHMKKwkgKi8KKwllbnVtIEZBTV9UUkFDRQorCXsKKwkJRkFNX1VOREVGSU5FRF9UUkFDRSAgICAgICAgICAgICAgPSAweDAwLAorCisJCUZBTV9DT1ZFUkFHRV9FTEVNRU5UX1RSQUNFICAgICAgID0gMHgwMSwKKworCQlGQU1fT0JKRUNUSVZFX0FDSElFVkVEX1RSQUNFICAgICA9IDB4MDIsCisKKwkJRkFNX09CSkVDVElWRV9GQUlMRURfVFJBQ0UgICAgICAgPSAweDA0LAorCisJCUZBTV9PQkpFQ1RJVkVfQUJPUlRFRF9UUkFDRSAgICAgID0gMHgwOCwKKworCX07CisKKworCisJLyoqCisJICogVFlQRURFRgorCSAqLworCXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIGJpdF9maWVsZF90OworCisJLyoqCisJICogQklUIEZJRUxEUworCSAqLworCWJpdF9maWVsZF90IGxpbWl0ICAgICAgICAgIDogNDsKKworCWJpdF9maWVsZF90IGludGVycnVwdCAgICAgIDogMjsKKworCWJpdF9maWVsZF90IGV4ZWN1dGlvbiAgICAgIDogNDsKKworCWJpdF9maWVsZF90IGFuYWx5c2lzICAgICAgIDogNDsKKworCisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUlMKKwkgKi8KKwlFeGVjdXRpb25Db250ZXh0RmxhZ3MoKQorCTogbGltaXQoIFJFQUNIRURfVU5ERUZJTkVEX0xJTUlUICksCisJaW50ZXJydXB0KCBJTlRFUlJVUFRfVU5ERUZJTkVEX1JFUVVFU1QgKSwKKwlleGVjdXRpb24oIEVYRUNVVElPTl9VTkRFRklORURfVFJBQ0UgKSwKKwlhbmFseXNpcyggRkFNX1VOREVGSU5FRF9UUkFDRSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJfkV4ZWN1dGlvbkNvbnRleHRGbGFncygpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCisJLyoqCisJICogVEVTVEVSIC0gU0VUVEVSCisJICovCisJaW5saW5lIGJvb2wgaXNEZWZpbmVkKCkgY29uc3QKKwl7CisJCXJldHVybiggICAgKGxpbWl0ICAgICAhPSBSRUFDSEVEX1VOREVGSU5FRF9MSU1JVCAgKQorCQkJCXx8IChpbnRlcnJ1cHQgIT0gRVhFQ1VUSU9OX1VOREVGSU5FRF9UUkFDRSkKKwkJCQl8fCAoZXhlY3V0aW9uICE9IEVYRUNVVElPTl9VTkRFRklORURfVFJBQ0UpCisJCQkJfHwgKGFuYWx5c2lzICE9IEVYRUNVVElPTl9VTkRFRklORURfVFJBQ0UgKSApOworCX0KKworCWlubGluZSBib29sIGhhc1JlYWNoZWRMaW1pdE9yRXhlY3V0aW9uVHJhY2UoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAgICAobGltaXQgICAgICE9IFJFQUNIRURfVU5ERUZJTkVEX0xJTUlUICApCisJCQkJfHwgKGV4ZWN1dGlvbiAhPSBFWEVDVVRJT05fVU5ERUZJTkVEX1RSQUNFKSApOworCX0KKworCWlubGluZSBib29sIGlzVW5kZWZpbmVkKCkgY29uc3QKKwl7CisJCXJldHVybiggICAgKGxpbWl0ICAgICA9PSBSRUFDSEVEX1VOREVGSU5FRF9MSU1JVCAgKQorCQkJCSYmIChpbnRlcnJ1cHQgPT0gRVhFQ1VUSU9OX1VOREVGSU5FRF9UUkFDRSkKKwkJCQkmJiAoZXhlY3V0aW9uID09IEVYRUNVVElPTl9VTkRFRklORURfVFJBQ0UpCisJCQkJJiYgKGFuYWx5c2lzID09IEVYRUNVVElPTl9VTkRFRklORURfVFJBQ0UgKSApOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFJFQUNIRUQgTElNSVQKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBsaW1pdAorCSAqLworCWlubGluZSBSRUFDSEVEX0xJTUlUIGdldFJlYWNoZWRMaW1pdCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHN0YXRpY19jYXN0PCBSRUFDSEVEX0xJTUlUID4oIGxpbWl0ICkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNSZWFjaGVkTGltaXQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBsaW1pdCAhPSBSRUFDSEVEX1VOREVGSU5FRF9MSU1JVCApOworCX0KKworCWlubGluZSBib29sIG5vbmVSZWFjaGVkTGltaXQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBsaW1pdCA9PSBSRUFDSEVEX1VOREVGSU5FRF9MSU1JVCApOworCX0KKworCWlubGluZSBib29sIGlzUmVhY2hlZExpbWl0KFJFQUNIRURfTElNSVQgcmVhY2hlZExpbWl0KSBjb25zdAorCXsKKwkJcmV0dXJuKCBsaW1pdCA9PSByZWFjaGVkTGltaXQgKTsKKwl9CisKKwlpbmxpbmUgRXhlY3V0aW9uQ29udGV4dEZsYWdzICYgYWRkUmVhY2hlZExpbWl0KFJFQUNIRURfTElNSVQgcmVhY2hlZExpbWl0KQorCXsKKwkJbGltaXQgfD0gcmVhY2hlZExpbWl0OworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwlpbmxpbmUgRXhlY3V0aW9uQ29udGV4dEZsYWdzICYgcmVtUmVhY2hlZExpbWl0KFJFQUNIRURfTElNSVQgcmVhY2hlZExpbWl0KQorCXsKKwkJbGltaXQgJj0gKH4gcmVhY2hlZExpbWl0KTsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJaW5saW5lIEV4ZWN1dGlvbkNvbnRleHRGbGFncyAmIHNldFJlYWNoZWRMaW1pdChSRUFDSEVEX0xJTUlUIHJlYWNoZWRMaW1pdCkKKwl7CisJCWxpbWl0ID0gcmVhY2hlZExpbWl0OworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwlpbmxpbmUgRXhlY3V0aW9uQ29udGV4dEZsYWdzICYgdW5zZXRSZWFjaGVkTGltaXQoKQorCXsKKwkJbGltaXQgPSBSRUFDSEVEX1VOREVGSU5FRF9MSU1JVDsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAibm9kZSBoZWlnaHQiIGxpbWl0CisJICovCisJaW5saW5lIGJvb2wgaXNSZWFjaGVkTm9kZUhlaWdodExpbWl0KCkgY29uc3QKKwl7CisJCXJldHVybiggbGltaXQgPT0gUkVBQ0hFRF9OT0RFX0hFSUdIVF9MSU1JVCApOworCX0KKworCWlubGluZSBib29sIGhhc1JlYWNoZWROb2RlSGVpZ2h0TGltaXQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobGltaXQgJiBSRUFDSEVEX05PREVfSEVJR0hUX0xJTUlUKSAhPSAwICk7CisJfQorCisJaW5saW5lIEV4ZWN1dGlvbkNvbnRleHRGbGFncyAmIGFkZFJlYWNoZWROb2RlSGVpZ2h0TGltaXQoKQorCXsKKwkJbGltaXQgfD0gUkVBQ0hFRF9OT0RFX0hFSUdIVF9MSU1JVDsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJaW5saW5lIEV4ZWN1dGlvbkNvbnRleHRGbGFncyAmIHNldFJlYWNoZWROb2RlSGVpZ2h0TGltaXQoKQorCXsKKwkJbGltaXQgPSBSRUFDSEVEX05PREVfSEVJR0hUX0xJTUlUOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAibm9kZSB3aWR0aCIgbGltaXQKKwkgKi8KKwlpbmxpbmUgYm9vbCBpc1JlYWNoZWROb2RlV2lkdGhMaW1pdCgpIGNvbnN0CisJeworCQlyZXR1cm4oIGxpbWl0ID09IFJFQUNIRURfTk9ERV9XSURUSF9MSU1JVCApOworCX0KKworCWlubGluZSBib29sIGhhc1JlYWNoZWROb2RlV2lkdGhMaW1pdCgpIGNvbnN0CisJeworCQlyZXR1cm4oIChsaW1pdCAmIFJFQUNIRURfTk9ERV9XSURUSF9MSU1JVCkgIT0gMCApOworCX0KKworCWlubGluZSBFeGVjdXRpb25Db250ZXh0RmxhZ3MgJiBhZGRSZWFjaGVkTm9kZVdpZHRoTGltaXQoKQorCXsKKwkJbGltaXQgfD0gUkVBQ0hFRF9OT0RFX1dJRFRIX0xJTUlUOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwlpbmxpbmUgRXhlY3V0aW9uQ29udGV4dEZsYWdzICYgc2V0UmVhY2hlZE5vZGVXaWR0aExpbWl0KCkKKwl7CisJCWxpbWl0ID0gUkVBQ0hFRF9OT0RFX1dJRFRIX0xJTUlUOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAibm9kZSBjb3VudCIgbGltaXQKKwkgKi8KKwlpbmxpbmUgYm9vbCBpc1JlYWNoZWROb2RlQ291bnRMaW1pdCgpIGNvbnN0CisJeworCQlyZXR1cm4oIGxpbWl0ID09IFJFQUNIRURfTk9ERV9DT1VOVF9MSU1JVCApOworCX0KKworCWlubGluZSBib29sIGhhc1JlYWNoZWROb2RlQ291bnRMaW1pdCgpIGNvbnN0CisJeworCQlyZXR1cm4oIChsaW1pdCAmIFJFQUNIRURfTk9ERV9DT1VOVF9MSU1JVCkgIT0gMCApOworCX0KKworCWlubGluZSBFeGVjdXRpb25Db250ZXh0RmxhZ3MgJiBhZGRSZWFjaGVkTm9kZUNvdW50TGltaXQoKQorCXsKKwkJbGltaXQgfD0gUkVBQ0hFRF9OT0RFX0NPVU5UX0xJTUlUOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwlpbmxpbmUgRXhlY3V0aW9uQ29udGV4dEZsYWdzICYgc2V0UmVhY2hlZE5vZGVDb3VudExpbWl0KCkKKwl7CisJCWxpbWl0ID0gUkVBQ0hFRF9OT0RFX0NPVU5UX0xJTUlUOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAiZXhlY3V0aW9uIHN0ZXAiIGxpbWl0CisJICovCisJaW5saW5lIGJvb2wgaXNSZWFjaGVkU3ltYmV4U3RlcExpbWl0KCkgY29uc3QKKwl7CisJCXJldHVybiggbGltaXQgPT0gUkVBQ0hFRF9TWU1CRVhfU1RFUF9MSU1JVCApOworCX0KKworCWlubGluZSBib29sIGhhc1JlYWNoZWRTeW1iZXhTdGVwTGltaXQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobGltaXQgJiBSRUFDSEVEX1NZTUJFWF9TVEVQX0xJTUlUKSAhPSAwICk7CisJfQorCisKKwlpbmxpbmUgRXhlY3V0aW9uQ29udGV4dEZsYWdzICYgYWRkUmVhY2hlZFN5bWJleFN0ZXBMaW1pdCgpCisJeworCQlsaW1pdCB8PSBSRUFDSEVEX1NZTUJFWF9TVEVQX0xJTUlUOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwlpbmxpbmUgRXhlY3V0aW9uQ29udGV4dEZsYWdzICYgc2V0UmVhY2hlZFN5bWJleFN0ZXBMaW1pdCgpCisJeworCQlsaW1pdCA9IFJFQUNIRURfU1lNQkVYX1NURVBfTElNSVQ7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFJFQUNIRUQgTElNSVQKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBpbnRlcnJ1cHQKKwkgKi8KKwlpbmxpbmUgSU5URVJSVVBUX1JFUVVFU1QgZ2V0SW50ZXJydXB0UmVxdWVzdCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHN0YXRpY19jYXN0PCBJTlRFUlJVUFRfUkVRVUVTVCA+KCBpbnRlcnJ1cHQgKSApOworCX0KKworCWlubGluZSBib29sIGhhc0ludGVycnVwdFJlcXVlc3QoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBpbnRlcnJ1cHQgIT0gUkVBQ0hFRF9VTkRFRklORURfTElNSVQgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBub25lSW50ZXJydXB0UmVxdWVzdCgpIGNvbnN0CisJeworCQlyZXR1cm4oIGludGVycnVwdCA9PSBSRUFDSEVEX1VOREVGSU5FRF9MSU1JVCApOworCX0KKworCWlubGluZSBib29sIGlzSW50ZXJydXB0UmVxdWVzdChJTlRFUlJVUFRfUkVRVUVTVCBpbnRlcnJ1cHRSZXF1ZXN0KSBjb25zdAorCXsKKwkJcmV0dXJuKCBpbnRlcnJ1cHQgPT0gaW50ZXJydXB0UmVxdWVzdCApOworCX0KKworCWlubGluZSBFeGVjdXRpb25Db250ZXh0RmxhZ3MgJiBzZXRJbnRlcnJ1cHRSZXF1ZXN0KAorCQkJSU5URVJSVVBUX1JFUVVFU1QgaW50ZXJydXB0UmVxdWVzdCkKKwl7CisJCWludGVycnVwdCA9IGludGVycnVwdFJlcXVlc3Q7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCWlubGluZSBFeGVjdXRpb25Db250ZXh0RmxhZ3MgJiB1bnNldEludGVycnVwdFJlcXVlc3QoKQorCXsKKwkJaW50ZXJydXB0ID0gUkVBQ0hFRF9VTkRFRklORURfTElNSVQ7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqICJmb3JtYWwgYW5hbHlzaXMgbW9kdWxlIiBhcyAiZmFtIiByZXF1ZXN0CisJICovCisJaW5saW5lIGJvb2wgaXNJbnRlcnJ1cHRNb2R1bGVSZXF1ZXN0KCkgY29uc3QKKwl7CisJCXJldHVybiggaW50ZXJydXB0ID09IElOVEVSUlVQVF9GQU1fUkVRVUVTVCApOworCX0KKworCWlubGluZSBFeGVjdXRpb25Db250ZXh0RmxhZ3MgJiBzZXRJbnRlcnJ1cHRNb2R1bGVSZXF1ZXN0KCkKKwl7CisJCWludGVycnVwdCA9IElOVEVSUlVQVF9GQU1fUkVRVUVTVDsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogImZhbSIgcmVxdWVzdAorCSAqLworCWlubGluZSBib29sIGlzSW50ZXJydXB0VXNlclJlcXVlc3QoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBpbnRlcnJ1cHQgPT0gSU5URVJSVVBUX1VTRVJfUkVRVUVTVCApOworCX0KKworCWlubGluZSBFeGVjdXRpb25Db250ZXh0RmxhZ3MgJiBzZXRJbnRlcnJ1cHRVc2VyUmVxdWVzdCgpCisJeworCQlpbnRlcnJ1cHQgPSBJTlRFUlJVUFRfVVNFUl9SRVFVRVNUOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBFWEVDVVRJT04gVFJBQ0UKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBleGVjdXRpb24KKwkgKi8KKwlpbmxpbmUgRVhFQ1VUSU9OX1RSQUNFIGdldEV4ZWN1dGlvblRyYWNlKCkgY29uc3QKKwl7CisJCXJldHVybiggc3RhdGljX2Nhc3Q8IEVYRUNVVElPTl9UUkFDRSA+KCBleGVjdXRpb24gKSApOworCX0KKworCWlubGluZSBib29sIGhhc0V4ZWN1dGlvblRyYWNlKCkgY29uc3QKKwl7CisJCXJldHVybiggZXhlY3V0aW9uICE9IEVYRUNVVElPTl9VTkRFRklORURfVFJBQ0UgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBub25lRXhlY3V0aW9uVHJhY2UoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBleGVjdXRpb24gPT0gRVhFQ1VUSU9OX1VOREVGSU5FRF9UUkFDRSApOworCX0KKworCWlubGluZSBib29sIGlzRXhlY3V0aW9uVHJhY2UoRVhFQ1VUSU9OX1RSQUNFIHJlYWNoZWRMaW1pdCkgY29uc3QKKwl7CisJCXJldHVybiggZXhlY3V0aW9uID09IHJlYWNoZWRMaW1pdCApOworCX0KKworCWlubGluZSBFeGVjdXRpb25Db250ZXh0RmxhZ3MgJiBhZGRFeGVjdXRpb25UcmFjZShFWEVDVVRJT05fVFJBQ0UgcmVhY2hlZExpbWl0KQorCXsKKwkJZXhlY3V0aW9uIHw9IHJlYWNoZWRMaW1pdDsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJaW5saW5lIEV4ZWN1dGlvbkNvbnRleHRGbGFncyAmIHJlbUV4ZWN1dGlvblRyYWNlKEVYRUNVVElPTl9UUkFDRSByZWFjaGVkTGltaXQpCisJeworCQlleGVjdXRpb24gJj0gKH4gcmVhY2hlZExpbWl0KTsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJaW5saW5lIEV4ZWN1dGlvbkNvbnRleHRGbGFncyAmIHNldEV4ZWN1dGlvblRyYWNlKEVYRUNVVElPTl9UUkFDRSByZWFjaGVkTGltaXQpCisJeworCQlleGVjdXRpb24gPSByZWFjaGVkTGltaXQ7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCWlubGluZSBFeGVjdXRpb25Db250ZXh0RmxhZ3MgJiB1bnNldEV4ZWN1dGlvblRyYWNlKCkKKwl7CisJCWV4ZWN1dGlvbiA9IEVYRUNVVElPTl9VTkRFRklORURfVFJBQ0U7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogImRlYWRsb2NrIiBleGVjdXRpb24KKwkgKi8KKwlpbmxpbmUgYm9vbCBpc0V4ZWN1dGlvbkRlYWRsb2NrVHJhY2UoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBleGVjdXRpb24gPT0gRVhFQ1VUSU9OX0RFQURMT0NLX1RSQUNFICk7CisJfQorCisJaW5saW5lIEV4ZWN1dGlvbkNvbnRleHRGbGFncyAmIHNldEV4ZWN1dGlvbkRlYWRsb2NrVHJhY2UoKQorCXsKKwkJZXhlY3V0aW9uID0gRVhFQ1VUSU9OX0RFQURMT0NLX1RSQUNFOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAidHJpdmlhbF9sb29wIiBleGVjdXRpb24KKwkgKi8KKwlpbmxpbmUgYm9vbCBpc0V4ZWN1dGlvblRyaXZpYWxMb29wVHJhY2UoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBleGVjdXRpb24gPT0gRVhFQ1VUSU9OX1RSSVZJQUxfTE9PUF9UUkFDRSApOworCX0KKworCWlubGluZSBFeGVjdXRpb25Db250ZXh0RmxhZ3MgJiBzZXRFeGVjdXRpb25Ucml2aWFsTG9vcFRyYWNlKCkKKwl7CisJCWV4ZWN1dGlvbiA9IEVYRUNVVElPTl9UUklWSUFMX0xPT1BfVFJBQ0U7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqICJsaXZlbG9jayIgZXhlY3V0aW9uCisJICovCisJaW5saW5lIGJvb2wgaXNFeGVjdXRpb25MaXZlbG9ja1RyYWNlKCkgY29uc3QKKwl7CisJCXJldHVybiggZXhlY3V0aW9uID09IEVYRUNVVElPTl9MSVZFTE9DS19UUkFDRSApOworCX0KKworCWlubGluZSBFeGVjdXRpb25Db250ZXh0RmxhZ3MgJiBzZXRFeGVjdXRpb25MaXZlbG9ja1RyYWNlKCkKKwl7CisJCWV4ZWN1dGlvbiA9IEVYRUNVVElPTl9MSVZFTE9DS19UUkFDRTsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogInJlZHVuZGFuY3kiIGV4ZWN1dGlvbgorCSAqLworCWlubGluZSBib29sIGlzRXhlY3V0aW9uUmVkdW5kYW5jeVRyYWNlKCkgY29uc3QKKwl7CisJCXJldHVybiggZXhlY3V0aW9uID09IEVYRUNVVElPTl9SRURVTkRBTkNZX1RSQUNFICk7CisJfQorCisJaW5saW5lIEV4ZWN1dGlvbkNvbnRleHRGbGFncyAmIHNldEV4ZWN1dGlvblJlZHVuZGFuY3lUcmFjZSgpCisJeworCQlleGVjdXRpb24gPSBFWEVDVVRJT05fUkVEVU5EQU5DWV9UUkFDRTsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogInJlZHVuZGFuY3kgdGFyZ2V0IiBleGVjdXRpb24KKwkgKi8KKwlpbmxpbmUgYm9vbCBpc0V4ZWN1dGlvblJlZHVuZGFuY3lUYXJnZXRUcmFjZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGV4ZWN1dGlvbiA9PSBFWEVDVVRJT05fUkVEVU5EQU5DWV9UQVJHRVRfVFJBQ0UgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBub25lRXhlY3V0aW9uUmVkdW5kYW5jeVRhcmdldFRyYWNlKCkgY29uc3QKKwl7CisJCXJldHVybiggZXhlY3V0aW9uICE9IEVYRUNVVElPTl9SRURVTkRBTkNZX1RBUkdFVF9UUkFDRSApOworCX0KKworCWlubGluZSBFeGVjdXRpb25Db250ZXh0RmxhZ3MgJiBzZXRFeGVjdXRpb25SZWR1bmRhbmN5VGFyZ2V0VHJhY2UoKQorCXsKKwkJZXhlY3V0aW9uID0gRVhFQ1VUSU9OX1JFRFVOREFOQ1lfVEFSR0VUX1RSQUNFOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAic3RhdGVtZW50X2V4aXQiIGV4ZWN1dGlvbgorCSAqLworCWlubGluZSBib29sIGlzRXhlY3V0aW9uU3RhdGVtZW50RXhpdFRyYWNlKCkgY29uc3QKKwl7CisJCXJldHVybiggZXhlY3V0aW9uID09IEVYRUNVVElPTl9TVEFURU1FTlRfRVhJVF9UUkFDRSApOworCX0KKworCWlubGluZSBFeGVjdXRpb25Db250ZXh0RmxhZ3MgJiBzZXRFeGVjdXRpb25TdGF0ZW1lbnRFeGl0VHJhY2UoKQorCXsKKwkJZXhlY3V0aW9uID0gRVhFQ1VUSU9OX1NUQVRFTUVOVF9FWElUX1RSQUNFOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAiZmF0YWxfZXJyb3IiIGV4ZWN1dGlvbgorCSAqLworCWlubGluZSBib29sIGlzRXhlY3V0aW9uRmF0YWxFcnJvclRyYWNlKCkgY29uc3QKKwl7CisJCXJldHVybiggZXhlY3V0aW9uID09IEVYRUNVVElPTl9GQVRBTF9FUlJPUl9UUkFDRSApOworCX0KKworCWlubGluZSBFeGVjdXRpb25Db250ZXh0RmxhZ3MgJiBzZXRFeGVjdXRpb25GYXRhbEVycm9yVHJhY2UoKQorCXsKKwkJZXhlY3V0aW9uID0gRVhFQ1VUSU9OX0ZBVEFMX0VSUk9SX1RSQUNFOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAiYm91bmRhcnkiIGV4ZWN1dGlvbgorCSAqLworCWlubGluZSBib29sIGlzRXhlY3V0aW9uU3ltYmV4TGltaXRhdGlvblRyYWNlKCkgY29uc3QKKwl7CisJCXJldHVybiggZXhlY3V0aW9uID09IEVYRUNVVElPTl9TWU1CRVhfTElNSVRfVFJBQ0UgKTsKKwl9CisKKwlpbmxpbmUgRXhlY3V0aW9uQ29udGV4dEZsYWdzICYgc2V0RXhlY3V0aW9uU3ltYmV4TGltaXRhdGlvblRyYWNlKCkKKwl7CisJCWV4ZWN1dGlvbiA9IEVYRUNVVElPTl9TWU1CRVhfTElNSVRfVFJBQ0U7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqICJleGNlcHRpb24iIGV4ZWN1dGlvbgorCSAqLworCWlubGluZSBib29sIGlzRXhlY3V0aW9uRXhjZXB0aW9uVHJhY2UoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBleGVjdXRpb24gPT0gRVhFQ1VUSU9OX0VYQ0VQVElPTl9UUkFDRSApOworCX0KKworCWlubGluZSBFeGVjdXRpb25Db250ZXh0RmxhZ3MgJiBzZXRFeGVjdXRpb25FeGNlcHRpb25UcmFjZSgpCisJeworCQlleGVjdXRpb24gPSBFWEVDVVRJT05fRVhDRVBUSU9OX1RSQUNFOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiAic3RlcF9tYXJrIiBleGVjdXRpb24KKwkgKi8KKwlpbmxpbmUgYm9vbCBpc0V4ZWN1dGlvblN0ZXBNYXJrVHJhY2UoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBleGVjdXRpb24gPT0gRVhFQ1VUSU9OX1NURVBfTUFSS19UUkFDRSApOworCX0KKworCWlubGluZSBFeGVjdXRpb25Db250ZXh0RmxhZ3MgJiBzZXRFeGVjdXRpb25TdGVwTWFya1RyYWNlKCkKKwl7CisJCWV4ZWN1dGlvbiA9IEVYRUNVVElPTl9TVEVQX01BUktfVFJBQ0U7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIEFOQUxZU0lTIFRSQUNFCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogYW5hbHlzaXMKKwkgKi8KKwlpbmxpbmUgRkFNX1RSQUNFIGdldEFuYWx5c2lzVHJhY2UoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBzdGF0aWNfY2FzdDwgRkFNX1RSQUNFID4oIGFuYWx5c2lzICkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNBbmFseXNpc1RyYWNlKCkgY29uc3QKKwl7CisJCXJldHVybiggYW5hbHlzaXMgIT0gUkVBQ0hFRF9VTkRFRklORURfTElNSVQgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBub25lQW5hbHlzaXNUcmFjZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGFuYWx5c2lzID09IFJFQUNIRURfVU5ERUZJTkVEX0xJTUlUICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzQW5hbHlzaXNUcmFjZShGQU1fVFJBQ0UgYW5hbHlzaXNUcmFjZSkgY29uc3QKKwl7CisJCXJldHVybiggKGFuYWx5c2lzICYgYW5hbHlzaXNUcmFjZSkgIT0gMCApOworCX0KKworCWlubGluZSBib29sIGlzQW5hbHlzaXNUcmFjZShGQU1fVFJBQ0UgYW5hbHlzaXNUcmFjZSkgY29uc3QKKwl7CisJCXJldHVybiggYW5hbHlzaXMgPT0gYW5hbHlzaXNUcmFjZSApOworCX0KKworCWlubGluZSBFeGVjdXRpb25Db250ZXh0RmxhZ3MgJiBzZXRBbmFseXNpc1RyYWNlKEZBTV9UUkFDRSBhbmFseXNpc1RyYWNlKQorCXsKKwkJYW5hbHlzaXMgPSBhbmFseXNpc1RyYWNlOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwlpbmxpbmUgRXhlY3V0aW9uQ29udGV4dEZsYWdzICYgdW5zZXRBbmFseXNpc1RyYWNlKCkKKwl7CisJCWFuYWx5c2lzID0gRkFNX1VOREVGSU5FRF9UUkFDRTsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogImNvdmVyYWdlIiBhbmFseXNpcworCSAqLworCWlubGluZSBib29sIGhhc0NvdmVyYWdlRWxlbWVudFRyYWNlKCkgY29uc3QKKwl7CisJCXJldHVybiggKGFuYWx5c2lzICYgRkFNX0NPVkVSQUdFX0VMRU1FTlRfVFJBQ0UpICE9IDAgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc0NvdmVyYWdlRWxlbWVudFRyYWNlKCkgY29uc3QKKwl7CisJCXJldHVybiggYW5hbHlzaXMgPT0gRkFNX0NPVkVSQUdFX0VMRU1FTlRfVFJBQ0UgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBub25lQ292ZXJhZ2VFbGVtZW50VHJhY2UoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAoYW5hbHlzaXMgJiBGQU1fQ09WRVJBR0VfRUxFTUVOVF9UUkFDRSkgPT0gMCApOworCX0KKworCWlubGluZSBFeGVjdXRpb25Db250ZXh0RmxhZ3MgJiBhZGRDb3ZlcmFnZUVsZW1lbnRUcmFjZSgpCisJeworCQlhbmFseXNpcyB8PSBGQU1fQ09WRVJBR0VfRUxFTUVOVF9UUkFDRTsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJaW5saW5lIEV4ZWN1dGlvbkNvbnRleHRGbGFncyAmIHNldENvdmVyYWdlRWxlbWVudFRyYWNlKCkKKwl7CisJCWFuYWx5c2lzID0gRkFNX0NPVkVSQUdFX0VMRU1FTlRfVFJBQ0U7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqICJjb3ZlcmFnZSIgYW5hbHlzaXMKKwkgKi8KKwlpbmxpbmUgYm9vbCBoYXNPYmplY3RpdmVBY2hpZXZlZFRyYWNlKCkgY29uc3QKKwl7CisJCXJldHVybiggKGFuYWx5c2lzICYgRkFNX09CSkVDVElWRV9BQ0hJRVZFRF9UUkFDRSkgIT0gMCApOworCX0KKworCWlubGluZSBib29sIGlzT2JqZWN0aXZlQWNoaWV2ZWRUcmFjZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGFuYWx5c2lzID09IEZBTV9PQkpFQ1RJVkVfQUNISUVWRURfVFJBQ0UgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBub25lT2JqZWN0aXZlQWNoaWV2ZWRUcmFjZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIChhbmFseXNpcyAmIEZBTV9PQkpFQ1RJVkVfQUNISUVWRURfVFJBQ0UpID09IDAgKTsKKwl9CisKKwlpbmxpbmUgRXhlY3V0aW9uQ29udGV4dEZsYWdzICYgYWRkT2JqZWN0aXZlQWNoaWV2ZWRUcmFjZSgpCisJeworCQlhbmFseXNpcyB8PSBGQU1fT0JKRUNUSVZFX0FDSElFVkVEX1RSQUNFOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwlpbmxpbmUgRXhlY3V0aW9uQ29udGV4dEZsYWdzICYgc2V0T2JqZWN0aXZlQWNoaWV2ZWRUcmFjZSgpCisJeworCQlhbmFseXNpcyA9IEZBTV9PQkpFQ1RJVkVfQUNISUVWRURfVFJBQ0U7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqICJjb3ZlcmFnZSIgYW5hbHlzaXMKKwkgKi8KKwlpbmxpbmUgYm9vbCBoYXNPYmplY3RpdmVGYWlsZWRUcmFjZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIChhbmFseXNpcyAmIEZBTV9PQkpFQ1RJVkVfRkFJTEVEX1RSQUNFKSAhPSAwICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNPYmplY3RpdmVGYWlsZWRUcmFjZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGFuYWx5c2lzID09IEZBTV9PQkpFQ1RJVkVfRkFJTEVEX1RSQUNFICk7CisJfQorCisJaW5saW5lIEV4ZWN1dGlvbkNvbnRleHRGbGFncyAmIGFkZE9iamVjdGl2ZUZhaWxlZFRyYWNlKCkKKwl7CisJCWFuYWx5c2lzIHw9IEZBTV9PQkpFQ1RJVkVfRkFJTEVEX1RSQUNFOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwlpbmxpbmUgRXhlY3V0aW9uQ29udGV4dEZsYWdzICYgc2V0T2JqZWN0aXZlRmFpbGVkVHJhY2UoKQorCXsKKwkJYW5hbHlzaXMgPSBGQU1fT0JKRUNUSVZFX0ZBSUxFRF9UUkFDRTsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogImNvdmVyYWdlIiBhbmFseXNpcworCSAqLworCWlubGluZSBib29sIGhhc09iamVjdGl2ZUFib3J0ZWRUcmFjZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIChhbmFseXNpcyAmIEZBTV9PQkpFQ1RJVkVfQUJPUlRFRF9UUkFDRSkgIT0gMCApOworCX0KKworCWlubGluZSBib29sIGlzT2JqZWN0aXZlQWJvcnRlZFRyYWNlKCkgY29uc3QKKwl7CisJCXJldHVybiggYW5hbHlzaXMgPT0gRkFNX09CSkVDVElWRV9BQk9SVEVEX1RSQUNFICk7CisJfQorCisJaW5saW5lIEV4ZWN1dGlvbkNvbnRleHRGbGFncyAmIGFkZE9iamVjdGl2ZUFib3J0ZWRUcmFjZSgpCisJeworCQlhbmFseXNpcyB8PSBGQU1fT0JKRUNUSVZFX0FCT1JURURfVFJBQ0U7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCWlubGluZSBFeGVjdXRpb25Db250ZXh0RmxhZ3MgJiBzZXRPYmplY3RpdmVBYm9ydGVkVHJhY2UoKQorCXsKKwkJYW5hbHlzaXMgPSBGQU1fT0JKRUNUSVZFX0FCT1JURURfVFJBQ0U7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCisJLyoqCisJICogUkVFWEVDVVRBQklMSVRZCisJICovCisJaW5saW5lIGJvb2wgaXNSZWV4ZWN1dGFibGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBub25lRXhlY3V0aW9uVHJhY2UoKSApOworCX0KKworCWlubGluZSBFeGVjdXRpb25Db250ZXh0RmxhZ3MgJiBzZXRSZWV4ZWN1dGFibGUoKQorCXsKKwkJbGltaXQgPSBSRUFDSEVEX1VOREVGSU5FRF9MSU1JVDsKKworCQlpbnRlcnJ1cHQgPSBJTlRFUlJVUFRfVU5ERUZJTkVEX1JFUVVFU1Q7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCisJLyoqCisJICogQ0FURUdPUlkgVEVTVAorCSAqLworCWlubGluZSBib29sIGhhc0Vycm9yKCkgY29uc3QKKwl7CisJCXJldHVybiggaXNFeGVjdXRpb25GYXRhbEVycm9yVHJhY2UoKQorCQkJCXx8IGlzRXhlY3V0aW9uU3ltYmV4TGltaXRhdGlvblRyYWNlKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNBbGVydCgpIGNvbnN0CisJeworCQlyZXR1cm4oIGlzRXhlY3V0aW9uRGVhZGxvY2tUcmFjZSgpCisJCQkJfHwgaXNFeGVjdXRpb25MaXZlbG9ja1RyYWNlKCkKKwkJCQl8fCBpc0V4ZWN1dGlvblN0YXRlbWVudEV4aXRUcmFjZSgpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzV2FybmluZygpIGNvbnN0CisJeworCQlyZXR1cm4oIGhhc1JlYWNoZWRMaW1pdCgpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzQ292ZXJhZ2VFbGVtZW50KCkgY29uc3QKKwl7CisJCXJldHVybiggaGFzQ292ZXJhZ2VFbGVtZW50VHJhY2UoKSApOworCX0KKworCWlubGluZSBib29sIGhhc09iamVjdGl2ZUFjaGlldmVkKCkgY29uc3QKKwl7CisJCXJldHVybiggaGFzT2JqZWN0aXZlQWNoaWV2ZWRUcmFjZSgpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzT2JqZWN0aXZlRmFpbGVkKCkgY29uc3QKKwl7CisJCXJldHVybiggaGFzT2JqZWN0aXZlRmFpbGVkVHJhY2UoKSApOworCX0KKworCWlubGluZSBib29sIGhhc09iamVjdGl2ZUFib3J0ZWQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBoYXNPYmplY3RpdmVBYm9ydGVkVHJhY2UoKSApOworCX0KKworCWlubGluZSBib29sIGhhc1JlZHVuZGFuY3koKSBjb25zdAorCXsKKwkJcmV0dXJuKCBpc0V4ZWN1dGlvblRyaXZpYWxMb29wVHJhY2UoKQorCQkJCXx8IGlzRXhlY3V0aW9uUmVkdW5kYW5jeVRyYWNlKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNSZWR1bmRhbmN5VGFyZ2V0KCkgY29uc3QKKwl7CisJCXJldHVybiggaXNFeGVjdXRpb25SZWR1bmRhbmN5VGFyZ2V0VHJhY2UoKSApOworCX0KKworCisJLyoqCisJICogRGVmYXVsdCBTZXBhcmF0b3IKKwkgKi8KKwlzdGF0aWMgc3RkOjpzdHJpbmcgU0VQQVJBVE9SOworCisJLyoqCisJICogUkVBQ0hFRCBMSU1JVCB0byBTVFJJTkcKKwkgKi8KKwlpbmxpbmUgc3RkOjpzdHJpbmcgc3RyUmVhY2hlZExpbWl0KAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBzZXBhcmF0b3IgPSAiICYgIikgY29uc3QKKwl7CisJCXJldHVybiggRXhlY3V0aW9uQ29udGV4dEZsYWdzOjpzdHJSZWFjaGVkTGltaXQoCisJCQkJbGltaXQgLCBzZXBhcmF0b3IgKSApOworCX0KKworCXN0YXRpYyBzdGQ6OnN0cmluZyBzdHJSZWFjaGVkTGltaXQoYml0X2ZpZWxkX3QgcmVhY2hlZExpbWl0LAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBzZXBhcmF0b3IgPSBTRVBBUkFUT1IpOworCisJLyoqCisJICogSU5URVJSVVBUIFJFUVVFU1QgdG8gU1RSSU5HCisJICovCisJaW5saW5lIHN0ZDo6c3RyaW5nIHN0ckludGVycnVwdFJlcXVlc3QoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIHNlcGFyYXRvciA9ICIgJiAiKSBjb25zdAorCXsKKwkJcmV0dXJuKCBFeGVjdXRpb25Db250ZXh0RmxhZ3M6OnN0ckludGVycnVwdFJlcXVlc3QoCisJCQkJaW50ZXJydXB0ICwgc2VwYXJhdG9yICkgKTsKKwl9CisKKwlzdGF0aWMgc3RkOjpzdHJpbmcgc3RySW50ZXJydXB0UmVxdWVzdChiaXRfZmllbGRfdCBpbnRlcnJ1cHRSZXF1ZXN0LAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBzZXBhcmF0b3IgPSBTRVBBUkFUT1IpOworCisKKwkvKioKKwkgKiBFWEVDVVRJT04gVFJBQ0UgdG8gU1RSSU5HCisJICovCisJaW5saW5lIHN0ZDo6c3RyaW5nIHN0ckV4ZWN1dGlvblRyYWNlKAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBzZXBhcmF0b3IgPSAiICIpIGNvbnN0CisJeworCQlyZXR1cm4oIEV4ZWN1dGlvbkNvbnRleHRGbGFnczo6c3RyRXhlY3V0aW9uVHJhY2UoCisJCQkJZXhlY3V0aW9uICwgc2VwYXJhdG9yICkgKTsKKwl9CisKKwlzdGF0aWMgc3RkOjpzdHJpbmcgc3RyRXhlY3V0aW9uVHJhY2UoYml0X2ZpZWxkX3QgZXhlY3V0aW9uVHJhY2UsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIHNlcGFyYXRvciA9IFNFUEFSQVRPUik7CisKKwkvKioKKwkgKiBBTkFMWVNJUyBUUkFDRSB0byBTVFJJTkcKKwkgKi8KKwlpbmxpbmUgc3RkOjpzdHJpbmcgc3RyQW5hbHlzaXNUcmFjZSgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgc2VwYXJhdG9yID0gIiAiKSBjb25zdAorCXsKKwkJcmV0dXJuKCBFeGVjdXRpb25Db250ZXh0RmxhZ3M6OnN0ckFuYWx5c2lzVHJhY2UoCisJCQkJYW5hbHlzaXMgLCBzZXBhcmF0b3IgKSApOworCX0KKworCXN0YXRpYyBzdGQ6OnN0cmluZyBzdHJBbmFseXNpc1RyYWNlKGJpdF9maWVsZF90IGFuYWx5c2lzVHJhY2UsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIHNlcGFyYXRvciA9IFNFUEFSQVRPUik7CisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJaW5saW5lIHN0ZDo6c3RyaW5nIHN0cihjb25zdCBzdGQ6OnN0cmluZyAmIHNlcGFyYXRvciA9IFNFUEFSQVRPUikgY29uc3QKKwl7CisJCXJldHVybiggU3RyaW5nVG9vbHM6OnJlbW92ZUxhc3RJZkVuZHNXaXRoKAorCQkJCXRvU3RyaW5nKCBzZXBhcmF0b3IgKSwgc2VwYXJhdG9yKSApOworCX0KKworCWlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZygKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgc2VwYXJhdG9yID0gU0VQQVJBVE9SKSBjb25zdAorCXsKKwkJcmV0dXJuKCBFeGVjdXRpb25Db250ZXh0RmxhZ3M6OnN0clJlYWNoZWRMaW1pdCgKKwkJCQkJCWxpbWl0ICwgc2VwYXJhdG9yICkgKworCQkJCUV4ZWN1dGlvbkNvbnRleHRGbGFnczo6c3RySW50ZXJydXB0UmVxdWVzdCgKKwkJCQkJCWludGVycnVwdCAsIHNlcGFyYXRvciApICsKKwkJCQlFeGVjdXRpb25Db250ZXh0RmxhZ3M6OnN0ckV4ZWN1dGlvblRyYWNlKAorCQkJCQkJZXhlY3V0aW9uICwgc2VwYXJhdG9yICkgKworCQkJCUV4ZWN1dGlvbkNvbnRleHRGbGFnczo6c3RyQW5hbHlzaXNUcmFjZSgKKwkJCQkJCWFuYWx5c2lzICwgc2VwYXJhdG9yICkgKTsKKwl9CisKKworfTsKKworCitjbGFzcyBFeGVjdXRpb25Db250ZXh0RmxhZ3NJbXBsCit7CisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBBVFRSSUJVVEVTCisJICovCisJRXhlY3V0aW9uQ29udGV4dEZsYWdzIG1GbGFnczsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKi8KKwlFeGVjdXRpb25Db250ZXh0RmxhZ3NJbXBsKCkKKwk6IG1GbGFncyggKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJfkV4ZWN1dGlvbkNvbnRleHRGbGFnc0ltcGwoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogR0VUVEVSCisJICogbUZsYWdzCisJICovCisJaW5saW5lIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHRGbGFncyAmIGdldEZsYWdzKCkgY29uc3QKKwl7CisJCXJldHVybiggbUZsYWdzICk7CisJfQorCisJaW5saW5lIEV4ZWN1dGlvbkNvbnRleHRGbGFncyAmIGdldHdGbGFncygpCisJeworCQlyZXR1cm4oIG1GbGFncyApOworCX0KKworCWlubGluZSBib29sIGhhc0ZsYWdzKCkgY29uc3QKKwl7CisJCXJldHVybiggbUZsYWdzLmlzRGVmaW5lZCgpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0RmxhZ3MoY29uc3QgRXhlY3V0aW9uQ29udGV4dEZsYWdzICYgZmxhZ3MpCisJeworCQltRmxhZ3MgPSBmbGFnczsKKwl9CisKK307CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKiBGTUxfUlVOVElNRV9FWEVDVVRJT05DT05URVhURkxBR1NfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL0V4ZWN1dGlvbkRhdGEuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3J1bnRpbWUvRXhlY3V0aW9uRGF0YS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEzMDBhMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL0V4ZWN1dGlvbkRhdGEuY3BwCkBAIC0wLDAgKzEsMTAyNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuDQorICoNCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyDQorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2luY2x1ZGUgIkV4ZWN1dGlvbkRhdGEuaCINCisNCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvQmFzZUluc3RhbmNlRm9ybS5oPg0KKw0KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25Db25maWd1cmF0aW9uLmg+DQorI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkNvbnRleHQuaD4NCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvUnVudGltZURlZi5oPg0KKw0KKyNpbmNsdWRlIDxib29zdC9mb3JtYXQuaHBwPg0KKw0KKw0KK25hbWVzcGFjZSBzZXANCit7DQorDQorDQorLypBVFRSSUJVVEVTKi8NCithdm1fc2l6ZV90IEV4ZWN1dGlvbkRhdGE6OlBBUkFNX01BQ0hJTkVfUlVOVElNRV9PRkZTRVQgPSAwOw0KK2F2bV9zaXplX3QgRXhlY3V0aW9uRGF0YTo6U1lTVEVNX1JVTlRJTUVfT0ZGU0VUICAgICAgICA9IDE7DQorDQorDQorDQorLyoqDQorICogR0VUVEVSDQorICogbVRhYmxlT2ZSdW50aW1lRm9ybQ0KKyAqLw0KKw0KK2NvbnN0IFJ1bnRpbWVJRCAmIEV4ZWN1dGlvbkRhdGE6OmdldFJ1bnRpbWVJRCgNCisJCWNvbnN0IEV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlKSBjb25zdA0KK3sNCisJVGFibGVPZlJ1bnRpbWVUOjpjb25zdF9pdGVyYXRvciBpdCA9IG1UYWJsZU9mUnVudGltZS5iZWdpbigpOw0KKwlUYWJsZU9mUnVudGltZVQ6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gbVRhYmxlT2ZSdW50aW1lLmVuZCgpOw0KKwlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkNCisJew0KKwkJaWYoICgqaXQpLT5nZXRSSUQoKS5nZXRFeGVjdXRhYmxlKCkgPT0gYW5FeGVjdXRhYmxlICkNCisJCXsNCisJCQlyZXR1cm4oICgqaXQpLT5nZXRSSUQoKSApOw0KKwkJfQ0KKwl9DQorDQorCXJldHVybiggUnVudGltZUlEOjpSRUZfTlVMTCApOw0KK30NCisNCisNCitjb25zdCBSdW50aW1lSUQgJiBFeGVjdXRpb25EYXRhOjpnZXRSdW50aW1lSUQoDQorCQlJbnN0YW5jZU9mTWFjaGluZSAqIGFuSW5zdGFuY2UpIGNvbnN0DQorew0KKwlpZiggYW5JbnN0YW5jZS0+aGFzUnVudGltZVJJRCgpICkNCisJew0KKwkJcmV0dXJuKCBhbkluc3RhbmNlLT5nZXRSdW50aW1lUklEKCkgKTsNCisJfQ0KKwllbHNlIGlmKCBhbkluc3RhbmNlLT5pc0FsaWFzKCkgKQ0KKwl7DQorCQlpZiggYW5JbnN0YW5jZS0+aGFzQWxpYXNUYXJnZXQoKSAmJg0KKwkJCQlhbkluc3RhbmNlLT5nZXRBbGlhc1RhcmdldCgpLT5hczwgSW5zdGFuY2VPZk1hY2hpbmUgPigpLT4NCisJCQkJCQloYXNSdW50aW1lUklEKCkgKQ0KKwkJew0KKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIHRtcFJJRCA9DQorCQkJCQlhbkluc3RhbmNlLT5nZXRBbGlhc1RhcmdldCgpLT5nZXRSdW50aW1lQ29udGFpbmVyUklEKCk7DQorDQorCQkJYW5JbnN0YW5jZS0+c2V0UnVudGltZVJJRCggdG1wUklEICk7DQorDQorCQkJcmV0dXJuKCB0bXBSSUQgKTsNCisJCX0NCisNCisJCUFycmF5T2ZJbnN0YW5jZU9mTWFjaGluZTo6aXRlcmF0b3IgaXQgPQ0KKwkJCQlhbkluc3RhbmNlLT5nZXRNYWNoaW5lUGF0aCgpLT5iZWdpbigpOw0KKw0KKwkJUnVudGltZUlEIHRtcFJJRCA9IG1SSUQ7DQorDQorCQkvLyBTRUFSQ0ggb2YgdGhlIExDQShSSUQpIG9mIHRoZSBjdXJyZW50IFJJRCBhbiB0aGUgQUxJQVMgY29udGFpbmVyDQorCQl0bXBSSUQgPSB0bXBSSUQuZ2V0QW5jZXN0b3JDb250YWluaW5nKCAqaXQgKTsNCisJCWlmKCB0bXBSSUQudmFsaWQoKSApDQorCQl7DQorCQkJQXJyYXlPZkluc3RhbmNlT2ZNYWNoaW5lOjppdGVyYXRvciBpdEVuZCA9DQorCQkJCQlhbkluc3RhbmNlLT5nZXRNYWNoaW5lUGF0aCgpLT5lbmQoKTsNCisNCisJCQkvLyBVc2Ugb2YgQWxpYXMgUEFUSCB0byBmaW5kIHRoZSBJTlNUQU5DRSBvZiB2YXJpYWJsZQ0KKwkJCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQ0KKwkJCXsNCisJCQkJdG1wUklEID0gZ2V0UnVudGltZSh0bXBSSUQpLmdldENoaWxkKCgqaXQpLT5nZXRPZmZzZXQoKSk7DQorCQkJfQ0KKw0KKwkJCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCgNCisJCQkJdG1wUklELmdldEV4ZWN1dGFibGUoKS0+Z2V0QnVmZmVyKCkuYXQoIGFuSW5zdGFuY2UNCisJCQkJLT5nZXRPZmZzZXQoKSApLmlzQXN0RWxlbWVudCggYW5JbnN0YW5jZS0+Z2V0QXN0RWxlbWVudCgpICkgKQ0KKwkJCQkJPDwgIkFzc2lnbiBlcnJvciAiIDw8IHRtcFJJRC5nZXRFeGVjdXRhYmxlKCktPmdldEJ1ZmZlcigpLmF0KA0KKwkJCQkJCQlhbkluc3RhbmNlLT5nZXRPZmZzZXQoKSkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQ0KKwkJCQkJPDwgIiAhPSAiIDw8IGFuSW5zdGFuY2UtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkNCisJCQkJCTw8IFNFTkRfRVhJVDsNCisNCisJCQlyZXR1cm4oIGdldFJ1bnRpbWUodG1wUklEKS5nZXRDaGlsZChhbkluc3RhbmNlLT5nZXRPZmZzZXQoKSkgKTsNCisJCX0NCisJfQ0KKw0KKy8vCWlmKCBhbkluc3RhbmNlLT5nZXRTcGVjaWZpZXIoKS5pc0Rlc2lnbkluc3RhbmNlU3RhdGljKCkgKQ0KKwl7DQorCQlmb3IoIFJ1bnRpbWVJRCBhUklEID0gbVJJRCA7IGFSSUQudmFsaWQoKSA7IGFSSUQgPSBhUklELmdldFBSSUQoKSApDQorCQl7DQorCQkJaWYoIGFuSW5zdGFuY2UtPmdldENvbnRhaW5lcigpID09IGFSSUQuZ2V0RXhlY3V0YWJsZSgpICkNCisJCQl7DQorCQkJCXJldHVybiggZ2V0UnVudGltZShhUklEKS5nZXRDaGlsZChhbkluc3RhbmNlLT5nZXRPZmZzZXQoKSkgKTsNCisJCQl9DQorCQl9DQorCX0NCisvLwllbHNlIGlmKCBhbkluc3RhbmNlLT5nZXRTcGVjaWZpZXIoKS5pc0Rlc2lnbk1vZGVsKCkgKQ0KKy8vCXsNCisvLwkJcmV0dXJuKCBtVGFibGVPZlJ1bnRpbWVGb3JtLT5nZXRSSUQoYW5JbnN0YW5jZS0+Z2V0RXhlY3V0YWJsZSgpKSApOw0KKy8vCX0NCisNCisJVGFibGVPZlJ1bnRpbWVUOjpjb25zdF9pdGVyYXRvciBpdCA9IG1UYWJsZU9mUnVudGltZS5iZWdpbigpOw0KKwlUYWJsZU9mUnVudGltZVQ6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gbVRhYmxlT2ZSdW50aW1lLmVuZCgpOw0KKwlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkNCisJew0KKwkJaWYoICgqaXQpLT5nZXRSSUQoKS5nZXRJbnN0YW5jZSgpID09IGFuSW5zdGFuY2UgKQ0KKwkJew0KKwkJCXJldHVybiggKCppdCktPmdldFJJRCgpICk7DQorCQl9DQorCX0NCisNCisJcmV0dXJuKCBSdW50aW1lSUQ6OlJFRl9OVUxMICk7DQorfQ0KKw0KKw0KK2NvbnN0IFJ1bnRpbWVJRCAmIEV4ZWN1dGlvbkRhdGE6OmdldFJ1bnRpbWVJRCgNCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEKSBjb25zdA0KK3sNCisJVGFibGVPZlJ1bnRpbWVUOjpjb25zdF9pdGVyYXRvciBpdCA9IG1UYWJsZU9mUnVudGltZS5iZWdpbigpOw0KKwlUYWJsZU9mUnVudGltZVQ6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gbVRhYmxlT2ZSdW50aW1lLmVuZCgpOw0KKwlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkNCisJew0KKwkJaWYoIE5hbWVkRWxlbWVudDo6Y29tcGFyZUxvY2F0aW9uKA0KKwkJCQkoKml0KS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSwgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEKSApDQorCQl7DQorCQkJcmV0dXJuKCAoKml0KS0+Z2V0UklEKCkgKTsNCisJCX0NCisJfQ0KKw0KKwlyZXR1cm4oIFJ1bnRpbWVJRDo6UkVGX05VTEwgKTsNCit9DQorDQorY29uc3QgUnVudGltZUlEICYgRXhlY3V0aW9uRGF0YTo6Z2V0UnVudGltZUlEQnlOYW1lSUQoDQorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpIGNvbnN0DQorew0KKwlUYWJsZU9mUnVudGltZVQ6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbVRhYmxlT2ZSdW50aW1lLmJlZ2luKCk7DQorCVRhYmxlT2ZSdW50aW1lVDo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBtVGFibGVPZlJ1bnRpbWUuZW5kKCk7DQorCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQ0KKwl7DQorCQlpZiggKCppdCktPmdldE5hbWVJRCgpID09IGFOYW1lSUQgKQ0KKwkJew0KKwkJCXJldHVybiggKCppdCktPmdldFJJRCgpICk7DQorCQl9DQorCX0NCisNCisJcmV0dXJuKCBSdW50aW1lSUQ6OlJFRl9OVUxMICk7DQorfQ0KKw0KKw0KK1J1bnRpbWVJRCBFeGVjdXRpb25EYXRhOjpnZXRSdW50aW1lQ29udGFpbmVyUklEKA0KKwkJY29uc3QgUnVudGltZUlEICYgYVJJRCwgQmFzZUluc3RhbmNlRm9ybSAqIGFuSW5zdGFuY2UpIGNvbnN0DQorew0KKwlpZiggYW5JbnN0YW5jZS0+aGFzUnVudGltZUNvbnRhaW5lclJJRCgpICkNCisJew0KKwkJcmV0dXJuKCBhbkluc3RhbmNlLT5nZXRSdW50aW1lQ29udGFpbmVyUklEKCkgKTsNCisJfQ0KKwllbHNlIGlmKCBhbkluc3RhbmNlLT5pc0FsaWFzKCkgKQ0KKwl7DQorCQlSdW50aW1lSUQgdG1wUklEID0gYVJJRDsNCisNCisJCWlmKCBhbkluc3RhbmNlLT5oYXNBbGlhc1RhcmdldCgpICYmDQorCQkJCWFuSW5zdGFuY2UtPmdldEFsaWFzVGFyZ2V0KCktPmhhc1J1bnRpbWVDb250YWluZXJSSUQoKSApDQorCQl7DQorCQkJYW5JbnN0YW5jZS0+c2V0UnVudGltZUNvbnRhaW5lclJJRCggdG1wUklEID0NCisJCQkJCWFuSW5zdGFuY2UtPmdldEFsaWFzVGFyZ2V0KCktPmdldFJ1bnRpbWVDb250YWluZXJSSUQoKSApOw0KKw0KKwkJCXJldHVybiggdG1wUklEICk7DQorCQl9DQorDQorCQlBcnJheU9mSW5zdGFuY2VPZk1hY2hpbmU6Oml0ZXJhdG9yIGl0ID0NCisJCQkJYW5JbnN0YW5jZS0+Z2V0TWFjaGluZVBhdGgoKS0+YmVnaW4oKTsNCisNCisJCS8vIFNFQVJDSCBvZiB0aGUgTENBKFJJRCkgb2YgdGhlIGN1cnJlbnQgUklEIGFuIHRoZSBBTElBUyBjb250YWluZXINCisJCXRtcFJJRCA9IHRtcFJJRC5nZXRBbmNlc3RvckNvbnRhaW5pbmcoICppdCApOw0KKwkJaWYoIHRtcFJJRC52YWxpZCgpICkNCisJCXsNCisJCQlBcnJheU9mSW5zdGFuY2VPZk1hY2hpbmU6Oml0ZXJhdG9yIGl0RW5kID0NCisJCQkJCWFuSW5zdGFuY2UtPmdldE1hY2hpbmVQYXRoKCktPmVuZCgpOw0KKw0KKwkJCS8vIFVzZSBvZiBBbGlhcyBQQVRIIHRvIGZpbmQgdGhlIElOU1RBTkNFIG9mIHZhcmlhYmxlDQorCQkJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApDQorCQkJew0KKwkJCQl0bXBSSUQgPSBnZXRSdW50aW1lRm9ybUNoaWxkKHRtcFJJRCwgKCppdCkpOw0KKwkJCX0NCisNCisJCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoDQorCQkJCXRtcFJJRC5nZXRFeGVjdXRhYmxlKCktPmdldEJ1ZmZlcigpLmF0KCBhbkluc3RhbmNlDQorCQkJCS0+Z2V0T2Zmc2V0KCkgKS5pc0FzdEVsZW1lbnQoIGFuSW5zdGFuY2UtPmdldEFzdEVsZW1lbnQoKSApICkNCisJCQkJCTw8ICJBc3NpZ24gZXJyb3IgIiA8PCB0bXBSSUQuZ2V0RXhlY3V0YWJsZSgpLT5nZXRCdWZmZXIoKS4NCisJCQkJCQlhdChhbkluc3RhbmNlLT5nZXRPZmZzZXQoKSkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQ0KKwkJCQkJPDwgIiAhPSAiIDw8IGFuSW5zdGFuY2UtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkNCisJCQkJCTw8IFNFTkRfRVhJVDsNCisNCisJCQlyZXR1cm4oIHRtcFJJRCApOw0KKwkJfQ0KKwl9DQorCWVsc2UNCisJew0KKwkJLy8gU0VBUkNIIG9mIHRoZSBSVU5USU1FIEZPUk0gY29udGFpbmVyDQorCQkvLyB3aGVyZSB0aGlzIElOU1RBTkNFIG9mIHZhcmlhYmxlIHdhcyBkZWNsYXJlZA0KKwkJcmV0dXJuKCBhUklELmdldEFuY2VzdG9yQ29udGFpbmluZyggYW5JbnN0YW5jZSApICk7DQorCX0NCisNCisJcmV0dXJuKCBSdW50aW1lSUQ6OlJFRl9OVUxMICk7DQorfQ0KKw0KKw0KKy8qKg0KKyAqIEdFVFRFUg0KKyAqIGZvciBkYXRhIGluIFJ1bnRpbWVGb3JtIERhdGFUYWJsZQ0KKyAqLw0KKy8vY29uc3QgQkYgJiBFeGVjdXRpb25EYXRhOjpnZXREYXRhKGNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEKSBjb25zdA0KKy8vew0KKy8vCVRhYmxlT2ZSdW50aW1lVDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtVGFibGVPZlJ1bnRpbWUuYmVnaW4oKTsNCisvLwlUYWJsZU9mUnVudGltZVQ6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gbVRhYmxlT2ZSdW50aW1lLmVuZCgpOw0KKy8vCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQ0KKy8vCXsNCisvLwkJY29uc3QgQkYgJiBmb3VuZERhdGEgPSAoKml0KS0+Z2V0RGF0YShhRnVsbHlRdWFsaWZpZWROYW1lSUQpOw0KKy8vCQlpZiggZm91bmREYXRhLnZhbGlkKCkgKQ0KKy8vCQl7DQorLy8JCQlyZXR1cm4oIGZvdW5kRGF0YSApOw0KKy8vCQl9DQorLy8JfQ0KKy8vDQorLy8JcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsNCisvL30NCisNCitjb25zdCBCRiAmIEV4ZWN1dGlvbkRhdGE6OmdldERhdGFCeVF1YWxpZmllZE5hbWVJRCgNCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCwgSW5zdGFuY2VPZkRhdGEgKiAmIHZhcikgY29uc3QNCit7DQorCVRhYmxlT2ZSdW50aW1lVDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtVGFibGVPZlJ1bnRpbWUuYmVnaW4oKTsNCisJVGFibGVPZlJ1bnRpbWVUOjpjb25zdF9pdGVyYXRvciBpdEVuZCA9IG1UYWJsZU9mUnVudGltZS5lbmQoKTsNCisJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApDQorCXsNCisJCWNvbnN0IEJGICYgZm91bmREYXRhID0NCisJCQkJICgqaXQpLT5nZXREYXRhQnlRdWFsaWZpZWROYW1lSUQoYVF1YWxpZmllZE5hbWVJRCwgdmFyKTsNCisJCWlmKCBmb3VuZERhdGEudmFsaWQoKSApDQorCQl7DQorCQkJcmV0dXJuKCBmb3VuZERhdGEgKTsNCisJCX0NCisJfQ0KKw0KKwlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOw0KK30NCisNCitjb25zdCBCRiAmIEV4ZWN1dGlvbkRhdGE6OmdldERhdGFCeU5hbWVJRChjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpIGNvbnN0DQorew0KKwlUYWJsZU9mUnVudGltZVQ6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbVRhYmxlT2ZSdW50aW1lLmJlZ2luKCk7DQorCVRhYmxlT2ZSdW50aW1lVDo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBtVGFibGVPZlJ1bnRpbWUuZW5kKCk7DQorCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQ0KKwl7DQorCQljb25zdCBCRiAmIGZvdW5kRGF0YSA9ICgqaXQpLT5nZXREYXRhQnlOYW1lSUQoYU5hbWVJRCk7DQorCQlpZiggZm91bmREYXRhLnZhbGlkKCkgKQ0KKwkJew0KKwkJCXJldHVybiggZm91bmREYXRhICk7DQorCQl9DQorCX0NCisNCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsNCit9DQorDQorDQorLyoqDQorICogR0VUVEVSDQorICogbVNhdmVUYWJsZU9mQXNzaWduZWRGbGFnDQorICovDQorVGFibGVPZlJ1bnRpbWVGb3JtU3RhdGU6OlRhYmxlT2ZBc3NpZ25lZEZsYWcNCitFeGVjdXRpb25EYXRhOjpnZXRTYXZlVGFibGVPZkFzc2lnbmVkRmxhZygpIGNvbnN0DQorew0KKwlyZXR1cm4oIG1FeGVjdXRpb25Db250ZXh0LT5nZXRUYWJsZU9mQXNzaWduZWRGbGFnKCkgKTsNCit9DQorDQorDQorDQorLyoqDQorICogR0VUVEVSDQorICogdGFibGVPZlJ1bnRpbWVGb3JtU3RhdGUNCisgKi8NCitib29sIEV4ZWN1dGlvbkRhdGE6OmNoZWNrUnVubmluZ0Zvcm0oY29uc3QgQkYgJiBhUnVubmFibGVFbGVtZW50VHJhY2UsDQorCQljb25zdCBSdW50aW1lSUQgJiBhUklEKQ0KK3sNCisJaWYoIGFSdW5uYWJsZUVsZW1lbnRUcmFjZS5pczwgRXhlY3V0aW9uQ29uZmlndXJhdGlvbiA+KCkgKQ0KKwl7DQorCQlFeGVjdXRpb25Db25maWd1cmF0aW9uICogYW5FeGVjQ29uZiA9DQorCQkJCWFSdW5uYWJsZUVsZW1lbnRUcmFjZS50b19wdHI8IEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24gPigpOw0KKw0KKwkJcmV0dXJuKCBhbkV4ZWNDb25mLT5nZXRSdW50aW1lSUQoKSA9PSBhUklEICk7DQorCX0NCisNCisJZWxzZSBpZiggYVJ1bm5hYmxlRWxlbWVudFRyYWNlLmlzPCBBdm1Db2RlID4oKSApDQorCXsNCisJCUF2bUNvZGUgKiBhQ29kZSA9IGFSdW5uYWJsZUVsZW1lbnRUcmFjZS50b19wdHI8IEF2bUNvZGUgPigpOw0KKw0KKwkJZm9yKCBBdm1Db2RlOjppdGVyYXRvciBpdCA9IGFDb2RlLT5iZWdpbigpIDsgaXQgIT0gYUNvZGUtPmVuZCgpIDsgKytpdCApDQorCQl7DQorCQkJaWYoIGNoZWNrUnVubmluZ0Zvcm0oKml0LCBhUklEKSApDQorCQkJew0KKwkJCQlyZXR1cm4oIHRydWUgKTsNCisJCQl9DQorCQl9DQorCX0NCisNCisJcmV0dXJuKCBmYWxzZSk7DQorfQ0KKw0KKw0KKy8qKg0KKyAqIElOU1RBTkNJQVRJT04gQk9VTkQgVEVTVA0KKyAqLw0KK2Jvb2wgRXhlY3V0aW9uRGF0YTo6Y291bGRCZUluc3RhbmNpYXRlZChJbnN0YW5jZU9mTWFjaGluZSAqIGFuSW5zdGFuY2UpIGNvbnN0DQorew0KKwlFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZSA9IGFuSW5zdGFuY2UtPmdldEV4ZWN1dGFibGUoKTsNCisNCisJaWYoIGFuRXhlY3V0YWJsZS0+aGFzTWF4aW1hbEluc3RhbmNlKCkgKQ0KKwl7DQorCQlhdm1fc2l6ZV90IGFuSW5zdGFuY2lhdGlvbkNvdW50ID0gMDsNCisNCisJCVRhYmxlT2ZSdW50aW1lVDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtVGFibGVPZlJ1bnRpbWUuYmVnaW4oKTsNCisJCVRhYmxlT2ZSdW50aW1lVDo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBtVGFibGVPZlJ1bnRpbWUuZW5kKCk7DQorCQlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkNCisJCXsNCisJCQlpZiggKCppdCktPmdldEV4ZWN1dGFibGUoKSA9PSBhbkV4ZWN1dGFibGUgKQ0KKwkJCXsNCisJCQkJKythbkluc3RhbmNpYXRpb25Db3VudDsNCisJCQl9DQorCQl9DQorDQorLy8hIVtUUkFDRV06IHRvIGRlbGV0ZQ0KKy8vQVZNX09TX0RFQlVHIDw8ICJJbnN0YW5jaWF0aW9uIENvdW50OiAiIDw8IGFuSW5zdGFuY2lhdGlvbkNvdW50DQorLy8JCTw8ICIgPzw9PyBtYXg6ICIgPDwgYW5FeGVjdXRhYmxlLT5nZXRNYXhpbWFsSW5zdGFuY2VDb3VudCgpIDw8IHN0ZDo6ZW5kbDsNCisNCisJCXJldHVybiggYW5JbnN0YW5jaWF0aW9uQ291bnQgPD0gYW5FeGVjdXRhYmxlLT5nZXRNYXhpbWFsSW5zdGFuY2VDb3VudCgpICk7DQorCX0NCisNCisJcmV0dXJuKCB0cnVlICk7DQorfQ0KKw0KKw0KKw0KKw0KKy8qKg0KKyAqIHN0cmluZyBvZiBhIHN0YXRlIGNvbmZpZ3VyYXRpb24gb2YgYW4gRXhlY3V0aW9uRGF0YQ0KKyAqLw0KK3ZvaWQgRXhlY3V0aW9uRGF0YTo6dG9TdHJlYW1TdGF0ZUlkbGVPclJ1bm5pbmcoDQorCQlPdXRTdHJlYW0gJiBvcywgY29uc3QgUnVudGltZUZvcm0gJiBhUkYpIGNvbnN0DQorew0KKwlpZiggYVJGLmhhc09uU2NoZWR1bGUoKQ0KKwkJJiYgYVJGLmdldE9uU2NoZWR1bGUoKS0+c2luZ2xldG9uKCkNCisJCSYmIGFSRi5nZXRPblNjaGVkdWxlKCktPmZpcnN0KCkuaXM8IFJ1bnRpbWVJRCA+KCkNCisJCS8qJiYgKGFSRi5nZXRSSUQoKSAhPSBhUkYuZ2V0T25TY2hlZHVsZSgpLT5maXJzdCgpLmJmUklEKCkpKi8gKQ0KKwl7DQorCQlpZiggYVJGLmdldEV4ZWN1dGFibGUoKS0+aGFzVHJhbnNpdGlvbigpICkNCisJCXsNCisJCQlvcyA8PCBhUkYuZ2V0UklEKCkuc3RyVW5pcUlkKCkgPDwgIiAoICI7DQorCQl9DQorDQorCQlpZiggaXNJZGxlT3JSdW5uaW5nKGFSRi5nZXRPblNjaGVkdWxlKCktPmZpcnN0KCkuYmZSSUQoKSkgKQ0KKwkJew0KKwkJCXRvU3RyZWFtU3RhdGVJZGxlT3JSdW5uaW5nKG9zLA0KKwkJCQkJZ2V0UnVudGltZShhUkYuZ2V0T25TY2hlZHVsZSgpLT5maXJzdCgpLmJmUklEKCkpICk7DQorDQorCQkJaWYoIGFSRi5nZXRFeGVjdXRhYmxlKCktPmhhc1RyYW5zaXRpb24oKSApDQorCQkJew0KKwkJCQlvcyA8PCAiICkiOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwllbHNlIGlmKCBhUkYuaGFzQ2hpbGQoKSApDQorCXsNCisJCVRhYmxlT2ZSdW50aW1lSUQ6OmNvbnN0X2l0ZXJhdG9yIGl0UklEID0gYVJGLmJlZ2luQ2hpbGQoKTsNCisJCVRhYmxlT2ZSdW50aW1lSUQ6OmNvbnN0X2l0ZXJhdG9yIGl0UklERW5kID0gYVJGLmVuZENoaWxkKCk7DQorDQorCQlpZiggYVJGLmdldEV4ZWN1dGFibGUoKS0+aGFzVHJhbnNpdGlvbigpICkNCisJCXsNCisJCQlvcyA8PCBhUkYuZ2V0UklEKCkuc3RyVW5pcUlkKCkgPDwgIiAiOw0KKwkJfQ0KKw0KKwkJYm9vbCBuZWVkQ29tYSA9IGZhbHNlOw0KKwkJZm9yKCA7IGl0UklEICE9IGl0UklERW5kIDsgKytpdFJJRCApDQorCQl7DQorCQkJaWYoIGlzSWRsZU9yUnVubmluZyggKml0UklEICkgKQ0KKwkJCXsNCisJCQkJaWYoIG5lZWRDb21hICkNCisJCQkJew0KKwkJCQkJb3MgPDwgIiAsICI7DQorCQkJCX0NCisJCQkJZWxzZQ0KKwkJCQl7DQorCQkJCQlvcyA8PCAiKCAiOw0KKwkJCQkJbmVlZENvbWEgPSB0cnVlOw0KKwkJCQl9DQorCQkJCXRvU3RyZWFtU3RhdGVJZGxlT3JSdW5uaW5nKG9zLCBnZXRSdW50aW1lKCppdFJJRCkpOw0KKwkJCX0NCisJCX0NCisJCWlmKCBuZWVkQ29tYSApDQorCQl7DQorCQkJb3MgPDwgIiApIjsNCisJCX0NCisJfQ0KKwllbHNlDQorCXsNCisJCW9zIDw8IGFSRi5nZXRSSUQoKS5zdHJVbmlxSWQoKTsNCisJfQ0KK30NCisNCisNCisvKioNCisgKiBzdHJpbmcgb2YgYSBzdGF0ZSBjb25maWd1cmF0aW9uIG9mIGFuIEV4ZWN1dGlvbkRhdGENCisgKg0KKyAqIExJRkVMSU5FIFNUQVRFIElERU5USUZJRVINCisgKiAlMSUgLS0+IGxpZmVsaW5lIHJ1bnRpbWUgcGlkDQorICogJTIlIC0tPiBsaWZlbGluZSBpZGVudGlmaWVyDQorICogJTMlIC0tPiBzdGF0ZSBydW50aW1lIHBpZA0KKyAqICU0JSAtLT4gc3RhdGUgaWRlbnRpZmllcg0KKyAqLw0KK091dFN0cmVhbSAmIEV4ZWN1dGlvbkRhdGE6OnRvU3RyZWFtTGlmZWxpbmVTdGF0ZUZvcm1hdCgNCisJCU91dFN0cmVhbSAmIG9zLCBjb25zdCBSdW50aW1lRm9ybSAmIGFSRiwNCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgZm9ybWF0TGlmZWxpbmVTdGF0ZVBhdHRlcm4pIGNvbnN0DQorew0KKwlib29zdDo6Zm9ybWF0IGZvcm1hdHRlcihmb3JtYXRMaWZlbGluZVN0YXRlUGF0dGVybik7DQorCWZvcm1hdHRlci5leGNlcHRpb25zKCBib29zdDo6aW86Om5vX2Vycm9yX2JpdHMgKTsNCisNCisJUnVudGltZUlEIHJpZExpZmVsaW5lID0gYVJGLmdldFJJRCgpLmdldExpZmVsaW5lKCk7DQorDQorCW9zIDw8IGZvcm1hdHRlcg0KKwkJCSUgcmlkTGlmZWxpbmUuc3RyUGlkKCkNCisJCQklIHJpZExpZmVsaW5lLmdldEluc3RhbmNlKCktPmdldE5hbWVJRCgpDQorCQkJJSBhUkYuZ2V0UklEKCkuc3RyUGlkKCkNCisJCQklIGFSRi5nZXRSSUQoKS5nZXROYW1lSUQoKTsNCisNCisJcmV0dXJuKCBvcyApOw0KK30NCisNCisNCit2b2lkIEV4ZWN1dGlvbkRhdGE6OnRvU3RyZWFtU3RhdGVDb25mKA0KKwkJT3V0U3RyZWFtICYgb3MsIGNvbnN0IFJ1bnRpbWVGb3JtICYgYVJGLA0KKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBmb3JtYXRMaWZlbGluZVN0YXRlUGF0dGVybikgY29uc3QNCit7DQorCWlmICggYVJGLmhhc09uU2NoZWR1bGUoKSApDQorCXsNCisJCWlmKCBhUkYuZ2V0T25TY2hlZHVsZSgpLT5zaW5nbGV0b24oKQ0KKwkJCSYmIGFSRi5nZXRPblNjaGVkdWxlKCktPmZpcnN0KCkuaXM8IFJ1bnRpbWVJRCA+KCkNCisJCQkmJiAoYVJGLmdldFJJRCgpICE9IGFSRi5nZXRPblNjaGVkdWxlKCktPmZpcnN0KCkuYmZSSUQoKSkgKQ0KKwkJew0KKwkJCWlmKCBhUkYuZ2V0RXhlY3V0YWJsZSgpLT5oYXNUcmFuc2l0aW9uKCkgKQ0KKwkJCXsNCisJCQkJdG9TdHJlYW1MaWZlbGluZVN0YXRlRm9ybWF0KG9zLCBhUkYsIGZvcm1hdExpZmVsaW5lU3RhdGVQYXR0ZXJuKQ0KKwkJCQkJCTw8ICIgKCAiOw0KKwkJCX0NCisNCisJCQl0b1N0cmVhbVN0YXRlQ29uZihvcywNCisJCQkJCWdldFJ1bnRpbWUoIGFSRi5nZXRPblNjaGVkdWxlKCktPmZpcnN0KCkuYmZSSUQoKSApLA0KKwkJCQkJZm9ybWF0TGlmZWxpbmVTdGF0ZVBhdHRlcm4gKTsNCisNCisJCQlpZiggYVJGLmdldEV4ZWN1dGFibGUoKS0+aGFzVHJhbnNpdGlvbigpICkNCisJCQl7DQorCQkJCW9zIDw8ICIgKSI7DQorCQkJfQ0KKw0KKwkJCXJldHVybjsNCisJCX0NCisJfQ0KKw0KKwlpZiggYVJGLmhhc0NoaWxkKCkgKQ0KKwl7DQorCQlUYWJsZU9mUnVudGltZUlEOjpjb25zdF9pdGVyYXRvciBpdFJJRCA9IGFSRi5iZWdpbkNoaWxkKCk7DQorCQlUYWJsZU9mUnVudGltZUlEOjpjb25zdF9pdGVyYXRvciBpdFJJREVuZCA9IGFSRi5lbmRDaGlsZCgpOw0KKw0KKwkJaWYoIGFSRi5nZXRFeGVjdXRhYmxlKCktPmhhc1RyYW5zaXRpb24oKSApDQorCQl7DQorCQkJdG9TdHJlYW1MaWZlbGluZVN0YXRlRm9ybWF0KG9zLCBhUkYsIGZvcm1hdExpZmVsaW5lU3RhdGVQYXR0ZXJuKQ0KKwkJCQkJPDwgIiAiOw0KKwkJfQ0KKw0KKwkJb3MgPDwgIiggIjsNCisJCWZvciggYm9vbCBuZWVkQ29tYSA9IGZhbHNlIDsgaXRSSUQgIT0gaXRSSURFbmQgOyArK2l0UklEICkNCisJCXsNCisJCQlpZiggKCppdFJJRCkuZ2V0RXhlY3V0YWJsZSgpLT5oYXNPbkluaXRPckVuYWJsZU9yUnVuKCkgKQ0KKwkJCXsNCisJCQkJaWYoIGlzUnVubmFibGUoICppdFJJRCApIHx8IGlzRmluYWxpemVkT3JEZXN0cm95ZWQoICppdFJJRCApICkNCisJCQkJew0KKwkJCQkJaWYoIG5lZWRDb21hICkNCisJCQkJCXsNCisJCQkJCQlvcyA8PCAiICwgIjsNCisJCQkJCX0NCisJCQkJCWVsc2UNCisJCQkJCXsNCisJCQkJCQluZWVkQ29tYSA9IHRydWU7DQorCQkJCQl9DQorCQkJCQl0b1N0cmVhbVN0YXRlQ29uZihvcywgZ2V0UnVudGltZSgqaXRSSUQpLA0KKwkJCQkJCQlmb3JtYXRMaWZlbGluZVN0YXRlUGF0dGVybiApOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJb3MgPDwgIiApIjsNCisJfQ0KKwllbHNlDQorCXsNCisJCWlmKCBpc0ZpbmFsaXplZCggYVJGLmdldFJJRCgpICkgKQ0KKwkJew0KKwkJCW9zIDw8ICI8ZmluYWw+IjsNCisJCX0NCisJCWVsc2UgaWYoIGlzRGVzdHJveWVkKCBhUkYuZ2V0UklEKCkgKSApDQorCQl7DQorCQkJb3MgPDwgIjxkZXN0cm95PiI7DQorCQl9DQorDQorCQl0b1N0cmVhbUxpZmVsaW5lU3RhdGVGb3JtYXQob3MsIGFSRiwgZm9ybWF0TGlmZWxpbmVTdGF0ZVBhdHRlcm4pOw0KKwl9DQorfQ0KKw0KKw0KKy8qKg0KKyAqIHN0cmluZyBvZiBhIHN0YXRlIGNvbmZpZ3VyYXRpb24gb2YgYW4gRXhlY3V0aW9uRGF0YSB0byBGc2NuDQorICovDQordm9pZCBFeGVjdXRpb25EYXRhOjp0b1N0cmVhbVN0YXRlQ29uZlRvRnNjbigNCisJCU91dFN0cmVhbSAmIG9zLCBjb25zdCBSdW50aW1lRm9ybSAmIGFSRikgY29uc3QNCit7DQorCWlmICggYVJGLmhhc09uU2NoZWR1bGUoKSApDQorCXsNCisJCWlmKCBhUkYuZ2V0T25TY2hlZHVsZSgpLT5zaW5nbGV0b24oKQ0KKwkJCSYmIGFSRi5nZXRPblNjaGVkdWxlKCktPmZpcnN0KCkuaXM8IFJ1bnRpbWVJRCA+KCkNCisJCQkmJiBnZXRSdW50aW1lKGFSRi5nZXRPblNjaGVkdWxlKCktPmZpcnN0KCkuYmZSSUQoKSkuaXNJbnN0YW5jaWF0ZWQoKSApDQorCQl7DQorCQkJdG9TdHJlYW1TdGF0ZUNvbmZUb0ZzY24ob3MsDQorCQkJCQlnZXRSdW50aW1lKCBhUkYuZ2V0T25TY2hlZHVsZSgpLT5maXJzdCgpLmJmUklEKCkgKSApOw0KKw0KKwkJCXJldHVybjsNCisJCX0NCisJfQ0KKw0KKwlpZiggYVJGLmhhc0NoaWxkKCkgKQ0KKwl7DQorCQlUYWJsZU9mUnVudGltZUlEOjpjb25zdF9pdGVyYXRvciBpdFJJRCA9IGFSRi5iZWdpbkNoaWxkKCk7DQorCQlUYWJsZU9mUnVudGltZUlEOjpjb25zdF9pdGVyYXRvciBpdFJJREVuZCA9IGFSRi5lbmRDaGlsZCgpOw0KKw0KKwkJb3MgPDwgIiggIiA7DQorCQlmb3IoIGJvb2wgbmVlZENvbWEgPSBmYWxzZSA7IGl0UklEICE9IGl0UklERW5kIDsgKytpdFJJRCApDQorCQl7DQorCQkJaWYoICgqaXRSSUQpLmdldEV4ZWN1dGFibGUoKS0+aGFzT25Jbml0T3JFbmFibGVPclJ1bigpDQorCQkJCSYmIGdldFJ1bnRpbWUoKml0UklEKS5pc0luc3RhbmNpYXRlZCgpICkNCisJCQl7DQorCQkJCWlmKCBuZWVkQ29tYSApDQorCQkJCXsNCisJCQkJCW9zIDw8ICIgLCAiOw0KKwkJCQl9DQorCQkJCWVsc2UNCisJCQkJew0KKwkJCQkJbmVlZENvbWEgPSB0cnVlOw0KKwkJCQl9DQorCQkJCXRvU3RyZWFtU3RhdGVDb25mVG9Gc2NuKG9zLCBnZXRSdW50aW1lKCgqaXRSSUQpKSApOw0KKwkJCX0NCisJCX0NCisJCW9zIDw8ICIgKSI7DQorCX0NCisJZWxzZQ0KKwl7DQorCQlvcyA8PCBhUkYuZ2V0UklEKCkuc3RyVW5pcUlkKCk7DQorCX0NCit9DQorDQorDQorLyoqDQorICogU2VyaWFsaXphdGlvbg0KKyAqLw0KK3ZvaWQgRXhlY3V0aW9uRGF0YTo6dG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0DQorew0KKwlvcyA8PCBUQUIgPDwgImVkIjsNCisNCisJY29uc3Qgc3RkOjpzdHJpbmcgY29uZiA9IHN0clN0YXRlQ29uZigpOw0KKwlpZiggY29uZlswXSA9PSAnKCcgKQ0KKwl7DQorCQlvcyA8PCBjb25mOw0KKwl9DQorCWVsc2UNCisJew0KKwkJb3MgPDwgJygnIDw8IGNvbmYgPDwgJyknOw0KKwl9DQorDQorCUFWTV9ERUJVR19SRUZfQ09VTlRFUihvcyk7DQorCW9zIDw8ICIgeyIgPDwgRU9MX0ZMVVNIOw0KKw0KKy8vCW9zIDw8IFRBQjIgPDwgIm5hbWUgPSBcIiIgPDwgc3RyU3RhdGVDb25mKCkgPDwgIlwiOyIgPDwgRU9MX0ZMVVNIOw0KKw0KKwlpZiAoIGhhc1J1bm5hYmxlRWxlbWVudFRyYWNlKCkgKQ0KKwl7DQorCQlvcyA8PCBUQUIyIDw8ICJmaXJlZCA9ICIgPDwgZ2V0UnVubmFibGVFbGVtZW50VHJhY2UoKS5zdHIoKQ0KKwkJCQk8PCAiOyIgPDwgRU9MX0ZMVVNIOw0KKwl9DQorDQorCWlmICggaGFzSU9FbGVtZW50VHJhY2UoKSApDQorCXsNCisJCW9zIDw8IFRBQjIgPDwgInRyYWNlID0gIiA8PCBnZXRJT0VsZW1lbnRUcmFjZSgpLnN0cigpIDw8ICI7IiA8PCBFT0xfRkxVU0g7DQorCX0NCisNCisJb3MgPDwgVEFCMiA8PCAiZXhlY19zdGF0dXMgPSAiDQorCQkJPDwgUnVudGltZURlZjo6c3RyQUVFUyggZ2V0QUVFUygpICkgPDwgIjsiIDw8IEVPTF9GTFVTSDsNCisNCisJaWYgKCBoYXNOb2RlQ29uZGl0aW9uKCkgJiYgZ2V0Tm9kZUNvbmRpdGlvbigpLmlzTm90RXF1YWxUcnVlKCkgKQ0KKwl7DQorCQlvcyA8PCBUQUIyIDw8ICJmaXJlZGNvbmRpdGlvbiA9ICINCisJCQkJPDwgZ2V0Tm9kZUNvbmRpdGlvbigpLndyYXBTdHIoIG9zLklOREVOVC50YWIyU2l6ZSgxOCkgKQ0KKwkJCQk8PCAiOyIgPDwgRU9MOw0KKwl9DQorDQorCWlmICggaGFzTm9kZVRpbWVkQ29uZGl0aW9uKCkgJiYNCisJCWdldE5vZGVUaW1lZENvbmRpdGlvbigpLmlzTm90RXF1YWxUcnVlKCkgKQ0KKwl7DQorCQlvcyA8PCBUQUIyIDw8ICJmaXJlZHRpbWVkY29uZGl0aW9uID0gIg0KKwkJCQk8PCBnZXROb2RlVGltZWRDb25kaXRpb24oKS53cmFwU3RyKCBvcy5JTkRFTlQudGFiMlNpemUoMjMpICkNCisJCQkJPDwgIjsiIDw8IEVPTDsNCisJfQ0KKw0KKwlpZiggaGFzUGF0aENvbmRpdGlvbigpICYmIGdldFBhdGhDb25kaXRpb24oKS5pc05vdEVxdWFsVHJ1ZSgpICkNCisJew0KKwkJb3MgPDwgVEFCMiA8PCAicGF0aGNvbmRpdGlvbiA9ICINCisJCQkJPDwgZ2V0UGF0aENvbmRpdGlvbigpLndyYXBTdHIoIG9zLklOREVOVC50YWIyU2l6ZSgxNykgKQ0KKwkJCQk8PCAiOyI7DQorCQlnZXRQYXRoQ29uZGl0aW9uKCkuQVZNX0RFQlVHX1JFRl9DT1VOVEVSKG9zKTsNCisJCW9zIDw8IEVPTF9GTFVTSDsNCisJfQ0KKwllbHNlIGlmKCBub3QgaGFzUGF0aENvbmRpdGlvbigpICkNCisJew0KKwkJb3MgPDwgVEFCMiA8PCAicGF0aGNvbmRpdGlvbiA9IE5VTEw7IiA8PCBFT0w7DQorCX0NCisNCisJaWYoIGhhc1BhdGhUaW1lZENvbmRpdGlvbigpICYmIGdldFBhdGhUaW1lZENvbmRpdGlvbigpLmlzTm90RXF1YWxUcnVlKCkgKQ0KKwl7DQorCQlvcyA8PCBUQUIyIDw8ICJwYXRodGltZWRjb25kaXRpb24gPSAiDQorCQkJCTw8IGdldFBhdGhUaW1lZENvbmRpdGlvbigpLndyYXBTdHIoIG9zLklOREVOVC50YWIyU2l6ZSgyMikgKQ0KKwkJCQk8PCAiOyI7DQorCQlnZXRQYXRoVGltZWRDb25kaXRpb24oKS5BVk1fREVCVUdfUkVGX0NPVU5URVIob3MpOw0KKwkJb3MgPDwgRU9MX0ZMVVNIOw0KKwl9DQorCWVsc2UgaWYoIG5vdCBoYXNQYXRoVGltZWRDb25kaXRpb24oKSApDQorCXsNCisJCW9zIDw8IFRBQjIgPDwgInBhdGh0aW1lZGNvbmRpdGlvbiA9IE5VTEw7IiA8PCBFT0w7DQorCX0NCisNCisJb3MgPDwgVEFCMiA8PCAiQGluaXR7IiA8PCBJTkNSMl9JTkRFTlQ7DQorCWdldE9uSW5pdCgpLT50b1N0cmVhbVJvdXRpbmUoIG9zICk7DQorCW9zIDw8IERFQ1IyX0lOREVOVF9UQUIyIDw8ICJ9IiA8PCBFT0xfRkxVU0g7DQorDQorCW9zIDw8IFRBQjIgPDwgIkBzY2hlZHVsZXsiIDw8IElOQ1IyX0lOREVOVDsNCisJZ2V0T25TY2hlZHVsZSgpLT50b1N0cmVhbVJvdXRpbmUoIG9zICk7DQorCW9zIDw8IERFQ1IyX0lOREVOVF9UQUIyIDw8ICJ9IiA8PCBFT0xfRkxVU0g7DQorDQorCW9zIDw8IFRBQjIgPDwgInJpZCA9ICIgPDwgZ2V0UklEKCkuc3RyKCkgPDwgIjsiIDw8IEVPTF9GTFVTSDsNCisNCisNCisvLwlpZiggaGFzUGFyYW0oKSApDQorLy8Jew0KKy8vCQlvcyA8PCBFT0w7DQorLy8JCW9zIDw8IFRBQiA8PCAicGFyYW1ldGVyOiI7DQorLy8JCXRhYmxlT2ZQYXJhbS0+QVZNX0RFQlVHX1JFRl9DT1VOVEVSKG9zKTsNCisvLwkJb3MgPDwgRU9MOw0KKy8vDQorLy8JCXRhYmxlT2ZQYXJhbS0+dG9TdHJlYW0ob3MpOw0KKy8vCX0NCisNCisNCisvL0FWTV9JRl9ERUJVR19FTkFCTEVEX0FORCggaGFzVGFibGVPZlJJRCgpICkNCisvLwlvcyA8PCBFT0w7DQorLy8NCisvLwlBVk1fSUZfREVCVUdfTEVWRUxfR1RfTUVESVVNDQorLy8JCW9zIDw8IFRBQiA8PCAicmlkOiIgPDwgRU9MX0lOQ1JfSU5ERU5UOw0KKy8vCQlUYWJsZU9mUnVudGltZUlEOjpjb25zdF9pdGVyYXRvciBpdCA9IG1UYWJsZU9mUklELT5iZWdpbigpOw0KKy8vCQlUYWJsZU9mUnVudGltZUlEOjpjb25zdF9pdGVyYXRvciBpdEVuZCA9IG1UYWJsZU9mUklELT5lbmQoKTsNCisvLwkJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApDQorLy8JCXsNCisvLwkJCSgqaXQpLnRvU3RyZWFtKG9zKTsNCisvLwkJfQ0KKy8vCQlvcyA8PCBERUNSX0lOREVOVDsNCisvLwlBVk1fRUxTRUlGX0RFQlVHX0xFVkVMX0dUX0xPVw0KKy8vCQlvcyA8PCBUQUIyIDw8ICJyaWQgPSBbfCAiOw0KKy8vCQlUYWJsZU9mUnVudGltZUlEOjpjb25zdF9pdGVyYXRvciBpdCA9IG1UYWJsZU9mUklELT5iZWdpbigpOw0KKy8vCQlUYWJsZU9mUnVudGltZUlEOjpjb25zdF9pdGVyYXRvciBpdEVuZCA9IG1UYWJsZU9mUklELT5lbmQoKTsNCisvLwkJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApDQorLy8JCXsNCisvLwkJCW9zIDw8ICgqaXQpLmdldE9mZnNldCgpIDw8ICIgIjsNCisvLwkJfQ0KKy8vCQlvcyA8PCAifF07IiA8PCBFT0xfRkxVU0g7DQorLy8JQVZNX0VORElGX0RFQlVHX0xFVkVMX0dUX0xPVw0KKy8vQVZNX0VORElGX0RFQlVHX0VOQUJMRURfQU5EDQorDQorDQorCWlmKCBoYXNMb2NhbFJ1bnRpbWVTdGFjaygpICkNCisJew0KKwkJb3MgPDwgRU9MX1RBQiA8PCAibG9jYWw6ICI7DQorCQlnZXRMb2NhbFJ1bnRpbWVzKCktPkFWTV9ERUJVR19SRUZfQ09VTlRFUihvcyk7DQorDQorCQlvcyA8PCBFT0xfSU5DUl9JTkRFTlQ7DQorCQlnZXRMb2NhbFJ1bnRpbWVzKCktPnRvU3RyZWFtKG9zKTsNCisJCW9zIDw8IERFQ1JfSU5ERU5UOw0KKwl9DQorDQorCWlmICggZ2V0VGFibGVPZlJ1bnRpbWUoKS5ub25lbXB0eSgpICkNCisJew0KKwkJb3MgPDwgRU9MX1RBQiA8PCAicnVudGltZSNzdGF0ZToiIDw8IEVPTF9JTkNSX0lOREVOVDsNCisJCW1UYWJsZU9mUkZTdGF0ZUZsYWdzLT50b1N0cmVhbSgqdGhpcywgb3MpOw0KKw0KKwkJb3MgPDwgRU9MX0RFQ1JfSU5ERU5UIDw8IFRBQiA8PCAicnVudGltZToiIDw8IEVPTF9JTkNSX0lOREVOVDsNCisNCitBVk1fSUZfREVCVUdfTEVWRUxfR1RFX01FRElVTQ0KKwkJVGFibGVPZlJ1bnRpbWVUOjpjb25zdF9pdGVyYXRvciBpdCA9IG1UYWJsZU9mUnVudGltZS5iZWdpbigpOw0KKwkJVGFibGVPZlJ1bnRpbWVUOjpjb25zdF9pdGVyYXRvciBpdEVuZCA9IG1UYWJsZU9mUnVudGltZS5lbmQoKTsNCisJCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQ0KKwkJew0KKwkJCSgqaXQpLT50b1N0cmVhbSh0aGlzLCBvcyk7DQorCQl9DQorQVZNX0VORElGX0RFQlVHX0xFVkVMX0dURV9NRURJVU0NCisNCisJCW9zIDw8IERFQ1JfSU5ERU5UOw0KKwl9DQorDQorCWlmKCBtU1RBVEVNRU5UX1FVRVVFLm5vbmVtcHR5KCkgKQ0KKwl7DQorCQlvcyA8PCBFT0xfSU5DUl9JTkRFTlQ7DQorCQltU1RBVEVNRU5UX1FVRVVFLnRvU3RyZWFtKG9zKTsNCisJCW9zIDw8IERFQ1JfSU5ERU5UOw0KKwl9DQorDQorCWlmKCBtRVhFQ19TWU5DX1BPSU5UICE9IE5VTEwgKQ0KKwl7DQorCQlvcyA8PCBFT0xfSU5DUl9JTkRFTlQ7DQorCQltRVhFQ19TWU5DX1BPSU5ULT50b1N0cmVhbShvcyk7DQorCQlvcyA8PCBERUNSX0lOREVOVDsNCisJfQ0KKw0KKwlvcyA8PCBUQUIgPDwgIn0iIDw8IEVPTF9GTFVTSDsNCit9DQorDQordm9pZCBFeGVjdXRpb25EYXRhOjp0b1N0cmVhbURhdGEoT3V0U3RyZWFtICYgb3MpIGNvbnN0DQorew0KKw0KKwlvcyA8PCBUQUIgPDwgImVkPGRhdGE+IjsNCisJQVZNX0RFQlVHX1JFRl9DT1VOVEVSKG9zKTsNCisJb3MgPDwgIiB7IiA8PCBFT0w7DQorDQorCW9zIDw8IFRBQjIgPDwgIm5hbWUgPSBcIiIgPDwgc3RyU3RhdGVDb25mKCkgPDwgIlwiOyIgPDwgRU9MX0ZMVVNIOw0KKw0KKw0KKwlpZiAoIGhhc1J1bm5hYmxlRWxlbWVudFRyYWNlKCkgKQ0KKwl7DQorCQlvcyA8PCBUQUIyIDw8ICJmaXJlZCA9ICIgPDwgZ2V0UnVubmFibGVFbGVtZW50VHJhY2UoKS5zdHIoKQ0KKwkJCQkJPDwgIjsiIDw8IEVPTF9GTFVTSDsNCisJfQ0KKw0KKwlpZiAoIGhhc0lPRWxlbWVudFRyYWNlKCkgKQ0KKwl7DQorCQlvcyA8PCBUQUIyIDw8ICJ0cmFjZSA9ICIgPDwgZ2V0SU9FbGVtZW50VHJhY2UoKS5zdHIoKSA8PCAiOyIgPDwgRU9MX0ZMVVNIOw0KKwl9DQorDQorCW9zIDw8IFRBQjIgPDwgImV4ZWNfc3RhdHVzID0gIg0KKwkJCTw8IFJ1bnRpbWVEZWY6OnN0ckFFRVMoIGdldEFFRVMoKSApIDw8ICI7IiA8PCBFT0xfRkxVU0g7DQorDQorCWlmICggaGFzTm9kZUNvbmRpdGlvbigpICYmIGdldE5vZGVDb25kaXRpb24oKS5pc05vdEVxdWFsVHJ1ZSgpICkNCisJew0KKwkJb3MgPDwgVEFCMiA8PCAibm9kZWNvbmRpdGlvbiA9ICINCisJCQkJPDwgZ2V0Tm9kZUNvbmRpdGlvbigpLndyYXBTdHIoIG9zLklOREVOVC50YWIyU2l6ZSgxOCkgKQ0KKwkJCQk8PCAiOyIgPDwgRU9MX0ZMVVNIOw0KKwl9DQorDQorCWlmICggaGFzUGF0aENvbmRpdGlvbigpICYmIGdldFBhdGhDb25kaXRpb24oKS5pc05vdEVxdWFsVHJ1ZSgpICkNCisJew0KKwkJb3MgPDwgVEFCMiA8PCAicGF0aGNvbmRpdGlvbiA9ICINCisJCQkJPDwgZ2V0UGF0aENvbmRpdGlvbigpLndyYXBTdHIoIG9zLklOREVOVC50YWIyU2l6ZSgxNykgKQ0KKwkJCQk8PCAiOyIgPDwgRU9MX0ZMVVNIOw0KKwl9DQorDQorCWlmKCBoYXNPbkluaXQoKSApDQorCXsNCisJCW9zIDw8IFRBQjIgPDwgIkBpbml0eyIgPDwgSU5DUjJfSU5ERU5UOw0KKwkJZ2V0T25Jbml0KCktPnRvU3RyZWFtUm91dGluZSggb3MgKTsNCisJCW9zIDw8IERFQ1IyX0lOREVOVF9UQUIyIDw8ICJ9IiA8PCBFT0xfRkxVU0g7DQorCX0NCisNCisJaWYoIGhhc09uU2NoZWR1bGUoKSApDQorCXsNCisJCW9zIDw8IFRBQjIgPDwgIkBzY2hlZHVsZXsiIDw8IElOQ1IyX0lOREVOVDsNCisJCWdldE9uU2NoZWR1bGUoKS0+dG9TdHJlYW1Sb3V0aW5lKCBvcyApOw0KKwkJb3MgPDwgREVDUjJfSU5ERU5UX1RBQjIgPDwgIn0iIDw8IEVPTF9GTFVTSDsNCisJfQ0KKw0KKy8vCWlmKCBoYXNQYXJhbSgpICkNCisvLwl7DQorLy8JCW9zIDw8IEVPTDsNCisvLwkJb3MgPDwgVEFCIDw8ICJwYXJhbWV0ZXI6IiA8PCBFT0w7DQorLy8JCXRhYmxlT2ZQYXJhbS0+dG9TdHJlYW0ob3MsIFRBQjIsIENIQVIsIEVPTCk7DQorLy8JfQ0KKw0KKwlpZiAoIGdldFRhYmxlT2ZSdW50aW1lKCkubm9uZW1wdHkoKSApDQorCXsNCisJCW9zIDw8IEVPTF9UQUIgPDwgInJ1bnRpbWU6IiA8PCBFT0xfSU5DUl9JTkRFTlQ7DQorDQorCQlUYWJsZU9mUnVudGltZVQ6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbVRhYmxlT2ZSdW50aW1lLmJlZ2luKCk7DQorCQlUYWJsZU9mUnVudGltZVQ6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gbVRhYmxlT2ZSdW50aW1lLmVuZCgpOw0KKwkJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApDQorCQl7DQorCQkJaWYoICgqaXQpLT5oYXNEYXRhVGFibGUoKSApDQorCQkJew0KKwkJCQkoKml0KS0+dG9TdHJlYW1EYXRhKHRoaXMsIG9zKTsNCisJCQl9DQorCQl9DQorDQorCQlvcyA8PCBERUNSX0lOREVOVDsNCisJfQ0KKw0KKwlpZiggbVNUQVRFTUVOVF9RVUVVRS5ub25lbXB0eSgpICkNCisJew0KKwkJb3MgPDwgRU9MX0lOQ1JfSU5ERU5UOw0KKwkJbVNUQVRFTUVOVF9RVUVVRS50b1N0cmVhbShvcyk7DQorCQlvcyA8PCBERUNSX0lOREVOVDsNCisJfQ0KKw0KKwlpZiggbUVYRUNfU1lOQ19QT0lOVCAhPSBOVUxMICkNCisJew0KKwkJb3MgPDwgRU9MX0lOQ1JfSU5ERU5UOw0KKwkJbUVYRUNfU1lOQ19QT0lOVC0+dG9TdHJlYW0ob3MpOw0KKwkJb3MgPDwgREVDUl9JTkRFTlQ7DQorCX0NCisNCisJb3MgPDwgVEFCIDw8ICJ9IiA8PCBFT0xfRkxVU0g7DQorfQ0KKw0KK3ZvaWQgRXhlY3V0aW9uRGF0YTo6dG9Gc2NuKE91dFN0cmVhbSAmIG9zLA0KKwkJY29uc3QgRXhlY3V0aW9uRGF0YSAqIGFQcmV2aW91c0V4ZWNEYXRhKSBjb25zdA0KK3sNCisvLwlvcyA8PCBUQUIgPDwgIlNDOiAiIDw8IHN0clN0YXRlQ29uZlRvRnNjbigpIDw8IEVPTDsNCisNCisJaWYoIChhUHJldmlvdXNFeGVjRGF0YSA9PSBOVUxMKQ0KKwkJfHwgKGFQcmV2aW91c0V4ZWNEYXRhLT5nZXRQYXRoQ29uZGl0aW9uKCkNCisJCQkhPSBnZXRQYXRoQ29uZGl0aW9uKCkpICkNCisJew0KKwkJb3MgPDwgVEFCIDw8ICJQQzogIg0KKwkJCQk8PCBnZXRQYXRoQ29uZGl0aW9uKCkud3JhcFN0ciggb3MuSU5ERU5ULnRhYjJTaXplKDQpICkNCisJCQkJPDwgRU9MOw0KKwl9DQorDQorCWlmKCAoYVByZXZpb3VzRXhlY0RhdGEgPT0gTlVMTCkNCisJCXx8IChhUHJldmlvdXNFeGVjRGF0YS0+Z2V0UGF0aFRpbWVkQ29uZGl0aW9uKCkNCisJCQkhPSBnZXRQYXRoVGltZWRDb25kaXRpb24oKSkgKQ0KKwl7DQorCQlvcyA8PCBUQUIgPDwgIlB0QzogIg0KKwkJCQk8PCBnZXRQYXRoVGltZWRDb25kaXRpb24oKS53cmFwU3RyKCBvcy5JTkRFTlQudGFiMlNpemUoNSkgKQ0KKwkJCQk8PCBFT0w7DQorCX0NCisNCisJLy8gREFUQQ0KKwlTdHJpbmdPdXRTdHJlYW0gb3NzKCBvcy5JTkRFTlQgKTsNCisJb3NzIDw8IElOQ1JfSU5ERU5UOw0KKw0KKwlUYWJsZU9mUnVudGltZVQ6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbVRhYmxlT2ZSdW50aW1lLmJlZ2luKCk7DQorCVRhYmxlT2ZSdW50aW1lVDo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBtVGFibGVPZlJ1bnRpbWUuZW5kKCk7DQorDQorCWlmKCBhUHJldmlvdXNFeGVjRGF0YSAhPSBOVUxMICkNCisJew0KKwkJVGFibGVPZlJ1bnRpbWVUOjpjb25zdF9pdGVyYXRvciBpdFByZXYgPQ0KKwkJCQlhUHJldmlvdXNFeGVjRGF0YS0+bVRhYmxlT2ZSdW50aW1lLmJlZ2luKCk7DQorCQlUYWJsZU9mUnVudGltZVQ6OmNvbnN0X2l0ZXJhdG9yIGl0UHJldkVuZCA9DQorCQkJCWFQcmV2aW91c0V4ZWNEYXRhLT5tVGFibGVPZlJ1bnRpbWUuZW5kKCk7DQorCQlUYWJsZU9mUnVudGltZVQ6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbVRhYmxlT2ZSdW50aW1lLmJlZ2luKCk7DQorCQlUYWJsZU9mUnVudGltZVQ6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gbVRhYmxlT2ZSdW50aW1lLmVuZCgpOw0KKwkJZm9yKCA7IChpdCAhPSBpdEVuZCkgJiYgKGl0UHJldiAhPSBpdFByZXZFbmQpIDsgKytpdCAsICsraXRQcmV2ICkNCisJCXsNCisJCQlpZiggKCppdCktPmhhc0RhdGFUYWJsZSgpICYmICgqaXQpLT5pc05URVEoKml0UHJldikgKQ0KKwkJCXsNCisJCQkJKCppdCktPnRvRnNjbkRhdGEob3NzLCB0aGlzLCAqaXRQcmV2KTsNCisJCQl9DQorCQl9DQorDQorCQlmb3IoIDsgKGl0ICE9IGl0RW5kKSA7ICsraXQpDQorCQl7DQorCQkJaWYoICgqaXQpLT5oYXNEYXRhVGFibGUoKSApDQorCQkJew0KKwkJCQkoKml0KS0+dG9Gc2NuRGF0YShvc3MsIHRoaXMsIE5VTEwpOw0KKwkJCX0NCisJCX0NCisJfQ0KKwllbHNlDQorCXsNCisJCVRhYmxlT2ZSdW50aW1lVDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtVGFibGVPZlJ1bnRpbWUuYmVnaW4oKTsNCisJCVRhYmxlT2ZSdW50aW1lVDo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBtVGFibGVPZlJ1bnRpbWUuZW5kKCk7DQorCQlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkNCisJCXsNCisJCQlpZiggKCppdCktPmhhc0RhdGFUYWJsZSgpICkNCisJCQl7DQorCQkJCSgqaXQpLT50b0ZzY25EYXRhKG9zcywgdGhpcywgTlVMTCk7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCWlmKCBub3Qgb3NzLnN0cigpLmVtcHR5KCkgKQ0KKwl7DQorCQlvcyA8PCBUQUIgPDwgIkRBVEF7IiA8PCBFT0w7DQorCQlvcyA8PCBvc3Muc3RyKCk7DQorCQlvcyA8PCBUQUIgPDwgIn0iIDw8IEVPTDsNCisJfQ0KKwkvLyBFTkQgREFUQQ0KKw0KKwkvLyBCVUZGRVINCisJU3RyaW5nT3V0U3RyZWFtIG9zYiggb3MuSU5ERU5UICk7DQorCW9zYiA8PCBJTkNSX0lOREVOVDsNCisNCisJaXQgPSBnZXRUYWJsZU9mUnVudGltZSgpLmJlZ2luKCk7DQorCWl0RW5kID0gZ2V0VGFibGVPZlJ1bnRpbWUoKS5lbmQoKTsNCisNCisJaWYoIGFQcmV2aW91c0V4ZWNEYXRhICE9IE5VTEwgKQ0KKwl7DQorCQlUYWJsZU9mUnVudGltZVQ6OmNvbnN0X2l0ZXJhdG9yIGl0UHJldiA9DQorCQkJCWFQcmV2aW91c0V4ZWNEYXRhLT5nZXRUYWJsZU9mUnVudGltZSgpLmJlZ2luKCk7DQorCQlUYWJsZU9mUnVudGltZVQ6OmNvbnN0X2l0ZXJhdG9yIGl0UHJldkVuZCA9DQorCQkJCWFQcmV2aW91c0V4ZWNEYXRhLT5nZXRUYWJsZU9mUnVudGltZSgpLmVuZCgpOw0KKwkJZm9yKCA7IChpdCAhPSBpdEVuZCkgJiYgKGl0UHJldiAhPSBpdFByZXZFbmQpIDsgKytpdCAsICsraXRQcmV2ICkNCisJCXsNCisJCQlpZiggKCppdCktPmhhc0J1ZmZlclRhYmxlKCkgJiYgKCppdCktPmlzTlRFUSgqaXRQcmV2KSApDQorCQkJew0KKwkJCQkoKml0KS0+dG9Gc2NuQnVmZmVyKG9zYiwgdGhpcywgKCppdFByZXYpKTsNCisJCQl9DQorCQl9DQorDQorCQlmb3IoIDsgKGl0ICE9IGl0RW5kKSA7ICsraXQpDQorCQl7DQorCQkJaWYoICgqaXQpLT5oYXNCdWZmZXJUYWJsZSgpICkNCisJCQl7DQorCQkJCSgqaXQpLT50b0ZzY25CdWZmZXIob3NiLCB0aGlzLCBOVUxMKTsNCisJCQl9DQorCQl9DQorCX0NCisJZWxzZQ0KKwl7DQorCQlUYWJsZU9mUnVudGltZVQ6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbVRhYmxlT2ZSdW50aW1lLmJlZ2luKCk7DQorCQlUYWJsZU9mUnVudGltZVQ6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gbVRhYmxlT2ZSdW50aW1lLmVuZCgpOw0KKwkJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApDQorCQl7DQorCQkJaWYoICgqaXQpLT5oYXNCdWZmZXJUYWJsZSgpICkNCisJCQl7DQorCQkJCSgqaXQpLT50b0ZzY25CdWZmZXIob3NiLCB0aGlzLCBOVUxMKTsNCisJCQl9DQorCQl9DQorCX0NCisNCisJaWYoIG5vdCBvc2Iuc3RyKCkuZW1wdHkoKSApDQorCXsNCisJCW9zIDw8IFRBQiA8PCAiQlVGRkVSeyIgPDwgRU9MOw0KKwkJb3MgPDwgb3NiLnN0cigpOw0KKwkJb3MgPDwgVEFCIDw8ICJ9IiA8PCBFT0w7DQorCX0NCisJLy8gRU5EIEJVRkZFUg0KKw0KKw0KKwlpZiggbVNUQVRFTUVOVF9RVUVVRS5ub25lbXB0eSgpICkNCisJew0KKwkJb3MgPDwgVEFCIDw8ICIvKiIgPDwgRU9MOw0KKwkJbVNUQVRFTUVOVF9RVUVVRS50b1N0cmVhbShvcyk7DQorCQlvcyA8PCBUQUIgPDwgIiovIiA8PCBFT0w7DQorCX0NCisNCisJaWYoIG1FWEVDX1NZTkNfUE9JTlQgIT0gTlVMTCApDQorCXsNCisJCW9zIDw8IFRBQiA8PCAiLyoiIDw8IEVPTDsNCisJCW1FWEVDX1NZTkNfUE9JTlQtPnRvU3RyZWFtKG9zKTsNCisJCW9zIDw8IFRBQiA8PCAiKi8iIDw8IEVPTDsNCisJfQ0KK30NCisNCisNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorLyoqDQorICogREVGQVVMVCBOVUxMDQorICovDQorQVBFeGVjdXRpb25EYXRhIEFQRXhlY3V0aW9uRGF0YTo6UkVGX05VTEw7DQorDQorDQorDQorLyoqDQorICogR0VUVEVSIC0gU0VUVEVSDQorICogdGhlIFByZXZpb3VzIEV4ZWN1dGlvbkRhdGENCisgKi8NCisNCitBUEV4ZWN1dGlvbkRhdGEgJiBBUEV4ZWN1dGlvbkRhdGE6OmdldFByZXZpb3VzKCkNCit7DQorCXJldHVybiggcmF3X3BvaW50ZXIoKS0+Z2V0RXhlY3V0aW9uQ29udGV4dCgpLT5nZXRQcmV2aW91c0V4ZWN1dGlvbkRhdGEoKSApOw0KK30NCisNCitjb25zdCBBUEV4ZWN1dGlvbkRhdGEgJiBBUEV4ZWN1dGlvbkRhdGE6OmdldFByZXZpb3VzKCkgY29uc3QNCit7DQorCXJldHVybiggcmF3X3BvaW50ZXIoKS0+Z2V0RXhlY3V0aW9uQ29udGV4dCgpLT5nZXRQcmV2aW91c0V4ZWN1dGlvbkRhdGEoKSApOw0KK30NCisNCitib29sIEFQRXhlY3V0aW9uRGF0YTo6aGFzUHJldmlvdXMoKSBjb25zdA0KK3sNCisJcmV0dXJuKCByYXdfcG9pbnRlcigpLT5oYXNFeGVjdXRpb25Db250ZXh0KCkgJiYNCisJCQlyYXdfcG9pbnRlcigpLT5nZXRFeGVjdXRpb25Db250ZXh0KCktPmhhc1ByZXZpb3VzKCkgKTsNCit9DQorDQorDQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL0V4ZWN1dGlvbkRhdGEuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL0V4ZWN1dGlvbkRhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDAzNzZjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3J1bnRpbWUvRXhlY3V0aW9uRGF0YS5oCkBAIC0wLDAgKzEsMTY0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBFWEVDVVRJT05EQVRBX0hfCisjZGVmaW5lIEVYRUNVVElPTkRBVEFfSF8KKworI2luY2x1ZGUgPGJhc2UvU21hcnRUYWJsZS5oPgorCisjaW5jbHVkZSA8Y29tbW9uL0F2bVBvaW50ZXIuaD4KKyNpbmNsdWRlIDxjb21tb24vRWxlbWVudC5oPgorI2luY2x1ZGUgPGNvbW1vbi9CRi5oPgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQXZtQ29kZS5oPgorCisjaW5jbHVkZSA8Y29sbGVjdGlvbi9UeXBlZGVmLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29uc3RydWN0b3IuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkxvY2F0aW9uLmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uU3luY2hyb25pemF0aW9uUG9pbnQuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9Mb2NhbFJ1bnRpbWUuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lRm9ybS5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL1J1bnRpbWVJRC5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL1RhYmxlT2ZSdW50aW1lRm9ybVN0YXRlLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBCYXNlQnVmZmVyRm9ybTsKK2NsYXNzIEJhc2VJbnN0YW5jZUZvcm07CitjbGFzcyBCaXRzZXQ7CisKK2NsYXNzIEV4ZWN1dGlvbkNvbnRleHQ7CitjbGFzcyBFeGVjdXRhYmxlRm9ybTsKKworY2xhc3MgSW5zdGFuY2VPZk1hY2hpbmU7CisKKworLyoqCisgKiBUWVBFREVGCisgKi8KK3R5cGVkZWYgU21hcnRUYWJsZTwgUnVudGltZUZvcm0gLCBEZXN0cm95RWxlbWVudFBvbGljeSA+ICBUYWJsZU9mUnVudGltZVQ7CisKKworY2xhc3MgRXhlY3V0aW9uRGF0YSA6ICBwdWJsaWMgRWxlbWVudCAsCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggRXhlY3V0aW9uRGF0YSApCit7CisKKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggRXhlY3V0aW9uRGF0YSApCisKKworcHVibGljOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKiBzdGF0aWMKKwkgKi8KKwlzdGF0aWMgYXZtX3NpemVfdCBQQVJBTV9NQUNISU5FX1JVTlRJTUVfT0ZGU0VUOworCisJc3RhdGljIGF2bV9zaXplX3QgU1lTVEVNX1JVTlRJTUVfT0ZGU0VUOworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQVRUUklCVVRFUworCSAqLworCUV4ZWN1dGlvbkNvbnRleHQgKiBtRXhlY3V0aW9uQ29udGV4dDsKKworCUJGIG1QYXRoQ29uZGl0aW9uOworCUJGIG1QYXRoVGltZWRDb25kaXRpb247CisKKwlib29sIG1HbG9iYWxOb2RlQ29uZGl0aW9uRW5hYmxlZEZsYWc7CisJYm9vbCBtTG9jYWxOb2RlQ29uZGl0aW9uRW5hYmxlZEZsYWc7CisKKwlCRiBtTm9kZUNvbmRpdGlvbjsKKwlCRiBtTm9kZVRpbWVkQ29uZGl0aW9uOworCUJGIG1SdW5uYWJsZUVsZW1lbnRUcmFjZTsKKwlCRiBtSU9FbGVtZW50VHJhY2U7CisKKwlCRkNvZGUgbU9uSW5pdDsKKwlCRkNvZGUgbU9uU2NoZWR1bGU7CisKKwlUYWJsZU9mUnVudGltZVQgbVRhYmxlT2ZSdW50aW1lOworCisJQVBUYWJsZU9mUnVudGltZUZvcm1TdGF0ZSBtVGFibGVPZlJGU3RhdGVGbGFnczsKKworCUFQU3RhY2tPZkxvY2FsUnVudGltZSBtU3RhY2tPZkxvY2FsUnVudGltZTsKKworcHVibGljOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKiBwdWJsaWMKKwkgKi8KKwlSdW50aW1lSUQgbVJJRDsKKwlib29sIG1QcmVzZXJ2ZVJJRDsKKworCS8vIFJvdXRpbmUgUGFyYW1ldGVyW3NdIG9yIFJldHVybiBTdGF0ZW1lbnQgdmFsdWVbc10KKwlCRiBtVkFMVUU7CisKKwlBVk1fRVhFQ19FTkRJTkdfU1RBVFVTIG1BRUVTOworCisJRXhlY3V0aW9uTG9jYXRpb25RdWV1ZSBtU1RBVEVNRU5UX1FVRVVFOworCisJRXhlY3V0aW9uU3luY2hyb25pemF0aW9uUG9pbnQgKiBtRVhFQ19TWU5DX1BPSU5UOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlFeGVjdXRpb25EYXRhKCBhdm1fc2l6ZV90IGFNYWNoaW5lQ291bnQgKQorCTogRWxlbWVudCggQ0xBU1NfS0lORF9UKCBFeGVjdXRpb25EYXRhICkgKSwKKwltRXhlY3V0aW9uQ29udGV4dCggTlVMTCApLAorCisJbVBhdGhDb25kaXRpb24oICksCisJbVBhdGhUaW1lZENvbmRpdGlvbiggKSwKKworCW1HbG9iYWxOb2RlQ29uZGl0aW9uRW5hYmxlZEZsYWcoIHRydWUgKSwKKwltTG9jYWxOb2RlQ29uZGl0aW9uRW5hYmxlZEZsYWcoIGZhbHNlICksCisKKwltTm9kZUNvbmRpdGlvbiggKSwKKwltTm9kZVRpbWVkQ29uZGl0aW9uKCApLAorCisJbVJ1bm5hYmxlRWxlbWVudFRyYWNlKCApLAorCW1JT0VsZW1lbnRUcmFjZSggKSwKKworCW1PbkluaXQoICksCisJbU9uU2NoZWR1bGUoICksCisKKwltVGFibGVPZlJ1bnRpbWUoIGFNYWNoaW5lQ291bnQgKSwKKworCW1UYWJsZU9mUkZTdGF0ZUZsYWdzKCBuZXcgVGFibGVPZlJ1bnRpbWVGb3JtU3RhdGUoYU1hY2hpbmVDb3VudCkgKSwKKwltU3RhY2tPZkxvY2FsUnVudGltZSggKSwKKworCS8vIHB1YmxpYyBBdHRyaWJ1dGVzCisJbVJJRCggKSwKKwltUHJlc2VydmVSSUQoIGZhbHNlICksCisJbVZBTFVFKCApLAorCisJbUFFRVMoIEFFRVNfT0sgKSwKKworCW1TVEFURU1FTlRfUVVFVUUoICksCisJbUVYRUNfU1lOQ19QT0lOVCggTlVMTCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCUV4ZWN1dGlvbkRhdGEoY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQpCisJOiBFbGVtZW50KCBhbkVEICksCisJbUV4ZWN1dGlvbkNvbnRleHQoIGFuRUQubUV4ZWN1dGlvbkNvbnRleHQgKSwKKworCW1QYXRoQ29uZGl0aW9uKCBhbkVELm1QYXRoQ29uZGl0aW9uICksCisJbVBhdGhUaW1lZENvbmRpdGlvbiggYW5FRC5tUGF0aFRpbWVkQ29uZGl0aW9uICksCisKKwltR2xvYmFsTm9kZUNvbmRpdGlvbkVuYWJsZWRGbGFnKCBhbkVELm1HbG9iYWxOb2RlQ29uZGl0aW9uRW5hYmxlZEZsYWcgKSwKKwltTG9jYWxOb2RlQ29uZGl0aW9uRW5hYmxlZEZsYWcoIGFuRUQubUxvY2FsTm9kZUNvbmRpdGlvbkVuYWJsZWRGbGFnICksCisKKwltTm9kZUNvbmRpdGlvbiggYW5FRC5tTm9kZUNvbmRpdGlvbiApLAorCW1Ob2RlVGltZWRDb25kaXRpb24oIGFuRUQubU5vZGVUaW1lZENvbmRpdGlvbiApLAorCisJbVJ1bm5hYmxlRWxlbWVudFRyYWNlKCBhbkVELm1SdW5uYWJsZUVsZW1lbnRUcmFjZSApLAorCW1JT0VsZW1lbnRUcmFjZSggYW5FRC5tSU9FbGVtZW50VHJhY2UgKSwKKworCW1PbkluaXQoIGFuRUQubU9uSW5pdCApLAorCW1PblNjaGVkdWxlKCBhbkVELm1PblNjaGVkdWxlICksCisKKwltVGFibGVPZlJ1bnRpbWUoIGFuRUQubVRhYmxlT2ZSdW50aW1lICksCisKKwltVGFibGVPZlJGU3RhdGVGbGFncyggYW5FRC5tVGFibGVPZlJGU3RhdGVGbGFncyApLAorCW1TdGFja09mTG9jYWxSdW50aW1lKCBhbkVELm1TdGFja09mTG9jYWxSdW50aW1lICksCisKKwkvLyBwdWJsaWMgQXR0cmlidXRlcworCW1SSUQoYW5FRC5tUklEKSwKKwltUHJlc2VydmVSSUQoIGFuRUQubVByZXNlcnZlUklEICksCisJbVZBTFVFKCBhbkVELm1WQUxVRSApLAorCisJbUFFRVMoIGFuRUQubUFFRVMgKSwKKworCW1TVEFURU1FTlRfUVVFVUUoIGFuRUQubVNUQVRFTUVOVF9RVUVVRSApLAorCW1FWEVDX1NZTkNfUE9JTlQoIChhbkVELm1FWEVDX1NZTkNfUE9JTlQgIT0gTlVMTCkgPworCQluZXcgRXhlY3V0aW9uU3luY2hyb25pemF0aW9uUG9pbnQoICooYW5FRC5tRVhFQ19TWU5DX1BPSU5UKSApIDogTlVMTCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5FeGVjdXRpb25EYXRhKCkKKwl7CisJCWRlbGV0ZSggbUVYRUNfU1lOQ19QT0lOVCApOworCX0KKworCisJLyoqCisJICogcmVzaXplCisJICovCisJdm9pZCByZXNpemUoYXZtX3NpemVfdCBuZXdNYWNoaW5lQ291bnQpCisJeworCQltVGFibGVPZlJ1bnRpbWUubWFrZVdyaXRhYmxlUmVzaXplKCBuZXdNYWNoaW5lQ291bnQgKTsKKworCQltVGFibGVPZlJGU3RhdGVGbGFncy5tYWtlV3JpdGFibGUoKTsKKwkJbVRhYmxlT2ZSRlN0YXRlRmxhZ3MtPnJlc2l6ZShuZXdNYWNoaW5lQ291bnQpOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUV4ZWN1dGlvbkNvbnRleHQKKwkgKi8KKwlpbmxpbmUgRXhlY3V0aW9uQ29udGV4dCAqIGdldEV4ZWN1dGlvbkNvbnRleHQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRXhlY3V0aW9uQ29udGV4dCApOworCX0KKworCWlubGluZSBib29sIGhhc0V4ZWN1dGlvbkNvbnRleHQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRXhlY3V0aW9uQ29udGV4dCAhPSBOVUxMICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0RXhlY3V0aW9uQ29udGV4dChFeGVjdXRpb25Db250ZXh0ICogYW5FeGVjdXRpb25Db250ZXh0KQorCXsKKwkJbUV4ZWN1dGlvbkNvbnRleHQgPSBhbkV4ZWN1dGlvbkNvbnRleHQ7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBtUGF0aENvbmRpdGlvbiAgJiYgIG1QYXRoVGltZWRDb25kaXRpb24KKwkgKi8KKwlpbmxpbmUgQkYgZ2V0QWxsUGF0aENvbmRpdGlvbigpIGNvbnN0CisJeworCQlpZiggbVBhdGhUaW1lZENvbmRpdGlvbi52YWxpZCgpCisJCQkmJiBtUGF0aFRpbWVkQ29uZGl0aW9uLmlzTm90RXF1YWxUcnVlKCkgKQorCQl7CisJCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6YW5kRXhwcigKKwkJCQkJbVBhdGhDb25kaXRpb24sIG1QYXRoVGltZWRDb25kaXRpb24pICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4oIG1QYXRoQ29uZGl0aW9uICk7CisJCX0KKwl9CisKKworCWlubGluZSBCRiBhbmRQYXRoVGltZWRDb25kaXRpb24oY29uc3QgQkYgJiBhQ29uZGl0aW9uKSBjb25zdAorCXsKKwkJaWYoIG1QYXRoVGltZWRDb25kaXRpb24udmFsaWQoKSApCisJCXsKKwkJCWlmKCBtUGF0aFRpbWVkQ29uZGl0aW9uLmlzRXF1YWxUcnVlKCkgKQorCQkJeworCQkJCXJldHVybiggYUNvbmRpdGlvbiApOworCQkJfQorCQkJZWxzZSBpZiggbVBhdGhUaW1lZENvbmRpdGlvbi5pc0VxdWFsRmFsc2UoKSApCisJCQl7CisJCQkJcmV0dXJuKCBtUGF0aFRpbWVkQ29uZGl0aW9uICk7CisJCQl9CisKKwkJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjphbmRFeHByKAorCQkJCQltUGF0aFRpbWVkQ29uZGl0aW9uLCBhQ29uZGl0aW9uKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuKCBhQ29uZGl0aW9uICk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtUGF0aENvbmRpdGlvbgorCSAqLworCWlubGluZSBjb25zdCBCRiAmIGdldFBhdGhDb25kaXRpb24oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUGF0aENvbmRpdGlvbiApOworCX0KKworCWlubGluZSBib29sIGhhc1BhdGhDb25kaXRpb24oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUGF0aENvbmRpdGlvbi52YWxpZCgpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0UGF0aENvbmRpdGlvbihjb25zdCBCRiAmIGFQYXRoQ29uZGl0aW9uKQorCXsKKwkJbVBhdGhDb25kaXRpb24gPSBhUGF0aENvbmRpdGlvbjsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1QYXRoVGltZWRDb25kaXRpb24KKwkgKi8KKwlpbmxpbmUgY29uc3QgQkYgJiBnZXRQYXRoVGltZWRDb25kaXRpb24oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUGF0aFRpbWVkQ29uZGl0aW9uICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzUGF0aFRpbWVkQ29uZGl0aW9uKCkgY29uc3QKKwl7CisJCXJldHVybiggbVBhdGhUaW1lZENvbmRpdGlvbi52YWxpZCgpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0UGF0aFRpbWVkQ29uZGl0aW9uKGNvbnN0IEJGICYgYVBhdGhUaW1lZENvbmRpdGlvbikKKwl7CisJCW1QYXRoVGltZWRDb25kaXRpb24gPSBhUGF0aFRpbWVkQ29uZGl0aW9uOworCX0KKworCisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBtTm9kZUNvbmRpdGlvbiAgJiYgIG1Ob2RlVGltZWRDb25kaXRpb24KKwkgKi8KKwlpbmxpbmUgQkYgZ2V0QWxsTm9kZUNvbmRpdGlvbigpIGNvbnN0CisJeworCQlpZiggbU5vZGVUaW1lZENvbmRpdGlvbi52YWxpZCgpICYmIG1Ob2RlVGltZWRDb25kaXRpb24uaXNOb3RFcXVhbFRydWUoKSApCisJCXsKKwkJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjphbmRFeHByKAorCQkJCQltTm9kZUNvbmRpdGlvbiwgbU5vZGVUaW1lZENvbmRpdGlvbikgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybiggbU5vZGVDb25kaXRpb24gKTsKKwkJfQorCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbU5vZGVDb25kaXRpb24KKwkgKi8KKwlpbmxpbmUgY29uc3QgQkYgJiBnZXROb2RlQ29uZGl0aW9uKCkgY29uc3QKKwl7CisJCXJldHVybiggbU5vZGVDb25kaXRpb24gKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNOb2RlQ29uZGl0aW9uKCkgY29uc3QKKwl7CisJCXJldHVybiggbU5vZGVDb25kaXRpb24udmFsaWQoKSApOworCX0KKworCWlubGluZSB2b2lkIHNldE5vZGVDb25kaXRpb24oY29uc3QgQkYgJiBhQ29uZGl0aW9uKQorCXsKKwkJbU5vZGVDb25kaXRpb24gPSBhQ29uZGl0aW9uOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbU5vZGVUaW1lZENvbmRpdGlvbgorCSAqLworCWlubGluZSBjb25zdCBCRiAmIGdldE5vZGVUaW1lZENvbmRpdGlvbigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Ob2RlVGltZWRDb25kaXRpb24gKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNOb2RlVGltZWRDb25kaXRpb24oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtTm9kZVRpbWVkQ29uZGl0aW9uLnZhbGlkKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXROb2RlVGltZWRDb25kaXRpb24oY29uc3QgQkYgJiBhVGltZWRDb25kaXRpb24pCisJeworCQltTm9kZVRpbWVkQ29uZGl0aW9uID0gYVRpbWVkQ29uZGl0aW9uOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUdsb2JhbE5vZGVDb25kaXRpb25FbmFibGVkRmxhZworCSAqIG1Mb2NhbE5vZGVDb25kaXRpb25FbmFibGVkRmxhZworCSAqLworCWlubGluZSBib29sIGlzRW5hYmxlZE5vZGVDb25kaXRpb24oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtR2xvYmFsTm9kZUNvbmRpdGlvbkVuYWJsZWRGbGFnIHx8CisJCQkJbUxvY2FsTm9kZUNvbmRpdGlvbkVuYWJsZWRGbGFnICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0RW5hYmxlZEdsb2JhbE5vZGVDb25kaXRpb24oYm9vbCBhQ29uZGl0aW9uID0gdHJ1ZSkKKwl7CisJCW1HbG9iYWxOb2RlQ29uZGl0aW9uRW5hYmxlZEZsYWcgPSBhQ29uZGl0aW9uOworCX0KKworCWlubGluZSB2b2lkIHNldEVuYWJsZWRMb2NhbE5vZGVDb25kaXRpb24oYm9vbCBhQ29uZGl0aW9uID0gdHJ1ZSkKKwl7CisJCW1Mb2NhbE5vZGVDb25kaXRpb25FbmFibGVkRmxhZyA9IGFDb25kaXRpb247CisJfQorCisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKKwlpbmxpbmUgc3RkOjpzdHJpbmcgc3RyKCkgY29uc3QKKwl7CisJCXJldHVybiggc3RyU3RhdGVDb25mKCkgKTsKKwl9CisKKwl2b2lkIHRvU3RyZWFtRGF0YShPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKKwl2b2lkIHRvRnNjbihPdXRTdHJlYW0gJiBvcywgY29uc3QgRXhlY3V0aW9uRGF0YSAqIGFQcmV2aW91c0V4ZWNEYXRhKSBjb25zdDsKKworCisJLyoqCisJICogc3RyaW5nIG9mIGEgc3RhdGUgY29uZmlndXJhdGlvbiBvZiBhbiBFeGVjdXRpb25EYXRhCisJICogIVVOVVNFRCEKKwlpbmxpbmUgc3RkOjpzdHJpbmcgc3RyU3RhdGVJZGxlT3JSdW5uaW5nKCkgY29uc3QKKwl7CisJCWlmKCBnZXRTeXN0ZW1SdW50aW1lRm9ybSgpLT5oYXNPblNjaGVkdWxlKCkKKwkJCXx8IGdldFN5c3RlbVJ1bnRpbWVGb3JtKCktPmhhc0NoaWxkKCkgKQorCQl7CisJCQlyZXR1cm4oIHN0clN0YXRlSWRsZU9yUnVubmluZyggZ2V0U3lzdGVtUnVudGltZUZvcm0oKSApICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4oICIoIiArIHN0clN0YXRlSWRsZU9yUnVubmluZyggZ2V0U3lzdGVtUnVudGltZSgpICkgKyAiKSIgKTsKKwkJfQorCX0KKworCWlubGluZSBzdGQ6OnN0cmluZyBzdHJTdGF0ZUlkbGVPclJ1bm5pbmcoY29uc3QgUnVudGltZUZvcm0gJiBhUkYpIGNvbnN0CisJeworCQlTdHJpbmdPdXRTdHJlYW0gb3NzOworCisJCXRvU3RyZWFtU3RhdGVJZGxlT3JSdW5uaW5nKG9zcywgYVJGKTsKKworCQlyZXR1cm4oIG9zcy5zdHIoKSApOworCX0KKwkqICFVTlVTRUQhCisJKi8KKworCXZvaWQgdG9TdHJlYW1TdGF0ZUlkbGVPclJ1bm5pbmcoCisJCQlPdXRTdHJlYW0gJiBvcywgY29uc3QgUnVudGltZUZvcm0gJiBhUkYpIGNvbnN0OworCisJLyoqCisJICogc3RyaW5nIG9mIGEgc3RhdGUgY29uZmlndXJhdGlvbiBvZiBhbiBFeGVjdXRpb25EYXRhCisJICoKKwkgKiBMSUZFTElORSBTVEFURSBJREVOVElGSUVSCisJICogJTElIC0tPiBsaWZlbGluZSBydW50aW1lIHBpZAorCSAqICUyJSAtLT4gbGlmZWxpbmUgaWRlbnRpZmllcgorCSAqICUzJSAtLT4gc3RhdGUgcnVudGltZSBwaWQKKwkgKiAlNCUgLS0+IHN0YXRlIGlkZW50aWZpZXIKKwkgKi8KKwlPdXRTdHJlYW0gJiB0b1N0cmVhbUxpZmVsaW5lU3RhdGVGb3JtYXQoCisJCQlPdXRTdHJlYW0gJiBvcywgY29uc3QgUnVudGltZUZvcm0gJiBhUkYsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGZvcm1hdExpZmVsaW5lU3RhdGVQYXR0ZXJuID0gIiUzJTolNCUiKSBjb25zdDsKKworCWlubGluZSBzdGQ6OnN0cmluZyBzdHJTdGF0ZUNvbmYoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGZvcm1hdExpZmVsaW5lU3RhdGVQYXR0ZXJuID0gIiUzJTolNCUiKSBjb25zdAorCXsKKwkJaWYoIGdldFN5c3RlbVJ1bnRpbWUoKS5oYXNPblNjaGVkdWxlKCkgKQorCQl7CisJCQlyZXR1cm4oIHN0clN0YXRlQ29uZigKKwkJCQkJZ2V0U3lzdGVtUnVudGltZSgpICwgZm9ybWF0TGlmZWxpbmVTdGF0ZVBhdHRlcm4gKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuKCAiKCIgKyBzdHJTdGF0ZUNvbmYoIGdldFN5c3RlbVJ1bnRpbWUoKSAsCisJCQkJCWZvcm1hdExpZmVsaW5lU3RhdGVQYXR0ZXJuICkgKyAiKSIgKTsKKwkJfQorCX0KKworCXN0ZDo6c3RyaW5nIHN0clN0YXRlQ29uZihjb25zdCBSdW50aW1lRm9ybSAmIGFSRiwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgZm9ybWF0TGlmZWxpbmVTdGF0ZVBhdHRlcm4gPSAiJTMlOiU0JSIpIGNvbnN0CisJeworCQlTdHJpbmdPdXRTdHJlYW0gb3NzOworCisJCXRvU3RyZWFtU3RhdGVDb25mKG9zcywgYVJGLCBmb3JtYXRMaWZlbGluZVN0YXRlUGF0dGVybik7CisKKwkJcmV0dXJuKCBvc3Muc3RyKCkgKTsKKwl9CisKKwl2b2lkIHRvU3RyZWFtU3RhdGVDb25mKE91dFN0cmVhbSAmIG9zLCBjb25zdCBSdW50aW1lRm9ybSAmIGFSRiwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgZm9ybWF0TGlmZWxpbmVTdGF0ZVBhdHRlcm4gPSAiJTMlOiU0JSIpIGNvbnN0OworCisKKwkvKioKKwkgKiBzdHJpbmcgb2YgYSBzdGF0ZSBjb25maWd1cmF0aW9uIG9mIGFuIEV4ZWN1dGlvbkRhdGEKKwkgKi8KKwlpbmxpbmUgc3RkOjpzdHJpbmcgc3RyU3RhdGVDb25mVG9Gc2NuKCkgY29uc3QKKwl7CisJCWlmKCBnZXRTeXN0ZW1SdW50aW1lKCkuaGFzT25TY2hlZHVsZSgpCisJCQl8fCBnZXRTeXN0ZW1SdW50aW1lKCkuaGFzQ2hpbGQoKSApCisJCXsKKwkJCXJldHVybiggc3RyU3RhdGVDb25mVG9Gc2NuKCBnZXRTeXN0ZW1SdW50aW1lKCkgKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuKCAiKCIgKyBzdHJTdGF0ZUNvbmZUb0ZzY24oIGdldFN5c3RlbVJ1bnRpbWUoKSApICsgIikiICk7CisJCX0KKwl9CisKKwlpbmxpbmUgc3RkOjpzdHJpbmcgc3RyU3RhdGVDb25mVG9Gc2NuKGNvbnN0IFJ1bnRpbWVGb3JtICYgYVJGKSBjb25zdAorCXsKKwkJU3RyaW5nT3V0U3RyZWFtIG9zczsKKworCQl0b1N0cmVhbVN0YXRlQ29uZlRvRnNjbihvc3MsIGFSRik7CisKKwkJcmV0dXJuKCBvc3Muc3RyKCkgKTsKKwl9CisKKwl2b2lkIHRvU3RyZWFtU3RhdGVDb25mVG9Gc2NuKAorCQkJT3V0U3RyZWFtICYgb3MsIGNvbnN0IFJ1bnRpbWVGb3JtICYgYVJGKSBjb25zdDsKKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVJ1bm5hYmxlRWxlbWVudFRyYWNlCisJICovCisJaW5saW5lIEJGICYgZ2V0UnVubmFibGVFbGVtZW50VHJhY2UoKQorCXsKKwkJcmV0dXJuKCBtUnVubmFibGVFbGVtZW50VHJhY2UgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQkYgJiBnZXRSdW5uYWJsZUVsZW1lbnRUcmFjZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1SdW5uYWJsZUVsZW1lbnRUcmFjZSApOworCX0KKworCWlubGluZSBib29sIGhhc1J1bm5hYmxlRWxlbWVudFRyYWNlKCkgY29uc3QKKwl7CisJCXJldHVybiggbVJ1bm5hYmxlRWxlbWVudFRyYWNlLnZhbGlkKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRSdW5uYWJsZUVsZW1lbnRUcmFjZShjb25zdCBCRiAmIGFSdW5uYWJsZUVsZW1lbnRUcmFjZSkKKwl7CisJCW1SdW5uYWJsZUVsZW1lbnRUcmFjZSA9IGFSdW5uYWJsZUVsZW1lbnRUcmFjZTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1JT0VsZW1lbnRUcmFjZQorCSAqLworCWlubGluZSBCRiAmIGdldElPRWxlbWVudFRyYWNlKCkKKwl7CisJCXJldHVybiggbUlPRWxlbWVudFRyYWNlICk7CisJfQorCisJaW5saW5lIGNvbnN0IEJGICYgZ2V0SU9FbGVtZW50VHJhY2UoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtSU9FbGVtZW50VHJhY2UgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNJT0VsZW1lbnRUcmFjZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1JT0VsZW1lbnRUcmFjZS52YWxpZCgpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0SU9FbGVtZW50VHJhY2UoY29uc3QgQkYgJiBhbklPRWxlbWVudFRyYWNlKQorCXsKKwkJbUlPRWxlbWVudFRyYWNlID0gYW5JT0VsZW1lbnRUcmFjZTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIG1SdW5uYWJsZUVsZW1lbnRUcmFjZQorCSAqIG1JT0VsZW1lbnRUcmFjZQorCSAqLworLy8kREVMRVRFCisJaW5saW5lIGJvb2wgbm90RXZhbHVhdGVkKCkgY29uc3QKKwl7CisJCXJldHVybiggbVJ1bm5hYmxlRWxlbWVudFRyYWNlLmludmFsaWQoKQorCQkJCSYmIG1JT0VsZW1lbnRUcmFjZS5pbnZhbGlkKCkgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1PbkluaXQKKwkgKi8KKwlpbmxpbmUgY29uc3QgQkZDb2RlICYgZ2V0T25Jbml0KCkgY29uc3QKKwl7CisJCXJldHVybiggbU9uSW5pdCApOworCX0KKworCWlubGluZSBib29sIGhhc09uSW5pdCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1PbkluaXQudmFsaWQoKSApOworCX0KKworCWlubGluZSB2b2lkIHNldE9uSW5pdChjb25zdCBCRkNvZGUgJiBvbkluaXQpCisJeworCQltT25Jbml0ID0gb25Jbml0OworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbU9uU2NoZWR1bGUKKwkgKi8KKwlpbmxpbmUgY29uc3QgQkZDb2RlICYgZ2V0T25TY2hlZHVsZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1PblNjaGVkdWxlICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzT25TY2hlZHVsZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1PblNjaGVkdWxlLnZhbGlkKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRPblNjaGVkdWxlKGNvbnN0IEJGQ29kZSAmIG9uU2NoZWR1bGUpCisJeworCQltT25TY2hlZHVsZSA9IG9uU2NoZWR1bGU7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtVGFibGVPZlJ1bnRpbWVGb3JtCisJICovCisJaW5saW5lIGNvbnN0IFRhYmxlT2ZSdW50aW1lVCAmIGdldFRhYmxlT2ZSdW50aW1lKCkgY29uc3QKKwl7CisJCXJldHVybiggbVRhYmxlT2ZSdW50aW1lICk7CisJfQorCisKKwlpbmxpbmUgUnVudGltZUZvcm0gJiBnZXRSdW50aW1lKGF2bV9zaXplX3Qgb2Zmc2V0KQorCXsKKwkJcmV0dXJuKCBtVGFibGVPZlJ1bnRpbWUucmVmKG9mZnNldCkgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgUnVudGltZUZvcm0gJiBnZXRSdW50aW1lKGF2bV9zaXplX3Qgb2Zmc2V0KSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVGFibGVPZlJ1bnRpbWUucmVmKG9mZnNldCkgKTsKKwl9CisKKworCWlubGluZSBSdW50aW1lRm9ybSAmIGdldFJ1bnRpbWUoY29uc3QgUnVudGltZUlEICYgYVJJRCkKKwl7CisJCXJldHVybiggbVRhYmxlT2ZSdW50aW1lLnJlZiggYVJJRC5nZXRPZmZzZXQoKSApICk7CisJfQorCisJaW5saW5lIGNvbnN0IFJ1bnRpbWVGb3JtICYgZ2V0UnVudGltZShjb25zdCBSdW50aW1lSUQgJiBhUklEKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVGFibGVPZlJ1bnRpbWUucmVmKCBhUklELmdldE9mZnNldCgpICkgKTsKKwl9CisKKworCWlubGluZSBjb25zdCBSdW50aW1lRm9ybSAqIHB0clJ1bnRpbWUoYXZtX3NpemVfdCBvZmZzZXQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZU9mUnVudGltZS5hdChvZmZzZXQpICk7CisJfQorCisJaW5saW5lIFJ1bnRpbWVGb3JtICogcHRyUnVudGltZShjb25zdCBSdW50aW1lSUQgJiBhUklEKQorCXsKKwkJcmV0dXJuKCBtVGFibGVPZlJ1bnRpbWUuYXQoIGFSSUQuZ2V0T2Zmc2V0KCkgKSApOworCX0KKworCWlubGluZSBjb25zdCBSdW50aW1lRm9ybSAqIHB0clJ1bnRpbWUoY29uc3QgUnVudGltZUlEICYgYVJJRCkgY29uc3QKKwl7CisJCXJldHVybiggbVRhYmxlT2ZSdW50aW1lLmF0KCBhUklELmdldE9mZnNldCgpICkgKTsKKwl9CisKKworCWlubGluZSBjb25zdCBSdW50aW1lSUQgJiBnZXRSdW50aW1lSUQoYXZtX3NpemVfdCByaWQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZU9mUnVudGltZS5hdChyaWQpLT5nZXRSSUQoKSApOworCX0KKworCWNvbnN0IFJ1bnRpbWVJRCAmIGdldFJ1bnRpbWVJRChjb25zdCBFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZSkgY29uc3Q7CisKKwljb25zdCBSdW50aW1lSUQgJiBnZXRSdW50aW1lSUQoSW5zdGFuY2VPZk1hY2hpbmUgKiBhbkluc3RhbmNlKSBjb25zdDsKKworCWNvbnN0IFJ1bnRpbWVJRCAmIGdldFJ1bnRpbWVJRCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEKSBjb25zdDsKKworCWNvbnN0IFJ1bnRpbWVJRCAmIGdldFJ1bnRpbWVJREJ5TmFtZUlEKGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkgY29uc3Q7CisKKworCVJ1bnRpbWVJRCBnZXRSdW50aW1lQ29udGFpbmVyUklEKGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsCisJCQlCYXNlSW5zdGFuY2VGb3JtICogYW5JbnN0YW5jZSkgY29uc3Q7CisKKwlSdW50aW1lSUQgZ2V0UnVudGltZUNvbnRhaW5lclJJRChCYXNlSW5zdGFuY2VGb3JtICogYW5JbnN0YW5jZSkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0UnVudGltZUNvbnRhaW5lclJJRChtUklELCBhbkluc3RhbmNlKSApOworCX0KKworCisJaW5saW5lIGNvbnN0IEJGQ29kZSAmIGdldFJ1bnRpbWVGb3JtT25TY2hlZHVsZShjb25zdCBSdW50aW1lSUQgJiBhUklEKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVGFibGVPZlJ1bnRpbWUuYXQoYVJJRC5nZXRPZmZzZXQoKSktPmdldE9uU2NoZWR1bGUoKSApOworCX0KKworCWlubGluZSBjb25zdCBCRkNvZGUgJiBnZXRSdW50aW1lRm9ybU9uRGVmZXIoY29uc3QgUnVudGltZUlEICYgYVJJRCkgY29uc3QKKwl7CisJCXJldHVybiggbVRhYmxlT2ZSdW50aW1lLmF0KGFSSUQuZ2V0T2Zmc2V0KCkpLT5nZXRPbkRlZmVyKCkgKTsKKwl9CisKKworCisJLy8gYXNzaWduIDw9PT4gcmVsZWFzZV9hY3F1aXJlCisJaW5saW5lIHZvaWQgc2F2ZVJ1bnRpbWVGb3JtKGF2bV9zaXplX3Qgb2Zmc2V0LCBSdW50aW1lRm9ybSAqIGFSRikgY29uc3QKKwl7CisJCW1UYWJsZU9mUnVudGltZS5zZXQob2Zmc2V0LCBhUkYpOworCX0KKworCS8vIGFzc2lnbiA8PT0+IHJlbGVhc2VfYWNxdWlyZQorCWlubGluZSB2b2lkIGFzc2lnblJ1bnRpbWVGb3JtKGF2bV9zaXplX3Qgb2Zmc2V0LCBSdW50aW1lRm9ybSAqIGFSRikgY29uc3QKKwl7CisJCW1UYWJsZU9mUnVudGltZS5hc3NpZ24ob2Zmc2V0LCBhUkYpOworCX0KKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtVGFibGVPZlJ1bnRpbWUKKwkgKgorCSAqIG1ha2Ugd3JpdGFibGUKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJaW5saW5lIFJ1bnRpbWVGb3JtICYgZ2V0V3JpdGFibGVSdW50aW1lKGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQpCisJeworCQlyZXR1cm4oIG1UYWJsZU9mUnVudGltZS5yZWZXcml0YWJsZSggYVJJRC5nZXRPZmZzZXQoKSApICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBmb3IgZGF0YSBpbiBSdW50aW1lRm9ybSBEYXRhVGFibGUKKwkgKi8KKwljb25zdCBCRiAmIGdldERhdGFCeVF1YWxpZmllZE5hbWVJRCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCwgSW5zdGFuY2VPZkRhdGEgKiAmIHZhcikgY29uc3Q7CisKKwljb25zdCBCRiAmIGdldERhdGFCeU5hbWVJRChjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpIGNvbnN0OworCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtVGFibGVPZlJGU3RhdGVGbGFncworCSAqLworCWlubGluZSBjb25zdCBBUFRhYmxlT2ZSdW50aW1lRm9ybVN0YXRlICYgZ2V0UnVudGltZUZvcm1TdGF0ZVRhYmxlKCkgY29uc3QKKwl7CisJCXJldHVybiggbVRhYmxlT2ZSRlN0YXRlRmxhZ3MgKTsKKwl9CisKKworCWlubGluZSBQUk9DRVNTX0VWQUxfU1RBVEUgZ2V0UnVudGltZUZvcm1TdGF0ZShhdm1fc2l6ZV90IHJpZCkgY29uc3QKKwl7CisJCXJldHVybiggbVRhYmxlT2ZSRlN0YXRlRmxhZ3MtPnN0YXRlQXQocmlkKSApOworCX0KKworCWlubGluZSAgUFJPQ0VTU19FVkFMX1NUQVRFIGdldFJ1bnRpbWVGb3JtU3RhdGUoCisJCQljb25zdCBSdW50aW1lSUQgJiBhUklEKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVGFibGVPZlJGU3RhdGVGbGFncy0+c3RhdGVBdCggYVJJRC5nZXRPZmZzZXQoKSApICk7CisJfQorCisJYm9vbCBjaGVja1J1bm5pbmdGb3JtKAorCQkJY29uc3QgQkYgJiBhUnVubmFibGVFbGVtZW50VHJhY2UsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQpOworCisKKwkvLyBDUkVBVEVEIFNUQVRFCisJaW5saW5lIGJvb2wgaXNDcmVhdGVkKGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZU9mUkZTdGF0ZUZsYWdzLT5pc0NyZWF0ZWQoIGFSSUQuZ2V0T2Zmc2V0KCkgKSApOworCX0KKworCS8vIExPQURFRCBTVEFURQorCWlubGluZSBib29sIGlzTG9hZGVkKGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZU9mUkZTdGF0ZUZsYWdzLT5pc0xvYWRlZCggYVJJRC5nZXRPZmZzZXQoKSApICk7CisJfQorCisJLy8gU1RBUlRJTkcgU1RBVEUKKwlpbmxpbmUgYm9vbCBpc1N0YXJ0aW5nKGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZU9mUkZTdGF0ZUZsYWdzLT5pc1N0YXJ0aW5nKCBhUklELmdldE9mZnNldCgpICkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc0luaXRpbmcoY29uc3QgUnVudGltZUlEICYgYVJJRCkgY29uc3QKKwl7CisJCXJldHVybiggbVRhYmxlT2ZSRlN0YXRlRmxhZ3MtPmlzSW5pdGluZyggYVJJRC5nZXRPZmZzZXQoKSApICk7CisJfQorCisJLy8gU1RPUFBJTkcgU1RBVEUKKwlpbmxpbmUgYm9vbCBpc1N0b3BwaW5nKGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZU9mUkZTdGF0ZUZsYWdzLT5pc1N0b3BwaW5nKCBhUklELmdldE9mZnNldCgpICkgKTsKKwl9CisKKwkvLyBTVE9QUEVEIFNUQVRFCisJaW5saW5lIGJvb2wgaXNTdG9wcGVkKGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZU9mUkZTdGF0ZUZsYWdzLT5pc1N0b3BwZWQoIGFSSUQuZ2V0T2Zmc2V0KCkgKSApOworCX0KKworCS8vIEZJTkFMSVpJTkcgU1RBVEUKKwlpbmxpbmUgYm9vbCBpc0ZpbmFsaXppbmcoY29uc3QgUnVudGltZUlEICYgYVJJRCkgY29uc3QKKwl7CisJCXJldHVybiggbVRhYmxlT2ZSRlN0YXRlRmxhZ3MtPmlzRmluYWxpemluZyggYVJJRC5nZXRPZmZzZXQoKSApICk7CisJfQorCisJLy8gRklOQUxJWkVEIFNUQVRFCisJaW5saW5lIGJvb2wgaXNGaW5hbGl6ZWQoY29uc3QgUnVudGltZUlEICYgYVJJRCkgY29uc3QKKwl7CisJCXJldHVybiggbVRhYmxlT2ZSRlN0YXRlRmxhZ3MtPmlzRmluYWxpemVkKCBhUklELmdldE9mZnNldCgpICkgKTsKKwl9CisKKwkvLyBERVNUUk9ZRUQgU1RBVEUKKwlpbmxpbmUgYm9vbCBpc0Rlc3Ryb3llZChjb25zdCBSdW50aW1lSUQgJiBhUklEKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVGFibGVPZlJGU3RhdGVGbGFncy0+aXNEZXN0cm95ZWQoIGFSSUQuZ2V0T2Zmc2V0KCkgKSApOworCX0KKworCS8vIEZJTkFMSVpFRCBvciBERVNUUk9ZRUQgU1RBVEUKKwlpbmxpbmUgYm9vbCBpc0ZpbmFsaXplZE9yRGVzdHJveWVkKGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZU9mUkZTdGF0ZUZsYWdzLT4KKwkJCQlpc0ZpbmFsaXplZE9yRGVzdHJveWVkKCBhUklELmdldE9mZnNldCgpICkgKTsKKwl9CisKKwkvLyBBTElWRSBTVEFURQorCWlubGluZSBib29sIGlzQWxpdmUoY29uc3QgUnVudGltZUlEICYgYVJJRCkgY29uc3QKKwl7CisJCXJldHVybiggbVRhYmxlT2ZSRlN0YXRlRmxhZ3MtPmlzQWxpdmUoIGFSSUQuZ2V0T2Zmc2V0KCkgKSApOworCX0KKworCS8vIFNVUEVOREVEIFNUQVRFCisJaW5saW5lIGJvb2wgaXNTdXNwZW5kZWQoY29uc3QgUnVudGltZUlEICYgYVJJRCkgY29uc3QKKwl7CisJCXJldHVybiggbVRhYmxlT2ZSRlN0YXRlRmxhZ3MtPmlzU3VzcGVuZGVkKCBhUklELmdldE9mZnNldCgpICkgKTsKKwl9CisKKwkvLyBXQUlUSU5HIFNUQVRFCisJaW5saW5lIGJvb2wgaXNXYWl0aW5nKGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZU9mUkZTdGF0ZUZsYWdzLT5pc1dhaXRpbmcoIGFSSUQuZ2V0T2Zmc2V0KCkgKSApOworCX0KKworCS8vIFdBSVRJTkcgSk9JTiBTVEFURQorCWlubGluZSBib29sIGlzV2FpdGluZ0pvaW4oY29uc3QgUnVudGltZUlEICYgYVJJRCkgY29uc3QKKwl7CisJCXJldHVybiggbVRhYmxlT2ZSRlN0YXRlRmxhZ3MtPmlzV2FpdGluZ0pvaW4oIGFSSUQuZ2V0T2Zmc2V0KCkgKSApOworCX0KKworCS8vIERJU0FCTEUgU1RBVEUKKwlpbmxpbmUgYm9vbCBpc0Rpc2FibGUoY29uc3QgUnVudGltZUlEICYgYVJJRCkgY29uc3QKKwl7CisJCXJldHVybiggbVRhYmxlT2ZSRlN0YXRlRmxhZ3MtPmlzRGlzYWJsZSggYVJJRC5nZXRPZmZzZXQoKSApICk7CisJfQorCisJLy8gRElTQUJMRSBTVEFURQorCWlubGluZSBib29sIGlzQWJvcnRlZChjb25zdCBSdW50aW1lSUQgJiBhUklEKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVGFibGVPZlJGU3RhdGVGbGFncy0+aXNBYm9ydGVkKCBhUklELmdldE9mZnNldCgpICkgKTsKKwl9CisKKwkvLyBESVNBQkxFIG9yIEFCT1JURUQgU1RBVEUKKwlpbmxpbmUgYm9vbCBpc0Rpc2FibGVPckFib3J0ZWQoY29uc3QgUnVudGltZUlEICYgYVJJRCkgY29uc3QKKwl7CisJCXJldHVybiggbVRhYmxlT2ZSRlN0YXRlRmxhZ3MtPmlzRGlzYWJsZU9yQWJvcnRlZCggYVJJRC5nZXRPZmZzZXQoKSApICk7CisJfQorCisJLy8gSURMRSBTVEFURQorCWlubGluZSBib29sIGlzSWRsZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZU9mUkZTdGF0ZUZsYWdzLT5pc0lkbGUoIG1SSUQuZ2V0T2Zmc2V0KCkgKSApOworCX0KKworCWlubGluZSBib29sIGlzSWRsZShjb25zdCBSdW50aW1lSUQgJiBhUklEKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVGFibGVPZlJGU3RhdGVGbGFncy0+aXNJZGxlKCBhUklELmdldE9mZnNldCgpICkgKTsKKwl9CisKKwkvLyBSVU5OSU5HIFNUQVRFCisJaW5saW5lIGJvb2wgaXNSdW5uaW5nKGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZU9mUkZTdGF0ZUZsYWdzLT5pc1J1bm5pbmcoIGFSSUQuZ2V0T2Zmc2V0KCkgKSApOworCX0KKworCS8vIElETEUgb3IgUlVOTklORyBTVEFURQorCWlubGluZSBib29sIGlzSWRsZU9yUnVubmluZyhjb25zdCBSdW50aW1lSUQgJiBhUklEKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVGFibGVPZlJGU3RhdGVGbGFncy0+aXNJZGxlT3JSdW5uaW5nKCBhUklELmdldE9mZnNldCgpICkgKTsKKwl9CisKKwkvLyBSVU5OQUJMRSBTVEFURQorCWlubGluZSBib29sIGlzUnVubmFibGUoY29uc3QgUnVudGltZUlEICYgYVJJRCkgY29uc3QKKwl7CisJCXJldHVybiggbVRhYmxlT2ZSRlN0YXRlRmxhZ3MtPmlzUnVubmFibGUoIGFSSUQuZ2V0T2Zmc2V0KCkgKSApOworCX0KKworCWlubGluZSBib29sIGlzdW5SdW5uYWJsZShjb25zdCBSdW50aW1lSUQgJiBhUklEKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVGFibGVPZlJGU3RhdGVGbGFncy0+aXN1blJ1bm5hYmxlKCBhUklELmdldE9mZnNldCgpICkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc3VuUnVubmFibGVTeXN0ZW0oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVGFibGVPZlJGU3RhdGVGbGFncy0+aXN1blJ1bm5hYmxlKCBTWVNURU1fUlVOVElNRV9PRkZTRVQgKSApOworCX0KKworCS8vIENSRUFURUQgb3IgUlVOTkFCTEUgU1RBVEUKKwlpbmxpbmUgYm9vbCBpc0NyZWF0ZWRPclJ1bm5hYmxlKGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZU9mUkZTdGF0ZUZsYWdzLT5pc0NyZWF0ZWRPclJ1bm5hYmxlKCBhUklELmdldE9mZnNldCgpICkgKTsKKwl9CisKKwkvLyBERUZJTkVEIC8gVU5ERUZJTkVEIFNUQVRFCisJaW5saW5lIGJvb2wgaXNEZWZpbmVkUEVTKGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZU9mUkZTdGF0ZUZsYWdzLT5pc0RlZmluZWQoIGFSSUQuZ2V0T2Zmc2V0KCkgKSApOworCX0KKworCWlubGluZSBib29sIGlzVW5kZWZpbmVkUEVTKGF2bV9vZmZzZXRfdCBvZmZzZXQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZU9mUkZTdGF0ZUZsYWdzLT5pc1VuZGVmaW5lZCggb2Zmc2V0ICkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBtYWtlV3JpdGFibGVSdW50aW1lRm9ybVN0YXRlVGFibGUoKQorCXsKKwkJbVRhYmxlT2ZSRlN0YXRlRmxhZ3MubWFrZVdyaXRhYmxlKCk7CisJfQorCisJaW5saW5lIHZvaWQgbXdzZXRSdW50aW1lRm9ybVN0YXRlKGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsCisJCQlQUk9DRVNTX0VWQUxfU1RBVEUgYVBFUykKKwl7CisJCW1ha2VXcml0YWJsZVJ1bnRpbWVGb3JtU3RhdGVUYWJsZSgpOworCisJCW1UYWJsZU9mUkZTdGF0ZUZsYWdzLT5zdGF0ZVNldChhUklELmdldE9mZnNldCgpLCBhUEVTKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRSdW50aW1lRm9ybVN0YXRlKGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsCisJCQlQUk9DRVNTX0VWQUxfU1RBVEUgYVBFUykKKwl7CisJCW1UYWJsZU9mUkZTdGF0ZUZsYWdzLT5zdGF0ZVNldChhUklELmdldE9mZnNldCgpLCBhUEVTKTsKKwl9CisKKworCWlubGluZSB2b2lkIG13c2V0UnVudGltZUZvcm1TdGF0ZShhdm1fc2l6ZV90IHJpZCwKKwkJCVBST0NFU1NfRVZBTF9TVEFURSBhUEVTKQorCXsKKwkJbWFrZVdyaXRhYmxlUnVudGltZUZvcm1TdGF0ZVRhYmxlKCk7CisKKwkJbVRhYmxlT2ZSRlN0YXRlRmxhZ3MtPnN0YXRlU2V0KHJpZCwgYVBFUyk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0UnVudGltZUZvcm1TdGF0ZShhdm1fc2l6ZV90IHJpZCwKKwkJCVBST0NFU1NfRVZBTF9TVEFURSBhUEVTKQorCXsKKwkJbVRhYmxlT2ZSRlN0YXRlRmxhZ3MtPnN0YXRlU2V0KHJpZCwgYVBFUyk7CisJfQorCisKKwkvLyBBU1NJR05BQklMSVRZCisJaW5saW5lIEJpdHNldCAqIGdldEFzc2lnbmVkKGF2bV9zaXplX3QgcmlkKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVGFibGVPZlJGU3RhdGVGbGFncy0+Z2V0QXNzaWduZWQocmlkKSApOworCX0KKworCWlubGluZSBib29sIGlzQXNzaWduZWQoY29uc3QgUnVudGltZUlEICYgYVJJRCwgYXZtX3NpemVfdCByaWQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZU9mUkZTdGF0ZUZsYWdzLT5pc0Fzc2lnbmVkKGFSSUQuZ2V0T2Zmc2V0KCksIHJpZCkgKTsKKwl9CisKKworCWlubGluZSB2b2lkIG13c2V0QXNzaWduZWQoY29uc3QgUnVudGltZUlEICYgYVJJRCwKKwkJCWF2bV9vZmZzZXRfdCB2YXJPZmZzZXQsIGJvb2wgZmxhZyA9IHRydWUpCisJeworCQltYWtlV3JpdGFibGVSdW50aW1lRm9ybVN0YXRlVGFibGUoKTsKKworCQltVGFibGVPZlJGU3RhdGVGbGFncy0+c2V0QXNzaWduZWQoKnRoaXMsCisJCQkJYVJJRC5nZXRPZmZzZXQoKSwgdmFyT2Zmc2V0LCBmbGFnKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRBc3NpZ25lZChjb25zdCBSdW50aW1lSUQgJiBhUklELAorCQkJYXZtX29mZnNldF90IHZhck9mZnNldCwgYm9vbCBmbGFnID0gdHJ1ZSkKKwl7CisJCW1UYWJsZU9mUkZTdGF0ZUZsYWdzLT5zZXRBc3NpZ25lZCgqdGhpcywKKwkJCQlhUklELmdldE9mZnNldCgpLCB2YXJPZmZzZXQsIGZsYWcpOworCX0KKworCisJLyoqCisJICogR0VUVEVSCisJICogbVRhYmxlT2ZBc3NpZ25lZEZsYWcKKwkgKi8KKwlUYWJsZU9mUnVudGltZUZvcm1TdGF0ZTo6VGFibGVPZkFzc2lnbmVkRmxhZyBnZXRUYWJsZU9mQXNzaWduZWRGbGFnKCkKKwl7CisJCXJldHVybiggbVRhYmxlT2ZSRlN0YXRlRmxhZ3MtPmdldFRhYmxlT2ZBc3NpZ25lZEZsYWcoKSApOworCX0KKworCXZvaWQgc2V0VGFibGVPZkFzc2lnbmVkRmxhZygKKwkJCVRhYmxlT2ZSdW50aW1lRm9ybVN0YXRlOjpUYWJsZU9mQXNzaWduZWRGbGFnIGFUYWJsZU9mQXNzaWduZWRGbGFnKQorCXsKKwkJbVRhYmxlT2ZSRlN0YXRlRmxhZ3MtPnNldFRhYmxlT2ZBc3NpZ25lZEZsYWcoIGFUYWJsZU9mQXNzaWduZWRGbGFnICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBtU2F2ZVRhYmxlT2ZBc3NpZ25lZEZsYWcKKwkgKi8KKwlUYWJsZU9mUnVudGltZUZvcm1TdGF0ZTo6CisJVGFibGVPZkFzc2lnbmVkRmxhZyBnZXRTYXZlVGFibGVPZkFzc2lnbmVkRmxhZygpIGNvbnN0OworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogUnVudGltZUZvcm0gQ0hJTEQKKwkgKi8KKwlpbmxpbmUgY29uc3QgUnVudGltZUlEICYgZ2V0UnVudGltZUZvcm1DaGlsZChjb25zdCBSdW50aW1lSUQgJiBhUklELAorCQkJY29uc3QgSW5zdGFuY2VPZk1hY2hpbmUgKiBhbkluc3RhbmNlKSBjb25zdAorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKCBnZXRSdW50aW1lKGFSSUQpLmdldENoaWxkKAorCQkJYW5JbnN0YW5jZS0+Z2V0T2Zmc2V0KCkgKS5nZXRJbnN0YW5jZSgpID09IGFuSW5zdGFuY2UgKQorCQkJCTw8ICJGYXRhbCBFcnJvcjogQmFkIGNoaWxkPCAiCisJCQkJPDwgYW5JbnN0YW5jZS0+Z2V0UXVhbGlmaWVkTmFtZUlEKCkKKwkJCQk8PCAiID4gT2Zmc2V0IGluIHJ1bnRpbWUgbWFjaGluZTwgIgorCQkJCTw8IGFSSUQuZ2V0UXVhbGlmaWVkTmFtZUlEKCkgPDwgIiA+ISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQlyZXR1cm4oIGdldFJ1bnRpbWUoYVJJRCkuZ2V0Q2hpbGQoYW5JbnN0YW5jZS0+Z2V0T2Zmc2V0KCkpICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtU3RhY2tPZkxvY2FsUnVudGltZQorCSAqLworCWlubGluZSB2b2lkIGNyZWF0ZUxvY2FsUnVudGltZVN0YWNrKCkKKwl7CisJCW1TdGFja09mTG9jYWxSdW50aW1lID0KKwkJCQlBUFN0YWNrT2ZMb2NhbFJ1bnRpbWUoIG5ldyBTdGFja09mTG9jYWxSdW50aW1lKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBkZXN0cm95TG9jYWxSdW50aW1lU3RhY2soKQorCXsKKwkJbVN0YWNrT2ZMb2NhbFJ1bnRpbWUuZGVzdHJveSgpOworCX0KKworCWlubGluZSBBUFN0YWNrT2ZMb2NhbFJ1bnRpbWUgJiBnZXRMb2NhbFJ1bnRpbWVzKCkKKwl7CisJCXJldHVybiggbVN0YWNrT2ZMb2NhbFJ1bnRpbWUgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQVBTdGFja09mTG9jYWxSdW50aW1lICYgZ2V0TG9jYWxSdW50aW1lcygpIGNvbnN0CisJeworCQlyZXR1cm4oIG1TdGFja09mTG9jYWxSdW50aW1lICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBoYXNMb2NhbFJ1bnRpbWUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtU3RhY2tPZkxvY2FsUnVudGltZS52YWxpZCgpCisJCQkJJiYgbVN0YWNrT2ZMb2NhbFJ1bnRpbWUtPm5vbmVtcHR5KCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNMb2NhbFJ1bnRpbWVTdGFjaygpIGNvbnN0CisJeworCQlyZXR1cm4oIG1TdGFja09mTG9jYWxSdW50aW1lLnZhbGlkKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBtYWtlV3JpdGFibGVMb2NhbFJ1bnRpbWVTdGFjaygpCisJeworCQlpZiggbVN0YWNrT2ZMb2NhbFJ1bnRpbWUudmFsaWQoKSApCisJCXsKKwkJCW1TdGFja09mTG9jYWxSdW50aW1lLm1ha2VXcml0YWJsZSgpOworCQl9CisJCWVsc2UKKwkJeworCQkJbVN0YWNrT2ZMb2NhbFJ1bnRpbWUucmVwbGFjZVBvaW50ZXIoIG5ldyBTdGFja09mTG9jYWxSdW50aW1lKCkgKTsKKwkJfQorCX0KKworCWlubGluZSB2b2lkIHNldExvY2FsUnVudGltZShhdm1fc2l6ZV90IG9mZnNldCwKKwkJCWNvbnN0IExvY2FsUnVudGltZSAmIGFMb2NhbFJ1bnRpbWUpCisJeworCQltU3RhY2tPZkxvY2FsUnVudGltZS0+c2V0TG9jYWxSdW50aW1lKG9mZnNldCwgYUxvY2FsUnVudGltZSk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtUGFyYW1ldGVyc1J1bnRpbWVGb3JtCisJICovCisJaW5saW5lIGNvbnN0IFBhcmFtZXRlcnNSdW50aW1lRm9ybSAmIGdldFBhcmFtZXRlcnNSdW50aW1lRm9ybSgpIGNvbnN0CisJeworCQlyZXR1cm4oIHN0YXRpY19jYXN0PCBjb25zdCBQYXJhbWV0ZXJzUnVudGltZUZvcm0gJiA+KAorCQkJCW1UYWJsZU9mUnVudGltZS5yZWYoUEFSQU1fTUFDSElORV9SVU5USU1FX09GRlNFVCkgKSApOworCX0KKworCWlubGluZSBQYXJhbWV0ZXJzUnVudGltZUZvcm0gJiBnZXRXcml0YWJsZVBhcmFtZXRlcnNSdW50aW1lRm9ybSgpCisJeworCQlQYXJhbWV0ZXJzUnVudGltZUZvcm0gJiBwUkYgPSBzdGF0aWNfY2FzdDwgUGFyYW1ldGVyc1J1bnRpbWVGb3JtICYgPigKKwkJCQltVGFibGVPZlJ1bnRpbWUucmVmV3JpdGFibGUoUEFSQU1fTUFDSElORV9SVU5USU1FX09GRlNFVCkgKTsKKworCQlwUkYucmVzZXRPZmZzZXQoKTsKKworCQlyZXR1cm4oIHBSRiApOworCisvLwkJcmV0dXJuKCBzdGF0aWNfY2FzdDwgUGFyYW1ldGVyc1J1bnRpbWVGb3JtICYgPigKKy8vCQkJCW1UYWJsZU9mUnVudGltZS5yZWZXcml0YWJsZSgKKy8vCQkJCQkJUEFSQU1fTUFDSElORV9SVU5USU1FX09GRlNFVCkgKSApOworCX0KKworCWlubGluZSBCRiBiZlBhcmFtZXRlcnNSdW50aW1lRm9ybSgpIGNvbnN0CisJeworCQlyZXR1cm4oICBtVGFibGVPZlJ1bnRpbWUudG9fc3A8IEJGID4oIFBBUkFNX01BQ0hJTkVfUlVOVElNRV9PRkZTRVQgKSApOworCX0KKworCisJaW5saW5lIGNvbnN0IFJ1bnRpbWVJRCAmIGdldFBhcmFtZXRlcnNSSUQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRSdW50aW1lKFBBUkFNX01BQ0hJTkVfUlVOVElNRV9PRkZTRVQpLmdldFJJRCgpICk7CisJfQorCisJaW5saW5lIGNvbnN0IEJGICYgc2F2ZVBhcmFtZXRlcihJbnN0YW5jZU9mRGF0YSAqIGFuSW5zdGFuY2UpCisJeworCQlyZXR1cm4oIGdldFdyaXRhYmxlUGFyYW1ldGVyc1J1bnRpbWVGb3JtKCkuc2F2ZVBhcmFtZXRlcihhbkluc3RhbmNlKSApOworCX0KKworCWlubGluZSB2b2lkIGFwcGVuZFBhcmFtZXRlcnMoQkZMaXN0ICYgcGFyYW1MaXN0KQorCXsKKwkJZ2V0V3JpdGFibGVQYXJhbWV0ZXJzUnVudGltZUZvcm0oKS5hcHBlbmRQYXJhbWV0ZXJzKHBhcmFtTGlzdCk7CisJfQorCisKKwlpbmxpbmUgdm9pZCBzYXZlUGFyYW1ldGVyc1J1bnRpbWVGb3JtKAorCQkJUGFyYW1ldGVyc1J1bnRpbWVGb3JtICogcGFyYW1zUkYpIGNvbnN0CisJeworCQltVGFibGVPZlJ1bnRpbWUuc2V0KFBBUkFNX01BQ0hJTkVfUlVOVElNRV9PRkZTRVQsIHBhcmFtc1JGKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBhc3NpZ25QYXJhbWV0ZXJzUnVudGltZUZvcm0oCisJCQlQYXJhbWV0ZXJzUnVudGltZUZvcm0gKiBwYXJhbXNSRikgY29uc3QKKwl7CisJCW1UYWJsZU9mUnVudGltZS5hc3NpZ24oUEFSQU1fTUFDSElORV9SVU5USU1FX09GRlNFVCwgcGFyYW1zUkYpOworCX0KKworCWlubGluZSB2b2lkIGFzc2lnblBhcmFtZXRlcnNSdW50aW1lRm9ybShjb25zdCBCRiAmIHBhcmFtc1JGKSBjb25zdAorCXsKKwkJbVRhYmxlT2ZSdW50aW1lLmFzc2lnbihQQVJBTV9NQUNISU5FX1JVTlRJTUVfT0ZGU0VULAorCQkJCXBhcmFtc1JGLnRvX3B0cjwgUnVudGltZUZvcm0gPigpICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBTeXN0ZW0gUnVudGltZUZvcm0KKwkgKi8KKwlpbmxpbmUgY29uc3QgUnVudGltZUZvcm0gJiBnZXRTeXN0ZW1SdW50aW1lKCkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0UnVudGltZShTWVNURU1fUlVOVElNRV9PRkZTRVQpICk7CisJfQorCisJaW5saW5lIGNvbnN0IFJ1bnRpbWVJRCAmIGdldFN5c3RlbVJJRCgpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldFJ1bnRpbWUoU1lTVEVNX1JVTlRJTUVfT0ZGU0VUKS5nZXRSSUQoKSApOworCX0KKworCWlubGluZSB2b2lkIHNldFN5c3RlbVJJRCgpCisJeworCQlzZXRSSUQoIGdldFN5c3RlbVJJRCgpICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtUklECisJICovCisJaW5saW5lIGNvbnN0IFJ1bnRpbWVJRCAmIGdldFJJRCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1SSUQgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRSSUQoY29uc3QgUnVudGltZUlEICYgYVJJRCkKKwl7CisJCW1SSUQgPSBhUklEOworCX0KKworCS8qCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogQXZtIEVuZGluZyBFeGVjdXRpb24gU3RhdHVzCisJICovCisJaW5saW5lIEFWTV9FWEVDX0VORElOR19TVEFUVVMgZ2V0QUVFUygpIGNvbnN0CisJeworCQlyZXR1cm4oIG1BRUVTICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0QUVFUyhBVk1fRVhFQ19FTkRJTkdfU1RBVFVTIGFuQUVFUykKKwl7CisJCW1BRUVTID0gYW5BRUVTOworCX0KKworCisJLyoKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBBdm0gRXhlY3V0aW9uIFN5bmNocm9uaXphdGlvbiBQb2ludAorCSAqLworCWlubGluZSB2b2lkIHB1c2hFeGVjU3luY1BvaW50KAorCQkJRXhlY3V0aW9uU3luY2hyb25pemF0aW9uUG9pbnQgKiBhbkV4ZWNTeW5jUG9pbnQpCisJeworCQlpZiggbUVYRUNfU1lOQ19QT0lOVCA9PSBOVUxMICApCisJCXsKKwkJCW1FWEVDX1NZTkNfUE9JTlQgPSBhbkV4ZWNTeW5jUG9pbnQ7CisJCX0KKwkJZWxzZQorCQl7CisJCQlFeGVjdXRpb25TeW5jaHJvbml6YXRpb25Qb2ludCAqIGxhc3RFU1AgPSBtRVhFQ19TWU5DX1BPSU5UOworCQkJd2hpbGUoIGxhc3RFU1AtPm5leHQgIT0gTlVMTCApCisJCQl7CisJCQkJbGFzdEVTUCA9IGxhc3RFU1AtPm5leHQ7CisJCQl9CisJCQlsYXN0RVNQLT5uZXh0ID0gYW5FeGVjU3luY1BvaW50OworCQl9CisJfQorCisKKwkvKioKKwkgKiBJTlNUQU5DSUFUSU9OIEJPVU5EIFRFU1QKKwkgKi8KKwlib29sIGNvdWxkQmVJbnN0YW5jaWF0ZWQoSW5zdGFuY2VPZk1hY2hpbmUgKiBhbkluc3RhbmNlKSBjb25zdDsKKworCisJLyoqCisJICogQ09NUEFSSVNPTgorCSAqIE9QRVJBVE9SCisJICoKKwkgKiBUUklWSUFMIEVRVUFMSVRZCisJICovCisJdmlydHVhbCBib29sIGlzVEVRKGNvbnN0IEV4ZWN1dGlvbkRhdGEgKiBhbkVEKSBjb25zdAorCXsKKwkJaWYoIHRoaXMgPT0gYW5FRCApCisJCXsKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisJCWVsc2UgaWYoIG1UYWJsZU9mUkZTdGF0ZUZsYWdzLT5lcXVhbHNTdGF0ZSgKKwkJCQlhbkVELT5tVGFibGVPZlJGU3RhdGVGbGFncyApICkKKwkJeworCQkJcmV0dXJuKCAobVRhYmxlT2ZSdW50aW1lID09IGFuRUQtPm1UYWJsZU9mUnVudGltZSkKKwkJCQkJJiYgbVBhdGhDb25kaXRpb24uaXNURVEoYW5FRC0+bVBhdGhDb25kaXRpb24pCisJCQkJCSYmIG1QYXRoVGltZWRDb25kaXRpb24uaXNURVEoYW5FRC0+bVBhdGhUaW1lZENvbmRpdGlvbikKKwkJCQkJJiYgKG1TdGFja09mTG9jYWxSdW50aW1lID09IGFuRUQtPm1TdGFja09mTG9jYWxSdW50aW1lKSApOworCQl9CisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc1RORVEoY29uc3QgRXhlY3V0aW9uRGF0YSAqIGFuRUQpIGNvbnN0CisJeworCQlyZXR1cm4oIG5vdCBpc1RFUSggYW5FRCApICk7CisJfQorCit9OworCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQVZNIFNNQVJUIFBPSU5URVIgRk9SIEV4ZWN1dGlvbkRhdGEKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCisjZGVmaW5lIEFWTV9ERUJVR19FWEVDVVRJT05fREFUQV9QT0lOVEVSICB0cnVlCisjdW5kZWYgQVZNX0RFQlVHX0VYRUNVVElPTl9EQVRBX1BPSU5URVIKKworI2lmIGRlZmluZWQoQVZNX0RFQlVHX0VYRUNVVElPTl9EQVRBX1BPSU5URVIpCisKKwkjZGVmaW5lIEFWTV9ERUNMQVJFX0RFQlVHX0VYRUNVVElPTl9EQVRBX1BUUiBjb25zdCBFeGVjdXRpb25EYXRhICogZGVidWdQVFI7CisKKwkjZGVmaW5lIEFWTV9JTklUX0RFQlVHX0VYRUNVVElPTl9EQVRBX1BUUiggcHRyICkgICwgZGVidWdQVFIoIHB0ciApCisKKwkjZGVmaW5lIEFWTV9BU1NJR05fU1RNTlRfREVCVUdfRVhFQ1VUSU9OX0RBVEFfUFRSKCBwdHIgKSAgZGVidWdQVFIgPSBwdHI7CisKKwkjZGVmaW5lIEFWTV9BU1NJR05fRVhQUl9ERUJVR19FWEVDVVRJT05fREFUQV9QVFIoIHB0ciApICAgZGVidWdQVFIgPSBwdHIKKworI2Vsc2UKKworCSNkZWZpbmUgQVZNX0RFQ0xBUkVfREVCVUdfRVhFQ1VUSU9OX0RBVEFfUFRSCisKKwkjZGVmaW5lIEFWTV9JTklUX0RFQlVHX0VYRUNVVElPTl9EQVRBX1BUUiggcHRyICkKKworCSNkZWZpbmUgQVZNX0FTU0lHTl9TVE1OVF9ERUJVR19FWEVDVVRJT05fREFUQV9QVFIoIHB0ciApCisKKwkjZGVmaW5lIEFWTV9BU1NJR05fRVhQUl9ERUJVR19FWEVDVVRJT05fREFUQV9QVFIoIHB0ciApICBwdHIKKworI2VuZGlmCisKKworY2xhc3MgQVBFeGVjdXRpb25EYXRhIDoKKwkJcHVibGljIEF2bVBvaW50ZXI8IEV4ZWN1dGlvbkRhdGEgLCBEZXN0cm95RWxlbWVudFBvbGljeSA+Cit7CisKK3ByaXZhdGU6CisJLyoqCisJICogVFlQRURFRgorCSAqLworCXR5cGVkZWYgIEF2bVBvaW50ZXI8IEV4ZWN1dGlvbkRhdGEgLCBEZXN0cm95RWxlbWVudFBvbGljeSA+IGJhc2VfdGhpc190eXBlOworCisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBPbmx5IGZvciBkZWJ1ZyBmYWNpbGl0aWVzCisJICovCisJQVZNX0RFQ0xBUkVfREVCVUdfRVhFQ1VUSU9OX0RBVEFfUFRSCisKKworcHVibGljOgorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQVBFeGVjdXRpb25EYXRhKCkKKwk6IGJhc2VfdGhpc190eXBlKCApCisJQVZNX0lOSVRfREVCVUdfRVhFQ1VUSU9OX0RBVEFfUFRSKCBOVUxMICkKKwl7CisJCS8vISEhIE5PVEhJTkcKKwl9CisKKwlleHBsaWNpdCBBUEV4ZWN1dGlvbkRhdGEoRXhlY3V0aW9uRGF0YSAqIGFuRUQpCisJOiBiYXNlX3RoaXNfdHlwZSggQVZNX0FTU0lHTl9FWFBSX0RFQlVHX0VYRUNVVElPTl9EQVRBX1BUUiggYW5FRCApICkKKwl7CisJCS8vISEhIE5PVEhJTkcKKwl9CisKKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkFQRXhlY3V0aW9uRGF0YSgpCisJeworCQkvLyEhISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiByZXNpemUKKwkgKi8KKwl2b2lkIHJlc2l6ZShhdm1fc2l6ZV90IG5ld01hY2hpbmVDb3VudCkKKwl7CisJCW1ha2VXcml0YWJsZSgpOworCisJCXJhd19wb2ludGVyKCktPnJlc2l6ZShuZXdNYWNoaW5lQ291bnQpOworCX0KKworCisJLyoqCisJICogR0VUVEVSCisJICogdGhlIFByZXZpb3VzIEV4ZWN1dGlvbkRhdGEKKwkgKi8KKwlBUEV4ZWN1dGlvbkRhdGEgJiBnZXRQcmV2aW91cygpOworCisJY29uc3QgQVBFeGVjdXRpb25EYXRhICYgZ2V0UHJldmlvdXMoKSBjb25zdDsKKworCWJvb2wgaGFzUHJldmlvdXMoKSBjb25zdDsKKworCisJaW5saW5lIHZvaWQgbXdzZXRQYXRoQ29uZGl0aW9uKGNvbnN0IEJGICYgbUNvbmRpdGlvbikKKwl7CisJCW1ha2VXcml0YWJsZSgpOworCisJCXJhd19wb2ludGVyKCktPnNldFBhdGhDb25kaXRpb24oIG1Db25kaXRpb24gKTsKKworCX0KKworCWlubGluZSB2b2lkIG13c2V0UGF0aFRpbWVkQ29uZGl0aW9uKGNvbnN0IEJGICYgbUNvbmRpdGlvbikKKwl7CisJCW1ha2VXcml0YWJsZSgpOworCisJCXJhd19wb2ludGVyKCktPnNldFBhdGhUaW1lZENvbmRpdGlvbiggbUNvbmRpdGlvbiApOworCisJfQorCisKKwkvKioKKwkgKiBTRVRURVIKKwkgKiBtYWtlIE1vZGlmaWFibGUKKwkgKi8KKwlpbmxpbmUgdm9pZCBtYWtlTW9kaWZpYWJsZVBhcmFtVGFibGUoKQorCXsKKwkJbWFrZVdyaXRhYmxlKCk7CisKKwkJLy8gVE9ETyBSZXZvaXIgbGEgZ2VzdGlvbiBkZSBsYSBsaXN0ZSBkZXMgbm91dmVhdXggcGFyYW1ldHJlcworLy8JCWlmKCBoYXNQYXJhbSgpICYmIGdldFBhcmFtKCktPmlzTXVsdGlwbGUoKSApCisvLwkJeworLy8JCQlkZWNSZWZDb3VudGVyKCBnZXRQYXJhbSgpICk7CisvLwkJCXNldFBhcmFtKCBuZXcgVGFibGVPZkluc3RhbmNlKCkgKTsKKy8vCQl9CisJfQorCisKKwlpbmxpbmUgdm9pZCBtYWtlTW9kaWZpYWJsZUxvY2FsUnVudGltZShMb2NhbFJ1bnRpbWUgJiBhTG9jYWxSdW50aW1lKQorCXsKKwkJbWFrZVdyaXRhYmxlKCk7CisKKwkJcmF3X3BvaW50ZXIoKS0+bWFrZVdyaXRhYmxlTG9jYWxSdW50aW1lU3RhY2soKTsKKworCQlhTG9jYWxSdW50aW1lLm1ha2VXcml0YWJsZSgpOworCisJCXJhd19wb2ludGVyKCktPnNldExvY2FsUnVudGltZSgKKwkJCQlhTG9jYWxSdW50aW1lLmdldE9mZnNldCgpICwgYUxvY2FsUnVudGltZSApOworCX0KKworCisJaW5saW5lIFJ1bnRpbWVGb3JtICYgZ2V0V3JpdGFibGVSdW50aW1lKGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQpCisJeworCQltYWtlV3JpdGFibGUoKTsKKworCQlyZXR1cm4oIHJhd19wb2ludGVyKCktPmdldFdyaXRhYmxlUnVudGltZShhUklEKSApOworCisJfQorCisJaW5saW5lIEFQVGFibGVPZkRhdGEgJiBnZXRXcml0YWJsZVJ1bnRpbWVEYXRhVGFibGUoY29uc3QgUnVudGltZUlEICYgYVJJRCkKKwl7CisJCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCgKKwkJCXJhd19wb2ludGVyKCktPmdldFJ1bnRpbWUoYVJJRCkuaGFzRGF0YVRhYmxlKCkgKQorCQkJCTw8ICJVbmV4cGVjdGVkIFJ1bnRpbWVGb3JtIHdpdGhvdXQgZGF0YSAhISEiCisJCQkJPDwgU0VORF9FWElUOworCisJCW1ha2VXcml0YWJsZSgpOworCisJCXJldHVybiggcmF3X3BvaW50ZXIoKS0+Z2V0V3JpdGFibGVSdW50aW1lKGFSSUQpLmdldFdyaXRhYmxlRGF0YVRhYmxlKCkgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1UYWJsZU9mUkZTdGF0ZUZsYWdzCisJICovCisKKwlpbmxpbmUgdm9pZCBtd3NldFJ1bnRpbWVGb3JtU3RhdGUoCisJCQljb25zdCBSdW50aW1lSUQgJiBhUklELCBQUk9DRVNTX0VWQUxfU1RBVEUgYVBFUykKKwl7CisJCW1ha2VXcml0YWJsZSgpOworCisJCXJhd19wb2ludGVyKCktPm13c2V0UnVudGltZUZvcm1TdGF0ZShhUklELmdldE9mZnNldCgpLCBhUEVTKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBtd3NldFJ1bnRpbWVGb3JtU3RhdGUoUFJPQ0VTU19FVkFMX1NUQVRFIGFQRVMpCisJeworCQltd3NldFJ1bnRpbWVGb3JtU3RhdGUocmF3X3BvaW50ZXIoKS0+bVJJRCwgYVBFUyk7CisJfQorCisJaW5saW5lIHZvaWQgbXdzZXRSdW50aW1lRm9ybVN0YXRlKGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsCisJCQlQUk9DRVNTX0VWQUxfU1RBVEUgb2xkUEVTLCBQUk9DRVNTX0VWQUxfU1RBVEUgYVBFUykKKwl7CisJCW1ha2VXcml0YWJsZSgpOworCisJCWlmKCByYXdfcG9pbnRlcigpLT5nZXRSdW50aW1lRm9ybVN0YXRlKGFSSUQpID09IG9sZFBFUyApCisJCXsKKwkJCXJhd19wb2ludGVyKCktPm13c2V0UnVudGltZUZvcm1TdGF0ZShhUklELmdldE9mZnNldCgpLCBhUEVTKTsKKworCQkJcmF3X3BvaW50ZXIoKS0+c2V0QUVFUyggUnVudGltZURlZjo6UEVTX3RvX0FFRVMoCisJCQkJCWFQRVMsIHJhd19wb2ludGVyKCktPmdldEFFRVMoKSApICk7CisJCX0KKwl9CisKKworCS8qKgorCSAqIFNFVFRFUgorCSAqIG1PblNjaGVkdWxlCisJICovCisJaW5saW5lIHZvaWQgbXdzZXRSdW50aW1lRm9ybU9uU2NoZWR1bGUoCisJCQljb25zdCBSdW50aW1lSUQgJiBhUklELCBjb25zdCBCRkNvZGUgJiBvblNjaGVkdWxlKQorCXsKKwkJaWYoIGFSSUQuZ2V0RXhlY3V0YWJsZSgpLT5pc011dGFibGVTY2hlZHVsZSgpICYmCisJCQkob25TY2hlZHVsZSAhPSByYXdfcG9pbnRlcigpLT5nZXRSdW50aW1lKGFSSUQpLmdldE9uU2NoZWR1bGUoKSkgKQorCQl7CisJCQltYWtlV3JpdGFibGUoKTsKKworCQkJcmF3X3BvaW50ZXIoKS0+Z2V0V3JpdGFibGVSdW50aW1lKGFSSUQpLnNldE9uU2NoZWR1bGUoIG9uU2NoZWR1bGUgKTsKKwkJfQorCX0KKworCWlubGluZSB2b2lkIG13c2V0UnVudGltZUZvcm1PblNjaGVkdWxlQW5kSWRsZShjb25zdCBSdW50aW1lSUQgJiBhUklEKQorCXsKKwkJbXdzZXRSdW50aW1lRm9ybU9uU2NoZWR1bGUoYVJJRC5nZXRQUklEKCksIGFSSUQuZ2V0T25SdW5uaW5nKCkpOworCisvLwkJbXdzZXRSdW50aW1lRm9ybU9uU2NoZWR1bGUoYVJJRC5nZXRQUklEKCksCisvLwkJCQlhUklELmhhc09uUnVubmluZygpID8gYVJJRC5nZXRPblJ1bm5pbmcoKSA6CisvLwkJCQkJCVN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdPcHRpTm9wQ29kZSgKKy8vCQkJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1JVTiwgYVJJRCwKKy8vCQkJCQkJCQlBVk1fQVJHX01BQ0hJTkVfUklEKSApOworCisJCWlmKCBub3QgcmF3X3BvaW50ZXIoKS0+aXNJZGxlKCkgKQorCQl7CisJCQlyYXdfcG9pbnRlcigpLT5td3NldFJ1bnRpbWVGb3JtU3RhdGUoYVJJRCwgUFJPQ0VTU19JRExFX1NUQVRFKTsKKwkJfQorCX0KKworCisJLyoqCisJICogU0VUVEVSCisJICogbURlZmVyCisJICovCisJaW5saW5lIHZvaWQgbXdzZXRSdW50aW1lRm9ybU9uRGVmZXIoCisJCQljb25zdCBSdW50aW1lSUQgJiBhUklELCBjb25zdCBCRkNvZGUgJiBvbkRlZmVyKQorCXsKKwkJbWFrZVdyaXRhYmxlKCk7CisKKwkJcmF3X3BvaW50ZXIoKS0+Z2V0V3JpdGFibGVSdW50aW1lKCBhUklEICkuc2V0T25EZWZlciggb25EZWZlciApOworCX0KKworCisJLyoKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBBdm0gRXhlY3V0aW9uIFN5bmNocm9uaXphdGlvbiBQb2ludAorCSAqLworCWlubGluZSB2b2lkIHB1c2hFeGVjU3luY1BvaW50KAorCQkJRXhlY3V0aW9uU3luY2hyb25pemF0aW9uUG9pbnQgKiBhbkV4ZWNTeW5jUG9pbnQpCisJeworCQltYWtlV3JpdGFibGUoKTsKKworCQlyYXdfcG9pbnRlcigpLT5wdXNoRXhlY1N5bmNQb2ludCggYW5FeGVjU3luY1BvaW50ICk7CisJfQorCisJLyoKKwkgKiBTRVRURVIKKwkgKiBBdm0gRW5kaW5nIEV4ZWN1dGlvbiBTdGF0dXMKKwkgKi8KKwlpbmxpbmUgdm9pZCBtd3NldEFFRVMoQVZNX0VYRUNfRU5ESU5HX1NUQVRVUyBhbkFFRVMpCisJeworCQltYWtlV3JpdGFibGUoKTsKKworCQlyYXdfcG9pbnRlcigpLT5zZXRBRUVTKCBhbkFFRVMgKTsKKwl9CisKKworCS8qKgorCSAqIFNFVFRFUgorCSAqIG1JT0VsZW1lbnRUcmFjZQorCSAqLworCWlubGluZSB2b2lkIG13c2V0SU9FbGVtZW50VHJhY2UoY29uc3QgQkYgJiBhbklPRWxlbWVudFRyYWNlKQorCXsKKwkJbWFrZVdyaXRhYmxlKCk7CisKKwkJcmF3X3BvaW50ZXIoKS0+c2V0SU9FbGVtZW50VHJhY2UoIGFuSU9FbGVtZW50VHJhY2UgKTsKKwl9CisKKworCS8qKgorCSAqIFNFVFRFUgorCSAqIG1SdW5uYWJsZUVsZW1lbnRUcmFjZQorCSAqLworCWlubGluZSB2b2lkIG13c2V0UnVubmFibGVFbGVtZW50VHJhY2UoY29uc3QgQkYgJiBhUnVubmFibGVFbGVtZW50VHJhY2UpCisJeworCQltYWtlV3JpdGFibGUoKTsKKworCQlyYXdfcG9pbnRlcigpLT5zZXRSdW5uYWJsZUVsZW1lbnRUcmFjZShhUnVubmFibGVFbGVtZW50VHJhY2UpOworCX0KKworCisJLyoqCisJICogU0VUVEVSCisJICogbVJJRAorCSAqLworCisJaW5saW5lIHZvaWQgbXdzZXRSSUQoY29uc3QgUnVudGltZUlEICYgYVJJRCkKKwl7CisJCW1ha2VXcml0YWJsZSgpOworCQlyYXdfcG9pbnRlcigpLT5zZXRSSUQoIGFSSUQgKTsKKwl9CisKKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVBhcmFtZXRlcnNSdW50aW1lRm9ybQorCSAqLworCWlubGluZSBjb25zdCBCRiAmIHNhdmVQYXJhbWV0ZXIoSW5zdGFuY2VPZkRhdGEgKiBhbkluc3RhbmNlKQorCXsKKwkJbWFrZVdyaXRhYmxlKCk7CisKKwkJcmV0dXJuKCByYXdfcG9pbnRlcigpLT5zYXZlUGFyYW1ldGVyKGFuSW5zdGFuY2UpICk7CisJfQorCisJaW5saW5lIHZvaWQgYXBwZW5kUGFyYW1ldGVycyhCRkxpc3QgJiBwYXJhbUxpc3QpCisJeworCQltYWtlV3JpdGFibGUoKTsKKworCQlyYXdfcG9pbnRlcigpLT5hcHBlbmRQYXJhbWV0ZXJzKHBhcmFtTGlzdCk7CisJfQorCisKKwlpbmxpbmUgUGFyYW1ldGVyc1J1bnRpbWVGb3JtICYgZ2V0V3JpdGFibGVQYXJhbWV0ZXJzUnVudGltZUZvcm0oKQorCXsKKwkJbWFrZVdyaXRhYmxlKCk7CisKKwkJcmV0dXJuKCByYXdfcG9pbnRlcigpLT5nZXRXcml0YWJsZVBhcmFtZXRlcnNSdW50aW1lRm9ybSgpICk7CisJfQorCisKKworCisJLyoqCisJICogQ09NUEFSSVNPTgorCSAqIE9QRVJBVE9SCisJICoKKwkgKiBUUklWSUFMIEVRVUFMSVRZCisJICovCisJaW5saW5lIGJvb2wgaXNURVEoY29uc3QgQVBFeGVjdXRpb25EYXRhICYgcHJldkVEKQorCXsKKwkJcmV0dXJuKCByYXdfcG9pbnRlcigpLT5pc1RFUSggcHJldkVELnJhd19wb2ludGVyKCkgKSApOworCX0KKworCWlubGluZSBib29sIGlzVE5FUShjb25zdCBBUEV4ZWN1dGlvbkRhdGEgJiBwcmV2RUQpCisJeworCQlyZXR1cm4oIHJhd19wb2ludGVyKCktPmlzVE5FUSggcHJldkVELnJhd19wb2ludGVyKCkgKSApOworCX0KKworCisJLyoqCisJICogREVGQVVMVCBOVUxMCisJICovCisJc3RhdGljIEFQRXhlY3V0aW9uRGF0YSBSRUZfTlVMTDsKKworfTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVFlQRSBERUZJTklUSU9OIGZvciBDT05UQUlORVIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3R5cGVkZWYgQ29sbGVjdGlvbjwgQVBFeGVjdXRpb25EYXRhID4gICAgICAgIENvbGxlY3Rpb25PZkFQRXhlY3V0aW9uRGF0YTsKKwordHlwZWRlZiBMaXN0ICAgICAgPCBBUEV4ZWN1dGlvbkRhdGEgPiAgICAgICAgTGlzdE9mQVBFeGVjdXRpb25EYXRhOworCit0eXBlZGVmIFZlY3RvciAgICA8IEFQRXhlY3V0aW9uRGF0YSA+ICAgICAgICBWZWN0b3JPZkFQRXhlY3V0aW9uRGF0YTsKKwordHlwZWRlZiBWZWN0b3IgICAgPCBMaXN0T2ZBUEV4ZWN1dGlvbkRhdGEgPiAgVmVjdG9yT2ZMaXN0T2ZBUEV4ZWN1dGlvbkRhdGE7CisKKworfQorCisjZW5kaWYgLypFWEVDVVRJT05EQVRBX0hfKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL0V4ZWN1dGlvbkluZm9ybWF0aW9uLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL0V4ZWN1dGlvbkluZm9ybWF0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODQ0NzI2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3J1bnRpbWUvRXhlY3V0aW9uSW5mb3JtYXRpb24uY3BwCkBAIC0wLDAgKzEsNjY2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTEgb2N0LiAyMDEwCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJFeGVjdXRpb25JbmZvcm1hdGlvbi5oIgorCisjaW5jbHVkZSA8ZmFtL2FwaS9BYnN0cmFjdFByb2Nlc3NvclVuaXQuaD4KKworI2luY2x1ZGUgPGZhbS9jb3ZlcmFnZS9Gb3JtdWxhQ292ZXJhZ2VGaWx0ZXIuaD4KKworI2luY2x1ZGUgPGZhbS9oaXRvcmp1bXAvQXZtSGl0T3JKdW1wUHJvY2Vzc29yLmg+CisKKyNpbmNsdWRlIDxmYW0vdGVzdGluZy9PZmZsaW5lVGVzdFByb2Nlc3Nvci5oPgorCisjaW5jbHVkZSA8Zm1sL3RyYWNlL1RyYWNlUG9pbnQuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoqCisgKiBHRVRURVIgLSBTRVRURVIKKyAqIG1Qcm9jZXNzb3JSZWdpc3RlclRvb2wKKyAqLworYm9vbCBHZW5lcmljSW5mb0RhdGE6OmlzSW5mbyhjb25zdCBBYnN0cmFjdFByb2Nlc3NvclVuaXQgJiBhUHJvY2Vzc29yKSBjb25zdAoreworCXJldHVybiggaXNJbmZvKGFQcm9jZXNzb3IuUkVHSVNURVJfVE9PTCgpKSB8fCAvKlRPRE8gJiYqLworCQkJaXNJRChhUHJvY2Vzc29yLmdldFBhcmFtZXRlcldPYmplY3QoKSkgKTsKK30KKworYm9vbCBHZW5lcmljSW5mb0RhdGE6OmlzSW5mbygKKwkJY29uc3QgQWJzdHJhY3RQcm9jZXNzb3JVbml0ICYgYVByb2Nlc3NvciwgY29uc3QgQkYgJiBhbklEKSBjb25zdAoreworCXJldHVybiggaXNJbmZvKGFQcm9jZXNzb3IuUkVHSVNURVJfVE9PTCgpKSAmJiBpc0lEKGFuSUQpICk7Cit9CisKKworLyoqCisgKiBTZXJpYWxpemF0aW9uCisgKi8KKworc3RkOjpzdHJpbmcgR2VuZXJpY0luZm9EYXRhOjpzdHJVSUQoKSBjb25zdAoreworCXJldHVybiggbUlELnZhbGlkKCkKKwkJCT8gKCBtSUQuaXNCdWlsdGluU3RyaW5nKCkgPyBtSUQudG9CdWlsdGluU3RyaW5nKCkgOiBtSUQuc3RyKCkgKQorCQkJOiAiIiApOworfQorCit2b2lkIEdlbmVyaWNJbmZvRGF0YTo6dG9TdHJlYW0oT3V0U3RyZWFtICYgb3V0KSBjb25zdAoreworCW91dCA8PCBUQUIgPDwgImluZm8gIjsKKworCWlmICggaGFzSUQoKSApCisJeworCQlvdXQgPDwgIlwiIiA8PCBnZXRJRCgpLnN0cigpIDw8ICJcIiB7IiA8PCBFT0w7CisJfQorCisJaWYgKCBoYXNEYXRhKCkgKQorCXsKKwkJaWYoIGdldERhdGEoKS5pczwgRXhlY3V0aW9uQ29udGV4dEhlYWRlciA+KCkgKQorCQl7CisJCQlFeGVjdXRpb25Db250ZXh0SGVhZGVyICogZWNoID0KKwkJCQkJZ2V0RGF0YSgpLnRvX3B0cjwgRXhlY3V0aW9uQ29udGV4dEhlYWRlciA+KCk7CisKKwkJCW91dCA8PCBUQUIyIDw8ICJFQzwgIgorCQkJCTw8ICJJZDoiIDw8IGVjaC0+Z2V0SWROdW1iZXIoKSAgIDw8ICIgLCAiCisJCQkJPDwgIkV2OiIgPDwgZWNoLT5nZXRFdmFsTnVtYmVyKCkgPDwgIiAsICIKKwkJCQk8PCAgIkg6IiA8PCBlY2gtPmdldEhlaWdodCgpICAgICA8PCAiICwgIgorCQkJCTw8ICAiVzoiIDw8IGVjaC0+Z2V0V2lkdGgoKSAgICAgIDw8ICIgPjsiIDw8IEVPTDsKKwkJfQorCQllbHNlIGlmKCBnZXREYXRhKCkuaXNCdWlsdGluU3RyaW5nKCkgKQorCQl7CisJCQlvdXQgPDwgVEFCMiA8PCBnZXREYXRhKCkudG9CdWlsdGluU3RyaW5nKCkgPDwgRU9MOworCQl9CisJCWVsc2UKKwkJeworCQkJb3V0IDw8IFRBQjIgPDwgZ2V0RGF0YSgpLnN0cigpIDw8IEVPTDsKKwkJfQorCX0KKworCW91dCA8PCBUQUIgPDwgIn0iIDw8IEVPTF9GTFVTSDsKK30KKworCit2b2lkIEdlbmVyaWNJbmZvRGF0YTo6dG9Gc2NuKE91dFN0cmVhbSAmIG91dCkgY29uc3QKK3sKKwlvdXQgPDwgVEFCIDw8ICI8SUQ6IjsKKwlpZiAoIGhhc0lEKCkgKQorCXsKKwkJb3V0ICA8PCAiXCIiOworCQlpZiggZ2V0SUQoKS5pczwgQWJzdHJhY3RQcm9jZXNzb3JVbml0ID4oKSApCisJCXsKKwkJCUFic3RyYWN0UHJvY2Vzc29yVW5pdCAqIGFuQVBVID0KKwkJCQkJZ2V0SUQoKS50b19wdHI8IEFic3RyYWN0UHJvY2Vzc29yVW5pdCA+KCk7CisJCQlvdXQgPDwgYW5BUFUtPmdldFBhcmFtZXRlcldPYmplY3QoKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW91dCA8PCBnZXRJRCgpLnN0cigpOworCQl9CisJCW91dCA8PCAiXCIiOworCX0KKwllbHNlCisJeworCQlvdXQgPDwgIlwiTlVMTFwiIjsKKwl9CisKKwlpZiAoIGhhc0RhdGEoKSApCisJeworCQlvdXQgIDw8ICIsIjsKKworCQlpZiggZ2V0RGF0YSgpLmlzPCBFeGVjdXRpb25Db250ZXh0SGVhZGVyID4oKSApCisJCXsKKwkJCUV4ZWN1dGlvbkNvbnRleHRIZWFkZXIgKiBlY2ggPQorCQkJCQlnZXREYXRhKCkudG9fcHRyPCBFeGVjdXRpb25Db250ZXh0SGVhZGVyID4oKTsKKworCQkJb3V0IDw8ICJJZD1cIiIgPDwgZWNoLT5nZXRJZE51bWJlcigpICAgPDwgIlwiLCAiCisJCQkJPDwgIkV2PVwiIiA8PCBlY2gtPmdldEV2YWxOdW1iZXIoKSA8PCAiXCIsICIKKwkJCQk8PCAgIkg9XCIiIDw8IGVjaC0+Z2V0SGVpZ2h0KCkgICAgIDw8ICJcIiwgIgorCQkJCTw8ICAiVz1cIiIgPDwgZWNoLT5nZXRXaWR0aCgpICAgICAgPDwgIlwiIjsKKwkJfQorCQllbHNlIGlmKCBnZXREYXRhKCkuaXM8IFN0cmluZyA+KCkgKQorCQl7CisJCQlvdXQgPDwgImtpbmQ9XCIiIDw8IGdldERhdGEoKS50b19wdHI8IFN0cmluZyA+KCktPmdldFZhbHVlKCkKKwkJCQkJPDwgIlwiIjsKKwkJfQorCQllbHNlIGlmKCBnZXREYXRhKCkuaXM8IEF2bUNvZGUgPigpICkKKwkJeworCQkJb3V0IDw8ICJhdm1jb2RlPSBcIiIgPDwgZ2V0RGF0YSgpLnN0cigpIDw8ICJcIiI7CisJCX0KKwkJZWxzZSBpZiggZ2V0RGF0YSgpLmlzSW50ZWdlcigpICkKKwkJeworCQkJb3V0IDw8ICJ2YWx1ZT1cIiIgPDwgZ2V0RGF0YSgpLnRvSW50ZWdlcigpIDw8ICJcIiI7CisJCX0KKwkJZWxzZSBpZiggZ2V0RGF0YSgpLmlzPCBUcmFjZVBvaW50ID4oKSApCisJCXsKKwkJCW91dCA8PCAiaG9qPVwiIiA8PCBnZXREYXRhKCkudG9fcHRyPCBUcmFjZVBvaW50ID4oKS0+c3RyKCkgPDwgIlwiIjsKKwkJfQorCQllbHNlCisJCXsKKwkJCW91dCA8PCAia2luZD1cIiIgPDwgZ2V0RGF0YSgpLl9zdHIoKSA8PCAgIlwiIjsKKwkJfQorCX0KKworCW91dCA8PCAiPiIgPDwgRU9MX0ZMVVNIOworfQorCisKKworLyoqCisgKiBERVNUUlVDVE9SCisgKi8KK0V4ZWN1dGlvbkluZm9ybWF0aW9uOjp+RXhlY3V0aW9uSW5mb3JtYXRpb24oKQoreworCXNlcDo6ZGVzdHJveUVsZW1lbnQoIG1Gb3JtdWxhQ292ZXJhZ2VGaWx0ZXJJbmZvICk7CisKKwlzZXA6OmRlc3Ryb3lFbGVtZW50KCBtSGl0T3JKdW1wT2JqZWN0aXZlSW5mbyApOworCisJc2VwOjpkZXN0cm95RWxlbWVudCggbU9mZmxpbmVUZXN0UHJvY2Vzc29ySW5mbyApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBHZW5lcmljSW5mb0RhdGEKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICogQVBQRU5ECisgKiBtR2VuZXJpY0luZm9zCisgKi8KK3ZvaWQgRXhlY3V0aW9uSW5mb3JtYXRpb246OmFkZEluZm8oY29uc3QgQWJzdHJhY3RQcm9jZXNzb3JVbml0ICYgYVByb2Nlc3NvciwKKwkJY29uc3QgQkYgJiBhbklELCBjb25zdCBCRiAmIGFEYXRhKQoreworCW1HZW5lcmljSW5mb3MuYXBwZW5kKCBCRiggbmV3IEdlbmVyaWNJbmZvRGF0YSgKKwkJCWFQcm9jZXNzb3IuUkVHSVNURVJfVE9PTCgpLCBhbklELCBhRGF0YSkgKSApOworfQorCit2b2lkIEV4ZWN1dGlvbkluZm9ybWF0aW9uOjphZGRJbmZvKAorCQljb25zdCBBYnN0cmFjdFByb2Nlc3NvclVuaXQgJiBhUHJvY2Vzc29yLCBjb25zdCBCRiAmIGFEYXRhKQoreworCW1HZW5lcmljSW5mb3MuYXBwZW5kKCBCRiggbmV3IEdlbmVyaWNJbmZvRGF0YShhUHJvY2Vzc29yLlJFR0lTVEVSX1RPT0woKSwKKwkJCVdPYmplY3RNYW5hZ2VyOjp0b0JGKGFQcm9jZXNzb3IuZ2V0UGFyYW1ldGVyV09iamVjdCgpKSwgYURhdGEpICkgKTsKK30KKworCisvKioKKyAqIEdFVFRFUgorICogbUdlbmVyaWNJbmZvcworICovCitHZW5lcmljSW5mb0RhdGEgKiBFeGVjdXRpb25JbmZvcm1hdGlvbjo6Z2V0SW5mbygKKwkJY29uc3QgSVByb2Nlc3NvclVuaXRSZWdpc3RyYXRpb24gJiBhUmVnaXN0ZXJUb29sKSBjb25zdAoreworCUJGTGlzdDo6Y29uc3RfcmF3X2l0ZXJhdG9yPCBHZW5lcmljSW5mb0RhdGEgPiBpdEluZm8gPSBtR2VuZXJpY0luZm9zLmJlZ2luKCk7CisJQkZMaXN0Ojpjb25zdF9yYXdfaXRlcmF0b3I8IEdlbmVyaWNJbmZvRGF0YSA+IGVuZEluZm8gPSBtR2VuZXJpY0luZm9zLmVuZCgpOworCWZvciggOyBpdEluZm8gIT0gZW5kSW5mbyA7ICsraXRJbmZvICkKKwl7CisJCWlmKCBpdEluZm8tPmlzSW5mbyhhUmVnaXN0ZXJUb29sKSApCisJCXsKKwkJCXJldHVybiggaXRJbmZvICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIE5VTEwgKTsKK30KKworR2VuZXJpY0luZm9EYXRhICogRXhlY3V0aW9uSW5mb3JtYXRpb246OmdldEluZm8oCisJCWNvbnN0IEFic3RyYWN0UHJvY2Vzc29yVW5pdCAmIGFQcm9jZXNzb3IpIGNvbnN0Cit7CisJQkZMaXN0Ojpjb25zdF9yYXdfaXRlcmF0b3I8IEdlbmVyaWNJbmZvRGF0YSA+IGl0SW5mbyA9IG1HZW5lcmljSW5mb3MuYmVnaW4oKTsKKwlCRkxpc3Q6OmNvbnN0X3Jhd19pdGVyYXRvcjwgR2VuZXJpY0luZm9EYXRhID4gZW5kSW5mbyA9IG1HZW5lcmljSW5mb3MuZW5kKCk7CisJZm9yKCA7IGl0SW5mbyAhPSBlbmRJbmZvIDsgKytpdEluZm8gKQorCXsKKwkJaWYoIGl0SW5mby0+aXNJbmZvKGFQcm9jZXNzb3IpICkKKwkJeworCQkJcmV0dXJuKCBpdEluZm8gKTsKKwkJfQorCX0KKworCXJldHVybiggTlVMTCApOworfQorCitHZW5lcmljSW5mb0RhdGEgKiBFeGVjdXRpb25JbmZvcm1hdGlvbjo6Z2V0SW5mbygKKwkJY29uc3QgQWJzdHJhY3RQcm9jZXNzb3JVbml0ICYgYVByb2Nlc3NvciwgY29uc3QgQkYgJiBhbklEKSBjb25zdAoreworCUJGTGlzdDo6Y29uc3RfcmF3X2l0ZXJhdG9yPCBHZW5lcmljSW5mb0RhdGEgPiBpdEluZm8gPSBtR2VuZXJpY0luZm9zLmJlZ2luKCk7CisJQkZMaXN0Ojpjb25zdF9yYXdfaXRlcmF0b3I8IEdlbmVyaWNJbmZvRGF0YSA+IGVuZEluZm8gPSBtR2VuZXJpY0luZm9zLmVuZCgpOworCWZvciggOyBpdEluZm8gIT0gZW5kSW5mbyA7ICsraXRJbmZvICkKKwl7CisJCWlmKCBpdEluZm8tPmlzSW5mbyhhUHJvY2Vzc29yLCBhbklEKSApCisJCXsKKwkJCXJldHVybiggaXRJbmZvICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIE5VTEwgKTsKK30KKworCitHZW5lcmljSW5mb0RhdGEgKiBFeGVjdXRpb25JbmZvcm1hdGlvbjo6Z2V0SW5mb1dpdGhEYXRhKAorCQljb25zdCBBYnN0cmFjdFByb2Nlc3NvclVuaXQgJiBhUHJvY2Vzc29yLCBjb25zdCBCRiAmIGFEYXRhKSBjb25zdAoreworCUJGTGlzdDo6Y29uc3RfcmF3X2l0ZXJhdG9yPCBHZW5lcmljSW5mb0RhdGEgPiBpdEluZm8gPSBtR2VuZXJpY0luZm9zLmJlZ2luKCk7CisJQkZMaXN0Ojpjb25zdF9yYXdfaXRlcmF0b3I8IEdlbmVyaWNJbmZvRGF0YSA+IGVuZEluZm8gPSBtR2VuZXJpY0luZm9zLmVuZCgpOworCWZvciggOyBpdEluZm8gIT0gZW5kSW5mbyA7ICsraXRJbmZvICkKKwl7CisJCWlmKCBpdEluZm8tPmlzSW5mbyhhUHJvY2Vzc29yKSAmJiBpdEluZm8tPmlzRGF0YShhRGF0YSkgKQorCQl7CisJCQlyZXR1cm4oIGl0SW5mbyApOworCQl9CisJfQorCisJcmV0dXJuKCBOVUxMICk7Cit9CisKK0dlbmVyaWNJbmZvRGF0YSAqIEV4ZWN1dGlvbkluZm9ybWF0aW9uOjpnZXRJbmZvKGNvbnN0IEJGICYgYW5JRCkgY29uc3QKK3sKKwlCRkxpc3Q6OmNvbnN0X3Jhd19pdGVyYXRvcjwgR2VuZXJpY0luZm9EYXRhID4gaXRJbmZvID0gbUdlbmVyaWNJbmZvcy5iZWdpbigpOworCUJGTGlzdDo6Y29uc3RfcmF3X2l0ZXJhdG9yPCBHZW5lcmljSW5mb0RhdGEgPiBlbmRJbmZvID0gbUdlbmVyaWNJbmZvcy5lbmQoKTsKKwlmb3IoIDsgaXRJbmZvICE9IGVuZEluZm8gOyArK2l0SW5mbyApCisJeworCQlpZiggaXRJbmZvLT5pc0lEKGFuSUQpICkKKwkJeworCQkJcmV0dXJuKCBpdEluZm8gKTsKKwkJfQorCX0KKworCXJldHVybiggTlVMTCApOworfQorCitHZW5lcmljSW5mb0RhdGEgKiBFeGVjdXRpb25JbmZvcm1hdGlvbjo6Z2V0SW5mbyhFbGVtZW50ICogYW5JRCkgY29uc3QKK3sKKwlCRkxpc3Q6OmNvbnN0X3Jhd19pdGVyYXRvcjwgR2VuZXJpY0luZm9EYXRhID4gaXRJbmZvID0gbUdlbmVyaWNJbmZvcy5iZWdpbigpOworCUJGTGlzdDo6Y29uc3RfcmF3X2l0ZXJhdG9yPCBHZW5lcmljSW5mb0RhdGEgPiBlbmRJbmZvID0gbUdlbmVyaWNJbmZvcy5lbmQoKTsKKwlmb3IoIDsgaXRJbmZvICE9IGVuZEluZm8gOyArK2l0SW5mbyApCisJeworCQlpZiggaXRJbmZvLT5pc0lEKGFuSUQpICkKKwkJeworCQkJcmV0dXJuKCBpdEluZm8gKTsKKwkJfQorCX0KKworCXJldHVybiggTlVMTCApOworfQorCitHZW5lcmljSW5mb0RhdGEgKiBFeGVjdXRpb25JbmZvcm1hdGlvbjo6Z2V0SW5mbygKKwkJRWxlbWVudCAqIGFuSUQsIGNvbnN0IEJGICYgYURhdGEpIGNvbnN0Cit7CisJQkZMaXN0Ojpjb25zdF9yYXdfaXRlcmF0b3I8IEdlbmVyaWNJbmZvRGF0YSA+IGl0SW5mbyA9IG1HZW5lcmljSW5mb3MuYmVnaW4oKTsKKwlCRkxpc3Q6OmNvbnN0X3Jhd19pdGVyYXRvcjwgR2VuZXJpY0luZm9EYXRhID4gZW5kSW5mbyA9IG1HZW5lcmljSW5mb3MuZW5kKCk7CisJZm9yKCA7IGl0SW5mbyAhPSBlbmRJbmZvIDsgKytpdEluZm8gKQorCXsKKwkJaWYoIGl0SW5mby0+aXNJRChhbklEKSAmJiBpdEluZm8tPmlzRGF0YShhRGF0YSkgKQorCQl7CisJCQlyZXR1cm4oIGl0SW5mbyApOworCQl9CisJfQorCisJcmV0dXJuKCBOVUxMICk7Cit9CisKK0dlbmVyaWNJbmZvRGF0YSAqIEV4ZWN1dGlvbkluZm9ybWF0aW9uOjpnZXRJbmZvKAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFuSUQsIEFWTV9PUENPREUgYVByZWRpY2F0ZSkgY29uc3QKK3sKKwlCRkxpc3Q6OmNvbnN0X3Jhd19pdGVyYXRvcjwgR2VuZXJpY0luZm9EYXRhID4gaXRJbmZvID0gbUdlbmVyaWNJbmZvcy5iZWdpbigpOworCUJGTGlzdDo6Y29uc3RfcmF3X2l0ZXJhdG9yPCBHZW5lcmljSW5mb0RhdGEgPiBlbmRJbmZvID0gbUdlbmVyaWNJbmZvcy5lbmQoKTsKKwlmb3IoIDsgaXRJbmZvICE9IGVuZEluZm8gOyArK2l0SW5mbyApCisJeworCQlpZiggaXRJbmZvLT5pc0lEKGFuSUQsIGFQcmVkaWNhdGUpICkKKwkJeworCQkJcmV0dXJuKCBpdEluZm8gKTsKKwkJfQorCX0KKworCXJldHVybiggTlVMTCApOworfQorCisKK0dlbmVyaWNJbmZvRGF0YSAqIEV4ZWN1dGlvbkluZm9ybWF0aW9uOjpnZXRJbmZvQnlEYXRhKGNvbnN0IEJGICYgYURhdGEpIGNvbnN0Cit7CisJQkZMaXN0Ojpjb25zdF9yYXdfaXRlcmF0b3I8IEdlbmVyaWNJbmZvRGF0YSA+IGl0SW5mbyA9IG1HZW5lcmljSW5mb3MuYmVnaW4oKTsKKwlCRkxpc3Q6OmNvbnN0X3Jhd19pdGVyYXRvcjwgR2VuZXJpY0luZm9EYXRhID4gZW5kSW5mbyA9IG1HZW5lcmljSW5mb3MuZW5kKCk7CisJZm9yKCA7IGl0SW5mbyAhPSBlbmRJbmZvIDsgKytpdEluZm8gKQorCXsKKwkJaWYoIGl0SW5mby0+aXNEYXRhKGFEYXRhKSApCisJCXsKKwkJCXJldHVybiggaXRJbmZvICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIE5VTEwgKTsKK30KKworR2VuZXJpY0luZm9EYXRhICogRXhlY3V0aW9uSW5mb3JtYXRpb246OmdldEluZm9CeURhdGEoCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYURhdGEsIEFWTV9PUENPREUgYVByZWRpY2F0ZSkgY29uc3QKK3sKKwlCRkxpc3Q6OmNvbnN0X3Jhd19pdGVyYXRvcjwgR2VuZXJpY0luZm9EYXRhID4gaXRJbmZvID0gbUdlbmVyaWNJbmZvcy5iZWdpbigpOworCUJGTGlzdDo6Y29uc3RfcmF3X2l0ZXJhdG9yPCBHZW5lcmljSW5mb0RhdGEgPiBlbmRJbmZvID0gbUdlbmVyaWNJbmZvcy5lbmQoKTsKKwlmb3IoIDsgaXRJbmZvICE9IGVuZEluZm8gOyArK2l0SW5mbyApCisJeworCQlpZiggaXRJbmZvLT5pc0RhdGEoYURhdGEsIGFQcmVkaWNhdGUpICkKKwkJeworCQkJcmV0dXJuKCBpdEluZm8gKTsKKwkJfQorCX0KKworCXJldHVybiggTlVMTCApOworfQorCisKKy8qKgorICogUkVNT1ZFCisgKiBtR2VuZXJpY0luZm9zCisgKi8KK3ZvaWQgRXhlY3V0aW9uSW5mb3JtYXRpb246OnJlbW92ZUluZm8oCisJCWNvbnN0IElQcm9jZXNzb3JVbml0UmVnaXN0cmF0aW9uICYgYVJlZ2lzdGVyVG9vbCkKK3sKKwlCRkxpc3Q6OnJhd19pdGVyYXRvcjwgR2VuZXJpY0luZm9EYXRhID4gaXRJbmZvID0gbUdlbmVyaWNJbmZvcy5iZWdpbigpOworCUJGTGlzdDo6cmF3X2l0ZXJhdG9yPCBHZW5lcmljSW5mb0RhdGEgPiBlbmRJbmZvID0gbUdlbmVyaWNJbmZvcy5lbmQoKTsKKwlmb3IoIDsgaXRJbmZvICE9IGVuZEluZm8gOyApCisJeworCQlpZiggaXRJbmZvLT5pc0luZm8oYVJlZ2lzdGVyVG9vbCkgKQorCQl7CisJCQlpdEluZm8gPSBtR2VuZXJpY0luZm9zLmVyYXNlKCBpdEluZm8gKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCSsraXRJbmZvOworCQl9CisJfQorfQorCit2b2lkIEV4ZWN1dGlvbkluZm9ybWF0aW9uOjpyZW1vdmVJbmZvKGNvbnN0IEFic3RyYWN0UHJvY2Vzc29yVW5pdCAmIGFQcm9jZXNzb3IpCit7CisJQkZMaXN0OjpyYXdfaXRlcmF0b3I8IEdlbmVyaWNJbmZvRGF0YSA+IGl0SW5mbyA9IG1HZW5lcmljSW5mb3MuYmVnaW4oKTsKKwlCRkxpc3Q6OnJhd19pdGVyYXRvcjwgR2VuZXJpY0luZm9EYXRhID4gZW5kSW5mbyA9IG1HZW5lcmljSW5mb3MuZW5kKCk7CisJZm9yKCA7IGl0SW5mbyAhPSBlbmRJbmZvIDsgKQorCXsKKwkJaWYoIGl0SW5mby0+aXNJbmZvKGFQcm9jZXNzb3IpICkKKwkJeworCQkJaXRJbmZvID0gbUdlbmVyaWNJbmZvcy5lcmFzZSggaXRJbmZvICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkrK2l0SW5mbzsKKwkJfQorCX0KK30KKworCit2b2lkIEV4ZWN1dGlvbkluZm9ybWF0aW9uOjpyZW1vdmVJbmZvKGNvbnN0IEJGICYgYW5JRCkKK3sKKwlCRkxpc3Q6OnJhd19pdGVyYXRvcjwgR2VuZXJpY0luZm9EYXRhID4gaXRJbmZvID0gbUdlbmVyaWNJbmZvcy5iZWdpbigpOworCUJGTGlzdDo6cmF3X2l0ZXJhdG9yPCBHZW5lcmljSW5mb0RhdGEgPiBlbmRJbmZvID0gbUdlbmVyaWNJbmZvcy5lbmQoKTsKKwlmb3IoIDsgaXRJbmZvICE9IGVuZEluZm8gOyApCisJeworCQlpZiggaXRJbmZvLT5pc0lEKGFuSUQpICkKKwkJeworCQkJaXRJbmZvID0gbUdlbmVyaWNJbmZvcy5lcmFzZSggaXRJbmZvICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkrK2l0SW5mbzsKKwkJfQorCX0KK30KKwordm9pZCBFeGVjdXRpb25JbmZvcm1hdGlvbjo6cmVtb3ZlSW5mbyhFbGVtZW50ICogYW5JRCkKK3sKKwlCRkxpc3Q6OnJhd19pdGVyYXRvcjwgR2VuZXJpY0luZm9EYXRhID4gaXRJbmZvID0gbUdlbmVyaWNJbmZvcy5iZWdpbigpOworCUJGTGlzdDo6cmF3X2l0ZXJhdG9yPCBHZW5lcmljSW5mb0RhdGEgPiBlbmRJbmZvID0gbUdlbmVyaWNJbmZvcy5lbmQoKTsKKwlmb3IoIDsgaXRJbmZvICE9IGVuZEluZm8gOyApCisJeworCQlpZiggaXRJbmZvLT5pc0lEKGFuSUQpICkKKwkJeworCQkJaXRJbmZvID0gbUdlbmVyaWNJbmZvcy5lcmFzZSggaXRJbmZvICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkrK2l0SW5mbzsKKwkJfQorCX0KK30KKwordm9pZCBFeGVjdXRpb25JbmZvcm1hdGlvbjo6cmVtb3ZlSW5mbygKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhbklELCBBVk1fT1BDT0RFIGFQcmVkaWNhdGUpCit7CisJQkZMaXN0OjpyYXdfaXRlcmF0b3I8IEdlbmVyaWNJbmZvRGF0YSA+IGl0SW5mbyA9IG1HZW5lcmljSW5mb3MuYmVnaW4oKTsKKwlCRkxpc3Q6OnJhd19pdGVyYXRvcjwgR2VuZXJpY0luZm9EYXRhID4gZW5kSW5mbyA9IG1HZW5lcmljSW5mb3MuZW5kKCk7CisJZm9yKCA7IGl0SW5mbyAhPSBlbmRJbmZvIDsgKQorCXsKKwkJaWYoIGl0SW5mby0+aXNJRChhbklELCBhUHJlZGljYXRlKSApCisJCXsKKwkJCWl0SW5mbyA9IG1HZW5lcmljSW5mb3MuZXJhc2UoIGl0SW5mbyApOworCQl9CisJCWVsc2UKKwkJeworCQkJKytpdEluZm87CisJCX0KKwl9Cit9CisKKwordm9pZCBFeGVjdXRpb25JbmZvcm1hdGlvbjo6cmVtb3ZlSW5mb0J5RGF0YShjb25zdCBCRiAmIGFEYXRhKQoreworCUJGTGlzdDo6cmF3X2l0ZXJhdG9yPCBHZW5lcmljSW5mb0RhdGEgPiBpdEluZm8gPSBtR2VuZXJpY0luZm9zLmJlZ2luKCk7CisJQkZMaXN0OjpyYXdfaXRlcmF0b3I8IEdlbmVyaWNJbmZvRGF0YSA+IGVuZEluZm8gPSBtR2VuZXJpY0luZm9zLmVuZCgpOworCWZvciggOyBpdEluZm8gIT0gZW5kSW5mbyA7ICkKKwl7CisJCWlmKCBpdEluZm8tPmlzRGF0YShhRGF0YSkgKQorCQl7CisJCQlpdEluZm8gPSBtR2VuZXJpY0luZm9zLmVyYXNlKCBpdEluZm8gKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCSsraXRJbmZvOworCQl9CisJfQorfQorCit2b2lkIEV4ZWN1dGlvbkluZm9ybWF0aW9uOjpyZW1vdmVJbmZvQnlEYXRhKAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFEYXRhLCBBVk1fT1BDT0RFIGFQcmVkaWNhdGUpCit7CisJQkZMaXN0OjpyYXdfaXRlcmF0b3I8IEdlbmVyaWNJbmZvRGF0YSA+IGl0SW5mbyA9IG1HZW5lcmljSW5mb3MuYmVnaW4oKTsKKwlCRkxpc3Q6OnJhd19pdGVyYXRvcjwgR2VuZXJpY0luZm9EYXRhID4gZW5kSW5mbyA9IG1HZW5lcmljSW5mb3MuZW5kKCk7CisJZm9yKCA7IGl0SW5mbyAhPSBlbmRJbmZvIDsgKQorCXsKKwkJaWYoIGl0SW5mby0+aXNEYXRhKGFEYXRhLCBhUHJlZGljYXRlKSApCisJCXsKKwkJCWl0SW5mbyA9IG1HZW5lcmljSW5mb3MuZXJhc2UoIGl0SW5mbyApOworCQl9CisJCWVsc2UKKwkJeworCQkJKytpdEluZm87CisJCX0KKwl9Cit9CisKKworCisvKioKKyAqIEdFVFRFUgorICogSW5mbyBEYXRhCisgKi8KK2NvbnN0IEJGICYgRXhlY3V0aW9uSW5mb3JtYXRpb246OmdldEluZm9EYXRhKAorCQljb25zdCBJUHJvY2Vzc29yVW5pdFJlZ2lzdHJhdGlvbiAmIGFSZWdpc3RlclRvb2wpIGNvbnN0Cit7CisJQkZMaXN0Ojpjb25zdF9yYXdfaXRlcmF0b3I8IEdlbmVyaWNJbmZvRGF0YSA+IGl0SW5mbyA9IG1HZW5lcmljSW5mb3MuYmVnaW4oKTsKKwlCRkxpc3Q6OmNvbnN0X3Jhd19pdGVyYXRvcjwgR2VuZXJpY0luZm9EYXRhID4gZW5kSW5mbyA9IG1HZW5lcmljSW5mb3MuZW5kKCk7CisJZm9yKCA7IGl0SW5mbyAhPSBlbmRJbmZvIDsgKytpdEluZm8gKQorCXsKKwkJaWYoIGl0SW5mby0+aXNJbmZvKGFSZWdpc3RlclRvb2wpICkKKwkJeworCQkJcmV0dXJuKCBpdEluZm8tPmdldERhdGEoKSApOworCQl9CisJfQorCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKK30KKworY29uc3QgQkYgJiBFeGVjdXRpb25JbmZvcm1hdGlvbjo6Z2V0SW5mb0RhdGEoCisJCWNvbnN0IEFic3RyYWN0UHJvY2Vzc29yVW5pdCAmIGFQcm9jZXNzb3IpIGNvbnN0Cit7CisJQkZMaXN0Ojpjb25zdF9yYXdfaXRlcmF0b3I8IEdlbmVyaWNJbmZvRGF0YSA+IGl0SW5mbyA9IG1HZW5lcmljSW5mb3MuYmVnaW4oKTsKKwlCRkxpc3Q6OmNvbnN0X3Jhd19pdGVyYXRvcjwgR2VuZXJpY0luZm9EYXRhID4gZW5kSW5mbyA9IG1HZW5lcmljSW5mb3MuZW5kKCk7CisJZm9yKCA7IGl0SW5mbyAhPSBlbmRJbmZvIDsgKytpdEluZm8gKQorCXsKKwkJaWYoIGl0SW5mby0+aXNJbmZvKGFQcm9jZXNzb3IpICkKKwkJeworCQkJcmV0dXJuKCBpdEluZm8tPmdldERhdGEoKSApOworCQl9CisJfQorCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKK30KKworY29uc3QgQkYgJiBFeGVjdXRpb25JbmZvcm1hdGlvbjo6Z2V0SW5mb0RhdGEoCisJCWNvbnN0IEFic3RyYWN0UHJvY2Vzc29yVW5pdCAmIGFQcm9jZXNzb3IsIGNvbnN0IEJGICYgYW5JRCkgY29uc3QKK3sKKwlCRkxpc3Q6OmNvbnN0X3Jhd19pdGVyYXRvcjwgR2VuZXJpY0luZm9EYXRhID4gaXRJbmZvID0gbUdlbmVyaWNJbmZvcy5iZWdpbigpOworCUJGTGlzdDo6Y29uc3RfcmF3X2l0ZXJhdG9yPCBHZW5lcmljSW5mb0RhdGEgPiBlbmRJbmZvID0gbUdlbmVyaWNJbmZvcy5lbmQoKTsKKwlmb3IoIDsgaXRJbmZvICE9IGVuZEluZm8gOyArK2l0SW5mbyApCisJeworCQlpZiggaXRJbmZvLT5pc0luZm8oYVByb2Nlc3NvciwgYW5JRCkgKQorCQl7CisJCQlyZXR1cm4oIGl0SW5mby0+Z2V0RGF0YSgpICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworfQorCisKK2NvbnN0IEJGICYgRXhlY3V0aW9uSW5mb3JtYXRpb246OmdldEluZm9EYXRhKGNvbnN0IEJGICYgYW5JRCkgY29uc3QKK3sKKwlCRkxpc3Q6OmNvbnN0X3Jhd19pdGVyYXRvcjwgR2VuZXJpY0luZm9EYXRhID4gaXRJbmZvID0gbUdlbmVyaWNJbmZvcy5iZWdpbigpOworCUJGTGlzdDo6Y29uc3RfcmF3X2l0ZXJhdG9yPCBHZW5lcmljSW5mb0RhdGEgPiBlbmRJbmZvID0gbUdlbmVyaWNJbmZvcy5lbmQoKTsKKwlmb3IoIDsgaXRJbmZvICE9IGVuZEluZm8gOyArK2l0SW5mbyApCisJeworCQlpZiggaXRJbmZvLT5pc0lEKGFuSUQpICkKKwkJeworCQkJcmV0dXJuKCBpdEluZm8tPmdldERhdGEoKSApOworCQl9CisJfQorCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKK30KKworY29uc3QgQkYgJiBFeGVjdXRpb25JbmZvcm1hdGlvbjo6Z2V0SW5mb0RhdGEoRWxlbWVudCAqIGFuSUQpIGNvbnN0Cit7CisJQkZMaXN0Ojpjb25zdF9yYXdfaXRlcmF0b3I8IEdlbmVyaWNJbmZvRGF0YSA+IGl0SW5mbyA9IG1HZW5lcmljSW5mb3MuYmVnaW4oKTsKKwlCRkxpc3Q6OmNvbnN0X3Jhd19pdGVyYXRvcjwgR2VuZXJpY0luZm9EYXRhID4gZW5kSW5mbyA9IG1HZW5lcmljSW5mb3MuZW5kKCk7CisJZm9yKCA7IGl0SW5mbyAhPSBlbmRJbmZvIDsgKytpdEluZm8gKQorCXsKKwkJaWYoIGl0SW5mby0+aXNJRChhbklEKSApCisJCXsKKwkJCXJldHVybiggaXRJbmZvLT5nZXREYXRhKCkgKTsKKwkJfQorCX0KKworCXJldHVybiggQkY6OlJFRl9OVUxMICk7Cit9CisKKworLyoqCisgKiBTZXJpYWxpemF0aW9uCisgKi8KK3ZvaWQgRXhlY3V0aW9uSW5mb3JtYXRpb246OnRvU3RyZWFtSW5mbyhPdXRTdHJlYW0gJiBvdXQpIGNvbnN0Cit7CisJQkZMaXN0Ojpjb25zdF9yYXdfaXRlcmF0b3I8IEdlbmVyaWNJbmZvRGF0YSA+IGl0SW5mbyA9IG1HZW5lcmljSW5mb3MuYmVnaW4oKTsKKwlCRkxpc3Q6OmNvbnN0X3Jhd19pdGVyYXRvcjwgR2VuZXJpY0luZm9EYXRhID4gZW5kSW5mbyA9IG1HZW5lcmljSW5mb3MuZW5kKCk7CisJZm9yKCA7IGl0SW5mbyAhPSBlbmRJbmZvIDsgKytpdEluZm8gKQorCXsKKwkJaXRJbmZvLT50b1N0cmVhbShvdXQpOworCX0KK30KKwordm9pZCBFeGVjdXRpb25JbmZvcm1hdGlvbjo6dG9Gc2NuSW5mbyhPdXRTdHJlYW0gJiBvdXQpIGNvbnN0Cit7CisJQkZMaXN0Ojpjb25zdF9yYXdfaXRlcmF0b3I8IEdlbmVyaWNJbmZvRGF0YSA+IGl0SW5mbyA9IG1HZW5lcmljSW5mb3MuYmVnaW4oKTsKKwlCRkxpc3Q6OmNvbnN0X3Jhd19pdGVyYXRvcjwgR2VuZXJpY0luZm9EYXRhID4gZW5kSW5mbyA9IG1HZW5lcmljSW5mb3MuZW5kKCk7CisJZm9yKCA7IGl0SW5mbyAhPSBlbmRJbmZvIDsgKytpdEluZm8gKQorCXsKKwkJaXRJbmZvLT50b0ZzY24ob3V0KTsKKwl9Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEZvcm11bGFDb3ZlcmFnZUZpbHRlciBJbmZvcm1hdGlvbgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworRm9ybXVsYUNvdmVyYWdlRmlsdGVySW5mbyAqCitFeGVjdXRpb25JbmZvcm1hdGlvbjo6Z2V0VW5pcUZvcm11bGFDb3ZlcmFnZUZpbHRlckluZm8oKQoreworCWlmKCBtRm9ybXVsYUNvdmVyYWdlRmlsdGVySW5mbyA9PSBOVUxMICkKKwl7CisJCW1Gb3JtdWxhQ292ZXJhZ2VGaWx0ZXJJbmZvID0gbmV3IEZvcm11bGFDb3ZlcmFnZUZpbHRlckluZm8oKTsKKwl9CisJcmV0dXJuKCBtRm9ybXVsYUNvdmVyYWdlRmlsdGVySW5mbyApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBdm1IaXRPckp1bXBPYmplY3RpdmUgSW5mb3JtYXRpb24KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0hpdE9ySnVtcE9iamVjdGl2ZUluZm8gKiBFeGVjdXRpb25JbmZvcm1hdGlvbjo6Z2V0VW5pcUhpdE9ySnVtcE9iamVjdGl2ZUluZm8oKQoreworCWlmKCBtSGl0T3JKdW1wT2JqZWN0aXZlSW5mbyA9PSBOVUxMICkKKwl7CisJCW1IaXRPckp1bXBPYmplY3RpdmVJbmZvID0gbmV3IEhpdE9ySnVtcE9iamVjdGl2ZUluZm8oKTsKKwl9CisJcmV0dXJuKCBtSGl0T3JKdW1wT2JqZWN0aXZlSW5mbyApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBPZmZsaW5lVGVzdFByb2Nlc3NvciBJbmZvcm1hdGlvbgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworT2ZmbGluZVRlc3RQcm9jZXNzb3JJbmZvICoKK0V4ZWN1dGlvbkluZm9ybWF0aW9uOjpnZXRVbmlxT2ZmbGluZVRlc3RQcm9jZXNzb3JJbmZvKCkKK3sKKwlpZiggbU9mZmxpbmVUZXN0UHJvY2Vzc29ySW5mbyA9PSBOVUxMICkKKwl7CisJCW1PZmZsaW5lVGVzdFByb2Nlc3NvckluZm8gPSBuZXcgT2ZmbGluZVRlc3RQcm9jZXNzb3JJbmZvKCk7CisJfQorCXJldHVybiggbU9mZmxpbmVUZXN0UHJvY2Vzc29ySW5mbyApOworfQorCisKKy8qKgorICogU2VyaWFsaXphdGlvbgorICovCit2b2lkIEV4ZWN1dGlvbkluZm9ybWF0aW9uOjp0b1N0cmVhbShPdXRTdHJlYW0gJiBvdXQpIGNvbnN0Cit7CisJdG9TdHJlYW1JbmZvKG91dCk7CisKKwlpZiggbUZvcm11bGFDb3ZlcmFnZUZpbHRlckluZm8gIT0gTlVMTCApCisJeworCQltRm9ybXVsYUNvdmVyYWdlRmlsdGVySW5mby0+dG9TdHJlYW0ob3V0KTsKKwl9Cit9CisKK3ZvaWQgRXhlY3V0aW9uSW5mb3JtYXRpb246OnRvRnNjbihPdXRTdHJlYW0gJiBvdXQpIGNvbnN0Cit7CisJaWYoIG1Gb3JtdWxhQ292ZXJhZ2VGaWx0ZXJJbmZvICE9IE5VTEwgKQorCXsKKwkJbUZvcm11bGFDb3ZlcmFnZUZpbHRlckluZm8tPnRvRnNjbihvdXQpOworCX0KK30KKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvcnVudGltZS9FeGVjdXRpb25JbmZvcm1hdGlvbi5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3J1bnRpbWUvRXhlY3V0aW9uSW5mb3JtYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDE1NmU2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3J1bnRpbWUvRXhlY3V0aW9uSW5mb3JtYXRpb24uaApAQCAtMCwwICsxLDUzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDExIG9jdC4gMjAxMAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEVYRUNVVElPTklORk9STUFUSU9OX0hfCisjZGVmaW5lIEVYRUNVVElPTklORk9STUFUSU9OX0hfCisKKyNpbmNsdWRlIDxjb21tb24vQXZtUG9pbnRlci5oPgorI2luY2x1ZGUgPGNvbW1vbi9FbGVtZW50Lmg+CisKKyNpbmNsdWRlIDxjb21tb24vQkYuaD4KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vQkZDb250YWluZXIuaD4KKworI2luY2x1ZGUgPGZtbC9vcGVyYXRvci9PcGVyYXRvckxpYi5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworY2xhc3MgQWJzdHJhY3RQcm9jZXNzb3JVbml0OworY2xhc3MgSVByb2Nlc3NvclVuaXRSZWdpc3RyYXRpb247CisKK2NsYXNzIEZvcm11bGFDb3ZlcmFnZUZpbHRlckluZm87CisKK2NsYXNzIEhpdE9ySnVtcE9iamVjdGl2ZUluZm87CisKK2NsYXNzIE9mZmxpbmVUZXN0UHJvY2Vzc29ySW5mbzsKKworCisvKioKKyAqIEdlbmVyaWMgSW5mbyA8IGlkICwgZGF0YSA+CisgKiBAcHJvcGVydHkgaWQgICA6IGhhdmUgdG8gYmUgYSBQcm9jZXNzb3IgUmVnaXN0ZXIgVG9vbAorICogQHByb3BlcnR5IGRhdGEgOiBhbnl0aGluZworICovCitjbGFzcyBHZW5lcmljSW5mb0RhdGEgOiBwdWJsaWMgRWxlbWVudCAsCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggR2VuZXJpY0luZm9EYXRhICkKK3sKKworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBHZW5lcmljSW5mb0RhdGEgKQorCisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBBVFRSSUJVVEVTCisJICovCisJY29uc3QgSVByb2Nlc3NvclVuaXRSZWdpc3RyYXRpb24gJiBtUHJvY2Vzc29yUmVnaXN0ZXJUb29sOworCUJGIG1JRDsKKwlCRiBtRGF0YTsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJR2VuZXJpY0luZm9EYXRhKGNvbnN0IElQcm9jZXNzb3JVbml0UmVnaXN0cmF0aW9uICYgYVByb2Nlc3NvclJlZ2lzdGVyVG9vbCwKKwkJCWNvbnN0IEJGICYgYW5JRCwgY29uc3QgQkYgJiBhRGF0YSkKKwk6IEVsZW1lbnQoIENMQVNTX0tJTkRfVCggR2VuZXJpY0luZm9EYXRhICkgKSwKKwltUHJvY2Vzc29yUmVnaXN0ZXJUb29sKCBhUHJvY2Vzc29yUmVnaXN0ZXJUb29sICksCisJbUlEKCBhbklEICksCisJbURhdGEoIGFEYXRhICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCUdlbmVyaWNJbmZvRGF0YShjb25zdCBHZW5lcmljSW5mb0RhdGEgJiBhbkluZm9EYXRhKQorCTogRWxlbWVudCggYW5JbmZvRGF0YSApLAorCW1Qcm9jZXNzb3JSZWdpc3RlclRvb2woIGFuSW5mb0RhdGEubVByb2Nlc3NvclJlZ2lzdGVyVG9vbCApLAorCW1JRCggYW5JbmZvRGF0YS5tSUQgKSwKKwltRGF0YSggYW5JbmZvRGF0YS5tRGF0YSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5HZW5lcmljSW5mb0RhdGEoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtUHJvY2Vzc29yUmVnaXN0ZXJUb29sCisJICovCisJaW5saW5lIGNvbnN0IElQcm9jZXNzb3JVbml0UmVnaXN0cmF0aW9uICYgZ2V0UHJvY2Vzc29yUmVnaXN0ZXJUb29sKCkgY29uc3QKKwl7CisJCXJldHVybiggbVByb2Nlc3NvclJlZ2lzdGVyVG9vbCApOworCX0KKworCWlubGluZSBib29sIGlzSW5mbygKKwkJCWNvbnN0IElQcm9jZXNzb3JVbml0UmVnaXN0cmF0aW9uICYgYVByb2Nlc3NvclJlZ2lzdGVyVG9vbCkgY29uc3QKKwl7CisJCXJldHVybiggKCYgbVByb2Nlc3NvclJlZ2lzdGVyVG9vbCkgPT0gKCYgYVByb2Nlc3NvclJlZ2lzdGVyVG9vbCkgKTsKKwl9CisKKwlib29sIGlzSW5mbyhjb25zdCBBYnN0cmFjdFByb2Nlc3NvclVuaXQgJiBhUHJvY2Vzc29yKSBjb25zdDsKKwlib29sIGlzSW5mbyhjb25zdCBBYnN0cmFjdFByb2Nlc3NvclVuaXQgJiBhUHJvY2Vzc29yLCBjb25zdCBCRiAmIGFuSUQpIGNvbnN0OworCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtSUQKKwkgKi8KKwlpbmxpbmUgY29uc3QgQkYgJiBnZXRJRCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1JRCApOworCX0KKworCWlubGluZSBib29sIGhhc0lEKCkgY29uc3QKKwl7CisJCXJldHVybiggbUlELnZhbGlkKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc0lEKGNvbnN0IEJGICYgYW5JRCkgY29uc3QKKwl7CisJCXJldHVybiggbUlELmlzVEVRKGFuSUQpIHx8IChtSUQuc3RyKCkgPT0gYW5JRC5zdHIoKSkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc0lEKEVsZW1lbnQgKiBhbklEKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtSUQuaXNURVEoYW5JRCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc0lEKGNvbnN0IHN0ZDo6c3RyaW5nICYgYW5JRCwKKwkJCUFWTV9PUENPREUgYVByZWRpY2F0ZSA9IEFWTV9PUENPREVfRVEpIGNvbnN0CisJeworCQlzd2l0Y2goIGFQcmVkaWNhdGUgKQorCQl7CisJCQljYXNlIEFWTV9PUENPREVfRVE6CisJCQljYXNlIEFWTV9PUENPREVfU0VROgorCQkJeworCQkJCXJldHVybiggc3RySUQoKSA9PSBhbklEICk7CisJCQl9CisJCQljYXNlIEFWTV9PUENPREVfU1RBUlRTX1dJVEg6CisJCQljYXNlIEFWTV9PUENPREVfR1RFOgorCQkJeworCQkJCXJldHVybiggc3RySUQoKS5maW5kKGFuSUQpID09IDAgKTsKKwkJCX0KKwkJCWNhc2UgQVZNX09QQ09ERV9DT05UQUlOUzoKKwkJCXsKKwkJCQlyZXR1cm4oIHN0cklEKCkuZmluZChhbklEKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyApOworCQkJfQorCisJCQlkZWZhdWx0OgorCQkJeworCQkJCXJldHVybiggc3RySUQoKSA9PSBhbklEICk7CisJCQl9CisJCX0KKwl9CisKKworCWlubGluZSBzdGQ6OnN0cmluZyBzdHJJRCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1JRC5pbnZhbGlkKCkgPyAiIgorCQkJCTogKCBtSUQuaXNCdWlsdGluU3RyaW5nKCkgPworCQkJCQkJbUlELnRvQnVpbHRpblN0cmluZygpIDogbUlELnN0cigpICkgKTsKKwl9CisKKwlzdGQ6OnN0cmluZyBzdHJVSUQoKSBjb25zdDsKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1EYXRhCisJICovCisJaW5saW5lIGNvbnN0IEJGICYgZ2V0RGF0YSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1EYXRhICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBoYXNEYXRhKCkgY29uc3QKKwl7CisJCXJldHVybiggbURhdGEudmFsaWQoKSApOworCX0KKworCWlubGluZSBib29sIGlzRGF0YShjb25zdCBCRiAmIGFEYXRhKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRGF0YS5pc0VRKGFEYXRhKSApOworCX0KKworCWlubGluZSBib29sIGlzRGF0YShjb25zdCBzdGQ6OnN0cmluZyAmIGFEYXRhLAorCQkJQVZNX09QQ09ERSBhUHJlZGljYXRlID0gQVZNX09QQ09ERV9FUSkgY29uc3QKKwl7CisJCXN3aXRjaCggYVByZWRpY2F0ZSApCisJCXsKKwkJCWNhc2UgQVZNX09QQ09ERV9FUToKKwkJCWNhc2UgQVZNX09QQ09ERV9TRVE6CisJCQl7CisJCQkJcmV0dXJuKCBzdHJEYXRhKCkgPT0gYURhdGEgKTsKKwkJCX0KKwkJCWNhc2UgQVZNX09QQ09ERV9TVEFSVFNfV0lUSDoKKwkJCWNhc2UgQVZNX09QQ09ERV9HVEU6CisJCQl7CisJCQkJcmV0dXJuKCBzdHJEYXRhKCkuZmluZChhRGF0YSkgPT0gMCApOworCQkJfQorCQkJY2FzZSBBVk1fT1BDT0RFX0NPTlRBSU5TOgorCQkJeworCQkJCXJldHVybiggc3RyRGF0YSgpLmZpbmQoYURhdGEpICE9IHN0ZDo6c3RyaW5nOjpucG9zICk7CisJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJcmV0dXJuKCBzdHJEYXRhKCkgPT0gYURhdGEgKTsKKwkJCX0KKwkJfQorCX0KKworCisJaW5saW5lIHN0ZDo6c3RyaW5nIHN0ckRhdGEoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRGF0YS5pbnZhbGlkKCkgPyAiIgorCQkJCTogKCBtRGF0YS5pc0J1aWx0aW5TdHJpbmcoKSA/CisJCQkJCQltRGF0YS50b0J1aWx0aW5TdHJpbmcoKSA6IG1EYXRhLnN0cigpICkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXREYXRhKGNvbnN0IEJGICYgYURhdGEpCisJeworCQltRGF0YSA9IGFEYXRhOworCX0KKworCisJLyoqCisJICogU2VyaWFsaXphdGlvbgorCSAqLworCXZpcnR1YWwgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvdXQpIGNvbnN0OworCisJdmlydHVhbCB2b2lkIHRvRnNjbihPdXRTdHJlYW0gJiBvdXQpIGNvbnN0OworCit9OworCisKKy8qKgorICogRXhlY3V0aW9uSW5mb3JtYXRpb24KKyAqLworY2xhc3MgRXhlY3V0aW9uSW5mb3JtYXRpb24gOiBwdWJsaWMgRWxlbWVudCAsCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggRXhlY3V0aW9uSW5mb3JtYXRpb24gKQoreworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIEV4ZWN1dGlvbkluZm9ybWF0aW9uICkKKworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQVRUUklCVVRFUworCSAqLworCUJGTGlzdCBtR2VuZXJpY0luZm9zOworCisJRm9ybXVsYUNvdmVyYWdlRmlsdGVySW5mbyAqIG1Gb3JtdWxhQ292ZXJhZ2VGaWx0ZXJJbmZvOworCisJSGl0T3JKdW1wT2JqZWN0aXZlSW5mbyAqIG1IaXRPckp1bXBPYmplY3RpdmVJbmZvOworCisJT2ZmbGluZVRlc3RQcm9jZXNzb3JJbmZvICogbU9mZmxpbmVUZXN0UHJvY2Vzc29ySW5mbzsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJRXhlY3V0aW9uSW5mb3JtYXRpb24oKQorCTogRWxlbWVudCggQ0xBU1NfS0lORF9UKCBFeGVjdXRpb25JbmZvcm1hdGlvbiApICksCisJbUdlbmVyaWNJbmZvcygpLAorCisJbUZvcm11bGFDb3ZlcmFnZUZpbHRlckluZm8oIE5VTEwgKSwKKwltSGl0T3JKdW1wT2JqZWN0aXZlSW5mbyggTlVMTCApLAorCW1PZmZsaW5lVGVzdFByb2Nlc3NvckluZm8oIE5VTEwgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJRXhlY3V0aW9uSW5mb3JtYXRpb24oY29uc3QgRXhlY3V0aW9uSW5mb3JtYXRpb24gJiBhbkV4ZWNJbmZvKQorCTogRWxlbWVudCggYW5FeGVjSW5mbyApLAorCW1HZW5lcmljSW5mb3MoIGFuRXhlY0luZm8ubUdlbmVyaWNJbmZvcyApLAorCisJbUZvcm11bGFDb3ZlcmFnZUZpbHRlckluZm8oIGFuRXhlY0luZm8ubUZvcm11bGFDb3ZlcmFnZUZpbHRlckluZm8gKSwKKwltSGl0T3JKdW1wT2JqZWN0aXZlSW5mbyggYW5FeGVjSW5mby5tSGl0T3JKdW1wT2JqZWN0aXZlSW5mbyApLAorCW1PZmZsaW5lVGVzdFByb2Nlc3NvckluZm8oIGFuRXhlY0luZm8ubU9mZmxpbmVUZXN0UHJvY2Vzc29ySW5mbyApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5FeGVjdXRpb25JbmZvcm1hdGlvbigpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gR2VuZXJpY0luZm9EYXRhCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8qKgorCSAqIEFQUEVORAorCSAqIG1HZW5lcmljSW5mb3MKKwkgKi8KKwl2b2lkIGFkZEluZm8oY29uc3QgSVByb2Nlc3NvclVuaXRSZWdpc3RyYXRpb24gJiBhUmVnaXN0ZXJUb29sLAorCQkJY29uc3QgQkYgJiBhbklELCBjb25zdCBCRiAmIGFEYXRhKQorCXsKKwkJbUdlbmVyaWNJbmZvcy5hcHBlbmQoIEJGKAorCQkJCW5ldyBHZW5lcmljSW5mb0RhdGEoYVJlZ2lzdGVyVG9vbCwgYW5JRCwgYURhdGEpICkgKTsKKwl9CisKKwl2b2lkIGFkZEluZm8oY29uc3QgQWJzdHJhY3RQcm9jZXNzb3JVbml0ICYgYVByb2Nlc3NvciwKKwkJCWNvbnN0IEJGICYgYW5JRCwgY29uc3QgQkYgJiBhRGF0YSk7CisKKwl2b2lkIGFkZEluZm8oY29uc3QgQWJzdHJhY3RQcm9jZXNzb3JVbml0ICYgYVByb2Nlc3NvciwgY29uc3QgQkYgJiBhRGF0YSk7CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIG1HZW5lcmljSW5mb3MKKwkgKi8KKwlpbmxpbmUgY29uc3QgQkZMaXN0ICYgZ2V0SW5mb3MoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtR2VuZXJpY0luZm9zICk7CisJfQorCisJaW5saW5lIEJGTGlzdCAmIGdldEluZm9zKCkKKwl7CisJCXJldHVybiggbUdlbmVyaWNJbmZvcyApOworCX0KKworCisJR2VuZXJpY0luZm9EYXRhICogZ2V0SW5mbygKKwkJCWNvbnN0IElQcm9jZXNzb3JVbml0UmVnaXN0cmF0aW9uICYgYVJlZ2lzdGVyVG9vbCkgY29uc3Q7CisKKwlHZW5lcmljSW5mb0RhdGEgKiBnZXRJbmZvKGNvbnN0IEFic3RyYWN0UHJvY2Vzc29yVW5pdCAmIGFQcm9jZXNzb3IpIGNvbnN0OworCUdlbmVyaWNJbmZvRGF0YSAqIGdldEluZm8oCisJCQljb25zdCBBYnN0cmFjdFByb2Nlc3NvclVuaXQgJiBhUHJvY2Vzc29yLCBjb25zdCBCRiAmIGFuSUQpIGNvbnN0OworCUdlbmVyaWNJbmZvRGF0YSAqIGdldEluZm9XaXRoRGF0YSgKKwkJCWNvbnN0IEFic3RyYWN0UHJvY2Vzc29yVW5pdCAmIGFQcm9jZXNzb3IsIGNvbnN0IEJGICYgYURhdGEpIGNvbnN0OworCisJR2VuZXJpY0luZm9EYXRhICogZ2V0SW5mbyhjb25zdCBCRiAmIGFuSUQpIGNvbnN0OworCUdlbmVyaWNJbmZvRGF0YSAqIGdldEluZm8oRWxlbWVudCAqIGFuSUQpIGNvbnN0OworCUdlbmVyaWNJbmZvRGF0YSAqIGdldEluZm8oRWxlbWVudCAqIGFuSUQsIGNvbnN0IEJGICYgYURhdGEpIGNvbnN0OworCUdlbmVyaWNJbmZvRGF0YSAqIGdldEluZm8oY29uc3Qgc3RkOjpzdHJpbmcgJiBhbklELAorCQkJQVZNX09QQ09ERSBhUHJlZGljYXRlID0gQVZNX09QQ09ERV9FUSkgY29uc3Q7CisKKwlHZW5lcmljSW5mb0RhdGEgKiBnZXRJbmZvQnlEYXRhKGNvbnN0IEJGICYgYURhdGEpIGNvbnN0OworCUdlbmVyaWNJbmZvRGF0YSAqIGdldEluZm9CeURhdGEoY29uc3Qgc3RkOjpzdHJpbmcgJiBhRGF0YSwKKwkJCUFWTV9PUENPREUgYVByZWRpY2F0ZSA9IEFWTV9PUENPREVfRVEpIGNvbnN0OworCisJLyoqCisJICogVEVTVEVSCisJICogbUdlbmVyaWNJbmZvcworCSAqLworCWlubGluZSBib29sIGhhc0luZm8oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtR2VuZXJpY0luZm9zLm5vbmVtcHR5KCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBub25lSW5mbygpIGNvbnN0CisJeworCQlyZXR1cm4oIG1HZW5lcmljSW5mb3MuZW1wdHkoKSApOworCX0KKworCisJaW5saW5lIGJvb2wgaGFzSW5mbyhjb25zdCBJUHJvY2Vzc29yVW5pdFJlZ2lzdHJhdGlvbiAmIGFSZWdpc3RlclRvb2wpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldEluZm8oYVJlZ2lzdGVyVG9vbCkgIT0gTlVMTCApOworCX0KKworCWJvb2wgaGFzSW5mbyhjb25zdCBBYnN0cmFjdFByb2Nlc3NvclVuaXQgJiBhUHJvY2Vzc29yKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRJbmZvKGFQcm9jZXNzb3IpICE9IE5VTEwgKTsKKwl9CisKKwlib29sIG5vbmVJbmZvKGNvbnN0IEFic3RyYWN0UHJvY2Vzc29yVW5pdCAmIGFQcm9jZXNzb3IpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldEluZm8oYVByb2Nlc3NvcikgPT0gTlVMTCApOworCX0KKworCWJvb2wgaGFzSW5mbygKKwkJCWNvbnN0IEFic3RyYWN0UHJvY2Vzc29yVW5pdCAmIGFQcm9jZXNzb3IsIGNvbnN0IEJGICYgYW5JRCkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0SW5mbyhhUHJvY2Vzc29yLCBhbklEKSAhPSBOVUxMICk7CisJfQorCisJYm9vbCBoYXNJbmZvV2l0aERhdGEoCisJCQljb25zdCBBYnN0cmFjdFByb2Nlc3NvclVuaXQgJiBhUHJvY2Vzc29yLCBjb25zdCBCRiAmIGFEYXRhKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRJbmZvV2l0aERhdGEoYVByb2Nlc3NvciwgYURhdGEpICE9IE5VTEwgKTsKKwl9CisKKworCWlubGluZSBib29sIGhhc0luZm8oY29uc3QgQkYgJiBhbklEKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRJbmZvKGFuSUQpICE9IE5VTEwgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNJbmZvKEVsZW1lbnQgKiBhbklEKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRJbmZvKGFuSUQpICE9IE5VTEwgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nICYgYW5JRCwKKwkJCUFWTV9PUENPREUgYVByZWRpY2F0ZSA9IEFWTV9PUENPREVfRVEpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldEluZm8oYW5JRCwgYVByZWRpY2F0ZSkgIT0gTlVMTCApOworCX0KKworCisJaW5saW5lIGJvb2wgaGFzSW5mb0J5RGF0YShjb25zdCBCRiAmIGFEYXRhKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRJbmZvQnlEYXRhKGFEYXRhKSAhPSBOVUxMICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzSW5mb0J5RGF0YShjb25zdCBzdGQ6OnN0cmluZyAmIGFEYXRhLAorCQkJQVZNX09QQ09ERSBhUHJlZGljYXRlID0gQVZNX09QQ09ERV9FUSkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0SW5mb0J5RGF0YShhRGF0YSwgYVByZWRpY2F0ZSkgIT0gTlVMTCApOworCX0KKworCisJLyoqCisJICogUkVNT1ZFCisJICogbUdlbmVyaWNJbmZvcworCSAqLworCXZvaWQgcmVtb3ZlSW5mbyhjb25zdCBJUHJvY2Vzc29yVW5pdFJlZ2lzdHJhdGlvbiAmIGFSZWdpc3RlclRvb2wpOworCXZvaWQgcmVtb3ZlSW5mbyhjb25zdCBBYnN0cmFjdFByb2Nlc3NvclVuaXQgJiBhUHJvY2Vzc29yKTsKKworCXZvaWQgcmVtb3ZlSW5mbyhjb25zdCBCRiAmIGFuSUQpOworCXZvaWQgcmVtb3ZlSW5mbyhFbGVtZW50ICogYW5JRCk7CisJdm9pZCByZW1vdmVJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nICYgYW5JRCwKKwkJCUFWTV9PUENPREUgYVByZWRpY2F0ZSA9IEFWTV9PUENPREVfRVEpOworCisJdm9pZCByZW1vdmVJbmZvQnlEYXRhKGNvbnN0IEJGICYgYURhdGEpOworCXZvaWQgcmVtb3ZlSW5mb0J5RGF0YShjb25zdCBzdGQ6OnN0cmluZyAmIGFEYXRhLAorCQkJQVZNX09QQ09ERSBhUHJlZGljYXRlID0gQVZNX09QQ09ERV9FUSk7CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIERhdGEKKwkgKi8KKwljb25zdCBCRiAmIGdldEluZm9EYXRhKAorCQkJY29uc3QgSVByb2Nlc3NvclVuaXRSZWdpc3RyYXRpb24gJiBhUmVnaXN0ZXJUb29sKSBjb25zdDsKKworCWNvbnN0IEJGICYgZ2V0SW5mb0RhdGEoY29uc3QgQWJzdHJhY3RQcm9jZXNzb3JVbml0ICYgYVByb2Nlc3NvcikgY29uc3Q7CisJY29uc3QgQkYgJiBnZXRJbmZvRGF0YSgKKwkJCWNvbnN0IEFic3RyYWN0UHJvY2Vzc29yVW5pdCAmIGFQcm9jZXNzb3IsIGNvbnN0IEJGICYgYW5JRCkgY29uc3Q7CisKKwljb25zdCBCRiAmIGdldEluZm9EYXRhKGNvbnN0IEJGICYgYW5JRCkgY29uc3Q7CisJY29uc3QgQkYgJiBnZXRJbmZvRGF0YShFbGVtZW50ICogYW5JRCkgY29uc3Q7CisKKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwl2aXJ0dWFsIHZvaWQgdG9TdHJlYW1JbmZvKE91dFN0cmVhbSAmIG91dCkgY29uc3Q7CisKKwl2aXJ0dWFsIHZvaWQgdG9Gc2NuSW5mbyhPdXRTdHJlYW0gJiBvdXQpIGNvbnN0OworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gRm9ybXVsYUNvdmVyYWdlRmlsdGVyIEluZm9ybWF0aW9uCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1Gb3JtdWxhQ292ZXJhZ2VGaWx0ZXJJbmZvCisJICovCisJRm9ybXVsYUNvdmVyYWdlRmlsdGVySW5mbyAqIGdldFVuaXFGb3JtdWxhQ292ZXJhZ2VGaWx0ZXJJbmZvKCk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBBdm1IaXRPckp1bXBPYmplY3RpdmUgSW5mb3JtYXRpb24KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUhpdE9ySnVtcE9iamVjdGl2ZUluZm8KKwkgKi8KKwlIaXRPckp1bXBPYmplY3RpdmVJbmZvICogZ2V0VW5pcUhpdE9ySnVtcE9iamVjdGl2ZUluZm8oKTsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIE9mZmxpbmVUZXN0UHJvY2Vzc29yIEluZm9ybWF0aW9uCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqLworCU9mZmxpbmVUZXN0UHJvY2Vzc29ySW5mbyAqIGdldFVuaXFPZmZsaW5lVGVzdFByb2Nlc3NvckluZm8oKTsKKworCisJLyoqCisJICogVEVTVEVSCisJICogaGFzIGFueSBzcGVjaWZpYyBpbmZvID8KKwkgKi8KKwlpbmxpbmUgYm9vbCBoYXNTcGVjaWZpY0luZm8oKSBjb25zdAorCXsKKwkJcmV0dXJuKAkobUZvcm11bGFDb3ZlcmFnZUZpbHRlckluZm8gICAgICE9IE5VTEwpICk7CisvLwkJCQkobUhpdE9ySnVtcE9iamVjdGl2ZUluZm8gICAgICAgICE9IE5VTEwpIHx8CisvLwkJCQkobU9mZmxpbmVUZXN0UHJvY2Vzc29ySW5mbyAgICAgICE9IE5VTEwpICk7CisJfQorCisJLyoqCisJICogU2VyaWFsaXphdGlvbgorCSAqLworCXZpcnR1YWwgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvdXQpIGNvbnN0OworCisJdmlydHVhbCB2b2lkIHRvRnNjbihPdXRTdHJlYW0gJiBvdXQpIGNvbnN0OworCit9OworCisKK30KKworI2VuZGlmIC8qIEVYRUNVVElPTklORk9STUFUSU9OX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvcnVudGltZS9FeGVjdXRpb25Mb2NhdGlvbi5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvcnVudGltZS9FeGVjdXRpb25Mb2NhdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE4YWNlZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL0V4ZWN1dGlvbkxvY2F0aW9uLmNwcApAQCAtMCwwICsxLDcxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTUgb2N0LiAyMDEwCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJFeGVjdXRpb25Mb2NhdGlvbi5oIgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvUnVudGltZUlELmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTRVJJQUxJWkFUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIEV4ZWN1dGlvbkxvY2F0aW9uOjp0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlvcyA8PCBUQUIgPDwgImV4ZWN1dGlvbiNsb2NhdGlvbiB7IiA8PCBFT0w7CisKKwlvcyA8PCBUQUIyIDw8ICJyaWQgPSAiIDw8IG1SSUQuc3RyKCkgPDwgIjsiIDw8IEVPTF9JTkNSX0lOREVOVDsKKworCWlmKCBtQ09ERS52YWxpZCgpICkKKwl7CisJCW9zIDw8IFRBQiA8PCAiQGNvZGV7IiA8PCBFT0xfSU5DUl9JTkRFTlQ7CisJCW1DT0RFLnRvU3RyZWFtKG9zKTsKKwkJb3MgPDwgREVDUl9JTkRFTlRfVEFCIDw8ICJ9IiA8PCBFT0w7CisKKwkJaWYoIGl0Q29kZSAhPSBlbmRDb2RlICkKKwkJeworCQkJb3MgPDwgVEFCIDw8ICJAYmVnaW57IiA8PCBFT0xfSU5DUjJfSU5ERU5UOworCQkJKCppdENvZGUpLnRvU3RyZWFtKG9zKTsKKwkJCW9zIDw8IERFQ1JfSU5ERU5UX1RBQiA8PCAifSIgPDwgRU9MOworCisJCQlvcyA8PCBUQUIgPDwgImJlZ2luID0gIiA8PCAoKml0Q29kZSkucmF3X2FkZHJlc3MoKSAgPDwgIjsiIDw8IEVPTDsKKwkJCW9zIDw8IFRBQiA8PCAiZW5kICAgPSAiIDw8ICgqZW5kQ29kZSkucmF3X2FkZHJlc3MoKSA8PCAiOyIgPDwgRU9MOworCQl9CisJfQorCisJb3MgPDwgREVDUl9JTkRFTlRfVEFCIDw8ICAifSIgPDwgRU9MX0ZMVVNIOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTRVJJQUxJWkFUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIEV4ZWN1dGlvbkxvY2F0aW9uUXVldWU6OnRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdAoreworCUxpc3Q8IEJGID46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbVF1ZXVlLmJlZ2luKCk7CisJTGlzdDwgQkYgPjo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBtUXVldWUuZW5kKCk7CisJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJeworCQkoKml0KS50b1N0cmVhbShvcyk7CisJfQorfQorCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL0V4ZWN1dGlvbkxvY2F0aW9uLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvcnVudGltZS9FeGVjdXRpb25Mb2NhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ODg5YWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvcnVudGltZS9FeGVjdXRpb25Mb2NhdGlvbi5oCkBAIC0wLDAgKzEsMjcyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTUgb2N0LiAyMDEwCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRVhFQ1VUSU9OTE9DQVRJT05fSF8KKyNkZWZpbmUgRVhFQ1VUSU9OTE9DQVRJT05fSF8KKworI2luY2x1ZGUgPGNvbW1vbi9FbGVtZW50Lmg+CisKKyNpbmNsdWRlIDxjb2xsZWN0aW9uL0xpc3QuaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0F2bUNvZGUuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lSUQuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworY2xhc3MgRXhlY3V0aW9uTG9jYXRpb24gOiAgcHVibGljIEVsZW1lbnQgLAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIEV4ZWN1dGlvbkxvY2F0aW9uICkKK3sKKworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBFeGVjdXRpb25Mb2NhdGlvbiApCisKK3B1YmxpYzoKKwkvKioKKwkgKiBBVFRSSUJVVEVTCisJICovCisJUnVudGltZUlEIG1SSUQ7CisKKwlCRkNvZGUgbUNPREU7CisKKwlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdENvZGU7CisJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kQ29kZTsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJRXhlY3V0aW9uTG9jYXRpb24oKQorCTogRWxlbWVudCggQ0xBU1NfS0lORF9UKCBFeGVjdXRpb25Mb2NhdGlvbiApICksCisJbVJJRCggKSwKKwltQ09ERSggKSwKKwlpdENvZGUoICksCisJZW5kQ29kZSggKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJRXhlY3V0aW9uTG9jYXRpb24oY29uc3QgRXhlY3V0aW9uTG9jYXRpb24gJiBhbkV4ZWNMb2NhdGlvbikKKwk6IEVsZW1lbnQoIENMQVNTX0tJTkRfVCggRXhlY3V0aW9uTG9jYXRpb24gKSApLAorCW1SSUQoIGFuRXhlY0xvY2F0aW9uLm1SSUQgKSwKKwltQ09ERSggYW5FeGVjTG9jYXRpb24ubUNPREUgKSwKKwlpdENvZGUoIGFuRXhlY0xvY2F0aW9uLml0Q29kZSApLAorCWVuZENvZGUoIGFuRXhlY0xvY2F0aW9uLmVuZENvZGUgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIE90aGVycworCSAqLworCUV4ZWN1dGlvbkxvY2F0aW9uKGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQorCTogRWxlbWVudCggQ0xBU1NfS0lORF9UKCBFeGVjdXRpb25Mb2NhdGlvbiApICksCisJbVJJRCggYVJJRCApLAorCW1DT0RFKCBhQ29kZSApLAorCWl0Q29kZSggYUNvZGUtPmJlZ2luKCkgKSwKKwllbmRDb2RlKCBhQ29kZS0+ZW5kKCkgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJRXhlY3V0aW9uTG9jYXRpb24oY29uc3QgUnVudGltZUlEICYgYVJJRCwgY29uc3QgQkZDb2RlICYgYUNvZGUsCisJCQljb25zdCBBdm1Db2RlOjpjb25zdF9pdGVyYXRvciAmIGl0KQorCTogRWxlbWVudCggQ0xBU1NfS0lORF9UKCBFeGVjdXRpb25Mb2NhdGlvbiApICksCisJbVJJRCggYVJJRCApLAorCW1DT0RFKCBhQ29kZSApLAorCWl0Q29kZSggaXQgKSwKKwllbmRDb2RlKCBhQ29kZS0+ZW5kKCkgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJRXhlY3V0aW9uTG9jYXRpb24oY29uc3QgUnVudGltZUlEICYgYVJJRCwgY29uc3QgQkZDb2RlICYgYUNvZGUsCisJCQljb25zdCBBdm1Db2RlOjpjb25zdF9pdGVyYXRvciAmIGl0LAorCQkJY29uc3QgQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgJiBlbmRJdCkKKwk6IEVsZW1lbnQoIENMQVNTX0tJTkRfVCggRXhlY3V0aW9uTG9jYXRpb24gKSApLAorCW1SSUQoIGFSSUQgKSwKKwltQ09ERSggYUNvZGUgKSwKKwlpdENvZGUoIGl0ICksCisJZW5kQ29kZSggZW5kSXQgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+RXhlY3V0aW9uTG9jYXRpb24oKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKworCWlubGluZSB2b2lkIHJlZnJlc2hBbGwoKQorCXsKKwkJaXRDb2RlID0gbUNPREUtPmJlZ2luKCk7CisJCWVuZENvZGUgPSBtQ09ERS0+ZW5kKCk7CisJfQorCisJaW5saW5lIHZvaWQgcmVmcmVzaEJlZ2luKCkKKwl7CisJCWl0Q29kZSA9IG1DT0RFLT5iZWdpbigpOworCX0KKworCWlubGluZSB2b2lkIHJlZnJlc2hFbmQoKQorCXsKKwkJZW5kQ29kZSA9IG1DT0RFLT5lbmQoKTsKKwl9CisKKworCS8qKgorCSAqIENPTVBBUklTT04KKwkgKiBPUEVSQVRPUgorCSAqLworCisJYm9vbCBpc0VRKGNvbnN0IEV4ZWN1dGlvbkxvY2F0aW9uICogZWwpIGNvbnN0CisJeworCQlyZXR1cm4oICh0aGlzID09IGVsKSB8fAorCQkJCSgobVJJRCA9PSBlbC0+bVJJRCkgJiYgKG1DT0RFID09IGVsLT5tQ09ERSkgJiYKKwkJCQkJCShpdENvZGUgPT0gZWwtPml0Q29kZSkgJiYgKGVuZENvZGUgPT0gZWwtPmVuZENvZGUpKSApOworCX0KKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwl2aXJ0dWFsIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCit9OworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVFlQRSBERUZJTklUSU9OIGZvciBTTUFSVCBQT0lOVEVSIGFuZCBDT05UQUlORVIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjbGFzcyBFeGVjdXRpb25Mb2NhdGlvblF1ZXVlCit7CisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBBVFRSSUJVVEVTCisJICovCisJTGlzdDwgQkYgPiBtUXVldWU7CisKKwlMaXN0PCBCRiA+IG1DYWNoZTsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJRXhlY3V0aW9uTG9jYXRpb25RdWV1ZSgpCisJOiBtUXVldWUoICksCisJbUNhY2hlKCApCisJeworCQkvLyEhISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJRXhlY3V0aW9uTG9jYXRpb25RdWV1ZShjb25zdCBFeGVjdXRpb25Mb2NhdGlvblF1ZXVlICYgYW5FTFEpCisJOiBtUXVldWUoIGFuRUxRLm1RdWV1ZSApLAorCW1DYWNoZSggYW5FTFEubUNhY2hlICkKKwl7CisJCS8vISEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+RXhlY3V0aW9uTG9jYXRpb25RdWV1ZSgpCisJeworCQkvLyEhISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtUXVldWUKKwkgKi8KKworCWJvb2wgZW1wdHkoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUXVldWUuZW1wdHkoKSApOworCX0KKworCWJvb2wgbm9uZW1wdHkoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAhIG1RdWV1ZS5lbXB0eSgpICk7CisJfQorCisKKwl2b2lkIHBvcFRvKEJGICYgcG9wRWxlbSkKKwl7CisJCXBvcEVsZW0gPSBtUXVldWUuYmFjaygpOworCisJCW1RdWV1ZS5wb3BfYmFjaygpOworCX0KKworCisJdm9pZCBwdXNoKGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsIGNvbnN0IEJGQ29kZSAmIGFDb2RlKQorCXsKKwkJbUNhY2hlLnB1c2hfZnJvbnQoCisJCQkJQkYoIG5ldyBFeGVjdXRpb25Mb2NhdGlvbihhUklELCBhQ29kZSkgKSApOworCX0KKworCXZvaWQgcHVzaChjb25zdCBSdW50aW1lSUQgJiBhUklELCBjb25zdCBCRkNvZGUgJiBhQ29kZSwKKwkJCWNvbnN0IEF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yICYgaXQsCisJCQljb25zdCBBdm1Db2RlOjpjb25zdF9pdGVyYXRvciAmIGVuZEl0KQorCXsKKwkJbUNhY2hlLnB1c2hfZnJvbnQoCisJCQkJQkYoIG5ldyBFeGVjdXRpb25Mb2NhdGlvbihhUklELCBhQ29kZSwgaXQsIGVuZEl0KSApICk7CisJfQorCisKKwl2b2lkIHB1c2hDYWNoZSgpCisJeworCQltUXVldWUuc3BsaWNlKG1DYWNoZSk7CisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gU0VSSUFMSVpBVElPTgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCit9OworCisKKworfQorCisjZW5kaWYgLyogRVhFQ1VUSU9OTE9DQVRJT05fSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL0V4ZWN1dGlvblN5bmNocm9uaXphdGlvblBvaW50LmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL0V4ZWN1dGlvblN5bmNocm9uaXphdGlvblBvaW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDgwYmNhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3J1bnRpbWUvRXhlY3V0aW9uU3luY2hyb25pemF0aW9uUG9pbnQuY3BwCkBAIC0wLDAgKzEsOTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAzIG5vdi4gMjAxMAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiRXhlY3V0aW9uU3luY2hyb25pemF0aW9uUG9pbnQuaCIKKworCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvUm91dGluZ0RhdGEuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL1J1bnRpbWVJRC5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvKioKKyAqIFNlcmlhbGl6YXRpb24KKyAqLwordm9pZCBFeGVjdXRpb25TeW5jaHJvbml6YXRpb25Qb2ludDo6dG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJb3MgPDwgVEFCIDw8ICJlc3Bsb2MgeyIgPDwgRU9MOworCisKKwlvcyA8PCBUQUIyIDw8ICJ3cG4gPSAiOworCXN3aXRjaCAoIG1Bd2FpdGluZ1BvaW50TmF0dXJlICkKKwl7CisJCWNhc2UgQVdBSVRJTkdfUE9JTlRfSU5QVVRfTkFUVVJFOgorCQl7CisJCQlvcyA8PCAiQVdBSVRJTkdfUE9JTlRfSU5QVVRfTkFUVVJFIjsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgQVdBSVRJTkdfUE9JTlRfT1VUUFVUX05BVFVSRToKKwkJeworCQkJb3MgPDwgIkFXQUlUSU5HX1BPSU5UX09VVFBVVF9OQVRVUkUiOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEFXQUlUSU5HX1BPSU5UX0pPSU5fTkFUVVJFOgorCQl7CisJCQlvcyA8PCAiQVdBSVRJTkdfUE9JTlRfSk9JTl9OQVRVUkUiOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEFXQUlUSU5HX1BPSU5UX1VOREVGSU5FRF9OQVRVUkU6CisJCXsKKwkJCW9zIDw8ICJBV0FJVElOR19QT0lOVF9VTkRFRklORURfTkFUVVJFIjsKKwkJCWJyZWFrOworCQl9CisJCWRlZmF1bHQgOgorCQl7CisJCQlvcyA8PCAiQVdBSVRJTkdfUE9JTlRfVU5LTk9XTl9OQVRVUkUiOworCQkJYnJlYWs7CisJCX0KKwl9CisJb3MgPDwgIjsiIDw8IEVPTDsKKworCW9zIDw8IFRBQjIgPDwgInJpZCA9ICIgPDwgbVJJRC5zdHIoKSA8PCAiOyIgPDwgRU9MX0lOQ1JfSU5ERU5UOworCisJaWYoIG1Sb3V0aW5nRGF0YSAhPSBOVUxMICkKKwl7CisJCW1Sb3V0aW5nRGF0YS50b1N0cmVhbShvcyk7CisJfQorCisJaWYoIG1NZXNzYWdlLnZhbGlkKCkgKQorCXsKKwkJbU1lc3NhZ2UudG9TdHJlYW0ob3MpOworCX0KKworCWlmKCBuZXh0ICE9IE5VTEwgKQorCXsKKwkJbmV4dC0+dG9TdHJlYW0ob3MpOworCX0KKworCW9zIDw8IERFQ1JfSU5ERU5UX1RBQiA8PCAgIn0iIDw8IEVPTDsKK30KKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvcnVudGltZS9FeGVjdXRpb25TeW5jaHJvbml6YXRpb25Qb2ludC5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3J1bnRpbWUvRXhlY3V0aW9uU3luY2hyb25pemF0aW9uUG9pbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGI5ZWNjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3J1bnRpbWUvRXhlY3V0aW9uU3luY2hyb25pemF0aW9uUG9pbnQuaApAQCAtMCwwICsxLDE3MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDMgbm92LiAyMDEwCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRVhFQ1VUSU9OU1lOQ0hST05JWkFUSU9OUE9JTlRfSF8KKyNkZWZpbmUgRVhFQ1VUSU9OU1lOQ0hST05JWkFUSU9OUE9JTlRfSF8KKworCisjaW5jbHVkZSA8Y29tbW9uL0F2bU9iamVjdC5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvUm91dGluZ0RhdGEuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9NZXNzYWdlLmg+CisKKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lSUQuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworY2xhc3MgUnVudGltZUlEOworCisKKy8qKgorICogVFlQRSBERUNMQVJBVElPTlMKKyAqLworCitlbnVtIEFXQUlUSU5HX1BPSU5UX05BVFVSRQoreworCUFXQUlUSU5HX1BPSU5UX0lOUFVUX05BVFVSRSwKKworCUFXQUlUSU5HX1BPSU5UX09VVFBVVF9OQVRVUkUsCisKKworCUFXQUlUSU5HX1BPSU5UX0pPSU5fTkFUVVJFLAorCisJQVdBSVRJTkdfUE9JTlRfVU5ERUZJTkVEX05BVFVSRQorfTsKKworCisKK2NsYXNzIEV4ZWN1dGlvblN5bmNocm9uaXphdGlvblBvaW50ICA6IHB1YmxpYyBBdm1PYmplY3QgLAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIEV4ZWN1dGlvblN5bmNocm9uaXphdGlvblBvaW50ICkKK3sKKworLy8JQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoRXhlY3V0aW9uU3luY2hyb25pemF0aW9uUG9pbnQpCisKK3B1YmxpYzoKKwkvKioKKwkgKiBBVFRSSUJVVEVTCisJICovCisJQVdBSVRJTkdfUE9JTlRfTkFUVVJFIG1Bd2FpdGluZ1BvaW50TmF0dXJlOworCisJUnVudGltZUlEIG1SSUQ7CisKKwlSb3V0aW5nRGF0YSBtUm91dGluZ0RhdGE7CisKKwlNZXNzYWdlIG1NZXNzYWdlOworCisJRXhlY3V0aW9uU3luY2hyb25pemF0aW9uUG9pbnQgKiBuZXh0OworCitwcml2YXRlOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUV4ZWN1dGlvblN5bmNocm9uaXphdGlvblBvaW50KCkKKwk6IG1Bd2FpdGluZ1BvaW50TmF0dXJlKCBBV0FJVElOR19QT0lOVF9VTkRFRklORURfTkFUVVJFICksCisJbVJJRCggKSwKKwltUm91dGluZ0RhdGEoICksCisJbU1lc3NhZ2UoICksCisJbmV4dCggTlVMTCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIENvcHkKKwkgKi8KKwlFeGVjdXRpb25TeW5jaHJvbml6YXRpb25Qb2ludChjb25zdCBFeGVjdXRpb25TeW5jaHJvbml6YXRpb25Qb2ludCAmIGFuRVNQKQorCTogbUF3YWl0aW5nUG9pbnROYXR1cmUoIGFuRVNQLm1Bd2FpdGluZ1BvaW50TmF0dXJlICksCisJbVJJRCggYW5FU1AubVJJRCApLAorCW1Sb3V0aW5nRGF0YSggYW5FU1AubVJvdXRpbmdEYXRhICksCisJbU1lc3NhZ2UoIGFuRVNQLm1NZXNzYWdlICksCisJbmV4dCggKGFuRVNQLm5leHQgIT0gTlVMTCkgPworCQkJbmV3IEV4ZWN1dGlvblN5bmNocm9uaXphdGlvblBvaW50KCooYW5FU1AubmV4dCkpIDogTlVMTCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogT3RoZXJzCisJICovCisJRXhlY3V0aW9uU3luY2hyb25pemF0aW9uUG9pbnQoQVdBSVRJTkdfUE9JTlRfTkFUVVJFIGFXYWl0aW5nUG9pbnROYXR1cmUsCisJCQljb25zdCBSdW50aW1lSUQgJiBhUm91dGluZ1JJRCwgY29uc3QgUm91dGluZ0RhdGEgJiBhUm91dGluZ0RhdGEsCisJCQljb25zdCBNZXNzYWdlICYgYU1lc3NhZ2UsCisJCQlFeGVjdXRpb25TeW5jaHJvbml6YXRpb25Qb2ludCAqIG54dCA9IE5VTEwpCisJOiBtQXdhaXRpbmdQb2ludE5hdHVyZSggYVdhaXRpbmdQb2ludE5hdHVyZSApLAorCW1SSUQoIGFSb3V0aW5nUklEICksCisJbVJvdXRpbmdEYXRhKCBhUm91dGluZ0RhdGEgKSwKKwltTWVzc2FnZSggYU1lc3NhZ2UgKSwKKwluZXh0KCBueHQgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJRXhlY3V0aW9uU3luY2hyb25pemF0aW9uUG9pbnQoQVdBSVRJTkdfUE9JTlRfTkFUVVJFIGFXYWl0aW5nUG9pbnROYXR1cmUsCisJCQljb25zdCBSdW50aW1lSUQgJiBqb2luUklELAorCQkJRXhlY3V0aW9uU3luY2hyb25pemF0aW9uUG9pbnQgKiBueHQgPSBOVUxMKQorCTogbUF3YWl0aW5nUG9pbnROYXR1cmUoIGFXYWl0aW5nUG9pbnROYXR1cmUgKSwKKwltUklEKCBqb2luUklEICksCisJbVJvdXRpbmdEYXRhKCApLAorCW1NZXNzYWdlKCApLAorCW5leHQoIG54dCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5FeGVjdXRpb25TeW5jaHJvbml6YXRpb25Qb2ludCgpCisJeworCQlzZXA6OmRlc3Ryb3koIG5leHQgKTsKKwl9CisKKworCWJvb2wgaXNJbnB1dCgpCisJeworCQlyZXR1cm4oIG1Bd2FpdGluZ1BvaW50TmF0dXJlID09IEFXQUlUSU5HX1BPSU5UX0lOUFVUX05BVFVSRSApOworCX0KKworCWJvb2wgaXNPdXRwdXQoKQorCXsKKwkJcmV0dXJuKCBtQXdhaXRpbmdQb2ludE5hdHVyZSA9PSBBV0FJVElOR19QT0lOVF9PVVRQVVRfTkFUVVJFICk7CisJfQorCisJYm9vbCBpc0pvaW4oKQorCXsKKwkJcmV0dXJuKCBtQXdhaXRpbmdQb2ludE5hdHVyZSA9PSBBV0FJVElOR19QT0lOVF9KT0lOX05BVFVSRSApOworCX0KKworCisJLyoqCisJICogU2VyaWFsaXphdGlvbgorCSAqLworCXZpcnR1YWwgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKK307CisKKworfQorCisjZW5kaWYgLyogRVhFQ1VUSU9OU1lOQ0hST05JWkFUSU9OUE9JTlRfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL0xvY2FsUnVudGltZS5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvcnVudGltZS9Mb2NhbFJ1bnRpbWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwODNjY2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvcnVudGltZS9Mb2NhbFJ1bnRpbWUuY3BwCkBAIC0wLDAgKzEsNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxvY2FsUnVudGltZS5oIgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0J1aWx0aW5BcnJheS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvKioKKyAqIFNlcmlhbGl6YXRpb24KKyAqLwordm9pZCBMb2NhbFJ1bnRpbWVFbGVtZW50Ojp0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlpZiggb3MucHJlZmVyYWJseUZRTigpICkKKwl7CisJCW9zIDw8IFRBQiA8PCBtUHJvZ3JhbS5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOworCQlyZXR1cm47CisJfQorCisJb3MgPDwgVEFCIDw8ICJydW50aW1lIiA8PCBtUHJvZ3JhbS5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQk8PCAiIGFzIHByb2dyYW0geyI7CisKKwlBVk1fREVCVUdfUkVGX0NPVU5URVIob3MpOworCW9zIDw8IEVPTF9GTFVTSDsKKworCWlmKCBtRGF0YVRhYmxlLm5vbmVtcHR5KCkgKQorCXsKKwkJb3MgPDwgRU9MOworCQlvcyA8PCBUQUIgPDwgImRhdGEiOworCQltRGF0YVRhYmxlLkFWTV9ERUJVR19SRUZfQ09VTlRFUihvcyk7CisJCW9zIDw8IEVPTDsKKworCQlUYWJsZU9mRGF0YTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtRGF0YVRhYmxlLmJlZ2luKCk7CisJCVRhYmxlT2ZEYXRhOjpjb25zdF9pdGVyYXRvciBpdEVuZCA9IG1EYXRhVGFibGUuZW5kKCk7CisJCWZvciggYXZtX3NpemVfdCBpID0gMCA7IGl0ICE9IGl0RW5kIDsgKytpdCAsICsraSApCisJCXsKKwkJCW9zIDw8IFRBQjIgPDwgKCppdCkuQVZNX0RFQlVHX1JFRl9DT1VOVEVSKCkgPDwgIiR7IDo9ICI7CisKKy8vCQkJb3MgPDwgbVJJRC5nZXRWYXJpYWJsZXMoKS5nZXQoaSktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7CisJCQlvcyA8PCBtUHJvZ3JhbS5nZXREYXRhKCkucmF3QXQoaSktPmdldE5hbWVJRCgpCisJCQkJCTw8IHN0cl9pbmRlbnQoICppdCApIDw8ICIgfSIgPDwgRU9MX0ZMVVNIOworCQl9CisJfQorCisJb3MgPDwgVEFCIDw8ICJ9IiA8PCBFT0xfRkxVU0g7Cit9CisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3J1bnRpbWUvTG9jYWxSdW50aW1lLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvcnVudGltZS9Mb2NhbFJ1bnRpbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzQxYzYwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3J1bnRpbWUvTG9jYWxSdW50aW1lLmgKQEAgLTAsMCArMSwzNTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgTE9DQUxSVU5USU1FX0hfCisjZGVmaW5lIExPQ0FMUlVOVElNRV9IXworCisjaW5jbHVkZSA8YmFzZS9TbWFydFBvaW50ZXIuaD4KKyNpbmNsdWRlIDxjb21tb24vRWxlbWVudC5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvQmFzZUF2bVByb2dyYW0uaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0J1aWx0aW5BcnJheS5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvVGFibGVPZkRhdGEuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKK2NsYXNzIEJGOworCitjbGFzcyBMb2NhbFJ1bnRpbWU7CisKKworY2xhc3MgTG9jYWxSdW50aW1lRWxlbWVudCA6IHB1YmxpYyBFbGVtZW50ICwKKwkJQVZNX0lOSkVDVF9JTlNUQU5DRV9DT1VOVEVSX0NMQVNTKCBMb2NhbFJ1bnRpbWVFbGVtZW50ICkKK3sKKworCWZyaWVuZCBMb2NhbFJ1bnRpbWU7CisKKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggTG9jYWxSdW50aW1lRWxlbWVudCApCisKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwljb25zdCBCYXNlQXZtUHJvZ3JhbSAmIG1Qcm9ncmFtOworCisJYXZtX29mZnNldF90IG1PZmZzZXQ7CisKKwlUYWJsZU9mRGF0YSBtRGF0YVRhYmxlOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlMb2NhbFJ1bnRpbWVFbGVtZW50KGNvbnN0IEJhc2VBdm1Qcm9ncmFtICYgYVByb2dyYW0pCisJOiBFbGVtZW50KCBDTEFTU19LSU5EX1QoIExvY2FsUnVudGltZSApICksCisKKwltUHJvZ3JhbSggYVByb2dyYW0gKSwKKwltT2Zmc2V0KCAwICksCisJbURhdGFUYWJsZSggYVByb2dyYW0uZ2V0RGF0YVNpemUoKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIENvcHkKKwkgKi8KKwlMb2NhbFJ1bnRpbWVFbGVtZW50KGNvbnN0IExvY2FsUnVudGltZUVsZW1lbnQgJiBhbkVsZW1lbnQpCisJOiBFbGVtZW50KCBhbkVsZW1lbnQgKSwKKworCW1Qcm9ncmFtKCBhbkVsZW1lbnQubVByb2dyYW0gKSwKKwltT2Zmc2V0KCBhbkVsZW1lbnQubU9mZnNldCApLAorCW1EYXRhVGFibGUoIGFuRWxlbWVudC5tRGF0YVRhYmxlICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkxvY2FsUnVudGltZUVsZW1lbnQoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJdmlydHVhbCB2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworfTsKKworCisKKworY2xhc3MgTG9jYWxSdW50aW1lIDoKKwkJcHVibGljIFNtYXJ0UG9pbnRlcjwgTG9jYWxSdW50aW1lRWxlbWVudCAsIERlc3Ryb3lFbGVtZW50UG9saWN5ID4sCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggTG9jYWxSdW50aW1lICkKK3sKKworcHJpdmF0ZToKKwkvKioKKwkgKiBUWVBFREVGCisJICovCisJdHlwZWRlZiBTbWFydFBvaW50ZXI8IExvY2FsUnVudGltZUVsZW1lbnQgLAorCQkJCQkJRGVzdHJveUVsZW1lbnRQb2xpY3kgPiAgYmFzZV90aGlzX3R5cGU7CisKKworcHVibGljOgorCS8qCisJICogU1RBVElDIEFUVFJJQlVURVMKKwkgKi8KKwlzdGF0aWMgTG9jYWxSdW50aW1lIF9OVUxMXzsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJTG9jYWxSdW50aW1lKCkKKwk6IGJhc2VfdGhpc190eXBlKCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlMb2NhbFJ1bnRpbWUoY29uc3QgQmFzZUF2bVByb2dyYW0gJiBhUHJvZ3JhbSkKKwk6IGJhc2VfdGhpc190eXBlKCBuZXcgTG9jYWxSdW50aW1lRWxlbWVudChhUHJvZ3JhbSkgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJTG9jYWxSdW50aW1lKGNvbnN0IExvY2FsUnVudGltZSAmIGFuRWxlbWVudCkKKwk6IGJhc2VfdGhpc190eXBlKCBhbkVsZW1lbnQgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+TG9jYWxSdW50aW1lKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVByb2dyYW0KKwkgKi8KKwlpbmxpbmUgY29uc3QgQmFzZUF2bVByb2dyYW0gKiBnZXRQcm9ncmFtKCkgY29uc3QKKwl7CisJCXJldHVybiggJiggYmFzZV90aGlzX3R5cGU6Om1QVFItPm1Qcm9ncmFtICkgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1JbnN0YW5jZQorCSAqLworCWlubGluZSBjb25zdCBFeGVjdXRhYmxlRm9ybSAqIGdldEV4ZWN1dGFibGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRQcm9ncmFtKCktPmdldEV4ZWN1dGFibGUoKSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbU9mZnNldAorCSAqLworCWlubGluZSBhdm1fb2Zmc2V0X3QgZ2V0T2Zmc2V0KCkgY29uc3QKKwl7CisJCXJldHVybiggYmFzZV90aGlzX3R5cGU6Om1QVFItPm1PZmZzZXQgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRPZmZzZXQoYXZtX29mZnNldF90IGFuT2Zmc2V0KSBjb25zdAorCXsKKwkJYmFzZV90aGlzX3R5cGU6Om1QVFItPm1PZmZzZXQgPSBhbk9mZnNldDsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1EYXRhVGFibGUKKwkgKi8KKwlpbmxpbmUgVGFibGVPZkRhdGEgJiBnZXREYXRhVGFibGUoKQorCXsKKwkJcmV0dXJuKCBiYXNlX3RoaXNfdHlwZTo6bVBUUi0+bURhdGFUYWJsZSApOworCX0KKworCWlubGluZSBjb25zdCBUYWJsZU9mRGF0YSAmIGdldERhdGFUYWJsZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGJhc2VfdGhpc190eXBlOjptUFRSLT5tRGF0YVRhYmxlICk7CisJfQorCisKKwlpbmxpbmUgQkYgJiBnZXREYXRhKGF2bV9zaXplX3QgaW5kZXgpIGNvbnN0CisJeworCQlyZXR1cm4oIGJhc2VfdGhpc190eXBlOjptUFRSLT5tRGF0YVRhYmxlLmF0KGluZGV4KSApOworCX0KKworCWlubGluZSBib29sIGhhc0RhdGEoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBiYXNlX3RoaXNfdHlwZTo6bVBUUi0+bURhdGFUYWJsZS5ub25lbXB0eSgpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0RGF0YShhdm1fc2l6ZV90IGluZGV4LCBjb25zdCBCRiAmIGFEYXRhKSBjb25zdAorCXsKKwkJYmFzZV90aGlzX3R5cGU6Om1QVFItPm1EYXRhVGFibGUuc2V0KGluZGV4LCBhRGF0YSk7CisJfQorCisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJaW5saW5lIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQlpZiggYmFzZV90aGlzX3R5cGU6Om1QVFIgIT0gTlVMTCApCisJCXsKKwkJCWJhc2VfdGhpc190eXBlOjptUFRSLT50b1N0cmVhbShvcyk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlvcyA8PCAiTG9jYWxSdW50aW1lPG51bGw+IiA8PCBzdGQ6OmZsdXNoOworCQl9CisJfQorCit9OworCisKKy8qKgorICogU3RhY2sgb2YgTG9jYWxSdW50aW1lCisgKi8KK2NsYXNzIFN0YWNrT2ZMb2NhbFJ1bnRpbWUgOiAgcHVibGljIEF2bU9iamVjdCAsCisJCXB1YmxpYyBWZWN0b3I8IExvY2FsUnVudGltZSA+ICwKKwkJQVZNX0lOSkVDVF9JTlNUQU5DRV9DT1VOVEVSX0NMQVNTKCBTdGFja09mTG9jYWxSdW50aW1lICkKK3sKKworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBTdGFja09mTG9jYWxSdW50aW1lICkKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJU3RhY2tPZkxvY2FsUnVudGltZSgpCisJOiBBdm1PYmplY3QoICksCisJVmVjdG9yPCBMb2NhbFJ1bnRpbWUgPigpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIENvcHkKKwkgKi8KKwlTdGFja09mTG9jYWxSdW50aW1lKGNvbnN0IFN0YWNrT2ZMb2NhbFJ1bnRpbWUgJiBhU3RhY2spCisJOiBBdm1PYmplY3QoIGFTdGFjayApLAorCVZlY3RvcjwgTG9jYWxSdW50aW1lID4oIGFTdGFjayApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5TdGFja09mTG9jYWxSdW50aW1lKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogU0VUVEVSCisJICogRm9yIExvY2FsUnVudGltZQorCSAqLworCisJaW5saW5lIHZvaWQgc2V0TG9jYWxSdW50aW1lKAorCQkJYXZtX3NpemVfdCBvZmZzZXQsIGNvbnN0IExvY2FsUnVudGltZSAmIGFMb2NhbFJ1bnRpbWUpCisJeworCQlWZWN0b3I8IExvY2FsUnVudGltZSA+OjpzZXQob2Zmc2V0LCBhTG9jYWxSdW50aW1lKTsKKwl9CisKKworCS8qKgorCSAqIFBVU0ggLSBQT1AKKwkgKiBhbkF2bVByb2dyYW0KKwkgKiBCYXNlUnVudGltZUZvcm0KKwkgKi8KKworCWlubGluZSB2b2lkIHB1c2goY29uc3QgTG9jYWxSdW50aW1lICYgYUxvY2FsUnVudGltZSkKKwl7CisJCWFMb2NhbFJ1bnRpbWUuc2V0T2Zmc2V0KCBzaXplKCkgKTsKKwkJcHVzaF9iYWNrKCBhTG9jYWxSdW50aW1lICk7CisJfQorCisKKwlpbmxpbmUgdm9pZCBwb3AoKQorCXsKKwkJaWYoIG5vbmVtcHR5KCkgKQorCQl7CisJCQlwb3BfbGFzdCgpOworCQl9CisJfQorCisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCWZvciggY29uc3RfaXRlcmF0b3IgaXQgPSBiZWdpbigpIDsgaXQgIT0gZW5kKCkgOyArK2l0ICkKKwkJeworCQkJb3MgPDwgVEFCIDw8ICgqaXQpLnJhd19wb2ludGVyKCktPkFWTV9ERUJVR19SRUZfQ09VTlRFUigpCisJCQkJCTw8ICIkeyA6PSAiIDw8IEFWTV9OT19JTkRFTlQ7CisKKwkJCSgqaXQpLnRvU3RyZWFtKG9zKTsKKworCQkJb3MgPDwgRU5EX0lOREVOVCA8PCAiIH0iIDw8IEVPTF9GTFVTSDsKKwkJfQorCX0KKworfTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFRZUEUgREVGSU5JVElPTiBmb3IgU01BUlQgUE9JTlRFUiBhbmQgQ09OVEFJTkVSCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQVZNX0RFRklORV9BUF9DTEFTUyggU3RhY2tPZkxvY2FsUnVudGltZSApCisKKworCit9CisKKyNlbmRpZiAvKkxPQ0FMUlVOVElNRV9IXyovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvcnVudGltZS9NZXNzYWdlLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL01lc3NhZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZTBmODAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvcnVudGltZS9NZXNzYWdlLmNwcApAQCAtMCwwICsxLDI1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgIk1lc3NhZ2UuaCIKKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0F2bVByb2dyYW0uaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlRm9ybS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZNYWNoaW5lLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZlBvcnQuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoKKyAqIFNUQVRJQyBBVFRSSUJVVEVTCisgKi8KK01lc3NhZ2UgTWVzc2FnZTo6X05VTExfOworCisKKy8qKgorICogQ29tcGFyaXNvbgorICogb3BlcmF0b3I9PQorICovCitib29sIE1lc3NhZ2U6OmVxdWFscyhjb25zdCBNZXNzYWdlICYgYU1lc3NhZ2UpIGNvbnN0Cit7CisJaWYoICh0aGlzID09ICZhTWVzc2FnZSkKKwkJfHwgYmFzZV90aGlzX3R5cGU6Om9wZXJhdG9yID09KCBhTWVzc2FnZSApICkKKwl7CisJCXJldHVybiggdHJ1ZSApOworCX0KKwllbHNlIGlmKCB0aGlzLT5pbnZhbGlkKCkgfHwgYU1lc3NhZ2UuaW52YWxpZCgpICkKKwl7CisJCXJldHVybiggZmFsc2UgKTsKKwl9CisJZWxzZSBpZiggKHRoaXMtPmdldE1JRCgpID09IGFNZXNzYWdlLmdldE1JRCgpKQorCQkJJiYgKGdldFBvcnQoKSA9PSBhTWVzc2FnZS5nZXRQb3J0KCkpCisJCQkmJiAoZ2V0U2VuZGVyUklEKCkgPT0gYU1lc3NhZ2UuZ2V0U2VuZGVyUklEKCkpCisJCQkmJiAoZ2V0UmVjZWl2ZXJSSUQoKSA9PSBhTWVzc2FnZS5nZXRSZWNlaXZlclJJRCgpKSApCisJeworCQlpZiggaGFzUGFyYW1ldGVyKCkgKQorCQl7CisJCQlNZXNzYWdlOjpjb25zdF9pdGVyYXRvciBpdE90aGVyID0gYU1lc3NhZ2UuYmVnaW5QYXJhbWV0ZXJzKCk7CisJCQlNZXNzYWdlOjpjb25zdF9pdGVyYXRvciBpdCA9IGJlZ2luUGFyYW1ldGVycygpOworCQkJTWVzc2FnZTo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBlbmRQYXJhbWV0ZXJzKCk7CisJCQlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJCXsKKwkJCQkvLyBTeW50YXhpYyBlcXVhbGl0eSBiZXR3ZWVuIGFyZ3VtZW50cyA/CisJCQkJaWYoICgqaXQpICE9ICgqaXRPdGhlcikgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiggdHJ1ZSApOworCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKworCisvKioKKyAqIFNlcmlhbGl6YXRpb24KKyAqLworc3RkOjpzdHJpbmcgTWVzc2FnZUVsZW1lbnQ6OnN0cigpIGNvbnN0Cit7CisJU3RyaW5nT3V0U3RyZWFtIG9zczsKKworCW9zcyA8PCAibWVzc2FnZTwgbWlkOiIgPDwgbU1JRCA8PCAiLCAiOworCWlmKCBtUG9ydC5pczwgSW5zdGFuY2VPZlBvcnQgPigpICkKKwl7CisJCUluc3RhbmNlT2ZQb3J0ICogYVBvcnQgPSBtUG9ydC50b19wdHI8IEluc3RhbmNlT2ZQb3J0ID4oKTsKKwkJb3NzIDw8IGFQb3J0LT5zdHJDb21Qb2ludE5hdHVyZSgpIDw8ICI6ICIKKwkJCTw8IGFQb3J0LT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOworCX0KKwllbHNlCisJeworCQlvc3MgPDwgInBvcnQ6IG51bGw8cG9ydD4iOworCX0KKworCWlmKCBtU2VuZGVyUklELnZhbGlkKCkgKQorCXsKKwkJb3NzIDw8ICIsIHNlbmRlcjogIiA8PCBtU2VuZGVyUklELnN0clVuaXFJZCgpOworCX0KKwlpZiggbVJlY2VpdmVyUklELnZhbGlkKCkgKQorCXsKKwkJb3NzIDw8ICIsIHJlY2VpdmVyOiAiIDw8IG1SZWNlaXZlclJJRC5zdHJVbmlxSWQoKTsKKwl9CisJb3NzIDw8ICIgPlsiOworCisJaWYoIG1QYXJhbWV0ZXJzLm5vbmVtcHR5KCkgKQorCXsKKwkJb3NzIDw8IEFWTV9TVFJfSU5ERU5UOworCisJCU1lc3NhZ2U6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbVBhcmFtZXRlcnMuYmVnaW4oKTsKKwkJTWVzc2FnZTo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBtUGFyYW1ldGVycy5lbmQoKTsKKworCQlpdC0+dG9TdHJlYW0ob3NzKTsKKworCQlmb3IoICsraXQgOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCQl7CisJCQlvc3MgPDwgIiAsICI7CisJCQlpdC0+dG9TdHJlYW0ob3NzKTsKKwkJfQorCQlvc3MgPDwgRU5EX0lOREVOVDsKKwl9CisKKwlvc3MgPDwgIiBdIjsKKworCXJldHVybiggb3NzLnN0cigpICk7Cit9CisKKwordm9pZCBNZXNzYWdlRWxlbWVudDo6dG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJaWYoIG9zLnByZWZlcmFibHlTVFIoKSApCisJeworCQlvcyA8PCBUQUIgPDwgc3RyKCkgPDwgRU9MX0ZMVVNIOworCQlyZXR1cm47CisJfQorCisJb3MgPDwgVEFCIDw8ICJtZXNzYWdlPCBtaWQjIiA8PCBtTUlEIDw8ICIgPiAiOworCWlmKCBtU2VuZGVyUklELnZhbGlkKCkgKQorCXsKKwkJb3MgPDwgbVNlbmRlclJJRC5zdHJVbmlxSWQoKTw8ICItPiI7CisJfQorCW9zIDw8IChtUG9ydC5pczwgSW5zdGFuY2VPZlBvcnQgPigpCisJCQk/IG1Qb3J0LnRvX3B0cjwgSW5zdGFuY2VPZlBvcnQgPigpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQk6ICJudWxsPHBvcnQ+Iik7CisKKwlpZiggbVBhcmFtZXRlcnMubm9uZW1wdHkoKSApCisJeworCQlvcyA8PCAiIHsiOworCisJCUFWTV9ERUJVR19SRUZfQ09VTlRFUihvcyk7CisJCW9zIDw8IEVPTDsKKworCQlpZiggbVJlY2VpdmVyUklELnZhbGlkKCkgKQorCQl7CisJCQlvcyA8PCBUQUIyIDw8ICJyZWNlaXZlciA9ICIKKwkJCQkJPDwgbVJlY2VpdmVyUklELnN0clVuaXFJZCgpIDw8ICI7IiA8PCBFT0w7CisJCX0KKworCitBVk1fSUZfREVCVUdfTEVWRUxfR1RfTUVESVVNCisJCW9zIDw8IFRBQiA8PCAicGFyYW0iIDw8IEVPTF9JTkNSX0lOREVOVDsKKworCQlNZXNzYWdlOjpjb25zdF9pdGVyYXRvciBpdCA9IG1QYXJhbWV0ZXJzLmJlZ2luKCk7CisJCU1lc3NhZ2U6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gbVBhcmFtZXRlcnMuZW5kKCk7CisJCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCQl7CisJCQlpdC0+dG9TdHJlYW0ob3MpOworCQl9CisJCW9zIDw8IERFQ1JfSU5ERU5UOworCitBVk1fRUxTRQorCisJCW9zIDw8IFRBQjIgPDwgInBhcmFtID0gWyIgPDwgQVZNX1NUUl9JTkRFTlQ7CisKKwkJTWVzc2FnZTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtUGFyYW1ldGVycy5iZWdpbigpOworCQlNZXNzYWdlOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IG1QYXJhbWV0ZXJzLmVuZCgpOworCQlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJeworCQkJb3MgPDwgIiAsIjsKKwkJCWl0LT50b1N0cmVhbShvcyk7CisJCX0KKwkJb3MgPDwgRU5EX0lOREVOVCA8PCAiIF07IiA8PCBFT0w7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfR1RfTUVESVVNCisKKwkJb3MgPDwgVEFCIDw8ICJ9IiA8PCBFT0xfRkxVU0g7CisJfQorCWVsc2UKKwl7CisJCW9zIDw8ICI7IjsKKwkJQVZNX0RFQlVHX1JFRl9DT1VOVEVSKG9zKTsKKwkJb3MgPDwgRU9MX0ZMVVNIOworCX0KK30KKwordm9pZCBNZXNzYWdlOjp0b0ZzY24oT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJUnVudGltZUlEIGFSSUQgPSBnZXRTZW5kZXJSSUQoKTsKKworCWZvciggOyBhUklELmhhc1BSSUQoKSA7IGFSSUQgPSBhUklELmdldFBSSUQoKSApCisJeworCQlpZiggYVJJRC5nZXRFeGVjdXRhYmxlKCktPmhhc1BvcnQoKSApCisJCXsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYoIGhhc1BvcnQoKSApCisJeworCQlpbnQgcG9pbnRwb3MgPSBnZXRQb3J0KCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkucmZpbmQoJy4nLAorCQkJCWdldFBvcnQoKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKS5zaXplKCkpOworLy8JCW9zIDw8IFRBQjIgPDwgIjpwaWQjIiA8PCByaWQuZ2V0UmlkKCkgPDwgIjoiCisvLwkJCQk8PCBnZXRQb3J0KCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkuc3Vic3RyKAorLy8JCQkJCXJpZC0+Z2V0SW5zdGFuY2UoKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKS5zaXplKCkgKyAxKTsKKwkJb3MgPDwgVEFCMiA8PCAiOnBpZCMiIDw8IGFSSUQuZ2V0UmlkKCkgPDwgIjoiCisJCQkJPDwgZ2V0UG9ydCgpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpLnN1YnN0cihwb2ludHBvcyArIDEpOworCX0KKwllbHNlCisJeworCQlvcyA8PCBUQUIyIDw8ICI6cGlkIyIgPDwgYVJJRC5nZXRSaWQoKSA8PCAiOl8iOworCX0KKworCWlmKCBoYXNQYXJhbWV0ZXIoKSApCisJeworCQlvcyA8PCAiKCIgPDwgQVZNX05PX0lOREVOVDsKKworCQlNZXNzYWdlOjpjb25zdF9pdGVyYXRvciBpdCA9IGJlZ2luUGFyYW1ldGVycygpOworCQlNZXNzYWdlOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IGVuZFBhcmFtZXRlcnMoKTsKKworCQlpdC0+dG9TdHJlYW0ob3MpOworCisJCWZvciggKytpdCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJCXsKKwkJCW9zIDw8ICIgLCAiOworCQkJaXQtPnRvU3RyZWFtKG9zKTsKKwkJfQorCisJCW9zIDw8ICIpIjsKKworQVZNX0lGX0RFQlVHX0VOQUJMRURfQU5EKCBiYXNlX3RoaXNfdHlwZTo6bVBUUi0+bVJlY2VpdmVyUklELnZhbGlkKCkgKQorCW9zIDw8ICIgLyogLS0+ICIgPDwgYmFzZV90aGlzX3R5cGU6Om1QVFItPm1SZWNlaXZlclJJRC5zdHJVbmlxSWQoKSA8PCAiKi8iOworQVZNX0VORElGX0RFQlVHX0VOQUJMRURfQU5ECisKKwkJb3MgPDwgIjsiIDw8IEVORF9JTkRFTlRfRU9MOworCX0KKwllbHNlCisJeworQVZNX0lGX0RFQlVHX0VOQUJMRURfQU5EKCBiYXNlX3RoaXNfdHlwZTo6bVBUUi0+bVJlY2VpdmVyUklELnZhbGlkKCkgKQorCW9zIDw8ICIgLyogLS0+ICIgPDwgYmFzZV90aGlzX3R5cGU6Om1QVFItPm1SZWNlaXZlclJJRC5zdHJVbmlxSWQoKSA8PCAiKi8iOworQVZNX0VORElGX0RFQlVHX0VOQUJMRURfQU5ECisKKwkJb3MgPDwgIjsiIDw8IEVPTF9GTFVTSDsKKwl9Cit9CisKKworCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL01lc3NhZ2UuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL01lc3NhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDkwMzVhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3J1bnRpbWUvTWVzc2FnZS5oCkBAIC0wLDAgKzEsNjIwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIE1FU1NBR0VfSF8KKyNkZWZpbmUgTUVTU0FHRV9IXworCisjaW5jbHVkZSA8YmFzZS9TbWFydFBvaW50ZXIuaD4KKyNpbmNsdWRlIDxjb21tb24vRWxlbWVudC5oPgorCisjaW5jbHVkZSA8Y29sbGVjdGlvbi9CRkNvbnRhaW5lci5oPgorI2luY2x1ZGUgPGNvbGxlY3Rpb24vTGlzdC5oPgorI2luY2x1ZGUgPGNvbGxlY3Rpb24vVmVjdG9yLmg+CisKKyNpbmNsdWRlIDxjb21tb24vQkYuaD4KKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZQb3J0Lmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvUnVudGltZUlELmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBNZXNzYWdlOworCisvKioKKyAqIFRZUEVERUYKKyAqLwordHlwZWRlZiBMaXN0PCBhdm1fc2l6ZV90ID4gIExpc3RPZlNpemVUOworCisKK2NsYXNzIE1lc3NhZ2VFbGVtZW50IDoKKwkJcHVibGljIEVsZW1lbnQsCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggTWVzc2FnZUVsZW1lbnQgKQoreworCisJZnJpZW5kIGNsYXNzIE1lc3NhZ2U7CisKKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggTWVzc2FnZUVsZW1lbnQgKQorCitwcm90ZWN0ZWQ6CisJLyoKKwkgKiBBVFRSSUJVVEVTCisJICovCisJLy8gVGhlIE1lc3NhZ2UgSWRlbnRpZmllcgorCWF2bV9zaXplX3QgbU1JRDsKKworCS8vIFJJRCBvZiBzZW5kZXIKKwlSdW50aW1lSUQgbVNlbmRlclJJRDsKKworCS8vIFJJRCBvZiBSZWNlaXZlcgorCVJ1bnRpbWVJRCBtUmVjZWl2ZXJSSUQ7CisKKwkvLyBUaGUgcG9ydAorCUJGIG1Qb3J0OworCisJLy8gVGhlIHBhcmFtZXRlcnMKKwlCRlZlY3RvciBtUGFyYW1ldGVyczsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJTWVzc2FnZUVsZW1lbnQoY29uc3QgUnVudGltZUlEICYgYVNlbmRlclJJRCwgY29uc3QgQkYgJiBhUG9ydCkKKwk6IEVsZW1lbnQoIENMQVNTX0tJTkRfVCggTWVzc2FnZSApICksCisJbU1JRCggMCApLAorCW1TZW5kZXJSSUQoIGFTZW5kZXJSSUQgKSwKKwltUmVjZWl2ZXJSSUQoICksCisJbVBvcnQoIGFQb3J0ICksCisJbVBhcmFtZXRlcnMoICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCU1lc3NhZ2VFbGVtZW50KGF2bV9zaXplX3QgYU1JRCwKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFTZW5kZXJSSUQsIGNvbnN0IEJGICYgYVBvcnQpCisJOiBFbGVtZW50KCBDTEFTU19LSU5EX1QoIE1lc3NhZ2UgKSApLAorCW1NSUQoIGFNSUQgKSwKKwltU2VuZGVyUklEKCBhU2VuZGVyUklEICksCisJbVJlY2VpdmVyUklEKCApLAorCW1Qb3J0KCBhUG9ydCApLAorCW1QYXJhbWV0ZXJzKCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlNZXNzYWdlRWxlbWVudChjb25zdCBSdW50aW1lSUQgJiBhU2VuZGVyUklELAorCQkJY29uc3QgUnVudGltZUlEICYgYVJlY2VpdmVyUklELCBjb25zdCBCRiAmIGFQb3J0KQorCTogRWxlbWVudCggQ0xBU1NfS0lORF9UKCBNZXNzYWdlICkgKSwKKwltTUlEKCAwICksCisJbVNlbmRlclJJRCggYVNlbmRlclJJRCApLAorCW1SZWNlaXZlclJJRCggYVJlY2VpdmVyUklEICksCisJbVBvcnQoIGFQb3J0ICksCisJbVBhcmFtZXRlcnMoICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCU1lc3NhZ2VFbGVtZW50KGNvbnN0IFJ1bnRpbWVJRCAmIGFTZW5kZXJSSUQsCisJCQljb25zdCBSdW50aW1lSUQgJiBhUmVjZWl2ZXJSSUQsIEluc3RhbmNlT2ZQb3J0ICogYVBvcnQpCisJOiBFbGVtZW50KCBDTEFTU19LSU5EX1QoIE1lc3NhZ2UgKSApLAorCW1NSUQoIDAgKSwKKwltU2VuZGVyUklEKCBhU2VuZGVyUklEICksCisJbVJlY2VpdmVyUklEKCBhUmVjZWl2ZXJSSUQgKSwKKwltUG9ydCggSU5DUl9CRiggYVBvcnQgKSApLAorCW1QYXJhbWV0ZXJzKCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlNZXNzYWdlRWxlbWVudChhdm1fc2l6ZV90IGFNSUQsIGNvbnN0IFJ1bnRpbWVJRCAmIGFTZW5kZXJSSUQsCisJCQljb25zdCBSdW50aW1lSUQgJiBhUmVjZWl2ZXJSSUQsIGNvbnN0IEJGICYgYVBvcnQpCisJOiBFbGVtZW50KCBDTEFTU19LSU5EX1QoIE1lc3NhZ2UgKSApLAorCW1NSUQoIGFNSUQgKSwKKwltU2VuZGVyUklEKCBhU2VuZGVyUklEICksCisJbVJlY2VpdmVyUklEKCBhUmVjZWl2ZXJSSUQgKSwKKwltUG9ydCggYVBvcnQgKSwKKwltUGFyYW1ldGVycyggKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJTWVzc2FnZUVsZW1lbnQoY29uc3QgTWVzc2FnZUVsZW1lbnQgJiBhbkVsZW1lbnQpCisJOiBFbGVtZW50KCBhbkVsZW1lbnQgKSwKKwltTUlEKCBhbkVsZW1lbnQubU1JRCApLAorCW1TZW5kZXJSSUQoIGFuRWxlbWVudC5tU2VuZGVyUklEICksCisJbVJlY2VpdmVyUklEKCBhbkVsZW1lbnQubVJlY2VpdmVyUklEICksCisJbVBvcnQoIGFuRWxlbWVudC5tUG9ydCApLAorCW1QYXJhbWV0ZXJzKCBhbkVsZW1lbnQubVBhcmFtZXRlcnMgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+TWVzc2FnZUVsZW1lbnQoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogU2VyaWFsaXphdGlvbgorCSAqLworCXZpcnR1YWwgc3RkOjpzdHJpbmcgc3RyKCkgY29uc3Q7CisKKwl2aXJ0dWFsIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCit9OworCitjbGFzcyBNZXNzYWdlIDoKKwkJcHVibGljIFNtYXJ0UG9pbnRlcjwgTWVzc2FnZUVsZW1lbnQgLCBEZXN0cm95RWxlbWVudFBvbGljeSA+LAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIE1lc3NhZ2UgKQoreworCitwcml2YXRlOgorCS8qKgorCSAqIFRZUEVERUYKKwkgKi8KKwl0eXBlZGVmIFNtYXJ0UG9pbnRlcjwgTWVzc2FnZUVsZW1lbnQgLAorCQkJCQkJRGVzdHJveUVsZW1lbnRQb2xpY3kgPiAgYmFzZV90aGlzX3R5cGU7CisKK3B1YmxpYzoKKwkvKioKKwkgKiBUWVBFREVGCisJICovCisJdHlwZWRlZiBCRlZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgIGNvbnN0X2l0ZXJhdG9yOworCisJLyoKKwkgKiBTVEFUSUMgQVRUUklCVVRFUworCSAqLworCXN0YXRpYyBNZXNzYWdlIF9OVUxMXzsKKworCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJTWVzc2FnZSgpCisJOiBiYXNlX3RoaXNfdHlwZSggKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJTWVzc2FnZShjb25zdCBSdW50aW1lSUQgJiBhU2VuZGVyUklELCBjb25zdCBCRiAmIGFQb3J0KQorCTogYmFzZV90aGlzX3R5cGUoIG5ldyBNZXNzYWdlRWxlbWVudChhU2VuZGVyUklELCBhUG9ydCkgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJTWVzc2FnZShhdm1fc2l6ZV90IGFNSUQsIGNvbnN0IFJ1bnRpbWVJRCAmIGFTZW5kZXJSSUQsIGNvbnN0IEJGICYgYVBvcnQpCisJOiBiYXNlX3RoaXNfdHlwZSggbmV3IE1lc3NhZ2VFbGVtZW50KGFNSUQsIGFTZW5kZXJSSUQsIGFQb3J0KSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlNZXNzYWdlKGNvbnN0IFJ1bnRpbWVJRCAmIGFTZW5kZXJSSUQsCisJCQljb25zdCBSdW50aW1lSUQgJiBhUmVjZWl2ZXJSSUQsIGNvbnN0IEJGICYgYVBvcnQpCisJOiBiYXNlX3RoaXNfdHlwZSggbmV3IE1lc3NhZ2VFbGVtZW50KGFTZW5kZXJSSUQsIGFSZWNlaXZlclJJRCwgYVBvcnQpICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCU1lc3NhZ2UoY29uc3QgUnVudGltZUlEICYgYVNlbmRlclJJRCwKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSZWNlaXZlclJJRCwgSW5zdGFuY2VPZlBvcnQgKiBhUG9ydCkKKwk6IGJhc2VfdGhpc190eXBlKCBuZXcgTWVzc2FnZUVsZW1lbnQoYVNlbmRlclJJRCwgYVJlY2VpdmVyUklELCBhUG9ydCkgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJTWVzc2FnZShhdm1fc2l6ZV90IGFNSUQsIGNvbnN0IFJ1bnRpbWVJRCAmIGFTZW5kZXJSSUQsCisJCQljb25zdCBSdW50aW1lSUQgJiBhUmVjZWl2ZXJSSUQsIGNvbnN0IEJGICYgYVBvcnQpCisJOiBiYXNlX3RoaXNfdHlwZSggbmV3IE1lc3NhZ2VFbGVtZW50KGFNSUQsIGFTZW5kZXJSSUQsIGFSZWNlaXZlclJJRCwgYVBvcnQpICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCU1lc3NhZ2UoY29uc3QgTWVzc2FnZSAmIGFuRWxlbWVudCkKKwk6IGJhc2VfdGhpc190eXBlKCBhbkVsZW1lbnQgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+TWVzc2FnZSgpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIG9wZXJhdG9yPQorCSAqLworCWlubGluZSBNZXNzYWdlICYgb3BlcmF0b3I9KGNvbnN0IEJGICYgb3RoZXIpCisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoIG90aGVyLmlzPCBNZXNzYWdlID4oKSApCisJCQkJPDwgIkludmFsaWQgQXNzaWdubWVudCBDYXN0IG9mIGFuIGluaGVyaXQgQkYgQ2xhc3MgISEiCisJCQkJPDwgU0VORF9FWElUOworCisJCWlmKCBiYXNlX3RoaXNfdHlwZTo6bVBUUiAhPSBvdGhlci5yYXdfcG9pbnRlcigpICkKKwkJeworCQkJcmVsZWFzZV9hY3F1aXJlKAorCQkJCQlzdGF0aWNfY2FzdDwgTWVzc2FnZUVsZW1lbnQgKiA+KCBvdGhlci5yYXdfcG9pbnRlcigpICkgKTsKKwkJfQorCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJLyoqCisJICogQ29tcGFyaXNvbgorCSAqIG9wZXJhdG9yPT0KKwkgKi8KKwlib29sIGVxdWFscyhjb25zdCBNZXNzYWdlICYgYU1lc3NhZ2UpIGNvbnN0OworCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtUGFyYW1ldGVycworCSAqLworCWlubGluZSBjb25zdF9pdGVyYXRvciBiZWdpblBhcmFtZXRlcnMoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBiYXNlX3RoaXNfdHlwZTo6bVBUUi0+bVBhcmFtZXRlcnMuYmVnaW4oKSApOworCX0KKworCWlubGluZSBjb25zdF9pdGVyYXRvciBlbmRQYXJhbWV0ZXJzKCkgY29uc3QKKwl7CisJCXJldHVybiggYmFzZV90aGlzX3R5cGU6Om1QVFItPm1QYXJhbWV0ZXJzLmVuZCgpICk7CisJfQorCisKKwlpbmxpbmUgdm9pZCBhcHBlbmRQYXJhbWV0ZXJzKGNvbnN0IEJGVmVjdG9yICYgYVBhcmFtZXRlcikKKwl7CisJCWJhc2VfdGhpc190eXBlOjptUFRSLT5tUGFyYW1ldGVycy5hcHBlbmQoIGFQYXJhbWV0ZXIgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQkZWZWN0b3IgJiBnZXRQYXJhbWV0ZXJzKCkgY29uc3QKKwl7CisJCXJldHVybiggYmFzZV90aGlzX3R5cGU6Om1QVFItPm1QYXJhbWV0ZXJzICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzUGFyYW1ldGVyKCkgY29uc3QKKwl7CisJCXJldHVybiggYmFzZV90aGlzX3R5cGU6Om1QVFItPm1QYXJhbWV0ZXJzLm5vbmVtcHR5KCkgKTsKKwl9CisKKwlpbmxpbmUgYXZtX3NpemVfdCBzaXplKCkgY29uc3QKKwl7CisJCXJldHVybiggYmFzZV90aGlzX3R5cGU6Om1QVFItPm1QYXJhbWV0ZXJzLnNpemUoKSApOworCX0KKworCisJaW5saW5lIHZvaWQgYXBwZW5kUGFyYW1ldGVyKGNvbnN0IEJGICYgYVBhcmFtZXRlcikKKwl7CisJCWJhc2VfdGhpc190eXBlOjptUFRSLT5tUGFyYW1ldGVycy5hcHBlbmQoIGFQYXJhbWV0ZXIgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQkYgJiBnZXRQYXJhbWV0ZXIoYXZtX3NpemVfdCBvZmZzZXQpIGNvbnN0CisJeworCQlyZXR1cm4oIGJhc2VfdGhpc190eXBlOjptUFRSLT5tUGFyYW1ldGVycy5nZXQoIG9mZnNldCApICk7CisJfQorCisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1NSUQKKwkgKi8KKwlpbmxpbmUgYXZtX3NpemVfdCBnZXRNSUQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBiYXNlX3RoaXNfdHlwZTo6bVBUUi0+bU1JRCApOworCX0KKworCisJaW5saW5lIGJvb2wgaXNNSUQoYXZtX3NpemVfdCBtaWQpIGNvbnN0CisJeworCQlyZXR1cm4oIGJhc2VfdGhpc190eXBlOjptUFRSLT5tTUlEID09IG1pZCApOworCX0KKworCWlubGluZSBib29sIGlzTUlEKGNvbnN0IExpc3RPZlNpemVUICYgaWVNaWRzKSBjb25zdAorCXsKKwkJcmV0dXJuKCBpZU1pZHMuY29udGFpbnMoYmFzZV90aGlzX3R5cGU6Om1QVFItPm1NSUQpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0TUlEKGF2bV9zaXplX3QgbWlkKSBjb25zdAorCXsKKwkJYmFzZV90aGlzX3R5cGU6Om1QVFItPm1NSUQgPSBtaWQ7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtU2VuZGVyUklECisJICovCisJaW5saW5lIGNvbnN0IFJ1bnRpbWVJRCAmIGdldFNlbmRlclJJRCgpIGNvbnN0CisJeworCQlyZXR1cm4oIGJhc2VfdGhpc190eXBlOjptUFRSLT5tU2VuZGVyUklEICk7CisJfQorCisJaW5saW5lIEluc3RhbmNlT2ZNYWNoaW5lICogZ2V0U2VuZGVyTWFjaGluZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGJhc2VfdGhpc190eXBlOjptUFRSLT5tU2VuZGVyUklELmdldEluc3RhbmNlKCkgKTsKKwl9CisKKworCS8vIFRoZSBSSUQgb2YgdGhlIE1hY2hpbmUgd2hlcmUgdGhlIHBvcnQgaXMgZGVjbGFyZWQKKwlpbmxpbmUgUnVudGltZUlEIGdldE1haW5TZW5kZXJSSUQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBoYXNQb3J0KCkKKwkJCQk/IGJhc2VfdGhpc190eXBlOjptUFRSLT5tU2VuZGVyUklELmdldENvbW11bmljYXRvciggZ2V0UG9ydCgpICkKKwkJCQk6IFJ1bnRpbWVJRDo6UkVGX05VTEwgKTsKKwl9CisKKwkvLyBUaGUgaW5zdGFuY2Ugb2YgTWFjaGluZSB3aGVyZSB0aGUgcG9ydCBpcyBkZWNsYXJlZAorCWlubGluZSBJbnN0YW5jZU9mTWFjaGluZSAqIGdldE1haW5TZW5kZXJNYWNoaW5lKCkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0TWFpblNlbmRlclJJRCgpLmdldEluc3RhbmNlKCkgKTsKKwl9CisKKworCWlubGluZSBib29sIGhhc1NlbmRlclJJRCgpIGNvbnN0CisJeworCQlyZXR1cm4oIGJhc2VfdGhpc190eXBlOjptUFRSLT5tU2VuZGVyUklELnZhbGlkKCkgKTsKKwl9CisKKworCS8vIHJldHVybiBUUlVFIGZvciBhbGwgYW5jZXN0b3Igb2YgdGhlIGNvbmNyZXRlIHNlbmRlciBSSUQKKwlpbmxpbmUgYm9vbCBpc1NlbmRlcihjb25zdCBSdW50aW1lSUQgJiBhUklEKSBjb25zdAorCXsKKwkJcmV0dXJuKCBiYXNlX3RoaXNfdHlwZTo6bVBUUi0+bVNlbmRlclJJRC5oYXNBc0FuY2VzdG9yKGFSSUQpICk7CisJCQkJLy8gRE9OJ1QgRE8gVEhJUyBWRVJJRklDQVRJT04KKy8vCQkJCXx8IGFSSUQuaGFzQXNBbmNlc3RvcihiYXNlX3RoaXNfdHlwZTo6bVBUUi0+bVNlbmRlclJJRCkgKTsKKwl9CisKKworCS8vIHJldHVybiBUUlVFIGZvciBhbGwgYW5jZXN0b3Igb2YgdGhlIGNvbmNyZXRlIHNlbmRlciBSSUQKKwlpbmxpbmUgYm9vbCBpc1NlbmRlck1hY2hpbmUoSW5zdGFuY2VPZk1hY2hpbmUgKiBhbkluc3RhbmNlKSBjb25zdAorCXsKKwkJcmV0dXJuKCBiYXNlX3RoaXNfdHlwZTo6bVBUUi0+bVNlbmRlclJJRC5oYXNBc0FuY2VzdG9yKGFuSW5zdGFuY2UpICk7CisJfQorCisJaW5saW5lIGJvb2wgbmVlZFNlbmRlcihjb25zdCBSdW50aW1lSUQgJiBhUklEKQorCXsKKwkJcmV0dXJuKCBiYXNlX3RoaXNfdHlwZTo6bVBUUi0+bVNlbmRlclJJRC5pbnZhbGlkKCkKKwkJCQl8fCBpc1NlbmRlcihhUklEKSApOworCX0KKworCisJaW5saW5lIHZvaWQgc2V0U2VuZGVyUklEKGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQpCisJeworCQliYXNlX3RoaXNfdHlwZTo6bVBUUi0+bVNlbmRlclJJRCA9IGFSSUQ7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtUmVjZWl2ZXJSSUQKKwkgKi8KKwlpbmxpbmUgY29uc3QgUnVudGltZUlEICYgZ2V0UmVjZWl2ZXJSSUQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBiYXNlX3RoaXNfdHlwZTo6bVBUUi0+bVJlY2VpdmVyUklEICk7CisJfQorCisJaW5saW5lIEluc3RhbmNlT2ZNYWNoaW5lICogZ2V0UmVjZWl2ZXJNYWNoaW5lKCkgY29uc3QKKwl7CisJCXJldHVybiggYmFzZV90aGlzX3R5cGU6Om1QVFItPm1SZWNlaXZlclJJRC5nZXRJbnN0YW5jZSgpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzUmVjZWl2ZXJSSUQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBiYXNlX3RoaXNfdHlwZTo6bVBUUi0+bVJlY2VpdmVyUklELnZhbGlkKCkgKTsKKwl9CisKKworCS8vIHJldHVybiBUUlVFIGZvciBhbGwgYW5jZXN0b3Igb2YgdGhlIGNvbmNyZXRlIHNlbmRlciBSSUQKKwlpbmxpbmUgYm9vbCBpc1JlY2VpdmVyKGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQpIGNvbnN0CisJeworCQlyZXR1cm4oIGJhc2VfdGhpc190eXBlOjptUFRSLT5tUmVjZWl2ZXJSSUQuaW52YWxpZCgpCisJCQkJfHwgYVJJRC5pbnZhbGlkKCkKKwkJCQl8fCBhUklELmhhc0FzQW5jZXN0b3IoIGJhc2VfdGhpc190eXBlOjptUFRSLT5tUmVjZWl2ZXJSSUQgKSApOworCQkJCS8vIERPTidUIERPIFRISVMgVkVSSUZJQ0FUSU9OCisvLwkJCQl8fCBiYXNlX3RoaXNfdHlwZTo6bVBUUi0+bVJlY2VpdmVyUklELmhhc0FzQW5jZXN0b3IoIGFSSUQgKSApOworCX0KKworCisJLy8gcmV0dXJuIFRSVUUgZm9yIGFsbCBhbmNlc3RvciBvZiB0aGUgY29uY3JldGUgc2VuZGVyIFJJRAorCWlubGluZSBib29sIGlzUmVjZWl2ZXJNYWNoaW5lKEluc3RhbmNlT2ZNYWNoaW5lICogYW5JbnN0YW5jZSkgY29uc3QKKwl7CisJCXJldHVybiggYmFzZV90aGlzX3R5cGU6Om1QVFItPm1SZWNlaXZlclJJRC5oYXNBc0FuY2VzdG9yKGFuSW5zdGFuY2UpICk7CisJfQorCisJaW5saW5lIGJvb2wgbmVlZFJlY2VpdmVyKGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQpCisJeworCQlyZXR1cm4oIGJhc2VfdGhpc190eXBlOjptUFRSLT5tUmVjZWl2ZXJSSUQuaW52YWxpZCgpCisJCQkJfHwgaXNSZWNlaXZlcihhUklEKSApOworCX0KKworCWlubGluZSB2b2lkIHNldFJlY2VpdmVyUklEKGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQpCisJeworCQliYXNlX3RoaXNfdHlwZTo6bVBUUi0+bVJlY2VpdmVyUklEID0gYVJJRDsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1Qb3J0CisJICovCisJaW5saW5lIGNvbnN0IEJGICYgYmZQb3J0KCkgY29uc3QKKwl7CisJCXJldHVybiggYmFzZV90aGlzX3R5cGU6Om1QVFItPm1Qb3J0ICk7CisJfQorCisJaW5saW5lIEluc3RhbmNlT2ZQb3J0ICogZ2V0UG9ydCgpIGNvbnN0CisJeworCQlyZXR1cm4oIGJhc2VfdGhpc190eXBlOjptUFRSLT5tUG9ydC5hc19wdHI8IEluc3RhbmNlT2ZQb3J0ID4oKSApOworCX0KKworCWlubGluZSBib29sIGhhc1BvcnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBiYXNlX3RoaXNfdHlwZTo6bVBUUi0+bVBvcnQudmFsaWQoKSApOworCX0KKworCisJaW5saW5lIGJvb2wgaXNTaWduYWwoSW5zdGFuY2VPZlBvcnQgKiBhU2lnbmFsKSBjb25zdAorCXsKKwkJcmV0dXJuKCBiYXNlX3RoaXNfdHlwZTo6bVBUUi0+bVBvcnQuaXNURVEoIGFTaWduYWwgKSApOworCX0KKworCWlubGluZSBib29sIGlzU2lnbmFsKGNvbnN0IExpc3RPZkluc3RhbmNlT2ZQb3J0ICYgaWVTaWduYWxzKSBjb25zdAorCXsKKwkJcmV0dXJuKCBpZVNpZ25hbHMuY29udGFpbnMoCisJCQkJYmFzZV90aGlzX3R5cGU6Om1QVFItPm1Qb3J0LmFzX3B0cjwgSW5zdGFuY2VPZlBvcnQgPigpICkgKTsKKwl9CisKKworCWlubGluZSB2b2lkIHNldFBvcnQoY29uc3QgQkYgJiBhUG9ydCkKKwl7CisJCWJhc2VfdGhpc190eXBlOjptUFRSLT5tUG9ydCA9IGFQb3J0OworCX0KKworCisJLyoqCisJICogVEVTVAorCSAqIGlzQ29tcGF0aWJsZQorCSAqLworCS8vIGNhc2Ugb2YgUmVjZWl2ZXIgb25seQorCWlubGluZSBib29sIGlzQ29tcGF0aWJsZShjb25zdCBSdW50aW1lSUQgJiBhUmVjZWl2ZXJSSUQpIGNvbnN0CisJeworCQlyZXR1cm4oIGlzUmVjZWl2ZXIoYVJlY2VpdmVyUklEKSApOworCX0KKworCS8vIGNhc2Ugb2YgTUlECisJaW5saW5lIGJvb2wgaXNDb21wYXRpYmxlKGF2bV9zaXplX3QgbWlkKSBjb25zdAorCXsKKwkJcmV0dXJuKCBpc01JRChtaWQpICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNDb21wYXRpYmxlKGF2bV9zaXplX3QgbWlkLAorCQkJY29uc3QgUnVudGltZUlEICYgYVJlY2VpdmVyUklEKSBjb25zdAorCXsKKwkJcmV0dXJuKCBpc01JRChtaWQpICYmIGlzUmVjZWl2ZXIoYVJlY2VpdmVyUklEKSApOworCX0KKworCisJLy8gY2FzZSBvZiBTaWduYWwKKwlpbmxpbmUgYm9vbCBpc0NvbXBhdGlibGUoSW5zdGFuY2VPZlBvcnQgKiBhU2lnbmFsKSBjb25zdAorCXsKKwkJcmV0dXJuKCBpc1NpZ25hbChhU2lnbmFsKSk7CisJfQorCisJaW5saW5lIGJvb2wgaXNDb21wYXRpYmxlKEluc3RhbmNlT2ZQb3J0ICogYVNpZ25hbCwKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSZWNlaXZlclJJRCkgY29uc3QKKwl7CisJCXJldHVybiggaXNTaWduYWwoYVNpZ25hbCkgJiYgaXNSZWNlaXZlcihhUmVjZWl2ZXJSSUQpICk7CisJfQorCisKKwkvLyBjYXNlIG9mIGxpc3Q8IE1JRCA+CisJaW5saW5lIGJvb2wgaXNDb21wYXRpYmxlKGNvbnN0IExpc3RPZlNpemVUICYgaWVNaWRzKSBjb25zdAorCXsKKwkJcmV0dXJuKCBpc01JRChpZU1pZHMpICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNDb21wYXRpYmxlKGNvbnN0IExpc3RPZlNpemVUICYgaWVNaWRzLAorCQkJY29uc3QgUnVudGltZUlEICYgYVJlY2VpdmVyUklEKSBjb25zdAorCXsKKwkJcmV0dXJuKCBpc1JlY2VpdmVyKGFSZWNlaXZlclJJRCkgJiYgaXNNSUQoaWVNaWRzKSApOworCX0KKworCisJLy8gY2FzZSBvZiBsaXN0PCBTaWduYWwgPgorCWlubGluZSBib29sIGlzQ29tcGF0aWJsZShjb25zdCBMaXN0T2ZJbnN0YW5jZU9mUG9ydCAmIGllU2lnbmFscykgY29uc3QKKwl7CisJCXJldHVybiggaXNTaWduYWwoaWVTaWduYWxzKSApOworCX0KKworCWlubGluZSBib29sIGlzQ29tcGF0aWJsZShjb25zdCBMaXN0T2ZJbnN0YW5jZU9mUG9ydCAmIGllU2lnbmFscywKKwkJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSZWNlaXZlclJJRCkgY29uc3QKKwl7CisJCXJldHVybiggaXNSZWNlaXZlcihhUmVjZWl2ZXJSSUQpICYmIGlzU2lnbmFsKGllU2lnbmFscykgKTsKKwl9CisKKworCisJLyoqCisJICogU2VyaWFsaXphdGlvbgorCSAqLworCWlubGluZSB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHN0cigpIGNvbnN0CisJeworCQlyZXR1cm4oIChiYXNlX3RoaXNfdHlwZTo6bVBUUiAhPSBOVUxMKSA/CisJCQkJYmFzZV90aGlzX3R5cGU6Om1QVFItPnN0cigpIDogIk1lc3NhZ2U8bnVsbD4iICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgdG9TdHJpbmcoCisJCQljb25zdCBBdm1JbmRlbnQgJiBpbmRlbnQgPSBBVk1fVEFCX0lOREVOVCkgY29uc3QKKwl7CisJCWlmKCBiYXNlX3RoaXNfdHlwZTo6bVBUUiAhPSBOVUxMICkKKwkJeworCQkJU3RyaW5nT3V0U3RyZWFtIG9zcyhpbmRlbnQpOworCisJCQliYXNlX3RoaXNfdHlwZTo6bVBUUi0+dG9TdHJlYW0oIG9zcyApOworCisJCQlyZXR1cm4oIG9zcy5zdHIoKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuKCBpbmRlbnQuVEFCUyArICJNZXNzYWdlPG51bGw+IiArIGluZGVudC5FT0wpOworCQl9CisJfQorCisJaW5saW5lIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQlpZiggYmFzZV90aGlzX3R5cGU6Om1QVFIgIT0gTlVMTCApCisJCXsKKwkJCWJhc2VfdGhpc190eXBlOjptUFRSLT50b1N0cmVhbShvcyk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlvcyA8PCAiTWVzc2FnZTxudWxsPiIgPDwgc3RkOjpmbHVzaDsKKwkJfQorCX0KKworCXZvaWQgdG9Gc2NuKE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworfTsKKworCisKKy8qKgorICogVFlQRSBERUZJTklUSU9OCisgKiBUQUJMRSBvZiBST1VURVIKKyAqLwordHlwZWRlZiAgTGlzdDwgTWVzc2FnZSAgID4gIExpc3RPZk1lc3NhZ2U7CisKK3R5cGVkZWYgIFZlY3RvcjwgTWVzc2FnZSA+ICBUYWJsZU9mTWVzc2FnZTsKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qTUVTU0FHRV9IXyovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvcnVudGltZS9SRUFETUUubWQgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvcnVudGltZS9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQzOWYyZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL1JFQURNRS5tZApAQCAtMCwwICsxLDM0IEBACisjIEVGTS1TWU1CRVggOiBSdW50aW1lCisKKyMjIFNvdXJjZSBjb2RlIHN0cnVjdHVyZQorCisjIyMgSW50ZXJmYWNlcworCisjIyMgQ2xhc3NlcworCisjIyMjIFByb2Nlc3NlcworKiAqKlBJRCoqIGFzICpQcm9jZXNzIElkZW50aWZpZXIqIG9mIEluc3RhbmNlIG9mIE1hY2hpbmUKKyogKipQcm9jZXNzKiogYXMgKkluc3RhbmNlKiBhdCBydW50aW1lIHN0YWdlIGluIGFuICpFeGVjdXRpb24gQ29udGV4dCogc25hcHNob3QKKyogKipQcm9jZXNzVGFibGUqKiBhcyAqUHJvY2VzcyBUYWJsZSogCisKKyMjIyMgVGFibGUgCisqICoqVmFsdWVUYWJsZSoqIGFzIFZhbHVlIFRhYmxlIG9mICpQcm9jZXNzKiB3LnIudCAqVmFyaWFibGUqIFRhYmxlIG9mIEluc3RhbmNlIE1vZGVsLCBha2EgTWFjaGluZQorKiAqKkJ1ZmZlckluc3RhbmNlVGFibGUqKiBhcyBCdWZmZXIgSW5zdGFuY2UgVGFibGUgb2YgKlByb2Nlc3MqIHcuci50IEJ1ZmZlciBNb2RlbCBUYWJsZSBvZiBJbnN0YW5jZSBNb2RlbCwgYWthIE1hY2hpbmUKKworIyMjIyBNZXNzYWdlIFRhYmxlCisjIyMjIyBJbnRlcmZhY2VzCisqICoqSU1lc3NhZ2VUYWJsZSoqIGFzICpSdW50aW1lIEJ1ZmZlciogSW50ZXJmYWNlIGZvciBtZXNzYWdlIHN0b3JhZ2UKKworIyMjIyMgQ2xhc3NlcworKiAqKkZpZm9NZXNzYWdlVGFibGUqKiBhcyBNZXNzYWdlIFRhYmxlIHdpdGggRklGTyBzdG9yYWdlIGhhbmRsZXIKKyogKipMaWZvTWVzc2FnZVRhYmxlKiogYXMgTWVzc2FnZSBUYWJsZSB3aXRoIExJRk8gc3RvcmFnZSBoYW5kbGVyCisqICoqQmFnTWVzc2FnZVRhYmxlKiogIGFzIE1lc3NhZ2UgVGFibGUgd2l0aCBCQUcgc3RvcmFnZSBoYW5kbGVyCisqICoqU2V0TWVzc2FnZVRhYmxlKiogYXMgTWVzc2FnZSBUYWJsZSB3aXRoIFNFVCBzdG9yYWdlIGhhbmRsZXIKKyogKipSYW1NZXNzYWdlVGFibGUqKiBhcyBNZXNzYWdlIFRhYmxlIHdpdGggUkFNIHN0b3JhZ2UgaGFuZGxlcgorCisjIyMjIyBGYWN0b3JpZXMKKyogKipNZXNzYWdlVGFibGUqKiBhcyBTbWFydCBQb2ludGVyCisKKworIyMjIEZhY3RvcmllcworCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvcnVudGltZS9SdW50aW1lRGVmLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL1J1bnRpbWVEZWYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MjQzYjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvcnVudGltZS9SdW50aW1lRGVmLmNwcApAQCAtMCwwICsxLDIxOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDkgZsOpdnIuIDIwMTIKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlJ1bnRpbWVEZWYuaCIKKworI2luY2x1ZGUgPHV0aWwvYXZtX3N0cmluZy5oPgorCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoqCisgKiBQUk9DRVNTIEVWQUwgU1RBVEUKKyAqIHRvU3RyaW5nKCkKKyAqLworCisjZGVmaW5lIFBSSU5UX1BST0NFU1NfU1RBVEUoIE9CSiApICBcCisJY2FzZSBQUk9DRVNTXyMjT0JKIyNfU1RBVEUgOiByZXR1cm4oIFFVT1RFTUUoIFNUQVRFXyMjT0JKICkgKQorCisKK3N0ZDo6c3RyaW5nIFJ1bnRpbWVEZWY6OnN0clBFUyhQUk9DRVNTX0VWQUxfU1RBVEUgYVBFUykKK3sKKwlzd2l0Y2ggKCBhUEVTICkKKwl7CisJCVBSSU5UX1BST0NFU1NfU1RBVEUoIENSRUFUSU5HICk7CisJCVBSSU5UX1BST0NFU1NfU1RBVEUoIENSRUFURUQgKTsKKworCQlQUklOVF9QUk9DRVNTX1NUQVRFKCBMT0FERUQgKTsKKworCQlQUklOVF9QUk9DRVNTX1NUQVRFKCBTVEFSVElORyApOworCQlQUklOVF9QUk9DRVNTX1NUQVRFKCBJTklUSU5HICk7CisKKwkJUFJJTlRfUFJPQ0VTU19TVEFURSggRklOQUxJWklORyApOworCQlQUklOVF9QUk9DRVNTX1NUQVRFKCBGSU5BTElaRUQgKTsKKworCQlQUklOVF9QUk9DRVNTX1NUQVRFKCBERVNUUk9ZRUQgKTsKKworCQlQUklOVF9QUk9DRVNTX1NUQVRFKCBTVE9QUElORyApOworCQlQUklOVF9QUk9DRVNTX1NUQVRFKCBTVE9QUEVEICk7CisKKwkJUFJJTlRfUFJPQ0VTU19TVEFURSggU1VTUEVOREVEICk7CisKKwkJUFJJTlRfUFJPQ0VTU19TVEFURSggV0FJVElORyApOworCQlQUklOVF9QUk9DRVNTX1NUQVRFKCBXQUlUSU5HX0pPSU4gKTsKKworCQlQUklOVF9QUk9DRVNTX1NUQVRFKCBBQk9SVEVEICk7CisJCVBSSU5UX1BST0NFU1NfU1RBVEUoIERJU0FCTEVEICk7CisKKy8vCQlQUklOVF9QUk9DRVNTX1NUQVRFKCBFTkFCTEVEICk7CisJCVBSSU5UX1BST0NFU1NfU1RBVEUoIElETEUgKTsKKworCQlQUklOVF9QUk9DRVNTX1NUQVRFKCBSVU5OSU5HICk7CisKKwkJUFJJTlRfUFJPQ0VTU19TVEFURSggVU5ERUZJTkVEICk7CisKKwkJZGVmYXVsdCA6ICByZXR1cm4oICJQUk9DRVNTX1VOS05PV05fU1RBVEUiICk7CisJfQorfQorCisKKy8qKgorICogQVZNIEVYRUNVVElPTiBFTkRJTkcgU1RBVFVTCisgKiB0b1N0cmluZygpCisgKi8KKworI2RlZmluZSBQUklOVF9BRUVTKCBPQkogKSAgIGNhc2UgQUVFU18jI09CSiA6IHJldHVybiggUVVPVEVNRSggQUVFU18jI09CSiApICkKKworCitzdGQ6OnN0cmluZyBSdW50aW1lRGVmOjpzdHJBRUVTKEFWTV9FWEVDX0VORElOR19TVEFUVVMgYW5BRUVTKQoreworCXN3aXRjaCAoIGFuQUVFUyApCisJeworCQlQUklOVF9BRUVTKCBPSyApOworCisJCVBSSU5UX0FFRVMoIEZBSUxFRCApOworCisKKwkJUFJJTlRfQUVFUyggU1RNTlRfTk9USElORyApOworCisJCVBSSU5UX0FFRVMoIFNUTU5UX0JSRUFLICk7CisKKwkJUFJJTlRfQUVFUyggU1RNTlRfQ09OVElOVUUgKTsKKworCQlQUklOVF9BRUVTKCBTVE1OVF9SRVRVUk4gKTsKKworCisJCVBSSU5UX0FFRVMoIFNUTU5UX0ZJTkFMICk7CisJCVBSSU5UX0FFRVMoIFNUTU5UX0RFU1RST1kgKTsKKworCQlQUklOVF9BRUVTKCBTVE1OVF9FWElUICk7CisJCVBSSU5UX0FFRVMoIFNUTU5UX0VYSVRfQUxMICk7CisKKwkJUFJJTlRfQUVFUyggU1RNTlRfRkFUQUxfRVJST1IgKTsKKworCQlQUklOVF9BRUVTKCBTWU1CT0xJQ19FWEVDVVRJT05fTElNSVRBVElPTiApOworCisKKwkJUFJJTlRfQUVFUyggU1RFUF9NQVJLICk7CisKKwkJUFJJTlRfQUVFUyggU1RFUF9SRVNVTUUgKTsKKworCQlQUklOVF9BRUVTKCBXQUlUSU5HX0lOQ09NX1JEViApOworCQlQUklOVF9BRUVTKCBXQUlUSU5HX09VVENPTV9SRFYgKTsKKworCQlQUklOVF9BRUVTKCBXQUlUSU5HX0pPSU5fRk9SSyApOworCisJCVBSSU5UX0FFRVMoIFVOS05PV05fU1lOQyApOworCisJCVBSSU5UX0FFRVMoIFVOREVGSU5FRCApOworCisJCWRlZmF1bHQgOiAgcmV0dXJuKCAiQUVFU19TVE1OVF9VTktOT1dOIiApOworCX0KK30KKworCisvKioKKyAqIENPTlZFUlNJT04KKyAqLworQVZNX0VYRUNfRU5ESU5HX1NUQVRVUyBSdW50aW1lRGVmOjpQRVNfdG9fQUVFUygKKwkJUFJPQ0VTU19FVkFMX1NUQVRFIGFQRVMsIEFWTV9FWEVDX0VORElOR19TVEFUVVMgZGVmYXVsdEFFRVMpCit7CisJc3dpdGNoKCBhUEVTICkKKwl7CisJCWNhc2UgUFJPQ0VTU19GSU5BTElaRURfU1RBVEU6CisJCXsKKwkJCXJldHVybiBBRUVTX1NUTU5UX0ZJTkFMOworCQl9CisJCWNhc2UgUFJPQ0VTU19ERVNUUk9ZRURfU1RBVEU6CisJCXsKKwkJCXJldHVybiBBRUVTX1NUTU5UX0RFU1RST1k7CisJCX0KKwkJZGVmYXVsdDoKKwkJeworCQkJcmV0dXJuKCBkZWZhdWx0QUVFUyApOworCQl9CisJfQorfQorCisKKy8qKgorICogU1lOQ0hST05JWkFUSU9OCisgKi8KK1BST0NFU1NfRVZBTF9TVEFURSBSdW50aW1lRGVmOjpzeW5jUEVTKFBST0NFU1NfRVZBTF9TVEFURSByZWZQRVMsCisJCQkJUFJPQ0VTU19FVkFMX1NUQVRFIGZyc3RQRVMsIFBST0NFU1NfRVZBTF9TVEFURSBzY25kUEVTKQoreworCWlmKCAocmVmUEVTID09IHNjbmRQRVMpIHx8IChmcnN0UEVTID09IHNjbmRQRVMpICkKKwl7CisJCXJldHVybiggZnJzdFBFUyApOworCX0KKwllbHNlIGlmKCByZWZQRVMgPT0gZnJzdFBFUyApCisJeworCQlyZXR1cm4oIHNjbmRQRVMgKTsKKwl9CisJZWxzZSBpZiggKGZyc3RQRVMgPT0gUFJPQ0VTU19XQUlUSU5HX0pPSU5fU1RBVEUpIHx8CisJCQkgKHNjbmRQRVMgPT0gUFJPQ0VTU19XQUlUSU5HX0pPSU5fU1RBVEUpICkKKwl7CisJCXJldHVybiggUFJPQ0VTU19XQUlUSU5HX0pPSU5fU1RBVEUgKTsKKwl9CisKKwlyZXR1cm4oIFBST0NFU1NfVU5ERUZJTkVEX1NUQVRFICk7Cit9CisKKworQVZNX0VYRUNfRU5ESU5HX1NUQVRVUyBSdW50aW1lRGVmOjpzeW5jQUVFUygKKwkJQVZNX0VYRUNfRU5ESU5HX1NUQVRVUyBmcnN0QUVFUywgQVZNX0VYRUNfRU5ESU5HX1NUQVRVUyBzY25kQUVFUykKK3sKKwlpZiggZnJzdEFFRVMgPT0gc2NuZEFFRVMgKQorCXsKKwkJcmV0dXJuKCBmcnN0QUVFUyApOworCX0KKworCWVsc2UgaWYoIGZyc3RBRUVTID09IEFFRVNfU1RNTlRfTk9USElORyApCisJeworCQlyZXR1cm4oIHNjbmRBRUVTICk7CisJfQorCWVsc2UgaWYoIHNjbmRBRUVTID09IEFFRVNfU1RNTlRfTk9USElORyApCisJeworCQlyZXR1cm4oIGZyc3RBRUVTICk7CisJfQorCisJZWxzZSBpZiggKGZyc3RBRUVTID09IEFFRVNfU1RNTlRfRVhJVF9BTEwpIHx8CisJCQkgKHNjbmRBRUVTID09IEFFRVNfU1RNTlRfRVhJVF9BTEwpICkKKwl7CisJCXJldHVybiggQUVFU19TVE1OVF9FWElUX0FMTCApOworCX0KKwllbHNlIGlmKCAoZnJzdEFFRVMgPT0gQUVFU19TVE1OVF9FWElUKSB8fAorCQkJIChzY25kQUVFUyA9PSBBRUVTX1NUTU5UX0VYSVQpICkKKwl7CisJCXJldHVybiggQUVFU19TVE1OVF9FWElUICk7CisJfQorCWVsc2UgaWYoIChmcnN0QUVFUyA9PSBBRUVTX1NUTU5UX0ZBVEFMX0VSUk9SKSB8fAorCQkJIChzY25kQUVFUyA9PSBBRUVTX1NUTU5UX0ZBVEFMX0VSUk9SKSApCisJeworCQlyZXR1cm4oIEFFRVNfU1RNTlRfRkFUQUxfRVJST1IgKTsKKwl9CisKKwllbHNlIGlmKCAoZnJzdEFFRVMgPT0gQUVFU19TWU1CT0xJQ19FWEVDVVRJT05fTElNSVRBVElPTikgfHwKKwkJCSAoc2NuZEFFRVMgPT0gQUVFU19TWU1CT0xJQ19FWEVDVVRJT05fTElNSVRBVElPTikgKQorCXsKKwkJcmV0dXJuKCBBRUVTX1NZTUJPTElDX0VYRUNVVElPTl9MSU1JVEFUSU9OICk7CisJfQorCisJcmV0dXJuKCBBRUVTX1VOS05PV05fU1lOQyApOworfQorCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3J1bnRpbWUvUnVudGltZURlZi5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3J1bnRpbWUvUnVudGltZURlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNzM2MTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvcnVudGltZS9SdW50aW1lRGVmLmgKQEAgLTAsMCArMSwxNTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiA5IGbDqXZyLiAyMDEyCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgUlVOVElNRURFRl9IXworI2RlZmluZSBSVU5USU1FREVGX0hfCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2VudW0gUFJPQ0VTU19FVkFMX1NUQVRFCit7CisJUFJPQ0VTU19DUkVBVElOR19TVEFURSwKKwlQUk9DRVNTX0NSRUFURURfU1RBVEUsCisKKwlQUk9DRVNTX0xPQURFRF9TVEFURSwKKworCVBST0NFU1NfU1RBUlRJTkdfU1RBVEUsCisJUFJPQ0VTU19JTklUSU5HX1NUQVRFLAorCisJUFJPQ0VTU19GSU5BTElaSU5HX1NUQVRFLAorCVBST0NFU1NfRklOQUxJWkVEX1NUQVRFLAorCVBST0NFU1NfREVTVFJPWUVEX1NUQVRFLAorCisJUFJPQ0VTU19TVE9QUElOR19TVEFURSwKKwlQUk9DRVNTX1NUT1BQRURfU1RBVEUsCisKKy8vCVBST0NFU1NfU0xFRVBJTkdfU1RBVEUsCisJUFJPQ0VTU19TVVNQRU5ERURfU1RBVEUsCisKKwlQUk9DRVNTX1dBSVRJTkdfU1RBVEUsCisJUFJPQ0VTU19XQUlUSU5HX0pPSU5fU1RBVEUsCisKKwlQUk9DRVNTX0FCT1JURURfU1RBVEUsCisJUFJPQ0VTU19ESVNBQkxFRF9TVEFURSwKKworLy8JUFJPQ0VTU19FTkFCTEVEX1NUQVRFLAorCVBST0NFU1NfSURMRV9TVEFURSwKKworCVBST0NFU1NfUlVOTklOR19TVEFURSwKKwlQUk9DRVNTX1JUQ19TVEFURSwKKworCVBST0NFU1NfVU5ERUZJTkVEX1NUQVRFCit9OworCisKK2VudW0gQVZNX0VYRUNfRU5ESU5HX1NUQVRVUworeworCUFFRVNfT0ssCisJQUVFU19GQUlMRUQsCisKKwlBRUVTX1NUTU5UX05PVEhJTkcsCisKKwlBRUVTX1NUTU5UX0JSRUFLLAorCUFFRVNfU1RNTlRfQ09OVElOVUUsCisJQUVFU19TVE1OVF9SRVRVUk4sCisKKwlBRUVTX1NUTU5UX0ZJTkFMLAorCUFFRVNfU1RNTlRfREVTVFJPWSwKKworCUFFRVNfU1RNTlRfRVhJVCwKKwlBRUVTX1NUTU5UX0VYSVRfQUxMLAorCisJQUVFU19TVE1OVF9GQVRBTF9FUlJPUiwKKworCUFFRVNfU1lNQk9MSUNfRVhFQ1VUSU9OX0xJTUlUQVRJT04sCisKKwlBRUVTX1NURVBfTUFSSywKKwlBRUVTX1NURVBfUkVTVU1FLAorCisJQUVFU19XQUlUSU5HX0lOQ09NX1JEViwKKwlBRUVTX1dBSVRJTkdfT1VUQ09NX1JEViwKKworCUFFRVNfV0FJVElOR19KT0lOX0ZPUkssCisKKwlBRUVTX1VOS05PV05fU1lOQywKKworCUFFRVNfVU5ERUZJTkVECit9OworCisKKworY2xhc3MgUnVudGltZURlZgoreworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJUnVudGltZURlZigpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+UnVudGltZURlZigpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIHRvU3RyaW5nKCkKKwkgKi8KKwlzdGF0aWMgc3RkOjpzdHJpbmcgc3RyUEVTKFBST0NFU1NfRVZBTF9TVEFURSBhUEVTKTsKKworCXN0YXRpYyBzdGQ6OnN0cmluZyBzdHJBRUVTKEFWTV9FWEVDX0VORElOR19TVEFUVVMgYW5BRUVTKTsKKworCisJLyoqCisJICogQ09OVkVSU0lPTgorCSAqLworCXN0YXRpYyBBVk1fRVhFQ19FTkRJTkdfU1RBVFVTIFBFU190b19BRUVTKAorCQkJUFJPQ0VTU19FVkFMX1NUQVRFIGFQRVMsIEFWTV9FWEVDX0VORElOR19TVEFUVVMgZGVmYXVsdEFFRVMpOworCisKKwkvKioKKwkgKiBTWU5DSFJPTklaQVRJT04KKwkgKi8KKwlzdGF0aWMgUFJPQ0VTU19FVkFMX1NUQVRFIHN5bmNQRVMoUFJPQ0VTU19FVkFMX1NUQVRFIHJlZlN0YXRlLAorCQkJCVBST0NFU1NfRVZBTF9TVEFURSBmcnN0U3RhdGUsIFBST0NFU1NfRVZBTF9TVEFURSBzY25kU3RhdGUpOworCisJc3RhdGljIEFWTV9FWEVDX0VORElOR19TVEFUVVMgc3luY0FFRVMoCisJCQlBVk1fRVhFQ19FTkRJTkdfU1RBVFVTIGZyc3RBRUVTLCBBVk1fRVhFQ19FTkRJTkdfU1RBVFVTIHNjbmRBRUVTKTsKKworCisKKworfTsKKworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworI2VuZGlmIC8qIFJVTlRJTUVERUZfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL1J1bnRpbWVGb3JtLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL1J1bnRpbWVGb3JtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTdlNmI3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3J1bnRpbWUvUnVudGltZUZvcm0uY3BwCkBAIC0wLDAgKzEsNzc3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJSdW50aW1lRm9ybS5oIgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZUZvcm0uaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mRGF0YS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZNYWNoaW5lLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uRmFjdG9yeS5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uRGF0YS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUlVOVElNRSBGT1JNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKKyAqIEdFVFRFUiAtIFNFVFRFUgorICogbUNoaWxkVGFibGUKKyAqLworY29uc3QgUnVudGltZUlEICYgUnVudGltZUZvcm06OmdldENoaWxkKAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCkgY29uc3QKK3sKKwlpZiggaGFzQ2hpbGRUYWJsZSgpICkKKwl7CisJCVRhYmxlT2ZSdW50aW1lSUQ6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbUNoaWxkVGFibGUtPmJlZ2luKCk7CisJCVRhYmxlT2ZSdW50aW1lSUQ6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gbUNoaWxkVGFibGUtPmVuZCgpOworCQlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0KQorCQl7CisJCQkvLyBmYWxzZT86LSBlbHNlIG9ubHkgTE9DQVRJT04KKwkJCWlmKCAoKml0KS5nZXRJbnN0YW5jZSgpLT5mcW5FcXVhbHMoCisJCQkJCWFGdWxseVF1YWxpZmllZE5hbWVJRCAvKiBmYWxzZSAqLyApICkKKwkJCXsKKwkJCQlyZXR1cm4oICppdCApOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuKCBSdW50aW1lSUQ6OlJFRl9OVUxMICk7Cit9CisKKworCisvKioKKyAqIFNlcmlhbGl6YXRpb24KKyAqLwordm9pZCBSdW50aW1lRm9ybTo6dG9TdHJlYW0oY29uc3QgRXhlY3V0aW9uRGF0YSAqIGFuRUQsIE91dFN0cmVhbSAmIG9zKSBjb25zdAoreworCWlmKCBvcy5wcmVmZXJhYmx5RlFOKCkgKQorCXsKKy8vCQlvcyA8PCBUQUIgPDwgInJpZCMiIDw8IGdldFJJRCgpLmdldFJpZCgpOworCQlvcyA8PCBUQUIgPDwgZ2V0UklEKCkuc3RyKCk7CisKKwkJcmV0dXJuOworCX0KKworCW9zIDw8IFRBQiA8PCAicnVudGltZSI7CisJaWYoIGdldEluc3RhbmNpYXRpb25Db3VudCgpICE9IDEgKQorCXsKKwkJb3MgPDwgIjwgY291bnQ6IiA8PCBnZXRJbnN0YW5jaWF0aW9uQ291bnQoKSA8PCAiID4iOworCX0KKwlvcyA8PCAiIHBwaWQjIiA8PCAoKGdldFJJRCgpLmdldFBSaWQoKSA+PSAwKT8gZ2V0UklEKCkuZ2V0UFJpZCgpIDogMCApCisJCQk8PCAiLnBpZCMiIDw8IGdldFJJRCgpLmdldFJpZCgpIDw8ICIgIiA8PCBnZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQk8PCAiIGFzICYiIDw8IGdldFJJRCgpLmdldEluc3RhbmNlKCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7CisKKwlpZiggaGFzQ2hpbGQoKSB8fCBoYXNPblNjaGVkdWxlKCkgfHwgaGFzT25EZWZlcigpIHx8IGlzSW5wdXRFbmFibGVkKCkgfHwKKwkJKG5vdCBpc0Vudmlyb25tZW50RW5hYmxlZENvbW11bmljYXRpb24oKSkgfHwKKwkJaGFzRGF0YSgpIHx8IGhhc1JvdXRlcigpIHx8IGhhc0J1ZmZlcigpICkKKwl7CisJCW9zIDw8ICIgeyI7CisJfQorCWVsc2UKKwl7CisJCW9zIDw8ICI7IjsKKwkJQVZNX0RFQlVHX1JFRl9DT1VOVEVSKG9zKTsKKwkJb3MgPDwgRU9MX0ZMVVNIOworCisJCXJldHVybjsKKwl9CisKKworCUFWTV9ERUJVR19SRUZfQ09VTlRFUihvcyk7CisJb3MgPDwgRU9MX0ZMVVNIOworCisvLwlvcyA8PCBJTkNSX0lOREVOVDsKKy8vCWdldFJJRCgpLnRvU3RyZWFtKG9zKTsKKy8vCW9zIDw8IERFQ1JfSU5ERU5UOworCitBVk1fSUZfREVCVUdfRU5BQkxFRF9BTkQoIGhhc0NoaWxkKCkgKQorCisJb3MgPDwgaW5jcl9zdHJlYW0oIGdldENoaWxkVGFibGUoKSApOworCitBVk1fRU5ESUZfREVCVUdfRU5BQkxFRF9BTkQKKworCWlmKCBoYXNPblNjaGVkdWxlKCkgKQorCXsKKwkJb3MgPDwgVEFCMiA8PCAiQHNjaGVkdWxleyIgPDwgSU5DUjJfSU5ERU5UOworCQlnZXRPblNjaGVkdWxlKCktPnRvU3RyZWFtUm91dGluZSggb3MgKTsKKwkJb3MgPDwgREVDUjJfSU5ERU5UX1RBQjIgPDwgIn0iIDw8IEVPTDsKKwl9CisKKwlpZiggaGFzT25EZWZlcigpICkKKwl7CisJCW9zIDw8IFRBQjIgPDwgIkBkZWZlcnsiIDw8IElOQ1IyX0lOREVOVDsKKwkJZ2V0T25EZWZlcigpLT50b1N0cmVhbVJvdXRpbmUoIG9zICk7CisJCW9zIDw8IERFQ1IyX0lOREVOVF9UQUIyIDw8ICJ9IiA8PCBFT0w7CisJfQorCisJLy8gdGhlIElucHV0IEVuYWJsZWQgRmxhZworCS8vIE1PQyBBdHRyaWJ1dGUgZm9yIENvbW11bmljYXRpb24KKwlpZiggaXNJbnB1dEVuYWJsZWQoKSApCisJeworCQlvcyA8PCBUQUIyIDw8ICJpbnB1dF9lbmFibGVkID0gdHJ1ZTsiIDw8IEVPTF9GTFVTSDsKKwl9CisKKwlpZiggbm90IGlzRW52aXJvbm1lbnRFbmFibGVkQ29tbXVuaWNhdGlvbigpICkKKwl7CisJCW9zIDw8IFRBQjIgPDwgImVudmlyb25tZW50X2VuYWJsZWQgPSBmYWxzZTsiIDw8IEVPTF9GTFVTSDsKKwl9CisKKwlpZiggaGFzRGF0YSgpICkKKwl7CisJCW9zIDw8IEVPTF9UQUIgPDwgImRhdGE6IjsKKwkJZ2V0RGF0YVRhYmxlKCktPkFWTV9ERUJVR19SRUZfQ09VTlRFUihvcyk7CisJCW9zIDw8IEVPTDsKKworCQlhdm1fb2Zmc2V0X3Qgb2Zmc2V0ID0gMDsKKwkJVGFibGVPZkRhdGE6Oml0ZXJhdG9yIGl0ID0gZ2V0RGF0YVRhYmxlKCktPmJlZ2luKCk7CisJCWZvciggOyBpdCAhPSBnZXREYXRhVGFibGUoKS0+ZW5kKCkgOyArK2l0ICwgKytvZmZzZXQgKQorCQl7CisvLwkJCW9zIDw8IFRBQjIgPDwgZ2V0VmFyaWFibGVzKCkucmF3QXQoaSktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7CisJCQlvcyA8PCBUQUIyIDw8IGdldFZhcmlhYmxlcygpLnJhd0F0KG9mZnNldCktPmdldE5hbWVJRCgpIDw8IHN0ZDo6Zmx1c2g7CisKKy8vQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKAorLy8JKG9mZnNldCA9PSBnZXRWYXJpYWJsZXMoKS5yYXdBdChvZmZzZXQpLT5nZXRPZmZzZXQoKSkgKQorLy8JCTw8ICJJbnZhbGlkIHZhcmlhYmxlIG9mZnNldCBpbiBkYXRhIHRhYmxlIVxuXHQiCisvLwkJPDwgc3RyX2hlYWRlciggZ2V0VmFyaWFibGVzKCkucmF3QXQob2Zmc2V0KSApCisvLwkJPDwgU0VORF9FWElUOworCisJCQlvcyA8PCAoICgoYW5FRCAhPSBOVUxMKSAmJgorCQkJCQlhbkVELT5pc0Fzc2lnbmVkKGdldFJJRCgpLCBvZmZzZXQpKT8gIiA6PSIgOiAiID0iICk7CisKKwkJCWlmKCAoKml0KS52YWxpZCgpICkKKwkJCXsKKwkJCQlvcyA8PCAoKml0KS5BVk1fREVCVUdfUkVGX0NPVU5URVIoKTsKKworCQkJCWdldFZhcmlhYmxlcygpLnJhd0F0KG9mZnNldCktPnN0clZhbHVlKG9zLCAoKml0KSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJb3MgPDwgIiBudWxsPCB2YWx1ZSA+IjsKKwkJCX0KKworCQkJb3MgPDwgIjsiIDw8IEVPTF9GTFVTSDsKKwkJfQorCX0KKworQVZNX0lGX0RFQlVHX0xFVkVMX0dUX01FRElVTQorCWlmKCBoYXNSb3V0ZXIoKSApCisJeworCQlvcyA8PCBFT0xfVEFCIDw8ICJyb3V0ZXI6IiA8PCBFT0xfSU5DUl9JTkRFTlQ7CisJCWdldFJvdXRlcigpLnRvU3RyZWFtKG9zKTsKKwkJb3MgPDwgREVDUl9JTkRFTlQ7CisJfQorQVZNX0VORElGX0RFQlVHX0xFVkVMX0dUX01FRElVTQorCisJaWYoIGhhc0J1ZmZlcigpICkKKwl7CisJCW9zIDw8IEVPTF9UQUIgPDwgImJ1ZmZlcjoiOworCQlnZXRCdWZmZXJUYWJsZSgpLkFWTV9ERUJVR19SRUZfQ09VTlRFUihvcyk7CisKKwkJb3MgPDwgRU9MX0lOQ1JfSU5ERU5UOworCQlnZXRCdWZmZXJUYWJsZSgpLnRvU3RyZWFtKG9zKTsKKwkJb3MgPDwgREVDUl9JTkRFTlQ7CisJfQorCisJb3MgPDwgVEFCIDw8ICJ9IiA8PCBFT0xfRkxVU0g7Cit9CisKKwordm9pZCBSdW50aW1lRm9ybTo6dG9TdHJlYW1EYXRhKGNvbnN0IEV4ZWN1dGlvbkRhdGEgKiBhbkVELCBPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlpZiggb3MucHJlZmVyYWJseUZRTigpICkKKwl7CisJCW9zIDw8IFRBQiA8PCAicmlkIyIgPDwgZ2V0UklEKCkuZ2V0UmlkKCk7CisJCXJldHVybjsKKwl9CisKKwlvcyA8PCBUQUIgPDwgInJ1bnRpbWUiOworCWlmKCBnZXRJbnN0YW5jaWF0aW9uQ291bnQoKSAhPSAxICkKKwl7CisJCW9zIDw8ICI8IGNvdW50OiIgPDwgZ2V0SW5zdGFuY2lhdGlvbkNvdW50KCkgPDwgIiA+IjsKKwl9CisJb3MgPDwgIiBwcGlkIyIgPDwgKChnZXRSSUQoKS5nZXRQUmlkKCkgPj0gMCk/IGdldFJJRCgpLmdldFBSaWQoKSA6IDAgKQorCQkJPDwgIi5waWQjIiA8PCBnZXRSSUQoKS5nZXRSaWQoKQorCQkJPDwgIiBcIiIgPDwgZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiXCIgYXMgJiIKKwkJCTw8IGdldFJJRCgpLmdldEluc3RhbmNlKCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIiBpcyI7CisKKwlBVk1fREVCVUdfUkVGX0NPVU5URVIob3MpOworCW9zIDw8IEVPTF9GTFVTSDsKKworCWlmKCBoYXNPblNjaGVkdWxlKCkgKQorCXsKKwkJb3MgPDwgVEFCMiA8PCAiQHNjaGVkdWxleyIgPDwgSU5DUjJfSU5ERU5UOworCQlnZXRPblNjaGVkdWxlKCktPnRvU3RyZWFtUm91dGluZSggb3MgKTsKKwkJb3MgPDwgREVDUjJfSU5ERU5UX1RBQjIgPDwgIn0iIDw8IEVPTDsKKwl9CisKKwlpZiggaGFzT25EZWZlcigpICkKKwl7CisJCW9zIDw8IFRBQjIgPDwgIkBkZWZlcnsiIDw8IElOQ1IyX0lOREVOVDsKKwkJZ2V0T25EZWZlcigpLT50b1N0cmVhbVJvdXRpbmUoIG9zICk7CisJCW9zIDw8IERFQ1IyX0lOREVOVF9UQUIyIDw8ICJ9IiA8PCBFT0w7CisJfQorCisJaWYoIGhhc0RhdGEoKSApCisJeworCQlvcyA8PCBFT0xfVEFCIDw8ICJkYXRhOiI7CisJCWdldERhdGFUYWJsZSgpLT5BVk1fREVCVUdfUkVGX0NPVU5URVIob3MpOworCQlvcyA8PCBFT0w7CisKKwkJYXZtX29mZnNldF90IG9mZnNldCA9IDA7CisJCVRhYmxlT2ZEYXRhOjppdGVyYXRvciBpdCA9IGdldERhdGFUYWJsZSgpLT5iZWdpbigpOworCQlmb3IoIDsgaXQgIT0gZ2V0RGF0YVRhYmxlKCktPmVuZCgpIDsgKytpdCAsICsrb2Zmc2V0ICkKKwkJeworLy8JCQlvcyA8PCBUQUIyIDw8IGdldFZhcmlhYmxlcygpLnJhd0F0KGkpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOworCQkJb3MgPDwgVEFCMiA8PCBnZXRWYXJpYWJsZXMoKS5yYXdBdChvZmZzZXQpLT5nZXROYW1lSUQoKSA8PCBzdGQ6OmZsdXNoOworCisvL0FWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCgKKy8vCShvZmZzZXQgPT0gZ2V0VmFyaWFibGVzKCkucmF3QXQob2Zmc2V0KS0+Z2V0T2Zmc2V0KCkpICkKKy8vCQk8PCAiSW52YWxpZCB2YXJpYWJsZSBvZmZzZXQgaW4gZGF0YSB0YWJsZSFcblx0IgorLy8JCTw8IHN0cl9oZWFkZXIoIGdldFZhcmlhYmxlcygpLnJhd0F0KG9mZnNldCkgKQorLy8JCTw8IFNFTkRfRVhJVDsKKworCQkJb3MgPDwgKCAoKGFuRUQgIT0gTlVMTCkgJiYKKwkJCQkJCWFuRUQtPmlzQXNzaWduZWQoZ2V0UklEKCksIG9mZnNldCkpPyAiIDo9IiA6ICIgPSIgKTsKKworCQkJaWYoICgqaXQpLnZhbGlkKCkgKQorCQkJeworCQkJCW9zIDw8ICgqaXQpLkFWTV9ERUJVR19SRUZfQ09VTlRFUigpOworCisJCQkJZ2V0VmFyaWFibGVzKCkucmF3QXQob2Zmc2V0KS0+c3RyVmFsdWUob3MsICgqaXQpKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlvcyA8PCAiIG51bGw8IHZhbHVlID4iOworCQkJfQorCisJCQlvcyA8PCAiOyIgPDwgRU9MX0ZMVVNIOworCQl9CisJfQorCitBVk1fSUZfREVCVUdfTEVWRUxfR1RfTUVESVVNCisJaWYoIGhhc1JvdXRlcigpICkKKwl7CisJCW9zIDw8IEVPTF9UQUIgPDwgInJvdXRlcjoiIDw8IEVPTF9JTkNSX0lOREVOVDsKKwkJZ2V0Um91dGVyKCkudG9TdHJlYW0ob3MpOworCQlvcyA8PCBERUNSX0lOREVOVDsKKwl9CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfR1RfTUVESVVNCisKKwlpZiggaGFzQnVmZmVyKCkgKQorCXsKKwkJb3MgPDwgRU9MX1RBQiA8PCAiYnVmZmVyOiI7CisJCWdldEJ1ZmZlclRhYmxlKCkuQVZNX0RFQlVHX1JFRl9DT1VOVEVSKG9zKTsKKworCQlvcyA8PCBFT0xfSU5DUl9JTkRFTlQ7CisJCWdldEJ1ZmZlclRhYmxlKCkudG9TdHJlYW0ob3MpOworCQlvcyA8PCBERUNSX0lOREVOVDsKKwl9CisKKwlvcyA8PCBUQUIgPDwgIn0iIDw8IEVPTF9GTFVTSDsKK30KKworCit2b2lkIFJ1bnRpbWVGb3JtOjp0b0ZzY25EYXRhKE91dFN0cmVhbSAmIG9zLAorCQljb25zdCBFeGVjdXRpb25EYXRhICogYW5FRCwgY29uc3QgUnVudGltZUZvcm0gKiBhUHJldmlvdXNSRikgY29uc3QKK3sKKwlUYWJsZU9mSW5zdGFuY2VPZkRhdGE6OgorCWNvbnN0X3Jhd19pdGVyYXRvciBpdERhdGEgPSBnZXRFeGVjdXRhYmxlKCktPmdldEJhc2ljRGF0YSgpLmJlZ2luKCk7CisJVGFibGVPZkluc3RhbmNlT2ZEYXRhOjoKKwljb25zdF9yYXdfaXRlcmF0b3IgZW5kRGF0YSA9IGdldEV4ZWN1dGFibGUoKS0+Z2V0QmFzaWNEYXRhKCkuZW5kKCk7CisJZm9yKCBhdm1fb2Zmc2V0X3Qgb2Zmc2V0ID0gMCA7IGl0RGF0YSAhPSBlbmREYXRhIDsgKytpdERhdGEgLCArK29mZnNldCkKKwl7CisJCWNvbnN0IEJGICYgYVZhbHVlID0gKGl0RGF0YSktPmdldE1vZGlmaWVyKCkuaGFzTmF0dXJlUmVmZXJlbmNlKCkgPworCQkJCWdldERhdGEoIChpdERhdGEpLT5nZXRPZmZzZXQoKSApIDogZ2V0RGF0YSggKGl0RGF0YSkgKTsKKworCQlpZiggKGFQcmV2aW91c1JGID09IE5VTEwpCisJCQl8fCAoYVZhbHVlICE9ICggKGl0RGF0YSktPmdldE1vZGlmaWVyKCkuaGFzTmF0dXJlUmVmZXJlbmNlKCkKKwkJCQkJCQk/IGFQcmV2aW91c1JGLT5nZXREYXRhKChpdERhdGEpLT5nZXRPZmZzZXQoKSkKKwkJCQkJCQk6IGFQcmV2aW91c1JGLT5nZXREYXRhKChpdERhdGEpKSApKQorCQkJLyp8fCAoKGFuRUQgIT0gTlVMTCkgJiYgYW5FRC0+aXNBc3NpZ25lZChnZXRSSUQoKSwgaSkpKi8gKQorCQl7CisJCQlvcyA8PCBUQUIgPDwgIjpwaWQjIiA8PCBnZXRSSUQoKS5nZXRSaWQoKTw8ICI6IjsKKworLy9BVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoCisvLwkob2Zmc2V0ID09IChpdERhdGEpLT5nZXRPZmZzZXQoKSkgfHwgKG5vdCAoaXREYXRhKS0+aXNTdGFuZGFyZFBvaW50ZXIoKSkgKQorLy8JCTw8ICJJbnZhbGlkIHZhcmlhYmxlIG9mZnNldDwgIiA8PCBvZmZzZXQgPDwgIiA+IGluIGRhdGEgdGFibGUgb2YgIgorLy8JCTw8IGdldFJJRCgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIiFcblx0IgorLy8JCTw8IHN0cl9oZWFkZXIoICppdERhdGEgKSA8PCAiID0gIiA8PCBhVmFsdWUuc3RyKCkgPDwgc3RkOjplbmRsCisvLwkJPDwgU0VORF9FWElUOworCisJCQlvcyA8PCAoaXREYXRhKS0+Z2V0TmFtZUlEKCkgPDwgIiA9IjsKKworCQkJaWYoIGFWYWx1ZS52YWxpZCgpICkKKwkJCXsKKwkJCQkoaXREYXRhKS0+c3RyVmFsdWUob3MsIGFWYWx1ZSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJb3MgPDwgIiBudWxsPCB2YWx1ZSA+IjsKKwkJCX0KKworCQkJb3MgPDwgIjsiIDw8IEVPTF9GTFVTSDsKKwkJfQorCX0KK30KKworCit2b2lkIFJ1bnRpbWVGb3JtOjp0b0ZzY25CdWZmZXIoT3V0U3RyZWFtICYgb3MsCisJCWNvbnN0IEV4ZWN1dGlvbkRhdGEgKiBhbkVELCBjb25zdCBSdW50aW1lRm9ybSAqIGFQcmV2aW91c1JGKSBjb25zdAoreworCWlmKCBhUHJldmlvdXNSRiAhPSBOVUxMICkKKwl7CisJCVRhYmxlT2ZCdWZmZXJUOjoKKwkJY29uc3RfaXRlcmF0b3IgaXRQcmV2ID0gYVByZXZpb3VzUkYtPmdldEJ1ZmZlclRhYmxlKCkuYmVnaW4oKTsKKwkJVGFibGVPZkJ1ZmZlclQ6OgorCQljb25zdF9pdGVyYXRvciBpdFByZXZFbmQgPSBhUHJldmlvdXNSRi0+Z2V0QnVmZmVyVGFibGUoKS5lbmQoKTsKKwkJVGFibGVPZkJ1ZmZlclQ6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZ2V0QnVmZmVyVGFibGUoKS5iZWdpbigpOworCQlUYWJsZU9mQnVmZmVyVDo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBnZXRCdWZmZXJUYWJsZSgpLmVuZCgpOworCQlmb3IoOyAoaXQgIT0gaXRFbmQpICYmIChpdFByZXYgIT0gaXRQcmV2RW5kKSA7ICsraXQgLCArK2l0UHJldiApCisJCXsKKwkJCSgqaXQpLT50b0ZzY24ob3MsIGdldFJJRCgpLCAoKml0UHJldikpOworCQl9CisJfQorCWVsc2UKKwl7CisJCVRhYmxlT2ZCdWZmZXJUOjpjb25zdF9pdGVyYXRvciBpdCA9IGdldEJ1ZmZlclRhYmxlKCkuYmVnaW4oKTsKKwkJVGFibGVPZkJ1ZmZlclQ6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gZ2V0QnVmZmVyVGFibGUoKS5lbmQoKTsKKwkJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApCisJCXsKKwkJCSgqaXQpLT50b0ZzY24ob3MsIGdldFJJRCgpLCBOVUxMKTsKKwkJfQorCX0KK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBQQVJBTUVURVJTIFJVTlRJTUUgRk9STQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCisgKiBHRVRURVIgLSBTRVRURVIKKyAqIG1QYXJhbWV0ZXJzCisgKi8KK2NvbnN0IEJGICYgUGFyYW1ldGVyc1J1bnRpbWVGb3JtOjpzYXZlUGFyYW1ldGVyKEluc3RhbmNlT2ZEYXRhICogYW5JbnN0YW5jZSkKK3sKKwlhdm1fc2l6ZV90IG9mZnNldCA9IG1EYXRhVGFibGUtPnNpemUoKTsKKworCWFuSW5zdGFuY2UtPnNldENvbnRhaW5lciggZ2V0RXhlY3V0YWJsZSgpICk7CisJYW5JbnN0YW5jZS0+c2V0T2Zmc2V0KCBvZmZzZXQgKTsKKwljb25zdCBCRiAmIGJmSW5ic3RhbmNlID0gbVBhcmFtZXRlcnMuc2F2ZShhbkluc3RhbmNlKTsKKworCW1EYXRhVGFibGUubWFrZVdyaXRhYmxlKCk7CisJbURhdGFUYWJsZS0+cmVzaXplKCBvZmZzZXQgKyAxICk7CisKKwltRGF0YVRhYmxlLT5zZXQob2Zmc2V0LCBiZkluYnN0YW5jZSk7CisKKwlhbkluc3RhbmNlLT5zZXRSdW50aW1lQ29udGFpbmVyUklEKCBtUklEICk7CisKKwlyZXR1cm4oIGJmSW5ic3RhbmNlICk7Cit9CisKK3ZvaWQgUGFyYW1ldGVyc1J1bnRpbWVGb3JtOjphcHBlbmRQYXJhbWV0ZXIoCisJCWNvbnN0IEJGICYgYW5JbnN0YW5jZSwgY29uc3QgQkYgJiBydmFsdWUgKQoreworCWF2bV9zaXplX3Qgb2Zmc2V0ID0gbURhdGFUYWJsZS0+c2l6ZSgpOworCisvLwlhbkluc3RhbmNlLT5zZXRDb250YWluZXIoIGdldEV4ZWN1dGFibGUoKSApOworCWFuSW5zdGFuY2UudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCktPnNldE9mZnNldCggb2Zmc2V0ICk7CisJbVBhcmFtZXRlcnMuYXBwZW5kKGFuSW5zdGFuY2UpOworCisJbURhdGFUYWJsZS5tYWtlV3JpdGFibGUoKTsKKwltRGF0YVRhYmxlLT5yZXNpemUoIG9mZnNldCArIDEgKTsKKworCW1EYXRhVGFibGUtPnNldChvZmZzZXQsIHJ2YWx1ZSk7CisKKy8vCWFuSW5zdGFuY2UtPnNldFJ1bnRpbWVDb250YWluZXJSSUQoIG1SSUQgKTsKK30KKworCit2b2lkIFBhcmFtZXRlcnNSdW50aW1lRm9ybTo6YXBwZW5kUGFyYW1ldGVycyhjb25zdCBCRkxpc3QgJiBwYXJhbXNMaXN0KQoreworCWF2bV9zaXplX3Qgb2Zmc2V0ID0gbURhdGFUYWJsZS0+c2l6ZSgpOworCW1EYXRhVGFibGUubWFrZVdyaXRhYmxlKCk7CisJbURhdGFUYWJsZS0+cmVzaXplKCBvZmZzZXQgKyBwYXJhbXNMaXN0LnNpemUoKSApOworCisJQkZMaXN0Ojpjb25zdF9pdGVyYXRvciBpdFBhcmFtID0gcGFyYW1zTGlzdC5iZWdpbigpOworCUJGTGlzdDo6Y29uc3RfaXRlcmF0b3IgZW5kUGFyYW0gPSBwYXJhbXNMaXN0LmVuZCgpOworCWZvciggSW5zdGFuY2VPZkRhdGEgKiBwUGFyYW07IGl0UGFyYW0gIT0gZW5kUGFyYW0gOyArK2l0UGFyYW0gLCArK29mZnNldCApCisJeworCQlwUGFyYW0gPSAoKml0UGFyYW0pLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpOworCisJCXBQYXJhbS0+c2V0Q29udGFpbmVyKCBnZXRFeGVjdXRhYmxlKCkgKTsKKwkJbVBhcmFtZXRlcnMuYXBwZW5kKCAqaXRQYXJhbSApOworCisJCXBQYXJhbS0+c2V0T2Zmc2V0KCBvZmZzZXQgKTsKKwkJbURhdGFUYWJsZS0+c2V0KG9mZnNldCwgKml0UGFyYW0pOworCisJCXBQYXJhbS0+c2V0UnVudGltZUNvbnRhaW5lclJJRCggbVJJRCApOworCX0KK30KKworCit2b2lkIFBhcmFtZXRlcnNSdW50aW1lRm9ybTo6YXBwZW5kUGFyYW1ldGVycyhjb25zdCBCRlZlY3RvciAmIHBhcmFtc1ZlY3RvcikKK3sKKwlhdm1fc2l6ZV90IG9mZnNldCA9IG1EYXRhVGFibGUtPnNpemUoKTsKKwltRGF0YVRhYmxlLm1ha2VXcml0YWJsZSgpOworCW1EYXRhVGFibGUtPnJlc2l6ZSggb2Zmc2V0ICsgcGFyYW1zVmVjdG9yLnNpemUoKSApOworCisJQkZWZWN0b3I6OmNvbnN0X3Jhd19pdGVyYXRvcjwgSW5zdGFuY2VPZkRhdGEgPiBpdFBhcmFtID0gcGFyYW1zVmVjdG9yLmJlZ2luKCk7CisJQkZWZWN0b3I6OmNvbnN0X3Jhd19pdGVyYXRvcjwgSW5zdGFuY2VPZkRhdGEgPiBlbmRQYXJhbSA9IHBhcmFtc1ZlY3Rvci5lbmQoKTsKKwlmb3IoIDsgaXRQYXJhbSAhPSBlbmRQYXJhbSA7ICsraXRQYXJhbSAsICsrb2Zmc2V0ICkKKwl7CisJCShpdFBhcmFtKS0+c2V0Q29udGFpbmVyKCBnZXRFeGVjdXRhYmxlKCkgKTsKKwkJbVBhcmFtZXRlcnMuYXBwZW5kKCAqaXRQYXJhbSApOworCisJCShpdFBhcmFtKS0+c2V0T2Zmc2V0KCBvZmZzZXQgKTsKKwkJbURhdGFUYWJsZS0+c2V0KG9mZnNldCwgKml0UGFyYW0pOworCisJCShpdFBhcmFtKS0+c2V0UnVudGltZUNvbnRhaW5lclJJRCggbVJJRCApOworCX0KK30KKworCisvKioKKyAqIFJVTlRJTUUgVVBEQVRFCisgKi8KK3ZvaWQgUGFyYW1ldGVyc1J1bnRpbWVGb3JtOjp1cGRhdGUoY29uc3QgQkYgJiBwYXJhbUV4cHIpCit7CisJQkZWZWN0b3IgdGFibGVPZlBhcmFtczsKKwlFeHByZXNzaW9uRmFjdG9yeTo6Y29sbGVjdFZhcmlhYmxlKHBhcmFtRXhwciwgdGFibGVPZlBhcmFtcyk7CisKKwlhdm1fc2l6ZV90IGVuZFRoaXNQYXJhbSA9IG1QYXJhbWV0ZXJzLnNpemUoKTsKKwlhdm1fc2l6ZV90IGVuZFBhcmFtID0gdGFibGVPZlBhcmFtcy5zaXplKCk7CisJYXZtX3NpemVfdCBvZmZzZXQgPSAwOworCWZvciggSW5zdGFuY2VPZkRhdGEgKiBwUGFyYW0gOyBvZmZzZXQgPCBlbmRQYXJhbSA7ICsrb2Zmc2V0ICkKKwl7CisJCXBQYXJhbSA9IHRhYmxlT2ZQYXJhbXNbb2Zmc2V0XS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKTsKKworCQlpZiggcFBhcmFtLT5nZXRPZmZzZXQoKSA+PSBlbmRUaGlzUGFyYW0gKQorCQl7CisJCQltUGFyYW1ldGVycy5hcHBlbmQoIHRhYmxlT2ZQYXJhbXNbb2Zmc2V0XSApOworCQl9CisJCWVsc2UgaWYoIG1QYXJhbWV0ZXJzW3BQYXJhbS0+Z2V0T2Zmc2V0KCldICE9IHBQYXJhbSApCisJCXsKKwkJCWlmKCBtUGFyYW1ldGVycy5jb250YWlucyggdGFibGVPZlBhcmFtc1tvZmZzZXRdICkgKQorCQkJeworQVZNX0lGX0RFQlVHX0ZMQUcoIENPTVBVVElORyApCisKKwlBVk1fT1NfV0FSTklOR19BTEVSVAorCQkJPDwgIlVuZXhwZWN0ZWQgcGFyYW1ldGVyIDw8ICIKKwkJCTw8IHN0cl9oZWFkZXIoIHRhYmxlT2ZQYXJhbXNbb2Zmc2V0XSApIDw8ICIgPj4gaW4gPDxcbiIKKwkJCTw8IHN0cl9oZWFkZXIoIG1QYXJhbWV0ZXJzICkgPDwgIiA+PiAhISEiCisJCQk8PCBTRU5EX0FMRVJUOworCitBVk1fRU5ESUZfREVCVUdfRkxBRyggQ09NUFVUSU5HICkKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQltUGFyYW1ldGVycy5hcHBlbmQoIHRhYmxlT2ZQYXJhbXNbb2Zmc2V0XSApOworCQkJfQorCQl9CisJfQorCisJZW5kUGFyYW0gPSBtUGFyYW1ldGVycy5zaXplKCk7CisJaWYoIGVuZFRoaXNQYXJhbSA8IGVuZFBhcmFtICkKKwl7CisJCW1EYXRhVGFibGUubWFrZVdyaXRhYmxlKCk7CisJCW1EYXRhVGFibGUtPnJlc2l6ZSggZW5kUGFyYW0gKTsKKworCQlmb3IoIG9mZnNldCA9IGVuZFRoaXNQYXJhbSA7IG9mZnNldCA8IGVuZFBhcmFtIDsgKytvZmZzZXQgKQorCQl7CisJCQltRGF0YVRhYmxlLT5zZXQob2Zmc2V0LCBtUGFyYW1ldGVyc1tvZmZzZXRdKTsKKwkJfQorCX0KK30KKworCisvKioKKyAqIFNlcmlhbGl6YXRpb24KKyAqLwordm9pZCBQYXJhbWV0ZXJzUnVudGltZUZvcm06OnRvU3RyZWFtKAorCQljb25zdCBFeGVjdXRpb25EYXRhICogYW5FRCwgT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJaWYoIG9zLnByZWZlcmFibHlGUU4oKSApCisJeworCQlvcyA8PCBUQUIgPDwgZ2V0UklEKCkuc3RyKCk7CisJCXJldHVybjsKKwl9CisKKwlvcyA8PCBUQUIgPDwgInJ1bnRpbWUiIDw8ICIgcHBpZCMiCisJCQk8PCAoKGdldFJJRCgpLmdldFBSaWQoKSA+PSAwKT8gZ2V0UklEKCkuZ2V0UFJpZCgpIDogMCApCisJCQk8PCAiLnBpZCMiIDw8IGdldFJJRCgpLmdldFJpZCgpIDw8ICIgIiA8PCBnZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQk8PCAiIGFzICYiIDw8IGdldFJJRCgpLmdldEluc3RhbmNlKCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIiB7IjsKKworCUFWTV9ERUJVR19SRUZfQ09VTlRFUihvcyk7CisJb3MgPDwgRU9MX0ZMVVNIOworCisvLwlvcyA8PCBJTkNSX0lOREVOVDsKKy8vCWdldFJJRCgpLnRvU3RyZWFtKG9zKTsKKy8vCW9zIDw8IERFQ1JfSU5ERU5UOworCitBVk1fSUZfREVCVUdfRU5BQkxFRF9BTkQoIGhhc0NoaWxkKCkgKQorCisJb3MgPDwgaW5jcl9zdHJlYW0oIGdldENoaWxkVGFibGUoKSApOworCitBVk1fRU5ESUZfREVCVUdfRU5BQkxFRF9BTkQKKworCWlmKCBoYXNPblNjaGVkdWxlKCkgKQorCXsKKwkJb3MgPDwgVEFCMiA8PCAiQHNjaGVkdWxleyIgPDwgSU5DUjJfSU5ERU5UOworCQlnZXRPblNjaGVkdWxlKCktPnRvU3RyZWFtUm91dGluZSggb3MgKTsKKwkJb3MgPDwgREVDUjJfSU5ERU5UX1RBQjIgPDwgIn0iOworCX0KKworCWlmKCBoYXNPbkRlZmVyKCkgKQorCXsKKwkJb3MgPDwgVEFCMiA8PCAiQGRlZmVyeyIgPDwgSU5DUjJfSU5ERU5UOworCQlnZXRPbkRlZmVyKCktPnRvU3RyZWFtUm91dGluZSggb3MgKTsKKwkJb3MgPDwgREVDUjJfSU5ERU5UX1RBQjIgPDwgIn0iOworCX0KKworCS8vIHRoZSBJbnB1dCBFbmFibGVkIEZsYWcKKwkvLyBNT0MgQXR0cmlidXRlIGZvciBDb21tdW5pY2F0aW9uCisJaWYoIGlzSW5wdXRFbmFibGVkKCkgKQorCXsKKwkJb3MgPDwgVEFCMiA8PCAiaW5wdXRfZW5hYmxlZCA9IHRydWU7IiA8PCBFT0xfRkxVU0g7CisJfQorCisJaWYoIG5vdCBpc0Vudmlyb25tZW50RW5hYmxlZENvbW11bmljYXRpb24oKSApCisJeworCQlvcyA8PCBUQUIyIDw8ICJlbnZpcm9ubWVudF9lbmFibGVkID0gZmFsc2U7IiA8PCBFT0xfRkxVU0g7CisJfQorCisKK0FWTV9JRl9ERUJVR19GTEFHKCBEQVRBICkKKwlpZiggaGFzUGFyYW1ldGVyKCkgKQorCXsKKwkJcmVzZXRPZmZzZXQoKTsKKworCQlvcyA8PCBUQUIgPDwgInBhcmFtczoiIDw8IEVPTF9JTkNSX0lOREVOVDsKKworLy8JCWdldFBhcmFtZXRlcnMoKS5zdHJIZWFkZXIob3MpOworCQlnZXRQYXJhbWV0ZXJzKCkudG9TdHJlYW0ob3MpOworCisJCW9zIDw8IERFQ1JfSU5ERU5UOworCX0KKworCWlmKCBoYXNEYXRhKCkgKQorCXsKKwkJb3MgPDwgVEFCIDw8ICJkYXRhOiI7CisJCWdldERhdGFUYWJsZSgpLT5BVk1fREVCVUdfUkVGX0NPVU5URVIob3MpOworCQlvcyA8PCBFT0w7CisKKwkJVGFibGVPZkluc3RhbmNlT2ZEYXRhOjpjb25zdF9yYXdfaXRlcmF0b3IgaXRQYXJhbSA9IGdldFBhcmFtZXRlcnMoKS5iZWdpbigpOworCQlUYWJsZU9mRGF0YTo6Y29uc3RfaXRlcmF0b3IgaXRWYWx1ZSA9IGdldERhdGFUYWJsZSgpLT5iZWdpbigpOworCQlUYWJsZU9mRGF0YTo6Y29uc3RfaXRlcmF0b3IgZW5kVmFsdWUgPSBnZXREYXRhVGFibGUoKS0+ZW5kKCk7CisJCWF2bV9vZmZzZXRfdCBvZmZzZXQgPSAwOworCQlmb3IoIDsgaXRWYWx1ZSAhPSBlbmRWYWx1ZSA7ICsraXRWYWx1ZSAsICsrb2Zmc2V0ICwgKytpdFBhcmFtICkKKwkJeworLy9BVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoIG9mZnNldCA9PSAoaXRQYXJhbSktPmdldE9mZnNldCgpICkKKy8vCQk8PCAiSW52YWxpZCBwYXJhbWV0ZXIgb2Zmc2V0IGluIHBhcmFtZXRlcnMgZGF0YSB0YWJsZSAhXG5cdCIKKy8vCQk8PCBzdHJfaGVhZGVyKCAqaXRQYXJhbSApCisvLwkJPDwgU0VORF9FWElUOworCisJCQkvL2lmKCAoKml0VmFsdWUpICE9IChpdFBhcmFtKSApCisJCQl7CisJCQkJb3MgPDwgVEFCMiA8PCAiLy8qQHBhcmFtPCIgPDwgb2Zmc2V0IDw8ICI+Ki8gIgorCQkJCQkJPDwgKGl0UGFyYW0pLT5nZXROYW1lSUQoKSA8PCAiID0iOworCisJCQkJaWYoICgqaXRWYWx1ZSkudmFsaWQoKSApCisJCQkJeworCQkJCQlvcyA8PCAoKml0VmFsdWUpLkFWTV9ERUJVR19SRUZfQ09VTlRFUigpOworCQkJCQkoaXRQYXJhbSktPnN0clZhbHVlKG9zLCAoKml0VmFsdWUpKTsKKwkJCQkJLy8JCQkJCW9zIDw8IHN0cl9pbmRlbnQoICppdFZhbHVlICk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCW9zIDw8ICIgbnVsbDwgdmFsdWUgPiI7CisJCQkJfQorCisJCQkJb3MgPDwgRU9MX0ZMVVNIOworCQkJfQorCQl9CisJfQorQVZNX0VORElGX0RFQlVHX0ZMQUcoIERBVEEgKQorCitBVk1fSUZfREVCVUdfTEVWRUxfR1RfTUVESVVNCisJaWYoIGhhc1JvdXRlcigpICkKKwl7CisJCW9zIDw8IEVPTF9UQUIgPDwgInJvdXRlcjoiIDw8IEVPTF9JTkNSX0lOREVOVDsKKwkJZ2V0Um91dGVyKCkudG9TdHJlYW0ob3MpOworCQlvcyA8PCBERUNSX0lOREVOVDsKKwl9CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfR1RfTUVESVVNCisKKwlpZiggaGFzQnVmZmVyKCkgKQorCXsKKwkJb3MgPDwgRU9MX1RBQiA8PCAiYnVmZmVyOiI7CisJCWdldEJ1ZmZlclRhYmxlKCkuQVZNX0RFQlVHX1JFRl9DT1VOVEVSKG9zKTsKKworCQlvcyA8PCBFT0xfSU5DUl9JTkRFTlQ7CisJCWdldEJ1ZmZlclRhYmxlKCkudG9TdHJlYW0ob3MpOworCQlvcyA8PCBERUNSX0lOREVOVDsKKwl9CisKKwlvcyA8PCBUQUIgPDwgIn0iIDw8IEVPTF9GTFVTSDsKK30KKworCit2b2lkIFBhcmFtZXRlcnNSdW50aW1lRm9ybTo6dG9TdHJlYW1EYXRhKAorCQljb25zdCBFeGVjdXRpb25EYXRhICogYW5FRCwgT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJaWYoIG9zLnByZWZlcmFibHlGUU4oKSApCisJeworCQlvcyA8PCBUQUIgPDwgInJpZCMiIDw8IGdldFJJRCgpLmdldFJpZCgpOworCQlyZXR1cm47CisJfQorCisJb3MgPDwgVEFCIDw8ICJydW50aW1lIiA8PCAiIHBwaWQjIgorCQkJPDwgKChnZXRSSUQoKS5nZXRQUmlkKCkgPj0gMCk/IGdldFJJRCgpLmdldFBSaWQoKSA6IDAgKQorCQkJPDwgIi5waWQjIiA8PCBnZXRSSUQoKS5nZXRSaWQoKSA8PCAiIFwiIiA8PCBnZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQk8PCAiXCIgYXMgJiIgPDwgZ2V0UklEKCkuZ2V0SW5zdGFuY2UoKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiIHsiOworCisJQVZNX0RFQlVHX1JFRl9DT1VOVEVSKG9zKTsKKwlvcyA8PCBFT0xfRkxVU0g7CisKKwlpZiggaGFzT25TY2hlZHVsZSgpICkKKwl7CisJCW9zIDw8IFRBQjIgPDwgIkBzY2hlZHVsZXsiIDw8IElOQ1IyX0lOREVOVDsKKwkJZ2V0T25TY2hlZHVsZSgpLT50b1N0cmVhbVJvdXRpbmUoIG9zICk7CisJCW9zIDw8IERFQ1IyX0lOREVOVF9UQUIyIDw8ICJ9IjsKKwl9CisKKwlpZiggaGFzT25EZWZlcigpICkKKwl7CisJCW9zIDw8IFRBQjIgPDwgIkBkZWZlcnsiIDw8IElOQ1IyX0lOREVOVDsKKwkJZ2V0T25EZWZlcigpLT50b1N0cmVhbVJvdXRpbmUoIG9zICk7CisJCW9zIDw8IERFQ1IyX0lOREVOVF9UQUIyIDw8ICJ9IjsKKwl9CisKKwlpZiggaGFzRGF0YSgpICkKKwl7CisJCXJlc2V0T2Zmc2V0KCk7CisKKwkJb3MgPDwgVEFCIDw8ICJkYXRhOiI7CisJCWdldERhdGFUYWJsZSgpLT5BVk1fREVCVUdfUkVGX0NPVU5URVIob3MpOworCQlvcyA8PCBFT0w7CisKKwkJVGFibGVPZkluc3RhbmNlT2ZEYXRhOjpjb25zdF9yYXdfaXRlcmF0b3IgaXRQYXJhbSA9IGdldFBhcmFtZXRlcnMoKS5iZWdpbigpOworCQlUYWJsZU9mRGF0YTo6Y29uc3RfaXRlcmF0b3IgaXRWYWx1ZSA9IGdldERhdGFUYWJsZSgpLT5iZWdpbigpOworCQlUYWJsZU9mRGF0YTo6Y29uc3RfaXRlcmF0b3IgZW5kVmFsdWUgPSBnZXREYXRhVGFibGUoKS0+ZW5kKCk7CisJCWF2bV9vZmZzZXRfdCBvZmZzZXQgPSAwOworCQlmb3IoIDsgaXRWYWx1ZSAhPSBlbmRWYWx1ZSA7ICsraXRWYWx1ZSAsICsrb2Zmc2V0ICwgKytpdFBhcmFtICkKKwkJeworLy9BVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoIG9mZnNldCA9PSAoaXRQYXJhbSktPmdldE9mZnNldCgpICkKKy8vCQk8PCAiSW52YWxpZCBwYXJhbWV0ZXIgb2Zmc2V0IGluIHBhcmFtZXRlcnMgZGF0YSB0YWJsZSAhXG5cdCIKKy8vCQk8PCBzdHJfaGVhZGVyKCAqaXRQYXJhbSApCisvLwkJPDwgU0VORF9FWElUOworCisvLwkJCWlmKCAoKml0VmFsdWUpICE9IChpdFBhcmFtKSApCisJCQl7CisJCQkJb3MgPDwgVEFCMiA8PCAiLy8qQHBhcmFtPCIgPDwgb2Zmc2V0IDw8ICI+Ki8gIgorCQkJCQkJPDwgKGl0UGFyYW0pLT5nZXROYW1lSUQoKSA8PCAiID0iOworCisJCQkJaWYoICgqaXRWYWx1ZSkudmFsaWQoKSApCisJCQkJeworCQkJCQlvcyA8PCAoKml0VmFsdWUpLkFWTV9ERUJVR19SRUZfQ09VTlRFUigpOworCQkJCQkoaXRQYXJhbSktPnN0clZhbHVlKG9zLCAoKml0VmFsdWUpKTsKKy8vCQkJCQlvcyA8PCBzdHJfaW5kZW50KCAqaXRWYWx1ZSApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlvcyA8PCAiIG51bGw8IHZhbHVlID4iOworCQkJCX0KKworCQkJCW9zIDw8IEVPTF9GTFVTSDsKKwkJCX0KKwkJfQorCX0KKworCWlmKCBoYXNCdWZmZXIoKSApCisJeworCQlvcyA8PCBFT0xfVEFCIDw8ICJidWZmZXI6IjsKKwkJZ2V0QnVmZmVyVGFibGUoKS5BVk1fREVCVUdfUkVGX0NPVU5URVIob3MpOworCisJCW9zIDw8IEVPTF9JTkNSX0lOREVOVDsKKwkJZ2V0QnVmZmVyVGFibGUoKS50b1N0cmVhbShvcyk7CisJCW9zIDw8IERFQ1JfSU5ERU5UOworCX0KKworCW9zIDw8IFRBQiA8PCAifSIgPDwgRU9MX0ZMVVNIOworfQorCisKK3ZvaWQgUGFyYW1ldGVyc1J1bnRpbWVGb3JtOjp0b0ZzY25EYXRhKE91dFN0cmVhbSAmIG9zLAorCQljb25zdCBFeGVjdXRpb25EYXRhICogYW5FRCwgY29uc3QgUnVudGltZUZvcm0gKiBhUHJldmlvdXNSRikgY29uc3QKK3sKK0FWTV9JRl9ERUJVR19GTEFHKCBEQVRBICkKKworCXJlc2V0T2Zmc2V0KCk7CisKKwlUYWJsZU9mSW5zdGFuY2VPZkRhdGE6OmNvbnN0X3Jhd19pdGVyYXRvciBpdERhdGEgPSBnZXRQYXJhbWV0ZXJzKCkuYmVnaW4oKTsKKwlUYWJsZU9mSW5zdGFuY2VPZkRhdGE6OmNvbnN0X3Jhd19pdGVyYXRvciBlbmREYXRhID0gZ2V0UGFyYW1ldGVycygpLmVuZCgpOworCisvLwlmb3IoIDsgaXREYXRhICE9IGVuZERhdGEgOyArK2l0RGF0YSApCisvLwl7CisvLwkJb3MgPDwgVEFCIDw8IHN0cl9oZWFkZXIoICppdERhdGEgKSA8PCAiOyIgPDwgRU9MOworLy8JfQorLy8JaXREYXRhID0gZ2V0UGFyYW1ldGVycygpLmJlZ2luKCk7CisKKwlhdm1fc2l6ZV90IHByZXZpb3VzUGFyYW1zU2l6ZSA9IChhUHJldmlvdXNSRiA9PSBOVUxMKSA/IDAgOgorCQkJYVByZXZpb3VzUkYtPmdldERhdGFUYWJsZSgpLT5zaXplKCk7CisJZm9yKCBhdm1fb2Zmc2V0X3Qgb2Zmc2V0ID0gMCA7IGl0RGF0YSAhPSBlbmREYXRhIDsgKytpdERhdGEgLCArK29mZnNldCkKKwl7CisJCWNvbnN0IEJGICYgYVZhbHVlID0gZ2V0RGF0YSggKGl0RGF0YSkgKTsKKworCQlpZiggKGFQcmV2aW91c1JGID09IE5VTEwpIHx8IChvZmZzZXQgPj0gcHJldmlvdXNQYXJhbXNTaXplKSB8fAorCQkJKGFWYWx1ZSAhPSBhUHJldmlvdXNSRi0+Z2V0RGF0YSggKGl0RGF0YSkgKSkgLyp8fAorCQkJKChhbkVEICE9IE5VTEwpICYmIGFuRUQtPmlzQXNzaWduZWQoZ2V0UklEKCksIGkpKSovICkKKwkJeworLy9BVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoIG9mZnNldCA9PSAoaXREYXRhKS0+Z2V0T2Zmc2V0KCkgKQorLy8JCTw8ICJJbnZhbGlkIHBhcmFtZXRlciBvZmZzZXQgaW4gcGFyYW1ldGVycyBkYXRhIHRhYmxlICFcblx0IgorLy8JCTw8IHN0cl9oZWFkZXIoICppdERhdGEgKQorLy8JCTw8IFNFTkRfRVhJVDsKKworCQkJb3MgPDwgVEFCIDw8ICIvLypAcGFyYW08IiA8PCBvZmZzZXQgPDwgIj4qLyAiOworCisvLwkJCW9zIDw8ICI6cGlkIyIgPDwgZ2V0UklEKCkuZ2V0UmlkKCk8PCAiOiIgPDwgKGl0RGF0YSktPmdldE5hbWVJRCgpOworCQkJb3MgPDwgKGl0RGF0YSktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIiA9IjsKKworCQkJaWYoIGFWYWx1ZS52YWxpZCgpICkKKwkJCXsKKwkJCQkoaXREYXRhKS0+c3RyVmFsdWUob3MsIGFWYWx1ZSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJb3MgPDwgIiBudWxsPCB2YWx1ZSA+IjsKKwkJCX0KKworCQkJb3MgPDwgIjsiIDw8IEVPTF9GTFVTSDsKKwkJfQorCX0KKworQVZNX0VORElGX0RFQlVHX0ZMQUcoIERBVEEgKQorfQorCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL1J1bnRpbWVGb3JtLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvcnVudGltZS9SdW50aW1lRm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNGUzZWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvcnVudGltZS9SdW50aW1lRm9ybS5oCkBAIC0wLDAgKzEsODIxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFJVTlRJTUVGT1JNX0hfCisjZGVmaW5lIFJVTlRJTUVGT1JNX0hfCisKKyNpbmNsdWRlIDxiYXNlL1NtYXJ0VGFibGUuaD4KKworI2luY2x1ZGUgPGNvbW1vbi9Bdm1Qb2ludGVyLmg+CisjaW5jbHVkZSA8Y29tbW9uL0VsZW1lbnQuaD4KKyNpbmNsdWRlIDxjb21tb24vQkYuaD4KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vVHlwZWRlZi5oPgorCisjaW5jbHVkZSA8Zm1sL2J1ZmZlci9CYXNlQnVmZmVyRm9ybS5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZUZvcm0uaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9Sb3V0ZXIuaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mQnVmZmVyLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZkRhdGEuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL1J1bnRpbWVJRC5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL1RhYmxlT2ZEYXRhLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIEV4ZWN1dGFibGVGb3JtOworY2xhc3MgRXhlY3V0aW9uRGF0YTsKK2NsYXNzIEluc3RhbmNlT2ZEYXRhOworY2xhc3MgSW5zdGFuY2VPZk1hY2hpbmU7CisKKy8qKgorICogVFlQRURFRgorICovCit0eXBlZGVmIFNtYXJ0VGFibGU8IEJhc2VCdWZmZXJGb3JtICwgRGVzdHJveUVsZW1lbnRQb2xpY3kgPiBUYWJsZU9mQnVmZmVyVDsKKworCitjbGFzcyBSdW50aW1lRm9ybSAgOiAgcHVibGljIEVsZW1lbnQgLAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIFJ1bnRpbWVGb3JtICkKK3sKKworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBSdW50aW1lRm9ybSApCisKKworcHJvdGVjdGVkOgorCS8qCisJICogQVRUUklCVVRFUworCSAqLworCWF2bV9zaXplX3QgbUluc3RhbmNpYXRpb25Db3VudDsKKworCVJ1bnRpbWVJRCBtUklEOworCisJQVBUYWJsZU9mUnVudGltZUlEIG1DaGlsZFRhYmxlOworCisJQVBUYWJsZU9mRGF0YSBtRGF0YVRhYmxlOworCisJVGFibGVPZkJ1ZmZlclQgbUJ1ZmZlclRhYmxlOworCVJvdXRlciBtUm91dGVyOworCisJQkZDb2RlIG1PblNjaGVkdWxlOworCisJQkZDb2RlIG1PbkRlZmVyOworCisJLy8gTU9DIEF0dHJpYnV0ZSBmb3IgQ29tbXVuaWNhdGlvbgorCWJvb2wgbUVudmlyb25tZW50RW5hYmxlZENvbW11bmljYXRpb25GbGFnOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlSdW50aW1lRm9ybShjb25zdCBSdW50aW1lSUQgJiBhUklEKQorCTogRWxlbWVudCggQ0xBU1NfS0lORF9UKCBSdW50aW1lRm9ybSApICksCisKKwltSW5zdGFuY2lhdGlvbkNvdW50KCBhUklELmdldEluc3RhbmNlKCktPmdldEluc3RhbmNpYXRpb25Db3VudCgpICksCisKKwltUklEKCBhUklEICksCisKKwltQ2hpbGRUYWJsZSggKSwKKworCW1EYXRhVGFibGUoICksCisKKwltQnVmZmVyVGFibGUoICksCisJbVJvdXRlciggKSwKKworCW1PblNjaGVkdWxlKCApLAorCW1PbkRlZmVyKCApLAorCisJbUVudmlyb25tZW50RW5hYmxlZENvbW11bmljYXRpb25GbGFnKCB0cnVlICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJUnVudGltZUZvcm0oY2xhc3Nfa2luZF90IGFDbGFzc0tpbmQsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQpCisJOiBFbGVtZW50KCBhQ2xhc3NLaW5kICksCisKKwltSW5zdGFuY2lhdGlvbkNvdW50KCBhUklELmdldEluc3RhbmNlKCktPmdldEluc3RhbmNpYXRpb25Db3VudCgpICksCisKKwltUklEKCBhUklEICksCisKKwltQ2hpbGRUYWJsZSggKSwKKworCW1EYXRhVGFibGUoICksCisKKwltQnVmZmVyVGFibGUoICksCisJbVJvdXRlciggKSwKKworCW1PblNjaGVkdWxlKCApLAorCW1PbkRlZmVyKCApLAorCisJbUVudmlyb25tZW50RW5hYmxlZENvbW11bmljYXRpb25GbGFnKCB0cnVlICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCVJ1bnRpbWVGb3JtKGNvbnN0IFJ1bnRpbWVGb3JtICYgYVJ1bnRpbWUpCisJOiBFbGVtZW50KCBhUnVudGltZSApLAorCisJbUluc3RhbmNpYXRpb25Db3VudCggYVJ1bnRpbWUubUluc3RhbmNpYXRpb25Db3VudCApLAorCisJbVJJRCggYVJ1bnRpbWUubVJJRCApLAorCisJbUNoaWxkVGFibGUoIGFSdW50aW1lLm1DaGlsZFRhYmxlICksCisKKwltRGF0YVRhYmxlKCBhUnVudGltZS5tRGF0YVRhYmxlICksCisKKwltQnVmZmVyVGFibGUoIGFSdW50aW1lLm1CdWZmZXJUYWJsZSApLAorCW1Sb3V0ZXIoIGFSdW50aW1lLm1Sb3V0ZXIgKSwKKworCW1PblNjaGVkdWxlKCBhUnVudGltZS5tT25TY2hlZHVsZSApLAorCW1PbkRlZmVyKCBhUnVudGltZS5tT25EZWZlciApLAorCisJbUVudmlyb25tZW50RW5hYmxlZENvbW11bmljYXRpb25GbGFnKCB0cnVlICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgflJ1bnRpbWVGb3JtKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVJJRAorCSAqLworCWlubGluZSBjb25zdCBSdW50aW1lSUQgJiBnZXRSSUQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUklEICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzUGFyZW50UklEKCkgY29uc3QKKwl7CisJCXJldHVybiggbVJJRC5oYXNQUklEKCkgKTsKKwl9CisKKwlpbmxpbmUgUnVudGltZUlEIGdldFBhcmVudFJJRCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1SSUQuZ2V0UFJJRCgpICk7CisJfQorCisKKwlpbmxpbmUgaW50IGdldFJpZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1SSUQuZ2V0UmlkKCkgKTsKKwl9CisKKworCWlubGluZSBpbnQgZ2V0T2Zmc2V0KCkgY29uc3QKKwl7CisJCXJldHVybiggbVJJRC5nZXRPZmZzZXQoKSApOworCX0KKworCisJaW5saW5lIEluc3RhbmNlT2ZNYWNoaW5lICogZ2V0SW5zdGFuY2UoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUklELmdldEluc3RhbmNlKCkgKTsKKwl9CisKKwlpbmxpbmUgRXhlY3V0YWJsZUZvcm0gKiBnZXRFeGVjdXRhYmxlKCkgY29uc3QKKwl7CisJCXJldHVybiggbVJJRC5nZXRFeGVjdXRhYmxlKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNFeGVjdXRhYmxlKCkgY29uc3QKKwl7CisJCXJldHVybiggbVJJRC5oYXNFeGVjdXRhYmxlKCkgKTsKKwl9CisKKworCWlubGluZSBzdGQ6OnN0cmluZyBnZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1SSUQuZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSApOworCX0KKworCWlubGluZSBzdGQ6OnN0cmluZyBnZXROYW1lSUQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUklELmdldE5hbWVJRCgpICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtSW5zdGFuY2lhdGlvbkNvdW50CisJICovCisJaW5saW5lIGF2bV9zaXplX3QgZ2V0SW5zdGFuY2lhdGlvbkNvdW50KCkgY29uc3QKKwl7CisJCXJldHVybiggbUluc3RhbmNpYXRpb25Db3VudCApOworCX0KKworCWlubGluZSBhdm1fc2l6ZV90IGRlY3JJbnN0YW5jaWF0aW9uQ291bnQoKQorCXsKKwkJcmV0dXJuKCAtLW1JbnN0YW5jaWF0aW9uQ291bnQgKTsKKwl9CisKKwlpbmxpbmUgYXZtX3NpemVfdCBpbmNySW5zdGFuY2lhdGlvbkNvdW50KCkKKwl7CisJCXJldHVybiggKyttSW5zdGFuY2lhdGlvbkNvdW50ICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBpc0luc3RhbmNpYXRlZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1JbnN0YW5jaWF0aW9uQ291bnQgPiAwICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNub3RJbnN0YW5jaWF0ZWQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtSW5zdGFuY2lhdGlvbkNvdW50ID09IDAgKTsKKwl9CisKKworCWlubGluZSB2b2lkIHNldEluc3RhbmNpYXRpb25Db3VudChhdm1fc2l6ZV90IGFuSW5zdGFuY2lhdGlvbk51bWJlcikKKwl7CisJCW1JbnN0YW5jaWF0aW9uQ291bnQgPSBhbkluc3RhbmNpYXRpb25OdW1iZXI7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtQ2hpbGRUYWJsZQorCSAqLworCWlubGluZSBjb25zdCBBUFRhYmxlT2ZSdW50aW1lSUQgJiBnZXRDaGlsZFRhYmxlKCkgY29uc3QKKwl7CisJCXJldHVybiggbUNoaWxkVGFibGUgKTsKKwl9CisKKworCVRhYmxlT2ZSdW50aW1lSUQ6Oml0ZXJhdG9yIGJlZ2luQ2hpbGQoKQorCXsKKwkJLy8gZG9uJ3QgZm9yZ2V0IHRoZSBpbnN0YW5jZSBUSElTIGF0IG9mZnNldCAwICEhIQorCQlyZXR1cm4oIGhhc0luc3RhbmNlVGhpcygpID8KKwkJCQkrKyhtQ2hpbGRUYWJsZS0+YmVnaW4oKSkgOiBtQ2hpbGRUYWJsZS0+YmVnaW4oKSApOworCX0KKworCVRhYmxlT2ZSdW50aW1lSUQ6OmNvbnN0X2l0ZXJhdG9yIGJlZ2luQ2hpbGQoKSBjb25zdAorCXsKKwkJLy8gZG9uJ3QgZm9yZ2V0IHRoZSBpbnN0YW5jZSBUSElTIGF0IG9mZnNldCAwICEhIQorCQlyZXR1cm4oIGhhc0luc3RhbmNlVGhpcygpID8KKwkJCQkrKyhtQ2hpbGRUYWJsZS0+YmVnaW4oKSkgOiBtQ2hpbGRUYWJsZS0+YmVnaW4oKSApOworCX0KKworCVRhYmxlT2ZSdW50aW1lSUQ6Oml0ZXJhdG9yIGVuZENoaWxkKCkKKwl7CisJCXJldHVybiggbUNoaWxkVGFibGUtPmVuZCgpICk7CisJfQorCisJVGFibGVPZlJ1bnRpbWVJRDo6Y29uc3RfaXRlcmF0b3IgZW5kQ2hpbGQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQ2hpbGRUYWJsZS0+ZW5kKCkgKTsKKwl9CisKKworCWlubGluZSBib29sIGhhc0luc3RhbmNlVGhpcygpIGNvbnN0CisJeworCQlyZXR1cm4oIG1DaGlsZFRhYmxlLT5ub25lbXB0eSgpICYmIChtQ2hpbGRUYWJsZS0+Zmlyc3QoKSA9PSBtUklEKSApOworCX0KKworCWlubGluZSBib29sIGhhc0NoaWxkKCkgY29uc3QKKwl7CisJCXJldHVybiggbUNoaWxkVGFibGUudmFsaWQoKSAmJiAobUNoaWxkVGFibGUtPnBvcHVsYXRlZCgpIHx8CisJCQkobUNoaWxkVGFibGUtPm5vbmVtcHR5KCkgJiYgKG1DaGlsZFRhYmxlLT5maXJzdCgpICE9IG1SSUQpKSkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNDaGlsZFRhYmxlKCkgY29uc3QKKwl7CisJCXJldHVybiggbUNoaWxkVGFibGUudmFsaWQoKSApOworCX0KKworCWlubGluZSB2b2lkIG1ha2VXcml0YWJsZUNoaWxkVGFibGUoKQorCXsKKwkJbUNoaWxkVGFibGUubWFrZVdyaXRhYmxlKCk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0Q2hpbGRUYWJsZShjb25zdCBBUFRhYmxlT2ZSdW50aW1lSUQgJiBhQ2hpbFRhYmxlKQorCXsKKwkJbUNoaWxkVGFibGUgPSBhQ2hpbFRhYmxlOworCX0KKworCisJaW5saW5lIHZvaWQgYXBwZW5kQ2hpbGQoY29uc3QgUnVudGltZUlEICYgYVJJRCkKKwl7CisJCWlmKCBtQ2hpbGRUYWJsZS5pbnZhbGlkKCkgKQorCQl7CisJCQltQ2hpbGRUYWJsZS5yZXBsYWNlUG9pbnRlciggbmV3IFRhYmxlT2ZSdW50aW1lSUQoKSApOworCQl9CisKKwkJbUNoaWxkVGFibGUtPmFwcGVuZChhUklEKTsKKwl9CisKKworCWlubGluZSBjb25zdCBSdW50aW1lSUQgJiBnZXRDaGlsZChhdm1fb2Zmc2V0X3Qgb2Zmc2V0KSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQ2hpbGRUYWJsZS0+Z2V0KG9mZnNldCkgKTsKKwl9CisKKwljb25zdCBSdW50aW1lSUQgJiBnZXRDaGlsZChjb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCkgY29uc3Q7CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1EYXRhVGFibGUKKwkgKi8KKwlpbmxpbmUgQVBUYWJsZU9mRGF0YSAmIGdldERhdGFUYWJsZSgpCisJeworCQlyZXR1cm4oIG1EYXRhVGFibGUgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQVBUYWJsZU9mRGF0YSAmIGdldERhdGFUYWJsZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1EYXRhVGFibGUgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNEYXRhKCkgY29uc3QKKwl7CisJCXJldHVybiggbURhdGFUYWJsZS52YWxpZCgpICYmIG1EYXRhVGFibGUtPm5vbmVtcHR5KCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNEYXRhVGFibGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRGF0YVRhYmxlLnZhbGlkKCkgKTsKKwl9CisKKwkvLyBXcml0YWJsZSBtRGF0YVRhYmxlCisJaW5saW5lIEFQVGFibGVPZkRhdGEgJiBnZXRXcml0YWJsZURhdGFUYWJsZSgpCisJeworCQltRGF0YVRhYmxlLm1ha2VXcml0YWJsZSgpOworCisJCXJldHVybiggbURhdGFUYWJsZSApOworCX0KKworCWlubGluZSB2b2lkIG1ha2VXcml0YWJsZURhdGFUYWJsZSgpCisJeworCQltRGF0YVRhYmxlLm1ha2VXcml0YWJsZSgpOworCX0KKworCS8vPz9DT01QSUxFISEKKwlpbmxpbmUgdm9pZCBzZXREYXRhVGFibGUoVGFibGVPZkRhdGEgKiBhRGF0YVRhYmxlKQorCXsKKwkJbURhdGFUYWJsZSA9IGFEYXRhVGFibGU7CisJfQorCisJaW5saW5lIHZvaWQgc2V0RGF0YVRhYmxlKGNvbnN0IEFQVGFibGVPZkRhdGEgJiBhRGF0YVRhYmxlKQorCXsKKwkJbURhdGFUYWJsZSA9IGFEYXRhVGFibGU7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBjb25zdCBUYWJsZU9mSW5zdGFuY2VPZkRhdGEgJiBnZXRWYXJpYWJsZXMoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUklELmdldEV4ZWN1dGFibGUoKS0+Z2V0RGF0YSgpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgSW5zdGFuY2VPZkRhdGEgKiByYXdWYXJpYWJsZShhdm1fb2Zmc2V0X3Qgb2Zmc2V0KSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUklELnJhd1ZhcmlhYmxlKG9mZnNldCkgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBjb25zdCBCRiAmIGdldFZhcmlhYmxlKGF2bV9vZmZzZXRfdCBvZmZzZXQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1SSUQuZ2V0VmFyaWFibGUob2Zmc2V0KSApOworCX0KKworCisJaW5saW5lIEJGICYgZ2V0RGF0YShhdm1fb2Zmc2V0X3Qgb2Zmc2V0KSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRGF0YVRhYmxlLT5hdChvZmZzZXQpICk7CisJfQorCisJaW5saW5lIEJGICYgZ2V0V3JpdGFibGVEYXRhKGF2bV9vZmZzZXRfdCBvZmZzZXQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1EYXRhVGFibGUtPmdldFdyaXRhYmxlKG9mZnNldCkgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQkYgJiBnZXREYXRhKGNvbnN0IEluc3RhbmNlT2ZEYXRhICogYW5JbnN0YW5jZSkgY29uc3QKKwl7CisJCXJldHVybiggbURhdGFUYWJsZS0+Z2V0KGFuSW5zdGFuY2UpICk7CisJfQorCisKKwlpbmxpbmUgY29uc3QgQkYgJiBnZXREYXRhKGNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEKSBjb25zdAorCXsKKwkJSW5zdGFuY2VPZkRhdGEgKiBhbkluc3RhbmNlID0gZ2V0RXhlY3V0YWJsZSgpLT5nZXRBbGxEYXRhKCkuCisJCQkJcmF3QnlGUU5hbWVJRCggYUZ1bGx5UXVhbGlmaWVkTmFtZUlEICk7CisJCWlmKCBhbkluc3RhbmNlICE9IE5VTEwgKQorCQl7CisJCQlyZXR1cm4oIG1EYXRhVGFibGUtPmdldChhbkluc3RhbmNlKSApOworCQl9CisJCXJldHVybiggQkY6OlJFRl9OVUxMICk7CisJfQorCisJaW5saW5lIGNvbnN0IEJGICYgZ2V0RGF0YUJ5UXVhbGlmaWVkTmFtZUlEKAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlELCBJbnN0YW5jZU9mRGF0YSAqICYgdmFyKSBjb25zdAorCXsKKwkJdmFyID0gZ2V0RXhlY3V0YWJsZSgpLT5nZXRBbGxEYXRhKCkucmF3QnlRdWFsaWZpZWROYW1lSUQoYVF1YWxpZmllZE5hbWVJRCk7CisJCWlmKCB2YXIgIT0gTlVMTCApCisJCXsKKwkJCXJldHVybiggbURhdGFUYWJsZS0+Z2V0KHZhcikgKTsKKwkJfQorCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCX0KKworCWlubGluZSBjb25zdCBCRiAmIGdldERhdGFCeU5hbWVJRChjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpIGNvbnN0CisJeworCQlJbnN0YW5jZU9mRGF0YSAqIGFuSW5zdGFuY2UgPQorCQkJCWdldEV4ZWN1dGFibGUoKS0+Z2V0QWxsRGF0YSgpLnJhd0J5TmFtZUlEKGFOYW1lSUQpOworCQlpZiggYW5JbnN0YW5jZSAhPSBOVUxMICkKKwkJeworCQkJcmV0dXJuKCBtRGF0YVRhYmxlLT5nZXQoYW5JbnN0YW5jZSkgKTsKKwkJfQorCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCX0KKworCisJaW5saW5lIHZvaWQgc2V0RGF0YShhdm1fb2Zmc2V0X3Qgb2Zmc2V0LCBjb25zdCBCRiAmIGFEYXRhKSBjb25zdAorCXsKKwkJbURhdGFUYWJsZS0+c2V0KG9mZnNldCwgYURhdGEpOworCX0KKworCWlubGluZSB2b2lkIHNldERhdGEoCisJCQljb25zdCBJbnN0YW5jZU9mRGF0YSAqIGFuSW5zdGFuY2UsIGNvbnN0IEJGICYgYURhdGEpIGNvbnN0CisJeworCQltRGF0YVRhYmxlLT5zZXQoYW5JbnN0YW5jZSwgYURhdGEpOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbURhdGFUYWJsZQorCSAqLworCWlubGluZSBjb25zdCBUYWJsZU9mQnVmZmVyVCAmIGdldEJ1ZmZlclRhYmxlKCkgY29uc3QKKwl7CisJCXJldHVybiggbUJ1ZmZlclRhYmxlICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzQnVmZmVyKCkgY29uc3QKKwl7CisJCXJldHVybiggbUJ1ZmZlclRhYmxlLm5vbmVtcHR5KCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNCdWZmZXJUYWJsZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1CdWZmZXJUYWJsZS52YWxpZCgpICk7CisJfQorCisJaW5saW5lIFRhYmxlT2ZCdWZmZXJUICYgZ2V0V3JpdGFibGVCdWZmZXJUYWJsZSgpCisJeworCQltQnVmZmVyVGFibGUubWFrZVdyaXRhYmxlKCk7CisKKwkJcmV0dXJuKCBtQnVmZmVyVGFibGUgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBtYWtlV3JpdGFibGVCdWZmZXJUYWJsZSgpCisJeworCQltQnVmZmVyVGFibGUubWFrZVdyaXRhYmxlKCk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0QnVmZmVyVGFibGUoY29uc3QgVGFibGVPZkJ1ZmZlclQgJiBhQnVmZmVyVGFibGUpCisJeworCQltQnVmZmVyVGFibGUgPSBhQnVmZmVyVGFibGU7CisJfQorCisKKwlpbmxpbmUgY29uc3QgQmFzZUJ1ZmZlckZvcm0gJiBnZXRCdWZmZXIoCisJCQljb25zdCBJbnN0YW5jZU9mQnVmZmVyICogYUJ1ZmZlcikgY29uc3QKKwl7CisJCXJldHVybiggbUJ1ZmZlclRhYmxlLnJlZiggYUJ1ZmZlci0+Z2V0T2Zmc2V0KCkgKSApOworCX0KKworCWlubGluZSBCYXNlQnVmZmVyRm9ybSAmIGdldFdyaXRhYmxlQnVmZmVyKGNvbnN0IEluc3RhbmNlT2ZCdWZmZXIgKiBhQnVmZmVyKQorCXsKKwkJcmV0dXJuKCBtQnVmZmVyVGFibGUucmVmV3JpdGFibGUoIGFCdWZmZXItPmdldE9mZnNldCgpICkgKTsKKwl9CisKKwlpbmxpbmUgQkYgYmZXcml0YWJsZUJ1ZmZlcihjb25zdCBJbnN0YW5jZU9mQnVmZmVyICogYUJ1ZmZlcikKKwl7CisJCXJldHVybiggbUJ1ZmZlclRhYmxlLnNwV3JpdGFibGU8IEJGID4oIGFCdWZmZXItPmdldE9mZnNldCgpICkgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1Sb3V0ZXIKKwkgKi8KKwlpbmxpbmUgY29uc3QgUm91dGVyICYgZ2V0Um91dGVyKCkgY29uc3QKKwl7CisJCXJldHVybiggbVJvdXRlciApOworCX0KKworCWlubGluZSBib29sIGhhc1JvdXRlcigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Sb3V0ZXIudmFsaWQoKSApOworCX0KKworCWlubGluZSB2b2lkIG1ha2VXcml0YWJsZVJvdXRlcigpCisJeworCQltUm91dGVyLm1ha2VXcml0YWJsZSgpOworCX0KKworCWlubGluZSB2b2lkIHNldFJvdXRlcihjb25zdCBSb3V0ZXIgJiBhUm91dGVyKQorCXsKKwkJbVJvdXRlciA9IGFSb3V0ZXI7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtT25TY2hlZHVsZQorCSAqLworCWlubGluZSBjb25zdCBCRkNvZGUgJiBnZXRPblNjaGVkdWxlKCkgY29uc3QKKwl7CisJCXJldHVybiggbU9uU2NoZWR1bGUgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNPblNjaGVkdWxlKCkgY29uc3QKKwl7CisJCXJldHVybiggbU9uU2NoZWR1bGUudmFsaWQoKSApOworCX0KKworCWlubGluZSB2b2lkIHNldE9uU2NoZWR1bGUoY29uc3QgQkZDb2RlICYgb25TY2hlZHVsZSkKKwl7CisJCW1PblNjaGVkdWxlID0gb25TY2hlZHVsZTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1PbkRlZmVyCisJICovCisJaW5saW5lIGNvbnN0IEJGQ29kZSAmIGdldE9uRGVmZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtT25EZWZlciApOworCX0KKworCWlubGluZSBib29sIGhhc09uRGVmZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtT25EZWZlci52YWxpZCgpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0T25EZWZlcihjb25zdCBCRkNvZGUgJiBvbkRlZmVyKQorCXsKKwkJbU9uRGVmZXIgPSBvbkRlZmVyOworCX0KKworCisJLyoqCisJICogR0VUVEVSCisJICogdGhlIElucHV0IEVuYWJsZWQgRmxhZworCSAqIE1PQyBBdHRyaWJ1dGUgZm9yIENvbW11bmljYXRpb24KKwkgKi8KKwlpbmxpbmUgYm9vbCBpc0lucHV0RW5hYmxlZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldFJJRCgpLmdldEluc3RhbmNlKCktPmdldFNwZWNpZmllcigpLmhhc0ZlYXR1cmVJbnB1dEVuYWJsZWQoKQorCQkJCXx8IGdldFJJRCgpLmdldEV4ZWN1dGFibGUoKS0+CisJCQkJCQlnZXRTcGVjaWZpZXIoKS5oYXNGZWF0dXJlSW5wdXRFbmFibGVkKCkgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1FbnZpcm9ubWVudEVuYWJsZWRDb21tdW5pY2F0aW9uRmxhZworCSAqIE1PQyBBdHRyaWJ1dGUgZm9yIENvbW11bmljYXRpb24KKwkgKi8KKwlpbmxpbmUgYm9vbCBpc0Vudmlyb25tZW50RW5hYmxlZENvbW11bmljYXRpb24oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRW52aXJvbm1lbnRFbmFibGVkQ29tbXVuaWNhdGlvbkZsYWcgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRFbnZpcm9ubWVudEVuYWJsZWRDb21tdW5pY2F0aW9uKAorCQkJYm9vbCBpc0Vudmlyb25tZW50RW5hYmxlZCA9IHRydWUpCisJeworCQltRW52aXJvbm1lbnRFbmFibGVkQ29tbXVuaWNhdGlvbkZsYWcgPSBpc0Vudmlyb25tZW50RW5hYmxlZDsKKwl9CisKKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwlpbmxpbmUgdmlydHVhbCB2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJdG9TdHJlYW0oTlVMTCwgb3MpOworCX0KKworCWlubGluZSB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHN0cigpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldFJJRCgpLnN0cigpICk7CisJfQorCisJdmlydHVhbCB2b2lkIHRvU3RyZWFtKGNvbnN0IEV4ZWN1dGlvbkRhdGEgKiBhbkVELCBPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKKwl2aXJ0dWFsIHZvaWQgdG9TdHJlYW1EYXRhKGNvbnN0IEV4ZWN1dGlvbkRhdGEgKiBhbkVELCBPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKKworCXZpcnR1YWwgdm9pZCB0b0ZzY25EYXRhKE91dFN0cmVhbSAmIG9zLAorCQkJY29uc3QgRXhlY3V0aW9uRGF0YSAqIGFuRUQsIGNvbnN0IFJ1bnRpbWVGb3JtICogYVByZXZpb3VzUkYpIGNvbnN0OworCisJdm9pZCB0b0ZzY25CdWZmZXIoT3V0U3RyZWFtICYgb3MsCisJCQljb25zdCBFeGVjdXRpb25EYXRhICogYW5FRCwgY29uc3QgUnVudGltZUZvcm0gKiBhUHJldmlvdXNSRikgY29uc3Q7CisKK307CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFBBUkFNRVRFUlMgUlVOVElNRSBGT1JNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY2xhc3MgUGFyYW1ldGVyc1J1bnRpbWVGb3JtICA6ICBwdWJsaWMgUnVudGltZUZvcm0gLAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIFBhcmFtZXRlcnNSdW50aW1lRm9ybSApCit7CisKKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggUGFyYW1ldGVyc1J1bnRpbWVGb3JtICkKKworCitwcm90ZWN0ZWQ6CisJLyoKKwkgKiBBVFRSSUJVVEVTCisJICovCisJVGFibGVPZkluc3RhbmNlT2ZEYXRhIG1QYXJhbWV0ZXJzOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlQYXJhbWV0ZXJzUnVudGltZUZvcm0oY29uc3QgUnVudGltZUlEICYgYVJJRCkKKwk6IFJ1bnRpbWVGb3JtKCBDTEFTU19LSU5EX1QoIFBhcmFtZXRlcnNSdW50aW1lRm9ybSApICwgYVJJRCApLAorCW1QYXJhbWV0ZXJzKCApCisJeworCQltRGF0YVRhYmxlID0gbmV3IFRhYmxlT2ZEYXRhKDApOworCX0KKworCVBhcmFtZXRlcnNSdW50aW1lRm9ybShjb25zdCBSdW50aW1lSUQgJiBhUklELCBhdm1fc2l6ZV90IG5iUGFyYW1zKQorCTogUnVudGltZUZvcm0oIENMQVNTX0tJTkRfVCggUGFyYW1ldGVyc1J1bnRpbWVGb3JtICkgLCBhUklEICksCisJbVBhcmFtZXRlcnMoIG5iUGFyYW1zICkKKwl7CisJCW1EYXRhVGFibGUgPSBuZXcgVGFibGVPZkRhdGEobmJQYXJhbXMpOworCX0KKworCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJUGFyYW1ldGVyc1J1bnRpbWVGb3JtKGNvbnN0IFBhcmFtZXRlcnNSdW50aW1lRm9ybSAmIGFSdW50aW1lKQorCTogUnVudGltZUZvcm0oIGFSdW50aW1lICksCisJbVBhcmFtZXRlcnMoIGFSdW50aW1lLm1QYXJhbWV0ZXJzICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5QYXJhbWV0ZXJzUnVudGltZUZvcm0oKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtUGFyYW1ldGVycworCSAqLworCWNvbnN0IEJGICYgc2F2ZVBhcmFtZXRlcihJbnN0YW5jZU9mRGF0YSAqIGFuSW5zdGFuY2UpOworCisJdm9pZCBhcHBlbmRQYXJhbWV0ZXIoY29uc3QgQkYgJiBhbkluc3RhbmNlLCBjb25zdCBCRiAmIHJ2YWx1ZSk7CisKKworCXZvaWQgYXBwZW5kUGFyYW1ldGVycyhjb25zdCBCRkxpc3QgJiBwYXJhbXNMaXN0KTsKKworCXZvaWQgYXBwZW5kUGFyYW1ldGVycyhjb25zdCBCRlZlY3RvciAmIHBhcmFtc1ZlY3Rvcik7CisKKworCWlubGluZSBjb25zdCBUYWJsZU9mSW5zdGFuY2VPZkRhdGEgJiBnZXRQYXJhbWV0ZXJzKCkgY29uc3QKKwl7CisJCXJldHVybiggbVBhcmFtZXRlcnMgKTsKKwl9CisKKworCWlubGluZSBhdm1fc2l6ZV90IGdldFBhcmFtZXRlcnNTaXplKCkgY29uc3QKKwl7CisJCXJldHVybiggbVBhcmFtZXRlcnMuc2l6ZSgpICk7CisJfQorCisKKwlpbmxpbmUgY29uc3QgQkYgJiBnZXRQYXJhbWV0ZXIoYXZtX29mZnNldF90IG9mZnNldCkgY29uc3QKKwl7CisJCXJldHVybiggbVBhcmFtZXRlcnMuZ2V0KG9mZnNldCkgKTsKKwl9CisKKwlpbmxpbmUgSW5zdGFuY2VPZkRhdGEgKiByYXdQYXJhbWV0ZXIoYXZtX29mZnNldF90IG9mZnNldCkgY29uc3QKKwl7CisJCXJldHVybiggbVBhcmFtZXRlcnMucmF3QXQob2Zmc2V0KSApOworCX0KKworCWlubGluZSBib29sIGhhc1BhcmFtZXRlcigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1QYXJhbWV0ZXJzLm5vbmVtcHR5KCkgKTsKKwl9CisKKworCWlubGluZSB2b2lkIHNldFBhcmFtZXRlcihhdm1fb2Zmc2V0X3Qgb2Zmc2V0LCBjb25zdCBCRiAmIGFuSW5zdGFuY2UpCisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfU01BUlRfUE9JTlRFUl9FWElUKCBhbkluc3RhbmNlICkKKwkJCQk8PCAiSW5zdGFuY2VPZkRhdGEgISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQlhbkluc3RhbmNlLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpLT5zZXRDb250YWluZXIoIGdldEV4ZWN1dGFibGUoKSApOworCQltUGFyYW1ldGVycy5zZXQob2Zmc2V0LCBhbkluc3RhbmNlKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRQYXJhbWV0ZXIoYXZtX29mZnNldF90IG9mZnNldCwKKwkJCWNvbnN0IEJGICYgYW5JbnN0YW5jZSwgY29uc3QgQkYgJiBydmFsdWUgKQorCXsKKy8vCQlhbkluc3RhbmNlLT5zZXRDb250YWluZXIoIGdldEV4ZWN1dGFibGUoKSApOworLy8JCWFuSW5zdGFuY2UtPnNldE9mZnNldCggb2Zmc2V0ICk7CisJCW1QYXJhbWV0ZXJzWyBvZmZzZXQgXSA9IGFuSW5zdGFuY2U7CisKKwkJbURhdGFUYWJsZS0+c2V0KG9mZnNldCwgcnZhbHVlKTsKKworLy8JCWFuSW5zdGFuY2UtPnNldFJ1bnRpbWVDb250YWluZXJSSUQoIG1SSUQgKTsKKwl9CisKKworCS8vIFZhcmlhYmxlCisJaW5saW5lIHZpcnR1YWwgY29uc3QgVGFibGVPZkluc3RhbmNlT2ZEYXRhICYgZ2V0VmFyaWFibGVzKCkgY29uc3QKKwl7CisJCXJldHVybiggbVBhcmFtZXRlcnMgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBJbnN0YW5jZU9mRGF0YSAqIHJhd1ZhcmlhYmxlKGF2bV9vZmZzZXRfdCBvZmZzZXQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1QYXJhbWV0ZXJzLnJhd0F0KG9mZnNldCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCByZXNldE9mZnNldCgpIGNvbnN0CisJeworCQlUYWJsZU9mSW5zdGFuY2VPZkRhdGE6OmNvbnN0X3Jhd19pdGVyYXRvciBpdFBhcmFtID0gbVBhcmFtZXRlcnMuYmVnaW4oKTsKKwkJVGFibGVPZkluc3RhbmNlT2ZEYXRhOjpjb25zdF9yYXdfaXRlcmF0b3IgZW5kUGFyYW0gPSBtUGFyYW1ldGVycy5lbmQoKTsKKwkJYXZtX29mZnNldF90IG9mZnNldCA9IDA7CisJCWZvciggOyBpdFBhcmFtICE9IGVuZFBhcmFtIDsgKytvZmZzZXQgLCArK2l0UGFyYW0gKQorCQl7CisJCQkoaXRQYXJhbSktPnNldE9mZnNldCggb2Zmc2V0ICk7CisJCX0KKwl9CisKKworCS8qKgorCSAqIFJVTlRJTUUgVVBEQVRFCisJICovCisJdm9pZCB1cGRhdGUoY29uc3QgQkYgJiBwYXJhbUV4cHIpOworCisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJaW5saW5lIHZpcnR1YWwgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCXRvU3RyZWFtKE5VTEwsIG9zKTsKKwl9CisKKwl2aXJ0dWFsIHZvaWQgdG9TdHJlYW0oY29uc3QgRXhlY3V0aW9uRGF0YSAqIGFuRUQsIE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworCXZpcnR1YWwgdm9pZCB0b1N0cmVhbURhdGEoY29uc3QgRXhlY3V0aW9uRGF0YSAqIGFuRUQsIE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworCXZpcnR1YWwgdm9pZCB0b0ZzY25EYXRhKE91dFN0cmVhbSAmIG9zLAorCQkJY29uc3QgRXhlY3V0aW9uRGF0YSAqIGFuRUQsIGNvbnN0IFJ1bnRpbWVGb3JtICogYVByZXZpb3VzUkYpIGNvbnN0OworCit9OworCisKK30KKworI2VuZGlmIC8qUlVOVElNRUZPUk1fSF8qLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3J1bnRpbWUvUnVudGltZUlELmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL1J1bnRpbWVJRC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q2NGJmYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL1J1bnRpbWVJRC5jcHAKQEAgLTAsMCArMSw1NTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJSdW50aW1lSUQuaCIKKworI2luY2x1ZGUgPGNvbW1vbi9OYW1lZEVsZW1lbnQuaD4KKworI2luY2x1ZGUgPGZtbC9jb21tb24vU3BlY2lmaWVyRWxlbWVudC5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvQmFzZUNvbXBpbGVkRm9ybS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0Jhc2VJbnN0YW5jZUZvcm0uaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlRm9ybS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZNYWNoaW5lLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorICogREVGQVVMVCBOVUxMCisgKi8KK1J1bnRpbWVJRCBSdW50aW1lSUQ6OlJFRl9OVUxMOworCisvKioKKyAqIEdFVFRFUiAtIFNFVFRFUgorICogbUZ1bGx5UXVhbGlmaWVkTmFtZUlECisgKi8KK3N0ZDo6c3RyaW5nIFJ1bnRpbWVJRDo6Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSBjb25zdAoreworCXJldHVybiggQmFzZUNvbXBpbGVkRm9ybTo6VVNFX09OTFlfSUQKKwkJCT8gcmlkX3BvaW50ZXIoKS0+Z2V0TmFtZUlEKCkKKwkJCTogcmlkX3BvaW50ZXIoKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSApOworfQorCit2b2lkIF9SdW50aW1lSURfOjp1cGRhdGVGdWxseVF1YWxpZmllZE5hbWVJRCgpCit7CisJaWYoIChtUGFyZW50ICE9IE5VTEwpICYmIChtSW5zdGFuY2UgIT0gTlVMTCkgKQorCXsKKwkJbU5hbWVJRCA9IG1JbnN0YW5jZS0+Z2V0TmFtZUlEKCk7CisKKwkJbUZ1bGx5UXVhbGlmaWVkTmFtZUlEID0gKCBPU1MoKQorCQkJCTw8IG1QYXJlbnQtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKwkJCQk8PCAnLicgPDwgbU5hbWVJRCApOworCisJCW1RdWFsaWZpZWROYW1lSUQgPSAoIE9TUygpIDw8ICJydW46OnBpZCMiIDw8IG1SaWQgPDwgJzonCisJCQkJPDwgTmFtZWRFbGVtZW50Ojpsb2NhdGlvbihtRnVsbHlRdWFsaWZpZWROYW1lSUQpICk7CisJfQorCWVsc2UgaWYoIG1JbnN0YW5jZSAhPSBOVUxMICkKKwl7CisJCW1OYW1lSUQgPSBtSW5zdGFuY2UtPmdldE5hbWVJRCgpOworCisJCXN0ZDo6c3RyaW5nIGFRdWFsaWZpZWROYW1lSUQgPSBOYW1lZEVsZW1lbnQ6OmxvY2F0aW9uKAorCQkJCW1JbnN0YW5jZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSApOworCisJCW1GdWxseVF1YWxpZmllZE5hbWVJRCA9ICJydW46OiIgKyBhUXVhbGlmaWVkTmFtZUlEOworCisJCW1RdWFsaWZpZWROYW1lSUQgPQorCQkJCSggT1NTKCkgPDwgInJ1bjo6cGlkIyIgPDwgbVJpZCA8PCAnOicgPDwgYVF1YWxpZmllZE5hbWVJRCApOworCX0KKwllbHNlCisJeworCQltTmFtZUlEID0gKCBPU1MoKSA8PCAicGlkIyIgPDwgbVJpZCApOworCisJCW1GdWxseVF1YWxpZmllZE5hbWVJRCA9CisJCQkJbVF1YWxpZmllZE5hbWVJRCA9ICggT1NTKCkgPDwgInJ1bjo6cGlkIyIgPDwgbVJpZCApOworCX0KK30KKworLyoqCisgKiBHRVRURVIKKyAqIEV4ZWN1dGFibGUKKyAqLworRXhlY3V0YWJsZUZvcm0gKiBfUnVudGltZUlEXzo6Z2V0RXhlY3V0YWJsZSgpIGNvbnN0Cit7CisJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggbUluc3RhbmNlICkKKwkJCTw8ICIgSW5zdGFuY2UgaW4gX1JJRF8gPCAiCisJCQk8PCAicGlkIyIgPDwgbVJpZCA8PCAiOiIgPDwgZ2V0TmFtZUlEKCkgPDwgIiA+ICEhISIKKwkJCTw8IFNFTkRfRVhJVDsKKwlBVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoIG1JbnN0YW5jZS0+aGFzRXhlY3V0YWJsZSgpICkKKwkJCTw8ICJVbmV4cGVjdGVkIFJJRCB3aXRob3V0IEV4ZWN1dGFibGUgISEhIgorCQkJPDwgU0VORF9FWElUOworCisJcmV0dXJuKCBtSW5zdGFuY2UtPmdldEV4ZWN1dGFibGUoKSApOworfQorCisKKy8qKgorICogaW5pdGlhbGl6ZQorICogZmluYWxpemUKKyAqLwordm9pZCBSdW50aW1lSUQ6OmluaXRpYWxpemUoKQoreworCS8vIEF0dGVudGlvbjo+IFJlZmVyZW5jZSBjaXJjdWxhaXJlIChhIGxhIGRlc3RydWN0aW9uKSEhISEKKwlyaWRfcG9pbnRlcigpLT5vblJ1bm5pbmcgPSBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3T3B0aU5vcENvZGUoCisJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1JVTiwgKnRoaXMsIEFWTV9BUkdfTUFDSElORV9SSUQpOworCisJX1J1bnRpbWVJRF8gKiB0bXBSSUQ7CisKKwkvLyB0aGUgZmlyc3QgaGllcmFyY2hpY2FsIGNvbXBvc2l0ZSAoY29udGFpbmVkIGNvbmN1cnJlbmN5IHNwZWMpIGNvbnRhaW5lcgorCWlmKCBnZXRFeGVjdXRhYmxlKCktPmlzQ29tcG9zaXRlQ29tcG9uZW50KCkgKQorCXsKKwkJcmlkX3BvaW50ZXIoKS0+bUNvbXBvc2l0ZUNvbXBvbmVudCA9IHRoaXMtPnJpZF9wb2ludGVyKCk7CisJfQorCWVsc2UgaWYoICh0bXBSSUQgPSByaWRfcG9pbnRlcigpKS0+bVBhcmVudCAhPSBOVUxMICkKKwl7CisJCXRtcFJJRCA9IHRtcFJJRC0+bVBhcmVudDsKKwkJZm9yKCA7ICh0bXBSSUQgIT0gTlVMTCkgOyB0bXBSSUQgPSB0bXBSSUQtPm1QYXJlbnQgKQorCQl7CisJCQlpZiggdG1wUklELT5nZXRFeGVjdXRhYmxlKCktPmlzQ29tcG9zaXRlQ29tcG9uZW50KCkgKQorCQkJeworCQkJCXJpZF9wb2ludGVyKCktPm1Db21wb3NpdGVDb21wb25lbnQgPSB0bXBSSUQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKAorCQkJCXJpZF9wb2ludGVyKCktPm1Db21wb3NpdGVDb21wb25lbnQgKQorCQkJCTw8ICIgYXMgRmlyc3QgQ29tcG9zaXRlIFBhcmVudCBDb21wb25lbnQgb2YgPCAiCisJCQkJPDwgdGhpcy0+c3RyVW5pcUlkKCkgPDwgIiA+ICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisJfQorCisJLy8gdGhlIGZpcnN0ICBjb21wb3NpdGUgcGFyZW50IG9mIHRoZSBmaXJzdCBjb21wb3NpdGUgY29udGFpbmVyCisJaWYoIHJpZF9wb2ludGVyKCktPm1Db21wb3NpdGVDb21wb25lbnQgIT0gTlVMTCApCisJeworCQlyaWRfcG9pbnRlcigpLT5tQ29tcG9zaXRlQ29tcG9uZW50UGFyZW50ID0KKwkJCQl0bXBSSUQgPSByaWRfcG9pbnRlcigpLT5tQ29tcG9zaXRlQ29tcG9uZW50OworCisJCWlmKCB0bXBSSUQtPm1QYXJlbnQgIT0gTlVMTCApCisJCXsKKwkJCWZvciggdG1wUklEID0gdG1wUklELT5tUGFyZW50IDsKKwkJCQkJKHRtcFJJRCAhPSBOVUxMKSA7IHRtcFJJRCA9IHRtcFJJRC0+bVBhcmVudCApCisJCQl7CisJCQkJaWYoIHRtcFJJRC0+Z2V0RXhlY3V0YWJsZSgpLT5pc0NvbXBvc2l0ZUNvbXBvbmVudCgpICkKKwkJCQl7CisJCQkJCXJpZF9wb2ludGVyKCktPm1Db21wb3NpdGVDb21wb25lbnRQYXJlbnQgPSB0bXBSSUQ7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCisJLy8gdGhlIGZpcnN0IChvciB0aGlzKSBDb21tdW5pY2F0b3IgY29udGFpbmVyIG9mIHRoaXMKKwlpZiggZ2V0RXhlY3V0YWJsZSgpLT5pc0NvbW11bmljYXRvcigpICkKKwl7CisJCXJpZF9wb2ludGVyKCktPm1Db21tdW5pY2F0b3IgPSB0aGlzLT5yaWRfcG9pbnRlcigpOworCX0KKwllbHNlIGlmKCAodG1wUklEID0gcmlkX3BvaW50ZXIoKSktPm1QYXJlbnQgIT0gTlVMTCApCisJeworCQlmb3IoIHRtcFJJRCA9IHRtcFJJRC0+bVBhcmVudCA7CisJCQkJKHRtcFJJRCAhPSBOVUxMKSA7IHRtcFJJRCA9IHRtcFJJRC0+bVBhcmVudCApCisJCXsKKwkJCWlmKCB0bXBSSUQtPmdldEV4ZWN1dGFibGUoKS0+aXNDb21tdW5pY2F0b3IoKSApCisJCQl7CisJCQkJcmlkX3BvaW50ZXIoKS0+bUNvbW11bmljYXRvciA9IHRtcFJJRDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8vIHRoZSBmaXJzdCAob3IgdGhpcykgTGlmZWxpbmUgY29udGFpbmVyIG9mIHRoaXMKKwlpZiggZ2V0RXhlY3V0YWJsZSgpLT5pc0xpZmVsaW5lKCkgKQorCXsKKwkJcmlkX3BvaW50ZXIoKS0+bUxpZmVsaW5lID0gdGhpcy0+cmlkX3BvaW50ZXIoKTsKKwl9CisJZWxzZSBpZiggKHRtcFJJRCA9IHJpZF9wb2ludGVyKCkpLT5tUGFyZW50ICE9IE5VTEwgKQorCXsKKwkJZm9yKCB0bXBSSUQgPSB0bXBSSUQtPm1QYXJlbnQgOworCQkJCSh0bXBSSUQgIT0gTlVMTCkgOyB0bXBSSUQgPSB0bXBSSUQtPm1QYXJlbnQgKQorCQl7CisJCQlpZiggdG1wUklELT5nZXRFeGVjdXRhYmxlKCktPmlzTGlmZWxpbmUoKSApCisJCQl7CisJCQkJcmlkX3BvaW50ZXIoKS0+bUxpZmVsaW5lID0gdG1wUklEOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYoIHJpZF9wb2ludGVyKCktPm1MaWZlbGluZSA9PSBOVUxMICkKKwkJeworCQkJcmlkX3BvaW50ZXIoKS0+bUxpZmVsaW5lID0gcmlkX3BvaW50ZXIoKS0+bUNvbW11bmljYXRvcjsKKwkJfQorCX0KKworCisJLy8gdGhlIGZpcnN0IGhpZXJhcmNoaWNhbCBtYWluIENvbXBvbmVudCBjb250YWluZXIKKwlpZiggZ2V0RXhlY3V0YWJsZSgpLT5pc01haW5Db21wb25lbnQoKSApCisJeworCQlyaWRfcG9pbnRlcigpLT5tQ29tcG9uZW50U2VsZiA9IHRoaXMtPnJpZF9wb2ludGVyKCk7CisJfQorCWVsc2UgaWYoICh0bXBSSUQgPSByaWRfcG9pbnRlcigpKS0+bVBhcmVudCAhPSBOVUxMICkKKwl7CisJCXRtcFJJRCA9IHRtcFJJRC0+bVBhcmVudDsKKwkJZm9yKCA7ICh0bXBSSUQgIT0gTlVMTCkgOyB0bXBSSUQgPSB0bXBSSUQtPm1QYXJlbnQgKQorCQl7CisJCQlpZiggdG1wUklELT5nZXRFeGVjdXRhYmxlKCktPmlzTWFpbkNvbXBvbmVudCgpICkKKwkJCXsKKwkJCQlyaWRfcG9pbnRlcigpLT5tQ29tcG9uZW50U2VsZiA9IHRtcFJJRDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9QT0lOVEVSX0VYSVQoCisJCQkJcmlkX3BvaW50ZXIoKS0+bUNvbXBvc2l0ZUNvbXBvbmVudCApCisJCQkJPDwgIiBhcyBDb21wb25lbnQgU2VsZiBvZiA8ICIgPDwgdGhpcy0+c3RyVW5pcUlkKCkgPDwgIiA+ICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisJfQorCisJLy8gdGhlIG1haW4gQ29tcG9uZW50IGNvbnRhaW5lciBvZiBtQ29tcG9uZW50U2VsZgorCWlmKCAocmlkX3BvaW50ZXIoKS0+bUNvbXBvbmVudFNlbGYgIT0gTlVMTCkKKwkJJiYgKCh0bXBSSUQgPSByaWRfcG9pbnRlcigpLT5tQ29tcG9uZW50U2VsZiktPm1QYXJlbnQgIT0gTlVMTCkgKQorCXsKKwkJZm9yKCB0bXBSSUQgPSB0bXBSSUQtPm1QYXJlbnQgOworCQkJCSh0bXBSSUQgIT0gTlVMTCkgOyB0bXBSSUQgPSB0bXBSSUQtPm1QYXJlbnQgKQorCQl7CisJCQlpZiggdG1wUklELT5nZXRFeGVjdXRhYmxlKCktPmlzTWFpbkNvbXBvbmVudCgpICkKKwkJCXsKKwkJCQlyaWRfcG9pbnRlcigpLT5tQ29tcG9uZW50UGFyZW50ID0gdG1wUklEOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJLy8gdGhlIGZpcnN0IChvciB0aGlzKSBtYWluIENvbXBvbmVudCBDb21tdW5pY2F0b3IgY29udGFpbmVyIG9mIHRoaXMKKwlpZiggZ2V0RXhlY3V0YWJsZSgpLT5pc01haW5Db21wb25lbnQoKSAmJiBnZXRFeGVjdXRhYmxlKCktPmhhc1BvcnQoKSApCisJeworCQlyaWRfcG9pbnRlcigpLT5tQ29tcG9uZW50Q29tbXVuaWNhdG9yID0gdGhpcy0+cmlkX3BvaW50ZXIoKTsKKwl9CisJZWxzZSBpZiggKHRtcFJJRCA9IHJpZF9wb2ludGVyKCkpLT5tUGFyZW50ICE9IE5VTEwgKQorCXsKKwkJZm9yKCB0bXBSSUQgPSB0bXBSSUQtPm1QYXJlbnQgOworCQkJCSh0bXBSSUQgIT0gTlVMTCkgOyB0bXBSSUQgPSB0bXBSSUQtPm1QYXJlbnQgKQorCQl7CisJCQlpZiggdG1wUklELT5nZXRFeGVjdXRhYmxlKCktPmlzTWFpbkNvbXBvbmVudCgpICYmCisJCQkJCXRtcFJJRC0+Z2V0RXhlY3V0YWJsZSgpLT5oYXNQb3J0KCkgKQorCQkJeworCQkJCXJpZF9wb2ludGVyKCktPm1Db21wb25lbnRDb21tdW5pY2F0b3IgPSB0bXBSSUQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9Cit9CisKKworLyoqCisgKiBHRVRURVIgIEFQSQorICogU3BlY2lmaWVyCisgKi8KK2NvbnN0IFNwZWNpZmllciAmIFJ1bnRpbWVJRDo6Z2V0U3BlY2lmaWVyKCkgY29uc3QKK3sKKwlyZXR1cm4oIGdldEV4ZWN1dGFibGUoKS0+Z2V0U3BlY2lmaWVyKCkgKTsKK30KKworCisvKioKKyAqIEdFVFRFUiAtIFNFVFRFUgorICogbUluc3RhbmNlCisgKiBzb24gRXhlY3V0YWJsZQorICogc2VzIHZhcmlhYmxlcworICovCisvLyBNb2RlbCBNYWNoaW5lCitjb25zdCBJbnN0YW5jZU9mTWFjaGluZSAqIFJ1bnRpbWVJRDo6Z2V0TW9kZWxJbnN0YW5jZSgpIGNvbnN0Cit7CisJcmV0dXJuKCByaWRfcG9pbnRlcigpLT5tSW5zdGFuY2UtPmdldEluc3RhbmNlTW9kZWwoKSApOworfQorCitib29sIFJ1bnRpbWVJRDo6aGFzTW9kZWxJbnN0YW5jZSgpIGNvbnN0Cit7CisJcmV0dXJuKCAocmlkX3BvaW50ZXIoKS0+bUluc3RhbmNlICE9IE5VTEwpICYmCisJCQlyaWRfcG9pbnRlcigpLT5tSW5zdGFuY2UtPmhhc0luc3RhbmNlTW9kZWwoKSApOworfQorCisKKy8vIEV4ZWN1dGFibGUKK0V4ZWN1dGFibGVGb3JtICogUnVudGltZUlEOjpnZXRFeGVjdXRhYmxlKCkgY29uc3QKK3sKKwlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCByaWRfcG9pbnRlcigpLT5tSW5zdGFuY2UgKQorCQkJPDwgIiBJbnN0YW5jZSBpbiBSSUQgPCAiIDw8IHRoaXMtPnN0clVuaXFJZCgpIDw8ICIgPiAhISEiCisJCQk8PCBTRU5EX0VYSVQ7CisJQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKAorCQkJcmlkX3BvaW50ZXIoKS0+bUluc3RhbmNlLT5oYXNFeGVjdXRhYmxlKCkgKQorCQkJPDwgIlVuZXhwZWN0ZWQgUklEIHdpdGhvdXQgRXhlY3V0YWJsZSAhISEiCisJCQk8PCBTRU5EX0VYSVQ7CisKKwlyZXR1cm4oIGdldEluc3RhbmNlKCktPmdldEV4ZWN1dGFibGUoKSApOworfQorCitib29sIFJ1bnRpbWVJRDo6aGFzRXhlY3V0YWJsZSgpIGNvbnN0Cit7CisJcmV0dXJuKCBoYXNJbnN0YW5jZSgpICYmIGdldEluc3RhbmNlKCktPmhhc0V4ZWN1dGFibGUoKSApOworfQorCisKKy8vIFZhcmlhYmxlCitjb25zdCBCRiAmIFJ1bnRpbWVJRDo6Z2V0VmFyaWFibGUoYXZtX29mZnNldF90IG9mZnNldCkgY29uc3QKK3sKKwlyZXR1cm4oIGdldEV4ZWN1dGFibGUoKS0+Z2V0RGF0YSgpLmdldChvZmZzZXQpICk7Cit9CisKK0luc3RhbmNlT2ZEYXRhICogUnVudGltZUlEOjpyYXdWYXJpYWJsZShhdm1fb2Zmc2V0X3Qgb2Zmc2V0KSBjb25zdAoreworCXJldHVybiggZ2V0RXhlY3V0YWJsZSgpLT5nZXREYXRhKCkucmF3QXQob2Zmc2V0KSApOworfQorCisKK2Jvb2wgUnVudGltZUlEOjpoYXNWYXJpYWJsZSgpIGNvbnN0Cit7CisJcmV0dXJuKCBnZXRFeGVjdXRhYmxlKCktPmhhc0RhdGEoKSApOworfQorCisKKy8qKgorICogR0VUVEVSIC0gU0VUVEVSCisgKiBJbnN0YW5jZS0+bU9uQ3JlYXRlCisgKi8KK2NvbnN0IEJGQ29kZSAmIFJ1bnRpbWVJRDo6Z2V0T25DcmVhdGUoKSBjb25zdAoreworCXJldHVybiggZ2V0SW5zdGFuY2UoKS0+Z2V0T25DcmVhdGUoKSApOworfQorCitib29sIFJ1bnRpbWVJRDo6aGFzT25DcmVhdGUoKSBjb25zdAoreworCXJldHVybiggZ2V0SW5zdGFuY2UoKS0+aGFzT25DcmVhdGUoKSApOworfQorCisvKioKKyAqIEdFVFRFUiAtIFNFVFRFUgorICogSW5zdGFuY2UtPm1PbkluaXQKKyAqLworY29uc3QgQkZDb2RlICYgUnVudGltZUlEOjpnZXRPblN0YXJ0KCkgY29uc3QKK3sKKwlyZXR1cm4oIGdldEluc3RhbmNlKCktPmdldE9uU3RhcnQoKSApOworfQorCitib29sIFJ1bnRpbWVJRDo6aGFzT25TdGFydCgpIGNvbnN0Cit7CisJcmV0dXJuKCBnZXRJbnN0YW5jZSgpLT5oYXNPblN0YXJ0KCkgKTsKK30KKworCisvKioKKyAqIEdFVFRFUiAtIFNFVFRFUgorICogQW5jZXN0b3IKKyAqLworYm9vbCBSdW50aW1lSUQ6Omhhc0FzQW5jZXN0b3IoY29uc3QgUnVudGltZUlEICYgYVJJRCkgY29uc3QKK3sKKwlfUnVudGltZUlEXyAqIGFQb3NzaWJsZUFuY2VzdG9yID0gYVJJRC5yaWRfcG9pbnRlcigpOworCisJX1J1bnRpbWVJRF8gKiB0bXBSSUQgPSByaWRfcG9pbnRlcigpOworCWZvciggOyAodG1wUklEICE9IE5VTEwpIDsgdG1wUklEID0gdG1wUklELT5tUGFyZW50ICkKKwl7CisJCWlmKCAodG1wUklEID09IGFQb3NzaWJsZUFuY2VzdG9yKSApCisJCXsKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCitib29sIFJ1bnRpbWVJRDo6aGFzQXNBbmNlc3Rvcihjb25zdCBJbnN0YW5jZU9mTWFjaGluZSAqIGFuSW5zdGFuY2UpIGNvbnN0Cit7CisJRXhlY3V0YWJsZUZvcm0gKiBhUG9zc2libGVFeGVjdXRhYmxlQW5jZXN0b3IgPSBhbkluc3RhbmNlLT5nZXRFeGVjdXRhYmxlKCk7CisKKwlfUnVudGltZUlEXyAqIHRtcFJJRCA9IHJpZF9wb2ludGVyKCk7CisJZm9yKCA7ICh0bXBSSUQgIT0gTlVMTCkgOyB0bXBSSUQgPSB0bXBSSUQtPm1QYXJlbnQgKQorCXsKKwkJaWYoICh0bXBSSUQtPm1JbnN0YW5jZSA9PSBhbkluc3RhbmNlKQorCQkJfHwgKGFuSW5zdGFuY2UtPmdldFNwZWNpZmllcigpLmhhc0Rlc2lnbk1vZGVsKCkKKwkJCQkmJiAodG1wUklELT5nZXRFeGVjdXRhYmxlKCkgPT0gYVBvc3NpYmxlRXhlY3V0YWJsZUFuY2VzdG9yKSApICkKKwkJeworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKK1J1bnRpbWVJRCBSdW50aW1lSUQ6OmdldEFuY2VzdG9yQ29udGFpbmluZygKKwkJY29uc3QgQmFzZUluc3RhbmNlRm9ybSAqIGFuSW5zdGFuY2UpIGNvbnN0Cit7CisJQmFzZUF2bVByb2dyYW0gKiBhUG9zc2libGVFeGVjdXRhYmxlQW5jZXN0b3IgPSBhbkluc3RhbmNlLT5nZXRDb250YWluZXIoKTsKKworCV9SdW50aW1lSURfICogdG1wUklEID0gcmlkX3BvaW50ZXIoKTsKKwlmb3IoIDsgKHRtcFJJRCAhPSBOVUxMKSA7IHRtcFJJRCA9IHRtcFJJRC0+bVBhcmVudCApCisJeworCQlpZiggdG1wUklELT5nZXRFeGVjdXRhYmxlKCkgPT0gYVBvc3NpYmxlRXhlY3V0YWJsZUFuY2VzdG9yICkKKwkJeworCQkJcmV0dXJuKCBzbWFydFBvaW50ZXJPZiggdG1wUklEICkgKTsKKwkJfQorCX0KKworCXJldHVybiggUnVudGltZUlEOjpSRUZfTlVMTCApOworfQorCisKKy8qKgorICogR0VUVEVSIC0gU0VUVEVSCisgKiB0aGUgTGlmZWxpbmUgQW5jZXN0b3IgY29udGFpbmVyCisgKi8KK1J1bnRpbWVJRCBSdW50aW1lSUQ6OmdldExpZmVsaW5lKEluc3RhbmNlT2ZNYWNoaW5lICogYU1hY2hpbmUpIGNvbnN0Cit7CisJX1J1bnRpbWVJRF8gKiB0bXBSSUQgPSByaWRfcG9pbnRlcigpOworCWZvciggOyAodG1wUklEICE9IE5VTEwpIDsgdG1wUklEID0gdG1wUklELT5tUGFyZW50ICkKKwl7CisJCWlmKCB0bXBSSUQtPmdldEV4ZWN1dGFibGUoKSA9PSBhTWFjaGluZS0+Z2V0Q29udGFpbmVyKCkgKQorCQl7CisJCQlyZXR1cm4oIHNtYXJ0UG9pbnRlck9mKCB0bXBSSUQtPm1MaWZlbGluZSApICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIFJ1bnRpbWVJRDo6UkVGX05VTEwgKTsKK30KKworCitSdW50aW1lSUQgUnVudGltZUlEOjpnZXRMaWZlbGluZShJbnN0YW5jZU9mUG9ydCAqIGFQb3J0KSBjb25zdAoreworCWlmKCBhUG9ydC0+aGFzQWxpYXNUYXJnZXQoKSApCisJeworCQlhUG9ydCA9IGFQb3J0LT5nZXRBbGlhc1RhcmdldCgpLT5hczwgSW5zdGFuY2VPZlBvcnQgPigpOworCX0KKworCV9SdW50aW1lSURfICogdG1wUklEID0gcmlkX3BvaW50ZXIoKTsKKwlmb3IoIDsgKHRtcFJJRCAhPSBOVUxMKSA7IHRtcFJJRCA9IHRtcFJJRC0+bVBhcmVudCApCisJeworCQlpZiggKHRtcFJJRC0+Z2V0RXhlY3V0YWJsZSgpID09IGFQb3J0LT5nZXRDb250YWluZXIoKSkKKwkJCXx8IHRtcFJJRC0+Z2V0RXhlY3V0YWJsZSgpLT5nZXRQb3J0KCkuY29udGFpbnMoYVBvcnQpICkKKwkJeworCQkJcmV0dXJuKCBzbWFydFBvaW50ZXJPZiggdG1wUklELT5tTGlmZWxpbmUgKSApOworCQl9CisJfQorCisJcmV0dXJuKCBSdW50aW1lSUQ6OlJFRl9OVUxMICk7Cit9CisKKworLyoqCisgKiBHRVRURVIgLSBTRVRURVIKKyAqIHRoZSBDb21tdW5pY2F0b3IgQW5jZXN0b3IgY29udGFpbmVyCisgKi8KK1J1bnRpbWVJRCBSdW50aW1lSUQ6OmdldENvbW11bmljYXRvcihJbnN0YW5jZU9mTWFjaGluZSAqIGFNYWNoaW5lKSBjb25zdAoreworCV9SdW50aW1lSURfICogdG1wUklEID0gcmlkX3BvaW50ZXIoKTsKKwlmb3IoIDsgKHRtcFJJRCAhPSBOVUxMKSA7IHRtcFJJRCA9IHRtcFJJRC0+bVBhcmVudCApCisJeworCQlpZiggdG1wUklELT5nZXRFeGVjdXRhYmxlKCkgPT0gYU1hY2hpbmUtPmdldENvbnRhaW5lcigpICkKKwkJeworCQkJcmV0dXJuKCBzbWFydFBvaW50ZXJPZiggdG1wUklELT5tQ29tbXVuaWNhdG9yICkgKTsKKwkJfQorCX0KKworCXJldHVybiggUnVudGltZUlEOjpSRUZfTlVMTCApOworfQorCisKK1J1bnRpbWVJRCBSdW50aW1lSUQ6OmdldENvbW11bmljYXRvcihJbnN0YW5jZU9mUG9ydCAqIGFQb3J0KSBjb25zdAoreworCWlmKCBhUG9ydC0+aGFzQWxpYXNUYXJnZXQoKSApCisJeworCQlhUG9ydCA9IGFQb3J0LT5nZXRBbGlhc1RhcmdldCgpLT5hczwgSW5zdGFuY2VPZlBvcnQgPigpOworCX0KKworCV9SdW50aW1lSURfICogdG1wUklEID0gcmlkX3BvaW50ZXIoKTsKKwlmb3IoIDsgKHRtcFJJRCAhPSBOVUxMKSA7IHRtcFJJRCA9IHRtcFJJRC0+bVBhcmVudCApCisJeworCQlpZiggKHRtcFJJRC0+Z2V0RXhlY3V0YWJsZSgpID09IGFQb3J0LT5nZXRDb250YWluZXIoKSkKKwkJCXx8IHRtcFJJRC0+Z2V0RXhlY3V0YWJsZSgpLT5pc0NvbW11bmljYXRvcldpdGgoYVBvcnQpICkKKwkJeworCQkJcmV0dXJuKCBzbWFydFBvaW50ZXJPZiggdG1wUklELT5tQ29tbXVuaWNhdG9yICkgKTsKKwkJfQorCX0KKworCXJldHVybiggUnVudGltZUlEOjpSRUZfTlVMTCApOworfQorCisKKworLyoqCisgKiBTZXJpYWxpemF0aW9uCisgKi8KK3ZvaWQgX1J1bnRpbWVJRF86OnRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdAoreworCWlmKCBvcy5wcmVmZXJhYmx5RlFOKCkgKQorCXsKKwkJb3MgPDwgVEFCIDw8IG1RdWFsaWZpZWROYW1lSUQ7CisKKwkJcmV0dXJuOworCX0KKworLy8KKy8vCW9zIDw8IFRBQiA8PCAicmlkICIgPDwgZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiIHsiIDw8IEVPTDsKKy8vCisvLwlvcyA8PCBUQUIyIDw8ICJyaWQgPSAiIDw8IGdldFJpZCgpIDw8ICI7IiA8PCBFT0w7CisvLwlvcyA8PCBUQUIyIDw8ICJwcmlkID0gIiA8PCBnZXRQUmlkKCkgPDwgIjsiIDw8IEVPTDsKKy8vCW9zIDw8IFRBQjIgPDwgIm9mZnNldCA9ICIgPDwgZ2V0T2Zmc2V0KCkgPDwgIjsiIDw8IEVPTDsKKy8vCW9zIDw8IFRBQjIgPDwgImluc3RhbmNlID0gIgorLy8JCQk8PCBnZXRJbnN0YW5jZSgpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8ICI7IiA8PCBFT0w7CisvLworLy8Jb3MgPDwgVEFCIDw8ICJ9IiA8PCBFT0w7CisKKwlvcyA8PCBUQUIgPDwgInJpZDwgb2Zmc2V0OiIgPDwgbU9mZnNldAorCQkJPDwgKCBtRHluYW1pY0xvYWRlZCA/ICIgLCBkeW5hOnRydWUiIDogIiIgKSA8PCAiID4gIgorLy8JCQk8PCAiQCIgPDwgYXZtX2FkZHJlc3NfdCggdGhpcyApIDw8ICIgICIKKwkJCTw8IGdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIiB7IiA8PCBFT0xfVEFCMjsKKworCW9zIDw8ICAgInRoaXMgPSAiICAgICAgICA8PCBzdGQ6OnNldHcoMykgPDwgbVJpZCA8PCAiOyI7CisJb3MgPDwgIiAgdGhpcyNwYXJlbnQgPSAiIDw8IHN0ZDo6c2V0dygzKSA8PCBtUmlkT2YoIG1QYXJlbnQgKSA8PCAiOyI7CisJb3MgPDwgIiAgdGhpcyNsaWZlbGluZSA9ICIgICA8PCBtUmlkT2YoIG1MaWZlbGluZSApIDw8ICI7IjsKKwlvcyA8PCAiICBjdGhpcyNjb20gPSAiICAgPDwgbVJpZE9mKCBtQ29tbXVuaWNhdG9yICkgPDwgIjsiOworCisJb3MgPDwgRU9MX1RBQjI7CisKKwlvcyA8PCAgICJzZWxmID0gIiA8PCBzdGQ6OnNldHcoMykgPDwgbVJpZE9mKCBtQ29tcG9uZW50U2VsZiApIDw8ICI7IjsKKwlvcyA8PCAiICBzZWxmI3BhcmVudCA9ICIgPDwgc3RkOjpzZXR3KDMpCisJCQk8PCBtUmlkT2YoIG1Db21wb25lbnRQYXJlbnQgKSA8PCAiOyI7CisJb3MgPDwgIiAgY3NlbGYjY29tID0gIiA8PCBtUmlkT2YoIG1Db21wb25lbnRDb21tdW5pY2F0b3IgKSA8PCAiOyI7CisKKwlvcyA8PCBFT0xfVEFCMjsKKworCW9zIDw8ICJ0aGlzI2NvbXBvc2l0ZSA9ICIgPDwgbVJpZE9mKCBtQ29tcG9zaXRlQ29tcG9uZW50ICkgPDwgIjsiOworCW9zIDw8ICIgIHRoaXMjY29tcG9zaXRlI3BhcmVudCA9ICIKKwkJCTw8IG1SaWRPZiggbUNvbXBvc2l0ZUNvbXBvbmVudFBhcmVudCApIDw8ICI7IjsKKworCW9zIDw8IEVPTDsKKworLy8Jb3MgPDwgVEFCMiA8PCAiZnFuID0gIiAgPDwgbUZ1bGx5UXVhbGlmaWVkTmFtZUlEIDw8ICI7IiA8PCBFT0w7CisKKwlvcyA8PCBUQUIyIDw8ICJpbnN0YW5jZSA9ICIKKwkJCTw8IG1JbnN0YW5jZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiOyIgPDwgRU9MOworCisJaWYoIG9uUnVubmluZy52YWxpZCgpICkKKwl7CisJCW9zIDw8IFRBQjIgPDwgIkBydW5uaW5neyAiIDw8IG9uUnVubmluZy5zdHIoKSA8PCAiIH0iIDw8IEVPTDsKKwl9CisKKwlvcyA8PCBUQUIgPDwgIn0iIDw8IEVPTF9GTFVTSDsKK30KKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvcnVudGltZS9SdW50aW1lSUQuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL1J1bnRpbWVJRC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NDZmOGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvcnVudGltZS9SdW50aW1lSUQuaApAQCAtMCwwICsxLDEwMDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUlVOVElNRUZPUk1JRF9IXworI2RlZmluZSBSVU5USU1FRk9STUlEX0hfCisKKyNpbmNsdWRlIDxjb21tb24vQXZtUG9pbnRlci5oPgorI2luY2x1ZGUgPGNvbW1vbi9OYW1lZEVsZW1lbnQuaD4KKyNpbmNsdWRlIDxjb21tb24vQkYuaD4KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vVmVjdG9yLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9Bdm1Db2RlLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBCYXNlSW5zdGFuY2VGb3JtOworCitjbGFzcyBFeGVjdXRhYmxlRm9ybTsKKworY2xhc3MgSW5zdGFuY2VPZkRhdGE7CitjbGFzcyBJbnN0YW5jZU9mUG9ydDsKK2NsYXNzIEluc3RhbmNlT2ZNYWNoaW5lOworCitjbGFzcyBTcGVjaWZpZXI7CisKK2NsYXNzIFJ1bnRpbWVJRDsKKworCitjbGFzcyBfUnVudGltZUlEXyA6CisJCXB1YmxpYyBOYW1lZEVsZW1lbnQsCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggX1J1bnRpbWVJRF8gKQoreworCWZyaWVuZCBSdW50aW1lSUQ7CisKKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggX1J1bnRpbWVJRF8gKQorCitwdWJsaWM6CisJLyoqCisJICogQVRUUklCVVRFUworCSAqLworCXN0ZDo6c3RyaW5nIG1RdWFsaWZpZWROYW1lSUQ7CisKKwlib29sIG1EeW5hbWljTG9hZGVkOworCisJX1J1bnRpbWVJRF8gKiBtTW9kZWw7CisKKwlfUnVudGltZUlEXyAqIG1QYXJlbnQ7CisKKwlfUnVudGltZUlEXyAqIG1Db21wb3NpdGVDb21wb25lbnQ7CisJX1J1bnRpbWVJRF8gKiBtQ29tcG9zaXRlQ29tcG9uZW50UGFyZW50OworCisJX1J1bnRpbWVJRF8gKiBtTGlmZWxpbmU7CisJX1J1bnRpbWVJRF8gKiBtQ29tbXVuaWNhdG9yOworCisJX1J1bnRpbWVJRF8gKiBtQ29tcG9uZW50U2VsZjsKKwlfUnVudGltZUlEXyAqIG1Db21wb25lbnRQYXJlbnQ7CisJX1J1bnRpbWVJRF8gKiBtQ29tcG9uZW50Q29tbXVuaWNhdG9yOworCisJaW50IG1SaWQ7CisKKwlhdm1fb2Zmc2V0X3QgbU9mZnNldDsKKworCUluc3RhbmNlT2ZNYWNoaW5lICogbUluc3RhbmNlOworCisJQkZDb2RlIG9uUnVubmluZzsKKworCitwdWJsaWM6CisJLyoqCisJKiBDT05TVFJVQ1RPUgorCSogRGVmYXVsdAorCSovCisJX1J1bnRpbWVJRF8oX1J1bnRpbWVJRF8gKiBhTW9kZWwsIF9SdW50aW1lSURfICogYVBhcmVudCwKKwkJCWludCBhUGlkLCBhdm1fb2Zmc2V0X3QgYW5PZmZzZXQsIEluc3RhbmNlT2ZNYWNoaW5lICogYW5JbnN0YW5jZSkKKwk6IE5hbWVkRWxlbWVudCggQ0xBU1NfS0lORF9UKCBSdW50aW1lSUQgKSApLAorCW1RdWFsaWZpZWROYW1lSUQoICksCisKKwltRHluYW1pY0xvYWRlZCggZmFsc2UgKSwKKworCW1Nb2RlbCggYU1vZGVsICksCisKKwltUGFyZW50KCBhUGFyZW50ICksCisKKwltQ29tcG9zaXRlQ29tcG9uZW50KCApLAorCW1Db21wb3NpdGVDb21wb25lbnRQYXJlbnQoICksCisKKwltTGlmZWxpbmUoICksCisJbUNvbW11bmljYXRvciggKSwKKworCW1Db21wb25lbnRTZWxmKCApLAorCW1Db21wb25lbnRQYXJlbnQoICksCisJbUNvbXBvbmVudENvbW11bmljYXRvciggKSwKKworCW1SaWQoIGFQaWQgKSwKKwltT2Zmc2V0KCBhbk9mZnNldCApLAorCW1JbnN0YW5jZSggYW5JbnN0YW5jZSApLAorCisJb25SdW5uaW5nKCApCisJeworCQl1cGRhdGVGdWxseVF1YWxpZmllZE5hbWVJRCgpOworCX0KKworCS8qKgorCSogQ09OU1RSVUNUT1IKKwkqIENvcHkKKwkqLworCV9SdW50aW1lSURfKGNvbnN0IF9SdW50aW1lSURfICYgYVJJRCkKKwk6IE5hbWVkRWxlbWVudCggYVJJRCApLAorCW1RdWFsaWZpZWROYW1lSUQoIGFSSUQubVF1YWxpZmllZE5hbWVJRCApLAorCisJbUR5bmFtaWNMb2FkZWQoIGFSSUQubUR5bmFtaWNMb2FkZWQgKSwKKworCW1Nb2RlbCggYVJJRC5tTW9kZWwgKSwKKworCW1QYXJlbnQoIGFSSUQubVBhcmVudCApLAorCisJbUNvbXBvc2l0ZUNvbXBvbmVudCggYVJJRC5tQ29tcG9zaXRlQ29tcG9uZW50ICksCisJbUNvbXBvc2l0ZUNvbXBvbmVudFBhcmVudCggYVJJRC5tQ29tcG9zaXRlQ29tcG9uZW50UGFyZW50ICksCisKKwltTGlmZWxpbmUoIGFSSUQubUxpZmVsaW5lICksCisJbUNvbW11bmljYXRvciggYVJJRC5tQ29tbXVuaWNhdG9yICksCisKKwltQ29tcG9uZW50U2VsZiggYVJJRC5tQ29tcG9uZW50U2VsZiApLAorCW1Db21wb25lbnRQYXJlbnQoIGFSSUQubUNvbXBvbmVudFBhcmVudCApLAorCW1Db21wb25lbnRDb21tdW5pY2F0b3IoIGFSSUQubUNvbXBvbmVudENvbW11bmljYXRvciApLAorCisJbVJpZCggYVJJRC5tUmlkICksCisJbU9mZnNldCggYVJJRC5tT2Zmc2V0ICksCisJbUluc3RhbmNlKCBhUklELm1JbnN0YW5jZSApLAorCisJb25SdW5uaW5nKCBhUklELm9uUnVubmluZyApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSogREVTVFJVQ1RPUgorCSovCisJdmlydHVhbCB+X1J1bnRpbWVJRF8oKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtRnVsbHlRdWFsaWZpZWROYW1lSUQKKwkgKi8KKwl2b2lkIHVwZGF0ZUZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtRnVsbHlRdWFsaWZpZWROYW1lSUQKKwkgKi8KKwlpbmxpbmUgc3RkOjpzdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZUlEKCkgY29uc3QKKwl7CisJCXJldHVybiggbVF1YWxpZmllZE5hbWVJRCApOworCX0KKworCWlubGluZSB2b2lkIHNldFF1YWxpZmllZE5hbWVJRChjb25zdCBzdGQ6OnN0cmluZyAmIGFuVWZpZCkKKwl7CisJCW1RdWFsaWZpZWROYW1lSUQgPSBhblVmaWQ7CisJfQorCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbU5hbWVJRAorCSAqLworCWlubGluZSB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nICYgZ2V0TmFtZUlEKCkgY29uc3QKKwl7CisJCWlmKCBtTmFtZUlELmVtcHR5KCkgKQorCQl7CisJCQlyZXR1cm4oIE5hbWVkRWxlbWVudDo6VU5OQU1FRF9JRCApOworCQl9CisJCXJldHVybiggbU5hbWVJRCApOworCX0KKworCS8qKgorCSAqIEdFVFRFUgorCSAqIEV4ZWN1dGFibGUKKwkgKi8KKwlFeGVjdXRhYmxlRm9ybSAqIGdldEV4ZWN1dGFibGUoKSBjb25zdDsKKworCS8qKgorCSAqIG1SSUQgb2Ygc2hvcnRjdXQKKwkgKi8KKwlpbmxpbmUgc3RhdGljIGludCBtUmlkT2YoX1J1bnRpbWVJRF8gKiBhbkVsZW1lbnQpCisJeworCQlyZXR1cm4oICggYW5FbGVtZW50ICE9IE5VTEwgKSA/IGFuRWxlbWVudC0+bVJpZCA6IC0xICk7CisJfQorCisJLyoqCisJICogU2VyaWFsaXphdGlvbgorCSAqLworCWlubGluZSB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHN0cigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1RdWFsaWZpZWROYW1lSUQgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBzdGQ6OnN0cmluZyBzdHJIZWFkZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUXVhbGlmaWVkTmFtZUlEICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCBzdHJIZWFkZXIoT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQlvcyA8PCBtUXVhbGlmaWVkTmFtZUlEOworCX0KKworCXZpcnR1YWwgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKK307CisKKworY2xhc3MgUnVudGltZUlEIDoKKwkJcHVibGljIEJGLAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIFJ1bnRpbWVJRCApCit7CisKK3ByaXZhdGU6CisJLyoqCisJICogVFlQRURFRgorCSAqLworCXR5cGVkZWYgQkYgYmFzZV90aGlzX3R5cGU7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCVJ1bnRpbWVJRCgpCisJOiBCRiggKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJUnVudGltZUlEKF9SdW50aW1lSURfICogYW5FbGVtZW50KQorCTogQkYoIGFuRWxlbWVudCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlSdW50aW1lSUQoY29uc3QgUnVudGltZUlEICYgYU1vZGVsLCBjb25zdCBSdW50aW1lSUQgJiBhUGFyZW50LAorCQkJaW50IGFQaWQsIGF2bV9vZmZzZXRfdCBhbk9mZnNldCwgSW5zdGFuY2VPZk1hY2hpbmUgKiBhbkluc3RhbmNlKQorCTogQkYoIG5ldyBfUnVudGltZUlEXyhhTW9kZWwucmlkX3BvaW50ZXIoKSwKKwkJCWFQYXJlbnQucmlkX3BvaW50ZXIoKSwgYVBpZCwgYW5PZmZzZXQsIGFuSW5zdGFuY2UpICkKKwl7CisJCWluaXRpYWxpemUoKTsKKwl9CisKKwlSdW50aW1lSUQoY29uc3QgUnVudGltZUlEICYgYVBhcmVudCwgaW50IGFQaWQsCisJCQlhdm1fb2Zmc2V0X3QgYW5PZmZzZXQsIEluc3RhbmNlT2ZNYWNoaW5lICogYW5JbnN0YW5jZSkKKwk6IEJGKCBuZXcgX1J1bnRpbWVJRF8oTlVMTCwKKwkJCWFQYXJlbnQucmlkX3BvaW50ZXIoKSwgYVBpZCwgYW5PZmZzZXQsIGFuSW5zdGFuY2UpICkKKwl7CisJCWluaXRpYWxpemUoKTsKKwl9CisKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCVJ1bnRpbWVJRChjb25zdCBSdW50aW1lSUQgJiBhUklEKQorCTogQkYoIGFSSUQgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJZXhwbGljaXQgUnVudGltZUlEKGNvbnN0IEJGICYgb3RoZXIpCisJOiBCRiggKCBvdGhlci5pczwgUnVudGltZUlEID4oKSApID8gb3RoZXIgOiBSdW50aW1lSUQ6OlJFRl9OVUxMICkKKwl7CisJCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggb3RoZXIuaW52YWxpZCgpIHx8IG90aGVyLmlzPCBBdm1Db2RlID4oKSApCisJCQkJPDwgIkludmFsaWQgQ29uc3RydWN0b3IgQ2FzdCBvZiBhIEJGIHRvIGEgUnVudGltZUlEICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisJfQorCisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIG90aGVyCisJICovCisJdm9pZCBjcmVhdGUoaW50IGFQaWQsIGF2bV9vZmZzZXRfdCBhbk9mZnNldCwgSW5zdGFuY2VPZk1hY2hpbmUgKiBhbkluc3RhbmNlKQorCXsKKwkJcmVsZWFzZSggbmV3IF9SdW50aW1lSURfKE5VTEwsIE5VTEwsIGFQaWQsIGFuT2Zmc2V0LCBhbkluc3RhbmNlKSApOworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgflJ1bnRpbWVJRCgpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBpbml0aWFsaXplCisJICogZmluYWxpemUKKwkgKi8KKwl2b2lkIGluaXRpYWxpemUoKTsKKworCWlubGluZSB2b2lkIGZpbmFsaXplKCkKKwl7CisJCS8vIEF0dGVudGlvbjo+IE5lY2Vzc2FpcmUgcG91ciBicmlzZXIgZGVzIHJlZmVyZW5jZXMgY2lyY3VsYWlyZXMgISEhIQorCQlyaWRfcG9pbnRlcigpLT5vblJ1bm5pbmcuZGVzdHJveSgpOworCX0KKworCisJLyoqCisJICogR0VUVEVSICBBUEkKKwkgKiBTcGVjaWZpZXIKKwkgKi8KKwljb25zdCBTcGVjaWZpZXIgJiBnZXRTcGVjaWZpZXIoKSBjb25zdDsKKworCisJLyoqCisJICogQ0FTVAorCSAqLworCWlubGluZSBfUnVudGltZUlEXyAqIHJpZF9wb2ludGVyKCkgY29uc3QKKwl7CisJCXJldHVybiggc3RhdGljX2Nhc3Q8IF9SdW50aW1lSURfICogPiggYmFzZV90aGlzX3R5cGU6Om1QVFIgKSAgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1OYW1lSUQKKwkgKi8KKwlpbmxpbmUgYm9vbCBpc0R5bmFtaWNMb2FkZWQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCByaWRfcG9pbnRlcigpLT5tRHluYW1pY0xvYWRlZCApOworCX0KKworCWlubGluZSB2b2lkIHNldER5bmFtaWNMb2FkZWQoYm9vbCBpc0R5bmFtaWMgPSB0cnVlKQorCXsKKwkJcmlkX3BvaW50ZXIoKS0+bUR5bmFtaWNMb2FkZWQgPSBpc0R5bmFtaWM7CisJfQorCisJaW5saW5lIGJvb2wgaXNTdGF0aWNMb2FkZWQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBub3QgcmlkX3BvaW50ZXIoKS0+bUR5bmFtaWNMb2FkZWQgKTsKKwl9CisKKwkvKioKKwkgKiBBU1NJR05NRU5UCisJICovCisJaW5saW5lIFJ1bnRpbWVJRCAmIG9wZXJhdG9yPShjb25zdCBCRiAmIG90aGVyKQorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKAorCQkJCW90aGVyLmludmFsaWQoKSB8fCBvdGhlci5pczwgUnVudGltZUlEID4oKSApCisJCQkJPDwgIkludmFsaWQgQXNzaWdubWVudCBDYXN0IG9mIGEgQkYgdG8gYSBSdW50aW1lSUQgISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQlpZiggYmFzZV90aGlzX3R5cGU6Om1QVFIgIT0gb3RoZXIucmF3X3BvaW50ZXIoKSApCisJCXsKKwkJCXJlbGVhc2VfYWNxdWlyZSggb3RoZXIucmF3X3BvaW50ZXIoKSApOworCQl9CisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKworCS8qKgorCSAqIENPTVBBUklTT04KKwkgKiBPUEVSQVRPUgorCSAqLworCWlubGluZSBpbnQgY29tcGFyZShjb25zdCBSdW50aW1lSUQgJiBvdGhlcikgY29uc3QKKwl7CisJCXJldHVybiggKGJhc2VfdGhpc190eXBlOjptUFRSID09IG90aGVyLmJhc2VfdGhpc190eXBlOjptUFRSICkgPyAwIDoKKwkJCQlyaWRfcG9pbnRlcigpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpLmNvbXBhcmUoCisJCQkJCQlvdGhlci5yaWRfcG9pbnRlcigpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpKSApOworCX0KKworCWlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgUnVudGltZUlEICYgb3RoZXIpIGNvbnN0CisJeworCQlyZXR1cm4oIGJhc2VfdGhpc190eXBlOjptUFRSID09IG90aGVyLmJhc2VfdGhpc190eXBlOjptUFRSICk7CisJfQorCisJaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBCRiAmIG90aGVyKSBjb25zdAorCXsKKwkJcmV0dXJuKCBiYXNlX3RoaXNfdHlwZTo6bVBUUiA9PSBvdGhlci5yYXdfcG9pbnRlcigpICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFJ1bnRpbWVJRCAmIG90aGVyKSBjb25zdAorCXsKKwkJcmV0dXJuKCBiYXNlX3RoaXNfdHlwZTo6bVBUUiAhPSBvdGhlci5iYXNlX3RoaXNfdHlwZTo6bVBUUiApOworCX0KKworCWlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgQkYgJiBvdGhlcikgY29uc3QKKwl7CisJCXJldHVybiggYmFzZV90aGlzX3R5cGU6Om1QVFIgIT0gb3RoZXIucmF3X3BvaW50ZXIoKSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUZ1bGx5UXVhbGlmaWVkTmFtZUlECisJICovCisJc3RkOjpzdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSBjb25zdDsKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1RdWFsaWZpZWROYW1lSUQKKwkgKi8KKwlpbmxpbmUgc3RkOjpzdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZUlEKCkgY29uc3QKKwl7CisJCXJldHVybiggcmlkX3BvaW50ZXIoKS0+bVF1YWxpZmllZE5hbWVJRCApOworCX0KKworCWlubGluZSB2b2lkIHNldFF1YWxpZmllZE5hbWVJRChjb25zdCBzdGQ6OnN0cmluZyAmIGFuVWZpZCkKKwl7CisJCXJpZF9wb2ludGVyKCktPm1RdWFsaWZpZWROYW1lSUQgPSBhblVmaWQ7CisJfQorCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbU5hbWVJRAorCSAqLworCWlubGluZSBzdGQ6OnN0cmluZyBnZXROYW1lSUQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCByaWRfcG9pbnRlcigpLT5nZXROYW1lSUQoKSApOworCX0KKworCWlubGluZSB2b2lkIHNldE5hbWVJRChjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpCisJeworCQlyaWRfcG9pbnRlcigpLT5zZXROYW1lSUQoIGFOYW1lSUQgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1QaWQKKwkgKi8KKwlpbmxpbmUgaW50IGdldFJpZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHJpZF9wb2ludGVyKCktPm1SaWQgKTsKKwl9CisKKwlpbmxpbmUgc3RkOjpzdHJpbmcgc3RyUGlkKCkgY29uc3QKKwl7CisJCXJldHVybiggT1NTKCkgPDwgInBpZCMiIDw8IGdldFJpZCgpICk7CisJfQorCisJaW5saW5lIHN0ZDo6c3RyaW5nIHN0clVuaXFJZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIE9TUygpIDw8ICJwaWQjIiA8PCBnZXRSaWQoKSA8PCAiOiIgPDwgZ2V0TmFtZUlEKCkgKTsKKwl9CisKKworCS8qKgorCSAqIFV0aWwgZm9yIHNob3J0Y3V0CisJICovCisJaW5saW5lIHN0YXRpYyBSdW50aW1lSUQgc21hcnRQb2ludGVyT2YoX1J1bnRpbWVJRF8gKiBhbkVsZW1lbnQpCisJeworCQlpZiggYW5FbGVtZW50ICE9IE5VTEwgKQorCQl7CisJCQlhbkVsZW1lbnQtPmluY3JSZWZDb3VudCgpOworCQl9CisKKwkJcmV0dXJuKCBSdW50aW1lSUQoIGFuRWxlbWVudCApICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBpbnQgbVJpZE9mKF9SdW50aW1lSURfICogYW5FbGVtZW50KQorCXsKKwkJcmV0dXJuKCAoIGFuRWxlbWVudCAhPSBOVUxMICkgPyBhbkVsZW1lbnQtPm1SaWQgOiAtMSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVBhcmVudAorCSAqLworCWlubGluZSBSdW50aW1lSUQgZ2V0UFJJRCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHNtYXJ0UG9pbnRlck9mKCByaWRfcG9pbnRlcigpLT5tUGFyZW50ICkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNQUklEKCkgY29uc3QKKwl7CisJCXJldHVybiggcmlkX3BvaW50ZXIoKS0+bVBhcmVudCE9IE5VTEwgKTsKKwl9CisKKwlpbmxpbmUgaW50IGdldFBSaWQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUmlkT2YoIHJpZF9wb2ludGVyKCktPm1QYXJlbnQgKSApOworCX0KKworCWlubGluZSBpbnQgZ2V0UE9mZnNldCgpIGNvbnN0CisJeworCQlyZXR1cm4oICggcmlkX3BvaW50ZXIoKS0+bVBhcmVudCAhPSBOVUxMICkgPworCQkJCXJpZF9wb2ludGVyKCktPm1QYXJlbnQtPm1PZmZzZXQgOiAwICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtT2Zmc2V0CisJICovCisJaW5saW5lIGF2bV9vZmZzZXRfdCBnZXRPZmZzZXQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCByaWRfcG9pbnRlcigpLT5tT2Zmc2V0ICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0T2Zmc2V0KGF2bV9vZmZzZXRfdCBhbk9mZnNldCkKKwl7CisJCXJpZF9wb2ludGVyKCktPm1PZmZzZXQgPSBhbk9mZnNldDsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1JbnN0YW5jZQorCSAqIHNvbiBFeGVjdXRhYmxlCisJICogc2VzIHZhcmlhYmxlcworCSAqLworCisJaW5saW5lIEluc3RhbmNlT2ZNYWNoaW5lICogZ2V0SW5zdGFuY2UoKSBjb25zdAorCXsKKwkJcmV0dXJuKCByaWRfcG9pbnRlcigpLT5tSW5zdGFuY2UgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNJbnN0YW5jZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIHJpZF9wb2ludGVyKCktPm1JbnN0YW5jZSAhPSBOVUxMICk7CisJfQorCisKKwljb25zdCBJbnN0YW5jZU9mTWFjaGluZSAqIGdldE1vZGVsSW5zdGFuY2UoKSBjb25zdDsKKworCWJvb2wgaGFzTW9kZWxJbnN0YW5jZSgpIGNvbnN0OworCisKKwlFeGVjdXRhYmxlRm9ybSAqIGdldEV4ZWN1dGFibGUoKSBjb25zdDsKKworCWJvb2wgaGFzRXhlY3V0YWJsZSgpIGNvbnN0OworCisKKwljb25zdCBCRiAmIGdldFZhcmlhYmxlKGF2bV9vZmZzZXRfdCBvZmZzZXQpIGNvbnN0OworCisJSW5zdGFuY2VPZkRhdGEgKiByYXdWYXJpYWJsZShhdm1fb2Zmc2V0X3Qgb2Zmc2V0KSBjb25zdDsKKworCWJvb2wgaGFzVmFyaWFibGUoKSBjb25zdDsKKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogSW5zdGFuY2UtPm1PbkNyZWF0ZQorCSAqLworCWNvbnN0IEJGQ29kZSAmIGdldE9uQ3JlYXRlKCkgY29uc3Q7CisKKwlib29sIGhhc09uQ3JlYXRlKCkgY29uc3Q7CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBJbnN0YW5jZS0+bU9uU3RhcnQKKwkgKi8KKwljb25zdCBCRkNvZGUgJiBnZXRPblN0YXJ0KCkgY29uc3Q7CisKKwlib29sIGhhc09uU3RhcnQoKSBjb25zdDsKKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVJ1bm5pbmcKKwkgKi8KKwlpbmxpbmUgY29uc3QgQkZDb2RlICYgZ2V0T25SdW5uaW5nKCkgY29uc3QKKwl7CisJCXJldHVybiggcmlkX3BvaW50ZXIoKS0+b25SdW5uaW5nICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzT25SdW5uaW5nKCkgY29uc3QKKwl7CisJCXJldHVybiggcmlkX3BvaW50ZXIoKS0+b25SdW5uaW5nLnZhbGlkKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRPblJ1bm5pbmcoY29uc3QgQkZDb2RlICYgYVByb2dyYW0pCisJeworCQlyaWRfcG9pbnRlcigpLT5vblJ1bm5pbmcgPSBhUHJvZ3JhbTsKKwl9CisKKworCWlubGluZSBSdW50aW1lSUQgZ2V0TW9kZWwoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBzbWFydFBvaW50ZXJPZiggcmlkX3BvaW50ZXIoKS0+bU1vZGVsICkgKTsKKwl9CisKKwlpbmxpbmUgaW50IGdldE1vZGVsUmlkKCkgY29uc3QKKwl7CisJCXJldHVybiggbVJpZE9mKCByaWRfcG9pbnRlcigpLT5tTW9kZWwgKSApOworCX0KKworCWlubGluZSBib29sIGhhc01vZGVsKCkgY29uc3QKKwl7CisJCXJldHVybiggcmlkX3BvaW50ZXIoKS0+bU1vZGVsICE9IE5VTEwgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1QYXJlbnQKKwkgKi8KKwlpbmxpbmUgUnVudGltZUlEIGdldFBhcmVudCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHNtYXJ0UG9pbnRlck9mKCByaWRfcG9pbnRlcigpLT5tUGFyZW50ICkgKTsKKwl9CisKKwlpbmxpbmUgaW50IGdldFBhcmVudFJpZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1SaWRPZiggcmlkX3BvaW50ZXIoKS0+bVBhcmVudCApICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzUGFyZW50KCkgY29uc3QKKwl7CisJCXJldHVybiggcmlkX3BvaW50ZXIoKS0+bVBhcmVudCAhPSBOVUxMICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBBbmNlc3RvcgorCSAqLworCWlubGluZSBib29sIGlzQW5jZXN0b3JPZihjb25zdCBSdW50aW1lSUQgJiBhUklEKSBjb25zdAorCXsKKwkJcmV0dXJuKCBhUklELnZhbGlkKCkgJiYgYVJJRC5oYXNBc0FuY2VzdG9yKCAqdGhpcyApICk7CisJfQorCisJYm9vbCBoYXNBc0FuY2VzdG9yKGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQpIGNvbnN0OworCisJYm9vbCBoYXNBc0FuY2VzdG9yKGNvbnN0IEluc3RhbmNlT2ZNYWNoaW5lICogYW5JbnN0YW5jZSkgY29uc3Q7CisKKwlSdW50aW1lSUQgZ2V0QW5jZXN0b3JDb250YWluaW5nKGNvbnN0IEJhc2VJbnN0YW5jZUZvcm0gKiBhbkluc3RhbmNlKSBjb25zdDsKKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUNvbXBvc2l0ZUNvbXBvbmVudAorCSAqLworCWlubGluZSBSdW50aW1lSUQgZ2V0Q29tcG9zaXRlQ29tcG9uZW50KCkgY29uc3QKKwl7CisJCWlmKCByaWRfcG9pbnRlcigpLT5tQ29tcG9zaXRlQ29tcG9uZW50ICE9IE5VTEwgKQorCQl7CisJCQlyaWRfcG9pbnRlcigpLT5tQ29tcG9zaXRlQ29tcG9uZW50LT5pbmNyUmVmQ291bnQoKTsKKwkJfQorCisJCXJldHVybiggUnVudGltZUlEKCByaWRfcG9pbnRlcigpLT5tQ29tcG9zaXRlQ29tcG9uZW50KSApOworCX0KKworCWlubGluZSBpbnQgZ2V0Q29tcG9zaXRlQ29tcG9uZW50UmlkKCkgY29uc3QKKwl7CisJCXJldHVybiggKCBoYXNDb21wb3NpdGVDb21wb25lbnQoKSApID8KKwkJCQlyaWRfcG9pbnRlcigpLT5tQ29tcG9zaXRlQ29tcG9uZW50LT5tUmlkIDogLTEgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNDb21wb3NpdGVDb21wb25lbnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCByaWRfcG9pbnRlcigpLT5tQ29tcG9zaXRlQ29tcG9uZW50ICE9IE5VTEwgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1Db21wb3NpdGVDb21wb25lbnRQYXJlbnQKKwkgKi8KKwlpbmxpbmUgUnVudGltZUlEIGdldENvbXBvc2l0ZUNvbXBvbmVudFBhcmVudCgpIGNvbnN0CisJeworCQlpZiggcmlkX3BvaW50ZXIoKS0+bUNvbXBvc2l0ZUNvbXBvbmVudFBhcmVudCAhPSBOVUxMICkKKwkJeworCQkJcmlkX3BvaW50ZXIoKS0+bUNvbXBvc2l0ZUNvbXBvbmVudFBhcmVudC0+aW5jclJlZkNvdW50KCk7CisJCX0KKworCQlyZXR1cm4oIFJ1bnRpbWVJRCgKKwkJCQlyaWRfcG9pbnRlcigpLT5tQ29tcG9zaXRlQ29tcG9uZW50UGFyZW50ICkgKTsKKwl9CisKKwlpbmxpbmUgaW50IGdldENvbXBvc2l0ZUNvbXBvbmVudFBhcmVudFJpZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1SaWRPZiggcmlkX3BvaW50ZXIoKS0+bUNvbXBvc2l0ZUNvbXBvbmVudFBhcmVudCApICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzQ29tcG9zaXRlQ29tcG9uZW50UGFyZW50KCkgY29uc3QKKwl7CisJCXJldHVybiggcmlkX3BvaW50ZXIoKS0+bUNvbXBvc2l0ZUNvbXBvbmVudFBhcmVudCAhPSBOVUxMICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiB0aGUgTGlmZWxpbmUgQW5jZXN0b3IgY29udGFpbmVyCisJICovCisJUnVudGltZUlEIGdldExpZmVsaW5lKEluc3RhbmNlT2ZNYWNoaW5lICogYU1hY2hpbmUpIGNvbnN0OworCisJUnVudGltZUlEIGdldExpZmVsaW5lKEluc3RhbmNlT2ZQb3J0ICogYVBvcnQpIGNvbnN0OworCisJaW5saW5lIFJ1bnRpbWVJRCBnZXRMaWZlbGluZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIHNtYXJ0UG9pbnRlck9mKCByaWRfcG9pbnRlcigpLT5tTGlmZWxpbmUgKSApOworCX0KKworCWlubGluZSBpbnQgZ2V0TGlmZWxpbmVSaWQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUmlkT2YoIHJpZF9wb2ludGVyKCktPm1MaWZlbGluZSApICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzTGlmZWxpbmUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCByaWRfcG9pbnRlcigpLT5tTGlmZWxpbmUgIT0gTlVMTCApOworCX0KKworCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiB0aGUgQ29tbXVuaWNhdG9yIEFuY2VzdG9yIGNvbnRhaW5lcgorCSAqLworCVJ1bnRpbWVJRCBnZXRDb21tdW5pY2F0b3IoSW5zdGFuY2VPZk1hY2hpbmUgKiBhTWFjaGluZSkgY29uc3Q7CisKKwlSdW50aW1lSUQgZ2V0Q29tbXVuaWNhdG9yKEluc3RhbmNlT2ZQb3J0ICogYVBvcnQpIGNvbnN0OworCisJaW5saW5lIFJ1bnRpbWVJRCBnZXRDb21tdW5pY2F0b3IoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBzbWFydFBvaW50ZXJPZiggcmlkX3BvaW50ZXIoKS0+bUNvbW11bmljYXRvciApICk7CisJfQorCisJaW5saW5lIGludCBnZXRDb21tdW5pY2F0b3JSaWQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUmlkT2YoIHJpZF9wb2ludGVyKCktPm1Db21tdW5pY2F0b3IgKSApOworCX0KKworCWlubGluZSBib29sIGhhc0NvbW11bmljYXRvcigpIGNvbnN0CisJeworCQlyZXR1cm4oIHJpZF9wb2ludGVyKCktPm1Db21tdW5pY2F0b3IgIT0gTlVMTCApOworCX0KKworCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiB0aGUgZmlyc3QgaGllcmFyY2hpY2FsIG1haW4gQ29tcG9uZW50IGNvbnRhaW5lcgorCSAqLworCWlubGluZSBSdW50aW1lSUQgZ2V0Q29tcG9uZW50U2VsZigpIGNvbnN0CisJeworCQlyZXR1cm4oIHNtYXJ0UG9pbnRlck9mKCByaWRfcG9pbnRlcigpLT5tQ29tcG9uZW50U2VsZiApICk7CisJfQorCisJaW5saW5lIGludCBnZXRDb21wb25lbnRTZWxmUmlkKCkgY29uc3QKKwl7CisJCXJldHVybiggbVJpZE9mKCByaWRfcG9pbnRlcigpLT5tQ29tcG9uZW50U2VsZiApICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzQ29tcG9uZW50U2VsZigpIGNvbnN0CisJeworCQlyZXR1cm4oIHJpZF9wb2ludGVyKCktPm1Db21wb25lbnRTZWxmICE9IE5VTEwgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIHRoZSBmaXJzdCBoaWVyYXJjaGljYWwgbWFpbiBDb21wb25lbnQgY29udGFpbmVyCisJICovCisJaW5saW5lIFJ1bnRpbWVJRCBnZXRDb21wb25lbnRQYXJlbnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBzbWFydFBvaW50ZXJPZiggcmlkX3BvaW50ZXIoKS0+bUNvbXBvbmVudFBhcmVudCApICk7CisJfQorCisJaW5saW5lIGludCBnZXRDb21wb25lbnRQYXJlbnRSaWQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUmlkT2YoIHJpZF9wb2ludGVyKCktPm1Db21wb25lbnRQYXJlbnQgKSApOworCX0KKworCWlubGluZSBib29sIGhhc0NvbXBvbmVudFBhcmVudCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHJpZF9wb2ludGVyKCktPm1Db21wb25lbnRQYXJlbnQgIT0gTlVMTCApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogdGhlIGZpcnN0IGhpZXJhcmNoaWNhbCBtYWluIENvbXBvbmVudCBjb250YWluZXIKKwkgKi8KKwlpbmxpbmUgUnVudGltZUlEIGdldENvbXBvbmVudENvbW11bmljYXRvcigpIGNvbnN0CisJeworCQlpZiggcmlkX3BvaW50ZXIoKS0+bUNvbXBvbmVudENvbW11bmljYXRvciAhPSBOVUxMICkKKwkJeworCQkJcmlkX3BvaW50ZXIoKS0+bUNvbXBvbmVudENvbW11bmljYXRvci0+aW5jclJlZkNvdW50KCk7CisJCX0KKworCQlyZXR1cm4oIFJ1bnRpbWVJRCggcmlkX3BvaW50ZXIoKS0+bUNvbXBvbmVudENvbW11bmljYXRvcikgKTsKKwl9CisKKwlpbmxpbmUgaW50IGdldENvbXBvbmVudENvbW11bmljYXRvclJpZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1SaWRPZiggcmlkX3BvaW50ZXIoKS0+bUNvbXBvbmVudENvbW11bmljYXRvciApICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzQ29tcG9uZW50Q29tbXVuaWNhdG9yKCkgY29uc3QKKwl7CisJCXJldHVybiggcmlkX3BvaW50ZXIoKS0+bUNvbXBvbmVudENvbW11bmljYXRvciAhPSBOVUxMICk7CisJfQorCisKKwkvKioKKwkgKiBERUZBVUxUIE5VTEwKKwkgKi8KKwlzdGF0aWMgUnVudGltZUlEIFJFRl9OVUxMOworCisKKyAgIC8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwlpbmxpbmUgdmlydHVhbCBzdGQ6OnN0cmluZyB0b1N0cmluZygKKwkJCWNvbnN0IEF2bUluZGVudCAmIGluZGVudCA9IEFWTV9UQUJfSU5ERU5UKSBjb25zdAorCXsKKwkJU3RyaW5nT3V0U3RyZWFtIG9zcyhpbmRlbnQpOworCisJCXRvU3RyZWFtKG9zcyk7CisKKwkJcmV0dXJuKCBvc3Muc3RyKCkgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBzdGQ6OnN0cmluZyBzdHIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAoIGJhc2VfdGhpc190eXBlOjptUFRSID09IE5VTEwgKSA/CisJCQkJIlJ1bnRpbWVJRDxudWxsPiIgIDogcmlkX3BvaW50ZXIoKS0+c3RyKCkgKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIHZvaWQgQVZNX0RFQlVHX1JFRl9DT1VOVEVSKE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJaWYoIGJhc2VfdGhpc190eXBlOjptUFRSICE9IE5VTEwgKQorCQl7CisJCQliYXNlX3RoaXNfdHlwZTo6bVBUUi0+QVZNX0RFQlVHX1JFRl9DT1VOVEVSKG9zKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW9zIDw8ICJSdW50aW1lSUQ8bnVsbCwgcmVmOjA+IiA8PCBzdGQ6OmZsdXNoOworCQl9CisJfQorCisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgQVZNX0RFQlVHX1JFRl9DT1VOVEVSKCkgY29uc3QKKwl7CisJCXJldHVybiggKCBiYXNlX3RoaXNfdHlwZTo6bVBUUiAhPSBOVUxMICkKKwkJCQk/IGJhc2VfdGhpc190eXBlOjptUFRSLT5BVk1fREVCVUdfUkVGX0NPVU5URVIoKQorCQkJCTogIlJ1bnRpbWVJRDxudWxsLCByZWY6MD4iICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgc3RySGVhZGVyKCkgY29uc3QKKwl7CisJCXJldHVybiggKCBiYXNlX3RoaXNfdHlwZTo6bVBUUiA9PSBOVUxMICkgPworCQkJCSJSdW50aW1lSUQ8bnVsbD4iICA6IHJpZF9wb2ludGVyKCktPnN0ckhlYWRlcigpICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCBzdHJIZWFkZXIoT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQlpZiggYmFzZV90aGlzX3R5cGU6Om1QVFIgIT0gTlVMTCApCisJCXsKKwkJCXJpZF9wb2ludGVyKCktPnN0ckhlYWRlcihvcyk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlvcyA8PCAiUnVudGltZUlEPG51bGw+IiA8PCBzdGQ6OmZsdXNoOworCQl9CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJaWYoIGJhc2VfdGhpc190eXBlOjptUFRSICE9IE5VTEwgKQorCQl7CisJCQlyaWRfcG9pbnRlcigpLT50b1N0cmVhbShvcyk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlvcyA8PCAiUnVudGltZUlEPG51bGw+IiA8PCBzdGQ6OmZsdXNoOworCQl9CisJfQorCisJLyoKKwkgKiAhVU5VU0VEIQorCWlubGluZSBzdGF0aWMgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcywKKwkJCWNvbnN0IFZlY3RvcjwgUnVudGltZUlEID4gJiBhVGFibGUsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFTZWN0aW9uTmFtZSA9ICJjaGlsZCIpCisJeworCQlvcyA8PCBUQUIgPDwgYVNlY3Rpb25OYW1lOworCitBVk1fSUZfREVCVUdfTEVWRUxfR1RFX01FRElVTQorCisJCW9zIDw8IEVPTF9JTkNSX0lOREVOVDsKKwkJVmVjdG9yPCBSdW50aW1lSUQgPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBhVGFibGUuYmVnaW4oKTsKKwkJVmVjdG9yPCBSdW50aW1lSUQgPjo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBhVGFibGUuZW5kKCk7CisJCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQorCQl7CisJQVZNX0lGX0RFQlVHX0xFVkVMX0dURV9ISUdICisKKwkJCSgqaXQpLnRvU3RyZWFtKG9zKTsKKworCUFWTV9ERUJVR19FTFNFCisKKwkJCW9zIDw8IFRBQiA8PCAoKml0KS5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8IEVPTDsKKworCUFWTV9FTkRJRl9ERUJVR19MRVZFTF9HVEVfSElHSAorCQl9CisJCW9zIDw8IERFQ1JfSU5ERU5UOworCitBVk1fRUxTRUlGX0RFQlVHX0xFVkVMX0dURV9MT1cKKworCQlvcyA8PCAiID0gW3wgIjsKKwkJVmVjdG9yPCBSdW50aW1lSUQgPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBhVGFibGUuYmVnaW4oKTsKKwkJVmVjdG9yPCBSdW50aW1lSUQgPjo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBhVGFibGUuZW5kKCk7CisJCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQorCQl7CisJCQlvcyA8PCAoKml0KS5nZXRPZmZzZXQoKSA8PCAiICI7CisJCX0KKwkJb3MgPDwgInxdOyIgPDwgRU9MOworCitBVk1fRU5ESUZfREVCVUdfTEVWRUxfR1RFX0xPVworCisJCW9zIDw8IHN0ZDo6Zmx1c2g7CisJfQorCSogIVVOVVNFRCEKKwkqLworCit9OworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVFlQRSBERUZJTklUSU9OIGZvciBTTUFSVCBQT0lOVEVSIGFuZCBDT05UQUlORVIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjbGFzcyBUYWJsZU9mUnVudGltZUlEIDogIHB1YmxpYyBBdm1PYmplY3QgLAorCXB1YmxpYyBWZWN0b3I8IFJ1bnRpbWVJRCA+LAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIFRhYmxlT2ZSdW50aW1lSUQgKQoreworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIFRhYmxlT2ZSdW50aW1lSUQgKQorCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlUYWJsZU9mUnVudGltZUlEKCkKKwk6IEF2bU9iamVjdCggKSwKKwlWZWN0b3I8IFJ1bnRpbWVJRCA+KCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCVRhYmxlT2ZSdW50aW1lSUQoY29uc3QgVGFibGVPZlJ1bnRpbWVJRCAmIGFUYWJsZSkKKwk6IEF2bU9iamVjdCggYVRhYmxlICksCisJVmVjdG9yPCBSdW50aW1lSUQgPiggYVRhYmxlICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgflRhYmxlT2ZSdW50aW1lSUQoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCit9OworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVFlQRSBERUZJTklUSU9OIGZvciBTTUFSVCBQT0lOVEVSIGFuZCBDT05UQUlORVIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitBVk1fREVGSU5FX0FQX0NMQVNTKCBUYWJsZU9mUnVudGltZUlEICkKKworCisKK30KKworI2VuZGlmIC8qUlVOVElNRUZPUk1JRF9IXyovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvcnVudGltZS9SdW50aW1lTGliLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL1J1bnRpbWVMaWIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZjE5YjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvcnVudGltZS9SdW50aW1lTGliLmNwcApAQCAtMCwwICsxLDY1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTMganVpbC4gMjAwOAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiUnVudGltZUxpYi5oIgorCisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlTGliLmg+CisKKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lRm9ybS5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL1J1bnRpbWVJRC5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvKioKKyAqIFBSRSBERUZJTkVEIFJVTlRJTUUgTUFDSElORQorICovCitSdW50aW1lSUQgUnVudGltZUxpYjo6UklEX05JTDsKKworUnVudGltZUlEIFJ1bnRpbWVMaWI6OlJJRF9FTlZJUk9OTUVOVDsKKworCisvKioKKyAqIExPQURFUgorICovCit2b2lkIFJ1bnRpbWVMaWI6OmxvYWQoKQoreworCVJJRF9OSUwuY3JlYXRlKC0xLCAwLCBFeGVjdXRhYmxlTGliOjpNQUNISU5FX05VTEwucmF3TWFjaGluZSgpKTsKKwlSSURfTklMLnNldFF1YWxpZmllZE5hbWVJRCgibnVsbCNtYWNoaW5lIiAvKiJudWxsPCBtYWNoaW5lID4iKi8pOworCisJRXhlY3V0YWJsZUxpYjo6TUFDSElORV9OVUxMLnNldFJ1bnRpbWVSSUQoIFJJRF9OSUwgKTsKKworCVJJRF9FTlZJUk9OTUVOVC5jcmVhdGUoLTIsIDAsCisJCQlFeGVjdXRhYmxlTGliOjpNQUNISU5FX0VOVklST05NRU5ULnJhd01hY2hpbmUoKSk7CisJUklEX0VOVklST05NRU5ULnNldFF1YWxpZmllZE5hbWVJRCgiZW52Iik7Cit9CisKKworLyoqCisgKiBESVNQT1NFUgorICovCit2b2lkIFJ1bnRpbWVMaWI6OmRpc3Bvc2UoKQoreworCVJJRF9OSUwuZGVzdHJveSgpOworCisJUklEX0VOVklST05NRU5ULmRlc3Ryb3koKTsKK30KKworCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL1J1bnRpbWVMaWIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL1J1bnRpbWVMaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MThjYzljCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3J1bnRpbWUvUnVudGltZUxpYi5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxMyBqdWlsLiAyMDA4CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgUlVOVElNRUxJQl9IXworI2RlZmluZSBSVU5USU1FTElCX0hfCisKKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lRm9ybS5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL1J1bnRpbWVJRC5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjbGFzcyBSdW50aW1lTGliCit7CisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlSdW50aW1lTGliKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5SdW50aW1lTGliKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogTE9BREVSIC0gRElTUE9TRVIKKwkgKi8KKwlzdGF0aWMgdm9pZCBsb2FkKCk7CisJc3RhdGljIHZvaWQgZGlzcG9zZSgpOworCisKKworCS8qKgorCSAqIFBSRSBERUZJTkVEIFJVTlRJTUUgTUFDSElORQorCSAqLworCisJc3RhdGljIFJ1bnRpbWVJRCBSSURfTklMOworCisJc3RhdGljIFJ1bnRpbWVJRCBSSURfRU5WSVJPTk1FTlQ7CisKK307CisKKworfQorCisjZW5kaWYgLyogUlVOVElNRUxJQl9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3J1bnRpbWUvUnVudGltZVF1ZXJ5LmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL1J1bnRpbWVRdWVyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE3Yjk1NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL1J1bnRpbWVRdWVyeS5jcHAKQEAgLTAsMCArMSw4NTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxOSBtYXJzIDIwMTQKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlJ1bnRpbWVRdWVyeS5oIgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZVF1ZXJ5Lmg+CisKKyNpbmNsdWRlIDxmbWwvd29ya2Zsb3cvVW5pRm9ybUlkZW50aWZpZXIuaD4KKyNpbmNsdWRlIDxmbWwvd29ya2Zsb3cvV09iamVjdC5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNUQVRJQyBUT09MUworLy8gVXNlZCBkdXJpbmcgY29uZmlndXJhdGlvbiBzdGVwCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCisgKiBTRUFSQ0gKKyAqIFN5bWJvbAorICogIVVOVVNFRCEKKyAqCitjb25zdCBCRiAmIFJ1bnRpbWVRdWVyeTo6c2VhcmNoU3ltYm9sKFdPYmplY3QgKiBhV1Byb3BlcnR5KQoreworCWNvbnN0IHN0ZDo6c3RyaW5nICYga2luZCA9IGFXUHJvcGVydHktPmdldE5hbWVJRCgpOworCWNvbnN0IHN0ZDo6c3RyaW5nICYgcW5pZCA9IGFXUHJvcGVydHktPnRvU3RyaW5nVmFsdWUoKTsKKworCUV4ZWN1dGFibGVRdWVyeSBYUXVlcnkoIG1Db25maWd1cmF0aW9uICk7CisKKwlpZiggKGtpbmQgPT0gInZhcmlhYmxlIikgfHwgKGtpbmQgPT0gInZhciIpICkKKwl7CisJCWNvbnN0IEJGICYgYVN5bWJvbCA9IFhRdWVyeS5nZXREYXRhQnlRdWFsaWZpZWROYW1lSUQoIHFuaWQgKTsKKwkJaWYoIGFTeW1ib2wudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggYVN5bWJvbCApOworCQl9CisJfQorCisJZWxzZSBpZiggKGtpbmQgPT0gIm1vZGVsIikgfHwgKGtpbmQgPT0gImZvcm0iKSApCisJeworCQljb25zdCBCRiAmIGFTeW1ib2wgPSBYUXVlcnkuc2VhcmNoTWFjaGluZSgKKwkJCQlTcGVjaWZpZXI6OkRFU0lHTl9NT0RFTF9LSU5ELCBxbmlkKTsKKwkJaWYoIGFTeW1ib2wudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggYVN5bWJvbCApOworCQl9CisJfQorCisJZWxzZSBpZigga2luZCA9PSAiaW5zdGFuY2UiICkKKwl7CisJCWNvbnN0IEJGICYgYVN5bWJvbCA9IFhRdWVyeS5zZWFyY2hNYWNoaW5lKAorCQkJCVNwZWNpZmllcjo6REVTSUdOX0lOU1RBTkNFX0tJTkQsIHFuaWQgKTsKKwkJaWYoIGFTeW1ib2wudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggYVN5bWJvbCApOworCQl9CisJfQorCisJZWxzZSBpZigga2luZCA9PSAiZXhlY3V0YWJsZSIgKQorCXsKKwkJY29uc3QgQkYgJiBhbkV4ZWN1dGFibGUgPSBYUXVlcnkuZ2V0RXhlY3V0YWJsZUJ5UXVhbGlmaWVkTmFtZUlEKCBxbmlkICk7CisJCWlmKCBhbkV4ZWN1dGFibGUudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggYW5FeGVjdXRhYmxlICk7CisJCX0KKwl9CisKKwllbHNlIGlmKCBraW5kID09ICJ0cmFuc2l0aW9uIiApCisJeworCQljb25zdCBCRiAmIGFTeW1ib2wgPSBYUXVlcnkuZ2V0VHJhbnNpdGlvbkJ5UXVhbGlmaWVkTmFtZUlEKCBxbmlkICk7CisJCWlmKCBhU3ltYm9sLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGFTeW1ib2wgKTsKKwkJfQorCX0KKwllbHNlIGlmKCBraW5kID09ICJyb3V0aW5lIiApCisJeworCQljb25zdCBCRiAmIGFTeW1ib2wgPSBYUXVlcnkuZ2V0UHJvZ3JhbUJ5UXVhbGlmaWVkTmFtZUlEKAorCQkJCXFuaWQsIFNwZWNpZmllcjo6U0NPUEVfUk9VVElORV9LSU5EICk7CisJCWlmKCBhU3ltYm9sLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGFTeW1ib2wgKTsKKwkJfQorCX0KKwllbHNlIGlmKCBraW5kID09ICJwcm9ncmFtIiApCisJeworCQljb25zdCBCRiAmIGFTeW1ib2wgPSBYUXVlcnkuZ2V0UHJvZ3JhbUJ5UXVhbGlmaWVkTmFtZUlEKAorCQkJCXFuaWQsIFNwZWNpZmllcjo6U0NPUEVfVU5ERUZJTkVEX0tJTkQgKTsKKy8vCQkJCXFuaWQsIFNwZWNpZmllcjo6U0NPUEVfUFJPR1JBTV9LSU5EICAgKTsKKwkJaWYoIGFTeW1ib2wudmFsaWQoKSApCisJCXsKKwkJCXJldHVybiggYVN5bWJvbCApOworCQl9CisJfQorCisJZWxzZQorCXsKKwkJQVZNX09TX1dBUk4gPDwgIlVuZXhwZWN0ZWQgYXR0cmlidXRlIDw8ICIgPDwgYVdQcm9wZXJ0eS0+c3RyKCkKKwkJCQk8PCAiID4+IGFzIGNvdmVyYWdlIHByb2Nlc3NvciBwYXJhbWV0ZXIiOworCX0KKworCXJldHVybiggQkY6OlJFRl9OVUxMICk7Cit9CisKK2F2bV9zaXplX3QgUnVudGltZVF1ZXJ5OjpzZWFyY2hTeW1ib2woCisJCVdPYmplY3QgKiBhV1Byb3BlcnR5LCBCRkxpc3QgJiBsaXN0b2ZTeW1ib2wgKQoreworCWF2bV9zaXplX3QgY291bnQgPSAwOworCisJY29uc3Qgc3RkOjpzdHJpbmcgJiBraW5kID0gYVdQcm9wZXJ0eS0+Z2V0TmFtZUlEKCk7CisJY29uc3Qgc3RkOjpzdHJpbmcgJiBxbmlkID0gYVdQcm9wZXJ0eS0+dG9TdHJpbmdWYWx1ZSgpOworCisJRXhlY3V0YWJsZVF1ZXJ5IFhRdWVyeSggbUNvbmZpZ3VyYXRpb24gKTsKKworCWlmKCAoa2luZCA9PSAidmFyaWFibGUiKSB8fCAoa2luZCA9PSAidmFyIikgKQorCXsKKwkJY291bnQgKz0gWFF1ZXJ5LmdldERhdGFCeVF1YWxpZmllZE5hbWVJRChxbmlkLCBsaXN0b2ZTeW1ib2wpOworCX0KKworCWVsc2UgaWYoIChraW5kID09ICJtb2RlbCIpIHx8IChraW5kID09ICJmb3JtIikgKQorCXsKKwkJLy8hIVN5bWJvbAorLy8JCWNvdW50ICs9IHNlYXJjaE1hY2hpbmUoYVN5c3RlbSwgU3BlY2lmaWVyOjpERVNJR05fTU9ERUxfS0lORCwKKy8vCQkJCXFuaWQsIGxpc3RvZlN5bWJvbCApOworCX0KKworCWVsc2UgaWYoIGtpbmQgPT0gImluc3RhbmNlIiApCisJeworCQkvLyEhU3ltYm9sCisvLwkJY291bnQgKz0gc2VhcmNoTWFjaGluZShhU3lzdGVtLCBTcGVjaWZpZXI6OkRFU0lHTl9JTlNUQU5DRV9LSU5ELAorLy8JCQkJcW5pZCwgbGlzdG9mU3ltYm9sICk7CisJfQorCisJZWxzZSBpZigga2luZCA9PSAiZXhlY3V0YWJsZSIgKQorCXsKKwkJY291bnQgKz0gWFF1ZXJ5LmdldEV4ZWN1dGFibGVCeVF1YWxpZmllZE5hbWVJRChxbmlkLCBsaXN0b2ZTeW1ib2wpOworCX0KKworCWVsc2UgaWYoIGtpbmQgPT0gInRyYW5zaXRpb24iICkKKwl7CisJCWNvdW50ICs9IFhRdWVyeS5nZXRUcmFuc2l0aW9uQnlRdWFsaWZpZWROYW1lSUQocW5pZCwgbGlzdG9mU3ltYm9sICk7CisJfQorCisJZWxzZSBpZigga2luZCA9PSAicm91dGluZSIgKQorCXsKKwkJY291bnQgKz0gWFF1ZXJ5LmdldFByb2dyYW1CeVF1YWxpZmllZE5hbWVJRChxbmlkLAorCQkJCVNwZWNpZmllcjo6U0NPUEVfUk9VVElORV9LSU5ELCBsaXN0b2ZTeW1ib2wpOworCX0KKworCWVsc2UgaWYoIGtpbmQgPT0gInByb2dyYW0iICkKKwl7CisJCWNvdW50ICs9IFhRdWVyeS5nZXRQcm9ncmFtQnlRdWFsaWZpZWROYW1lSUQoCisJCQkJcW5pZCwgU3BlY2lmaWVyOjpTQ09QRV9VTkRFRklORURfS0lORCwgbGlzdG9mU3ltYm9sICk7CisvLwkJCQlxbmlkLCBTcGVjaWZpZXI6OlNDT1BFX1BST0dSQU1fS0lORCAgLCBsaXN0b2ZTeW1ib2wgKQorCX0KKworCWVsc2UKKwl7CisJCUFWTV9PU19XQVJOIDw8ICJVbmV4cGVjdGVkIGF0dHJpYnV0ZSA8PCAiIDw8IGFXUHJvcGVydHktPnN0cigpCisJCQkJPDwgIiA+PiBhcyBjb3ZlcmFnZSBwcm9jZXNzb3IgcGFyYW1ldGVyIjsKKwl9CisKKwlyZXR1cm4oIGNvdW50ICk7Cit9CisqCisqICFVTlVTRUQhCisqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFJVTlRJTUUgVE9PTFMKKy8vIFVzZWQgZHVyaW5nIGV4ZWN1dGlvbjwgcHJvY2Vzc2luZyAvIGZpbHRlcmluZyA+IHN0ZXAKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKKyAqIFNFQVJDSAorICogVmFyaWFibGUKKyAqLworQkYgUnVudGltZVF1ZXJ5OjpzZWFyY2hWYXJpYWJsZShjb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwKKwkJY29uc3QgUnVudGltZUlEICYgY3R4UklELCBjb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCkgY29uc3QKK3sKKwlpZiggYW5FRC5oYXNMb2NhbFJ1bnRpbWVTdGFjaygpICkKKwl7CisJCVN0YWNrT2ZMb2NhbFJ1bnRpbWU6OgorCQlyZXZlcnNlX2l0ZXJhdG9yIGl0ID0gYW5FRC5nZXRMb2NhbFJ1bnRpbWVzKCktPnJiZWdpbigpOworCQlTdGFja09mTG9jYWxSdW50aW1lOjoKKwkJcmV2ZXJzZV9pdGVyYXRvciBpdEVuZCA9IGFuRUQuZ2V0TG9jYWxSdW50aW1lcygpLT5yZW5kKCk7CisJCWZvciggIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwkJeworCQkJY29uc3QgQkYgJiBhbkluc3RhbmNlID0gKCppdCkuZ2V0UHJvZ3JhbSgpLT5nZXRBbGxEYXRhKCkuCisJCQkJCWdldEJ5RlFOYW1lSUQoIGFGdWxseVF1YWxpZmllZE5hbWVJRCApOworCQkJaWYoIGFuSW5zdGFuY2UudmFsaWQoKSApCisJCQl7CisJCQkJcmV0dXJuKCBhbkluc3RhbmNlICk7CisJCQl9CisJCX0KKwl9CisKKworCVVuaUZvcm1JZGVudGlmaWVyIGFuVUZJKGFGdWxseVF1YWxpZmllZE5hbWVJRCk7CisKKwlzdGQ6Om9zdHJpbmdzdHJlYW0gb3NVRkk7CisKKwlVbmlGb3JtSWRlbnRpZmllcjo6aXRlcmF0b3IgaXQgPSBhblVGSS5iZWdpbigpOworCVVuaUZvcm1JZGVudGlmaWVyOjppdGVyYXRvciBpdEVuZCA9IGFuVUZJLmVuZCgpOworCisJLy8gcmVjaGVyY2hlIGRlIGxhIG1hY2hpbmUgUFJJTkNJUEFMRSAoUk9PVCkKKwlvc1VGSSA8PCAiaW5zdDo6IiA8PCAoKml0KS5zdHIoKTsKKworCWNvbnN0IFJ1bnRpbWVJRCAmIHRoZVN5c3RlbVJJRCA9IGFuRUQuZ2V0U3lzdGVtUklEKCk7CisJUnVudGltZUlEIHRoZU1hY2hpbmVJRCA9IHRoZVN5c3RlbVJJRDsKKworCWZvciggKytpdCA7IChpdCAhPSBpdEVuZCkgOyArK2l0ICkKKwl7CisJCWlmKCB0aGVNYWNoaW5lSUQuZ2V0SW5zdGFuY2UoKS0+ZnFuRXF1YWxzKCBvc1VGSS5zdHIoKSApICkKKwkJeworCQkJYnJlYWs7CisJCX0KKwkJb3NVRkkgPDwgIi4iIDw8ICgqaXQpLnN0cigpOworCX0KKworCWlmKCBpdCAhPSBpdEVuZCApCisJeworCQlWZWN0b3JPZkluc3RhbmNlT2ZNYWNoaW5lIGFsaWFzUGF0aDsKKworCQlSdW50aW1lSUQgcmlkID0gdGhlTWFjaGluZUlEOworCisJCS8vIGNvbW1lIGMnZXN0IGxhIHNwZWMgUklECisvLwkJYWxpYXNQYXRoLmFwcGVuZCggdGhlTWFjaGluZUlELmdldEluc3RhbmNlKCkgKTsKKworCQkvLyByZWNoZXJjaGUgZGUgbGEgbWFjaGluZSBGRVVJTExFCisJCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQpCisJCXsKKwkJCW9zVUZJIDw8ICIuIiA8PCAoKml0KS5zdHIoKTsKKwkJCXJpZCA9IGFuRUQuZ2V0UnVudGltZShyaWQpLmdldENoaWxkKCBvc1VGSS5zdHIoKSApOworCQkJaWYoIHJpZC52YWxpZCgpICkKKwkJCXsKKwkJCQl0aGVNYWNoaW5lSUQgPSByaWQ7CisJCQkJYWxpYXNQYXRoLmFwcGVuZCggdGhlTWFjaGluZUlELmdldEluc3RhbmNlKCkgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmKCAoaXQgPT0gaXRFbmQpICYmICh0aGVNYWNoaW5lSUQgPT0gdGhlU3lzdGVtUklEKSApCisJCXsKKwkJCS0taXQ7CisJCX0KKworCQlpZiggaXQgIT0gaXRFbmQgKQorCQl7CisJCQlFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZSA9IHRoZU1hY2hpbmVJRC5nZXRFeGVjdXRhYmxlKCk7CisJCQlvc1VGSS5zdHIoICIiICk7CisJCQlvc1VGSSA8PCAiaW5zdDo6IiAgICAgICAgICAgICAgICAgICAgLy8gImV4ZWM6OiIuc2l6ZSgpID09IDYKKwkJCQkJPDwgYW5FeGVjdXRhYmxlLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpLnN1YnN0ciggNiApOworCisKKwkJCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQpCisJCQl7CisJCQkJb3NVRkkgPDwgIi4iIDw8ICgqaXQpLnN0cigpOworCQkJfQorCisKKwkJCS8vIFRoZSBPUklHSU5BTCBJTlNUQU5DRQorCQkJSW5zdGFuY2VPZkRhdGEgKiBhbkluc3RhbmNlID0KKwkJCQkJYW5FeGVjdXRhYmxlLT5nZXRBbGxEYXRhKCkucmF3QnlGUU5hbWVJRCggb3NVRkkuc3RyKCkgKTsKKworCQkJaWYoIGFuSW5zdGFuY2UgIT0gTlVMTCApCisJCQl7CisJCQkJYW5JbnN0YW5jZSA9IGFuRXhlY3V0YWJsZS0+Z2V0Q29uc3REYXRhKCkucmF3QnlGUU5hbWVJRCgKKwkJCQkJCW9zVUZJLnN0cigpICk7CisJCQl9CisKKwkJCWlmKCBhbkluc3RhbmNlICE9IE5VTEwgKQorCQkJeworCQkJCWlmKCBhbGlhc1BhdGgubm9uZW1wdHkoKSApCisJCQkJeworCQkJCQlhbkluc3RhbmNlID0gbmV3IEluc3RhbmNlT2ZEYXRhKAorCQkJCQkJCXRoZVN5c3RlbVJJRC5nZXRFeGVjdXRhYmxlKCksCisJCQkJCQkJYW5JbnN0YW5jZSwgYWxpYXNQYXRoICk7CisKKwkJCQkJYW5JbnN0YW5jZS0+c2V0Q3JlYXRvckNvbnRhaW5lclJJRCggdGhlTWFjaGluZUlEICk7CisJCQkJCWFuSW5zdGFuY2UtPnNldFJ1bnRpbWVDb250YWluZXJSSUQoIHRoZU1hY2hpbmVJRCApOworCisJCQkJCXJldHVybiggQkYoIGFuSW5zdGFuY2UgKSApOworCQkJCX0KKworLy8JCQkJQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiU2VhcmNoaW5nICIgPDwgYW5VRkktPnN0cigpIDw8IHN0ZDo6ZW5kbDsKKy8vCQkJCUFWTV9PU19UUkFDRSA8PCBUQUIgPDwgIkZvdW5kICIgPDwgc3RkOjplbmRsOworLy8JCQkJYW5JbnN0YW5jZS0+c2VyaWFsaXplKEFWTV9PU19UUkFDRSA8PCBUQUIpOworLy8JCQkJQVZNX09TX1RSQUNFIDw8IHN0ZDo6Zmx1c2g7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworfQorCisKK2NvbnN0IEJGICYgUnVudGltZVF1ZXJ5OjpzZWFyY2hWYXJpYWJsZShjb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwKKwkJY29uc3QgUnVudGltZUlEICYgY3R4UklELCBjb25zdCBPYmplY3RFbGVtZW50ICogYXN0RWxlbWVudCkgY29uc3QKK3sKKwlpZiggYW5FRC5oYXNMb2NhbFJ1bnRpbWVTdGFjaygpICkKKwl7CisJCVN0YWNrT2ZMb2NhbFJ1bnRpbWU6OgorCQlyZXZlcnNlX2l0ZXJhdG9yIGl0ID0gYW5FRC5nZXRMb2NhbFJ1bnRpbWVzKCktPnJiZWdpbigpOworCQlTdGFja09mTG9jYWxSdW50aW1lOjoKKwkJcmV2ZXJzZV9pdGVyYXRvciBpdEVuZCA9IGFuRUQuZ2V0TG9jYWxSdW50aW1lcygpLT5yZW5kKCk7CisJCWZvciggIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwkJeworCQkJY29uc3QgQkYgJiBhbkluc3RhbmNlID0KKwkJCQkoKml0KS5nZXRQcm9ncmFtKCktPmdldEFsbERhdGEoKS5nZXRCeUFzdEVsZW1lbnQoYXN0RWxlbWVudCk7CisJCQlpZiggYW5JbnN0YW5jZS52YWxpZCgpICkKKwkJCXsKKwkJCQlyZXR1cm4oIGFuSW5zdGFuY2UgKTsKKwkJCX0KKwkJfQorCX0KKworCVRhYmxlT2ZSdW50aW1lVDo6Y29uc3RfaXRlcmF0b3IgaXRSRiA9IGFuRUQuZ2V0VGFibGVPZlJ1bnRpbWUoKS5iZWdpbigpOworCVRhYmxlT2ZSdW50aW1lVDo6Y29uc3RfaXRlcmF0b3IgZW5kUkYgPSBhbkVELmdldFRhYmxlT2ZSdW50aW1lKCkuZW5kKCk7CisJZm9yKCA7IGl0UkYgIT0gZW5kUkYgOyArK2l0UkYpCisJeworCQljb25zdCBCRiAmIGFuSW5zdGFuY2UgPQorCQkJKCppdFJGKS0+Z2V0RXhlY3V0YWJsZSgpLT5nZXRBbGxEYXRhKCkuZ2V0QnlBc3RFbGVtZW50KGFzdEVsZW1lbnQpOworCQlpZiggYW5JbnN0YW5jZS52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCBhbkluc3RhbmNlICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworfQorCisKKworQkYgUnVudGltZVF1ZXJ5OjpzZWFyY2hWYXJpYWJsZShjb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwKKwkJY29uc3QgUnVudGltZUlEICYgY3R4UklELCBjb25zdCBCRiAmIGFTeW1ib2xpY1BhcmFtZXRlcikgY29uc3QKK3sKKwlpZiggYVN5bWJvbGljUGFyYW1ldGVyLmlzPCBJbnN0YW5jZU9mRGF0YSA+KCkgKQorCXsKKwkJSW5zdGFuY2VPZkRhdGEgKiBhUGFyYW1JbnN0YW5jZSA9CisJCQkJYVN5bWJvbGljUGFyYW1ldGVyLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpOworCisJCVJ1bnRpbWVJRCBhUklEID0gYVBhcmFtSW5zdGFuY2UtPmhhc0NyZWF0b3JDb250YWluZXJSSUQoKSA/CisJCQkJYVBhcmFtSW5zdGFuY2UtPmdldENyZWF0b3JDb250YWluZXJSSUQoKSA6IGN0eFJJRDsKKworCQljb25zdCBCRiAmIGZvdW5kVmFyaWFibGUgPSBhUklELmdldEV4ZWN1dGFibGUoKS0+Z2V0eW1ib2xCeUFzdEVsZW1lbnQoCisJCQkJYVBhcmFtSW5zdGFuY2UtPmdldEFzdEVsZW1lbnQoKSwgVFlQRV9VTklWRVJTQUxfU1BFQ0lGSUVSKTsKKworCQlpZiggZm91bmRWYXJpYWJsZS52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCBmb3VuZFZhcmlhYmxlICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQljb25zdCBCRiAmIGZvdW5kVmFyaWFibGUgPSBzZWFyY2hWYXJpYWJsZSgKKwkJCQkJYW5FRCwgY3R4UklELCBhUGFyYW1JbnN0YW5jZS0+Z2V0QXN0RWxlbWVudCgpICk7CisKKwkJCWlmKCBmb3VuZFZhcmlhYmxlLnZhbGlkKCkgKQorCQkJeworCQkJCXJldHVybiggZm91bmRWYXJpYWJsZSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWNvbnN0IEJGICYgZm91bmRWYXJpYWJsZSA9IHNlYXJjaFZhcmlhYmxlKGFuRUQsIGN0eFJJRCwKKwkJCQkJCWFQYXJhbUluc3RhbmNlLT5nZXRBc3RGdWxseVF1YWxpZmllZE5hbWVJRCgpICk7CisKKwkJCQlpZiggZm91bmRWYXJpYWJsZS52YWxpZCgpICkKKwkJCQl7CisJCQkJCXJldHVybiggZm91bmRWYXJpYWJsZSApOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXJldHVybiggc2VhcmNoVmFyaWFibGUoYW5FRCwgY3R4UklELCBhU3ltYm9saWNQYXJhbWV0ZXIuc3RyKCkpICk7Cit9CisKKworLyoqCisgKiBTRUFSQ0gKKyAqIFN5bWJvbAorICogIVVOVVNFRCEKKyAqCitCRiBSdW50aW1lUXVlcnk6OnNlYXJjaFN5bWJvbChUYWJsZU9mU3ltYm9sICYgYWxpYXNUYWJsZSwKKwkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQsIFVuaUZvcm1JZGVudGlmaWVyICogYW5VRkkpCit7CisJc3RkOjpvc3RyaW5nc3RyZWFtIG9zVUZJOworCisJc3RkOjpzdHJpbmcgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEID0gYW5VRkktPnN0cigpOworCisJeworCQljb25zdCBCRiAmIGZvdW5kSW5zdGFuY2UgPQorCQkJCWFsaWFzVGFibGUuZ2V0QnlGUU5hbWVJRCggYUZ1bGx5UXVhbGlmaWVkTmFtZUlEICk7CisJCWlmKCBmb3VuZEluc3RhbmNlLnZhbGlkKCkgKQorCQl7CisJCQlyZXR1cm4oIGZvdW5kSW5zdGFuY2UgKTsKKwkJfQorCX0KKworCisJaWYoIGFuRUQuaGFzTG9jYWxSdW50aW1lU3RhY2soKSApCisJeworCQlTdGFja09mTG9jYWxSdW50aW1lOjoKKwkJcmV2ZXJzZV9pdGVyYXRvciBpdCA9IGFuRUQuZ2V0TG9jYWxSdW50aW1lcygpLT5yYmVnaW4oKTsKKwkJU3RhY2tPZkxvY2FsUnVudGltZTo6CisJCXJldmVyc2VfaXRlcmF0b3IgaXRFbmQgPSBhbkVELmdldExvY2FsUnVudGltZXMoKS0+cmVuZCgpOworCQlmb3IoICA7IGl0ICE9IGl0RW5kIDsgKytpdCApCisJCXsKKwkJCWNvbnN0IEJGICYgYW5JbnN0YW5jZSA9ICgqaXQpLmdldFByb2dyYW0oKS0+Z2V0QWxsRGF0YSgpLgorCQkJCQlnZXRCeUZRTmFtZUlEKCBhRnVsbHlRdWFsaWZpZWROYW1lSUQgKTsKKwkJCWlmKCBhbkluc3RhbmNlLnZhbGlkKCkgKQorCQkJeworCQkJCXJldHVybiggYW5JbnN0YW5jZSApOworCQkJfQorCQl9CisJfQorCisKKwlVbmlGb3JtSWRlbnRpZmllcjo6aXRlcmF0b3IgaXQgPSBhblVGSS0+YmVnaW4oKTsKKwlVbmlGb3JtSWRlbnRpZmllcjo6aXRlcmF0b3IgaXRFbmQgPSBhblVGSS0+ZW5kKCk7CisKKwkvLyByZWNoZXJjaGUgZGUgbGEgbWFjaGluZSBQUklOQ0lQQUxFIChST09UKQorCW9zVUZJIDw8ICJpbnN0OjoiIDw8ICgqaXQpLnN0cigpOworCisJY29uc3QgUnVudGltZUlEICYgdGhlU3lzdGVtUklEID0gYW5FRC5nZXRTeXN0ZW1SSUQoKTsKKwlSdW50aW1lSUQgdGhlTWFjaGluZUlEID0gdGhlU3lzdGVtUklEOworCisJZm9yKCArK2l0IDsgKGl0ICE9IGl0RW5kKSA7ICsraXQgKQorCXsKKwkJaWYoIHRoZU1hY2hpbmVJRC5nZXRJbnN0YW5jZSgpLT5mcW5FcXVhbHMoIG9zVUZJLnN0cigpICkgKQorCQl7CisJCQlicmVhazsKKwkJfQorCQlvc1VGSSA8PCAiLiIgPDwgKCppdCkuc3RyKCk7CisJfQorCisJaWYoIGl0ICE9IGl0RW5kICkKKwl7CisJCVZlY3Rvck9mSW5zdGFuY2VPZk1hY2hpbmUgYWxpYXNQYXRoOworCisJCVJ1bnRpbWVJRCBhUklEID0gdGhlTWFjaGluZUlEOworCisJCS8vIGNvbW1lIGMnZXN0IGxhIHNwZWMgUklECisvLwkJYWxpYXNQYXRoLmFwcGVuZCggdGhlTWFjaGluZUlELmdldEluc3RhbmNlKCkgKTsKKworCQkvLyByZWNoZXJjaGUgZGUgbGEgbWFjaGluZSBGRVVJTExFCisJCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQpCisJCXsKKwkJCW9zVUZJIDw8ICIuIiA8PCAoKml0KS5zdHIoKTsKKwkJCWFSSUQgPSBhbkVELmdldFJ1bnRpbWUoYVJJRCkuZ2V0Q2hpbGQoIG9zVUZJLnN0cigpICk7CisJCQlpZiggYVJJRC52YWxpZCgpICkKKwkJCXsKKwkJCQl0aGVNYWNoaW5lSUQgPSBhUklEOworCQkJCWFsaWFzUGF0aC5hcHBlbmQoIHRoZU1hY2hpbmVJRC5nZXRJbnN0YW5jZSgpICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiggKGl0ID09IGl0RW5kKSAmJiAodGhlTWFjaGluZUlEID09IHRoZVN5c3RlbVJJRCkgKQorCQl7CisJCQktLWl0OworCQl9CisKKwkJaWYoIGl0ICE9IGl0RW5kICkKKwkJeworCQkJRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGUgPSB0aGVNYWNoaW5lSUQuZ2V0RXhlY3V0YWJsZSgpOworCQkJb3NVRkkuc3RyKCAiaW5zdDo6IiApOworCQkJb3NVRkkgPDwgYW5FeGVjdXRhYmxlLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpLnN1YnN0ciggNiApOworCQkJLy8gNiA9PSAiZXhlYzo6Ii5zaXplKCkKKworCQkJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCkKKwkJCXsKKwkJCQlvc1VGSSA8PCAiLiIgPDwgKCppdCkuc3RyKCk7CisJCQl9CisKKworCQkJLy8gVGhlIE9SSUdJTkFMIElOU1RBTkNFCisJCQlCRiBhbkluc3RhbmNlID0gYW5FeGVjdXRhYmxlLT5nZXRBbGxEYXRhKCkuCisJCQkJCWdldEJ5RlFOYW1lSUQoIG9zVUZJLnN0cigpICk7CisKKwkJCWlmKCBhbkluc3RhbmNlLmludmFsaWQoKSApCisJCQl7CisJCQkJYW5JbnN0YW5jZSA9IGFuRXhlY3V0YWJsZS0+Z2V0Q29uc3REYXRhKCkuCisJCQkJCQlnZXRCeUZRTmFtZUlEKCBvc1VGSS5zdHIoKSApOworCQkJfQorCQkJaWYoIGFuSW5zdGFuY2UuaW52YWxpZCgpICkKKwkJCXsKKwkJCQlhbkluc3RhbmNlID0gYW5FeGVjdXRhYmxlLT5nZXRQb3J0KCkuCisJCQkJCQlnZXRCeUZRTmFtZUlEKCBvc1VGSS5zdHIoKSApOworCQkJfQorCQkJaWYoIGFuSW5zdGFuY2UuaW52YWxpZCgpICkKKwkJCXsKKwkJCQlhbkluc3RhbmNlID0gYW5FeGVjdXRhYmxlLT5nZXRCdWZmZXIoKS4KKwkJCQkJCWdldEJ5RlFOYW1lSUQoIG9zVUZJLnN0cigpICk7CisJCQl9CisJCQlpZiggYW5JbnN0YW5jZS5pbnZhbGlkKCkgKQorCQkJeworCQkJCWFuSW5zdGFuY2UgPSBhbkV4ZWN1dGFibGUtPmdldENvbm5lY3QoKS4KKwkJCQkJCWdldEJ5RlFOYW1lSUQoIG9zVUZJLnN0cigpICk7CisJCQl9CisKKwkJCWlmKCBhbkluc3RhbmNlLnZhbGlkKCkgKQorCQkJeworCisvLwkJCQlBVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICJTZWFyY2hpbmcgIiA8PCBhblVGSS0+c3RyKCkgPDwgc3RkOjplbmRsCisvLwkJCQkJCTw8IFRBQiA8PCAiRm91bmQgIiA8PCBzdGQ6OmVuZGw7CisvLwkJCQlhbkluc3RhbmNlLnRvU3RyZWFtKEFWTV9PU19UUkFDRSA8PCBUQUIpOworLy8JCQkJQVZNX09TX1RSQUNFIDw8IHN0ZDo6Zmx1c2g7CisKKwkJCQlpZiggYWxpYXNQYXRoLm5vbmVtcHR5KCkgKQorCQkJCXsKKwkJCQkJQmFzZUluc3RhbmNlRm9ybSAqIG5ld0luc3RhbmNlID0gTlVMTDsKKworCQkJCQlzd2l0Y2ggKCBhbkluc3RhbmNlLmNsYXNzS2luZCgpICkKKwkJCQkJeworCQkJCQkJY2FzZSBGT1JNX0lOU1RBTkNFX0RBVEFfS0lORDoKKwkJCQkJCXsKKwkJCQkJCQluZXdJbnN0YW5jZSA9IG5ldyBJbnN0YW5jZU9mRGF0YSgKKwkJCQkJCQkJCXRoZVN5c3RlbVJJRC5nZXRFeGVjdXRhYmxlKCksCisJCQkJCQkJCQlhbkluc3RhbmNlLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpLAorCQkJCQkJCQkJYWxpYXNQYXRoKTsKKwkJCQkJCQluZXdJbnN0YW5jZS0+c2V0Q3JlYXRvckNvbnRhaW5lclJJRCggdGhlTWFjaGluZUlEICk7CisJCQkJCQkJbmV3SW5zdGFuY2UtPnNldFJ1bnRpbWVDb250YWluZXJSSUQoIHRoZU1hY2hpbmVJRCApOworCQkJCQkJCWFsaWFzVGFibGUuc2F2ZSggbmV3SW5zdGFuY2UgKTsKKworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCisJCQkJCQljYXNlIEZPUk1fSU5TVEFOQ0VfTUFDSElORV9LSU5EOgorCQkJCQkJeworCQkJCQkJCW5ld0luc3RhbmNlID0gbmV3IEluc3RhbmNlT2ZNYWNoaW5lKAorCQkJCQkJCQkJdGhlU3lzdGVtUklELmdldEV4ZWN1dGFibGUoKSwKKwkJCQkJCQkJCWFuSW5zdGFuY2UudG9fcHRyPCBJbnN0YW5jZU9mTWFjaGluZSA+KCksCisJCQkJCQkJCQlhbGlhc1BhdGgpOworCQkJCQkJCW5ld0luc3RhbmNlLT5zZXRDcmVhdG9yQ29udGFpbmVyUklEKCB0aGVNYWNoaW5lSUQgKTsKKwkJCQkJCQluZXdJbnN0YW5jZS0+c2V0UnVudGltZUNvbnRhaW5lclJJRCggdGhlTWFjaGluZUlEICk7CisKKwkJCQkJCQlyZXR1cm4oIGFsaWFzVGFibGUuc2F2ZSggbmV3SW5zdGFuY2UgKSApOworCQkJCQkJfQorCisJCQkJCQljYXNlIEZPUk1fSU5TVEFOQ0VfUE9SVF9LSU5EOgorCQkJCQkJeworCQkJCQkJCW5ld0luc3RhbmNlID0gbmV3IEluc3RhbmNlT2ZQb3J0KAorCQkJCQkJCQkJdGhlU3lzdGVtUklELmdldEV4ZWN1dGFibGUoKSwKKwkJCQkJCQkJCWFuSW5zdGFuY2UudG9fcHRyPCBJbnN0YW5jZU9mUG9ydCA+KCksCisJCQkJCQkJCQlhbGlhc1BhdGgpOworCQkJCQkJCW5ld0luc3RhbmNlLT5zZXRDcmVhdG9yQ29udGFpbmVyUklEKCB0aGVNYWNoaW5lSUQgKTsKKwkJCQkJCQluZXdJbnN0YW5jZS0+c2V0UnVudGltZUNvbnRhaW5lclJJRCggdGhlTWFjaGluZUlEICk7CisKKwkJCQkJCQlyZXR1cm4oIGFsaWFzVGFibGUuc2F2ZSggbmV3SW5zdGFuY2UgKSApOworCQkJCQkJfQorCisJCQkJCQljYXNlIEZPUk1fSU5TVEFOQ0VfQlVGRkVSX0tJTkQ6CisJCQkJCQl7CisJCQkJCQkJbmV3SW5zdGFuY2UgPSBuZXcgSW5zdGFuY2VPZkJ1ZmZlcigKKwkJCQkJCQkJCXRoZVN5c3RlbVJJRC5nZXRFeGVjdXRhYmxlKCksCisJCQkJCQkJCQlhbkluc3RhbmNlLnRvX3B0cjwgSW5zdGFuY2VPZkJ1ZmZlciA+KCksCisJCQkJCQkJCQlhbGlhc1BhdGgpOworCQkJCQkJCW5ld0luc3RhbmNlLT5zZXRDcmVhdG9yQ29udGFpbmVyUklEKCB0aGVNYWNoaW5lSUQgKTsKKwkJCQkJCQluZXdJbnN0YW5jZS0+c2V0UnVudGltZUNvbnRhaW5lclJJRCggdGhlTWFjaGluZUlEICk7CisKKwkJCQkJCQlyZXR1cm4oIGFsaWFzVGFibGUuc2F2ZSggbmV3SW5zdGFuY2UgKSApOworCQkJCQkJfQorCisJCQkJCQljYXNlIEZPUk1fSU5TVEFOQ0VfQ09OTkVDVE9SX0tJTkQ6CisJCQkJCQl7CisJCQkJCQkJbmV3SW5zdGFuY2UgPSBuZXcgSW5zdGFuY2VPZkNvbm5lY3QoCisJCQkJCQkJCQl0aGVTeXN0ZW1SSUQuZ2V0RXhlY3V0YWJsZSgpLAorCQkJCQkJCQkJYW5JbnN0YW5jZS50b19wdHI8IEluc3RhbmNlT2ZDb25uZWN0ID4oKSwKKwkJCQkJCQkJCWFsaWFzUGF0aCk7CisJCQkJCQkJbmV3SW5zdGFuY2UtPnNldENyZWF0b3JDb250YWluZXJSSUQoIHRoZU1hY2hpbmVJRCApOworCQkJCQkJCW5ld0luc3RhbmNlLT5zZXRSdW50aW1lQ29udGFpbmVyUklEKCB0aGVNYWNoaW5lSUQgKTsKKworCQkJCQkJCXJldHVybiggYWxpYXNUYWJsZS5zYXZlKCBuZXdJbnN0YW5jZSApICk7CisJCQkJCQl9CisKKwkJCQkJCWRlZmF1bHQgOgorCQkJCQkJeworCQkJCQkJCXJldHVybiggQkY6OlJFRl9OVUxMICk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCXJldHVybiggYW5JbnN0YW5jZSApOworCQl9CisKKwkJZWxzZSBpZiggYWxpYXNQYXRoLm5vbmVtcHR5KCkgKQorCQl7CisJCQlyZXR1cm4oIEJGKAlzZXA6OmluY3JSZWZlcmVuY2VDb3VudChhbGlhc1BhdGgubGFzdCgpKSApICk7CisJCX0KKworCQllbHNlCisJCXsKKwkJCUFWTV9PU19FWElUKCBGQUlMRUQgKQorCQkJCQk8PCAiVW5mb3VuZCBsZWFmIG1hY2hpbmUgOiA8PCAiIDw8IG9zVUZJLnN0cigpCisJCQkJCTw8ICIgPj4gY29udGFpbmVyIG9mIDw8ICIgPDwgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEIDw8ICIgPj4iCisJCQkJCTw8IFNFTkRfRVhJVDsKKwkJfQorCX0KKworCXJldHVybiggQkY6OlJFRl9OVUxMICk7Cit9CisKK2NvbnN0IEJGICYgUnVudGltZVF1ZXJ5OjpzZWFyY2hTeW1ib2woVGFibGVPZlN5bWJvbCAmIGFsaWFzVGFibGUsCisJCWNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVELCBjb25zdCBPYmplY3RFbGVtZW50ICogYXN0RWxlbWVudCkKK3sKKwl7CisJCWNvbnN0IEJGICYgZm91bmRJbnN0YW5jZSA9IGFsaWFzVGFibGUuZ2V0QnlBc3RFbGVtZW50KGFzdEVsZW1lbnQpOworCQlpZiggZm91bmRJbnN0YW5jZS52YWxpZCgpICkKKwkJeworCQkJcmV0dXJuKCBmb3VuZEluc3RhbmNlICk7CisJCX0KKwl9CisKKwlpZiggYW5FRC5oYXNMb2NhbFJ1bnRpbWVTdGFjaygpICkKKwl7CisJCVN0YWNrT2ZMb2NhbFJ1bnRpbWU6OgorCQlyZXZlcnNlX2l0ZXJhdG9yIGl0ID0gYW5FRC5nZXRMb2NhbFJ1bnRpbWVzKCktPnJiZWdpbigpOworCQlTdGFja09mTG9jYWxSdW50aW1lOjoKKwkJcmV2ZXJzZV9pdGVyYXRvciBpdEVuZCA9IGFuRUQuZ2V0TG9jYWxSdW50aW1lcygpLT5yZW5kKCk7CisJCWZvciggIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwkJeworCQkJY29uc3QgQkYgJiBhbkluc3RhbmNlID0KKwkJCQkJKCppdCkuZ2V0UHJvZ3JhbSgpLT5nZXRBbGxEYXRhKCkuZ2V0QnlBc3RFbGVtZW50KGFzdEVsZW1lbnQpOworCQkJaWYoIGFuSW5zdGFuY2UudmFsaWQoKSApCisJCQl7CisJCQkJcmV0dXJuKCBhbkluc3RhbmNlICk7CisJCQl9CisJCX0KKwl9CisKKwl7CisJCUV4ZWN1dGFibGVRdWVyeSBYUXVlcnkoIG1Db25maWd1cmF0aW9uICk7CisKKwkJY29uc3QgQkYgJiBmb3VuZEluc3RhbmNlID0gWFF1ZXJ5LmdldEluc3RhbmNlQnlBc3RFbGVtZW50KGFzdEVsZW1lbnQpOworCisJCXJldHVybiggZm91bmRJbnN0YW5jZSApOworCX0KK30KKworCitjb25zdCBCRiAmIFJ1bnRpbWVRdWVyeTo6c2VhcmNoU3ltYm9sKFRhYmxlT2ZTeW1ib2wgJiBhbGlhc1RhYmxlLAorCQljb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwgY29uc3QgQkYgJiBhQmFzZUluc3RhbmNlKQoreworCWlmKCBhbGlhc1RhYmxlLmNvbnRhaW5zKGFCYXNlSW5zdGFuY2UpICkKKwl7CisJCXJldHVybiggYUJhc2VJbnN0YW5jZSApOworCX0KKworCWlmKCBhbkVELmhhc0xvY2FsUnVudGltZVN0YWNrKCkgKQorCXsKKwkJU3RhY2tPZkxvY2FsUnVudGltZTo6CisJCXJldmVyc2VfaXRlcmF0b3IgaXQgPSBhbkVELmdldExvY2FsUnVudGltZXMoKS0+cmJlZ2luKCk7CisJCVN0YWNrT2ZMb2NhbFJ1bnRpbWU6OgorCQlyZXZlcnNlX2l0ZXJhdG9yIGl0RW5kID0gYW5FRC5nZXRMb2NhbFJ1bnRpbWVzKCktPnJlbmQoKTsKKwkJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApCisJCXsKKwkJCWlmKCAoKml0KS5nZXRQcm9ncmFtKCktPmNvbnRhaW5zRGF0YSggYUJhc2VJbnN0YW5jZSApICkKKwkJCXsKKwkJCQlyZXR1cm4oIGFCYXNlSW5zdGFuY2UgKTsKKwkJCX0KKwkJfQorCX0KKworCWNvbnN0IFJ1bnRpbWVJRCAmIHRoZVN5c3RlbVJJRCA9IGFuRUQuZ2V0U3lzdGVtUklEKCk7CisKKwlWZWN0b3JPZkluc3RhbmNlT2ZNYWNoaW5lIGFsaWFzUGF0aDsKKworCVRhYmxlT2ZSdW50aW1lVDo6Y29uc3RfaXRlcmF0b3IgaXRSRiA9IGFuRUQuZ2V0VGFibGVPZlJ1bnRpbWUoKS5iZWdpbigpOworCVRhYmxlT2ZSdW50aW1lVDo6Y29uc3RfaXRlcmF0b3IgZW5kUkYgPSBhbkVELmdldFRhYmxlT2ZSdW50aW1lKCkuZW5kKCk7CisJZm9yKCBSdW50aW1lSUQgaXRSSUQgOyBpdFJGICE9IGVuZFJGIDsgKytpdFJGKQorCXsKKwkJaXRSSUQgPSAoKml0UkYpLT5nZXRSSUQoKTsKKworCQlzd2l0Y2ggKCBhQmFzZUluc3RhbmNlLmNsYXNzS2luZCgpICkKKwkJeworCQkJY2FzZSBGT1JNX0lOU1RBTkNFX0RBVEFfS0lORDoKKwkJCXsKKwkJCQlpZiggaXRSSUQuZ2V0RXhlY3V0YWJsZSgpLT5jb250YWluc0RhdGEoCisJCQkJCQlhQmFzZUluc3RhbmNlLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpKSApCisJCQkJeworCQkJCQlhbGlhc1BhdGguYXBwZW5kKCBpdFJJRC5nZXRJbnN0YW5jZSgpICk7CisKKwkJCQkJSW5zdGFuY2VPZkRhdGEgKiBuZXdJbnN0YW5jZSA9IG5ldyBJbnN0YW5jZU9mRGF0YSgKKwkJCQkJCXRoZVN5c3RlbVJJRC5nZXRFeGVjdXRhYmxlKCksCisJCQkJCQlhQmFzZUluc3RhbmNlLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpLCBhbGlhc1BhdGggKTsKKwkJCQkJbmV3SW5zdGFuY2UtPnNldENyZWF0b3JDb250YWluZXJSSUQoIGl0UklEICk7CisJCQkJCW5ld0luc3RhbmNlLT5zZXRSdW50aW1lQ29udGFpbmVyUklEKCBpdFJJRCApOworCisJCQkJCWFsaWFzVGFibGUuc2F2ZSggbmV3SW5zdGFuY2UgKTsKKwkJCQl9CisKKwkJCQlicmVhazsKKwkJCX0KKworCQkJY2FzZSBGT1JNX0lOU1RBTkNFX01BQ0hJTkVfS0lORDoKKwkJCXsKKwkJCQlpZiggaXRSSUQuZ2V0RXhlY3V0YWJsZSgpLT4KKwkJCQkJCWdldEluc3RhbmNlU3RhdGljKCkuY29udGFpbnMoYUJhc2VJbnN0YW5jZSkgKQorCQkJCXsKKwkJCQkJYWxpYXNQYXRoLmFwcGVuZCggaXRSSUQuZ2V0SW5zdGFuY2UoKSApOworCisJCQkJCUluc3RhbmNlT2ZNYWNoaW5lICogbmV3SW5zdGFuY2UgPSBuZXcgSW5zdGFuY2VPZk1hY2hpbmUoCisJCQkJCQkJdGhlU3lzdGVtUklELmdldEV4ZWN1dGFibGUoKSwKKwkJCQkJCQlhQmFzZUluc3RhbmNlLnRvX3B0cjwgSW5zdGFuY2VPZk1hY2hpbmUgPigpLAorCQkJCQkJCWFsaWFzUGF0aCApOworCQkJCQluZXdJbnN0YW5jZS0+c2V0Q3JlYXRvckNvbnRhaW5lclJJRCggaXRSSUQgKTsKKwkJCQkJbmV3SW5zdGFuY2UtPnNldFJ1bnRpbWVDb250YWluZXJSSUQoIGl0UklEICk7CisKKwkJCQkJYWxpYXNUYWJsZS5zYXZlKCBuZXdJbnN0YW5jZSApOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQkJY2FzZSBGT1JNX0lOU1RBTkNFX1BPUlRfS0lORDoKKwkJCXsKKwkJCQlpZiggaXRSSUQuZ2V0RXhlY3V0YWJsZSgpLT5nZXRQb3J0KCkuY29udGFpbnMoYUJhc2VJbnN0YW5jZSkgKQorCQkJCXsKKwkJCQkJYWxpYXNQYXRoLmFwcGVuZCggaXRSSUQuZ2V0SW5zdGFuY2UoKSApOworCisJCQkJCUluc3RhbmNlT2ZQb3J0ICogbmV3SW5zdGFuY2UgPSBuZXcgSW5zdGFuY2VPZlBvcnQoCisJCQkJCQkJdGhlU3lzdGVtUklELmdldEV4ZWN1dGFibGUoKSwKKwkJCQkJCQlhQmFzZUluc3RhbmNlLnRvX3B0cjwgSW5zdGFuY2VPZlBvcnQgPigpLCBhbGlhc1BhdGggKTsKKwkJCQkJbmV3SW5zdGFuY2UtPnNldENyZWF0b3JDb250YWluZXJSSUQoIGl0UklEICk7CisJCQkJCW5ld0luc3RhbmNlLT5zZXRSdW50aW1lQ29udGFpbmVyUklEKCBpdFJJRCApOworCisJCQkJCWFsaWFzVGFibGUuc2F2ZSggbmV3SW5zdGFuY2UgKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNhc2UgRk9STV9JTlNUQU5DRV9CVUZGRVJfS0lORDoKKwkJCXsKKwkJCQlJbnN0YW5jZU9mQnVmZmVyICogYnVmZmVySW5zdGFuY2UgPQorCQkJCQkJYUJhc2VJbnN0YW5jZS50b19wdHI8IEluc3RhbmNlT2ZCdWZmZXIgPigpOworCisJCQkJaWYoIGl0UklELmdldEV4ZWN1dGFibGUoKS0+Z2V0QnVmZmVyKCkuY29udGFpbnMoYnVmZmVySW5zdGFuY2UpICkKKwkJCQl7CisJCQkJCWFsaWFzUGF0aC5hcHBlbmQoIGl0UklELmdldEluc3RhbmNlKCkgKTsKKworCQkJCQlJbnN0YW5jZU9mQnVmZmVyICogbmV3SW5zdGFuY2UgPSBuZXcgSW5zdGFuY2VPZkJ1ZmZlcigKKwkJCQkJCQl0aGVTeXN0ZW1SSUQuZ2V0RXhlY3V0YWJsZSgpLAorCQkJCQkJCWJ1ZmZlckluc3RhbmNlLCBhbGlhc1BhdGggKTsKKwkJCQkJbmV3SW5zdGFuY2UtPnNldENyZWF0b3JDb250YWluZXJSSUQoIGl0UklEICk7CisJCQkJCW5ld0luc3RhbmNlLT5zZXRSdW50aW1lQ29udGFpbmVyUklEKCBpdFJJRCApOworCisJCQkJCWFsaWFzVGFibGUuc2F2ZSggbmV3SW5zdGFuY2UgKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNhc2UgRk9STV9JTlNUQU5DRV9DT05ORUNUT1JfS0lORDoKKwkJCXsKKwkJCQlJbnN0YW5jZU9mQ29ubmVjdCAqIGNvbm5lY3RJbnN0YW5jZSA9CisJCQkJCQlhQmFzZUluc3RhbmNlLnRvX3B0cjwgSW5zdGFuY2VPZkNvbm5lY3QgPigpOworCisJCQkJaWYoIGl0UklELmdldEV4ZWN1dGFibGUoKS0+Z2V0Q29ubmVjdCgpLmNvbnRhaW5zKGNvbm5lY3RJbnN0YW5jZSkgKQorCQkJCXsKKwkJCQkJYWxpYXNQYXRoLmFwcGVuZCggaXRSSUQuZ2V0SW5zdGFuY2UoKSApOworCisJCQkJCUluc3RhbmNlT2ZDb25uZWN0ICogbmV3SW5zdGFuY2UgPSBuZXcgSW5zdGFuY2VPZkNvbm5lY3QoCisJCQkJCQkJdGhlU3lzdGVtUklELmdldEV4ZWN1dGFibGUoKSwKKwkJCQkJCQljb25uZWN0SW5zdGFuY2UsIGFsaWFzUGF0aCApOworCQkJCQluZXdJbnN0YW5jZS0+c2V0Q3JlYXRvckNvbnRhaW5lclJJRCggaXRSSUQgKTsKKwkJCQkJbmV3SW5zdGFuY2UtPnNldFJ1bnRpbWVDb250YWluZXJSSUQoIGl0UklEICk7CisKKwkJCQkJYWxpYXNUYWJsZS5zYXZlKCBuZXdJbnN0YW5jZSApOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQkJZGVmYXVsdCA6CisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4oIGFCYXNlSW5zdGFuY2UgKTsKK30KKyoKKyogIVVOVVNFRCEKKyovCisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTElGRUxJTkUgQVBJCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIFJ1bnRpbWVRdWVyeTo6Z2V0U3lzdGVtTGlmZWxpbmVzKFZlY3RvcjwgUnVudGltZUlEID4gJiBsaWZlbGluZXMpIGNvbnN0Cit7CisJY29uc3QgUnVudGltZUZvcm0gJiBzeXN0ZW1SRiA9CisJCQltQ29uZmlndXJhdGlvbi5nZXRNYWluRXhlY3V0aW9uRGF0YSgpLmdldFN5c3RlbVJ1bnRpbWUoKTsKKworCWlmKCBzeXN0ZW1SRi5oYXNDaGlsZCgpICkKKwl7CisJCVRhYmxlT2ZSdW50aW1lSUQ6OmNvbnN0X2l0ZXJhdG9yIGl0UklEID0gc3lzdGVtUkYuYmVnaW5DaGlsZCgpOworCQlUYWJsZU9mUnVudGltZUlEOjpjb25zdF9pdGVyYXRvciBlbmRSSUQgPSBzeXN0ZW1SRi5lbmRDaGlsZCgpOworCQlmb3IoIDsgaXRSSUQgIT0gZW5kUklEIDsgKytpdFJJRCkKKwkJeworCQkJbGlmZWxpbmVzLmFwcGVuZCggKml0UklEICk7CisJCX0KKwl9Cit9CisKKworY29uc3QgUnVudGltZUlEICYgUnVudGltZVF1ZXJ5OjpnZXRSdW50aW5lQnlRdWFsaWZpZWROYW1lSUQoCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkgY29uc3QKK3sKKwlUYWJsZU9mUnVudGltZVQ6OmNvbnN0X2l0ZXJhdG9yIGl0UkYgPQorCQkJbUNvbmZpZ3VyYXRpb24uZ2V0TWFpbkV4ZWN1dGlvbkRhdGEoKS5nZXRUYWJsZU9mUnVudGltZSgpLmJlZ2luKCk7CisJVGFibGVPZlJ1bnRpbWVUOjpjb25zdF9pdGVyYXRvciBlbmRSRiA9CisJCQltQ29uZmlndXJhdGlvbi5nZXRNYWluRXhlY3V0aW9uRGF0YSgpLmdldFRhYmxlT2ZSdW50aW1lKCkuZW5kKCk7CisJZm9yKCA7IGl0UkYgIT0gZW5kUkYgOyArK2l0UkYpCisJeworCQlpZiggTmFtZWRFbGVtZW50OjpmcW5FbmRzV2l0aCgKKwkJCQkoKml0UkYpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpLGFRdWFsaWZpZWROYW1lSUQpICkKKwkJeworCQkJcmV0dXJuKCAoKml0UkYpLT5nZXRSSUQoKSApOworCQl9CisJfQorCisJcmV0dXJuKCBSdW50aW1lSUQ6OlJFRl9OVUxMICk7Cit9CisKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL1J1bnRpbWVRdWVyeS5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3J1bnRpbWUvUnVudGltZVF1ZXJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJkNGRkMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL1J1bnRpbWVRdWVyeS5oCkBAIC0wLDAgKzEsMTUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTkgbWFycyAyMDE0CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgRk1MX1JVTlRJTUVfUlVOVElNRVFVRVJZX0hfCisjZGVmaW5lIEZNTF9SVU5USU1FX1JVTlRJTUVRVUVSWV9IXworCisjaW5jbHVkZSA8Zm1sL3N5bWJvbC9TeW1ib2wuaD4KKworI2luY2x1ZGUgPHNldy9Db25maWd1cmF0aW9uLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIEV4ZWN1dGlvbkRhdGE7CisKK2NsYXNzIE9iamVjdEVsZW1lbnQ7CisKKy8vY2xhc3MgVW5pRm9ybUlkZW50aWZpZXI7CisKK2NsYXNzIFdPYmplY3Q7CisKKworY2xhc3MgUnVudGltZVF1ZXJ5Cit7CisKK3Byb3RlY3RlZCA6CisJLyoqCisJICogQVRUUklCVVRFUworCSAqLworCWNvbnN0IENvbmZpZ3VyYXRpb24gJiBtQ29uZmlndXJhdGlvbjsKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCVJ1bnRpbWVRdWVyeShjb25zdCBDb25maWd1cmF0aW9uICYgYUNvbmZpZ3VyYXRpb24pCisJOiBtQ29uZmlndXJhdGlvbiggYUNvbmZpZ3VyYXRpb24gKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFNUQVRJQyBUT09MUworCS8vIFVzZWQgZHVyaW5nIGNvbmZpZ3VyYXRpb24gc3RlcAorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkvKioKKwkgKiBTRUFSQ0gKKwkgKiBTeW1ib2wKKwkgKiAhVU5VU0VEIQorCSAqCisJY29uc3QgQkYgJiBzZWFyY2hTeW1ib2woV09iamVjdCAqIGFXUHJvcGVydHkpOworCisJYXZtX3NpemVfdCBzZWFyY2hTeW1ib2woV09iamVjdCAqIGFXUHJvcGVydHksIEJGTGlzdCAmIGxpc3RvZlN5bWJvbCk7CisJKgorCSogIVVOVVNFRCEKKwkqLworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBSVU5USU1FIFRPT0xTCisJLy8gVXNlZCBkdXJpbmcgZXhlY3V0aW9uPCBwcm9jZXNzaW5nIC8gZmlsdGVyaW5nID4gc3RlcAorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkvKioKKwkgKiBTRUFSQ0gKKwkgKiBWYXJpYWJsZQorCSAqLworCisJQkYgc2VhcmNoVmFyaWFibGUoY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQsIGNvbnN0IFJ1bnRpbWVJRCAmIGN0eFJJRCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEKSBjb25zdCA7CisKKwlpbmxpbmUgQkYgc2VhcmNoVmFyaWFibGUoY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCkgY29uc3QKKwl7CisJCXJldHVybiggc2VhcmNoVmFyaWFibGUoYW5FRCwgYW5FRC5tUklELCBhRnVsbHlRdWFsaWZpZWROYW1lSUQpICk7CisJfQorCisKKwljb25zdCBCRiAmIHNlYXJjaFZhcmlhYmxlKGNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVELAorCQkJY29uc3QgUnVudGltZUlEICYgY3R4UklELCBjb25zdCBPYmplY3RFbGVtZW50ICogb2JqRWxlbWVudCkgY29uc3Q7CisKKwlpbmxpbmUgY29uc3QgQkYgJiBzZWFyY2hWYXJpYWJsZSgKKwkJCWNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVELCBjb25zdCBPYmplY3RFbGVtZW50ICogb2JqRWxlbWVudCkgY29uc3QKKwl7CisJCXJldHVybiggc2VhcmNoVmFyaWFibGUoYW5FRCwgYW5FRC5tUklELCBvYmpFbGVtZW50KSApOworCX0KKworCisJQkYgc2VhcmNoVmFyaWFibGUoY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQsCisJCQljb25zdCBSdW50aW1lSUQgJiBjdHhSSUQsIGNvbnN0IEJGICYgYVN5bWJvbGljUGFyYW1ldGVyKSBjb25zdDsKKworCWlubGluZSBCRiBzZWFyY2hWYXJpYWJsZSgKKwkJCWNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVELCBjb25zdCBCRiAmIGFTeW1ib2xpY1BhcmFtZXRlcikgY29uc3QKKwl7CisJCXJldHVybiggc2VhcmNoVmFyaWFibGUoYW5FRCwgYW5FRC5tUklELCBhU3ltYm9saWNQYXJhbWV0ZXIpICk7CisJfQorCisKKwkvKioKKwkgKiBTRUFSQ0gKKwkgKiBTeW1ib2wKKwkgKiAhVU5VU0VEIQorCSAqCisJQkYgc2VhcmNoU3ltYm9sKFRhYmxlT2ZTeW1ib2wgJiBhbGlhc1RhYmxlLAorCQkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQsIFVuaUZvcm1JZGVudGlmaWVyICogYW5VRkkpOworCisJY29uc3QgQkYgJiBzZWFyY2hTeW1ib2woVGFibGVPZlN5bWJvbCAmIGFsaWFzVGFibGUsCisJCQljb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwgY29uc3QgT2JqZWN0RWxlbWVudCAqIG9iakVsZW1lbnQpOworCisJY29uc3QgQkYgJiBzZWFyY2hTeW1ib2woVGFibGVPZlN5bWJvbCAmIGFsaWFzVGFibGUsCisJCQljb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwgY29uc3QgQkYgJiBhQmFzZUluc3RhbmNlKTsKKwkqCisJKiAhVU5VU0VEIQorCSovCisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBMSUZFTElORSBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwl2b2lkIGdldFN5c3RlbUxpZmVsaW5lcyhWZWN0b3I8IFJ1bnRpbWVJRCA+ICYgbGlmZWxpbmVzKSBjb25zdDsKKworCWNvbnN0IFJ1bnRpbWVJRCAmIGdldFJ1bnRpbmVCeVF1YWxpZmllZE5hbWVJRCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkgY29uc3Q7CisKK307CisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworCisjZW5kaWYgLyogRk1MX1JVTlRJTUVfUlVOVElNRVFVRVJZX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvcnVudGltZS9UYWJsZU9mRGF0YS5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvcnVudGltZS9UYWJsZU9mRGF0YS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYxYWI3NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL1RhYmxlT2ZEYXRhLmNwcApAQCAtMCwwICsxLDM0MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgIlRhYmxlT2ZEYXRhLmgiCisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mRGF0YS5oPgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQnVpbHRpbkFycmF5Lmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQnVpbHRpbkNvbnRhaW5lci5oPgorCisjaW5jbHVkZSA8Zm1sL3N5bWJvbC9UYWJsZU9mU3ltYm9sLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorICogR0VUVEVSIC0gU0VUVEVSCisgKiBtVGFibGUKKyAqLworY29uc3QgQkYgJiBUYWJsZU9mRGF0YTo6Z2V0KGNvbnN0IEluc3RhbmNlT2ZEYXRhICogYW5JbnN0YW5jZSkgY29uc3QKK3sKKwlzd2l0Y2goIGFuSW5zdGFuY2UtPmdldFBvaW50ZXJOYXR1cmUoKSApCisJeworCQljYXNlIElQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9TVEFOREFSRF9OQVRVUkU6CisJCXsKKwkJCXJldHVybiggbVRhYmxlWyBhbkluc3RhbmNlLT5nZXRPZmZzZXQoKSBdICk7CisJCX0KKworCQljYXNlIElQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9VRklfT0ZGU0VUX05BVFVSRToKKwkJY2FzZSBJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfVUZJX1JVTlRJTUVfTkFUVVJFOgorCQl7CisJCQlCRiBydmFsdWUgPSBtVGFibGVbIGFuSW5zdGFuY2UtPmdldE9mZnNldCgpIF07CisKKwkJCS8vIE5PICsxIGZvciA8PCB0aGlzID4+IHdoaWNoIGlzIHRoZSByb290IG9mIHRoZSBwYXRoCisJCQlhdm1fc2l6ZV90IHBhdGhMZW5ndGggPSBhbkluc3RhbmNlLT5nZXREYXRhUGF0aCgpLT5zaXplKCk7CisJCQlhdm1fc2l6ZV90ICogdGhlT2Zmc2V0UGF0aCA9IGFuSW5zdGFuY2UtPmdldE9mZnNldFBhdGgoKTsKKwkJCWZvciggYXZtX3NpemVfdCBrID0gMSA7IGsgPCBwYXRoTGVuZ3RoIDsgKytrICkKKwkJCXsKKwkJCQlydmFsdWUubW92ZUF0KCB0aGVPZmZzZXRQYXRoW2tdICk7CisJCQl9CisKKwkJCXJldHVybiggcnZhbHVlWyB0aGVPZmZzZXRQYXRoW3BhdGhMZW5ndGhdIF0gKTsKKwkJfQorCisJCWNhc2UgSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX1VGSV9NSVhFRF9OQVRVUkU6CisJCXsKKwkJCUJGIHJ2YWx1ZSA9IG1UYWJsZVsgYW5JbnN0YW5jZS0+Z2V0T2Zmc2V0KCkgXTsKKworCQkJVGFibGVPZlN5bWJvbDo6aXRlcmF0b3IgaXQgPSBhbkluc3RhbmNlLT5nZXREYXRhUGF0aCgpLT5iZWdpbigpOworCQkJVGFibGVPZlN5bWJvbDo6aXRlcmF0b3IgaXRFbmQgPSBhbkluc3RhbmNlLT5nZXREYXRhUGF0aCgpLT5wcmVkX2VuZCgpOworCQkJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApCisJCQl7CisJCQkJc3dpdGNoKCAoKml0KS5nZXRQb2ludGVyTmF0dXJlKCkgKQorCQkJCXsKKwkJCQkJY2FzZSBJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfRklFTERfQ0xBU1NfQVRUUklCVVRFX05BVFVSRToKKwkJCQkJY2FzZSBJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfRklFTERfQVJSQVlfT0ZGU0VUX05BVFVSRToKKwkJCQkJeworCQkJCQkJcnZhbHVlLm1vdmVBdCggKCppdCkuZ2V0T2Zmc2V0KCkgKTsKKworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJY2FzZSBJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfRklFTERfQVJSQVlfSU5ERVhfTkFUVVJFOgorCQkJCQl7CisJCQkJCQlpZiggKCppdCkuZ2V0VmFsdWUoKS5pc0ludGVnZXIoKSApCisJCQkJCQl7CisJCQkJCQkJcnZhbHVlLm1vdmVBdCggKCppdCkuZ2V0VmFsdWUoKS50b0ludGVnZXIoKSApOworCQkJCQkJfQorCQkJCQkJZWxzZSBpZiggKCppdCkuZ2V0VmFsdWUoKS5pc0Zsb2F0KCkgKQorCQkJCQkJeworCQkJCQkJCXJ2YWx1ZS5tb3ZlQXQoICgqaXQpLmdldFZhbHVlKCkudG9GbG9hdCgpICk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJCQkJCTw8ICJUYWJsZU9mRGF0YTo6Z2V0Oj4gdW5leHBlY3RlZCAiCisJCQkJCQkJCQkJIk5PTi1JTlRFR0VSIEFSUkFZIElOREVYIDw8ICIKKwkJCQkJCQkJCTw8ICgqaXQpLnN0clZhbHVlKCkKKwkJCQkJCQkJCTw8ICIgPj4gaW4gaW5zdGFuY2UgRlFOLUlEIDo+XG4iCisJCQkJCQkJCQk8PCAoKml0KS50b1N0cmluZyggQVZNX1RBQjFfSU5ERU5UICkKKwkJCQkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCQkJCXJldHVybiggQkY6OlJFRl9OVUxMICk7CisJCQkJCQl9CisKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWRlZmF1bHQ6CisJCQkJCXsKKwkJCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQkJCTw8ICJUYWJsZU9mRGF0YTo6Z2V0Oj4gVW5leHBlY3RlZCAiCisJCQkJCQkJCSJQT0lOVEVSIE5BVFVSRSBmb3IgdGhlIGluc3RhbmNlIG9mIGRhdGEgOj5cbiIKKwkJCQkJCQkJPDwgYW5JbnN0YW5jZS0+dG9TdHJpbmcoIEFWTV9UQUIxX0lOREVOVCApCisJCQkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCQkJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJc3dpdGNoKCAoKml0KS5nZXRQb2ludGVyTmF0dXJlKCkgKQorCQkJeworCQkJCWNhc2UgSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX0ZJRUxEX0NMQVNTX0FUVFJJQlVURV9OQVRVUkU6CisJCQkJY2FzZSBJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfRklFTERfQVJSQVlfT0ZGU0VUX05BVFVSRToKKwkJCQl7CisJCQkJCXJldHVybiggcnZhbHVlWyAoKml0KS5nZXRPZmZzZXQoKSBdICk7CisJCQkJfQorCQkJCWNhc2UgSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX0ZJRUxEX0FSUkFZX0lOREVYX05BVFVSRToKKwkJCQl7CisJCQkJCWlmKCAoKml0KS5nZXRWYWx1ZSgpLmlzSW50ZWdlcigpICkKKwkJCQkJeworCQkJCQkJcmV0dXJuKCBydmFsdWVbICgqaXQpLmdldFZhbHVlKCkudG9JbnRlZ2VyKCkgXSApOworCQkJCQl9CisJCQkJCWVsc2UgaWYoICgqaXQpLmdldFZhbHVlKCkuaXNGbG9hdCgpICkKKwkJCQkJeworCQkJCQkJcmV0dXJuKCBydmFsdWVbICgqaXQpLmdldFZhbHVlKCkudG9GbG9hdCgpIF0gKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQkJCTw8ICJUYWJsZU9mRGF0YTo6Z2V0Oj4gdW5leHBlY3RlZCAiCisJCQkJCQkJCQkiTk9OLUlOVEVHRVIgQVJSQVkgSU5ERVggPDwgIgorCQkJCQkJCQk8PCAoKml0KS5zdHJWYWx1ZSgpCisJCQkJCQkJCTw8ICIgPj4gaW4gaW5zdGFuY2UgRlFOLUlEIDo+XG4iCisJCQkJCQkJCTw8ICgqaXQpLnRvU3RyaW5nKCBBVk1fVEFCMV9JTkRFTlQgKQorCQkJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQkJCXJldHVybiggQkY6OlJFRl9OVUxMICk7CisJCQkJCX0KKwkJCQl9CisJCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQkJPDwgIlRhYmxlT2ZEYXRhOjpnZXQ6PiBVbmV4cGVjdGVkICIKKwkJCQkJCQkJIlBPSU5URVIgTkFUVVJFIGZvciB0aGUgaW5zdGFuY2Ugb2YgZGF0YSA6PlxuIgorCQkJCQkJCTw8IGFuSW5zdGFuY2UtPnRvU3RyaW5nKCBBVk1fVEFCMV9JTkRFTlQgKQorCQkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCQlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJPDwgIlRhYmxlT2ZEYXRhOjpnZXQ6PiBVbmV4cGVjdGVkICIKKwkJCQkJIlBPSU5URVIgTkFUVVJFIGZvciB0aGUgaW5zdGFuY2Ugb2YgZGF0YSA6PlxuIgorCQkJCQk8PCBhbkluc3RhbmNlLT50b1N0cmluZyggQVZNX1RBQjFfSU5ERU5UICkKKwkJCQkJPDwgU0VORF9FWElUOworCQkJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKKwkJfQorCX0KKworCXJldHVybiggQkY6OlJFRl9OVUxMICk7Cit9CisKKwordm9pZCBUYWJsZU9mRGF0YTo6c2V0KGNvbnN0IEluc3RhbmNlT2ZEYXRhICogYW5JbnN0YW5jZSwgY29uc3QgQkYgJiBhRGF0YSkgY29uc3QKK3sKKwlzd2l0Y2goIGFuSW5zdGFuY2UtPmdldFBvaW50ZXJOYXR1cmUoKSApCisJeworCQljYXNlIElQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9TVEFOREFSRF9OQVRVUkU6CisJCXsKKwkJCW1UYWJsZVsgYW5JbnN0YW5jZS0+Z2V0T2Zmc2V0KCkgXSA9IGFEYXRhOworCisJCQlicmVhazsKKwkJfQorCQljYXNlIElQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9VRklfT0ZGU0VUX05BVFVSRToKKwkJY2FzZSBJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfVUZJX1JVTlRJTUVfTkFUVVJFOgorCQl7CisJCQlCRiBydmFsdWUgPSBtVGFibGVbIGFuSW5zdGFuY2UtPmdldE9mZnNldCgpIF0uZ2V0V3JpdGFibGUoKTsKKworCQkJLy8gTk8gKzEgZm9yIDw8IHRoaXMgPj4gd2hpY2ggaXMgdGhlIHJvb3Qgb2YgdGhlIHBhdGgKKwkJCWF2bV9zaXplX3QgcGF0aExlbmd0aCA9IGFuSW5zdGFuY2UtPmdldERhdGFQYXRoKCktPnNpemUoKTsKKwkJCWF2bV9zaXplX3QgKiB0aGVPZmZzZXRQYXRoID0gYW5JbnN0YW5jZS0+Z2V0T2Zmc2V0UGF0aCgpOworCQkJZm9yKCBhdm1fc2l6ZV90IGsgPSAxIDsgayA8IHBhdGhMZW5ndGggOyArK2sgKQorCQkJeworCQkJCXJ2YWx1ZS5tb3ZlQXRXcml0YWJsZSggdGhlT2Zmc2V0UGF0aFtrXSApOworCQkJfQorCisJCQlydmFsdWUuc2V0KCB0aGVPZmZzZXRQYXRoW3BhdGhMZW5ndGhdICwgYURhdGEpOworCisJCQlicmVhazsKKwkJfQorCQljYXNlIElQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9VRklfTUlYRURfTkFUVVJFOgorCQl7CisJCQlCRiBydmFsdWUgPSBtVGFibGVbIGFuSW5zdGFuY2UtPmdldE9mZnNldCgpIF0uZ2V0V3JpdGFibGUoKTsKKworCQkJVGFibGVPZlN5bWJvbDo6aXRlcmF0b3IgaXQgPSBhbkluc3RhbmNlLT5nZXREYXRhUGF0aCgpLT5iZWdpbigpOworCQkJVGFibGVPZlN5bWJvbDo6aXRlcmF0b3IgaXRFbmQgPSBhbkluc3RhbmNlLT5nZXREYXRhUGF0aCgpLT5wcmVkX2VuZCgpOworCQkJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApCisJCQl7CisJCQkJc3dpdGNoKCAoKml0KS5nZXRQb2ludGVyTmF0dXJlKCkgKQorCQkJCXsKKwkJCQkJY2FzZSBJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfRklFTERfQ0xBU1NfQVRUUklCVVRFX05BVFVSRToKKwkJCQkJY2FzZSBJUG9pbnRlckRhdGFOYXR1cmU6OlBPSU5URVJfRklFTERfQVJSQVlfT0ZGU0VUX05BVFVSRToKKwkJCQkJeworCQkJCQkJcnZhbHVlLm1vdmVBdFdyaXRhYmxlKCAoKml0KS5nZXRPZmZzZXQoKSApOworCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQljYXNlIElQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9GSUVMRF9BUlJBWV9JTkRFWF9OQVRVUkU6CisJCQkJCXsKKwkJCQkJCWlmKCAoKml0KS5nZXRWYWx1ZSgpLmlzSW50ZWdlcigpICkKKwkJCQkJCXsKKwkJCQkJCQlydmFsdWUubW92ZUF0V3JpdGFibGUoICgqaXQpLmdldFZhbHVlKCkudG9JbnRlZ2VyKCkgKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgaWYoICgqaXQpLmdldFZhbHVlKCkuaXNGbG9hdCgpICkKKwkJCQkJCXsKKwkJCQkJCQlydmFsdWUubW92ZUF0V3JpdGFibGUoICgqaXQpLmdldFZhbHVlKCkudG9GbG9hdCgpICk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJCQkJCTw8ICJUYWJsZU9mRGF0YTo6c2V0Oj4gdW5leHBlY3RlZCAiCisJCQkJCQkJCQkJIk5PTi1JTlRFR0VSIEFSUkFZIElOREVYIDw8ICIKKwkJCQkJCQkJCTw8ICgqaXQpLnN0clZhbHVlKCkKKwkJCQkJCQkJCTw8ICIgPj4gaW4gaW5zdGFuY2UgRlFOLUlEIDo+XG4iCisJCQkJCQkJCQk8PCAoKml0KS50b1N0cmluZyggQVZNX1RBQjFfSU5ERU5UICkKKwkJCQkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCQkJCXJldHVybjsKKwkJCQkJCX0KKworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJZGVmYXVsdDoKKwkJCQkJeworCQkJCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJCQkJPDwgIlRhYmxlT2ZEYXRhOjpzZXQ6PiBVbmV4cGVjdGVkICIKKwkJCQkJCQkJIlBPSU5URVIgTkFUVVJFIGZvciB0aGUgaW5zdGFuY2Ugb2YgZGF0YSA6PlxuIgorCQkJCQkJCQk8PCBhbkluc3RhbmNlLT50b1N0cmluZyggQVZNX1RBQjFfSU5ERU5UICkKKwkJCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJCQlyZXR1cm47CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCXN3aXRjaCggKCppdCkuZ2V0UG9pbnRlck5hdHVyZSgpICkKKwkJCXsKKwkJCQljYXNlIElQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9GSUVMRF9DTEFTU19BVFRSSUJVVEVfTkFUVVJFOgorCQkJCWNhc2UgSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX0ZJRUxEX0FSUkFZX09GRlNFVF9OQVRVUkU6CisJCQkJeworCQkJCQkvL3J2YWx1ZVsgKCppdCkuZ2V0T2Zmc2V0KCkgXS5tYWtlV3JpdGFibGUoKTsKKwkJCQkJcnZhbHVlLnNldCggKCppdCkuZ2V0T2Zmc2V0KCkgLCBhRGF0YSApOworCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljYXNlIElQb2ludGVyRGF0YU5hdHVyZTo6UE9JTlRFUl9GSUVMRF9BUlJBWV9JTkRFWF9OQVRVUkU6CisJCQkJeworCQkJCQlpZiggKCppdCkuZ2V0VmFsdWUoKS5pc0ludGVnZXIoKSApCisJCQkJCXsKKwkJCQkJCS8vcnZhbHVlWyAoKml0KS5nZXRWYWx1ZSgpLnRvSW50ZWdlcigpIF0ubWFrZVdyaXRhYmxlKCk7CisJCQkJCQlydmFsdWUuc2V0KCAoKml0KS5nZXRWYWx1ZSgpLnRvSW50ZWdlcigpICwgYURhdGEgKTsKKwkJCQkJfQorCQkJCQllbHNlIGlmKCAoKml0KS5nZXRWYWx1ZSgpLmlzRmxvYXQoKSApCisJCQkJCXsKKwkJCQkJCS8vcnZhbHVlWyAoKml0KS5nZXRWYWx1ZSgpLnRvRmxvYXQoKSBdLm1ha2VXcml0YWJsZSgpOworCQkJCQkJcnZhbHVlLnNldCggKCppdCkuZ2V0VmFsdWUoKS50b0Zsb2F0KCkgLCBhRGF0YSApOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJCQkJPDwgIlRhYmxlT2ZEYXRhOjpzZXQ6PiB1bmV4cGVjdGVkICIKKwkJCQkJCQkJCSJOT04tSU5URUdFUiBBUlJBWSBJTkRFWCA8PCAiCisJCQkJCQkJCTw8ICgqaXQpLnN0clZhbHVlKCkKKwkJCQkJCQkJPDwgIiA+PiBpbiBpbnN0YW5jZSBGUU4tSUQgOj5cbiIKKwkJCQkJCQkJPDwgKCppdCkudG9TdHJpbmcoIEFWTV9UQUIxX0lOREVOVCApCisJCQkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCQkJcmV0dXJuOworCQkJCQl9CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJCTw8ICJUYWJsZU9mRGF0YTo6c2V0Oj4gVW5leHBlY3RlZCAiCisJCQkJCQkJCSJQT0lOVEVSIE5BVFVSRSBmb3IgdGhlIGluc3RhbmNlIG9mIGRhdGEgOj5cbiIKKwkJCQkJCQk8PCBhbkluc3RhbmNlLT50b1N0cmluZyggQVZNX1RBQjFfSU5ERU5UICkKKwkJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWRlZmF1bHQ6CisJCXsKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCTw8ICJUYWJsZU9mRGF0YTo6c2V0Oj4gVW5leHBlY3RlZCAiCisJCQkJCQkiUE9JTlRFUiBOQVRVUkUgZm9yIHRoZSBpbnN0YW5jZSBvZiBkYXRhIDo+XG4iCisJCQkJCTw8IGFuSW5zdGFuY2UtPnRvU3RyaW5nKCBBVk1fVEFCMV9JTkRFTlQgKQorCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisKKy8qKgorICogU2VyaWFsaXphdGlvbgorICovCit2b2lkIFRhYmxlT2ZEYXRhOjp0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlvcyA8PCBUQUIgPDwgIiRbIjsKKwlmb3IoIGNvbnN0X2l0ZXJhdG9yIGl0ID0gYmVnaW4oKSA7IGl0ICE9IGVuZCgpIDsgKytpdCApCisJeworCQlvcyA8PCBUQUIyIDw8ICgqaXQpLkFWTV9ERUJVR19SRUZfQ09VTlRFUigpCisJCQkJPDwgIiAiIDw8ICgqaXQpLnN0cigpIDw8IEVPTDsKKwl9CisJb3MgPDwgVEFCIDw8ICJdIiA8PCBFT0xfRkxVU0g7Cit9CisKK3ZvaWQgVGFibGVPZkRhdGE6OnRvU3RyZWFtKE91dFN0cmVhbSAmIG9zLCBjb25zdCBCRlZlY3RvciAmIHZhcnMpIGNvbnN0Cit7CisJYXZtX29mZnNldF90IG9mZnNldCA9IDA7CisJZm9yKCBjb25zdF9pdGVyYXRvciBpdCA9IGJlZ2luKCkgOyBpdCAhPSBlbmQoKSA7ICsraXQsICsrb2Zmc2V0ICkKKwl7CisJCW9zIDw8IFRBQiA8PCB2YXJzW29mZnNldF0udG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCktPmdldE5hbWVJRCgpCisJCQkJPDwgIiA6PSAiIDw8ICgqaXQpLkFWTV9ERUJVR19SRUZfQ09VTlRFUigpCisJCQkJPDwgdmFyc1tvZmZzZXRdLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpLT5zdHJWYWx1ZSgpCisJCQkJPDwgIjsiIDw8IEVPTF9GTFVTSDsKKwl9Cit9CisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3J1bnRpbWUvVGFibGVPZkRhdGEuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL1RhYmxlT2ZEYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNkYjk3NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL1RhYmxlT2ZEYXRhLmgKQEAgLTAsMCArMSwxNzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgVEFCTEVPRkRBVEFfSF8KKyNkZWZpbmUgVEFCTEVPRkRBVEFfSF8KKworI2luY2x1ZGUgPGNvbW1vbi9Bdm1Qb2ludGVyLmg+CisjaW5jbHVkZSA8Y29tbW9uL0F2bU9iamVjdC5oPgorCisjaW5jbHVkZSA8Y29sbGVjdGlvbi9CRkNvbnRhaW5lci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjbGFzcyBBcnJheUJGOworY2xhc3MgQnVpbHRpbkNvbnRhaW5lcjsKK2NsYXNzIEluc3RhbmNlT2ZEYXRhOworCisKK2NsYXNzIFRhYmxlT2ZEYXRhIDoKKwkJcHVibGljIEF2bU9iamVjdCwKKwkJcHVibGljIEFycmF5T2ZCRiwKKwkJQVZNX0lOSkVDVF9JTlNUQU5DRV9DT1VOVEVSX0NMQVNTKCBUYWJsZU9mRGF0YSApCit7CisKKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggVGFibGVPZkRhdGEgKQorCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJVGFibGVPZkRhdGEoYXZtX3NpemVfdCBhU2l6ZSkKKwk6IEF2bU9iamVjdCggKSwKKwlBcnJheU9mQkYoIGFTaXplICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCVRhYmxlT2ZEYXRhKGNvbnN0IEJGVmVjdG9yICYgZGF0YVRhYmxlKQorCTogQXZtT2JqZWN0KCApLAorCUFycmF5T2ZCRiggZGF0YVRhYmxlICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCVRhYmxlT2ZEYXRhKGNvbnN0IFRhYmxlT2ZEYXRhICYgYURhdGEpCisJOiBBdm1PYmplY3QoIGFEYXRhICksCisJQXJyYXlPZkJGKCBhRGF0YSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCXZpcnR1YWwgflRhYmxlT2ZEYXRhKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogZm9yIGNvbnRhaW5lciBvZiBCRgorCSAqLworCWlubGluZSB2aXJ0dWFsIEJGICYgYXQoYXZtX3NpemVfdCBvZmZzZXQpCisJeworCQlyZXR1cm4oIG1UYWJsZVtvZmZzZXRdICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgY29uc3QgQkYgJiBhdChhdm1fc2l6ZV90IG9mZnNldCkgY29uc3QKKwl7CisJCXJldHVybiggbVRhYmxlW29mZnNldF0gKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIEJGICYgb3BlcmF0b3JbXShhdm1fc2l6ZV90IG9mZnNldCkKKwl7CisJCXJldHVybiggbVRhYmxlW29mZnNldF0gKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBjb25zdCBCRiAmIG9wZXJhdG9yW10oYXZtX3NpemVfdCBvZmZzZXQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZVtvZmZzZXRdICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCBCRiAmIGdldFdyaXRhYmxlKGF2bV9zaXplX3Qgb2Zmc2V0KSBjb25zdAorCXsKKwkJbVRhYmxlW29mZnNldF0ubWFrZVdyaXRhYmxlKCk7CisKKwkJcmV0dXJuKCBtVGFibGVbb2Zmc2V0XSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgbWFrZVdyaXRhYmxlKGF2bV9zaXplX3Qgb2Zmc2V0KSBjb25zdAorCXsKKwkJbVRhYmxlW29mZnNldF0ubWFrZVdyaXRhYmxlKCk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCBzZXQoYXZtX3NpemVfdCBvZmZzZXQsIGNvbnN0IEJGICYgYmYpIGNvbnN0CisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX0FSUkFZX0lOREVYX0VYSVQoIG9mZnNldCAsIG1TaXplICkgPDwgU0VORF9FWElUOworCisJCW1UYWJsZVtvZmZzZXRdID0gYmY7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtVGFibGUKKwkgKi8KKwljb25zdCBCRiAmIGdldChjb25zdCBJbnN0YW5jZU9mRGF0YSAqIGFuSW5zdGFuY2UpIGNvbnN0OworCisJdm9pZCBzZXQoY29uc3QgSW5zdGFuY2VPZkRhdGEgKiBhbkluc3RhbmNlLCBjb25zdCBCRiAmIGFEYXRhKSBjb25zdDsKKworCisJLyoqCisJICogU2VyaWFsaXphdGlvbgorCSAqLworCWlubGluZSB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKAorCQkJY29uc3QgQXZtSW5kZW50ICYgaW5kZW50ID0gQVZNX1RBQl9JTkRFTlQpIGNvbnN0CisJeworCQlTdHJpbmdPdXRTdHJlYW0gb3NzKGluZGVudCk7CisKKwkJdG9TdHJlYW0ob3NzKTsKKworCQlyZXR1cm4oIG9zcy5zdHIoKSApOworCX0KKworCWlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhjb25zdCBCRlZlY3RvciAmIHZhcnMsCisJCQljb25zdCBBdm1JbmRlbnQgJiBpbmRlbnQgPSBBVk1fVEFCX0lOREVOVCkgY29uc3QKKwl7CisJCVN0cmluZ091dFN0cmVhbSBvc3MoaW5kZW50KTsKKworCQl0b1N0cmVhbShvc3MsIHZhcnMpOworCisJCXJldHVybiggb3NzLnN0cigpICk7CisJfQorCisKKwl2aXJ0dWFsIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCisJdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcywgY29uc3QgQkZWZWN0b3IgJiB2YXJzKSBjb25zdDsKKworfTsKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVFlQRSBERUZJTklUSU9OIGZvciBTTUFSVCBQT0lOVEVSIGFuZCBDT05UQUlORVIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitBVk1fREVGSU5FX0FQX0NMQVNTKCBUYWJsZU9mRGF0YSApCisKKworCit9CisKKyNlbmRpZiAvKlRBQkxFT0ZEQVRBX0hfKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL1RhYmxlT2ZSdW50aW1lRm9ybVN0YXRlLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL1RhYmxlT2ZSdW50aW1lRm9ybVN0YXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDAzMWYxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3J1bnRpbWUvVGFibGVPZlJ1bnRpbWVGb3JtU3RhdGUuY3BwCkBAIC0wLDAgKzEsMjQ4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTMganVpbC4gMjAwOAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVGFibGVPZlJ1bnRpbWVGb3JtU3RhdGUuaCIKKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkRhdGEuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lRGVmLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorICogUkVTSVpFCisgKiBtRXZhbFN0YXRlCisgKiBtVGFibGVPZkFzc2lnbmVkRmxhZworICovCit2b2lkIFRhYmxlT2ZSdW50aW1lRm9ybVN0YXRlOjpyZXNpemUoYXZtX3NpemVfdCBhU2l6ZSkKK3sKKwlpZiggbVNpemUgPiAwICkKKwl7CisJCVBST0NFU1NfRVZBTF9TVEFURSAqIG9sZEV2YWxTdGF0ZSA9IG1FdmFsU3RhdGU7CisKKwkJYXZtX3NpemVfdCBvZmZzZXQgPSBtU2l6ZTsKKwkJbVNpemUgPSBhU2l6ZTsKKworCQlpZiggYVNpemUgPiBvZmZzZXQgKQorCQl7CisJCQlhU2l6ZSA9IG9mZnNldDsKKwkJfQorCisJCW1FdmFsU3RhdGUgPSBuZXcgUFJPQ0VTU19FVkFMX1NUQVRFWyBtU2l6ZSBdOworCisJCWlmKCBtVGFibGVPZkFzc2lnbmVkRmxhZyAhPSBOVUxMICkKKwkJeworCQkJVGFibGVPZkFzc2lnbmVkRmxhZyBvbGRUYWJsZU9mQXNzaWduZWQgPSBtVGFibGVPZkFzc2lnbmVkRmxhZzsKKwkJCW1UYWJsZU9mQXNzaWduZWRGbGFnID0gbmV3IEJpdHNldCAqWyBtU2l6ZSBdOworCisJCQlmb3IoIG9mZnNldCA9IDAgOyBvZmZzZXQgPCBhU2l6ZSA7ICsrb2Zmc2V0ICkKKwkJCXsKKwkJCQltRXZhbFN0YXRlWyBvZmZzZXQgXSA9IG9sZEV2YWxTdGF0ZVsgb2Zmc2V0IF07CisKKwkJCQltVGFibGVPZkFzc2lnbmVkRmxhZ1sgb2Zmc2V0IF0gPSBvbGRUYWJsZU9mQXNzaWduZWRbIG9mZnNldCBdOworCQkJfQorCisJCQlmb3IoIDsgb2Zmc2V0IDwgbVNpemUgOyArK29mZnNldCApCisJCQl7CisJCQkJbUV2YWxTdGF0ZVsgb2Zmc2V0IF0gPSBQUk9DRVNTX1VOREVGSU5FRF9TVEFURTsKKworCQkJCW1UYWJsZU9mQXNzaWduZWRGbGFnWyBvZmZzZXQgXSA9IE5VTEw7CisJCQl9CisKKwkJCWRlbGV0ZSBbXSBvbGRUYWJsZU9mQXNzaWduZWQ7CisJCX0KKwkJZWxzZQorCQl7CisJCQlmb3IoIG9mZnNldCA9IDAgOyBvZmZzZXQgPCBhU2l6ZSA7ICsrb2Zmc2V0ICkKKwkJCXsKKwkJCQltRXZhbFN0YXRlWyBvZmZzZXQgXSA9IG9sZEV2YWxTdGF0ZVsgb2Zmc2V0IF07CisJCQl9CisJCQlmb3IoIDsgb2Zmc2V0IDwgbVNpemUgOyArK29mZnNldCApCisJCQl7CisJCQkJbUV2YWxTdGF0ZVsgb2Zmc2V0IF0gPSBQUk9DRVNTX1VOREVGSU5FRF9TVEFURTsKKwkJCX0KKwkJfQorCisJCWRlbGV0ZSBbXSBvbGRFdmFsU3RhdGU7CisJfQorCisJZWxzZQorCXsKKwkJbVNpemUgPSBhU2l6ZTsKKworCQlhbGxvY1RhYmxlT2ZTdGF0ZSgpOworCX0KK30KKworCisvKioKKyAqIEFMTE9DQVRFIC0gR0VUVEVSIC0gU0VUVEVSCisgKiBtVGFibGVPZkFzc2lnbmVkRmxhZworICovCisKK3ZvaWQgVGFibGVPZlJ1bnRpbWVGb3JtU3RhdGU6OnNldEFzc2lnbmVkKGNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVELAorCQlhdm1fc2l6ZV90IHJpZCwgYXZtX3NpemVfdCBvZmZzZXQsIGJvb2wgZmxhZykKK3sKKwlpZiggbVRhYmxlT2ZBc3NpZ25lZEZsYWcgPT0gTlVMTCApCisJeworCQlhbGxvY0Fzc2lnbmVkRmxhZyhyaWQsCisJCQkJYW5FRC5nZXRSdW50aW1lKHJpZCkuZ2V0VmFyaWFibGVzKCkuc2l6ZSgpLCBmYWxzZSk7CisJfQorCWVsc2UgaWYoIG1UYWJsZU9mQXNzaWduZWRGbGFnW3JpZF0gPT0gTlVMTCApCisJeworCQltVGFibGVPZkFzc2lnbmVkRmxhZ1tyaWRdID0gbmV3IEJpdHNldCgKKwkJCQlhbkVELmdldFJ1bnRpbWUocmlkKS5nZXRWYXJpYWJsZXMoKS5zaXplKCksIGZhbHNlICk7CisJfQorCisJKCAqKG1UYWJsZU9mQXNzaWduZWRGbGFnW3JpZF0pIClbb2Zmc2V0XSA9IGZsYWc7Cit9CisKKwordm9pZCBUYWJsZU9mUnVudGltZUZvcm1TdGF0ZTo6c2V0QXNzaWduZWRVbmlvbihhdm1fc2l6ZV90IHJpZCwKKwkJQml0c2V0ICogYXNzaWduZWRUYWJsZUEsIEJpdHNldCAqIGFzc2lnbmVkVGFibGVCKQoreworCWlmKCBhc3NpZ25lZFRhYmxlQSAhPSBOVUxMICkKKwl7CisJCWlmKCBtVGFibGVPZkFzc2lnbmVkRmxhZyA9PSBOVUxMICkKKwkJeworCQkJcmVhbGxvY0Fzc2lnbmVkRmxhZygpOworCQl9CisKKwkJbVRhYmxlT2ZBc3NpZ25lZEZsYWdbcmlkXSA9IG5ldyBCaXRzZXQoICphc3NpZ25lZFRhYmxlQSApOworCisJCWlmKCBhc3NpZ25lZFRhYmxlQiAhPSBOVUxMICkKKwkJeworCQkJKCAqKG1UYWJsZU9mQXNzaWduZWRGbGFnW3JpZF0pICkgfD0gKCphc3NpZ25lZFRhYmxlQik7CisJCX0KKwl9CisJZWxzZSBpZiggYXNzaWduZWRUYWJsZUIgIT0gTlVMTCApCisJeworCQlpZiggbVRhYmxlT2ZBc3NpZ25lZEZsYWcgPT0gTlVMTCApCisJCXsKKwkJCXJlYWxsb2NBc3NpZ25lZEZsYWcoKTsKKwkJfQorCisJCW1UYWJsZU9mQXNzaWduZWRGbGFnW3JpZF0gPSBuZXcgQml0c2V0KCAqYXNzaWduZWRUYWJsZUIgKTsKKwl9Cit9CisKKworCisKKy8qKgorICogQ09NUEFSSVNPTgorICovCitib29sIFRhYmxlT2ZSdW50aW1lRm9ybVN0YXRlOjplcXVhbHNTdGF0ZShUYWJsZU9mUnVudGltZUZvcm1TdGF0ZSAqIG90aGVyKSBjb25zdAoreworCWlmKCB0aGlzLT5tRXZhbFN0YXRlICE9IG90aGVyLT5tRXZhbFN0YXRlICkKKwl7CisJCWlmKCB0aGlzLT5zaXplKCkgPT0gb3RoZXItPnNpemUoKSApCisJCXsKKwkJCWZvciggYXZtX3NpemVfdCBpID0gMCA7IGkgIT0gdGhpcy0+c2l6ZSgpIDsgKytpICkKKwkJCXsKKwkJCQlpZiggaXNORVEodGhpcy0+c3RhdGVBdChpKSwgb3RoZXIgLT5zdGF0ZUF0KGkpKSApCisJCQkJeworCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCQllbHNlIGlmKCB0aGlzLT5zaXplKCkgPCBvdGhlci0+c2l6ZSgpICkKKwkJeworCQkJYXZtX3NpemVfdCBpID0gMDsKKworCQkJZm9yKCA7IGkgIT0gdGhpcy0+c2l6ZSgpIDsgKytpICkKKwkJCXsKKwkJCQlpZiggdGhpcy0+c3RhdGVBdChpKSAhPSBvdGhlciAtPnN0YXRlQXQoaSkgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCX0KKwkJCX0KKworCQkJZm9yKCA7IGkgIT0gb3RoZXItPnNpemUoKSA7ICsraSApCisJCQl7CisJCQkJaWYoIG90aGVyLT5zdGF0ZUF0KGkpICE9IFBST0NFU1NfREVTVFJPWUVEX1NUQVRFICkKKwkJCQl7CisJCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCQl9CisJCQl9CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisJCWVsc2UgaWYoIHRoaXMtPnNpemUoKSA+IG90aGVyLT5zaXplKCkgKQorCQl7CisJCQlhdm1fc2l6ZV90IGkgPSAwOworCisJCQlmb3IoIDsgaSAhPSB0aGlzLT5zaXplKCkgOyArK2kgKQorCQkJeworCQkJCWlmKCB0aGlzLT5zdGF0ZUF0KGkpICE9IG90aGVyIC0+c3RhdGVBdChpKSApCisJCQkJeworCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJfQorCQkJfQorCisJCQlmb3IoIDsgaSAhPSB0aGlzLT5zaXplKCkgOyArK2kgKQorCQkJeworCQkJCWlmKCB0aGlzLT5zdGF0ZUF0KGkpICE9IFBST0NFU1NfREVTVFJPWUVEX1NUQVRFICkKKwkJCQl7CisJCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCQl9CisJCQl9CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworCisvKioKKyAqIFNlcmlhbGl6YXRpb24KKyAqLwordm9pZCBUYWJsZU9mUnVudGltZUZvcm1TdGF0ZTo6dG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDAgOyBvZmZzZXQgIT0gbVNpemUgOyArK29mZnNldCApCisJeworCQlvcyA8PCBUQUIgPDwgInJpZCMiIDw8IG9mZnNldCA8PCAiID0gIgorCQkJCTw8IFJ1bnRpbWVEZWY6OnN0clBFUyggbUV2YWxTdGF0ZVtvZmZzZXRdICkKKwkJCQk8PCAiOyIgPDwgRU9MX0ZMVVNIOworCX0KK30KKworCit2b2lkIFRhYmxlT2ZSdW50aW1lRm9ybVN0YXRlOjp0b1N0cmVhbSgKKwkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQsIE91dFN0cmVhbSAmIG9zKSBjb25zdAoreworCWZvciggYXZtX3NpemVfdCBvZmZzZXQgPSAwIDsgb2Zmc2V0ICE9IG1TaXplIDsgKytvZmZzZXQgKQorCXsKKy8vQVZNX0lGX0RFQlVHX0xFVkVMX0dUX01FRElVTV9PUiggbUV2YWxTdGF0ZVtpXSAhPSBQUk9DRVNTX0lETEVfU1RBVEUgKQorCQlvcyA8PCBUQUIgPDwgIjxAcmlkIyIgPDwgb2Zmc2V0IDw8ICIgPSAiCisJCQkJPDwgUnVudGltZURlZjo6c3RyUEVTKCBtRXZhbFN0YXRlW29mZnNldF0gKSA8PCAiO1x0XHQvLyAiCisJCQkJPDwgYW5FRC5nZXRSdW50aW1lKG9mZnNldCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJCTw8IEVPTF9GTFVTSDsKKy8vQVZNX0lGX0RFQlVHX0xFVkVMX0dUX01FRElVTV9PUgorCX0KK30KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3J1bnRpbWUvVGFibGVPZlJ1bnRpbWVGb3JtU3RhdGUuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL1RhYmxlT2ZSdW50aW1lRm9ybVN0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ2ZGUzOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9ydW50aW1lL1RhYmxlT2ZSdW50aW1lRm9ybVN0YXRlLmgKQEAgLTAsMCArMSw2NTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxMyBqdWlsLiAyMDA4CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgVEFCTEVPRlJVTlRJTUVGT1JNU1RBVEVfSF8KKyNkZWZpbmUgVEFCTEVPRlJVTlRJTUVGT1JNU1RBVEVfSF8KKworI2luY2x1ZGUgPGNvbW1vbi9Bdm1PYmplY3QuaD4KKworI2luY2x1ZGUgPGNvbW1vbi9Bdm1Qb2ludGVyLmg+CisKKyNpbmNsdWRlIDxjb2xsZWN0aW9uL0JpdHNldC5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvUnVudGltZURlZi5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjbGFzcyBFeGVjdXRpb25EYXRhOworCisKK2NsYXNzIFRhYmxlT2ZSdW50aW1lRm9ybVN0YXRlICA6CisJCXB1YmxpYyBBdm1PYmplY3QsCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggVGFibGVPZlJ1bnRpbWVGb3JtU3RhdGUgKQoreworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIFRhYmxlT2ZSdW50aW1lRm9ybVN0YXRlICkKKworCitwdWJsaWM6CisJLyoqCisJICogVFlQRURFRgorCSAqLworCXR5cGVkZWYgQml0c2V0ICogKiBUYWJsZU9mQXNzaWduZWRGbGFnOworCitwcm90ZWN0ZWQgOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlhdm1fc2l6ZV90IG1TaXplOworCisJUFJPQ0VTU19FVkFMX1NUQVRFICogbUV2YWxTdGF0ZTsKKworCVRhYmxlT2ZBc3NpZ25lZEZsYWcgbVRhYmxlT2ZBc3NpZ25lZEZsYWc7CisKKworcHVibGljOgorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJVGFibGVPZlJ1bnRpbWVGb3JtU3RhdGUoYXZtX3NpemVfdCBhU2l6ZSkKKwk6IEF2bU9iamVjdCggKSwKKwltU2l6ZSggYVNpemUgKSwKKwltRXZhbFN0YXRlKCBOVUxMICksCisJbVRhYmxlT2ZBc3NpZ25lZEZsYWcoIE5VTEwgKQorCXsKKwkJYWxsb2NUYWJsZU9mU3RhdGUoKTsKKwkJcmVzZXRUYWJsZU9mU3RhdGUoKTsKKwl9CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIENvcHkKKwkgKi8KKwlUYWJsZU9mUnVudGltZUZvcm1TdGF0ZShjb25zdCBUYWJsZU9mUnVudGltZUZvcm1TdGF0ZSAmIGFUYWJsZSkKKwk6IEF2bU9iamVjdCggYVRhYmxlICksCisJbVNpemUoIGFUYWJsZS5tU2l6ZSApLAorCW1FdmFsU3RhdGUoIE5VTEwgKSwKKwltVGFibGVPZkFzc2lnbmVkRmxhZyggTlVMTCApCisJeworCQlhbGxvY1RhYmxlT2ZTdGF0ZSggYVRhYmxlLm1FdmFsU3RhdGUgKTsKKworCQlpZiggYVRhYmxlLm1UYWJsZU9mQXNzaWduZWRGbGFnICE9IE5VTEwgKQorCQl7CisJCQlhbGxvY0Fzc2lnbmVkRmxhZyggYVRhYmxlLm1UYWJsZU9mQXNzaWduZWRGbGFnICk7CisJCX0KKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5UYWJsZU9mUnVudGltZUZvcm1TdGF0ZSgpCisJeworCQlkZWxldGUgW10gbUV2YWxTdGF0ZTsKKworCQlkZXN0cm95QXNzaWduZWRGbGFncygpOworCX0KKworCisJLyoqCisJICogQUxMT0NBVEUKKwkgKiByZXNldAorCSAqLworCWlubGluZSB2b2lkIHJlc2V0KGNvbnN0IFRhYmxlT2ZSdW50aW1lRm9ybVN0YXRlICYgYVRhYmxlLAorCQkJYm9vbCBhc3NpZ25lZFJlc2V0RmxhZyA9IHRydWUpCisJeworCQlpZiggYXNzaWduZWRSZXNldEZsYWcgKQorCQl7CisJCQlkZXN0cm95QXNzaWduZWRGbGFncygpOworCQl9CisKKwkJaWYoIG1TaXplID09IGFUYWJsZS5tU2l6ZSAgKQorCQl7CisJCQlyZXNldFRhYmxlT2ZTdGF0ZSggYVRhYmxlLm1FdmFsU3RhdGUgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW1TaXplID0gYVRhYmxlLm1TaXplOworCisJCQlkZWxldGUgW10gbUV2YWxTdGF0ZTsKKworCQkJYWxsb2NUYWJsZU9mU3RhdGUoIGFUYWJsZS5tRXZhbFN0YXRlICk7CisJCX0KKworCQlpZiggYXNzaWduZWRSZXNldEZsYWcgJiYgKGFUYWJsZS5tVGFibGVPZkFzc2lnbmVkRmxhZyAhPSBOVUxMKSApCisJCXsKKwkJCWFsbG9jQXNzaWduZWRGbGFnKCBhVGFibGUubVRhYmxlT2ZBc3NpZ25lZEZsYWcgKTsKKwkJfQorCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVNpemUKKwkgKi8KKwlpbmxpbmUgYXZtX3NpemVfdCBzaXplKCkgY29uc3QKKwl7CisJCXJldHVybiggbVNpemUgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBub25lbXB0eSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1TaXplID4gMCApOworCX0KKworCisJdm9pZCByZXNpemUoYXZtX3NpemVfdCBuZXdTaXplKTsKKworCisJLyoqCisJICogQUxMT0NBVEUgLSBHRVRURVIgLSBTRVRURVIKKwkgKiBtRXZhbFN0YXRlCisJICovCisJaW5saW5lIHZvaWQgYWxsb2NUYWJsZU9mU3RhdGUoKQorCXsKKwkJbUV2YWxTdGF0ZSA9ICggbVNpemUgPiAwICkgPworCQkJCSggbmV3IFBST0NFU1NfRVZBTF9TVEFURVsgbVNpemUgXSApIDogTlVMTDsKKwl9CisKKworCWlubGluZSB2b2lkIGFsbG9jVGFibGVPZlN0YXRlKFBST0NFU1NfRVZBTF9TVEFURSAqIHRhYmxlT2ZTdGF0ZSkKKwl7CisJCW1FdmFsU3RhdGUgPSAoIG1TaXplID4gMCApID8KKwkJCQkoIG5ldyBQUk9DRVNTX0VWQUxfU1RBVEVbIG1TaXplIF0gKSA6IE5VTEw7CisKKwkJcmVzZXRUYWJsZU9mU3RhdGUodGFibGVPZlN0YXRlKTsKKwl9CisKKworCWlubGluZSB2b2lkIHJlc2V0VGFibGVPZlN0YXRlKAorCQkJUFJPQ0VTU19FVkFMX1NUQVRFIHZhbHVlID0gUFJPQ0VTU19VTkRFRklORURfU1RBVEUpCisJeworCQlmb3IoIGF2bV9zaXplX3QgaSA9IDAgOyBpICE9IG1TaXplIDsgKytpICkKKwkJeworCQkJbUV2YWxTdGF0ZVtpXSA9IHZhbHVlOworCQl9CisJfQorCisJaW5saW5lIHZvaWQgcmVzZXRUYWJsZU9mU3RhdGUoUFJPQ0VTU19FVkFMX1NUQVRFICogdGFibGVPZlN0YXRlKQorCXsKKwkJZm9yKCBhdm1fc2l6ZV90IGkgPSAwIDsgaSAhPSBtU2l6ZSA7ICsraSApCisJCXsKKwkJCW1FdmFsU3RhdGVbaV0gPSB0YWJsZU9mU3RhdGVbaV07CisJCX0KKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1FdmFsU3RhdGUKKwkgKi8KKwlpbmxpbmUgUFJPQ0VTU19FVkFMX1NUQVRFICogZ2V0RXZhbFN0YXRlKCkgY29uc3QKKwl7CisJCXJldHVybiggbUV2YWxTdGF0ZSApOworCX0KKworCWlubGluZSBQUk9DRVNTX0VWQUxfU1RBVEUgc3RhdGVBdChhdm1fc2l6ZV90IHJpZCkgY29uc3QKKwl7CisJCXJldHVybiggbUV2YWxTdGF0ZVtyaWRdICk7CisJfQorCisJaW5saW5lIFBST0NFU1NfRVZBTF9TVEFURSBzdGF0ZUdldChhdm1fc2l6ZV90IHJpZCkgY29uc3QKKwl7CisJCXJldHVybiggbUV2YWxTdGF0ZVtyaWRdICk7CisJfQorCisJaW5saW5lIHZvaWQgc3RhdGVTZXQoYXZtX3NpemVfdCByaWQsIFBST0NFU1NfRVZBTF9TVEFURSBhRXZhbFN0YXRlKQorCXsKKwkJbUV2YWxTdGF0ZVtyaWRdID0gYUV2YWxTdGF0ZTsKKwl9CisKKworCS8qKgorCSAqIFRFU1QKKwkgKiBtRXZhbFN0YXRlCisJICovCisJaW5saW5lIGJvb2wgaXNDcmVhdGluZyhhdm1fb2Zmc2V0X3Qgb2Zmc2V0KSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRXZhbFN0YXRlW29mZnNldF0gPT0gUFJPQ0VTU19DUkVBVElOR19TVEFURSApOworCX0KKworCWlubGluZSBib29sIGlzQ3JlYXRlZChhdm1fb2Zmc2V0X3Qgb2Zmc2V0KSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRXZhbFN0YXRlW29mZnNldF0gPT0gUFJPQ0VTU19DUkVBVEVEX1NUQVRFICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNMb2FkZWQoYXZtX29mZnNldF90IG9mZnNldCkgY29uc3QKKwl7CisJCXJldHVybiggbUV2YWxTdGF0ZVtvZmZzZXRdID09IFBST0NFU1NfTE9BREVEX1NUQVRFICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBpc1N0YXJ0aW5nKGF2bV9vZmZzZXRfdCBvZmZzZXQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1FdmFsU3RhdGVbb2Zmc2V0XSA9PSBQUk9DRVNTX1NUQVJUSU5HX1NUQVRFICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNJbml0aW5nKGF2bV9vZmZzZXRfdCBvZmZzZXQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1FdmFsU3RhdGVbb2Zmc2V0XSA9PSBQUk9DRVNTX0lOSVRJTkdfU1RBVEUgKTsKKwl9CisKKworCWlubGluZSBib29sIGlzU3RvcHBpbmcoYXZtX29mZnNldF90IG9mZnNldCkgY29uc3QKKwl7CisJCXJldHVybiggbUV2YWxTdGF0ZVtvZmZzZXRdID09IFBST0NFU1NfU1RPUFBJTkdfU1RBVEUgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc1N0b3BwZWQoYXZtX29mZnNldF90IG9mZnNldCkgY29uc3QKKwl7CisJCXJldHVybiggbUV2YWxTdGF0ZVtvZmZzZXRdID09IFBST0NFU1NfU1RPUFBFRF9TVEFURSApOworCX0KKworCisJaW5saW5lIGJvb2wgaXNGaW5hbGl6aW5nKGF2bV9vZmZzZXRfdCBvZmZzZXQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1FdmFsU3RhdGVbb2Zmc2V0XSA9PSBQUk9DRVNTX0ZJTkFMSVpJTkdfU1RBVEUgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc0ZpbmFsaXplZChhdm1fb2Zmc2V0X3Qgb2Zmc2V0KSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRXZhbFN0YXRlW29mZnNldF0gPT0gUFJPQ0VTU19GSU5BTElaRURfU1RBVEUgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc0Rlc3Ryb3llZChhdm1fb2Zmc2V0X3Qgb2Zmc2V0KSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRXZhbFN0YXRlW29mZnNldF0gPT0gUFJPQ0VTU19ERVNUUk9ZRURfU1RBVEUgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc0ZpbmFsaXplZE9yRGVzdHJveWVkKGF2bV9vZmZzZXRfdCBvZmZzZXQpIGNvbnN0CisJeworCQlyZXR1cm4oIChtRXZhbFN0YXRlW29mZnNldF0gPT0gUFJPQ0VTU19GSU5BTElaRURfU1RBVEUpIHx8CisvLwkJCQkobUV2YWxTdGF0ZVtvZmZzZXRdID09IFBST0NFU1NfQ1JFQVRFRF9TVEFURSAgKSB8fCAvLyBUT0RPICE/IQorCQkJCShtRXZhbFN0YXRlW29mZnNldF0gPT0gUFJPQ0VTU19ERVNUUk9ZRURfU1RBVEUpICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNBbGl2ZShhdm1fb2Zmc2V0X3Qgb2Zmc2V0KSBjb25zdAorCXsKKwkJcmV0dXJuKCAobUV2YWxTdGF0ZVtvZmZzZXRdICE9IFBST0NFU1NfRklOQUxJWkVEX1NUQVRFKSAmJgorCQkJCShtRXZhbFN0YXRlW29mZnNldF0gIT0gUFJPQ0VTU19ERVNUUk9ZRURfU1RBVEUpICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBpc1N1c3BlbmRlZChhdm1fb2Zmc2V0X3Qgb2Zmc2V0KSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRXZhbFN0YXRlW29mZnNldF0gPT0gUFJPQ0VTU19TVVNQRU5ERURfU1RBVEUgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc1dhaXRpbmcoYXZtX29mZnNldF90IG9mZnNldCkgY29uc3QKKwl7CisJCXJldHVybiggbUV2YWxTdGF0ZVtvZmZzZXRdID09IFBST0NFU1NfV0FJVElOR19TVEFURSApOworCX0KKworCWlubGluZSBib29sIGlzV2FpdGluZ0pvaW4oYXZtX29mZnNldF90IG9mZnNldCkgY29uc3QKKwl7CisJCXJldHVybiggbUV2YWxTdGF0ZVtvZmZzZXRdID09IFBST0NFU1NfV0FJVElOR19KT0lOX1NUQVRFICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBpc0Fib3J0ZWQoYXZtX29mZnNldF90IG9mZnNldCkgY29uc3QKKwl7CisJCXJldHVybiggKG1FdmFsU3RhdGVbb2Zmc2V0XSA9PSBQUk9DRVNTX0FCT1JURURfU1RBVEUpICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNEaXNhYmxlKGF2bV9vZmZzZXRfdCBvZmZzZXQpIGNvbnN0CisJeworCQlyZXR1cm4oIChtRXZhbFN0YXRlW29mZnNldF0gPT0gUFJPQ0VTU19ESVNBQkxFRF9TVEFURSkgKTsKKwl9CisKKworCWlubGluZSBib29sIGlzRGlzYWJsZU9yQWJvcnRlZChhdm1fb2Zmc2V0X3Qgb2Zmc2V0KSBjb25zdAorCXsKKwkJcmV0dXJuKCAobUV2YWxTdGF0ZVtvZmZzZXRdID09IFBST0NFU1NfRElTQUJMRURfU1RBVEUpIHx8CisJCQkJKG1FdmFsU3RhdGVbb2Zmc2V0XSA9PSBQUk9DRVNTX0FCT1JURURfU1RBVEUpKTsKKwl9CisKKworCWlubGluZSBib29sIGlzSWRsZShhdm1fb2Zmc2V0X3Qgb2Zmc2V0KSBjb25zdAorCXsKKwkJcmV0dXJuKCAobUV2YWxTdGF0ZVtvZmZzZXRdID09IFBST0NFU1NfSURMRV9TVEFURSkgKTsKKwl9CisKKworCWlubGluZSBib29sIGlzUnVubmluZyhhdm1fb2Zmc2V0X3Qgb2Zmc2V0KSBjb25zdAorCXsKKwkJcmV0dXJuKCAobUV2YWxTdGF0ZVtvZmZzZXRdID09IFBST0NFU1NfUlVOTklOR19TVEFURSkgfHwKKwkJCQkobUV2YWxTdGF0ZVtvZmZzZXRdID09IFBST0NFU1NfUlRDX1NUQVRFKSApOworCX0KKworCisJaW5saW5lIGJvb2wgaXNJZGxlT3JSdW5uaW5nKFBST0NFU1NfRVZBTF9TVEFURSBhU3RhdGUpIGNvbnN0CisJeworCQlyZXR1cm4oIChhU3RhdGUgPT0gUFJPQ0VTU19JRExFX1NUQVRFKSAgICB8fAorCQkJCShhU3RhdGUgPT0gUFJPQ0VTU19SVU5OSU5HX1NUQVRFKSB8fAorCQkJCShhU3RhdGUgPT0gUFJPQ0VTU19SVENfU1RBVEUpICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNub3RJZGxlT3JSdW5uaW5nKFBST0NFU1NfRVZBTF9TVEFURSBhU3RhdGUpIGNvbnN0CisJeworCQlyZXR1cm4oIChhU3RhdGUgIT0gUFJPQ0VTU19JRExFX1NUQVRFKSAgICAmJgorCQkJCShhU3RhdGUgIT0gUFJPQ0VTU19SVU5OSU5HX1NUQVRFKSAmJgorCQkJCShhU3RhdGUgIT0gUFJPQ0VTU19SVENfU1RBVEUpICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNJZGxlT3JSdW5uaW5nKGF2bV9vZmZzZXRfdCBvZmZzZXQpIGNvbnN0CisJeworCQlyZXR1cm4oIGlzSWRsZU9yUnVubmluZyhtRXZhbFN0YXRlW29mZnNldF0pICk7CisJfQorCisKKwkvLyBERUZJTkVEIC8gVU5ERUZJTkVEIFNUQVRFCisJaW5saW5lIGJvb2wgaXNEZWZpbmVkKGF2bV9vZmZzZXRfdCBvZmZzZXQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1FdmFsU3RhdGVbb2Zmc2V0XSAhPSBQUk9DRVNTX1VOREVGSU5FRF9TVEFURSApOworCX0KKworCWlubGluZSBib29sIGlzVW5kZWZpbmVkKGF2bV9vZmZzZXRfdCBvZmZzZXQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1FdmFsU3RhdGVbb2Zmc2V0XSA9PSBQUk9DRVNTX1VOREVGSU5FRF9TVEFURSApOworCX0KKworCisJLyoqCisJICogVEVTVAorCSAqIG1FdmFsU3RhdGUKKwkgKi8KKwlpbmxpbmUgYm9vbCBpc1J1bm5hYmxlKGF2bV9vZmZzZXRfdCBvZmZzZXQpIGNvbnN0CisJeworCQlzd2l0Y2goIG1FdmFsU3RhdGVbb2Zmc2V0XSApCisJCXsKKwkJCWNhc2UgUFJPQ0VTU19JRExFX1NUQVRFOgorCQkJY2FzZSBQUk9DRVNTX1JVTk5JTkdfU1RBVEU6CisJCQljYXNlIFBST0NFU1NfUlRDX1NUQVRFOgorCQkJY2FzZSBQUk9DRVNTX0RJU0FCTEVEX1NUQVRFOgorCQkJY2FzZSBQUk9DRVNTX0FCT1JURURfU1RBVEU6CisJCQljYXNlIFBST0NFU1NfSU5JVElOR19TVEFURToKKwkJCWNhc2UgUFJPQ0VTU19TVEFSVElOR19TVEFURToKKwkJCWNhc2UgUFJPQ0VTU19MT0FERURfU1RBVEU6CisJCQl7CisJCQkJcmV0dXJuKCB0cnVlICk7CisJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJfQorCQl9CisJfQorCisKKwlpbmxpbmUgYm9vbCBpc3VuUnVubmFibGUoYXZtX29mZnNldF90IG9mZnNldCkgY29uc3QKKwl7CisKKwkJc3dpdGNoKCBtRXZhbFN0YXRlW29mZnNldF0gKQorCQl7CisJCQljYXNlIFBST0NFU1NfRklOQUxJWkVEX1NUQVRFOgorCQkJY2FzZSBQUk9DRVNTX0RFU1RST1lFRF9TVEFURToKKwkJCXsKKwkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCX0KKworCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQl9CisJCX0KKwl9CisKKworCS8vIENSRUFURUQgb3IgUlVOTkFCTEUgU1RBVEUKKwlpbmxpbmUgYm9vbCBpc0NyZWF0ZWRPclJ1bm5hYmxlKGF2bV9vZmZzZXRfdCBvZmZzZXQpIGNvbnN0CisJeworCQlyZXR1cm4oIGlzQ3JlYXRlZChvZmZzZXQpIHx8IGlzUnVubmFibGUob2Zmc2V0KSApOworCX0KKworCisJLyoqCisJICogQ09NUEFSSVNPTgorCSAqLworCWJvb2wgZXF1YWxzU3RhdGUoVGFibGVPZlJ1bnRpbWVGb3JtU3RhdGUgKiBvdGhlcikgY29uc3Q7CisKKworCWlubGluZSBib29sIGlzRVEoUFJPQ0VTU19FVkFMX1NUQVRFIG9uZVN0YXRlLAorCQkJUFJPQ0VTU19FVkFMX1NUQVRFIG90aGVyU3RhdGUpIGNvbnN0CisJeworCQlyZXR1cm4oIChvbmVTdGF0ZSA9PSBvdGhlclN0YXRlKQorCQkJCXx8IChpc0lkbGVPclJ1bm5pbmcob25lU3RhdGUpCisJCQkJCSYmIGlzSWRsZU9yUnVubmluZyhvdGhlclN0YXRlKSkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc05FUShQUk9DRVNTX0VWQUxfU1RBVEUgb25lU3RhdGUsCisJCQlQUk9DRVNTX0VWQUxfU1RBVEUgb3RoZXJTdGF0ZSkgY29uc3QKKwl7CisJCXJldHVybiggKG9uZVN0YXRlICE9IG90aGVyU3RhdGUpCisJCQkJJiYgKGlzbm90SWRsZU9yUnVubmluZyhvbmVTdGF0ZSkKKwkJCQkJfHwgaXNub3RJZGxlT3JSdW5uaW5nKG90aGVyU3RhdGUpKSApOworCX0KKworCisJLyoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogUkVTRVQgLSBBTExPQ0FUSU9OIDo+IG1UYWJsZU9mQXNzaWduZWRGbGFnCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCWlubGluZSBUYWJsZU9mQXNzaWduZWRGbGFnIGdldFRhYmxlT2ZBc3NpZ25lZEZsYWcoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVGFibGVPZkFzc2lnbmVkRmxhZyApOworCX0KKworCWlubGluZSB2b2lkIHNldFRhYmxlT2ZBc3NpZ25lZEZsYWcoVGFibGVPZkFzc2lnbmVkRmxhZyBhVGFibGVPZkFzc2lnbmVkRmxhZykKKwl7CisJCW1UYWJsZU9mQXNzaWduZWRGbGFnID0gYVRhYmxlT2ZBc3NpZ25lZEZsYWc7CisJfQorCisKKwkvLyBHTE9CQUwgVEFCTEUKKwlpbmxpbmUgdm9pZCBkZXN0cm95QXNzaWduZWRGbGFncygpCisJeworCQlpZiggbVRhYmxlT2ZBc3NpZ25lZEZsYWcgIT0gTlVMTCApCisJCXsKKwkJCWZvciggYXZtX3NpemVfdCBpID0gMCA7IGkgPCBtU2l6ZSA7ICsraSApCisJCQl7CisJCQkJZGVsZXRlIG1UYWJsZU9mQXNzaWduZWRGbGFnW2ldOworCQkJfQorCisJCQlkZWxldGVbXSBtVGFibGVPZkFzc2lnbmVkRmxhZzsKKworCQkJbVRhYmxlT2ZBc3NpZ25lZEZsYWcgPSBOVUxMOworCQl9CisJfQorCisKKwlpbmxpbmUgdm9pZCByZXNldEFzc2lnbmVkRmxhZ3MoKQorCXsKKwkJaWYoIG1UYWJsZU9mQXNzaWduZWRGbGFnICE9IE5VTEwgKQorCQl7CisJCQlmb3IoIGF2bV9zaXplX3QgaSA9IDAgOyBpIDwgbVNpemUgOyArK2kgKQorCQkJeworCQkJCWRlbGV0ZSBtVGFibGVPZkFzc2lnbmVkRmxhZ1tpXTsKKworCQkJCW1UYWJsZU9mQXNzaWduZWRGbGFnW2ldID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KKworCisJaW5saW5lIHZvaWQgcmVzZXRBc3NpZ25lZEZsYWdzKEJpdHNldCAqICogdGFibGVPZkFzc2lnbkZsYWcpCisJeworCQlpZiggbVRhYmxlT2ZBc3NpZ25lZEZsYWcgIT0gTlVMTCApCisJCXsKKwkJCWZvciggYXZtX3NpemVfdCBpID0gMCA7IGkgPCBtU2l6ZSA7ICsraSApCisJCQl7CisJCQkJZGVsZXRlIG1UYWJsZU9mQXNzaWduZWRGbGFnW2ldOworCisJCQkJbVRhYmxlT2ZBc3NpZ25lZEZsYWdbaV0gPSAoIHRhYmxlT2ZBc3NpZ25GbGFnW2ldICE9IE5VTEwgKSA/CisJCQkJCQluZXcgQml0c2V0KCAqKHRhYmxlT2ZBc3NpZ25GbGFnW2ldKSApIDogTlVMTDsKKwkJCX0KKwkJfQorCX0KKworCisJLy8gR0xPQkFMIFRBQkxFCisJaW5saW5lIHZvaWQgYWxsb2NBc3NpZ25lZEZsYWcoQml0c2V0ICogKiB0YWJsZU9mQXNzaWduRmxhZykKKwl7CisJCW1UYWJsZU9mQXNzaWduZWRGbGFnID0gKCBtU2l6ZSA+IDAgKSA/CisJCQkJKCBuZXcgQml0c2V0ICpbIG1TaXplIF0gKSA6IE5VTEw7CisKKwkJZm9yKCBhdm1fc2l6ZV90IGkgPSAwIDsgaSA8IG1TaXplIDsgKytpICkKKwkJeworCQkJbVRhYmxlT2ZBc3NpZ25lZEZsYWdbaV0gPSAoIHRhYmxlT2ZBc3NpZ25GbGFnW2ldICE9IE5VTEwgKSA/CisJCQkJCSggbmV3IEJpdHNldCggKih0YWJsZU9mQXNzaWduRmxhZ1tpXSkgKSApIDogTlVMTDsKKwkJfQorCX0KKworCWlubGluZSB2b2lkIHJlYWxsb2NBc3NpZ25lZEZsYWcoKQorCXsKKwkJZGVzdHJveUFzc2lnbmVkRmxhZ3MoKTsKKworCQltVGFibGVPZkFzc2lnbmVkRmxhZyA9ICggbVNpemUgPiAwICkgPworCQkJCSggbmV3IEJpdHNldCAqWyBtU2l6ZSBdICkgOiBOVUxMOworCisJCWZvciggYXZtX3NpemVfdCBpID0gMCA7IGkgPCBtU2l6ZSA7ICsraSApCisJCXsKKwkJCW1UYWJsZU9mQXNzaWduZWRGbGFnW2ldID0gTlVMTDsKKwkJfQorCX0KKworCisJLy8gUkYgVEFCTEUKKwlpbmxpbmUgdm9pZCBhbGxvY0Fzc2lnbmVkRmxhZyhhdm1fc2l6ZV90IHJpZCwgYXZtX3NpemVfdCBhU2l6ZSwgYm9vbCB2YWx1ZSkKKwl7CisJCXJlYWxsb2NBc3NpZ25lZEZsYWcoKTsKKworCQltVGFibGVPZkFzc2lnbmVkRmxhZ1tyaWRdID0gKCBhU2l6ZSA+IDAgKSA/CisJCQkJKCBuZXcgQml0c2V0KCBhU2l6ZSwgdmFsdWUgKSApIDogTlVMTDsKKwl9CisKKworCS8vIEFTU0lHTkVEIFRFU1QKKwlpbmxpbmUgQml0c2V0ICogZ2V0QXNzaWduZWQoYXZtX3NpemVfdCByaWQpIGNvbnN0CisJeworCQlpZiggbVRhYmxlT2ZBc3NpZ25lZEZsYWcgIT0gTlVMTCApCisJCXsKKwkJCXJldHVybiggbVRhYmxlT2ZBc3NpZ25lZEZsYWdbcmlkXSApOworCQl9CisJCXJldHVybiggTlVMTCApOworCX0KKworCWlubGluZSBib29sIGlzQXNzaWduZWQoYXZtX3NpemVfdCByaWQsIGF2bV9vZmZzZXRfdCBvZmZzZXQpIGNvbnN0CisJeworCQlpZiggbVRhYmxlT2ZBc3NpZ25lZEZsYWcgIT0gTlVMTCApCisJCXsKKwkJCWlmKCBtVGFibGVPZkFzc2lnbmVkRmxhZ1tyaWRdICE9IE5VTEwgKQorCQkJeworCQkJCXJldHVybiggKCoobVRhYmxlT2ZBc3NpZ25lZEZsYWdbcmlkXSkpW29mZnNldF0gKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBoYXNBc3NpZ25lZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1UYWJsZU9mQXNzaWduZWRGbGFnICE9IE5VTEwgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCB6ZXJvQXNzaWduZWQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtVGFibGVPZkFzc2lnbmVkRmxhZyA9PSBOVUxMICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBoYXNBc3NpZ25lZChhdm1fc2l6ZV90IHJpZCkgY29uc3QKKwl7CisJCWlmKCBtVGFibGVPZkFzc2lnbmVkRmxhZyAhPSBOVUxMICkKKwkJeworCQkJcmV0dXJuKCBtVGFibGVPZkFzc2lnbmVkRmxhZ1tyaWRdICE9IE5VTEwgKTsKKwkJfQorCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCB6ZXJvQXNzaWduZWQoYXZtX3NpemVfdCByaWQpIGNvbnN0CisJeworCQlpZiggbVRhYmxlT2ZBc3NpZ25lZEZsYWcgIT0gTlVMTCApCisJCXsKKwkJCXJldHVybiggbVRhYmxlT2ZBc3NpZ25lZEZsYWdbcmlkXSA9PSBOVUxMICk7CisJCX0KKworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKworCisJdm9pZCBzZXRBc3NpZ25lZChjb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCwKKwkJCWF2bV9zaXplX3QgcmlkLCBhdm1fc2l6ZV90IG9mZnNldCwgYm9vbCBmbGFnKTsKKworCisJaW5saW5lIHZvaWQgc2V0QXNzaWduZWQoYXZtX3NpemVfdCByaWQsIEJpdHNldCAqIGFzc2lnbmVkVGFibGUpCisJeworCQlpZiggbVRhYmxlT2ZBc3NpZ25lZEZsYWcgPT0gTlVMTCApCisJCXsKKwkJCXJlYWxsb2NBc3NpZ25lZEZsYWcoKTsKKwkJfQorCQllbHNlIGlmKCBtVGFibGVPZkFzc2lnbmVkRmxhZ1tyaWRdICE9IE5VTEwgKQorCQl7CisJCQlkZWxldGUgbVRhYmxlT2ZBc3NpZ25lZEZsYWdbcmlkXTsKKwkJfQorCisJCW1UYWJsZU9mQXNzaWduZWRGbGFnW3JpZF0gPSAoIGFzc2lnbmVkVGFibGUgIT0gTlVMTCApID8KKwkJCQkoIG5ldyBCaXRzZXQoICphc3NpZ25lZFRhYmxlICkgKSA6IE5VTEw7CisJfQorCisKKwl2b2lkIHNldEFzc2lnbmVkVW5pb24oYXZtX3NpemVfdCByaWQsCisJCQlCaXRzZXQgKiBhc3NpZ25lZFRhYmxlQSwgQml0c2V0ICogYXNzaWduZWRUYWJsZUIpOworCisKKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwlpbmxpbmUgdmlydHVhbCBzdGQ6OnN0cmluZyBzdHIoKSBjb25zdAorCXsKKwkJU3RyaW5nT3V0U3RyZWFtIG9zcyggQVZNX1NUUl9JTkRFTlQgKTsKKworCQl0b1N0cmVhbSggb3NzIDw8IElHTk9SRV9GSVJTVF9UQUIgKTsKKworCQlyZXR1cm4oIG9zcy5zdHIoKSApOworCX0KKworCXZpcnR1YWwgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKKwl2aXJ0dWFsIHZvaWQgdG9TdHJlYW0oY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQsIE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworfTsKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVFlQRSBERUZJTklUSU9OIGZvciBTTUFSVCBQT0lOVEVSIGFuZCBDT05UQUlORVIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitBVk1fREVGSU5FX0FQX0NMQVNTKCBUYWJsZU9mUnVudGltZUZvcm1TdGF0ZSApCisKKworCit9CisKKyNlbmRpZiAvKiBUQUJMRU9GUlVOVElNRUZPUk1TVEFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3N5bWJvbC9SRUFETUUubWQgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvc3ltYm9sL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmZiNTIzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3N5bWJvbC9SRUFETUUubWQKQEAgLTAsMCArMSwxNiBAQAorIyBFRk0tU1lNQkVYIDogU3ltYm9sCisKKyMjIFNvdXJjZSBjb2RlIHN0cnVjdHVyZQorCisjIyMgSW50ZXJmYWNlcworKiAqKklTeW1ib2wqKgorCisjIyMgQ2xhc3NlcworKiAqKlZhcmlhYmxlKioKKyogKipCdWZmZXIqKgorKiAqKlBvcnQqKgorKiAqKlNpZ25hbCoqCisKKyMjIyBGYWN0b3JpZXMKKyogKipTeW1ib2wqKiBhcyBTbWFydCBQb2ludGVyCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9zeW1ib2wvU3ltYm9sLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9zeW1ib2wvU3ltYm9sLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjViOTk1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3N5bWJvbC9TeW1ib2wuY3BwCkBAIC0wLDAgKzEsNTk3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTMganVpbiAyMDE0CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJTeW1ib2wuaCIKKworI2luY2x1ZGUgPGNvbW1vbi9CRi5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZkJ1ZmZlci5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZDb25uZWN0Lmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZkRhdGEuaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mTWFjaGluZS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZQb3J0Lmg+CisKKyNpbmNsdWRlIDxmbWwvc3ltYm9sL1RhYmxlT2ZTeW1ib2wuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoqCisgKiBERUZBVUxUIE5VTEwKKyAqLworU3ltYm9sIFN5bWJvbDo6UkVGX05VTEw7CisKKworLyoqCisgKiBBU1NJR05NRU5UCisgKiBCRgorICovCitpbmxpbmUgU3ltYm9sICYgU3ltYm9sOjpvcGVyYXRvcj0oY29uc3QgQkYgJiBhU3ltYm9sKQoreworCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggYVN5bWJvbC5pc193ZWFrbHk8IEJhc2VJbnN0YW5jZUZvcm0gPigpICkKKwkJCTw8ICJJbnZhbGlkIEFzc2lnbm1lbnQgQ2FzdCBpbiBhIFN5bWJvbCBvZiAiIDw8IGFTeW1ib2wuc3RyKCkKKwkJCTw8IFNFTkRfRVhJVDsKKworCWlmKCBtUFRSICE9IGFTeW1ib2wucmF3X3BvaW50ZXIoKSApCisJeworCQlBVk1fQVNTSUdOX1NUTU5UX0RFQlVHX1NZTUJPTF9QVFIoIGFTeW1ib2wucmF3X3BvaW50ZXIoKSApCisKKwkJcmVsZWFzZV9hY3F1aXJlKCBhU3ltYm9sLnRvX3B0cjwgQmFzZUluc3RhbmNlRm9ybSA+KCkgKTsKKwl9CisJcmV0dXJuKCAqdGhpcyApOworfQorCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBJbnN0YW5jZU9mQnVmZmVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworSW5zdGFuY2VPZkJ1ZmZlciAmIFN5bWJvbDo6YnVmZmVyKCkKK3sKKwlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBtUFRSICkKKwkJCTw8ICJVbmV4cGVjdGVkIGEgPG51bGw+IHBvaW50ZXIgYXMgSW5zdGFuY2VPZkJ1ZmZlciByZWZlcmVuY2UgISEhIgorCQkJPDwgU0VORF9FWElUOworCisJcmV0dXJuKCBzdGF0aWNfY2FzdDwgSW5zdGFuY2VPZkJ1ZmZlciAmID4oICptUFRSICkgKTsKK30KKworY29uc3QgSW5zdGFuY2VPZkJ1ZmZlciAmIFN5bWJvbDo6YnVmZmVyKCkgY29uc3QKK3sKKwlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBtUFRSICkKKwkJCTw8ICJVbmV4cGVjdGVkIGEgPG51bGw+IHBvaW50ZXIgYXMgSW5zdGFuY2VPZkJ1ZmZlciByZWZlcmVuY2UgISEhIgorCQkJPDwgU0VORF9FWElUOworCisJcmV0dXJuKCBzdGF0aWNfY2FzdDwgY29uc3QgSW5zdGFuY2VPZkJ1ZmZlciAmID4oICptUFRSICkgKTsKK30KKworCitJbnN0YW5jZU9mQnVmZmVyICogU3ltYm9sOjpyYXdCdWZmZXIoKSBjb25zdAoreworCXJldHVybiggc3RhdGljX2Nhc3Q8IEluc3RhbmNlT2ZCdWZmZXIgKiA+KCBtUFRSICkgICk7Cit9CisKKworLyoqCisgKiBHRVRURVIgLSBTRVRURVIKKyAqIG1Qb2xpY3lTcGVjaWZpZXJLaW5kCisgKi8KK2F2bV90eXBlX3NwZWNpZmllcl9raW5kX3QgU3ltYm9sOjpnZXRQb2xpY3lTcGVjaWZpZXJLaW5kKCkgY29uc3QKK3sKKwlyZXR1cm4oIGJ1ZmZlcigpLmdldFBvbGljeVNwZWNpZmllcktpbmQoKSApOworfQorCit2b2lkIFN5bWJvbDo6c2V0UG9saWN5U3BlY2lmaWVyS2luZChhdm1fdHlwZV9zcGVjaWZpZXJfa2luZF90IGFTcGVjaWZpZXJLaW5kKQoreworCWJ1ZmZlcigpLnNldFBvbGljeVNwZWNpZmllcktpbmQoIGFTcGVjaWZpZXJLaW5kICk7Cit9CisKKworLyoqCisgKiBHRVRURVIgLSBTRVRURVIKKyAqIG1DYXBhY2l0eQorICovCithdm1fc2l6ZV90IFN5bWJvbDo6Y2FwYWNpdHkoKSBjb25zdAoreworCXJldHVybiggYnVmZmVyKCkuY2FwYWNpdHkoKSApOworfQorCitsb25nIFN5bWJvbDo6cmVhbENhcGFjaXR5KCkgY29uc3QKK3sKKwlyZXR1cm4oIGJ1ZmZlcigpLnJlYWxDYXBhY2l0eSgpICk7Cit9CisKK3ZvaWQgU3ltYm9sOjpzZXRDYXBhY2l0eShsb25nIGFDYXBhY2l0eSkKK3sKKwlidWZmZXIoKS5zZXRDYXBhY2l0eSggYUNhcGFjaXR5ICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBJbnN0YW5jZU9mQ2hhbm5lbAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0luc3RhbmNlT2ZQb3J0ICYgU3ltYm9sOjpjaGFubmVsKCkKK3sKKwlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBtUFRSICkKKwkJCTw8ICJVbmV4cGVjdGVkIGEgPG51bGw+IHBvaW50ZXIgYXMgSW5zdGFuY2VPZlBvcnQgcmVmZXJlbmNlICEhISIKKwkJCTw8IFNFTkRfRVhJVDsKKworCXJldHVybiggc3RhdGljX2Nhc3Q8IEluc3RhbmNlT2ZQb3J0ICYgPiggKm1QVFIgKSApOworfQorCitjb25zdCBJbnN0YW5jZU9mUG9ydCAmIFN5bWJvbDo6Y2hhbm5lbCgpIGNvbnN0Cit7CisJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggbVBUUiApCisJCQk8PCAiVW5leHBlY3RlZCBhIDxudWxsPiBwb2ludGVyIGFzIEluc3RhbmNlT2ZQb3J0IHJlZmVyZW5jZSAhISEiCisJCQk8PCBTRU5EX0VYSVQ7CisKKwlyZXR1cm4oIHN0YXRpY19jYXN0PCBjb25zdCBJbnN0YW5jZU9mUG9ydCAmID4oICptUFRSICkgKTsKK30KKworCitJbnN0YW5jZU9mUG9ydCAqIFN5bWJvbDo6cmF3Q2hhbm5lbCgpIGNvbnN0Cit7CisJcmV0dXJuKCBzdGF0aWNfY2FzdDwgSW5zdGFuY2VPZlBvcnQgKiA+KCBtUFRSICkgICk7Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEluc3RhbmNlT2ZDb25uZWN0CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworSW5zdGFuY2VPZkNvbm5lY3QgJiBTeW1ib2w6OmNvbm5lY3RvcigpCit7CisJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggbVBUUiApCisJCQk8PCAiVW5leHBlY3RlZCBhIDxudWxsPiBwb2ludGVyIGFzIEluc3RhbmNlT2ZDb25uZWN0IHJlZmVyZW5jZSAhISEiCisJCQk8PCBTRU5EX0VYSVQ7CisKKwlyZXR1cm4oIHN0YXRpY19jYXN0PCBJbnN0YW5jZU9mQ29ubmVjdCAmID4oICptUFRSICkgKTsKK30KKworY29uc3QgSW5zdGFuY2VPZkNvbm5lY3QgJiBTeW1ib2w6OmNvbm5lY3RvcigpIGNvbnN0Cit7CisJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggbVBUUiApCisJCQk8PCAiVW5leHBlY3RlZCBhIDxudWxsPiBwb2ludGVyIGFzIEluc3RhbmNlT2ZDb25uZWN0IHJlZmVyZW5jZSAhISEiCisJCQk8PCBTRU5EX0VYSVQ7CisKKwlyZXR1cm4oIHN0YXRpY19jYXN0PCBjb25zdCBJbnN0YW5jZU9mQ29ubmVjdCAmID4oICptUFRSICkgKTsKK30KKworCitJbnN0YW5jZU9mQ29ubmVjdCAqIFN5bWJvbDo6cmF3Q29ubmVjdCgpIGNvbnN0Cit7CisJcmV0dXJuKCBzdGF0aWNfY2FzdDwgSW5zdGFuY2VPZkNvbm5lY3QgKiA+KCBtUFRSICkgICk7Cit9CisKKworLyoqCisgKiBHRVRURVIgLSBTRVRURVIKKyAqIG1PdXRwdXRDb21Sb3V0ZURhdGEKKyAqIG1JbnB1dENvbVJvdXRlRGF0YQorICovCitjb25zdCBDb21Sb3V0ZURhdGEgJiBTeW1ib2w6OmdldE91dHB1dENvbVJvdXRlRGF0YSgpIGNvbnN0Cit7CisJcmV0dXJuKCBjb25uZWN0b3IoKS5nZXRPdXRwdXRDb21Sb3V0ZURhdGEoKSApOworfQorCitjb25zdCBDb21Sb3V0ZURhdGEgJiBTeW1ib2w6OmdldElucHV0Q29tUm91dGVEYXRhKCkgY29uc3QKK3sKKwlyZXR1cm4oIGNvbm5lY3RvcigpLmdldElucHV0Q29tUm91dGVEYXRhKCkgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEluc3RhbmNlT2ZEYXRhCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworSW5zdGFuY2VPZkRhdGEgJiBTeW1ib2w6OmRhdGEoKQoreworCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9QT0lOVEVSX0VYSVQoIG1QVFIgKQorCQkJPDwgIlVuZXhwZWN0ZWQgYSA8bnVsbD4gcG9pbnRlciBhcyBJbnN0YW5jZU9mRGF0YSByZWZlcmVuY2UgISEhIgorCQkJPDwgU0VORF9FWElUOworCisJcmV0dXJuKCBzdGF0aWNfY2FzdDwgSW5zdGFuY2VPZkRhdGEgJiA+KCAqbVBUUiApICk7Cit9CisKK2NvbnN0IEluc3RhbmNlT2ZEYXRhICYgU3ltYm9sOjpkYXRhKCkgY29uc3QKK3sKKwlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBtUFRSICkKKwkJCTw8ICJVbmV4cGVjdGVkIGEgPG51bGw+IHBvaW50ZXIgYXMgSW5zdGFuY2VPZkRhdGEgcmVmZXJlbmNlICEhISIKKwkJCTw8IFNFTkRfRVhJVDsKKworCXJldHVybiggc3RhdGljX2Nhc3Q8IGNvbnN0IEluc3RhbmNlT2ZEYXRhICYgPiggKm1QVFIgKSApOworfQorCisKK0luc3RhbmNlT2ZEYXRhICogU3ltYm9sOjpyYXdEYXRhKCkgY29uc3QKK3sKKwlyZXR1cm4oIHN0YXRpY19jYXN0PCBJbnN0YW5jZU9mRGF0YSAqID4oIG1QVFIgKSAgKTsKK30KKworCisvKioKKyAqIFNFVFRFUgorICogbUZ1bGx5UXVhbGlmaWVkTmFtZUlECisgKi8KK3ZvaWQgU3ltYm9sOjp1cGRhdGVGdWxseVF1YWxpZmllZE5hbWVJRCgKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkKK3sKKwlkYXRhKCkudXBkYXRlRnVsbHlRdWFsaWZpZWROYW1lSUQoYUZ1bGx5UXVhbGlmaWVkTmFtZUlELCBhTmFtZUlEKTsKK30KKworCisvKioKKyAqIEdFVFRFUiAtIFNFVFRFUgorICogbVBvaW50ZXJOYXR1cmUKKyAqLworSVBvaW50ZXJEYXRhTmF0dXJlOjpQT0lOVEVSX0RBVEFfTkFUVVJFIFN5bWJvbDo6Z2V0UG9pbnRlck5hdHVyZSgpIGNvbnN0Cit7CisJcmV0dXJuKCBkYXRhKCkuZ2V0UG9pbnRlck5hdHVyZSgpICk7Cit9CisKKworLyoqCisgKiBHRVRURVIgLSBTRVRURVIKKyAqIG1WYWx1ZQorICovCitCRiAmIFN5bWJvbDo6Z2V0VmFsdWUoKQoreworCXJldHVybiggZGF0YSgpLmdldFZhbHVlKCkgKTsKK30KKworY29uc3QgQkYgJiBTeW1ib2w6OmdldFZhbHVlKCkgY29uc3QKK3sKKwlyZXR1cm4oIGRhdGEoKS5nZXRWYWx1ZSgpICk7Cit9CisKK2Jvb2wgU3ltYm9sOjpoYXNWYWx1ZSgpIGNvbnN0Cit7CisJcmV0dXJuKCBkYXRhKCkuaGFzVmFsdWUoKSApOworfQorCit2b2lkIFN5bWJvbDo6c2V0VmFsdWUoY29uc3QgQkYgJiBhVmFsdWUpCit7CisJZGF0YSgpLnNldFZhbHVlKCBhVmFsdWUgKTsKK30KKworCisvLyBBcnJheVZhbHVlCitBcnJheUJGICogU3ltYm9sOjpnZXRBcnJheVZhbHVlKCkgY29uc3QKK3sKKwlyZXR1cm4oIGRhdGEoKS5nZXRBcnJheVZhbHVlKCkgKTsKK30KKworYm9vbCBTeW1ib2w6Omhhc0FycmF5VmFsdWUoKSBjb25zdAoreworCXJldHVybiggZGF0YSgpLmhhc0FycmF5VmFsdWUoKSApOworfQorCisKK3ZvaWQgU3ltYm9sOjpmb3JtYXRTdHJlYW0oT3V0U3RyZWFtICYgb3MsIGNvbnN0IEJGICYgYVZhbHVlKSBjb25zdAoreworCWRhdGEoKS5mb3JtYXRTdHJlYW0ob3MsIGFWYWx1ZSk7Cit9CisKK3ZvaWQgU3ltYm9sOjpzdHJWYWx1ZShPdXRTdHJlYW0gJiBvcywgY29uc3QgQkYgJiBhVmFsdWUpIGNvbnN0Cit7CisJZGF0YSgpLnN0clZhbHVlKG9zLCBhVmFsdWUpOworfQorCitzdGQ6OnN0cmluZyBTeW1ib2w6OnN0clZhbHVlKGNvbnN0IEJGICYgYVZhbHVlKSBjb25zdAoreworCXJldHVybiggZGF0YSgpLnN0clZhbHVlKGFWYWx1ZSkgKTsKK30KKworc3RkOjpzdHJpbmcgU3ltYm9sOjpzdHJWYWx1ZSgpIGNvbnN0Cit7CisJcmV0dXJuKCBkYXRhKCkuc3RyVmFsdWUoKSApOworfQorCisKKy8qKgorICogR0VUVEVSIC0gU0VUVEVSCisgKiBtQXR0cmlidXRlVGFibGUKKyAqLworVGFibGVPZlN5bWJvbCAqIFN5bWJvbDo6Z2V0QXR0cmlidXRlKCkgY29uc3QKK3sKKwlyZXR1cm4oIGRhdGEoKS5nZXRBdHRyaWJ1dGUoKSApOworfQorCitjb25zdCBTeW1ib2wgJiBTeW1ib2w6OmdldEF0dHJpYnV0ZUJ5TmFtZUlEKGNvbnN0IHN0ZDo6c3RyaW5nICYgaWQpIGNvbnN0Cit7CisJcmV0dXJuKCBkYXRhKCkuaGFzQXR0cmlidXRlKCkgPworCQkJZGF0YSgpLmdldEF0dHJpYnV0ZSgpLT5nZXRCeU5hbWVJRChpZCkgOiBTeW1ib2w6OlJFRl9OVUxMICk7Cit9CisKK2Jvb2wgU3ltYm9sOjpoYXNBdHRyaWJ1dGUoKSBjb25zdAoreworCXJldHVybiggZGF0YSgpLmhhc0F0dHJpYnV0ZSgpICk7Cit9CisKK3ZvaWQgU3ltYm9sOjpzZXRBdHRyaWJ1dGUoVGFibGVPZlN5bWJvbCAqIGFuQXR0cmlidXRlVGFibGUpCit7CisJZGF0YSgpLnNldEF0dHJpYnV0ZSggYW5BdHRyaWJ1dGVUYWJsZSApOworfQorCit2b2lkIFN5bWJvbDo6c2V0QXR0cmlidXRlKGF2bV9vZmZzZXRfdCBvZmZzZXQsIGNvbnN0IFN5bWJvbCAmIGFXUHJvcGVydHkpCit7CisJZGF0YSgpLnNldEF0dHJpYnV0ZSggb2Zmc2V0ICwgYVdQcm9wZXJ0eSApOworfQorCisKKy8qKgorICogR0VUVEVSIC0gU0VUVEVSCisgKiBtUmVsYXRpdmVEYXRhUGF0aAorICogbVJlbGF0aXZlT2Zmc2V0UGF0aAorICovCitUYWJsZU9mU3ltYm9sICogU3ltYm9sOjpnZXREYXRhUGF0aCgpIGNvbnN0Cit7CisJcmV0dXJuKCBkYXRhKCkuZ2V0RGF0YVBhdGgoKSApOworfQorCitib29sIFN5bWJvbDo6aGFzRGF0YVBhdGgoKSBjb25zdAoreworCXJldHVybiggZGF0YSgpLmhhc0RhdGFQYXRoKCkgKTsKK30KKwordm9pZCBTeW1ib2w6OnNldERhdGFQYXRoKFRhYmxlT2ZTeW1ib2wgJiBhUmVsYXRpdmVEYXRhUGF0aCkKK3sKKwlkYXRhKCkuc2V0RGF0YVBhdGgoIGFSZWxhdGl2ZURhdGFQYXRoICk7Cit9CisKKworYXZtX3NpemVfdCAqIFN5bWJvbDo6Z2V0T2Zmc2V0UGF0aCgpIGNvbnN0Cit7CisJcmV0dXJuKCBkYXRhKCkuZ2V0T2Zmc2V0UGF0aCgpICk7Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEluc3RhbmNlT2ZNYWNoaW5lCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworSW5zdGFuY2VPZk1hY2hpbmUgJiBTeW1ib2w6Om1hY2hpbmUoKQoreworCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9QT0lOVEVSX0VYSVQoIG1QVFIgKQorCQkJPDwgIlVuZXhwZWN0ZWQgYSA8bnVsbD4gcG9pbnRlciBhcyBJbnN0YW5jZU9mTWFjaGluZSByZWZlcmVuY2UgISEhIgorCQkJPDwgU0VORF9FWElUOworCisJcmV0dXJuKCBzdGF0aWNfY2FzdDwgSW5zdGFuY2VPZk1hY2hpbmUgJiA+KCAqbVBUUiApICk7Cit9CisKK2NvbnN0IEluc3RhbmNlT2ZNYWNoaW5lICYgU3ltYm9sOjptYWNoaW5lKCkgY29uc3QKK3sKKwlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBtUFRSICkKKwkJCTw8ICJVbmV4cGVjdGVkIGEgPG51bGw+IHBvaW50ZXIgYXMgSW5zdGFuY2VPZk1hY2hpbmUgcmVmZXJlbmNlICEhISIKKwkJCTw8IFNFTkRfRVhJVDsKKworCXJldHVybiggc3RhdGljX2Nhc3Q8IGNvbnN0IEluc3RhbmNlT2ZNYWNoaW5lICYgPiggKm1QVFIgKSApOworfQorCisKK0luc3RhbmNlT2ZNYWNoaW5lICogU3ltYm9sOjpyYXdNYWNoaW5lKCkgY29uc3QKK3sKKwlyZXR1cm4oIHN0YXRpY19jYXN0PCBJbnN0YW5jZU9mTWFjaGluZSAqID4oIG1QVFIgKSApOworfQorCisvKioKKyAqIEdFVFRFUgorICogU3BlY2lmaWVyCisgKi8KK2NvbnN0IFNwZWNpZmllciAmIFN5bWJvbDo6Z2V0U3BlY2lmaWVyKCkgY29uc3QKK3sKKwlyZXR1cm4oIG1hY2hpbmUoKS5nZXRTcGVjaWZpZXIoKSApOworfQorCisvKioKKyAqIEdFVFRFUgorICogQ29tcGlsZWQgT2JqZWN0RWxlbWVudCBhcyBDb21waWxlZCBNYWNoaW5lCisgKi8KK2NvbnN0IE1hY2hpbmUgKiBTeW1ib2w6OmdldEFzdE1hY2hpbmUoKSBjb25zdAoreworCXJldHVybiggbWFjaGluZSgpLmdldEFzdE1hY2hpbmUoKSApOworfQorCisKKy8qKgorICogR0VUVEVSCisgKiBUSElTCisgKi8KK2Jvb2wgU3ltYm9sOjppc1RoaXMoKSBjb25zdAoreworCXJldHVybiggbWFjaGluZSgpLmlzVGhpcygpICk7Cit9CisKK2Jvb2wgU3ltYm9sOjppc25vdFRoaXMoY29uc3QgRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGUpIGNvbnN0Cit7CisJcmV0dXJuKCBtYWNoaW5lKCkuaXNub3RUaGlzKCBhbkV4ZWN1dGFibGUgKSApOworfQorCisvKioKKyAqIEdFVFRFUiAtIFNFVFRFUgorICogbUV4ZWN1dGFibGUKKyAqLworRXhlY3V0YWJsZUZvcm0gKiBTeW1ib2w6OmdldEV4ZWN1dGFibGUoKSBjb25zdAoreworCXJldHVybiggbWFjaGluZSgpLmdldEV4ZWN1dGFibGUoKSApOworfQorCitib29sIFN5bWJvbDo6aGFzRXhlY3V0YWJsZSgpIGNvbnN0Cit7CisJcmV0dXJuKCBtYWNoaW5lKCkuaGFzRXhlY3V0YWJsZSgpICk7Cit9CisKK3ZvaWQgU3ltYm9sOjpzZXRFeGVjdXRhYmxlKEV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlKQoreworCW1hY2hpbmUoKS5zZXRFeGVjdXRhYmxlKCBhbkV4ZWN1dGFibGUgKTsKK30KKworLyoqCisgKiBHRVRURVIgLSBTRVRURVIKKyAqIG1JbnN0YW5jZU1vZGVsCisgKi8KK0luc3RhbmNlT2ZNYWNoaW5lICogU3ltYm9sOjpnZXRJbnN0YW5jZU1vZGVsKCkgY29uc3QKK3sKKwlyZXR1cm4oIG1hY2hpbmUoKS5nZXRJbnN0YW5jZU1vZGVsKCkgKTsKK30KKworYm9vbCBTeW1ib2w6Omhhc0luc3RhbmNlTW9kZWwoKSBjb25zdAoreworCXJldHVybiggbWFjaGluZSgpLmhhc0luc3RhbmNlTW9kZWwoKSApOworfQorCitib29sIFN5bWJvbDo6aXNJbnN0YW5jZU1vZGVsKEluc3RhbmNlT2ZNYWNoaW5lICogYW5JbnN0YW5jZU1vZGVsKSBjb25zdAoreworCXJldHVybiggbWFjaGluZSgpLmlzSW5zdGFuY2VNb2RlbChhbkluc3RhbmNlTW9kZWwpICk7Cit9CisKKwordm9pZCBTeW1ib2w6OnNldEluc3RhbmNlTW9kZWwoSW5zdGFuY2VPZk1hY2hpbmUgKiBhbkluc3RhbmNlTW9kZWwpCit7CisJbWFjaGluZSgpLnNldEluc3RhbmNlTW9kZWwoIGFuSW5zdGFuY2VNb2RlbCApOworfQorCisKKy8qKgorICogR0VUVEVSIC0gU0VUVEVSCisgKiBtUGFyYW0KKyAqIG1QYXJhbVJldHVyblRhYmxlCisgKiBtUmV0dXJuT2Zmc2V0CisgKi8KK2Jvb2wgU3ltYm9sOjpoYXNQYXJhbSgpIGNvbnN0Cit7CisJcmV0dXJuKCBtYWNoaW5lKCkuaGFzUGFyYW0oKSApOworfQorCisvKioKKyAqIEdFVFRFUiAtIFNFVFRFUgorICogbVJ1bnRpbWVSSUQKKyAqLworY29uc3QgUnVudGltZUlEICYgU3ltYm9sOjpnZXRSdW50aW1lUklEKCkgY29uc3QKK3sKKwlyZXR1cm4oIG1hY2hpbmUoKS5nZXRSdW50aW1lUklEKCkgKTsKK30KKworYm9vbCBTeW1ib2w6Omhhc1J1bnRpbWVSSUQoKSBjb25zdAoreworCXJldHVybiggbWFjaGluZSgpLmhhc1J1bnRpbWVSSUQoKSApOworfQorCit2b2lkIFN5bWJvbDo6c2V0UnVudGltZVJJRChjb25zdCBSdW50aW1lSUQgJiBhUklEKQoreworCW1hY2hpbmUoKS5zZXRSdW50aW1lUklEKCBhUklEICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBJbnN0YW5jZU9mUG9ydAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0luc3RhbmNlT2ZQb3J0ICYgU3ltYm9sOjpwb3J0KCkKK3sKKwlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBtUFRSICkKKwkJCTw8ICJVbmV4cGVjdGVkIGEgPG51bGw+IHBvaW50ZXIgYXMgSW5zdGFuY2VPZlBvcnQgcmVmZXJlbmNlICEhISIKKwkJCTw8IFNFTkRfRVhJVDsKKworCXJldHVybiggc3RhdGljX2Nhc3Q8IEluc3RhbmNlT2ZQb3J0ICYgPiggKm1QVFIgKSApOworfQorCitjb25zdCBJbnN0YW5jZU9mUG9ydCAmIFN5bWJvbDo6cG9ydCgpIGNvbnN0Cit7CisJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggbVBUUiApCisJCQk8PCAiVW5leHBlY3RlZCBhIDxudWxsPiBwb2ludGVyIGFzIEluc3RhbmNlT2ZQb3J0IHJlZmVyZW5jZSAhISEiCisJCQk8PCBTRU5EX0VYSVQ7CisKKwlyZXR1cm4oIHN0YXRpY19jYXN0PCBjb25zdCBJbnN0YW5jZU9mUG9ydCAmID4oICptUFRSICkgKTsKK30KKworCitJbnN0YW5jZU9mUG9ydCAqIFN5bWJvbDo6cmF3UG9ydCgpIGNvbnN0Cit7CisJcmV0dXJuKCBzdGF0aWNfY2FzdDwgSW5zdGFuY2VPZlBvcnQgKiA+KCBtUFRSICkgICk7Cit9CisKKworLyoqCisgKiBHRVRURVIgLSBTRVRURVIKKyAqIG1Sb3V0ZU9mZnNldAorICovCithdm1fc2l6ZV90IFN5bWJvbDo6Z2V0Um91dGVPZmZzZXQoKSBjb25zdAoreworCXJldHVybiggcG9ydCgpLmdldFJvdXRlT2Zmc2V0KCkgKTsKK30KKwordm9pZCBTeW1ib2w6OnNldFJvdXRlT2Zmc2V0KGF2bV9zaXplX3QgYVJvdXRlT2Zmc2V0KQoreworCXBvcnQoKS5zZXRSb3V0ZU9mZnNldCggYVJvdXRlT2Zmc2V0ICk7Cit9CisKKy8qKgorICogR0VUVEVSIC0gU0VUVEVSCisgKiBtSW5wdXRSb3V0aW5nRGF0YQorICogbU91dHB1dFJvdXRpbmdEYXRhCisgKi8KK2NvbnN0IFJvdXRpbmdEYXRhICYgU3ltYm9sOjpnZXRJbnB1dFJvdXRpbmdEYXRhKCkgY29uc3QKK3sKKwlyZXR1cm4oIHBvcnQoKS5nZXRJbnB1dFJvdXRpbmdEYXRhKCkgKTsKK30KKworaW5saW5lIGJvb2wgU3ltYm9sOjpoYXNJbnB1dFJvdXRpbmdEYXRhKCkgY29uc3QKK3sKKwlyZXR1cm4oIHBvcnQoKS5oYXNJbnB1dFJvdXRpbmdEYXRhKCkgKTsKK30KKwordm9pZCBTeW1ib2w6OnNldElucHV0Um91dGluZ0RhdGEoY29uc3QgUm91dGluZ0RhdGEgJiBhbklucHV0Um91dGluZ0RhdGEpCit7CisJcG9ydCgpLnNldElucHV0Um91dGluZ0RhdGEoIGFuSW5wdXRSb3V0aW5nRGF0YSApOworfQorCisKK2NvbnN0IFJvdXRpbmdEYXRhICYgU3ltYm9sOjpnZXRPdXRwdXRSb3V0aW5nRGF0YSgpIGNvbnN0Cit7CisJcmV0dXJuKCBwb3J0KCkuZ2V0T3V0cHV0Um91dGluZ0RhdGEoKSApOworfQorCitib29sIFN5bWJvbDo6aGFzT3V0cHV0Um91dGluZ0RhdGEoKSBjb25zdAoreworCXJldHVybiggcG9ydCgpLmhhc091dHB1dFJvdXRpbmdEYXRhKCkgKTsKK30KKwordm9pZCBTeW1ib2w6OnNldE91dHB1dFJvdXRpbmdEYXRhKGNvbnN0IFJvdXRpbmdEYXRhICYgYW5PdXRwdXRSb3V0aW5nRGF0YSkKK3sKKwlwb3J0KCkuc2V0T3V0cHV0Um91dGluZ0RhdGEoIGFuT3V0cHV0Um91dGluZ0RhdGEgKTsKK30KKworCisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvc3ltYm9sL1N5bWJvbC5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3N5bWJvbC9TeW1ib2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjA1YjAwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3N5bWJvbC9TeW1ib2wuaApAQCAtMCwwICsxLDc0NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDEzIGp1aW4gMjAxNAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFNZTUJPTF9IXworI2RlZmluZSBTWU1CT0xfSF8KKworI2luY2x1ZGUgPGZtbC9jb21tb24vQmFzZVBvaW50ZXIuaD4KKyNpbmNsdWRlIDxmbWwvdHlwZS9UeXBlU3BlY2lmaWVyLmg+CisKKyNpbmNsdWRlIDxjb2xsZWN0aW9uL0xpc3QuaD4KKyNpbmNsdWRlIDxjb2xsZWN0aW9uL1ZlY3Rvci5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvQmFzZUluc3RhbmNlRm9ybS5oPgorCisjaW5jbHVkZSA8Zm1sL2xpYi9Bdm1MYW5nLmg+CisjaW5jbHVkZSA8Zm1sL2xpYi9JVHlwZVNwZWNpZmllci5oPgorCisKKworI2RlZmluZSBBVk1fREVCVUdfU1lNQk9MX1BPSU5URVIgIHRydWUKKyN1bmRlZiBBVk1fREVCVUdfU1lNQk9MX1BPSU5URVIKKworI2lmIGRlZmluZWQoQVZNX0RFQlVHX1NZTUJPTF9QT0lOVEVSKQorCisJI2RlZmluZSBBVk1fREVDTEFSRV9ERUJVR19TWU1CT0xfUFRSICAgICAgY29uc3QgQmFzZUluc3RhbmNlRm9ybSAqIGRlYnVnUFRSOworCisJI2RlZmluZSBBVk1fSU5JVF9ERUJVR19TWU1CT0xfUFRSKCBwdHIgKSAgLCBkZWJ1Z1BUUiggcHRyICkKKworCSNkZWZpbmUgQVZNX0FTU0lHTl9TVE1OVF9ERUJVR19TWU1CT0xfUFRSKCBwdHIgKSAgZGVidWdQVFIgPSBwdHI7CisKKwkjZGVmaW5lIEFWTV9BU1NJR05fRVhQUl9ERUJVR19TWU1CT0xfUFRSKCBwdHIgKSAgIGRlYnVnUFRSID0gcHRyCisKKyNlbHNlCisKKwkjZGVmaW5lIEFWTV9ERUNMQVJFX0RFQlVHX1NZTUJPTF9QVFIKKworCSNkZWZpbmUgQVZNX0lOSVRfREVCVUdfU1lNQk9MX1BUUiggcHRyICkKKworCSNkZWZpbmUgQVZNX0FTU0lHTl9TVE1OVF9ERUJVR19TWU1CT0xfUFRSKCBwdHIgKQorCisJI2RlZmluZSBBVk1fQVNTSUdOX0VYUFJfREVCVUdfU1lNQk9MX1BUUiggcHRyICkgIHB0cgorCisjZW5kaWYKKworCisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIEFycmF5QkY7CitjbGFzcyBCRjsKK2NsYXNzIFNwZWNpZmllcjsKK2NsYXNzIFRhYmxlT2ZTeW1ib2w7CitjbGFzcyBUeXBlU3BlY2lmaWVyOworCitjbGFzcyBDb21Sb3V0ZURhdGE7CisKK2NsYXNzIEV4ZWN1dGFibGVGb3JtOworCitjbGFzcyBJbnN0YW5jZU9mQnVmZmVyOworY2xhc3MgSW5zdGFuY2VPZkNvbm5lY3Q7CitjbGFzcyBJbnN0YW5jZU9mRGF0YTsKK2NsYXNzIEluc3RhbmNlT2ZNYWNoaW5lOworY2xhc3MgSW5zdGFuY2VPZlBvcnQ7CisKK2NsYXNzIE1hY2hpbmU7CisKK2NsYXNzIFJvdXRpbmdEYXRhOworCisKK2NsYXNzIFN5bWJvbCA6CisJCXB1YmxpYyBCYXNlUG9pbnRlcjwgQmFzZUluc3RhbmNlRm9ybSA+LAorCQlwdWJsaWMgSVR5cGVTcGVjaWZpZXIsCisJCXB1YmxpYyBJUG9pbnRlckRhdGFOYXR1cmUsCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggU3ltYm9sICkKK3sKKworcHJpdmF0ZToKKwkvKioKKwkgKiBUWVBFREVGCisJICovCisJdHlwZWRlZiAgQmFzZVBvaW50ZXI8IEJhc2VJbnN0YW5jZUZvcm0gPiAgYmFzZV90aGlzX3R5cGU7CisKKworcHVibGljOgorCS8qKgorCSAqIERFRkFVTFQgUkVGX05VTEwKKwkgKi8KKwlzdGF0aWMgU3ltYm9sIFJFRl9OVUxMOworCisKK3B1YmxpYzoKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCVN5bWJvbCgpCisJOiBiYXNlX3RoaXNfdHlwZSggKQorCXsKKwkJLy8hISEgTk9USElORworCX0KKworCWV4cGxpY2l0IFN5bWJvbChCYXNlSW5zdGFuY2VGb3JtICogYW5JbnN0YW5jZSkKKwk6IGJhc2VfdGhpc190eXBlKCBhbkluc3RhbmNlICkKKwl7CisJCS8vISEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIENvcHkKKwkgKi8KKwlTeW1ib2woY29uc3QgU3ltYm9sICYgYVN5bWJvbCkKKwk6IGJhc2VfdGhpc190eXBlKCBhU3ltYm9sICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCWV4cGxpY2l0IFN5bWJvbChjb25zdCBCRiAmIGFTeW1ib2wpCisJOiBiYXNlX3RoaXNfdHlwZSggYVN5bWJvbCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5TeW1ib2woKQorCXsKKwkJLy8hISEgTk9USElORworCX0KKworCisJLyoqCisJICogR0VUVEVSCisJICogcG9pbnRlcgorCSAqLworCWlubGluZSBwb2ludGVyIHJhd1N5bWJvbCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHN0YXRpY19jYXN0PCBwb2ludGVyID4oIG1QVFIgKSApOworCX0KKworCitwdWJsaWM6CisKKwkvKioKKwkgKiBBU1NJR05NRU5UCisJICogQkYKKwkgKi8KKwlTeW1ib2wgJiBvcGVyYXRvcj0oY29uc3QgQkYgJiBhU3ltYm9sKTsKKworCVN5bWJvbCAmIG9wZXJhdG9yPShwb2ludGVyIGFQdHIpCisJeworCQlpZiggbVBUUiAhPSBhUHRyICkKKwkJeworCQkJQVZNX0FTU0lHTl9ERUJVR19CRl9QVFIoIGFQdHIgKQorCisJCQlyZWxlYXNlKCBhUHRyICk7CisJCX0KKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBCYXNlSW5zdGFuY2VGb3JtCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUiBCYXNlQXZtUHJvZ3JhbSAqIGFDb250YWluZXIKKwkgKiBtQ29udGFpbmVyCisJICovCisJaW5saW5lIEJhc2VBdm1Qcm9ncmFtICogZ2V0Q29udGFpbmVyKCkgY29uc3QKKwl7CisJCXJldHVybiggcmF3U3ltYm9sKCktPmdldENvbnRhaW5lcigpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0Q29udGFpbmVyKE9iamVjdEVsZW1lbnQgKiBhQ29udGFpbmVyKQorCXsKKwkJcmF3U3ltYm9sKCktPnNldENvbnRhaW5lciggYUNvbnRhaW5lciApOworCX0KKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUiAtIFRFU1RFUgorCSAqIG1UeXBlU3BlY2lmaWVyCisJICovCisvLwlpbmxpbmUgdmlydHVhbCBjb25zdCBUeXBlU3BlY2lmaWVyICYgdGhpc1R5cGVTcGVjaWZpZXIoKSBjb25zdAorLy8JeworLy8JCXJldHVybiggcmF3U3ltYm9sKCktPnRoaXNUeXBlU3BlY2lmaWVyKCkgKTsKKy8vCX0KKy8vCisvLwlpbmxpbmUgdmlydHVhbCBjb25zdCBUeXBlU3BlY2lmaWVyICYgZ2V0VHlwZVNwZWNpZmllcigpIGNvbnN0CisvLwl7CisvLwkJcmV0dXJuKCByYXdTeW1ib2woKS0+Z2V0VHlwZVNwZWNpZmllcigpICk7CisvLwl9CisKKwlpbmxpbmUgdmlydHVhbCBjb25zdCBCYXNlVHlwZVNwZWNpZmllciAqIHRoaXNUeXBlU3BlY2lmaWVyKCkgY29uc3QKKwl7CisJCXJldHVybiggcmF3U3ltYm9sKCktPnRoaXNUeXBlU3BlY2lmaWVyKCkgKTsKKwl9CisKKwlpbmxpbmUgQmFzZVR5cGVTcGVjaWZpZXIgKiBnZXRUeXBlU3BlY2lmaWVyKCkgY29uc3QKKwl7CisJCXJldHVybiggcmF3U3ltYm9sKCktPmdldFR5cGVTcGVjaWZpZXIoKSApOworCX0KKworCWlubGluZSBCYXNlVHlwZVNwZWNpZmllciAqIHJlZmVyZWRUeXBlU3BlY2lmaWVyKCkgY29uc3QKKwl7CisJCXJldHVybiggcmF3U3ltYm9sKCktPnJlZmVyZWRUeXBlU3BlY2lmaWVyKCkgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBhdm1fdHlwZV9zcGVjaWZpZXJfa2luZF90IGdldFR5cGVTcGVjaWZpZXJLaW5kKCkgY29uc3QKKwl7CisJCXJldHVybiggcmF3U3ltYm9sKCktPmdldFR5cGVTcGVjaWZpZXJLaW5kKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNUeXBlU3BlY2lmaWVyKCkgY29uc3QKKwl7CisJCXJldHVybiggcmF3U3ltYm9sKCktPmhhc1R5cGVTcGVjaWZpZXIoKSApOworCX0KKworCisJaW5saW5lIHZvaWQgc2V0VHlwZVNwZWNpZmllcihCYXNlVHlwZVNwZWNpZmllciAqIGFUeXBlU3BlY2lmaWVyKQorCXsKKwkJcmF3U3ltYm9sKCktPnNldFR5cGVTcGVjaWZpZXIoIGFUeXBlU3BlY2lmaWVyICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBpc1R5cGVGYW1pbHkoYXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCB0eXBlRmFtaWx5KQorCXsKKwkJcmV0dXJuKCByYXdTeW1ib2woKS0+aXNUeXBlRmFtaWx5KCB0eXBlRmFtaWx5ICkgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1PZmZzZXQKKwkgKi8KKwlpbmxpbmUgYXZtX29mZnNldF90IGdldE9mZnNldCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHJhd1N5bWJvbCgpLT5nZXRPZmZzZXQoKSApOworCX0KKworCWlubGluZSB2b2lkIHNldE9mZnNldChhdm1fb2Zmc2V0X3QgYW5PZmZzZXQpCisJeworCQlyYXdTeW1ib2woKS0+c2V0T2Zmc2V0KCBhbk9mZnNldCApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUNyZWF0b3JDb250YWluZXJJRAorCSAqLworCWlubGluZSBjb25zdCBSdW50aW1lSUQgJiBnZXRDcmVhdG9yQ29udGFpbmVyUklEKCkgY29uc3QKKwl7CisJCXJldHVybiggcmF3U3ltYm9sKCktPmdldENyZWF0b3JDb250YWluZXJSSUQoKSApOworCX0KKworCWlubGluZSBib29sIGhhc0NyZWF0b3JDb250YWluZXJSSUQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCByYXdTeW1ib2woKS0+aGFzQ3JlYXRvckNvbnRhaW5lclJJRCgpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0Q3JlYXRvckNvbnRhaW5lclJJRChjb25zdCBSdW50aW1lSUQgJiBhUklEKQorCXsKKwkJcmF3U3ltYm9sKCktPnNldENyZWF0b3JDb250YWluZXJSSUQoIGFSSUQgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1SdW50aW1lQ29udGFpbmVySUQKKwkgKi8KKwlpbmxpbmUgY29uc3QgUnVudGltZUlEICYgZ2V0UnVudGltZUNvbnRhaW5lclJJRCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHJhd1N5bWJvbCgpLT5nZXRSdW50aW1lQ29udGFpbmVyUklEKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNSdW50aW1lQ29udGFpbmVyUklEKCkgY29uc3QKKwl7CisJCXJldHVybiggcmF3U3ltYm9sKCktPmhhc1J1bnRpbWVDb250YWluZXJSSUQoKSApOworCX0KKworCWlubGluZSB2b2lkIHNldFJ1bnRpbWVDb250YWluZXJSSUQoY29uc3QgUnVudGltZUlEICYgYVJJRCkKKwl7CisJCXJhd1N5bWJvbCgpLT5zZXRSdW50aW1lQ29udGFpbmVyUklEKCBhUklEICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtUmVsYXRpdmVNYWNoaW5lUGF0aAorCSAqLworLy8JaW5saW5lIHZvaWQgYXBwZW5kTWFjaGluZVBhdGgoSW5zdGFuY2VPZk1hY2hpbmUgKiBhbkluc3RhbmNlKQorLy8JeworLy8JCXJhd1N5bWJvbCgpLT5hcHBlbmRNYWNoaW5lUGF0aChhbkluc3RhbmNlKTsKKy8vCX0KKworCWlubGluZSB2b2lkIGFwcGVuZE1hY2hpbmVQYXRoKEFycmF5T2ZJbnN0YW5jZU9mTWFjaGluZSAmIGFsaWFzUGF0aCkgY29uc3QKKwl7CisJCXJhd1N5bWJvbCgpLT5hcHBlbmRNYWNoaW5lUGF0aCggYWxpYXNQYXRoICk7CisJfQorCisJaW5saW5lIEFycmF5T2ZJbnN0YW5jZU9mTWFjaGluZSAqIGdldE1hY2hpbmVQYXRoKCkgY29uc3QKKwl7CisJCXJldHVybiggcmF3U3ltYm9sKCktPmdldE1hY2hpbmVQYXRoKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNNYWNoaW5lUGF0aCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHJhd1N5bWJvbCgpLT5oYXNNYWNoaW5lUGF0aCgpICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBpc0FsaWFzKCkgY29uc3QKKwl7CisJCXJldHVybiggcmF3U3ltYm9sKCktPmlzQWxpYXMoKSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUFsaWFzVGFyZ2V0CisJICovCisJaW5saW5lIEJhc2VJbnN0YW5jZUZvcm0gKiBnZXRBbGlhc1RhcmdldCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHJhd1N5bWJvbCgpLT5nZXRBbGlhc1RhcmdldCgpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzQWxpYXNUYXJnZXQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCByYXdTeW1ib2woKS0+aGFzQWxpYXNUYXJnZXQoKSApOworCX0KKworCWlubGluZSB2b2lkIHNldEFsaWFzVGFyZ2V0KEJhc2VJbnN0YW5jZUZvcm0gKiBhbkFsaWFzVGFyZ2V0KQorCXsKKwkJcmF3U3ltYm9sKCktPnNldEFsaWFzVGFyZ2V0KCBhbkFsaWFzVGFyZ2V0ICk7CisJfQorCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUluc3RhbmNpYXRpb25Db3VudAorCSAqLworCWlubGluZSBhdm1fdWludDMyX3QgaW5zdGFuY2lhdGlvbkNvdW50SW5jcigpIGNvbnN0CisJeworCQlyZXR1cm4oIHJhd1N5bWJvbCgpLT5pbnN0YW5jaWF0aW9uQ291bnRJbmNyKCkgKTsKKwl9CisKKwlpbmxpbmUgYXZtX3VpbnQzMl90IGdldEluc3RhbmNpYXRpb25Db3VudCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHJhd1N5bWJvbCgpLT5nZXRJbnN0YW5jaWF0aW9uQ291bnQoKSApOworCX0KKworCWlubGluZSB2b2lkIHNldEluc3RhbmNpYXRpb25Db3VudChhdm1fdWludDMyX3QgYW5JbmRleCkKKwl7CisJCXJhd1N5bWJvbCgpLT5zZXRJbnN0YW5jaWF0aW9uQ291bnQoIGFuSW5kZXggKTsKKwl9CisKKworCS8qKgorCSAqIGlzIGVxdWFscworCSAqLworCWlubGluZSB2aXJ0dWFsIGJvb2wgZXF1YWxzKEJhc2VJbnN0YW5jZUZvcm0gKiBhbkluc3RhbmNlKSBjb25zdAorCXsKKwkJcmV0dXJuKCByYXdTeW1ib2woKS0+ZXF1YWxzKCBhbkluc3RhbmNlICkgKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gSW5zdGFuY2VPZkJ1ZmZlcgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlJbnN0YW5jZU9mQnVmZmVyICYgYnVmZmVyKCk7CisKKwljb25zdCBJbnN0YW5jZU9mQnVmZmVyICYgYnVmZmVyKCkgY29uc3Q7CisKKwlJbnN0YW5jZU9mQnVmZmVyICogcmF3QnVmZmVyKCkgY29uc3Q7CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1Qb2xpY3lTcGVjaWZpZXJLaW5kCisJICovCisJYXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCBnZXRQb2xpY3lTcGVjaWZpZXJLaW5kKCkgY29uc3Q7CisKKwl2b2lkIHNldFBvbGljeVNwZWNpZmllcktpbmQoYXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCBhU3BlY2lmaWVyS2luZCk7CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtQ2FwYWNpdHkKKwkgKi8KKwlhdm1fc2l6ZV90IGNhcGFjaXR5KCkgY29uc3Q7CisKKwlsb25nIHJlYWxDYXBhY2l0eSgpIGNvbnN0OworCisJdm9pZCBzZXRDYXBhY2l0eShsb25nIGFDYXBhY2l0eSk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gSW5zdGFuY2VPZkNoYW5uZWwKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJSW5zdGFuY2VPZlBvcnQgJiBjaGFubmVsKCk7CisKKwljb25zdCBJbnN0YW5jZU9mUG9ydCAmIGNoYW5uZWwoKSBjb25zdDsKKworCUluc3RhbmNlT2ZQb3J0ICogcmF3Q2hhbm5lbCgpIGNvbnN0OworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIEluc3RhbmNlT2ZDb25uZWN0CisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCUluc3RhbmNlT2ZDb25uZWN0ICYgY29ubmVjdG9yKCk7CisKKwljb25zdCBJbnN0YW5jZU9mQ29ubmVjdCAmIGNvbm5lY3RvcigpIGNvbnN0OworCisJSW5zdGFuY2VPZkNvbm5lY3QgKiByYXdDb25uZWN0KCkgY29uc3Q7CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1PdXRwdXRDb21Sb3V0ZURhdGEKKwkgKiBtSW5wdXRDb21Sb3V0ZURhdGEKKwkgKi8KKwljb25zdCBDb21Sb3V0ZURhdGEgJiBnZXRPdXRwdXRDb21Sb3V0ZURhdGEoKSBjb25zdDsKKworCWNvbnN0IENvbVJvdXRlRGF0YSAmIGdldElucHV0Q29tUm91dGVEYXRhKCkgY29uc3Q7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gSW5zdGFuY2VPZkRhdGEKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJSW5zdGFuY2VPZkRhdGEgJiBkYXRhKCk7CisKKwljb25zdCBJbnN0YW5jZU9mRGF0YSAmIGRhdGEoKSBjb25zdDsKKworCUluc3RhbmNlT2ZEYXRhICogcmF3RGF0YSgpIGNvbnN0OworCisKKwkvKioKKwkgKiBTRVRURVIKKwkgKiBtRnVsbHlRdWFsaWZpZWROYW1lSUQKKwkgKi8KKwl2b2lkIHVwZGF0ZUZ1bGx5UXVhbGlmaWVkTmFtZUlEKAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpOworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVBvaW50ZXJOYXR1cmUKKwkgKi8KKwl2aXJ0dWFsIFBPSU5URVJfREFUQV9OQVRVUkUgZ2V0UG9pbnRlck5hdHVyZSgpIGNvbnN0OworCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtVmFsdWUKKwkgKi8KKwlCRiAmIGdldFZhbHVlKCk7CisKKwljb25zdCBCRiAmIGdldFZhbHVlKCkgY29uc3Q7CisKKwlib29sIGhhc1ZhbHVlKCkgY29uc3Q7CisKKwl2b2lkIHNldFZhbHVlKGNvbnN0IEJGICYgYVZhbHVlKTsKKworCS8vIEFycmF5VmFsdWUKKwlBcnJheUJGICogZ2V0QXJyYXlWYWx1ZSgpIGNvbnN0OworCisJYm9vbCBoYXNBcnJheVZhbHVlKCkgY29uc3Q7CisKKworCXZvaWQgZm9ybWF0U3RyZWFtKE91dFN0cmVhbSAmIG9zLCBjb25zdCBCRiAmIGFWYWx1ZSkgY29uc3Q7CisKKwl2b2lkIHN0clZhbHVlKE91dFN0cmVhbSAmIG9zLCBjb25zdCBCRiAmIGFWYWx1ZSkgY29uc3Q7CisKKwlzdGQ6OnN0cmluZyBzdHJWYWx1ZShjb25zdCBCRiAmIGFWYWx1ZSkgY29uc3Q7CisKKwlzdGQ6OnN0cmluZyBzdHJWYWx1ZSgpIGNvbnN0OworCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtQXR0cmlidXRlVGFibGUKKwkgKi8KKwlUYWJsZU9mU3ltYm9sICogZ2V0QXR0cmlidXRlKCkgY29uc3Q7CisKKwljb25zdCBTeW1ib2wgJiBnZXRBdHRyaWJ1dGVCeU5hbWVJRChjb25zdCBzdGQ6OnN0cmluZyAmIGlkKSBjb25zdDsKKworCWJvb2wgaGFzQXR0cmlidXRlKCkgY29uc3Q7CisKKwl2b2lkIHNldEF0dHJpYnV0ZShUYWJsZU9mU3ltYm9sICogYW5BdHRyaWJ1dGVUYWJsZSk7CisKKwl2b2lkIHNldEF0dHJpYnV0ZShhdm1fb2Zmc2V0X3Qgb2Zmc2V0LCBjb25zdCBTeW1ib2wgJiBhV1Byb3BlcnR5KTsKKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVJlbGF0aXZlRGF0YVBhdGgKKwkgKiBtUmVsYXRpdmVPZmZzZXRQYXRoCisJICovCisJVGFibGVPZlN5bWJvbCAqIGdldERhdGFQYXRoKCkgY29uc3Q7CisKKwlib29sIGhhc0RhdGFQYXRoKCkgY29uc3Q7CisKKwl2b2lkIHNldERhdGFQYXRoKFRhYmxlT2ZTeW1ib2wgJiBhUmVsYXRpdmVEYXRhUGF0aCk7CisKKwlhdm1fc2l6ZV90ICogZ2V0T2Zmc2V0UGF0aCgpIGNvbnN0OworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIEluc3RhbmNlT2ZNYWNoaW5lCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCUluc3RhbmNlT2ZNYWNoaW5lICYgbWFjaGluZSgpOworCisJY29uc3QgSW5zdGFuY2VPZk1hY2hpbmUgJiBtYWNoaW5lKCkgY29uc3Q7CisKKwlJbnN0YW5jZU9mTWFjaGluZSAqIHJhd01hY2hpbmUoKSBjb25zdDsKKworCisJLyoqCisJICogR0VUVEVSCisJICogU3BlY2lmaWVyCisJICovCisJY29uc3QgU3BlY2lmaWVyICYgZ2V0U3BlY2lmaWVyKCkgY29uc3Q7CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIENvbXBpbGVkIE9iamVjdEVsZW1lbnQgYXMgQ29tcGlsZWQgTWFjaGluZQorCSAqLworCWNvbnN0IE1hY2hpbmUgKiBnZXRBc3RNYWNoaW5lKCkgY29uc3Q7CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIFRISVMKKwkgKi8KKwlib29sIGlzVGhpcygpIGNvbnN0OworCisJYm9vbCBpc25vdFRoaXMoY29uc3QgRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGUpIGNvbnN0OworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUV4ZWN1dGFibGUKKwkgKi8KKwlFeGVjdXRhYmxlRm9ybSAqIGdldEV4ZWN1dGFibGUoKSBjb25zdDsKKworCWJvb2wgaGFzRXhlY3V0YWJsZSgpIGNvbnN0OworCisJdm9pZCBzZXRFeGVjdXRhYmxlKEV4ZWN1dGFibGVGb3JtICogYW5FeGVjdXRhYmxlKTsKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1JbnN0YW5jZU1vZGVsCisJICovCisJSW5zdGFuY2VPZk1hY2hpbmUgKiBnZXRJbnN0YW5jZU1vZGVsKCkgY29uc3Q7CisKKwlib29sIGhhc0luc3RhbmNlTW9kZWwoKSBjb25zdDsKKworCWJvb2wgaXNJbnN0YW5jZU1vZGVsKEluc3RhbmNlT2ZNYWNoaW5lICogYW5JbnN0YW5jZU1vZGVsKSBjb25zdDsKKworCXZvaWQgc2V0SW5zdGFuY2VNb2RlbChJbnN0YW5jZU9mTWFjaGluZSAqIGFuSW5zdGFuY2VNb2RlbCk7CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtUGFyYW0KKwkgKiBtUGFyYW1SZXR1cm5UYWJsZQorCSAqIG1SZXR1cm5PZmZzZXQKKwkgKi8KKwlib29sIGhhc1BhcmFtKCkgY29uc3Q7CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtUnVudGltZVJJRAorCSAqLworCWNvbnN0IFJ1bnRpbWVJRCAmIGdldFJ1bnRpbWVSSUQoKSBjb25zdDsKKworCWJvb2wgaGFzUnVudGltZVJJRCgpIGNvbnN0OworCisJdm9pZCBzZXRSdW50aW1lUklEKGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIEluc3RhbmNlT2ZQb3J0CisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCUluc3RhbmNlT2ZQb3J0ICYgcG9ydCgpOworCisJY29uc3QgSW5zdGFuY2VPZlBvcnQgJiBwb3J0KCkgY29uc3Q7CisKKwlJbnN0YW5jZU9mUG9ydCAqIHJhd1BvcnQoKSBjb25zdDsKKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVJvdXRlT2Zmc2V0CisJICovCisJYXZtX3NpemVfdCBnZXRSb3V0ZU9mZnNldCgpIGNvbnN0OworCisJdm9pZCBzZXRSb3V0ZU9mZnNldChhdm1fc2l6ZV90IGFSb3V0ZU9mZnNldCk7CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtSW5wdXRSb3V0aW5nRGF0YQorCSAqIG1PdXRwdXRSb3V0aW5nRGF0YQorCSAqLworCWNvbnN0IFJvdXRpbmdEYXRhICYgZ2V0SW5wdXRSb3V0aW5nRGF0YSgpIGNvbnN0OworCisJYm9vbCBoYXNJbnB1dFJvdXRpbmdEYXRhKCkgY29uc3Q7CisKKwl2b2lkIHNldElucHV0Um91dGluZ0RhdGEoY29uc3QgUm91dGluZ0RhdGEgJiBhbklucHV0Um91dGluZ0RhdGEpOworCisKKwljb25zdCBSb3V0aW5nRGF0YSAmIGdldE91dHB1dFJvdXRpbmdEYXRhKCkgY29uc3Q7CisKKwlib29sIGhhc091dHB1dFJvdXRpbmdEYXRhKCkgY29uc3Q7CisKKwl2b2lkIHNldE91dHB1dFJvdXRpbmdEYXRhKGNvbnN0IFJvdXRpbmdEYXRhICYgYW5PdXRwdXRSb3V0aW5nRGF0YSk7CisKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFNlcmlhbGl6YXRpb24KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgc3RySGVhZGVyKCkgY29uc3QKKwl7CisJCXJldHVybiggKCBtUFRSICE9IE5VTEwgKSA/CisJCQkJcmF3U3ltYm9sKCktPnN0ckhlYWRlcigpIDogIlN5bWJvbDo6aGVhZGVyPG51bGw+IiApOworCX0KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgc3RySGVhZGVyKE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJaWYoIG1QVFIgIT0gTlVMTCApCisJCXsKKwkJCXJhd1N5bWJvbCgpLT5zdHJIZWFkZXIob3MpOworCQl9CisJCWVsc2UKKwkJeworCQkJb3MgPDwgIlN5bWJvbDo6aGVhZGVyPG51bGw+IjsKKwkJfQorCX0KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQlpZiggbVBUUiAhPSBOVUxMICkKKwkJeworCQkJcmF3U3ltYm9sKCktPnRvU3RyZWFtKCBvcyApOworCQl9CisJCWVsc2UKKwkJeworCQkJb3MgPDwgVEFCIDw8ICJTeW1ib2w6OnN0cmVhbTxudWxsPiIgPDwgRU9MX0ZMVVNIOworCQl9CisJfQorCisJaW5saW5lIHZpcnR1YWwgdm9pZCB0b0ZzY24oT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQlpZiggbVBUUiAhPSBOVUxMICkKKwkJeworCQkJcmF3U3ltYm9sKCktPnRvRnNjbiggb3MgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW9zIDw8IFRBQiA8PCAiU3ltYm9sOjpmc2NuPG51bGw+IiA8PCBFT0xfRkxVU0g7CisJCX0KKwl9CisKKwlpbmxpbmUgdmlydHVhbCBzdGQ6OnN0cmluZyB0b1N0cmluZygKKwkJCWNvbnN0IEF2bUluZGVudCAmIGluZGVudCA9IEFWTV9UQUJfSU5ERU5UKSBjb25zdAorCXsKKwkJU3RyaW5nT3V0U3RyZWFtIG9zcyhpbmRlbnQpOworCisJCXRvU3RyZWFtKCBvc3MgKTsKKworCQlyZXR1cm4oIG9zcy5zdHIoKSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHN0cigpIGNvbnN0CisJeworCQlyZXR1cm4oICggbVBUUiAhPSBOVUxMICkgPyByYXdTeW1ib2woKS0+c3RyKCkgOiAiU3ltYm9sOjpzdHI8bnVsbD4iICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgc3RyTnVtKAorCQkJdWludDhfdCBwcmVjaXNpb24gPSBBVk1fTVVNRVJJQ19QUkVDSVNJT04pIGNvbnN0CisJeworCQlyZXR1cm4oICggbVBUUiAhPSBOVUxMICkgPworCQkJCXJhd1N5bWJvbCgpLT5zdHJOdW0ocHJlY2lzaW9uKSA6ICJTeW1ib2w6Om51bTxudWxsPiIgKTsKKwl9CisKK307CisKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBUWVBFREVGIEZPUiBDT0xMRUNUSU9OIDwgU3ltYm9sID4KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3R5cGVkZWYgICAgICAgICAgIExpc3QgPCBTeW1ib2wgPiBMaXN0T2ZTeW1ib2w7Cit0eXBlZGVmICAgICAgICAgVmVjdG9yIDwgU3ltYm9sID4gVmVjdG9yT2ZTeW1ib2w7CisKKworLyoqCisgKiBvcGVyYXRvcjw8CisgKi8KK0FWTV9PU19TVFJFQU0oIFN5bWJvbCApCisKK0FWTV9PU19TVFJFQU1fQ09MTEVDVElPTiggTGlzdE9mU3ltYm9sICAgICApCitBVk1fT1NfU1RSRUFNX0NPTExFQ1RJT04oIFZlY3Rvck9mU3ltYm9sICAgKQorCisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKiBTWU1CT0xfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9zeW1ib2wvVGFibGVPZlN5bWJvbC5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvc3ltYm9sL1RhYmxlT2ZTeW1ib2wuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNjRjMjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvc3ltYm9sL1RhYmxlT2ZTeW1ib2wuY3BwCkBAIC0wLDAgKzEsMjA5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTUganVpbiAyMDE0CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJUYWJsZU9mU3ltYm9sLmgiCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjb25zdCBTeW1ib2wgJiBUYWJsZU9mU3ltYm9sOjpnZXRCeUZRTmFtZUlEKAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCkgY29uc3QKK3sKKwlDb250YWluZXJPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBDb250YWluZXJPZlN5bWJvbDo6YmVnaW4oKTsKKwlDb250YWluZXJPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBDb250YWluZXJPZlN5bWJvbDo6ZW5kKCk7CisJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJeworCQkvLyBTVFJJQ1Q6PiBjb21wYXJlIExPQ0FUT1IgJiBMT0NBVElPTiBbdHJ1ZTotIHJldHJ5IG9ubHkgb25seSBMT0NBVElPTl0KKwkJaWYoICgqaXQpLmZxbkVxdWFscyggYUZ1bGx5UXVhbGlmaWVkTmFtZUlEICwgdHJ1ZSApICkKKwkJeworCQkJcmV0dXJuKCAqaXQgKTsKKwkJfQorCX0KKwlyZXR1cm4oIFN5bWJvbDo6UkVGX05VTEwgKTsKK30KKworCitjb25zdCBTeW1ib2wgJiBUYWJsZU9mU3ltYm9sOjpnZXRCeVF1YWxpZmllZE5hbWVJRCgKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKSBjb25zdAoreworCUNvbnRhaW5lck9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBpdCA9IENvbnRhaW5lck9mU3ltYm9sOjpiZWdpbigpOworCUNvbnRhaW5lck9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IENvbnRhaW5lck9mU3ltYm9sOjplbmQoKTsKKwlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwl7CisJCWlmKCAoKml0KS5yYXdTeW1ib2woKS0+ZnFuRW5kc1dpdGgoYVF1YWxpZmllZE5hbWVJRCkgKQorCQl7CisJCQlyZXR1cm4oICppdCApOworCQl9CisJfQorCXJldHVybiggU3ltYm9sOjpSRUZfTlVMTCApOworfQorCisKK2F2bV9zaXplX3QgVGFibGVPZlN5bWJvbDo6Z2V0QnlRdWFsaWZpZWROYW1lSUQoCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCwgTGlzdE9mU3ltYm9sICYgbGlzdG9mRm91bmQpIGNvbnN0Cit7CisJYXZtX3NpemVfdCBjb3VudCA9IDA7CisKKwlDb250YWluZXJPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBDb250YWluZXJPZlN5bWJvbDo6YmVnaW4oKTsKKwlDb250YWluZXJPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBDb250YWluZXJPZlN5bWJvbDo6ZW5kKCk7CisJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJeworCQlpZiggKCppdCkucmF3U3ltYm9sKCktPmZxbkVuZHNXaXRoKGFRdWFsaWZpZWROYW1lSUQpICkKKwkJeworCQkJbGlzdG9mRm91bmQuYXBwZW5kKCAqaXQgKTsKKworCQkJKytjb3VudDsKKwkJfQorCX0KKworCXJldHVybiggY291bnQgKTsKK30KKworCitjb25zdCBTeW1ib2wgJiBUYWJsZU9mU3ltYm9sOjpnZXRCeU5hbWVJRChjb25zdCBzdGQ6OnN0cmluZyAmIGlkKSBjb25zdAoreworCUNvbnRhaW5lck9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBpdCA9IENvbnRhaW5lck9mU3ltYm9sOjpiZWdpbigpOworCUNvbnRhaW5lck9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IENvbnRhaW5lck9mU3ltYm9sOjplbmQoKTsKKwlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwl7CisJCWlmKCAoKml0KS5nZXROYW1lSUQoKSA9PSBpZCApCisJCXsKKwkJCXJldHVybiggKml0ICk7CisJCX0KKwl9CisJcmV0dXJuKCBTeW1ib2w6OlJFRl9OVUxMICk7Cit9CisKKworYXZtX3NpemVfdCBUYWJsZU9mU3ltYm9sOjpnZXRCeU5hbWVJRCgKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBpZCwgTGlzdE9mU3ltYm9sICYgbGlzdG9mRm91bmQpIGNvbnN0Cit7CisJYXZtX3NpemVfdCBjb3VudCA9IDA7CisKKwlDb250YWluZXJPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBDb250YWluZXJPZlN5bWJvbDo6YmVnaW4oKTsKKwlDb250YWluZXJPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBDb250YWluZXJPZlN5bWJvbDo6ZW5kKCk7CisJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJeworCQlpZiggKCppdCkuZ2V0TmFtZUlEKCkgPT0gaWQgKQorCQl7CisJCQlsaXN0b2ZGb3VuZC5hcHBlbmQoICppdCApOworCisJCQkrK2NvdW50OworCQl9CisJfQorCisJcmV0dXJuKCBjb3VudCApOworfQorCisKK2NvbnN0IFN5bWJvbCAmIFRhYmxlT2ZTeW1ib2w6OmdldEJ5QXN0RWxlbWVudCgKKwkJY29uc3QgT2JqZWN0RWxlbWVudCAqIGFzdEVsZW1lbnQpIGNvbnN0Cit7CisJQ29udGFpbmVyT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gQ29udGFpbmVyT2ZTeW1ib2w6OmJlZ2luKCk7CisJQ29udGFpbmVyT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gQ29udGFpbmVyT2ZTeW1ib2w6OmVuZCgpOworCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCXsKKwkJaWYoICgqaXQpLmlzQXN0RWxlbWVudCggYXN0RWxlbWVudCApICkKKwkJeworCQkJcmV0dXJuKCAqaXQgKTsKKwkJfQorCX0KKwlyZXR1cm4oIFN5bWJvbDo6UkVGX05VTEwgKTsKK30KKworCisvKioKKyAqIGNvbnRhaW5zIGEgcGFydGljdWxhciBlbGVtZW50CisgKi8KK2Jvb2wgVGFibGVPZlN5bWJvbDo6Y29udGFpbnMoQ29uc3RQb2ludGVyQmFzZVQgYVN5bWJvbCkgY29uc3QKK3sKKwlpZiggKGFTeW1ib2wtPmdldE9mZnNldCgpIDwgc2l6ZSgpKQorCQkmJiAoZ2V0KGFTeW1ib2wtPmdldE9mZnNldCgpKSA9PSBhU3ltYm9sKSApCisJeworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisJZWxzZQorCXsKKwkJQ29udGFpbmVyT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gQmFzZVZlY3Rvcjo6YmVnaW4oKTsKKwkJQ29udGFpbmVyT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gQmFzZVZlY3Rvcjo6ZW5kKCk7CisJCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCQl7CisJCQlpZiggKCppdCkgPT0gYVN5bWJvbCApCisJCQl7CisJCQkJcmV0dXJuKCB0cnVlICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorfQorCisKK2Jvb2wgVGFibGVPZlN5bWJvbDo6Y29udGFpbnMoY29uc3QgQkYgJiBhU3ltYm9sKSBjb25zdAoreworCUNvbnRhaW5lck9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBpdCA9IEJhc2VWZWN0b3I6OmJlZ2luKCk7CisJQ29udGFpbmVyT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gQmFzZVZlY3Rvcjo6ZW5kKCk7CisJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJeworCQlpZiggKCppdCkucmF3U3ltYm9sKCkgPT0gYVN5bWJvbC5yYXdfcG9pbnRlcigpICkKKwkJeworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKworCisvKioKKyAqIFNlcmlhbGl6YXRpb24KKyAqLwordm9pZCBUYWJsZU9mU3ltYm9sOjpzdHJIZWFkZXIoT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJQ29udGFpbmVyT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gQ29udGFpbmVyT2ZTeW1ib2w6OmJlZ2luKCk7CisJQ29udGFpbmVyT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gQ29udGFpbmVyT2ZTeW1ib2w6OmVuZCgpOworCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCXsKKwkJKCppdCkuc3RySGVhZGVyKCBvcyA8PCBUQUIgKTsgb3MgPDwgRU9MOworCX0KK30KKwordm9pZCBUYWJsZU9mU3ltYm9sOjp0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlDb250YWluZXJPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBDb250YWluZXJPZlN5bWJvbDo6YmVnaW4oKTsKKwlDb250YWluZXJPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBDb250YWluZXJPZlN5bWJvbDo6ZW5kKCk7CisJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJeworCQkoKml0KS50b1N0cmVhbShvcyk7CisJfQorfQorCit2b2lkIFRhYmxlT2ZTeW1ib2w6OnRvRnNjbihPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlDb250YWluZXJPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBDb250YWluZXJPZlN5bWJvbDo6YmVnaW4oKTsKKwlDb250YWluZXJPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBDb250YWluZXJPZlN5bWJvbDo6ZW5kKCk7CisJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJeworCQlvcyA8PCBUQUIgPDwgQVZNX05PX0lOREVOVDsKKwkJKCppdCkudG9Gc2NuKG9zKTsKKwkJb3MgPDwgRU5EX0lOREVOVF9FT0w7CisJfQorfQorCisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvc3ltYm9sL1RhYmxlT2ZTeW1ib2wuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC9zeW1ib2wvVGFibGVPZlN5bWJvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NzNiNzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvc3ltYm9sL1RhYmxlT2ZTeW1ib2wuaApAQCAtMCwwICsxLDIyNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDE1IGp1aW4gMjAxNAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFRBQkxFT0ZTWU1CT0xfSF8KKyNkZWZpbmUgVEFCTEVPRlNZTUJPTF9IXworCisjaW5jbHVkZSA8Y29tbW9uL0F2bU9iamVjdC5oPgorCisjaW5jbHVkZSA8Y29sbGVjdGlvbi9WZWN0b3IuaD4KKworI2luY2x1ZGUgPGZtbC9zeW1ib2wvU3ltYm9sLmg+CisjaW5jbHVkZSA8Y29sbGVjdGlvbi9MaXN0Lmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIEJGOworCitjbGFzcyBPYmplY3RFbGVtZW50OworCisKK2NsYXNzIFRhYmxlT2ZTeW1ib2wgOgorCQlwdWJsaWMgQXZtT2JqZWN0LAorCQlwdWJsaWMgVmVjdG9yT2ZTeW1ib2wsCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggVGFibGVPZlN5bWJvbCApCit7CisKKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggVGFibGVPZlN5bWJvbCApCisKKworcHVibGljOgorCS8qKgorCSAqIFRZUEVERUYKKwkgKi8KKwl0eXBlZGVmIEJhc2VJbnN0YW5jZUZvcm0gICAgICAgICogUG9pbnRlckJhc2VUOworCXR5cGVkZWYgY29uc3QgQmFzZUluc3RhbmNlRm9ybSAgKiBDb25zdFBvaW50ZXJCYXNlVDsKKworCXR5cGVkZWYgVmVjdG9yT2ZTeW1ib2wgICAgICAgICAgICBDb250YWluZXJPZlN5bWJvbDsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJVGFibGVPZlN5bWJvbCgpCisJOiBBdm1PYmplY3QoICksCisJQ29udGFpbmVyT2ZTeW1ib2woICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCVRhYmxlT2ZTeW1ib2woYXZtX3NpemVfdCBhU2l6ZSkKKwk6IEF2bU9iamVjdCggKSwKKwlDb250YWluZXJPZlN5bWJvbCggYVNpemUgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJVGFibGVPZlN5bWJvbChjb25zdCBUYWJsZU9mU3ltYm9sICYgYVRhYmxlKQorCTogQXZtT2JqZWN0KCBhVGFibGUgKSwKKwlDb250YWluZXJPZlN5bWJvbCggYVRhYmxlICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCVRhYmxlT2ZTeW1ib2woY29uc3QgVGFibGVPZlN5bWJvbCAmIGFUYWJsZSwgY29uc3QgU3ltYm9sICYgbGFzdFN5bWJvbCkKKwk6IEF2bU9iamVjdCggYVRhYmxlICksCisJQ29udGFpbmVyT2ZTeW1ib2woIGFUYWJsZSApCisJeworCQlDb250YWluZXJPZlN5bWJvbDo6cHVzaF9iYWNrKCBsYXN0U3ltYm9sICk7CisJfQorCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+VGFibGVPZlN5bWJvbCgpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIEdFVFRFUgorCSAqIGl0ZXJhdG9yIHByZWRlY2Vzc29yIG9mIGVuZAorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKi8KKwlpbmxpbmUgQ29udGFpbmVyT2ZTeW1ib2w6Oml0ZXJhdG9yIHByZWRfZW5kKCkKKwl7CisJCXJldHVybiggQ29udGFpbmVyT2ZTeW1ib2w6OmVtcHR5KCkgPyBDb250YWluZXJPZlN5bWJvbDo6ZW5kKCkgOgorCQkJCS0tKCBDb250YWluZXJPZlN5bWJvbDo6ZW5kKCkgKSApOworCX0KKworCWlubGluZSBDb250YWluZXJPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgcHJlZF9lbmQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBDb250YWluZXJPZlN5bWJvbDo6ZW1wdHkoKSA/IENvbnRhaW5lck9mU3ltYm9sOjplbmQoKSA6CisJCQkJLS0oIENvbnRhaW5lck9mU3ltYm9sOjplbmQoKSApICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIKKwkgKi8KKwlpbmxpbmUgY29uc3QgU3ltYm9sICYgZ2V0KGF2bV9zaXplX3Qgb2Zmc2V0KSBjb25zdAorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9BUlJBWV9PRkZTRVRfRVhJVCggb2Zmc2V0LCBDb250YWluZXJPZlN5bWJvbDo6c2l6ZSgpICkKKwkJCQk8PCAiVW5ib3VuZCBTeW1ib2wgb2Zmc2V0ICEhISIgPDwgc3RkOjplbmRsIDw8IHN0cl9oZWFkZXIoIHRoaXMgKQorCQkJCTw8IFNFTkRfRVhJVDsKKworCQlyZXR1cm4oIENvbnRhaW5lck9mU3ltYm9sOjphdChvZmZzZXQpICk7CisJfQorCisKKwljb25zdCBTeW1ib2wgJiBnZXRCeUZRTmFtZUlEKAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQpIGNvbnN0OworCisKKwljb25zdCBTeW1ib2wgJiBnZXRCeVF1YWxpZmllZE5hbWVJRCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkgY29uc3Q7CisKKwlhdm1fc2l6ZV90IGdldEJ5UXVhbGlmaWVkTmFtZUlEKAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlELAorCQkJTGlzdE9mU3ltYm9sICYgbGlzdG9mRm91bmQpIGNvbnN0OworCisKKwljb25zdCBTeW1ib2wgJiBnZXRCeU5hbWVJRChjb25zdCBzdGQ6OnN0cmluZyAmIGlkKSBjb25zdDsKKworCWF2bV9zaXplX3QgZ2V0QnlOYW1lSUQoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGlkLCBMaXN0T2ZTeW1ib2wgJiBsaXN0b2ZGb3VuZCkgY29uc3Q7CisKKworCWNvbnN0IFN5bWJvbCAmIGdldEJ5QXN0RWxlbWVudChjb25zdCBPYmplY3RFbGVtZW50ICogb2JqRWxlbWVudCkgY29uc3Q7CisKKworCS8qKgorCSAqIFNBVkUKKwkgKiBBUFBFTkQKKwkgKi8KKwlpbmxpbmUgY29uc3QgU3ltYm9sICYgc2F2ZShQb2ludGVyQmFzZVQgYVN5bWJvbCkKKwl7CisJCUNvbnRhaW5lck9mU3ltYm9sOjpwdXNoX2JhY2soIFN5bWJvbChhU3ltYm9sKSApOworCisJCXJldHVybiggQ29udGFpbmVyT2ZTeW1ib2w6OmJhY2soKSApOworCX0KKworCWlubGluZSB2b2lkIGFwcGVuZChjb25zdCBTeW1ib2wgJiBhU3ltYm9sKQorCXsKKwkJQ29udGFpbmVyT2ZTeW1ib2w6OmFwcGVuZCggYVN5bWJvbCApOworCX0KKworCWlubGluZSB2b2lkIGFwcGVuZChjb25zdCBMaXN0T2ZTeW1ib2wgJiBkYXRhTGlzdCkKKwl7CisJCUNvbnRhaW5lck9mU3ltYm9sOjphcHBlbmQoIGRhdGFMaXN0ICk7CisJfQorCisJaW5saW5lIHZvaWQgYXBwZW5kKGNvbnN0IFZlY3Rvck9mU3ltYm9sICYgZGF0YUxpc3QpCisJeworCQlDb250YWluZXJPZlN5bWJvbDo6YXBwZW5kKCBkYXRhTGlzdCApOworCX0KKworCisJLyoqCisJICogU0VUVEVSCisJICovCisJaW5saW5lIHZvaWQgc2V0KGF2bV9vZmZzZXRfdCBvZmZzZXQsIGNvbnN0IFN5bWJvbCAmIGFTeW1ib2wpCisJeworCQlDb250YWluZXJPZlN5bWJvbDo6c2V0KG9mZnNldCwgYVN5bWJvbCk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0KGF2bV9vZmZzZXRfdCBvZmZzZXQsIFBvaW50ZXJCYXNlVCBhU3ltYm9sKQorCXsKKwkJQ29udGFpbmVyT2ZTeW1ib2w6OnNldChvZmZzZXQsIFN5bWJvbChhU3ltYm9sKSk7CisJfQorCisKKwkvKioKKwkgKiBjb250YWlucyBhIHBhcnRpY3VsYXIgZWxlbWVudAorCSAqLworCWJvb2wgY29udGFpbnMoQ29uc3RQb2ludGVyQmFzZVQgYVN5bWJvbCkgY29uc3Q7CisKKwlib29sIGNvbnRhaW5zKGNvbnN0IFN5bWJvbCAmIGFTeW1ib2wpIGNvbnN0CisJeworCQlyZXR1cm4oIENvbnRhaW5lck9mU3ltYm9sOjpjb250YWlucyhhU3ltYm9sKSApOworCX0KKworCWJvb2wgY29udGFpbnMoY29uc3QgQkYgJiBhU3ltYm9sKSBjb25zdDsKKworCisJLyoqCisJICogU2VyaWFsaXphdGlvbgorCSAqLworCXZpcnR1YWwgdm9pZCBzdHJIZWFkZXIoT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCisJdmlydHVhbCB2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworCXZpcnR1YWwgdm9pZCB0b0ZzY24oT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCisKK307CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKiBUQUJMRU9GU1lNQk9MX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvdGVtcGxhdGUvVGVtcGxhdGVGYWN0b3J5LmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90ZW1wbGF0ZS9UZW1wbGF0ZUZhY3RvcnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyY2Q5Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvdGVtcGxhdGUvVGVtcGxhdGVGYWN0b3J5LmNwcApAQCAtMCwwICsxLDQ1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjYgbm92LiAyMDEzCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJUZW1wbGF0ZUZhY3RvcnkuaCIKKworI2luY2x1ZGUgPGZtbC90ZW1wbGF0ZS9UaW1lZE1hY2hpbmUuaD4KKworI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9NYWNoaW5lLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK3ZvaWQgVGVtcGxhdGVGYWN0b3J5OjpnZW5Qcm9wZXJ0eShNYWNoaW5lICogbWFjaGluZSkKK3sKKwlpZiggbWFjaGluZS0+Z2V0U3BlY2lmaWVyKCkuaGFzRmVhdHVyZVRpbWVkKCkgKQorCXsKKwkJVGltZWRNYWNoaW5lOjpnZW5Qcm9wZXJ0eShtYWNoaW5lKTsKKwl9Cit9CisKKwordm9pZCBUZW1wbGF0ZUZhY3Rvcnk6OmdlbkJlaGF2aW9yKE1hY2hpbmUgKiBtYWNoaW5lKQoreworCWlmKCBtYWNoaW5lLT5nZXRTcGVjaWZpZXIoKS5oYXNGZWF0dXJlVGltZWQoKSApCisJeworCQlUaW1lZE1hY2hpbmU6OmdlbkJlaGF2aW9yKG1hY2hpbmUpOworCX0KK30KKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90ZW1wbGF0ZS9UZW1wbGF0ZUZhY3RvcnkuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90ZW1wbGF0ZS9UZW1wbGF0ZUZhY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmExNGFiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3RlbXBsYXRlL1RlbXBsYXRlRmFjdG9yeS5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyNiBub3YuIDIwMTMKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBURU1QTEFURUZBQ1RPUllfSF8KKyNkZWZpbmUgVEVNUExBVEVGQUNUT1JZX0hfCisKK25hbWVzcGFjZSBzZXAKK3sKKworY2xhc3MgTWFjaGluZTsKKworCitjbGFzcyBUZW1wbGF0ZUZhY3RvcnkKK3sKKworcHVibGljOgorCXN0YXRpYyB2b2lkIGdlblByb3BlcnR5KE1hY2hpbmUgKiBtYWNoaW5lKTsKKworCXN0YXRpYyB2b2lkIGdlbkJlaGF2aW9yKE1hY2hpbmUgKiBtYWNoaW5lKTsKKworfTsKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKiBURU1QTEFURUZBQ1RPUllfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90ZW1wbGF0ZS9UaW1lZE1hY2hpbmUuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3RlbXBsYXRlL1RpbWVkTWFjaGluZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhkMjE4ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90ZW1wbGF0ZS9UaW1lZE1hY2hpbmUuY3BwCkBAIC0wLDAgKzEsMzQ1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjYgbm92LiAyMDEzCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJUaW1lZE1hY2hpbmUuaCIKKworI2luY2x1ZGUgPHBhcnNlci9tb2RlbC9QYXJzZXJVdGlsLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29uc3RhbnQuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29uc3RydWN0b3IuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9TdGF0ZW1lbnRDb25zdHJ1Y3Rvci5oPgorCisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yTWFuYWdlci5oPgorCisjaW5jbHVkZSA8Zm1sL3R5cGUvVHlwZVNwZWNpZmllci5oPgorCisjaW5jbHVkZSA8Zm1sL3R5cGUvVHlwZU1hbmFnZXIuaD4KKworI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9CZWhhdmlvcmFsUGFydC5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9NYWNoaW5lLmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1JvdXRpbmUuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvVmFyaWFibGUuaD4KKworI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9CZWhhdmlvcmFsUGFydC5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Db21wb3NpdGVQYXJ0Lmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1Byb3BlcnR5UGFydC5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworc3RkOjpzdHJpbmcgVGltZWRNYWNoaW5lOjpWQVJfSURfR0xPQkFMX1RJTUUoICIkdGltZSIgICk7CitzdGQ6OnN0cmluZyBUaW1lZE1hY2hpbmU6OlZBUl9JRF9ERUxUQV9USU1FICggIiRkZWx0YSIgKTsgLy8iJHRpbWUjZGVsdGEiCisKK3N0ZDo6c3RyaW5nIFRpbWVkTWFjaGluZTo6Uk9VVElORV9JRF9USU1FX0dFVCAoICJ0aW1lI2dldCIgICk7CitzdGQ6OnN0cmluZyBUaW1lZE1hY2hpbmU6OlJPVVRJTkVfSURfREVMVEFfR0VUKCAiZGVsdGEjZ2V0IiApOworCitzdGQ6OnN0cmluZyBUaW1lZE1hY2hpbmU6OlJPVVRJTkVfSURfVElNRV9SRVNFVCAoICJ0aW1lI3Jlc2V0IiAgKTsKKworc3RkOjpzdHJpbmcgVGltZWRNYWNoaW5lOjpST1VUSU5FX0lEX0NMT0NLX1JFU0VUICggImNsb2NrI3Jlc2V0IiAgKTsKK3N0ZDo6c3RyaW5nIFRpbWVkTWFjaGluZTo6Uk9VVElORV9JRF9DTE9DS19VUERBVEUoICJjbG9jayN1cGRhdGUiICk7CisKK1ZhcmlhYmxlICogVGltZWRNYWNoaW5lOjpTWVNURU1fVkFSX0dMT0JBTF9USU1FID0gTlVMTDsKK1ZhcmlhYmxlICogVGltZWRNYWNoaW5lOjpTWVNURU1fVkFSX0RFTFRBX1RJTUUgID0gTlVMTDsKKworCit2b2lkIFRpbWVkTWFjaGluZTo6Z2VuUHJvcGVydHkoTWFjaGluZSAqIG1hY2hpbmUpCit7CisJUHJvcGVydHlQYXJ0ICYgZGVjbCA9IG1hY2hpbmUtPmdldFByb3BlcnR5UGFydCgpOworCVZhcmlhYmxlICogYVZhcjsKKworCS8vIFR5cGVNYW5hZ2VyOjpVSU5URUdFUi8qVElNRSovCisJVHlwZVNwZWNpZmllciB0aW1lVHlwZSggVHlwZU1hbmFnZXI6Om5ld0Nsb2NrVGltZSgKKwkJCVRZUEVfVElNRV9TUEVDSUZJRVIsIFR5cGVNYW5hZ2VyOjpVSU5URUdFUikgKTsKKworCVR5cGVTcGVjaWZpZXIgZGVsdGFUeXBlKCBUeXBlTWFuYWdlcjo6bmV3Q2xvY2tUaW1lKAorCQkJVFlQRV9USU1FX1NQRUNJRklFUiwgVHlwZU1hbmFnZXI6OlBPU19JTlRFR0VSKSApOworCisJVHlwZVNwZWNpZmllciBjbG9ja1R5cGUoIFR5cGVNYW5hZ2VyOjpuZXdDbG9ja1RpbWUoCisJCQlUWVBFX0NMT0NLX1NQRUNJRklFUiwgVHlwZU1hbmFnZXI6OlVJTlRFR0VSKSApOworCisJTW9kaWZpZXIgbWRmclRpbWVkOworCS8vIEdMT0JBTF9USU1FCisJQkYgZ2xvYmFsVGltZVZhciA9IGRlY2wuc2F2ZU93bmVkVmFyaWFibGUoCisJCQlhVmFyID0gbmV3IFZhcmlhYmxlKG1hY2hpbmUsCisJCQkJCW1kZnJUaW1lZCwgdGltZVR5cGUsIFZBUl9JRF9HTE9CQUxfVElNRSkgKTsKKworCWlmKCBtYWNoaW5lLT5nZXRTcGVjaWZpZXIoKS5pc0NvbXBvbmVudFN5c3RlbSgpICkKKwl7CisJCVNZU1RFTV9WQVJfR0xPQkFMX1RJTUUgPSBhVmFyOworCX0KKworCisJLy8gREVMVEFfVElNRQorCUJGIGRlbHRhVGltZVZhciA9IGRlY2wuc2F2ZU93bmVkVmFyaWFibGUoCisJCQlhVmFyID0gbmV3IFZhcmlhYmxlKG1hY2hpbmUsCisJCQkJCW1kZnJUaW1lZC5hZGRGZWF0dXJlS2luZChNb2RpZmllcjo6RkVBVFVSRV9VTlNBRkVfS0lORCksCisJCQkJCWRlbHRhVHlwZSwgVkFSX0lEX0RFTFRBX1RJTUUpICk7CisKKwlpZiggbWFjaGluZS0+Z2V0U3BlY2lmaWVyKCkuaXNDb21wb25lbnRTeXN0ZW0oKSApCisJeworCQlTWVNURU1fVkFSX0RFTFRBX1RJTUUgPSBhVmFyOworCX0KKworCS8vIHRpbWUgJiBkZWx0YSBnZXR0ZXJzIDsKKwkvLyBjbG9jayA8PCByZXNldCAmIHVwZGF0ZSA+PiByb3V0aW5lIG1hY3JvCisJQmVoYXZpb3JhbFBhcnQgKiBtb2UgPSBtYWNoaW5lLT5nZXRVbmlxQmVoYXZpb3JQYXJ0KCk7CisKKwlNb2RpZmllciBtZGZyUGFyYW0oCisJCQlNb2RpZmllcjo6TkFUVVJFX1BBUkFNRVRFUl9LSU5ELAorCQkJTW9kaWZpZXI6OkZFQVRVUkVfVFJBTlNJRU5UX0tJTkQgKTsKKworCVZhcmlhYmxlICogcGFyYW07CisKKwkvLyB0aW1lIGdldHRlciByb3V0aW5lIG1hY3JvCisJUm91dGluZSAqIHRpbWVHZXR0ZXIgPSBSb3V0aW5lOjpuZXdEZWZpbmUoKm1vZSwgUk9VVElORV9JRF9USU1FX0dFVCk7CisJdGltZUdldHRlci0+Z2V0d01vZGlmaWVyKCkuc2V0TmF0dXJlTWFjcm8odHJ1ZSk7CisJbW9lLT5zYXZlUm91dGluZSggdGltZUdldHRlciApOworCisJcGFyYW0gPSBuZXcgVmFyaWFibGUodGltZUdldHRlciwgbWRmclBhcmFtLCB0aW1lVHlwZSwgIl90aW1lXyIpOworCXRpbWVHZXR0ZXItPnNhdmVSZXR1cm4ocGFyYW0pOworCXRpbWVHZXR0ZXItPnNldENvZGUoIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9SRVRVUk4sIGdsb2JhbFRpbWVWYXIgKSApOworCisJLy8gdGltZSBnZXR0ZXIgcm91dGluZSBtYWNybworCVJvdXRpbmUgKiBkZWx0YUdldHRlciA9IFJvdXRpbmU6Om5ld0RlZmluZSgqbW9lLCBST1VUSU5FX0lEX0RFTFRBX0dFVCk7CisJZGVsdGFHZXR0ZXItPmdldHdNb2RpZmllcigpLnNldE5hdHVyZU1hY3JvKHRydWUpOworCW1vZS0+c2F2ZVJvdXRpbmUoIGRlbHRhR2V0dGVyICk7CisKKwlwYXJhbSA9IG5ldyBWYXJpYWJsZShkZWx0YUdldHRlciwgbWRmclBhcmFtLCBkZWx0YVR5cGUsICJfZGVsdGFfIik7CisJZGVsdGFHZXR0ZXItPnNhdmVSZXR1cm4ocGFyYW0pOworCWRlbHRhR2V0dGVyLT5zZXRDb2RlKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfUkVUVVJOLCBkZWx0YVRpbWVWYXIgKSApOworCisKKwkvLyBnbG9iYWwgdGltZSA8PCByZXNldCA+PiByb3V0aW5lIG1hY3JvCisJUm91dGluZSAqIHRpbWVSZXNldCA9IFJvdXRpbmU6Om5ld0RlZmluZSgqbW9lLCBST1VUSU5FX0lEX1RJTUVfUkVTRVQpOworCXRpbWVSZXNldC0+Z2V0d01vZGlmaWVyKCkuc2V0TmF0dXJlTWFjcm8odHJ1ZSk7CisJbW9lLT5zYXZlUm91dGluZSggdGltZVJlc2V0ICk7CisKKwl0aW1lUmVzZXQtPnNldENvZGUoIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BU1NJR04sIGdsb2JhbFRpbWVWYXIsCisJCQlFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfWkVSTyApICk7CisKKworCS8vIGNsb2NrIDw8IHJlc2V0ID4+IHJvdXRpbmUgbWFjcm8KKwlSb3V0aW5lICogY2xvY2tSZXNldCA9IFJvdXRpbmU6Om5ld0RlZmluZSgqbW9lLCBST1VUSU5FX0lEX0NMT0NLX1JFU0VUKTsKKwljbG9ja1Jlc2V0LT5nZXR3TW9kaWZpZXIoKS5zZXROYXR1cmVNYWNybyh0cnVlKTsKKwltb2UtPnNhdmVSb3V0aW5lKCBjbG9ja1Jlc2V0ICk7CisKKwlwYXJhbSA9IG5ldyBWYXJpYWJsZShjbG9ja1Jlc2V0LCBtZGZyUGFyYW0sIGNsb2NrVHlwZSwgIl9jbG9ja18iKTsKKwljbG9ja1Jlc2V0LT5zYXZlUGFyYW1ldGVyKCBwYXJhbSApOworCWNsb2NrUmVzZXQtPnNldENvZGUoIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BU1NJR04sIElOQ1JfQkYocGFyYW0pLAorCQkJRXhwcmVzc2lvbkNvbnN0YW50OjpJTlRFR0VSX1pFUk8gKSApOworCisKKwkvLyBjbG9jayA8PCB1cGRhdGUgPj4gcm91dGluZSBtYWNybworCVJvdXRpbmUgKiBjbG9ja1VwZGF0ZSA9IFJvdXRpbmU6Om5ld0RlZmluZSgqbW9lLCBST1VUSU5FX0lEX0NMT0NLX1VQREFURSk7CisJY2xvY2tVcGRhdGUtPmdldHdNb2RpZmllcigpLnNldE5hdHVyZU1hY3JvKHRydWUpOworCW1vZS0+c2F2ZVJvdXRpbmUoIGNsb2NrVXBkYXRlICk7CisKKwlwYXJhbSA9IG5ldyBWYXJpYWJsZShjbG9ja1VwZGF0ZSwgbWRmclBhcmFtLCBjbG9ja1R5cGUsICJfY2xvY2tfIik7CisJY2xvY2tVcGRhdGUtPnNhdmVQYXJhbWV0ZXIoIHBhcmFtICk7CisJY2xvY2tVcGRhdGUtPnNldENvZGUoIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BU1NJR04sIElOQ1JfQkYocGFyYW0pLAorCQkJRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1BMVVMsCisJCQkJCUlOQ1JfQkYocGFyYW0pLCBJTkNSX0JGKGFWYXIpKSApICk7Cit9CisKKworCit2b2lkIFRpbWVkTWFjaGluZTo6Z2VuQmVoYXZpb3IoTWFjaGluZSAqIG1hY2hpbmUpCit7CisJVGltZWRNYWNoaW5lOjpnZW5CZWhhdmlvckluaXQobWFjaGluZSk7CisKKwlUaW1lZE1hY2hpbmU6OmdlbkJlaGF2aW9ySVJ1bihtYWNoaW5lKTsKK30KKworCit2b2lkIFRpbWVkTWFjaGluZTo6Z2VuQmVoYXZpb3JJbml0KE1hY2hpbmUgKiBtYWNoaW5lKQoreworCUJGQ29kZSBpbml0Q3VycmVudFRpbWUgPSBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQVNTSUdOLAorCQkJbWFjaGluZS0+Z2V0UHJvcGVydHlQYXJ0KCkuCisJCQkJCWdldFZhcmlhYmxlcygpLmdldEJ5TmFtZUlEKFZBUl9JRF9HTE9CQUxfVElNRSksCisJCQlUeXBlTWFuYWdlcjo6VUlOVEVHRVIvKlRJTUUqLy5nZXREZWZhdWx0VmFsdWUoKS8qVElNRSovKTsKKworCUJGQ29kZSBpbml0RGVsdGFUaW1lID0gU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FTU0lHTiwKKwkJCW1hY2hpbmUtPmdldFByb3BlcnR5UGFydCgpLgorCQkJCQlnZXRWYXJpYWJsZXMoKS5nZXRCeU5hbWVJRChWQVJfSURfREVMVEFfVElNRSksCisJCQlUeXBlTWFuYWdlcjo6VUlOVEVHRVIvKlRJTUUqLy5nZXREZWZhdWx0VmFsdWUoKSk7CisKKwltYWNoaW5lLT5nZXRVbmlxQmVoYXZpb3JQYXJ0KCktPnNldE9uSW5pdCgKKwkJCVN0YXRlbWVudENvbnN0cnVjdG9yOjp4bmV3Q29kZUZsYXQoCisJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU0VRVUVOQ0UsCisJCQkJCVN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQVRPTUlDX1NFUVVFTkNFLAorCQkJCQkJCWluaXRDdXJyZW50VGltZSwgaW5pdERlbHRhVGltZSksCisJCQkJCW1hY2hpbmUtPmdldFVuaXFCZWhhdmlvclBhcnQoKS0+Z2V0T25Jbml0KCkpICk7Cit9CisKKwordm9pZCBUaW1lZE1hY2hpbmU6OmdlbkJlaGF2aW9ySVJ1bihNYWNoaW5lICogbWFjaGluZSkKK3sKKwlCRiB2YXJEZWx0YVRpbWUgPSBtYWNoaW5lLT5nZXRQcm9wZXJ0eVBhcnQoKS4KKwkJCWdldFZhcmlhYmxlcygpLmdldEJ5TmFtZUlEKFZBUl9JRF9ERUxUQV9USU1FKTsKKworCUJGQ29kZSBuZXdmcmVzaERlbHRhVGltZSA9IFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BU1NJR05fTkVXRlJFU0gsIHZhckRlbHRhVGltZSApOworCisvLyBQcm9ibMOobWUgZGUgc2NhbGFiaWxpdGU6IHBhc3NhZ2Ugw6AgbCdlY2hlbGxlID8gZXN0LWNlIHV0aWxlID8KKy8vCUJGQ29kZSBndWFyZERlbHRhVGltZSA9IFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKAorLy8JCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1RJTUVEX0dVQVJELAorLy8JCQkJCUV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKy8vCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9HVCwKKy8vCQkJCQkJdmFyRGVsdGFUaW1lLCBFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfWkVSTykgKTsKKworLy8gUHJvYmzDqG1lIGRlIHNjYWxhYmlsaXRlOiBwYXNzYWdlIMOgIGwnZWNoZWxsZSA/IGVzdC1jZSB1dGlsZSA/CisvLwlCRiB2YXJDdXJyZW50VGltZSA9IG1hY2hpbmUtPmdldFByb3BlcnR5UGFydCgpLgorLy8JCQlnZXRWYXJpYWJsZXMoKS5nZXRCeU5hbWVJRChWQVJfSURfR0xPQkFMX1RJTUUpOworLy8KKy8vCUJGQ29kZSBpbmNyQ3VycmVudFRpbWUgPSBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKy8vCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BU1NJR04sIHZhckN1cnJlbnRUaW1lLAorLy8JCQlFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NvZGUoCisvLwkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9QTFVTLAorLy8JCQkJCXZhckN1cnJlbnRUaW1lLCB2YXJEZWx0YVRpbWUpICk7CisKKworCUJGQ29kZSB1cGRhdGVUaW1lQ2xvY2sgPSBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQVRPTUlDX1NFUVVFTkNFLAorCQkJbmV3ZnJlc2hEZWx0YVRpbWUvKiwgZ3VhcmREZWx0YVRpbWUsIGluY3JDdXJyZW50VGltZSovKTsKKworCXVwZGF0ZUNsb2NrKG1hY2hpbmUsIG1hY2hpbmUsIHZhckRlbHRhVGltZSwgdXBkYXRlVGltZUNsb2NrKTsKKworCW1hY2hpbmUtPmdldFVuaXFCZWhhdmlvclBhcnQoKS0+c2V0T25JUnVuKAorCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6OnhuZXdDb2RlRmxhdCgKKwkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TRVFVRU5DRSwgdXBkYXRlVGltZUNsb2NrLAorCQkJCQltYWNoaW5lLT5nZXRVbmlxQmVoYXZpb3JQYXJ0KCktPmdldE9uSVJ1bigpKSApOworfQorCisKK3ZvaWQgVGltZWRNYWNoaW5lOjp1cGRhdGVDbG9jayhjb25zdCBNYWNoaW5lICogbW9kZWxNYWNoaW5lLAorCQlNYWNoaW5lICogYU1hY2hpbmUsIGNvbnN0IEJGICYgdmFyRGVsdGFUaW1lLAorCQljb25zdCBCRkNvZGUgJiBzZXFDb2RlLCBjb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpCit7CisJc3RkOjpzdHJpbmcgYVJlbGF0aXZlTmFtZUlEID0gYVF1YWxpZmllZE5hbWVJRC5lbXB0eSgpCisJCQkJPyBhTWFjaGluZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJCTogKGFRdWFsaWZpZWROYW1lSUQgKyAiLiIgKyBhTWFjaGluZS0+Z2V0TmFtZUlEKCkpOworCisJdXBkYXRlQ2xvY2soYU1hY2hpbmUsIG1vZGVsTWFjaGluZS0+Z2V0UHJvcGVydHlQYXJ0KCkuZ2V0VmFyaWFibGVzKCksCisJCQl2YXJEZWx0YVRpbWUsIHNlcUNvZGUsIGFSZWxhdGl2ZU5hbWVJRCk7CisKKwlDb21wb3NpdGVQYXJ0Ojpjb25zdF9tYWNoaW5lX2l0ZXJhdG9yIGl0TWFjaGluZSA9CisJCQltb2RlbE1hY2hpbmUtPmdldENvbXBvc2l0ZVBhcnQoKS0+bWFjaGluZV9iZWdpbigpOworCUNvbXBvc2l0ZVBhcnQ6OmNvbnN0X21hY2hpbmVfaXRlcmF0b3IgZW5kTWFjaGluZSA9CisJCQltb2RlbE1hY2hpbmUtPmdldENvbXBvc2l0ZVBhcnQoKS0+bWFjaGluZV9lbmQoKTsKKwlmb3IoIDsgaXRNYWNoaW5lICE9IGVuZE1hY2hpbmUgOyArK2l0TWFjaGluZSApCisJeworCQlpZiggKGl0TWFjaGluZSktPmdldFNwZWNpZmllcigpLmlzRGVzaWduUHJvdG90eXBlU3RhdGljKCkgKQorCQl7CisJCQltb2RlbE1hY2hpbmUgPSAoaXRNYWNoaW5lKTsKKworCQl9CisJCWVsc2UgaWYoIChpdE1hY2hpbmUpLT5nZXRTcGVjaWZpZXIoKS5pc0Rlc2lnbkluc3RhbmNlU3RhdGljKCkgKQorCQl7CisJCQltb2RlbE1hY2hpbmUgPSAoaXRNYWNoaW5lKS0+Z2V0TW9kZWxNYWNoaW5lKCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQltb2RlbE1hY2hpbmUgPSBOVUxMOworCQl9CisKKwkJaWYoIChtb2RlbE1hY2hpbmUgIT0gTlVMTCkKKwkJCSYmIChub3QgbW9kZWxNYWNoaW5lLT5nZXRTcGVjaWZpZXIoKS5oYXNGZWF0dXJlVGltZWQoKSkKKwkJCSYmIChtb2RlbE1hY2hpbmUtPmdldFByb3BlcnR5UGFydCgpLmhhc1ZhcmlhYmxlKCkKKwkJCQl8fCBtb2RlbE1hY2hpbmUtPmhhc01hY2hpbmUoKSkgKQorCQl7CisJCQl1cGRhdGVDbG9jayhtb2RlbE1hY2hpbmUsIChpdE1hY2hpbmUpLAorCQkJCQl2YXJEZWx0YVRpbWUsIHNlcUNvZGUsIGFSZWxhdGl2ZU5hbWVJRCk7CisJCX0KKwl9Cit9CisKK3ZvaWQgVGltZWRNYWNoaW5lOjp1cGRhdGVDbG9jayhNYWNoaW5lICogbWFjaGluZSwKKwkJY29uc3QgVGFibGVPZlZhcmlhYmxlICYgdmFyaWFibGVzLCBjb25zdCBCRiAmIHZhckRlbHRhVGltZSwKKwkJY29uc3QgQkZDb2RlICYgc2VxQ29kZSwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKQoreworCUJGIHZhckluc3RhbmNlOworCisJVGFibGVPZlZhcmlhYmxlOjpjb25zdF9yYXdfaXRlcmF0b3IgaXRWYXIgPSB2YXJpYWJsZXMuYmVnaW4oKTsKKwlUYWJsZU9mVmFyaWFibGU6OmNvbnN0X3Jhd19pdGVyYXRvciBlbmR2YXIgPSB2YXJpYWJsZXMuZW5kKCk7CisJZm9yKCA7IGl0VmFyICE9IGVuZHZhciA7ICsraXRWYXIgKQorCXsKKwkJaWYoIChpdFZhciktPmhhc1R5cGVTcGVjaWZpZXIoKSAmJgorCQkJKGl0VmFyKS0+Z2V0VHlwZVNwZWNpZmllcigpLT5pc1R5cGVkQ2xvY2soKSApCisJCXsKKwkJCWlmKCBub3QgKGl0VmFyKS0+Z2V0TW9kaWZpZXIoKS5oYXNNb2RpZmllclB1YmxpY1ZvbGF0aWxlKCkgKQorCQkJeworCQkJCShpdFZhciktPmdldHdNb2RpZmllcigpLnNldE1vZGlmaWVyUHVibGljVm9sYXRpbGUoKTsKKwkJCX0KKworCQkJaWYoIG5vdCAoaXRWYXIpLT5oYXNWYWx1ZSgpICkKKwkJCXsKKwkJCQkoaXRWYXIpLT5zZXRWYWx1ZShFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfWkVSTyk7CisJCQl9CisKKwkJCWlmKCAobWFjaGluZSA9PSAoaXRWYXIpLT5nZXRDb250YWluZXJNYWNoaW5lKCkpCisJCQkJJiYgKG1hY2hpbmUtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPT0gYVF1YWxpZmllZE5hbWVJRCkgKQorCQkJeworCQkJCXZhckluc3RhbmNlID0gKCppdFZhcik7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJdmFySW5zdGFuY2UgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld1F1YWxpZmllZElkZW50aWZpZXIoCisJCQkJCQlhUXVhbGlmaWVkTmFtZUlEICsgIi4iICsgKGl0VmFyKS0+Z2V0TmFtZUlEKCkgKTsKKwkJCX0KKworCQkJQkZDb2RlIHVwZGF0ZUNvZGUoT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9JRiwKKwkJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoCisJCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TVEFUVVNfSVMsCisJCQkJCQkJSU5DUl9CRihPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NDSEVEVUxFX0lOVk9LRSksCisJCQkJCQkJRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdRdWFsaWZpZWRJZGVudGlmaWVyKAorCQkJCQkJCQkJYVF1YWxpZmllZE5hbWVJRCkgKSApOworCisKKwkJCVJvdXRpbmUgKiB1cGRhdGVDbG9jayA9CisJCQkJCW1hY2hpbmUtPnJhd3NlbVJvdXRpbmVCeU5hbWVJRChST1VUSU5FX0lEX0NMT0NLX1VQREFURSk7CisJCQlpZiggdXBkYXRlQ2xvY2sgIT0gTlVMTCApCisJCQl7CisvLwkJCQlBVk1fT1NfQ09VVCA8PCBFTVBIQVNJUygiUk9VVElORV9JRF9DTE9DS19VUERBVEUiLCAnKicsIDQyKTsKKwkJCQl1cGRhdGVDbG9jayA9IFJvdXRpbmU6Om5ld0ludm9rZShtYWNoaW5lLCBJTkNSX0JGKHVwZGF0ZUNsb2NrKSk7CisJCQkJdXBkYXRlQ2xvY2stPmFwcGVuZFBhcmFtZXRlciggdmFySW5zdGFuY2UgKTsKKworCQkJCXVwZGF0ZUNvZGUtPmFwcGVuZChQYXJzZXJVdGlsOjppbnZva2VSb3V0aW5lU3RhdGVtZW50KHVwZGF0ZUNsb2NrKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJdXBkYXRlQ29kZS0+YXBwZW5kKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQkJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQVNTSUdOLCB2YXJJbnN0YW5jZSwKKwkJCQkJCUV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q29kZSgKKwkJCQkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9QTFVTLAorCQkJCQkJCQl2YXJJbnN0YW5jZSwgdmFyRGVsdGFUaW1lKSApICk7CisJCQl9CisKKwkJCXNlcUNvZGUtPmFwcGVuZCggdXBkYXRlQ29kZSApOworCQl9CisJfQorfQorCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3RlbXBsYXRlL1RpbWVkTWFjaGluZS5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3RlbXBsYXRlL1RpbWVkTWFjaGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZmU2ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvdGVtcGxhdGUvVGltZWRNYWNoaW5lLmgKQEAgLTAsMCArMSw3MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDI2IG5vdi4gMjAxMworICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFRJTUVETUFDSElORV9IXworI2RlZmluZSBUSU1FRE1BQ0hJTkVfSF8KKworI2luY2x1ZGUgPHV0aWwvYXZtX3N0cmluZy5oPgorCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1ZhcmlhYmxlLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBCRjsKK2NsYXNzIEJGQ29kZTsKKworY2xhc3MgTWFjaGluZTsKKworCitjbGFzcyBUaW1lZE1hY2hpbmUKK3sKKworcHVibGljOgorCisJc3RhdGljIHN0ZDo6c3RyaW5nIFZBUl9JRF9HTE9CQUxfVElNRTsKKwlzdGF0aWMgc3RkOjpzdHJpbmcgVkFSX0lEX0RFTFRBX1RJTUU7CisKKwlzdGF0aWMgc3RkOjpzdHJpbmcgUk9VVElORV9JRF9USU1FX0dFVDsKKwlzdGF0aWMgc3RkOjpzdHJpbmcgUk9VVElORV9JRF9ERUxUQV9HRVQ7CisKKwlzdGF0aWMgc3RkOjpzdHJpbmcgUk9VVElORV9JRF9USU1FX1JFU0VUOworCisJc3RhdGljIHN0ZDo6c3RyaW5nIFJPVVRJTkVfSURfQ0xPQ0tfUkVTRVQ7CisJc3RhdGljIHN0ZDo6c3RyaW5nIFJPVVRJTkVfSURfQ0xPQ0tfVVBEQVRFOworCisJc3RhdGljIFZhcmlhYmxlICogU1lTVEVNX1ZBUl9HTE9CQUxfVElNRTsKKwlzdGF0aWMgVmFyaWFibGUgKiBTWVNURU1fVkFSX0RFTFRBX1RJTUU7CisKKwlzdGF0aWMgdm9pZCBnZW5Qcm9wZXJ0eShNYWNoaW5lICogbWFjaGluZSk7CisKKwlzdGF0aWMgdm9pZCBnZW5CZWhhdmlvcihNYWNoaW5lICogbWFjaGluZSk7CisJc3RhdGljIHZvaWQgZ2VuQmVoYXZpb3JJbml0KE1hY2hpbmUgKiBtYWNoaW5lKTsKKwlzdGF0aWMgdm9pZCBnZW5CZWhhdmlvcklSdW4oTWFjaGluZSAqIG1hY2hpbmUpOworCisJc3RhdGljIHZvaWQgdXBkYXRlQ2xvY2soY29uc3QgTWFjaGluZSAqIG1vZGVsTWFjaGluZSwgTWFjaGluZSAqIG1hY2hpbmUsCisJCQljb25zdCBCRiAmIHZhckRlbHRhVGltZSwgY29uc3QgQkZDb2RlICYgc2VxQ29kZSwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCA9ICIiKTsKKworCisJc3RhdGljIHZvaWQgdXBkYXRlQ2xvY2soTWFjaGluZSAqIG1hY2hpbmUsCisJCQljb25zdCBUYWJsZU9mVmFyaWFibGUgJiB2YXJpYWJsZXMsIGNvbnN0IEJGICYgdmFyRGVsdGFUaW1lLAorCQkJY29uc3QgQkZDb2RlICYgc2VxQ29kZSwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEID0gIiIpOworfTsKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKiBUSU1FRE1BQ0hJTkVfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90cmFjZS9CYXNpY1RyYWNlUGFyc2VyLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90cmFjZS9CYXNpY1RyYWNlUGFyc2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjNlN2E4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3RyYWNlL0Jhc2ljVHJhY2VQYXJzZXIuY3BwCkBAIC0wLDAgKzEsNTgzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogNCBmw6l2ci4gMjAxNQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQmFzaWNUcmFjZVBhcnNlci5oIgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25Db25zdHJ1Y3Rvci5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZVF1ZXJ5Lmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZVN5c3RlbS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZQb3J0Lmg+CisKKyNpbmNsdWRlIDxmbWwvc3ltYm9sL1N5bWJvbC5oPgorCisjaW5jbHVkZSA8Zm1sL3RyYWNlL1RyYWNlUG9pbnQuaD4KKyNpbmNsdWRlIDxmbWwvdHJhY2UvVHJhY2VTZXF1ZW5jZS5oPgorCisjaW5jbHVkZSA8c2V3L0NvbmZpZ3VyYXRpb24uaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBPVEhFUiBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qCisgKiBFeGVtcGxlIGRlIHRyYWNlIGJhc2lxdWUKKzEKK1RTSV90YXJnZXQ/MQorMTIwCitSU0RfRU5BQkxFRF9zb3VyY2UhMQorMAorUFNEX0VOQUJMRURfc291cmNlITEKKzQyMzM4NQorUlNEX0NNRF9zb3VyY2UhMQorMAorUFNEX1NUQVRFMV90YXJnZXQ/MAorMzAyNTY0NgorREVQX0FVVEgxX3NvdXJjZSExCisxMDU5ODIyCitUU0kxX3RhcmdldD8wCisKK0JBU0lDI1hMSUE6CisJSU5QVVQgIGVudl9jb25uZWN0aW9uX3NpZ25hbCggICkKKwlPVVRQVVQgZW52X2VudGVyX3Bpbl9tZXNzYWdlKCAgKQorCUlOUFVUICBlbnZfdXNlcl9waW4oIDM3ODIgKQorCU9VVFBVVCBlbnZfYXNrZWRfd2l0aGRyYXdhbF9tZXNzYWdlKCAgKQorCUlOUFVUICBlbnZfYXNrZWRfd2l0aGRyYXdhbCggNTAwMSApCisJT1VUUFVUIGVudl9vcGVyYXRpb25fbm90X3Bvc3NpYmxlKCAyICwgNTAwMCApCisqLworCitib29sIEJhc2ljVHJhY2VQYXJzZXI6OnBhcnNlQmFzaWNYbGlhVHJhY2UoVHJhY2VTZXF1ZW5jZSAmIGFUcmFjZUVsZW1lbnQsCisJCXN0ZDo6aWZzdHJlYW0gJiBpbkZpbGUsIGNvbnN0IEJGICYgYVZhclRpbWUpCit7CisJYm9vbCBpc09LID0gdHJ1ZTsKKworCQkvL2ZvciBkZWJ1ZyBwdXJwb3NlcworCWJvb2wgaXNPS0xpbmUgPSB0cnVlOworCWludCBjcHRMaW5lID0gMDsKKworCWJmVmFyVGltZSA9IGFWYXJUaW1lOworCisJc3RkOjpzdHJpbmcgaW5MaW5lOworCisJd2hpbGUoIGluRmlsZS5nb29kKCkgKQorCXsKKwkJY3B0TGluZSArKzsKKworCQlzdGQ6OmdldGxpbmUoaW5GaWxlLCBpbkxpbmUpOworCisJCVN0cmluZ1Rvb2xzOjpsdHJpbSggaW5MaW5lICk7CisKKwkJaWYoIChpbkxpbmUgPT0gIlxcbiIpIHx8IGluTGluZS5lbXB0eSgpICkKKwkJeworCQkJLy8gISFOT1RISU5HOiBTS0lQIE5FV0xJTkUKKwkJCWlzT0tMaW5lID0gdHJ1ZTsKKwkJfQorCQllbHNlIGlmKChpbkxpbmVbMF0pID09ICcjJykKKwkJeworCQkJLy8gQ09NTUVOVAorCQkJaXNPS0xpbmUgPSB0cnVlOworCQl9CisJCWVsc2UgaWYoIFN0cmluZ1Rvb2xzOjpzdGFydHNXaXRoKGluTGluZSwgImRlbHRhIikgKQorCQl7CisJCQlpc09LTGluZSA9IHBhcnNlQmFzaWNYbGlhVHJhY2VEdXJhdGlvbihhVHJhY2VFbGVtZW50LCBpbkxpbmUsIGFWYXJUaW1lKTsKKwkJfQorCQllbHNlIGlmKCBSRUdFWF9TVEFSVFMoaW5MaW5lLCAiKGlucHV0fG91dHB1dHxJTlBVVHxPVVRQVVQpIikgKQorCQl7CisJCQlpc09LTGluZSA9IHBhcnNlQmFzaWNYbGlhVHJhY2VTaWduYWwoYVRyYWNlRWxlbWVudCwgaW5MaW5lKTsKKwkJfQorCisJCWVsc2UgaWYoKGluTGluZVswXSkgPT0gJ3snKQorCQl7CisJCQlpc09LTGluZSA9IHBhcnNlQmFzaWNUcmFjZVN0cnVjdHVyZShhVHJhY2VFbGVtZW50LCBpbkxpbmUpOworCQl9CisKKwkJaXNPSyA9IGlzT0tMaW5lICYmIGlzT0s7CisKKwkJaWYobm90IGlzT0tMaW5lKQorCQl7CisJCQlBVk1fT1NfV0FSTiA8PCAiRXJyb3I6IEVycm9yIHdoaWxlIHJlYWRpbmcgdHJhY2UgZmlsZSBvbiBsaW5lICIKKwkJCQkJPDwgY3B0TGluZSA8PCAiOiAiIDw8IGluTGluZSA8PCBzdGQ6OmVuZGw7CisJCX0KKworCX0KKworCXJldHVybiggaXNPSyApOworfQorCitib29sIEJhc2ljVHJhY2VQYXJzZXI6OnBhcnNlQmFzaWNYbGlhVHJhY2VEdXJhdGlvbihUcmFjZVNlcXVlbmNlICYgYVRyYWNlRWxlbWVudCwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBpbkxpbmUsIGNvbnN0IEJGICYgYVZhclRpbWUpCit7CisKKwlzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IGluTGluZS5maW5kKCc9Jyk7CisJc3RkOjpzdHJpbmcgZGVsdGEgPSBpbkxpbmUuc3Vic3RyKHBvcysxKTsKKwlTdHJpbmdUb29sczo6bHRyaW0oIGRlbHRhICk7CisKKwlhdm1faW50ZWdlcl90IGR1cmF0aW9uOworCWlmKCBmcm9tX3N0cmluZyhkZWx0YSwgZHVyYXRpb24sIHN0ZDo6ZGVjKSApCisJeworCQliZlRQID0gbmV3IFRyYWNlUG9pbnQoCisJCQkJRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfVElNRV9OQVRVUkUsCisJCQkJQVZNX09QQ09ERV9USU1FRF9HVUFSRCwgTlVMTCwKKwkJCQlhVmFyVGltZS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSwKKwkJCQlFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0ludGVnZXIoZHVyYXRpb24pICk7CisKKwkJYVRyYWNlRWxlbWVudC5wb2ludHMuYXBwZW5kKCBiZlRQICk7CisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKK2Jvb2wgQmFzaWNUcmFjZVBhcnNlcjo6cGFyc2VCYXNpY1hsaWFUcmFjZVNpZ25hbCgKKwkJVHJhY2VTZXF1ZW5jZSAmIGFUcmFjZUVsZW1lbnQsIGNvbnN0IHN0ZDo6c3RyaW5nICYgaW5MaW5lKQoreworCWJmVFAgPSBhVHJhY2VQb2ludCA9IG5ldyBUcmFjZVBvaW50KEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX0NPTV9OQVRVUkUpOworCisJTW9kaWZpZXI6OkRJUkVDVElPTl9LSU5EIGlvRGlyZWN0aW9uOworCisJLy9zdGQ6OnN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IGluTGluZS5maW5kKCc/Jyk7CisJc3RkOjpzdHJpbmcgbWVzc2FnZTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCUFWTV9PU19MT0cgPDwgIlBBUlNFUiA6IHRoZSBtZXNzYWdlIHRyYWNlIGlzID4+IiA8PCBpbkxpbmUgPDwgIjw8IgorCQkJPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCisJaWYoICBSRUdFWF9TVEFSVFMoaW5MaW5lLCAiKGlucHV0fElOUFVUKSIpICkKKwl7CisJCWlvRGlyZWN0aW9uID0gTW9kaWZpZXI6OkRJUkVDVElPTl9JTlBVVF9LSU5EOworCQltZXNzYWdlID0gaW5MaW5lLnN1YnN0cig2KTsKKwl9CisJZWxzZSBpZiggIFJFR0VYX1NUQVJUUyhpbkxpbmUsICIob3V0cHV0fE9VVFBVVCkiKSApCisJeworCQlpb0RpcmVjdGlvbiA9IE1vZGlmaWVyOjpESVJFQ1RJT05fT1VUUFVUX0tJTkQ7CisJCW1lc3NhZ2UgPSBpbkxpbmUuc3Vic3RyKDcpOworCX0KKworCW1lc3NhZ2UgPSBTdHJpbmdUb29sczo6dHJpbShtZXNzYWdlKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCUFWTV9PU19MT0cgPDwgIlBBUlNFUiA6IHRoZSBtZXNzYWdlIGlzID4+IiA8PCBtZXNzYWdlIDw8ICI8PCIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCisJc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSBtZXNzYWdlLmZpbmQoJygnKTsKKwlpZiggcG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKwl7CisJCUV4ZWN1dGFibGVRdWVyeSBYUXVlcnkoIG1Db25maWd1cmF0aW9uICk7CisKKwkJY29uc3QgU3ltYm9sICYgZm91bmRTaWduYWwgPQorCQkJCVhRdWVyeS5nZXRQb3J0QnlRdWFsaWZpZWROYW1lSUQoCisJCQkJCQltZXNzYWdlLnN1YnN0cigwLCBwb3MpLCBpb0RpcmVjdGlvbiwgZmFsc2UgKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCUFWTV9PU19MT0cgPDwgIlBBUlNFUiA6IHRoZSBwb3J0IGlzID4+IiA8PCBtZXNzYWdlLnN1YnN0cigwLCBwb3MpIDw8ICI8PCIKKwkJCTw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgUFJPQ0VTU09SICkKKworCQlpZiggZm91bmRTaWduYWwudmFsaWQoKSApCisJCXsKKwkJCUluc3RhbmNlT2ZQb3J0KiBwb3J0ID0gZm91bmRTaWduYWwucmF3UG9ydCgpOworCQkJYVRyYWNlUG9pbnQtPm9iamVjdCA9IHBvcnQ7CisKKworCQkJaWYoIGlvRGlyZWN0aW9uID09IE1vZGlmaWVyOjpESVJFQ1RJT05fSU5QVVRfS0lORCApCisJCQl7CisJCQkJaWYoIHBvcnQtPmhhc0lucHV0Um91dGluZ0RhdGEoKSAmJgorCQkJCQlwb3J0LT5nZXRJbnB1dFJvdXRpbmdEYXRhKCkuaXNQcm90b2NvbEVOVigpICkKKwkJCQl7CisJCQkJCWFUcmFjZVBvaW50LT5vcCA9IEFWTV9PUENPREVfSU5QVVRfRU5WOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlhVHJhY2VQb2ludC0+b3AgPSBBVk1fT1BDT0RFX0lOUFVUOworCQkJCX0KKworCQkJfQorCQkJZWxzZSBpZiggaW9EaXJlY3Rpb24gPT0gTW9kaWZpZXI6OkRJUkVDVElPTl9PVVRQVVRfS0lORCApCisJCQl7CisJCQkJaWYoIHBvcnQtPmhhc091dHB1dFJvdXRpbmdEYXRhKCkgJiYKKwkJCQkJcG9ydC0+Z2V0T3V0cHV0Um91dGluZ0RhdGEoKS5pc1Byb3RvY29sRU5WKCkgKQorCQkJCXsKKwkJCQkJYVRyYWNlUG9pbnQtPm9wID0gQVZNX09QQ09ERV9PVVRQVVRfRU5WOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlhVHJhY2VQb2ludC0+b3AgPSBBVk1fT1BDT0RFX09VVFBVVDsKKwkJCQl9CisKKwkJCX0KKworCQkJLy9UT0RPIDogY2hlY2sgd2hhdCBoYXBwZW5zIGlmIHRoZXJlIGlzIG5vIHBhcmFtZXRlciBnaXZlbiAoKQorCisJCQlpZiggcGFyc2VCYXNpY1RyYWNlU2lnbmFsUGFyYW1ldGVycyhhVHJhY2VQb2ludCwgcG9ydCwKKwkJCQkJbWVzc2FnZS5zdWJzdHIocG9zICsgMSwgbWVzc2FnZS5zaXplKCktcG9zLTIpKSApCisJCQl7CisJCQkJYVRyYWNlRWxlbWVudC5wb2ludHMuYXBwZW5kKCBiZlRQICk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfTE9HIDw8ICJQQVJTRVIgOiBhbmQgaXRzIHBhcmFtZXRlcnMgYXJlID4+IgorCQkJPDwgbWVzc2FnZS5zdWJzdHIocG9zICsgMSwgbWVzc2FnZS5zaXplKCktcG9zLTIpIDw8ICI8PCIKKwkJCTw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgUFJPQ0VTU09SICkKKworCQkJCXJldHVybiggdHJ1ZSApOworCQkJfQorCQl9CisJfQorCisJZWxzZQorCXsKKwkJYVRyYWNlUG9pbnQtPnZhbHVlID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdTdHJpbmcoaW5MaW5lKTsKKworCQlhVHJhY2VFbGVtZW50LnBvaW50cy5hcHBlbmQoIGJmVFAgKTsKKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKworCitib29sIEJhc2ljVHJhY2VQYXJzZXI6OnBhcnNlQmFzaWNUcmFjZShUcmFjZVNlcXVlbmNlICYgYVRyYWNlRWxlbWVudCwKKwkJc3RkOjppZnN0cmVhbSAmIGluRmlsZSwgY29uc3QgQkYgJiBhVmFyVGltZSkKK3sKKwlib29sIGlzT0sgPSB0cnVlOworCisJCS8vZm9yIGRlYnVnIHB1cnBvc2VzCisJYm9vbCBpc09LTGluZSA9IHRydWU7CisJaW50IGNwdExpbmUgPSAwOworCisJYmZWYXJUaW1lID0gYVZhclRpbWU7CisKKwlzdGQ6OnN0cmluZyBpbkxpbmU7CisKKwl3aGlsZSggaW5GaWxlLmdvb2QoKSApCisJeworCQljcHRMaW5lICsrOworCisJCXN0ZDo6Z2V0bGluZShpbkZpbGUsIGluTGluZSk7CisKKwkJU3RyaW5nVG9vbHM6Omx0cmltKCBpbkxpbmUgKTsKKworCQlpZiggKGluTGluZSA9PSAiXFxuIikgfHwgaW5MaW5lLmVtcHR5KCkgKQorCQl7CisJCQkvLyAhIU5PVEhJTkc6IFNLSVAgTkVXTElORQorCQkJaXNPS0xpbmUgPSB0cnVlOworCQl9CisJCWVsc2UgaWYoKGluTGluZVswXSkgPT0gJyMnKQorCQl7CisJCQkvLyBDT01NRU5UCisJCQlpc09LTGluZSA9IHRydWU7CisJCX0KKwkJZWxzZSBpZiggc3RkOjppc2RpZ2l0KGluTGluZVswXSkgKQorCQl7CisJCQlpc09LTGluZSA9IHBhcnNlQmFzaWNUcmFjZUR1cmF0aW9uKGFUcmFjZUVsZW1lbnQsIGluTGluZSwgYVZhclRpbWUpOworCQl9CisJCWVsc2UgaWYoIHN0ZDo6aXNhbHBoYShpbkxpbmVbMF0pICkKKwkJeworCQkJaXNPS0xpbmUgPSBwYXJzZUJhc2ljVHJhY2VTaWduYWwoYVRyYWNlRWxlbWVudCwgaW5MaW5lKTsKKwkJfQorCisJCWVsc2UgaWYoKGluTGluZVswXSkgPT0gJ3snKQorCQl7CisJCQlpc09LTGluZSA9IHBhcnNlQmFzaWNUcmFjZVN0cnVjdHVyZShhVHJhY2VFbGVtZW50LCBpbkxpbmUpOworCQl9CisKKwkJaXNPSyA9IGlzT0tMaW5lICYmIGlzT0s7CisKKwkJaWYobm90IGlzT0tMaW5lKQorCQl7CisJCQlBVk1fT1NfV0FSTiA8PCAiRXJyb3I6IEVycm9yIHdoaWxlIHJlYWRpbmcgdHJhY2UgZmlsZSBvbiBsaW5lICIKKwkJCQkJPDwgY3B0TGluZSA8PCBzdGQ6OmVuZGw7CisJCX0KKworCX0KKworCXJldHVybiggaXNPSyApOworfQorCisKKworYm9vbCBCYXNpY1RyYWNlUGFyc2VyOjpwYXJzZUJhc2ljVHJhY2VEdXJhdGlvbihUcmFjZVNlcXVlbmNlICYgYVRyYWNlRWxlbWVudCwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBpbkxpbmUsIGNvbnN0IEJGICYgYVZhclRpbWUpCit7CisJYXZtX2ludGVnZXJfdCBkdXJhdGlvbjsKKwlpZiggZnJvbV9zdHJpbmcoaW5MaW5lLCBkdXJhdGlvbiwgc3RkOjpkZWMpICkKKwl7CisJCWJmVFAgPSBuZXcgVHJhY2VQb2ludCgKKwkJCQlFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9USU1FX05BVFVSRSwKKwkJCQlBVk1fT1BDT0RFX1RJTUVEX0dVQVJELCBOVUxMLAorCQkJCWFWYXJUaW1lLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpLAorCQkJCUV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3SW50ZWdlcihkdXJhdGlvbikgKTsKKworCQlhVHJhY2VFbGVtZW50LnBvaW50cy5hcHBlbmQoIGJmVFAgKTsKKworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKK2Jvb2wgQmFzaWNUcmFjZVBhcnNlcjo6cGFyc2VCYXNpY1RyYWNlU2lnbmFsKAorCQlUcmFjZVNlcXVlbmNlICYgYVRyYWNlRWxlbWVudCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBpbkxpbmUpCit7CisJYmZUUCA9IGFUcmFjZVBvaW50ID0gbmV3IFRyYWNlUG9pbnQoRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfQ09NX05BVFVSRSk7CisKKwlNb2RpZmllcjo6RElSRUNUSU9OX0tJTkQgaW9fZGlyOworCisJc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSBpbkxpbmUuZmluZCgnPycpOworCWlmKCBwb3MgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorCXsKKwkJaW9fZGlyID0gTW9kaWZpZXI6OkRJUkVDVElPTl9JTlBVVF9LSU5EOworCQlhVHJhY2VQb2ludC0+b3AgPSBBVk1fT1BDT0RFX0lOUFVUOworCX0KKwllbHNlIGlmKCAocG9zID0gaW5MaW5lLmZpbmQoJyEnKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorCXsKKwkJaW9fZGlyID0gTW9kaWZpZXI6OkRJUkVDVElPTl9PVVRQVVRfS0lORDsKKwkJYVRyYWNlUG9pbnQtPm9wID0gQVZNX09QQ09ERV9PVVRQVVQ7CisJfQorCisJaWYoIHBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisJeworCQlFeGVjdXRhYmxlUXVlcnkgWFF1ZXJ5KCBtQ29uZmlndXJhdGlvbiApOworCisJCWNvbnN0IFN5bWJvbCAmIGZvdW5kU2lnbmFsID0KKwkJCQlYUXVlcnkuZ2V0UG9ydEJ5UXVhbGlmaWVkTmFtZUlEKAorCQkJCQkJaW5MaW5lLnN1YnN0cigwLCBwb3MpLCBpb19kaXIsIGZhbHNlICk7CisKKwkJaWYoIGZvdW5kU2lnbmFsLnZhbGlkKCkgKQorCQl7CisJCQlJbnN0YW5jZU9mUG9ydCogcG9ydCA9IGZvdW5kU2lnbmFsLnJhd1BvcnQoKTsKKwkJCWFUcmFjZVBvaW50LT5vYmplY3QgPSBwb3J0OworCisJCQlpZiggcGFyc2VCYXNpY1RyYWNlU2lnbmFsUGFyYW1ldGVycygKKwkJCQkJYVRyYWNlUG9pbnQsIHBvcnQsICBpbkxpbmUuc3Vic3RyKHBvcyArIDEpKSkKKwkJCXsKKwkJCQlhVHJhY2VFbGVtZW50LnBvaW50cy5hcHBlbmQoIGJmVFAgKTsKKworCQkJCXJldHVybiggdHJ1ZSApOworCQkJfQorCQl9CisJfQorCisJZWxzZQorCXsKKwkJYVRyYWNlUG9pbnQtPnZhbHVlID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdTdHJpbmcoaW5MaW5lKTsKKworCQlhVHJhY2VFbGVtZW50LnBvaW50cy5hcHBlbmQoIGJmVFAgKTsKKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKy8qCisgKiBUaGlzIG1ldGhvZCB0YWtlcyBhbiBpbnB1dHM6CisgKiBhIHRyYWNlIHBvaW50LCBhIHBvcnQgYW5kIGEgc3RyaW5nIGV4cHJlc3Npb24KKyAqCisgKi8KK2Jvb2wgQmFzaWNUcmFjZVBhcnNlcjo6cGFyc2VCYXNpY1RyYWNlU2lnbmFsUGFyYW1ldGVycygKKwkJVHJhY2VQb2ludCAqIGFUcmFjZVBvaW50LCBJbnN0YW5jZU9mUG9ydCogcG9ydCwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhbkV4cHIpCit7CisJc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBwb3M7CisJYXZtX3NpemVfdCBuYlBhcmFtcyA9IHBvcnQtPmdldFBhcmFtZXRlckNvdW50KCk7CisJYXZtX3NpemVfdCBjb3VudCA9IDA7CisJLy90aGlzIHZhcmlhYmxlcyBpcyB1c2VkIHRvIGNvdW50IHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyBnaXZlbiBpbiB0aGUgdHJhY2UKKwlzdGQ6OnN0cmluZyBjdXJyZW50RXhwciA9IGFuRXhwcjsKKworCS8vVE9ETzogZG8gdGhlIHZlcmlmaWNhdGlvbiBvbiB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgd2hpbGUgcGFyc2luZworCS8vIGUuZy4gY3JlYXRlIGFuIGFycmF5IHdpdGggdGhlIHBhcmFtZXRlciB2YWx1ZXMKKwl3aGlsZSAoKHBvcyA9IGN1cnJlbnRFeHByLmZpbmQoJywnKSApIT0gc3RkOjpzdHJpbmc6Om5wb3MpCisJeworCQljdXJyZW50RXhwciA9IGN1cnJlbnRFeHByLnN1YnN0cihwb3MrMSk7CisJCWNvdW50Kys7CisJfQorCisJU3RyaW5nVG9vbHM6OnRyaW0oY3VycmVudEV4cHIpOworCWlmKCBjdXJyZW50RXhwci5jb21wYXJlKCIiKSAhPSAwICkKKwl7CisJCWNvdW50Kys7CisJfQorCisJaWYoIGNvdW50ICE9IHBvcnQtPmdldFBhcmFtZXRlckNvdW50KCkgKQorCXsKKwkJLy8gaWYgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIGdpdmVuIGluIHRoZSB0cmFjZSBkb2VzCisJCS8vIG5vdCBtYXRjaCAgdGhlIGRlY2xhcmF0aW9uIGluIHRoZSBmaWxlIHNwZWNpZmljYXRpb24KK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQUk9DRVNTT1IgKQorCUFWTV9PU19MT0cgPDwgIlBBUlNFUiBXQVJOSU5HIDogdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIGV4cGVjdGVkICIKKwkJCSJpcyAiIDw8IG5iUGFyYW1zIDw8ICIgd2hpbGUgdGhlIGFjdHVhbCBudW1iZXIgb2YgcGFyYW1ldGVycyAiCisJCQkiZ2l2ZW4gaW4gdGhlIHRyYWNlIGlzICIgPDwgY291bnQgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBST0NFU1NPUiApCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlpZiAobmJQYXJhbXMgIT0gMCkKKwl7CisJCWFUcmFjZVBvaW50LT5uZXdBcnJheVZhbHVlKG5iUGFyYW1zKTsKKwkJc3RkOjpzdHJpbmcgIHBhcmFtOworCQljdXJyZW50RXhwciA9IGFuRXhwcjsKKwkJaW50IGkgPSAwOworCQlib29sIGNvcnJlY3QgPSB0cnVlOworCQkvL3RoZSBjb3JyZWN0IG51bWJlciBvZiBwYXJhbWV0ZXJzIGhhcyBhbHJlYWR5IGJlZW4gYXNjZXJ0YWluZWQKKwkJd2hpbGUgKCgocG9zID0gY3VycmVudEV4cHIuZmluZCgnLCcpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgJiYgY29ycmVjdCkKKwkJeworCQkJLy8gcmV0cmlldmluZyBwYXJhbWV0ZXIgZnJvbSB0aGUgc3RyaW5nCisJCQlwYXJhbSA9IGN1cnJlbnRFeHByLnN1YnN0cigwLCBwb3MpOworCQkJQkYgcGFyYW1CRiA9IHBhcnNlQmFzaWNUcmFjZVNpZ25hbFBhcmFtZXRlcigKKwkJCQkJKCogKHBvcnQtPmdldFBhcmFtZXRlclR5cGUoaSkpKSwgcGFyYW0pOworCisJCQlpZihwYXJhbUJGID09IE5VTEwpCisJCQl7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWFUcmFjZVBvaW50LT52YWwoaSwgcGFyYW1CRik7CisJCQkJaSsrOworCQkJCWN1cnJlbnRFeHByID0gY3VycmVudEV4cHIuc3Vic3RyKHBvcysxKTsKKwkJCX0KKwkJfQorCQlwYXJhbSA9IFN0cmluZ1Rvb2xzOjp0cmltKGN1cnJlbnRFeHByKTsKKwkJQkYgcGFyYW1CRiA9IHBhcnNlQmFzaWNUcmFjZVNpZ25hbFBhcmFtZXRlcigqIHBvcnQtPmdldFBhcmFtZXRlclR5cGUoaSksIHBhcmFtKTsKKwkJLy9CRiBwYXJhbUJGID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdFeHByKCogcG9ydC0+Z2V0UGFyYW1ldGVyVHlwZShpKSwgcGFyYW0pOworCQlpZihwYXJhbUJGID09IE5VTEwpCisJCXsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWFUcmFjZVBvaW50LT52YWwoaSwgcGFyYW1CRik7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIGFuRXhwciBpcyB0aGUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcGFyYW1ldGVyIHRvIGJlIHBhcnNlZAorICogYVR5cGVTcGVjaWZpZXIgaXMgdGhlIHR5cGUgb2YgdGhlIHBhcmFtZXRlcgorICogcmV0dXJucyBhIEJGIHJlcHJlc2VudGluZyB0aGUgcGFyYW1ldGVyCisgKi8KK0JGIEJhc2ljVHJhY2VQYXJzZXI6OnBhcnNlQmFzaWNUcmFjZVNpZ25hbFBhcmFtZXRlcigKKwkJY29uc3QgSVR5cGVTcGVjaWZpZXIgJiBhVHlwZVNwZWNpZmllciwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhbkV4cHIpCit7CisJc3RkOjpzdHJpbmcgcGFyYW0gPSBhbkV4cHI7CisJU3RyaW5nVG9vbHM6OnRyaW0ocGFyYW0pOworCisJQkYgcGFyYW1CRjsKKworLy9BVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFBST0NFU1NPUiApCisvLwlBVk1fT1NfTE9HIDw8ICJQQVJTRVI6IHBhcmFtZXRlciB0eXBlOiAiOworLy8gICAgYVR5cGVTcGVjaWZpZXIudG9TdHJlYW0oQVZNX09TX0xPRyk7CisvLwlBVk1fT1NfTE9HIDw8IHN0ZDo6ZW5kbDsKKy8vQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCisJLy8gUmVtb3ZpbmcgZW5jb21wYXNzaW5nIHF1b3RlcyBpbiBzdHJpbmdzIGJlZm9yZSBidWlsZGluZworCWlmKCBhVHlwZVNwZWNpZmllci5pc1R5cGVkU3RyaW5nKCkKKwkJJiYgKG5vdCBwYXJhbS5lbXB0eSgpKSAmJiAocGFyYW1bMF0gPT0gJyInKSApCisJeworCQlwYXJhbSA9IHBhcmFtLnN1YnN0cigxLCBwYXJhbS5zaXplKCkgLSAyKTsKKworCQlwYXJhbUJGID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdTdHJpbmcocGFyYW0pOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFBST0NFU1NPUiApCisJQVZNX09TX0xPRyA8PCAiUEFSU0VSOiByZWFkaW5nIGEgc3RyaW5nOiAiIDw8IHBhcmFtIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgUFJPQ0VTU09SICkKKwl9CisKKwllbHNlIGlmKCBhVHlwZVNwZWNpZmllci5pc1R5cGVkQ2hhcmFjdGVyKCkgJiYgKG5vdCBwYXJhbS5lbXB0eSgpKSApCisJeworCQlpZiggcGFyYW0uc2l6ZSgpID09IDEgKQorCQl7CisJCQlwYXJhbUJGID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDaGFyKHBhcmFtWzBdKTsKKwkJfQorCQllbHNlIGlmKCBwYXJhbVswXSA9PSAnXCcnICkKKwkJeworCQkJcGFyYW1CRiA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q2hhcihwYXJhbVsxXSk7CisJCX0KKwkJZWxzZSAvLyBFUlJPUiAhISEKKwkJeworCQkJcGFyYW1CRiA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q2hhcihwYXJhbVswXSk7CisJCX0KKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCUFWTV9PU19MT0cgPDwgIlBBUlNFUjogcmVhZGluZyBhIHN0cmluZzogIiA8PCBwYXJhbSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFBST0NFU1NPUiApCisJfQorCS8vIG1hY2hpbmVzIGFzIHBhcmFtZXRlcnMgY29udGFpbiBydW4gYW5kIHBpZCBpbmZvcm1hdGlvbiwKKwkvLyB3ZSBtdXN0IHJlbW92ZSB0aGVtIChubyBjb25maWd1cmF0aW9uIHlldCkKKwllbHNlIGlmKCBhVHlwZVNwZWNpZmllci5pc1R5cGVkTWFjaGluZSgpICkKKwl7CisJCWlmKCBTdHJpbmdUb29sczo6c3RhcnRzV2l0aChwYXJhbSwgInJ1bjo6IikgKQorCQl7CisJCQlzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIHBhcmFtcG9zID0gcGFyYW0uZmluZCgnOicsIDUpOworCQkJaWYoIHBhcmFtcG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKwkJCXsKKwkJCQlwYXJhbSA9IHBhcmFtLnN1YnN0cihwYXJhbXBvcysxKTsKKwkJCX0KKworCQkJcGFyYW1CRiA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3RXhwclJ1bnRpbmUobUNvbmZpZ3VyYXRpb24sIHBhcmFtKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBhcmFtQkYgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0V4cHJNYWNoaW5lKG1Db25maWd1cmF0aW9uLCBwYXJhbSk7CisJCX0KKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCUFWTV9PU19MT0cgPDwgIlBBUlNFUjogcmVhZGluZyBhIG1hY2hpbmU6ICIgPDwgcGFyYW0gPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCX0KKworCWVsc2UKKwl7CisJCXBhcmFtQkYgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0V4cHIoCisJCQkJbUNvbmZpZ3VyYXRpb24sIGFUeXBlU3BlY2lmaWVyLCBwYXJhbSk7CisJfQorCisJaWYoIHBhcmFtQkYuaW52YWxpZCgpICkKKwl7CisJCUFWTV9PU19XQVJOIDw8ICJQQVJTRVI6IGZhaWxlZCB0byBidWlsZCBCRiBmcm9tIHBhcmFtZXRlcjogIgorCQkJCTw8IHBhcmFtIDw8IHN0ZDo6ZW5kbDsKKwl9CisJZWxzZQorCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgUFJPQ0VTU09SICkKKwlBVk1fT1NfTE9HIDw8ICJQQVJTRVI6IHBhcmFtZXRlciB2YWx1ZSByZWFkOiAiIDw8IHBhcmFtQkYgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQUk9DRVNTT1IgKQorCX0KKworCXJldHVybiBwYXJhbUJGOworfQorCisKK2Jvb2wgQmFzaWNUcmFjZVBhcnNlcjo6cGFyc2VCYXNpY1RyYWNlU3RydWN0dXJlKAorCQlUcmFjZVNlcXVlbmNlICYgYVRyYWNlRWxlbWVudCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBpbkxpbmUpCit7CisJcmV0dXJuKCBmYWxzZSApOworfQorCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3RyYWNlL0Jhc2ljVHJhY2VQYXJzZXIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90cmFjZS9CYXNpY1RyYWNlUGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU3ZTg4MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90cmFjZS9CYXNpY1RyYWNlUGFyc2VyLmgKQEAgLTAsMCArMSwxMTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiA0IGbDqXZyLiAyMDE1CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQkFTSUNUUkFDRVBBUlNFUl9IXworI2RlZmluZSBCQVNJQ1RSQUNFUEFSU0VSX0hfCisKKyNpbmNsdWRlIDx1dGlsL2F2bV9zdHJpbmcuaD4KKyNpbmNsdWRlIDxjb21tb24vQkYuaD4KKworI2luY2x1ZGUgPGZzdHJlYW0+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIENvbmZpZ3VyYXRpb247CitjbGFzcyBJVHlwZVNwZWNpZmllcjsKK2NsYXNzIEluc3RhbmNlT2ZQb3J0OworY2xhc3MgVHJhY2VQb2ludDsKK2NsYXNzIFRyYWNlU2VxdWVuY2U7CisKKworY2xhc3MgQmFzaWNUcmFjZVBhcnNlcgoreworCisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBBVFRSSUJVVEUKKwkgKi8KKwljb25zdCBDb25maWd1cmF0aW9uICYgbUNvbmZpZ3VyYXRpb247CisKKwlCRiBiZlZhclRpbWU7CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQ29tcHV0aW5nIFZhcmlhYmxlcworCUJGICBiZlRQOworCVRyYWNlUG9pbnQgKiBhVHJhY2VQb2ludDsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQmFzaWNUcmFjZVBhcnNlcihjb25zdCBDb25maWd1cmF0aW9uICYgYUNvbmZpZ3VyYXRpb24pCisJOiBtQ29uZmlndXJhdGlvbiggYUNvbmZpZ3VyYXRpb24gKSwKKwliZlZhclRpbWUoICksCisJYmZUUCggKSwKKwlhVHJhY2VQb2ludCggTlVMTCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5CYXNpY1RyYWNlUGFyc2VyKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIEJBU0lDIFBBUlNFUiBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlib29sIHBhcnNlQmFzaWNUcmFjZShUcmFjZVNlcXVlbmNlICYgYVRyYWNlRWxlbWVudCwKKwkJCXN0ZDo6aWZzdHJlYW0gJiBpbkZpbGUsIGNvbnN0IEJGICYgYVZhclRpbWUpOworCisJYm9vbCBwYXJzZUJhc2ljVHJhY2VEdXJhdGlvbihUcmFjZVNlcXVlbmNlICYgYVRyYWNlRWxlbWVudCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgaW5MaW5lLCBjb25zdCBCRiAmIGFWYXJUaW1lKTsKKworCWJvb2wgcGFyc2VCYXNpY1RyYWNlU2lnbmFsKAorCQkJVHJhY2VTZXF1ZW5jZSAmIGFUcmFjZUVsZW1lbnQsIGNvbnN0IHN0ZDo6c3RyaW5nICYgaW5MaW5lKTsKKworCWJvb2wgcGFyc2VCYXNpY1RyYWNlU3RydWN0dXJlKAorCQkJVHJhY2VTZXF1ZW5jZSAmIGFUcmFjZUVsZW1lbnQsIGNvbnN0IHN0ZDo6c3RyaW5nICYgaW5MaW5lKTsKKworCWJvb2wgcGFyc2VCYXNpY1RyYWNlU2lnbmFsUGFyYW1ldGVycyhUcmFjZVBvaW50ICogYVRyYWNlUG9pbnQsCisJCQlJbnN0YW5jZU9mUG9ydCAqIHBvcnQsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYW5FeHByKTsKKworCUJGIHBhcnNlQmFzaWNUcmFjZVNpZ25hbFBhcmFtZXRlcihjb25zdCBJVHlwZVNwZWNpZmllciAmIGFUeXBlU3BlY2lmaWVyLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhbkV4cHIpOworCisvLyBUT0RPIDogdGVtcG9yYXJ5LCB0aGUgZm9ybWF0IHNob3VsZCBiZSBkZWZpbmVkIHByb3Blcmx5IG9yIGZpeGVkCisJYm9vbCBwYXJzZUJhc2ljWGxpYVRyYWNlKFRyYWNlU2VxdWVuY2UgJiBhVHJhY2VFbGVtZW50LAorCQkJc3RkOjppZnN0cmVhbSAmIGluRmlsZSwgY29uc3QgQkYgJiBhVmFyVGltZSk7CisKKwlib29sIHBhcnNlQmFzaWNYbGlhVHJhY2VEdXJhdGlvbihUcmFjZVNlcXVlbmNlICYgYVRyYWNlRWxlbWVudCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgaW5MaW5lLCBjb25zdCBCRiAmIGFWYXJUaW1lKTsKKworCWJvb2wgcGFyc2VCYXNpY1hsaWFUcmFjZVNpZ25hbCgKKwkJCVRyYWNlU2VxdWVuY2UgJiBhVHJhY2VFbGVtZW50LCBjb25zdCBzdGQ6OnN0cmluZyAmIGluTGluZSk7Cit9OworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworCisjZW5kaWYgLyogQkFTSUNUUkFDRVBBUlNFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3RyYWNlL1RyYWNlQ2hlY2tlci5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvdHJhY2UvVHJhY2VDaGVja2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzNiOGIwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3RyYWNlL1RyYWNlQ2hlY2tlci5jcHAKQEAgLTAsMCArMSwxMjg1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjcgbm92LiAyMDE0CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJUcmFjZUNoZWNrZXIuaCIKKworI2luY2x1ZGUgPGNvbXB1dGVyL0V2YWx1YXRpb25FbnZpcm9ubWVudC5oPgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQXZtQ29kZS5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0J1aWx0aW5BcnJheS5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25Db25zdHJ1Y3RvckltcGwuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkNvbmZpZ3VyYXRpb24uaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25Db250ZXh0Lmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uRGF0YS5oPgorI2luY2x1ZGUgPGZtbC90cmFjZS9UcmFjZVBvaW50Lmg+CisKKyNpbmNsdWRlIDxzb2x2ZXIvYXBpL1NvbHZlckZhY3RvcnkuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoqCisgKiBURVNUCisgKiBUcmFjZVBvaW50IE5hdHVyZQorICovCitib29sIFRyYWNlQ2hlY2tlcjo6aXNQb2ludE5hdHVyZShjb25zdCBCRiAmIGFyZywKKwkJRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTkFUVVJFIG5hdHVyZSkgY29uc3QKK3sKKwlpZiggYXJnLmlzPCBUcmFjZVBvaW50ID4oKSApCisJeworCQlyZXR1cm4oIGFyZy50b19wdHI8IFRyYWNlUG9pbnQgPigpLT5uYXR1cmUgPT0gbmF0dXJlICk7CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTQVQgQ0hFQ0tJTkcgQVBJCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIFRyYWNlQ2hlY2tlcjo6aXNTYXQoY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMsIGNvbnN0IEJGICYgYXJnKQoreworCWlmKCBhcmcuaXM8IFRyYWNlUG9pbnQgPigpICkKKwl7CisJCWlmKCBpc1NhdChhbkVDLCBhcmcudG9fcHRyPCBUcmFjZVBvaW50ID4oKSkgKQorCQl7CisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCX0KKwllbHNlIGlmKCBhcmcuaXM8IEF2bUNvZGUgPigpICkKKwl7CisJCXJldHVybiggaXNTYXQoYW5FQywgYXJnLnRvX3JlZjwgQXZtQ29kZSA+KCkpICk7CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKK2Jvb2wgVHJhY2VDaGVja2VyOjppc1NhdChjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQywgY29uc3QgQXZtQ29kZSAmIGFDb2RlKQoreworCXN3aXRjaCggYUNvZGUuZ2V0QXZtT3BDb2RlKCkgKQorCXsKKwkJY2FzZSBBVk1fT1BDT0RFX0FORDoKKwkJY2FzZSBBVk1fT1BDT0RFX1NUUk9OR19TWU5DSFJPTk9VUzoKKwkJY2FzZSBBVk1fT1BDT0RFX0FORF9USEVOOgorCQljYXNlIEFWTV9PUENPREVfU0NIRURVTEVfQU5EX1RIRU46CisJCXsKKwkJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYUNvZGUuYmVnaW4oKTsKKwkJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gYUNvZGUuZW5kKCk7CisJCQlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJCXsKKwkJCQlpZiggbm90IGlzU2F0KGFuRUMsICgqaXQpKSApCisJCQkJeworCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9PUjoKKwkJY2FzZSBBVk1fT1BDT0RFX09SX0VMU0U6CisJCWNhc2UgQVZNX09QQ09ERV9TQ0hFRFVMRV9PUl9FTFNFOgorCQljYXNlIEFWTV9PUENPREVfV0VBS19TWU5DSFJPTk9VUzoKKwkJeworCQkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBhQ29kZS5iZWdpbigpOworCQkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBhQ29kZS5lbmQoKTsKKwkJCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCQkJeworCQkJCWlmKCBpc1NhdChhbkVDLCAoKml0KSkgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCB0cnVlICk7CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfWE9SOgorCQljYXNlIEFWTV9PUENPREVfRVhDTFVTSVZFOgorCQl7CisJCQlhdm1fc2l6ZV90IHBhc3NDb3VudCA9IDA7CisKKwkJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYUNvZGUuYmVnaW4oKTsKKwkJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gYUNvZGUuZW5kKCk7CisJCQlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJCXsKKwkJCQlpZiggaXNTYXQoYW5FQywgKCppdCkpICkKKwkJCQl7CisJCQkJCWlmKCArK3Bhc3NDb3VudCA+IDEgKQorCQkJCQl7CisJCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCXJldHVybiggcGFzc0NvdW50ID09IDEgKTsKKwkJfQorCisKKwkJY2FzZSBBVk1fT1BDT0RFX05PVDoKKwkJeworCQkJcmV0dXJuKCBub3QgaXNTYXQoYW5FQywgYUNvZGUuZmlyc3QoKSkgKTsKKwkJfQorCisKKwkJY2FzZSBBVk1fT1BDT0RFX05BTkQ6CisJCXsKKwkJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYUNvZGUuYmVnaW4oKTsKKwkJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gYUNvZGUuZW5kKCk7CisJCQlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJCXsKKwkJCQlpZiggbm90IGlzU2F0KGFuRUMsICgqaXQpKSApCisJCQkJeworCQkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCQl9CisJCQl9CisKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9OT1I6CisJCXsKKwkJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYUNvZGUuYmVnaW4oKTsKKwkJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gYUNvZGUuZW5kKCk7CisJCQlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJCXsKKwkJCQlpZiggaXNTYXQoYW5FQywgKCppdCkpICkKKwkJCQl7CisJCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCQl9CisJCQl9CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisKKwkJY2FzZSBBVk1fT1BDT0RFX1hOT1I6CisJCXsKKwkJCWF2bV9zaXplX3QgcGFzc0NvdW50ID0gMDsKKworCQkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBhQ29kZS5iZWdpbigpOworCQkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBhQ29kZS5lbmQoKTsKKwkJCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCQkJeworCQkJCWlmKCBpc1NhdChhbkVDLCAoKml0KSkgKQorCQkJCXsKKwkJCQkJaWYoICsrcGFzc0NvdW50ID4gMSApCisJCQkJCXsKKwkJCQkJCXJldHVybiggdHJ1ZSApOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4oIHBhc3NDb3VudCAhPSAxICk7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKwl9Cit9CisKKworYm9vbCBUcmFjZUNoZWNrZXI6OmlzU2F0KAorCQljb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQywgQVZNX09QQ09ERSBhbk9wLCBjb25zdCBCRiAmIGFyZykKK3sKKwlzd2l0Y2goIGFuT3AgKQorCXsKKwkJY2FzZSBBVk1fT1BDT0RFX0FORDoKKwkJY2FzZSBBVk1fT1BDT0RFX1NUUk9OR19TWU5DSFJPTk9VUzoKKwkJY2FzZSBBVk1fT1BDT0RFX0FORF9USEVOOgorCQljYXNlIEFWTV9PUENPREVfU0NIRURVTEVfQU5EX1RIRU46CisJCXsKKwkJCUFycmF5QkYgKiBhcmdBcnJheSA9IGFyZy50b19wdHI8IEFycmF5QkYgPigpOworCQkJYXZtX3NpemVfdCBlbmRPZmZzZXQgPSBhcmdBcnJheS0+c2l6ZSgpOworCQkJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDAgOyBvZmZzZXQgPCBlbmRPZmZzZXQgOyArK29mZnNldCApCisJCQl7CisJCQkJaWYoIG5vdCBpc1NhdChhbkVDLCBhcmdBcnJheS0+YXQob2Zmc2V0KSkgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCX0KKwkJCX0KKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfT1I6CisJCWNhc2UgQVZNX09QQ09ERV9PUl9FTFNFOgorCQljYXNlIEFWTV9PUENPREVfU0NIRURVTEVfT1JfRUxTRToKKwkJY2FzZSBBVk1fT1BDT0RFX1dFQUtfU1lOQ0hST05PVVM6CisJCXsKKwkJCUFycmF5QkYgKiBhcmdBcnJheSA9IGFyZy50b19wdHI8IEFycmF5QkYgPigpOworCQkJYXZtX3NpemVfdCBlbmRPZmZzZXQgPSBhcmdBcnJheS0+c2l6ZSgpOworCQkJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDAgOyBvZmZzZXQgPCBlbmRPZmZzZXQgOyArK29mZnNldCApCisJCQl7CisJCQkJaWYoIGlzU2F0KGFuRUMsIGFyZ0FycmF5LT5hdChvZmZzZXQpKSApCisJCQkJeworCQkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCQl9CisJCQl9CisKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9YT1I6CisJCWNhc2UgQVZNX09QQ09ERV9FWENMVVNJVkU6CisJCXsKKwkJCUFycmF5QkYgKiBhcmdBcnJheSA9IGFyZy50b19wdHI8IEFycmF5QkYgPigpOworCQkJYXZtX3NpemVfdCBlbmRPZmZzZXQgPSBhcmdBcnJheS0+c2l6ZSgpOworCQkJYXZtX3NpemVfdCBwYXNzQ291bnQgPSAwOworCisJCQlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMCA7IG9mZnNldCA8IGVuZE9mZnNldCA7ICsrb2Zmc2V0ICkKKwkJCXsKKwkJCQlpZiggaXNTYXQoYW5FQywgYXJnQXJyYXktPmF0KG9mZnNldCkpICkKKwkJCQl7CisJCQkJCWlmKCArK3Bhc3NDb3VudCA+IDEgKQorCQkJCQl7CisJCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCXJldHVybiggcGFzc0NvdW50ID09IDEgKTsKKwkJfQorCisKKwkJY2FzZSBBVk1fT1BDT0RFX05PVDoKKwkJeworCQkJcmV0dXJuKCBub3QgaXNTYXQoYW5FQywgYXJnKSApOworCQl9CisKKworCQljYXNlIEFWTV9PUENPREVfTkFORDoKKwkJeworCQkJQXJyYXlCRiAqIGFyZ0FycmF5ID0gYXJnLnRvX3B0cjwgQXJyYXlCRiA+KCk7CisJCQlhdm1fc2l6ZV90IGVuZE9mZnNldCA9IGFyZ0FycmF5LT5zaXplKCk7CisJCQlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMCA7IG9mZnNldCA8IGVuZE9mZnNldCA7ICsrb2Zmc2V0ICkKKwkJCXsKKwkJCQlpZiggbm90IGlzU2F0KGFuRUMsIGFyZ0FycmF5LT5hdChvZmZzZXQpKSApCisJCQkJeworCQkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCQl9CisJCQl9CisKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9OT1I6CisJCXsKKwkJCUFycmF5QkYgKiBhcmdBcnJheSA9IGFyZy50b19wdHI8IEFycmF5QkYgPigpOworCQkJYXZtX3NpemVfdCBlbmRPZmZzZXQgPSBhcmdBcnJheS0+c2l6ZSgpOworCQkJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDAgOyBvZmZzZXQgPCBlbmRPZmZzZXQgOyArK29mZnNldCApCisJCQl7CisJCQkJaWYoIGlzU2F0KGFuRUMsIGFyZ0FycmF5LT5hdChvZmZzZXQpKSApCisJCQkJeworCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9YTk9SOgorCQl7CisJCQlhdm1fc2l6ZV90IHBhc3NDb3VudCA9IDA7CisKKwkJCUFycmF5QkYgKiBhcmdBcnJheSA9IGFyZy50b19wdHI8IEFycmF5QkYgPigpOworCQkJYXZtX3NpemVfdCBlbmRPZmZzZXQgPSBhcmdBcnJheS0+c2l6ZSgpOworCQkJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDAgOyBvZmZzZXQgPCBlbmRPZmZzZXQgOyArK29mZnNldCApCisJCQl7CisJCQkJaWYoIGlzU2F0KGFuRUMsIGFyZ0FycmF5LT5hdChvZmZzZXQpKSApCisJCQkJeworCQkJCQlpZiggKytwYXNzQ291bnQgPiAxICkKKwkJCQkJeworCQkJCQkJcmV0dXJuKCB0cnVlICk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCXJldHVybiggcGFzc0NvdW50ICE9IDEgKTsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KK30KKworCisKK2Jvb2wgVHJhY2VDaGVja2VyOjppc1NhdChjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQywgVHJhY2VQb2ludCAqIGFUUCkKK3sKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIFBST0NFU1NPUiAsIFNPTFZJTkcgKQorCUFWTV9PU19UUkFDRSA8PCAiaXNTYXQgPyBFQzo+ICIgPDwgYW5FQy5zdHJfbWluKCkgPDwgc3RkOjplbmRsCisJCQk8PCAiRmlyZWQ6PiAiIDw8IGFuRUMuZ2V0UnVubmFibGVFbGVtZW50VHJhY2UoKS5zdHIoKSA8PCBzdGQ6OmVuZGwKKwkJCTw8ICJUcmFjZTo+ICIgPDwgYW5FQy5nZXRJT0VsZW1lbnRUcmFjZSgpLnN0cigpIDw8IHN0ZDo6ZW5kbDsKKwlBVk1fT1NfVFJBQ0UgPDwgIlBvaW50Oj4iIDw8IHN0cl9pbmRlbnQoIGFUUCApIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIFBST0NFU1NPUiAsIFNPTFZJTkcgKQorCisKKwlzd2l0Y2goIGFUUC0+bmF0dXJlICkKKwl7CisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfRk9STVVMQV9OQVRVUkU6CisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfQ09ORElUSU9OX05BVFVSRToKKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9ERUNJU0lPTl9OQVRVUkU6CisKKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9QQVRIX0NPTkRJVElPTl9OQVRVUkU6CisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfUEFUSF9DT05ESVRJT05fTkFUVVJFX0xFQUY6CisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfUEFUSF9USU1FRF9DT05ESVRJT05fTkFUVVJFOgorCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1BBVEhfVElNRURfQ09ORElUSU9OX05BVFVSRV9MRUFGOgorCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTk9ERV9DT05ESVRJT05fTkFUVVJFOgorCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX05PREVfQ09ORElUSU9OX05BVFVSRV9MRUFGOgorCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX05PREVfVElNRURfQ09ORElUSU9OX05BVFVSRToKKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9OT0RFX1RJTUVEX0NPTkRJVElPTl9OQVRVUkVfTEVBRjoKKwkJeworCQkJcmV0dXJuKCBpc1NhdEZvcm11bGEoYW5FQywgYVRQKSApOworCQl9CisKKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9USU1FX05BVFVSRToKKwkJeworCQkJaWYoIGFUUC0+b3AgPT0gQVZNX09QQ09ERV9BU1NJR05fTkVXRlJFU0ggKQorCQkJeworCQkJCXJldHVybiggaXNTYXRDb20oYW5FQywgYVRQLCBhbkVDLmdldElPRWxlbWVudFRyYWNlKCkpICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuKCBpc1NhdFRpbWUoYW5FQywgYVRQKSApOworCQkJfQorCQl9CisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfVkFSSUFCTEVfTkFUVVJFOgorCQl7CisJCQlpZiggYVRQLT5vcCA9PSBBVk1fT1BDT0RFX0FTU0lHTl9ORVdGUkVTSCApCisJCQl7CisJCQkJcmV0dXJuKCBpc1NhdENvbShhbkVDLCBhVFAsIGFuRUMuZ2V0SU9FbGVtZW50VHJhY2UoKSkgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4oIGlzU2F0VmFyaWFibGUoYW5FQywgYVRQKSApOworCQkJfQorCQl9CisKKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9DT01fTkFUVVJFOgorCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1BPUlRfTkFUVVJFOgorCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1NJR05BTF9OQVRVUkU6CisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTUVTU0FHRV9OQVRVUkU6CisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfQ0hBTk5FTF9OQVRVUkU6CisJCXsKKwkJCXJldHVybiggaXNTYXRDb20oYW5FQywgYVRQLCBhbkVDLmdldElPRWxlbWVudFRyYWNlKCkpICk7CisJCX0KKworCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfUlVOTkFCTEVfTkFUVVJFOgorCQl7CisJCQlyZXR1cm4oIGlzU2F0UnVubmFibGUoYW5FQywgYVRQLCBhbkVDLmdldFJ1bm5hYmxlRWxlbWVudFRyYWNlKCkpICk7CisJCX0KKworCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1JPVVRJTkVfTkFUVVJFOgorCQl7CisJCQlyZXR1cm4oIGlzU2F0Um91dGluZShhbkVDLCBhVFAsIGFuRUMuZ2V0UnVubmFibGVFbGVtZW50VHJhY2UoKSkgKTsKKwkJfQorCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfVFJBTlNJVElPTl9OQVRVUkU6CisJCXsKKwkJCXJldHVybiggaXNTYXRUcmFuc2l0aW9uKGFuRUMsIGFUUCwgYW5FQy5nZXRSdW5uYWJsZUVsZW1lbnRUcmFjZSgpKSApOworCQl9CisKKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9TVEFURV9OQVRVUkU6CisJCXsKKwkJCXJldHVybiggaXNTYXRTdGF0ZShhbkVDLCBhVFAsIGFuRUMuZ2V0UnVubmFibGVFbGVtZW50VHJhY2UoKSkgKTsKKwkJfQorCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfU1RBVEVNQUNISU5FX05BVFVSRToKKwkJeworCQkJcmV0dXJuKCBpc1NhdFN0YXRlbWFjaGluZShhbkVDLCBhVFAsIGFuRUMuZ2V0UnVubmFibGVFbGVtZW50VHJhY2UoKSkgKTsKKwkJfQorCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTUFDSElORV9OQVRVUkU6CisJCXsKKwkJCXJldHVybiggaXNTYXRNYWNoaW5lKGFuRUMsIGFUUCwgYW5FQy5nZXRSdW5uYWJsZUVsZW1lbnRUcmFjZSgpKSApOworCQl9CisKKworCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX0NPTVBPU0lURV9OQVRVUkU6CisJCXsKKwkJCXJldHVybiggaXNTYXQoYW5FQywgYVRQLT5vcCwgYVRQLT52YWx1ZSkgKTsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KK30KKworCitib29sIFRyYWNlQ2hlY2tlcjo6aXNTYXRGb3JtdWxhKGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDLCBUcmFjZVBvaW50ICogYVRQKQoreworCWlmKCBFTlYuZXZhbEZvcm11bGEoYW5FQywgdGhlTG9jYWxFeGVjdXRhYmxlRm9ybSwgYVRQLT52YWx1ZSkgKQorCXsKKwkJRU5WLm91dFZBTCA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6YW5kRXhwcigKKwkJCQlhbkVDLnJlZkV4ZWN1dGlvbkRhdGEoKS5nZXRBbGxQYXRoQ29uZGl0aW9uKCksIEVOVi5vdXRWQUwgKTsKKworCQlyZXR1cm4oIFNvbHZlckZhY3Rvcnk6OmlzU3Ryb25nU2F0aXNmaWFibGUodGhlU29sdmVyS2luZCwgRU5WLm91dFZBTCkgKTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KK30KKworCitib29sIFRyYWNlQ2hlY2tlcjo6aXNTYXRUaW1lKGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDLCBUcmFjZVBvaW50ICogYVRQKQoreworCXJldHVybiggdHJ1ZSApOworfQorCitib29sIFRyYWNlQ2hlY2tlcjo6aXNTYXRWYXJpYWJsZShjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQywgVHJhY2VQb2ludCAqIGFUUCkKK3sKKwlpZiggYVRQLT5SSUQuaW52YWxpZCgpICkKKwl7CisJCWFUUC0+dXBkYXRlUklEKCBhbkVDLnJlZkV4ZWN1dGlvbkRhdGEoKSApOworCX0KKworCWlmKCBFTlYuZXZhbChhbkVDLmdldEFQRXhlY3V0aW9uRGF0YSgpLAorCQkJYW5FQy5yZWZFeGVjdXRpb25EYXRhKCkuZ2V0U3lzdGVtUklEKCksIGFUUC0+dmFsdWUpICkKKwl7CisJCWNvbnN0IEJGICYgdmFsdWUgPSAoIGFUUC0+UklELnZhbGlkKCkgKQorCQkJCT8gRU5WLmdldFJ2YWx1ZSggYVRQLT5SSUQsIGFUUC0+b2JqZWN0LT50bzwgSW5zdGFuY2VPZkRhdGEgPigpICkKKwkJCQk6IEVOVi5nZXRSdmFsdWUoIGFUUC0+b2JqZWN0LT50bzwgSW5zdGFuY2VPZkRhdGEgPigpICk7CisKKwkJc3dpdGNoKCBhVFAtPm9wICkKKwkJeworCQkJY2FzZSBBVk1fT1BDT0RFX1NFUToKKwkJCXsKKwkJCQlyZXR1cm4oIEVOVi5vdXRWQUwuc3RyRVEoIHZhbHVlICkgKTsKKwkJCX0KKworCQkJY2FzZSBBVk1fT1BDT0RFX0NIRUNLX1NBVDoKKwkJCXsKKwkJCQlpZiggRU5WLm91dFZBTC5pc0VRKCB2YWx1ZSApICkKKwkJCQl7CisJCQkJCXJldHVybiggdHJ1ZSApOworCQkJCX0KKworCQkJCWlmKCBhVFAtPm9iamVjdC0+dG88IEluc3RhbmNlT2ZEYXRhID4oKS0+aXNUeXBlZEJvb2xlYW4oKSApCisJCQkJeworCQkJCQlpZiggRU5WLm91dFZBTC5pc0VxdWFsVHJ1ZSgpICkKKwkJCQkJeworCQkJCQkJRU5WLm91dFZBTCA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6YW5kRXhwcigKKwkJCQkJCQl2YWx1ZSwKKwkJCQkJCQlhbkVDLnJlZkV4ZWN1dGlvbkRhdGEoKS5nZXRBbGxQYXRoQ29uZGl0aW9uKCkgKTsKKwkJCQkJfQorCQkJCQllbHNlIGlmKCBFTlYub3V0VkFMLmlzRXF1YWxGYWxzZSgpICkKKwkJCQkJeworCQkJCQkJRU5WLm91dFZBTCA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6YW5kRXhwcigKKwkJCQkJCQlFeHByZXNzaW9uQ29uc3RydWN0b3JOYXRpdmU6Om5vdEV4cHIodmFsdWUpLAorCQkJCQkJCWFuRUMucmVmRXhlY3V0aW9uRGF0YSgpLmdldEFsbFBhdGhDb25kaXRpb24oKSApOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJRU5WLm91dFZBTCA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6YW5kRXhwcigKKwkJCQkJCQlFeHByZXNzaW9uQ29uc3RydWN0b3JOYXRpdmU6OmVxRXhwcihFTlYub3V0VkFMLCB2YWx1ZSksCisJCQkJCQkJYW5FQy5yZWZFeGVjdXRpb25EYXRhKCkuZ2V0QWxsUGF0aENvbmRpdGlvbigpICk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJRU5WLm91dFZBTCA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6YW5kRXhwcigKKwkJCQkJCUV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6ZXFFeHByKEVOVi5vdXRWQUwsIHZhbHVlKSwKKwkJCQkJCWFuRUMucmVmRXhlY3V0aW9uRGF0YSgpLmdldEFsbFBhdGhDb25kaXRpb24oKSApOworCQkJCX0KKworCQkJCXJldHVybiggU29sdmVyRmFjdG9yeTo6aXNTdHJvbmdTYXRpc2ZpYWJsZSgKKwkJCQkJCXRoZVNvbHZlcktpbmQsIEVOVi5vdXRWQUwpICk7CisJCQl9CisKKwkJCWNhc2UgQVZNX09QQ09ERV9OT1A6CisJCQljYXNlIEFWTV9PUENPREVfTlVMTDoKKwkJCXsKKwkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCX0KKworCQkJY2FzZSBBVk1fT1BDT0RFX0VROgorCQkJY2FzZSBBVk1fT1BDT0RFX0FTU0lHTjoKKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJcmV0dXJuKCBFTlYub3V0VkFMLmlzRVEoIHZhbHVlICkgKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKworCitib29sIFRyYWNlQ2hlY2tlcjo6aXNTYXRDb20oCisJCWNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDLCBUcmFjZVBvaW50ICogYVRQLCBjb25zdCBCRiAmIGFUcmFjZSkKK3sKKwlpZiggYVRyYWNlLmludmFsaWQoKSApCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCWVsc2UgaWYoIGFUcmFjZS5pczwgRXhlY3V0aW9uQ29uZmlndXJhdGlvbiA+KCkgKQorCXsKKwkJRXhlY3V0aW9uQ29uZmlndXJhdGlvbiAqIGFDb25mID0KKwkJCQlhVHJhY2UudG9fcHRyPCBFeGVjdXRpb25Db25maWd1cmF0aW9uID4oKTsKKworCQlpZiggYUNvbmYtPmdldENvZGUoKS5pczwgQXZtQ29kZSA+KCkgKQorCQl7CisJCQlBdm1Db2RlICogaW9Db2RlID0gYUNvbmYtPmdldENvZGUoKS50b19wdHI8IEF2bUNvZGUgPigpOworCisJCQlpZiggKGFUUC0+b2JqZWN0ID09IE5VTEwpCisJCQkJfHwgKGFUUC0+b2JqZWN0ID09IGlvQ29kZS0+Zmlyc3QoKS5yYXdfcG9pbnRlcigpKSApCisJCQl7CisJCQkJc3dpdGNoKCBhVFAtPm9wICkKKwkJCQl7CisJCQkJCWNhc2UgQVZNX09QQ09ERV9JTlBVVDoKKwkJCQkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUX0VOVjoKKwkJCQkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUX0ZST006CisJCQkJCWNhc2UgQVZNX09QQ09ERV9JTlBVVF9SRFY6CisJCQkJCWNhc2UgQVZNX09QQ09ERV9JTlBVVF9NVUxUSV9SRFY6CisJCQkJCWNhc2UgQVZNX09QQ09ERV9JTlBVVF9CVUZGRVI6CisKKwkJCQkJY2FzZSBBVk1fT1BDT0RFX09VVFBVVDoKKwkJCQkJY2FzZSBBVk1fT1BDT0RFX09VVFBVVF9FTlY6CisJCQkJCWNhc2UgQVZNX09QQ09ERV9PVVRQVVRfVE86CisJCQkJCWNhc2UgQVZNX09QQ09ERV9PVVRQVVRfUkRWOgorCQkJCQljYXNlIEFWTV9PUENPREVfT1VUUFVUX01VTFRJX1JEVjoKKwkJCQkJY2FzZSBBVk1fT1BDT0RFX09VVFBVVF9CVUZGRVI6CisJCQkJCXsKKy8vCQkJCQkJcmV0dXJuKCBpb0NvZGUtPmlzT3BDb2RlKCBhVFAtPm9wICkKKy8vCQkJCQkJCQkmJiAoIChhVFAtPm1hY2hpbmUgPT0gTlVMTCkKKy8vCQkJCQkJCQkJfHwgKG5vdCBhQ29uZi0+aGFzUnVudGltZUlEKCkpCisvLwkJCQkJCQkJCXx8IGFDb25mLT5nZXRSdW50aW1lSUQoKS4KKy8vCQkJCQkJCQkJCQloYXNBc0FuY2VzdG9yKGFUUC0+bWFjaGluZSkgKSApOworCisJCQkJCQlpZiggaW9Db2RlLT5pc09wQ29kZSggYVRQLT5vcCApICkKKwkJCQkJCXsKKwkJCQkJCQlpZiggKGFUUC0+bWFjaGluZSAhPSBOVUxMKQorCQkJCQkJCQkmJiBhQ29uZi0+aGFzUnVudGltZUlEKCkgKQorCQkJCQkJCXsKKwkJCQkJCQkJcmV0dXJuKCBhQ29uZi0+Z2V0UnVudGltZUlEKCkuCisJCQkJCQkJCQkJCWhhc0FzQW5jZXN0b3IoYVRQLT5tYWNoaW5lKSApOworCQkJCQkJCX0KKwkJCQkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCQkJCX0KKwkJCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCQkJfQorCisJCQkJCWNhc2UgQVZNX09QQ09ERV9BU1NJR05fTkVXRlJFU0g6CisJCQkJCXsKKwkJCQkJCXJldHVybiggaW9Db2RlLT5pc09wQ29kZSggYVRQLT5vcCApICk7CisJCQkJCX0KKworCQkJCQljYXNlIEFWTV9PUENPREVfTlVMTDoKKwkJCQkJeworCQkJCQkJcmV0dXJuKCB0cnVlICk7CisJCQkJCX0KKworCQkJCQlkZWZhdWx0OgorCQkJCQl7CisJCQkJCQlyZXR1cm4oIGFUUC0+b3AgPT0gaW9Db2RlLT5nZXRPcHRpbWl6ZWRPcENvZGUoKSApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCWVsc2UgaWYoIGFUcmFjZS5pczwgQXZtQ29kZSA+KCkgKQorCXsKKwkJQXZtQ29kZSAqIGFDb2RlID0gYVRyYWNlLnRvX3B0cjwgQXZtQ29kZSA+KCk7CisKKwkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBhQ29kZS0+YmVnaW4oKTsKKwkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kQ29kZSA9IGFDb2RlLT5lbmQoKTsKKwkJZm9yKCA7IGl0ICE9IGVuZENvZGUgOyArK2l0ICkKKwkJeworCQkJaWYoIGlzU2F0Q29tKGFuRUMsIGFUUCwgKCppdCkpICkKKwkJCXsKKwkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKworCitib29sIFRyYWNlQ2hlY2tlcjo6aXNTYXRSdW5uYWJsZSgKKwkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMsIFRyYWNlUG9pbnQgKiBhVFAsIGNvbnN0IEJGICYgYVRyYWNlKQoreworCWlmKCBhVHJhY2UuaW52YWxpZCgpICkKKwl7CisJCXJldHVybiggZmFsc2UgKTsKKwl9CisJZWxzZSBpZiggYVRyYWNlLmlzPCBFeGVjdXRpb25Db25maWd1cmF0aW9uID4oKSApCisJeworCQlFeGVjdXRpb25Db25maWd1cmF0aW9uICogYUNvbmYgPQorCQkJCWFUcmFjZS50b19wdHI8IEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24gPigpOworCisJCWlmKCBhVFAtPm9iamVjdCAhPSBOVUxMICkKKwkJeworCQkJaWYoIGFDb25mLT5nZXRDb2RlKCkuaXNub3Q8IEF2bVByb2dyYW0gPigpIHx8CisJCQkJKGFDb25mLT5nZXRDb2RlKCkudG9fcHRyPCBBdm1Qcm9ncmFtID4oKSAhPSBhVFAtPm9iamVjdCkgKQorCQkJeworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmKCBhVFAtPm9wICE9IEFWTV9PUENPREVfTlVMTCApCisJCXsKKwkJCWlmKCBhQ29uZi0+Z2V0Q29kZSgpLmlzbm90PCBPcGVyYXRvciA+KCkgfHwKKwkJCQlhQ29uZi0+Z2V0T3BlcmF0b3IoKS0+aXNub3RPcENvZGUoYVRQLT5vcCkgKQorCQkJeworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJfQorCisJCVJ1bnRpbWVJRCBhUklEID0gYUNvbmYtPmdldFJ1bnRpbWVJRCgpOworCQl3aGlsZSggYVJJRC52YWxpZCgpICYmIChhUklELmdldEluc3RhbmNlKCkgIT0gYVRQLT5tYWNoaW5lKSApCisJCXsKKwkJCWFSSUQgPSBhUklELmdldFBSSUQoKTsKKwkJfQorCisJCXJldHVybiggYVJJRC52YWxpZCgpICk7CisJfQorCWVsc2UgaWYoIGFUcmFjZS5pczwgQXZtQ29kZSA+KCkgKQorCXsKKwkJQXZtQ29kZSAqIGFDb2RlID0gYVRyYWNlLnRvX3B0cjwgQXZtQ29kZSA+KCk7CisKKwkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBhQ29kZS0+YmVnaW4oKTsKKwkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kQ29kZSA9IGFDb2RlLT5lbmQoKTsKKwkJZm9yKCA7IGl0ICE9IGVuZENvZGUgOyArK2l0ICkKKwkJeworCQkJaWYoIGlzU2F0TWFjaGluZShhbkVDLCBhVFAsICgqaXQpKSApCisJCQl7CisJCQkJcmV0dXJuKCB0cnVlICk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKworYm9vbCBUcmFjZUNoZWNrZXI6OmlzU2F0Um91dGluZSgKKwkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMsIFRyYWNlUG9pbnQgKiBhVFAsIGNvbnN0IEJGICYgYVRyYWNlKQoreworCWlmKCBhVHJhY2UuaW52YWxpZCgpICkKKwl7CisJCXJldHVybiggZmFsc2UgKTsKKwl9CisJZWxzZSBpZiggYVRyYWNlLmlzPCBFeGVjdXRpb25Db25maWd1cmF0aW9uID4oKSApCisJeworCQlFeGVjdXRpb25Db25maWd1cmF0aW9uICogYUNvbmYgPQorCQkJCWFUcmFjZS50b19wdHI8IEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24gPigpOworCisJCWlmKCBhVFAtPm9iamVjdCAhPSBOVUxMICkKKwkJeworCQkJaWYoIGFDb25mLT5nZXRDb2RlKCkuaXNub3Q8IEF2bVByb2dyYW0gPigpIHx8CisJCQkJKGFDb25mLT5nZXRDb2RlKCkudG9fcHRyPCBBdm1Qcm9ncmFtID4oKSAhPSBhVFAtPm9iamVjdCkgKQorCQkJeworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmKCBhVFAtPm9wICE9IEFWTV9PUENPREVfTlVMTCApCisJCXsKKwkJCWlmKCBhQ29uZi0+Z2V0Q29kZSgpLmlzbm90PCBPcGVyYXRvciA+KCkgfHwKKwkJCQlhQ29uZi0+Z2V0T3BlcmF0b3IoKS0+aXNub3RPcENvZGUoYVRQLT5vcCkgKQorCQkJeworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJfQorCisJCVJ1bnRpbWVJRCBhUklEID0gYUNvbmYtPmdldFJ1bnRpbWVJRCgpOworCQl3aGlsZSggYVJJRC52YWxpZCgpICYmIChhUklELmdldEluc3RhbmNlKCkgIT0gYVRQLT5tYWNoaW5lKSApCisJCXsKKwkJCWFSSUQgPSBhUklELmdldFBSSUQoKTsKKwkJfQorCisJCXJldHVybiggYVJJRC52YWxpZCgpICk7CisJfQorCWVsc2UgaWYoIGFUcmFjZS5pczwgQXZtQ29kZSA+KCkgKQorCXsKKwkJQXZtQ29kZSAqIGFDb2RlID0gYVRyYWNlLnRvX3B0cjwgQXZtQ29kZSA+KCk7CisKKwkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBhQ29kZS0+YmVnaW4oKTsKKwkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kQ29kZSA9IGFDb2RlLT5lbmQoKTsKKwkJZm9yKCA7IGl0ICE9IGVuZENvZGUgOyArK2l0ICkKKwkJeworCQkJaWYoIGlzU2F0TWFjaGluZShhbkVDLCBhVFAsICgqaXQpKSApCisJCQl7CisJCQkJcmV0dXJuKCB0cnVlICk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKworYm9vbCBUcmFjZUNoZWNrZXI6OmlzU2F0VHJhbnNpdGlvbigKKwkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMsIFRyYWNlUG9pbnQgKiBhVFAsIGNvbnN0IEJGICYgYVRyYWNlKQoreworCWlmKCBhVHJhY2UuaW52YWxpZCgpICkKKwl7CisJCXJldHVybiggZmFsc2UgKTsKKwl9CisJZWxzZSBpZiggYVRyYWNlLmlzPCBFeGVjdXRpb25Db25maWd1cmF0aW9uID4oKSApCisJeworCQlFeGVjdXRpb25Db25maWd1cmF0aW9uICogYUNvbmYgPQorCQkJCWFUcmFjZS50b19wdHI8IEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24gPigpOworCisJCWlmKCBhQ29uZi0+Z2V0Q29kZSgpLmlzPCBBdm1UcmFuc2l0aW9uID4oKSApCisJCXsKKwkJCXJldHVybiggYVRQLT5vYmplY3QgPT0gYUNvbmYtPmdldENvZGUoKS50b19wdHI8IEF2bVRyYW5zaXRpb24gPigpICk7CisJCX0KKwl9CisJZWxzZSBpZiggYVRyYWNlLmlzPCBBdm1Db2RlID4oKSApCisJeworCQlBdm1Db2RlICogYUNvZGUgPSBhVHJhY2UudG9fcHRyPCBBdm1Db2RlID4oKTsKKworCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdCA9IGFDb2RlLT5iZWdpbigpOworCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBlbmRDb2RlID0gYUNvZGUtPmVuZCgpOworCQlmb3IoIDsgaXQgIT0gZW5kQ29kZSA7ICsraXQgKQorCQl7CisJCQlpZiggaXNTYXRUcmFuc2l0aW9uKGFuRUMsIGFUUCwgKCppdCkpICkKKwkJCXsKKwkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKworCitib29sIFRyYWNlQ2hlY2tlcjo6aXNTYXRTdGF0ZSgKKwkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMsIFRyYWNlUG9pbnQgKiBhVFAsIGNvbnN0IEJGICYgYVRyYWNlKQoreworCWlmKCBhVFAtPlJJRC5pbnZhbGlkKCkgKQorCXsKKwkJYVRQLT51cGRhdGVSSUQoIGFuRUMucmVmRXhlY3V0aW9uRGF0YSgpICk7CisJfQorCisJaWYoIGFUUC0+UklELnZhbGlkKCkgKQorCXsKKwkJcmV0dXJuKCBhbkVDLnJlZkV4ZWN1dGlvbkRhdGEoKS5pc0lkbGVPclJ1bm5pbmcoYVRQLT5SSUQpICk7CisJfQorCisJcmV0dXJuKCBpc1NhdE1hY2hpbmUoYW5FQywgYVRQLCBhVHJhY2UpICk7Cit9CisKKworYm9vbCBUcmFjZUNoZWNrZXI6OmlzU2F0U3RhdGVtYWNoaW5lKAorCQljb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQywgVHJhY2VQb2ludCAqIGFUUCwgY29uc3QgQkYgJiBhVHJhY2UpCit7CisJaWYoIGFUUC0+UklELmludmFsaWQoKSApCisJeworCQlhVFAtPnVwZGF0ZVJJRCggYW5FQy5yZWZFeGVjdXRpb25EYXRhKCkgKTsKKwl9CisKKwlpZiggYVRQLT5SSUQudmFsaWQoKSApCisJeworCQlyZXR1cm4oIGFuRUMucmVmRXhlY3V0aW9uRGF0YSgpLmlzSWRsZU9yUnVubmluZyhhVFAtPlJJRCkgKTsKKwl9CisKKwlyZXR1cm4oIGlzU2F0TWFjaGluZShhbkVDLCBhVFAsIGFUcmFjZSkgKTsKK30KKworCitib29sIFRyYWNlQ2hlY2tlcjo6aXNTYXRNYWNoaW5lKAorCQljb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQywgVHJhY2VQb2ludCAqIGFUUCwgY29uc3QgQkYgJiBhVHJhY2UpCit7CisJaWYoIGFUcmFjZS5pbnZhbGlkKCkgKQorCXsKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKwllbHNlIGlmKCBhVHJhY2UuaXM8IEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24gPigpICkKKwl7CisJCUV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24gKiBhQ29uZiA9CisJCQkJYVRyYWNlLnRvX3B0cjwgRXhlY3V0aW9uQ29uZmlndXJhdGlvbiA+KCk7CisKKwkJaWYoIGFDb25mLT5nZXRDb2RlKCkuaXM8IE9wZXJhdG9yID4oKSApCisJCXsKKwkJCWlmKCBhQ29uZi0+Z2V0Q29kZSgpLnRvX3B0cjwgT3BlcmF0b3IgPigpLT4KKwkJCQkJaXNPcENvZGUoIEFWTV9PUENPREVfUlVOICkgKQorCQkJeworCQkJCVJ1bnRpbWVJRCBhUklEID0gYUNvbmYtPmdldFJ1bnRpbWVJRCgpOworCQkJCXdoaWxlKCBhUklELnZhbGlkKCkgJiYgKGFSSUQuZ2V0SW5zdGFuY2UoKSAhPSBhVFAtPm9iamVjdCkgKQorCQkJCXsKKwkJCQkJYVJJRCA9IGFSSUQuZ2V0UFJJRCgpOworCQkJCX0KKwkJCQlyZXR1cm4oIGFSSUQudmFsaWQoKSApOworCQkJfQorCQl9CisJfQorCWVsc2UgaWYoIGFUcmFjZS5pczwgQXZtQ29kZSA+KCkgKQorCXsKKwkJQXZtQ29kZSAqIGFDb2RlID0gYVRyYWNlLnRvX3B0cjwgQXZtQ29kZSA+KCk7CisKKwkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBhQ29kZS0+YmVnaW4oKTsKKwkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kQ29kZSA9IGFDb2RlLT5lbmQoKTsKKwkJZm9yKCA7IGl0ICE9IGVuZENvZGUgOyArK2l0ICkKKwkJeworCQkJaWYoIGlzU2F0TWFjaGluZShhbkVDLCBhVFAsICgqaXQpKSApCisJCQl7CisJCQkJcmV0dXJuKCB0cnVlICk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFdJTEwgTkVWRVIgU0FUIENIRUNLSU5HIEFQSQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBUcmFjZUNoZWNrZXI6OndpbGxOZXZlclNhdChjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQywgY29uc3QgQkYgJiBhcmcpCit7CisJaWYoIGFuRUMuaXNSb290KCkgKQorCXsKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCWlmKCBhcmcuaXM8IFRyYWNlUG9pbnQgPigpICkKKwl7CisJCWlmKCB3aWxsTmV2ZXJTYXQoYW5FQywgYXJnLnRvX3B0cjwgVHJhY2VQb2ludCA+KCkpICkKKwkJeworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwl9CisJZWxzZSBpZiggYXJnLmlzPCBBdm1Db2RlID4oKSApCisJeworCQlyZXR1cm4oIHdpbGxOZXZlclNhdChhbkVDLCBhcmcudG9fcHRyPCBBdm1Db2RlID4oKSkgKTsKKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKworYm9vbCBUcmFjZUNoZWNrZXI6OndpbGxOZXZlclNhdChjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQywgQXZtQ29kZSAqIGFDb2RlKQoreworCXN3aXRjaCggYUNvZGUtPmdldEF2bU9wQ29kZSgpICkKKwl7CisJCWNhc2UgQVZNX09QQ09ERV9BTkQ6CisJCWNhc2UgQVZNX09QQ09ERV9TVFJPTkdfU1lOQ0hST05PVVM6CisJCWNhc2UgQVZNX09QQ09ERV9BTkRfVEhFTjoKKwkJY2FzZSBBVk1fT1BDT0RFX1NDSEVEVUxFX0FORF9USEVOOgorCQl7CisJCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdCA9IGFDb2RlLT5iZWdpbigpOworCQkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBhQ29kZS0+ZW5kKCk7CisJCQlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJCXsKKwkJCQlpZiggbm90IHdpbGxOZXZlclNhdChhbkVDLCAoKml0KSkgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCX0KKwkJCX0KKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfT1I6CisJCWNhc2UgQVZNX09QQ09ERV9PUl9FTFNFOgorCQljYXNlIEFWTV9PUENPREVfU0NIRURVTEVfT1JfRUxTRToKKwkJY2FzZSBBVk1fT1BDT0RFX1dFQUtfU1lOQ0hST05PVVM6CisJCXsKKwkJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYUNvZGUtPmJlZ2luKCk7CisJCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IGFDb2RlLT5lbmQoKTsKKwkJCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCQkJeworCQkJCWlmKCB3aWxsTmV2ZXJTYXQoYW5FQywgKCppdCkpICkKKwkJCQl7CisJCQkJCXJldHVybiggdHJ1ZSApOworCQkJCX0KKwkJCX0KKworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisKKwkJY2FzZSBBVk1fT1BDT0RFX1hPUjoKKwkJeworCQkJYXZtX3NpemVfdCBwYXNzQ291bnQgPSAwOworCisJCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdCA9IGFDb2RlLT5iZWdpbigpOworCQkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBhQ29kZS0+ZW5kKCk7CisJCQlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJCXsKKwkJCQlpZiggd2lsbE5ldmVyU2F0KGFuRUMsICgqaXQpKSApCisJCQkJeworCQkJCQlpZiggKytwYXNzQ291bnQgPiAxICkKKwkJCQkJeworCQkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4oIHBhc3NDb3VudCA9PSAxICk7CisJCX0KKworCisJCWNhc2UgQVZNX09QQ09ERV9OT1Q6CisJCXsKKwkJCXJldHVybiggbm90IHdpbGxOZXZlclNhdChhbkVDLCBhQ29kZS0+Zmlyc3QoKSkgKTsKKwkJfQorCisKKwkJY2FzZSBBVk1fT1BDT0RFX05BTkQ6CisJCXsKKwkJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYUNvZGUtPmJlZ2luKCk7CisJCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IGFDb2RlLT5lbmQoKTsKKwkJCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCQkJeworCQkJCWlmKCBub3Qgd2lsbE5ldmVyU2F0KGFuRUMsICgqaXQpKSApCisJCQkJeworCQkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCQl9CisJCQl9CisKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9OT1I6CisJCXsKKwkJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYUNvZGUtPmJlZ2luKCk7CisJCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IGFDb2RlLT5lbmQoKTsKKwkJCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCQkJeworCQkJCWlmKCB3aWxsTmV2ZXJTYXQoYW5FQywgKCppdCkpICkKKwkJCQl7CisJCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCQl9CisJCQl9CisKKwkJCXJldHVybiggdHJ1ZSApOworCQl9CisKKwkJY2FzZSBBVk1fT1BDT0RFX1hOT1I6CisJCXsKKwkJCWF2bV9zaXplX3QgcGFzc0NvdW50ID0gMDsKKworCQkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBhQ29kZS0+YmVnaW4oKTsKKwkJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gYUNvZGUtPmVuZCgpOworCQkJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJCQl7CisJCQkJaWYoIHdpbGxOZXZlclNhdChhbkVDLCAoKml0KSkgKQorCQkJCXsKKwkJCQkJaWYoICsrcGFzc0NvdW50ID4gMSApCisJCQkJCXsKKwkJCQkJCXJldHVybiggdHJ1ZSApOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4oIHBhc3NDb3VudCAhPSAxICk7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKwl9Cit9CisKKworYm9vbCBUcmFjZUNoZWNrZXI6OndpbGxOZXZlclNhdCgKKwkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMsIEFWTV9PUENPREUgYW5PcCwgY29uc3QgQkYgJiBhcmcpCit7CisJc3dpdGNoKCBhbk9wICkKKwl7CisJCWNhc2UgQVZNX09QQ09ERV9BTkQ6CisJCWNhc2UgQVZNX09QQ09ERV9TVFJPTkdfU1lOQ0hST05PVVM6CisJCWNhc2UgQVZNX09QQ09ERV9BTkRfVEhFTjoKKwkJY2FzZSBBVk1fT1BDT0RFX1NDSEVEVUxFX0FORF9USEVOOgorCQl7CisJCQlBcnJheUJGICogYXJnQXJyYXkgPSBhcmcudG9fcHRyPCBBcnJheUJGID4oKTsKKwkJCWF2bV9zaXplX3QgZW5kT2Zmc2V0ID0gYXJnQXJyYXktPnNpemUoKTsKKwkJCWZvciggYXZtX3NpemVfdCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgZW5kT2Zmc2V0IDsgKytvZmZzZXQgKQorCQkJeworCQkJCWlmKCBub3Qgd2lsbE5ldmVyU2F0KGFuRUMsIGFyZ0FycmF5LT5hdChvZmZzZXQpKSApCisJCQkJeworCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9PUjoKKwkJY2FzZSBBVk1fT1BDT0RFX09SX0VMU0U6CisJCWNhc2UgQVZNX09QQ09ERV9TQ0hFRFVMRV9PUl9FTFNFOgorCQljYXNlIEFWTV9PUENPREVfV0VBS19TWU5DSFJPTk9VUzoKKwkJeworCQkJQXJyYXlCRiAqIGFyZ0FycmF5ID0gYXJnLnRvX3B0cjwgQXJyYXlCRiA+KCk7CisJCQlhdm1fc2l6ZV90IGVuZE9mZnNldCA9IGFyZ0FycmF5LT5zaXplKCk7CisJCQlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMCA7IG9mZnNldCA8IGVuZE9mZnNldCA7ICsrb2Zmc2V0ICkKKwkJCXsKKwkJCQlpZiggd2lsbE5ldmVyU2F0KGFuRUMsIGFyZ0FycmF5LT5hdChvZmZzZXQpKSApCisJCQkJeworCQkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCQl9CisJCQl9CisKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9YT1I6CisJCWNhc2UgQVZNX09QQ09ERV9FWENMVVNJVkU6CisJCXsKKwkJCUFycmF5QkYgKiBhcmdBcnJheSA9IGFyZy50b19wdHI8IEFycmF5QkYgPigpOworCQkJYXZtX3NpemVfdCBlbmRPZmZzZXQgPSBhcmdBcnJheS0+c2l6ZSgpOworCQkJYXZtX3NpemVfdCBwYXNzQ291bnQgPSAwOworCisJCQlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMCA7IG9mZnNldCA8IGVuZE9mZnNldCA7ICsrb2Zmc2V0ICkKKwkJCXsKKwkJCQlpZiggd2lsbE5ldmVyU2F0KGFuRUMsIGFyZ0FycmF5LT5hdChvZmZzZXQpKSApCisJCQkJeworCQkJCQlpZiggKytwYXNzQ291bnQgPiAxICkKKwkJCQkJeworCQkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4oIHBhc3NDb3VudCA9PSAxICk7CisJCX0KKworCisJCWNhc2UgQVZNX09QQ09ERV9OT1Q6CisJCXsKKwkJCXJldHVybiggbm90IHdpbGxOZXZlclNhdChhbkVDLCBhcmcpICk7CisJCX0KKworCisJCWNhc2UgQVZNX09QQ09ERV9OQU5EOgorCQl7CisJCQlBcnJheUJGICogYXJnQXJyYXkgPSBhcmcudG9fcHRyPCBBcnJheUJGID4oKTsKKwkJCWF2bV9zaXplX3QgZW5kT2Zmc2V0ID0gYXJnQXJyYXktPnNpemUoKTsKKwkJCWZvciggYXZtX3NpemVfdCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgZW5kT2Zmc2V0IDsgKytvZmZzZXQgKQorCQkJeworCQkJCWlmKCBub3Qgd2lsbE5ldmVyU2F0KGFuRUMsIGFyZ0FycmF5LT5hdChvZmZzZXQpKSApCisJCQkJeworCQkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCQl9CisJCQl9CisKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCisJCWNhc2UgQVZNX09QQ09ERV9OT1I6CisJCXsKKwkJCUFycmF5QkYgKiBhcmdBcnJheSA9IGFyZy50b19wdHI8IEFycmF5QkYgPigpOworCQkJYXZtX3NpemVfdCBlbmRPZmZzZXQgPSBhcmdBcnJheS0+c2l6ZSgpOworCQkJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDAgOyBvZmZzZXQgPCBlbmRPZmZzZXQgOyArK29mZnNldCApCisJCQl7CisJCQkJaWYoIHdpbGxOZXZlclNhdChhbkVDLCBhcmdBcnJheS0+YXQob2Zmc2V0KSkgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCX0KKwkJCX0KKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfWE5PUjoKKwkJeworCQkJYXZtX3NpemVfdCBwYXNzQ291bnQgPSAwOworCisJCQlBcnJheUJGICogYXJnQXJyYXkgPSBhcmcudG9fcHRyPCBBcnJheUJGID4oKTsKKwkJCWF2bV9zaXplX3QgZW5kT2Zmc2V0ID0gYXJnQXJyYXktPnNpemUoKTsKKwkJCWZvciggYXZtX3NpemVfdCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgZW5kT2Zmc2V0IDsgKytvZmZzZXQgKQorCQkJeworCQkJCWlmKCB3aWxsTmV2ZXJTYXQoYW5FQywgYXJnQXJyYXktPmF0KG9mZnNldCkpICkKKwkJCQl7CisJCQkJCWlmKCArK3Bhc3NDb3VudCA+IDEgKQorCQkJCQl7CisJCQkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJcmV0dXJuKCBwYXNzQ291bnQgIT0gMSApOworCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorfQorCisKK2Jvb2wgVHJhY2VDaGVja2VyOjp3aWxsTmV2ZXJTYXQoY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMsIFRyYWNlUG9pbnQgKiBhVFApCit7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBQUk9DRVNTT1IgLCBTT0xWSU5HICkKKwlBVk1fT1NfVFJBQ0UgPDwgIndpbGxOZXZlclNhdCA/IEVDOj4gIiA8PCBhbkVDLnN0cl9taW4oKSA8PCBzdGQ6OmVuZGwKKwkJCTw8ICJydW4jdHJhY2U6PiAiIDw8IGFuRUMuZ2V0UnVubmFibGVFbGVtZW50VHJhY2UoKS5zdHIoKSA8PCBzdGQ6OmVuZGwKKwkJCTw8ICJpbyNyYWNlICA6PiAiIDw8IGFuRUMuZ2V0SU9FbGVtZW50VHJhY2UoKS5zdHIoKSA8PCBzdGQ6OmVuZGw7CisJQVZNX09TX1RSQUNFIDw8ICJQb2ludDo+IiA8PCBzdHJfaW5kZW50KCBhVFAgKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBQUk9DRVNTT1IgLCBTT0xWSU5HICkKKworCisJc3dpdGNoKCBhVFAtPm5hdHVyZSApCisJeworCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1BBVEhfQ09ORElUSU9OX05BVFVSRToKKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9QQVRIX0NPTkRJVElPTl9OQVRVUkVfTEVBRjoKKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9QQVRIX1RJTUVEX0NPTkRJVElPTl9OQVRVUkU6CisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfUEFUSF9USU1FRF9DT05ESVRJT05fTkFUVVJFX0xFQUY6CisKKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9OT0RFX0NPTkRJVElPTl9OQVRVUkU6CisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTk9ERV9DT05ESVRJT05fTkFUVVJFX0xFQUY6CisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTk9ERV9USU1FRF9DT05ESVRJT05fTkFUVVJFOgorCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX05PREVfVElNRURfQ09ORElUSU9OX05BVFVSRV9MRUFGOgorCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfRk9STVVMQV9OQVRVUkU6CisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfQ09ORElUSU9OX05BVFVSRToKKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9ERUNJU0lPTl9OQVRVUkU6CisKKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9USU1FX05BVFVSRToKKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9WQVJJQUJMRV9OQVRVUkU6CisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfQ09NX05BVFVSRToKKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9QT1JUX05BVFVSRToKKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9TSUdOQUxfTkFUVVJFOgorCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX01FU1NBR0VfTkFUVVJFOgorCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX0NIQU5ORUxfTkFUVVJFOgorCQl7CisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKworCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfVFJBTlNJVElPTl9OQVRVUkU6CisJCXsKKwkJCXJldHVybiggd2lsbE5ldmVyU2F0VHJhbnNpdGlvbihhbkVDLCBhVFApICk7CisJCX0KKworCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1NUQVRFX05BVFVSRToKKwkJeworCQkJcmV0dXJuKCB3aWxsTmV2ZXJTYXRTdGF0ZShhbkVDLCBhVFApICk7CisJCX0KKworCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1NUQVRFTUFDSElORV9OQVRVUkU6CisJCXsKKwkJCXJldHVybiggd2lsbE5ldmVyU2F0U3RhdGVtYWNoaW5lKGFuRUMsIGFUUCkgKTsKKwkJfQorCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTUFDSElORV9OQVRVUkU6CisJCXsKKwkJCXJldHVybiggd2lsbE5ldmVyU2F0TWFjaGluZShhbkVDLCBhVFApICk7CisJCX0KKworCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX0NPTVBPU0lURV9OQVRVUkU6CisJCXsKKwkJCXJldHVybiggd2lsbE5ldmVyU2F0KGFuRUMsIGFUUC0+b3AsIGFUUC0+dmFsdWUpICk7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKwl9Cit9CisKKworYm9vbCBUcmFjZUNoZWNrZXI6OndpbGxOZXZlclNhdFRyYW5zaXRpb24oCisJCWNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDLCBUcmFjZVBvaW50ICogYVRQKQoreworCUV4ZWN1dGFibGVGb3JtICogc291cmNlRXhlY3V0YWJsZSA9CisJCQlhVFAtPm9iamVjdC0+YXM8IEF2bVRyYW5zaXRpb24gPigpLT5nZXRFeGVjdXRhYmxlQ29udGFpbmVyKCk7CisKKwlpZiggbm90IHNvdXJjZUV4ZWN1dGFibGUtPmhhc1Bvc3NpYmxlRHluYW1pY0luc3RhbmNpYXRpb24oKSApCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJVGFibGVPZlJ1bnRpbWVUOjpjb25zdF9pdGVyYXRvciBpdFJGID0KKwkJCWFuRUMucmVmRXhlY3V0aW9uRGF0YSgpLmdldFRhYmxlT2ZSdW50aW1lKCkuYmVnaW4oKTsKKwlUYWJsZU9mUnVudGltZVQ6OmNvbnN0X2l0ZXJhdG9yIGVuZFJGID0KKwkJCWFuRUMucmVmRXhlY3V0aW9uRGF0YSgpLmdldFRhYmxlT2ZSdW50aW1lKCkuZW5kKCk7CisJZm9yKCBSdW50aW1lSUQgaXRSSUQgOyBpdFJGICE9IGVuZFJGIDsgKytpdFJGICkKKwl7CisJCWl0UklEID0gKCppdFJGKS0+Z2V0UklEKCk7CisKKwkJaWYoIGFuRUMucmVmRXhlY3V0aW9uRGF0YSgpLmlzSWRsZU9yUnVubmluZyhpdFJJRCkgJiYKKwkJCQlpdFJJRC5nZXRFeGVjdXRhYmxlKCktPmhhc0ZvcndhcmRSZWFjaGFibGVNYWNoaW5lKCkgKQorCQl7CisJCQlpZiggKHNvdXJjZUV4ZWN1dGFibGUgPT0gaXRSSUQuZ2V0RXhlY3V0YWJsZSgpKSB8fAorCQkJCXNvdXJjZUV4ZWN1dGFibGUtPmdldEJhY2t3YXJkUmVhY2hhYmxlTWFjaGluZSgpLgorCQkJCQkJY29udGFpbnMoaXRSSUQuZ2V0SW5zdGFuY2UoKSkgKQorCQkJeworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCitib29sIFRyYWNlQ2hlY2tlcjo6d2lsbE5ldmVyU2F0U3RhdGUoCisJCWNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDLCBUcmFjZVBvaW50ICogYVRQKQoreworCUV4ZWN1dGFibGVGb3JtICogc291cmNlRXhlY3V0YWJsZSA9CisJCQlhVFAtPm9iamVjdC0+YXM8IEluc3RhbmNlT2ZNYWNoaW5lID4oKS0+Z2V0RXhlY3V0YWJsZSgpOworCisJaWYoIG5vdCBzb3VyY2VFeGVjdXRhYmxlLT5oYXNTaW5nbGVSdW50aW1lSW5zdGFuY2UoKSApCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJVGFibGVPZlJ1bnRpbWVUOjpjb25zdF9pdGVyYXRvciBpdFJGID0KKwkJCWFuRUMucmVmRXhlY3V0aW9uRGF0YSgpLmdldFRhYmxlT2ZSdW50aW1lKCkuYmVnaW4oKTsKKwlUYWJsZU9mUnVudGltZVQ6OmNvbnN0X2l0ZXJhdG9yIGVuZFJGID0KKwkJCWFuRUMucmVmRXhlY3V0aW9uRGF0YSgpLmdldFRhYmxlT2ZSdW50aW1lKCkuZW5kKCk7CisJZm9yKCBSdW50aW1lSUQgaXRSSUQgOyBpdFJGICE9IGVuZFJGIDsgKytpdFJGICkKKwl7CisJCWl0UklEID0gKCppdFJGKS0+Z2V0UklEKCk7CisKKwkJaWYoIGFuRUMucmVmRXhlY3V0aW9uRGF0YSgpLmlzSWRsZU9yUnVubmluZyhpdFJJRCkgJiYKKwkJCQlpdFJJRC5nZXRFeGVjdXRhYmxlKCktPmhhc0ZvcndhcmRSZWFjaGFibGVNYWNoaW5lKCkgKQorCQl7CisJCQlpZiggKHNvdXJjZUV4ZWN1dGFibGUgPT0gaXRSSUQuZ2V0RXhlY3V0YWJsZSgpKSB8fAorCQkJCXNvdXJjZUV4ZWN1dGFibGUtPmdldEJhY2t3YXJkUmVhY2hhYmxlTWFjaGluZSgpLgorCQkJCQkJY29udGFpbnMoaXRSSUQuZ2V0SW5zdGFuY2UoKSkgKQorCQkJeworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKworCitib29sIFRyYWNlQ2hlY2tlcjo6d2lsbE5ldmVyU2F0U3RhdGVtYWNoaW5lKAorCQljb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQywgVHJhY2VQb2ludCAqIGFUUCkKK3sKKwlyZXR1cm4oIHdpbGxOZXZlclNhdFN0YXRlKGFuRUMsIGFUUCkgKTsKK30KKworCitib29sIFRyYWNlQ2hlY2tlcjo6d2lsbE5ldmVyU2F0TWFjaGluZSgKKwkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMsIFRyYWNlUG9pbnQgKiBhVFApCit7CisJcmV0dXJuKCB3aWxsTmV2ZXJTYXRTdGF0ZShhbkVDLCBhVFApICk7Cit9CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvdHJhY2UvVHJhY2VDaGVja2VyLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvdHJhY2UvVHJhY2VDaGVja2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk1YzEyYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90cmFjZS9UcmFjZUNoZWNrZXIuaApAQCAtMCwwICsxLDE3MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDI3IG5vdi4gMjAxNAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFRSQUNFQ0hFQ0tFUl9IXworI2RlZmluZSBUUkFDRUNIRUNLRVJfSF8KKworI2luY2x1ZGUgPGZtbC9vcGVyYXRvci9PcGVyYXRvckxpYi5oPgorCisjaW5jbHVkZSA8Zm1sL2xpYi9JVHJhY2VQb2ludC5oPgorCisjaW5jbHVkZSA8c29sdmVyL2FwaS9Tb2x2ZXJEZWYuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKK2NsYXNzIEF2bUNvZGU7CitjbGFzcyBCRjsKK2NsYXNzIEV2YWx1YXRpb25FbnZpcm9ubWVudDsKK2NsYXNzIEV4ZWN1dGFibGVGb3JtOworY2xhc3MgRXhlY3V0aW9uQ29udGV4dDsKK2NsYXNzIFRyYWNlUG9pbnQ7CisKKworCitjbGFzcyBUcmFjZUNoZWNrZXIKK3sKKworcHJvdGVjdGVkOgorCUV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOVjsKKwlFeGVjdXRhYmxlRm9ybSAqIHRoZUxvY2FsRXhlY3V0YWJsZUZvcm07CisKKwlTb2x2ZXJEZWY6OlNPTFZFUl9LSU5EIHRoZVNvbHZlcktpbmQ7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCVRyYWNlQ2hlY2tlcihFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBhbkVOVikKKwk6IEVOViggYW5FTlYgKSwKKwl0aGVMb2NhbEV4ZWN1dGFibGVGb3JtKCBOVUxMICksCisJdGhlU29sdmVyS2luZCggU29sdmVyRGVmOjpERUZBVUxUX1NPTFZFUl9LSU5EICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCVRyYWNlQ2hlY2tlcihFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBhbkVOViwgU29sdmVyRGVmOjpTT0xWRVJfS0lORCBhU29sdmVyKQorCTogRU5WKCBhbkVOViApLAorCXRoZUxvY2FsRXhlY3V0YWJsZUZvcm0oIE5VTEwgKSwKKwl0aGVTb2x2ZXJLaW5kKCBhU29sdmVyICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCVRyYWNlQ2hlY2tlcihFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBhbkVOViwgRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWN1dGFibGUpCisJOiBFTlYoIGFuRU5WICksCisJdGhlTG9jYWxFeGVjdXRhYmxlRm9ybSggYW5FeGVjdXRhYmxlICksCisJdGhlU29sdmVyS2luZCggU29sdmVyRGVmOjpERUZBVUxUX1NPTFZFUl9LSU5EICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5UcmFjZUNoZWNrZXIoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogU0VUVEVSCisJICogdGhlU29sdmVyS2luZAorCSAqLworCXZvaWQgc2V0U29sdmVyS2luZChTb2x2ZXJEZWY6OlNPTFZFUl9LSU5EIGFTb2x2ZXJLaW5kKQorCXsKKwkJdGhlU29sdmVyS2luZCA9IGFTb2x2ZXJLaW5kOworCX0KKworCisJLyoqCisJICogVEVTVAorCSAqIFRyYWNlUG9pbnQgTmF0dXJlCisJICovCisJYm9vbCBpc1BvaW50TmF0dXJlKGNvbnN0IEJGICYgYXJnLAorCQkJRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTkFUVVJFIG5hdHVyZSkgY29uc3Q7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBTQVQgQ0hFQ0tJTkcgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJYm9vbCBpc1NhdChjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQywgY29uc3QgQkYgJiBhcmcpOworCWJvb2wgaXNTYXQoY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMsIGNvbnN0IEF2bUNvZGUgJiBhQ29kZSk7CisJYm9vbCBpc1NhdChjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQywgQVZNX09QQ09ERSBhbk9wLCBjb25zdCBCRiAmIGFyZyk7CisKKwlib29sIGlzU2F0KGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDLCBUcmFjZVBvaW50ICogYVRQKTsKKworCWJvb2wgaXNTYXRGb3JtdWxhKGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDLCBUcmFjZVBvaW50ICogYVRQKTsKKworCWJvb2wgaXNTYXRUaW1lKGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDLCBUcmFjZVBvaW50ICogYVRQKTsKKwlib29sIGlzU2F0VmFyaWFibGUoY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMsIFRyYWNlUG9pbnQgKiBhVFApOworCisKKwlib29sIGlzU2F0Q29tKGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDLAorCQkJVHJhY2VQb2ludCAqIGFUUCwgY29uc3QgQkYgJiBhVHJhY2UpOworCisJYm9vbCBpc1NhdFJ1bm5hYmxlKGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDLAorCQkJVHJhY2VQb2ludCAqIGFUUCwgY29uc3QgQkYgJiBhVHJhY2UpOworCisJYm9vbCBpc1NhdFJvdXRpbmUoY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMsCisJCQlUcmFjZVBvaW50ICogYVRQLCBjb25zdCBCRiAmIGFUcmFjZSk7CisKKwlib29sIGlzU2F0VHJhbnNpdGlvbihjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQywKKwkJCVRyYWNlUG9pbnQgKiBhVFAsIGNvbnN0IEJGICYgYVRyYWNlKTsKKworCWJvb2wgaXNTYXRTdGF0ZShjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQywKKwkJCVRyYWNlUG9pbnQgKiBhVFAsIGNvbnN0IEJGICYgYVRyYWNlKTsKKworCWJvb2wgaXNTYXRTdGF0ZW1hY2hpbmUoY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMsCisJCQlUcmFjZVBvaW50ICogYVRQLCBjb25zdCBCRiAmIGFUcmFjZSk7CisKKwlib29sIGlzU2F0TWFjaGluZShjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQywKKwkJCVRyYWNlUG9pbnQgKiBhVFAsIGNvbnN0IEJGICYgYVRyYWNlKTsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFdJTEwgTkVWRVIgU0FUIENIRUNLSU5HIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWJvb2wgd2lsbE5ldmVyU2F0KGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDLCBjb25zdCBCRiAmIGFyZyk7CisKKwlib29sIHdpbGxOZXZlclNhdChjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQywgQXZtQ29kZSAqIGFDb2RlKTsKKworCWJvb2wgd2lsbE5ldmVyU2F0KAorCQkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMsIEFWTV9PUENPREUgYW5PcCwgY29uc3QgQkYgJiBhcmcpOworCisJYm9vbCB3aWxsTmV2ZXJTYXQoY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMsIFRyYWNlUG9pbnQgKiBhVFApOworCisJYm9vbCB3aWxsTmV2ZXJTYXRUcmFuc2l0aW9uKAorCQkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMsIFRyYWNlUG9pbnQgKiBhVFApOworCisJYm9vbCB3aWxsTmV2ZXJTYXRTdGF0ZSgKKwkJCWNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDLCBUcmFjZVBvaW50ICogYVRQKTsKKworCWJvb2wgd2lsbE5ldmVyU2F0U3RhdGVtYWNoaW5lKAorCQkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMsIFRyYWNlUG9pbnQgKiBhVFApOworCisJYm9vbCB3aWxsTmV2ZXJTYXRNYWNoaW5lKAorCQkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMsIFRyYWNlUG9pbnQgKiBhVFApOworCisKK307CisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworCisjZW5kaWYgLyogVFJBQ0VDSEVDS0VSX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvdHJhY2UvVHJhY2VGYWN0b3J5LmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90cmFjZS9UcmFjZUZhY3RvcnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNjExMWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvdHJhY2UvVHJhY2VGYWN0b3J5LmNwcApAQCAtMCwwICsxLDEzMjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxMSBzZXB0LiAyMDE0CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJUcmFjZUZhY3RvcnkuaCIKKworI2luY2x1ZGUgPGZzdHJlYW0+CisKKyNpbmNsdWRlIDxib29zdC9hbGdvcml0aG0vc3RyaW5nLmhwcD4KKworI2luY2x1ZGUgPGJ1aWxkZXIvQnVpbGRlci5oPgorCisjaW5jbHVkZSA8Y29tcHV0ZXIvRXZhbHVhdGlvbkVudmlyb25tZW50Lmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9Bdm1Db2RlLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9Bdm1Db2RlLmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQnVpbHRpbkFycmF5Lmg+CisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9Bdm1UcmFuc2l0aW9uLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZVF1ZXJ5Lmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZVN5c3RlbS5oPgorCisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yTWFuYWdlci5oPgorCisjaW5jbHVkZSA8Zm1sL3RyYWNlL0Jhc2ljVHJhY2VQYXJzZXIuaD4KKyNpbmNsdWRlIDxmbWwvdHJhY2UvVHJhY2VQb2ludC5oPgorI2luY2x1ZGUgPGZtbC90cmFjZS9UcmFjZVNlcXVlbmNlLmg+CisKKyNpbmNsdWRlIDxmbWwvd29ya2Zsb3cvUXVlcnkuaD4KKyNpbmNsdWRlIDxmbWwvd29ya2Zsb3cvV09iamVjdC5oPgorCisjaW5jbHVkZSA8c2V3L0NvbmZpZ3VyYXRpb24uaD4KKworI2luY2x1ZGUgPHV0aWwvYXZtX3N0cmluZy5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENPTkZJR1VSRSBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qCisgLy8gRGVjbGFyYXRpb24gcGFydAorIHNlY3Rpb24gUE9JTlQKKyAgQGFzc2lnbiA9ICJzZW5zIjsKKworICBAbmV3ZnJlc2ggPSAic2VucyI7CisKKyAgQHNpZ25hbCNzZW5zID0gInNlbnMiOworCisgIEBwb3J0ID0gImVudiI7CisKKyAgQGlucHV0ID0gImVudiI7CisgIEBvdXRwdXQgPSAiZW52IjsKKworICBAb3V0cHV0ID0gIlRoZXJtb3N0YXQtPmR0IjsKKyAgQGlucHV0ICA9ICJUaGVybW9zdGF0LT5lcXVpcCI7CisgIEBvdXRwdXQyID0gIkVxdWlwbWVudC0+ZXJyb3IiOworIGVuZHNlY3Rpb24gUE9JTlQKKworIHNlY3Rpb24gVFJBQ0UKKyAgQHRyYWNlID0gJHsgJiYgInNpZ25hbCNzZW5zIiAib3V0cHV0MiIgfTsKKyAgQHRyYWNlID0gWyAic2lnbmFsI3NlbnMiICwgIm91dHB1dDIiIF07CisgIEBwb2ludCA9ICggInNpZ25hbCNzZW5zIiB8fCAib3V0cHV0MiIgKTsKKyAgQGNvbXBvc2l0ZSA9ICR7IHhvciAic2lnbmFsI3NlbnMiICJvdXRwdXQyIiB9OworCisKKyAgQGFzc2lnbiA9ICJzZW5zIjsKKworICBAbmV3ZnJlc2ggPSAic2VucyI7CisKKyAgQHNpZ25hbCA9ICJzZW5zIjsKKworICBAcG9ydCA9ICJlbnYiOworCisgIEBpbnB1dCA9ICJlbnYiOworICBAb3V0cHV0ID0gImVudiI7CisKKyAgQG91dHB1dCA9ICJUaGVybW9zdGF0LT5kdCI7CisgIEBpbnB1dCAgPSAiVGhlcm1vc3RhdC0+ZXF1aXAiOworICBAb3V0cHV0ID0gIkVxdWlwbWVudC0+ZXJyb3IiOworCisgIEB0cmFuc2l0aW9uID0gIlRoZXJtb3N0YXQtPnRyYW5zaXRpb24jMiNNU0dtMSNpbiI7CisgIEByb3V0aW5lID0gIlRoZXJtb3N0YXQtPnRyYW5zaXRpb24jMiNNU0dtMSNpbiI7CisKKyAgQG1hY2hpbmUgPSAiVGhlcm1vc3RhdCI7CisKKyAgQHN0YXRlID0gIlRoZXJtb3N0YXQtPnM0IjsKKworICBAZm9ybXVsYSA9IDxleHByZXNzaW9uPjsKKworCisgZW5kc2VjdGlvbiBUUkFDRQorCisqLworCitzdGF0aWMgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTkFUVVJFIHRvX25hdHVyZShjb25zdCBzdGQ6OnN0cmluZyAmIGlkKQoreworCWlmKCBpZC5maW5kKCJjb21wb3NpdGUiICkgPT0gMCApIHJldHVybiBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9DT01QT1NJVEVfTkFUVVJFOworCWlmKCBpZC5maW5kKCJjb21wIiAgICAgICkgPT0gMCApIHJldHVybiBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9DT01QT1NJVEVfTkFUVVJFOworCWlmKCBpZC5maW5kKCJleHByZXNzaW9uIikgPT0gMCApIHJldHVybiBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9DT01QT1NJVEVfTkFUVVJFOworCWlmKCBpZC5maW5kKCJleHByIiAgICAgICkgPT0gMCApIHJldHVybiBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9DT01QT1NJVEVfTkFUVVJFOworCWlmKCBpZC5maW5kKCJ0cmFjZSIgICAgICkgPT0gMCApIHJldHVybiBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9DT01QT1NJVEVfTkFUVVJFOworCWlmKCBpZC5maW5kKCJwb2ludCIgICAgICkgPT0gMCApIHJldHVybiBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9DT01QT1NJVEVfTkFUVVJFOworCisJaWYoIGlkLmZpbmQoImNvbSIgICAgICAgKSA9PSAwICkgcmV0dXJuIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX0NPTV9OQVRVUkU7CisJaWYoIGlkLmZpbmQoImlub3V0IiAgICAgKSA9PSAwICkgcmV0dXJuIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX0NPTV9OQVRVUkU7CisKKwlpZiggaWQuZmluZCgiY2hhbm5lbCIgICApID09IDAgKSByZXR1cm4gRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfQ0hBTk5FTF9OQVRVUkU7CisKKwlpZiggaWQuZmluZCgibWVzc2FnZSIgICApID09IDAgKSByZXR1cm4gRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTUVTU0FHRV9OQVRVUkU7CisKKwlpZiggaWQuZmluZCgicG9ydCIgICAgICApID09IDAgKSByZXR1cm4gRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfUE9SVF9OQVRVUkU7CisKKwlpZiggaWQuZmluZCgic2lnbmFsIiAgICApID09IDAgKSByZXR1cm4gRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfU0lHTkFMX05BVFVSRTsKKworCWlmKCBpZC5maW5kKCJ0aW1lIiAgICAgICkgPT0gMCApIHJldHVybiBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9USU1FX05BVFVSRTsKKworCWlmKCBpZC5maW5kKCJ2YXIiICAgICAgICkgPT0gMCApIHJldHVybiBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9WQVJJQUJMRV9OQVRVUkU7CisJaWYoIGlkLmZpbmQoInZhcmlhYmxlIiAgKSA9PSAwICkgcmV0dXJuIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1ZBUklBQkxFX05BVFVSRTsKKy8vCWlmKCBpZC5maW5kKCJhc3NpZ24iICAgICkgPT0gMCApIHJldHVybiBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9WQVJJQUJMRV9OQVRVUkU7CisvLwlpZiggaWQuZmluZCgibmV3ZnJlc2giICApID09IDAgKSByZXR1cm4gRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfVkFSSUFCTEVfTkFUVVJFOworCisJaWYoIGlkLmZpbmQoImJ1ZmZlciIgICAgKSA9PSAwICkgcmV0dXJuIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX0JVRkZFUl9OQVRVUkU7CisKKwlpZiggaWQuZmluZCgiZm9ybXVsYSIgICApID09IDAgKSByZXR1cm4gRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfRk9STVVMQV9OQVRVUkU7CisJaWYoIGlkLmZpbmQoImNvbmRpdGlvbiIgKSA9PSAwICkgcmV0dXJuIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX0NPTkRJVElPTl9OQVRVUkU7CisJaWYoIGlkLmZpbmQoImRlY2lzaW9uIiAgKSA9PSAwICkgcmV0dXJuIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX0RFQ0lTSU9OX05BVFVSRTsKKworCWlmKCBSRUdFWF9NQVRDSChpZCwgQ09OU19XSUQyKCJwYXRoIiwgImNvbmRpdGlvbiIpKSApIHsKKwkJcmV0dXJuIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1BBVEhfQ09ORElUSU9OX05BVFVSRTsKKwl9CisJaWYoIFJFR0VYX01BVENIKGlkLCBDT05TX1dJRDIoIm5vZGUiLCAiY29uZGl0aW9uIikpICkgeworCQlyZXR1cm4gRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTk9ERV9DT05ESVRJT05fTkFUVVJFOworCX0KKworCWlmKCBSRUdFWF9NQVRDSChpZCwgQ09OU19XSUQzKCJwYXRoIiwgImNvbmRpdGlvbiIsICJsZWFmIikpICkgeworCQlyZXR1cm4gRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfUEFUSF9DT05ESVRJT05fTkFUVVJFX0xFQUY7CisJfQorCWlmKCBSRUdFWF9NQVRDSChpZCwgQ09OU19XSUQzKCJub2RlIiwgImNvbmRpdGlvbiIsICJsZWFmIikpICkgeworCQlyZXR1cm4gRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTk9ERV9DT05ESVRJT05fTkFUVVJFX0xFQUY7CisJfQorCisJaWYoIFJFR0VYX01BVENIKGlkLCBDT05TX1dJRDMoInBhdGgiLCAidGltZWQiLCAiY29uZGl0aW9uIikpICkgeworCQlyZXR1cm4gRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfUEFUSF9USU1FRF9DT05ESVRJT05fTkFUVVJFOworCX0KKwlpZiggUkVHRVhfTUFUQ0goaWQsIENPTlNfV0lEMygibm9kZSIsICJ0aW1lZCIsICJjb25kaXRpb24iKSkgKSB7CisJCXJldHVybiBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9OT0RFX1RJTUVEX0NPTkRJVElPTl9OQVRVUkU7CisJfQorCisJaWYoIFJFR0VYX01BVENIKGlkLCBDT05TX1dJRDQoCisJCQkicGF0aCIsICJ0aW1lZCIsICJjb25kaXRpb24iLCAiKGxlYWZ8ZW5kfGxhc3R8dGFpbCkiKSkgKSB7CisJCXJldHVybiBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9QQVRIX1RJTUVEX0NPTkRJVElPTl9OQVRVUkVfTEVBRjsKKwl9CisJaWYoIFJFR0VYX01BVENIKGlkLCBDT05TX1dJRDQoCisJCQkibm9kZSIsICJ0aW1lZCIsICJjb25kaXRpb24iLCAiKGxlYWZ8ZW5kfGxhc3R8dGFpbCkiKSkgKSB7CisJCXJldHVybiBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9OT0RFX1RJTUVEX0NPTkRJVElPTl9OQVRVUkVfTEVBRjsKKwl9CisKKwlpZiggaWQuZmluZCgic3RhdGVtYWNoaW5lIikgPT0gMCApIHJldHVybiBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9TVEFURU1BQ0hJTkVfTkFUVVJFOworCWlmKCBpZC5maW5kKCJtYWNoaW5lIikgPT0gMCApIHJldHVybiBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9NQUNISU5FX05BVFVSRTsKKwlpZiggaWQuZmluZCgic3RhdGUiICApID09IDAgKSByZXR1cm4gRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfU1RBVEVfTkFUVVJFOworCisKKwlpZiggaWQuZmluZCgidHJhbnNpdGlvbiIpID09IDAgKSByZXR1cm4gRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfVFJBTlNJVElPTl9OQVRVUkU7CisJaWYoIGlkLmZpbmQoInJvdXRpbmUiICAgKSA9PSAwICkgcmV0dXJuIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1JPVVRJTkVfTkFUVVJFOworCisJaWYoIGlkLmZpbmQoInJ1bm5hYmxlIiAgKSA9PSAwICkgcmV0dXJuIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1JVTk5BQkxFX05BVFVSRTsKKworCWlmKCBSRUdFWF9NQVRDSChpZCwgQ09OU19XSUQyKCJzdGVwIiwgImhlYWRlciIpKSApIHsKKwkJcmV0dXJuIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1NURVBfSEVBREVSX05BVFVSRTsKKwl9CisJaWYoIFJFR0VYX01BVENIKGlkLCBDT05TX1dJRDIoInN0ZXAiLCAiYmVnaW4iICkpICkgeworCQlyZXR1cm4gRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfU1RFUF9CRUdJTl9OQVRVUkU7CisJfQorCWlmKCBSRUdFWF9NQVRDSChpZCwgQ09OU19XSUQyKCJzdGVwIiwgImVuZCIgICApKSApIHsKKwkJcmV0dXJuIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1NURVBfRU5EX05BVFVSRTsKKwl9CisKKwlpZiggUkVHRVhfTUFUQ0goaWQsIENPTlNfV0lEMigiaW5pdCIsICJoZWFkZXIiKSkgKSB7CisJCXJldHVybiBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9JTklUX0hFQURFUl9OQVRVUkU7CisJfQorCWlmKCBSRUdFWF9NQVRDSChpZCwgQ09OU19XSUQyKCJpbml0IiwgImJlZ2luIiApKSApIHsKKwkJcmV0dXJuIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX0lOSVRfQkVHSU5fTkFUVVJFOworCX0KKwlpZiggUkVHRVhfTUFUQ0goaWQsIENPTlNfV0lEMigiaW5pdCIsICJlbmQiICAgKSkgKSB7CisJCXJldHVybiBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9JTklUX0VORF9OQVRVUkU7CisJfQorCisJaWYoIGlkLmZpbmQoImNvbW1lbnQiICApID09IDAgKSByZXR1cm4gRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfQ09NTUVOVF9OQVRVUkU7CisJaWYoIGlkLmZpbmQoInNlcGFyYXRvciIpID09IDAgKSByZXR1cm4gRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfU0VQQVJBVE9SX05BVFVSRTsKKwlpZiggaWQuZmluZCgibmV3bGluZSIgICkgPT0gMCApIHJldHVybiBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9ORVdMSU5FX05BVFVSRTsKKworLy8JaWYoIG5vdCBpZC5lbXB0eSgpICkgICAgICAgICAgICAgcmV0dXJuIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX0NPTVBPU0lURV9OQVRVUkU7CisKKwlyZXR1cm4gRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfVU5ERUZJTkVEX05BVFVSRTsKK30KKworCitzdGF0aWMgQVZNX09QQ09ERSAgdG9fb3AoY29uc3Qgc3RkOjpzdHJpbmcgJiBpZCkKK3sKKwlpZiggaWQuZmluZCgidGltZSIgICAgICApID09IDAgKSByZXR1cm4gQVZNX09QQ09ERV9USU1FRF9HVUFSRDsKKworCWlmKCBpZC5maW5kKCJmb3JtdWxhIiAgICkgPT0gMCApIHJldHVybiBBVk1fT1BDT0RFX0dVQVJEOworCWlmKCBpZC5maW5kKCJndWFyZCIgICAgICkgPT0gMCApIHJldHVybiBBVk1fT1BDT0RFX0dVQVJEOworCisJaWYoIFJFR0VYX01BVENIKGlkLCJjaGVjay5zYXQiKSApIHJldHVybiBBVk1fT1BDT0RFX0NIRUNLX1NBVDsKKworCWlmKCBpZC5maW5kKCJhc3NpZ24iICAgICkgPT0gMCApIHJldHVybiBBVk1fT1BDT0RFX0FTU0lHTjsKKwlpZiggaWQuZmluZCgibmV3ZnJlc2giICApID09IDAgKSByZXR1cm4gQVZNX09QQ09ERV9BU1NJR05fTkVXRlJFU0g7CisKKwlpZiggUkVHRVhfTUFUQ0goaWQsIENPTlNfV0lEMigiaW5wdXQiLCAiZW52IikpICkgcmV0dXJuIEFWTV9PUENPREVfSU5QVVRfRU5WOworCWlmKCBSRUdFWF9NQVRDSChpZCwgQ09OU19XSUQyKCJpbnB1dCIsICJyZHYiKSkgKSByZXR1cm4gQVZNX09QQ09ERV9JTlBVVF9SRFY7CisKKwlpZiggaWQuZmluZCgiaW5wdXQiICAgICApID09IDAgKSByZXR1cm4gQVZNX09QQ09ERV9JTlBVVDsKKworCWlmKCBSRUdFWF9NQVRDSChpZCwgQ09OU19XSUQyKCJvdXRwdXQiLCAiZW52IikpICkgcmV0dXJuIEFWTV9PUENPREVfT1VUUFVUX0VOVjsKKwlpZiggUkVHRVhfTUFUQ0goaWQsIENPTlNfV0lEMigib3V0cHV0IiwgInJkdiIpKSApIHJldHVybiBBVk1fT1BDT0RFX09VVFBVVF9SRFY7CisKKwlpZiggaWQuZmluZCgib3V0cHV0IiAgICApID09IDAgKSByZXR1cm4gQVZNX09QQ09ERV9PVVRQVVQ7CisKKwlyZXR1cm4gQVZNX09QQ09ERV9OVUxMOworfQorCisKK2Jvb2wgVHJhY2VGYWN0b3J5Ojpjb25maWd1cmUoCisJCVRyYWNlU2VxdWVuY2UgJiBhVHJhY2VFbGVtZW50LCBjb25zdCBFeGVjdXRpb25EYXRhICogYW5FRCkKK3sKKwlXT2JqZWN0ICogdGhlUE9JTlQgPSBRdWVyeTo6Z2V0UmVnZXhXU2VxdWVuY2UoCisJCQltUGFyYW1ldGVyV09iamVjdCwgT1JfV0lEMigicG9pbnQiLCAiUE9JTlQiKSk7CisJaWYoICh0aGVQT0lOVCAhPSBXT2JqZWN0OjpfTlVMTF8pICYmIHRoZVBPSU5ULT5oYXNPd25lZEVsZW1lbnQoKSApCisJeworLy8JCWlmKCBjb25maWd1cmUodGhlUE9JTlQsIG1EZWNsYXJlZFBvaW50LCBhbkVEKSApCisvLwkJeworLy8JCQkvLyEhIE5PVEhJTkcKKy8vCQl9CisJCW1FRCA9IGFuRUQ7CisKKwkJV09iamVjdDo6Y29uc3RfaXRlcmF0b3IgaXRXZk8gPSB0aGVQT0lOVC0+b3duZWRfYmVnaW4oKTsKKwkJV09iamVjdDo6Y29uc3RfaXRlcmF0b3IgZW5kV2ZPID0gdGhlUE9JTlQtPm93bmVkX2VuZCgpOworCQlmb3IoIDsgaXRXZk8gIT0gZW5kV2ZPIDsgKytpdFdmTyApCisJCXsKKwkJCWlmKCAoKml0V2ZPKS0+aXNXUHJvcGVydHkoKSApCisJCQl7CisJCQkJaWYoIGNvbmZpZ3VyZShtRGVjbGFyZWRQb2ludCwgKml0V2ZPKSApCisJCQkJeworCQkJCQltRGVjbGFyZWRQb2ludElELmFwcGVuZCggKCppdFdmTyktPmdldE5hbWVJRCgpICk7CisKKwkJCQkJaWYoIG1EZWNsYXJlZFBvaW50LnNpemUoKSAhPSBtRGVjbGFyZWRQb2ludElELnNpemUoKSApCisJCQkJCXsKKwkJCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQkJCTw8ICJUcmFjZVBvaW50IERlY2xhcmF0aW9uIEVycm9yICEhISIKKwkJCQkJCQkJPDwgU0VORF9FWElUOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJV09iamVjdCAqIHRoZVRSQUNFID0gUXVlcnk6OmdldFJlZ2V4V1NlcXVlbmNlKAorCQkJbVBhcmFtZXRlcldPYmplY3QsIE9SX1dJRDIoInRyYWNlIiwgIlRSQUNFIikpOworCWlmKCAodGhlVFJBQ0UgIT0gV09iamVjdDo6X05VTExfKSAmJiB0aGVUUkFDRS0+aGFzT3duZWRFbGVtZW50KCkgKQorCXsKKwkJaWYoIGNvbmZpZ3VyZSh0aGVUUkFDRSwgYVRyYWNlRWxlbWVudCwgYW5FRCkgKQorCQl7CisJCQkvLyEhIE5PVEhJTkcKKwkJfQorCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKK2Jvb2wgVHJhY2VGYWN0b3J5Ojpjb25maWd1cmUoCisJCUF2bUNvZGUgKiBhVHJhY2VFeHByZXNzaW9uLCBjb25zdCBFeGVjdXRpb25EYXRhICogYW5FRCkKK3sKKwlXT2JqZWN0ICogdGhlUE9JTlQgPSBRdWVyeTo6Z2V0UmVnZXhXU2VxdWVuY2UoCisJCQltUGFyYW1ldGVyV09iamVjdCwgT1JfV0lEMigicG9pbnQiLCAiUE9JTlQiKSk7CisJaWYoICh0aGVQT0lOVCAhPSBXT2JqZWN0OjpfTlVMTF8pICYmIHRoZVBPSU5ULT5oYXNPd25lZEVsZW1lbnQoKSApCisJeworCQltRUQgPSBhbkVEOworCisJCVdPYmplY3Q6OmNvbnN0X2l0ZXJhdG9yIGl0V2ZPID0gdGhlUE9JTlQtPm93bmVkX2JlZ2luKCk7CisJCVdPYmplY3Q6OmNvbnN0X2l0ZXJhdG9yIGVuZFdmTyA9IHRoZVBPSU5ULT5vd25lZF9lbmQoKTsKKwkJZm9yKCA7IGl0V2ZPICE9IGVuZFdmTyA7ICsraXRXZk8gKQorCQl7CisJCQlpZiggKCppdFdmTyktPmlzV1Byb3BlcnR5KCkgKQorCQkJeworCQkJCWlmKCBjb25maWd1cmUobURlY2xhcmVkUG9pbnQsICppdFdmTykgKQorCQkJCXsKKwkJCQkJbURlY2xhcmVkUG9pbnRJRC5hcHBlbmQoICgqaXRXZk8pLT5nZXROYW1lSUQoKSApOworCisJCQkJCWlmKCBtRGVjbGFyZWRQb2ludC5zaXplKCkgIT0gbURlY2xhcmVkUG9pbnRJRC5zaXplKCkgKQorCQkJCQl7CisJCQkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJCQk8PCAiVHJhY2VQb2ludCBEZWNsYXJhdGlvbiBFcnJvciAhISEiCisJCQkJCQkJCTw8IFNFTkRfRVhJVDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCVdPYmplY3QgKiB0aGVUUkFDRSA9IFF1ZXJ5OjpnZXRSZWdleFdTZXF1ZW5jZSgKKwkJCW1QYXJhbWV0ZXJXT2JqZWN0LCBPUl9XSUQyKCJ0cmFjZSIsICJUUkFDRSIpKTsKKwlpZiggKHRoZVRSQUNFICE9IFdPYmplY3Q6Ol9OVUxMXykgJiYgdGhlVFJBQ0UtPmhhc093bmVkRWxlbWVudCgpICkKKwl7CisJCWlmKCBjb25maWd1cmUodGhlVFJBQ0UsIGFUcmFjZUV4cHJlc3Npb24sIGFuRUQpICkKKwkJeworCQkJLy8hISBOT1RISU5HCisJCX0KKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCitib29sIFRyYWNlRmFjdG9yeTo6Y29uZmlndXJlKFdPYmplY3QgKiBhVHJhY2VTZXF1ZW5jZSwKKwkJQkZDb2xsZWN0aW9uICYgdHJhY2VQb2ludHMsIGNvbnN0IEV4ZWN1dGlvbkRhdGEgKiBhbkVEKQoreworCWlmKCBhVHJhY2VTZXF1ZW5jZSA9PSBXT2JqZWN0OjpfTlVMTF8gKQorCXsKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKwllbHNlIGlmKCBhVHJhY2VTZXF1ZW5jZS0+aGFzbm9Pd25lZEVsZW1lbnQoKSApCisJeworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKwltRUQgPSBhbkVEOworCisJV09iamVjdDo6Y29uc3RfaXRlcmF0b3IgaXRXZk8gPSBhVHJhY2VTZXF1ZW5jZS0+b3duZWRfYmVnaW4oKTsKKwlXT2JqZWN0Ojpjb25zdF9pdGVyYXRvciBlbmRXZk8gPSBhVHJhY2VTZXF1ZW5jZS0+b3duZWRfZW5kKCk7CisJZm9yKCA7IGl0V2ZPICE9IGVuZFdmTyA7ICsraXRXZk8gKQorCXsKKwkJaWYoICgqaXRXZk8pLT5pc1dQcm9wZXJ0eSgpICkKKwkJeworCQkJaWYoIGNvbmZpZ3VyZSh0cmFjZVBvaW50cywgKml0V2ZPICkgKQorCQkJeworCQkJCS8vISEgTk9USElORworCQkJfQorCQl9CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworYm9vbCBUcmFjZUZhY3Rvcnk6OmNvbmZpZ3VyZShXT2JqZWN0ICogYVRyYWNlU2VxdWVuY2UsCisJCVRyYWNlU2VxdWVuY2UgJiBhVHJhY2VFbGVtZW50LCBjb25zdCBFeGVjdXRpb25EYXRhICogYW5FRCkKK3sKKwlpZiggYVRyYWNlU2VxdWVuY2UgPT0gTlVMTCApCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCWVsc2UgaWYoIGFUcmFjZVNlcXVlbmNlLT5oYXNub093bmVkRWxlbWVudCgpICkKKwl7CisJCXJldHVybiggdHJ1ZSApOworCX0KKworCW1FRCA9IGFuRUQ7CisKKwlXT2JqZWN0Ojpjb25zdF9pdGVyYXRvciBpdFdmTyA9IGFUcmFjZVNlcXVlbmNlLT5vd25lZF9iZWdpbigpOworCVdPYmplY3Q6OmNvbnN0X2l0ZXJhdG9yIGVuZFdmTyA9IGFUcmFjZVNlcXVlbmNlLT5vd25lZF9lbmQoKTsKKworCWlmKCAoKml0V2ZPKS0+aXNXUHJvcGVydHkoKSApCisJeworCQlpZiggKCppdFdmTyktPmdldE5hbWVJRCgpID09ICJjb21iaW5hdG9yIiApCisJCXsKKwkJCWFUcmFjZUVsZW1lbnQuY29tYmluYXRvciA9IE9wZXJhdG9yTWFuYWdlcjo6dG9PcGVyYXRvcigKKwkJCQkJKCppdFdmTyktPnRvU3RyaW5nVmFsdWUoKSwKKwkJCQkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9PUiApOworCisJCQkrK2l0V2ZPOworCQl9CisJfQorCisJZm9yKCA7IGl0V2ZPICE9IGVuZFdmTyA7ICsraXRXZk8gKQorCXsKKwkJaWYoICgqaXRXZk8pLT5pc1dQcm9wZXJ0eSgpICkKKwkJeworCQkJaWYoIGNvbmZpZ3VyZShhVHJhY2VFbGVtZW50LnBvaW50cywgKml0V2ZPICkgKQorCQkJeworCQkJCS8vISEgTk9USElORworCQkJfQorCQl9CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworYm9vbCBUcmFjZUZhY3Rvcnk6OmNvbmZpZ3VyZShXT2JqZWN0ICogYVRyYWNlU2VxdWVuY2UsCisJCUF2bUNvZGUgKiBhVHJhY2VFeHByZXNzaW9uLCBjb25zdCBFeGVjdXRpb25EYXRhICogYW5FRCkKK3sKKwlpZiggYVRyYWNlU2VxdWVuY2UgPT0gTlVMTCApCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCWVsc2UgaWYoIGFUcmFjZVNlcXVlbmNlLT5oYXNub093bmVkRWxlbWVudCgpICkKKwl7CisJCXJldHVybiggdHJ1ZSApOworCX0KKworCW1FRCA9IGFuRUQ7CisKKwlXT2JqZWN0Ojpjb25zdF9pdGVyYXRvciBpdFdmTyA9IGFUcmFjZVNlcXVlbmNlLT5vd25lZF9iZWdpbigpOworCVdPYmplY3Q6OmNvbnN0X2l0ZXJhdG9yIGVuZFdmTyA9IGFUcmFjZVNlcXVlbmNlLT5vd25lZF9lbmQoKTsKKworCWlmKCAoKml0V2ZPKS0+aXNXUHJvcGVydHkoKSApCisJeworCQlpZiggKCppdFdmTyktPmdldE5hbWVJRCgpID09ICJjb21iaW5hdG9yIiApCisJCXsKKy8vCQkJYVRyYWNlRXhwcmVzc2lvbi0+c2V0T3BlcmF0b3IoIE9wZXJhdG9yTWFuYWdlcjo6dG9PcGVyYXRvcigKKy8vCQkJCQl3ZlByb3BlcnR5LT50b1N0cmluZ1ZhbHVlKCksIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfT1IpICk7CisKKwkJCUF2bUNvZGUgKiBzdWJGVFAgPSBuZXcgQXZtQ29kZSggT3BlcmF0b3JNYW5hZ2VyOjp0b09wZXJhdG9yKAorCQkJCQkoKml0V2ZPKS0+dG9TdHJpbmdWYWx1ZSgpLE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfT1IpICk7CisJCQlhVHJhY2VFeHByZXNzaW9uLT5hcHBlbmQoIEJGKHN1YkZUUCkgKTsKKwkJCWFUcmFjZUV4cHJlc3Npb24gPSBzdWJGVFA7CisKKwkJCSsraXRXZk87CisJCX0KKwl9CisKKwlmb3IoIDsgaXRXZk8gIT0gZW5kV2ZPIDsgKytpdFdmTyApCisJeworCQlpZiggKCppdFdmTyktPmlzV1Byb3BlcnR5KCkgKQorCQl7CisJCQlpZiggKCppdFdmTyktPmdldE5hbWVJRCgpID09ICJjb21iaW5hdG9yIiApCisJCQl7CisJCQkJQXZtQ29kZSAqIHN1YkZUUCA9IG5ldyBBdm1Db2RlKE9wZXJhdG9yTWFuYWdlcjo6dG9PcGVyYXRvcigKKwkJCQkJCSgqaXRXZk8pLT50b1N0cmluZ1ZhbHVlKCksCisJCQkJCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX09SKSApOworCQkJCWFUcmFjZUV4cHJlc3Npb24tPmFwcGVuZCggQkYoc3ViRlRQKSApOworCQkJCWFUcmFjZUV4cHJlc3Npb24gPSBzdWJGVFA7CisJCQl9CisKKwkJCWVsc2UgaWYoIGNvbmZpZ3VyZShhVHJhY2VFeHByZXNzaW9uLT5nZXRBcmdzKCksICppdFdmTykgKQorCQkJeworCQkJCS8vISEgTk9USElORworCQkJfQorCQl9CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworYm9vbCBUcmFjZUZhY3Rvcnk6OmNvbmZpZ3VyZSgKKwkJQkZDb2xsZWN0aW9uICYgdHJhY2VQb2ludHMsIFdPYmplY3QgKiB3ZlByb3BlcnR5KQoreworCUVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX05BVFVSRSBuYXR1cmUgPSB0b19uYXR1cmUoIHdmUHJvcGVydHktPmdldE5hbWVJRCgpICk7CisKKwlBVk1fT1BDT0RFIG9wTmF0dXJlID0gdG9fb3AoIHdmUHJvcGVydHktPmdldE5hbWVJRCgpICk7CisKKworCWlmKCAobmF0dXJlID09IEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1BBVEhfQ09ORElUSU9OX05BVFVSRSkKKwkJJiYgKG5hdHVyZSA9PSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9QQVRIX1RJTUVEX0NPTkRJVElPTl9OQVRVUkUpCisJCSYmIChuYXR1cmUgPT0gRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTk9ERV9DT05ESVRJT05fTkFUVVJFKQorCQkmJiAobmF0dXJlID09IEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX05PREVfVElNRURfQ09ORElUSU9OX05BVFVSRSkKKworCQkmJiAobmF0dXJlID09IEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1BBVEhfQ09ORElUSU9OX05BVFVSRV9MRUFGKQorCQkmJiAobmF0dXJlID09IEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1BBVEhfVElNRURfQ09ORElUSU9OX05BVFVSRV9MRUFGKQorCQkmJiAobmF0dXJlID09IEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX05PREVfQ09ORElUSU9OX05BVFVSRV9MRUFGKQorCQkmJiAobmF0dXJlID09IEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX05PREVfVElNRURfQ09ORElUSU9OX05BVFVSRV9MRUFGKSApCisJeworCQliZlRQID0gYVRyYWNlUG9pbnQgPSBuZXcgVHJhY2VQb2ludChuYXR1cmUsIEFWTV9PUENPREVfU0VMRUNUKTsKKworCQlpZiggbm90IGNvbmZpZ3VyZU5vZGVQYXRoQ29uZGl0aW9uKHRyYWNlUG9pbnRzLCB3ZlByb3BlcnR5LT5nZXRWYWx1ZSgpKSApCisJCXsKKwkJCXdmUHJvcGVydHktPndhcm5pbmdMb2NhdGlvbihBVk1fT1NfV0FSTikKKwkJCQkJPDwgIkZhaWxlZCB0byBjb25maWd1cmUgPE5vZGUgUGF0aCBDb25kaXRpb24+IHdpdGggdmFsdWU6ICIKKwkJCQkJPDwgd2ZQcm9wZXJ0eS0+dG9TdHJpbmdWYWx1ZSgpIDw8IHN0ZDo6ZW5kbDsKKwkJfQorCX0KKworCWVsc2UgaWYoIHdmUHJvcGVydHktPmhhc0J1aWx0aW5BcnJheVZhbHVlKCkgKQorCXsKKwkJaWYoIGNvbmZpZ3VyZUFycmF5KHRyYWNlUG9pbnRzLCB3ZlByb3BlcnR5LAorCQkJCXdmUHJvcGVydHktPmdldEJ1aWx0aW5BcnJheVZhbHVlKCksIG5hdHVyZSwgb3BOYXR1cmUpICkKKwkJeworCQkJLy8hISBOT1RISU5HCisJCX0KKwl9CisKKwllbHNlIGlmKCB3ZlByb3BlcnR5LT5oYXNBdm1Db2RlVmFsdWUoKSApCisJeworCQlpZiggKG5hdHVyZSA9PSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9GT1JNVUxBX05BVFVSRSkKKwkJCXx8IChuYXR1cmUgPT0gRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfQ09ORElUSU9OX05BVFVSRSkKKwkJCXx8IChuYXR1cmUgPT0gRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfREVDSVNJT05fTkFUVVJFKSApCisJCXsKKwkJCWJmVFAgPSBhVHJhY2VQb2ludCA9IG5ldyBUcmFjZVBvaW50KG5hdHVyZSwgQVZNX09QQ09ERV9DSEVDS19TQVQpOworCisJCQlpZiggbm90IGNvbmZpZ3VyZUZvcm11bGEodHJhY2VQb2ludHMsIHdmUHJvcGVydHktPmdldFZhbHVlKCkpICkKKwkJCXsKKwkJCQl3ZlByb3BlcnR5LT53YXJuaW5nTG9jYXRpb24oQVZNX09TX1dBUk4pCisJCQkJCQk8PCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSA8IEZvcm11bGEgPiB3aXRoIHZhbHVlOiAiCisJCQkJCQk8PCB3ZlByb3BlcnR5LT50b1N0cmluZ1ZhbHVlKCkgPDwgc3RkOjplbmRsOworCQkJfQorCQl9CisJCWVsc2UgaWYoIGNvbmZpZ3VyZUV4cHJlc3Npb24odHJhY2VQb2ludHMsIHdmUHJvcGVydHksCisJCQkJd2ZQcm9wZXJ0eS0+Z2V0QXZtQ29kZVZhbHVlKCksIG5hdHVyZSwgb3BOYXR1cmUpICkKKwkJeworCQkJLy8hISBOT1RISU5HCisJCX0KKwl9CisKKwllbHNlCisJeworCQlpZiggbmF0dXJlICE9IEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1VOREVGSU5FRF9OQVRVUkUgKQorCQl7CisJCQlpZiggY29uZmlndXJlKHRyYWNlUG9pbnRzLCB3ZlByb3BlcnR5LAorCQkJCQluYXR1cmUsIHdmUHJvcGVydHktPnRvU3RyaW5nVmFsdWUoKSkgKQorCQkJeworCQkJCS8vISEgTk9USElORworCQkJfQorCQl9CisJCWVsc2UgaWYoIG9wTmF0dXJlICE9IEFWTV9PUENPREVfTlVMTCApCisJCXsKKwkJCWlmKCBjb25maWd1cmUodHJhY2VQb2ludHMsIHdmUHJvcGVydHksCisJCQkJCW9wTmF0dXJlLCB3ZlByb3BlcnR5LT50b1N0cmluZ1ZhbHVlKCkpICkKKwkJCXsKKwkJCQkvLyEhIE5PVEhJTkcKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKK2Jvb2wgVHJhY2VGYWN0b3J5Ojpjb25maWd1cmUoCisJCUJGQ29sbGVjdGlvbiAmIHRyYWNlUG9pbnRzLCBXT2JqZWN0ICogd2ZQcm9wZXJ0eSwKKwkJRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTkFUVVJFIG5hdHVyZSwgY29uc3Qgc3RkOjpzdHJpbmcgJiBvYmplY3QpCit7CisJc3dpdGNoKCBuYXR1cmUgKQorCXsKKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9DT01fTkFUVVJFOgorCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX0NIQU5ORUxfTkFUVVJFOgorCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX01FU1NBR0VfTkFUVVJFOgorCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1BPUlRfTkFUVVJFOgorCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1NJR05BTF9OQVRVUkU6CisJCXsKKwkJCWJmVFAgPSBhVHJhY2VQb2ludCA9IG5ldyBUcmFjZVBvaW50KG5hdHVyZSwgQVZNX09QQ09ERV9OVUxMKTsKKworCQkJaWYoIG5vdCBjb25maWd1cmVQb3J0KHRyYWNlUG9pbnRzLCBvYmplY3QpICkKKwkJCXsKKwkJCQl3ZlByb3BlcnR5LT53YXJuaW5nTG9jYXRpb24oQVZNX09TX1dBUk4pCisJCQkJCQk8PCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSA8IFBvcnQgPiB3aXRoIHZhbHVlOiAiCisJCQkJCQk8PCB3ZlByb3BlcnR5LT50b1N0cmluZ1ZhbHVlKCkgPDwgc3RkOjplbmRsOworCQkJfQorCisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfVElNRV9OQVRVUkU6CisJCXsKKwkJCWJmVFAgPSBhVHJhY2VQb2ludCA9IG5ldyBUcmFjZVBvaW50KG5hdHVyZSwgQVZNX09QQ09ERV9BU1NJR04pOworCisJCQlpZiggbm90IGNvbmZpZ3VyZVRpbWUodHJhY2VQb2ludHMsIG9iamVjdCkgKQorCQkJeworCQkJCXdmUHJvcGVydHktPndhcm5pbmdMb2NhdGlvbihBVk1fT1NfV0FSTikKKwkJCQkJCTw8ICJGYWlsZWQgdG8gY29uZmlndXJlIDwgVGltZSA+IHdpdGggdmFsdWU6ICIKKwkJCQkJCTw8IHdmUHJvcGVydHktPnRvU3RyaW5nVmFsdWUoKSA8PCBzdGQ6OmVuZGw7CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9WQVJJQUJMRV9OQVRVUkU6CisJCXsKKwkJCWJmVFAgPSBhVHJhY2VQb2ludCA9IG5ldyBUcmFjZVBvaW50KG5hdHVyZSwgQVZNX09QQ09ERV9BU1NJR04pOworCisJCQlpZiggbm90IGNvbmZpZ3VyZVZhcmlhYmxlKHRyYWNlUG9pbnRzLCBvYmplY3QpICkKKwkJCXsKKwkJCQl3ZlByb3BlcnR5LT53YXJuaW5nTG9jYXRpb24oQVZNX09TX1dBUk4pCisJCQkJCQk8PCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSA8IFZhcmlhYmxlID4gd2l0aCB2YWx1ZTogIgorCQkJCQkJPDwgd2ZQcm9wZXJ0eS0+dG9TdHJpbmdWYWx1ZSgpIDw8IHN0ZDo6ZW5kbDsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX0JVRkZFUl9OQVRVUkU6CisJCXsKKwkJCWJmVFAgPSBhVHJhY2VQb2ludCA9IG5ldyBUcmFjZVBvaW50KG5hdHVyZSwgQVZNX09QQ09ERV9OVUxMKTsKKworCQkJaWYoIG5vdCBjb25maWd1cmVCdWZmZXIodHJhY2VQb2ludHMsIG9iamVjdCkgKQorCQkJeworCQkJCXdmUHJvcGVydHktPndhcm5pbmdMb2NhdGlvbihBVk1fT1NfV0FSTikKKwkJCQkJCTw8ICJGYWlsZWQgdG8gY29uZmlndXJlIDwgQnVmZmVyID4gd2l0aCB2YWx1ZTogIgorCQkJCQkJPDwgd2ZQcm9wZXJ0eS0+dG9TdHJpbmdWYWx1ZSgpIDw8IHN0ZDo6ZW5kbDsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX0ZPUk1VTEFfTkFUVVJFOgorCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX0NPTkRJVElPTl9OQVRVUkU6CisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfREVDSVNJT05fTkFUVVJFOgorCQl7CisJCQliZlRQID0gYVRyYWNlUG9pbnQgPSBuZXcgVHJhY2VQb2ludChuYXR1cmUsIEFWTV9PUENPREVfQ0hFQ0tfU0FUKTsKKworCQkJaWYoIG5vdCBjb25maWd1cmVGb3JtdWxhKHRyYWNlUG9pbnRzLCB3ZlByb3BlcnR5LT5nZXRWYWx1ZSgpKSApCisJCQl7CisJCQkJd2ZQcm9wZXJ0eS0+d2FybmluZ0xvY2F0aW9uKEFWTV9PU19XQVJOKQorCQkJCQkJPDwgIkZhaWxlZCB0byBjb25maWd1cmUgPCBGb3JtdWxhID4gd2l0aCB2YWx1ZTogIgorCQkJCQkJPDwgd2ZQcm9wZXJ0eS0+dG9TdHJpbmdWYWx1ZSgpIDw8IHN0ZDo6ZW5kbDsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1BBVEhfQ09ORElUSU9OX05BVFVSRToKKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9OT0RFX0NPTkRJVElPTl9OQVRVUkU6CisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfUEFUSF9USU1FRF9DT05ESVRJT05fTkFUVVJFOgorCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX05PREVfVElNRURfQ09ORElUSU9OX05BVFVSRToKKworCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1BBVEhfQ09ORElUSU9OX05BVFVSRV9MRUFGOgorCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX05PREVfQ09ORElUSU9OX05BVFVSRV9MRUFGOgorCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1BBVEhfVElNRURfQ09ORElUSU9OX05BVFVSRV9MRUFGOgorCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX05PREVfVElNRURfQ09ORElUSU9OX05BVFVSRV9MRUFGOgorCQl7CisJCQliZlRQID0gYVRyYWNlUG9pbnQgPSBuZXcgVHJhY2VQb2ludChuYXR1cmUsIEFWTV9PUENPREVfU0VMRUNUKTsKKworCQkJaWYoIG5vdCBjb25maWd1cmVOb2RlUGF0aENvbmRpdGlvbih0cmFjZVBvaW50cywgd2ZQcm9wZXJ0eS0+Z2V0VmFsdWUoKSkgKQorCQkJeworCQkJCXdmUHJvcGVydHktPndhcm5pbmdMb2NhdGlvbihBVk1fT1NfV0FSTikKKwkJCQkJCTw8ICJGYWlsZWQgdG8gY29uZmlndXJlIDwgTm9kZSBQYXRoIENvbmRpdGlvbiA+IHdpdGggdmFsdWU6ICIKKwkJCQkJCTw8IHdmUHJvcGVydHktPnRvU3RyaW5nVmFsdWUoKSA8PCBzdGQ6OmVuZGw7CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9NQUNISU5FX05BVFVSRToKKwkJeworCQkJYmZUUCA9IGFUcmFjZVBvaW50ID0gbmV3IFRyYWNlUG9pbnQobmF0dXJlLCBBVk1fT1BDT0RFX1JVTik7CisKKwkJCWlmKCBub3QgY29uZmlndXJlTWFjaGluZSh0cmFjZVBvaW50cywgb2JqZWN0KSApCisJCQl7CisJCQkJd2ZQcm9wZXJ0eS0+d2FybmluZ0xvY2F0aW9uKEFWTV9PU19XQVJOKQorCQkJCQkJPDwgIkZhaWxlZCB0byBjb25maWd1cmUgPCBNYWNoaW5lID4gd2l0aCB2YWx1ZTogIgorCQkJCQkJPDwgd2ZQcm9wZXJ0eS0+dG9TdHJpbmdWYWx1ZSgpIDw8IHN0ZDo6ZW5kbDsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1NUQVRFTUFDSElORV9OQVRVUkU6CisJCXsKKwkJCWJmVFAgPSBhVHJhY2VQb2ludCA9IG5ldyBUcmFjZVBvaW50KG5hdHVyZSwgQVZNX09QQ09ERV9OVUxMKTsKKworCQkJaWYoIG5vdCBjb25maWd1cmVTdGF0ZW1hY2hpbmUodHJhY2VQb2ludHMsIG9iamVjdCkgKQorCQkJeworCQkJCXdmUHJvcGVydHktPndhcm5pbmdMb2NhdGlvbihBVk1fT1NfV0FSTikKKwkJCQkJCTw8ICJGYWlsZWQgdG8gY29uZmlndXJlIDwgU3RhdGVtYWNoaW5lID4gd2l0aCB2YWx1ZTogIgorCQkJCQkJPDwgd2ZQcm9wZXJ0eS0+dG9TdHJpbmdWYWx1ZSgpIDw8IHN0ZDo6ZW5kbDsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1NUQVRFX05BVFVSRToKKwkJeworCQkJYmZUUCA9IGFUcmFjZVBvaW50ID0gbmV3IFRyYWNlUG9pbnQobmF0dXJlLAorCQkJCQlBVk1fT1BDT0RFX05VTEwgLypBVk1fT1BDT0RFX0VOQUJMRV9TRVQqLyk7CisKKwkJCWlmKCBub3QgY29uZmlndXJlU3RhdGUodHJhY2VQb2ludHMsIG9iamVjdCkgKQorCQkJeworCQkJCXdmUHJvcGVydHktPndhcm5pbmdMb2NhdGlvbihBVk1fT1NfV0FSTikKKwkJCQkJCTw8ICJGYWlsZWQgdG8gY29uZmlndXJlIDwgU3RhdGUgPiB3aXRoIHZhbHVlOiAiCisJCQkJCQk8PCB3ZlByb3BlcnR5LT50b1N0cmluZ1ZhbHVlKCkgPDwgc3RkOjplbmRsOworCQkJfQorCisJCQlicmVhazsKKwkJfQorCisKKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9UUkFOU0lUSU9OX05BVFVSRToKKwkJeworCQkJYmZUUCA9IGFUcmFjZVBvaW50ID0KKwkJCQkJbmV3IFRyYWNlUG9pbnQobmF0dXJlLCBBVk1fT1BDT0RFX0lOVk9LRV9UUkFOU0lUSU9OKTsKKworCQkJaWYoIG5vdCBjb25maWd1cmVUcmFuc2l0aW9uKHRyYWNlUG9pbnRzLCBvYmplY3QpICkKKwkJCXsKKwkJCQl3ZlByb3BlcnR5LT53YXJuaW5nTG9jYXRpb24oQVZNX09TX1dBUk4pCisJCQkJCQk8PCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSA8IFRyYW5zaXRpb24gPiB3aXRoIHZhbHVlOiAiCisJCQkJCQk8PCB3ZlByb3BlcnR5LT50b1N0cmluZ1ZhbHVlKCkgPDwgc3RkOjplbmRsOworCQkJfQorCisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfUk9VVElORV9OQVRVUkU6CisJCXsKKwkJCWJmVFAgPSBhVHJhY2VQb2ludCA9IG5ldyBUcmFjZVBvaW50KG5hdHVyZSk7CisvLwkJCQkJbmV3IFRyYWNlUG9pbnQobmF0dXJlLCBBVk1fT1BDT0RFX0lOVk9LRV9ST1VUSU5FKTsKKworCQkJaWYoIG5vdCBjb25maWd1cmVSb3V0aW5lKHRyYWNlUG9pbnRzLCBvYmplY3QpICkKKwkJCXsKKwkJCQl3ZlByb3BlcnR5LT53YXJuaW5nTG9jYXRpb24oQVZNX09TX1dBUk4pCisJCQkJCQk8PCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSA8IFJvdXRpbmUgPiB3aXRoIHZhbHVlOiAiCisJCQkJCQk8PCB3ZlByb3BlcnR5LT50b1N0cmluZ1ZhbHVlKCkgPDwgc3RkOjplbmRsOworCQkJfQorCisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfUlVOTkFCTEVfTkFUVVJFOgorCQl7CisJCQliZlRQID0gYVRyYWNlUG9pbnQgPSBuZXcgVHJhY2VQb2ludChuYXR1cmUpOworCisJCQlpZiggbm90IGNvbmZpZ3VyZVJ1bm5hYmxlKHRyYWNlUG9pbnRzLCBvYmplY3QpICkKKwkJCXsKKwkJCQl3ZlByb3BlcnR5LT53YXJuaW5nTG9jYXRpb24oQVZNX09TX1dBUk4pCisJCQkJCQk8PCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSA8IFJ1bm5hYmxlID4gd2l0aCB2YWx1ZTogIgorCQkJCQkJPDwgd2ZQcm9wZXJ0eS0+dG9TdHJpbmdWYWx1ZSgpIDw8IHN0ZDo6ZW5kbDsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX0NPTVBPU0lURV9OQVRVUkU6CisJCXsKKwkJCWJmVFAgPSBhVHJhY2VQb2ludCA9IG5ldyBUcmFjZVBvaW50KG5hdHVyZSwgQVZNX09QQ09ERV9OVUxMKTsKKworCQkJaWYoIG5vdCBjb25maWd1cmVDb21wb3NpdGUodHJhY2VQb2ludHMsIG9iamVjdCkgKQorCQkJeworCQkJCXdmUHJvcGVydHktPndhcm5pbmdMb2NhdGlvbihBVk1fT1NfV0FSTikKKwkJCQkJCTw8ICJGYWlsZWQgdG8gY29uZmlndXJlIDwgQ29tcG9zaXRlID4gd2l0aCB2YWx1ZTogIgorCQkJCQkJPDwgd2ZQcm9wZXJ0eS0+dG9TdHJpbmdWYWx1ZSgpIDw8IHN0ZDo6ZW5kbDsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmKCAobUVEICE9IE5VTEwpICYmIChhVHJhY2VQb2ludCAhPSBOVUxMKSApCisJeworCQlhVHJhY2VQb2ludC0+dXBkYXRlUklEKCAqbUVEICk7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworYm9vbCBUcmFjZUZhY3Rvcnk6OmNvbmZpZ3VyZSgKKwkJQkZDb2xsZWN0aW9uICYgdHJhY2VQb2ludHMsIFdPYmplY3QgKiB3ZlByb3BlcnR5LAorCQlBVk1fT1BDT0RFIG9wTmF0dXJlLCBjb25zdCBzdGQ6OnN0cmluZyAmIG9iamVjdCkKK3sKKwlzd2l0Y2goIG9wTmF0dXJlICkKKwl7CisJCWNhc2UgQVZNX09QQ09ERV9JTlBVVDoKKwkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUX0VOVjoKKwkJY2FzZSBBVk1fT1BDT0RFX09VVFBVVDoKKwkJY2FzZSBBVk1fT1BDT0RFX09VVFBVVF9FTlY6CisJCXsKKwkJCWJmVFAgPSBhVHJhY2VQb2ludCA9IG5ldyBUcmFjZVBvaW50KAorCQkJCQlFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9DT01fTkFUVVJFLCBvcE5hdHVyZSk7CisKKwkJCWlmKCBub3QgY29uZmlndXJlUG9ydCh0cmFjZVBvaW50cywgb2JqZWN0KSApCisJCQl7CisJCQkJd2ZQcm9wZXJ0eS0+d2FybmluZ0xvY2F0aW9uKEFWTV9PU19XQVJOKQorCQkJCQkJPDwgIkZhaWxlZCB0byBjb25maWd1cmUgPCBQb3J0ID4gd2l0aCB2YWx1ZTogIgorCQkJCQkJPDwgd2ZQcm9wZXJ0eS0+dG9TdHJpbmdWYWx1ZSgpIDw8IHN0ZDo6ZW5kbDsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEFWTV9PUENPREVfVElNRURfR1VBUkQ6CisJCXsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBBVk1fT1BDT0RFX0FTU0lHTjoKKwkJY2FzZSBBVk1fT1BDT0RFX0FTU0lHTl9ORVdGUkVTSDoKKwkJeworCQkJYmZUUCA9IGFUcmFjZVBvaW50ID0gbmV3IFRyYWNlUG9pbnQoCisJCQkJCUVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1ZBUklBQkxFX05BVFVSRSwgb3BOYXR1cmUpOworCisJCQlpZiggbm90IGNvbmZpZ3VyZVZhcmlhYmxlKHRyYWNlUG9pbnRzLCBvYmplY3QpICkKKwkJCXsKKwkJCQl3ZlByb3BlcnR5LT53YXJuaW5nTG9jYXRpb24oQVZNX09TX1dBUk4pCisJCQkJCQk8PCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSA8IFZhcmlhYmxlID4gd2l0aCB2YWx1ZTogIgorCQkJCQkJPDwgd2ZQcm9wZXJ0eS0+dG9TdHJpbmdWYWx1ZSgpIDw8IHN0ZDo6ZW5kbDsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmKCAobUVEICE9IE5VTEwpICYmIChhVHJhY2VQb2ludCAhPSBOVUxMKSApCisJeworCQlhVHJhY2VQb2ludC0+dXBkYXRlUklEKCAqbUVEICk7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworYm9vbCBUcmFjZUZhY3Rvcnk6OmNvbmZpZ3VyZUFycmF5KEJGQ29sbGVjdGlvbiAmIHRyYWNlUG9pbnRzLAorCQlXT2JqZWN0ICogd2ZQcm9wZXJ0eSwgQnVpbHRpbkFycmF5ICogYW5BcnJheSwKKwkJRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTkFUVVJFIG5hdHVyZSwgQVZNX09QQ09ERSBvcE5hdHVyZSkKK3sKKwlCRlZlY3RvciB0cEFycmF5OworCisJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDAgOyBvZmZzZXQgPCBhbkFycmF5LT5zaXplKCkgOyArK29mZnNldCApCisJeworCQlpZiggbmF0dXJlICE9IEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1VOREVGSU5FRF9OQVRVUkUgKQorCQl7CisJCQlpZiggY29uZmlndXJlKHRwQXJyYXksIHdmUHJvcGVydHksIG5hdHVyZSwKKwkJCQkJd2ZQcm9wZXJ0eS0+dG9TdHJpbmdWYWx1ZShhbkFycmF5LCBvZmZzZXQpKSApCisJCQl7CisJCQkJLy8hISBOT1RISU5HCisJCQl9CisJCX0KKwkJZWxzZSBpZiggb3BOYXR1cmUgIT0gQVZNX09QQ09ERV9OVUxMICkKKwkJeworCQkJaWYoIGNvbmZpZ3VyZSh0cEFycmF5LCB3ZlByb3BlcnR5LCBvcE5hdHVyZSwKKwkJCQkJd2ZQcm9wZXJ0eS0+dG9TdHJpbmdWYWx1ZShhbkFycmF5LCBvZmZzZXQpKSApCisJCQl7CisJCQkJLy8hISBOT1RISU5HCisJCQl9CisJCX0KKwl9CisKKwlpZiggdHBBcnJheS5zaW5nbGV0b24oKSApCisJeworCQl0cmFjZVBvaW50cy5hcHBlbmQoIHRwQXJyYXlbMF0gKTsKKwl9CisJZWxzZSBpZiggdHBBcnJheS5wb3B1bGF0ZWQoKSApCisJeworCQliZlRQID0gYVRyYWNlUG9pbnQgPSBuZXcgVHJhY2VQb2ludCgKKwkJCQlFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9DT01QT1NJVEVfTkFUVVJFLCBBVk1fT1BDT0RFX0FORCk7CisJCWFUcmFjZVBvaW50LT50cGlkID0gKytUUF9JRDsKKwkJYVRyYWNlUG9pbnQtPnZhbHVlID0gQkYoIG5ldyBBcnJheUJGKHRwQXJyYXkpICk7CisKKwkJdHJhY2VQb2ludHMuYXBwZW5kKCBiZlRQICk7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworYm9vbCBUcmFjZUZhY3Rvcnk6OmNvbmZpZ3VyZUV4cHJlc3Npb24oQkZDb2xsZWN0aW9uICYgdHJhY2VQb2ludHMsCisJCVdPYmplY3QgKiB3ZlByb3BlcnR5LCBBdm1Db2RlICogYUNvZGUsCisJCUVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX05BVFVSRSBuYXR1cmUsIEFWTV9PUENPREUgb3BOYXR1cmUpCit7CisJQkZWZWN0b3IgdHBBcnJheTsKKworCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0QXJnID0gYUNvZGUtPmJlZ2luKCk7CisJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kQXJnID0gYUNvZGUtPmVuZCgpOworCWZvciggOyBpdEFyZyAhPSBlbmRBcmcgOyArK2l0QXJnICkKKwl7CisJCWlmKCAoKml0QXJnKS5pczwgQXZtQ29kZSA+KCkgKQorCQl7CisJCQlpZiggY29uZmlndXJlRXhwcmVzc2lvbih0cEFycmF5LCB3ZlByb3BlcnR5LAorCQkJCQkoKml0QXJnKS50b19wdHI8IEF2bUNvZGUgPigpLCBuYXR1cmUsIG9wTmF0dXJlKSApCisJCQl7CisJCQkJLy8hISBOT1RISU5HCisJCQl9CisJCX0KKwkJZWxzZSBpZiggbmF0dXJlICE9IEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1VOREVGSU5FRF9OQVRVUkUgKQorCQl7CisJCQlpZiggY29uZmlndXJlKHRwQXJyYXksIHdmUHJvcGVydHksCisJCQkJCW5hdHVyZSwgd2ZQcm9wZXJ0eS0+dG9TdHJpbmdWYWx1ZSgqaXRBcmcpKSApCisJCQl7CisJCQkJLy8hISBOT1RISU5HCisJCQl9CisJCX0KKwkJZWxzZSBpZiggb3BOYXR1cmUgIT0gQVZNX09QQ09ERV9OVUxMICkKKwkJeworCQkJaWYoIGNvbmZpZ3VyZSh0cEFycmF5LCB3ZlByb3BlcnR5LAorCQkJCQlvcE5hdHVyZSwgd2ZQcm9wZXJ0eS0+dG9TdHJpbmdWYWx1ZSgqaXRBcmcpKSApCisJCQl7CisJCQkJLy8hISBOT1RISU5HCisJCQl9CisJCX0KKwl9CisKKwlpZiggdHBBcnJheS5zaW5nbGV0b24oKSApCisJeworCQl0cmFjZVBvaW50cy5hcHBlbmQoIHRwQXJyYXlbMF0gKTsKKwl9CisJZWxzZSBpZiggdHBBcnJheS5wb3B1bGF0ZWQoKSApCisJeworCQliZlRQID0gYVRyYWNlUG9pbnQgPSBuZXcgVHJhY2VQb2ludCgKKwkJCQlFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9DT01QT1NJVEVfTkFUVVJFLAorCQkJCWFDb2RlLT5nZXRBdm1PcENvZGUoKSk7CisJCWFUcmFjZVBvaW50LT50cGlkID0gKytUUF9JRDsKKwkJYVRyYWNlUG9pbnQtPnZhbHVlID0gQkYoIG5ldyBBcnJheUJGKHRwQXJyYXkpICk7CisKKwkJdHJhY2VQb2ludHMuYXBwZW5kKCBiZlRQICk7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworCitib29sIFRyYWNlRmFjdG9yeTo6Y29uZmlndXJlQ29tcG9zaXRlKAorCQlCRkNvbGxlY3Rpb24gJiB0cmFjZVBvaW50cywgY29uc3Qgc3RkOjpzdHJpbmcgJiBvYmplY3QpCit7CisJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDAgOyBvZmZzZXQgPCBtRGVjbGFyZWRQb2ludC5zaXplKCkgOyArK29mZnNldCApCisJeworCQlpZiggbURlY2xhcmVkUG9pbnRJRFtvZmZzZXRdID09IG9iamVjdCApCisJCXsKKwkJCXRyYWNlUG9pbnRzLmFwcGVuZCggbURlY2xhcmVkUG9pbnRbb2Zmc2V0XSApOworCisJCQkvLyBpZiBicmVhazogYXBwZW5kIGZpcnN0IGVsc2U6IGFueSBQb2ludCB3aXRoIHRoaXMgSUQKKy8vCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisKK2Jvb2wgVHJhY2VGYWN0b3J5Ojpjb25maWd1cmVQb3J0KAorCQlCRkNvbGxlY3Rpb24gJiB0cmFjZVBvaW50cywgY29uc3Qgc3RkOjpzdHJpbmcgJiBvYmplY3QpCit7CisJb3RoZXJUcmFjZVBvaW50LmNsZWFyKCk7CisKKwlpZiggYVRyYWNlUG9pbnQtPmNvbmZpZ3VyZVBvcnQobUNvbmZpZ3VyYXRpb24sIG9iamVjdCwgb3RoZXJUcmFjZVBvaW50KSApCisJeworCQlhVHJhY2VQb2ludC0+dHBpZCA9ICsrVFBfSUQ7CisKKwkJbGlzdE9mUG9ydFRyYWNlUG9pbnQuYXBwZW5kKCBhVHJhY2VQb2ludCApOworCQlsaXN0T2ZQb3J0VHJhY2VQb2ludC5hcHBlbmQoIG90aGVyVHJhY2VQb2ludCApOworCisJCXRyYWNlUG9pbnRzLmFwcGVuZCggYmZUUCApOworCQl3aGlsZSggb3RoZXJUcmFjZVBvaW50Lm5vbmVtcHR5KCkgKQorCQl7CisJCQlvdGhlclRyYWNlUG9pbnQuZnJvbnQoKS0+dHBpZCA9ICsrVFBfSUQ7CisKKwkJCXRyYWNlUG9pbnRzLmFwcGVuZCggQkYob3RoZXJUcmFjZVBvaW50LmZyb250KCkpICk7CisJCQlvdGhlclRyYWNlUG9pbnQucG9wX2Zyb250KCk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKK2Jvb2wgVHJhY2VGYWN0b3J5Ojpjb25maWd1cmVUaW1lKAorCQlCRkNvbGxlY3Rpb24gJiB0cmFjZVBvaW50cywgY29uc3Qgc3RkOjpzdHJpbmcgJiBvYmplY3QpCit7CisJaWYoIE5hbWVkRWxlbWVudDo6ZnFuU3RhcnRzV2l0aChvYmplY3QsICJ0aW1lIiApIHx8CisJCU5hbWVkRWxlbWVudDo6ZnFuU3RhcnRzV2l0aChvYmplY3QsICIkdGltZSIpIHx8CisJCU5hbWVkRWxlbWVudDo6ZnFuU3RhcnRzV2l0aChvYmplY3QsICIjdGltZSIpICkKKwl7CisJCWFUcmFjZVBvaW50LT50cGlkID0gKytUUF9JRDsKKwkJYVRyYWNlUG9pbnQtPm9wID0gQVZNX09QQ09ERV9USU1FRF9HVUFSRDsKKwkJYVRyYWNlUG9pbnQtPm9iamVjdCA9IG1WYXJUaW1lOworCisJCXRyYWNlUG9pbnRzLmFwcGVuZCggYmZUUCApOworCX0KKwllbHNlIGlmKCBhVHJhY2VQb2ludC0+Y29uZmlndXJlVmFyaWFibGUobUNvbmZpZ3VyYXRpb24sIG9iamVjdCkgKQorCXsKKwkJYVRyYWNlUG9pbnQtPnRwaWQgPSArK1RQX0lEOworCQlhVHJhY2VQb2ludC0+b3AgPSBBVk1fT1BDT0RFX1RJTUVEX0dVQVJEOworCQltVmFyVGltZSA9IGFUcmFjZVBvaW50LT5vYmplY3QtPnRvPCBJbnN0YW5jZU9mRGF0YSA+KCk7CisKKwkJbGlzdE9mVmFyaWFibGVUcmFjZVBvaW50LmFwcGVuZCggYVRyYWNlUG9pbnQgKTsKKworCQl0cmFjZVBvaW50cy5hcHBlbmQoIGJmVFAgKTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKK2Jvb2wgVHJhY2VGYWN0b3J5Ojpjb25maWd1cmVWYXJpYWJsZSgKKwkJQkZDb2xsZWN0aW9uICYgdHJhY2VQb2ludHMsIGNvbnN0IHN0ZDo6c3RyaW5nICYgb2JqZWN0KQoreworCWlmKCBOYW1lZEVsZW1lbnQ6OmZxblN0YXJ0c1dpdGgob2JqZWN0LCAidGltZSIgKSB8fAorCQlOYW1lZEVsZW1lbnQ6OmZxblN0YXJ0c1dpdGgob2JqZWN0LCAiJHRpbWUiKSB8fAorCQlOYW1lZEVsZW1lbnQ6OmZxblN0YXJ0c1dpdGgob2JqZWN0LCAiI3RpbWUiKSApCisJeworCQlhVHJhY2VQb2ludC0+dHBpZCA9ICsrVFBfSUQ7CisJCWFUcmFjZVBvaW50LT5uYXR1cmUgPSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9USU1FX05BVFVSRTsKKwkJYVRyYWNlUG9pbnQtPm9wICAgICA9IEFWTV9PUENPREVfVElNRURfR1VBUkQ7CisJCWFUcmFjZVBvaW50LT5vYmplY3QgPSBtVmFyVGltZTsKKworCQl0cmFjZVBvaW50cy5hcHBlbmQoIGJmVFAgKTsKKwl9CisJZWxzZSBpZiggYVRyYWNlUG9pbnQtPmNvbmZpZ3VyZVZhcmlhYmxlKG1Db25maWd1cmF0aW9uLCBvYmplY3QpICkKKwl7CisJCWFUcmFjZVBvaW50LT50cGlkID0gKytUUF9JRDsKKworCQlsaXN0T2ZWYXJpYWJsZVRyYWNlUG9pbnQuYXBwZW5kKCBhVHJhY2VQb2ludCApOworCisJCXRyYWNlUG9pbnRzLmFwcGVuZCggYmZUUCApOworCX0KKwllbHNlCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworYm9vbCBUcmFjZUZhY3Rvcnk6OmNvbmZpZ3VyZUJ1ZmZlcigKKwkJQkZDb2xsZWN0aW9uICYgdHJhY2VQb2ludHMsIGNvbnN0IHN0ZDo6c3RyaW5nICYgb2JqZWN0KQoreworCWlmKCBhVHJhY2VQb2ludC0+Y29uZmlndXJlQnVmZmVyKG1Db25maWd1cmF0aW9uLCBvYmplY3QpICkKKwl7CisJCWFUcmFjZVBvaW50LT50cGlkID0gKytUUF9JRDsKKwkJdHJhY2VQb2ludHMuYXBwZW5kKCBiZlRQICk7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCitib29sIFRyYWNlRmFjdG9yeTo6Y29uZmlndXJlRm9ybXVsYSgKKwkJQkZDb2xsZWN0aW9uICYgdHJhY2VQb2ludHMsIGNvbnN0IEJGICYgb2JqZWN0KQoreworCWFUcmFjZVBvaW50LT50cGlkID0gKytUUF9JRDsKKworLy8JYVRyYWNlUG9pbnQtPnZhbHVlID0gRU5WLmdldEJ1aWxkZXIoKS5jb21waWxlRXhwcmVzc2lvbigKKy8vCQkJbUNvbmZpZ3VyYXRpb24uZ2V0RXhlY3V0YWJsZVN5c3RlbSgpCisvLwkJCS5nZXRTeXN0ZW1JbnN0YW5jZSgpLmdldEV4ZWN1dGFibGUoKSwgb2JqZWN0KTsKKworCUVOVi5nZXRCdWlsZGVyKCkucmVzZXRFcnJvcldhcm5pbmcoKTsKKworCWFUcmFjZVBvaW50LT52YWx1ZSA9IEVOVi5nZXRCdWlsZGVyKCkuCisJCQljb21waWxlRXhwcmVzc2lvbihtTG9jYWxFeGVjdXRhYmxlRm9ybSwgb2JqZWN0KTsKKworCWlmKCBub3QgRU5WLmdldEJ1aWxkZXIoKS5oYXNFcnJvcigpICkKKwl7CisJCXRyYWNlUG9pbnRzLmFwcGVuZCggYmZUUCApOworCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKKyNkZWZpbmUgTEVBRl9OT0RFX1JFR0VYX1BBVFRFUk4gICAgICJcXFM/KGxlYWZ8ZW5kfGxhc3R8dGFpbClcXFM/IgorCisjZGVmaW5lIExFQUZfTk9ERV9ERUZBVUxUX1BBVFRFUk4gICAiOmxlYWY6IgorCitib29sIFRyYWNlRmFjdG9yeTo6Y29uZmlndXJlTm9kZVBhdGhDb25kaXRpb24oCisJCUJGQ29sbGVjdGlvbiAmIHRyYWNlUG9pbnRzLCBjb25zdCBCRiAmIG9iamVjdCkKK3sKKwlpZiggUkVHRVhfTUFUQ0goIG9iamVjdC50b0J1aWx0aW5TdHJpbmcoKSAsIExFQUZfTk9ERV9SRUdFWF9QQVRURVJOICkgKQorCXsKKwkJc3dpdGNoKCBhVHJhY2VQb2ludC0+bmF0dXJlICkKKwkJeworCQkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9QQVRIX0NPTkRJVElPTl9OQVRVUkU6CisJCQl7CisJCQkJYVRyYWNlUG9pbnQtPm5hdHVyZSA9CisJCQkJCQlFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9QQVRIX0NPTkRJVElPTl9OQVRVUkVfTEVBRjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTk9ERV9DT05ESVRJT05fTkFUVVJFOgorCQkJeworCQkJCWFUcmFjZVBvaW50LT5uYXR1cmUgPQorCQkJCQkJRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTk9ERV9DT05ESVRJT05fTkFUVVJFX0xFQUY7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1BBVEhfVElNRURfQ09ORElUSU9OX05BVFVSRToKKwkJCXsKKwkJCQlhVHJhY2VQb2ludC0+bmF0dXJlID0KKwkJCQkJCUVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1BBVEhfVElNRURfQ09ORElUSU9OX05BVFVSRV9MRUFGOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9OT0RFX1RJTUVEX0NPTkRJVElPTl9OQVRVUkU6CisJCQl7CisJCQkJYVRyYWNlUG9pbnQtPm5hdHVyZSA9CisJCQkJCQlFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9OT0RFX1RJTUVEX0NPTkRJVElPTl9OQVRVUkVfTEVBRjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlhVHJhY2VQb2ludC0+YW55X29iamVjdCA9IHRydWU7CisJfQorCisJZWxzZSBpZiggb2JqZWN0LnRvQnVpbHRpblN0cmluZygpID09ICJbKl0iICkKKwl7CisJCWFUcmFjZVBvaW50LT5hbnlfb2JqZWN0ID0gdHJ1ZTsKKwl9CisJZWxzZQorCXsKKwkJYVRyYWNlUG9pbnQtPnZhbHVlID0gb2JqZWN0OworCX0KKworCWFUcmFjZVBvaW50LT50cGlkID0gKytUUF9JRDsKKwl0cmFjZVBvaW50cy5hcHBlbmQoIGJmVFAgKTsKKworCXJldHVybiggdHJ1ZSApOworfQorCisKK2Jvb2wgVHJhY2VGYWN0b3J5Ojpjb25maWd1cmVNYWNoaW5lKAorCQlCRkNvbGxlY3Rpb24gJiB0cmFjZVBvaW50cywgY29uc3Qgc3RkOjpzdHJpbmcgJiBvYmplY3QpCit7CisJaWYoIGFUcmFjZVBvaW50LT5jb25maWd1cmVNYWNoaW5lKG1Db25maWd1cmF0aW9uLCBvYmplY3QpICkKKwl7CisJCWFUcmFjZVBvaW50LT50cGlkID0gKytUUF9JRDsKKwkJdHJhY2VQb2ludHMuYXBwZW5kKCBiZlRQICk7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCitib29sIFRyYWNlRmFjdG9yeTo6Y29uZmlndXJlU3RhdGUoCisJCUJGQ29sbGVjdGlvbiAmIHRyYWNlUG9pbnRzLCBjb25zdCBzdGQ6OnN0cmluZyAmIG9iamVjdCkKK3sKKwlpZiggYVRyYWNlUG9pbnQtPmNvbmZpZ3VyZU1hY2hpbmUobUNvbmZpZ3VyYXRpb24sIG9iamVjdCkgKQorCXsKKwkJYVRyYWNlUG9pbnQtPnRwaWQgPSArK1RQX0lEOworCQl0cmFjZVBvaW50cy5hcHBlbmQoIGJmVFAgKTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCitib29sIFRyYWNlRmFjdG9yeTo6Y29uZmlndXJlU3RhdGVtYWNoaW5lKAorCQlCRkNvbGxlY3Rpb24gJiB0cmFjZVBvaW50cywgY29uc3Qgc3RkOjpzdHJpbmcgJiBvYmplY3QpCit7CisJaWYoIGFUcmFjZVBvaW50LT5jb25maWd1cmVNYWNoaW5lKG1Db25maWd1cmF0aW9uLCBvYmplY3QpICkKKwl7CisJCWFUcmFjZVBvaW50LT50cGlkID0gKytUUF9JRDsKKwkJdHJhY2VQb2ludHMuYXBwZW5kKCBiZlRQICk7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCitib29sIFRyYWNlRmFjdG9yeTo6Y29uZmlndXJlVHJhbnNpdGlvbigKKwkJQkZDb2xsZWN0aW9uICYgdHJhY2VQb2ludHMsIGNvbnN0IHN0ZDo6c3RyaW5nICYgb2JqZWN0KQoreworCWlmKCBhVHJhY2VQb2ludC0+Y29uZmlndXJlVHJhbnNpdGlvbihtQ29uZmlndXJhdGlvbiwgb2JqZWN0KSApCisJeworCQlhVHJhY2VQb2ludC0+dHBpZCA9ICsrVFBfSUQ7CisJCXRyYWNlUG9pbnRzLmFwcGVuZCggYmZUUCApOworCX0KKwllbHNlCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworYm9vbCBUcmFjZUZhY3Rvcnk6OmNvbmZpZ3VyZVJvdXRpbmUoCisJCUJGQ29sbGVjdGlvbiAmIHRyYWNlUG9pbnRzLCBjb25zdCBzdGQ6OnN0cmluZyAmIG9iamVjdCkKK3sKKwlpZiggYVRyYWNlUG9pbnQtPmNvbmZpZ3VyZVJvdXRpbmUobUNvbmZpZ3VyYXRpb24sIG9iamVjdCkgKQorCXsKKwkJYVRyYWNlUG9pbnQtPnRwaWQgPSArK1RQX0lEOworCQl0cmFjZVBvaW50cy5hcHBlbmQoIGJmVFAgKTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKK2Jvb2wgVHJhY2VGYWN0b3J5Ojpjb25maWd1cmVSdW5uYWJsZSgKKwkJQkZDb2xsZWN0aW9uICYgdHJhY2VQb2ludHMsIGNvbnN0IHN0ZDo6c3RyaW5nICYgb2JqZWN0KQoreworCWlmKCBhVHJhY2VQb2ludC0+Y29uZmlndXJlUnVubmFibGUobUNvbmZpZ3VyYXRpb24sIG9iamVjdCkgKQorCXsKKwkJYVRyYWNlUG9pbnQtPnRwaWQgPSArK1RQX0lEOworCQl0cmFjZVBvaW50cy5hcHBlbmQoIGJmVFAgKTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBCQVNJQyBQQVJTRVIgQVBJCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKgorICogRXhlbXBsZSBkZSB0cmFjZSBiYXNpcXVlCisxCitUU0lfdGFyZ2V0PzEKKzEyMAorUlNEX0VOQUJMRURfc291cmNlITEKKzAKK1BTRF9FTkFCTEVEX3NvdXJjZSExCis0MjMzODUKK1JTRF9DTURfc291cmNlITEKKzAKK1BTRF9TVEFURTFfdGFyZ2V0PzAKKzMwMjU2NDYKK0RFUF9BVVRIMV9zb3VyY2UhMQorMTA1OTgyMgorVFNJMV90YXJnZXQ/MAorKi8KKworYm9vbCBUcmFjZUZhY3Rvcnk6OnBhcnNlQmFzaWNUcmFjZShUcmFjZVNlcXVlbmNlICYgYVRyYWNlRWxlbWVudCwKKwkJc3RkOjppZnN0cmVhbSAmIGluRmlsZSwgY29uc3QgQkYgJiBhVmFyVGltZSkKK3sKKworCUJhc2ljVHJhY2VQYXJzZXIgYVBhcnNlciggbUNvbmZpZ3VyYXRpb24gKTsKKworCXJldHVybiggYVBhcnNlci5wYXJzZUJhc2ljVHJhY2UoYVRyYWNlRWxlbWVudCwgaW5GaWxlLCBhVmFyVGltZSkgKTsKK30KKworYm9vbCBUcmFjZUZhY3Rvcnk6OnBhcnNlQmFzaWNYbGlhVHJhY2UoVHJhY2VTZXF1ZW5jZSAmIGFUcmFjZUVsZW1lbnQsCisJCXN0ZDo6aWZzdHJlYW0gJiBpbkZpbGUsIGNvbnN0IEJGICYgYVZhclRpbWUpCit7CisKKwlCYXNpY1RyYWNlUGFyc2VyIGFQYXJzZXIoIG1Db25maWd1cmF0aW9uICk7CisKKwlyZXR1cm4oIGFQYXJzZXIucGFyc2VCYXNpY1hsaWFUcmFjZShhVHJhY2VFbGVtZW50LCBpbkZpbGUsIGFWYXJUaW1lKSApOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gT1RIRVIgQVBJCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIFRyYWNlRmFjdG9yeTo6YXBwZW5kVHJhbnNpdGlvblBvaW50KGNvbnN0IENvbmZpZ3VyYXRpb24gJiBhQ29uZmlndXJhdGlvbiwKKwkJVHJhY2VTZXF1ZW5jZSAmIGFUcmFjZUVsZW1lbnQsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYVRyYW5zaXRpb25VZmlkKQoreworCUV4ZWN1dGFibGVRdWVyeSBYUXVlcnkoIGFDb25maWd1cmF0aW9uICk7CisKKwljb25zdCBCRiAmIGZvdW5kVHJhbnNpdGlvbiA9CisJCQlYUXVlcnkuZ2V0VHJhbnNpdGlvbkJ5UXVhbGlmaWVkTmFtZUlEKGFUcmFuc2l0aW9uVWZpZCk7CisKKwlpZiggZm91bmRUcmFuc2l0aW9uLnZhbGlkKCkgKQorCXsKKwkJQkYgbmV3VHJhbnNpdGlvblBvaW50KCBuZXcgVHJhY2VQb2ludCgKKwkJCQlFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9UUkFOU0lUSU9OX05BVFVSRSwKKwkJCQlBVk1fT1BDT0RFX0lOVk9LRV9UUkFOU0lUSU9OLCBOVUxMLAorCQkJCWZvdW5kVHJhbnNpdGlvbi50b19wdHI8IEF2bVRyYW5zaXRpb24+KCkpICk7CisKKwkJYVRyYWNlRWxlbWVudC5wb2ludHMuYXBwZW5kKCBuZXdUcmFuc2l0aW9uUG9pbnQgKTsKKworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU0VSSUFMSVpBVElPTiBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgVHJhY2VGYWN0b3J5Ojp0b1N0cmVhbShPdXRTdHJlYW0gJiBvcywgTGlzdE9mVHJhY2VQb2ludCAmIGxpc3RvZlRyYWNlUG9pbnQpIGNvbnN0Cit7CisJTGlzdE9mVHJhY2VQb2ludDo6aXRlcmF0b3IgaXRQb2ludCA9IGxpc3RvZlRyYWNlUG9pbnQuYmVnaW4oKTsKKwlMaXN0T2ZUcmFjZVBvaW50OjppdGVyYXRvciBlbmRQb2ludCA9IGxpc3RvZlRyYWNlUG9pbnQuZW5kKCk7CisJZm9yKCA7IGl0UG9pbnQgIT0gZW5kUG9pbnQgOyArK2l0UG9pbnQgKQorCXsKKwkJKCppdFBvaW50KS0+dG9TdHJlYW0ob3MpOworCX0KK30KKworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3RyYWNlL1RyYWNlRmFjdG9yeS5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3RyYWNlL1RyYWNlRmFjdG9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4OWVkNDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvdHJhY2UvVHJhY2VGYWN0b3J5LmgKQEAgLTAsMCArMSwyNDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxMSBzZXB0LiAyMDE0CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgVFJBQ0VGQUNUT1JZX0hfCisjZGVmaW5lIFRSQUNFRkFDVE9SWV9IXworCisjaW5jbHVkZSA8Y29sbGVjdGlvbi9CRkNvbnRhaW5lci5oPgorI2luY2x1ZGUgPGNvbGxlY3Rpb24vVHlwZWRlZi5oPgorCisjaW5jbHVkZSA8Zm1sL3RyYWNlL1RyYWNlUG9pbnQuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworY2xhc3MgQXZtQ29kZTsKKworY2xhc3MgQ29uZmlndXJhdGlvbjsKKworY2xhc3MgRXZhbHVhdGlvbkVudmlyb25tZW50OworY2xhc3MgRXhlY3V0aW9uRGF0YTsKKworY2xhc3MgSW5zdGFuY2VPZkRhdGE7CitjbGFzcyBUcmFjZVNlcXVlbmNlOworCitjbGFzcyBXT2JqZWN0OworCisKK2NsYXNzIFRyYWNlRmFjdG9yeQoreworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQVRUUklCVVRFCisJICovCisJY29uc3QgQ29uZmlndXJhdGlvbiAmIG1Db25maWd1cmF0aW9uOworCisJRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WOworCisJY29uc3QgRXhlY3V0aW9uRGF0YSAqIG1FRDsKKworCVdPYmplY3QgKiBtUGFyYW1ldGVyV09iamVjdDsKKworCUJGVmVjdG9yICAgICAgICAgbURlY2xhcmVkUG9pbnQ7CisJVmVjdG9yT2ZTdHJpbmcgICBtRGVjbGFyZWRQb2ludElEOworCisJRXhlY3V0YWJsZUZvcm0gKiBtTG9jYWxFeGVjdXRhYmxlRm9ybTsKKworCUluc3RhbmNlT2ZEYXRhICogbVZhclRpbWU7CisJQkYgICAgICAgICAgICAgIGJmVmFyVGltZTsKKworCUxpc3RPZlRyYWNlUG9pbnQgbGlzdE9mUG9ydFRyYWNlUG9pbnQ7CisJTGlzdE9mVHJhY2VQb2ludCBsaXN0T2ZWYXJpYWJsZVRyYWNlUG9pbnQ7CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQ29tcHV0aW5nIFZhcmlhYmxlcworCUJGICBiZlRQOworCVRyYWNlUG9pbnQgKiBhVHJhY2VQb2ludDsKKwlMaXN0T2ZUcmFjZVBvaW50IG90aGVyVHJhY2VQb2ludDsKKworcHVibGljOgorCWF2bV9zaXplX3QgVFBfSUQ7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCVRyYWNlRmFjdG9yeShjb25zdCBDb25maWd1cmF0aW9uICYgYUNvbmZpZ3VyYXRpb24sCisJCQlFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBhbkVOViwgV09iamVjdCAqIHdmUGFyYW1ldGVyT2JqZWN0LAorCQkJRXhlY3V0YWJsZUZvcm0gKiBhTG9jYWxFeGVjdXRhYmxlID0gTlVMTCwKKwkJCUluc3RhbmNlT2ZEYXRhICogYVZhclRpbWUgPSBOVUxMKQorCTogbUNvbmZpZ3VyYXRpb24oIGFDb25maWd1cmF0aW9uICksCisJRU5WKCBhbkVOViApLAorCisJbUVEKCBOVUxMICksCisKKwltUGFyYW1ldGVyV09iamVjdCggd2ZQYXJhbWV0ZXJPYmplY3QgKSwKKworCW1EZWNsYXJlZFBvaW50KCApLAorCW1EZWNsYXJlZFBvaW50SUQoICksCisKKwltTG9jYWxFeGVjdXRhYmxlRm9ybSggYUxvY2FsRXhlY3V0YWJsZSApLAorCisJbVZhclRpbWUoIGFWYXJUaW1lICksCisJYmZWYXJUaW1lKCApLAorCisJbGlzdE9mUG9ydFRyYWNlUG9pbnQoICksCisJbGlzdE9mVmFyaWFibGVUcmFjZVBvaW50KCApLAorCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIENvbXB1dGluZyBWYXJpYWJsZXMKKwliZlRQKCApLAorCWFUcmFjZVBvaW50KCBOVUxMICksCisJb3RoZXJUcmFjZVBvaW50KCApLAorCVRQX0lEKCAwICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5UcmFjZUZhY3RvcnkoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBsaXN0T2ZQb3J0VHJhY2VQb2ludAorCSAqIGxpc3RPZlZhcmlhYmxlVHJhY2VQb2ludAorCSAqLworCUxpc3RPZlRyYWNlUG9pbnQgJiBnZXRQb3J0VHJhY2VQb2ludHMoKQorCXsKKwkJcmV0dXJuKCBsaXN0T2ZQb3J0VHJhY2VQb2ludCApOworCX0KKworCUxpc3RPZlRyYWNlUG9pbnQgJiBnZXRWYXJpYWJsZVRyYWNlUG9pbnRzKCkKKwl7CisJCXJldHVybiggbGlzdE9mVmFyaWFibGVUcmFjZVBvaW50ICk7CisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQ09ORklHVVJFIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWJvb2wgY29uZmlndXJlKFRyYWNlU2VxdWVuY2UgJiBhVHJhY2VFbGVtZW50LCBjb25zdCBFeGVjdXRpb25EYXRhICogYW5FRCA9IE5VTEwpOworCisJYm9vbCBjb25maWd1cmUoQXZtQ29kZSAqIGFUcmFjZUV4cHJlc3Npb24sIGNvbnN0IEV4ZWN1dGlvbkRhdGEgKiBhbkVEID0gTlVMTCk7CisKKwlib29sIGNvbmZpZ3VyZShXT2JqZWN0ICogYVRyYWNlU2VxdWVuY2UsCisJCQlCRkNvbGxlY3Rpb24gJiB0cmFjZVBvaW50cywgY29uc3QgRXhlY3V0aW9uRGF0YSAqIGFuRUQgPSBOVUxMKTsKKworCWJvb2wgY29uZmlndXJlKFdPYmplY3QgKiBhVHJhY2VTZXF1ZW5jZSwKKwkJCVRyYWNlU2VxdWVuY2UgJiBhVHJhY2VFbGVtZW50LCBjb25zdCBFeGVjdXRpb25EYXRhICogYW5FRCA9IE5VTEwpOworCisJYm9vbCBjb25maWd1cmUoV09iamVjdCAqIGFUcmFjZVNlcXVlbmNlLAorCQkJQXZtQ29kZSAqIGFUcmFjZUV4cHJlc3Npb24sIGNvbnN0IEV4ZWN1dGlvbkRhdGEgKiBhbkVEID0gTlVMTCk7CisKKwlib29sIGNvbmZpZ3VyZShCRkNvbGxlY3Rpb24gJiB0cmFjZVBvaW50cywgV09iamVjdCAqIHdmUHJvcGVydHkpOworCisJYm9vbCBjb25maWd1cmUoQkZDb2xsZWN0aW9uICYgdHJhY2VQb2ludHMsIFdPYmplY3QgKiB3ZlByb3BlcnR5LAorCQkJRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTkFUVVJFIG5hdHVyZSwgY29uc3Qgc3RkOjpzdHJpbmcgJiBvYmplY3QpOworCisJYm9vbCBjb25maWd1cmUoQkZDb2xsZWN0aW9uICYgdHJhY2VQb2ludHMsIFdPYmplY3QgKiB3ZlByb3BlcnR5LAorCQkJQVZNX09QQ09ERSBvcE5hdHVyZSwgY29uc3Qgc3RkOjpzdHJpbmcgJiBvYmplY3QpOworCisJYm9vbCBjb25maWd1cmVBcnJheShCRkNvbGxlY3Rpb24gJiB0cmFjZVBvaW50cywKKwkJCVdPYmplY3QgKiB3ZlByb3BlcnR5LCBCdWlsdGluQXJyYXkgKiBhbkFycmF5LAorCQkJRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTkFUVVJFIG5hdHVyZSwgQVZNX09QQ09ERSBvcE5hdHVyZSk7CisKKwlib29sIGNvbmZpZ3VyZUV4cHJlc3Npb24oQkZDb2xsZWN0aW9uICYgdHJhY2VQb2ludHMsCisJCQlXT2JqZWN0ICogd2ZQcm9wZXJ0eSwgQXZtQ29kZSAqIGFDb2RlLAorCQkJRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTkFUVVJFIG5hdHVyZSwgQVZNX09QQ09ERSBvcE5hdHVyZSk7CisKKworCWJvb2wgY29uZmlndXJlQ29tcG9zaXRlKAorCQkJQkZDb2xsZWN0aW9uICYgdHJhY2VQb2ludHMsIGNvbnN0IHN0ZDo6c3RyaW5nICYgb2JqZWN0KTsKKworCisJYm9vbCBjb25maWd1cmVQb3J0KAorCQkJQkZDb2xsZWN0aW9uICYgdHJhY2VQb2ludHMsIGNvbnN0IHN0ZDo6c3RyaW5nICYgb2JqZWN0KTsKKworCWJvb2wgY29uZmlndXJlVGltZSgKKwkJCUJGQ29sbGVjdGlvbiAmIHRyYWNlUG9pbnRzLCBjb25zdCBzdGQ6OnN0cmluZyAmIG9iamVjdCk7CisKKwlib29sIGNvbmZpZ3VyZVZhcmlhYmxlKAorCQkJQkZDb2xsZWN0aW9uICYgdHJhY2VQb2ludHMsIGNvbnN0IHN0ZDo6c3RyaW5nICYgb2JqZWN0KTsKKworCWJvb2wgY29uZmlndXJlQnVmZmVyKAorCQkJQkZDb2xsZWN0aW9uICYgdHJhY2VQb2ludHMsIGNvbnN0IHN0ZDo6c3RyaW5nICYgb2JqZWN0KTsKKworCWJvb2wgY29uZmlndXJlRm9ybXVsYSgKKwkJCUJGQ29sbGVjdGlvbiAmIHRyYWNlUG9pbnRzLCBjb25zdCBCRiAmIG9iamVjdCk7CisKKwlib29sIGNvbmZpZ3VyZU5vZGVQYXRoQ29uZGl0aW9uKAorCQkJQkZDb2xsZWN0aW9uICYgdHJhY2VQb2ludHMsIGNvbnN0IEJGICYgb2JqZWN0KTsKKworCWJvb2wgY29uZmlndXJlTWFjaGluZSgKKwkJCUJGQ29sbGVjdGlvbiAmIHRyYWNlUG9pbnRzLCBjb25zdCBzdGQ6OnN0cmluZyAmIG9iamVjdCk7CisKKwlib29sIGNvbmZpZ3VyZVN0YXRlKAorCQkJQkZDb2xsZWN0aW9uICYgdHJhY2VQb2ludHMsIGNvbnN0IHN0ZDo6c3RyaW5nICYgb2JqZWN0KTsKKwlib29sIGNvbmZpZ3VyZVN0YXRlbWFjaGluZSgKKwkJCUJGQ29sbGVjdGlvbiAmIHRyYWNlUG9pbnRzLCBjb25zdCBzdGQ6OnN0cmluZyAmIG9iamVjdCk7CisKKwlib29sIGNvbmZpZ3VyZVRyYW5zaXRpb24oCisJCQlCRkNvbGxlY3Rpb24gJiB0cmFjZVBvaW50cywgY29uc3Qgc3RkOjpzdHJpbmcgJiBvYmplY3QpOworCisJYm9vbCBjb25maWd1cmVSb3V0aW5lKAorCQkJQkZDb2xsZWN0aW9uICYgdHJhY2VQb2ludHMsIGNvbnN0IHN0ZDo6c3RyaW5nICYgb2JqZWN0KTsKKworCWJvb2wgY29uZmlndXJlUnVubmFibGUoCisJCQlCRkNvbGxlY3Rpb24gJiB0cmFjZVBvaW50cywgY29uc3Qgc3RkOjpzdHJpbmcgJiBvYmplY3QpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQkFTSUMgUEFSU0VSIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWJvb2wgcGFyc2VCYXNpY1RyYWNlKFRyYWNlU2VxdWVuY2UgJiBhVHJhY2VFbGVtZW50LAorCQkJc3RkOjppZnN0cmVhbSAmIGluRmlsZSwgY29uc3QgQkYgJiBhVmFyVGltZSk7CisKKwlib29sIHBhcnNlQmFzaWNYbGlhVHJhY2UoVHJhY2VTZXF1ZW5jZSAmIGFUcmFjZUVsZW1lbnQsCisJCQlzdGQ6Omlmc3RyZWFtICYgaW5GaWxlLCBjb25zdCBCRiAmIGFWYXJUaW1lKTsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIE9USEVSIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXN0YXRpYyBib29sIGFwcGVuZFRyYW5zaXRpb25Qb2ludCgKKwkJCWNvbnN0IENvbmZpZ3VyYXRpb24gJiBhQ29uZmlndXJhdGlvbiwKKwkJCVRyYWNlU2VxdWVuY2UgJiBhVHJhY2VFbGVtZW50LAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhVHJhbnNpdGlvblVmaWQpOworCisJLy9UT0RPOiByZW1vdmVUcmFjZVBvaW50ID8KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFNFUklBTElaQVRJT04gQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcywgTGlzdE9mVHJhY2VQb2ludCAmIGxpc3RvZlRyYWNlUG9pbnQpIGNvbnN0OworCit9OworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworCisjZW5kaWYgLyogVFJBQ0VGQUNUT1JZX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvdHJhY2UvVHJhY2VGaWx0ZXIuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3RyYWNlL1RyYWNlRmlsdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGQyYjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3RyYWNlL1RyYWNlRmlsdGVyLmNwcApAQCAtMCwwICsxLDEwMTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxMSBkw6ljLiAyMDEzCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJUcmFjZUZpbHRlci5oIgorCisjaW5jbHVkZSA8Y29tcHV0ZXIvRXZhbHVhdGlvbkVudmlyb25tZW50Lmg+CisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlUXVlcnkuaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlU3lzdGVtLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9CdWlsdGluQXJyYXkuaD4KKworI2luY2x1ZGUgPGZtbC9vcGVyYXRvci9PcGVyYXRvck1hbmFnZXIuaD4KKworI2luY2x1ZGUgPGZtbC90ZW1wbGF0ZS9UaW1lZE1hY2hpbmUuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkNvbmZpZ3VyYXRpb24uaD4KKworI2luY2x1ZGUgPGZtbC90cmFjZS9UcmFjZUZhY3RvcnkuaD4KKyNpbmNsdWRlIDxmbWwvdHJhY2UvVHJhY2VTZXF1ZW5jZS5oPgorCisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1F1ZXJ5Lmg+CisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1dPYmplY3QuaD4KKworI2luY2x1ZGUgPHNldy9Db25maWd1cmF0aW9uLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisvKgorcHJvdG90eXBlIHByb2Nlc3M6OnRyYWNlX2dlbmVyYXRvciBhcyAmYXZtOjpwcm9jZXNzb3IuVFJBQ0VfR0VORVJBVE9SIGlzCisgLi4uCisgc2VjdGlvbiBUUkFDRQorICAvLyBBTkQgLS0+IGNvbmp1bmN0aXZlCisgIC8vIE9SICAtLT4gZGlzanVuY3RpdmUKKyAgLy8gWE9SIC0tPiBleGNsdXNpdmUKKyAgLy8gTk9UIC0tPiBuZWdhdGl2ZQorICBAY29tYmluYXRvciA9ICdPUic7CisKKyAgQHRpbWUgPSAiJGRlbHRhIjsKKyAgQHRpbWUgPSAiJHRpbWUiOworCisgIEBhc3NpZ24gPSAic2VucyI7CisKKyAgQG5ld2ZyZXNoID0gInNlbnMiOworCisgIEBzaWduYWwgPSAic2VucyI7CisKKyAgQHBvcnQgPSAiZW52IjsKKworICBAaW5wdXQgPSAiZW52IjsKKyAgQG91dHB1dCA9ICJlbnYiOworCisgIEBvdXRwdXQgPSAiVGhlcm1vc3RhdC0+ZHQiOworICBAaW5wdXQgID0gIlRoZXJtb3N0YXQtPmVxdWlwIjsKKyAgQG91dHB1dCA9ICJFcXVpcG1lbnQtPmVycm9yIjsKKyBlbmRzZWN0aW9uIFRSQUNFCisgLi4uCitlbmRwcm90b3R5cGUKKyovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDT05GSUdVUkUgQVBJCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjZGVmaW5lIExFQUZfTk9ERV9SRUdFWF9QQVRURVJOICAgICAiXFxTPyhsZWFmfGVuZHxsYXN0fHRhaWwpXFxTPyIKKworI2RlZmluZSBMRUFGX05PREVfREVGQVVMVF9QQVRURVJOICAgIjpsZWFmOiIKKworCitib29sIFRyYWNlRmlsdGVyOjpjb25maWd1cmUoRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WLAorCQlXT2JqZWN0ICogd2ZQYXJhbWV0ZXJPYmplY3QsIFdPYmplY3QgKiB3ZlRyYWNlT2JqZWN0KQoreworCisJaWYoIFRpbWVkTWFjaGluZTo6U1lTVEVNX1ZBUl9ERUxUQV9USU1FICE9IE5VTEwgKQorCXsKKwkJRXhlY3V0YWJsZVF1ZXJ5IFhRdWVyeSggRU5WLmdldENvbmZpZ3VyYXRpb24oKSApOworCisJCW9iamVjdERlbHRhVGltZSA9IFhRdWVyeS5nZXREYXRhQnlBc3RFbGVtZW50KAorCQkJVGltZWRNYWNoaW5lOjpTWVNURU1fVkFSX0RFTFRBX1RJTUUpLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpOworCX0KKworCS8vIGRlZmF1bHQgbWFpbiBjb21iaW5hdG9yCisJbWFpblRyYWNlUG9pbnRGaXRlci5zZXRPcGVyYXRvciggT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9PUiApOworCisJLy8gQ29uZmlndXJhdGlvbiBvZiBUUkFDRQorCVRyYWNlRmFjdG9yeSB0cmFjZUZhY3RvcnkoRU5WLmdldENvbmZpZ3VyYXRpb24oKSwKKwkJCUVOViwgd2ZQYXJhbWV0ZXJPYmplY3QsIE5VTEwsIG9iamVjdERlbHRhVGltZSk7CisJaWYoIG5vdCB0cmFjZUZhY3RvcnkuY29uZmlndXJlKHdmVHJhY2VPYmplY3QsICgmIG1haW5UcmFjZVBvaW50Rml0ZXIpKSApCisJeworLy8JCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwlsaXN0T2ZWYXJpYWJsZVRyYWNlUG9pbnQuYXBwZW5kKCB0cmFjZUZhY3RvcnkuZ2V0VmFyaWFibGVUcmFjZVBvaW50cygpICk7CisKKworCS8vIEluaXRpYWxpemUgRmlsdGVyIFBvaW50IEZsYWdzCisJbUNvbmRpdGlvbkZsYWcgPSBRdWVyeTo6aGFzUmVnZXhXUHJvcGVydHkod2ZUcmFjZU9iamVjdCwgImNvbmRpdGlvbiIpOworCW1EZWNpc2lvbkZsYWcgPSBtQ29uZGl0aW9uRmxhZworCQkJfHwgUXVlcnk6Omhhc1JlZ2V4V1Byb3BlcnR5KHdmVHJhY2VPYmplY3QsICJkZWNpc2lvbiIpOworCisJaWYoICBtQ29uZGl0aW9uRmxhZyB8fCBtRGVjaXNpb25GbGFnICApCisJeworCQltUGF0aENvbmRpdGlvbkZsYWcgPSBtUGF0aFRpbWVkQ29uZGl0aW9uRmxhZyA9IHRydWU7CisJCW1Ob2RlQ29uZGl0aW9uRmxhZyA9IG1Ob2RlVGltZWRDb25kaXRpb25GbGFnID0gdHJ1ZTsKKworCQltUGF0aENvbmRpdGlvbkxlYWZOb2RlRmxhZyA9IG1QYXRoVGltZWRDb25kaXRpb25MZWFmTm9kZUZsYWcgPSB0cnVlOworCQltTm9kZUNvbmRpdGlvbkxlYWZOb2RlRmxhZyA9IG1Ob2RlVGltZWRDb25kaXRpb25MZWFmTm9kZUZsYWcgPSB0cnVlOworCX0KKwllbHNlCisJeworCQltUGF0aENvbmRpdGlvbkZsYWcgPSBub3QgUkVHRVhfTUFUQ0goCisJCQkJUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5U3RyaW5nKHdmVHJhY2VPYmplY3QsCisJCQkJCUNPTlNfV0lEMigicGF0aCIsICJjb25kaXRpb24iKSwgTEVBRl9OT0RFX0RFRkFVTFRfUEFUVEVSTiksCisJCQkJTEVBRl9OT0RFX1JFR0VYX1BBVFRFUk4gKTsKKworCQltUGF0aENvbmRpdGlvbkxlYWZOb2RlRmxhZyA9IG1QYXRoQ29uZGl0aW9uRmxhZworCQkJCXx8IFF1ZXJ5OjpoYXNSZWdleFdQcm9wZXJ0eSh3ZlRyYWNlT2JqZWN0LAorCQkJCQlDT05TX1dJRDMoInBhdGgiLCAiY29uZGl0aW9uIiwgIihsZWFmfGVuZHxsYXN0fHRhaWwpIikpCisJCQkJfHwgUkVHRVhfTUFUQ0goUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5U3RyaW5nKAorCQkJCQkJCXdmVHJhY2VPYmplY3QsIENPTlNfV0lEMigicGF0aCIsICJjb25kaXRpb24iKSwgIiIpLAorCQkJCQlMRUFGX05PREVfUkVHRVhfUEFUVEVSTiApOworCisKKwkJbU5vZGVDb25kaXRpb25GbGFnID0gbm90IFJFR0VYX01BVENIKAorCQkJCVF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eVN0cmluZyh3ZlRyYWNlT2JqZWN0LAorCQkJCQlDT05TX1dJRDIoIm5vZGUiLCAiY29uZGl0aW9uIiksIExFQUZfTk9ERV9ERUZBVUxUX1BBVFRFUk4pLAorCQkJCUxFQUZfTk9ERV9SRUdFWF9QQVRURVJOICk7CisKKwkJbU5vZGVDb25kaXRpb25MZWFmTm9kZUZsYWcgPSBtTm9kZUNvbmRpdGlvbkZsYWcKKwkJCQl8fCBRdWVyeTo6aGFzUmVnZXhXUHJvcGVydHkod2ZUcmFjZU9iamVjdCwKKwkJCQkJQ09OU19XSUQzKCJub2RlIiwgImNvbmRpdGlvbiIsICIobGVhZnxlbmR8bGFzdHx0YWlsKSIpKQorCQkJCXx8IFJFR0VYX01BVENIKFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eVN0cmluZygKKwkJCQkJCQl3ZlRyYWNlT2JqZWN0LCBDT05TX1dJRDIoIm5vZGUiLCAiY29uZGl0aW9uIiksICIiKSwKKwkJCQkJTEVBRl9OT0RFX1JFR0VYX1BBVFRFUk4gKTsKKworCisJCW1QYXRoVGltZWRDb25kaXRpb25GbGFnID0gbm90IFJFR0VYX01BVENIKAorCQkJCVF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eVN0cmluZyh3ZlRyYWNlT2JqZWN0LAorCQkJCQlDT05TX1dJRDMoInBhdGgiLCAidGltZWQiLCAiY29uZGl0aW9uIiksCisJCQkJCUxFQUZfTk9ERV9ERUZBVUxUX1BBVFRFUk4pLAorCQkJCUxFQUZfTk9ERV9SRUdFWF9QQVRURVJOICk7CisKKwkJbVBhdGhUaW1lZENvbmRpdGlvbkxlYWZOb2RlRmxhZyA9IG1QYXRoVGltZWRDb25kaXRpb25GbGFnCisJCQkJfHwgUXVlcnk6Omhhc1JlZ2V4V1Byb3BlcnR5KHdmVHJhY2VPYmplY3QsIENPTlNfV0lENCgKKwkJCQkJCSJwYXRoIiwgInRpbWVkIiwgImNvbmRpdGlvbiIsICIobGVhZnxlbmR8bGFzdHx0YWlsKSIpICkKKwkJCQl8fCBSRUdFWF9NQVRDSChRdWVyeTo6Z2V0UmVnZXhXUHJvcGVydHlTdHJpbmcod2ZUcmFjZU9iamVjdCwKKwkJCQkJCUNPTlNfV0lEMygicGF0aCIsICJ0aW1lZCIsICJjb25kaXRpb24iKSwgIiIpLAorCQkJCQlMRUFGX05PREVfUkVHRVhfUEFUVEVSTiApOworCisKKwkJbU5vZGVUaW1lZENvbmRpdGlvbkZsYWcgPSBub3QgUkVHRVhfTUFUQ0goCisJCQkJUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5U3RyaW5nKHdmVHJhY2VPYmplY3QsCisJCQkJCUNPTlNfV0lEMygibm9kZSIsICJ0aW1lZCIsICJjb25kaXRpb24iKSwKKwkJCQkJTEVBRl9OT0RFX0RFRkFVTFRfUEFUVEVSTiksCisJCQkJTEVBRl9OT0RFX1JFR0VYX1BBVFRFUk4gKTsKKworCQltTm9kZVRpbWVkQ29uZGl0aW9uTGVhZk5vZGVGbGFnID0gbU5vZGVUaW1lZENvbmRpdGlvbkZsYWcKKwkJCQl8fCBRdWVyeTo6aGFzUmVnZXhXUHJvcGVydHkod2ZUcmFjZU9iamVjdCwgQ09OU19XSUQ0KAorCQkJCQkJIm5vZGUiLCAidGltZWQiLCAiY29uZGl0aW9uIiwgIihsZWFmfGVuZHxsYXN0fHRhaWwpIikgKQorCQkJCXx8IFJFR0VYX01BVENIKFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eVN0cmluZyh3ZlRyYWNlT2JqZWN0LAorCQkJCQkJQ09OU19XSUQzKCJub2RlIiwgInRpbWVkIiwgImNvbmRpdGlvbiIpLCAiIiksCisJCQkJCUxFQUZfTk9ERV9SRUdFWF9QQVRURVJOICk7CisJfQorCisJbVRpbWVGaWx0ZXJGbGFnID0gUXVlcnk6Omhhc1JlZ2V4V1Byb3BlcnR5KHdmVHJhY2VPYmplY3QsICJcXFM/dGltZSIpOworCisJbUFzc2lnbkZpbHRlckZsYWcgPSBsaXN0T2ZWYXJpYWJsZVRyYWNlUG9pbnQubm9uZW1wdHkoKQorCQkJfHwgUXVlcnk6Omhhc1dQcm9wZXJ0eVN0cmluZyh3ZlRyYWNlT2JqZWN0LCAidmFyaWFibGUiLCAidmFyIikKKwkJCXx8IFF1ZXJ5OjpoYXNXUHJvcGVydHlTdHJpbmcod2ZUcmFjZU9iamVjdCwgImFzc2lnbiIgICk7CisKKwltTmV3ZnJlc2hGaWx0ZXJGbGFnID0gUXVlcnk6Omhhc1dQcm9wZXJ0eVN0cmluZyh3ZlRyYWNlT2JqZWN0LCAibmV3ZnJlc2giKTsKKworCW1Db21GaWx0ZXJGbGFnID0gUXVlcnk6Omhhc1JlZ2V4V1Byb3BlcnR5KHdmVHJhY2VPYmplY3QsICJjb218aW5vdXQiKTsKKworCWlmKCBtQ29tRmlsdGVyRmxhZyApCisJeworCQltSW5wdXRGaWx0ZXJGbGFnICA9IHRydWU7CisJCW1JbnB1dEV4dGVybmFsRmlsdGVyRmxhZyAgPSBtSW5wdXRFbnZGaWx0ZXJGbGFnICA9IHRydWU7CisJCW1JbnB1dEludGVybmFsRmlsdGVyRmxhZyAgPSBtSW5wdXRSZHZGaWx0ZXJGbGFnICA9IHRydWU7CisKKwkJbU91dHB1dEZpbHRlckZsYWcgPSB0cnVlOworCQltT3V0cHV0RXh0ZXJuYWxGaWx0ZXJGbGFnID0gbU91dHB1dEVudkZpbHRlckZsYWcgPSB0cnVlOworCQltT3V0cHV0SW50ZXJuYWxGaWx0ZXJGbGFnID0gbU91dHB1dFJkdkZpbHRlckZsYWcgPSB0cnVlOworCX0KKwllbHNlCisJeworCQltSW5wdXRFbnZGaWx0ZXJGbGFnID0KKwkJCQlRdWVyeTo6aGFzUmVnZXhXUHJvcGVydHkod2ZUcmFjZU9iamVjdCwKKwkJCQkJCUNPTlNfV0lEMigiKChpbihwfG8pdXQpfGNvbSkiLCAiZW52IikpOworCQltSW5wdXRSZHZGaWx0ZXJGbGFnID0KKwkJCQlRdWVyeTo6aGFzUmVnZXhXUHJvcGVydHkod2ZUcmFjZU9iamVjdCwKKwkJCQkJCUNPTlNfV0lEMigiKChpbihwfG8pdXQpfGNvbSkiLCAicmR2IikpOworCisJCW1JbnB1dEV4dGVybmFsRmlsdGVyRmxhZyA9IG1JbnB1dEVudkZpbHRlckZsYWcKKwkJCQl8fCBRdWVyeTo6aGFzUmVnZXhXUHJvcGVydHkod2ZUcmFjZU9iamVjdCwKKwkJCQkJCUNPTlNfV0lEMigiKChpbihwfG8pdXQpfGNvbSkiLCAiZXh0ZXJuYWwiKSk7CisKKwkJbUlucHV0SW50ZXJuYWxGaWx0ZXJGbGFnID0gbUlucHV0UmR2RmlsdGVyRmxhZworCQkJCXx8IFF1ZXJ5OjpoYXNSZWdleFdQcm9wZXJ0eSh3ZlRyYWNlT2JqZWN0LAorCQkJCQkJQ09OU19XSUQyKCIoKGluKHB8byl1dCl8Y29tKSIsICJpbnRlcm5hbCIpKTsKKworCQltSW5wdXRGaWx0ZXJGbGFnID0gbUlucHV0RXh0ZXJuYWxGaWx0ZXJGbGFnCisJCQkJfHwgbUlucHV0SW50ZXJuYWxGaWx0ZXJGbGFnCisJCQkJfHwgUXVlcnk6Omhhc1dQcm9wZXJ0eVN0cmluZyh3ZlRyYWNlT2JqZWN0LCAiaW5wdXQiKTsKKworCisJCW1PdXRwdXRFbnZGaWx0ZXJGbGFnID0gUXVlcnk6Omhhc1JlZ2V4V1Byb3BlcnR5KAorCQkJCXdmVHJhY2VPYmplY3QsIENPTlNfV0lEMigib3V0cHV0IiwgImVudiIpKTsKKworCQltT3V0cHV0UmR2RmlsdGVyRmxhZyA9IFF1ZXJ5OjpoYXNSZWdleFdQcm9wZXJ0eSgKKwkJCQl3ZlRyYWNlT2JqZWN0LCBDT05TX1dJRDIoIm91dHB1dCIsICJyZHYiKSk7CisKKwkJbU91dHB1dEV4dGVybmFsRmlsdGVyRmxhZyA9IG1PdXRwdXRFbnZGaWx0ZXJGbGFnCisJCQkJfHwgUXVlcnk6Omhhc1JlZ2V4V1Byb3BlcnR5KHdmVHJhY2VPYmplY3QsCisJCQkJCQlDT05TX1dJRDIoIigoKG91dHB8aW5vKXV0KXxjb20pIiwgImV4dGVybmFsIikpOworCisJCW1PdXRwdXRJbnRlcm5hbEZpbHRlckZsYWcgPSBtT3V0cHV0UmR2RmlsdGVyRmxhZworCQkJCXx8IFF1ZXJ5OjpoYXNSZWdleFdQcm9wZXJ0eSh3ZlRyYWNlT2JqZWN0LAorCQkJCQkJQ09OU19XSUQyKCIoKChvdXRwfGlubyl1dCl8Y29tKSIsICJpbnRlcm5hbCIpKTsKKworCQltT3V0cHV0RmlsdGVyRmxhZyA9CisJCQkJbU91dHB1dEV4dGVybmFsRmlsdGVyRmxhZyB8fCBtT3V0cHV0SW50ZXJuYWxGaWx0ZXJGbGFnCisJCQkJfHwgUXVlcnk6Omhhc1dQcm9wZXJ0eVN0cmluZyh3ZlRyYWNlT2JqZWN0LCAib3V0cHV0Iik7CisKKworCQltQ29tRXh0ZXJuYWxGaWx0ZXJGbGFnID0KKwkJCQltSW5wdXRFeHRlcm5hbEZpbHRlckZsYWcgfHwgbU91dHB1dEV4dGVybmFsRmlsdGVyRmxhZworCQkJCXx8IFF1ZXJ5OjpoYXNSZWdleFdQcm9wZXJ0eSgKKwkJCQkJCXdmVHJhY2VPYmplY3QsIENPTlNfV0lEMigiKGNvbXxpbm91dCkiLCAiZXh0ZXJuYWwiKSk7CisKKwkJbUNvbUludGVybmFsRmlsdGVyRmxhZyA9CisJCQkJbUlucHV0SW50ZXJuYWxGaWx0ZXJGbGFnIHx8IG1PdXRwdXRJbnRlcm5hbEZpbHRlckZsYWcKKwkJCQl8fCBRdWVyeTo6aGFzUmVnZXhXUHJvcGVydHkod2ZUcmFjZU9iamVjdCwKKwkJCQkJCUNPTlNfV0lEMigiKGNvbXxpbm91dCkiLCAiaW50ZXJuYWwiKSk7CisKKwkJbUNvbUZpbHRlckZsYWcgPSBtSW5wdXRGaWx0ZXJGbGFnIHx8IG1PdXRwdXRGaWx0ZXJGbGFnIHx8IGNvbnRhaW5zQ29tKCk7CisJfQorCisJbU1hY2hpbmVGaWx0ZXJGbGFnID0KKwkJCVF1ZXJ5OjpoYXNXUHJvcGVydHlTdHJpbmcod2ZUcmFjZU9iamVjdCwgIm1hY2hpbmUiKTsKKwltU3RhdGVGaWx0ZXJGbGFnID0KKwkJCVF1ZXJ5OjpoYXNXUHJvcGVydHlTdHJpbmcod2ZUcmFjZU9iamVjdCwgInN0YXRlIik7CisJbVN0YXRlbWFjaGluZUZpbHRlckZsYWcgPQorCQkJUXVlcnk6Omhhc1dQcm9wZXJ0eVN0cmluZyh3ZlRyYWNlT2JqZWN0LCAic3RhdGVtYWNoaW5lIik7CisKKwltVHJhbnNpdGlvbkZpbHRlckZsYWcgPQorCQkJUXVlcnk6Omhhc1dQcm9wZXJ0eVN0cmluZyh3ZlRyYWNlT2JqZWN0LCAidHJhbnNpdGlvbiIpOworCW1Sb3V0aW5lRmlsdGVyRmxhZyA9CisJCQlRdWVyeTo6aGFzV1Byb3BlcnR5U3RyaW5nKHdmVHJhY2VPYmplY3QsICJyb3V0aW5lIik7CisKKwltSU9UcmFjZUZpbHRlckZsYWcgPSBtQ29tRmlsdGVyRmxhZyB8fCBtTmV3ZnJlc2hGaWx0ZXJGbGFnOworCisJbVJ1bm5hYmxlRmlsdGVyRmxhZyA9IG1NYWNoaW5lRmlsdGVyRmxhZworCQkJfHwgbVN0YXRlRmlsdGVyRmxhZyAgICAgIHx8IG1TdGF0ZW1hY2hpbmVGaWx0ZXJGbGFnCisJCQl8fCBtVHJhbnNpdGlvbkZpbHRlckZsYWcgfHwgbVJvdXRpbmVGaWx0ZXJGbGFnOworCisKKwkvLyBVcGRhdGUgRmlsdGVyIFBvaW50IEZsYWdzCisJLy91cGRhdGVGaWx0ZXJGbGFncygpOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFBST0NFU1NPUiAsIFRSQUNFICkKKwlBVk1fT1NfVFJBQ0UgPDwgIlRyYWNlRmlsdGVyOj4gIjsgdG9TdHJlYW0oQVZNX09TX1RSQUNFKTsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUFJPQ0VTU09SICwgVFJBQ0UgKQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworYm9vbCBUcmFjZUZpbHRlcjo6Y29uZmlndXJlKEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOViwKKwkJV09iamVjdCAqIHdmUGFyYW1ldGVyT2JqZWN0LCBjb25zdCBzdGQ6OnN0cmluZyAmIGFXU2VxdWVuY2VOYW1lSUQsCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVdTZXF1ZW5jZUVsc2VOYW1lSUQpCit7CisJV09iamVjdCAqIHRoZVRSQUNFID0gUXVlcnk6OmdldFdTZXF1ZW5jZU9yRWxzZSgKKwkJCXdmUGFyYW1ldGVyT2JqZWN0LCBhV1NlcXVlbmNlTmFtZUlELCBhV1NlcXVlbmNlRWxzZU5hbWVJRCk7CisKKy8vCWlmKCAodGhlVFJBQ0UgPT0gV09iamVjdDo6X05VTExfKSB8fCB0aGVUUkFDRS0+aGFzbm9Pd25lZEVsZW1lbnQoKSApCisvLwl7CisvLwkJcmV0dXJuKCB0cnVlICk7CisvLwl9CisKKwlyZXR1cm4oIGNvbmZpZ3VyZShFTlYsIHdmUGFyYW1ldGVyT2JqZWN0LCB0aGVUUkFDRSkgKTsKK30KKworLyoqCisgKiBVcGRhdGUKKyAqIEZpbHRlciBQb2ludCBGbGFncworICovCisvL3ZvaWQgVHJhY2VGaWx0ZXI6OnVwZGF0ZUZpbHRlckZsYWdzKCkKKy8veworLy8JbVBhdGhDb25kaXRpb25GbGFnID0gY29udGFpbnMoCisvLwkJCUVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1BBVEhfQ09ORElUSU9OX05BVFVSRSk7CisvLworLy8JbVBhdGhUaW1lZENvbmRpdGlvbkZsYWcgPSBjb250YWlucygKKy8vCQkJRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfUEFUSF9USU1FRF9DT05ESVRJT05fTkFUVVJFKTsKKy8vCisvLwltTm9kZUNvbmRpdGlvbkZsYWcgPSBjb250YWlucygKKy8vCQkJRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTk9ERV9DT05ESVRJT05fTkFUVVJFKTsKKy8vCisvLwltTm9kZVRpbWVkQ29uZGl0aW9uRmxhZyA9IGNvbnRhaW5zKAorLy8JCQlFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9OT0RFX1RJTUVEX0NPTkRJVElPTl9OQVRVUkUpOworLy8KKy8vCW1UaW1lRmlsdGVyRmxhZyA9IGNvbnRhaW5zKEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1RJTUVfTkFUVVJFKTsKKy8vCisvLwltVGltZUZpbHRlckZsYWcgPSBjb250YWlucyhFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9USU1FX05BVFVSRSk7CisvLworLy8JbUFzc2lnbkZpbHRlckZsYWcgPSBsaXN0T2ZWYXJpYWJsZVRyYWNlUG9pbnQubm9uZW1wdHkoKSB8fAorLy8JCQljb250YWlucyhFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9WQVJJQUJMRV9OQVRVUkUpOworLy8KKy8vCW1OZXdmcmVzaEZpbHRlckZsYWcgPSBjb250YWlucyhFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9WQVJJQUJMRV9OQVRVUkUsCisvLwkJCUFWTV9PUENPREVfQVNTSUdOX05FV0ZSRVNIKTsKKy8vCisvLwltSW5wdXRFbnZGaWx0ZXJGbGFnID0gY29udGFpbnMoQVZNX09QQ09ERV9JTlBVVF9FTlYpOworLy8JbUlucHV0RmlsdGVyRmxhZyA9IGNvbnRhaW5zKEFWTV9PUENPREVfSU5QVVQpOworLy8JbU91dHB1dEVudkZpbHRlckZsYWcgPSBjb250YWlucyhBVk1fT1BDT0RFX09VVFBVVF9FTlYpOworLy8JbU91dHB1dEZpbHRlckZsYWcgPSBjb250YWlucyhBVk1fT1BDT0RFX09VVFBVVCk7CisvLworLy8JbU1hY2hpbmVGaWx0ZXJGbGFnID0gY29udGFpbnMoRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTUFDSElORV9OQVRVUkUpOworLy8JbVN0YXRlRmlsdGVyRmxhZyA9IGNvbnRhaW5zKCBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9TVEFURV9OQVRVUkUpOworLy8JbVN0YXRlbWFjaGluZUZpbHRlckZsYWcgPSBjb250YWlucyhFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9TVEFURU1BQ0hJTkVfTkFUVVJFKTsKKy8vCisvLwltVHJhbnNpdGlvbkZpbHRlckZsYWcgPSBjb250YWlucyhFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9UUkFOU0lUSU9OX05BVFVSRSk7CisvLwltUm91dGluZUZpbHRlckZsYWcgICAgPSBjb250YWlucyhFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9ST1VUSU5FX05BVFVSRSk7CisvLworLy8KKy8vCW1Db21GaWx0ZXJGbGFnID0gbUlucHV0RmlsdGVyRmxhZyB8fCBtT3V0cHV0RmlsdGVyRmxhZyB8fCBjb250YWluc0NvbSgpOworLy8KKy8vCW1JT1RyYWNlRmlsdGVyRmxhZyA9IG1Db21GaWx0ZXJGbGFnIHx8IG1OZXdmcmVzaEZpbHRlckZsYWc7CisvLworLy8JbVJ1bm5hYmxlRmlsdGVyRmxhZyA9IG1NYWNoaW5lRmlsdGVyRmxhZworLy8JCQl8fCBtU3RhdGVGaWx0ZXJGbGFnICAgICAgfHwgbVN0YXRlbWFjaGluZUZpbHRlckZsYWcKKy8vCQkJfHwgbVRyYW5zaXRpb25GaWx0ZXJGbGFnIHx8IG1Sb3V0aW5lRmlsdGVyRmxhZworLy8JCQl8fCBjb250YWlucyhFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9SVU5OQUJMRV9OQVRVUkUpOworLy99CisKKworLyoqCisgKiBGaWx0ZXIgUG9pbnQgRmxhZ3MKKyAqLworYm9vbCBUcmFjZUZpbHRlcjo6Y29udGFpbnMoRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTkFUVVJFIG5hdHVyZSwKKwkJQVZNX09QQ09ERSBvcCwgQXZtQ29kZSAqIGFDb2RlKSBjb25zdAoreworCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYUNvZGUtPmJlZ2luKCk7CisJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBhQ29kZS0+ZW5kKCk7CisJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJeworCQlpZiggY29udGFpbnMobmF0dXJlLCBvcCwgKCppdCkpICkKKwkJeworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKK2Jvb2wgVHJhY2VGaWx0ZXI6OmNvbnRhaW5zKEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX05BVFVSRSBuYXR1cmUsCisJCUFWTV9PUENPREUgb3AsIGNvbnN0IEJGICYgYXJnKSBjb25zdAoreworCWlmKCBhcmcuaXM8IFRyYWNlUG9pbnQgPigpICkKKwl7CisJCXJldHVybiggKChuYXR1cmUgPT0gRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfVU5ERUZJTkVEX05BVFVSRSkgfHwKKwkJCQkJCShhcmcudG9fcHRyPCBUcmFjZVBvaW50ID4oKS0+bmF0dXJlID09IG5hdHVyZSkpICYmCisJCQkJKChvcCA9PSBBVk1fT1BDT0RFX05VTEwpIHx8CisJCQkJCQkoYXJnLnRvX3B0cjwgVHJhY2VQb2ludCA+KCktPm9wID09IG9wKSkgKTsKKwl9CisKKwllbHNlIGlmKCBhcmcuaXM8IEF2bUNvZGUgPigpICkKKwl7CisJCXJldHVybiggY29udGFpbnMobmF0dXJlLCBvcCwgYXJnLnRvX3B0cjwgQXZtQ29kZSA+KCkpICk7CisJfQorCisJZWxzZSBpZiggYXJnLmlzPCBUcmFjZVNlcXVlbmNlID4oKSApCisJeworCQlCRkxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYXJnLnRvX3B0cjwgVHJhY2VTZXF1ZW5jZSA+KCktPnBvaW50cy5iZWdpbigpOworCQlCRkxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gYXJnLnRvX3B0cjwgVHJhY2VTZXF1ZW5jZSA+KCktPnBvaW50cy5lbmQoKTsKKwkJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJCXsKKwkJCWlmKCBjb250YWlucyhuYXR1cmUsIG9wLCAoKml0KSkgKQorCQkJeworCQkJCXJldHVybiggdHJ1ZSApOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBGSUxURVJJTkcgQVBJIDogY2hlY2sgaWYgVFJBQ0UgUE9JTlQgcGFzcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBUcmFjZUZpbHRlcjo6cGFzcyhUcmFjZVBvaW50ICogZmlsdGVyVFAsIFRyYWNlUG9pbnQgKiBhVFApCit7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBQUk9DRVNTT1IgLCBUUkFDRSApCisJQVZNX09TX1RSQUNFIDw8IFRBQjsKKwlmaWx0ZXJUUC0+dG9TdHJlYW0oQVZNX09TX1RSQUNFIDw8IEFWTV9UQUJfSU5ERU5UKTsKKwlBVk1fT1NfVFJBQ0UgPDwgRU5EX0lOREVOVDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIFBST0NFU1NPUiAsIFRSQUNFICkKKworCWlmKCBhVFAtPmlzVmlydHVhbCgpICkKKwl7CisJCXJldHVybiggdHJ1ZSApOworCX0KKwllbHNlIGlmKCAoZmlsdGVyVFAtPm5hdHVyZSAhPSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9VTkRFRklORURfTkFUVVJFKSApCisJeworCQlpZiggKGZpbHRlclRQLT5uYXR1cmUgIT0gYVRQLT5uYXR1cmUpICkKKwkJeworCQkJaWYoIGFUUC0+bmF0dXJlID09IEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX01BQ0hJTkVfTkFUVVJFICkKKwkJCXsKKwkJCQlpZiggZmlsdGVyVFAtPm5hdHVyZSA9PSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9TVEFURV9OQVRVUkUgKQorCQkJCXsKKwkJCQkJaWYoIChhVFAtPm9iamVjdCAhPSBOVUxMKQorCQkJCQkJJiYgKG5vdCBhVFAtPm9iamVjdC0+dG88IEluc3RhbmNlT2ZNYWNoaW5lID4oKS0+CisJCQkJCQkJCWdldFNwZWNpZmllcigpLmlzRmFtaWx5Q29tcG9uZW50U3RhdGUoKSkgKQorCQkJCQl7CisJCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZiggZmlsdGVyVFAtPm5hdHVyZSA9PQorCQkJCQkJRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfU1RBVEVNQUNISU5FX05BVFVSRSApCisJCQkJeworCQkJCQlpZiggKGFUUC0+b2JqZWN0ICE9IE5VTEwpCisJCQkJCQkmJiAobm90IGFUUC0+b2JqZWN0LT50bzwgSW5zdGFuY2VPZk1hY2hpbmUgPigpLT4KKwkJCQkJCQlnZXRTcGVjaWZpZXIoKS5pc0NvbXBvbmVudFN0YXRlbWFjaGluZSgpKSApCisvLwkJCQkJCSYmIChub3QgYVRQLT5vYmplY3QtPnRvPCBJbnN0YW5jZU9mTWFjaGluZSA+KCktPgorLy8JCQkJCQkJZ2V0U3BlY2lmaWVyKCkuaXNNb2NTdGF0ZVRyYW5zaXRpb25TdHJ1Y3R1cmUoKSkgKQorCQkJCQl7CisJCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWVsc2UgaWYoIChmaWx0ZXJUUC0+bmF0dXJlICE9IEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX0NPTV9OQVRVUkUpCisJCQkJCXx8IChub3QgRU5VTV9UUkFDRV9QT0lOVDo6aXNfY29tKGFUUC0+bmF0dXJlKSkgKQorCQkJeworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJfQorCX0KKworCWlmKCAoZmlsdGVyVFAtPm9wICE9IEFWTV9PUENPREVfTlVMTCkgJiYgKGZpbHRlclRQLT5vcCAhPSBhVFAtPm9wKSApCisJeworCQlzd2l0Y2goIGZpbHRlclRQLT5vcCApCisJCXsKKwkJCWNhc2UgQVZNX09QQ09ERV9JTlBVVDoKKwkJCXsKKwkJCQlzd2l0Y2goIGFUUC0+b3AgKQorCQkJCXsKKwkJCQkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUOgorCQkJCQljYXNlIEFWTV9PUENPREVfSU5QVVRfQlJPQURDQVNUOgorCQkJCQljYXNlIEFWTV9PUENPREVfSU5QVVRfQlVGRkVSOgorCQkJCQljYXNlIEFWTV9PUENPREVfSU5QVVRfRU5WOgorCQkJCQljYXNlIEFWTV9PUENPREVfSU5QVVRfRkxPVzoKKwkJCQkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUX0ZST006CisJCQkJCWNhc2UgQVZNX09QQ09ERV9JTlBVVF9NVUxUSV9SRFY6CisJCQkJCWNhc2UgQVZNX09QQ09ERV9JTlBVVF9SRFY6CisJCQkJCWNhc2UgQVZNX09QQ09ERV9JTlBVVF9ERUxFR0FURToKKwkJCQkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUX1ZBUjoKKwkJCQkJeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQlkZWZhdWx0OgorCQkJCQl7CisJCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNhc2UgQVZNX09QQ09ERV9PVVRQVVQ6CisJCQl7CisJCQkJc3dpdGNoKCBhVFAtPm9wICkKKwkJCQl7CisJCQkJCWNhc2UgQVZNX09QQ09ERV9PVVRQVVQ6CisJCQkJCWNhc2UgQVZNX09QQ09ERV9PVVRQVVRfQlJPQURDQVNUOgorCQkJCQljYXNlIEFWTV9PUENPREVfT1VUUFVUX0JVRkZFUjoKKwkJCQkJY2FzZSBBVk1fT1BDT0RFX09VVFBVVF9FTlY6CisJCQkJCWNhc2UgQVZNX09QQ09ERV9PVVRQVVRfRkxPVzoKKwkJCQkJY2FzZSBBVk1fT1BDT0RFX09VVFBVVF9NVUxUSV9SRFY6CisJCQkJCWNhc2UgQVZNX09QQ09ERV9PVVRQVVRfUkRWOgorCQkJCQljYXNlIEFWTV9PUENPREVfT1VUUFVUX1RPOgorCQkJCQljYXNlIEFWTV9PUENPREVfT1VUUFVUX0RFTEVHQVRFOgorCQkJCQljYXNlIEFWTV9PUENPREVfT1VUUFVUX1ZBUjoKKwkJCQkJeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQlkZWZhdWx0OgorCQkJCQl7CisJCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNhc2UgQVZNX09QQ09ERV9FTkFCTEVfU0VUOgorCQkJeworCQkJCXN3aXRjaCggYVRQLT5vcCApCisJCQkJeworCQkJCQljYXNlIEFWTV9PUENPREVfUlVOOgorCQkJCQljYXNlIEFWTV9PUENPREVfSVJVTjoKKwkJCQkJeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQlkZWZhdWx0OgorCQkJCQl7CisJCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJfQorCQl9CisJfQorCisJaWYoIChmaWx0ZXJUUC0+bWFjaGluZSAhPSBOVUxMKSAmJiAoZmlsdGVyVFAtPm1hY2hpbmUgIT0gYVRQLT5tYWNoaW5lKSApCisJeworCQlpZiggYVRQLT5jb25maWcgIT0gTlVMTCApCisJCXsKKwkJCWlmKCBmaWx0ZXJUUC0+bWFjaGluZS0+Z2V0U3BlY2lmaWVyKCkuaXNEZXNpZ25Nb2RlbCgpICkKKwkJCXsKKwkJCQlSdW50aW1lSUQgYVJJRCA9IGFUUC0+Y29uZmlnLT5nZXRSdW50aW1lSUQoKTsKKworCQkJCXdoaWxlKCBhUklELnZhbGlkKCkKKwkJCQkJJiYgKGFSSUQuZ2V0TW9kZWxJbnN0YW5jZSgpICE9IGZpbHRlclRQLT5tYWNoaW5lKSApCisJCQkJeworCQkJCQlhUklEID0gYVJJRC5nZXRQUklEKCk7CisJCQkJfQorCisJCQkJaWYoIGFSSUQuaW52YWxpZCgpICkKKwkJCQl7CisJCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJUnVudGltZUlEIGFSSUQgPSBhVFAtPmNvbmZpZy0+Z2V0UnVudGltZUlEKCk7CisKKwkJCQl3aGlsZSggYVJJRC52YWxpZCgpICYmCisJCQkJCQkoYVJJRC5nZXRJbnN0YW5jZSgpICE9IGZpbHRlclRQLT5tYWNoaW5lKSApCisJCQkJeworCQkJCQlhUklEID0gYVJJRC5nZXRQUklEKCk7CisJCQkJfQorCisJCQkJaWYoIGFSSUQuaW52YWxpZCgpICkKKwkJCQl7CisJCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZiggKGZpbHRlclRQLT5vYmplY3QgIT0gTlVMTCkgJiYgKGZpbHRlclRQLT5vYmplY3QgIT0gYVRQLT5vYmplY3QpICkKKwl7CisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwlpZiggZmlsdGVyVFAtPnZhbHVlLnZhbGlkKCkgJiYgZmlsdGVyVFAtPnZhbHVlLmlzRVEoYVRQLT52YWx1ZSkgKQorCXsKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCXJldHVybiggdHJ1ZSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBGSUxURVJJTkcgQVBJIDogY2hlY2sgaWYgVkFSSUFCTEUgcGFzcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBUcmFjZUZpbHRlcjo6cGFzcyhjb25zdCBSdW50aW1lSUQgJiBhUklELCBJbnN0YW5jZU9mRGF0YSAqIGFWYXJpYWJsZSkKK3sKKwlpZiggbGlzdE9mVmFyaWFibGVUcmFjZVBvaW50Lm5vbmVtcHR5KCkgKQorCXsKKwkJTGlzdE9mVHJhY2VQb2ludDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBsaXN0T2ZWYXJpYWJsZVRyYWNlUG9pbnQuYmVnaW4oKTsKKwkJTGlzdE9mVHJhY2VQb2ludDo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBsaXN0T2ZWYXJpYWJsZVRyYWNlUG9pbnQuZW5kKCk7CisKKwkJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApCisJCXsKKwkJCWlmKCBwYXNzKCppdCwgYVJJRCwgYVZhcmlhYmxlKSApCisJCQl7CisJCQkJcmV0dXJuKCB0cnVlICk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKworYm9vbCBUcmFjZUZpbHRlcjo6cGFzcyhUcmFjZVBvaW50ICogZmlsdGVyVFAsCisJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsIEluc3RhbmNlT2ZEYXRhICogYVZhcmlhYmxlKQoreworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgVFJBQ0UgKQorCUFWTV9PU19UUkFDRSA8PCBUQUI7CisJZmlsdGVyVFAtPnRvU3RyZWFtKEFWTV9PU19UUkFDRSA8PCBBVk1fVEFCX0lOREVOVCk7CisJQVZNX09TX1RSQUNFIDw8IEVORF9JTkRFTlQ7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBQUk9DRVNTT1IgLCBUUkFDRSApCisKKwkJaWYoIGZpbHRlclRQLT5uYXR1cmUgPT0gRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfVkFSSUFCTEVfTkFUVVJFICkKKwkJeworCQkJaWYoIGZpbHRlclRQLT5vcCA9PSBBVk1fT1BDT0RFX0FTU0lHTiApCisJCQl7CisJCQkJLy8hISBJR05PUkVECisJCQl9CisKKworCQkJaWYoIChmaWx0ZXJUUC0+bWFjaGluZSA9PSBOVUxMKQorCQkJCXx8ICggKGZpbHRlclRQLT5tYWNoaW5lID09IGFSSUQuZ2V0SW5zdGFuY2UoKSkKKwkJCQkJJiYgZmlsdGVyVFAtPm1hY2hpbmUtPmdldFNwZWNpZmllcigpLmhhc0Rlc2lnbkluc3RhbmNlKCkgKQorCQkJCXx8ICggKGZpbHRlclRQLT5tYWNoaW5lLT5nZXRFeGVjdXRhYmxlKCkgPT0gYVJJRC5nZXRFeGVjdXRhYmxlKCkpCisJCQkJCSYmIGZpbHRlclRQLT5tYWNoaW5lLT5nZXRTcGVjaWZpZXIoKS5oYXNEZXNpZ25Nb2RlbCgpICkgKQorCQkJeworCQkJCXJldHVybiggZmlsdGVyVFAtPmFueV9vYmplY3QgfHwKKwkJCQkJCShmaWx0ZXJUUC0+b2JqZWN0ID09IGFWYXJpYWJsZSkgKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiggZmFsc2UgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBGSUxURVJJTkcgQVBJIDogY2hlY2sgaWYgRXhlY3V0aW9uIFRyYWNlCisvLyBhLmsuYS4gRXhlY3V0aW9uQ29uZmlndXJhdGlvbiBwYXNzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgVHJhY2VGaWx0ZXI6OnBhc3MoVHJhY2VQb2ludCAqIGZpbHRlclRQLAorCQlFeGVjdXRpb25Db25maWd1cmF0aW9uICogYW5FeGVjQ29uZlRQKQoreworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgVFJBQ0UgKQorCUFWTV9PU19UUkFDRSA8PCBUQUI7CisJZmlsdGVyVFAtPnRvU3RyZWFtKEFWTV9PU19UUkFDRSA8PCBBVk1fVEFCX0lOREVOVCk7CisJQVZNX09TX1RSQUNFIDw8IEVORF9JTkRFTlQ7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBQUk9DRVNTT1IgLCBUUkFDRSApCisKKwlpZiggYW5FeGVjQ29uZlRQLT5pc0F2bUNvZGUoKSApCisJeworCQlyZXR1cm4oIHBhc3MoZmlsdGVyVFAsIGFuRXhlY0NvbmZUUC0+Z2V0QXZtQ29kZSgpKSApOworCX0KKwllbHNlIGlmKCBhbkV4ZWNDb25mVFAtPmlzVHJhbnNpdGlvbigpICkKKwl7CisJCXJldHVybiggcGFzcyhmaWx0ZXJUUCwgYW5FeGVjQ29uZlRQLT5nZXRSdW50aW1lSUQoKSwKKwkJCQlhbkV4ZWNDb25mVFAtPmdldFRyYW5zaXRpb24oKSkgKTsKKwl9CisJZWxzZSBpZiggYW5FeGVjQ29uZlRQLT5pc09wZXJhdG9yKCkgJiYgKGZpbHRlclRQLT5vcCAhPSBBVk1fT1BDT0RFX05VTEwpICkKKwl7CisJCUFWTV9PUENPREUgb3Bjb2RlVFAgPSBhbkV4ZWNDb25mVFAtPmdldE9wZXJhdG9yKCktPmdldE9wdGltaXplZE9wQ29kZSgpOworCisJCWlmKCAoZmlsdGVyVFAtPm9wICE9IEFWTV9PUENPREVfTlVMTCkgJiYgKGZpbHRlclRQLT5vcCAhPSBvcGNvZGVUUCApICkKKwkJeworCQkJc3dpdGNoKCBmaWx0ZXJUUC0+b3AgKQorCQkJeworCQkJCWNhc2UgQVZNX09QQ09ERV9FTkFCTEVfU0VUOgorCQkJCXsKKwkJCQkJc3dpdGNoKCBvcGNvZGVUUCApCisJCQkJCXsKKwkJCQkJCWNhc2UgQVZNX09QQ09ERV9SVU46CisJCQkJCQljYXNlIEFWTV9PUENPREVfSVJVTjoKKwkJCQkJCXsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCWRlZmF1bHQ6CisJCQkJCQl7CisJCQkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmKCAoZmlsdGVyVFAtPm1hY2hpbmUgPT0gTlVMTCkKKwkJCXx8ICggKGZpbHRlclRQLT5tYWNoaW5lID09CisJCQkJCWFuRXhlY0NvbmZUUC0+Z2V0UnVudGltZUlEKCkuZ2V0SW5zdGFuY2UoKSkKKwkJCQkmJiBmaWx0ZXJUUC0+bWFjaGluZS0+Z2V0U3BlY2lmaWVyKCkuaGFzRGVzaWduSW5zdGFuY2UoKSApCisJCQl8fCAoIChmaWx0ZXJUUC0+bWFjaGluZS0+Z2V0RXhlY3V0YWJsZSgpID09CisJCQkJCWFuRXhlY0NvbmZUUC0+Z2V0UnVudGltZUlEKCkuZ2V0RXhlY3V0YWJsZSgpKQorCQkJCSYmIGZpbHRlclRQLT5tYWNoaW5lLT5nZXRTcGVjaWZpZXIoKS5oYXNEZXNpZ25Nb2RlbCgpICkgKQorCQl7CisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBGSUxURVJJTkcgQVBJIDogY2hlY2sgaWYgYSBDb21waWxlZCBFbGVtZW50IHBhc3MKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBUcmFjZUZpbHRlcjo6cGFzcyhUcmFjZVBvaW50ICogZmlsdGVyVFAsCisJCWNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsIEJhc2VDb21waWxlZEZvcm0gKiBhbkVsZW1lbnQpCit7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBQUk9DRVNTT1IgLCBUUkFDRSApCisJQVZNX09TX1RSQUNFIDw8IFRBQjsKKwlmaWx0ZXJUUC0+dG9TdHJlYW0oQVZNX09TX1RSQUNFIDw8IEFWTV9UQUJfSU5ERU5UKTsKKwlBVk1fT1NfVFJBQ0UgPDwgRU5EX0lOREVOVDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIFBST0NFU1NPUiAsIFRSQUNFICkKKworCWlmKCAoZmlsdGVyVFAtPm1hY2hpbmUgPT0gTlVMTCkKKwkJfHwgKCAoZmlsdGVyVFAtPm1hY2hpbmUgPT0gYVJJRC5nZXRJbnN0YW5jZSgpKQorCQkJJiYgZmlsdGVyVFAtPm1hY2hpbmUtPmdldFNwZWNpZmllcigpLmhhc0Rlc2lnbkluc3RhbmNlKCkgKQorCQl8fCAoIChmaWx0ZXJUUC0+bWFjaGluZS0+Z2V0RXhlY3V0YWJsZSgpID09IGFSSUQuZ2V0RXhlY3V0YWJsZSgpKQorCQkJJiYgZmlsdGVyVFAtPm1hY2hpbmUtPmdldFNwZWNpZmllcigpLmhhc0Rlc2lnbk1vZGVsKCkgKSApCisJeworCQlyZXR1cm4oIGZpbHRlclRQLT5hbnlfb2JqZWN0IHx8CisJCQkJKGZpbHRlclRQLT5vYmplY3QgPT0gYW5FbGVtZW50KSApOworCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBGSUxURVJJTkcgQVBJIDogY2hlY2sgaWYgYSBSdW50aW1lIE1hY2hpbmUgSUQgcGFzcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIFRyYWNlRmlsdGVyOjpwYXNzKFRyYWNlUG9pbnQgKiBmaWx0ZXJUUCwgY29uc3QgUnVudGltZUlEICYgYVJJRCkKK3sKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIFBST0NFU1NPUiAsIFRSQUNFICkKKwlBVk1fT1NfVFJBQ0UgPDwgVEFCOworCWZpbHRlclRQLT50b1N0cmVhbShBVk1fT1NfVFJBQ0UgPDwgQVZNX1RBQl9JTkRFTlQpOworCUFWTV9PU19UUkFDRSA8PCBFTkRfSU5ERU5UOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgVFJBQ0UgKQorCisJc3dpdGNoKCBmaWx0ZXJUUC0+bmF0dXJlICkKKwl7CisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfUlVOTkFCTEVfTkFUVVJFOgorCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX01BQ0hJTkVfTkFUVVJFOgorCQl7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfU1RBVEVfTkFUVVJFOgorCQl7CisJCQlpZiggbm90IGFSSUQuZ2V0U3BlY2lmaWVyKCkuaXNGYW1pbHlDb21wb25lbnRTdGF0ZSgpICkKKwkJCXsKKwkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfU1RBVEVNQUNISU5FX05BVFVSRToKKwkJeworCQkJaWYoIChub3QgYVJJRC5nZXRTcGVjaWZpZXIoKS5pc0NvbXBvbmVudFN0YXRlbWFjaGluZSgpKSApCisvLwkJCQkmJiAobm90IGFSSUQuZ2V0U3BlY2lmaWVyKCkuaXNNb2NTdGF0ZVRyYW5zaXRpb25TdHJ1Y3R1cmUoKSkgKQorCQkJeworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorCisJaWYoIGZpbHRlclRQLT5tYWNoaW5lID09IE5VTEwgKQorCXsKKwkJcmV0dXJuKCBmaWx0ZXJUUC0+YW55X29iamVjdAorCQkJCXx8IChmaWx0ZXJUUC0+b2JqZWN0ID09IGFSSUQuZ2V0SW5zdGFuY2UoKSkgKTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuKCAoIChmaWx0ZXJUUC0+bWFjaGluZSA9PSBhUklELmdldEluc3RhbmNlKCkpCisJCQkJJiYgZmlsdGVyVFAtPm1hY2hpbmUtPmdldFNwZWNpZmllcigpLmhhc0Rlc2lnbkluc3RhbmNlKCkgKQorCQkJfHwgKCAoZmlsdGVyVFAtPm1hY2hpbmUtPmdldEV4ZWN1dGFibGUoKSA9PSBhUklELmdldEV4ZWN1dGFibGUoKSkKKwkJCQkmJiBmaWx0ZXJUUC0+bWFjaGluZS0+Z2V0U3BlY2lmaWVyKCkuaGFzRGVzaWduTW9kZWwoKSApICk7CisJfQorCisJcmV0dXJuKCBmYWxzZSApOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRklMVEVSSU5HIEFQSSA6IGNoZWNrIGlmIEFWTSBDT0RFIHBhc3MKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgVHJhY2VGaWx0ZXI6OnBhc3MoVHJhY2VQb2ludCAqIGZpbHRlclRQLCBBdm1Db2RlICogYUNvZGVUUCkKK3sKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIFBST0NFU1NPUiAsIFRSQUNFICkKKwlBVk1fT1NfVFJBQ0UgPDwgVEFCOworCWZpbHRlclRQLT50b1N0cmVhbShBVk1fT1NfVFJBQ0UgPDwgQVZNX1RBQl9JTkRFTlQpOworCUFWTV9PU19UUkFDRSA8PCBFTkRfSU5ERU5UOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgVFJBQ0UgKQorCisJQVZNX09QQ09ERSBvcGNvZGVUUCA9IGFDb2RlVFAtPmdldE9wdGltaXplZE9wQ29kZSgpOworCisJaWYoIChmaWx0ZXJUUC0+b3AgIT0gQVZNX09QQ09ERV9OVUxMKSAmJiAoZmlsdGVyVFAtPm9wICE9IG9wY29kZVRQICkgKQorCXsKKwkJc3dpdGNoKCBmaWx0ZXJUUC0+b3AgKQorCQl7CisJCQljYXNlIEFWTV9PUENPREVfSU5QVVQ6CisJCQl7CisJCQkJc3dpdGNoKCBvcGNvZGVUUCApCisJCQkJeworCQkJCQljYXNlIEFWTV9PUENPREVfSU5QVVQ6CisJCQkJCWNhc2UgQVZNX09QQ09ERV9JTlBVVF9CUk9BRENBU1Q6CisJCQkJCWNhc2UgQVZNX09QQ09ERV9JTlBVVF9CVUZGRVI6CisJCQkJCWNhc2UgQVZNX09QQ09ERV9JTlBVVF9FTlY6CisJCQkJCWNhc2UgQVZNX09QQ09ERV9JTlBVVF9GTE9XOgorCQkJCQljYXNlIEFWTV9PUENPREVfSU5QVVRfRlJPTToKKwkJCQkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUX01VTFRJX1JEVjoKKwkJCQkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUX1JEVjoKKwkJCQkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUX0RFTEVHQVRFOgorCQkJCQljYXNlIEFWTV9PUENPREVfSU5QVVRfVkFSOgorCQkJCQl7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCWRlZmF1bHQ6CisJCQkJCXsKKwkJCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQkJY2FzZSBBVk1fT1BDT0RFX09VVFBVVDoKKwkJCXsKKwkJCQlzd2l0Y2goIG9wY29kZVRQICkKKwkJCQl7CisJCQkJCWNhc2UgQVZNX09QQ09ERV9PVVRQVVQ6CisJCQkJCWNhc2UgQVZNX09QQ09ERV9PVVRQVVRfQlJPQURDQVNUOgorCQkJCQljYXNlIEFWTV9PUENPREVfT1VUUFVUX0JVRkZFUjoKKwkJCQkJY2FzZSBBVk1fT1BDT0RFX09VVFBVVF9FTlY6CisJCQkJCWNhc2UgQVZNX09QQ09ERV9PVVRQVVRfRkxPVzoKKwkJCQkJY2FzZSBBVk1fT1BDT0RFX09VVFBVVF9NVUxUSV9SRFY6CisJCQkJCWNhc2UgQVZNX09QQ09ERV9PVVRQVVRfUkRWOgorCQkJCQljYXNlIEFWTV9PUENPREVfT1VUUFVUX1RPOgorCQkJCQljYXNlIEFWTV9PUENPREVfT1VUUFVUX0RFTEVHQVRFOgorCQkJCQljYXNlIEFWTV9PUENPREVfT1VUUFVUX1ZBUjoKKwkJCQkJeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQlkZWZhdWx0OgorCQkJCQl7CisJCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNhc2UgQVZNX09QQ09ERV9FTkFCTEVfU0VUOgorCQkJeworCQkJCXN3aXRjaCggb3Bjb2RlVFAgKQorCQkJCXsKKwkJCQkJY2FzZSBBVk1fT1BDT0RFX1JVTjoKKwkJCQkJY2FzZSBBVk1fT1BDT0RFX0lSVU46CisJCQkJCXsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJZGVmYXVsdDoKKwkJCQkJeworCQkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCQlkZWZhdWx0OgorCQkJeworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJfQorCX0KKworCWlmKCBhQ29kZVRQLT5lbXB0eSgpICkKKwl7CisJCXJldHVybiggdHJ1ZSApOworCX0KKworCWlmKCAoZmlsdGVyVFAtPm1hY2hpbmUgIT0gTlVMTCkKKwkJJiYgKGFDb2RlVFAtPmZpcnN0KCkgPT0gZmlsdGVyVFAtPm1hY2hpbmUpICkKKwl7CisJCXJldHVybiggdHJ1ZSApOworCX0KKworCWlmKCAoZmlsdGVyVFAtPm9iamVjdCAhPSBOVUxMKQorCQkmJiAoYUNvZGVUUC0+Zmlyc3QoKSA9PSBmaWx0ZXJUUC0+b2JqZWN0KSApCisJeworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKwlpZiggZmlsdGVyVFAtPnZhbHVlLnZhbGlkKCkgJiYgYUNvZGVUUC0+cG9wdWxhdGVkKCkgKQorCXsKKwkJaWYoIGZpbHRlclRQLT52YWx1ZS5pczwgQXJyYXlCRiA+KCkgKQorCQl7CisJCQljb25zdCBBcnJheUJGICYgYXJyYXlWYWx1ZSA9IGZpbHRlclRQLT52YWx1ZS50b19yZWY8IEFycmF5QkYgPigpOworCQkJYXZtX3NpemVfdCBhcnJheVNpemUgPSBhcnJheVZhbHVlLnNpemUoKTsKKworCQkJaWYoIGFycmF5U2l6ZSA9PSBhQ29kZVRQLT5zaXplKCkgKQorCQkJeworCQkJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0VFAgPSBhQ29kZVRQLT5iZWdpbigpOworCisJCQkJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDAgOworCQkJCQkJKG9mZnNldCA8IGFycmF5U2l6ZSkgOyArK29mZnNldCAsICsraXRUUCApCisJCQkJeworCQkJCQlpZiggbm90ICgqaXRUUCkuaXNFUSggYXJyYXlWYWx1ZVtvZmZzZXRdICkgKQorCQkJCQl7CisJCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4oIGZpbHRlclRQLT52YWx1ZS5pc0VRKCBhQ29kZVRQLT5zZWNvbmQoKSApICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU0VSSUFMSVpBVElPTiBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgVHJhY2VGaWx0ZXI6OnRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdAoreworCW9zIDw8IFRBQiA8PCAiZmlsdGVyIHsgIgorCQkJPDwgT3BlcmF0b3JMaWI6OnRvX3N0cmluZyhtYWluVHJhY2VQb2ludEZpdGVyLmdldEF2bU9wQ29kZSgpKQorCQkJPDwgRU9MX0lOQ1JfSU5ERU5UOworCisJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtYWluVHJhY2VQb2ludEZpdGVyLmJlZ2luKCk7CisJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBtYWluVHJhY2VQb2ludEZpdGVyLmVuZCgpOworCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCXsKKwkJKCppdCkudG9TdHJlYW0ob3MpOworCX0KKworCW9zIDw8IERFQ1JfSU5ERU5UX1RBQiA8PCAifSIgPDwgRU9MX0ZMVVNIOworCisJb3MgPDwgVEFCIDw8ICJmbGFnIFsgIiA8PCBFT0xfSU5DUl9JTkRFTlQKKwkJPDwgVEFCIDw8ICJDb25kaXRpb24gIDogWyAiIDw8IG1Db25kaXRpb25GbGFnCisJCTw8ICIgLCBkZWNpc2lvbjoiIDw8IG1EZWNpc2lvbkZsYWcKKwkJPDwgIiBdIjw8IEVPTAorCisJCTw8IFRBQiA8PCAiVHJhY2VfY29uZCA6IFsgcGF0aDoiIDw8IG1QYXRoQ29uZGl0aW9uRmxhZworCQk8PCAiICwgbm9kZToiIDw8IG1Ob2RlQ29uZGl0aW9uRmxhZworCQk8PCAiIF0iPDwgRU9MCisKKwkJPDwgVEFCIDw8ICJUaW1lZF9jb25kIDogWyBwYXRoOiIgPDwgbVBhdGhUaW1lZENvbmRpdGlvbkZsYWcKKwkJPDwgIiAsIG5vZGU6IiA8PCBtTm9kZVRpbWVkQ29uZGl0aW9uRmxhZworCQk8PCAiIF0iPDwgRU9MCisKKwkJPDwgVEFCIDw8ICJMZWFmX2NvbmQgIDogWyBwYXRoOiIgPDwgbVBhdGhDb25kaXRpb25MZWFmTm9kZUZsYWcKKwkJPDwgIiAsIHRpbWVkOiIgPDwgbVBhdGhUaW1lZENvbmRpdGlvbkxlYWZOb2RlRmxhZworCQk8PCAiIF0iPDwgRU9MCisKKwkJPDwgVEFCIDw8ICJWYXJpYWJsZSAgIDogWyB0aW1lOiIgPDwgbVRpbWVGaWx0ZXJGbGFnCisJCTw8ICIgLCBhc3NpZ246IiA8PCBtQXNzaWduRmlsdGVyRmxhZworCQk8PCAiICwgbmV3ZnJlc2g6IiA8PCBtTmV3ZnJlc2hGaWx0ZXJGbGFnCisJCTw8ICIgXSI8PCBFT0wKKworCQk8PCBUQUIgPDwgIklucHV0ICAgICAgOiBbICIgPDwgbUlucHV0RmlsdGVyRmxhZworCQk8PCAiICwgZW52OiIgPDwgbUlucHV0RW52RmlsdGVyRmxhZworCQk8PCAiICwgcmR2OiIgPDwgbUlucHV0UmR2RmlsdGVyRmxhZyA8PCAiIF0iPDwgRU9MCisKKwkJPDwgVEFCIDw8ICJPdXRwdXQgICAgIDogWyAiIDw8IG1PdXRwdXRGaWx0ZXJGbGFnCisJCTw8ICIgLCBlbnY6IiA8PCBtT3V0cHV0RW52RmlsdGVyRmxhZworCQk8PCAiICwgcmR2OiIgPDwgbU91dHB1dFJkdkZpbHRlckZsYWcKKwkJPDwgIiBdIjw8IEVPTAorCisJCTw8IFRBQiA8PCAiTWFjaGluZSAgICA6IFsgIiA8PCBtTWFjaGluZUZpbHRlckZsYWcKKwkJPDwgIiAsIHN0YXRlOiIgPDwgbVN0YXRlRmlsdGVyRmxhZworCQk8PCAiICwgc3RhdGVtYWNoaW5lOiIgPDwgbVN0YXRlbWFjaGluZUZpbHRlckZsYWcKKwkJPDwgIiBdIjw8IEVPTAorCisJCTw8IFRBQiA8PCAiUm91dGluZSAgICA6IFsgIiA8PCBtUm91dGluZUZpbHRlckZsYWcKKwkJPDwgIiAsIHRyYW5zaXRpb246IiA8PCBtVHJhbnNpdGlvbkZpbHRlckZsYWcKKwkJPDwgIiBdIjw8IEVPTAorCisJCTw8IFRBQiA8PCAiQWJzdHJhY3QgICA6IFsgY29tOiIgPDwgbUNvbUZpbHRlckZsYWcKKwkJPDwgIiAsIGlvI3RyYWNlOiIgPDwgbUlPVHJhY2VGaWx0ZXJGbGFnCisJCTw8ICIgLCBydW5uYWJsZToiIDw8IG1SdW5uYWJsZUZpbHRlckZsYWcKKwkJPDwgIiBdIjw8IEVPTAorCQk8PCBERUNSX0lOREVOVF9UQUIgPDwgIl0iIDw8IEVPTF9GTFVTSDsKK30KKworCisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvdHJhY2UvVHJhY2VGaWx0ZXIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90cmFjZS9UcmFjZUZpbHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZDlkYzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvdHJhY2UvVHJhY2VGaWx0ZXIuaApAQCAtMCwwICsxLDY0OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDExIGTDqWMuIDIwMTMKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBUUkFDRUZJTFRFUl9IXworI2RlZmluZSBUUkFDRUZJTFRFUl9IXworCisjaW5jbHVkZSA8Y29sbGVjdGlvbi9MaXN0Lmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9Bdm1Db2RlLmg+CisKKyNpbmNsdWRlIDxmbWwvb3BlcmF0b3IvT3BlcmF0b3JMaWIuaD4KKworI2luY2x1ZGUgPGZtbC90cmFjZS9UcmFjZVBvaW50Lmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIEJGOworCitjbGFzcyBFdmFsdWF0aW9uRW52aXJvbm1lbnQ7CitjbGFzcyBFeGVjdXRpb25Db25maWd1cmF0aW9uOworY2xhc3MgRXhlY3V0YWJsZVN5c3RlbTsKKworCitjbGFzcyBJbnN0YW5jZU9mRGF0YTsKKworY2xhc3MgVHJhY2VGaWx0ZXIKK3sKKworcHVibGljOgorCS8qKgorCSAqIEFUVFJJQlVURQorCSAqLworCUF2bUNvZGUgbWFpblRyYWNlUG9pbnRGaXRlcjsKKworCUxpc3RPZlRyYWNlUG9pbnQgbGlzdE9mVmFyaWFibGVUcmFjZVBvaW50OworCisJSW5zdGFuY2VPZkRhdGEgKiBvYmplY3REZWx0YVRpbWU7CisKK3Byb3RlY3RlZDoKKworCWJvb2wgbUNvbmRpdGlvbkZsYWc7CisJYm9vbCBtRGVjaXNpb25GbGFnOworCisJYm9vbCBtUGF0aENvbmRpdGlvbkZsYWc7CisJYm9vbCBtUGF0aFRpbWVkQ29uZGl0aW9uRmxhZzsKKworCWJvb2wgbVBhdGhDb25kaXRpb25MZWFmTm9kZUZsYWc7CisJYm9vbCBtUGF0aFRpbWVkQ29uZGl0aW9uTGVhZk5vZGVGbGFnOworCisJYm9vbCBtTm9kZUNvbmRpdGlvbkZsYWc7CisJYm9vbCBtTm9kZVRpbWVkQ29uZGl0aW9uRmxhZzsKKworCWJvb2wgbU5vZGVDb25kaXRpb25MZWFmTm9kZUZsYWc7CisJYm9vbCBtTm9kZVRpbWVkQ29uZGl0aW9uTGVhZk5vZGVGbGFnOworCisJYm9vbCBtVGltZUZpbHRlckZsYWc7CisJYm9vbCBtQXNzaWduRmlsdGVyRmxhZzsKKwlib29sIG1OZXdmcmVzaEZpbHRlckZsYWc7CisKKwlib29sIG1JbnB1dEVudkZpbHRlckZsYWc7CisJYm9vbCBtSW5wdXRSZHZGaWx0ZXJGbGFnOworCisJYm9vbCBtSW5wdXRFeHRlcm5hbEZpbHRlckZsYWc7CisJYm9vbCBtSW5wdXRJbnRlcm5hbEZpbHRlckZsYWc7CisJYm9vbCBtSW5wdXRGaWx0ZXJGbGFnOworCisJYm9vbCBtT3V0cHV0RW52RmlsdGVyRmxhZzsKKwlib29sIG1PdXRwdXRSZHZGaWx0ZXJGbGFnOworCisJYm9vbCBtT3V0cHV0RXh0ZXJuYWxGaWx0ZXJGbGFnOworCWJvb2wgbU91dHB1dEludGVybmFsRmlsdGVyRmxhZzsKKwlib29sIG1PdXRwdXRGaWx0ZXJGbGFnOworCisJYm9vbCBtTWFjaGluZUZpbHRlckZsYWc7CisJYm9vbCBtU3RhdGVGaWx0ZXJGbGFnOworCWJvb2wgbVN0YXRlbWFjaGluZUZpbHRlckZsYWc7CisJYm9vbCBtVHJhbnNpdGlvbkZpbHRlckZsYWc7CisJYm9vbCBtUm91dGluZUZpbHRlckZsYWc7CisKKwlib29sIG1Db21FeHRlcm5hbEZpbHRlckZsYWc7CisJYm9vbCBtQ29tSW50ZXJuYWxGaWx0ZXJGbGFnOworCWJvb2wgbUNvbUZpbHRlckZsYWc7CisKKwlib29sIG1JT1RyYWNlRmlsdGVyRmxhZzsKKwlib29sIG1SdW5uYWJsZUZpbHRlckZsYWc7CisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlUcmFjZUZpbHRlcigpCisJOiBtYWluVHJhY2VQb2ludEZpdGVyKCApLAorCWxpc3RPZlZhcmlhYmxlVHJhY2VQb2ludCggKSwKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBDb21wdXRpbmcgVmFyaWFibGVzCisJb2JqZWN0RGVsdGFUaW1lKCBOVUxMICksCisKKwltQ29uZGl0aW9uRmxhZyggZmFsc2UgKSwKKwltRGVjaXNpb25GbGFnKCBmYWxzZSApLAorCisJbVBhdGhDb25kaXRpb25GbGFnKCBmYWxzZSApLAorCW1QYXRoVGltZWRDb25kaXRpb25GbGFnKCBmYWxzZSApLAorCisJbVBhdGhDb25kaXRpb25MZWFmTm9kZUZsYWcoIGZhbHNlICksCisJbVBhdGhUaW1lZENvbmRpdGlvbkxlYWZOb2RlRmxhZyggZmFsc2UgKSwKKworCW1Ob2RlQ29uZGl0aW9uRmxhZyggZmFsc2UgKSwKKwltTm9kZVRpbWVkQ29uZGl0aW9uRmxhZyggZmFsc2UgKSwKKworCW1Ob2RlQ29uZGl0aW9uTGVhZk5vZGVGbGFnKCBmYWxzZSApLAorCW1Ob2RlVGltZWRDb25kaXRpb25MZWFmTm9kZUZsYWcoIGZhbHNlICksCisKKwltVGltZUZpbHRlckZsYWcoIGZhbHNlICksCisJbUFzc2lnbkZpbHRlckZsYWcoIGZhbHNlICksCisJbU5ld2ZyZXNoRmlsdGVyRmxhZyggZmFsc2UgKSwKKworCW1JbnB1dEVudkZpbHRlckZsYWcoIGZhbHNlICksCisJbUlucHV0UmR2RmlsdGVyRmxhZyggZmFsc2UgKSwKKworCW1JbnB1dEV4dGVybmFsRmlsdGVyRmxhZyggZmFsc2UgKSwKKwltSW5wdXRJbnRlcm5hbEZpbHRlckZsYWcoIGZhbHNlICksCisJbUlucHV0RmlsdGVyRmxhZyggZmFsc2UgKSwKKworCW1PdXRwdXRFbnZGaWx0ZXJGbGFnKCBmYWxzZSApLAorCW1PdXRwdXRSZHZGaWx0ZXJGbGFnKCBmYWxzZSApLAorCisJbU91dHB1dEV4dGVybmFsRmlsdGVyRmxhZyggZmFsc2UgKSwKKwltT3V0cHV0SW50ZXJuYWxGaWx0ZXJGbGFnKCBmYWxzZSApLAorCW1PdXRwdXRGaWx0ZXJGbGFnKCBmYWxzZSApLAorCisJbU1hY2hpbmVGaWx0ZXJGbGFnKCBmYWxzZSApLAorCW1TdGF0ZUZpbHRlckZsYWcoIGZhbHNlICksCisJbVN0YXRlbWFjaGluZUZpbHRlckZsYWcoIGZhbHNlICksCisJbVRyYW5zaXRpb25GaWx0ZXJGbGFnKCBmYWxzZSApLAorCW1Sb3V0aW5lRmlsdGVyRmxhZyggZmFsc2UgKSwKKworCW1Db21FeHRlcm5hbEZpbHRlckZsYWcoIGZhbHNlICksCisJbUNvbUludGVybmFsRmlsdGVyRmxhZyggZmFsc2UgKSwKKwltQ29tRmlsdGVyRmxhZyggZmFsc2UgKSwKKworCW1JT1RyYWNlRmlsdGVyRmxhZyggZmFsc2UgKSwKKwltUnVubmFibGVGaWx0ZXJGbGFnKCBmYWxzZSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+VHJhY2VGaWx0ZXIoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQ09ORklHVVJFIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWJvb2wgY29uZmlndXJlKEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOViwKKwkJCVdPYmplY3QgKiB3ZlBhcmFtZXRlck9iamVjdCwgV09iamVjdCAqIHdmVHJhY2VPYmplY3QpOworCisJYm9vbCBjb25maWd1cmUoRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WLCBXT2JqZWN0ICogd2ZQYXJhbWV0ZXJPYmplY3QsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFXU2VxdWVuY2VOYW1lSUQsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFXU2VxdWVuY2VFbHNlTmFtZUlEKTsKKworCWlubGluZSBib29sIGNvbmZpZ3VyZSgKKwkJCUV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOViwgV09iamVjdCAqIHdmUGFyYW1ldGVyT2JqZWN0KQorCXsKKwkJcmV0dXJuKCBjb25maWd1cmUoRU5WLCB3ZlBhcmFtZXRlck9iamVjdCwgInRyYWNlIiwgIlRSQUNFIikgKTsKKwl9CisKKworCWlubGluZSBib29sIGNvbnRhaW5zKEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX05BVFVSRSBuYXR1cmUsIEFWTV9PUENPREUgb3ApCisJeworCQlyZXR1cm4oIG1haW5UcmFjZVBvaW50Rml0ZXIuZW1wdHkoKQorCQkJCXx8ICggKG9wID09IEFWTV9PUENPREVfTlVMTCkKKwkJCQkJJiYgKG5hdHVyZSA9PSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9VTkRFRklORURfTkFUVVJFKSApCisJCQkJfHwgY29udGFpbnMobmF0dXJlLCBvcCwgJiBtYWluVHJhY2VQb2ludEZpdGVyKSApOworCX0KKworCWlubGluZSBib29sIGNvbnRhaW5zKEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX05BVFVSRSBuYXR1cmUpCisJeworCQlyZXR1cm4oIG1haW5UcmFjZVBvaW50Rml0ZXIuZW1wdHkoKSB8fAorCQkJCShuYXR1cmUgPT0gRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfVU5ERUZJTkVEX05BVFVSRSkgfHwKKwkJCQljb250YWlucyhuYXR1cmUsIEFWTV9PUENPREVfTlVMTCwgJiBtYWluVHJhY2VQb2ludEZpdGVyKSApOworCX0KKworCWlubGluZSBib29sIGNvbnRhaW5zKEFWTV9PUENPREUgb3ApCisJeworCQlyZXR1cm4oIGNvbnRhaW5zKEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1VOREVGSU5FRF9OQVRVUkUsIG9wKSApOworCX0KKworCWlubGluZSBib29sIGNvbnRhaW5zT3IoQVZNX09QQ09ERSBvcDEsIEFWTV9PUENPREUgb3AyKQorCXsKKwkJcmV0dXJuKCBjb250YWlucyhFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9VTkRFRklORURfTkFUVVJFLCBvcDEpIHx8CisJCQkJY29udGFpbnMoRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfVU5ERUZJTkVEX05BVFVSRSwgb3AyKSApOworCX0KKworCWlubGluZSBib29sIGNvbnRhaW5zQ29tKCkKKwl7CisJCXJldHVybiggY29udGFpbnMoRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfQ09NX05BVFVSRSAgICApIHx8CisJCQkJY29udGFpbnMoRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfQ0hBTk5FTF9OQVRVUkUpIHx8CisJCQkJY29udGFpbnMoRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTUVTU0FHRV9OQVRVUkUpIHx8CisJCQkJY29udGFpbnMoRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfUE9SVF9OQVRVUkUgICApIHx8CisJCQkJY29udGFpbnMoRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfU0lHTkFMX05BVFVSRSApICApOworCX0KKworCWJvb2wgY29udGFpbnMoRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTkFUVVJFIG5hdHVyZSwKKwkJCUFWTV9PUENPREUgb3AsIEF2bUNvZGUgKiBhQ29kZSkgY29uc3Q7CisKKwlib29sIGNvbnRhaW5zKEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX05BVFVSRSBuYXR1cmUsCisJCQlBVk1fT1BDT0RFIG9wLCBjb25zdCBCRiAmIGFyZykgY29uc3Q7CisKKworCS8qKgorCSAqIFVwZGF0ZQorCSAqIEZpbHRlciBQb2ludCBGbGFncworCSAqLworLy8Jdm9pZCB1cGRhdGVGaWx0ZXJGbGFncygpOworCisKKwlpbmxpbmUgYm9vbCBoYXNDb25kaXRpb25Qb2ludCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Db25kaXRpb25GbGFnICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzRGVjaXNpb25Qb2ludCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1EZWNpc2lvbkZsYWcgKTsKKwl9CisKKworCWlubGluZSBib29sIGhhc1BhdGhDb25kaXRpb25Qb2ludCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1QYXRoQ29uZGl0aW9uRmxhZyApOworCX0KKworCWlubGluZSBib29sIGhhc1BhdGhUaW1lZENvbmRpdGlvblBvaW50KCkgY29uc3QKKwl7CisJCXJldHVybiggbVBhdGhUaW1lZENvbmRpdGlvbkZsYWcgKTsKKwl9CisKKworCWlubGluZSBib29sIGhhc1BhdGhDb25kaXRpb25MZWFmTm9kZVBvaW50KCkgY29uc3QKKwl7CisJCXJldHVybiggbVBhdGhDb25kaXRpb25MZWFmTm9kZUZsYWcgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNQYXRoVGltZWRDb25kaXRpb25MZWFmTm9kZVBvaW50KCkgY29uc3QKKwl7CisJCXJldHVybiggbVBhdGhUaW1lZENvbmRpdGlvbkxlYWZOb2RlRmxhZyApOworCX0KKworCisJaW5saW5lIGJvb2wgaGFzUGF0aENvbmRpdGlvblRyYWNlUG9pbnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUGF0aENvbmRpdGlvbkZsYWcgfHwgbVBhdGhDb25kaXRpb25MZWFmTm9kZUZsYWcgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNQYXRoVGltZWRDb25kaXRpb25UcmFjZVBvaW50KCkgY29uc3QKKwl7CisJCXJldHVybiggbVBhdGhUaW1lZENvbmRpdGlvbkZsYWcgfHwgbVBhdGhUaW1lZENvbmRpdGlvbkxlYWZOb2RlRmxhZyApOworCX0KKworCisJaW5saW5lIGJvb2wgaGFzTm9kZUNvbmRpdGlvblBvaW50KCkgY29uc3QKKwl7CisJCXJldHVybiggbU5vZGVDb25kaXRpb25GbGFnICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzTm9kZVRpbWVkQ29uZGl0aW9uUG9pbnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtTm9kZVRpbWVkQ29uZGl0aW9uRmxhZyApOworCX0KKworCisJaW5saW5lIGJvb2wgaGFzVGltZVBvaW50KCkgY29uc3QKKwl7CisJCXJldHVybiggbVRpbWVGaWx0ZXJGbGFnICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzQXNzaWduUG9pbnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQXNzaWduRmlsdGVyRmxhZyApOworCX0KKworCWlubGluZSBib29sIGhhc05ld2ZyZXNoUG9pbnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtTmV3ZnJlc2hGaWx0ZXJGbGFnICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBoYXNJbnB1dEVudlBvaW50KCkgY29uc3QKKwl7CisJCXJldHVybiggbUlucHV0RW52RmlsdGVyRmxhZyApOworCX0KKworCWlubGluZSBib29sIGhhc0lucHV0UmR2UG9pbnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtSW5wdXRSZHZGaWx0ZXJGbGFnICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzSW5wdXRQb2ludCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1JbnB1dEZpbHRlckZsYWcgKTsKKwl9CisKKworCWlubGluZSBib29sIGhhc091dHB1dEVudlBvaW50KCkgY29uc3QKKwl7CisJCXJldHVybiggbU91dHB1dEVudkZpbHRlckZsYWcgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNPdXRwdXRSZHZQb2ludCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1PdXRwdXRSZHZGaWx0ZXJGbGFnICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzT3V0cHV0UG9pbnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtT3V0cHV0RmlsdGVyRmxhZyApOworCX0KKworCisJaW5saW5lIGJvb2wgaGFzTWFjaGluZVBvaW50KCkgY29uc3QKKwl7CisJCXJldHVybiggbU1hY2hpbmVGaWx0ZXJGbGFnICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzU3RhdGVQb2ludCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1TdGF0ZUZpbHRlckZsYWcgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNTdGF0ZW1hY2hpbmVQb2ludCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1TdGF0ZW1hY2hpbmVGaWx0ZXJGbGFnICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzVHJhbnNpdGlvblBvaW50KCkgY29uc3QKKwl7CisJCXJldHVybiggbVRyYW5zaXRpb25GaWx0ZXJGbGFnICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzUm91dGluZVBvaW50KCkgY29uc3QKKwl7CisJCXJldHVybiggbVJvdXRpbmVGaWx0ZXJGbGFnICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBoYXNDb21Qb2ludCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Db21GaWx0ZXJGbGFnICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzSU9UcmFjZVBvaW50KCkgY29uc3QKKwl7CisJCXJldHVybiggbUlPVHJhY2VGaWx0ZXJGbGFnICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzUnVubmFibGVQb2ludCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1SdW5uYWJsZUZpbHRlckZsYWcgKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBGSUxURVJJTkcgQVBJOiBjaGVjayBpZiBhIGdlbmVyaWMgcG9pbnRlciBFbGVtZW50IHBhc3MKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwl0ZW1wbGF0ZTwgY2xhc3MgVCA+IGJvb2wgcGFzcyhUICogYW5FbGVtZW50KQorCXsKKwkJaWYoIGFuRWxlbWVudCA9PSBOVUxMICkKKwkJeworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisKKworCUFWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggSElHSCAsIFBST0NFU1NPUiAsIFRSQUNFICkKKwkJQVZNX09TX1RSQUNFIDw8IHN0ZDo6ZW5kbDsKKwkJQVZNX09TX1RSQUNFIDw8ICJjYW5kaWRhdCA6PiAiIDw8IGFuRWxlbWVudC0+c3RyKCkgPDwgc3RkOjplbmRsOworCQlBVk1fT1NfVFJBQ0UgPDwgImZpbHRlclRQIDo+IiA8PCBzdGQ6OmVuZGw7CisJQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgVFJBQ0UgKQorCisJCXJldHVybiggcGFzcygmIG1haW5UcmFjZVBvaW50Rml0ZXIsIGFuRWxlbWVudCkgKTsKKwl9CisKKwl0ZW1wbGF0ZTwgY2xhc3MgVCA+IGJvb2wgcGFzcyhjb25zdCBCRiAmIGZpbHRlckFyZywgVCAqIGFuRWxlbWVudCkKKwl7CisJCWlmKCBmaWx0ZXJBcmcuaXM8IFRyYWNlUG9pbnQgPigpICkKKwkJeworCQkJcmV0dXJuKCBwYXNzKGZpbHRlckFyZy50b19wdHI8IFRyYWNlUG9pbnQgPigpLCBhbkVsZW1lbnQpICk7CisJCX0KKworCQllbHNlIGlmKCBmaWx0ZXJBcmcuaXM8IEF2bUNvZGUgPigpICkKKwkJeworCQkJcmV0dXJuKCBwYXNzKGZpbHRlckFyZy50b19wdHI8IEF2bUNvZGUgPigpLCBhbkVsZW1lbnQpICk7CisJCX0KKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCXRlbXBsYXRlPCBjbGFzcyBUID4gYm9vbCBwYXNzKEF2bUNvZGUgKiBmaWx0ZXJDb2RlLCBUICogYW5FbGVtZW50KQorCXsKKwkJc3dpdGNoKCBmaWx0ZXJDb2RlLT5nZXRBdm1PcENvZGUoKSApCisJCXsKKwkJCWNhc2UgQVZNX09QQ09ERV9BTkQ6CisJCQl7CisJCQkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXRGaWx0ZXIgPSBmaWx0ZXJDb2RlLT5iZWdpbigpOworCQkJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gZmlsdGVyQ29kZS0+ZW5kKCk7CisJCQkJZm9yKCA7IGl0RmlsdGVyICE9IGVuZEl0IDsgKytpdEZpbHRlciApCisJCQkJeworCQkJCQlpZiggbm90IHBhc3MoKCppdEZpbHRlciksIGFuRWxlbWVudCkgKQorCQkJCQl7CisJCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCX0KKworCQkJY2FzZSBBVk1fT1BDT0RFX09SOgorCQkJeworCQkJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0RmlsdGVyID0gZmlsdGVyQ29kZS0+YmVnaW4oKTsKKwkJCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IGZpbHRlckNvZGUtPmVuZCgpOworCQkJCWZvciggOyBpdEZpbHRlciAhPSBlbmRJdCA7ICsraXRGaWx0ZXIgKQorCQkJCXsKKwkJCQkJaWYoIHBhc3MoKCppdEZpbHRlciksIGFuRWxlbWVudCkgKQorCQkJCQl7CisJCQkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKworCQkJY2FzZSBBVk1fT1BDT0RFX1hPUjoKKwkJCXsKKwkJCQlhdm1fc2l6ZV90IHBhc3NDb3VudCA9IDA7CisKKwkJCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdEZpbHRlciA9IGZpbHRlckNvZGUtPmJlZ2luKCk7CisJCQkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBmaWx0ZXJDb2RlLT5lbmQoKTsKKwkJCQlmb3IoIDsgaXRGaWx0ZXIgIT0gZW5kSXQgOyArK2l0RmlsdGVyICkKKwkJCQl7CisJCQkJCWlmKCBwYXNzKCgqaXRGaWx0ZXIpLCBhbkVsZW1lbnQpICkKKwkJCQkJeworCQkJCQkJaWYoICsrcGFzc0NvdW50ID4gMSApCisJCQkJCQl7CisJCQkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCisJCQkJcmV0dXJuKCBwYXNzQ291bnQgPT0gMSApOworCQkJfQorCisJCQljYXNlIEFWTV9PUENPREVfTk9UOgorCQkJeworCQkJCXJldHVybiggbm90IHBhc3MoZmlsdGVyQ29kZS0+Zmlyc3QoKSwgYW5FbGVtZW50KSApOworCQkJfQorCisJCQlkZWZhdWx0OgorCQkJeworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJfQorCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIEZJTFRFUklORyBBUEk6IGNoZWNrIGlmIGEgZ2VuZXJpYyByZWZlcmVuY2UgRWxlbWVudCBwYXNzCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJdGVtcGxhdGU8IGNsYXNzIFQgPiBib29sIHBhc3MoVCAmIGFuRWxlbWVudCkKKwl7CisJCWlmKCBhbkVsZW1lbnQgPT0gTlVMTCApCisJCXsKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCisKKwlBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIEhJR0ggLCBQUk9DRVNTT1IgLCBUUkFDRSApCisJCUFWTV9PU19UUkFDRSA8PCBzdGQ6OmVuZGw7CisJCUFWTV9PU19UUkFDRSA8PCAiY2FuZGlkYXQgOj4gIiA8PCBhbkVsZW1lbnQuc3RyKCkgPDwgc3RkOjplbmRsOworCQlBVk1fT1NfVFJBQ0UgPDwgImZpbHRlclRQIDo+IiA8PCBzdGQ6OmVuZGw7CisJQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyKCBISUdIICwgUFJPQ0VTU09SICwgVFJBQ0UgKQorCisJCXJldHVybiggcGFzcygmIG1haW5UcmFjZVBvaW50Rml0ZXIsIGFuRWxlbWVudCkgKTsKKwl9CisKKwl0ZW1wbGF0ZTwgY2xhc3MgVCA+IGJvb2wgcGFzcyhjb25zdCBCRiAmIGZpbHRlckFyZywgVCAmIGFuRWxlbWVudCkKKwl7CisJCWlmKCBmaWx0ZXJBcmcuaXM8IFRyYWNlUG9pbnQgPigpICkKKwkJeworCQkJcmV0dXJuKCBwYXNzKGZpbHRlckFyZy50b19wdHI8IFRyYWNlUG9pbnQgPigpLCBhbkVsZW1lbnQpICk7CisJCX0KKworCQllbHNlIGlmKCBmaWx0ZXJBcmcuaXM8IEF2bUNvZGUgPigpICkKKwkJeworCQkJcmV0dXJuKCBwYXNzKGZpbHRlckFyZy50b19wdHI8IEF2bUNvZGUgPigpLCBhbkVsZW1lbnQpICk7CisJCX0KKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCXRlbXBsYXRlPCBjbGFzcyBUID4gYm9vbCBwYXNzKEF2bUNvZGUgKiBmaWx0ZXJDb2RlLCBUICYgYW5FbGVtZW50KQorCXsKKwkJc3dpdGNoKCBmaWx0ZXJDb2RlLT5nZXRBdm1PcENvZGUoKSApCisJCXsKKwkJCWNhc2UgQVZNX09QQ09ERV9BTkQ6CisJCQl7CisJCQkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgaXRGaWx0ZXIgPSBmaWx0ZXJDb2RlLT5iZWdpbigpOworCQkJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gZmlsdGVyQ29kZS0+ZW5kKCk7CisJCQkJZm9yKCA7IGl0RmlsdGVyICE9IGVuZEl0IDsgKytpdEZpbHRlciApCisJCQkJeworCQkJCQlpZiggbm90IHBhc3MoKCppdEZpbHRlciksIGFuRWxlbWVudCkgKQorCQkJCQl7CisJCQkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCX0KKworCQkJY2FzZSBBVk1fT1BDT0RFX09SOgorCQkJeworCQkJCUF2bUNvZGU6OmNvbnN0X2l0ZXJhdG9yIGl0RmlsdGVyID0gZmlsdGVyQ29kZS0+YmVnaW4oKTsKKwkJCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IGZpbHRlckNvZGUtPmVuZCgpOworCQkJCWZvciggOyBpdEZpbHRlciAhPSBlbmRJdCA7ICsraXRGaWx0ZXIgKQorCQkJCXsKKwkJCQkJaWYoIHBhc3MoKCppdEZpbHRlciksIGFuRWxlbWVudCkgKQorCQkJCQl7CisJCQkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKworCQkJY2FzZSBBVk1fT1BDT0RFX1hPUjoKKwkJCXsKKwkJCQlhdm1fc2l6ZV90IHBhc3NDb3VudCA9IDA7CisKKwkJCQlBdm1Db2RlOjpjb25zdF9pdGVyYXRvciBpdEZpbHRlciA9IGZpbHRlckNvZGUtPmJlZ2luKCk7CisJCQkJQXZtQ29kZTo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBmaWx0ZXJDb2RlLT5lbmQoKTsKKwkJCQlmb3IoIDsgaXRGaWx0ZXIgIT0gZW5kSXQgOyArK2l0RmlsdGVyICkKKwkJCQl7CisJCQkJCWlmKCBwYXNzKCgqaXRGaWx0ZXIpLCBhbkVsZW1lbnQpICkKKwkJCQkJeworCQkJCQkJaWYoICsrcGFzc0NvdW50ID4gMSApCisJCQkJCQl7CisJCQkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCisJCQkJcmV0dXJuKCBwYXNzQ291bnQgPT0gMSApOworCQkJfQorCisJCQljYXNlIEFWTV9PUENPREVfTk9UOgorCQkJeworCQkJCXJldHVybiggbm90IHBhc3MoZmlsdGVyQ29kZS0+Zmlyc3QoKSwgYW5FbGVtZW50KSApOworCQkJfQorCisJCQlkZWZhdWx0OgorCQkJeworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJfQorCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIEZJTFRFUklORyBBUEkgOiBjaGVjayBpZiBUUkFDRSBQT0lOVCBwYXNzCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJYm9vbCBwYXNzKFRyYWNlUG9pbnQgKiBmaWx0ZXJUUCwgVHJhY2VQb2ludCAqIGFUUCk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBGSUxURVJJTkcgQVBJIDogY2hlY2sgaWYgVkFSSUFCTEUgcGFzcworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWJvb2wgcGFzcyhjb25zdCBSdW50aW1lSUQgJiBhUklELCBJbnN0YW5jZU9mRGF0YSAqIGFWYXJpYWJsZSk7CisKKwlib29sIHBhc3MoVHJhY2VQb2ludCAqIGZpbHRlclRQLAorCQkJY29uc3QgUnVudGltZUlEICYgYVJJRCwgSW5zdGFuY2VPZkRhdGEgKiBhVmFyaWFibGUpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gRklMVEVSSU5HIEFQSSA6IGNoZWNrIGlmIEV4ZWN1dGlvbiBUcmFjZQorCS8vIGEuay5hLiBFeGVjdXRpb25Db25maWd1cmF0aW9uIHBhc3MKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlib29sIHBhc3MoVHJhY2VQb2ludCAqIGZpbHRlclRQLCBFeGVjdXRpb25Db25maWd1cmF0aW9uICogYW5FeGVjQ29uZlRQKTsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIEZJTFRFUklORyBBUEkgOiBjaGVjayBpZiBhIENvbXBpbGVkIEVsZW1lbnQgcGFzcworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWJvb2wgcGFzcyhUcmFjZVBvaW50ICogZmlsdGVyVFAsCisJCQljb25zdCBSdW50aW1lSUQgJiBhUklELCBCYXNlQ29tcGlsZWRGb3JtICogYW5FbGVtZW50KTsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIEZJTFRFUklORyBBUEkgOiBjaGVjayBpZiBhIFJ1bnRpbWUgTWFjaGluZSBJRCBwYXNzCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJYm9vbCBwYXNzKFRyYWNlUG9pbnQgKiBmaWx0ZXJUUCwgY29uc3QgUnVudGltZUlEICYgYVJJRCk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBGSUxURVJJTkcgQVBJIDogY2hlY2sgaWYgQVZNIENPREUgcGFzcworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWJvb2wgcGFzcyhUcmFjZVBvaW50ICogZmlsdGVyVFAsIEF2bUNvZGUgKiBhQ29kZVRQKTsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFNFUklBTElaQVRJT04gQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJdmlydHVhbCB2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworfTsKKworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworCisjZW5kaWYgLyogVFJBQ0VGSUxURVJfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90cmFjZS9UcmFjZVBvaW50LmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90cmFjZS9UcmFjZVBvaW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTYxOWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3RyYWNlL1RyYWNlUG9pbnQuY3BwCkBAIC0wLDAgKzEsMTg4MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuDQorICoNCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ3JlYXRlZCBvbjogMTEgZMOpYy4gMjAxMw0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyDQorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2luY2x1ZGUgIlRyYWNlUG9pbnQuaCINCisNCisjaW5jbHVkZSA8Zm1sL2NvbW1vbi9PYmplY3RFbGVtZW50Lmg+DQorI2luY2x1ZGUgPGZtbC9jb21tb24vU3BlY2lmaWVyRWxlbWVudC5oPg0KKw0KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9CdWlsdGluQXJyYXkuaD4NCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkNvbnN0cnVjdG9yLmg+DQorDQorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0Jhc2VJbnN0YW5jZUZvcm0uaD4NCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZUZvcm0uaD4NCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZVF1ZXJ5Lmg+DQorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVTeXN0ZW0uaD4NCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZkRhdGEuaD4NCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZk1hY2hpbmUuaD4NCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZlBvcnQuaD4NCisNCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uQ29uZmlndXJhdGlvbi5oPg0KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25Db250ZXh0Lmg+DQorDQorI2luY2x1ZGUgPGZtbC90eXBlL0Jhc2VUeXBlU3BlY2lmaWVyLmg+DQorI2luY2x1ZGUgPGZtbC90eXBlL1R5cGVNYW5hZ2VyLmg+DQorDQorI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9RdWVyeS5oPg0KKw0KKyNpbmNsdWRlIDxzZXcvQ29uZmlndXJhdGlvbi5oPg0KKw0KKyNpbmNsdWRlIDx1dGlsL2F2bV9zdHJpbmcuaD4NCisNCisNCituYW1lc3BhY2Ugc2VwDQorew0KKw0KKy8qKg0KKyAqIENPTlNUUlVDVE9SDQorICogRGVmYXVsdA0KKyAqLw0KK1RyYWNlUG9pbnQ6OlRyYWNlUG9pbnQoRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTkFUVVJFIGFOYXR1cmUsDQorCQlBVk1fT1BDT0RFIGFuT1AsIGNvbnN0IEJGICYgYVZhbHVlKQ0KKzogRWxlbWVudCggQ0xBU1NfS0lORF9UKCBUcmFjZVBvaW50ICkgKSwNCit0cGlkKCAwICksDQorDQorRUMoIEV4ZWN1dGlvbkNvbnRleHQ6Ol9OVUxMXyApLA0KK2NvbmZpZyggTlVMTCApLA0KKw0KK25hdHVyZSggYU5hdHVyZSApLA0KK29wKCBhbk9QICksDQorDQorUklEKCApLA0KKw0KK21hY2hpbmUoIE5VTEwgKSwNCisNCitvYmplY3QgKCBOVUxMICksDQorYW55X29iamVjdCggZmFsc2UgKSwNCisNCit2YWx1ZSggYVZhbHVlICkNCit7DQorCS8vISEgTk9USElORw0KK30NCisNCisNCitUcmFjZVBvaW50OjpUcmFjZVBvaW50KEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX05BVFVSRSBhTmF0dXJlLA0KKwkJQVZNX09QQ09ERSBhbk9QLCBJbnN0YW5jZU9mTWFjaGluZSAqIGFNYWNoaW5lLA0KKwkJT2JqZWN0RWxlbWVudCAqIGFuT2JqZWN0LCBjb25zdCBCRiAmIGFWYWx1ZSkNCis6IEVsZW1lbnQoIENMQVNTX0tJTkRfVCggVHJhY2VQb2ludCApICksDQordHBpZCggMCApLA0KKw0KK0VDKCBFeGVjdXRpb25Db250ZXh0OjpfTlVMTF8gKSwNCitjb25maWcoIE5VTEwgKSwNCisNCituYXR1cmUoIGFOYXR1cmUgKSwNCitvcCggYW5PUCApLA0KKw0KK1JJRCggKSwNCisNCittYWNoaW5lKCBhTWFjaGluZSApLA0KKw0KK29iamVjdCggYW5PYmplY3QgKSwNCithbnlfb2JqZWN0KCBmYWxzZSApLA0KKw0KK3ZhbHVlKCBhVmFsdWUgKQ0KK3sNCisJLy8hISBOT1RISU5HDQorfQ0KKw0KKw0KK1RyYWNlUG9pbnQ6OlRyYWNlUG9pbnQoRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTkFUVVJFIGFOYXR1cmUsDQorCQlBVk1fT1BDT0RFIGFuT1AsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsDQorCQlPYmplY3RFbGVtZW50ICogYW5PYmplY3QsIGNvbnN0IEJGICYgYVZhbHVlKQ0KKzogRWxlbWVudCggQ0xBU1NfS0lORF9UKCBUcmFjZVBvaW50ICkgKSwNCit0cGlkKCAwICksDQorDQorRUMoIEV4ZWN1dGlvbkNvbnRleHQ6Ol9OVUxMXyApLA0KK2NvbmZpZyggTlVMTCApLA0KKw0KK25hdHVyZSggYU5hdHVyZSApLA0KK29wKCBhbk9QICksDQorDQorUklEKCBhUklEICksDQorDQorbWFjaGluZSggYVJJRC5nZXRJbnN0YW5jZSgpICksDQorDQorb2JqZWN0KCBhbk9iamVjdCApLA0KK2FueV9vYmplY3QoIGZhbHNlICksDQorDQordmFsdWUoIGFWYWx1ZSApDQorew0KKwkvLyEhIE5PVEhJTkcNCit9DQorDQorDQorLyoqDQorICogQ09OU1RSVUNUT1INCisgKiBmb3IgTWV0YSBwb2ludA0KKyAqIFRSQUNFX0NPTU1FTlRfTkFUVVJFDQorICogVFJBQ0VfU0VQQVJBVE9SX05BVFVSRQ0KKyAqIFRSQUNFX05FV0xJTkVfTkFUVVJFDQorICogVFJBQ0VfU1RFUF9OQVRVUkUNCisgKi8NCitUcmFjZVBvaW50OjpUcmFjZVBvaW50KEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX05BVFVSRSBhTmF0dXJlLA0KKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBzdHJTZXBhcmF0b3IpDQorOiBFbGVtZW50KCBDTEFTU19LSU5EX1QoIFRyYWNlUG9pbnQgKSApLA0KK3RwaWQoIDAgKSwNCisNCitFQyggRXhlY3V0aW9uQ29udGV4dDo6X05VTExfICksDQorY29uZmlnKCBOVUxMICksDQorbmF0dXJlKCBhTmF0dXJlICksDQorb3AoIEFWTV9PUENPREVfTlVMTCApLA0KKw0KK21hY2hpbmUoIE5VTEwgKSwNCisNCitvYmplY3QgKCBOVUxMICksDQorYW55X29iamVjdCggZmFsc2UgKSwNCisNCit2YWx1ZSggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdTdHJpbmcoc3RyU2VwYXJhdG9yKSApDQorew0KKwkvLyEhIE5PVEhJTkcNCit9DQorDQorVHJhY2VQb2ludDo6VHJhY2VQb2ludChjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQywNCisJCUVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX05BVFVSRSBhTmF0dXJlLA0KKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBzdHJTZXBhcmF0b3IpDQorOiBFbGVtZW50KCBDTEFTU19LSU5EX1QoIFRyYWNlUG9pbnQgKSApLA0KK3RwaWQoIDAgKSwNCisNCitFQyggYW5FQyApLA0KK2NvbmZpZyggTlVMTCApLA0KK25hdHVyZSggYU5hdHVyZSApLA0KK29wKCBBVk1fT1BDT0RFX05VTEwgKSwNCisNCittYWNoaW5lKCBOVUxMICksDQorDQorb2JqZWN0ICggTlVMTCApLA0KK2FueV9vYmplY3QoIGZhbHNlICksDQorDQordmFsdWUoIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3U3RyaW5nKHN0clNlcGFyYXRvcikgKQ0KK3sNCisJLy8hISBOT1RISU5HDQorfQ0KKw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gQ09ORklHVVJFIEFQSQ0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQordm9pZCBUcmFjZVBvaW50Ojp1cGRhdGVSSUQoY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQpDQorew0KKwlpZiggUklELnZhbGlkKCkgfHwgKChvYmplY3QgPT0gTlVMTCkgJiYgKG1hY2hpbmUgPT0gTlVMTCkpKQ0KKwl7DQorCQlyZXR1cm47DQorCX0NCisNCisJZWxzZSBpZiggb2JqZWN0ICE9IE5VTEwgKQ0KKwl7DQorCQlpZiggb2JqZWN0LT5pczwgSW5zdGFuY2VPZk1hY2hpbmUgPigpICkNCisJCXsNCisJCQlpZiggb2JqZWN0LT50bzwgSW5zdGFuY2VPZk1hY2hpbmUgPigpLT4NCisJCQkJCWdldEV4ZWN1dGFibGUoKS0+aGFzU2luZ2xlUnVudGltZUluc3RhbmNlKCkgKQ0KKwkJCXsNCisJCQkJUklEID0gYW5FRC5nZXRSdW50aW1lSUQoIG9iamVjdC0+dG88IEluc3RhbmNlT2ZNYWNoaW5lID4oKSApOw0KKwkJCX0NCisJCX0NCisNCisJCWVsc2UgaWYoIG9iamVjdC0+aXM8IEJhc2VBdm1Qcm9ncmFtID4oKSApDQorCQl7DQorCQkJaWYoIG9iamVjdC0+dG88IEJhc2VBdm1Qcm9ncmFtID4oKS0+DQorCQkJCQlnZXRFeGVjdXRhYmxlKCktPmhhc1NpbmdsZVJ1bnRpbWVJbnN0YW5jZSgpICkNCisJCQl7DQorCQkJCVJJRCA9IGFuRUQuZ2V0UnVudGltZUlEKA0KKwkJCQkJCW9iamVjdC0+dG88IEJhc2VBdm1Qcm9ncmFtID4oKS0+Z2V0RXhlY3V0YWJsZSgpICk7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJZWxzZSBpZiggbWFjaGluZSAhPSBOVUxMICkNCisJCXsNCisJCQlpZiggbWFjaGluZS0+Z2V0RXhlY3V0YWJsZSgpLT5oYXNTaW5nbGVSdW50aW1lSW5zdGFuY2UoKSApDQorCQkJew0KKwkJCQlSSUQgPSBhbkVELmdldFJ1bnRpbWVJRCggbWFjaGluZSApOw0KKwkJCX0NCisJCX0NCisNCisJCWVsc2UgaWYoIG9iamVjdC0+aXM8IEJhc2VJbnN0YW5jZUZvcm0gPigpICYmDQorCQkJCW9iamVjdC0+dG88IEJhc2VJbnN0YW5jZUZvcm0gPigpLT5oYXNSdW50aW1lQ29udGFpbmVyUklEKCkgKQ0KKwkJew0KKwkJCVJJRCA9IG9iamVjdC0+dG88IEJhc2VJbnN0YW5jZUZvcm0gPigpLT5nZXRSdW50aW1lQ29udGFpbmVyUklEKCk7DQorCQl9DQorCX0NCisNCisJZWxzZSBpZiggbWFjaGluZSAhPSBOVUxMICkNCisJew0KKwkJaWYoIG1hY2hpbmUtPmdldEV4ZWN1dGFibGUoKS0+aGFzU2luZ2xlUnVudGltZUluc3RhbmNlKCkgKQ0KKwkJew0KKwkJCVJJRCA9IGFuRUQuZ2V0UnVudGltZUlEKCBtYWNoaW5lICk7DQorCQl9DQorCX0NCisNCisJZWxzZQ0KKwl7DQorCQlFeGVjdXRhYmxlRm9ybSAqIGFuRXhlY3V0YWJsZSA9IGdldEV4ZWN1dGFibGUoKTsNCisNCisJCWlmKCAoYW5FeGVjdXRhYmxlICE9IE5VTEwpICYmIGFuRXhlY3V0YWJsZS0+aGFzU2luZ2xlUnVudGltZUluc3RhbmNlKCkgKQ0KKwkJew0KKwkJCVJJRCA9IGFuRUQuZ2V0UnVudGltZUlEKCBhbkV4ZWN1dGFibGUgKTsNCisNCisJCQlpZiggUklELnZhbGlkKCkgKQ0KKwkJCXsNCisJCQkJbWFjaGluZSA9IFJJRC5nZXRJbnN0YW5jZSgpOw0KKwkJCX0NCisJCX0NCisJfQ0KK30NCisNCisNCit2b2lkIFRyYWNlUG9pbnQ6OnVwZGF0ZU1hY2hpbmUoDQorCQljb25zdCBDb25maWd1cmF0aW9uICYgYUNvbmZpZ3VyYXRpb24sDQorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpDQorew0KKwlFeGVjdXRhYmxlUXVlcnkgWFF1ZXJ5KCBhQ29uZmlndXJhdGlvbiApOw0KKw0KKwlpZiggYVF1YWxpZmllZE5hbWVJRC5maW5kKCcuJykgPT0gc3RkOjpzdHJpbmc6Om5wb3MgKQ0KKwl7DQorCQltYWNoaW5lID0gWFF1ZXJ5LmdldE1hY2hpbmVCeU5hbWVJRCgNCisJCQkJU3BlY2lmaWVyOjpERVNJR05fSU5TVEFOQ0VfS0lORCwgYVF1YWxpZmllZE5hbWVJRCkucmF3TWFjaGluZSgpOw0KKwkJaWYoIG1hY2hpbmUgPT0gTlVMTCApDQorCQl7DQorCQkJbWFjaGluZSA9IFhRdWVyeS5nZXRNYWNoaW5lQnlOYW1lSUQoDQorCQkJCVNwZWNpZmllcjo6REVTSUdOX01PREVMX0tJTkQsIGFRdWFsaWZpZWROYW1lSUQpLnJhd01hY2hpbmUoKTsNCisJCX0NCisJfQ0KKwllbHNlDQorCXsNCisJCW1hY2hpbmUgPSBYUXVlcnkuZ2V0TWFjaGluZUJ5UXVhbGlmaWVkTmFtZUlEKA0KKwkJCQlTcGVjaWZpZXI6OkRFU0lHTl9JTlNUQU5DRV9LSU5ELCBhUXVhbGlmaWVkTmFtZUlEKS5yYXdNYWNoaW5lKCk7DQorCQlpZiggbWFjaGluZSA9PSBOVUxMICkNCisJCXsNCisJCQltYWNoaW5lID0gWFF1ZXJ5LmdldE1hY2hpbmVCeVF1YWxpZmllZE5hbWVJRCgNCisJCQkJU3BlY2lmaWVyOjpERVNJR05fTU9ERUxfS0lORCwgYVF1YWxpZmllZE5hbWVJRCkucmF3TWFjaGluZSgpOw0KKwkJfQ0KKwl9DQorfQ0KKw0KKw0KK2Jvb2wgVHJhY2VQb2ludDo6Y29uZmlndXJlUG9ydCgNCisJCWNvbnN0IENvbmZpZ3VyYXRpb24gJiBhQ29uZmlndXJhdGlvbiwNCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCwNCisJCUxpc3RPZlRyYWNlUG9pbnQgJiBvdGhlclRyYWNlUG9pbnQpDQorew0KKwkvLyBFTlZJUk9OTUVOVCBDT01NVU5JQ0FUSU9OIFBST1RPQ09MDQorCWlmKCBhUXVhbGlmaWVkTmFtZUlEID09ICJlbnYiICkNCisJew0KKwkJc3dpdGNoKCBvcCApDQorCQl7DQorCQkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUOg0KKwkJCWNhc2UgQVZNX09QQ09ERV9JTlBVVF9FTlY6DQorCQkJew0KKwkJCQlvcCA9IEFWTV9PUENPREVfSU5QVVRfRU5WOw0KKwkJCQlicmVhazsNCisJCQl9DQorDQorCQkJY2FzZSBBVk1fT1BDT0RFX09VVFBVVDoNCisJCQljYXNlIEFWTV9PUENPREVfT1VUUFVUX0VOVjoNCisJCQl7DQorCQkJCW9wID0gQVZNX09QQ09ERV9PVVRQVVRfRU5WOw0KKwkJCQlicmVhazsNCisJCQl9DQorDQorCQkJY2FzZSBBVk1fT1BDT0RFX05VTEw6DQorCQkJZGVmYXVsdDoNCisJCQl7DQorCQkJCW9wID0gQVZNX09QQ09ERV9JTlBVVF9FTlY7DQorDQorCQkJCVRyYWNlUG9pbnQgKiBuZXdUcmFjZVBvaW50ID0gbmV3IFRyYWNlUG9pbnQoIHRoaXMgKTsNCisJCQkJbmV3VHJhY2VQb2ludC0+b3AgPSBBVk1fT1BDT0RFX09VVFBVVF9FTlY7DQorDQorCQkJCW90aGVyVHJhY2VQb2ludC5hcHBlbmQoIG5ld1RyYWNlUG9pbnQgKTsNCisNCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJcmV0dXJuKCB0cnVlICk7DQorCX0NCisJZWxzZSBpZiggUkVHRVhfTUFUQ0goYVF1YWxpZmllZE5hbWVJRCwgQ09OU19XSUQyKCJpbnB1dCIsICJlbnYiKSkgKQ0KKwl7DQorCQlvcCA9IEFWTV9PUENPREVfSU5QVVRfRU5WOw0KKw0KKwkJcmV0dXJuKCB0cnVlICk7DQorCX0NCisJZWxzZSBpZiggUkVHRVhfTUFUQ0goYVF1YWxpZmllZE5hbWVJRCwgQ09OU19XSUQyKCJvdXRwdXQiLCAiZW52IikpICkNCisJew0KKwkJb3AgPSBBVk1fT1BDT0RFX09VVFBVVF9FTlY7DQorDQorCQlyZXR1cm4oIHRydWUgKTsNCisJfQ0KKw0KKwkvLyBSRU5ERVotVk9VUyBDT01NVU5JQ0FUSU9OIFBST1RPQ09MDQorCWlmKCBhUXVhbGlmaWVkTmFtZUlEID09ICJyZHYiICkNCisJew0KKwkJc3dpdGNoKCBvcCApDQorCQl7DQorCQkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUOg0KKwkJCWNhc2UgQVZNX09QQ09ERV9JTlBVVF9SRFY6DQorCQkJew0KKwkJCQlvcCA9IEFWTV9PUENPREVfSU5QVVRfUkRWOw0KKwkJCQlicmVhazsNCisJCQl9DQorDQorCQkJY2FzZSBBVk1fT1BDT0RFX09VVFBVVDoNCisJCQljYXNlIEFWTV9PUENPREVfT1VUUFVUX1JEVjoNCisJCQl7DQorCQkJCW9wID0gQVZNX09QQ09ERV9PVVRQVVRfUkRWOw0KKwkJCQlicmVhazsNCisJCQl9DQorDQorCQkJY2FzZSBBVk1fT1BDT0RFX05VTEw6DQorCQkJZGVmYXVsdDoNCisJCQl7DQorCQkJCW9wID0gQVZNX09QQ09ERV9JTlBVVF9SRFY7DQorDQorCQkJCVRyYWNlUG9pbnQgKiBuZXdUcmFjZVBvaW50ID0gbmV3IFRyYWNlUG9pbnQoIHRoaXMgKTsNCisJCQkJbmV3VHJhY2VQb2ludC0+b3AgPSBBVk1fT1BDT0RFX09VVFBVVF9SRFY7DQorDQorCQkJCW90aGVyVHJhY2VQb2ludC5hcHBlbmQoIG5ld1RyYWNlUG9pbnQgKTsNCisNCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJcmV0dXJuKCB0cnVlICk7DQorCX0NCisJZWxzZSBpZiggUkVHRVhfTUFUQ0goYVF1YWxpZmllZE5hbWVJRCwgQ09OU19XSUQyKCJpbnB1dCIsICJyZHYiKSkgKQ0KKwl7DQorCQlvcCA9IEFWTV9PUENPREVfSU5QVVRfUkRWOw0KKw0KKwkJcmV0dXJuKCB0cnVlICk7DQorCX0NCisJZWxzZSBpZiggUkVHRVhfTUFUQ0goYVF1YWxpZmllZE5hbWVJRCwgQ09OU19XSUQyKCJvdXRwdXQiLCAicmR2IikpICkNCisJew0KKwkJb3AgPSBBVk1fT1BDT0RFX09VVFBVVF9SRFY7DQorDQorCQlyZXR1cm4oIHRydWUgKTsNCisJfQ0KKw0KKwllbHNlIGlmKCBSRUdFWF9NQVRDSChhUXVhbGlmaWVkTmFtZUlELCBDT05TX1dJRDIoIihpbm91dHxjb20pIiwgImVudiIpKSApDQorCXsNCisJCW9wID0gQVZNX09QQ09ERV9JTlBVVF9FTlY7DQorDQorCQlUcmFjZVBvaW50ICogbmV3VHJhY2VQb2ludCA9IG5ldyBUcmFjZVBvaW50KCB0aGlzICk7DQorCQluZXdUcmFjZVBvaW50LT5vcCA9IEFWTV9PUENPREVfT1VUUFVUX0VOVjsNCisNCisJCW90aGVyVHJhY2VQb2ludC5hcHBlbmQoIG5ld1RyYWNlUG9pbnQgKTsNCisNCisJCXJldHVybiggdHJ1ZSApOw0KKwl9DQorDQorCWVsc2UgaWYoIFJFR0VYX01BVENIKGFRdWFsaWZpZWROYW1lSUQsIENPTlNfV0lEMigiKGlub3V0fGNvbSkiLCAicmR2IikpICkNCisJew0KKwkJb3AgPSBBVk1fT1BDT0RFX0lOUFVUX1JEVjsNCisNCisJCVRyYWNlUG9pbnQgKiBuZXdUcmFjZVBvaW50ID0gbmV3IFRyYWNlUG9pbnQoIHRoaXMgKTsNCisJCW5ld1RyYWNlUG9pbnQtPm9wID0gQVZNX09QQ09ERV9PVVRQVVRfUkRWOw0KKw0KKwkJb3RoZXJUcmFjZVBvaW50LmFwcGVuZCggbmV3VHJhY2VQb2ludCApOw0KKw0KKwkJcmV0dXJuKCB0cnVlICk7DQorCX0NCisNCisJZWxzZSBpZiggYVF1YWxpZmllZE5hbWVJRCA9PSAiWypdIiApDQorCXsNCisJCWFueV9vYmplY3QgPSB0cnVlOw0KKw0KKwkJcmV0dXJuKCB0cnVlICk7DQorCX0NCisNCisJRXhlY3V0YWJsZVF1ZXJ5IFhRdWVyeSggYUNvbmZpZ3VyYXRpb24gKTsNCisNCisJTGlzdE9mU3ltYm9sIGxpc3RvZlBvcnQ7DQorDQorCXN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgcG9zID0gYVF1YWxpZmllZE5hbWVJRC5maW5kKCItPiIpOw0KKw0KKwlpZiggcG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zICkNCisJew0KKwkJc3RkOjpzdHJpbmcgbWlkID0gYVF1YWxpZmllZE5hbWVJRC5zdWJzdHIoMCwgcG9zKTsNCisJCXN0ZDo6c3RyaW5nIG9iaiA9IGFRdWFsaWZpZWROYW1lSUQuc3Vic3RyKHBvcyArIDIpOw0KKw0KKwkJdXBkYXRlTWFjaGluZShhQ29uZmlndXJhdGlvbiwgbWlkKTsNCisNCisJCWlmKCBvYmogPT0gIlsqXSIgKQ0KKwkJew0KKwkJCWFueV9vYmplY3QgPSB0cnVlOw0KKw0KKwkJCXJldHVybiggdHJ1ZSApOw0KKwkJfQ0KKw0KKwkJaWYoIG1hY2hpbmUgIT0gTlVMTCApDQorCQl7DQorCQkJRXhlY3V0YWJsZUZvcm0gKiBjb250YWluZXJFeGVjdXRhYmxlID0gbWFjaGluZS0+Z2V0RXhlY3V0YWJsZSgpOw0KKw0KKwkJCXdoaWxlKCBjb250YWluZXJFeGVjdXRhYmxlICE9IE5VTEwgKQ0KKwkJCXsNCisJCQkJb2JqZWN0ID0gY29udGFpbmVyRXhlY3V0YWJsZS0+Z2V0UG9ydCgpLmdldEJ5TmFtZUlEKG9iaikucmF3UG9ydCgpOw0KKw0KKwkJCQlpZiggb2JqZWN0ID09IE5VTEwgKQ0KKwkJCQl7DQorCQkJCQljb250YWluZXJFeGVjdXRhYmxlID0NCisJCQkJCQkJY29udGFpbmVyRXhlY3V0YWJsZS0+Z2V0RXhlY3V0YWJsZUNvbnRhaW5lcigpOw0KKwkJCQl9DQorCQkJCWVsc2UNCisJCQkJew0KKwkJCQkJYnJlYWs7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQllbHNlDQorCQl7DQorCQkJc3dpdGNoKCBvcCApDQorCQkJew0KKwkJCQljYXNlIEFWTV9PUENPREVfSU5QVVQ6DQorCQkJCWNhc2UgQVZNX09QQ09ERV9JTlBVVF9FTlY6DQorCQkJCWNhc2UgQVZNX09QQ09ERV9JTlBVVF9SRFY6DQorCQkJCXsNCisJCQkJCWlmKCBYUXVlcnkuZ2V0UG9ydEJ5TmFtZUlEKG9iaiwgbGlzdG9mUG9ydCwNCisJCQkJCQkJTW9kaWZpZXI6OkRJUkVDVElPTl9JTlBVVF9LSU5ELCBmYWxzZSkgKQ0KKwkJCQkJew0KKwkJCQkJCW9iamVjdCA9IE5VTEw7DQorDQorCQkJCQkJTGlzdE9mU3ltYm9sOjppdGVyYXRvciBpdFBvcnQgPSBsaXN0b2ZQb3J0LmJlZ2luKCk7DQorCQkJCQkJTGlzdE9mU3ltYm9sOjppdGVyYXRvciBlbmRQb3J0ID0gbGlzdG9mUG9ydC5lbmQoKTsNCisJCQkJCQlmb3IoIDsgaXRQb3J0ICE9IGVuZFBvcnQgOyArK2l0UG9ydCApDQorCQkJCQkJew0KKwkJCQkJCQlpZiggKCppdFBvcnQpLmdldE1vZGlmaWVyKCkuaXNEaXJlY3Rpb25JbnB1dCgpICkNCisJCQkJCQkJew0KKwkJCQkJCQkJb2JqZWN0ID0gKCppdFBvcnQpLnJhd1BvcnQoKTsNCisJCQkJCQkJCWJyZWFrOw0KKwkJCQkJCQl9DQorCQkJCQkJCWVsc2UgaWYoIChvYmplY3QgPT0gTlVMTCkNCisJCQkJCQkJCSYmICgqaXRQb3J0KS5nZXRNb2RpZmllcigpLmlzRGlyZWN0aW9uSW5vdXQoKSApDQorCQkJCQkJCXsNCisJCQkJCQkJCW9iamVjdCA9ICgqaXRQb3J0KS5yYXdQb3J0KCk7DQorCQkJCQkJCX0NCisJCQkJCQl9DQorCQkJCQl9DQorDQorCQkJCQlicmVhazsNCisJCQkJfQ0KKw0KKwkJCQljYXNlIEFWTV9PUENPREVfT1VUUFVUOg0KKwkJCQljYXNlIEFWTV9PUENPREVfT1VUUFVUX0VOVjoNCisJCQkJY2FzZSBBVk1fT1BDT0RFX09VVFBVVF9SRFY6DQorCQkJCXsNCisJCQkJCWlmKCBYUXVlcnkuZ2V0UG9ydEJ5TmFtZUlEKG9iaiwgbGlzdG9mUG9ydCwNCisJCQkJCQkJTW9kaWZpZXI6OkRJUkVDVElPTl9PVVRQVVRfS0lORCwgZmFsc2UpICkNCisJCQkJCXsNCisJCQkJCQlvYmplY3QgPSBOVUxMOw0KKw0KKwkJCQkJCUxpc3RPZlN5bWJvbDo6aXRlcmF0b3IgaXRQb3J0ID0gbGlzdG9mUG9ydC5iZWdpbigpOw0KKwkJCQkJCUxpc3RPZlN5bWJvbDo6aXRlcmF0b3IgZW5kUG9ydCA9IGxpc3RvZlBvcnQuZW5kKCk7DQorCQkJCQkJZm9yKCA7IGl0UG9ydCAhPSBlbmRQb3J0IDsgKytpdFBvcnQgKQ0KKwkJCQkJCXsNCisJCQkJCQkJaWYoICgqaXRQb3J0KS5nZXRNb2RpZmllcigpLmlzRGlyZWN0aW9uT3V0cHV0KCkgKQ0KKwkJCQkJCQl7DQorCQkJCQkJCQlvYmplY3QgPSAoKml0UG9ydCkucmF3UG9ydCgpOw0KKwkJCQkJCQkJYnJlYWs7DQorCQkJCQkJCX0NCisJCQkJCQkJZWxzZSBpZiggKG9iamVjdCA9PSBOVUxMKQ0KKwkJCQkJCQkJJiYgKCppdFBvcnQpLmdldE1vZGlmaWVyKCkuaXNEaXJlY3Rpb25Jbm91dCgpICkNCisJCQkJCQkJew0KKwkJCQkJCQkJb2JqZWN0ID0gKCppdFBvcnQpLnJhd1BvcnQoKTsNCisJCQkJCQkJfQ0KKwkJCQkJCX0NCisJCQkJCX0NCisNCisJCQkJCWJyZWFrOw0KKwkJCQl9DQorDQorCQkJCWRlZmF1bHQ6DQorCQkJCXsNCisJCQkJCVhRdWVyeS5nZXRQb3J0QnlOYW1lSUQob2JqLCBsaXN0b2ZQb3J0KTsNCisNCisJCQkJCWNvbmZpZ3VyZVBvcnQob3AsIGxpc3RvZlBvcnQsIG90aGVyVHJhY2VQb2ludCk7DQorDQorCQkJCQlicmVhazsNCisJCQkJfQ0KKwkJCX0NCisNCisJCX0NCisJfQ0KKw0KKwllbHNlIGlmKCBhUXVhbGlmaWVkTmFtZUlELmZpbmQoJy4nKSA9PSBzdGQ6OnN0cmluZzo6bnBvcyApDQorCXsNCisJCXN3aXRjaCggb3AgKQ0KKwkJew0KKwkJCWNhc2UgQVZNX09QQ09ERV9JTlBVVDoNCisJCQljYXNlIEFWTV9PUENPREVfSU5QVVRfRU5WOg0KKwkJCWNhc2UgQVZNX09QQ09ERV9JTlBVVF9SRFY6DQorCQkJew0KKwkJCQlpZiggWFF1ZXJ5LmdldFBvcnRCeVF1YWxpZmllZE5hbWVJRChhUXVhbGlmaWVkTmFtZUlELA0KKwkJCQkJCWxpc3RvZlBvcnQsIE1vZGlmaWVyOjpESVJFQ1RJT05fSU5QVVRfS0lORCwgZmFsc2UpICkNCisJCQkJew0KKwkJCQkJb2JqZWN0ID0gTlVMTDsNCisNCisJCQkJCUxpc3RPZlN5bWJvbDo6aXRlcmF0b3IgaXRQb3J0ID0gbGlzdG9mUG9ydC5iZWdpbigpOw0KKwkJCQkJTGlzdE9mU3ltYm9sOjppdGVyYXRvciBlbmRQb3J0ID0gbGlzdG9mUG9ydC5lbmQoKTsNCisJCQkJCWZvciggOyBpdFBvcnQgIT0gZW5kUG9ydCA7ICsraXRQb3J0ICkNCisJCQkJCXsNCisJCQkJCQlpZiggKCppdFBvcnQpLmdldE1vZGlmaWVyKCkuaXNEaXJlY3Rpb25JbnB1dCgpICkNCisJCQkJCQl7DQorCQkJCQkJCW9iamVjdCA9ICgqaXRQb3J0KS5yYXdQb3J0KCk7DQorCQkJCQkJCWJyZWFrOw0KKwkJCQkJCX0NCisJCQkJCQllbHNlIGlmKCAob2JqZWN0ID09IE5VTEwpDQorCQkJCQkJCSYmICgqaXRQb3J0KS5nZXRNb2RpZmllcigpLmlzRGlyZWN0aW9uSW5vdXQoKSApDQorCQkJCQkJew0KKwkJCQkJCQlvYmplY3QgPSAoKml0UG9ydCkucmF3UG9ydCgpOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKw0KKwkJCQlicmVhazsNCisJCQl9DQorDQorCQkJY2FzZSBBVk1fT1BDT0RFX09VVFBVVDoNCisJCQljYXNlIEFWTV9PUENPREVfT1VUUFVUX0VOVjoNCisJCQljYXNlIEFWTV9PUENPREVfT1VUUFVUX1JEVjoNCisJCQl7DQorCQkJCWlmKCBYUXVlcnkuZ2V0UG9ydEJ5UXVhbGlmaWVkTmFtZUlEKGFRdWFsaWZpZWROYW1lSUQsDQorCQkJCQkJbGlzdG9mUG9ydCwgTW9kaWZpZXI6OkRJUkVDVElPTl9PVVRQVVRfS0lORCwgZmFsc2UpICkNCisJCQkJew0KKwkJCQkJb2JqZWN0ID0gTlVMTDsNCisNCisJCQkJCUxpc3RPZlN5bWJvbDo6aXRlcmF0b3IgaXRQb3J0ID0gbGlzdG9mUG9ydC5iZWdpbigpOw0KKwkJCQkJTGlzdE9mU3ltYm9sOjppdGVyYXRvciBlbmRQb3J0ID0gbGlzdG9mUG9ydC5lbmQoKTsNCisJCQkJCWZvciggOyBpdFBvcnQgIT0gZW5kUG9ydCA7ICsraXRQb3J0ICkNCisJCQkJCXsNCisJCQkJCQlpZiggKCppdFBvcnQpLmdldE1vZGlmaWVyKCkuaXNEaXJlY3Rpb25PdXRwdXQoKSApDQorCQkJCQkJew0KKwkJCQkJCQlvYmplY3QgPSAoKml0UG9ydCkucmF3UG9ydCgpOw0KKwkJCQkJCQlicmVhazsNCisJCQkJCQl9DQorCQkJCQkJZWxzZSBpZiggKG9iamVjdCA9PSBOVUxMKQ0KKwkJCQkJCQkmJiAoKml0UG9ydCkuZ2V0TW9kaWZpZXIoKS5pc0RpcmVjdGlvbklub3V0KCkgKQ0KKwkJCQkJCXsNCisJCQkJCQkJb2JqZWN0ID0gKCppdFBvcnQpLnJhd1BvcnQoKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJYnJlYWs7DQorCQkJfQ0KKw0KKwkJCWRlZmF1bHQ6DQorCQkJew0KKwkJCQlYUXVlcnkuZ2V0UG9ydEJ5UXVhbGlmaWVkTmFtZUlEKGFRdWFsaWZpZWROYW1lSUQsIGxpc3RvZlBvcnQpOw0KKw0KKwkJCQljb25maWd1cmVQb3J0KG9wLCBsaXN0b2ZQb3J0LCBvdGhlclRyYWNlUG9pbnQpOw0KKw0KKwkJCQlicmVhazsNCisJCQl9DQorCQl9DQorCX0NCisNCisJZWxzZQ0KKwl7DQorCQlzd2l0Y2goIG9wICkNCisJCXsNCisJCQljYXNlIEFWTV9PUENPREVfSU5QVVQ6DQorCQkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUX0VOVjoNCisJCQljYXNlIEFWTV9PUENPREVfSU5QVVRfUkRWOg0KKwkJCXsNCisJCQkJaWYoIFhRdWVyeS5nZXRQb3J0QnlOYW1lSUQoYVF1YWxpZmllZE5hbWVJRCwNCisJCQkJCQlsaXN0b2ZQb3J0LE1vZGlmaWVyOjpESVJFQ1RJT05fSU5QVVRfS0lORCwgZmFsc2UpICkNCisJCQkJew0KKwkJCQkJb2JqZWN0ID0gTlVMTDsNCisNCisJCQkJCUxpc3RPZlN5bWJvbDo6aXRlcmF0b3IgaXRQb3J0ID0gbGlzdG9mUG9ydC5iZWdpbigpOw0KKwkJCQkJTGlzdE9mU3ltYm9sOjppdGVyYXRvciBlbmRQb3J0ID0gbGlzdG9mUG9ydC5lbmQoKTsNCisJCQkJCWZvciggOyBpdFBvcnQgIT0gZW5kUG9ydCA7ICsraXRQb3J0ICkNCisJCQkJCXsNCisJCQkJCQlpZiggKCppdFBvcnQpLmdldE1vZGlmaWVyKCkuaXNEaXJlY3Rpb25JbnB1dCgpICkNCisJCQkJCQl7DQorCQkJCQkJCW9iamVjdCA9ICgqaXRQb3J0KS5yYXdQb3J0KCk7DQorCQkJCQkJCWJyZWFrOw0KKwkJCQkJCX0NCisJCQkJCQllbHNlIGlmKCAob2JqZWN0ID09IE5VTEwpDQorCQkJCQkJCQkmJiAoKml0UG9ydCkuZ2V0TW9kaWZpZXIoKS5pc0RpcmVjdGlvbklub3V0KCkgKQ0KKwkJCQkJCXsNCisJCQkJCQkJb2JqZWN0ID0gKCppdFBvcnQpLnJhd1BvcnQoKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJYnJlYWs7DQorCQkJfQ0KKw0KKwkJCWNhc2UgQVZNX09QQ09ERV9PVVRQVVQ6DQorCQkJY2FzZSBBVk1fT1BDT0RFX09VVFBVVF9FTlY6DQorCQkJY2FzZSBBVk1fT1BDT0RFX09VVFBVVF9SRFY6DQorCQkJew0KKwkJCQlpZiggWFF1ZXJ5LmdldFBvcnRCeU5hbWVJRCgNCisJCQkJCQlhUXVhbGlmaWVkTmFtZUlELCBsaXN0b2ZQb3J0LA0KKwkJCQkJCU1vZGlmaWVyOjpESVJFQ1RJT05fT1VUUFVUX0tJTkQsIGZhbHNlKSApDQorCQkJCXsNCisJCQkJCW9iamVjdCA9IE5VTEw7DQorDQorCQkJCQlMaXN0T2ZTeW1ib2w6Oml0ZXJhdG9yIGl0UG9ydCA9IGxpc3RvZlBvcnQuYmVnaW4oKTsNCisJCQkJCUxpc3RPZlN5bWJvbDo6aXRlcmF0b3IgZW5kUG9ydCA9IGxpc3RvZlBvcnQuZW5kKCk7DQorCQkJCQlmb3IoIDsgaXRQb3J0ICE9IGVuZFBvcnQgOyArK2l0UG9ydCApDQorCQkJCQl7DQorCQkJCQkJaWYoICgqaXRQb3J0KS5nZXRNb2RpZmllcigpLmlzRGlyZWN0aW9uT3V0cHV0KCkgKQ0KKwkJCQkJCXsNCisJCQkJCQkJb2JqZWN0ID0gKCppdFBvcnQpLnJhd1BvcnQoKTsNCisJCQkJCQkJYnJlYWs7DQorCQkJCQkJfQ0KKwkJCQkJCWVsc2UgaWYoIChvYmplY3QgPT0gTlVMTCkNCisJCQkJCQkJJiYgKCppdFBvcnQpLmdldE1vZGlmaWVyKCkuaXNEaXJlY3Rpb25Jbm91dCgpICkNCisJCQkJCQl7DQorCQkJCQkJCW9iamVjdCA9ICgqaXRQb3J0KS5yYXdQb3J0KCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCWJyZWFrOw0KKwkJCX0NCisNCisJCQlkZWZhdWx0Og0KKwkJCXsNCisJCQkJWFF1ZXJ5LmdldFBvcnRCeU5hbWVJRChhUXVhbGlmaWVkTmFtZUlELCBsaXN0b2ZQb3J0KTsNCisNCisJCQkJY29uZmlndXJlUG9ydChvcCwgbGlzdG9mUG9ydCwgb3RoZXJUcmFjZVBvaW50KTsNCisNCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCXJldHVybiggb2JqZWN0ICE9IE5VTEwgKTsNCit9DQorDQordm9pZCBUcmFjZVBvaW50Ojpjb25maWd1cmVQb3J0KEFWTV9PUENPREUgb3BDb20sDQorCQlMaXN0T2ZTeW1ib2wgJiBsaXN0b2ZQb3J0LCBMaXN0T2ZUcmFjZVBvaW50ICYgb3RoZXJUcmFjZVBvaW50KQ0KK3sNCisJaWYoIGxpc3RvZlBvcnQubm9uZW1wdHkoKSApDQorCXsNCisJCW9wID0gb3BDb207DQorCQlvYmplY3QgPSBsaXN0b2ZQb3J0LmZyb250KCkucmF3UG9ydCgpOw0KKwkJbGlzdG9mUG9ydC5wb3BfZnJvbnQoKTsNCisJfQ0KKw0KKwl3aGlsZSggbGlzdG9mUG9ydC5ub25lbXB0eSgpICkNCisJew0KKwkJVHJhY2VQb2ludCAqIG5ld1RyYWNlUG9pbnQgPSBuZXcgVHJhY2VQb2ludCggdGhpcyApOw0KKwkJbmV3VHJhY2VQb2ludC0+b2JqZWN0ID0gbGlzdG9mUG9ydC5mcm9udCgpLnJhd1BvcnQoKTsNCisJCWxpc3RvZlBvcnQucG9wX2Zyb250KCk7DQorDQorCQlvdGhlclRyYWNlUG9pbnQuYXBwZW5kKCBuZXdUcmFjZVBvaW50ICk7DQorCX0NCit9DQorDQorDQorYm9vbCBUcmFjZVBvaW50Ojpjb25maWd1cmVUcmFuc2l0aW9uKA0KKwkJY29uc3QgQ29uZmlndXJhdGlvbiAmIGFDb25maWd1cmF0aW9uLA0KKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKQ0KK3sNCisJRXhlY3V0YWJsZVF1ZXJ5IFhRdWVyeSggYUNvbmZpZ3VyYXRpb24gKTsNCisNCisJc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSBhUXVhbGlmaWVkTmFtZUlELmZpbmQoIi0+Iik7DQorDQorCWlmKCBwb3MgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQ0KKwl7DQorCQlzdGQ6OnN0cmluZyBtaWQgPSBhUXVhbGlmaWVkTmFtZUlELnN1YnN0cigwLCBwb3MpOw0KKwkJc3RkOjpzdHJpbmcgb2JqID0gYVF1YWxpZmllZE5hbWVJRC5zdWJzdHIocG9zICsgMik7DQorDQorCQl1cGRhdGVNYWNoaW5lKGFDb25maWd1cmF0aW9uLCBtaWQpOw0KKw0KKwkJaWYoIG9iaiA9PSAiWypdIiApDQorCQl7DQorCQkJYW55X29iamVjdCA9IHRydWU7DQorDQorCQkJcmV0dXJuKCB0cnVlICk7DQorCQl9DQorDQorCQlpZiggbWFjaGluZSAhPSBOVUxMICkNCisJCXsNCisJCQlvYmplY3QgPSBtYWNoaW5lLT5nZXRFeGVjdXRhYmxlKCktPmdldFRyYW5zaXRpb25CeU5hbWVJRCgNCisJCQkJCW9iaiApLnRvX3B0cjwgT2JqZWN0RWxlbWVudCA+KCk7DQorCQl9DQorCQllbHNlDQorCQl7DQorCQkJb2JqZWN0ID0gWFF1ZXJ5LmdldFRyYW5zaXRpb25CeU5hbWVJRCgNCisJCQkJCW9iaiApLnRvX3B0cjwgT2JqZWN0RWxlbWVudCA+KCk7DQorCQl9DQorCX0NCisNCisJZWxzZSBpZiggYVF1YWxpZmllZE5hbWVJRCA9PSAiWypdIiApDQorCXsNCisJCWFueV9vYmplY3QgPSB0cnVlOw0KKw0KKwkJcmV0dXJuKCB0cnVlICk7DQorCX0NCisNCisJZWxzZSBpZiggYVF1YWxpZmllZE5hbWVJRC5maW5kKCcuJykgPT0gc3RkOjpzdHJpbmc6Om5wb3MgKQ0KKwl7DQorCQlvYmplY3QgPSBYUXVlcnkuZ2V0VHJhbnNpdGlvbkJ5TmFtZUlEKA0KKwkJCQlhUXVhbGlmaWVkTmFtZUlEICkudG9fcHRyPCBPYmplY3RFbGVtZW50ID4oKTsNCisJfQ0KKwllbHNlDQorCXsNCisJCW9iamVjdCA9IFhRdWVyeS5nZXRUcmFuc2l0aW9uQnlRdWFsaWZpZWROYW1lSUQoDQorCQkJCWFRdWFsaWZpZWROYW1lSUQgKS50b19wdHI8IE9iamVjdEVsZW1lbnQgPigpOw0KKwl9DQorDQorCXJldHVybiggb2JqZWN0ICE9IE5VTEwgKTsNCit9DQorDQorDQorYm9vbCBUcmFjZVBvaW50Ojpjb25maWd1cmVSb3V0aW5lKGNvbnN0IENvbmZpZ3VyYXRpb24gJiBhQ29uZmlndXJhdGlvbiwNCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkNCit7DQorCXN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgcG9zID0gYVF1YWxpZmllZE5hbWVJRC5maW5kKCItPiIpOw0KKw0KKwlpZiggcG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zICkNCisJew0KKwkJc3RkOjpzdHJpbmcgbWlkID0gYVF1YWxpZmllZE5hbWVJRC5zdWJzdHIoMCwgcG9zKTsNCisJCXN0ZDo6c3RyaW5nIG9iaiA9IGFRdWFsaWZpZWROYW1lSUQuc3Vic3RyKHBvcyArIDIpOw0KKw0KKwkJdXBkYXRlTWFjaGluZShhQ29uZmlndXJhdGlvbiwgbWlkKTsNCisNCisJCWlmKCBvYmogPT0gIlsqXSIgKQ0KKwkJew0KKwkJCWFueV9vYmplY3QgPSB0cnVlOw0KKw0KKwkJCXJldHVybiggdHJ1ZSApOw0KKwkJfQ0KKw0KKwkJaWYoIG1hY2hpbmUgIT0gTlVMTCApDQorCQl7DQorCQkJRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWMgPSBtYWNoaW5lLT5nZXRFeGVjdXRhYmxlKCk7DQorDQorCQkJaWYoIG9iaiA9PSAiaW5pdCIgKQ0KKwkJCXsNCisJCQkJb3AgPSBBVk1fT1BDT0RFX0lOSVQ7DQorCQkJCW9iamVjdCA9ICYoIGFuRXhlYy0+Z2V0T25Jbml0Um91dGluZSgpICk7DQorCQkJfQ0KKwkJCWVsc2UgaWYoIG9iaiA9PSAiZmluYWwiICkNCisJCQl7DQorCQkJCW9wID0gQVZNX09QQ09ERV9GSU5BTDsNCisJCQkJb2JqZWN0ID0gJiggYW5FeGVjLT5nZXRPbkZpbmFsUm91dGluZSgpICk7DQorCQkJfQ0KKw0KKwkJCWVsc2UgaWYoIG9iaiA9PSAic3RhcnQiICkNCisJCQl7DQorCQkJCW9wID0gQVZNX09QQ09ERV9TVEFSVDsNCisJCQkJb2JqZWN0ID0gJiggYW5FeGVjLT5nZXRPblN0YXJ0Um91dGluZSgpICk7DQorCQkJfQ0KKwkJCWVsc2UgaWYoIG9iaiA9PSAic3RvcCIgKQ0KKwkJCXsNCisJCQkJb3AgPSBBVk1fT1BDT0RFX1NUT1A7DQorCQkJCW9iamVjdCA9ICYoIGFuRXhlYy0+Z2V0T25TdG9wUm91dGluZSgpICk7DQorCQkJfQ0KKw0KKwkJCWVsc2UgaWYoIG9iaiA9PSAiaWVuYWJsZSIgKQ0KKwkJCXsNCisJCQkJb3AgPSBBVk1fT1BDT0RFX0lFTkFCTEVfSU5WT0tFOw0KKwkJCQlvYmplY3QgPSAmKCBhbkV4ZWMtPmdldE9uSUVuYWJsZVJvdXRpbmUoKSApOw0KKwkJCX0NCisJCQllbHNlIGlmKCBvYmogPT0gImVuYWJsZSIgKQ0KKwkJCXsNCisJCQkJb3AgPSBBVk1fT1BDT0RFX0VOQUJMRV9JTlZPS0U7DQorCQkJCW9iamVjdCA9ICYoIGFuRXhlYy0+Z2V0T25FbmFibGVSb3V0aW5lKCkgKTsNCisJCQl9DQorDQorCQkJZWxzZSBpZiggb2JqID09ICJpZGlzYWJsZSIgKQ0KKwkJCXsNCisJCQkJb3AgPSBBVk1fT1BDT0RFX0lESVNBQkxFX0lOVk9LRTsNCisJCQkJb2JqZWN0ID0gJiggYW5FeGVjLT5nZXRPbklEaXNhYmxlUm91dGluZSgpICk7DQorCQkJfQ0KKwkJCWVsc2UgaWYoIG9iaiA9PSAiZGlzYWJsZSIgKQ0KKwkJCXsNCisJCQkJb3AgPSBBVk1fT1BDT0RFX0RJU0FCTEVfSU5WT0tFOw0KKwkJCQlvYmplY3QgPSAmKCBhbkV4ZWMtPmdldE9uRGlzYWJsZVJvdXRpbmUoKSApOw0KKwkJCX0NCisJCQllbHNlIGlmKCBvYmogPT0gImlhYm9ydCIgKQ0KKwkJCXsNCisJCQkJb3AgPSBBVk1fT1BDT0RFX0lBQk9SVF9JTlZPS0U7DQorCQkJCW9iamVjdCA9ICYoIGFuRXhlYy0+Z2V0T25JQWJvcnRSb3V0aW5lKCkgKTsNCisJCQl9DQorCQkJZWxzZSBpZiggb2JqID09ICJhYm9ydCIgKQ0KKwkJCXsNCisJCQkJb3AgPSBBVk1fT1BDT0RFX0FCT1JUX0lOVk9LRTsNCisJCQkJb2JqZWN0ID0gJiggYW5FeGVjLT5nZXRPbkFib3J0Um91dGluZSgpICk7DQorCQkJfQ0KKw0KKwkJCWVsc2UgaWYoIG9iaiA9PSAiaXJ1biIgKQ0KKwkJCXsNCisJCQkJb3AgPSBBVk1fT1BDT0RFX0lSVU47DQorCQkJCW9iamVjdCA9ICYoIGFuRXhlYy0+Z2V0T25JUnVuUm91dGluZSgpICk7DQorCQkJfQ0KKwkJCWVsc2UgaWYoIG9iaiA9PSAicnVuIiApDQorCQkJew0KKwkJCQlvcCA9IEFWTV9PUENPREVfUlVOOw0KKwkJCQlvYmplY3QgPSAmKCBhbkV4ZWMtPmdldE9uUnVuUm91dGluZSgpICk7DQorCQkJfQ0KKwkJCWVsc2UgaWYoIG9iaiA9PSAicnRjIiApDQorCQkJew0KKwkJCQlvcCA9IEFWTV9PUENPREVfUlRDOw0KKwkJCQlvYmplY3QgPSAmKCBhbkV4ZWMtPmdldE9uUnRjUm91dGluZSgpICk7DQorCQkJfQ0KKw0KKwkJCWVsc2UgaWYoIG9iaiA9PSAic2NoZWR1bGUiICkNCisJCQl7DQorCQkJCW9wID0gQVZNX09QQ09ERV9TQ0hFRFVMRV9JTlZPS0U7DQorCQkJCW9iamVjdCA9ICYoIGFuRXhlYy0+Z2V0T25TY2hlZHVsZVJvdXRpbmUoKSApOw0KKwkJCX0NCisJCQllbHNlIGlmKCBvYmogPT0gImNvbmN1cnJlbmN5IiApDQorCQkJew0KKwkJCQlvcCA9IEFWTV9PUENPREVfU0NIRURVTEVfSU5WT0tFOw0KKwkJCQlvYmplY3QgPSAmKCBhbkV4ZWMtPmdldE9uQ29uY3VycmVuY3lSb3V0aW5lKCkgKTsNCisJCQl9DQorCQl9DQorCX0NCisNCisJZWxzZSBpZiggYVF1YWxpZmllZE5hbWVJRCA9PSAiWypdIiApDQorCXsNCisJCWFueV9vYmplY3QgPSB0cnVlOw0KKw0KKwkJcmV0dXJuKCB0cnVlICk7DQorCX0NCisNCisJcmV0dXJuKCBvYmplY3QgIT0gTlVMTCApOw0KK30NCisNCisNCitib29sIFRyYWNlUG9pbnQ6OmNvbmZpZ3VyZVJ1bm5hYmxlKGNvbnN0IENvbmZpZ3VyYXRpb24gJiBhQ29uZmlndXJhdGlvbiwNCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkNCit7DQorCXN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgcG9zID0gYVF1YWxpZmllZE5hbWVJRC5maW5kKCItPiIpOw0KKw0KKwlpZiggcG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zICkNCisJew0KKwkJc3RkOjpzdHJpbmcgbWlkID0gYVF1YWxpZmllZE5hbWVJRC5zdWJzdHIoMCwgcG9zKTsNCisJCXN0ZDo6c3RyaW5nIG9iaiA9IGFRdWFsaWZpZWROYW1lSUQuc3Vic3RyKHBvcyArIDIpOw0KKw0KKwkJdXBkYXRlTWFjaGluZShhQ29uZmlndXJhdGlvbiwgbWlkKTsNCisNCisJCWlmKCBvYmogPT0gIlsqXSIgKQ0KKwkJew0KKwkJCWFueV9vYmplY3QgPSB0cnVlOw0KKw0KKwkJCXJldHVybiggdHJ1ZSApOw0KKwkJfQ0KKw0KKwkJaWYoIG1hY2hpbmUgIT0gTlVMTCApDQorCQl7DQorCQkJRXhlY3V0YWJsZUZvcm0gKiBhbkV4ZWMgPSBtYWNoaW5lLT5nZXRFeGVjdXRhYmxlKCk7DQorDQorCQkJaWYoIG9iaiA9PSAiaW5pdCIgKQ0KKwkJCXsNCisJCQkJb3AgPSBBVk1fT1BDT0RFX0lOSVQ7DQorCQkJCW9iamVjdCA9ICYoIGFuRXhlYy0+Z2V0T25Jbml0Um91dGluZSgpICk7DQorCQkJfQ0KKwkJCWVsc2UgaWYoIG9iaiA9PSAiZmluYWwiICkNCisJCQl7DQorCQkJCW9wID0gQVZNX09QQ09ERV9GSU5BTDsNCisJCQkJb2JqZWN0ID0gJiggYW5FeGVjLT5nZXRPbkZpbmFsUm91dGluZSgpICk7DQorCQkJfQ0KKw0KKwkJCWVsc2UgaWYoIG9iaiA9PSAic3RhcnQiICkNCisJCQl7DQorCQkJCW9wID0gQVZNX09QQ09ERV9TVEFSVDsNCisJCQkJb2JqZWN0ID0gJiggYW5FeGVjLT5nZXRPblN0YXJ0Um91dGluZSgpICk7DQorCQkJfQ0KKwkJCWVsc2UgaWYoIG9iaiA9PSAic3RvcCIgKQ0KKwkJCXsNCisJCQkJb3AgPSBBVk1fT1BDT0RFX1NUT1A7DQorCQkJCW9iamVjdCA9ICYoIGFuRXhlYy0+Z2V0T25TdG9wUm91dGluZSgpICk7DQorCQkJfQ0KKw0KKwkJCWVsc2UgaWYoIG9iaiA9PSAiaWVuYWJsZSIgKQ0KKwkJCXsNCisJCQkJb3AgPSBBVk1fT1BDT0RFX0lFTkFCTEVfSU5WT0tFOw0KKwkJCQlvYmplY3QgPSAmKCBhbkV4ZWMtPmdldE9uSUVuYWJsZVJvdXRpbmUoKSApOw0KKwkJCX0NCisJCQllbHNlIGlmKCBvYmogPT0gImVuYWJsZSIgKQ0KKwkJCXsNCisJCQkJb3AgPSBBVk1fT1BDT0RFX0VOQUJMRV9JTlZPS0U7DQorCQkJCW9iamVjdCA9ICYoIGFuRXhlYy0+Z2V0T25FbmFibGVSb3V0aW5lKCkgKTsNCisJCQl9DQorDQorCQkJZWxzZSBpZiggb2JqID09ICJpZGlzYWJsZSIgKQ0KKwkJCXsNCisJCQkJb3AgPSBBVk1fT1BDT0RFX0lESVNBQkxFX0lOVk9LRTsNCisJCQkJb2JqZWN0ID0gJiggYW5FeGVjLT5nZXRPbklEaXNhYmxlUm91dGluZSgpICk7DQorCQkJfQ0KKwkJCWVsc2UgaWYoIG9iaiA9PSAiZGlzYWJsZSIgKQ0KKwkJCXsNCisJCQkJb3AgPSBBVk1fT1BDT0RFX0RJU0FCTEVfSU5WT0tFOw0KKwkJCQlvYmplY3QgPSAmKCBhbkV4ZWMtPmdldE9uRGlzYWJsZVJvdXRpbmUoKSApOw0KKwkJCX0NCisJCQllbHNlIGlmKCBvYmogPT0gImlhYm9ydCIgKQ0KKwkJCXsNCisJCQkJb3AgPSBBVk1fT1BDT0RFX0lBQk9SVF9JTlZPS0U7DQorCQkJCW9iamVjdCA9ICYoIGFuRXhlYy0+Z2V0T25JQWJvcnRSb3V0aW5lKCkgKTsNCisJCQl9DQorCQkJZWxzZSBpZiggb2JqID09ICJhYm9ydCIgKQ0KKwkJCXsNCisJCQkJb3AgPSBBVk1fT1BDT0RFX0FCT1JUX0lOVk9LRTsNCisJCQkJb2JqZWN0ID0gJiggYW5FeGVjLT5nZXRPbkFib3J0Um91dGluZSgpICk7DQorCQkJfQ0KKw0KKwkJCWVsc2UgaWYoIG9iaiA9PSAiaXJ1biIgKQ0KKwkJCXsNCisJCQkJb3AgPSBBVk1fT1BDT0RFX0lSVU47DQorCQkJCW9iamVjdCA9ICYoIGFuRXhlYy0+Z2V0T25JUnVuUm91dGluZSgpICk7DQorCQkJfQ0KKwkJCWVsc2UgaWYoIG9iaiA9PSAicnVuIiApDQorCQkJew0KKwkJCQlvcCA9IEFWTV9PUENPREVfUlVOOw0KKwkJCQlvYmplY3QgPSAmKCBhbkV4ZWMtPmdldE9uUnVuUm91dGluZSgpICk7DQorCQkJfQ0KKwkJCWVsc2UgaWYoIG9iaiA9PSAicnRjIiApDQorCQkJew0KKwkJCQlvcCA9IEFWTV9PUENPREVfUlRDOw0KKwkJCQlvYmplY3QgPSAmKCBhbkV4ZWMtPmdldE9uUnRjUm91dGluZSgpICk7DQorCQkJfQ0KKw0KKwkJCWVsc2UgaWYoIG9iaiA9PSAic2NoZWR1bGUiICkNCisJCQl7DQorCQkJCW9wID0gQVZNX09QQ09ERV9TQ0hFRFVMRV9JTlZPS0U7DQorCQkJCW9iamVjdCA9ICYoIGFuRXhlYy0+Z2V0T25TY2hlZHVsZVJvdXRpbmUoKSApOw0KKwkJCX0NCisJCQllbHNlIGlmKCBvYmogPT0gImNvbmN1cnJlbmN5IiApDQorCQkJew0KKwkJCQlvcCA9IEFWTV9PUENPREVfU0NIRURVTEVfSU5WT0tFOw0KKwkJCQlvYmplY3QgPSAmKCBhbkV4ZWMtPmdldE9uQ29uY3VycmVuY3lSb3V0aW5lKCkgKTsNCisJCQl9DQorCQl9DQorCX0NCisNCisJZWxzZSBpZiggYVF1YWxpZmllZE5hbWVJRCA9PSAiWypdIiApDQorCXsNCisJCWFueV9vYmplY3QgPSB0cnVlOw0KKw0KKwkJcmV0dXJuKCB0cnVlICk7DQorCX0NCisNCisJcmV0dXJuKCBvYmplY3QgIT0gTlVMTCApOw0KK30NCisNCisNCitib29sIFRyYWNlUG9pbnQ6OmNvbmZpZ3VyZU1hY2hpbmUoDQorCQljb25zdCBDb25maWd1cmF0aW9uICYgYUNvbmZpZ3VyYXRpb24sDQorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpDQorew0KKwlzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IGFRdWFsaWZpZWROYW1lSUQuZmluZCgiLT4iKTsNCisNCisJaWYoIHBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcyApDQorCXsNCisJCXN0ZDo6c3RyaW5nIG1pZCA9IGFRdWFsaWZpZWROYW1lSUQuc3Vic3RyKDAsIHBvcyk7DQorCQlzdGQ6OnN0cmluZyBvYmogPSBhUXVhbGlmaWVkTmFtZUlELnN1YnN0cihwb3MgKyAyKTsNCisNCisJCXVwZGF0ZU1hY2hpbmUoYUNvbmZpZ3VyYXRpb24sIG1pZCk7DQorDQorCQlpZiggb2JqID09ICJbKl0iICkNCisJCXsNCisJCQlhbnlfb2JqZWN0ID0gdHJ1ZTsNCisNCisJCQlyZXR1cm4oIHRydWUgKTsNCisJCX0NCisNCisJCWlmKCBtYWNoaW5lICE9IE5VTEwgKQ0KKwkJew0KKwkJCUV4ZWN1dGFibGVGb3JtICogY29udGFpbmVyRXhlY3V0YWJsZSA9IG1hY2hpbmUtPmdldEV4ZWN1dGFibGUoKTsNCisNCisJCQl3aGlsZSggY29udGFpbmVyRXhlY3V0YWJsZSAhPSBOVUxMICkNCisJCQl7DQorCQkJCW9iamVjdCA9IGNvbnRhaW5lckV4ZWN1dGFibGUtPmdldFBvcnQoKS5nZXRCeU5hbWVJRChvYmopLnJhd1BvcnQoKTsNCisNCisJCQkJaWYoIG9iamVjdCA9PSBOVUxMICkNCisJCQkJew0KKwkJCQkJY29udGFpbmVyRXhlY3V0YWJsZSA9DQorCQkJCQkJCWNvbnRhaW5lckV4ZWN1dGFibGUtPmdldEV4ZWN1dGFibGVDb250YWluZXIoKTsNCisJCQkJfQ0KKwkJCQllbHNlDQorCQkJCXsNCisJCQkJCWJyZWFrOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJZWxzZQ0KKwkJew0KKwkJCUV4ZWN1dGFibGVRdWVyeSBYUXVlcnkoIGFDb25maWd1cmF0aW9uICk7DQorDQorCQkJb2JqZWN0ID0gbWFjaGluZSA9IFhRdWVyeS5nZXRNYWNoaW5lQnlRdWFsaWZpZWROYW1lSUQoDQorCQkJCVNwZWNpZmllcjo6REVTSUdOX0lOU1RBTkNFX0tJTkQsIG1pZCArICIuIiArIG9iaikucmF3TWFjaGluZSgpOw0KKwkJfQ0KKwl9DQorDQorCWVsc2UgaWYoIGFRdWFsaWZpZWROYW1lSUQgPT0gIlsqXSIgKQ0KKwl7DQorCQlhbnlfb2JqZWN0ID0gdHJ1ZTsNCisNCisJCXJldHVybiggdHJ1ZSApOw0KKwl9DQorDQorCWVsc2UNCisJew0KKwkJdXBkYXRlTWFjaGluZShhQ29uZmlndXJhdGlvbiwgYVF1YWxpZmllZE5hbWVJRCk7DQorDQorCQlvYmplY3QgPSBtYWNoaW5lOw0KKwl9DQorDQorCXJldHVybiggb2JqZWN0ICE9IE5VTEwgKTsNCit9DQorDQorDQorYm9vbCBUcmFjZVBvaW50Ojpjb25maWd1cmVWYXJpYWJsZSgNCisJCWNvbnN0IENvbmZpZ3VyYXRpb24gJiBhQ29uZmlndXJhdGlvbiwNCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkNCit7DQorCUV4ZWN1dGFibGVRdWVyeSBYUXVlcnkoIGFDb25maWd1cmF0aW9uICk7DQorDQorCXN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgcG9zID0gYVF1YWxpZmllZE5hbWVJRC5maW5kKCItPiIpOw0KKw0KKwlpZiggcG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zICkNCisJew0KKwkJc3RkOjpzdHJpbmcgbWlkID0gYVF1YWxpZmllZE5hbWVJRC5zdWJzdHIoMCwgcG9zKTsNCisJCXN0ZDo6c3RyaW5nIG9iaiA9IGFRdWFsaWZpZWROYW1lSUQuc3Vic3RyKHBvcyArIDIpOw0KKw0KKwkJdXBkYXRlTWFjaGluZShhQ29uZmlndXJhdGlvbiwgbWlkKTsNCisNCisJCWlmKCBvYmogPT0gIlsqXSIgKQ0KKwkJew0KKwkJCWFueV9vYmplY3QgPSB0cnVlOw0KKw0KKwkJCXJldHVybiggdHJ1ZSApOw0KKwkJfQ0KKw0KKwkJaWYoIG1hY2hpbmUgIT0gTlVMTCApDQorCQl7DQorCQkJb2JqZWN0ID0gbWFjaGluZS0+Z2V0RXhlY3V0YWJsZSgpLT5nZXREYXRhKCkucmF3QnlOYW1lSUQoIG9iaiApOw0KKwkJfQ0KKwkJZWxzZQ0KKwkJew0KKwkJCW9iamVjdCA9IFhRdWVyeS5nZXREYXRhQnlOYW1lSUQoIG9iaiApLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpOw0KKwkJfQ0KKwl9DQorDQorCWVsc2UgaWYoIGFRdWFsaWZpZWROYW1lSUQgPT0gIlsqXSIgKQ0KKwl7DQorCQlhbnlfb2JqZWN0ID0gdHJ1ZTsNCisNCisJCXJldHVybiggdHJ1ZSApOw0KKwl9DQorDQorCWVsc2UgaWYoIGFRdWFsaWZpZWROYW1lSUQuZmluZCgnLicpID09IHN0ZDo6c3RyaW5nOjpucG9zICkNCisJew0KKwkJb2JqZWN0ID0gWFF1ZXJ5LmdldERhdGFCeU5hbWVJRCgNCisJCQkJYVF1YWxpZmllZE5hbWVJRCApLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpOw0KKwl9DQorCWVsc2UNCisJew0KKwkJb2JqZWN0ID0gWFF1ZXJ5LmdldERhdGFCeVF1YWxpZmllZE5hbWVJRCgNCisJCQkJYVF1YWxpZmllZE5hbWVJRCApLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpOw0KKwl9DQorDQorCXJldHVybiggb2JqZWN0ICE9IE5VTEwgKTsNCit9DQorDQorDQorYm9vbCBUcmFjZVBvaW50Ojpjb25maWd1cmVCdWZmZXIoDQorCQljb25zdCBDb25maWd1cmF0aW9uICYgYUNvbmZpZ3VyYXRpb24sDQorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpDQorew0KKwlFeGVjdXRhYmxlUXVlcnkgWFF1ZXJ5KCBhQ29uZmlndXJhdGlvbiApOw0KKw0KKwlzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IGFRdWFsaWZpZWROYW1lSUQuZmluZCgiLT4iKTsNCisNCisJaWYoIHBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcyApDQorCXsNCisJCXN0ZDo6c3RyaW5nIG1pZCA9IGFRdWFsaWZpZWROYW1lSUQuc3Vic3RyKDAsIHBvcyk7DQorCQlzdGQ6OnN0cmluZyBvYmogPSBhUXVhbGlmaWVkTmFtZUlELnN1YnN0cihwb3MgKyAyKTsNCisNCisJCXVwZGF0ZU1hY2hpbmUoYUNvbmZpZ3VyYXRpb24sIG1pZCk7DQorDQorCQlpZiggb2JqID09ICJbKl0iICkNCisJCXsNCisJCQlhbnlfb2JqZWN0ID0gdHJ1ZTsNCisNCisJCQlyZXR1cm4oIHRydWUgKTsNCisJCX0NCisNCisJCWlmKCBtYWNoaW5lICE9IE5VTEwgKQ0KKwkJew0KKwkJCW9iamVjdCA9IG1hY2hpbmUtPmdldEV4ZWN1dGFibGUoKQ0KKwkJCQkJLT5nZXRCdWZmZXIoKS5nZXRCeU5hbWVJRChvYmopLnJhd0J1ZmZlcigpOw0KKwkJfQ0KKwkJZWxzZQ0KKwkJew0KKwkJCW9iamVjdCA9IFhRdWVyeS5nZXRCdWZmZXJCeU5hbWVJRCggb2JqICkucmF3QnVmZmVyKCk7DQorCQl9DQorCX0NCisNCisJZWxzZSBpZiggYVF1YWxpZmllZE5hbWVJRCA9PSAiWypdIiApDQorCXsNCisJCWFueV9vYmplY3QgPSB0cnVlOw0KKw0KKwkJcmV0dXJuKCB0cnVlICk7DQorCX0NCisNCisJZWxzZSBpZiggYVF1YWxpZmllZE5hbWVJRC5maW5kKCcuJykgPT0gc3RkOjpzdHJpbmc6Om5wb3MgKQ0KKwl7DQorCQlvYmplY3QgPSBYUXVlcnkuZ2V0QnVmZmVyQnlOYW1lSUQoIGFRdWFsaWZpZWROYW1lSUQgKS5yYXdCdWZmZXIoKTsNCisJfQ0KKwllbHNlDQorCXsNCisJCW9iamVjdCA9IFhRdWVyeS5nZXRCdWZmZXJCeVF1YWxpZmllZE5hbWVJRCgNCisJCQkJYVF1YWxpZmllZE5hbWVJRCApLnJhd0J1ZmZlcigpOw0KKwl9DQorDQorCXJldHVybiggb2JqZWN0ICE9IE5VTEwgKTsNCit9DQorDQorDQorDQorLyoqDQorICogR0VUVEVSIC8gU0VUVEVSDQorICogb3ANCisgKi8NCitBVk1fT1BDT0RFICBUcmFjZVBvaW50Ojp0b19raW5kKGNvbnN0IHN0ZDo6c3RyaW5nICYgaWQpDQorew0KKwlpZiggaWQgPT0gInRpbWUiICAgICAgICkgcmV0dXJuIEFWTV9PUENPREVfVElNRURfR1VBUkQ7DQorDQorCWlmKCBpZCA9PSAiZm9ybXVsYSIgICAgKSByZXR1cm4gQVZNX09QQ09ERV9HVUFSRDsNCisNCisJaWYoIGlkID09ICJhc3NpZ24iICAgICApIHJldHVybiBBVk1fT1BDT0RFX0FTU0lHTjsNCisJaWYoIGlkID09ICJuZXdmcmVzaCIgICApIHJldHVybiBBVk1fT1BDT0RFX0FTU0lHTl9ORVdGUkVTSDsNCisNCisJaWYoIGlkID09ICJpbnB1dCIgICAgICApIHJldHVybiBBVk1fT1BDT0RFX0lOUFVUOw0KKw0KKwlpZiggUkVHRVhfTUFUQ0goaWQsIENPTlNfV0lEMigiaW5wdXQiLCAiZW52IikpICkgcmV0dXJuIEFWTV9PUENPREVfSU5QVVRfRU5WOw0KKwlpZiggUkVHRVhfTUFUQ0goaWQsIENPTlNfV0lEMigiaW5wdXQiLCAicmR2IikpICkgcmV0dXJuIEFWTV9PUENPREVfSU5QVVRfUkRWOw0KKw0KKwlpZiggaWQgPT0gIm91dHB1dCIgICAgICkgcmV0dXJuIEFWTV9PUENPREVfT1VUUFVUOw0KKw0KKwlpZiggUkVHRVhfTUFUQ0goaWQsIENPTlNfV0lEMigib3V0cHV0IiwgImVudiIpKSApIHJldHVybiBBVk1fT1BDT0RFX09VVFBVVF9FTlY7DQorCWlmKCBSRUdFWF9NQVRDSChpZCwgQ09OU19XSUQyKCJvdXRwdXQiLCAicmR2IikpICkgcmV0dXJuIEFWTV9PUENPREVfT1VUUFVUX1JEVjsNCisNCisJcmV0dXJuIEFWTV9PUENPREVfTlVMTDsNCit9DQorDQorDQorQVZNX09QQ09ERSBUcmFjZVBvaW50Ojp0b19vcChBVk1fT1BDT0RFIG9wKQ0KK3sNCisJc3dpdGNoKCBvcCApDQorCXsNCisJCWNhc2UgQVZNX09QQ09ERV9BU1NJR046DQorCQljYXNlIEFWTV9PUENPREVfQVNTSUdOX0FGVEVSOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0FTU0lHTl9PUF9BRlRFUjoNCisJCWNhc2UgQVZNX09QQ09ERV9BU1NJR05fUkVGOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0FTU0lHTl9NQUNSTzoNCisJCWNhc2UgQVZNX09QQ09ERV9BU1NJR05fUkVTRVQ6DQorCQl7DQorCQkJcmV0dXJuKCBBVk1fT1BDT0RFX0FTU0lHTiApOw0KKwkJfQ0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUX0ZST006DQorCQl7DQorCQkJcmV0dXJuKCBBVk1fT1BDT0RFX0lOUFVUICk7DQorCQl9DQorDQorCQljYXNlIEFWTV9PUENPREVfT1VUUFVUOg0KKwkJY2FzZSBBVk1fT1BDT0RFX09VVFBVVF9UTzoNCisJCXsNCisJCQlyZXR1cm4oIEFWTV9PUENPREVfT1VUUFVUICk7DQorCQl9DQorDQorDQorCQljYXNlIEFWTV9PUENPREVfSU5QVVRfRU5WOg0KKwkJY2FzZSBBVk1fT1BDT0RFX09VVFBVVF9FTlY6DQorDQorCQljYXNlIEFWTV9PUENPREVfSU5QVVRfUkRWOg0KKwkJY2FzZSBBVk1fT1BDT0RFX09VVFBVVF9SRFY6DQorDQorCQljYXNlIEFWTV9PUENPREVfQVNTSUdOX05FV0ZSRVNIOg0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX1RJTUVEX0dVQVJEOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0dVQVJEOg0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX0lOVk9LRV9ORVc6DQorCQljYXNlIEFWTV9PUENPREVfSU5WT0tFX1JPVVRJTkU6DQorCQljYXNlIEFWTV9PUENPREVfSU5WT0tFX1RSQU5TSVRJT046DQorDQorCQljYXNlIEFWTV9PUENPREVfSU5JVDoNCisJCWNhc2UgQVZNX09QQ09ERV9GSU5BTDoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9TVEFSVDoNCisJCWNhc2UgQVZNX09QQ09ERV9TVE9QOg0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX0lFTkFCTEVfSU5WT0tFOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0VOQUJMRV9JTlZPS0U6DQorDQorCQljYXNlIEFWTV9PUENPREVfSURJU0FCTEVfSU5WT0tFOg0KKwkJY2FzZSBBVk1fT1BDT0RFX0RJU0FCTEVfSU5WT0tFOg0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX0lBQk9SVF9JTlZPS0U6DQorCQljYXNlIEFWTV9PUENPREVfQUJPUlRfSU5WT0tFOg0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX0lSVU46DQorCQljYXNlIEFWTV9PUENPREVfUlVOOg0KKwkJY2FzZSBBVk1fT1BDT0RFX1JUQzoNCisNCisJCWNhc2UgQVZNX09QQ09ERV9TQ0hFRFVMRV9JTlZPS0U6DQorDQorCQljYXNlIEFWTV9PUENPREVfREVGRVJfSU5WT0tFOg0KKwkJew0KKwkJCXJldHVybiggb3AgKTsNCisJCX0NCisNCisJCWRlZmF1bHQ6DQorCQl7DQorCQkJcmV0dXJuKCBBVk1fT1BDT0RFX05VTEwgKTsNCisJCX0NCisJfQ0KK30NCisNCisNCitzdGQ6OnN0cmluZyAgVHJhY2VQb2ludDo6dG9fc3RyaW5nKEFWTV9PUENPREUgb3ApDQorew0KKwlzd2l0Y2goIG9wICkNCisJew0KKwkJY2FzZSBBVk1fT1BDT0RFX1RJTUVEX0dVQVJEICAgICAgIDogcmV0dXJuKCAidGltZSIgKTsNCisNCisJCWNhc2UgQVZNX09QQ09ERV9DSEVDS19TQVQgICAgICAgICA6IHJldHVybiggImNoZWNrX3NhdCIgKTsNCisJCWNhc2UgQVZNX09QQ09ERV9HVUFSRCAgICAgICAgICAgICA6IHJldHVybiggImd1YXJkIiAgICAgKTsNCisNCisJCWNhc2UgQVZNX09QQ09ERV9TRUxFQ1QgICAgICAgICAgICA6IHJldHVybiggInNlbGVjdCIgICAgKTsNCisNCisJCWNhc2UgQVZNX09QQ09ERV9BU1NJR04gICAgICAgICAgICA6IHJldHVybiggImFzc2lnbiIgICAgKTsNCisNCisJCWNhc2UgQVZNX09QQ09ERV9BU1NJR05fTkVXRlJFU0ggICA6IHJldHVybiggIm5ld2ZyZXNoIiAgKTsNCisNCisJCWNhc2UgQVZNX09QQ09ERV9JTlBVVCAgICAgICAgICAgICA6IHJldHVybiggImlucHV0IiAgICAgKTsNCisJCWNhc2UgQVZNX09QQ09ERV9JTlBVVF9FTlYgICAgICAgICA6IHJldHVybiggImlucHV0I2VudiIgKTsNCisJCWNhc2UgQVZNX09QQ09ERV9JTlBVVF9GUk9NICAgICAgICA6IHJldHVybiggImlucHV0I2Zyb20iICk7DQorCQljYXNlIEFWTV9PUENPREVfSU5QVVRfUkRWICAgICAgICAgOiByZXR1cm4oICJpbnB1dCNyZHYiICk7DQorDQorCQljYXNlIEFWTV9PUENPREVfT1VUUFVUICAgICAgICAgICAgOiByZXR1cm4oICJvdXRwdXQiICAgICApOw0KKwkJY2FzZSBBVk1fT1BDT0RFX09VVFBVVF9FTlYgICAgICAgIDogcmV0dXJuKCAib3V0cHV0I2VudiIgKTsNCisJCWNhc2UgQVZNX09QQ09ERV9PVVRQVVRfVE8gICAgICAgICA6IHJldHVybiggIm91dHB1dCN0byIgKTsNCisJCWNhc2UgQVZNX09QQ09ERV9PVVRQVVRfUkRWICAgICAgICA6IHJldHVybiggIm91dHB1dCNyZHYiICk7DQorDQorCQljYXNlIEFWTV9PUENPREVfSU5WT0tFX05FVyAgICAgICAgOiByZXR1cm4oICJuZXciICAgICAgICAgICAgICAgKTsNCisJCWNhc2UgQVZNX09QQ09ERV9JTlZPS0VfUk9VVElORSAgICA6IHJldHVybiggImludm9rZSNyb3V0aW5lIiAgICApOw0KKwkJY2FzZSBBVk1fT1BDT0RFX0lOVk9LRV9UUkFOU0lUSU9OIDogcmV0dXJuKCAiaW52b2tlI3RyYW5zaXRpb24iICk7DQorDQorCQljYXNlIEFWTV9PUENPREVfSU5JVCAgICAgICAgICAgICAgOiByZXR1cm4oICJpbml0IiAgKTsNCisJCWNhc2UgQVZNX09QQ09ERV9GSU5BTCAgICAgICAgICAgICA6IHJldHVybiggImZpbmFsIiApOw0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX1NUQVJUICAgICAgICAgICAgIDogcmV0dXJuKCAic3RhcnQiICk7DQorCQljYXNlIEFWTV9PUENPREVfU1RPUCAgICAgICAgICAgICAgOiByZXR1cm4oICJzdG9wIiAgKTsNCisNCisJCWNhc2UgQVZNX09QQ09ERV9JRU5BQkxFX0lOVk9LRSAgICA6IHJldHVybiggImllbmFibGUiICAgICk7DQorCQljYXNlIEFWTV9PUENPREVfRU5BQkxFX0lOVk9LRSAgICAgOiByZXR1cm4oICJlbmFibGUiICAgICApOw0KKwkJY2FzZSBBVk1fT1BDT0RFX0VOQUJMRV9TRVQgICAgICAgIDogcmV0dXJuKCAiZW5hYmxlI3NldCIgKTsNCisNCisJCWNhc2UgQVZNX09QQ09ERV9JRElTQUJMRV9JTlZPS0UgICA6IHJldHVybiggImlkaXNhYmxlIiApOw0KKwkJY2FzZSBBVk1fT1BDT0RFX0RJU0FCTEVfSU5WT0tFICAgIDogcmV0dXJuKCAiZGlzYWJsZSIgICk7DQorDQorCQljYXNlIEFWTV9PUENPREVfSUFCT1JUX0lOVk9LRSAgICAgOiByZXR1cm4oICJpYWJvcnQiICk7DQorCQljYXNlIEFWTV9PUENPREVfQUJPUlRfSU5WT0tFICAgICAgOiByZXR1cm4oICJhYm9ydCIgICk7DQorDQorCQljYXNlIEFWTV9PUENPREVfSVJVTiAgICAgICAgICAgICAgOiByZXR1cm4oICJpcnVuIiApOw0KKwkJY2FzZSBBVk1fT1BDT0RFX1JVTiAgICAgICAgICAgICAgIDogcmV0dXJuKCAicnVuIiAgKTsNCisJCWNhc2UgQVZNX09QQ09ERV9SVEMgICAgICAgICAgICAgICA6IHJldHVybiggInJ0YyIgICk7DQorDQorCQljYXNlIEFWTV9PUENPREVfU0NIRURVTEVfSU5WT0tFICAgOiByZXR1cm4oICJzY2hlZHVsZSIgKTsNCisNCisJCWNhc2UgQVZNX09QQ09ERV9ERUZFUl9JTlZPS0UgICAgICA6IHJldHVybiggImRlZmVyIiApOw0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX0VRICAgICAgICAgICAgICAgIDogcmV0dXJuKCAiZXEiICApOw0KKwkJY2FzZSBBVk1fT1BDT0RFX1NFUSAgICAgICAgICAgICAgIDogcmV0dXJuKCAic2VxIiApOw0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX05PVCAgICAgICAgICAgICAgIDogcmV0dXJuKCAibm90IiApOw0KKwkJY2FzZSBBVk1fT1BDT0RFX0FORCAgICAgICAgICAgICAgIDogcmV0dXJuKCAiYW5kIiApOw0KKwkJY2FzZSBBVk1fT1BDT0RFX09SICAgICAgICAgICAgICAgIDogcmV0dXJuKCAib3IiICApOw0KKwkJY2FzZSBBVk1fT1BDT0RFX1hPUiAgICAgICAgICAgICAgIDogcmV0dXJuKCAieG9yIiApOw0KKw0KKwkJY2FzZSBBVk1fT1BDT0RFX1BBUkFMTEVMICAgICAgICAgIDogcmV0dXJuKCAiKXwsfCIgICApOw0KKwkJY2FzZSBBVk1fT1BDT0RFX1NUUk9OR19TWU5DSFJPTk9VUzogcmV0dXJuKCAifGFuZHwiICk7DQorDQorCQljYXNlIEFWTV9PUENPREVfTk9QICAgICAgICAgICAgICAgOiByZXR1cm4oICJub3AiICAgKTsNCisNCisJCWNhc2UgQVZNX09QQ09ERV9OVUxMICAgICAgICAgICAgICA6IHJldHVybiggIjw/b3A+IiApOw0KKw0KKwkJZGVmYXVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcmV0dXJuKCAidHJhY2Ujb3A8dW5rbm93bj4iICk7DQorCX0NCit9DQorDQorDQorDQordm9pZCBUcmFjZVBvaW50Ojp1cGRhdGVOYXR1cmVPcGNvZGVSSUQoKQ0KK3sNCisJaWYoIChuYXR1cmUgPT0gRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfVU5ERUZJTkVEX05BVFVSRSkNCisJCSYmIChvYmplY3QgIT0gTlVMTCkgKQ0KKwl7DQorCQlpZiggb2JqZWN0LT5pczwgSW5zdGFuY2VPZlBvcnQgPigpICkNCisJCXsNCisJCQluYXR1cmUgPSBFTlVNX1RSQUNFX1BPSU5UOjp0b19uYXR1cmUoDQorCQkJCQlvYmplY3QtPnRvPCBJbnN0YW5jZU9mUG9ydCA+KCktPmdldENvbVBvaW50TmF0dXJlKCkgKTsNCisJCX0NCisJCWVsc2UgaWYoIG9iamVjdC0+aXM8IEluc3RhbmNlT2ZEYXRhID4oKSApDQorCQl7DQorCQkJbmF0dXJlID0gRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfVkFSSUFCTEVfTkFUVVJFOw0KKwkJfQ0KKwl9DQorCWVsc2UgaWYoIChuYXR1cmUgPT0gRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTUFDSElORV9OQVRVUkUpDQorCQkJJiYgb2JqZWN0LT5pczwgSW5zdGFuY2VPZk1hY2hpbmUgPigpICkNCisJew0KKwkJSW5zdGFuY2VPZk1hY2hpbmUgKiBtYWNoaW5lID0gb2JqZWN0LT50bzwgSW5zdGFuY2VPZk1hY2hpbmUgPigpOw0KKw0KKwkJaWYoIG1hY2hpbmUtPmdldFNwZWNpZmllcigpLmlzRmFtaWx5Q29tcG9uZW50U3RhdGUoKSApDQorCQl7DQorCQkJbmF0dXJlID0gRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfU1RBVEVfTkFUVVJFOw0KKwkJfQ0KKwkJZWxzZSBpZiggbWFjaGluZS0+Z2V0U3BlY2lmaWVyKCkuaXNDb21wb25lbnRTdGF0ZW1hY2hpbmUoKSApDQorCQl7DQorCQkJbmF0dXJlID0gRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfU1RBVEVNQUNISU5FX05BVFVSRTsNCisJCX0NCisJfQ0KKw0KKw0KKwlpZiggY29uZmlnICE9IE5VTEwgKQ0KKwl7DQorCQlpZiggKG9wID09IEFWTV9PUENPREVfTlVMTCkgJiYgY29uZmlnLT5pc0F2bUNvZGUoKSApDQorCQl7DQorCQkJb3AgPSB0b19vcCggY29uZmlnLT5nZXRPcHRpbWl6ZWRPcENvZGUoKSApOw0KKwkJfQ0KKw0KKwkJaWYoIFJJRC5pbnZhbGlkKCkgKQ0KKwkJew0KKwkJCVJJRCA9IGNvbmZpZy0+Z2V0UnVudGltZUlEKCk7DQorCQl9DQorCX0NCit9DQorDQorDQorLyoqDQorICogR0VUVEVSDQorICogbWFjaGluZQ0KKyAqIG9iamVjdA0KKyAqLw0KK0V4ZWN1dGFibGVGb3JtICogVHJhY2VQb2ludDo6Z2V0RXhlY3V0YWJsZSgpIGNvbnN0DQorew0KKwlpZiggb2JqZWN0ICE9IE5VTEwgKQ0KKwl7DQorCQlpZiggb2JqZWN0LT5pczwgSW5zdGFuY2VPZk1hY2hpbmUgPigpICkNCisJCXsNCisJCQlyZXR1cm4oIG9iamVjdC0+dG88IEluc3RhbmNlT2ZNYWNoaW5lID4oKS0+Z2V0RXhlY3V0YWJsZSgpICk7DQorCQl9DQorDQorCQllbHNlIGlmKCBvYmplY3QtPmlzPCBCYXNlQXZtUHJvZ3JhbSA+KCkgKQ0KKwkJew0KKwkJCXJldHVybiggb2JqZWN0LT50bzwgQmFzZUF2bVByb2dyYW0gPigpLT5nZXRFeGVjdXRhYmxlKCkgKTsNCisJCX0NCisNCisJCWVsc2UgaWYoIG1hY2hpbmUgIT0gTlVMTCApDQorCQl7DQorCQkJcmV0dXJuKCBtYWNoaW5lLT5nZXRFeGVjdXRhYmxlKCkgKTsNCisJCX0NCisJCWVsc2UgaWYoIG9iamVjdC0+aXM8IEJhc2VJbnN0YW5jZUZvcm0gPigpICkNCisJCXsNCisJCQlyZXR1cm4oIG9iamVjdC0+dG88IEJhc2VJbnN0YW5jZUZvcm0gPigpLT4NCisJCQkJCWdldENvbnRhaW5lcigpLT5nZXRFeGVjdXRhYmxlKCkgKTsNCisJCX0NCisJfQ0KKw0KKwllbHNlIGlmKCBtYWNoaW5lICE9IE5VTEwgKQ0KKwl7DQorCQlyZXR1cm4oIG1hY2hpbmUtPmdldEV4ZWN1dGFibGUoKSApOw0KKwl9DQorDQorCXJldHVybiggTlVMTCApOw0KK30NCisNCisNCisvKioNCisgKiBHRVRURVIgLyBTRVRURVINCisgKiB2YWx1ZQ0KKyAqIHZlY3RvciBvZiB2YWx1ZQ0KKyAqLw0KK3ZvaWQgVHJhY2VQb2ludDo6bmV3QXJyYXlWYWx1ZShhdm1fc2l6ZV90IGFTaXplKQ0KK3sNCisJdmFsdWUgPSBuZXcgQXJyYXlCRihUeXBlTWFuYWdlcjo6VU5JVkVSU0FMLCBhU2l6ZSk7DQorfQ0KKw0KKw0KK2NvbnN0IEJGICYgVHJhY2VQb2ludDo6dmFsKGF2bV9zaXplX3Qgb2Zmc2V0KSBjb25zdA0KK3sNCisJaWYoIHZhbHVlLmludmFsaWQoKSApDQorCXsNCisJCXJldHVybiggQkY6OlJFRl9OVUxMICk7DQorCX0NCisJZWxzZSBpZiggdmFsdWUuaXM8IEFycmF5QkYgPigpICkNCisJew0KKwkJaWYoIG9mZnNldCA8IHZhbHVlLnRvX3B0cjwgQXJyYXlCRiA+KCktPnNpemUoKSApDQorCQl7DQorCQkJcmV0dXJuKCB2YWx1ZS50b19wdHI8IEFycmF5QkYgPigpLT5hdCggb2Zmc2V0ICkgKTsNCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVA0KKwkJCQkJPDwgIk91dCBvZiByYW5nZSAoIG9mZnNldDoiIDw8IG9mZnNldA0KKwkJCQkJPDwgIiA+PSBzaXplOiIgPDwgdmFsdWUudG9fcHRyPCBBcnJheUJGID4oKS0+c2l6ZSgpDQorCQkJCQk8PCAiICkgaW4gcmVhZC1hY2Nlc3Mgb24gYXJyYXkgdmFsdWUgb2YgVHJhY2VQb2ludCAhISEiDQorCQkJCQk8PCBzdGQ6OmVuZGwNCisJCQkJCTw8IHRvX3N0cmVhbSggdGhpcyApDQorCQkJCQk8PCBTRU5EX0VYSVQ7DQorDQorCQkJcmV0dXJuKCB2YWx1ZSApOw0KKwkJfQ0KKwl9DQorCWVsc2UgaWYob2Zmc2V0ID09IDApDQorCXsNCisJCXJldHVybiggdmFsdWUgKTsNCisJfQ0KKwllbHNlDQorCXsNCisJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUDQorCQkJCTw8ICJUcnlpbmcgdG8gYWNjZXNzIHZhbHVlIGluICINCisJCQkJCSJub24tZXhpc3RpbmcgYXJyYXkgVHJhY2VQb2ludCB2YWx1ZSAhISEiDQorCQkJCTw8IFNFTkRfRVhJVDsNCisNCisJCXJldHVybiggdmFsdWUgKTsNCisJfQ0KK30NCisNCisNCit2b2lkIFRyYWNlUG9pbnQ6OnZhbChhdm1fc2l6ZV90IG9mZnNldCwgY29uc3QgQkYgJiBhcmcpDQorew0KKwlpZiggdmFsdWUuaW52YWxpZCgpICkNCisJew0KKwkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQgPDwgImludmFsaWQgdmFsdWUgISEhIiA8PCBTRU5EX0VYSVQ7DQorCX0NCisJZWxzZSBpZiggdmFsdWUuaXM8IEFycmF5QkYgPigpICkNCisJew0KKwkJaWYoIG9mZnNldCA8IHZhbHVlLnRvX3B0cjwgQXJyYXlCRiA+KCktPnNpemUoKSApDQorCQl7DQorCQkJdmFsdWUudG9fcHRyPCBBcnJheUJGID4oKS0+c2V0KCBvZmZzZXQsIGFyZyApOw0KKwkJfQ0KKwkJZWxzZQ0KKwkJew0KKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUDQorCQkJCQk8PCAiT3V0IG9mIHJhbmdlICggb2Zmc2V0OiIgPDwgb2Zmc2V0DQorCQkJCQk8PCAiID49IHNpemU6IiA8PCB2YWx1ZS50b19wdHI8IEFycmF5QkYgPigpLT5zaXplKCkNCisJCQkJCTw8ICIgKSBpbiB3cml0ZS1hY2Nlc3Mgb24gYXJyYXkgdmFsdWUgb2YgVHJhY2VQb2ludCAhISEiDQorCQkJCQk8PCBzdGQ6OmVuZGwNCisJCQkJCTw8IHRvX3N0cmVhbSggdGhpcyApDQorCQkJCQk8PCBTRU5EX0VYSVQ7DQorCQl9DQorCX0NCisJZWxzZSBpZiggb2Zmc2V0ID09IDAgKQ0KKwl7DQorCQl2YWx1ZSA9IGFyZzsNCisJfQ0KKwllbHNlDQorCXsNCisJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUDQorCQkJCTw8ICJUcmFjZVBvaW50Ojp2YWw6PiBVbmV4cGVjdGVkIGNhc2UgISEhIg0KKwkJCQk8PCBTRU5EX0VYSVQ7DQorCX0NCit9DQorDQorDQorYXZtX3NpemVfdCBUcmFjZVBvaW50Ojp2YWxDb3VudCgpIGNvbnN0DQorew0KKwlpZiggdmFsdWUuaW52YWxpZCgpICkNCisJew0KKy8vCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVCA8PCAiaW52YWxpZCB2YWx1ZSAhISEiIDw8IFNFTkRfRVhJVDsNCisJCXJldHVybiggMCApOw0KKwl9DQorCWVsc2UgaWYoIHZhbHVlLmlzPCBBcnJheUJGID4oKSApDQorCXsNCisJCXJldHVybiggdmFsdWUudG9fcHRyPCBBcnJheUJGID4oKS0+c2l6ZSgpICk7DQorCX0NCisJZWxzZQ0KKwl7DQorCQlyZXR1cm4oIDEgKTsNCisJfQ0KK30NCisNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIFNFUklBTElaQVRJT04gQVBJDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisNCitzdGQ6OnN0cmluZyBUcmFjZVBvaW50OjpzdHJVSUQoKSBjb25zdA0KK3sNCisJaWYoIG1hY2hpbmUgIT0gTlVMTCApDQorCXsNCisJCWlmKCBvYmplY3QgIT0gTlVMTCApDQorCQl7DQorCQkJcmV0dXJuKCBPU1MoKSA8PCAidHBpZCMiIDw8IHRwaWQgPDwgIi0+Ig0KKwkJCQkJPDwgbWFjaGluZS0+Z2V0UXVhbGlmaWVkTmFtZUlEKCkgPDwgIi0+Ig0KKwkJCQkJPDwgb2JqZWN0LT5nZXROYW1lSUQoKSApOw0KKwkJfQ0KKwl9DQorDQorCWlmKCBvYmplY3QgIT0gTlVMTCApDQorCXsNCisJCXJldHVybiggT1NTKCkgPDwgInRwaWQjIiA8PCB0cGlkIDw8ICItPiINCisJCQkJPDwgb2JqZWN0LT5nZXRRdWFsaWZpZWROYW1lSUQoKSApOw0KKwl9DQorCWVsc2UNCisJew0KKwkJcmV0dXJuKCBPU1MoKSA8PCAidHBpZCMiIDw8IHRwaWQgKTsNCisJfQ0KK30NCisNCisNCit2b2lkIFRyYWNlUG9pbnQ6OmZvcm1hdFZhbHVlU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdA0KK3sNCisJaWYoIHZhbHVlLmludmFsaWQoKSApDQorCXsNCisvLwkJdmFsdWUudG9TdHJlYW0oIG9zICk7DQorLy8JCW9zIDw8ICJUcmFjZVBvaW50Ojp2YWx1ZTxudWxsPiI7DQorCX0NCisJZWxzZSBpZiggb2JqZWN0LT5pczwgSW5zdGFuY2VPZkRhdGEgPigpICkNCisJew0KKwkJb2JqZWN0LT50bzwgSW5zdGFuY2VPZkRhdGEgPigpLT5mb3JtYXRTdHJlYW0ob3MsIHZhbHVlKTsNCisJfQ0KKwllbHNlIGlmKCBvYmplY3QtPmlzPCBJbnN0YW5jZU9mUG9ydCA+KCkgKQ0KKwl7DQorCQlvYmplY3QtPnRvPCBJbnN0YW5jZU9mUG9ydCA+KCktPmZvcm1hdFN0cmVhbShvcywgdmFsdWUpOw0KKwl9DQorDQorCW9zIDw8IHN0ZDo6Zmx1c2g7DQorfQ0KKw0KKw0KK3ZvaWQgVHJhY2VQb2ludDo6dG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0DQorew0KKwlvcyA8PCBUQUI7DQorDQorCWlmKCBSSUQudmFsaWQoKSApDQorCXsNCisJCW9zIDw8ICIoKykiOw0KKwl9DQorDQorCWlmKCB0cGlkID4gMCApDQorCXsNCisJCW9zIDw8IHN0cklEKCkgPDwgIiAiOw0KKwl9DQorDQorCW9zIDw8IEVOVU1fVFJBQ0VfUE9JTlQ6OnRvX3N0cmluZyhuYXR1cmUpOw0KKwlzd2l0Y2goIG5hdHVyZSApDQorCXsNCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfQ09NUE9TSVRFX05BVFVSRToNCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfQ09NX05BVFVSRToNCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfQ0hBTk5FTF9OQVRVUkU6DQorCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX01FU1NBR0VfTkFUVVJFOg0KKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9QT1JUX05BVFVSRToNCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfU0lHTkFMX05BVFVSRToNCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfVElNRV9OQVRVUkU6DQorCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1ZBUklBQkxFX05BVFVSRToNCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfQlVGRkVSX05BVFVSRToNCisNCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfRk9STVVMQV9OQVRVUkU6DQorCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX0NPTkRJVElPTl9OQVRVUkU6DQorCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX0RFQ0lTSU9OX05BVFVSRToNCisNCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfUEFUSF9DT05ESVRJT05fTkFUVVJFOg0KKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9QQVRIX0NPTkRJVElPTl9OQVRVUkVfTEVBRjoNCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfUEFUSF9USU1FRF9DT05ESVRJT05fTkFUVVJFOg0KKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9QQVRIX1RJTUVEX0NPTkRJVElPTl9OQVRVUkVfTEVBRjoNCisNCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTk9ERV9DT05ESVRJT05fTkFUVVJFOg0KKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9OT0RFX0NPTkRJVElPTl9OQVRVUkVfTEVBRjoNCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTk9ERV9USU1FRF9DT05ESVRJT05fTkFUVVJFOg0KKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9OT0RFX1RJTUVEX0NPTkRJVElPTl9OQVRVUkVfTEVBRjoNCisNCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfU1RBVEVfTkFUVVJFOg0KKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9TVEFURU1BQ0hJTkVfTkFUVVJFOg0KKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9NQUNISU5FX05BVFVSRToNCisJCXsNCisJCQlvcyA8PCAiOiIgPDwgdG9fc3RyaW5nKG9wKSA8PCAiICI7DQorCQkJYnJlYWs7DQorCQl9DQorDQorCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1RSQU5TSVRJT05fTkFUVVJFOg0KKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9ST1VUSU5FX05BVFVSRToNCisNCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfUlVOTkFCTEVfTkFUVVJFOg0KKw0KKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9TVEVQX0hFQURFUl9OQVRVUkU6DQorCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1NURVBfQkVHSU5fTkFUVVJFOg0KKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9TVEVQX0VORF9OQVRVUkU6DQorDQorCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX0lOSVRfSEVBREVSX05BVFVSRToNCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfSU5JVF9CRUdJTl9OQVRVUkU6DQorCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX0lOSVRfRU5EX05BVFVSRToNCisNCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfQ09NTUVOVF9OQVRVUkU6DQorCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1NFUEFSQVRPUl9OQVRVUkU6DQorCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX05FV0xJTkVfTkFUVVJFOg0KKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9VTkRFRklORURfTkFUVVJFOg0KKwkJZGVmYXVsdDoNCisJCXsNCisJCQlvcyA8PCAiICI7DQorCQkJYnJlYWs7DQorCQl9DQorCX0NCisNCisJaWYoIG1hY2hpbmUgIT0gTlVMTCApDQorCXsNCisJCWlmKCBtYWNoaW5lLT5nZXRTcGVjaWZpZXIoKS5pc0Rlc2lnbk1vZGVsKCkgKQ0KKwkJew0KKwkJCW9zIDw8ICI8bW9kZWw+IiA8PCBtYWNoaW5lLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOw0KKwkJfQ0KKwkJZWxzZSBpZihSSUQudmFsaWQoKSAgKQ0KKwkJew0KKwkJCW9zIDw8IFJJRC5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOw0KKwkJfQ0KKwkJZWxzZQ0KKwkJew0KKwkJCW9zIDw8IG1hY2hpbmUtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7DQorCQl9DQorDQorCQlpZiggKG9iamVjdCAhPSBOVUxMKSAmJiAob2JqZWN0ICE9IG1hY2hpbmUpICkNCisJCXsNCisJCQlvcyA8PCAiLT4iIDw8IG9iamVjdC0+Z2V0TmFtZUlEKCk7DQorCQl9DQorCQllbHNlIGlmKCBhbnlfb2JqZWN0ICkNCisJCXsNCisJCQlvcyA8PCAiLT5bKl0iOw0KKwkJfQ0KKwl9DQorCWVsc2UgaWYoIG9iamVjdCAhPSBOVUxMICkNCisJew0KKwkJb3MgPDwgb2JqZWN0LT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOw0KKwl9DQorCWVsc2UgaWYoIGFueV9vYmplY3QgKQ0KKwl7DQorCQlvcyA8PCAiWypdIjsNCisJfQ0KKw0KKwlpZiggdmFsdWUuaXM8IEFycmF5QkYgPigpICkNCisJew0KKwkJaWYoIG5hdHVyZSAhPSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9DT01QT1NJVEVfTkFUVVJFICkNCisJCXsNCisJCQlvcyA8PCB2YWx1ZS5zdHIoKTsNCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQlvcyA8PCAieyIgPDwgRU9MX0lOQ1JfSU5ERU5UOw0KKw0KKwkJCUFycmF5QkYgKiB2YWxBcnJheSA9IHZhbHVlLnRvX3B0cjwgQXJyYXlCRiA+KCk7DQorCQkJYXZtX3NpemVfdCBlbmRPZmZzZXQgPSB2YWxBcnJheS0+c2l6ZSgpOw0KKwkJCWZvciggYXZtX3NpemVfdCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgZW5kT2Zmc2V0IDsgKytvZmZzZXQgKQ0KKwkJCXsNCisJCQkJdmFsQXJyYXktPmF0KG9mZnNldCkudG9TdHJlYW0ob3MpOw0KKwkJCX0NCisNCisJCQlvcyA8PCBERUNSX0lOREVOVF9UQUIgPDwgIn0iOw0KKwkJfQ0KKwl9DQorCWVsc2UgaWYoIHZhbHVlLnZhbGlkKCkgKQ0KKwl7DQorCQlvcyA8PCAiWyAiIDw8IHZhbHVlLnN0cigpIDw8ICIgXSI7DQorCX0NCisNCisNCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBR19BTkQoIE1FRElVTSAsIENPTVBVVElORyAsIEVDLmlzbm90TnVsbCgpICkNCisJb3MgPDwgRU9MX1RBQjsNCisJRUMudHJhY2VNaW5pbXVtKG9zKTsNCitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBR19BTkQoIE1FRElVTSAsIENPTVBVVElORyApDQorDQorCW9zIDw8IEVPTF9GTFVTSDsNCit9DQorDQorDQordm9pZCBUcmFjZVBvaW50Ojp0cmFjZU1pbmltdW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0DQorew0KKwlvcyA8PCBUQUI7DQorDQorCWlmKCBSSUQudmFsaWQoKSApDQorCXsNCisJCW9zIDw8ICIoKykiOw0KKwl9DQorDQorCWlmKCB0cGlkID4gMCApDQorCXsNCisJCW9zIDw8IHN0cklEKCkgPDwgIiAiOw0KKwl9DQorDQorCXN3aXRjaCggbmF0dXJlICkNCisJew0KKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9DT01QT1NJVEVfTkFUVVJFOg0KKwkJew0KKwkJCW9zIDw8IHRvX3N0cmluZyhvcCkgPDwgIiAiOw0KKwkJCWJyZWFrOw0KKwkJfQ0KKw0KKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9DT01fTkFUVVJFOg0KKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9DSEFOTkVMX05BVFVSRToNCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTUVTU0FHRV9OQVRVUkU6DQorCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1BPUlRfTkFUVVJFOg0KKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9TSUdOQUxfTkFUVVJFOg0KKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9USU1FX05BVFVSRToNCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfQlVGRkVSX05BVFVSRToNCisNCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfRk9STVVMQV9OQVRVUkU6DQorCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX0NPTkRJVElPTl9OQVRVUkU6DQorCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX0RFQ0lTSU9OX05BVFVSRToNCisNCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfUEFUSF9DT05ESVRJT05fTkFUVVJFOg0KKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9QQVRIX0NPTkRJVElPTl9OQVRVUkVfTEVBRjoNCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfUEFUSF9USU1FRF9DT05ESVRJT05fTkFUVVJFOg0KKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9QQVRIX1RJTUVEX0NPTkRJVElPTl9OQVRVUkVfTEVBRjoNCisNCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTk9ERV9DT05ESVRJT05fTkFUVVJFOg0KKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9OT0RFX0NPTkRJVElPTl9OQVRVUkVfTEVBRjoNCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTk9ERV9USU1FRF9DT05ESVRJT05fTkFUVVJFOg0KKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9OT0RFX1RJTUVEX0NPTkRJVElPTl9OQVRVUkVfTEVBRjoNCisNCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfU1RBVEVfTkFUVVJFOg0KKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9TVEFURU1BQ0hJTkVfTkFUVVJFOg0KKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9NQUNISU5FX05BVFVSRToNCisJCXsNCisJCQlvcyA8PCBFTlVNX1RSQUNFX1BPSU5UOjp0b19zdHJpbmcobmF0dXJlKQ0KKwkJCQkJPDwgIjoiIDw8IHRvX3N0cmluZyhvcCkgPDwgIiAiOw0KKwkJCWJyZWFrOw0KKwkJfQ0KKw0KKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9WQVJJQUJMRV9OQVRVUkU6DQorCQl7DQorCQkJb3MgPDwgInZhcjwiIDw8IHRvX3N0cmluZyhvcCkgPDwgIj4gIjsNCisJCQlicmVhazsNCisJCX0NCisNCisNCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfVFJBTlNJVElPTl9OQVRVUkU6DQorCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1JPVVRJTkVfTkFUVVJFOg0KKw0KKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9SVU5OQUJMRV9OQVRVUkU6DQorDQorCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1NURVBfSEVBREVSX05BVFVSRToNCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfU1RFUF9CRUdJTl9OQVRVUkU6DQorCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1NURVBfRU5EX05BVFVSRToNCisNCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfSU5JVF9IRUFERVJfTkFUVVJFOg0KKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9JTklUX0JFR0lOX05BVFVSRToNCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfSU5JVF9FTkRfTkFUVVJFOg0KKw0KKwkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9DT01NRU5UX05BVFVSRToNCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfU0VQQVJBVE9SX05BVFVSRToNCisJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTkVXTElORV9OQVRVUkU6DQorCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1VOREVGSU5FRF9OQVRVUkU6DQorCQlkZWZhdWx0Og0KKwkJew0KKwkJCWJyZWFrOw0KKwkJfQ0KKwl9DQorDQorCWlmKCBtYWNoaW5lICE9IE5VTEwgKQ0KKwl7DQorCQlpZiggbWFjaGluZS0+Z2V0U3BlY2lmaWVyKCkuaXNEZXNpZ25Nb2RlbCgpICkNCisJCXsNCisJCQlvcyA8PCAiPG1vZGVsPiIgPDwgbWFjaGluZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsNCisJCX0NCisJCWVsc2UgaWYoIFJJRC52YWxpZCgpICkNCisJCXsNCisJCQlvcyA8PCBSSUQuZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsNCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQlvcyA8PCBtYWNoaW5lLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOw0KKwkJfQ0KKw0KKwkJaWYoIChvYmplY3QgIT0gTlVMTCkgJiYgKG9iamVjdCAhPSBtYWNoaW5lKSApDQorCQl7DQorCQkJb3MgPDwgIi0+IiA8PCBvYmplY3QtPmdldE5hbWVJRCgpOw0KKwkJfQ0KKwkJZWxzZSBpZiggYW55X29iamVjdCApDQorCQl7DQorCQkJb3MgPDwgIi0+WypdIjsNCisJCX0NCisJfQ0KKwllbHNlIGlmKCBvYmplY3QgIT0gTlVMTCApDQorCXsNCisJCW9zIDw8IG9iamVjdC0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsNCisJfQ0KKwllbHNlIGlmKCBhbnlfb2JqZWN0ICkNCisJew0KKwkJb3MgPDwgIlsqXSI7DQorCX0NCisNCisNCisJaWYoIGlzQ29tKCkgJiYgdmFsdWUuaXM8IEFycmF5QkYgPigpICkNCisJew0KKwkJb3MgPDwgdmFsdWUuc3RyKCk7DQorCX0NCisJZWxzZSBpZiggdmFsdWUuaXM8IEFycmF5QkYgPigpICkNCisJew0KKwkJb3MgPDwgInsiOw0KKwkJaWYoIG5hdHVyZSA9PSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9DT01QT1NJVEVfTkFUVVJFICkNCisJCXsNCisJCQlvcyA8PCBBVk1fU1RSX0lOREVOVDsNCisJCX0NCisNCisJCUFycmF5QkYgKiB2YWxBcnJheSA9IHZhbHVlLnRvX3B0cjwgQXJyYXlCRiA+KCk7DQorCQlhdm1fc2l6ZV90IGVuZE9mZnNldCA9IHZhbEFycmF5LT5zaXplKCk7DQorCQlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMCA7IG9mZnNldCA8IGVuZE9mZnNldCA7ICsrb2Zmc2V0ICkNCisJCXsNCisJCQlpZiggdmFsQXJyYXktPmF0KG9mZnNldCkuaXM8IFRyYWNlUG9pbnQgPigpICkNCisJCQl7DQorCQkJCXZhbEFycmF5LT5hdChvZmZzZXQpLnRvX3B0cjwgVHJhY2VQb2ludCA+KCktPnRyYWNlTWluaW11bShvcyk7DQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCW9zIDw8ICIgIiA8PCB2YWxBcnJheS0+YXQob2Zmc2V0KS5zdHIoKTsNCisJCQl9DQorCQl9DQorDQorCQlpZiggbmF0dXJlID09IEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX0NPTVBPU0lURV9OQVRVUkUgKQ0KKwkJew0KKwkJCW9zIDw8IEVORF9JTkRFTlQ7DQorCQl9DQorCQlvcyA8PCAiIH0iOw0KKwl9DQorCWVsc2UgaWYoIHZhbHVlLnZhbGlkKCkgKQ0KKwl7DQorCQlvcyA8PCAiWyAiIDw8IHZhbHVlLnN0cigpIDw8ICIgXSI7DQorCX0NCisNCisNCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBR19BTkQoIE1FRElVTSAsIENPTVBVVElORyAsIEVDLmlzbm90TnVsbCgpICkNCisJb3MgPDwgRU9MX1RBQjsNCisJRUMudHJhY2VNaW5pbXVtKG9zKTsNCitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBR19BTkQoIE1FRElVTSAsIENPTVBVVElORyApDQorDQorCW9zIDw8IEVPTF9GTFVTSDsNCit9DQorDQorDQorfSAvKiBuYW1lc3BhY2Ugc2VwICovDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3RyYWNlL1RyYWNlUG9pbnQuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90cmFjZS9UcmFjZVBvaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY3NTczYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90cmFjZS9UcmFjZVBvaW50LmgKQEAgLTAsMCArMSw1NTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxMSBkw6ljLiAyMDEzCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgVFJBQ0VQT0lOVF9IXworI2RlZmluZSBUUkFDRVBPSU5UX0hfCisKKworI2luY2x1ZGUgPGNvbW1vbi9Bdm1Qb2ludGVyLmg+CisjaW5jbHVkZSA8Y29tbW9uL0VsZW1lbnQuaD4KKyNpbmNsdWRlIDxjb21tb24vQkYuaD4KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vTGlzdC5oPgorCisjaW5jbHVkZSA8Zm1sL2NvbW1vbi9TcGVjaWZpZXJFbGVtZW50Lmg+CisKKyNpbmNsdWRlIDxmbWwvbGliL0lUcmFjZVBvaW50Lmg+CisKKyNpbmNsdWRlIDxmbWwvb3BlcmF0b3IvT3BlcmF0b3JMaWIuaD4KKworI2luY2x1ZGUgPGZtbC9zeW1ib2wvU3ltYm9sLmg+CisKKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lSUQuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKK2NsYXNzIENvbmZpZ3VyYXRpb247CisKK2NsYXNzIEV4ZWN1dGFibGVGb3JtOworY2xhc3MgRXhlY3V0aW9uQ29udGV4dDsKK2NsYXNzIEFQRXhlY3V0aW9uRGF0YTsKK2NsYXNzIEV4ZWN1dGlvbkRhdGE7CitjbGFzcyBFeGVjdXRpb25Db25maWd1cmF0aW9uOworCitjbGFzcyBJbnN0YW5jZU9mTWFjaGluZTsKKworY2xhc3MgT2JqZWN0RWxlbWVudDsKKworY2xhc3MgVHJhY2VGb3JtYXR0ZXI7CitjbGFzcyBUcmFjZVBvaW50OworCisKKy8qKgorICogVFlQRURFRgorICovCit0eXBlZGVmIExpc3Q8IFRyYWNlUG9pbnQgKiA+ICBMaXN0T2ZUcmFjZVBvaW50OworCisKK2NsYXNzIFRyYWNlUG9pbnQgOgorCQlwdWJsaWMgRWxlbWVudCAsCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggVHJhY2VQb2ludCApCit7CisKKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggVHJhY2VQb2ludCApCisKKworcHVibGljOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlhdm1fc2l6ZV90IHRwaWQ7CisKKwljb25zdCBFeGVjdXRpb25Db250ZXh0ICYgRUM7CisKKwlFeGVjdXRpb25Db25maWd1cmF0aW9uICogY29uZmlnOworCisJRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTkFUVVJFIG5hdHVyZTsKKworCUFWTV9PUENPREUgb3A7CisKKworCVJ1bnRpbWVJRCBSSUQ7CisKKwlJbnN0YW5jZU9mTWFjaGluZSAqIG1hY2hpbmU7CisKKwlPYmplY3RFbGVtZW50ICAgICAqIG9iamVjdDsKKwlib29sIGFueV9vYmplY3Q7CisKKwlCRiB2YWx1ZTsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJVHJhY2VQb2ludChFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9OQVRVUkUgYU5hdHVyZSwKKwkJCUFWTV9PUENPREUgYW5PUCA9IEFWTV9PUENPREVfTlVMTCwKKwkJCWNvbnN0IEJGICYgYVZhbHVlID0gQkY6OlJFRl9OVUxMKTsKKworCVRyYWNlUG9pbnQoRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTkFUVVJFIGFOYXR1cmUsIEFWTV9PUENPREUgYW5PUCwKKwkJCUluc3RhbmNlT2ZNYWNoaW5lICogYU1hY2hpbmUsIE9iamVjdEVsZW1lbnQgKiBhbk9iamVjdCwKKwkJCWNvbnN0IEJGICYgYVZhbHVlID0gQkY6OlJFRl9OVUxMKTsKKworCisJVHJhY2VQb2ludChjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQywKKwkJCUVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX05BVFVSRSBhTmF0dXJlLAorCQkJQVZNX09QQ09ERSBhbk9QLCBJbnN0YW5jZU9mTWFjaGluZSAqIGFNYWNoaW5lLAorCQkJT2JqZWN0RWxlbWVudCAqIGFuT2JqZWN0LCBjb25zdCBCRiAmIGFWYWx1ZSA9IEJGOjpSRUZfTlVMTCkKKwk6IEVsZW1lbnQoIENMQVNTX0tJTkRfVCggVHJhY2VQb2ludCApICksCisJdHBpZCggMCApLAorCisJRUMoIGFuRUMgKSwKKwljb25maWcoIE5VTEwgKSwKKworCW5hdHVyZSggYU5hdHVyZSApLAorCW9wKCBhbk9QICksCisKKwlSSUQoICksCisKKwltYWNoaW5lKCBhTWFjaGluZSApLAorCisJb2JqZWN0KCBhbk9iamVjdCApLAorCWFueV9vYmplY3QoIGZhbHNlICksCisKKwl2YWx1ZSggYVZhbHVlICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJVHJhY2VQb2ludChFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9OQVRVUkUgYU5hdHVyZSwgQVZNX09QQ09ERSBhbk9QLAorCQkJY29uc3QgUnVudGltZUlEICYgYVJJRCwgT2JqZWN0RWxlbWVudCAqIGFuT2JqZWN0LAorCQkJY29uc3QgQkYgJiBhVmFsdWUgPSBCRjo6UkVGX05VTEwpOworCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJVHJhY2VQb2ludChjb25zdCBUcmFjZVBvaW50ICYgYVRyYWNlUG9pbnQpCisJOiBFbGVtZW50KCBhVHJhY2VQb2ludCApLAorCXRwaWQoIGFUcmFjZVBvaW50LnRwaWQgKSwKKworCUVDKCBhVHJhY2VQb2ludC5FQyApLAorCWNvbmZpZyggYVRyYWNlUG9pbnQuY29uZmlnICksCisKKwluYXR1cmUoIGFUcmFjZVBvaW50Lm5hdHVyZSApLAorCW9wKCBhVHJhY2VQb2ludC5vcCApLAorCisJUklEKCBhVHJhY2VQb2ludC5SSUQgKSwKKworCW1hY2hpbmUoIGFUcmFjZVBvaW50Lm1hY2hpbmUgKSwKKworCW9iamVjdCggYVRyYWNlUG9pbnQub2JqZWN0ICksCisJYW55X29iamVjdCggYVRyYWNlUG9pbnQuYW55X29iamVjdCApLAorCisJdmFsdWUoIGFUcmFjZVBvaW50LnZhbHVlICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBPdGhlcgorCSAqLworCVRyYWNlUG9pbnQoY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMsCisJCQlFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9OQVRVUkUgYU5hdHVyZSwKKwkJCUFWTV9PUENPREUgYW5PUCA9IEFWTV9PUENPREVfTlVMTCwKKwkJCWNvbnN0IEJGICYgYVZhbHVlID0gQkY6OlJFRl9OVUxMKQorCTogRWxlbWVudCggQ0xBU1NfS0lORF9UKCBUcmFjZVBvaW50ICkgKSwKKwl0cGlkKCAwICksCisKKwlFQyggYW5FQyApLAorCWNvbmZpZyggTlVMTCApLAorCisJbmF0dXJlKCBhTmF0dXJlICksCisJb3AoIGFuT1AgKSwKKworCVJJRCggKSwKKworCW1hY2hpbmUoIE5VTEwgKSwKKworCW9iamVjdCAoIE5VTEwgKSwKKwlhbnlfb2JqZWN0KCBmYWxzZSApLAorCisJdmFsdWUoIGFWYWx1ZSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCVRyYWNlUG9pbnQoY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMsIEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24gKiBhQ29uZmlnLAorCQkJRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTkFUVVJFIGFOYXR1cmUsCisJCQlBVk1fT1BDT0RFIGFuT1AsIGNvbnN0IFJ1bnRpbWVJRCAmIGFSSUQsCisJCQlPYmplY3RFbGVtZW50ICogYW5PYmplY3QsIGNvbnN0IEJGICYgYVZhbHVlID0gQkY6OlJFRl9OVUxMKQorCTogRWxlbWVudCggQ0xBU1NfS0lORF9UKCBUcmFjZVBvaW50ICkgKSwKKwl0cGlkKCAwICksCisKKwlFQyggYW5FQyApLAorCWNvbmZpZyggYUNvbmZpZyApLAorCisJbmF0dXJlKCBhTmF0dXJlICksCisJb3AoIGFuT1AgKSwKKworCVJJRCggYVJJRCApLAorCisJbWFjaGluZSggYVJJRC5nZXRJbnN0YW5jZSgpICksCisKKwlvYmplY3QoIGFuT2JqZWN0ICksCisJYW55X29iamVjdCggZmFsc2UgKSwKKworCXZhbHVlKCBhVmFsdWUgKQorCXsKKwkJdXBkYXRlTmF0dXJlT3Bjb2RlUklEKCk7CisJfQorCisJVHJhY2VQb2ludChjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQywgRXhlY3V0aW9uQ29uZmlndXJhdGlvbiAqIGFDb25maWcsCisJCQlFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9OQVRVUkUgYU5hdHVyZSwKKwkJCUFWTV9PUENPREUgYW5PUCwgSW5zdGFuY2VPZk1hY2hpbmUgKiBhTWFjaGluZSwKKwkJCU9iamVjdEVsZW1lbnQgKiBhbk9iamVjdCwgY29uc3QgQkYgJiBhVmFsdWUgPSBCRjo6UkVGX05VTEwpCisJOiBFbGVtZW50KCBDTEFTU19LSU5EX1QoIFRyYWNlUG9pbnQgKSApLAorCXRwaWQoIDAgKSwKKworCUVDKCBhbkVDICksCisJY29uZmlnKCBhQ29uZmlnICksCisKKwluYXR1cmUoIGFOYXR1cmUgKSwKKwlvcCggYW5PUCApLAorCisJUklEKCApLAorCisJbWFjaGluZSggYU1hY2hpbmUgKSwKKworCW9iamVjdCggYW5PYmplY3QgKSwKKwlhbnlfb2JqZWN0KCBmYWxzZSApLAorCisJdmFsdWUoIGFWYWx1ZSApCisJeworCQl1cGRhdGVOYXR1cmVPcGNvZGVSSUQoKTsKKwl9CisKKworCVRyYWNlUG9pbnQoY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMsIEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24gKiBhQ29uZmlnLAorCQkJY29uc3QgUnVudGltZUlEICYgYVJJRCwgT2JqZWN0RWxlbWVudCAqIGFuT2JqZWN0LCBjb25zdCBCRiAmIGFWYWx1ZSkKKwk6IEVsZW1lbnQoIENMQVNTX0tJTkRfVCggVHJhY2VQb2ludCApICksCisJdHBpZCggMCApLAorCisJRUMoIGFuRUMgKSwKKwljb25maWcoIGFDb25maWcgKSwKKworCW5hdHVyZSggRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfVU5ERUZJTkVEX05BVFVSRSApLAorCW9wKCBBVk1fT1BDT0RFX05VTEwgKSwKKworCVJJRCggYVJJRCApLAorCisJbWFjaGluZSggYVJJRC5nZXRJbnN0YW5jZSgpICksCisKKwlvYmplY3QoIGFuT2JqZWN0ICksCisJYW55X29iamVjdCggZmFsc2UgKSwKKworCXZhbHVlKCBhVmFsdWUgKQorCXsKKwkJdXBkYXRlTmF0dXJlT3Bjb2RlUklEKCk7CisJfQorCisJVHJhY2VQb2ludChUcmFjZVBvaW50ICogYVRQKQorCTogRWxlbWVudCggQ0xBU1NfS0lORF9UKCBUcmFjZVBvaW50ICkgKSwKKwl0cGlkKCAwICksCisKKwlFQyggYVRQLT5FQyApLAorCWNvbmZpZyggYVRQLT5jb25maWcgKSwKKworCW5hdHVyZSggYVRQLT5uYXR1cmUgKSwKKwlvcCggYVRQLT5vcCApLAorCisJUklEKCApLAorCisJbWFjaGluZSggYVRQLT5tYWNoaW5lICksCisKKwlvYmplY3QoIGFUUC0+b2JqZWN0ICksCisJYW55X29iamVjdCggZmFsc2UgKSwKKworCXZhbHVlKCBhVFAtPnZhbHVlICkKKwl7CisJCXVwZGF0ZU5hdHVyZU9wY29kZVJJRCgpOworCX0KKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogZm9yIE1ldGEgcG9pbnQKKwkgKiBUUkFDRV9DT01NRU5UX05BVFVSRQorCSAqIFRSQUNFX1NFUEFSQVRPUl9OQVRVUkUKKwkgKiBUUkFDRV9ORVdMSU5FX05BVFVSRQorCSAqIFRSQUNFX1NURVBfTkFUVVJFCisJICovCisJVHJhY2VQb2ludChFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9OQVRVUkUgYU5hdHVyZSwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgc3RyU2VwYXJhdG9yKTsKKworCVRyYWNlUG9pbnQoY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMsCisJCQlFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9OQVRVUkUgYU5hdHVyZSwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgc3RyU2VwYXJhdG9yKTsKKworCisJc3RhdGljIFRyYWNlUG9pbnQgKiBuZXdDb21wb3NpdGUoCisJCQlBVk1fT1BDT0RFIGFuT1AsIGNvbnN0IEJGICYgYVZhbHVlID0gQkY6OlJFRl9OVUxMKQorCXsKKwkJcmV0dXJuKCBuZXcgVHJhY2VQb2ludCgKKwkJCQlFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9DT01QT1NJVEVfTkFUVVJFLCBhbk9QLCBhVmFsdWUpICk7CisJfQorCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgflRyYWNlUG9pbnQoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQ09ORklHVVJFIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXZvaWQgdXBkYXRlUklEKGNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVEKTsKKworCXZvaWQgdXBkYXRlTWFjaGluZSgKKwkJCWNvbnN0IENvbmZpZ3VyYXRpb24gJiBhQ29uZmlndXJhdGlvbiwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCk7CisKKwlib29sIGNvbmZpZ3VyZVBvcnQoCisJCQljb25zdCBDb25maWd1cmF0aW9uICYgYUNvbmZpZ3VyYXRpb24sCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQsCisJCQlMaXN0T2ZUcmFjZVBvaW50ICYgb3RoZXJUcmFjZVBvaW50KTsKKworCXZvaWQgY29uZmlndXJlUG9ydChBVk1fT1BDT0RFIG9wQ29tLCBMaXN0T2ZTeW1ib2wgJiBsaXN0b2ZQb3J0LAorCQkJTGlzdE9mVHJhY2VQb2ludCAmIG90aGVyVHJhY2VQb2ludCk7CisKKwlib29sIGNvbmZpZ3VyZVRyYW5zaXRpb24oCisJCQljb25zdCBDb25maWd1cmF0aW9uICYgYUNvbmZpZ3VyYXRpb24sCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpOworCisJYm9vbCBjb25maWd1cmVSb3V0aW5lKAorCQkJY29uc3QgQ29uZmlndXJhdGlvbiAmIGFDb25maWd1cmF0aW9uLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKTsKKworCWJvb2wgY29uZmlndXJlUnVubmFibGUoCisJCWNvbnN0IENvbmZpZ3VyYXRpb24gJiBhQ29uZmlndXJhdGlvbiwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKTsKKworCWJvb2wgY29uZmlndXJlTWFjaGluZSgKKwkJCWNvbnN0IENvbmZpZ3VyYXRpb24gJiBhQ29uZmlndXJhdGlvbiwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCk7CisKKwlib29sIGNvbmZpZ3VyZVZhcmlhYmxlKAorCQkJY29uc3QgQ29uZmlndXJhdGlvbiAmIGFDb25maWd1cmF0aW9uLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKTsKKworCWJvb2wgY29uZmlndXJlQnVmZmVyKAorCQkJY29uc3QgQ29uZmlndXJhdGlvbiAmIGFDb25maWd1cmF0aW9uLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKTsKKworCisJLyoqCisJICogR0VUVEVSIC8gU0VUVEVSIC8gVEVTVAorCSAqIG5hdHVyZSAvIG9wCisJICovCisJaW5saW5lIGJvb2wgaXNWaXJ0dWFsKCkgY29uc3QKKwl7CisJCXN3aXRjaCggbmF0dXJlICkKKwkJeworCQkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9DT01NRU5UX05BVFVSRToKKwkJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfU0VQQVJBVE9SX05BVFVSRToKKwkJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfTkVXTElORV9OQVRVUkU6CisKKwkJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfU1RFUF9IRUFERVJfTkFUVVJFOgorCQkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9TVEVQX0JFR0lOX05BVFVSRToKKwkJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfU1RFUF9FTkRfTkFUVVJFOgorCisJCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX0lOSVRfSEVBREVSX05BVFVSRToKKwkJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfSU5JVF9CRUdJTl9OQVRVUkU6CisJCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX0lOSVRfRU5EX05BVFVSRToKKwkJCXsKKwkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCX0KKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJfQorCQl9CisJfQorCisJaW5saW5lIGJvb2wgaXNBc3NpZ24oKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobmF0dXJlID09IEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1ZBUklBQkxFX05BVFVSRSkKKwkJCQkmJiAob3AgPT0gQVZNX09QQ09ERV9BU1NJR04pICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNDb20oKSBjb25zdAorCXsKKwkJc3dpdGNoKCBuYXR1cmUgKQorCQl7CisJCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX0NPTV9OQVRVUkU6CisJCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX0NIQU5ORUxfTkFUVVJFOgorCQkJY2FzZSBFTlVNX1RSQUNFX1BPSU5UOjpUUkFDRV9NRVNTQUdFX05BVFVSRToKKwkJCWNhc2UgRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfUE9SVF9OQVRVUkU6CisJCQljYXNlIEVOVU1fVFJBQ0VfUE9JTlQ6OlRSQUNFX1NJR05BTF9OQVRVUkU6CisJCQl7CisJCQkJcmV0dXJuKCB0cnVlICk7CisJCQl9CisJCQlkZWZhdWx0OgorCQkJeworCQkJCXN3aXRjaCggb3AgKQorCQkJCXsKKwkJCQkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUOgorCQkJCQljYXNlIEFWTV9PUENPREVfSU5QVVRfRlJPTToKKwkJCQkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUX0VOVjoKKwkJCQkJY2FzZSBBVk1fT1BDT0RFX0lOUFVUX1JEVjoKKworCQkJCQljYXNlIEFWTV9PUENPREVfT1VUUFVUOgorCQkJCQljYXNlIEFWTV9PUENPREVfT1VUUFVUX1RPOgorCQkJCQljYXNlIEFWTV9PUENPREVfT1VUUFVUX0VOVjoKKwkJCQkJY2FzZSBBVk1fT1BDT0RFX09VVFBVVF9SRFY6CisJCQkJCXsKKwkJCQkJCXJldHVybiggdHJ1ZSApOworCQkJCQl9CisKKwkJCQkJZGVmYXVsdDoKKwkJCQkJeworCQkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaW5saW5lIGJvb2wgaXNDb20oQVZNX09QQ09ERSBvcCwgY29uc3QgUnVudGltZUlEICYgcmlkLAorCQkJT2JqZWN0RWxlbWVudCAqIG9iamVjdCkgY29uc3QKKwl7CisJCWlmKCAoKHRoaXMtPm9wID09IG9wKSB8fCAodGhpcy0+b3AgPT0gQVZNX09QQ09ERV9OVUxMKSkKKwkJCSYmICgodGhpcy0+b2JqZWN0ID09IG9iamVjdCkgfHwgdGhpcy0+YW55X29iamVjdCkgKQorCQl7CisJCQlpZiggdGhpcy0+UklELnZhbGlkKCkgKQorCQkJeworCQkJCXJldHVybiggcmlkLmhhc0FzQW5jZXN0b3IodGhpcy0+bWFjaGluZSkgKTsKKwkJCX0KKwkJCWVsc2UgaWYoIHRoaXMtPm1hY2hpbmUgIT0gTlVMTCApCisJCQl7CisJCQkJcmV0dXJuKCByaWQuaGFzQXNBbmNlc3Rvcih0aGlzLT5tYWNoaW5lKSApOworCQkJfQorCisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKworCWlubGluZSBib29sIGlzVGltZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIChuYXR1cmUgPT0gRU5VTV9UUkFDRV9QT0lOVDo6VFJBQ0VfVElNRV9OQVRVUkUpCisJCQkJfHwgKG9wID09IEFWTV9PUENPREVfVElNRURfR1VBUkQpICk7CisJfQorCisJc3RhdGljIEFWTV9PUENPREUgdG9fa2luZChjb25zdCBzdGQ6OnN0cmluZyAmIGlkKTsKKworCXN0YXRpYyBBVk1fT1BDT0RFIHRvX29wKEFWTV9PUENPREUgb3ApOworCisJc3RhdGljIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyhBVk1fT1BDT0RFIGRpcmVjdGlvbik7CisKKwl2b2lkIHVwZGF0ZU5hdHVyZU9wY29kZVJJRCgpOworCisJLyoqCisJICogR0VUVEVSCisJICogbWFjaGluZQorCSAqIG9iamVjdAorCSAqLworCUV4ZWN1dGFibGVGb3JtICogZ2V0RXhlY3V0YWJsZSgpIGNvbnN0OworCisJLyoqCisJICogR0VUVEVSIC8gU0VUVEVSCisJICogdmFsdWUKKwkgKi8KKwl2b2lkIG5ld0FycmF5VmFsdWUoYXZtX3NpemVfdCBhU2l6ZSk7CisKKwljb25zdCBCRiAmIHZhbChhdm1fc2l6ZV90IG9mZnNldCkgY29uc3Q7CisKKwl2b2lkIHZhbChhdm1fc2l6ZV90IG9mZnNldCwgY29uc3QgQkYgJiBhcmcpOworCisJYXZtX3NpemVfdCB2YWxDb3VudCgpIGNvbnN0OworCisJLyoqCisJICogQ29tcGFyaXNvbgorCSAqLworCWlubGluZSBib29sIGlzRVEoY29uc3QgVHJhY2VQb2ludCAmIG90aGVyVFAsIGJvb2wgd2l0aFZhbHVlID0gdHJ1ZSkKKwl7CisJCXJldHVybiggKHRoaXMgPT0gKCYgb3RoZXJUUCkpCisJCQkJfHwgKCAgIChuYXR1cmUgID09IG90aGVyVFAubmF0dXJlICkKKwkJCQkJJiYgKG9wICAgICAgPT0gb3RoZXJUUC5vcCAgICAgKQorCQkJCQkmJiAobWFjaGluZSA9PSBvdGhlclRQLm1hY2hpbmUpCisJCQkJCSYmIChvYmplY3QgID09IG90aGVyVFAub2JqZWN0ICkKKwkJCQkJJiYgKChub3Qgd2l0aFZhbHVlKQorCQkJCQkJfHwgdmFsdWUuaXNFUShvdGhlclRQLnZhbHVlKSkgKSApOworCX0KKworCWlubGluZSBib29sIGlzTkVRKGNvbnN0IFRyYWNlUG9pbnQgJiBvdGhlclRQKQorCXsKKwkJcmV0dXJuKCAodGhpcyAhPSAoJiBvdGhlclRQKSkKKwkJCQkmJiAoICAgKG5hdHVyZSAgIT0gb3RoZXJUUC5uYXR1cmUgKQorCQkJCQl8fCAob3AgICAgICAhPSBvdGhlclRQLm9wICAgICApCisJCQkJCXx8IChtYWNoaW5lICE9IG90aGVyVFAubWFjaGluZSkKKwkJCQkJfHwgKG9iamVjdCAgIT0gb3RoZXJUUC5vYmplY3QgKQorCQkJCQl8fCB2YWx1ZS5pc05FUSggb3RoZXJUUC52YWx1ZSApICkgKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBTRVJJQUxJWkFUSU9OIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlubGluZSBzdGQ6OnN0cmluZyBzdHJJRCgpIGNvbnN0CisJeworCQlyZXR1cm4oIE9TUygpIDw8ICJ0cGlkIyIgPDwgdHBpZCApOworCX0KKworCXN0ZDo6c3RyaW5nIHN0clVJRCgpIGNvbnN0OworCisKKwlpbmxpbmUgdmlydHVhbCBzdGQ6OnN0cmluZyBzdHIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBzdHJVSUQoKSApOworCX0KKworCXZpcnR1YWwgdm9pZCBmb3JtYXRWYWx1ZVN0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKKwl2aXJ0dWFsIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCisJdmlydHVhbCB2b2lkIHRyYWNlTWluaW11bShPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKK307CisKKworLyoqCisgKiBvcGVyYXRvcjw8CisgKi8KK0FWTV9PU19TVFJFQU0oIFRyYWNlUG9pbnQgKQorCisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKiBUUkFDRVBPSU5UX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvdHJhY2UvVHJhY2VTZXF1ZW5jZS5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvdHJhY2UvVHJhY2VTZXF1ZW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZkZDZlYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90cmFjZS9UcmFjZVNlcXVlbmNlLmNwcApAQCAtMCwwICsxLDM3MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDEzIGTDqWMuIDIwMTMKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlRyYWNlUG9pbnQuaCIKKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkNvbmZpZ3VyYXRpb24uaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25Db250ZXh0Lmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvUnVudGltZUlELmg+CisKKyNpbmNsdWRlIDxmbWwvdHJhY2UvVHJhY2VTZXF1ZW5jZS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworLyoqCisgKiBDb250YWlucyBhbiBPYmplY3QKKyAqIHBvaW50cworICovCitib29sIFRyYWNlU2VxdWVuY2U6OmNvbnRhaW5zT2JqZWN0KEJhc2VDb21waWxlZEZvcm0gICogYW5PYmplY3QpIGNvbnN0Cit7CisJQkZMaXN0Ojpjb25zdF9pdGVyYXRvciBpdFBvaW50ID0gcG9pbnRzLmJlZ2luKCk7CisJQkZMaXN0Ojpjb25zdF9pdGVyYXRvciBlbmRQb2ludCA9IHBvaW50cy5lbmQoKTsKKwlmb3IoIDsgaXRQb2ludCAhPSBlbmRQb2ludCA7ICsraXRQb2ludCApCisJeworCQlpZiggKCppdFBvaW50KS5pczwgVHJhY2VQb2ludCA+KCkgKQorCQl7CisJCQlpZiggKCppdFBvaW50KS50b19wdHI8IFRyYWNlUG9pbnQgPigpLT5vYmplY3QgPT0gYW5PYmplY3QgKQorCQkJeworCQkJCXJldHVybiggdHJ1ZSApOworCQkJfQorCQl9CisJCWVsc2UgaWYoICgqaXRQb2ludCkuaXM8IFRyYWNlU2VxdWVuY2UgPigpICkKKwkJeworCQkJaWYoICgqaXRQb2ludCkudG9fcHRyPCBUcmFjZVNlcXVlbmNlID4oKS0+Y29udGFpbnNPYmplY3QoYW5PYmplY3QpICkKKwkJCXsKKwkJCQlyZXR1cm4oIHRydWUgKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKworCitib29sIFRyYWNlU2VxdWVuY2U6OmNvbnRhaW5zUG9pbnQoVHJhY2VQb2ludCAqIGFQb2ludCwgQkYgJiBmb3VuZFBvaW50KSBjb25zdAoreworCUJGTGlzdDo6Y29uc3RfaXRlcmF0b3IgaXRQb2ludCA9IHBvaW50cy5iZWdpbigpOworCUJGTGlzdDo6Y29uc3RfaXRlcmF0b3IgZW5kUG9pbnQgPSBwb2ludHMuZW5kKCk7CisJZm9yKCA7IGl0UG9pbnQgIT0gZW5kUG9pbnQgOyArK2l0UG9pbnQgKQorCXsKKwkJaWYoICgqaXRQb2ludCkuaXM8IFRyYWNlUG9pbnQgPigpICkKKwkJeworCQkJaWYoICgqaXRQb2ludCkudG9fcHRyPCBUcmFjZVBvaW50ID4oKS0+aXNFUShhUG9pbnQpICkKKwkJCXsKKwkJCQlmb3VuZFBvaW50ID0gKCppdFBvaW50KTsKKworCQkJCXJldHVybiggdHJ1ZSApOworCQkJfQorCQl9CisJCWVsc2UgaWYoICgqaXRQb2ludCkuaXM8IFRyYWNlU2VxdWVuY2UgPigpICkKKwkJeworCQkJaWYoICgqaXRQb2ludCkudG9fcHRyPCBUcmFjZVNlcXVlbmNlID4oKS0+CisJCQkJCWNvbnRhaW5zUG9pbnQoYVBvaW50LCBmb3VuZFBvaW50KSApCisJCQl7CisJCQkJcmV0dXJuKCB0cnVlICk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4oIGZhbHNlICApOworfQorCitib29sIFRyYWNlU2VxdWVuY2U6OmNvbnRhaW5zUG9pbnQoVHJhY2VQb2ludCAqIGFQb2ludCwgYm9vbCB3aXRoVmFsdWUpIGNvbnN0Cit7CisJQkZMaXN0Ojpjb25zdF9pdGVyYXRvciBpdFBvaW50ID0gcG9pbnRzLmJlZ2luKCk7CisJQkZMaXN0Ojpjb25zdF9pdGVyYXRvciBlbmRQb2ludCA9IHBvaW50cy5lbmQoKTsKKwlmb3IoIDsgaXRQb2ludCAhPSBlbmRQb2ludCA7ICsraXRQb2ludCApCisJeworCQlpZiggKCppdFBvaW50KS5pczwgVHJhY2VQb2ludCA+KCkgKQorCQl7CisJCQlpZiggKCppdFBvaW50KS50b19wdHI8IFRyYWNlUG9pbnQgPigpLT5pc0VRKGFQb2ludCwgd2l0aFZhbHVlKSApCisJCQl7CisJCQkJcmV0dXJuKCB0cnVlICk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiggKCppdFBvaW50KS5pczwgVHJhY2VTZXF1ZW5jZSA+KCkgKQorCQl7CisJCQlpZiggKCppdFBvaW50KS50b19wdHI8IFRyYWNlU2VxdWVuY2UgPigpLT4KKwkJCQkJY29udGFpbnNQb2ludChhUG9pbnQsIHdpdGhWYWx1ZSkgKQorCQkJeworCQkJCXJldHVybiggdHJ1ZSApOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuKCBmYWxzZSAgKTsKK30KKworCisvKioKKyAqIENvbXBhcmlzb24KKyAqLworQVZNX09QQ09ERSBUcmFjZVNlcXVlbmNlOjpjb21wYXJlKGNvbnN0IFRyYWNlU2VxdWVuY2UgKiBvdGhlclRyYWNlRWx0KSBjb25zdAoreworCWlmKCAodGhpcyAhPSBvdGhlclRyYWNlRWx0KSAmJiAoY29tYmluYXRvciA9PSBvdGhlclRyYWNlRWx0LT5jb21iaW5hdG9yKSApCisJeworCQlCRkxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gcG9pbnRzLmJlZ2luKCk7CisJCUJGTGlzdDo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBwb2ludHMuZW5kKCk7CisKKwkJQkZMaXN0Ojpjb25zdF9pdGVyYXRvciBvdGhlckl0ID0gb3RoZXJUcmFjZUVsdC0+cG9pbnRzLmJlZ2luKCk7CisJCUJGTGlzdDo6Y29uc3RfaXRlcmF0b3Igb3RoZXJFbmRJdCA9IG90aGVyVHJhY2VFbHQtPnBvaW50cy5lbmQoKTsKKworCQlUcmFjZVBvaW50ICogYVRQID0gTlVMTDsKKwkJVHJhY2VQb2ludCAqIG90aGVyVFAgPSBOVUxMOworCisJCXdoaWxlKCAoaXQgIT0gZW5kSXQpICYmIChvdGhlckl0ICE9IG90aGVyRW5kSXQpICkKKwkJeworCQkJaWYoICgqaXQpLmlzPCBUcmFjZVBvaW50ID4oKSApCisJCQl7CisJCQkJYVRQID0gKCppdCkudG9fcHRyPCBUcmFjZVBvaW50ID4oKTsKKworCQkJCWlmKCBhVFAtPmlzVmlydHVhbCgpICkKKwkJCQl7CisJCQkJCSsraXQ7CisKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWVsc2UgaWYoICgqb3RoZXJJdCkuaXM8IFRyYWNlUG9pbnQgPigpICkKKwkJCQl7CisJCQkJCW90aGVyVFAgPSAoKm90aGVySXQpLnRvX3B0cjwgVHJhY2VQb2ludCA+KCk7CisKKwkJCQkJaWYoIG90aGVyVFAtPmlzVmlydHVhbCgpICkKKwkJCQkJeworCQkJCQkJKytvdGhlckl0OworCisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQllbHNlIGlmKCBhVFAtPmlzTkVRKG90aGVyVFApICkKKwkJCQkJeworCQkJCQkJcmV0dXJuKCBBVk1fT1BDT0RFX05VTEwgKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmKCAoKm90aGVySXQpLmlzPCBUcmFjZVNlcXVlbmNlID4oKSApCisJCQkJeworCQkJCQlyZXR1cm4oIEFWTV9PUENPREVfTlVMTCApOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYoICgqaXQpLmlzPCBUcmFjZVNlcXVlbmNlID4oKSApCisJCQl7CisJCQkJaWYoICgqb3RoZXJJdCkuaXM8IFRyYWNlUG9pbnQgPigpICkKKwkJCQl7CisJCQkJCXJldHVybiggQVZNX09QQ09ERV9OVUxMICk7CisJCQkJfQorCQkJCWVsc2UgaWYoICgqb3RoZXJJdCkuaXM8IFRyYWNlU2VxdWVuY2UgPigpICkKKwkJCQl7CisJCQkJCXN3aXRjaCggKCppdCkudG9fcHRyPCBUcmFjZVNlcXVlbmNlID4oKS0+Y29tcGFyZSgKKwkJCQkJCQkoKm90aGVySXQpLnRvX3B0cjwgVHJhY2VTZXF1ZW5jZSA+KCkgKSApCisJCQkJCXsKKwkJCQkJCWNhc2UgQVZNX09QQ09ERV9FUToKKwkJCQkJCXsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCWNhc2UgQVZNX09QQ09ERV9MVDoKKwkJCQkJCXsKKwkJCQkJCQlpZiggKytpdCA9PSBlbmRJdCApCisJCQkJCQkJeworCQkJCQkJCQlyZXR1cm4oIEFWTV9PUENPREVfTFQgKTsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZQorCQkJCQkJCXsKKwkJCQkJCQkJcmV0dXJuKCBBVk1fT1BDT0RFX05VTEwgKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQljYXNlIEFWTV9PUENPREVfR1Q6CisJCQkJCQl7CisJCQkJCQkJaWYoICsrb3RoZXJJdCA9PSBvdGhlckVuZEl0ICkKKwkJCQkJCQl7CisJCQkJCQkJCXJldHVybiggQVZNX09QQ09ERV9HVCApOworCQkJCQkJCX0KKwkJCQkJCQllbHNlCisJCQkJCQkJeworCQkJCQkJCQlyZXR1cm4oIEFWTV9PUENPREVfTlVMTCApOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWRlZmF1bHQ6CisJCQkJCQl7CisJCQkJCQkJcmV0dXJuKCBBVk1fT1BDT0RFX05VTEwgKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJLy8gSW5jcmVtZW50aW5nCisJCQkrK2l0OyArK290aGVySXQ7CisJCX0KKworCQlpZiggaXQgPT0gZW5kSXQgKQorCQl7CisJCQlpZiggb3RoZXJJdCA9PSBvdGhlckVuZEl0ICkKKwkJCXsKKwkJCQlyZXR1cm4oIEFWTV9PUENPREVfRVEgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4oIEFWTV9PUENPREVfTFQgKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWlmKCBvdGhlckl0ID09IG90aGVyRW5kSXQgKQorCQkJeworCQkJCXJldHVybiggQVZNX09QQ09ERV9HVCApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJldHVybiggQVZNX09QQ09ERV9OVUxMICk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4oICh0aGlzID09IG90aGVyVHJhY2VFbHQpID8gQVZNX09QQ09ERV9FUSA6IEFWTV9PUENPREVfTlVMTCApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBMSUZFTElORSBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2F2bV9zaXplX3QgVHJhY2VTZXF1ZW5jZTo6dG9MaWZlbGluZSgKKwkJVHJhY2VTZXF1ZW5jZSAmIGxpZmVsaW5lVHJhY2UsIGNvbnN0IFJ1bnRpbWVJRCAmIGxpZmVsaW5lUklEKSBjb25zdAoreworCWF2bV9zaXplX3QgbGlmZWxpbmVTaXplID0gMDsKKworCVRyYWNlUG9pbnQgKiBjdXJyZW50VHJhY2VQb2ludCA9IE5VTEw7CisJVHJhY2VQb2ludCAqIGxpZmVsaW5lVGltZVBvaW50ID0gTlVMTDsKKworCUJGIGJmVGltZVBvaW50OworCisJQkZMaXN0Ojpjb25zdF9pdGVyYXRvciBpdFBvaW50ID0gcG9pbnRzLmJlZ2luKCk7CisJQkZMaXN0Ojpjb25zdF9pdGVyYXRvciBlbmRQb2ludCA9IHBvaW50cy5lbmQoKTsKKwlmb3IoIDsgaXRQb2ludCAhPSBlbmRQb2ludCA7ICsraXRQb2ludCApCisJeworCQlpZiggKCppdFBvaW50KS5pczwgVHJhY2VQb2ludCA+KCkgKQorCQl7CisJCQljdXJyZW50VHJhY2VQb2ludCA9ICgqaXRQb2ludCkudG9fcHRyPCBUcmFjZVBvaW50ID4oKTsKKworCQkJaWYoIGxpZmVsaW5lQ29udGFpbnMobGlmZWxpbmVSSUQsICpjdXJyZW50VHJhY2VQb2ludCkgKQorCQkJeworCQkJCWlmKCBsaWZlbGluZVRpbWVQb2ludCAhPSBOVUxMICkKKwkJCQl7CisJCQkJCWxpZmVsaW5lVHJhY2UuYXBwZW5kKCBiZlRpbWVQb2ludCApOworCQkJCX0KKworCQkJCWxpZmVsaW5lVHJhY2UuYXBwZW5kKCAqaXRQb2ludCApOworCQkJCSsrbGlmZWxpbmVTaXplOworCisJCQkJbGlmZWxpbmVUaW1lUG9pbnQgPSBOVUxMOworCQkJfQorCQkJZWxzZSBpZiggY3VycmVudFRyYWNlUG9pbnQtPmlzVGltZSgpICkKKwkJCXsKKwkJCQlpZiggbGlmZWxpbmVUaW1lUG9pbnQgIT0gTlVMTCApCisJCQkJeworCQkJCQlsaWZlbGluZVRpbWVQb2ludC0+dmFsdWUgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6OmFkZEV4cHIoCisJCQkJCQkJbGlmZWxpbmVUaW1lUG9pbnQtPnZhbHVlLCBjdXJyZW50VHJhY2VQb2ludC0+dmFsdWUpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlsaWZlbGluZVRpbWVQb2ludCA9IG5ldyBUcmFjZVBvaW50KCAqY3VycmVudFRyYWNlUG9pbnQgKTsKKwkJCQkJYmZUaW1lUG9pbnQgPSBsaWZlbGluZVRpbWVQb2ludDsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZSBpZiggKCppdFBvaW50KS5pczwgVHJhY2VTZXF1ZW5jZSA+KCkgKQorCQl7CisJCQlsaWZlbGluZVNpemUgKz0gKCppdFBvaW50KS50b19wdHI8IFRyYWNlU2VxdWVuY2UgPigpCisJCQkJCS0+dG9MaWZlbGluZShsaWZlbGluZVRyYWNlLCBsaWZlbGluZVJJRCk7CisJCX0KKwl9CisKKwlyZXR1cm4oIGxpZmVsaW5lU2l6ZSApOworfQorCisKK2Jvb2wgVHJhY2VTZXF1ZW5jZTo6bGlmZWxpbmVDb250YWlucygKKwkJY29uc3QgUnVudGltZUlEICYgbGlmZWxpbmVSSUQsIGNvbnN0IFRyYWNlUG9pbnQgJiBhUG9pbnQpIGNvbnN0Cit7CisJaWYoIGFQb2ludC5SSUQudmFsaWQoKSAmJiBsaWZlbGluZVJJRC5pc0FuY2VzdG9yT2YoIGFQb2ludC5SSUQgKSApCisJeworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisJZWxzZSBpZiggKGFQb2ludC5jb25maWcgIT0gTlVMTCkKKwkJCSYmIGxpZmVsaW5lUklELmlzQW5jZXN0b3JPZiggYVBvaW50LmNvbmZpZy0+Z2V0UnVudGltZUlEKCkgKSApCisJeworCQlyZXR1cm4oIHRydWUgKTsKKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNFUklBTElaQVRJT04gQVBJCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIFRyYWNlU2VxdWVuY2U6OnRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdAoreworCW9zIDw8IFRBQiA8PCAidHJhY2UjIiA8PCB0aWQgPDwgIjxzaXplOiIgPDwgcG9pbnRzLnNpemUoKTsKKwlpZiggbUVDICE9IE5VTEwgKQorCXsKKwkJb3MgPDwgIiwgY3R4OiIgPDwgbUVDLT5nZXRJZE51bWJlcigpOworCX0KKwlvcyA8PCAiPiB7ICIgPDwgY29tYmluYXRvci0+c3RyT3AoKSA8PCBFT0w7CisKKy8vCW9zIDw8IElOQ1JfSU5ERU5UOworLy8JQkZMaXN0Ojpjb25zdF9pdGVyYXRvciBlbmRJdCA9IHBvaW50cy5lbmQoKTsKKy8vCWZvciggQkZMaXN0Ojpjb25zdF9pdGVyYXRvciBpdCA9IHBvaW50cy5iZWdpbigpIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKy8vCXsKKy8vCQlvcyA8PCAoKml0KTsKKy8vCX0KKy8vCW9zIDw8IERFQ1JfSU5ERU5UOworCisJb3MgPDwgSU5DUl9JTkRFTlQgPDwgcG9pbnRzIDw8IERFQ1JfSU5ERU5UOworCisJb3MgPDwgVEFCIDw8ICJ9IiA8PCBFT0xfRkxVU0g7Cit9CisKKwordm9pZCBUcmFjZVNlcXVlbmNlOjp0cmFjZU1pbmltdW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJb3MgPDwgVEFCIDw8ICJ0cmFjZSMiIDw8IHRpZCA8PCAiPHNpemU6IiA8PCBwb2ludHMuc2l6ZSgpOworCWlmKCBtRUMgIT0gTlVMTCApCisJeworCQlvcyA8PCAiLCBjdHg6IiA8PCBtRUMtPmdldElkTnVtYmVyKCk7CisJfQorCW9zIDw8ICI+IHsgIiA8PCBjb21iaW5hdG9yLT5zdHJPcCgpIDw8IEVPTF9JTkNSX0lOREVOVDsKKworCUJGTGlzdDo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBwb2ludHMuZW5kKCk7CisJZm9yKCBCRkxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gcG9pbnRzLmJlZ2luKCkgOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCXsKKwkJaWYoICgqaXQpLmlzPCBUcmFjZVBvaW50ID4oKSApCisJCXsKKwkJCSgqaXQpLnRvX3B0cjwgVHJhY2VQb2ludCA+KCktPnRyYWNlTWluaW11bShvcyk7CisJCX0KKwkJZWxzZSBpZiggKCppdCkuaXM8IFRyYWNlU2VxdWVuY2UgPigpICkKKwkJeworCQkJKCppdCkudG9fcHRyPCBUcmFjZVNlcXVlbmNlID4oKS0+dHJhY2VNaW5pbXVtKG9zKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW9zIDw8ICgqaXQpOworCQl9CisJfQorCisJb3MgPDwgREVDUl9JTkRFTlRfVEFCIDw8ICJ9IiA8PCBFT0xfRkxVU0g7Cit9CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvdHJhY2UvVHJhY2VTZXF1ZW5jZS5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3RyYWNlL1RyYWNlU2VxdWVuY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzM2MTgyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3RyYWNlL1RyYWNlU2VxdWVuY2UuaApAQCAtMCwwICsxLDIyNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDEzIGTDqWMuIDIwMTMKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBUUkFDRVNFUVVFTkNFX0hfCisjZGVmaW5lIFRSQUNFU0VRVUVOQ0VfSF8KKworI2luY2x1ZGUgPGNvbW1vbi9Bdm1Qb2ludGVyLmg+CisjaW5jbHVkZSA8Y29tbW9uL0VsZW1lbnQuaD4KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vQkZDb250YWluZXIuaD4KKyNpbmNsdWRlIDxjb2xsZWN0aW9uL1ZlY3Rvci5oPgorCisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yLmg+CisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yTWFuYWdlci5oPgorI2luY2x1ZGUgPGNvbGxlY3Rpb24vTGlzdC5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworY2xhc3MgRXhlY3V0aW9uQ29udGV4dDsKKworY2xhc3MgUnVudGltZUlEOworCitjbGFzcyBUcmFjZUZvcm1hdHRlcjsKK2NsYXNzIFRyYWNlUG9pbnQ7CisKKworY2xhc3MgVHJhY2VTZXF1ZW5jZSAgOgorCQlwdWJsaWMgRWxlbWVudCAsCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggVHJhY2VTZXF1ZW5jZSApCit7CisKKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggVHJhY2VTZXF1ZW5jZSApCisKKworcHVibGljOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlPcGVyYXRvciAqIGNvbWJpbmF0b3I7CisKKwlCRkxpc3QgcG9pbnRzOworCisJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAqIG1FQzsKKworCWF2bV9zaXplX3QgdGlkOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlUcmFjZVNlcXVlbmNlKGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDID0gTlVMTCwgYXZtX3NpemVfdCBhVElEID0gMCkKKwk6IEVsZW1lbnQoIENMQVNTX0tJTkRfVCggVHJhY2VTZXF1ZW5jZSApICksCisJY29tYmluYXRvciggT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TRVFVRU5DRSApLAorCXBvaW50cyggKSwKKwltRUMoIGFuRUMgKSwKKwl0aWQoIGFUSUQgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwlUcmFjZVNlcXVlbmNlKFRyYWNlU2VxdWVuY2UgKiBhQ29udGFpbmVyLCBPcGVyYXRvciAqIGFDb21iaW5hdG9yKQorCTogRWxlbWVudCggQ0xBU1NfS0lORF9UKCBUcmFjZVNlcXVlbmNlICkgKSwKKwljb21iaW5hdG9yKCBhQ29tYmluYXRvciApLAorCXBvaW50cyggKSwKKwltRUMoIC8qYUNvbnRhaW5lci0+bUVDKi9OVUxMICksCisJdGlkKCBhQ29udGFpbmVyLT50aWQgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBPdGhlcgorCSAqLworCVRyYWNlU2VxdWVuY2UoY2xhc3Nfa2luZF90IGFDbGFzc0tpbmQpCisJOiBFbGVtZW50KCBhQ2xhc3NLaW5kICksCisJY29tYmluYXRvciggT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TRVFVRU5DRSApLAorCXBvaW50cyggKSwKKwltRUMoIE5VTEwgKSwKKwl0aWQoIDAgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJVHJhY2VTZXF1ZW5jZShjb25zdCBUcmFjZVNlcXVlbmNlICYgYVRyYWNlKQorCTogRWxlbWVudCggYVRyYWNlICksCisJY29tYmluYXRvciggYVRyYWNlLmNvbWJpbmF0b3IgKSwKKwlwb2ludHMoIGFUcmFjZS5wb2ludHMgKSwKKwltRUMoIGFUcmFjZS5tRUMgKSwKKwl0aWQoIGFUcmFjZS50aWQgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgflRyYWNlU2VxdWVuY2UoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBjb3B5IGFuIGV4aXN0aW5nIHRyYWNlCisJICovCisJaW5saW5lIHZvaWQgY29weVRyYWNlKFRyYWNlU2VxdWVuY2UgJiBhVHJhY2VFbGVtZW50KQorCXsKKwkJY29tYmluYXRvciA9IGFUcmFjZUVsZW1lbnQuY29tYmluYXRvcjsKKworCQlwb2ludHMuYXBwZW5kKCBhVHJhY2VFbGVtZW50LnBvaW50cyApOworCisJCW1FQyA9IGFUcmFjZUVsZW1lbnQubUVDOworCisJCXRpZCA9IGFUcmFjZUVsZW1lbnQudGlkOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogQVBQRU5EIC0tIFNBVkUKKwkgKiBQT1BfRlJPTlQKKwkgKiBTSVpFCisJICogcG9pbnRzCisJICovCisJaW5saW5lIHZvaWQgYXBwZW5kKCBjb25zdCBCRiAmIGJmVFAgKQorCXsKKwkJcG9pbnRzLmFwcGVuZCggYmZUUCApOworCX0KKworCWlubGluZSB2b2lkIHNhdmUoIEVsZW1lbnQgKiBhVFAgKQorCXsKKwkJcG9pbnRzLmFwcGVuZCggQkYoIGFUUCkgKTsKKwl9CisKKworCWlubGluZSB2b2lkIGNsZWFyKCkKKwl7CisJCXBvaW50cy5jbGVhcigpOworCX0KKworCisJaW5saW5lIGF2bV9zaXplX3Qgc2l6ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIHBvaW50cy5zaXplKCkgKTsKKwl9CisKKworCS8qKgorCSAqIENvbnRhaW5zIGFuIE9iamVjdAorCSAqIHBvaW50cworCSAqLworCWJvb2wgY29udGFpbnNPYmplY3QoQmFzZUNvbXBpbGVkRm9ybSAgKiBhbk9iamVjdCkgY29uc3Q7CisKKwlib29sIGNvbnRhaW5zUG9pbnQoVHJhY2VQb2ludCAqIGFQb2ludCwgQkYgJiBmb3VuZFBvaW50KSBjb25zdDsKKworCWJvb2wgY29udGFpbnNQb2ludChUcmFjZVBvaW50ICogYVBvaW50LCBib29sIHdpdGhWYWx1ZSA9IHRydWUpIGNvbnN0OworCisKKwkvKioKKwkgKiBDb21wYXJpc29uCisJICovCisJQVZNX09QQ09ERSBjb21wYXJlKGNvbnN0IFRyYWNlU2VxdWVuY2UgKiBvdGhlclRyYWNlRWx0KSBjb25zdDsKKworCWlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgVHJhY2VTZXF1ZW5jZSAmIG90aGVyVHJhY2VFbHQpIGNvbnN0CisJeworCQlyZXR1cm4oIGNvbXBhcmUoJiBvdGhlclRyYWNlRWx0KSA9PSBBVk1fT1BDT0RFX0VRICk7CisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gTElGRUxJTkUgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJYXZtX3NpemVfdCB0b0xpZmVsaW5lKFRyYWNlU2VxdWVuY2UgJiBsaWZlbGluZVRyYWNlLAorCQkJY29uc3QgUnVudGltZUlEICYgbGlmZWxpbmVSSUQpIGNvbnN0OworCisJYm9vbCBsaWZlbGluZUNvbnRhaW5zKGNvbnN0IFJ1bnRpbWVJRCAmIGxpZmVsaW5lUklELAorCQkJY29uc3QgVHJhY2VQb2ludCAmIGFUcmFjZVBvaW50KSBjb25zdDsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFNFUklBTElaQVRJT04gQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgc3RyKCkgY29uc3QKKwl7CisJCXJldHVybiggT1NTKCkgPDwgInRyYWNlIyIgPDwgdGlkICk7CisJfQorCisJdmlydHVhbCB2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworCXZpcnR1YWwgdm9pZCB0cmFjZU1pbmltdW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCit9OworCisKKy8qKgorICogb3BlcmF0b3I8PAorICovCitBVk1fT1NfU1RSRUFNKCBUcmFjZVNlcXVlbmNlICkKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qIFRSQUNFU0VRVUVOQ0VfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90eXBlL0Jhc2VTeW1ib2xUeXBlU3BlY2lmaWVyLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90eXBlL0Jhc2VTeW1ib2xUeXBlU3BlY2lmaWVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTY3YmJmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3R5cGUvQmFzZVN5bWJvbFR5cGVTcGVjaWZpZXIuY3BwCkBAIC0wLDAgKzEsMjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxNSBqdWluIDIwMTQKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkJhc2VTeW1ib2xUeXBlU3BlY2lmaWVyLmgiCisKKworbmFtZXNwYWNlIHNlcAoreworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3R5cGUvQmFzZVN5bWJvbFR5cGVTcGVjaWZpZXIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90eXBlL0Jhc2VTeW1ib2xUeXBlU3BlY2lmaWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdjZTgzNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90eXBlL0Jhc2VTeW1ib2xUeXBlU3BlY2lmaWVyLmgKQEAgLTAsMCArMSwxODEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxNSBqdWluIDIwMTQKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBCQVNFU1lNQk9MVFlQRVNQRUNJRklFUl9IXworI2RlZmluZSBCQVNFU1lNQk9MVFlQRVNQRUNJRklFUl9IXworCisjaW5jbHVkZSA8Zm1sL3R5cGUvQmFzZVR5cGVTcGVjaWZpZXIuaD4KKworI2luY2x1ZGUgPGNvbW1vbi9CRi5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZkRhdGEuaD4KKworI2luY2x1ZGUgPGZtbC9zeW1ib2wvVGFibGVPZlN5bWJvbC5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworY2xhc3MgRGF0YVR5cGU7CitjbGFzcyBPYmplY3RFbGVtZW50OworCisKK2NsYXNzIEJhc2VTeW1ib2xUeXBlU3BlY2lmaWVyICA6ICBwdWJsaWMgQmFzZVR5cGVTcGVjaWZpZXIgLAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIEJhc2VTeW1ib2xUeXBlU3BlY2lmaWVyICkKK3sKKworCUFWTV9ERUNMQVJFX1VOQ0xPTkFCTEVfQ0xBU1MoQmFzZVN5bWJvbFR5cGVTcGVjaWZpZXIpCisKKworcHJvdGVjdGVkOgorCS8qCisJICogQVRUUklCVVRFUworCSAqLworCVRhYmxlT2ZTeW1ib2wgbVN5bWJvbERhdGE7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUJhc2VTeW1ib2xUeXBlU3BlY2lmaWVyKGNsYXNzX2tpbmRfdCBhQ2xhc3NLaW5kLAorCQkJYXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCBhU3BlY2lmaWVyS2luZCwKKwkJCURhdGFUeXBlICogYUNvbXBpbGVkVHlwZSwKKwkJCWF2bV9zaXplX3QgYVNpemUsIGF2bV9zaXplX3QgYURhdGFTaXplLCBhdm1fc2l6ZV90IGFCaXRTaXplKQorCTogQmFzZVR5cGVTcGVjaWZpZXIoYUNsYXNzS2luZCwgYVNwZWNpZmllcktpbmQsIGFDb21waWxlZFR5cGUsCisJCQlhU2l6ZSwgYURhdGFTaXplLCBhQml0U2l6ZSksCisJbVN5bWJvbERhdGEoKQorCXsKKwkJLy8hISEgTk9USElORworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkJhc2VTeW1ib2xUeXBlU3BlY2lmaWVyKCkKKwl7CisJCS8vISEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1TeW1ib2xEYXRhCisJICovCisJaW5saW5lIHZvaWQgc2F2ZVN5bWJvbERhdGEoSW5zdGFuY2VPZkRhdGEgKiBhbkluc3RhbmNlKQorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggYW5JbnN0YW5jZSApCisJCQkJPDwgIkluc3RhbmNlT2ZEYXRhICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJbVN5bWJvbERhdGEuc2F2ZShhbkluc3RhbmNlKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1TeW1ib2xEYXRhCisJICovCisJaW5saW5lIHZvaWQgYXBwZW5kU3ltYm9sRGF0YShjb25zdCBTeW1ib2wgJiBhU3ltYm9sKQorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1NNQVJUX1BPSU5URVJfRVhJVCggYVN5bWJvbCApCisJCQkJPDwgIkluc3RhbmNlT2ZEYXRhICEhISIKKwkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJbVN5bWJvbERhdGEuYXBwZW5kKGFTeW1ib2wpOworCX0KKworCWlubGluZSBUYWJsZU9mU3ltYm9sICYgZ2V0U3ltYm9sRGF0YSgpCisJeworCQlyZXR1cm4oIG1TeW1ib2xEYXRhICk7CisJfQorCisJaW5saW5lIGNvbnN0IFRhYmxlT2ZTeW1ib2wgJiBnZXRTeW1ib2xEYXRhKCkgY29uc3QKKwl7CisJCXJldHVybiggbVN5bWJvbERhdGEgKTsKKwl9CisKKworCWlubGluZSBjb25zdCBTeW1ib2wgJiBnZXRTeW1ib2xEYXRhKGF2bV9vZmZzZXRfdCBvZmZzZXQpIGNvbnN0CisJeworCQlyZXR1cm4oIG1TeW1ib2xEYXRhLmdldChvZmZzZXQpICk7CisJfQorCisJaW5saW5lIGNvbnN0IFN5bWJvbCAmIGdldFN5bWJvbERhdGEoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCkgY29uc3QKKwl7CisJCXJldHVybiggbVN5bWJvbERhdGEuZ2V0QnlGUU5hbWVJRChhRnVsbHlRdWFsaWZpZWROYW1lSUQpICk7CisJfQorCisJaW5saW5lIGNvbnN0IFN5bWJvbCAmIGdldERhdGFCeVF1YWxpZmllZE5hbWVJRCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkgY29uc3QKKwl7CisJCXJldHVybiggbVN5bWJvbERhdGEuZ2V0QnlRdWFsaWZpZWROYW1lSUQoIGFRdWFsaWZpZWROYW1lSUQgKSApOworCX0KKworCWlubGluZSBjb25zdCBTeW1ib2wgJiBnZXREYXRhQnlOYW1lSUQoY29uc3Qgc3RkOjpzdHJpbmcgJiBpZCkgY29uc3QKKwl7CisJCXJldHVybiggbVN5bWJvbERhdGEuZ2V0QnlOYW1lSUQoaWQpICk7CisJfQorCisKKwlpbmxpbmUgY29uc3QgU3ltYm9sICYgZ2V0RGF0YUJ5QXN0RWxlbWVudCgKKwkJCWNvbnN0IE9iamVjdEVsZW1lbnQgKiBhc3RFbGVtZW50KSBjb25zdAorCXsKKwkJcmV0dXJuKCBtU3ltYm9sRGF0YS5nZXRCeUFzdEVsZW1lbnQoYXN0RWxlbWVudCkgKTsKKwl9CisKKworCWlubGluZSBCYXNlVHlwZVNwZWNpZmllciAqIGdldFN5bWJvbFR5cGUoYXZtX29mZnNldF90IG9mZnNldCkgY29uc3QKKwl7CisJCXJldHVybiggbVN5bWJvbERhdGEuZ2V0KG9mZnNldCkuZ2V0VHlwZVNwZWNpZmllcigpICk7CisJfQorCisKKwlpbmxpbmUgYm9vbCBoYXNTeW1ib2xEYXRhKCkgY29uc3QKKwl7CisJCXJldHVybiggbVN5bWJvbERhdGEubm9uZW1wdHkoKSApOworCX0KKworCisJLyoqCisJICogU0VUVEVSCisJICogdGhlIERhdGEgU2l6ZQorCSAqLworCWlubGluZSB2aXJ0dWFsIHZvaWQgdXBkYXRlU2l6ZSgpCisJeworCQlhdm1fc2l6ZV90IGFEYXRhU2l6ZSA9IDA7CisKKwkJVGFibGVPZlN5bWJvbDo6aXRlcmF0b3IgaXQgPSBnZXRTeW1ib2xEYXRhKCkuYmVnaW4oKTsKKwkJVGFibGVPZlN5bWJvbDo6aXRlcmF0b3IgaXRFbmQgPSBnZXRTeW1ib2xEYXRhKCkuZW5kKCk7CisJCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQorCQl7CisJCQlhRGF0YVNpemUgPSBhRGF0YVNpemUgKyAoKml0KS5nZXRUeXBlU3BlY2lmaWVyKCktPmdldERhdGFTaXplKCk7CisJCX0KKworCQlzZXREYXRhU2l6ZSggYURhdGFTaXplICk7CisKKwkJc2V0U2l6ZSggZ2V0U3ltYm9sRGF0YSgpLnNpemUoKSApOworCX0KKworfTsKKworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworCisjZW5kaWYgLyogQkFTRVNZTUJPTFRZUEVTUEVDSUZJRVJfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90eXBlL0Jhc2VUeXBlU3BlY2lmaWVyLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90eXBlL0Jhc2VUeXBlU3BlY2lmaWVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzNlYzdjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3R5cGUvQmFzZVR5cGVTcGVjaWZpZXIuY3BwCkBAIC0wLDAgKzEsMzgxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogNyBhb8O7dCAyMDA4CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJCYXNlVHlwZVNwZWNpZmllci5oIgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQnVpbHRpbkFycmF5Lmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkNvbnN0YW50Lmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkNvbnN0cnVjdG9yLmg+CisKKyNpbmNsdWRlIDxmbWwvdHlwZS9UeXBlQWxpYXNTcGVjaWZpZXIuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworc3RkOjpzdHJpbmcgQmFzZVR5cGVTcGVjaWZpZXI6OlRZUEVfQU5PTVlNX0lEID0gInR5cGUjYW5vbnltIjsKKworLyoqCisgKiBTRVRURVIKKyAqIHVwZGF0ZUZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKyAqLwordm9pZCBCYXNlVHlwZVNwZWNpZmllcjo6dXBkYXRlRnVsbHlRdWFsaWZpZWROYW1lSUQoKQoreworCWlmKCBoYXNGdWxseVF1YWxpZmllZE5hbWVJRCgpICkKKwl7CisJCWlmKCBoYXNBc3RFbGVtZW50KCkgKQorCQl7CisJCQlzZXROYW1lSUQoIGdldEFzdE5hbWVJRCgpICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlzZXROYW1lSUQoIE5hbWVkRWxlbWVudDo6ZXh0cmFjdE5hbWVJRCgKKwkJCQkJZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSApICk7CisJCX0KKwl9CisJZWxzZSBpZiggaGFzQXN0RWxlbWVudCgpICkKKwl7CisJCXN0ZDo6c3RyaW5nIGFGdWxseVF1YWxpZmllZE5hbWVJRCA9IGdldEFzdEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7CisKKwkJc2V0QWxsTmFtZUlEKCAidHlwZSIgKyBhRnVsbHlRdWFsaWZpZWROYW1lSUQuc3Vic3RyKAorCQkJCQlhRnVsbHlRdWFsaWZpZWROYW1lSUQuZmluZChGUU5fSURfUk9PVF9TRVBBUkFUT1IpKSwKKwkJCQlnZXRBc3ROYW1lSUQoKSApOworCX0KKwllbHNlCisJeworCQlzZXRBbGxOYW1lSUQoIFRZUEVfQU5PTVlNX0lEICwgVFlQRV9BTk9NWU1fSUQgKTsKKwl9Cit9CisKKworLyoqCisgKiBDT05TVFJBSU5UIGdlbmVyYXRpb24KKyAqIGZvciBhIGdpdmVuIHBhcmFtZXRlcgorICovCisKK2Jvb2wgQmFzZVR5cGVTcGVjaWZpZXI6OmNvdWxkR2VuZXJhdGVDb25zdHJhaW50KCkgY29uc3QKK3sKKwlzd2l0Y2goIG1TcGVjaWZpZXJLaW5kICkKKwl7CisJCWNhc2UgVFlQRV9FTlVNX1NQRUNJRklFUjoKKwkJY2FzZSBUWVBFX0lOVEVSVkFMX1NQRUNJRklFUjoKKwkJeworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKworCQljYXNlIFRZUEVfSU5URUdFUl9TUEVDSUZJRVI6CisJCWNhc2UgVFlQRV9SQVRJT05BTF9TUEVDSUZJRVI6CisJCWNhc2UgVFlQRV9GTE9BVF9TUEVDSUZJRVI6CisJCWNhc2UgVFlQRV9SRUFMX1NQRUNJRklFUjoKKwkJeworCQkJcmV0dXJuKCBoYXNCaXRTaXplQ29uc3RyYWludCgpICk7CisJCX0KKworCQljYXNlIFRZUEVfUE9TX0lOVEVHRVJfU1BFQ0lGSUVSOgorCQljYXNlIFRZUEVfVUlOVEVHRVJfU1BFQ0lGSUVSOgorCQljYXNlIFRZUEVfVVJBVElPTkFMX1NQRUNJRklFUjoKKy8vCQljYXNlIFRZUEVfQ09OVElOVU9VU19USU1FX1NQRUNJRklFUjoKKy8vCQljYXNlIFRZUEVfRElTQ1JFVEVfVElNRV9TUEVDSUZJRVI6CisJCWNhc2UgVFlQRV9VRkxPQVRfU1BFQ0lGSUVSOgorCQljYXNlIFRZUEVfVVJFQUxfU1BFQ0lGSUVSOgorCQl7CisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KK30KKworCisKKworaW5saW5lIHN0YXRpYyBhdm1faW50ZWdlcl90IHBvdzIoYXZtX3NpemVfdCBuKQoreworCXJldHVybiggMSA8PCBuICk7CisKKy8vCWF2bV9pbnRlZ2VyX3QgcmVzID0gMTsKKy8vCWZvciggOyAwIDwgbjsgLS1uICkKKy8vCXsKKy8vCQlyZXMgKj0gMjsKKy8vCX0KKy8vCXJldHVybiggcmVzICk7Cit9CisKKworCithdm1faW50ZWdlcl90IEJhc2VUeXBlU3BlY2lmaWVyOjptaW5JbnRlZ2VyVmFsdWUoKSBjb25zdAoreworCWNvbnN0IGF2bV9zaXplX3QgZGltID0gZ2V0Qml0U2l6ZSgpOworCisJc3dpdGNoKCBtU3BlY2lmaWVyS2luZCApCisJeworCQljYXNlIFRZUEVfSU5URUdFUl9TUEVDSUZJRVI6CisJCXsKKy8vCQkJaWYoIGhhc0JpdFNpemVDb25zdHJhaW50KCkgKQorCQkJaWYoIChkaW0gPiAwKSAmJiAoZGltIDw9IDY0KSApCisJCQl7CisJCQkJcmV0dXJuKCAtIHBvdzIoZGltIC0gMSkgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4oIEFWTV9OVU1FUklDX01JTl9JTlRFR0VSICk7CisJCQl9CisJCX0KKworCQljYXNlIFRZUEVfUE9TX0lOVEVHRVJfU1BFQ0lGSUVSOgorCQl7CisJCQlyZXR1cm4oIDEgKTsKKwkJfQorCisJCWNhc2UgVFlQRV9VSU5URUdFUl9TUEVDSUZJRVI6CisJCWNhc2UgVFlQRV9ESVNDUkVURV9USU1FX1NQRUNJRklFUjoKKwkJeworCQkJcmV0dXJuKCAwICk7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlyZXR1cm4oIEFWTV9OVU1FUklDX01JTl9JTlRFR0VSICk7CisJCX0KKwl9Cit9CisKKworYXZtX3VpbnRlZ2VyX3QgQmFzZVR5cGVTcGVjaWZpZXI6Om1heEludGVnZXJWYWx1ZSgpIGNvbnN0Cit7CisJY29uc3QgYXZtX3NpemVfdCBkaW0gPSBnZXRCaXRTaXplKCk7CisKKwlzd2l0Y2goIG1TcGVjaWZpZXJLaW5kICkKKwl7CisJCWNhc2UgVFlQRV9JTlRFR0VSX1NQRUNJRklFUjoKKwkJeworLy8JCQlpZiggaGFzQml0U2l6ZUNvbnN0cmFpbnQoKSApCisJCQlpZiggKGRpbSA+IDApICYmIChkaW0gPD0gNjQpICkKKwkJCXsKKwkJCQlyZXR1cm4oIHBvdzIoZGltIC0gMSkgLSAxICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuKCBBVk1fTlVNRVJJQ19NQVhfSU5URUdFUiApOworCQkJfQorCQl9CisKKwkJY2FzZSBUWVBFX1BPU19JTlRFR0VSX1NQRUNJRklFUjoKKwkJY2FzZSBUWVBFX1VJTlRFR0VSX1NQRUNJRklFUjoKKwkJY2FzZSBUWVBFX0RJU0NSRVRFX1RJTUVfU1BFQ0lGSUVSOgorCQl7CisvLwkJCWlmKCBoYXNCaXRTaXplQ29uc3RyYWludCgpICkKKwkJCWlmKCAoZGltID4gMCkgJiYgKGRpbSA8PSA2NCkgKQorCQkJeworCQkJCXJldHVybiggcG93MihkaW0pICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuKCBBVk1fTlVNRVJJQ19NQVhfVUlOVEVHRVIgKTsKKwkJCX0KKwkJfQorCisJCWRlZmF1bHQ6CisJCXsKKwkJCXJldHVybiggQVZNX05VTUVSSUNfTUFYX1VJTlRFR0VSICk7CisJCX0KKwl9Cit9CisKKworQkYgQmFzZVR5cGVTcGVjaWZpZXI6OmdlbkNvbnN0cmFpbnQoY29uc3QgQkYgJiBhUGFyYW0pIGNvbnN0Cit7CisJaWYoIGhhc0NvbnN0cmFpbnQoKSApCisJeworCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCTw8ICJUT0RPIDw8IFR5cGVTcGVjaWZpZXI6OmdlbkNvbnN0cmFpbnQoICIKKwkJCQk8PCBhUGFyYW0gPDwgIiApID4+IHdpdGggY29tcGlsZWQgY29uc3RyYWludDoiIDw8IHN0ZDo6ZW5kbAorCQkJCTw8IGdldENvbnN0cmFpbnQoKQorCQkJCTw8IFNFTkRfRVhJVDsKKwl9CisKKwljb25zdCBhdm1fc2l6ZV90IGRpbSA9IGdldEJpdFNpemUoKTsKKworCXN3aXRjaCggbVNwZWNpZmllcktpbmQgKQorCXsKKwkJY2FzZSBUWVBFX0lOVEVHRVJfU1BFQ0lGSUVSOgorCQljYXNlIFRZUEVfUkFUSU9OQUxfU1BFQ0lGSUVSOgorCQljYXNlIFRZUEVfRkxPQVRfU1BFQ0lGSUVSOgorCQljYXNlIFRZUEVfUkVBTF9TUEVDSUZJRVI6CisJCXsKKy8vCQkJaWYoIGhhc0JpdFNpemVDb25zdHJhaW50KCkgKQorCQkJaWYoIChkaW0gPiAwKSAmJiAoZGltIDw9IDY0KSApCisJCQl7CisJCQkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3JOYXRpdmU6OmFuZEV4cHIoCisJCQkJCQlFeHByZXNzaW9uQ29uc3RydWN0b3JOYXRpdmU6Omd0ZUV4cHIoYVBhcmFtLAorCQkJCQkJCQlFeHByZXNzaW9uQ29uc3RydWN0b3JOYXRpdmU6Om5ld0ludGVnZXIoCisJCQkJCQkJCQkJKC0gcG93MihkaW0gLSAxKSkpKSwKKwkJCQkJCUV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6bHRlRXhwcihhUGFyYW0sCisJCQkJCQkJCUV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6bmV3SW50ZWdlcigKKwkJCQkJCQkJCQlwb3cyKGRpbSAtIDEpIC0gMSkpKSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX1RSVUUgKTsKKwkJCX0KKwkJfQorCisJCWNhc2UgVFlQRV9VSU5URUdFUl9TUEVDSUZJRVI6CisJCWNhc2UgVFlQRV9VUkFUSU9OQUxfU1BFQ0lGSUVSOgorCQljYXNlIFRZUEVfQ09OVElOVU9VU19USU1FX1NQRUNJRklFUjoKKwkJY2FzZSBUWVBFX0RJU0NSRVRFX1RJTUVfU1BFQ0lGSUVSOgorCQljYXNlIFRZUEVfVUZMT0FUX1NQRUNJRklFUjoKKwkJY2FzZSBUWVBFX1VSRUFMX1NQRUNJRklFUjoKKwkJeworLy8JCQlpZiggaGFzQml0U2l6ZUNvbnN0cmFpbnQoKSApCisJCQlpZiggKGRpbSA+IDApICYmIChkaW0gPD0gNjQpICkKKwkJCXsKKwkJCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6YW5kRXhwcigKKwkJCQkJCUV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6Z3RlRXhwcihhUGFyYW0sCisJCQkJCQkJCUV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9aRVJPKSwKKwkJCQkJCUV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6bHRlRXhwcihhUGFyYW0sCisJCQkJCQkJCUV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6bmV3SW50ZWdlcigKKwkJCQkJCQkJCQlwb3cyKGRpbSkpKSkgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6Z3RlRXhwcihhUGFyYW0sCisJCQkJCQlFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfWkVSTykgKTsKKwkJCX0KKwkJfQorCisJCWNhc2UgVFlQRV9QT1NfSU5URUdFUl9TUEVDSUZJRVI6CisJCXsKKy8vCQkJaWYoIGhhc0JpdFNpemVDb25zdHJhaW50KCkgKQorCQkJaWYoIChkaW0gPiAwKSAmJiAoZGltIDw9IDY0KSApCisJCQl7CisJCQkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3JOYXRpdmU6OmFuZEV4cHIoCisJCQkJCQlFeHByZXNzaW9uQ29uc3RydWN0b3JOYXRpdmU6Omd0RXhwcihhUGFyYW0sCisJCQkJCQkJCUV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9aRVJPKSwKKwkJCQkJCUV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6bHRlRXhwcihhUGFyYW0sCisJCQkJCQkJCUV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6bmV3SW50ZWdlcigKKwkJCQkJCQkJCQlwb3cyKGRpbSkpKSkgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6Z3RFeHByKGFQYXJhbSwKKwkJCQkJCUV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9aRVJPKSApOworCQkJfQorCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RhbnQ6OkJPT0xFQU5fVFJVRSApOworCQl9CisJfQorfQorCisKKy8qKgorICogR0VUVEVSCisgKiByZWZlcmVkIChhcyB0eXBlZGVmKSBUeXBlU3BlY2lmaWVyCisgKi8KK0Jhc2VUeXBlU3BlY2lmaWVyICogQmFzZVR5cGVTcGVjaWZpZXI6OnJlZmVyZWRUeXBlU3BlY2lmaWVyKCkKK3sKKwlyZXR1cm4oIHRoaXMtPmlzVHlwZWRBbGlhcygpID8KKwkJCWFzPCBUeXBlQWxpYXNTcGVjaWZpZXIgPigpLT50YXJnZXRUeXBlU3BlY2lmaWVyKCkgOiB0aGlzICk7Cit9CisKKworLyoqCisgKiBGb3JtYXQgYSB2YWx1ZSB3LnIudC4gaXRzIHR5cGUKKyAqLwordm9pZCBCYXNlVHlwZVNwZWNpZmllcjo6Zm9ybWF0U3RyZWFtKAorCQlPdXRTdHJlYW0gJiBvdXQsIGNvbnN0IEJGICYgYmZWYWx1ZSkgY29uc3QKK3sKKwlpZiggYmZWYWx1ZS5pczwgQXJyYXlCRiA+KCkgKQorCXsKKwkJZm9ybWF0U3RyZWFtKG91dCwgYmZWYWx1ZS5hc19yZWY8IEFycmF5QkYgPigpKTsKKwl9CisJZWxzZQorCXsKKwkJb3V0IDw8IGJmVmFsdWUuc3RyKCk7CisJfQorfQorCit2b2lkIEJhc2VUeXBlU3BlY2lmaWVyOjpmb3JtYXRTdHJlYW0oCisJCU91dFN0cmVhbSAmIG91dCwgY29uc3QgQXJyYXlCRiAmIGFycmF5VmFsdWUpIGNvbnN0Cit7CisJZm9ybWF0U3RyZWFtKG91dCwgYXJyYXlWYWx1ZVswXSk7CisJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDEgOyBvZmZzZXQgPCBhcnJheVZhbHVlLnNpemUoKSA7ICsrb2Zmc2V0ICkKKwl7CisJCW91dCA8PCBvdXQuVkFMVUVfU1RSVUNUX0NTUy5TRVBBUkFUT1I7CisJCWZvcm1hdFN0cmVhbShvdXQsIGFycmF5VmFsdWVbb2Zmc2V0XSk7CisJfQorfQorCisKKy8qKgorICogU2VyaWFsaXphdGlvbgorICovCit2b2lkIEJhc2VUeXBlU3BlY2lmaWVyOjpzdHJIZWFkZXIoT3V0U3RyZWFtICYgb3V0KSBjb25zdAoreworCW91dCA8PCAidHlwZTwgIiA8PCBzdHJTcGVjaWZpZXJLaW5kKCkgPDwgIiA+ICIgPDwgZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsKK30KKwordm9pZCBCYXNlVHlwZVNwZWNpZmllcjo6dG9TdHJlYW0oT3V0U3RyZWFtICYgb3V0KSBjb25zdAoreworCWlmKCBvdXQucHJlZmVyYWJseUZRTigpICkKKwl7CisJCW91dCA8PCBUQUIgPDwgZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsKKworCQlBVk1fREVCVUdfUkVGX0NPVU5URVIob3V0KTsKKworCQlyZXR1cm47CisJfQorCisJb3V0IDw8IFRBQiA8PCAidHlwZTxiYXNlPiAiIDw8IGdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKwkJPDwgIiBhcyAiIDw8IHN0clNwZWNpZmllcktpbmQoKSA8PCAiIHsiIDw8IEVPTDsKKworQVZNX0lGX0RFQlVHX0ZMQUcoIENPTVBJTElORyApCisJaWYoIGhhc0FzdEVsZW1lbnQoKSApCisJeworCQlvdXQgPDwgVEFCMiA8PCAiLy9jb21waWxlZCA9ICIKKwkJCTw8IGdldEFzdEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIjsiIDw8IEVPTDsKKwl9CitBVk1fRU5ESUZfREVCVUdfRkxBRyggQ09NUElMSU5HICkKKworCW91dCA8PCBUQUIgPDwgInByb3BlcnR5OiIgPDwgRU9MCisKKwkJPDwgVEFCMiA8PCAic2l6ZSA9ICIgPDwgc2l6ZSgpIDw8ICI7IiA8PCBFT0wKKwkJPDwgVEFCMiA8PCAiZGF0YV9zaXplID0gIiA8PCBnZXREYXRhU2l6ZSgpIDw8ICI7IiA8PCBFT0wKKwkJPDwgVEFCMiA8PCAiYml0X3NpemUgPSAiIDw8IGdldEJpdFNpemUoKSA8PCAiOyIgPDwgRU9MOworCisJaWYoIGhhc0RlZmF1bHRWYWx1ZSgpICkKKwl7CisJCW91dCA8PCBUQUIyIDw8ICJkZWZhdWx0ID0gIiA8PCBnZXREZWZhdWx0VmFsdWUoKS5zdHIoKSA8PCAiOyIgPDwgRU9MOworCX0KKworCWlmKCBoYXNDb25zdHJhaW50KCkgKQorCXsKKwkJb3V0IDw8IFRBQjIgPDwgImNvbnN0cmFpbnQgeyIgPDwgSU5DUjJfSU5ERU5UOworCQlnZXRDb25zdHJhaW50KCkudG9TdHJlYW0ob3V0KTsKKwkJb3V0IDw8IERFQ1IyX0lOREVOVF9UQUIgPDwgIn0iIDw8IEVPTDsKKwl9CisKKwlvdXQgPDwgVEFCIDw8ICJ9IiA8PCBFT0xfRkxVU0g7Cit9CisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3R5cGUvQmFzZVR5cGVTcGVjaWZpZXIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90eXBlL0Jhc2VUeXBlU3BlY2lmaWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY2NDM0OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90eXBlL0Jhc2VUeXBlU3BlY2lmaWVyLmgKQEAgLTAsMCArMSw0NjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiA3IGFvw7t0IDIwMDgKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBCQVNFVFlQRVNQRUNJRklFUl9IXworI2RlZmluZSBCQVNFVFlQRVNQRUNJRklFUl9IXworCisjaW5jbHVkZSA8Y29tbW9uL0F2bVBvaW50ZXIuaD4KKyNpbmNsdWRlIDxjb21tb24vQkYuaD4KKworI2luY2x1ZGUgPGZtbC9jb21tb24vT2JqZWN0RWxlbWVudC5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvQmFzZUNvbXBpbGVkRm9ybS5oPgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQXZtQ29kZS5oPgorCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0RhdGFUeXBlLmg+CisKKyNpbmNsdWRlIDxmbWwvbGliL0lUeXBlU3BlY2lmaWVyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBBcnJheUJGOworCisKK2NsYXNzIEJhc2VUeXBlU3BlY2lmaWVyIDoKKwkJcHVibGljIEJhc2VDb21waWxlZEZvcm0sCisJCXB1YmxpYyBJVHlwZVNwZWNpZmllciwKKwkJQVZNX0lOSkVDVF9JTlNUQU5DRV9DT1VOVEVSX0NMQVNTKCBCYXNlVHlwZVNwZWNpZmllciApCit7CisKKwlBVk1fREVDTEFSRV9DTE9OQUJMRV9DTEFTUyggQmFzZVR5cGVTcGVjaWZpZXIgKQorCisKK3Byb3RlY3RlZDoKKwkvKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlhdm1fdHlwZV9zcGVjaWZpZXJfa2luZF90IG1TcGVjaWZpZXJLaW5kOworCisJYXZtX3NpemVfdCBtTWluaW11bVNpemU7CisJYXZtX3NpemVfdCBtTWF4aW11bVNpemU7CisKKworCWF2bV9zaXplX3QgbURhdGFTaXplOworCisJYXZtX3NpemVfdCBtQml0U2l6ZTsKKworCUJGIG1EZWZhdWx0VmFsdWU7CisKKwlCRiBtQ29uc3RyYWludDsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQmFzZVR5cGVTcGVjaWZpZXIoYXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCBhU3BlY2lmaWVyS2luZCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVR5cGVJRCwgYXZtX3NpemVfdCBtYXhTaXplLAorCQkJYXZtX3NpemVfdCBhRGF0YVNpemUsIGF2bV9zaXplX3QgYUJpdFNpemUsIGNvbnN0IEJGICYgZGVmYXVsdFZhbHVlKQorCTogQmFzZUNvbXBpbGVkRm9ybShDTEFTU19LSU5EX1QoIEJhc2VUeXBlU3BlY2lmaWVyICksIGFUeXBlSUQsIGFUeXBlSUQpLAorCW1TcGVjaWZpZXJLaW5kKCBhU3BlY2lmaWVyS2luZCApLAorCW1NaW5pbXVtU2l6ZSggMCApLAorCW1NYXhpbXVtU2l6ZSggbWF4U2l6ZSApLAorCW1EYXRhU2l6ZSggYURhdGFTaXplICksCisJbUJpdFNpemUoIGFCaXRTaXplICksCisJbURlZmF1bHRWYWx1ZSggZGVmYXVsdFZhbHVlICksCisJbUNvbnN0cmFpbnQoICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCUJhc2VUeXBlU3BlY2lmaWVyKGF2bV90eXBlX3NwZWNpZmllcl9raW5kX3QgYVNwZWNpZmllcktpbmQsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFUeXBlSUQsIGF2bV9zaXplX3QgbWluU2l6ZSwgYXZtX3NpemVfdCBtYXhTaXplLAorCQkJYXZtX3NpemVfdCBhRGF0YVNpemUsIGF2bV9zaXplX3QgYUJpdFNpemUsIGNvbnN0IEJGICYgZGVmYXVsdFZhbHVlKQorCTogQmFzZUNvbXBpbGVkRm9ybShDTEFTU19LSU5EX1QoIEJhc2VUeXBlU3BlY2lmaWVyICksIGFUeXBlSUQsIGFUeXBlSUQpLAorCW1TcGVjaWZpZXJLaW5kKCBhU3BlY2lmaWVyS2luZCApLAorCW1NaW5pbXVtU2l6ZSggbWluU2l6ZSApLAorCW1NYXhpbXVtU2l6ZSggbWF4U2l6ZSApLAorCW1EYXRhU2l6ZSggYURhdGFTaXplICksCisJbUJpdFNpemUoIGFCaXRTaXplICksCisJbURlZmF1bHRWYWx1ZSggZGVmYXVsdFZhbHVlICksCisJbUNvbnN0cmFpbnQoICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogY29weQorCSAqLworCUJhc2VUeXBlU3BlY2lmaWVyKGNvbnN0IEJhc2VUeXBlU3BlY2lmaWVyICYgYVR5cGVTcGVjaWZpZXIpCisJOiBCYXNlQ29tcGlsZWRGb3JtKCBhVHlwZVNwZWNpZmllciApLAorCW1TcGVjaWZpZXJLaW5kKCBhVHlwZVNwZWNpZmllci5tU3BlY2lmaWVyS2luZCApLAorCW1NaW5pbXVtU2l6ZSggYVR5cGVTcGVjaWZpZXIubU1pbmltdW1TaXplICksCisJbU1heGltdW1TaXplKCBhVHlwZVNwZWNpZmllci5tTWF4aW11bVNpemUgKSwKKwltRGF0YVNpemUoIGFUeXBlU3BlY2lmaWVyLm1EYXRhU2l6ZSApLAorCW1CaXRTaXplKCBhVHlwZVNwZWNpZmllci5tQml0U2l6ZSApLAorCW1EZWZhdWx0VmFsdWUoIGFUeXBlU3BlY2lmaWVyLm1EZWZhdWx0VmFsdWUgKSwKKwltQ29uc3RyYWludCggYVR5cGVTcGVjaWZpZXIubUNvbnN0cmFpbnQgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBPdGhlcnMKKwkgKi8KKwlCYXNlVHlwZVNwZWNpZmllcihjbGFzc19raW5kX3QgYUNsYXNzS2luZCwKKwkJCWF2bV90eXBlX3NwZWNpZmllcl9raW5kX3QgYVNwZWNpZmllcktpbmQsCisJCQljb25zdCBEYXRhVHlwZSAqIGFDb21waWxlZFR5cGUsIEJhc2VUeXBlU3BlY2lmaWVyICogYVR5cGVTcGVjaWZpZXIpCisJOiBCYXNlQ29tcGlsZWRGb3JtKCBhQ2xhc3NLaW5kLCBOVUxMLCBhQ29tcGlsZWRUeXBlICksCisJbVNwZWNpZmllcktpbmQoIGFTcGVjaWZpZXJLaW5kICksCisJbU1pbmltdW1TaXplKCBhVHlwZVNwZWNpZmllci0+bU1pbmltdW1TaXplICksCisJbU1heGltdW1TaXplKCBhVHlwZVNwZWNpZmllci0+bU1heGltdW1TaXplICksCisJbURhdGFTaXplKCBhVHlwZVNwZWNpZmllci0+bURhdGFTaXplICksCisJbUJpdFNpemUoIGFUeXBlU3BlY2lmaWVyLT5tQml0U2l6ZSApLAorCW1EZWZhdWx0VmFsdWUoIGFUeXBlU3BlY2lmaWVyLT5tRGVmYXVsdFZhbHVlICksCisJbUNvbnN0cmFpbnQoIGFUeXBlU3BlY2lmaWVyLT5tQ29uc3RyYWludCApCisJeworCQl1cGRhdGVGdWxseVF1YWxpZmllZE5hbWVJRCgpOworCX0KKworCUJhc2VUeXBlU3BlY2lmaWVyKGF2bV90eXBlX3NwZWNpZmllcl9raW5kX3QgYVNwZWNpZmllcktpbmQsCisJCQljb25zdCBEYXRhVHlwZSAqIGFDb21waWxlZFR5cGUsIGF2bV9zaXplX3QgbWF4U2l6ZSwKKwkJCWF2bV9zaXplX3QgYURhdGFTaXplLCBhdm1fc2l6ZV90IGFCaXRTaXplLCBjb25zdCBCRiAmIGRlZmF1bHRWYWx1ZSkKKwk6IEJhc2VDb21waWxlZEZvcm0oQ0xBU1NfS0lORF9UKCBCYXNlVHlwZVNwZWNpZmllciApLCBOVUxMLCBhQ29tcGlsZWRUeXBlKSwKKwltU3BlY2lmaWVyS2luZCggYVNwZWNpZmllcktpbmQgKSwKKwltTWluaW11bVNpemUoIDAgKSwKKwltTWF4aW11bVNpemUoIG1heFNpemUgKSwKKwltRGF0YVNpemUoIGFEYXRhU2l6ZSApLAorCW1CaXRTaXplKCBhQml0U2l6ZSApLAorCW1EZWZhdWx0VmFsdWUoIGRlZmF1bHRWYWx1ZSApLAorCW1Db25zdHJhaW50KCApCisJeworCQl1cGRhdGVGdWxseVF1YWxpZmllZE5hbWVJRCgpOworCX0KKworCUJhc2VUeXBlU3BlY2lmaWVyKGNsYXNzX2tpbmRfdCBhQ2xhc3NLaW5kLAorCQkJYXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCBhU3BlY2lmaWVyS2luZCwKKwkJCWNvbnN0IE9iamVjdEVsZW1lbnQgKiBhQ29tcGlsZWRUeXBlLCBhdm1fc2l6ZV90IG1heFNpemUsCisJCQlhdm1fc2l6ZV90IGFEYXRhU2l6ZSwgYXZtX3NpemVfdCBhQml0U2l6ZSkKKwk6IEJhc2VDb21waWxlZEZvcm0oYUNsYXNzS2luZCwgTlVMTCwgYUNvbXBpbGVkVHlwZSksCisJbVNwZWNpZmllcktpbmQoIGFTcGVjaWZpZXJLaW5kICksCisJbU1pbmltdW1TaXplKCAwICksCisJbU1heGltdW1TaXplKCBtYXhTaXplICksCisJbURhdGFTaXplKCBhRGF0YVNpemUgKSwKKwltQml0U2l6ZSggYUJpdFNpemUgKSwKKwltRGVmYXVsdFZhbHVlKCApLAorCW1Db25zdHJhaW50KCApCisJeworCQl1cGRhdGVGdWxseVF1YWxpZmllZE5hbWVJRCgpOworCX0KKworCUJhc2VUeXBlU3BlY2lmaWVyKGNsYXNzX2tpbmRfdCBhQ2xhc3NLaW5kLAorCQkJYXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCBhU3BlY2lmaWVyS2luZCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVR5cGVJRCwgYXZtX3NpemVfdCBtYXhTaXplLAorCQkJYXZtX3NpemVfdCBhRGF0YVNpemUsIGF2bV9zaXplX3QgYUJpdFNpemUpCisJOiBCYXNlQ29tcGlsZWRGb3JtKGFDbGFzc0tpbmQsIGFUeXBlSUQsIGFUeXBlSUQpLAorCW1TcGVjaWZpZXJLaW5kKCBhU3BlY2lmaWVyS2luZCApLAorCW1NaW5pbXVtU2l6ZSggMCApLAorCW1NYXhpbXVtU2l6ZSggbWF4U2l6ZSApLAorCW1EYXRhU2l6ZSggYURhdGFTaXplICksCisJbUJpdFNpemUoIGFCaXRTaXplICksCisJbURlZmF1bHRWYWx1ZSggKSwKKwltQ29uc3RyYWludCggKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+QmFzZVR5cGVTcGVjaWZpZXIoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBDb21waWxlZCBPYmplY3RFbGVtZW50IGFzIENvbXBpbGVkIE1hY2hpbmUKKwkgKi8KKwlpbmxpbmUgY29uc3QgRGF0YVR5cGUgKiBnZXRBc3REYXRhVHlwZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldEFzdEVsZW1lbnQoKS0+YXM8IERhdGFUeXBlID4oKSApOworCX0KKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1TcGVjaWZpZXJLaW5kCisJICovCisJaW5saW5lIHZpcnR1YWwgY29uc3QgQmFzZVR5cGVTcGVjaWZpZXIgKiB0aGlzVHlwZVNwZWNpZmllcigpIGNvbnN0CisJeworCQlyZXR1cm4oIHRoaXMgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBhdm1fdHlwZV9zcGVjaWZpZXJfa2luZF90IGdldFR5cGVTcGVjaWZpZXJLaW5kKCkgY29uc3QKKwl7CisJCXJldHVybiggbVNwZWNpZmllcktpbmQgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBib29sIGlzVHlwZVNwZWNpZmllcktpbmQoCisJCQlhdm1fdHlwZV9zcGVjaWZpZXJfa2luZF90IGFTcGVjaWZpZXJLaW5kKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtU3BlY2lmaWVyS2luZCA9PSBhU3BlY2lmaWVyS2luZCApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGJvb2wgaXNUeXBlU3BlY2lmaWVyS2luZChCYXNlVHlwZVNwZWNpZmllciAqIGFUeXBlKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtU3BlY2lmaWVyS2luZCA9PSBhVHlwZS0+bVNwZWNpZmllcktpbmQgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBib29sIGhhc1R5cGVTcGVjaWZpZXJLaW5kKAorCQkJYXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCBhU3BlY2lmaWVyS2luZDEsCisJCQlhdm1fdHlwZV9zcGVjaWZpZXJfa2luZF90IGFTcGVjaWZpZXJLaW5kMikgY29uc3QKKwl7CisJCXJldHVybiggKG1TcGVjaWZpZXJLaW5kID09IGFTcGVjaWZpZXJLaW5kMSkgfHwKKwkJCQkobVNwZWNpZmllcktpbmQgPT0gYVNwZWNpZmllcktpbmQyKSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIGJvb2wgaGFzVHlwZVNwZWNpZmllcktpbmQoCisJCQlhdm1fdHlwZV9zcGVjaWZpZXJfa2luZF90IGFTcGVjaWZpZXJLaW5kMSwKKwkJCWF2bV90eXBlX3NwZWNpZmllcl9raW5kX3QgYVNwZWNpZmllcktpbmQyLAorCQkJYXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCBhU3BlY2lmaWVyS2luZDMpIGNvbnN0CisJeworCQlyZXR1cm4oIChtU3BlY2lmaWVyS2luZCA9PSBhU3BlY2lmaWVyS2luZDEpIHx8CisJCQkJKG1TcGVjaWZpZXJLaW5kID09IGFTcGVjaWZpZXJLaW5kMikgfHwKKwkJCQkobVNwZWNpZmllcktpbmQgPT0gYVNwZWNpZmllcktpbmQzKSApOworCX0KKworCWlubGluZSB2b2lkIHNldFNwZWNpZmllcktpbmQoYXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCBhU3BlY2lmaWVyS2luZCkKKwl7CisJCW1TcGVjaWZpZXJLaW5kID0gYVNwZWNpZmllcktpbmQ7CisJfQorCisKKwkvKioKKwkgKiBTRVRURVIKKwkgKiBtRnVsbHlRdWFsaWZpZWROYW1lSUQKKwkgKi8KKwl2aXJ0dWFsIHZvaWQgdXBkYXRlRnVsbHlRdWFsaWZpZWROYW1lSUQoKTsKKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbU1pbmltdW1TaXplCisJICovCisJaW5saW5lIGF2bV9zaXplX3QgZ2V0TWluaW11bVNpemUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtTWluaW11bVNpemUgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRNaW5pbXVtU2l6ZShhdm1fc2l6ZV90IG1pblNpemUpCisJeworCQltTWluaW11bVNpemUgPSBtaW5TaXplOworCX0KKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1NYXhpbXVtU2l6ZQorCSAqLworCWlubGluZSBhdm1fc2l6ZV90IGdldE1heGltdW1TaXplKCkgY29uc3QKKwl7CisJCXJldHVybiggbU1heGltdW1TaXplICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0TWF4aW11bVNpemUoYXZtX3NpemVfdCBtYXhTaXplKQorCXsKKwkJbU1heGltdW1TaXplID0gbWF4U2l6ZTsKKwl9CisKKworCWlubGluZSBhdm1fc2l6ZV90IHNpemUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtTWF4aW11bVNpemUgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRTaXplKGF2bV9zaXplX3QgbWF4U2l6ZSkKKwl7CisJCW1NYXhpbXVtU2l6ZSA9IG1heFNpemU7CisJfQorCisJLyoqCisJICogU0VUVEVSCisJICogbU1pbmltdW1TaXplCisJICogbU1heGltdW1TaXplCisJICovCisJaW5saW5lIHZvaWQgc2V0U2l6ZShhdm1fc2l6ZV90IG1pblNpemUsIGF2bV9zaXplX3QgbWF4U2l6ZSkKKwl7CisJCW1NaW5pbXVtU2l6ZSA9IG1pblNpemU7CisJCW1NYXhpbXVtU2l6ZSA9IG1heFNpemU7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtRGF0YVNpemUKKwkgKi8KKwlpbmxpbmUgYXZtX3NpemVfdCBnZXREYXRhU2l6ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1EYXRhU2l6ZSApOworCX0KKworCWlubGluZSB2b2lkIHNldERhdGFTaXplKGF2bV9zaXplX3QgYURhdGFTaXplKQorCXsKKwkJbURhdGFTaXplID0gYURhdGFTaXplOworCX0KKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1CaXRTaXplCisJICovCisJaW5saW5lIGF2bV9zaXplX3QgZ2V0Qml0U2l6ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1CaXRTaXplICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0Qml0U2l6ZShhdm1fc2l6ZV90IGFCaXRTaXplKQorCXsKKwkJbUJpdFNpemUgPSBhQml0U2l6ZTsKKwl9CisKKworCS8qKgorCSAqIFNFVFRFUgorCSAqIG1EYXRhU2l6ZQorCSAqLworCWlubGluZSB2aXJ0dWFsIHZvaWQgdXBkYXRlU2l6ZSgpCisJeworCQlBVk1fT1NfRVhJVCggRkFJTEVEICkKKwkJCQk8PCAiVW5leHBlY3RlZCBjYWxsIG9mIHB1cmUgdmlydHVhbCBtZXRob2QgISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKwl9CisKKworCS8qKgorCSAqIENPTlNUUkFJTlQgZ2VuZXJhdGlvbgorCSAqIGZvciBhIGdpdmVuIHBhcmFtZXRlcgorCSAqLworCWJvb2wgY291bGRHZW5lcmF0ZUNvbnN0cmFpbnQoKSBjb25zdDsKKworCWlubGluZSBib29sIGhhc0JpdFNpemVDb25zdHJhaW50KCkgY29uc3QKKwl7CisJCWNvbnN0IGF2bV9zaXplX3QgZGltID0gZ2V0Qml0U2l6ZSgpOworCisJCXJldHVybiggKGRpbSA+IDApICYmIChkaW0gPD0gNjQpICk7CisJfQorCisJYXZtX2ludGVnZXJfdCBtaW5JbnRlZ2VyVmFsdWUoKSBjb25zdDsKKworCWF2bV91aW50ZWdlcl90IG1heEludGVnZXJWYWx1ZSgpIGNvbnN0OworCisJdmlydHVhbCBCRiBnZW5Db25zdHJhaW50KGNvbnN0IEJGICYgYVBhcmFtKSBjb25zdDsKKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbURlZmF1bHRWYWx1ZQorCSAqLworCWlubGluZSBjb25zdCBCRiAmIGdldERlZmF1bHRWYWx1ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1EZWZhdWx0VmFsdWUgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNEZWZhdWx0VmFsdWUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRGVmYXVsdFZhbHVlLnZhbGlkKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXREZWZhdWx0VmFsdWUoY29uc3QgQkYgJiBhRGVmYXVsdFZhbHVlKQorCXsKKwkJbURlZmF1bHRWYWx1ZSA9IGFEZWZhdWx0VmFsdWU7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtQ29uc3RyYWludAorCSAqLworCWlubGluZSBjb25zdCBCRiAmIGdldENvbnN0cmFpbnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQ29uc3RyYWludCApOworCX0KKworCWlubGluZSBib29sIGhhc0NvbnN0cmFpbnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtQ29uc3RyYWludC52YWxpZCgpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2F2ZUNvbnN0cmFpbnQoRWxlbWVudCAqIGFDb25zdHJhaW50KQorCXsKKwkJbUNvbnN0cmFpbnQucmVuZXcoIGFDb25zdHJhaW50ICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0Q29uc3RyYWludChjb25zdCBCRiAmIGFDb25zdHJhaW50KQorCXsKKwkJbUNvbnN0cmFpbnQgPSBhQ29uc3RyYWludDsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIFJlZmVyZWQgKGFzIHR5cGVkZWYpIFR5cGVTcGVjaWZpZXIKKwkgKi8KKwlCYXNlVHlwZVNwZWNpZmllciAqIHJlZmVyZWRUeXBlU3BlY2lmaWVyKCk7CisKKworCS8qKgorCSAqIEZvcm1hdCBhIHZhbHVlIHcuci50LiBpdHMgdHlwZQorCSAqLworCXZpcnR1YWwgdm9pZCBmb3JtYXRTdHJlYW0oT3V0U3RyZWFtICYgb3V0LCBjb25zdCBCRiAmIGJmVmFsdWUpIGNvbnN0OworCisJdmlydHVhbCB2b2lkIGZvcm1hdFN0cmVhbSgKKwkJCU91dFN0cmVhbSAmIG91dCwgY29uc3QgQXJyYXlCRiAmIGFycmF5VmFsdWUpIGNvbnN0OworCisJLyoqCisJICogU2VyaWFsaXphdGlvbgorCSAqLworCWlubGluZSB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHN0clQoKSBjb25zdAorCXsKKwkJaWYoIChtQml0U2l6ZSA9PSAwKSB8fCAoISBpc1R5cGVkTnVtZXJpYygpKSApCisJCXsKKwkJCXJldHVybiggZ2V0TmFtZUlEKCkgKTsKKwkJfQorCQlyZXR1cm4oIE9TUygpIDw8IGdldE5hbWVJRCgpIDw8ICI6IiA8PCBtQml0U2l6ZSApOworCX0KKworCisJdmlydHVhbCB2b2lkIHN0ckhlYWRlcihPdXRTdHJlYW0gJiBvdXQpIGNvbnN0OworCisJdmlydHVhbCB2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG91dCkgY29uc3Q7CisKKwl2aXJ0dWFsIHZvaWQgdG9Gc2NuKE91dFN0cmVhbSAmIG91dCkgY29uc3QKKwl7CisJCXRvU3RyZWFtKG91dCk7CisJfQorCisKK3B1YmxpYzoKKwlzdGF0aWMgc3RkOjpzdHJpbmcgVFlQRV9BTk9NWU1fSUQ7CisKKwlpbmxpbmUgdmlydHVhbCBib29sIGlzQW5vbnltSUQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXROYW1lSUQoKS5lbXB0eSgpIHx8IChnZXROYW1lSUQoKSA9PSBUWVBFX0FOT01ZTV9JRCkgKTsKKwl9CisKK307CisKKworfQorCisjZW5kaWYgLyogQkFTRVRZUEVTUEVDSUZJRVJfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90eXBlL0Nob2ljZVR5cGVTcGVjaWZpZXIuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3R5cGUvQ2hvaWNlVHlwZVNwZWNpZmllci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU1NTIwYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90eXBlL0Nob2ljZVR5cGVTcGVjaWZpZXIuY3BwCkBAIC0wLDAgKzEsNjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyMiBqdWluIDIwMTYKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBJbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkNob2ljZVR5cGVTcGVjaWZpZXIuaCIKKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoqCisgKiBTZXJpYWxpemF0aW9uCisgKi8KK3ZvaWQgQ2hvaWNlVHlwZVNwZWNpZmllcjo6dG9TdHJlYW0oT3V0U3RyZWFtICYgb3V0KSBjb25zdAoreworCWlmKCBvdXQucHJlZmVyYWJseUZRTigpICkKKwl7CisJCW91dCA8PCBUQUIgPDwgZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsKKworCQlBVk1fREVCVUdfUkVGX0NPVU5URVIob3V0KTsKKworCQlyZXR1cm47CisJfQorCisJb3V0IDw8IFRBQiA8PCAidHlwZSAiIDw8IGdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIiBjaG9pY2UgeyIgPDwgRU9MOworCitBVk1fSUZfREVCVUdfRkxBRyggQ09NUElMSU5HICkKKwlpZiggaGFzQXN0RWxlbWVudCgpICkKKwl7CisJCW91dCA8PCBUQUIyIDw8ICIvL2NvbXBpbGVkID0gIgorCQkJPDwgZ2V0QXN0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiOyIgPDwgRU9MOworCX0KK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBDT01QSUxJTkcgKQorCisKKwlvdXQgPDwgVEFCIDw8ICJwcm9wZXJ0eToiIDw8IEVPTAorCisJCTw8IFRBQjIgPDwgInNpemUgPSAiIDw8IHNpemUoKSA8PCAiOyIgPDwgRU9MCisJCTw8IFRBQjIgPDwgImRhdGFfc2l6ZSA9ICIgPDwgZ2V0RGF0YVNpemUoKSA8PCAiOyIgPDwgRU9MCisJCTw8IFRBQjIgPDwgImJpdF9zaXplID0gIiA8PCBnZXRCaXRTaXplKCkgPDwgIjsiIDw8IEVPTAorCisJCTw8IFRBQiA8PCAiY2hvaWNlOiIgPDwgRU9MX0lOQ1JfSU5ERU5UOworCisJZ2V0U3ltYm9sRGF0YSgpLnRvU3RyZWFtKG91dCk7CisKKwlpZiggaGFzQ29uc3RyYWludCgpICkKKwl7CisJCW91dCA8PCBUQUIyIDw8ICJAY29uc3RyYWludCB7IiA8PCBFT0xfSU5DUjJfSU5ERU5UOworCQlnZXRDb25zdHJhaW50KCkudG9TdHJlYW0ob3V0KTsKKwkJb3V0IDw8IERFQ1IyX0lOREVOVF9UQUIyIDw8ICJ9IiA8PCBFT0w7CisJfQorCisJb3V0IDw8IERFQ1JfSU5ERU5UX1RBQiA8PCAifSIgPDwgRU9MX0ZMVVNIOworfQorCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3R5cGUvQ2hvaWNlVHlwZVNwZWNpZmllci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3R5cGUvQ2hvaWNlVHlwZVNwZWNpZmllci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5M2EwYzQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvdHlwZS9DaG9pY2VUeXBlU3BlY2lmaWVyLmgKQEAgLTAsMCArMSw2NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDIyIGp1aW4gMjAxNgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIEltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEZNTF9UWVBFX0NIT0lDRVRZUEVTUEVDSUZJRVJfSF8KKyNkZWZpbmUgRk1MX1RZUEVfQ0hPSUNFVFlQRVNQRUNJRklFUl9IXworCisjaW5jbHVkZSA8Zm1sL3R5cGUvQmFzZVN5bWJvbFR5cGVTcGVjaWZpZXIuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKK2NsYXNzIERhdGFUeXBlOworCisKK2NsYXNzIENob2ljZVR5cGVTcGVjaWZpZXIgOiBwdWJsaWMgQmFzZVN5bWJvbFR5cGVTcGVjaWZpZXIgLAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIFVuaW9uVHlwZVNwZWNpZmllciApCit7CisKKwlBVk1fREVDTEFSRV9VTkNMT05BQkxFX0NMQVNTKENob2ljZVR5cGVTcGVjaWZpZXIpCisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUNob2ljZVR5cGVTcGVjaWZpZXIoRGF0YVR5cGUgKiBhQ29tcGlsZWRUeXBlKQorCTogQmFzZVN5bWJvbFR5cGVTcGVjaWZpZXIoQ0xBU1NfS0lORF9UKCBDaG9pY2VUeXBlU3BlY2lmaWVyICksCisJCQlUWVBFX1VOSU9OX1NQRUNJRklFUiwgYUNvbXBpbGVkVHlwZSwgMSwgMSwgMCkKKwl7CisJCS8vISEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5DaG9pY2VUeXBlU3BlY2lmaWVyKCkKKwl7CisJCS8vISEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwl2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG91dCkgY29uc3Q7CisKKworfTsKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKiBGTUxfVFlQRV9DSE9JQ0VUWVBFU1BFQ0lGSUVSX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvdHlwZS9DbGFzc1R5cGVTcGVjaWZpZXIuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3R5cGUvQ2xhc3NUeXBlU3BlY2lmaWVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTNiNDExCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3R5cGUvQ2xhc3NUeXBlU3BlY2lmaWVyLmNwcApAQCAtMCwwICsxLDEwMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDcgYW/Du3QgMjAwOAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQ2xhc3NUeXBlU3BlY2lmaWVyLmgiCisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9CdWlsdGluQXJyYXkuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoqCisgKiBGb3JtYXQgYSB2YWx1ZSB3LnIudC4gaXRzIHR5cGUKKyAqLwordm9pZCBDbGFzc1R5cGVTcGVjaWZpZXI6OmZvcm1hdFN0cmVhbSgKKwkJT3V0U3RyZWFtICYgb3V0LCBjb25zdCBBcnJheUJGICYgYXJyYXlWYWx1ZSkgY29uc3QKK3sKKwlvdXQgPDwgb3V0LlZBTFVFX1NUUlVDVF9DU1MuQkVHSU47CisKKwlhdm1fc2l6ZV90IG9mZnNldCA9IDE7CisJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBnZXRTeW1ib2xEYXRhKCkuYmVnaW4oKTsKKwlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBpdEVuZCA9IGdldFN5bWJvbERhdGEoKS5lbmQoKTsKKwlpZiggaXQgIT0gaXRFbmQgKQorCXsKKwkJKCppdCkuZ2V0VHlwZVNwZWNpZmllcigpLT5mb3JtYXRTdHJlYW0ob3V0LCBhcnJheVZhbHVlWzBdKTsKKworCQlmb3IoICsraXQgOyAob2Zmc2V0IDwgYXJyYXlWYWx1ZS5zaXplKCkpICYmIChpdCAhPSBpdEVuZCkgOworCQkJCSsraXQgLCArK29mZnNldCApCisJCXsKKwkJCW91dCA8PCBvdXQuVkFMVUVfU1RSVUNUX0NTUy5TRVBBUkFUT1I7CisJCQkoKml0KS5nZXRUeXBlU3BlY2lmaWVyKCktPmZvcm1hdFN0cmVhbShvdXQsIGFycmF5VmFsdWVbb2Zmc2V0XSk7CisJCX0KKwl9CisKKwlmb3IoIDsgb2Zmc2V0IDwgYXJyYXlWYWx1ZS5zaXplKCkgOyArK29mZnNldCApCisJeworCQlvdXQgPDwgb3V0LlZBTFVFX1NUUlVDVF9DU1MuU0VQQVJBVE9SIDw8IGFycmF5VmFsdWVbb2Zmc2V0XS5zdHIoKTsKKwl9CisKKwlvdXQgPDwgb3V0LlZBTFVFX1NUUlVDVF9DU1MuRU5EIDsKK30KKworCisvKioKKyAqIFNlcmlhbGl6YXRpb24KKyAqLwordm9pZCBDbGFzc1R5cGVTcGVjaWZpZXI6OnRvU3RyZWFtKE91dFN0cmVhbSAmIG91dCkgY29uc3QKK3sKKwlpZiggb3V0LnByZWZlcmFibHlGUU4oKSApCisJeworCQlvdXQgPDwgVEFCIDw8IGdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7CisKKwkJQVZNX0RFQlVHX1JFRl9DT1VOVEVSKG91dCk7CisKKwkJcmV0dXJuOworCX0KKworCW91dCA8PCBUQUIgPDwgInR5cGUgIiA8PCBnZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCTw8ICgoaXNUeXBlZFVuaW9uKCkpPyAiIHVuaW9uIiA6ICIgc3RydWN0IikgPDwgIiB7IiA8PCBFT0w7CisKK0FWTV9JRl9ERUJVR19GTEFHKCBDT01QSUxJTkcgKQorCWlmKCBoYXNBc3RFbGVtZW50KCkgKQorCXsKKwkJb3V0IDw8IFRBQjIgPDwgIi8vY29tcGlsZWQgPSAiCisJCQk8PCBnZXRBc3RGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8ICI7IiA8PCBFT0w7CisJfQorQVZNX0VORElGX0RFQlVHX0ZMQUcoIENPTVBJTElORyApCisKK0FWTV9JRl9ERUJVR19GTEFHKCBEQVRBICkKKwlvdXQgPDwgVEFCIDw8ICJwcm9wZXJ0eToiIDw8IEVPTAorCisJCTw8IFRBQjIgPDwgInNpemUgPSAiIDw8IHNpemUoKSA8PCAiOyIgPDwgIiAgICIvKkVPTDsKKwkJPDwgVEFCMiovIDw8ICJkYXRhX3NpemUgPSAiIDw8IGdldERhdGFTaXplKCkgPDwgIjsiIDw8ICIgICAiLypFT0w7CisJCTw8IFRBQjIqLyA8PCAiYml0X3NpemUgPSAiIDw8IGdldEJpdFNpemUoKSA8PCAiOyIgPDwgRU9MCisKKwkJPDwgVEFCIDw8ICJhdHRyaWJ1dGU6IiA8PCBFT0w7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggREFUQSApCisKKwlpZiggaGFzQ29uc3RyYWludCgpICkKKwl7CisJCW91dCA8PCBUQUIyIDw8ICJAY29uc3RyYWludCB7IiA8PCBFT0xfSU5DUjJfSU5ERU5UOworCQlnZXRDb25zdHJhaW50KCkudG9TdHJlYW0ob3V0KTsKKwkJb3V0IDw8IERFQ1IyX0lOREVOVF9UQUIyIDw8ICJ9IiA8PCBFT0w7CisJfQorCQorCW91dCA8PCBpbmNyX3N0cmVhbSggZ2V0U3ltYm9sRGF0YSgpICkgPDwgVEFCIDw8ICJ9IiA8PCBFT0xfRkxVU0g7Cit9CisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3R5cGUvQ2xhc3NUeXBlU3BlY2lmaWVyLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvdHlwZS9DbGFzc1R5cGVTcGVjaWZpZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmYzYmJjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3R5cGUvQ2xhc3NUeXBlU3BlY2lmaWVyLmgKQEAgLTAsMCArMSw3NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDcgYW/Du3QgMjAwOAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIENMQVNTVFlQRVNQRUNJRklFUl9IXworI2RlZmluZSBDTEFTU1RZUEVTUEVDSUZJRVJfSF8KKworI2luY2x1ZGUgPGZtbC90eXBlL0Jhc2VTeW1ib2xUeXBlU3BlY2lmaWVyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBBcnJheUJGOworCitjbGFzcyBEYXRhVHlwZTsKKworCitjbGFzcyBDbGFzc1R5cGVTcGVjaWZpZXIgOiBwdWJsaWMgQmFzZVN5bWJvbFR5cGVTcGVjaWZpZXIgLAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIENsYXNzVHlwZVNwZWNpZmllciApCit7CisKKwlBVk1fREVDTEFSRV9VTkNMT05BQkxFX0NMQVNTKENsYXNzVHlwZVNwZWNpZmllcikKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQ2xhc3NUeXBlU3BlY2lmaWVyKERhdGFUeXBlICogYUNvbXBpbGVkVHlwZSwKKwkJCWF2bV90eXBlX3NwZWNpZmllcl9raW5kX3QgYVNwZWNpZmllcktpbmQgPSBUWVBFX0NMQVNTX1NQRUNJRklFUikKKwk6IEJhc2VTeW1ib2xUeXBlU3BlY2lmaWVyKENMQVNTX0tJTkRfVCggQ2xhc3NUeXBlU3BlY2lmaWVyICksCisJCQlhU3BlY2lmaWVyS2luZCwgYUNvbXBpbGVkVHlwZSwgMSwgMSwgMCkKKwl7CisJCS8vISEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5DbGFzc1R5cGVTcGVjaWZpZXIoKQorCXsKKwkJLy8hISEgTk9USElORworCX0KKworCisJLyoqCisJICogRm9ybWF0IGEgdmFsdWUgdy5yLnQuIGl0cyB0eXBlCisJICovCisJdmlydHVhbCB2b2lkIGZvcm1hdFN0cmVhbSgKKwkJCU91dFN0cmVhbSAmIG91dCwgY29uc3QgQXJyYXlCRiAmIGFycmF5VmFsdWUpIGNvbnN0OworCisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvdXQpIGNvbnN0OworCit9OworCisKK30KKworI2VuZGlmIC8qIENMQVNTVFlQRVNQRUNJRklFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3R5cGUvQ29udGFpbmVyVHlwZVNwZWNpZmllci5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvdHlwZS9Db250YWluZXJUeXBlU3BlY2lmaWVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDhhNmNlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3R5cGUvQ29udGFpbmVyVHlwZVNwZWNpZmllci5jcHAKQEAgLTAsMCArMSwyMzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiA3IGFvw7t0IDIwMDgKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkNvbnRhaW5lclR5cGVTcGVjaWZpZXIuaCIKKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0J1aWx0aW5BcnJheS5oPgorCisjaW5jbHVkZSA8Zm1sL3R5cGUvVHlwZU1hbmFnZXIuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoqCisgKiBDT05TVFJBSU5UIGdlbmVyYXRpb24KKyAqIGZvciBhIGdpdmVuIHBhcmFtZXRlcgorICovCitCRiBDb250YWluZXJUeXBlU3BlY2lmaWVyOjpnZW5Db25zdHJhaW50KGNvbnN0IEJGICYgYVBhcmFtKSBjb25zdAoreworCWlmKCBoYXNDb25zdHJhaW50KCkgKQorCXsKKwkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQk8PCAiVE9ETyA8PCBDb250YWluZXJUeXBlU3BlY2lmaWVyOjpnZW5Db25zdHJhaW50KCAiCisJCQkJPDwgYVBhcmFtIDw8ICIgKSA+PiB3aXRoIGNvbXBpbGVkIGNvbnN0cmFpbnQ6IiA8PCBzdGQ6OmVuZGwKKwkJCQk8PCBnZXRDb25zdHJhaW50KCkKKwkJCQk8PCBTRU5EX0VYSVQ7CisJfQorCisJc3dpdGNoKCBtU3BlY2lmaWVyS2luZCApCisJeworCQljYXNlIFRZUEVfVElNRV9TUEVDSUZJRVI6CisJCWNhc2UgVFlQRV9ESVNDUkVURV9USU1FX1NQRUNJRklFUjoKKwkJY2FzZSBUWVBFX0NPTlRJTlVPVVNfVElNRV9TUEVDSUZJRVI6CisJCXsKKwkJCWlmKCBtQ29udGVudHNUeXBlU3BlY2lmaWVyLnZhbGlkKCkgKQorCQkJeworCQkJCXJldHVybiggbUNvbnRlbnRzVHlwZVNwZWNpZmllci5nZW5Db25zdHJhaW50KGFQYXJhbSkgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9UUlVFICk7CisJCQl9CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9UUlVFICk7CisJCX0KKwl9Cit9CisKKworLyoqCisgKiBGb3JtYXQgYSB2YWx1ZSB3LnIudC4gaXRzIHR5cGUKKyAqLwordm9pZCBDb250YWluZXJUeXBlU3BlY2lmaWVyOjpmb3JtYXRTdHJlYW0oCisJCU91dFN0cmVhbSAmIG9zLCBjb25zdCBBcnJheUJGICYgYXJyYXlWYWx1ZSkgY29uc3QKK3sKKwljb25zdCBTeW1iZXhWYWx1ZUNTUyAmIFZBTFVFX0NTUyA9ICggaXNUeXBlZEFycmF5KCkgPworCQkJb3MuVkFMVUVfQVJSQVlfQ1NTIDogb3MuVkFMVUVfU1RSVUNUX0NTUyApOworCisJb3MgPDwgVkFMVUVfQ1NTLkJFR0lOOworCisJbUNvbnRlbnRzVHlwZVNwZWNpZmllci5mb3JtYXRTdHJlYW0ob3MsIGFycmF5VmFsdWVbMF0pOworCWZvciggYXZtX3NpemVfdCBvZmZzZXQgPSAxIDsgb2Zmc2V0IDwgYXJyYXlWYWx1ZS5zaXplKCkgOyArK29mZnNldCApCisJeworCQlvcyA8PCBWQUxVRV9DU1MuU0VQQVJBVE9SOworCQltQ29udGVudHNUeXBlU3BlY2lmaWVyLmZvcm1hdFN0cmVhbShvcywgYXJyYXlWYWx1ZVtvZmZzZXRdKTsKKwl9CisKKwlvcyA8PCBWQUxVRV9DU1MuRU5EOworfQorCisKKy8qKgorICogU2VyaWFsaXphdGlvbgorICovCitzdGQ6OnN0cmluZyBDb250YWluZXJUeXBlU3BlY2lmaWVyOjpzdHJTcGVjaWZpZXJLaW5nKAorCQlhdm1fdHlwZV9zcGVjaWZpZXJfa2luZF90IGFTcGVjaWZpZXJLaW5kKQoreworCXN3aXRjaCggYVNwZWNpZmllcktpbmQgKQorCXsKKwkJY2FzZSBUWVBFX0FSUkFZX1NQRUNJRklFUjoKKwkJeworCQkJcmV0dXJuKCAiYXJyYXkiICk7CisJCX0KKworCQljYXNlIFRZUEVfTElTVF9TUEVDSUZJRVI6CisJCXsKKwkJCXJldHVybiggImxpc3QiICk7CisJCX0KKwkJY2FzZSBUWVBFX1ZFQ1RPUl9TUEVDSUZJRVI6CisJCXsKKwkJCXJldHVybiggInZlY3RvciIgKTsKKwkJfQorCQljYXNlIFRZUEVfUkVWRVJTRV9WRUNUT1JfU1BFQ0lGSUVSOgorCQl7CisJCQlyZXR1cm4oICJydmVjdG9yIiApOworCQl9CisKKwkJY2FzZSBUWVBFX0ZJRk9fU1BFQ0lGSUVSOgorCQl7CisJCQlyZXR1cm4oICJmaWZvIiApOworCQl9CisJCWNhc2UgVFlQRV9MSUZPX1NQRUNJRklFUjoKKwkJeworCQkJcmV0dXJuKCAibGlmbyIgKTsKKwkJfQorCisJCWNhc2UgVFlQRV9NVUxUSV9GSUZPX1NQRUNJRklFUjoKKwkJeworCQkJcmV0dXJuKCAibXVsdGlmaWZvIiApOworCQl9CisJCWNhc2UgVFlQRV9NVUxUSV9MSUZPX1NQRUNJRklFUjoKKwkJeworCQkJcmV0dXJuKCAibXVsdGlsaWZvIiApOworCQl9CisKKwkJY2FzZSBUWVBFX1NFVF9TUEVDSUZJRVI6CisJCXsKKwkJCXJldHVybiggInNldCIgKTsKKwkJfQorCisJCWNhc2UgVFlQRV9NVUxUSVNFVF9TUEVDSUZJRVI6CisJCXsKKwkJCXJldHVybiggIm11bHRpc2V0IiApOworCQl9CisKKwkJY2FzZSBUWVBFX0NMT0NLX1NQRUNJRklFUjoKKwkJeworCQkJcmV0dXJuKCAiY2xvY2siICk7CisJCX0KKwkJY2FzZSBUWVBFX1RJTUVfU1BFQ0lGSUVSOgorCQl7CisJCQlyZXR1cm4oICJ0aW1lIiApOworCQl9CisJCWNhc2UgVFlQRV9DT05USU5VT1VTX1RJTUVfU1BFQ0lGSUVSOgorCQl7CisJCQlyZXR1cm4oICJjdGltZSIgKTsKKwkJfQorCQljYXNlIFRZUEVfRElTQ1JFVEVfVElNRV9TUEVDSUZJRVI6CisJCXsKKwkJCXJldHVybiggImR0aW1lIiApOworCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJcmV0dXJuKCAiY29udGFpbmVyPD8+IiApOworCQl9CisJfQorfQorCitzdGQ6OnN0cmluZyBDb250YWluZXJUeXBlU3BlY2lmaWVyOjpzdHJUeXBlKCkgY29uc3QKK3sKKwlzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisKKwlpZiggaXNUeXBlZEFycmF5KCkgKQorCXsKKwkJb3MgPDwgbUNvbnRlbnRzVHlwZVNwZWNpZmllci5zdHJUKCkgPDwgIlsgIiA8PCBtTWF4aW11bVNpemUgPDwgIiBdIjsKKwl9CisJZWxzZSBpZiggaXNUeXBlZENsb2NrVGltZSgpICYmIChtTWF4aW11bVNpemUgPT0gMSkgKQorCXsKKwkJb3MgIDw8IENvbnRhaW5lclR5cGVTcGVjaWZpZXI6OnN0clNwZWNpZmllcktpbmcobVNwZWNpZmllcktpbmQpCisvLwkJCTw8ICIgIiA8PCBtQ29udGVudHNUeXBlU3BlY2lmaWVyLnN0clQoKTsKKwkJCTw8ICI8ICIgPDwgbUNvbnRlbnRzVHlwZVNwZWNpZmllci5zdHJUKCkgPDwgIiA+IjsKKwl9CisJZWxzZQorCXsKKwkJb3MgIDw8IENvbnRhaW5lclR5cGVTcGVjaWZpZXI6OnN0clNwZWNpZmllcktpbmcobVNwZWNpZmllcktpbmQpCisJCQk8PCAiPCAiIDw8IG1Db250ZW50c1R5cGVTcGVjaWZpZXIuc3RyVCgpOworCQlpZiggbU1heGltdW1TaXplID49IDAgKQorCQl7CisJCQlvcyA8PCAiICwgIiA8PCBtTWF4aW11bVNpemU7CisJCX0KKwkJb3MgPDwgIiA+IjsKKwl9CisJLyoqCisJICogU2VyaWFsaXphdGlvbgorCSAqLworCisJcmV0dXJuKCBvcy5zdHIoKSApOworfQorCisKK3ZvaWQgQ29udGFpbmVyVHlwZVNwZWNpZmllcjo6dG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJaWYoIG9zLnByZWZlcmFibHlGUU4oKSApCisJeworCQlvcyA8PCBUQUIgPDwgZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsKKworCQlBVk1fREVCVUdfUkVGX0NPVU5URVIob3MpOworCisJCXJldHVybjsKKwl9CisKKwlvcyA8PCBUQUIgPDwgInR5cGUgIiA8PCBnZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8ICIgIiA8PCBzdHJUeXBlKCk7CisKKwlvcyA8PCAiIHsiIDw8IEVPTDsKKworCW9zIDw8IFRBQiA8PCAicHJvcGVydHk6IiA8PCBFT0w7CisKKwkvL29zIDw8IFRBQjIgPDwgInNpemUgPSAiIDw8IHNpemUoKSA8PCAiOyIgPDwgRU9MOworCisJb3MgPDwgVEFCMiA8PCAiZGF0YV9zaXplID0gIiA8PCBnZXREYXRhU2l6ZSgpIDw8ICI7IiA8PCAiICAgIi8qRU9MOworCisJb3MgPDwgVEFCMiovIDw8ICJiaXRfc2l6ZSA9ICIgPDwgZ2V0Qml0U2l6ZSgpIDw8ICI7IiA8PCBFT0w7CisKKwlpZiggaGFzQ29uc3RyYWludCgpICkKKwl7CisJCW9zIDw8IFRBQjIgPDwgIkBjb25zdHJhaW50IHsiIDw8IEVPTF9JTkNSMl9JTkRFTlQ7CisJCWdldENvbnN0cmFpbnQoKS50b1N0cmVhbShvcyk7CisJCW9zIDw8IERFQ1IyX0lOREVOVF9UQUIyIDw8ICJ9IiA8PCBFT0w7CisJfQorCisJb3MgPDwgVEFCIDw8ICJ9IiA8PCBFT0xfRkxVU0g7Cit9CisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3R5cGUvQ29udGFpbmVyVHlwZVNwZWNpZmllci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3R5cGUvQ29udGFpbmVyVHlwZVNwZWNpZmllci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MmUyMDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvdHlwZS9Db250YWluZXJUeXBlU3BlY2lmaWVyLmgKQEAgLTAsMCArMSwxNTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiA3IGFvw7t0IDIwMDgKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBDT05UQUlORVJUWVBFU1BFQ0lGSUVSX0hfCisjZGVmaW5lIENPTlRBSU5FUlRZUEVTUEVDSUZJRVJfSF8KKworI2luY2x1ZGUgPGZtbC90eXBlL0Jhc2VUeXBlU3BlY2lmaWVyLmg+CisKKyNpbmNsdWRlIDxmbWwvdHlwZS9UeXBlU3BlY2lmaWVyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIEFycmF5QkY7CitjbGFzcyBEYXRhVHlwZTsKKworCitjbGFzcyBDb250YWluZXJUeXBlU3BlY2lmaWVyIDogcHVibGljIEJhc2VUeXBlU3BlY2lmaWVyICwKKwkJQVZNX0lOSkVDVF9JTlNUQU5DRV9DT1VOVEVSX0NMQVNTKCBDb250YWluZXJUeXBlU3BlY2lmaWVyICkKK3sKKworCUFWTV9ERUNMQVJFX1VOQ0xPTkFCTEVfQ0xBU1MoQ29udGFpbmVyVHlwZVNwZWNpZmllcikKKworCitwcm90ZWN0ZWQ6CisJLyoKKwkgKiBBVFRSSUJVVEVTCisJICovCisJLy8gdGhlIFR5cGUgU3BlY2lmaWVyCisJVHlwZVNwZWNpZmllciBtQ29udGVudHNUeXBlU3BlY2lmaWVyOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlDb250YWluZXJUeXBlU3BlY2lmaWVyKGF2bV90eXBlX3NwZWNpZmllcl9raW5kX3QgYVNwZWNpZmllcktpbmQsCisJCQlEYXRhVHlwZSAqIGFDb21waWxlZFR5cGUsCisJCQljb25zdCBUeXBlU3BlY2lmaWVyICYgYVR5cGVTcGVjaWZpZXIsIGF2bV9zaXplX3QgYVNpemUpCisJOiBCYXNlVHlwZVNwZWNpZmllcihDTEFTU19LSU5EX1QoIENvbnRhaW5lclR5cGVTcGVjaWZpZXIgKSwKKwkJCWFTcGVjaWZpZXJLaW5kLCBhQ29tcGlsZWRUeXBlLCBhU2l6ZSwKKwkJCWFTaXplICogKGFUeXBlU3BlY2lmaWVyLnZhbGlkKCkgPworCQkJCQlhVHlwZVNwZWNpZmllci5nZXREYXRhU2l6ZSgpIDogMSkgKyAxLCAwKSwKKwltQ29udGVudHNUeXBlU3BlY2lmaWVyKCBhVHlwZVNwZWNpZmllciApCisJeworCQkvLyEhISBOT1RISU5HCisJfQorCisJQ29udGFpbmVyVHlwZVNwZWNpZmllcihhdm1fdHlwZV9zcGVjaWZpZXJfa2luZF90IGFTcGVjaWZpZXJLaW5kLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhVHlwZUlELCBjb25zdCBUeXBlU3BlY2lmaWVyICYgYVR5cGVTcGVjaWZpZXIsCisJCQlhdm1fc2l6ZV90IGFTaXplKQorCTogQmFzZVR5cGVTcGVjaWZpZXIoQ0xBU1NfS0lORF9UKCBDb250YWluZXJUeXBlU3BlY2lmaWVyICksCisJCQlhU3BlY2lmaWVyS2luZCwgYVR5cGVJRCwgYVNpemUsCisJCQlhU2l6ZSAqIChhVHlwZVNwZWNpZmllci52YWxpZCgpID8KKwkJCQkJYVR5cGVTcGVjaWZpZXIuZ2V0RGF0YVNpemUoKSA6IDEpICsgMSwgMCksCisJbUNvbnRlbnRzVHlwZVNwZWNpZmllciggYVR5cGVTcGVjaWZpZXIgKQorCXsKKwkJLy8hISEgTk9USElORworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkNvbnRhaW5lclR5cGVTcGVjaWZpZXIoKQorCXsKKwkJLy8hISEgTk9USElORworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUNvbnRlbnRzVHlwZVNwZWNpZmllcgorCSAqLworCWlubGluZSBjb25zdCBUeXBlU3BlY2lmaWVyICYgZ2V0Q29udGVudHNUeXBlU3BlY2lmaWVyKCkgY29uc3QKKwl7CisJCXJldHVybiggbUNvbnRlbnRzVHlwZVNwZWNpZmllciApOworCX0KKworCWlubGluZSBib29sIGhhc0NvbnRlbnRzVHlwZVNwZWNpZmllcigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Db250ZW50c1R5cGVTcGVjaWZpZXIudmFsaWQoKSApOworCX0KKworCWlubGluZSB2b2lkIHNldENvbnRlbnRzVHlwZVNwZWNpZmllcihjb25zdCBUeXBlU3BlY2lmaWVyICYgYVR5cGVTcGVjaWZpZXIpCisJeworCQltQ29udGVudHNUeXBlU3BlY2lmaWVyID0gYVR5cGVTcGVjaWZpZXI7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiB0aGUgQmxvYyBEYXRhIFNpemUKKwkgKi8KKwlpbmxpbmUgYXZtX3NpemVfdCBic2l6ZSgpCisJeworCQlyZXR1cm4oIG1Db250ZW50c1R5cGVTcGVjaWZpZXIudmFsaWQoKSA/CisJCQkJbUNvbnRlbnRzVHlwZVNwZWNpZmllci5nZXREYXRhU2l6ZSgpIDogMSApOworCX0KKworCisJLyoqCisJICogQ09OU1RSQUlOVCBnZW5lcmF0aW9uCisJICogZm9yIGEgZ2l2ZW4gcGFyYW1ldGVyCisJICovCisJQkYgZ2VuQ29uc3RyYWludChjb25zdCBCRiAmIGFQYXJhbSkgY29uc3Q7CisKKworCS8qKgorCSAqIEZvcm1hdCBhIHZhbHVlIHcuci50LiBpdHMgdHlwZQorCSAqLworCWlubGluZSB2aXJ0dWFsIHZvaWQgZm9ybWF0U3RyZWFtKAorCQkJT3V0U3RyZWFtICYgb3MsIGNvbnN0IEFycmF5QkYgJiBhcnJheVZhbHVlKSBjb25zdDsKKworCisJLyoqCisJICogU2VyaWFsaXphdGlvbgorCSAqLworCXN0YXRpYyBzdGQ6OnN0cmluZyBzdHJTcGVjaWZpZXJLaW5nKGF2bV90eXBlX3NwZWNpZmllcl9raW5kX3QgYVNwZWNpZmllcktpbmQpOworCisJc3RkOjpzdHJpbmcgc3RyVHlwZSgpIGNvbnN0OworCisJc3RkOjpzdHJpbmcgc3RyVCgpIGNvbnN0CisJeworCQlyZXR1cm4oIGlzQW5vbnltSUQoKSA/IHN0clR5cGUoKSA6IGdldE5hbWVJRCgpICk7CisJfQorCisJdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKK307CisKKworfQorCisjZW5kaWYgLyogQ09OVEFJTkVSQ09OVEFJTkVSVFlQRVNQRUNJRklFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3R5cGUvRW51bVR5cGVTcGVjaWZpZXIuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3R5cGUvRW51bVR5cGVTcGVjaWZpZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMThjMDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvdHlwZS9FbnVtVHlwZVNwZWNpZmllci5jcHAKQEAgLTAsMCArMSwzMDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiA3IGFvw7t0IDIwMDgKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkVudW1UeXBlU3BlY2lmaWVyLmgiCisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29uc3RhbnQuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29uc3RydWN0b3JJbXBsLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorICogU0VUVEVSCisgKiBtQm91bmQKKyAqLwordm9pZCBFbnVtVHlwZVNwZWNpZmllcjo6dXBkYXRlQm91bmQoKQoreworCWF2bV9pbnRlZ2VyX3QgbWluID0gMDsKKwlhdm1faW50ZWdlcl90IG1heCA9IDA7CisKKwltSW50ZWdlckVudW1lcmF0aW9uRmxhZyA9IHRydWU7CisKKwlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBpdCA9IGdldFN5bWJvbERhdGEoKS5iZWdpbigpOworCVRhYmxlT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gZ2V0U3ltYm9sRGF0YSgpLmVuZCgpOworCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCXsKKwkJaWYoICgqaXQpLmdldFZhbHVlKCkuaXNXZWFrSW50ZWdlcigpICkKKwkJeworCQkJaWYoICgqaXQpLmdldFZhbHVlKCkudG9JbnRlZ2VyKCkgPCBtaW4gKQorCQkJeworCQkJCW1pbiA9ICgqaXQpLmdldFZhbHVlKCkudG9JbnRlZ2VyKCk7CisJCQl9CisJCQlpZiggKCppdCkuZ2V0VmFsdWUoKS50b0ludGVnZXIoKSA+IG1heCApCisJCQl7CisJCQkJbWF4ID0gKCppdCkuZ2V0VmFsdWUoKS50b0ludGVnZXIoKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmKCBtSW50ZWdlckVudW1lcmF0aW9uRmxhZyApCisJCXsKKwkJCW1JbnRlZ2VyRW51bWVyYXRpb25GbGFnID0gZmFsc2U7CisJCQlnZXR3TW9kaWZpZXIoKS5zZXRGZWF0dXJlVW5zYWZlKHRydWUpOworCQl9CisJfQorCisJbUluZmltdW0gID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yTmF0aXZlOjpuZXdJbnRlZ2VyKG1pbik7CisJbVN1cHJlbXVtID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yTmF0aXZlOjpuZXdJbnRlZ2VyKG1heCk7Cit9CisKKwordm9pZCBFbnVtVHlwZVNwZWNpZmllcjo6dXBkYXRlQm91bmQoYXZtX2ludGVnZXJfdCBtaW4sIGF2bV9pbnRlZ2VyX3QgbWF4KQoreworCW1JbmZpbXVtICA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6bmV3SW50ZWdlcihtaW4pOworCW1TdXByZW11bSA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6bmV3SW50ZWdlcihtYXgpOworCisJbUludGVnZXJFbnVtZXJhdGlvbkZsYWcgPSB0cnVlOworfQorCisKKy8qKgorICogR0VUVEVSCisgKiBuZXdmcmVzaCBFbnVtIFZhbHVlCisgKi8KK0JGIEVudW1UeXBlU3BlY2lmaWVyOjpuZXdmcmVzaFN5bWJvbFZhbHVlKCkKK3sKKwlpZiggZ2V0U3ltYm9sRGF0YSgpLm5vbmVtcHR5KCkgKQorCXsKKwkJQkYgbmV3ZnJlc2hWYWwgPSBnZXRTeW1ib2xEYXRhKCkubGFzdCgpLmdldFZhbHVlKCk7CisKKwkJaWYoIG5ld2ZyZXNoVmFsLmlzV2Vha0ludGVnZXIoKSApCisJCXsKKwkJCW5ld2ZyZXNoVmFsLmluY3JFeHByKCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQluZXdmcmVzaFZhbCA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6CisJCQkJCW5ld1VJbnRlZ2VyKGdldFN5bWJvbERhdGEoKS5zaXplKCkgKTsKKwkJfQorCisJCXdoaWxlKCBnZXRTeW1ib2xEYXRhQnlWYWx1ZSggbmV3ZnJlc2hWYWwgKS52YWxpZCgpICkKKwkJeworCQkJbmV3ZnJlc2hWYWwuaW5jckV4cHIoKTsKKwkJfQorCisJCXJldHVybiggbmV3ZnJlc2hWYWwgKTsKKwl9CisKKwlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6CisJCQluZXdVSW50ZWdlciggZ2V0U3ltYm9sRGF0YSgpLnNpemUoKSApICk7Cit9CisKKworLyoqCisgKiBHRVRURVIgLSBTRVRURVIKKyAqIG1TeW1ib2xEYXRhCisgKi8KK2Jvb2wgRW51bVR5cGVTcGVjaWZpZXI6Omhhc1N5bWJvbERhdGEoSW5zdGFuY2VPZkRhdGEgKiBhU3ltYm9sRGF0YSkgY29uc3QKK3sKKwlpZiggYVN5bWJvbERhdGEtPmdldFR5cGVTcGVjaWZpZXIoKSA9PSB0aGlzICkKKwl7CisJCXJldHVybiggdHJ1ZSApOworCX0KKwllbHNlCisJeworCQlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBpdCA9IGdldFN5bWJvbERhdGEoKS5iZWdpbigpOworCQlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IGdldFN5bWJvbERhdGEoKS5lbmQoKTsKKwkJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJCXsKKwkJCWlmKCAoKml0KSA9PSBhU3ltYm9sRGF0YSApCisJCQl7CisJCQkJcmV0dXJuKCB0cnVlICk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKK2Jvb2wgRW51bVR5cGVTcGVjaWZpZXI6Omhhc1N5bWJvbERhdGEoY29uc3QgQkYgJiBhU3ltYm9sKSBjb25zdAoreworCWlmKCBhU3ltYm9sLmlzPCBJbnN0YW5jZU9mRGF0YSA+KCkgKQorCXsKKwkJcmV0dXJuKCBoYXNTeW1ib2xEYXRhKCBhU3ltYm9sLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpICkgKTsKKwl9CisKKwlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBpdCA9IGdldFN5bWJvbERhdGEoKS5iZWdpbigpOworCVRhYmxlT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gZ2V0U3ltYm9sRGF0YSgpLmVuZCgpOworCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCXsKKwkJaWYoIGFTeW1ib2wuaXNFUSggKml0ICkgKQorCQl7CisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKworCitib29sIEVudW1UeXBlU3BlY2lmaWVyOjpoYXNTeW1ib2xEYXRhV2l0aFZhbHVlKGNvbnN0IEJGICYgYVZhbHVlKSBjb25zdAoreworCVRhYmxlT2ZTeW1ib2w6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZ2V0U3ltYm9sRGF0YSgpLmJlZ2luKCk7CisJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBnZXRTeW1ib2xEYXRhKCkuZW5kKCk7CisJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJeworCQlpZiggYVZhbHVlLmlzRVEoICgqaXQpLmdldFZhbHVlKCkgKSB8fCBhVmFsdWUuaXNFUSggKml0ICkgKQorCQl7CisJCQlyZXR1cm4oIHRydWUgKTsKKwkJfQorCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKworCitjb25zdCBTeW1ib2wgJiBFbnVtVHlwZVNwZWNpZmllcjo6Z2V0U3ltYm9sRGF0YUJ5VmFsdWUoY29uc3QgQkYgJiBhVmFsdWUpIGNvbnN0Cit7CisJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBnZXRTeW1ib2xEYXRhKCkuYmVnaW4oKTsKKwlUYWJsZU9mU3ltYm9sOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IGdldFN5bWJvbERhdGEoKS5lbmQoKTsKKwlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwl7CisJCWlmKCBhVmFsdWUuaXNFUSggKCppdCkuZ2V0VmFsdWUoKSApIHx8IGFWYWx1ZS5pc0VRKCAoKml0KSApICkKKwkJeworCQkJcmV0dXJuKCAoKml0KSApOworCQl9CisJfQorCisJcmV0dXJuKCBTeW1ib2w6OlJFRl9OVUxMICk7Cit9CisKKworYXZtX3NpemVfdCBFbnVtVHlwZVNwZWNpZmllcjo6Z2V0UmFuZG9tU3ltYm9sT2Zmc2V0KCkKK3sKKwlyZXR1cm4oIFJBTkRPTTo6Z2VuX3VpbnQoMCwgZ2V0U3ltYm9sRGF0YSgpLnNpemUoKSAtIDEpICk7Cit9CisKK2NvbnN0IFN5bWJvbCAmIEVudW1UeXBlU3BlY2lmaWVyOjpnZXRSYW5kb21TeW1ib2xEYXRhKCkKK3sKKwlyZXR1cm4oIGdldFN5bWJvbERhdGEoIGdldFJhbmRvbVN5bWJvbE9mZnNldCgpICkgKTsKK30KKworY29uc3QgQkYgJiBFbnVtVHlwZVNwZWNpZmllcjo6Z2V0UmFuZG9tU3ltYm9sVmFsdWUoKQoreworCXJldHVybiggZ2V0UmFuZG9tU3ltYm9sRGF0YSgpLmdldFZhbHVlKCkgKTsKK30KKworCisvKioKKyAqIENPTlNUUkFJTlQgZ2VuZXJhdGlvbgorICogZm9yIGEgZ2l2ZW4gcGFyYW1ldGVyCisgKi8KKworQkYgRW51bVR5cGVTcGVjaWZpZXI6Om1pbkNvbnN0cmFpbnQoY29uc3QgQkYgJiBhUGFyYW0pIGNvbnN0Cit7CisJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3JOYXRpdmU6Omd0ZUV4cHIoYVBhcmFtLCBnZXRJbmZpbXVtKCkpICk7Cit9CisKK0JGIEVudW1UeXBlU3BlY2lmaWVyOjptYXhDb25zdHJhaW50KGNvbnN0IEJGICYgYVBhcmFtKSBjb25zdAoreworCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yTmF0aXZlOjpsdGVFeHByKGFQYXJhbSwgZ2V0U3VwcmVtdW0oKSkgKTsKK30KKworCitCRiBFbnVtVHlwZVNwZWNpZmllcjo6Z2VuQ29uc3RyYWludChjb25zdCBCRiAmIGFQYXJhbSkgY29uc3QKK3sKKwlpZiggaGFzQ29uc3RyYWludCgpICkKKwl7CisJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJPDwgIlRPRE8gPDwgRW51bVR5cGVTcGVjaWZpZXI6OmdlbkNvbnN0cmFpbnQoICIKKwkJCQk8PCBhUGFyYW0gPDwgIiApID4+IHdpdGggY29tcGlsZWQgY29uc3RyYWludDoiIDw8IHN0ZDo6ZW5kbAorCQkJCTw8IGdldENvbnN0cmFpbnQoKQorCQkJCTw8IFNFTkRfRVhJVDsKKwl9CisKKwlpZiggbUludGVnZXJFbnVtZXJhdGlvbkZsYWcgKQorCXsKKwkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3JOYXRpdmU6OmFuZEV4cHIoCisJCQkJRXhwcmVzc2lvbkNvbnN0cnVjdG9yTmF0aXZlOjpndGVFeHByKGFQYXJhbSwgZ2V0SW5maW11bSgpKSwKKwkJCQlFeHByZXNzaW9uQ29uc3RydWN0b3JOYXRpdmU6Omx0ZUV4cHIoYVBhcmFtLCBnZXRTdXByZW11bSgpKSkgKTsKKwl9CisJZWxzZSBpZiggZ2V0U3ltYm9sRGF0YSgpLm5vbmVtcHR5KCkgKQorCXsKKwkJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBnZXRTeW1ib2xEYXRhKCkuYmVnaW4oKTsKKwkJVGFibGVPZlN5bWJvbDo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBnZXRTeW1ib2xEYXRhKCkuZW5kKCk7CisJCUJGIGFsbENvbnN0cmFpbnQgPSBFeHByZXNzaW9uQ29uc3RydWN0b3JOYXRpdmU6OmVxRXhwcigKKwkJCQlhUGFyYW0sICgqaXQpLmdldFZhbHVlKCkpOworCQlmb3IoICsraXQgOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCQl7CisJCQlhbGxDb25zdHJhaW50Lm9yRXhwciggRXhwcmVzc2lvbkNvbnN0cnVjdG9yTmF0aXZlOjplcUV4cHIoCisJCQkJCWFQYXJhbSwgKCppdCkuZ2V0VmFsdWUoKSkgKTsKKwkJfQorCisJCXJldHVybiggYWxsQ29uc3RyYWludCApOworCX0KKwllbHNlCisJeworCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9UUlVFICk7CisJfQorfQorCisKKy8qKgorICogU2VyaWFsaXphdGlvbgorICovCit2b2lkIEVudW1UeXBlU3BlY2lmaWVyOjp0b1N0cmVhbShPdXRTdHJlYW0gJiBvdXQpIGNvbnN0Cit7CisJaWYoIG91dC5wcmVmZXJhYmx5RlFOKCkgKQorCXsKKwkJb3V0IDw8IFRBQiA8PCBnZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOworCisJCUFWTV9ERUJVR19SRUZfQ09VTlRFUihvdXQpOworCisJCXJldHVybjsKKwl9CisKKwlvdXQgPDwgVEFCIDw8ICJ0eXBlICIgPDwgZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiIGVudW0geyIgPDwgRU9MOworCitBVk1fSUZfREVCVUdfRkxBRyggQ09NUElMSU5HICkKKwlpZiggaGFzQXN0RWxlbWVudCgpICkKKwl7CisJCW91dCA8PCBUQUIyIDw8ICIvL2NvbXBpbGVkID0gIgorCQkJPDwgZ2V0QXN0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiOyIgPDwgRU9MOworCX0KK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBDT01QSUxJTkcgKQorCitBVk1fSUZfREVCVUdfRkxBRyggREFUQSApCisJb3V0IDw8IFRBQiA8PCAicHJvcGVydHk6IiA8PCBFT0wKKworCQk8PCBUQUIyIDw8ICJzaXplID0gIiA8PCBzaXplKCkgPDwgIjsiIDw8ICIgICAiLypFT0w7CisJCTw8IFRBQjIqLyA8PCAiZGF0YV9zaXplID0gIiA8PCBnZXREYXRhU2l6ZSgpIDw8ICI7IiA8PCAiICAgIi8qRU9MOworCQk8PCBUQUIyKi8gPDwgImJpdF9zaXplID0gIiA8PCBnZXRCaXRTaXplKCkgPDwgIjsiIDw8IEVPTAorCisJCTw8IFRBQiA8PCAic3ltYm9sOiIgPDwgRU9MOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIERBVEEgKQorCisJaWYoIGhhc0NvbnN0cmFpbnQoKSApCisJeworCQlvdXQgPDwgVEFCMiA8PCAiQGNvbnN0cmFpbnQgeyIgPDwgRU9MX0lOQ1IyX0lOREVOVDsKKwkJZ2V0Q29uc3RyYWludCgpLnRvU3RyZWFtKG91dCk7CisJCW91dCA8PCBERUNSMl9JTkRFTlRfVEFCMiA8PCAifSIgPDwgRU9MOworCX0KKworCW91dCA8PCBpbmNyX3N0cmVhbSggZ2V0U3ltYm9sRGF0YSgpICkgPDwgVEFCIDw8ICJ9IiA8PCBFT0xfRkxVU0g7Cit9CisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3R5cGUvRW51bVR5cGVTcGVjaWZpZXIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90eXBlL0VudW1UeXBlU3BlY2lmaWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUxMzY2OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90eXBlL0VudW1UeXBlU3BlY2lmaWVyLmgKQEAgLTAsMCArMSwyMTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiA3IGFvw7t0IDIwMDgKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBFTlVNVFlQRVNQRUNJRklFUl9IXworI2RlZmluZSBFTlVNVFlQRVNQRUNJRklFUl9IXworCisjaW5jbHVkZSA8Zm1sL3R5cGUvQmFzZVN5bWJvbFR5cGVTcGVjaWZpZXIuaD4KKworI2luY2x1ZGUgPGNvbW1vbi9CRi5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworY2xhc3MgRGF0YVR5cGU7CisKKworY2xhc3MgRW51bVR5cGVTcGVjaWZpZXIgOiBwdWJsaWMgQmFzZVN5bWJvbFR5cGVTcGVjaWZpZXIgLAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIEVudW1UeXBlU3BlY2lmaWVyICkKK3sKKworCUFWTV9ERUNMQVJFX1VOQ0xPTkFCTEVfQ0xBU1MoRW51bVR5cGVTcGVjaWZpZXIpCisKKworcHJvdGVjdGVkOgorCS8qCisJICogQVRUUklCVVRFUworCSAqLworCWJvb2wgbUludGVnZXJFbnVtZXJhdGlvbkZsYWc7CisKKwlCRiBtSW5maW11bTsKKwlCRiBtU3VwcmVtdW07CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCUVudW1UeXBlU3BlY2lmaWVyKERhdGFUeXBlICogYUNvbXBpbGVkVHlwZSkKKwk6IEJhc2VTeW1ib2xUeXBlU3BlY2lmaWVyKENMQVNTX0tJTkRfVCggRW51bVR5cGVTcGVjaWZpZXIgKSwKKwkJCVRZUEVfRU5VTV9TUEVDSUZJRVIsIGFDb21waWxlZFR5cGUsIDEsIDEsIDApLAorCW1JbnRlZ2VyRW51bWVyYXRpb25GbGFnKCBmYWxzZSApLAorCW1JbmZpbXVtKCApLAorCW1TdXByZW11bSggKQorCXsKKwkJLy8hISEgTk9USElORworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkVudW1UeXBlU3BlY2lmaWVyKCkKKwl7CisJCS8vISEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1JbmZpbXVtCisJICovCisJaW5saW5lIGNvbnN0IEJGICYgZ2V0SW5maW11bSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1JbmZpbXVtICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzSW5maW11bSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1JbmZpbXVtLnZhbGlkKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRJbmZpbXVtKGNvbnN0IEJGICYgYW5JbmZpbXVtKQorCXsKKwkJbUluZmltdW0gPSBhbkluZmltdW07CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtU3VwcmVtdW0KKwkgKi8KKwlpbmxpbmUgY29uc3QgQkYgJiBnZXRTdXByZW11bSgpY29uc3QKKwl7CisJCXJldHVybiggbVN1cHJlbXVtICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzU3VwcmVtdW0oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtU3VwcmVtdW0udmFsaWQoKSApOworCX0KKworCWlubGluZSB2b2lkIHNldFN1cHJlbXVtKGNvbnN0IEJGICYgYVN1cHJlbXVtKQorCXsKKwkJbVN1cHJlbXVtID0gYVN1cHJlbXVtOworCX0KKworCisJLyoqCisJICogU0VUVEVSCisJICogbUJvdW5kCisJICovCisJdm9pZCB1cGRhdGVCb3VuZCgpOworCisJdm9pZCB1cGRhdGVCb3VuZChhdm1faW50ZWdlcl90IG1pbiwgYXZtX2ludGVnZXJfdCBtYXgpOworCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtU3ltYm9sRGF0YQorCSAqLworCWJvb2wgaGFzU3ltYm9sRGF0YShJbnN0YW5jZU9mRGF0YSAqIGFTeW1ib2xEYXRhKSBjb25zdDsKKworCWJvb2wgaGFzU3ltYm9sRGF0YShjb25zdCBCRiAmIGFTeW1ib2wpIGNvbnN0OworCisKKwlib29sIGhhc1N5bWJvbERhdGFXaXRoVmFsdWUoY29uc3QgQkYgJiBhVmFsdWUpIGNvbnN0OworCisJY29uc3QgU3ltYm9sICYgZ2V0U3ltYm9sRGF0YUJ5VmFsdWUoY29uc3QgQkYgJiBhVmFsdWUpIGNvbnN0OworCisKKwlhdm1fc2l6ZV90IGdldFJhbmRvbVN5bWJvbE9mZnNldCgpOworCisJY29uc3QgU3ltYm9sICYgZ2V0UmFuZG9tU3ltYm9sRGF0YSgpOworCisJY29uc3QgQkYgJiBnZXRSYW5kb21TeW1ib2xWYWx1ZSgpOworCisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIG5ld2ZyZXNoIEVudW0gVmFsdWUKKwkgKi8KKwlCRiBuZXdmcmVzaFN5bWJvbFZhbHVlKCk7CisKKworCS8qKgorCSAqIFNFVFRFUgorCSAqIG1CaXRTaXplCisJICovCisJaW5saW5lIHZpcnR1YWwgdm9pZCB1cGRhdGVTaXplKCkKKwl7CisJCXNldEJpdFNpemUoIG1TeW1ib2xEYXRhLnNpemUoKSApOworCX0KKworCisJLyoqCisJICogQ09OU1RSQUlOVCBnZW5lcmF0aW9uCisJICogZm9yIGEgZ2l2ZW4gcGFyYW1ldGVyCisJICovCisJQkYgbWluQ29uc3RyYWludChjb25zdCBCRiAmIGFQYXJhbSkgY29uc3Q7CisJQkYgbWF4Q29uc3RyYWludChjb25zdCBCRiAmIGFQYXJhbSkgY29uc3Q7CisJQkYgZ2VuQ29uc3RyYWludChjb25zdCBCRiAmIGFQYXJhbSkgY29uc3Q7CisKKworCS8qKgorCSAqIEZvcm1hdCBhIHZhbHVlIHcuci50LiBpdHMgdHlwZQorCSAqLworCWlubGluZSB2aXJ0dWFsIHZvaWQgZm9ybWF0U3RyZWFtKE91dFN0cmVhbSAmIG91dCwgY29uc3QgQkYgJiBiZlZhbHVlKSBjb25zdAorCXsKKwkJaWYoIGJmVmFsdWUuaXM8IEluc3RhbmNlT2ZEYXRhID4oKSAmJgorCQkJKGJmVmFsdWUudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCktPmdldFR5cGVTcGVjaWZpZXIoKSA9PSB0aGlzKSApCisJCXsKK0FWTV9JRl9ERUJVR19GTEFHKCBEQVRBICkKKworCQkJb3V0IDw8IGJmVmFsdWUudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7CisKK0FWTV9ERUJVR19FTFNFCisKKwkJCW91dCA8PCBiZlZhbHVlLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpLT5nZXROYW1lSUQoKTsKKworQVZNX0VORElGX0RFQlVHX0ZMQUcoIERBVEEgKQorCQl9CisJCWVsc2UKKwkJeworCQkJY29uc3QgU3ltYm9sICYgYVN5bWJvbCA9IGdldFN5bWJvbERhdGFCeVZhbHVlKGJmVmFsdWUpOworCitBVk1fSUZfREVCVUdfRkxBRyggREFUQSApCisKKwkJCW91dCA8PCAoIGFTeW1ib2wudmFsaWQoKSA/CisJCQkJCWFTeW1ib2wuZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA6IGJmVmFsdWUuc3RyKCkgKTsKKworQVZNX0RFQlVHX0VMU0UKKworCQkJb3V0IDw8ICggYVN5bWJvbC52YWxpZCgpID8gYVN5bWJvbC5nZXROYW1lSUQoKSA6IGJmVmFsdWUuc3RyKCkgKTsKKworQVZNX0VORElGX0RFQlVHX0ZMQUcoIERBVEEgKQorCQl9CisJfQorCisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvdXQpIGNvbnN0OworCit9OworCisKK30KKworI2VuZGlmIC8qIEVOVU1UWVBFU1BFQ0lGSUVSX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvdHlwZS9JbnRlcnZhbFR5cGVTcGVjaWZpZXIuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3R5cGUvSW50ZXJ2YWxUeXBlU3BlY2lmaWVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTRkZDFlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3R5cGUvSW50ZXJ2YWxUeXBlU3BlY2lmaWVyLmNwcApAQCAtMCwwICsxLDE2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDUganVpbC4gMjAxMgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiSW50ZXJ2YWxUeXBlU3BlY2lmaWVyLmgiCisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29uc3RydWN0b3JJbXBsLmg+CisKKyNpbmNsdWRlIDxmbWwvdHlwZS9UeXBlTWFuYWdlci5oPgorCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoqCisgKiBDT05TVFJBSU5UIGdlbmVyYXRpb24KKyAqIGZvciBhIGdpdmVuIHBhcmFtZXRlcgorICovCitCRiBJbnRlcnZhbFR5cGVTcGVjaWZpZXI6Om1pbkNvbnN0cmFpbnQoY29uc3QgQkYgJiBhUGFyYW0pIGNvbnN0Cit7CisJc3dpdGNoKCBnZXRJbnRlcnZhbEtpbmQoKSApCisJeworCQljYXNlIElJbnRlcnZhbEtpbmQ6OkNMT1NFRDoKKwkJY2FzZSBJSW50ZXJ2YWxLaW5kOjpST1BFTjoKKwkJeworCQkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3JOYXRpdmU6Omd0ZUV4cHIoYVBhcmFtLCBnZXRJbmZpbXVtKCkpICk7CisJCX0KKworCQljYXNlIElJbnRlcnZhbEtpbmQ6Ok9QRU46CisJCWNhc2UgSUludGVydmFsS2luZDo6TE9QRU46CisJCWRlZmF1bHQ6CisJCXsKKwkJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yTmF0aXZlOjpndEV4cHIoYVBhcmFtLCBnZXRJbmZpbXVtKCkpICk7CisJCX0KKwl9Cit9CisKKworQkYgSW50ZXJ2YWxUeXBlU3BlY2lmaWVyOjptYXhDb25zdHJhaW50KGNvbnN0IEJGICYgYVBhcmFtKSBjb25zdAoreworCXN3aXRjaCggZ2V0SW50ZXJ2YWxLaW5kKCkgKQorCXsKKwkJY2FzZSBJSW50ZXJ2YWxLaW5kOjpDTE9TRUQ6CisJCWNhc2UgSUludGVydmFsS2luZDo6TE9QRU46CisJCXsKKwkJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yTmF0aXZlOjpsdGVFeHByKGFQYXJhbSwgZ2V0U3VwcmVtdW0oKSkgKTsKKwkJfQorCisJCWNhc2UgSUludGVydmFsS2luZDo6Uk9QRU46CisJCWNhc2UgSUludGVydmFsS2luZDo6T1BFTjoKKwkJZGVmYXVsdDoKKwkJeworCQkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3JOYXRpdmU6Omx0RXhwcihhUGFyYW0sIGdldFN1cHJlbXVtKCkpICk7CisJCX0KKwl9Cit9CisKKworQkYgSW50ZXJ2YWxUeXBlU3BlY2lmaWVyOjpnZW5Db25zdHJhaW50KGNvbnN0IEJGICYgYVBhcmFtKSBjb25zdAoreworCWlmKCBoYXNDb25zdHJhaW50KCkgKQorCXsKKwkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQk8PCAiVE9ETyA8PCBJbnRlcnZhbFR5cGVTcGVjaWZpZXI6OmdlbkNvbnN0cmFpbnQoICIKKwkJCQk8PCBhUGFyYW0gPDwgIiApID4+IHdpdGggY29tcGlsZWQgY29uc3RyYWludDoiIDw8IHN0ZDo6ZW5kbAorCQkJCTw8IGdldENvbnN0cmFpbnQoKQorCQkJCTw8IFNFTkRfRVhJVDsKKwl9CisKKwlzd2l0Y2goIGdldEludGVydmFsS2luZCgpICkKKwl7CisJCWNhc2UgSUludGVydmFsS2luZDo6Q0xPU0VEOgorCQl7CisJCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6YW5kRXhwcigKKwkJCQkJRXhwcmVzc2lvbkNvbnN0cnVjdG9yTmF0aXZlOjpndGVFeHByKGFQYXJhbSwgZ2V0SW5maW11bSgpKSwKKwkJCQkJRXhwcmVzc2lvbkNvbnN0cnVjdG9yTmF0aXZlOjpsdGVFeHByKGFQYXJhbSwgZ2V0U3VwcmVtdW0oKSkpICk7CisJCX0KKworCQljYXNlIElJbnRlcnZhbEtpbmQ6OkxPUEVOOgorCQl7CisJCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6YW5kRXhwcigKKwkJCQkJRXhwcmVzc2lvbkNvbnN0cnVjdG9yTmF0aXZlOjpndEV4cHIoYVBhcmFtLCBnZXRJbmZpbXVtKCkpLAorCQkJCQlFeHByZXNzaW9uQ29uc3RydWN0b3JOYXRpdmU6Omx0ZUV4cHIoYVBhcmFtLCBnZXRTdXByZW11bSgpKSkgKTsKKwkJfQorCisJCWNhc2UgSUludGVydmFsS2luZDo6Uk9QRU46CisJCXsKKwkJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yTmF0aXZlOjphbmRFeHByKAorCQkJCQlFeHByZXNzaW9uQ29uc3RydWN0b3JOYXRpdmU6Omd0ZUV4cHIoYVBhcmFtLCBnZXRJbmZpbXVtKCkpLAorCQkJCQlFeHByZXNzaW9uQ29uc3RydWN0b3JOYXRpdmU6Omx0RXhwcihhUGFyYW0sIGdldFN1cHJlbXVtKCkpKSApOworCQl9CisKKwkJY2FzZSBJSW50ZXJ2YWxLaW5kOjpPUEVOOgorCQlkZWZhdWx0OgorCQl7CisJCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvck5hdGl2ZTo6YW5kRXhwcigKKwkJCQkJRXhwcmVzc2lvbkNvbnN0cnVjdG9yTmF0aXZlOjpndEV4cHIoYVBhcmFtLCBnZXRJbmZpbXVtKCkpLAorCQkJCQlFeHByZXNzaW9uQ29uc3RydWN0b3JOYXRpdmU6Omx0RXhwcihhUGFyYW0sIGdldFN1cHJlbXVtKCkpKSApOworCQl9CisJfQorfQorCisKKy8qKgorICogU2VyaWFsaXphdGlvbgorICovCitzdGQ6OnN0cmluZyBJbnRlcnZhbFR5cGVTcGVjaWZpZXI6OnN0clQoKSBjb25zdAoreworCWlmKCBnZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpLmVtcHR5KCkgfHwgZ2V0TmFtZUlEKCkuZW1wdHkoKSApCisJeworCQlyZXR1cm4oIHN0cklzbygpICk7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiggZ2V0TmFtZUlEKCkgKTsKKwl9Cit9CisKKwordm9pZCBJbnRlcnZhbFR5cGVTcGVjaWZpZXI6OnRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdAoreworCWlmKCBvcy5wcmVmZXJhYmx5RlFOKCkgKQorCXsKKwkJb3MgPDwgVEFCIDw8IGdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7CisKKwkJQVZNX0RFQlVHX1JFRl9DT1VOVEVSKG9zKTsKKworCQlyZXR1cm47CisJfQorCisJb3MgPDwgVEFCIDw8ICJ0eXBlICIgPDwgZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiIGludGVydmFsPCAiCisJCQk8PCBtU3VwcG9ydFR5cGVTcGVjaWZpZXIuc3RyVCgpIDw8IHN0cklzbygpIDw8ICIgPiI7CisKKwlpZiggaGFzQ29uc3RyYWludCgpICkKKwl7CisJCW9zIDw8ICIgeyIgPDwgRU9MX1RBQjIgPDwgIkBjb25zdHJhaW50IHsiIDw8IEVPTF9JTkNSMl9JTkRFTlQ7CisJCWdldENvbnN0cmFpbnQoKS50b1N0cmVhbShvcyk7CisJCW9zIDw8IERFQ1IyX0lOREVOVF9UQUIyIDw8ICJ9IiA8PCBFT0xfVEFCIDw8ICJ9IjsKKwl9CisJZWxzZQorCXsKKwkJb3MgPDwgIjsiOworCX0KKworCW9zIDw8IEVPTF9GTFVTSDsKK30KKworCit9CisKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3R5cGUvSW50ZXJ2YWxUeXBlU3BlY2lmaWVyLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvdHlwZS9JbnRlcnZhbFR5cGVTcGVjaWZpZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDgwNTgwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3R5cGUvSW50ZXJ2YWxUeXBlU3BlY2lmaWVyLmgKQEAgLTAsMCArMSwxODMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiA1IGp1aWwuIDIwMTIKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBJTlRFUlZBTFRZUEVTUEVDSUZJRVJfSF8KKyNkZWZpbmUgSU5URVJWQUxUWVBFU1BFQ0lGSUVSX0hfCisKKyNpbmNsdWRlIDxmbWwvdHlwZS9CYXNlVHlwZVNwZWNpZmllci5oPgorCisjaW5jbHVkZSA8Y29tbW9uL0JGLmg+CisKKyNpbmNsdWRlIDxmbWwvbGliL0lUeXBlU3BlY2lmaWVyLmg+CisKKyNpbmNsdWRlIDxmbWwvdHlwZS9UeXBlU3BlY2lmaWVyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBEYXRhVHlwZTsKKworCitjbGFzcyBJbnRlcnZhbFR5cGVTcGVjaWZpZXIgOgorCQlwdWJsaWMgQmFzZVR5cGVTcGVjaWZpZXIsCisJCXB1YmxpYyBJSW50ZXJ2YWxLaW5kLAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIEludGVydmFsVHlwZVNwZWNpZmllciApCit7CisKKwlBVk1fREVDTEFSRV9VTkNMT05BQkxFX0NMQVNTKEludGVydmFsVHlwZVNwZWNpZmllcikKKworCitwcm90ZWN0ZWQ6CisJLyoKKwkgKiBBVFRSSUJVVEVTCisJICovCisKKwkvLyB0aGUgVHlwZSBTcGVjaWZpZXIKKwlUeXBlU3BlY2lmaWVyIG1TdXBwb3J0VHlwZVNwZWNpZmllcjsKKworCUlJbnRlcnZhbEtpbmQ6OktJTkQgbUludGVydmFsS2luZDsKKworCUJGIG1JbmZpbXVtOworCUJGIG1TdXByZW11bTsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJSW50ZXJ2YWxUeXBlU3BlY2lmaWVyKERhdGFUeXBlICogYUNvbXBpbGVkVHlwZSwKKwkJCWNvbnN0IFR5cGVTcGVjaWZpZXIgJiBhVHlwZVNwZWNpZmllciwKKwkJCUlJbnRlcnZhbEtpbmQ6OktJTkQgYU5hdHVyZSwKKwkJCWNvbnN0IEJGICYgYW5JbmZpbXVtLCBjb25zdCBCRiAmIGFTdXByZW11bSkKKwk6IEJhc2VUeXBlU3BlY2lmaWVyKENMQVNTX0tJTkRfVCggSW50ZXJ2YWxUeXBlU3BlY2lmaWVyICksCisJCQlUWVBFX0lOVEVSVkFMX1NQRUNJRklFUiwgYUNvbXBpbGVkVHlwZSwgMSwKKwkJCWFUeXBlU3BlY2lmaWVyLmdldERhdGFTaXplKCksIGFUeXBlU3BlY2lmaWVyLmdldEJpdFNpemUoKSksCisJbVN1cHBvcnRUeXBlU3BlY2lmaWVyKCBhVHlwZVNwZWNpZmllciApLAorCW1JbnRlcnZhbEtpbmQoIGFOYXR1cmUgKSwKKwltSW5maW11bSggYW5JbmZpbXVtICksCisJbVN1cHJlbXVtKCBhU3VwcmVtdW0gKQorCXsKKwkJLy8hISEgTk9USElORworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfkludGVydmFsVHlwZVNwZWNpZmllcigpCisJeworCQkvLyEhISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtU3VwcG9ydFR5cGVTcGVjaWZpZXIKKwkgKi8KKwlpbmxpbmUgY29uc3QgVHlwZVNwZWNpZmllciAmIGdldFN1cHBvcnRUeXBlU3BlY2lmaWVyKCkgY29uc3QKKwl7CisJCXJldHVybiggbVN1cHBvcnRUeXBlU3BlY2lmaWVyICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzU3VwcG9ydFR5cGVTcGVjaWZpZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtU3VwcG9ydFR5cGVTcGVjaWZpZXIudmFsaWQoKSApOworCX0KKworCWlubGluZSB2b2lkIHNldFN1cHBvcnRUeXBlU3BlY2lmaWVyKGNvbnN0IFR5cGVTcGVjaWZpZXIgJiBhVHlwZVNwZWNpZmllcikKKwl7CisJCW1TdXBwb3J0VHlwZVNwZWNpZmllciA9IGFUeXBlU3BlY2lmaWVyOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUludGVydmFsS2luZAorCSAqLworCWlubGluZSB2aXJ0dWFsIElJbnRlcnZhbEtpbmQ6OktJTkQgZ2V0SW50ZXJ2YWxLaW5kKCkgY29uc3QKKwl7CisJCXJldHVybiggbUludGVydmFsS2luZCApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUluZmltdW0KKwkgKi8KKwlpbmxpbmUgY29uc3QgQkYgJiBnZXRJbmZpbXVtKCkgY29uc3QKKwl7CisJCXJldHVybiggbUluZmltdW0gKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNJbmZpbXVtKCkgY29uc3QKKwl7CisJCXJldHVybiggbUluZmltdW0udmFsaWQoKSApOworCX0KKworCWlubGluZSB2b2lkIHNldEluZmltdW0oY29uc3QgQkYgJiBhbkluZmltdW0pCisJeworCQltSW5maW11bSA9IGFuSW5maW11bTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1TdXByZW11bQorCSAqLworCWlubGluZSBjb25zdCBCRiAmIGdldFN1cHJlbXVtKCljb25zdAorCXsKKwkJcmV0dXJuKCBtU3VwcmVtdW0gKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNTdXByZW11bSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1TdXByZW11bS52YWxpZCgpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0U3VwcmVtdW0oY29uc3QgQkYgJiBhU3VwcmVtdW0pCisJeworCQltU3VwcmVtdW0gPSBhU3VwcmVtdW07CisJfQorCisKKwkvKioKKwkgKiBDT05TVFJBSU5UIGdlbmVyYXRpb24KKwkgKiBmb3IgYSBnaXZlbiBwYXJhbWV0ZXIKKwkgKi8KKwlCRiBtaW5Db25zdHJhaW50KGNvbnN0IEJGICYgYVBhcmFtKSBjb25zdDsKKwlCRiBtYXhDb25zdHJhaW50KGNvbnN0IEJGICYgYVBhcmFtKSBjb25zdDsKKwlCRiBnZW5Db25zdHJhaW50KGNvbnN0IEJGICYgYVBhcmFtKSBjb25zdDsKKworCisJLyoqCisJICogU2VyaWFsaXphdGlvbgorCSAqLworCWlubGluZSBzdGQ6OnN0cmluZyBzdHJJc28oKSBjb25zdAorCXsKKwkJcmV0dXJuKCBJSW50ZXJ2YWxLaW5kOjp0b19zdHJpbmcobUludGVydmFsS2luZCwgbUluZmltdW0sIG1TdXByZW11bSkgKTsKKwl9CisKKwlzdGQ6OnN0cmluZyBzdHJUKCkgY29uc3Q7CisKKwl2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworfTsKKworCit9CisKKyNlbmRpZiAvKiBJTlRFUlZBTFRZUEVTUEVDSUZJRVJfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90eXBlL1JFQURNRS5tZCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90eXBlL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjE2MDNkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3R5cGUvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTcgQEAKKyMgRUZNLVNZTUJFWCA6IFR5cGUKKworIyMgU291cmNlIGNvZGUgc3RydWN0dXJlCisKKyMjIyBJbnRlcmZhY2VzCisqICoqSVR5cGVTcGVjaWZpZXIqKgorCisjIyMgQ2xhc3NlcworKiAqKlByaW1pdGl2ZSBUeXBlKioKKyogKipFbnVtZXJhdGlvbiBUeXBlKioKKyogKipTdHJ1Y3R1cmUgVHlwZSoqCisqICoqVW5pb24gVHlwZSoqCisqICoqQ2hvaWNlIFR5cGUqKgorCisjIyMgRmFjdG9yaWVzCisqICoqVHlwZVNwZWNpZmllcioqIGFzIFNtYXJ0IFBvaW50ZXIKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3R5cGUvVGFibGVPZlR5cGVTcGVjaWZpZXIuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3R5cGUvVGFibGVPZlR5cGVTcGVjaWZpZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlN2I5ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvdHlwZS9UYWJsZU9mVHlwZVNwZWNpZmllci5jcHAKQEAgLTAsMCArMSwxMTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxNSBqdWluIDIwMTQKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlRhYmxlT2ZUeXBlU3BlY2lmaWVyLmgiCisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mRGF0YS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjb25zdCBTeW1ib2wgJiBUYWJsZU9mVHlwZVNwZWNpZmllcjo6Z2V0U3ltYm9sRGF0YSgKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQpIGNvbnN0Cit7CisJQ29udGFpbmVyT2ZUeXBlOjpjb25zdF9pdGVyYXRvciBpdCA9IENvbnRhaW5lck9mVHlwZTo6YmVnaW4oKTsKKwlDb250YWluZXJPZlR5cGU6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gQ29udGFpbmVyT2ZUeXBlOjplbmQoKTsKKwlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwl7CisJCWlmKCAoKml0KS5oYXNTeW1ib2woKSApCisJCXsKKwkJCWNvbnN0IFN5bWJvbCAmIGZvdW5kSW5zdGFuY2UgPQorCQkJCQkoKml0KS5nZXRTeW1ib2woIGFGdWxseVF1YWxpZmllZE5hbWVJRCApOworCQkJaWYoIGZvdW5kSW5zdGFuY2UudmFsaWQoKSApCisJCQl7CisJCQkJcmV0dXJuKCBmb3VuZEluc3RhbmNlICk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuKCBTeW1ib2w6OlJFRl9OVUxMICk7Cit9CisKKworY29uc3QgU3ltYm9sICYgVGFibGVPZlR5cGVTcGVjaWZpZXI6OmdldFN5bWJvbERhdGFCeVF1YWxpZmllZE5hbWVJRCgKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKSBjb25zdAoreworCUNvbnRhaW5lck9mVHlwZTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBDb250YWluZXJPZlR5cGU6OmJlZ2luKCk7CisJQ29udGFpbmVyT2ZUeXBlOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IENvbnRhaW5lck9mVHlwZTo6ZW5kKCk7CisJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJeworCQlpZiggKCppdCkuaGFzU3ltYm9sKCkgKQorCQl7CisJCQljb25zdCBTeW1ib2wgJiBmb3VuZEluc3RhbmNlID0KKwkJCQkJKCppdCkuZ2V0U3ltYm9sQnlRdWFsaWZpZWROYW1lSUQoYVF1YWxpZmllZE5hbWVJRCk7CisJCQlpZiggZm91bmRJbnN0YW5jZS52YWxpZCgpICkKKwkJCXsKKwkJCQlyZXR1cm4oIGZvdW5kSW5zdGFuY2UgKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiggU3ltYm9sOjpSRUZfTlVMTCApOworfQorCisKK2NvbnN0IFN5bWJvbCAmIFRhYmxlT2ZUeXBlU3BlY2lmaWVyOjpnZXRTeW1ib2xEYXRhQnlOYW1lSUQoCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkgY29uc3QKK3sKKwlDb250YWluZXJPZlR5cGU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gQ29udGFpbmVyT2ZUeXBlOjpiZWdpbigpOworCUNvbnRhaW5lck9mVHlwZTo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBDb250YWluZXJPZlR5cGU6OmVuZCgpOworCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCXsKKwkJaWYoICgqaXQpLmhhc1N5bWJvbCgpICYmICgqaXQpLmlzVHlwZWRFbnVtKCkgKQorCQl7CisJCQljb25zdCBTeW1ib2wgJiBmb3VuZEluc3RhbmNlID0gKCppdCkuZ2V0U3ltYm9sQnlOYW1lSUQoYU5hbWVJRCk7CisJCQlpZiggZm91bmRJbnN0YW5jZS52YWxpZCgpICkKKwkJCXsKKwkJCQlyZXR1cm4oIGZvdW5kSW5zdGFuY2UgKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiggU3ltYm9sOjpSRUZfTlVMTCApOworfQorCisKK2NvbnN0IFN5bWJvbCAmIFRhYmxlT2ZUeXBlU3BlY2lmaWVyOjpnZXRTeW1ib2xEYXRhQnlBc3RFbGVtZW50KAorCQljb25zdCBPYmplY3RFbGVtZW50ICogYXN0RWxlbWVudCkgY29uc3QKK3sKKwlDb250YWluZXJPZlR5cGU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gQ29udGFpbmVyT2ZUeXBlOjpiZWdpbigpOworCUNvbnRhaW5lck9mVHlwZTo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBDb250YWluZXJPZlR5cGU6OmVuZCgpOworCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCXsKKwkJaWYoICgqaXQpLmhhc1N5bWJvbCgpICkKKwkJeworCQkJY29uc3QgU3ltYm9sICYgZm91bmRJbnN0YW5jZSA9CisJCQkJCSgqaXQpLmdldFN5bWJvbEJ5QXN0RWxlbWVudChhc3RFbGVtZW50KTsKKwkJCWlmKCBmb3VuZEluc3RhbmNlLnZhbGlkKCkgKQorCQkJeworCQkJCXJldHVybiggZm91bmRJbnN0YW5jZSApOworCQkJfQorCQl9CisJfQorCXJldHVybiggU3ltYm9sOjpSRUZfTlVMTCApOworfQorCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3R5cGUvVGFibGVPZlR5cGVTcGVjaWZpZXIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90eXBlL1RhYmxlT2ZUeXBlU3BlY2lmaWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk3YzlmYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90eXBlL1RhYmxlT2ZUeXBlU3BlY2lmaWVyLmgKQEAgLTAsMCArMSwzMDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxNSBqdWluIDIwMTQKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBUQUJMRU9GCisjZGVmaW5lIFRBQkxFT0YKKworI2luY2x1ZGUgPGNvbW1vbi9Bdm1PYmplY3QuaD4KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vVmVjdG9yLmg+CisKKyNpbmNsdWRlIDxmbWwvdHlwZS9UeXBlU3BlY2lmaWVyLmg+CisKKyNpbmNsdWRlIDxjb2xsZWN0aW9uL0xpc3QuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKK2NsYXNzIE9iamVjdEVsZW1lbnQ7CisKKworY2xhc3MgVGFibGVPZlR5cGVTcGVjaWZpZXIgOgorCQlwdWJsaWMgQXZtT2JqZWN0LAorCQlwdWJsaWMgVmVjdG9yPCBUeXBlU3BlY2lmaWVyID4sCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggVGFibGVPZlR5cGVTcGVjaWZpZXIgKQoreworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIFRhYmxlT2ZUeXBlU3BlY2lmaWVyICkKKworCitwdWJsaWM6CisJLyoqCisJICogVFlQRURFRgorCSAqLworCXR5cGVkZWYgIEJhc2VUeXBlU3BlY2lmaWVyICAgICAgICogIFBvaW50ZXJCYXNlVDsKKwl0eXBlZGVmICBjb25zdCBCYXNlVHlwZVNwZWNpZmllciAqICBDb25zdFBvaW50ZXJCYXNlVDsKKworCXR5cGVkZWYgIFZlY3RvcjwgVHlwZVNwZWNpZmllciA+ICAgIENvbnRhaW5lck9mVHlwZTsKKworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlUYWJsZU9mVHlwZVNwZWNpZmllcigpCisJOiBBdm1PYmplY3QoICksCisJQ29udGFpbmVyT2ZUeXBlKCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlUYWJsZU9mVHlwZVNwZWNpZmllcihhdm1fc2l6ZV90IGFTaXplKQorCTogQXZtT2JqZWN0KCApLAorCUNvbnRhaW5lck9mVHlwZSggYVNpemUgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJVGFibGVPZlR5cGVTcGVjaWZpZXIoY29uc3QgVGFibGVPZlR5cGVTcGVjaWZpZXIgJiBhVGFibGUpCisJOiBBdm1PYmplY3QoIGFUYWJsZSApLAorCUNvbnRhaW5lck9mVHlwZSggYVRhYmxlICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCVRhYmxlT2ZUeXBlU3BlY2lmaWVyKGNvbnN0IENvbnRhaW5lck9mVHlwZSAmIGFUYWJsZSkKKwk6IEF2bU9iamVjdCggKSwKKwlDb250YWluZXJPZlR5cGUoIGFUYWJsZSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5UYWJsZU9mVHlwZVNwZWNpZmllcigpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqLworCWlubGluZSBjb25zdCBUeXBlU3BlY2lmaWVyICYgZ2V0KGF2bV9zaXplX3Qgb2Zmc2V0KSBjb25zdAorCXsKKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9BUlJBWV9PRkZTRVRfRVhJVCggb2Zmc2V0LCBDb250YWluZXJPZlR5cGU6OnNpemUoKSApCisJCQkJPDwgIlVuYm91bmQgVHlwZVNwZWNpZmllciBvZmZzZXQgISEhIgorCQkJCTw8IFNFTkRfRVhJVDsKKworCQlyZXR1cm4oIENvbnRhaW5lck9mVHlwZTo6YXQob2Zmc2V0KSApOworCX0KKworCisJaW5saW5lIGNvbnN0IFR5cGVTcGVjaWZpZXIgJiBnZXRCeVF1YWxpZmllZE5hbWVJRCgKKwkJCXN0ZDo6c3RyaW5nIGFRdWFsaWZpZWROYW1lSUQsIE5hbWVkRWxlbWVudDo6b3BfY29tcGFyZXJfdCBvcCkgY29uc3QKKwl7CisJCUNvbnRhaW5lck9mVHlwZTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBDb250YWluZXJPZlR5cGU6OmJlZ2luKCk7CisJCUNvbnRhaW5lck9mVHlwZTo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBDb250YWluZXJPZlR5cGU6OmVuZCgpOworCQlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJeworCQkJaWYoICgqaXQpLnJhd1R5cGUoKS0+Y29tcGFyZUlEKGFRdWFsaWZpZWROYW1lSUQsIG9wKSApCisJCQl7CisJCQkJcmV0dXJuKCAqaXQgKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4oIFR5cGVTcGVjaWZpZXI6OlJFRl9OVUxMICk7CisJfQorCisKKwlpbmxpbmUgY29uc3QgVHlwZVNwZWNpZmllciAmIGdldEJ5RlFOYW1lSUQoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCkgY29uc3QKKwl7CisJCUNvbnRhaW5lck9mVHlwZTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBDb250YWluZXJPZlR5cGU6OmJlZ2luKCk7CisJCUNvbnRhaW5lck9mVHlwZTo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBDb250YWluZXJPZlR5cGU6OmVuZCgpOworCQlmb3IoIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkKKwkJeworCQkJLy8gU1RSSUNUOj4gY29tcGFyZSBMT0NBVE9SICYgTE9DQVRJT04gW3RydWU6LSByZXRyeSBvbmx5IExPQ0FUSU9OXQorCQkJaWYoICgqaXQpLmZxbkVxdWFscyggYUZ1bGx5UXVhbGlmaWVkTmFtZUlEICwgdHJ1ZSApICkKKwkJCXsKKwkJCQlyZXR1cm4oICppdCApOworCQkJfQorCQl9CisJCXJldHVybiggVHlwZVNwZWNpZmllcjo6UkVGX05VTEwgKTsKKwl9CisKKworCWlubGluZSBjb25zdCBUeXBlU3BlY2lmaWVyICYgZ2V0QnlRdWFsaWZpZWROYW1lSUQoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpIGNvbnN0CisJeworCQlDb250YWluZXJPZlR5cGU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gQ29udGFpbmVyT2ZUeXBlOjpiZWdpbigpOworCQlDb250YWluZXJPZlR5cGU6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gQ29udGFpbmVyT2ZUeXBlOjplbmQoKTsKKwkJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJCXsKKwkJCWlmKCAoKml0KS5yYXdUeXBlKCktPmZxbkVuZHNXaXRoKGFRdWFsaWZpZWROYW1lSUQpICkKKwkJCXsKKwkJCQlyZXR1cm4oICppdCApOworCQkJfQorCQl9CisJCXJldHVybiggVHlwZVNwZWNpZmllcjo6UkVGX05VTEwgKTsKKwl9CisKKworCWlubGluZSBjb25zdCBUeXBlU3BlY2lmaWVyICYgZ2V0QnlOYW1lSUQoY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKSBjb25zdAorCXsKKwkJQ29udGFpbmVyT2ZUeXBlOjpjb25zdF9pdGVyYXRvciBpdCA9IENvbnRhaW5lck9mVHlwZTo6YmVnaW4oKTsKKwkJQ29udGFpbmVyT2ZUeXBlOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IENvbnRhaW5lck9mVHlwZTo6ZW5kKCk7CisJCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCQl7CisJCQlpZiggKCppdCkuZ2V0TmFtZUlEKCkgPT0gYU5hbWVJRCApCisJCQl7CisJCQkJcmV0dXJuKCAqaXQgKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4oIFR5cGVTcGVjaWZpZXI6OlJFRl9OVUxMICk7CisJfQorCisKKwlpbmxpbmUgY29uc3QgVHlwZVNwZWNpZmllciAmIGdldEJ5QXN0RWxlbWVudCgKKwkJCWNvbnN0IE9iamVjdEVsZW1lbnQgKiBhc3RFbGVtZW50KSBjb25zdAorCXsKKwkJQ29udGFpbmVyT2ZUeXBlOjpjb25zdF9pdGVyYXRvciBpdCA9IENvbnRhaW5lck9mVHlwZTo6YmVnaW4oKTsKKwkJQ29udGFpbmVyT2ZUeXBlOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IENvbnRhaW5lck9mVHlwZTo6ZW5kKCk7CisJCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCQl7CisJCQlpZiggKCppdCkuaXNBc3RFbGVtZW50KCBhc3RFbGVtZW50ICkgKQorCQkJeworCQkJCXJldHVybiggKml0ICk7CisJCQl9CisJCX0KKwkJcmV0dXJuKCBUeXBlU3BlY2lmaWVyOjpSRUZfTlVMTCApOworCX0KKworCisJLyoqCisJICogU0FWRQorCSAqIEFQUEVORAorCSAqLworCWlubGluZSBjb25zdCBUeXBlU3BlY2lmaWVyICYgc2F2ZShQb2ludGVyQmFzZVQgYVR5cGUpCisJeworCQlDb250YWluZXJPZlR5cGU6OnB1c2hfYmFjayggVHlwZVNwZWNpZmllcihhVHlwZSkgKTsKKworCQlyZXR1cm4oIENvbnRhaW5lck9mVHlwZTo6YmFjaygpICk7CisJfQorCisJaW5saW5lIHZvaWQgYXBwZW5kKGNvbnN0IFR5cGVTcGVjaWZpZXIgJiBhVHlwZSkKKwl7CisJCUNvbnRhaW5lck9mVHlwZTo6YXBwZW5kKCBhVHlwZSApOworCX0KKworCisJLyoqCisJICogU0VUVEVSCisJICovCisJaW5saW5lIHZvaWQgc2V0KGF2bV9vZmZzZXRfdCBvZmZzZXQsIGNvbnN0IFR5cGVTcGVjaWZpZXIgJiBhVHlwZSkKKwl7CisJCUNvbnRhaW5lck9mVHlwZTo6c2V0KG9mZnNldCwgYVR5cGUpOworCX0KKworCWlubGluZSB2b2lkIHNldChhdm1fb2Zmc2V0X3Qgb2Zmc2V0LCBQb2ludGVyQmFzZVQgYVR5cGUpCisJeworCQlDb250YWluZXJPZlR5cGU6OnNldChvZmZzZXQsIFR5cGVTcGVjaWZpZXIoYVR5cGUpKTsKKwl9CisKKworCS8qKgorCSAqIGNvbnRhaW5zIGEgcGFydGljdWxhciBlbGVtZW50CisJICovCisJaW5saW5lIGJvb2wgY29udGFpbnMoQ29uc3RQb2ludGVyQmFzZVQgYVR5cGUpIGNvbnN0CisJeworLy8JCWlmKCAoYVR5cGUtPmdldE9mZnNldCgpIDwgc2l6ZSgpKQorLy8JCQkmJiAoYVR5cGUgPT0gZ2V0KGFUeXBlLT5nZXRPZmZzZXQoKSkpICkKKy8vCQl7CisvLwkJCXJldHVybiggdHJ1ZSApOworLy8JCX0KKy8vCQllbHNlCisJCXsKKwkJCUNvbnRhaW5lck9mVHlwZTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBCYXNlVmVjdG9yOjpiZWdpbigpOworCQkJQ29udGFpbmVyT2ZUeXBlOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IEJhc2VWZWN0b3I6OmVuZCgpOworCQkJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJCQl7CisJCQkJaWYoICgqaXQpID09IGFUeXBlICkKKwkJCQl7CisJCQkJCXJldHVybiggdHJ1ZSApOworCQkJCX0KKwkJCX0KKworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJfQorCisKKwlpbmxpbmUgYm9vbCBjb250YWlucyhjb25zdCBUeXBlU3BlY2lmaWVyICYgYVR5cGUpIGNvbnN0CisJeworCQlyZXR1cm4oIENvbnRhaW5lck9mVHlwZTo6Y29udGFpbnMoIGFUeXBlICkgKTsKKwl9CisKKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwl2aXJ0dWFsIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQlDb250YWluZXJPZlR5cGU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gQ29udGFpbmVyT2ZUeXBlOjpiZWdpbigpOworCQlDb250YWluZXJPZlR5cGU6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gQ29udGFpbmVyT2ZUeXBlOjplbmQoKTsKKwkJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJCXsKKwkJCSgqaXQpLnRvU3RyZWFtKG9zKTsKKwkJfQorCX0KKworCXZpcnR1YWwgdm9pZCB0b0ZzY24oT3V0U3RyZWFtICYgb3MpIGNvbnN0CisJeworCQlDb250YWluZXJPZlR5cGU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gQ29udGFpbmVyT2ZUeXBlOjpiZWdpbigpOworCQlDb250YWluZXJPZlR5cGU6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gQ29udGFpbmVyT2ZUeXBlOjplbmQoKTsKKwkJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJCXsKKwkJCW9zIDw8IFRBQiA8PCBBVk1fTk9fSU5ERU5UOworCQkJKCppdCkudG9Gc2NuKG9zKTsKKwkJCW9zIDw8IEVORF9JTkRFTlRfRU9MOworCQl9CisJfQorCisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIEZvciBTeW1ib2wgaW4gVHlwZVNwZWNpZmllcgorCSAqLworCWNvbnN0IFN5bWJvbCAmIGdldFN5bWJvbERhdGEoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFGdWxseVF1YWxpZmllZE5hbWVJRCkgY29uc3Q7CisKKwljb25zdCBTeW1ib2wgJiBnZXRTeW1ib2xEYXRhQnlRdWFsaWZpZWROYW1lSUQoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpIGNvbnN0OworCisJY29uc3QgU3ltYm9sICYgZ2V0U3ltYm9sRGF0YUJ5TmFtZUlEKGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkgY29uc3Q7CisKKwljb25zdCBTeW1ib2wgJiBnZXRTeW1ib2xEYXRhQnlBc3RFbGVtZW50KAorCQkJY29uc3QgT2JqZWN0RWxlbWVudCAqIG9iakVsZW1lbnQpIGNvbnN0OworCit9OworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworCisjZW5kaWYgLyogVEFCTEVPRiAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3R5cGUvVHlwZUFsaWFzU3BlY2lmaWVyLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90eXBlL1R5cGVBbGlhc1NwZWNpZmllci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U2YmE0ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90eXBlL1R5cGVBbGlhc1NwZWNpZmllci5jcHAKQEAgLTAsMCArMSw1MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDE1IGphbnYuIDIwMTQKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlR5cGVBbGlhc1NwZWNpZmllci5oIgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworLyoqCisgKiBTZXJpYWxpemF0aW9uCisgKi8KK3ZvaWQgVHlwZUFsaWFzU3BlY2lmaWVyOjp0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlpZiggb3MucHJlZmVyYWJseUZRTigpICkKKwl7CisJCW9zIDw8IFRBQiA8PCBnZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOworCisJCUFWTV9ERUJVR19SRUZfQ09VTlRFUihvcyk7CisKKwkJcmV0dXJuOworCX0KKworCW9zIDw8IFRBQiA8PCAidHlwZSAiIDw8IGdldE5hbWVJRCgpIDw8ICIgIiA8PCBtVGFyZ2V0U3BlY2lmaWVyVHlwZS5zdHJUKCk7CisKKwlpZiggaGFzQ29uc3RyYWludCgpICkKKwl7CisJCW9zIDw8ICIgeyIgPDwgRU9MX1RBQjIgPDwgIkBjb25zdHJhaW50IHsiIDw8IEVPTF9JTkNSMl9JTkRFTlQ7CisJCWdldENvbnN0cmFpbnQoKS50b1N0cmVhbShvcyk7CisJCW9zIDw8IERFQ1IyX0lOREVOVF9UQUIyIDw8ICJ9IiA8PCBFT0xfVEFCIDw8ICJ9IjsKKwl9CisJZWxzZQorCXsKKwkJb3MgPDwgIjsiOworCX0KKworCW9zIDw8IEVPTF9GTFVTSDsKK30KKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90eXBlL1R5cGVBbGlhc1NwZWNpZmllci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3R5cGUvVHlwZUFsaWFzU3BlY2lmaWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQxM2MzMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90eXBlL1R5cGVBbGlhc1NwZWNpZmllci5oCkBAIC0wLDAgKzEsMTQ1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTUgamFudi4gMjAxNAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFRZUEVBTElBU1NQRUNJRklFUl9IXworI2RlZmluZSBUWVBFQUxJQVNTUEVDSUZJRVJfSF8KKworI2luY2x1ZGUgPGZtbC90eXBlL0Jhc2VUeXBlU3BlY2lmaWVyLmg+CisKKyNpbmNsdWRlIDxmbWwvdHlwZS9UeXBlU3BlY2lmaWVyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBBcnJheUJGOworY2xhc3MgRGF0YVR5cGU7CisKKworY2xhc3MgVHlwZUFsaWFzU3BlY2lmaWVyIDogcHVibGljIEJhc2VUeXBlU3BlY2lmaWVyICwKKwkJQVZNX0lOSkVDVF9JTlNUQU5DRV9DT1VOVEVSX0NMQVNTKCBUeXBlQWxpYXNTcGVjaWZpZXIgKQoreworCisJQVZNX0RFQ0xBUkVfVU5DTE9OQUJMRV9DTEFTUyhUeXBlQWxpYXNTcGVjaWZpZXIpCisKKworcHJvdGVjdGVkOgorCS8qCisJICogQVRUUklCVVRFUworCSAqLworCS8vIHRoZSBUeXBlIFNwZWNpZmllcgorCVR5cGVTcGVjaWZpZXIgbVRhcmdldFNwZWNpZmllclR5cGU7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCVR5cGVBbGlhc1NwZWNpZmllcihEYXRhVHlwZSAqIGFDb21waWxlZFR5cGUsCisJCQljb25zdCBUeXBlU3BlY2lmaWVyICYgYVR5cGVTcGVjaWZpZXIpCisJOiBCYXNlVHlwZVNwZWNpZmllcihDTEFTU19LSU5EX1QoIFR5cGVBbGlhc1NwZWNpZmllciApLAorCQkJVFlQRV9BTElBU19TUEVDSUZJRVIsIGFDb21waWxlZFR5cGUsIGFUeXBlU3BlY2lmaWVyKSwKKwltVGFyZ2V0U3BlY2lmaWVyVHlwZSggYVR5cGVTcGVjaWZpZXIgKQorCXsKKwkJLy8hISEgTk9USElORworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgflR5cGVBbGlhc1NwZWNpZmllcigpCisJeworCQkvLyEhISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtVGFyZ2V0U3BlY2lmaWVyVHlwZQorCSAqLworCWlubGluZSBjb25zdCBUeXBlU3BlY2lmaWVyICYgZ2V0VGFyZ2V0VHlwZVNwZWNpZmllcigpCisJeworCQlyZXR1cm4oIG1UYXJnZXRTcGVjaWZpZXJUeXBlICk7CisJfQorCisJaW5saW5lIEJhc2VUeXBlU3BlY2lmaWVyICogdGFyZ2V0VHlwZVNwZWNpZmllcigpCisJeworCQlyZXR1cm4oIG1UYXJnZXRTcGVjaWZpZXJUeXBlLmlzPCBUeXBlQWxpYXNTcGVjaWZpZXIgPigpID8KKwkJCQltVGFyZ2V0U3BlY2lmaWVyVHlwZS5hbGlhcygpLnRhcmdldFR5cGVTcGVjaWZpZXIoKQorCQkJCTogbVRhcmdldFNwZWNpZmllclR5cGUgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNUYXJnZXRUeXBlU3BlY2lmaWVyKCkgY29uc3QKKwl7CisJCXJldHVybiggbVRhcmdldFNwZWNpZmllclR5cGUudmFsaWQoKSApOworCX0KKworCWlubGluZSB2b2lkIHNldFRhcmdldFR5cGVTcGVjaWZpZXIoY29uc3QgVHlwZVNwZWNpZmllciAmIGFUeXBlU3BlY2lmaWVyKQorCXsKKwkJbVRhcmdldFNwZWNpZmllclR5cGUgPSBhVHlwZVNwZWNpZmllcjsKKwl9CisKKworCS8qKgorCSAqIENPTlNUUkFJTlQgZ2VuZXJhdGlvbgorCSAqIGZvciBhIGdpdmVuIHBhcmFtZXRlcgorCSAqLworCWlubGluZSBCRiBnZW5Db25zdHJhaW50KGNvbnN0IEJGICYgYVBhcmFtKSBjb25zdAorCXsKKwkJaWYoIGhhc0NvbnN0cmFpbnQoKSApCisJCXsKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCTw8ICJUT0RPIDw8IFR5cGVBbGlhc1NwZWNpZmllcjo6Z2VuQ29uc3RyYWludCggIgorCQkJCQk8PCBhUGFyYW0gPDwgIiApID4+IHdpdGggY29tcGlsZWQgY29uc3RyYWludDoiIDw8IHN0ZDo6ZW5kbAorCQkJCQk8PCBnZXRDb25zdHJhaW50KCkKKwkJCQkJPDwgU0VORF9FWElUOworCQl9CisKKwkJcmV0dXJuKCBtVGFyZ2V0U3BlY2lmaWVyVHlwZS5nZW5Db25zdHJhaW50KGFQYXJhbSkgKTsKKwl9CisKKworCS8qKgorCSAqIEZvcm1hdCBhIHZhbHVlIHcuci50LiBpdHMgdHlwZQorCSAqLworCWlubGluZSB2aXJ0dWFsIHZvaWQgZm9ybWF0U3RyZWFtKE91dFN0cmVhbSAmIG9zLCBjb25zdCBCRiAmIGJmVmFsdWUpIGNvbnN0CisJeworCQltVGFyZ2V0U3BlY2lmaWVyVHlwZS5mb3JtYXRTdHJlYW0ob3MsIGJmVmFsdWUpOworCX0KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgZm9ybWF0U3RyZWFtKAorCQkJT3V0U3RyZWFtICYgb3MsIGNvbnN0IEFycmF5QkYgJiBhcnJheVZhbHVlKSBjb25zdAorCXsKKwkJbVRhcmdldFNwZWNpZmllclR5cGUuZm9ybWF0U3RyZWFtKG9zLCBhcnJheVZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJdmlydHVhbCBzdGQ6OnN0cmluZyBzdHJUKCkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0TmFtZUlEKCkgKTsKKwl9CisKKwl2aXJ0dWFsIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCit9OworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworCisjZW5kaWYgLyogVFlQRUFMSUFTU1BFQ0lGSUVSX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvdHlwZS9UeXBlTWFuYWdlci5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvdHlwZS9UeXBlTWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM0YjZjOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90eXBlL1R5cGVNYW5hZ2VyLmNwcApAQCAtMCwwICsxLDc1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDI2IGFvw7t0IDIwMDgKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKKyNpbmNsdWRlICJUeXBlTWFuYWdlci5oIgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkNvbnN0YW50Lmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorICogVHlwZU1hbmFnZXIKKyAqIHNpbmdsZXRvbgorICovCitjb25zdCBUeXBlTWFuYWdlciAmIFR5cGVGYWN0b3J5ID0gKiggVHlwZU1hbmFnZXI6OnNpbmdsZXRvbigpICk7CisKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBSSU1JVEUgVFlQRSBOQU1FIElERU5USUZJRVIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworY29uc3Qgc3RkOjpzdHJpbmcgJiBUeXBlTWFuYWdlcjo6VFlQRV9BUlJBWV9JRCAgICAgPSAiYXJyYXkiOworY29uc3Qgc3RkOjpzdHJpbmcgJiBUeXBlTWFuYWdlcjo6VFlQRV9WRUNUT1JfSUQgICAgPSAidmVjdG9yIjsKK2NvbnN0IHN0ZDo6c3RyaW5nICYgVHlwZU1hbmFnZXI6OlRZUEVfUkVWRVJTRV9WRUNUT1JfSUQgPSAicnZlY3RvciI7Citjb25zdCBzdGQ6OnN0cmluZyAmIFR5cGVNYW5hZ2VyOjpUWVBFX0xJU1RfSUQgICAgICA9ICJsaXN0IjsKK2NvbnN0IHN0ZDo6c3RyaW5nICYgVHlwZU1hbmFnZXI6OlRZUEVfU0VUX0lEICAgICAgID0gInNldCI7Citjb25zdCBzdGQ6OnN0cmluZyAmIFR5cGVNYW5hZ2VyOjpUWVBFX01VTFRJU0VUX0lEICA9ICJtdWx0aXNldCI7Citjb25zdCBzdGQ6OnN0cmluZyAmIFR5cGVNYW5hZ2VyOjpUWVBFX0JBR19JRCAgICAgICA9ICJiYWciOworCitjb25zdCBzdGQ6OnN0cmluZyAmIFR5cGVNYW5hZ2VyOjpUWVBFX0ZJRk9fSUQgICAgICA9ICJmaWZvIjsKK2NvbnN0IHN0ZDo6c3RyaW5nICYgVHlwZU1hbmFnZXI6OlRZUEVfTElGT19JRCAgICAgID0gImxpZm8iOworCitjb25zdCBzdGQ6OnN0cmluZyAmIFR5cGVNYW5hZ2VyOjpUWVBFX0VOVU1fSUQgICAgICA9ICJlbnVtIjsKK2NvbnN0IHN0ZDo6c3RyaW5nICYgVHlwZU1hbmFnZXI6OlRZUEVfVU5JT05fSUQgICAgID0gInVuaW9uIjsKK2NvbnN0IHN0ZDo6c3RyaW5nICYgVHlwZU1hbmFnZXI6OlRZUEVfQ0hPSUNFX0lEICAgID0gImNob2ljZSI7Citjb25zdCBzdGQ6OnN0cmluZyAmIFR5cGVNYW5hZ2VyOjpUWVBFX1NUUlVDVFVSRV9JRCA9ICJzdHJ1Y3QiOworY29uc3Qgc3RkOjpzdHJpbmcgJiBUeXBlTWFuYWdlcjo6VFlQRV9DTEFTU19JRCAgICAgPSAiY2xhc3MiOworCitjb25zdCBzdGQ6OnN0cmluZyAmIFR5cGVNYW5hZ2VyOjpUWVBFX0JPT0xfSUQgICAgICA9ICJib29sIjsKK2NvbnN0IHN0ZDo6c3RyaW5nICYgVHlwZU1hbmFnZXI6OlRZUEVfQk9PTEVBTl9JRCAgID0gImJvb2xlYW4iOworCitjb25zdCBzdGQ6OnN0cmluZyAmIFR5cGVNYW5hZ2VyOjpUWVBFX0lOVDhfSUQgICAgICA9ICJpbnQ4IjsKK2NvbnN0IHN0ZDo6c3RyaW5nICYgVHlwZU1hbmFnZXI6OlRZUEVfSU5UMTZfSUQgICAgID0gImludDE2IjsKK2NvbnN0IHN0ZDo6c3RyaW5nICYgVHlwZU1hbmFnZXI6OlRZUEVfSU5UMzJfSUQgICAgID0gImludDMyIjsKK2NvbnN0IHN0ZDo6c3RyaW5nICYgVHlwZU1hbmFnZXI6OlRZUEVfSU5UNjRfSUQgICAgID0gImludDY0IjsKK2NvbnN0IHN0ZDo6c3RyaW5nICYgVHlwZU1hbmFnZXI6OlRZUEVfSU5UMTI4X0lEICAgID0gImludDEyOCI7CisKK2NvbnN0IHN0ZDo6c3RyaW5nICYgVHlwZU1hbmFnZXI6OlRZUEVfSU5UX0lEICAgICAgID0gImludCI7Citjb25zdCBzdGQ6OnN0cmluZyAmIFR5cGVNYW5hZ2VyOjpUWVBFX0lOVEVHRVJfSUQgICA9ICJpbnRlZ2VyIjsKKworY29uc3Qgc3RkOjpzdHJpbmcgJiBUeXBlTWFuYWdlcjo6VFlQRV9SQVRfSUQgICAgICAgPSAicmF0IjsKK2NvbnN0IHN0ZDo6c3RyaW5nICYgVHlwZU1hbmFnZXI6OlRZUEVfUkFUSU9OQUxfSUQgID0gInJhdGlvbmFsIjsKKworY29uc3Qgc3RkOjpzdHJpbmcgJiBUeXBlTWFuYWdlcjo6VFlQRV9GTE9BVF9JRCAgICAgPSAiZmxvYXQiOworY29uc3Qgc3RkOjpzdHJpbmcgJiBUeXBlTWFuYWdlcjo6VFlQRV9ET1VCTEVfSUQgICAgPSAiZG91YmxlIjsKK2NvbnN0IHN0ZDo6c3RyaW5nICYgVHlwZU1hbmFnZXI6OlRZUEVfUkVBTF9JRCAgICAgID0gInJlYWwiOworCitjb25zdCBzdGQ6OnN0cmluZyAmIFR5cGVNYW5hZ2VyOjpUWVBFX1VJTlQ4X0lEICAgICA9ICJ1aW50OCI7Citjb25zdCBzdGQ6OnN0cmluZyAmIFR5cGVNYW5hZ2VyOjpUWVBFX1VJTlQxNl9JRCAgICA9ICJ1aW50MTYiOworY29uc3Qgc3RkOjpzdHJpbmcgJiBUeXBlTWFuYWdlcjo6VFlQRV9VSU5UMzJfSUQgICAgPSAidWludDMyIjsKK2NvbnN0IHN0ZDo6c3RyaW5nICYgVHlwZU1hbmFnZXI6OlRZUEVfVUlOVDY0X0lEICAgID0gInVpbnQ2NCI7Citjb25zdCBzdGQ6OnN0cmluZyAmIFR5cGVNYW5hZ2VyOjpUWVBFX1VJTlQxMjhfSUQgICA9ICJ1aW50MTI4IjsKKworY29uc3Qgc3RkOjpzdHJpbmcgJiBUeXBlTWFuYWdlcjo6VFlQRV9VSU5UX0lEICAgICAgPSAidWludCI7Citjb25zdCBzdGQ6OnN0cmluZyAmIFR5cGVNYW5hZ2VyOjpUWVBFX1VJTlRFR0VSX0lEICA9ICJ1aW50ZWdlciI7CisKK2NvbnN0IHN0ZDo6c3RyaW5nICYgVHlwZU1hbmFnZXI6OlRZUEVfUE9TX0lOVEVHRVJfSUQgID0gInBvc19pbnRlZ2VyIjsKKworY29uc3Qgc3RkOjpzdHJpbmcgJiBUeXBlTWFuYWdlcjo6VFlQRV9VUkFUX0lEICAgICAgPSAidXJhdCI7Citjb25zdCBzdGQ6OnN0cmluZyAmIFR5cGVNYW5hZ2VyOjpUWVBFX1VSQVRJT05BTF9JRCA9ICJ1cmF0aW9uYWwiOworCitjb25zdCBzdGQ6OnN0cmluZyAmIFR5cGVNYW5hZ2VyOjpUWVBFX1VGTE9BVF9JRCAgICA9ICJ1ZmxvYXQiOworY29uc3Qgc3RkOjpzdHJpbmcgJiBUeXBlTWFuYWdlcjo6VFlQRV9VRE9VQkxFX0lEICAgPSAidWRvdWJsZSI7Citjb25zdCBzdGQ6OnN0cmluZyAmIFR5cGVNYW5hZ2VyOjpUWVBFX1VSRUFMX0lEICAgICA9ICJ1cmVhbCI7CisKK2NvbnN0IHN0ZDo6c3RyaW5nICYgVHlwZU1hbmFnZXI6OlRZUEVfQ09OVElOVU9VU19USU1FX0lEID0gImN0aW1lIjsKK2NvbnN0IHN0ZDo6c3RyaW5nICYgVHlwZU1hbmFnZXI6OlRZUEVfRElTQ1JFVEVfVElNRV9JRCAgID0gImR0aW1lIjsKK2NvbnN0IHN0ZDo6c3RyaW5nICYgVHlwZU1hbmFnZXI6OlRZUEVfVElNRV9JRCAgICAgICAgICAgID0gInRpbWUiOworY29uc3Qgc3RkOjpzdHJpbmcgJiBUeXBlTWFuYWdlcjo6VFlQRV9DTE9DS19JRCAgICAgICAgICAgPSAiY2xvY2siOworCitjb25zdCBzdGQ6OnN0cmluZyAmIFR5cGVNYW5hZ2VyOjpUWVBFX0NIQVJfSUQgICAgICA9ICJjaGFyIjsKK2NvbnN0IHN0ZDo6c3RyaW5nICYgVHlwZU1hbmFnZXI6OlRZUEVfQ0hBUkFDVEVSX0lEID0gImNoYXJhY3RlciI7Citjb25zdCBzdGQ6OnN0cmluZyAmIFR5cGVNYW5hZ2VyOjpUWVBFX1NUUklOR19JRCAgICA9ICJzdHJpbmciOworCitjb25zdCBzdGQ6OnN0cmluZyAmIFR5cGVNYW5hZ2VyOjpUWVBFX0lOVEVSVkFMX0lEICA9ICJpbnRlcnZhbCI7CisKKworY29uc3Qgc3RkOjpzdHJpbmcgJiBUeXBlTWFuYWdlcjo6VFlQRV9BUlJBWV9CT09MRUFOX0lEICAgPSAiYXJyYXk8Ym9vbGVhbj4iOworY29uc3Qgc3RkOjpzdHJpbmcgJiBUeXBlTWFuYWdlcjo6VFlQRV9BUlJBWV9DSEFSQUNURVJfSUQgPSAiYXJyYXk8Y2hhcmFjdGVyPiI7Citjb25zdCBzdGQ6OnN0cmluZyAmIFR5cGVNYW5hZ2VyOjpUWVBFX0FSUkFZX0lOVEVHRVJfSUQgICA9ICJhcnJheTxpbnRlZ2VyPiI7Citjb25zdCBzdGQ6OnN0cmluZyAmIFR5cGVNYW5hZ2VyOjpUWVBFX0FSUkFZX1JBVElPTkFMX0lEICA9ICJhcnJheTxyYXRpb25hbD4iOworY29uc3Qgc3RkOjpzdHJpbmcgJiBUeXBlTWFuYWdlcjo6VFlQRV9BUlJBWV9GTE9BVF9JRCAgICAgPSAiYXJyYXk8ZmxvYXQ+IjsKKworY29uc3Qgc3RkOjpzdHJpbmcgJiBUeXBlTWFuYWdlcjo6VFlQRV9BUlJBWV9TVFJJTkdfSUQgICAgID0gImFycmF5PHN0cmluZz4iOworY29uc3Qgc3RkOjpzdHJpbmcgJiBUeXBlTWFuYWdlcjo6VFlQRV9BUlJBWV9JREVOVElGSUVSX0lEID0gImFycmF5PGlkZW50aWZpZXI+IjsKK2NvbnN0IHN0ZDo6c3RyaW5nICYgVHlwZU1hbmFnZXI6OlRZUEVfQVJSQVlfUVVBTElGSUVEX0lERU5USUZJRVJfSUQgPQorCQkJCQkJCQkJCQkJImFycmF5PHF1YWxpZmllZF9pZGVudGlmaWVyPiI7Citjb25zdCBzdGQ6OnN0cmluZyAmIFR5cGVNYW5hZ2VyOjpUWVBFX0FSUkFZX0VOVU1fSUQgICAgICAgPSAiYXJyYXk8ZW51bT4iOworCitjb25zdCBzdGQ6OnN0cmluZyAmIFR5cGVNYW5hZ2VyOjpUWVBFX0FSUkFZX0FOWV9JRCAgICAgICAgPSAiYXJyYXk8YW55PiI7CisKKworY29uc3Qgc3RkOjpzdHJpbmcgJiBUeXBlTWFuYWdlcjo6VFlQRV9MQU1CREFfSUQgICAgICAgPSAibGFtYmRhIjsKKworY29uc3Qgc3RkOjpzdHJpbmcgJiBUeXBlTWFuYWdlcjo6VFlQRV9PUEVSQVRPUl9JRCAgICAgPSAib3BlcmF0b3IiOworY29uc3Qgc3RkOjpzdHJpbmcgJiBUeXBlTWFuYWdlcjo6VFlQRV9BVk1DT0RFX0lEICAgICAgPSAiYXZtY29kZSI7Citjb25zdCBzdGQ6OnN0cmluZyAmIFR5cGVNYW5hZ2VyOjpUWVBFX0VYUFJFU1NJT05fSUQgICA9ICJleHByZXNzaW9uIjsKKworY29uc3Qgc3RkOjpzdHJpbmcgJiBUeXBlTWFuYWdlcjo6VFlQRV9QT1JUX0lEICAgICAgICAgPSAicG9ydCI7Citjb25zdCBzdGQ6OnN0cmluZyAmIFR5cGVNYW5hZ2VyOjpUWVBFX01FU1NBR0VfSUQgICAgICA9ICJtZXNzYWdlIjsKK2NvbnN0IHN0ZDo6c3RyaW5nICYgVHlwZU1hbmFnZXI6OlRZUEVfU0lHTkFMX0lEICAgICAgID0gInNpZ25hbCI7Citjb25zdCBzdGQ6OnN0cmluZyAmIFR5cGVNYW5hZ2VyOjpUWVBFX0JVRkZFUl9JRCAgICAgICA9ICJidWZmZXIiOworY29uc3Qgc3RkOjpzdHJpbmcgJiBUeXBlTWFuYWdlcjo6VFlQRV9DT05ORUNUT1JfSUQgICAgPSAiY29ubmVjdG9yIjsKK2NvbnN0IHN0ZDo6c3RyaW5nICYgVHlwZU1hbmFnZXI6OlRZUEVfTUFDSElORV9JRCAgICAgID0gIm1hY2hpbmUiOworY29uc3Qgc3RkOjpzdHJpbmcgJiBUeXBlTWFuYWdlcjo6VFlQRV9SSURfSUQgICAgICAgICAgPSAiUnVudGltZUlEIjsKKworY29uc3Qgc3RkOjpzdHJpbmcgJiBUeXBlTWFuYWdlcjo6VFlQRV9VTklWRVJTQUxfSUQgICAgPSAidW5pdmVyc2FsIjsKKworY29uc3Qgc3RkOjpzdHJpbmcgJiBUeXBlTWFuYWdlcjo6VFlQRV9TSU1VTElOS19CVVNfSUQgPSAic2ltdWxpbmtCdXMiOworCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQUklNSVRFIFRZUEUgU1BFQ0lGSUVSCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK1R5cGVTcGVjaWZpZXIgVHlwZU1hbmFnZXI6OkJPT0w7CitUeXBlU3BlY2lmaWVyIFR5cGVNYW5hZ2VyOjpCT09MRUFOOworCitUeXBlU3BlY2lmaWVyIFR5cGVNYW5hZ2VyOjpJTlQ4OworVHlwZVNwZWNpZmllciBUeXBlTWFuYWdlcjo6VUlOVDg7CisKK1R5cGVTcGVjaWZpZXIgVHlwZU1hbmFnZXI6OklOVDE2OworVHlwZVNwZWNpZmllciBUeXBlTWFuYWdlcjo6VUlOVDE2OworCitUeXBlU3BlY2lmaWVyIFR5cGVNYW5hZ2VyOjpJTlQzMjsKK1R5cGVTcGVjaWZpZXIgVHlwZU1hbmFnZXI6OlVJTlQzMjsKKworVHlwZVNwZWNpZmllciBUeXBlTWFuYWdlcjo6SU5UNjQ7CitUeXBlU3BlY2lmaWVyIFR5cGVNYW5hZ2VyOjpVSU5UNjQ7CisKK1R5cGVTcGVjaWZpZXIgVHlwZU1hbmFnZXI6OklOVDEyODsKK1R5cGVTcGVjaWZpZXIgVHlwZU1hbmFnZXI6OlVJTlQxMjg7CisKK1R5cGVTcGVjaWZpZXIgVHlwZU1hbmFnZXI6OklOVDsKK1R5cGVTcGVjaWZpZXIgVHlwZU1hbmFnZXI6OlVJTlQ7CisKK1R5cGVTcGVjaWZpZXIgVHlwZU1hbmFnZXI6OklOVEVHRVI7CitUeXBlU3BlY2lmaWVyIFR5cGVNYW5hZ2VyOjpVSU5URUdFUjsKK1R5cGVTcGVjaWZpZXIgVHlwZU1hbmFnZXI6OlBPU19JTlRFR0VSOworCitUeXBlU3BlY2lmaWVyIFR5cGVNYW5hZ2VyOjpSQVQ7CitUeXBlU3BlY2lmaWVyIFR5cGVNYW5hZ2VyOjpVUkFUOworCitUeXBlU3BlY2lmaWVyIFR5cGVNYW5hZ2VyOjpSQVRJT05BTDsKK1R5cGVTcGVjaWZpZXIgVHlwZU1hbmFnZXI6OlVSQVRJT05BTDsKKworCitUeXBlU3BlY2lmaWVyIFR5cGVNYW5hZ2VyOjpGTE9BVDsKK1R5cGVTcGVjaWZpZXIgVHlwZU1hbmFnZXI6OlVGTE9BVDsKKworVHlwZVNwZWNpZmllciBUeXBlTWFuYWdlcjo6RE9VQkxFOworVHlwZVNwZWNpZmllciBUeXBlTWFuYWdlcjo6VURPVUJMRTsKKworVHlwZVNwZWNpZmllciBUeXBlTWFuYWdlcjo6UkVBTDsKK1R5cGVTcGVjaWZpZXIgVHlwZU1hbmFnZXI6OlVSRUFMOworCisKK1R5cGVTcGVjaWZpZXIgVHlwZU1hbmFnZXI6OkNMT0NLOworVHlwZVNwZWNpZmllciBUeXBlTWFuYWdlcjo6VElNRTsKK1R5cGVTcGVjaWZpZXIgVHlwZU1hbmFnZXI6OkNPTlRJTlVPVVNfVElNRTsKK1R5cGVTcGVjaWZpZXIgVHlwZU1hbmFnZXI6OkRJU0NSRVRFX1RJTUU7CisKK1R5cGVTcGVjaWZpZXIgVHlwZU1hbmFnZXI6OkNIQVI7CitUeXBlU3BlY2lmaWVyIFR5cGVNYW5hZ2VyOjpDSEFSQUNURVI7CitUeXBlU3BlY2lmaWVyIFR5cGVNYW5hZ2VyOjpTVFJJTkc7CisKK1R5cGVTcGVjaWZpZXIgVHlwZU1hbmFnZXI6OklERU5USUZJRVI7CitUeXBlU3BlY2lmaWVyIFR5cGVNYW5hZ2VyOjpRVUFMSUZJRURfSURFTlRJRklFUjsKKworVHlwZVNwZWNpZmllciBUeXBlTWFuYWdlcjo6TEFNQkRBOworCitUeXBlU3BlY2lmaWVyIFR5cGVNYW5hZ2VyOjpPUEVSQVRPUjsKK1R5cGVTcGVjaWZpZXIgVHlwZU1hbmFnZXI6OkFWTUNPREU7CitUeXBlU3BlY2lmaWVyIFR5cGVNYW5hZ2VyOjpFWFBSRVNTSU9OOworCitUeXBlU3BlY2lmaWVyIFR5cGVNYW5hZ2VyOjpDSEFOTkVMOworVHlwZVNwZWNpZmllciBUeXBlTWFuYWdlcjo6UE9SVDsKK1R5cGVTcGVjaWZpZXIgVHlwZU1hbmFnZXI6Ok1FU1NBR0U7CitUeXBlU3BlY2lmaWVyIFR5cGVNYW5hZ2VyOjpTSUdOQUw7CitUeXBlU3BlY2lmaWVyIFR5cGVNYW5hZ2VyOjpCVUZGRVI7CitUeXBlU3BlY2lmaWVyIFR5cGVNYW5hZ2VyOjpDT05ORUNUT1I7CitUeXBlU3BlY2lmaWVyIFR5cGVNYW5hZ2VyOjpNQUNISU5FOworCitUeXBlU3BlY2lmaWVyIFR5cGVNYW5hZ2VyOjpBUlJBWV9CT09MRUFOOworVHlwZVNwZWNpZmllciBUeXBlTWFuYWdlcjo6QVJSQVlfQ0hBUkFDVEVSOworVHlwZVNwZWNpZmllciBUeXBlTWFuYWdlcjo6QVJSQVlfSU5URUdFUjsKK1R5cGVTcGVjaWZpZXIgVHlwZU1hbmFnZXI6OkFSUkFZX1JBVElPTkFMOworVHlwZVNwZWNpZmllciBUeXBlTWFuYWdlcjo6QVJSQVlfRkxPQVQ7CisKK1R5cGVTcGVjaWZpZXIgVHlwZU1hbmFnZXI6OkFSUkFZX1NUUklORzsKK1R5cGVTcGVjaWZpZXIgVHlwZU1hbmFnZXI6OkFSUkFZX0lERU5USUZJRVI7CitUeXBlU3BlY2lmaWVyIFR5cGVNYW5hZ2VyOjpBUlJBWV9RVUFMSUZJRURfSURFTlRJRklFUjsKK1R5cGVTcGVjaWZpZXIgVHlwZU1hbmFnZXI6OkFSUkFZX0VOVU07CisKK1R5cGVTcGVjaWZpZXIgVHlwZU1hbmFnZXI6OkFSUkFZX0FOWTsKKworVHlwZVNwZWNpZmllciBUeXBlTWFuYWdlcjo6QVJSQVk7CitUeXBlU3BlY2lmaWVyIFR5cGVNYW5hZ2VyOjpWRUNUT1I7CitUeXBlU3BlY2lmaWVyIFR5cGVNYW5hZ2VyOjpMSVNUOworVHlwZVNwZWNpZmllciBUeXBlTWFuYWdlcjo6U0VUOworVHlwZVNwZWNpZmllciBUeXBlTWFuYWdlcjo6TVVMVElTRVQ7CitUeXBlU3BlY2lmaWVyIFR5cGVNYW5hZ2VyOjpCQUc7CisKK1R5cGVTcGVjaWZpZXIgVHlwZU1hbmFnZXI6OkVOVU07CitUeXBlU3BlY2lmaWVyIFR5cGVNYW5hZ2VyOjpDTEFTUzsKK1R5cGVTcGVjaWZpZXIgVHlwZU1hbmFnZXI6OlNUUlVDVFVSRTsKK1R5cGVTcGVjaWZpZXIgVHlwZU1hbmFnZXI6OlVOSU9OOworVHlwZVNwZWNpZmllciBUeXBlTWFuYWdlcjo6Q0hPSUNFOworVHlwZVNwZWNpZmllciBUeXBlTWFuYWdlcjo6SU5URVJWQUw7CisKKworVHlwZVNwZWNpZmllciBUeXBlTWFuYWdlcjo6VU5JVkVSU0FMOworCisKKworLyoqCisgKiBMT0FERVIKKyAqLwordm9pZCBUeXBlTWFuYWdlcjo6bG9hZCgpCit7CisJLy8gVHlwZU1hbmFnZXI6PiBUeXBlU3BlY2lmaWVyLCBDb21waWxlZFR5cGUsIFR5cGUgU2l6ZSwgRGF0YSBTaXplCisJLyoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogUFJJTUlURSBUWVBFIFNQRUNJRklFUgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKi8KKwlUeXBlTWFuYWdlcjo6cmVnaXN0ZXJQcmltaXRpdmVUeXBlKAorCQkJQk9PTCA9IG5ld051bWVyaWNUeXBlU3BlY2lmaWVyKAorCQkJCQlUWVBFX0JPT0xfSUQsIFRZUEVfQk9PTEVBTl9TUEVDSUZJRVIsCisJCQkJCTEsIDEsIEV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9GQUxTRSApICk7CisKKwlUeXBlTWFuYWdlcjo6cmVnaXN0ZXJQcmltaXRpdmVUeXBlKAorCQkJQk9PTEVBTiA9IG5ld051bWVyaWNUeXBlU3BlY2lmaWVyKAorCQkJCQlUWVBFX0JPT0xFQU5fSUQsIFRZUEVfQk9PTEVBTl9TUEVDSUZJRVIsCisJCQkJCTEsIDEsIEV4cHJlc3Npb25Db25zdGFudDo6Qk9PTEVBTl9GQUxTRSApICk7CisKKworCVR5cGVNYW5hZ2VyOjpyZWdpc3RlclByaW1pdGl2ZVR5cGUoCisJCQlJTlQ4ID0gbmV3TnVtZXJpY1R5cGVTcGVjaWZpZXIoCisJCQkJCVRZUEVfSU5UOF9JRCwgVFlQRV9JTlRFR0VSX1NQRUNJRklFUiwKKwkJCQkJMSwgOCwgRXhwcmVzc2lvbkNvbnN0YW50OjpJTlRFR0VSX1pFUk8gKSApOworCisJVHlwZU1hbmFnZXI6OnJlZ2lzdGVyUHJpbWl0aXZlVHlwZSgKKwkJCVVJTlQ4ID0gbmV3TnVtZXJpY1R5cGVTcGVjaWZpZXIoCisJCQkJCVRZUEVfVUlOVDhfSUQsIFRZUEVfVUlOVEVHRVJfU1BFQ0lGSUVSLAorCQkJCQkxLCA4LCBFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfWkVSTyApICk7CisKKwlUeXBlTWFuYWdlcjo6cmVnaXN0ZXJQcmltaXRpdmVUeXBlKAorCQkJSU5UMTYgPSBuZXdOdW1lcmljVHlwZVNwZWNpZmllcigKKwkJCQkJVFlQRV9JTlQxNl9JRCwgVFlQRV9JTlRFR0VSX1NQRUNJRklFUiwKKwkJCQkJMSwgMTYsIEV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9aRVJPICkgKTsKKworCVR5cGVNYW5hZ2VyOjpyZWdpc3RlclByaW1pdGl2ZVR5cGUoCisJCQlVSU5UMTYgPSBuZXdOdW1lcmljVHlwZVNwZWNpZmllcigKKwkJCQkJVFlQRV9VSU5UMTZfSUQsIFRZUEVfVUlOVEVHRVJfU1BFQ0lGSUVSLAorCQkJCQkxLCAxNiwgRXhwcmVzc2lvbkNvbnN0YW50OjpJTlRFR0VSX1pFUk8gKSApOworCisJVHlwZU1hbmFnZXI6OnJlZ2lzdGVyUHJpbWl0aXZlVHlwZSgKKwkJCUlOVDMyID0gbmV3TnVtZXJpY1R5cGVTcGVjaWZpZXIoCisJCQkJCVRZUEVfSU5UMzJfSUQsIFRZUEVfSU5URUdFUl9TUEVDSUZJRVIsCisJCQkJCTEsIDMyLCBFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfWkVSTyApICk7CisKKwlUeXBlTWFuYWdlcjo6cmVnaXN0ZXJQcmltaXRpdmVUeXBlKAorCQkJVUlOVDMyID0gbmV3TnVtZXJpY1R5cGVTcGVjaWZpZXIoCisJCQkJCVRZUEVfVUlOVDMyX0lELCBUWVBFX1VJTlRFR0VSX1NQRUNJRklFUiwKKwkJCQkJMSwgMzIsIEV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9aRVJPICkgKTsKKworCVR5cGVNYW5hZ2VyOjpyZWdpc3RlclByaW1pdGl2ZVR5cGUoCisJCQlJTlQ2NCA9IG5ld051bWVyaWNUeXBlU3BlY2lmaWVyKAorCQkJCQlUWVBFX0lOVDY0X0lELCBUWVBFX0lOVEVHRVJfU1BFQ0lGSUVSLAorCQkJCQkxLCA2NCwgRXhwcmVzc2lvbkNvbnN0YW50OjpJTlRFR0VSX1pFUk8gKSApOworCisJVHlwZU1hbmFnZXI6OnJlZ2lzdGVyUHJpbWl0aXZlVHlwZSgKKwkJCVVJTlQ2NCA9IG5ld051bWVyaWNUeXBlU3BlY2lmaWVyKAorCQkJCQlUWVBFX1VJTlQ2NF9JRCwgVFlQRV9VSU5URUdFUl9TUEVDSUZJRVIsCisJCQkJCTEsIDY0LCBFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfWkVSTyApICk7CisKKwlUeXBlTWFuYWdlcjo6cmVnaXN0ZXJQcmltaXRpdmVUeXBlKAorCQkJSU5UMTI4ID0gbmV3TnVtZXJpY1R5cGVTcGVjaWZpZXIoCisJCQkJCVRZUEVfSU5UMTI4X0lELCBUWVBFX0lOVEVHRVJfU1BFQ0lGSUVSLAorCQkJCQkxLCAxMjgsIEV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9aRVJPICkgKTsKKworCVR5cGVNYW5hZ2VyOjpyZWdpc3RlclByaW1pdGl2ZVR5cGUoCisJCQlVSU5UMTI4ID0gbmV3TnVtZXJpY1R5cGVTcGVjaWZpZXIoCisJCQkJCVRZUEVfVUlOVDEyOF9JRCwgVFlQRV9VSU5URUdFUl9TUEVDSUZJRVIsCisJCQkJCTEsIDEyOCwgRXhwcmVzc2lvbkNvbnN0YW50OjpJTlRFR0VSX1pFUk8gKSApOworCisKKwlUeXBlTWFuYWdlcjo6cmVnaXN0ZXJQcmltaXRpdmVUeXBlKAorCQkJSU5UID0gbmV3TnVtZXJpY1R5cGVTcGVjaWZpZXIoCisJCQkJCVRZUEVfSU5UX0lELCBUWVBFX0lOVEVHRVJfU1BFQ0lGSUVSLAorCQkJCQkxLCAwLCBFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfWkVSTyApICk7CisKKwlUeXBlTWFuYWdlcjo6cmVnaXN0ZXJQcmltaXRpdmVUeXBlKAorCQkJSU5URUdFUiA9IG5ld051bWVyaWNUeXBlU3BlY2lmaWVyKAorCQkJCQlUWVBFX0lOVEVHRVJfSUQsIFRZUEVfSU5URUdFUl9TUEVDSUZJRVIsCisJCQkJCTEsIDAsIEV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9aRVJPICkgKTsKKworCisJVHlwZU1hbmFnZXI6OnJlZ2lzdGVyUHJpbWl0aXZlVHlwZSgKKwkJCVVJTlQgPSBuZXdOdW1lcmljVHlwZVNwZWNpZmllcigKKwkJCQkJVFlQRV9VSU5UX0lELCBUWVBFX1VJTlRFR0VSX1NQRUNJRklFUiwKKwkJCQkJMSwgMCwgRXhwcmVzc2lvbkNvbnN0YW50OjpJTlRFR0VSX1pFUk8gKSApOworCisJVHlwZU1hbmFnZXI6OnJlZ2lzdGVyUHJpbWl0aXZlVHlwZSgKKwkJCVVJTlRFR0VSID0gbmV3TnVtZXJpY1R5cGVTcGVjaWZpZXIoCisJCQkJCVRZUEVfVUlOVEVHRVJfSUQsIFRZUEVfVUlOVEVHRVJfU1BFQ0lGSUVSLAorCQkJCQkxLCAwLCBFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfWkVSTyApICk7CisKKwlUeXBlTWFuYWdlcjo6cmVnaXN0ZXJQcmltaXRpdmVUeXBlKAorCQkJUE9TX0lOVEVHRVIgPSBuZXdOdW1lcmljVHlwZVNwZWNpZmllcigKKwkJCQkJVFlQRV9QT1NfSU5URUdFUl9JRCwgVFlQRV9QT1NfSU5URUdFUl9TUEVDSUZJRVIsCisJCQkJCTEsIDAsIEV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9PTkUgKSApOworCisKKworCVR5cGVNYW5hZ2VyOjpyZWdpc3RlclByaW1pdGl2ZVR5cGUoCisJCQlSQVQgPSBuZXdOdW1lcmljVHlwZVNwZWNpZmllcigKKwkJCQkJVFlQRV9SQVRfSUQsIFRZUEVfUkFUSU9OQUxfU1BFQ0lGSUVSLAorCQkJCQkxLCAwLCBFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfWkVSTyApICk7CisKKwlUeXBlTWFuYWdlcjo6cmVnaXN0ZXJQcmltaXRpdmVUeXBlKAorCQkJUkFUSU9OQUwgPSBuZXdOdW1lcmljVHlwZVNwZWNpZmllcigKKwkJCQkJVFlQRV9SQVRJT05BTF9JRCwgVFlQRV9SQVRJT05BTF9TUEVDSUZJRVIsCisJCQkJCTEsIDAsIEV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9aRVJPICkgKTsKKworCisJVHlwZU1hbmFnZXI6OnJlZ2lzdGVyUHJpbWl0aXZlVHlwZSgKKwkJCVVSQVQgPSBuZXdOdW1lcmljVHlwZVNwZWNpZmllcigKKwkJCQkJVFlQRV9VUkFUX0lELCBUWVBFX1VSQVRJT05BTF9TUEVDSUZJRVIsCisJCQkJCTEsIDAsIEV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9aRVJPICkgKTsKKworCVR5cGVNYW5hZ2VyOjpyZWdpc3RlclByaW1pdGl2ZVR5cGUoCisJCQlVUkFUSU9OQUwgPSBuZXdOdW1lcmljVHlwZVNwZWNpZmllcigKKwkJCQkJVFlQRV9VUkFUSU9OQUxfSUQsIFRZUEVfVVJBVElPTkFMX1NQRUNJRklFUiwKKwkJCQkJMSwgMCwgRXhwcmVzc2lvbkNvbnN0YW50OjpJTlRFR0VSX1pFUk8gKSApOworCisKKwlUeXBlTWFuYWdlcjo6cmVnaXN0ZXJQcmltaXRpdmVUeXBlKAorCQkJRkxPQVQgPSBuZXdOdW1lcmljVHlwZVNwZWNpZmllcigKKwkJCQkJVFlQRV9GTE9BVF9JRCwgVFlQRV9GTE9BVF9TUEVDSUZJRVIsCisJCQkJCTEsIDMyLCBFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfWkVSTyApICk7CisKKwlUeXBlTWFuYWdlcjo6cmVnaXN0ZXJQcmltaXRpdmVUeXBlKAorCQkJVUZMT0FUID0gbmV3TnVtZXJpY1R5cGVTcGVjaWZpZXIoCisJCQkJCVRZUEVfVUZMT0FUX0lELCBUWVBFX1VGTE9BVF9TUEVDSUZJRVIsCisJCQkJCTEsIDMyLCBFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfWkVSTyApICk7CisKKwlUeXBlTWFuYWdlcjo6cmVnaXN0ZXJQcmltaXRpdmVUeXBlKAorCQkJRE9VQkxFID0gbmV3TnVtZXJpY1R5cGVTcGVjaWZpZXIoCisJCQkJCVRZUEVfRE9VQkxFX0lELCBUWVBFX0ZMT0FUX1NQRUNJRklFUiwKKwkJCQkJMSwgNjQsIEV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9aRVJPICkgKTsKKworCVR5cGVNYW5hZ2VyOjpyZWdpc3RlclByaW1pdGl2ZVR5cGUoCisJCQlVRE9VQkxFID0gbmV3TnVtZXJpY1R5cGVTcGVjaWZpZXIoCisJCQkJCVRZUEVfVURPVUJMRV9JRCwgVFlQRV9VRkxPQVRfU1BFQ0lGSUVSLAorCQkJCQkxLCA2NCwgRXhwcmVzc2lvbkNvbnN0YW50OjpJTlRFR0VSX1pFUk8gKSApOworCisJVHlwZU1hbmFnZXI6OnJlZ2lzdGVyUHJpbWl0aXZlVHlwZSgKKwkJCVJFQUwgPSBuZXdOdW1lcmljVHlwZVNwZWNpZmllcigKKwkJCQkJVFlQRV9SRUFMX0lELCBUWVBFX1JFQUxfU1BFQ0lGSUVSLAorCQkJCQkxLCAwLCBFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfWkVSTyApICk7CisKKwlUeXBlTWFuYWdlcjo6cmVnaXN0ZXJQcmltaXRpdmVUeXBlKAorCQkJVVJFQUwgPSBuZXdOdW1lcmljVHlwZVNwZWNpZmllcigKKwkJCQkJVFlQRV9VUkVBTF9JRCwgVFlQRV9VUkVBTF9TUEVDSUZJRVIsCisJCQkJCTEsIDAsIEV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9aRVJPICkgKTsKKworCisJVHlwZU1hbmFnZXI6OnJlZ2lzdGVyUHJpbWl0aXZlVHlwZSgKKwkJCUNMT0NLID0gbmV3VHlwZVNwZWNpZmllcigKKwkJCQkJVFlQRV9DTE9DS19JRCwgVFlQRV9DTE9DS19TUEVDSUZJRVIsCisJCQkJCTEsIDEsIDAsIEV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9aRVJPICkgKTsKKworCVR5cGVNYW5hZ2VyOjpyZWdpc3RlclByaW1pdGl2ZVR5cGUoCisJCQlUSU1FID0gbmV3VHlwZVNwZWNpZmllcigKKwkJCQkJVFlQRV9USU1FX0lELCBUWVBFX1RJTUVfU1BFQ0lGSUVSLAorCQkJCQkxLCAxLCAwLCBFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfWkVSTyApICk7CisKKwlUeXBlTWFuYWdlcjo6cmVnaXN0ZXJQcmltaXRpdmVUeXBlKAorCQkJQ09OVElOVU9VU19USU1FID0gbmV3VHlwZVNwZWNpZmllcigKKwkJCQkJVFlQRV9DT05USU5VT1VTX1RJTUVfSUQsIFRZUEVfQ09OVElOVU9VU19USU1FX1NQRUNJRklFUiwKKwkJCQkJMSwgMSwgMCwgRXhwcmVzc2lvbkNvbnN0YW50OjpJTlRFR0VSX1pFUk8gKSApOworCisJVHlwZU1hbmFnZXI6OnJlZ2lzdGVyUHJpbWl0aXZlVHlwZSgKKwkJCURJU0NSRVRFX1RJTUUgPSBuZXdUeXBlU3BlY2lmaWVyKAorCQkJCQlUWVBFX0RJU0NSRVRFX1RJTUVfSUQsIFRZUEVfRElTQ1JFVEVfVElNRV9TUEVDSUZJRVIsCisJCQkJCTEsIDEsIDAsIEV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9aRVJPICkgKTsKKworCisJVHlwZU1hbmFnZXI6OnJlZ2lzdGVyUHJpbWl0aXZlVHlwZSgKKwkJCUNIQVIgPSBuZXdDaGFyYWN0ZXIoVFlQRV9DSEFSX0lELCAxKSApOworCisJVHlwZU1hbmFnZXI6OnJlZ2lzdGVyUHJpbWl0aXZlVHlwZSgKKwkJCUNIQVJBQ1RFUiA9IG5ld0NoYXJhY3RlcihUWVBFX0NIQVJBQ1RFUl9JRCwgMSkgKTsKKworCVR5cGVNYW5hZ2VyOjpyZWdpc3RlclByaW1pdGl2ZVR5cGUoCisJCQlTVFJJTkcgPSBuZXdTdHJpbmcoIDAgLCBBVk1fTlVNRVJJQ19NQVhfU0laRV9UICApICk7CisKKwlUeXBlTWFuYWdlcjo6cmVnaXN0ZXJQcmltaXRpdmVUeXBlKAorCQkJSURFTlRJRklFUiA9IG5ld1R5cGVTcGVjaWZpZXIoCisJCQkJCVRZUEVfU1RSSU5HX0lELCBUWVBFX0lERU5USUZJRVJfU1BFQ0lGSUVSLAorCQkJCQkxLCAxLCAwLCBFeHByZXNzaW9uQ29uc3RhbnQ6OlNUUklOR19FTVBUWSApICk7CisKKwlUeXBlTWFuYWdlcjo6cmVnaXN0ZXJQcmltaXRpdmVUeXBlKAorCQkJUVVBTElGSUVEX0lERU5USUZJRVIgPSBuZXdUeXBlU3BlY2lmaWVyKAorCQkJCQlUWVBFX1NUUklOR19JRCwgVFlQRV9RVUFMSUZJRURfSURFTlRJRklFUl9TUEVDSUZJRVIsCisJCQkJCTEsIDEsIDAsIEV4cHJlc3Npb25Db25zdGFudDo6U1RSSU5HX0VNUFRZICkgKTsKKworCVR5cGVNYW5hZ2VyOjpyZWdpc3RlclByaW1pdGl2ZVR5cGUoCisJCQlMQU1CREEgPSBuZXdUeXBlU3BlY2lmaWVyKAorCQkJCQlUWVBFX0xBTUJEQV9JRCwgVFlQRV9MQU1CREFfU1BFQ0lGSUVSLCAxLCAxLCAwICkgKTsKKworCisJVHlwZU1hbmFnZXI6OnJlZ2lzdGVyUHJpbWl0aXZlVHlwZSgKKwkJCU9QRVJBVE9SID0gbmV3VHlwZVNwZWNpZmllcigKKwkJCQkJVFlQRV9PUEVSQVRPUl9JRCwgVFlQRV9PUEVSQVRPUl9TUEVDSUZJRVIsIDEsIDEsIDAgKSApOworCisJVHlwZU1hbmFnZXI6OnJlZ2lzdGVyUHJpbWl0aXZlVHlwZSgKKwkJCUFWTUNPREUgPSBuZXdUeXBlU3BlY2lmaWVyKAorCQkJCQlUWVBFX0FWTUNPREVfSUQsIFRZUEVfQVZNQ09ERV9TUEVDSUZJRVIsIDEsIDEsIDAgKSApOworCisJVHlwZU1hbmFnZXI6OnJlZ2lzdGVyUHJpbWl0aXZlVHlwZSgKKwkJCUNIQU5ORUwgPSBuZXdUeXBlU3BlY2lmaWVyKAorCQkJCQlUWVBFX1BPUlRfSUQsIFRZUEVfQ0hBTk5FTF9TUEVDSUZJRVIsIDEsIDEsIDAgKSApOworCisJVHlwZU1hbmFnZXI6OnJlZ2lzdGVyUHJpbWl0aXZlVHlwZSgKKwkJCVBPUlQgPSBuZXdUeXBlU3BlY2lmaWVyKAorCQkJCQlUWVBFX1BPUlRfSUQsIFRZUEVfUE9SVF9TUEVDSUZJRVIsIDEsIDEsIDAgKSApOworCisJVHlwZU1hbmFnZXI6OnJlZ2lzdGVyUHJpbWl0aXZlVHlwZSgKKwkJCU1FU1NBR0UgPSBuZXdUeXBlU3BlY2lmaWVyKAorCQkJCQlUWVBFX01FU1NBR0VfSUQsIFRZUEVfTUVTU0FHRV9TUEVDSUZJRVIsIDEsIDEsIDAgKSApOworCisJVHlwZU1hbmFnZXI6OnJlZ2lzdGVyUHJpbWl0aXZlVHlwZSgKKwkJCVNJR05BTCA9IG5ld1R5cGVTcGVjaWZpZXIoCisJCQkJCVRZUEVfU0lHTkFMX0lELCBUWVBFX1NJR05BTF9TUEVDSUZJRVIsIDEsIDEsIDAgKSApOworCisJVHlwZU1hbmFnZXI6OnJlZ2lzdGVyUHJpbWl0aXZlVHlwZSgKKwkJCUJVRkZFUiA9IG5ld1R5cGVTcGVjaWZpZXIoCisJCQkJCVRZUEVfQlVGRkVSX0lELCBUWVBFX0JVRkZFUl9TUEVDSUZJRVIsIDEsIDEsIDAgKSApOworCisJVHlwZU1hbmFnZXI6OnJlZ2lzdGVyUHJpbWl0aXZlVHlwZSgKKwkJCUNPTk5FQ1RPUiA9IG5ld1R5cGVTcGVjaWZpZXIoCisJCQkJCVRZUEVfQ09OTkVDVE9SX0lELCBUWVBFX0NPTk5FQ1RPUl9TUEVDSUZJRVIsIDEsIDEsIDAgKSApOworCisJVHlwZU1hbmFnZXI6OnJlZ2lzdGVyUHJpbWl0aXZlVHlwZSgKKwkJCU1BQ0hJTkUgPSBuZXdUeXBlU3BlY2lmaWVyKAorCQkJCQlUWVBFX01BQ0hJTkVfSUQsIFRZUEVfTUFDSElORV9TUEVDSUZJRVIsIDEsIDEsIDAgKSApOworCisKKwlUeXBlTWFuYWdlcjo6cmVnaXN0ZXJQcmltaXRpdmVUeXBlKAorCQkJQVJSQVlfQk9PTEVBTiA9IG5ld0FycmF5KAorCQkJCQlUWVBFX0FSUkFZX0JPT0xFQU5fSUQsIEJPT0xFQU4sIDAgKSApOworCisJVHlwZU1hbmFnZXI6OnJlZ2lzdGVyUHJpbWl0aXZlVHlwZSgKKwkJCUFSUkFZX0NIQVJBQ1RFUiA9IG5ld0FycmF5KAorCQkJCQlUWVBFX0FSUkFZX0NIQVJBQ1RFUl9JRCwgQ0hBUkFDVEVSLCAwICkgKTsKKworCVR5cGVNYW5hZ2VyOjpyZWdpc3RlclByaW1pdGl2ZVR5cGUoCisJCQlBUlJBWV9JTlRFR0VSID0gbmV3QXJyYXkoCisJCQkJCVRZUEVfQVJSQVlfSU5URUdFUl9JRCwgSU5URUdFUiwgMCApICk7CisKKwlUeXBlTWFuYWdlcjo6cmVnaXN0ZXJQcmltaXRpdmVUeXBlKAorCQkJQVJSQVlfUkFUSU9OQUwgPSBuZXdBcnJheSgKKwkJCQkJVFlQRV9BUlJBWV9SQVRJT05BTF9JRCwgUkFUSU9OQUwsIDAgKSApOworCisJVHlwZU1hbmFnZXI6OnJlZ2lzdGVyUHJpbWl0aXZlVHlwZSgKKwkJCUFSUkFZX0ZMT0FUID0gbmV3QXJyYXkoCisJCQkJCVRZUEVfQVJSQVlfRkxPQVRfSUQsIEZMT0FULCAwICkgKTsKKworCVR5cGVNYW5hZ2VyOjpyZWdpc3RlclByaW1pdGl2ZVR5cGUoCisJCQlBUlJBWV9TVFJJTkcgPSBuZXdBcnJheSgKKwkJCQkJVFlQRV9BUlJBWV9TVFJJTkdfSUQsIFNUUklORywgMCApICk7CisKKwlUeXBlTWFuYWdlcjo6cmVnaXN0ZXJQcmltaXRpdmVUeXBlKAorCQkJQVJSQVlfSURFTlRJRklFUiA9IG5ld0FycmF5KAorCQkJCQlUWVBFX0FSUkFZX0lERU5USUZJRVJfSUQsIFNUUklORywgMCApICk7CisKKwlUeXBlTWFuYWdlcjo6cmVnaXN0ZXJQcmltaXRpdmVUeXBlKAorCQkJQVJSQVlfUVVBTElGSUVEX0lERU5USUZJRVIgPSBuZXdBcnJheSgKKwkJCQkJVFlQRV9BUlJBWV9RVUFMSUZJRURfSURFTlRJRklFUl9JRCwKKwkJCQkJUVVBTElGSUVEX0lERU5USUZJRVIsIDAgKSApOworCisJVHlwZU1hbmFnZXI6OnJlZ2lzdGVyUHJpbWl0aXZlVHlwZSgKKwkJCUFSUkFZX0VOVU0gPSBuZXdBcnJheSgKKwkJCQkJVFlQRV9BUlJBWV9FTlVNX0lELCBRVUFMSUZJRURfSURFTlRJRklFUiwgMCApICk7CisKKwlUeXBlTWFuYWdlcjo6cmVnaXN0ZXJQcmltaXRpdmVUeXBlKAorCQkJQVJSQVlfQU5ZID0gbmV3QXJyYXkoCisJCQkJCVRZUEVfQVJSQVlfQU5ZX0lELCBVTklWRVJTQUwsIDAgKSApOworCisKKwlUeXBlTWFuYWdlcjo6cmVnaXN0ZXJQcmltaXRpdmVUeXBlKAorCQkJQVJSQVkgPSBuZXdUeXBlU3BlY2lmaWVyKAorCQkJCQlUWVBFX0FSUkFZX0lELCBUWVBFX0FSUkFZX1NQRUNJRklFUiwgMSwgMSwgMCApICk7CisKKwlUeXBlTWFuYWdlcjo6cmVnaXN0ZXJQcmltaXRpdmVUeXBlKAorCQkJVkVDVE9SID0gbmV3VHlwZVNwZWNpZmllcigKKwkJCQkJVFlQRV9WRUNUT1JfSUQsIFRZUEVfVkVDVE9SX1NQRUNJRklFUiwgMSwgMSwgMCApICk7CisKKwlUeXBlTWFuYWdlcjo6cmVnaXN0ZXJQcmltaXRpdmVUeXBlKAorCQkJTElTVCA9IG5ld1R5cGVTcGVjaWZpZXIoCisJCQkJCVRZUEVfTElTVF9JRCwgVFlQRV9MSVNUX1NQRUNJRklFUiwgMSwgMSwgMCApICk7CisKKwlUeXBlTWFuYWdlcjo6cmVnaXN0ZXJQcmltaXRpdmVUeXBlKAorCQkJU0VUID0gbmV3VHlwZVNwZWNpZmllcigKKwkJCQkJVFlQRV9TRVRfSUQsIFRZUEVfU0VUX1NQRUNJRklFUiwgMSwgMSwgMCApICk7CisKKwlzdGF0aWMgVHlwZVNwZWNpZmllciBNVUxUSVNFVDsKKwlUeXBlTWFuYWdlcjo6cmVnaXN0ZXJQcmltaXRpdmVUeXBlKAorCQkJTVVMVElTRVQgPSBuZXdUeXBlU3BlY2lmaWVyKAorCQkJCQlUWVBFX01VTFRJU0VUX0lELCBUWVBFX01VTFRJU0VUX1NQRUNJRklFUiwgMSwgMSwgMCApICk7CisKKwlUeXBlTWFuYWdlcjo6cmVnaXN0ZXJQcmltaXRpdmVUeXBlKAorCQkJQkFHID0gbmV3VHlwZVNwZWNpZmllcigKKwkJCQkJVFlQRV9CQUdfSUQsIFRZUEVfTVVMVElTRVRfU1BFQ0lGSUVSLCAxLCAxLCAwICkgKTsKKworCisJVHlwZU1hbmFnZXI6OnJlZ2lzdGVyUHJpbWl0aXZlVHlwZSgKKwkJCUVOVU0gPSBuZXdUeXBlU3BlY2lmaWVyKAorCQkJCQlUWVBFX0VOVU1fSUQsIFRZUEVfRU5VTV9TUEVDSUZJRVIsIDEsIDEsIDAgKSApOworCisJVHlwZU1hbmFnZXI6OnJlZ2lzdGVyUHJpbWl0aXZlVHlwZSgKKwkJCUNMQVNTID0gbmV3VHlwZVNwZWNpZmllcigKKwkJCQkJVFlQRV9DTEFTU19JRCwgVFlQRV9DTEFTU19TUEVDSUZJRVIsIDEsIDEsIDAgKSApOworCisJVHlwZU1hbmFnZXI6OnJlZ2lzdGVyUHJpbWl0aXZlVHlwZSgKKwkJCVNUUlVDVFVSRSA9IG5ld1R5cGVTcGVjaWZpZXIoCisJCQkJCVRZUEVfU1RSVUNUVVJFX0lELCBUWVBFX0NMQVNTX1NQRUNJRklFUiwgMSwgMSwgMCApICk7CisKKwlUeXBlTWFuYWdlcjo6cmVnaXN0ZXJQcmltaXRpdmVUeXBlKAorCQkJVU5JT04gPSBuZXdUeXBlU3BlY2lmaWVyKAorCQkJCQlUWVBFX1VOSU9OX0lELCBUWVBFX1VOSU9OX1NQRUNJRklFUiwgMSwgMSwgMCApICk7CisKKwlUeXBlTWFuYWdlcjo6cmVnaXN0ZXJQcmltaXRpdmVUeXBlKAorCQkJQ0hPSUNFID0gbmV3VHlwZVNwZWNpZmllcigKKwkJCQkJVFlQRV9DSE9JQ0VfSUQsIFRZUEVfQ0hPSUNFX1NQRUNJRklFUiwgMSwgMSwgMCApICk7CisKKwlUeXBlTWFuYWdlcjo6cmVnaXN0ZXJQcmltaXRpdmVUeXBlKAorCQkJSU5URVJWQUwgPSBuZXdUeXBlU3BlY2lmaWVyKAorCQkJCQlUWVBFX0lOVEVSVkFMX0lELCBUWVBFX0lOVEVSVkFMX1NQRUNJRklFUiwgMSwgMSwgMCApICk7CisKKworCVR5cGVNYW5hZ2VyOjpyZWdpc3RlclByaW1pdGl2ZVR5cGUoCisJCQlVTklWRVJTQUwgPSBuZXdUeXBlU3BlY2lmaWVyKAorCQkJCQlUWVBFX1VOSVZFUlNBTF9JRCwgVFlQRV9VTklWRVJTQUxfU1BFQ0lGSUVSLCAxLCAxLCAwICkgKTsKK30KKworCitUeXBlU3BlY2lmaWVyIFR5cGVNYW5hZ2VyOjpnZXRUeXBlSW50ZWdlcihpbnQgZGltKQoreworCXN3aXRjaCggZGltICkKKwl7CisJCWNhc2UgICA4OiAgcmV0dXJuKCBJTlQ4ICAgKTsKKwkJY2FzZSAgMTY6ICByZXR1cm4oIElOVDE2ICApOworCQljYXNlICAzMjogIHJldHVybiggSU5UMzIgICk7CisJCWNhc2UgIDY0OiAgcmV0dXJuKCBJTlQ2NCAgKTsKKwkJY2FzZSAxMjg6ICByZXR1cm4oIElOVDEyOCApOworCisJCWRlZmF1bHQ6CisJCXsKKwkJCWlmKCBkaW0gPiAwICkKKwkJCXsKKwkJCQlUeXBlU3BlY2lmaWVyIGJmVFMoIG5ld051bWVyaWNUeXBlU3BlY2lmaWVyKAorCQkJCQkJVFlQRV9JTlRFR0VSX0lELCBUWVBFX0lOVEVHRVJfU1BFQ0lGSUVSLAorCQkJCQkJMSwgZGltLCBFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfWkVSTykgKTsKKworCQkJCXJldHVybiggYmZUUyApOworCQkJfQorCQkJcmV0dXJuKCBJTlRFR0VSICk7CisJCX0KKwl9Cit9CisKK1R5cGVTcGVjaWZpZXIgVHlwZU1hbmFnZXI6OmdldFR5cGVVSW50ZWdlcihpbnQgZGltKQoreworCXN3aXRjaCggZGltICkKKwl7CisJCWNhc2UgICA4OiAgcmV0dXJuKCBVSU5UOCAgICk7CisJCWNhc2UgIDE2OiAgcmV0dXJuKCBVSU5UMTYgICk7CisJCWNhc2UgIDMyOiAgcmV0dXJuKCBVSU5UMzIgICk7CisJCWNhc2UgIDY0OiAgcmV0dXJuKCBVSU5UNjQgICk7CisJCWNhc2UgMTI4OiAgcmV0dXJuKCBVSU5UMTI4ICk7CisKKwkJZGVmYXVsdDoKKwkJeworCQkJaWYoIGRpbSA+IDAgKQorCQkJeworCQkJCVR5cGVTcGVjaWZpZXIgYmZUUyggbmV3TnVtZXJpY1R5cGVTcGVjaWZpZXIoCisJCQkJCQlUWVBFX1VJTlRFR0VSX0lELCBUWVBFX1VJTlRFR0VSX1NQRUNJRklFUiwKKwkJCQkJCTEsIGRpbSwgRXhwcmVzc2lvbkNvbnN0YW50OjpJTlRFR0VSX1pFUk8pICk7CisKKwkJCQlyZXR1cm4oIGJmVFMgKTsKKwkJCX0KKwkJCXJldHVybiggVUlOVEVHRVIgKTsKKwkJfQorCX0KK30KKworCitUeXBlU3BlY2lmaWVyIFR5cGVNYW5hZ2VyOjpnZXRUeXBlUG9zSW50ZWdlcihpbnQgZGltKQoreworCXN3aXRjaCggZGltICkKKwl7CisJCWNhc2UgICA4OiAgcmV0dXJuKCBQT1NfSU5URUdFUiApOworCQljYXNlICAxNjogIHJldHVybiggUE9TX0lOVEVHRVIgKTsKKwkJY2FzZSAgMzI6ICByZXR1cm4oIFBPU19JTlRFR0VSICk7CisJCWNhc2UgIDY0OiAgcmV0dXJuKCBQT1NfSU5URUdFUiApOworCQljYXNlIDEyODogIHJldHVybiggUE9TX0lOVEVHRVIgKTsKKworCQlkZWZhdWx0OgorCQl7CisJCQlpZiggZGltID4gMCApCisJCQl7CisJCQkJVHlwZVNwZWNpZmllciBiZlRTKCBuZXdOdW1lcmljVHlwZVNwZWNpZmllcigKKwkJCQkJCVRZUEVfUE9TX0lOVEVHRVJfSUQsIFRZUEVfUE9TX0lOVEVHRVJfU1BFQ0lGSUVSLAorCQkJCQkJMSwgZGltLCBFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfT05FKSApOworCisJCQkJcmV0dXJuKCBiZlRTICk7CisJCQl9CisJCQlyZXR1cm4oIFBPU19JTlRFR0VSICk7CisJCX0KKwl9Cit9CisKKworLyoqCisgKiBESVNQT1NFUgorICovCit2b2lkIFR5cGVNYW5hZ2VyOjpkaXNwb3NlKCkKK3sKKwkvKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBQUklNSVRFIFRZUEUgU1BFQ0lGSUVSCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCU1hcE9mVHlwZVNwZWNpZmllcjo6aXRlcmF0b3IgaXRUeXBlID0gZ2V0UHJpbWl0aXZlVHlwZVJlcG9zaXRvcnkoKS5iZWdpbigpOworCU1hcE9mVHlwZVNwZWNpZmllcjo6aXRlcmF0b3IgZW5kVHlwZSA9IGdldFByaW1pdGl2ZVR5cGVSZXBvc2l0b3J5KCkuZW5kKCk7CisJZm9yKCA7IGl0VHlwZSAhPSBlbmRUeXBlIDsgKytpdFR5cGUgKQorCXsKKwkJaXRUeXBlLT5zZWNvbmQuZGVzdHJveSgpOworCX0KKworCWdldFByaW1pdGl2ZVR5cGVSZXBvc2l0b3J5KCkuY2xlYXIoKTsKKworCisJQk9PTEVBTi5kZXN0cm95KCk7CisKKwlJTlQ4LmRlc3Ryb3koKTsKKwlVSU5UOC5kZXN0cm95KCk7CisKKwlJTlQxNi5kZXN0cm95KCk7CisJVUlOVDE2LmRlc3Ryb3koKTsKKworCUlOVDMyLmRlc3Ryb3koKTsKKwlVSU5UMzIuZGVzdHJveSgpOworCisJSU5UNjQuZGVzdHJveSgpOworCVVJTlQ2NC5kZXN0cm95KCk7CisKKwlJTlQxMjguZGVzdHJveSgpOworCVVJTlQxMjguZGVzdHJveSgpOworCisJSU5URUdFUi5kZXN0cm95KCk7CisJVUlOVEVHRVIuZGVzdHJveSgpOworCVBPU19JTlRFR0VSLmRlc3Ryb3koKTsKKworCVJBVElPTkFMLmRlc3Ryb3koKTsKKwlVUkFUSU9OQUwuZGVzdHJveSgpOworCisKKwlGTE9BVC5kZXN0cm95KCk7CisJVUZMT0FULmRlc3Ryb3koKTsKKworCURPVUJMRS5kZXN0cm95KCk7CisJVURPVUJMRS5kZXN0cm95KCk7CisKKwlSRUFMLmRlc3Ryb3koKTsKKwlVUkVBTC5kZXN0cm95KCk7CisKKwlUSU1FLmRlc3Ryb3koKTsKKwlDT05USU5VT1VTX1RJTUUuZGVzdHJveSgpOworCURJU0NSRVRFX1RJTUUuZGVzdHJveSgpOworCisJQ0hBUkFDVEVSLmRlc3Ryb3koKTsKKwlTVFJJTkcuZGVzdHJveSgpOworCisJSURFTlRJRklFUi5kZXN0cm95KCk7CisJUVVBTElGSUVEX0lERU5USUZJRVIuZGVzdHJveSgpOworCisJTEFNQkRBLmRlc3Ryb3koKTsKKworCU9QRVJBVE9SLmRlc3Ryb3koKTsKKwlBVk1DT0RFLmRlc3Ryb3koKTsKKworCUNIQU5ORUwuZGVzdHJveSgpOworCVBPUlQuZGVzdHJveSgpOworCU1FU1NBR0UuZGVzdHJveSgpOworCVNJR05BTC5kZXN0cm95KCk7CisJQlVGRkVSLmRlc3Ryb3koKTsKKwlDT05ORUNUT1IuZGVzdHJveSgpOworCU1BQ0hJTkUuZGVzdHJveSgpOworCisJQVJSQVlfQk9PTEVBTi5kZXN0cm95KCk7CisJQVJSQVlfQ0hBUkFDVEVSLmRlc3Ryb3koKTsKKwlBUlJBWV9JTlRFR0VSLmRlc3Ryb3koKTsKKwlBUlJBWV9SQVRJT05BTC5kZXN0cm95KCk7CisJQVJSQVlfRkxPQVQuZGVzdHJveSgpOworCisJQVJSQVlfU1RSSU5HLmRlc3Ryb3koKTsKKwlBUlJBWV9JREVOVElGSUVSLmRlc3Ryb3koKTsKKwlBUlJBWV9RVUFMSUZJRURfSURFTlRJRklFUi5kZXN0cm95KCk7CisJQVJSQVlfRU5VTS5kZXN0cm95KCk7CisKKwlBUlJBWV9BTlkuZGVzdHJveSgpOworCisJVU5JVkVSU0FMLmRlc3Ryb3koKTsKK30KKworCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90eXBlL1R5cGVNYW5hZ2VyLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvdHlwZS9UeXBlTWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZWE2NTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvdHlwZS9UeXBlTWFuYWdlci5oCkBAIC0wLDAgKzEsNDgzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjYgYW/Du3QgMjAwOAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFRZUEVNQU5BR0VSX0hfCisjZGVmaW5lIFRZUEVNQU5BR0VSX0hfCisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29uc3RhbnQuaD4KKworI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9EYXRhVHlwZS5oPgorCisjaW5jbHVkZSA8Zm1sL3R5cGUvVHlwZVNwZWNpZmllci5oPgorCisjaW5jbHVkZSA8Zm1sL3R5cGUvQmFzZVR5cGVTcGVjaWZpZXIuaD4KKyNpbmNsdWRlIDxmbWwvdHlwZS9DaG9pY2VUeXBlU3BlY2lmaWVyLmg+CisjaW5jbHVkZSA8Zm1sL3R5cGUvQ2xhc3NUeXBlU3BlY2lmaWVyLmg+CisjaW5jbHVkZSA8Zm1sL3R5cGUvQ29udGFpbmVyVHlwZVNwZWNpZmllci5oPgorI2luY2x1ZGUgPGZtbC90eXBlL0VudW1UeXBlU3BlY2lmaWVyLmg+CisjaW5jbHVkZSA8Zm1sL3R5cGUvSW50ZXJ2YWxUeXBlU3BlY2lmaWVyLmg+CisjaW5jbHVkZSA8Zm1sL3R5cGUvVHlwZUFsaWFzU3BlY2lmaWVyLmg+CisjaW5jbHVkZSA8Zm1sL3R5cGUvVW5pb25UeXBlU3BlY2lmaWVyLmg+CisKKyNpbmNsdWRlIDxtYXA+CisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBUeXBlTWFuYWdlcjsKKworCisvKioKKyAqIFR5cGVNYW5hZ2VyCisgKiBzaW5nbGV0b24KKyAqLworZXh0ZXJuIGNvbnN0IFR5cGVNYW5hZ2VyICYgVHlwZUZhY3Rvcnk7CisKKworCitjbGFzcyBUeXBlTWFuYWdlcgoreworCitwdWJsaWM6CisJLyoqCisJICogU0lOR0xFVE9OCisJICovCisJc3RhdGljIFR5cGVNYW5hZ2VyICogc2luZ2xldG9uKCkKKwl7CisJCXN0YXRpYyBUeXBlTWFuYWdlciAqIGluc3RhbmNlID0gbmV3IFR5cGVNYW5hZ2VyKCk7CisKKwkJcmV0dXJuKCBpbnN0YW5jZSApOworCX0KKworcHJpdmF0ZToKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlUeXBlTWFuYWdlcigpCisJeworCQkvLyEhIE5PUFRISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBDb3B5CisJICovCisJVHlwZU1hbmFnZXIoY29uc3QgVHlwZU1hbmFnZXIgJik7CisKKwl2b2lkIG9wZXJhdG9yPShjb25zdCBUeXBlTWFuYWdlciAmKTsKKworCitwdWJsaWM6CisJLyoqCisJICogTE9BREVSIC0gRElTUE9TRVIKKwkgKi8KKwlzdGF0aWMgdm9pZCBsb2FkKCk7CisJc3RhdGljIHZvaWQgZGlzcG9zZSgpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gUkVHSVNUUlkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwl0eXBlZGVmIHN0ZDo6bWFwPCBzdGQ6OnN0cmluZyAsIFR5cGVTcGVjaWZpZXIgPiBNYXBPZlR5cGVTcGVjaWZpZXI7CisKKwlpbmxpbmUgc3RhdGljIE1hcE9mVHlwZVNwZWNpZmllciAmIGdldFByaW1pdGl2ZVR5cGVSZXBvc2l0b3J5KCkKKwl7CisJCXN0YXRpYyBNYXBPZlR5cGVTcGVjaWZpZXIgbVByaW1pdGl2ZVR5cGVTcGVjaWZpZXJSZXBvc2l0b3J5OworCisJCXJldHVybiggbVByaW1pdGl2ZVR5cGVTcGVjaWZpZXJSZXBvc2l0b3J5ICk7CisJfQorCisKKwlpbmxpbmUgc3RhdGljIHZvaWQgcmVnaXN0ZXJQcmltaXRpdmVUeXBlKGNvbnN0IFR5cGVTcGVjaWZpZXIgJiBhVFMpCisJeworCQlnZXRQcmltaXRpdmVUeXBlUmVwb3NpdG9yeSgpWyBhVFMuZ2V0TmFtZUlEKCkgXSA9IGFUUzsKKwl9CisKKwlpbmxpbmUgc3RhdGljIHZvaWQgcmVnaXN0ZXJQcmltaXRpdmVUeXBlKAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBrZXlUeXBlSUQsIGNvbnN0IFR5cGVTcGVjaWZpZXIgJiBhVFMpCisJeworCQlnZXRQcmltaXRpdmVUeXBlUmVwb3NpdG9yeSgpWyBrZXlUeXBlSUQgXSA9IGFUUzsKKwl9CisKKworCWlubGluZSBzdGF0aWMgY29uc3QgVHlwZVNwZWNpZmllciAmIGdldFByaW1pdGl2ZVR5cGUoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGtleVR5cGVJRCkKKwl7CisJCXJldHVybiggZ2V0UHJpbWl0aXZlVHlwZVJlcG9zaXRvcnkoKVsga2V5VHlwZUlEIF0gKTsKKwl9CisKKworCisJLyoqCisJICogR0VUVEVSCisJICovCisJc3RhdGljIFR5cGVTcGVjaWZpZXIgZ2V0VHlwZUludGVnZXIoaW50IGRpbSk7CisJc3RhdGljIFR5cGVTcGVjaWZpZXIgZ2V0VHlwZVVJbnRlZ2VyKGludCBkaW0pOworCXN0YXRpYyBUeXBlU3BlY2lmaWVyIGdldFR5cGVQb3NJbnRlZ2VyKGludCBkaW0pOworCisKKwkvKioKKwkgKiBDUkVBVE9SCisJICovCisJaW5saW5lIHN0YXRpYyBDb250YWluZXJUeXBlU3BlY2lmaWVyICogbmV3QXJyYXkoY29uc3Qgc3RkOjpzdHJpbmcgJiBhVHlwZUlELAorCQkJY29uc3QgVHlwZVNwZWNpZmllciAmIGFUeXBlU3BlY2lmaWVyLCBhdm1fc2l6ZV90IGFTaXplKQorCXsKKwkJcmV0dXJuKCBuZXcgQ29udGFpbmVyVHlwZVNwZWNpZmllcihUWVBFX0FSUkFZX1NQRUNJRklFUiwKKwkJCQlhVHlwZUlELCBhVHlwZVNwZWNpZmllciwgYVNpemUpICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBDb250YWluZXJUeXBlU3BlY2lmaWVyICogbmV3QXJyYXkoY29uc3QgQkYgJiBhQ29tcGlsZWRUeXBlLAorCQkJY29uc3QgVHlwZVNwZWNpZmllciAmIGFUeXBlU3BlY2lmaWVyLCBhdm1fc2l6ZV90IGFTaXplKQorCXsKKwkJcmV0dXJuKCBuZXcgQ29udGFpbmVyVHlwZVNwZWNpZmllcihUWVBFX0FSUkFZX1NQRUNJRklFUiwKKwkJCQlhQ29tcGlsZWRUeXBlLnRvX3B0cjwgRGF0YVR5cGUgPigpLCBhVHlwZVNwZWNpZmllciwgYVNpemUpICk7CisJfQorCisKKwlpbmxpbmUgc3RhdGljIENsYXNzVHlwZVNwZWNpZmllciAqIG5ld0NsYXNzKERhdGFUeXBlICogYUNvbXBpbGVkVHlwZSkKKwl7CisJCXJldHVybiggbmV3IENsYXNzVHlwZVNwZWNpZmllcihhQ29tcGlsZWRUeXBlKSApOworCX0KKworCWlubGluZSBzdGF0aWMgQ2hvaWNlVHlwZVNwZWNpZmllciAqIG5ld0Nob2ljZShEYXRhVHlwZSAqIGFDb21waWxlZFR5cGUpCisJeworCQlyZXR1cm4oIG5ldyBDaG9pY2VUeXBlU3BlY2lmaWVyKGFDb21waWxlZFR5cGUpICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBVbmlvblR5cGVTcGVjaWZpZXIgKiBuZXdVbmlvbihEYXRhVHlwZSAqIGFDb21waWxlZFR5cGUpCisJeworCQlyZXR1cm4oIG5ldyBVbmlvblR5cGVTcGVjaWZpZXIoYUNvbXBpbGVkVHlwZSkgKTsKKwl9CisKKworCWlubGluZSBzdGF0aWMgQ29udGFpbmVyVHlwZVNwZWNpZmllciAqIG5ld0NvbGxlY3Rpb24oCisJCQlEYXRhVHlwZSAqIGFDb21waWxlZFR5cGUsCisJCQlhdm1fdHlwZV9zcGVjaWZpZXJfa2luZF90IGFUeXBlU3BlY2lmaWVyS2luZCwKKwkJCWNvbnN0IFR5cGVTcGVjaWZpZXIgJiBhVHlwZVNwZWNpZmllciwgYXZtX3NpemVfdCBhU2l6ZSkKKwl7CisJCXJldHVybiggbmV3IENvbnRhaW5lclR5cGVTcGVjaWZpZXIoYVR5cGVTcGVjaWZpZXJLaW5kLAorCQkJCWFDb21waWxlZFR5cGUsIGFUeXBlU3BlY2lmaWVyLCBhU2l6ZSkgKTsKKwl9CisKKworCWlubGluZSBzdGF0aWMgRW51bVR5cGVTcGVjaWZpZXIgKiBuZXdFbnVtKERhdGFUeXBlICogYUNvbXBpbGVkVHlwZSkKKwl7CisJCXJldHVybiggbmV3IEVudW1UeXBlU3BlY2lmaWVyKGFDb21waWxlZFR5cGUpICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBFbnVtVHlwZVNwZWNpZmllciAqIG5ld0VudW0oY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKQorCXsKKwkJRW51bVR5cGVTcGVjaWZpZXIgKiBlbnVtVCA9IG5ldyBFbnVtVHlwZVNwZWNpZmllcihOVUxMKTsKKwkJZW51bVQtPnNldEFsbE5hbWVJRChhTmFtZUlELCBhTmFtZUlEKTsKKworCQlyZXR1cm4oIGVudW1UICk7CisJfQorCisKKwlpbmxpbmUgc3RhdGljIEJhc2VUeXBlU3BlY2lmaWVyICogbmV3TnVtZXJpY1R5cGVTcGVjaWZpZXIoCisJCQlCYXNlVHlwZVNwZWNpZmllciAqIGFUeXBlU3BlY2lmaWVyLCBhdm1fc2l6ZV90IGFCaXRTaXplLAorCQkJY29uc3QgQkYgJiBkZWZhdWx0VmFsdWUpCisJeworCQlyZXR1cm4oIG5ldyBCYXNlVHlwZVNwZWNpZmllcigKKwkJCQkJYVR5cGVTcGVjaWZpZXItPmdldFR5cGVTcGVjaWZpZXJLaW5kKCksCisJCQkJCWFUeXBlU3BlY2lmaWVyLT5nZXRBc3REYXRhVHlwZSgpLAorCQkJCQkxLCAxLCBhQml0U2l6ZSwgZGVmYXVsdFZhbHVlKSApOworCX0KKworCWlubGluZSBzdGF0aWMgQmFzZVR5cGVTcGVjaWZpZXIgKiBuZXdOdW1lcmljVHlwZVNwZWNpZmllcigKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVR5cGVJRCwKKwkJCWF2bV90eXBlX3NwZWNpZmllcl9raW5kX3QgYVR5cGVTcGVjaWZpZXJLaW5kLAorCQkJYXZtX3NpemVfdCBhRGF0YVNpemUsIGF2bV9zaXplX3QgYUJpdFNpemUsIGNvbnN0IEJGICYgZGVmYXVsdFZhbHVlKQorCXsKKwkJcmV0dXJuKCBuZXcgQmFzZVR5cGVTcGVjaWZpZXIoYVR5cGVTcGVjaWZpZXJLaW5kLCBhVHlwZUlELAorCQkJCTEsIGFEYXRhU2l6ZSwgYUJpdFNpemUsIGRlZmF1bHRWYWx1ZSkgKTsKKwl9CisKKworCWlubGluZSBzdGF0aWMgSW50ZXJ2YWxUeXBlU3BlY2lmaWVyICogbmV3SW50ZXJ2YWwoCisJCQlEYXRhVHlwZSAqIGFDb21waWxlZFR5cGUsCisJCQljb25zdCBUeXBlU3BlY2lmaWVyICYgYVR5cGVTcGVjaWZpZXIsCisJCQlJSW50ZXJ2YWxLaW5kOjpLSU5EIGFOYXR1cmUsIGNvbnN0IEJGICYgYU1pbiwgY29uc3QgQkYgJiBhTWF4KQorCXsKKwkJcmV0dXJuKCBuZXcgSW50ZXJ2YWxUeXBlU3BlY2lmaWVyKGFDb21waWxlZFR5cGUsCisJCQkJYVR5cGVTcGVjaWZpZXIsIGFOYXR1cmUsIGFNaW4sIGFNYXgpICk7CisJfQorCisKKwlpbmxpbmUgc3RhdGljIENvbnRhaW5lclR5cGVTcGVjaWZpZXIgKiBuZXdDbG9ja1RpbWUoCisJCQlhdm1fdHlwZV9zcGVjaWZpZXJfa2luZF90IGFUeXBlU3BlY2lmaWVyS2luZCwKKwkJCWNvbnN0IFR5cGVTcGVjaWZpZXIgJiBhVGltZURvbWFpbiwgYXZtX3NpemVfdCBhU2l6ZSA9IDEpCisJeworCQlyZXR1cm4oIG5ldyBDb250YWluZXJUeXBlU3BlY2lmaWVyKGFUeXBlU3BlY2lmaWVyS2luZCwKKwkJCQlOVUxMLCBhVGltZURvbWFpbiwgYVNpemUpICk7CisJfQorCisKKwlpbmxpbmUgc3RhdGljIEJhc2VUeXBlU3BlY2lmaWVyICogbmV3Q2hhcmFjdGVyKAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhVHlwZUlELCBhdm1fc2l6ZV90IGFTaXplKQorCXsKKwkJcmV0dXJuKCBuZXdUeXBlU3BlY2lmaWVyKGFUeXBlSUQsCisJCQkJVFlQRV9DSEFSQUNURVJfU1BFQ0lGSUVSLCBhU2l6ZSwgMSwgMCwKKwkJCQlFeHByZXNzaW9uQ29uc3RhbnQ6OkNIQVJBQ1RFUl9OVUxMKSApOworCX0KKworCWlubGluZSBzdGF0aWMgQmFzZVR5cGVTcGVjaWZpZXIgKiBuZXdTdHJpbmcoCisJCQlhdm1fc2l6ZV90IG1pblNpemUsIGF2bV9zaXplX3QgbWF4U2l6ZSkKKwl7CisJCXJldHVybiggbmV3VHlwZVNwZWNpZmllcihUWVBFX1NUUklOR19JRCwgVFlQRV9TVFJJTkdfU1BFQ0lGSUVSLAorCQkJCW1pblNpemUsIG1heFNpemUsIDEsIDAsIEV4cHJlc3Npb25Db25zdGFudDo6U1RSSU5HX0VNUFRZKSApOworCX0KKworCisJaW5saW5lIHN0YXRpYyBUeXBlQWxpYXNTcGVjaWZpZXIgKiBuZXdUeXBlQWxpYXMoCisJCQlEYXRhVHlwZSAqIGFDb21waWxlZFR5cGUsIGNvbnN0IFR5cGVTcGVjaWZpZXIgJiBhVHlwZVNwZWNpZmllcikKKwl7CisJCXJldHVybiggbmV3IFR5cGVBbGlhc1NwZWNpZmllcihhQ29tcGlsZWRUeXBlLCBhVHlwZVNwZWNpZmllcikgKTsKKwl9CisKKworCWlubGluZSBzdGF0aWMgQmFzZVR5cGVTcGVjaWZpZXIgKiBuZXdUeXBlU3BlY2lmaWVyKAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhVHlwZUlELAorCQkJYXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCBhVHlwZVNwZWNpZmllcktpbmQsCisJCQlhdm1fc2l6ZV90IGFTaXplLCBhdm1fc2l6ZV90IGFEYXRhU2l6ZSwKKwkJCWF2bV9zaXplX3QgYUJpdFNpemUsIGNvbnN0IEJGICYgZGVmYXVsdFZhbHVlID0gQkY6OlJFRl9OVUxMKQorCXsKKwkJcmV0dXJuKCBuZXcgQmFzZVR5cGVTcGVjaWZpZXIoYVR5cGVTcGVjaWZpZXJLaW5kLCBhVHlwZUlELAorCQkJCWFTaXplLCBhRGF0YVNpemUsIGFCaXRTaXplLCBkZWZhdWx0VmFsdWUpICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBCYXNlVHlwZVNwZWNpZmllciAqIG5ld1R5cGVTcGVjaWZpZXIoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFUeXBlSUQsCisJCQlhdm1fdHlwZV9zcGVjaWZpZXJfa2luZF90IGFUeXBlU3BlY2lmaWVyS2luZCwKKwkJCWF2bV9zaXplX3QgbWluU2l6ZSwgYXZtX3NpemVfdCBtYXhTaXplLCBhdm1fc2l6ZV90IGFEYXRhU2l6ZSwKKwkJCWF2bV9zaXplX3QgYUJpdFNpemUsIGNvbnN0IEJGICYgZGVmYXVsdFZhbHVlID0gQkY6OlJFRl9OVUxMKQorCXsKKwkJcmV0dXJuKCBuZXcgQmFzZVR5cGVTcGVjaWZpZXIoYVR5cGVTcGVjaWZpZXJLaW5kLCBhVHlwZUlELAorCQkJCW1pblNpemUsIG1heFNpemUsIGFEYXRhU2l6ZSwgYUJpdFNpemUsIGRlZmF1bHRWYWx1ZSkgKTsKKwl9CisKKworCS8qCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFBSSU1JVEUgVFlQRSBOQU1FIElERU5USUZJRVIKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgVFlQRV9BUlJBWV9JRDsKKworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIFRZUEVfVkVDVE9SX0lEOworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIFRZUEVfUkVWRVJTRV9WRUNUT1JfSUQ7CisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgVFlQRV9MSVNUX0lEOworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIFRZUEVfU0VUX0lEOworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIFRZUEVfTVVMVElTRVRfSUQ7CisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgVFlQRV9CQUdfSUQ7CisKKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBUWVBFX0ZJRk9fSUQ7CisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgVFlQRV9MSUZPX0lEOworCisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgVFlQRV9FTlVNX0lEOworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIFRZUEVfVU5JT05fSUQ7CisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgVFlQRV9DSE9JQ0VfSUQ7CisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgVFlQRV9TVFJVQ1RVUkVfSUQ7CisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgVFlQRV9DTEFTU19JRDsKKworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIFRZUEVfQk9PTF9JRDsKKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBUWVBFX0JPT0xFQU5fSUQ7CisKKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBUWVBFX0lOVDhfSUQ7CisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgVFlQRV9JTlQxNl9JRDsKKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBUWVBFX0lOVDMyX0lEOworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIFRZUEVfSU5UNjRfSUQ7CisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgVFlQRV9JTlQxMjhfSUQ7CisKKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBUWVBFX0lOVF9JRDsKKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBUWVBFX0lOVEVHRVJfSUQ7CisKKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBUWVBFX1JBVF9JRDsKKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBUWVBFX1JBVElPTkFMX0lEOworCisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgVFlQRV9GTE9BVF9JRDsKKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBUWVBFX0RPVUJMRV9JRDsKKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBUWVBFX1JFQUxfSUQ7CisKKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBUWVBFX1VJTlQ4X0lEOworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIFRZUEVfVUlOVDE2X0lEOworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIFRZUEVfVUlOVDMyX0lEOworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIFRZUEVfVUlOVDY0X0lEOworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIFRZUEVfVUlOVDEyOF9JRDsKKworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIFRZUEVfVUlOVF9JRDsKKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBUWVBFX1VJTlRFR0VSX0lEOworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIFRZUEVfUE9TX0lOVEVHRVJfSUQ7CisKKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBUWVBFX1VSQVRfSUQ7CisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgVFlQRV9VUkFUSU9OQUxfSUQ7CisKKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBUWVBFX1VGTE9BVF9JRDsKKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBUWVBFX1VET1VCTEVfSUQ7CisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgVFlQRV9VUkVBTF9JRDsKKworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIFRZUEVfQ09OVElOVU9VU19USU1FX0lEOworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIFRZUEVfRElTQ1JFVEVfVElNRV9JRDsKKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBUWVBFX1RJTUVfSUQ7CisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgVFlQRV9DTE9DS19JRDsKKworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIFRZUEVfQ0hBUl9JRDsKKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBUWVBFX0NIQVJBQ1RFUl9JRDsKKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBUWVBFX1NUUklOR19JRDsKKworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIFRZUEVfSU5URVJWQUxfSUQ7CisKKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBUWVBFX0FSUkFZX0JPT0xFQU5fSUQ7CisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgVFlQRV9BUlJBWV9DSEFSQUNURVJfSUQ7CisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgVFlQRV9BUlJBWV9JTlRFR0VSX0lEOworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIFRZUEVfQVJSQVlfUkFUSU9OQUxfSUQ7CisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgVFlQRV9BUlJBWV9GTE9BVF9JRDsKKworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIFRZUEVfQVJSQVlfU1RSSU5HX0lEOworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIFRZUEVfQVJSQVlfSURFTlRJRklFUl9JRDsKKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBUWVBFX0FSUkFZX1FVQUxJRklFRF9JREVOVElGSUVSX0lEOworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIFRZUEVfQVJSQVlfRU5VTV9JRDsKKworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIFRZUEVfQVJSQVlfQU5ZX0lEOworCisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgVFlQRV9MQU1CREFfSUQ7CisKKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBUWVBFX09QRVJBVE9SX0lEOworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIFRZUEVfQVZNQ09ERV9JRDsKKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBUWVBFX0VYUFJFU1NJT05fSUQ7CisKKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBUWVBFX1BPUlRfSUQ7CisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgVFlQRV9NRVNTQUdFX0lEOworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIFRZUEVfU0lHTkFMX0lEOworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIFRZUEVfQlVGRkVSX0lEOworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIFRZUEVfQ09OTkVDVE9SX0lEOworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIFRZUEVfTUFDSElORV9JRDsKKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBUWVBFX1JJRF9JRDsKKworCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIFRZUEVfVU5JVkVSU0FMX0lEOworCisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgVFlQRV9TSU1VTElOS19CVVNfSUQ7CisKKworCS8qCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFBSSU1JVEUgVFlQRSBTUEVDSUZJRVIKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJc3RhdGljIFR5cGVTcGVjaWZpZXIgQk9PTDsKKwlzdGF0aWMgVHlwZVNwZWNpZmllciBCT09MRUFOOworCisJc3RhdGljIFR5cGVTcGVjaWZpZXIgSU5UODsKKwlzdGF0aWMgVHlwZVNwZWNpZmllciBVSU5UODsKKworCXN0YXRpYyBUeXBlU3BlY2lmaWVyIElOVDE2OworCXN0YXRpYyBUeXBlU3BlY2lmaWVyIFVJTlQxNjsKKworCXN0YXRpYyBUeXBlU3BlY2lmaWVyIElOVDMyOworCXN0YXRpYyBUeXBlU3BlY2lmaWVyIFVJTlQzMjsKKworCXN0YXRpYyBUeXBlU3BlY2lmaWVyIElOVDY0OworCXN0YXRpYyBUeXBlU3BlY2lmaWVyIFVJTlQ2NDsKKworCXN0YXRpYyBUeXBlU3BlY2lmaWVyIElOVDEyODsKKwlzdGF0aWMgVHlwZVNwZWNpZmllciBVSU5UMTI4OworCisJc3RhdGljIFR5cGVTcGVjaWZpZXIgSU5UOworCXN0YXRpYyBUeXBlU3BlY2lmaWVyIFVJTlQ7CisKKwlzdGF0aWMgVHlwZVNwZWNpZmllciBJTlRFR0VSOworCXN0YXRpYyBUeXBlU3BlY2lmaWVyIFVJTlRFR0VSOworCXN0YXRpYyBUeXBlU3BlY2lmaWVyIFBPU19JTlRFR0VSOworCisJc3RhdGljIFR5cGVTcGVjaWZpZXIgUkFUOworCXN0YXRpYyBUeXBlU3BlY2lmaWVyIFVSQVQ7CisKKwlzdGF0aWMgVHlwZVNwZWNpZmllciBSQVRJT05BTDsKKwlzdGF0aWMgVHlwZVNwZWNpZmllciBVUkFUSU9OQUw7CisKKwlzdGF0aWMgVHlwZVNwZWNpZmllciBGTE9BVDsKKwlzdGF0aWMgVHlwZVNwZWNpZmllciBVRkxPQVQ7CisKKwlzdGF0aWMgVHlwZVNwZWNpZmllciBET1VCTEU7CisJc3RhdGljIFR5cGVTcGVjaWZpZXIgVURPVUJMRTsKKworCXN0YXRpYyBUeXBlU3BlY2lmaWVyIFJFQUw7CisJc3RhdGljIFR5cGVTcGVjaWZpZXIgVVJFQUw7CisKKworCXN0YXRpYyBUeXBlU3BlY2lmaWVyIENMT0NLOworCXN0YXRpYyBUeXBlU3BlY2lmaWVyIFRJTUU7CisJc3RhdGljIFR5cGVTcGVjaWZpZXIgQ09OVElOVU9VU19USU1FOworCXN0YXRpYyBUeXBlU3BlY2lmaWVyIERJU0NSRVRFX1RJTUU7CisKKwlzdGF0aWMgVHlwZVNwZWNpZmllciBDSEFSOworCXN0YXRpYyBUeXBlU3BlY2lmaWVyIENIQVJBQ1RFUjsKKwlzdGF0aWMgVHlwZVNwZWNpZmllciBTVFJJTkc7CisKKwlzdGF0aWMgVHlwZVNwZWNpZmllciBJREVOVElGSUVSOworCXN0YXRpYyBUeXBlU3BlY2lmaWVyIFFVQUxJRklFRF9JREVOVElGSUVSOworCisJc3RhdGljIFR5cGVTcGVjaWZpZXIgTEFNQkRBOworCisJc3RhdGljIFR5cGVTcGVjaWZpZXIgT1BFUkFUT1I7CisJc3RhdGljIFR5cGVTcGVjaWZpZXIgQVZNQ09ERTsKKwlzdGF0aWMgVHlwZVNwZWNpZmllciBFWFBSRVNTSU9OOworCisJc3RhdGljIFR5cGVTcGVjaWZpZXIgQ0hBTk5FTDsKKwlzdGF0aWMgVHlwZVNwZWNpZmllciBQT1JUOworCXN0YXRpYyBUeXBlU3BlY2lmaWVyIE1FU1NBR0U7CisJc3RhdGljIFR5cGVTcGVjaWZpZXIgU0lHTkFMOworCXN0YXRpYyBUeXBlU3BlY2lmaWVyIEJVRkZFUjsKKwlzdGF0aWMgVHlwZVNwZWNpZmllciBDT05ORUNUT1I7CisJc3RhdGljIFR5cGVTcGVjaWZpZXIgTUFDSElORTsKKworCXN0YXRpYyBUeXBlU3BlY2lmaWVyIEFSUkFZX0JPT0xFQU47CisJc3RhdGljIFR5cGVTcGVjaWZpZXIgQVJSQVlfQ0hBUkFDVEVSOworCXN0YXRpYyBUeXBlU3BlY2lmaWVyIEFSUkFZX0lOVEVHRVI7CisJc3RhdGljIFR5cGVTcGVjaWZpZXIgQVJSQVlfUkFUSU9OQUw7CisJc3RhdGljIFR5cGVTcGVjaWZpZXIgQVJSQVlfRkxPQVQ7CisKKwlzdGF0aWMgVHlwZVNwZWNpZmllciBBUlJBWV9TVFJJTkc7CisJc3RhdGljIFR5cGVTcGVjaWZpZXIgQVJSQVlfSURFTlRJRklFUjsKKwlzdGF0aWMgVHlwZVNwZWNpZmllciBBUlJBWV9RVUFMSUZJRURfSURFTlRJRklFUjsKKwlzdGF0aWMgVHlwZVNwZWNpZmllciBBUlJBWV9FTlVNOworCisJc3RhdGljIFR5cGVTcGVjaWZpZXIgQVJSQVlfQU5ZOworCisJc3RhdGljIFR5cGVTcGVjaWZpZXIgQVJSQVk7CisJc3RhdGljIFR5cGVTcGVjaWZpZXIgVkVDVE9SOworCXN0YXRpYyBUeXBlU3BlY2lmaWVyIExJU1Q7CisJc3RhdGljIFR5cGVTcGVjaWZpZXIgU0VUOworCXN0YXRpYyBUeXBlU3BlY2lmaWVyIE1VTFRJU0VUOworCXN0YXRpYyBUeXBlU3BlY2lmaWVyIEJBRzsKKworCXN0YXRpYyBUeXBlU3BlY2lmaWVyIEVOVU07CisJc3RhdGljIFR5cGVTcGVjaWZpZXIgQ0xBU1M7CisJc3RhdGljIFR5cGVTcGVjaWZpZXIgU1RSVUNUVVJFOworCXN0YXRpYyBUeXBlU3BlY2lmaWVyIFVOSU9OOworCXN0YXRpYyBUeXBlU3BlY2lmaWVyIENIT0lDRTsKKwlzdGF0aWMgVHlwZVNwZWNpZmllciBJTlRFUlZBTDsKKworCXN0YXRpYyBUeXBlU3BlY2lmaWVyIFVOSVZFUlNBTDsKKworfTsKKworCit9CisKKyNlbmRpZiAvKiBUWVBFTUFOQUdFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3R5cGUvVHlwZVNwZWNpZmllci5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvdHlwZS9UeXBlU3BlY2lmaWVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODc0MTA0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3R5cGUvVHlwZVNwZWNpZmllci5jcHAKQEAgLTAsMCArMSwzNTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxMyBqdWluIDIwMTQKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlR5cGVTcGVjaWZpZXIuaCIKKworI2luY2x1ZGUgPGNvbW1vbi9CRi5oPgorCisjaW5jbHVkZSA8Zm1sL3N5bWJvbC9TeW1ib2wuaD4KKworI2luY2x1ZGUgPGZtbC90eXBlL0Jhc2VTeW1ib2xUeXBlU3BlY2lmaWVyLmg+CisjaW5jbHVkZSA8Zm1sL3R5cGUvVHlwZUFsaWFzU3BlY2lmaWVyLmg+CisjaW5jbHVkZSA8Zm1sL3R5cGUvQ2xhc3NUeXBlU3BlY2lmaWVyLmg+CisjaW5jbHVkZSA8Zm1sL3R5cGUvRW51bVR5cGVTcGVjaWZpZXIuaD4KKyNpbmNsdWRlIDxmbWwvdHlwZS9Db250YWluZXJUeXBlU3BlY2lmaWVyLmg+CisjaW5jbHVkZSA8Zm1sL3R5cGUvSW50ZXJ2YWxUeXBlU3BlY2lmaWVyLmg+CisjaW5jbHVkZSA8Zm1sL3R5cGUvVW5pb25UeXBlU3BlY2lmaWVyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorICogREVGQVVMVCBOVUxMCisgKi8KK1R5cGVTcGVjaWZpZXIgVHlwZVNwZWNpZmllcjo6UkVGX05VTEw7CisKKworLyoqCisgKiBBU1NJR05NRU5UCisgKiBCRgorICovCitUeXBlU3BlY2lmaWVyICYgVHlwZVNwZWNpZmllcjo6b3BlcmF0b3I9KGNvbnN0IEJGICYgYVR5cGUpCit7CisJQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKCBhVHlwZS5pc193ZWFrbHk8IEJhc2VUeXBlU3BlY2lmaWVyID4oKSApCisJCQk8PCAiSW52YWxpZCBBc3NpZ25tZW50IENhc3QgaW4gYSBUeXBlIG9mICIgPDwgYVR5cGUuc3RyKCkKKwkJCTw8IFNFTkRfRVhJVDsKKworCWlmKCBtUFRSICE9IGFUeXBlLnJhd19wb2ludGVyKCkgKQorCXsKKwkJQVZNX0FTU0lHTl9TVE1OVF9ERUJVR19UWVBFX1BUUiggYVR5cGUucmF3X3BvaW50ZXIoKSApCisKKwkJcmVsZWFzZSggc3RhdGljX2Nhc3Q8IEJhc2VUeXBlU3BlY2lmaWVyICogPiggYVR5cGUucmF3X3BvaW50ZXIoKSApICk7CisJfQorCXJldHVybiggKnRoaXMgKTsKK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVHlwZUFsaWFzU3BlY2lmaWVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworVHlwZUFsaWFzU3BlY2lmaWVyICYgVHlwZVNwZWNpZmllcjo6YWxpYXMoKQoreworCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9QT0lOVEVSX0VYSVQoIG1QVFIgKQorCQkJPDwgIlVuZXhwZWN0ZWQgYSA8bnVsbD4gcG9pbnRlciBhcyBUeXBlQWxpYXNTcGVjaWZpZXIgcmVmZXJlbmNlICEhISIKKwkJCTw8IFNFTkRfRVhJVDsKKworCXJldHVybiggc3RhdGljX2Nhc3Q8IFR5cGVBbGlhc1NwZWNpZmllciAmID4oICptUFRSICkgKTsKK30KKworY29uc3QgVHlwZUFsaWFzU3BlY2lmaWVyICYgVHlwZVNwZWNpZmllcjo6YWxpYXMoKSBjb25zdAoreworCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9QT0lOVEVSX0VYSVQoIG1QVFIgKQorCQkJPDwgIlVuZXhwZWN0ZWQgYSA8bnVsbD4gcG9pbnRlciBhcyBUeXBlQWxpYXNTcGVjaWZpZXIgcmVmZXJlbmNlICEhISIKKwkJCTw8IFNFTkRfRVhJVDsKKworCXJldHVybiggc3RhdGljX2Nhc3Q8IGNvbnN0IFR5cGVBbGlhc1NwZWNpZmllciAmID4oICptUFRSICkgKTsKK30KKworCitUeXBlQWxpYXNTcGVjaWZpZXIgKiBUeXBlU3BlY2lmaWVyOjpyYXdBbGlhcygpIGNvbnN0Cit7CisJcmV0dXJuKCBzdGF0aWNfY2FzdDwgVHlwZUFsaWFzU3BlY2lmaWVyICogPiggbVBUUiApICApOworfQorCisKK0Jhc2VUeXBlU3BlY2lmaWVyICogVHlwZVNwZWNpZmllcjo6YWxpYXNUeXBlU3BlY2lmaWVyKCkgY29uc3QKK3sKKwlyZXR1cm4oIHJhd0FsaWFzKCktPnRhcmdldFR5cGVTcGVjaWZpZXIoKSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQmFzZVN5bWJvbFR5cGVTcGVjaWZpZXIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitCYXNlU3ltYm9sVHlwZVNwZWNpZmllciAqIFR5cGVTcGVjaWZpZXI6OnJhd1N5bWJvbCgpIGNvbnN0Cit7CisJcmV0dXJuKCBzdGF0aWNfY2FzdDwgQmFzZVN5bWJvbFR5cGVTcGVjaWZpZXIgKiA+KCBtUFRSICkgICk7Cit9CisKKworLyoqCisgKiBHRVRURVIgLSBTRVRURVIKKyAqIHRoZVN5bWJvbERhdGEKKyAqLwordm9pZCBUeXBlU3BlY2lmaWVyOjpzYXZlU3ltYm9sKEluc3RhbmNlT2ZEYXRhICogYW5JbnN0YW5jZSkKK3sKKwlyYXdTeW1ib2woKS0+c2F2ZVN5bWJvbERhdGEoIGFuSW5zdGFuY2UgKTsKK30KKworCitjb25zdCBTeW1ib2wgJiBUeXBlU3BlY2lmaWVyOjpnZXRTeW1ib2woCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZ1bGx5UXVhbGlmaWVkTmFtZUlEKSBjb25zdAoreworCXJldHVybiggcmF3U3ltYm9sKCktPmdldFN5bWJvbERhdGEoIGFGdWxseVF1YWxpZmllZE5hbWVJRCApICk7Cit9CisKK2NvbnN0IFN5bWJvbCAmIFR5cGVTcGVjaWZpZXI6OmdldFN5bWJvbEJ5UXVhbGlmaWVkTmFtZUlEKAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpIGNvbnN0Cit7CisJcmV0dXJuKCByYXdTeW1ib2woKS0+Z2V0RGF0YUJ5UXVhbGlmaWVkTmFtZUlEKCBhUXVhbGlmaWVkTmFtZUlEICkgKTsKK30KKworY29uc3QgU3ltYm9sICYgVHlwZVNwZWNpZmllcjo6Z2V0U3ltYm9sQnlOYW1lSUQoCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkgY29uc3QKK3sKKwlyZXR1cm4oIHJhd1N5bWJvbCgpLT5nZXREYXRhQnlOYW1lSUQoIGFOYW1lSUQgKSApOworfQorCisKK2NvbnN0IFN5bWJvbCAmIFR5cGVTcGVjaWZpZXI6OmdldFN5bWJvbEJ5QXN0RWxlbWVudCgKKwkJY29uc3QgT2JqZWN0RWxlbWVudCAqIGFzdEVsZW1lbnQpIGNvbnN0Cit7CisJcmV0dXJuKCByYXdTeW1ib2woKS0+Z2V0RGF0YUJ5QXN0RWxlbWVudCggYXN0RWxlbWVudCApICk7Cit9CisKKworYm9vbCBUeXBlU3BlY2lmaWVyOjpoYXNTeW1ib2woKSBjb25zdAoreworCXJldHVybiggaXM8IEJhc2VTeW1ib2xUeXBlU3BlY2lmaWVyID4oKSAmJgorCQkJcmF3U3ltYm9sKCktPmhhc1N5bWJvbERhdGEoKSApOworfQorCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDbGFzc1R5cGVTcGVjaWZpZXIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitDbGFzc1R5cGVTcGVjaWZpZXIgJiBUeXBlU3BlY2lmaWVyOjpjbGFzc1QoKQoreworCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9QT0lOVEVSX0VYSVQoIG1QVFIgKQorCQkJPDwgIlVuZXhwZWN0ZWQgYSA8bnVsbD4gcG9pbnRlciBhcyBDbGFzc1R5cGVTcGVjaWZpZXIgcmVmZXJlbmNlICEhISIKKwkJCTw8IFNFTkRfRVhJVDsKKworCXJldHVybiggc3RhdGljX2Nhc3Q8IENsYXNzVHlwZVNwZWNpZmllciAmID4oICptUFRSICkgKTsKK30KKworY29uc3QgQ2xhc3NUeXBlU3BlY2lmaWVyICYgVHlwZVNwZWNpZmllcjo6Y2xhc3NUKCkgY29uc3QKK3sKKwlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBtUFRSICkKKwkJCTw8ICJVbmV4cGVjdGVkIGEgPG51bGw+IHBvaW50ZXIgYXMgQ2xhc3NUeXBlU3BlY2lmaWVyIHJlZmVyZW5jZSAhISEiCisJCQk8PCBTRU5EX0VYSVQ7CisKKwlyZXR1cm4oIHN0YXRpY19jYXN0PCBjb25zdCBDbGFzc1R5cGVTcGVjaWZpZXIgJiA+KCAqbVBUUiApICk7Cit9CisKKworQ2xhc3NUeXBlU3BlY2lmaWVyICogVHlwZVNwZWNpZmllcjo6cmF3Q2xhc3MoKSBjb25zdAoreworCXJldHVybiggc3RhdGljX2Nhc3Q8IENsYXNzVHlwZVNwZWNpZmllciAqID4oIG1QVFIgKSAgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEVudW1UeXBlU3BlY2lmaWVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworRW51bVR5cGVTcGVjaWZpZXIgJiBUeXBlU3BlY2lmaWVyOjplbnVtVCgpCit7CisJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggbVBUUiApCisJCQk8PCAiVW5leHBlY3RlZCBhIDxudWxsPiBwb2ludGVyIGFzIEVudW1UeXBlU3BlY2lmaWVyIHJlZmVyZW5jZSAhISEiCisJCQk8PCBTRU5EX0VYSVQ7CisKKwlyZXR1cm4oIHN0YXRpY19jYXN0PCBFbnVtVHlwZVNwZWNpZmllciAmID4oICptUFRSICkgKTsKK30KKworY29uc3QgRW51bVR5cGVTcGVjaWZpZXIgJiBUeXBlU3BlY2lmaWVyOjplbnVtVCgpIGNvbnN0Cit7CisJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggbVBUUiApCisJCQk8PCAiVW5leHBlY3RlZCBhIDxudWxsPiBwb2ludGVyIGFzIEVudW1UeXBlU3BlY2lmaWVyIHJlZmVyZW5jZSAhISEiCisJCQk8PCBTRU5EX0VYSVQ7CisKKwlyZXR1cm4oIHN0YXRpY19jYXN0PCBjb25zdCBFbnVtVHlwZVNwZWNpZmllciAmID4oICptUFRSICkgKTsKK30KKworCitFbnVtVHlwZVNwZWNpZmllciAqIFR5cGVTcGVjaWZpZXI6OnJhd0VudW0oKSBjb25zdAoreworCXJldHVybiggc3RhdGljX2Nhc3Q8IEVudW1UeXBlU3BlY2lmaWVyICogPiggbVBUUiApICApOworfQorCisKK2Jvb2wgVHlwZVNwZWNpZmllcjo6aGFzU3ltYm9sRGF0YVdpdGhWYWx1ZShjb25zdCBCRiAmIGFWYWx1ZSkgY29uc3QKK3sKKwlyZXR1cm4oIHJhd0VudW0oKS0+aGFzU3ltYm9sRGF0YVdpdGhWYWx1ZShhVmFsdWUpICk7Cit9CisKK2NvbnN0IFN5bWJvbCAmIFR5cGVTcGVjaWZpZXI6OmdldFN5bWJvbERhdGFCeVZhbHVlKGNvbnN0IEJGICYgYVZhbHVlKSBjb25zdAoreworCXJldHVybiggcmF3RW51bSgpLT5nZXRTeW1ib2xEYXRhQnlWYWx1ZShhVmFsdWUpICk7Cit9CisKKworYXZtX3NpemVfdCBUeXBlU3BlY2lmaWVyOjpnZXRSYW5kb21TeW1ib2xPZmZzZXQoKQoreworCXJldHVybiggcmF3RW51bSgpLT5nZXRSYW5kb21TeW1ib2xPZmZzZXQoKSApOworfQorCitjb25zdCBTeW1ib2wgJiBUeXBlU3BlY2lmaWVyOjpnZXRSYW5kb21TeW1ib2xEYXRhKCkKK3sKKwlyZXR1cm4oIHJhd0VudW0oKS0+Z2V0UmFuZG9tU3ltYm9sRGF0YSgpICk7Cit9CisKK2NvbnN0IEJGICYgVHlwZVNwZWNpZmllcjo6Z2V0UmFuZG9tU3ltYm9sVmFsdWUoKQoreworCXJldHVybiggcmF3RW51bSgpLT5nZXRSYW5kb21TeW1ib2xWYWx1ZSgpICk7Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnRhaW5lclR5cGVTcGVjaWZpZXIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitDb250YWluZXJUeXBlU3BlY2lmaWVyICYgVHlwZVNwZWNpZmllcjo6Y29udGFpbmVyKCkKK3sKKwlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBtUFRSICkKKwkJCTw8ICJVbmV4cGVjdGVkIGEgPG51bGw+IHBvaW50ZXIgYXMgQ29udGFpbmVyVHlwZVNwZWNpZmllciByZWZlcmVuY2UgISEhIgorCQkJPDwgU0VORF9FWElUOworCisJcmV0dXJuKCBzdGF0aWNfY2FzdDwgQ29udGFpbmVyVHlwZVNwZWNpZmllciAmID4oICptUFRSICkgKTsKK30KKworY29uc3QgQ29udGFpbmVyVHlwZVNwZWNpZmllciAmIFR5cGVTcGVjaWZpZXI6OmNvbnRhaW5lcigpIGNvbnN0Cit7CisJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggbVBUUiApCisJCQk8PCAiVW5leHBlY3RlZCBhIDxudWxsPiBwb2ludGVyIGFzIENvbnRhaW5lclR5cGVTcGVjaWZpZXIgcmVmZXJlbmNlICEhISIKKwkJCTw8IFNFTkRfRVhJVDsKKworCXJldHVybiggc3RhdGljX2Nhc3Q8IGNvbnN0IENvbnRhaW5lclR5cGVTcGVjaWZpZXIgJiA+KCAqbVBUUiApICk7Cit9CisKKworQ29udGFpbmVyVHlwZVNwZWNpZmllciAqIFR5cGVTcGVjaWZpZXI6OnJhd0NvbnRhaW5lcigpIGNvbnN0Cit7CisJcmV0dXJuKCBzdGF0aWNfY2FzdDwgQ29udGFpbmVyVHlwZVNwZWNpZmllciAqID4oIG1QVFIgKSAgKTsKK30KKworCisvKioKKyAqIHRoZUNvbnRlbnRzVHlwZVNwZWNpZmllcgorICovCitjb25zdCBUeXBlU3BlY2lmaWVyICYgVHlwZVNwZWNpZmllcjo6Z2V0Q29udGVudHNUeXBlU3BlY2lmaWVyKCkgY29uc3QKK3sKKwlyZXR1cm4oIHJhd0NvbnRhaW5lcigpLT5nZXRDb250ZW50c1R5cGVTcGVjaWZpZXIoKSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gSW50ZXJ2YWxUeXBlU3BlY2lmaWVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworSW50ZXJ2YWxUeXBlU3BlY2lmaWVyICYgVHlwZVNwZWNpZmllcjo6aW50ZXJ2YWwoKQoreworCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9QT0lOVEVSX0VYSVQoIG1QVFIgKQorCQkJPDwgIlVuZXhwZWN0ZWQgYSA8bnVsbD4gcG9pbnRlciBhcyBJbnRlcnZhbFR5cGVTcGVjaWZpZXIgcmVmZXJlbmNlICEhISIKKwkJCTw8IFNFTkRfRVhJVDsKKworCXJldHVybiggc3RhdGljX2Nhc3Q8IEludGVydmFsVHlwZVNwZWNpZmllciAmID4oICptUFRSICkgKTsKK30KKworY29uc3QgSW50ZXJ2YWxUeXBlU3BlY2lmaWVyICYgVHlwZVNwZWNpZmllcjo6aW50ZXJ2YWwoKSBjb25zdAoreworCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9QT0lOVEVSX0VYSVQoIG1QVFIgKQorCQkJPDwgIlVuZXhwZWN0ZWQgYSA8bnVsbD4gcG9pbnRlciBhcyBJbnRlcnZhbFR5cGVTcGVjaWZpZXIgcmVmZXJlbmNlICEhISIKKwkJCTw8IFNFTkRfRVhJVDsKKworCXJldHVybiggc3RhdGljX2Nhc3Q8IGNvbnN0IEludGVydmFsVHlwZVNwZWNpZmllciAmID4oICptUFRSICkgKTsKK30KKworCitJbnRlcnZhbFR5cGVTcGVjaWZpZXIgKiBUeXBlU3BlY2lmaWVyOjpyYXdJbnRlcnZhbCgpIGNvbnN0Cit7CisJcmV0dXJuKCBzdGF0aWNfY2FzdDwgSW50ZXJ2YWxUeXBlU3BlY2lmaWVyICogPiggbVBUUiApICApOworfQorCisvKioKKyAqIHRoZUludGVydmFsVHlwZVNwZWNpZmllcgorICovCitjb25zdCBUeXBlU3BlY2lmaWVyICYgVHlwZVNwZWNpZmllcjo6Z2V0U3VwcG9ydFR5cGVTcGVjaWZpZXIoKSBjb25zdAoreworCXJldHVybiggcmF3SW50ZXJ2YWwoKS0+Z2V0U3VwcG9ydFR5cGVTcGVjaWZpZXIoKSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVW5pb25UeXBlU3BlY2lmaWVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworVW5pb25UeXBlU3BlY2lmaWVyICYgVHlwZVNwZWNpZmllcjo6dW5pb25UKCkKK3sKKwlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBtUFRSICkKKwkJCTw8ICJVbmV4cGVjdGVkIGEgPG51bGw+IHBvaW50ZXIgYXMgVW5pb25UeXBlU3BlY2lmaWVyIHJlZmVyZW5jZSAhISEiCisJCQk8PCBTRU5EX0VYSVQ7CisKKwlyZXR1cm4oIHN0YXRpY19jYXN0PCBVbmlvblR5cGVTcGVjaWZpZXIgJiA+KCAqbVBUUiApICk7Cit9CisKK2NvbnN0IFVuaW9uVHlwZVNwZWNpZmllciAmIFR5cGVTcGVjaWZpZXI6OnVuaW9uVCgpIGNvbnN0Cit7CisJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggbVBUUiApCisJCQk8PCAgIlVuZXhwZWN0ZWQgYSA8bnVsbD4gcG9pbnRlciBhcyBVbmlvblR5cGVTcGVjaWZpZXIgcmVmZXJlbmNlICEhISIKKwkJCTw8IFNFTkRfRVhJVDsKKworCXJldHVybiggc3RhdGljX2Nhc3Q8IGNvbnN0IFVuaW9uVHlwZVNwZWNpZmllciAmID4oICptUFRSICkgKTsKK30KKworCitVbmlvblR5cGVTcGVjaWZpZXIgKiBUeXBlU3BlY2lmaWVyOjpyYXdVbmlvbigpIGNvbnN0Cit7CisJcmV0dXJuKCBzdGF0aWNfY2FzdDwgVW5pb25UeXBlU3BlY2lmaWVyICogPiggbVBUUiApICApOworfQorCisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvdHlwZS9UeXBlU3BlY2lmaWVyLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvdHlwZS9UeXBlU3BlY2lmaWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk4ZTM4MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90eXBlL1R5cGVTcGVjaWZpZXIuaApAQCAtMCwwICsxLDU2OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDEzIGp1aW4gMjAxNAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFRZUEVTUEVDSUZJRVJfSF8KKyNkZWZpbmUgVFlQRVNQRUNJRklFUl9IXworCisjaW5jbHVkZSA8Zm1sL2NvbW1vbi9CYXNlUG9pbnRlci5oPgorCisjaW5jbHVkZSA8Zm1sL2xpYi9JVHlwZVNwZWNpZmllci5oPgorCisjaW5jbHVkZSA8Zm1sL3R5cGUvQmFzZVR5cGVTcGVjaWZpZXIuaD4KKworCisKKyNkZWZpbmUgQVZNX0RFQlVHX1RZUEVfUE9JTlRFUiAgdHJ1ZQorI3VuZGVmIEFWTV9ERUJVR19UWVBFX1BPSU5URVIKKworI2lmIGRlZmluZWQoQVZNX0RFQlVHX1RZUEVfUE9JTlRFUikKKworCSNkZWZpbmUgQVZNX0RFQ0xBUkVfREVCVUdfVFlQRV9QVFIgICAgICBjb25zdCBCYXNlVHlwZVNwZWNpZmllciAqIGRlYnVnUFRSOworCisJI2RlZmluZSBBVk1fSU5JVF9ERUJVR19UWVBFX1BUUiggcHRyICkgICwgZGVidWdQVFIoIHB0ciApCisKKwkjZGVmaW5lIEFWTV9BU1NJR05fU1RNTlRfREVCVUdfVFlQRV9QVFIoIHB0ciApICBkZWJ1Z1BUUiA9IHB0cjsKKworCSNkZWZpbmUgQVZNX0FTU0lHTl9FWFBSX0RFQlVHX1RZUEVfUFRSKCBwdHIgKSAgIGRlYnVnUFRSID0gcHRyCisKKyNlbHNlCisKKwkjZGVmaW5lIEFWTV9ERUNMQVJFX0RFQlVHX1RZUEVfUFRSCisKKwkjZGVmaW5lIEFWTV9JTklUX0RFQlVHX1RZUEVfUFRSKCBwdHIgKQorCisJI2RlZmluZSBBVk1fQVNTSUdOX1NUTU5UX0RFQlVHX1RZUEVfUFRSKCBwdHIgKQorCisJI2RlZmluZSBBVk1fQVNTSUdOX0VYUFJfREVCVUdfVFlQRV9QVFIoIHB0ciApICBwdHIKKworI2VuZGlmCisKKworCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjbGFzcyBCRjsKKworY2xhc3MgVHlwZUFsaWFzU3BlY2lmaWVyOworY2xhc3MgQ2xhc3NUeXBlU3BlY2lmaWVyOworY2xhc3MgRW51bVR5cGVTcGVjaWZpZXI7CitjbGFzcyBDb250YWluZXJUeXBlU3BlY2lmaWVyOworY2xhc3MgSW50ZXJ2YWxUeXBlU3BlY2lmaWVyOworY2xhc3MgVW5pb25UeXBlU3BlY2lmaWVyOworCitjbGFzcyBJbnN0YW5jZU9mRGF0YTsKKworY2xhc3MgU3ltYm9sOworY2xhc3MgVGFibGVPZlN5bWJvbDsKKworCitjbGFzcyBUeXBlU3BlY2lmaWVyIDoKKwkJcHVibGljIEJhc2VQb2ludGVyPCBCYXNlVHlwZVNwZWNpZmllciA+LAorCQlwdWJsaWMgSVR5cGVTcGVjaWZpZXIsCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggVHlwZVNwZWNpZmllciApCit7CisKK3ByaXZhdGU6CisJLyoqCisJICogVFlQRURFRgorCSAqLworCXR5cGVkZWYgIEJhc2VQb2ludGVyPCBCYXNlVHlwZVNwZWNpZmllciA+ICBiYXNlX3RoaXNfdHlwZTsKKworcHVibGljOgorCS8qKgorCSAqIERFRkFVTFQgTlVMTAorCSAqLworCXN0YXRpYyBUeXBlU3BlY2lmaWVyIFJFRl9OVUxMOworCisKKworcHVibGljOgorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJVHlwZVNwZWNpZmllcigpCisJOiBiYXNlX3RoaXNfdHlwZSggKQorCXsKKwkJLy8hISEgTk9USElORworCX0KKworCWV4cGxpY2l0IFR5cGVTcGVjaWZpZXIoQmFzZVR5cGVTcGVjaWZpZXIgKiBhbkluc3RhbmNlKQorCTogYmFzZV90aGlzX3R5cGUoIGFuSW5zdGFuY2UgKQorCXsKKwkJLy8hISEgTk9USElORworCX0KKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCVR5cGVTcGVjaWZpZXIoY29uc3QgVHlwZVNwZWNpZmllciAmIGFUeXBlKQorCTogYmFzZV90aGlzX3R5cGUoIGFUeXBlICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCWV4cGxpY2l0IFR5cGVTcGVjaWZpZXIoY29uc3QgQkYgJiBhVHlwZSkKKwk6IGJhc2VfdGhpc190eXBlKCBhVHlwZSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+VHlwZVNwZWNpZmllcigpCisJeworCQkvLyEhISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBwb2ludGVyCisJICovCisJaW5saW5lIHBvaW50ZXIgcmF3VHlwZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIHN0YXRpY19jYXN0PCBwb2ludGVyID4oIG1QVFIgKSApOworCX0KKworCW9wZXJhdG9yIEJhc2VUeXBlU3BlY2lmaWVyICogKCkgY29uc3QKKwl7CisJCXJldHVybiggc3RhdGljX2Nhc3Q8IHBvaW50ZXIgPiggbVBUUiApICk7CisJfQorCisKK3B1YmxpYzoKKworCS8qKgorCSAqIEFTU0lHTk1FTlQKKwkgKiBCRgorCSAqLworCVR5cGVTcGVjaWZpZXIgJiBvcGVyYXRvcj0oY29uc3QgQkYgJiBhVHlwZSk7CisKKwlUeXBlU3BlY2lmaWVyICYgb3BlcmF0b3I9KHBvaW50ZXIgYVB0cikKKwl7CisJCWlmKCBtUFRSICE9IGFQdHIgKQorCQl7CisJCQlBVk1fQVNTSUdOX0RFQlVHX0JGX1BUUiggYVB0ciApCisKKwkJCXJlbGVhc2UoIGFQdHIgKTsKKwkJfQorCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIEJhc2VUeXBlU3BlY2lmaWVyCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIHRoZVR5cGVTcGVjaWZpZXIKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCBjb25zdCBCYXNlVHlwZVNwZWNpZmllciAqIHRoaXNUeXBlU3BlY2lmaWVyKCkgY29uc3QKKwl7CisJCXJldHVybiggcmF3VHlwZSgpICk7CisJfQorCisJaW5saW5lIEJhc2VUeXBlU3BlY2lmaWVyICogZ2V0VHlwZVNwZWNpZmllcigpIGNvbnN0CisJeworCQlyZXR1cm4oIHJhd1R5cGUoKSApOworCX0KKworCisJaW5saW5lIHZpcnR1YWwgYXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCBnZXRUeXBlU3BlY2lmaWVyS2luZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHJhd1R5cGUoKS0+Z2V0VHlwZVNwZWNpZmllcktpbmQoKSApOworCX0KKworCWlubGluZSB2b2lkIHNldFNwZWNpZmllcktpbmQoYXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCBhU3BlY2lmaWVyS2luZCkKKwl7CisJCXJhd1R5cGUoKS0+c2V0U3BlY2lmaWVyS2luZCggYVNwZWNpZmllcktpbmQgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIHRoZVNpemUKKwkgKi8KKwlpbmxpbmUgYXZtX3NpemVfdCBzaXplKCkgY29uc3QKKwl7CisJCXJldHVybiggcmF3VHlwZSgpLT5zaXplKCkgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRTaXplKGF2bV9zaXplX3QgYVNpemUpCisJeworCQlyYXdUeXBlKCktPnNldFNpemUoIGFTaXplICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiB0aGVEYXRhU2l6ZQorCSAqLworCWlubGluZSBhdm1fc2l6ZV90IGdldERhdGFTaXplKCkgY29uc3QKKwl7CisJCXJldHVybiggcmF3VHlwZSgpLT5nZXREYXRhU2l6ZSgpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0RGF0YVNpemUoYXZtX3NpemVfdCBhRGF0YVNpemUpCisJeworCQlyYXdUeXBlKCktPnNldERhdGFTaXplKCBhRGF0YVNpemUgKTsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiB0aGVCaXRTaXplCisJICovCisJaW5saW5lIGF2bV9zaXplX3QgZ2V0Qml0U2l6ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIHJhd1R5cGUoKS0+Z2V0Qml0U2l6ZSgpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0Qml0U2l6ZShhdm1fc2l6ZV90IGFCaXRTaXplKQorCXsKKwkJcmF3VHlwZSgpLT5zZXRCaXRTaXplKCBhQml0U2l6ZSApOworCX0KKworCisJLyoqCisJICogU0VUVEVSCisJICogdGhlRGF0YVNpemUKKwkgKi8KKwlpbmxpbmUgdm9pZCB1cGRhdGVTaXplKCkKKwl7CisJCXJhd1R5cGUoKS0+dXBkYXRlU2l6ZSgpOworCX0KKworCisJLyoqCisJICogQ09OU1RSQUlOVCBnZW5lcmF0aW9uCisJICogZm9yIGEgZ2l2ZW4gcGFyYW1ldGVyCisJICovCisJYm9vbCBjb3VsZEdlbmVyYXRlQ29uc3RyYWludCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHJhd1R5cGUoKS0+Y291bGRHZW5lcmF0ZUNvbnN0cmFpbnQoKSApOworCX0KKworCUJGIGdlbkNvbnN0cmFpbnQoY29uc3QgQkYgJiBhUGFyYW0pIGNvbnN0CisJeworCQlyZXR1cm4oIHJhd1R5cGUoKS0+Z2VuQ29uc3RyYWludCggYVBhcmFtICkgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIHRoZURlZmF1bHRWYWx1ZQorCSAqLworCWlubGluZSBjb25zdCBCRiAmIGdldERlZmF1bHRWYWx1ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIHJhd1R5cGUoKS0+Z2V0RGVmYXVsdFZhbHVlKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNEZWZhdWx0VmFsdWUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCByYXdUeXBlKCktPmhhc0RlZmF1bHRWYWx1ZSgpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0RGVmYXVsdFZhbHVlKGNvbnN0IEJGICYgYURlZmF1bHRWYWx1ZSkKKwl7CisJCXJhd1R5cGUoKS0+c2V0RGVmYXVsdFZhbHVlKCBhRGVmYXVsdFZhbHVlICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiB0aGVDb25zdHJhaW50CisJICovCisJaW5saW5lIGNvbnN0IEJGICYgZ2V0Q29uc3RyYWludCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHJhd1R5cGUoKS0+Z2V0Q29uc3RyYWludCgpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzQ29uc3RyYWludCgpIGNvbnN0CisJeworCQlyZXR1cm4oIHJhd1R5cGUoKS0+aGFzQ29uc3RyYWludCgpICk7CisJfQorCisJaW5saW5lIHZvaWQgc2F2ZUNvbnN0cmFpbnQoRWxlbWVudCAqIGFDb25zdHJhaW50KQorCXsKKwkJcmF3VHlwZSgpLT5zYXZlQ29uc3RyYWludCggYUNvbnN0cmFpbnQgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRDb25zdHJhaW50KGNvbnN0IEJGICYgYUNvbnN0cmFpbnQpCisJeworCQlyYXdUeXBlKCktPnNldENvbnN0cmFpbnQoIGFDb25zdHJhaW50ICk7CisJfQorCisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gVHlwZUFsaWFzU3BlY2lmaWVyCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCVR5cGVBbGlhc1NwZWNpZmllciAmIGFsaWFzKCk7CisKKwljb25zdCBUeXBlQWxpYXNTcGVjaWZpZXIgJiBhbGlhcygpIGNvbnN0OworCisJVHlwZUFsaWFzU3BlY2lmaWVyICogcmF3QWxpYXMoKSBjb25zdDsKKworLy8Jb3BlcmF0b3IgVHlwZUFsaWFzU3BlY2lmaWVyICogKCkgY29uc3Q7CisKKwlCYXNlVHlwZVNwZWNpZmllciAqIGFsaWFzVHlwZVNwZWNpZmllcigpIGNvbnN0OworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIEJhc2VTeW1ib2xUeXBlU3BlY2lmaWVyCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCUJhc2VTeW1ib2xUeXBlU3BlY2lmaWVyICogcmF3U3ltYm9sKCkgY29uc3Q7CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiB0aGUgVGFibGVPZlN5bWJvbAorCSAqLworCXZvaWQgc2F2ZVN5bWJvbChJbnN0YW5jZU9mRGF0YSAqIGFuSW5zdGFuY2UpOworCisJY29uc3QgU3ltYm9sICYgZ2V0U3ltYm9sKAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQpIGNvbnN0OworCisJY29uc3QgU3ltYm9sICYgZ2V0U3ltYm9sQnlRdWFsaWZpZWROYW1lSUQoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpIGNvbnN0OworCisJY29uc3QgU3ltYm9sICYgZ2V0U3ltYm9sQnlOYW1lSUQoY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKSBjb25zdDsKKworCWNvbnN0IFN5bWJvbCAmIGdldFN5bWJvbEJ5QXN0RWxlbWVudCgKKwkJCWNvbnN0IE9iamVjdEVsZW1lbnQgKiBvYmpFbGVtZW50KSBjb25zdDsKKworCWJvb2wgaGFzU3ltYm9sKCkgY29uc3Q7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQ2xhc3NUeXBlU3BlY2lmaWVyCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCUNsYXNzVHlwZVNwZWNpZmllciAmIGNsYXNzVCgpOworCisJY29uc3QgQ2xhc3NUeXBlU3BlY2lmaWVyICYgY2xhc3NUKCkgY29uc3Q7CisKKwlDbGFzc1R5cGVTcGVjaWZpZXIgKiByYXdDbGFzcygpIGNvbnN0OworCisvLwlvcGVyYXRvciBDbGFzc1R5cGVTcGVjaWZpZXIgKiAoKSBjb25zdDsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBFbnVtVHlwZVNwZWNpZmllcgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlFbnVtVHlwZVNwZWNpZmllciAmIGVudW1UKCk7CisKKwljb25zdCBFbnVtVHlwZVNwZWNpZmllciAmIGVudW1UKCkgY29uc3Q7CisKKwlFbnVtVHlwZVNwZWNpZmllciAqIHJhd0VudW0oKSBjb25zdDsKKworLy8Jb3BlcmF0b3IgRW51bVR5cGVTcGVjaWZpZXIgKiAoKSBjb25zdDsKKworCisJYm9vbCBoYXNTeW1ib2xEYXRhV2l0aFZhbHVlKGNvbnN0IEJGICYgYVZhbHVlKSBjb25zdDsKKworCWNvbnN0IFN5bWJvbCAmIGdldFN5bWJvbERhdGFCeVZhbHVlKGNvbnN0IEJGICYgYVZhbHVlKSBjb25zdDsKKworCisJYXZtX3NpemVfdCBnZXRSYW5kb21TeW1ib2xPZmZzZXQoKTsKKworCWNvbnN0IFN5bWJvbCAmIGdldFJhbmRvbVN5bWJvbERhdGEoKTsKKworCWNvbnN0IEJGICYgZ2V0UmFuZG9tU3ltYm9sVmFsdWUoKTsKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQ29udGFpbmVyVHlwZVNwZWNpZmllcgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlDb250YWluZXJUeXBlU3BlY2lmaWVyICYgY29udGFpbmVyKCk7CisKKwljb25zdCBDb250YWluZXJUeXBlU3BlY2lmaWVyICYgY29udGFpbmVyKCkgY29uc3Q7CisKKwlDb250YWluZXJUeXBlU3BlY2lmaWVyICogcmF3Q29udGFpbmVyKCkgY29uc3Q7CisKKy8vCW9wZXJhdG9yIENvbnRhaW5lclR5cGVTcGVjaWZpZXIgKiAoKSBjb25zdDsKKworCS8qKgorCSAqIHRoZUNvbnRlbnRzVHlwZVNwZWNpZmllcgorCSAqLworCWNvbnN0IFR5cGVTcGVjaWZpZXIgJiBnZXRDb250ZW50c1R5cGVTcGVjaWZpZXIoKSBjb25zdDsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBJbnRlcnZhbFR5cGVTcGVjaWZpZXIKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJSW50ZXJ2YWxUeXBlU3BlY2lmaWVyICYgaW50ZXJ2YWwoKTsKKworCWNvbnN0IEludGVydmFsVHlwZVNwZWNpZmllciAmIGludGVydmFsKCkgY29uc3Q7CisKKwlJbnRlcnZhbFR5cGVTcGVjaWZpZXIgKiByYXdJbnRlcnZhbCgpIGNvbnN0OworCisvLwlvcGVyYXRvciBJbnRlcnZhbFR5cGVTcGVjaWZpZXIgKiAoKSBjb25zdDsKKworCS8qKgorCSAqIHRoZUludGVydmFsVHlwZVNwZWNpZmllcgorCSAqLworCWNvbnN0IFR5cGVTcGVjaWZpZXIgJiBnZXRTdXBwb3J0VHlwZVNwZWNpZmllcigpIGNvbnN0OworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFVuaW9uVHlwZVNwZWNpZmllcgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlVbmlvblR5cGVTcGVjaWZpZXIgJiB1bmlvblQoKTsKKworCWNvbnN0IFVuaW9uVHlwZVNwZWNpZmllciAmIHVuaW9uVCgpIGNvbnN0OworCisJVW5pb25UeXBlU3BlY2lmaWVyICogcmF3VW5pb24oKSBjb25zdDsKKworCW9wZXJhdG9yIFVuaW9uVHlwZVNwZWNpZmllciAqICgpIGNvbnN0OworCisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBTZXJpYWxpemF0aW9uCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJLyoqCisJICogRm9ybWF0IGEgdmFsdWUgdy5yLnQuIGl0cyB0eXBlCisJICovCisJaW5saW5lIHZvaWQgZm9ybWF0U3RyZWFtKE91dFN0cmVhbSAmIG9zLCBjb25zdCBCRiAmIGJmVmFsdWUpIGNvbnN0CisJeworCQlpZiggbVBUUiAhPSBOVUxMICkKKwkJeworCQkJcmF3VHlwZSgpLT5mb3JtYXRTdHJlYW0oIG9zICwgYmZWYWx1ZSApOworCQl9CisJCWVsc2UKKwkJeworCQkJb3MgPDwgVEFCIDw8ICJUeXBlOjpmb3JtYXRTdHJlYW08bnVsbD4iIDw8IEVPTF9GTFVTSDsKKwkJfQorCX0KKworCXZvaWQgZm9ybWF0U3RyZWFtKE91dFN0cmVhbSAmIG9zLCBjb25zdCBBcnJheUJGICYgYXJyYXlWYWx1ZSkgY29uc3QKKwl7CisJCWlmKCBtUFRSICE9IE5VTEwgKQorCQl7CisJCQlyYXdUeXBlKCktPmZvcm1hdFN0cmVhbSggb3MgLCBhcnJheVZhbHVlICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlvcyA8PCBUQUIgPDwgIlR5cGU6OmZvcm1hdFN0cmVhbTxudWxsPiIgPDwgRU9MX0ZMVVNIOworCQl9CisJfQorCisKKwlpbmxpbmUgc3RkOjpzdHJpbmcgc3RyVCgpIGNvbnN0CisJeworCQlyZXR1cm4oICggbVBUUiAhPSBOVUxMICkgPyByYXdUeXBlKCktPnN0clQoKSA6ICJUeXBlOjpzdHJUPG51bGw+IiApOworCX0KKworCWlubGluZSB2b2lkIHN0ckhlYWRlcihPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCWlmKCBtUFRSICE9IE5VTEwgKQorCQl7CisJCQlyYXdUeXBlKCktPnN0ckhlYWRlcihvcyk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlvcyA8PCAibnVsbDwgVHlwZVNwZWNpZmllciA+IjsKKwkJfQorCX0KKworCisJdmlydHVhbCB2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJaWYoIG1QVFIgIT0gTlVMTCApCisJCXsKKwkJCXJhd1R5cGUoKS0+dG9TdHJlYW0oIG9zICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlvcyA8PCBUQUIgPDwgIlR5cGU6OnN0cmVhbTxudWxsPiIgPDwgRU9MX0ZMVVNIOworCQl9CisJfQorCisJdmlydHVhbCB2b2lkIHRvRnNjbihPdXRTdHJlYW0gJiBvcykgY29uc3QKKwl7CisJCWlmKCBtUFRSICE9IE5VTEwgKQorCQl7CisJCQlyYXdUeXBlKCktPnRvRnNjbiggb3MgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW9zIDw8IFRBQiA8PCAiVHlwZTo6ZnNjbjxudWxsPiIgPDwgRU9MX0ZMVVNIOworCQl9CisJfQorCisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgdG9TdHJpbmcoCisJCQljb25zdCBBdm1JbmRlbnQgJiBpbmRlbnQgPSBBVk1fVEFCX0lOREVOVCkgY29uc3QKKwl7CisJCVN0cmluZ091dFN0cmVhbSBvc3MoaW5kZW50KTsKKworCQl0b1N0cmVhbSggb3NzICk7CisKKwkJcmV0dXJuKCBvc3Muc3RyKCkgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBzdGQ6OnN0cmluZyBzdHIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAoIG1QVFIgIT0gTlVMTCApID8gcmF3VHlwZSgpLT5zdHIoKSA6ICJUeXBlOjpzdHI8bnVsbD4iICk7CisJfQorCisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgc3RyTnVtKAorCQkJdWludDhfdCBwcmVjaXNpb24gPSBBVk1fTVVNRVJJQ19QUkVDSVNJT04pIGNvbnN0CisJeworCQlyZXR1cm4oICggbVBUUiAhPSBOVUxMICkgPworCQkJCXJhd1R5cGUoKS0+c3RyTnVtKHByZWNpc2lvbikgOiAiVHlwZTo6bnVtPG51bGw+IiApOworCX0KKworfTsKKworCisvKioKKyAqIG9wZXJhdG9yPDwKKyAqLworQVZNX09TX1NUUkVBTSggVHlwZVNwZWNpZmllciApCisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKiBUWVBFU1BFQ0lGSUVSX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvdHlwZS9VbmlvblR5cGVTcGVjaWZpZXIuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3R5cGUvVW5pb25UeXBlU3BlY2lmaWVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTU2N2E5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3R5cGUvVW5pb25UeXBlU3BlY2lmaWVyLmNwcApAQCAtMCwwICsxLDcxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTEgamFudi4gMjAxMworICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVW5pb25UeXBlU3BlY2lmaWVyLmgiCisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorICogU2VyaWFsaXphdGlvbgorICovCit2b2lkIFVuaW9uVHlwZVNwZWNpZmllcjo6dG9TdHJlYW0oT3V0U3RyZWFtICYgb3V0KSBjb25zdAoreworCWlmKCBvdXQucHJlZmVyYWJseUZRTigpICkKKwl7CisJCW91dCA8PCBUQUIgPDwgZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsKKworCQlBVk1fREVCVUdfUkVGX0NPVU5URVIob3V0KTsKKworCQlyZXR1cm47CisJfQorCisJb3V0IDw8IFRBQiA8PCAidHlwZSAiIDw8IGdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIiB1bmlvbiI7CisKKwlvdXQgPDwgIiB7IiA8PCBFT0w7CisKK0FWTV9JRl9ERUJVR19GTEFHKCBDT01QSUxJTkcgKQorCWlmKCBoYXNBc3RFbGVtZW50KCkgKQorCXsKKwkJb3V0IDw8IFRBQjIgPDwgIi8vY29tcGlsZWQgPSAiCisJCQk8PCBnZXRBc3RGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8ICI7IiA8PCBFT0w7CisJfQorQVZNX0VORElGX0RFQlVHX0ZMQUcoIENPTVBJTElORyApCisKKworCW91dCA8PCBUQUIgPDwgInByb3BlcnR5OiIgPDwgRU9MCisKKwkJPDwgVEFCMiA8PCAic2l6ZSA9ICIgPDwgc2l6ZSgpIDw8ICI7IiA8PCBFT0wKKwkJPDwgVEFCMiA8PCAiZGF0YV9zaXplID0gIiA8PCBnZXREYXRhU2l6ZSgpIDw8ICI7IiA8PCBFT0wKKwkJPDwgVEFCMiA8PCAiYml0X3NpemUgPSAiIDw8IGdldEJpdFNpemUoKSA8PCAiOyIgPDwgRU9MCisKKwkJPDwgVEFCIDw8ICJ1bmlvbjoiIDw8IEVPTF9JTkNSX0lOREVOVDsKKworCWdldFN5bWJvbERhdGEoKS50b1N0cmVhbShvdXQpOworCisJaWYoIGhhc0NvbnN0cmFpbnQoKSApCisJeworCQlvdXQgPDwgVEFCMiA8PCAiQGNvbnN0cmFpbnQgeyIgPDwgRU9MX0lOQ1IyX0lOREVOVDsKKwkJZ2V0Q29uc3RyYWludCgpLnRvU3RyZWFtKG91dCk7CisJCW91dCA8PCBERUNSMl9JTkRFTlRfVEFCMiA8PCAifSIgPDwgRU9MOworCX0KKworCW91dCA8PCBERUNSX0lOREVOVF9UQUIgPDwgIn0iIDw8IEVPTF9GTFVTSDsKK30KKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90eXBlL1VuaW9uVHlwZVNwZWNpZmllci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3R5cGUvVW5pb25UeXBlU3BlY2lmaWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY0NWM1MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC90eXBlL1VuaW9uVHlwZVNwZWNpZmllci5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxMSBqYW52LiAyMDEzCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgVU5JT05UWVBFU1BFQ0lGSUVSX0hfCisjZGVmaW5lIFVOSU9OVFlQRVNQRUNJRklFUl9IXworCisjaW5jbHVkZSA8Zm1sL3R5cGUvQmFzZVN5bWJvbFR5cGVTcGVjaWZpZXIuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKK2NsYXNzIERhdGFUeXBlOworCisKK2NsYXNzIFVuaW9uVHlwZVNwZWNpZmllciA6IHB1YmxpYyBCYXNlU3ltYm9sVHlwZVNwZWNpZmllciAsCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggVW5pb25UeXBlU3BlY2lmaWVyICkKK3sKKworCUFWTV9ERUNMQVJFX1VOQ0xPTkFCTEVfQ0xBU1MoVW5pb25UeXBlU3BlY2lmaWVyKQorCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlVbmlvblR5cGVTcGVjaWZpZXIoRGF0YVR5cGUgKiBhQ29tcGlsZWRUeXBlKQorCTogQmFzZVN5bWJvbFR5cGVTcGVjaWZpZXIoQ0xBU1NfS0lORF9UKCBVbmlvblR5cGVTcGVjaWZpZXIgKSwKKwkJCVRZUEVfVU5JT05fU1BFQ0lGSUVSLCBhQ29tcGlsZWRUeXBlLCAxLCAxLCAwKQorCXsKKwkJLy8hISEgTk9USElORworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgflVuaW9uVHlwZVNwZWNpZmllcigpCisJeworCQkvLyEhISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBTZXJpYWxpemF0aW9uCisJICovCisJdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvdXQpIGNvbnN0OworCit9OworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworI2VuZGlmIC8qIFVOSU9OVFlQRVNQRUNJRklFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3dvcmtmbG93L1F1ZXJ5LmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC93b3JrZmxvdy9RdWVyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ3MjllMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC93b3JrZmxvdy9RdWVyeS5jcHAKQEAgLTAsMCArMSw4MzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlF1ZXJ5LmgiCisKKyNpbmNsdWRlIDxmYW0vYXBpL1Byb2Nlc3NvclVuaXRBdXRvUmVnaXN0cmF0aW9uLmg+CisKKyNpbmNsdWRlIDxmbWwvbnVtZXJpYy9GbG9hdC5oPgorI2luY2x1ZGUgPGZtbC9udW1lcmljL0ludGVnZXIuaD4KKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGSU5EIFdPQkpFQ1QgIEJZIE5hbWVJRAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitXT2JqZWN0ICogUXVlcnk6OmdldFdPYmplY3RCeU5hbWVJRChjb25zdCBXT2JqZWN0ICogd2ZPYmplY3QsCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwgV09iamVjdCAqIHRoZURlZmF1bHRWYWx1ZSkKK3sKKwlpZiggd2ZPYmplY3QgIT0gV09iamVjdDo6X05VTExfICkKKwl7CisJCVdPYmplY3Q6OmNvbnN0X2l0ZXJhdG9yIGl0V2ZPID0gd2ZPYmplY3QtPm93bmVkX2JlZ2luKCk7CisJCVdPYmplY3Q6OmNvbnN0X2l0ZXJhdG9yIGVuZFdmTyA9IHdmT2JqZWN0LT5vd25lZF9lbmQoKTsKKwkJZm9yKCA7IGl0V2ZPICE9IGVuZFdmTyA7ICsraXRXZk8gKQorCQl7CisJCQlpZiggKCppdFdmTyktPmdldE5hbWVJRCgpID09IGFOYW1lSUQgKQorCQkJeworCQkJCXJldHVybiggKml0V2ZPICk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4oIHRoZURlZmF1bHRWYWx1ZSApOworfQorCitXT2JqZWN0ICogUXVlcnk6OmdldFJlZ2V4V09iamVjdEJ5TmFtZUlEKGNvbnN0IFdPYmplY3QgKiB3Zk9iamVjdCwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUmVnZXhOYW1lSUQsIFdPYmplY3QgKiB0aGVEZWZhdWx0VmFsdWUpCit7CisJaWYoIHdmT2JqZWN0ICE9IFdPYmplY3Q6Ol9OVUxMXyApCisJeworCQlXT2JqZWN0Ojpjb25zdF9pdGVyYXRvciBpdFdmTyA9IHdmT2JqZWN0LT5vd25lZF9iZWdpbigpOworCQlXT2JqZWN0Ojpjb25zdF9pdGVyYXRvciBlbmRXZk8gPSB3Zk9iamVjdC0+b3duZWRfZW5kKCk7CisJCWZvciggOyBpdFdmTyAhPSBlbmRXZk8gOyArK2l0V2ZPICkKKwkJeworCQkJaWYoIFJFR0VYX01BVENIKCgqaXRXZk8pLT5nZXROYW1lSUQoKSwgYVJlZ2V4TmFtZUlEKSApCisJCQl7CisJCQkJcmV0dXJuKCAqaXRXZk8gKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiggdGhlRGVmYXVsdFZhbHVlICk7Cit9CisKKworV09iamVjdCAqIFF1ZXJ5OjpnZXRXVHlwZWRPYmplY3RCeUZRTmFtZUlEKAorCQljb25zdCBXT2JqZWN0ICogd2ZPYmplY3QsIGNvbnN0IHN0ZDo6c3RyaW5nICYgZnFuSUQpCit7CisJaWYoIHdmT2JqZWN0ICE9IFdPYmplY3Q6Ol9OVUxMXyApCisJeworCQlXT2JqZWN0Ojpjb25zdF9pdGVyYXRvciBpdFdmTyA9IHdmT2JqZWN0LT5vd25lZF9iZWdpbigpOworCQlXT2JqZWN0Ojpjb25zdF9pdGVyYXRvciBlbmRXZk8gPSB3Zk9iamVjdC0+b3duZWRfZW5kKCk7CisJCWZvciggOyBpdFdmTyAhPSBlbmRXZk8gOyArK2l0V2ZPICkKKwkJeworCQkJaWYoICgqaXRXZk8pLT5pc1dUeXBlZE9iamVjdCgpCisJCQkJJiYgKCgqaXRXZk8pLT5mcW5FcXVhbHMoIGZxbklEICkgKSApCisJCQl7CisJCQkJcmV0dXJuKCAqaXRXZk8gKTsKKwkJCX0KKwkJCWVsc2UgaWYoICgqaXRXZk8pLT5pc1dTZXF1ZW5jZSgpICkKKwkJCXsKKwkJCQlXT2JqZWN0ICogZm91bmRXT2JqZWN0ID0KKwkJCQkJCWdldFdUeXBlZE9iamVjdEJ5RlFOYW1lSUQoKml0V2ZPLCBmcW5JRCk7CisJCQkJaWYoIGZvdW5kV09iamVjdCAhPSBXT2JqZWN0OjpfTlVMTF8gKQorCQkJCXsKKwkJCQkJcmV0dXJuKCBmb3VuZFdPYmplY3QgKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJcmV0dXJuKCBXT2JqZWN0OjpfTlVMTF8gKTsKK30KKworCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRklORCBJTiBDT01QT1NJVEUgRk9STSAgQlkgVFlQRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK1dPYmplY3QgKiBRdWVyeTo6Z2V0UmVnaXN0ZXJXT2JqZWN0KGNvbnN0IFdPYmplY3QgKiB3Zk9iamVjdCwKKwkJY29uc3QgSVByb2Nlc3NvclVuaXRSZWdpc3RyYXRpb24gJiBhUmVnaXN0ZXJUb29sKQoreworCWlmKCB3Zk9iamVjdCAhPSBXT2JqZWN0OjpfTlVMTF8gKQorCXsKKwkJV09iamVjdDo6Y29uc3RfaXRlcmF0b3IgaXRXZk8gPSB3Zk9iamVjdC0+b3duZWRfYmVnaW4oKTsKKwkJV09iamVjdDo6Y29uc3RfaXRlcmF0b3IgZW5kV2ZPID0gd2ZPYmplY3QtPm93bmVkX2VuZCgpOworCQlmb3IoIDsgaXRXZk8gIT0gZW5kV2ZPIDsgKytpdFdmTyApCisJCXsKKwkJCWlmKCAoKml0V2ZPKS0+aXNXVHlwZWRPYmplY3QoKQorCQkJCSYmIGFSZWdpc3RlclRvb2wuaXNUeXBlSUQoICooKml0V2ZPKSApICkKKwkJCXsKKwkJCQlyZXR1cm4oICppdFdmTyApOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuKCBXT2JqZWN0OjpfTlVMTF8gKTsKK30KKworCit2b2lkIFF1ZXJ5OjpnZXRXT2JqZWN0QnlUeXBlTmFtZUlEKGNvbnN0IFdPYmplY3QgKiB3Zk9iamVjdCwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhVHlwZUlELCBMaXN0PCBXT2JqZWN0ICogPiAmIGFDb250YWluZXIpCit7CisJaWYoIHdmT2JqZWN0ICE9IFdPYmplY3Q6Ol9OVUxMXyApCisJeworCQlXT2JqZWN0Ojpjb25zdF9pdGVyYXRvciBpdFdmTyA9IHdmT2JqZWN0LT5vd25lZF9iZWdpbigpOworCQlXT2JqZWN0Ojpjb25zdF9pdGVyYXRvciBlbmRXZk8gPSB3Zk9iamVjdC0+b3duZWRfZW5kKCk7CisJCWZvciggOyBpdFdmTyAhPSBlbmRXZk8gOyArK2l0V2ZPICkKKwkJeworCQkJaWYoICgqaXRXZk8pLT5pc1dUeXBlZE9iamVjdCgpCisJCQkJJiYgKCppdFdmTyktPmlzV1R5cGVkSUQoYVR5cGVJRCkgKQorCQkJeworCQkJCWFDb250YWluZXIucHVzaF9iYWNrKCAqaXRXZk8gKTsKKwkJCX0KKwkJfQorCX0KK30KKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEdFVFRFUiBnZXRXU2VxdWVuY2UKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworV09iamVjdCAqIFF1ZXJ5OjpnZXRXU2VxdWVuY2UoY29uc3QgV09iamVjdCAqIHdmT2JqZWN0LAorCQljb25zdCBzdGQ6OnN0cmluZyAmIHNlY3Rpb25JRCwgV09iamVjdCAqIHRoZURlZmF1bHRWYWx1ZSkKK3sKKwlpZiggd2ZPYmplY3QgIT0gV09iamVjdDo6X05VTExfICkKKwl7CisJCVdPYmplY3Q6OmNvbnN0X2l0ZXJhdG9yIGl0V2ZPID0gd2ZPYmplY3QtPm93bmVkX2JlZ2luKCk7CisJCVdPYmplY3Q6OmNvbnN0X2l0ZXJhdG9yIGVuZFdmTyA9IHdmT2JqZWN0LT5vd25lZF9lbmQoKTsKKwkJZm9yKCA7IGl0V2ZPICE9IGVuZFdmTyA7ICsraXRXZk8gKQorCQl7CisJCQlpZiggKCppdFdmTyktPmlzV1NlcXVlbmNlKCkKKwkJCQkmJiAoKCppdFdmTyktPmdldE5hbWVJRCgpID09IHNlY3Rpb25JRCkgKQorCQkJeworCQkJCXJldHVybiggKml0V2ZPICk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4oIHRoZURlZmF1bHRWYWx1ZSApOworfQorCitXT2JqZWN0ICogUXVlcnk6OmdldFJlZ2V4V1NlcXVlbmNlKGNvbnN0IFdPYmplY3QgKiB3Zk9iamVjdCwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUmVnZXhTZWN0aW9uSUQsIFdPYmplY3QgKiB0aGVEZWZhdWx0VmFsdWUpCit7CisJaWYoIHdmT2JqZWN0ICE9IFdPYmplY3Q6Ol9OVUxMXyApCisJeworCQlXT2JqZWN0Ojpjb25zdF9pdGVyYXRvciBpdFdmTyA9IHdmT2JqZWN0LT5vd25lZF9iZWdpbigpOworCQlXT2JqZWN0Ojpjb25zdF9pdGVyYXRvciBlbmRXZk8gPSB3Zk9iamVjdC0+b3duZWRfZW5kKCk7CisJCWZvciggOyBpdFdmTyAhPSBlbmRXZk8gOyArK2l0V2ZPICkKKwkJeworCQkJaWYoICgqaXRXZk8pLT5pc1dTZXF1ZW5jZSgpCisJCQkJJiYgUkVHRVhfTUFUQ0goKCppdFdmTyktPmdldE5hbWVJRCgpLCBhUmVnZXhTZWN0aW9uSUQpICkKKwkJCXsKKwkJCQlyZXR1cm4oICppdFdmTyApOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuKCB0aGVEZWZhdWx0VmFsdWUgKTsKK30KKworCisvLyBGb3IgY29tcGF0aWJpbGl0eSB3aGVuIElEIGhhcyBjaGFuZ2VkICEhIQorV09iamVjdCAqIFF1ZXJ5OjpnZXRXU2VxdWVuY2VPckVsc2UoCisJCWNvbnN0IFdPYmplY3QgKiB3Zk9iamVjdCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBzZWN0aW9uSUQsCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgZWxzZVNlcXVlbmNlSUQsIFdPYmplY3QgKiB0aGVEZWZhdWx0VmFsdWUpCit7CisJaWYoIHdmT2JqZWN0ICE9IFdPYmplY3Q6Ol9OVUxMXyApCisJeworCQlXT2JqZWN0ICogZWxzZVdTZXF1ZW5jZSA9IFdPYmplY3Q6Ol9OVUxMXzsKKworCQlXT2JqZWN0Ojpjb25zdF9pdGVyYXRvciBpdFdmTyA9IHdmT2JqZWN0LT5vd25lZF9iZWdpbigpOworCQlXT2JqZWN0Ojpjb25zdF9pdGVyYXRvciBlbmRXZk8gPSB3Zk9iamVjdC0+b3duZWRfZW5kKCk7CisJCWZvciggOyBpdFdmTyAhPSBlbmRXZk8gOyArK2l0V2ZPICkKKwkJeworCQkJaWYoICgqaXRXZk8pLT5pc1dTZXF1ZW5jZSgpICkKKwkJCXsKKwkJCQlpZiggKCgqaXRXZk8pLT5nZXROYW1lSUQoKSA9PSBzZWN0aW9uSUQpICkKKwkJCQl7CisJCQkJCXJldHVybiggKCppdFdmTykgKTsKKwkJCQl9CisJCQkJZWxzZSBpZiggKGVsc2VXU2VxdWVuY2UgPT0gV09iamVjdDo6X05VTExfKQorCQkJCQkJJiYgKCgqaXRXZk8pLT5nZXROYW1lSUQoKSA9PSBlbHNlU2VxdWVuY2VJRCkgKQorCQkJCXsKKwkJCQkJLy8gU2F2ZSB0aGUgZmlyc3QgZWxzZVNlcXVlbmNlICEKKwkJCQkJZWxzZVdTZXF1ZW5jZSA9ICgqaXRXZk8pOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4oIChlbHNlV1NlcXVlbmNlICE9IFdPYmplY3Q6Ol9OVUxMXykgPworCQkJCWVsc2VXU2VxdWVuY2UgOiB0aGVEZWZhdWx0VmFsdWUgKTsKKwl9CisJcmV0dXJuKCB0aGVEZWZhdWx0VmFsdWUgKTsKK30KKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBHRVRURVIgZm9yIFdTZXF1ZW5jZSBvciBXUmVmZXJlbmNlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitXT2JqZWN0ICogUXVlcnk6OmdldFdTZXF1ZW5jZU9yUmVmZXJlbmNlKGNvbnN0IFdPYmplY3QgKiB3Zk9iamVjdCwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBzZWN0aW9uSUQsIFdPYmplY3QgKiB0aGVEZWZhdWx0VmFsdWUpCit7CisJaWYoIHdmT2JqZWN0ICE9IFdPYmplY3Q6Ol9OVUxMXyApCisJeworCQlXT2JqZWN0Ojpjb25zdF9pdGVyYXRvciBpdFdmTyA9IHdmT2JqZWN0LT5vd25lZF9iZWdpbigpOworCQlXT2JqZWN0Ojpjb25zdF9pdGVyYXRvciBlbmRXZk8gPSB3Zk9iamVjdC0+b3duZWRfZW5kKCk7CisJCWZvciggOyBpdFdmTyAhPSBlbmRXZk8gOyArK2l0V2ZPICkKKwkJeworCQkJaWYoICgqaXRXZk8pLT5pc1dTZXF1ZW5jZU9yUmVmZXJlbmNlKCkKKwkJCQkmJiAoKCppdFdmTyktPmdldE5hbWVJRCgpID09IHNlY3Rpb25JRCkgKQorCQkJeworCQkJCXJldHVybiggKCppdFdmTyktPmlzV1NlcXVlbmNlKCkgPyAoKml0V2ZPKQorCQkJCQkJOiAoKml0V2ZPKS0+Z2V0V1JlZmVyZW5jZVZhbHVlKCkgKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiggdGhlRGVmYXVsdFZhbHVlICk7Cit9CisKK1dPYmplY3QgKiBRdWVyeTo6Z2V0UmVnZXhXU2VxdWVuY2VPclJlZmVyZW5jZShjb25zdCBXT2JqZWN0ICogd2ZPYmplY3QsCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVJlZ2V4U2VjdGlvbklELCBXT2JqZWN0ICogdGhlRGVmYXVsdFZhbHVlKQoreworCWlmKCB3Zk9iamVjdCAhPSBXT2JqZWN0OjpfTlVMTF8gKQorCXsKKwkJV09iamVjdDo6Y29uc3RfaXRlcmF0b3IgaXRXZk8gPSB3Zk9iamVjdC0+b3duZWRfYmVnaW4oKTsKKwkJV09iamVjdDo6Y29uc3RfaXRlcmF0b3IgZW5kV2ZPID0gd2ZPYmplY3QtPm93bmVkX2VuZCgpOworCQlmb3IoIDsgaXRXZk8gIT0gZW5kV2ZPIDsgKytpdFdmTyApCisJCXsKKwkJCWlmKCAoKml0V2ZPKS0+aXNXU2VxdWVuY2VPclJlZmVyZW5jZSgpCisJCQkJJiYgUkVHRVhfTUFUQ0goKCppdFdmTyktPmdldE5hbWVJRCgpLCBhUmVnZXhTZWN0aW9uSUQpICkKKwkJCXsKKwkJCQlyZXR1cm4oICgqaXRXZk8pLT5pc1dTZXF1ZW5jZSgpID8gKCppdFdmTykKKwkJCQkJCTogKCppdFdmTyktPmdldFdSZWZlcmVuY2VWYWx1ZSgpICk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4oIHRoZURlZmF1bHRWYWx1ZSApOworfQorCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEdFVFRFUiBmb3IgRk9STSBpbiBhIENvbnRhaW5lcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLwordm9pZCBRdWVyeTo6Z2V0TGlzdFdPYmplY3QoCisJCWNvbnN0IFdPYmplY3QgKiB3Zk9iamVjdCwgTGlzdDwgV09iamVjdCAqID4gJiBhQ29udGFpbmVyKQoreworCWlmKCB3Zk9iamVjdCAhPSBXT2JqZWN0OjpfTlVMTF8gKQorCXsKKwkJV09iamVjdDo6Y29uc3RfaXRlcmF0b3IgaXRXZk8gPSB3Zk9iamVjdC0+b3duZWRfYmVnaW4oKTsKKwkJV09iamVjdDo6Y29uc3RfaXRlcmF0b3IgZW5kV2ZPID0gd2ZPYmplY3QtPm93bmVkX2VuZCgpOworCQlmb3IoIDsgaXRXZk8gIT0gZW5kV2ZPIDsgKytpdFdmTyApCisJCXsKKwkJCWlmKCAoKml0V2ZPKS0+aXNXVHlwZWRPYmplY3QoKSApCisJCQl7CisJCQkJYUNvbnRhaW5lci5wdXNoX2JhY2soICppdFdmTyApOworCQkJfQorCQl9CisJfQorfQorCisKK3ZvaWQgUXVlcnk6OmdldFJlZ2V4V09iamVjdEluU2VxdWVuY2UoY29uc3QgV09iamVjdCAqIHdmT2JqZWN0LAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFSZWdleFNlY3Rpb25JRCwgTGlzdDwgV09iamVjdCAqID4gJiBhQ29udGFpbmVyKQoreworCWlmKCB3Zk9iamVjdCAhPSBXT2JqZWN0OjpfTlVMTF8gKQorCXsKKwkJV09iamVjdDo6Y29uc3RfaXRlcmF0b3IgaXRXZk8gPSB3Zk9iamVjdC0+b3duZWRfYmVnaW4oKTsKKwkJV09iamVjdDo6Y29uc3RfaXRlcmF0b3IgZW5kV2ZPID0gd2ZPYmplY3QtPm93bmVkX2VuZCgpOworCQlmb3IoIDsgaXRXZk8gIT0gZW5kV2ZPIDsgKytpdFdmTyApCisJCXsKKwkJCWlmKCAoKml0V2ZPKS0+aXNXU2VxdWVuY2UoKQorCQkJCSYmIFJFR0VYX01BVENIKCgqaXRXZk8pLT5nZXROYW1lSUQoKSwgYVJlZ2V4U2VjdGlvbklEKSApCisJCQl7CisJCQkJZ2V0TGlzdFdPYmplY3QoICppdFdmTyAsIGFDb250YWluZXIgKTsKKwkJCX0KKwkJfQorCX0KKworfQorCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogR0VUVEVSIGZvciBGT1JNIEFUVFJJQlVURSBvZiBhIGdpdmVuIE5BTUUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCitXT2JqZWN0ICogUXVlcnk6OmdldFdQcm9wZXJ0eShjb25zdCBXT2JqZWN0ICogd2ZPYmplY3QsCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYW5JRCwgV09iamVjdCAqIHRoZURlZmF1bHRWYWx1ZSkKK3sKKwlpZiggd2ZPYmplY3QgIT0gV09iamVjdDo6X05VTExfICkKKwl7CisJCVdPYmplY3Q6OmNvbnN0X2l0ZXJhdG9yIGl0V2ZPID0gd2ZPYmplY3QtPm93bmVkX2JlZ2luKCk7CisJCVdPYmplY3Q6OmNvbnN0X2l0ZXJhdG9yIGVuZFdmTyA9IHdmT2JqZWN0LT5vd25lZF9lbmQoKTsKKwkJZm9yKCA7IGl0V2ZPICE9IGVuZFdmTyA7ICsraXRXZk8gKQorCQl7CisJCQlpZiggKCppdFdmTyktPmlzV1Byb3BlcnR5KCkKKwkJCSYmICgoKml0V2ZPKS0+Z2V0TmFtZUlEKCkgPT0gYW5JRCkgKQorCQkJeworCQkJCXJldHVybiggKml0V2ZPICk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuKCB0aGVEZWZhdWx0VmFsdWUgKTsKK30KKworV09iamVjdCAqIFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eShjb25zdCBXT2JqZWN0ICogd2ZPYmplY3QsCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVJlZ2V4SUQsIFdPYmplY3QgKiB0aGVEZWZhdWx0VmFsdWUpCit7CisJaWYoIHdmT2JqZWN0ICE9IFdPYmplY3Q6Ol9OVUxMXyApCisJeworCQlXT2JqZWN0Ojpjb25zdF9pdGVyYXRvciBpdFdmTyA9IHdmT2JqZWN0LT5vd25lZF9iZWdpbigpOworCQlXT2JqZWN0Ojpjb25zdF9pdGVyYXRvciBlbmRXZk8gPSB3Zk9iamVjdC0+b3duZWRfZW5kKCk7CisJCWZvciggOyBpdFdmTyAhPSBlbmRXZk8gOyArK2l0V2ZPICkKKwkJeworCQkJaWYoICgqaXRXZk8pLT5pc1dQcm9wZXJ0eSgpCisJCQkmJiBSRUdFWF9NQVRDSCgoKml0V2ZPKS0+Z2V0TmFtZUlEKCksIGFSZWdleElEKSApCisJCQl7CisJCQkJcmV0dXJuKCAqaXRXZk8gKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4oIHRoZURlZmF1bHRWYWx1ZSApOworfQorCitXT2JqZWN0ICogUXVlcnk6OmdldFdQcm9wZXJ0eU9yRWxzZSgKKwkJY29uc3QgV09iamVjdCAqIHdmT2JqZWN0LCBjb25zdCBzdGQ6OnN0cmluZyAmIGFuSUQsCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgZWxzZUlELCBXT2JqZWN0ICogdGhlRGVmYXVsdFZhbHVlKQoreworCWlmKCB3Zk9iamVjdCAhPSBXT2JqZWN0OjpfTlVMTF8gKQorCXsKKwkJV09iamVjdCAqIGVsc2VXT2JqZWN0ID0gV09iamVjdDo6X05VTExfOworCQlXT2JqZWN0Ojpjb25zdF9pdGVyYXRvciBpdFdmTyA9IHdmT2JqZWN0LT5vd25lZF9iZWdpbigpOworCQlXT2JqZWN0Ojpjb25zdF9pdGVyYXRvciBlbmRXZk8gPSB3Zk9iamVjdC0+b3duZWRfZW5kKCk7CisJCWZvciggOyBpdFdmTyAhPSBlbmRXZk8gOyArK2l0V2ZPICkKKwkJeworCQkJaWYoICgqaXRXZk8pLT5pc1dQcm9wZXJ0eSgpICkKKwkJCXsKKwkJCQlpZiggKCgqaXRXZk8pLT5nZXROYW1lSUQoKSA9PSBhbklEKSApCisJCQkJeworCQkJCQlyZXR1cm4oICppdFdmTyApOworCQkJCX0KKwkJCQllbHNlIGlmKCAoZWxzZVdPYmplY3QgPT0gV09iamVjdDo6X05VTExfKQorCQkJCQkmJiAoKCppdFdmTyktPmdldE5hbWVJRCgpID09IGVsc2VJRCkgKQorCQkJCXsKKwkJCQkJLy8gU2F2ZSB0aGUgZmlyc3QgZWxzZVdPYmplY3QgIQorCQkJCQllbHNlV09iamVjdCA9ICgqaXRXZk8pOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiggKGVsc2VXT2JqZWN0ICE9IFdPYmplY3Q6Ol9OVUxMXykgPworCQkJCWVsc2VXT2JqZWN0IDogdGhlRGVmYXVsdFZhbHVlICk7CisJfQorCXJldHVybiggdGhlRGVmYXVsdFZhbHVlICk7Cit9CisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBHRVRURVIgZm9yIEZPUk0gQVRUUklCVVRFIG9mIGEgZ2l2ZW4gTkFNRSAmJiBhIGdpdmVuIEtJTkQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCitXT2JqZWN0ICogUXVlcnk6OmdldFdQcm9wZXJ0eShjb25zdCBXT2JqZWN0ICogd2ZPYmplY3QsCisJCVdPYmplY3Q6OkVOVU1fV09CSkVDVF9LSU5EIGFLaW5kLAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFuSUQsIFdPYmplY3QgKiB0aGVEZWZhdWx0VmFsdWUpCit7CisJaWYoIHdmT2JqZWN0ICE9IFdPYmplY3Q6Ol9OVUxMXyApCisJeworCQlXT2JqZWN0Ojpjb25zdF9pdGVyYXRvciBpdFdmTyA9IHdmT2JqZWN0LT5vd25lZF9iZWdpbigpOworCQlXT2JqZWN0Ojpjb25zdF9pdGVyYXRvciBlbmRXZk8gPSB3Zk9iamVjdC0+b3duZWRfZW5kKCk7CisJCWZvciggOyBpdFdmTyAhPSBlbmRXZk8gOyArK2l0V2ZPICkKKwkJeworCQkJaWYoICgqaXRXZk8pLT5pc1dQcm9wZXJ0eSgpICkKKwkJCXsKKwkJCQlpZiggKCppdFdmTyktPmlzS2luZCggYUtpbmQgKQorCQkJCQkmJiAoKCppdFdmTyktPmdldE5hbWVJRCgpID09IGFuSUQpICkKKwkJCQl7CisJCQkJCXJldHVybiggKml0V2ZPICk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuKCB0aGVEZWZhdWx0VmFsdWUgKTsKK30KKworV09iamVjdCAqIFF1ZXJ5OjpnZXRXUHJvcGVydHkoY29uc3QgV09iamVjdCAqIHdmT2JqZWN0LAorCQlXT2JqZWN0OjpFTlVNX1dPQkpFQ1RfS0lORCBhS2luZCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhbklELAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGVsc2VJRCwgV09iamVjdCAqIHRoZURlZmF1bHRWYWx1ZSkKK3sKKwlpZiggd2ZPYmplY3QgIT0gV09iamVjdDo6X05VTExfICkKKwl7CisJCVdPYmplY3Q6OmNvbnN0X2l0ZXJhdG9yIGl0V2ZPID0gd2ZPYmplY3QtPm93bmVkX2JlZ2luKCk7CisJCVdPYmplY3Q6OmNvbnN0X2l0ZXJhdG9yIGVuZFdmTyA9IHdmT2JqZWN0LT5vd25lZF9lbmQoKTsKKwkJZm9yKCA7IGl0V2ZPICE9IGVuZFdmTyA7ICsraXRXZk8gKQorCQl7CisJCQlpZiggKCppdFdmTyktPmlzV1Byb3BlcnR5KCkgKQorCQkJeworCQkJCWlmKCAoKml0V2ZPKS0+aXNLaW5kKCBhS2luZCApCisJCQkJCSYmICgoKml0V2ZPKS0+Z2V0TmFtZUlEKCkgPT0gYW5JRCkKKwkJCQkJJiYgKCgqaXRXZk8pLT5nZXROYW1lSUQoKSA9PSBlbHNlSUQpICkKKwkJCQl7CisJCQkJCXJldHVybiggKml0V2ZPICk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuKCB0aGVEZWZhdWx0VmFsdWUgKTsKK30KKworCitXT2JqZWN0ICogUXVlcnk6OmdldFdQcm9wZXJ0eU9yRWxzZShjb25zdCBXT2JqZWN0ICogd2ZPYmplY3QsCisJCVdPYmplY3Q6OkVOVU1fV09CSkVDVF9LSU5EIGFLaW5kLCBjb25zdCBzdGQ6OnN0cmluZyAmIGFuSUQsCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgZWxzZUlELCBXT2JqZWN0ICogdGhlRGVmYXVsdFZhbHVlKQoreworCWlmKCB3Zk9iamVjdCAhPSBXT2JqZWN0OjpfTlVMTF8gKQorCXsKKwkJV09iamVjdCAqIGVsc2VBdHRyaWJ1dGUgPSBXT2JqZWN0OjpfTlVMTF87CisJCVdPYmplY3Q6OmNvbnN0X2l0ZXJhdG9yIGl0V2ZPID0gd2ZPYmplY3QtPm93bmVkX2JlZ2luKCk7CisJCVdPYmplY3Q6OmNvbnN0X2l0ZXJhdG9yIGVuZFdmTyA9IHdmT2JqZWN0LT5vd25lZF9lbmQoKTsKKwkJZm9yKCA7IGl0V2ZPICE9IGVuZFdmTyA7ICsraXRXZk8gKQorCQl7CisJCQlpZiggKCppdFdmTyktPmlzV1Byb3BlcnR5KCkgKQorCQkJeworCQkJCWlmKCAoKml0V2ZPKS0+aXNLaW5kKCBhS2luZCApICkKKwkJCQl7CisJCQkJCWlmKCAoKml0V2ZPKS0+Z2V0TmFtZUlEKCkgPT0gYW5JRCApCisJCQkJCXsKKwkJCQkJCXJldHVybiggKml0V2ZPICk7CisJCQkJCX0KKwkJCQkJZWxzZSBpZiggKGVsc2VBdHRyaWJ1dGUgPT0gV09iamVjdDo6X05VTExfKQorCQkJCQkJCSYmICgoKml0V2ZPKS0+Z2V0TmFtZUlEKCkgPT0gZWxzZUlEKSApCisJCQkJCXsKKwkJCQkJCWVsc2VBdHRyaWJ1dGUgPSAoKml0V2ZPKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiggKGVsc2VBdHRyaWJ1dGUgIT0gV09iamVjdDo6X05VTExfKSA/CisJCQkJZWxzZUF0dHJpYnV0ZSA6IHRoZURlZmF1bHRWYWx1ZSApOworCX0KKworCXJldHVybiggdGhlRGVmYXVsdFZhbHVlICk7Cit9CisKKworV09iamVjdCAqIFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eSgKKwkJY29uc3QgV09iamVjdCAqIHdmT2JqZWN0LCBXT2JqZWN0OjpFTlVNX1dPQkpFQ1RfS0lORCBhS2luZCwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUmVnZXgsIFdPYmplY3QgKiB0aGVEZWZhdWx0VmFsdWUpCit7CisJaWYoIHdmT2JqZWN0ICE9IFdPYmplY3Q6Ol9OVUxMXyApCisJeworCQlXT2JqZWN0Ojpjb25zdF9pdGVyYXRvciBpdFdmTyA9IHdmT2JqZWN0LT5vd25lZF9iZWdpbigpOworCQlXT2JqZWN0Ojpjb25zdF9pdGVyYXRvciBlbmRXZk8gPSB3Zk9iamVjdC0+b3duZWRfZW5kKCk7CisJCWZvciggOyBpdFdmTyAhPSBlbmRXZk8gOyArK2l0V2ZPICkKKwkJeworCQkJaWYoICgqaXRXZk8pLT5pc1dQcm9wZXJ0eSgpICkKKwkJCXsKKwkJCQlpZiggKCppdFdmTyktPmlzS2luZCggYUtpbmQgKQorCQkJCQkmJiBSRUdFWF9NQVRDSCgoKml0V2ZPKS0+Z2V0TmFtZUlEKCksIGFSZWdleCkgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCAqaXRXZk8gKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4oIHRoZURlZmF1bHRWYWx1ZSApOworfQorCisKK3ZvaWQgUXVlcnk6OmdldFdQcm9wZXJ0eSgKKwkJY29uc3QgV09iamVjdCAqIHdmT2JqZWN0LCBXT2JqZWN0OjpFTlVNX1dPQkpFQ1RfS0lORCBhS2luZCwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhbklELCBDb2xsZWN0aW9uPCBCRiA+ICYgYUNvbnRhaW5lcikKK3sKKwlpZiggd2ZPYmplY3QgIT0gV09iamVjdDo6X05VTExfICkKKwl7CisJCVdPYmplY3Q6OmNvbnN0X2l0ZXJhdG9yIGl0V2ZPID0gd2ZPYmplY3QtPm93bmVkX2JlZ2luKCk7CisJCVdPYmplY3Q6OmNvbnN0X2l0ZXJhdG9yIGVuZFdmTyA9IHdmT2JqZWN0LT5vd25lZF9lbmQoKTsKKwkJZm9yKCA7IGl0V2ZPICE9IGVuZFdmTyA7ICsraXRXZk8gKQorCQl7CisJCQlpZiggKCppdFdmTyktPmlzV1Byb3BlcnR5KCkgKQorCQkJeworCQkJCWlmKCAoKml0V2ZPKS0+aXNLaW5kKCBhS2luZCApCisJCQkJCSYmICgoKml0V2ZPKS0+Z2V0TmFtZUlEKCkgPT0gYW5JRCkgKQorCQkJCXsKKwkJCQkJYUNvbnRhaW5lci5wdXNoX2JhY2soICgqaXRXZk8pLT5nZXRWYWx1ZSgpICk7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCisKK3ZvaWQgUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5KAorCQljb25zdCBXT2JqZWN0ICogd2ZPYmplY3QsIFdPYmplY3Q6OkVOVU1fV09CSkVDVF9LSU5EIGFLaW5kLAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFSZWdleCwgQ29sbGVjdGlvbjwgQkYgPiAmIGFDb250YWluZXIpCit7CisJaWYoIHdmT2JqZWN0ICE9IFdPYmplY3Q6Ol9OVUxMXyApCisJeworCQlXT2JqZWN0Ojpjb25zdF9pdGVyYXRvciBpdFdmTyA9IHdmT2JqZWN0LT5vd25lZF9iZWdpbigpOworCQlXT2JqZWN0Ojpjb25zdF9pdGVyYXRvciBlbmRXZk8gPSB3Zk9iamVjdC0+b3duZWRfZW5kKCk7CisJCWZvciggOyBpdFdmTyAhPSBlbmRXZk8gOyArK2l0V2ZPICkKKwkJeworCQkJaWYoICgqaXRXZk8pLT5pc1dQcm9wZXJ0eSgpICkKKwkJCXsKKwkJCQlpZiggKCppdFdmTyktPmlzS2luZCggYUtpbmQgKQorCQkJCQkmJiBSRUdFWF9NQVRDSCgoKml0V2ZPKS0+Z2V0TmFtZUlEKCksIGFSZWdleCkgKQorCQkJCXsKKwkJCQkJYUNvbnRhaW5lci5wdXNoX2JhY2soICgqaXRXZk8pLT5nZXRWYWx1ZSgpICk7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogR0VUVEVSIGdldEF0dHJpYnV0ZVZhbHVlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK2NvbnN0IEJGICYgUXVlcnk6OmdldFdQcm9wZXJ0eVZhbHVlKGNvbnN0IFdPYmplY3QgKiB3Zk9iamVjdCwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhbklELCBjb25zdCBCRiAmIHRoZURlZmF1bHRWYWx1ZSkKK3sKKwlXT2JqZWN0ICogdGhlQXR0cmlidXRlID0gUXVlcnk6OmdldFdQcm9wZXJ0eSh3Zk9iamVjdCwgYW5JRCk7CisJaWYoIHRoZUF0dHJpYnV0ZSAhPSBXT2JqZWN0OjpfTlVMTF8gKQorCXsKKwkJcmV0dXJuKCB0aGVBdHRyaWJ1dGUtPmdldFZhbHVlKCkgKTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuKCB0aGVEZWZhdWx0VmFsdWUgKTsKKwl9Cit9CisKK2NvbnN0IEJGICYgUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5VmFsdWUoY29uc3QgV09iamVjdCAqIHdmT2JqZWN0LAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFSZWdleElELCBjb25zdCBCRiAmIHRoZURlZmF1bHRWYWx1ZSkKK3sKKwlXT2JqZWN0ICogdGhlQXR0cmlidXRlID0gUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5KHdmT2JqZWN0LCBhUmVnZXhJRCk7CisJaWYoIHRoZUF0dHJpYnV0ZSAhPSBXT2JqZWN0OjpfTlVMTF8gKQorCXsKKwkJcmV0dXJuKCB0aGVBdHRyaWJ1dGUtPmdldFZhbHVlKCkgKTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuKCB0aGVEZWZhdWx0VmFsdWUgKTsKKwl9Cit9CisKK2NvbnN0IEJGICYgUXVlcnk6OmdldFdQcm9wZXJ0eVZhbHVlT3JFbHNlKGNvbnN0IFdPYmplY3QgKiB3Zk9iamVjdCwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhbklELCBjb25zdCBzdGQ6OnN0cmluZyAmIGVsc2VJRCwKKwkJY29uc3QgQkYgJiB0aGVEZWZhdWx0VmFsdWUpCit7CisJV09iamVjdCAqIHRoZUF0dHJpYnV0ZSA9IFF1ZXJ5OjpnZXRXUHJvcGVydHlPckVsc2Uod2ZPYmplY3QsIGFuSUQsIGVsc2VJRCk7CisJaWYoIHRoZUF0dHJpYnV0ZSAhPSBXT2JqZWN0OjpfTlVMTF8gKQorCXsKKwkJcmV0dXJuKCB0aGVBdHRyaWJ1dGUtPmdldFZhbHVlKCkgKTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuKCB0aGVEZWZhdWx0VmFsdWUgKTsKKwl9Cit9CisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogR0VUVEVSICBnZXRXUHJvcGVydHlGb3JtCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitXT2JqZWN0ICogUXVlcnk6OmdldFdQcm9wZXJ0eVdSZWZlcmVuY2UoY29uc3QgV09iamVjdCAqIHdmT2JqZWN0LAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFuSUQsIFdPYmplY3QgKiB0aGVEZWZhdWx0VmFsdWUpCit7CisJaWYoIHdmT2JqZWN0ICE9IFdPYmplY3Q6Ol9OVUxMXyApCisJeworCQlXT2JqZWN0Ojpjb25zdF9pdGVyYXRvciBpdFdmTyA9IHdmT2JqZWN0LT5vd25lZF9iZWdpbigpOworCQlXT2JqZWN0Ojpjb25zdF9pdGVyYXRvciBlbmRXZk8gPSB3Zk9iamVjdC0+b3duZWRfZW5kKCk7CisJCWZvciggOyBpdFdmTyAhPSBlbmRXZk8gOyArK2l0V2ZPICkKKwkJeworCQkJaWYoICgqaXRXZk8pLT5pc1dQcm9wZXJ0eVdSZWZlcmVuY2UoKSApCisJCQl7CisJCQkJcmV0dXJuKCAoKml0V2ZPKS0+Z2V0V1JlZmVyZW5jZVZhbHVlKCkgKTsKKwkJCX0KKy8qCisgKiAhVU5VU0VEIQorICogIURFTEVURSEKKwkJCWlmKCAoKml0V2ZPKS0+aXNXUHJvcGVydHkoKSApCisJCQl7CisJCQkJaWYoICgqaXRXZk8pLT5pc1ZhbHVlV09iamVjdCgpCisJCQkJCSYmICgoKml0V2ZPKS0+Z2V0TmFtZUlEKCkgPT0gYW5JRCkgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCAoKml0V2ZPKS0+Z2V0VmFsdWVXT2JqZWN0KCkgKTsKKwkJCQl9CisJCQl9CisqICFVTlVTRUQhCisqLworCQl9CisJfQorCisJcmV0dXJuKCB0aGVEZWZhdWx0VmFsdWUgKTsKK30KKworV09iamVjdCAqIFF1ZXJ5OjpnZXRXUHJvcGVydHlXUmVmZXJlbmNlT3JFbHNlKGNvbnN0IFdPYmplY3QgKiB3Zk9iamVjdCwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhbklELCBjb25zdCBzdGQ6OnN0cmluZyAmIGVsc2VJRCwKKwkJV09iamVjdCAqIHRoZURlZmF1bHRWYWx1ZSkKK3sKKwlpZiggd2ZPYmplY3QgIT0gV09iamVjdDo6X05VTExfICkKKwl7CisJCVdPYmplY3QgKiBlbHNlQXR0cmlidXRlID0gV09iamVjdDo6X05VTExfOworCisJCVdPYmplY3Q6OmNvbnN0X2l0ZXJhdG9yIGl0V2ZPID0gd2ZPYmplY3QtPm93bmVkX2JlZ2luKCk7CisJCVdPYmplY3Q6OmNvbnN0X2l0ZXJhdG9yIGVuZFdmTyA9IHdmT2JqZWN0LT5vd25lZF9lbmQoKTsKKwkJZm9yKCA7IGl0V2ZPICE9IGVuZFdmTyA7ICsraXRXZk8gKQorCQl7CisJCQlpZiggKCppdFdmTyktPmlzV1Byb3BlcnR5V1JlZmVyZW5jZSgpICkKKwkJCXsKKwkJCQlpZiggKCppdFdmTyktPmdldE5hbWVJRCgpID09IGFuSUQgKQorCQkJCXsKKwkJCQkJcmV0dXJuKCAoKml0V2ZPKS0+Z2V0V1JlZmVyZW5jZVZhbHVlKCkgKTsKKwkJCQl9CisJCQkJZWxzZSBpZiggKGVsc2VBdHRyaWJ1dGUgIT0gV09iamVjdDo6X05VTExfKQorCQkJCQkmJiAoKCppdFdmTyktPmdldE5hbWVJRCgpID09IGVsc2VJRCkgKQorCQkJCXsKKwkJCQkJZWxzZUF0dHJpYnV0ZSA9ICgqaXRXZk8pLT5nZXRXUmVmZXJlbmNlVmFsdWUoKTsKKwkJCQl9CisJCQl9CisvKgorICogIVVOVVNFRCEKKyAqICFERUxFVEUhCisJCQlpZiggKCppdFdmTyktPmlzV1Byb3BlcnR5KCkgKQorCQkJeworCQkJCWlmKCAoKml0V2ZPKS0+aXNWYWx1ZVdPYmplY3QoKQorCQkJCQkmJiAoKCppdFdmTyktPmdldE5hbWVJRCgpID09IGFuSUQpICkKKwkJCQl7CisJCQkJCXJldHVybiggKCppdFdmTyktPmdldFZhbHVlV09iamVjdCgpICk7CisJCQkJfQorCQkJCWVsc2UgaWYoIChlbHNlQXR0cmlidXRlICE9IFdPYmplY3Q6Ol9OVUxMXykKKwkJCQkJJiYgKCppdFdmTyktPmlzVmFsdWVXT2JqZWN0KCkKKwkJCQkJJiYgKCgqaXRXZk8pLT5nZXROYW1lSUQoKSA9PSBlbHNlSUQpICkKKwkJCQl7CisJCQkJCWVsc2VBdHRyaWJ1dGUgPSAoKml0V2ZPKS0+Z2V0VmFsdWVXT2JqZWN0KCk7CisJCQkJfQorCQkJfQorKiAhVU5VU0VEIQorKi8KKwkJfQorCisJCXJldHVybiggKCBlbHNlQXR0cmlidXRlICE9IFdPYmplY3Q6Ol9OVUxMXyApID8KKwkJCQllbHNlQXR0cmlidXRlIDogdGhlRGVmYXVsdFZhbHVlICk7CisJfQorCXJldHVybiggdGhlRGVmYXVsdFZhbHVlICk7Cit9CisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogR0VUVEVSIGdldEF0dHJpYnV0ZUludGVnZXIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworYXZtX3NpemVfdCBRdWVyeTo6Z2V0V1Byb3BlcnR5UG9zU2l6ZVQoCisJCWNvbnN0IFdPYmplY3QgKiB3Zk9iamVjdCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhbklELAorCQlhdm1fc2l6ZV90IHRoZURlZmF1bHRWYWx1ZSwgYXZtX3NpemVfdCB0aGVOZWdhdGl2ZVZhbHVlKQoreworCVdPYmplY3QgKiB0aGVBdHRyaWJ1dGUgPSBRdWVyeTo6Z2V0V1Byb3BlcnR5KHdmT2JqZWN0LAorCQkJV09iamVjdDo6V09CSkVDVF9QUk9QRVJUWV9JTlRFR0VSX0tJTkQsIGFuSUQpOworCWlmKCB0aGVBdHRyaWJ1dGUgIT0gV09iamVjdDo6X05VTExfICkKKwl7CisJCWF2bV9pbnRlZ2VyX3QgdmFsdWUgPSB0aGVBdHRyaWJ1dGUtPmdldEludGVnZXJWYWx1ZSgpOworCisJCXJldHVybiggKHZhbHVlID4gMCkgPyB2YWx1ZSA6IHRoZU5lZ2F0aXZlVmFsdWUgKTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuKCAodGhlRGVmYXVsdFZhbHVlID4gMCkgPyB0aGVEZWZhdWx0VmFsdWUgOiB0aGVOZWdhdGl2ZVZhbHVlICk7CisJfQorfQorCithdm1fc2l6ZV90IFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eVBvc1NpemVUKAorCQljb25zdCBXT2JqZWN0ICogd2ZPYmplY3QsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYVJlZ2V4SUQsCisJCWF2bV9zaXplX3QgdGhlRGVmYXVsdFZhbHVlLCBhdm1fc2l6ZV90IHRoZU5lZ2F0aXZlVmFsdWUpCit7CisJV09iamVjdCAqIHRoZUF0dHJpYnV0ZSA9CisJCQlRdWVyeTo6Z2V0UmVnZXhXUHJvcGVydHkod2ZPYmplY3QsCisJCQkJCVdPYmplY3Q6OldPQkpFQ1RfUFJPUEVSVFlfSU5URUdFUl9LSU5ELCBhUmVnZXhJRCk7CisJaWYoIHRoZUF0dHJpYnV0ZSAhPSBXT2JqZWN0OjpfTlVMTF8gKQorCXsKKwkJYXZtX2ludGVnZXJfdCB2YWx1ZSA9IHRoZUF0dHJpYnV0ZS0+Z2V0SW50ZWdlclZhbHVlKCk7CisKKwkJcmV0dXJuKCAodmFsdWUgPiAwKSA/IHZhbHVlIDogdGhlTmVnYXRpdmVWYWx1ZSApOworCX0KKwllbHNlCisJeworCQlyZXR1cm4oICh0aGVEZWZhdWx0VmFsdWUgPiAwKSA/IHRoZURlZmF1bHRWYWx1ZSA6IHRoZU5lZ2F0aXZlVmFsdWUgKTsKKwl9Cit9CisKKworYXZtX3NpemVfdCBRdWVyeTo6Z2V0V1Byb3BlcnR5U2l6ZVQoCisJCWNvbnN0IFdPYmplY3QgKiB3Zk9iamVjdCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhbklELAorCQlhdm1fc2l6ZV90IHRoZURlZmF1bHRWYWx1ZSwgYXZtX3NpemVfdCB0aGVOZWdhdGl2ZVZhbHVlKQoreworCVdPYmplY3QgKiB0aGVBdHRyaWJ1dGUgPSBRdWVyeTo6Z2V0V1Byb3BlcnR5KHdmT2JqZWN0LAorCQkJV09iamVjdDo6V09CSkVDVF9QUk9QRVJUWV9JTlRFR0VSX0tJTkQsIGFuSUQpOworCWlmKCB0aGVBdHRyaWJ1dGUgIT0gV09iamVjdDo6X05VTExfICkKKwl7CisJCWF2bV9pbnRlZ2VyX3QgdmFsdWUgPSB0aGVBdHRyaWJ1dGUtPmdldEludGVnZXJWYWx1ZSgpOworCisJCXJldHVybiggKHZhbHVlID49IDApID8gdmFsdWUgOiB0aGVOZWdhdGl2ZVZhbHVlICk7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiggKHRoZURlZmF1bHRWYWx1ZSA+PSAwKSA/IHRoZURlZmF1bHRWYWx1ZSA6IHRoZU5lZ2F0aXZlVmFsdWUgKTsKKwl9Cit9CisKK2F2bV9zaXplX3QgUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5U2l6ZVQoCisJCWNvbnN0IFdPYmplY3QgKiB3Zk9iamVjdCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhUmVnZXhJRCwKKwkJYXZtX3NpemVfdCB0aGVEZWZhdWx0VmFsdWUsIGF2bV9zaXplX3QgdGhlTmVnYXRpdmVWYWx1ZSkKK3sKKwlXT2JqZWN0ICogdGhlQXR0cmlidXRlID0gUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5KHdmT2JqZWN0LAorCQkJV09iamVjdDo6V09CSkVDVF9QUk9QRVJUWV9JTlRFR0VSX0tJTkQsIGFSZWdleElEKTsKKwlpZiggdGhlQXR0cmlidXRlICE9IFdPYmplY3Q6Ol9OVUxMXyApCisJeworCQlhdm1faW50ZWdlcl90IHZhbHVlID0gdGhlQXR0cmlidXRlLT5nZXRJbnRlZ2VyVmFsdWUoKTsKKworCQlyZXR1cm4oICh2YWx1ZSA+PSAwKSA/IHZhbHVlIDogdGhlTmVnYXRpdmVWYWx1ZSApOworCX0KKwllbHNlCisJeworCQlyZXR1cm4oICh0aGVEZWZhdWx0VmFsdWUgPj0gMCkgPyB0aGVEZWZhdWx0VmFsdWUgOiB0aGVOZWdhdGl2ZVZhbHVlICk7CisJfQorfQorCisKK2F2bV9pbnRlZ2VyX3QgUXVlcnk6OmdldFdQcm9wZXJ0eUludGVnZXIoY29uc3QgV09iamVjdCAqIHdmT2JqZWN0LAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFuSUQsIGF2bV9pbnRlZ2VyX3QgdGhlRGVmYXVsdFZhbHVlKQoreworCVdPYmplY3QgKiB0aGVBdHRyaWJ1dGUgPSBRdWVyeTo6Z2V0V1Byb3BlcnR5KHdmT2JqZWN0LAorCQkJV09iamVjdDo6V09CSkVDVF9QUk9QRVJUWV9JTlRFR0VSX0tJTkQsIGFuSUQpOworCWlmKCB0aGVBdHRyaWJ1dGUgIT0gV09iamVjdDo6X05VTExfICkKKwl7CisJCXJldHVybiggdGhlQXR0cmlidXRlLT5nZXRJbnRlZ2VyVmFsdWUoKSApOworCX0KKwllbHNlCisJeworCQlyZXR1cm4oIHRoZURlZmF1bHRWYWx1ZSApOworCX0KK30KKworCitpbnQgUXVlcnk6OmdldFdQcm9wZXJ0eUludChjb25zdCBXT2JqZWN0ICogd2ZPYmplY3QsCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYW5JRCwgaW50IHRoZURlZmF1bHRWYWx1ZSkKK3sKKwlXT2JqZWN0ICogdGhlQXR0cmlidXRlID0gUXVlcnk6OmdldFdQcm9wZXJ0eSh3Zk9iamVjdCwKKwkJCVdPYmplY3Q6OldPQkpFQ1RfUFJPUEVSVFlfSU5URUdFUl9LSU5ELCBhbklEKTsKKwlpZiggdGhlQXR0cmlidXRlICE9IFdPYmplY3Q6Ol9OVUxMXyApCisJeworCQlyZXR1cm4oIHRoZUF0dHJpYnV0ZS0+Z2V0SW50MzJWYWx1ZSgpICk7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiggdGhlRGVmYXVsdFZhbHVlICk7CisJfQorfQorCitpbnQgUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5SW50KGNvbnN0IFdPYmplY3QgKiB3Zk9iamVjdCwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUmVnZXhJRCwgaW50IHRoZURlZmF1bHRWYWx1ZSkKK3sKKwlXT2JqZWN0ICogdGhlQXR0cmlidXRlID0gUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5KHdmT2JqZWN0LAorCQkJCQlXT2JqZWN0OjpXT0JKRUNUX1BST1BFUlRZX0lOVEVHRVJfS0lORCwgYVJlZ2V4SUQpOworCWlmKCB0aGVBdHRyaWJ1dGUgIT0gV09iamVjdDo6X05VTExfICkKKwl7CisJCXJldHVybiggdGhlQXR0cmlidXRlLT5nZXRJbnQzMlZhbHVlKCkgKTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuKCB0aGVEZWZhdWx0VmFsdWUgKTsKKwl9Cit9CisKKworbG9uZyBRdWVyeTo6Z2V0V1Byb3BlcnR5TG9uZyhjb25zdCBXT2JqZWN0ICogd2ZPYmplY3QsCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYW5JRCwgbG9uZyB0aGVEZWZhdWx0VmFsdWUpCit7CisJV09iamVjdCAqIHRoZUF0dHJpYnV0ZSA9IFF1ZXJ5OjpnZXRXUHJvcGVydHkod2ZPYmplY3QsCisJCQlXT2JqZWN0OjpXT0JKRUNUX1BST1BFUlRZX0lOVEVHRVJfS0lORCwgYW5JRCk7CisJaWYoIHRoZUF0dHJpYnV0ZSAhPSBXT2JqZWN0OjpfTlVMTF8gKQorCXsKKwkJcmV0dXJuKCB0aGVBdHRyaWJ1dGUtPmdldEludDY0VmFsdWUoKSApOworCX0KKwllbHNlCisJeworCQlyZXR1cm4oIHRoZURlZmF1bHRWYWx1ZSApOworCX0KK30KKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvd29ya2Zsb3cvUXVlcnkuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC93b3JrZmxvdy9RdWVyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYzAwMTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvd29ya2Zsb3cvUXVlcnkuaApAQCAtMCwwICsxLDYwNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBGQUNUT1JZX0hfCisjZGVmaW5lIEZBQ1RPUllfSF8KKworCisjaW5jbHVkZSA8Y29sbGVjdGlvbi9Db2xsZWN0aW9uLmg+CisjaW5jbHVkZSA8Y29sbGVjdGlvbi9MaXN0Lmg+CisKKyNpbmNsdWRlIDxjb21tb24vQkYuaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0F2bUNvZGUuaD4KKworI2luY2x1ZGUgPGZtbC9idWlsdGluL0Jvb2xlYW4uaD4KKyNpbmNsdWRlIDxmbWwvYnVpbHRpbi9DaGFyYWN0ZXIuaD4KKyNpbmNsdWRlIDxmbWwvYnVpbHRpbi9JZGVudGlmaWVyLmg+CisjaW5jbHVkZSA8Zm1sL2J1aWx0aW4vU3RyaW5nLmg+CisKKyNpbmNsdWRlIDxmbWwvb3BlcmF0b3IvT3BlcmF0b3IuaD4KKworI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9XT2JqZWN0Lmg+CisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCituYW1lc3BhY2Ugc2VwCit7CisKKworI2RlZmluZSBXSURfU0VQQVJBVE9SICAgICAgICAgICAgICAiW15hLXpBLVpcXHNdPyIKKworI2RlZmluZSBDT05TX1dJRDIodzEsIHcyKSAgICAgICAgICB3MSAgV0lEX1NFUEFSQVRPUiAgdzIKKworI2RlZmluZSBDT05TX1dJRDModzEsIHcyLCB3MykgICAgICB3MSAgV0lEX1NFUEFSQVRPUiAgdzIgIFdJRF9TRVBBUkFUT1IgIHczCisKKyNkZWZpbmUgQ09OU19XSUQ0KHcxLCB3MiwgdzMsIHc0KSAgXAorCQkJCXcxICBXSURfU0VQQVJBVE9SICB3MiAgV0lEX1NFUEFSQVRPUiAgdzMgIFdJRF9TRVBBUkFUT1IgIHc0CisKKworI2RlZmluZSBQUkVGSVhfV0lEKHcxLCB3MikgICAgICAgICAgIigiIHcxICBXSURfU0VQQVJBVE9SICIpPygiIHcyICIpIgorCisjZGVmaW5lIFNVRkZJWF9XSUQodzEsIHcyKSAgICAgICAgICAiKCIgdzEgIikoIiBXSURfU0VQQVJBVE9SICB3MiAiKT8iCisKKworI2RlZmluZSBPUF9PUiAJCQkJCSAifCIKKworI2RlZmluZSBPUl9XSUQyKHcxLCB3MikgICAgICAgICAgdzEgIE9QX09SICB3MgorCisjZGVmaW5lIE9SX1dJRDModzEsIHcyLCB3MykgICAgICB3MSAgT1BfT1IgIHcyICBPUF9PUiAgdzMKKworI2RlZmluZSBPUl9XSUQ0KHcxLCB3MiwgdzMsIHc0KSAgdzEgIE9QX09SICB3MiAgT1BfT1IgIHczICBPUF9PUiAgdzQKKworCisKKworY2xhc3MgSVByb2Nlc3NvclVuaXRSZWdpc3RyYXRpb247CisKKworY2xhc3MgUXVlcnkKK3sKKworcHVibGljOgorCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIEVSUk9SIC8gV0FSTklORyAgUkVQT1JUSU5HCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJaW5saW5lIHN0YXRpYyB2b2lkIHJlcG9ydEVycm9yQXR0cmlidXRlKGNvbnN0IFdPYmplY3QgKiB3Zk9iamVjdCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYW5JRCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBtc2cpCisJeworCQlXT2JqZWN0ICogd2ZQcm9wZXJ0eSA9IFF1ZXJ5OjpnZXRXUHJvcGVydHkod2ZPYmplY3QsIGFuSUQpOworCisJCWlmKCB3ZlByb3BlcnR5ICE9IFdPYmplY3Q6Ol9OVUxMXyApCisJCXsKKwkJCXdmUHJvcGVydHktPmVycm9yTG9jYXRpb24oQVZNX09TX1dBUk4pIDw8IG1zZyA8PCBzdGQ6OmVuZGw7CisJCX0KKwkJZWxzZQorCQl7CisJCQl3Zk9iamVjdC0+ZXJyb3JMb2NhdGlvbihBVk1fT1NfV0FSTikKKwkJCQkJPDwgIlVuZm91bmQgPCIgPDwgYW5JRCA8PCAiPiBwcm9wZXJ0eSA6ICIgPDwgbXNnCisJCQkJCTw8ICIgdy5yLnQuIHdmb2JqZWN0PCAiIDw8IHdmT2JqZWN0LT5zdHJVbmlxSWQoKSA8PCAiID4gISIKKwkJCQkJPDwgc3RkOjplbmRsOworCQl9CisJfQorCisKKwkvKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBGSU5EIFdPQkpFQ1QgIEJZIE5hbWVJRAorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKi8KKwlzdGF0aWMgV09iamVjdCAqIGdldFdPYmplY3RCeU5hbWVJRCgKKwkJCWNvbnN0IFdPYmplY3QgKiB3Zk9iamVjdCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELAorCQkJV09iamVjdCAqIHRoZURlZmF1bHRWYWx1ZSA9IFdPYmplY3Q6Ol9OVUxMXyk7CisKKwlzdGF0aWMgV09iamVjdCAqIGdldFJlZ2V4V09iamVjdEJ5TmFtZUlEKAorCQkJY29uc3QgV09iamVjdCAqIHdmT2JqZWN0LCBjb25zdCBzdGQ6OnN0cmluZyAmIGFSZWdleE5hbWVJRCwKKwkJCVdPYmplY3QgKiB0aGVEZWZhdWx0VmFsdWUgPSBXT2JqZWN0OjpfTlVMTF8pOworCisKKwlzdGF0aWMgV09iamVjdCAqIGdldFdUeXBlZE9iamVjdEJ5RlFOYW1lSUQoCisJCQljb25zdCBXT2JqZWN0ICogd2ZPYmplY3QsIGNvbnN0IHN0ZDo6c3RyaW5nICYgZnFuSUQpOworCisKKwkvKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBGSU5EIElOIENPTVBPU0lURSBGT1JNICBCWSBUWVBFCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCisJc3RhdGljIFdPYmplY3QgKiBnZXRSZWdpc3RlcldPYmplY3QoY29uc3QgV09iamVjdCAqIHdmT2JqZWN0LAorCQkJY29uc3QgSVByb2Nlc3NvclVuaXRSZWdpc3RyYXRpb24gJiBhUmVnaXN0ZXJUb29sKTsKKworCXN0YXRpYyB2b2lkIGdldFdPYmplY3RCeVR5cGVOYW1lSUQoY29uc3QgV09iamVjdCAqIHdmT2JqZWN0LAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhVHlwZUlELCBMaXN0PCBXT2JqZWN0ICogPiAmIGFDb250YWluZXIpOworCisKKwkvKioKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogR0VUVEVSIGZvciBXU2VxdWVuY2UKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJc3RhdGljIFdPYmplY3QgKiBnZXRXU2VxdWVuY2UoCisJCQljb25zdCBXT2JqZWN0ICogd2ZPYmplY3QsIGNvbnN0IHN0ZDo6c3RyaW5nICYgc2VjdGlvbklELAorCQkJV09iamVjdCAqIHRoZURlZmF1bHRWYWx1ZSA9IFdPYmplY3Q6Ol9OVUxMXyk7CisKKwlzdGF0aWMgV09iamVjdCAqIGdldFJlZ2V4V1NlcXVlbmNlKAorCQkJY29uc3QgV09iamVjdCAqIHdmT2JqZWN0LCBjb25zdCBzdGQ6OnN0cmluZyAmIGFSZWdleFNlY3Rpb25JRCwKKwkJCVdPYmplY3QgKiB0aGVEZWZhdWx0VmFsdWUgPSBXT2JqZWN0OjpfTlVMTF8pOworCisKKwlpbmxpbmUgc3RhdGljIGJvb2wgaGFzV1NlcXVlbmNlKAorCQkJY29uc3QgV09iamVjdCAqIHdmT2JqZWN0LCBjb25zdCBzdGQ6OnN0cmluZyAmIHNlY3Rpb25JRCkKKwl7CisJCXJldHVybiggKHdmT2JqZWN0ICE9IFdPYmplY3Q6Ol9OVUxMXykKKwkJCQkmJiAoZ2V0V1NlcXVlbmNlKHdmT2JqZWN0LCBzZWN0aW9uSUQpICE9IFdPYmplY3Q6Ol9OVUxMXykgKTsKKwl9CisKKworCS8vIEZvciBjb21wYXRpYmlsaXR5IHdoZW4gSUQgaGFzIGNoYW5nZWQgISEhCisJc3RhdGljIFdPYmplY3QgKiBnZXRXU2VxdWVuY2VPckVsc2UoY29uc3QgV09iamVjdCAqIHdmT2JqZWN0LAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBzZWN0aW9uSUQsIGNvbnN0IHN0ZDo6c3RyaW5nICYgZWxzZVdTZXF1ZW5jZUlELAorCQkJV09iamVjdCAqIHRoZURlZmF1bHRWYWx1ZSA9IFdPYmplY3Q6Ol9OVUxMXyk7CisKKworCS8qKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBHRVRURVIgZm9yIFdTZXF1ZW5jZSBvciBXUmVmZXJlbmNlCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCXN0YXRpYyBXT2JqZWN0ICogZ2V0V1NlcXVlbmNlT3JSZWZlcmVuY2UoCisJCQljb25zdCBXT2JqZWN0ICogd2ZPYmplY3QsIGNvbnN0IHN0ZDo6c3RyaW5nICYgc2VjdGlvbklELAorCQkJV09iamVjdCAqIHRoZURlZmF1bHRWYWx1ZSA9IFdPYmplY3Q6Ol9OVUxMXyk7CisKKwlzdGF0aWMgV09iamVjdCAqIGdldFJlZ2V4V1NlcXVlbmNlT3JSZWZlcmVuY2UoCisJCQljb25zdCBXT2JqZWN0ICogd2ZPYmplY3QsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYVJlZ2V4U2VjdGlvbklELAorCQkJV09iamVjdCAqIHRoZURlZmF1bHRWYWx1ZSA9IFdPYmplY3Q6Ol9OVUxMXyk7CisKKworCS8qKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBHRVRURVIgZm9yIEZPUk0gaW4gYSBDb250YWluZXIKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJc3RhdGljIHZvaWQgZ2V0TGlzdFdPYmplY3QoCisJCQljb25zdCBXT2JqZWN0ICogd2ZPYmplY3QsIExpc3Q8IFdPYmplY3QgKiA+ICYgYUNvbnRhaW5lcik7CisKKwlzdGF0aWMgdm9pZCBnZXRSZWdleFdPYmplY3RJblNlcXVlbmNlKAorCQkJY29uc3QgV09iamVjdCAqIHdmT2JqZWN0LCBjb25zdCBzdGQ6OnN0cmluZyAmIGFSZWdleFNlY3Rpb25JRCwKKwkJCUxpc3Q8IFdPYmplY3QgKiA+ICYgYUNvbnRhaW5lcik7CisKKworCS8qKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBHRVRURVIgZm9yIEZPUk0gQVRUUklCVVRFIG9mIGEgZ2l2ZW4gTkFNRQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKi8KKworCXN0YXRpYyBXT2JqZWN0ICogZ2V0V1Byb3BlcnR5KAorCQkJY29uc3QgV09iamVjdCAqIHdmT2JqZWN0LCBjb25zdCBzdGQ6OnN0cmluZyAmIGFuSUQsCisJCQlXT2JqZWN0ICogdGhlRGVmYXVsdFZhbHVlID0gV09iamVjdDo6X05VTExfKTsKKworCXN0YXRpYyBXT2JqZWN0ICogZ2V0UmVnZXhXUHJvcGVydHkoCisJCQljb25zdCBXT2JqZWN0ICogd2ZPYmplY3QsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYW5JRCwKKwkJCVdPYmplY3QgKiB0aGVEZWZhdWx0VmFsdWUgPSBXT2JqZWN0OjpfTlVMTF8pOworCisJc3RhdGljIFdPYmplY3QgKiBnZXRXUHJvcGVydHlPckVsc2UoY29uc3QgV09iamVjdCAqIHdmT2JqZWN0LAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhbklELCBjb25zdCBzdGQ6OnN0cmluZyAmIGVsc2VJRCwKKwkJCVdPYmplY3QgKiB0aGVEZWZhdWx0VmFsdWUgPSBXT2JqZWN0OjpfTlVMTF8pOworCisKKwlpbmxpbmUgc3RhdGljIGJvb2wgaGFzV1Byb3BlcnR5KAorCQkJY29uc3QgV09iamVjdCAqIHdmT2JqZWN0LCBjb25zdCBzdGQ6OnN0cmluZyAmIGFuSUQpCisJeworCQlyZXR1cm4oICh3Zk9iamVjdCAhPSBXT2JqZWN0OjpfTlVMTF8pCisJCQkJJiYgKGdldFdQcm9wZXJ0eSh3Zk9iamVjdCwgYW5JRCkgIT0gV09iamVjdDo6X05VTExfKSApOworCX0KKworCWlubGluZSBzdGF0aWMgYm9vbCBoYXNSZWdleFdQcm9wZXJ0eSgKKwkJCWNvbnN0IFdPYmplY3QgKiB3Zk9iamVjdCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhbklEKQorCXsKKwkJcmV0dXJuKCAod2ZPYmplY3QgIT0gV09iamVjdDo6X05VTExfKQorCQkJCSYmIChnZXRSZWdleFdQcm9wZXJ0eSh3Zk9iamVjdCwgYW5JRCkgIT0gV09iamVjdDo6X05VTExfKSApOworCX0KKworCisJLyoqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIEdFVFRFUiBmb3IgRk9STSBBVFRSSUJVVEUgb2YgYSBnaXZlbiBOQU1FICYmIGEgZ2l2ZW4gS0lORAorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKi8KKworCXN0YXRpYyBXT2JqZWN0ICogZ2V0V1Byb3BlcnR5KGNvbnN0IFdPYmplY3QgKiB3Zk9iamVjdCwKKwkJCVdPYmplY3Q6OkVOVU1fV09CSkVDVF9LSU5EIGFLaW5kLCBjb25zdCBzdGQ6OnN0cmluZyAmIGFuSUQsCisJCQlXT2JqZWN0ICogdGhlRGVmYXVsdFZhbHVlID0gV09iamVjdDo6X05VTExfKTsKKworCXN0YXRpYyBXT2JqZWN0ICogZ2V0V1Byb3BlcnR5KAorCQkJY29uc3QgV09iamVjdCAqIHdmT2JqZWN0LCBXT2JqZWN0OjpFTlVNX1dPQkpFQ1RfS0lORCBhS2luZCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYW5JRCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBlbHNlSUQsCisJCQlXT2JqZWN0ICogdGhlRGVmYXVsdFZhbHVlID0gV09iamVjdDo6X05VTExfKTsKKworCXN0YXRpYyBXT2JqZWN0ICogZ2V0V1Byb3BlcnR5T3JFbHNlKAorCQkJY29uc3QgV09iamVjdCAqIHdmT2JqZWN0LCBXT2JqZWN0OjpFTlVNX1dPQkpFQ1RfS0lORCBhS2luZCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYW5JRCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBlbHNlSUQsCisJCQlXT2JqZWN0ICogdGhlRGVmYXVsdFZhbHVlID0gV09iamVjdDo6X05VTExfKTsKKworCXN0YXRpYyBXT2JqZWN0ICogZ2V0UmVnZXhXUHJvcGVydHkoY29uc3QgV09iamVjdCAqIHdmT2JqZWN0LAorCQkJV09iamVjdDo6RU5VTV9XT0JKRUNUX0tJTkQgYUtpbmQsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYVJlZ2V4LAorCQkJV09iamVjdCAqIHRoZURlZmF1bHRWYWx1ZSA9IFdPYmplY3Q6Ol9OVUxMXyk7CisKKworCXRlbXBsYXRlPCBjbGFzcyBUICwgY2xhc3MgVSA+CisJc3RhdGljIFUgZ2V0QnVpbHRpbldQcm9wZXJ0eShjb25zdCBXT2JqZWN0ICogd2ZPYmplY3QsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFuSUQsIGNvbnN0IFUgdGhlRGVmYXVsdFZhbHVlKQorCXsKKwkJaWYoIHdmT2JqZWN0ICE9IFdPYmplY3Q6Ol9OVUxMXyApCisJCXsKKwkJCVdPYmplY3Q6OmNvbnN0X2l0ZXJhdG9yIGl0V2ZPID0gd2ZPYmplY3QtPm93bmVkX2JlZ2luKCk7CisJCQlXT2JqZWN0Ojpjb25zdF9pdGVyYXRvciBlbmRXZk8gPSB3Zk9iamVjdC0+b3duZWRfZW5kKCk7CisJCQlmb3IoIDsgaXRXZk8gIT0gZW5kV2ZPIDsgKytpdFdmTyApCisJCQl7CisJCQkJaWYoICgqaXRXZk8pLT5pc1dQcm9wZXJ0eSgpICkKKwkJCQl7CisJCQkJCWlmKCAoKml0V2ZPKS0+Z2V0VmFsdWUoKS5pczwgVCA+KCkKKwkJCQkJCSYmICgoKml0V2ZPKS0+Z2V0TmFtZUlEKCkgPT0gYW5JRCkgKQorCQkJCQl7CisJCQkJCQlyZXR1cm4oICgqaXRXZk8pLT5nZXRWYWx1ZSgpLnRvX3B0cjwgVCA+KCktPmdldFZhbHVlKCkgKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiggdGhlRGVmYXVsdFZhbHVlICk7CisJfQorCisKKwl0ZW1wbGF0ZTwgY2xhc3MgVCAsIGNsYXNzIFUgPgorCXN0YXRpYyBVIGdldEJ1aWx0aW5XUHJvcGVydHlPckVsc2UoY29uc3QgV09iamVjdCAqIHdmT2JqZWN0LAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhbklELCBjb25zdCBzdGQ6OnN0cmluZyAmIGVsc2VJRCwKKwkJCWNvbnN0IFUgdGhlRGVmYXVsdFZhbHVlKQorCXsKKwkJaWYoIHdmT2JqZWN0ICE9IFdPYmplY3Q6Ol9OVUxMXyApCisJCXsKKwkJCVQgKiBlbHNlQXR0cmlidXRlID0gTlVMTDsKKwkJCVdPYmplY3Q6OmNvbnN0X2l0ZXJhdG9yIGl0V2ZPID0gd2ZPYmplY3QtPm93bmVkX2JlZ2luKCk7CisJCQlXT2JqZWN0Ojpjb25zdF9pdGVyYXRvciBlbmRXZk8gPSB3Zk9iamVjdC0+b3duZWRfZW5kKCk7CisJCQlmb3IoIDsgaXRXZk8gIT0gZW5kV2ZPIDsgKytpdFdmTyApCisJCQl7CisJCQkJaWYoICgqaXRXZk8pLT5pc1dQcm9wZXJ0eSgpICkKKwkJCQl7CisJCQkJCWlmKCAoKml0V2ZPKS0+Z2V0VmFsdWUoKS5pczwgVCA+KCkKKwkJCQkJCSYmICgoKml0V2ZPKS0+Z2V0TmFtZUlEKCkgPT0gYW5JRCkgKQorCQkJCQl7CisJCQkJCQlyZXR1cm4oICgqaXRXZk8pLT5nZXRWYWx1ZSgpLnRvX3B0cjwgVCA+KCktPmdldFZhbHVlKCkgKTsKKwkJCQkJfQorCQkJCQllbHNlIGlmKCAoZWxzZUF0dHJpYnV0ZSA9PSBOVUxMKQorCQkJCQkJCSYmICgqaXRXZk8pLT5nZXRWYWx1ZSgpLmlzPCBUID4oKQorCQkJCQkJCSYmICgoKml0V2ZPKS0+Z2V0TmFtZUlEKCkgPT0gZWxzZUlEKSApCisJCQkJCXsKKwkJCQkJCWVsc2VBdHRyaWJ1dGUgPSAoKml0V2ZPKS0+Z2V0VmFsdWUoKS50b19wdHI8IFQgPigpOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4oIChlbHNlQXR0cmlidXRlICE9IE5VTEwpID8KKwkJCQkJZWxzZUF0dHJpYnV0ZS0+Z2V0VmFsdWUoKSA6IHRoZURlZmF1bHRWYWx1ZSApOworCQl9CisKKwkJcmV0dXJuKCB0aGVEZWZhdWx0VmFsdWUgKTsKKwl9CisKKworCXRlbXBsYXRlPCBjbGFzcyBUICwgY2xhc3MgVSA+CisJc3RhdGljIFUgZ2V0UmVnZXhCdWlsdGluV1Byb3BlcnR5KGNvbnN0IFdPYmplY3QgKiB3Zk9iamVjdCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVJlZ2V4LCBjb25zdCBVIHRoZURlZmF1bHRWYWx1ZSkKKwl7CisJCWlmKCB3Zk9iamVjdCAhPSBXT2JqZWN0OjpfTlVMTF8gKQorCQl7CisJCQlXT2JqZWN0Ojpjb25zdF9pdGVyYXRvciBpdFdmTyA9IHdmT2JqZWN0LT5vd25lZF9iZWdpbigpOworCQkJV09iamVjdDo6Y29uc3RfaXRlcmF0b3IgZW5kV2ZPID0gd2ZPYmplY3QtPm93bmVkX2VuZCgpOworCQkJZm9yKCA7IGl0V2ZPICE9IGVuZFdmTyA7ICsraXRXZk8gKQorCQkJeworCQkJCWlmKCAoKml0V2ZPKS0+aXNXUHJvcGVydHkoKSApCisJCQkJeworCQkJCQlpZiggKCppdFdmTyktPmdldFZhbHVlKCkuaXM8IFQgPigpCisJCQkJCQkmJiBSRUdFWF9NQVRDSCgoKml0V2ZPKS0+Z2V0TmFtZUlEKCksIGFSZWdleCkgKQorCQkJCQl7CisJCQkJCQlyZXR1cm4oICgqaXRXZk8pLT5nZXRWYWx1ZSgpLnRvX3B0cjwgVCA+KCktPmdldFZhbHVlKCkgKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiggdGhlRGVmYXVsdFZhbHVlICk7CisJfQorCisJc3RhdGljIHZvaWQgZ2V0V1Byb3BlcnR5KAorCQkJY29uc3QgV09iamVjdCAqIHdmT2JqZWN0LCBXT2JqZWN0OjpFTlVNX1dPQkpFQ1RfS0lORCBhS2luZCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYW5JRCwgQ29sbGVjdGlvbjwgQkYgPiAmIGFDb250YWluZXIpOworCisJc3RhdGljIHZvaWQgZ2V0UmVnZXhXUHJvcGVydHkoCisJCQljb25zdCBXT2JqZWN0ICogd2ZPYmplY3QsIFdPYmplY3Q6OkVOVU1fV09CSkVDVF9LSU5EIGFLaW5kLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUmVnZXgsIENvbGxlY3Rpb248IEJGID4gJiBhQ29udGFpbmVyKTsKKworCisJdGVtcGxhdGU8IGNsYXNzIFQgLCBjbGFzcyBVID4KKwlzdGF0aWMgdm9pZCBnZXRCdWlsdGluV1Byb3BlcnR5KAorCQkJY29uc3QgV09iamVjdCAqIHdmT2JqZWN0LCBjb25zdCBzdGQ6OnN0cmluZyAmIGFuSUQsCisJCQlDb2xsZWN0aW9uPCBVID4gJiBhQ29udGFpbmVyKQorCXsKKwkJaWYoIHdmT2JqZWN0ICE9IFdPYmplY3Q6Ol9OVUxMXyApCisJCXsKKwkJCVdPYmplY3Q6OmNvbnN0X2l0ZXJhdG9yIGl0V2ZPID0gd2ZPYmplY3QtPm93bmVkX2JlZ2luKCk7CisJCQlXT2JqZWN0Ojpjb25zdF9pdGVyYXRvciBlbmRXZk8gPSB3Zk9iamVjdC0+b3duZWRfZW5kKCk7CisJCQlmb3IoIDsgaXRXZk8gIT0gZW5kV2ZPIDsgKytpdFdmTyApCisJCQl7CisJCQkJaWYoICgqaXRXZk8pLT5pc1dQcm9wZXJ0eSgpICkKKwkJCQl7CisJCQkJCWlmKCAoKml0V2ZPKS0+Z2V0VmFsdWUoKS5pczwgVCA+KCkKKwkJCQkJCSYmICgoKml0V2ZPKS0+Z2V0TmFtZUlEKCkgPT0gYW5JRCkgKQorCQkJCQl7CisJCQkJCQlhQ29udGFpbmVyLnB1c2hfYmFjaygKKwkJCQkJCQkJKCppdFdmTyktPmdldFZhbHVlKCkudG9fcHRyPCBUID4oKS0+Z2V0VmFsdWUoKSApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisKKwl0ZW1wbGF0ZTwgY2xhc3MgVCAsIGNsYXNzIFUgPgorCXN0YXRpYyB2b2lkIGdldEJ1aWx0aW5XUHJvcGVydHkoY29uc3QgV09iamVjdCAqIHdmT2JqZWN0LAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhbklELCBjb25zdCBzdGQ6OnN0cmluZyAmIGVsc2VJRCwKKwkJCUNvbGxlY3Rpb248IFUgPiAmIGFDb250YWluZXIpCisJeworCQlpZiggd2ZPYmplY3QgIT0gV09iamVjdDo6X05VTExfICkKKwkJeworCQkJV09iamVjdDo6Y29uc3RfaXRlcmF0b3IgaXRXZk8gPSB3Zk9iamVjdC0+b3duZWRfYmVnaW4oKTsKKwkJCVdPYmplY3Q6OmNvbnN0X2l0ZXJhdG9yIGVuZFdmTyA9IHdmT2JqZWN0LT5vd25lZF9lbmQoKTsKKwkJCWZvciggOyBpdFdmTyAhPSBlbmRXZk8gOyArK2l0V2ZPICkKKwkJCXsKKwkJCQlpZiggKCppdFdmTyktPmlzV1Byb3BlcnR5KCkgKQorCQkJCXsKKwkJCQkJaWYoICgqaXRXZk8pLT5nZXRWYWx1ZSgpLmlzPCBUID4oKQorCQkJCQkJJiYgKCgoKml0V2ZPKS0+Z2V0TmFtZUlEKCkgPT0gYW5JRCkKKwkJCQkJCQl8fCAoKCppdFdmTyktPmdldE5hbWVJRCgpID09IGVsc2VJRCkpICkKKwkJCQkJeworCQkJCQkJYUNvbnRhaW5lci5wdXNoX2JhY2soCisJCQkJCQkJKCppdFdmTyktPmdldFZhbHVlKCkudG9fcHRyPCBUID4oKS0+Z2V0VmFsdWUoKSApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisKKwl0ZW1wbGF0ZTwgY2xhc3MgVCAsIGNsYXNzIFUgPgorCXN0YXRpYyB2b2lkIGdldFJlZ2V4QnVpbHRpbldQcm9wZXJ0eShjb25zdCBXT2JqZWN0ICogd2ZPYmplY3QsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFSZWdleCwgQ29sbGVjdGlvbjwgVSA+ICYgYUNvbnRhaW5lcikKKwl7CisJCWlmKCB3Zk9iamVjdCAhPSBXT2JqZWN0OjpfTlVMTF8gKQorCQl7CisJCQlXT2JqZWN0Ojpjb25zdF9pdGVyYXRvciBpdFdmTyA9IHdmT2JqZWN0LT5vd25lZF9iZWdpbigpOworCQkJV09iamVjdDo6Y29uc3RfaXRlcmF0b3IgZW5kV2ZPID0gd2ZPYmplY3QtPm93bmVkX2VuZCgpOworCQkJZm9yKCA7IGl0V2ZPICE9IGVuZFdmTyA7ICsraXRXZk8gKQorCQkJeworCQkJCWlmKCAoKml0V2ZPKS0+aXNXUHJvcGVydHkoKSApCisJCQkJeworCQkJCQlpZiggKCppdFdmTyktPmdldFZhbHVlKCkuaXM8IFQgPigpCisJCQkJCQkmJiBSRUdFWF9NQVRDSCgoKml0V2ZPKS0+Z2V0TmFtZUlEKCksIGFSZWdleCkgKQorCQkJCQl7CisJCQkJCQlhQ29udGFpbmVyLnB1c2hfYmFjaygKKwkJCQkJCQkJKCppdFdmTyktPmdldFZhbHVlKCkudG9fcHRyPCBUID4oKS0+Z2V0VmFsdWUoKSApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisKKwlzdGF0aWMgYm9vbCBoYXNXUHJvcGVydHlWYWx1ZShjb25zdCBXT2JqZWN0ICogd2ZPYmplY3QsCisJCQlXT2JqZWN0OjpFTlVNX1dPQkpFQ1RfS0lORCBhS2luZCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhbklEKQorCXsKKwkJcmV0dXJuKCAod2ZPYmplY3QgIT0gV09iamVjdDo6X05VTExfKSAmJgorCQkJCShnZXRXUHJvcGVydHkod2ZPYmplY3QsIGFLaW5kLCBhbklELCBXT2JqZWN0OjpfTlVMTF8pCisJCQkJIT0gV09iamVjdDo6X05VTExfKSApOworCX0KKworCXN0YXRpYyBib29sIGhhc1dQcm9wZXJ0eVZhbHVlKAorCQkJY29uc3QgV09iamVjdCAqIHdmT2JqZWN0LCBXT2JqZWN0OjpFTlVNX1dPQkpFQ1RfS0lORCBhS2luZCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYW5JRCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBlbHNlSUQpCisJeworCQlyZXR1cm4oICh3Zk9iamVjdCAhPSBXT2JqZWN0OjpfTlVMTF8pICYmCisJCQkJKGdldFdQcm9wZXJ0eSh3Zk9iamVjdCwgYUtpbmQsIGFuSUQsIGVsc2VJRCwgV09iamVjdDo6X05VTExfKQorCQkJCQkJIT0gV09iamVjdDo6X05VTExfKSApOworCX0KKworCXN0YXRpYyBib29sIGhhc1JlZ2V4V1Byb3BlcnR5VmFsdWUoY29uc3QgV09iamVjdCAqIHdmT2JqZWN0LAorCQkJV09iamVjdDo6RU5VTV9XT0JKRUNUX0tJTkQgYUtpbmQsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYVJlZ2V4KQorCXsKKwkJcmV0dXJuKCAod2ZPYmplY3QgIT0gV09iamVjdDo6X05VTExfKSAmJgorCQkJCShnZXRSZWdleFdQcm9wZXJ0eSh3Zk9iamVjdCwgYUtpbmQsIGFSZWdleCwgV09iamVjdDo6X05VTExfKQorCQkJCQkJIT0gV09iamVjdDo6X05VTExfKSApOworCX0KKworCisJLyoqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIEdFVFRFUiBnZXRXUHJvcGVydHlWYWx1ZQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKi8KKwlzdGF0aWMgY29uc3QgQkYgJiBnZXRXUHJvcGVydHlWYWx1ZSgKKwkJCWNvbnN0IFdPYmplY3QgKiB3Zk9iamVjdCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhbklELAorCQkJY29uc3QgQkYgJiB0aGVEZWZhdWx0VmFsdWUgPSBCRjo6UkVGX05VTEwpOworCisJc3RhdGljIGNvbnN0IEJGICYgZ2V0UmVnZXhXUHJvcGVydHlWYWx1ZSgKKwkJCWNvbnN0IFdPYmplY3QgKiB3Zk9iamVjdCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhUmVnZXhJRCwKKwkJCWNvbnN0IEJGICYgdGhlRGVmYXVsdFZhbHVlID0gQkY6OlJFRl9OVUxMKTsKKworCXN0YXRpYyBjb25zdCBCRiAmIGdldFdQcm9wZXJ0eVZhbHVlT3JFbHNlKGNvbnN0IFdPYmplY3QgKiB3Zk9iamVjdCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYW5JRCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBlbHNlSUQsCisJCQljb25zdCBCRiAmIHRoZURlZmF1bHRWYWx1ZSA9IEJGOjpSRUZfTlVMTCk7CisKKworCWlubGluZSBzdGF0aWMgY29uc3QgQkYgJiBnZXRXUHJvcGVydHlWYWx1ZShjb25zdCBXT2JqZWN0ICogd2ZPYmplY3QsCisJCQlXT2JqZWN0OjpFTlVNX1dPQkpFQ1RfS0lORCBhS2luZCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhbklELAorCQkJY29uc3QgQkYgJiB0aGVEZWZhdWx0VmFsdWUgPSBCRjo6UkVGX05VTEwpCisJeworCQlXT2JqZWN0ICogdGhlQXR0cmlidXRlID0gZ2V0V1Byb3BlcnR5KHdmT2JqZWN0LCBhS2luZCwgYW5JRCk7CisKKwkJcmV0dXJuKCAoIHRoZUF0dHJpYnV0ZSAhPSBXT2JqZWN0OjpfTlVMTF8gKSA/CisJCQl0aGVBdHRyaWJ1dGUtPmdldFZhbHVlKCkgOiB0aGVEZWZhdWx0VmFsdWUgKTsKKwl9CisKKworCS8qKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBHRVRURVIgIGdldFdQcm9wZXJ0eUZvcm0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJc3RhdGljIFdPYmplY3QgKiBnZXRXUHJvcGVydHlXUmVmZXJlbmNlKAorCQkJY29uc3QgV09iamVjdCAqIHdmT2JqZWN0LCBjb25zdCBzdGQ6OnN0cmluZyAmIGFuSUQsCisJCQlXT2JqZWN0ICogdGhlRGVmYXVsdFZhbHVlID0gV09iamVjdDo6X05VTExfKTsKKworCXN0YXRpYyBXT2JqZWN0ICogZ2V0V1Byb3BlcnR5V1JlZmVyZW5jZU9yRWxzZShjb25zdCBXT2JqZWN0ICogd2ZPYmplY3QsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFuSUQsIGNvbnN0IHN0ZDo6c3RyaW5nICYgZWxzZUlELAorCQkJV09iamVjdCAqIHRoZURlZmF1bHRWYWx1ZSA9IFdPYmplY3Q6Ol9OVUxMXyk7CisKKworCS8qKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBHRVRURVIgZ2V0V1Byb3BlcnR5Qm9vbGVhbgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKi8KKwlzdGF0aWMgYm9vbCBnZXRXUHJvcGVydHlCb29sZWFuKGNvbnN0IFdPYmplY3QgKiB3Zk9iamVjdCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYW5JRCwgYm9vbCB0aGVEZWZhdWx0VmFsdWUpCisJeworCQlyZXR1cm4oIGdldEJ1aWx0aW5XUHJvcGVydHk8IEJvb2xlYW4gLCBib29sID4oCisJCQkJd2ZPYmplY3QsIGFuSUQsIHRoZURlZmF1bHRWYWx1ZSkgKTsKKwl9CisKKwlzdGF0aWMgYm9vbCBnZXRSZWdleFdQcm9wZXJ0eUJvb2xlYW4oY29uc3QgV09iamVjdCAqIHdmT2JqZWN0LAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUmVnZXgsIGJvb2wgdGhlRGVmYXVsdFZhbHVlKQorCXsKKwkJcmV0dXJuKCBnZXRSZWdleEJ1aWx0aW5XUHJvcGVydHk8IEJvb2xlYW4gLCBib29sID4oCisJCQkJd2ZPYmplY3QsIGFSZWdleCwgdGhlRGVmYXVsdFZhbHVlKSApOworCX0KKworCisJLyoqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIEdFVFRFUiBnZXRXUHJvcGVydHlJbnRlZ2VyCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCXN0YXRpYyBhdm1fc2l6ZV90IGdldFdQcm9wZXJ0eVBvc1NpemVUKGNvbnN0IFdPYmplY3QgKiB3Zk9iamVjdCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYW5JRCwgYXZtX3NpemVfdCB0aGVEZWZhdWx0VmFsdWUsCisJCQlhdm1fc2l6ZV90IHRoZU5lZ2F0aXZlVmFsdWUgPSBBVk1fTlVNRVJJQ19NQVhfU0laRV9UKTsKKworCXN0YXRpYyBhdm1fc2l6ZV90IGdldFJlZ2V4V1Byb3BlcnR5UG9zU2l6ZVQoY29uc3QgV09iamVjdCAqIHdmT2JqZWN0LAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhbklELCBhdm1fc2l6ZV90IHRoZURlZmF1bHRWYWx1ZSwKKwkJCWF2bV9zaXplX3QgdGhlTmVnYXRpdmVWYWx1ZSA9IEFWTV9OVU1FUklDX01BWF9TSVpFX1QpOworCisKKwlzdGF0aWMgYXZtX3NpemVfdCBnZXRXUHJvcGVydHlTaXplVChjb25zdCBXT2JqZWN0ICogd2ZPYmplY3QsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFuSUQsIGF2bV9zaXplX3QgdGhlRGVmYXVsdFZhbHVlLAorCQkJYXZtX3NpemVfdCB0aGVOZWdhdGl2ZVZhbHVlID0gQVZNX05VTUVSSUNfTUFYX1NJWkVfVCk7CisKKwlzdGF0aWMgYXZtX3NpemVfdCBnZXRSZWdleFdQcm9wZXJ0eVNpemVUKGNvbnN0IFdPYmplY3QgKiB3Zk9iamVjdCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYW5JRCwgYXZtX3NpemVfdCB0aGVEZWZhdWx0VmFsdWUsCisJCQlhdm1fc2l6ZV90IHRoZU5lZ2F0aXZlVmFsdWUgPSBBVk1fTlVNRVJJQ19NQVhfU0laRV9UKTsKKworCisJc3RhdGljIGF2bV9pbnRlZ2VyX3QgZ2V0V1Byb3BlcnR5SW50ZWdlcihjb25zdCBXT2JqZWN0ICogd2ZPYmplY3QsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFuSUQsIGF2bV9pbnRlZ2VyX3QgdGhlRGVmYXVsdFZhbHVlKTsKKworCisJc3RhdGljIGludCBnZXRXUHJvcGVydHlJbnQoY29uc3QgV09iamVjdCAqIHdmT2JqZWN0LAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhbklELCBpbnQgdGhlRGVmYXVsdFZhbHVlKTsKKworCXN0YXRpYyBpbnQgZ2V0UmVnZXhXUHJvcGVydHlJbnQoY29uc3QgV09iamVjdCAqIHdmT2JqZWN0LAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhbklELCBpbnQgdGhlRGVmYXVsdFZhbHVlKTsKKworCisJc3RhdGljIGxvbmcgZ2V0V1Byb3BlcnR5TG9uZyhjb25zdCBXT2JqZWN0ICogd2ZPYmplY3QsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFuSUQsIGxvbmcgdGhlRGVmYXVsdFZhbHVlKTsKKworCisJLyoqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIEdFVFRFUiBnZXRXUHJvcGVydHlTdHJpbmcKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICovCisJc3RhdGljIGJvb2wgaGFzV1Byb3BlcnR5U3RyaW5nKAorCQkJY29uc3QgV09iamVjdCAqIHdmT2JqZWN0LCBjb25zdCBzdGQ6OnN0cmluZyAmIGFuSUQpCisJeworCQlyZXR1cm4oIGhhc1dQcm9wZXJ0eVZhbHVlKHdmT2JqZWN0LAorCQkJCVdPYmplY3Q6OldPQkpFQ1RfUFJPUEVSVFlfU1RSSU5HX0tJTkQsIGFuSUQpICk7CisJfQorCisJc3RhdGljIGJvb2wgaGFzV1Byb3BlcnR5U3RyaW5nKGNvbnN0IFdPYmplY3QgKiB3Zk9iamVjdCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYW5JRCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBlbHNlSUQpCisJeworCQlyZXR1cm4oIGhhc1dQcm9wZXJ0eVZhbHVlKHdmT2JqZWN0LAorCQkJCVdPYmplY3Q6OldPQkpFQ1RfUFJPUEVSVFlfU1RSSU5HX0tJTkQsIGFuSUQsIGVsc2VJRCkgKTsKKwl9CisKKwlzdGF0aWMgYm9vbCBoYXNSZWdleFdQcm9wZXJ0eVN0cmluZygKKwkJCWNvbnN0IFdPYmplY3QgKiB3Zk9iamVjdCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhUmVnZXgpCisJeworCQlyZXR1cm4oIGhhc1JlZ2V4V1Byb3BlcnR5VmFsdWUod2ZPYmplY3QsCisJCQkJV09iamVjdDo6V09CSkVDVF9QUk9QRVJUWV9TVFJJTkdfS0lORCwgYVJlZ2V4KSApOworCX0KKworCXN0YXRpYyBzdGQ6OnN0cmluZyBnZXRXUHJvcGVydHlTdHJpbmcoY29uc3QgV09iamVjdCAqIHdmT2JqZWN0LAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhbklELCBzdGQ6OnN0cmluZyB0aGVEZWZhdWx0VmFsdWUpCisJeworCQlyZXR1cm4oIGdldEJ1aWx0aW5XUHJvcGVydHk8IFN0cmluZyAsIHN0ZDo6c3RyaW5nID4oCisJCQkJd2ZPYmplY3QsIGFuSUQsIHRoZURlZmF1bHRWYWx1ZSkgKTsKKwl9CisKKwlzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0V1Byb3BlcnR5U3RyaW5nT3JFbHNlKGNvbnN0IFdPYmplY3QgKiB3Zk9iamVjdCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYW5JRCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBlbHNlSUQsCisJCQlzdGQ6OnN0cmluZyB0aGVEZWZhdWx0VmFsdWUpCisJeworCQlyZXR1cm4oIGdldEJ1aWx0aW5XUHJvcGVydHlPckVsc2U8IFN0cmluZyAsIHN0ZDo6c3RyaW5nID4oCisJCQkJd2ZPYmplY3QsIGFuSUQsIGVsc2VJRCwgdGhlRGVmYXVsdFZhbHVlKSApOworCX0KKworCXN0YXRpYyBzdGQ6OnN0cmluZyBnZXRSZWdleFdQcm9wZXJ0eVN0cmluZyhjb25zdCBXT2JqZWN0ICogd2ZPYmplY3QsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFSZWdleCwgc3RkOjpzdHJpbmcgdGhlRGVmYXVsdFZhbHVlKQorCXsKKwkJcmV0dXJuKCBnZXRSZWdleEJ1aWx0aW5XUHJvcGVydHk8IFN0cmluZyAsIHN0ZDo6c3RyaW5nID4oCisJCQkJd2ZPYmplY3QsIGFSZWdleCwgdGhlRGVmYXVsdFZhbHVlKSApOworCX0KKworCisJc3RhdGljIHZvaWQgZ2V0V1Byb3BlcnR5U3RyaW5nKGNvbnN0IFdPYmplY3QgKiB3Zk9iamVjdCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYW5JRCwgQ29sbGVjdGlvbjwgc3RkOjpzdHJpbmcgPiAmIGFDb250YWluZXIpCisJeworCQlnZXRCdWlsdGluV1Byb3BlcnR5PCBTdHJpbmcgLCBzdGQ6OnN0cmluZyA+KHdmT2JqZWN0LCBhbklELCBhQ29udGFpbmVyKTsKKwl9CisKKwlzdGF0aWMgdm9pZCBnZXRXUHJvcGVydHlTdHJpbmcoY29uc3QgV09iamVjdCAqIHdmT2JqZWN0LAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhbklELCBjb25zdCBzdGQ6OnN0cmluZyAmIGVsc2VJRCwKKwkJCUNvbGxlY3Rpb248IHN0ZDo6c3RyaW5nID4gJiBhQ29udGFpbmVyKQorCXsKKwkJZ2V0QnVpbHRpbldQcm9wZXJ0eTwgU3RyaW5nICwgc3RkOjpzdHJpbmcgPigKKwkJCQl3Zk9iamVjdCwgYW5JRCwgZWxzZUlELCBhQ29udGFpbmVyKTsKKwl9CisKK307CisKKworfQorCisjZW5kaWYgLypGQUNUT1JZX0hfKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC93b3JrZmxvdy9VbmlGb3JtSWRlbnRpZmllci5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvd29ya2Zsb3cvVW5pRm9ybUlkZW50aWZpZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMDk0Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvd29ya2Zsb3cvVW5pRm9ybUlkZW50aWZpZXIuY3BwCkBAIC0wLDAgKzEsNjM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4NCisgKg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnINCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSAiVW5pRm9ybUlkZW50aWZpZXIuaCINCisNCisjaW5jbHVkZSA8Y29tbW9uL05hbWVkRWxlbWVudC5oPg0KKw0KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29uc3RydWN0b3IuaD4NCisjaW5jbHVkZSA8Zm1sL2J1aWx0aW4vSWRlbnRpZmllci5oPg0KKw0KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9CYXNlSW5zdGFuY2VGb3JtLmg+DQorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVGb3JtLmg+DQorDQorI2luY2x1ZGUgPGZtbC9ydW50aW1lL1J1bnRpbWVJRC5oPg0KKw0KKyNpbmNsdWRlIDxmbWwvdHlwZS9CYXNlVHlwZVNwZWNpZmllci5oPg0KKw0KKw0KK25hbWVzcGFjZSBzZXANCit7DQorDQorDQorQkYgVW5pRm9ybUlkZW50aWZpZXI6OkFOT05ZTV9MT0NBVElPTiggbmV3IElkZW50aWZpZXIoIiIpICk7DQorDQorDQorc3RkOjpzdHJpbmcgVW5pRm9ybUlkZW50aWZpZXI6OlNFUEFSQVRPUl9JRCAgICAgICA9ICIuIjsNCisNCitzdGQ6OnN0cmluZyBVbmlGb3JtSWRlbnRpZmllcjo6U0VQQVJBVE9SX0xPQ0FUSU9OID0gIjoiOw0KKw0KK3N0ZDo6c3RyaW5nIFVuaUZvcm1JZGVudGlmaWVyOjpTRVBBUkFUT1JfTE9DQVRPUiAgPSBGUU5fSURfUk9PVF9TRVBBUkFUT1I7DQorDQorDQorLyoqDQorICogQlVJTEQgRlJPTSBRVUFMSUZJRUQgTkFNRSBJRA0KKyAqLw0KK3ZvaWQgVW5pRm9ybUlkZW50aWZpZXI6OmJ1aWxkKGNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkNCit7DQorCUxpc3RPZlN0cmluZyBzdHJMaXN0Ow0KKw0KKwlzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIHNlcFBvcyA9DQorCQkJYVF1YWxpZmllZE5hbWVJRC5maW5kKEZRTl9JRF9ST09UX1NFUEFSQVRPUik7DQorCWlmKCBzZXBQb3MgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQ0KKwl7DQorCQlzZXRMb2NhdG9yKGFRdWFsaWZpZWROYW1lSUQuc3Vic3RyKDAsIHNlcFBvcykpOw0KKwkJTmFtZWRFbGVtZW50Ojpjb2xsZWN0TmFtZUlEKHN0ckxpc3QsIGFRdWFsaWZpZWROYW1lSUQsIHNlcFBvcyArIDIpOw0KKwl9DQorCWVsc2UNCisJew0KKwkJTmFtZWRFbGVtZW50Ojpjb2xsZWN0TmFtZUlEKHN0ckxpc3QsIGFRdWFsaWZpZWROYW1lSUQpOw0KKwl9DQorDQorCUxpc3RPZlN0cmluZzo6aXRlcmF0b3IgZW5kSXQgPSBzdHJMaXN0LmVuZCgpOw0KKwlmb3IoIExpc3RPZlN0cmluZzo6aXRlcmF0b3IgaXQgPSBzdHJMaXN0LmJlZ2luKCkgOyBpdCAhPSBlbmRJdCA7ICsraXQgKQ0KKwl7DQorCQlhcHBlbmRGaWVsZCggKml0ICk7DQorCX0NCit9DQorDQorDQorDQorLyoqDQorKiBMT0FERVINCisqLw0KK3ZvaWQgVW5pRm9ybUlkZW50aWZpZXI6OmxvYWQoKQ0KK3sNCisJQU5PTllNX0xPQ0FUSU9OID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdJZGVudGlmaWVyKCIiKTsNCit9DQorDQorDQorLyoqDQorKiBESVNQT1NFUg0KKyovDQordm9pZCBVbmlGb3JtSWRlbnRpZmllcjo6ZGlzcG9zZSgpDQorew0KKwlBTk9OWU1fTE9DQVRJT04uZGVzdHJveSgpOw0KK30NCisNCisNCisvKioNCisgKiBHRVRURVIgLSBTRVRURVINCisgKi8NCit2b2lkIFVuaUZvcm1JZGVudGlmaWVyOjphcHBlbmRGaWVsZCgNCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCwgYXZtX3VmaV9zY2hlbWVfdCBzY2hlbWUpDQorew0KKwlMaXN0T2ZGaWVsZDo6YXBwZW5kKCBVZmlGaWVsZCgNCisJCQlFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0lkZW50aWZpZXIoYVF1YWxpZmllZE5hbWVJRCksIHNjaGVtZSkgKTsNCisJbVNjaGVtZSB8PSBzY2hlbWU7DQorDQorCXVwZGF0ZUFsbE5hbWVJRCgpOw0KK30NCisNCit2b2lkIFVuaUZvcm1JZGVudGlmaWVyOjphcHBlbmRGaWVsZChjb25zdCBCRiAmIGZpZWxkKQ0KK3sNCisJYXZtX3VmaV9zY2hlbWVfdCBzY2hlbWUgPSBVRklfU0NIRU1FX1VOREVGSU5FRDsNCisJc3dpdGNoKCBmaWVsZC5jbGFzc0tpbmQoKSApDQorCXsNCisJCWNhc2UgRk9STV9YRlNQX1ZBUklBQkxFX0tJTkQ6DQorCQl7DQorCQkJc2NoZW1lID0gVUZJX1NDSEVNRV9WQVJJQUJMRTsNCisJCQlicmVhazsNCisJCX0NCisNCisJCWNhc2UgRk9STV9YRlNQX01BQ0hJTkVfS0lORDoNCisJCWNhc2UgRk9STV9YRlNQX1NZU1RFTV9LSU5EOg0KKwkJew0KKwkJCXNjaGVtZSA9IFVGSV9TQ0hFTUVfTUFDSElORTsNCisJCQlicmVhazsNCisJCX0NCisNCisvLwkJY2FzZSBGT1JNX1hGU1BfSU5TVEFOQ0VfS0lORDoNCisvLwkJew0KKy8vCQkJc2NoZW1lID0gVUZJX1NDSEVNRV9JTlNUQU5DRTsNCisvLwkJCWJyZWFrOw0KKy8vCQl9DQorDQorCQljYXNlIEZPUk1fWEZTUF9QT1JUX0tJTkQ6DQorCQl7DQorCQkJc2NoZW1lID0gVUZJX1NDSEVNRV9QT1JUOw0KKwkJCWJyZWFrOw0KKwkJfQ0KKwkJY2FzZSBGT1JNX1hGU1BfQlVGRkVSX0tJTkQ6DQorCQl7DQorCQkJc2NoZW1lID0gVUZJX1NDSEVNRV9CVUZGRVI7DQorCQkJYnJlYWs7DQorCQl9DQorLy8JCWNhc2UgRk9STV9YRlNQX0NPTk5FQ1RPUl9LSU5EOg0KKy8vCQl7DQorLy8JCQlzY2hlbWUgPSBVRklfU0NIRU1FX0NPTk5FQ1RPUjsNCisvLwkJCWJyZWFrOw0KKy8vCQl9DQorCQlkZWZhdWx0Og0KKwkJew0KKwkJCXNjaGVtZSA9IFVGSV9TQ0hFTUVfRklFTEQ7DQorCQkJYnJlYWs7DQorCQl9DQorCX0NCisNCisJYXBwZW5kRmllbGQoIGZpZWxkICwgc2NoZW1lICk7DQorfQ0KKw0KKw0KK3ZvaWQgVW5pRm9ybUlkZW50aWZpZXI6OnNldExvY2F0b3IoY29uc3Qgc3RkOjpzdHJpbmcgJiBhTG9jYXRpb25JZCkNCit7DQorCW1Mb2NhdG9yID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdJZGVudGlmaWVyKGFMb2NhdGlvbklkKTsNCit9DQorDQorDQorLyoqDQorICogQ09NUEFSSVNPTg0KKyAqIE9QRVJBVE9SDQorICovDQoraW50IFVuaUZvcm1JZGVudGlmaWVyOjpjb21wYXJlKGNvbnN0IFVuaUZvcm1JZGVudGlmaWVyICYgb3RoZXIpIGNvbnN0DQorew0KKwlpZiggdGhpcyA9PSAmb3RoZXIgKQ0KKwl7DQorCQlyZXR1cm4oIDAgKTsNCisJfQ0KKwllbHNlDQorCXsNCisJCWludCAgY21wUmVzdWx0ID0gMDsNCisNCisJCVVuaUZvcm1JZGVudGlmaWVyOjpjb25zdF9pdGVyYXRvciBpdCA9IGJlZ2luKCk7DQorCQlVbmlGb3JtSWRlbnRpZmllcjo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSBlbmQoKTsNCisNCisJCVVuaUZvcm1JZGVudGlmaWVyOjpjb25zdF9pdGVyYXRvciBpdE90aGVyID0gb3RoZXIuYmVnaW4oKTsNCisJCVVuaUZvcm1JZGVudGlmaWVyOjpjb25zdF9pdGVyYXRvciBlbmRPdGhlciA9IG90aGVyLmVuZCgpOw0KKw0KKwkJZm9yKCA7IChpdCAhPSBlbmRJdCkgJiYgKGl0T3RoZXIgIT0gZW5kT3RoZXIpIDsgKytpdCAsICsraXRPdGhlciApDQorCQl7DQorCQkJY21wUmVzdWx0ID0gKCppdCkuY29tcGFyZSggKml0T3RoZXIgKTsNCisJCQlpZiggY21wUmVzdWx0ICE9IDAgICkNCisJCQl7DQorCQkJCXJldHVybiggY21wUmVzdWx0ICk7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJcmV0dXJuKCAoaXQgPT0gZW5kSXQpDQorCQkJCT8gKCAoaXRPdGhlciA9PSBlbmRPdGhlcikgPyAwIDogMSkNCisJCQkJOiAoIChpdCA9PSBlbmRJdCkgPyAxIDogMCApICk7DQorCX0NCit9DQorDQorYm9vbCBVbmlGb3JtSWRlbnRpZmllcjo6aXNFUShjb25zdCBVbmlGb3JtSWRlbnRpZmllciAmIG90aGVyKSBjb25zdA0KK3sNCisJVW5pRm9ybUlkZW50aWZpZXI6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYmVnaW4oKTsNCisJVW5pRm9ybUlkZW50aWZpZXI6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gZW5kKCk7DQorDQorCVVuaUZvcm1JZGVudGlmaWVyOjpjb25zdF9pdGVyYXRvciBpdE90aGVyID0gb3RoZXIuYmVnaW4oKTsNCisJVW5pRm9ybUlkZW50aWZpZXI6OmNvbnN0X2l0ZXJhdG9yIGVuZE90aGVyID0gb3RoZXIuZW5kKCk7DQorDQorCWZvciggOyAoaXQgIT0gZW5kSXQpICYmIChpdE90aGVyICE9IGVuZE90aGVyKSA7ICsraXQgLCArK2l0T3RoZXIgKQ0KKwl7DQorCQlpZiggbm90ICgqaXQpLmlzRVEoICppdE90aGVyICkgKQ0KKwkJew0KKwkJCXJldHVybiggZmFsc2UgKTsNCisJCX0NCisJfQ0KKw0KKwlyZXR1cm4oIChpdCA9PSBlbmRJdCkgJiYgKGl0T3RoZXIgPT0gZW5kT3RoZXIpICk7DQorfQ0KKw0KKw0KKw0KKy8qKg0KKyAqIFNlcmlhbGl6YXRpb24NCisgKi8NCit2b2lkIFVuaUZvcm1JZGVudGlmaWVyOjp0b1N0cmVhbShPdXRTdHJlYW0gJiBvdXQpIGNvbnN0DQorew0KKwlvdXQgPDwgVEFCIDw8IEFWTV9OT19JTkRFTlQ7DQorDQorCWlmKCBoYXNMb2NhdG9yKCkgKQ0KKwl7DQorCQlnZXRMb2NhdG9yKCkudG9TdHJlYW0ob3V0KTsNCisJCW91dCA8PCBTRVBBUkFUT1JfTE9DQVRPUjsNCisJfQ0KKw0KKwl0b1N0cmVhbUxvY2F0aW9uKG91dCk7DQorDQorCUFWTV9ERUJVR19SRUZfQ09VTlRFUihvdXQpOw0KKw0KKwlvdXQgPDwgRU5EX0lOREVOVCA8PCBFT0wgPDwgc3RkOjpmbHVzaDsNCit9DQorDQorc3RkOjpzdHJpbmcgVW5pRm9ybUlkZW50aWZpZXI6OnN0cigpIGNvbnN0DQorew0KKwlTdHJpbmdPdXRTdHJlYW0gb3NzKCBBVk1fTk9fSU5ERU5UICk7DQorDQorCWlmKCBoYXNMb2NhdG9yKCkgKQ0KKwl7DQorCQlvc3MgPDwgZ2V0TG9jYXRvcigpLnN0cigpOw0KKw0KKwkJb3NzIDw8IFNFUEFSQVRPUl9MT0NBVE9SOw0KKwl9DQorDQorDQorCUxpc3RPZkZpZWxkOjpjb25zdF9pdGVyYXRvciBpdCA9IExpc3RPZkZpZWxkOjpiZWdpbigpOw0KKwlMaXN0T2ZGaWVsZDo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBMaXN0T2ZGaWVsZDo6ZW5kKCk7DQorCWlmKCAoaXQgIT0gaXRFbmQpICYmICgqaXQpLnZhbGlkKCkgKQ0KKwl7DQorCQlpZiggKCppdCkuaXM8IEJhc2VJbnN0YW5jZUZvcm0gPigpICkNCisJCXsNCitBVk1fSUZfREVCVUdfRkxBRyggUVVBTElGSUVEX05BTUVfSUQgKQ0KKwkJCW9zcyA8PCAoKml0KS50b19wdHI8IEJhc2VJbnN0YW5jZUZvcm0gPigpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOw0KK0FWTV9FTFNFDQorCQkJb3NzIDw8ICgqaXQpLnRvX3B0cjwgQmFzZUluc3RhbmNlRm9ybSA+KCktPmdldE5hbWVJRCgpOw0KK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBRVUFMSUZJRURfTkFNRV9JRCApDQorCQl9DQorDQorCQllbHNlIGlmKCAoKml0KS5pczwgUnVudGltZUlEID4oKSkNCisJCXsNCitBVk1fSUZfREVCVUdfRkxBRyggUVVBTElGSUVEX05BTUVfSUQgKQ0KKwkJCW9zcyA8PCAoKml0KS5iZlJJRCgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7DQorQVZNX0VMU0UNCisJCQlvc3MgPDwgKCppdCkuYmZSSUQoKS5zdHJVbmlxSWQoKTsNCitBVk1fRU5ESUZfREVCVUdfRkxBRyggUVVBTElGSUVEX05BTUVfSUQgKQ0KKwkJfQ0KKw0KKwkJZWxzZSBpZiggKCppdCkuaXM8IE9iamVjdEVsZW1lbnQgPigpICkNCisJCXsNCisJCQlvc3MgPDwgIiYiDQorCQkJCTw8ICgqaXQpLnRvX3B0cjwgT2JqZWN0RWxlbWVudCA+KCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7DQorCQl9DQorDQorCQllbHNlIGlmKCAoKml0KS5pc0lkZW50aWZpZXIoKSApDQorCQl7DQorCQkJb3NzIDw8ICgqaXQpLnN0cigpOw0KKwkJfQ0KKw0KKwkJZWxzZSBpZiggKCppdCkuaXM8IEF2bUNvZGUgPigpICkNCisJCXsNCisJCQlvc3MgPDwgIiR7IHVmaSI7DQorCQkJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApDQorCQkJew0KKwkJCQlvc3MgPDwgIiAiOw0KKwkJCQlvc3MgPDwgKCppdCkuc3RyKCk7DQorCQkJfQ0KKwkJCW9zcyA8PCAiIH0iOw0KKw0KKwkJCXJldHVybiggb3NzLnN0cigpICk7DQorCQl9DQorDQorCQllbHNlIGlmKCAoKml0KS5pczwgVW5pRm9ybUlkZW50aWZpZXIgPigpICkNCisJCXsNCisJCQlvc3MgPDwgIiR7IHVmaSAiDQorCQkJCQk8PCAoKml0KS50b19wdHI8IFVuaUZvcm1JZGVudGlmaWVyID4oKS0+c3RyKCkgPDwgIiB9IjsNCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQkoKml0KS50b1N0cmVhbSggb3NzICk7DQorCQl9DQorDQorDQorCQlmb3IoICsraXQgOyBpdCAhPSBpdEVuZCA7ICsraXQgKQ0KKwkJew0KKwkJCWlmKCAoKml0KS5zY2hlbWUgPT0gVUZJX1NDSEVNRV9JTkRFWCApDQorCQkJew0KKwkJCQlvc3MgPDwgIlsiOw0KKw0KKwkJCQlpZiggKCppdCkuaXM8IE9iamVjdEVsZW1lbnQgPigpICkNCisJCQkJew0KKwkJCQkJb3NzIDw8ICImIiA8PCAoKml0KS50b19wdHI8DQorCQkJCQkJCU9iamVjdEVsZW1lbnQgPigpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOw0KKwkJCQl9DQorCQkJCWVsc2UgaWYoICgqaXQpLmlzPCBCYXNlSW5zdGFuY2VGb3JtID4oKSApDQorCQkJCXsNCisJCQkJCW9zcyA8PCAiJiIgPDwgKCppdCkudG9fcHRyPA0KKwkJCQkJCQlCYXNlSW5zdGFuY2VGb3JtID4oKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsNCisJCQkJfQ0KKwkJCQllbHNlDQorCQkJCXsNCisJCQkJCW9zcyA8PCAoKml0KS5zdHIoKTsNCisJCQkJfQ0KKw0KKwkJCQlvc3MgPDwgIl0iOw0KKwkJCX0NCisJCQllbHNlIGlmKCAoKml0KS5zY2hlbWUgPT0gVUZJX1NDSEVNRV9QQVJBTUVURVIgKQ0KKwkJCXsNCisJCQkJb3NzIDw8ICIoIjsNCisNCisJCQkJaWYoICgqaXQpLmlzPCBPYmplY3RFbGVtZW50ID4oKSApDQorCQkJCXsNCisJCQkJCW9zcyA8PCAiJiIgPDwgKCppdCkudG9fcHRyPA0KKwkJCQkJCQlPYmplY3RFbGVtZW50ID4oKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsNCisJCQkJfQ0KKwkJCQllbHNlIGlmKCAoKml0KS5pczwgQmFzZUluc3RhbmNlRm9ybSA+KCkgKQ0KKwkJCQl7DQorCQkJCQlvc3MgPDwgIiYiIDw8ICgqaXQpLnRvX3B0cjwNCisJCQkJCQkJQmFzZUluc3RhbmNlRm9ybSA+KCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7DQorCQkJCX0NCisJCQkJZWxzZQ0KKwkJCQl7DQorCQkJCQlvc3MgPDwgKCppdCkuc3RyKCk7DQorCQkJCX0NCisNCisJCQkJb3NzIDw8ICIpIjsNCisJCQl9DQorDQorCQkJZWxzZSBpZiggKCppdCkuaXNJZGVudGlmaWVyKCkgKQ0KKwkJCXsNCisJCQkJb3NzIDw8IFNFUEFSQVRPUl9JRDsNCisJCQkJb3NzIDw8ICgqaXQpLnN0cigpOw0KKwkJCX0NCisNCisJCQllbHNlIGlmKCAoKml0KS5pczwgT2JqZWN0RWxlbWVudCA+KCkgKQ0KKwkJCXsNCisJCQkJb3NzIDw8IFNFUEFSQVRPUl9MT0NBVElPTiA8PCAiJiIgPDwgKCppdCkudG9fcHRyPA0KKwkJCQkJCU9iamVjdEVsZW1lbnQgPigpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOw0KKwkJCX0NCisNCisJCQllbHNlIGlmKCAoKml0KS5pczwgQmFzZUluc3RhbmNlRm9ybSA+KCkgKQ0KKwkJCXsNCisJCQkJb3NzIDw8IFNFUEFSQVRPUl9MT0NBVElPTiA8PCAiJiIgPDwgKCppdCkudG9fcHRyPA0KKwkJCQkJCUJhc2VJbnN0YW5jZUZvcm0gPigpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOw0KKwkJCX0NCisNCisJCQllbHNlIGlmKCAoKml0KS5pczwgUnVudGltZUlEID4oKSApDQorCQkJew0KKwkJCQlvc3MgPDwgU0VQQVJBVE9SX0xPQ0FUSU9OIDw8ICImIg0KKwkJCQkJPDwgKCppdCkuYmZSSUQoKS5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwlyZXR1cm4oIG9zcy5zdHIoKSApOw0KK30NCisNCisNCit2b2lkIFVuaUZvcm1JZGVudGlmaWVyOjp0b1N0cmVhbUxvY2F0b3IoT3V0U3RyZWFtICYgb3V0KSBjb25zdA0KK3sNCisJaWYoIGhhc0xvY2F0b3IoKSApDQorCXsNCisJCW91dCA8PCBBVk1fTk9fSU5ERU5UOw0KKwkJZ2V0TG9jYXRvcigpLnRvU3RyZWFtKG91dCk7DQorCQlvdXQgPDwgRU5EX0lOREVOVDsNCisJfQ0KK30NCisNCisNCit2b2lkIFVuaUZvcm1JZGVudGlmaWVyOjp0b1N0cmVhbUxvY2F0aW9uKE91dFN0cmVhbSAmIG91dCkgY29uc3QNCit7DQorCXRvU3RyZWFtTG9jYXRpb24ob3V0LCBMaXN0T2ZGaWVsZDo6YmVnaW4oKSwgTGlzdE9mRmllbGQ6OmVuZCgpKTsNCit9DQorDQorDQordm9pZCBVbmlGb3JtSWRlbnRpZmllcjo6dG9TdHJlYW1Mb2NhdGlvbihPdXRTdHJlYW0gJiBvdXQsDQorCQlMaXN0T2ZGaWVsZDo6Y29uc3RfaXRlcmF0b3IgaXQsIExpc3RPZkZpZWxkOjpjb25zdF9pdGVyYXRvciBpdEVuZCkgY29uc3QNCit7DQorCWlmKCAoaXQgIT0gaXRFbmQpICYmICgqaXQpLnZhbGlkKCkgKQ0KKwl7DQorCQlpZiggKCppdCkuaXM8IEJhc2VJbnN0YW5jZUZvcm0gPigpICkNCisJCXsNCitBVk1fSUZfREVCVUdfRkxBRyggUVVBTElGSUVEX05BTUVfSUQgKQ0KKwkJCW91dCA8PCAoKml0KS50b19wdHI8IEJhc2VJbnN0YW5jZUZvcm0gPigpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOw0KK0FWTV9FTFNFDQorCQkJb3V0IDw8ICgqaXQpLnRvX3B0cjwgQmFzZUluc3RhbmNlRm9ybSA+KCktPmdldE5hbWVJRCgpOw0KK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBRVUFMSUZJRURfTkFNRV9JRCApDQorCQl9DQorDQorCQllbHNlIGlmKCAoKml0KS5pczwgUnVudGltZUlEID4oKSkNCisJCXsNCitBVk1fSUZfREVCVUdfRkxBRyggUVVBTElGSUVEX05BTUVfSUQgKQ0KKwkJCW91dCA8PCAoKml0KS5iZlJJRCgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7DQorQVZNX0VMU0UNCisJCQlvdXQgPDwgKCppdCkuYmZSSUQoKS5zdHJVbmlxSWQoKTsNCitBVk1fRU5ESUZfREVCVUdfRkxBRyggUVVBTElGSUVEX05BTUVfSUQgKQ0KKwkJfQ0KKw0KKwkJZWxzZSBpZiggKCppdCkuaXM8IE9iamVjdEVsZW1lbnQgPigpICkNCisJCXsNCisJCQlvdXQgPDwgIiYiIDw8ICgqaXQpLnRvX3B0cjwNCisJCQkJCU9iamVjdEVsZW1lbnQgPigpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOw0KKwkJfQ0KKw0KKwkJZWxzZSBpZiggKCppdCkuaXNJZGVudGlmaWVyKCkgKQ0KKwkJew0KKwkJCSgqaXQpLnRvU3RyZWFtKG91dCk7DQorCQl9DQorDQorCQllbHNlIGlmKCAoKml0KS5pczwgQXZtQ29kZSA+KCkgKQ0KKwkJew0KKwkJCW91dCA8PCAiJHsgdWZpIjsNCisJCQlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkNCisJCQl7DQorCQkJCW91dCA8PCAiICI7DQorCQkJCSgqaXQpLnRvU3RyZWFtKG91dCk7DQorCQkJfQ0KKwkJCW91dCA8PCAiIH0iOw0KKw0KKwkJCXJldHVybjsNCisJCX0NCisNCisJCWVsc2UgaWYoICgqaXQpLmlzPCBVbmlGb3JtSWRlbnRpZmllciA+KCkgKQ0KKwkJew0KKwkJCW91dCA8PCAiJHsgdWZpICINCisJCQkJPDwgKCppdCkudG9fcHRyPCBVbmlGb3JtSWRlbnRpZmllciA+KCktPnN0cigpIDw8ICIgfSI7DQorCQl9DQorDQorCQllbHNlDQorCQl7DQorCQkJb3V0IDw8IG5vX2luZGVudCggKml0ICk7DQorCQl9DQorDQorDQorCQlmb3IoICsraXQgOyBpdCAhPSBpdEVuZCA7ICsraXQgKQ0KKwkJew0KKwkJCWlmKCAoKml0KS5zY2hlbWUgPT0gVUZJX1NDSEVNRV9JTkRFWCApDQorCQkJew0KKwkJCQlvdXQgPDwgIlsiOw0KKw0KKwkJCQlpZiggKCppdCkuaXM8IE9iamVjdEVsZW1lbnQgPigpICkNCisJCQkJew0KKwkJCQkJb3V0IDw8ICImIiA8PCAoKml0KS50b19wdHI8DQorCQkJCQkJCU9iamVjdEVsZW1lbnQgPigpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOw0KKwkJCQl9DQorCQkJCWVsc2UgaWYoICgqaXQpLmlzPCBCYXNlSW5zdGFuY2VGb3JtID4oKSApDQorCQkJCXsNCisJCQkJCW91dCA8PCAiJiIgPDwgKCppdCkudG9fcHRyPA0KKwkJCQkJCQlCYXNlSW5zdGFuY2VGb3JtID4oKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsNCisJCQkJfQ0KKwkJCQllbHNlDQorCQkJCXsNCisJCQkJCSgqaXQpLnRvU3RyZWFtKG91dCk7DQorCQkJCX0NCisNCisJCQkJb3V0IDw8ICJdIjsNCisJCQl9DQorCQkJZWxzZSBpZiggKCppdCkuc2NoZW1lID09IFVGSV9TQ0hFTUVfUEFSQU1FVEVSICkNCisJCQl7DQorCQkJCW91dCA8PCAiKCI7DQorDQorCQkJCWlmKCAoKml0KS5pczwgT2JqZWN0RWxlbWVudCA+KCkgKQ0KKwkJCQl7DQorCQkJCQlvdXQgPDwgIiYiIDw8ICgqaXQpLnRvX3B0cjwNCisJCQkJCQkJT2JqZWN0RWxlbWVudCA+KCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7DQorCQkJCX0NCisJCQkJZWxzZQ0KKwkJCQl7DQorCQkJCQkoKml0KS50b1N0cmVhbShvdXQpOw0KKwkJCQl9DQorDQorCQkJCW91dCA8PCAiKSI7DQorCQkJfQ0KKw0KKwkJCWVsc2UgaWYoICgqaXQpLmlzSWRlbnRpZmllcigpICkNCisJCQl7DQorCQkJCW91dCA8PCBTRVBBUkFUT1JfSUQ7DQorCQkJCSgqaXQpLnRvU3RyZWFtKG91dCk7DQorCQkJfQ0KKw0KKwkJCWVsc2UgaWYoICgqaXQpLmlzPCBPYmplY3RFbGVtZW50ID4oKSApDQorCQkJew0KKwkJCQlvdXQgPDwgU0VQQVJBVE9SX0xPQ0FUSU9OIDw8ICImIiA8PCAoKml0KS50b19wdHI8DQorCQkJCQkJT2JqZWN0RWxlbWVudCA+KCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7DQorCQkJfQ0KKw0KKwkJCWVsc2UgaWYoICgqaXQpLmlzPCBCYXNlSW5zdGFuY2VGb3JtID4oKSApDQorCQkJew0KKwkJCQlvdXQgPDwgU0VQQVJBVE9SX0xPQ0FUSU9OIDw8ICImIiA8PCAoKml0KS50b19wdHI8DQorCQkJCQkJQmFzZUluc3RhbmNlRm9ybSA+KCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7DQorCQkJfQ0KKw0KKwkJCWVsc2UgaWYoICgqaXQpLmlzPCBSdW50aW1lSUQgPigpICkNCisJCQl7DQorCQkJCW91dCA8PCBTRVBBUkFUT1JfTE9DQVRJT04gPDwgIiYiDQorCQkJCQk8PCAoKml0KS5iZlJJRCgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCk7DQorCQkJfQ0KKwkJfQ0KKwl9DQorfQ0KKw0KKw0KK3N0ZDo6c3RyaW5nIFVuaUZvcm1JZGVudGlmaWVyOjp0b1N0cmluZ0NvbnRhaW5lcigpIGNvbnN0DQorew0KKwlTdHJpbmdPdXRTdHJlYW0gb3NzKEFWTV9OT19JTkRFTlQpOw0KKw0KKwlpZiggaGFzTG9jYXRvcigpICkNCisJew0KKwkJZ2V0TG9jYXRvcigpLnRvU3RyZWFtKG9zcyk7DQorDQorCQlvc3MgPDwgU0VQQVJBVE9SX0xPQ0FUT1I7DQorCX0NCisNCisJaWYoIExpc3RPZkZpZWxkOjpub25lbXB0eSgpICkNCisJew0KKwkJTGlzdE9mRmllbGQ6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gTGlzdE9mRmllbGQ6OmJlZ2luKCk7DQorCQlMaXN0T2ZGaWVsZDo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBMaXN0T2ZGaWVsZDo6ZW5kKCk7DQorCQlpZiggaXQgIT0gaXRFbmQgKSB7IC0taXRFbmQ7IH0NCisNCisJCXRvU3RyZWFtTG9jYXRpb24ob3NzLCBpdCwgaXRFbmQpOw0KKwl9DQorDQorCXJldHVybiggb3NzLnN0cigpICk7DQorfQ0KKw0KKw0KK3N0ZDo6c3RyaW5nIFVuaUZvcm1JZGVudGlmaWVyOjp0b1N0cmluZ0lkKCkgY29uc3QNCit7DQorCWlmKCBMaXN0T2ZGaWVsZDo6bm9uZW1wdHkoKSApDQorCXsNCisJCWlmKCBMaXN0T2ZGaWVsZDo6bGFzdCgpLnZhbGlkKCkgKQ0KKwkJew0KKwkJCWlmKCBMaXN0T2ZGaWVsZDo6bGFzdCgpLmlzPCBCYXNlSW5zdGFuY2VGb3JtID4oKSApDQorCQkJew0KKwkJCQlyZXR1cm4oIExpc3RPZkZpZWxkOjpsYXN0KCkudG9fcHRyPCBCYXNlSW5zdGFuY2VGb3JtID4oKS0+Z2V0TmFtZUlEKCkgKTsNCisJCQl9DQorDQorCQkJZWxzZSBpZiggTGlzdE9mRmllbGQ6Omxhc3QoKS5pczwgUnVudGltZUlEID4oKSApDQorCQkJew0KKwkJCQlyZXR1cm4oIExpc3RPZkZpZWxkOjpsYXN0KCkuYmZSSUQoKS5nZXROYW1lSUQoKSApOw0KKwkJCX0NCisNCisJCQllbHNlIGlmKCBMaXN0T2ZGaWVsZDo6bGFzdCgpLmlzPCBPYmplY3RFbGVtZW50ID4oKSApDQorCQkJew0KKwkJCQlyZXR1cm4oIExpc3RPZkZpZWxkOjpsYXN0KCkudG9fcHRyPA0KKwkJCQkJCU9iamVjdEVsZW1lbnQgPigpLT5nZXROYW1lSUQoKSApOw0KKwkJCX0NCisNCisJCQllbHNlDQorCQkJew0KKwkJCQlyZXR1cm4oIExpc3RPZkZpZWxkOjpsYXN0KCkuc3RyKCkgKTsNCisJCQl9DQorCQl9DQorCQllbHNlDQorCQl7DQorCQkJcmV0dXJuKCAiSUQ8bnVsbD4iICk7DQorCQl9DQorCX0NCisNCisJcmV0dXJuKCAiIiApOw0KK30NCisNCisNCit2b2lkIFVuaUZvcm1JZGVudGlmaWVyOjp0b1N0cmVhbUF2bShPdXRTdHJlYW0gJiBvdXQpIGNvbnN0DQorew0KKwlvdXQgPDwgVEFCIDw8IEFWTV9OT19JTkRFTlQ7DQorDQorCWlmKCBoYXNMb2NhdG9yKCkgKQ0KKwl7DQorCQlnZXRMb2NhdG9yKCkudG9TdHJlYW0ob3V0KTsNCisNCisJCW91dCA8PCBTRVBBUkFUT1JfTE9DQVRPUjsNCisJfQ0KKw0KKwlvdXQgPDwgIiR7IHVmaSI7DQorDQorCUxpc3RPZkZpZWxkOjpjb25zdF9pdGVyYXRvciBpdCA9IExpc3RPZkZpZWxkOjpiZWdpbigpOw0KKwlMaXN0T2ZGaWVsZDo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBMaXN0T2ZGaWVsZDo6ZW5kKCk7DQorCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQ0KKwl7DQorCQlvdXQgPDwgIiAiOw0KKw0KKwkJLy8gQ0FTRSBPQkpFQ1QgRUxFTUVOVA0KKwkJaWYoICgqaXQpLmlzPCBPYmplY3RFbGVtZW50ID4oKSApDQorCQl7DQorCQkJb3V0IDw8ICImIiA8PCAoKml0KS50b19wdHI8IE9iamVjdEVsZW1lbnQgPigpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpOw0KKwkJfQ0KKw0KKwkJLy8gQ0FTRSBJTlNUQU5DRSBFTEVNRU5UDQorCQllbHNlIGlmKCAoKml0KS5pczwgQmFzZUluc3RhbmNlRm9ybSA+KCkgKQ0KKwkJew0KKwkJCW91dCA8PCAiJiIgPDwgKCppdCkudG9fcHRyPCBCYXNlSW5zdGFuY2VGb3JtID4oKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsNCisJCX0NCisNCisJCS8vIENBU0UgUlVOVElNRV9GT1JNX0lEIEVMRU1FTlQNCisJCWVsc2UgaWYoICgqaXQpLmlzPCBSdW50aW1lSUQgPigpICkNCisJCXsNCisJCQlvdXQgPDwgIiYiIDw8ICgqaXQpLmJmUklEKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsNCisJCX0NCisNCisJCS8vIENBU0UgSURFTlRJRklFUiBFTEVNRU5UDQorCQllbHNlIGlmKCAoKml0KS5pc0lkZW50aWZpZXIoKSApDQorCQl7DQorCQkJKCppdCkudG9TdHJlYW0ob3V0KTsNCisJCX0NCisNCisJCWVsc2UNCisJCXsNCisJCQkoKml0KS50b1N0cmVhbShvdXQpOw0KKwkJfQ0KKwl9DQorDQorCW91dCA8PCBFTkRfSU5ERU5UIDw8ICIgfSAiIDw8IEVPTF9GTFVTSDsNCit9DQorDQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC93b3JrZmxvdy9VbmlGb3JtSWRlbnRpZmllci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3dvcmtmbG93L1VuaUZvcm1JZGVudGlmaWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIxMDNlZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC93b3JrZmxvdy9VbmlGb3JtSWRlbnRpZmllci5oCkBAIC0wLDAgKzEsNjI5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFVGSV9IXworI2RlZmluZSBVRklfSF8KKworI2luY2x1ZGUgPGNvbW1vbi9OYW1lZEVsZW1lbnQuaD4KKworI2luY2x1ZGUgPGZtbC9jb21tb24vVHJhY2VhYmxlRWxlbWVudC5oPgorCisjaW5jbHVkZSA8Y29tbW9uL0F2bVBvaW50ZXIuaD4KKyNpbmNsdWRlIDxiYXNlL0NsYXNzS2luZEluZm8uaD4KKyNpbmNsdWRlIDxjb21tb24vQkYuaD4KKworI2luY2x1ZGUgPGZtbC9idWlsdGluL0lkZW50aWZpZXIuaD4KKyNpbmNsdWRlIDxjb2xsZWN0aW9uL0xpc3QuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKK2NsYXNzIEVsZW1lbnQ7CisKKwordHlwZWRlZiBhdm1fdWludDhfdCAgICAgICAgIGF2bV91Zmlfc2NoZW1lX3Q7CisKK2VudW0geworCVVGSV9TQ0hFTUVfVU5ERUZJTkVEICA9IDB4MDAsCisKKwlVRklfU0NIRU1FX01BQ0hJTkUgICAgPSAweDAxLAorCVVGSV9TQ0hFTUVfSU5TVEFOQ0UgICA9IDB4MDIsCisJVUZJX1NDSEVNRV9QT1JUICAgICAgID0gMHgwNCwKKwlVRklfU0NIRU1FX0JVRkZFUiAgICAgPSAweDA4LAorCVVGSV9TQ0hFTUVfVkFSSUFCTEUgICA9IDB4MTAsCisvLwlVRklfU0NIRU1FX0NPTk5FQ1RPUiAgPSAweDIwLAorCisJVUZJX1NDSEVNRV9JTlZPS0FCTEUgID0gMHgyMCwKKworCVVGSV9TQ0hFTUVfRklFTEQgICAgICA9IFVGSV9TQ0hFTUVfTUFDSElORQorCSAgICAgICAgICAgICAgICAgICAgICB8IFVGSV9TQ0hFTUVfSU5TVEFOQ0UKKwkgICAgICAgICAgICAgICAgICAgICAgfCBVRklfU0NIRU1FX1BPUlQKKwkgICAgICAgICAgICAgICAgICAgICAgfCBVRklfU0NIRU1FX0JVRkZFUgorCSAgICAgICAgICAgICAgICAgICAgICB8IFVGSV9TQ0hFTUVfVkFSSUFCTEUsCisvLwkgICAgICAgICAgICAgICAgICAgICAgfCBVRklfU0NIRU1FX0NPTk5FQ1RPUiwKKy8vCSAgICAgICAgICAgICAgICAgICAgICB8IFVGSV9TQ0hFTUVfSU5WT0tBQkxFLAorCisKKwlVRklfU0NIRU1FX0lOREVYICAgICAgPSAweDQwLAorCisJVUZJX1NDSEVNRV9BUlJBWSAgICAgID0gVUZJX1NDSEVNRV9JTkRFWCwKKworCisJVUZJX1NDSEVNRV9QQVJBTUVURVIgID0gMHg4MCwKKworCisJVUZJX1NDSEVNRV9BUkdVTUVOVCAgID0gVUZJX1NDSEVNRV9BUlJBWQorCSAgICAgICAgICAgICAgICAgICAgICB8IFVGSV9TQ0hFTUVfUEFSQU1FVEVSLAorCisKKwlVRklfU0NIRU1FX0hZQlJJRCAgICAgPSBVRklfU0NIRU1FX0ZJRUxECisJICAgICAgICAgICAgICAgICAgICAgIHwgVUZJX1NDSEVNRV9JTkRFWAorCQkJCQkJICB8IFVGSV9TQ0hFTUVfQVJSQVksCisKKwlVRklfU0NIRU1FX01BU0tfQUxMICAgPSAweEZGCit9OworCisKKworY2xhc3MgVWZpRmllbGQgIDogIHB1YmxpYyBCRgoreworCitwdWJsaWM6CisJLyoqCisJICogQVRUUklCVVRFCisJICovCisJYXZtX3VmaV9zY2hlbWVfdCBzY2hlbWU7CisKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCVVmaUZpZWxkKGNvbnN0IEJGICYgYmYsIGF2bV91Zmlfc2NoZW1lX3QgYVNjaGVtZSkKKwk6IEJGKCBiZiApLAorCXNjaGVtZSggYVNjaGVtZSApCisJeworCQkvLyBOT1RISU5HCisJfQorCisJVWZpRmllbGQoRWxlbWVudCAqIGJmLCBhdm1fdWZpX3NjaGVtZV90IGFTY2hlbWUpCisJOiBCRiggYmYgKSwKKwlzY2hlbWUoIGFTY2hlbWUgKQorCXsKKwkJLy8gTk9USElORworCX0KKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCVVmaUZpZWxkKGNvbnN0IFVmaUZpZWxkICYgYXRvbSkKKwk6IEJGKCBhdG9tICksCisJc2NoZW1lKCBhdG9tLnNjaGVtZSApCisJeworCQkvLyBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+VWZpRmllbGQoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBDT01QQVJJU09OCisJICogT1BFUkFUT1IKKwkgKi8KKwlpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFVmaUZpZWxkICYgb3RoZXIpIGNvbnN0CisJeworCQlyZXR1cm4oIChzY2hlbWUgPT0gb3RoZXIuc2NoZW1lKSAmJiAoKnRoaXMgPT0gb3RoZXIpICk7CisJfQorCisJaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBVZmlGaWVsZCAmIG90aGVyKSBjb25zdAorCXsKKwkJcmV0dXJuKCAoc2NoZW1lICE9IG90aGVyLnNjaGVtZSkgfHwgKCp0aGlzICE9IG90aGVyKSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogZm9yIG1TY2hlbWUKKwkgKi8KKwlpbmxpbmUgdm9pZCBhZGRTY2hlbWUoYXZtX3VmaV9zY2hlbWVfdCBhU2NoZW1lKQorCXsKKwkJc2NoZW1lIHw9IGFTY2hlbWU7CisJfQorCisJaW5saW5lIGF2bV91Zmlfc2NoZW1lX3QgZ2V0U2NoZW1lKCkgY29uc3QKKwl7CisJCXJldHVybiggc2NoZW1lICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNGaWVsZEluZGV4KCkgY29uc3QKKwl7CisJCXJldHVybiggc2NoZW1lICYgVUZJX1NDSEVNRV9JTkRFWCApOworCX0KKworCWlubGluZSBib29sIGlzRmllbGRNYWNoaW5lKCkgY29uc3QKKwl7CisJCXJldHVybiggc2NoZW1lICYgVUZJX1NDSEVNRV9NQUNISU5FICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNGaWVsZEJ1ZmZlcigpIGNvbnN0CisJeworCQlyZXR1cm4oIHNjaGVtZSAmIFVGSV9TQ0hFTUVfQlVGRkVSICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNGaWVsZFBvcnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBzY2hlbWUgJiBVRklfU0NIRU1FX1BPUlQgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc0ZpZWxkVmFyaWFibGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBzY2hlbWUgJiBVRklfU0NIRU1FX1ZBUklBQkxFICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNGaWVsZEludm9rYWJsZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIHNjaGVtZSAmIFVGSV9TQ0hFTUVfSU5WT0tBQkxFICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNGaWVsZFBhcmFtZXRlcigpIGNvbnN0CisJeworCQlyZXR1cm4oIHNjaGVtZSAmIFVGSV9TQ0hFTUVfUEFSQU1FVEVSICk7CisJfQorCisKKwlpbmxpbmUgdm9pZCBzZXRTY2hlbWUoYXZtX3VmaV9zY2hlbWVfdCBhU2NoZW1lKQorCXsKKwkJc2NoZW1lID0gYVNjaGVtZTsKKwl9CisKK307CisKKworY2xhc3MgVW5pRm9ybUlkZW50aWZpZXIgOgorCQlwdWJsaWMgTmFtZWRFbGVtZW50LAorCQlwdWJsaWMgVHJhY2VhYmxlRWxlbWVudCwKKwkJcHVibGljIExpc3Q8IFVmaUZpZWxkID4sCisJCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggVW5pRm9ybUlkZW50aWZpZXIgKQoreworCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIFVuaUZvcm1JZGVudGlmaWVyICkKKworCitwdWJsaWM6CisJdHlwZWRlZiBMaXN0PCBVZmlGaWVsZCA+ICAgIExpc3RPZkZpZWxkOworCisKKwlzdGF0aWMgQkYgQU5PTllNX0xPQ0FUSU9OOworCisJc3RhdGljIHN0ZDo6c3RyaW5nIFNFUEFSQVRPUl9JRDsKKwlzdGF0aWMgc3RkOjpzdHJpbmcgU0VQQVJBVE9SX0xPQ0FUSU9OOworCXN0YXRpYyBzdGQ6OnN0cmluZyBTRVBBUkFUT1JfTE9DQVRPUjsKKworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQVRUUklCVVRFUworCSAqLworCWF2bV91Zmlfc2NoZW1lX3QgbVNjaGVtZTsKKworCUJGIG1Mb2NhdG9yOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlVbmlGb3JtSWRlbnRpZmllcihib29sIGFub255bUxvY2F0aW9uKQorCTogTmFtZWRFbGVtZW50KCBDTEFTU19LSU5EX1QoIFVuaUZvcm1JZGVudGlmaWVyICkgKSwKKwlUcmFjZWFibGVFbGVtZW50KCApLAorCUxpc3RPZkZpZWxkKCApLAorCW1TY2hlbWUoIFVGSV9TQ0hFTUVfVU5ERUZJTkVEICksCisJbUxvY2F0b3IoICggYW5vbnltTG9jYXRpb24gKT8gQU5PTllNX0xPQ0FUSU9OIDogQkY6OlJFRl9OVUxMICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCVVuaUZvcm1JZGVudGlmaWVyKGNvbnN0IEJGICYgYUxvY2F0b3IpCisJOiBOYW1lZEVsZW1lbnQoIENMQVNTX0tJTkRfVCggVW5pRm9ybUlkZW50aWZpZXIgKSApLAorCVRyYWNlYWJsZUVsZW1lbnQoICksCisJTGlzdE9mRmllbGQoICksCisJbVNjaGVtZSggVUZJX1NDSEVNRV9VTkRFRklORUQgKSwKKwltTG9jYXRvciggYUxvY2F0b3IgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBPdGhlcgorCSAqLworCVVuaUZvcm1JZGVudGlmaWVyKGNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkKKwk6IE5hbWVkRWxlbWVudCggQ0xBU1NfS0lORF9UKCBVbmlGb3JtSWRlbnRpZmllciApLCBhUXVhbGlmaWVkTmFtZUlEICksCisJVHJhY2VhYmxlRWxlbWVudCggKSwKKwlMaXN0T2ZGaWVsZCggKSwKKwltU2NoZW1lKCBVRklfU0NIRU1FX1VOREVGSU5FRCApLAorCW1Mb2NhdG9yKCApCisJeworCQlidWlsZCggYVF1YWxpZmllZE5hbWVJRCApOworCX0KKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogQ29weQorCSAqLworCVVuaUZvcm1JZGVudGlmaWVyKGNvbnN0IFVuaUZvcm1JZGVudGlmaWVyICYgYW5VRkkpCisJOiBOYW1lZEVsZW1lbnQoIGFuVUZJICksCisJVHJhY2VhYmxlRWxlbWVudCggYW5VRkkgKSwKKwlMaXN0T2ZGaWVsZCggYW5VRkkgKSwKKwltU2NoZW1lKCBhblVGSS5tU2NoZW1lICksCisJbUxvY2F0b3IoIGFuVUZJLm1Mb2NhdG9yICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgflVuaUZvcm1JZGVudGlmaWVyKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogQlVJTEQgRlJPTSBRVUFMSUZJRUQgTkFNRSBJRAorCSAqLworCXZvaWQgYnVpbGQoY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKTsKKworCS8qKgorCSAqIExPQURFUiAtIERJU1BPU0VSCisJICovCisJc3RhdGljIHZvaWQgbG9hZCgpOworCXN0YXRpYyB2b2lkIGRpc3Bvc2UoKTsKKworCisJLyoqCisJICogTGlzdE9mRmllbGQKKwkgKi8KKwlpbmxpbmUgYXZtX3NpemVfdCBzaXplKCkgY29uc3QKKwl7CisJCXJldHVybiggTGlzdE9mRmllbGQ6OnNpemUoKSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogZm9yIG1TY2hlbWUKKwkgKi8KKwlpbmxpbmUgdm9pZCBhZGRTY2hlbWUoYXZtX3VmaV9zY2hlbWVfdCBhU2NoZW1lKQorCXsKKwkJbVNjaGVtZSB8PSBhU2NoZW1lOworCX0KKworCisJaW5saW5lIGF2bV91Zmlfc2NoZW1lX3QgZ2V0U2NoZW1lKCkgY29uc3QKKwl7CisJCXJldHVybiggbVNjaGVtZSApOworCX0KKworCWlubGluZSBib29sIGhhc1NjaGVtZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1TY2hlbWUgIT0gVUZJX1NDSEVNRV9VTkRFRklORUQgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc1NjaGVtZShhdm1fdWZpX3NjaGVtZV90IGFTY2hlbWUpIGNvbnN0CisJeworCQlyZXR1cm4oIChtU2NoZW1lICYgYVNjaGVtZSkgPT0gYVNjaGVtZSApOworCX0KKworCisJaW5saW5lIGJvb2wgaXNGaWVsZHMoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobVNjaGVtZSAmIChVRklfU0NIRU1FX0FSR1VNRU5UKSkgPT0gMCApOworCX0KKworCWlubGluZSBib29sIGlzQWJzb2x1dGVGdWxsRmllbGRzKCkgY29uc3QKKwl7CisJCXJldHVybiggKG1Mb2NhdG9yLnZhbGlkKCkKKwkJCQkJfHwgKG5vbmVtcHR5KCkgJiYgZmlyc3QoKS5pczwgT2JqZWN0RWxlbWVudCA+KCkpKQorCQkJCSYmICgobVNjaGVtZSAmIFVGSV9TQ0hFTUVfQVJHVU1FTlQpID09IDApICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNGdWxsT2Zmc2V0KCkgY29uc3QKKwl7CisJCXJldHVybiggKG1TY2hlbWUgJiBVRklfU0NIRU1FX1BBUkFNRVRFUikgPT0gMCApOworCX0KKworCWlubGluZSBib29sIGhhc0FycmF5KCkgY29uc3QKKwl7CisJCXJldHVybiggbVNjaGVtZSAmIFVGSV9TQ0hFTUVfQVJSQVkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNJbnZva2FibGUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtU2NoZW1lICYgVUZJX1NDSEVNRV9JTlZPS0FCTEUgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNQYXJhbWV0ZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtU2NoZW1lICYgVUZJX1NDSEVNRV9QQVJBTUVURVIgKTsKKwl9CisKKworCWlubGluZSB2b2lkIHNldFNjaGVtZShhdm1fdWZpX3NjaGVtZV90IGFTY2hlbWUpCisJeworCQltU2NoZW1lID0gYVNjaGVtZTsKKwl9CisKKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogZm9yIG1Mb2NhdG9yCisJICovCisJaW5saW5lIEJGICYgZ2V0TG9jYXRvcigpCisJeworCQlyZXR1cm4oIG1Mb2NhdG9yICk7CisJfQorCisJaW5saW5lIGNvbnN0IEJGICYgZ2V0TG9jYXRvcigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Mb2NhdG9yICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzTG9jYXRvcigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Mb2NhdG9yLnZhbGlkKCkgKTsKKwl9CisKKworCXZvaWQgc2V0TG9jYXRvcihjb25zdCBzdGQ6OnN0cmluZyAmIGFMb2NhdGlvbklkKTsKKworLy8JaW5saW5lIHZvaWQgc2V0TG9jYXRvcihjb25zdCBCRiAmIGFMb2NhdGlvbikKKy8vCXsKKy8vCQltTG9jYXRvciA9IGFMb2NhdGlvbjsKKy8vCX0KKworCisJaW5saW5lIGJvb2wgaXNBbm9ueW1Mb2NhdGlvbigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1Mb2NhdG9yLmlzVEVRKCBBTk9OWU1fTE9DQVRJT04gKSApOworCX0KKworCWlubGluZSB2b2lkIHNldEFub255bUxvY2F0aW9uKCkKKwl7CisJCW1Mb2NhdG9yID0gQU5PTllNX0xPQ0FUSU9OOworCX0KKworCWlubGluZSB2b2lkIHNldEFic29sdXRlKCkKKwl7CisJCWlmKCBub3QgaGFzTG9jYXRvcigpICkKKwkJeworCQkJc2V0QW5vbnltTG9jYXRpb24oKTsKKwkJfQorCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogRklFTEQgVU5ERUZJTkVECisJICovCisJaW5saW5lIHZvaWQgYXBwZW5kVW5kZWYoY29uc3QgQkYgJiBmaWVsZCkKKwl7CisJCUxpc3RPZkZpZWxkOjphcHBlbmQoIFVmaUZpZWxkKGZpZWxkLCBVRklfU0NIRU1FX1VOREVGSU5FRCkgKTsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBGSUVMRCBJTkRFWAorCSAqLworCWlubGluZSB2b2lkIGFwcGVuZEluZGV4KGNvbnN0IEJGICYgaWR4KQorCXsKKwkJTGlzdE9mRmllbGQ6OmFwcGVuZCggVWZpRmllbGQoaWR4LCBVRklfU0NIRU1FX0lOREVYKSApOworCQltU2NoZW1lIHw9IFVGSV9TQ0hFTUVfQVJSQVk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBGSUVMRAorCSAqLworCWlubGluZSB2b2lkIHVwZGF0ZUFsbE5hbWVJRCgpCisJeworCQljb25zdCBzdGQ6OnN0cmluZyBzdHJJRCA9IHN0cigpOworCisJCXNldEFsbE5hbWVJRCggc3RySUQgLCBzdHJJRCAsIHN0cklEICk7CisJfQorCisKKworCWlubGluZSB2b2lkIGFwcGVuZEZpZWxkKEVsZW1lbnQgKiBmaWVsZCwgYXZtX3VmaV9zY2hlbWVfdCBzY2hlbWUpCisJeworCQlMaXN0T2ZGaWVsZDo6YXBwZW5kKCBVZmlGaWVsZChmaWVsZCwgc2NoZW1lKSApOworCQltU2NoZW1lIHw9IHNjaGVtZTsKKworCQl1cGRhdGVBbGxOYW1lSUQoKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBhcHBlbmRGaWVsZChjb25zdCBCRiAmIGZpZWxkLCBhdm1fdWZpX3NjaGVtZV90IHNjaGVtZSkKKwl7CisJCUxpc3RPZkZpZWxkOjphcHBlbmQoIFVmaUZpZWxkKGZpZWxkLCBzY2hlbWUpICk7CisJCW1TY2hlbWUgfD0gc2NoZW1lOworCisJCXVwZGF0ZUFsbE5hbWVJRCgpOworCX0KKworCXZvaWQgYXBwZW5kRmllbGQoY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlELAorCQkJYXZtX3VmaV9zY2hlbWVfdCBzY2hlbWUpOworCisJdm9pZCBhcHBlbmRGaWVsZChjb25zdCBCRiAmIGZpZWxkKTsKKworCWlubGluZSB2b2lkIGFwcGVuZEZpZWxkKGNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkKKwl7CisJCWFwcGVuZEZpZWxkKCBhUXVhbGlmaWVkTmFtZUlEICwgVUZJX1NDSEVNRV9GSUVMRCApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogRklFTEQgTUFDSElORQorCSAqLworCWlubGluZSB2b2lkIGFwcGVuZEZpZWxkTWFjaGluZShjb25zdCBCRiAmIGZpZWxkKQorCXsKKwkJYXBwZW5kRmllbGQoIGZpZWxkICwgVUZJX1NDSEVNRV9NQUNISU5FICk7CisJfQorCisJaW5saW5lIHZvaWQgYXBwZW5kRmllbGRNYWNoaW5lKGNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkKKwl7CisJCWFwcGVuZEZpZWxkKCBhUXVhbGlmaWVkTmFtZUlEICwgVUZJX1NDSEVNRV9NQUNISU5FICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBGSUVMRCBWQVJJQUJMRQorCSAqLworCWlubGluZSB2b2lkIGFwcGVuZEZpZWxkVmFyaWFibGUoY29uc3QgQkYgJiBmaWVsZCkKKwl7CisJCWFwcGVuZEZpZWxkKCBmaWVsZCAsIFVGSV9TQ0hFTUVfVkFSSUFCTEUgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBhcHBlbmRGaWVsZFZhcmlhYmxlKGNvbnN0IHN0ZDo6c3RyaW5nICYgYVF1YWxpZmllZE5hbWVJRCkKKwl7CisJCWFwcGVuZEZpZWxkKCBhUXVhbGlmaWVkTmFtZUlEICwgVUZJX1NDSEVNRV9WQVJJQUJMRSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogRklFTEQgRlVOQ1RJT04KKwkgKi8KKwlpbmxpbmUgdm9pZCBhcHBlbmRGaWVsZEludm9rYWJsZShjb25zdCBCRiAmIGZpZWxkKQorCXsKKwkJYXBwZW5kRmllbGQoIGZpZWxkICwgVUZJX1NDSEVNRV9JTlZPS0FCTEUgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBhcHBlbmRGaWVsZEludm9rYWJsZShjb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpCisJeworCQlhcHBlbmRGaWVsZCggYVF1YWxpZmllZE5hbWVJRCAsIFVGSV9TQ0hFTUVfSU5WT0tBQkxFICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBGSUVMRCBQQVJBTUVURVIKKwkgKi8KKwlpbmxpbmUgdm9pZCBhcHBlbmRGaWVsZFBhcmFtZXRlcihjb25zdCBCRiAmIGZpZWxkKQorCXsKKwkJYXBwZW5kRmllbGQoIGZpZWxkICwgVUZJX1NDSEVNRV9QQVJBTUVURVIgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBhcHBlbmRGaWVsZFBhcmFtZXRlcihjb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpCisJeworCQlhcHBlbmRGaWVsZCggYVF1YWxpZmllZE5hbWVJRCAsIFVGSV9TQ0hFTUVfUEFSQU1FVEVSICk7CisJfQorCisKKwkvKioKKwkgKiBURVNUCisJICovCisJaW5saW5lIGJvb2wgaXNQdXJlSWRlbnRpZmllcigpIGNvbnN0CisJeworCQlyZXR1cm4oIExpc3RPZkZpZWxkOjpzaW5nbGV0b24oKSAmJiBtTG9jYXRvci5pbnZhbGlkKCkgJiYKKwkJCQlpc1NjaGVtZShVRklfU0NIRU1FX0ZJRUxEKSAmJgorCQkJCUxpc3RPZkZpZWxkOjpiYWNrKCkuaXM8IElkZW50aWZpZXIgPigpICk7CisJfQorCisJaW5saW5lIEJGIHBvcElkZW50aWZpZXIoKQorCXsKKwkJcmV0dXJuKCBMaXN0T2ZGaWVsZDo6cG9wX2ZpcnN0KCkgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgQkYgJiB0b0lkZW50aWZpZXIoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBMaXN0T2ZGaWVsZDo6YmFjaygpICk7CisJfQorCisKKwkvKioKKwkgKiBDT01QQVJJU09OCisJICogT1BFUkFUT1IKKwkgKi8KKwlpbnQgY29tcGFyZShjb25zdCBVbmlGb3JtSWRlbnRpZmllciAmIG90aGVyKSBjb25zdDsKKworCWlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgVW5pRm9ybUlkZW50aWZpZXIgJiBvdGhlcikgY29uc3QKKwl7CisJCXJldHVybiggVW5pRm9ybUlkZW50aWZpZXI6OmlzRVEoIG90aGVyICkgKTsKKwl9CisKKwlib29sIGlzRVEoY29uc3QgVW5pRm9ybUlkZW50aWZpZXIgJiBvdGhlcikgY29uc3Q7CisKKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwl2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG91dCkgY29uc3Q7CisKKwlzdGQ6OnN0cmluZyBzdHIoKSBjb25zdDsKKworCisJdm9pZCB0b1N0cmVhbUxvY2F0b3IoT3V0U3RyZWFtICYgb3V0KSBjb25zdDsKKworCWlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZ0xvY2F0b3IoKSBjb25zdAorCXsKKwkJU3RyaW5nT3V0U3RyZWFtIG9zcyhBVk1fTk9fSU5ERU5UKTsKKworCQl0b1N0cmVhbUxvY2F0b3Iob3NzKTsKKworCQlyZXR1cm4oIG9zcy5zdHIoKSApOworCX0KKworCisJdm9pZCB0b1N0cmVhbUxvY2F0aW9uKE91dFN0cmVhbSAmIG91dCkgY29uc3Q7CisKKwlpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmdMb2NhdGlvbigpIGNvbnN0CisJeworCQlTdHJpbmdPdXRTdHJlYW0gb3NzKEFWTV9OT19JTkRFTlQpOworCisJCXRvU3RyZWFtTG9jYXRpb24ob3NzKTsKKworCQlyZXR1cm4oIG9zcy5zdHIoKSApOworCX0KKworCisJdm9pZCB0b1N0cmVhbUxvY2F0aW9uKE91dFN0cmVhbSAmIG91dCwgTGlzdE9mRmllbGQ6OmNvbnN0X2l0ZXJhdG9yIGl0LAorCQkJTGlzdE9mRmllbGQ6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kKSBjb25zdDsKKworCXN0ZDo6c3RyaW5nIHRvU3RyaW5nQ29udGFpbmVyKCkgY29uc3Q7CisKKwlzdGQ6OnN0cmluZyB0b1N0cmluZ0lkKCkgY29uc3Q7CisKKworCXZvaWQgdG9TdHJlYW1Bdm0oT3V0U3RyZWFtICYgb3V0KSBjb25zdDsKKworfTsKKworCit9CisKKyNlbmRpZiAvKlVGSV9IXyovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvd29ya2Zsb3cvV09iamVjdC5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvd29ya2Zsb3cvV09iamVjdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIxOWQzMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC93b3JrZmxvdy9XT2JqZWN0LmNwcApAQCAtMCwwICsxLDg0MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuDQorICoNCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ3JlYXRlZCBvbjogMjMgbWFycyAyMDE2DQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnINCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSAiV09iamVjdC5oIg0KKw0KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29uc3RydWN0b3IuaD4NCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vU3RhdGVtZW50VHlwZUNoZWNrZXIuaD4NCisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yLmg+DQorDQorDQorbmFtZXNwYWNlIHNlcA0KK3sNCisNCisvKioNCisgKiBTVEFUSUMNCisgKiBfTlVMTF8NCisgKi8NCitXT2JqZWN0ICogV09iamVjdDo6X05VTExfID0gTlVMTDsNCisNCitjb25zdCBzdGQ6OnN0cmluZyAmIFdPYmplY3Q6OkZNTF9GUU5fU0NIRU1FID0gImZtbCI7DQorDQorY29uc3Qgc3RkOjpzdHJpbmcgJiBXT2JqZWN0OjpGTUxfRlFOX1JPT1QgICA9DQorCQkJV09iamVjdDo6Rk1MX0ZRTl9TQ0hFTUUgKyBGUU5fSURfU0NIRU1FX1BBVEhfU0VQQVJBVE9SOw0KKw0KK2NvbnN0IHN0ZDo6c3RyaW5nICYgV09iamVjdDo6U0VXX0ZRTl9TQ0hFTUUgPSAic2V3IjsNCisNCitjb25zdCBzdGQ6OnN0cmluZyAmIFdPYmplY3Q6OlNFV19GUU5fUk9PVCAgID0NCisJCQlXT2JqZWN0OjpTRVdfRlFOX1NDSEVNRSArIEZRTl9JRF9TQ0hFTUVfUEFUSF9TRVBBUkFUT1I7DQorDQorDQorLyoqDQorICogREVTVFJPWQ0KKyAqLw0KK3ZvaWQgV09iamVjdDo6ZGVzdHJveU93bmVkRWxlbWVudCgpDQorew0KKwlpZiggbU93bmVkRWxlbWVudHMubm9uZW1wdHkoKSApDQorCXsNCisJCVdPYmplY3QgKiB3Zk9iamVjdCA9IFdPYmplY3Q6Ol9OVUxMXzsNCisNCisJCXN0ZDo6c2l6ZV90IG93bmVkQ291bnQgPSBtT3duZWRFbGVtZW50cy5zaXplKCk7DQorDQorLy9BVk1fSUZfREVCVUdfRU5BQkxFRA0KKy8vCUFWTV9PU19ERUJVRyA8PCAiQCIgPDwgdGhpcy0+cmF3X2FkZHJlc3MoKSA8PCAiOiByZWY8ICINCisvLwkJCTw8IHRoaXMtPmdldFJlZkNvdW50KCkgPDwgIiA+ICIgPDwgdGhpcy0+c3RyVW5pcUlkKCkgPDwgc3RkOjplbmRsOw0KKy8vCWZvciggc3RkOjpzaXplX3Qgb2Zmc2V0ID0gMCA7IG9mZnNldCA8IG93bmVkQ291bnQgOyArK29mZnNldCkNCisvLwl7DQorLy8JCXdmT2JqZWN0ID0gbU93bmVkRWxlbWVudHNbIG9mZnNldCBdOw0KKy8vDQorLy8JQVZNX09TX0RFQlVHIDw8IHdmT2JqZWN0LT5nZXRPZmZzZXQoKSA8PCAiIEAiIDw8IHdmT2JqZWN0LT5yYXdfYWRkcmVzcygpDQorLy8JCQk8PCAiOiByZWY8ICIgPDwgd2ZPYmplY3QtPmdldFJlZkNvdW50KCkgIDw8ICIgPiAiDQorLy8JCQk8PCB3Zk9iamVjdC0+c3RyVW5pcUlkKCkgPDwgc3RkOjplbmRsOw0KKy8vCX0NCisvL0FWTV9FTkRJRl9ERUJVR19FTkFCTEVEDQorDQorCQlmb3IoIHN0ZDo6c2l6ZV90IG9mZnNldCA9IG93bmVkQ291bnQgOyBvZmZzZXQgPiAwIDsgLS1vZmZzZXQpDQorCQl7DQorCQkJd2ZPYmplY3QgPSBtT3duZWRFbGVtZW50c1sgb2Zmc2V0IC0gMSBdOw0KKw0KKwkJCWlmKCB3Zk9iamVjdCA9PSBXT2JqZWN0OjpfTlVMTF8gKQ0KKwkJCXsNCitBVk1fSUZfREVCVUdfRU5BQkxFRA0KKwlBVk1fT1NfV0FSTiA8PCAiVW5leHBlY3RlZCA8bnVsbD4gYXMgT3duZWQgV09iamVjdCBmb3IgZGVzdHJ1Y3Rpb24gISINCisJCQk8PCBzdGQ6OmVuZGw7DQorQVZNX0VORElGX0RFQlVHX0VOQUJMRUQNCisJCQl9DQorCQkJZWxzZSBpZiggd2ZPYmplY3QtPmdldENvbnRhaW5lcigpID09IHRoaXMgKQ0KKwkJCXsNCisJCQkJaWYoIHdmT2JqZWN0LT5pc1VuaXF1ZSgpICkNCisJCQkJew0KKwkJCQkJLy8gTk9STUFMIFNJVFVBVElPTg0KKwkJCQkJd2ZPYmplY3QgPSBXT2JqZWN0OjpfTlVMTF87DQorCQkJCX0NCisJCQkJZWxzZSBpZiggd2ZPYmplY3QtPmlzTXVsdGlwbGUoKSApDQorCQkJCXsNCitBVk1fSUZfREVCVUdfRU5BQkxFRA0KKwlBVk1fT1NfV0FSTiA8PCAiVW5leHBlY3RlZCBPd25lZCBXT2JqZWN0IDwiDQorCQkJPDwgd2ZPYmplY3QtPnN0clVuaXFJZCgpIDw8ICI+IHdpdGggcmVmY291bnQgPCAiDQorCQkJPDwgd2ZPYmplY3QtPmdldFJlZkNvdW50KCkNCisJCQk8PCAiID4gZm9yIGRlc3RydWN0aW9uICEiIDw8IHN0ZDo6ZW5kbDsNCitBVk1fRU5ESUZfREVCVUdfRU5BQkxFRA0KKwkJCQl9DQorDQorCQkJCWVsc2UNCisJCQkJew0KK0FWTV9JRl9ERUJVR19FTkFCTEVEDQorCUFWTV9PU19XQVJOIDw8ICJVbmV4cGVjdGVkIE93bmVkIFdPYmplY3QgPHBvcyAiIDw8IG9mZnNldCA8PCAiOiAiIDw8IHN0ZDo6ZW5kbDsNCisJQVZNX09TX1dBUk4gPDwgd2ZPYmplY3QtPnN0clVuaXFJZCgpIDw8ICI+IHdpdGggcmVmQ291bnQgPT0gMCAhISEiIDw8IHN0ZDo6ZW5kbDsNCitBVk1fRU5ESUZfREVCVUdfRU5BQkxFRA0KKwkJCQl9DQorCQkJfQ0KKw0KKwkJCWVsc2UNCisJCQl7DQorQVZNX0lGX0RFQlVHX0VOQUJMRUQNCisJQVZNX09TX1dBUk4gPDwgIlVuZXhwZWN0ZWQgbm9uLU93bmVkIFdPYmplY3QgPCINCisJCQk8PCB3Zk9iamVjdC0+c3RyVW5pcUlkKCkgPDwgIj4gd2l0aCByZWZjb3VudCA8ICINCisJCQk8PCB3Zk9iamVjdC0+Z2V0UmVmQ291bnQoKQ0KKwkJCTw8ICIgPiBmb3IgZGVzdHJ1Y3Rpb24gISIgPDwgc3RkOjplbmRsOw0KK0FWTV9FTkRJRl9ERUJVR19FTkFCTEVEDQorCQkJfQ0KKwkJfQ0KKw0KKwkJbU93bmVkRWxlbWVudHMuY2xlYXIoKTsNCisJfQ0KK30NCisNCisNCisvKioNCisgKiBERVNUUk9ZDQorICovDQordm9pZCBXT2JqZWN0TWFuYWdlcjo6ZGVzdHJveU1hbmFnZWRFbGVtZW50KCkNCit7DQorCW1UYWJsZU9mUmVnaXN0ZXJlZFdPYmplY3QuY2xlYXIoKTsNCisNCisJaWYoIG1UYWJsZU9mTWFuYWdlZEVsZW1lbnQubm9uZW1wdHkoKSApDQorCXsNCisJCVdPYmplY3QgKiB3Zk9iamVjdCA9IFdPYmplY3Q6Ol9OVUxMXzsNCisNCisJCXN0ZDo6c2l6ZV90IG1hbmFnZWRDb3VudCA9IG1UYWJsZU9mTWFuYWdlZEVsZW1lbnQuc2l6ZSgpOw0KKw0KKy8vQVZNX0lGX0RFQlVHX0VOQUJMRUQNCisvLwlmb3IoIHN0ZDo6c2l6ZV90IG9mZnNldCA9IDAgOyBvZmZzZXQgPCBtYW5hZ2VkQ291bnQgOyArK29mZnNldCkNCisvLwl7DQorLy8JCXdmT2JqZWN0ID0gbVRhYmxlT2ZNYW5hZ2VkRWxlbWVudFsgb2Zmc2V0IF07DQorLy8NCisvLwlBVk1fT1NfREVCVUcgPDwgd2ZPYmplY3QtPmdldE9mZnNldCgpIDw8ICIgQCIgPDwgd2ZPYmplY3QtPnJhd19hZGRyZXNzKCkNCisvLwkJCTw8ICI6IHJlZjwgIiA8PCB3Zk9iamVjdC0+Z2V0UmVmQ291bnQoKSAgPDwgIiA+ICINCisvLwkJCTw8IHdmT2JqZWN0LT5zdHJVbmlxSWQoKSA8PCBzdGQ6OmVuZGw7DQorLy8JfQ0KKy8vQVZNX0VORElGX0RFQlVHX0VOQUJMRUQNCisNCisJCXN0ZDo6c2l6ZV90IGRlc3Ryb3llZENvdW50ID0gMDsNCisJCWZvciggc3RkOjpzaXplX3Qgb2Zmc2V0ID0gbWFuYWdlZENvdW50IDsgb2Zmc2V0ID4gMCA7IC0tb2Zmc2V0KQ0KKwkJew0KKwkJCXdmT2JqZWN0ID0gbVRhYmxlT2ZNYW5hZ2VkRWxlbWVudFsgb2Zmc2V0IC0gMSBdOw0KKw0KKwkJCWlmKCB3Zk9iamVjdCA9PSBXT2JqZWN0OjpfTlVMTF8gKQ0KKwkJCXsNCitBVk1fSUZfREVCVUdfRU5BQkxFRA0KKwlBVk1fT1NfV0FSTiA8PCAiVW5leHBlY3RlZCA8bnVsbD4gYXMgTWFuYWdlZCBXT2JqZWN0IGZvciBkZXN0cnVjdGlvbiAhIg0KKwkJCTw8IHN0ZDo6ZW5kbDsNCitBVk1fRU5ESUZfREVCVUdfRU5BQkxFRA0KKwkJCX0NCisJCQllbHNlIGlmKCB3Zk9iamVjdC0+aXNVbmlxdWUoKSApDQorCQkJew0KKwkJCQkrK2Rlc3Ryb3llZENvdW50Ow0KKw0KKwkJCQlkZWxldGUoIHdmT2JqZWN0ICk7DQorDQorCQkJCXdmT2JqZWN0ID0gV09iamVjdDo6X05VTExfOw0KKwkJCX0NCisNCisJCQllbHNlIGlmKCB3Zk9iamVjdC0+aXNNdWx0aXBsZSgpICkNCisJCQl7DQorQVZNX0lGX0RFQlVHX0VOQUJMRUQNCisJQVZNX09TX1dBUk4gPDwgIkluZGVzdHJ1Y3RpYmxlIE1hbmFnZWQgV09iamVjdCA8cG9zICINCisJCQk8PCB3Zk9iamVjdC0+Z2V0T2Zmc2V0KCkgPDwgIjogIiA8PCBzdGQ6OmZsdXNoOw0KKwlBVk1fT1NfV0FSTiA8PCB3Zk9iamVjdC0+c3RyVW5pcUlkKCkgPDwgIj4gd2l0aCByZWZjb3VudCA8ICINCisJCQk8PCB3Zk9iamVjdC0+Z2V0UmVmQ291bnQoKSA8PCAiID4gZm9yIGRlc3RydWN0aW9uICEiIDw8IHN0ZDo6ZW5kbDsNCitBVk1fRU5ESUZfREVCVUdfRU5BQkxFRA0KKw0KKwkJCXdmT2JqZWN0LT5kZWNyUmVmQ291bnQoKTsNCisJCQl9DQorDQorCQkJZWxzZQ0KKwkJCXsNCitBVk1fSUZfREVCVUdfRU5BQkxFRA0KK0FWTV9PU19XQVJOIDw8ICI+Pj4gVW5leHBlY3RlZCBNYW5hZ2VkIFdPYmplY3QgPCIgPDwgd2ZPYmplY3QtPnN0clVuaXFJZCgpDQorCQk8PCAiPiB3aXRoIHJlZkNvdW50ID09IDAgISEhIiA8PCBzdGQ6OmVuZGw7DQorQVZNX0VORElGX0RFQlVHX0VOQUJMRUQNCisJCQl9DQorCQl9DQorDQorQVZNX0lGX0RFQlVHX0VOQUJMRURfQU5EKCBkZXN0cm95ZWRDb3VudCA8IG1hbmFnZWRDb3VudCApDQorCUFWTV9PU19XQVJOIDw8ICJNYW5hZ2VkIFdPYmplY3QgZGVzdHJ1Y3Rpb24gY291bnQgPCAiIDw8IGRlc3Ryb3llZENvdW50DQorCQkJPDwgIiAvICIgPDwgbWFuYWdlZENvdW50IDw8ICIgPiAhIiA8PCBzdGQ6OmVuZGw7DQorQVZNX0VORElGX0RFQlVHX0VOQUJMRUQNCisJfQ0KK30NCisNCisNCisvKioNCisgKiBGQUNUT1JZDQorICogY29udGFpbmVyIG9mIFdPYmplY3QNCisgKiAhVU5VU0VEIQ0KK1dPYmplY3QgKiBXT2JqZWN0Ojpjb250YWluZXIoKSBjb25zdA0KK3sNCisJV09iamVjdCAqIHdmQ29udGFpbmVyID0gV09iamVjdDo6X05VTExfOw0KKw0KKwlPYmplY3RFbGVtZW50ICogYUNvbnRhaW5lciA9IHRoaXMtPmdldENvbnRhaW5lcigpOw0KKwl3aGlsZSggYUNvbnRhaW5lciAhPSBOVUxMICkNCisJew0KKwkJaWYoIGFDb250YWluZXItPmlzPCBXT2JqZWN0ID4oKSApDQorCQl7DQorCQkJd2ZDb250YWluZXIgPSBhQ29udGFpbmVyLT50bzwgV09iamVjdCA+KCk7DQorCQkJaWYoIHdmQ29udGFpbmVyLT5pc1dUeXBlZE9iamVjdCgpDQorCQkJCXx8IHdmQ29udGFpbmVyLT5pc1dTZXF1ZW5jZSgpICkNCisJCQl7DQorCQkJCXJldHVybiggd2ZDb250YWluZXIgKTsNCisJCQl9DQorCQl9DQorDQorCQlhQ29udGFpbmVyID0gYUNvbnRhaW5lci0+Z2V0Q29udGFpbmVyKCk7DQorCX0NCisNCisJcmV0dXJuKCBXT2JqZWN0OjpfTlVMTF8gKTsNCit9DQorDQorV09iamVjdCAqIFdPYmplY3Q6OnNlcXVlbmNlQ29udGFpbmVyT2YoKSBjb25zdA0KK3sNCisJV09iamVjdCAqIHdmQ29udGFpbmVyID0gV09iamVjdDo6X05VTExfOw0KKw0KKwlPYmplY3RFbGVtZW50ICogYUNvbnRhaW5lciA9IHRoaXMtPmdldENvbnRhaW5lcigpOw0KKwl3aGlsZSggYUNvbnRhaW5lciAhPSBOVUxMICkNCisJew0KKwkJaWYoIGFDb250YWluZXItPmlzPCBXT2JqZWN0ID4oKSApDQorCQl7DQorCQkJd2ZDb250YWluZXIgPSBhQ29udGFpbmVyLT50bzwgV09iamVjdCA+KCk7DQorDQorCQkJaWYoIHdmQ29udGFpbmVyLT5pc1dTZXF1ZW5jZSgpICkNCisJCQl7DQorCQkJCXJldHVybiggd2ZDb250YWluZXIgKTsNCisJCQl9DQorCQkJZWxzZSBpZiggd2ZDb250YWluZXItPmlzV1R5cGVkT2JqZWN0KCkgKQ0KKwkJCXsNCisJCQkJcmV0dXJuKCBXT2JqZWN0OjpfTlVMTF8gKTsNCisJCQl9DQorCQl9DQorDQorCQlhQ29udGFpbmVyID0gYUNvbnRhaW5lci0+Z2V0Q29udGFpbmVyKCk7DQorCX0NCisNCisJcmV0dXJuKCBXT2JqZWN0OjpfTlVMTF8gKTsNCit9DQorKiAhVU5VU0VEIQ0KKyovDQorDQorY29uc3QgV09iamVjdCAqIFdPYmplY3Q6Om9iamVjdENvbnRhaW5lcigpIGNvbnN0DQorew0KKwljb25zdCBXT2JqZWN0ICogd2ZDb250YWluZXIgPSBXT2JqZWN0OjpfTlVMTF87DQorDQorCWNvbnN0IE9iamVjdEVsZW1lbnQgKiBhQ29udGFpbmVyID0gdGhpcy0+Z2V0Q29udGFpbmVyKCk7DQorCXdoaWxlKCBhQ29udGFpbmVyICE9IE5VTEwgKQ0KKwl7DQorCQl3ZkNvbnRhaW5lciA9IGFDb250YWluZXItPnRvPCBXT2JqZWN0ID4oKTsNCisNCisJCWlmKCB3ZkNvbnRhaW5lci0+aXNXVHlwZWRPYmplY3QoKSApDQorCQl7DQorCQkJcmV0dXJuKCB3ZkNvbnRhaW5lciApOw0KKwkJfQ0KKw0KKwkJYUNvbnRhaW5lciA9IGFDb250YWluZXItPmdldENvbnRhaW5lcigpOw0KKwl9DQorDQorCXJldHVybiggV09iamVjdDo6X05VTExfICk7DQorfQ0KKw0KKw0KKy8qKg0KKyAqIFNlcmlhbGl6YXRpb24NCisgKi8NCisNCitzdGQ6OnN0cmluZyBXT2JqZWN0OjpzdHJQcm9wZXJ0eVZhbHVlKCkgY29uc3QNCit7DQorCXN3aXRjaCggbUtpbmQgKQ0KKwl7DQorCQljYXNlIFdPQkpFQ1RfUFJPUEVSVFlfT1BFUkFUT1JfS0lORDoNCisJCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBtT3BlcmF0b3JWYWx1ZSApDQorCQkJCQk8PCAiT3BlcmF0b3IgdmFsdWUgYXMgYWxpYXMgPCAiIDw8IHN0clVuaXFJZCgpIDw8ICIgPiAhIg0KKwkJCQkJPDwgU0VORF9FWElUOw0KKwkJCXJldHVybiggKE9TUygpIDw8ICI8b3A+ICIgPDwgbU9wZXJhdG9yVmFsdWUtPnN0cigpKS5zdHIoKSApOw0KKw0KKwkJY2FzZSBXT0JKRUNUX1BST1BFUlRZX1dSRUZFUkVOQ0VfS0lORDoNCisJCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBtV09qZWN0UmVmZXJlbmNlVmFsdWUgKQ0KKwkJCQkJPDwgIldPamVjdCByZWZlcmVuY2UgdmFsdWUgYXMgYWxpYXMgPCAiDQorCQkJCQk8PCBzdHJVbmlxSWQoKSA8PCAiID4gISINCisJCQkJCTw8IFNFTkRfRVhJVDsNCisJCQlyZXR1cm4oIChPU1MoKSA8PCAiPHJlZj4gIg0KKwkJCQkJPDwgbVdPamVjdFJlZmVyZW5jZVZhbHVlLT5zdHJIZWFkZXIoKSkuc3RyKCkgKTsNCisNCisJCWNhc2UgV09CSkVDVF9QUk9QRVJUWV9CT09MRUFOX0tJTkQ6DQorCQkJcmV0dXJuKCAoT1NTKCkgPDwgIjxib29sPiAiIDw8IG1WYWx1ZS5zdHIoKSkuc3RyKCkgKTsNCisNCisJCWNhc2UgV09CSkVDVF9QUk9QRVJUWV9DSEFSQUNURVJfS0lORDoNCisJCQlyZXR1cm4oIChPU1MoKSA8PCAiPGNoYXI+ICIgPDwgbVZhbHVlLnN0cigpKS5zdHIoKSApOw0KKw0KKwkJY2FzZSBXT0JKRUNUX1BST1BFUlRZX0lOVEVHRVJfS0lORDoNCisJCQlyZXR1cm4oIChPU1MoKSA8PCAiPGludD4gIiA8PCBtVmFsdWUuc3RyKCkpLnN0cigpICk7DQorDQorCQljYXNlIFdPQkpFQ1RfUFJPUEVSVFlfUkFUSU9OQUxfS0lORDoNCisJCQlyZXR1cm4oIChPU1MoKSA8PCAiPHJhdD4gIiA8PCBtVmFsdWUuc3RyKCkpLnN0cigpICk7DQorDQorCQljYXNlIFdPQkpFQ1RfUFJPUEVSVFlfRkxPQVRfS0lORDoNCisJCQlyZXR1cm4oIChPU1MoKSA8PCAiPGZsb2F0PiAiIDw8IG1WYWx1ZS5zdHIoKSkuc3RyKCkgKTsNCisNCisJCWNhc2UgV09CSkVDVF9QUk9QRVJUWV9JREVOVElGSUVSX0tJTkQ6DQorCQkJcmV0dXJuKCAoT1NTKCkgPDwgIjxpZD4gIiA8PCBtVmFsdWUuc3RyKCkpLnN0cigpICk7DQorDQorCQljYXNlIFdPQkpFQ1RfUFJPUEVSVFlfUVVBTElGSUVEX0lERU5USUZJRVJfS0lORDoNCisJCQlyZXR1cm4oIChPU1MoKSA8PCAiPHFpZD4gIiA8PCBtVmFsdWUuc3RyKCkpLnN0cigpICk7DQorDQorCQljYXNlIFdPQkpFQ1RfUFJPUEVSVFlfVU5JUV9GT1JNX0lERU5USUZJRVJfS0lORDoNCisJCQlyZXR1cm4oIChPU1MoKSA8PCAiPHVmaT4gIiA8PCBtVmFsdWUuc3RyKCkpLnN0cigpICk7DQorDQorCQljYXNlIFdPQkpFQ1RfUFJPUEVSVFlfU0lOR0xFX1FVT1RFX1NUUklOR19LSU5EOg0KKwkJCXJldHVybiggKE9TUygpIDw8ICI8c3FzPiAiIDw8IG1WYWx1ZS5zdHIoKSkuc3RyKCkgKTsNCisNCisJCWNhc2UgV09CSkVDVF9QUk9QRVJUWV9ET1VCTEVfUVVPVEVfU1RSSU5HX0tJTkQ6DQorCQljYXNlIFdPQkpFQ1RfUFJPUEVSVFlfU1RSSU5HX0tJTkQ6DQorCQkJcmV0dXJuKCAoT1NTKCkgPDwgIjxkcXM+ICIgPDwgbVZhbHVlLnN0cigpKS5zdHIoKSApOw0KKw0KKwkJY2FzZSBXT0JKRUNUX1BST1BFUlRZX0tJTkQ6DQorCQlkZWZhdWx0Og0KKwkJCXJldHVybiggbVZhbHVlLnN0cigpICk7DQorCX0NCit9DQorDQorDQorDQordm9pZCBXT2JqZWN0OjpzdHJIZWFkZXIoT3V0U3RyZWFtICYgb3MpIGNvbnN0DQorew0KKwlpZiggaXNXUHJvcGVydHkoKSApDQorCXsNCisJCW9zIDw8ICJwcm9wZXJ0eSAiIDw8IGdldE5hbWVJRCgpOw0KKw0KKwkJaWYoIGhhc1JlYWxseVVucmVzdHJpY3RlZE5hbWUoKSApDQorCQl7DQorCQkJb3MgPDwgIiAnIiA8PCBnZXRVbnJlc3RyaWN0ZWROYW1lKCkgPDwgIiciOw0KKwkJfQ0KKw0KKwkJb3MgPDwgIiA9ICIgPDwgc3RyUHJvcGVydHlWYWx1ZSgpOw0KKwl9DQorDQorCWVsc2UgaWYoIGlzV1NlcXVlbmNlKCkgKQ0KKwl7DQorCQlvcyA8PCAic2VxdWVuY2UgIiA8PCBnZXROYW1lSUQoKTsNCisNCisJCWlmKCBoYXNSZWFsbHlVbnJlc3RyaWN0ZWROYW1lKCkgKQ0KKwkJew0KKwkJCW9zIDw8ICIgJyIgPDwgZ2V0VW5yZXN0cmljdGVkTmFtZSgpIDw8ICInIjsNCisJCX0NCisJfQ0KKw0KKwllbHNlDQorCXsNCisJCW9zIDw8ICJvYmplY3QiOw0KKwkJaWYoIGhhc1F1YWxpZmllZFR5cGVOYW1lSUQoKSApDQorCQl7DQorCQkJb3MgPDwgIjwgIiA8PCBnZXRRdWFsaWZpZWRUeXBlTmFtZUlEKCkgPDwgIiA+IjsNCisJCX0NCisNCisJCW9zIDw8ICIgIiA8PCAoIGhhc0Z1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPw0KKwkJCQlnZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDogZ2V0TmFtZUlEKCkgKTsNCisNCisJCWlmKCBoYXNSZWFsbHlVbnJlc3RyaWN0ZWROYW1lKCkgKQ0KKwkJew0KKwkJCW9zIDw8ICIgJyIgPDwgZ2V0VW5yZXN0cmljdGVkTmFtZSgpIDw8ICInIjsNCisJCX0NCisJfQ0KK30NCisNCisNCitzdGF0aWMgc3RkOjpzdHJpbmcgc3RyU3BlY2lmaWVyT3BlcmF0b3IoQVZNX09QQ09ERSBvcGNvZGUpDQorew0KKwlzd2l0Y2goIG9wY29kZSApDQorCXsNCisJCWNhc2UgQVZNX09QQ09ERV9FUSAgIDogICByZXR1cm4oICI9IiAgICk7DQorDQorCQljYXNlIEFWTV9PUENPREVfTkVRICA6ICAgcmV0dXJuKCAiIT0iICApOw0KKwkJY2FzZSBBVk1fT1BDT0RFX1NFUSAgOiAgIHJldHVybiggIj09PSIgKTsNCisJCWNhc2UgQVZNX09QQ09ERV9OU0VRIDogICByZXR1cm4oICI9Lz0iICk7DQorDQorCQljYXNlIEFWTV9PUENPREVfQkFORCA6ICAgcmV0dXJuKCAiJj0iICk7DQorCQljYXNlIEFWTV9PUENPREVfQk9SICA6ICAgcmV0dXJuKCAifD0iICk7DQorCQljYXNlIEFWTV9PUENPREVfQlhPUiA6ICAgcmV0dXJuKCAiXj0iICk7DQorCQljYXNlIEFWTV9PUENPREVfQk5PVCA6ICAgcmV0dXJuKCAifj0iICk7DQorDQorCQljYXNlIEFWTV9PUENPREVfUExVUyA6ICAgcmV0dXJuKCAiKz0iICk7DQorCQljYXNlIEFWTV9PUENPREVfTUlOVVM6ICAgcmV0dXJuKCAiLT0iICk7DQorCQljYXNlIEFWTV9PUENPREVfTU9EICA6ICAgcmV0dXJuKCAiJT0iICk7DQorCQljYXNlIEFWTV9PUENPREVfTVVMVCA6ICAgcmV0dXJuKCAiKj0iICk7DQorCQljYXNlIEFWTV9PUENPREVfRElWICA6ICAgcmV0dXJuKCAiLz0iICk7DQorDQorCQljYXNlIEFWTV9PUENPREVfTFRFICA6ICAgcmV0dXJuKCAiPD0iICk7DQorCQljYXNlIEFWTV9PUENPREVfR1RFICA6ICAgcmV0dXJuKCAiPj0iICk7DQorDQorCQljYXNlIEFWTV9PUENPREVfQVNTSUdOOiAgcmV0dXJuKCAiOj0iICk7DQorDQorCQljYXNlIEFWTV9PUENPREVfQVNTSUdOX01BQ1JPOiAgcmV0dXJuKCAiOjo9IiApOw0KKw0KKwkJZGVmYXVsdDogIHJldHVybiggIm9wY29kZSN1bmtub3duIiApOw0KKwl9DQorfQ0KKw0KKw0KK3ZvaWQgV09iamVjdDo6dG9TdHJlYW1XUHJvcGVydHkoT3V0U3RyZWFtICYgb3MpIGNvbnN0DQorew0KKwlvcyA8PCBUQUI7Ly8gPDwgZ2V0TmFtZUlEKCk7DQorDQorLy8gVFJBQ0UgTElORQ0KK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQQVJTSU5HICkNCisJb3MgPDwgdHJhY2VMaW5lKCIiLCBmYWxzZSkgPDwgIiAiOw0KK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQQVJTSU5HICkNCisNCisJb3MgPDwgZ2V0TmFtZUlEKCk7DQorDQorCWlmKCBoYXNWYWx1ZSgpICkNCisJew0KKwkJaWYoIGdldFZhbHVlKCkuaXM8IEF2bUNvZGUgPigpICkNCisJCXsNCisJCQlBdm1Db2RlICogYUNvZGUgPSBnZXRWYWx1ZSgpLnRvX3B0cjwgQXZtQ29kZSA+KCk7DQorDQorCQkJaWYoIFN0YXRlbWVudFR5cGVDaGVja2VyOjppc1NjaGVkdWxlKGFDb2RlKSApDQorCQkJew0KKwkJCQlvcyA8PCAiID0gJCIgPDwgSUdOT1JFX0ZJUlNUX1RBQjsNCisJCQkJYUNvZGUtPnRvU3RyZWFtKG9zKTsNCisJCQl9DQorCQkJZWxzZQ0KKwkJCXsNCisJCQkJb3MgPDwgIiA9ICR7IiA8PCBFT0xfSU5DUl9JTkRFTlQ7DQorCQkJCWdldFZhbHVlKCkudG9TdHJlYW0ob3MpOw0KKwkJCQlvcyA8PCBERUNSX0lOREVOVF9UQUIgPDwgIn0iOw0KKwkJCX0NCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQlvcyA8PCAiICIgPDwgc3RyU3BlY2lmaWVyT3BlcmF0b3IoIG1TcGVjaWZpZXJPcCApOw0KKwkJCWlmKCBnZXRWYWx1ZSgpLmlzPCBPcGVyYXRvciA+KCkgKQ0KKwkJCXsNCisJCQkJZ2V0VmFsdWUoKS50b19wdHI8IE9wZXJhdG9yID4oKS0+c3RhbmRhcmRTeW1ib2woKTsNCisJCQl9DQorCQkJZWxzZSBpZiggaXNXUHJvcGVydHlXUmVmZXJlbmNlKCkgKQ0KKwkJCXsNCisJCQkJb3MgPDwgIiAmIiA8PCBnZXRXUmVmZXJlbmNlVmFsdWUoKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsNCisJCQl9DQorCQkJZWxzZQ0KKwkJCXsNCisJCQkJb3MgPDwgIiAiIDw8IHN0clByb3BlcnR5VmFsdWUoKTsNCisJCQl9DQorCQl9DQorCX0NCisJZWxzZQ0KKwl7DQorCQlvcyA8PCAiICIgPDwgc3RyUHJvcGVydHlWYWx1ZSgpOw0KKwl9DQorDQorDQorLy8gVFJBQ0UgTElORQ0KKy8vQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBBUlNJTkcgKQ0KKy8vCW9zIDw8IHRyYWNlTGluZSgiICIpOw0KKy8vQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBBUlNJTkcgKQ0KKw0KKwlBVk1fREVCVUdfUkVGX0NPVU5URVIob3MpOw0KKw0KKwlvcyA8PCBFT0xfRkxVU0g7DQorfQ0KKw0KKw0KK3ZvaWQgV09iamVjdDo6dG9TdHJlYW1Pd25lZEVsZW1lbnQoT3V0U3RyZWFtICYgb3MsDQorCQljb25zdCBzdGQ6OnN0cmluZyAmIGJlZ2luRGVsaW1pdGVyLA0KKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBlbmREZWxpbWl0ZXIpIGNvbnN0DQorew0KKwlvcyA8PCBiZWdpbkRlbGltaXRlcjsgIEFWTV9ERUJVR19SRUZfQ09VTlRFUihvcyk7DQorDQorLy8gVFJBQ0UgTElORQ0KK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQQVJTSU5HICkNCisJb3MgPDwgdHJhY2VMaW5lKCIgIik7DQorQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFBBUlNJTkcgKQ0KKw0KKwlvcyA8PCBFT0xfSU5DUl9JTkRFTlQ7DQorDQorCVRhYmxlT2ZPd25lZEVsZW1lbnQ6OmNvbnN0X2l0ZXJhdG9yIGl0RWxlbWVudCA9IG1Pd25lZEVsZW1lbnRzLmJlZ2luKCk7DQorCVRhYmxlT2ZPd25lZEVsZW1lbnQ6OmNvbnN0X2l0ZXJhdG9yIGVuZEVsZW1lbnQgPSBtT3duZWRFbGVtZW50cy5lbmQoKTsNCisJZm9yKCA7IGl0RWxlbWVudCAhPSBlbmRFbGVtZW50IDsgKytpdEVsZW1lbnQgKQ0KKwl7DQorCQlpZiggKCppdEVsZW1lbnQpICE9IE5VTEwgKQ0KKwkJew0KKwkJCWlmKCAoKml0RWxlbWVudCktPmdldENvbnRhaW5lcigpICE9IHRoaXMgKQ0KKwkJCXsNCisJCQkJb3MgPDwgVEFCIDw8ICImIiA8PCAoKml0RWxlbWVudCkNCisJCQkJCQktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkNCisvLwkJCQlvcyA8PCBUQUIgPDwgKCppdEVsZW1lbnQpLT5nZXROYW1lSUQoKQ0KKwkJCQkJCTw8IEVPTF9GTFVTSDsNCisJCQl9DQorCQkJZWxzZQ0KKwkJCXsNCisJCQkJKCppdEVsZW1lbnQpLT50b1N0cmVhbShvcyk7DQorCQkJfQ0KKwkJfQ0KKwkJZWxzZQ0KKwkJew0KKwkJCW9zIDw8IFRBQiA8PCAiTlVMTCIgPDwgRU9MX0ZMVVNIOw0KKwkJfQ0KKwl9DQorDQorCW9zIDw8IERFQ1JfSU5ERU5UX1RBQiA8PCBlbmREZWxpbWl0ZXI7DQorDQorCS8vIFRSQUNFIExJTkUNCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgUEFSU0lORyApDQorCW9zIDw8IHRyYWNlTGluZSgiICIpOw0KK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBQQVJTSU5HICkNCit9DQorDQorDQorDQorDQorLyoqDQorICogcmV0dXJuIEZ1bGx5UXVhbGlmaWVkTmFtZUlEICsgJy4nIGFOYW1lSUQNCisgKi8NCitzdGQ6OnN0cmluZyBXT2JqZWN0TWFuYWdlcjo6bWFrZUZRTigNCisJCVdPYmplY3QgKiB3Zk9iamVjdCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKSBjb25zdA0KK3sNCisJaWYoIHdmT2JqZWN0ID09IFdPYmplY3Q6Ol9OVUxMXyApDQorCXsNCisJCXJldHVybiggYU5hbWVJRCApOw0KKwl9DQorCWVsc2UgaWYoIHdmT2JqZWN0ID09ICYoUk9PVF9XT0JKRUNUKSApDQorCXsNCisJCXJldHVybiggUk9PVF9XT0JKRUNULmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgKyBhTmFtZUlEICk7DQorCX0NCisJZWxzZSBpZiggd2ZPYmplY3QtPmlzV1R5cGVkT2JqZWN0KCkgKQ0KKwl7DQorCQlyZXR1cm4oIHdmT2JqZWN0LT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpICsgIi4iICsgYU5hbWVJRCApOw0KKwl9DQorCWVsc2UNCisJew0KKwkJY29uc3QgT2JqZWN0RWxlbWVudCAqIGFDb250YWluZXIgPSB3Zk9iamVjdC0+Z2V0Q29udGFpbmVyKCk7DQorCQl3aGlsZSggYUNvbnRhaW5lciAhPSBOVUxMICkNCisJCXsNCisJCQlpZiggYUNvbnRhaW5lci0+dG88IFdPYmplY3QgPigpLT5pc1dUeXBlZE9iamVjdCgpICkNCisJCQl7DQorCQkJCXJldHVybiggYUNvbnRhaW5lci0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQ0KKwkJCQkJCSsgIi4iICsgYU5hbWVJRCApOw0KKwkJCX0NCisNCisJCQlhQ29udGFpbmVyID0gYUNvbnRhaW5lci0+Z2V0Q29udGFpbmVyKCk7DQorCQl9DQorCX0NCisNCisJcmV0dXJuKCBhTmFtZUlEICk7DQorfQ0KKw0KKw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gUFJPUEVSVFkgQ1JFQVRJT04gRkFDVE9SWQ0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKw0KKy8qKg0KKyAqIGNyZWF0ZSBXb3JrZmxvdy1Qcm9wZXJ0eQ0KKyAqLw0KK1dPYmplY3QgKiBXT2JqZWN0TWFuYWdlcjo6bmV3V1Byb3BlcnR5RXhwcmVzc2lvbihXT2JqZWN0ICogd2ZDb250YWluZXIsDQorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsIGNvbnN0IEJGICYgdmFsdWUpDQorew0KKwlXT2JqZWN0ICogd2ZPYmplY3QgPSBXT2JqZWN0OjpfTlVMTF87DQorDQorCXN3aXRjaCggdmFsdWUuY2xhc3NLaW5kKCkgKQ0KKwl7DQorCQljYXNlIEZPUk1fQlVJTFRJTl9CT09MRUFOX0tJTkQ6DQorCQl7DQorCQkJd2ZPYmplY3QgPSBuZXcgV09iamVjdCggKCp0aGlzKSwgd2ZDb250YWluZXIsDQorCQkJCQlXT2JqZWN0OjpXT0JKRUNUX1BST1BFUlRZX0JPT0xFQU5fS0lORCwgYU5hbWVJRCwgdmFsdWUgKTsNCisNCisJCQlicmVhazsNCisJCX0NCisNCisJCWNhc2UgRk9STV9CVUlMVElOX0NIQVJBQ1RFUl9LSU5EOg0KKwkJew0KKwkJCXdmT2JqZWN0ID0gbmV3IFdPYmplY3QoICgqdGhpcyksIHdmQ29udGFpbmVyLA0KKwkJCQkJV09iamVjdDo6V09CSkVDVF9QUk9QRVJUWV9DSEFSQUNURVJfS0lORCwgYU5hbWVJRCwgdmFsdWUgKTsNCisNCisJCQlicmVhazsNCisJCX0NCisNCisJCWNhc2UgRk9STV9CVUlMVElOX0lOVEVHRVJfS0lORDoNCisJCXsNCisJCQl3Zk9iamVjdCA9IG5ldyBXT2JqZWN0KCAoKnRoaXMpLCB3ZkNvbnRhaW5lciwNCisJCQkJCVdPYmplY3Q6OldPQkpFQ1RfUFJPUEVSVFlfSU5URUdFUl9LSU5ELCBhTmFtZUlELCB2YWx1ZSApOw0KKw0KKwkJCWJyZWFrOw0KKwkJfQ0KKw0KKwkJY2FzZSBGT1JNX0JVSUxUSU5fUkFUSU9OQUxfS0lORDoNCisJCXsNCisJCQl3Zk9iamVjdCA9IG5ldyBXT2JqZWN0KCAoKnRoaXMpLCB3ZkNvbnRhaW5lciwNCisJCQkJCVdPYmplY3Q6OldPQkpFQ1RfUFJPUEVSVFlfUkFUSU9OQUxfS0lORCwgYU5hbWVJRCwgdmFsdWUgKTsNCisNCisJCQlicmVhazsNCisJCX0NCisNCisJCWNhc2UgRk9STV9CVUlMVElOX0ZMT0FUX0tJTkQ6DQorCQl7DQorCQkJd2ZPYmplY3QgPSBuZXcgV09iamVjdCggKCp0aGlzKSwgd2ZDb250YWluZXIsDQorCQkJCQlXT2JqZWN0OjpXT0JKRUNUX1BST1BFUlRZX0ZMT0FUX0tJTkQsIGFOYW1lSUQsIHZhbHVlICk7DQorDQorCQkJYnJlYWs7DQorCQl9DQorDQorCQljYXNlIEZPUk1fQlVJTFRJTl9TVFJJTkdfS0lORDoNCisJCXsNCisJCQl3Zk9iamVjdCA9IG5ldyBXT2JqZWN0KCAoKnRoaXMpLCB3ZkNvbnRhaW5lciwNCisJCQkJCXZhbHVlLnRvX3B0cjwgU3RyaW5nID4oKS0+aXNTaW5nbGVRdW90ZSgpDQorCQkJCQkJPyBXT2JqZWN0OjpXT0JKRUNUX1BST1BFUlRZX1NJTkdMRV9RVU9URV9TVFJJTkdfS0lORA0KKwkJCQkJCTogV09iamVjdDo6V09CSkVDVF9QUk9QRVJUWV9ET1VCTEVfUVVPVEVfU1RSSU5HX0tJTkQsDQorCQkJCQlhTmFtZUlELCB2YWx1ZSApOw0KKw0KKwkJCWJyZWFrOw0KKwkJfQ0KKw0KKwkJY2FzZSBGT1JNX0JVSUxUSU5fSURFTlRJRklFUl9LSU5EOg0KKwkJew0KKwkJCXdmT2JqZWN0ID0gbmV3IFdPYmplY3QoICgqdGhpcyksIHdmQ29udGFpbmVyLA0KKwkJCQkJV09iamVjdDo6V09CSkVDVF9QUk9QRVJUWV9JREVOVElGSUVSX0tJTkQsIGFOYW1lSUQsIHZhbHVlICk7DQorDQorCQkJYnJlYWs7DQorCQl9DQorCQljYXNlIEZPUk1fQlVJTFRJTl9RVUFMSUZJRURfSURFTlRJRklFUl9LSU5EOg0KKwkJew0KKwkJCXdmT2JqZWN0ID0gbmV3IFdPYmplY3QoICgqdGhpcyksIHdmQ29udGFpbmVyLA0KKwkJCQkJV09iamVjdDo6V09CSkVDVF9QUk9QRVJUWV9RVUFMSUZJRURfSURFTlRJRklFUl9LSU5ELA0KKwkJCQkJYU5hbWVJRCwgdmFsdWUgKTsNCisNCisJCQlicmVhazsNCisJCX0NCisNCisJCWNhc2UgRk9STV9VRklfS0lORDoNCisJCXsNCisJCQlpZiggdmFsdWUudG9fcHRyPCBVbmlGb3JtSWRlbnRpZmllciA+KCktPmlzUHVyZUlkZW50aWZpZXIoKSApDQorCQkJew0KKwkJCQl3Zk9iamVjdCA9IG5ldyBXT2JqZWN0KCAoKnRoaXMpLCB3ZkNvbnRhaW5lciwNCisJCQkJCQlXT2JqZWN0OjpXT0JKRUNUX1BST1BFUlRZX0lERU5USUZJRVJfS0lORCwNCisJCQkJCQlhTmFtZUlELCB2YWx1ZSApOw0KKwkJCX0NCisJCQllbHNlDQorCQkJew0KKwkJCQl3Zk9iamVjdCA9IG5ldyBXT2JqZWN0KCAoKnRoaXMpLCB3ZkNvbnRhaW5lciwNCisJCQkJCQlXT2JqZWN0OjpXT0JKRUNUX1BST1BFUlRZX1VOSVFfRk9STV9JREVOVElGSUVSX0tJTkQsDQorCQkJCQkJYU5hbWVJRCwgdmFsdWUgKTsNCisJCQl9DQorDQorCQkJYnJlYWs7DQorCQl9DQorDQorCQljYXNlIEZPUk1fV09CSkVDVF9LSU5EOg0KKwkJew0KKwkJCXZhbHVlLmluY3JSZWZDb3VudCgpOw0KKw0KKwkJCXdmT2JqZWN0ID0gbmV3IFdPYmplY3QoICgqdGhpcyksIHdmQ29udGFpbmVyLA0KKwkJCQkJYU5hbWVJRCwgdmFsdWUudG9fcHRyPCBXT2JqZWN0ID4oKSApOw0KKw0KKwkJCWJyZWFrOw0KKwkJfQ0KKw0KKwkJY2FzZSBGT1JNX0FSUkFZX0JPT0xFQU5fS0lORDoNCisJCWNhc2UgRk9STV9BUlJBWV9DSEFSQUNURVJfS0lORDoNCisJCWNhc2UgRk9STV9BUlJBWV9JTlRFR0VSX0tJTkQ6DQorCQljYXNlIEZPUk1fQVJSQVlfUkFUSU9OQUxfS0lORDoNCisJCWNhc2UgRk9STV9BUlJBWV9GTE9BVF9LSU5EOg0KKwkJY2FzZSBGT1JNX0FSUkFZX1NUUklOR19LSU5EOg0KKwkJY2FzZSBGT1JNX0FSUkFZX0lERU5USUZJRVJfS0lORDoNCisJCWNhc2UgRk9STV9BUlJBWV9RVUFMSUZJRURfSURFTlRJRklFUl9LSU5EOg0KKwkJY2FzZSBGT1JNX0FSUkFZX0JGX0tJTkQ6DQorCQl7DQorCQkJd2ZPYmplY3QgPSBuZXcgV09iamVjdCggKCp0aGlzKSwgd2ZDb250YWluZXIsDQorCQkJCQlXT2JqZWN0OjpXT0JKRUNUX1BST1BFUlRZX0FSUkFZX0tJTkQsIGFOYW1lSUQsIHZhbHVlICk7DQorDQorCQkJYnJlYWs7DQorCQl9DQorDQorCQljYXNlIEZPUk1fWEZTUF9WQVJJQUJMRV9LSU5EOg0KKwkJY2FzZSBGT1JNX0lOU1RBTkNFX0RBVEFfS0lORDoNCisJCWNhc2UgRk9STV9BVk1DT0RFX0tJTkQ6DQorCQlkZWZhdWx0Og0KKwkJew0KKwkJCXdmT2JqZWN0ID0gbmV3IFdPYmplY3QoICgqdGhpcyksIHdmQ29udGFpbmVyLCBhTmFtZUlELCB2YWx1ZSApOw0KKw0KKwkJCWJyZWFrOw0KKwkJfQ0KKwl9DQorDQorCXJldHVybiggbWFuYWdlKCB3Zk9iamVjdCApICk7DQorfQ0KKw0KK1dPYmplY3QgKiBXT2JqZWN0TWFuYWdlcjo6bmV3V1Byb3BlcnR5Qm9vbGVhbihXT2JqZWN0ICogd2ZDb250YWluZXIsDQorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsIGJvb2wgYUJvb2xlYW5WYWx1ZSkNCit7DQorCVdPYmplY3QgKiB3Zk9iamVjdCA9IG5ldyBXT2JqZWN0KCAoKnRoaXMpLCB3ZkNvbnRhaW5lciwNCisJCQlXT2JqZWN0OjpXT0JKRUNUX1BST1BFUlRZX0JPT0xFQU5fS0lORCwgYU5hbWVJRCwNCisJCQlFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oYUJvb2xlYW5WYWx1ZSkgKTsNCisNCisJcmV0dXJuKCBtYW5hZ2UoIHdmT2JqZWN0ICkgKTsNCit9DQorDQorV09iamVjdCAqIFdPYmplY3RNYW5hZ2VyOjpuZXdXUHJvcGVydHlDaGFyYWN0ZXIoV09iamVjdCAqIHdmQ29udGFpbmVyLA0KKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELCBjaGFyIGFDaGFyYWN0ZXJWYWx1ZSkNCit7DQorCVdPYmplY3QgKiB3Zk9iamVjdCA9IG5ldyBXT2JqZWN0KCAoKnRoaXMpLCB3ZkNvbnRhaW5lciwNCisJCQlXT2JqZWN0OjpXT0JKRUNUX1BST1BFUlRZX0NIQVJBQ1RFUl9LSU5ELCBhTmFtZUlELA0KKwkJCUV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q2hhcihhQ2hhcmFjdGVyVmFsdWUpICk7DQorDQorCXJldHVybiggbWFuYWdlKCB3Zk9iamVjdCApICk7DQorfQ0KKw0KKw0KK1dPYmplY3QgKiBXT2JqZWN0TWFuYWdlcjo6bmV3V1Byb3BlcnR5SW50ZWdlcihXT2JqZWN0ICogd2ZDb250YWluZXIsDQorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsIGF2bV9pbnRlZ2VyX3QgYW5JbnRlZ2VyVmFsdWUpDQorew0KKwlXT2JqZWN0ICogd2ZPYmplY3QgPSBuZXcgV09iamVjdCggKCp0aGlzKSwgd2ZDb250YWluZXIsDQorCQkJV09iamVjdDo6V09CSkVDVF9QUk9QRVJUWV9JTlRFR0VSX0tJTkQsIGFOYW1lSUQsDQorCQkJRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdJbnRlZ2VyKGFuSW50ZWdlclZhbHVlKSApOw0KKw0KKwlyZXR1cm4oIG1hbmFnZSggd2ZPYmplY3QgKSApOw0KK30NCisNCitXT2JqZWN0ICogV09iamVjdE1hbmFnZXI6Om5ld1dQcm9wZXJ0eUludGVnZXIoV09iamVjdCAqIHdmQ29udGFpbmVyLA0KKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELCBjb25zdCBzdGQ6OnN0cmluZyAmIGFuSW50ZWdlclZhbHVlKQ0KK3sNCisJV09iamVjdCAqIHdmT2JqZWN0ID0gbmV3IFdPYmplY3QoICgqdGhpcyksIHdmQ29udGFpbmVyLA0KKwkJCVdPYmplY3Q6OldPQkpFQ1RfUFJPUEVSVFlfSU5URUdFUl9LSU5ELCBhTmFtZUlELA0KKwkJCUV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3SW50ZWdlcihhbkludGVnZXJWYWx1ZSkgKTsNCisNCisJcmV0dXJuKCBtYW5hZ2UoIHdmT2JqZWN0ICkgKTsNCit9DQorDQorDQorV09iamVjdCAqIFdPYmplY3RNYW5hZ2VyOjpuZXdXUHJvcGVydHlGbG9hdChXT2JqZWN0ICogd2ZDb250YWluZXIsDQorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsIGRvdWJsZSBhRmxvYXRWYWx1ZSkNCit7DQorCVdPYmplY3QgKiB3Zk9iamVjdCA9IG5ldyBXT2JqZWN0KCAoKnRoaXMpLCB3ZkNvbnRhaW5lciwNCisJCQlXT2JqZWN0OjpXT0JKRUNUX1BST1BFUlRZX0ZMT0FUX0tJTkQsIGFOYW1lSUQsDQorCQkJRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdGbG9hdChhRmxvYXRWYWx1ZSkgKTsNCisNCisJcmV0dXJuKCBtYW5hZ2UoIHdmT2JqZWN0ICkgKTsNCit9DQorDQorV09iamVjdCAqIFdPYmplY3RNYW5hZ2VyOjpuZXdXUHJvcGVydHlGbG9hdChXT2JqZWN0ICogd2ZDb250YWluZXIsDQorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYUZsb2F0VmFsdWUpDQorew0KKwlXT2JqZWN0ICogd2ZPYmplY3QgPSBuZXcgV09iamVjdCggKCp0aGlzKSwgd2ZDb250YWluZXIsDQorCQkJV09iamVjdDo6V09CSkVDVF9QUk9QRVJUWV9GTE9BVF9LSU5ELCBhTmFtZUlELA0KKwkJCUV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3RmxvYXQoYUZsb2F0VmFsdWUpICk7DQorDQorCXJldHVybiggbWFuYWdlKCB3Zk9iamVjdCApICk7DQorfQ0KKw0KKw0KK1dPYmplY3QgKiBXT2JqZWN0TWFuYWdlcjo6bmV3V1Byb3BlcnR5U2luZ2xlUXVvdGVTdHJpbmcoV09iamVjdCAqIHdmQ29udGFpbmVyLA0KKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELCBjb25zdCBzdGQ6OnN0cmluZyAmIGFTdHJpbmdWYWx1ZSkNCit7DQorCVdPYmplY3QgKiB3Zk9iamVjdCA9IG5ldyBXT2JqZWN0KCAoKnRoaXMpLCB3ZkNvbnRhaW5lciwNCisJCQlXT2JqZWN0OjpXT0JKRUNUX1BST1BFUlRZX1NJTkdMRV9RVU9URV9TVFJJTkdfS0lORCwgYU5hbWVJRCwNCisJCQlFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld1NpbmdsZVF1b3RlU3RyaW5nKGFTdHJpbmdWYWx1ZSkgKTsNCisNCisJcmV0dXJuKCBtYW5hZ2UoIHdmT2JqZWN0ICkgKTsNCit9DQorDQorV09iamVjdCAqIFdPYmplY3RNYW5hZ2VyOjpuZXdXUHJvcGVydHlEb3VibGVRdW90ZVN0cmluZyhXT2JqZWN0ICogd2ZDb250YWluZXIsDQorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYVN0cmluZ1ZhbHVlKQ0KK3sNCisJV09iamVjdCAqIHdmT2JqZWN0ID0gbmV3IFdPYmplY3QoICgqdGhpcyksIHdmQ29udGFpbmVyLA0KKwkJCVdPYmplY3Q6OldPQkpFQ1RfUFJPUEVSVFlfRE9VQkxFX1FVT1RFX1NUUklOR19LSU5ELCBhTmFtZUlELA0KKwkJCUV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3RG91YmxlUXVvdGVTdHJpbmcoYVN0cmluZ1ZhbHVlKSApOw0KKw0KKwlyZXR1cm4oIG1hbmFnZSggd2ZPYmplY3QgKSApOw0KK30NCisNCitXT2JqZWN0ICogV09iamVjdE1hbmFnZXI6Om5ld1dQcm9wZXJ0eVN0cmluZyhXT2JqZWN0ICogd2ZDb250YWluZXIsDQorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYVN0cmluZ1ZhbHVlKQ0KK3sNCisJV09iamVjdCAqIHdmT2JqZWN0ID0gbmV3IFdPYmplY3QoICgqdGhpcyksIHdmQ29udGFpbmVyLA0KKwkJCVdPYmplY3Q6OldPQkpFQ1RfUFJPUEVSVFlfRE9VQkxFX1FVT1RFX1NUUklOR19LSU5ELCBhTmFtZUlELA0KKwkJCUV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3RG91YmxlUXVvdGVTdHJpbmcoYVN0cmluZ1ZhbHVlKSApOw0KKw0KKwlyZXR1cm4oIG1hbmFnZSggd2ZPYmplY3QgKSApOw0KK30NCisNCisNCitXT2JqZWN0ICogV09iamVjdE1hbmFnZXI6Om5ld1dQcm9wZXJ0eUlkZW50aWZpZXIoV09iamVjdCAqIHdmQ29udGFpbmVyLA0KKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELCBjb25zdCBzdGQ6OnN0cmluZyAmIGFTdHJpbmdWYWx1ZSkNCit7DQorCVdPYmplY3QgKiB3Zk9iamVjdCA9IG5ldyBXT2JqZWN0KCAoKnRoaXMpLCB3ZkNvbnRhaW5lciwNCisJCQlXT2JqZWN0OjpXT0JKRUNUX1BST1BFUlRZX0lERU5USUZJRVJfS0lORCwgYU5hbWVJRCwNCisJCQlFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0lkZW50aWZpZXIoYVN0cmluZ1ZhbHVlKSApOw0KKw0KKwlyZXR1cm4oIG1hbmFnZSggd2ZPYmplY3QgKSApOw0KK30NCisNCitXT2JqZWN0ICogV09iamVjdE1hbmFnZXI6Om5ld1dQcm9wZXJ0eVF1YWxpZmllZElkZW50aWZpZXIoV09iamVjdCAqIHdmQ29udGFpbmVyLA0KKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELCBjb25zdCBzdGQ6OnN0cmluZyAmIGFTdHJpbmdWYWx1ZSkNCit7DQorCVdPYmplY3QgKiB3Zk9iamVjdCA9IG5ldyBXT2JqZWN0KCAoKnRoaXMpLCB3ZkNvbnRhaW5lciwNCisJCQlXT2JqZWN0OjpXT0JKRUNUX1BST1BFUlRZX1FVQUxJRklFRF9JREVOVElGSUVSX0tJTkQsIGFOYW1lSUQsDQorCQkJRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdRdWFsaWZpZWRJZGVudGlmaWVyKGFTdHJpbmdWYWx1ZSkgKTsNCisNCisJcmV0dXJuKCBtYW5hZ2UoIHdmT2JqZWN0ICkgKTsNCit9DQorDQorV09iamVjdCAqIFdPYmplY3RNYW5hZ2VyOjpuZXdXUHJvcGVydHlVbmlGb3JtSWRlbnRpZmllcihXT2JqZWN0ICogd2ZDb250YWluZXIsDQorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsIFVuaUZvcm1JZGVudGlmaWVyICogYW5VRkkpDQorew0KKwlXT2JqZWN0ICogd2ZPYmplY3QgPSBuZXcgV09iamVjdCggKCp0aGlzKSwgd2ZDb250YWluZXIsDQorCQkJV09iamVjdDo6V09CSkVDVF9QUk9QRVJUWV9VTklRX0ZPUk1fSURFTlRJRklFUl9LSU5ELA0KKwkJCWFOYW1lSUQsIEJGKGFuVUZJKSApOw0KKw0KKwlyZXR1cm4oIG1hbmFnZSggd2ZPYmplY3QgKSApOw0KK30NCisNCisNCitXT2JqZWN0ICogV09iamVjdE1hbmFnZXI6Om5ld1dQcm9wZXJ0eVBhcnNlZElkZW50aWZpZXIoV09iamVjdCAqIHdmQ29udGFpbmVyLA0KKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELCBjb25zdCBCRiAmIHZhbHVlKQ0KK3sNCisJV09iamVjdCAqIHdmT2JqZWN0ID0gZ2V0UmVnaXN0ZXJlZFdPYmplY3QoIHZhbHVlLnN0cigpICk7DQorCWlmKCB3Zk9iamVjdCAhPSBXT2JqZWN0OjpfTlVMTF8gKQ0KKwl7DQorCQlyZXR1cm4oIG5ld1dQcm9wZXJ0eVJlZmVyZW5jZSh3ZkNvbnRhaW5lciwgYU5hbWVJRCwgd2ZPYmplY3QpICk7DQorCX0NCisJZWxzZQ0KKwl7DQorCQlyZXR1cm4oIG5ld1dQcm9wZXJ0eUV4cHJlc3Npb24od2ZDb250YWluZXIsIGFOYW1lSUQsIHZhbHVlKSApOw0KKwl9DQorDQorfQ0KKw0KKw0KK30gLyogbmFtZXNwYWNlIHNlcCAqLw0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC93b3JrZmxvdy9XT2JqZWN0LmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvd29ya2Zsb3cvV09iamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NDIxYTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvd29ya2Zsb3cvV09iamVjdC5oCkBAIC0wLDAgKzEsMTAzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuDQorICoNCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ3JlYXRlZCBvbjogMjMgbWFycyAyMDE2DQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnINCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaWZuZGVmIEZNTF9XT1JLRkxPV19XT0JKRUNUX0hfDQorI2RlZmluZSBGTUxfV09SS0ZMT1dfV09CSkVDVF9IXw0KKw0KKyNpbmNsdWRlIDxmbWwvY29tbW9uL09iamVjdEVsZW1lbnQuaD4NCisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1dQcm9wZXJ0eUltcGwuaD4NCisNCisjaW5jbHVkZSA8Y29tbW9uL0F2bVBvaW50ZXIuaD4NCisjaW5jbHVkZSA8Y29tbW9uL0JGLmg+DQorDQorI2luY2x1ZGUgPGNvbGxlY3Rpb24vVmVjdG9yLmg+DQorDQorLy8jaW5jbHVkZSA8Zm1sL2J1aWx0aW4vSWRlbnRpZmllci5oPg0KKy8vI2luY2x1ZGUgPGZtbC9idWlsdGluL1F1YWxpZmllZElkZW50aWZpZXIuaD4NCisvLyNpbmNsdWRlIDxmbWwvYnVpbHRpbi9TdHJpbmcuaD4NCisvLw0KKy8vI2luY2x1ZGUgPGZtbC9udW1lcmljL0Zsb2F0Lmg+DQorLy8jaW5jbHVkZSA8Zm1sL251bWVyaWMvSW50ZWdlci5oPg0KKy8vI2luY2x1ZGUgPGZtbC9udW1lcmljL1JhdGlvbmFsLmg+DQorDQorI2luY2x1ZGUgPGZtbC9vcGVyYXRvci9PcGVyYXRvckxpYi5oPg0KKw0KKyNpbmNsdWRlIDx1dGlsL2F2bV9zdHJpbmcuaD4NCisNCisjaW5jbHVkZSA8bWFwPg0KKw0KKw0KK25hbWVzcGFjZSBzZXANCit7DQorDQorY2xhc3MgQnVpbHRpbkZvcm07DQorDQorY2xhc3MgT3BlcmF0b3I7DQorDQorY2xhc3MgUGFpck91dFN0cmVhbTsNCisNCitjbGFzcyBRdWVyeTsNCitjbGFzcyBXT2JqZWN0Ow0KK2NsYXNzIFdPYmplY3RNYW5hZ2VyOw0KKw0KK2NsYXNzIFVuaUZvcm1JZGVudGlmaWVyOw0KKw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gU1lTVEVNIFNNQVJUIFBPSU5URVINCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKw0KK2NsYXNzIFdPYmplY3QgOg0KKwlwdWJsaWMgT2JqZWN0RWxlbWVudCwNCisJcHVibGljIFdQcm9wZXJ0eUltcGwsDQorCUFWTV9JTkpFQ1RfSU5TVEFOQ0VfQ09VTlRFUl9DTEFTUyggV09iamVjdCApDQorew0KKw0KKwlmcmllbmQgY2xhc3MgUXVlcnk7DQorCWZyaWVuZCBjbGFzcyBXT2JqZWN0TWFuYWdlcjsNCisNCisJQVZNX0RFQ0xBUkVfQ0xPTkFCTEVfQ0xBU1MoIFdPYmplY3QgKQ0KKw0KK3B1YmxpYzoNCisJLyoqDQorCSAqIFRZUEVERUYNCisJICovDQorCXR5cGVkZWYgVmVjdG9yPCBXT2JqZWN0ICogPiAgICAgICAgICAgICAgICAgIFRhYmxlT2ZPd25lZEVsZW1lbnQ7DQorDQorCXR5cGVkZWYgVGFibGVPZk93bmVkRWxlbWVudDo6Y29uc3RfaXRlcmF0b3IgIGNvbnN0X2l0ZXJhdG9yOw0KKw0KK3Byb3RlY3RlZDoNCisJLyoqDQorCSAqIEVOVU0NCisJICovDQorCWVudW0gRU5VTV9XT0JKRUNUX0tJTkQNCisJew0KKwkJLy8gVU5ERUZJTkVEDQorCQlXT0JKRUNUX1VOREVGSU5FRF9LSU5EICAgICAgICAgICAgICAgICAgICAgPSAweDAwMCwNCisNCisNCisJCVdPQkpFQ1RfUFJPUEVSVFlfQk9PTEVBTl9LSU5EICAgICAgICAgICAgICA9IDB4MDAxLA0KKw0KKwkJV09CSkVDVF9QUk9QRVJUWV9DSEFSQUNURVJfS0lORCAgICAgICAgICAgID0gMHgwMDIsDQorDQorCQlXT0JKRUNUX1BST1BFUlRZX0lOVEVHRVJfS0lORCAgICAgICAgICAgICAgPSAweDAwMywNCisNCisJCVdPQkpFQ1RfUFJPUEVSVFlfUkFUSU9OQUxfS0lORCAgICAgICAgICAgICA9IDB4MDA0LA0KKw0KKwkJV09CSkVDVF9QUk9QRVJUWV9GTE9BVF9LSU5EICAgICAgICAgICAgICAgID0gMHgwMDUsDQorDQorDQorCQlXT0JKRUNUX1BST1BFUlRZX0lERU5USUZJRVJfS0lORCAgICAgICAgICAgPSAweDAwNiwNCisNCisJCVdPQkpFQ1RfUFJPUEVSVFlfUVVBTElGSUVEX0lERU5USUZJRVJfS0lORCA9IDB4MDA3LA0KKw0KKwkJV09CSkVDVF9QUk9QRVJUWV9VTklRX0ZPUk1fSURFTlRJRklFUl9LSU5EID0gMHgwMDgsDQorDQorDQorCQlXT0JKRUNUX1BST1BFUlRZX09QRVJBVE9SX0tJTkQgICAgICAgICAgICAgPSAweDAwOSwNCisNCisJCVdPQkpFQ1RfUFJPUEVSVFlfQVJSQVlfS0lORCAgICAgICAgICAgICAgICA9IDB4MDBBLA0KKw0KKw0KKwkJV09CSkVDVF9QUk9QRVJUWV9TSU5HTEVfUVVPVEVfU1RSSU5HX0tJTkQgID0gMHgwMTAsDQorDQorCQlXT0JKRUNUX1BST1BFUlRZX0RPVUJMRV9RVU9URV9TVFJJTkdfS0lORCAgPSAweDAyMCwNCisNCisJCVdPQkpFQ1RfUFJPUEVSVFlfU1RSSU5HX0tJTkQgPSBXT0JKRUNUX1BST1BFUlRZX1NJTkdMRV9RVU9URV9TVFJJTkdfS0lORA0KKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFdPQkpFQ1RfUFJPUEVSVFlfRE9VQkxFX1FVT1RFX1NUUklOR19LSU5ELA0KKw0KKw0KKwkJV09CSkVDVF9QUk9QRVJUWV9XUkVGRVJFTkNFX0tJTkQgICAgICAgICAgID0gMHgwNDAsDQorDQorCQlXT0JKRUNUX1BST1BFUlRZX0tJTkQgICAgICAgICAgICAgICAgICAgICAgPSAweDBGRiwNCisNCisNCisJCVdPQkpFQ1RfU0VRVUVOQ0VfS0lORCAgICAgICAgICAgICAgICAgICAgICA9IDB4MTAwLA0KKw0KKwkJV09CSkVDVF9TRVFVRU5DRV9PUl9SRUZFUkVOQ0VfS0lORCA9IFdPQkpFQ1RfU0VRVUVOQ0VfS0lORA0KKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFdPQkpFQ1RfUFJPUEVSVFlfV1JFRkVSRU5DRV9LSU5ELA0KKw0KKwkJV09CSkVDVF9UWVBFRF9LSU5EICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyMDAsDQorDQorCQlXT0JKRUNUX1RZUEVEX09SX1JFRkVSRU5DRV9LSU5EICAgID0gV09CSkVDVF9UWVBFRF9LSU5EDQorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgV09CSkVDVF9QUk9QRVJUWV9XUkVGRVJFTkNFX0tJTkQsDQorDQorCQlXT0JKRUNUX1RZUEVEX09SX1NFUVVFTkNFX0tJTkQgICAgID0gV09CSkVDVF9UWVBFRF9LSU5EDQorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgV09CSkVDVF9TRVFVRU5DRV9LSU5ELA0KKw0KKwl9Ow0KKw0KKw0KK3B1YmxpYzoNCisJLyoqDQorCSAqIFNUQVRJQyBBVFRSSUJVVEUNCisJICovDQorCXN0YXRpYyBXT2JqZWN0ICogX05VTExfOw0KKw0KKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBGTUxfRlFOX1NDSEVNRTsNCisNCisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgRk1MX0ZRTl9ST09UOw0KKw0KKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBTRVdfRlFOX1NDSEVNRTsNCisNCisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgU0VXX0ZRTl9ST09UOw0KKw0KKw0KK3Byb3RlY3RlZDoNCisJLyoqDQorCSAqIEFUVFJJQlVURVMNCisJICovDQorCVdPYmplY3RNYW5hZ2VyICYgbVdPYmplY3RNYW5hZ2VyOw0KKw0KKwlFTlVNX1dPQkpFQ1RfS0lORCBtS2luZDsNCisNCisJc3RkOjpzdHJpbmcgbVF1YWxpZmllZFR5cGVOYW1lSUQ7DQorDQorCVRhYmxlT2ZPd25lZEVsZW1lbnQgbU93bmVkRWxlbWVudHM7DQorDQorCS8vIFdPUktGTE9XLVBST1BFUlRZIFZBTFVFDQorCUFWTV9PUENPREUgbVNwZWNpZmllck9wOw0KKw0KKwl1bmlvbg0KKwl7DQorCQlPcGVyYXRvciAqIG1PcGVyYXRvclZhbHVlOw0KKw0KKwkJV09iamVjdCAgKiBtV09qZWN0UmVmZXJlbmNlVmFsdWU7DQorCX07DQorDQorCUJGIG1WYWx1ZTsNCisNCisNCisNCisNCitwcm90ZWN0ZWQ6DQorCS8qKg0KKwkgKiBDT05TVFJVQ1RPUg0KKwkgKiBEZWZhdWx0DQorCSAqLw0KKwlXT2JqZWN0KFdPYmplY3RNYW5hZ2VyICYgYVdPYmplY3RNYW5hZ2VyLCBXT2JqZWN0ICogd2ZDb250YWluZXIsDQorCQkJRU5VTV9XT0JKRUNUX0tJTkQgYUtpbmQsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkNCisJOiBPYmplY3RFbGVtZW50KCBDTEFTU19LSU5EX1QoIFdPYmplY3QgKSAsIHdmQ29udGFpbmVyICwgYU5hbWVJRCApLA0KKwltV09iamVjdE1hbmFnZXIoIGFXT2JqZWN0TWFuYWdlciApLA0KKwltS2luZCggYUtpbmQgKSwNCisJbVF1YWxpZmllZFR5cGVOYW1lSUQoICksDQorCW1Pd25lZEVsZW1lbnRzKCApLA0KKwltU3BlY2lmaWVyT3AoIEFWTV9PUENPREVfRVEgKSwNCisNCisJbVZhbHVlKCApDQorCXsNCisJCS8vISEgTk9USElORw0KKwl9DQorDQorCS8qKg0KKwkgKiBDT05TVFJVQ1RPUg0KKwkgKiBXb3JrZmxvdy1Qcm9wZXJ0eQ0KKwkgKi8NCisJV09iamVjdChXT2JqZWN0TWFuYWdlciAmIGFXT2JqZWN0TWFuYWdlciwgV09iamVjdCAqIHdmQ29udGFpbmVyLA0KKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwgY29uc3QgQkYgJiBhVmFsdWUpDQorCTogT2JqZWN0RWxlbWVudCggQ0xBU1NfS0lORF9UKCBXT2JqZWN0ICkgLCB3ZkNvbnRhaW5lciAsIGFOYW1lSUQgKSwNCisJbVdPYmplY3RNYW5hZ2VyKCBhV09iamVjdE1hbmFnZXIgKSwNCisJbUtpbmQoIFdPQkpFQ1RfUFJPUEVSVFlfS0lORCApLA0KKwltUXVhbGlmaWVkVHlwZU5hbWVJRCggKSwNCisJbU93bmVkRWxlbWVudHMoICksDQorCW1TcGVjaWZpZXJPcCggQVZNX09QQ09ERV9FUSApLA0KKw0KKwltVmFsdWUoIGFWYWx1ZSApDQorCXsNCisJCS8vISEgTk9USElORw0KKwl9DQorDQorCVdPYmplY3QoV09iamVjdE1hbmFnZXIgJiBhV09iamVjdE1hbmFnZXIsIFdPYmplY3QgKiB3ZkNvbnRhaW5lciwNCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsIEFWTV9PUENPREUgYW5PcCwgY29uc3QgQkYgJiBhVmFsdWUpDQorCTogT2JqZWN0RWxlbWVudCggQ0xBU1NfS0lORF9UKCBXT2JqZWN0ICkgLCB3ZkNvbnRhaW5lciAsIGFOYW1lSUQgKSwNCisJbVdPYmplY3RNYW5hZ2VyKCBhV09iamVjdE1hbmFnZXIgKSwNCisJbUtpbmQoIFdPQkpFQ1RfUFJPUEVSVFlfS0lORCApLA0KKwltUXVhbGlmaWVkVHlwZU5hbWVJRCggKSwNCisJbU93bmVkRWxlbWVudHMoICksDQorCW1TcGVjaWZpZXJPcCggYW5PcCApLA0KKw0KKwltVmFsdWUoIGFWYWx1ZSApDQorCXsNCisJCS8vISEgTk9USElORw0KKwl9DQorDQorCVdPYmplY3QoV09iamVjdE1hbmFnZXIgJiBhV09iamVjdE1hbmFnZXIsIFdPYmplY3QgKiB3ZkNvbnRhaW5lciwNCisJCQlFTlVNX1dPQkpFQ1RfS0lORCBhS2luZCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELA0KKwkJCWNvbnN0IEJGICYgYVZhbHVlKQ0KKwk6IE9iamVjdEVsZW1lbnQoIENMQVNTX0tJTkRfVCggV09iamVjdCApICwgd2ZDb250YWluZXIgLCBhTmFtZUlEICksDQorCW1XT2JqZWN0TWFuYWdlciggYVdPYmplY3RNYW5hZ2VyICksDQorCW1LaW5kKCBhS2luZCApLA0KKwltUXVhbGlmaWVkVHlwZU5hbWVJRCggKSwNCisJbU93bmVkRWxlbWVudHMoICksDQorCW1TcGVjaWZpZXJPcCggQVZNX09QQ09ERV9FUSApLA0KKw0KKwltVmFsdWUoIGFWYWx1ZSApDQorCXsNCisJCS8vISEgTk9USElORw0KKwl9DQorDQorCVdPYmplY3QoV09iamVjdE1hbmFnZXIgJiBhV09iamVjdE1hbmFnZXIsIFdPYmplY3QgKiB3ZkNvbnRhaW5lciwNCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsIE9wZXJhdG9yICogYW5PcGVyYXRvcikNCisJOiBPYmplY3RFbGVtZW50KCBDTEFTU19LSU5EX1QoIFdPYmplY3QgKSAsIHdmQ29udGFpbmVyICwgYU5hbWVJRCApLA0KKwltV09iamVjdE1hbmFnZXIoIGFXT2JqZWN0TWFuYWdlciApLA0KKwltS2luZCggV09CSkVDVF9QUk9QRVJUWV9PUEVSQVRPUl9LSU5EICksDQorCW1RdWFsaWZpZWRUeXBlTmFtZUlEKCApLA0KKwltT3duZWRFbGVtZW50cyggKSwNCisJbVNwZWNpZmllck9wKCBBVk1fT1BDT0RFX0VRICksDQorDQorCW1PcGVyYXRvclZhbHVlKCBhbk9wZXJhdG9yICksDQorCW1WYWx1ZSggKQ0KKwl7DQorCQkvLyEhIE5PVEhJTkcNCisJfQ0KKw0KKwlXT2JqZWN0KFdPYmplY3RNYW5hZ2VyICYgYVdPYmplY3RNYW5hZ2VyLCBXT2JqZWN0ICogd2ZDb250YWluZXIsDQorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELCBXT2JqZWN0ICogYVdPamVjdFJlZmVyZW5jZSkNCisJOiBPYmplY3RFbGVtZW50KCBDTEFTU19LSU5EX1QoIFdPYmplY3QgKSAsIHdmQ29udGFpbmVyICwgYU5hbWVJRCApLA0KKwltV09iamVjdE1hbmFnZXIoIGFXT2JqZWN0TWFuYWdlciApLA0KKwltS2luZCggV09CSkVDVF9QUk9QRVJUWV9XUkVGRVJFTkNFX0tJTkQgKSwNCisJbVF1YWxpZmllZFR5cGVOYW1lSUQoICksDQorCW1Pd25lZEVsZW1lbnRzKCApLA0KKwltU3BlY2lmaWVyT3AoIEFWTV9PUENPREVfRVEgKSwNCisNCisJbVdPamVjdFJlZmVyZW5jZVZhbHVlKCBhV09qZWN0UmVmZXJlbmNlICksDQorCW1WYWx1ZSggKQ0KKwl7DQorCQkvLyEhIE5PVEhJTkcNCisJfQ0KKw0KKwkvKioNCisJICogQ09OU1RSVUNUT1INCisJICogVHlwZWQgV09iamVjdA0KKwkgKi8NCisJV09iamVjdChXT2JqZWN0TWFuYWdlciAmIGFXT2JqZWN0TWFuYWdlciwgV09iamVjdCAqIHdmQ29udGFpbmVyLA0KKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhVHlwZU5hbWVJRCkNCisJOiBPYmplY3RFbGVtZW50KCBDTEFTU19LSU5EX1QoIFdPYmplY3QgKSAsIHdmQ29udGFpbmVyICwgYU5hbWVJRCApLA0KKwltV09iamVjdE1hbmFnZXIoIGFXT2JqZWN0TWFuYWdlciApLA0KKwltS2luZCggV09CSkVDVF9UWVBFRF9LSU5EICksDQorCW1RdWFsaWZpZWRUeXBlTmFtZUlEKCBhVHlwZU5hbWVJRCApLA0KKwltT3duZWRFbGVtZW50cyggKSwNCisJbVNwZWNpZmllck9wKCBBVk1fT1BDT0RFX0VRICksDQorDQorCW1WYWx1ZSggKQ0KKwl7DQorCQkvLyEhIE5PVEhJTkcNCisJfQ0KKw0KKwkvKioNCisJICogQ09OU1RSVUNUT1INCisJICogQ29weQ0KKwkgKi8NCisJZXhwbGljaXQgV09iamVjdChjb25zdCBXT2JqZWN0ICYgYW5PYmplY3QpDQorCTogT2JqZWN0RWxlbWVudCggYW5PYmplY3QgKSwNCisJbVdPYmplY3RNYW5hZ2VyKCBhbk9iamVjdC5tV09iamVjdE1hbmFnZXIgKSwNCisJbUtpbmQoIGFuT2JqZWN0Lm1LaW5kICksDQorCW1RdWFsaWZpZWRUeXBlTmFtZUlEKCBhbk9iamVjdC5tUXVhbGlmaWVkVHlwZU5hbWVJRCApLA0KKwltT3duZWRFbGVtZW50cyggYW5PYmplY3QubU93bmVkRWxlbWVudHMgKSwNCisJbVNwZWNpZmllck9wKCBhbk9iamVjdC5tU3BlY2lmaWVyT3AgKSwNCisNCisJbVdPamVjdFJlZmVyZW5jZVZhbHVlKCBhbk9iamVjdC5tV09qZWN0UmVmZXJlbmNlVmFsdWUgKSwNCisJbVZhbHVlKCBhbk9iamVjdC5tVmFsdWUgKQ0KKwl7DQorCQkvLyEhIE5PVEhJTkcNCisJfQ0KKw0KK3B1YmxpYzoNCisJLyoqDQorCSAqIERFU1RSVUNUT1INCisJICovDQorCXZpcnR1YWwgfldPYmplY3QoKQ0KKwl7DQorCQkvLyBTZWUgV09iamVjdE1hbmFnZXI6OmRlc3Ryb3lNYW5hZ2VkRWxlbWVudA0KKy8vCQlkZXN0cm95T3duZWRFbGVtZW50KCk7DQorCX0NCisNCisJLyoqDQorCSAqIERFU1RST1kNCisJICovDQorCXZvaWQgZGVzdHJveU93bmVkRWxlbWVudCgpOw0KKw0KKw0KKwkvKioNCisJICogVEVTVA0KKwkgKiBtS2luZA0KKwkgKi8NCisJaW5saW5lIGJvb2wgaXNLaW5kKEVOVU1fV09CSkVDVF9LSU5EIGFLaW5kKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIChtS2luZCA9PSBhS2luZCkNCisJCQkJfHwgKChhS2luZCA9PSBXT0JKRUNUX1BST1BFUlRZX0tJTkQpDQorCQkJCQkmJiAobUtpbmQgPCBhS2luZCkpDQorCQkJCXx8ICgoYUtpbmQgPT0gV09CSkVDVF9QUk9QRVJUWV9TVFJJTkdfS0lORCkNCisJCQkJCSYmICgobUtpbmQgJiBhS2luZCkgIT0gMCkpICk7DQorCX0NCisNCisJLyoqDQorCSAqIFRFU1QNCisJICogbUtpbmQgZm9yIENvbXBvc2l0ZQ0KKwkgKi8NCisJaW5saW5lIGJvb2wgaXNXVHlwZWRPYmplY3QoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIG1LaW5kID09IFdPQkpFQ1RfVFlQRURfS0lORCApOw0KKwl9DQorDQorCWlubGluZSBib29sIGlzV1R5cGVkT3JSZWZlcmVuY2UoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIChtS2luZCAmIFdPQkpFQ1RfVFlQRURfT1JfUkVGRVJFTkNFX0tJTkQpICE9IDAgKTsNCisJfQ0KKw0KKwlpbmxpbmUgYm9vbCBpc1dUeXBlZE9yU2VxdWVuY2UoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIChtS2luZCAmIFdPQkpFQ1RfVFlQRURfT1JfU0VRVUVOQ0VfS0lORCkgIT0gMCApOw0KKwl9DQorDQorDQorCWlubGluZSBib29sIGlzV1NlcXVlbmNlKCkgY29uc3QNCisJew0KKwkJcmV0dXJuKCBtS2luZCA9PSBXT0JKRUNUX1NFUVVFTkNFX0tJTkQgKTsNCisJfQ0KKw0KKwlpbmxpbmUgYm9vbCBpc1dTZXF1ZW5jZU9yUmVmZXJlbmNlKCkgY29uc3QNCisJew0KKwkJcmV0dXJuKCAobUtpbmQgJiBXT0JKRUNUX1NFUVVFTkNFX09SX1JFRkVSRU5DRV9LSU5EKSAhPSAwICk7DQorCX0NCisNCisNCisJaW5saW5lIGJvb2wgaXNSZWdleFdTZXF1ZW5jZShjb25zdCBzdGQ6OnN0cmluZyAmIGFSZWdleFNlcXVlbmNlSUQpIGNvbnN0DQorCXsNCisJCXJldHVybiggKG1LaW5kID09IFdPQkpFQ1RfU0VRVUVOQ0VfS0lORCkNCisJCQkJJiYgUkVHRVhfTUFUQ0goZ2V0TmFtZUlEKCksIGFSZWdleFNlcXVlbmNlSUQpICk7DQorCX0NCisNCisJLyoqDQorCSAqIFRFU1QNCisJICogbUtpbmQgZm9yIFByb3BlcnR5DQorCSAqLw0KKwlpbmxpbmUgYm9vbCBpc1dQcm9wZXJ0eSgpIGNvbnN0DQorCXsNCisJCXJldHVybiggbUtpbmQgPD0gV09CSkVDVF9QUk9QRVJUWV9LSU5EICk7DQorCX0NCisNCisJaW5saW5lIGJvb2wgaXNXUHJvcGVydHlib29sZWFuKCkgY29uc3QNCisJew0KKwkJcmV0dXJuKCBtS2luZCA9PSBXT0JKRUNUX1BST1BFUlRZX0JPT0xFQU5fS0lORCApOw0KKwl9DQorDQorCWlubGluZSBib29sIGlzV1Byb3BlcnR5Q2hhcmFjdGVyKCkgY29uc3QNCisJew0KKwkJcmV0dXJuKCBtS2luZCA9PSBXT0JKRUNUX1BST1BFUlRZX0NIQVJBQ1RFUl9LSU5EICk7DQorCX0NCisNCisJaW5saW5lIGJvb2wgaXNXUHJvcGVydHlJbnRlZ2VyKCkgY29uc3QNCisJew0KKwkJcmV0dXJuKCBtS2luZCA9PSBXT0JKRUNUX1BST1BFUlRZX0lOVEVHRVJfS0lORCApOw0KKwl9DQorDQorCWlubGluZSBib29sIGlzV1Byb3BlcnR5UmF0aW9uYWwoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIG1LaW5kID09IFdPQkpFQ1RfUFJPUEVSVFlfUkFUSU9OQUxfS0lORCk7DQorCX0NCisNCisJaW5saW5lIGJvb2wgaXNXUHJvcGVydHlGbG9hdCgpIGNvbnN0DQorCXsNCisJCXJldHVybiggbUtpbmQgPT0gV09CSkVDVF9QUk9QRVJUWV9GTE9BVF9LSU5EICk7DQorCX0NCisNCisJaW5saW5lIGJvb2wgaXNXUHJvcGVydHlJZGVudGlmaWVyKCkgY29uc3QNCisJew0KKwkJcmV0dXJuKCBtS2luZCA9PSBXT0JKRUNUX1BST1BFUlRZX0lERU5USUZJRVJfS0lORCApOw0KKwl9DQorDQorCWlubGluZSBib29sIGlzV1Byb3BlcnR5UXVhbGlmaWVkSWRlbnRpZmllcigpIGNvbnN0DQorCXsNCisJCXJldHVybiggbUtpbmQgPT0gV09CSkVDVF9QUk9QRVJUWV9RVUFMSUZJRURfSURFTlRJRklFUl9LSU5EICk7DQorCX0NCisNCisJaW5saW5lIGJvb2wgaXNXUHJvcGVydHlVRkkoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIG1LaW5kID09IFdPQkpFQ1RfUFJPUEVSVFlfVU5JUV9GT1JNX0lERU5USUZJRVJfS0lORCApOw0KKwl9DQorDQorCWlubGluZSBib29sIGlzV1Byb3BlcnR5T3BlcmF0b3IoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIG1LaW5kID09IFdPQkpFQ1RfUFJPUEVSVFlfT1BFUkFUT1JfS0lORCApOw0KKwl9DQorDQorCWlubGluZSBib29sIGlzV1Byb3BlcnR5V1JlZmVyZW5jZSgpIGNvbnN0DQorCXsNCisJCXJldHVybiggbUtpbmQgPT0gV09CSkVDVF9QUk9QRVJUWV9XUkVGRVJFTkNFX0tJTkQgKTsNCisJfQ0KKw0KKwlpbmxpbmUgYm9vbCBpc1dQcm9wZXJ0eUFycmF5KCkgY29uc3QNCisJew0KKwkJcmV0dXJuKCBtS2luZCA9PSBXT0JKRUNUX1BST1BFUlRZX0FSUkFZX0tJTkQgKTsNCisJfQ0KKw0KKwlpbmxpbmUgYm9vbCBpc1dQcm9wZXJ0eVNpbmdsZVF1b3RlU3RyaW5nKCkgY29uc3QNCisJew0KKwkJcmV0dXJuKCBtS2luZCA9PSBXT0JKRUNUX1BST1BFUlRZX1NJTkdMRV9RVU9URV9TVFJJTkdfS0lORCApOw0KKwl9DQorDQorCWlubGluZSBib29sIGlzV1Byb3BlcnR5RG91YmxlUXVvdGVTdHJpbmcoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIG1LaW5kID09IFdPQkpFQ1RfUFJPUEVSVFlfRE9VQkxFX1FVT1RFX1NUUklOR19LSU5EICk7DQorCX0NCisNCisJaW5saW5lIGJvb2wgaXNXUHJvcGVydHlTdHJpbmcoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIChtS2luZCAmIFdPQkpFQ1RfUFJPUEVSVFlfU1RSSU5HX0tJTkQpICE9IDAgKTsNCisJfQ0KKw0KKw0KKwkvKioNCisJICogR0VUVEVSDQorCSAqIG1RdWFsaWZpZWRUeXBlTmFtZUlEDQorCSAqLw0KKwlpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcgJiBnZXRRdWFsaWZpZWRUeXBlTmFtZUlEKCkgY29uc3QNCisJew0KKwkJcmV0dXJuKCBtUXVhbGlmaWVkVHlwZU5hbWVJRCApOw0KKwl9DQorDQorCWlubGluZSBib29sIGhhc1F1YWxpZmllZFR5cGVOYW1lSUQoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIG5vdCBtUXVhbGlmaWVkVHlwZU5hbWVJRC5lbXB0eSgpICk7DQorCX0NCisNCisJaW5saW5lIGJvb2wgaXNXVHlwZWRJRChjb25zdCBzdGQ6OnN0cmluZyAmIGFRdWFsaWZpZWROYW1lSUQpIGNvbnN0DQorCXsNCisJCXJldHVybiggbVF1YWxpZmllZFR5cGVOYW1lSUQgPT0gYVF1YWxpZmllZE5hbWVJRCApOw0KKwl9DQorDQorCWlubGluZSB2b2lkIHNldFF1YWxpZmllZFR5cGVOYW1lSUQoY29uc3Qgc3RkOjpzdHJpbmcgJiBhUXVhbGlmaWVkTmFtZUlEKQ0KKwl7DQorCQltUXVhbGlmaWVkVHlwZU5hbWVJRCA9IGFRdWFsaWZpZWROYW1lSUQ7DQorCX0NCisNCisJaW5saW5lIHN0ZDo6c3RyaW5nIHN0clR5cGUoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIG1RdWFsaWZpZWRUeXBlTmFtZUlEICk7DQorCX0NCisNCisJaW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nICYgc3RyVCgpIGNvbnN0DQorCXsNCisJCXJldHVybiggbVF1YWxpZmllZFR5cGVOYW1lSUQgKTsNCisJfQ0KKw0KKw0KKwkvKioNCisJICogR0VUVEVSDQorCSAqIG1TcGVjaWZpZXJPcA0KKwkgKi8NCisJaW5saW5lIEFWTV9PUENPREUgZ2V0U3BlY2lmaWVyT3AoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIG1TcGVjaWZpZXJPcCApOw0KKwl9DQorDQorCWlubGluZSB2b2lkIHNldFNwZWNpZmllck9wKEFWTV9PUENPREUgYVNwZWNpZmllck9wKQ0KKwl7DQorCQltU3BlY2lmaWVyT3AgPSBhU3BlY2lmaWVyT3A7DQorCX0NCisNCisNCisJLyoqDQorCSAqIEdFVFRFUiAtIFNFVFRFUg0KKwkgKiBtT3duZWRFbGVtZW50cw0KKwkgKi8NCisJaW5saW5lIGNvbnN0IFRhYmxlT2ZPd25lZEVsZW1lbnQgJiBnZXRPd25lZEVsZW1lbnQoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIG1Pd25lZEVsZW1lbnRzICk7DQorCX0NCisNCisJaW5saW5lIGJvb2wgaGFzT3duZWRFbGVtZW50KCkgY29uc3QNCisJew0KKwkJcmV0dXJuKCBtT3duZWRFbGVtZW50cy5ub25lbXB0eSgpICk7DQorCX0NCisNCisJaW5saW5lIGJvb2wgaGFzbm9Pd25lZEVsZW1lbnQoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIG1Pd25lZEVsZW1lbnRzLmVtcHR5KCkgKTsNCisJfQ0KKw0KKwlpbmxpbmUgYXZtX3NpemVfdCBvd25lZFNpemUoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIG1Pd25lZEVsZW1lbnRzLnNpemUoKSApOw0KKwl9DQorDQorDQorCWlubGluZSB2b2lkIGFwcGVuZChXT2JqZWN0ICogd2ZFbGVtZW50KQ0KKwl7DQorCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCB3ZkVsZW1lbnQgKQ0KKwkJCQk8PCAiZWxlbWVudCAhISEiDQorCQkJCTw8IFNFTkRfRVhJVDsNCisNCisvLyBTZXQgYnkgdGhlIFdPYmplY3RNYW5hZ2VyICENCisvLwkJd2ZFbGVtZW50LT5zZXRPZmZzZXQoIG1Pd25lZEVsZW1lbnRzLnNpemUoKSApOw0KKw0KKwkJbU93bmVkRWxlbWVudHMuYXBwZW5kKHdmRWxlbWVudCk7DQorDQorCQlpZiggd2ZFbGVtZW50LT5nZXRDb250YWluZXIoKSA9PSB0aGlzICkNCisJCXsNCisJCQkvLyEhIE5PVEhJTkcNCisJCX0NCisJCWVsc2UgaWYoIHdmRWxlbWVudC0+Z2V0Q29udGFpbmVyKCkgIT0gTlVMTCApDQorCQl7DQorCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQNCisJCQkJCTw8ICJVbmV4cGVjdGVkIFdPYmplY3QgPCIgPDwgd2ZFbGVtZW50LT5zdHJVbmlxSWQoKQ0KKwkJCQkJPDwgIj4gd2l0aCBjb250YWluZXIgPCIgPDwgdGhpcy0+c3RyVW5pcUlkKCkNCisJCQkJCTw8ICI+IHdoZXJlIG9sZCBjb250YWluZXIgaXMgPCINCisJCQkJCTw8IHdmRWxlbWVudC0+Z2V0Q29udGFpbmVyKCktPnRvPCBXT2JqZWN0ID4oKS0+c3RyVW5pcUlkKCkNCisJCQkJCTw8ICI+Ig0KKwkJCQkJPDwgU0VORF9FWElUOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBHRVRURVIgLSBTRVRURVINCisJICogbU93bmVkRWxlbWVudHMgW2NvbnN0XSBpdGVyYXRvcg0KKwkgKi8NCisJaW5saW5lIGNvbnN0X2l0ZXJhdG9yIG93bmVkX2JlZ2luKCkgY29uc3QNCisJew0KKwkJcmV0dXJuKCBtT3duZWRFbGVtZW50cy5iZWdpbigpICk7DQorCX0NCisNCisJaW5saW5lIGNvbnN0X2l0ZXJhdG9yIG93bmVkX2VuZCgpIGNvbnN0DQorCXsNCisJCXJldHVybiggbU93bmVkRWxlbWVudHMuZW5kKCkgKTsNCisJfQ0KKw0KKw0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisJLy8gUFJPUEVSVFkgR0VUVEVSIC0gU0VUVEVSDQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorCS8qKg0KKwkgKiBHRVRURVIgLSBTRVRURVINCisJICogbVdPamVjdFJlZmVyZW5jZVZhbHVlDQorCSAqLw0KKwlpbmxpbmUgV09iamVjdCAqIGdldFdSZWZlcmVuY2VWYWx1ZSgpIGNvbnN0DQorCXsNCisJCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggaXNXUHJvcGVydHlXUmVmZXJlbmNlKCkgKQ0KKwkJCQk8PCAiV09iamVjdCA8PCAiIDw8IHN0clByb3BlcnR5VmFsdWUoKQ0KKwkJCQk8PCAiID4+IGlzIG5vdCBhIFByb3BlcnR5IFdSZWZlcmVuY2UgISINCisJCQkJPDwgU0VORF9FWElUOw0KKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggbVdPamVjdFJlZmVyZW5jZVZhbHVlICkNCisJCQkJPDwgIldPamVjdCByZWZlcmVuY2UgdmFsdWUgYXMgYWxpYXMgPCAiIDw8IHN0clVuaXFJZCgpIDw8ICIgPiAhIg0KKwkJCQk8PCBTRU5EX0VYSVQ7DQorDQorCQlyZXR1cm4oIG1XT2plY3RSZWZlcmVuY2VWYWx1ZSApOw0KKwl9DQorDQorCS8qKg0KKwkgKiBHRVRURVIgLSBTRVRURVINCisJICogbU9wZXJhdG9yVmFsdWUNCisJICovDQorCWlubGluZSBPcGVyYXRvciAqIGdldE9wZXJhdG9yVmFsdWUoKSBjb25zdA0KKwl7DQorCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoIGlzV1Byb3BlcnR5V1JlZmVyZW5jZSgpICkNCisJCQkJPDwgIldPYmplY3QgPDwgIiA8PCBzdHJQcm9wZXJ0eVZhbHVlKCkNCisJCQkJPDwgIiA+PiBpcyBub3QgYSBQcm9wZXJ0eSBXUmVmZXJlbmNlICEiDQorCQkJCTw8IFNFTkRfRVhJVDsNCisJCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9QT0lOVEVSX0VYSVQoIG1XT2plY3RSZWZlcmVuY2VWYWx1ZSApDQorCQkJCTw8ICJXT2plY3QgcmVmZXJlbmNlIHZhbHVlIGFzIGFsaWFzIDwgIiA8PCBzdHJVbmlxSWQoKSA8PCAiID4gISINCisJCQkJPDwgU0VORF9FWElUOw0KKw0KKwkJcmV0dXJuKCBtT3BlcmF0b3JWYWx1ZSApOw0KKwl9DQorDQorDQorCS8qKg0KKwkgKiBHRVRURVIgLSBTRVRURVINCisJICogbVZhbHVlDQorCSAqLw0KKwlpbmxpbmUgY29uc3QgQkYgJiBnZXRWYWx1ZSgpIGNvbnN0DQorCXsNCisJCXJldHVybiggbVZhbHVlICk7DQorCX0NCisNCisJaW5saW5lIGJvb2wgaGFzVmFsdWUoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIG1WYWx1ZS52YWxpZCgpICk7DQorCX0NCisNCisJaW5saW5lIHZvaWQgc2V0VmFsdWUoY29uc3QgQkYgJiBhVmFsdWUpDQorCXsNCisJCW1WYWx1ZSA9IGFWYWx1ZTsNCisJfQ0KKw0KKwkvKioNCisJICogRkFDVE9SWQ0KKwkgKiBjb250YWluZXIgb2YgV09iamVjdA0KKwkgKiAhVU5VU0VEISoNCisJV09iamVjdCAqIGNvbnRhaW5lcigpIGNvbnN0Ow0KKw0KKwlXT2JqZWN0ICogc2VxdWVuY2VDb250YWluZXJPZigpIGNvbnN0Ow0KKwkqICFVTlVTRUQhDQorCSovDQorDQorCWNvbnN0IFdPYmplY3QgKiBvYmplY3RDb250YWluZXIoKSBjb25zdDsNCisNCisJLyoqDQorCSAqIFNlcmlhbGl6YXRpb24NCisJICovDQorCWlubGluZSBzdGQ6OnN0cmluZyBzdHJVbmlxSWQoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIChpc1dQcm9wZXJ0eSgpID8gIndwcm86IiA6IChpc1dTZXF1ZW5jZSgpID8gIndzZXE6IiA6ICIiKSkNCisJCQkJKyAoIGhhc0Z1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPyBnZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpDQorCQkJCQk6ICggaGFzTmFtZUlEKCkgPyBnZXROYW1lSUQoKQ0KKwkJCQkJCTogKCBoYXNVbnJlc3RyaWN0ZWROYW1lKCkNCisJCQkJCQkJPyAoIiciICsgZ2V0VW5yZXN0cmljdGVkTmFtZSgpICsgIiciKQ0KKwkJCQkJCQk6ICggaGFzUXVhbGlmaWVkVHlwZU5hbWVJRCgpDQorCQkJCQkJCQk/IChtUXVhbGlmaWVkVHlwZU5hbWVJRCArICIuPGFub255bT4iKQ0KKwkJCQkJCQkJOiAiPG51bGwtd29iamVjdC1pZD4iICkgKSApICkgKTsNCisJfQ0KKw0KKwkvLyBzdHIgUHJvcGVydHkgVmFsdWUNCisJc3RkOjpzdHJpbmcgc3RyUHJvcGVydHlWYWx1ZSgpIGNvbnN0Ow0KKw0KKwkvKioNCisJICogU2VyaWFsaXNhdGlvbg0KKwkgKi8NCisJaW5saW5lIHZpcnR1YWwgc3RkOjpzdHJpbmcgc3RyKCkgY29uc3QNCisJew0KKwkJcmV0dXJuKCBzdHJVbmlxSWQoKSApOw0KKwl9DQorDQorDQorCWlubGluZSB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHN0ckhlYWRlcigpIGNvbnN0DQorCXsNCisJCVN0cmluZ091dFN0cmVhbSBvc3M7DQorDQorCQlzdHJIZWFkZXIoIG9zcyApOw0KKw0KKwkJcmV0dXJuKCBvc3Muc3RyKCkgKTsNCisJfQ0KKw0KKwl2aXJ0dWFsIHZvaWQgc3RySGVhZGVyKE91dFN0cmVhbSAmIG9zKSBjb25zdDsNCisNCisJaW5saW5lIHZpcnR1YWwgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QNCisJew0KKwkJaWYoIGlzV1Byb3BlcnR5KCkgKQ0KKwkJew0KKwkJCXRvU3RyZWFtV1Byb3BlcnR5KG9zKTsNCisJCX0NCisJCWVsc2UgaWYoIGlzV1NlcXVlbmNlKCkgKQ0KKwkJew0KKwkJCXRvU3RyZWFtV1NlcXVlbmNlKG9zKTsNCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQl0b1N0cmVhbVdPYmplY3Qob3MpOw0KKwkJfQ0KKwl9DQorDQorCXZvaWQgdG9TdHJlYW1XUHJvcGVydHkoT3V0U3RyZWFtICYgb3MpIGNvbnN0Ow0KKw0KKwlpbmxpbmUgdm9pZCB0b1N0cmVhbVdTZXF1ZW5jZShPdXRTdHJlYW0gJiBvcykgY29uc3QNCisJew0KKwkJb3MgPDwgVEFCLyogPDwgInNlcXVlbmNlICIqLyA8PCBnZXROYW1lSUQoKTsvLyA8PCAiOiI7DQorDQorCQlpZiggaGFzUmVhbGx5VW5yZXN0cmljdGVkTmFtZSgpICkNCisJCXsNCisJCQlvcyA8PCAiICciIDw8IGdldFVucmVzdHJpY3RlZE5hbWUoKSA8PCAiJyI7DQorCQl9DQorDQorCQl0b1N0cmVhbU93bmVkRWxlbWVudCggb3MgPDwgIiAiICwgIlsiICwgIl0gLy8gIiArIGdldE5hbWVJRCgpICk7DQorDQorCQlvcyA8PCBFT0xfRkxVU0g7DQorCX0NCisNCisJaW5saW5lIHZvaWQgdG9TdHJlYW1XT2JqZWN0KE91dFN0cmVhbSAmIG9zKSBjb25zdA0KKwl7DQorCQlvcyA8PCBUQUI7DQorDQorCQlpZiggaGFzUXVhbGlmaWVkVHlwZU5hbWVJRCgpICkNCisJCXsNCisJCQlvcyA8PCBnZXRRdWFsaWZpZWRUeXBlTmFtZUlEKCkgPDwgIiAiOw0KKwkJfQ0KKw0KKwkJb3MgPDwgZ2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsgLy9vciBnZXROYW1lSUQoKTsNCisNCisJCWlmKCBoYXNSZWFsbHlVbnJlc3RyaWN0ZWROYW1lKCkgKQ0KKwkJew0KKwkJCW9zIDw8ICIgJyIgPDwgZ2V0VW5yZXN0cmljdGVkTmFtZSgpIDw8ICInIjsNCisJCX0NCisNCisJCXRvU3RyZWFtT3duZWRFbGVtZW50KCBvcyA8PCAiICIgLCAieyIgLCAifSAvLyAiICsgZ2V0TmFtZUlEKCkgKTsNCisNCisJCW9zIDw8IEVPTF9GTFVTSDsNCisJfQ0KKw0KKw0KKwl2b2lkIHRvU3RyZWFtT3duZWRFbGVtZW50KE91dFN0cmVhbSAmIG9zLA0KKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYmVnaW5EZWxpbWl0ZXIgPSAieyIsDQorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBlbmREZWxpbWl0ZXIgPSAifSIgKSBjb25zdDsNCisNCit9Ow0KKw0KKw0KK2NsYXNzIFdPYmplY3RNYW5hZ2VyDQorew0KKw0KK3Byb3RlY3RlZDoNCisJLyoqDQorCSAqIEFUVFJJQlVURQ0KKwkgKi8NCisJVmVjdG9yPCBXT2JqZWN0ICogPiAgbVRhYmxlT2ZNYW5hZ2VkRWxlbWVudDsNCisNCisJc3RkOjptYXA8IHN0ZDo6c3RyaW5nICwgV09iamVjdCAqID4gbVRhYmxlT2ZSZWdpc3RlcmVkV09iamVjdDsNCisNCitwdWJsaWM6DQorCVdPYmplY3QgUk9PVF9XT0JKRUNUOw0KKw0KKw0KK3B1YmxpYzoNCisJLyoqDQorCSAqIENPTlNUUlVDVE9SDQorCSAqIERlZmF1bHQNCisJICovDQorCVdPYmplY3RNYW5hZ2VyKGNvbnN0IHN0ZDo6c3RyaW5nICYgZnFuUm9vdCkNCisJOiBtVGFibGVPZk1hbmFnZWRFbGVtZW50KCApLA0KKwltVGFibGVPZlJlZ2lzdGVyZWRXT2JqZWN0KCApLA0KKwlST09UX1dPQkpFQ1QoICp0aGlzICwgTlVMTCwgInZpcnR1YWwjcm9vdCIsICJ2aXJ0dWFsI3Jvb3QiICkNCisJew0KKwkJUk9PVF9XT0JKRUNULm1GdWxseVF1YWxpZmllZE5hbWVJRCA9IGZxblJvb3Q7DQorCX0NCisNCisJLyoqDQorCSAqIERFU1RSVUNUT1INCisJICogbU93bmVkRWxlbWVudHMNCisJICovDQorCXZpcnR1YWwgfldPYmplY3RNYW5hZ2VyKCkNCisJew0KKwkJZGVzdHJveU1hbmFnZWRFbGVtZW50KCk7DQorCX0NCisNCisJLyoqDQorCSAqIERFU1RST1kNCisJICovDQorCXZvaWQgZGVzdHJveU1hbmFnZWRFbGVtZW50KCk7DQorDQorCS8qKg0KKwkgKiByZXR1cm4gRnVsbHlRdWFsaWZpZWROYW1lSUQgKyAnLicgYU5hbWVJRA0KKwkgKi8NCisJc3RkOjpzdHJpbmcgbWFrZUZRTihXT2JqZWN0ICogd2ZPYmplY3QsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkgY29uc3Q7DQorDQorDQorCS8qKg0KKwkgKiBNYW5hZ2UgV09iamVjdA0KKwkgKi8NCisJaW5saW5lIFdPYmplY3QgKiBtYW5hZ2UoV09iamVjdCAqIHdmT2JqZWN0KQ0KKwl7DQorCQlpZiggd2ZPYmplY3QgIT0gV09iamVjdDo6X05VTExfICkNCisJCXsNCisJCQl3Zk9iamVjdC0+c2V0T2Zmc2V0KCBtVGFibGVPZk1hbmFnZWRFbGVtZW50LnNpemUoKSApOw0KKw0KKwkJCW1UYWJsZU9mTWFuYWdlZEVsZW1lbnQuYXBwZW5kKCB3Zk9iamVjdCApOw0KKwkJfQ0KKw0KKwkJcmV0dXJuKCB3Zk9iamVjdCApOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZWdpc3RlcmVkIFdPYmplY3QNCisJICovDQorCWlubGluZSBXT2JqZWN0ICogZ2V0UmVnaXN0ZXJlZFdPYmplY3QoY29uc3Qgc3RkOjpzdHJpbmcgJiBrZXkpDQorCXsNCisJCXJldHVybiggbVRhYmxlT2ZSZWdpc3RlcmVkV09iamVjdFsga2V5IF0gKTsNCisJfQ0KKw0KKwlpbmxpbmUgQkYgYmZSZWdpc3RlcmVkV09iamVjdChjb25zdCBzdGQ6OnN0cmluZyAmIGtleSkNCisJew0KKwkJcmV0dXJuKCB0b0JGKCBtVGFibGVPZlJlZ2lzdGVyZWRXT2JqZWN0WyBrZXkgXSApICk7DQorCX0NCisNCisNCisJaW5saW5lIHZvaWQgcmVnaXN0ZXJXT2JqZWN0KFdPYmplY3QgKiB3Zk9iamVjdCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBrZXkpDQorCXsNCisJCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9QT0lOVEVSX0VYSVQoIHdmT2JqZWN0ICkgPDwgIldPYmplY3QgISEhIg0KKwkJCQk8PCBTRU5EX0VYSVQ7DQorDQorCQltVGFibGVPZlJlZ2lzdGVyZWRXT2JqZWN0WyBrZXkgXSA9IHdmT2JqZWN0Ow0KKwl9DQorDQorCWlubGluZSB2b2lkIHJlZ2lzdGVyV09iamVjdChXT2JqZWN0ICogd2ZPYmplY3QpDQorCXsNCisJCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9QT0lOVEVSX0VYSVQoIHdmT2JqZWN0ICkgPDwgIldPYmplY3QgISEhIg0KKwkJCQk8PCBTRU5EX0VYSVQ7DQorDQorCQltVGFibGVPZlJlZ2lzdGVyZWRXT2JqZWN0Ww0KKwkJCQl3Zk9iamVjdC0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSBdID0gd2ZPYmplY3Q7DQorCX0NCisNCisNCisJLyoqDQorCSAqIENhc3QNCisJICovDQorCWlubGluZSBzdGF0aWMgYm9vbCBpcyhjb25zdCBCRiAmIGFuRWxlbWVudCkNCisJew0KKwkJcmV0dXJuKCBhbkVsZW1lbnQuaXM8IFdPYmplY3QgPigpICk7DQorCX0NCisNCisJaW5saW5lIHN0YXRpYyBXT2JqZWN0ICogZnJvbShjb25zdCBCRiAmIGFuRWxlbWVudCkNCisJew0KKwkJcmV0dXJuKCBhbkVsZW1lbnQudG9fcHRyPCBXT2JqZWN0ID4oKSApOw0KKwl9DQorDQorCWlubGluZSBzdGF0aWMgQkYgdG9CRihXT2JqZWN0ICogd2ZPYmplY3QpDQorCXsNCisJCWlmKCB3Zk9iamVjdCAhPSBXT2JqZWN0OjpfTlVMTF8gKQ0KKwkJew0KKwkJCXdmT2JqZWN0LT5PYmplY3RFbGVtZW50OjppbmNyUmVmQ291bnQoKTsNCisJCX0NCisNCisJCXJldHVybiggQkYoIHdmT2JqZWN0ICkgKTsNCisJfQ0KKw0KKw0KKwkvKioNCisJICogRkFDVE9SWQ0KKwkgKiBjcmVhdGUgV09iamVjdA0KKwkgKi8NCisJaW5saW5lIFdPYmplY3QgKiBuZXdXT2JqZWN0KFdPYmplY3QgKiB3ZkNvbnRhaW5lciwNCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpDQorCXsNCisJCVdPYmplY3QgKiB3Zk9iamVjdCA9IG5ldyBXT2JqZWN0KCAoKnRoaXMpLCB3ZkNvbnRhaW5lciwNCisJCQkJV09iamVjdDo6V09CSkVDVF9UWVBFRF9LSU5ELCBhTmFtZUlEICk7DQorDQorCQlyZXR1cm4oIG1hbmFnZSggd2ZPYmplY3QgKSApOw0KKwl9DQorDQorDQorCWlubGluZSBXT2JqZWN0ICogbmV3V09iamVjdChXT2JqZWN0ICogd2ZDb250YWluZXIsDQorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELCBjb25zdCBzdGQ6OnN0cmluZyAmIGFUeXBlTmFtZUlEKQ0KKwl7DQorCQlXT2JqZWN0ICogd2ZPYmplY3QgPSBuZXcgV09iamVjdCggKCp0aGlzKSwgd2ZDb250YWluZXIsDQorCQkJCWFOYW1lSUQsIGFUeXBlTmFtZUlEICk7DQorDQorCQlyZXR1cm4oIG1hbmFnZSggd2ZPYmplY3QgKSApOw0KKwl9DQorDQorDQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwkvLyBQUk9QRVJUWSBDUkVBVElPTiBGQUNUT1JZDQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorCWlubGluZSBXT2JqZWN0ICogbmV3V1Byb3BlcnR5T3BlcmF0b3IoV09iamVjdCAqIHdmQ29udGFpbmVyLA0KKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwgT3BlcmF0b3IgKiBhbk9wZXJhdG9yKQ0KKwl7DQorCQlXT2JqZWN0ICogd2ZPYmplY3QgPSBuZXcgV09iamVjdCggKCp0aGlzKSwgd2ZDb250YWluZXIsDQorCQkJCWFOYW1lSUQsIGFuT3BlcmF0b3IgKTsNCisNCisJCXJldHVybiggbWFuYWdlKCB3Zk9iamVjdCApICk7DQorCX0NCisNCisJaW5saW5lIFdPYmplY3QgKiBuZXdXUHJvcGVydHlSZWZlcmVuY2UoV09iamVjdCAqIHdmQ29udGFpbmVyLA0KKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwgV09iamVjdCAqIGFXT2plY3RSZWZlcmVuY2UpDQorCXsNCisJCVdPYmplY3QgKiB3Zk9iamVjdCA9IG5ldyBXT2JqZWN0KCAoKnRoaXMpLCB3ZkNvbnRhaW5lciwNCisJCQkJYU5hbWVJRCwgYVdPamVjdFJlZmVyZW5jZSApOw0KKw0KKwkJcmV0dXJuKCBtYW5hZ2UoIHdmT2JqZWN0ICkgKTsNCisJfQ0KKw0KKwlpbmxpbmUgV09iamVjdCAqIG5ld1dQcm9wZXJ0eUFycmF5KFdPYmplY3QgKiB3ZkNvbnRhaW5lciwNCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsIGNvbnN0IEJGICYgdmFsdWUpDQorCXsNCisJCVdPYmplY3QgKiB3Zk9iamVjdCA9IG5ldyBXT2JqZWN0KCAoKnRoaXMpLCB3ZkNvbnRhaW5lciwNCisJCQkJV09iamVjdDo6V09CSkVDVF9QUk9QRVJUWV9BUlJBWV9LSU5ELCBhTmFtZUlELCB2YWx1ZSApOw0KKw0KKwkJcmV0dXJuKCBtYW5hZ2UoIHdmT2JqZWN0ICkgKTsNCisJfQ0KKw0KKw0KKwlpbmxpbmUgV09iamVjdCAqIG5ld1dQcm9wZXJ0eSgNCisJCQlXT2JqZWN0ICogd2ZDb250YWluZXIsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkNCisJew0KKwkJV09iamVjdCAqIHdmT2JqZWN0ID0gbmV3IFdPYmplY3QoICgqdGhpcyksIHdmQ29udGFpbmVyLA0KKwkJCQlXT2JqZWN0OjpXT0JKRUNUX1BST1BFUlRZX0tJTkQsIGFOYW1lSUQgKTsNCisNCisJCXJldHVybiggbWFuYWdlKCB3Zk9iamVjdCApICk7DQorCX0NCisNCisJaW5saW5lIFdPYmplY3QgKiBuZXdXUHJvcGVydHkoDQorCQkJV09iamVjdCAqIHdmQ29udGFpbmVyLCBjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsDQorCQkJQVZNX09QQ09ERSBhU3BlY2lmaWVyT3AsIGNvbnN0IEJGICYgdmFsdWUpDQorCXsNCisJCVdPYmplY3QgKiB3Zk9iamVjdCA9IG5ldyBXT2JqZWN0KCAoKnRoaXMpLCB3ZkNvbnRhaW5lciwNCisJCQkJYU5hbWVJRCwgYVNwZWNpZmllck9wLCB2YWx1ZSApOw0KKw0KKwkJcmV0dXJuKCBtYW5hZ2UoIHdmT2JqZWN0ICkgKTsNCisJfQ0KKw0KKw0KKwlpbmxpbmUgV09iamVjdCAqIG5ld1dQcm9wZXJ0eShXT2JqZWN0ICogd2ZDb250YWluZXIsDQorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELCBjb25zdCBCRiAmIHZhbHVlKQ0KKwl7DQorCQlXT2JqZWN0ICogd2ZPYmplY3QgPSBuZXcgV09iamVjdCggKCp0aGlzKSwgd2ZDb250YWluZXIsDQorCQkJCVdPYmplY3Q6OldPQkpFQ1RfUFJPUEVSVFlfS0lORCwgYU5hbWVJRCwgdmFsdWUgKTsNCisNCisJCXJldHVybiggbWFuYWdlKCB3Zk9iamVjdCApICk7DQorCX0NCisNCisJaW5saW5lIFdPYmplY3QgKiBuZXdXUHJvcGVydHkoV09iamVjdCAqIHdmQ29udGFpbmVyLA0KKwkJCVdPYmplY3Q6OkVOVU1fV09CSkVDVF9LSU5EIGFLaW5kLA0KKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwgY29uc3QgQkYgJiB2YWx1ZSkNCisJew0KKwkJV09iamVjdCAqIHdmT2JqZWN0ID0gbmV3IFdPYmplY3QoICgqdGhpcyksIHdmQ29udGFpbmVyLA0KKwkJCQlhS2luZCwgYU5hbWVJRCwgdmFsdWUgKTsNCisNCisJCXJldHVybiggbWFuYWdlKCB3Zk9iamVjdCApICk7DQorCX0NCisNCisJV09iamVjdCAqIG5ld1dQcm9wZXJ0eUV4cHJlc3Npb24oV09iamVjdCAqIHdmQ29udGFpbmVyLA0KKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwgY29uc3QgQkYgJiB2YWx1ZSk7DQorDQorDQorCVdPYmplY3QgKiBuZXdXUHJvcGVydHlCb29sZWFuKFdPYmplY3QgKiB3ZkNvbnRhaW5lciwNCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsIGJvb2wgYUJvb2xlYW5WYWx1ZSk7DQorDQorCVdPYmplY3QgKiBuZXdXUHJvcGVydHlDaGFyYWN0ZXIoV09iamVjdCAqIHdmQ29udGFpbmVyLA0KKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwgY2hhciBhQ2hhcmFjdGVyVmFsdWUpOw0KKw0KKwlXT2JqZWN0ICogbmV3V1Byb3BlcnR5SW50ZWdlcihXT2JqZWN0ICogd2ZDb250YWluZXIsDQorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELCBhdm1faW50ZWdlcl90IGFuSW50ZWdlclZhbHVlKTsNCisNCisJV09iamVjdCAqIG5ld1dQcm9wZXJ0eUludGVnZXIoV09iamVjdCAqIHdmQ29udGFpbmVyLA0KKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhbkludGVnZXJWYWx1ZSk7DQorDQorCVdPYmplY3QgKiBuZXdXUHJvcGVydHlGbG9hdChXT2JqZWN0ICogd2ZDb250YWluZXIsDQorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELCBkb3VibGUgYUZsb2F0VmFsdWUpOw0KKw0KKwlXT2JqZWN0ICogbmV3V1Byb3BlcnR5RmxvYXQoV09iamVjdCAqIHdmQ29udGFpbmVyLA0KKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhRmxvYXRWYWx1ZSk7DQorDQorCVdPYmplY3QgKiBuZXdXUHJvcGVydHlTaW5nbGVRdW90ZVN0cmluZyhXT2JqZWN0ICogd2ZDb250YWluZXIsDQorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELCBjb25zdCBzdGQ6OnN0cmluZyAmIGFTdHJpbmdWYWx1ZSk7DQorDQorCVdPYmplY3QgKiBuZXdXUHJvcGVydHlEb3VibGVRdW90ZVN0cmluZyhXT2JqZWN0ICogd2ZDb250YWluZXIsDQorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELCBjb25zdCBzdGQ6OnN0cmluZyAmIGFTdHJpbmdWYWx1ZSk7DQorDQorCVdPYmplY3QgKiBuZXdXUHJvcGVydHlTdHJpbmcoV09iamVjdCAqIHdmQ29udGFpbmVyLA0KKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhU3RyaW5nVmFsdWUpOw0KKw0KKw0KKwlXT2JqZWN0ICogbmV3V1Byb3BlcnR5SWRlbnRpZmllcihXT2JqZWN0ICogd2ZDb250YWluZXIsDQorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELCBjb25zdCBzdGQ6OnN0cmluZyAmIGFTdHJpbmdWYWx1ZSk7DQorDQorCVdPYmplY3QgKiBuZXdXUHJvcGVydHlRdWFsaWZpZWRJZGVudGlmaWVyKFdPYmplY3QgKiB3ZkNvbnRhaW5lciwNCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYVN0cmluZ1ZhbHVlKTsNCisNCisNCisJV09iamVjdCAqIG5ld1dQcm9wZXJ0eVVuaUZvcm1JZGVudGlmaWVyKFdPYmplY3QgKiB3ZkNvbnRhaW5lciwNCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQsIFVuaUZvcm1JZGVudGlmaWVyICogYW5VRkkpOw0KKw0KKw0KKwlXT2JqZWN0ICogbmV3V1Byb3BlcnR5UGFyc2VkSWRlbnRpZmllcihXT2JqZWN0ICogd2ZDb250YWluZXIsDQorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlELCBjb25zdCBCRiAmIHZhbHVlKTsNCisNCisNCisJLyoqDQorCSAqIEZBQ1RPUlkNCisJICogY3JlYXRlIEdyb3VwIG9sZCBTZWN0aW9uDQorCSAqLw0KKwlpbmxpbmUgV09iamVjdCAqIG5ld1dTZXF1ZW5jZShXT2JqZWN0ICogd2ZDb250YWluZXIsDQorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKQ0KKwl7DQorCQlXT2JqZWN0ICogd2ZPYmplY3QgPSBuZXcgV09iamVjdCggKCp0aGlzKSwgd2ZDb250YWluZXIsDQorCQkJCVdPYmplY3Q6OldPQkpFQ1RfU0VRVUVOQ0VfS0lORCwgYU5hbWVJRCApOw0KKw0KKwkJcmV0dXJuKCBtYW5hZ2UoIHdmT2JqZWN0ICkgKTsNCisJfQ0KKw0KK307DQorDQorDQorfSAvKiBuYW1lc3BhY2Ugc2VwICovDQorDQorI2VuZGlmIC8qIEZNTF9XT1JLRkxPV19XT0JKRUNUX0hfICovDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3dvcmtmbG93L1dQcm9wZXJ0eUltcGwuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3dvcmtmbG93L1dQcm9wZXJ0eUltcGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZmJkNWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9mbWwvd29ya2Zsb3cvV1Byb3BlcnR5SW1wbC5jcHAKQEAgLTAsMCArMSwxMDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyNCBtYXJzIDIwMTYKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIldQcm9wZXJ0eUltcGwuaCIKKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0F2bUNvZGUuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9CdWlsdGluQXJyYXkuaD4KKworI2luY2x1ZGUgPGZtbC9vcGVyYXRvci9PcGVyYXRvci5oPgorCisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1dPYmplY3QuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoqCisgKiBHRVRURVIgLSBTRVRURVIKKyAqIGZvciBBdm1Db2RlIGF0dHJpYnVlCisgKi8KK2NvbnN0IEJGQ29kZSAmIFdQcm9wZXJ0eUltcGw6OmdldEF2bUNvZGVWYWx1ZSgpIGNvbnN0Cit7CisJcmV0dXJuKCBnZXRWYWx1ZSgpLmJmQ29kZSgpICk7Cit9CisKK2Jvb2wgV1Byb3BlcnR5SW1wbDo6aGFzQXZtQ29kZVZhbHVlKCkgY29uc3QKK3sKKwlyZXR1cm4oIGdldFZhbHVlKCkuaXM8IEF2bUNvZGUgPigpICk7Cit9CisKKworLyoqCisgKiBHRVRURVIKKyAqIGZvciBCdWlsdGluQXJyYXkgYXR0cmlidXRlCisgKi8KK0J1aWx0aW5BcnJheSAqIFdQcm9wZXJ0eUltcGw6OmdldEJ1aWx0aW5BcnJheVZhbHVlKCkgY29uc3QKK3sKKwlyZXR1cm4oIGdldFZhbHVlKCkuYXNfcHRyPCBCdWlsdGluQXJyYXkgPigpICk7Cit9CisKK2Jvb2wgV1Byb3BlcnR5SW1wbDo6aGFzQnVpbHRpbkFycmF5VmFsdWUoKSBjb25zdAoreworCXJldHVybiggZ2V0VmFsdWUoKS5pczwgQnVpbHRpbkFycmF5ID4oKSApOworfQorCisKK0JGIFdQcm9wZXJ0eUltcGw6OmdldEFycmF5VmFsdWUoKSBjb25zdAoreworCWlmKCBnZXRWYWx1ZSgpLmlzPCBBcnJheUJGID4oKSApCisJeworCQlyZXR1cm4oIGdldFZhbHVlKCkgKTsKKwl9CisJZWxzZSBpZiggZ2V0VmFsdWUoKS5pczwgQnVpbHRpbkFycmF5ID4oKSApCisJeworCQlyZXR1cm4oIEJGKCBnZXRWYWx1ZSgpLnRvX3B0cjwgQnVpbHRpbkFycmF5ID4oKS0+Z2V0QXJyYXlCRigpICkgKTsKKwl9CisKKwlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOworfQorCitib29sIFdQcm9wZXJ0eUltcGw6Omhhc0FycmF5VmFsdWUoKSBjb25zdAoreworCXJldHVybiggZ2V0VmFsdWUoKS5pczwgQXJyYXlCRiA+KCkgKTsKK30KKworCitzdGQ6OnN0cmluZyBXUHJvcGVydHlJbXBsOjp0b1N0cmluZ1ZhbHVlKEJ1aWx0aW5BcnJheSAqIGFuQXJyYXksIGF2bV9zaXplX3Qgb2Zmc2V0KSBjb25zdAoreworCWlmKCBhbkFycmF5LT5pczwgQXJyYXlTdHJpbmcgPigpICkKKwl7CisJCXJldHVybiggYW5BcnJheS0+dG88IEFycmF5U3RyaW5nID4oKS0+Z2V0KG9mZnNldCkgKTsKKworCQkvLyEhIE5vIGJlY2F1c2Ugb2YgZGVmYXVsdCBxdW90ZSBjaGFyIGxpa2U6ICJzdHJpbmciCisvLwkJcmV0dXJuKCBhbkFycmF5LT50bzwgQXJyYXlTdHJpbmcgPigpLT5zdHIob2Zmc2V0KSApOworCX0KKworCWVsc2UgaWYoIGFuQXJyYXktPmlzPCBBcnJheUJGID4oKSApCisJeworCQlyZXR1cm4oIHRvU3RyaW5nVmFsdWUoIGFuQXJyYXktPnRvPCBBcnJheUJGID4oKS0+YXQob2Zmc2V0KSApICk7CisJfQorCisJZWxzZSBpZiggZ2V0VmFsdWUoKS5pczwgQnVpbHRpbkFycmF5ID4oKSApCisJeworCQlyZXR1cm4oIGFuQXJyYXktPnRvPCBCdWlsdGluQXJyYXkgPigpLT5zdHIob2Zmc2V0KSApOworCX0KKworCWVsc2UKKwl7CisJCXJldHVybiggdG9TdHJpbmdWYWx1ZSgpICk7CisJfQorfQorCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvZm1sL3dvcmtmbG93L1dQcm9wZXJ0eUltcGwuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC93b3JrZmxvdy9XUHJvcGVydHlJbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzliZWE3MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL2ZtbC93b3JrZmxvdy9XUHJvcGVydHlJbXBsLmgKQEAgLTAsMCArMSwyMjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyNCBtYXJzIDIwMTYKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBGTUxfV09SS0ZMT1dfV1BST1BFUlRZSU1QTF9IXworI2RlZmluZSBGTUxfV09SS0ZMT1dfV1BST1BFUlRZSU1QTF9IXworCisjaW5jbHVkZSA8Y29tbW9uL0JGLmg+CisKKyNpbmNsdWRlIDxmbWwvYnVpbHRpbi9TdHJpbmcuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKK2NsYXNzIEF2bUNvZGU7CitjbGFzcyBCRkNvZGU7CisKK2NsYXNzIE9wZXJhdG9yOworCitjbGFzcyBXT2JqZWN0OworCisKK2NsYXNzIFdQcm9wZXJ0eUltcGwKK3sKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCVdQcm9wZXJ0eUltcGwoKQorCXsKKwkJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5XUHJvcGVydHlJbXBsKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogQVBJCisJICogZ2V0VmFsdWUoKQorCSAqLworCXZpcnR1YWwgY29uc3QgQkYgJiBnZXRWYWx1ZSgpIGNvbnN0ID0gMDsKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIGdldFZhbHVlKCkKKwkgKi8KKworCWlubGluZSBzdGQ6OnN0cmluZyBzdHJWYWx1ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldFZhbHVlKCkuc3RyKCkgKTsKKwl9CisKKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogYW55IFR5cGUgVmFsdWUKKwkgKi8KKwl0ZW1wbGF0ZTxjbGFzcyBUID4KKwlpbmxpbmUgVCAqIGdldFZhbHVlKCkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0VmFsdWUoKS5hc19wdHI8IFQgPigpICk7CisJfQorCisJdGVtcGxhdGU8Y2xhc3MgVCA+CisJaW5saW5lIGJvb2wgaGFzVmFsdWUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRWYWx1ZSgpLmlzPCBUID4oKSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogZm9yIEJPT0xFQU4gYXR0cmlidWUKKwkgKi8KKwlpbmxpbmUgYm9vbCBnZXRCb29sZWFuVmFsdWUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRWYWx1ZSgpLnRvQm9vbGVhbigpICk7CisJfQorCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogZm9yIENIQVJBQ1RFUiBhdHRyaWJ1ZQorCSAqLworCWNoYXIgZ2V0Q2hhcmFjdGVyVmFsdWUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRWYWx1ZSgpLnRvQ2hhcmFjdGVyKCkgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIGZvciBJTlRFR0VSIGF0dHJpYnVlCisJICovCisJaW5saW5lIGF2bV9pbnRlZ2VyX3QgZ2V0SW50ZWdlclZhbHVlKCkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0VmFsdWUoKS50b0ludGVnZXIoKSApOworCX0KKworCWlubGluZSBhdm1faW50MzJfdCBnZXRJbnQzMlZhbHVlKCkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0VmFsdWUoKS50b0ludDMyKCkgKTsKKwl9CisKKwlpbmxpbmUgYXZtX2ludDY0X3QgZ2V0SW50NjRWYWx1ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldFZhbHVlKCkudG9JbnQ2NCgpICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBmb3IgRkxPQVQgYXR0cmlidWUKKwkgKi8KKwlpbmxpbmUgYXZtX2Zsb2F0X3QgZ2V0RmxvYXRWYWx1ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldFZhbHVlKCkudG9GbG9hdCgpICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBmb3IgU1RSSU5HIGF0dHJpYnVlCisJICovCisJaW5saW5lIHN0ZDo6c3RyaW5nIGdldFN0cmluZ1ZhbHVlKCkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0VmFsdWUoKS50b0J1aWx0aW5TdHJpbmcoKSApOworCX0KKworCWlubGluZSBib29sIGhhc1N0cmluZ1ZhbHVlKCkgY29uc3QKKwl7CisJCXJldHVybiggZ2V0VmFsdWUoKS5pczwgU3RyaW5nID4oKSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogZm9yIFNUUklOR19JRCBhdHRyaWJ1ZQorCSAqLworCWlubGluZSBzdGQ6OnN0cmluZyBnZXRJZGVudGlmaWVyVmFsdWUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBnZXRWYWx1ZSgpLnRvSWRlbnRpZmllcigpICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBmb3IgU1RSSU5HX1VGSSBhdHRyaWJ1ZQorCSAqLworCWlubGluZSBzdGQ6OnN0cmluZyBnZXRVZmlWYWx1ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGdldFZhbHVlKCkudG9VZmkoKSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogZm9yIEF2bUNvZGUgYXR0cmlidWUKKwkgKi8KKwljb25zdCBCRkNvZGUgJiBnZXRBdm1Db2RlVmFsdWUoKSBjb25zdDsKKworCWJvb2wgaGFzQXZtQ29kZVZhbHVlKCkgY29uc3Q7CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIGZvciBCdWlsdGluQXJyYXkgYXR0cmlidXRlCisJICovCisJQnVpbHRpbkFycmF5ICogZ2V0QnVpbHRpbkFycmF5VmFsdWUoKSBjb25zdDsKKworCWJvb2wgaGFzQnVpbHRpbkFycmF5VmFsdWUoKSBjb25zdDsKKworCUJGIGdldEFycmF5VmFsdWUoKSBjb25zdDsKKworCWJvb2wgaGFzQXJyYXlWYWx1ZSgpIGNvbnN0OworCisKKwlpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmdWYWx1ZShhdm1fc2l6ZV90IG9mZnNldCkgY29uc3QKKwl7CisJCXJldHVybiggdG9TdHJpbmdWYWx1ZShnZXRCdWlsdGluQXJyYXlWYWx1ZSgpLCBvZmZzZXQpICk7CisJfQorCisJc3RkOjpzdHJpbmcgdG9TdHJpbmdWYWx1ZShCdWlsdGluQXJyYXkgKiBhbkFycmF5LCBhdm1fc2l6ZV90IG9mZnNldCkgY29uc3Q7CisKKworCS8qKgorCSAqIFNlcmlhbGl6YXRpb24KKwkgKi8KKwlpbmxpbmUgc3RhdGljIHN0ZDo6c3RyaW5nIHRvU3RyaW5nVmFsdWUoY29uc3QgQkYgJiBhVmFsdWUpCisJeworCQlpZiggYVZhbHVlLmlzPCBTdHJpbmcgPigpICkKKwkJeworCQkJcmV0dXJuKCBhVmFsdWUudG9fcHRyPCBTdHJpbmcgPigpLT5nZXRWYWx1ZSgpICk7CisJCX0KKworCQlyZXR1cm4oIGFWYWx1ZS5zdHIoKSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHRvU3RyaW5nVmFsdWUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCB0b1N0cmluZ1ZhbHVlKCBnZXRWYWx1ZSgpICkgKTsKKwl9CisKK307CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKiBGTUxfV09SS0ZMT1dfV1BST1BFUlRZSU1QTF9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvbWFpbi9Bdm1MYXVuY2hlci5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9tYWluL0F2bUxhdW5jaGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmYyOTcxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvbWFpbi9Bdm1MYXVuY2hlci5jcHAKQEAgLTAsMCArMSw0NDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkF2bUxhdW5jaGVyLmgiCisKKyNpbmNsdWRlIDxiYXNlL0NsYXNzS2luZEluZm8uaD4KKworI2luY2x1ZGUgPGJ1aWxkZXIvQnVpbGRlci5oPgorI2luY2x1ZGUgPGJ1aWxkZXIvTG9hZGVyLmg+CisKKyNpbmNsdWRlIDxtYWluL1NpZ25hbEhhbmRsZXIuaD4KKworI2luY2x1ZGUgPGNvbXB1dGVyL0Vudmlyb25tZW50RmFjdG9yeS5oPgorCisjaW5jbHVkZSA8ZmFtL2FwaS9Qcm9jZXNzb3JVbml0UmVwb3NpdG9yeS5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZUxpYi5oPgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkZhY3RvcnkuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL1J1bnRpbWVMaWIuaD4KKworI2luY2x1ZGUgPGZtbC90eXBlL1R5cGVNYW5hZ2VyLmg+CisKKyNpbmNsdWRlIDxzb2x2ZXIvYXBpL1NvbHZlckRlZi5oPgorI2luY2x1ZGUgPHNvbHZlci9hcGkvU29sdmVyRmFjdG9yeS5oPgorCisjaW5jbHVkZSA8dXRpbC9hdm1fc3RyaW5nLmg+CisjaW5jbHVkZSA8dXRpbC9FeGVjdXRpb25UaW1lLmg+CisKKyNpbmNsdWRlIDxib29zdC9maWxlc3lzdGVtLmhwcD4KKworI2lmZGVmIF9BVk1fQlVJTFRfV0lUSF9DTUFLRV8KKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisjaW5jbHVkZSAiY29uZnMuaCIKKyNlbmRpZiAvKl9BVk1fQlVJTFRfV0lUSF9DTUFLRV8qLworCisKK25hbWVzcGFjZSBzZXAKK3sKKworI2RlZmluZSBfU1lNQkVYX1ZFUlNJT05fICAgICAgICAgICAgMworI2RlZmluZSBfU1lNQkVYX1ZFUlNJT05fTUFKT1JfICAgICAgNgorI2RlZmluZSBfU1lNQkVYX1ZFUlNJT05fUEFUQ0hMRVZFTF8gMAorCisKKy8vY29uc3QgdW5zaWduZWQgICAgQXZtTGF1bmNoZXI6OlNVQlZFUlNJT05fUkVWSVNJT05fTlVNQkVSID0gNDgzODsKKy8vY29uc3Qgc3RkOjpzdHJpbmcgQXZtTGF1bmNoZXI6OlNVQlZFUlNJT05fUkVWSVNJT05fU1RSSU5HID0gIjQ4MzgiOworCisKKyNpZmRlZiBfR0lUX1ZFUlNJT05fCisKKwkjZGVmaW5lIEdJVF9WRVJTSU9OICAgX0dJVF9WRVJTSU9OXworCisjZWxzZQorCisvLwkjZGVmaW5lIEdJVF9WRVJTSU9OICJcIiQoc2hlbGwgZ2l0IGRlc2NyaWJlIC0tYWx3YXlzIC0tdGFncylcIiIKKwkjZGVmaW5lIEdJVF9WRVJTSU9OICJcIiQoc2hlbGwgZ2l0IHJldi1wYXJzZSBIRUFEKVwiIgorCisjZW5kaWYKKworCitzdGQ6OnN0cmluZyBBdm1MYXVuY2hlcjo6U1lNQkVYX1NDTV9WRVJTSU9OID0gR0lUX1ZFUlNJT047CisvLwkJT1NTKCIiKSA8PCBfU1lNQkVYX1ZFUlNJT05fIDw8ICcuJyA8PCBfU1lNQkVYX1ZFUlNJT05fTUFKT1JfOworLy8vLwkJCTw8ICcuJyA8PCBfU1lNQkVYX1ZFUlNJT05fUEFUQ0hMRVZFTF87CisKK3N0ZDo6c3RyaW5nIEF2bUxhdW5jaGVyOjpTWU1CRVhfQlVJTERfSUQgPSBHSVRfVkVSU0lPTjsKKy8vCQlTVUJWRVJTSU9OX1JFVklTSU9OX1NUUklORzsKKworc3RkOjpzdHJpbmcgQXZtTGF1bmNoZXI6OlNZTUJFWF9CVUlMRF9JTkZPID0KKwkJT1NTKCIiKSA8PCAiR2l0LVZlcnNpb248ICIgPDwgU1lNQkVYX1NDTV9WRVJTSU9OIDw8ICIgPiI7CisvLwkJT1NTKCIiKSA8PCAiVmVyc2lvbiAiIDw8IFNZTUJFWF9TQ01fVkVSU0lPTgorLy8JCQkJPDwgIiBidWlsZCAiIDw8IFNZTUJFWF9CVUlMRF9JRDsKKworCisvKioKKyAqIExPQURFUgorICovCitib29sIEF2bUxhdW5jaGVyOjpsb2FkKCkKK3sKKwljb3B5cmlnaHQoKTsKKworCWlmKCBnZXRBcmdOdW1iZXIoKSA+IDEgKQorCXsKKwkJc3RkOjpzdHJpbmcgYXJnOworCQlmb3IoIGF2bV9zaXplX3QgaSA9IDEgOyBpIDwgZ2V0QXJnTnVtYmVyKCkgOyArK2kgKQorCQl7CisJCQlhcmcgPSBnZXRBcmd1bWVudCggaSApOworCisJCQlpZiggYXJnWzBdICE9ICctJyApCisJCQl7CisJCQkJVkZTOjpXb3JrZmxvd1BhdGggPSBhcmc7CisJCQl9CisJCQllbHNlIGlmKCAoYXJnLmZpbmQoIi0tZmF2bT0iKSA9PSAwKSB8fCAoYXJnLmZpbmQoIi0tc3BlYz0iKSA9PSAwKSApCisJCQl7CisJCQkJVkZTOjpXb3JrZmxvd1BhdGggPQorCQkJCQkJYXJnLnN1YnN0cihzdGQ6OnN0cmxlbigiLS1mYXZtPSIpLCBhcmcuc2l6ZSgpKTsKKwkJCX0KKwkJCWVsc2UgaWYoIChhcmcgPT0gIi0tZmF2bSIpIHx8IChhcmcgPT0gIi0tc3BlYyIpICkKKwkJCXsKKwkJCQlWRlM6OldvcmtmbG93UGF0aCA9IGdldEFyZ3VtZW50KCArK2kgKTsKKwkJCX0KKworCQkJZWxzZSBpZiggYXJnID09ICItLXN0YW5kYWxvbmUiICkKKwkJCXsKKwkJCQlBVk1fRVhFQ19NT0RFX1NFVCggU1RBTkRBTE9ORSApOworCQkJfQorCQkJZWxzZSBpZiggKGFyZyA9PSAiLS1zZXJ2ZXIiKSB8fCAoYXJnID09ICItc2VydmVyIikgKQorCQkJeworCQkJCUFWTV9FWEVDX01PREVfU0VUKCBTRVJWRVIgKTsKKwkJCX0KKwkJCWVsc2UgaWYoIGFyZyA9PSAiLS1pbnRlcmFjdGl2ZSIgKQorCQkJeworCQkJCUFWTV9FWEVDX01PREVfU0VUKCBJTlRFUkFDVElWRSApOworCQkJfQorCisJCQllbHNlIGlmKCBhcmcuZmluZCgiLS1sb2c9IikgPT0gMCApCisJCQl7CisJCQkJQVZNX0xPR19GSUxFX0xPQ0FUSU9OID0KKwkJCQkJCWFyZy5zdWJzdHIoc3RkOjpzdHJsZW4oIi0tbG9nPSIpLCBhcmcuc2l6ZSgpKTsKKwkJCX0KKwkJCWVsc2UgaWYoIGFyZyA9PSAiLS1sb2ciICkKKwkJCXsKKwkJCQlBVk1fTE9HX0ZJTEVfTE9DQVRJT04gPSBnZXRBcmd1bWVudCggKytpICk7CisJCQl9CisKKwkJCWVsc2UgaWYoIGFyZy5maW5kKCItLXRyYWNlPSIpID09IDAgKQorCQkJeworCQkJCUFWTV9MT0dfRklMRV9MT0NBVElPTiA9CisJCQkJCQlhcmcuc3Vic3RyKHN0ZDo6c3RybGVuKCItLXRyYWNlPSIpLCBhcmcuc2l6ZSgpKTsKKwkJCX0KKwkJCWVsc2UgaWYoIGFyZyA9PSAiLS10cmFjZSIgKQorCQkJeworCQkJCUFWTV9UUkFDRV9GSUxFX0xPQ0FUSU9OID0gZ2V0QXJndW1lbnQoICsraSApOworCQkJfQorCisJCQllbHNlIGlmKCBhcmcuZmluZCgiLS1kZWJ1Zz0iKSA9PSAwICkKKwkJCXsKKwkJCQlhdm1fc2V0RGVidWdMZXZlbCgKKwkJCQkJCWFyZy5zdWJzdHIoc3RkOjpzdHJsZW4oIi0tZGVidWc9IiksIGFyZy5zaXplKCkpICk7CisJCQl9CisJCQllbHNlIGlmKCBhcmcgPT0gIi0tZGVidWciICkKKwkJCXsKKwkJCQlhdm1fc2V0RGVidWdMZXZlbCggZ2V0QXJndW1lbnQoICsraSApICk7CisJCQl9CisKKwkJCWVsc2UgaWYoIGFyZyA9PSAiLS1zaWxlbnQiICkKKwkJCXsKKwkJCQlBVk1fRVhFQ19WRVJCT1NJVFlfU0VUKCBNSU5JTVVNICk7CisJCQl9CisKKwkJCWVsc2UgaWYoIGFyZy5maW5kKCItLXZlcmJvc2l0eT0iKSA9PSAwICkKKwkJCXsKKwkJCQlhdm1fc2V0RXhlY1ZlcmJvc2l0eUxldmVsKAorCQkJCQkJYXJnLnN1YnN0cihzdGQ6OnN0cmxlbigiLS12ZXJib3NpdHk9IiksIGFyZy5zaXplKCkpICk7CisJCQl9CisJCQllbHNlIGlmKCBhcmcgPT0gIi0tdmVyYm9zaXR5IiApCisJCQl7CisJCQkJYXZtX3NldEV4ZWNWZXJib3NpdHlMZXZlbCggZ2V0QXJndW1lbnQoICsraSApICk7CisJCQl9CisKKwkJCWVsc2UgaWYoIChhcmcgPT0gIi0tZW5hYmxlZC1wcm9jZXNzb3JzLWxpc3QiKQorCQkJCQl8fCAoYXJnID09ICItLWVuYWJsZWQtZmFtLWxpc3QiKSApCisJCQl7CisJCQkJUHJvY2Vzc29yVW5pdFJlcG9zaXRvcnk6OnRvU3RyZWFtQWxsKCBBVk1fT1NfQ09VVCApOworCisJCQkJUHJvY2Vzc29yVW5pdFJlcG9zaXRvcnk6OnRvU3RyZWFtRXhwb3J0ZWQoIEFWTV9PU19DT1VUICk7CisJCQl9CisJCQllbHNlIGlmKCBhcmcgPT0gIi0tZW5hYmxlZC1zb2x2ZXJzLWxpc3QiICkKKwkJCXsKKwkJCQlTb2x2ZXJEZWY6OnRvU3RyZWFtU29sdmVyTGlzdCggQVZNX09TX0NPVVQgKTsKKwkJCX0KKworCQkJZWxzZQorCQkJeworCQkJCUFWTV9PU19XQVJOSU5HX0FMRVJUCisJCQkJCQk8PCAiVW5rbm93biBBVk0gbGF1bmNoIG9wdGlvbiA8PCAiIDw8IGFyZyA8PCAiID4+ICEhISIKKwkJCQkJCTw8IFNFTkRfQUxFUlQ7CisJCQl9CisJCX0KKwl9CisJZWxzZQorCXsKKwkJdXNhZ2UoKTsKKworCQk6OmV4aXQoMSk7CisJfQorCisJLyoKKwkgKiBMT0FECisJICogUHJlZGVmaW5lZCBGT1JNCisJICovCisJWExJQV9TWU5UQVg6OmxvYWQoKTsKKworCUV4cHJlc3Npb25GYWN0b3J5Ojpsb2FkKCk7CisKKwkvLyBhZnRlciBsb2FkaW5nIHBhcmFtZXRlci4uLgorCS8vCVNvbHZlckZhY3Rvcnk6OmxvYWQoKTsKKworCVR5cGVNYW5hZ2VyOjpsb2FkKCk7CisKKworCUVudmlyb25tZW50RmFjdG9yeTo6bG9hZCgpOworCisJQnVpbGRlcjo6bG9hZCgpOworCisJRXhlY3V0YWJsZUxpYjo6bG9hZCgpOworCisJUnVudGltZUxpYjo6bG9hZCgpOworCisKKwltV29ya2Zsb3cubG9hZCgpOworCisJYXZtX3JlcG9ydChBVk1fT1NfTE9HLCAiQXZtTGF1bmNoZXI6OmxvYWQgYXQgdGhlIGVuZCIpOworCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworLyoqCisgKiBESVNQT1NFUgorICovCit2b2lkIEF2bUxhdW5jaGVyOjpkaXNwb3NlKCkKK3sKKwlFbnZpcm9ubWVudEZhY3Rvcnk6OmRpc3Bvc2UoKTsKKworCVNvbHZlckZhY3Rvcnk6OmRpc3Bvc2UoKTsKKworCisJbVdvcmtmbG93LmRpc3Bvc2UoKTsKKworCisJUnVudGltZUxpYjo6ZGlzcG9zZSgpOworCisJRXhlY3V0YWJsZUxpYjo6ZGlzcG9zZSgpOworCisJQnVpbGRlcjo6ZGlzcG9zZSgpOworCisKKwlUeXBlTWFuYWdlcjo6ZGlzcG9zZSgpOworCisJRXhwcmVzc2lvbkZhY3Rvcnk6OmRpc3Bvc2UoKTsKKworCVhMSUFfU1lOVEFYOjpkaXNwb3NlKCk7CisKKwljb3B5cmlnaHQoKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEF2bUxhdW5jaGVyOjpjb3B5cmlnaHQoKQoreworCUFWTV9PU19DT1VUIDw8IHN0ZDo6ZW5kbCA8PCBBVk1fVEFCMV9JTkRFTlQKKwkJCTw8IFRBQiA8PCAiU1lNQkVYPCBESVZFUlNJVFkgPiAiCisKKyNpZm5kZWYgX0FWTV9CVUlMVF9XSVRIX0NNQUtFXworCisJCQk8PCBTWU1CRVhfQlVJTERfSU5GTworI2Vsc2UKKwkJCTw8IHNvdXJjZXNfY29tbWl0X2lkIDw8ICIgYnVpbHQgb24gIiA8PCBzeXN0ZW1fbmFtZQorCisjZW5kaWYgLypfQlVJTFRfV0lUSF9DTUFLRV8qLworCisJCQk8PCAiIEAgIiA8PCBfX0RBVEVfXyA8PCBzdGQ6OmVuZGwKKwkJCTw8IFRBQiA8PCAiMjAxMCAtIDIwMTYgQ0VBIExpc3QiIDw8IHN0ZDo6ZW5kbAorLy8JCQk8PCBUQUIgPDwgIjE5OTggLSAyMDEzIENFQSBMaXN0IiA8PCBzdGQ6OmVuZGwKKwkJCTw8IFRBQiA8PCAiQWxsIFJpZ2h0cyBSZXNlcnZlZCIgPDwgc3RkOjplbmRsCisJCQk8PCBUQUIgPDwgIkxhdW5jaCBAICIgPDwgRXhlY3V0aW9uVGltZTo6Y3VycmVudF90aW1lKCkKKwkJCTw8IHN0ZDo6ZW5kbCA8PCBFTkRfSU5ERU5UOworfQorCisKKy8qKgorICogQXZtTGF1bmNoZXI6OnVzYWdlCisgKgorICovCit2b2lkIEF2bUxhdW5jaGVyOjp1c2FnZSgpCit7CisJQVZNX09TX0xPRyA8PCAiIFVzYWdlIDo+IGF2bS5leGUgcGFyYW1ldGVyZmlsZSAoaW4gRkFWTSBmb3JtYXQpIiA8PCBzdGQ6OmVuZGw7CisKKwlzdGQ6OmNpbi5nZXQoKTsKK30KKworCisvKioKKyAqIEF2bUxhdW5jaGVyOjpzdGFydAorICoKKyAqLwordm9pZCBBdm1MYXVuY2hlcjo6c3RhcnQoKQoreworCS8qCisJICogSU5JVElBTElaQVRJT04KKwkgKiBwYXJhbWV0ZXIgRk9STQorCSAqLworCWlmKCBub3QgbVdvcmtmbG93LmxvYWRDb25maWd1cmF0aW9uKFZGUzo6V29ya2Zsb3dQYXRoKSApCisJeworCQlyZXR1cm47CisJfQorCisJU29sdmVyRmFjdG9yeTo6bG9hZCgpOworCisJLyoKKwkgKiBSVU5OSU5HCisJICogcGFyYW1ldGVyIEZPUk0KKwkgKi8KKwl0cnkKKwl7CisJCVNpZ25hbEhhbmRsZXI6OnNldFNJR0lOVF9oYW5kbGVyKCk7CisKKwkJaWYoIG1Xb3JrZmxvdy5jb25maWd1cmUoKSApCisJCXsKKwkJCW1Xb3JrZmxvdy5zdGFydENvbXB1dGluZygpOworCQl9CisJfQorCWNhdGNoICggY29uc3Qgc3RkOjpleGNlcHRpb24gJiBlICkKKwl7CisJCUFWTV9PU19XQVJOIDw8IHN0ZDo6ZW5kbCA8PCBFTVBIQVNJUygKKwkJCQkiQXZtTGF1bmNoZXI6OnN0YXJ0PCBzdGQ6OmV4Y2VwdGlvbiA+IiwgZS53aGF0KCksICcqJywgODApOworCX0KKwljYXRjaCAoIC4uLiApCisJeworCQlBVk1fT1NfV0FSTiA8PCBzdGQ6OmVuZGwgPDwgRU1QSEFTSVMoCisJCQkJIkF2bUxhdW5jaGVyOjpzdGFydDwgdW5rbm93bjo6ZXhjZXB0aW9uID4gISEhIiwgJyonLCA4MCk7CisJfQorfQorCisKK2ludCBBdm1MYXVuY2hlcjo6cnVuKCBpbnQgYXJnYyAsIGNoYXIgKiBhcmd2W10gKQoreworCWlmKCBhcmd2ICE9IE5VTEwgKQorCXsKKwkJVkZTOjpFeGVjdXRhYmxlUGF0aCA9IGFyZ3ZbMF07CisJfQorCVZGUzo6TGF1bmNoUGF0aCA9IGJvb3N0OjpmaWxlc3lzdGVtOjpjdXJyZW50X3BhdGgoKS5zdHJpbmcoKTsKKworCUNsYXNzS2luZEluZm9Jbml0aWFsaXplcjo6bG9hZCgpOworCisJc3RkOjpzdHJpbmcgc3RyQWN0aW9uID0gIiBUaGUgQXZtTGF1bmNoZXI6Om1haW4iOworCisJT3V0U3RyZWFtOjpsb2FkKCk7CisKKwl0cnkKKwl7CisJCXNlcDo6QXZtTGF1bmNoZXIgdGhlQXZtTGF1bmNoZXIoCisJCQkJKGFyZ2MgPCAwKT8gMCA6IHN0YXRpY19jYXN0PCBhdm1fc2l6ZV90ID4oYXJnYykgLCBhcmd2KTsKKworCQlzdHJBY3Rpb24gPSAiIFRoZSBBdm1MYXVuY2hlcjo6bG9hZCI7CisJCWlmKCB0aGVBdm1MYXVuY2hlci5sb2FkKCkgKQorCQl7CisJCQlzd2l0Y2goIF9BVk1fRVhFQ19NT0RFXyApCisJCQl7CisJCQkJY2FzZSBBVk1fRVhFQ19TVEFOREFMT05FX01PREU6CisJCQkJY2FzZSBBVk1fRVhFQ19TRVJWRVJfTU9ERToKKwkJCQljYXNlIEFWTV9FWEVDX0lOVEVSQUNUSVZFX01PREU6CisJCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCWlmKCBub3QgVkZTOjpXb3JrZmxvd1BhdGguZW1wdHkoKSApCisJCQkJCXsKKwkJCQkJCVZGUzo6V29ya2Zsb3dQYXRoID0gVkZTOjpuYXRpdmVfcGF0aCgKKwkJCQkJCQkJVkZTOjpXb3JrZmxvd1BhdGgsIFZGUzo6TGF1bmNoUGF0aCk7CisKKwkJCQkJCWlmKCBWRlM6OmNoZWNrUmVhZGluZ0ZpbGUoIFZGUzo6V29ya2Zsb3dQYXRoICkgKQorCQkJCQkJeworCQkJCQkJCXN0ckFjdGlvbiA9ICIgVGhlQXZtTGF1bmNoZXI6OnN0YXJ0IjsKKworCQkJCQkJCXRoZUF2bUxhdW5jaGVyLnN0YXJ0KCk7CisKKwkJCQkJCQlhdm1fcmVwb3J0KEFWTV9PU19MT0csCisJCQkJCQkJCQkiQXZtTGF1bmNoZXI6OnJ1biBhZnRlciB0aGlzLnN0YXJ0KCkiKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlBVk1fT1NfQ0VSUiA8PCBfU0VXXyA8PCAiPCBlcnJvciA+IgorCQkJCQkJCQkJIiBVbnJlYWRhYmxlIG9yIG5vbi1leGlzdGVudCBmaWxlICEiCisJCQkJCQkJCQk8PCBzdGQ6OmVuZGwKKwkJCQkJCQkJCTw8IF9TRVdfIDw8ICI8IGluZm8gID4gTGF1bmNoIHBhdGggOiAiCisJCQkJCQkJCQk8PCBWRlM6OkxhdW5jaFBhdGggPDwgc3RkOjplbmRsOworCisJCQkJCQkJYXZtX3NldF9leGl0X2NvZGUoIEFWTV9FWElUX0NPTkZJR1VSRV9FUlJPUl9DT0RFICk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisKKwkJc3RyQWN0aW9uID0gIiBUaGUgQXZtTGF1bmNoZXI6OmRpc3Bvc2UiOworCisJCXRoZUF2bUxhdW5jaGVyLmRpc3Bvc2UoKTsKKwl9CisJY2F0Y2ggKCBjb25zdCBzdGQ6OmV4Y2VwdGlvbiAmIGUgKQorCXsKKwkJQVZNX09TX1dBUk4gPDwgc3RkOjplbmRsIDw8IEVNUEhBU0lTKAorCQkJKHN0ckFjdGlvbiArICI8IHN0ZDo6ZXhjZXB0aW9uID4gIiksIGUud2hhdCgpLCAnKicsIDgwKTsKKwl9CisJY2F0Y2ggKCAuLi4gKQorCXsKKwkJQVZNX09TX1dBUk4gPDwgc3RkOjplbmRsIDw8IEVNUEhBU0lTKAorCQkJKHN0ckFjdGlvbiArICI8IHVua25vd246OmV4Y2VwdGlvbiA+ICEhISIpLCAnKicsIDgwKTsKKwl9CisKKworCWF2bV9yZXBvcnQoQVZNX09TX0xPRywgIjo6bWFpbiBhdCB0aGUgZW5kIik7CisKK0FWTV9JRl9ERUJVR19GTEFHKCBSRUZFUkVOQ0VfQ09VTlRJTkcgKQorCisJYXZtX3JlcG9ydChBVk1fT1NfQ09VVCwgIjo6bWFpbiBhdCB0aGUgZW5kIik7CisKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBSRUZFUkVOQ0VfQ09VTlRJTkcgKQorCisKKwlPdXRTdHJlYW06OmRpc3Bvc2UoKTsKKworCUNsYXNzS2luZEluZm9Jbml0aWFsaXplcjo6ZGlzcG9zZSgpOworCisJQVZNX09TX0NPVVQgPDwgZXhpdF9tc2coIF9BVk1fRVhJVF9DT0RFXyApOworCisJcmV0dXJuKCBfQVZNX0VYSVRfQ09ERV8gKTsKK30KKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL21haW4vQXZtTGF1bmNoZXIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL21haW4vQXZtTGF1bmNoZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGQxMzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvbWFpbi9Bdm1MYXVuY2hlci5oCkBAIC0wLDAgKzEsMTEwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgTUFJTl9MQVVOQ0hFUl9IXworI2RlZmluZSBNQUlOX0xBVU5DSEVSX0hfCisKKyNpbmNsdWRlIDx1dGlsL2F2bV91dGlsLmg+CisKKyNpbmNsdWRlIDxzZXcvV29ya2Zsb3cuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworY2xhc3MgQXZtTGF1bmNoZXIKK3sKKworcHJvdGVjdGVkIDoKKwkvKioKKwkgKiBBVFRSSUJVVEVTCisJICovCisJYXZtX3NpemVfdCBtQXJnTnVtYmVyOworCWNoYXIgKiAqICAgbUFyZ3VtZW50OworCisJV29ya2Zsb3cgbVdvcmtmbG93OworCisKK3B1YmxpYyA6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQXZtTGF1bmNoZXIoIGF2bV9zaXplX3QgYXJnYyAsIGNoYXIgKiBhcmd2W10gKQorCTogbUFyZ051bWJlciggYXJnYyApLAorCW1Bcmd1bWVudCggYXJndiApLAorCW1Xb3JrZmxvdyggU1lNQkVYX0JVSUxEX0lEICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5Bdm1MYXVuY2hlcigpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIExPQURFUiAtIERJU1BPU0VSCisJICovCisJYm9vbCBsb2FkKCk7CisJdm9pZCBkaXNwb3NlKCk7CisKKworCS8qTUVUSE9EUyovCisJc3RhdGljIHZvaWQgY29weXJpZ2h0KCk7CisJc3RhdGljIHZvaWQgdXNhZ2UoKTsKKworCXZvaWQgc3RhcnQoKTsKKworCisJLypBVFRSSUJVVEVTKi8KKy8vCXN0YXRpYyBjb25zdCB1bnNpZ25lZCAgICBTVUJWRVJTSU9OX1JFVklTSU9OX05VTUJFUjsKKy8vCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBTVUJWRVJTSU9OX1JFVklTSU9OX1NUUklORzsKKworCXN0YXRpYyBzdGQ6OnN0cmluZyBTWU1CRVhfU0NNX1ZFUlNJT047CisJc3RhdGljIHN0ZDo6c3RyaW5nIFNZTUJFWF9CVUlMRF9JRDsKKworCXN0YXRpYyBzdGQ6OnN0cmluZyBTWU1CRVhfQlVJTERfSU5GTzsKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1Bcmd1bWVudAorCSAqLworCWlubGluZSBhdm1fc2l6ZV90IGdldEFyZ051bWJlcigpCisJeworCQlyZXR1cm4oIG1BcmdOdW1iZXIgKTsKKwl9CisKKwlpbmxpbmUgY2hhciAqIGdldEFyZ3VtZW50KGF2bV9zaXplX3QgaW5kZXgpCisJeworCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX0FSUkFZX0lOREVYX0VYSVQoIGluZGV4ICwgbUFyZ051bWJlciApIDw8IFNFTkRfRVhJVDsKKworCQlyZXR1cm4oIG1Bcmd1bWVudFtpbmRleF0gKTsKKwl9CisKKwkvKioKKwkgKiBydW4KKwkgKi8KKwlzdGF0aWMgaW50IHJ1biggaW50IGFyZ2MgLCBjaGFyICogYXJndltdICk7CisKK307CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKiBNQUlOX0xBVU5DSEVSX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9tYWluL0F2bU1haW4uY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvbWFpbi9Bdm1NYWluLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjAxOGVkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvbWFpbi9Bdm1NYWluLmNwcApAQCAtMCwwICsxLDMyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjQgamFudi4gMjAxNAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQXZtTWFpbi5oIgorCisjaW5jbHVkZSAiQXZtTGF1bmNoZXIuaCIKKworCituYW1lc3BhY2Ugc2VwCit7CisKK2ludCBBdm1NYWluOjpydW4oIGludCBhcmdjICwgY2hhciAqIGFyZ3ZbXSApCit7CisJcmV0dXJuKCBzZXA6OkF2bUxhdW5jaGVyOjpydW4oYXJnYyAsIGFyZ3YpICk7Cit9CisKKworCit9CisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL21haW4vQXZtTWFpbi5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvbWFpbi9Bdm1NYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUxZDQzYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL21haW4vQXZtTWFpbi5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyNCBqYW52LiAyMDE0CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQVZNTUFJTl9IXworI2RlZmluZSBBVk1NQUlOX0hfCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjbGFzcyBBdm1NYWluCit7CisKK3B1YmxpYzoKKwlzdGF0aWMgaW50IHJ1biggaW50IGFyZ2MgLCBjaGFyICogYXJndltdICk7CisKK307CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKiBBVk1NQUlOX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9tYWluL1JFQURNRS5tZCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL21haW4vUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMjNhODYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9tYWluL1JFQURNRS5tZApAQCAtMCwwICsxLDEwIEBACisjIEVGTS1TWU1CRVggOiBNYWluIENQUAorCisjIyBTb3VyY2UgY29kZSBzdHJ1Y3R1cmUKKworIyMjIEludGVyZmFjZXMKKworIyMjIENsYXNzZXMKKworIyMjIEZhY3RvcmllcworCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9tYWluL1NpZ25hbEhhbmRsZXIuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvbWFpbi9TaWduYWxIYW5kbGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjVlMmU1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvbWFpbi9TaWduYWxIYW5kbGVyLmNwcApAQCAtMCwwICsxLDY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxjc2lnbmFsPgorCisjaW5jbHVkZSAiU2lnbmFsSGFuZGxlci5oIgorCisjaW5jbHVkZSA8cHJpbnRlci9PdXRTdHJlYW0uaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKK2Jvb2wgU2lnbmFsSGFuZGxlcjo6U0lHTkFMX0lOVEVSUlVQVF9GTEFHID0gZmFsc2U7CisKKworLyoqCisgKiBTaWduYWxIYW5kbGVyOjpTSUdJTlRfaGFuZGxlcgorICoKKyAqLwordm9pZCBTaWduYWxIYW5kbGVyOjpTSUdJTlRfaGFuZGxlcihpbnQgbkZsYWcpCit7CisJc2V0U0lHSU5UKCk7CisKKwlBVk1fT1NfV0FSTiA8PCBzdGQ6OmVuZGwgPDwgRU1QSEFTSVMoCisJCQkiU0lHSU5UOjpoYW5kbGVyPCBDVFJMLUMgSU5URVJSVVBUSU9OID4iLCAnKicsIDgwKTsKK30KKworLyoqCisgKiBTaWduYWxIYW5kbGVyOjpzZXRTSUdJTlRfaGFuZGxlcgorICoKKyAqLwordm9pZCBTaWduYWxIYW5kbGVyOjpzZXRTSUdJTlRfaGFuZGxlcigpCit7CisJY2xlYXJTSUdJTlQoKTsKKworI2lmZGVmIF9fQVZNX1VOSVhfXworCisJc3RhdGljIHN0cnVjdCA6OnNpZ2FjdGlvbiBTSUdJTlRfYWN0aW9uOworCTo6c2lnZW1wdHlzZXQoICYgU0lHSU5UX2FjdGlvbi5zYV9tYXNrICk7CisJU0lHSU5UX2FjdGlvbi5zYV9mbGFncyA9IDA7CisKKwlTSUdJTlRfYWN0aW9uLnNhX2hhbmRsZXIgPSBTSUdJTlRfaGFuZGxlcjsKKworCS8qIFJlZ2lzdGVyIHRoZSBoYW5kbGVyIGZvciBTSUdJTlQuICovCisJOjpzaWdhY3Rpb24oU0lHSU5ULCAmU0lHSU5UX2FjdGlvbiwgMCk7CisKKy8vIDo6c2lnYWN0aW9uKFNJR0NPTlQsICZTSUdJTlRfYWN0aW9uLCAwKTsKKworI2VuZGlmIC8qIF9fQVZNX1VOSVhfXyAqLworfQorCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL21haW4vU2lnbmFsSGFuZGxlci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvbWFpbi9TaWduYWxIYW5kbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA0Y2M3NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL21haW4vU2lnbmFsSGFuZGxlci5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgTUFJTl9TSUdOQUxIQU5ETEVSX0hfCisjZGVmaW5lIE1BSU5fU0lHTkFMSEFORExFUl9IXworCisKK25hbWVzcGFjZSBzZXAKK3sKKworY2xhc3MgU2lnbmFsSGFuZGxlcgoreworCitwcml2YXRlIDoKKwkvKioKKwkgKiBBVFRSSUJVVEVTCisJICovCisJc3RhdGljIGJvb2wgU0lHTkFMX0lOVEVSUlVQVF9GTEFHOworCitwdWJsaWMgOgorICAgc3RhdGljIGJvb2wgU0lHTkFMX1FVSVRfRkxBRzsKKworCisJLyoqCisJICogY2xlYXJTSUdJTlQKKwkgKgorCSAqLworCWlubGluZSBzdGF0aWMgdm9pZCBjbGVhclNJR0lOVCgpCisJeworCQlTSUdOQUxfSU5URVJSVVBUX0ZMQUcgPSBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBpc1NJR0lOVAorCSAqCisJICovCisJaW5saW5lIHN0YXRpYyBib29sIGlzU0lHSU5UKCkKKwl7CisJCXJldHVybiggU0lHTkFMX0lOVEVSUlVQVF9GTEFHICk7CisJfQorCisJLyoqCisJICogc2V0U0lHSU5UCisJICoKKwkgKi8KKwlpbmxpbmUgc3RhdGljIHZvaWQgc2V0U0lHSU5UKCkKKwl7CisJCVNJR05BTF9JTlRFUlJVUFRfRkxBRyA9IHRydWU7CisJfQorCisJc3RhdGljIHZvaWQgU0lHSU5UX2hhbmRsZXIoaW50IG5GbGFnKTsKKworCXN0YXRpYyB2b2lkIHNldFNJR0lOVF9oYW5kbGVyKCk7CisKK307CisKKworfQorCisjZW5kaWYgLyogTUFJTl9TSUdOQUxIQU5ETEVSX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9tYWluL21haW4uY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvbWFpbi9tYWluLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGY1NGY0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvbWFpbi9tYWluLmNwcApAQCAtMCwwICsxLDMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjQgamFudi4gMjAxNAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQXZtTWFpbi5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioKKyAqKiAgICAgICAgICAgICAgICAgbWFpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKgorICoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitpbnQgbWFpbiggaW50IGFyZ2MgLCBjaGFyICogYXJndltdICkKK3sKKwlyZXR1cm4oIHNlcDo6QXZtTWFpbjo6cnVuKGFyZ2MgLCBhcmd2KSApOworfQorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9tYWluL3ZlcnNpb24uaC5pbiBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL21haW4vdmVyc2lvbi5oLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmOGVhMGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9tYWluL3ZlcnNpb24uaC5pbgpAQCAtMCwwICsxLDMxIEBACisvKg0KKyAqIHZlcnNpb24uaA0KKyAqDQorICogIENyZWF0ZWQgb246IDI2IG1haSAyMDE2DQorICogICAgICBBdXRob3I6IHNzMjE5MzI2DQorICovDQorDQorLyogV2FybmluZyA6IHRoaXMgZmlsZSBpcyBuZWVkZWQgYnkgQ01ha2UgdG8gZ2VuZXJhdGUgdmVyc2lvbi5oIA0KKyAqIEV4cHJlc3Npb24gQC4uQCBhcmUgdmFyaWFibGVzIGlkZW50aWZpZXJzIHJlcGxhY2VkICBieSBDTWFrZSBhdA0KKyAqIGNvbmZpZ3VyZSB0aW1lIGJ5IHRoZWlyIGFjdHVhbCB2YWx1ZXMuIA0KKyAqIA0KKyAqIFRoZSByZXN1bHRpbmcgdmVyc2lvbi5oIGNhbiBiZSBpbmNsdWRlZCBhbnl3aGVyZSB0aGVyZSBpcyBhIG5lZWQgDQorICogdG8gYWNjZXNzIHRoZSBjb21taXQtaWQgc3RyaW5nIA0KKyAqLw0KKyANCisjaWZuZGVmIE1BSU5fVkVSU0lPTl9IX0lOXw0KKyNkZWZpbmUgTUFJTl9WRVJTSU9OX0hfSU5fDQorDQorDQorI2luY2x1ZGUgPHN0cmluZz4NCisNCit1c2luZyBuYW1lc3BhY2Ugc3RkOw0KKw0KK25hbWVzcGFjZSBzZXAgew0KKw0KK2NvbnN0IHN0cmluZyBzb3VyY2VzX2NvbW1pdF9pZCgiQEdJVF9DT01NSVRfSURAIik7DQorDQorfSAvKiBuYW1lc3BhY2Ugc2VwICovDQorDQorDQorI2VuZGlmIC8qIE1BSU5fVkVSU0lPTl9IX0lOXyAqLw0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9DTWFrZUxpc3RzLnR4dCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2ExNjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMjUgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgICAgICAgICAgICAgICAgQ01ha2UgZmlsZSBmb3IgdGhlIFBhcnNlciBsaWJyYXJ5IAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKyMgU291cmNlIGZpbGVzIHRvIHRha2UgaW50byBhY2NvdW50IChhbGwgZmlsZXMgbWF0Y2hpbmcgcGF0dGVybnMsIHJlY3Vyc2l2ZWx5KQorZmlsZSAoR0xPQl9SRUNVUlNFIFBBUlNFUl9DWFhfU1JDX0ZJTEVTICouY3BwICouaCAqLmMpCitmaWxlIChHTE9CX1JFQ1VSU0UgUEFSU0VSX0NfU1JDX0ZJTEVTICouYykKKworIyBBd2Z1bGwgaGFjayB0byBmb3JjZSBDKysgY29tcGlsYXRpb24gKHRoaXMgQyBmaWxlIGFjdHVhbGx5IGluY2x1ZGVzIGEgPGFsZ29yaXRobT4gVEwgaGVhZGVyLi4uKQorIyBUT0RPIDogRml4IHRoaXMgaW4gc291cmNlcworc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzICgke1BBUlNFUl9DX1NSQ19GSUxFU30gUFJPUEVSVElFUyBMQU5HVUFHRSBDWFggKQorCisjIFRhcmdldCB0byBidWlsZAorYWRkX2xpYnJhcnkgKHBhcnNlciBTVEFUSUMgJHtQQVJTRVJfQ1hYX1NSQ19GSUxFU30pCisKKyMgSW5jbHVkZSBkaXJlY3RvcmllcyAoaW50ZXJuYWwpCit0YXJnZXRfaW5jbHVkZV9kaXJlY3RvcmllcyAocGFyc2VyIFBVQkxJQyAuLikgI8KgRklYTUUgOiBleHBsaWNpdCB0aGUgZGVwZW5kZW5jaWVzIGxpYiBieSBsaWIKKworIyBUYXJnZXQgaW5jbHVkZSBkaXJlY3RvcmllcyAoZXh0ZXJuYWwpCit0YXJnZXRfaW5jbHVkZV9kaXJlY3RvcmllcyAocGFyc2VyIFBVQkxJQyAke0FOVExSX0lOQ0xVREVfRElSfSAke0FOVExSM0NfSU5DTFVERV9ESVJ9KQorCisKK2FkZF9kZXBlbmRlbmNpZXMocGFyc2VyIHJlc2Nhbl9jdmM0KQorYWRkX2RlcGVuZGVuY2llcyhwYXJzZXIgcmVzY2FuX2FudGxyMikKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9QYXJzZXJNYW5hZ2VyLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9QYXJzZXJNYW5hZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjRhYWI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL1BhcnNlck1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsMjcxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJQYXJzZXJNYW5hZ2VyLmgiCisKKyNpbmNsdWRlIDxhbnRsci9BTlRMUkV4Y2VwdGlvbi5ocHA+CisKKworI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9TeXN0ZW0uaD4KKyNpbmNsdWRlIDxmbWwvd29ya2Zsb3cvV09iamVjdC5oPgorCisjaW5jbHVkZSA8cGFyc2VyL3dvcmtmbG93L1dvcmtmbG93TGV4ZXIuaHBwPgorI2luY2x1ZGUgPHBhcnNlci93b3JrZmxvdy9Xb3JrZmxvd1BhcnNlci5ocHA+CisKKyNpbmNsdWRlIDxwYXJzZXIvbW9kZWwvZm1sTGV4ZXIuaD4KKyNpbmNsdWRlIDxwYXJzZXIvbW9kZWwvZm1sUGFyc2VyLmg+CisjaW5jbHVkZSA8cGFyc2VyL21vZGVsL1BhcnNlclV0aWwuaD4KKworI2luY2x1ZGUgPHByaW50ZXIvT3V0U3RyZWFtLmg+CisKKyNpbmNsdWRlIDx1dGlsL2F2bV92ZnMuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoqCisgKiBDT05TVFJVQ1RPUgorICogRGVmYXVsdAorICovCitQYXJzZXJNYW5hZ2VyOjpQYXJzZXJNYW5hZ2VyKGNvbnN0IHN0ZDo6c3RyaW5nICYgZmlsZUxvY2F0aW9uKQorOiBtRmlsZUxvY2F0aW9uKCBmaWxlTG9jYXRpb24gKSwKK21GaWxlbmFtZSggVkZTOjpmaWxlbmFtZSggZmlsZUxvY2F0aW9uICkgKSwKKworbUVycm9yQ291bnQoIDAgKSwKK21XYXJuaW5nQ291bnQoIDAgKSwKK21FeGNlcHRpb25NZXNzYWdlKCApCit7CisJLy8hISBOT1RISU5HCit9CisKKworLyoqCisgKiBQYXJzZXJNYW5hZ2VyOjpzdGFydAorICoKKyAqLworU3lzdGVtICogUGFyc2VyTWFuYWdlcjo6cGFyc2VGTUwoV09iamVjdE1hbmFnZXIgJiBhV09iamVjdE1hbmFnZXIpCit7CisJU3lzdGVtICogdGhlUGFyc2VTcGVjID0gTlVMTDsKKworCW1FcnJvckNvdW50ID0gMDsKKworCWlmKCBtRmlsZUxvY2F0aW9uLmVtcHR5KCkgKQorCXsKKwkJQVZNX09TX1dBUk4gPDwgX1NFV18KKwkJCTw8ICI8IGVycm9yID4gVW5leHBlY3RlZCBhbiBlbXB0eSBzcGVjaWZpY2F0aW9uIGZpbGUgbG9jYXRpb24gISIKKwkJCTw8IHN0ZDo6ZW5kbDsKKworCQlyZXR1cm4oIE5VTEwgKTsKKwl9CisKKwlzdGQ6Omlmc3RyZWFtIGFuSW5wdXRTdHJlYW0oIG1GaWxlTG9jYXRpb24uY19zdHIoKSApOworCisJaWYoIGFuSW5wdXRTdHJlYW0uZmFpbCgpICkKKwl7CisJCUFWTV9PU19XQVJOIDw8IF9TRVdfCisJCQkJPDwgIjwgZXJyb3IgPiBDYW5ub3Qgb3BlbiBmaWxlICciCisJCQkJPDwgbUZpbGVMb2NhdGlvbiA8PCAiJy4iIDw8IHN0ZDo6ZW5kbDsKKworCQlhdm1fc2V0X2V4aXRfY29kZSggQVZNX0VYSVRfUEFSU0lOR19FUlJPUl9DT0RFICk7CisKKwkJcmV0dXJuKCBOVUxMICk7CisJfQorCisJdHJ5CisJeworCQlpZiggKG1GaWxlTG9jYXRpb24ucmZpbmQoIi54Zm1sIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHx8CisJCQkobUZpbGVMb2NhdGlvbi5yZmluZCgiLmZtbCIgKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgfHwKKwkJCShtRmlsZUxvY2F0aW9uLnJmaW5kKCIueGxpYSIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB8fAorCQkJKG1GaWxlTG9jYXRpb24ucmZpbmQoIi54ZnNwIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHx8CisJCQkobUZpbGVMb2NhdGlvbi5yZmluZCgiLmxpYSIgKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgKQorCQl7CisJCQl0aGVQYXJzZVNwZWMgPSBwYXJzZUZNTChhV09iamVjdE1hbmFnZXIsIGFuSW5wdXRTdHJlYW0pOworCQl9CisKKwkJaWYoIHRoZVBhcnNlU3BlYyA9PSBOVUxMICkKKwkJeworCQkJQVZNX09TX1dBUk4gPDwgX1NFV18KKwkJCQkJPDwgIjwgZXJyb3IgPiBOTyBQQVJTSU5HIFJFU1VMVCAhIiA8PCBzdGQ6OmVuZGw7CisKKwkJCWF2bV9zZXRfZXhpdF9jb2RlKCBBVk1fRVhJVF9QQVJTSU5HX0VSUk9SX0NPREUgKTsKKworCQkJcmV0dXJuKCBOVUxMICk7CisJCX0KKwl9CisJY2F0Y2goIGFudGxyOjpBTlRMUkV4Y2VwdGlvbiAmIGUgKQorCXsKKwkJQVZNX09TX1dBUk4gPDwgX1NFV18gPDwgZS50b1N0cmluZygpIDw8IHN0ZDo6ZW5kbDsKKworCQlhdm1fc2V0X2V4aXRfY29kZSggQVZNX0VYSVRfUEFSU0lOR19FUlJPUl9DT0RFICk7CisKKwkJcmV0dXJuKCBOVUxMICk7CisJfQorCisJcmV0dXJuKCB0aGVQYXJzZVNwZWMgKTsKK30KKworCisvKioKKyAqIFBhcnNlck1hbmFnZXI6OnBhcnNlWExJQQorICoKKyAqLworU3lzdGVtICogUGFyc2VyTWFuYWdlcjo6cGFyc2VGTUwoCisJCVdPYmplY3RNYW5hZ2VyICYgYVdPYmplY3RNYW5hZ2VyLCBzdGQ6Omlmc3RyZWFtICYgYW5JbnB1dFN0cmVhbSkKK3sKKwkvLy8hISEgVGhlIFJldHVybiBWYXJpYWJsZSBWYWx1ZSAqISoKKwlTeXN0ZW0gKiB0aGVQYXJzZVNwZWMgPSBOVUxMOworCisJbUVycm9yQ291bnQgPSAwOworCVBhcnNlclV0aWw6OlhMSUFfU1lOVEFYX0VSUk9SX0NPVU5UID0gMDsKKworCXBBTlRMUjNfVUlOVDggICAgICAgICAgICAgICAgcGF0aDsKKwlwQU5UTFIzX0lOUFVUX1NUUkVBTSAgICAgICAgIGlucHV0OworCXBmbWxMZXhlcgkJICAgICAgICAgICAgIGxleGVyOworCisJcEFOVExSM19DT01NT05fVE9LRU5fU1RSRUFNICB0c3RyZWFtOworCS8vCisJcGZtbFBhcnNlciAgICAgICAgICAgICAgICAgIHBhcnNlcjsKKworCXBhdGggID0gKHBBTlRMUjNfVUlOVDgpIG1GaWxlTG9jYXRpb24uY19zdHIoKTsKKwlpbnB1dCA9IGFudGxyM0ZpbGVTdHJlYW1OZXcocGF0aCwgQU5UTFIzX0VOQ184QklUKTsKKwkvL2lucHV0ID0gYW50bHIzQXNjaWlGaWxlU3RyZWFtTmV3KHBhdGgpOworCisJaWYoIGlucHV0ID09IE5VTEwpCisJeworCQlBVk1fT1NfV0FSTiA8PCBfU0VXXworCQkJCTw8ICI8IGVycm9yID4gRmFpbGVkIHRvIG9wZW4gZmlsZSAnIgorCQkJCTw8IG1GaWxlTG9jYXRpb24gPDwgIiciIDw8IHN0ZDo6ZW5kbDsKKworCQkrK21FcnJvckNvdW50OworCQlhdm1fc2V0X2V4aXRfY29kZSggQVZNX0VYSVRfRkFJTEVEX0NPREUgKTsKKwl9CisKKwkvLyBDTGV4ZXJOZXcgaXMgZ2VuZXJhdGVkIGJ5IEFOVExSCisJbGV4ZXIgPSBmbWxMZXhlck5ldyhpbnB1dCk7CisJLy8gTmVlZCB0byBjaGVjayBmb3IgZXJyb3JzIEFOVExSM19FUlJfTk9NRU0KKwlBVk1fT1NfQVNTRVJUX09VVF9PRl9NRU1PUllfRVhJVCggbGV4ZXIgKQorCQkJPDwgIlVuYWJsZSB0byBjcmVhdGUgdGhlIGxleGVyIGR1ZSB0byBtYWxsb2MoKSBmYWlsdXJlIgorCQkJPDwgU0VORF9FWElUOworCisJLy8gQ1N0cmVhbU5ldyBpcyBnZW5lcmF0ZWQgYnkgQU5UTFIzCisJdHN0cmVhbSA9IGFudGxyM0NvbW1vblRva2VuU3RyZWFtU291cmNlTmV3KAorCQkJQU5UTFIzX1NJWkVfSElOVCwgVE9LRU5TT1VSQ0UobGV4ZXIpKTsKKwkvLyBOZWVkIHRvIGNoZWNrIGZvciBlcnJvcnMgQU5UTFIzX0VSUl9OT01FTQorCUFWTV9PU19BU1NFUlRfT1VUX09GX01FTU9SWV9FWElUKCB0c3RyZWFtICkKKwkJCTw8ICJPdXQgb2YgbWVtb3J5IHRyeWluZyB0byBhbGxvY2F0ZSB0b2tlbiBzdHJlYW0iCisJCQk8PCBTRU5EX0VYSVQ7CisKKwkvLyBDUGFyc2VyTmV3IGlzIGdlbmVyYXRlZCBieSBBTlRMUjMKKwlwYXJzZXIgPSBmbWxQYXJzZXJOZXcodHN0cmVhbSk7CisJLy8gTmVlZCB0byBjaGVjayBmb3IgZXJyb3JzIEFOVExSM19FUlJfTk9NRU0KKwlBVk1fT1NfQVNTRVJUX09VVF9PRl9NRU1PUllfRVhJVCggcGFyc2VyICkKKwkJCTw8ICJPdXQgb2YgbWVtb3J5IHRyeWluZyB0byBhbGxvY2F0ZSBwYXJzZXJcbiIKKwkJCTw8IFNFTkRfRVhJVDsKKworCisJQVZNX09TX1ZFUkJPU0lUWV9NSU5JTVVNKCBBVk1fT1NfQ0xPRyApIDw8IF9TRVdfCisJCQk8PCAiUGFyc2luZzogIiA8PCBtRmlsZW5hbWUgPDwgIiAuLi4iIDw8IHN0ZDo6ZW5kbDsKKworCXRoZVBhcnNlU3BlYyA9IHBhcnNlci0+Zm9ybWFsTUwocGFyc2VyLCBhV09iamVjdE1hbmFnZXIpOworCisJbUVycm9yQ291bnQgPSBwYXJzZXItPnBQYXJzZXItPnJlYy0+c3RhdGUtPmVycm9yQ291bnQgKworCQkJUGFyc2VyVXRpbDo6WExJQV9TWU5UQVhfRVJST1JfQ09VTlQ7CisKKwlBVk1fT1NfVkVSQk9TSVRZX01JTklNVU0oIEFWTV9PU19DTE9HICkgPDwgX1NFV18KKwkJCTw8ICJEb25lID09PiAiIDw8IG1FcnJvckNvdW50IDw8ICIgc3ludGF4IGVycm9yIgorCQkJPDwgKChtRXJyb3JDb3VudCA+IDEpPyAicyIgOiAiIikgPDwgIiBmb3VuZC4iCisJCQk8PCBzdGQ6OmVuZGw7CisKKworCS8vIFdlIGRpZCBub3QgcmV0dXJuIGFueXRoaW5nIGZyb20gdGhpcyBwYXJzZXIgcnVsZSwgc28gd2UgY2FuIGZpbmlzaC4KKwkvLyBJdCBvbmx5IHJlbWFpbnMgdG8gY2xvc2UgZG93biBvdXIgb3BlbiBvYmplY3RzLCBpbiB0aGUgcmV2ZXJzZSBvcmRlcgorCS8vIHdlIGNyZWF0ZWQgdGhlbQorCS8vCisJcGFyc2VyLT5mcmVlKHBhcnNlcik7CisJcGFyc2VyID0gTlVMTDsKKworCXRzdHJlYW0gLT5mcmVlKHRzdHJlYW0pOworCXRzdHJlYW0gPSBOVUxMOworCWxleGVyLT5mcmVlKGxleGVyKTsKKwlsZXhlciA9IE5VTEw7CisKKwlpbnB1dC0+Y2xvc2UoaW5wdXQpOworCWlucHV0ID0gTlVMTDsKKworCWlmKCBtRXJyb3JDb3VudCA+IDAgKQorCXsKKwkJYXZtX3NldF9leGl0X2NvZGUoIEFWTV9FWElUX1BBUlNJTkdfRVJST1JfQ09ERSApOworCX0KKworCXJldHVybiggdGhlUGFyc2VTcGVjICk7Cit9CisKKworLyoqCisgKiBwYXJzZSBTeW1ib2xpYyBFeGVjdXRpb24gV29ya2Zsb3cKKyAqCisgKi8KK1dPYmplY3QgKiBQYXJzZXJNYW5hZ2VyOjpwYXJzZVNFVygKKwkJV09iamVjdE1hbmFnZXIgJiBhV09iamVjdE1hbmFnZXIsIHN0ZDo6aWZzdHJlYW0gJiBhbklucHV0U3RyZWFtKQoreworCVdPYmplY3QgKiB0aGVQYXJzZVBhcmFtID0gV09iamVjdDo6X05VTExfOworCisJbUVycm9yQ291bnQgPSAwOworCisJdHJ5CisJeworCQlXb3JrZmxvd0xleGVyICAgbGV4ZXIoIGFuSW5wdXRTdHJlYW0gKTsKKwkJV29ya2Zsb3dQYXJzZXIgIHBhcnNlciggbGV4ZXIgKTsKKworCQlsZXhlci5zZXRGaWxlbmFtZSggbUZpbGVuYW1lICk7CisJCXBhcnNlci5zZXRGaWxlbmFtZSggbUZpbGVuYW1lICk7CisKKwkJbGV4ZXIucmVzZXRFcnJvcnMoKTsKKwkJcGFyc2VyLnJlc2V0RXJyb3JzKCk7CisKKy8vCQlBVk1fT1NfVkVSQk9TSVRZX01JTklNVU0oIEFWTV9PU19DTE9HICkgPDwgX1NFV18KKy8vCQkJCTw8ICJQYXJzaW5nOiAiIDw8IG1GaWxlbmFtZSA8PCAiIC4uLiIgPDwgc3RkOjplbmRsOworCisJCXRoZVBhcnNlUGFyYW0gPSBwYXJzZXIuZm9ybV9ncmFtbWFyKCBhV09iamVjdE1hbmFnZXIgKTsKKworCQltRXJyb3JDb3VudCA9IGxleGVyLm51bWJlck9mRXJyb3JzKCkgKyBwYXJzZXIubnVtYmVyT2ZFcnJvcnMoKTsKKworLy8JCUFWTV9PU19WRVJCT1NJVFlfTUlOSU1VTSggQVZNX09TX0NMT0cgKSA8PCBfU0VXXworLy8JCQkJPDwgIkRvbmUgPT0+ICIgPDwgbUVycm9yQ291bnQgPDwgIiBzeW50YXggZXJyb3IiCisvLwkJCQk8PCAoKG1FcnJvckNvdW50ID4gMSk/ICJzIiA6ICIiKSA8PCAiIGZvdW5kLiIKKy8vCQkJCTw8IHN0ZDo6ZW5kbDsKKworCQlpZiggbUVycm9yQ291bnQgPiAwICkKKwkJeworCQkJYXZtX3NldF9leGl0X2NvZGUoIEFWTV9FWElUX1BBUlNJTkdfRVJST1JfQ09ERSApOworCQl9CisJfQorCWNhdGNoKCBhbnRscjo6QU5UTFJFeGNlcHRpb24gJiBlICkKKwl7CisJCW1FeGNlcHRpb25NZXNzYWdlID0gZS50b1N0cmluZygpOworCisJCWlmKCBtRXJyb3JDb3VudCA9PSAwICkKKwkJeworCQkJKyttRXJyb3JDb3VudDsKKwkJfQorCisJCWF2bV9zZXRfZXhpdF9jb2RlKCBBVk1fRVhJVF9QQVJTSU5HX0VYQ0VQVElPTl9DT0RFICk7CisJfQorCisJcmV0dXJuKCB0aGVQYXJzZVBhcmFtICk7Cit9CisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL1BhcnNlck1hbmFnZXIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9QYXJzZXJNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFlNmI0YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9QYXJzZXJNYW5hZ2VyLmgKQEAgLTAsMCArMSwxMjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgUEFSU0VSX1BBUlNFUk1BTkFHRVJfSF8KKyNkZWZpbmUgUEFSU0VSX1BBUlNFUk1BTkFHRVJfSF8KKworI2luY2x1ZGUgPGZzdHJlYW0+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIFN5c3RlbTsKKworY2xhc3MgV09iamVjdDsKK2NsYXNzIFdPYmplY3RNYW5hZ2VyOworCisKK2NsYXNzIFBhcnNlck1hbmFnZXIKK3sKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURQorCSAqLworCXN0ZDo6c3RyaW5nIG1GaWxlTG9jYXRpb247CisJc3RkOjpzdHJpbmcgbUZpbGVuYW1lOworCisJc3RkOjpzaXplX3QgbUVycm9yQ291bnQ7CisKKwlzdGQ6OnNpemVfdCBtV2FybmluZ0NvdW50OworCisJc3RkOjpzdHJpbmcgbUV4Y2VwdGlvbk1lc3NhZ2U7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCVBhcnNlck1hbmFnZXIoY29uc3Qgc3RkOjpzdHJpbmcgJiBmaWxlTG9jYXRpb24pOworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgflBhcnNlck1hbmFnZXIoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBtRXJyb3JDb3VudAorCSAqLworCWlubGluZSBzdGQ6OnNpemVfdCBnZXRFcnJvckNvdW50KCkgY29uc3QKKwl7CisJCXJldHVybiggbUVycm9yQ291bnQgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNTeW50YXhFcnJvcigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1FcnJvckNvdW50ID4gMCApOworCX0KKworCWlubGluZSBib29sIGhhc05vU3ludGF4RXJyb3IoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtRXJyb3JDb3VudCA9PSAwICk7CisJfQorCisJLyoqCisJICogbVdhcm5pbmdDb3VudAorCSAqLworCWlubGluZSBzdGQ6OnNpemVfdCBnZXRXYXJuaW5nQ291bnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtV2FybmluZ0NvdW50ICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzU3ludGF4V2FybmluZygpIGNvbnN0CisJeworCQlyZXR1cm4oIG1XYXJuaW5nQ291bnQgPiAwICk7CisJfQorCisKKwkvKioKKwkgKiBtV2FybmluZ0NvdW50CisJICovCisJaW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nICYgZ2V0RXhjZXB0aW9uTWVzc2FnZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1FeGNlcHRpb25NZXNzYWdlICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzRXhjZXB0aW9uTWVzc2FnZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG5vdCBtRXhjZXB0aW9uTWVzc2FnZS5lbXB0eSgpICk7CisJfQorCisKKwkvKioKKwkgKiBQYXJzZSBGTUwsIHhMSUEKKwkgKi8KKwlTeXN0ZW0gKiBwYXJzZUZNTChXT2JqZWN0TWFuYWdlciAmIGFXT2JqZWN0TWFuYWdlcik7CisKKwlTeXN0ZW0gKiBwYXJzZUZNTChXT2JqZWN0TWFuYWdlciAmIGFXT2JqZWN0TWFuYWdlciwKKwkJCXN0ZDo6aWZzdHJlYW0gJiBhbklucHV0U3RyZWFtKTsKKworCS8qKgorCSAqIFBhcnNlIFNFVywgRkFWTQorCSAqLworCVdPYmplY3QgKiBwYXJzZVNFVyhXT2JqZWN0TWFuYWdlciAmIGFXT2JqZWN0TWFuYWdlciwKKwkJCXN0ZDo6aWZzdHJlYW0gJiBhbklucHV0U3RyZWFtKTsKKworfTsKKworCit9CisKKyNlbmRpZiAvKlBBUlNFUl9QQVJTRVJNQU5BR0VSX0hfKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9SRUFETUUubWQgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYWU4OWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTAgQEAKKyMgRUZNLVNZTUJFWCA6IFBhcnNlcgorCisjIyBTb3VyY2UgY29kZSBzdHJ1Y3R1cmUKKworIyMjIEludGVyZmFjZXMKKworIyMjIENsYXNzZXMKKworIyMjIEZhY3RvcmllcworCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvUGFyc2VyVXRpbC5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvUGFyc2VyVXRpbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdmNTE2ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9QYXJzZXJVdGlsLmNwcApAQCAtMCwwICsxLDIxNDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULg0KKyAqDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENyZWF0ZWQgb246IDkganVpbC4gMjAxNA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyDQorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2luY2x1ZGUgIlBhcnNlclV0aWwuaCINCisNCisjaW5jbHVkZSA8Zm1sL2NvbW1vbi9Mb2NhdGlvbkVsZW1lbnQuaD4NCisjaW5jbHVkZSA8Zm1sL2NvbW1vbi9PYmplY3RFbGVtZW50Lmg+DQorI2luY2x1ZGUgPGZtbC9jb21tb24vU3BlY2lmaWVyRWxlbWVudC5oPg0KKyNpbmNsdWRlIDxmbWwvY29tbW9uL1RyYWNlYWJsZUVsZW1lbnQuaD4NCisNCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZUxpYi5oPg0KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mTWFjaGluZS5oPg0KKw0KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9Bdm1Db2RlLmg+DQorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0J1aWx0aW5BcnJheS5oPg0KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29uc3RydWN0b3IuaD4NCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vU3RhdGVtZW50Q29uc3RydWN0b3IuaD4NCisNCisjaW5jbHVkZSA8Zm1sL2xpYi9Bdm1PcGVyYXRpb25GYWN0b3J5Lmg+DQorI2luY2x1ZGUgPGZtbC9saWIvSUNvbVBvaW50Lmg+DQorDQorI2luY2x1ZGUgPGZtbC9vcGVyYXRvci9PcGVyYXRvci5oPg0KKyNpbmNsdWRlIDxmbWwvb3BlcmF0b3IvT3BlcmF0b3JNYW5hZ2VyLmg+DQorDQorI2luY2x1ZGUgPGZtbC90eXBlL1R5cGVNYW5hZ2VyLmg+DQorDQorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9CdWZmZXIuaD4NCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0NoYW5uZWwuaD4NCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0RhdGFUeXBlLmg+DQorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9JbnN0YW5jZVNwZWNpZmllclBhcnQuaD4NCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL01hY2hpbmUuaD4NCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1BhY2thZ2UuaD4NCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1BvcnQuaD4NCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1JvdXRpbmUuaD4NCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1RyYW5zaXRpb24uaD4NCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1ZhcmlhYmxlLmg+DQorDQorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9CZWhhdmlvcmFsUGFydC5oPg0KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvQ29tcG9zaXRlUGFydC5oPg0KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvUHJvcGVydHlQYXJ0Lmg+DQorDQorI2luY2x1ZGUgPHNldy9Xb3JrZmxvdy5oPg0KKw0KKw0KK25hbWVzcGFjZSBzZXANCit7DQorDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBYTElBIE1BQ1JPDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisNCisjZGVmaW5lIE9QKG9wKSAgIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfIyNvcA0KKw0KKyNkZWZpbmUgTkVXX0lEKGlkKSAgIHNlcDo6RXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdJZGVudGlmaWVyKGlkKQ0KKw0KKyNkZWZpbmUgTkVXX1VGSUQocW5pZCwgbmIpICAoIChuYiA+IDEpID8gICAgICAgICAgICBcDQorCQlFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld1F1YWxpZmllZElkZW50aWZpZXIocW5pZCkgOiAgICAgIFwNCisJCUV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3SWRlbnRpZmllcihxbmlkKSApDQorDQorI2RlZmluZSBORVdfSU5TVEFOQ0VfVUZJRChtYWNoaW5lLCB2YXIpICBcDQorCQlFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld1F1YWxpZmllZElkZW50aWZpZXIoICBcDQorCQkJCU9TUygpIDw8IG1hY2hpbmUtPmdldE5hbWVJRCgpIDw8ICcuJyA8PCB2YXItPmdldE5hbWVJRCgpICkNCisNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIEN1cnJlbnQgUGFyc2UgQ29udGV4dCA6DQorLy8gU3lzdGVtIC0+IE1hY2hpbmUgLT4gUm91dGluZQ0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorUGFyc2VyVXRpbDo6QXZtUGFyc2VDb250ZXh0IFBhcnNlclV0aWw6Ol9DVFhfOw0KKw0KK3N0ZDo6c3RhY2s8IFBhcnNlclV0aWw6OkF2bVBhcnNlQ29udGV4dCA+IFBhcnNlclV0aWw6Ol9DVFhfU1RBQ0tfOw0KKw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gWExJQV9TWU5UQVhfRVJST1JfQ09VTlQNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKw0KK2F2bV9zaXplX3QgUGFyc2VyVXRpbDo6WExJQV9TWU5UQVhfRVJST1JfQ09VTlQgPSAwOw0KKw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gU0VUIExPQ0FUSU9OIElOIFRSQUNFQUJMRSBGT1JNDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisNCit2b2lkIFBhcnNlclV0aWw6OnNldExvY2F0aW9uKFRyYWNlYWJsZUVsZW1lbnQgKiBhVHJhY2VhYmxlRWxlbWVudCwNCisJCWF2bV9zaXplX3QgYkxpbmUsIGF2bV9zaXplX3QgZUxpbmUpDQorew0KKwlpZiggYVRyYWNlYWJsZUVsZW1lbnQgIT0gTlVMTCkNCisJew0KKwkJUGFyc2VyVXRpbDo6c2V0TG9jYXRpb24oICphVHJhY2VhYmxlRWxlbWVudCwgYkxpbmUsIGVMaW5lICk7DQorCX0NCit9DQorDQordm9pZCBQYXJzZXJVdGlsOjpzZXRMb2NhdGlvbihUcmFjZWFibGVFbGVtZW50ICYgYVRyYWNlYWJsZUVsZW1lbnQsDQorCQlhdm1fc2l6ZV90IGJMaW5lLCBhdm1fc2l6ZV90IGVMaW5lKQ0KK3sNCisJaWYoIG5vdCBhVHJhY2VhYmxlRWxlbWVudC5oYXNMb2NhdGlvbigpICkNCisJew0KKwkJYVRyYWNlYWJsZUVsZW1lbnQuc2V0TG9jYXRpb24oIG5ldyBMb2NhdGlvbkVsZW1lbnQoKSApOw0KKwl9DQorCWFUcmFjZWFibGVFbGVtZW50LmdldExvY2F0aW9uKCktPnNldExpbmUoIGJMaW5lICwgZUxpbmUgKTsNCit9DQorDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBQUk9MT0dVRSBPUFRJT04NCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKw0KK3ZvaWQgUGFyc2VyVXRpbDo6c2V0UHJvbG9ndWVPcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcgJiBpZCwgQkYgdmFsdWUpDQorew0KKwlXb3JrZmxvdzo6SU5TVEFOQ0UtPnNldFByb2xvZ3VlT3B0aW9uKGlkLCB2YWx1ZSk7DQorfQ0KKw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBHRVQgVkFSSUFCTEUgQlkgWyBbIEZ1bGx5IF0gUXVhbGlmaWVkIF0gTmFtZSBJRA0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisNCitjb25zdCBCRiAmIFBhcnNlclV0aWw6OmdldE9iamVjdEJ5TmFtZUlEKGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkNCit7DQorCWlmKCBfQ1RYXy5yb3V0aW5lICE9IE5VTEwgKQ0KKwl7DQorCQljb25zdCBCRiAmIHZhciA9IF9DVFhfLnJvdXRpbmUtPmdldFBhcmFtUmV0dXJuKGFOYW1lSUQpOw0KKwkJaWYoIHZhci52YWxpZCgpICkNCisJCXsNCisJCQlyZXR1cm4oIHZhciApOw0KKwkJfQ0KKwl9DQorDQorCXsNCisJCWNvbnN0IEJGICYgZm9ybSA9IF9DVFhfLm1hY2hpbmUtPmdldHNlbUZvcm1CeU5hbWVJRChhTmFtZUlEKTsNCisJCWlmKCBmb3JtLnZhbGlkKCkgKQ0KKwkJew0KKwkJCXJldHVybiggZm9ybSApOw0KKwkJfQ0KKwl9DQorDQorCXJldHVybiggQkY6OlJFRl9OVUxMICk7DQorLy8JcmV0dXJuKCBORVdfSUQoYU5hbWVJRCkgKTsNCit9DQorDQorDQorY29uc3QgQkYgJiBQYXJzZXJVdGlsOjpnZXRPYmplY3RCeVF1YWxpZmllZE5hbWVJRChjb25zdCBzdGQ6OnN0cmluZyAmIHFuaWQsIGF2bV9zaXplX3QgY291bnQpDQorew0KKwlpZiggY291bnQgPT0gMSApDQorCXsNCisJCXJldHVybiggZ2V0T2JqZWN0QnlOYW1lSUQocW5pZCkgKTsNCisJfQ0KKwllbHNlDQorCXsNCisJCWNvbnN0IEJGICYgZm9ybSA9IF9DVFhfLm1hY2hpbmUtPmdldFByb3BlcnR5QnlRdWFsaWZpZWROYW1lSUQocW5pZCk7DQorCQlpZiggZm9ybS52YWxpZCgpICkNCisJCXsNCisJCQlyZXR1cm4oIGZvcm0gKTsNCisJCX0NCisJfQ0KKw0KKwlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOw0KKy8vCXJldHVybiggTkVXX1VGSUQocW5pZCwgY291bnQpICk7DQorfQ0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBHRVQgVkFSSUFCTEUgQlkgWyBbIEZ1bGx5IF0gUXVhbGlmaWVkIF0gTmFtZSBJRA0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisNCitjb25zdCBCRiAmIFBhcnNlclV0aWw6OmdldHZhcihjb25zdCBzdGQ6OnN0cmluZyAmIHFuaWQsIGF2bV9zaXplX3QgY291bnQpDQorew0KKwlpZiggY291bnQgPiAxICkNCisJew0KKwkJY29uc3QgQkYgJiB2YXIgPSBfQ1RYXy5tYWNoaW5lLT5nZXRyZWNWYXJpYWJsZShxbmlkKTsNCisJCWlmKCB2YXIudmFsaWQoKSApDQorCQl7DQorCQkJcmV0dXJuKCB2YXIgKTsNCisJCX0NCisJfQ0KKwllbHNlDQorCXsNCisJCWlmKCBfQ1RYXy5yb3V0aW5lICE9IE5VTEwgKQ0KKwkJew0KKwkJCWNvbnN0IEJGICYgdmFyID0gX0NUWF8ucm91dGluZS0+Z2V0UGFyYW1SZXR1cm4ocW5pZCk7DQorCQkJaWYoIHZhci52YWxpZCgpICkNCisJCQl7DQorCQkJCXJldHVybiggdmFyICk7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJew0KKwkJCWNvbnN0IEJGICYgdmFyID0gX0NUWF8ubWFjaGluZS0+Z2V0c2VtVmFyaWFibGUocW5pZCk7DQorCQkJaWYoIHZhci52YWxpZCgpICkNCisJCQl7DQorCQkJCXJldHVybiggdmFyICk7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCXJldHVybiggQkY6OlJFRl9OVUxMICk7DQorfQ0KKw0KK0JGIFBhcnNlclV0aWw6OmdldFZhcmlhYmxlKGNvbnN0IHN0ZDo6c3RyaW5nICYgcW5pZCwgYXZtX3NpemVfdCBjb3VudCkNCit7DQorCWNvbnN0IEJGICYgdmFyID0gZ2V0dmFyKHFuaWQsIGNvdW50KTsNCisJaWYoIHZhci52YWxpZCgpICkNCisJew0KKwkJcmV0dXJuKCB2YXIgKTsNCisJfQ0KKwllbHNlDQorCXsNCisJCUFWTV9PU19XQVJOIDw8ICJFcnJvcjo+IHVuZm91bmQgdmFyaWFibGU8ICIgPDwgcW5pZA0KKwkJCQk8PCAiID4gaW4gIiA8PCBzdHJfaGVhZGVyKCBfQ1RYXy5tYWNoaW5lICkgPDwgIiAhISEiDQorCQkJCTw8IHN0ZDo6ZW5kbDsNCisJCSsrWExJQV9TWU5UQVhfRVJST1JfQ09VTlQ7DQorDQorCQlyZXR1cm4oIEJGKCBuZXcgVmFyaWFibGUoX0NUWF8ubWFjaGluZSwNCisJCQkJTW9kaWZpZXI6OlBST1BFUlRZX1VOREVGSU5FRF9NT0RJRklFUiwNCisJCQkJVHlwZU1hbmFnZXI6OklOVEVHRVIsIHFuaWQpICkgKTsNCisJfQ0KKw0KKwlyZXR1cm4oIHZhciApOw0KK30NCisNCisNCitCRiBQYXJzZXJVdGlsOjpnZXREYXRhVHlwZShjb25zdCBzdGQ6OnN0cmluZyAmIHFuaWQsIGF2bV9zaXplX3QgY291bnQpDQorew0KKwljb25zdCBCRiAmIHZhciA9ICggY291bnQgPiAxICkNCisJCQk/IF9DVFhfLm1hY2hpbmUtPmdldHJlY0RhdGFUeXBlKHFuaWQpDQorCQkJOiBfQ1RYXy5tYWNoaW5lLT5nZXRzZW1EYXRhVHlwZShxbmlkKTsNCisNCisJaWYoIHZhci52YWxpZCgpICkNCisJew0KKwkJcmV0dXJuKCB2YXIgKTsNCisJfQ0KKw0KKwlBVk1fT1NfV0FSTiA8PCAiRXJyb3I6PiB1bmZvdW5kIHR5cGVkZWYgIiA8PCBxbmlkDQorCQkJPDwgIiA+IGluICIgPDwgc3RyX2hlYWRlciggX0NUWF8ubWFjaGluZSApIDw8ICIgISEhIg0KKwkJCTw8IHN0ZDo6ZW5kbDsNCisJKytYTElBX1NZTlRBWF9FUlJPUl9DT1VOVDsNCisNCisJcmV0dXJuKCBCRiggbmV3IFZhcmlhYmxlKF9DVFhfLm1hY2hpbmUsDQorCQkJTW9kaWZpZXI6OlBST1BFUlRZX1VOREVGSU5FRF9NT0RJRklFUiwNCisJCQlUeXBlTWFuYWdlcjo6SU5URUdFUiwgcW5pZCkgKSApOw0KK30NCisNCitCRiBQYXJzZXJVdGlsOjpnZXREYXRhVHlwZVF1ZXVlKGNvbnN0IHN0ZDo6c3RyaW5nICYgcW5pZCwgYXZtX3NpemVfdCBjb3VudCkNCit7DQorCWlmKCBjb3VudCA+IDEgKQ0KKwl7DQorCQljb25zdCBCRiAmIHZhciA9IF9DVFhfLm1hY2hpbmUtPmdldHJlY0RhdGFUeXBlKHFuaWQpOw0KKwkJaWYoIHZhci5pczwgRGF0YVR5cGUgPigpDQorCQkJJiYgdmFyLnRvX3B0cjwgRGF0YVR5cGUgPigpLT5oYXNUeXBlUXVldWUoKSApDQorCQl7DQorCQkJcmV0dXJuKCB2YXIgKTsNCisJCX0NCisJfQ0KKwllbHNlDQorCXsNCisJCWNvbnN0IEJGICYgdmFyID0gX0NUWF8ubWFjaGluZS0+Z2V0c2VtRGF0YVR5cGUocW5pZCk7DQorCQlpZiggdmFyLmlzPCBEYXRhVHlwZSA+KCkNCisJCQkmJiB2YXIudG9fcHRyPCBEYXRhVHlwZSA+KCktPmhhc1R5cGVRdWV1ZSgpICkNCisJCXsNCisJCQlyZXR1cm4oIHZhciApOw0KKwkJfQ0KKwl9DQorDQorCUFWTV9PU19XQVJOIDw8ICJFcnJvcjo+IHVuZXhwZWN0ZWQgYSBub24tcXVldWUgdmFyaWFibGU8ICIgPDwgcW5pZA0KKwkJCTw8ICIgPiBpbiAiIDw8IHN0cl9oZWFkZXIoIF9DVFhfLm1hY2hpbmUgKSA8PCAiICEhISINCisJCQk8PCBzdGQ6OmVuZGw7DQorCSsrWExJQV9TWU5UQVhfRVJST1JfQ09VTlQ7DQorDQorCXJldHVybiggQkYoIERhdGFUeXBlOjpuZXdDb250YWluZXIoDQorCQkJX0NUWF8ubWFjaGluZSwgcW5pZCwgVFlQRV9GSUZPX1NQRUNJRklFUiwgMSkgKSApOw0KK30NCisNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gR0VUIENPTlNUQU5UIEJZIFsgWyBGdWxseSBdIFF1YWxpZmllZCBdIE5hbWUgSUQNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorY29uc3QgQkYgJiBQYXJzZXJVdGlsOjpnZXRDb25zdGFudCgNCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgcW5pZCwgYXZtX3NpemVfdCBjb3VudCkNCit7DQorCWNvbnN0IEJGICYgdmFyID0gZ2V0dmFyKHFuaWQsIGNvdW50KTsNCisJaWYoIHZhci52YWxpZCgpICYmIHZhci50b19wdHI8IFZhcmlhYmxlID4oKS0+Z2V0TW9kaWZpZXIoKS5oYXNGZWF0dXJlRmluYWwoKSApDQorCXsNCisJCXJldHVybiggdmFyICk7DQorCX0NCisNCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsNCit9DQorDQorDQorYXZtX3NpemVfdCBQYXJzZXJVdGlsOjpnZXRJbnRlZ2VyQ29uc3RhbnQoDQorCQljb25zdCBzdGQ6OnN0cmluZyAmIHFuaWQsIGF2bV9zaXplX3QgY291bnQpDQorew0KKwljb25zdCBCRiAmIHZhciA9IGdldHZhcihxbmlkLCBjb3VudCk7DQorCWlmKCB2YXIudmFsaWQoKSApDQorCXsNCisJCVZhcmlhYmxlICogcFZhciA9IHZhci50b19wdHI8IFZhcmlhYmxlID4oKTsNCisNCisJCWlmKCBwVmFyLT5nZXRNb2RpZmllcigpLmhhc0ZlYXR1cmVGaW5hbCgpICYmIHBWYXItPmhhc1ZhbHVlKCkgJiYNCisJCQlwVmFyLT5nZXRWYWx1ZSgpLmlzV2Vha0ludGVnZXIoKSApDQorCQl7DQorCQkJcmV0dXJuKCBwVmFyLT5nZXRWYWx1ZSgpLnRvSW50ZWdlcigpICk7DQorCQl9DQorCX0NCisNCisJYXZtX3N5bnRheF9lcnJvciggImludGVnZXJfY29uc3RhbnQgKC4uLikiICkNCisJCQk8PCAidW5mb3VuZCB0aGUgaW50ZWdlciBjb25zdGFudCBRdWFsaWZpZWQgTmFtZSBJRDwgIiA8PCBxbmlkDQorCQkJPDwgIiA+IGZyb20gdGhlIG1hY2hpbmU8ICINCisJCQk8PCBfQ1RYXy5tYWNoaW5lLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8ICIgPiINCisJCQk8PCBTWU5UQVhfRVJST1JfRU9MOw0KKw0KKwlyZXR1cm4oIDAgKTsNCit9DQorDQorDQorYXZtX2Zsb2F0X3QgUGFyc2VyVXRpbDo6Z2V0RmxvYXRDb25zdGFudCgNCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgcW5pZCwgYXZtX3NpemVfdCBjb3VudCkNCit7DQorCWNvbnN0IEJGICYgdmFyID0gZ2V0dmFyKHFuaWQsIGNvdW50KTsNCisJaWYoIHZhci52YWxpZCgpICkNCisJew0KKwkJVmFyaWFibGUgKiBwVmFyID0gdmFyLnRvX3B0cjwgVmFyaWFibGUgPigpOw0KKw0KKwkJaWYoIHBWYXItPmdldE1vZGlmaWVyKCkuaGFzRmVhdHVyZUZpbmFsKCkgJiYgcFZhci0+aGFzVmFsdWUoKSAmJg0KKwkJCXBWYXItPmdldFZhbHVlKCkuaXNXZWFrRmxvYXQoKSApDQorCQl7DQorCQkJcmV0dXJuKCBwVmFyLT5nZXRWYWx1ZSgpLnRvRmxvYXQoKSApOw0KKwkJfQ0KKwl9DQorDQorCWF2bV9zeW50YXhfZXJyb3IoICJmbG9hdF9jb25zdGFudCguLi4pIiApDQorCQkJPDwgInVuZm91bmQgdGhlIGZsb2F0IGNvbnN0YW50IFF1YWxpZmllZCBOYW1lIElEPCAiIDw8IHFuaWQNCisJCQk8PCAiID4gZnJvbSB0aGUgbWFjaGluZTwgIg0KKwkJCTw8IF9DVFhfLm1hY2hpbmUtPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIiA+Ig0KKwkJCTw8IFNZTlRBWF9FUlJPUl9FT0w7DQorDQorCXJldHVybiggMC4wICk7DQorfQ0KKw0KKw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBHRVQgQlVGRkVSIEJZIFsgWyBGdWxseSBdIFF1YWxpZmllZCBdIE5hbWUgSUQNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorQkYgUGFyc2VyVXRpbDo6Z2V0QnVmZmVyKE1hY2hpbmUgKiBtYWNoaW5lLA0KKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBxbmlkLCBhdm1fc2l6ZV90IGNvdW50KQ0KK3sNCisJY29uc3QgQkYgJiBidWYgPSAoIGNvdW50ID4gMSApDQorCQkJPyBtYWNoaW5lLT5nZXRyZWNCdWZmZXIocW5pZCkNCisJCQk6IG1hY2hpbmUtPmdldHNlbUJ1ZmZlcihxbmlkKTsNCisNCisJaWYoIGJ1Zi52YWxpZCgpICkNCisJew0KKwkJcmV0dXJuKCBidWYgKTsNCisJfQ0KKw0KKy8vCUFWTV9PU19XQVJOIDw8ICJXYXJuaW5nOj4gdW5mb3VuZCBidWZmZXI8ICIgPDwgcW5pZCA8PCAiID4gaW4gbWFjaGluZTwgIg0KKy8vCQkJPDwgc3RyX2hlYWRlciggbWFjaGluZSApIDw8ICIgPiEhISIgPDwgc3RkOjplbmRsOw0KKy8vCSsrWExJQV9TWU5UQVhfRVJST1JfQ09VTlQ7DQorDQorCXJldHVybiggTkVXX1VGSUQocW5pZCwgY291bnQpICk7DQorfQ0KKw0KKw0KK0JGIFBhcnNlclV0aWw6OmdldHZhckJ1ZmZlcihjb25zdCBzdGQ6OnN0cmluZyAmIHFuaWQsIGF2bV9zaXplX3QgY291bnQpDQorew0KKwljb25zdCBCRiAmIGJ1ZmZlciA9ICggY291bnQgPiAxICkNCisJCQk/IF9DVFhfLm1hY2hpbmUtPmdldHJlY0J1ZmZlcihxbmlkKQ0KKwkJCTogX0NUWF8ubWFjaGluZS0+Z2V0c2VtQnVmZmVyKHFuaWQpOw0KKw0KKwlpZiggYnVmZmVyLnZhbGlkKCkgKQ0KKwl7DQorCQlyZXR1cm4oIGJ1ZmZlciApOw0KKwl9DQorDQorCUJGIHZhckJ1ZmZlciA9IGdldHZhcihxbmlkLCBjb3VudCk7DQorCWlmKCB2YXJCdWZmZXIudmFsaWQoKSApDQorCXsNCisJCXJldHVybiggdmFyQnVmZmVyICk7DQorCX0NCisJZWxzZQ0KKwl7DQorCQlyZXR1cm4oIE5FV19VRklEKHFuaWQsIGNvdW50KSApOw0KKwl9DQorfQ0KKw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBHRVQgQ0hBTk5FTCBCWSBbIFsgRnVsbHkgXSBRdWFsaWZpZWQgXSBOYW1lIElEDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKw0KK0JGIFBhcnNlclV0aWw6OmdldENoYW5uZWwoY29uc3Qgc3RkOjpzdHJpbmcgJiBxbmlkLCBhdm1fc2l6ZV90IGNvdW50KQ0KK3sNCisJY29uc3QgQkYgJiBjaGFuID0gKCBjb3VudCA+IDEgKQ0KKwkJCT8gX0NUWF8ubWFjaGluZS0+Z2V0cmVjQ2hhbm5lbChxbmlkKQ0KKwkJCTogX0NUWF8ubWFjaGluZS0+Z2V0c2VtQ2hhbm5lbChxbmlkKTsNCisNCisJaWYoIGNoYW4udmFsaWQoKSApDQorCXsNCisJCXJldHVybiggY2hhbiApOw0KKwl9DQorDQorLy8JQVZNX09TX1dBUk4gPDwgIldhcm5pbmc6PiBVbmZvdW5kIGNoYW5uZWw8ICIgPDwgcW5pZCA8PCAiID4gaW4gbWFjaGluZTwgIg0KKy8vCQkJPDwgc3RyX2hlYWRlciggX0NUWF8ubWFjaGluZSApIDw8ICIgPiEhISIgPDwgc3RkOjplbmRsOw0KKy8vCSsrWExJQV9TWU5UQVhfRVJST1JfQ09VTlQ7DQorDQorCXJldHVybiggTkVXX1VGSUQocW5pZCwgY291bnQpICk7DQorfQ0KKw0KKw0KK3ZvaWQgUGFyc2VyVXRpbDo6dXBkYXRlU2lnbmFsUm91dGluZ0NoYW5uZWwoTW9kaWZpZXI6OkRJUkVDVElPTl9LSU5EIGlvRGlyZWN0aW9uLA0KKwkJY29uc3QgQkZDb2RlICYgaW9Db2RlLCBjb25zdCBzdGQ6OnN0cmluZyAmIHFuaWQsIGF2bV9zaXplX3QgY291bnQpDQorew0KKwljb25zdCBCRiAmIGNoYW4gPSAoIGNvdW50ID4gMSApDQorCQkJPyBfQ1RYXy5tYWNoaW5lLT5nZXRyZWNDaGFubmVsKHFuaWQpDQorCQkJOiBfQ1RYXy5tYWNoaW5lLT5nZXRzZW1DaGFubmVsKHFuaWQpOw0KKw0KKwlpZiggY2hhbi52YWxpZCgpICkNCisJew0KKy8vCQlpZiggaW9Db2RlLT5maXJzdCgpLmlzPCBQb3J0ID4oKSApDQorLy8JCXsNCisvLwkJCWlvQ29kZS0+Zmlyc3QoKS50b19wdHI8IFBvcnQgPigpLT5zZXRSb3V0aW5nQ2hhbm5lbChjaGFuKTsNCisvLwkJfQ0KKw0KKwkJQkYgY2hhblNpZ25hbCA9IGNoYW4udG9fcHRyPCBDaGFubmVsID4oKS0+Z2V0U2lnbmFsKA0KKwkJCQlpb0RpcmVjdGlvbiwgaW9Db2RlLT5maXJzdCgpKTsNCisNCisJCWlmKCBjaGFuU2lnbmFsLnZhbGlkKCkgKQ0KKwkJew0KKwkJCWlvQ29kZS0+c2V0KDAsIGNoYW5TaWduYWwpOw0KKwkJfQ0KKw0KKwkJcmV0dXJuOw0KKwl9DQorDQorCUFWTV9PU19XQVJOIDw8ICJXYXJuaW5nOj4gdW5mb3VuZCBjaGFubmVsPCAiIDw8IHFuaWQNCisJCQk8PCAiID4gaW4gIiA8PCBzdHJfaGVhZGVyKCBfQ1RYXy5tYWNoaW5lICkgPDwgIiAhISEiDQorCQkJPDwgc3RkOjplbmRsOw0KKwkvLysrWExJQV9TWU5UQVhfRVJST1JfQ09VTlQ7DQorDQorfQ0KKw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBHRVQgUE9SVCBCWSBbIFsgRnVsbHkgXSBRdWFsaWZpZWQgXSBOYW1lIElEDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKw0KK2NvbnN0IEJGICYgUGFyc2VyVXRpbDo6Z2V0Q29tUG9ydChNYWNoaW5lICogbWFjaGluZSwNCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgcW5pZCwgYXZtX3NpemVfdCBjb3VudCkNCit7DQorCWlmKCBjb3VudCA+IDEgKQ0KKwl7DQorCQlpZiggbWFjaGluZS0+Z2V0U3BlY2lmaWVyKCkuaXNEZXNpZ25JbnN0YW5jZVN0YXRpYygpDQorCQkJJiYgbWFjaGluZS0+aGFzVHlwZSgpDQorCQkJJiYgbWFjaGluZS0+Z2V0VHlwZSgpLmlzPCBNYWNoaW5lID4oKSApDQorCQl7DQorCQkJbWFjaGluZSA9IG1hY2hpbmUtPmdldFR5cGUoKS50b19wdHI8IE1hY2hpbmUgPigpOw0KKwkJfQ0KKw0KKwkJLy9yZXR1cm4oIG1hY2hpbmUtPmdldHJlY1BvcnQocW5pZCkgKTsNCisJCWNvbnN0IEJGICYgcG9ydCA9IG1hY2hpbmUtPmdldHJlY1BvcnQocW5pZCk7DQorCQlpZiggcG9ydC52YWxpZCgpICkNCisJCXsNCisJCQlyZXR1cm4oIHBvcnQgKTsNCisJCX0NCisJfQ0KKwllbHNlDQorCXsNCisJCWlmKCBtYWNoaW5lLT5nZXRTcGVjaWZpZXIoKS5pc0Rlc2lnbkluc3RhbmNlU3RhdGljKCkNCisJCQkmJiBtYWNoaW5lLT5oYXNUeXBlKCkNCisJCQkmJiBtYWNoaW5lLT5nZXRUeXBlKCkuaXM8IE1hY2hpbmUgPigpICkNCisJCXsNCisJCQltYWNoaW5lID0gbWFjaGluZS0+Z2V0VHlwZSgpLnRvX3B0cjwgTWFjaGluZSA+KCk7DQorCQl9DQorDQorCQkvL3JldHVybiggbWFjaGluZS0+Z2V0c2VtUG9ydChxbmlkKSApOw0KKwkJY29uc3QgQkYgJiBwb3J0ID0gbWFjaGluZS0+Z2V0c2VtUG9ydChxbmlkKTsNCisJCWlmKCBwb3J0LnZhbGlkKCkgKQ0KKwkJew0KKwkJCXJldHVybiggcG9ydCApOw0KKwkJfQ0KKwl9DQorDQorCUFWTV9PU19XQVJOIDw8ICJFcnJvcjo+IHVuZm91bmQgcG9ydDwgIiA8PCBxbmlkIDw8ICIgPiBpbiBtYWNoaW5lPCAiDQorCQkJPDwgc3RyX2hlYWRlciggbWFjaGluZSApIDw8ICIgPiEhISIgPDwgc3RkOjplbmRsOw0KKwkrK1hMSUFfU1lOVEFYX0VSUk9SX0NPVU5UOw0KKw0KKwlyZXR1cm4oIEJGOjpSRUZfTlVMTCApOw0KK30NCisNCisNCitCRiBQYXJzZXJVdGlsOjpnZXR2YXJQb3J0KGNvbnN0IHN0ZDo6c3RyaW5nICYgcW5pZCwgYXZtX3NpemVfdCBjb3VudCkNCit7DQorCWNvbnN0IEJGICYgcG9ydCA9ICggY291bnQgPiAxICkNCisJCQk/IF9DVFhfLm1hY2hpbmUtPmdldHJlY1BvcnQocW5pZCkNCisJCQk6IF9DVFhfLm1hY2hpbmUtPmdldHNlbVBvcnQocW5pZCk7DQorDQorCWlmKCBwb3J0LnZhbGlkKCkgKQ0KKwl7DQorCQlyZXR1cm4oIHBvcnQgKTsNCisJfQ0KKwllbHNlDQorCXsNCisJCUJGIHZhclBvcnQoIGdldHZhcihxbmlkLCBjb3VudCkgKTsNCisJCWlmKCB2YXJQb3J0LnZhbGlkKCkgKQ0KKwkJew0KKwkJCXJldHVybiggdmFyUG9ydCApOw0KKwkJfQ0KKwkJZWxzZQ0KKwkJew0KKwkJCXJldHVybiggTkVXX1VGSUQocW5pZCwgY291bnQpICk7DQorCQl9DQorCX0NCit9DQorDQordm9pZCBQYXJzZXJVdGlsOjphcHBlbmRQb3J0UGFyYW1ldGVyKFBvcnQgKiBwb3J0LA0KKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBsYWJlbCwgQkZWZWN0b3IgJiBsYWJlbGxlZFBhcmFtcywNCisJCUJGTGlzdCAmIHBvc2l0aW9uYWxQYXJhbXMsIGNvbnN0IEJGICYgcGFyYW0pDQorew0KKwlpZiggbGFiZWwuZW1wdHkoKSApDQorCXsNCisJCXBvc2l0aW9uYWxQYXJhbXMuYXBwZW5kKCBwYXJhbSApOw0KKwl9DQorCWVsc2UgaWYoIHBvcnQgIT0gTlVMTCApDQorCXsNCisJCWF2bV9vZmZzZXRfdCBvZmZzZXQgPSBwb3J0LT5nZXRQYXJhbWV0ZXJPZmZzZXQobGFiZWwpOw0KKwkJaWYoIG9mZnNldCAhPSBBVk1fTk9fT0ZGU0VUICkNCisJCXsNCisJCQlsYWJlbGxlZFBhcmFtc1sgb2Zmc2V0IF0gPSBwYXJhbTsNCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQlwb3NpdGlvbmFsUGFyYW1zLmFwcGVuZCggcGFyYW0gKTsNCisNCisJCQlhdm1fc3ludGF4X2Vycm9yKCAiUGFyc2VyVXRpbDo6YXBwZW5kUG9ydFBhcmFtZXRlciguLi4pIiApDQorCQkJCQk8PCAiVW5mb3VuZCBsYWJlbGxlZCA8ICIgPDwgbGFiZWwNCisJCQkJCTw8ICIgPiBpbiBwb3J0PCAiIDw8IHN0cl9oZWFkZXIoIHBvcnQgKSA8PCAiID4iDQorCQkJCQk8PCBTWU5UQVhfRVJST1JfRU9MOw0KKwkJfQ0KKwl9DQorCWVsc2UNCisJew0KKwkJcG9zaXRpb25hbFBhcmFtcy5hcHBlbmQoIHBhcmFtICk7DQorDQorCQlhdm1fc3ludGF4X2Vycm9yKCAiUGFyc2VyVXRpbDo6YXBwZW5kUG9ydFBhcmFtZXRlciguLi4pIiApDQorCQkJCTw8ICJVbmZvdW5kIGxhYmVsbGVkIDwgIiA8PCBsYWJlbA0KKwkJCQk8PCAiID4gaW4gcG9ydDwgVU5LTk9XTiBhdCBwYXJzaW5nIHRpbWUgPiINCisJCQkJPDwgU1lOVEFYX0VSUk9SX0VPTDsNCisJfQ0KK30NCisNCisNCit2b2lkIFBhcnNlclV0aWw6OmNvbXB1dGVQb3J0UGFyYW1ldGVyKA0KKwkJUG9ydCAqIHBvcnQsIGNvbnN0IEJGQ29kZSAmIGlvU3RhdGVtZW50LA0KKwkJQkZWZWN0b3IgJiBsYWJlbGxlZFBhcmFtcywgQkZMaXN0ICYgcG9zaXRpb25hbFBhcmFtcykNCit7DQorCWlmKCBsYWJlbGxlZFBhcmFtcy5lbXB0eSgpICkNCisJew0KKwkJaW9TdGF0ZW1lbnQtPmFwcGVuZCggcG9zaXRpb25hbFBhcmFtcyApOw0KKwl9DQorCWVsc2UgaWYoIHBvcnQgIT0gTlVMTCApDQorCXsNCisJCVRhYmxlT2ZWYXJpYWJsZTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGl0ID0gcG9ydC0+Z2V0UGFyYW1ldGVycygpLmJlZ2luKCk7DQorCQlUYWJsZU9mVmFyaWFibGU6OmNvbnN0X3Jhd19pdGVyYXRvciBlbmRJdCA9IHBvcnQtPmdldFBhcmFtZXRlcnMoKS5lbmQoKTsNCisJCWZvciggYXZtX29mZnNldF90IG9mZnNldCA9IDAgOyBpdCAhPSBlbmRJdCA7ICsraXQgLCArK29mZnNldCApDQorCQl7DQorCQkJaWYoIGxhYmVsbGVkUGFyYW1zW29mZnNldF0udmFsaWQoKSApDQorCQkJew0KKwkJCQlpb1N0YXRlbWVudC0+YXBwZW5kKCBsYWJlbGxlZFBhcmFtc1tvZmZzZXRdICk7DQorCQkJfQ0KKwkJCWVsc2UgaWYoIChpdCktPmdldE1vZGlmaWVyKCkuaGFzTmF0dXJlUGFyYW1ldGVyQmluZCgpICkNCisJCQl7DQorCQkJCWlmKCAoaXQpLT5oYXNWYWx1ZSgpICkNCisJCQkJew0KKwkJCQkJaW9TdGF0ZW1lbnQtPmFwcGVuZCggKGl0KS0+Z2V0VmFsdWUoKSApOw0KKwkJCQl9DQorCQkJCWVsc2UNCisJCQkJew0KKwkJCQkJYXZtX3N5bnRheF9lcnJvciggIlBhcnNlclV0aWw6OmNvbXB1dGVQb3J0UGFyYW1ldGVyKC4uLikiICkNCisJCQkJCQkJPDwgIlVuZXhwZWN0ZWQgJGJpbmQgcGFyYW1ldGVyczoiIDw8IHN0ZDo6ZW5kbA0KKwkJCQkJCQk8PCAiIyIgPDwgb2Zmc2V0IDw8ICIgIiA8PCBzdHJfaGVhZGVyKCAoKml0KSApDQorCQkJCQkJCTw8IHN0ZDo6ZW5kbCA8PCAid2lodG91dCBiaW5kIGx2YWx1ZSBmb3IgcG9ydDoiDQorCQkJCQkJCTw8IHN0ZDo6ZW5kbCA8PCBzdHJfaGVhZGVyKCBwb3J0ICkNCisJCQkJCQkJPDwgU1lOVEFYX0VSUk9SX0VPTDsNCisJCQkJfQ0KKwkJCX0NCisJCQllbHNlIGlmKCAoaXQpLT5nZXRNb2RpZmllcigpLmhhc05hdHVyZVBhcmFtZXRlcigpICkNCisJCQl7DQorCQkJCWlmKCBwb3NpdGlvbmFsUGFyYW1zLm5vbmVtcHR5KCkgKQ0KKwkJCQl7DQorCQkJCQlpb1N0YXRlbWVudC0+YXBwZW5kKCBwb3NpdGlvbmFsUGFyYW1zLnBvcF9maXJzdCgpICk7DQorCQkJCX0NCisJCQkJZWxzZSBpZiggKGl0KS0+aGFzVmFsdWUoKSApDQorCQkJCXsNCisJCQkJCWlvU3RhdGVtZW50LT5hcHBlbmQoIChpdCktPmdldFZhbHVlKCkgKTsNCisJCQkJfQ0KKwkJCX0NCisJCQllbHNlIGlmKCBwb3NpdGlvbmFsUGFyYW1zLm5vbmVtcHR5KCkgKQ0KKwkJCXsNCisJCQkJaW9TdGF0ZW1lbnQtPmFwcGVuZCggcG9zaXRpb25hbFBhcmFtcy5wb3BfZmlyc3QoKSApOw0KKwkJCX0NCisJCQllbHNlDQorCQkJew0KKwkJCQlhdm1fc3ludGF4X2Vycm9yKCAiUGFyc2VyVXRpbDo6Y29tcHV0ZVBvcnRQYXJhbWV0ZXIoLi4uKSIgKQ0KKwkJCQkJCTw8ICJVbmV4cGVjdGVkIHBhcmFtZXRlcnMgZm9yIHBvcnQ8ICINCisJCQkJCQk8PCBzdHJfaGVhZGVyKCBwb3J0ICkgPDwgIiA+Ig0KKwkJCQkJCTw8IFNZTlRBWF9FUlJPUl9FT0w7DQorCQkJfQ0KKwkJfQ0KKwl9DQorfQ0KKw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBHRVQgU0lHTkFMIEJZIFsgWyBGdWxseSBdIFF1YWxpZmllZCBdIE5hbWUgSUQNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorY29uc3QgQkYgJiBQYXJzZXJVdGlsOjpnZXRDb21TaWduYWwoTWFjaGluZSAqIG1hY2hpbmUsDQorCQljb25zdCBzdGQ6OnN0cmluZyAmIHFuaWQsIGF2bV9zaXplX3QgY291bnQpDQorew0KKwlpZiggY291bnQgPiAxICkNCisJew0KKwkJaWYoIG1hY2hpbmUtPmdldFNwZWNpZmllcigpLmlzRGVzaWduSW5zdGFuY2VTdGF0aWMoKQ0KKwkJCSYmIG1hY2hpbmUtPmhhc1R5cGUoKQ0KKwkJCSYmIG1hY2hpbmUtPmdldFR5cGUoKS5pczwgTWFjaGluZSA+KCkgKQ0KKwkJew0KKwkJCW1hY2hpbmUgPSBtYWNoaW5lLT5nZXRUeXBlKCkudG9fcHRyPCBNYWNoaW5lID4oKTsNCisJCX0NCisNCisJCS8vcmV0dXJuKCBtYWNoaW5lLT5nZXRyZWNTaWduYWwocW5pZCkgKTsNCisJCWNvbnN0IEJGICYgc2lnbmFsID0gbWFjaGluZS0+Z2V0cmVjU2lnbmFsKHFuaWQpOw0KKwkJaWYoIHNpZ25hbC52YWxpZCgpICkNCisJCXsNCisJCQlyZXR1cm4oIHNpZ25hbCApOw0KKwkJfQ0KKwl9DQorCWVsc2UNCisJew0KKwkJaWYoIG1hY2hpbmUtPmdldFNwZWNpZmllcigpLmlzRGVzaWduSW5zdGFuY2VTdGF0aWMoKQ0KKwkJCSYmIG1hY2hpbmUtPmhhc1R5cGUoKQ0KKwkJCSYmIG1hY2hpbmUtPmdldFR5cGUoKS5pczwgTWFjaGluZSA+KCkgKQ0KKwkJew0KKwkJCW1hY2hpbmUgPSBtYWNoaW5lLT5nZXRUeXBlKCkudG9fcHRyPCBNYWNoaW5lID4oKTsNCisJCX0NCisNCisJCS8vcmV0dXJuKCBtYWNoaW5lLT5nZXRzZW1TaWduYWwocW5pZCkgKTsNCisJCWNvbnN0IEJGICYgc2lnbmFsID0gbWFjaGluZS0+Z2V0c2VtU2lnbmFsKHFuaWQpOw0KKwkJaWYoIHNpZ25hbC52YWxpZCgpICkNCisJCXsNCisJCQlyZXR1cm4oIHNpZ25hbCApOw0KKwkJfQ0KKwl9DQorDQorCUFWTV9PU19XQVJOIDw8ICJFcnJvcjo+IHVuZm91bmQgc2lnbmFsPCAiIDw8IHFuaWQgPDwgIiA+IGluIG1hY2hpbmU8ICINCisJCQk8PCBzdHJfaGVhZGVyKCBtYWNoaW5lICkgPDwgIiA+ISEhIiA8PCBzdGQ6OmVuZGw7DQorCSsrWExJQV9TWU5UQVhfRVJST1JfQ09VTlQ7DQorDQorCXJldHVybiggQkY6OlJFRl9OVUxMICk7DQorfQ0KKw0KK0JGIFBhcnNlclV0aWw6OmdldHZhclNpZ25hbChjb25zdCBzdGQ6OnN0cmluZyAmIHFuaWQsIGF2bV9zaXplX3QgY291bnQpDQorew0KKwljb25zdCBCRiAmIHNpZ25hbCA9ICggY291bnQgPiAxICkNCisJCQk/IF9DVFhfLm1hY2hpbmUtPmdldHJlY1NpZ25hbChxbmlkKQ0KKwkJCTogX0NUWF8ubWFjaGluZS0+Z2V0c2VtU2lnbmFsKHFuaWQpOw0KKw0KKwlpZiggc2lnbmFsLnZhbGlkKCkgKQ0KKwl7DQorCQlyZXR1cm4oIHNpZ25hbCApOw0KKwl9DQorCWVsc2UNCisJew0KKwkJQkYgdmFyU2lnbmFsKCBnZXR2YXIocW5pZCwgY291bnQpICk7DQorCQlpZiggdmFyU2lnbmFsLnZhbGlkKCkgKQ0KKwkJew0KKwkJCXJldHVybiggdmFyU2lnbmFsICk7DQorCQl9DQorCQllbHNlDQorCQl7DQorCQkJcmV0dXJuKCBORVdfVUZJRChxbmlkLCBjb3VudCkgKTsNCisJCX0NCisJfQ0KK30NCisNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gR0VUIFBPUlQgb3IgU0lHTkFMIEJZIFsgWyBGdWxseSBdIFF1YWxpZmllZCBdIE5hbWUgSUQNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorY29uc3QgQkYgJiBQYXJzZXJVdGlsOjpnZXRDb21Qb3J0U2lnbmFsKE1hY2hpbmUgKiBtYWNoaW5lLA0KKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBxbmlkLCBhdm1fc2l6ZV90IGNvdW50KQ0KK3sNCisJaWYoIGNvdW50ID4gMSApDQorCXsNCisJCWlmKCBtYWNoaW5lLT5nZXRTcGVjaWZpZXIoKS5pc0Rlc2lnbkluc3RhbmNlU3RhdGljKCkNCisJCQkmJiBtYWNoaW5lLT5oYXNUeXBlKCkNCisJCQkmJiBtYWNoaW5lLT5nZXRUeXBlKCkuaXM8IE1hY2hpbmUgPigpICkNCisJCXsNCisJCQltYWNoaW5lID0gbWFjaGluZS0+Z2V0VHlwZSgpLnRvX3B0cjwgTWFjaGluZSA+KCk7DQorCQl9DQorDQorCQkvL3JldHVybiggbWFjaGluZS0+Z2V0cmVjU2lnbmFsKHFuaWQpICk7DQorCQljb25zdCBCRiAmIHBvcnRTaWduYWwgPSBtYWNoaW5lLT5nZXRyZWNQb3J0U2lnbmFsKHFuaWQpOw0KKwkJaWYoIHBvcnRTaWduYWwudmFsaWQoKSApDQorCQl7DQorCQkJcmV0dXJuKCBwb3J0U2lnbmFsICk7DQorCQl9DQorCX0NCisJZWxzZQ0KKwl7DQorCQlpZiggbWFjaGluZS0+Z2V0U3BlY2lmaWVyKCkuaXNEZXNpZ25JbnN0YW5jZVN0YXRpYygpDQorCQkJJiYgbWFjaGluZS0+aGFzVHlwZSgpDQorCQkJJiYgbWFjaGluZS0+Z2V0VHlwZSgpLmlzPCBNYWNoaW5lID4oKSApDQorCQl7DQorCQkJbWFjaGluZSA9IG1hY2hpbmUtPmdldFR5cGUoKS50b19wdHI8IE1hY2hpbmUgPigpOw0KKwkJfQ0KKw0KKwkJLy9yZXR1cm4oIG1hY2hpbmUtPmdldHNlbVNpZ25hbChxbmlkKSApOw0KKwkJY29uc3QgQkYgJiBwb3J0U2lnbmFsID0gbWFjaGluZS0+Z2V0c2VtUG9ydFNpZ25hbChxbmlkKTsNCisJCWlmKCBwb3J0U2lnbmFsLnZhbGlkKCkgKQ0KKwkJew0KKwkJCXJldHVybiggcG9ydFNpZ25hbCApOw0KKwkJfQ0KKwl9DQorDQorCUFWTV9PU19XQVJOIDw8ICJFcnJvcjo+IHVuZm91bmQgcG9ydC9zaWduYWw8ICIgPDwgcW5pZCA8PCAiID4gaW4gbWFjaGluZTwgIg0KKwkJCTw8IHN0cl9oZWFkZXIoIG1hY2hpbmUgKSA8PCAiID4hISEiIDw8IHN0ZDo6ZW5kbDsNCisJKytYTElBX1NZTlRBWF9FUlJPUl9DT1VOVDsNCisNCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsNCit9DQorDQorQkYgUGFyc2VyVXRpbDo6Z2V0dmFyUG9ydFNpZ25hbCgNCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgcW5pZCwgYXZtX3NpemVfdCBjb3VudCkNCit7DQorCWNvbnN0IEJGICYgcG9ydFNpZ25hbCA9ICggY291bnQgPiAxICkNCisJCQk/IF9DVFhfLm1hY2hpbmUtPmdldHJlY1BvcnRTaWduYWwocW5pZCkNCisJCQk6IF9DVFhfLm1hY2hpbmUtPmdldHNlbVBvcnRTaWduYWwocW5pZCk7DQorDQorCWlmKCBwb3J0U2lnbmFsLnZhbGlkKCkgKQ0KKwl7DQorCQlyZXR1cm4oIHBvcnRTaWduYWwgKTsNCisJfQ0KKwllbHNlDQorCXsNCisJCUJGIHZhciggZ2V0dmFyKHFuaWQsIGNvdW50KSApOw0KKwkJaWYoIHZhci52YWxpZCgpICkNCisJCXsNCisJCQlyZXR1cm4oIHZhciApOw0KKwkJfQ0KKwkJZWxzZQ0KKwkJew0KKwkJCXJldHVybiggTkVXX1VGSUQocW5pZCwgY291bnQpICk7DQorCQl9DQorCX0NCit9DQorDQorDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIEdFVCBST1VUSU5FIEJZIFsgWyBGdWxseSBdIFF1YWxpZmllZCBdIE5hbWUgSUQNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorUm91dGluZSAqIFBhcnNlclV0aWw6OmdldFJvdXRpbmUoY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKQ0KK3sNCisJUm91dGluZSAqIGZvdW5kUm91dGluZSA9IF9DVFhfLm1hY2hpbmUtPnJhd3NlbVJvdXRpbmVCeU5hbWVJRChhTmFtZUlEKTsNCisNCisJaWYoIGZvdW5kUm91dGluZSA9PSBOVUxMICkNCisJew0KKwkJQVZNX09TX1dBUk4gPDwgIkVycm9yOj4gdW5mb3VuZCByb3V0aW5lPCAiIDw8IGFOYW1lSUQNCisJCQkJPDwgIiA+IGluICIgPDwgc3RyX2hlYWRlciggX0NUWF8ubWFjaGluZSApIDw8ICIgISEhIg0KKwkJCQk8PCBzdGQ6OmVuZGw7DQorCQkrK1hMSUFfU1lOVEFYX0VSUk9SX0NPVU5UOw0KKw0KKwkJcmV0dXJuKCBSb3V0aW5lOjpuZXdEZWZpbmUoX0NUWF8ubWFjaGluZSwgYU5hbWVJRCkgKTsNCisJfQ0KKw0KKwlyZXR1cm4oIGZvdW5kUm91dGluZSApOw0KK30NCisNCitCRiBQYXJzZXJVdGlsOjpnZXR2YXJSb3V0aW5lKGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkNCit7DQorCVJvdXRpbmUgKiBmb3VuZFJvdXRpbmUgPSBfQ1RYXy5tYWNoaW5lLT5yYXdzZW1Sb3V0aW5lQnlOYW1lSUQoYU5hbWVJRCk7DQorDQorCWlmKCBmb3VuZFJvdXRpbmUgPT0gTlVMTCApDQorCXsNCisJCU9wZXJhdG9yICogb3AgPSBBdm1PcGVyYXRpb25GYWN0b3J5OjpnZXQoYU5hbWVJRCk7DQorCQlpZiggb3AgIT0gTlVMTCApDQorCQl7DQorCQkJcmV0dXJuKCBJTkNSX0JGKG9wKSApOw0KKwkJfQ0KKwkJZWxzZQ0KKwkJew0KKwkJCUFWTV9PU19XQVJOIDw8ICJFcnJvcjo+IHVuZm91bmQgcm91dGluZTwgIiA8PCBhTmFtZUlEDQorCQkJCQk8PCAiID4gaW4gbWFjaGluZTwgIiA8PCBzdHJfaGVhZGVyKCBfQ1RYXy5tYWNoaW5lICkNCisJCQkJCTw8ICIgPiEhISINCisJCQkJCTw8IHN0ZDo6ZW5kbDsNCisJCQkrK1hMSUFfU1lOVEFYX0VSUk9SX0NPVU5UOw0KKwkJfQ0KKw0KKwkJcmV0dXJuKCBORVdfSUQoYU5hbWVJRCkgKTsNCisJfQ0KKw0KKwlyZXR1cm4oIElOQ1JfQkYoZm91bmRSb3V0aW5lKSApOw0KK30NCisNCisNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gR0VUIFBST0NFRFVSRSBCWSBbIFsgRnVsbHkgXSBRdWFsaWZpZWQgXSBOYW1lIElEDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKw0KK01hY2hpbmUgKiBQYXJzZXJVdGlsOjpnZXRQcm9jZWR1cmUoY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEKQ0KK3sNCisJTWFjaGluZSAqIGZvdW5kUHJvY2VkdXJlID0gX0NUWF8ubWFjaGluZS0+cmF3c2VtUHJvY2VkdXJlQnlOYW1lSUQoYU5hbWVJRCk7DQorDQorCWlmKCBmb3VuZFByb2NlZHVyZSA9PSBOVUxMICkNCisJew0KKwkJQVZNX09TX1dBUk4gPDwgIkVycm9yOj4gdW5mb3VuZCBwcm9jZWR1cmU8ICIgPDwgYU5hbWVJRA0KKwkJCQk8PCAiID4gaW4gIiA8PCBzdHJfaGVhZGVyKCBfQ1RYXy5tYWNoaW5lICkgPDwgIiAhISEiDQorCQkJCTw8IHN0ZDo6ZW5kbDsNCisJCSsrWExJQV9TWU5UQVhfRVJST1JfQ09VTlQ7DQorDQorCQlyZXR1cm4oIE1hY2hpbmU6Om5ld1Byb2NlZHVyZShfQ1RYXy5tYWNoaW5lLCBhTmFtZUlELA0KKwkJCQlTcGVjaWZpZXI6OkNPTVBPTkVOVF9QUk9DRURVUkVfU1BFQ0lGSUVSKSApOw0KKwl9DQorDQorCXJldHVybiggZm91bmRQcm9jZWR1cmUgKTsNCit9DQorDQorQkYgUGFyc2VyVXRpbDo6Z2V0dmFyUHJvY2VkdXJlKGNvbnN0IHN0ZDo6c3RyaW5nICYgYU5hbWVJRCkNCit7DQorCU1hY2hpbmUgKiBmb3VuZFByb2NlZHVyZSA9IF9DVFhfLm1hY2hpbmUtPnJhd3NlbVByb2NlZHVyZUJ5TmFtZUlEKGFOYW1lSUQpOw0KKw0KKwlpZiggZm91bmRQcm9jZWR1cmUgPT0gTlVMTCApDQorCXsNCisJCUFWTV9PU19XQVJOIDw8ICJFcnJvcjo+IHVuZm91bmQgcHJvY2VkdXJlPCAiIDw8IGFOYW1lSUQNCisJCQkJPDwgIiA+IGluICIgPDwgc3RyX2hlYWRlciggX0NUWF8ubWFjaGluZSApIDw8ICIgISEhIg0KKwkJCQk8PCBzdGQ6OmVuZGw7DQorCQkrK1hMSUFfU1lOVEFYX0VSUk9SX0NPVU5UOw0KKw0KKwkJcmV0dXJuKCBORVdfSUQoYU5hbWVJRCkgKTsNCisJfQ0KKw0KKwlyZXR1cm4oIElOQ1JfQkYoZm91bmRQcm9jZWR1cmUpICk7DQorfQ0KKw0KKw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBHRVQgTUFDSElORSBCWSBbIFsgRnVsbHkgXSBRdWFsaWZpZWQgXSBOYW1lIElEDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKw0KK01hY2hpbmUgKiBQYXJzZXJVdGlsOjpnZXRNYWNoaW5lKE1hY2hpbmUgKiBtYWNoaW5lLA0KKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBxbmlkLCBhdm1fc2l6ZV90IGNvdW50KQ0KK3sNCisJTWFjaGluZSAqIGZvdW5kTWFjaGluZSA9ICggY291bnQgPiAxICkNCisJCQk/IG1hY2hpbmUtPmdldHJlY01hY2hpbmUocW5pZCkNCisJCQk6IG1hY2hpbmUtPmdldHNlbU1hY2hpbmVCeU5hbWVJRChxbmlkKTsNCisNCisJaWYoIGZvdW5kTWFjaGluZSA9PSBOVUxMICkNCisJew0KKwkJQVZNX09TX1dBUk4gPDwgIkVycm9yOj4gdW5mb3VuZCBtYWNoaW5lPCAiIDw8IHFuaWQNCisJCQkJPDwgIiA+IGluICIgPDwgc3RyX2hlYWRlciggbWFjaGluZSApIDw8ICIgISEhIg0KKwkJCQk8PCBzdGQ6OmVuZGw7DQorCQkrK1hMSUFfU1lOVEFYX0VSUk9SX0NPVU5UOw0KKw0KKwkJcmV0dXJuKCBuZXcgTWFjaGluZShtYWNoaW5lLCBxbmlkLA0KKwkJCQlTcGVjaWZpZXI6OkNPTVBPTkVOVF9FWEVDVVRBQkxFX1NQRUNJRklFUikgKTsNCisJfQ0KKw0KKwlyZXR1cm4oIGZvdW5kTWFjaGluZSApOw0KK30NCisNCitCRiBQYXJzZXJVdGlsOjpnZXR2YXJNYWNoaW5lKGNvbnN0IHN0ZDo6c3RyaW5nICYgcW5pZCwgYXZtX3NpemVfdCBjb3VudCkNCit7DQorCU1hY2hpbmUgKiBmb3VuZE1hY2hpbmUgPSBOVUxMOw0KKwlpZiggY291bnQgPiAxICkNCisJew0KKwkJaWYoIChmb3VuZE1hY2hpbmUgPSBfQ1RYXy5tYWNoaW5lLT5nZXRzZW1NYWNoaW5lKHFuaWQpKSA9PSBOVUxMICkNCisJCXsNCisJCQlmb3VuZE1hY2hpbmUgPSBfQ1RYXy5tYWNoaW5lLT5nZXRyZWNNYWNoaW5lKHFuaWQpOw0KKwkJfQ0KKwl9DQorCWVsc2UNCisJew0KKwkJZm91bmRNYWNoaW5lID0gX0NUWF8ubWFjaGluZS0+Z2V0c2VtTWFjaGluZUJ5TmFtZUlEKHFuaWQpOw0KKwl9DQorDQorCWlmKCBmb3VuZE1hY2hpbmUgIT0gTlVMTCApDQorCXsNCisJCXJldHVybiggSU5DUl9CRihmb3VuZE1hY2hpbmUpICk7DQorCX0NCisJZWxzZQ0KKwl7DQorCQljb25zdCBCRiAmIHZhciA9IGdldHZhcihxbmlkLCBjb3VudCk7DQorCQlpZiggdmFyLnZhbGlkKCkgKQ0KKwkJew0KKwkJCXJldHVybiggdmFyICk7DQorCQl9DQorCQllbHNlDQorCQl7DQorCQkJcmV0dXJuKCBORVdfVUZJRChxbmlkLCBjb3VudCkgKTsNCisJCX0NCisJfQ0KK30NCisNCitCRiBQYXJzZXJVdGlsOjpnZXRFeGVjdXRhYmxlTWFjaGluZShjb25zdCBzdGQ6OnN0cmluZyAmIHFuaWQsIGF2bV9zaXplX3QgY291bnQpDQorew0KKwlNYWNoaW5lICogZm91bmRNYWNoaW5lID0gKCBjb3VudCA+IDEgKQ0KKwkJCT8gX0NUWF8ubWFjaGluZS0+Z2V0cmVjRXhlY3V0YWJsZU1hY2hpbmUocW5pZCkNCisJCQk6IF9DVFhfLm1hY2hpbmUtPmdldHNlbUV4ZWN1dGFibGVNYWNoaW5lKHFuaWQpOw0KKw0KKwlpZiggZm91bmRNYWNoaW5lID09IE5VTEwgKQ0KKwl7DQorCQlBVk1fT1NfV0FSTiA8PCAiRXJyb3I6PiB1bmZvdW5kIHR5cGVkZWYgbWFjaGluZTwgIiA8PCBxbmlkDQorCQkJCTw8ICIgPiBpbiBtYWNoaW5lPCAiIDw8IHN0cl9oZWFkZXIoIF9DVFhfLm1hY2hpbmUgKQ0KKwkJCQk8PCAiID4gISEhIiA8PCBzdGQ6OmVuZGw7DQorCQkrK1hMSUFfU1lOVEFYX0VSUk9SX0NPVU5UOw0KKw0KKwkJcmV0dXJuKCBCRihuZXcgTWFjaGluZShfQ1RYXy5tYWNoaW5lLCBxbmlkLA0KKwkJCQlTcGVjaWZpZXI6OkNPTVBPTkVOVF9FWEVDVVRBQkxFX1NQRUNJRklFUikpICk7DQorCX0NCisNCisJcmV0dXJuKCBJTkNSX0JGKGZvdW5kTWFjaGluZSkgKTsNCit9DQorDQorDQorDQordm9pZCBQYXJzZXJVdGlsOjphcHBlbmRJbnN0YW5jZU1hY2hpbmVQYXJhbWV0ZXIoTWFjaGluZSAqIG1hY2hpbmUsDQorCQljb25zdCBzdGQ6OnN0cmluZyAmIGxhYmVsLCBCRlZlY3RvciAmIGxhYmVsbGVkUGFyYW1zLA0KKwkJQkZMaXN0ICYgcG9zaXRpb25hbFBhcmFtcywgY29uc3QgQkYgJiBwYXJhbSkNCit7DQorCWlmKCBsYWJlbC5lbXB0eSgpICkNCisJew0KKwkJcG9zaXRpb25hbFBhcmFtcy5hcHBlbmQoIHBhcmFtICk7DQorCX0NCisJZWxzZSBpZiggbGFiZWxsZWRQYXJhbXMubm9uZW1wdHkoKSApDQorCXsNCisJCW1hY2hpbmUgPSBtYWNoaW5lLT5nZXRUeXBlKCkuYXNfcHRyPCBNYWNoaW5lID4oKTsNCisJCWF2bV9vZmZzZXRfdCBvZmZzZXQgPSBtYWNoaW5lLT5nZXRWYXJpYWJsZVBhcmFtZXRlck9mZnNldChsYWJlbCk7DQorCQlpZiggb2Zmc2V0ICE9IEFWTV9OT19PRkZTRVQgKQ0KKwkJew0KKwkJCWxhYmVsbGVkUGFyYW1zWyBvZmZzZXQgXSA9IHBhcmFtOw0KKwkJfQ0KKwkJZWxzZQ0KKwkJew0KKwkJCXBvc2l0aW9uYWxQYXJhbXMuYXBwZW5kKCBwYXJhbSApOw0KKw0KKwkJCWF2bV9zeW50YXhfZXJyb3IoICJQYXJzZXJVdGlsOjphcHBlbmRJbnN0YW5jZU1hY2hpbmVQYXJhbWV0ZXIoLi4uKSIgKQ0KKwkJCQkJPDwgIlVuZm91bmQgbGFiZWxsZWQgcGFyYW1ldGVyIDwgIiA8PCBsYWJlbA0KKwkJCQkJPDwgIiA+IGluICIgPDwgc3RyX2hlYWRlciggbWFjaGluZSApDQorCQkJCQk8PCBTWU5UQVhfRVJST1JfRU9MOw0KKwkJfQ0KKwl9DQorCWVsc2UNCisJew0KKwkJYXZtX3N5bnRheF9lcnJvciggIlBhcnNlclV0aWw6OmFwcGVuZEluc3RhbmNlTWFjaGluZVBhcmFtZXRlciguLi4pIiApDQorCQkJCTw8ICJVbmZvdW5kIHRoZSBpbnN0YW5jZSBtYWNoaW5lIG1vZGVsIDwgIg0KKwkJCQk8PCBzdHJfaGVhZGVyKCBtYWNoaW5lICkgPDwgIiA+Ig0KKwkJCQk8PCBTWU5UQVhfRVJST1JfRU9MOw0KKwl9DQorfQ0KKw0KKw0KK3ZvaWQgUGFyc2VyVXRpbDo6Y29tcHV0ZUluc3RhbmNlTWFjaGluZVBhcmFtZXRlcihNYWNoaW5lICogbWFjaGluZSwNCisJCUJGVmVjdG9yICYgbGFiZWxsZWRQYXJhbXMsIEJGTGlzdCAmIHBvc2l0aW9uYWxQYXJhbXMpDQorew0KKwlUYWJsZU9mVmFyaWFibGU6OmNvbnN0X3Jhd19pdGVyYXRvciBpdCA9IG1hY2hpbmUtPmdldFR5cGUoKS4NCisJCQlhc19wdHI8IE1hY2hpbmUgPigpLT5nZXRWYXJpYWJsZVBhcmFtZXRlcnMoKS5iZWdpbigpOw0KKwlUYWJsZU9mVmFyaWFibGU6OmNvbnN0X3Jhd19pdGVyYXRvciBlbmRJdCA9IG1hY2hpbmUtPmdldFR5cGUoKS4NCisJCQlhc19wdHI8IE1hY2hpbmUgPigpLT5nZXRWYXJpYWJsZVBhcmFtZXRlcnMoKS5lbmQoKTsNCisJZm9yKCBhdm1fb2Zmc2V0X3Qgb2Zmc2V0ID0gMCA7IGl0ICE9IGVuZEl0IDsgKytpdCAsICsrb2Zmc2V0ICkNCisJew0KKwkJaWYoIGxhYmVsbGVkUGFyYW1zW29mZnNldF0udmFsaWQoKSApDQorCQl7DQorCQkJCW1hY2hpbmUtPmdldFByb3BlcnR5UGFydCgpLnNhdmVPd25lZFZhcmlhYmxlKA0KKwkJCQkJCW5ldyBWYXJpYWJsZShtYWNoaW5lLA0KKwkJCQkJCQkJTW9kaWZpZXI6OlBST1BFUlRZX1BBUkFNRVRFUl9NT0RJRklFUiwNCisJCQkJCQkJCShpdCksIGxhYmVsbGVkUGFyYW1zW29mZnNldF0pICk7DQorCQl9DQorCQllbHNlIGlmKCAoaXQpLT5nZXRNb2RpZmllcigpLmhhc05hdHVyZVBhcmFtZXRlckJpbmQoKSApDQorCQl7DQorCQkJbWFjaGluZS0+Z2V0UHJvcGVydHlQYXJ0KCkuZGlzcGF0Y2hPd25lZEVsZW1lbnQoICgqaXQpICk7DQorCQkJaWYoIG5vdCAoaXQpLT5oYXNWYWx1ZSgpICkNCisJCQl7DQorCQkJCWF2bV9zeW50YXhfZXJyb3IoDQorCQkJCQkJIlBhcnNlclV0aWw6OmNvbXB1dGVJbnN0YW5jZU1hY2hpbmVQYXJhbWV0ZXIoLi4uKSIgKQ0KKwkJCQkJCTw8ICJVbmV4cGVjdGVkICRiaW5kIHBhcmFtZXRlcnM6IiA8PCBzdGQ6OmVuZGwNCisJCQkJCQk8PCAiIyIgPDwgb2Zmc2V0IDw8ICIgIiA8PCBzdHJfaGVhZGVyKCAoKml0KSApDQorCQkJCQkJPDwgc3RkOjplbmRsIDw8ICJ3aWh0b3V0IHZhbHVlIGZvciBtYWNoaW5lOiINCisJCQkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RyX2hlYWRlciggbWFjaGluZSApDQorCQkJCQkJPDwgU1lOVEFYX0VSUk9SX0VPTDsNCisJCQl9DQorCQl9DQorCQllbHNlIGlmKCAoaXQpLT5nZXRNb2RpZmllcigpLmhhc05hdHVyZVBhcmFtZXRlcigpICkNCisJCXsNCisJCQlpZiggcG9zaXRpb25hbFBhcmFtcy5ub25lbXB0eSgpICkNCisJCQl7DQorCQkJCW1hY2hpbmUtPmdldFByb3BlcnR5UGFydCgpLnNhdmVPd25lZFZhcmlhYmxlKA0KKwkJCQkJCW5ldyBWYXJpYWJsZSggbWFjaGluZSwNCisJCQkJCQkJCU1vZGlmaWVyOjpQUk9QRVJUWV9QQVJBTUVURVJfTU9ESUZJRVIsDQorCQkJCQkJCQkoaXQpLCBwb3NpdGlvbmFsUGFyYW1zLnBvcF9maXJzdCgpKSApOw0KKwkJCX0NCisJCQllbHNlIC8vaWYoIChpdCktPmhhc1ZhbHVlKCkgKQ0KKwkJCXsNCisJCQkJbWFjaGluZS0+Z2V0UHJvcGVydHlQYXJ0KCkuZGlzcGF0Y2hPd25lZEVsZW1lbnQoICgqaXQpICk7DQorCQkJfQ0KKwkJfQ0KKwkJZWxzZSBpZiggcG9zaXRpb25hbFBhcmFtcy5ub25lbXB0eSgpICkNCisJCXsNCisJCQltYWNoaW5lLT5nZXRQcm9wZXJ0eVBhcnQoKS5zYXZlT3duZWRWYXJpYWJsZSgNCisJCQkJCW5ldyBWYXJpYWJsZSggbWFjaGluZSwNCisJCQkJCQkJTW9kaWZpZXI6OlBST1BFUlRZX1BBUkFNRVRFUl9NT0RJRklFUiwNCisJCQkJCQkJKGl0KSwgcG9zaXRpb25hbFBhcmFtcy5wb3BfZmlyc3QoKSkgKTsNCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQlhdm1fc3ludGF4X2Vycm9yKCAiUGFyc2VyVXRpbDo6Y29tcHV0ZUluc3RhbmNlTWFjaGluZVBhcmFtZXRlciguLi4pIiApDQorCQkJCQk8PCAiVW5leHBlY3RlZCBwYXJhbWV0ZXJzIGZvciBtYWNoaW5lPCAiDQorCQkJCQk8PCBzdHJfaGVhZGVyKCBtYWNoaW5lICkgPDwgIiA+Ig0KKwkJCQkJPDwgU1lOVEFYX0VSUk9SX0VPTDsNCisJCX0NCisJfQ0KK30NCisNCisNCit2b2lkIFBhcnNlclV0aWw6OmFwcGVuZEluc3RhbmNlTWFjaGluZVJldHVybihNYWNoaW5lICogbWFjaGluZSwNCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgbGFiZWwsIEJGVmVjdG9yICYgbGFiZWxsZWRSZXR1cm5zLA0KKwkJQkZMaXN0ICYgcG9zaXRpb25hbFJldHVybnMsIGNvbnN0IEJGICYgcGFyYW0pDQorew0KKwlpZiggbGFiZWwuZW1wdHkoKSApDQorCXsNCisJCXBvc2l0aW9uYWxSZXR1cm5zLmFwcGVuZCggcGFyYW0gKTsNCisJfQ0KKwllbHNlIGlmKCBsYWJlbGxlZFJldHVybnMubm9uZW1wdHkoKSApDQorCXsNCisJCW1hY2hpbmUgPSBtYWNoaW5lLT5nZXRUeXBlKCkuYXNfcHRyPCBNYWNoaW5lID4oKTsNCisJCWF2bV9vZmZzZXRfdCBvZmZzZXQgPSBtYWNoaW5lLT5nZXRWYXJpYWJsZVJldHVybk9mZnNldChsYWJlbCk7DQorCQlpZiggb2Zmc2V0ICE9IEFWTV9OT19PRkZTRVQgKQ0KKwkJew0KKwkJCWxhYmVsbGVkUmV0dXJuc1sgb2Zmc2V0IF0gPSBwYXJhbTsNCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQlwb3NpdGlvbmFsUmV0dXJucy5hcHBlbmQoIHBhcmFtICk7DQorDQorCQkJYXZtX3N5bnRheF9lcnJvciggIlBhcnNlclV0aWw6OmFwcGVuZEluc3RhbmNlTWFjaGluZVJldHVybiguLi4pIiApDQorCQkJCQk8PCAiVW5mb3VuZCBsYWJlbGxlZCBwYXJhbWV0ZXIgPCAiIDw8IGxhYmVsDQorCQkJCQk8PCAiID4gaW4gIiA8PCBzdHJfaGVhZGVyKCBtYWNoaW5lICkNCisJCQkJCTw8IFNZTlRBWF9FUlJPUl9FT0w7DQorCQl9DQorCX0NCisJZWxzZQ0KKwl7DQorCQlhdm1fc3ludGF4X2Vycm9yKCAiUGFyc2VyVXRpbDo6YXBwZW5kSW5zdGFuY2VNYWNoaW5lUmV0dXJuKC4uLikiICkNCisJCQkJPDwgIlVuZm91bmQgdGhlIGluc3RhbmNlIG1hY2hpbmUgbW9kZWwgPCAiDQorCQkJCTw8IHN0cl9oZWFkZXIoIG1hY2hpbmUgKSA8PCAiID4iDQorCQkJCTw8IFNZTlRBWF9FUlJPUl9FT0w7DQorCX0NCit9DQorDQorDQordm9pZCBQYXJzZXJVdGlsOjpjb21wdXRlSW5zdGFuY2VNYWNoaW5lUmV0dXJuKE1hY2hpbmUgKiBtYWNoaW5lLA0KKwkJQkZWZWN0b3IgJiBsYWJlbGxlZFJldHVybnMsIEJGTGlzdCAmIHBvc2l0aW9uYWxSZXR1cm5zKQ0KK3sNCisJVGFibGVPZlZhcmlhYmxlOjpjb25zdF9yYXdfaXRlcmF0b3IgaXQgPQ0KKwkJCW1hY2hpbmUtPmdldFR5cGUoKS5hc19wdHI8IE1hY2hpbmUgPigpLT5nZXRWYXJpYWJsZVJldHVybnMoKS5iZWdpbigpOw0KKwlUYWJsZU9mVmFyaWFibGU6OmNvbnN0X3Jhd19pdGVyYXRvciBlbmRJdCA9DQorCQkJbWFjaGluZS0+Z2V0VHlwZSgpLmFzX3B0cjwgTWFjaGluZSA+KCktPmdldFZhcmlhYmxlUmV0dXJucygpLmVuZCgpOw0KKwlmb3IoIGF2bV9vZmZzZXRfdCBvZmZzZXQgPSAwIDsgaXQgIT0gZW5kSXQgOyArK2l0ICwgKytvZmZzZXQgKQ0KKwl7DQorCQlpZiggbGFiZWxsZWRSZXR1cm5zW29mZnNldF0udmFsaWQoKSApDQorCQl7DQorCQkJCW1hY2hpbmUtPmdldFByb3BlcnR5UGFydCgpLnNhdmVPd25lZFZhcmlhYmxlKA0KKwkJCQkJCW5ldyBWYXJpYWJsZSggbWFjaGluZSwNCisJCQkJCQkJCU1vZGlmaWVyOjpQUk9QRVJUWV9SRVRVUk5fUEFSQU1FVEVSX01PRElGSUVSLA0KKwkJCQkJCQkJKGl0KSwgbGFiZWxsZWRSZXR1cm5zW29mZnNldF0pICk7DQorCQl9DQorCQllbHNlIGlmKCAoaXQpLT5nZXRNb2RpZmllcigpLmhhc01vZGlmaWVyUmV0dXJuQmluZCgpICkNCisJCXsNCisJCQltYWNoaW5lLT5kaXNwYXRjaE93bmVkRWxlbWVudCggKCppdCkgKTsNCisJCQlpZiggbm90IChpdCktPmhhc1ZhbHVlKCkgKQ0KKwkJCXsNCisJCQkJYXZtX3N5bnRheF9lcnJvcigNCisJCQkJCQkiUGFyc2VyVXRpbDo6Y29tcHV0ZUluc3RhbmNlTWFjaGluZVJldHVybiguLi4pIiApDQorCQkJCQkJPDwgIlVuZXhwZWN0ZWQgI2JpbmQgcGFyYW1ldGVycyA8ICMiDQorCQkJCQkJPDwgb2Zmc2V0IDw8ICIgPiB3aWh0b3V0IHZhbHVlIGZvciBtYWNoaW5lPCAiDQorCQkJCQkJPDwgc3RyX2hlYWRlciggbWFjaGluZSApIDw8ICIgPiINCisJCQkJCQk8PCBTWU5UQVhfRVJST1JfRU9MOw0KKwkJCX0NCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQlpZiggcG9zaXRpb25hbFJldHVybnMubm9uZW1wdHkoKSApDQorCQkJew0KKwkJCQltYWNoaW5lLT5nZXRQcm9wZXJ0eVBhcnQoKS5zYXZlT3duZWRWYXJpYWJsZSgNCisJCQkJCQluZXcgVmFyaWFibGUoIG1hY2hpbmUsDQorCQkJCQkJCQlNb2RpZmllcjo6UFJPUEVSVFlfUkVUVVJOX1BBUkFNRVRFUl9NT0RJRklFUiwNCisJCQkJCQkJCShpdCksIHBvc2l0aW9uYWxSZXR1cm5zLnBvcF9maXJzdCgpKSApOw0KKwkJCX0NCisJCQllbHNlIC8vaWYoIChpdCktPmhhc1ZhbHVlKCkgKQ0KKwkJCXsNCisJCQkJbWFjaGluZS0+Z2V0UHJvcGVydHlQYXJ0KCkuZGlzcGF0Y2hPd25lZEVsZW1lbnQoICgqaXQpICk7DQorCQkJfQ0KKwkJfQ0KKwl9DQorfQ0KKw0KKw0KK3ZvaWQgUGFyc2VyVXRpbDo6YXBwZW5kSW5zdGFuY2VEeW5hbWljUG9zaXRpb25hbFBhcmFtZXRlcigNCisJCU1hY2hpbmUgKiBhbkluc3RhbmNlLCBjb25zdCBCRiAmIHJ2UGFyYW1ldGVyLCBhdm1fc2l6ZV90IHBvc2l0aW9uKQ0KK3sNCisJY29uc3QgTWFjaGluZSAqIGFNb2RlbCA9IGFuSW5zdGFuY2UtPmdldE1vZGVsTWFjaGluZSgpOw0KKw0KKwlCRiBsdlBhcmFtZXRlcjsNCisNCisJaWYoIGFNb2RlbCAhPSBOVUxMICkNCisJew0KKwkJaWYoIGFNb2RlbC0+aGFzVmFyaWFibGVQYXJhbWV0ZXIoKSApDQorCQl7DQorCQkJY29uc3QgUHJvcGVydHlQYXJ0ICYgYVByb3BlcnR5UGFydCA9IGFNb2RlbC0+Z2V0UHJvcGVydHlQYXJ0KCk7DQorDQorCQkJaWYoIHBvc2l0aW9uIDwgYVByb3BlcnR5UGFydC5nZXRWYXJpYWJsZVBhcmFtZXRlcnNDb3VudCgpICApDQorCQkJew0KKwkJCQlsdlBhcmFtZXRlciA9IGFQcm9wZXJ0eVBhcnQuZ2V0VmFyaWFibGVQYXJhbWV0ZXIocG9zaXRpb24pOw0KKw0KKwkJCQlhbkluc3RhbmNlLT5nZXRVbmlxQmVoYXZpb3JQYXJ0KCktPnNlcU9uQ3JlYXRlKA0KKwkJCQkJCVN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKA0KKwkJCQkJCQkJT1AoQVNTSUdOKSwgbHZQYXJhbWV0ZXIsIHJ2UGFyYW1ldGVyICkgKTsNCisJCQl9DQorCQkJZWxzZQ0KKwkJCXsNCisvLwkJCQlhdm1fc3ludGF4X2Vycm9yKCAiYXBwZW5kSW5zdGFuY2VEeW5hbWljUG9zaXRpb25hbFBhcmFtZXRlciguLi4pIiApDQorLy8JCQkJCQk8PCAiVW5leHBlY3RlZCBhbiAjZHluYW1pYyBpbnN0YW5jZSB3aXRoIGFuIg0KKy8vCQkJCQkJCQkiZXhlY3V0YWJsZSBtb2RlbCB3aXRob3V0IGVub3VnaCBwYXJhbWV0ZXIncyINCisvLwkJCQkJCTw8IFNZTlRBWF9FUlJPUl9FT0w7DQorCQkJfQ0KKwkJfQ0KKwkJZWxzZQ0KKwkJew0KKy8vCQkJYXZtX3N5bnRheF9lcnJvciggImFwcGVuZEluc3RhbmNlRHluYW1pY1Bvc2l0aW9uYWxQYXJhbWV0ZXIoLi4uKSIgKQ0KKy8vCQkJCQk8PCAiVW5leHBlY3RlZCBhbiAjZHluYW1pYyBpbnN0YW5jZSB3aXRoIGFuIg0KKy8vCQkJCQkJCSJleGVjdXRhYmxlIG1vZGVsIHdpdGhvdXQgcGFyYW1ldGVyJ3MiDQorLy8JCQkJCTw8IFNZTlRBWF9FUlJPUl9FT0w7DQorCQl9DQorDQorCX0NCisJZWxzZQ0KKwl7DQorLy8JCWF2bV9zeW50YXhfZXJyb3IoICJhcHBlbmRJbnN0YW5jZUR5bmFtaWNQb3NpdGlvbmFsUGFyYW1ldGVyKC4uLikiICkNCisvLwkJCQk8PCAiVW5leHBlY3RlZCBhbiAjZHluYW1pYyBpbnN0YW5jZSB3aXRoIGFuIHVua25vd24gbW9kZWwgIg0KKy8vCQkJCQkJImF0IHBhcnNpbmcgc3RhZ2UiDQorLy8JCQkJPDwgU1lOVEFYX0VSUk9SX0VPTDsNCisJfQ0KKw0KKwlpZiggbHZQYXJhbWV0ZXIuaW52YWxpZCgpICkNCisJew0KKwkJbHZQYXJhbWV0ZXIgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Og0KKwkJCQluZXdRdWFsaWZpZWRQb3NpdGlvbmFsSWRlbnRpZmllcihhbkluc3RhbmNlLCBwb3NpdGlvbik7DQorDQorCQlhbkluc3RhbmNlLT5nZXRVbmlxQmVoYXZpb3JQYXJ0KCktPnNlcU9uQ3JlYXRlKA0KKwkJCQlTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgNCisJCQkJCQlPUChBU1NJR04pLCBsdlBhcmFtZXRlciwgcnZQYXJhbWV0ZXIpICk7DQorCX0NCisNCit9DQorDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIFJPVVRJTkUgUGFyYW1ldGVycyAvIFJldHVybnMgYXJndW1lbnRzDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKw0KK3ZvaWQgUGFyc2VyVXRpbDo6YXBwZW5kUm91dGluZVBhcmFtZXRlcnMoUm91dGluZSAqIHJvdXRpbmUsDQorCQljb25zdCBzdGQ6OnN0cmluZyAmIGxhYmVsLCBCRlZlY3RvciAmIGxhYmVsbGVkUGFyYW1zLA0KKwkJQkZMaXN0ICYgcG9zaXRpb25hbFBhcmFtcywgY29uc3QgQkYgJiBwYXJhbSkNCit7DQorCWlmKCBsYWJlbC5lbXB0eSgpICkNCisJew0KKwkJcG9zaXRpb25hbFBhcmFtcy5hcHBlbmQoIHBhcmFtICk7DQorCX0NCisJZWxzZSBpZiggcm91dGluZSAhPSBOVUxMICkNCisJew0KKwkJYXZtX29mZnNldF90IG9mZnNldCA9IHJvdXRpbmUtPmdldFBhcmFtZXRlck9mZnNldChsYWJlbCk7DQorCQlpZiggb2Zmc2V0ICE9IEFWTV9OT19PRkZTRVQgKQ0KKwkJew0KKwkJCWxhYmVsbGVkUGFyYW1zWyBvZmZzZXQgXSA9IHBhcmFtOw0KKwkJfQ0KKwkJZWxzZQ0KKwkJew0KKwkJCXBvc2l0aW9uYWxQYXJhbXMuYXBwZW5kKCBwYXJhbSApOw0KKw0KKwkJCWF2bV9zeW50YXhfZXJyb3IoICJQYXJzZXJVdGlsOjphcHBlbmRSb3V0aW5lUGFyYW1ldGVycyguLi4pIiApDQorCQkJCQk8PCAiVW5mb3VuZCBsYWJlbGxlZCBwYXJhbWV0ZXIgPCAiIDw8IGxhYmVsDQorCQkJCQk8PCAiID4gaW4gcm91dGluZTwgIiA8PCBzdHJfaGVhZGVyKCByb3V0aW5lICkgPDwgIiA+Ig0KKwkJCQkJPDwgU1lOVEFYX0VSUk9SX0VPTDsNCisJCX0NCisJfQ0KKwllbHNlDQorCXsNCisJCXBvc2l0aW9uYWxQYXJhbXMuYXBwZW5kKCBwYXJhbSApOw0KKw0KKwkJYXZtX3N5bnRheF9lcnJvciggIlBhcnNlclV0aWw6OmFwcGVuZFJvdXRpbmVQYXJhbWV0ZXJzKC4uLikiICkNCisJCQkJPDwgIlVuZXhwZWN0ZWQgYW4gdW5rbm93biByb3V0aW5lIGFjdGl2aXR5Ig0KKwkJCQk8PCBTWU5UQVhfRVJST1JfRU9MOw0KKwl9DQorfQ0KKw0KKw0KK3ZvaWQgUGFyc2VyVXRpbDo6YXBwZW5kUm91dGluZVJldHVybnMoUm91dGluZSAqIHJvdXRpbmUsDQorCQljb25zdCBzdGQ6OnN0cmluZyAmIGxhYmVsLCBCRlZlY3RvciAmIGxhYmVsbGVkUmV0dXJucywNCisJCUJGTGlzdCAmIHBvc2l0aW9uYWxSZXR1cm5zLCBjb25zdCBCRiAmIHBhcmFtKQ0KK3sNCisJaWYoIGxhYmVsLmVtcHR5KCkgKQ0KKwl7DQorCQlwb3NpdGlvbmFsUmV0dXJucy5hcHBlbmQoIHBhcmFtICk7DQorCX0NCisJZWxzZSBpZiggcm91dGluZSAhPSBOVUxMICkNCisJew0KKwkJYXZtX29mZnNldF90IG9mZnNldCA9IHJvdXRpbmUtPmdldFJldHVybk9mZnNldChsYWJlbCk7DQorCQlpZiggb2Zmc2V0ICE9IEFWTV9OT19PRkZTRVQgKQ0KKwkJew0KKwkJCWxhYmVsbGVkUmV0dXJuc1sgb2Zmc2V0IF0gPSBwYXJhbTsNCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQlwb3NpdGlvbmFsUmV0dXJucy5hcHBlbmQoIHBhcmFtICk7DQorDQorCQkJYXZtX3N5bnRheF9lcnJvciggIlBhcnNlclV0aWw6OmFwcGVuZFJvdXRpbmVSZXR1cm5zKC4uLikiICkNCisJCQkJCTw8ICJVbmZvdW5kIGxhYmVsbGVkIHBhcmFtZXRlciA8ICIgPDwgbGFiZWwNCisJCQkJCTw8ICIgPiBpbiByb3V0aW5lPCAiIDw8IHN0cl9oZWFkZXIoIHJvdXRpbmUgKSA8PCAiID4iDQorCQkJCQk8PCBTWU5UQVhfRVJST1JfRU9MOw0KKwkJfQ0KKwl9DQorCWVsc2UNCisJew0KKwkJcG9zaXRpb25hbFJldHVybnMuYXBwZW5kKCBwYXJhbSApOw0KKw0KKwkJYXZtX3N5bnRheF9lcnJvciggIlBhcnNlclV0aWw6OmFwcGVuZFJvdXRpbmVSZXR1cm5zKC4uLikiICkNCisJCQkJPDwgIlVuZXhwZWN0ZWQgYW4gdW5rbm93biByb3V0aW5lIGFjdGl2aXR5Ig0KKwkJCQk8PCBTWU5UQVhfRVJST1JfRU9MOw0KKwl9DQorfQ0KKw0KKw0KK3ZvaWQgUGFyc2VyVXRpbDo6Y29tcHV0ZVJvdXRpbmVQYXJhbVJldHVybihjb25zdCBCRiAmIGN0eE1hY2hpbmUsDQorCQlSb3V0aW5lICogcm91dGluZSwgQkZDb2RlICYgYWN0aXZpdHlTdGF0ZW1lbnQsDQorCQlCRlZlY3RvciAmIGxhYmVsbGVkUGFyYW1zLCBCRkxpc3QgJiBwb3NpdGlvbmFsUGFyYW1zLA0KKwkJQkZWZWN0b3IgJiBsYWJlbGxlZFJldHVybnMsIEJGTGlzdCAmIHBvc2l0aW9uYWxSZXR1cm5zKQ0KK3sNCisJTWFjaGluZSAqIG1hY2hpbmUgPSBjdHhNYWNoaW5lLmlzPCBNYWNoaW5lID4oKSA/DQorCQkJY3R4TWFjaGluZS50b19wdHI8IE1hY2hpbmUgPigpIDogTlVMTDsNCisNCisJaWYoIChyb3V0aW5lICE9IE5VTEwpICYmIChtYWNoaW5lICE9IE5VTEwpICkNCisJew0KKwkJQkZDb2RlIGludm9rZVNlcXVlbmRlID0gU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoIE9QKFNFUVVFTkNFKSApOw0KKw0KKwkJTWFjaGluZSAqIG1hY2hpbmUgPSBjdHhNYWNoaW5lLmlzPCBNYWNoaW5lID4oKSA/DQorCQkJCWN0eE1hY2hpbmUudG9fcHRyPCBNYWNoaW5lID4oKSA6IE5VTEw7DQorDQorCQljb21wdXRlQWN0aXZpdHlSb3V0aW5lSW5wdXQobWFjaGluZSwgcm91dGluZSwNCisJCQkJaW52b2tlU2VxdWVuZGUsIGxhYmVsbGVkUGFyYW1zLCBwb3NpdGlvbmFsUGFyYW1zKTsNCisNCisJCWNvbXB1dGVBY3Rpdml0eVJvdXRpbmVEZWZhdWx0T3V0cHV0KG1hY2hpbmUsIHJvdXRpbmUsDQorCQkJCWludm9rZVNlcXVlbmRlLCBsYWJlbGxlZFJldHVybnMsIHBvc2l0aW9uYWxSZXR1cm5zKTsNCisNCisJCWludm9rZVNlcXVlbmRlLT5hcHBlbmQoIGFjdGl2aXR5U3RhdGVtZW50ICk7DQorDQorCQljb21wdXRlQWN0aXZpdHlSb3V0aW5lT3V0cHV0KG1hY2hpbmUsIHJvdXRpbmUsDQorCQkJCWludm9rZVNlcXVlbmRlLCBsYWJlbGxlZFJldHVybnMsIHBvc2l0aW9uYWxSZXR1cm5zKTsNCisNCisJCWFjdGl2aXR5U3RhdGVtZW50ID0gU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoDQorCQkJCU9QKENPTlRFWFRfU1dJVENIRVIpLCBjdHhNYWNoaW5lLCBpbnZva2VTZXF1ZW5kZSApOw0KKwl9DQorCWVsc2UNCisJew0KKwkJaWYoIGxhYmVsbGVkUGFyYW1zLmVtcHR5KCkgKQ0KKwkJew0KKwkJCWFjdGl2aXR5U3RhdGVtZW50LT5hcHBlbmQoIHBvc2l0aW9uYWxQYXJhbXMgKTsNCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQljb21wdXRlQWN0aXZpdHlSb3V0aW5lSW5wdXQobWFjaGluZSwgcm91dGluZSwNCisJCQkJCWFjdGl2aXR5U3RhdGVtZW50LCBsYWJlbGxlZFBhcmFtcywgcG9zaXRpb25hbFBhcmFtcyk7DQorCQl9DQorDQorCQlpZiggbGFiZWxsZWRSZXR1cm5zLmVtcHR5KCkgKQ0KKwkJew0KKwkJCWFjdGl2aXR5U3RhdGVtZW50LT5hcHBlbmQoIHBvc2l0aW9uYWxSZXR1cm5zICk7DQorCQl9DQorCQllbHNlDQorCQl7DQorCQkJY29tcHV0ZUFjdGl2aXR5Um91dGluZU91dHB1dChtYWNoaW5lLCByb3V0aW5lLA0KKwkJCQkJYWN0aXZpdHlTdGF0ZW1lbnQsIGxhYmVsbGVkUmV0dXJucywgcG9zaXRpb25hbFJldHVybnMpOw0KKwkJfQ0KKwl9DQorfQ0KKw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gQUNUSVZJVFkgUk9VVElORSBQYXJhbWV0ZXJzIC8gUmV0dXJucyBhcmd1bWVudHMNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKw0KK3ZvaWQgUGFyc2VyVXRpbDo6Y29tcHV0ZUFjdGl2aXR5Um91dGluZVBhcmFtUmV0dXJuKGNvbnN0IEJGICYgY3R4TWFjaGluZSwNCisJCVJvdXRpbmUgKiByb3V0aW5lLCBCRkNvZGUgJiBhY3Rpdml0eVN0YXRlbWVudCwNCisJCUJGVmVjdG9yICYgbGFiZWxsZWRQYXJhbXMsIEJGTGlzdCAmIHBvc2l0aW9uYWxQYXJhbXMsDQorCQlCRlZlY3RvciAmIGxhYmVsbGVkUmV0dXJucywgQkZMaXN0ICYgcG9zaXRpb25hbFJldHVybnMpDQorew0KKwlNYWNoaW5lICogbWFjaGluZSA9IGN0eE1hY2hpbmUuaXM8IE1hY2hpbmUgPigpID8NCisJCQljdHhNYWNoaW5lLnRvX3B0cjwgTWFjaGluZSA+KCkgOiBOVUxMOw0KKw0KKwlpZiggKHJvdXRpbmUgIT0gTlVMTCkgJiYgKG1hY2hpbmUgIT0gTlVMTCkgKQ0KKwl7DQorCQlCRkNvZGUgaW52b2tlU2VxdWVuZGUgPSBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSggT1AoU0VRVUVOQ0UpICk7DQorDQorCQlNYWNoaW5lICogbWFjaGluZSA9IGN0eE1hY2hpbmUuaXM8IE1hY2hpbmUgPigpID8NCisJCQkJY3R4TWFjaGluZS50b19wdHI8IE1hY2hpbmUgPigpIDogTlVMTDsNCisNCisJCWNvbXB1dGVBY3Rpdml0eVJvdXRpbmVJbnB1dChtYWNoaW5lLCByb3V0aW5lLA0KKwkJCQlpbnZva2VTZXF1ZW5kZSwgbGFiZWxsZWRQYXJhbXMsIHBvc2l0aW9uYWxQYXJhbXMpOw0KKw0KKwkJY29tcHV0ZUFjdGl2aXR5Um91dGluZURlZmF1bHRPdXRwdXQobWFjaGluZSwgcm91dGluZSwNCisJCQkJaW52b2tlU2VxdWVuZGUsIGxhYmVsbGVkUmV0dXJucywgcG9zaXRpb25hbFJldHVybnMpOw0KKw0KKwkJaW52b2tlU2VxdWVuZGUtPmFwcGVuZCggYWN0aXZpdHlTdGF0ZW1lbnQgKTsNCisNCisJCWNvbXB1dGVBY3Rpdml0eVJvdXRpbmVPdXRwdXQobWFjaGluZSwgcm91dGluZSwNCisJCQkJaW52b2tlU2VxdWVuZGUsIGxhYmVsbGVkUmV0dXJucywgcG9zaXRpb25hbFJldHVybnMpOw0KKw0KKwkJYWN0aXZpdHlTdGF0ZW1lbnQgPSBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgNCisJCQkJT1AoQ09OVEVYVF9TV0lUQ0hFUiksIGN0eE1hY2hpbmUsIGludm9rZVNlcXVlbmRlICk7DQorCX0NCisJZWxzZQ0KKwl7DQorCQlpZiggbGFiZWxsZWRQYXJhbXMuZW1wdHkoKSApDQorCQl7DQorCQkJYWN0aXZpdHlTdGF0ZW1lbnQtPmFwcGVuZCggcG9zaXRpb25hbFBhcmFtcyApOw0KKwkJfQ0KKwkJZWxzZQ0KKwkJew0KKwkJCWNvbXB1dGVBY3Rpdml0eVJvdXRpbmVJbnB1dChtYWNoaW5lLCByb3V0aW5lLA0KKwkJCQkJYWN0aXZpdHlTdGF0ZW1lbnQsIGxhYmVsbGVkUGFyYW1zLCBwb3NpdGlvbmFsUGFyYW1zKTsNCisJCX0NCisNCisJCWlmKCBsYWJlbGxlZFJldHVybnMuZW1wdHkoKSApDQorCQl7DQorCQkJYWN0aXZpdHlTdGF0ZW1lbnQtPmFwcGVuZCggcG9zaXRpb25hbFJldHVybnMgKTsNCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQljb21wdXRlQWN0aXZpdHlSb3V0aW5lT3V0cHV0KG1hY2hpbmUsIHJvdXRpbmUsDQorCQkJCQlhY3Rpdml0eVN0YXRlbWVudCwgbGFiZWxsZWRSZXR1cm5zLCBwb3NpdGlvbmFsUmV0dXJucyk7DQorCQl9DQorCX0NCit9DQorDQorDQorc3RhdGljIGlubGluZSB2b2lkIGFwcGVuZFBhcmFtKEJGQ29kZSAmIHBhcmFtQ29kZSwgY29uc3QgQkYgJiBiZlBhcmFtVmFyLA0KKwkJVmFyaWFibGUgKiBwUGFyYW1WYXIsIGNvbnN0IEJGICYgYmZQYXJhbVZhbHVlKQ0KK3sNCisJcGFyYW1Db2RlLT5hcHBlbmQoIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKA0KKwkJCXBQYXJhbVZhci0+Z2V0TW9kaWZpZXIoKS5oYXNOYXR1cmVSZWZlcmVuY2UoKSA/DQorCQkJCQlPUChBU1NJR05fUkVGKSA6IE9QKEFTU0lHTiksDQorCQkJcFBhcmFtVmFyLT5nZXRNb2RpZmllcigpLmhhc05hdHVyZU1hY3JvKCkgPw0KKwkJCQkJcFBhcmFtVmFyLT5nZXRCaW5kaW5nKCkgOiBiZlBhcmFtVmFyLA0KKwkJCWJmUGFyYW1WYWx1ZSApICk7DQorfQ0KKw0KK3ZvaWQgUGFyc2VyVXRpbDo6Y29tcHV0ZUFjdGl2aXR5Um91dGluZUlucHV0KE1hY2hpbmUgKiBjdHhNYWNoaW5lLA0KKwkJUm91dGluZSAqIHJvdXRpbmUsIEJGQ29kZSAmIGludm9rZVNlcXVlbmRlLA0KKwkJQkZWZWN0b3IgJiBsYWJlbGxlZFBhcmFtcywgQkZMaXN0ICYgcG9zaXRpb25hbFBhcmFtcykNCit7DQorCUJGQ29kZSBwYXJhbUNvZGUoIE9QKEFUT01JQ19TRVFVRU5DRSkgKTsNCisNCisJVmFyaWFibGUgKiB2YXJpYWJsZSA9IE5VTEw7DQorCUJGVmVjdG9yOjpjb25zdF9pdGVyYXRvciBpdCA9IHJvdXRpbmUtPmdldFBhcmFtZXRlcnMoKS5iZWdpbigpOw0KKwlCRlZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgZW5kSXQgPSByb3V0aW5lLT5nZXRQYXJhbWV0ZXJzKCkuZW5kKCk7DQorCWZvciggYXZtX29mZnNldF90IG9mZnNldCA9IDAgOyBpdCAhPSBlbmRJdCA7ICsraXQgLCArK29mZnNldCApDQorCXsNCisJCXZhcmlhYmxlID0gKCppdCkudG9fcHRyPCBWYXJpYWJsZSA+KCk7DQorDQorCQlpZiggbGFiZWxsZWRQYXJhbXNbb2Zmc2V0XS52YWxpZCgpICkNCisJCXsNCisJCQlhcHBlbmRQYXJhbShwYXJhbUNvZGUsICgqaXQpLCB2YXJpYWJsZSwgbGFiZWxsZWRQYXJhbXNbb2Zmc2V0XSk7DQorCQl9DQorDQorCQllbHNlIGlmKCB2YXJpYWJsZS0+Z2V0TW9kaWZpZXIoKS5oYXNOYXR1cmVQYXJhbWV0ZXJCaW5kKCkgKQ0KKwkJew0KKwkJCWlmKCB2YXJpYWJsZS0+aGFzVmFsdWUoKSApDQorCQkJew0KKwkJCQlhcHBlbmRQYXJhbShwYXJhbUNvZGUsICgqaXQpLCB2YXJpYWJsZSwgdmFyaWFibGUtPmdldFZhbHVlKCkpOw0KKwkJCX0NCisJCQllbHNlDQorCQkJew0KKwkJCQlhdm1fc3ludGF4X2Vycm9yKCAiUGFyc2VyVXRpbDo6Y29tcHV0ZUFjdGl2aXR5Um91dGluZUlucHV0KC4uLikiICkNCisJCQkJCQk8PCAiVW5leHBlY3RlZCAkYmluZCBwYXJhbWV0ZXJzOiIgPDwgc3RkOjplbmRsDQorCQkJCQkJPDwgIiMiIDw8IG9mZnNldCA8PCAiICIgPDwgc3RyX2hlYWRlciggdmFyaWFibGUgKQ0KKwkJCQkJCTw8IHN0ZDo6ZW5kbCA8PCAid2lodG91dCB2YWx1ZSBmb3Igcm91dGluZToiDQorCQkJCQkJPDwgc3RkOjplbmRsIDw8IHN0cl9oZWFkZXIoIHJvdXRpbmUgKQ0KKwkJCQkJCTw8IFNZTlRBWF9FUlJPUl9FT0w7DQorCQkJfQ0KKwkJfQ0KKw0KKy8vCQllbHNlIGlmKCB2YXJpYWJsZS0+Z2V0TW9kaWZpZXIoKS5oYXNOYXR1cmVQYXJhbWV0ZXIoKSApDQorLy8JCXsNCisvLwkJCWlmKCBwb3NpdGlvbmFsUGFyYW1zLm5vbmVtcHR5KCkgKQ0KKy8vCQkJew0KKy8vCQkJCWFwcGVuZFBhcmFtKHBhcmFtQ29kZSwgKCppdCksDQorLy8JCQkJCQl2YXJpYWJsZSwgcG9zaXRpb25hbFBhcmFtcy5wb3BfZmlyc3QoKSk7DQorLy8JCQl9DQorLy8JCQllbHNlIGlmKCB2YXJpYWJsZS0+aGFzVmFsdWUoKSApDQorLy8JCQl7DQorLy8JCQkJYXBwZW5kUGFyYW0ocGFyYW1Db2RlLCAoKml0KSwgdmFyaWFibGUsIHZhcmlhYmxlLT5nZXRWYWx1ZSgpKTsNCisvLwkJCX0NCisvLwkJfQ0KKw0KKwkJZWxzZSBpZiggcG9zaXRpb25hbFBhcmFtcy5ub25lbXB0eSgpICkNCisJCXsNCisJCQlhcHBlbmRQYXJhbShwYXJhbUNvZGUsICgqaXQpLA0KKwkJCQkJdmFyaWFibGUsIHBvc2l0aW9uYWxQYXJhbXMucG9wX2ZpcnN0KCkpOw0KKwkJfQ0KKwkJZWxzZSBpZiggdmFyaWFibGUtPmhhc1ZhbHVlKCkgKQ0KKwkJew0KKwkJCWFwcGVuZFBhcmFtKHBhcmFtQ29kZSwgKCppdCksIHZhcmlhYmxlLCB2YXJpYWJsZS0+Z2V0VmFsdWUoKSk7DQorCQl9DQorDQorCQllbHNlDQorCQl7DQorCQkJYXZtX3N5bnRheF9lcnJvciggIlBhcnNlclV0aWw6OmNvbXB1dGVBY3Rpdml0eVJvdXRpbmVJbnB1dCguLi4pIiApDQorCQkJCQk8PCAiVW5leHBlY3RlZCBwYXJhbWV0ZXJzIGZvciByb3V0aW5lPCAiDQorCQkJCQk8PCBzdHJfaGVhZGVyKCByb3V0aW5lICkgPDwgICIgPiINCisJCQkJCTw8IFNZTlRBWF9FUlJPUl9FT0w7DQorCQl9DQorCX0NCisNCisJaWYoIHBhcmFtQ29kZS0+bm9uZW1wdHkoKSApDQorCXsNCisJCWludm9rZVNlcXVlbmRlLT5hcHBlbmQoDQorCQkJCXBhcmFtQ29kZS0+c2luZ2xldG9uKCkgPyBwYXJhbUNvZGUtPmZpcnN0KCkgOiBwYXJhbUNvZGUgKTsNCisJfQ0KK30NCisNCisNCitzdGF0aWMgaW5saW5lIHZvaWQgYXBwZW5kUmV0dXJuKEJGQ29kZSAmIHJldHVybkNvZGUsIGNvbnN0IEJGICYgYmZSZXR1cm5WYXIsDQorCQlWYXJpYWJsZSAqIHBSZXR1cm5WYXIsIGNvbnN0IEJGICYgYmZSZXR1cm5EZXN0KQ0KK3sNCisJcmV0dXJuQ29kZS0+YXBwZW5kKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgNCisJCQlwUmV0dXJuVmFyLT5nZXRNb2RpZmllcigpLmhhc05hdHVyZVJlZmVyZW5jZSgpID8NCisJCQkJCU9QKEFTU0lHTl9SRUYpIDogT1AoQVNTSUdOKSwNCisJCQliZlJldHVybkRlc3QsDQorCQkJcFJldHVyblZhci0+Z2V0TW9kaWZpZXIoKS5oYXNOYXR1cmVNYWNybygpID8NCisJCQkJCXBSZXR1cm5WYXItPmdldEJpbmRpbmcoKSA6IGJmUmV0dXJuVmFyICkgKTsNCit9DQorDQorDQordm9pZCBQYXJzZXJVdGlsOjpjb21wdXRlQWN0aXZpdHlSb3V0aW5lRGVmYXVsdE91dHB1dChNYWNoaW5lICogY3R4TWFjaGluZSwNCisJCVJvdXRpbmUgKiByb3V0aW5lLCBCRkNvZGUgJiBpbnZva2VTZXF1ZW5kZSwNCisJCUJGVmVjdG9yICYgbGFiZWxsZWRSZXR1cm5zLCBCRkxpc3QgJiBwb3NpdGlvbmFsUmV0dXJucykNCit7DQorCUJGQ29kZSByZXR1cm5Db2RlKCBPUChBVE9NSUNfU0VRVUVOQ0UpICk7DQorDQorCVZhcmlhYmxlICogdmFyaWFibGUgPSBOVUxMOw0KKwlCRlZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgaXQgPSByb3V0aW5lLT5nZXRSZXR1cm5zKCkuYmVnaW4oKTsNCisJQkZWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gcm91dGluZS0+Z2V0UmV0dXJucygpLmVuZCgpOw0KKwlmb3IoIGF2bV9vZmZzZXRfdCBvZmZzZXQgPSAwIDsgaXQgIT0gZW5kSXQgOyArK2l0ICwgKytvZmZzZXQgKQ0KKwl7DQorCQl2YXJpYWJsZSA9ICgqaXQpLnRvX3B0cjwgVmFyaWFibGUgPigpOw0KKw0KKwkJaWYoIGxhYmVsbGVkUmV0dXJuc1tvZmZzZXRdLnZhbGlkKCkgJiYgdmFyaWFibGUtPmhhc1ZhbHVlKCkgKQ0KKwkJew0KKwkJCXJldHVybkNvZGUtPmFwcGVuZCggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoIE9QKEFTU0lHTiksDQorCQkJCQkoKml0KSwgdmFyaWFibGUtPmdldFZhbHVlKCkgKSApOw0KKwkJfQ0KKw0KKwkJZWxzZSBpZiggdmFyaWFibGUtPmdldE1vZGlmaWVyKCkuaGFzTW9kaWZpZXJSZXR1cm5CaW5kKCkgKQ0KKwkJew0KKwkJCWlmKCB2YXJpYWJsZS0+aGFzVmFsdWUoKSApDQorCQkJew0KKwkJCQlhcHBlbmRSZXR1cm4ocmV0dXJuQ29kZSwgKCppdCksIHZhcmlhYmxlLCB2YXJpYWJsZS0+Z2V0VmFsdWUoKSk7DQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCWF2bV9zeW50YXhfZXJyb3IoDQorCQkJCQkJIlBhcnNlclV0aWw6OmNvbXB1dGVBY3Rpdml0eVJvdXRpbmVEZWZhdWx0T3V0cHV0KC4uLikiICkNCisJCQkJCQk8PCAiVW5leHBlY3RlZCAkYmluZCBwYXJhbWV0ZXJzOiIgPDwgc3RkOjplbmRsDQorCQkJCQkJPDwgIiMiIDw8IG9mZnNldCA8PCAiICIgPDwgc3RyX2hlYWRlciggdmFyaWFibGUgKQ0KKwkJCQkJCTw8IHN0ZDo6ZW5kbCA8PCAid2lodG91dCB2YWx1ZSBmb3Igcm91dGluZToiDQorCQkJCQkJPDwgc3RkOjplbmRsIDw8IHN0cl9oZWFkZXIoIHJvdXRpbmUgKQ0KKwkJCQkJCTw8IFNZTlRBWF9FUlJPUl9FT0w7DQorCQkJfQ0KKwkJfQ0KKw0KKy8vCQllbHNlIGlmKCB2YXJpYWJsZS0+Z2V0TW9kaWZpZXIoKS5pc0RpcmVjdGlvblJldHVybigpICkNCisvLwkJew0KKy8vCQkJaWYoIHBvc2l0aW9uYWxSZXR1cm5zLm5vbmVtcHR5KCkgJiYgdmFyaWFibGUtPmhhc1ZhbHVlKCkgKQ0KKy8vCQkJew0KKy8vCQkJCXJldHVybkNvZGUtPmFwcGVuZCggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoIE9QKEFTU0lHTiksDQorLy8JCQkJCQkoKml0KSwgdmFyaWFibGUtPmdldFZhbHVlKCkgKSApOw0KKy8vCQkJfQ0KKy8vCQkJZWxzZSBpZiggdmFyaWFibGUtPmhhc1ZhbHVlKCkgKQ0KKy8vCQkJew0KKy8vCQkJfQ0KKy8vCQl9DQorDQorCQllbHNlIGlmKCBwb3NpdGlvbmFsUmV0dXJucy5ub25lbXB0eSgpICYmIHZhcmlhYmxlLT5oYXNWYWx1ZSgpICkNCisJCXsNCisJCQlyZXR1cm5Db2RlLT5hcHBlbmQoIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKCBPUChBU1NJR04pLA0KKwkJCQkJKCppdCksIHZhcmlhYmxlLT5nZXRWYWx1ZSgpICkgKTsNCisJCX0NCisJCWVsc2UNCisJCXsNCisJCX0NCisJfQ0KKw0KKwlpZiggcmV0dXJuQ29kZS0+bm9uZW1wdHkoKSApDQorCXsNCisJCWludm9rZVNlcXVlbmRlLT5hcHBlbmQoDQorCQkJCXJldHVybkNvZGUtPnNpbmdsZXRvbigpID8gcmV0dXJuQ29kZS0+Zmlyc3QoKSA6IHJldHVybkNvZGUgKTsNCisJfQ0KK30NCisNCisNCit2b2lkIFBhcnNlclV0aWw6OmNvbXB1dGVBY3Rpdml0eVJvdXRpbmVPdXRwdXQoTWFjaGluZSAqIGN0eE1hY2hpbmUsDQorCQlSb3V0aW5lICogcm91dGluZSwgQkZDb2RlICYgaW52b2tlU2VxdWVuZGUsDQorCQlCRlZlY3RvciAmIGxhYmVsbGVkUmV0dXJucywgQkZMaXN0ICYgcG9zaXRpb25hbFJldHVybnMpDQorew0KKwlCRkNvZGUgcmV0dXJuQ29kZSggT1AoQVRPTUlDX1NFUVVFTkNFKSApOw0KKw0KKwlWYXJpYWJsZSAqIHZhcmlhYmxlID0gTlVMTDsNCisJQkZWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gcm91dGluZS0+Z2V0UmV0dXJucygpLmJlZ2luKCk7DQorCUJGVmVjdG9yOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IHJvdXRpbmUtPmdldFJldHVybnMoKS5lbmQoKTsNCisJZm9yKCBhdm1fb2Zmc2V0X3Qgb2Zmc2V0ID0gMCA7IGl0ICE9IGVuZEl0IDsgKytpdCAsICsrb2Zmc2V0ICkNCisJew0KKwkJdmFyaWFibGUgPSAoKml0KS50b19wdHI8IFZhcmlhYmxlID4oKTsNCisNCisJCWlmKCBsYWJlbGxlZFJldHVybnNbb2Zmc2V0XS52YWxpZCgpICkNCisJCXsNCisJCQlhcHBlbmRSZXR1cm4ocmV0dXJuQ29kZSwgKCppdCksIHZhcmlhYmxlLCBsYWJlbGxlZFJldHVybnNbb2Zmc2V0XSk7DQorCQl9DQorCQllbHNlIGlmKCB2YXJpYWJsZS0+Z2V0TW9kaWZpZXIoKS5oYXNNb2RpZmllclJldHVybkJpbmQoKSApDQorCQl7DQorCQkJaWYoIHZhcmlhYmxlLT5oYXNWYWx1ZSgpICkNCisJCQl7DQorCQkJCWFwcGVuZFJldHVybihyZXR1cm5Db2RlLCAoKml0KSwgdmFyaWFibGUsIHZhcmlhYmxlLT5nZXRWYWx1ZSgpKTsNCisJCQl9DQorCQkJZWxzZQ0KKwkJCXsNCisJCQkJYXZtX3N5bnRheF9lcnJvciggIlBhcnNlclV0aWw6OmNvbXB1dGVBY3Rpdml0eVJvdXRpbmVPdXRwdXQoLi4uKSIgKQ0KKwkJCQkJCTw8ICJVbmV4cGVjdGVkICNiaW5kIHJldHVybnMgPCAjIg0KKwkJCQkJCTw8IG9mZnNldCA8PCAiID4gd2lodG91dCB2YWx1ZSBmb3Igcm91dGluZTwgIg0KKwkJCQkJCTw8IHN0cl9oZWFkZXIoIHJvdXRpbmUgKSA8PCAiID4iDQorCQkJCQkJPDwgU1lOVEFYX0VSUk9SX0VPTDsNCisJCQl9DQorCQl9DQorCQllbHNlIGlmKCB2YXJpYWJsZS0+Z2V0TW9kaWZpZXIoKS5pc0RpcmVjdGlvblJldHVybigpICkNCisJCXsNCisJCQlpZiggcG9zaXRpb25hbFJldHVybnMubm9uZW1wdHkoKSApDQorCQkJew0KKwkJCQlhcHBlbmRSZXR1cm4ocmV0dXJuQ29kZSwgKCppdCksDQorCQkJCQkJdmFyaWFibGUsIHBvc2l0aW9uYWxSZXR1cm5zLnBvcF9maXJzdCgpKTsNCisJCQl9DQorCQkJZWxzZSBpZiggdmFyaWFibGUtPmhhc1ZhbHVlKCkgKQ0KKwkJCXsNCisJCQkJYXBwZW5kUmV0dXJuKHJldHVybkNvZGUsICgqaXQpLA0KKwkJCQkJCXZhcmlhYmxlLCB2YXJpYWJsZS0+Z2V0VmFsdWUoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJZWxzZSBpZiggcG9zaXRpb25hbFJldHVybnMubm9uZW1wdHkoKSApDQorCQl7DQorCQkJYXBwZW5kUmV0dXJuKHJldHVybkNvZGUsICgqaXQpLA0KKwkJCQkJdmFyaWFibGUsIHBvc2l0aW9uYWxSZXR1cm5zLnBvcF9maXJzdCgpKTsNCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQlhdm1fc3ludGF4X2Vycm9yKCAiUGFyc2VyVXRpbDo6Y29tcHV0ZUFjdGl2aXR5Um91dGluZU91dHB1dCguLi4pIiApDQorCQkJCQk8PCAiVW5leHBlY3RlZCByZXR1cm5zIGZvciByb3V0aW5lPCAiDQorCQkJCQk8PCBzdHJfaGVhZGVyKCByb3V0aW5lICkgPDwgIiA+Ig0KKwkJCQkJPDwgU1lOVEFYX0VSUk9SX0VPTDsNCisJCX0NCisJfQ0KKw0KKwlpZiggcmV0dXJuQ29kZS0+bm9uZW1wdHkoKSApDQorCXsNCisJCWludm9rZVNlcXVlbmRlLT5hcHBlbmQoDQorCQkJCXJldHVybkNvZGUtPnNpbmdsZXRvbigpID8gcmV0dXJuQ29kZS0+Zmlyc3QoKSA6IHJldHVybkNvZGUgKTsNCisJfQ0KK30NCisNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIEdFVCBYTElBIElOVk9LQUJMRSBCWSBJRA0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorQkYgUGFyc2VyVXRpbDo6Z2V0SW52b2thYmxlKGNvbnN0IEJGICYgdGFyZ2V0LCBjb25zdCBzdGQ6OnN0cmluZyAmIGFOYW1lSUQpDQorew0KKwlPcGVyYXRvciAqIG9wID0gQXZtT3BlcmF0aW9uRmFjdG9yeTo6Z2V0KHRhcmdldCwgYU5hbWVJRCk7DQorCWlmKCBvcCAhPSBOVUxMICkNCisJew0KKwkJcmV0dXJuKCBJTkNSX0JGKG9wKSApOw0KKwl9DQorDQorCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdJZGVudGlmaWVyKGFOYW1lSUQpICk7DQorfQ0KKw0KKw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gREVDTEFSRSBERUZBVUxUIFNUQVRFICAjZmluYWwsICN0ZXJtaW5hbCwgI3JldHVybiAgaWYgbmVlZA0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQordm9pZCBQYXJzZXJVdGlsOjpkZWNsYXJlRGVmYXVsdEVuZGluZ1N0YXRlSWZOZWVkKA0KKwkJTGlzdE9mTWFjaGluZSAmIG5lZWREZWZhdWx0U3RhdGVGaW5hbCwNCisJCUxpc3RPZk1hY2hpbmUgJiBuZWVkRGVmYXVsdFN0YXRlVGVybWluYWwsDQorCQlMaXN0T2ZNYWNoaW5lICYgbmVlZERlZmF1bHRTdGF0ZVJldHVybikNCit7DQorCVNwZWNpZmllciBhTW9jU3BlY2lmaWVyOw0KKw0KKwlhTW9jU3BlY2lmaWVyLnNldFN0YXRlTW9jRklOQUwoKTsNCisJd2hpbGUoIG5lZWREZWZhdWx0U3RhdGVGaW5hbC5ub25lbXB0eSgpICkNCisJew0KKwkJbmVlZERlZmF1bHRTdGF0ZUZpbmFsLmJhY2soKS0+c2F2ZU93bmVkRWxlbWVudCggLy9zYXZlTWFjaGluZSgNCisJCQkJTWFjaGluZTo6bmV3U3RhdGUoDQorCQkJCQkJbmVlZERlZmF1bHRTdGF0ZUZpbmFsLmJhY2soKSwNCisJCQkJCQkiI2ZpbmFsIiwgYU1vY1NwZWNpZmllcikgKTsNCisNCisJCW5lZWREZWZhdWx0U3RhdGVGaW5hbC5wb3BfYmFjaygpOw0KKwl9DQorDQorCWFNb2NTcGVjaWZpZXIuc2V0UHNldWRvc3RhdGVNb2NURVJNSU5BTCgpOw0KKwl3aGlsZSggbmVlZERlZmF1bHRTdGF0ZVRlcm1pbmFsLm5vbmVtcHR5KCkgKQ0KKwl7DQorCQluZWVkRGVmYXVsdFN0YXRlVGVybWluYWwuYmFjaygpLT5zYXZlT3duZWRFbGVtZW50KCAvL3NhdmVNYWNoaW5lKA0KKwkJCQlNYWNoaW5lOjpuZXdTdGF0ZSgNCisJCQkJCQluZWVkRGVmYXVsdFN0YXRlVGVybWluYWwuYmFjaygpLA0KKwkJCQkJCSIjdGVybWluYWwiLCBhTW9jU3BlY2lmaWVyKSApOw0KKw0KKwkJbmVlZERlZmF1bHRTdGF0ZVRlcm1pbmFsLnBvcF9iYWNrKCk7DQorCX0NCisNCisJYU1vY1NwZWNpZmllci5zZXRQc2V1ZG9zdGF0ZU1vY1JFVFVSTigpOw0KKwl3aGlsZSggbmVlZERlZmF1bHRTdGF0ZVJldHVybi5ub25lbXB0eSgpICkNCisJew0KKwkJbmVlZERlZmF1bHRTdGF0ZVJldHVybi5iYWNrKCktPnNhdmVPd25lZEVsZW1lbnQoIC8vc2F2ZU1hY2hpbmUoDQorCQkJCU1hY2hpbmU6Om5ld1N0YXRlKA0KKwkJCQkJCW5lZWREZWZhdWx0U3RhdGVSZXR1cm4uYmFjaygpLA0KKwkJCQkJCSIjcmV0dXJuIiwgYU1vY1NwZWNpZmllcikgKTsNCisNCisJCW5lZWREZWZhdWx0U3RhdGVSZXR1cm4ucG9wX2JhY2soKTsNCisJfQ0KK30NCisNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIElOTElORSBYTElBIFBST0NFRFVSRSBDQUxMIElOIFRSQU5TSVRJT04NCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKw0KK3ZvaWQgUGFyc2VyVXRpbDo6Y2hlY2tQcm9jZWR1cmVDb21wb3NpdGVNb2NLaW5kKE1hY2hpbmUgKiBhUHJvY2VkdXJlKQ0KK3sNCisJaWYoIGFQcm9jZWR1cmUtPmdldFNwZWNpZmllcigpLmhhc01vZGVsT2ZDb21wdXRhdGlvbigpICkNCisJew0KKwkJcmV0dXJuOw0KKwl9DQorDQorCWJvb2wgaXNTdGF0ZVRyYW5zaXRpb25GbG93RmxhZyA9IGZhbHNlOw0KKw0KKwlDb21wb3NpdGVQYXJ0Ojpjb25zdF9wcm9jZWR1cmVfaXRlcmF0b3IgaXQgPQ0KKwkJCWFQcm9jZWR1cmUtPmdldENvbXBvc2l0ZVBhcnQoKS0+bWFjaGluZV9iZWdpbigpOw0KKwlDb21wb3NpdGVQYXJ0Ojpjb25zdF9wcm9jZWR1cmVfaXRlcmF0b3IgZW5kSXQgPQ0KKwkJCWFQcm9jZWR1cmUtPmdldENvbXBvc2l0ZVBhcnQoKS0+bWFjaGluZV9lbmQoKTsNCisJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApDQorCXsNCisJCWlmKCAoaXQpLT5nZXRTcGVjaWZpZXIoKS5pc1BzZXVkb3N0YXRlKCkgKQ0KKwkJew0KKwkJCWlmKCBub3QgaXNTdGF0ZVRyYW5zaXRpb25GbG93RmxhZyApDQorCQkJew0KKwkJCQlpc1N0YXRlVHJhbnNpdGlvbkZsb3dGbGFnID0gdHJ1ZTsNCisJCQl9DQorCQl9DQorCQllbHNlIGlmKCAoaXQpLT5nZXRTcGVjaWZpZXIoKS5pc1N0YXRlKCkNCisJCQkJfHwgKGl0KS0+Z2V0U3BlY2lmaWVyKCkuaXNDb21wb25lbnRTdGF0ZW1hY2hpbmUoKQ0KKwkJCQl8fCAoaXQpLT5nZXRTcGVjaWZpZXIoKS5pc01vY1N0YXRlVHJhbnNpdGlvblN5c3RlbSgpICkNCisJCXsNCisJCQlhUHJvY2VkdXJlLT5nZXR3U3BlY2lmaWVyKCkuc2V0TW9jU3RhdGVUcmFuc2l0aW9uU3lzdGVtKCk7DQorDQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJZWxzZSBpZiggKGl0KS0+Z2V0U3BlY2lmaWVyKCkuaXNEZXNpZ25JbnN0YW5jZVN0YXRpYygpDQorCQkJCSYmIChpdCktPmhhc0luc3RhbmNlU3BlY2lmaWVyKCkgKQ0KKwkJew0KKwkJCWNvbnN0IEJGICYgbW9kZWwgPSAoaXQpLT5nZXRJbnN0YW5jZVNwZWNpZmllcigpLT5nZXRNb2RlbCgpOw0KKw0KKwkJCWlmKCBtb2RlbC5pczwgTWFjaGluZSA+KCkNCisJCQkJJiYgbW9kZWwudG9fcHRyPCBNYWNoaW5lID4oKQ0KKwkJCQkJCS0+Z2V0U3BlY2lmaWVyKCkuaXNNb2NTdGF0ZVRyYW5zaXRpb25TeXN0ZW0oKSApDQorCQkJew0KKwkJCQlhUHJvY2VkdXJlLT5nZXR3U3BlY2lmaWVyKCkuc2V0TW9jU3RhdGVUcmFuc2l0aW9uU3lzdGVtKCk7DQorDQorCQkJCXJldHVybjsNCisJCQl9DQorCQl9DQorCX0NCisNCisJaWYoIGlzU3RhdGVUcmFuc2l0aW9uRmxvd0ZsYWcgKQ0KKwl7DQorCQlhUHJvY2VkdXJlLT5nZXR3U3BlY2lmaWVyKCkuc2V0TW9jU3RhdGVUcmFuc2l0aW9uRmxvdygpOw0KKwl9DQorDQorLy8JYVByb2NlZHVyZS0+Z2V0d1NwZWNpZmllcigpLnNldE1vY0NvbXBvc2l0ZVN0cnVjdHVyZSgpOw0KK30NCisNCisNCitzdGF0aWMgVHJhbnNpdGlvbiAqIGluc2VydFByb2NlZHVyZVN0YXRlbWFjaGluZUNhbGwoVHJhbnNpdGlvbiAqIHRyYW5zaXRpb24sDQorCQljb25zdCBzdGQ6OnN0cmluZyAmIHJlZklkLCBNYWNoaW5lICogaW5zdGFuY2VQcm9jZWR1cmUsDQorCQljb25zdCBCRkNvZGUgJiBwYXJhbUNvZGUsIGNvbnN0IEJGQ29kZSAmcmV0dXJuQ29kZSkNCit7DQorCU1hY2hpbmUgKiBwcm9jZWR1cmVTdGF0ZUNhbGwgPSBNYWNoaW5lOjpuZXdTdGF0ZW1hY2hpbmUoDQorCQkJdHJhbnNpdGlvbi0+Z2V0U291cmNlQ29udGFpbmVyKCksDQorCQkJKE9TUygpIDw8IHJlZklkIDw8ICcjJyA8PCBpbnN0YW5jZVByb2NlZHVyZS0+Z2V0TmFtZUlEKCkpLA0KKwkJCVNwZWNpZmllcjo6RVhFQ1VUQUJMRV9QUk9DRURVUkVfQ09NUE9TSVRFX1NQRUNJRklFUik7DQorLy8JCQlpbnN0YW5jZVByb2NlZHVyZS0+Z2V0VHlwZSgpKTsNCisNCisJdHJhbnNpdGlvbi0+Z2V0U291cmNlQ29udGFpbmVyKCktPnNhdmVPd25lZEVsZW1lbnQoDQorCQkJcHJvY2VkdXJlU3RhdGVDYWxsICk7DQorDQorCXByb2NlZHVyZVN0YXRlQ2FsbC0+Y29weUxvY2F0aW9uKCBpbnN0YW5jZVByb2NlZHVyZS0+Z2V0TG9jYXRpb24oKSApOw0KKw0KKwlwcm9jZWR1cmVTdGF0ZUNhbGwtPnNhdmVPd25lZEVsZW1lbnQoIC8vc2F2ZU1hY2hpbmUoDQorCQkJc2VwOjppbmNyUmVmZXJlbmNlQ291bnQoaW5zdGFuY2VQcm9jZWR1cmUpICk7DQorCWluc3RhbmNlUHJvY2VkdXJlLT51cGRhdGVDb250YWluZXIoIHRyYW5zaXRpb24tPmdldFNvdXJjZUNvbnRhaW5lcigpICk7DQorDQorCS8vIFBhcmFtZXRlcnMgaW5pdGlhbGl6YXRpb24NCisJaWYoIHBhcmFtQ29kZS52YWxpZCgpICYmIHBhcmFtQ29kZS0+bm9uZW1wdHkoKSApDQorCXsNCisJCXByb2NlZHVyZVN0YXRlQ2FsbC0+Z2V0VW5pcUJlaGF2aW9yUGFydCgpLT5zZXRPbkVuYWJsZSgNCisJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoIE9QKENPTlRFWFRfU1dJVENIRVIpLA0KKwkJCQkJCUlOQ1JfQkYoaW5zdGFuY2VQcm9jZWR1cmUpLCBwYXJhbUNvZGUtPnNpbmdsZXRvbigpID8NCisJCQkJCQkJCXBhcmFtQ29kZS0+Zmlyc3QoKS5iZkNvZGUoKSA6IHBhcmFtQ29kZSkgKTsNCisJfQ0KKw0KKwkvLyBSZXR1cm5zIGZpbmFsaXphdGlvbg0KKwlpZiggcmV0dXJuQ29kZS52YWxpZCgpICYmIHJldHVybkNvZGUtPm5vbmVtcHR5KCkgKQ0KKwl7DQorCQlwcm9jZWR1cmVTdGF0ZUNhbGwtPmdldFVuaXFCZWhhdmlvclBhcnQoKS0+c2V0T25GaW5hbCgNCisvLwkJcHJvY2VkdXJlU3RhdGVtYWNoaW5lLT5nZXRVbmlxQmVoYXZpb3JQYXJ0KCktPnNldE9uUmV0dXJuKA0KKwkJCQlTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSggT1AoQ09OVEVYVF9TV0lUQ0hFUiksDQorCQkJCQkJSU5DUl9CRihpbnN0YW5jZVByb2NlZHVyZSksIHJldHVybkNvZGUtPnNpbmdsZXRvbigpID8NCisJCQkJCQkJCXJldHVybkNvZGUtPmZpcnN0KCkuYmZDb2RlKCkgOiByZXR1cm5Db2RlICkgKTsNCisJfQ0KKw0KKwlUcmFuc2l0aW9uICogcmV0dXJuVHJhbnNpdGlvbiA9IG5ldyBUcmFuc2l0aW9uKHByb2NlZHVyZVN0YXRlQ2FsbCwNCisJCQkoT1NTKCkgPDwgcmVmSWQgPDwgJyMnIDw8IGluc3RhbmNlUHJvY2VkdXJlLT5nZXROYW1lSUQoKSA8PCAiI2VuZCIpLA0KKwkJCVRyYW5zaXRpb246Ok1PQ19GSU5BTF9LSU5EKTsNCisNCisJcmV0dXJuVHJhbnNpdGlvbi0+Y29weUxvY2F0aW9uKCBpbnN0YW5jZVByb2NlZHVyZS0+Z2V0TG9jYXRpb24oKSApOw0KKw0KKw0KKwlyZXR1cm5UcmFuc2l0aW9uLT5zZXRUYXJnZXQoIHRyYW5zaXRpb24tPmdldFRhcmdldCgpICk7DQorDQorCXRyYW5zaXRpb24tPnNldFRhcmdldCggSU5DUl9CRihwcm9jZWR1cmVTdGF0ZUNhbGwpICk7DQorLy8JdHJhbnNpdGlvbi0+ZnVsbHlVcGRhdGVBbGxOYW1lSUQoIE9TUyggKSA8PCB0cmFuc2l0aW9uLT5nZXROYW1lSUQoKQ0KKy8vCQkJPDwgJyMnIDw8IGluc3RhbmNlUHJvY2VkdXJlLT5nZXROYW1lSUQoKSApOw0KKw0KKwlwcm9jZWR1cmVTdGF0ZUNhbGwtPmdldFVuaXFCZWhhdmlvclBhcnQoKS0+DQorCQkJc2F2ZU91dGdvaW5nVHJhbnNpdGlvbiggcmV0dXJuVHJhbnNpdGlvbiApOw0KKw0KKwlyZXR1cm4oIHJldHVyblRyYW5zaXRpb24gKTsNCit9DQorDQorc3RhdGljIFRyYW5zaXRpb24gKiBpbnNlcnRQcm9jZWR1cmVNYWNoaW5lQ2FsbChUcmFuc2l0aW9uICogdHJhbnNpdGlvbiwNCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgcmVmSWQsIE1hY2hpbmUgKiBpbnN0YW5jZVByb2NlZHVyZSwNCisJCWNvbnN0IEJGQ29kZSAmIHBhcmFtQ29kZSwgY29uc3QgQkZDb2RlICZyZXR1cm5Db2RlKQ0KK3sNCisJdHJhbnNpdGlvbi0+Z2V0U291cmNlQ29udGFpbmVyKCktPnNhdmVPd25lZEVsZW1lbnQoIC8vc2F2ZU1hY2hpbmUoDQorCQkJc2VwOjppbmNyUmVmZXJlbmNlQ291bnQoaW5zdGFuY2VQcm9jZWR1cmUpICk7DQorCWluc3RhbmNlUHJvY2VkdXJlLT51cGRhdGVDb250YWluZXIoIHRyYW5zaXRpb24tPmdldFNvdXJjZUNvbnRhaW5lcigpICk7DQorDQorCWluc3RhbmNlUHJvY2VkdXJlLT5jb3B5TG9jYXRpb24oIGluc3RhbmNlUHJvY2VkdXJlLT5nZXRMb2NhdGlvbigpICk7DQorDQorCWlmKCBwYXJhbUNvZGUudmFsaWQoKSAmJiBwYXJhbUNvZGUtPm5vbmVtcHR5KCkgKQ0KKwl7DQorCQlpbnN0YW5jZVByb2NlZHVyZS0+Z2V0VW5pcUJlaGF2aW9yUGFydCgpLT5zZXFPblN0YXJ0KCAvL3NlcU9uQ3JlYXRlKA0KKwkJCXBhcmFtQ29kZS0+c2luZ2xldG9uKCkgPyBwYXJhbUNvZGUtPmZpcnN0KCkuYmZDb2RlKCkgOiBwYXJhbUNvZGUgKTsNCisJfQ0KKw0KKwlCRkNvZGUgY2FsbGluZ1Byb2NlZHVyZTsNCisNCisJaWYoIGluc3RhbmNlUHJvY2VkdXJlLT5oYXNQYXJhbVJldHVybigpICkNCisJew0KKwkJaW5zdGFuY2VQcm9jZWR1cmUtPnNldEF1dG9TdGFydCggZmFsc2UgKTsNCisNCisJCUJGQ29kZSBjYWxsaW5nU2VxdWVuZGUgPSBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSggT1AoU0VRVUVOQ0UpICk7DQorDQorCQljYWxsaW5nUHJvY2VkdXJlID0gU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoIE9QKENPTlRFWFRfU1dJVENIRVIpLA0KKwkJCQlJTkNSX0JGKGluc3RhbmNlUHJvY2VkdXJlKSwgY2FsbGluZ1NlcXVlbmRlICk7DQorDQorCQkvLyBQYXJhbWV0ZXJzIGluaXRpYWxpemF0aW9uDQorLy8JCWlmKCBwYXJhbUNvZGUudmFsaWQoKSAmJiBwYXJhbUNvZGUtPm5vbmVtcHR5KCkgKQ0KKy8vCQl7DQorLy8JCQljYWxsaW5nU2VxdWVuZGUtPmFwcGVuZCggcGFyYW1Db2RlLT5zaW5nbGV0b24oKSA/DQorLy8JCQkJCXBhcmFtQ29kZS0+Zmlyc3QoKS5iZkNvZGUoKSA6IHBhcmFtQ29kZSApOw0KKy8vCQl9DQorDQorCQkvLyBDYWxsaW5nIHByb2NlZHVyZQ0KKwkJaWYoIG5vdCBpbnN0YW5jZVByb2NlZHVyZS0+Z2V0TW9kZWxNYWNoaW5lKCktPg0KKwkJCQlnZXRTcGVjaWZpZXIoKS5pc0ZhbWlseUNvbXBvbmVudFN0YXRlbWFjaGluZSgpICkNCisJCXsNCisJCQlpbnN0YW5jZVByb2NlZHVyZS0+Z2V0VW5pcUJlaGF2aW9yUGFydCgpLT5zZXFPblN0YXJ0KCBPUChSVU4pICk7DQorCQl9DQorDQorCQljYWxsaW5nU2VxdWVuZGUtPmFwcGVuZCggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoDQorCQkJCU9QKFNUQVJUKSwgSU5DUl9CRihpbnN0YW5jZVByb2NlZHVyZSkgKSApOw0KKw0KKwkJLy8gUmV0dXJucyBmaW5hbGl6YXRpb24NCisJCWlmKCByZXR1cm5Db2RlLnZhbGlkKCkgJiYgcmV0dXJuQ29kZS0+bm9uZW1wdHkoKSApDQorCQl7DQorCQkJY2FsbGluZ1NlcXVlbmRlLT5hcHBlbmQoIHJldHVybkNvZGUtPnNpbmdsZXRvbigpID8NCisJCQkJCXJldHVybkNvZGUtPmZpcnN0KCkuYmZDb2RlKCkgOiByZXR1cm5Db2RlICk7DQorCQl9DQorCX0NCisJZWxzZQ0KKwl7DQorCQljYWxsaW5nUHJvY2VkdXJlID0gU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoDQorCQkJCU9QKFJVTiksIElOQ1JfQkYoaW5zdGFuY2VQcm9jZWR1cmUpICk7DQorCX0NCisNCisJdHJhbnNpdGlvbi0+c2V0U3RhdGVtZW50KCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6eG5ld0NvZGVGbGF0KA0KKwkJCU9QKFNFUVVFTkNFKSwgdHJhbnNpdGlvbi0+Z2V0U3RhdGVtZW50KCksIGNhbGxpbmdQcm9jZWR1cmUpICk7DQorDQorCXJldHVybiggdHJhbnNpdGlvbiApOw0KK30NCisNCisNCisNCitzdGF0aWMgYm9vbCBpc09uZVN0ZXBSdW5uaW5nTWFjaGluZShjb25zdCBNYWNoaW5lICogYU1hY2hpbmUpDQorew0KKwlpZiggbm90IGFNYWNoaW5lLT5nZXRTcGVjaWZpZXIoKS5pc01vY1N0YXRlVHJhbnNpdGlvbkZsb3coKSApDQorCXsNCisJCUNvbXBvc2l0ZVBhcnQ6OmNvbnN0X21hY2hpbmVfaXRlcmF0b3IgaXRNYWNoaW5lID0NCisJCQkJYU1hY2hpbmUtPmdldENvbXBvc2l0ZVBhcnQoKS0+bWFjaGluZV9iZWdpbigpOw0KKwkJQ29tcG9zaXRlUGFydDo6Y29uc3RfbWFjaGluZV9pdGVyYXRvciBlbmRNYWNoaW5lID0NCisJCQkJYU1hY2hpbmUtPmdldENvbXBvc2l0ZVBhcnQoKS0+bWFjaGluZV9lbmQoKTsNCisJCWZvciggOyBpdE1hY2hpbmUgIT0gZW5kTWFjaGluZSA7ICsraXRNYWNoaW5lICkNCisJCXsNCisJCQlpZiggKGl0TWFjaGluZSktPmdldFNwZWNpZmllcigpLmlzRGVzaWduSW5zdGFuY2VTdGF0aWMoKSApDQorCQkJew0KKwkJCQlpZiggKGl0TWFjaGluZSktPmhhc01vZGVsTWFjaGluZSgpICYmDQorCQkJCQkobm90IGlzT25lU3RlcFJ1bm5pbmdNYWNoaW5lKA0KKwkJCQkJCQkoaXRNYWNoaW5lKS0+Z2V0TW9kZWxNYWNoaW5lKCkgKSkgKQ0KKwkJCQl7DQorCQkJCQlyZXR1cm4oIGZhbHNlICk7DQorCQkJCX0NCisJCQl9DQorCQkJZWxzZSBpZiggKGl0TWFjaGluZSktPmdldFNwZWNpZmllcigpLmlzQ29tcG9uZW50RXhlY3V0YWJsZSgpICkNCisJCQl7DQorCQkJCWlmKCAoaXRNYWNoaW5lKS0+aGFzTWFjaGluZSgpICYmDQorCQkJCQkobm90IGlzT25lU3RlcFJ1bm5pbmdNYWNoaW5lKCAoaXRNYWNoaW5lKSApKSApDQorCQkJCXsNCisJCQkJCXJldHVybiggZmFsc2UgKTsNCisJCQkJfQ0KKwkJCX0NCisJCQllbHNlIGlmKCBub3QgKGl0TWFjaGluZSktPmdldFNwZWNpZmllcigpLmlzUHNldWRvc3RhdGUoKSApDQorCQkJew0KKwkJCQlyZXR1cm4oIGZhbHNlICk7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCXJldHVybiggdHJ1ZSApOw0KK30NCisNCisNCitzdGF0aWMgVHJhbnNpdGlvbiAqIGluc2VydFByb2NlZHVyZUNhbGwoVHJhbnNpdGlvbiAqIHRyYW5zaXRpb24sDQorCQljb25zdCBzdGQ6OnN0cmluZyAmIHJlZklkLCBNYWNoaW5lICogaW5zdGFuY2VQcm9jZWR1cmUpDQorew0KKwlpbnN0YW5jZVByb2NlZHVyZS0+ZnVsbHlVcGRhdGVBbGxOYW1lSUQoIE9TUyggKSA8PCByZWZJZA0KKwkJCTw8ICcjJyA8PCBpbnN0YW5jZVByb2NlZHVyZS0+Z2V0TmFtZUlEKCkgKTsNCisNCisJY29uc3QgTWFjaGluZSAqIG1vZGVsUHJvY2VkdXJlID0gaW5zdGFuY2VQcm9jZWR1cmUtPmdldE1vZGVsTWFjaGluZSgpOw0KKw0KKwlCRkNvZGUgcGFyYW1Db2RlKCBPUChBVE9NSUNfU0VRVUVOQ0UpICk7DQorCUJGQ29kZSByZXR1cm5Db2RlKCBPUChBVE9NSUNfU0VRVUVOQ0UpICk7DQorDQorCWlmKCBpbnN0YW5jZVByb2NlZHVyZS0+aGFzUGFyYW1SZXR1cm4oKSAmJg0KKwkJaW5zdGFuY2VQcm9jZWR1cmUtPmhhc01vZGVsTWFjaGluZSgpICkNCisJew0KKwkJLy8gUGFyYW1ldGVycyBpbml0aWFsaXphdGlvbg0KKwkJVGFibGVPZlZhcmlhYmxlOjpjb25zdF9yYXdfaXRlcmF0b3IgaXRQYXJhbSA9DQorCQkJCWluc3RhbmNlUHJvY2VkdXJlLT5nZXRWYXJpYWJsZVBhcmFtZXRlcnMoKS5iZWdpbigpOw0KKwkJVGFibGVPZlZhcmlhYmxlOjpjb25zdF9yYXdfaXRlcmF0b3IgZW5kSXQgPQ0KKwkJCQlpbnN0YW5jZVByb2NlZHVyZS0+Z2V0VmFyaWFibGVQYXJhbWV0ZXJzKCkuZW5kKCk7DQorCQlmb3IoIGF2bV9zaXplX3Qgb2Zmc2V0ID0gMCA7IGl0UGFyYW0gIT0gZW5kSXQgOyArK2l0UGFyYW0gLCArK29mZnNldCApDQorCQl7DQorCQkJaWYoIChpdFBhcmFtKS0+aGFzVmFsdWUoKSApDQorCQkJew0KKwkJCQlwYXJhbUNvZGUtPmFwcGVuZCggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoDQorCQkJCQkoaXRQYXJhbSktPmdldE1vZGlmaWVyKCkuaGFzTmF0dXJlUmVmZXJlbmNlKCkNCisJCQkJCQkJPyBPUChBU1NJR05fUkVGKSA6IE9QKEFTU0lHTiksDQorCQkJCQltb2RlbFByb2NlZHVyZS0+Z2V0VmFyaWFibGVQYXJhbWV0ZXIob2Zmc2V0KSwNCisJCQkJCShpdFBhcmFtKS0+Z2V0VmFsdWUoKSApICk7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJLy8gUmV0dXJucyBmaW5hbGl6YXRpb24NCisJCWl0UGFyYW0gPSBpbnN0YW5jZVByb2NlZHVyZS0+Z2V0VmFyaWFibGVSZXR1cm5zKCkuYmVnaW4oKTsNCisJCWVuZEl0ID0gaW5zdGFuY2VQcm9jZWR1cmUtPmdldFZhcmlhYmxlUmV0dXJucygpLmVuZCgpOw0KKwkJZm9yKCBhdm1fc2l6ZV90IG9mZnNldCA9IDAgOyBpdFBhcmFtICE9IGVuZEl0IDsgKytpdFBhcmFtICwgKytvZmZzZXQgKQ0KKwkJew0KKwkJCWlmKCAoaXRQYXJhbSktPmhhc1ZhbHVlKCkgKQ0KKwkJCXsNCisvLwkJCQlwYXJhbUNvZGUtPmFwcGVuZCggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoIE9QKEFTU0lHTl9SRUYpLA0KKy8vCQkJCQkJbW9kZWxQcm9jZWR1cmUtPmdldFZhcmlhYmxlUmV0dXJuKG9mZnNldCksDQorLy8JCQkJCQkoaXRQYXJhbSktPmdldFZhbHVlKCkgKSApOw0KKw0KKwkJCQlyZXR1cm5Db2RlLT5hcHBlbmQoIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKE9QKEFTU0lHTiksDQorCQkJCQkJKGl0UGFyYW0pLT5nZXRWYWx1ZSgpLA0KKwkJCQkJCW1vZGVsUHJvY2VkdXJlLT5nZXRWYXJpYWJsZVJldHVybihvZmZzZXQpICkgKTsNCisJCQl9DQorCQl9DQorCX0NCisNCisJVHJhbnNpdGlvbiAqIHJldHVyblRyYW5zaXRpb24gPSBOVUxMOw0KKw0KKwlpZiggaXNPbmVTdGVwUnVubmluZ01hY2hpbmUoIG1vZGVsUHJvY2VkdXJlICkgKQ0KKwl7DQorCQlyZXR1cm5UcmFuc2l0aW9uID0gaW5zZXJ0UHJvY2VkdXJlTWFjaGluZUNhbGwodHJhbnNpdGlvbiwNCisJCQkJcmVmSWQsIGluc3RhbmNlUHJvY2VkdXJlLCBwYXJhbUNvZGUsIHJldHVybkNvZGUpOw0KKwl9DQorCWVsc2UNCisJew0KKwkJcmV0dXJuVHJhbnNpdGlvbiA9IGluc2VydFByb2NlZHVyZVN0YXRlbWFjaGluZUNhbGwodHJhbnNpdGlvbiwNCisJCQkJcmVmSWQsIGluc3RhbmNlUHJvY2VkdXJlLCBwYXJhbUNvZGUsIHJldHVybkNvZGUpOw0KKwl9DQorDQorCXJldHVybiggcmV0dXJuVHJhbnNpdGlvbiApOw0KK30NCisNCit2b2lkIFBhcnNlclV0aWw6OmlubGluZVRyYW5zaXRpb25Qcm9jZWR1cmVDYWxsKA0KKwkJVHJhbnNpdGlvbiAqIHRyYW5zaXRpb24sIGNvbnN0IHN0ZDo6c3RyaW5nICYgcmVmSWQpDQorew0KKwlNYWNoaW5lICogc291cmNlU3RhdGUgPSB0cmFuc2l0aW9uLT5nZXRTb3VyY2UoKTsNCisNCisJQkZDb2RlIHN0YXRlbWVudCA9IHRyYW5zaXRpb24tPmdldFN0YXRlbWVudCgpOw0KKw0KKwl0cmFuc2l0aW9uLT5zZXRTdGF0ZW1lbnQoIEJGQ29kZTo6UkVGX05VTEwgKTsNCisNCisJaWYoIHN0YXRlbWVudC0+aXNPcENvZGUoQVZNX09QQ09ERV9JTlZPS0VfTUVUSE9EKSAmJg0KKwkJCXN0YXRlbWVudC0+Zmlyc3QoKS5pczwgTWFjaGluZSA+KCkgKQ0KKwl7DQorCQl0cmFuc2l0aW9uID0gaW5zZXJ0UHJvY2VkdXJlQ2FsbCh0cmFuc2l0aW9uLA0KKwkJCQlyZWZJZCwgc3RhdGVtZW50LT5maXJzdCgpLnRvX3B0cjwgTWFjaGluZSA+KCkgKTsNCisNCisJCWlmKCBub3QgdHJhbnNpdGlvbi0+aGFzVGFyZ2V0KCkgKQ0KKwkJew0KKwkJCXRyYW5zaXRpb24tPnNldFN0YXRlbWVudCggU3RhdGVtZW50Q29uc3RydWN0b3I6OnhuZXdDb2RlRmxhdCgNCisJCQkJCU9QKFNFUVVFTkNFKSwgdHJhbnNpdGlvbi0+Z2V0U3RhdGVtZW50KCksDQorCQkJCQlTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSggT1AoRElTQUJMRV9TRUxGKSksDQorCQkJCQlTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSggT1AoRU5BQkxFX1NFVCksDQorCQkJCQkJCUlOQ1JfQkYoc291cmNlU3RhdGUpICkgKSApOw0KKw0KKwkJCXRyYW5zaXRpb24tPnNldFN0YXRlbWVudCggU3RhdGVtZW50Q29uc3RydWN0b3I6OnhuZXdDb2RlRmxhdCgNCisJCQkJCU9QKFNFUVVFTkNFKSwgdHJhbnNpdGlvbi0+Z2V0U3RhdGVtZW50KCksDQorCQkJCQlTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgNCisJCQkJCQkJT1AoRU5BQkxFX1NFVCksIElOQ1JfQkYoc291cmNlU3RhdGUpICkgKSk7DQorCQl9DQorCX0NCisNCisJZWxzZSBpZiggT3BlcmF0b3JNYW5hZ2VyOjppc1NlcXVlbmNlKHN0YXRlbWVudC0+Z2V0T3BlcmF0b3IoKSkpDQorCXsNCisJCUJGQ29kZSBvdGhlclN0YXRlbWVudCggc3RhdGVtZW50LT5nZXRPcGVyYXRvcigpICk7DQorDQorCQlBdm1Db2RlOjppdGVyYXRvciBpdEFyZyA9IHN0YXRlbWVudC0+YmVnaW4oKTsNCisJCUF2bUNvZGU6Oml0ZXJhdG9yIGVuZEFyZyA9IHN0YXRlbWVudC0+ZW5kKCk7DQorCQlmb3IoIDsgaXRBcmcgIT0gZW5kQXJnIDsgKytpdEFyZyApDQorCQl7DQorCQkJaWYoICgqaXRBcmcpLmlzPCBBdm1Db2RlID4oKSApDQorCQkJew0KKwkJCQlBdm1Db2RlICogY2FsbFN0YXRlbWVudCA9ICgqaXRBcmcpLnRvX3B0cjwgQXZtQ29kZSA+KCk7DQorDQorCQkJCWlmKCBjYWxsU3RhdGVtZW50LT5pc09wQ29kZShBVk1fT1BDT0RFX0lOVk9LRV9NRVRIT0QpICYmDQorCQkJCQkJY2FsbFN0YXRlbWVudC0+Zmlyc3QoKS5pczwgTWFjaGluZSA+KCkgKQ0KKwkJCQl7DQorCQkJCQlpZiggb3RoZXJTdGF0ZW1lbnQtPm5vbmVtcHR5KCkgKQ0KKwkJCQkJew0KKwkJCQkJCXRyYW5zaXRpb24tPnNldFN0YXRlbWVudCgNCisJCQkJCQkJU3RhdGVtZW50Q29uc3RydWN0b3I6OnhuZXdDb2RlRmxhdChPUChTRVFVRU5DRSksDQorCQkJCQkJCQl0cmFuc2l0aW9uLT5nZXRTdGF0ZW1lbnQoKSwgb3RoZXJTdGF0ZW1lbnQpICk7DQorDQorCQkJCQkJb3RoZXJTdGF0ZW1lbnQgPSBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgNCisJCQkJCQkJCXN0YXRlbWVudC0+Z2V0T3BlcmF0b3IoKSApOw0KKwkJCQkJfQ0KKw0KKwkJCQkJdHJhbnNpdGlvbiA9IGluc2VydFByb2NlZHVyZUNhbGwodHJhbnNpdGlvbiwNCisJCQkJCQkJcmVmSWQsIGNhbGxTdGF0ZW1lbnQtPmZpcnN0KCkudG9fcHRyPCBNYWNoaW5lID4oKSApOw0KKw0KKwkJCQkJY29udGludWU7DQorCQkJCX0NCisJCQl9DQorDQorCQkJb3RoZXJTdGF0ZW1lbnQtPmFwcGVuZCggKml0QXJnICk7DQorCQl9DQorDQorCQlpZiggb3RoZXJTdGF0ZW1lbnQtPm5vbmVtcHR5KCkgKQ0KKwkJew0KKwkJCXRyYW5zaXRpb24tPnNldFN0YXRlbWVudCggU3RhdGVtZW50Q29uc3RydWN0b3I6OnhuZXdDb2RlRmxhdCgNCisJCQkJCU9QKFNFUVVFTkNFKSwgdHJhbnNpdGlvbi0+Z2V0U3RhdGVtZW50KCksIG90aGVyU3RhdGVtZW50ICkpOw0KKwkJfQ0KKwkJaWYoIG5vdCB0cmFuc2l0aW9uLT5oYXNUYXJnZXQoKSApDQorCQl7DQorCQkJdHJhbnNpdGlvbi0+c2V0U3RhdGVtZW50KCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6eG5ld0NvZGVGbGF0KA0KKwkJCQkJT1AoU0VRVUVOQ0UpLCB0cmFuc2l0aW9uLT5nZXRTdGF0ZW1lbnQoKSwNCisJCQkJCVN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKCBPUChESVNBQkxFX1NFTEYpKSwNCisJCQkJCVN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKA0KKwkJCQkJCQlPUChFTkFCTEVfU0VUKSwgSU5DUl9CRihzb3VyY2VTdGF0ZSkgKSApICk7DQorCQl9DQorCX0NCit9DQorDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBST1VUSU5FIElOVk9LQVRJT04NCitCRkNvZGUgUGFyc2VyVXRpbDo6aW52b2tlUm91dGluZShSb3V0aW5lICogYVJvdXRpbmVJbnN0YW5jZSkNCit7DQorCWlmKCBhUm91dGluZUluc3RhbmNlLT5oYXNQYXJhbWV0ZXJzKCkgKQ0KKwl7DQorCQlCRiBiZk9QOw0KKwkJaWYoIGFSb3V0aW5lSW5zdGFuY2UtPmhhc01vZGVsT3BlcmF0b3IoKSApDQorCQl7DQorCQkJYmZPUCA9IGFSb3V0aW5lSW5zdGFuY2UtPmdldFR5cGUoKTsNCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQlPcGVyYXRvciAqIG9wID0gQXZtT3BlcmF0aW9uRmFjdG9yeTo6Z2V0KA0KKwkJCQkJYVJvdXRpbmVJbnN0YW5jZS0+Z2V0UGFyYW1ldGVyKDApLA0KKwkJCQkJYVJvdXRpbmVJbnN0YW5jZS0+Z2V0VHlwZSgpLnN0cigpICk7DQorCQkJaWYoIG9wICE9IE5VTEwgKQ0KKwkJCXsNCisJCQkJYmZPUCA9IElOQ1JfQkYob3ApOw0KKwkJCX0NCisJCX0NCisNCisJCWlmKCBiZk9QLnZhbGlkKCkgKQ0KKwkJew0KKwkJCUJGVmVjdG9yOjpjb25zdF9pdGVyYXRvciBpdCA9IGFSb3V0aW5lSW5zdGFuY2UtPmdldFBhcmFtZXRlcnMoKS5iZWdpbigpOw0KKwkJCUJGVmVjdG9yOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IGFSb3V0aW5lSW5zdGFuY2UtPmdldFBhcmFtZXRlcnMoKS5lbmQoKTsNCisNCisJCQlCRkNvZGUgaW52b2tlQ29kZSggT1AoSU5WT0tFX01FVEhPRCksICgqaXQpLCBiZk9QICk7DQorDQorCQkJZm9yKCArK2l0IDsgaXQgIT0gZW5kSXQgOyArK2l0ICkNCisJCQl7DQorCQkJCWludm9rZUNvZGUtPmFwcGVuZCgqaXQgKTsNCisJCQl9DQorDQorCQkJcmV0dXJuKCBpbnZva2VDb2RlICk7DQorCQl9DQorCX0NCisNCisJcmV0dXJuKCBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZSgNCisJCQlPUChJTlZPS0VfUk9VVElORSksIHNlcDo6QkYoYVJvdXRpbmVJbnN0YW5jZSkgKSApOw0KK30NCisNCisNCitCRkNvZGUgUGFyc2VyVXRpbDo6aW52b2tlUm91dGluZVN0YXRlbWVudChSb3V0aW5lICogYVJvdXRpbmVJbnN0YW5jZSkNCit7DQorCWlmKCBhUm91dGluZUluc3RhbmNlLT5oYXNNb2RlbCgpICkNCisJew0KKy8vCQlBVk1fT1NfQ09VVCA8PCBzdHJfaGVhZGVyKGFSb3V0aW5lSW5zdGFuY2UpIDw8IHN0ZDo6ZW5kbDsNCisvLwkJQVZNX09TX0NPVVQgPDwgc3RyX2hlYWRlcihhUm91dGluZUluc3RhbmNlLT5nZXRNb2RlbCgpKSA8PCBzdGQ6OmVuZGw7DQorCQlpZiggYVJvdXRpbmVJbnN0YW5jZS0+aXNJbmxpbmFibGVTdGF0ZW1lbnQoKSApDQorCQl7DQorCQkJQkZDb2RlIHN1YnN0Q29kZSA9IGFSb3V0aW5lSW5zdGFuY2UtPmlubGluZVN0YXRlbWVudCgpOw0KKwkJCWlmKCBzdWJzdENvZGUudmFsaWQoKSApDQorCQkJew0KKwkJCQlyZXR1cm4oIHN1YnN0Q29kZSApOw0KKwkJCX0NCisJCX0NCisNCisJCXJldHVybiggU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUoDQorCQkJCU9QKElOVk9LRV9ST1VUSU5FKSwgc2VwOjpCRihhUm91dGluZUluc3RhbmNlKSApICk7DQorCX0NCisNCisJcmV0dXJuKCBpbnZva2VSb3V0aW5lKGFSb3V0aW5lSW5zdGFuY2UpICk7DQorfQ0KKw0KKw0KK0JGIFBhcnNlclV0aWw6Omludm9rZVJvdXRpbmVFeHByZXNzaW9uKFJvdXRpbmUgKiBhUm91dGluZUluc3RhbmNlKQ0KK3sNCisJaWYoIGFSb3V0aW5lSW5zdGFuY2UtPmhhc01vZGVsKCkgKQ0KKwl7DQorCQlpZiggYVJvdXRpbmVJbnN0YW5jZS0+aXNJbmxpbmFibGVFeHByZXNzaW9uKCkgKQ0KKwkJew0KKwkJCUJGIHN1YnN0Q29kZSA9IGFSb3V0aW5lSW5zdGFuY2UtPmlubGluZUV4cHJlc3Npb24oKTsNCisJCQlpZiggc3Vic3RDb2RlLnZhbGlkKCkgKQ0KKwkJCXsNCisJCQkJcmV0dXJuKCBzdWJzdENvZGUgKTsNCisJCQl9DQorCQl9DQorDQorCQlyZXR1cm4oIFN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKA0KKwkJCQlPUChJTlZPS0VfUk9VVElORSksIHNlcDo6QkYoYVJvdXRpbmVJbnN0YW5jZSkgKSApOw0KKwl9DQorDQorCXJldHVybiggaW52b2tlUm91dGluZShhUm91dGluZUluc3RhbmNlKSApOw0KK30NCisNCisNCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvUGFyc2VyVXRpbC5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL1BhcnNlclV0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjI3ZmRhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL1BhcnNlclV0aWwuaApAQCAtMCwwICsxLDM3MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDkganVpbC4gMjAxNAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFBBUlNFUl9VVElMX0hfCisjZGVmaW5lIFBBUlNFUl9VVElMX0hfCisKKyNpbmNsdWRlIDx1dGlsL2F2bV9zdHJpbmcuaD4KKyNpbmNsdWRlIDxjb21tb24vQkYuaD4KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vQkZDb250YWluZXIuaD4KKyNpbmNsdWRlIDxjb2xsZWN0aW9uL1R5cGVkZWYuaD4KKworI2luY2x1ZGUgPGZtbC9jb21tb24vTW9kaWZpZXJFbGVtZW50Lmg+CisKKyNpbmNsdWRlIDxmbWwvbGliL0lDb21Qb2ludC5oPgorCisjaW5jbHVkZTxzdGFjaz4KKworCituYW1lc3BhY2Ugc2VwCit7CisKK2NsYXNzIEJGQ29kZTsKKworY2xhc3MgT2JqZWN0RWxlbWVudDsKK2NsYXNzIFRyYWNlYWJsZUVsZW1lbnQ7CisKK2NsYXNzIEluc3RhbmNlT2ZNYWNoaW5lOworCitjbGFzcyBNYWNoaW5lOworY2xhc3MgUG9ydDsKK2NsYXNzIFJvdXRpbmU7CitjbGFzcyBTeXN0ZW07CitjbGFzcyBUcmFuc2l0aW9uOworCisKK2NsYXNzIFBhcnNlclV0aWwKK3sKKworcHVibGljOgorCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIEN1cnJlbnQgUGFyc2UgQ29udGV4dCA6CisJLy8gU3lzdGVtIC0+IE1hY2hpbmUgLT4gUm91dGluZQorCXN0cnVjdCBBdm1QYXJzZUNvbnRleHQKKwl7CisJCVN5c3RlbSAqIHN5c3RlbSA9IE5VTEw7CisKKwkJTWFjaGluZSAqIG1hY2hpbmUgPSBOVUxMOworCisJCU1hY2hpbmUgKiBkeW5hbWljID0gTlVMTDsKKworCQlSb3V0aW5lICogcm91dGluZSA9IE5VTEw7CisJfTsKKworCXN0YXRpYyBBdm1QYXJzZUNvbnRleHQgX0NUWF87CisKKwlzdGF0aWMgc3RkOjpzdGFjazwgQXZtUGFyc2VDb250ZXh0ID4gX0NUWF9TVEFDS187CisKKwlpbmxpbmUgc3RhdGljIHZvaWQgcHVzaENUWChNYWNoaW5lICogbWFjaGluZSkKKwl7CisJCV9DVFhfLm1hY2hpbmUgPSBtYWNoaW5lOworCisJCV9DVFhfU1RBQ0tfLnB1c2goIF9DVFhfICk7CisJfQorCisJaW5saW5lIHN0YXRpYyB2b2lkIHB1c2hEeW5hbWljQ1RYKE1hY2hpbmUgKiBkeW5hbWljKQorCXsKKwkJX0NUWF8uZHluYW1pYyA9IGR5bmFtaWM7CisKKwkJX0NUWF9TVEFDS18ucHVzaCggX0NUWF8gKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIHZvaWQgcHVzaENUWChSb3V0aW5lICogcm91dGluZSkKKwl7CisJCV9DVFhfLnJvdXRpbmUgPSByb3V0aW5lOworCisJCV9DVFhfU1RBQ0tfLnB1c2goIF9DVFhfICk7CisJfQorCisJaW5saW5lIHN0YXRpYyB2b2lkIHBvcENUWChNYWNoaW5lICogJiBtYWNoaW5lLCBSb3V0aW5lICogJiByb3V0aW5lKQorCXsKKwkJaWYoIG5vdCBfQ1RYX1NUQUNLXy5lbXB0eSgpICkKKwkJeworCQkJX0NUWF9TVEFDS18ucG9wKCk7CisKKwkJCWlmKCBub3QgX0NUWF9TVEFDS18uZW1wdHkoKSApCisJCQl7CisJCQkJX0NUWF8gPSBfQ1RYX1NUQUNLXy50b3AoKTsKKworCQkJCW1hY2hpbmUgPSBfQ1RYXy5tYWNoaW5lOworCQkJCXJvdXRpbmUgPSBfQ1RYXy5yb3V0aW5lOworCQkJfQorCQl9CisJfQorCisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBYTElBX1NZTlRBWF9FUlJPUl9DT1VOVAorCXN0YXRpYyBhdm1fc2l6ZV90IFhMSUFfU1lOVEFYX0VSUk9SX0NPVU5UOworCisJLyoqCisJICogT3V0U3RyZWFtIE1hbmlwdWxhdG9yCisJICogU1lOVEFYX0VSUk9SX0VPTAorCSAqLworCWlubGluZSBzdGF0aWMgdm9pZCBTWU5UQVhfRVJST1JfRU9MKE91dFN0cmVhbSAmIG9zKQorCXsKKwkJb3MgPDwgIiAhISEiIDw8IHN0ZDo6ZW5kbDsKKwl9CisKKworCWlubGluZSBzdGF0aWMgV2Fybk91dHN0cmVhbVQgJiBhdm1fc3ludGF4X2Vycm9yKAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBydWxlLCBhdm1fc2l6ZV90IGxpbmUpCisJeworCQkrK1hMSUFfU1lOVEFYX0VSUk9SX0NPVU5UOworCisJCUFWTV9PU19XQVJOIDw8ICJFcnJvcltsaW5lOiIgPDwgbGluZQorCQkJCTw8ICJdIGluIHJ1bGUgJyIgPDwgcnVsZSA8PCAiJyA6PiAiOworCisJCXJldHVybiggQVZNX09TX1dBUk4gKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIFdhcm5PdXRzdHJlYW1UICYgYXZtX3N5bnRheF9lcnJvcihjb25zdCBzdGQ6OnN0cmluZyAmIHJ1bGUpCisJeworCQkrK1hMSUFfU1lOVEFYX0VSUk9SX0NPVU5UOworCisJCUFWTV9PU19XQVJOIDw8ICJFcnJvciBpbiBydWxlICciIDw8IHJ1bGUgPDwgIicgOj4gIjsKKworCQlyZXR1cm4oIEFWTV9PU19XQVJOICk7CisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gU0VUIExPQ0FUSU9OIElOIFRSQUNFQUJMRSBGT1JNCisJc3RhdGljIHZvaWQgc2V0TG9jYXRpb24oVHJhY2VhYmxlRWxlbWVudCAqIGFNb2RlbGluZ0VsZW1lbnQsCisJCQlhdm1fc2l6ZV90IGJMaW5lLCBhdm1fc2l6ZV90IGVMaW5lKTsKKworCXN0YXRpYyB2b2lkIHNldExvY2F0aW9uKFRyYWNlYWJsZUVsZW1lbnQgJiBhTW9kZWxpbmdFbGVtZW50LAorCQkJYXZtX3NpemVfdCBiTGluZSwgYXZtX3NpemVfdCBlTGluZSk7CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gUFJPTE9HVUUgT1BUSU9OCisJc3RhdGljIHZvaWQgc2V0UHJvbG9ndWVPcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcgJiBpZCwgQkYgdmFsdWUpOworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIEdFVCBPQkpFQ1QgQlkgW1F1YWxpZmllZF0gTmFtZSBJRAorCXN0YXRpYyBjb25zdCBCRiAmIGdldE9iamVjdEJ5TmFtZUlEKGNvbnN0IHN0ZDo6c3RyaW5nICYgaWQpOworCisJc3RhdGljIGNvbnN0IEJGICYgZ2V0T2JqZWN0QnlRdWFsaWZpZWROYW1lSUQoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIHFuaWQsIGF2bV9zaXplX3QgY291bnQpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gR0VUIFZBUklBQkxFIEJZIFsgWyBGdWxseSBdIFF1YWxpZmllZCBdIE5hbWUgSUQKKwlzdGF0aWMgY29uc3QgQkYgJiBnZXR2YXIoY29uc3Qgc3RkOjpzdHJpbmcgJiBxbmlkLCBhdm1fc2l6ZV90IGNvdW50KTsKKworCXN0YXRpYyBCRiBnZXRWYXJpYWJsZShjb25zdCBzdGQ6OnN0cmluZyAmIHFuaWQsIGF2bV9zaXplX3QgY291bnQpOworCisJc3RhdGljIEJGIGdldERhdGFUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nICYgcW5pZCwgYXZtX3NpemVfdCBjb3VudCk7CisKKwlzdGF0aWMgQkYgZ2V0RGF0YVR5cGVRdWV1ZShjb25zdCBzdGQ6OnN0cmluZyAmIHFuaWQsIGF2bV9zaXplX3QgY291bnQpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gR0VUIENPTlNUQU5UIEJZIFsgWyBGdWxseSBdIFF1YWxpZmllZCBdIE5hbWUgSUQKKwlzdGF0aWMgY29uc3QgQkYgJiBnZXRDb25zdGFudCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgcW5pZCwgYXZtX3NpemVfdCBjb3VudCk7CisKKwlzdGF0aWMgYXZtX3NpemVfdCBnZXRJbnRlZ2VyQ29uc3RhbnQoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIHFuaWQsIGF2bV9zaXplX3QgY291bnQpOworCisJc3RhdGljIGF2bV9mbG9hdF90IGdldEZsb2F0Q29uc3RhbnQoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIHFuaWQsIGF2bV9zaXplX3QgY291bnQpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gR0VUIEJVRkZFUiBCWSBbIFsgRnVsbHkgXSBRdWFsaWZpZWQgXSBOYW1lIElECisJc3RhdGljIEJGIGdldEJ1ZmZlcihNYWNoaW5lICogbWFjaGluZSwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgcW5pZCwgYXZtX3NpemVfdCBjb3VudCk7CisKKwlzdGF0aWMgQkYgZ2V0dmFyQnVmZmVyKGNvbnN0IHN0ZDo6c3RyaW5nICYgcW5pZCwgYXZtX3NpemVfdCBjb3VudCk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBHRVQgQ0hBTk5FTCBCWSBbIFsgRnVsbHkgXSBRdWFsaWZpZWQgXSBOYW1lIElECisJc3RhdGljIEJGIGdldENoYW5uZWwoY29uc3Qgc3RkOjpzdHJpbmcgJiBxbmlkLCBhdm1fc2l6ZV90IGNvdW50KTsKKworCXN0YXRpYyBCRiBnZXREYXRhVHlwZUNoYW5uZWwoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIHFuaWQsIGF2bV9zaXplX3QgY291bnQpOworCisJc3RhdGljIHZvaWQgdXBkYXRlU2lnbmFsUm91dGluZ0NoYW5uZWwoTW9kaWZpZXI6OkRJUkVDVElPTl9LSU5EIGlvRGlyZWN0aW9uLAorCQkJY29uc3QgQkZDb2RlICYgaW9Db2RlLCBjb25zdCBzdGQ6OnN0cmluZyAmIHFuaWQsIGF2bV9zaXplX3QgY291bnQpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gR0VUIFBPUlQgQlkgWyBbIEZ1bGx5IF0gUXVhbGlmaWVkIF0gTmFtZSBJRAorCWlubGluZSBzdGF0aWMgY29uc3QgQkYgJiBnZXRDb21Qb3J0KAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBxbmlkLCBhdm1fc2l6ZV90IGNvdW50KQorCXsKKwkJcmV0dXJuKCBnZXRDb21Qb3J0KF9DVFhfLm1hY2hpbmUsIHFuaWQsIGNvdW50KSApOworCX0KKworCXN0YXRpYyBjb25zdCBCRiAmIGdldENvbVBvcnQoTWFjaGluZSAqIG1hY2hpbmUsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIHFuaWQsIGF2bV9zaXplX3QgY291bnQpOworCisJc3RhdGljIEJGIGdldHZhclBvcnQoY29uc3Qgc3RkOjpzdHJpbmcgJiBxbmlkLCBhdm1fc2l6ZV90IGNvdW50KTsKKworCXN0YXRpYyB2b2lkIGFwcGVuZFBvcnRQYXJhbWV0ZXIoUG9ydCAqIHBvcnQsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGxhYmVsLCBCRlZlY3RvciAmIGxhYmVsbGVkUGFyYW1zLAorCQkJQkZMaXN0ICYgcG9zaXRpb25hbFBhcmFtcywgY29uc3QgQkYgJiBwYXJhbSk7CisKKwlzdGF0aWMgdm9pZCBjb21wdXRlUG9ydFBhcmFtZXRlcigKKwkJCVBvcnQgKiBwb3J0LCBjb25zdCBCRkNvZGUgJiBpb1N0YXRlbWVudCwKKwkJCUJGVmVjdG9yICYgbGFiZWxsZWRQYXJhbXMsIEJGTGlzdCAmIHBvc2l0aW9uYWxQYXJhbXMpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gR0VUIFNJR05BTCBCWSBbIFsgRnVsbHkgXSBRdWFsaWZpZWQgXSBOYW1lIElECisJaW5saW5lIHN0YXRpYyBjb25zdCBCRiAmIGdldENvbVNpZ25hbCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgcW5pZCwgYXZtX3NpemVfdCBjb3VudCkKKwl7CisJCXJldHVybiggZ2V0Q29tU2lnbmFsKF9DVFhfLm1hY2hpbmUsIHFuaWQsIGNvdW50KSApOworCX0KKworCXN0YXRpYyBjb25zdCBCRiAmIGdldENvbVNpZ25hbChNYWNoaW5lICogbWFjaGluZSwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgcW5pZCwgYXZtX3NpemVfdCBjb3VudCk7CisKKwlzdGF0aWMgQkYgZ2V0dmFyU2lnbmFsKGNvbnN0IHN0ZDo6c3RyaW5nICYgcW5pZCwgYXZtX3NpemVfdCBjb3VudCk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBHRVQgUE9SVCAvIFNJR05BTCBCWSBbIFsgRnVsbHkgXSBRdWFsaWZpZWQgXSBOYW1lIElECisJc3RhdGljIGNvbnN0IEJGICYgZ2V0Q29tUG9ydFNpZ25hbCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgcW5pZCwgYXZtX3NpemVfdCBjb3VudCkKKwl7CisJCXJldHVybiggZ2V0Q29tUG9ydFNpZ25hbChfQ1RYXy5tYWNoaW5lLCBxbmlkLCBjb3VudCkgKTsKKwl9CisKKwlzdGF0aWMgY29uc3QgQkYgJiBnZXRDb21Qb3J0U2lnbmFsKE1hY2hpbmUgKiBtYWNoaW5lLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBxbmlkLCBhdm1fc2l6ZV90IGNvdW50KTsKKworCXN0YXRpYyBCRiBnZXR2YXJQb3J0U2lnbmFsKGNvbnN0IHN0ZDo6c3RyaW5nICYgcW5pZCwgYXZtX3NpemVfdCBjb3VudCk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBHRVQgUk9VVElORSBCWSBbIFsgRnVsbHkgXSBRdWFsaWZpZWQgXSBOYW1lIElECisJc3RhdGljIFJvdXRpbmUgKiBnZXRSb3V0aW5lKGNvbnN0IHN0ZDo6c3RyaW5nICYgaWQpOworCisJc3RhdGljIEJGIGdldHZhclJvdXRpbmUoY29uc3Qgc3RkOjpzdHJpbmcgJiBpZCk7CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gR0VUIFBST0NFRFVSRSBCWSBbIFsgRnVsbHkgXSBRdWFsaWZpZWQgXSBOYW1lIElECisJc3RhdGljIE1hY2hpbmUgKiBnZXRQcm9jZWR1cmUoY29uc3Qgc3RkOjpzdHJpbmcgJiBpZCk7CisKKwlzdGF0aWMgQkYgZ2V0dmFyUHJvY2VkdXJlKGNvbnN0IHN0ZDo6c3RyaW5nICYgaWQpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gR0VUIE1BQ0hJTkUgQlkgWyBbIEZ1bGx5IF0gUXVhbGlmaWVkIF0gTmFtZSBJRAorCXN0YXRpYyBNYWNoaW5lICogZ2V0TWFjaGluZShNYWNoaW5lICogbWFjaGluZSwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgcW5pZCwgYXZtX3NpemVfdCBjb3VudCk7CisKKwlzdGF0aWMgQkYgZ2V0dmFyTWFjaGluZShjb25zdCBzdGQ6OnN0cmluZyAmIHFuaWQsIGF2bV9zaXplX3QgY291bnQpOworCisJc3RhdGljIEJGIGdldEV4ZWN1dGFibGVNYWNoaW5lKGNvbnN0IHN0ZDo6c3RyaW5nICYgcW5pZCwgYXZtX3NpemVfdCBjb3VudCk7CisKKworCXN0YXRpYyB2b2lkIGFwcGVuZEluc3RhbmNlTWFjaGluZVBhcmFtZXRlcihNYWNoaW5lICogbWFjaGluZSwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgbGFiZWwsIEJGVmVjdG9yICYgbGFiZWxsZWRQYXJhbXMsCisJCQlCRkxpc3QgJiBwb3NpdGlvbmFsUGFyYW1zLCBjb25zdCBCRiAmIHBhcmFtKTsKKworCXN0YXRpYyB2b2lkIGNvbXB1dGVJbnN0YW5jZU1hY2hpbmVQYXJhbWV0ZXIoTWFjaGluZSAqIG1hY2hpbmUsCisJCQlCRlZlY3RvciAmIGxhYmVsbGVkUGFyYW1zLCBCRkxpc3QgJiBwb3NpdGlvbmFsUGFyYW1zKTsKKworCXN0YXRpYyB2b2lkIGFwcGVuZEluc3RhbmNlTWFjaGluZVJldHVybihNYWNoaW5lICogbWFjaGluZSwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgbGFiZWwsIEJGVmVjdG9yICYgbGFiZWxsZWRSZXR1cm5zLAorCQkJQkZMaXN0ICYgcG9zaXRpb25hbFJldHVybnMsIGNvbnN0IEJGICYgcGFyYW0pOworCisJc3RhdGljIHZvaWQgY29tcHV0ZUluc3RhbmNlTWFjaGluZVJldHVybihNYWNoaW5lICogbWFjaGluZSwKKwkJCUJGVmVjdG9yICYgbGFiZWxsZWRSZXR1cm5zLCBCRkxpc3QgJiBwb3NpdGlvbmFsUmV0dXJucyk7CisKKworCXN0YXRpYyB2b2lkIGFwcGVuZEluc3RhbmNlRHluYW1pY1Bvc2l0aW9uYWxQYXJhbWV0ZXIoCisJCQlNYWNoaW5lICogYW5JbnN0YW5jZSwgY29uc3QgQkYgJiBydlBhcmFtZXRlciwgYXZtX3NpemVfdCBwb3NpdGlvbik7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBST1VUSU5FIFBhcmFtZXRlcnMgLyBSZXR1cm5zIGFyZ3VtZW50cworCXN0YXRpYyB2b2lkIGFwcGVuZFJvdXRpbmVQYXJhbWV0ZXJzKFJvdXRpbmUgKiByb3V0aW5lLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBsYWJlbCwgQkZWZWN0b3IgJiBsYWJlbGxlZFBhcmFtcywKKwkJCUJGTGlzdCAmIHBvc2l0aW9uYWxQYXJhbXMsIGNvbnN0IEJGICYgcGFyYW0pOworCisJc3RhdGljIHZvaWQgYXBwZW5kUm91dGluZVJldHVybnMoUm91dGluZSAqIHJvdXRpbmUsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGxhYmVsLCBCRlZlY3RvciAmIGxhYmVsbGVkUmV0dXJucywKKwkJCUJGTGlzdCAmIHBvc2l0aW9uYWxSZXR1cm5zLCBjb25zdCBCRiAmIHBhcmFtKTsKKworCXN0YXRpYyB2b2lkIGNvbXB1dGVSb3V0aW5lUGFyYW1SZXR1cm4oY29uc3QgQkYgJiBjdHhNYWNoaW5lLAorCQkJUm91dGluZSAqIHJvdXRpbmUsIEJGQ29kZSAmIGFjdGl2aXR5U3RhdGVtZW50LAorCQkJQkZWZWN0b3IgJiBsYWJlbGxlZFBhcmFtcywgQkZMaXN0ICYgcG9zaXRpb25hbFBhcmFtcywKKwkJCUJGVmVjdG9yICYgbGFiZWxsZWRSZXR1cm5zLCBCRkxpc3QgJiBwb3NpdGlvbmFsUmV0dXJucyk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBBQ1RJVklUWSBST1VUSU5FIFBhcmFtZXRlcnMgLyBSZXR1cm5zIGFyZ3VtZW50cworCXN0YXRpYyB2b2lkIGNvbXB1dGVBY3Rpdml0eVJvdXRpbmVQYXJhbVJldHVybihjb25zdCBCRiAmIGN0eE1hY2hpbmUsCisJCQlSb3V0aW5lICogcm91dGluZSwgQkZDb2RlICYgYWN0aXZpdHlTdGF0ZW1lbnQsCisJCQlCRlZlY3RvciAmIGxhYmVsbGVkUGFyYW1zLCBCRkxpc3QgJiBwb3NpdGlvbmFsUGFyYW1zLAorCQkJQkZWZWN0b3IgJiBsYWJlbGxlZFJldHVybnMsIEJGTGlzdCAmIHBvc2l0aW9uYWxSZXR1cm5zKTsKKworCXN0YXRpYyB2b2lkIGNvbXB1dGVBY3Rpdml0eVJvdXRpbmVJbnB1dChNYWNoaW5lICogY3R4TWFjaGluZSwKKwkJCVJvdXRpbmUgKiByb3V0aW5lLCBCRkNvZGUgJiBpbnZva2VTZXF1ZW5kZSwKKwkJCUJGVmVjdG9yICYgbGFiZWxsZWRQYXJhbXMsIEJGTGlzdCAmIHBvc2l0aW9uYWxQYXJhbXMpOworCisJc3RhdGljIHZvaWQgY29tcHV0ZUFjdGl2aXR5Um91dGluZURlZmF1bHRPdXRwdXQoTWFjaGluZSAqIGN0eE1hY2hpbmUsCisJCQlSb3V0aW5lICogcm91dGluZSwgQkZDb2RlICYgaW52b2tlU2VxdWVuZGUsCisJCQlCRlZlY3RvciAmIGxhYmVsbGVkUmV0dXJucywgQkZMaXN0ICYgcG9zaXRpb25hbFJldHVybnMpOworCisJc3RhdGljIHZvaWQgY29tcHV0ZUFjdGl2aXR5Um91dGluZU91dHB1dChNYWNoaW5lICogY3R4TWFjaGluZSwKKwkJCVJvdXRpbmUgKiByb3V0aW5lLCBCRkNvZGUgJiBpbnZva2VTZXF1ZW5kZSwKKwkJCUJGVmVjdG9yICYgbGFiZWxsZWRSZXR1cm5zLCBCRkxpc3QgJiBwb3NpdGlvbmFsUmV0dXJucyk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBHRVQgSU5WT0tBQkxFIEJZIElECisJc3RhdGljIEJGIGdldEludm9rYWJsZShjb25zdCBCRiAmIHRhcmdldCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBpZCk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBERUNMQVJFIERFRkFVTFQgU1RBVEUgICNmaW5hbCwgI3Rlcm1pbmFsLCAjcmV0dXJuICBpZiBuZWVkCisJc3RhdGljIHZvaWQgZGVjbGFyZURlZmF1bHRFbmRpbmdTdGF0ZUlmTmVlZCgKKwkJCUxpc3RPZk1hY2hpbmUgJiBuZWVkRGVmYXVsdFN0YXRlRmluYWwsCisJCQlMaXN0T2ZNYWNoaW5lICYgbmVlZERlZmF1bHRTdGF0ZVRlcm1pbmFsLAorCQkJTGlzdE9mTWFjaGluZSAmIG5lZWREZWZhdWx0U3RhdGVSZXR1cm4pOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gSU5MSU5FIFBST0NFRFVSRSBDQUxMIElOIFRSQU5TSVRJT04KKwlzdGF0aWMgdm9pZCBjaGVja1Byb2NlZHVyZUNvbXBvc2l0ZU1vY0tpbmQoTWFjaGluZSAqIGFQcm9jZWR1cmUpOworCisJc3RhdGljIHZvaWQgaW5saW5lVHJhbnNpdGlvblByb2NlZHVyZUNhbGwoCisJCQlUcmFuc2l0aW9uICogdHJhbnNpdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcgJiByZWZJZCk7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBST1VUSU5FIElOVk9LQVRJT04KKwlzdGF0aWMgQkZDb2RlIGludm9rZVJvdXRpbmUoUm91dGluZSAqIGFSb3V0aW5lSW5zdGFuY2UpOworCisJc3RhdGljIEJGQ29kZSBpbnZva2VSb3V0aW5lU3RhdGVtZW50KFJvdXRpbmUgKiBhUm91dGluZUluc3RhbmNlKTsKKworCXN0YXRpYyBCRiBpbnZva2VSb3V0aW5lRXhwcmVzc2lvbihSb3V0aW5lICogYVJvdXRpbmVJbnN0YW5jZSk7CisKK307CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKiBQQVJTRVJfVVRJTF9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZmM1YjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmcKQEAgLTAsMCArMSw2ODc2IEBACisKK2dyYW1tYXIgZm1sOworCisKK29wdGlvbnMgeworCWJhY2t0cmFjaz10cnVlOworCW1lbW9pemU9dHJ1ZTsKKwlrPTE7CisJbGFuZ3VhZ2UgPSBDOworfQorCitAbGV4ZXI6OmhlYWRlciB7CisKK30KKworQHBhcnNlcjo6aGVhZGVyIHsKKworI2luY2x1ZGUgPHBhcnNlci9tb2RlbC9QYXJzZXJVdGlsLmg+CisKKyNpbmNsdWRlIDxjb21tb24vQkYuaD4KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vQkZDb250YWluZXIuaD4KKworI2luY2x1ZGUgPGZtbC9jb21tb24vQmVoYXZpb3JhbEVsZW1lbnQuaD4KKyNpbmNsdWRlIDxmbWwvY29tbW9uL01vZGlmaWVyRWxlbWVudC5oPgorI2luY2x1ZGUgPGZtbC9jb21tb24vU3BlY2lmaWVyRWxlbWVudC5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZUxpYi5oPgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQXZtQ29kZS5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0J1aWx0aW5BcnJheS5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25Db25zdGFudC5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25Db25zdHJ1Y3Rvci5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL1N0YXRlbWVudENvbnN0cnVjdG9yLmg+CisKKyNpbmNsdWRlIDxmbWwvbGliL0lDb21Qb2ludC5oPgorCisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yLmg+CisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yTWFuYWdlci5oPgorCisjaW5jbHVkZSA8Zm1sL3RlbXBsYXRlL1RlbXBsYXRlRmFjdG9yeS5oPgorCisjaW5jbHVkZSA8Zm1sL3R5cGUvVHlwZVNwZWNpZmllci5oPgorCisjaW5jbHVkZSA8Zm1sL3R5cGUvVHlwZU1hbmFnZXIuaD4KKworI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9CdWZmZXIuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvQ2hhbm5lbC5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Db21Qb2ludC5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Db21Qcm90b2NvbC5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Db21Sb3V0ZS5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Db25uZWN0b3IuaD4KKworLy8gZXh0ZXJuICJDIiBhbmQgQysrIHRlbXBsYXRlIGluY29tcGF0aWJpbGl0eSAhISEKKy8vI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Qcm9wZXJ0eVBhcnQuaD4KKworI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9EYXRhVHlwZS5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9NYWNoaW5lLmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1BhY2thZ2UuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvUG9ydC5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Sb3V0aW5lLmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1N5c3RlbS5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9UcmFuc2l0aW9uLmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1ZhcmlhYmxlLmg+CisKKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvQmVoYXZpb3JhbFBhcnQuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvQ29tcG9zaXRlUGFydC5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9JbnN0YW5jZVNwZWNpZmllclBhcnQuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvSW50ZXJhY3Rpb25QYXJ0Lmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL01vZGVsT2ZDb21wdXRhdGlvblBhcnQuaD4KKworLy8gZXh0ZXJuICJDIiBhbmQgQysrIHRlbXBsYXRlIGluY29tcGF0aWJpbGl0eSAhISEKKy8vI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Qcm9wZXJ0eVBhcnQuaD4KKworI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9RdWVyeS5oPgorI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9VbmlGb3JtSWRlbnRpZmllci5oPgorI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9XT2JqZWN0Lmg+CisKKworLy92b2lkIGZtbERpc3BsYXlSZWNvZ25pdGlvbkVycm9yKAorLy8JCXBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlY29nbml6ZXIsIHBBTlRMUjNfVUlOVDggKiB0b2tlbk5hbWVzKTsKKworfQorCisKK0BwYXJzZXI6Om1lbWJlcnMgeworCisvLyBleHRlcm4gIkMiIGFuZCBDKysgVGVtcGxhdGUgaW5jb21wYXRpYmlsaXR5ICEhIQorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Qcm9wZXJ0eVBhcnQuaD4KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU0VUIExPQ0FUSU9OIElOIFRSQUNFQUJMRSBGT1JNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjZGVmaW5lIFNBVkVfUlVMRV9CRUdJTl9MT0NBVElPTiAgc2VwOjphdm1fc2l6ZV90IGJMaW5lID0gTFQoMSktPmdldExpbmUoTFQoMSkpCisKKyNkZWZpbmUgU0VUX1JVTEVfTE9DQVRJT04oZm9ybSkgICBcCisJCXNlcDo6UGFyc2VyVXRpbDo6c2V0TG9jYXRpb24oZm9ybSwgYkxpbmUsIExUKC0xKS0+Z2V0TGluZShMVCgtMSkpKQorCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFhMSUEgb3IgWEZTUCBNQUNSTworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBPUChvcCkgICAgICAgICAgICBzZXA6Ok9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfIyNvcAorCisjZGVmaW5lIE5FV19FWFBSKGUpICAgICAgIHNlcDo6RXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdFeHByKGUpCisKKyNkZWZpbmUgTkVXX0JPT0woYikgICAgICAgc2VwOjpFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oKGJvb2wpIGIpCisjZGVmaW5lIE5FV19JTlRFR0VSKGkpICAgIHNlcDo6RXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdJbnRlZ2VyKGkpCisjZGVmaW5lIE5FV19SQVRJT05BTChxKSAgIHNlcDo6RXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdSYXRpb25hbChxKQorI2RlZmluZSBORVdfRkxPQVQoZikgICAgICBzZXA6OkV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3RmxvYXQoZikKKyNkZWZpbmUgTkVXX0NIQVIoYykgICAgICAgc2VwOjpFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NoYXIoYykKKyNkZWZpbmUgTkVXX1NUUklORyhzKSAgICAgc2VwOjpFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld1N0cmluZyhzKQorCisjZGVmaW5lIE5FV19JRChpZCkgICAgICAgIHNlcDo6RXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdJZGVudGlmaWVyKGlkKQorI2RlZmluZSBORVdfUUlEKGlkKSAgICAgICBzZXA6OkV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3UXVhbGlmaWVkSWRlbnRpZmllcihpZCkKKyNkZWZpbmUgTkVXX1FOSUQoaWQsIG5iKSAgKCAobmIgPiAxKT8gTkVXX1FJRChpZCkgOiBORVdfSUQoaWQpICkKKworCisjZGVmaW5lIE5FV19JTlNUQU5DRV9VRklEKG1hY2hpbmUsIHZhcikgIFwKKwkJc2VwOjpFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld1F1YWxpZmllZElkZW50aWZpZXIoICBcCisJCQlzZXA6Ok9TUygpIDw8IG1hY2hpbmUtPmdldE5hbWVJRCgpIDw8ICcuJyA8PCB2YXItPmdldE5hbWVJRCgpICkKKworCisjZGVmaW5lIE5FV19DT0RFKG9wKSAgICAgICAgICAgICAgIHNlcDo6RXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlKG9wKQorI2RlZmluZSBORVdfQ09ERTEob3AsIGUpICAgICAgICAgICBzZXA6OkV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q29kZShvcCwgZSkKKyNkZWZpbmUgTkVXX0NPREUyKG9wLCBlMSwgZTIpICAgICAgc2VwOjpFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NvZGUob3AsIGUxLCBlMikKKyNkZWZpbmUgTkVXX0NPREUzKG9wLCBlMSwgZTIsIGUzKSAgc2VwOjpFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NvZGUob3AsIGUxLCBlMiwgZTMpCisKKyNkZWZpbmUgTkVXX0NPREVfRkxBVChvcCwgZTEsIGUyKSAgc2VwOjpFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NvZGVGbGF0KG9wLCBlMSwgZTIpCisKKyNkZWZpbmUgTkVXX1NUTVQob3ApICAgICAgICAgICAgICAgc2VwOjpTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZShvcCkKKyNkZWZpbmUgTkVXX1NUTVQxKG9wLCBzKSAgICAgICAgICAgc2VwOjpTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZShvcCwgcykKKyNkZWZpbmUgTkVXX1NUTVQyKG9wLCBzMSwgczIpICAgICAgc2VwOjpTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZShvcCwgczEsIHMyKQorI2RlZmluZSBORVdfU1RNVDMob3AsIHMxLCBzMiwgczMpICBzZXA6OlN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKG9wLCBzMSwgczIsIHMzKQorCisKKyNkZWZpbmUgTkVXX1NUTVRfQVNTSUdOX09QKG9wLCBsdiwgZSkgIFwKKwkJCQkJTkVXX1NUTVQyKE9QKEFTU0lHTl9PUCksIGx2LCBORVdfQ09ERTEob3AsIGUpKQorCisjZGVmaW5lIE5FV19TVE1UX0FTU0lHTl9PUF9BRlRFUihvcCwgbHYsIGUpICBcCisJCQkJCU5FV19TVE1UMihPUChBU1NJR05fT1BfQUZURVIpLCBsdiwgTkVXX0NPREUxKG9wLCBlKSkKKworCisjZGVmaW5lICBOVU1fSU5UKHMpICAgIHN0ZDo6YXRvaSgoY29uc3QgY2hhciopKHMpKQorI2RlZmluZSAgTlVNX0ZMT0FUKHMpICBzdGQ6OmF0b2YoKGNvbnN0IGNoYXIqKShzKSkKKworI2RlZmluZSAgQ0hBUihzKSAgICAgICggKigoY29uc3QgY2hhciopKHMpKSApCisKKyNkZWZpbmUgIFNUUihzKSAgICAgICBzdGQ6OnN0cmluZygoY29uc3QgY2hhciopKHMpKQorCisjZGVmaW5lICBTVFJfSUQocykgICAgc3RkOjpzdHJpbmcoKGNvbnN0IGNoYXIqKSgocy0+Z2V0VGV4dChzKSktPmNoYXJzKSkKKworCitzZXA6OkJGIG5ld191bWludXNfZXhwcihzZXA6OkJGICYgYXJnKQoreworCWlmKCBhcmcuaXNOdW1lcmljKCkgKQorCXsKKwkJcmV0dXJuKCBzZXA6OkV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6dW1pbnVzRXhwcihhcmcpICk7CisJfQorCXJldHVybiggTkVXX0NPREUxKE9QKFVNSU5VUyksIGFyZykgKTsKK30KKworc2VwOjpCRiBuZXdfbm90X2V4cHIoc2VwOjpCRiAmIGFyZykKK3sKKwlpZiggYXJnLmlzQm9vbGVhbigpICkKKwl7CisJCXJldHVybiggc2VwOjpFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5vdEV4cHIoYXJnKSApOworCX0KKwlyZXR1cm4oIE5FV19DT0RFMShPUChOT1QpLCBhcmcpICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFBBUlNFUiBHTE9CQUwgVkFSSUFCTEUKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIFdPYmplY3QgTWFuYWdlcgorc2VwOjpXT2JqZWN0TWFuYWdlciAqIG1XT2JqZWN0TWFuYWdlciA9IE5VTEw7CisKKy8vIEN1cnJlbnQgRGl2ZXJzaXR5IHByb2xvZ3VlIHNwZWNpZmljYXRpb24KK3NlcDo6V09iamVjdCAqIERJVkVSSVRZX1BST0xPRyA9IHNlcDo6V09iamVjdDo6X05VTExfOworCisKKy8vIEN1cnJlbnQgUGFyc2UgU3lzdGVtCitzdGF0aWMgc2VwOjpTeXN0ZW0gKiBfU1lTVEVNXyA9IE5VTEw7CisKKy8vIEN1cnJlbnQgUGFyc2UgTWFjaGluZQorc3RhdGljIHNlcDo6TWFjaGluZSAqIF9DUE1fID0gTlVMTDsKKworI2RlZmluZSBQVVNIX0NUWF9DUE0oIGNwbSApICAgc2VwOjpQYXJzZXJVdGlsOjpwdXNoQ1RYKCBfQ1BNXyA9IGNwbSApCisKKyNkZWZpbmUgUFVTSF9DVFhfTkVXKCBjcG0gKSAgIHNlcDo6UGFyc2VyVXRpbDo6cHVzaER5bmFtaWNDVFgoIF9DUE1fID0gY3BtICkKKworCisvLyBDdXJyZW50IFBhcnNlIFJvdXRpbmUKK3N0YXRpYyBzZXA6OlJvdXRpbmUgKiBfQ1BSXyA9IE5VTEw7CisKKyNkZWZpbmUgUFVTSF9DVFhfQ1BSKCBjcHIgKSAgIHNlcDo6UGFyc2VyVXRpbDo6cHVzaENUWCggX0NQUl8gPSBjcHIgKQorCisvLyBQb3Agb2xkIGxvY2FsIHBhcnNlIGNvbnRleHQgJiB1cGRhdGUgY3VycmVudCBtYWNoaW5lICYgcm91dGluZQorI2RlZmluZSBQT1BfQ1RYICAgICAgICAgICAgICAgc2VwOjpQYXJzZXJVdGlsOjpwb3BDVFgoIF9DUE1fICwgX0NQUl8gKQorCisjZGVmaW5lIFBPUF9DVFhfSUYoIGNwbSApICAgXAorCQlpZiggX0NQTV8gPT0gY3BtICkgeyBzZXA6OlBhcnNlclV0aWw6OnBvcENUWCggX0NQTV8gLCBfQ1BSXyApOyB9CisKKy8vIEN1cnJlbnQgUGFyc2UgUm91dGluZSB8IE1hY2hpbmUgfCBTeXN0ZW0KKyNkZWZpbmUgX0NQUk1TXyAgKCAoIF9DUFJfICE9IE5VTEwgKSAgXAorCQk/IHN0YXRpY19jYXN0PCBzZXA6OkJlaGF2aW9yYWxFbGVtZW50ICogPihfQ1BSXykgIFwKKwkJOiAoICggX0NQTV8gIT0gTlVMTCApICBcCisJCQkJPyBzdGF0aWNfY2FzdDwgc2VwOjpCZWhhdmlvcmFsRWxlbWVudCAqID4oX0NQTV8pICBcCisJCQkJOiBzdGF0aWNfY2FzdDwgc2VwOjpCZWhhdmlvcmFsRWxlbWVudCAqID4oX1NZU1RFTV8pICkgKQorCisKKy8vIEN1cnJlbnQgUGFyc2UgWyBbIEZ1bGx5IF0gUXVhbGlmaWVkIF0gTmFtZSBJRAorc3RkOjpzdHJpbmcgY3BMT0NBVE9SOworc3RkOjp2ZWN0b3I8IHN0ZDo6c3RyaW5nID4gY3BRTklEOworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBERUZBVUxUIFNUQVRFICAjZmluYWwsICN0ZXJtaW5hbCwgI3JldHVybgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIHNlcDo6TGlzdE9mTWFjaGluZSBuZWVkRGVmYXVsdFN0YXRlRmluYWw7CisKK3N0YXRpYyBzZXA6Okxpc3RPZk1hY2hpbmUgbmVlZERlZmF1bHRTdGF0ZVRlcm1pbmFsOworCitzdGF0aWMgc2VwOjpMaXN0T2ZNYWNoaW5lIG5lZWREZWZhdWx0U3RhdGVSZXR1cm47CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFRSQU5TSVRJT04gSUQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyBzZXA6OmF2bV9zaXplX3QgdHJhbnNpdGlvbl9pZCA9IDA7CisKK3N0YXRpYyB2b2lkIHJlc2V0VHJhbnNpdGlvbklEKCkKK3sKKwl0cmFuc2l0aW9uX2lkID0gMDsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIG5ld1RyYW5zaXRpb25JRCgKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBpZCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBwcmVmaXggPSAidCIpCit7CisJcmV0dXJuKCBpZC5lbXB0eSgpID8KKwkJCShzZXA6Ok9TUygpIDw8IHByZWZpeCA8PCAnIycgPDwgdHJhbnNpdGlvbl9pZCsrKS5zdHIoKSA6IGlkICk7Cit9CisKKworc3RhdGljIGludCBtSW52b2tlTmV3SW5zdGFuY2VDb3VudCA9IDA7CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBuZXdJbnZva2VOZXdJbnN0YW5jZU5hbWVJRCgKKwkJc2VwOjpNYWNoaW5lICogY29udGFpbmVyLCBjb25zdCBzdGQ6OnN0cmluZyBtb2RlbE5hbWVJRCkKK3sKKwlyZXR1cm4oIHNlcDo6T1NTKCkgPDwgbW9kZWxOYW1lSUQgPDwgJyMnIDw8IG1JbnZva2VOZXdJbnN0YW5jZUNvdW50KysgKTsKK30KKworCisKK3N0YXRpYyBpbnQgbVByb2NlZHVyZUNhbGxDb3VudCA9IDA7CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ09OTkVDVCBJRAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIHNlcDo6YXZtX3NpemVfdCBidWZmZXJfaWQgPSAwOworCitzdGF0aWMgdm9pZCByZXNldEJ1ZmZlcklEKCkKK3sKKwlidWZmZXJfaWQgPSAwOworfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgbmV3QnVmZmVySUQoY29uc3Qgc3RkOjpzdHJpbmcgJiBwcmVmaXggPSBzZXA6OkJ1ZmZlcjo6QU5PTllNX0lEKQoreworCXJldHVybiggc2VwOjpPU1MoKSA8PCBwcmVmaXggPDwgJyMnIDw8IGJ1ZmZlcl9pZCsrICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENPTk5FQ1QgSUQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyBzZXA6OmF2bV9zaXplX3QgY29ubmVjdG9yX2lkID0gMDsKKworc3RhdGljIHZvaWQgcmVzZXRDb25uZWN0SUQoKQoreworCWNvbm5lY3Rvcl9pZCA9IDA7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBuZXdDb25uZWN0SUQoY29uc3Qgc3RkOjpzdHJpbmcgJiBpZCwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBwcmVmaXggPSBzZXA6OkNvbm5lY3Rvcjo6QU5PTllNX0lEKQoreworCXJldHVybiggaWQuZW1wdHkoKSA/CisJCQkoc2VwOjpPU1MoKSA8PCBwcmVmaXggPDwgJyMnIDw8IGNvbm5lY3Rvcl9pZCsrKS5zdHIoKSA6IGlkICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFBBUlNFUiBNQUNSTyBGT1IgU0VNQU5USUMgUFJFRElDQVRFIEZPUiBLRVlXT1JEIERFVEVDVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBJU19LRVlXT1JEKGt3KSAgIFwKKwkoIChTVFIoTFQoMSktPmdldFRleHQoTFQoMSkpLT5jaGFycykgPT0ga3cpPyBBTlRMUjNfVFJVRSA6IEFOVExSM19GQUxTRSApCisKKworCit2b2lkIGZtbERpc3BsYXlSZWNvZ25pdGlvbkVycm9yKAorCQlwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWNvZ25pemVyLCBwQU5UTFIzX1VJTlQ4ICogdG9rZW5OYW1lcykKK3sKKwlwQU5UTFIzX1BBUlNFUgkJCXBhcnNlcjsKKwlwQU5UTFIzX1RSRUVfUEFSU0VSCSAgICB0cGFyc2VyOworCXBBTlRMUjNfSU5UX1NUUkVBTQkgICAgaXM7CisJcEFOVExSM19TVFJJTkcJCQl0dGV4dDsKKwlwQU5UTFIzX1NUUklORwkJCWZ0ZXh0OworCXBBTlRMUjNfRVhDRVBUSU9OCSAgICBleDsKKwlwQU5UTFIzX0NPTU1PTl9UT0tFTiAgICB0aGVUb2tlbjsKKwlwQU5UTFIzX0JBU0VfVFJFRQkgICAgdGhlQmFzZVRyZWU7CisJcEFOVExSM19DT01NT05fVFJFRQkgICAgdGhlQ29tbW9uVHJlZTsKKworCS8vIFJldHJpZXZlIHNvbWUgaW5mbyBmb3IgZWFzeSByZWFkaW5nLgorCS8vCisJZXgJICAgID0JCXJlY29nbml6ZXItPnN0YXRlLT5leGNlcHRpb247CisJdHRleHQgICA9CQlOVUxMOworCisJLy8gU2VlIGlmIHRoZXJlIGlzIGEgJ2ZpbGVuYW1lJyB3ZSBjYW4gdXNlCisJLy8KKwlpZgkoZXgtPnN0cmVhbU5hbWUgPT0gTlVMTCkKKwl7CisJCWlmCSgoKHBBTlRMUjNfQ09NTU9OX1RPS0VOKShleC0+dG9rZW4pKS0+dHlwZSA9PSBBTlRMUjNfVE9LRU5fRU9GKQorCQl7CisJCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICItZW5kIG9mIGlucHV0LSgiKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgIi11bmtub3duIHNvdXJjZS0oIik7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJZnRleHQgPSBleC0+c3RyZWFtTmFtZS0+dG84KGV4LT5zdHJlYW1OYW1lKTsKKwkJQU5UTFIzX0ZQUklOVEYoc3RkZXJyLCAiXCVzKCIsIGZ0ZXh0LT5jaGFycyk7CisJfQorCisJLy8gTmV4dCBjb21lcyB0aGUgbGluZSBudW1iZXIKKwkvLworCisJQU5UTFIzX0ZQUklOVEYoc3RkZXJyLCAiXCVkKSAiLCByZWNvZ25pemVyLT5zdGF0ZS0+ZXhjZXB0aW9uLT5saW5lKTsKKwlBTlRMUjNfRlBSSU5URihzdGRlcnIsICIgOiBlcnJvciBcJWQgOiBcJXMiLAorCQkJCQkJCQkJCXJlY29nbml6ZXItPnN0YXRlLT5leGNlcHRpb24tPnR5cGUsCisJCQkJCShwQU5UTFIzX1VJTlQ4KQkgICAocmVjb2duaXplci0+c3RhdGUtPmV4Y2VwdGlvbi0+bWVzc2FnZSkpOworCisKKwkvLyBIb3cgd2UgZGV0ZXJtaW5lIHRoZSBuZXh0IHBpZWNlIGlzIGRlcGVuZGVudCBvbiB3aGljaCB0aGluZyByYWlzZWQgdGhlCisJLy8gZXJyb3IuCisJLy8KKwlzd2l0Y2gJKHJlY29nbml6ZXItPnR5cGUpCisJeworCWNhc2UJQU5UTFIzX1RZUEVfUEFSU0VSOgorCisJCS8vIFByZXBhcmUgdGhlIGtub3dsZWRnZSB3ZSBrbm93IHdlIGhhdmUKKwkJLy8KKwkJcGFyc2VyCSAgICA9IChwQU5UTFIzX1BBUlNFUikgKHJlY29nbml6ZXItPnN1cGVyKTsKKwkJdHBhcnNlcgkgICAgPSBOVUxMOworCQlpcwkJCT0gcGFyc2VyLT50c3RyZWFtLT5pc3RyZWFtOworCQl0aGVUb2tlbiAgICA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTikocmVjb2duaXplci0+c3RhdGUtPmV4Y2VwdGlvbi0+dG9rZW4pOworCQl0dGV4dAkgICAgPSB0aGVUb2tlbi0+dG9TdHJpbmcodGhlVG9rZW4pOworCisJCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgIiwgYXQgb2Zmc2V0IFwlZCIsIHJlY29nbml6ZXItPnN0YXRlLT5leGNlcHRpb24tPmNoYXJQb3NpdGlvbkluTGluZSk7CisJCWlmICAodGhlVG9rZW4gIT0gTlVMTCkKKwkJeworCQkJaWYgKHRoZVRva2VuLT50eXBlID09IEFOVExSM19UT0tFTl9FT0YpCisJCQl7CisJCQkJQU5UTFIzX0ZQUklOVEYoc3RkZXJyLCAiLCBhdCA8RU9GPiIpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIEd1YXJkIGFnYWluc3QgbnVsbCB0ZXh0IGluIGEgdG9rZW4KKwkJCQkvLworCQkJCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgIlxuICAgIE5FQVIgXCVzXG4gICAgIiwgdHRleHQgPT0gTlVMTCA/IChwQU5UTFIzX1VJTlQ4KSI8bm8gdGV4dCBmb3IgdGhlIHRva2VuPiIgOiB0dGV4dC0+Y2hhcnMpOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZQlBTlRMUjNfVFlQRV9UUkVFX1BBUlNFUjoKKworCQl0cGFyc2VyCQk9IChwQU5UTFIzX1RSRUVfUEFSU0VSKSAocmVjb2duaXplci0+c3VwZXIpOworCQlwYXJzZXIJCT0gTlVMTDsKKwkJaXMJCQk9IHRwYXJzZXItPmN0bnN0cmVhbS0+dG5zdHJlYW0tPmlzdHJlYW07CisJCXRoZUJhc2VUcmVlCT0gKHBBTlRMUjNfQkFTRV9UUkVFKShyZWNvZ25pemVyLT5zdGF0ZS0+ZXhjZXB0aW9uLT50b2tlbik7CisJCXR0ZXh0CQk9IHRoZUJhc2VUcmVlLT50b1N0cmluZ1RyZWUodGhlQmFzZVRyZWUpOworCisJCWlmICAodGhlQmFzZVRyZWUgIT0gTlVMTCkKKwkJeworCQkJdGhlQ29tbW9uVHJlZQk9IChwQU5UTFIzX0NPTU1PTl9UUkVFKQkgICAgdGhlQmFzZVRyZWUtPnN1cGVyOworCisJCQlpZgkodGhlQ29tbW9uVHJlZSAhPSBOVUxMKQorCQkJeworCQkJCXRoZVRva2VuCT0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSAgICB0aGVCYXNlVHJlZS0+Z2V0VG9rZW4odGhlQmFzZVRyZWUpOworCQkJfQorCQkJQU5UTFIzX0ZQUklOVEYoc3RkZXJyLCAiLCBhdCBvZmZzZXQgXCVkIiwgdGhlQmFzZVRyZWUtPmdldENoYXJQb3NpdGlvbkluTGluZSh0aGVCYXNlVHJlZSkpOworCQkJQU5UTFIzX0ZQUklOVEYoc3RkZXJyLCAiLCBuZWFyIFwlcyIsIHR0ZXh0LT5jaGFycyk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCisJCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgIkJhc2UgcmVjb2duaXplciBmdW5jdGlvbiBkaXNwbGF5UmVjb2duaXRpb25FcnJvciBjYWxsZWQgYnkgdW5rbm93biBwYXJzZXIgdHlwZSAtIHByb3ZpZGUgb3ZlcnJpZGUgZm9yIHRoaXMgZnVuY3Rpb25cbiIpOworCQlyZXR1cm47CisJCWJyZWFrOworCX0KKworCS8vIEFsdGhvdWdoIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGdlbmVyYWxseSBiZSBwcm92aWRlZCBieSB0aGUgaW1wbGVtZW50YXRpb24sIHRoaXMgb25lCisJLy8gc2hvdWxkIGJlIGFzIGhlbHBmdWwgYXMgcG9zc2libGUgZm9yIGdyYW1tYXIgZGV2ZWxvcGVycyBhbmQgc2VydmUgYXMgYW4gZXhhbXBsZQorCS8vIG9mIHdoYXQgeW91IGNhbiBkbyB3aXRoIGVhY2ggZXhjZXB0aW9uIHR5cGUuIEluIGdlbmVyYWwsIHdoZW4geW91IG1ha2UgdXAgeW91cgorCS8vICdyZWFsJyBoYW5kbGVyLCB5b3Ugc2hvdWxkIGRlYnVnIHRoZSByb3V0aW5lIHdpdGggYWxsIHBvc3NpYmxlIGVycm9ycyB5b3UgZXhwZWN0CisJLy8gd2hpY2ggd2lsbCB0aGVuIGxldCB5b3UgYmUgYXMgc3BlY2lmaWMgYXMgcG9zc2libGUgYWJvdXQgYWxsIGNpcmN1bXN0YW5jZXMuCisJLy8KKwkvLyBOb3RlIHRoYXQgaW4gdGhlIGdlbmVyYWwgY2FzZSwgZXJyb3JzIHRocm93biBieSB0cmVlIHBhcnNlcnMgaW5kaWNhdGUgYSBwcm9ibGVtCisJLy8gd2l0aCB0aGUgb3V0cHV0IG9mIHRoZSBwYXJzZXIgb3Igd2l0aCB0aGUgdHJlZSBncmFtbWFyIGl0c2VsZi4gVGhlIGpvYiBvZiB0aGUgcGFyc2VyCisJLy8gaXMgdG8gcHJvZHVjZSBhIHBlcmZlY3QgKGluIHRyYXZlcnNhbCB0ZXJtcykgc3ludGFjdGljYWxseSBjb3JyZWN0IHRyZWUsIHNvIGVycm9ycworCS8vIGF0IHRoYXQgc3RhZ2Ugc2hvdWxkIHJlYWxseSBiZSBzZW1hbnRpYyBlcnJvcnMgdGhhdCB5b3VyIG93biBjb2RlIGRldGVybWluZXMgYW5kIGhhbmRsZXMKKwkvLyBpbiB3aGF0ZXZlciB3YXkgaXMgYXBwcm9wcmlhdGUuCisJLy8KKwlzd2l0Y2ggIChleC0+dHlwZSkKKwl7CisJY2FzZQlBTlRMUjNfVU5XQU5URURfVE9LRU5fRVhDRVBUSU9OOgorCisJCS8vIEluZGljYXRlcyB0aGF0IHRoZSByZWNvZ25pemVyIHdhcyBmZWQgYSB0b2tlbiB3aGljaCBzZWVzbSB0byBiZQorCQkvLyBzcHVyaW91cyBpbnB1dC4gV2UgY2FuIGRldGVjdCB0aGlzIHdoZW4gdGhlIHRva2VuIHRoYXQgZm9sbG93cworCQkvLyB0aGlzIHVud2FudGVkIHRva2VuIHdvdWxkIG5vcm1hbGx5IGJlIHBhcnQgb2YgdGhlIHN5bnRhY3RpY2FsbHkKKwkJLy8gY29ycmVjdCBzdHJlYW0uIFRoZW4gd2UgY2FuIHNlZSB0aGF0IHRoZSB0b2tlbiB3ZSBhcmUgbG9va2luZyBhdAorCQkvLyBpcyBqdXN0IHNvbWV0aGluZyB0aGF0IHNob3VsZCBub3QgYmUgdGhlcmUgYW5kIHRocm93IHRoaXMgZXhjZXB0aW9uLgorCQkvLworCQlpZgkodG9rZW5OYW1lcyA9PSBOVUxMKQorCQl7CisJCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICIgOiBFeHRyYW5lb3VzIGlucHV0Li4uIik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZgkoZXgtPmV4cGVjdGluZyA9PSBBTlRMUjNfVE9LRU5fRU9GKQorCQkJeworCQkJCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgIiA6IEV4dHJhbmVvdXMgaW5wdXQgLSBleHBlY3RlZCA8RU9GPlxuIik7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQU5UTFIzX0ZQUklOVEYoc3RkZXJyLCAiIDogRXh0cmFuZW91cyBpbnB1dCAtIGV4cGVjdGVkIFwlcyAuLi5cbiIsIHRva2VuTmFtZXNbZXgtPmV4cGVjdGluZ10pOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZQlBTlRMUjNfTUlTU0lOR19UT0tFTl9FWENFUFRJT046CisKKwkJLy8gSW5kaWNhdGVzIHRoYXQgdGhlIHJlY29nbml6ZXIgZGV0ZWN0ZWQgdGhhdCB0aGUgdG9rZW4gd2UganVzdAorCQkvLyBoaXQgd291bGQgYmUgdmFsaWQgc3ludGFjdGljYWxseSBpZiBwcmVjZWVkZWQgYnkgYSBwYXJ0aWN1bGFyCisJCS8vIHRva2VuLiBQZXJoYXBzIGEgbWlzc2luZyAnOycgYXQgbGluZSBlbmQgb3IgYSBtaXNzaW5nICcsJyBpbiBhbgorCQkvLyBleHByZXNzaW9uIGxpc3QsIGFuZCBzdWNoIGxpa2UuCisJCS8vCisJCWlmCSh0b2tlbk5hbWVzID09IE5VTEwpCisJCXsKKwkJCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgIiA6IE1pc3NpbmcgdG9rZW4gKFwlZCkuLi5cbiIsIGV4LT5leHBlY3RpbmcpOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYJKGV4LT5leHBlY3RpbmcgPT0gQU5UTFIzX1RPS0VOX0VPRikKKwkJCXsKKwkJCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICIgOiBNaXNzaW5nIDxFT0Y+XG4iKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICIgOiBNaXNzaW5nIFwlcyBcbiIsIHRva2VuTmFtZXNbZXgtPmV4cGVjdGluZ10pOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZQlBTlRMUjNfUkVDT0dOSVRJT05fRVhDRVBUSU9OOgorCisJCS8vIEluZGljYXRlcyB0aGF0IHRoZSByZWNvZ25pemVyIHJlY2VpdmVkIGEgdG9rZW4KKwkJLy8gaW4gdGhlIGlucHV0IHRoYXQgd2FzIG5vdCBwcmVkaWN0ZWQuIFRoaXMgaXMgdGhlIGJhc2ljIGV4Y2VwdGlvbiB0eXBlCisJCS8vIGZyb20gd2hpY2ggYWxsIG90aGVycyBhcmUgZGVyaXZlZC4gU28gd2UgYXNzdW1lIGl0IHdhcyBhIHN5bnRheCBlcnJvci4KKwkJLy8gWW91IG1heSBnZXQgdGhpcyBpZiB0aGVyZSBhcmUgbm90IG1vcmUgdG9rZW5zIGFuZCBtb3JlIGFyZSBuZWVkZWQKKwkJLy8gdG8gY29tcGxldGUgYSBwYXJzZSBmb3IgaW5zdGFuY2UuCisJCS8vCisJCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgIiA6IHN5bnRheCBlcnJvci4uLlxuIik7CisJCWJyZWFrOworCisJY2FzZSAgICBBTlRMUjNfTUlTTUFUQ0hFRF9UT0tFTl9FWENFUFRJT046CisKKwkJLy8gV2Ugd2VyZSBleHBlY3RpbmcgdG8gc2VlIG9uZSB0aGluZyBhbmQgZ290IGFub3RoZXIuIFRoaXMgaXMgdGhlCisJCS8vIG1vc3QgY29tbW9uIGVycm9yIGlmIHdlIGNvdWRsIG5vdCBkZXRlY3QgYSBtaXNzaW5nIG9yIHVud2FudGVkIHRva2VuLgorCQkvLyBIZXJlIHlvdSBjYW4gc3BlbmQgeW91ciBlZmZvcnRzIHRvCisJCS8vIGRlcml2ZSBtb3JlIHVzZWZ1bCBlcnJvciBtZXNzYWdlcyBiYXNlZCBvbiB0aGUgZXhwZWN0ZWQKKwkJLy8gdG9rZW4gc2V0IGFuZCB0aGUgbGFzdCB0b2tlbiBhbmQgc28gb24uIFRoZSBlcnJvciBmb2xsb3dpbmcKKwkJLy8gYml0bWFwcyBkbyBhIGdvb2Qgam9iIG9mIHJlZHVjaW5nIHRoZSBzZXQgdGhhdCB3ZSB3ZXJlIGxvb2tpbmcKKwkJLy8gZm9yIGRvd24gdG8gc29tZXRoaW5nIHNtYWxsLiBLbm93aW5nIHdoYXQgeW91IGFyZSBwYXJzaW5nIG1heSBiZQorCQkvLyBhYmxlIHRvIGFsbG93IHlvdSB0byBiZSBldmVuIG1vcmUgc3BlY2lmaWMgYWJvdXQgYW4gZXJyb3IuCisJCS8vCisJCWlmCSh0b2tlbk5hbWVzID09IE5VTEwpCisJCXsKKwkJCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgIiA6IHN5bnRheCBlcnJvci4uLlxuIik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZgkoZXgtPmV4cGVjdGluZyA9PSBBTlRMUjNfVE9LRU5fRU9GKQorCQkJeworCQkJCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgIiA6IGV4cGVjdGVkIDxFT0Y+XG4iKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICIgOiBleHBlY3RlZCBcJXMgLi4uXG4iLCB0b2tlbk5hbWVzW2V4LT5leHBlY3RpbmddKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UJQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOgorCisJCS8vIFdlIGNvdWxkIG5vdCBwaWNrIGFueSBhbHQgZGVjaXNpb24gZnJvbSB0aGUgaW5wdXQgZ2l2ZW4KKwkJLy8gc28gZ29kIGtub3dzIHdoYXQgaGFwcGVuZWQgLSBob3dldmVyIHdoZW4geW91IGV4YW1pbmUgeW91ciBncmFtbWFyLAorCQkvLyB5b3Ugc2hvdWxkLiBJdCBtZWFucyB0aGF0IGF0IHRoZSBwb2ludCB3aGVyZSB0aGUgY3VycmVudCB0b2tlbiBvY2N1cnJlZAorCQkvLyB0aGF0IHRoZSBERkEgaW5kaWNhdGVzIG5vd2hlcmUgdG8gZ28gZnJvbSBoZXJlLgorCQkvLworCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICIgOiBjYW5ub3QgbWF0Y2ggdG8gYW55IHByZWRpY3RlZCBpbnB1dC4uLlxuIik7CisKKwkJYnJlYWs7CisKKwljYXNlCUFOVExSM19NSVNNQVRDSEVEX1NFVF9FWENFUFRJT046CisKKwkJeworCQkJQU5UTFIzX1VJTlQzMgkgIGNvdW50OworCQkJQU5UTFIzX1VJTlQzMgkgIGJpdDsKKwkJCUFOVExSM19VSU5UMzIJICBzaXplOworCQkJQU5UTFIzX1VJTlQzMgkgIG51bWJpdHM7CisJCQlwQU5UTFIzX0JJVFNFVAkgIGVyckJpdHM7CisKKwkJCS8vIFRoaXMgbWVhbnMgd2Ugd2VyZSBhYmxlIHRvIGRlYWwgd2l0aCBvbmUgb2YgYSBzZXQgb2YKKwkJCS8vIHBvc3NpYmxlIHRva2VucyBhdCB0aGlzIHBvaW50LCBidXQgd2UgZGlkIG5vdCBzZWUgYW55CisJCQkvLyBtZW1iZXIgb2YgdGhhdCBzZXQuCisJCQkvLworCQkJQU5UTFIzX0ZQUklOVEYoc3RkZXJyLCAiIDogdW5leHBlY3RlZCBpbnB1dC4uLlxuICBleHBlY3RlZCBvbmUgb2YgOiAiKTsKKworCQkJLy8gV2hhdCB0b2tlbnMgY291bGQgd2UgaGF2ZSBhY2NlcHRlZCBhdCB0aGlzIHBvaW50IGluIHRoZQorCQkJLy8gcGFyc2U/CisJCQkvLworCQkJY291bnQgICA9IDA7CisJCQllcnJCaXRzID0gYW50bHIzQml0c2V0TG9hZAkJKGV4LT5leHBlY3RpbmdTZXQpOworCQkJbnVtYml0cyA9IGVyckJpdHMtPm51bUJpdHMJCShlcnJCaXRzKTsKKwkJCXNpemUgICAgPSBlcnJCaXRzLT5zaXplCQkJKGVyckJpdHMpOworCisJCQlpZiAgKHNpemUgPiAwKQorCQkJeworCQkJCS8vIEhvd2V2ZXIgbWFueSB0b2tlbnMgd2UgY291bGQgaGF2ZSBkZWFsdCB3aXRoIGhlcmUsIGl0IGlzIHVzdWFsbHkKKwkJCQkvLyBub3QgdXNlZnVsIHRvIHByaW50IEFMTCBvZiB0aGUgc2V0IGhlcmUuIEkgYXJiaXRyYXJpbHkgY2hvc2UgOAorCQkJCS8vIGhlcmUsIGJ1dCB5b3Ugc2hvdWxkIGRvIHdoYXRldmVyIG1ha2VzIHNlbnNlIGZvciB5b3Ugb2YgY291cnNlLgorCQkJCS8vIE5vIHRva2VuIG51bWJlciAwLCBzbyBsb29rIGZvciBiaXQgMSBhbmQgb24uCisJCQkJLy8KKwkJCQlmb3IJKGJpdCA9IDE7IGJpdCA8IG51bWJpdHMgJiYgY291bnQgPCA4ICYmIGNvdW50IDwgc2l6ZTsgYml0KyspCisJCQkJeworCQkJCQkvLyBUT0RPOiBUaGlzIGRvZXNuO3QgbG9vayByaWdodCAtIHNob3VsZCBiZSBhc2tpbmcgaWYgdGhlIGJpdCBpcyBzZXQhIQorCQkJCQkvLworCQkJCQlpZiAgKHRva2VuTmFtZXNbYml0XSkKKwkJCQkJeworCQkJCQkJQU5UTFIzX0ZQUklOVEYoc3RkZXJyLCAiXCVzXCVzIiwgY291bnQgPiAwID8gIiwgIiA6ICIiLCB0b2tlbk5hbWVzW2JpdF0pOworCQkJCQkJY291bnQrKzsKKwkJCQkJfQorCQkJCX0KKwkJCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICJcbiIpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgIkFjdHVhbGx5IGR1ZGUsIHdlIGRpZG4ndCBzZWVtIHRvIGJlIGV4cGVjdGluZyBhbnl0aGluZyBoZXJlLCBvciBhdCBsZWFzdFxuIik7CisJCQkJQU5UTFIzX0ZQUklOVEYoc3RkZXJyLCAiSSBjb3VsZCBub3Qgd29yayBvdXQgd2hhdCBJIHdhcyBleHBlY3RpbmcsIGxpa2Ugc28gbWFueSBvZiB1cyB0aGVzZSBkYXlzIVxuIik7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlCUFOVExSM19FQVJMWV9FWElUX0VYQ0VQVElPTjoKKworCQkvLyBXZSBlbnRlcmVkIGEgbG9vcCByZXF1aXJpbmcgYSBudW1iZXIgb2YgdG9rZW4gc2VxdWVuY2VzCisJCS8vIGJ1dCBmb3VuZCBhIHRva2VuIHRoYXQgZW5kZWQgdGhhdCBzZXF1ZW5jZSBlYXJsaWVyIHRoYW4KKwkJLy8gd2Ugc2hvdWxkIGhhdmUgZG9uZS4KKwkJLy8KKwkJQU5UTFIzX0ZQUklOVEYoc3RkZXJyLCAiIDogbWlzc2luZyBlbGVtZW50cy4uLlxuIik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKworCQkvLyBXZSBkb24ndCBoYW5kbGUgYW55IG90aGVyIGV4Y2VwdGlvbnMgaGVyZSwgYnV0IHlvdSBjYW4KKwkJLy8gaWYgeW91IHdpc2guIElmIHdlIGdldCBhbiBleGNlcHRpb24gdGhhdCBoaXRzIHRoaXMgcG9pbnQKKwkJLy8gdGhlbiB3ZSBhcmUganVzdCBnb2luZyB0byByZXBvcnQgd2hhdCB3ZSBrbm93IGFib3V0IHRoZQorCQkvLyB0b2tlbi4KKwkJLy8KKwkJQU5UTFIzX0ZQUklOVEYoc3RkZXJyLCAiIDogc3ludGF4IG5vdCByZWNvZ25pemVkLi4uXG4iKTsKKwkJYnJlYWs7CisJfQorCisJLy8gSGVyZSB5b3UgaGF2ZSB0aGUgdG9rZW4gdGhhdCB3YXMgaW4gZXJyb3Igd2hpY2ggaWYgdGhpcyBpcworCS8vIHRoZSBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiB3aWxsIHRlbGwgeW91IHRoZSBsaW5lIGFuZCBvZmZzZXQKKwkvLyBhbmQgYWxzbyByZWNvcmQgdGhlIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lIGluIHRoZQorCS8vIGlucHV0IHN0cmVhbS4gWW91IGNvdWxkIHRoZXJlZm9yZSBwcmludCB0aGUgc291cmNlIGxpbmUgYW5kIHNvIG9uLgorCS8vIEdlbmVyYWxseSB0aG91Z2gsIEkgd291bGQgZXhwZWN0IHRoYXQgeW91ciBsZXhlci9wYXJzZXIgd2lsbCBrZWVwCisJLy8gaXRzIG93biBtYXAgb2YgbGluZXMgYW5kIHNvdXJjZSBwb2ludGVycyBvciB3aGF0ZXZlciBhcyB0aGVyZQorCS8vIGFyZSBhIGxvdCBvZiBzcGVjaWZpYyB0aGluZ3MgeW91IG5lZWQgdG8ga25vdyBhYm91dCB0aGUgaW5wdXQKKwkvLyB0byBkbyBzb21ldGhpbmcgbGlrZSB0aGF0LgorCS8vIEhlcmUgaXMgd2hlcmUgeW91IGRvIGl0IHRob3VnaCA6LSkuCisJLy8KK30KKworCit9CisKKy8qCitAcGFyc2VyOjphcGlmdW5jcworeworCS8vIEluc3RhbGwgY3VzdG9tIGVycm9yIG1lc3NhZ2UgZGlzcGxheQorCS8vCisgICAgUkVDT0dOSVpFUi0+ZGlzcGxheVJlY29nbml0aW9uRXJyb3IgPSBmbWxEaXNwbGF5UmVjb2duaXRpb25FcnJvcjsKK30KKyovCisKKworLy8gTUFJTiBSVUxFCitmb3JtYWxNTFsgc2VwOjpXT2JqZWN0TWFuYWdlciAmIGFXT2JqZWN0TWFuYWdlciBdCityZXR1cm5zIFsgc2VwOjpTeXN0ZW0gKiBzcGVjIF0KK0Bpbml0eworCW1XT2JqZWN0TWFuYWdlciA9ICYoIGFXT2JqZWN0TWFuYWdlciApOworCisJc3BlYyA9IE5VTEw7Cit9CitAYWZ0ZXJ7CisJc3BlYy0+c2V0V09iamVjdChESVZFUklUWV9QUk9MT0cpOworfQorCTogcHJvbG9ndWVfZm1sCisJICAoIHM9ZGVmX3N5c3RlbSAgIHsgJHNwZWMgPSAkcy5zeXM7ICB9CisvLwkgIHwgcD1kZWZfcGFja2FnZSAgeyAkc3BlYyA9ICRwLnBhY2s7ICB9CisJICApCisJOworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBzZWN0aW9uIFBST0xPR1VFCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitwcm9sb2d1ZV9mbWwKK0Bpbml0eworCXN0ZDo6c3RyaW5nIGF0dHJJRDsKK30KKwk6ICggJ0Bmb3JtYWxtbCcgIHsgRElWRVJJVFlfUFJPTE9HID0gbVdPYmplY3RNYW5hZ2VyLT5uZXdXU2VxdWVuY2Uoc2VwOjpXT2JqZWN0OjpfTlVMTF8sICJmb3JtYWxtbCIgKTsgfQorCSAgfCAnQHhmbWwnICAgICAgeyBESVZFUklUWV9QUk9MT0cgPSBtV09iamVjdE1hbmFnZXItPm5ld1dTZXF1ZW5jZShzZXA6OldPYmplY3Q6Ol9OVUxMXywgInhmbWwiICAgICApOyB9CisJICB8ICdAZm1sJyAgICAgICB7IERJVkVSSVRZX1BST0xPRyA9IG1XT2JqZWN0TWFuYWdlci0+bmV3V1NlcXVlbmNlKHNlcDo6V09iamVjdDo6X05VTExfLCAiZm1sIiAgICAgICk7IH0KKwkgIHwgJ0BkaXZlcnNpdHknIHsgRElWRVJJVFlfUFJPTE9HID0gbVdPYmplY3RNYW5hZ2VyLT5uZXdXU2VxdWVuY2Uoc2VwOjpXT2JqZWN0OjpfTlVMTF8sICJkaXZlcnNpdHkiKTsgfQorCSAgfCAnQHhsaWEnICAgICAgeyBESVZFUklUWV9QUk9MT0cgPSBtV09iamVjdE1hbmFnZXItPm5ld1dTZXF1ZW5jZShzZXA6OldPYmplY3Q6Ol9OVUxMXywgInhsaWEiICAgICApOyB9CisJICB8ICdAeGZzcCcgICAgICB7IERJVkVSSVRZX1BST0xPRyA9IG1XT2JqZWN0TWFuYWdlci0+bmV3V1NlcXVlbmNlKHNlcDo6V09iamVjdDo6X05VTExfLCAieGZzcCIgICAgICk7IH0KKwkgICkgPworCSAgeworCSAgCWlmKCBESVZFUklUWV9QUk9MT0cgPT0gc2VwOjpXT2JqZWN0OjpfTlVMTF8gKQorCSAgCXsgRElWRVJJVFlfUFJPTE9HID0gbVdPYmplY3RNYW5hZ2VyLT5uZXdXU2VxdWVuY2Uoc2VwOjpXT2JqZWN0OjpfTlVMTF8sICJzeW1iZXgiKTsgfQorCSAgfQorCSAgTFRfCisJICAgICggJ3N5c3RlbScgICB7IGF0dHJJRCA9ICJzeXN0ZW0iOyAgfQorCSAgICB8ICdwYWNrYWdlJyAgeyBhdHRySUQgPSAicGFja2FnZSI7IH0KKwkgICAgfCBpZD1JRCAgICAgIHsgYXR0cklEID0gU1RSKCRpZC50ZXh0LT5jaGFycyk7IH0KKwkgICAgKQorCSAgICAoIEFTU0lHTiBpZD1JRAorCQl7CisJCQlESVZFUklUWV9QUk9MT0ctPmFwcGVuZCggbVdPYmplY3RNYW5hZ2VyLT5uZXdXUHJvcGVydHlJZGVudGlmaWVyKAorCQkJCQlESVZFUklUWV9QUk9MT0csIGF0dHJJRCwgU1RSKCRpZC50ZXh0LT5jaGFycykgKSApOworCQl9CisJICAgICk/CisJICAoIENPTU1BICggRmxvYXRMaXRlcmFsIHwgSUQgfCBTdHJpbmdMaXRlcmFsICkgKSoKKwkgIEdUCisJICBDT0xPTgorCSAgKCBwcm9sb2d1ZV9hdHRyaWJ1dGUgKT8KKwkgICggcHJvbG9ndWVfb3B0aW9ucyApPworCTsKKworCitwcm9sb2d1ZV9hdHRyaWJ1dGUKKwk6ICdAcGFja2FnZScgIEFTU0lHTiAgaWQ9SUQgIFNFTUkKKwl7CisJCURJVkVSSVRZX1BST0xPRy0+YXBwZW5kKCBtV09iamVjdE1hbmFnZXItPm5ld1dQcm9wZXJ0eUlkZW50aWZpZXIoCisJCQkJRElWRVJJVFlfUFJPTE9HLCAicGFja2FnZSIsIFNUUigkaWQudGV4dC0+Y2hhcnMpICkgKTsKKwl9CisKKwl8ICdAc3lzdGVtJyAgQVNTSUdOICBpZD1JRCAgU0VNSQorCXsKKwkJRElWRVJJVFlfUFJPTE9HLT5hcHBlbmQoIG1XT2JqZWN0TWFuYWdlci0+bmV3V1Byb3BlcnR5SWRlbnRpZmllcigKKwkJCQlESVZFUklUWV9QUk9MT0csICJzeXN0ZW0iLCBTVFIoJGlkLnRleHQtPmNoYXJzKSApICk7CisJfQorCTsKKworCitwcm9sb2d1ZV9vcHRpb25zCisJOiAnQG9wdGlvbnMnICBMQ1VSTFkKKwkJICAoIGlkPUlEIEFTU0lHTiBlPWV4cHJlc3Npb24gU0VNSQorCQkgIAl7IHNlcDo6UGFyc2VyVXRpbDo6c2V0UHJvbG9ndWVPcHRpb24oU1RSKCRpZC50ZXh0LT5jaGFycyksICRlLmJmKTsgfQorCQkgICkqCisJICBSQ1VSTFkKKwk7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIGZvcm0gTU9ESUZJRVIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vbW9kaWZpZXJfcHJvcGVydHlfc3BlY2lmaWVyCittb2RpZmllcl9kZWNsYXJhdGlvbgorcmV0dXJucyBbIHNlcDo6TW9kaWZpZXIgbWRmciBdCisJOiAoICdmaW5hbCcgICAgICAgICB7IG1kZnIuc2V0RmVhdHVyZUZpbmFsKCk7ICAgICB9CisvLwkgIHwgJ2NvbnN0JyAgICAgICAgIHsgbWRmci5zZXRGZWF0dXJlQ29uc3QoKTsgICAgIH0KKworCSAgfCAnc3RhdGljJyAgICAgICAgeyBtZGZyLnNldEZlYXR1cmVTdGF0aWMoKTsgICAgfQorCisJICB8ICd2b2xhdGlsZScgICAgICB7IG1kZnIuc2V0RmVhdHVyZVZvbGF0aWxlKCk7ICB9CisJICB8ICd0cmFuc2llbnQnICAgICB7IG1kZnIuc2V0RmVhdHVyZVRyYW5zaWVudCgpOyB9CisKKwkgIHwgJ3Vuc2FmZScgICAgICAgIHsgbWRmci5zZXRGZWF0dXJlVW5zYWZlKCk7ICAgIH0KKworCSAgfCAncmVmJyAgICAgICAgICAgeyBtZGZyLnNldE5hdHVyZVJlZmVyZW5jZSgpOyAgfQorLy8JICB8ICdtYWNybycgICAgICAgICB7IG1kZnIuc2V0TmF0dXJlTWFjcm8oKTsgICAgICB9CisKKwkgIHwgJ2JpbmQnICAgICAgICAgIHsgbWRmci5zZXROYXR1cmVCaW5kKCk7ICAgICAgIH0KKworCSAgfCAncHVibGljJyAgICAgICAgeyBtZGZyLnNldFZpc2liaWxpdHlQdWJsaWMoKTsgICAgfQorLy8JICB8ICdwcm90ZWN0ZWQnICAgICB7IG1kZnIuc2V0VmlzaWJpbGl0eVByb3RlY3RlZCgpOyB9CisJICB8ICdwcml2YXRlJyAgICAgICB7IG1kZnIuc2V0VmlzaWJpbGl0eVByaXZhdGUoKTsgICB9CisKKwkgIHwgbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dFsgbWRmciBdCisJICApKworCTsKKworCisvL21vZGlmaWVyX3BhcmFtZXRlcl9zcGVjaWZpZXIKK21vZGlmaWVyX2RpcmVjdGlvbgorcmV0dXJucyBbIHNlcDo6TW9kaWZpZXIgbWRmciBdCisJOiAoICctPicgIHwgJ2luJyAgfCAnaW5wdXQnICApICB7IG1kZnIuc2V0RGlyZWN0aW9uSW5wdXQoKTsgIH0KKwl8ICggJzwtJyAgfCAnb3V0JyB8ICdvdXRwdXQnICkgIHsgbWRmci5zZXREaXJlY3Rpb25PdXRwdXQoKTsgfQorCXwgKCAnPC0+JyB8ICdpbm91dCcgICkgICAgICAgICAgeyBtZGZyLnNldERpcmVjdGlvbklub3V0KCk7ICB9CisJfCAoICc8PScgIHwgJ3JldHVybicgKSAgICAgICAgICB7IG1kZnIuc2V0RGlyZWN0aW9uUmV0dXJuKCk7IH0KKwk7CisKK21vZGlmaWVyX2RpcmVjdGlvbl90ZXh0CityZXR1cm5zIFsgc2VwOjpNb2RpZmllciBtZGZyIF0KKwk6ICggJ2luJyAgfCAnaW5wdXQnICApICB7IG1kZnIuc2V0RGlyZWN0aW9uSW5wdXQoKTsgIH0KKwl8ICggJ291dCcgfCAnb3V0cHV0JyApICB7IG1kZnIuc2V0RGlyZWN0aW9uT3V0cHV0KCk7IH0KKwl8ICggJ2lub3V0JyAgKSAgICAgICAgICB7IG1kZnIuc2V0RGlyZWN0aW9uSW5vdXQoKTsgIH0KKwl8ICggJ3JldHVybicgKSAgICAgICAgICB7IG1kZnIuc2V0RGlyZWN0aW9uUmV0dXJuKCk7IH0KKwk7CisKK21vZGlmaWVyX3NldF9kaXJlY3Rpb25fc3RyaWN0X3RleHQKKy8qaW5vdXQqL1sgc2VwOjpNb2RpZmllciAmIG1kZnIgXQorCTogJ2lucHV0JyAgICB7IG1kZnIuc2V0RGlyZWN0aW9uSW5wdXQoKTsgIH0KKwl8ICdvdXRwdXQnICAgeyBtZGZyLnNldERpcmVjdGlvbk91dHB1dCgpOyB9CisJfCAnaW5vdXQnICAgIHsgbWRmci5zZXREaXJlY3Rpb25Jbm91dCgpOyAgfQorCXwgJ3JldHVybicgICB7IG1kZnIuc2V0RGlyZWN0aW9uUmV0dXJuKCk7IH0KKwk7CisKK21vZGlmaWVyX2RpcmVjdGlvbl9zeW1ib2wKK3JldHVybnMgWyBzZXA6Ok1vZGlmaWVyIG1kZnIgXQorCTogJy0+JyAgICB7IG1kZnIuc2V0RGlyZWN0aW9uSW5wdXQoKTsgIH0KKwl8ICc8LScgICAgeyBtZGZyLnNldERpcmVjdGlvbk91dHB1dCgpOyB9CisJfCAnPC0+JyAgIHsgbWRmci5zZXREaXJlY3Rpb25Jbm91dCgpOyAgfQorCXwgJzw9JyAgICB7IG1kZnIuc2V0RGlyZWN0aW9uUmV0dXJuKCk7IH0KKwk7CisKKworLy9tb2RpZmllcl9wYXJhbWV0ZXJfc3BlY2lmaWVyCittb2RpZmllcl9wYXJhbQorcmV0dXJucyBbIHNlcDo6TW9kaWZpZXIgbWRmciBdCisJOiBtPW1vZGlmaWVyX2RpcmVjdGlvbiAgeyBtZGZyID0gJG0ubWRmcjsgfQorCisJfCAnZmluYWwnICAgICAgICAgICB7IG1kZnIuc2V0RmVhdHVyZUZpbmFsKCk7ICAgIH0KKwl8ICdjb25zdCcgICAgICAgICAgIHsgbWRmci5zZXRGZWF0dXJlQ29uc3QoKTsgICAgfQorCisJfCAoICcmJyB8ICdyZWYnICkgICB7IG1kZnIuc2V0TmF0dXJlUmVmZXJlbmNlKCk7IH0KKwl8ICdtYWNybycgICAgICAgICAgIHsgbWRmci5zZXROYXR1cmVNYWNybygpOyAgICAgfQorCisJfCAnYmluZCcgICAgICAgICAgICB7IG1kZnIuc2V0TmF0dXJlQmluZCgpOyAgICAgIH0KKwk7CisKKworLy9tb2RpZmllcl9wcm9jZWR1cmVfc3BlY2lmaWVyCitwcm9jZWR1cmVfbW9kaWZpZXJfc3BlY2lmaWVyCityZXR1cm5zIFsgc2VwOjpNb2RpZmllciBtZGZyICwgc2VwOjpTcGVjaWZpZXIgc3BjZnIgXQorLy8JOiAoICdmaW5hbCcgICAgICAgICB7ICRtZGZyLnNldEZlYXR1cmVGaW5hbCgpOyAgICAgfQorCisvLwkgIHwgJ3ZvbGF0aWxlJyAgICAgIHsgJG1kZnIuc2V0RmVhdHVyZVZvbGF0aWxlKCk7ICB9CisvLwkgIHwgJ3RyYW5zaWVudCcgICAgIHsgJG1kZnIuc2V0RmVhdHVyZVRyYW5zaWVudCgpOyB9CisKKy8vCSAgfCAnbW9kZWwnICAgICAgICAgeyAkbWRmci5zZXREZXNpZ25Nb2RlbCgpOyAgICAgICAgICAgfQorLy8JICB8ICdwcm90b3R5cGUnICAgICB7ICRtZGZyLnNldERlc2lnblByb3RvdHlwZVN0YXRpYygpOyB9CisvLwkgIHwgJ2luc3RhbmNlJyAgICAgIHsgJG1kZnIuc2V0RGVzaWduSW5zdGFuY2VTdGF0aWMoKTsgIH0KKy8vCSAgfCAnZHluYW1pYycgICAgICAgeyAkbWRmci5zZXREZXNpZ25JbnN0YW5jZUR5bmFtaWMoKTsgfQorCisvLwkgIHwgJ21hY3JvJyAgICAgICAgIHsgJG1kZnIuc2V0TmF0dXJlTWFjcm8oKTsgfQorCisvLwkgIHwgJ3B1YmxpYycgICAgICAgIHsgJG1kZnIuc2V0VmlzaWJpbGl0eVB1YmxpYygpOyAgICB9CisvLwkgIHwgJ3Byb3RlY3RlZCcgICAgIHsgJG1kZnIuc2V0VmlzaWJpbGl0eVByb3RlY3RlZCgpOyB9CisvLwkgIHwgJ3ByaXZhdGUnICAgICAgIHsgJG1kZnIuc2V0VmlzaWJpbGl0eVByaXZhdGUoKTsgICB9CisKKworCTogKCAndGltZWQnICAgICAgICAgeyAkc3BjZnIuc2V0RmVhdHVyZVRpbWVkKCk7ICAgICAgICB9CisJICB8ICdpbnB1dF9lbmFibGVkJyB7ICRzcGNmci5zZXRGZWF0dXJlSW5wdXRFbmFibGVkKCk7IH0KKy8vCSAgfCAnbGlmZWxpbmUnICAgICAgeyAkc3BjZnIuc2V0RmVhdHVyZUxpZmVsaW5lKCk7ICAgICB9CisJICB8ICd1bnNhZmUnICAgICAgICB7ICRtZGZyLnNldEZlYXR1cmVVbnNhZmUoKTsgICAgICAgIH0KKwkgICkrCisJOworCisKK2V4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyCityZXR1cm5zIFsgc2VwOjpNb2RpZmllciBtZGZyICwgc2VwOjpTcGVjaWZpZXIgc3BjZnIgXQorLy8JOiAoICdmaW5hbCcgICAgICAgICB7ICRtZGZyLnNldEZlYXR1cmVGaW5hbCgpOyAgICAgfQorCisvLwkgIHwgJ3ZvbGF0aWxlJyAgICAgIHsgJG1kZnIuc2V0RmVhdHVyZVZvbGF0aWxlKCk7ICB9CisvLwkgIHwgJ3RyYW5zaWVudCcgICAgIHsgJG1kZnIuc2V0RmVhdHVyZVRyYW5zaWVudCgpOyB9CisKKwk6ICggJ21vZGVsJyAgICAgICAgIHsgJHNwY2ZyLnNldERlc2lnbk1vZGVsKCk7ICAgICAgICAgICB9CisJICB8ICdwcm90b3R5cGUnICAgICB7ICRzcGNmci5zZXREZXNpZ25Qcm90b3R5cGVTdGF0aWMoKTsgfQorLy8JICB8ICdpbnN0YW5jZScgICAgICB7ICRzcGNmci5zZXREZXNpZ25JbnN0YW5jZVN0YXRpYygpOyAgfQorCSAgfCAnZHluYW1pYycgICAgICAgeyAkc3BjZnIuc2V0RGVzaWduSW5zdGFuY2VEeW5hbWljKCk7IH0KKworLy8JICB8ICdtYWNybycgICAgICAgICB7ICRtZGZyLnNldE5hdHVyZU1hY3JvKCk7IH0KKy8vCSAgfCAnYmluZCcgICAgICAgICAgeyAkbWRmci5zZXROYXR1cmVCaW5kKCk7ICB9CisKKy8vCSAgfCAncHVibGljJyAgICAgICAgeyAkbWRmci5zZXRWaXNpYmlsaXR5UHVibGljKCk7ICAgICB9CisvLwkgIHwgJ3Byb3RlY3RlZCcgICAgIHsgJG1kZnIuc2V0VmlzaWJpbGl0eVByb3RlY3RlZCgpOyAgfQorLy8JICB8ICdwcml2YXRlJyAgICAgICB7ICRtZGZyLnNldFZpc2liaWxpdHlQcml2YXRlKCk7ICAgIH0KKworCSAgfCAndW5zYWZlJyAgICAgICAgeyAkbWRmci5zZXRGZWF0dXJlVW5zYWZlKCk7ICAgICAgICB9CisKKwkgIHwgJ3RpbWVkJyAgICAgICAgIHsgJHNwY2ZyLnNldEZlYXR1cmVUaW1lZCgpOyAgICAgICAgfQorCSAgfCAnaW5wdXRfZW5hYmxlZCcgeyAkc3BjZnIuc2V0RmVhdHVyZUlucHV0RW5hYmxlZCgpOyB9CisJICB8ICdsaWZlbGluZScgICAgICB7ICRzcGNmci5zZXRGZWF0dXJlTGlmZWxpbmUoKTsgICAgIH0KKwkgICkrCisJOworCitpbnN0YW5jZV9tb2RpZmllcl9zcGVjaWZpZXIKK3JldHVybnMgWyBzZXA6Ok1vZGlmaWVyIG1kZnIgLCBzZXA6OlNwZWNpZmllciBzcGNmciBdCisJOiAoICdmaW5hbCcgICAgICAgICB7ICRtZGZyLnNldEZlYXR1cmVGaW5hbCgpOyAgICAgfQorCisvLwkgIHwgJ3ZvbGF0aWxlJyAgICAgIHsgJG1kZnIuc2V0RmVhdHVyZVZvbGF0aWxlKCk7ICB9CisvLwkgIHwgJ3RyYW5zaWVudCcgICAgIHsgJG1kZnIuc2V0RmVhdHVyZVRyYW5zaWVudCgpOyB9CisKKy8vCSAgfCAnbW9kZWwnICAgICAgICAgeyAkc3BjZnIuc2V0RGVzaWduTW9kZWwoKTsgICAgICAgICAgIH0KKy8vCSAgfCAncHJvdG90eXBlJyAgICAgeyAkc3BjZnIuc2V0RGVzaWduUHJvdG90eXBlU3RhdGljKCk7IH0KKy8vCSAgfCAnaW5zdGFuY2UnICAgICAgeyAkc3BjZnIuc2V0RGVzaWduSW5zdGFuY2VTdGF0aWMoKTsgIH0KKwkgIHwgJ2R5bmFtaWMnICAgICAgIHsgJHNwY2ZyLnNldERlc2lnbkluc3RhbmNlRHluYW1pYygpOyB9CisKKy8vCSAgfCAnbWFjcm8nICAgICAgICAgeyAkbWRmci5zZXROYXR1cmVNYWNybygpOyB9CisvLwkgIHwgJ2JpbmQnICAgICAgICAgIHsgJG1kZnIuc2V0TmF0dXJlQmluZCgpOyAgfQorCisJICB8ICdwdWJsaWMnICAgICAgICB7ICRtZGZyLnNldFZpc2liaWxpdHlQdWJsaWMoKTsgICAgfQorCSAgfCAncHJvdGVjdGVkJyAgICAgeyAkbWRmci5zZXRWaXNpYmlsaXR5UHJvdGVjdGVkKCk7IH0KKwkgIHwgJ3ByaXZhdGUnICAgICAgIHsgJG1kZnIuc2V0VmlzaWJpbGl0eVByaXZhdGUoKTsgICB9CisKKwkgIHwgJ3Vuc2FmZScgICAgICAgIHsgJG1kZnIuc2V0RmVhdHVyZVVuc2FmZSgpOyAgICAgICB9CisKKwkgIHwgJ3RpbWVkJyAgICAgICAgIHsgJHNwY2ZyLnNldEZlYXR1cmVUaW1lZCgpOyAgICAgICAgfQorCSAgfCAnaW5wdXRfZW5hYmxlZCcgeyAkc3BjZnIuc2V0RmVhdHVyZUlucHV0RW5hYmxlZCgpOyB9CisJICB8ICdsaWZlbGluZScgICAgICB7ICRzcGNmci5zZXRGZWF0dXJlTGlmZWxpbmUoKTsgICAgIH0KKwkgICkrCisJOworCisKKy8vbW9kaWZpZXJfdHJhbnNpdGlvbl9zcGVjaWZpZXIKK21vZGlmaWVyX3RyYW5zaXRpb24KK3JldHVybnMgWyBzZXA6Ok1vZGlmaWVyIG1kZnIgLCBzZXA6OlNwZWNpZmllciBzcGNmciBdCisvLwk6ICggJ2ZpbmFsJyAgICAgICAgIHsgJG1kZnIuc2V0RmVhdHVyZUZpbmFsKCk7ICAgICAgICAgfQorCisvLwkgIHwgJ3ZvbGF0aWxlJyAgICAgIHsgJG1kZnIuc2V0RmVhdHVyZVZvbGF0aWxlKCk7ICAgICAgfQorCTogKCAndHJhbnNpZW50JyAgICAgeyAkbWRmci5zZXRGZWF0dXJlVHJhbnNpZW50KCk7ICAgICB9CisKKy8vCSAgfCAndW5zYWZlJyAgICAgICAgeyAkbWRmci5zZXRGZWF0dXJlVW5zYWZlKCk7ICAgICAgICB9CisKKwkgIHwgJ3RpbWVkJyAgICAgICAgIHsgJHNwY2ZyLnNldEZlYXR1cmVUaW1lZCgpOyAgICAgICAgfQorCSAgfCAnaW5wdXRfZW5hYmxlZCcgeyAkc3BjZnIuc2V0RmVhdHVyZUlucHV0RW5hYmxlZCgpOyB9CisJICApKworCTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gc2VjdGlvbiBQQUNLQUdFCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitkZWZfcGFja2FnZQorcmV0dXJucyBbIHNlcDo6UGFja2FnZSAqIHBhY2sgXQorQGFmdGVyeworCVBPUF9DVFg7CisKKwlzZXA6OlBhcnNlclV0aWw6OmRlY2xhcmVEZWZhdWx0RW5kaW5nU3RhdGVJZk5lZWQobmVlZERlZmF1bHRTdGF0ZUZpbmFsLAorCQkJbmVlZERlZmF1bHRTdGF0ZVRlcm1pbmFsLCBuZWVkRGVmYXVsdFN0YXRlUmV0dXJuKTsKK30KKwk6ICdwYWNrYWdlJyBpZD1JRAorCSAgICB7IFBVU0hfQ1RYX0NQTSggJHBhY2sgPSBuZXcgc2VwOjpQYWNrYWdlKFNUUigkaWQudGV4dC0+Y2hhcnMpKSApOyB9CisKKwkgICAgKCBTdHJpbmdMaXRlcmFsCisJICAgIHsgJHBhY2stPnNldFVucmVzdHJpY3RlZE5hbWUoU1RSKCRTdHJpbmdMaXRlcmFsLnRleHQtPmNoYXJzKSk7IH0KKwkgICAgKT8KKworCSAgTENVUkxZCisJICBzZWN0aW9uX2hlYWRlclsgcGFjayBdID8KKwkgIHNlY3Rpb25faW1wb3J0WyBwYWNrIF0gPworCisJICAoIHNlY3Rpb25fcHJvcGVydHlbIHBhY2sgXSApKgorCisJICAoIHNlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZVsgcGFjayBdICkqCisJICBSQ1VSTFkKKwk7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNZU1RFTSBTUEVDSUZDQVRJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2RlZl9zeXN0ZW0KK3JldHVybnMgWyBzZXA6OlN5c3RlbSAqIHN5cyBdCitAaW5pdHsKKwkgc2VwOjpNb2RpZmllciBtZGZyOworCisJc2VwOjpTcGVjaWZpZXIgc3BjZnIoIHNlcDo6U3BlY2lmaWVyOjpDT01QT05FTlRfU1lTVEVNX0tJTkQgKTsKKworCVNBVkVfUlVMRV9CRUdJTl9MT0NBVElPTjsKK30KK0BhZnRlcnsKKwlQT1BfQ1RYOworCisJc2VwOjpQYXJzZXJVdGlsOjpkZWNsYXJlRGVmYXVsdEVuZGluZ1N0YXRlSWZOZWVkKG5lZWREZWZhdWx0U3RhdGVGaW5hbCwKKwkJCW5lZWREZWZhdWx0U3RhdGVUZXJtaW5hbCwgbmVlZERlZmF1bHRTdGF0ZVJldHVybik7CisKKwlTRVRfUlVMRV9MT0NBVElPTihzeXMpOworfQorCTogKCBtcz1leGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllcgorCSAgeyBtZGZyID0gJG1zLm1kZnI7IHNwY2ZyLmlmbm90X2RlZmluZSggJG1zLnNwY2ZyICk7IH0KKwkgICk/ICAnc3lzdGVtJworCisJICAoIExUXyAoICdtb2M6JyApPyAgZXhlY3V0YWJsZV9zcGVjaWZpZXJbIHNwY2ZyIF0gR1QgKT8KKwkgIGlkPUlECisJICB7CisJICAJUFVTSF9DVFhfQ1BNKCBfU1lTVEVNXyA9ICRzeXMgPSBuZXcgc2VwOjpTeXN0ZW0oU1RSKCRpZC50ZXh0LT5jaGFycykpICk7CisKKwkgIAkkc3lzLT5nZXR3TW9kaWZpZXIoKS5vdmVycmlkZV9pZmRlZiggbWRmciApOworCisJICAJJHN5cy0+Z2V0d1NwZWNpZmllcigpLmlmbm90X2RlZmluZSggc3BjZnIgKTsKKwkgIH0KKworCSAgKCBTdHJpbmdMaXRlcmFsCisJICB7ICRzeXMtPnNldFVucmVzdHJpY3RlZE5hbWUoU1RSKCRTdHJpbmdMaXRlcmFsLnRleHQtPmNoYXJzKSk7IH0KKwkgICk/CisKKwkgIExDVVJMWQorCisvLwkgIHNlY3Rpb25faGVhZGVyX2ltcG9ydF9wYXJhbWV0ZXJfcHJvcGVydHlbIHN5cyBdCisKKwkgIHNlY3Rpb25faGVhZGVyWyBzeXMgXSA/CisJICBzZWN0aW9uX2ltcG9ydFsgc3lzIF0gPworCisJICAoIHNlY3Rpb25fcGFyYW1ldGVyWyBzeXMgXSApKgorCisJICAvLyBDb25kaXRpb25hbCBUZW1wbGF0ZSBDb2RlIEdlbmVyYXRpb24gZm9yIEBkZWNsYXJhdGlvbgorCSAgeyAgc2VwOjpUZW1wbGF0ZUZhY3Rvcnk6OmdlblByb3BlcnR5KHN5cyk7IH0KKworCSAgKCBzZWN0aW9uX3Byb3BlcnR5WyBzeXMgXSApKgorCisJICAoIHNlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZVsgc3lzIF0gKSoKKworCSAgKCBzZWN0aW9uX2JlaGF2aW9yWyBzeXMgXQorCSAgfCBzZWN0aW9uX3N0YXRlbWFjaGluZVsgc3lzIF0KKwkgICk/CisJICAKKwkgIC8vIENvbmRpdGlvbmFsIFRlbXBsYXRlIENvZGUgR2VuZXJhdGlvbiBmb3IgQG1vZQorCSAgeyAgc2VwOjpUZW1wbGF0ZUZhY3Rvcnk6OmdlbkJlaGF2aW9yKHN5cyk7IH0KKworCSAgKCBzZWN0aW9uX21vZGVsX29mX2NvbXB1dGF0aW9uWyBzeXMgXQorCSAgfCBzZWN0aW9uX21vZGVsX29mX2ludGVyYWN0aW9uWyBzeXMgXQorCSAgfCBzZWN0aW9uX21vZGVsX29mX2V4ZWN1dGlvblsgc3lzIF0KKwkgICkqCisJICBSQ1VSTFkKKwk7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIE5FVyBbIFsgRlVMTFkgXSBRVUFMSUZJRUQgXSBOQU1FIElECisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitxdWFsaWZpZWROYW1lSUQKK3JldHVybnMgWyBzdGQ6OnN0cmluZyBzICwgc2VwOjphdm1fc2l6ZV90IG5iID0gMSBdCitAaW5pdHsKKwljcExPQ0FUT1IuY2xlYXIoKTsKKwljcFFOSUQuY2xlYXIoKTsKK30KKwk6IGlkPUlEICAgICAgIHsgJHMgPSBTVFIoJGlkLnRleHQtPmNoYXJzKTsgfQorCSAgKCAoIERPVCAgICAgeyBjcFFOSUQucHVzaF9iYWNrKCRzKTsgJHMgPSAkcyArICIuIiA7ICArKyRuYjsgfQorLy8JICAgIHwgQ09MT04gICB7ICRzID0gJHMgKyAiOiIgOyB9CisJICAgIHwgQ09MT054MiB7IGNwTE9DQVRPUiA9ICRzOyBjcFFOSUQuY2xlYXIoKTsgJHMgPSAkcyArICI6OiI7IH0KKwkgICAgKQorCSAgICBpZD1JRCAgICAgeyBjcFFOSUQucHVzaF9iYWNrKFNUUl9JRCgkaWQpKTsgICRzID0gJHMgKyBTVFJfSUQoJGlkKTsgfQorCSAgKSoKKwk7CisKKworaW50ZWdlcl9jb25zdGFudAorcmV0dXJucyBbIHNlcDo6YXZtX3NpemVfdCB2YWwgXQorCTogbj1JbnRlZ2VyTGl0ZXJhbAorCXsgJHZhbCA9IE5VTV9JTlQoJG4udGV4dC0+Y2hhcnMpOyB9CisKKwl8IGNpZD1xdWFsaWZpZWROYW1lSUQKKwl7ICR2YWwgPSBzZXA6OlBhcnNlclV0aWw6OmdldEludGVnZXJDb25zdGFudCgkY2lkLnMsICRjaWQubmIpOyB9CisJOworCisKK2Zsb2F0X2NvbnN0YW50CityZXR1cm5zIFsgc2VwOjphdm1fZmxvYXRfdCB2YWwgXQorCTogZj1GbG9hdExpdGVyYWwKKwl7ICR2YWwgPSBOVU1fRkxPQVQoJGYudGV4dC0+Y2hhcnMpOyB9CisKKwl8IGNpZD1xdWFsaWZpZWROYW1lSUQKKwl7ICR2YWwgPSBzZXA6OlBhcnNlclV0aWw6OmdldEZsb2F0Q29uc3RhbnQoJGNpZC5zLCAkY2lkLm5iKTsgfQorCTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gc2VjdGlvbiBIRUFERVIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3NlY3Rpb25faGVhZGVyIFsgc2VwOjpNYWNoaW5lICogY29udGFpbmVyIF0KKwk6ICdAaGVhZGVyOicKKwk7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIHNlY3Rpb24gSU1QT1JUCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzZWN0aW9uX2ltcG9ydCBbIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lciBdCisJOiAnQGltcG9ydDonICggaW5jbHVkZV9wYWNrYWdlICkrCisJOworCitpbmNsdWRlX3BhY2thZ2UKKwk6ICdAaW5jbHVkZScKKwkgICggU3RyaW5nTGl0ZXJhbCAgU0VNSQorCSAgfCBMQ1VSTFkgICggU3RyaW5nTGl0ZXJhbCApKyAgUkNVUkxZCisJICApCisJOworCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEVYRUNVVEFCTEUgU1BFQ0lGQ0FUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLyoKK2V4ZWN1dGFibGVfc3BlY2lmaWNhdGlvbgorLyogaW4gKiBbIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lciAsCisJCXNlcDo6TW9kaWZpZXIgbWRmciAsIHNlcDo6U3BlY2lmaWVyIHNwY2ZyIF0KK3JldHVybnMgWyBzZXA6Ok1hY2hpbmUgKiBtYWNoaW5lIF0KK0Bpbml0eworCXNlcDo6YXZtX3NpemVfdCBpbml0aWFsQ291bnQgPSAxOworCXNlcDo6YXZtX3NpemVfdCBtYXhpbWFsQ291bnQgPSBBVk1fTlVNRVJJQ19NQVhfU0laRV9UOworCisJU0FWRV9SVUxFX0JFR0lOX0xPQ0FUSU9OOworfQorQGFmdGVyeworCVBPUF9DVFg7CisKKwlTRVRfUlVMRV9MT0NBVElPTihtYWNoaW5lKTsKK30KKwk6ICdleGVjdXRhYmxlJworCSAgKCBMVF8KKwkgIAkoICggJ21vYzonICk/ICBleGVjdXRhYmxlX3NwZWNpZmllclsgc3BjZnIgXQorCSAJICAoIENPTU1BICBkZWZfaW5zdGFuY2VfY291bnRbIGluaXRpYWxDb3VudCAsIG1heGltYWxDb3VudCBdICk/CisKKwkgIAl8IGRlZl9pbnN0YW5jZV9jb3VudFsgaW5pdGlhbENvdW50ICwgbWF4aW1hbENvdW50IF0KKwkgIAkpPworCSAgR1QgKT8KKwkgIGlkPUlECisJICB7CisJICAJUFVTSF9DVFhfQ1BNKCAkbWFjaGluZSA9IHNlcDo6TWFjaGluZTo6bmV3RXhlY3V0YWJsZSgKKwkgIAkJCWNvbnRhaW5lciwgU1RSKCRpZC50ZXh0LT5jaGFycyksIHNwY2ZyKSApOworCisJCSRtYWNoaW5lLT5nZXR3TW9kaWZpZXIoKS5vdmVycmlkZV9pZmRlZiggbWRmciApOworCisJICAJY29udGFpbmVyLT5zYXZlT3duZWRFbGVtZW50KCAkbWFjaGluZSApOworCisJCSRtYWNoaW5lLT5nZXRVbmlxSW5zdGFuY2VTcGVjaWZpZXIoKQorCQkJCS0+c2V0SW5zdGFuY2VDb3VudChpbml0aWFsQ291bnQsIG1heGltYWxDb3VudCk7CisJICB9CisKKwkgICggU3RyaW5nTGl0ZXJhbAorCSAgeyAkbWFjaGluZS0+c2V0VW5yZXN0cmljdGVkTmFtZShTVFIoJFN0cmluZ0xpdGVyYWwudGV4dC0+Y2hhcnMpKTsgfQorCSAgKT8KKworCSAgZGVmX21hY2hpbmVfcGFyYW1ldGVyc1sgbWFjaGluZSAsIHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX1BBUkFNRVRFUl9NT0RJRklFUiBdID8KKworCSAgZGVmX21hY2hpbmVfcmV0dXJuc1sgbWFjaGluZSAsIHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX1JFVFVSTl9QQVJBTUVURVJfTU9ESUZJRVIgXSA/CisKKwkgIGRlZl9ib2R5X21hY2hpbmVbIG1hY2hpbmUgXQorCTsKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBGTEFUVEVORUQgU1BFQ0lGSUNBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworZXhlY3V0YWJsZV9jb21wb25lbnQgWyBdCityZXR1cm5zCisJOgorCTsKKyovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBzZWN0aW9uIFBST0NFRFVSRQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc2VjdGlvbl9wcm9jZWR1cmUgWyBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIgXQorCTogJ0Bwcm9jZWR1cmU6JworCSAgKCBwPWRlZl9wcm9jZWR1cmVbIGNvbnRhaW5lciBdICkqCisJOworCisKK2RlZl9wcm9jZWR1cmUgWyBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIgXQorcmV0dXJucyBbIHNlcDo6TWFjaGluZSAqIHByb2NlZHVyZSBdCitAaW5pdHsKKwlzZXA6Ok1vZGlmaWVyIG1kZnI7CisKKwlzZXA6OlNwZWNpZmllciBzcGNmciggc2VwOjpTcGVjaWZpZXI6OkVYRUNVVEFCTEVfUFJPQ0VEVVJFX01PREVMX1NQRUNJRklFUiApOworCisJU0FWRV9SVUxFX0JFR0lOX0xPQ0FUSU9OOworfQorQGFmdGVyeworCVBPUF9DVFg7CisKKwlzZXA6OlBhcnNlclV0aWw6OmNoZWNrUHJvY2VkdXJlQ29tcG9zaXRlTW9jS2luZChwcm9jZWR1cmUpOworCisJU0VUX1JVTEVfTE9DQVRJT04ocHJvY2VkdXJlKTsKK30KKwk6ICggbXM9cHJvY2VkdXJlX21vZGlmaWVyX3NwZWNpZmllcgorCSAgeyBtZGZyLm92ZXJyaWRlX2lmZGVmKCAkbXMubWRmciApOyBzcGNmci5vdmVycmlkZV9pZmRlZiggJG1zLnNwY2ZyICk7IH0KKwkgICk/CisJICAncHJvY2VkdXJlJworCSAgKCBMVF8gKCAnbW9jOicgKT8gIGV4ZWN1dGFibGVfc3BlY2lmaWVyWyBzcGNmciBdICBHVCApPworCSAgaWQ9SUQKKwkgIHsKKwkJUFVTSF9DVFhfQ1BNKCAkcHJvY2VkdXJlID0gc2VwOjpNYWNoaW5lOjpuZXdQcm9jZWR1cmUoCisJCQkJY29udGFpbmVyLCBTVFIoJGlkLnRleHQtPmNoYXJzKSwgc3BjZnIpICk7CisKKwkJJHByb2NlZHVyZS0+Z2V0d01vZGlmaWVyKCkub3ZlcnJpZGVfaWZkZWYoIG1kZnIgKTsKKworCQljb250YWluZXItPnNhdmVPd25lZEVsZW1lbnQoICRwcm9jZWR1cmUgKTsKKwkgIH0KKworCSAgKCBTdHJpbmdMaXRlcmFsCisJICB7ICRwcm9jZWR1cmUtPnNldFVucmVzdHJpY3RlZE5hbWUoU1RSKCRTdHJpbmdMaXRlcmFsLnRleHQtPmNoYXJzKSk7IH0KKwkgICk/CisKKwkgIGRlZl9tYWNoaW5lX3BhcmFtZXRlcnNbIHByb2NlZHVyZSBdID8KKworCSAgZGVmX21hY2hpbmVfcmV0dXJuc1sgcHJvY2VkdXJlICwKKwkgIAkJc2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfUkVUVVJOX1BBUkFNRVRFUl9NT0RJRklFUiBdID8KKworCSAgZGVmX2JvZHlfcHJvY2VkdXJlWyBwcm9jZWR1cmUgXQorCTsKKworCitkZWZfbWFjaGluZV9wYXJhbWV0ZXJzIFsgc2VwOjpNYWNoaW5lICogbWFjaGluZSBdCitAaW5pdHsKKwlzZXA6OmF2bV9vZmZzZXRfdCBvZmZzZXQgPSAwOworCXNlcDo6TW9kaWZpZXIgbWRmciA9IHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX1BBUkFNRVRFUl9NT0RJRklFUjsKKworCXNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5ID0gbWFjaGluZS0+Z2V0UHJvcGVydHlQYXJ0KCk7Cit9CisJOiBMQlJBQ0tFVCAgZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b21bIGRlY2xQcm9wZXJ0eSAsIG1kZnIgLCBvZmZzZXQgXQorCSAgKCBDT01NQSAgIGRlZl9tYWNoaW5lX3ZhcmlhYmxlX3BhcmFtZXRlcl9hdG9tWyBkZWNsUHJvcGVydHkgLCBtZGZyICwgKytvZmZzZXQgXSApKgorCSAgUkJSQUNLRVQKKworCXwgTFBBUkVOICAgZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b21bIGRlY2xQcm9wZXJ0eSAsIG1kZnIgLCBvZmZzZXQgXQorCSAgKCBDT01NQSAgZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b21bIGRlY2xQcm9wZXJ0eSAsIG1kZnIgLCArK29mZnNldCBdICkqCisJICBSUEFSRU4KKwk7CisKKworZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b20KKy8qIGluICovWyBzZXA6OlByb3BlcnR5UGFydCAmIHBhcmFtRGVjbCAsCisJCXNlcDo6TW9kaWZpZXIgbWRmciAsIHNlcDo6YXZtX29mZnNldF90IG9mZnNldCBdCitAaW5pdHsKKwlzZXA6OlZhcmlhYmxlICogdmFyaWFibGU7CisJc2VwOjpNYWNoaW5lICogbWFjaGluZSA9IHBhcmFtRGVjbC5nZXRDb250YWluZXIoKS0+YXM8IHNlcDo6TWFjaGluZSA+KCk7CisJc2VwOjpCRiBwYXJhbVQgPSBzZXA6OlR5cGVNYW5hZ2VyOjpVTklWRVJTQUw7CisJc3RkOjpzdHJpbmcgcGFyYW1JRDsKKwlzZXA6OkJGIHZhbHVlOworfQorCTogKCBtPW1vZGlmaWVyX3BhcmFtIHsgbWRmci5vdmVycmlkZV9pZmRlZiggJG0ubWRmciApOyB9ICk/CisJICB0dj10eXBlX3ZhciB7IHBhcmFtVCA9ICR0di50eXBlOyB9CisJICAoIGlkPUlEICAgICB7IHBhcmFtSUQgPSBTVFIoJGlkLnRleHQtPmNoYXJzKTsgfQorCSAgICAoIGl2PWluaXRpYWxfdmFsdWUgIHsgdmFsdWUgPSAkaXYuYmY7IH0gKT8KKwkgICk/CisJICB7CisJCXBhcmFtRGVjbC5zYXZlT3duZWRWYXJpYWJsZSggdmFyaWFibGUgPSBuZXcgc2VwOjpWYXJpYWJsZSgKKwkJCQltYWNoaW5lLCBtZGZyLCBwYXJhbVQsIHBhcmFtSUQsIHZhbHVlICkgKTsKKwkgIH0KKworCXwgJ2JpbmQ6JworCSAgKCAoIHR5cGVfdmFyIENPTE9OICApID0+ICB0dj10eXBlX3ZhciBDT0xPTiB7IHBhcmFtVCA9ICR0di50eXBlOyB9CisJICAgIGU9ZXhwcmVzc2lvbiB7IHZhbHVlID0gJGUuYmY7IH0KKwkgIHwgdmlkPXF1YWxpZmllZE5hbWVJRAorCSAgeworCSAgCXZhbHVlID0gc2VwOjpQYXJzZXJVdGlsOjpnZXRWYXJpYWJsZSgkdmlkLnMsICR2aWQubmIpOworCSAgCWlmKCB2YWx1ZS52YWxpZCgpICkgeyBwYXJhbVQgPSB2YWx1ZS50b19wdHI8IHNlcDo6VmFyaWFibGUgPigpLT5nZXRUeXBlKCk7IH0KKwkgIH0KKwkgICkKKwkgIHsKKwkJcGFyYW1JRCA9IHNlcDo6T1NTKCkgPDwgJyMnIDw8IG9mZnNldDsKKwkJcGFyYW1EZWNsLnNhdmVPd25lZFZhcmlhYmxlKCB2YXJpYWJsZSA9IG5ldyBzZXA6OlZhcmlhYmxlKG1hY2hpbmUsCisJCQkJCQltZGZyLmFkZE5hdHVyZUtpbmQoIHNlcDo6TW9kaWZpZXI6Ok5BVFVSRV9CSU5EX0tJTkQgKSwKKwkJCQkJCXBhcmFtVCwgcGFyYW1JRCwgdmFsdWUgKSApOworCisJCXZhcmlhYmxlLT5zZXRPZmZzZXQoIG9mZnNldCApOworCSAgfQorCTsKKworCitkZWZfbWFjaGluZV9yZXR1cm5zCisvKiBpbiAqL1sgc2VwOjpNYWNoaW5lICogbWFjaGluZSAsIHNlcDo6TW9kaWZpZXIgbWRmciBdCitAaW5pdHsKKwlzZXA6OmF2bV9vZmZzZXRfdCBvZmZzZXQgPSAwOworCW1kZnIuc2V0RGlyZWN0aW9uS2luZCggc2VwOjpNb2RpZmllcjo6RElSRUNUSU9OX1JFVFVSTl9LSU5EICk7CisJc2VwOjpCRiB2YWx1ZTsKKworCXNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5ID0gbWFjaGluZS0+Z2V0UHJvcGVydHlQYXJ0KCk7Cit9CisJOiAoICctLT4nIHwgJ3JldHVybnM6JyApCisJICAoICggTEJSQUNLRVQgIGRlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tWyBkZWNsUHJvcGVydHkgLCBtZGZyICwgb2Zmc2V0XQorCSAgICAgICggQ09NTUEgICBkZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbVsgZGVjbFByb3BlcnR5ICwgbWRmciAsICsrb2Zmc2V0IF0gKSoKKwkgICAgICBSQlJBQ0tFVAorCSAgICApCisKKwkgIHwgKCBMUEFSRU4gICBkZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbVsgZGVjbFByb3BlcnR5ICwgbWRmciAsIG9mZnNldF0KKwkgICAgICAoIENPTU1BICBkZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbVsgZGVjbFByb3BlcnR5ICwgbWRmciAsICsrb2Zmc2V0IF0gKSoKKwkgICAgICBSUEFSRU4KKwkgICAgKQorCisJICB8IHR2PXR5cGVfdmFyICggaXY9aW5pdGlhbF92YWx1ZSAgeyB2YWx1ZSA9ICRpdi5iZjsgfSApPworCSAgeworCQlzZXA6OlZhcmlhYmxlICogdmFyaWFibGUgPQorCQkJCW5ldyBzZXA6OlZhcmlhYmxlKG1hY2hpbmUsIG1kZnIsICR0di50eXBlLCAiIzAiLCB2YWx1ZSk7CisKKwkJZGVjbFByb3BlcnR5LnNhdmVPd25lZFZhcmlhYmxlKCB2YXJpYWJsZSApOworCSAgfQorCSAgKQorCTsKKworCitkZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbQorLyogaW4gKi9bIHNlcDo6UHJvcGVydHlQYXJ0ICYgcGFyYW1EZWNsICwKKwkJc2VwOjpNb2RpZmllciBtZGZyICwgc2VwOjphdm1fb2Zmc2V0X3Qgb2Zmc2V0IF0KK0Bpbml0eworCXNlcDo6VmFyaWFibGUgKiB2YXJpYWJsZTsKKwlzZXA6Ok1hY2hpbmUgKiBtYWNoaW5lID0gcGFyYW1EZWNsLmdldENvbnRhaW5lcigpLT5hczwgc2VwOjpNYWNoaW5lID4oKTsKKwlzZXA6OkJGIHBhcmFtVCA9IHNlcDo6VHlwZU1hbmFnZXI6OlVOSVZFUlNBTDsKKwlzdGQ6OnN0cmluZyBwYXJhbUlEOworCXNlcDo6QkYgdmFsdWU7Cit9CisJOiAoIG09bW9kaWZpZXJfcGFyYW0geyBtZGZyLm92ZXJyaWRlX2lmZGVmKCAkbS5tZGZyICk7IH0gKT8KKwkgIHR2PXR5cGVfdmFyIHsgcGFyYW1UID0gJHR2LnR5cGU7IH0KKwkgICggaWQ9SUQgICAgIHsgcGFyYW1JRCA9IFNUUigkaWQudGV4dC0+Y2hhcnMpOyB9CisJICAgICggaXY9aW5pdGlhbF92YWx1ZSAgeyB2YWx1ZSA9ICRpdi5iZjsgfSApPworCSAgKT8KKwkgIHsKKwkJcGFyYW1EZWNsLnNhdmVPd25lZFZhcmlhYmxlKCB2YXJpYWJsZSA9CisJCQkJbmV3IHNlcDo6VmFyaWFibGUobWFjaGluZSwgbWRmciwgcGFyYW1ULCBwYXJhbUlELCB2YWx1ZSkgKTsKKwkgIH0KKworCXwgJ2JpbmQ6JworCSAgKCAoIHR5cGVfdmFyIENPTE9OICApID0+ICB0dj10eXBlX3ZhciBDT0xPTiB7IHBhcmFtVCA9ICR0di50eXBlOyB9CisJICAgIGU9ZXhwcmVzc2lvbiB7IHZhbHVlID0gJGUuYmY7IH0KKwkgIHwgdmlkPXF1YWxpZmllZE5hbWVJRAorCSAgeworCSAgCXZhbHVlID0gc2VwOjpQYXJzZXJVdGlsOjpnZXRWYXJpYWJsZSgkdmlkLnMsICR2aWQubmIpOworCSAgCWlmKCB2YWx1ZS52YWxpZCgpICkgeyBwYXJhbVQgPSB2YWx1ZS50b19wdHI8IHNlcDo6VmFyaWFibGUgPigpLT5nZXRUeXBlKCk7IH0KKwkgIH0KKwkgICkKKwkgIHsKKwkJcGFyYW1JRCA9IHNlcDo6T1NTKCkgPDwgJyMnIDw8IG9mZnNldDsKKworCQl2YXJpYWJsZSA9IG5ldyBzZXA6OlZhcmlhYmxlKG1hY2hpbmUsCisJCQkJbWRmci5hZGROYXR1cmVLaW5kKCBzZXA6Ok1vZGlmaWVyOjpOQVRVUkVfQklORF9LSU5EICksCisJCQkJcGFyYW1ULCBwYXJhbUlELCB2YWx1ZSk7CisKKwkJcGFyYW1EZWNsLnNhdmVPd25lZFZhcmlhYmxlKCB2YXJpYWJsZSApOworCisJCXZhcmlhYmxlLT5zZXRPZmZzZXQoIG9mZnNldCApOworCSAgfQorCTsKKworCisKK2RlZl9ib2R5X3Byb2NlZHVyZSBbIHNlcDo6TWFjaGluZSAqIHByb2NlZHVyZSBdCisJOiBMQ1VSTFkKKwkgICggKCBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJlZGljYXQgKSA9PgorCSAgICBkZWZfYm9keV9wcm9jZWR1cmVfc2VjdGlvblsgcHJvY2VkdXJlIF0KKworCSAgfCBkZWZfYm9keV9wcm9jZWR1cmVfc2ltcGxpZlsgcHJvY2VkdXJlIF0KKwkgICkKKwkgIFJDVVJMWQorCTsKKworZGVmX2JvZHlfcHJvY2VkdXJlX3NlY3Rpb24gWyBzZXA6Ok1hY2hpbmUgKiBwcm9jZWR1cmUgXQorCTogc2VjdGlvbl9oZWFkZXJbIHByb2NlZHVyZSBdID8KKwkgIHNlY3Rpb25faW1wb3J0WyBwcm9jZWR1cmUgXSA/CisKKwkgICggc2VjdGlvbl9wYXJhbWV0ZXJbIHByb2NlZHVyZSBdICkqCisKKwkgICggc2VjdGlvbl9wcm9wZXJ0eSBbIHByb2NlZHVyZSBdICkqCisKKwkgICggc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlWyBwcm9jZWR1cmUgXSApKgorCisJICAoIHNlY3Rpb25fYmVoYXZpb3JbIHByb2NlZHVyZSBdCisJICB8IHNlY3Rpb25fc3RhdGVtYWNoaW5lWyBwcm9jZWR1cmUgXQorCSAgKT8KKworCSAgKCBzZWN0aW9uX21vZGVsX29mX2NvbXB1dGF0aW9uWyBwcm9jZWR1cmUgXQorCSAgfCBzZWN0aW9uX21vZGVsX29mX2V4ZWN1dGlvblsgcHJvY2VkdXJlIF0KKwkgIHwgc2VjdGlvbl9tb2RlbF9vZl9pbnRlcmFjdGlvblsgcHJvY2VkdXJlIF0KKwkgICkqCisJOworCisKK2RlZl9ib2R5X3Byb2NlZHVyZV9zaW1wbGlmIFsgc2VwOjpNYWNoaW5lICogcHJvY2VkdXJlIF0KK0Bpbml0eworCSBzZXA6Ok1vZGlmaWVyIG1kZnI7CisKKwlzZXA6OlNwZWNpZmllciBzcGNmcjsKK30KKwk6ICggeyBtZGZyID0gc2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfVU5ERUZJTkVEX01PRElGSUVSOyB9CisKKwkJKCBtPW1vZGlmaWVyX2RlY2xhcmF0aW9uICB7IG1kZnIgPSAkbS5tZGZyOyB9ICk/CisKKwkgICAgKCBkZWNsX3ZhcmlhYmxlWyBwcm9jZWR1cmUtPmdldFByb3BlcnR5UGFydCgpICwgbWRmciBdCisKKwkgICAgfCBhZHM9YW55X2RlZl9zdGF0ZW1hY2hpbmVbIHByb2NlZHVyZSAsIG1kZnIgLCBzcGNmciBdCisKKwkgICAgfCBkZWZfc3RhdGVfYWN0aXZpdHlbIHByb2NlZHVyZSBdCisJICAgICkKKwkgICkrCisJOworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBzZWN0aW9uIENPTVBPU0lURSBTVFJVQ1RVUkUKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3NlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZSBbIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lciBdCisJOiBzZWN0aW9uX3JvdXRpbmVbIGNvbnRhaW5lciBdCisJfCBzZWN0aW9uX3Byb2NlZHVyZVsgY29udGFpbmVyIF0KKworCXwgc2VjdGlvbl9jb21wb3NpdGVfZ2VuZXJpY1sgY29udGFpbmVyIF0KKwl8IHNlY3Rpb25fbWFjaGluZV9tb2RlbFsgY29udGFpbmVyIF0KKwl8IHNlY3Rpb25fbWFjaGluZV9wcm90b3R5cGVbIGNvbnRhaW5lciBdCisJfCBzZWN0aW9uX21hY2hpbmVfaW5zdGFuY2VbIGNvbnRhaW5lciBdCisJOworCitzZWN0aW9uX2NvbXBvc2l0ZV9nZW5lcmljIFsgc2VwOjpNYWNoaW5lICogY29udGFpbmVyIF0KKwk6ICggJ0Bjb21wb3NpdGU6JyAgfCAgJ0BleGVjdXRhYmxlOicgIHwgICdAbWFjaGluZTonICkKKwkgICggbT1leGVjdXRhYmxlX21hY2hpbmVbIGNvbnRhaW5lciBdICkqCisJOworCisKK3NlY3Rpb25fbWFjaGluZV9tb2RlbCBbIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lciBdCitAaW5pdHsKKwlzZXA6Ok1vZGlmaWVyIG1kZnI7CisKKwlzZXA6OlNwZWNpZmllciBzcGNmciggc2VwOjpTcGVjaWZpZXI6OkRFU0lHTl9NT0RFTF9TUEVDSUZJRVIgKTsKK30KKwk6ICdAbW9kZWw6JworCSAgKCBtPWV4ZWN1dGFibGVfbW9kZWxfZGVmaW5pdG9uWyBjb250YWluZXIgLCBtZGZyICwgc3BjZnIgXSApKgorCTsKKworCitzZWN0aW9uX21hY2hpbmVfcHJvdG90eXBlIFsgc2VwOjpNYWNoaW5lICogY29udGFpbmVyIF0KK0Bpbml0eworCXNlcDo6TW9kaWZpZXIgbWRmcjsKKworCXNlcDo6U3BlY2lmaWVyIHNwY2ZyKCBzZXA6OlNwZWNpZmllcjo6REVTSUdOX1BST1RPVFlQRV9TVEFUSUNfU1BFQ0lGSUVSICk7Cit9CisJOiAnQHByb3RvdHlwZTonCisJICAoIG09ZXhlY3V0YWJsZV9tb2RlbF9kZWZpbml0b25bIGNvbnRhaW5lciAsIG1kZnIgLCBzcGNmciBdICkqCisJOworCitzZWN0aW9uX21hY2hpbmVfaW5zdGFuY2UgWyBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIgXQorCTogJ0BpbnN0YW5jZTonCisJICAoIGVkaT1leGVjdXRhYmxlX2luc3RhbmNlX2RlZmluaXRvblsgY29udGFpbmVyIF0gKSoKKwk7CisKKworZXhlY3V0YWJsZV9tYWNoaW5lIFsgc2VwOjpNYWNoaW5lICogY29udGFpbmVyIF0KK3JldHVybnMgWyBzZXA6Ok1hY2hpbmUgKiBtYWNoaW5lIF0KK0Bpbml0eworCSBzZXA6Ok1vZGlmaWVyIG1kZnI7CisKKwlzZXA6OlNwZWNpZmllciBzcGNmcjsKK30KKwk6ICggbXM9ZXhlY3V0YWJsZV9tb2RpZmllcl9zcGVjaWZpZXIKKwkgIHsgbWRmciA9ICRtcy5tZGZyOyBzcGNmciA9ICRtcy5zcGNmcjsgfQorCSAgKT8KKworCSAgKCBkbT1kZWZfbWFjaGluZVsgY29udGFpbmVyICwgbWRmciAsIHNwY2ZyIF0KKwkgIHsgJG1hY2hpbmUgPSAkZG0ubWFjaGluZTsgIH0KKworCSAgfCBhZHM9YW55X2RlZl9zdGF0ZW1hY2hpbmVbIGNvbnRhaW5lciAsIG1kZnIgLCBzcGNmciBdCisJICB7ICRtYWNoaW5lID0gJGFkcy5tYWNoaW5lOyAgfQorCisJICB8IGVtaT1kZWNsX2luc3RhbmNlWyBjb250YWluZXIgLCBtZGZyICwgc3BjZnIgXQorCSAgeyAkbWFjaGluZSA9ICRlbWkuaW5zdGFuY2U7IH0KKwkgICkKKwk7CisKKworZXhlY3V0YWJsZV9tb2RlbF9kZWZpbml0b24KKy8qIGluICovWyBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIgLAorCQlzZXA6Ok1vZGlmaWVyIG1kZnIgLCBzZXA6OlNwZWNpZmllciBzcGNmciBdCityZXR1cm5zIFsgc2VwOjpNYWNoaW5lICogbWFjaGluZSBdCisJOiAoIG1zPWV4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyCisJICB7IG1kZnIub3ZlcnJpZGVfaWZkZWYoICRtcy5tZGZyICk7ICBzcGNmci5vdmVycmlkZV9pZmRlZiggJG1zLnNwY2ZyICk7IH0KKwkgICk/CisKKwkgICggZG09ZGVmX21hY2hpbmUgICAgICBbIGNvbnRhaW5lciAsIG1kZnIgLCBzcGNmciBdCisJICB7ICRtYWNoaW5lID0gJGRtLm1hY2hpbmU7ICB9CisKKwkgIHwgYWRzPWRlZl9zdGF0ZW1hY2hpbmVbIGNvbnRhaW5lciAsIG1kZnIgLCBzcGNmciBdCisJICB7ICRtYWNoaW5lID0gJGFkcy5tYWNoaW5lOyB9CisJICApCisJOworCitleGVjdXRhYmxlX2luc3RhbmNlX2RlZmluaXRvbiBbIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lciBdCityZXR1cm5zIFsgc2VwOjpNYWNoaW5lICogaW5zdGFuY2UgXQorQGluaXR7CisJc2VwOjpNb2RpZmllciBtZGZyOworCisJc2VwOjpTcGVjaWZpZXIgc3BjZnIoIHNlcDo6U3BlY2lmaWVyOjpERVNJR05fSU5TVEFOQ0VfU1RBVElDX1NQRUNJRklFUiApOworfQorCTogKCBtcz1pbnN0YW5jZV9tb2RpZmllcl9zcGVjaWZpZXIKKwkgIHsgbWRmciA9ICRtcy5tZGZyOyBzcGNmciA9ICRtcy5zcGNmcjsgfQorCSAgKT8KKworCSAgZW1pPWRlY2xfaW5zdGFuY2VbIGNvbnRhaW5lciAsIG1kZnIgLCBzcGNmciBdCisJICB7ICRpbnN0YW5jZSA9ICRlbWkuaW5zdGFuY2U7IH0KKwk7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIElOU1RBTkNFIE1BQ0hJTkUKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2RlY2xfaW5zdGFuY2UKKy8qIGluICovWyBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIgLAorCQlzZXA6Ok1vZGlmaWVyIG1kZnIgLCBzZXA6OlNwZWNpZmllciBzcGNmciBdCityZXR1cm5zIFsgc2VwOjpNYWNoaW5lICogaW5zdGFuY2UgXQorQGluaXR7CisJc2VwOjpCRiBhTW9kZWw7CisKKwlzZXA6OmF2bV9zaXplX3QgaW5pdGlhbENvdW50ID0gMTsKKwlzZXA6OmF2bV9zaXplX3QgbWF4aW1hbENvdW50ID0gQVZNX05VTUVSSUNfTUFYX1NJWkVfVDsKKworCVNBVkVfUlVMRV9CRUdJTl9MT0NBVElPTjsKK30KK0BhZnRlcnsKKwlpZiggYU1vZGVsLmlzPCBzZXA6Ok1hY2hpbmUgPigpICkKKwl7CisJCVBPUF9DVFg7CisJfQorCVNFVF9SVUxFX0xPQ0FUSU9OKGluc3RhbmNlKTsKK30KKwk6ICdpbnN0YW5jZScgICggJ21hY2hpbmUnIHwgJ3N0YXRlbWFjaGluZScgKT8KKwkgIExUXworCSAgCSggJ21vZGVsOicgKT8gbW09aW5zdGFuY2VfbWFjaGluZV9tb2RlbCAgeyBhTW9kZWwgPSAkbW0ubW9kZWw7IH0KKworCSAgCSggQ09NTUEgIGRlZl9pbnN0YW5jZV9jb3VudFsgaW5pdGlhbENvdW50ICwgbWF4aW1hbENvdW50IF0gKT8KKwkgIEdUICBpZD1JRAorCSAgeworCSAgCWlmKCBhTW9kZWwuaXM8IHNlcDo6TWFjaGluZSA+KCkgKQorCSAgCXsKKwkgIAkJUFVTSF9DVFhfTkVXKCBhTW9kZWwudG9fcHRyPCBzZXA6Ok1hY2hpbmUgPigpICk7CisJICAJfQorCisJICAJJGluc3RhbmNlID0gc2VwOjpNYWNoaW5lOjpuZXdJbnN0YW5jZShjb250YWluZXIsCisJICAJCQlTVFIoJGlkLnRleHQtPmNoYXJzKSwgYU1vZGVsLCBpbml0aWFsQ291bnQsIG1heGltYWxDb3VudCk7CisKKwkJJGluc3RhbmNlLT5nZXR3TW9kaWZpZXIoKS5vdmVycmlkZV9pZmRlZiggbWRmciApOworCisJCSRpbnN0YW5jZS0+Z2V0d1NwZWNpZmllcigpLm92ZXJyaWRlX2lmZGVmKAorCQkJCXNwY2ZyLmlzRGVzaWduSW5zdGFuY2VEeW5hbWljKCkgPworCQkJCQkJc3BjZnIgOiBzcGNmci5zZXREZXNpZ25JbnN0YW5jZVN0YXRpYygpICk7CisKKwkgIAljb250YWluZXItPnNhdmVPd25lZEVsZW1lbnQoICRpbnN0YW5jZSApOworCSAgfQorCisJICAoIFN0cmluZ0xpdGVyYWwKKwkgIHsgJGluc3RhbmNlLT5zZXRVbnJlc3RyaWN0ZWROYW1lKFNUUigkU3RyaW5nTGl0ZXJhbC50ZXh0LT5jaGFycykpOyB9CisJICApPworLyoKKwkgIGRlY2xfaW5zdGFuY2VfbWFjaGluZV9wYXJhbXMgWyBtYWNoaW5lIF0gPworCSAgZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3JldHVybnNbIG1hY2hpbmUgXSA/CisKKwkgICggZGVmX2JvZHlfbWFjaGluZVsgbWFjaGluZSBdIHwgU0VNSSApCisqLworCSAgKCBMUEFSRU4KKwkgICAgKCBkZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5WyAkaW5zdGFuY2UgXSApID8KKwkgICAgUlBBUkVOCisJICApPworCisJICAoIFNFTUkKKworCSAgfCBMQ1VSTFkKKwkJKCBzPXN0YXRlbWVudCB7IGluc3RhbmNlLT5nZXRVbmlxQmVoYXZpb3JQYXJ0KCktPnNlcU9uQ3JlYXRlKCRzLmFjKTsgfSApKgorCisJCSggZGVmX2luc3RhbmNlX2FjdGl2aXR5WyAkaW5zdGFuY2UgXSApKgorCSAgICBSQ1VSTFkKKwkgICkKKwk7CisKKworZGVmX2luc3RhbmNlX29uX25ld19hY3Rpdml0eSBbIHNlcDo6TWFjaGluZSAqIGluc3RhbmNlIF0KK0Bpbml0eworCXNlcDo6YXZtX3NpemVfdCBwb3NpdGlvbiA9IDA7Cit9CisJOiBkZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5X3BhcmFtZXRlclsgJGluc3RhbmNlICwgcG9zaXRpb24rKyBdCisgICAgICAoIENPTU1BIGRlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlfcGFyYW1ldGVyWyAkaW5zdGFuY2UgLCBwb3NpdGlvbisrIF0gKSoKKwk7CisKK2RlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlfcGFyYW1ldGVyCisvKiBpbiAqL1sgc2VwOjpNYWNoaW5lICogaW5zdGFuY2UgLCBzZXA6OmF2bV9zaXplX3QgcG9zaXRpb24gXQorCTogKCBsdmFsdWUgIG9wX2Fzc2lnbl9wYXJhbSApID0+CisJICBsdj1sdmFsdWUgIG9hcD1vcF9hc3NpZ25fcGFyYW0gIGU9ZXhwcmVzc2lvbgorCSAgeyBpbnN0YW5jZS0+Z2V0VW5pcUJlaGF2aW9yUGFydCgpLT5zZXFPbkNyZWF0ZSggTkVXX1NUTVQyKCRvYXAub3AsICRsdi5iZiwgJGUuYmYpICk7IH0KKworCXwgZT1leHByZXNzaW9uCisJICB7CisJICAJc2VwOjpQYXJzZXJVdGlsOjphcHBlbmRJbnN0YW5jZUR5bmFtaWNQb3NpdGlvbmFsUGFyYW1ldGVyKAorCSAgCQkJaW5zdGFuY2UsICRlLmJmLCBwb3NpdGlvbik7CisJICB9CisJOworCitvcF9hc3NpZ25fcGFyYW0KK3JldHVybnMgWyBzZXA6Ok9wZXJhdG9yICogb3AgXQorCTogKCBBU1NJR04gfCBDT0xPTiApICB7ICRvcCA9IE9QKEFTU0lHTik7ICAgICAgIH0KKwl8IEFTU0lHTl9SRUYgICAgICAgICAgeyAkb3AgPSBPUChBU1NJR05fUkVGKTsgICB9CisJfCBBU1NJR05fTUFDUk8gICAgICAgIHsgJG9wID0gT1AoQVNTSUdOX01BQ1JPKTsgfQorCTsKKworCitkZWZfaW5zdGFuY2VfYWN0aXZpdHkgWyBzZXA6Ok1hY2hpbmUgKiBpbnN0YW5jZSBdCitAaW5pdHsKKwlzZXA6OkJlaGF2aW9yYWxQYXJ0ICogdGhlQmVoYXZpb3IgPSBpbnN0YW5jZS0+Z2V0VW5pcUJlaGF2aW9yUGFydCgpOworfQorCTogJ0BjcmVhdGUnICAgYnM9YmxvY2tfc3RhdGVtZW50ICB7IHRoZUJlaGF2aW9yLT5zZXFPbkNyZWF0ZSgkYnMuYWMpOyB9CisJfCAnQHN0YXJ0JyAgICAgYnM9YmxvY2tfc3RhdGVtZW50ICB7IHRoZUJlaGF2aW9yLT5zZXFPblN0YXJ0KCRicy5hYyk7ICAgfQorLyoKKwl8ICdAaW5pdCcgICAgIGJzPWJsb2NrX3N0YXRlbWVudCAgeyB0aGVCZWhhdmlvci0+c2VxT25Jbml0KCRicy5hYyk7ICAgfQorCisJfCAnQGllbmFibGUnICBicz1ibG9ja19zdGF0ZW1lbnQgIHsgdGhlQmVoYXZpb3ItPnNlcU9uSUVuYWJsZSgkYnMuYWMpOyB9CisJfCAnQGVuYWJsZScgICBicz1ibG9ja19zdGF0ZW1lbnQgIHsgdGhlQmVoYXZpb3ItPnNlcU9uRW5hYmxlICgkYnMuYWMpOyB9CisKKwl8ICdAaWRpc2FibGUnIGJzPWJsb2NrX3N0YXRlbWVudCAgeyB0aGVCZWhhdmlvci0+c2VxT25JRGlzYWJsZSgkYnMuYWMpOyB9CisJfCAnQGRpc2FibGUnICBicz1ibG9ja19zdGF0ZW1lbnQgIHsgdGhlQmVoYXZpb3ItPnNlcU9uRGlzYWJsZSAoJGJzLmFjKTsgfQorCisJfCAnQGlhYm9ydCcgICBicz1ibG9ja19zdGF0ZW1lbnQgIHsgdGhlQmVoYXZpb3ItPnNlcU9uSUFib3J0KCRicy5hYyk7IH0KKwl8ICdAYWJvcnQnICAgIGJzPWJsb2NrX3N0YXRlbWVudCAgeyB0aGVCZWhhdmlvci0+c2VxT25BYm9ydCgkYnMuYWMpOyB9CisKKwl8ICdAaXJ1bicgICAgIGJzPWJsb2NrX3N0YXRlbWVudCAgeyB0aGVCZWhhdmlvci0+c2VxT25JUnVuKCRicy5hYyk7IH0KKwl8ICdAcnVuJyAgICAgIGJzPWJsb2NrX3N0YXRlbWVudCAgeyB0aGVCZWhhdmlvci0+c2VxT25SdW4oJGJzLmFjKTsgfQorCXwgJ0BydGMnICAgICAgYnM9YmxvY2tfc3RhdGVtZW50ICB7IHRoZUJlaGF2aW9yLT5zZXFPblJ0YygkYnMuYWMpOyB9CisKKwl8ICdAZmluYWwnICAgIGJzPWJsb2NrX3N0YXRlbWVudCAgeyB0aGVCZWhhdmlvci0+c2VxT25GaW5hbCgkYnMuYWMpOyB9CisqLwk7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIHNlY3Rpb24gQkVIQVZJT1IgfCBTVEFURU1BQ0hJTkUKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3NlY3Rpb25fYmVoYXZpb3IgWyBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIgXQorCTogJ0BiZWhhdmlvcjonCisJICAoIG09ZXhlY3V0YWJsZV9tYWNoaW5lWyBjb250YWluZXIgXSApKworCTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gZGVmaW5pdGlvbiBNQUNISU5FCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitkZWZfaW5zdGFuY2VfY291bnQKKy8qIGluICovWyBzZXA6OmF2bV9zaXplX3QgJiBpbml0aWFsICwgc2VwOjphdm1fc2l6ZV90ICYgbWF4aW1hbCBdCitAYWZ0ZXJ7CisJaWYoICRtYXhpbWFsIDwgJGluaXRpYWwgKQorCXsKKwkJJG1heGltYWwgPSAkaW5pdGlhbDsKKwl9Cit9CisJOiAoICdtdWx0aXBsaWNpdHk6JyB8ICdpbnN0YW5jZTonICk/CisJICAoIExCUkFDS0VUCisJICAgICggbj1pbnRlZ2VyX2NvbnN0YW50ICB7ICRpbml0aWFsID0gJG4udmFsOyB9CisJICAgICAgQ09NTUEKKwkgICAgICAoIG49aW50ZWdlcl9jb25zdGFudCAgeyAkbWF4aW1hbCA9ICRuLnZhbDsgfQorCSAgICAgIHwgKCBTVEFSIHwgUExVUyApICAgICB7ICRtYXhpbWFsID0gQVZNX05VTUVSSUNfTUFYX1NJWkVfVDsgfQorCSAgICAgICkKKwkgICAgfCBTVEFSICB7ICRpbml0aWFsID0gMDsgJG1heGltYWwgPSBBVk1fTlVNRVJJQ19NQVhfU0laRV9UOyB9CisJICAgIHwgUExVUyAgeyAkaW5pdGlhbCA9IDE7ICRtYXhpbWFsID0gQVZNX05VTUVSSUNfTUFYX1NJWkVfVDsgfQorCSAgICApCisJICAgIFJCUkFDS0VUCisKKwkgIHwgTFBBUkVOCisJICAgIGRlZl9pbnN0YW5jZV9jb3VudF9hdG9tWyAkaW5pdGlhbCAsICRtYXhpbWFsIF0KKwkgICAgKCBDT01NQSA/ICBkZWZfaW5zdGFuY2VfY291bnRfYXRvbVsgJGluaXRpYWwgLCAkbWF4aW1hbCBdICkqCisJICAgIFJQQVJFTgorCSAgKQorCTsKKworZGVmX2luc3RhbmNlX2NvdW50X2F0b20KKy8qIGluICovWyBzZXA6OmF2bV9zaXplX3QgJiBpbml0aWFsICwgc2VwOjphdm1fc2l6ZV90ICYgbWF4aW1hbCBdCisJOiAnaW5pdDonIG49aW50ZWdlcl9jb25zdGFudCAgeyAkaW5pdGlhbCA9ICRuLnZhbDsgfQorCXwgJ21heDonICBuPWludGVnZXJfY29uc3RhbnQgIHsgJG1heGltYWwgPSAkbi52YWw7IH0KKwk7CisKKworZGVmX21hY2hpbmUKKy8qIGluICovWyBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIgLAorCQlzZXA6Ok1vZGlmaWVyIG1kZnIgLCBzZXA6OlNwZWNpZmllciBzcGNmciBdCityZXR1cm5zIFsgc2VwOjpNYWNoaW5lICogbWFjaGluZSBdCitAaW5pdHsKKwlzZXA6OmF2bV9zaXplX3QgaW5pdGlhbENvdW50ID0gMTsKKwlzZXA6OmF2bV9zaXplX3QgbWF4aW1hbENvdW50ID0gQVZNX05VTUVSSUNfTUFYX1NJWkVfVDsKKworCVNBVkVfUlVMRV9CRUdJTl9MT0NBVElPTjsKK30KK0BhZnRlcnsKKwlQT1BfQ1RYOworCisJU0VUX1JVTEVfTE9DQVRJT04obWFjaGluZSk7Cit9CisJOiAnbWFjaGluZScKKwkgICggTFRfCisJICAJKCAoICdtb2M6JyApPyAgZXhlY3V0YWJsZV9zcGVjaWZpZXJbIHNwY2ZyIF0KKwkgCSAgKCBDT01NQSAgZGVmX2luc3RhbmNlX2NvdW50WyBpbml0aWFsQ291bnQgLCBtYXhpbWFsQ291bnQgXSApPworCisJICAJfCBkZWZfaW5zdGFuY2VfY291bnRbIGluaXRpYWxDb3VudCAsIG1heGltYWxDb3VudCBdCisJICAJKT8KKwkgIEdUICk/CisJICBpZD1JRAorCSAgeworCSAgCVBVU0hfQ1RYX0NQTSggJG1hY2hpbmUgPSBzZXA6Ok1hY2hpbmU6Om5ld0V4ZWN1dGFibGUoCisJICAJCQljb250YWluZXIsIFNUUigkaWQudGV4dC0+Y2hhcnMpLCBzcGNmcikgKTsKKworCQkkbWFjaGluZS0+Z2V0d01vZGlmaWVyKCkub3ZlcnJpZGVfaWZkZWYoIG1kZnIgKTsKKworCSAgCWNvbnRhaW5lci0+c2F2ZU93bmVkRWxlbWVudCggJG1hY2hpbmUgKTsKKworCQkkbWFjaGluZS0+Z2V0VW5pcUluc3RhbmNlU3BlY2lmaWVyKCktPgorCQkJCXNldEluc3RhbmNlQ291bnQoaW5pdGlhbENvdW50LCBtYXhpbWFsQ291bnQpOworCSAgfQorCisJICAoIFN0cmluZ0xpdGVyYWwKKwkgIHsgJG1hY2hpbmUtPnNldFVucmVzdHJpY3RlZE5hbWUoU1RSKCRTdHJpbmdMaXRlcmFsLnRleHQtPmNoYXJzKSk7IH0KKwkgICk/CisKKwkgIGRlZl9tYWNoaW5lX3BhcmFtZXRlcnNbIG1hY2hpbmUgXSA/CisKKwkgIGRlZl9tYWNoaW5lX3JldHVybnNbIG1hY2hpbmUgLCBzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9SRVRVUk5fUEFSQU1FVEVSX01PRElGSUVSIF0gPworCisJICBkZWZfYm9keV9tYWNoaW5lWyBtYWNoaW5lIF0KKwk7CisKKworZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX2hlYWRlcl9wcmVkaWNhdAorCTogJ0BoZWFkZXI6JworCTsKKworZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX2ltcG9ydF9wcmVkaWNhdAorCTogJ0BpbXBvcnQ6JworCTsKKworZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3BhcmFtZXRlcl9wcmVkaWNhdAorCTogJ0BwYXJhbWV0ZXI6JyB8ICdAcGFyYW06JyAgLyogZGVwcmVjYXRlZCAqLworCXwgJ0BpbnB1dDonICAgICB8ICdAaW5vdXQ6JyAgfCAnQG91dHB1dDonCisJfCAnQHJldHVybnM6JyAgIHwgJ0ByZXR1cm46JyAvKiBkZXByZWNhdGVkICovCisJOworCitkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJvcGVydHlfcHJlZGljYXQKKwk6ICdAcHJvcGVydHk6JyAgfCAnQHB1YmxpYzonICAgfCAnQHByb3RlY3RlZDonIHwgJ0Bwcml2YXRlOicKKwl8ICdAZGVjbGFyYXRpb246JyAvKiBkZXByZWNhdGVkICovCisJOworCisKK2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdAorCTogZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX2hlYWRlcl9wcmVkaWNhdAorCXwgZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX2ltcG9ydF9wcmVkaWNhdAorCXwgZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3BhcmFtZXRlcl9wcmVkaWNhdAorCXwgZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3Byb3BlcnR5X3ByZWRpY2F0CisKKwl8ICdAbWFjcm86JyB8ICdAcm91dGluZScgfCAnQHByb2NlZHVyZTonCisKKwl8ICdAY29tcG9zaXRlJyB8ICdAbWFjaGluZTonCisJfCAnQHJlZ2lvbjonICAgfCAnQHN0YXRlbWFjaGluZTonCisKKwl8ICdAYmVoYXZpb3I6JyB8ICdAdHJhbnNpdGlvbjonCisKKwkvLyBNb2RlbCBPZiB7IENvbXB1dGF0aW9uICwgRXhlY3V0aW9uICwgSW50ZXJhY3Rpb24gfQorCXwgJ0Btb2M6JyB8ICdAbW9lOicgfCAnQGNvbTonIHwgJ0BpbnRlcmFjdGlvbjonCisJOworCisKK2RlZl9ib2R5X21hY2hpbmUgWyBzZXA6Ok1hY2hpbmUgKiBtYWNoaW5lIF0KKwk6IExDVVJMWQorCSAgICAgIC8vKCBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJlZGljYXQgKSA9PgorCSAgICAgIGRlZl9ib2R5X21hY2hpbmVfc2VjdGlvblsgbWFjaGluZSBdCisKKwkgICAgLy98IGRlZl9ib2R5X21hY2hpbmVfc2ltcGxpZlsgbWFjaGluZSBdCisJICBSQ1VSTFkKKwk7CisKK2RlZl9ib2R5X21hY2hpbmVfc2VjdGlvbiBbIHNlcDo6TWFjaGluZSAqIG1hY2hpbmUgXQorCTogc2VjdGlvbl9oZWFkZXJbIG1hY2hpbmUgXSA/CisJICBzZWN0aW9uX2ltcG9ydFsgbWFjaGluZSBdID8KKworCSAgKCBzZWN0aW9uX3BhcmFtZXRlclsgbWFjaGluZSBdICkqCisKKwkgIC8vIENvbmRpdGlvbmFsIFRlbXBsYXRlIENvZGUgR2VuZXJhdGlvbiBmb3IgQGRlY2xhcmF0aW9uCisJICB7ICBzZXA6OlRlbXBsYXRlRmFjdG9yeTo6Z2VuUHJvcGVydHkoIG1hY2hpbmUgKTsgfQorCisJICAoIHNlY3Rpb25fcHJvcGVydHkgWyBtYWNoaW5lIF0gKSoKKworCSAgKCBzZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmVbIG1hY2hpbmUgXSApKgorCisJICAoIHNlY3Rpb25fYmVoYXZpb3JbIG1hY2hpbmUgXQorCSAgfCBzZWN0aW9uX3N0YXRlbWFjaGluZVsgbWFjaGluZSBdCisJICApPworCisJICAvLyBDb25kaXRpb25hbCBUZW1wbGF0ZSBDb2RlIEdlbmVyYXRpb24gZm9yIEBtb2UKKwkgIHsgIHNlcDo6VGVtcGxhdGVGYWN0b3J5OjpnZW5CZWhhdmlvcihtYWNoaW5lKTsgfQorCisJICAoIHNlY3Rpb25fbW9kZWxfb2ZfY29tcHV0YXRpb25bIG1hY2hpbmUgXQorCSAgfCBzZWN0aW9uX21vZGVsX29mX2V4ZWN1dGlvblsgbWFjaGluZSBdCisJICB8IHNlY3Rpb25fbW9kZWxfb2ZfaW50ZXJhY3Rpb25bIG1hY2hpbmUgXQorCSAgKSoKKwk7CisKK2RlZl9ib2R5X21hY2hpbmVfc2ltcGxpZiBbIHNlcDo6TWFjaGluZSAqIG1hY2hpbmUgXQorQGluaXR7CisJc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHkgPSBtYWNoaW5lLT5nZXRQcm9wZXJ0eVBhcnQoKTsKK30KKwk6ICggKCBwcm9wZXJ0eV9kZWNsYXJhdGlvblsgZGVjbFByb3BlcnR5ICwKKwkJCQlzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9VTkRFRklORURfTU9ESUZJRVIgXQorCQkpKgorCisJICB8ICggZGVmX21vZV9wcmltaXRpdmVbIG1hY2hpbmUgXSApKworCSAgKQorCTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIGRlZmluaXRpb24gU1RBVEVNQUNISU5FCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCithbnlfZGVmX3N0YXRlbWFjaGluZQorLyogaW4gKi9bIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lciAsCisJCXNlcDo6TW9kaWZpZXIgbWRmciAsIHNlcDo6U3BlY2lmaWVyIHNwY2ZyIF0KK3JldHVybnMgWyBzZXA6Ok1hY2hpbmUgKiBtYWNoaW5lIF0KKwk6ICggbXM9ZXhlY3V0YWJsZV9tb2RpZmllcl9zcGVjaWZpZXIKKwkgIHsgbWRmci5vdmVycmlkZV9pZmRlZiggJG1zLm1kZnIgKTsgc3BjZnIub3ZlcnJpZGVfaWZkZWYoICRtcy5zcGNmciApOyB9CisJICApPworCisJICAoICBzdD1kZWZfc3RhdGVfc2luZ2xldG9uWyBjb250YWluZXIgLCBtZGZyICwgc3BjZnIgXQorCSAgeyAkbWFjaGluZSA9ICRzdC5zdGF0ZTsgICB9CisKKwkgIHwgc3Q9ZGVmX3N0YXRlWyBjb250YWluZXIgLCBtZGZyICwgc3BjZnIgXQorCSAgeyAkbWFjaGluZSA9ICRzdC5zdGF0ZTsgICB9CisKKwkgIHwgc209ZGVmX3N0YXRlbWFjaGluZVsgY29udGFpbmVyICwgbWRmciAsIHNwY2ZyIF0KKwkgIHsgJG1hY2hpbmUgPSAkc20ubWFjaGluZTsgfQorCSAgKQorCTsKKworCitkZWZfc3RhdGVtYWNoaW5lCisvKiBpbiAqL1sgc2VwOjpNYWNoaW5lICogY29udGFpbmVyICwKKwkJc2VwOjpNb2RpZmllciBtZGZyICwgc2VwOjpTcGVjaWZpZXIgc3BjZnIgXQorcmV0dXJucyBbIHNlcDo6TWFjaGluZSAqIG1hY2hpbmUgXQorQGluaXR7CisvLwlyZXNldFRyYW5zaXRpb25JRCgpOworCXJlc2V0Q29ubmVjdElEKCk7CisJcmVzZXRCdWZmZXJJRCgpOworCisJc2VwOjphdm1fc2l6ZV90IGluaXRpYWxDb3VudCA9IDE7CisJc2VwOjphdm1fc2l6ZV90IG1heGltYWxDb3VudCA9IEFWTV9OVU1FUklDX01BWF9TSVpFX1Q7CisKKwlTQVZFX1JVTEVfQkVHSU5fTE9DQVRJT047Cit9CitAYWZ0ZXJ7CisJUE9QX0NUWDsKKworCVNFVF9SVUxFX0xPQ0FUSU9OKG1hY2hpbmUpOworfQorCTogJ3N0YXRlbWFjaGluZScKKwkgICggTFRfCisJICAJKCAoICdtb2M6JyApPyAgZXhlY3V0YWJsZV9zcGVjaWZpZXJbIHNwY2ZyIF0KKwkgCSAgKCBDT01NQSAgZGVmX2luc3RhbmNlX2NvdW50WyBpbml0aWFsQ291bnQgLCBtYXhpbWFsQ291bnQgXSApPworCisJICAJfCBkZWZfaW5zdGFuY2VfY291bnRbIGluaXRpYWxDb3VudCAsIG1heGltYWxDb3VudCBdCisJICAJKT8KKwkgIEdUCisJICApPworCisJICAoIGlkPUlECisJCXsKKwkJICAJaWYoIHNwY2ZyLmlzVW5kZWZpbmVkKCkgKQorCQkgIAl7CisJCSAgCQlzcGNmci5zZXRDb21wb25lbnRFeGVjdXRhYmxlKCk7CisJCSAgCX0KKwkJICAJUFVTSF9DVFhfQ1BNKCAkbWFjaGluZSA9IHNlcDo6TWFjaGluZTo6bmV3U3RhdGVtYWNoaW5lKAorCQkgIAkJCWNvbnRhaW5lciwgU1RSKCRpZC50ZXh0LT5jaGFycyksIHNwY2ZyKSApOworCisJCSAgCSRtYWNoaW5lLT5nZXR3TW9kaWZpZXIoKS5vdmVycmlkZV9pZmRlZiggbWRmciApOworCisJCQljb250YWluZXItPnNhdmVPd25lZEVsZW1lbnQoICRtYWNoaW5lICk7CisKKwkJCSRtYWNoaW5lLT5nZXRVbmlxSW5zdGFuY2VTcGVjaWZpZXIoKS0+CisJCQkJCXNldEluc3RhbmNlQ291bnQoaW5pdGlhbENvdW50LCBtYXhpbWFsQ291bnQpOworCQl9CisKKwkgIHwgKCBMQlJBQ0tFVCAgICAgICAgIHsgc3BjZnIuc2V0R3JvdXBTb21lKCk7IH0KKwkgICAgfCBMQlJBQ0tFVF9FWENFUFQgIHsgc3BjZnIuc2V0R3JvdXBFeGNlcHQoKTsgfQorCSAgICApCisJCXsKKwkJICAJUFVTSF9DVFhfQ1BNKCAkbWFjaGluZSA9IHNlcDo6TWFjaGluZTo6bmV3U3RhdGVtYWNoaW5lKAorCQkgIAkJCWNvbnRhaW5lciwgIltdIiwgc3BjZnIvKiwgdHlwZSovKSApOworCisJCSAgCSRtYWNoaW5lLT5nZXR3TW9kaWZpZXIoKS5vdmVycmlkZV9pZmRlZiggbWRmciApOworCisJCQljb250YWluZXItPnNhdmVPd25lZEVsZW1lbnQoICRtYWNoaW5lICk7CisKKwkJCSRtYWNoaW5lLT5nZXRVbmlxSW5zdGFuY2VTcGVjaWZpZXIoKS0+CisJCQkJCXNldEluc3RhbmNlQ291bnQoaW5pdGlhbENvdW50LCBtYXhpbWFsQ291bnQpOworCQl9CisKKwkgICAgKCBpZD1JRCAgICAgICAgICB7ICRtYWNoaW5lLT5hcHBlbmRHcm91cElkKCBTVFIoJGlkLnRleHQtPmNoYXJzKSApOyB9CisJICAgICAgKCBDT01NQSBpZD1JRCAgeyAkbWFjaGluZS0+YXBwZW5kR3JvdXBJZCggU1RSKCRpZC50ZXh0LT5jaGFycykgKTsgfSApKgorCisJICAgIHwgU1RBUgorCSAgICB7ICRtYWNoaW5lLT5nZXR3U3BlY2lmaWVyKCkuc2V0R3JvdXBFdmVyeSgpOyB9CisJICAgICkKKwkgICAgUkJSQUNLRVQgICB7ICRtYWNoaW5lLT5zZXRHcm91cElkKCk7IH0KKwkgICkKKworCSAgKCBTdHJpbmdMaXRlcmFsCisJICB7ICRtYWNoaW5lLT5zZXRVbnJlc3RyaWN0ZWROYW1lKFNUUigkU3RyaW5nTGl0ZXJhbC50ZXh0LT5jaGFycykpOyB9CisJICApPworCisJICBkZWZfbWFjaGluZV9wYXJhbWV0ZXJzWyBtYWNoaW5lIF0gPworCisJICBkZWZfbWFjaGluZV9yZXR1cm5zWyBtYWNoaW5lICwgc2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfUkVUVVJOX1BBUkFNRVRFUl9NT0RJRklFUiBdID8KKworCSAgZGVmX2JvZHlfc3RhdGVtYWNoaW5lWyBtYWNoaW5lIF0KKwk7CisKKworLy8hIVtNSUdSQVRJT05dOklOU1RBTkNFCisvKgorZGVjbF9pbnN0YW5jZV9zdGF0ZW1hY2hpbmUgWyBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIgXQorcmV0dXJucyBbIHNlcDo6TWFjaGluZSAqIG1hY2hpbmUgXQorQGluaXR7CisvLwlyZXNldFRyYW5zaXRpb25JRCgpOworCXJlc2V0Q29ubmVjdElEKCk7CisJcmVzZXRCdWZmZXJJRCgpOworCisJc2VwOjpTcGVjaWZpZXIgc3BjZnI7CisKKwlzZXA6OkJGIGFNb2RlbDsKKworCXNlcDo6YXZtX3NpemVfdCBpbml0aWFsQ291bnQgPSAxOworCXNlcDo6YXZtX3NpemVfdCBtYXhpbWFsQ291bnQgPSBBVk1fTlVNRVJJQ19NQVhfU0laRV9UOworCisJU0FWRV9SVUxFX0JFR0lOX0xPQ0FUSU9OOworfQorQGFmdGVyeworCVBPUF9DVFg7CisKKwlTRVRfUlVMRV9MT0NBVElPTihtYWNoaW5lKTsKK30KKwk6ICdzdGF0ZW1hY2hpbmUnCisJICBMVF8KKwkgIAkoICggJ21vYzonICk/ICBleGVjdXRhYmxlX3NwZWNpZmllclsgc3BjZnIgXSAgQ09NTUEgKT8KKwkgIAkoICdtb2RlbDonICk/ICBtbT1pbnN0YW5jZV9tYWNoaW5lX21vZGVsICB7IGFNb2RlbCA9ICRtbS5tb2RlbDsgfQorCisJICAJKCBDT01NQSAgZGVmX2luc3RhbmNlX2NvdW50WyBpbml0aWFsQ291bnQgLCBtYXhpbWFsQ291bnQgXSApPworCSAgR1QgIGlkPUlECisJICB7CisJICAJaWYoIHNwY2ZyLmlzVW5kZWZpbmVkKCkgKQorCSAgCXsKKwkgIAkJc3BjZnIuc2V0Q29tcG9uZW50U3RhdGVtYWNoaW5lKCk7CisJICAJfQorCQlQVVNIX0NUWF9DUE0oICRtYWNoaW5lID0gc2VwOjpNYWNoaW5lOjpuZXdTdGF0ZW1hY2hpbmVJbnN0YW5jZSgKKwkJCQljb250YWluZXIsIFNUUigkaWQudGV4dC0+Y2hhcnMpLCBzcGNmciwgYU1vZGVsKSApOworCisJCSRtYWNoaW5lLT5nZXR3U3BlY2lmaWVyKCkuc2V0RGVzaWduSW5zdGFuY2VTdGF0aWMoKTsKKworCQljb250YWluZXItPnNhdmVPd25lZEVsZW1lbnQoICRtYWNoaW5lICk7CisKKwkJJG1hY2hpbmUtPmdldFVuaXFJbnN0YW5jZVNwZWNpZmllcigpLT4KKwkJCQlzZXRJbnN0YW5jZUNvdW50KGluaXRpYWxDb3VudCwgbWF4aW1hbENvdW50KTsKKwkgIH0KKworCSAgKCBTdHJpbmdMaXRlcmFsCisJICB7ICRtYWNoaW5lLT5zZXRVbnJlc3RyaWN0ZWROYW1lKFNUUigkU3RyaW5nTGl0ZXJhbC50ZXh0LT5jaGFycykpOyB9CisJICApPworCisJICBkZWNsX2luc3RhbmNlX21hY2hpbmVfcGFyYW1zIFsgbWFjaGluZSBdID8KKwkgIGRlY2xfaW5zdGFuY2VfbWFjaGluZV9yZXR1cm5zWyBtYWNoaW5lIF0gPworCisJICAoIGRlZl9ib2R5X3N0YXRlbWFjaGluZVsgbWFjaGluZSBdIHwgU0VNSSApCisJOworKi8KKworZGVmX2JvZHlfc3RhdGVtYWNoaW5lIFsgc2VwOjpNYWNoaW5lICogbWFjaGluZSBdCisJOiBMQ1VSTFkKKwkgIHNlY3Rpb25faGVhZGVyWyBtYWNoaW5lIF0gPworCSAgc2VjdGlvbl9pbXBvcnRbIG1hY2hpbmUgXSA/CisKKwkgICggc2VjdGlvbl9wYXJhbWV0ZXJbIG1hY2hpbmUgXSApKgorCisJICAvLyBDb25kaXRpb25hbCBUZW1wbGF0ZSBDb2RlIEdlbmVyYXRpb24gZm9yIEBkZWNsYXJhdGlvbgorCSAgeyAgc2VwOjpUZW1wbGF0ZUZhY3Rvcnk6OmdlblByb3BlcnR5KCBtYWNoaW5lICk7IH0KKworCSAgKCBzZWN0aW9uX3Byb3BlcnR5IFsgbWFjaGluZSBdICkqCisKKwkgICggc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlWyBtYWNoaW5lIF0gKSoKKworCSAgc2VjdGlvbl9yZWdpb25bIG1hY2hpbmUgXSA/CisKKwkgIHNlY3Rpb25fdHJhbnNpdGlvblsgbWFjaGluZSBdID8KKworCSAgLy8gQ29uZGl0aW9uYWwgVGVtcGxhdGUgQ29kZSBHZW5lcmF0aW9uIGZvciBAbW9lCisJICB7ICBzZXA6OlRlbXBsYXRlRmFjdG9yeTo6Z2VuQmVoYXZpb3IobWFjaGluZSk7IH0KKworCSAgKCBzZWN0aW9uX21vZGVsX29mX2NvbXB1dGF0aW9uWyBtYWNoaW5lIF0KKwkgIHwgc2VjdGlvbl9tb2RlbF9vZl9leGVjdXRpb25bIG1hY2hpbmUgXQorCSAgfCBzZWN0aW9uX21vZGVsX29mX2ludGVyYWN0aW9uWyBtYWNoaW5lIF0KKwkgICkqCisJICBSQ1VSTFkKKwk7CisKKworc2VjdGlvbl9yZWdpb24gWyBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIgXQorQGluaXR7CisJIHNlcDo6TW9kaWZpZXIgbWRmcjsKKworCXNlcDo6U3BlY2lmaWVyIHNwY2ZyOworfQorCTogJ0ByZWdpb246JworCSAgeyBjb250YWluZXItPmdldHdTcGVjaWZpZXIoKS5zZXRNb2NTdGF0ZVRyYW5zaXRpb25TeXN0ZW0oKTsgfQorCisJICAoIG09YW55X2RlZl9zdGF0ZW1hY2hpbmVbIGNvbnRhaW5lciAsIG1kZnIgLCBzcGNmciBdICkrCisJOworCitzZWN0aW9uX3N0YXRlbWFjaGluZSBbIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lciBdCitAaW5pdHsKKwkgc2VwOjpNb2RpZmllciBtZGZyOworCisJc2VwOjpTcGVjaWZpZXIgc3BjZnI7Cit9CisJOiAnQHN0YXRlbWFjaGluZTonCisJICB7IGNvbnRhaW5lci0+Z2V0d1NwZWNpZmllcigpLnNldE1vY1N0YXRlVHJhbnNpdGlvblN5c3RlbSgpOyB9CisKKwkgICggbT1hbnlfZGVmX3N0YXRlbWFjaGluZVsgY29udGFpbmVyICwgbWRmciAsIHNwY2ZyIF0gKSsKKwk7CisKKworCitkZWZfc3RhdGUKKy8qIGluICovWyBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIgLAorCQlzZXA6Ok1vZGlmaWVyIG1kZnIgLCBzZXA6OlNwZWNpZmllciBzcGNmciBdCityZXR1cm5zIFsgc2VwOjpNYWNoaW5lICogc3RhdGUgPSBOVUxMIF0KK0Bpbml0eworCXN0ZDo6c3RyaW5nIHNpZDsKKworCVNBVkVfUlVMRV9CRUdJTl9MT0NBVElPTjsKK30KK0BhZnRlcnsKKwlQT1BfQ1RYOworCisJU0VUX1JVTEVfTE9DQVRJT04oc3RhdGUpOworfQorCTogJ3N0YXRlJworCSAgKCBMVF8gKCAnbW9jOicgKT8gIGV4ZWN1dGFibGVfc3BlY2lmaWVyWyBzcGNmciBdICBHVAorCSAgICB7IHNpZCA9ICIkIiArIHNwY2ZyLnN0ckFueVN0YXRlTW9jKCIiKTsgfQorCSAgKT8KKwkgICggaWQ9c3RhdGVfaWQKKwkgICAgeworCSAgICAJaWYoIHNwY2ZyLmNvdWxkQmVTdGF0ZU1vY1NJTVBMRSgpICkKKwkgICAgCXsKKwkgICAgCQlzcGNmci5zZXRTdGF0ZU1vY1NJTVBMRSgpOworCSAgICAJfQorCisJICAgIAlQVVNIX0NUWF9DUE0oCisJICAgIAkJCSRzdGF0ZSA9IHNlcDo6TWFjaGluZTo6bmV3U3RhdGUoY29udGFpbmVyLCAkaWQucywgc3BjZnIpICk7CisKKwkgICAgCSRzdGF0ZS0+Z2V0d01vZGlmaWVyKCkub3ZlcnJpZGVfaWZkZWYoIG1kZnIgKTsKKworCQkJY29udGFpbmVyLT5zYXZlT3duZWRFbGVtZW50KCAkc3RhdGUgKTsKKwkgICAgfQorCisJICB8ICggTEJSQUNLRVQgICAgICAgICB7IHNwY2ZyLnNldEdyb3VwU29tZSgpOyB9CisJICAgIHwgTEJSQUNLRVRfRVhDRVBUICB7IHNwY2ZyLnNldEdyb3VwRXhjZXB0KCk7IH0KKwkgICAgKQorCQl7CisJCSAgCVBVU0hfQ1RYX0NQTSgKKwkJICAJCQkkc3RhdGUgPSBzZXA6Ok1hY2hpbmU6Om5ld1N0YXRlKGNvbnRhaW5lciwgIltdIiwgc3BjZnIpICk7CisKKwkJCWNvbnRhaW5lci0+c2F2ZU93bmVkRWxlbWVudCggJHN0YXRlICk7CisKKwkJICAJJHN0YXRlLT5nZXR3TW9kaWZpZXIoKS5vdmVycmlkZV9pZmRlZiggbWRmciApOworCQl9CisKKwkgICAgKCBpZD1zdGF0ZV9pZCAgICAgICAgICB7ICRzdGF0ZS0+YXBwZW5kR3JvdXBJZCggJGlkLnMgKTsgfQorCSAgICAgICggQ09NTUEgaWQ9c3RhdGVfaWQgIHsgJHN0YXRlLT5hcHBlbmRHcm91cElkKCAkaWQucyApOyB9ICkqCisKKwkgICAgfCBTVEFSCisJICAgIHsgJHN0YXRlLT5nZXR3U3BlY2lmaWVyKCkuc2V0R3JvdXBFdmVyeSgpOyB9CisJICAgICkKKwkgICAgUkJSQUNLRVQgICB7ICRzdGF0ZS0+c2V0R3JvdXBJZCgpOyB9CisJICApPworCisJICB7CisJCWlmKCAkc3RhdGUgPT0gTlVMTCApCisJCXsKKwkJCVBVU0hfQ1RYX0NQTSgKKwkJCQkJJHN0YXRlID0gc2VwOjpNYWNoaW5lOjpuZXdTdGF0ZShjb250YWluZXIsIHNpZCwgc3BjZnIpICk7CisKKwkJCSRzdGF0ZS0+Z2V0d01vZGlmaWVyKCkub3ZlcnJpZGVfaWZkZWYoIG1kZnIgKTsKKworCQkJY29udGFpbmVyLT5zYXZlT3duZWRFbGVtZW50KCAkc3RhdGUgKTsKKwkJfQorCSAgfQorCisJICAoIFN0cmluZ0xpdGVyYWwKKwkgIHsgJHN0YXRlLT5zZXRVbnJlc3RyaWN0ZWROYW1lKFNUUigkU3RyaW5nTGl0ZXJhbC50ZXh0LT5jaGFycykpOyB9CisJICApPworCisJICAoIGRlZl9ib2R5X3N0YXRlWyBzdGF0ZSBdIHwgU0VNSSApCisJOworCisKK3N0YXRlX2t3X2lkCityZXR1cm5zIFsgc3RkOjpzdHJpbmcgcyBdCisJOiAnI2luaXQnICAgICAgeyAkcyA9ICIjaW5pdCIgICAgOyB9CisJfCAnI2luaXRpYWwnICAgeyAkcyA9ICIjaW5pdGlhbCIgOyB9CisJfCAnI3N0YXJ0JyAgICAgeyAkcyA9ICIjc3RhcnQiICAgOyB9CisKKwl8ICcjZGhpc3RvcnknICB7ICRzID0gIiNkaGlzdG9yeSI7IH0KKwl8ICcjc2hpc3RvcnknICB7ICRzID0gIiNzaGlzdG9yeSI7IH0KKworCXwgJyNmaW5hbCcKKwl7ICRzID0gIiNmaW5hbCIgICA7IG5lZWREZWZhdWx0U3RhdGVGaW5hbC5yZW1vdmUoX0NQTV8pOyAgICB9CisKKwl8ICcjdGVybWluYWwnCisJeyAkcyA9ICIjdGVybWluYWwiOyBuZWVkRGVmYXVsdFN0YXRlVGVybWluYWwucmVtb3ZlKF9DUE1fKTsgfQorCisJfCAnI3JldHVybicKKwl7ICRzID0gIiNyZXR1cm4iICA7IG5lZWREZWZhdWx0U3RhdGVSZXR1cm4ucmVtb3ZlKF9DUE1fKTsgICB9CisJOworCitzdGF0ZV9pZAorcmV0dXJucyBbIHN0ZDo6c3RyaW5nIHMgXQorCToga3c9c3RhdGVfa3dfaWQgIHsgJHMgPSAka3cuczsgfQorCXwgaWQ9SUQgICAgICAgICAgIHsgJHMgPSBTVFIoJGlkLnRleHQtPmNoYXJzKTsgfQorCXwgRE9MTEFSIGlkPUlEICAgIHsgJHMgPSAiJCIgKyBTVFIoJGlkLnRleHQtPmNoYXJzKTsgfQorCTsKKworCisKKworZGVmX3N0YXRlX3NpbmdsZXRvbgorLyogaW4gKi9bIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lciAsCisJCXNlcDo6TW9kaWZpZXIgbWRmciAsIHNlcDo6U3BlY2lmaWVyIHNwY2ZyIF0KK3JldHVybnMgWyBzZXA6Ok1hY2hpbmUgKiBzdGF0ZSBdCitAaW5pdHsKKwlTQVZFX1JVTEVfQkVHSU5fTE9DQVRJT047Cit9CitAYWZ0ZXJ7CisJc3RhdGUtPmdldHdNb2RpZmllcigpLm92ZXJyaWRlX2lmZGVmKCBtZGZyICk7CisKKwlQT1BfQ1RYOworCisJU0VUX1JVTEVfTE9DQVRJT04oc3RhdGUpOworfQorCTogKCAnI2luaXRpYWwnCisJICB7CisJICAJUFVTSF9DVFhfQ1BNKCAkc3RhdGUgPSBzZXA6Ok1hY2hpbmU6Om5ld1N0YXRlKAorCSAgCQkJY29udGFpbmVyLCAiI2luaXRpYWwiLCBzcGNmci5zZXRQc2V1ZG9zdGF0ZU1vY0lOSVRJQUwoKSkgKTsKKworCSAgCWNvbnRhaW5lci0+c2F2ZU93bmVkRWxlbWVudCggJHN0YXRlICk7CisJICB9CisKKwkgIHwgJyNzdGFydCcKKwkgIHsKKwkgIAlQVVNIX0NUWF9DUE0oICRzdGF0ZSA9IHNlcDo6TWFjaGluZTo6bmV3U3RhdGUoCisJICAJCQljb250YWluZXIsICIjc3RhcnQiLCBzcGNmci5zZXRTdGF0ZU1vY1NUQVJUKCkpICk7CisKKwkgIAljb250YWluZXItPnNhdmVPd25lZEVsZW1lbnQoICRzdGF0ZSApOworCSAgfQorCisJICB8ICcjZGhpc3RvcnknCisJICB7CisJICAJUFVTSF9DVFhfQ1BNKCAkc3RhdGUgPSBzZXA6Ok1hY2hpbmU6Om5ld1N0YXRlKAorCSAgCQkJY29udGFpbmVyLCAiI2RoaXN0b3J5IiwKKwkgIAkJCXNwY2ZyLnNldFBzZXVkb3N0YXRlTW9jREVFUF9ISVNUT1JZKCkpICk7CisKKwkgIAljb250YWluZXItPnNhdmVPd25lZEVsZW1lbnQoICRzdGF0ZSApOworCSAgfQorCisJICB8ICcjc2hpc3RvcnknCisJICB7CisJICAJUFVTSF9DVFhfQ1BNKCAkc3RhdGUgPSBzZXA6Ok1hY2hpbmU6Om5ld1N0YXRlKAorCSAgCQkJY29udGFpbmVyLCAiI3NoaXN0b3J5IiwKKwkgIAkJCXNwY2ZyLnNldFBzZXVkb3N0YXRlTW9jU0hBTExPV19ISVNUT1JZKCkpICk7CisKKwkgIAljb250YWluZXItPnNhdmVPd25lZEVsZW1lbnQoICRzdGF0ZSApOworCSAgfQorCSAgKQorCSAgTENVUkxZICBkZWZfYm9keV9zdGF0ZV9zaW1wbGlmWyBzdGF0ZSBdICBSQ1VSTFkKKworCXwgJyNmaW5hbCcgYnM9YmxvY2tfc3RhdGVtZW50CisJeworCQlQVVNIX0NUWF9DUE0oICRzdGF0ZSA9IHNlcDo6TWFjaGluZTo6bmV3U3RhdGUoCisJCQljb250YWluZXIsICIjZmluYWwiLCBzcGNmci5zZXRTdGF0ZU1vY0ZJTkFMKCkpICk7CisKKwkgIAljb250YWluZXItPnNhdmVPd25lZEVsZW1lbnQoICRzdGF0ZSApOworCisJCSRzdGF0ZS0+Z2V0VW5pcUJlaGF2aW9yUGFydCgpLT5zZXFPbkZpbmFsKCRicy5hYyk7CisKKwkJbmVlZERlZmF1bHRTdGF0ZUZpbmFsLnJlbW92ZShjb250YWluZXIpOworCX0KKworCXwgJyN0ZXJtaW5hbCcgYnM9YmxvY2tfc3RhdGVtZW50CisJeworCQlQVVNIX0NUWF9DUE0oICRzdGF0ZSA9IHNlcDo6TWFjaGluZTo6bmV3U3RhdGUoCisJCQljb250YWluZXIsICIjdGVybWluYWwiLCBzcGNmci5zZXRQc2V1ZG9zdGF0ZU1vY1RFUk1JTkFMKCkpICk7CisKKwkgIAljb250YWluZXItPnNhdmVPd25lZEVsZW1lbnQoICRzdGF0ZSApOworCisJCSRzdGF0ZS0+Z2V0VW5pcUJlaGF2aW9yUGFydCgpLT5zZXFPbkZpbmFsKCRicy5hYyk7CisKKwkJbmVlZERlZmF1bHRTdGF0ZVRlcm1pbmFsLnJlbW92ZShjb250YWluZXIpOworCX0KKworCXwgJyNyZXR1cm4nIGJzPWJsb2NrX3N0YXRlbWVudAorCXsKKwkJUFVTSF9DVFhfQ1BNKCAkc3RhdGUgPSBzZXA6Ok1hY2hpbmU6Om5ld1N0YXRlKAorCQkJY29udGFpbmVyLCAiI3JldHVybiIsIHNwY2ZyLnNldFBzZXVkb3N0YXRlTW9jUkVUVVJOKCkpICk7CisKKwkgIAljb250YWluZXItPnNhdmVPd25lZEVsZW1lbnQoICRzdGF0ZSApOworCisJCSRzdGF0ZS0+Z2V0VW5pcUJlaGF2aW9yUGFydCgpLT5zZXFPbkZpbmFsKCRicy5hYyk7CisKKwkJbmVlZERlZmF1bHRTdGF0ZVJldHVybi5yZW1vdmUoY29udGFpbmVyKTsKKwl9CisJOworCisKK2V4ZWN1dGFibGVfc3BlY2lmaWVyIFsgc2VwOjpTcGVjaWZpZXIgJiBzcGNmciBdCisJOiBrYT1leGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tWyBzcGNmciBdCisJICAoIEJBTkQga2E9ZXhlY3V0YWJsZV9zcGVjaWZpZXJfYXRvbVsgc3BjZnIgXSApKgorCTsKKworCitleGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tIFsgc2VwOjpTcGVjaWZpZXIgJiBzcGNmciBdCisJOiBpZD1JRCAgeyBzcGNmci5zZXRNb2MoIFNUUigkaWQudGV4dC0+Y2hhcnMpICk7IH0KKworLy8JfCAnc2ltcGxlJyAgICAgeyBzcGNmci5zZXRTdGF0ZU1vY1NJTVBMRSgpOyB9CisJfCAnc3RhcnQnICAgICAgeyBzcGNmci5zZXRTdGF0ZU1vY1NUQVJUKCk7ICB9CisJfCAnZmluYWwnICAgICAgeyBzcGNmci5zZXRTdGF0ZU1vY0ZJTkFMKCk7ICB9CisvLwl8ICdzeW5jJyAgICAgICB7IHNwY2ZyLnNldFN0YXRlTW9jU1lOQygpOyAgIH0KKworLy8JfCAnaW5pdGlhbCcgICAgeyBzcGNmci5zZXRQc2V1ZG9zdGF0ZU1vY0lOSVRJQUwoKTsgIH0KKy8vCXwgJ3Rlcm1pbmFsJyAgIHsgc3BjZnIuc2V0UHNldWRvc3RhdGVNb2NURVJNSU5BTCgpOyB9CisJfCAncmV0dXJuJyAgICAgeyBzcGNmci5zZXRQc2V1ZG9zdGF0ZU1vY1JFVFVSTigpOyAgIH0KKworLy8JfCAnanVuY3Rpb24nICAgeyBzcGNmci5zZXRQc2V1ZG9zdGF0ZU1vY0pVTkNUSU9OKCk7IH0KKwl8ICdjaG9pY2UnICAgICB7IHNwY2ZyLnNldFBzZXVkb3N0YXRlTW9jQ0hPSUNFKCk7ICAgfQorCisJfCAnZm9yaycgICAgICAgeyBzcGNmci5zZXRQc2V1ZG9zdGF0ZU1vY0ZPUksoKTsgfQorCXwgJ2pvaW4nICAgICAgIHsgc3BjZnIuc2V0UHNldWRvc3RhdGVNb2NKT0lOKCk7IH0KKworLy8JfCAnZGhpc3RvcnknICAgeyBzcGNmci5zZXRQc2V1ZG9zdGF0ZU1vY0RFRVBfSElTVE9SWSgpOyAgICB9CisvLwl8ICdzaGlzdG9yeScgICB7IHNwY2ZyLnNldFBzZXVkb3N0YXRlTW9jU0hBTExPV19ISVNUT1JZKCk7IH0KKworCXwgJ2FuZCcgICAgICAgIHsgc3BjZnIuc2V0TW9jQ29tcG9zaXRlU3RydWN0dXJlKCk7ICAgICB9CisJfCAnb3InICAgICAgICAgeyBzcGNmci5zZXRNb2NTdGF0ZVRyYW5zaXRpb25TeXN0ZW0oKTsgIH0KKwl8ICcjc3RzJyAgICAgICB7IHNwY2ZyLnNldE1vY1N0YXRlVHJhbnNpdGlvblN5c3RlbSgpOyAgfQorCXwgJyNzdGYnICAgICAgIHsgc3BjZnIuc2V0TW9jU3RhdGVUcmFuc2l0aW9uRmxvdygpOyAgfQorCXwgJ2Zsb3cnICAgICAgIHsgc3BjZnIuc2V0Q29tcG9zaXRlTW9jRGF0YUZsb3coKTsgICAgICB9CisJOworCisKKworaW5zdGFuY2VfbWFjaGluZV9tb2RlbAorcmV0dXJucyBbIHNlcDo6QkYgbW9kZWwgXQorCTogdGlkPXF1YWxpZmllZE5hbWVJRAorCXsKKwkJJG1vZGVsID0gc2VwOjpQYXJzZXJVdGlsOjpnZXRFeGVjdXRhYmxlTWFjaGluZSgkdGlkLnMsICR0aWQubmIpOworCQlpZiggJG1vZGVsLmludmFsaWQoKSApCisJCXsKKwkJCXNlcDo6UGFyc2VyVXRpbDo6YXZtX3N5bnRheF9lcnJvcigKKwkJCQkiaW5zdGFuY2VfbWFjaGluZV9tb2RlbCIsIExUKDApLT5nZXRMaW5lKExUKDApKSApCisJCQkJCTw8ICJ1bmV4cGVjdGVkIElEPCAiIDw8ICR0aWQucyA8PCAiID4iCisJCQkJCTw8IHNlcDo6UGFyc2VyVXRpbDo6U1lOVEFYX0VSUk9SX0VPTDsKKwkJfQorCX0KKwk7CisKKworZGVmX2JvZHlfc3RhdGUgWyBzZXA6Ok1hY2hpbmUgKiBzdGF0ZSBdCisJOiBMQ1VSTFkKKwkgICggKCBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJlZGljYXQgKSA9PgorCSAgICBkZWZfYm9keV9zdGF0ZV9zZWN0aW9uWyBzdGF0ZSBdCisKKwkgIHwgZGVmX2JvZHlfc3RhdGVfc2ltcGxpZlsgc3RhdGUgXQorCSAgKQorCSAgUkNVUkxZCisJOworCitkZWZfYm9keV9zdGF0ZV9zZWN0aW9uIFsgc2VwOjpNYWNoaW5lICogbWFjaGluZSBdCisJOiAoIHNlY3Rpb25fcHJvcGVydHlbIG1hY2hpbmUgXSApKgorCisJICAoIHNlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZVsgbWFjaGluZSBdICkqCisKKwkgIHNlY3Rpb25fcmVnaW9uWyBtYWNoaW5lIF0gPworCisJICBzZWN0aW9uX3RyYW5zaXRpb25bIG1hY2hpbmUgXSA/CisKKwkgICggc2VjdGlvbl9tb2RlbF9vZl9jb21wdXRhdGlvblsgbWFjaGluZSBdCisJICB8IHNlY3Rpb25fbW9kZWxfb2ZfZXhlY3V0aW9uWyBtYWNoaW5lIF0KKwkgIHwgc2VjdGlvbl9tb2RlbF9vZl9pbnRlcmFjdGlvblsgbWFjaGluZSBdCisJICApKgorCTsKKworZGVmX2JvZHlfc3RhdGVfc2ltcGxpZiBbIHNlcDo6TWFjaGluZSAqIHN0YXRlIF0KK0Bpbml0eworCSBzZXA6Ok1vZGlmaWVyIG1kZnI7CisKKwlzZXA6OlNwZWNpZmllciBzcGNmcjsKK30KKwk6ICggeyBtZGZyID0gc2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfVU5ERUZJTkVEX01PRElGSUVSOyB9CisKKwkJKCBtPW1vZGlmaWVyX2RlY2xhcmF0aW9uICB7IG1kZnIgPSAkbS5tZGZyOyB9ICk/CisKKwkgICAgKCBkZWNsX3ZhcmlhYmxlWyBzdGF0ZS0+Z2V0UHJvcGVydHlQYXJ0KCkgLCBtZGZyIF0KKworCSAgICB8IGFkcz1hbnlfZGVmX3N0YXRlbWFjaGluZVsgc3RhdGUgLCBtZGZyICwgc3BjZnIgXQorCisJICAgIHwgZGVmX3RyYW5zaXRpb25bIHN0YXRlICwgbWRmciAsIHNwY2ZyIF0KKworCSAgICB8IGRlZl9zdGF0ZV9hY3Rpdml0eVsgc3RhdGUgXQorCSAgICApCisJICApKgorCTsKKworc2VjdGlvbl90cmFuc2l0aW9uIFsgc2VwOjpNYWNoaW5lICogc3RhdGUgXQorQGluaXR7CisJIHNlcDo6TW9kaWZpZXIgbWRmcjsKKworCXNlcDo6U3BlY2lmaWVyIHNwY2ZyOworfQorCTogJ0B0cmFuc2l0aW9uOicKKwkgICggKCBtPW1vZGlmaWVyX3RyYW5zaXRpb24gIHsgbWRmciA9ICRtLm1kZnI7IH0gKT8KKwkgICAgZGVmX3RyYW5zaXRpb25bIHN0YXRlICwgbWRmciAsIHNwY2ZyIF0KKwkgICkqCisJOworCitkZWZfdHJhbnNpdGlvbgorLyogaW4gKi9bIHNlcDo6TWFjaGluZSAqIHN0YXRlICwKKwkJc2VwOjpNb2RpZmllciBtZGZyICwgc2VwOjpTcGVjaWZpZXIgc3BjZnIgXQorQGluaXR7CisJc2VwOjpUcmFuc2l0aW9uICogdHJhbnMgPSBOVUxMOworCXN0ZDo6c3RyaW5nIHRfaWQ7CisKKwltUHJvY2VkdXJlQ2FsbENvdW50ID0gMDsKKworCVNBVkVfUlVMRV9CRUdJTl9MT0NBVElPTjsKK30KK0BhZnRlcnsKKwlpZiggKG1Qcm9jZWR1cmVDYWxsQ291bnQgPiAwKSAmJiAodHJhbnMgIT0gTlVMTCkgKQorCXsKKwkJc2VwOjpQYXJzZXJVdGlsOjppbmxpbmVUcmFuc2l0aW9uUHJvY2VkdXJlQ2FsbCh0cmFucywgdHJhbnMtPmdldE5hbWVJRCgpKTsKKwl9CisKKwlTRVRfUlVMRV9MT0NBVElPTih0cmFucyk7Cit9CisJOiAoIHRvaz0nQCcKKwkgIHwgKCB0b2s9QVRfSUQgIHsgdF9pZCA9IFNUUigkdG9rLnRleHQtPmNoYXJzKTsgfSApCisJICApCisJICB7CisJICAJc3RhdGUtPmdldFVuaXFCZWhhdmlvclBhcnQoKS0+c2F2ZU91dGdvaW5nVHJhbnNpdGlvbigKKwkgIAkJCXRyYW5zID0gbmV3IHNlcDo6VHJhbnNpdGlvbihzdGF0ZSwgbmV3VHJhbnNpdGlvbklEKHRfaWQpKSApOworCisJICAJdHJhbnMtPnNldE1vZGlmaWVyKCBtZGZyICk7CisKKwkgIAl0cmFucy0+c2V0U3BlY2lmaWVyKCBzcGNmciApOworCSAgfQorCSAgKCBMVF8gIG1vY190cmFuc2l0aW9uWyB0cmFucyBdICBHVCApPworCisJICBtb2VfdHJhbnNpdGlvblsgdHJhbnMgXQorCisJfCAndHJhbnNpdGlvbicKKwkgIHsKKwkgIAlzdGF0ZS0+Z2V0VW5pcUJlaGF2aW9yUGFydCgpLT5zYXZlT3V0Z29pbmdUcmFuc2l0aW9uKAorCSAgCQkJdHJhbnMgPSBuZXcgc2VwOjpUcmFuc2l0aW9uKHN0YXRlKSApOworCisJICAJdHJhbnMtPnNldE1vZGlmaWVyKCBtZGZyICk7CisKKwkgIAl0cmFucy0+c2V0U3BlY2lmaWVyKCBzcGNmciApOworCSAgfQorCSAgKCBMVF8gbW9jX3RyYW5zaXRpb25bIHRyYW5zIF0gR1QgKT8KKworCSAgKCBpZD1JRCB7IHRfaWQgPSBTVFIoJGlkLnRleHQtPmNoYXJzKTsgfSApPworCSAgeyB0cmFucy0+ZnVsbHlVcGRhdGVBbGxOYW1lSUQoIG5ld1RyYW5zaXRpb25JRCh0X2lkKSApOyB9CisKKwkgICggU3RyaW5nTGl0ZXJhbAorCSAgeyB0cmFucy0+c2V0VW5yZXN0cmljdGVkTmFtZShTVFIoJFN0cmluZ0xpdGVyYWwudGV4dC0+Y2hhcnMpKTsgfQorCSAgKT8KKworCSAgbW9lX3RyYW5zaXRpb25bIHRyYW5zIF0KKwk7CisKK2tpbmRfdHJhbnNpdGlvbgorcmV0dXJucyBbIHNlcDo6VHJhbnNpdGlvbjo6TU9DX0tJTkQga2luZCBdCisJOiBpZD1JRAorCXsKKwkJaWYoICgka2luZCA9IHNlcDo6VHJhbnNpdGlvbjo6dG9Nb2NLaW5kKFNUUigkaWQudGV4dC0+Y2hhcnMpKSkgPT0KKwkJCXNlcDo6VHJhbnNpdGlvbjo6TU9DX1VOREVGSU5FRF9LSU5EICkKKwkJeworCQkJc2VwOjpQYXJzZXJVdGlsOjphdm1fc3ludGF4X2Vycm9yKCAia2luZF90cmFuc2l0aW9uIiwgJGlkLmxpbmUgKQorCQkJCQk8PCAidW5leHBlY3RlZCBJRDwgIiA8PCBTVFIoJGlkLnRleHQtPmNoYXJzKSA8PCAiID4iCisJCQkJCTw8IHNlcDo6UGFyc2VyVXRpbDo6U1lOVEFYX0VSUk9SX0VPTDsKKwkJfQorCX0KKy8vCXwgJ3NpbXBsZScgICB7ICRraW5kID0gc2VwOjpUcmFuc2l0aW9uOjpNT0NfU0lNUExFX0tJTkQ7ICAgfQorCXwgJ2Fib3J0JyAgICB7ICRraW5kID0gc2VwOjpUcmFuc2l0aW9uOjpNT0NfQUJPUlRfS0lORDsgICAgfQorCXwgJ2ZpbmFsJyAgICB7ICRraW5kID0gc2VwOjpUcmFuc2l0aW9uOjpNT0NfRklOQUxfS0lORDsgICAgfQorCXwgJ2Vsc2UnICAgICB7ICRraW5kID0gc2VwOjpUcmFuc2l0aW9uOjpNT0NfRUxTRV9LSU5EOyAgICAgfQorLy8JfCAnaW50ZXJuYWwnIHsgJGtpbmQgPSBzZXA6OlRyYW5zaXRpb246Ok1PQ19JTlRFUk5BTF9LSU5EOyB9CisvLwl8ICdhdXRvJyAgICAgeyAka2luZCA9IHNlcDo6VHJhbnNpdGlvbjo6TU9DX0FVVE9fS0lORDsgICAgIH0KKwl8ICdmbG93JyAgICAgeyAka2luZCA9IHNlcDo6VHJhbnNpdGlvbjo6TU9DX0ZMT1dfS0lORDsgICAgIH0KKwk7CisKKworbW9jX3RyYW5zaXRpb25fYXR0cmlidXRlCityZXR1cm5zIFsgc2VwOjpUcmFuc2l0aW9uOjptb2Nfa2luZF90IGtpbmQgXQorQGluaXR7CisJJGtpbmQgPSBzZXA6OlRyYW5zaXRpb246Ok1PQ19VTkRFRklORURfS0lORDsKK30KKwk6IGt0PWtpbmRfdHJhbnNpdGlvbiB7ICRraW5kID0gJGt0LmtpbmQ7IH0KKwkoIEJBTkQgJ2Vsc2UnICAgICAgICB7ICRraW5kID0gJGtpbmQgfCBzZXA6OlRyYW5zaXRpb246Ok1PQ19FTFNFX0tJTkQ7IH0gKT8KKwk7CisKK21vY190cmFuc2l0aW9uIFsgc2VwOjpUcmFuc2l0aW9uICogdHJhbnMgXQorCTogbW9jX3RyYW5zaXRpb25fYXRvbVsgdHJhbnMgXSAoIENPTU1BIG1vY190cmFuc2l0aW9uX2F0b21bIHRyYW5zIF0gKSoKKwk7CisKK21vY190cmFuc2l0aW9uX2F0b20gWyBzZXA6OlRyYW5zaXRpb24gKiB0cmFucyBdCisJOiAoICdtb2M6JyApPyBrdD1tb2NfdHJhbnNpdGlvbl9hdHRyaWJ1dGUKKwl7IHRyYW5zLT5zZXRNb2NLaW5kKCAka3Qua2luZCApOyB9CisKKwl8ICggJ3ByaW9yOicgKT8gbj1pbnRlZ2VyX2NvbnN0YW50CisJeyB0cmFucy0+c2V0UHJpb3JpdHkoICRuLnZhbCApOyB9CisKKwl8ICggJ3Byb2JhOicgKT8gcD1mbG9hdF9jb25zdGFudAorCXsgdHJhbnMtPnNldFByb2JhYmlsaXR5KCAkcC52YWwgKTsgfQorCTsKKworCittb2VfdHJhbnNpdGlvbiBbIHNlcDo6VHJhbnNpdGlvbiAqIHRyYW5zIF0KKwk6IGJzPXRyYW5zaXRpb25fc3RhdGVtZW50ICAgICAgICB7IHRyYW5zLT5zZXRTdGF0ZW1lbnQoJGJzLmFjKTsgICB9CisJICAoICggJy0tPicgKT8KKwkgICAgdGlkPXRhcmdldF9zdGF0ZV9pZCAgICAgICAgICB7IHRyYW5zLT5zZXRUYXJnZXQoJHRpZC50YXJnZXQpOyB9CisvLwkgICAgKCBDT01NQSB0aWQ9dGFyZ2V0X3N0YXRlX2lkICB7IHRyYW5zLT5hcHBlbmRUYXJnZXQoJHRpZC50YXJnZXQpOyB9ICkqCisJICBTRU1JICk/CisKKwl8ICctLT4nIHRpZD10YXJnZXRfc3RhdGVfaWQgICAgICB7IHRyYW5zLT5zZXRUYXJnZXQoJHRpZC50YXJnZXQpOyB9CisvLwkgICggQ09NTUEgdGlkPXRhcmdldF9zdGF0ZV9pZCAgICB7IHRyYW5zLT5hcHBlbmRUYXJnZXQoJHRpZC50YXJnZXQpOyB9ICkqCisJICAoIGJzPXRyYW5zaXRpb25fc3RhdGVtZW50ICAgICAgeyB0cmFucy0+c2V0U3RhdGVtZW50KCRicy5hYyk7IH0KKwkgIHwgU0VNSQorCSAgKQorCTsKKwordHJhbnNpdGlvbl9zdGF0ZW1lbnQKK3JldHVybnMgWyBzZXA6OkJGQ29kZSBhYyBdCitAaW5pdHsKKwlzZXA6Ok9wZXJhdG9yICogb3AgPSBPUChTRVFVRU5DRSk7CisJYm9vbCBpbXBsaWNpdFNlcXVlbmNlT3AgPSB0cnVlOworfQorQGFmdGVyeworCWlmKCBpbXBsaWNpdFNlcXVlbmNlT3AgJiYgJGFjLnZhbGlkKCkgJiYgJGFjLT5zaW5nbGV0b24oKSAmJgorCQkJc2VwOjpPcGVyYXRvck1hbmFnZXI6OmlzU2NoZWR1bGUob3ApICkKKwl7CisJCXNlcDo6QkZDb2RlIHNpbmdsZUNvZGUgPSAkYWMtPmZpcnN0KCkuYmZDb2RlKCk7CisJCSRhYyA9IHNpbmdsZUNvZGU7CisJfQorfQorCTogTENVUkxZICAoIG89b3BfYmxvY2sgeyBvcCA9ICRvLm9wOyBpbXBsaWNpdFNlcXVlbmNlT3AgPSBmYWxzZTsgfSApPworCSAgICB7ICRhYyA9IE5FV19TVE1UKG9wKTsgfQorCQkoIHM9c3RhdGVtZW50ICB7ICRhYy0+YXBwZW5kKCRzLmFjKTsgfSApKgorCisJCSggdHJhbnNpdGlvbl90cmlnZ2VyWyBhYyBdICk/CisJCSggdHJhbnNpdGlvbl9ndWFyZFsgYWMgXSApPworCQkoIHRyYW5zaXRpb25fdGltZWRfZ3VhcmRbIGFjIF0gKT8KKwkJKCB0cmFuc2l0aW9uX2VmZmVjdFsgYWMgXSApPworCSAgUkNVUkxZCisJOworCit0cmFuc2l0aW9uX3RyaWdnZXIgWyBzZXA6OkJGQ29kZSAmIGFjIF0KKwk6ICdAdHJpZ2dlcjonICggcz1zdGF0ZW1lbnRfY29tX2lucHV0ICB7ICRhYy0+YXBwZW5kKCAkcy5hYyApOyB9ICApKgorCTsKKwordHJhbnNpdGlvbl9ndWFyZCBbIHNlcDo6QkZDb2RlICYgYWMgXQorCTogJ0BndWFyZDonCisJCSggcz1zdGF0ZW1lbnRfZ3VhcmQKKwkJeyAkYWMtPmFwcGVuZCggJHMuYWMgKTsgfQorCisJCXwgZT1leHByZXNzaW9uCisJCXsgJGFjLT5hcHBlbmQoIE5FV19TVE1UMShPUChHVUFSRCksICRlLmJmKSApOyB9CisKKwkJfCBMQlJBQ0tFVCBlPWV4cHJlc3Npb24gUkJSQUNLRVQKKwkJeyAkYWMtPmFwcGVuZCggTkVXX1NUTVQxKE9QKEdVQVJEKSwgJGUuYmYpICk7IH0KKwkJKSoKKwk7CisKK3RyYW5zaXRpb25fdGltZWRfZ3VhcmQgWyBzZXA6OkJGQ29kZSAmIGFjIF0KKwk6ICdAdGd1YXJkOicKKwkJKCBzPXN0YXRlbWVudF90aW1lZF9ndWFyZAorCQl7ICRhYy0+YXBwZW5kKCAkcy5hYyApOyB9CisKKwkJfCBlPWV4cHJlc3Npb24KKwkJeyAkYWMtPmFwcGVuZCggTkVXX1NUTVQxKE9QKFRJTUVEX0dVQVJEKSwgJGUuYmYpICk7IH0KKworCQl8IExDVVJMWSBlPWV4cHJlc3Npb24gUkNVUkxZCisJCXsgJGFjLT5hcHBlbmQoIE5FV19TVE1UMShPUChUSU1FRF9HVUFSRCksICRlLmJmKSApOyB9CisJCSkqCisJOworCit0cmFuc2l0aW9uX2VmZmVjdCBbIHNlcDo6QkZDb2RlICYgYWMgXQorCTogJ0BlZmZlY3Q6JyAoIHM9c3RhdGVtZW50ICB7ICRhYy0+YXBwZW5kKCAkcy5hYyApOyB9ICkqCisJOworCisKK3RhcmdldF9zdGF0ZV9pZAorcmV0dXJucyBbIHNlcDo6QkYgdGFyZ2V0IF0KK0Bpbml0eworCXN0ZDo6c3RyaW5nIHRpZDsKKwlzZXA6OmF2bV9zaXplX3QgbmIgPSAxOworfQorQGFmdGVyeworCWlmKCAodGFyZ2V0ID0gc2VwOjpQYXJzZXJVdGlsOjpnZXR2YXJNYWNoaW5lKHRpZCwgbmIpKS5pbnZhbGlkKCkgKQorCXsKKwkJdGFyZ2V0ID0gTkVXX1FOSUQodGlkLCBuYik7CisJfQorfQorCToga3c9dGFyZ2V0X3N0YXRlX2t3X2lkICB7IHRpZCA9ICRrdy5zOyB9CisKKwl8IHU9cXVhbGlmaWVkTmFtZUlEICAgICAgICAgIHsgdGlkID0gJHUuczsgbmIgPSAkdS5uYjsgfQorCisJfCBET0xMQVIgaWQ9SUQgICAgeyB0aWQgPSIkIiArIFNUUigkaWQudGV4dC0+Y2hhcnMpOyB9CisJOworCisKK3RhcmdldF9zdGF0ZV9rd19pZAorcmV0dXJucyBbIHN0ZDo6c3RyaW5nIHMgXQorCTogJyNpbml0JyAgICAgIHsgJHMgPSAiI2luaXQiICAgIDsgfQorCXwgJyNpbml0aWFsJyAgIHsgJHMgPSAiI2luaXRpYWwiIDsgfQorCXwgJyNzdGFydCcgICAgIHsgJHMgPSAiI3N0YXJ0IiAgIDsgfQorCisJfCAnI2RoaXN0b3J5JyAgeyAkcyA9ICIjZGhpc3RvcnkiOyB9CisJfCAnI3NoaXN0b3J5JyAgeyAkcyA9ICIjc2hpc3RvcnkiOyB9CisKKwl8ICcjZmluYWwnCisJeyAkcyA9ICIjZmluYWwiOworCQluZWVkRGVmYXVsdFN0YXRlRmluYWwucHVzaF9iYWNrKF9DUE1fLT5nZXRDb250YWluZXJNYWNoaW5lKCkpOyB9CisKKwl8ICcjdGVybWluYWwnCisJeyAkcyA9ICIjdGVybWluYWwiOworCQluZWVkRGVmYXVsdFN0YXRlVGVybWluYWwucHVzaF9iYWNrKF9DUE1fLT5nZXRDb250YWluZXJNYWNoaW5lKCkpOyB9CisKKwl8ICcjcmV0dXJuJworCXsgJHMgPSAiI3JldHVybiI7CisJCW5lZWREZWZhdWx0U3RhdGVSZXR1cm4ucHVzaF9iYWNrKF9DUE1fLT5nZXRDb250YWluZXJNYWNoaW5lKCkpOyB9CisJOworCisKK2RlZl9zdGF0ZV9hY3Rpdml0eSBbIHNlcDo6TWFjaGluZSAqIHN0YXRlIF0KK0Bpbml0eworCXNlcDo6QmVoYXZpb3JhbFBhcnQgKiB0aGVCZWhhdmlvciA9IHN0YXRlLT5nZXRVbmlxQmVoYXZpb3JQYXJ0KCk7Cit9CisJOiAnQGNyZWF0ZScgICBicz1ibG9ja19zdGF0ZW1lbnQgIHsgdGhlQmVoYXZpb3ItPnNlcU9uQ3JlYXRlKCRicy5hYyk7IH0KKwl8ICdAaW5pdCcgICAgIGJzPWJsb2NrX3N0YXRlbWVudCAgeyB0aGVCZWhhdmlvci0+c2VxT25Jbml0KCRicy5hYyk7ICAgfQorCisJfCAnQGllbmFibGUnICBicz1ibG9ja19zdGF0ZW1lbnQgIHsgdGhlQmVoYXZpb3ItPnNlcU9uSUVuYWJsZSgkYnMuYWMpOyB9CisJfCAnQGVuYWJsZScgICBicz1ibG9ja19zdGF0ZW1lbnQgIHsgdGhlQmVoYXZpb3ItPnNlcU9uRW5hYmxlICgkYnMuYWMpOyB9CisKKwl8ICdAaWRpc2FibGUnIGJzPWJsb2NrX3N0YXRlbWVudCAgeyB0aGVCZWhhdmlvci0+c2VxT25JRGlzYWJsZSgkYnMuYWMpOyB9CisJfCAnQGRpc2FibGUnICBicz1ibG9ja19zdGF0ZW1lbnQgIHsgdGhlQmVoYXZpb3ItPnNlcU9uRGlzYWJsZSAoJGJzLmFjKTsgfQorCisJfCAnQGlhYm9ydCcgICBicz1ibG9ja19zdGF0ZW1lbnQgIHsgdGhlQmVoYXZpb3ItPnNlcU9uSUFib3J0KCRicy5hYyk7IH0KKwl8ICdAYWJvcnQnICAgIGJzPWJsb2NrX3N0YXRlbWVudCAgeyB0aGVCZWhhdmlvci0+c2VxT25BYm9ydCgkYnMuYWMpOyB9CisKKwl8ICdAaXJ1bicgICAgIGJzPWJsb2NrX3N0YXRlbWVudCAgeyB0aGVCZWhhdmlvci0+c2VxT25JUnVuKCRicy5hYyk7IH0KKwl8ICdAcnVuJyAgICAgIGJzPWJsb2NrX3N0YXRlbWVudCAgeyB0aGVCZWhhdmlvci0+c2VxT25SdW4oJGJzLmFjKTsgfQorCXwgJ0BydGMnICAgICAgYnM9YmxvY2tfc3RhdGVtZW50ICB7IHRoZUJlaGF2aW9yLT5zZXFPblJ0YygkYnMuYWMpOyB9CisKKwl8ICdAZmluYWwnICAgIGJzPWJsb2NrX3N0YXRlbWVudCAgeyB0aGVCZWhhdmlvci0+c2VxT25GaW5hbCgkYnMuYWMpOyB9CisJOworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTRUNUSU9OIEhFQURFUiBJTVBPUlQgUEFSQU1FVEVSIFBST1BFUlRZIG9yIERFRkFVTFQgREVDTEFSQVRJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3NlY3Rpb25faGVhZGVyX2ltcG9ydF9wYXJhbWV0ZXJfcHJvcGVydHkKKy8qIGluICovWyBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIgXQorCTogKCBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25faGVhZGVyX3ByZWRpY2F0ICkgPT4KKwkgIHNlY3Rpb25faGVhZGVyWyBjb250YWluZXIgXQorCisJICAoIHNlY3Rpb25faW1wb3J0WyBjb250YWluZXIgXSApPworCisJICAoIHNlY3Rpb25fcGFyYW1ldGVyWyBjb250YWluZXIgXSApPworCisJICAvLyBDb25kaXRpb25hbCBUZW1wbGF0ZSBDb2RlIEdlbmVyYXRpb24gZm9yIEBkZWNsYXJhdGlvbgorCSAgeyAgc2VwOjpUZW1wbGF0ZUZhY3Rvcnk6OmdlblByb3BlcnR5KCBjb250YWluZXIgKTsgfQorCisJICAoIHNlY3Rpb25fcHJvcGVydHlbIGNvbnRhaW5lciBdICkqCisKKwl8ICggZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX2ltcG9ydF9wcmVkaWNhdCApID0+CisJICBzZWN0aW9uX2ltcG9ydFsgY29udGFpbmVyIF0KKworCSAgKCBzZWN0aW9uX3BhcmFtZXRlclsgY29udGFpbmVyIF0gKT8KKworCSAgLy8gQ29uZGl0aW9uYWwgVGVtcGxhdGUgQ29kZSBHZW5lcmF0aW9uIGZvciBAZGVjbGFyYXRpb24KKwkgIHsgIHNlcDo6VGVtcGxhdGVGYWN0b3J5OjpnZW5Qcm9wZXJ0eSggY29udGFpbmVyICk7IH0KKworCSAgKCBzZWN0aW9uX3Byb3BlcnR5WyBjb250YWluZXIgXSApKgorCisJfCAoIGRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wYXJhbWV0ZXJfcHJlZGljYXQgKSA9PgorCSAgc2VjdGlvbl9wYXJhbWV0ZXJbIGNvbnRhaW5lciBdCisKKwkgIC8vIENvbmRpdGlvbmFsIFRlbXBsYXRlIENvZGUgR2VuZXJhdGlvbiBmb3IgQGRlY2xhcmF0aW9uCisJICB7ICBzZXA6OlRlbXBsYXRlRmFjdG9yeTo6Z2VuUHJvcGVydHkoIGNvbnRhaW5lciApOyB9CisKKwkgICggc2VjdGlvbl9wcm9wZXJ0eVsgY29udGFpbmVyIF0gKSoKKworCXwgKCBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJvcGVydHlfcHJlZGljYXQgKSA9PgorCSAgLy8gQ29uZGl0aW9uYWwgVGVtcGxhdGUgQ29kZSBHZW5lcmF0aW9uIGZvciBAZGVjbGFyYXRpb24KKwkgIHsgIHNlcDo6VGVtcGxhdGVGYWN0b3J5OjpnZW5Qcm9wZXJ0eSggY29udGFpbmVyICk7IH0KKworCSAgKCBzZWN0aW9uX3Byb3BlcnR5WyBjb250YWluZXIgXSApKworCisJfCB7ICBzZXA6OlRlbXBsYXRlRmFjdG9yeTo6Z2VuUHJvcGVydHkoIGNvbnRhaW5lciApOyB9CisJICBzZWN0aW9uX3Byb3BlcnR5X2ZyZWVfZGVjbGFyYXRpb25bIGNvbnRhaW5lciBdCisJOworCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIHNlY3Rpb24gUEFSQU1FVEVSIERFQ0xBUkFUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzZWN0aW9uX3BhcmFtZXRlciBbIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lciBdCitAaW5pdHsKKwlzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSA9IGNvbnRhaW5lci0+Z2V0UHJvcGVydHlQYXJ0KCk7CisKKwlTQVZFX1JVTEVfQkVHSU5fTE9DQVRJT047Cit9CitAYWZ0ZXJ7CisJU0VUX1JVTEVfTE9DQVRJT04oZGVjbFByb3BlcnR5KTsKK30KKwk6ICggJ0BwYXJhbWV0ZXI6JyB8ICdAcGFyYW06JyAvKiBkZXByZWNhdGVkICovICkKKwkgICggcHJvcGVydHlfZGVjbGFyYXRpb25bIGRlY2xQcm9wZXJ0eSAsCisJICAJCQlzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9JTlBVVF9QQVJBTUVURVJfTU9ESUZJRVIgIF0KKwkgICkqCisKKwl8ICdAaW5wdXQ6JyAgKCBwcm9wZXJ0eV9kZWNsYXJhdGlvblsgZGVjbFByb3BlcnR5ICwKKwkJCQlzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9JTlBVVF9QQVJBTUVURVJfTU9ESUZJRVIgIF0KKwkgICkqCisKKwl8ICdAaW5vdXQ6JyAgKCBwcm9wZXJ0eV9kZWNsYXJhdGlvblsgZGVjbFByb3BlcnR5ICwKKwkJCQlzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9JTk9VVF9QQVJBTUVURVJfTU9ESUZJRVIgIF0KKwkgICkqCisKKwl8ICdAb3V0cHV0OicgKCBwcm9wZXJ0eV9kZWNsYXJhdGlvblsgZGVjbFByb3BlcnR5ICwKKwkJCQlzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9PVVRQVVRfUEFSQU1FVEVSX01PRElGSUVSIF0KKwkgICkqCisKKwl8ICggJ0ByZXR1cm5zOicgfCAnQHJldHVybjonIC8qIGRlcHJlY2F0ZWQgKi8gKQorCSAgKCBwcm9wZXJ0eV9kZWNsYXJhdGlvblsgZGVjbFByb3BlcnR5ICwKKwkgIAkJCXNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX1JFVFVSTl9QQVJBTUVURVJfTU9ESUZJRVIgXQorCSAgKSoKKwk7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIHNlY3Rpb24gUFJPUEVSVFkgREVDTEFSQVRJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3NlY3Rpb25fcHJvcGVydHkgWyBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIgXQorQGluaXR7CisJc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHkgPSBjb250YWluZXItPmdldFByb3BlcnR5UGFydCgpOworCisJU0FWRV9SVUxFX0JFR0lOX0xPQ0FUSU9OOworfQorQGFmdGVyeworCVNFVF9SVUxFX0xPQ0FUSU9OKGRlY2xQcm9wZXJ0eSk7Cit9CisJOiAoICdAcHJvcGVydHk6JyB8ICdAZGVjbGFyYXRpb246JyAvKiBkZXByZWNhdGVkICovICkKKwkgICggcHJvcGVydHlfZGVjbGFyYXRpb25bIGRlY2xQcm9wZXJ0eSAsCisJICAJCQlzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9VTkRFRklORURfTU9ESUZJRVIgXQorCSAgKSoKKworCXwgJ0BwdWJsaWM6JworCSAgKCBwcm9wZXJ0eV9kZWNsYXJhdGlvblsgZGVjbFByb3BlcnR5ICwKKwkgIAkJCXNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX1BVQkxJQ19NT0RJRklFUiBdCisJICApKgorCisJfCAnQHByb3RlY3RlZDonCisJICAoIHByb3BlcnR5X2RlY2xhcmF0aW9uWyBkZWNsUHJvcGVydHkgLAorCSAgCQkJc2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfUFJPVEVDVEVEX01PRElGSUVSIF0KKwkgICkqCisKKwl8ICdAcHJpdmF0ZTonCisJICAoIHByb3BlcnR5X2RlY2xhcmF0aW9uWyBkZWNsUHJvcGVydHkgLAorCSAgCQkJc2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfUFJJVkFURV9NT0RJRklFUiBdCisJICApKgorCTsKKworCitzZWN0aW9uX3Byb3BlcnR5X2ZyZWVfZGVjbGFyYXRpb24gWyBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIgXQorQGluaXR7CisJc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHkgPSBjb250YWluZXItPmdldFByb3BlcnR5UGFydCgpOworCisJU0FWRV9SVUxFX0JFR0lOX0xPQ0FUSU9OOworfQorQGFmdGVyeworCVNFVF9SVUxFX0xPQ0FUSU9OKGRlY2xQcm9wZXJ0eSk7Cit9CisJOiAoIHByb3BlcnR5X2RlY2xhcmF0aW9uWyBkZWNsUHJvcGVydHkgLAorCSAgCQkJc2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfVU5ERUZJTkVEX01PRElGSUVSIF0KKwkgICkqCisJOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUFJPUEVSVFkgRUxFTUVOVCBERUNMQVJBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworcHJvcGVydHlfZGVjbGFyYXRpb24KKy8qIGluICovWyBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSAsIHNlcDo6TW9kaWZpZXIgbWRmciBdCisJOiAoIG09bW9kaWZpZXJfZGVjbGFyYXRpb24geyBtZGZyLm92ZXJyaWRlX2lmZGVmKCAkbS5tZGZyICk7IH0gKT8KKwkgIGRlY2xfcHJvcGVydHlfZWxlbWVudFsgZGVjbFByb3BlcnR5ICwgbWRmciBdCisJOworCitkZWNsX3Byb3BlcnR5X2VsZW1lbnQKKy8qIGluICovWyBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSAsIHNlcDo6TW9kaWZpZXIgbWRmciBdCisJOiBkZWNsX3ZhcmlhYmxlWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0KKworCXwgZGVjbF9wb3J0ICAgWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0KKwl8IGRlY2xfc2lnbmFsIFsgZGVjbFByb3BlcnR5ICwgbWRmciBdCisJfCBkZWNsX2J1ZmZlciBbIGRlY2xQcm9wZXJ0eSAsIG1kZnIgXQorCXwgZGVjbF9jaGFubmVsWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0KKworCXwgZGVmX3R5cGUgIFsgZGVjbFByb3BlcnR5ICwgbWRmciBdCisJfCBkZWZfZW51bSAgWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0KKwl8IGRlZl91bmlvbiBbIGRlY2xQcm9wZXJ0eSAsIG1kZnIgXQorCXwgZGVmX2Nob2ljZVsgZGVjbFByb3BlcnR5ICwgbWRmciBdCisJfCBkZWZfc3RydWN0WyBkZWNsUHJvcGVydHkgLCBtZGZyIF0KKy8qCisJfCBkZWNsX2Z1bmNbIGRlY2xQcm9wZXJ0eSAsIG1kZnIgXQorCXwgZGVjbF9wcm9jWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0KKworCXwgZGVjbF9sYW1iZGFbIGRlY2xQcm9wZXJ0eSAsIG1kZnIgXQorKi8KKwk7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIGRlY2xhcmF0aW9uIE1BQ0hJTkUgUFJBTUVURVJTCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitsYWJlbGxlZF9hcmd1bWVudAorcmV0dXJucyBbIHN0ZDo6c3RyaW5nIGxhYmVsLCBzZXA6OkJGIGFyZyBdCisJOiAoIElEIENPTE9OICkgPT4gIGlkPUlEIENPTE9OICB7ICRsYWJlbCA9IFNUUigkaWQudGV4dC0+Y2hhcnMpOyB9CisJICBlPWV4cHJlc3Npb24gIHsgJGFyZyA9ICRlLmJmOyB9CisJfCBlPWV4cHJlc3Npb24gIHsgJGFyZyA9ICRlLmJmOyB9CisJOworCitkZWNsX2luc3RhbmNlX21hY2hpbmVfcGFyYW1zIFsgc2VwOjpNYWNoaW5lICogbWFjaGluZSBdCitAaW5pdHsKKwlzZXA6OkJGVmVjdG9yIGxhYmVsbGVkUGFyYW1zKAorCQkoIG1hY2hpbmUtPmdldFR5cGUoKS5pczwgc2VwOjpNYWNoaW5lID4oKSApID8gbWFjaGluZS0+Z2V0VHlwZSgpLgorCQkJdG9fcHRyPCBzZXA6Ok1hY2hpbmUgPigpLT5nZXRWYXJpYWJsZVBhcmFtZXRlcnNDb3VudCgpIDogMCApOworCisJc2VwOjpCRkxpc3QgcG9zaXRpb25hbFBhcmFtczsKK30KK0BhZnRlcnsKKwlpZiggbGFiZWxsZWRQYXJhbXMubm9uZW1wdHkoKSApCisJeworCQlzZXA6OlBhcnNlclV0aWw6OmNvbXB1dGVJbnN0YW5jZU1hY2hpbmVQYXJhbWV0ZXIoCisJCQkJbWFjaGluZSwgbGFiZWxsZWRQYXJhbXMsIHBvc2l0aW9uYWxQYXJhbXMpOworCX0KK30KKwk6IExQQVJFTgorCSAgKCBscD1sYWJlbGxlZF9hcmd1bWVudAorCSAgICB7CisJICAgIAlzZXA6OlBhcnNlclV0aWw6OmFwcGVuZEluc3RhbmNlTWFjaGluZVBhcmFtZXRlcihtYWNoaW5lLCAkbHAubGFiZWwsCisJCQkJCWxhYmVsbGVkUGFyYW1zLCBwb3NpdGlvbmFsUGFyYW1zLCAkbHAuYXJnKTsKKwkgICAgfQorCSAgICAoIENPTU1BCisJICAgIGxwPWxhYmVsbGVkX2FyZ3VtZW50CisJICAgIHsKKwkgICAgCXNlcDo6UGFyc2VyVXRpbDo6YXBwZW5kSW5zdGFuY2VNYWNoaW5lUGFyYW1ldGVyKG1hY2hpbmUsICRscC5sYWJlbCwKKwkJCQkJbGFiZWxsZWRQYXJhbXMsIHBvc2l0aW9uYWxQYXJhbXMsICRscC5hcmcpOworCSAgICB9CisJICAgICkqCisJICApPworCSAgUlBBUkVOCisJOworCisKK2RlY2xfaW5zdGFuY2VfbWFjaGluZV9yZXR1cm5zIFsgc2VwOjpNYWNoaW5lICogbWFjaGluZSBdCitAaW5pdHsKKwlzZXA6OkJGVmVjdG9yIGxhYmVsbGVkUmV0dXJucygKKwkJKCBtYWNoaW5lLT5nZXRUeXBlKCkuaXM8IHNlcDo6TWFjaGluZSA+KCkgKSA/IG1hY2hpbmUtPmdldFR5cGUoKS4KKwkJCXRvX3B0cjwgc2VwOjpNYWNoaW5lID4oKS0+Z2V0VmFyaWFibGVQYXJhbWV0ZXJzQ291bnQoKSA6IDAgKTsKKworCXNlcDo6QkZMaXN0IHBvc2l0aW9uYWxSZXR1cm5zOworfQorQGFmdGVyeworCWlmKCBsYWJlbGxlZFJldHVybnMubm9uZW1wdHkoKSApCisJeworCQlzZXA6OlBhcnNlclV0aWw6OmNvbXB1dGVJbnN0YW5jZU1hY2hpbmVSZXR1cm4oCisJCQkJbWFjaGluZSwgbGFiZWxsZWRSZXR1cm5zLCBwb3NpdGlvbmFsUmV0dXJucyk7CisJfQorfQorCTogKCAnLS0+JyB8ICdyZXR1cm5zOicgKQorCSAgKCBMUEFSRU4KKwkgICAgbHA9bGFiZWxsZWRfYXJndW1lbnQKKwkgICAgeworCSAgICAJc2VwOjpQYXJzZXJVdGlsOjphcHBlbmRJbnN0YW5jZU1hY2hpbmVSZXR1cm4obWFjaGluZSwgJGxwLmxhYmVsLAorCQkJCQlsYWJlbGxlZFJldHVybnMsIHBvc2l0aW9uYWxSZXR1cm5zLCAkbHAuYXJnKTsKKwkgICAgfQorCSAgICAoIENPTU1BCisJICAgICAgbHA9bGFiZWxsZWRfYXJndW1lbnQKKwkgICAgICB7CisJICAgIAlzZXA6OlBhcnNlclV0aWw6OmFwcGVuZEluc3RhbmNlTWFjaGluZVJldHVybihtYWNoaW5lLCAkbHAubGFiZWwsCisJCQkJCWxhYmVsbGVkUmV0dXJucywgcG9zaXRpb25hbFJldHVybnMsICRscC5hcmcpOworCSAgICAgIH0KKwkgICAgKSoKKwkgICAgUlBBUkVOCisKKwkgIHwgbHA9bGFiZWxsZWRfYXJndW1lbnQKKwkgICAgeworCSAgICAJc2VwOjpQYXJzZXJVdGlsOjphcHBlbmRJbnN0YW5jZU1hY2hpbmVSZXR1cm4obWFjaGluZSwgJGxwLmxhYmVsLAorCQkJCQlsYWJlbGxlZFJldHVybnMsIHBvc2l0aW9uYWxSZXR1cm5zLCAkbHAuYXJnKTsKKwkgICAgfQorCSAgKQorCTsKKworCisKK2FjdGl2aXR5X21hY2hpbmVfcGFyYW1fcmV0dXJuCisvKiBpbiAqL1sgY29uc3Qgc2VwOjpCRiAmIGFyZ01hY2hpbmUgLCBzZXA6OkJGQ29kZSAmIGFjIF0KK0Bpbml0eworCXNlcDo6TWFjaGluZSAqIG1hY2hpbmUgPSBhcmdNYWNoaW5lLmlzPCBzZXA6Ok1hY2hpbmUgPigpID8KKwkJCWFyZ01hY2hpbmUudG9fcHRyPCBzZXA6Ok1hY2hpbmUgPigpIDogTlVMTDsKKworCXNlcDo6Um91dGluZSAqIHJvdXRpbmUgPSBOVUxMOworCisJc2VwOjphdm1fc2l6ZV90IHBhcmFtQ291bnQgPSAwOworCXNlcDo6YXZtX3NpemVfdCByZXR1cm5Db3VudCA9IDA7CisJaWYoIG1hY2hpbmUgPT0gTlVMTCApCisJeworCQlyb3V0aW5lID0gTlVMTDsKKwl9CisJZWxzZSBpZiggbWFjaGluZS0+Z2V0U3BlY2lmaWVyKCkuaXNEZXNpZ25JbnN0YW5jZVN0YXRpYygpCisJCQkmJiBtYWNoaW5lLT5nZXRUeXBlKCkuaXM8IHNlcDo6TWFjaGluZSA+KCkgKQorCXsKKwkJcm91dGluZSA9ICYoIG1hY2hpbmUtPmdldFR5cGUoKS50b19wdHI8IHNlcDo6TWFjaGluZSA+KCktPgorCQkJZ2V0QmVoYXZpb3IoKS0+Z2V0QWN0aXZpdHkoIGFjLT5nZXRBdm1PcENvZGUoKSApICk7CisJfQorCWVsc2UgaWYoIGFjLT5pc25vdE9wQ29kZSggc2VwOjpBVk1fT1BDT0RFX0lOVk9LRV9ORVcgKSApCisvLwlpZiggbWFjaGluZS0+aXNEZXNpZ25Qcm90b3R5cGVTdGF0aWMoKSApCisJeworCQlyb3V0aW5lID0gJiggbWFjaGluZS0+Z2V0QmVoYXZpb3IoKS0+CisJCQkJZ2V0QWN0aXZpdHkoIGFjLT5nZXRBdm1PcENvZGUoKSApICk7CisJfQorCisJaWYoIHJvdXRpbmUgIT0gTlVMTCApCisJeworCQlwYXJhbUNvdW50ICA9IHJvdXRpbmUtPmdldFBhcmFtZXRlcnMoKS5zaXplKCk7CisJCXJldHVybkNvdW50ID0gcm91dGluZS0+Z2V0UmV0dXJucygpLnNpemUoKTsKKwl9CisKKworCXNlcDo6QkZWZWN0b3IgbGFiZWxsZWRQYXJhbXMoIHBhcmFtQ291bnQgKTsKKwlzZXA6OkJGTGlzdCBwb3NpdGlvbmFsUGFyYW1zOworCisJc2VwOjpCRlZlY3RvciBsYWJlbGxlZFJldHVybnMoIHJldHVybkNvdW50ICk7CisJc2VwOjpCRkxpc3QgcG9zaXRpb25hbFJldHVybnM7CisKKwlpZiggbWFjaGluZSAhPSBOVUxMICkKKwl7CisJCVBVU0hfQ1RYX0NQTSggbWFjaGluZSApOworCX0KK30KK0BhZnRlcnsKKwlpZiggQkFDS1RSQUNLSU5HPT0wICkKKwl7CisJCXNlcDo6UGFyc2VyVXRpbDo6Y29tcHV0ZUFjdGl2aXR5Um91dGluZVBhcmFtUmV0dXJuKGFyZ01hY2hpbmUsIHJvdXRpbmUsICRhYywKKwkJCWxhYmVsbGVkUGFyYW1zICwgcG9zaXRpb25hbFBhcmFtcywgbGFiZWxsZWRSZXR1cm5zLCBwb3NpdGlvbmFsUmV0dXJucyk7CisJfQorCisJaWYoIG1hY2hpbmUgIT0gTlVMTCApCisJeworCQlQT1BfQ1RYOworCX0KK30KKwk6IExQQVJFTiAgLy8gUGFyYW1ldGVycworCSAgKCBscD1sYWJlbGxlZF9hcmd1bWVudAorCSAgICB7CisJICAgIAlzZXA6OlBhcnNlclV0aWw6OmFwcGVuZFJvdXRpbmVQYXJhbWV0ZXJzKHJvdXRpbmUsICRscC5sYWJlbCwKKwkJCQkJbGFiZWxsZWRQYXJhbXMsIHBvc2l0aW9uYWxQYXJhbXMsICRscC5hcmcpOworCSAgICB9CisJICAgICggQ09NTUEKKwkgICAgbHA9bGFiZWxsZWRfYXJndW1lbnQKKwkgICAgeworCSAgICAJc2VwOjpQYXJzZXJVdGlsOjphcHBlbmRSb3V0aW5lUGFyYW1ldGVycyhyb3V0aW5lLCAkbHAubGFiZWwsCisJCQkJCWxhYmVsbGVkUGFyYW1zLCBwb3NpdGlvbmFsUGFyYW1zLCAkbHAuYXJnKTsKKwkgICAgfQorCSAgICApKgorCSAgKT8KKwkgIFJQQVJFTgorCisJKCAoICctLT4nIHwgJ3JldHVybnM6JyApCisJICAoIExQQVJFTgorCSAgICBscD1sYWJlbGxlZF9hcmd1bWVudAorCSAgICB7CisJICAgIAlzZXA6OlBhcnNlclV0aWw6OmFwcGVuZFJvdXRpbmVSZXR1cm5zKHJvdXRpbmUsICRscC5sYWJlbCwKKwkJCQkJbGFiZWxsZWRSZXR1cm5zLCBwb3NpdGlvbmFsUmV0dXJucywgJGxwLmFyZyk7CisJICAgIH0KKwkgICAgKCBDT01NQQorCSAgICAgIGxwPWxhYmVsbGVkX2FyZ3VtZW50CisJICAgICAgeworCSAgICAJc2VwOjpQYXJzZXJVdGlsOjphcHBlbmRSb3V0aW5lUmV0dXJucyhyb3V0aW5lLCAkbHAubGFiZWwsCisJCQkJCWxhYmVsbGVkUmV0dXJucywgcG9zaXRpb25hbFJldHVybnMsICRscC5hcmcpOworCSAgICAgIH0KKwkgICAgKSoKKwkgICAgUlBBUkVOCisKKwkgIHwgbHA9bGFiZWxsZWRfYXJndW1lbnQKKwkgICAgeworCSAgICAJc2VwOjpQYXJzZXJVdGlsOjphcHBlbmRSb3V0aW5lUmV0dXJucyhyb3V0aW5lLCAkbHAubGFiZWwsCisJCQkJCWxhYmVsbGVkUmV0dXJucywgcG9zaXRpb25hbFJldHVybnMsICRscC5hcmcpOworCSAgICB9CisJICApCisJKT8KKworLy8JfCAnY3R4OicgIExDVVJMWSAgKCBzYT1zdGF0ZW1lbnRfYXNzaWduIHsgJGFjLT5hcHBlbmQoJHNhLmFjKTsgfSApKyAgUkNVUkxZCisJOworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBkZWNsYXJhdGlvbiBDT01NVU5DQVRJT04gUE9JTlQgOiBQT1JUCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitkZWNsX3BvcnQKKy8qIGluICovWyBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSAsIHNlcDo6TW9kaWZpZXIgbWRmciBdCitAaW5pdHsKKwlzZXA6OklDb21Qb2ludDo6RU5VTV9JT19OQVRVUkUgbmF0dXJlID0gc2VwOjpJQ29tUG9pbnQ6OklPX1VOREVGSU5FRF9OQVRVUkU7Cit9CisJOiAncG9ydCcgIHsgbmF0dXJlID0gc2VwOjpJQ29tUG9pbnQ6OklPX1BPUlRfTkFUVVJFOyB9CisJCisJICBkZWNsX3BvcnRfaW1wbFsgZGVjbFByb3BlcnR5ICwgbWRmciwgbmF0dXJlIF0KKwk7CisKK2RlY2xfcG9ydF9pbXBsCisvKiBpbiAqL1sgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHkgLCBzZXA6Ok1vZGlmaWVyIG1kZnIgLAorCQlzZXA6OklDb21Qb2ludDo6RU5VTV9JT19OQVRVUkUgbmF0dXJlIF0KK0Bpbml0eworCXNlcDo6UG9ydCAqIHBvcnQ7CisJc2VwOjpCRiBUUG9ydDsKKwlib29sIGlzYVR5cGUgPSB0cnVlOworfQorCTogKCBJRCApID0+ICBpZD1JRAorCSAgeworCQlkZWNsUHJvcGVydHkuYXBwZW5kUG9ydCggc2VwOjpCRigKKwkJCQlwb3J0ID0gbmV3IHNlcDo6UG9ydChkZWNsUHJvcGVydHksCisJCQkJCQlTVFIoJGlkLnRleHQtPmNoYXJzKSwgbmF0dXJlLAorCQkJCQkJbWRmci5zZXREaXJlY3Rpb25Jbm91dEVsc2UoKSApICkgKTsKKwkgIH0KKwkgICggdHlwZV9wYXJhbV9jb21bIHBvcnQgXSApPyAgU0VNSQorCisJfCBtb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0WyBtZGZyIF0KKwkgICggaWQ9SUQKKwkJeworCQkJZGVjbFByb3BlcnR5LmFwcGVuZFBvcnQoIHNlcDo6QkYoCisJCSAgCQkJcG9ydCA9IG5ldyBzZXA6OlBvcnQoZGVjbFByb3BlcnR5LAorCQkgIAkJCQkJU1RSKCRpZC50ZXh0LT5jaGFycyksIG5hdHVyZSwgbWRmciApICkgKTsKKwkJfQorCQkoIHR5cGVfcGFyYW1fY29tWyBwb3J0IF0gKT8gIFNFTUkKKworCSAgfCBMQ1VSTFkKKwkgIAkoIGlkPUlECisJICAgICAgeworCSAgICAJZGVjbFByb3BlcnR5LmFwcGVuZFBvcnQoIHNlcDo6QkYoCisJICAgIAkJCXBvcnQgPSBuZXcgc2VwOjpQb3J0KGRlY2xQcm9wZXJ0eSwKKwkgICAgCQkJCQlTVFIoJGlkLnRleHQtPmNoYXJzKSwgbmF0dXJlLCBtZGZyKSApICk7CisJICAgICAgfQorCSAgICAgICggdHlwZV9wYXJhbV9jb21bIHBvcnQgXSApPyAgU0VNSQorCSAJKSsKKwkJUkNVUkxZCisJICApCisJfCBMQ1VSTFkKKwkgICggKCBJRCApID0+ICBpZD1JRAorCSAgICB7CisJCQlkZWNsUHJvcGVydHkuYXBwZW5kUG9ydCggc2VwOjpCRigKKwkgICAgCQkJcG9ydCA9IG5ldyBzZXA6OlBvcnQoZGVjbFByb3BlcnR5LAorCQkJICAgIAkJCVNUUigkaWQudGV4dC0+Y2hhcnMpLCBuYXR1cmUsCisJCQkgICAgCQkJbWRmci5zZXREaXJlY3Rpb25Jbm91dEVsc2UoKSApICkgKTsKKwkgIAkJcG9ydC0+c2V0TW9kaWZpZXIoIG1kZnIgKTsKKwkgICAgfQorCSAgICAoIHR5cGVfcGFyYW1fY29tWyBwb3J0IF0gKT8gIFNFTUkKKworCSAgfCBtb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0WyBtZGZyIF0gaWQ9SUQKKwkgICAgeworCSAgICAJZGVjbFByb3BlcnR5LmFwcGVuZFBvcnQoIHNlcDo6QkYoCisJICAgIAkJCXBvcnQgPSBuZXcgc2VwOjpQb3J0KGRlY2xQcm9wZXJ0eSwKKwkgICAgCQkJCQlTVFIoJGlkLnRleHQtPmNoYXJzKSwgbmF0dXJlLCBtZGZyKSApICk7CisJICAgIH0KKwkgICAgKCB0eXBlX3BhcmFtX2NvbVsgcG9ydCBdICk/ICBTRU1JCisJICApKworCSAgUkNVUkxZCisJOworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBkZWNsYXJhdGlvbiBDT01NVU5DQVRJT04gUE9JTlQgOiBNRVNTQUdFIHwgU0lHTkFMCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitkZWNsX3NpZ25hbAorLyogaW4gKi9bIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5ICwgc2VwOjpNb2RpZmllciBtZGZyIF0KK0Bpbml0eworCXNlcDo6SUNvbVBvaW50OjpFTlVNX0lPX05BVFVSRSBuYXR1cmUgPSBzZXA6OklDb21Qb2ludDo6SU9fVU5ERUZJTkVEX05BVFVSRTsKK30KKwk6ICggJ3NpZ25hbCcgIHsgbmF0dXJlID0gc2VwOjpJQ29tUG9pbnQ6OklPX1NJR05BTF9OQVRVUkU7ICB9CisJICB8ICdtZXNzYWdlJyB7IG5hdHVyZSA9IHNlcDo6SUNvbVBvaW50OjpJT19NRVNTQUdFX05BVFVSRTsgfQorCSAgKQorCSAgZGVjbF9zaWduYWxfaW1wbFsgZGVjbFByb3BlcnR5ICwgbWRmciwgbmF0dXJlIF0KKwk7CisKK2RlY2xfc2lnbmFsX2ltcGwKKy8qIGluICovWyBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSAsIHNlcDo6TW9kaWZpZXIgbWRmciAsCisJCXNlcDo6SUNvbVBvaW50OjpFTlVNX0lPX05BVFVSRSBuYXR1cmUgXQorQGluaXR7CisJc2VwOjpQb3J0ICogc2lnbmFsOworCXNlcDo6QkYgVFBvcnQ7CisJYm9vbCBpc2FUeXBlID0gdHJ1ZTsKK30KKwk6ICggSUQgKSA9PiAgaWQ9SUQKKwkgIHsKKwkJZGVjbFByb3BlcnR5LmFwcGVuZFNpZ25hbCggc2VwOjpCRigKKwkJCQlzaWduYWwgPSBuZXcgc2VwOjpTaWduYWwoZGVjbFByb3BlcnR5LAorCQkJCQkJU1RSKCRpZC50ZXh0LT5jaGFycyksIG5hdHVyZSwKKwkJCQkJCW1kZnIuc2V0RGlyZWN0aW9uSW5vdXRFbHNlKCkgKSApICk7CisJICB9CisJICAoIHR5cGVfcGFyYW1fY29tWyBzaWduYWwgXSApPyAgU0VNSQorCisJfCBtb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0WyBtZGZyIF0KKwkgICggaWQ9SUQKKwkJeworCQkJZGVjbFByb3BlcnR5LmFwcGVuZFNpZ25hbCggc2VwOjpCRigKKwkJICAJCQlzaWduYWwgPSBuZXcgc2VwOjpTaWduYWwoZGVjbFByb3BlcnR5LAorCQkgIAkJCQkJU1RSKCRpZC50ZXh0LT5jaGFycyksIG5hdHVyZSwgbWRmciApICkgKTsKKwkJfQorCQkoIHR5cGVfcGFyYW1fY29tWyBzaWduYWwgXSApPyAgU0VNSQorCisJICB8IExDVVJMWQorCSAgCSggaWQ9SUQKKwkgICAgICB7CisJICAgIAlkZWNsUHJvcGVydHkuYXBwZW5kU2lnbmFsKCBzZXA6OkJGKAorCSAgICAJCQlzaWduYWwgPSBuZXcgc2VwOjpTaWduYWwoZGVjbFByb3BlcnR5LAorCSAgICAJCQkJCVNUUigkaWQudGV4dC0+Y2hhcnMpLCBuYXR1cmUsIG1kZnIpICkgKTsKKwkgICAgICB9CisJICAgICAgKCB0eXBlX3BhcmFtX2NvbVsgc2lnbmFsIF0gKT8gIFNFTUkKKwkgCSkrCisJCVJDVVJMWQorCSAgKQorCXwgTENVUkxZCisJICAoICggSUQgKSA9PiAgaWQ9SUQKKwkgICAgeworCQkJZGVjbFByb3BlcnR5LmFwcGVuZFNpZ25hbCggc2VwOjpCRigKKwkgICAgCQkJc2lnbmFsID0gbmV3IHNlcDo6U2lnbmFsKGRlY2xQcm9wZXJ0eSwKKwkJCSAgICAJCQlTVFIoJGlkLnRleHQtPmNoYXJzKSwgbmF0dXJlLAorCQkJICAgIAkJCW1kZnIuc2V0RGlyZWN0aW9uSW5vdXRFbHNlKCkgKSApICk7CisJICAJCXNpZ25hbC0+c2V0TW9kaWZpZXIoIG1kZnIgKTsKKwkgICAgfQorCSAgICAoIHR5cGVfcGFyYW1fY29tWyBzaWduYWwgXSApPyAgU0VNSQorCisJICB8IG1vZGlmaWVyX3NldF9kaXJlY3Rpb25fc3RyaWN0X3RleHRbIG1kZnIgXSBpZD1JRAorCSAgICB7CisJICAgIAlkZWNsUHJvcGVydHkuYXBwZW5kU2lnbmFsKCBzZXA6OkJGKAorCSAgICAJCQlzaWduYWwgPSBuZXcgc2VwOjpTaWduYWwoZGVjbFByb3BlcnR5LAorCSAgICAJCQkJCVNUUigkaWQudGV4dC0+Y2hhcnMpLCBuYXR1cmUsIG1kZnIpICkgKTsKKwkgICAgfQorCSAgICAoIHR5cGVfcGFyYW1fY29tWyBzaWduYWwgXSApPyAgU0VNSQorCSAgKSsKKwkgIFJDVVJMWQorCTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gZGVjbGFyYXRpb24gQ09NTVVOQ0FUSU9OIFBBUkFNRVRFUgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordHlwZV9wYXJhbV9jb20gWyBzZXA6OlBvcnQgKiBwb3J0IF0KK0Bpbml0eworCXNlcDo6YXZtX29mZnNldF90IG9mZnNldCA9IDA7Cit9CisJOiBMUEFSRU4KKwkgICAgcGFyYW1fY29tX2F0b21bIHBvcnQgLCBvZmZzZXRdCisJICAgICggQ09NTUEgcGFyYW1fY29tX2F0b21bIHBvcnQgLCArK29mZnNldCBdICkqCisJICBSUEFSRU4KKwk7CisKK3BhcmFtX2NvbV9hdG9tCisvKiBpbiAqL1sgc2VwOjpQb3J0ICogcG9ydCAsIHNlcDo6YXZtX29mZnNldF90IG9mZnNldCBdCitAaW5pdHsKKwlzZXA6OlZhcmlhYmxlICogdmFyaWFibGU7CisJc2VwOjpCRiBwYXJhbVQgPSBzZXA6OlR5cGVNYW5hZ2VyOjpVTklWRVJTQUw7CisJc3RkOjpzdHJpbmcgcGFyYW1JRDsKKwlzZXA6OkJGIHZhbHVlOworfQorCTogdHY9dHlwZV92YXIgeyBwYXJhbVQgPSAkdHYudHlwZTsgfQorCSAgKCBpZD1JRCAgICAgeyBwYXJhbUlEID0gU1RSKCRpZC50ZXh0LT5jaGFycyk7IH0KKwkgICAgKCBpdj1pbml0aWFsX3ZhbHVlICB7IHZhbHVlID0gJGl2LmJmOyB9ICk/CisJICApPworCXsKKwkJcG9ydC0+c2F2ZVBhcmFtZXRlciggdmFyaWFibGUgPSBuZXcgc2VwOjpWYXJpYWJsZShwb3J0LAorCQkJCXNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX1BBUkFNRVRFUl9NT0RJRklFUiwKKwkJCQlwYXJhbVQsIHBhcmFtSUQsIHZhbHVlKSApOworCX0KKworCXwgJ2JpbmQ6JworCSAgKCAoIHR5cGVfdmFyIENPTE9OICkgPT4gIHR2PXR5cGVfdmFyIENPTE9OICB7IHBhcmFtVCA9ICR0di50eXBlOyB9CisJICAgIGU9ZXhwcmVzc2lvbiB7IHZhbHVlID0gJGUuYmY7IH0KKwkgIHwgdmlkPXF1YWxpZmllZE5hbWVJRAorCSAgeworCSAgCXZhbHVlID0gc2VwOjpQYXJzZXJVdGlsOjpnZXRWYXJpYWJsZSgkdmlkLnMsICR2aWQubmIpOworCSAgCWlmKCB2YWx1ZS52YWxpZCgpICkKKwkgIAl7IHBhcmFtVCA9IHZhbHVlLnRvX3B0cjwgc2VwOjpWYXJpYWJsZSA+KCktPmdldFR5cGUoKTsgfQorCSAgfQorCSAgKQorCXsKKwkJcGFyYW1JRCA9IHNlcDo6T1NTKCkgPDwgJyMnIDw8IG9mZnNldDsKKwkJcG9ydC0+c2F2ZVBhcmFtZXRlciggdmFyaWFibGUgPSBuZXcgc2VwOjpWYXJpYWJsZShwb3J0LAorCQkJCXNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX1BBUkFNRVRFUl9CSU5EX01PRElGSUVSLAorCQkJCXBhcmFtVCwgcGFyYW1JRCwgdmFsdWUpICk7CisJCXZhcmlhYmxlLT5zZXRPZmZzZXQoIG9mZnNldCApOworCX0KKwk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBkZWNsYXJhdGlvbiBCVUZGRVIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2RlY2xfYnVmZmVyCisvKiBpbiAqL1sgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHkgLCBzZXA6Ok1vZGlmaWVyIG1kZnIgXQorCTogJ2J1ZmZlcicgIGRlY2xfYnVmZmVyX2ltcGxbIGRlY2xQcm9wZXJ0eSAsIG1kZnIgXQorCTsKKworZGVjbF9idWZmZXJfaW1wbAorLyogaW4gKi9bIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5ICwgc2VwOjpNb2RpZmllciBtZGZyIF0KK0Bpbml0eworCXNlcDo6QnVmZmVyICogYnVmZmVyOworCisJc2VwOjpCRiBUQnVmZmVyOworCWJvb2wgaXNhVHlwZSA9IHRydWU7Cit9CisJOiBkYj1kZWZfYnVmZmVyICBpZD1JRAorCXsKKwkJZGVjbFByb3BlcnR5LmFwcGVuZEJ1ZmZlciggc2VwOjpCRigKKwkJCQlidWZmZXIgPSBuZXcgc2VwOjpCdWZmZXIoIGRlY2xQcm9wZXJ0eSwKKwkJCQkJCVNUUigkaWQudGV4dC0+Y2hhcnMpLCAkZGIua2luZCwgJGRiLnNpemUpKSApOworCSAgCWJ1ZmZlci0+c2V0TW9kaWZpZXIoIG1kZnIgKTsKKwl9CisJICAoIGluaXRpYWxfYnVmZmVyX2NvbnRlbnRzWyBidWZmZXIgXSApPyAgU0VNSQorCisJfCBMQ1VSTFkKKwkgICgKKwkgICAgZGI9ZGVmX2J1ZmZlciAgaWQ9SUQKKwkgICAgeworCSAgCQlkZWNsUHJvcGVydHkuYXBwZW5kQnVmZmVyKCBzZXA6OkJGKAorCSAgCQkJCWJ1ZmZlciA9IG5ldyBzZXA6OkJ1ZmZlcihkZWNsUHJvcGVydHksCisJICAJCQkJCQlTVFIoJGlkLnRleHQtPmNoYXJzKSwgJGRiLmtpbmQsICRkYi5zaXplKSkgKTsKKwkgIAkJYnVmZmVyLT5zZXRNb2RpZmllciggbWRmciApOworCSAgICB9CisJICApKworCSAgUkNVUkxZCisJOworCisKK2RlZl9idWZmZXIKK3JldHVybnMgWyBzZXA6OmF2bV90eXBlX3NwZWNpZmllcl9raW5kX3Qga2luZCAsIGludCBzaXplID0gLTEgXQorCTogcGI9cG9saWN5X2J1ZmZlciAgeyAka2luZCA9ICRwYi5raW5kOyB9CisJICAoIExUXworCSAgICAoIG49aW50ZWdlcl9jb25zdGFudCAgeyAkc2l6ZSA9ICRuLnZhbDsgfQorCSAgICB8IFNUQVIgICAgICAgICAgICAgICAgeyAkc2l6ZSA9IC0xOyB9CisJICAgICkKKwkgIEdUICk/CisKKwl8ICdyYW0nICB7ICRraW5kID0gc2VwOjpUWVBFX1JBTV9TUEVDSUZJRVI7ICRzaXplID0gMTsgfQorCTsKKworCitwb2xpY3lfYnVmZmVyCityZXR1cm5zIFsgc2VwOjphdm1fdHlwZV9zcGVjaWZpZXJfa2luZF90IGtpbmQgXQorCTogJ2ZpZm8nICAgICAgeyAka2luZCA9IHNlcDo6VFlQRV9GSUZPX1NQRUNJRklFUjsgICAgICAgICAgIH0KKwl8ICdsaWZvJyAgICAgIHsgJGtpbmQgPSBzZXA6OlRZUEVfTElGT19TUEVDSUZJRVI7ICAgICAgICAgICB9CisJfCAnbXVsdGlmaWZvJyB7ICRraW5kID0gc2VwOjpUWVBFX01VTFRJX0ZJRk9fU1BFQ0lGSUVSOyAgICAgfQorCXwgJ211bHRpbGlmbycgeyAka2luZCA9IHNlcDo6VFlQRV9NVUxUSV9MSUZPX1NQRUNJRklFUjsgICAgIH0KKwl8ICdzZXQnICAgICAgIHsgJGtpbmQgPSBzZXA6OlRZUEVfU0VUX1NQRUNJRklFUjsgICAgICAgICAgICB9CisJfCAnbXVsdGlzZXQnICB7ICRraW5kID0gc2VwOjpUWVBFX01VTFRJU0VUX1NQRUNJRklFUjsgICAgICAgfQorCXwgJ3ZlY3RvcicgICAgeyAka2luZCA9IHNlcDo6VFlQRV9WRUNUT1JfU1BFQ0lGSUVSOyAgICAgICAgIH0KKwl8ICdydmVjdG9yJyAgIHsgJGtpbmQgPSBzZXA6OlRZUEVfUkVWRVJTRV9WRUNUT1JfU1BFQ0lGSUVSOyB9CisJOworCityZWZfYnVmZmVyWyBzZXA6Ok1hY2hpbmUgKiBtYWNoaW5lIF0KK3JldHVybnMgWyBzZXA6OkJGIGJ1ZiBdCisJOiBpZD1xdWFsaWZpZWROYW1lSUQKKwl7ICRidWYgPSBzZXA6OlBhcnNlclV0aWw6OmdldEJ1ZmZlcihtYWNoaW5lLCAkaWQucywgJGlkLm5iKTsgfQorCTsKKworCitpbml0aWFsX2J1ZmZlcl9jb250ZW50c1sgY29uc3Qgc2VwOjpCdWZmZXIgKiBidWZmZXIgXQorQGluaXR7CisJc2VwOjpCRiBtc2c7Cit9CisJOiBBU1NJR04gTEJSQUNLRVQKKwkgICAgbWlkPXF1YWxpZmllZE5hbWVJRAorCSAgICB7LyogbXNnID0gc2VwOjpQYXJzZXJVdGlsOjpnZXRNZXNzYWdlKCRtaWQucywgJG1pZC5uYik7CisJICAgIAlidWZmZXItPmFwcGVuZE1lc3NhZ2UobXNnKTsgKi99CisJICAoIENPTU1BIG1pZD1xdWFsaWZpZWROYW1lSUQKKwkgICkqCisJICBSQlJBQ0tFVAorCTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gZGVjbGFyYXRpb24gQ0hBTk5FTAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworZGVjbF9jaGFubmVsCisvKiBpbiAqL1sgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHkgLCBzZXA6Ok1vZGlmaWVyIG1kZnIgXQorCTogJ2NoYW5uZWwnICBkZWNsX2NoYW5uZWxfcG9ydFsgZGVjbFByb3BlcnR5ICwgbWRmciBdCisvKgkgICggSUQgTENVUkxZICA9PiAgZGVjbF9jaGFubmVsX3BvcnRbIGRlY2xQcm9wZXJ0eSAsIG1kZnIgXQorCSAgfCBkZWNsX2NoYW5uZWxfdmFyWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0KKwkgICkKKyovCTsKKworCitkZWNsX2NoYW5uZWxfcG9ydAorLyogaW4gKi9bIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5ICwgc2VwOjpNb2RpZmllciBtZGZyIF0KK0Bpbml0eworCXNlcDo6Q2hhbm5lbCAqIGFDaGFubmVsOworCisgIAlkZWNsUHJvcGVydHkuYXBwZW5kQ2hhbm5lbCggc2VwOjpCRiggYUNoYW5uZWwgPQorICAJCQluZXcgc2VwOjpDaGFubmVsKCBkZWNsUHJvcGVydHksCisgIAkJCQkJIiNjaGFubmVsIyIsIG1kZnIuc2V0RGlyZWN0aW9uSW5vdXRFbHNlKCkgKSApKTsKKworfQorCTogKCBMVF8KKwkgICAgY29tX3Byb3RvY29sWyBkZWNsUHJvcGVydHkuZ2V0Q29udGFpbmVyKCktPmFzPCBzZXA6Ok1hY2hpbmUgPigpLCBhQ2hhbm5lbCBdCisJICAgICggQ09NTUEgY29tX2Nhc3RbIGFDaGFubmVsIF0gKT8KKwkgICAgR1QKKwkgICk/CisKKwkgICggbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dFsgYUNoYW5uZWwtPmdldHdNb2RpZmllcigpIF0gKSA/CisJICBpZD1JRCAgeyBhQ2hhbm5lbC0+ZnVsbHlVcGRhdGVBbGxOYW1lSUQoIFNUUigkaWQudGV4dC0+Y2hhcnMpICk7IH0KKworCSAgTENVUkxZCisJICAoCisJICAgIG09bW9kaWZpZXJfZGlyZWN0aW9uICB1aWQ9cXVhbGlmaWVkTmFtZUlEIFNFTUkKKwkgICAgeworCSAgICAJc2VwOjpCRiBjb21TaWduYWwgPSBzZXA6OlBhcnNlclV0aWw6OmdldENvbVNpZ25hbCgkdWlkLnMsICR1aWQubmIpOworCSAgCQlpZiggY29tU2lnbmFsLnZhbGlkKCkgKQorCSAgCQl7CisJICAJCQlhQ2hhbm5lbC0+YXBwZW5kU2lnbmFsKCRtLm1kZnIsIGNvbVNpZ25hbCk7CisJICAJCX0KKwkgICAgfQorCisJICB8IGRlY2xfcG9ydFsgKihhQ2hhbm5lbC0+Z2V0Q29udGVudHMoKSkgLAorCSAgCQkJCQlzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9QVUJMSUNfTU9ESUZJRVIgXQorCSAgCQkJCQkKKwkgIHwgZGVjbF9zaWduYWxbICooYUNoYW5uZWwtPmdldENvbnRlbnRzKCkpICwKKwkgIAkJCQkJc2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfUFVCTElDX01PRElGSUVSIF0KKwkgICkrCisJICBSQ1VSTFkKKwk7CisKKworZGVjbF9jaGFubmVsX3ZhcgorLyogaW4gKi9bIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5ICwgc2VwOjpNb2RpZmllciBtZGZyIF0KK0Bpbml0eworCXNlcDo6VmFyaWFibGUgKiB2YXI7Cit9CisJOiB0dj10eXBlX3ZhciAgaWQ9SUQKKwkgIHsKKwkgIAlkZWNsUHJvcGVydHkuc2F2ZU93bmVkVmFyaWFibGUoIHZhciA9IG5ldyBzZXA6OlZhcmlhYmxlKAorCSAgCQkJZGVjbFByb3BlcnR5LCBtZGZyLCAkdHYudHlwZSwgU1RSKCRpZC50ZXh0LT5jaGFycykpICk7CisJICB9CisJICAoIGl2PWluaXRpYWxfdmFsdWUgIHsgdmFyLT5zZXRWYWx1ZSgkaXYuYmYpOyB9ICk/CisJICAoIFNFTUkgIHwgIG9uX3dyaXRlX3Zhcl9yb3V0aW5lX2RlZlsgdmFyIF0gKQorCisJfCBMQ1VSTFkgKAorCSAgdHY9dHlwZV92YXIgIGlkPUlECisJICB7CisJICAJZGVjbFByb3BlcnR5LnNhdmVPd25lZFZhcmlhYmxlKCB2YXIgPSBuZXcgc2VwOjpWYXJpYWJsZSgKKwkgIAkJCWRlY2xQcm9wZXJ0eSwgbWRmciwgJHR2LnR5cGUsIFNUUigkaWQudGV4dC0+Y2hhcnMpKSApOworCSAgfQorCSAgKCBpdj1pbml0aWFsX3ZhbHVlICB7IHZhci0+c2V0VmFsdWUoJGl2LmJmKTsgfSApPworCSAgKCBTRU1JICB8ICBvbl93cml0ZV92YXJfcm91dGluZV9kZWZbIHZhciBdICkKKwkgICkrICBSQ1VSTFkKKwk7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIGRlY2xhcmF0aW9uIFZBUgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworZGVjbF92YXJpYWJsZQorLyogaW4gKi9bIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5ICwgc2VwOjpNb2RpZmllciBtZGZyIF0KKwk6ICggJ3ZhcicgICAgICB7ICBtZGZyLnNldE5hdHVyZVZhcmlhYmxlKCk7IH0KKwkgIHwgJ3ZhbCcgICAgICB7ICBtZGZyLnNldEZlYXR1cmVDb25zdCgpOyAgIH0KKwkgIHwgKCAnY29uc3QnICB7ICBtZGZyLnNldEZlYXR1cmVDb25zdCgpOyAgIH0KKwkgICAgfCAnbWFjcm8nICB7ICBtZGZyLnNldE5hdHVyZU1hY3JvKCk7ICAgIH0KKwkgICAgKSsKKwkgICAgKCAndmFyJyApPworCSAgKQorCSAgZGVjbF92YXJpYWJsZV9pbXBsWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0KKworCXwgZGVjbF92YXJpYWJsZV90aW1lX2Nsb2NrX2ltcGxbIGRlY2xQcm9wZXJ0eSAsIG1kZnIgXQorCTsKKworCitkZWNsX3ZhcmlhYmxlX3RpbWVfY2xvY2tfaW1wbAorLyogaW4gKi9bIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5ICwgc2VwOjpNb2RpZmllciBtZGZyIF0KK0Bpbml0eworCW1kZnIub3ZlcnJpZGVfaWZkZWYoIHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX1BVQkxJQ19WT0xBVElMRV9NT0RJRklFUiApOworfQorCTogY3R2PXRpbWVfY2xvY2tfdHlwZQorCSAgZGVjbF90eXBlZF92YXJpYWJsZV9hdG9tX2ltcGxbIGRlY2xQcm9wZXJ0eSAsIG1kZnIgLCAkY3R2LmJ0cyBdCisJOworCisKK2RlY2xfdmFyaWFibGVfaW1wbAorLyogaW4gKi9bIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5ICwgc2VwOjpNb2RpZmllciBtZGZyIF0KKwk6IGRlY2xfdmFyaWFibGVfYXRvbV9pbXBsWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0KKworCXwgTENVUkxZCisJICAoIGRlY2xfdmFyaWFibGVfYXRvbV9pbXBsWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0gKSsKKwkgIFJDVVJMWQorCTsKKworZGVjbF92YXJpYWJsZV9hdG9tX2ltcGwKKy8qIGluICovWyBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSAsIHNlcDo6TW9kaWZpZXIgbWRmciBdCisJOiB0dj10eXBlX3ZhcgorCSAgZGVjbF90eXBlZF92YXJpYWJsZV9hdG9tX2ltcGxbIGRlY2xQcm9wZXJ0eSAsIG1kZnIgLCAkdHYudHlwZSBdCisJOworCitkZWNsX3R5cGVkX3ZhcmlhYmxlX2F0b21faW1wbAorLyogaW4gKi9bIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5ICwKKwkJc2VwOjpNb2RpZmllciBtZGZyICwgY29uc3Qgc2VwOjpCRiAmIHR5cGUgXQorQGluaXR7CisJc2VwOjpWYXJpYWJsZSAqIHZhcjsKK30KKwk6IGlkPUlECisJICB7CisJICAJZGVjbFByb3BlcnR5LnNhdmVPd25lZFZhcmlhYmxlKCB2YXIgPSBuZXcgc2VwOjpWYXJpYWJsZSgKKwkgIAkJCWRlY2xQcm9wZXJ0eSwgbWRmciwgdHlwZSwgU1RSKCRpZC50ZXh0LT5jaGFycykpICk7CisJICB9CisKKwkgICggU3RyaW5nTGl0ZXJhbAorCSAgeyB2YXItPnNldFVucmVzdHJpY3RlZE5hbWUoU1RSKCRTdHJpbmdMaXRlcmFsLnRleHQtPmNoYXJzKSk7IH0KKwkgICk/CisKKwkgICggaXY9aW5pdGlhbF92YWx1ZSAgeyB2YXItPnNldFZhbHVlKCRpdi5iZik7IH0gKT8KKwkgICggU0VNSSAgfCAgb25fd3JpdGVfdmFyX3JvdXRpbmVfZGVmWyB2YXIgXSApCisJOworCisKK2luaXRpYWxfdmFsdWUKK3JldHVybnMgWyBzZXA6OkJGIGJmIF0KKwk6IEFTU0lHTiAgZT1leHByZXNzaW9uICAgICAgICAgIHsgJGJmID0gJGUuYmY7IH0KKwl8IExQQVJFTiAgZT1leHByZXNzaW9uICBSUEFSRU4gIHsgJGJmID0gJGUuYmY7IH0KKwk7CisKKwordHlwZV92YXIKK3JldHVybnMgWyBzZXA6OkJGIHR5cGUgXQorCTogYnR2PWJhc2VfdHlwZV92YXIgICAgICAgICAgICAgICAgICB7ICR0eXBlID0gJGJ0di50eXBlOyB9CisJICAoIGR0YT1kZWZfdHlwZV9hcnJheVsgdHlwZSAsICIiIF0gIHsgJHR5cGUgPSAkZHRhLnR5cGU7IH0gKT8KKworCXwgZHRjPWRlZl90eXBlX2NvbnRhaW5lclsgIiIgXSAgICAgICB7ICR0eXBlID0gJGR0Yy50eXBlOyB9CisKKwl8IGR0aT1kZWZfdHlwZV9pbnRlcnZhbCBbICIiIF0gICAgICAgeyAkdHlwZSA9ICRkdGkudHlwZTsgfQorCTsKKworCitkZWZfdHlwZV9hcnJheQorLyogaW4gKi9bIHNlcDo6QkYgYmFzZVQgLCBjb25zdCBzdGQ6OnN0cmluZyAmIHRpZCBdCityZXR1cm5zIFsgc2VwOjpCRiB0eXBlIF0KK0Bpbml0eworCXNlcDo6TGlzdE9mSW50IGxpc3RPZlNpemU7Cit9CisJOiAoIGR0YT1kZWZfdHlwZV9hcnJheV9zaXplICB7IGxpc3RPZlNpemUucHVzaF9iYWNrKCRkdGEuc2l6ZSk7IH0gKSsKKwl7CisJCWludCBzelQgPSBsaXN0T2ZTaXplLmZyb250KCk7CisJCWxpc3RPZlNpemUucG9wX2Zyb250KCk7CisKKwkJd2hpbGUoIGxpc3RPZlNpemUubm9uZW1wdHkoKSApCisJCXsKKwkJCWJhc2VUID0gc2VwOjpCRiggc2VwOjpEYXRhVHlwZTo6bmV3Q29udGFpbmVyKF9DUE1fLAorCQkJCQlzZXA6OkRhdGFUeXBlOjpzdHJDb250YWluZXJJZChzZXA6OlRZUEVfQVJSQVlfU1BFQ0lGSUVSLAorCQkJCQkJCWJhc2VULCBsaXN0T2ZTaXplLmJhY2soKSksCisJCQkJCXNlcDo6VFlQRV9BUlJBWV9TUEVDSUZJRVIsIGJhc2VULCBsaXN0T2ZTaXplLmJhY2soKSkgKTsKKwkJCWxpc3RPZlNpemUucG9wX2JhY2soKTsKKwkJfQorCQl0eXBlID0gc2VwOjpCRiggc2VwOjpEYXRhVHlwZTo6bmV3Q29udGFpbmVyKF9DUE1fLAorCQkJCXNlcDo6RGF0YVR5cGU6OnN0ckNvbnRhaW5lcklkKAorCQkJCQkJdGlkLCBzZXA6OlRZUEVfQVJSQVlfU1BFQ0lGSUVSLCBiYXNlVCwgc3pUKSwKKwkJCQlzZXA6OlRZUEVfQVJSQVlfU1BFQ0lGSUVSLCBiYXNlVCwgc3pUKSApOworCX0KKwk7CisKK2RlZl90eXBlX2FycmF5X3NpemUKK3JldHVybnMgWyBpbnQgc2l6ZSBdCisJOiBMQlJBQ0tFVAorCSAgICAoIHN6PUludGVnZXJMaXRlcmFsICAgIHsgc2l6ZSA9IE5VTV9JTlQoJHN6LnRleHQtPmNoYXJzKTsgfQorLy8JICAgICggc3o9aW50ZWdlcl9jb25zdGFudCAgeyBzaXplID0gJHN6LnZhbDsgfQorCisJCXwgaWQ9cXVhbGlmaWVkTmFtZUlECisJCXsKKwkJCWNvbnN0IHNlcDo6QkYgJiBjb25zdFZhciA9CisJCQkJCXNlcDo6UGFyc2VyVXRpbDo6Z2V0Q29uc3RhbnQoJGlkLnMsICRpZC5uYik7CisJCQlpZiggY29uc3RWYXIudmFsaWQoKSAmJgorCQkJCWNvbnN0VmFyLnRvX3B0cjwgc2VwOjpWYXJpYWJsZSA+KCktPmhhc1ZhbHVlKCkgJiYKKwkJCQljb25zdFZhci50b19wdHI8IHNlcDo6VmFyaWFibGUgPigpLT5nZXRWYWx1ZSgpLmlzSW50ZWdlcigpICkKKwkJCXsKKwkJCQlzaXplID0gY29uc3RWYXIudG9fcHRyPCBzZXA6OlZhcmlhYmxlID4oKS0+Z2V0VmFsdWUoKS50b0ludGVnZXIoKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlzZXA6OkJGIGFUeXBlID0gc2VwOjpQYXJzZXJVdGlsOjpnZXREYXRhVHlwZSgkaWQucywgJGlkLm5iKTsKKworCQkJCWlmKCBhVHlwZS52YWxpZCgpICYmIGFUeXBlLmlzPCBzZXA6OkRhdGFUeXBlID4oKSApCisJCQkJeworCQkJCQlpZiggYVR5cGUudG9fcHRyPCBzZXA6OkRhdGFUeXBlID4oKS0+aXNUeXBlZEludGVydmFsKCkgKQorCQkJCQl7CisJCQkJCQlzaXplID0gYVR5cGUudG9fcHRyPCBzZXA6OkRhdGFUeXBlID4oKS0+Z2V0SW50ZXJ2YWxMZW5ndGgoKTsKKworCQkJCQkJaWYoIHNpemUgPCAwICkKKwkJCQkJCXsKKwkJCQkJCQlzZXA6OlBhcnNlclV0aWw6OmF2bV9zeW50YXhfZXJyb3IoCisJCQkJCQkJCSJkZWZfdHlwZV9hcnJheV9zaXplKC4uLikiICkKKwkJCQkJCQkJCTw8ICJ1bmV4cGVjdGVkIDw8IGludGVydmFsOiAiIDw8ICRpZC5zCisJCQkJCQkJCQk8PCAiID4+IGFzIHNpemUgKGkuZS4gIiA8PCBzaXplCisJCQkJCQkJCQk8PCAiKSBpbiBhbiBhcnJheSB0eXBlZGVmIgorCQkJCQkJCQkJPDwgc2VwOjpQYXJzZXJVdGlsOjpTWU5UQVhfRVJST1JfRU9MOworCisJCQkJCQkJc2l6ZSA9IDA7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZSBpZiggYVR5cGUudG9fcHRyPCBzZXA6OkRhdGFUeXBlID4oKS0+aXNUeXBlZEVudW0oKSApCisJCQkJCXsKKwkJCQkJCXNpemUgPSBhVHlwZS50b19wdHI8IHNlcDo6RGF0YVR5cGUgPigpLT5nZXRFbnVtU2l6ZSgpOworCisJCQkJCQlpZiggc2l6ZSA9PSAwICkKKwkJCQkJCXsKKwkJCQkJCQlzZXA6OlBhcnNlclV0aWw6OmF2bV9zeW50YXhfZXJyb3IoCisJCQkJCQkJCSJkZWZfdHlwZV9hcnJheV9zaXplKC4uLikiICkKKwkJCQkJCQkJCTw8ICJ1bmV4cGVjdGVkIDw8IGVudW06ICIgPDwgJGlkLnMKKwkJCQkJCQkJCTw8ICIgPj4gYXMgc2l6ZSBpbiBhbiBhcnJheSB0eXBlZGVmIgorCQkJCQkJCQkJPDwgc2VwOjpQYXJzZXJVdGlsOjpTWU5UQVhfRVJST1JfRU9MOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJc2l6ZSA9IDA7CisKKwkJCQkJCXNlcDo6UGFyc2VyVXRpbDo6YXZtX3N5bnRheF9lcnJvcigKKwkJCQkJCQkiZGVmX3R5cGVfYXJyYXlfc2l6ZSguLi4pIiApCisJCQkJCQkJCTw8ICJ1bmV4cGVjdGVkIDw8IFtRdWFsaWZpZWRdTmFtZUlEOiAiIDw8ICRpZC5zCisJCQkJCQkJCTw8ICIgPj4gYXMgc2l6ZSBpbiBhbiBhcnJheSB0eXBlZGVmIgorCQkJCQkJCQk8PCBzZXA6OlBhcnNlclV0aWw6OlNZTlRBWF9FUlJPUl9FT0w7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJc2l6ZSA9IDA7CisKKwkJCQkJc2VwOjpQYXJzZXJVdGlsOjphdm1fc3ludGF4X2Vycm9yKAorCQkJCQkJImRlZl90eXBlX2FycmF5X3NpemUoLi4uKSIgKQorCQkJCQkJCTw8ICJ1bmV4cGVjdGVkIDw8IFtRdWFsaWZpZWRdTmFtZUlEOiAiIDw8ICRpZC5zCisJCQkJCQkJPDwgIiA+PiBhcyBzaXplIGluIGFuIGFycmF5IHR5cGVkZWYiCisJCQkJCQkJPDwgc2VwOjpQYXJzZXJVdGlsOjpTWU5UQVhfRVJST1JfRU9MOworCQkJCX0KKwkJCX0KKwkJfQorCQkpCisJICBSQlJBQ0tFVAorCTsKKworCitkZWZfdHlwZV9jb250YWluZXIgWyBjb25zdCBzdGQ6OnN0cmluZyAmIHRpZCBdCityZXR1cm5zIFsgc2VwOjpCRiB0eXBlIF0KK0Bpbml0eworCXNlcDo6QkYgYmFzZVQgPSBzZXA6OlR5cGVNYW5hZ2VyOjpVTklWRVJTQUw7CisJaW50IHN6VCA9IC0xOworfQorIAk6IHNiPXNwZWNpZmllcl9idWZmZXIKKyAJICAoIExUXworCSAgICAoICggYnR2PWJhc2VfdHlwZV92YXIgIHsgYmFzZVQgPSAkYnR2LnR5cGU7IH0KKwkgICAgICAgICggQ09NTUEgICggJ3NpemU6JyApPworCSAgICAgICAgICAoIHN6PWludGVnZXJfY29uc3RhbnQgeyBzelQgPSAkc3oudmFsOyB9CisJICAgICAgICAgIHwgU1RBUiAgICAgICAgICAgICAgICB7IHN6VCA9IC0xOyB9CisJICAgICAgICAgICkKKwkgICAgICAgICk/CisJICAgICAgKQorCSAgICB8ICggJ3NpemU6JyApPyBzej1pbnRlZ2VyX2NvbnN0YW50ICB7IHN6VCA9ICRzei52YWw7IH0KKwkgICAgKQorCSAgICBHVAorCSAgKT8KKwl7CisJCSR0eXBlID0gc2VwOjpCRiggc2VwOjpEYXRhVHlwZTo6bmV3Q29udGFpbmVyKF9DUE1fLAorCQkJCXNlcDo6RGF0YVR5cGU6OnN0ckNvbnRhaW5lcklkKHRpZCwgJHNiLmtpbmQsIGJhc2VULCBzelQpLAorCQkJCSRzYi5raW5kLCBiYXNlVCwgc3pUKSApOworCX0KKwk7CisKKworc3BlY2lmaWVyX2J1ZmZlcgorcmV0dXJucyBbIHNlcDo6YXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCBraW5kIF0KKwk6ICdhcnJheScgICAgIHsgJGtpbmQgPSBzZXA6OlRZUEVfQVJSQVlfU1BFQ0lGSUVSOyAgICAgICAgICB9CisJfCAndmVjdG9yJyAgICB7ICRraW5kID0gc2VwOjpUWVBFX1ZFQ1RPUl9TUEVDSUZJRVI7ICAgICAgICAgfQorCXwgJ3J2ZWN0b3InICAgeyAka2luZCA9IHNlcDo6VFlQRV9SRVZFUlNFX1ZFQ1RPUl9TUEVDSUZJRVI7IH0KKwl8ICdsaXN0JyAgICAgIHsgJGtpbmQgPSBzZXA6OlRZUEVfTElTVF9TUEVDSUZJRVI7ICAgICAgICAgICB9CisJfCAnZmlmbycgICAgICB7ICRraW5kID0gc2VwOjpUWVBFX0ZJRk9fU1BFQ0lGSUVSOyAgICAgICAgICAgfQorCXwgJ2xpZm8nICAgICAgeyAka2luZCA9IHNlcDo6VFlQRV9MSUZPX1NQRUNJRklFUjsgICAgICAgICAgIH0KKwl8ICdtdWx0aWZpZm8nIHsgJGtpbmQgPSBzZXA6OlRZUEVfTVVMVElfRklGT19TUEVDSUZJRVI7ICAgICB9CisJfCAnbXVsdGlsaWZvJyB7ICRraW5kID0gc2VwOjpUWVBFX01VTFRJX0xJRk9fU1BFQ0lGSUVSOyAgICAgfQorCXwgJ3NldCcgICAgICAgeyAka2luZCA9IHNlcDo6VFlQRV9TRVRfU1BFQ0lGSUVSOyAgICAgICAgICAgIH0KKwl8ICdtdWx0aXNldCcgIHsgJGtpbmQgPSBzZXA6OlRZUEVfTVVMVElTRVRfU1BFQ0lGSUVSOyAgICAgICB9CisJOworCisKK2RlZl90eXBlX2ludGVydmFsIFsgY29uc3Qgc3RkOjpzdHJpbmcgJiB0aWQgXQorcmV0dXJucyBbIHNlcDo6QkYgdHlwZSBdCitAaW5pdHsKKwlzZXA6OkJGIGJhc2VUID0gc2VwOjpUeXBlTWFuYWdlcjo6SU5URUdFUjsKK30KKwk6ICdpbnRlcnZhbCcgIHsgJHR5cGUgPSBzZXA6OlR5cGVNYW5hZ2VyOjpJTlRFR0VSOyB9CisJICBMVF8KKwkgICAgKCBwdD1wcmltaXRpdmVfdHlwZSB7IGJhc2VUID0gJHB0LmJ0czsgfSApPworCSAgICAobGw9TEJSQUNLRVQgfCBsbD1SQlJBQ0tFVCB8IGxsPUxQQVJFTikKKwkgICAgbWluPWV4cHJlc3Npb24gQ09NTUEgIG1heD1leHByZXNzaW9uCisJICAgIChycj1MQlJBQ0tFVCB8IHJyPVJCUkFDS0VUIHwgcnI9UlBBUkVOKQorCSAgR1QKKwl7CisJCSR0eXBlID0gc2VwOjpCRiggc2VwOjpEYXRhVHlwZTo6bmV3SW50ZXJ2YWwoX0NQTV8sIHRpZCwgYmFzZVQsCisJCQlzZXA6OklJbnRlcnZhbEtpbmQ6OmNvbXB1dGVLaW5kKENIQVIoJGxsKSwgQ0hBUigkcnIpKSwKKwkJCSRtaW4uYmYsICRtYXguYmYpICk7CisJfQorCTsKKworCitiYXNlX3R5cGVfdmFyCityZXR1cm5zIFsgc2VwOjpCRiB0eXBlIF0KKwk6IHB0PXByaW1pdGl2ZV90eXBlCisJeyAkdHlwZSA9ICRwdC5idHM7IH0KKwl8IGlkPXF1YWxpZmllZE5hbWVJRAorCXsgJHR5cGUgPSBzZXA6OlBhcnNlclV0aWw6OmdldERhdGFUeXBlKCRpZC5zLCAkaWQubmIpOyB9CisJOworCisKK3ByaW1pdGl2ZV90eXBlCityZXR1cm5zIFsgc2VwOjpUeXBlU3BlY2lmaWVyIGJ0cyBdCitAaW5pdHsKKwlzZXA6OmF2bV9zaXplX3QgYXJpdHkgPSAxOworfQorCTogKCAnYm9vbGVhbicgfCAnYm9vbCcgKSB7ICRidHMgPSBzZXA6OlR5cGVNYW5hZ2VyOjpCT09MRUFOOyB9CisKKwl8ICggJ2ludGVnZXInIHwgJ2ludCcgKSAgeyAkYnRzID0gc2VwOjpUeXBlTWFuYWdlcjo6SU5URUdFUjsgfQorCSAgKCBiZnM9Yml0X2ZpZWxkX3NpemUKKwkgICAgeyAkYnRzID0gc2VwOjpUeXBlTWFuYWdlcjo6Z2V0VHlwZUludGVnZXIoICRiZnMuc2l6ZSApOyB9CisJICApPworCisJfCAoICd1aW50ZWdlcicgfCAndWludCcgKSAgeyAkYnRzID0gc2VwOjpUeXBlTWFuYWdlcjo6VUlOVEVHRVI7IH0KKwkgICggYmZzPWJpdF9maWVsZF9zaXplCisJICB7ICRidHMgPSBzZXA6OlR5cGVNYW5hZ2VyOjpnZXRUeXBlVUludGVnZXIoICRiZnMuc2l6ZSApOyB9CisJICApPworCisJfCAoICdwb3NfaW50ZWdlcicgfCAncG9zX2ludCcgKSAgeyAkYnRzID0gc2VwOjpUeXBlTWFuYWdlcjo6UE9TX0lOVEVHRVI7IH0KKwkgICggYmZzPWJpdF9maWVsZF9zaXplCisJICB7ICRidHMgPSBzZXA6OlR5cGVNYW5hZ2VyOjpnZXRUeXBlUG9zSW50ZWdlciggJGJmcy5zaXplICk7IH0KKwkgICk/CisKKworCXwgKCAoICdyYXRpb25hbCcgIHwgJ3JhdCcgICkgIHsgJGJ0cyA9IHNlcDo6VHlwZU1hbmFnZXI6OlJBVElPTkFMOyB9CisJICB8ICggJ3VyYXRpb25hbCcgfCAndXJhdCcgKSAgeyAkYnRzID0gc2VwOjpUeXBlTWFuYWdlcjo6VVJBVElPTkFMOyB9CisKKwkgIHwgJ2Zsb2F0JyAgICB7ICRidHMgPSBzZXA6OlR5cGVNYW5hZ2VyOjpGTE9BVDsgfQorCSAgfCAndWZsb2F0JyAgIHsgJGJ0cyA9IHNlcDo6VHlwZU1hbmFnZXI6OlVGTE9BVDsgfQorCisJICB8ICdkb3VibGUnICAgeyAkYnRzID0gc2VwOjpUeXBlTWFuYWdlcjo6RE9VQkxFOyB9CisJICB8ICd1ZG91YmxlJyAgeyAkYnRzID0gc2VwOjpUeXBlTWFuYWdlcjo6VURPVUJMRTsgfQorCisJICB8ICdyZWFsJyAgICAgeyAkYnRzID0gc2VwOjpUeXBlTWFuYWdlcjo6UkVBTDsgfQorCSAgfCAndXJlYWwnICAgIHsgJGJ0cyA9IHNlcDo6VHlwZU1hbmFnZXI6OlVSRUFMOyB9CisJICApCisJICAoIGJmcz1iaXRfZmllbGRfc2l6ZQorCSAgeworCSAgCSRidHMgPSBzZXA6OlR5cGVNYW5hZ2VyOjpuZXdOdW1lcmljVHlwZVNwZWNpZmllcigKKwkgIAkJCSRidHMsICRiZnMuc2l6ZSwgc2VwOjpFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfWkVSTyk7CisJICB9CisJICApPworCisKKwl8IGN0PXRpbWVfY2xvY2tfdHlwZSB7ICRidHMgPSAkY3QuYnRzOyB9CisKKwl8IHR0PXRpbWVfdHlwZSB7ICRidHMgPSAkdHQuYnRzOyB9CisKKwl8ICdjaGFyJyAgICB7ICRidHMgPSBzZXA6OlR5cGVNYW5hZ2VyOjpDSEFSOyB9CisJICAoIGJmcz1iaXRfZmllbGRfc2l6ZQorCSAgeyAkYnRzID0gc2VwOjpUeXBlTWFuYWdlcjo6bmV3Q2hhcmFjdGVyKCAiY2hhciIsICRiZnMuc2l6ZSApOyB9CisJICApPworCisJfCAnY2hhcmFjdGVyJyAgICB7ICRidHMgPSBzZXA6OlR5cGVNYW5hZ2VyOjpDSEFSQUNURVI7IH0KKwkgICggYmZzPWJpdF9maWVsZF9zaXplCisJICB7ICRidHMgPSBzZXA6OlR5cGVNYW5hZ2VyOjpuZXdDaGFyYWN0ZXIoICJjaGFyYWN0ZXIiLCAkYmZzLnNpemUgKTsgfQorCSAgKT8KKworCXwgJ3N0cmluZycgIHsgJGJ0cyA9IHNlcDo6VHlwZU1hbmFnZXI6OlNUUklORzsgfQorCSAgKCBzZnM9c3RyaW5nX2ZpZWxkX3NpemUKKwkgIHsgJGJ0cyA9IHNlcDo6VHlwZU1hbmFnZXI6Om5ld1N0cmluZyggJHNmcy5taW4gLCAkc2ZzLm1heCApOyB9CisJICApPworCisKKwl8ICdvcGVyYXRvcicgICB7ICRidHMgPSBzZXA6OlR5cGVNYW5hZ2VyOjpPUEVSQVRPUjsgICB9CisJfCAnYXZtY29kZScgICAgeyAkYnRzID0gc2VwOjpUeXBlTWFuYWdlcjo6QVZNQ09ERTsgICAgfQorCisJfCAncG9ydCcgICAgICAgeyAkYnRzID0gc2VwOjpUeXBlTWFuYWdlcjo6UE9SVDsgICAgICAgfQorCXwgJ2J1ZmZlcicgICAgIHsgJGJ0cyA9IHNlcDo6VHlwZU1hbmFnZXI6OkJVRkZFUjsgICAgIH0KKwl8ICdtZXNzYWdlJyAgICB7ICRidHMgPSBzZXA6OlR5cGVNYW5hZ2VyOjpNRVNTQUdFOyAgICB9CisJfCAnc2lnbmFsJyAgICAgeyAkYnRzID0gc2VwOjpUeXBlTWFuYWdlcjo6U0lHTkFMOyAgICAgfQorCXwgJ2Nvbm5lY3RvcicgIHsgJGJ0cyA9IHNlcDo6VHlwZU1hbmFnZXI6OkNPTk5FQ1RPUjsgfQorCisJfCAnbWFjaGluZScgICAgeyAkYnRzID0gc2VwOjpUeXBlTWFuYWdlcjo6TUFDSElORTsgICAgfQorCSAgKCBMVF8gIGlkPXF1YWxpZmllZE5hbWVJRCAgR1QKKwkgIHsKKwkgIAlzZXA6OkJGIG1hY2hpbmVUID0KKwkgIAkJCXNlcDo6UGFyc2VyVXRpbDo6Z2V0RXhlY3V0YWJsZU1hY2hpbmUoJGlkLnMsICRpZC5uYik7CisJICB9CisJICApPworCisJfCAndW5pdmVyc2FsJyAgeyAkYnRzID0gc2VwOjpUeXBlTWFuYWdlcjo6VU5JVkVSU0FMOyB9CisJOworCisKK2JpdF9maWVsZF9zaXplCityZXR1cm5zIFsgaW50IHNpemUgXQorCTogQ09MT04gIG49aW50ZWdlcl9jb25zdGFudCAgICAgICAgICAgICAgICAgIHsgc2l6ZSA9ICRuLnZhbDsgfQorCXwgTFRfICAoICdzaXplOicgKT8gIG49aW50ZWdlcl9jb25zdGFudCAgR1QgIHsgc2l6ZSA9ICRuLnZhbDsgfQorCTsKKworCitzdHJpbmdfZmllbGRfc2l6ZQorcmV0dXJucyBbIGludCBtaW49MCAsIGludCBtYXg9LTEgXQorCTogQ09MT04gcmM9cmFuZ2VfY29uc3RhbnQKKwkgIHsgJG1pbiA9ICRyYy5taW47ICRtYXggPSAkcmMubWF4OyB9CisKKwl8IExUXyAgKCAnc2l6ZTonICk/ICByYz1yYW5nZV9jb25zdGFudCAgR1QKKwkgIHsgJG1pbiA9ICRyYy5taW47ICRtYXggPSAkcmMubWF4OyB9CisJOworCityYW5nZV9jb25zdGFudAorcmV0dXJucyBbIGludCBtaW49MCAsIGludCBtYXg9LTEgXQorCTogbj1pbnRlZ2VyX2NvbnN0YW50ICAgIHsgJG1heCA9ICRuLnZhbDsgfQorCSAgKCAoIENPTU1BIHwgRE9URE9UICkKKwkgICAgbj1pbnRlZ2VyX2NvbnN0YW50ICB7ICRtaW4gPSAkbWF4OyAkbWF4ID0gJG4udmFsOyB9CisJICApPworCTsKKworb25fd3JpdGVfdmFyX3JvdXRpbmVfZGVmIFsgc2VwOjpWYXJpYWJsZSAqIHZhciBdCisJOiBMQ1VSTFkgICggdmFyX3JvdXRpbmVfZGVmWyB2YXIgXSApKyBSQ1VSTFkKKwk7CisKKwordmFyX3JvdXRpbmVfZGVmIFsgc2VwOjpWYXJpYWJsZSAqIHZhciBdCitAaW5pdHsKKwlzZXA6OlJvdXRpbmUgKiBvbldyaXRlUm91dGluZSA9IE5VTEw7CisKKwlzZXA6OkJlaGF2aW9yYWxQYXJ0ICogYUJlaGF2aW9yYWxwYXJ0ID0gdmFyLT5nZXRVbmlxQ29udGFpbmVyT2ZSb3V0aW5lcygpOworCisJU0FWRV9SVUxFX0JFR0lOX0xPQ0FUSU9OOworfQorQGFmdGVyeworCVNFVF9SVUxFX0xPQ0FUSU9OKCBvbldyaXRlUm91dGluZSApOworfQorCTogJ0Bvbl93cml0ZScKKwkgIHsKKwkgIAlvbldyaXRlUm91dGluZSA9IG5ldyBzZXA6OlJvdXRpbmUodmFyLCAib25fd3JpdGUiKTsKKwkgIAl2YXItPnNldE9uV3JpdGVSb3V0aW5lKG9uV3JpdGVSb3V0aW5lKTsKKwkgIAlpZiggYUJlaGF2aW9yYWxwYXJ0ICE9IE5VTEwgKQorCSAgCXsKKwkgIAkJYUJlaGF2aW9yYWxwYXJ0LT5zYXZlQW5vbnltb3VzSW5uZXJSb3V0aW5lKG9uV3JpdGVSb3V0aW5lKTsKKwkgIAl9CisJICB9CisJICAoIHJvdXRpbmVfc2luZ2xlX3BhcmFtWypvbldyaXRlUm91dGluZSwgdmFyLT5nZXRUeXBlKCldICk/CisJICAoIGJzPWJsb2NrX3N0YXRlbWVudCAgeyBvbldyaXRlUm91dGluZS0+c2V0Q29kZSgkYnMuYWMpOyB9CisJICB8ICd8PT4nIGNlPWNvbmRpdGlvbmFsRXhwcmVzc2lvbiBTRU1JCisJICB7IG9uV3JpdGVSb3V0aW5lLT5zZXRDb2RlKCBORVdfU1RNVDEoT1AoR1VBUkQpLCAkY2UuYmYpICk7IH0KKwkgICkKKwk7CisKK3JvdXRpbmVfc2luZ2xlX3BhcmFtCisvKiBpbiAqL1sgc2VwOjpSb3V0aW5lICYgcm91dGluZSAsIGNvbnN0IHNlcDo6QkYgJiBkZnRUeXBlIF0KK0Bpbml0eworCXNlcDo6QkYgcGFyYW1UID0gZGZ0VHlwZTsKKwlzZXA6OkJGIHZhbHVlOworfQorCTogTFBBUkVOCisJICAoICggdHlwZV92YXIgSUQgKSA9PiB0dj10eXBlX3ZhciB7IHBhcmFtVCA9ICR0di50eXBlOyB9ICBpZD1JRAorCSAgfCBpZD1JRAorCSAgKQorCSAgKCBpdj1pbml0aWFsX3ZhbHVlICB7IHZhbHVlID0gJGl2LmJmOyB9ICk/CisJICB7CisJICAJc2VwOjpWYXJpYWJsZSAqIHZhcmlhYmxlOworCSAgCXJvdXRpbmUuc2F2ZVBhcmFtZXRlciggdmFyaWFibGUgPSBuZXcgc2VwOjpWYXJpYWJsZSggJnJvdXRpbmUsCisJICAJCQlzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9JTlBVVF9QQVJBTUVURVJfTU9ESUZJRVIsCisJICAJCQlwYXJhbVQsIFNUUigkaWQudGV4dC0+Y2hhcnMpLCB2YWx1ZSkgKTsKKwkgIH0KKwkgIFJQQVJFTgorCTsKKworCitkZWZfZW51bQorLyogaW4gKi9bIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5ICwgc2VwOjpNb2RpZmllciBtZGZyIF0KK0Bpbml0eworCXNlcDo6VmFyaWFibGUgKiB2YXIgPSBOVUxMOworfQorCTogJ2VudW0nICBpZD1JRAorCSAgZGVmX2VudW1faW1wbFtkZWNsUHJvcGVydHksIG1kZnIsIFNUUigkaWQudGV4dC0+Y2hhcnMpXQorCTsKKworZGVmX2VudW1faW1wbAorLyogaW4gKi9bIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5ICwKKwkJc2VwOjpNb2RpZmllciBtZGZyICwgY29uc3Qgc3RkOjpzdHJpbmcgJiB0aWQgXQorQGluaXR7CisJc2VwOjpWYXJpYWJsZSAqIHZhciA9IE5VTEw7CisJc2VwOjpEYXRhVHlwZSAqIGVudW1UOworCisJc2VwOjpCRiB0ZCggZW51bVQgPSBzZXA6OkRhdGFUeXBlOjpuZXdFbnVtKGRlY2xQcm9wZXJ0eSwgdGlkKSApOworCWVudW1ULT5zZXRNb2RpZmllciggbWRmciApOworCWRlY2xQcm9wZXJ0eS5hcHBlbmREYXRhVHlwZSggdGQgKTsKK30KKwk6IExDVVJMWQorCSAgICBpZD1JRAorCSAgICB7CisJICAgIAllbnVtVC0+c2F2ZVZhcmlhYmxlKCB2YXIgPSBuZXcgc2VwOjpWYXJpYWJsZSggZW51bVQsCisJICAgIAkJCXNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX1VOREVGSU5FRF9NT0RJRklFUiwKKwkgICAgCQkJc2VwOjpUeXBlTWFuYWdlcjo6SU5URUdFUiwgU1RSKCRpZC50ZXh0LT5jaGFycykgKSApOworCSAgICB9CisJICAgICAgICggQVNTSUdOIGU9ZXhwcmVzc2lvbiAgeyB2YXItPnNldFZhbHVlKCRlLmJmKTsgfSApPworCisJICAgICggQ09NTUEgaWQ9SUQKKwkgICAgeworCSAgICAJZW51bVQtPnNhdmVWYXJpYWJsZSggdmFyID0gbmV3IHNlcDo6VmFyaWFibGUoIGVudW1ULAorCSAgICAJCQlzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9VTkRFRklORURfTU9ESUZJRVIsCisJICAgIAkJCXNlcDo6VHlwZU1hbmFnZXI6OklOVEVHRVIsIFNUUigkaWQudGV4dC0+Y2hhcnMpICkgKTsKKwkgICAgfQorCSAgICAgICAoIEFTU0lHTiBlPWV4cHJlc3Npb24gIHsgdmFyLT5zZXRWYWx1ZSgkZS5iZik7IH0gKT8KKwkgICAgKSoKKy8qVE9ETyNBREQKKwkgICAgKCBDT01NQSApPworKi8KKwkgIFJDVVJMWQorCTsKKworCitkZWZfc3RydWN0CisvKiBpbiAqL1sgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHkgLCBzZXA6Ok1vZGlmaWVyIG1kZnIgXQorCTogKCAnc3RydWN0JyB8ICdjbGFzcycgKSAgaWQ9SUQKKwkgIGRlZl9jbGFzc19zdHJ1Y3R1cmVfaW1wbFtkZWNsUHJvcGVydHksIG1kZnIsIFNUUigkaWQudGV4dC0+Y2hhcnMpXQorCTsKKworZGVmX2NsYXNzX3N0cnVjdHVyZV9pbXBsCisvKiBpbiAqL1sgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHkgLAorCQlzZXA6Ok1vZGlmaWVyIG1kZnIgLCBjb25zdCBzdGQ6OnN0cmluZyAmIHRpZCBdCitAaW5pdHsKKwlzZXA6OkRhdGFUeXBlICogc3RydWN0VDsKKworCXNlcDo6QkYgdGQoIHN0cnVjdFQgPSBzZXA6OkRhdGFUeXBlOjpuZXdTdHJ1Y3R1cmUoZGVjbFByb3BlcnR5LCB0aWQpICk7CisJc3RydWN0VC0+c2V0TW9kaWZpZXIoIG1kZnIgKTsKKwlkZWNsUHJvcGVydHkuYXBwZW5kRGF0YVR5cGUoIHRkICk7Cit9CisJOiBMQ1VSTFkKKwkJKCB7IG1kZnIgPSBzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9VTkRFRklORURfTU9ESUZJRVI7IH0KKworCQkJKCBtPW1vZGlmaWVyX2RlY2xhcmF0aW9uICB7IG1kZnIgPSAkbS5tZGZyOyB9ICk/CisKKwkJICAgICggZGVjbF92YXJpYWJsZVsgKihzdHJ1Y3RULT5nZXRQcm9wZXJ0eVBhcnQoKSkgLCBtZGZyIF0KKwkJICAgIHwgZGVmX21ldGhvZFsgZGVjbFByb3BlcnR5IF0KKwkJICAgICkKKwkgICAgKSsKKwkgIFJDVVJMWQorCTsKKworCitkZWZfY2hvaWNlCisvKiBpbiAqL1sgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHkgLCBzZXA6Ok1vZGlmaWVyIG1kZnIgXQorCTogJ2Nob2ljZScgIGlkPUlECisJICBkZWZfY2hvaWNlX2ltcGxbZGVjbFByb3BlcnR5LCBtZGZyLCBTVFIoJGlkLnRleHQtPmNoYXJzKV0KKwk7CisKK2RlZl9jaG9pY2VfaW1wbAorLyogaW4gKi9bIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5ICwKKwkJc2VwOjpNb2RpZmllciBtZGZyICwgY29uc3Qgc3RkOjpzdHJpbmcgJiB0aWQgXQorQGluaXR7CisJc2VwOjpEYXRhVHlwZSAqIGNob2ljZVQ7CisKKwlzZXA6OkJGIHRkKCBjaG9pY2VUID0gc2VwOjpEYXRhVHlwZTo6bmV3Q2hvaWNlKGRlY2xQcm9wZXJ0eSwgdGlkKSApOworCWNob2ljZVQtPnNldE1vZGlmaWVyKCBtZGZyICk7CisJZGVjbFByb3BlcnR5LmFwcGVuZERhdGFUeXBlKCB0ZCApOworfQorCTogTENVUkxZCisJCSggeyBtZGZyID0gc2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfVU5ERUZJTkVEX01PRElGSUVSOyB9CisKKwkJCSggbT1tb2RpZmllcl9kZWNsYXJhdGlvbiAgeyBtZGZyID0gJG0ubWRmcjsgfSApPworCisJCSAgICAoIGRlY2xfdmFyaWFibGVbICooY2hvaWNlVC0+Z2V0UHJvcGVydHlQYXJ0KCkpICwgbWRmciBdCisJCSAgICB8IGRlZl9tZXRob2RbIGRlY2xQcm9wZXJ0eSBdCisJCSAgICApCisJICAgICkrCisJICBSQ1VSTFkKKwk7CisKKworZGVmX3VuaW9uCisvKiBpbiAqL1sgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHkgLCBzZXA6Ok1vZGlmaWVyIG1kZnIgXQorCTogJ3VuaW9uJyAgaWQ9SUQKKwkgIGRlZl91bmlvbl9pbXBsW2RlY2xQcm9wZXJ0eSAsIG1kZnIsIFNUUigkaWQudGV4dC0+Y2hhcnMpXQorCTsKKworCitkZWZfdW5pb25faW1wbAorLyogaW4gKi9bIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5ICwKKwkJc2VwOjpNb2RpZmllciBtZGZyICwgY29uc3Qgc3RkOjpzdHJpbmcgJiB0aWQgXQorQGluaXR7CisJc2VwOjpEYXRhVHlwZSAqIHVuaW9uVDsKKworCXNlcDo6QkYgdGQoCXVuaW9uVCA9IHNlcDo6RGF0YVR5cGU6Om5ld1VuaW9uKGRlY2xQcm9wZXJ0eSwgdGlkKSApOworCXVuaW9uVC0+c2V0TW9kaWZpZXIoIG1kZnIgKTsKKwlkZWNsUHJvcGVydHkuYXBwZW5kRGF0YVR5cGUoIHRkICk7Cit9CisJOiBMQ1VSTFkKKwkJKCB7IG1kZnIgPSBzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9VTkRFRklORURfTU9ESUZJRVI7IH0KKworCQkJKCBtPW1vZGlmaWVyX2RlY2xhcmF0aW9uICB7IG1kZnIgPSAkbS5tZGZyOyB9ICk/CisKKwkJICAgIGRlY2xfdmFyaWFibGVbICoodW5pb25ULT5nZXRQcm9wZXJ0eVBhcnQoKSkgLCBtZGZyIF0KKwkgICAgKSsKKwkgIFJDVVJMWQorCTsKKworCitkZWZfbWV0aG9kWyBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSBdCisJOiAnZnVuJyAgSUQgIExQQVJFTiAgZGVjbF9wYXJhbWV0ZXJzID8gIFJQQVJFTiAgKCB0eXBlX3ZhciApPworCTsKKworZGVjbF9wYXJhbWV0ZXJzCisJOiB0eXBlX3ZhciBJRCAoIENPTU1BIHR5cGVfdmFyIElEICkqCisJOworCisKK2RlZl90eXBlCisvKiBpbiAqL1sgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHkgLCBzZXA6Ok1vZGlmaWVyIG1kZnIgXQorCTogJ3R5cGUnICBkZWZfdHlwZV9pbXBsWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0KKwk7CisKK2RlZl90eXBlX2ltcGwKKy8qIGluICovWyBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSAsIHNlcDo6TW9kaWZpZXIgbWRmciBdCisJOiBkZWZfdHlwZV9hdG9tX2ltcGxbIGRlY2xQcm9wZXJ0eSAsIG1kZnIgXQorCisJfCBMQ1VSTFkKKwkgICggZGVmX3R5cGVfYXRvbV9pbXBsWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0gKSsKKwkgIFJDVVJMWQorCTsKKworCitkZWZfdHlwZV9hdG9tX2ltcGwKKy8qIGluICovWyBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSAsIHNlcDo6TW9kaWZpZXIgbWRmciBdCitAaW5pdHsKKwlzZXA6OkRhdGFUeXBlICogYWxpYXNUOworCXNlcDo6QkYgdHlwZTsKKwlib29sIGlzVHlwZWRBcnJheSA9IGZhbHNlOworfQorCTogaWQ9SUQKKwkgICggYnR2PWJhc2VfdHlwZV92YXIgICB7IHR5cGUgPSAkYnR2LnR5cGU7IH0KKwkgICAgKCBkdGE9ZGVmX3R5cGVfYXJyYXlbIHR5cGUgLCBTVFIoJGlkLnRleHQtPmNoYXJzKSBdCisJICAgICAgeyB0eXBlID0gJGR0YS50eXBlOyBpc1R5cGVkQXJyYXkgPSB0cnVlOyB9CisJICAgICk/CisJICAgIHsKKwkgICAgCWlmKCBpc1R5cGVkQXJyYXkgKQorCSAgICAJeworCSAgICAJCWFsaWFzVCA9IHR5cGUudG9fcHRyPCBzZXA6OkRhdGFUeXBlID4oKTsKKwkgIAkJCWFsaWFzVC0+c2V0TW9kaWZpZXIoIG1kZnIgKTsKKwkgICAgCQlkZWNsUHJvcGVydHkuYXBwZW5kRGF0YVR5cGUoIHR5cGUgKTsKKwkgICAgCX0KKwkgICAgCWVsc2UKKwkgICAgCXsKKwkJCQlzZXA6OkJGIHRkKCBhbGlhc1QgPSBzZXA6OkRhdGFUeXBlOjpuZXdBbGlhcygKKwkJCQkJZGVjbFByb3BlcnR5LCBTVFIoJGlkLnRleHQtPmNoYXJzKSwgdHlwZSkgKTsKKwkJCQlhbGlhc1QtPnNldE1vZGlmaWVyKCBtZGZyICApOworCQkJCWRlY2xQcm9wZXJ0eS5hcHBlbmREYXRhVHlwZSggdGQgKTsKKwkgICAgCX0KKwkgICAgfQorICAgICAgICAoIGRlZl90eXBlZGVmX2NvbnN0cmFpbnRbIGFsaWFzVCBdIHwgU0VNSSApPworCisJICB8IGR0Yz1kZWZfdHlwZV9jb250YWluZXJbIFNUUigkaWQudGV4dC0+Y2hhcnMpIF0KKwkgIHsKKwkgICAgYWxpYXNUID0gJGR0Yy50eXBlLnRvX3B0cjwgc2VwOjpEYXRhVHlwZSA+KCk7CisJICAJYWxpYXNULT5zZXRNb2RpZmllciggbWRmciApOworCSAgCWRlY2xQcm9wZXJ0eS5hcHBlbmREYXRhVHlwZSggJGR0Yy50eXBlICk7CisJICB9CisJICAoIGRlZl90eXBlZGVmX2NvbnN0cmFpbnRbIGFsaWFzVCBdIHwgU0VNSSApPworCisJICB8IGR0aT1kZWZfdHlwZV9pbnRlcnZhbFsgU1RSKCRpZC50ZXh0LT5jaGFycykgXSBTRU1JCisJICB7CisJICAgIGFsaWFzVCA9ICRkdGkudHlwZS50b19wdHI8IHNlcDo6RGF0YVR5cGUgPigpOworCSAgCWFsaWFzVC0+c2V0TW9kaWZpZXIoIG1kZnIgKTsKKwkgIAlkZWNsUHJvcGVydHkuYXBwZW5kRGF0YVR5cGUoICRkdGkudHlwZSApOworCSAgfQorCisJICB8ICdlbnVtJworCSAgICBkZWZfZW51bV9pbXBsW2RlY2xQcm9wZXJ0eSwgbWRmciwgU1RSKCRpZC50ZXh0LT5jaGFycyldCisKKwkgIHwgJ3VuaW9uJworCSAgICBkZWZfdW5pb25faW1wbFtkZWNsUHJvcGVydHksIG1kZnIsIFNUUigkaWQudGV4dC0+Y2hhcnMpXQorCisJICB8ICdjaG9pY2UnCisJICAgIGRlZl9jaG9pY2VfaW1wbFtkZWNsUHJvcGVydHksIG1kZnIsIFNUUigkaWQudGV4dC0+Y2hhcnMpXQorCisJICB8ICggJ3N0cnVjdCcgfCAnY2xhc3MnICkKKwkgICAgZGVmX2NsYXNzX3N0cnVjdHVyZV9pbXBsW2RlY2xQcm9wZXJ0eSwgbWRmciwgU1RSKCRpZC50ZXh0LT5jaGFycyldCisJICApCisKKwl8IGRlZl9lbnVtICBbIGRlY2xQcm9wZXJ0eSAsIG1kZnIgXQorCXwgZGVmX3VuaW9uIFsgZGVjbFByb3BlcnR5ICwgbWRmciBdCisJfCBkZWZfY2hvaWNlWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0KKwl8IGRlZl9zdHJ1Y3RbIGRlY2xQcm9wZXJ0eSAsIG1kZnIgXQorCTsKKworCitkZWZfdHlwZWRlZl9jb25zdHJhaW50WyBzZXA6OkRhdGFUeXBlICogYWxpYXNUIF0KK0Bpbml0eworCXNlcDo6Um91dGluZSAqIG9uQ29uc3RyYWludFJvdXRpbmUgPSBOVUxMOworCisJc2VwOjpCZWhhdmlvcmFsUGFydCAqIGFCZWhhdmlvcmFscGFydCA9IGFsaWFzVC0+Z2V0VW5pcUJlaGF2aW9yUGFydCgpOworCisJU0FWRV9SVUxFX0JFR0lOX0xPQ0FUSU9OOworfQorQGFmdGVyeworCVNFVF9SVUxFX0xPQ0FUSU9OKCBvbkNvbnN0cmFpbnRSb3V0aW5lICk7Cit9CisJOiBMQ1VSTFkKKwkJJ0Bjb25zdHJhaW50JworCSAgICB7CisJICAgIAlvbkNvbnN0cmFpbnRSb3V0aW5lID0gbmV3IHNlcDo6Um91dGluZShhbGlhc1QsICJjb25zdHJhaW50Iik7CisJICAgIAlhbGlhc1QtPnNldENvbnN0cmFpbnRSb3V0aW5lKG9uQ29uc3RyYWludFJvdXRpbmUpOworCSAgICAJYUJlaGF2aW9yYWxwYXJ0LT5zYXZlQW5vbnltb3VzSW5uZXJSb3V0aW5lKG9uQ29uc3RyYWludFJvdXRpbmUpOworCSAgICB9CisJICAgICggcm91dGluZV9zaW5nbGVfcGFyYW1bKm9uQ29uc3RyYWludFJvdXRpbmUsIGFsaWFzVC0+Z2V0VHlwZVNwZWNpZmllcigpXSApPworCSAgICAoIGJzPWJsb2NrX3N0YXRlbWVudCAgeyBvbkNvbnN0cmFpbnRSb3V0aW5lLT5zZXRDb2RlKCAkYnMuYWMgKTsgfQorCSAgICB8ICd8PT4nIGNlPWNvbmRpdGlvbmFsRXhwcmVzc2lvbiBTRU1JCisJICAgICAgeyBvbkNvbnN0cmFpbnRSb3V0aW5lLT5zZXRDb2RlKCBORVdfU1RNVDEoT1AoR1VBUkQpLCAkY2UuYmYpICk7IH0KKwkgICAgKQorCSAgUkNVUkxZCisJOworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBUWVBFREVGIFRJTUUKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3RpbWVfdHlwZQorcmV0dXJucyBbIHNlcDo6VHlwZVNwZWNpZmllciBidHMgXQorQGluaXR7CisJaW50IHN6VCA9IDE7CisJc2VwOjphdm1fdHlwZV9zcGVjaWZpZXJfa2luZF90IHRzayA9IHNlcDo6VFlQRV9USU1FX1NQRUNJRklFUjsKK30KKwk6ICggJ3RpbWUnICAgeyAkYnRzID0gc2VwOjpUeXBlTWFuYWdlcjo6VElNRTsgICAgICAgICAgICB9CisJICB8ICdjdGltZScgIHsgJGJ0cyA9IHNlcDo6VHlwZU1hbmFnZXI6OkNPTlRJTlVPVVNfVElNRTsgfQorCSAgfCAnZHRpbWUnICB7ICRidHMgPSBzZXA6OlR5cGVNYW5hZ2VyOjpESVNDUkVURV9USU1FOyAgIH0KKwkgICkKKwkgICggTFRfICAgICAgeyB0c2sgPSAkYnRzLmdldFR5cGVTcGVjaWZpZXJLaW5kKCk7IH0KKwkgICAgcHQ9dGltZV90eXBlX2RvbWFpbiAgICAgICAgICAgeyAkYnRzID0gJHB0LnR5cGU7IH0KKwkgICAgKCBDT01NQSAgc3o9aW50ZWdlcl9jb25zdGFudCAgeyBzelQgPSAkc3oudmFsOyB9ICk/CisJICAgR1QKKwkgICB7ICRidHMgPSBzZXA6OlR5cGVNYW5hZ2VyOjpuZXdDbG9ja1RpbWUodHNrLCAkYnRzLCBzelQpOyB9CisKKwkgIHwgcHQ9dGltZV90eXBlX2RvbWFpbgorCSAgeyAkYnRzID0gc2VwOjpUeXBlTWFuYWdlcjo6bmV3Q2xvY2tUaW1lKHRzaywgJHB0LnR5cGUsIHN6VCk7IH0KKwkgICk/CisJOworCisKK3RpbWVfY2xvY2tfdHlwZQorcmV0dXJucyBbIHNlcDo6VHlwZVNwZWNpZmllciBidHMgXQorQGluaXR7CisJaW50IHN6VCA9IDE7Cit9CisJOiAnY2xvY2snICB7ICRidHMgPSBzZXA6OlR5cGVNYW5hZ2VyOjpDTE9DSzsgICAgfQorCSAgKCBMVF8KKwkJKCAndGltZScgICB7ICRidHMgPSBzZXA6OlR5cGVNYW5hZ2VyOjpUSU1FOyAgICAgICAgICAgIH0KKwkJfCAnY3RpbWUnICB7ICRidHMgPSBzZXA6OlR5cGVNYW5hZ2VyOjpDT05USU5VT1VTX1RJTUU7IH0KKwkJfCAnZHRpbWUnICB7ICRidHMgPSBzZXA6OlR5cGVNYW5hZ2VyOjpESVNDUkVURV9USU1FOyAgIH0KKwkJfCBwdD10aW1lX3R5cGVfZG9tYWluIHsgJGJ0cyA9ICRwdC50eXBlOyAgIH0KKwkJKQorCQkoIENPTU1BICBzej1pbnRlZ2VyX2NvbnN0YW50ICB7IHN6VCA9ICRzei52YWw7IH0gKT8KKwkgICBHVAorCSAgIHsgJGJ0cyA9IHNlcDo6VHlwZU1hbmFnZXI6Om5ld0Nsb2NrVGltZShzZXA6OlRZUEVfQ0xPQ0tfU1BFQ0lGSUVSLCAkYnRzLCBzelQpOyB9CisKKwkgIHwgKCAndGltZScgICB7ICRidHMgPSBzZXA6OlR5cGVNYW5hZ2VyOjpUSU1FOyAgICAgICAgICAgIH0KKwkJfCAnY3RpbWUnICB7ICRidHMgPSBzZXA6OlR5cGVNYW5hZ2VyOjpDT05USU5VT1VTX1RJTUU7IH0KKwkJfCAnZHRpbWUnICB7ICRidHMgPSBzZXA6OlR5cGVNYW5hZ2VyOjpESVNDUkVURV9USU1FOyAgIH0KKwkJfCBwdD10aW1lX3R5cGVfZG9tYWluIHsgJGJ0cyA9ICRwdC50eXBlOyAgIH0KKwkJKQorCQkoIENPTU1BICBzej1pbnRlZ2VyX2NvbnN0YW50ICB7IHN6VCA9ICRzei52YWw7IH0gKT8KKwkgICB7ICRidHMgPSBzZXA6OlR5cGVNYW5hZ2VyOjpuZXdDbG9ja1RpbWUoc2VwOjpUWVBFX0NMT0NLX1NQRUNJRklFUiwgJGJ0cywgc3pUKTsgfQorCSAgKT8KKwk7CisKKwordGltZV90eXBlX2RvbWFpbgorcmV0dXJucyBbIHNlcDo6VHlwZVNwZWNpZmllciB0eXBlIF0KKwk6ICggJ2ludGVnZXInICB8ICAnaW50JyApICB7ICR0eXBlID0gc2VwOjpUeXBlTWFuYWdlcjo6SU5URUdFUjsgfQorCSAgKCBMVF8KKwkgICAgbj1pbnRlZ2VyX2NvbnN0YW50CisJICAgIHsgJHR5cGUgPSBzZXA6OlR5cGVNYW5hZ2VyOjpnZXRUeXBlSW50ZWdlciggJG4udmFsICk7IH0KKwkgICBHVCApPworCisJfCAoICd1aW50ZWdlcicgIHwgICd1aW50JyApICB7ICR0eXBlID0gc2VwOjpUeXBlTWFuYWdlcjo6VUlOVEVHRVI7IH0KKwkgICggTFRfCisJICAgIG49aW50ZWdlcl9jb25zdGFudAorCSAgICB7ICR0eXBlID0gc2VwOjpUeXBlTWFuYWdlcjo6Z2V0VHlwZVVJbnRlZ2VyKCAkbi52YWwpOyB9CisJICAgR1QgKT8KKworCXwgKCAncmF0aW9uYWwnICB8ICdyYXQnICApICB7ICR0eXBlID0gc2VwOjpUeXBlTWFuYWdlcjo6UkFUSU9OQUw7IH0KKwl8ICggJ3VyYXRpb25hbCcgfCAndXJhdCcgKSAgeyAkdHlwZSA9IHNlcDo6VHlwZU1hbmFnZXI6OlVSQVRJT05BTDsgfQorCisJfCAnZmxvYXQnICAgICAgeyAkdHlwZSA9IHNlcDo6VHlwZU1hbmFnZXI6OkZMT0FUOyB9CisJfCAndWZsb2F0JyAgICAgeyAkdHlwZSA9IHNlcDo6VHlwZU1hbmFnZXI6OlVGTE9BVDsgfQorCisJfCAnZG91YmxlJyAgICAgeyAkdHlwZSA9IHNlcDo6VHlwZU1hbmFnZXI6OkRPVUJMRTsgfQorCXwgJ3Vkb3VibGUnICAgIHsgJHR5cGUgPSBzZXA6OlR5cGVNYW5hZ2VyOjpVRE9VQkxFOyB9CisKKwl8ICdyZWFsJyAgICAgICB7ICR0eXBlID0gc2VwOjpUeXBlTWFuYWdlcjo6UkVBTDsgfQorCXwgJ3VyZWFsJyAgICAgIHsgJHR5cGUgPSBzZXA6OlR5cGVNYW5hZ2VyOjpVUkVBTDsgfQorCTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gZGVjbGFyYXRpb24gRlVOQ1RJT04gLCBQUk9DRURVUkUgLCBMQU1CREEKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvKgorZGVjbF9mdW5jIFsgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHkgLCBzZXA6Ok1vZGlmaWVyIG1kZnIgXQorCTogJ2Z1bmMnICBJRCAgZnVuY19zaWduYXR1cmUKKwkgIGJsb2NrX3N0YXRlbWVudAorCTsKKworZnVuY19zaWduYXR1cmUKKwk6IExQQVJFTiAgZGVjbF9jYWxsX3BhcmFtID8gIFJQQVJFTgorCSAgJy0tPicKKwkgIExQQVJFTiAgZGVjbF9yZXRfdmFsdWUgICAgIFJQQVJFTgorCisJfCBDT0xPTiAgIGRlY2xfY2FsbF9wYXJhbQorCSAgJy0tPicgICBkZWNsX3JldF92YWx1ZQorCTsKKworZGVjbF9wcm9jCisvKiBpbiAvWyBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSAsIHNlcDo6TW9kaWZpZXIgbWRmciBdCisJOiAncHJvYycgIElEIGRlY2xfY2FsbF9wYXJhbQorCSAgYmxvY2tfc3RhdGVtZW50CisJOworCitkZWNsX2xhbWJkYQorLyogaW4gL1sgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHkgLCBzZXA6Ok1vZGlmaWVyIG1kZnIgXQorCTogJ2xhbWJkYScgIElECisJICBDT0xPTiAgIGRlY2xfY2FsbF9wYXJhbQorCSAgJy0tPicgICBkZWNsX3JldF92YWx1ZQorCSAgYmxvY2tfc3RhdGVtZW50CisJOworCisKK2RlY2xfY2FsbF9wYXJhbQorCTogZGVjbF9jYWxsX29uZV9wYXJhbSAgKCBDT01NQSBkZWNsX2NhbGxfb25lX3BhcmFtICkqCisJOworCitkZWNsX2NhbGxfb25lX3BhcmFtCisJOiBwYXJhbV9tb2RpZmllciA/ICB0eXBlX3ZhciAgSUQKKwk7CisKK3BhcmFtX21vZGlmaWVyCisJOiAnaW4nIHwgJ3JlZicgfCAnb3V0JworCTsKKworZGVjbF9yZXRfdmFsdWUKKwk6IHR5cGVfdmFyICggSUQgKT8gICggQ09NTUEgdHlwZV92YXIgKCBJRCApPyApKgorCTsKKworCitkZWNsX29uZV9yZXRfdmFsdWUKKwk6IHR5cGVfdmFyICAoIElEICk/CisJOworKi8KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gc2VjdGlvbiBNT0MKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3NlY3Rpb25fbW9kZWxfb2ZfY29tcHV0YXRpb24gWyBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIgXQorCTogJ0Btb2M6JworCTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gc2VjdGlvbiBST1VUSU5FICYgTUFDUk8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3NlY3Rpb25fcm91dGluZSBbIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lciBdCitAaW5pdHsKKwkgc2VwOjpNb2RpZmllciBtZGZyOworCisJc2VwOjpTcGVjaWZpZXIgc3BjZnIoIHNlcDo6U3BlY2lmaWVyOjpERVNJR05fTU9ERUxfS0lORCApOworfQorCTogKCAnQHJvdXRpbmU6JworCSAgfCAnQG1hY3JvOicgIHsgbWRmci5zZXROYXR1cmVNYWNybygpOyB9CisJICApCisJICAoIGRlZl9yb3V0aW5lX21vZGVsWyBjb250YWluZXIgLCBtZGZyICwgc3BjZnIgXSApKgorCTsKKworZGVmX3JvdXRpbmVfbW9kZWwKKy8qIGluICovWyBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIgLAorCQlzZXA6Ok1vZGlmaWVyIG1kZnIgLCBzZXA6OlNwZWNpZmllciBzcGNmciBdCisJOiAoJ3JvdXRpbmUnCisJICB8ICdtYWNybycgICB7IG1kZnIuc2V0TmF0dXJlTWFjcm8oKTsgfQorCSAgICAoICdyb3V0aW5lJyApID8KKwkgICkKKwkgIGRlZl9yb3V0aW5lX21vZGVsX2ltcGxbIGNvbnRhaW5lciAsIG1kZnIgLCBzcGNmciBdCisJOworCisKK2RlZl9yb3V0aW5lX21vZGVsX2ltcGwKKy8qIGluICovWyBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIgLAorCQlzZXA6Ok1vZGlmaWVyIG1kZnIgLCBzZXA6OlNwZWNpZmllciBzcGNmciBdCitAaW5pdHsKKwlTQVZFX1JVTEVfQkVHSU5fTE9DQVRJT047Cit9CitAYWZ0ZXJ7CisJU0VUX1JVTEVfTE9DQVRJT04oIF9DUFJfICk7CisKKwlQT1BfQ1RYOworfQorCTogSUQKKwkgIHsKKwkgIAlQVVNIX0NUWF9DUFIoIHNlcDo6Um91dGluZTo6bmV3RGVmaW5lKAorCSAgCQkJY29udGFpbmVyLCBtZGZyLCBzcGNmciwgU1RSKCRJRC50ZXh0LT5jaGFycykpICk7CisKKwkJY29udGFpbmVyLT5zYXZlT3duZWRFbGVtZW50KCBfQ1BSXyApOworCSAgfQorCisJICAoIGRlZl9yb3V0aW5lX3BhcmFtZXRlcnNbICpfQ1BSXyBdICk/CisJICAoICggJy0tPicgfCAncmV0dXJuczonICkgIGRlZl9yb3V0aW5lX3JldHVybnNbICpfQ1BSXyBdICk/CisKKwkgIGJzPWJsb2NrX3N0YXRlbWVudCAgeyBfQ1BSXy0+c2V0Q29kZSgkYnMuYWMpOyB9CisJOworCisKK2RlZl9yb3V0aW5lX3BhcmFtZXRlcnMgWyBzZXA6OlJvdXRpbmUgJiByb3V0aW5lIF0KK0Bpbml0eworCXNlcDo6YXZtX3NpemVfdCBvZmZzZXQgPSAwOworfQorCTogTFBBUkVOCisJICAgICAoIGRlZl9yb3V0aW5lX3BhcmFtX2F0b21bIHJvdXRpbmUgLCBvZmZzZXQrKyBdCisKKwkgICAgICggQ09NTUEgZGVmX3JvdXRpbmVfcGFyYW1fYXRvbVsgcm91dGluZSAsIG9mZnNldCsrIF0gKSogKT8KKwkgIFJQQVJFTgorCTsKKworZGVmX3JvdXRpbmVfcGFyYW1fYXRvbQorLyogaW4gKi9bIHNlcDo6Um91dGluZSAmIHJvdXRpbmUgLCBzZXA6OmF2bV9zaXplX3Qgb2Zmc2V0IF0KK0Bpbml0eworCXNlcDo6QkYgdmFyaWFibGU7CisJc2VwOjpWYXJpYWJsZSAqIHBhcmFtOworCXNlcDo6TWFjaGluZSAqIG1hY2hpbmUgPSByb3V0aW5lLmdldENvbnRhaW5lck1hY2hpbmUoKTsKKwlzZXA6OkJGIHBhcmFtVCA9IHNlcDo6VHlwZU1hbmFnZXI6OlVOSVZFUlNBTDsKKwlzZXA6Ok1vZGlmaWVyIG1kZnIgPSBzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9QQVJBTUVURVJfTU9ESUZJRVI7CisJbWRmci5hZGRGZWF0dXJlS2luZCggc2VwOjpNb2RpZmllcjo6RkVBVFVSRV9UUkFOU0lFTlRfS0lORCApOworfQorCTogKCAoIG1vZGlmaWVyX3BhcmFtID8gdHlwZV92YXIgSUQgKSA9PgorCSAgICAoIG09bW9kaWZpZXJfcGFyYW0geyBtZGZyLm92ZXJyaWRlX2lmZGVmKCAkbS5tZGZyICk7IH0gKT8KKwkgICAgdHY9dHlwZV92YXIgeyBwYXJhbVQgPSAkdHYudHlwZTsgfSAgaWQ9SUQKKworCSAgfCBpZD1JRAorCSAgICB7CisJICAgIAl2YXJpYWJsZSA9IHNlcDo6UGFyc2VyVXRpbDo6Z2V0VmFyaWFibGUoU1RSKCRpZC50ZXh0LT5jaGFycykgLCAxKTsKKwkgICAgCWlmKCB2YXJpYWJsZS5pbnZhbGlkKCkgKQorCSAgICAJeworCSAgICAJCXNlcDo6UGFyc2VyVXRpbDo6YXZtX3N5bnRheF9lcnJvcigKKwkgICAgCQkJImRlZl9yb3V0aW5lX3BhcmFtX2F0b206PiAiICsgcm91dGluZS5zdHIoKSwgJGlkLmxpbmUgKQorCSAgICAJCQkJPDwgIlVuZm91bmQgbWFjaGluZSBwYXJhbSdzIHZhcmlhYmxlIDwgIgorICAJCQkJCQk8PCBTVFIoJGlkLnRleHQtPmNoYXJzKQorICAJCQkJCQk8PCAiID4gaW4gcm91dGluZSBoZWFkZXIgPCAiIDw8ICIgPiIKKyAgCQkJCQkJPDwgc2VwOjpQYXJzZXJVdGlsOjpTWU5UQVhfRVJST1JfRU9MOworCSAgICAJfQorCSAgICB9CisJICApCisJICB7CisJICAgIGlmKCB2YXJpYWJsZS52YWxpZCgpICkKKwkgICAgeworCQkgIAlyb3V0aW5lLnNhdmVQYXJhbWV0ZXIoIHBhcmFtID0gbmV3IHNlcDo6VmFyaWFibGUoICZyb3V0aW5lLAorCQkgIAkJCXNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX01BQ1JPX01PRElGSUVSLAorCQkgIAkJCXZhcmlhYmxlLnRvX3B0cjwgc2VwOjpWYXJpYWJsZSA+KCktPmdldFR5cGUoKSwKKwkJICAJCQlTVFIoJGlkLnRleHQtPmNoYXJzKSkgKTsKKwkJICAJcGFyYW0tPnNldE9mZnNldCggb2Zmc2V0ICk7CisJICAgIAlwYXJhbS0+c2V0QmluZGluZyggdmFyaWFibGUgKTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkgICAgCXBhcmFtID0gbmV3IHNlcDo6VmFyaWFibGUoJnJvdXRpbmUsCisJICAgIAkJCW1kZnIsICR0di50eXBlLCBTVFIoJGlkLnRleHQtPmNoYXJzKSk7CisJCSAgCXBhcmFtLT5zZXRPZmZzZXQoIG9mZnNldCApOworCisJCSAgCS8vIE9ubHkgZm9yIFJvdXRpbmUgZGVzaWduIGFzIFBST1RPVFlQRSBhLmsuYS4gcHJpbWl0aXZlIHJvdXRpbmUKKwkJICAJaWYoIHJvdXRpbmUuZ2V0U3BlY2lmaWVyKCkuaXNEZXNpZ25Qcm90b3R5cGVTdGF0aWMoKSApCisJCSAgCXsKKwkJCQlyb3V0aW5lLmFwcGVuZFBhcmFtZXRlcigKKwkJICAJCQltYWNoaW5lLT5nZXRQcm9wZXJ0eVBhcnQoKS5zYXZlT3duZWRWYXJpYWJsZSggcGFyYW0gKSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJvdXRpbmUuc2F2ZVBhcmFtZXRlciggcGFyYW0gKTsKKwkJCX0KKwkgICAgfQorCSAgfQorCSAgKCBpdj1pbml0aWFsX3ZhbHVlICB7IHBhcmFtLT5zZXRWYWx1ZSgkaXYuYmYpOyB9ICk/CisJOworCisKK2RlZl9yb3V0aW5lX3JldHVybnMgWyBzZXA6OlJvdXRpbmUgJiByb3V0aW5lIF0KK0Bpbml0eworCXNlcDo6QkYgdmFsdWU7CisJc2VwOjphdm1fc2l6ZV90IG9mZnNldCA9IDA7Cit9CisJOiBMUEFSRU4KKwkgICAgIGRlZl9yb3V0aW5lX3JldHVybnNfYXRvbVsgcm91dGluZSAsIG9mZnNldCsrIF0KKworCSAgICAgKCBDT01NQSBkZWZfcm91dGluZV9yZXR1cm5zX2F0b21bIHJvdXRpbmUgLCBvZmZzZXQrKyBdICkqCisJICBSUEFSRU4KKworCXwgdHY9dHlwZV92YXIgKCBpdj1pbml0aWFsX3ZhbHVlICB7IHZhbHVlID0gJGl2LmJmOyB9ICk/CisJeworCQlzZXA6OlZhcmlhYmxlICogdmFyaWFibGU7CisJCXJvdXRpbmUuc2F2ZVJldHVybiggdmFyaWFibGUgPSBuZXcgc2VwOjpWYXJpYWJsZSggJnJvdXRpbmUsCisJCQkJc2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfUkVUVVJOX1BBUkFNRVRFUl9NT0RJRklFUiwKKwkJCQkkdHYudHlwZSwgIiMwIiwgdmFsdWUpICk7CisJCXZhcmlhYmxlLT5zZXRPZmZzZXQoIG9mZnNldCApOworCX0KKwk7CisKKworZGVmX3JvdXRpbmVfcmV0dXJuc19hdG9tCisvKiBpbiAqL1sgc2VwOjpSb3V0aW5lICYgcm91dGluZSAsIHNlcDo6YXZtX3NpemVfdCBvZmZzZXQgXQorQGluaXR7CisJc2VwOjpCRiB2YXJpYWJsZTsKKwlzZXA6OlZhcmlhYmxlICogcGFyYW07CisJc2VwOjpNYWNoaW5lICogbWFjaGluZSA9IHJvdXRpbmUuZ2V0Q29udGFpbmVyTWFjaGluZSgpOworCXNlcDo6QkYgcGFyYW1UID0gc2VwOjpUeXBlTWFuYWdlcjo6VU5JVkVSU0FMOworCXNlcDo6TW9kaWZpZXIgbWRmciA9IHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX1JFVFVSTl9QQVJBTUVURVJfTU9ESUZJRVI7Cit9CisJOiAoICggbW9kaWZpZXJfcGFyYW0gPyB0eXBlX3ZhciBJRCApID0+CisJICAgICggbT1tb2RpZmllcl9wYXJhbSB7IG1kZnIub3ZlcnJpZGVfaWZkZWYoICRtLm1kZnIgKTsgfSApPworCSAgICB0dj10eXBlX3ZhciB7IHBhcmFtVCA9ICR0di50eXBlOyB9ICBpZD1JRAorCisJICB8IGlkPUlECisJICAgIHsKKwkgICAgCXZhcmlhYmxlID0gc2VwOjpQYXJzZXJVdGlsOjpnZXRWYXJpYWJsZShTVFIoJGlkLnRleHQtPmNoYXJzKSAsIDEpOworCSAgICAJaWYoIHZhcmlhYmxlLmludmFsaWQoKSApCisJICAgIAl7CisJICAgIAkJc2VwOjpQYXJzZXJVdGlsOjphdm1fc3ludGF4X2Vycm9yKAorCSAgICAJCQkiZGVmX3JvdXRpbmVfcmV0dXJuc19hdG9tOj4gIiArIHJvdXRpbmUuc3RyKCksICRpZC5saW5lICkKKwkgICAgCQkJCTw8ICJVbmZvdW5kIG1hY2hpbmUgcmV0dXJuJ3MgdmFyaWFibGUgPCAiCisJICAJCQkJCTw8IFNUUigkaWQudGV4dC0+Y2hhcnMpCisJICAJCQkJCTw8ICIgPiBpbiByb3V0aW5lIGhlYWRlciA8ICIgPDwgIiA+IgorCSAgCQkJCQk8PCBzZXA6OlBhcnNlclV0aWw6OlNZTlRBWF9FUlJPUl9FT0w7CisJICAgIAl9CisJICAgIH0KKwkgICkKKworCSAgeworCSAgICBpZiggdmFyaWFibGUudmFsaWQoKSApCisJICAgIHsKKwkJICAJcm91dGluZS5zYXZlUmV0dXJuKCBwYXJhbSA9IG5ldyBzZXA6OlZhcmlhYmxlKCAmcm91dGluZSwKKwkJICAJCQlzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9NQUNST19NT0RJRklFUiwKKwkJICAJCQl2YXJpYWJsZS50b19wdHI8IHNlcDo6VmFyaWFibGUgPigpLT5nZXRUeXBlKCksCisJCSAgCQkJU1RSKCRpZC50ZXh0LT5jaGFycykpICk7CisKKwkJICAJcGFyYW0tPnNldE9mZnNldCggb2Zmc2V0ICk7CisJICAgIAlwYXJhbS0+c2V0QmluZGluZyggdmFyaWFibGUgKTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkgICAgCXBhcmFtID0gbmV3IHNlcDo6VmFyaWFibGUoJnJvdXRpbmUsCisJCSAgCQkJbWRmciwgJHR2LnR5cGUsIFNUUigkaWQudGV4dC0+Y2hhcnMpKTsKKwkJICAJcGFyYW0tPnNldE9mZnNldCggb2Zmc2V0ICk7CisKKwkJICAJLy8gT25seSBmb3IgUm91dGluZSBkZXNpZ24gYXMgUFJPVE9UWVBFIGEuay5hLiBwcmltaXRpdmUgcm91dGluZQorCQkgIAlpZiggcm91dGluZS5nZXRTcGVjaWZpZXIoKS5pc0Rlc2lnblByb3RvdHlwZVN0YXRpYygpICkKKwkJICAJeworCQkgIAkJcm91dGluZS5hcHBlbmRSZXR1cm4oCisJCSAgCQkJbWFjaGluZS0+Z2V0UHJvcGVydHlQYXJ0KCkuc2F2ZU93bmVkVmFyaWFibGUoIHBhcmFtICkpOworCQkgIAl9CisJCSAgCWVsc2UKKwkJICAJeworCQkgIAkJcm91dGluZS5zYXZlUmV0dXJuKCBwYXJhbSApOworCQkgIAl9CisJICAgIH0KKwkgIH0KKworCSAgKCBpdj1pbml0aWFsX3ZhbHVlICB7IHBhcmFtLT5zZXRWYWx1ZSgkaXYuYmYpOyB9ICk/CisJOworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBzZWN0aW9uIE1PRQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc2VjdGlvbl9tb2RlbF9vZl9leGVjdXRpb24gWyBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIgXQorCTogJ0Btb2U6JyAgKCBkZWZfbW9lX3ByaW1pdGl2ZVsgY29udGFpbmVyIF0gKSoKKwk7CisKK2RlZl9tb2VfcHJpbWl0aXZlIFsgc2VwOjpNYWNoaW5lICogY29udGFpbmVyIF0KK0Bpbml0eworCXNlcDo6QmVoYXZpb3JhbFBhcnQgKiB0aGVCZWhhdmlvciA9IGNvbnRhaW5lci0+Z2V0VW5pcUJlaGF2aW9yUGFydCgpOworCisJIHNlcDo6TW9kaWZpZXIgbWRmcjsKKworCXNlcDo6U3BlY2lmaWVyIHNwY2ZyKCBzZXA6OlNwZWNpZmllcjo6REVTSUdOX01PREVMX0tJTkQgKTsKK30KKwk6ICdAY3JlYXRlJyAgICAgICBkZWZfcm91dGluZV9zZXFbIHRoZUJlaGF2aW9yLT5nZXRPbkNyZWF0ZVJvdXRpbmUoKSBdCisJfCAnQGluaXQnICAgICAgICAgZGVmX3JvdXRpbmVfc2VxWyB0aGVCZWhhdmlvci0+Z2V0T25Jbml0Um91dGluZSgpICAgXQorCXwgJ0BmaW5hbCcgICAgICAgIGRlZl9yb3V0aW5lX3NlcVsgdGhlQmVoYXZpb3ItPmdldE9uRmluYWxSb3V0aW5lKCkgIF0KKworCXwgJ0BzdGFydCcgICAgICAgIGRlZl9yb3V0aW5lX3NlcVsgdGhlQmVoYXZpb3ItPmdldE9uU3RhcnRSb3V0aW5lKCkgIF0KKwl8ICdAc3RvcCcgICAgICAgICBkZWZfcm91dGluZV9zZXFbIHRoZUJlaGF2aW9yLT5nZXRPblN0b3BSb3V0aW5lKCkgICBdCisKKwl8ICdAaWVuYWJsZScgICAgICBkZWZfcm91dGluZV9zZXFbIHRoZUJlaGF2aW9yLT5nZXRPbklFbmFibGVSb3V0aW5lKCkgXQorCXwgJ0BlbmFibGUnICAgICAgIGRlZl9yb3V0aW5lX3NlcVsgdGhlQmVoYXZpb3ItPmdldE9uRW5hYmxlUm91dGluZSgpICBdCisKKwl8ICdAaWRpc2FibGUnICAgICBkZWZfcm91dGluZV9zZXFbIHRoZUJlaGF2aW9yLT5nZXRPbklEaXNhYmxlUm91dGluZSgpIF0KKwl8ICdAZGlzYWJsZScgICAgICBkZWZfcm91dGluZV9zZXFbIHRoZUJlaGF2aW9yLT5nZXRPbkRpc2FibGVSb3V0aW5lKCkgIF0KKworCXwgJ0BpYWJvcnQnICAgICAgIGRlZl9yb3V0aW5lX3NlcVsgdGhlQmVoYXZpb3ItPmdldE9uSUFib3J0Um91dGluZSgpIF0KKwl8ICdAYWJvcnQnICAgICAgICBkZWZfcm91dGluZV9zZXFbIHRoZUJlaGF2aW9yLT5nZXRPbkFib3J0Um91dGluZSgpICBdCisKKwl8ICdAaXJ1bicgICAgICAgICBkZWZfcm91dGluZV9zZXFbIHRoZUJlaGF2aW9yLT5nZXRPbklSdW5Sb3V0aW5lKCkgXQorCXwgJ0BydW4nICAgICAgICAgIGRlZl9yb3V0aW5lX3NlcVsgdGhlQmVoYXZpb3ItPmdldE9uUnVuUm91dGluZSgpICBdCisJfCAnQHJ0YycgICAgICAgICAgZGVmX3JvdXRpbmVfc2VxWyB0aGVCZWhhdmlvci0+Z2V0T25SdGNSb3V0aW5lKCkgIF0KKworCXwgJ0ByZXR1cm4nICAgICAgIGRlZl9yb3V0aW5lX3NlcVsgdGhlQmVoYXZpb3ItPmdldE9uRmluYWxSb3V0aW5lKCkgXQorCisJfCAnQGNvbmN1cnJlbmN5JyAgZGVmX3JvdXRpbmVfc2VxWyB0aGVCZWhhdmlvci0+Z2V0T25Db25jdXJyZW5jeVJvdXRpbmUoKSBdCisJfCAnQHNjaGVkdWxlJyAgICAgZGVmX3JvdXRpbmVfc2VxWyB0aGVCZWhhdmlvci0+Z2V0T25TY2hlZHVsZVJvdXRpbmUoKSAgICBdCisKKworCXwgJ3JvdXRpbmUnCisJICBkZWZfcm91dGluZV9tb2RlbF9pbXBsWyBjb250YWluZXIgLCBtZGZyICwgc3BjZnIgXQorCTsKKworCitkZWZfcm91dGluZV9zZXEgWyBzZXA6OlJvdXRpbmUgJiByb3V0aW5lIF0KK0Bpbml0eworCVBVU0hfQ1RYX0NQUiggJiByb3V0aW5lICk7CisKKwlTQVZFX1JVTEVfQkVHSU5fTE9DQVRJT047Cit9CitAYWZ0ZXJ7CisJU0VUX1JVTEVfTE9DQVRJT04oIF9DUFJfICk7CisKKwlQT1BfQ1RYOzsKK30KKwk6ICggZGVmX3JvdXRpbmVfcGFyYW1ldGVyc1sgcm91dGluZSBdICk/CisJICAoICggJy0tPicgfCAncmV0dXJuczonICkgIGRlZl9yb3V0aW5lX3JldHVybnNbIHJvdXRpbmUgXSApPworCisJICBicz1ibG9ja19zdGF0ZW1lbnQgIHsgcm91dGluZS5zZXFDb2RlKCRicy5hYyk7IH0KKwk7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIHNlY3Rpb24gQ09NCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzZWN0aW9uX21vZGVsX29mX2ludGVyYWN0aW9uIFsgc2VwOjpNYWNoaW5lICogbWFjaGluZSBdCitAaW5pdHsKKwlzZXA6OkludGVyYWN0aW9uUGFydCAqIHRoZUludGVyYWN0aW9uID0gbWFjaGluZS0+Z2V0VW5pcUludGVyYWN0aW9uKCk7CisKKwlTQVZFX1JVTEVfQkVHSU5fTE9DQVRJT047Cit9CitAYWZ0ZXJ7CisJU0VUX1JVTEVfTE9DQVRJT04odGhlSW50ZXJhY3Rpb24pOworfQorCisJOiAoICdAaW50ZXJhY3Rpb246JyB8ICdAY29tOicgKQorCSAgKCBjb21fY29ubmVjdFsgbWFjaGluZSwgdGhlSW50ZXJhY3Rpb24gXSApKgorCTsKKworY29tX3Byb3RvY29sCisvKiBpbiAqL1sgc2VwOjpNYWNoaW5lICogbWFjaGluZSAsIHNlcDo6Q29tUHJvdG9jb2wgKiBjcCBdCisJOiAnZW52JyAgICAgICB7ICRjcC0+c2V0UHJvdG9jb2woc2VwOjpDb21Qcm90b2NvbDo6UFJPVE9DT0xfRU5WSVJPTk1FTlRfS0lORCk7IH0KKworCXwgJ3JkdicgICAgICAgeyAkY3AtPnNldFByb3RvY29sQ2FzdChzZXA6OkNvbVByb3RvY29sOjpQUk9UT0NPTF9SRFZfS0lORCwgc2VwOjpDb21Qcm90b2NvbDo6UFJPVE9DT0xfVU5JQ0FTVF9LSU5EKTsgfQorCXwgJ211bHRpcmR2JyAgeyAkY3AtPnNldFByb3RvY29sQ2FzdChzZXA6OkNvbVByb3RvY29sOjpQUk9UT0NPTF9NVUxUSVJEVl9LSU5ELCBzZXA6OkNvbVByb3RvY29sOjpQUk9UT0NPTF9NVUxUSUNBU1RfS0lORCk7IH0KKworCXwgJ2Zsb3cnICAgICAgeyAkY3AtPnNldFByb3RvY29sQ2FzdChzZXA6OkNvbVByb3RvY29sOjpQUk9UT0NPTF9GTE9XX0tJTkQsIHNlcDo6Q29tUHJvdG9jb2w6OlBST1RPQ09MX01VTFRJQ0FTVF9LSU5EKTsgfQorCisKKwl8ICdhbnljYXN0JyAgIHsgJGNwLT5zZXRQcm90b2NvbENhc3Qoc2VwOjpDb21Qcm90b2NvbDo6UFJPVE9DT0xfQU5ZQ0FTVF9LSU5ELCBzZXA6OkNvbVByb3RvY29sOjpQUk9UT0NPTF9BTllDQVNUX0tJTkQpOyB9CisKKwl8ICd1bmljYXN0JyAgIHsgJGNwLT5zZXRQcm90b2NvbENhc3Qoc2VwOjpDb21Qcm90b2NvbDo6UFJPVE9DT0xfVU5JQ0FTVF9LSU5ELCBzZXA6OkNvbVByb3RvY29sOjpQUk9UT0NPTF9VTklDQVNUX0tJTkQpOyB9CisKKwl8ICdtdWx0aWNhc3QnIHsgJGNwLT5zZXRQcm90b2NvbENhc3Qoc2VwOjpDb21Qcm90b2NvbDo6UFJPVE9DT0xfTVVMVElDQVNUX0tJTkQsIHNlcDo6Q29tUHJvdG9jb2w6OlBST1RPQ09MX01VTFRJQ0FTVF9LSU5EKTsgfQorCisJfCAnYnJvYWRjYXN0JyB7ICRjcC0+c2V0UHJvdG9jb2xDYXN0KHNlcDo6Q29tUHJvdG9jb2w6OlBST1RPQ09MX0JST0FEQ0FTVF9LSU5ELCBzZXA6OkNvbVByb3RvY29sOjpQUk9UT0NPTF9CUk9BRENBU1RfS0lORCk7IH0KKworCXwgYmM9YnVmZmVyX2NvbSBbIG1hY2hpbmUgXQorCXsKKwkJJGNwLT5zZXRQcm90b2NvbChzZXA6OkNvbVByb3RvY29sOjpQUk9UT0NPTF9CVUZGRVJfS0lORCk7CisJCSRjcC0+c2V0QnVmZmVyKCRiYy5idWYpOworCX0KKwk7CisKK2NvbV9jYXN0WyBzZXA6OkNvbVByb3RvY29sICogY3AgXQorCTogJ2FueWNhc3QnICAgIHsgJGNwLT5zZXRDYXN0KHNlcDo6Q29tUHJvdG9jb2w6OlBST1RPQ09MX0FOWUNBU1RfS0lORCk7IH0KKwl8ICd1bmljYXN0JyAgICB7ICRjcC0+c2V0Q2FzdChzZXA6OkNvbVByb3RvY29sOjpQUk9UT0NPTF9VTklDQVNUX0tJTkQpOyB9CisJfCAnbXVsdGljYXN0JyAgeyAkY3AtPnNldENhc3Qoc2VwOjpDb21Qcm90b2NvbDo6UFJPVE9DT0xfTVVMVElDQVNUX0tJTkQpOyB9CisJfCAnYnJvYWRjYXN0JyAgeyAkY3AtPnNldENhc3Qoc2VwOjpDb21Qcm90b2NvbDo6UFJPVE9DT0xfQlJPQURDQVNUX0tJTkQpOyB9CisJOworCitidWZmZXJfY29tIFsgc2VwOjpNYWNoaW5lICogbWFjaGluZSBdCityZXR1cm5zICBbIHNlcDo6QkYgYnVmIF0KKwk6ICdidWZmZXInCisJICAoIENPTE9OCisJICAgICggcmI9cmVmX2J1ZmZlclttYWNoaW5lXSAgeyAkYnVmID0gJHJiLmJ1ZjsgfQorCSAgICB8IGRiPWRlZl9idWZmZXIKKwkgICAgeworCQkJJGJ1ZiA9IHNlcDo6QkYoIG5ldyBzZXA6OkJ1ZmZlcihtYWNoaW5lLAorCQkJCW5ld0J1ZmZlcklEKCksICRkYi5raW5kLCAkZGIuc2l6ZSkgKTsKKwkgICAgfQorCSAgICApCisKKwkgIHwgTFRfCisJICAgICAgKCByYj1yZWZfYnVmZmVyW21hY2hpbmVdICB7ICRidWYgPSAkcmIuYnVmOyB9CisJICAgICAgfCBkYj1kZWZfYnVmZmVyCisJCQl7CisJCQkJJGJ1ZiA9IHNlcDo6QkYoIG5ldyBzZXA6OkJ1ZmZlcihtYWNoaW5lLAorCQkJCQkJIG5ld0J1ZmZlcklEKCksICRkYi5raW5kLCAkZGIuc2l6ZSkgKTsKKwkJCX0KKwkgICAgICApCisJICAgIEdUCisJICApCisJfCBkYj1kZWZfYnVmZmVyCisJeworCQkkYnVmID0gc2VwOjpCRiggbmV3IHNlcDo6QnVmZmVyKG1hY2hpbmUsCisJCQkJIG5ld0J1ZmZlcklEKCksICRkYi5raW5kLCAkZGIuc2l6ZSkgKTsKKwl9CisJOworCisKK2NvbV9jb25uZWN0CisvKiBpbiAqL1sgc2VwOjpNYWNoaW5lICogbWFjaGluZSAsIHNlcDo6SW50ZXJhY3Rpb25QYXJ0ICogYW5JbnRlcmFjdGlvbiBdCitAaW5pdHsKKwlzZXA6OkNvbm5lY3RvciAqIGFDb25uZWN0b3I7CisJYW5JbnRlcmFjdGlvbi0+c2F2ZUNvbm5lY3RvciggYUNvbm5lY3RvciA9IG5ldyBzZXA6OkNvbm5lY3RvcigqYW5JbnRlcmFjdGlvbikgKTsKKwlhQ29ubmVjdG9yLT51cGRhdGUoYW5JbnRlcmFjdGlvbik7CisJc3RkOjpzdHJpbmcgY19pZDsKKworCXNlcDo6Q29tUm91dGUgKiBjb21Sb3V0ZSA9IE5VTEw7CisKKwlTQVZFX1JVTEVfQkVHSU5fTE9DQVRJT047Cit9CitAYWZ0ZXJ7CisJU0VUX1JVTEVfTE9DQVRJT04oYUNvbm5lY3Rvcik7Cit9CisJOiAoICdjb25uZWN0b3InIHwgJ2Nvbm5lY3QnICkKKwkgICggTFRfCisJICAgIGNvbV9wcm90b2NvbFsgbWFjaGluZSwgYUNvbm5lY3RvciBdCisJICAgICggQ09NTUEgY29tX2Nhc3RbIGFDb25uZWN0b3IgXSApPworCSAgICBHVAorCSAgKT8KKwkgICggSUQgeyBjX2lkID0gU1RSKCRJRC50ZXh0LT5jaGFycyk7IH0gKT8KKwkgIHsgYUNvbm5lY3Rvci0+ZnVsbHlVcGRhdGVBbGxOYW1lSUQobmV3Q29ubmVjdElEKGNfaWQsICJfI2Nvbm5lY3RvciIpKTsgfQorCSAgTENVUkxZCisJICAoIGNvbV9yb3V0ZVsgbWFjaGluZSwgYUNvbm5lY3RvciBdICkrCisJICBSQ1VSTFkKKworCisJfCAoICdyb3V0ZScgKQorCSAgeworCSAgCWFDb25uZWN0b3ItPnNldE5hdHVyZSggc2VwOjpJQ29tUG9pbnQ6OklPX1NJR05BTF9OQVRVUkUgKTsKKwkgIAlhQ29ubmVjdG9yLT5mdWxseVVwZGF0ZUFsbE5hbWVJRChuZXdDb25uZWN0SUQoIiIsICJfI3JvdXRlIikpOworCSAgfQorCSAgKCBMVF8KKwkgICAgY29tX3Byb3RvY29sWyBtYWNoaW5lLCBhQ29ubmVjdG9yIF0KKwkgICAgKCBDT01NQSBjb21fY2FzdFsgYUNvbm5lY3RvciBdICk/CisJICAgIEdUCisJICApPworCisJICAoIGNvbV9yb3V0ZVsgbWFjaGluZSwgYUNvbm5lY3RvciBdCisKKwkgIHwgTENVUkxZCisJICAgICggY29tX3JvdXRlWyBtYWNoaW5lLCBhQ29ubmVjdG9yIF0gKSsKKwkgICAgUkNVUkxZCisKKwkgIHwgTEJSQUNLRVQKKwkgICAgeworCSAgICAJY29tUm91dGUgPSBuZXcgc2VwOjpDb21Sb3V0ZShhQ29ubmVjdG9yLAorCSAgICAJCQlzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9JTk9VVF9ESVJFQ1RJT04pOworCSAgICAgIAlhQ29ubmVjdG9yLT5hcHBlbmRDb21Sb3V0ZShjb21Sb3V0ZSk7CisJICAgIH0KKwkgICAgKCBjb21fcG9ydFsgbWFjaGluZSAsIGNvbVJvdXRlIF0KKwkgICAgICAoIENPTU1BICBjb21fcG9ydFsgbWFjaGluZSAsIGNvbVJvdXRlIF0gKSoKKworCSAgICB8IFNUQVIKKwkgICAgeworCQkJc2VwOjpDb21Qb2ludCAqIGNvbVBvaW50ID0gbmV3IHNlcDo6Q29tUG9pbnQoKTsKKwkgICAgCWNvbVBvaW50LT5zZXRNYWNoaW5lQWxsU2lnbmFsKG1hY2hpbmUpOworCQkJY29tUm91dGUtPnNldENvbVBvaW50KGNvbVBvaW50LCBzZXA6Ok1vZGlmaWVyOjpESVJFQ1RJT05fSU5PVVRfS0lORCk7CisKKwkJCVNFVF9SVUxFX0xPQ0FUSU9OKGNvbVBvaW50KTsKKwkgICAgfQorCSAgICApCisJICAgIFJCUkFDS0VUCisJICAgIFNFTUkKKwkgICkKKwk7CisKKworY29tX3JvdXRlCisvKiBpbiAqL1sgc2VwOjpNYWNoaW5lICogbWFjaGluZSAsIHNlcDo6Q29ubmVjdG9yICogYUNvbm5lY3RvciBdCitAaW5pdHsKKwlzZXA6OkNvbVJvdXRlICogY29tUm91dGUgPSBuZXcgc2VwOjpDb21Sb3V0ZShhQ29ubmVjdG9yKTsKKwlhQ29ubmVjdG9yLT5hcHBlbmRDb21Sb3V0ZShjb21Sb3V0ZSk7CisKKwlTQVZFX1JVTEVfQkVHSU5fTE9DQVRJT047Cit9CitAYWZ0ZXJ7CisJU0VUX1JVTEVfTE9DQVRJT04oY29tUm91dGUpOworfQorCTogbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dFsgY29tUm91dGUtPmdldHdNb2RpZmllcigpIF0KKwkgICggTFRfICgKKwkgICAgYmM9YnVmZmVyX2NvbVsgbWFjaGluZSBdCisJICAgIHsKKwkgICAgCWNvbVJvdXRlLT5zZXRQcm90b2NvbChzZXA6OkNvbVByb3RvY29sOjpQUk9UT0NPTF9CVUZGRVJfS0lORCk7CisJICAgIAljb21Sb3V0ZS0+c2V0QnVmZmVyKCRiYy5idWYpOworCSAgICB9CisJICAgIHwgY29tX2Nhc3RbIGNvbVJvdXRlIF0KKwkgICkgR1QgKT8KKworCSAgKCBjb21fcG9ydFsgbWFjaGluZSAsIGNvbVJvdXRlIF0gIFNFTUkKKworCSAgfCBMQ1VSTFkKKwkgICAgKCBjb21fcG9ydFsgbWFjaGluZSAsIGNvbVJvdXRlIF0gIFNFTUkgKSsKKwkgICAgUkNVUkxZCisKKwkgIHwgTEJSQUNLRVQKKwkgICAgKCBjb21fcG9ydFsgbWFjaGluZSAsIGNvbVJvdXRlIF0KKwkgICAgICAoIENPTU1BICBjb21fcG9ydFsgbWFjaGluZSAsIGNvbVJvdXRlIF0gKSoKKworCSAgICB8IFNUQVIKKwkgICAgeworCQkJc2VwOjpDb21Qb2ludCAqIGNvbVBvaW50ID0gbmV3IHNlcDo6Q29tUG9pbnQoKTsKKwkgICAgCWNvbVBvaW50LT5zZXRNYWNoaW5lQWxsU2lnbmFsKG1hY2hpbmUpOworCQkJY29tUm91dGUtPnNldENvbVBvaW50KGNvbVBvaW50LCBzZXA6Ok1vZGlmaWVyOjpESVJFQ1RJT05fSU5PVVRfS0lORCk7CisKKwkJCVNFVF9SVUxFX0xPQ0FUSU9OKGNvbVBvaW50KTsKKwkgICAgfQorCSAgICApCisJICAgIFJCUkFDS0VUCisJICAgIFNFTUkKKwkgICkKKworICAgIHwgY29tX3BvcnRbIG1hY2hpbmUgLCBjb21Sb3V0ZSBdICBTRU1JCisJOworCisKK2NvbV9wb3J0CisvKiBpbiAqL1sgc2VwOjpNYWNoaW5lICogbWFjaGluZSAsIHNlcDo6Q29tUm91dGUgKiBjb21Sb3V0ZV0KK0Bpbml0eworCXNlcDo6TWFjaGluZSAqIGNvbU1hY2hpbmUgPSBtYWNoaW5lOworCXdoaWxlKCBjb21NYWNoaW5lICE9IE5VTEwgKQorCXsKKwkJaWYoIGNvbU1hY2hpbmUtPmhhc1BvcnRTaWduYWwoKSB8fCAoISBjb21NYWNoaW5lLT5oYXNDb250YWluZXIoKSkgKQorCQl7CisJCQlicmVhazsKKwkJfQorCQljb21NYWNoaW5lID0gY29tTWFjaGluZS0+Z2V0Q29udGFpbmVyTWFjaGluZSgpOworCX0KKworCVNBVkVfUlVMRV9CRUdJTl9MT0NBVElPTjsKK30KKwk6ICggcXVhbGlmaWVkTmFtZUlEICctPicgKSA9PgorCSAgbT1xdWFsaWZpZWROYW1lSUQKKwkgIHsgY29tTWFjaGluZSA9IHNlcDo6UGFyc2VyVXRpbDo6Z2V0TWFjaGluZShtYWNoaW5lLCAkbS5zLCAkbS5uYik7IH0KKwkgIAorCSAgJy0+JworCisJICAoIGNwPWNvbV9wb3J0X2lkWyBtYWNoaW5lICwgY29tTWFjaGluZSBdCisJICAgIHsgY29tUm91dGUtPmFwcGVuZENvbVBvaW50KCRjcC5jb21Qb2ludCk7IH0KKworCSAgfCBMQlJBQ0tFVAorCSAgICAoIGNwPWNvbV9wb3J0X2lkWyBtYWNoaW5lICwgY29tTWFjaGluZSBdCisJICAgICAgeyBjb21Sb3V0ZS0+YXBwZW5kQ29tUG9pbnQoJGNwLmNvbVBvaW50KTsgfQorCisJICAgICAgKCBDT01NQSAgY3A9Y29tX3BvcnRfaWRbIG1hY2hpbmUgLCBjb21NYWNoaW5lIF0KKwkgICAgICB7IGNvbVJvdXRlLT5hcHBlbmRDb21Qb2ludCgkY3AuY29tUG9pbnQpOyB9ICkqCisKKwkgICAgfCBTVEFSCisJICAgIHsKKwkgICAgCXNlcDo6Q29tUG9pbnQgKiBjb21Qb2ludCA9IG5ldyBzZXA6OkNvbVBvaW50KCk7CisJCQljb21Qb2ludC0+c2V0TWFjaGluZUFsbFNpZ25hbChjb21NYWNoaW5lKTsKKwkJCWNvbVJvdXRlLT5zZXRDb21Qb2ludChjb21Qb2ludCwgc2VwOjpNb2RpZmllcjo6RElSRUNUSU9OX0lOT1VUX0tJTkQpOworCisJCQlTRVRfUlVMRV9MT0NBVElPTihjb21Qb2ludCk7CisJICAgIH0KKwkgICAgKQorCSAgICBSQlJBQ0tFVAorCSAgKQorCisKKwl8IGNwPWNvbV9wb3J0X2lkWyBtYWNoaW5lICwgY29tTWFjaGluZSBdCisJeyBjb21Sb3V0ZS0+YXBwZW5kQ29tUG9pbnQoJGNwLmNvbVBvaW50KTsgfQorCTsKKworCitjb21fcG9ydF9pZAorLyogaW4gKi9bIHNlcDo6TWFjaGluZSAqIG1hY2hpbmUgLCBzZXA6Ok1hY2hpbmUgKiBjb21NYWNoaW5lIF0KK3JldHVybnMgWyBzZXA6OkJGIGNvbVBvaW50IF0KK0Bpbml0eworCVNBVkVfUlVMRV9CRUdJTl9MT0NBVElPTjsKK30KKwk6IGlkPXF1YWxpZmllZE5hbWVJRAorCSAgeworCQlzZXA6OkNvbVBvaW50ICogYUNvbVBvaW50OworCQkkY29tUG9pbnQgPSBzZXA6OkJGKCBhQ29tUG9pbnQgPSBuZXcgc2VwOjpDb21Qb2ludCgpICk7CisKKwkJU0VUX1JVTEVfTE9DQVRJT04oYUNvbVBvaW50KTsKKworCQljb25zdCBzZXA6OkJGICYgY29tUG9ydCA9IHNlcDo6UGFyc2VyVXRpbDo6Z2V0Q29tUG9ydFNpZ25hbCgKKwkJCQljb21NYWNoaW5lLCAkaWQucywgJGlkLm5iKTsKKwkgIAlpZiggY29tUG9ydC52YWxpZCgpICkKKwkgIAl7CisJICAJCWFDb21Qb2ludC0+c2V0TWFjaGluZVBvcnQoY29tTWFjaGluZSwgY29tUG9ydC50b19wdHI8IHNlcDo6UG9ydCA+KCkpOworCSAgCX0KKwkgIAllbHNlCisJICAJeworCSAgCQlhQ29tUG9pbnQtPnNldE1hY2hpbmUoY29tTWFjaGluZSk7CisJICAJCWFDb21Qb2ludC0+c2V0TWFjaGluZVBvcnQoTkVXX1FOSUQoJGlkLnMsICRpZC5uYikpOworCSAgCX0KKwkgIH0KKwk7CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNUQVRFTUVOVAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRlbWVudAorcmV0dXJucyBbIHNlcDo6QkZDb2RlIGFjIF0KKwk6IHM9c3RhdGVtZW50X2Fzc2lnbiAgICAgICAgICAgIHsgJGFjID0gJHMuYWM7IH0KKy8vCXwgcz1zdGF0ZW1lbnRfYnVmZmVyICAgICAgICAgICAgeyAkYWMgPSAkcy5hYzsgfQorCXwgcz1zdGF0ZW1lbnRfY29tICAgICAgICAgICAgICAgeyAkYWMgPSAkcy5hYzsgfQorCXwgcz1zdGF0ZW1lbnRfY29uc3RyYWludCAgICAgICAgeyAkYWMgPSAkcy5hYzsgfQorCXwgcz1zdGF0ZW1lbnRfanVtcCAgICAgICAgICAgICAgeyAkYWMgPSAkcy5hYzsgfQorLy8JfCBzPXN0YXRlbWVudF90aW1lICAgICAgICAgICAgICB7ICRhYyA9ICRzLmFjOyB9CisKKwl8IHM9c3RhdGVtZW50X2FjdGl2aXR5ICAgICAgICAgIHsgJGFjID0gJHMuYWM7IH0KKwl8IHM9c3RhdGVtZW50X2ludm9rZV9yb3V0aW5lICAgIHsgJGFjID0gJHMuYWM7IH0KKworCXwgcz1zdGF0ZW1lbnRfbW9jICAgICAgICAgICAgICAgeyAkYWMgPSAkcy5hYzsgfQorCisJfCBzPXN0YXRlbWVudF9pbnZva2UgICAgICAgICAgICB7ICRhYyA9ICRzLmFjOyB9CisJfCBzPXN0YXRlbWVudF9pbnZva2VfbWV0aG9kICAgICB7ICRhYyA9ICRzLmFjOyB9CisKKwl8IHM9c3RhdGVtZW50X2FjdGl2aXR5X25ldyAgICAgIHsgJGFjID0gJHMuYWM7IH0KKworCXwgcz1zdGF0ZW1lbnRfaXRlICAgICAgICAgICAgICAgeyAkYWMgPSAkcy5hYzsgfQorCXwgcz1zdGF0ZW1lbnRfaXRlcmF0aW9uICAgICAgICAgeyAkYWMgPSAkcy5hYzsgfQorCisvLwl8IHM9c3RhdGVtZW50X2xlbSAgICAgICAgICAgICAgIHsgJGFjID0gJHMuYWM7IH0KKworCXwgcz1ibG9ja19zdGF0ZW1lbnQgICAgICAgICAgICAgeyAkYWMgPSAkcy5hYzsgfQorCisJfCBzPXByZWZpeF9zdGF0ZW1lbnQgICAgICAgICAgICB7ICRhYyA9ICRzLmFjOyB9CisKKwl8IHM9c3RhdGVtZW50X3Byb21wdCAgICAgICAgICAgIHsgJGFjID0gJHMuYWM7IH0KKworCXwgcz1tZXRhX3N0YXRlbWVudCAgICAgICAgICAgICAgeyAkYWMgPSAkcy5hYzsgfQorCisvLwl8IHM9cXVvdGVfc3RhdGVtZW50ICAgICAgICAgICAgIHsgJGFjID0gJHMuYWM7IH0KKwk7CisKKworYmxvY2tfc3RhdGVtZW50CityZXR1cm5zIFsgc2VwOjpCRkNvZGUgYWMgXQorQGluaXR7CisJc2VwOjpPcGVyYXRvciAqIG9wID0gT1AoU0VRVUVOQ0UpOworCWJvb2wgaW1wbGljaXRTZXF1ZW5jZU9wID0gdHJ1ZTsKK30KK0BhZnRlcnsKKwlpZiggaW1wbGljaXRTZXF1ZW5jZU9wICYmICRhYy52YWxpZCgpICYmICRhYy0+c2luZ2xldG9uKCkgJiYKKwkJCXNlcDo6T3BlcmF0b3JNYW5hZ2VyOjppc1NjaGVkdWxlKG9wKSApCisJeworCQlzZXA6OkJGQ29kZSBzaW5nbGVDb2RlID0gJGFjLT5maXJzdCgpLmJmQ29kZSgpOworCQkkYWMgPSBzaW5nbGVDb2RlOworCX0KK30KKwk6IExDVVJMWSAgKCBvPW9wX2Jsb2NrIHsgb3AgPSAkby5vcDsgaW1wbGljaXRTZXF1ZW5jZU9wID0gZmFsc2U7IH0gKT8KKwkgICAgeyAkYWMgPSBORVdfU1RNVChvcCk7IH0KKwkgICAgKCAgcz1zdGF0ZW1lbnQgIHsgJGFjLT5hcHBlbmQoJHMuYWMpOyB9ICApKgorCSAgUkNVUkxZCisJOworCitvcF9ibG9jaworcmV0dXJucyBbIHNlcDo6T3BlcmF0b3IgKiBvcCBdCisJOiBvPW9wX3NlcXVlbmNlICAgIHsgJG9wID0gJG8ub3A7IH0KKwl8IG89b3Bfc2NoZWR1bGluZyAgeyAkb3AgPSAkby5vcDsgfQorCXwgbz1vcF9jb25jdXJyZW5jeSB7ICRvcCA9ICRvLm9wOyB9CisKKwl8IE9QX0ZPUksgICAgICAgICAgeyAkb3AgPSBPUChGT1JLKTsgfQorCXwgT1BfSk9JTiAgICAgICAgICB7ICRvcCA9IE9QKEpPSU4pOyB9CisJOworCitvcF9zZXF1ZW5jZQorcmV0dXJucyBbIHNlcDo6T3BlcmF0b3IgKiBvcCBdCisJOiBPUF9TRVFVRU5DRSAgICAgICAgIHsgJG9wID0gT1AoU0VRVUVOQ0UpOyB9CisJfCBPUF9TRVFVRU5DRV9TSURFICAgIHsgJG9wID0gT1AoU0VRVUVOQ0VfU0lERSk7IH0KKwl8IE9QX1NFUVVFTkNFX1dFQUsgICAgeyAkb3AgPSBPUChTRVFVRU5DRV9XRUFLKTsgfQorCisJfCBPUF9BVE9NSUNfU0VRVUVOQ0UgIHsgJG9wID0gT1AoQVRPTUlDX1NFUVVFTkNFKTsgfQorCTsKKworb3Bfc2NoZWR1bGluZworcmV0dXJucyBbIHNlcDo6T3BlcmF0b3IgKiBvcCBdCisJOiBPUF9TQ0hFRFVMRV9HVCAgICAgICAgeyAkb3AgPSBPUChQUklPUl9HVCk7IH0KKwl8IE9QX1NDSEVEVUxFX0xUICAgICAgICB7ICRvcCA9IE9QKFBSSU9SX0xUKTsgfQorCXwgT1BfU0NIRURVTEVfWE9SICAgICAgIHsgJG9wID0gT1AoRVhDTFVTSVZFKTsgfQorCisJfCBPUF9TQ0hFRFVMRV9BTkRfVEhFTiAgeyAkb3AgPSBPUChTQ0hFRFVMRV9BTkRfVEhFTik7IH0KKwl8IE9QX1NDSEVEVUxFX09SX0VMU0UgICB7ICRvcCA9IE9QKFNDSEVEVUxFX09SX0VMU0UpOyB9CisKKwl8IE9QX05PTl9ERVRFUk1JTklTTSAgICB7ICRvcCA9IE9QKE5PTkRFVEVSTUlOSVNNKTsgfQorCTsKKworb3BfY29uY3VycmVuY3kKK3JldHVybnMgWyBzZXA6Ok9wZXJhdG9yICogb3AgXQorCTogT1BfQ09OQ1VSUkVOQ1lfQVNZTkMgICAgICAgICAgICB7ICRvcCA9IE9QKEFTWU5DSFJPTk9VUyk7IH0KKwl8IE9QX0NPTkNVUlJFTkNZX0FORCAgICAgICAgICAgICAgeyAkb3AgPSBPUChTVFJPTkdfU1lOQ0hST05PVVMpOyB9CisJfCBPUF9DT05DVVJSRU5DWV9PUiAgICAgICAgICAgICAgIHsgJG9wID0gT1AoV0VBS19TWU5DSFJPTk9VUyk7IH0KKwl8IE9QX0NPTkNVUlJFTkNZX0lOVEVSTEVBVklORyAgICAgeyAkb3AgPSBPUChJTlRFUkxFQVZJTkcpOyB9CisJfCBPUF9DT05DVVJSRU5DWV9QQVJBTExFTCAgICAgICAgIHsgJG9wID0gT1AoUEFSQUxMRUwpOyB9CisKKwl8IE9QX0NPTkNVUlJFTkNZX1JEVl9BU1lOQyAgICAgICAgeyAkb3AgPSBPUChSRFZfQVNZTkNIUk9OT1VTKTsgfQorCXwgT1BfQ09OQ1VSUkVOQ1lfUkRWX0FORCAgICAgICAgICB7ICRvcCA9IE9QKFJEVl9TVFJPTkdfU1lOQ0hST05PVVMpOyB9CisJfCBPUF9DT05DVVJSRU5DWV9SRFZfT1IgICAgICAgICAgIHsgJG9wID0gT1AoUkRWX1dFQUtfU1lOQ0hST05PVVMpOyB9CisJfCBPUF9DT05DVVJSRU5DWV9SRFZfSU5URVJMRUFWSU5HIHsgJG9wID0gT1AoUkRWX0lOVEVSTEVBVklORyk7IH0KKwl8IE9QX0NPTkNVUlJFTkNZX1JEVl9QQVJBTExFTCAgICAgeyAkb3AgPSBPUChSRFZfUEFSQUxMRUwpOyB9CisJOworCisKKworb3BfaW52b2thYmxlCityZXR1cm5zIFsgc2VwOjpPcGVyYXRvciAqIG9wIF0KKwk6IFBMVVMgICAgICAgICAgICAgeyAkb3AgPSBPUChQTFVTKTsgICAgICAgICB9CisKKwl8IE1JTlVTICAgICAgICAgICAgeyAkb3AgPSBPUChNSU5VUyk7ICAgICAgICB9CisKKwl8IFNUQVIgICAgICAgICAgICAgeyAkb3AgPSBPUChNVUxUKTsgICAgICAgICB9CisJfCBESVYgICAgICAgICAgICAgIHsgJG9wID0gT1AoRElWKTsgICAgICAgICAgfQorCXwgTU9EICAgICAgICAgICAgICB7ICRvcCA9IE9QKE1PRCk7ICAgICAgICAgIH0KKworLy8JfCBQT1cgICAgICAgICAgICAgIHsgJG9wID0gT1AoUE9XKTsgICAgICAgICAgfQorCisJfCBFUVVBTCAgICAgICAgICAgIHsgJG9wID0gT1AoRVEpOyAgICAgICAgICAgfQorCXwgTkVRVUFMICAgICAgICAgICB7ICRvcCA9IE9QKE5FUSk7ICAgICAgICAgIH0KKworCXwgU0VRVUFMICAgICAgICAgICB7ICRvcCA9IE9QKFNFUSk7ICAgICAgICAgIH0KKwl8IE5TRVFVQUwgICAgICAgICAgeyAkb3AgPSBPUChOU0VRKTsgICAgICAgICB9CisKKwl8IEdUICAgICAgICAgICAgICAgeyAkb3AgPSBPUChHVCk7ICAgICAgICAgICB9CisJfCBHVEUgICAgICAgICAgICAgIHsgJG9wID0gT1AoR1RFKTsgICAgICAgICAgfQorCXwgTFRfICAgICAgICAgICAgICB7ICRvcCA9IE9QKExUKTsgICAgICAgICAgIH0KKwl8IExURSAgICAgICAgICAgICAgeyAkb3AgPSBPUChMVEUpOyAgICAgICAgICB9CisKKwl8IExOT1QgICAgICAgICAgICAgeyAkb3AgPSBPUChOT1QpOyAgICAgICAgICB9CisJfCBMQU5EICAgICAgICAgICAgIHsgJG9wID0gT1AoQU5EKTsgICAgICAgICAgfQorCXwgTEFORF9USEVOICAgICAgICB7ICRvcCA9IE9QKEFORF9USEVOKTsgICAgIH0KKwl8IExPUiAgICAgICAgICAgICAgeyAkb3AgPSBPUChPUik7ICAgICAgICAgICB9CisJfCBMT1JfRUxTRSAgICAgICAgIHsgJG9wID0gT1AoT1JfRUxTRSk7ICAgICAgfQorCisJfCBCTk9UICAgICAgICAgICAgIHsgJG9wID0gT1AoQk5PVCk7ICAgICAgICAgfQorCXwgQkFORCAgICAgICAgICAgICB7ICRvcCA9IE9QKEJBTkQpOyAgICAgICAgIH0KKwl8IEJPUiAgICAgICAgICAgICAgeyAkb3AgPSBPUChCT1IpOyAgICAgICAgICB9CisJfCBCWE9SICAgICAgICAgICAgIHsgJG9wID0gT1AoQlhPUik7ICAgICAgICAgfQorCisJfCBMU0hJRlQgICAgICAgICAgIHsgJG9wID0gT1AoTFNISUZUKTsgICAgICAgfQorCXwgUlNISUZUICAgICAgICAgICB7ICRvcCA9IE9QKFJTSElGVCk7ICAgICAgIH0KKworCXwgQVNTSUdOICAgICAgICAgICB7ICRvcCA9IE9QKEFTU0lHTik7ICAgICAgIH0KKwl8IEFTU0lHTl9BRlRFUiAgICAgeyAkb3AgPSBPUChBU1NJR05fQUZURVIpOyB9CisJfCBBU1NJR05fUkVGICAgICAgIHsgJG9wID0gT1AoQVNTSUdOX1JFRik7ICAgfQorCXwgQVNTSUdOX01BQ1JPICAgICB7ICRvcCA9IE9QKEFTU0lHTl9NQUNSTyk7IH0KKworCXwgT1BfUFVTSCAgICAgICAgICB7ICRvcCA9IE9QKFBVU0gpOyAgICAgICAgIH0KKwl8IE9QX0FTU0lHTl9UT1AgICAgeyAkb3AgPSBPUChBU1NJR05fVE9QKTsgICB9CisJfCBPUF9UT1AgICAgICAgICAgIHsgJG9wID0gT1AoVE9QKTsgICAgICAgICAgfQorCXwgT1BfUE9QICAgICAgICAgICB7ICRvcCA9IE9QKFBPUCk7ICAgICAgICAgIH0KKwk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk0gU1RBVEVNRU5UCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitwcmVmaXhfc3RhdGVtZW50CityZXR1cm5zIFsgc2VwOjpCRkNvZGUgYWMgXQorCTogRE9MTEFSX0xDVVJMWSAgb3A9YXZtX29wZXJhdG9yICB7ICRhYyA9IE5FV19TVE1UKG9wKTsgIH0KKwkgICAgKCBwcz1wcmVmaXhfc3RhdGVtZW50ICAgICAgICAgeyAkYWMtPmFwcGVuZCgkcHMuYWMpOyB9CisJICAgIHwgZT11bmFyeUV4cHJlc3Npb24gICAgICAgICAgIHsgJGFjLT5hcHBlbmQoJGUuYmYpOyAgfQorCSAgICApKgorCSAgUkNVUkxZCisJOworCitwcmVmaXhfZXhwcmVzc2lvbgorcmV0dXJucyBbIHNlcDo6QkZDb2RlIGFjIF0KKwk6IERPTExBUl9MQ1VSTFkgIG9wPWF2bV9vcGVyYXRvciAgeyAkYWMgPSBORVdfU1RNVChvcCk7ICB9CisJICAgICggcHM9cHJlZml4X2V4cHJlc3Npb24gICAgICAgIHsgJGFjLT5hcHBlbmQoJHBzLmFjKTsgfQorCSAgICB8IGU9dW5hcnlFeHByZXNzaW9uICAgICAgICAgICB7ICRhYy0+YXBwZW5kKCRlLmJmKTsgIH0KKwkgICAgKSoKKwkgIFJDVVJMWQorCTsKKworYXZtX29wZXJhdG9yCityZXR1cm5zIFsgc2VwOjpPcGVyYXRvciAqIG9wIF0KKwk6IG89b3BfaW52b2thYmxlICAgeyAkb3AgPSAkby5vcDsgfQorCisJfCBvPW9wX2FjdGl2aXR5ICAgeyAkb3AgPSAkby5vcDsgfQorCisJfCB7IChvcCA9IHNlcDo6T3BlcmF0b3JNYW5hZ2VyOjpnZXRPcChTVFIoTFQoMSktPmdldFRleHQoTFQoMSkpLT5jaGFycykpKSAhPSBOVUxMIH0/IElECisJOworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk0gU1RBVEVNRU5UIElOVk9LRQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGVtZW50X2ludm9rZV9tZXRob2QKK3JldHVybnMgWyBzZXA6OkJGQ29kZSBhYyBdCitAaW5pdHsKKwlzZXA6OkJGIG1vZGVsUHJvY2VkdXJlOworCXNlcDo6TWFjaGluZSAqIGNhbGxQcm9jZWR1cmU7CisKKwlTQVZFX1JVTEVfQkVHSU5fTE9DQVRJT047Cit9CitAYWZ0ZXIKK3sKKwlTRVRfUlVMRV9MT0NBVElPTihjYWxsUHJvY2VkdXJlKTsKK30KKwk6ICdjYWxsJyBpZD1JRAorCSAgeworCSAgCW1vZGVsUHJvY2VkdXJlID0gc2VwOjpQYXJzZXJVdGlsOjpnZXR2YXJQcm9jZWR1cmUoU1RSKCRpZC50ZXh0LT5jaGFycykpOworCisJICAJY2FsbFByb2NlZHVyZSA9IHNlcDo6TWFjaGluZTo6bmV3UHJvY2VkdXJlSW5zdGFuY2UoX0NQTV8sCisJICAJCQlzZXA6Ok9TUygpIDw8ICJjYWxsXyIgPDwgKyttUHJvY2VkdXJlQ2FsbENvdW50CisJICAJCQkJCTw8ICcjJyA8PCBTVFIoJGlkLnRleHQtPmNoYXJzKSwgbW9kZWxQcm9jZWR1cmUpOworCisJCWNhbGxQcm9jZWR1cmUtPmdldHdTcGVjaWZpZXIoKS5zZXREZXNpZ25JbnN0YW5jZVN0YXRpYygpOworCisJICAJJGFjID0gTkVXX1NUTVQxKE9QKElOVk9LRV9NRVRIT0QpLCBzZXA6OkJGKGNhbGxQcm9jZWR1cmUpKTsKKwkgIH0KKworCSAgZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3BhcmFtcyBbIGNhbGxQcm9jZWR1cmUgXSA/CisJICBkZWNsX2luc3RhbmNlX21hY2hpbmVfcmV0dXJuc1sgY2FsbFByb2NlZHVyZSBdID8KKworCSAgU0VNSQorCTsKKworCitzdGF0ZW1lbnRfaW52b2tlCityZXR1cm5zIFsgc2VwOjpCRkNvZGUgYWMgXQorCTogTFBBUkVOX0lOVk9LRQorCSAgICB1ZT11bmFyeUV4cHJlc3Npb24geyAkYWMgPSBORVdfU1RNVDEoT1AoSU5WT0tFX01FVEhPRCksICR1ZS5iZik7IH0KKwkgICAgKCBpZD1JRCAgICAgICAgICAgIHsgJGFjLT5hcHBlbmQoc2VwOjpQYXJzZXJVdGlsOjpnZXRJbnZva2FibGUoJHVlLmJmLCBTVFIoJGlkLnRleHQtPmNoYXJzKSkpOyB9CisJICAgIHwgJ2luJyAgICAgICAgICAgICB7ICRhYy0+YXBwZW5kKCBJTkNSX0JGKE9QKElOKSkgKTsgfQorCSAgICB8IG9wPW9wX2ludm9rYWJsZSAgeyAkYWMtPmFwcGVuZCggSU5DUl9CRigkb3Aub3ApICk7IH0KKwkgICAgKQorCSAgICAoIGU9ZXhwcmVzc2lvbiAgICAgeyAkYWMtPmFwcGVuZCgkZS5iZik7IH0gKSoKKwkgICAgKCAncHJvdmlkZWQ6JyAgIGU9ZXhwcmVzc2lvbgorCSAgICB8ICdmcm9tOicgICAgICAgdWU9dW5hcnlFeHByZXNzaW9uCisJICAgIHwgJ3RvOicgICAgICAgICB1ZT11bmFyeUV4cHJlc3Npb24KKwkgICAgfCAnYWN0aXZpdHk6JyAgIG89b3BfYWN0aXZpdHkKKwkgICAgKT8KKwkgIFJQQVJFTgorCSAgU0VNSQorCTsKKworZXhwcmVzc2lvbl9pbnZva2UKK3JldHVybnMgWyBzZXA6OkJGQ29kZSBhYyBdCisJOiBMUEFSRU5fSU5WT0tFCisJICAgIGU9dW5hcnlFeHByZXNzaW9uICB7ICRhYyA9IE5FV19TVE1UMShPUChJTlZPS0VfTUVUSE9EKSwgJGUuYmYpOyB9CisJICAgICggaWQ9SUQgICAgICAgICAgICB7ICRhYy0+YXBwZW5kKHNlcDo6UGFyc2VyVXRpbDo6Z2V0SW52b2thYmxlKCRlLmJmLCBTVFIoJGlkLnRleHQtPmNoYXJzKSkpOyB9CisJICAgIHwgJ2luJyAgICAgICAgICAgICB7ICRhYy0+YXBwZW5kKCBJTkNSX0JGKE9QKElOKSkgKTsgfQorCSAgICB8IG9wPW9wX2ludm9rYWJsZSAgeyAkYWMtPmFwcGVuZCggSU5DUl9CRigkb3Aub3ApICk7IH0KKwkgICAgKQorCSAgICAoIGU9ZXhwcmVzc2lvbiAgICAgeyAkYWMtPmFwcGVuZCgkZS5iZik7IH0gKSoKKwkgICAgKCAncHJvdmlkZWQ6JyAgIGU9ZXhwcmVzc2lvbgorCSAgICB8ICdmcm9tOicgICAgICB1ZT11bmFyeUV4cHJlc3Npb24KKwkgICAgfCAndG86JyAgICAgICAgdWU9dW5hcnlFeHByZXNzaW9uCisJICAgIHwgJ2FjdGl2aXR5OicgICBvPW9wX2FjdGl2aXR5CisJICAgICk/CisJICBSUEFSRU4KKwk7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNUQVRFTUVOVCBORVcKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRlbWVudF9hY3Rpdml0eV9uZXcKK3JldHVybnMgWyBzZXA6OkJGQ29kZSBhYyBdCitAaW5pdHsKKwlzZXA6Ok1hY2hpbmUgKiBwdHJJbnN0YW5jZSA9IE5VTEw7CisJc2VwOjpCRiBhTW9kZWw7CisJCisJc2VwOjpNYWNoaW5lICogY29udGFpbmVyID0gX0NQTV87Cit9CitAYWZ0ZXJ7CisJaWYoIGFNb2RlbC5pczwgc2VwOjpNYWNoaW5lID4oKSApCisJeworCQlQT1BfQ1RYOworCX0KK30KKwk6ICduZXcnICAgeyAkYWMgPSBORVdfU1RNVChPUChJTlZPS0VfTkVXKSk7IH0KKwkgIGlkPXF1YWxpZmllZE5hbWVJRAorCSAgeworCSAgCWFNb2RlbCA9IHNlcDo6UGFyc2VyVXRpbDo6Z2V0dmFyTWFjaGluZSgkaWQucywgJGlkLm5iKTsKKworCSAgCWlmKCBhTW9kZWwuaXM8IHNlcDo6TWFjaGluZSA+KCkgKQorCSAgCXsKKwkgIAkJUFVTSF9DVFhfTkVXKCBhTW9kZWwudG9fcHRyPCBzZXA6Ok1hY2hpbmUgPigpICk7CisJICAJfQorCisJICAJcHRySW5zdGFuY2UgPSBzZXA6Ok1hY2hpbmU6Om5ld0luc3RhbmNlKGNvbnRhaW5lciwKKwkgIAkJCW5ld0ludm9rZU5ld0luc3RhbmNlTmFtZUlEKGNvbnRhaW5lciwgJGlkLnMpLCBhTW9kZWwsIDEsIDEpOworCisJCXB0ckluc3RhbmNlLT5nZXR3U3BlY2lmaWVyKCkub3ZlcnJpZGVfaWZkZWYoCisJCQkJc2VwOjpTcGVjaWZpZXI6OkRFU0lHTl9JTlNUQU5DRV9EWU5BTUlDX1NQRUNJRklFUiApOworCisJICAJICRhYy0+YXBwZW5kKCBjb250YWluZXItPnNhdmVPd25lZEVsZW1lbnQoIHB0ckluc3RhbmNlICkgKTsKKwkgIH0KKworCSAgLy9hY3Rpdml0eV9tYWNoaW5lX3BhcmFtX3JldHVyblsgYU1vZGVsICwgYWMgXQorCSAgZGVjbF9pbnN0YW5jZV9keW5hbWljX2ltcGxbIF9DUE1fICwgcHRySW5zdGFuY2UgXQorCisJICAoICggJy0tPicgfCAncmV0dXJuczonICkgZT1leHByZXNzaW9uICk/CisKKyAgICAgIFNFTUkKKwk7CisKKworZGVjbF9pbnN0YW5jZV9keW5hbWljX2ltcGwKKy8qIGluICovWyBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIgLCBzZXA6Ok1hY2hpbmUgKiBwdHJJbnN0YW5jZSBdCitAaW5pdHsKKwlTQVZFX1JVTEVfQkVHSU5fTE9DQVRJT047Cit9CitAYWZ0ZXJ7CisJU0VUX1JVTEVfTE9DQVRJT04ocHRySW5zdGFuY2UpOworfQorCTogKCAoIExQQVJFTiApID0+IExQQVJFTgorCSAgICAoIGRlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlbIHB0ckluc3RhbmNlIF0gKSA/CisJICAgIFJQQVJFTgorCSAgKT8KKworCSAgKCAoIExDVVJMWSApID0+IExDVVJMWQorCSAgICAoIHM9c3RhdGVtZW50IHsgcHRySW5zdGFuY2UtPmdldFVuaXFCZWhhdmlvclBhcnQoKS0+c2VxT25DcmVhdGUoJHMuYWMpOyB9ICkqCisKKwkgICAgKCBkZWZfaW5zdGFuY2VfYWN0aXZpdHlbIHB0ckluc3RhbmNlIF0gKSoKKwkgICAgUkNVUkxZCisJICApPworCTsKKworCisKK2V4cHJlc3Npb25fYWN0aXZpdHlfbmV3CityZXR1cm5zIFsgc2VwOjpCRkNvZGUgYWMgXQorQGluaXR7CisJc2VwOjpNYWNoaW5lICogcHRySW5zdGFuY2UgPSBOVUxMOworCXNlcDo6QkYgYU1vZGVsOworCQorCXNlcDo6TWFjaGluZSAqIGNvbnRhaW5lciA9IF9DUE1fOworfQorQGFmdGVyeworCWlmKCBhTW9kZWwuaXM8IHNlcDo6TWFjaGluZSA+KCkgKQorCXsKKwkJUE9QX0NUWDsKKwl9Cit9CisJOiAnbmV3JyAgICB7ICRhYyA9IE5FV19TVE1UKE9QKElOVk9LRV9ORVcpKTsgfQorCSAgaWQ9cXVhbGlmaWVkTmFtZUlECisJICB7CisJICAJc2VwOjpCRiBhTW9kZWwgPSBzZXA6OlBhcnNlclV0aWw6OmdldHZhck1hY2hpbmUoJGlkLnMsICRpZC5uYik7CisKKwkgIAlpZiggYU1vZGVsLmlzPCBzZXA6Ok1hY2hpbmUgPigpICkKKwkgIAl7CisJICAJCVBVU0hfQ1RYX05FVyggYU1vZGVsLnRvX3B0cjwgc2VwOjpNYWNoaW5lID4oKSApOworCSAgCX0KKworCSAgCXB0ckluc3RhbmNlID0gc2VwOjpNYWNoaW5lOjpuZXdJbnN0YW5jZShjb250YWluZXIsCisJICAJCQluZXdJbnZva2VOZXdJbnN0YW5jZU5hbWVJRChjb250YWluZXIsICRpZC5zKSwgYU1vZGVsLCAxLCAxKTsKKworCQlwdHJJbnN0YW5jZS0+Z2V0d1NwZWNpZmllcigpLm92ZXJyaWRlX2lmZGVmKAorCQkJCXNlcDo6U3BlY2lmaWVyOjpERVNJR05fSU5TVEFOQ0VfRFlOQU1JQ19TUEVDSUZJRVIgKTsKKworCSAgCSAkYWMtPmFwcGVuZCggY29udGFpbmVyLT5zYXZlT3duZWRFbGVtZW50KCBwdHJJbnN0YW5jZSApICk7CisJICB9CisKKwkgIGFjdGl2aXR5X21hY2hpbmVfcGFyYW1fcmV0dXJuWyBhTW9kZWwgLCBhYyBdCisvLwkgIGRlY2xfaW5zdGFuY2VfZHluYW1pY19leHByX2ltcGxbIF9DUE1fICwgcHRySW5zdGFuY2UgLCBhYyBdCisKKy8vCSAgeyAkYWMtPnRvU3RyZWFtKHNlcDo6QVZNX09TX0RFQlVHKTsgfQorCTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU1RBVEVNRU5UIFBST01QVAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGVtZW50X3Byb21wdAorcmV0dXJucyBbIHNlcDo6QkZDb2RlIGFjIF0KKwk6IFNUQVRFTUVOVF9QUk9NUFQgIHNwaT1zdGF0ZW1lbnRfcHJvbXB0X2ltcGwgeyAkYWMgPSAgJHNwaS5hYzsgfQorCTsKKworc3RhdGVtZW50X3Byb21wdF9pbXBsCityZXR1cm5zIFsgc2VwOjpCRkNvZGUgYWMgXQorCTogc3BvPXN0YXRlbWVudF9wcm9tcHRfb2JzICB7ICRhYyA9ICRzcG8uYWM7IH0KKwk7CisKKworc3RhdGVtZW50X3Byb21wdF9vYnMKK3JldHVybnMgWyBzZXA6OkJGQ29kZSBhYyBdCitAaW5pdHsKKwlzZXA6OkJGIHZhck1hY2hpbmUgPSBJTkNSX0JGKF9TWVNURU1fKTsKK30KKwk6IHsgSVNfS0VZV09SRCggIm9icyIgKSB9PyBJRAorCisJICAoICdjdHg6JyBpZD1xdWFsaWZpZWROYW1lSUQKKwkgIHsgdmFyTWFjaGluZSA9IHNlcDo6UGFyc2VyVXRpbDo6Z2V0dmFyTWFjaGluZSgkaWQucywgJGlkLm5iKTsgfQorCSAgKT8KKworCSAgTENVUkxZCisJICAgIGJzPXN0YXRlbWVudF9wcm9tcHRfb2JzX2NvbVsgdmFyTWFjaGluZSBdCisJICBSQ1VSTFkKKworCSAgKCAncHJvdmlkZWQ6JyBlPWV4cHJlc3Npb24KKwkgIHwgTEJSQUNLRVQgZT1leHByZXNzaW9uIFJCUkFDS0VUCisJICApCisJICBTRU1JCisKKwl7ICRhYyA9IE5FV19TVE1UMyhPUChPQlMpLCB2YXJNYWNoaW5lLCAkYnMuYWMsICRlLmJmKTsgfQorCTsKKworCitzdGF0ZW1lbnRfcHJvbXB0X29ic19jb20gIFsgY29uc3Qgc2VwOjpCRiAmIHZhck1hY2hpbmUgXQorcmV0dXJucyBbIHNlcDo6QkZDb2RlIGFjIF0KKwk6IHNjPXN0YXRlbWVudF9jb20gIHsgJGFjID0gJHNjLmFjOyB9CisJOworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBNRVRBIFNUQVRFTUVOVAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworbWV0YV9zdGF0ZW1lbnQKK3JldHVybnMgWyBzZXA6OkJGQ29kZSBhYyBdCisJOiAnJDppbmZvcm1hbCcgIGJzPWJsb2NrX3N0YXRlbWVudCAgeyAkYWMgPSBORVdfU1RNVDEoT1AoSU5GT1JNQUwpLCAkYnMuYWMpOyB9CisJfCAnJDp0cmFjZScgICAgIGJzPWJsb2NrX3N0YXRlbWVudCAgeyAkYWMgPSBORVdfU1RNVDEoT1AoVFJBQ0UpICAgLCAkYnMuYWMpOyB9CisJfCAnJDpkZWJ1ZycgICAgIGJzPWJsb2NrX3N0YXRlbWVudCAgeyAkYWMgPSBORVdfU1RNVDEoT1AoREVCVUcpICAgLCAkYnMuYWMpOyB9CisJfCAnJDpjb21tZW50JyAgIGJzPWJsb2NrX3N0YXRlbWVudCAgeyAkYWMgPSBORVdfU1RNVDEoT1AoQ09NTUVOVCkgLCAkYnMuYWMpOyB9CisvKiBUT0RPI0FERAorCS8vIG1ldGFfZXZhbAorCXwgTEJSQUNLRVRfQkFSCisJICAgIGU9ZXhwcmVzc2lvbiAgeyAkYWMgPSBORVdfU1RNVDEoT1AoTUVUQV9FVkFMKSwgJGUuYmYpOyB9CisJICBCQVJfUkJSQUNLRVQKKworCS8vIG1ldGFfcnVuCisJfCBMQlJBQ0tFVF9MQ1VSTFkKKwkgICAgcz1zdGF0ZW1lbnQgICB7ICRhYyA9IE5FV19TVE1UMShPUChNRVRBX1JVTiksICRzLmFjKTsgfQorCSAgUkNVUkxZX1JCUkFDS0VUCisqLworCTsKKworLyogVE9ETyNBREQKK3F1b3RlX3N0YXRlbWVudAorcmV0dXJucyBbIHNlcDo6QkZDb2RlIGFjIF0KK0Bpbml0eworCXNlcDo6T3BlcmF0b3IgKiBvcCA9IE9QKFNFUVVFTkNFKTsKK30KKwk6IFBFUkNFTlRfTENVUkxZICAoIG89b3BfYmxvY2sgeyBvcCA9ICRvLm9wOyB9ICkgPyAgeyAkYWMgPSBORVdfU1RNVChvcCk7IH0KKwkgICAgKCBzPXN0YXRlbWVudCAgeyAkYWMtPmFwcGVuZCgkcy5hYyk7IH0gICkrCisJICBSQ1VSTFlfUEVSQ0VOVAorCSB7ICRhYyA9IE5FV19TVE1UMShPUChRVU9URSksICRhYyk7IH0KKwk7CisqLworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTVEFURU1FTlQgQVNTSUdOCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0ZW1lbnRfYXNzaWduCityZXR1cm5zIFsgc2VwOjpCRkNvZGUgYWMgXQorCS8vIGx2YWx1ZSA6PSBleHByZXNzaW9uCisJOiBsdj1sdmFsdWUKKwkoICggQVNTSUdOIHwgQVNTSUdOX0FGVEVSICkgIGU9ZXhwcmVzc2lvbiAgU0VNSQorCSAgeyAkYWMgPSBORVdfU1RNVDIoT1AoQVNTSUdOKSwgJGx2LmJmLCAkZS5iZik7IH0KKworCXwgQVNTSUdOX1JFRiAgZT1sdmFsdWUgIFNFTUkKKwl7ICRhYyA9IE5FV19TVE1UMihPUChBU1NJR05fUkVGKSwgJGx2LmJmLCAkZS5iZik7IH0KKworCXwgQVNTSUdOX01BQ1JPICBlPWV4cHJlc3Npb24gIFNFTUkKKwl7ICRhYyA9IE5FV19TVE1UMihPUChBU1NJR05fTUFDUk8pLCAkbHYuYmYsICRlLmJmKTsgfQorCisKKwl8ICggUExVU19BU1NJR04gfCBQTFVTX0FTU0lHTl9BRlRFUiApICBlPWV4cHJlc3Npb24gIFNFTUkKKwl7ICRhYyA9IE5FV19TVE1UX0FTU0lHTl9PUChPUChQTFVTKSwgJGx2LmJmLCAkZS5iZik7IH0KKworCXwgKCBNSU5VU19BU1NJR04gfCBNSU5VU19BU1NJR05fQUZURVIgKSAgZT1leHByZXNzaW9uICBTRU1JCisJeyAkYWMgPSBORVdfU1RNVF9BU1NJR05fT1AoT1AoTUlOVVMpLCAkbHYuYmYsICRlLmJmKTsgfQorCisJfCAoIFNUQVJfQVNTSUdOIHwgU1RBUl9BU1NJR05fQUZURVIgKSAgZT1leHByZXNzaW9uICBTRU1JCisJeyAkYWMgPSBORVdfU1RNVF9BU1NJR05fT1AoT1AoTVVMVCksICRsdi5iZiwgJGUuYmYpOyB9CisKKwl8ICggRElWX0FTU0lHTiB8IERJVl9BU1NJR05fQUZURVIgKSAgZT1leHByZXNzaW9uICBTRU1JCisJeyAkYWMgPSBORVdfU1RNVF9BU1NJR05fT1AoT1AoRElWKSwgJGx2LmJmLCAkZS5iZik7IH0KKworCXwgKCBNT0RfQVNTSUdOIHwgTU9EX0FTU0lHTl9BRlRFUiApICBlPWV4cHJlc3Npb24gIFNFTUkKKwl7ICRhYyA9IE5FV19TVE1UX0FTU0lHTl9PUChPUChNT0QpLCAkbHYuYmYsICRlLmJmKTsgfQorCisKKwl8ICggTEFORF9BU1NJR04gfCBMQU5EX0FTU0lHTl9BRlRFUiApICBlPWV4cHJlc3Npb24gIFNFTUkKKwl7ICRhYyA9IE5FV19TVE1UX0FTU0lHTl9PUChPUChBTkQpLCAkbHYuYmYsICRlLmJmKTsgfQorCisJfCAoIExPUl9BU1NJR04gfCBMT1JfQVNTSUdOX0FGVEVSICkgIGU9ZXhwcmVzc2lvbiAgU0VNSQorCXsgJGFjID0gTkVXX1NUTVRfQVNTSUdOX09QKE9QKE9SKSwgJGx2LmJmLCAkZS5iZik7IH0KKworCisJfCAoIEJBTkRfQVNTSUdOIHwgQkFORF9BU1NJR05fQUZURVIgKSAgZT1leHByZXNzaW9uICBTRU1JCisJeyAkYWMgPSBORVdfU1RNVF9BU1NJR05fT1AoT1AoQkFORCksICRsdi5iZiwgJGUuYmYpOyB9CisKKwl8ICggQk9SX0FTU0lHTiB8IEJPUl9BU1NJR05fQUZURVIgKSAgZT1leHByZXNzaW9uICBTRU1JCisJeyAkYWMgPSBORVdfU1RNVF9BU1NJR05fT1AoT1AoQk9SKSwgJGx2LmJmLCAkZS5iZik7IH0KKworCXwgKCBCWE9SX0FTU0lHTiB8IEJYT1JfQVNTSUdOX0FGVEVSICkgIGU9ZXhwcmVzc2lvbiAgU0VNSQorCXsgJGFjID0gTkVXX1NUTVRfQVNTSUdOX09QKE9QKEJYT1IpLCAkbHYuYmYsICRlLmJmKTsgfQorCisKKwl8ICggTFNISUZUX0FTU0lHTiB8IExTSElGVF9BU1NJR05fQUZURVIgKSAgZT1leHByZXNzaW9uICBTRU1JCisJeyAkYWMgPSBORVdfU1RNVF9BU1NJR05fT1AoT1AoTFNISUZUKSwgJGx2LmJmLCAkZS5iZik7IH0KKworCXwgKCBSU0hJRlRfQVNTSUdOIHwgUlNISUZUX0FTU0lHTl9BRlRFUiApICBlPWV4cHJlc3Npb24gIFNFTUkKKwl7ICRhYyA9IE5FV19TVE1UX0FTU0lHTl9PUChPUChSU0hJRlQpLCAkbHYuYmYsICRlLmJmKTsgfQorCisKKwkvLyBxdWV1ZSA8PTwgZXhwcmVzc2lvbiAoIDw9PCBleHByZXNzaW9uICkqCisJLy8gZmlmbyA8PTwgYSA8PTwgYiA8PTwgYworCS8vIHNvaXQgOj4gIGZpZm86YTpiOmMKKwl8IE9QX1BVU0ggIGU9ZXhwcmVzc2lvbgorCXsgJGFjID0gTkVXX1NUTVQyKE9QKFBVU0gpLCAkbHYuYmYsICRlLmJmKTsgfQorCSAgKCBPUF9QVVNIICBlPWV4cHJlc3Npb24gIHsgJGFjLT5hcHBlbmQoJGUuYmYpOyB9ICkqCisJICBTRU1JCisKKwkvLyBxdWV1ZSBePTwgZXhwcmVzc2lvbgorCS8vIGZpZm86YSBePTwgYgorCS8vIHNvaXQgOj4gIGZpZm86YgorCXwgT1BfQVNTSUdOX1RPUCAgZT1leHByZXNzaW9uICBTRU1JCisJeyAkYWMgPSBORVdfU1RNVDIoT1AoQVNTSUdOX1RPUCksICRsdi5iZiwgJGUuYmYpOyB9CisKKwkvLyBxdWV1ZSBePT4gbHZhbHVlCisJLy8gZmlmbzphIF49PiBiCisJLy8gc29pdCA6PiAgZmlmbzphICBldCAgbHZhbHVlID0gYQorCXwgT1BfVE9QICB2PWx2YWx1ZSAgU0VNSQorCXsgJGFjID0gTkVXX1NUTVQyKE9QKFRPUCksICRsdi5iZiwgJHYuYmYpOyB9CisKKwkvLyBxdWV1ZSA+PT4gbHZhbHVlICggPj0+IGx2YWx1ZSApKgorCS8vIGZpZm86OmE6OmI6OmMgPj0+IGx2YWx1ZTEgPj0+IGx2YWx1ZTIgPj0+IGx2YWx1ZTMKKwkvLyBzb2l0IDo+ICBmaWZvICBldCAgbHZhbHVlMSA9IGMgLCBsdmFsdWUyID0gYiAsIGx2YWx1ZTMgPSBhCisJfCBPUF9QT1AgICAgICB7ICRhYyA9IE5FV19TVE1UMShPUChQT1ApLCAkbHYuYmYpOyB9CisJICAoIHY9bHZhbHVlICB7ICRhYy0+YXBwZW5kKCR2LmJmKTsgfSApKgorCSAgU0VNSQorCisJLy8gbHZhbHVlICsrCisJfCBJTkNSICBTRU1JCisJeyAkYWMgPSBORVdfU1RNVF9BU1NJR05fT1AoT1AoUExVUyksICRsdi5iZiwKKwkJc2VwOjpFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfT05FKTsgfQorCisJLy8gbHZhbHVlIC0tCisJfCBERUNSICBTRU1JCisJeyAkYWMgPSBORVdfU1RNVF9BU1NJR05fT1AoT1AoUExVUyksICRsdi5iZiwKKwkJc2VwOjpFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfTUlOVVNfT05FKTsgfQorCSkKKworLy8JfCAncG9wJyAgbHY9bHZhbHVlICBTRU1JCisvLwl7ICRhYyA9IE5FV19TVE1UMShPUChQT1ApLCAkbHYuYmYpOyB9CisKKy8vCXwgJ25ld2ZyZXNoJyAgbHY9bHZhbHVlICBTRU1JCisvLwl7ICRhYyA9IE5FV19TVE1UMShPUChBU1NJR05fTkVXRlJFU0gpLCAkbHYuYmYpOyB9CisKKwkvLyArKyBsdmFsdWUKKwl8IElOQ1IgIGx2PWx2YWx1ZSAgU0VNSQorCXsgJGFjID0gTkVXX1NUTVRfQVNTSUdOX09QKE9QKFBMVVMpLCAkbHYuYmYsCisJCXNlcDo6RXhwcmVzc2lvbkNvbnN0YW50OjpJTlRFR0VSX09ORSk7IH0KKworCS8vIC0tIGx2YWx1ZQorCXwgREVDUiAgbHY9bHZhbHVlICBTRU1JCisJeyAkYWMgPSBORVdfU1RNVF9BU1NJR05fT1AoT1AoUExVUyksICRsdi5iZiwKKwkJc2VwOjpFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfTUlOVVNfT05FKTsgfQorCTsKKworCitsdmFsdWUKK3JldHVybnMgWyBzZXA6OkJGIGJmIF0KK0Bpbml0eworCXNlcDo6VW5pRm9ybUlkZW50aWZpZXIgKiB1Zmk7CisJc2VwOjpCRiBiZlVmaTsgLy8gZm9yIGF1dG9tYXRpYyBkZXN0cnVjdGlvbiBvZiA8PCBVRkkgPj4gaWYgbmVlZAorCisJc2VwOjphdm1fc2l6ZV90IGNvdW50SUQgPSAxOworCWJvb2wgaXNub3RFWFBSID0gdHJ1ZTsKKworCVNBVkVfUlVMRV9CRUdJTl9MT0NBVElPTjsKK30KKwk6ICggQ09MT054MiB7IHVmaS0+c2V0QWJzb2x1dGUoKTsgfSApPworCSAgaWQ9SUQKKwkgIHsKKwkgIAl1ZmkgPSBuZXcgc2VwOjpVbmlGb3JtSWRlbnRpZmllcihmYWxzZSk7CisJICAJYmZVZmkgPSB1Zmk7CisKKwkJaWYoICgkYmYgPSBzZXA6OlBhcnNlclV0aWw6OmdldHZhcihTVFIoJGlkLnRleHQtPmNoYXJzKSwgMSkpLnZhbGlkKCkgKQorCQl7CisJCSAgCXVmaS0+YXBwZW5kRmllbGRWYXJpYWJsZSgkYmYpOworCQl9CisJCWVsc2UgaWYoICgkYmYgPSBzZXA6OlBhcnNlclV0aWw6OmdldHZhck1hY2hpbmUoCisJCQkJU1RSKCRpZC50ZXh0LT5jaGFycyksIDEpKS52YWxpZCgpICkKKwkJeworCQkgIAl1ZmktPmFwcGVuZEZpZWxkTWFjaGluZSgkYmYpOworCQl9CisJCWVsc2UKKwkJeworCQkgIAl1ZmktPmFwcGVuZEZpZWxkKFNUUigkaWQudGV4dC0+Y2hhcnMpKTsKKwkJfQorCisJCSRiZiA9IGJmVWZpOworCSAgfQorCisJICAoICggRE9UIGlkPUlECisJICAgIHsgdWZpLT5hcHBlbmRGaWVsZChTVFIoJGlkLnRleHQtPmNoYXJzKSk7ICArK2NvdW50SUQ7IH0gKQorCisJICB8ICggTEJSQUNLRVQgIGU9ZXhwcmVzc2lvbiAgUkJSQUNLRVQKKwkgICAgeyB1ZmktPmFwcGVuZEluZGV4KCRlLmJmKTsgaXNub3RFWFBSID0gZmFsc2U7IH0gKQorCSAgKSoKKwl7CisJCWlmKCBpc25vdEVYUFIgKQorCQl7CisJCQlpZiggY291bnRJRCA9PSAxICkKKwkJCXsKKwkJCQkkYmYgPSB1ZmktPmZpcnN0KCk7CisJCQl9CisJCQllbHNlIGlmKCAoJGJmID0gc2VwOjpQYXJzZXJVdGlsOjpnZXR2YXIoCisJCQkJCXVmaS0+c3RyKCksIGNvdW50SUQpKS5pbnZhbGlkKCkgKQorCQkJeworCQkJCSRiZiA9IGJmVWZpOworCQkJCVNFVF9SVUxFX0xPQ0FUSU9OKHVmaSk7CisJCQl9CisJCX0KKwl9CisJOworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTVEFURU1FTlQgQlVGRkVSCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvL3N0YXRlbWVudF9idWZmZXIKKy8vcmV0dXJucyBbIHNlcDo6QkZDb2RlIGFjIF0KKy8vCTogJ2NsZWFyJyAgaWQ9cXVhbGlmaWVkTmFtZUlEICBTRU1JCisvLwl7ICRhYyA9IE5FV19TVE1UMShPUChDTEVBUiksIGdldHZhckJ1ZmZlcigkaWQucywgJGlkLm5iKSk7IH0KKy8vCisvLwl8ICdwdXNoJyAgaWQ9cXVhbGlmaWVkTmFtZUlECisvLyAgICB7ICRhYyA9IE5FV19TVE1UMShPUChQVVNIKSwgZ2V0dmFyQnVmZmVyKCRpZC5zLCAkaWQubmIpKTsgfQorLy8JICAgcGFyYW1ldGVyc1sgYWMgXSA/ICBTRU1JCisvLworLy8JfCAncG9wJyAgIGlkPXF1YWxpZmllZE5hbWVJRAorLy8gICAgeyAkYWMgPSBORVdfU1RNVDEoT1AoUE9QKSwgZ2V0dmFyQnVmZmVyKCRpZC5zLCAkaWQubmIpKTsgfQorLy8JICBwYXJhbWV0ZXJzWyBhYyBdID8gIFNFTUkKKy8vCisvLwl8ICd0b3AnICAgaWQ9cXVhbGlmaWVkTmFtZUlECisvLyAgICB7ICRhYyA9IE5FV19TVE1UMShPUChUT1ApLCBnZXR2YXJCdWZmZXIoJGlkLnMsICRpZC5uYikpOyB9CisvLwkgIHBhcmFtZXRlcnNbIGFjIF0gPyAgU0VNSQorLy8JOworCisvL2V4cHJlc3Npb25fYnVmZmVyCisvL3JldHVybnMgWyBzZXA6OkJGQ29kZSBhYyBdCisvLwk6ICdlbXB0eScgIGU9dW5hcnlFeHByZXNzaW9uCisvLwl7ICRhYyA9IE5FV19TVE1UMShPUChFTVBUWSksICRlLmJmKTsgfQorLy8KKy8vCXwgJ25vbmVtcHR5JyAgZT11bmFyeUV4cHJlc3Npb24KKy8vCXsgJGFjID0gTkVXX1NUTVQxKE9QKE5PTkVNUFRZKSwgJGUuYmYpOyB9CisvLworLy8JfCAnc2luZ2xldG9uJyAgZT11bmFyeUV4cHJlc3Npb24KKy8vCXsgJGFjID0gTkVXX1NUTVQxKE9QKFNJTkdMRVRPTiksICRlLmJmKTsgfQorLy8KKy8vCXwgJ3BvcHVsYXRlZCcgIGU9dW5hcnlFeHByZXNzaW9uCisvLwl7ICRhYyA9IE5FV19TVE1UMShPUChQT1BVTEFURUQpLCAkZS5iZik7IH0KKy8vCisvLwl8ICdmdWxsJyAgZT11bmFyeUV4cHJlc3Npb24KKy8vCXsgJGFjID0gTkVXX1NUTVQxKE9QKEZVTEwpLCAkZS5iZik7IH0KKy8vCisvLwl8ICdzaXplJyAgZT11bmFyeUV4cHJlc3Npb24KKy8vCXsgJGFjID0gTkVXX1NUTVQxKE9QKFNJWkUpLCAkZS5iZik7IH0KKy8vCisvLwl8ICdwb3AnICBlPXVuYXJ5RXhwcmVzc2lvbgorLy8JeyAkYWMgPSBORVdfU1RNVDEoT1AoUE9QKSwgJGUuYmYpOyB9CisvLworLy8JfCAndG9wJyAgZT11bmFyeUV4cHJlc3Npb24KKy8vCXsgJGFjID0gTkVXX1NUTVQxKE9QKFRPUCksICRlLmJmKTsgfQorLy8JOworCitwYXJhbWV0ZXJzIFsgY29uc3Qgc2VwOjpCRkNvZGUgJiBhYyBdCisJOiBMUEFSRU4gIGU9ZXhwcmVzc2lvbiAgeyAkYWMtPmFwcGVuZCgkZS5iZik7IH0KKwkgICggQ09NTUEgZT1leHByZXNzaW9uICB7ICRhYy0+YXBwZW5kKCRlLmJmKTsgfSAgKSoKKwkgIFJQQVJFTgorCTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU1RBVEVNRU5UIENPTQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGVtZW50X2NvbQorcmV0dXJucyBbIHNlcDo6QkZDb2RlIGFjIF0KKwk6IHM9c3RhdGVtZW50X2NvbV9pbnB1dCAgIHsgJGFjID0gJHMuYWM7IH0KKwl8IHM9c3RhdGVtZW50X2NvbV9vdXRwdXQgIHsgJGFjID0gJHMuYWM7IH0KKwk7CisKK3N0YXRlbWVudF9jb21faW5wdXQKK3JldHVybnMgWyBzZXA6OkJGQ29kZSBhYyBdCitAaW5pdHsKKwlzZXA6OkJGIHZhclBvcnRTaWduYWw7CisJc2VwOjpQb3J0ICogcG9ydCA9IE5VTEw7CisJc2VwOjpPcGVyYXRvciAqIG9wID0gTlVMTDsKK30KKwk6ICggdG9rPSdpbnB1dCcgICAgICAgIHsgb3AgPSBPUChJTlBVVCk7ICAgICAgICB9CisJICB8IHRvaz0naW5wdXQjc2F2ZScgICB7IG9wID0gT1AoSU5QVVRfU0FWRSk7ICAgfQorCSAgfCB0b2s9J2lucHV0I3ZhcicgICAgeyBvcCA9IE9QKElOUFVUX1ZBUik7ICAgIH0KKwkgIHwgdG9rPSdpbnB1dCNmbG93JyAgIHsgb3AgPSBPUChJTlBVVF9GTE9XKTsgICB9CisJICB8IHRvaz0naW5wdXQjZW52JyAgICB7IG9wID0gT1AoSU5QVVRfRU5WKTsgICAgfQorCSAgfCB0b2s9J2lucHV0I2J1ZmZlcicgeyBvcCA9IE9QKElOUFVUX0JVRkZFUik7IH0KKwkgIHwgdG9rPSdpbnB1dCNyZHYnICAgIHsgb3AgPSBPUChJTlBVVF9SRFYpOyAgICB9CisJICApIGlkPXF1YWxpZmllZE5hbWVJRAorCSAgeworCSAgCSRhYyA9IE5FV19TVE1UMSggb3AsCisJICAJCXZhclBvcnRTaWduYWwgPSBzZXA6OlBhcnNlclV0aWw6OmdldHZhclBvcnRTaWduYWwoJGlkLnMsICRpZC5uYikgKTsKKwkgIAlpZiggdmFyUG9ydFNpZ25hbC5pczwgc2VwOjpQb3J0ID4oKSApCisJICAJeyBwb3J0ID0gdmFyUG9ydFNpZ25hbC50b19wdHI8IHNlcDo6UG9ydCA+KCk7IH0KKwkgIAllbHNlIGlmKCB2YXJQb3J0U2lnbmFsLmludmFsaWQoKSApCisJICAJeworCSAgCQlzZXA6OlBhcnNlclV0aWw6OmF2bV9zeW50YXhfZXJyb3IoCisJICAJCQkic3RhdGVtZW50X2NvbV9pbnB1dDo+ICIsICR0b2subGluZSApCisJICAJCQkJPDwgIlVuZm91bmQgcG9ydC9zaWduYWwgb3IgdmFyaWFibGUgPCAiIDw8ICRpZC5zCisJICAJCQkJPDwgIiA+IGluIG1hY2hpbmUgPCAiIDw8IHN0cl9oZWFkZXIoIF9DUE1fICkgPDwgIiA+IgorCSAgCQkJCTw8IHNlcDo6UGFyc2VyVXRpbDo6U1lOVEFYX0VSUk9SX0VPTDsKKwkgIAl9CisJICB9CisJICBwYXJhbWV0ZXJzX3BvcnRbIHBvcnQgLCBhYyBdID8KKwkgICggJzwtLScKKwkgICAgKCAnZW52JyAgeyAkYWMtPnNldE9wZXJhdG9yKCBPUChJTlBVVF9FTlYpICk7IH0KKwkgICAgfCBtZT1leHByZXNzaW9uCisJCXsKKwkJCXNlcDo6QkZDb2RlIGlucHV0RnJvbSA9IE5FV19TVE1UMihPUChJTlBVVF9GUk9NKSwgJGFjLT5maXJzdCgpLCAkbWUuYmYpOworCisJCQlpbnB1dEZyb20tPmluc2VydChpbnB1dEZyb20tPmVuZCgpLCArKygkYWMtPmJlZ2luKCkpLCAkYWMtPmVuZCgpKTsKKwkJCSRhYyA9IGlucHV0RnJvbTsKKwkJfQorCSAgICApCisJICAgICggJzwtJyBpZD1xdWFsaWZpZWROYW1lSUQKKwkgICAgeyAkYWMtPmFwcGVuZChzZXA6OlBhcnNlclV0aWw6OmdldHZhclBvcnRTaWduYWwoJGlkLnMsICRpZC5uYikpOyB9CisJICAgICk/CisJICApPworCSAgKCAoICc8PT0nIHwgJ3ZpYScgKSBpZD1xdWFsaWZpZWROYW1lSUQKKwkgIHsgc2VwOjpQYXJzZXJVdGlsOjp1cGRhdGVTaWduYWxSb3V0aW5nQ2hhbm5lbCgKKwkgIAkJc2VwOjpNb2RpZmllcjo6RElSRUNUSU9OX0lOUFVUX0tJTkQsICRhYywgJGlkLnMsICRpZC5uYik7IH0KKwkgICk/CisJICBTRU1JCisJOworCitzdGF0ZW1lbnRfY29tX291dHB1dAorcmV0dXJucyBbIHNlcDo6QkZDb2RlIGFjIF0KK0Bpbml0eworCXNlcDo6QkYgdmFyUG9ydFNpZ25hbDsKKwlzZXA6OlBvcnQgKiBwb3J0ID0gTlVMTDsKKwlzZXA6Ok9wZXJhdG9yICogb3AgPSBOVUxMOworfQorCTogKCB0b2s9J291dHB1dCcgICAgICAgIHsgb3AgPSBPUChPVVRQVVQpOyAgICAgICAgfQorCSAgfCB0b2s9J291dHB1dCN2YXInICAgIHsgb3AgPSBPUChPVVRQVVRfVkFSKTsgICAgfQorCSAgfCB0b2s9J291dHB1dCNmbG93JyAgIHsgb3AgPSBPUChPVVRQVVRfRkxPVyk7ICAgfQorCSAgfCB0b2s9J291dHB1dCNlbnYnICAgIHsgb3AgPSBPUChPVVRQVVRfRU5WKTsgICAgfQorCSAgfCB0b2s9J291dHB1dCNidWZmZXInIHsgb3AgPSBPUChPVVRQVVRfQlVGRkVSKTsgfQorCSAgfCB0b2s9J291dHB1dCNyZHYnICAgIHsgb3AgPSBPUChPVVRQVVRfUkRWKTsgICAgfQorCSAgKSBpZD1xdWFsaWZpZWROYW1lSUQKKwkgIHsKKwkgIAkkYWMgPSBORVdfU1RNVDEoIG9wLAorCSAgCQl2YXJQb3J0U2lnbmFsID0gc2VwOjpQYXJzZXJVdGlsOjpnZXR2YXJQb3J0U2lnbmFsKCRpZC5zLCAkaWQubmIpICk7CisJICAJaWYoIHZhclBvcnRTaWduYWwuaXM8IHNlcDo6UG9ydCA+KCkgKQorCSAgCXsgcG9ydCA9IHZhclBvcnRTaWduYWwudG9fcHRyPCBzZXA6OlBvcnQgPigpOyB9CisJICAJZWxzZSBpZiggdmFyUG9ydFNpZ25hbC5pbnZhbGlkKCkgKQorCSAgCXsKKwkgIAkJc2VwOjpQYXJzZXJVdGlsOjphdm1fc3ludGF4X2Vycm9yKAorCSAgCQkJInN0YXRlbWVudF9jb21fb3V0cHV0Oj4iLCAkdG9rLmxpbmUgKQorCSAgCQkJCTw8ICJVbmZvdW5kIHBvcnQvc2lnbmFsIG9yIHZhcmlhYmxlIDwgIiA8PCAkaWQucworCSAgCQkJCTw8ICIgPiBpbiBtYWNoaW5lIDwgIiA8PCBzdHJfaGVhZGVyKCBfQ1BNXyApIDw8ICIgPiIKKwkgIAkJCQk8PCBzZXA6OlBhcnNlclV0aWw6OlNZTlRBWF9FUlJPUl9FT0w7CisJICAJfQorCSAgfQorCSAgcGFyYW1ldGVyc19wb3J0WyBwb3J0ICwgYWMgXSA/CisJICAoICctLT4nCisJICAgICggJ2VudicgIHsgJGFjLT5zZXRPcGVyYXRvciggT1AoT1VUUFVUX0VOVikgKTsgfQorCSAgICB8IG1lPWV4cHJlc3Npb24KKwkJICB7CisJCSAgCXNlcDo6QkZDb2RlIG91dHB1dFRvID0gTkVXX1NUTVQyKE9QKE9VVFBVVF9UTyksICRhYy0+Zmlyc3QoKSwgJG1lLmJmKTsKKworCQkgIAlvdXRwdXRUby0+aW5zZXJ0KG91dHB1dFRvLT5lbmQoKSwgKysoJGFjLT5iZWdpbigpKSwgJGFjLT5lbmQoKSk7CisJCSAgCSRhYyA9IG91dHB1dFRvOworCQkgIH0KKwkgICAgKQorCSAgICAoICctPicgaWQ9cXVhbGlmaWVkTmFtZUlECisJICAgIHsgJGFjLT5hcHBlbmQoc2VwOjpQYXJzZXJVdGlsOjpnZXR2YXJQb3J0U2lnbmFsKCRpZC5zLCAkaWQubmIpKTsgfQorCSAgICApPworCSAgKT8KKwkgICggKCAnPT0+JyB8ICd2aWEnICkgaWQ9cXVhbGlmaWVkTmFtZUlECisJICB7IHNlcDo6UGFyc2VyVXRpbDo6dXBkYXRlU2lnbmFsUm91dGluZ0NoYW5uZWwoCisJICAJCXNlcDo6TW9kaWZpZXI6OkRJUkVDVElPTl9PVVRQVVRfS0lORCwgJGFjLCAkaWQucywgJGlkLm5iKTsgfQorCSAgKT8KKwkgIFNFTUkKKwk7CisKKworcGFyYW1ldGVyc19wb3J0CisvKiBpbiAqL1sgc2VwOjpQb3J0ICogcG9ydCAsIGNvbnN0IHNlcDo6QkZDb2RlICYgYWMgXQorQGluaXR7CisJc2VwOjpCRlZlY3RvciBsYWJlbGxlZFBhcmFtcygKKwkJCShwb3J0ICE9IE5VTEwpID8gcG9ydC0+Z2V0UGFyYW1ldGVyc0NvdW50KCkgOiAwICk7CisKKwlzZXA6OkJGTGlzdCBwb3NpdGlvbmFsUGFyYW1zOworfQorQGFmdGVyeworCXNlcDo6UGFyc2VyVXRpbDo6Y29tcHV0ZVBvcnRQYXJhbWV0ZXIoCisJCQlwb3J0LCAkYWMsIGxhYmVsbGVkUGFyYW1zLCBwb3NpdGlvbmFsUGFyYW1zKTsKK30KKwk6IExQQVJFTgorCSAgICBscD1sYWJlbGxlZF9hcmd1bWVudAorCSAgICB7CisgICAgCQlzZXA6OlBhcnNlclV0aWw6OmFwcGVuZFBvcnRQYXJhbWV0ZXIocG9ydCwgJGxwLmxhYmVsLAorICAgIAkJCQlsYWJlbGxlZFBhcmFtcywgcG9zaXRpb25hbFBhcmFtcywgJGxwLmFyZyk7CisJICAgIH0KKwkgICggQ09NTUEgIGxwPWxhYmVsbGVkX2FyZ3VtZW50CisJICAgIHsKKyAgICAJCXNlcDo6UGFyc2VyVXRpbDo6YXBwZW5kUG9ydFBhcmFtZXRlcihwb3J0LCAkbHAubGFiZWwsCisgICAgCQkJCWxhYmVsbGVkUGFyYW1zLCBwb3NpdGlvbmFsUGFyYW1zLCAkbHAuYXJnKTsKKwkgICAgfQorCSAgICApKgorCSAgUlBBUkVOCisJOworCisKKworZXhwcmVzc2lvbl9jb20KK3JldHVybnMgWyBzZXA6OkJGQ29kZSBhYyBdCisJOiAncHJlc2VudCcgIGlkPXF1YWxpZmllZE5hbWVJRAorCXsgJGFjID0gTkVXX1NUTVQxKE9QKFBSRVNFTlQpLAorCQlzZXA6OlBhcnNlclV0aWw6OmdldHZhclBvcnRTaWduYWwoJGlkLnMsICRpZC5uYikpOyB9CisKKwl8ICdhYnNlbnQnICBpZD1xdWFsaWZpZWROYW1lSUQKKwl7ICRhYyA9IE5FV19TVE1UMShPUChBQlNFTlQpLAorCQlzZXA6OlBhcnNlclV0aWw6OmdldHZhclBvcnRTaWduYWwoJGlkLnMsICRpZC5uYikpOyB9CisJOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU1RBVEVNRU5UIEdVQVJECisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0ZW1lbnRfY29uc3RyYWludAorcmV0dXJucyBbIHNlcDo6QkZDb2RlIGFjIF0KKwk6IHM9c3RhdGVtZW50X2d1YXJkICAgICAgICB7ICRhYyA9ICRzLmFjOyB9CisJfCBzPXN0YXRlbWVudF90aW1lZF9ndWFyZCAgeyAkYWMgPSAkcy5hYzsgfQorCXwgcz1zdGF0ZW1lbnRfY2hlY2tzYXQgICAgIHsgJGFjID0gJHMuYWM7IH0KKwk7CisKKworc3RhdGVtZW50X2d1YXJkCityZXR1cm5zIFsgc2VwOjpCRkNvZGUgYWMgXQorCTogJ2d1YXJkJyAgZT1leHByZXNzaW9uICBTRU1JCisJeyAkYWMgPSBORVdfU1RNVDEoT1AoR1VBUkQpLCAkZS5iZik7IH0KKworCXwgJ2V2ZW50JyAgZT1leHByZXNzaW9uICBTRU1JCisJeyAkYWMgPSBORVdfU1RNVDEoT1AoRVZFTlQpLCAkZS5iZik7IH0KKwk7CisKK3N0YXRlbWVudF90aW1lZF9ndWFyZAorcmV0dXJucyBbIHNlcDo6QkZDb2RlIGFjIF0KKwk6ICd0Z3VhcmQnICBlPWV4cHJlc3Npb24gIFNFTUkKKwl7ICRhYyA9IE5FV19TVE1UMShPUChUSU1FRF9HVUFSRCksICRlLmJmKTsgfQorCTsKKworc3RhdGVtZW50X2NoZWNrc2F0CityZXR1cm5zIFsgc2VwOjpCRkNvZGUgYWMgXQorQGluaXR7CisJc3RkOjpzdHJpbmcgc29sdmVySUQ7Cit9CisJOiAnY2hlY2tzYXQnCisJICAoIExUXyAgKCBpZD1TdHJpbmdMaXRlcmFsIHwgaWQ9SUQgKSAgR1QgICAgeyBzb2x2ZXJJRCA9IFNUUigkaWQudGV4dC0+Y2hhcnMpOyB9CisJICB8ICdzb2x2ZXI6JyAgKCBpZD1TdHJpbmdMaXRlcmFsIHwgaWQ9SUQgKSAgeyBzb2x2ZXJJRCA9IFNUUigkaWQudGV4dC0+Y2hhcnMpOyB9CisJICApPworCSAgZT1leHByZXNzaW9uICBTRU1JCisJeworCQlpZiggc29sdmVySUQuZW1wdHkoKSApCisJCXsKKwkJCSRhYyA9IE5FV19TVE1UMSggT1AoQ0hFQ0tfU0FUKSwgJGUuYmYgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCSRhYyA9IE5FV19TVE1UMiggT1AoQ0hFQ0tfU0FUKSwgTkVXX1NUUklORyhzb2x2ZXJJRCksICRlLmJmICk7CisJCX0KKwl9CisJOworCisKK2V4cHJlc3Npb25fZ3VhcmQKK3JldHVybnMgWyBzZXA6OkJGQ29kZSBhYyBdCitAaW5pdHsKKwlzdGQ6OnN0cmluZyBzb2x2ZXJJRDsKK30KKwk6ICdjaGVja3NhdCcKKwkgICggTFRfICAoIGlkPVN0cmluZ0xpdGVyYWwgfCBpZD1JRCApICBHVCAgICB7IHNvbHZlcklEID0gU1RSKCRpZC50ZXh0LT5jaGFycyk7IH0KKwkgIHwgJ3NvbHZlcjonICAoIGlkPVN0cmluZ0xpdGVyYWwgfCBpZD1JRCApICB7IHNvbHZlcklEID0gU1RSKCRpZC50ZXh0LT5jaGFycyk7IH0KKwkgICk/CisJICBlPWV4cHJlc3Npb24KKwl7CisJCWlmKCBzb2x2ZXJJRC5lbXB0eSgpICkKKwkJeworCQkJJGFjID0gTkVXX1NUTVQxKCBPUChDSEVDS19TQVQpLCAkZS5iZik7CisJCX0KKwkJZWxzZQorCQl7CisJCQkkYWMgPSBORVdfU1RNVDIoIE9QKENIRUNLX1NBVCksIE5FV19TVFJJTkcoc29sdmVySUQpLCAkZS5iZiApOworCQl9CisJfQorCTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNUQVRFTUVOVCBJRiBUSEVOIFsgRUxTRUlGIF0gWyBFTFNFIF0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRlbWVudF9pdGUKK3JldHVybnMgWyBzZXA6OkJGQ29kZSBhYyBdCitAaW5pdHsKKwlzZXA6OkJGQ29kZSBlbHNlaWZDb2RlOworCXNlcDo6QkZDb2RlIGNvZGU7Cit9CisJOiAnaWYnICBlPWV4cHJlc3Npb24gIGJzPWJsb2NrX3N0YXRlbWVudAorCSAgeyBjb2RlID0gJGFjID0gTkVXX1NUTVQyKE9QKElGKSwgJGUuYmYsICRicy5hYyk7IH0KKwkgICggKCAnZWxzZWlmJyB8ICdlbHNlJyAnaWYnICkgIGU9ZXhwcmVzc2lvbiAgYnM9YmxvY2tfc3RhdGVtZW50CisJICAgIHsKKwkgICAgCWNvZGUtPnNldE9wZXJhdG9yKE9QKElGRSkpOworCSAgICAJY29kZS0+YXBwZW5kKGVsc2VpZkNvZGUgPSBORVdfU1RNVDIoT1AoSUYpLCAkZS5iZiwgJGJzLmFjKSk7CisJICAgIAljb2RlID0gZWxzZWlmQ29kZTsKKwkgICAgfQorCSAgKSoKKwkgICggJ2Vsc2UnICBicz1ibG9ja19zdGF0ZW1lbnQKKwkgICAgeworCSAgICAJaWYoICRicy5hYy0+bm9uZW1wdHkoKSApCisJICAgIAl7CisJICAgIAkJY29kZS0+c2V0T3BlcmF0b3IoT1AoSUZFKSk7IGNvZGUtPmFwcGVuZCgkYnMuYWMpOworCSAgICAJfQorCSAgICB9CisJICApPworCTsKKworZXhwcmVzc2lvbl9pdGUKK3JldHVybnMgWyBzZXA6OkJGQ29kZSBhYyBdCitAaW5pdHsKKwlzZXA6OkJGQ29kZSBlbHNlaWZFeHByOworCXNlcDo6QkZDb2RlIGV4cHI7Cit9CisJOiAnaWYnICBjPWV4cHJlc3Npb24gIExDVVJMWSAgZT1leHByZXNzaW9uICBSQ1VSTFkKKwkgIHsgZXhwciA9ICRhYyA9IE5FV19TVE1UMihPUChJRiksICRjLmJmLCAkZS5iZik7IH0KKwkgICggKCAnZWxzZWlmJyB8ICdlbHNlJyAnaWYnICkgYz1leHByZXNzaW9uICBMQ1VSTFkgIGU9ZXhwcmVzc2lvbiAgUkNVUkxZCisJICAgIHsKKwkJCWV4cHItPnNldE9wZXJhdG9yKE9QKElGRSkpOworCSAgICAJZXhwci0+YXBwZW5kKGVsc2VpZkV4cHIgPSBORVdfU1RNVDIoT1AoSUYpLCAkYy5iZiwgJGUuYmYpKTsKKwkgICAgCWV4cHIgPSBlbHNlaWZFeHByOworCSAgICB9CisJICApKgorCSAgKCAnZWxzZScgIExDVVJMWSAgZT1leHByZXNzaW9uICBSQ1VSTFkKKwkgICAgeyBleHByLT5zZXRPcGVyYXRvcihPUChJRkUpKTsgZXhwci0+YXBwZW5kKCRlLmJmKTsgfQorCSAgKT8KKwk7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNUQVRFTUVOVCBXSEVSRSAgUFJPVklERUQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vc3RhdGVtZW50X3doZXJlCisvL3JldHVybnMgWyBzZXA6OkJGQ29kZSBhYyBdCisvLwk6ICd3aGVyZScgIGU9ZXhwcmVzc2lvbiAgYnM9YmxvY2tfc3RhdGVtZW50CisvLwkgIHsgJGFjID0gTkVXX1NUTVQyKE9QKFdIRVJFKSwgJGUuYmYsICRicy5hYyk7IH0KKy8vCSAgKCAncHJvdmlkZWQnICBlPWV4cHJlc3Npb24gICAgeyAkYWMtPmFwcGVuZCgkZS5iZik7IH0gKT8KKy8vCSAgKCAnZWxzZScgIGJzPWJsb2NrX3N0YXRlbWVudCAgeyAkYWMtPmFwcGVuZCgkYnMuYWMpOyB9CisvLwkgICk/CisvLwk7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNUQVRFTUVOVCBJVEVSQVRJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRlbWVudF9pdGVyYXRpb24KK3JldHVybnMgWyBzZXA6OkJGQ29kZSBhYyBdCisJOiAnZm9yJworCSAgKCBpc2E9Zm9yX2Fzc2lnbl9oZWFkZXIgIFNFTUkgIGU9ZXhwcmVzc2lvbiAgU0VNSSAgc2FpPWZvcl9hc3NpZ25faGVhZGVyCisJICAgIHsgJGFjID0gTkVXX1NUTVQzKE9QKEZPUiksICRpc2EuYWMsICRlLmJmLCAkc2FpLmFjKTsgfQorCSAgfAorCSAgICBMUEFSRU4KKwkgICAgICBpc2E9Zm9yX2Fzc2lnbl9oZWFkZXIgIFNFTUkgIGU9ZXhwcmVzc2lvbiAgU0VNSSAgc2FpPWZvcl9hc3NpZ25faGVhZGVyCisJICAgIFJQQVJFTgorCSAgICB7ICRhYyA9IE5FV19TVE1UMyhPUChGT1IpLCAkaXNhLmFjLCAkZS5iZiwgJHNhaS5hYyk7IH0KKwkgIHwKKwkgICAgbHY9bHZhbHVlICBDT0xPTiAgZT1leHByZXNzaW9uCisJICAgIHsgJGFjID0gTkVXX1NUTVQyKE9QKEZPUkVBQ0gpLCAkbHYuYmYsICRlLmJmKTsgfQorCSAgfAorCSAgICBMUEFSRU4gIGx2PWx2YWx1ZSAgQ09MT04gIGU9ZXhwcmVzc2lvbiAgUlBBUkVOCisJICAgIHsgJGFjID0gTkVXX1NUTVQyKE9QKEZPUkVBQ0gpLCAkbHYuYmYsICRlLmJmKTsgfQorCSAgKQorCSAgc2E9YmxvY2tfc3RhdGVtZW50ICB7ICRhYy0+YXBwZW5kKCRzYS5hYyk7IH0KKworCXwgJ3doaWxlJyAgZT1leHByZXNzaW9uICBicz1ibG9ja19zdGF0ZW1lbnQKKwl7ICRhYyA9IE5FV19TVE1UMihPUChXSElMRV9ETyksICRlLmJmLCAkYnMuYWMpOyB9CisKKwl8ICdkbycgIGJzPWJsb2NrX3N0YXRlbWVudCAgJ3doaWxlJyAgZT1leHByZXNzaW9uICBTRU1JCisJeyAkYWMgPSBORVdfU1RNVDIoT1AoRE9fV0hJTEUpLCAkYnMuYWMsICRlLmJmKTsgfQorCTsKKworCitmb3JfYXNzaWduX2hlYWRlcgorcmV0dXJucyBbIHNlcDo6QkZDb2RlIGFjIF0KKwkvLyBsdmFsdWUgOj0gZXhwcmVzc2lvbgorCTogbHY9bHZhbHVlCisJKCBBU1NJR04gIGU9ZXhwcmVzc2lvbgorCXsgJGFjID0gTkVXX1NUTVQyKE9QKEFTU0lHTiksICRsdi5iZiwgJGUuYmYpOyB9CisKKwkvLyArKyBsdmFsdWUKKwkvLyBsdmFsdWUgKysKKwl8IElOQ1IKKwl7ICRhYyA9IE5FV19TVE1UX0FTU0lHTl9PUChPUChQTFVTKSwgJGx2LmJmLAorCQlzZXA6OkV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9PTkUpOyB9CisKKwkvLyBsdmFsdWUgLS0KKwl8IERFQ1IKKwl7ICRhYyA9IE5FV19TVE1UX0FTU0lHTl9PUChPUChQTFVTKSwgJGx2LmJmLAorCQlzZXA6OkV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9NSU5VU19PTkUpOyB9CisJKQorCisJfCBJTkNSICBsdj1sdmFsdWUKKwl7ICRhYyA9IE5FV19TVE1UX0FTU0lHTl9PUChPUChQTFVTKSwgJGx2LmJmLAorCQkgc2VwOjpFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfT05FKTsgfQorCisJLy8gLS0gbHZhbHVlCisJfCBERUNSICBsdj1sdmFsdWUKKwl7ICRhYyA9IE5FV19TVE1UX0FTU0lHTl9PUChPUChQTFVTKSwgJGx2LmJmLAorCQlzZXA6OkV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9NSU5VU19PTkUpOyB9CisJOworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTVEFURU1FTlQgSlVNUAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGVtZW50X2p1bXAKK3JldHVybnMgWyBzZXA6OkJGQ29kZSBhYyBdCisJOiAnYnJlYWsnICAgICAgICAgeyAkYWMgPSBORVdfU1RNVChPUChCUkVBSykpOyB9CisJICAoIGU9ZXhwcmVzc2lvbiAgeyAkYWMtPmFwcGVuZCggJGUuYmYgKTsgfSApPworCSAgU0VNSQorCisJfCAnY29udGludWUnICAgICAgeyAkYWMgPSBORVdfU1RNVChPUChDT05USU5VRSkpOyB9CisJICAoIGU9ZXhwcmVzc2lvbiAgeyAkYWMtPmFwcGVuZCggJGUuYmYgKTsgfSApPworCSAgU0VNSQorCisJfCAncmV0dXJuJyAgICAgICAgeyAkYWMgPSBORVdfU1RNVChPUChSRVRVUk4pKTsgfQorCSAgKCBlPWV4cHJlc3Npb24gIHsgJGFjLT5hcHBlbmQoICRlLmJmICk7IH0KKwkgICAgKCBDT01NQSBlPWV4cHJlc3Npb24gIHsgJGFjLT5hcHBlbmQoICRlLmJmICk7IH0gKSoKKwkgICk/CisJICBTRU1JCisKKwl8ICdleGl0JyAgICAgICAgICB7ICRhYyA9IE5FV19TVE1UKE9QKEVYSVQpKTsgfQorCSAgKCBlPWV4cHJlc3Npb24gIHsgJGFjLT5hcHBlbmQoICRlLmJmICk7IH0gKT8KKwkgIFNFTUkKKwk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTVEFURU1FTlQgTEFNQkRBCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitleHByZXNzaW9uX2xhbWJkYQorcmV0dXJucyBbIHNlcDo6QkZDb2RlIGFjIF0KKwk6ICdsYW1iZGEnICB7ICRhYyA9IE5FV19DT0RFKCBPUChMQU1CREEpICk7IH0KKwkgICggaWQ9SUQgICB7ICRhYy0+YXBwZW5kKCBORVdfSUQoU1RSKCRpZC50ZXh0LT5jaGFycykpICk7IH0gKSoKKwkgICctPicgZT1leHByZXNzaW9uICB7ICRhYy0+YXBwZW5kKCAkZS5iZiApOyB9CisJOworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTVEFURU1FTlQgU1RBVFVTCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitleHByZXNzaW9uX3N0YXR1cworcmV0dXJucyBbIHNlcDo6QkZDb2RlIGFjIF0KKwk6ICdzdGF0dXMjd2FzJyAgICBvPW9wX2FjdGl2aXR5ICBpZD1xdWFsaWZpZWROYW1lSUQKKwl7ICRhYyA9IE5FV19TVE1UMihPUChTVEFUVVNfV0FTKSwgSU5DUl9CRigkby5vcCksCisJCQlzZXA6OlBhcnNlclV0aWw6OmdldHZhck1hY2hpbmUoJGlkLnMsICRpZC5uYikpOyB9CisKKwl8ICdzdGF0dXMjaXMnICAgICBvPW9wX2FjdGl2aXR5ICBpZD1xdWFsaWZpZWROYW1lSUQKKwl7ICRhYyA9IE5FV19TVE1UMihPUChTVEFUVVNfSVMpLCBJTkNSX0JGKCRvLm9wKSwKKwkJCXNlcDo6UGFyc2VyVXRpbDo6Z2V0dmFyTWFjaGluZSgkaWQucywgJGlkLm5iKSk7IH0KKworCXwgJ3N0YXR1cyNiZWluZycgIG89b3BfYWN0aXZpdHkgIGlkPXF1YWxpZmllZE5hbWVJRAorCXsgJGFjID0gTkVXX1NUTVQyKE9QKFNUQVRVU19CRUlORyksIElOQ1JfQkYoJG8ub3ApLAorCQkJc2VwOjpQYXJzZXJVdGlsOjpnZXR2YXJNYWNoaW5lKCRpZC5zLCAkaWQubmIpKTsgfQorCisJfCAnc3RhdHVzI3dpbGwnICAgbz1vcF9hY3Rpdml0eSAgaWQ9cXVhbGlmaWVkTmFtZUlECisJeyAkYWMgPSBORVdfU1RNVDIoT1AoU1RBVFVTX1dJTEwpLCBJTkNSX0JGKCRvLm9wKSwKKwkJCXNlcDo6UGFyc2VyVXRpbDo6Z2V0dmFyTWFjaGluZSgkaWQucywgJGlkLm5iKSk7IH0KKworCXwgJ2NoYW5nZWQnICAgICBsdj1sdmFsdWUKKwl7ICRhYyA9IE5FV19TVE1UMShPUChDSEFOR0VEKSwgJGx2LmJmKTsgfQorCisJfCAnY2hhbmdlZCN0bycgIGx2PWx2YWx1ZQorCXsgJGFjID0gTkVXX1NUTVQxKE9QKENIQU5HRURfVE8pLCAkbHYuYmYpOyB9CisJOworCitvcF9hY3Rpdml0eQorcmV0dXJucyBbIHNlcDo6T3BlcmF0b3IgKiBvcCBdCisJOiAnaW5pdCcgICAgIHsgJG9wID0gT1AoSU5JVCk7ICAgICAgICAgICAgfQorCXwgJ2ZpbmFsJyAgICB7ICRvcCA9IE9QKEZJTkFMKTsgICAgICAgICAgIH0KKwl8ICdkZXN0cm95JyAgeyAkb3AgPSBPUChERVNUUk9ZKTsgICAgICAgICB9CisJfCAnc3RhcnQnICAgIHsgJG9wID0gT1AoU1RBUlQpOyAgICAgICAgICAgfQorCXwgJ3Jlc3RhcnQnICB7ICRvcCA9IE9QKFJFU1RBUlQpOyAgICAgICAgIH0KKwl8ICdzdG9wJyAgICAgeyAkb3AgPSBPUChTVE9QKTsgICAgICAgICAgICB9CisJfCAnaWVuYWJsZScgIHsgJG9wID0gT1AoSUVOQUJMRV9JTlZPS0UpOyAgfQorCXwgJ2VuYWJsZScgICB7ICRvcCA9IE9QKEVOQUJMRV9JTlZPS0UpOyAgIH0KKwl8ICdpZGlzYWJsZScgeyAkb3AgPSBPUChJRElTQUJMRV9JTlZPS0UpOyB9CisJfCAnZGlzYWJsZScgIHsgJG9wID0gT1AoRElTQUJMRV9JTlZPS0UpOyAgfQorCXwgJ2lhYm9ydCcgICB7ICRvcCA9IE9QKElBQk9SVF9JTlZPS0UpOyAgIH0KKwl8ICdhYm9ydCcgICAgeyAkb3AgPSBPUChBQk9SVF9JTlZPS0UpOyAgICB9CisJfCAncnVuJyAgICAgIHsgJG9wID0gT1AoUlVOKTsgICAgICAgICAgICAgfQorCXwgJ3J0YycgICAgICB7ICRvcCA9IE9QKFJUQyk7ICAgICAgICAgICAgIH0KKwl8ICdzY2hlZHVsZScgeyAkb3AgPSBPUChTQ0hFRFVMRV9JTlZPS0UpOyB9CisJfCAnc3VzcGVuZCcgIHsgJG9wID0gT1AoU1VTUEVORCk7ICAgICAgICAgfQorCXwgJ3Jlc3VtZScgICB7ICRvcCA9IE9QKFJFU1VNRSk7ICAgICAgICAgIH0KKwl8ICd3YWl0JyAgICAgeyAkb3AgPSBPUChXQUlUKTsgICAgICAgICAgICB9CisJOworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTVEFURU1FTlQgQUNUSVZJVFkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRlbWVudF9hY3Rpdml0eQorcmV0dXJucyBbIHNlcDo6QkZDb2RlIGFjIF0KK0Bpbml0eworCXNlcDo6QkYgZmxvd1RhcmdldDsKKwlzZXA6OkJGIG1hY2hpbmU7Cit9CisJOiBvPW9wX2FjdGl2aXR5ICB7ICRhYyA9IE5FV19TVE1UKCRvLm9wKTsgfQorCSAgKCBpZD1xdWFsaWZpZWROYW1lSUQKKwkgICAgeyAkYWMtPmFwcGVuZChtYWNoaW5lID0KKwkgICAgCXNlcDo6UGFyc2VyVXRpbDo6Z2V0dmFyTWFjaGluZSgkaWQucywgJGlkLm5iKSk7IH0KKwkgICk/CisKKwkgIGFjdGl2aXR5X21hY2hpbmVfcGFyYW1fcmV0dXJuWyBtYWNoaW5lICwgYWMgXSA/CisJICBTRU1JCisJLyoKKwl8ICd3YWl0JyAgZXhwcmVzc2lvbiAgU0VNSQorCXsgJGFjID0gTkVXX1NUTVQoT1AoV0FJVCkpOyB9CisJKi8KKworCXwgJ2dvdG8nICBpZD1xdWFsaWZpZWROYW1lSUQKKwkgIHsgJGFjID0gTkVXX1NUTVQxKE9QKEdPVE8pLAorCSAgCWZsb3dUYXJnZXQgPSBzZXA6OlBhcnNlclV0aWw6OmdldHZhck1hY2hpbmUoJGlkLnMsICRpZC5uYikpOyB9CisJICAoIGZzPXN0YXRlbWVudF9pbml0X2Zsb3dbZmxvd1RhcmdldF0gIHsgJGFjLT5hcHBlbmQoJGZzLmFjKTsgfQorCSAgfCBTRU1JCisJICApCisKKwl8ICdqb2luJyAgZT1leHByZXNzaW9uICBTRU1JCisJeyAkYWMgPSBORVdfU1RNVDEoT1AoSk9JTiksICRlLmJmKTsgfQorCisJOworCisKK3N0YXRlbWVudF9pbml0X2Zsb3cgWyBjb25zdCBzZXA6OkJGICYgZmxvd1RhcmdldCBdCityZXR1cm5zIFsgc2VwOjpCRkNvZGUgYWMgXQorQGluaXR7CisJaWYoIGZsb3dUYXJnZXQuaXM8IHNlcDo6TWFjaGluZSA+KCkgKQorCXsKKwkJUFVTSF9DVFhfQ1BNKCBmbG93VGFyZ2V0LnRvX3B0cjwgc2VwOjpNYWNoaW5lID4oKSApOworCX0KK30KK0BhZnRlcnsKKwlpZiggZmxvd1RhcmdldC5pczwgc2VwOjpNYWNoaW5lID4oKSApCisJeworCQlQT1BfQ1RYOworCX0KK30KKwk6ICdmbG93JyBicz1ibG9ja19zdGF0ZW1lbnQgICB7ICRhYyA9ICRicy5hYzsgfQorCTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU1RBVEVNRU5UIFJPVVRJTkUgSU5WT0tBVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGVtZW50X2ludm9rZV9yb3V0aW5lCityZXR1cm5zIFsgc2VwOjpCRkNvZGUgYWMgXQorQGluaXR7CisJc2VwOjpSb3V0aW5lICogaW52b2tlUm91dGluZSA9IE5VTEw7Cit9CisJOiBpZD1JRAorCSAgeworCSAgCWludm9rZVJvdXRpbmUgPSBzZXA6OlJvdXRpbmU6Om5ld0ludm9rZSggX0NQUk1TXywgU1RSKCRpZC50ZXh0LT5jaGFycykpOworCisJICAJaW52b2tlUm91dGluZS0+c2V0TW9kZWwoCisJICAJCQlzZXA6OlBhcnNlclV0aWw6OmdldHZhclJvdXRpbmUoU1RSKCRpZC50ZXh0LT5jaGFycykpICk7CisJICB9CisKKwkgIGludm9rZV9yb3V0aW5lX3BhcmFtc1sgaW52b2tlUm91dGluZSBdCisgICAgICAoIGludm9rZV9yb3V0aW5lX3JldHVybnNbIGludm9rZVJvdXRpbmUgXSApPworICAgICAgU0VNSQorCisgICAgICB7ICRhYyA9IHNlcDo6UGFyc2VyVXRpbDo6aW52b2tlUm91dGluZVN0YXRlbWVudChpbnZva2VSb3V0aW5lKTsgfQorCTsKKworCitpbnZva2Vfcm91dGluZV9wYXJhbXMgWyBzZXA6OlJvdXRpbmUgKiBpbnZva2VSb3V0aW5lIF0KKwk6IExQQVJFTgorCSAgKCBscD1sYWJlbGxlZF9hcmd1bWVudAorCSAgICB7CisJICAgIAlpbnZva2VSb3V0aW5lLT5hcHBlbmRQYXJhbWV0ZXIoJGxwLmxhYmVsLCAkbHAuYXJnKTsKKwkgICAgfQorCSAgICAoIENPTU1BCisJICAgIGxwPWxhYmVsbGVkX2FyZ3VtZW50CisJICAgIHsKKwkgICAgCWludm9rZVJvdXRpbmUtPmFwcGVuZFBhcmFtZXRlcigkbHAubGFiZWwsICRscC5hcmcpOworCSAgICB9CisJICAgICkqCisJICApPworCSAgUlBBUkVOCisJOworCisKK2ludm9rZV9yb3V0aW5lX3JldHVybnMgWyBzZXA6OlJvdXRpbmUgKiBpbnZva2VSb3V0aW5lIF0KKwk6ICggJy0tPicgfCAncmV0dXJuczonICkKKwkgICggTFBBUkVOCisJICAgIGxwPWxhYmVsbGVkX2FyZ3VtZW50CisJICAgIHsKKwkgICAgCWludm9rZVJvdXRpbmUtPmFwcGVuZFJldHVybigkbHAubGFiZWwsICRscC5hcmcpOworCSAgICB9CisJICAgICggQ09NTUEKKwkgICAgICBscD1sYWJlbGxlZF9hcmd1bWVudAorCSAgICAgIHsKKwkgICAgCWludm9rZVJvdXRpbmUtPmFwcGVuZFJldHVybigkbHAubGFiZWwsICRscC5hcmcpOworCSAgICAgIH0KKwkgICAgKSoKKwkgICAgUlBBUkVOCisKKwkgIHwgbHA9bGFiZWxsZWRfYXJndW1lbnQKKwkgICAgeworCSAgICAJaW52b2tlUm91dGluZS0+YXBwZW5kUmV0dXJuKCRscC5sYWJlbCwgJGxwLmFyZyk7CisJICAgIH0KKwkgICkKKwk7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNUQVRFTUVOVCBMRU0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvKgorc3RhdGVtZW50X2xlbQorcmV0dXJucyBbIHNlcDo6QkZDb2RlIGFjIF0KKwk6ICd3aGVuJyAgeyAkYWMgPSBORVdfU1RNVChPUChMRU1fV0hFTikpOyB9CisJICAoIGU9ZXhwcmVzc2lvbiAgICAgIHsgJGFjLT5hcHBlbmQoJGUuYmYpOyB9ICApPworCSAgYnM9YmxvY2tfc3RhdGVtZW50ICB7ICRhYy0+YXBwZW5kKCRicy5hYyk7IH0KKwkgICggZT1leHByZXNzaW9uICAgICAgeyAkYWMtPmFwcGVuZCgkZS5iZik7IH0gICk/CisJICBTRU1JCisKKwl8ICdpbicgIGlkPXF1YWxpZmllZE5hbWVJRAorCSAgeyAkYWMgPSBORVdfU1RNVDEoT1AoTEVNX0lOUFVUKSwKKwkgIAlzZXA6OlBhcnNlclV0aWw6OmdldHZhclBvcnRTaWduYWwoJGlkLnMsICRpZC5uYikpOyB9CisJICAoICdwcm92aWRlZCcgIGU9ZXhwcmVzc2lvbiAgeyAkYWMtPmFwcGVuZCgkZS5iZik7IH0gICk/CisJICBTRU1JCisKKwl8IGlkPXF1YWxpZmllZE5hbWVJRCAgTEVNX1RSQU5TRkVSVCAgaWQyPXF1YWxpZmllZE5hbWVJRCAgU0VNSQorCXsgJGFjID0gTkVXX1NUTVQyKE9QKExFTV9PVVRQVVQpLAorCQlzZXA6OlBhcnNlclV0aWw6OmdldHZhclBvcnRTaWduYWwoJGlkLnMsICRpZC5uYiksCisJCXNlcDo6UGFyc2VyVXRpbDo6Z2V0dmFyUG9ydFNpZ25hbCgkaWQyLnMsICRpZDIubmIpKTsgfQorCTsKKworZXhwcmVzc2lvbl9sZW0KK3JldHVybnMgWyBzZXA6OkJGQ29kZSBhYyBdCisJOiAndG91Y2gnICBpZD1xdWFsaWZpZWROYW1lSUQKKwl7ICRhYyA9IE5FV19TVE1UMShPUChMRU1fVE9VQ0gpLAorCQlzZXA6OlBhcnNlclV0aWw6OmdldHZhclBvcnRTaWduYWwoJGlkLnMsICRpZC5uYikpOyB9CisKKwl8ICdpbicgIGlkPXF1YWxpZmllZE5hbWVJRAorCXsgJGFjID0gTkVXX1NUTVQxKE9QKExFTV9JTlBVVCksCisJCXNlcDo6UGFyc2VyVXRpbDo6Z2V0dmFyUG9ydFNpZ25hbCgkaWQucywgJGlkLm5iKSk7IH0KKwkgICggJ3Byb3ZpZGVkJyAgZT1leHByZXNzaW9uICB7ICRhYy0+YXBwZW5kKCRlLmJmKTsgfSAgKT8KKwk7CisqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU1RBVEVNRU5UIE1PQworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGVtZW50X21vYworcmV0dXJucyBbIHNlcDo6QkZDb2RlIGFjIF0KKwk6ICdzdGVwX21hcmsnICBTdHJpbmdMaXRlcmFsICBTRU1JCisJeworCQkkYWMgPSBORVdfU1RNVDEoT1AoU1RFUF9NQVJLKSwKKwkJCU5FV19TVFJJTkcoU1RSKCRTdHJpbmdMaXRlcmFsLnRleHQtPmNoYXJzKSkpOworCX0KKwk7CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBFWFBSRVNTSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworZXhwcmVzc2lvbgorcmV0dXJucyBbIHNlcDo6QkYgYmYgXQorCTogZT1jb25kaXRpb25hbEV4cHJlc3Npb24gIHsgJGJmID0gJGUuYmY7IH0KKworCSggQVNTSUdOICBlPWV4cHJlc3Npb24KKwl7ICRiZiA9IE5FV19DT0RFMihPUChBU1NJR04pLCAkYmYsICRlLmJmKTsgfQorCisJfCBBU1NJR05fTUFDUk8gIGU9ZXhwcmVzc2lvbgorCXsgJGJmID0gTkVXX0NPREUyKE9QKEFTU0lHTl9NQUNSTyksICRiZiwgJGUuYmYpOyB9CisKKwl8IEFTU0lHTl9BRlRFUiAgZT1leHByZXNzaW9uCisJeyAkYmYgPSBORVdfQ09ERTIoT1AoQVNTSUdOX0FGVEVSKSwgJGJmLCAkZS5iZik7IH0KKworCXwgUExVU19BU1NJR04gIGU9ZXhwcmVzc2lvbgorCXsgJGJmID0gTkVXX1NUTVRfQVNTSUdOX09QKE9QKFBMVVMpLCAkYmYsICRlLmJmKTsgfQorCisJfCBQTFVTX0FTU0lHTl9BRlRFUiAgZT1leHByZXNzaW9uCisJeyAkYmYgPSBORVdfU1RNVF9BU1NJR05fT1BfQUZURVIoT1AoUExVUyksICRiZiwgJGUuYmYpOyB9CisKKwl8IE1JTlVTX0FTU0lHTiAgZT1leHByZXNzaW9uCisJeyAkYmYgPSBORVdfU1RNVF9BU1NJR05fT1AoT1AoTUlOVVMpLCAkYmYsICRlLmJmKTsgfQorCisJfCBNSU5VU19BU1NJR05fQUZURVIgIGU9ZXhwcmVzc2lvbgorCXsgJGJmID0gTkVXX1NUTVRfQVNTSUdOX09QX0FGVEVSKE9QKE1JTlVTKSwgJGJmLCAkZS5iZik7IH0KKworCXwgU1RBUl9BU1NJR04gIGU9ZXhwcmVzc2lvbgorCXsgJGJmID0gTkVXX1NUTVRfQVNTSUdOX09QKE9QKE1VTFQpLCAkYmYsICRlLmJmKTsgfQorCisJfCBTVEFSX0FTU0lHTl9BRlRFUiAgZT1leHByZXNzaW9uCisJeyAkYmYgPSBORVdfU1RNVF9BU1NJR05fT1BfQUZURVIoT1AoTVVMVCksICRiZiwgJGUuYmYpOyB9CisKKwl8IERJVl9BU1NJR04gIGU9ZXhwcmVzc2lvbgorCXsgJGJmID0gTkVXX1NUTVRfQVNTSUdOX09QKE9QKERJViksICRiZiwgJGUuYmYpOyB9CisKKwl8IERJVl9BU1NJR05fQUZURVIgIGU9ZXhwcmVzc2lvbgorCXsgJGJmID0gTkVXX1NUTVRfQVNTSUdOX09QX0FGVEVSKE9QKERJViksICRiZiwgJGUuYmYpOyB9CisKKwl8IE1PRF9BU1NJR04gIGU9ZXhwcmVzc2lvbgorCXsgJGJmID0gTkVXX1NUTVRfQVNTSUdOX09QKE9QKE1PRCksICRiZiwgJGUuYmYpOyB9CisKKwl8IE1PRF9BU1NJR05fQUZURVIgIGU9ZXhwcmVzc2lvbgorCXsgJGJmID0gTkVXX1NUTVRfQVNTSUdOX09QX0FGVEVSKE9QKE1PRCksICRiZiwgJGUuYmYpOyB9CisKKwl8IExBTkRfQVNTSUdOICBlPWV4cHJlc3Npb24KKwl7ICRiZiA9IE5FV19TVE1UX0FTU0lHTl9PUChPUChBTkQpLCAkYmYsICRlLmJmKTsgfQorCisJfCBMQU5EX0FTU0lHTl9BRlRFUiAgZT1leHByZXNzaW9uCisJeyAkYmYgPSBORVdfU1RNVF9BU1NJR05fT1BfQUZURVIoT1AoQU5EKSwgJGJmLCAkZS5iZik7IH0KKworCXwgTE9SX0FTU0lHTiAgZT1leHByZXNzaW9uCisJeyAkYmYgPSBORVdfU1RNVF9BU1NJR05fT1AoT1AoT1IpLCAkYmYsICRlLmJmKTsgfQorCisJfCBMT1JfQVNTSUdOX0FGVEVSICBlPWV4cHJlc3Npb24KKwl7ICRiZiA9IE5FV19TVE1UX0FTU0lHTl9PUF9BRlRFUihPUChPUiksICRiZiwgJGUuYmYpOyB9CisKKwl8IEJBTkRfQVNTSUdOICBlPWV4cHJlc3Npb24KKwl7ICRiZiA9IE5FV19TVE1UX0FTU0lHTl9PUChPUChCQU5EKSwgJGJmLCAkZS5iZik7IH0KKworCXwgQkFORF9BU1NJR05fQUZURVIgIGU9ZXhwcmVzc2lvbgorCXsgJGJmID0gTkVXX1NUTVRfQVNTSUdOX09QX0FGVEVSKE9QKEJBTkQpLCAkYmYsICRlLmJmKTsgfQorCisJfCBCT1JfQVNTSUdOICBlPWV4cHJlc3Npb24KKwl7ICRiZiA9IE5FV19TVE1UX0FTU0lHTl9PUChPUChCT1IpLCAkYmYsICRlLmJmKTsgfQorCisJfCBCT1JfQVNTSUdOX0FGVEVSICBlPWV4cHJlc3Npb24KKwl7ICRiZiA9IE5FV19TVE1UX0FTU0lHTl9PUF9BRlRFUihPUChCT1IpLCAkYmYsICRlLmJmKTsgfQorCisJfCBCWE9SX0FTU0lHTiAgZT1leHByZXNzaW9uCisJeyAkYmYgPSBORVdfU1RNVF9BU1NJR05fT1AoT1AoQlhPUiksICRiZiwgJGUuYmYpOyB9CisKKwl8IEJYT1JfQVNTSUdOX0FGVEVSICBlPWV4cHJlc3Npb24KKwl7ICRiZiA9IE5FV19TVE1UX0FTU0lHTl9PUF9BRlRFUihPUChCWE9SKSwgJGJmLCAkZS5iZik7IH0KKworCXwgTFNISUZUX0FTU0lHTiAgZT1leHByZXNzaW9uCisJeyAkYmYgPSBORVdfU1RNVF9BU1NJR05fT1AoT1AoTFNISUZUKSwgJGJmLCAkZS5iZik7IH0KKworCXwgTFNISUZUX0FTU0lHTl9BRlRFUiAgZT1leHByZXNzaW9uCisJeyAkYmYgPSBORVdfU1RNVF9BU1NJR05fT1BfQUZURVIoT1AoTFNISUZUKSwgJGJmLCAkZS5iZik7IH0KKworCXwgUlNISUZUX0FTU0lHTiAgZT1leHByZXNzaW9uCisJeyAkYmYgPSBORVdfU1RNVF9BU1NJR05fT1AoT1AoUlNISUZUKSwgJGJmLCAkZS5iZik7IH0KKworCXwgUlNISUZUX0FTU0lHTl9BRlRFUiAgZT1leHByZXNzaW9uCisJeyAkYmYgPSBORVdfU1RNVF9BU1NJR05fT1BfQUZURVIoT1AoUlNISUZUKSwgJGJmLCAkZS5iZik7IH0KKworCXwgT1BfUFVTSCAgZT1leHByZXNzaW9uCisJeyAkYmYgPSBORVdfQ09ERTIoT1AoUFVTSCksICRiZiwgJGUuYmYpOyB9CisKKwl8IE9QX0FTU0lHTl9UT1AgIGU9ZXhwcmVzc2lvbgorCXsgJGJmID0gTkVXX0NPREUyKE9QKEFTU0lHTl9UT1ApLCAkYmYsICRlLmJmKTsgfQorCisJfCBPUF9QT1AgIGU9ZXhwcmVzc2lvbgorCXsgJGJmID0gTkVXX0NPREUyKE9QKFBPUCksICRiZiwgJGUuYmYpOyB9CisKKy8vCXwgTEVNX1RSQU5TRkVSVCAgZT1leHByZXNzaW9uCisvLwl7ICRiZiA9IE5FV19DT0RFMihPUChMRU1fT1VUUFVUKSwgJGJmLCAkZS5iZik7IH0KKwkpPworCTsKKworCitjb25kaXRpb25hbEV4cHJlc3Npb24KK3JldHVybnMgWyBzZXA6OkJGIGJmIF0KKwk6IGU9c2NoZWR1bGVFeHByZXNzaW9uICB7ICRiZiA9ICRlLmJmOyB9CisJICAoIFFVRVNUSU9OICB0aD1leHByZXNzaW9uICBDT0xPTiAgZWw9ZXhwcmVzc2lvbgorCSAgeyAkYmYgPSBORVdfQ09ERTMoT1AoSUZFKSwgJGJmLCAkdGguYmYsICRlbC5iZik7IH0KKwkgICk/CisJOworCitzY2hlZHVsZUV4cHJlc3Npb24KK3JldHVybnMgWyBzZXA6OkJGIGJmIF0KKwk6IGU9Y29uZGl0aW9uYWxPckV4cHJlc3Npb24gIHsgJGJmID0gJGUuYmY7IH0KKwkgICggKCBvcD1vcF9zZXF1ZW5jZSAgfCAgb3A9b3Bfc2NoZWR1bGluZyAgfCAgb3A9b3BfY29uY3VycmVuY3kgKQorCSAgICBlPWNvbmRpdGlvbmFsT3JFeHByZXNzaW9uICB7ICRiZiA9IE5FV19DT0RFX0ZMQVQob3AsICRiZiwgJGUuYmYpOyB9CisJICApKgorCTsKKworY29uZGl0aW9uYWxPckV4cHJlc3Npb24KK3JldHVybnMgWyBzZXA6OkJGIGJmIF0KKwk6IGU9Y29uZGl0aW9uYWxBbmRFeHByZXNzaW9uICB7ICRiZiA9ICRlLmJmOyB9CisJICAoIExPUiBlPWNvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbgorCSAgeyAkYmYgPSBORVdfQ09ERV9GTEFUKE9QKE9SKSwgJGJmLCAkZS5iZik7IH0KKwkgICkqCisJOworCitjb25kaXRpb25hbEFuZEV4cHJlc3Npb24KK3JldHVybnMgWyBzZXA6OkJGIGJmIF0KKwk6IGU9Yml0d2lzZU9yRXhwcmVzc2lvbiAgeyAkYmYgPSAkZS5iZjsgfQorCSAgKCBMQU5EIGU9Yml0d2lzZU9yRXhwcmVzc2lvbgorCSAgeyAkYmYgPSBORVdfQ09ERV9GTEFUKE9QKEFORCksICRiZiwgJGUuYmYpOyB9CisJICApKgorCTsKKworYml0d2lzZU9yRXhwcmVzc2lvbgorcmV0dXJucyBbIHNlcDo6QkYgYmYgXQorCTogZT1iaXR3aXNlWG9yRXhwcmVzc2lvbiAgeyAkYmYgPSAkZS5iZjsgfQorCSAgKCBCT1IgZT1iaXR3aXNlWG9yRXhwcmVzc2lvbgorCSAgeyAkYmYgPSBORVdfQ09ERV9GTEFUKE9QKEJPUiksICRiZiwgJGUuYmYpOyB9CisJICApKgorCTsKKworYml0d2lzZVhvckV4cHJlc3Npb24KK3JldHVybnMgWyBzZXA6OkJGIGJmIF0KKwk6IGU9Yml0d2lzZUFuZEV4cHJlc3Npb24gIHsgJGJmID0gJGUuYmY7IH0KKwkgICggQlhPUiBlPWJpdHdpc2VBbmRFeHByZXNzaW9uCisJICB7ICRiZiA9IE5FV19DT0RFX0ZMQVQoT1AoQlhPUiksICRiZiwgJGUuYmYpOyB9CisJICApKgorCTsKKworYml0d2lzZUFuZEV4cHJlc3Npb24KK3JldHVybnMgWyBzZXA6OkJGIGJmIF0KKwk6IGU9ZXF1YWxpdHlFeHByZXNzaW9uICB7ICRiZiA9ICRlLmJmOyB9CisJICAoIEJBTkQgZT1lcXVhbGl0eUV4cHJlc3Npb24KKwkgIHsgJGJmID0gTkVXX0NPREVfRkxBVChPUChCQU5EKSwgJGJmLCAkZS5iZik7IH0KKwkgICkqCisJOworCitlcXVhbGl0eUV4cHJlc3Npb24KK3JldHVybnMgWyBzZXA6OkJGIGJmIF0KK0Bpbml0eworCXNlcDo6QkZDb2RlIGVxRXhwcjsKKwlzZXA6OkJGIHJoczsKK30KKwk6IGU9cmVsYXRpb25hbEV4cHJlc3Npb24gIHsgJGJmID0gJGUuYmY7IH0KKwkgICggb3A9ZXF1YWxPcCBlPXJlbGF0aW9uYWxFeHByZXNzaW9uCisJICB7IGVxRXhwciA9IE5FV19DT0RFMihvcCwgJGJmLCAkZS5iZik7IH0KKwkgICAgKCBvcD1lcXVhbE9wIGU9cmVsYXRpb25hbEV4cHJlc3Npb24KKwkgICAgeworCSAgICAJLyppZiggZXFFeHByLmdldE9wZXJhdG9yKCkgPT0gb3AgKQorCSAgICAJeworCSAgICAJCWVxRXhwci5hcHBlbmQoICRlLmJmICk7CisJICAgIAl9CisJICAgIAllbHNlKi8gaWYoIGVxRXhwci5nZXRPcGVyYXRvcigpID09IE9QKEFORCkgKQorCSAgICAJeworCSAgICAJCWVxRXhwci5hcHBlbmQoIE5FV19DT0RFMihvcCwgcmhzLCAkZS5iZikgKTsKKwkgICAgCX0KKwkgICAgCWVsc2UKKwkgICAgCXsKKwkgICAgCQllcUV4cHIgPSBORVdfQ09ERTIoT1AoQU5EKSwgZXFFeHByLCBORVdfQ09ERTIob3AsIHJocywgJGUuYmYpKTsKKwkgICAgCX0KKworCSAgICAJcmhzID0gJGUuYmY7CisJICAgIH0KKwkgICAgKSoKKwkgIHsgJGJmID0gZXFFeHByOyB9CisJICApPworCTsKKworZXF1YWxPcAorcmV0dXJucyBbIHNlcDo6T3BlcmF0b3IgKiBvcCBdCisJOiBFUVVBTCAgIHsgb3AgPSBPUChFUSk7ICAgfQorCXwgTkVRVUFMICB7IG9wID0gT1AoTkVRKTsgIH0KKwl8IFNFUVVBTCAgeyBvcCA9IE9QKFNFUSk7ICB9CisJfCBOU0VRVUFMIHsgb3AgPSBPUChOU0VRKTsgfQorCTsKKworCityZWxhdGlvbmFsRXhwcmVzc2lvbgorcmV0dXJucyBbIHNlcDo6QkYgYmYgXQorQGluaXR7CisJc2VwOjpCRkNvZGUgcmVsRXhwcjsKKwlzZXA6OkJGIHJoczsKK30KKwk6IGU9c2hpZnRFeHByZXNzaW9uICB7ICRiZiA9ICRlLmJmOyB9CisJICAoIG9wPXJlbGF0aW9uYWxPcCBlPXNoaWZ0RXhwcmVzc2lvbgorCSAgeyByZWxFeHByID0gTkVXX0NPREUyKG9wLCAkYmYsIHJocyA9ICRlLmJmKTsgfQorCSAgICAoIG9wPXJlbGF0aW9uYWxPcCBlPXNoaWZ0RXhwcmVzc2lvbgorCSAgICB7CisJICAgIAkvKmlmKCByZWxFeHByLmdldE9wZXJhdG9yKCkgPT0gb3AgKQorCSAgICAJeworCSAgICAJCXJlbEV4cHIuYXBwZW5kKCAkZS5iZiApOworCSAgICAJfQorCSAgICAJZWxzZSovIGlmKCByZWxFeHByLmdldE9wZXJhdG9yKCkgPT0gT1AoQU5EKSApCisJICAgIAl7CisJICAgIAkJcmVsRXhwci5hcHBlbmQoIE5FV19DT0RFMihvcCwgcmhzLCAkZS5iZikgKTsKKwkgICAgCX0KKwkgICAgCWVsc2UKKwkgICAgCXsKKwkgICAgCQlyZWxFeHByID0gTkVXX0NPREUyKE9QKEFORCksIHJlbEV4cHIsIE5FV19DT0RFMihvcCwgcmhzLCAkZS5iZikpOworCSAgICAJfQorCisJICAgIAlyaHMgPSAkZS5iZjsKKwkgICAgfQorCSAgICApKgorCSAgeyAkYmYgPSByZWxFeHByOyB9CisJICApPworCTsKKworcmVsYXRpb25hbE9wCityZXR1cm5zIFsgc2VwOjpPcGVyYXRvciAqIG9wIF0KKwk6IExURSAgeyAkb3AgPSBPUChMVEUpOyB9CisJfCBHVEUgIHsgJG9wID0gT1AoR1RFKTsgfQorCXwgTFRfICB7ICRvcCA9IE9QKExUKTsgfQorCXwgR1QgICB7ICRvcCA9IE9QKEdUKTsgfQorCisJfCAnaW4nICAgICAgIHsgJG9wID0gT1AoSU4pOyB9CisvLwl8ICdub3RpbicgICAgeyAkb3AgPSBPUChOT1RJTik7IH0KKy8vCXwgJ2NvbnRhaW5zJyB7ICRvcCA9IE9QKENPTlRBSU5TKTsgfQorLy8KKy8vCXwgJ3N1YnNldCcgICB7ICRvcCA9IE9QKFNVQlNFVCk7IH0KKy8vCisvLwl8ICdzdGFydHNfd2l0aCcgeyAkb3AgPSBPUChTVEFSVFNfV0lUSCk7IH0KKy8vCXwgJ2VuZHNfd2l0aCcgICB7ICRvcCA9IE9QKEVORFNfV0lUSCk7IH0KKwk7CisKK3NoaWZ0RXhwcmVzc2lvbgorcmV0dXJucyBbIHNlcDo6QkYgYmYgXQorCTogZT1hZGRpdGl2ZUV4cHJlc3Npb24gIHsgJGJmID0gJGUuYmY7IH0KKwkgICggb3A9c2hpZnRPcCBlPWFkZGl0aXZlRXhwcmVzc2lvbgorCSAgeyAkYmYgPSBORVdfQ09ERTIob3AsICRiZiwgJGUuYmYpOyB9CisJICApKgorCTsKKworCitzaGlmdE9wCityZXR1cm5zIFsgc2VwOjpPcGVyYXRvciAqIG9wIF0KKwk6IExTSElGVCAgeyAkb3AgPSBPUChMU0hJRlQpOyB9CisJfCBSU0hJRlQgIHsgJG9wID0gT1AoUlNISUZUKTsgfQorCTsKKworCithZGRpdGl2ZUV4cHJlc3Npb24KK3JldHVybnMgWyBzZXA6OkJGIGJmIF0KK0Bpbml0eworCXNlcDo6T3BlcmF0b3IgKiBvcCA9IE5VTEw7Cit9CisJOiBlPW11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiAgeyAkYmYgPSAkZS5iZjsgfQorCSAgKCAoIFBMVVMgIHsgb3AgPSBPUChQTFVTKTsgIH0KKwkgICAgfCBNSU5VUyB7IG9wID0gT1AoTUlOVVMpOyB9CisJICAgICkKKwkgICAgZT1tdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24KKwkgICAgeyAkYmYgPSBORVdfQ09ERV9GTEFUKG9wLCAkYmYsICRlLmJmKTsgfQorCSAgKSoKKwk7CisKK211bHRpcGxpY2F0aXZlRXhwcmVzc2lvbgorcmV0dXJucyBbIHNlcDo6QkYgYmYgXQorQGluaXR7CisJc2VwOjpPcGVyYXRvciAqIG9wID0gTlVMTDsKK30KKwk6IGU9dW5hcnlFeHByZXNzaW9uICB7ICRiZiA9ICRlLmJmOyB9CisJICAoICggU1RBUiB7IG9wID0gT1AoTVVMVCk7IH0KKwkgICAgfCBESVYgIHsgb3AgPSBPUChESVYpOyB9CisJICAgIHwgTU9EICB7IG9wID0gT1AoTU9EKTsgfQorCSAgICApCisJICAgIGU9dW5hcnlFeHByZXNzaW9uCisJICAgIHsgJGJmID0gTkVXX0NPREVfRkxBVChvcCwgJGJmLCAkZS5iZik7IH0KKwkgICkqCisJOworCisvKioKKyAqIE5PVEU6IGZvciAnKycgYW5kICctJywgaWYgdGhlIG5leHQgdG9rZW4gaXMgaW50IG9yIGxvbmcgaW50ZXJhbCwgdGhlbiBpdCdzIG5vdCBhIHVuYXJ5IGV4cHJlc3Npb24uCisgKiAgICAgICBpdCdzIGEgbGl0ZXJhbCB3aXRoIHNpZ25lZCB2YWx1ZS4gSU5UTFRFUkFMIEFORCBMT05HIExJVEVSQUwgYXJlIGFkZGVkIGhlcmUgZm9yIHRoaXMuCisgKi8KK3VuYXJ5RXhwcmVzc2lvbgorcmV0dXJucyBbIHNlcDo6QkYgYmYgXQorCTogUExVUyAgZT11bmFyeUV4cHJlc3Npb24KKwl7ICRiZiA9ICRlLmJmOyB9CisKKwl8IE1JTlVTIGU9dW5hcnlFeHByZXNzaW9uCisJeyAkYmYgPSBuZXdfdW1pbnVzX2V4cHIoJGUuYmYpOyB9CisKKwl8IElOQ1IgIGU9dW5hcnlFeHByZXNzaW9uCisJeyAkYmYgPSBORVdfU1RNVF9BU1NJR05fT1AoT1AoUExVUyksCisJCSRlLmJmLCBzZXA6OkV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9PTkUpOyB9CisJfCBERUNSICBlPXVuYXJ5RXhwcmVzc2lvbgorCXsgJGJmID0gTkVXX1NUTVRfQVNTSUdOX09QKE9QKFBMVVMpLCAkZS5iZiwKKwkJc2VwOjpFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfTUlOVVNfT05FKTsgfQorCisJfCBMTk9UIGU9dW5hcnlFeHByZXNzaW9uCisJeyAkYmYgPSBuZXdfbm90X2V4cHIoJGUuYmYpOyB9CisKKwl8IEJOT1QgZT11bmFyeUV4cHJlc3Npb24KKwl7ICRiZiA9IE5FV19DT0RFMShPUChCTk9UKSwgJGUuYmYpOyB9CisKKwl8IE9QX1BPUCAgIGU9dW5hcnlFeHByZXNzaW9uCisJeyAkYmYgPSBORVdfQ09ERTEoT1AoUE9QKSwgJGUuYmYpOyB9CisKKwl8IE9QX1RPUCAgIGU9dW5hcnlFeHByZXNzaW9uCisJeyAkYmYgPSBORVdfQ09ERTEoT1AoVE9QKSwgJGUuYmYpOyB9CisKKy8vCXwgJ25ld2ZyZXNoJyAgZT11bmFyeUV4cHJlc3Npb24KKy8vCXsgJGJmID0gTkVXX0NPREUxKE9QKEFTU0lHTl9ORVdGUkVTSCksICRlLmJmKTsgfQorCisKKwl8IGM9cHJlZml4X2V4cHJlc3Npb24gICAgICAgICAgIHsgJGJmID0gJGMuYWM7IH0KKworCXwgYz1leHByZXNzaW9uX2ludm9rZSAgICAgICAgICAgeyAkYmYgPSAkYy5hYzsgfQorCisJfCBjPWV4cHJlc3Npb25fYWN0aXZpdHlfbmV3ICAgICB7ICRiZiA9ICRjLmFjOyB9CisKKy8vCXwgYz1leHByZXNzaW9uX2J1ZmZlciAgICAgICAgICAgeyAkYmYgPSAkYy5hYzsgfQorCXwgYz1leHByZXNzaW9uX2NvbSAgICAgICAgICAgICAgeyAkYmYgPSAkYy5hYzsgfQorCXwgYz1leHByZXNzaW9uX2d1YXJkICAgICAgICAgICAgeyAkYmYgPSAkYy5hYzsgfQorCXwgYz1leHByZXNzaW9uX2l0ZSAgICAgICAgICAgICAgeyAkYmYgPSAkYy5hYzsgfQorCXwgYz1leHByZXNzaW9uX2xhbWJkYSAgICAgICAgICAgeyAkYmYgPSAkYy5hYzsgfQorLy8JfCBjPWV4cHJlc3Npb25fc3RhdHVzICAgICAgICAgICB7ICRiZiA9ICRjLmFjOyB9CisvLwl8IGM9ZXhwcmVzc2lvbl90aW1lICAgICAgICAgICAgIHsgJGJmID0gJGMuYWM7IH0KKworLy8JfCBjPWV4cHJlc3Npb25fbGVtICAgICAgICAgICAgICB7ICRiZiA9ICRjLmFjOyB9CisKKwl8IGU9Y3RvckV4cHJlc3Npb24gICAgICAgICAgICAgIHsgJGJmID0gJGUuYmY7IH0KKworCXwgZT1wcmltYXJ5ICAgICAgICAgICAgICAgICAgICAgeyAkYmYgPSAkZS5iZjsgfQorCSAgKCBJTkNSCisJCXsgJGJmID0gTkVXX1NUTVRfQVNTSUdOX09QX0FGVEVSKE9QKFBMVVMpLCAkZS5iZiwKKwkJCXNlcDo6RXhwcmVzc2lvbkNvbnN0YW50OjpJTlRFR0VSX09ORSk7IH0KKwkgIHwgREVDUgorCQl7ICRiZiA9IE5FV19TVE1UX0FTU0lHTl9PUF9BRlRFUihPUChQTFVTKSwgJGUuYmYsCisJCQlzZXA6OkV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9NSU5VU19PTkUpOyB9CisJICApPworCisJfCBsPWxpdGVyYWwgICAgICAgICAgICAgICAgICAgICB7ICRiZiA9ICRsLmJmOyB9CisKKwl8IHE9cXVvdGVfZXhwcmVzc2lvbiAgICAgICAgICAgIHsgJGJmID0gJHEuYWM7IH0KKworCXwgcT1tZXRhX2V2YWxfZXhwcmVzc2lvbiAgICAgICAgeyAkYmYgPSAkcS5hYzsgfQorCisJfCBMUEFSRU4gIGU9ZXhwcmVzc2lvbiAgUlBBUkVOICB7ICRiZiA9ICRlLmJmOyB9CisKKwl8IGU9Y29sbGVjdGlvbl9vZl9leHByZXNzaW9uICAgIHsgJGJmID0gJGUuYmY7IH0KKwk7CisKKworY3RvckV4cHJlc3Npb24KK3JldHVybnMgWyBzZXA6OkJGQ29kZSBjdG9yIF0KKwk6ICdjdG9yJyBMVF8gIHR2PXR5cGVfdmFyICBHVCAgTFBBUkVOICBlPWV4cHJlc3Npb24gIFJQQVJFTgorCXsgJGN0b3IgPSBORVdfQ09ERTIoT1AoQ1RPUiksICR0di50eXBlLCAkZS5iZik7IH0KKwk7CisKKworLyoKK3F1b3RlX2V4cHJlc3Npb24KK3JldHVybnMgWyBzZXA6OkJGQ29kZSBhYyBdCitAaW5pdHsKKwlzZXA6Ok9wZXJhdG9yICogb3AgPSBPUChTRVFVRU5DRSk7Cit9CisJOiBQRVJDRU5UX0xDVVJMWSAgKCBvPW9wX2Jsb2NrIHsgb3AgPSAkby5vcDsgfSApID8gIHsgJGFjID0gTkVXX1NUTVQob3ApOyB9CisJICAgICggcz1zdGF0ZW1lbnQgICB7ICRhYy0+YXBwZW5kKCRzLmFjKTsgfSAgKSoKKwkgICAgKCBlPWV4cHJlc3Npb24gIHsgJGFjLT5hcHBlbmQoJGUuYmYpOyB9ICApCisJICBSQ1VSTFlfUEVSQ0VOVAorCSB7ICRhYyA9IE5FV19TVE1UMShPUChRVU9URSksICRhYyk7IH0KKwk7CisqLworCisKK3F1b3RlX2V4cHJlc3Npb24KK3JldHVybnMgWyBzZXA6OkJGQ29kZSBhYyBdCisJOiBQRVJDRU5UX0xDVVJMWSAgZT1leHByZXNzaW9uICBSQ1VSTFlfUEVSQ0VOVAorCSB7ICRhYyA9IE5FV19TVE1UMShPUChRVU9URSksICRlLmJmKTsgfQorCTsKKworbWV0YV9ldmFsX2V4cHJlc3Npb24KK3JldHVybnMgWyBzZXA6OkJGQ29kZSBhYyBdCisJOiBMQlJBQ0tFVF9CQVIgIGU9ZXhwcmVzc2lvbiAgQkFSX1JCUkFDS0VUCisJIHsgJGFjID0gTkVXX1NUTVQxKE9QKE1FVEFfRVZBTCksICRlLmJmKTsgfQorCTsKKworCisKKy8qKgorICogaGF2ZSB0byB1c2Ugc2NvcGUgaGVyZSwgcGFyYW1ldGVyIHBhc3NpbmcgaXNuJ3Qgd2VsbCBzdXBwb3J0ZWQgaW4gYW50bHIuCisgKgorcHJpbWFyeQorcmV0dXJucyBbIHNlcDo6QkYgYmYgXQorQGluaXR7CisJc2VwOjpVbmlGb3JtSWRlbnRpZmllciAqIHVmaTsKKwlzZXA6OkJGIGJmVWZpOy8vIGZvciBhdXRvbWF0aWMgZGVzdHJ1Y3Rpb24gb2YgPDwgVUZJID4+IGlmIG5lZWQKKworCXNlcDo6YXZtX3NpemVfdCBjb3VudElEID0gMTsKKwlib29sIGlzbm90RVhQUiAgPSB0cnVlOworCWJvb2wgaGFzbnRQQVJBTSA9IHRydWU7CisKKwlTQVZFX1JVTEVfQkVHSU5fTE9DQVRJT047Cit9CisJOiAvLyggKCBpZD1JRCB7IHVmaS0+c2V0TG9jYXRvcihTVFIoJGlkLnRleHQtPmNoYXJzKSk7IH0gKT8KKwkgIC8vICBDT0xPTngyIHsgdWZpLT5zZXRBYnNvbHV0ZSgpOyB9ICk/CisJICBpZD1JRAorCSAgeworCSAgCXVmaSA9IG5ldyBzZXA6OlVuaUZvcm1JZGVudGlmaWVyKGZhbHNlKTsKKwkgIAliZlVmaSA9IHVmaTsKKworCQlpZiggKCRiZiA9IHNlcDo6UGFyc2VyVXRpbDo6Z2V0T2JqZWN0QnlOYW1lSUQoU1RSKCRpZC50ZXh0LT5jaGFycykpKS52YWxpZCgpICkKKwkJeworCQkgIAl1ZmktPmFwcGVuZEZpZWxkKCRiZik7CisJCX0KKwkJZWxzZQorCQl7CisJCSAgCXVmaS0+YXBwZW5kRmllbGQoU1RSKCRpZC50ZXh0LT5jaGFycykpOworCQl9CisKKwkJJGJmID0gYmZVZmk7CisJICB9CisKKwkgICggKCBET1QgaWQ9SUQKKwkgICAgeyB1ZmktPmFwcGVuZEZpZWxkKFNUUigkaWQudGV4dC0+Y2hhcnMpKTsgICsrY291bnRJRDsgfSApCisKKwkgIHwgKCBMQlJBQ0tFVCAgZT1leHByZXNzaW9uICBSQlJBQ0tFVAorCSAgICB7IHVmaS0+YXBwZW5kSW5kZXgoJGUuYmYpOyAgaXNub3RFWFBSID0gZmFsc2U7IH0KKwkgICAgKQorCisJICB8IExQQVJFTiAgICAgICAgICAgIHsgdWZpLT5sYXN0KCkuYWRkU2NoZW1lKHNlcDo6VUZJX1NDSEVNRV9JTlZPS0FCTEUpOyB9CisJICAgICggZT1leHByZXNzaW9uICAgIHsgdWZpLT5hcHBlbmRGaWVsZFBhcmFtZXRlcigkZS5iZik7ICBoYXNudFBBUkFNID0gZmFsc2U7IH0KKwkgICAgICAoIENPTU1BCisJICAgICAgICBlPWV4cHJlc3Npb24gIHsgdWZpLT5hcHBlbmRGaWVsZFBhcmFtZXRlcigkZS5iZik7ICBoYXNudFBBUkFNID0gZmFsc2U7IH0KKwkgICAgICApKgorCSAgICApPworCSAgICBSUEFSRU4KKwkgICkqCisJeworCQlpZiggY291bnRJRCA9PSAxICkKKwkJeworCQkJJGJmID0gdWZpLT5maXJzdCgpOworCQl9CisJCWVsc2UgaWYoIGlzbm90RVhQUiAmJiBoYXNudFBBUkFNICkKKwkJeworCQkJaWYoICgkYmYgPSBzZXA6OlBhcnNlclV0aWw6OmdldHZhcigKKwkJCQkJdWZpLT5zdHIoKSwgY291bnRJRCkpLmludmFsaWQoKSApCisJCQl7CisJCQkJJGJmID0gYmZVZmk7CisJCQkJU0VUX1JVTEVfTE9DQVRJT04odWZpKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmKCB1ZmktPnNpbmdsZXRvbigpICkKKwkJeworCQkJJGJmID0gdWZpLT5maXJzdCgpOworCQl9CisJfQorCTsKKyovCisKKworcHJpbWFyeQorcmV0dXJucyBbIHNlcDo6QkYgYmYgXQorCTogaWQ9SUQKKwkgICggKCBMUEFSRU4gICAgICAgICApID0+IHA9cHJpbWFyeV9pbnZva2VbIFNUUigkaWQudGV4dC0+Y2hhcnMpIF0KKwkgICAgeyAkYmYgPSAkcC5iZjsgfQorCisJICB8ICggRE9UIHwgTEJSQUNLRVQgKSA9PiBwPXByaW1hcnlfdWZpZFsgU1RSKCRpZC50ZXh0LT5jaGFycykgXQorCSAgICB7ICRiZiA9ICRwLmJmOyB9CisJICB8ICggQ09MT054MiAgICAgICAgKSA9PiBwPXByaW1hcnlfdWZpWyBTVFIoJGlkLnRleHQtPmNoYXJzKSBdCisJICAgIHsgJGJmID0gJHAuYmY7IH0KKwkgICk/CisJICB7CisJCWlmKCAkYmYuaW52YWxpZCgpICkKKwkJeworCQkJaWYoICgkYmYgPSBzZXA6OlBhcnNlclV0aWw6OmdldE9iamVjdEJ5TmFtZUlEKAorCQkJCQlTVFIoJGlkLnRleHQtPmNoYXJzKSkpLmludmFsaWQoKSApCisJCQl7CisJCQkgIAkkYmYgPSBORVdfSUQoIFNUUigkaWQudGV4dC0+Y2hhcnMpKTsKKwkJCX0KKwkJfQorCSAgfQorCisJfCBwPXByaW1hcnlfdWZpWyAiIiBdICB7ICRiZiA9ICRwLmJmOyB9CisJOworCisKK3ByaW1hcnlfdWZpZCBbIGNvbnN0IHN0ZDo6c3RyaW5nICYgbWFpbklkIF0KK3JldHVybnMgWyBzZXA6OkJGIGJmIF0KK0Bpbml0eworCXNlcDo6VW5pRm9ybUlkZW50aWZpZXIgKiB1ZmkgPSBuZXcgc2VwOjpVbmlGb3JtSWRlbnRpZmllcihmYWxzZSk7CisJc2VwOjpCRiBiZlVmaSggdWZpICk7Ly8gZm9yIGF1dG9tYXRpYyBkZXN0cnVjdGlvbiBvZiA8PCBVRkkgPj4gaWYgbmVlZAorCisJaWYoICgkYmYgPSBzZXA6OlBhcnNlclV0aWw6OmdldE9iamVjdEJ5TmFtZUlEKG1haW5JZCkpLnZhbGlkKCkgKQorCXsKKwkgIAl1ZmktPmFwcGVuZEZpZWxkKCAkYmYgKTsKKwl9CisJZWxzZQorCXsKKwkgIAl1ZmktPmFwcGVuZEZpZWxkKCBtYWluSWQgKTsKKwl9CisKKwkkYmYgPSBiZlVmaTsKKworCXNlcDo6YXZtX3NpemVfdCBjb3VudElEID0gMTsKKwlib29sIGlzbm90RVhQUiAgPSB0cnVlOworCisJU0FWRV9SVUxFX0JFR0lOX0xPQ0FUSU9OOworfQorCTogKCAoIERPVCBpZD1JRAorCSAgICB7IHVmaS0+YXBwZW5kRmllbGQoIFNUUigkaWQudGV4dC0+Y2hhcnMpICk7ICArK2NvdW50SUQ7IH0gKQorCisJICB8ICggTEJSQUNLRVQgIGU9ZXhwcmVzc2lvbiAgUkJSQUNLRVQKKwkgICAgeyB1ZmktPmFwcGVuZEluZGV4KCAkZS5iZiApOyAgaXNub3RFWFBSID0gZmFsc2U7IH0KKwkgICAgKQorCSAgKSsKKwl7CisJCWlmKCBpc25vdEVYUFIgKQorCQl7CisJCQlpZiggKCRiZiA9IHNlcDo6UGFyc2VyVXRpbDo6Z2V0dmFyKHVmaS0+c3RyKCksIGNvdW50SUQpKS5pbnZhbGlkKCkgKQorCQkJeworCQkJCSRiZiA9IGJmVWZpOworCQkJCVNFVF9SVUxFX0xPQ0FUSU9OKCB1ZmkgKTsKKwkJCX0KKwkJfQorCX0KKwk7CisKKworCitwcmltYXJ5X3VmaSBbIGNvbnN0IHN0ZDo6c3RyaW5nICYgbG9jYXRvcklkIF0KK3JldHVybnMgWyBzZXA6OkJGIGJmIF0KK0Bpbml0eworCXNlcDo6VW5pRm9ybUlkZW50aWZpZXIgKiB1ZmkgPQorCQkJbmV3IHNlcDo6VW5pRm9ybUlkZW50aWZpZXIobm90IGxvY2F0b3JJZC5lbXB0eSgpKTsKKwlzZXA6OkJGIGJmVWZpKCB1ZmkgKTsvLyBmb3IgYXV0b21hdGljIGRlc3RydWN0aW9uIG9mIDw8IFVGSSA+PiBpZiBuZWVkCisKKwlpZiggbm90IGxvY2F0b3JJZC5lbXB0eSgpICkKKwl7CisJCXVmaS0+c2V0TG9jYXRvciggbG9jYXRvcklkICk7CisJfQorCisJJGJmID0gYmZVZmk7CisKKwlzZXA6OmF2bV9zaXplX3QgY291bnRJRCA9IDE7CisJYm9vbCBpc25vdEVYUFIgID0gdHJ1ZTsKKworCVNBVkVfUlVMRV9CRUdJTl9MT0NBVElPTjsKK30KKwk6IENPTE9OeDIgaWQ9SUQKKwkgIHsKKwkJaWYoICgkYmYgPSBzZXA6OlBhcnNlclV0aWw6OmdldE9iamVjdEJ5TmFtZUlEKFNUUigkaWQudGV4dC0+Y2hhcnMpKSkudmFsaWQoKSApCisJCXsKKwkJICAJdWZpLT5hcHBlbmRGaWVsZCggJGJmICk7CisJCX0KKwkJZWxzZQorCQl7CisJCSAgCXVmaS0+YXBwZW5kRmllbGQoIFNUUigkaWQudGV4dC0+Y2hhcnMpICk7CisJCX0KKwkgIH0KKworCSAgKCAoIERPVCBpZD1JRAorCSAgICB7IHVmaS0+YXBwZW5kRmllbGQoIFNUUigkaWQudGV4dC0+Y2hhcnMpICk7ICArK2NvdW50SUQ7IH0gKQorCisJICB8ICggTEJSQUNLRVQgIGU9ZXhwcmVzc2lvbiAgUkJSQUNLRVQKKwkgICAgeyB1ZmktPmFwcGVuZEluZGV4KCAkZS5iZiApOyAgaXNub3RFWFBSID0gZmFsc2U7IH0KKwkgICAgKQorCSAgKSsKKwl7CisJCWlmKCBpc25vdEVYUFIgKQorCQl7CisJCQlpZiggKCRiZiA9IHNlcDo6UGFyc2VyVXRpbDo6Z2V0dmFyKHVmaS0+c3RyKCksIGNvdW50SUQpKS5pbnZhbGlkKCkgKQorCQkJeworCQkJCSRiZiA9IGJmVWZpOworCQkJCVNFVF9SVUxFX0xPQ0FUSU9OKCB1ZmkgKTsKKwkJCX0KKwkJfQorCX0KKwk7CisKKworcHJpbWFyeV9pbnZva2UgWyBjb25zdCBzdGQ6OnN0cmluZyAmIG1haW5JZCBdCityZXR1cm5zIFsgc2VwOjpCRiBiZiBdCitAaW5pdHsKKwlzZXA6OlJvdXRpbmUgKiBpbnZva2VSb3V0aW5lID0gc2VwOjpSb3V0aW5lOjpuZXdJbnZva2UoIF9DUFJNU18sIG1haW5JZCk7CisKKwlpbnZva2VSb3V0aW5lLT5zZXRNb2RlbCggc2VwOjpQYXJzZXJVdGlsOjpnZXR2YXJSb3V0aW5lKG1haW5JZCkgKTsKKworCVNBVkVfUlVMRV9CRUdJTl9MT0NBVElPTjsKK30KK0BhZnRlcgoreworCVNFVF9SVUxFX0xPQ0FUSU9OKCBpbnZva2VSb3V0aW5lICk7Cit9CisJOiBMUEFSRU4KKwkgICggbHA9bGFiZWxsZWRfYXJndW1lbnQKKwkgICAgeworCSAgICAJaW52b2tlUm91dGluZS0+YXBwZW5kUGFyYW1ldGVyKCRscC5sYWJlbCwgJGxwLmFyZyk7CisJICAgIH0KKwkgICAgKCBDT01NQQorCSAgICBscD1sYWJlbGxlZF9hcmd1bWVudAorCSAgICB7CisJICAgIAlpbnZva2VSb3V0aW5lLT5hcHBlbmRQYXJhbWV0ZXIoJGxwLmxhYmVsLCAkbHAuYXJnKTsKKwkgICAgfQorCSAgICApKgorCSAgKT8KKwkgIFJQQVJFTgorCisJICB7ICRiZiA9IHNlcDo6UGFyc2VyVXRpbDo6aW52b2tlUm91dGluZUV4cHJlc3Npb24oaW52b2tlUm91dGluZSk7IH0KKwk7CisKKworbGl0ZXJhbAorcmV0dXJucyBbIHNlcDo6QkYgYmYgXQorCTogSW50ZWdlckxpdGVyYWwgIHsgJGJmID0gTkVXX0lOVEVHRVIoU1RSKCRJbnRlZ2VyTGl0ZXJhbC50ZXh0LT5jaGFycykpOyAgIH0KKwl8IFJhdGlvbmFsTGl0ZXJhbCB7ICRiZiA9IE5FV19SQVRJT05BTChTVFIoJFJhdGlvbmFsTGl0ZXJhbC50ZXh0LT5jaGFycykpOyB9CisJfCBGbG9hdExpdGVyYWwgICAgeyAkYmYgPSBORVdfRkxPQVQoU1RSKCRGbG9hdExpdGVyYWwudGV4dC0+Y2hhcnMpKTsgICAgICAgfQorCisJfCBDaGFyTGl0ZXJhbCAgICAgeyAkYmYgPSBORVdfQ0hBUihTVFIoJENoYXJMaXRlcmFsLnRleHQtPmNoYXJzKSk7ICAgICB9CisJfCBTdHJpbmdMaXRlcmFsICAgeyAkYmYgPSBORVdfU1RSSU5HKFNUUigkU3RyaW5nTGl0ZXJhbC50ZXh0LT5jaGFycykpOyB9CisKKwl8ICd0cnVlJyAgIHsgJGJmID0gTkVXX0JPT0wodHJ1ZSk7ICB9CisJfCAnZmFsc2UnICB7ICRiZiA9IE5FV19CT09MKGZhbHNlKTsgfQorCisJfCAnc2VsZicgICB7ICRiZiA9IHNlcDo6RXhlY3V0YWJsZUxpYjo6TUFDSElORV9TRUxGOyAgICAgICAgfQorCXwgJ3BhcmVudCcgeyAkYmYgPSBzZXA6OkV4ZWN1dGFibGVMaWI6Ok1BQ0hJTkVfUEFSRU5UOyAgICAgIH0KKwl8ICdlbnYnICAgIHsgJGJmID0gc2VwOjpFeGVjdXRhYmxlTGliOjpNQUNISU5FX0VOVklST05NRU5UOyB9CisKKwl8ICckdGhpcycgICB7ICRiZiA9IHNlcDo6RXhlY3V0YWJsZUxpYjo6TUFDSElORV9TRUxGOyAgICAgICAgfQorCXwgJyRzZWxmJyAgIHsgJGJmID0gc2VwOjpFeGVjdXRhYmxlTGliOjpNQUNISU5FX1NFTEY7ICAgICAgICB9CisJfCAnJHBhcmVudCcgeyAkYmYgPSBzZXA6OkV4ZWN1dGFibGVMaWI6Ok1BQ0hJTkVfUEFSRU5UOyAgICAgIH0KKwl8ICckc3VwZXInICB7ICRiZiA9IHNlcDo6RXhlY3V0YWJsZUxpYjo6TUFDSElORV9QQVJFTlQ7ICAgICAgfQorCXwgJyRlbnYnICAgIHsgJGJmID0gc2VwOjpFeGVjdXRhYmxlTGliOjpNQUNISU5FX0VOVklST05NRU5UOyB9CisKKwl8ICdudWxsPCcKKwkgICAoICdtYWNoaW5lJyAgeyAkYmYgPSBzZXA6OkV4ZWN1dGFibGVMaWI6Ok1BQ0hJTkVfTlVMTDsgfQorCSAgIHwgJ2NoYW5uZWwnICB7ICRiZiA9IHNlcDo6RXhlY3V0YWJsZUxpYjo6Q0hBTk5FTF9OSUw7ICAgIH0KKwkgICB8ICdwb3J0JyAgICAgeyAkYmYgPSBzZXA6OkV4ZWN1dGFibGVMaWI6OlBPUlRfTklMOyAgICB9CisJICAgfCAnc2lnbmFsJyAgIHsgJGJmID0gc2VwOjpFeGVjdXRhYmxlTGliOjpQT1JUX05JTDsgICAgfQorCSAgIHwgJ21lc3NhZ2UnICB7ICRiZiA9IHNlcDo6RXhlY3V0YWJsZUxpYjo6UE9SVF9OSUw7ICAgIH0KKwkgICB8ICdidWZmZXInICAgeyAkYmYgPSBzZXA6OkV4ZWN1dGFibGVMaWI6OkJVRkZFUl9OSUw7ICAgIH0KKwkgICApIEdUCisJfCAnbnVsbCcgICAgICAgeyAkYmYgPSBzZXA6OkJGOjpSRUZfTlVMTDsgfQorCTsKKworCisKK2NvbGxlY3Rpb25fb2ZfZXhwcmVzc2lvbgorcmV0dXJucyBbIHNlcDo6QkYgYmYgXQorQGluaXR7CisJc2VwOjpCRlZlY3RvciB2YWx1ZXM7Cit9CisJOiBMQ1VSTFkKKwkgICAgZT1leHByZXNzaW9uICAgICAgICAgIHsgdmFsdWVzLmFwcGVuZCgkZS5iZik7IH0KKwkgICAgKCBDT01NQSBlPWV4cHJlc3Npb24gIHsgdmFsdWVzLmFwcGVuZCgkZS5iZik7IH0gKSoKKwkgIFJDVVJMWQorCSAgeyAgJGJmID0gc2VwOjpCdWlsdGluQXJyYXk6OmNyZWF0ZSh2YWx1ZXMpOyB9CisKKwl8IExCUkFDS0VUCisJICAgIGU9ZXhwcmVzc2lvbiAgICAgICAgICB7IHZhbHVlcy5hcHBlbmQoJGUuYmYpOyB9CisJICAgICggQ09NTUEgZT1leHByZXNzaW9uICB7IHZhbHVlcy5hcHBlbmQoJGUuYmYpOyB9ICkqCisJICBSQlJBQ0tFVAorCSAgeyAkYmYgPSBzZXA6OkJ1aWx0aW5BcnJheTo6Y3JlYXRlKHZhbHVlcyk7IH0KKwk7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vIEtFWVdPUkQgWExJQSBvciBYRlNQCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLyoKK2t3X3N0YXJ0ICAgICA6IHsgSVNfS0VZV09SRCggInN0YXJ0IiAgICApIH0/ICBJRDsKKwora3dfaW4gICAgICAgIDogeyBJU19LRVlXT1JEKCAiaW4iICAgICAgICkgfT8gIElEOworCitrd19pbnB1dCAgICAgOiB7IElTX0tFWVdPUkQoICJpbnB1dCIgICAgKSB9PyAgSUQ7Citrd19vdXRwdXQgICAgOiB7IElTX0tFWVdPUkQoICJvdXRwdXQiICAgKSB9PyAgSUQ7CisKK2t3X3dhaXQgICAgICA6IHsgSVNfS0VZV09SRCggIndhaXQiICAgICApIH0/ICBJRDsKKyovCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTEVYRVIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCitPUF9BVE9NSUNfU0VRVUVOQ0UgOiAnfMKnfCcgIDsKKworT1BfU0VRVUVOQ0UgICAgICAgIDogJ3w7fCcgIDsKK09QX1NFUVVFTkNFX1NJREUgICA6ICd8LnwnICB8ICd8Lzt8JyA7CitPUF9TRVFVRU5DRV9XRUFLICAgOiAnfDs7fCcgOworCitPUF9TQ0hFRFVMRV9HVCAgICAgOiAnfD58JyAgIDsKK09QX1NDSEVEVUxFX0xUICAgICA6ICd8PHwnICAgOworT1BfU0NIRURVTEVfWE9SICAgIDogJ3x4b3J8JyA7CisKK09QX1NDSEVEVUxFX0FORF9USEVOIDogJ3xhbmQjdGhlbnwnIDsKK09QX1NDSEVEVUxFX09SX0VMU0UgIDogJ3xvciNlbHNlfCcgIDsKKworCitPUF9OT05fREVURVJNSU5JU00gOiAnfC9cfCcgfCAnfGluZGV0fCcgOworCitPUF9DT05DVVJSRU5DWV9BU1lOQyAgICAgICAgOiAnfGF8JyAgIDsKK09QX0NPTkNVUlJFTkNZX0FORCAgICAgICAgICA6ICd8YW5kfCcgOworT1BfQ09OQ1VSUkVOQ1lfT1IgICAgICAgICAgIDogJ3xvcnwnICA7CitPUF9DT05DVVJSRU5DWV9JTlRFUkxFQVZJTkcgOiAnfGl8JyAgIDsKK09QX0NPTkNVUlJFTkNZX1BBUkFMTEVMICAgICA6ICd8LHwnICAgOworCitPUF9GT1JLICAgICAgICAgICAgIDogJ3xmb3JrfCcgIDsKK09QX0pPSU4gICAgICAgICAgICAgOiAnfGpvaW58JyAgOworCisKK09QX0NPTkNVUlJFTkNZX1JEVl9BU1lOQyAgICAgICAgOiAnfHxhfHwnICAgOworT1BfQ09OQ1VSUkVOQ1lfUkRWX0FORCAgICAgICAgICA6ICd8fGFuZHx8JyA7CitPUF9DT05DVVJSRU5DWV9SRFZfT1IgICAgICAgICAgIDogJ3x8b3J8fCcgIDsKK09QX0NPTkNVUlJFTkNZX1JEVl9JTlRFUkxFQVZJTkcgOiAnfHxpfHwnICAgOworT1BfQ09OQ1VSUkVOQ1lfUkRWX1BBUkFMTEVMICAgICA6ICd8fCx8fCcgICA7CisKKy8vTEVNX1RSQU5TRkVSVCAgIDogJy0+JyAgOworCitBU1NJR04gICAgICAgICAgOiAnPScgICB8ICc6PScgOworQVNTSUdOX0FGVEVSICAgIDogJz06JyAgOworQVNTSUdOX1JFRiAgICAgIDogJzwtJyAgOworQVNTSUdOX01BQ1JPICAgIDogJzo6PScgOworCitPUF9QVVNIICAgICAgICAgOiAnPD08JyA7CitPUF9BU1NJR05fVE9QICAgOiAnXj08JyA7CitPUF9UT1AgICAgICAgICAgOiAnXj0+JyA7CitPUF9QT1AgICAgICAgICAgOiAnPj0+JyA7CisKK0xQQVJFTiAgICAgICAgICA6ICcoJyAgIDsKK1JQQVJFTiAgICAgICAgICA6ICcpJyAgIDsKK0xDVVJMWSAgICAgICAgICA6ICd7JyAgIDsKK1JDVVJMWSAgICAgICAgICA6ICd9JyAgIDsKK0xCUkFDS0VUICAgICAgICA6ICdbJyAgIDsKK1JCUkFDS0VUICAgICAgICA6ICddJyAgIDsKKworTEJSQUNLRVRfRVhDRVBUIDogJ1teJyAgOworCitMUEFSRU5fSU5WT0tFICAgOiAnKDonICA7CitMQ1VSTFlfSU5WT0tFICAgOiAnezonICA7CisKK1BFUkNFTlRfTFBBUkVOX0lOVk9LRSA6ICclKDonICA7CisKK1BFUkNFTlRfTFBBUkVOICA6ICclKCcgIDsKK1JQQVJFTl9QRVJDRU5UICA6ICcpJScgIDsKKworCitTVEFURU1FTlRfUFJPTVBUOiAnOj4nICA7CisKK0RPTExBUl9MQ1VSTFkgICA6ICckeycgIDsKK1JDVVJMWV9ET0xMQVIgICA6ICd9JCcgIDsKKworUEVSQ0VOVF9MQ1VSTFkgIDogJyV7JyAgOworUkNVUkxZX1BFUkNFTlQgIDogJ30lJyAgOworCitMQlJBQ0tFVF9CQVIgICAgOiAnW3wnICA7CitCQVJfUkJSQUNLRVQgICAgOiAnfF0nICA7CisKK0xCUkFDS0VUX0xDVVJMWSA6ICdbeycgIDsKK1JDVVJMWV9SQlJBQ0tFVCA6ICd9XScgIDsKKworQ09MT04gICAgICAgICAgIDogJzonICAgOworQ09NTUEgICAgICAgICAgIDogJywnICAgOworUVVFU1RJT04gICAgICAgIDogJz8nICAgOworU0VNSSAgICAgICAgICAgIDogJzsnICAgOworCitESUVTRSAgICAgICAgICAgOiAnIycgICA7CitET0xMQVIgICAgICAgICAgOiAnJCcgICA7CisKK0RPVCAgICAgICAgICAgICA6ICcuJyAgIDsKK0RPVERPVCAgICAgICAgICA6ICcuLicgIDsKK0NPTE9OeDIgICAgICAgICA6ICc6OicgIDsKKworCitMQU5EICAgICAgICAgICAgICAgIDogJyYmJyAgfCAnYW5kJyA7CitMQU5EX1RIRU4gICAgICAgICAgIDogJ2FuZCN0aGVuJyAgICA7CitMQU5EX0FTU0lHTiAgICAgICAgIDogJyYmPScgfCAnJiY6PSc7CitMQU5EX0FTU0lHTl9BRlRFUiAgIDogJyYmPTonOworCitMTk9UICAgICAgICAgICAgICAgIDogJyEnICAgfCAnbm90JyA7CisKK0xPUiAgICAgICAgICAgICAgICAgOiAnfHwnICB8ICdvcicgIDsKK0xPUl9FTFNFICAgICAgICAgICAgOiAnb3IjZWxzZScgICAgIDsKK0xPUl9BU1NJR04gICAgICAgICAgOiAnfHw9JyB8ICd8fDo9JzsKK0xPUl9BU1NJR05fQUZURVIgICAgOiAnfHw9Oic7CitMWE9SICAgICAgICAgICAgICAgIDogJ3hvcicgOworCitFUVVBTCAgICAgICAgICAgICAgIDogJz09JyAgOworTkVRVUFMICAgICAgICAgICAgICA6ICchPScgIDsKKworU0VRVUFMICAgICAgICAgICAgICA6ICc9PT0nIDsKK05TRVFVQUwgICAgICAgICAgICAgOiAnPSE9JyB8ICc9Lz0nIDsKKworTFRFICAgICAgICAgICAgICAgICA6ICc8PScgIDsKK0xUXyAgICAgICAgICAgICAgICAgOiAnPCcgICA7CitHVEUgICAgICAgICAgICAgICAgIDogJz49JyAgOworR1QgICAgICAgICAgICAgICAgICA6ICc+JyAgIDsKKworCitQTFVTICAgICAgICAgICAgICAgIDogJysnICAgOworUExVU19BU1NJR04gICAgICAgICA6ICcrPScgIHwgJys6PScgOworUExVU19BU1NJR05fQUZURVIgICA6ICcrPTonIDsKK0lOQ1IgICAgICAgICAgICAgICAgOiAnKysnICA7CisKK01JTlVTICAgICAgICAgICAgICAgOiAnLScgICA7CitNSU5VU19BU1NJR04gICAgICAgIDogJy09JyAgfCAnLTo9JyA7CitNSU5VU19BU1NJR05fQUZURVIgIDogJy09OicgOworREVDUiAgICAgICAgICAgICAgICA6ICctLScgIDsKKworU1RBUiAgICAgICAgICAgICAgICA6ICcqJyAgIDsKK1NUQVJfQVNTSUdOICAgICAgICAgOiAnKj0nICB8ICcqOj0nIDsKK1NUQVJfQVNTSUdOX0FGVEVSICAgOiAnKj06JyA7CitESVYgICAgICAgICAgICAgICAgIDogJy8nICAgOworRElWX0FTU0lHTiAgICAgICAgICA6ICcvPScgIHwgJy86PScgOworRElWX0FTU0lHTl9BRlRFUiAgICA6ICcvPTonIDsKK01PRCAgICAgICAgICAgICAgICAgOiAnJScgICA7CitNT0RfQVNTSUdOICAgICAgICAgIDogJyU9JyAgfCAnJTo9JyA7CitNT0RfQVNTSUdOX0FGVEVSICAgIDogJyU9OicgOworCisvL1BPVyAgICAgICAgICAgICAgICAgOiAiKioiIDsKKworUlNISUZUICAgICAgICAgICAgICA6ICc+PicgIDsKK1JTSElGVF9BU1NJR04gICAgICAgOiAnPj49JyB8ICc+Pjo9JzsKK1JTSElGVF9BU1NJR05fQUZURVIgOiAnPj49Oic7CitMU0hJRlQgICAgICAgICAgICAgIDogJzw8JyAgOworTFNISUZUX0FTU0lHTiAgICAgICA6ICc8PD0nIHwgJzw8Oj0nOworTFNISUZUX0FTU0lHTl9BRlRFUiA6ICc8PD06JzsKKworQkFORCAgICAgICAgICAgICAgICA6ICcmJyAgIDsKK0JBTkRfQVNTSUdOICAgICAgICAgOiAnJj0nICB8ICcmOj0nIDsKK0JBTkRfQVNTSUdOX0FGVEVSICAgOiAnJj06JyA7CitCTk9UICAgICAgICAgICAgICAgIDogJ34nICAgOworQk9SICAgICAgICAgICAgICAgICA6ICd8JyAgIDsKK0JPUl9BU1NJR04gICAgICAgICAgOiAnfD0nICB8ICd8Oj0nIDsKK0JPUl9BU1NJR05fQUZURVIgICAgOiAnfD06JyA7CitCWE9SICAgICAgICAgICAgICAgIDogJ14nICAgOworQlhPUl9BU1NJR04gICAgICAgICA6ICdePScgIHwgJ146PScgOworQlhPUl9BU1NJR05fQUZURVIgICA6ICdePTonIDsKKworCisKK0lECisJOiAoJ2EnLi4neid8J0EnLi4nWid8J18nKSAoJ2EnLi4neid8J0EnLi4nWid8JzAnLi4nOSd8J18nfCcjJykqCisJOworCisKK0FUX0lECisgQGluaXR7CisJQU5UTFIzX01BUktFUiB0aGVTdGFydCA9ICRzdGFydDsKKwkvL3NlcDo6QVZNX09TX0RFQlVHIDw8ICJBVF9JRDo+IHN0YXJ0ID0gIiA8PCB0aGVTdGFydDsKKyB9CisJOiAnQCcKKwl7CisJCXRoZVN0YXJ0ID0gR0VUQ0hBUklOREVYKCk7CisJCS8vc2VwOjpBVk1fT1NfREVCVUcgPDwgIiAgR0VUQ0hBUklOREVYKCkgPSAiIDw8IHRoZVN0YXJ0IDw8IHN0ZDo6ZW5kbDsKKwl9CisJICAoJ2EnLi4neid8J0EnLi4nWid8J18nKSAoJ2EnLi4neid8J0EnLi4nWid8JzAnLi4nOSd8J18nfCcjJ3wnJCcpKgorCXsgJHN0YXJ0ID0gdGhlU3RhcnQ7ICBFTUlUKCk7IH0KKwk7CisKKworU3RyaW5nTGl0ZXJhbAorIEBpbml0eworCUFOVExSM19NQVJLRVIgdGhlU3RhcnQgPSAkc3RhcnQ7CisgfQorCTogJyInCisJeyB0aGVTdGFydCA9IEdFVENIQVJJTkRFWCgpOyB9CisJICAoIEVTQ19TRVEgfCB+KCdcXCd8JyInKSApKgorCXsgJHN0YXJ0ID0gdGhlU3RhcnQ7ICBFTUlUKCk7IH0KKwkgICciJworCTsKKworQ2hhckxpdGVyYWwKKyBAaW5pdHsKKwlBTlRMUjNfTUFSS0VSIHRoZVN0YXJ0ID0gJHN0YXJ0OworIH0KKwk6ICdcJycKKwl7IHRoZVN0YXJ0ID0gR0VUQ0hBUklOREVYKCk7IH0KKwkgICggRVNDX1NFUSB8IH4oJ1wnJ3wnXFwnKSApCisJeyAkc3RhcnQgPSB0aGVTdGFydDsgIEVNSVQoKTsgfQorCSAgJ1wnJworCTsKKworCitOdW1iZXJMaXRlcmFsCisJOiAoIEludGVnZXJMaXRlcmFsIERPVERPVCApID0+IEludGVnZXJMaXRlcmFsICAgeyAkdHlwZT1JbnRlZ2VyTGl0ZXJhbDsgIH0KKy8vCXwgKCBSYXRpb25hbExpdGVyYWwgKSAgICAgICA9PiBSYXRpb25hbExpdGVyYWwgIHsgJHR5cGU9UmF0aW9uYWxMaXRlcmFsOyB9CisJfCAoIEZsb2F0TGl0ZXJhbCApICAgICAgICAgID0+IEZsb2F0TGl0ZXJhbCAgICAgeyAkdHlwZT1GbG9hdExpdGVyYWw7ICAgIH0KKwl8IEludGVnZXJMaXRlcmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICR0eXBlPUludGVnZXJMaXRlcmFsOyAgfQorCTsKKworLy8gZnJhZ21lbnRzCitmcmFnbWVudCBGbG9hdExpdGVyYWwgICAgOiBGbG9hdCBJbWFnaW5hcnlTdWZmaXg/OworCitmcmFnbWVudCBSYXRpb25hbExpdGVyYWwgOiBJbnRlZ2VyTGl0ZXJhbCAgRElWICBJbnRlZ2VyOworCitmcmFnbWVudCBJbnRlZ2VyTGl0ZXJhbCAgOiBJbnRlZ2VyIEludFN1ZmZpeD87CisKK2ZyYWdtZW50IEZsb2F0VHlwZVN1ZmZpeCA6ICdmJyB8ICdGJyB8ICdMJzsKK2ZyYWdtZW50IEltYWdpbmFyeVN1ZmZpeCA6ICdpJzsKK2ZyYWdtZW50IEludFN1ZmZpeCAgICAgICA6ICdMJ3wndSd8J1UnfCdMdSd8J0xVJ3wndUwnfCdVTCcgOworCitmcmFnbWVudCBJbnRlZ2VyICAgICAgICAgOiBEZWNpbWFsIHwgQmluYXJ5IHwgT2N0YWwgfCBIZXhhZGVjaW1hbCA7CitmcmFnbWVudCBEZWNpbWFsICAgICAgICAgOiAnMCcgfCAnMScuLic5JyAoRGVjaW1hbERpZ2l0IHwgJ18nKSogOworCitmcmFnbWVudCBCaW5hcnkgICAgICAgICAgOiAoJzBiJyB8ICcwQicpICgnMCcgfCAnMScgfCAnXycpKyA7CitmcmFnbWVudCBPY3RhbCAgICAgICAgICAgOiAnMCcgKE9jdGFsRGlnaXQgfCAnXycpKyA7CitmcmFnbWVudCBIZXhhZGVjaW1hbCAgICAgOiAoJzB4JyB8ICcwWCcpIChIZXhEaWdpdCB8ICdfJykrOworCitmcmFnbWVudCBEZWNpbWFsRGlnaXQgICAgOiAnMCcuLic5JyA7CitmcmFnbWVudCBPY3RhbERpZ2l0ICAgICAgOiAnMCcuLic3JyA7CitmcmFnbWVudCBIZXhEaWdpdCAgICAgICAgOiAoJzAnLi4nOSd8J2EnLi4nZid8J0EnLi4nRicpIDsKKworZnJhZ21lbnQgRGVjaW1hbEV4cG9uZW50IDogJ2UnIHwgJ0UnIHwgJ2UrJyB8ICdFKycgfCAnZS0nIHwgJ0UtJyBEZWNpbWFsRGlnaXRzOworZnJhZ21lbnQgRGVjaW1hbERpZ2l0cyAgIDogKCAnMCcuLic5JyB8ICdfJykrIDsKKworZnJhZ21lbnQKK0Zsb2F0CisJOiBkPURlY2ltYWxEaWdpdHMKKwkgICggb3B0aW9ucyB7Z3JlZWR5ID0gdHJ1ZTsgfSA6IEZsb2F0VHlwZVN1ZmZpeAorCSAgfCAnLicgRGVjaW1hbERpZ2l0cyBEZWNpbWFsRXhwb25lbnQ/CisJICApCisgCXwgJy4nIERlY2ltYWxEaWdpdHMgRGVjaW1hbEV4cG9uZW50PworIAk7CisKKworCitmcmFnbWVudAorRVhQT05FTlQKKwk6ICgnZSd8J0UnKSAgKCcrJ3wnLScpPyAgKCcwJy4uJzknKSsKKwk7CisKK2ZyYWdtZW50CitIRVhfRElHSVQKKwk6ICgnMCcuLic5JyB8ICdhJy4uJ2YnIHwgJ0EnLi4nRicpCisJOworCitmcmFnbWVudAorRVNDX1NFUQorCTogJ1xcJyAoJ2InfCd0J3wnbid8J2YnfCdyJ3wnXCInfCdcJyd8J1xcJykKKwl8IFVOSUNPREVfRVNDCisJfCBPQ1RBTF9FU0MKKwk7CisKK2ZyYWdtZW50CitPQ1RBTF9FU0MKKwk6ICdcXCcgKCcwJy4uJzMnKSAgKCcwJy4uJzcnKSAgKCcwJy4uJzcnKQorCXwgJ1xcJyAoJzAnLi4nNycpICAoJzAnLi4nNycpCisJfCAnXFwnICgnMCcuLic3JykKKwk7CisKK2ZyYWdtZW50CitVTklDT0RFX0VTQworCTogJ1xcJyAndScgSEVYX0RJR0lUICBIRVhfRElHSVQgIEhFWF9ESUdJVCAgSEVYX0RJR0lUCisJOworCisKK0NPTU1FTlQKKwk6ICcvLycgfignXG4nfCdccicpKiAnXHInPyAnXG4nIHskY2hhbm5lbD1ISURERU47fQorCXwgJy8qJyAoIG9wdGlvbnMge2dyZWVkeT1mYWxzZTt9IDogLiApKiAnKi8nIHskY2hhbm5lbD1ISURERU47fQorCTsKKworV1MKKwk6ICggJyAnIHwgJ1x0JyB8ICdccicgfCAnXG4nICkgIHskY2hhbm5lbD1ISURERU47fQorCTsKKworCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLnRva2VucyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwudG9rZW5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMjgwMDUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLnRva2VucwpAQCAtMCwwICsxLDY5MSBAQAorVF9fMTQ0PTE0NAorVF9fMTQ1PTE0NQorVF9fMTQ2PTE0NgorVF9fMTQ3PTE0NworVF9fMTQ4PTE0OAorVF9fMTQ5PTE0OQorVF9fMTUwPTE1MAorVF9fMTUxPTE1MQorVF9fMTUyPTE1MgorVF9fMTUzPTE1MworVF9fMTU0PTE1NAorVF9fMTU1PTE1NQorVF9fMTU2PTE1NgorVF9fMTU3PTE1NworVF9fMTU4PTE1OAorVF9fMTU5PTE1OQorVF9fMTYwPTE2MAorVF9fMTYxPTE2MQorVF9fMTYyPTE2MgorVF9fMTYzPTE2MworVF9fMTY0PTE2NAorVF9fMTY1PTE2NQorVF9fMTY2PTE2NgorVF9fMTY3PTE2NworVF9fMTY4PTE2OAorVF9fMTY5PTE2OQorVF9fMTcwPTE3MAorVF9fMTcxPTE3MQorVF9fMTcyPTE3MgorVF9fMTczPTE3MworVF9fMTc0PTE3NAorVF9fMTc1PTE3NQorVF9fMTc2PTE3NgorVF9fMTc3PTE3NworVF9fMTc4PTE3OAorVF9fMTc5PTE3OQorVF9fMTgwPTE4MAorVF9fMTgxPTE4MQorVF9fMTgyPTE4MgorVF9fMTgzPTE4MworVF9fMTg0PTE4NAorVF9fMTg1PTE4NQorVF9fMTg2PTE4NgorVF9fMTg3PTE4NworVF9fMTg4PTE4OAorVF9fMTg5PTE4OQorVF9fMTkwPTE5MAorVF9fMTkxPTE5MQorVF9fMTkyPTE5MgorVF9fMTkzPTE5MworVF9fMTk0PTE5NAorVF9fMTk1PTE5NQorVF9fMTk2PTE5NgorVF9fMTk3PTE5NworVF9fMTk4PTE5OAorVF9fMTk5PTE5OQorVF9fMjAwPTIwMAorVF9fMjAxPTIwMQorVF9fMjAyPTIwMgorVF9fMjAzPTIwMworVF9fMjA0PTIwNAorVF9fMjA1PTIwNQorVF9fMjA2PTIwNgorVF9fMjA3PTIwNworVF9fMjA4PTIwOAorVF9fMjA5PTIwOQorVF9fMjEwPTIxMAorVF9fMjExPTIxMQorVF9fMjEyPTIxMgorVF9fMjEzPTIxMworVF9fMjE0PTIxNAorVF9fMjE1PTIxNQorVF9fMjE2PTIxNgorVF9fMjE3PTIxNworVF9fMjE4PTIxOAorVF9fMjE5PTIxOQorVF9fMjIwPTIyMAorVF9fMjIxPTIyMQorVF9fMjIyPTIyMgorVF9fMjIzPTIyMworVF9fMjI0PTIyNAorVF9fMjI1PTIyNQorVF9fMjI2PTIyNgorVF9fMjI3PTIyNworVF9fMjI4PTIyOAorVF9fMjI5PTIyOQorVF9fMjMwPTIzMAorVF9fMjMxPTIzMQorVF9fMjMyPTIzMgorVF9fMjMzPTIzMworVF9fMjM0PTIzNAorVF9fMjM1PTIzNQorVF9fMjM2PTIzNgorVF9fMjM3PTIzNworVF9fMjM4PTIzOAorVF9fMjM5PTIzOQorVF9fMjQwPTI0MAorVF9fMjQxPTI0MQorVF9fMjQyPTI0MgorVF9fMjQzPTI0MworVF9fMjQ0PTI0NAorVF9fMjQ1PTI0NQorVF9fMjQ2PTI0NgorVF9fMjQ3PTI0NworVF9fMjQ4PTI0OAorVF9fMjQ5PTI0OQorVF9fMjUwPTI1MAorVF9fMjUxPTI1MQorVF9fMjUyPTI1MgorVF9fMjUzPTI1MworVF9fMjU0PTI1NAorVF9fMjU1PTI1NQorVF9fMjU2PTI1NgorVF9fMjU3PTI1NworVF9fMjU4PTI1OAorVF9fMjU5PTI1OQorVF9fMjYwPTI2MAorVF9fMjYxPTI2MQorVF9fMjYyPTI2MgorVF9fMjYzPTI2MworVF9fMjY0PTI2NAorVF9fMjY1PTI2NQorVF9fMjY2PTI2NgorVF9fMjY3PTI2NworVF9fMjY4PTI2OAorVF9fMjY5PTI2OQorVF9fMjcwPTI3MAorVF9fMjcxPTI3MQorVF9fMjcyPTI3MgorVF9fMjczPTI3MworVF9fMjc0PTI3NAorVF9fMjc1PTI3NQorVF9fMjc2PTI3NgorVF9fMjc3PTI3NworVF9fMjc4PTI3OAorVF9fMjc5PTI3OQorVF9fMjgwPTI4MAorVF9fMjgxPTI4MQorVF9fMjgyPTI4MgorVF9fMjgzPTI4MworVF9fMjg0PTI4NAorVF9fMjg1PTI4NQorVF9fMjg2PTI4NgorVF9fMjg3PTI4NworVF9fMjg4PTI4OAorVF9fMjg5PTI4OQorVF9fMjkwPTI5MAorVF9fMjkxPTI5MQorVF9fMjkyPTI5MgorVF9fMjkzPTI5MworVF9fMjk0PTI5NAorVF9fMjk1PTI5NQorVF9fMjk2PTI5NgorVF9fMjk3PTI5NworVF9fMjk4PTI5OAorVF9fMjk5PTI5OQorVF9fMzAwPTMwMAorVF9fMzAxPTMwMQorVF9fMzAyPTMwMgorVF9fMzAzPTMwMworVF9fMzA0PTMwNAorVF9fMzA1PTMwNQorVF9fMzA2PTMwNgorVF9fMzA3PTMwNworVF9fMzA4PTMwOAorVF9fMzA5PTMwOQorVF9fMzEwPTMxMAorVF9fMzExPTMxMQorVF9fMzEyPTMxMgorVF9fMzEzPTMxMworVF9fMzE0PTMxNAorVF9fMzE1PTMxNQorVF9fMzE2PTMxNgorVF9fMzE3PTMxNworVF9fMzE4PTMxOAorVF9fMzE5PTMxOQorVF9fMzIwPTMyMAorVF9fMzIxPTMyMQorVF9fMzIyPTMyMgorVF9fMzIzPTMyMworVF9fMzI0PTMyNAorVF9fMzI1PTMyNQorVF9fMzI2PTMyNgorVF9fMzI3PTMyNworVF9fMzI4PTMyOAorVF9fMzI5PTMyOQorVF9fMzMwPTMzMAorVF9fMzMxPTMzMQorVF9fMzMyPTMzMgorVF9fMzMzPTMzMworVF9fMzM0PTMzNAorVF9fMzM1PTMzNQorVF9fMzM2PTMzNgorVF9fMzM3PTMzNworVF9fMzM4PTMzOAorVF9fMzM5PTMzOQorVF9fMzQwPTM0MAorVF9fMzQxPTM0MQorVF9fMzQyPTM0MgorVF9fMzQzPTM0MworVF9fMzQ0PTM0NAorVF9fMzQ1PTM0NQorVF9fMzQ2PTM0NgorVF9fMzQ3PTM0NworVF9fMzQ4PTM0OAorVF9fMzQ5PTM0OQorVF9fMzUwPTM1MAorVF9fMzUxPTM1MQorVF9fMzUyPTM1MgorVF9fMzUzPTM1MworVF9fMzU0PTM1NAorVF9fMzU1PTM1NQorVF9fMzU2PTM1NgorVF9fMzU3PTM1NworVF9fMzU4PTM1OAorVF9fMzU5PTM1OQorVF9fMzYwPTM2MAorVF9fMzYxPTM2MQorVF9fMzYyPTM2MgorVF9fMzYzPTM2MworVF9fMzY0PTM2NAorVF9fMzY1PTM2NQorVF9fMzY2PTM2NgorVF9fMzY3PTM2NworVF9fMzY4PTM2OAorVF9fMzY5PTM2OQorVF9fMzcwPTM3MAorVF9fMzcxPTM3MQorVF9fMzcyPTM3MgorVF9fMzczPTM3MworVF9fMzc0PTM3NAorVF9fMzc1PTM3NQorVF9fMzc2PTM3NgorVF9fMzc3PTM3NworVF9fMzc4PTM3OAorVF9fMzc5PTM3OQorVF9fMzgwPTM4MAorVF9fMzgxPTM4MQorVF9fMzgyPTM4MgorVF9fMzgzPTM4MworVF9fMzg0PTM4NAorVF9fMzg1PTM4NQorVF9fMzg2PTM4NgorVF9fMzg3PTM4NworVF9fMzg4PTM4OAorVF9fMzg5PTM4OQorVF9fMzkwPTM5MAorVF9fMzkxPTM5MQorVF9fMzkyPTM5MgorVF9fMzkzPTM5MworVF9fMzk0PTM5NAorVF9fMzk1PTM5NQorVF9fMzk2PTM5NgorVF9fMzk3PTM5NworVF9fMzk4PTM5OAorVF9fMzk5PTM5OQorVF9fNDAwPTQwMAorVF9fNDAxPTQwMQorVF9fNDAyPTQwMgorVF9fNDAzPTQwMworVF9fNDA0PTQwNAorVF9fNDA1PTQwNQorVF9fNDA2PTQwNgorVF9fNDA3PTQwNworVF9fNDA4PTQwOAorVF9fNDA5PTQwOQorVF9fNDEwPTQxMAorVF9fNDExPTQxMQorVF9fNDEyPTQxMgorVF9fNDEzPTQxMworVF9fNDE0PTQxNAorVF9fNDE1PTQxNQorVF9fNDE2PTQxNgorVF9fNDE3PTQxNworQVNTSUdOPTQKK0FTU0lHTl9BRlRFUj01CitBU1NJR05fTUFDUk89NgorQVNTSUdOX1JFRj03CitBVF9JRD04CitCQU5EPTkKK0JBTkRfQVNTSUdOPTEwCitCQU5EX0FTU0lHTl9BRlRFUj0xMQorQkFSX1JCUkFDS0VUPTEyCitCTk9UPTEzCitCT1I9MTQKK0JPUl9BU1NJR049MTUKK0JPUl9BU1NJR05fQUZURVI9MTYKK0JYT1I9MTcKK0JYT1JfQVNTSUdOPTE4CitCWE9SX0FTU0lHTl9BRlRFUj0xOQorQmluYXJ5PTIwCitDT0xPTj0yMQorQ09MT054Mj0yMgorQ09NTUE9MjMKK0NPTU1FTlQ9MjQKK0NoYXJMaXRlcmFsPTI1CitERUNSPTI2CitESUVTRT0yNworRElWPTI4CitESVZfQVNTSUdOPTI5CitESVZfQVNTSUdOX0FGVEVSPTMwCitET0xMQVI9MzEKK0RPTExBUl9MQ1VSTFk9MzIKK0RPVD0zMworRE9URE9UPTM0CitEZWNpbWFsPTM1CitEZWNpbWFsRGlnaXQ9MzYKK0RlY2ltYWxEaWdpdHM9MzcKK0RlY2ltYWxFeHBvbmVudD0zOAorRVFVQUw9MzkKK0VTQ19TRVE9NDAKK0VYUE9ORU5UPTQxCitGbG9hdD00MgorRmxvYXRMaXRlcmFsPTQzCitGbG9hdFR5cGVTdWZmaXg9NDQKK0dUPTQ1CitHVEU9NDYKK0hFWF9ESUdJVD00NworSGV4RGlnaXQ9NDgKK0hleGFkZWNpbWFsPTQ5CitJRD01MAorSU5DUj01MQorSW1hZ2luYXJ5U3VmZml4PTUyCitJbnRTdWZmaXg9NTMKK0ludGVnZXI9NTQKK0ludGVnZXJMaXRlcmFsPTU1CitMQU5EPTU2CitMQU5EX0FTU0lHTj01NworTEFORF9BU1NJR05fQUZURVI9NTgKK0xBTkRfVEhFTj01OQorTEJSQUNLRVQ9NjAKK0xCUkFDS0VUX0JBUj02MQorTEJSQUNLRVRfRVhDRVBUPTYyCitMQlJBQ0tFVF9MQ1VSTFk9NjMKK0xDVVJMWT02NAorTENVUkxZX0lOVk9LRT02NQorTE5PVD02NgorTE9SPTY3CitMT1JfQVNTSUdOPTY4CitMT1JfQVNTSUdOX0FGVEVSPTY5CitMT1JfRUxTRT03MAorTFBBUkVOPTcxCitMUEFSRU5fSU5WT0tFPTcyCitMU0hJRlQ9NzMKK0xTSElGVF9BU1NJR049NzQKK0xTSElGVF9BU1NJR05fQUZURVI9NzUKK0xURT03NgorTFRfPTc3CitMWE9SPTc4CitNSU5VUz03OQorTUlOVVNfQVNTSUdOPTgwCitNSU5VU19BU1NJR05fQUZURVI9ODEKK01PRD04MgorTU9EX0FTU0lHTj04MworTU9EX0FTU0lHTl9BRlRFUj04NAorTkVRVUFMPTg1CitOU0VRVUFMPTg2CitOdW1iZXJMaXRlcmFsPTg3CitPQ1RBTF9FU0M9ODgKK09QX0FTU0lHTl9UT1A9ODkKK09QX0FUT01JQ19TRVFVRU5DRT05MAorT1BfQ09OQ1VSUkVOQ1lfQU5EPTkxCitPUF9DT05DVVJSRU5DWV9BU1lOQz05MgorT1BfQ09OQ1VSUkVOQ1lfSU5URVJMRUFWSU5HPTkzCitPUF9DT05DVVJSRU5DWV9PUj05NAorT1BfQ09OQ1VSUkVOQ1lfUEFSQUxMRUw9OTUKK09QX0NPTkNVUlJFTkNZX1JEVl9BTkQ9OTYKK09QX0NPTkNVUlJFTkNZX1JEVl9BU1lOQz05NworT1BfQ09OQ1VSUkVOQ1lfUkRWX0lOVEVSTEVBVklORz05OAorT1BfQ09OQ1VSUkVOQ1lfUkRWX09SPTk5CitPUF9DT05DVVJSRU5DWV9SRFZfUEFSQUxMRUw9MTAwCitPUF9GT1JLPTEwMQorT1BfSk9JTj0xMDIKK09QX05PTl9ERVRFUk1JTklTTT0xMDMKK09QX1BPUD0xMDQKK09QX1BVU0g9MTA1CitPUF9TQ0hFRFVMRV9BTkRfVEhFTj0xMDYKK09QX1NDSEVEVUxFX0dUPTEwNworT1BfU0NIRURVTEVfTFQ9MTA4CitPUF9TQ0hFRFVMRV9PUl9FTFNFPTEwOQorT1BfU0NIRURVTEVfWE9SPTExMAorT1BfU0VRVUVOQ0U9MTExCitPUF9TRVFVRU5DRV9TSURFPTExMgorT1BfU0VRVUVOQ0VfV0VBSz0xMTMKK09QX1RPUD0xMTQKK09jdGFsPTExNQorT2N0YWxEaWdpdD0xMTYKK1BFUkNFTlRfTENVUkxZPTExNworUEVSQ0VOVF9MUEFSRU49MTE4CitQRVJDRU5UX0xQQVJFTl9JTlZPS0U9MTE5CitQTFVTPTEyMAorUExVU19BU1NJR049MTIxCitQTFVTX0FTU0lHTl9BRlRFUj0xMjIKK1FVRVNUSU9OPTEyMworUkJSQUNLRVQ9MTI0CitSQ1VSTFk9MTI1CitSQ1VSTFlfRE9MTEFSPTEyNgorUkNVUkxZX1BFUkNFTlQ9MTI3CitSQ1VSTFlfUkJSQUNLRVQ9MTI4CitSUEFSRU49MTI5CitSUEFSRU5fUEVSQ0VOVD0xMzAKK1JTSElGVD0xMzEKK1JTSElGVF9BU1NJR049MTMyCitSU0hJRlRfQVNTSUdOX0FGVEVSPTEzMworUmF0aW9uYWxMaXRlcmFsPTEzNAorU0VNST0xMzUKK1NFUVVBTD0xMzYKK1NUQVI9MTM3CitTVEFSX0FTU0lHTj0xMzgKK1NUQVJfQVNTSUdOX0FGVEVSPTEzOQorU1RBVEVNRU5UX1BST01QVD0xNDAKK1N0cmluZ0xpdGVyYWw9MTQxCitVTklDT0RFX0VTQz0xNDIKK1dTPTE0MworJyNkaGlzdG9yeSc9MTQ0CisnI2ZpbmFsJz0xNDUKKycjaW5pdCc9MTQ2CisnI2luaXRpYWwnPTE0NworJyNyZXR1cm4nPTE0OAorJyNzaGlzdG9yeSc9MTQ5CisnI3N0YXJ0Jz0xNTAKKycjc3RmJz0xNTEKKycjc3RzJz0xNTIKKycjdGVybWluYWwnPTE1MworJyQ6Y29tbWVudCc9MTU0CisnJDpkZWJ1Zyc9MTU1CisnJDppbmZvcm1hbCc9MTU2CisnJDp0cmFjZSc9MTU3CisnJGVudic9MTU4CisnJHBhcmVudCc9MTU5CisnJHNlbGYnPTE2MAorJyRzdXBlcic9MTYxCisnJHRoaXMnPTE2MgorJyYnPTkKKyctLT4nPTE2MworJy0+Jz0xNjQKKyc8LSc9NworJzwtLSc9MTY1CisnPC0+Jz0xNjYKKyc8PSc9NzYKKyc8PT0nPTE2NworJz09Pic9MTY4CisnQCc9MTY5CisnQGFib3J0Jz0xNzAKKydAYmVoYXZpb3I6Jz0xNzEKKydAY29tOic9MTcyCisnQGNvbXBvc2l0ZSc9MTczCisnQGNvbXBvc2l0ZTonPTE3NAorJ0Bjb25jdXJyZW5jeSc9MTc1CisnQGNvbnN0cmFpbnQnPTE3NgorJ0BjcmVhdGUnPTE3NworJ0BkZWNsYXJhdGlvbjonPTE3OAorJ0BkaXNhYmxlJz0xNzkKKydAZGl2ZXJzaXR5Jz0xODAKKydAZWZmZWN0Oic9MTgxCisnQGVuYWJsZSc9MTgyCisnQGV4ZWN1dGFibGU6Jz0xODMKKydAZmluYWwnPTE4NAorJ0BmbWwnPTE4NQorJ0Bmb3JtYWxtbCc9MTg2CisnQGd1YXJkOic9MTg3CisnQGhlYWRlcjonPTE4OAorJ0BpYWJvcnQnPTE4OQorJ0BpZGlzYWJsZSc9MTkwCisnQGllbmFibGUnPTE5MQorJ0BpbXBvcnQ6Jz0xOTIKKydAaW5jbHVkZSc9MTkzCisnQGluaXQnPTE5NAorJ0Bpbm91dDonPTE5NQorJ0BpbnB1dDonPTE5NgorJ0BpbnN0YW5jZTonPTE5NworJ0BpbnRlcmFjdGlvbjonPTE5OAorJ0BpcnVuJz0xOTkKKydAbWFjaGluZTonPTIwMAorJ0BtYWNybzonPTIwMQorJ0Btb2M6Jz0yMDIKKydAbW9kZWw6Jz0yMDMKKydAbW9lOic9MjA0CisnQG9uX3dyaXRlJz0yMDUKKydAb3B0aW9ucyc9MjA2CisnQG91dHB1dDonPTIwNworJ0BwYWNrYWdlJz0yMDgKKydAcGFyYW06Jz0yMDkKKydAcGFyYW1ldGVyOic9MjEwCisnQHByaXZhdGU6Jz0yMTEKKydAcHJvY2VkdXJlOic9MjEyCisnQHByb3BlcnR5Oic9MjEzCisnQHByb3RlY3RlZDonPTIxNAorJ0Bwcm90b3R5cGU6Jz0yMTUKKydAcHVibGljOic9MjE2CisnQHJlZ2lvbjonPTIxNworJ0ByZXR1cm4nPTIxOAorJ0ByZXR1cm46Jz0yMTkKKydAcmV0dXJuczonPTIyMAorJ0Byb3V0aW5lJz0yMjEKKydAcm91dGluZTonPTIyMgorJ0BydGMnPTIyMworJ0BydW4nPTIyNAorJ0BzY2hlZHVsZSc9MjI1CisnQHN0YXJ0Jz0yMjYKKydAc3RhdGVtYWNoaW5lOic9MjI3CisnQHN0b3AnPTIyOAorJ0BzeXN0ZW0nPTIyOQorJ0B0Z3VhcmQ6Jz0yMzAKKydAdHJhbnNpdGlvbjonPTIzMQorJ0B0cmlnZ2VyOic9MjMyCisnQHhmbWwnPTIzMworJ0B4ZnNwJz0yMzQKKydAeGxpYSc9MjM1CisnYWJvcnQnPTIzNgorJ2Fic2VudCc9MjM3CisnYWN0aXZpdHk6Jz0yMzgKKydhbmQnPTIzOQorJ2FueWNhc3QnPTI0MAorJ2FycmF5Jz0yNDEKKydhdm1jb2RlJz0yNDIKKydiaW5kJz0yNDMKKydiaW5kOic9MjQ0CisnYm9vbCc9MjQ1CisnYm9vbGVhbic9MjQ2CisnYnJlYWsnPTI0NworJ2Jyb2FkY2FzdCc9MjQ4CisnYnVmZmVyJz0yNDkKKydjYWxsJz0yNTAKKydjaGFuZ2VkI3RvJz0yNTEKKydjaGFuZ2VkJz0yNTIKKydjaGFubmVsJz0yNTMKKydjaGFyJz0yNTQKKydjaGFyYWN0ZXInPTI1NQorJ2NoZWNrc2F0Jz0yNTYKKydjaG9pY2UnPTI1NworJ2NsYXNzJz0yNTgKKydjbG9jayc9MjU5CisnY29ubmVjdCc9MjYwCisnY29ubmVjdG9yJz0yNjEKKydjb25zdCc9MjYyCisnY29udGludWUnPTI2MworJ2N0aW1lJz0yNjQKKydjdG9yJz0yNjUKKydjdHg6Jz0yNjYKKydkZXN0cm95Jz0yNjcKKydkaXNhYmxlJz0yNjgKKydkbyc9MjY5CisnZG91YmxlJz0yNzAKKydkdGltZSc9MjcxCisnZHluYW1pYyc9MjcyCisnZWxzZSc9MjczCisnZWxzZWlmJz0yNzQKKydlbmFibGUnPTI3NQorJ2VudW0nPTI3NgorJ2Vudic9Mjc3CisnZXZlbnQnPTI3OAorJ2V4aXQnPTI3OQorJ2ZhbHNlJz0yODAKKydmaWZvJz0yODEKKydmaW5hbCc9MjgyCisnZmxvYXQnPTI4MworJ2Zsb3cnPTI4NAorJ2Zvcic9Mjg1CisnZm9yayc9Mjg2CisnZnJvbTonPTI4NworJ2Z1bic9Mjg4CisnZ290byc9Mjg5CisnZ3VhcmQnPTI5MAorJ2lhYm9ydCc9MjkxCisnaWRpc2FibGUnPTI5MgorJ2llbmFibGUnPTI5MworJ2lmJz0yOTQKKydpbic9Mjk1CisnaW5pdCc9Mjk2CisnaW5pdDonPTI5NworJ2lub3V0Jz0yOTgKKydpbnB1dCNidWZmZXInPTI5OQorJ2lucHV0I2Vudic9MzAwCisnaW5wdXQjZmxvdyc9MzAxCisnaW5wdXQjcmR2Jz0zMDIKKydpbnB1dCNzYXZlJz0zMDMKKydpbnB1dCN2YXInPTMwNAorJ2lucHV0Jz0zMDUKKydpbnB1dF9lbmFibGVkJz0zMDYKKydpbnN0YW5jZSc9MzA3CisnaW5zdGFuY2U6Jz0zMDgKKydpbnQnPTMwOQorJ2ludGVnZXInPTMxMAorJ2ludGVydmFsJz0zMTEKKydqb2luJz0zMTIKKydsYW1iZGEnPTMxMworJ2xpZmVsaW5lJz0zMTQKKydsaWZvJz0zMTUKKydsaXN0Jz0zMTYKKydtYWNoaW5lJz0zMTcKKydtYWNybyc9MzE4CisnbWF4Oic9MzE5CisnbWVzc2FnZSc9MzIwCisnbW9jOic9MzIxCisnbW9kZWwnPTMyMgorJ21vZGVsOic9MzIzCisnbXVsdGljYXN0Jz0zMjQKKydtdWx0aWZpZm8nPTMyNQorJ211bHRpbGlmbyc9MzI2CisnbXVsdGlwbGljaXR5Oic9MzI3CisnbXVsdGlyZHYnPTMyOAorJ211bHRpc2V0Jz0zMjkKKyduZXcnPTMzMAorJ251bGwnPTMzMQorJ251bGw8Jz0zMzIKKydvcGVyYXRvcic9MzMzCisnb3InPTMzNAorJ291dCc9MzM1Cisnb3V0cHV0I2J1ZmZlcic9MzM2Cisnb3V0cHV0I2Vudic9MzM3Cisnb3V0cHV0I2Zsb3cnPTMzOAorJ291dHB1dCNyZHYnPTMzOQorJ291dHB1dCN2YXInPTM0MAorJ291dHB1dCc9MzQxCisncGFja2FnZSc9MzQyCisncGFyZW50Jz0zNDMKKydwb3J0Jz0zNDQKKydwb3NfaW50Jz0zNDUKKydwb3NfaW50ZWdlcic9MzQ2CisncHJlc2VudCc9MzQ3CisncHJpb3I6Jz0zNDgKKydwcml2YXRlJz0zNDkKKydwcm9iYTonPTM1MAorJ3Byb2NlZHVyZSc9MzUxCisncHJvdGVjdGVkJz0zNTIKKydwcm90b3R5cGUnPTM1MworJ3Byb3ZpZGVkOic9MzU0CisncHVibGljJz0zNTUKKydyYW0nPTM1NgorJ3JhdCc9MzU3CisncmF0aW9uYWwnPTM1OAorJ3Jkdic9MzU5CisncmVhbCc9MzYwCisncmVmJz0zNjEKKydyZXN0YXJ0Jz0zNjIKKydyZXN1bWUnPTM2MworJ3JldHVybic9MzY0CisncmV0dXJuczonPTM2NQorJ3JvdXRlJz0zNjYKKydyb3V0aW5lJz0zNjcKKydydGMnPTM2OAorJ3J1bic9MzY5CisncnZlY3Rvcic9MzcwCisnc2NoZWR1bGUnPTM3MQorJ3NlbGYnPTM3MgorJ3NldCc9MzczCisnc2lnbmFsJz0zNzQKKydzaXplOic9Mzc1Cisnc29sdmVyOic9Mzc2Cisnc3RhcnQnPTM3NworJ3N0YXRlJz0zNzgKKydzdGF0ZW1hY2hpbmUnPTM3OQorJ3N0YXRpYyc9MzgwCisnc3RhdHVzI2JlaW5nJz0zODEKKydzdGF0dXMjaXMnPTM4MgorJ3N0YXR1cyN3YXMnPTM4MworJ3N0YXR1cyN3aWxsJz0zODQKKydzdGVwX21hcmsnPTM4NQorJ3N0b3AnPTM4NgorJ3N0cmluZyc9Mzg3Cisnc3RydWN0Jz0zODgKKydzdXNwZW5kJz0zODkKKydzeXN0ZW0nPTM5MAorJ3RndWFyZCc9MzkxCisndGltZSc9MzkyCisndGltZWQnPTM5MworJ3RvOic9Mzk0CisndHJhbnNpZW50Jz0zOTUKKyd0cmFuc2l0aW9uJz0zOTYKKyd0cnVlJz0zOTcKKyd0eXBlJz0zOTgKKyd1ZG91YmxlJz0zOTkKKyd1ZmxvYXQnPTQwMAorJ3VpbnQnPTQwMQorJ3VpbnRlZ2VyJz00MDIKKyd1bmljYXN0Jz00MDMKKyd1bmlvbic9NDA0CisndW5pdmVyc2FsJz00MDUKKyd1bnNhZmUnPTQwNgorJ3VyYXQnPTQwNworJ3VyYXRpb25hbCc9NDA4CisndXJlYWwnPTQwOQorJ3ZhbCc9NDEwCisndmFyJz00MTEKKyd2ZWN0b3InPTQxMgorJ3ZpYSc9NDEzCisndm9sYXRpbGUnPTQxNAorJ3dhaXQnPTQxNQorJ3doaWxlJz00MTYKKyd8PT4nPTQxNwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbExleGVyLmMgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sTGV4ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTk3MDhkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbExleGVyLmMKQEAgLTAsMCArMSwzOTQxNCBAQAorLyoqIFxmaWxlCisgKiAgVGhpcyBDIHNvdXJjZSBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgJEFOVExSIHZlcnNpb24gMy40CisgKgorICogICAgIC0gIEZyb20gdGhlIGdyYW1tYXIgc291cmNlIGZpbGUgOiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZworICogICAgIC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT24gOiAyMDE3LTA1LTMwIDA5OjIxOjUzCisgKiAgICAgLSAgICAgICAgICAgICAgICAgZm9yIHRoZSBsZXhlciA6IGZtbExleGVyTGV4ZXIKKyAqCisgKiBFZGl0aW5nIGl0LCBhdCBsZWFzdCBtYW51YWxseSwgaXMgbm90IHdpc2UuCisgKgorICogQyBsYW5ndWFnZSBnZW5lcmF0b3IgYW5kIHJ1bnRpbWUgYnkgSmltIElkbGUsIGppbWl8aGVyZWlzYW5hdHxpZGxlfGRvdGdvZXNoZXJlfHdzLgorICoKKyAqCisqLworLy8gW1RoZSAiQlNEIGxpY2Vuc2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgSmltIElkbGUsIFRlbXBvcmFsIFdhdmUgTExDCisvLyBodHRwOi8vd3d3LnRlbXBvcmFsLXdhdmUuY29tCisvLyBodHRwOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9qaW1pZGxlCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUaGlzIGlzIHdoYXQgdGhlIGdyYW1tYXIgcHJvZ3JhbW1lciBhc2tlZCB1cyB0byBwdXQgYXQgdGhlIHRvcCBvZiBldmVyeSBmaWxlLgorICovCisKKworCisvKiBFbmQgb2YgSGVhZGVyIGFjdGlvbi4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEluY2x1ZGUgdGhlIEFOVExSMyBnZW5lcmF0ZWQgaGVhZGVyIGZpbGUuCisgKi8KKyNpbmNsdWRlICAgICJmbWxMZXhlci5oIgorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKiogU3RyaW5nIGxpdGVyYWxzIHVzZWQgYnkgZm1sTGV4ZXIgdGhhdCB3ZSBtdXN0IGRvIHRoaW5ncyBsaWtlIE1BVENIUygpIHdpdGguCisgKiAgQyB3aWxsIG5vcm1hbGx5IGp1c3QgbGF5IGRvd24gOCBiaXQgY2hhcmFjdGVycywgYW5kIHlvdSBjYW4gdXNlIEwieHh4IiB0bworICogIGdldCB3Y2hhcl90LCBidXQgd2NoYXJfdCBpcyAxNiBiaXRzIG9uIFdpbmRvd3MsIHdoaWNoIGlzIG5vdCBVVEYzMiBhbmQgc28KKyAqICB3ZSBwZXJmb3JtIHRoaXMgbGl0dGxlIHRyaWNrIG9mIGRlZmluaW5nIHRoZSBsaXRlcmFscyBhcyBhcnJheXMgb2YgVUlOVDMyCisgKiAgYW5kIHBhc3NpbmcgaW4gdGhlIGFkZHJlc3Mgb2YgdGhlc2UuCisgKi8KK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzFbXSAgPSB7IDB4MjMsIDB4NjQsIDB4NjgsIDB4NjksIDB4NzMsIDB4NzQsIDB4NkYsIDB4NzIsIDB4NzksICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMltdICA9IHsgMHgyMywgMHg2NiwgMHg2OSwgMHg2RSwgMHg2MSwgMHg2QywgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8zW10gID0geyAweDIzLCAweDY5LCAweDZFLCAweDY5LCAweDc0LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzRbXSAgPSB7IDB4MjMsIDB4NjksIDB4NkUsIDB4NjksIDB4NzQsIDB4NjksIDB4NjEsIDB4NkMsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfNVtdICA9IHsgMHgyMywgMHg3MiwgMHg2NSwgMHg3NCwgMHg3NSwgMHg3MiwgMHg2RSwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF82W10gID0geyAweDIzLCAweDczLCAweDY4LCAweDY5LCAweDczLCAweDc0LCAweDZGLCAweDcyLCAweDc5LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzdbXSAgPSB7IDB4MjMsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzIsIDB4NzQsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfOFtdICA9IHsgMHgyMywgMHg3MywgMHg3NCwgMHg2NiwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF85W10gID0geyAweDIzLCAweDczLCAweDc0LCAweDczLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzEwW10gID0geyAweDIzLCAweDc0LCAweDY1LCAweDcyLCAweDZELCAweDY5LCAweDZFLCAweDYxLCAweDZDLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzExW10gID0geyAweDI0LCAweDNBLCAweDYzLCAweDZGLCAweDZELCAweDZELCAweDY1LCAweDZFLCAweDc0LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzEyW10gID0geyAweDI0LCAweDNBLCAweDY0LCAweDY1LCAweDYyLCAweDc1LCAweDY3LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzEzW10gID0geyAweDI0LCAweDNBLCAweDY5LCAweDZFLCAweDY2LCAweDZGLCAweDcyLCAweDZELCAweDYxLCAweDZDLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzE0W10gID0geyAweDI0LCAweDNBLCAweDc0LCAweDcyLCAweDYxLCAweDYzLCAweDY1LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzE1W10gID0geyAweDI0LCAweDY1LCAweDZFLCAweDc2LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzE2W10gID0geyAweDI0LCAweDcwLCAweDYxLCAweDcyLCAweDY1LCAweDZFLCAweDc0LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzE3W10gID0geyAweDI0LCAweDczLCAweDY1LCAweDZDLCAweDY2LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzE4W10gID0geyAweDI0LCAweDczLCAweDc1LCAweDcwLCAweDY1LCAweDcyLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzE5W10gID0geyAweDI0LCAweDc0LCAweDY4LCAweDY5LCAweDczLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzIwW10gID0geyAweDJELCAweDJELCAweDNFLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzIxW10gID0geyAweDJELCAweDNFLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzIyW10gID0geyAweDNDLCAweDJELCAweDJELCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzIzW10gID0geyAweDNDLCAweDJELCAweDNFLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzI0W10gID0geyAweDNDLCAweDNELCAweDNELCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzI1W10gID0geyAweDNELCAweDNELCAweDNFLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzI2W10gID0geyAweDQwLCAweDYxLCAweDYyLCAweDZGLCAweDcyLCAweDc0LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzI3W10gID0geyAweDQwLCAweDYyLCAweDY1LCAweDY4LCAweDYxLCAweDc2LCAweDY5LCAweDZGLCAweDcyLCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzI4W10gID0geyAweDQwLCAweDYzLCAweDZGLCAweDZELCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzI5W10gID0geyAweDQwLCAweDYzLCAweDZGLCAweDZELCAweDcwLCAweDZGLCAweDczLCAweDY5LCAweDc0LCAweDY1LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzMwW10gID0geyAweDQwLCAweDYzLCAweDZGLCAweDZELCAweDcwLCAweDZGLCAweDczLCAweDY5LCAweDc0LCAweDY1LCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzMxW10gID0geyAweDQwLCAweDYzLCAweDZGLCAweDZFLCAweDYzLCAweDc1LCAweDcyLCAweDcyLCAweDY1LCAweDZFLCAweDYzLCAweDc5LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzMyW10gID0geyAweDQwLCAweDYzLCAweDZGLCAweDZFLCAweDczLCAweDc0LCAweDcyLCAweDYxLCAweDY5LCAweDZFLCAweDc0LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzMzW10gID0geyAweDQwLCAweDYzLCAweDcyLCAweDY1LCAweDYxLCAweDc0LCAweDY1LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzM0W10gID0geyAweDQwLCAweDY0LCAweDY1LCAweDYzLCAweDZDLCAweDYxLCAweDcyLCAweDYxLCAweDc0LCAweDY5LCAweDZGLCAweDZFLCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzM1W10gID0geyAweDQwLCAweDY0LCAweDY5LCAweDczLCAweDYxLCAweDYyLCAweDZDLCAweDY1LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzM2W10gID0geyAweDQwLCAweDY0LCAweDY5LCAweDc2LCAweDY1LCAweDcyLCAweDczLCAweDY5LCAweDc0LCAweDc5LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzM3W10gID0geyAweDQwLCAweDY1LCAweDY2LCAweDY2LCAweDY1LCAweDYzLCAweDc0LCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzM4W10gID0geyAweDQwLCAweDY1LCAweDZFLCAweDYxLCAweDYyLCAweDZDLCAweDY1LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzM5W10gID0geyAweDQwLCAweDY1LCAweDc4LCAweDY1LCAweDYzLCAweDc1LCAweDc0LCAweDYxLCAweDYyLCAweDZDLCAweDY1LCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzQwW10gID0geyAweDQwLCAweDY2LCAweDY5LCAweDZFLCAweDYxLCAweDZDLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzQxW10gID0geyAweDQwLCAweDY2LCAweDZELCAweDZDLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzQyW10gID0geyAweDQwLCAweDY2LCAweDZGLCAweDcyLCAweDZELCAweDYxLCAweDZDLCAweDZELCAweDZDLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzQzW10gID0geyAweDQwLCAweDY3LCAweDc1LCAweDYxLCAweDcyLCAweDY0LCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzQ0W10gID0geyAweDQwLCAweDY4LCAweDY1LCAweDYxLCAweDY0LCAweDY1LCAweDcyLCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzQ1W10gID0geyAweDQwLCAweDY5LCAweDYxLCAweDYyLCAweDZGLCAweDcyLCAweDc0LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzQ2W10gID0geyAweDQwLCAweDY5LCAweDY0LCAweDY5LCAweDczLCAweDYxLCAweDYyLCAweDZDLCAweDY1LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzQ3W10gID0geyAweDQwLCAweDY5LCAweDY1LCAweDZFLCAweDYxLCAweDYyLCAweDZDLCAweDY1LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzQ4W10gID0geyAweDQwLCAweDY5LCAweDZELCAweDcwLCAweDZGLCAweDcyLCAweDc0LCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzQ5W10gID0geyAweDQwLCAweDY5LCAweDZFLCAweDYzLCAweDZDLCAweDc1LCAweDY0LCAweDY1LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzUwW10gID0geyAweDQwLCAweDY5LCAweDZFLCAweDY5LCAweDc0LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzUxW10gID0geyAweDQwLCAweDY5LCAweDZFLCAweDZGLCAweDc1LCAweDc0LCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzUyW10gID0geyAweDQwLCAweDY5LCAweDZFLCAweDcwLCAweDc1LCAweDc0LCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzUzW10gID0geyAweDQwLCAweDY5LCAweDZFLCAweDczLCAweDc0LCAweDYxLCAweDZFLCAweDYzLCAweDY1LCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzU0W10gID0geyAweDQwLCAweDY5LCAweDZFLCAweDc0LCAweDY1LCAweDcyLCAweDYxLCAweDYzLCAweDc0LCAweDY5LCAweDZGLCAweDZFLCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzU1W10gID0geyAweDQwLCAweDY5LCAweDcyLCAweDc1LCAweDZFLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzU2W10gID0geyAweDQwLCAweDZELCAweDYxLCAweDYzLCAweDY4LCAweDY5LCAweDZFLCAweDY1LCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzU3W10gID0geyAweDQwLCAweDZELCAweDYxLCAweDYzLCAweDcyLCAweDZGLCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzU4W10gID0geyAweDQwLCAweDZELCAweDZGLCAweDYzLCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzU5W10gID0geyAweDQwLCAweDZELCAweDZGLCAweDY0LCAweDY1LCAweDZDLCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzYwW10gID0geyAweDQwLCAweDZELCAweDZGLCAweDY1LCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzYxW10gID0geyAweDQwLCAweDZGLCAweDZFLCAweDVGLCAweDc3LCAweDcyLCAweDY5LCAweDc0LCAweDY1LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzYyW10gID0geyAweDQwLCAweDZGLCAweDcwLCAweDc0LCAweDY5LCAweDZGLCAweDZFLCAweDczLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzYzW10gID0geyAweDQwLCAweDZGLCAweDc1LCAweDc0LCAweDcwLCAweDc1LCAweDc0LCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzY0W10gID0geyAweDQwLCAweDcwLCAweDYxLCAweDYzLCAweDZCLCAweDYxLCAweDY3LCAweDY1LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzY1W10gID0geyAweDQwLCAweDcwLCAweDYxLCAweDcyLCAweDYxLCAweDZELCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzY2W10gID0geyAweDQwLCAweDcwLCAweDYxLCAweDcyLCAweDYxLCAweDZELCAweDY1LCAweDc0LCAweDY1LCAweDcyLCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzY3W10gID0geyAweDQwLCAweDcwLCAweDcyLCAweDY5LCAweDc2LCAweDYxLCAweDc0LCAweDY1LCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzY4W10gID0geyAweDQwLCAweDcwLCAweDcyLCAweDZGLCAweDYzLCAweDY1LCAweDY0LCAweDc1LCAweDcyLCAweDY1LCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzY5W10gID0geyAweDQwLCAweDcwLCAweDcyLCAweDZGLCAweDcwLCAweDY1LCAweDcyLCAweDc0LCAweDc5LCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzcwW10gID0geyAweDQwLCAweDcwLCAweDcyLCAweDZGLCAweDc0LCAweDY1LCAweDYzLCAweDc0LCAweDY1LCAweDY0LCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzcxW10gID0geyAweDQwLCAweDcwLCAweDcyLCAweDZGLCAweDc0LCAweDZGLCAweDc0LCAweDc5LCAweDcwLCAweDY1LCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzcyW10gID0geyAweDQwLCAweDcwLCAweDc1LCAweDYyLCAweDZDLCAweDY5LCAweDYzLCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzczW10gID0geyAweDQwLCAweDcyLCAweDY1LCAweDY3LCAweDY5LCAweDZGLCAweDZFLCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0Xzc0W10gID0geyAweDQwLCAweDcyLCAweDY1LCAweDc0LCAweDc1LCAweDcyLCAweDZFLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0Xzc1W10gID0geyAweDQwLCAweDcyLCAweDY1LCAweDc0LCAweDc1LCAweDcyLCAweDZFLCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0Xzc2W10gID0geyAweDQwLCAweDcyLCAweDY1LCAweDc0LCAweDc1LCAweDcyLCAweDZFLCAweDczLCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0Xzc3W10gID0geyAweDQwLCAweDcyLCAweDZGLCAweDc1LCAweDc0LCAweDY5LCAweDZFLCAweDY1LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0Xzc4W10gID0geyAweDQwLCAweDcyLCAweDZGLCAweDc1LCAweDc0LCAweDY5LCAweDZFLCAweDY1LCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0Xzc5W10gID0geyAweDQwLCAweDcyLCAweDc0LCAweDYzLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzgwW10gID0geyAweDQwLCAweDcyLCAweDc1LCAweDZFLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzgxW10gID0geyAweDQwLCAweDczLCAweDYzLCAweDY4LCAweDY1LCAweDY0LCAweDc1LCAweDZDLCAweDY1LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzgyW10gID0geyAweDQwLCAweDczLCAweDc0LCAweDYxLCAweDcyLCAweDc0LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzgzW10gID0geyAweDQwLCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAweDZELCAweDYxLCAweDYzLCAweDY4LCAweDY5LCAweDZFLCAweDY1LCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0Xzg0W10gID0geyAweDQwLCAweDczLCAweDc0LCAweDZGLCAweDcwLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0Xzg1W10gID0geyAweDQwLCAweDczLCAweDc5LCAweDczLCAweDc0LCAweDY1LCAweDZELCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0Xzg2W10gID0geyAweDQwLCAweDc0LCAweDY3LCAweDc1LCAweDYxLCAweDcyLCAweDY0LCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0Xzg3W10gID0geyAweDQwLCAweDc0LCAweDcyLCAweDYxLCAweDZFLCAweDczLCAweDY5LCAweDc0LCAweDY5LCAweDZGLCAweDZFLCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0Xzg4W10gID0geyAweDQwLCAweDc0LCAweDcyLCAweDY5LCAweDY3LCAweDY3LCAweDY1LCAweDcyLCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0Xzg5W10gID0geyAweDQwLCAweDc4LCAweDY2LCAweDZELCAweDZDLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzkwW10gID0geyAweDQwLCAweDc4LCAweDY2LCAweDczLCAweDcwLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzkxW10gID0geyAweDQwLCAweDc4LCAweDZDLCAweDY5LCAweDYxLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzkyW10gID0geyAweDYxLCAweDYyLCAweDZGLCAweDcyLCAweDc0LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzkzW10gID0geyAweDYxLCAweDYyLCAweDczLCAweDY1LCAweDZFLCAweDc0LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0Xzk0W10gID0geyAweDYxLCAweDYzLCAweDc0LCAweDY5LCAweDc2LCAweDY5LCAweDc0LCAweDc5LCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0Xzk1W10gID0geyAweDYxLCAweDZFLCAweDY0LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0Xzk2W10gID0geyAweDYxLCAweDZFLCAweDc5LCAweDYzLCAweDYxLCAweDczLCAweDc0LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0Xzk3W10gID0geyAweDYxLCAweDcyLCAweDcyLCAweDYxLCAweDc5LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0Xzk4W10gID0geyAweDYxLCAweDc2LCAweDZELCAweDYzLCAweDZGLCAweDY0LCAweDY1LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0Xzk5W10gID0geyAweDYyLCAweDY5LCAweDZFLCAweDY0LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzEwMFtdICA9IHsgMHg2MiwgMHg2OSwgMHg2RSwgMHg2NCwgMHgzQSwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8xMDFbXSAgPSB7IDB4NjIsIDB4NkYsIDB4NkYsIDB4NkMsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMTAyW10gID0geyAweDYyLCAweDZGLCAweDZGLCAweDZDLCAweDY1LCAweDYxLCAweDZFLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzEwM1tdICA9IHsgMHg2MiwgMHg3MiwgMHg2NSwgMHg2MSwgMHg2QiwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8xMDRbXSAgPSB7IDB4NjIsIDB4NzIsIDB4NkYsIDB4NjEsIDB4NjQsIDB4NjMsIDB4NjEsIDB4NzMsIDB4NzQsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMTA1W10gID0geyAweDYyLCAweDc1LCAweDY2LCAweDY2LCAweDY1LCAweDcyLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzEwNltdICA9IHsgMHg2MywgMHg2MSwgMHg2QywgMHg2QywgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8xMDdbXSAgPSB7IDB4NjMsIDB4NjgsIDB4NjEsIDB4NkUsIDB4NjcsIDB4NjUsIDB4NjQsIDB4MjMsIDB4NzQsIDB4NkYsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMTA4W10gID0geyAweDYzLCAweDY4LCAweDYxLCAweDZFLCAweDY3LCAweDY1LCAweDY0LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzEwOVtdICA9IHsgMHg2MywgMHg2OCwgMHg2MSwgMHg2RSwgMHg2RSwgMHg2NSwgMHg2QywgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8xMTBbXSAgPSB7IDB4NjMsIDB4NjgsIDB4NjEsIDB4NzIsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMTExW10gID0geyAweDYzLCAweDY4LCAweDYxLCAweDcyLCAweDYxLCAweDYzLCAweDc0LCAweDY1LCAweDcyLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzExMltdICA9IHsgMHg2MywgMHg2OCwgMHg2NSwgMHg2MywgMHg2QiwgMHg3MywgMHg2MSwgMHg3NCwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8xMTNbXSAgPSB7IDB4NjMsIDB4NjgsIDB4NkYsIDB4NjksIDB4NjMsIDB4NjUsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMTE0W10gID0geyAweDYzLCAweDZDLCAweDYxLCAweDczLCAweDczLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzExNVtdICA9IHsgMHg2MywgMHg2QywgMHg2RiwgMHg2MywgMHg2QiwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8xMTZbXSAgPSB7IDB4NjMsIDB4NkYsIDB4NkUsIDB4NkUsIDB4NjUsIDB4NjMsIDB4NzQsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMTE3W10gID0geyAweDYzLCAweDZGLCAweDZFLCAweDZFLCAweDY1LCAweDYzLCAweDc0LCAweDZGLCAweDcyLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzExOFtdICA9IHsgMHg2MywgMHg2RiwgMHg2RSwgMHg3MywgMHg3NCwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8xMTlbXSAgPSB7IDB4NjMsIDB4NkYsIDB4NkUsIDB4NzQsIDB4NjksIDB4NkUsIDB4NzUsIDB4NjUsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMTIwW10gID0geyAweDYzLCAweDc0LCAweDY5LCAweDZELCAweDY1LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzEyMVtdICA9IHsgMHg2MywgMHg3NCwgMHg2RiwgMHg3MiwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8xMjJbXSAgPSB7IDB4NjMsIDB4NzQsIDB4NzgsIDB4M0EsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMTIzW10gID0geyAweDY0LCAweDY1LCAweDczLCAweDc0LCAweDcyLCAweDZGLCAweDc5LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzEyNFtdICA9IHsgMHg2NCwgMHg2OSwgMHg3MywgMHg2MSwgMHg2MiwgMHg2QywgMHg2NSwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8xMjVbXSAgPSB7IDB4NjQsIDB4NkYsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMTI2W10gID0geyAweDY0LCAweDZGLCAweDc1LCAweDYyLCAweDZDLCAweDY1LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzEyN1tdICA9IHsgMHg2NCwgMHg3NCwgMHg2OSwgMHg2RCwgMHg2NSwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8xMjhbXSAgPSB7IDB4NjQsIDB4NzksIDB4NkUsIDB4NjEsIDB4NkQsIDB4NjksIDB4NjMsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMTI5W10gID0geyAweDY1LCAweDZDLCAweDczLCAweDY1LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzEzMFtdICA9IHsgMHg2NSwgMHg2QywgMHg3MywgMHg2NSwgMHg2OSwgMHg2NiwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8xMzFbXSAgPSB7IDB4NjUsIDB4NkUsIDB4NjEsIDB4NjIsIDB4NkMsIDB4NjUsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMTMyW10gID0geyAweDY1LCAweDZFLCAweDc1LCAweDZELCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzEzM1tdICA9IHsgMHg2NSwgMHg2RSwgMHg3NiwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8xMzRbXSAgPSB7IDB4NjUsIDB4NzYsIDB4NjUsIDB4NkUsIDB4NzQsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMTM1W10gID0geyAweDY1LCAweDc4LCAweDY5LCAweDc0LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzEzNltdICA9IHsgMHg2NiwgMHg2MSwgMHg2QywgMHg3MywgMHg2NSwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8xMzdbXSAgPSB7IDB4NjYsIDB4NjksIDB4NjYsIDB4NkYsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMTM4W10gID0geyAweDY2LCAweDY5LCAweDZFLCAweDYxLCAweDZDLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzEzOVtdICA9IHsgMHg2NiwgMHg2QywgMHg2RiwgMHg2MSwgMHg3NCwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8xNDBbXSAgPSB7IDB4NjYsIDB4NkMsIDB4NkYsIDB4NzcsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMTQxW10gID0geyAweDY2LCAweDZGLCAweDcyLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzE0MltdICA9IHsgMHg2NiwgMHg2RiwgMHg3MiwgMHg2QiwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8xNDNbXSAgPSB7IDB4NjYsIDB4NzIsIDB4NkYsIDB4NkQsIDB4M0EsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMTQ0W10gID0geyAweDY2LCAweDc1LCAweDZFLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzE0NVtdICA9IHsgMHg2NywgMHg2RiwgMHg3NCwgMHg2RiwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8xNDZbXSAgPSB7IDB4NjcsIDB4NzUsIDB4NjEsIDB4NzIsIDB4NjQsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMTQ3W10gID0geyAweDY5LCAweDYxLCAweDYyLCAweDZGLCAweDcyLCAweDc0LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzE0OFtdICA9IHsgMHg2OSwgMHg2NCwgMHg2OSwgMHg3MywgMHg2MSwgMHg2MiwgMHg2QywgMHg2NSwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8xNDlbXSAgPSB7IDB4NjksIDB4NjUsIDB4NkUsIDB4NjEsIDB4NjIsIDB4NkMsIDB4NjUsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMTUwW10gID0geyAweDY5LCAweDY2LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzE1MVtdICA9IHsgMHg2OSwgMHg2RSwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8xNTJbXSAgPSB7IDB4NjksIDB4NkUsIDB4NjksIDB4NzQsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMTUzW10gID0geyAweDY5LCAweDZFLCAweDY5LCAweDc0LCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzE1NFtdICA9IHsgMHg2OSwgMHg2RSwgMHg2RiwgMHg3NSwgMHg3NCwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8xNTVbXSAgPSB7IDB4NjksIDB4NkUsIDB4NzAsIDB4NzUsIDB4NzQsIDB4MjMsIDB4NjIsIDB4NzUsIDB4NjYsIDB4NjYsIDB4NjUsIDB4NzIsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMTU2W10gID0geyAweDY5LCAweDZFLCAweDcwLCAweDc1LCAweDc0LCAweDIzLCAweDY1LCAweDZFLCAweDc2LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzE1N1tdICA9IHsgMHg2OSwgMHg2RSwgMHg3MCwgMHg3NSwgMHg3NCwgMHgyMywgMHg2NiwgMHg2QywgMHg2RiwgMHg3NywgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8xNThbXSAgPSB7IDB4NjksIDB4NkUsIDB4NzAsIDB4NzUsIDB4NzQsIDB4MjMsIDB4NzIsIDB4NjQsIDB4NzYsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMTU5W10gID0geyAweDY5LCAweDZFLCAweDcwLCAweDc1LCAweDc0LCAweDIzLCAweDczLCAweDYxLCAweDc2LCAweDY1LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzE2MFtdICA9IHsgMHg2OSwgMHg2RSwgMHg3MCwgMHg3NSwgMHg3NCwgMHgyMywgMHg3NiwgMHg2MSwgMHg3MiwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8xNjFbXSAgPSB7IDB4NjksIDB4NkUsIDB4NzAsIDB4NzUsIDB4NzQsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMTYyW10gID0geyAweDY5LCAweDZFLCAweDcwLCAweDc1LCAweDc0LCAweDVGLCAweDY1LCAweDZFLCAweDYxLCAweDYyLCAweDZDLCAweDY1LCAweDY0LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzE2M1tdICA9IHsgMHg2OSwgMHg2RSwgMHg3MywgMHg3NCwgMHg2MSwgMHg2RSwgMHg2MywgMHg2NSwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8xNjRbXSAgPSB7IDB4NjksIDB4NkUsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NkUsIDB4NjMsIDB4NjUsIDB4M0EsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMTY1W10gID0geyAweDY5LCAweDZFLCAweDc0LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzE2NltdICA9IHsgMHg2OSwgMHg2RSwgMHg3NCwgMHg2NSwgMHg2NywgMHg2NSwgMHg3MiwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8xNjdbXSAgPSB7IDB4NjksIDB4NkUsIDB4NzQsIDB4NjUsIDB4NzIsIDB4NzYsIDB4NjEsIDB4NkMsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMTY4W10gID0geyAweDZBLCAweDZGLCAweDY5LCAweDZFLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzE2OVtdICA9IHsgMHg2QywgMHg2MSwgMHg2RCwgMHg2MiwgMHg2NCwgMHg2MSwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8xNzBbXSAgPSB7IDB4NkMsIDB4NjksIDB4NjYsIDB4NjUsIDB4NkMsIDB4NjksIDB4NkUsIDB4NjUsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMTcxW10gID0geyAweDZDLCAweDY5LCAweDY2LCAweDZGLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzE3MltdICA9IHsgMHg2QywgMHg2OSwgMHg3MywgMHg3NCwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8xNzNbXSAgPSB7IDB4NkQsIDB4NjEsIDB4NjMsIDB4NjgsIDB4NjksIDB4NkUsIDB4NjUsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMTc0W10gID0geyAweDZELCAweDYxLCAweDYzLCAweDcyLCAweDZGLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzE3NVtdICA9IHsgMHg2RCwgMHg2MSwgMHg3OCwgMHgzQSwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8xNzZbXSAgPSB7IDB4NkQsIDB4NjUsIDB4NzMsIDB4NzMsIDB4NjEsIDB4NjcsIDB4NjUsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMTc3W10gID0geyAweDZELCAweDZGLCAweDYzLCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzE3OFtdICA9IHsgMHg2RCwgMHg2RiwgMHg2NCwgMHg2NSwgMHg2QywgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8xNzlbXSAgPSB7IDB4NkQsIDB4NkYsIDB4NjQsIDB4NjUsIDB4NkMsIDB4M0EsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMTgwW10gID0geyAweDZELCAweDc1LCAweDZDLCAweDc0LCAweDY5LCAweDYzLCAweDYxLCAweDczLCAweDc0LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzE4MVtdICA9IHsgMHg2RCwgMHg3NSwgMHg2QywgMHg3NCwgMHg2OSwgMHg2NiwgMHg2OSwgMHg2NiwgMHg2RiwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8xODJbXSAgPSB7IDB4NkQsIDB4NzUsIDB4NkMsIDB4NzQsIDB4NjksIDB4NkMsIDB4NjksIDB4NjYsIDB4NkYsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMTgzW10gID0geyAweDZELCAweDc1LCAweDZDLCAweDc0LCAweDY5LCAweDcwLCAweDZDLCAweDY5LCAweDYzLCAweDY5LCAweDc0LCAweDc5LCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzE4NFtdICA9IHsgMHg2RCwgMHg3NSwgMHg2QywgMHg3NCwgMHg2OSwgMHg3MiwgMHg2NCwgMHg3NiwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8xODVbXSAgPSB7IDB4NkQsIDB4NzUsIDB4NkMsIDB4NzQsIDB4NjksIDB4NzMsIDB4NjUsIDB4NzQsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMTg2W10gID0geyAweDZFLCAweDY1LCAweDc3LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzE4N1tdICA9IHsgMHg2RSwgMHg3NSwgMHg2QywgMHg2QywgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8xODhbXSAgPSB7IDB4NkUsIDB4NzUsIDB4NkMsIDB4NkMsIDB4M0MsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMTg5W10gID0geyAweDZGLCAweDcwLCAweDY1LCAweDcyLCAweDYxLCAweDc0LCAweDZGLCAweDcyLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzE5MFtdICA9IHsgMHg2RiwgMHg3MiwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8xOTFbXSAgPSB7IDB4NkYsIDB4NzUsIDB4NzQsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMTkyW10gID0geyAweDZGLCAweDc1LCAweDc0LCAweDcwLCAweDc1LCAweDc0LCAweDIzLCAweDYyLCAweDc1LCAweDY2LCAweDY2LCAweDY1LCAweDcyLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzE5M1tdICA9IHsgMHg2RiwgMHg3NSwgMHg3NCwgMHg3MCwgMHg3NSwgMHg3NCwgMHgyMywgMHg2NSwgMHg2RSwgMHg3NiwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8xOTRbXSAgPSB7IDB4NkYsIDB4NzUsIDB4NzQsIDB4NzAsIDB4NzUsIDB4NzQsIDB4MjMsIDB4NjYsIDB4NkMsIDB4NkYsIDB4NzcsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMTk1W10gID0geyAweDZGLCAweDc1LCAweDc0LCAweDcwLCAweDc1LCAweDc0LCAweDIzLCAweDcyLCAweDY0LCAweDc2LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzE5NltdICA9IHsgMHg2RiwgMHg3NSwgMHg3NCwgMHg3MCwgMHg3NSwgMHg3NCwgMHgyMywgMHg3NiwgMHg2MSwgMHg3MiwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8xOTdbXSAgPSB7IDB4NkYsIDB4NzUsIDB4NzQsIDB4NzAsIDB4NzUsIDB4NzQsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMTk4W10gID0geyAweDcwLCAweDYxLCAweDYzLCAweDZCLCAweDYxLCAweDY3LCAweDY1LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzE5OVtdICA9IHsgMHg3MCwgMHg2MSwgMHg3MiwgMHg2NSwgMHg2RSwgMHg3NCwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8yMDBbXSAgPSB7IDB4NzAsIDB4NkYsIDB4NzIsIDB4NzQsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMjAxW10gID0geyAweDcwLCAweDZGLCAweDczLCAweDVGLCAweDY5LCAweDZFLCAweDc0LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzIwMltdICA9IHsgMHg3MCwgMHg2RiwgMHg3MywgMHg1RiwgMHg2OSwgMHg2RSwgMHg3NCwgMHg2NSwgMHg2NywgMHg2NSwgMHg3MiwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8yMDNbXSAgPSB7IDB4NzAsIDB4NzIsIDB4NjUsIDB4NzMsIDB4NjUsIDB4NkUsIDB4NzQsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMjA0W10gID0geyAweDcwLCAweDcyLCAweDY5LCAweDZGLCAweDcyLCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzIwNVtdICA9IHsgMHg3MCwgMHg3MiwgMHg2OSwgMHg3NiwgMHg2MSwgMHg3NCwgMHg2NSwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8yMDZbXSAgPSB7IDB4NzAsIDB4NzIsIDB4NkYsIDB4NjIsIDB4NjEsIDB4M0EsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMjA3W10gID0geyAweDcwLCAweDcyLCAweDZGLCAweDYzLCAweDY1LCAweDY0LCAweDc1LCAweDcyLCAweDY1LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzIwOFtdICA9IHsgMHg3MCwgMHg3MiwgMHg2RiwgMHg3NCwgMHg2NSwgMHg2MywgMHg3NCwgMHg2NSwgMHg2NCwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8yMDlbXSAgPSB7IDB4NzAsIDB4NzIsIDB4NkYsIDB4NzQsIDB4NkYsIDB4NzQsIDB4NzksIDB4NzAsIDB4NjUsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMjEwW10gID0geyAweDcwLCAweDcyLCAweDZGLCAweDc2LCAweDY5LCAweDY0LCAweDY1LCAweDY0LCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzIxMVtdICA9IHsgMHg3MCwgMHg3NSwgMHg2MiwgMHg2QywgMHg2OSwgMHg2MywgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8yMTJbXSAgPSB7IDB4NzIsIDB4NjEsIDB4NkQsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMjEzW10gID0geyAweDcyLCAweDYxLCAweDc0LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzIxNFtdICA9IHsgMHg3MiwgMHg2MSwgMHg3NCwgMHg2OSwgMHg2RiwgMHg2RSwgMHg2MSwgMHg2QywgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8yMTVbXSAgPSB7IDB4NzIsIDB4NjQsIDB4NzYsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMjE2W10gID0geyAweDcyLCAweDY1LCAweDYxLCAweDZDLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzIxN1tdICA9IHsgMHg3MiwgMHg2NSwgMHg2NiwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8yMThbXSAgPSB7IDB4NzIsIDB4NjUsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzIsIDB4NzQsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMjE5W10gID0geyAweDcyLCAweDY1LCAweDczLCAweDc1LCAweDZELCAweDY1LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzIyMFtdICA9IHsgMHg3MiwgMHg2NSwgMHg3NCwgMHg3NSwgMHg3MiwgMHg2RSwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8yMjFbXSAgPSB7IDB4NzIsIDB4NjUsIDB4NzQsIDB4NzUsIDB4NzIsIDB4NkUsIDB4NzMsIDB4M0EsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMjIyW10gID0geyAweDcyLCAweDZGLCAweDc1LCAweDc0LCAweDY1LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzIyM1tdICA9IHsgMHg3MiwgMHg2RiwgMHg3NSwgMHg3NCwgMHg2OSwgMHg2RSwgMHg2NSwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8yMjRbXSAgPSB7IDB4NzIsIDB4NzQsIDB4NjMsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMjI1W10gID0geyAweDcyLCAweDc1LCAweDZFLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzIyNltdICA9IHsgMHg3MiwgMHg3NiwgMHg2NSwgMHg2MywgMHg3NCwgMHg2RiwgMHg3MiwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8yMjdbXSAgPSB7IDB4NzMsIDB4NjMsIDB4NjgsIDB4NjUsIDB4NjQsIDB4NzUsIDB4NkMsIDB4NjUsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMjI4W10gID0geyAweDczLCAweDY1LCAweDZDLCAweDY2LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzIyOVtdICA9IHsgMHg3MywgMHg2NSwgMHg3NCwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8yMzBbXSAgPSB7IDB4NzMsIDB4NjksIDB4NjcsIDB4NkUsIDB4NjEsIDB4NkMsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMjMxW10gID0geyAweDczLCAweDY5LCAweDdBLCAweDY1LCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzIzMltdICA9IHsgMHg3MywgMHg2RiwgMHg2QywgMHg3NiwgMHg2NSwgMHg3MiwgMHgzQSwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8yMzNbXSAgPSB7IDB4NzMsIDB4NzQsIDB4NjEsIDB4NzIsIDB4NzQsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMjM0W10gID0geyAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDY1LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzIzNVtdICA9IHsgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg2NSwgMHg2RCwgMHg2MSwgMHg2MywgMHg2OCwgMHg2OSwgMHg2RSwgMHg2NSwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8yMzZbXSAgPSB7IDB4NzMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4NjksIDB4NjMsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMjM3W10gID0geyAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDc1LCAweDczLCAweDIzLCAweDYyLCAweDY1LCAweDY5LCAweDZFLCAweDY3LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzIzOFtdICA9IHsgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHgyMywgMHg2OSwgMHg3MywgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8yMzlbXSAgPSB7IDB4NzMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4NzUsIDB4NzMsIDB4MjMsIDB4NzcsIDB4NjEsIDB4NzMsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMjQwW10gID0geyAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDc1LCAweDczLCAweDIzLCAweDc3LCAweDY5LCAweDZDLCAweDZDLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzI0MVtdICA9IHsgMHg3MywgMHg3NCwgMHg2NSwgMHg3MCwgMHg1RiwgMHg2RCwgMHg2MSwgMHg3MiwgMHg2QiwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8yNDJbXSAgPSB7IDB4NzMsIDB4NzQsIDB4NkYsIDB4NzAsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMjQzW10gID0geyAweDczLCAweDc0LCAweDcyLCAweDY5LCAweDZFLCAweDY3LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzI0NFtdICA9IHsgMHg3MywgMHg3NCwgMHg3MiwgMHg3NSwgMHg2MywgMHg3NCwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8yNDVbXSAgPSB7IDB4NzMsIDB4NzUsIDB4NzMsIDB4NzAsIDB4NjUsIDB4NkUsIDB4NjQsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMjQ2W10gID0geyAweDczLCAweDc5LCAweDczLCAweDc0LCAweDY1LCAweDZELCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzI0N1tdICA9IHsgMHg3NCwgMHg2NywgMHg3NSwgMHg2MSwgMHg3MiwgMHg2NCwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8yNDhbXSAgPSB7IDB4NzQsIDB4NjksIDB4NkQsIDB4NjUsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMjQ5W10gID0geyAweDc0LCAweDY5LCAweDZELCAweDY1LCAweDY0LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzI1MFtdICA9IHsgMHg3NCwgMHg2RiwgMHgzQSwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8yNTFbXSAgPSB7IDB4NzQsIDB4NzIsIDB4NjEsIDB4NkUsIDB4NzMsIDB4NjksIDB4NjUsIDB4NkUsIDB4NzQsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMjUyW10gID0geyAweDc0LCAweDcyLCAweDYxLCAweDZFLCAweDczLCAweDY5LCAweDc0LCAweDY5LCAweDZGLCAweDZFLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzI1M1tdICA9IHsgMHg3NCwgMHg3MiwgMHg3NSwgMHg2NSwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8yNTRbXSAgPSB7IDB4NzQsIDB4NzksIDB4NzAsIDB4NjUsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMjU1W10gID0geyAweDc1LCAweDY0LCAweDZGLCAweDc1LCAweDYyLCAweDZDLCAweDY1LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzI1NltdICA9IHsgMHg3NSwgMHg2NiwgMHg2QywgMHg2RiwgMHg2MSwgMHg3NCwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8yNTdbXSAgPSB7IDB4NzUsIDB4NjksIDB4NkUsIDB4NzQsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMjU4W10gID0geyAweDc1LCAweDY5LCAweDZFLCAweDc0LCAweDY1LCAweDY3LCAweDY1LCAweDcyLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzI1OVtdICA9IHsgMHg3NSwgMHg2RSwgMHg2OSwgMHg2MywgMHg2MSwgMHg3MywgMHg3NCwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8yNjBbXSAgPSB7IDB4NzUsIDB4NkUsIDB4NjksIDB4NkYsIDB4NkUsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMjYxW10gID0geyAweDc1LCAweDZFLCAweDY5LCAweDc2LCAweDY1LCAweDcyLCAweDczLCAweDYxLCAweDZDLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzI2MltdICA9IHsgMHg3NSwgMHg2RSwgMHg3MywgMHg2MSwgMHg2NiwgMHg2NSwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8yNjNbXSAgPSB7IDB4NzUsIDB4NzIsIDB4NjEsIDB4NzQsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMjY0W10gID0geyAweDc1LCAweDcyLCAweDYxLCAweDc0LCAweDY5LCAweDZGLCAweDZFLCAweDYxLCAweDZDLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzI2NVtdICA9IHsgMHg3NSwgMHg3MiwgMHg2NSwgMHg2MSwgMHg2QywgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8yNjZbXSAgPSB7IDB4NzYsIDB4NjEsIDB4NkMsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMjY3W10gID0geyAweDc2LCAweDYxLCAweDcyLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzI2OFtdICA9IHsgMHg3NiwgMHg2NSwgMHg2MywgMHg3NCwgMHg2RiwgMHg3MiwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8yNjlbXSAgPSB7IDB4NzYsIDB4NjksIDB4NjEsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMjcwW10gID0geyAweDc2LCAweDZGLCAweDZDLCAweDYxLCAweDc0LCAweDY5LCAweDZDLCAweDY1LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzI3MVtdICA9IHsgMHg3NywgMHg2MSwgMHg2OSwgMHg3NCwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8yNzJbXSAgPSB7IDB4NzcsIDB4NjgsIDB4NjksIDB4NkMsIDB4NjUsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMjczW10gID0geyAweDdDLCAweDNELCAweDNFLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzI3NFtdICA9IHsgMHg3QywgMHhBNywgMHg3QywgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8yNzVbXSAgPSB7IDB4N0MsIDB4M0IsIDB4N0MsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMjc2W10gID0geyAweDdDLCAweDJFLCAweDdDLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzI3N1tdICA9IHsgMHg3QywgMHgyRiwgMHgzQiwgMHg3QywgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8yNzhbXSAgPSB7IDB4N0MsIDB4M0IsIDB4M0IsIDB4N0MsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMjc5W10gID0geyAweDdDLCAweDNFLCAweDdDLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzI4MFtdICA9IHsgMHg3QywgMHgzQywgMHg3QywgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8yODFbXSAgPSB7IDB4N0MsIDB4NzgsIDB4NkYsIDB4NzIsIDB4N0MsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMjgyW10gID0geyAweDdDLCAweDYxLCAweDZFLCAweDY0LCAweDIzLCAweDc0LCAweDY4LCAweDY1LCAweDZFLCAweDdDLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzI4M1tdICA9IHsgMHg3QywgMHg2RiwgMHg3MiwgMHgyMywgMHg2NSwgMHg2QywgMHg3MywgMHg2NSwgMHg3QywgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8yODRbXSAgPSB7IDB4N0MsIDB4MkYsIDB4N0MsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMjg1W10gID0geyAweDdDLCAweDY5LCAweDZFLCAweDY0LCAweDY1LCAweDc0LCAweDdDLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzI4NltdICA9IHsgMHg3QywgMHg2MSwgMHg3QywgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8yODdbXSAgPSB7IDB4N0MsIDB4NjEsIDB4NkUsIDB4NjQsIDB4N0MsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMjg4W10gID0geyAweDdDLCAweDZGLCAweDcyLCAweDdDLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzI4OVtdICA9IHsgMHg3QywgMHg2OSwgMHg3QywgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8yOTBbXSAgPSB7IDB4N0MsIDB4MkMsIDB4N0MsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMjkxW10gID0geyAweDdDLCAweDY2LCAweDZGLCAweDcyLCAweDZCLCAweDdDLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzI5MltdICA9IHsgMHg3QywgMHg2QSwgMHg2RiwgMHg2OSwgMHg2RSwgMHg3QywgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8yOTNbXSAgPSB7IDB4N0MsIDB4N0MsIDB4NjEsIDB4N0MsIDB4N0MsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMjk0W10gID0geyAweDdDLCAweDdDLCAweDYxLCAweDZFLCAweDY0LCAweDdDLCAweDdDLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzI5NVtdICA9IHsgMHg3QywgMHg3QywgMHg2RiwgMHg3MiwgMHg3QywgMHg3QywgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8yOTZbXSAgPSB7IDB4N0MsIDB4N0MsIDB4NjksIDB4N0MsIDB4N0MsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMjk3W10gID0geyAweDdDLCAweDdDLCAweDJDLCAweDdDLCAweDdDLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzI5OFtdICA9IHsgMHgzQSwgMHgzRCwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8yOTlbXSAgPSB7IDB4M0QsIDB4M0EsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMzAwW10gID0geyAweDNDLCAweDJELCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzMwMVtdICA9IHsgMHgzQSwgMHgzQSwgMHgzRCwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8zMDJbXSAgPSB7IDB4M0MsIDB4M0QsIDB4M0MsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMzAzW10gID0geyAweDVFLCAweDNELCAweDNDLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzMwNFtdICA9IHsgMHg1RSwgMHgzRCwgMHgzRSwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8zMDVbXSAgPSB7IDB4M0UsIDB4M0QsIDB4M0UsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMzA2W10gID0geyAweDVCLCAweDVFLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzMwN1tdICA9IHsgMHgyOCwgMHgzQSwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8zMDhbXSAgPSB7IDB4N0IsIDB4M0EsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMzA5W10gID0geyAweDI1LCAweDI4LCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzMxMFtdICA9IHsgMHgyNSwgMHgyOCwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8zMTFbXSAgPSB7IDB4MjksIDB4MjUsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMzEyW10gID0geyAweDNBLCAweDNFLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzMxM1tdICA9IHsgMHgyNCwgMHg3QiwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8zMTRbXSAgPSB7IDB4N0QsIDB4MjQsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMzE1W10gID0geyAweDI1LCAweDdCLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzMxNltdICA9IHsgMHg3RCwgMHgyNSwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8zMTdbXSAgPSB7IDB4NUIsIDB4N0MsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMzE4W10gID0geyAweDdDLCAweDVELCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzMxOVtdICA9IHsgMHg1QiwgMHg3QiwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8zMjBbXSAgPSB7IDB4N0QsIDB4NUQsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMzIxW10gID0geyAweDJFLCAweDJFLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzMyMltdICA9IHsgMHgzQSwgMHgzQSwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8zMjNbXSAgPSB7IDB4MjYsIDB4MjYsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMzI0W10gID0geyAweDYxLCAweDZFLCAweDY0LCAweDIzLCAweDc0LCAweDY4LCAweDY1LCAweDZFLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzMyNVtdICA9IHsgMHgyNiwgMHgyNiwgMHgzRCwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8zMjZbXSAgPSB7IDB4MjYsIDB4MjYsIDB4M0EsIDB4M0QsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMzI3W10gID0geyAweDI2LCAweDI2LCAweDNELCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzMyOFtdICA9IHsgMHg2RSwgMHg2RiwgMHg3NCwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8zMjlbXSAgPSB7IDB4N0MsIDB4N0MsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMzMwW10gID0geyAweDZGLCAweDcyLCAweDIzLCAweDY1LCAweDZDLCAweDczLCAweDY1LCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzMzMVtdICA9IHsgMHg3QywgMHg3QywgMHgzRCwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8zMzJbXSAgPSB7IDB4N0MsIDB4N0MsIDB4M0EsIDB4M0QsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMzMzW10gID0geyAweDdDLCAweDdDLCAweDNELCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzMzNFtdICA9IHsgMHg3OCwgMHg2RiwgMHg3MiwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8zMzVbXSAgPSB7IDB4M0QsIDB4M0QsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMzM2W10gID0geyAweDIxLCAweDNELCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzMzN1tdICA9IHsgMHgzRCwgMHgzRCwgMHgzRCwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8zMzhbXSAgPSB7IDB4M0QsIDB4MjEsIDB4M0QsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMzM5W10gID0geyAweDNELCAweDJGLCAweDNELCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzM0MFtdICA9IHsgMHgzQywgMHgzRCwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8zNDFbXSAgPSB7IDB4M0UsIDB4M0QsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMzQyW10gID0geyAweDJCLCAweDNELCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzM0M1tdICA9IHsgMHgyQiwgMHgzQSwgMHgzRCwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8zNDRbXSAgPSB7IDB4MkIsIDB4M0QsIDB4M0EsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMzQ1W10gID0geyAweDJCLCAweDJCLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzM0NltdICA9IHsgMHgyRCwgMHgzRCwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8zNDdbXSAgPSB7IDB4MkQsIDB4M0EsIDB4M0QsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMzQ4W10gID0geyAweDJELCAweDNELCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzM0OVtdICA9IHsgMHgyRCwgMHgyRCwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8zNTBbXSAgPSB7IDB4MkEsIDB4M0QsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMzUxW10gID0geyAweDJBLCAweDNBLCAweDNELCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzM1MltdICA9IHsgMHgyQSwgMHgzRCwgMHgzQSwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8zNTNbXSAgPSB7IDB4MkYsIDB4M0QsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMzU0W10gID0geyAweDJGLCAweDNBLCAweDNELCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzM1NVtdICA9IHsgMHgyRiwgMHgzRCwgMHgzQSwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8zNTZbXSAgPSB7IDB4MjUsIDB4M0QsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMzU3W10gID0geyAweDI1LCAweDNBLCAweDNELCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzM1OFtdICA9IHsgMHgyNSwgMHgzRCwgMHgzQSwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8zNTlbXSAgPSB7IDB4M0UsIDB4M0UsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMzYwW10gID0geyAweDNFLCAweDNFLCAweDNELCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzM2MVtdICA9IHsgMHgzRSwgMHgzRSwgMHgzQSwgMHgzRCwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8zNjJbXSAgPSB7IDB4M0UsIDB4M0UsIDB4M0QsIDB4M0EsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMzYzW10gID0geyAweDNDLCAweDNDLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzM2NFtdICA9IHsgMHgzQywgMHgzQywgMHgzRCwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8zNjVbXSAgPSB7IDB4M0MsIDB4M0MsIDB4M0EsIDB4M0QsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMzY2W10gID0geyAweDNDLCAweDNDLCAweDNELCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzM2N1tdICA9IHsgMHgyNiwgMHgzRCwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8zNjhbXSAgPSB7IDB4MjYsIDB4M0EsIDB4M0QsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMzY5W10gID0geyAweDI2LCAweDNELCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzM3MFtdICA9IHsgMHg3QywgMHgzRCwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8zNzFbXSAgPSB7IDB4N0MsIDB4M0EsIDB4M0QsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMzcyW10gID0geyAweDdDLCAweDNELCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzM3M1tdICA9IHsgMHg1RSwgMHgzRCwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8zNzRbXSAgPSB7IDB4NUUsIDB4M0EsIDB4M0QsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMzc1W10gID0geyAweDVFLCAweDNELCAweDNBLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzM3NltdICA9IHsgMHg0QywgMHg3NSwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8zNzdbXSAgPSB7IDB4NEMsIDB4NTUsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMzc4W10gID0geyAweDc1LCAweDRDLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzM3OVtdICA9IHsgMHg1NSwgMHg0QywgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8zODBbXSAgPSB7IDB4MzAsIDB4NjIsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMzgxW10gID0geyAweDMwLCAweDQyLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzM4MltdICA9IHsgMHgzMCwgMHg3OCwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8zODNbXSAgPSB7IDB4MzAsIDB4NTgsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMzg0W10gID0geyAweDY1LCAweDJCLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzM4NVtdICA9IHsgMHg0NSwgMHgyQiwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8zODZbXSAgPSB7IDB4NjUsIDB4MkQsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMzg3W10gID0geyAweDQ1LCAweDJELCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKK3N0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzM4OFtdICA9IHsgMHgyRiwgMHgyRiwgIEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUn07CitzdGF0aWMgQU5UTFIzX1VDSEFSCWxpdF8zODlbXSAgPSB7IDB4MkYsIDB4MkEsICBBTlRMUjNfU1RSSU5HX1RFUk1JTkFUT1J9Oworc3RhdGljIEFOVExSM19VQ0hBUglsaXRfMzkwW10gID0geyAweDJBLCAweDJGLCAgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfTsKKworCisKKworCisvKiBNQUNST1MgdGhhdCBoaWRlIHRoZSBDIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbnMgZnJvbSB0aGUKKyAqIGdlbmVyYXRlZCBjb2RlLCB3aGljaCBtYWtlcyBpdCBhIGxpdHRsZSBtb3JlIHVuZGVyc3RhbmRhYmxlIHRvIHRoZSBodW1hbiBleWUuCisgKiBJIGFtIHZlcnkgbXVjaCBhZ2FpbnN0IHVzaW5nIEMgcHJlLXByb2Nlc3NvciBtYWNyb3MgZm9yIGZ1bmN0aW9uIGNhbGxzIGFuZCBiaXRzCisgKiBvZiBjb2RlIGFzIHlvdSBjYW5ub3Qgc2VlIHdoYXQgaXMgaGFwcGVuaW5nIHdoZW4gc2luZ2xlIHN0ZXBwaW5nIGluIGRlYnVnZ2VycworICogYW5kIHNvIG9uLiBUaGUgZXhjZXB0aW9uIChpbiBteSBib29rIGF0IGxlYXN0KSBpcyBmb3IgZ2VuZXJhdGVkIGNvZGUsIHdoZXJlIHlvdSBhcmUKKyAqIG5vdCBtYWludGFpbmluZyBpdCwgYnV0IG1heSB3aXNoIHRvIHJlYWQgYW5kIHVuZGVyc3RhbmQgaXQuIElmIHlvdSBzaW5nbGUgc3RlcCBpdCwgeW91IGtub3cgdGhhdCBpbnB1dCgpCisgKiBoaWRlcyBzb21lIGluZGlyZWN0IGNhbGxzLCBidXQgaXMgYWx3YXlzIHJlZmVycmluZyB0byB0aGUgaW5wdXQgc3RyZWFtLiBUaGlzIGlzCisgKiBwcm9iYWJseSBtb3JlIHJlYWRhYmxlIHRoYW4gY3R4LT5pbnB1dC0+aXN0cmVhbS0+aW5wdXQoc25hcmZsZTAtPmJsYXJnKSBhbmQgYWxsb3dzIG1lIHRvIHJlamlnCisgKiB0aGUgcnVudGltZSBpbnRlcmZhY2VzIHdpdGhvdXQgY2hhbmdpbmcgdGhlIGdlbmVyYXRlZCBjb2RlIHRvbyBvZnRlbiwgd2l0aG91dAorICogY29uZnVzaW5nIHRoZSByZWFkZXIgb2YgdGhlIGdlbmVyYXRlZCBvdXRwdXQsIHdobyBtYXkgbm90IHdpc2ggdG8ga25vdyB0aGUgZ29yeQorICogZGV0YWlscyBvZiB0aGUgaW50ZXJmYWNlIGluaGVyaXRhbmNlLgorICovCisKKyNkZWZpbmUJCUNUWAljdHgKKworLyogQWlkcyBpbiBhY2Nlc3Npbmcgc2NvcGVzIGZvciBncmFtbWFyIHByb2dyYW1tZXJzCisgKi8KKyN1bmRlZglTQ09QRV9UWVBFCisjdW5kZWYJU0NPUEVfU1RBQ0sKKyN1bmRlZglTQ09QRV9UT1AKKyNkZWZpbmUJU0NPUEVfVFlQRShzY29wZSkgICBwZm1sTGV4ZXJfIyNzY29wZSMjX1NDT1BFCisjZGVmaW5lIFNDT1BFX1NUQUNLKHNjb3BlKSAgcGZtbExleGVyXyMjc2NvcGUjI1N0YWNrCisjZGVmaW5lCVNDT1BFX1RPUChzY29wZSkgICAgY3R4LT5wZm1sTGV4ZXJfIyNzY29wZSMjVG9wCisjZGVmaW5lCVNDT1BFX1NJWkUoc2NvcGUpCQljdHgtPnBmbWxMZXhlcl8jI3Njb3BlIyNTdGFja19saW1pdAorI2RlZmluZSBTQ09QRV9JTlNUQU5DRShzY29wZSwgaSkJKGN0eC0+U0NPUEVfU1RBQ0soc2NvcGUpLT5nZXQoY3R4LT5TQ09QRV9TVEFDSyhzY29wZSksaSkpCisKKworLyogTWFjcm9zIGZvciBhY2Nlc3NpbmcgdGhpbmdzIGluIGEgbGV4ZXIKKyAqLworI3VuZGVmCSAgICBMRVhFUgorI3VuZGVmCSAgICBSRUNPR05JWkVSCisjdW5kZWYJICAgIFJVTEVNRU1PCisjdW5kZWYJICAgIEdFVENIQVJJTkRFWAorI3VuZGVmCSAgICBHRVRMSU5FCisjdW5kZWYJICAgIEdFVENIQVJQT1NJVElPTklOTElORQorI3VuZGVmCSAgICBFTUlUCisjdW5kZWYJICAgIEVNSVRORVcKKyN1bmRlZgkgICAgTUFUQ0hDCisjdW5kZWYJICAgIE1BVENIUworI3VuZGVmCSAgICBNQVRDSFJBTkdFCisjdW5kZWYJICAgIExUT0tFTgorI3VuZGVmCSAgICBIQVNGQUlMRUQKKyN1bmRlZgkgICAgRkFJTEVERkxBRworI3VuZGVmCSAgICBJTlBVVAorI3VuZGVmCSAgICBTVFJTVFJFQU0KKyN1bmRlZgkgICAgTEEKKyN1bmRlZgkgICAgSEFTRVhDRVBUSU9OCisjdW5kZWYJICAgIEVYQ0VQVElPTgorI3VuZGVmCSAgICBDT05TVFJVQ1RFWAorI3VuZGVmCSAgICBDT05TVU1FCisjdW5kZWYJICAgIExSRUNPVkVSCisjdW5kZWYJICAgIE1BUksKKyN1bmRlZgkgICAgUkVXSU5ECisjdW5kZWYJICAgIFJFV0lORExBU1QKKyN1bmRlZgkgICAgQkFDS1RSQUNLSU5HCisjdW5kZWYJCU1BVENIQU5ZCisjdW5kZWYJCU1FTU9JWkUKKyN1bmRlZgkJSEFWRVBBUlNFRFJVTEUKKyN1bmRlZgkJR0VUVEVYVAorI3VuZGVmCQlJTkRFWAorI3VuZGVmCQlTRUVLCisjdW5kZWYJCVBVU0hTVFJFQU0KKyN1bmRlZgkJUE9QU1RSRUFNCisjdW5kZWYJCVNFVFRFWFQKKyN1bmRlZgkJU0VUVEVYVDgKKworI2RlZmluZQkgICAgTEVYRVIJCQkJCWN0eC0+cExleGVyCisjZGVmaW5lCSAgICBSRUNPR05JWkVSCQkJICAgIExFWEVSLT5yZWMKKyNkZWZpbmUJCUxFWFNUQVRFCQkJCVJFQ09HTklaRVItPnN0YXRlCisjZGVmaW5lCQlUT0tTT1VSQ0UJCQkJTEVYU1RBVEUtPnRva1NvdXJjZQorI2RlZmluZQkgICAgR0VUQ0hBUklOREVYKCkJCQlMRVhFUi0+Z2V0Q2hhckluZGV4KExFWEVSKQorI2RlZmluZQkgICAgR0VUTElORSgpCQkJCUxFWEVSLT5nZXRMaW5lKExFWEVSKQorI2RlZmluZQkgICAgR0VUVEVYVCgpCQkJCUxFWEVSLT5nZXRUZXh0KExFWEVSKQorI2RlZmluZQkgICAgR0VUQ0hBUlBPU0lUSU9OSU5MSU5FKCkgTEVYRVItPmdldENoYXJQb3NpdGlvbkluTGluZShMRVhFUikKKyNkZWZpbmUJICAgIEVNSVQoKQkJCQkJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsgTEVYRVItPmVtaXQoTEVYRVIpCisjZGVmaW5lCSAgICBFTUlUTkVXKHQpCQkJCUxFWEVSLT5lbWl0TmV3KExFWEVSLCB0KQorI2RlZmluZQkgICAgTUFUQ0hDKGMpCQkJCUxFWEVSLT5tYXRjaGMoTEVYRVIsIGMpCisjZGVmaW5lCSAgICBNQVRDSFMocykJCQkJTEVYRVItPm1hdGNocyhMRVhFUiwgcykKKyNkZWZpbmUJICAgIE1BVENIUkFOR0UoYzEsYzIpCSAgICBMRVhFUi0+bWF0Y2hSYW5nZShMRVhFUiwgYzEsIGMyKQorI2RlZmluZQkgICAgTUFUQ0hBTlkoKQkJCQlMRVhFUi0+bWF0Y2hBbnkoTEVYRVIpCisjZGVmaW5lCSAgICBMVE9LRU4gIAkJCQlMRVhTVEFURS0+dG9rZW4KKyNkZWZpbmUJICAgIEhBU0ZBSUxFRCgpCQkJCShMRVhTVEFURS0+ZmFpbGVkID09IEFOVExSM19UUlVFKQorI2RlZmluZQkgICAgQkFDS1RSQUNLSU5HCQkJTEVYU1RBVEUtPmJhY2t0cmFja2luZworI2RlZmluZQkgICAgRkFJTEVERkxBRwkJCQlMRVhTVEFURS0+ZmFpbGVkCisjZGVmaW5lCSAgICBJTlBVVAkJCQkJTEVYRVItPmlucHV0CisjZGVmaW5lCSAgICBTVFJTVFJFQU0JCQkJSU5QVVQKKyNkZWZpbmUJCUlTVFJFQU0JCQkJCUlOUFVULT5pc3RyZWFtCisjZGVmaW5lCQlJTkRFWCgpCQkJCQlJU1RSRUFNLT5pbmRleChJU1RSRUFNKQorI2RlZmluZQkJU0VFSyhuKQkJCQkJSVNUUkVBTS0+c2VlayhJU1RSRUFNLCBuKQorI2RlZmluZQkgICAgRU9GX1RPS0VOCQkJCSYoTEVYU1RBVEUtPnRva1NvdXJjZS0+ZW9mVG9rZW4pCisjZGVmaW5lCSAgICBIQVNFWENFUFRJT04oKQkJCShMRVhTVEFURS0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUpCisjZGVmaW5lCSAgICBFWENFUFRJT04JCQkJTEVYU1RBVEUtPmV4Y2VwdGlvbgorI2RlZmluZQkgICAgQ09OU1RSVUNURVgoKQkJCVJFQ09HTklaRVItPmV4Q29uc3RydWN0KFJFQ09HTklaRVIpCisjZGVmaW5lCSAgICBMUkVDT1ZFUigpCQkJCUxFWEVSLT5yZWNvdmVyKExFWEVSKQorI2RlZmluZQkgICAgTUFSSygpCQkJCQlJU1RSRUFNLT5tYXJrKElTVFJFQU0pCisjZGVmaW5lCSAgICBSRVdJTkQobSkJCQkJSVNUUkVBTS0+cmV3aW5kKElTVFJFQU0sIG0pCisjZGVmaW5lCSAgICBSRVdJTkRMQVNUKCkJCQlJU1RSRUFNLT5yZXdpbmRMYXN0KElTVFJFQU0pCisjZGVmaW5lCQlNRU1PSVpFKHJpLHNpKQkJCVJFQ09HTklaRVItPm1lbW9pemUoUkVDT0dOSVpFUiwgcmksIHNpKQorI2RlZmluZQkJSEFWRVBBUlNFRFJVTEUocikJCVJFQ09HTklaRVItPmFscmVhZHlQYXJzZWRSdWxlKFJFQ09HTklaRVIsIHIpCisjZGVmaW5lCQlQVVNIU1RSRUFNKHN0cikJCQlMRVhFUi0+cHVzaENoYXJTdHJlYW0oTEVYRVIsIHN0cikKKyNkZWZpbmUJCVBPUFNUUkVBTSgpCQkJCUxFWEVSLT5wb3BDaGFyU3RyZWFtKExFWEVSKQorI2RlZmluZQkJU0VUVEVYVChzdHIpCQkJTEVYU1RBVEUtPnRleHQgPSBzdHIKKyNkZWZpbmUJCVNLSVAoKQkJCQkJTEVYU1RBVEUtPnRva2VuID0gJihUT0tTT1VSQ0UtPnNraXBUb2tlbikKKyNkZWZpbmUJCVVTRVIxCQkJCQlMRVhTVEFURS0+dXNlcjEKKyNkZWZpbmUJCVVTRVIyCQkJCQlMRVhTVEFURS0+dXNlcjIKKyNkZWZpbmUJCVVTRVIzCQkJCQlMRVhTVEFURS0+dXNlcjMKKyNkZWZpbmUJCUNVU1RPTQkJCQkJTEVYU1RBVEUtPmN1c3RvbQorI2RlZmluZQkJUlVMRU1FTU8JCQkJTEVYU1RBVEUtPnJ1bGVNZW1vCisjZGVmaW5lCQlEQkcJCQkJCQlSRUNPR05JWkVSLT5kZWJ1Z2dlcgorCisvKiBJZiB3ZSBoYXZlIGJlZW4gdG9sZCB3ZSBjYW4gcmVseSBvbiB0aGUgc3RhbmRhcmQgOCBiaXQgb3IgVVRGMTYgaW5wdXQKKyAqIHN0cmVhbSwgdGhlbiB3ZSBjYW4gZGVmaW5lIG91ciBtYWNyb3MgdG8gdXNlIHRoZSBkaXJlY3QgcG9pbnRlcnMKKyAqIGluIHRoZSBpbnB1dCBvYmplY3QsIHdoaWNoIGlzIG11Y2ggZmFzdGVyIHRoYW4gaW5kaXJlY3QgY2FsbHMuIFRoaXMKKyAqIGlzIHJlYWxseSBvbmx5IHNpZ25pZmljYW50IHRvIGxleGVycyB3aXRoIGEgbG90IG9mIGZyYWdtZW50IHJ1bGVzICh3aGljaAorICogZG8gbm90IHBsYWNlIExBKDEpIGluIGEgdGVtcG9yYXJ5IGF0IHRoZSBtb21lbnQpIGFuZCBldmVuIHRoZW4KKyAqIG9ubHkgaWYgdGhlcmUgaXMgYSBsb3Qgb2YgaW5wdXQgKG9yZGVyIG9mIHNheSAxTSBvciBzbykuCisgKi8KKyNpZglkZWZpbmVkKEFOVExSM19JTkxJTkVfSU5QVVRfOEJJVCkgfHwgZGVmaW5lZChBTlRMUjNfSU5MSU5FX0lOUFVUX1VURjE2KQorCisjIGlmZGVmCUFOVExSM19JTkxJTkVfSU5QVVRfOEJJVAorCisvKiA4IGJpdCBjaGFyYWN0ZXIgc2V0ICovCisKKyMgIGRlZmluZQkgICAgTkVYVENIQVIJKChwQU5UTFIzX1VJTlQ4KShJTlBVVC0+bmV4dENoYXIpKQorIyAgZGVmaW5lCSAgICBEQVRBUAkoKHBBTlRMUjNfVUlOVDgpKElOUFVULT5kYXRhKSkKKworIyBlbHNlCisKKyMgIGRlZmluZQkgICAgTkVYVENIQVIJKChwQU5UTFIzX1VJTlQxNikoSU5QVVQtPm5leHRDaGFyKSkKKyMgIGRlZmluZQkgICAgREFUQVAJKChwQU5UTFIzX1VJTlQxNikoSU5QVVQtPmRhdGEpKQorCisjIGVuZGlmCisKKyMgZGVmaW5lCSAgICBMQShuKSAoKE5FWFRDSEFSICsgbikgPiAoREFUQVAgKyBJTlBVVC0+c2l6ZUJ1ZikgPyBBTlRMUjNfQ0hBUlNUUkVBTV9FT0YgOiAoQU5UTFIzX1VDSEFSKSgqKE5FWFRDSEFSICsgbiAtIDEpKSkKKyMgZGVmaW5lICAgICAgICAgICAgQ09OU1VNRSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAgICAgICAgKE5FWFRDSEFSIDwgKERBVEFQICsgSU5QVVQtPnNpemVCdWYpKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgSU5QVVQtPmNoYXJQb3NpdGlvbkluTGluZSsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgICgoQU5UTFIzX1VDSEFSKSgqTkVYVENIQVIpID09IElOUFVULT5uZXdsaW5lQ2hhcikgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIElOUFVULT5saW5lKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIElOUFVULT5jaGFyUG9zaXRpb25JbkxpbmUgICAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIElOUFVULT5jdXJyZW50TGluZSAgICAgICAgICAgICAgICA9ICh2b2lkICopKE5FWFRDSEFSICsgMSk7IFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgSU5QVVQtPm5leHRDaGFyID0gKHZvaWQgKikoTkVYVENIQVIgKyAxKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2Vsc2UKKworLy8gUGljayB1cCB0aGUgaW5wdXQgY2hhcmFjdGVyIGJ5IGNhbGxpbmcgdGhlIGlucHV0IHN0cmVhbSBpbXBsZW1lbnRhdGlvbi4KKy8vCisjZGVmaW5lCSAgICBDT05TVU1FKCkgICBJTlBVVC0+aXN0cmVhbS0+Y29uc3VtZShJTlBVVC0+aXN0cmVhbSkKKyNkZWZpbmUJICAgIExBKG4pICAgICAgIElOUFVULT5pc3RyZWFtLT5fTEEoSU5QVVQtPmlzdHJlYW0sIG4pCisKKyNlbmRpZgorCisjZGVmaW5lCQlUT0tURVhUKHRvaywgdHh0KQkJCQl0b2ssIChwQU5UTFIzX1VJTlQ4KXR4dAorCisvKiBUaGUgNCB0b2tlbnMgZGVmaW5lZCBiZWxvdyBtYXkgd2VsbCBjbGFzaCB3aXRoIHlvdXIgb3duICNkZWZpbmVzIG9yIHRva2VuIHR5cGVzLiBJZiBzbworICogdGhlbiBmb3IgdGhlIHByZXNlbnQgeW91IG11c3QgdXNlIGRpZmZlcmVudCBuYW1lcyBmb3IgeW91ciBkZWZpbmVzIGFzIHRoZXNlIGFyZSBoYXJkIGNvZGVkCisgKiBpbiB0aGUgY29kZSBnZW5lcmF0b3IuIEl0IHdvdWxkIGJlIGJldHRlciBub3QgdG8gdXNlIHN1Y2ggbmFtZXMgaW50ZXJuYWxseSwgYW5kIG1heWJlCisgKiB3ZSBjYW4gY2hhbmdlIHRoaXMgaW4gYSBmb3J0aGNvbWluZyByZWxlYXNlLiBJIGRlbGliZXJhdGVseSBkbyBub3QgI3VuZGVmIHRoZXNlCisgKiBoZXJlIGFzIHRoaXMgd2lsbCBhdCBsZWFzdCBnaXZlIHlvdSBhIHJlZGVmaW5lZCBlcnJvciBzb21ld2hlcmUgaWYgdGhleSBjbGFzaC4KKyAqLworI2RlZmluZQkgICAgVVAJICAgIEFOVExSM19UT0tFTl9VUAorI2RlZmluZQkgICAgRE9XTiAgICBBTlRMUjNfVE9LRU5fRE9XTgorI2RlZmluZQkgICAgRU9SCSAgICBBTlRMUjNfVE9LRU5fRU9SCisjZGVmaW5lCSAgICBJTlZBTElEIEFOVExSM19UT0tFTl9JTlZBTElECisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZ1bmN0aW9ucyB0byBjcmVhdGUgYW5kIGRlc3Ryb3kgc2NvcGVzLiBGaXJzdCBjb21lIHRoZSBydWxlIHNjb3BlcywgZm9sbG93ZWQKKyAqIGJ5IHRoZSBnbG9iYWwgZGVjbGFyZWQgc2NvcGVzLgorICovCisKKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU3RhcnQgb2YgcmVjb2duaXplcgorICovCisKKy8qIEZvcndhcmQgZGVjbGFyZSB0aGUgbG9jYWxseSBzdGF0aWMgbWF0Y2hpbmcgZnVuY3Rpb25zIHdlIGhhdmUgZ2VuZXJhdGVkIGFuZCBhbnkgcHJlZGljYXRlIGZ1bmN0aW9ucy4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xNDQgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xNDUgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xNDYgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xNDcgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xNDggICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xNDkgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xNTAgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xNTEgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xNTIgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xNTMgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xNTQgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xNTUgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xNTYgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xNTcgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xNTggICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xNTkgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xNjAgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xNjEgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xNjIgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xNjMgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xNjQgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xNjUgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xNjYgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xNjcgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xNjggICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xNjkgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xNzAgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xNzEgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xNzIgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xNzMgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xNzQgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xNzUgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xNzYgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xNzcgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xNzggICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xNzkgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xODAgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xODEgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xODIgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xODMgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xODQgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xODUgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xODYgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xODcgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xODggICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xODkgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xOTAgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xOTEgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xOTIgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xOTMgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xOTQgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xOTUgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xOTYgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xOTcgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xOTggICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18xOTkgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMDAgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMDEgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMDIgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMDMgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMDQgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMDUgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMDYgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMDcgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMDggICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMDkgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMTAgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMTEgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMTIgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMTMgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMTQgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMTUgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMTYgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMTcgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMTggICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMTkgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMjAgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMjEgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMjIgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMjMgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMjQgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMjUgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMjYgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMjcgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMjggICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMjkgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMzAgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMzEgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMzIgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMzMgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMzQgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMzUgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMzYgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMzcgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMzggICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yMzkgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNDAgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNDEgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNDIgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNDMgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNDQgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNDUgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNDYgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNDcgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNDggICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNDkgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNTAgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNTEgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNTIgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNTMgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNTQgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNTUgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNTYgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNTcgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNTggICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNTkgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNjAgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNjEgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNjIgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNjMgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNjQgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNjUgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNjYgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNjcgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNjggICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNjkgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNzAgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNzEgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNzIgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNzMgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNzQgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNzUgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNzYgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNzcgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNzggICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yNzkgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yODAgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yODEgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yODIgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yODMgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yODQgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yODUgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yODYgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yODcgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yODggICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yODkgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yOTAgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yOTEgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yOTIgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yOTMgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yOTQgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yOTUgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yOTYgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yOTcgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yOTggICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18yOTkgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMDAgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMDEgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMDIgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMDMgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMDQgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMDUgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMDYgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMDcgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMDggICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMDkgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMTAgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMTEgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMTIgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMTMgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMTQgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMTUgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMTYgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMTcgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMTggICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMTkgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMjAgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMjEgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMjIgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMjMgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMjQgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMjUgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMjYgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMjcgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMjggICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMjkgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMzAgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMzEgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMzIgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMzMgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMzQgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMzUgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMzYgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMzcgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMzggICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zMzkgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNDAgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNDEgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNDIgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNDMgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNDQgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNDUgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNDYgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNDcgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNDggICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNDkgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNTAgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNTEgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNTIgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNTMgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNTQgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNTUgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNTYgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNTcgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNTggICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNTkgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNjAgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNjEgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNjIgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNjMgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNjQgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNjUgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNjYgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNjcgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNjggICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNjkgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNzAgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNzEgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNzIgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNzMgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNzQgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNzUgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNzYgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNzcgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNzggICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zNzkgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zODAgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zODEgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zODIgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zODMgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zODQgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zODUgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zODYgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zODcgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zODggICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zODkgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zOTAgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zOTEgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zOTIgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zOTMgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zOTQgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zOTUgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zOTYgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zOTcgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zOTggICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX18zOTkgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX180MDAgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX180MDEgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX180MDIgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX180MDMgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX180MDQgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX180MDUgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX180MDYgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX180MDcgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX180MDggICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX180MDkgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX180MTAgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX180MTEgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX180MTIgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX180MTMgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX180MTQgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX180MTUgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX180MTYgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1UX180MTcgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1PUF9BVE9NSUNfU0VRVUVOQ0UgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1PUF9TRVFVRU5DRSAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbU9QX1NFUVVFTkNFX1NJREUgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1PUF9TRVFVRU5DRV9XRUFLICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltT1BfU0NIRURVTEVfR1QgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1PUF9TQ0hFRFVMRV9MVCAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbU9QX1NDSEVEVUxFX1hPUiAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbU9QX1NDSEVEVUxFX0FORF9USEVOICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltT1BfU0NIRURVTEVfT1JfRUxTRSAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbU9QX05PTl9ERVRFUk1JTklTTSAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbU9QX0NPTkNVUlJFTkNZX0FTWU5DICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltT1BfQ09OQ1VSUkVOQ1lfQU5EICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltT1BfQ09OQ1VSUkVOQ1lfT1IgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1PUF9DT05DVVJSRU5DWV9JTlRFUkxFQVZJTkcgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1PUF9DT05DVVJSRU5DWV9QQVJBTExFTCAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbU9QX0ZPUksgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1PUF9KT0lOICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltT1BfQ09OQ1VSUkVOQ1lfUkRWX0FTWU5DICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltT1BfQ09OQ1VSUkVOQ1lfUkRWX0FORCAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbU9QX0NPTkNVUlJFTkNZX1JEVl9PUiAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbU9QX0NPTkNVUlJFTkNZX1JEVl9JTlRFUkxFQVZJTkcgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1PUF9DT05DVVJSRU5DWV9SRFZfUEFSQUxMRUwgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1BU1NJR04gICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1BU1NJR05fQUZURVIgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1BU1NJR05fUkVGICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltQVNTSUdOX01BQ1JPICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltT1BfUFVTSCAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbU9QX0FTU0lHTl9UT1AgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1PUF9UT1AgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1PUF9QT1AgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1MUEFSRU4gICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1SUEFSRU4gICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1MQ1VSTFkgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1SQ1VSTFkgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1MQlJBQ0tFVCAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbVJCUkFDS0VUICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltTEJSQUNLRVRfRVhDRVBUICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltTFBBUkVOX0lOVk9LRSAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbUxDVVJMWV9JTlZPS0UgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1QRVJDRU5UX0xQQVJFTl9JTlZPS0UgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1QRVJDRU5UX0xQQVJFTiAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbVJQQVJFTl9QRVJDRU5UICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltU1RBVEVNRU5UX1BST01QVCAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbURPTExBUl9MQ1VSTFkgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1SQ1VSTFlfRE9MTEFSICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltUEVSQ0VOVF9MQ1VSTFkgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1SQ1VSTFlfUEVSQ0VOVCAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbUxCUkFDS0VUX0JBUiAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbUJBUl9SQlJBQ0tFVCAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbUxCUkFDS0VUX0xDVVJMWSAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbVJDVVJMWV9SQlJBQ0tFVCAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbUNPTE9OICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltQ09NTUEgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1RVUVTVElPTiAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbVNFTUkgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1ESUVTRSAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbURPTExBUiAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbURPVCAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbURPVERPVCAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbUNPTE9OeDIgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1MQU5EICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltTEFORF9USEVOICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltTEFORF9BU1NJR04gICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1MQU5EX0FTU0lHTl9BRlRFUiAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbUxOT1QgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1MT1IgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1MT1JfRUxTRSAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbUxPUl9BU1NJR04gICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1MT1JfQVNTSUdOX0FGVEVSICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltTFhPUiAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbUVRVUFMICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltTkVRVUFMICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltU0VRVUFMICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltTlNFUVVBTCAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbUxURSAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbUxUXyAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbUdURSAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbUdUICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltUExVUyAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbVBMVVNfQVNTSUdOICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltUExVU19BU1NJR05fQUZURVIgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1JTkNSICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltTUlOVVMgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1NSU5VU19BU1NJR04gICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1NSU5VU19BU1NJR05fQUZURVIgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1ERUNSICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltU1RBUiAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbVNUQVJfQVNTSUdOICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltU1RBUl9BU1NJR05fQUZURVIgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1ESVYgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1ESVZfQVNTSUdOICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltRElWX0FTU0lHTl9BRlRFUiAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbU1PRCAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbU1PRF9BU1NJR04gICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1NT0RfQVNTSUdOX0FGVEVSICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltUlNISUZUICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltUlNISUZUX0FTU0lHTiAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbVJTSElGVF9BU1NJR05fQUZURVIgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1MU0hJRlQgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1MU0hJRlRfQVNTSUdOICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltTFNISUZUX0FTU0lHTl9BRlRFUiAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbUJBTkQgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1CQU5EX0FTU0lHTiAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbUJBTkRfQVNTSUdOX0FGVEVSICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltQk5PVCAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbUJPUiAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbUJPUl9BU1NJR04gICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1CT1JfQVNTSUdOX0FGVEVSICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltQlhPUiAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbUJYT1JfQVNTSUdOICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltQlhPUl9BU1NJR05fQUZURVIgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1JRCAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbUFUX0lEICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltU3RyaW5nTGl0ZXJhbCAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbUNoYXJMaXRlcmFsICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltTnVtYmVyTGl0ZXJhbCAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbUZsb2F0TGl0ZXJhbCAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbVJhdGlvbmFsTGl0ZXJhbCAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbUludGVnZXJMaXRlcmFsICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltRmxvYXRUeXBlU3VmZml4ICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltSW1hZ2luYXJ5U3VmZml4ICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltSW50U3VmZml4ICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltSW50ZWdlciAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbURlY2ltYWwgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1CaW5hcnkgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1PY3RhbCAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbUhleGFkZWNpbWFsICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltRGVjaW1hbERpZ2l0ICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltT2N0YWxEaWdpdCAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbUhleERpZ2l0ICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltRGVjaW1hbEV4cG9uZW50ICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltRGVjaW1hbERpZ2l0cyAgICAocGZtbExleGVyIGN0eCk7CitzdGF0aWMgQU5UTFIzX0lOTElORSAKKyB2b2lkCisJbUZsb2F0ICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltRVhQT05FTlQgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1IRVhfRElHSVQgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1FU0NfU0VRICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltT0NUQUxfRVNDICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltVU5JQ09ERV9FU0MgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1DT01NRU5UICAgIChwZm1sTGV4ZXIgY3R4KTsKK3N0YXRpYyBBTlRMUjNfSU5MSU5FIAorIHZvaWQKKwltV1MgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgdm9pZAorCW1Ub2tlbnMgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkMV9mbWwgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIEFOVExSM19JTkxJTkUgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkMl9mbWwgICAgKHBmbWxMZXhlciBjdHgpOworc3RhdGljIHZvaWQJZm1sTGV4ZXJGcmVlKHBmbWxMZXhlciBjdHgpOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMZXhlciBtYXRjaGluZyBydWxlcyBlbmQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworCisKK3N0YXRpYyB2b2lkCitmbWxMZXhlckZyZWUgIChwZm1sTGV4ZXIgY3R4KQoreworICAgIExFWEVSLT5mcmVlKExFWEVSKTsKKworICAgIEFOVExSM19GUkVFKGN0eCk7Cit9CisKK3N0YXRpYyB2b2lkCitmbWxMZXhlclJlc2V0IChwZm1sTGV4ZXIgY3R4KQoreworICAgIFJFQ09HTklaRVItPnJlc2V0KFJFQ09HTklaRVIpOworfQorCisvKiogXGJyaWVmIE5hbWUgb2YgdGhlIGdyYW1tYXIgZmlsZSB0aGF0IGdlbmVyYXRlZCB0aGlzIGNvZGUKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgZmlsZU5hbWVbXSA9ICIvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZyI7CisKKy8qKiBcYnJpZWYgUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBncmFtbWFyIGZpbGUgdGhhdCBnZW5lcmF0ZWQgdGhpcyBjb2RlLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqIGdldEdyYW1tYXJGaWxlTmFtZSgpCit7CisJcmV0dXJuIGZpbGVOYW1lOworfQorCisvKiogXGJyaWVmIENyZWF0ZSBhIG5ldyBsZXhlciBjYWxsZWQgZm1sTGV4ZXIKKyAqCisgKiBccGFyYW1baW5dICAgIGluc3RyZWFtIFBvaW50ZXIgdG8gYW4gaW5pdGlhbGl6ZWQgaW5wdXQgc3RyZWFtCisgKiBccmV0dXJuCisgKiAgICAgLSBTdWNjZXNzIHBmbWxMZXhlciBpbml0aWFsaXplZCBmb3IgdGhlIGxleCBzdGFydAorICogICAgIC0gRmFpbCBOVUxMCisgKi8KK0FOVExSM19BUEkgcGZtbExleGVyIGZtbExleGVyTmV3CisoCitwQU5UTFIzX0lOUFVUX1NUUkVBTQorIGluc3RyZWFtKQoreworCS8vIFNlZSBpZiB3ZSBjYW4gY3JlYXRlIGEgbmV3IGxleGVyIHdpdGggdGhlIHN0YW5kYXJkIGNvbnN0cnVjdG9yCisJLy8KKwlyZXR1cm4gZm1sTGV4ZXJOZXdTU0QoaW5zdHJlYW0sIE5VTEwpOworfQorCisvKiogXGJyaWVmIENyZWF0ZSBhIG5ldyBsZXhlciBjYWxsZWQgZm1sTGV4ZXIKKyAqCisgKiBccGFyYW1baW5dICAgIGluc3RyZWFtIFBvaW50ZXIgdG8gYW4gaW5pdGlhbGl6ZWQgaW5wdXQgc3RyZWFtCisgKiBccGFyYW1bc3RhdGVdIHN0YXRlIFByZXZpb3VzbHkgY3JlYXRlZCBzaGFyZWQgcmVjb2duaXplciBzdGF0CisgKiBccmV0dXJuCisgKiAgICAgLSBTdWNjZXNzIHBmbWxMZXhlciBpbml0aWFsaXplZCBmb3IgdGhlIGxleCBzdGFydAorICogICAgIC0gRmFpbCBOVUxMCisgKi8KK0FOVExSM19BUEkgcGZtbExleGVyIGZtbExleGVyTmV3U1NECisocEFOVExSM19JTlBVVF9TVFJFQU0gaW5zdHJlYW0sIHBBTlRMUjNfUkVDT0dOSVpFUl9TSEFSRURfU1RBVEUgc3RhdGUpCit7CisgICAgcGZtbExleGVyIGN0eDsgLy8gQ29udGV4dCBzdHJ1Y3R1cmUgd2Ugd2lsbCBidWlsZCBhbmQgcmV0dXJuCisKKyAgICBjdHggPSAocGZtbExleGVyKSBBTlRMUjNfQ0FMTE9DKDEsIHNpemVvZihmbWxMZXhlcikpOworCisgICAgaWYgIChjdHggPT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8vIEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGxleGVyIGNvbnRleHQKKyAgICAgICAgcmV0dXJuICBOVUxMOworICAgIH0KKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgKiBNZW1vcnkgZm9yIGJhc2ljIHN0cnVjdHVyZSBpcyBhbGxvY2F0ZWQsIG5vdyB0byBmaWxsIGluCisgICAgICogaW4gYmFzZSBBTlRMUjMgc3RydWN0dXJlcy4gV2UgaW5pdGlhbGl6ZSB0aGUgZnVuY3Rpb24gcG9pbnRlcnMKKyAgICAgKiBmb3IgdGhlIHN0YW5kYXJkIEFOVExSMyBsZXhlciBmdW5jdGlvbiBzZXQsIGJ1dCB1cG9uIHJldHVybgorICAgICAqIGZyb20gaGVyZSwgdGhlIHByb2dyYW1tZXIgbWF5IHNldCB0aGUgcG9pbnRlcnMgdG8gcHJvdmlkZSBjdXN0b20KKyAgICAgKiBpbXBsZW1lbnRhdGlvbnMgb2YgZWFjaCBmdW5jdGlvbi4KKyAgICAgKgorICAgICAqIFdlIGRvbid0IHVzZSB0aGUgbWFjcm9zIGRlZmluZWQgaW4gZm1sTGV4ZXIuaCBoZXJlIHNvIHlvdSBjYW4gZ2V0IGEgc2Vuc2UKKyAgICAgKiBvZiB3aGF0IGdvZXMgd2hlcmUuCisgICAgICovCisKKyAgICAvKiBDcmVhdGUgYSBiYXNlIGxleGVyLCB1c2luZyB0aGUgc3VwcGxpZWQgaW5wdXQgc3RyZWFtCisgICAgICovCisgICAgY3R4LT5wTGV4ZXIJPSBhbnRscjNMZXhlck5ld1N0cmVhbShBTlRMUjNfU0laRV9ISU5ULCBpbnN0cmVhbSwgc3RhdGUpOworCisgICAgLyogQ2hlY2sgdGhhdCB3ZSBhbGxvY2F0ZWQgdGhlIG1lbW9yeSBjb3JyZWN0bHkKKyAgICAgKi8KKyAgICBpZgkoY3R4LT5wTGV4ZXIgPT0gTlVMTCkKKyAgICB7CisJCUFOVExSM19GUkVFKGN0eCk7CisJCXJldHVybiAgTlVMTDsKKyAgICB9CisgICAgLyogSW5zdGFsbCB0aGUgaW1wbGVtZW50YXRpb24gb2Ygb3VyIGZtbExleGVyIGludGVyZmFjZQorICAgICAqLworICAgIGN0eC0+bVRfXzE0NAk9IG1UX18xNDQ7CisgICAgY3R4LT5tVF9fMTQ1CT0gbVRfXzE0NTsKKyAgICBjdHgtPm1UX18xNDYJPSBtVF9fMTQ2OworICAgIGN0eC0+bVRfXzE0Nwk9IG1UX18xNDc7CisgICAgY3R4LT5tVF9fMTQ4CT0gbVRfXzE0ODsKKyAgICBjdHgtPm1UX18xNDkJPSBtVF9fMTQ5OworICAgIGN0eC0+bVRfXzE1MAk9IG1UX18xNTA7CisgICAgY3R4LT5tVF9fMTUxCT0gbVRfXzE1MTsKKyAgICBjdHgtPm1UX18xNTIJPSBtVF9fMTUyOworICAgIGN0eC0+bVRfXzE1Mwk9IG1UX18xNTM7CisgICAgY3R4LT5tVF9fMTU0CT0gbVRfXzE1NDsKKyAgICBjdHgtPm1UX18xNTUJPSBtVF9fMTU1OworICAgIGN0eC0+bVRfXzE1Ngk9IG1UX18xNTY7CisgICAgY3R4LT5tVF9fMTU3CT0gbVRfXzE1NzsKKyAgICBjdHgtPm1UX18xNTgJPSBtVF9fMTU4OworICAgIGN0eC0+bVRfXzE1OQk9IG1UX18xNTk7CisgICAgY3R4LT5tVF9fMTYwCT0gbVRfXzE2MDsKKyAgICBjdHgtPm1UX18xNjEJPSBtVF9fMTYxOworICAgIGN0eC0+bVRfXzE2Mgk9IG1UX18xNjI7CisgICAgY3R4LT5tVF9fMTYzCT0gbVRfXzE2MzsKKyAgICBjdHgtPm1UX18xNjQJPSBtVF9fMTY0OworICAgIGN0eC0+bVRfXzE2NQk9IG1UX18xNjU7CisgICAgY3R4LT5tVF9fMTY2CT0gbVRfXzE2NjsKKyAgICBjdHgtPm1UX18xNjcJPSBtVF9fMTY3OworICAgIGN0eC0+bVRfXzE2OAk9IG1UX18xNjg7CisgICAgY3R4LT5tVF9fMTY5CT0gbVRfXzE2OTsKKyAgICBjdHgtPm1UX18xNzAJPSBtVF9fMTcwOworICAgIGN0eC0+bVRfXzE3MQk9IG1UX18xNzE7CisgICAgY3R4LT5tVF9fMTcyCT0gbVRfXzE3MjsKKyAgICBjdHgtPm1UX18xNzMJPSBtVF9fMTczOworICAgIGN0eC0+bVRfXzE3NAk9IG1UX18xNzQ7CisgICAgY3R4LT5tVF9fMTc1CT0gbVRfXzE3NTsKKyAgICBjdHgtPm1UX18xNzYJPSBtVF9fMTc2OworICAgIGN0eC0+bVRfXzE3Nwk9IG1UX18xNzc7CisgICAgY3R4LT5tVF9fMTc4CT0gbVRfXzE3ODsKKyAgICBjdHgtPm1UX18xNzkJPSBtVF9fMTc5OworICAgIGN0eC0+bVRfXzE4MAk9IG1UX18xODA7CisgICAgY3R4LT5tVF9fMTgxCT0gbVRfXzE4MTsKKyAgICBjdHgtPm1UX18xODIJPSBtVF9fMTgyOworICAgIGN0eC0+bVRfXzE4Mwk9IG1UX18xODM7CisgICAgY3R4LT5tVF9fMTg0CT0gbVRfXzE4NDsKKyAgICBjdHgtPm1UX18xODUJPSBtVF9fMTg1OworICAgIGN0eC0+bVRfXzE4Ngk9IG1UX18xODY7CisgICAgY3R4LT5tVF9fMTg3CT0gbVRfXzE4NzsKKyAgICBjdHgtPm1UX18xODgJPSBtVF9fMTg4OworICAgIGN0eC0+bVRfXzE4OQk9IG1UX18xODk7CisgICAgY3R4LT5tVF9fMTkwCT0gbVRfXzE5MDsKKyAgICBjdHgtPm1UX18xOTEJPSBtVF9fMTkxOworICAgIGN0eC0+bVRfXzE5Mgk9IG1UX18xOTI7CisgICAgY3R4LT5tVF9fMTkzCT0gbVRfXzE5MzsKKyAgICBjdHgtPm1UX18xOTQJPSBtVF9fMTk0OworICAgIGN0eC0+bVRfXzE5NQk9IG1UX18xOTU7CisgICAgY3R4LT5tVF9fMTk2CT0gbVRfXzE5NjsKKyAgICBjdHgtPm1UX18xOTcJPSBtVF9fMTk3OworICAgIGN0eC0+bVRfXzE5OAk9IG1UX18xOTg7CisgICAgY3R4LT5tVF9fMTk5CT0gbVRfXzE5OTsKKyAgICBjdHgtPm1UX18yMDAJPSBtVF9fMjAwOworICAgIGN0eC0+bVRfXzIwMQk9IG1UX18yMDE7CisgICAgY3R4LT5tVF9fMjAyCT0gbVRfXzIwMjsKKyAgICBjdHgtPm1UX18yMDMJPSBtVF9fMjAzOworICAgIGN0eC0+bVRfXzIwNAk9IG1UX18yMDQ7CisgICAgY3R4LT5tVF9fMjA1CT0gbVRfXzIwNTsKKyAgICBjdHgtPm1UX18yMDYJPSBtVF9fMjA2OworICAgIGN0eC0+bVRfXzIwNwk9IG1UX18yMDc7CisgICAgY3R4LT5tVF9fMjA4CT0gbVRfXzIwODsKKyAgICBjdHgtPm1UX18yMDkJPSBtVF9fMjA5OworICAgIGN0eC0+bVRfXzIxMAk9IG1UX18yMTA7CisgICAgY3R4LT5tVF9fMjExCT0gbVRfXzIxMTsKKyAgICBjdHgtPm1UX18yMTIJPSBtVF9fMjEyOworICAgIGN0eC0+bVRfXzIxMwk9IG1UX18yMTM7CisgICAgY3R4LT5tVF9fMjE0CT0gbVRfXzIxNDsKKyAgICBjdHgtPm1UX18yMTUJPSBtVF9fMjE1OworICAgIGN0eC0+bVRfXzIxNgk9IG1UX18yMTY7CisgICAgY3R4LT5tVF9fMjE3CT0gbVRfXzIxNzsKKyAgICBjdHgtPm1UX18yMTgJPSBtVF9fMjE4OworICAgIGN0eC0+bVRfXzIxOQk9IG1UX18yMTk7CisgICAgY3R4LT5tVF9fMjIwCT0gbVRfXzIyMDsKKyAgICBjdHgtPm1UX18yMjEJPSBtVF9fMjIxOworICAgIGN0eC0+bVRfXzIyMgk9IG1UX18yMjI7CisgICAgY3R4LT5tVF9fMjIzCT0gbVRfXzIyMzsKKyAgICBjdHgtPm1UX18yMjQJPSBtVF9fMjI0OworICAgIGN0eC0+bVRfXzIyNQk9IG1UX18yMjU7CisgICAgY3R4LT5tVF9fMjI2CT0gbVRfXzIyNjsKKyAgICBjdHgtPm1UX18yMjcJPSBtVF9fMjI3OworICAgIGN0eC0+bVRfXzIyOAk9IG1UX18yMjg7CisgICAgY3R4LT5tVF9fMjI5CT0gbVRfXzIyOTsKKyAgICBjdHgtPm1UX18yMzAJPSBtVF9fMjMwOworICAgIGN0eC0+bVRfXzIzMQk9IG1UX18yMzE7CisgICAgY3R4LT5tVF9fMjMyCT0gbVRfXzIzMjsKKyAgICBjdHgtPm1UX18yMzMJPSBtVF9fMjMzOworICAgIGN0eC0+bVRfXzIzNAk9IG1UX18yMzQ7CisgICAgY3R4LT5tVF9fMjM1CT0gbVRfXzIzNTsKKyAgICBjdHgtPm1UX18yMzYJPSBtVF9fMjM2OworICAgIGN0eC0+bVRfXzIzNwk9IG1UX18yMzc7CisgICAgY3R4LT5tVF9fMjM4CT0gbVRfXzIzODsKKyAgICBjdHgtPm1UX18yMzkJPSBtVF9fMjM5OworICAgIGN0eC0+bVRfXzI0MAk9IG1UX18yNDA7CisgICAgY3R4LT5tVF9fMjQxCT0gbVRfXzI0MTsKKyAgICBjdHgtPm1UX18yNDIJPSBtVF9fMjQyOworICAgIGN0eC0+bVRfXzI0Mwk9IG1UX18yNDM7CisgICAgY3R4LT5tVF9fMjQ0CT0gbVRfXzI0NDsKKyAgICBjdHgtPm1UX18yNDUJPSBtVF9fMjQ1OworICAgIGN0eC0+bVRfXzI0Ngk9IG1UX18yNDY7CisgICAgY3R4LT5tVF9fMjQ3CT0gbVRfXzI0NzsKKyAgICBjdHgtPm1UX18yNDgJPSBtVF9fMjQ4OworICAgIGN0eC0+bVRfXzI0OQk9IG1UX18yNDk7CisgICAgY3R4LT5tVF9fMjUwCT0gbVRfXzI1MDsKKyAgICBjdHgtPm1UX18yNTEJPSBtVF9fMjUxOworICAgIGN0eC0+bVRfXzI1Mgk9IG1UX18yNTI7CisgICAgY3R4LT5tVF9fMjUzCT0gbVRfXzI1MzsKKyAgICBjdHgtPm1UX18yNTQJPSBtVF9fMjU0OworICAgIGN0eC0+bVRfXzI1NQk9IG1UX18yNTU7CisgICAgY3R4LT5tVF9fMjU2CT0gbVRfXzI1NjsKKyAgICBjdHgtPm1UX18yNTcJPSBtVF9fMjU3OworICAgIGN0eC0+bVRfXzI1OAk9IG1UX18yNTg7CisgICAgY3R4LT5tVF9fMjU5CT0gbVRfXzI1OTsKKyAgICBjdHgtPm1UX18yNjAJPSBtVF9fMjYwOworICAgIGN0eC0+bVRfXzI2MQk9IG1UX18yNjE7CisgICAgY3R4LT5tVF9fMjYyCT0gbVRfXzI2MjsKKyAgICBjdHgtPm1UX18yNjMJPSBtVF9fMjYzOworICAgIGN0eC0+bVRfXzI2NAk9IG1UX18yNjQ7CisgICAgY3R4LT5tVF9fMjY1CT0gbVRfXzI2NTsKKyAgICBjdHgtPm1UX18yNjYJPSBtVF9fMjY2OworICAgIGN0eC0+bVRfXzI2Nwk9IG1UX18yNjc7CisgICAgY3R4LT5tVF9fMjY4CT0gbVRfXzI2ODsKKyAgICBjdHgtPm1UX18yNjkJPSBtVF9fMjY5OworICAgIGN0eC0+bVRfXzI3MAk9IG1UX18yNzA7CisgICAgY3R4LT5tVF9fMjcxCT0gbVRfXzI3MTsKKyAgICBjdHgtPm1UX18yNzIJPSBtVF9fMjcyOworICAgIGN0eC0+bVRfXzI3Mwk9IG1UX18yNzM7CisgICAgY3R4LT5tVF9fMjc0CT0gbVRfXzI3NDsKKyAgICBjdHgtPm1UX18yNzUJPSBtVF9fMjc1OworICAgIGN0eC0+bVRfXzI3Ngk9IG1UX18yNzY7CisgICAgY3R4LT5tVF9fMjc3CT0gbVRfXzI3NzsKKyAgICBjdHgtPm1UX18yNzgJPSBtVF9fMjc4OworICAgIGN0eC0+bVRfXzI3OQk9IG1UX18yNzk7CisgICAgY3R4LT5tVF9fMjgwCT0gbVRfXzI4MDsKKyAgICBjdHgtPm1UX18yODEJPSBtVF9fMjgxOworICAgIGN0eC0+bVRfXzI4Mgk9IG1UX18yODI7CisgICAgY3R4LT5tVF9fMjgzCT0gbVRfXzI4MzsKKyAgICBjdHgtPm1UX18yODQJPSBtVF9fMjg0OworICAgIGN0eC0+bVRfXzI4NQk9IG1UX18yODU7CisgICAgY3R4LT5tVF9fMjg2CT0gbVRfXzI4NjsKKyAgICBjdHgtPm1UX18yODcJPSBtVF9fMjg3OworICAgIGN0eC0+bVRfXzI4OAk9IG1UX18yODg7CisgICAgY3R4LT5tVF9fMjg5CT0gbVRfXzI4OTsKKyAgICBjdHgtPm1UX18yOTAJPSBtVF9fMjkwOworICAgIGN0eC0+bVRfXzI5MQk9IG1UX18yOTE7CisgICAgY3R4LT5tVF9fMjkyCT0gbVRfXzI5MjsKKyAgICBjdHgtPm1UX18yOTMJPSBtVF9fMjkzOworICAgIGN0eC0+bVRfXzI5NAk9IG1UX18yOTQ7CisgICAgY3R4LT5tVF9fMjk1CT0gbVRfXzI5NTsKKyAgICBjdHgtPm1UX18yOTYJPSBtVF9fMjk2OworICAgIGN0eC0+bVRfXzI5Nwk9IG1UX18yOTc7CisgICAgY3R4LT5tVF9fMjk4CT0gbVRfXzI5ODsKKyAgICBjdHgtPm1UX18yOTkJPSBtVF9fMjk5OworICAgIGN0eC0+bVRfXzMwMAk9IG1UX18zMDA7CisgICAgY3R4LT5tVF9fMzAxCT0gbVRfXzMwMTsKKyAgICBjdHgtPm1UX18zMDIJPSBtVF9fMzAyOworICAgIGN0eC0+bVRfXzMwMwk9IG1UX18zMDM7CisgICAgY3R4LT5tVF9fMzA0CT0gbVRfXzMwNDsKKyAgICBjdHgtPm1UX18zMDUJPSBtVF9fMzA1OworICAgIGN0eC0+bVRfXzMwNgk9IG1UX18zMDY7CisgICAgY3R4LT5tVF9fMzA3CT0gbVRfXzMwNzsKKyAgICBjdHgtPm1UX18zMDgJPSBtVF9fMzA4OworICAgIGN0eC0+bVRfXzMwOQk9IG1UX18zMDk7CisgICAgY3R4LT5tVF9fMzEwCT0gbVRfXzMxMDsKKyAgICBjdHgtPm1UX18zMTEJPSBtVF9fMzExOworICAgIGN0eC0+bVRfXzMxMgk9IG1UX18zMTI7CisgICAgY3R4LT5tVF9fMzEzCT0gbVRfXzMxMzsKKyAgICBjdHgtPm1UX18zMTQJPSBtVF9fMzE0OworICAgIGN0eC0+bVRfXzMxNQk9IG1UX18zMTU7CisgICAgY3R4LT5tVF9fMzE2CT0gbVRfXzMxNjsKKyAgICBjdHgtPm1UX18zMTcJPSBtVF9fMzE3OworICAgIGN0eC0+bVRfXzMxOAk9IG1UX18zMTg7CisgICAgY3R4LT5tVF9fMzE5CT0gbVRfXzMxOTsKKyAgICBjdHgtPm1UX18zMjAJPSBtVF9fMzIwOworICAgIGN0eC0+bVRfXzMyMQk9IG1UX18zMjE7CisgICAgY3R4LT5tVF9fMzIyCT0gbVRfXzMyMjsKKyAgICBjdHgtPm1UX18zMjMJPSBtVF9fMzIzOworICAgIGN0eC0+bVRfXzMyNAk9IG1UX18zMjQ7CisgICAgY3R4LT5tVF9fMzI1CT0gbVRfXzMyNTsKKyAgICBjdHgtPm1UX18zMjYJPSBtVF9fMzI2OworICAgIGN0eC0+bVRfXzMyNwk9IG1UX18zMjc7CisgICAgY3R4LT5tVF9fMzI4CT0gbVRfXzMyODsKKyAgICBjdHgtPm1UX18zMjkJPSBtVF9fMzI5OworICAgIGN0eC0+bVRfXzMzMAk9IG1UX18zMzA7CisgICAgY3R4LT5tVF9fMzMxCT0gbVRfXzMzMTsKKyAgICBjdHgtPm1UX18zMzIJPSBtVF9fMzMyOworICAgIGN0eC0+bVRfXzMzMwk9IG1UX18zMzM7CisgICAgY3R4LT5tVF9fMzM0CT0gbVRfXzMzNDsKKyAgICBjdHgtPm1UX18zMzUJPSBtVF9fMzM1OworICAgIGN0eC0+bVRfXzMzNgk9IG1UX18zMzY7CisgICAgY3R4LT5tVF9fMzM3CT0gbVRfXzMzNzsKKyAgICBjdHgtPm1UX18zMzgJPSBtVF9fMzM4OworICAgIGN0eC0+bVRfXzMzOQk9IG1UX18zMzk7CisgICAgY3R4LT5tVF9fMzQwCT0gbVRfXzM0MDsKKyAgICBjdHgtPm1UX18zNDEJPSBtVF9fMzQxOworICAgIGN0eC0+bVRfXzM0Mgk9IG1UX18zNDI7CisgICAgY3R4LT5tVF9fMzQzCT0gbVRfXzM0MzsKKyAgICBjdHgtPm1UX18zNDQJPSBtVF9fMzQ0OworICAgIGN0eC0+bVRfXzM0NQk9IG1UX18zNDU7CisgICAgY3R4LT5tVF9fMzQ2CT0gbVRfXzM0NjsKKyAgICBjdHgtPm1UX18zNDcJPSBtVF9fMzQ3OworICAgIGN0eC0+bVRfXzM0OAk9IG1UX18zNDg7CisgICAgY3R4LT5tVF9fMzQ5CT0gbVRfXzM0OTsKKyAgICBjdHgtPm1UX18zNTAJPSBtVF9fMzUwOworICAgIGN0eC0+bVRfXzM1MQk9IG1UX18zNTE7CisgICAgY3R4LT5tVF9fMzUyCT0gbVRfXzM1MjsKKyAgICBjdHgtPm1UX18zNTMJPSBtVF9fMzUzOworICAgIGN0eC0+bVRfXzM1NAk9IG1UX18zNTQ7CisgICAgY3R4LT5tVF9fMzU1CT0gbVRfXzM1NTsKKyAgICBjdHgtPm1UX18zNTYJPSBtVF9fMzU2OworICAgIGN0eC0+bVRfXzM1Nwk9IG1UX18zNTc7CisgICAgY3R4LT5tVF9fMzU4CT0gbVRfXzM1ODsKKyAgICBjdHgtPm1UX18zNTkJPSBtVF9fMzU5OworICAgIGN0eC0+bVRfXzM2MAk9IG1UX18zNjA7CisgICAgY3R4LT5tVF9fMzYxCT0gbVRfXzM2MTsKKyAgICBjdHgtPm1UX18zNjIJPSBtVF9fMzYyOworICAgIGN0eC0+bVRfXzM2Mwk9IG1UX18zNjM7CisgICAgY3R4LT5tVF9fMzY0CT0gbVRfXzM2NDsKKyAgICBjdHgtPm1UX18zNjUJPSBtVF9fMzY1OworICAgIGN0eC0+bVRfXzM2Ngk9IG1UX18zNjY7CisgICAgY3R4LT5tVF9fMzY3CT0gbVRfXzM2NzsKKyAgICBjdHgtPm1UX18zNjgJPSBtVF9fMzY4OworICAgIGN0eC0+bVRfXzM2OQk9IG1UX18zNjk7CisgICAgY3R4LT5tVF9fMzcwCT0gbVRfXzM3MDsKKyAgICBjdHgtPm1UX18zNzEJPSBtVF9fMzcxOworICAgIGN0eC0+bVRfXzM3Mgk9IG1UX18zNzI7CisgICAgY3R4LT5tVF9fMzczCT0gbVRfXzM3MzsKKyAgICBjdHgtPm1UX18zNzQJPSBtVF9fMzc0OworICAgIGN0eC0+bVRfXzM3NQk9IG1UX18zNzU7CisgICAgY3R4LT5tVF9fMzc2CT0gbVRfXzM3NjsKKyAgICBjdHgtPm1UX18zNzcJPSBtVF9fMzc3OworICAgIGN0eC0+bVRfXzM3OAk9IG1UX18zNzg7CisgICAgY3R4LT5tVF9fMzc5CT0gbVRfXzM3OTsKKyAgICBjdHgtPm1UX18zODAJPSBtVF9fMzgwOworICAgIGN0eC0+bVRfXzM4MQk9IG1UX18zODE7CisgICAgY3R4LT5tVF9fMzgyCT0gbVRfXzM4MjsKKyAgICBjdHgtPm1UX18zODMJPSBtVF9fMzgzOworICAgIGN0eC0+bVRfXzM4NAk9IG1UX18zODQ7CisgICAgY3R4LT5tVF9fMzg1CT0gbVRfXzM4NTsKKyAgICBjdHgtPm1UX18zODYJPSBtVF9fMzg2OworICAgIGN0eC0+bVRfXzM4Nwk9IG1UX18zODc7CisgICAgY3R4LT5tVF9fMzg4CT0gbVRfXzM4ODsKKyAgICBjdHgtPm1UX18zODkJPSBtVF9fMzg5OworICAgIGN0eC0+bVRfXzM5MAk9IG1UX18zOTA7CisgICAgY3R4LT5tVF9fMzkxCT0gbVRfXzM5MTsKKyAgICBjdHgtPm1UX18zOTIJPSBtVF9fMzkyOworICAgIGN0eC0+bVRfXzM5Mwk9IG1UX18zOTM7CisgICAgY3R4LT5tVF9fMzk0CT0gbVRfXzM5NDsKKyAgICBjdHgtPm1UX18zOTUJPSBtVF9fMzk1OworICAgIGN0eC0+bVRfXzM5Ngk9IG1UX18zOTY7CisgICAgY3R4LT5tVF9fMzk3CT0gbVRfXzM5NzsKKyAgICBjdHgtPm1UX18zOTgJPSBtVF9fMzk4OworICAgIGN0eC0+bVRfXzM5OQk9IG1UX18zOTk7CisgICAgY3R4LT5tVF9fNDAwCT0gbVRfXzQwMDsKKyAgICBjdHgtPm1UX180MDEJPSBtVF9fNDAxOworICAgIGN0eC0+bVRfXzQwMgk9IG1UX180MDI7CisgICAgY3R4LT5tVF9fNDAzCT0gbVRfXzQwMzsKKyAgICBjdHgtPm1UX180MDQJPSBtVF9fNDA0OworICAgIGN0eC0+bVRfXzQwNQk9IG1UX180MDU7CisgICAgY3R4LT5tVF9fNDA2CT0gbVRfXzQwNjsKKyAgICBjdHgtPm1UX180MDcJPSBtVF9fNDA3OworICAgIGN0eC0+bVRfXzQwOAk9IG1UX180MDg7CisgICAgY3R4LT5tVF9fNDA5CT0gbVRfXzQwOTsKKyAgICBjdHgtPm1UX180MTAJPSBtVF9fNDEwOworICAgIGN0eC0+bVRfXzQxMQk9IG1UX180MTE7CisgICAgY3R4LT5tVF9fNDEyCT0gbVRfXzQxMjsKKyAgICBjdHgtPm1UX180MTMJPSBtVF9fNDEzOworICAgIGN0eC0+bVRfXzQxNAk9IG1UX180MTQ7CisgICAgY3R4LT5tVF9fNDE1CT0gbVRfXzQxNTsKKyAgICBjdHgtPm1UX180MTYJPSBtVF9fNDE2OworICAgIGN0eC0+bVRfXzQxNwk9IG1UX180MTc7CisgICAgY3R4LT5tT1BfQVRPTUlDX1NFUVVFTkNFCT0gbU9QX0FUT01JQ19TRVFVRU5DRTsKKyAgICBjdHgtPm1PUF9TRVFVRU5DRQk9IG1PUF9TRVFVRU5DRTsKKyAgICBjdHgtPm1PUF9TRVFVRU5DRV9TSURFCT0gbU9QX1NFUVVFTkNFX1NJREU7CisgICAgY3R4LT5tT1BfU0VRVUVOQ0VfV0VBSwk9IG1PUF9TRVFVRU5DRV9XRUFLOworICAgIGN0eC0+bU9QX1NDSEVEVUxFX0dUCT0gbU9QX1NDSEVEVUxFX0dUOworICAgIGN0eC0+bU9QX1NDSEVEVUxFX0xUCT0gbU9QX1NDSEVEVUxFX0xUOworICAgIGN0eC0+bU9QX1NDSEVEVUxFX1hPUgk9IG1PUF9TQ0hFRFVMRV9YT1I7CisgICAgY3R4LT5tT1BfU0NIRURVTEVfQU5EX1RIRU4JPSBtT1BfU0NIRURVTEVfQU5EX1RIRU47CisgICAgY3R4LT5tT1BfU0NIRURVTEVfT1JfRUxTRQk9IG1PUF9TQ0hFRFVMRV9PUl9FTFNFOworICAgIGN0eC0+bU9QX05PTl9ERVRFUk1JTklTTQk9IG1PUF9OT05fREVURVJNSU5JU007CisgICAgY3R4LT5tT1BfQ09OQ1VSUkVOQ1lfQVNZTkMJPSBtT1BfQ09OQ1VSUkVOQ1lfQVNZTkM7CisgICAgY3R4LT5tT1BfQ09OQ1VSUkVOQ1lfQU5ECT0gbU9QX0NPTkNVUlJFTkNZX0FORDsKKyAgICBjdHgtPm1PUF9DT05DVVJSRU5DWV9PUgk9IG1PUF9DT05DVVJSRU5DWV9PUjsKKyAgICBjdHgtPm1PUF9DT05DVVJSRU5DWV9JTlRFUkxFQVZJTkcJPSBtT1BfQ09OQ1VSUkVOQ1lfSU5URVJMRUFWSU5HOworICAgIGN0eC0+bU9QX0NPTkNVUlJFTkNZX1BBUkFMTEVMCT0gbU9QX0NPTkNVUlJFTkNZX1BBUkFMTEVMOworICAgIGN0eC0+bU9QX0ZPUksJPSBtT1BfRk9SSzsKKyAgICBjdHgtPm1PUF9KT0lOCT0gbU9QX0pPSU47CisgICAgY3R4LT5tT1BfQ09OQ1VSUkVOQ1lfUkRWX0FTWU5DCT0gbU9QX0NPTkNVUlJFTkNZX1JEVl9BU1lOQzsKKyAgICBjdHgtPm1PUF9DT05DVVJSRU5DWV9SRFZfQU5ECT0gbU9QX0NPTkNVUlJFTkNZX1JEVl9BTkQ7CisgICAgY3R4LT5tT1BfQ09OQ1VSUkVOQ1lfUkRWX09SCT0gbU9QX0NPTkNVUlJFTkNZX1JEVl9PUjsKKyAgICBjdHgtPm1PUF9DT05DVVJSRU5DWV9SRFZfSU5URVJMRUFWSU5HCT0gbU9QX0NPTkNVUlJFTkNZX1JEVl9JTlRFUkxFQVZJTkc7CisgICAgY3R4LT5tT1BfQ09OQ1VSUkVOQ1lfUkRWX1BBUkFMTEVMCT0gbU9QX0NPTkNVUlJFTkNZX1JEVl9QQVJBTExFTDsKKyAgICBjdHgtPm1BU1NJR04JPSBtQVNTSUdOOworICAgIGN0eC0+bUFTU0lHTl9BRlRFUgk9IG1BU1NJR05fQUZURVI7CisgICAgY3R4LT5tQVNTSUdOX1JFRgk9IG1BU1NJR05fUkVGOworICAgIGN0eC0+bUFTU0lHTl9NQUNSTwk9IG1BU1NJR05fTUFDUk87CisgICAgY3R4LT5tT1BfUFVTSAk9IG1PUF9QVVNIOworICAgIGN0eC0+bU9QX0FTU0lHTl9UT1AJPSBtT1BfQVNTSUdOX1RPUDsKKyAgICBjdHgtPm1PUF9UT1AJPSBtT1BfVE9QOworICAgIGN0eC0+bU9QX1BPUAk9IG1PUF9QT1A7CisgICAgY3R4LT5tTFBBUkVOCT0gbUxQQVJFTjsKKyAgICBjdHgtPm1SUEFSRU4JPSBtUlBBUkVOOworICAgIGN0eC0+bUxDVVJMWQk9IG1MQ1VSTFk7CisgICAgY3R4LT5tUkNVUkxZCT0gbVJDVVJMWTsKKyAgICBjdHgtPm1MQlJBQ0tFVAk9IG1MQlJBQ0tFVDsKKyAgICBjdHgtPm1SQlJBQ0tFVAk9IG1SQlJBQ0tFVDsKKyAgICBjdHgtPm1MQlJBQ0tFVF9FWENFUFQJPSBtTEJSQUNLRVRfRVhDRVBUOworICAgIGN0eC0+bUxQQVJFTl9JTlZPS0UJPSBtTFBBUkVOX0lOVk9LRTsKKyAgICBjdHgtPm1MQ1VSTFlfSU5WT0tFCT0gbUxDVVJMWV9JTlZPS0U7CisgICAgY3R4LT5tUEVSQ0VOVF9MUEFSRU5fSU5WT0tFCT0gbVBFUkNFTlRfTFBBUkVOX0lOVk9LRTsKKyAgICBjdHgtPm1QRVJDRU5UX0xQQVJFTgk9IG1QRVJDRU5UX0xQQVJFTjsKKyAgICBjdHgtPm1SUEFSRU5fUEVSQ0VOVAk9IG1SUEFSRU5fUEVSQ0VOVDsKKyAgICBjdHgtPm1TVEFURU1FTlRfUFJPTVBUCT0gbVNUQVRFTUVOVF9QUk9NUFQ7CisgICAgY3R4LT5tRE9MTEFSX0xDVVJMWQk9IG1ET0xMQVJfTENVUkxZOworICAgIGN0eC0+bVJDVVJMWV9ET0xMQVIJPSBtUkNVUkxZX0RPTExBUjsKKyAgICBjdHgtPm1QRVJDRU5UX0xDVVJMWQk9IG1QRVJDRU5UX0xDVVJMWTsKKyAgICBjdHgtPm1SQ1VSTFlfUEVSQ0VOVAk9IG1SQ1VSTFlfUEVSQ0VOVDsKKyAgICBjdHgtPm1MQlJBQ0tFVF9CQVIJPSBtTEJSQUNLRVRfQkFSOworICAgIGN0eC0+bUJBUl9SQlJBQ0tFVAk9IG1CQVJfUkJSQUNLRVQ7CisgICAgY3R4LT5tTEJSQUNLRVRfTENVUkxZCT0gbUxCUkFDS0VUX0xDVVJMWTsKKyAgICBjdHgtPm1SQ1VSTFlfUkJSQUNLRVQJPSBtUkNVUkxZX1JCUkFDS0VUOworICAgIGN0eC0+bUNPTE9OCT0gbUNPTE9OOworICAgIGN0eC0+bUNPTU1BCT0gbUNPTU1BOworICAgIGN0eC0+bVFVRVNUSU9OCT0gbVFVRVNUSU9OOworICAgIGN0eC0+bVNFTUkJPSBtU0VNSTsKKyAgICBjdHgtPm1ESUVTRQk9IG1ESUVTRTsKKyAgICBjdHgtPm1ET0xMQVIJPSBtRE9MTEFSOworICAgIGN0eC0+bURPVAk9IG1ET1Q7CisgICAgY3R4LT5tRE9URE9UCT0gbURPVERPVDsKKyAgICBjdHgtPm1DT0xPTngyCT0gbUNPTE9OeDI7CisgICAgY3R4LT5tTEFORAk9IG1MQU5EOworICAgIGN0eC0+bUxBTkRfVEhFTgk9IG1MQU5EX1RIRU47CisgICAgY3R4LT5tTEFORF9BU1NJR04JPSBtTEFORF9BU1NJR047CisgICAgY3R4LT5tTEFORF9BU1NJR05fQUZURVIJPSBtTEFORF9BU1NJR05fQUZURVI7CisgICAgY3R4LT5tTE5PVAk9IG1MTk9UOworICAgIGN0eC0+bUxPUgk9IG1MT1I7CisgICAgY3R4LT5tTE9SX0VMU0UJPSBtTE9SX0VMU0U7CisgICAgY3R4LT5tTE9SX0FTU0lHTgk9IG1MT1JfQVNTSUdOOworICAgIGN0eC0+bUxPUl9BU1NJR05fQUZURVIJPSBtTE9SX0FTU0lHTl9BRlRFUjsKKyAgICBjdHgtPm1MWE9SCT0gbUxYT1I7CisgICAgY3R4LT5tRVFVQUwJPSBtRVFVQUw7CisgICAgY3R4LT5tTkVRVUFMCT0gbU5FUVVBTDsKKyAgICBjdHgtPm1TRVFVQUwJPSBtU0VRVUFMOworICAgIGN0eC0+bU5TRVFVQUwJPSBtTlNFUVVBTDsKKyAgICBjdHgtPm1MVEUJPSBtTFRFOworICAgIGN0eC0+bUxUXwk9IG1MVF87CisgICAgY3R4LT5tR1RFCT0gbUdURTsKKyAgICBjdHgtPm1HVAk9IG1HVDsKKyAgICBjdHgtPm1QTFVTCT0gbVBMVVM7CisgICAgY3R4LT5tUExVU19BU1NJR04JPSBtUExVU19BU1NJR047CisgICAgY3R4LT5tUExVU19BU1NJR05fQUZURVIJPSBtUExVU19BU1NJR05fQUZURVI7CisgICAgY3R4LT5tSU5DUgk9IG1JTkNSOworICAgIGN0eC0+bU1JTlVTCT0gbU1JTlVTOworICAgIGN0eC0+bU1JTlVTX0FTU0lHTgk9IG1NSU5VU19BU1NJR047CisgICAgY3R4LT5tTUlOVVNfQVNTSUdOX0FGVEVSCT0gbU1JTlVTX0FTU0lHTl9BRlRFUjsKKyAgICBjdHgtPm1ERUNSCT0gbURFQ1I7CisgICAgY3R4LT5tU1RBUgk9IG1TVEFSOworICAgIGN0eC0+bVNUQVJfQVNTSUdOCT0gbVNUQVJfQVNTSUdOOworICAgIGN0eC0+bVNUQVJfQVNTSUdOX0FGVEVSCT0gbVNUQVJfQVNTSUdOX0FGVEVSOworICAgIGN0eC0+bURJVgk9IG1ESVY7CisgICAgY3R4LT5tRElWX0FTU0lHTgk9IG1ESVZfQVNTSUdOOworICAgIGN0eC0+bURJVl9BU1NJR05fQUZURVIJPSBtRElWX0FTU0lHTl9BRlRFUjsKKyAgICBjdHgtPm1NT0QJPSBtTU9EOworICAgIGN0eC0+bU1PRF9BU1NJR04JPSBtTU9EX0FTU0lHTjsKKyAgICBjdHgtPm1NT0RfQVNTSUdOX0FGVEVSCT0gbU1PRF9BU1NJR05fQUZURVI7CisgICAgY3R4LT5tUlNISUZUCT0gbVJTSElGVDsKKyAgICBjdHgtPm1SU0hJRlRfQVNTSUdOCT0gbVJTSElGVF9BU1NJR047CisgICAgY3R4LT5tUlNISUZUX0FTU0lHTl9BRlRFUgk9IG1SU0hJRlRfQVNTSUdOX0FGVEVSOworICAgIGN0eC0+bUxTSElGVAk9IG1MU0hJRlQ7CisgICAgY3R4LT5tTFNISUZUX0FTU0lHTgk9IG1MU0hJRlRfQVNTSUdOOworICAgIGN0eC0+bUxTSElGVF9BU1NJR05fQUZURVIJPSBtTFNISUZUX0FTU0lHTl9BRlRFUjsKKyAgICBjdHgtPm1CQU5ECT0gbUJBTkQ7CisgICAgY3R4LT5tQkFORF9BU1NJR04JPSBtQkFORF9BU1NJR047CisgICAgY3R4LT5tQkFORF9BU1NJR05fQUZURVIJPSBtQkFORF9BU1NJR05fQUZURVI7CisgICAgY3R4LT5tQk5PVAk9IG1CTk9UOworICAgIGN0eC0+bUJPUgk9IG1CT1I7CisgICAgY3R4LT5tQk9SX0FTU0lHTgk9IG1CT1JfQVNTSUdOOworICAgIGN0eC0+bUJPUl9BU1NJR05fQUZURVIJPSBtQk9SX0FTU0lHTl9BRlRFUjsKKyAgICBjdHgtPm1CWE9SCT0gbUJYT1I7CisgICAgY3R4LT5tQlhPUl9BU1NJR04JPSBtQlhPUl9BU1NJR047CisgICAgY3R4LT5tQlhPUl9BU1NJR05fQUZURVIJPSBtQlhPUl9BU1NJR05fQUZURVI7CisgICAgY3R4LT5tSUQJPSBtSUQ7CisgICAgY3R4LT5tQVRfSUQJPSBtQVRfSUQ7CisgICAgY3R4LT5tU3RyaW5nTGl0ZXJhbAk9IG1TdHJpbmdMaXRlcmFsOworICAgIGN0eC0+bUNoYXJMaXRlcmFsCT0gbUNoYXJMaXRlcmFsOworICAgIGN0eC0+bU51bWJlckxpdGVyYWwJPSBtTnVtYmVyTGl0ZXJhbDsKKyAgICBjdHgtPm1GbG9hdExpdGVyYWwJPSBtRmxvYXRMaXRlcmFsOworICAgIGN0eC0+bVJhdGlvbmFsTGl0ZXJhbAk9IG1SYXRpb25hbExpdGVyYWw7CisgICAgY3R4LT5tSW50ZWdlckxpdGVyYWwJPSBtSW50ZWdlckxpdGVyYWw7CisgICAgY3R4LT5tRmxvYXRUeXBlU3VmZml4CT0gbUZsb2F0VHlwZVN1ZmZpeDsKKyAgICBjdHgtPm1JbWFnaW5hcnlTdWZmaXgJPSBtSW1hZ2luYXJ5U3VmZml4OworICAgIGN0eC0+bUludFN1ZmZpeAk9IG1JbnRTdWZmaXg7CisgICAgY3R4LT5tSW50ZWdlcgk9IG1JbnRlZ2VyOworICAgIGN0eC0+bURlY2ltYWwJPSBtRGVjaW1hbDsKKyAgICBjdHgtPm1CaW5hcnkJPSBtQmluYXJ5OworICAgIGN0eC0+bU9jdGFsCT0gbU9jdGFsOworICAgIGN0eC0+bUhleGFkZWNpbWFsCT0gbUhleGFkZWNpbWFsOworICAgIGN0eC0+bURlY2ltYWxEaWdpdAk9IG1EZWNpbWFsRGlnaXQ7CisgICAgY3R4LT5tT2N0YWxEaWdpdAk9IG1PY3RhbERpZ2l0OworICAgIGN0eC0+bUhleERpZ2l0CT0gbUhleERpZ2l0OworICAgIGN0eC0+bURlY2ltYWxFeHBvbmVudAk9IG1EZWNpbWFsRXhwb25lbnQ7CisgICAgY3R4LT5tRGVjaW1hbERpZ2l0cwk9IG1EZWNpbWFsRGlnaXRzOworICAgIGN0eC0+bUZsb2F0CT0gbUZsb2F0OworICAgIGN0eC0+bUVYUE9ORU5UCT0gbUVYUE9ORU5UOworICAgIGN0eC0+bUhFWF9ESUdJVAk9IG1IRVhfRElHSVQ7CisgICAgY3R4LT5tRVNDX1NFUQk9IG1FU0NfU0VROworICAgIGN0eC0+bU9DVEFMX0VTQwk9IG1PQ1RBTF9FU0M7CisgICAgY3R4LT5tVU5JQ09ERV9FU0MJPSBtVU5JQ09ERV9FU0M7CisgICAgY3R4LT5tQ09NTUVOVAk9IG1DT01NRU5UOworICAgIGN0eC0+bVdTCT0gbVdTOworICAgIGN0eC0+bVRva2Vucwk9IG1Ub2tlbnM7CisKKworCisgICAgLyoqIFdoZW4gdGhlIG5leHRUb2tlbigpIGNhbGwgaXMgbWFkZSB0byB0aGlzIGxleGVyJ3MgcEFOVExSM19UT0tFTl9TT1VSQ0UKKyAgICAgKiAgaXQgd2lsbCBjYWxsIG1Ub2tlbnMoKSBpbiB0aGlzIGdlbmVyYXRlZCBjb2RlLCBhbmQgd2lsbCBwYXNzIGl0IHRoZSBjdHgKKyAgICAgKiBwb2ludGVyIG9mIHRoaXMgbGV4ZXIsIG5vdCB0aGUgY29udGV4dCBvZiB0aGUgYmFzZSBsZXhlciwgc28gc3RvcmUgdGhhdCBub3cuCisgICAgICovCisgICAgY3R4LT5wTGV4ZXItPmN0eAkgICAgPSBjdHg7CisKKyAgICAvKipJbnN0YWxsIHRoZSB0b2tlbiBtYXRjaGluZyBmdW5jdGlvbgorICAgICAqLworICAgIGN0eC0+cExleGVyLT5tVG9rZW5zID0gKHZvaWQgKCopICh2b2lkICopKShtVG9rZW5zKTsKKworICAgIGN0eC0+Z2V0R3JhbW1hckZpbGVOYW1lCT0gZ2V0R3JhbW1hckZpbGVOYW1lOworICAgIGN0eC0+ZnJlZQkJPSBmbWxMZXhlckZyZWU7CisgICAgY3R4LT5yZXNldCAgICAgICAgICA9IGZtbExleGVyUmVzZXQ7CisKKworICAgIC8qIFJldHVybiB0aGUgbmV3bHkgYnVpbHQgbGV4ZXIgdG8gdGhlIGNhbGxlcgorICAgICAqLworICAgIHJldHVybiAgY3R4OworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBERkEgdGFibGVzIGZvciB0aGUgbGV4ZXIKKyAqLworLyoqIFN0YXRpYyBkZmEgc3RhdGUgdGFibGVzIGZvciBDeWNsaWMgZGZhOgorICogICAgMToxOiBUb2tlbnMgOiAoIFRfXzE0NCB8IFRfXzE0NSB8IFRfXzE0NiB8IFRfXzE0NyB8IFRfXzE0OCB8IFRfXzE0OSB8IFRfXzE1MCB8IFRfXzE1MSB8IFRfXzE1MiB8IFRfXzE1MyB8IFRfXzE1NCB8IFRfXzE1NSB8IFRfXzE1NiB8IFRfXzE1NyB8IFRfXzE1OCB8IFRfXzE1OSB8IFRfXzE2MCB8IFRfXzE2MSB8IFRfXzE2MiB8IFRfXzE2MyB8IFRfXzE2NCB8IFRfXzE2NSB8IFRfXzE2NiB8IFRfXzE2NyB8IFRfXzE2OCB8IFRfXzE2OSB8IFRfXzE3MCB8IFRfXzE3MSB8IFRfXzE3MiB8IFRfXzE3MyB8IFRfXzE3NCB8IFRfXzE3NSB8IFRfXzE3NiB8IFRfXzE3NyB8IFRfXzE3OCB8IFRfXzE3OSB8IFRfXzE4MCB8IFRfXzE4MSB8IFRfXzE4MiB8IFRfXzE4MyB8IFRfXzE4NCB8IFRfXzE4NSB8IFRfXzE4NiB8IFRfXzE4NyB8IFRfXzE4OCB8IFRfXzE4OSB8IFRfXzE5MCB8IFRfXzE5MSB8IFRfXzE5MiB8IFRfXzE5MyB8IFRfXzE5NCB8IFRfXzE5NSB8IFRfXzE5NiB8IFRfXzE5NyB8IFRfXzE5OCB8IFRfXzE5OSB8IFRfXzIwMCB8IFRfXzIwMSB8IFRfXzIwMiB8IFRfXzIwMyB8IFRfXzIwNCB8IFRfXzIwNSB8IFRfXzIwNiB8IFRfXzIwNyB8IFRfXzIwOCB8IFRfXzIwOSB8IFRfXzIxMCB8IFRfXzIxMSB8IFRfXzIxMiB8IFRfXzIxMyB8IFRfXzIxNCB8IFRfXzIxNSB8IFRfXzIxNiB8IFRfXzIxNyB8IFRfXzIxOCB8IFRfXzIxOSB8IFRfXzIyMCB8IFRfXzIyMSB8IFRfXzIyMiB8IFRfXzIyMyB8IFRfXzIyNCB8IFRfXzIyNSB8IFRfXzIyNiB8IFRfXzIyNyB8IFRfXzIyOCB8IFRfXzIyOSB8IFRfXzIzMCB8IFRfXzIzMSB8IFRfXzIzMiB8IFRfXzIzMyB8IFRfXzIzNCB8IFRfXzIzNSB8IFRfXzIzNiB8IFRfXzIzNyB8IFRfXzIzOCB8IFRfXzIzOSB8IFRfXzI0MCB8IFRfXzI0MSB8IFRfXzI0MiB8IFRfXzI0MyB8IFRfXzI0NCB8IFRfXzI0NSB8IFRfXzI0NiB8IFRfXzI0NyB8IFRfXzI0OCB8IFRfXzI0OSB8IFRfXzI1MCB8IFRfXzI1MSB8IFRfXzI1MiB8IFRfXzI1MyB8IFRfXzI1NCB8IFRfXzI1NSB8IFRfXzI1NiB8IFRfXzI1NyB8IFRfXzI1OCB8IFRfXzI1OSB8IFRfXzI2MCB8IFRfXzI2MSB8IFRfXzI2MiB8IFRfXzI2MyB8IFRfXzI2NCB8IFRfXzI2NSB8IFRfXzI2NiB8IFRfXzI2NyB8IFRfXzI2OCB8IFRfXzI2OSB8IFRfXzI3MCB8IFRfXzI3MSB8IFRfXzI3MiB8IFRfXzI3MyB8IFRfXzI3NCB8IFRfXzI3NSB8IFRfXzI3NiB8IFRfXzI3NyB8IFRfXzI3OCB8IFRfXzI3OSB8IFRfXzI4MCB8IFRfXzI4MSB8IFRfXzI4MiB8IFRfXzI4MyB8IFRfXzI4NCB8IFRfXzI4NSB8IFRfXzI4NiB8IFRfXzI4NyB8IFRfXzI4OCB8IFRfXzI4OSB8IFRfXzI5MCB8IFRfXzI5MSB8IFRfXzI5MiB8IFRfXzI5MyB8IFRfXzI5NCB8IFRfXzI5NSB8IFRfXzI5NiB8IFRfXzI5NyB8IFRfXzI5OCB8IFRfXzI5OSB8IFRfXzMwMCB8IFRfXzMwMSB8IFRfXzMwMiB8IFRfXzMwMyB8IFRfXzMwNCB8IFRfXzMwNSB8IFRfXzMwNiB8IFRfXzMwNyB8IFRfXzMwOCB8IFRfXzMwOSB8IFRfXzMxMCB8IFRfXzMxMSB8IFRfXzMxMiB8IFRfXzMxMyB8IFRfXzMxNCB8IFRfXzMxNSB8IFRfXzMxNiB8IFRfXzMxNyB8IFRfXzMxOCB8IFRfXzMxOSB8IFRfXzMyMCB8IFRfXzMyMSB8IFRfXzMyMiB8IFRfXzMyMyB8IFRfXzMyNCB8IFRfXzMyNSB8IFRfXzMyNiB8IFRfXzMyNyB8IFRfXzMyOCB8IFRfXzMyOSB8IFRfXzMzMCB8IFRfXzMzMSB8IFRfXzMzMiB8IFRfXzMzMyB8IFRfXzMzNCB8IFRfXzMzNSB8IFRfXzMzNiB8IFRfXzMzNyB8IFRfXzMzOCB8IFRfXzMzOSB8IFRfXzM0MCB8IFRfXzM0MSB8IFRfXzM0MiB8IFRfXzM0MyB8IFRfXzM0NCB8IFRfXzM0NSB8IFRfXzM0NiB8IFRfXzM0NyB8IFRfXzM0OCB8IFRfXzM0OSB8IFRfXzM1MCB8IFRfXzM1MSB8IFRfXzM1MiB8IFRfXzM1MyB8IFRfXzM1NCB8IFRfXzM1NSB8IFRfXzM1NiB8IFRfXzM1NyB8IFRfXzM1OCB8IFRfXzM1OSB8IFRfXzM2MCB8IFRfXzM2MSB8IFRfXzM2MiB8IFRfXzM2MyB8IFRfXzM2NCB8IFRfXzM2NSB8IFRfXzM2NiB8IFRfXzM2NyB8IFRfXzM2OCB8IFRfXzM2OSB8IFRfXzM3MCB8IFRfXzM3MSB8IFRfXzM3MiB8IFRfXzM3MyB8IFRfXzM3NCB8IFRfXzM3NSB8IFRfXzM3NiB8IFRfXzM3NyB8IFRfXzM3OCB8IFRfXzM3OSB8IFRfXzM4MCB8IFRfXzM4MSB8IFRfXzM4MiB8IFRfXzM4MyB8IFRfXzM4NCB8IFRfXzM4NSB8IFRfXzM4NiB8IFRfXzM4NyB8IFRfXzM4OCB8IFRfXzM4OSB8IFRfXzM5MCB8IFRfXzM5MSB8IFRfXzM5MiB8IFRfXzM5MyB8IFRfXzM5NCB8IFRfXzM5NSB8IFRfXzM5NiB8IFRfXzM5NyB8IFRfXzM5OCB8IFRfXzM5OSB8IFRfXzQwMCB8IFRfXzQwMSB8IFRfXzQwMiB8IFRfXzQwMyB8IFRfXzQwNCB8IFRfXzQwNSB8IFRfXzQwNiB8IFRfXzQwNyB8IFRfXzQwOCB8IFRfXzQwOSB8IFRfXzQxMCB8IFRfXzQxMSB8IFRfXzQxMiB8IFRfXzQxMyB8IFRfXzQxNCB8IFRfXzQxNSB8IFRfXzQxNiB8IFRfXzQxNyB8IE9QX0FUT01JQ19TRVFVRU5DRSB8IE9QX1NFUVVFTkNFIHwgT1BfU0VRVUVOQ0VfU0lERSB8IE9QX1NFUVVFTkNFX1dFQUsgfCBPUF9TQ0hFRFVMRV9HVCB8IE9QX1NDSEVEVUxFX0xUIHwgT1BfU0NIRURVTEVfWE9SIHwgT1BfU0NIRURVTEVfQU5EX1RIRU4gfCBPUF9TQ0hFRFVMRV9PUl9FTFNFIHwgT1BfTk9OX0RFVEVSTUlOSVNNIHwgT1BfQ09OQ1VSUkVOQ1lfQVNZTkMgfCBPUF9DT05DVVJSRU5DWV9BTkQgfCBPUF9DT05DVVJSRU5DWV9PUiB8IE9QX0NPTkNVUlJFTkNZX0lOVEVSTEVBVklORyB8IE9QX0NPTkNVUlJFTkNZX1BBUkFMTEVMIHwgT1BfRk9SSyB8IE9QX0pPSU4gfCBPUF9DT05DVVJSRU5DWV9SRFZfQVNZTkMgfCBPUF9DT05DVVJSRU5DWV9SRFZfQU5EIHwgT1BfQ09OQ1VSUkVOQ1lfUkRWX09SIHwgT1BfQ09OQ1VSUkVOQ1lfUkRWX0lOVEVSTEVBVklORyB8IE9QX0NPTkNVUlJFTkNZX1JEVl9QQVJBTExFTCB8IEFTU0lHTiB8IEFTU0lHTl9BRlRFUiB8IEFTU0lHTl9SRUYgfCBBU1NJR05fTUFDUk8gfCBPUF9QVVNIIHwgT1BfQVNTSUdOX1RPUCB8IE9QX1RPUCB8IE9QX1BPUCB8IExQQVJFTiB8IFJQQVJFTiB8IExDVVJMWSB8IFJDVVJMWSB8IExCUkFDS0VUIHwgUkJSQUNLRVQgfCBMQlJBQ0tFVF9FWENFUFQgfCBMUEFSRU5fSU5WT0tFIHwgTENVUkxZX0lOVk9LRSB8IFBFUkNFTlRfTFBBUkVOX0lOVk9LRSB8IFBFUkNFTlRfTFBBUkVOIHwgUlBBUkVOX1BFUkNFTlQgfCBTVEFURU1FTlRfUFJPTVBUIHwgRE9MTEFSX0xDVVJMWSB8IFJDVVJMWV9ET0xMQVIgfCBQRVJDRU5UX0xDVVJMWSB8IFJDVVJMWV9QRVJDRU5UIHwgTEJSQUNLRVRfQkFSIHwgQkFSX1JCUkFDS0VUIHwgTEJSQUNLRVRfTENVUkxZIHwgUkNVUkxZX1JCUkFDS0VUIHwgQ09MT04gfCBDT01NQSB8IFFVRVNUSU9OIHwgU0VNSSB8IERJRVNFIHwgRE9MTEFSIHwgRE9UIHwgRE9URE9UIHwgQ09MT054MiB8IExBTkQgfCBMQU5EX1RIRU4gfCBMQU5EX0FTU0lHTiB8IExBTkRfQVNTSUdOX0FGVEVSIHwgTE5PVCB8IExPUiB8IExPUl9FTFNFIHwgTE9SX0FTU0lHTiB8IExPUl9BU1NJR05fQUZURVIgfCBMWE9SIHwgRVFVQUwgfCBORVFVQUwgfCBTRVFVQUwgfCBOU0VRVUFMIHwgTFRFIHwgTFRfIHwgR1RFIHwgR1QgfCBQTFVTIHwgUExVU19BU1NJR04gfCBQTFVTX0FTU0lHTl9BRlRFUiB8IElOQ1IgfCBNSU5VUyB8IE1JTlVTX0FTU0lHTiB8IE1JTlVTX0FTU0lHTl9BRlRFUiB8IERFQ1IgfCBTVEFSIHwgU1RBUl9BU1NJR04gfCBTVEFSX0FTU0lHTl9BRlRFUiB8IERJViB8IERJVl9BU1NJR04gfCBESVZfQVNTSUdOX0FGVEVSIHwgTU9EIHwgTU9EX0FTU0lHTiB8IE1PRF9BU1NJR05fQUZURVIgfCBSU0hJRlQgfCBSU0hJRlRfQVNTSUdOIHwgUlNISUZUX0FTU0lHTl9BRlRFUiB8IExTSElGVCB8IExTSElGVF9BU1NJR04gfCBMU0hJRlRfQVNTSUdOX0FGVEVSIHwgQkFORCB8IEJBTkRfQVNTSUdOIHwgQkFORF9BU1NJR05fQUZURVIgfCBCTk9UIHwgQk9SIHwgQk9SX0FTU0lHTiB8IEJPUl9BU1NJR05fQUZURVIgfCBCWE9SIHwgQlhPUl9BU1NJR04gfCBCWE9SX0FTU0lHTl9BRlRFUiB8IElEIHwgQVRfSUQgfCBTdHJpbmdMaXRlcmFsIHwgQ2hhckxpdGVyYWwgfCBOdW1iZXJMaXRlcmFsIHwgQ09NTUVOVCB8IFdTICk7CisgKi8KK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfZW90WzE0ODRdID0KKyAgICB7CisJLTEsIDYxLCA2OCwgNzMsIDc3LCA4MSwgOTgsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgMjAwLCAyMDMsIDIwNiwgMjA5LCAyMTEsIDIxMywgMjE1LCAKKwkyMTksIDIyMywgLTEsIDIyOCwgLTEsIC0xLCAtMSwgMjMwLCAyMzQsIDIzNiwgNTMsIDI0MSwgMjQ0LCAyNDgsIC0xLCA1MywgCisJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisJLTEsIDI2MSwgLTEsIDcyLCAtMSwgLTEsIDI2NSwgMjY4LCAyNzEsIC0xLCAyNzQsIC0xLCAtMSwgLTEsIDk5LCA5OSwgOTksIAorCTk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCAtMSwgLTEsIDUzLCA1MywgNTMsIAorCTUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCAzMzksIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgMzYwLCAzNjYsIDUzLCA1MywgNTMsIAorCTUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgMzgyLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDE5OSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisJLTEsIC0xLCAtMSwgLTEsIDQ1MCwgLTEsIC0xLCAtMSwgNDUyLCAtMSwgLTEsIDIwNSwgLTEsIC0xLCA0NTcsIDQ2MCwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNDYyLCAtMSwgMjI3LCAtMSwgCisJLTEsIC0xLCAtMSwgNDY2LCAyMzMsIC0xLCAtMSwgLTEsIC0xLCA1MywgMjM5LCAtMSwgLTEsIC0xLCAyNDMsIC0xLCAtMSwgCisJMjQ2LCAtMSwgLTEsIC0xLCA1MywgNTMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDI3MCwgLTEsIC0xLCAtMSwgLTEsIC0xLCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCAKKwk5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCAKKwk5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA1MywgNTMsIDUzLCAKKwk1MzYsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCA1MywgNTMsIC0xLCA1MywgNTMsIDUzLCA1MywgNTMsIDU2NiwgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTc1LCAKKwk1MywgNTc3LCA1MywgNTMsIDUzLCA1MywgNTMsIC0xLCA1MywgNTMsIDUzLCA1MywgNTg4LCAtMSwgNTMsIDUzLCA1MywgNTMsIAorCTUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDYwMSwgNTMsIDIzNiwgNTMsIDUzLCAtMSwgNjA2LCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCA1MywgNTMsIDYxOSwgNjIxLCA2MjIsIDUzLCA2MjQsIDUzLCA1MywgNTMsIDYyOSwgNjMwLCA1MywgNTMsIDUzLCAKKwk2MzQsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgLTEsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCA1MywgNTMsIDUzLCA2NjAsIDY2MSwgNTMsIDY2MywgNTMsIDUzLCA1MywgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDQ0OSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisJNDU5LCAtMSwgLTEsIC0xLCAtMSwgLTEsIDQ2NSwgLTEsIC0xLCAtMSwgNjc1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA2OTEsIDk5LCA5OSwgCisJOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgCisJOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgNzI0LCA3MjUsIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCAKKwk5OSwgOTksIDk5LCA1MywgNTMsIDUzLCA1MywgLTEsIDUzLCA1MywgNTMsIDc0NSwgNzQ3LCA1MywgNTMsIDUzLCA3NTEsIAorCTUzLCA3NTUsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNzY0LCAtMSwgNTMsIDUzLCA1MywgNTMsIDUzLCA3NzEsIAorCTUzLCA3NzMsIC0xLCA1MywgNzc1LCA1MywgNzc3LCA1MywgNTMsIDc4MCwgNzgxLCAtMSwgNTMsIC0xLCA3ODMsIDUzLCA1MywgCisJNTMsIDUzLCA3ODksIDUzLCA1MywgNTMsIDUzLCAtMSwgNzk1LCA1MywgNTMsIDc5OCwgNzk5LCA1MywgNTMsIC0xLCA1MywgCisJLTEsIDUzLCA1MywgLTEsIDgwNiwgNTMsIDUzLCA1MywgLTEsIDUzLCA1MywgODEyLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIDUzLCAtMSwgNTMsIC0xLCAtMSwgODI0LCAtMSwgNTMsIDUzLCA1MywgNTMsIC0xLCAtMSwgNTMsIDUzLCA4MzIsIAorCS0xLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA4NDEsIDUzLCA1MywgNTMsIDUzLCA1MywgODQ4LCA1MywgODUwLCA4NTEsIAorCTUzLCA1MywgODU1LCA1MywgNTMsIDUzLCA1MywgODYxLCA1MywgLTEsIC0xLCA1MywgLTEsIDUzLCA4NjUsIDUzLCAtMSwgCisJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA4NzAsIDk5LCA5OSwgLTEsIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIAorCTk5LCA5OSwgOTksIDk5LCA5OSwgLTEsIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgODkyLCA5OSwgOTksIDk5LCAKKwk5OSwgODk3LCA5OSwgOTksIC0xLCA5OSwgLTEsIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgCisJOTksIDk5LCAtMSwgLTEsIDk5LCA5OSwgOTksIDkxOCwgOTksIDk5LCA5OSwgOTksIDkyMywgOTI0LCA5MjUsIDkyNiwgNTMsIAorCTUzLCA1MywgNTMsIDkzMSwgNTMsIC0xLCAtMSwgNTMsIC0xLCA5MzQsIDUzLCA1MywgLTEsIDUzLCA1MywgNTMsIC0xLCA1MywgCisJNTMsIDk0MiwgOTQzLCA1MywgOTQ1LCA1MywgOTQ3LCAtMSwgNTMsIDUzLCA1MywgOTUxLCA1MywgNTMsIC0xLCA1MywgLTEsIAorCTk1NSwgLTEsIDk1NiwgLTEsIDk1NywgOTU4LCAtMSwgLTEsIC0xLCAtMSwgOTU5LCA1MywgNTMsIDUzLCAtMSwgLTEsIDk2MywgCisJOTY2LCA1MywgNTMsIDUzLCAtMSwgNTMsIDUzLCAtMSwgLTEsIDUzLCA5NzMsIDUzLCA5NzYsIDUzLCAtMSwgLTEsIDUzLCAKKwk1MywgNTMsIDUzLCA1MywgLTEsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgLTEsIDUzLCAKKwk1MywgNTMsIDEwMDIsIDUzLCA1MywgNTMsIC0xLCA1MywgLTEsIDUzLCAxMDA4LCAxMDEwLCA1MywgNTMsIDUzLCAtMSwgNTMsIAorCTUzLCA1MywgNTMsIDUzLCAxMDE5LCAtMSwgNTMsIC0xLCAtMSwgNTMsIDUzLCA1MywgLTEsIDUzLCAxMDI1LCA1MywgNTMsIAorCTUzLCAtMSwgMTAyOSwgNTMsIDUzLCAtMSwgMTAzMiwgLTEsIC0xLCAtMSwgLTEsIDEwMzMsIDk5LCA5OSwgOTksIDk5LCA5OSwgCisJOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgMTA0NSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCAtMSwgOTksIDk5LCAKKwk5OSwgOTksIC0xLCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCAKKwk5OSwgOTksIDk5LCAxMDc3LCA5OSwgLTEsIDk5LCA5OSwgOTksIDk5LCAtMSwgLTEsIC0xLCAtMSwgMTA4MywgNTMsIDUzLCAKKwk1MywgLTEsIDUzLCA1MywgLTEsIDUzLCAxMDkwLCA1MywgNTMsIDUzLCA1MywgMTA5NSwgLTEsIC0xLCA1MywgLTEsIDUzLCAKKwktMSwgNTMsIDUzLCAxMTAwLCAtMSwgNTMsIDExMDIsIDExMDMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMTEwNCwgNTMsIDUzLCAKKwktMSwgNTMsIDUzLCAtMSwgNTMsIDUzLCA1MywgMTExNywgNTMsIDUzLCAtMSwgNTMsIC0xLCAtMSwgNTMsIDUzLCA1MywgNTMsIAorCTUzLCA1MywgNTMsIDUzLCAxMTMwLCA1MywgMTEzMiwgNTMsIDUzLCAtMSwgNTMsIC0xLCA1MywgNTMsIDUzLCA1MywgMTE0MCwgCisJNTMsIDUzLCAxMTQzLCAxMTQ1LCAtMSwgNTMsIDUzLCA1MywgMTE0OSwgNTMsIC0xLCA1MywgLTEsIDExNTIsIDUzLCA1MywgCisJMTE1NSwgMTE1NiwgNTMsIDExNTgsIDExNTksIC0xLCA1MywgNTMsIDExNjMsIDUzLCA1MywgLTEsIDUzLCAxMTY3LCA1MywgCisJLTEsIDExNjksIDUzLCAtMSwgLTEsIDk5LCA5OSwgOTksIDk5LCAxMTc1LCA5OSwgOTksIDk5LCA5OSwgMTE4MCwgOTksIC0xLCAKKwk5OSwgLTEsIDk5LCAxMTg0LCA5OSwgOTksIDk5LCA5OSwgLTEsIC0xLCA5OSwgOTksIDk5LCAtMSwgLTEsIDk5LCA5OSwgOTksIAorCTk5LCAtMSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCAxMjA2LCA5OSwgOTksIC0xLCA5OSwgMTIxMCwgOTksIAorCTk5LCA5OSwgLTEsIDUzLCA1MywgMTIxNiwgMTIxNywgMTIxOCwgNTMsIC0xLCAxMjIxLCAxMjIyLCA1MywgNTMsIC0xLCAxMjI2LCAKKwk1MywgMTIyOCwgMTIyOSwgLTEsIDEyMzAsIC0xLCAtMSwgLTEsIDUzLCAxMjMyLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIDEyNDEsIDUzLCAtMSwgNTMsIDEyNDQsIDEyNDUsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCAxMjUzLCAKKwk1MywgLTEsIDEyNTksIC0xLCAxMjYxLCAxMjYyLCAxMjYzLCA1MywgNTMsIDUzLCA1MywgLTEsIDUzLCAxMjY5LCAtMSwgNTMsIAorCS0xLCAxMjcxLCAxMjcyLCA1MywgLTEsIC0xLCA1MywgLTEsIDUzLCA1MywgLTEsIC0xLCAxMjc5LCAtMSwgLTEsIDUzLCA1MywgCisJMTI4MiwgLTEsIDUzLCAxMjg0LCA1MywgLTEsIDUzLCAtMSwgNTMsIDk5LCA5OSwgOTksIDk5LCAtMSwgOTksIDEyOTMsIDk5LCAKKwktMSwgLTEsIDk5LCA5OSwgLTEsIC0xLCA5OSwgMTI5OCwgLTEsIDEyOTksIDk5LCA5OSwgOTksIDk5LCAxMzA0LCAtMSwgMTMwNSwgCisJOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgLTEsIC0xLCAtMSwgOTksIC0xLCAxMzE0LCA5OSwgOTksIC0xLCAtMSwgOTksIDk5LCAKKwk1MywgMTMyMCwgLTEsIC0xLCAtMSwgNTMsIDUzLCAtMSwgLTEsIDUzLCAxMzI0LCA1MywgLTEsIDEzMjYsIC0xLCAtMSwgLTEsIAorCTEzMjcsIC0xLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgMTMzNiwgLTEsIDEzMzcsIDEzMzgsIC0xLCAtMSwgNTMsIAorCTUzLCA1MywgNTMsIDEzNDMsIDEzNDQsIDEzNDUsIC0xLCA1MywgNTMsIDUzLCA1MywgNTMsIC0xLCA1MywgLTEsIC0xLCAtMSwgCisJNTMsIDUzLCA1MywgNTMsIDEzNTYsIC0xLCAtMSwgLTEsIC0xLCAxMzU3LCA1MywgNTMsIDUzLCA1MywgNTMsIC0xLCA1MywgCisJNTMsIC0xLCAxMzY2LCAtMSwgNTMsIDUzLCAxMzY5LCA5OSwgOTksIDk5LCA5OSwgOTksIC0xLCA5OSwgOTksIDEzNzcsIDEzNzgsIAorCS0xLCAtMSwgOTksIDk5LCAtMSwgMTM4MSwgLTEsIC0xLCA5OSwgLTEsIDk5LCA5OSwgOTksIDk5LCAtMSwgLTEsIC0xLCAxMzg3LCAKKwk5OSwgOTksIC0xLCAtMSwgLTEsIDEzOTAsIDUzLCAxMzkyLCAtMSwgMTM5MywgLTEsIC0xLCA1MywgMTM5NSwgNTMsIDEzOTcsIAorCTUzLCAxMzk5LCA1MywgLTEsIC0xLCAtMSwgLTEsIDE0MDEsIDE0MDIsIDE0MDMsIDUzLCAtMSwgLTEsIC0xLCA1MywgNTMsIAorCTUzLCA1MywgNTMsIDUzLCAxNDExLCAxNDEyLCAxNDEzLCAtMSwgLTEsIC0xLCA1MywgNTMsIDE0MTYsIDUzLCA1MywgMTQxOSwgCisJMTQyMCwgNTMsIC0xLCAxNDIyLCAxNDIzLCAtMSwgLTEsIDE0MjUsIDk5LCA5OSwgOTksIDE0MjksIDk5LCAtMSwgLTEsIC0xLCAKKwk5OSwgLTEsIDk5LCA5OSwgLTEsIDk5LCA5OSwgLTEsIDk5LCA5OSwgLTEsIDE0MzgsIC0xLCAtMSwgNTMsIC0xLCAxNDQwLCAKKwktMSwgMTQ0MSwgLTEsIDUzLCAtMSwgLTEsIC0xLCA1MywgNTMsIDE0NDUsIDUzLCAxNDQ3LCAxNDQ4LCA1MywgLTEsIC0xLCAKKwktMSwgNTMsIDUzLCAtMSwgMTQ1MiwgNTMsIC0xLCAtMSwgMTQ1NCwgLTEsIC0xLCAtMSwgLTEsIDk5LCAxNDU2LCA5OSwgLTEsIAorCTk5LCA5OSwgLTEsIC0xLCAtMSwgLTEsIDk5LCA5OSwgLTEsIDUzLCAtMSwgLTEsIDUzLCA1MywgNTMsIC0xLCAxNDY2LCAtMSwgCisJLTEsIDE0NjcsIDUzLCA1MywgLTEsIDE0NzAsIC0xLCAxNDcxLCAtMSwgOTksIC0xLCA5OSwgOTksIC0xLCAxNDc1LCA1MywgCisJNTMsIDUzLCAtMSwgLTEsIDE0NzksIDE0ODAsIC0xLCAtMSwgLTEsIC0xLCA5OSwgLTEsIDE0ODIsIC0xLCAxNDgzLCAtMSwgCisJLTEsIC0xLCAtMSwgLTEKKyAgICB9Oworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9lb2ZbMTQ4NF0gPQorICAgIHsKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEKKyAgICB9Oworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9taW5bMTQ4NF0gPQorICAgIHsKKwk5LCAxMDAsIDU4LCA0NSwgNDUsIDMzLCA2NSwgOTgsIDEwNSwgOTcsIDEwMSwgMTA4LCA5NywgMTExLCA5NywgMTExLCA5NywgCisJOTcsIDEwMSwgMTEyLCA5NywgOTcsIDk5LCAxMDMsIDEwMCwgOTcsIDk3LCA0NCwgNTgsIDU4LCA2MSwgNTgsIDM3LCA1OCwgCisJMzYsIDk0LCAtMSwgNDAsIC0xLCAtMSwgLTEsIDQ2LCAzOCwgNjEsIDExMSwgNDMsIDU4LCA0MiwgLTEsIDQ2LCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgMTEwLCAtMSwgMTA0LCAtMSwgLTEsIDk5LCAtMSwgLTEsIDEwMSwgLTEsIC0xLCAtMSwgCisJNjIsIC0xLCA1OCwgLTEsIC0xLCA0NSwgNjAsIDU4LCAtMSwgNjEsIC0xLCAtMSwgLTEsIDk4LCAxMDEsIDExMSwgMTAxLCAKKwkxMDIsIDEwNSwgMTE3LCAxMDEsIDk3LCA5NywgMTEwLCA5NywgMTAxLCA5OSwgMTAzLCAxMDIsIC0xLCAtMSwgMTExLCAxMTYsIAorCTEwMCwgMTE0LCAxMDksIDExMCwgMTExLCAxMDEsIDEwMiwgMTA4LCA5NywgOTcsIDExMCwgMTA1LCAxMTUsIDExNSwgMzUsIAorCTEwNSwgMTEwLCAxMTUsIDk3LCAxMDEsIDEwNSwgMTA4LCAxMDIsIDExMSwgMTE0LCAxMTEsIDExMCwgMTE2LCA5NywgOTgsIAorCTEwNSwgMTEwLCAzNSwgMzUsIDEwNSwgMTA5LCAxMDIsIDk5LCAxMTUsIDk5LCAxMDgsIDExOSwgMTA4LCAxMTYsIDEwMSwgCisJMzUsIDExNiwgOTksIDExNCwgMTAxLCA5OCwgMTA5LCAxMTgsIDk3LCAxMTcsIDk5LCAxMTAsIDEwMSwgMTA0LCAxMDgsIDEwMywgCisJMTA4LCA5NywgMTE1LCAxMTUsIDExNywgMTA5LCA1OCwgOTcsIDExMiwgMTExLCAxMDgsIDExMCwgMTA1LCA5NywgMTA4LCAKKwk5OSwgOTcsIDEwOCwgMTA1LCAxMDUsIDU4LCAtMSwgNTksIC0xLCAwLCAtMSwgLTEsIC0xLCAxMTAsIDExNCwgMTEwLCAtMSwgCisJLTEsIC0xLCA0NCwgLTEsIC0xLCAtMSwgNjEsIC0xLCAtMSwgNTgsIC0xLCAtMSwgNjIsIDU4LCAtMSwgLTEsIC0xLCAtMSwgCisJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA1OCwgLTEsIDU4LCAtMSwgLTEsIC0xLCAtMSwgCisJNTgsIDU4LCAtMSwgLTEsIC0xLCAtMSwgMTE0LCA1OCwgLTEsIC0xLCAtMSwgNTgsIC0xLCAtMSwgNTgsIC0xLCAtMSwgLTEsIAorCTEwNSwgNDYsIDEwNSwgLTEsIDk3LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisJLTEsIC0xLCA1OCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAxMTEsIDEwNCwgMTA5LCAxMDEsIDk5LCAxMTUsIDEwMiwgOTcsIDEwMSwgCisJMTEwLCAxMDgsIDExNCwgOTcsIDk3LCA5OCwgMTA1LCAxMTAsIDExMiwgOTksIDExNywgOTksIDk5LCA5NSwgMTE2LCAxMTYsIAorCTk5LCAxMDUsIDk4LCAxMDMsIDExNywgOTksIDExMCwgMTA0LCA5NywgMTE1LCAxMTcsIDk3LCAxMDksIDEwNSwgMTE0LCAxMDEsIAorCTEwNSwgMzUsIDk5LCA5NywgOTksIDEwMCwgMTA4LCA5NywgOTcsIDEwMiwgMTA4LCAxMTAsIDk5LCAxMDUsIDExNSwgOTksIAorCTExMCwgMTA5LCAxMTQsIDU4LCAxMTYsIDk3LCA5OCwgLTEsIDEwOSwgOTcsIDEwMSwgOTgsIDEwOSwgMzUsIDExMCwgMTE2LCAKKwkxMTUsIDExMSwgOTcsIDk3LCAzNSwgMTA5LCAzNSwgMTExLCAxMTQsIDExMSwgMTE1LCA5NywgLTEsIDExNiwgMTE3LCAxMTcsIAorCTExNiwgMzUsIC0xLCAxMTAsIDk4LCAxMDEsIDExNiwgMTA0LCA1OCwgMTE1LCA1OCwgMTAxLCAxMTYsIDM1LCAxMDgsIDM1LCAKKwkxMTQsIDEwMSwgLTEsIDM1LCAxMDcsIDEwMSwgMTE2LCA5NSwgMTE1LCAxMTEsIDk4LCAxMDgsIDM1LCAzNSwgMzUsIDEwOCwgCisJMzUsIDExNiwgMTE3LCAxMTYsIDM1LCAzNSwgOTksIDEwMSwgMTAyLCAzNSwgMTEwLCAxMDEsIDExOCwgMTE0LCAxMTIsIDExMiwgCisJMTA1LCAxMTIsIDExNiwgOTcsIDEwMSwgLTEsIDExMCwgMTAxLCAxMDEsIDExNywgMTExLCAxMTYsIDk5LCA5NywgMTE2LCAKKwk5NywgMzUsIDM1LCAxMTYsIDM1LCA5NywgMTE2LCAxMDgsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMTAwLCAtMSwgMzUsIC0xLCAKKwkxMTAsIC0xLCAtMSwgLTEsIDU4LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA1OCwgLTEsIC0xLCAtMSwgCisJLTEsIC0xLCA1OCwgLTEsIC0xLCAtMSwgMzUsIC0xLCAtMSwgLTEsIC0xLCAxMTYsIC0xLCAtMSwgLTEsIC0xLCAxMTQsIDk3LCAKKwk1OCwgOTksIDk3LCAxMDgsIDk3LCAxMDEsIDEwMSwgOTgsIDk5LCA5NywgMzUsIDEwOSwgMTE0LCAxMDAsIDExMSwgMTE1LCAKKwk5NywgMTExLCAxMDgsIDExNiwgMTE3LCAxMTcsIDExNiwgMTAxLCAxMTAsIDEwNCwgNTgsIDEwMSwgNTgsIDExOSwgMTA1LCAKKwkxMTIsIDEwNywgOTcsIDExOCwgOTksIDEwOCwgMTA1LCAxMTcsIDExNiwgMzUsIDM1LCAxMDEsIDExNCwgMTEyLCAxMTYsIAorCTk3LCAxMTAsIDEwMywgMTA4LCAxMTIsIDk3LCAxMTYsIDExMCwgMTE4LCAxMTYsIC0xLCA5NywgMTIxLCAxMTEsIDM1LCAzNSwgCisJMTA3LCAxMDAsIDEwMSwgMzUsIDEwMywgMzUsIDEwNywgOTksIDExNSwgMTA3LCAxMDEsIDExNiwgMTA1LCAxMDEsIDM1LCAKKwktMSwgMTE0LCA5OCwgMTA4LCAxMDEsIDEwOSwgMzUsIDEwOCwgMzUsIC0xLCAxMTYsIDM1LCAxMDEsIDM1LCAxMDgsIDExNiwgCisJMzUsIDM1LCAtMSwgNTgsIC0xLCAzNSwgMTAwLCAxMTQsIDk3LCA5OCwgMzUsIDExNiwgMTE2LCA5NywgMTAzLCAtMSwgMzUsIAorCTEwMCwgMTA4LCAzNSwgMzUsIDEwNSwgMTExLCAtMSwgOTcsIC0xLCAxMDgsIDEwNSwgLTEsIDM1LCA5NywgMTA4LCAxMTcsIAorCS0xLCA5NywgMTEwLCAzNSwgMTA1LCAxMDEsIDExNCwgOTcsIDk3LCAxMDEsIDEwMSwgMTA1LCAxMDUsIC0xLCAxMTEsIC0xLCAKKwktMSwgMzUsIC0xLCA5NywgMTA5LCAxMTQsIDEwMSwgLTEsIC0xLCAxMTYsIDEwMCwgMzUsIC0xLCA5NywgNTgsIDEwMSwgMTE2LCAKKwkxMDEsIDk1LCAzNSwgMTEwLCA5OSwgMTAxLCAxMDEsIDExNCwgMzUsIDExNSwgMzUsIDM1LCA5OCwgOTcsIDM1LCA5NywgMTEwLCAKKwkxMDEsIDEwMiwgMzUsIDEwOCwgLTEsIC0xLCAxMTEsIC0xLCAxMTYsIDM1LCAxMDEsIDM1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIDEwNSwgMTE2LCAxMTgsIC0xLCAxMTEsIDExNywgMTE2LCAxMTYsIDk3LCA5OCwgMTE0LCA5OSwgMTA4LCAKKwkxMTcsIDEwOCwgLTEsIDk3LCAxMDAsIDEwMSwgMTE0LCA5NywgOTgsIDExNCwgMTE3LCAzNSwgMTE2LCAxMTYsIDk3LCAxMTQsIAorCTM1LCAxMDUsIDExMSwgLTEsIDEwOCwgLTEsIDExNCwgMTExLCAxMTcsIDk3LCAxMDksIDk3LCAxMDEsIDEwMSwgMTAxLCAxMDUsIAorCTExMSwgMTE0LCAxMDUsIC0xLCAtMSwgMTAwLCAxMTYsIDEwMSwgMzUsIDEwMSwgMTE0LCAxMTUsIDEwMywgMzUsIDM1LCAzNSwgCisJMzUsIDExNiwgMTA1LCAxMDQsIDExNSwgMzUsIDEwMCwgLTEsIC0xLCA5NywgLTEsIDM1LCA5OSwgMTE0LCAtMSwgMTAxLCAKKwkxMDEsIDk5LCAtMSwgMTE1LCAxMDEsIDM1LCAzNSwgOTksIDM1LCAxMTAsIDM1LCAtMSwgMTExLCAxMDgsIDEwMSwgMzUsIAorCTEwNSwgMTAyLCAtMSwgMTAxLCAtMSwgMzUsIC0xLCAzNSwgLTEsIDM1LCAzNSwgLTEsIC0xLCAtMSwgLTEsIDM1LCAxMTYsIAorCTk4LCAxMDgsIC0xLCAtMSwgMzUsIDM1LCAxMTAsIDEwMSwgMTE4LCAtMSwgOTcsIDEwNSwgLTEsIC0xLCAxMTAsIDM1LCAxMDMsIAorCTM1LCA5OSwgLTEsIC0xLCAxMTYsIDExNSwgMTE2LCAxMDMsIDExNiwgLTEsIDExMCwgMTEwLCA1OCwgMTE2LCA1OCwgMTAwLCAKKwk5OSwgMTE2LCAxMDAsIDk5LCAxMTAsIC0xLCAxMTQsIDEwMSwgMTEwLCAzNSwgMTEwLCAxMTEsIDExNywgLTEsIDEwOCwgLTEsIAorCTExNCwgMzUsIDM1LCA5OSwgMTE1LCAxMDksIC0xLCAxMDMsIDExNiwgMTEwLCAxMDksIDEwMCwgMzUsIC0xLCAxMDUsIC0xLCAKKwktMSwgMTA4LCAxMTYsIDEwMywgLTEsIDExNSwgMzUsIDExNCwgMTAxLCAxMTEsIC0xLCAzNSwgMTE0LCAxMDUsIC0xLCAzNSwgCisJLTEsIC0xLCAtMSwgLTEsIDM1LCAxMDUsIDExNSwgMTE0LCAxMTQsIDEwMSwgMTE0LCAxMDgsIDExNSwgMTE2LCAxMDEsIDExNiwgCisJMzUsIDEwOCwgNTgsIDExNCwgMTE2LCA5OCwgMTA4LCAxMTYsIDEwMCwgLTEsIDU4LCA1OCwgMTEwLCA5NywgLTEsIDExMCwgCisJNTgsIDU4LCAxMDUsIDExMCwgMTE2LCAxMDMsIDU4LCAxMTYsIDEwMCwgMTE0LCA5OSwgMTE2LCA5OSwgMTEwLCAxMTAsIDExMCwgCisJMTE3LCAzNSwgMTA5LCAtMSwgMTA5LCAxMDAsIDEwNSwgMTAxLCAtMSwgLTEsIC0xLCAtMSwgMzUsIDExNiwgMTAxLCAxMTYsIAorCS0xLCAxMDEsIDExMCwgLTEsIDk3LCAzNSwgMTAwLCAxMDgsIDExNiwgOTcsIDM1LCAtMSwgLTEsIDExNiwgLTEsIDExNywgCisJLTEsIDEyMSwgMTAxLCAzNSwgLTEsIDk5LCAzNSwgMzUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMzUsIDEwOCwgMTAxLCAtMSwgCisJOTgsIDEwMSwgLTEsIDk5LCAxMTQsIDk3LCAzNSwgMTEwLCAxMDEsIC0xLCAxMDEsIC0xLCAtMSwgOTcsIDEwNSwgMTA1LCAKKwkxMDgsIDEwMCwgMTAxLCAxMTEsIDEwMSwgMzUsIDEwMSwgMzUsIDExNiwgMTE2LCAtMSwgMTAxLCAtMSwgMTE3LCAxMTYsIAorCTEyMSwgMTAxLCAzNSwgOTcsIDExNiwgMzUsIDM1LCAtMSwgMTAxLCAxMTQsIDEwOCwgMzUsIDU4LCAtMSwgOTcsIC0xLCAzNSwgCisJMzUsIDk3LCAzNSwgMzUsIDEwMCwgMzUsIDM1LCAtMSwgMTAxLCAxMDEsIDM1LCAxMDEsIDExNiwgLTEsIDExNSwgMzUsIDExMCwgCisJLTEsIDM1LCAxMDgsIC0xLCAtMSwgMTExLCAxMDUsIDExNCwgOTcsIDM1LCA5NywgMTAxLCAxMDUsIDU4LCAzNSwgOTcsIC0xLCAKKwkxMDksIC0xLCA1OCwgMzUsIDEwOCwgMTAxLCA1OCwgMTAxLCAtMSwgLTEsIDk5LCA5OSwgMTAxLCAtMSwgLTEsIDExNiwgMTE1LCAKKwk1OCwgMTAxLCAtMSwgMTE2LCAxMDEsIDExNywgMTE2LCAxMTYsIDEyMSwgNTgsIDU4LCAzNSwgMTAxLCAxMDgsIC0xLCA5NywgCisJMzUsIDU4LCAxMTYsIDExNCwgLTEsIDEyMSwgMTEwLCAzNSwgMzUsIDM1LCAxMTUsIC0xLCAzNSwgMzUsIDEwMSwgMTE2LCAKKwktMSwgMzUsIDEwMSwgMzUsIDM1LCAtMSwgMzUsIC0xLCAtMSwgLTEsIDEwMSwgMzUsIDExNywgMTEwLCAxMDgsIDEwMCwgOTcsIAorCTk3LCAxMTAsIDEwMSwgMzUsIDEwOCwgLTEsIDEwMSwgMzUsIDM1LCAxMTUsIDEwMiwgMTAyLCAxMDUsIDExOCwgMTE2LCAxMTQsIAorCTM1LCA5OCwgLTEsIDM1LCAtMSwgMzUsIDM1LCAzNSwgMTE0LCAxMDEsIDExMiwgMTAwLCAtMSwgMTA4LCAzNSwgLTEsIDU4LCAKKwktMSwgMzUsIDM1LCAxMDEsIC0xLCAtMSwgOTksIC0xLCA5OCwgMTE0LCAtMSwgLTEsIDM1LCAtMSwgLTEsIDExMCwgMTA1LCAKKwkzNSwgLTEsIDExNCwgMzUsIDk3LCAtMSwgOTcsIC0xLCAxMDEsIDExNCwgMTE2LCAxMDEsIDEwNSwgLTEsIDExNiwgMzUsIAorCTExNiwgLTEsIC0xLCA5OCwgMTA4LCAtMSwgLTEsIDEwMSwgMzUsIC0xLCAzNSwgMTAxLCAxMTYsIDU4LCAxMDEsIDM1LCAtMSwgCisJMzUsIDEwMSwgNTgsIDExNCwgMTIxLCAxMDEsIDExMiwgLTEsIC0xLCAtMSwgNTgsIC0xLCAzNSwgMTAxLCA5OSwgLTEsIC0xLCAKKwkxMDUsIDU4LCA1OCwgMzUsIC0xLCAtMSwgLTEsIDExNiwgMTE2LCAtMSwgLTEsIDExNCwgMzUsIDExNCwgLTEsIDM1LCAtMSwgCisJLTEsIC0xLCAzNSwgLTEsIDEwMiwgMTE4LCAxMTEsIDExOCwgMTE4LCAxMTQsIDk3LCAzNSwgLTEsIDM1LCAzNSwgLTEsIC0xLCAKKwkxMTYsIDExMSwgMTExLCA5OSwgMzUsIDM1LCAzNSwgLTEsIDExNywgMTEwLCAxMDgsIDEwMCwgOTcsIC0xLCAxMDMsIC0xLCAKKwktMSwgLTEsIDEwMSwgMTAwLCAxMDEsIDU4LCAzNSwgLTEsIC0xLCAtMSwgLTEsIDM1LCAxMDQsIDEwMSwgMTE1LCA5NywgMTA3LCAKKwktMSwgMTE2LCAxMTEsIC0xLCAzNSwgLTEsIDEwOCwgMTA4LCAzNSwgNTgsIDEwMSwgMTEwLCAxMTAsIDEwNSwgLTEsIDEyMSwgCisJMTA4LCAzNSwgMzUsIC0xLCAtMSwgNTgsIDEwNSwgLTEsIDM1LCAtMSwgLTEsIDExNCwgLTEsIDEwMSwgNTgsIDEwMCwgMTAxLCAKKwktMSwgLTEsIC0xLCAzNSwgMTA0LCAxMTEsIC0xLCAtMSwgLTEsIDM1LCAxMTEsIDM1LCAtMSwgMzUsIC0xLCAtMSwgMTAyLCAKKwkzNSwgMTE5LCAzNSwgMTAxLCAzNSwgOTgsIC0xLCAtMSwgLTEsIC0xLCAzNSwgMzUsIDM1LCAxMDUsIC0xLCAtMSwgLTEsIAorCTEwMiwgMTE4LCAxMTEsIDExOCwgMTE0LCAxMDEsIDM1LCAzNSwgMzUsIC0xLCAtMSwgLTEsIDEwNSwgMTA1LCAzNSwgMTE1LCAKKwkxMDgsIDM1LCAzNSwgMTEwLCAtMSwgMzUsIDM1LCAtMSwgLTEsIDM1LCA5OSwgMTE2LCAxMTEsIDM1LCAxMDEsIC0xLCAtMSwgCisJLTEsIDExMSwgLTEsIDU4LCA1OCwgLTEsIDU4LCA1OCwgLTEsIDEwNSwgMTEwLCAtMSwgMzUsIC0xLCAtMSwgMTAxLCAtMSwgCisJMzUsIC0xLCAzNSwgLTEsIDEwOCwgLTEsIC0xLCAtMSwgMTE2LCAxMDIsIDM1LCAxMTksIDM1LCAzNSwgMTE0LCAtMSwgLTEsIAorCS0xLCAxMTAsIDExMCwgLTEsIDM1LCAxMDgsIC0xLCAtMSwgMzUsIC0xLCAtMSwgLTEsIC0xLCAxMjEsIDM1LCAxMTAsIC0xLCAKKwk1OCwgMTEwLCAtMSwgLTEsIC0xLCAtMSwgMTEwLCA1OCwgLTEsIDExNCwgLTEsIC0xLCAxMDEsIDEyMSwgMTAxLCAtMSwgMzUsIAorCS0xLCAtMSwgMzUsIDEwMSwgMTAzLCAtMSwgMzUsIC0xLCAzNSwgLTEsIDU4LCAtMSwgNTgsIDEwMSwgLTEsIDM1LCAxMDAsIAorCTU4LCAxMTQsIC0xLCAtMSwgMzUsIDM1LCAtMSwgLTEsIC0xLCAtMSwgNTgsIC0xLCAzNSwgLTEsIDM1LCAtMSwgLTEsIC0xLCAKKwktMSwgLTEKKyAgICB9Oworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9tYXhbMTQ4NF0gPQorICAgIHsKKwkxMjYsIDExNiwgMTIzLCA2MiwgNjEsIDYxLCAxMjIsIDExOCwgMTE3LCAxMTYsIDEyMSwgMTIwLCAxMTcsIDExNywgMTEwLCAKKwkxMTEsIDEwNSwgMTE3LCAxMTcsIDExNywgMTE3LCAxMTgsIDEyMSwgMTIxLCAxMTQsIDExMSwgMTA0LCAxNjcsIDYyLCA2MSwgCisJNjIsIDU4LCAzNywgNTgsIDkzLCAxMjQsIC0xLCAxMjMsIC0xLCAtMSwgLTEsIDk1LCA2MSwgNjEsIDExMSwgNjEsIDYxLCAKKwk2MSwgLTEsIDEwMiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDExMCwgLTEsIDExNiwgLTEsIC0xLCAxMTYsIC0xLCAKKwktMSwgMTE3LCAtMSwgLTEsIC0xLCA2MiwgLTEsIDU4LCAtMSwgLTEsIDYyLCA2MSwgNjEsIC0xLCA2MiwgLTEsIC0xLCAtMSwgCisJOTgsIDEwMSwgMTE0LCAxMDUsIDEyMCwgMTExLCAxMTcsIDEwMSwgMTE0LCAxMTEsIDExNywgMTE3LCAxMTcsIDEyMSwgMTE0LCAKKwkxMDgsIC0xLCAtMSwgMTE1LCAxMTYsIDEyMSwgMTE0LCAxMDksIDExMCwgMTExLCAxMTEsIDEwMiwgMTA4LCAxMTEsIDExMSwgCisJMTEwLCAxMjAsIDExNSwgMTE1LCAxMjIsIDEwNSwgMTEwLCAxMTUsIDExOCwgMTAxLCAxMDUsIDEwOCwgMTEwLCAxMTEsIDExNCwgCisJMTExLCAxMTAsIDExNiwgOTcsIDk4LCAxMDUsIDExMCwgMTIyLCAxMjIsIDEwNSwgMTA5LCAxMTUsIDEyMCwgMTE1LCAxMDAsIAorCTEwOCwgMTE5LCAxMDgsIDExNiwgMTAxLCAxMjIsIDExNiwgMTE0LCAxMTUsIDExMSwgOTgsIDExNiwgMTE4LCAxMTYsIDExNywgCisJOTksIDExMCwgMTAxLCAxMDQsIDExNiwgMTIyLCAxMDgsIDExNCwgMTE1LCAxMTUsIDExNywgMTA5LCA1OCwgMTE3LCAxMTIsIAorCTExMSwgMTA4LCAxMTAsIDExNSwgMTAxLCAxMTQsIDk5LCA5NywgMTA4LCAxMDUsIDEwNSwgNjIsIC0xLCAxMjQsIC0xLCA1OSwgCisJLTEsIC0xLCAtMSwgMTI0LCAxMTQsIDEyNCwgLTEsIC0xLCAtMSwgMTExLCAtMSwgLTEsIC0xLCA2MSwgLTEsIC0xLCA2MiwgCisJLTEsIC0xLCA2MiwgNjEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisJLTEsIDU4LCAtMSwgNTgsIC0xLCAtMSwgLTEsIC0xLCA2MSwgNTgsIC0xLCAtMSwgLTEsIC0xLCAxMTQsIDU4LCAtMSwgLTEsIAorCS0xLCA1OCwgLTEsIC0xLCA1OCwgLTEsIC0xLCAtMSwgMTA1LCAxMDIsIDEwNSwgLTEsIDExNSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNTgsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMTExLCAKKwkxMDQsIDExMCwgMTAxLCA5OSwgMTE4LCAxMDIsIDk3LCAxMDEsIDExMCwgMTA4LCAxMTQsIDk3LCA5NywgOTgsIDEwNSwgMTEwLCAKKwkxMTIsIDExNiwgMTE3LCA5OSwgMTAxLCA5NSwgMTE2LCAxMTYsIDExNCwgMTExLCA5OCwgMTE2LCAxMTcsIDk5LCAxMTAsIAorCTEwNCwgMTExLCAxMTUsIDExNywgMTA1LCAxMTUsIDEwNSwgMTE0LCAxMDEsIDEwNSwgMTIyLCA5OSwgOTcsIDk5LCAxMDAsIAorCTEwOCwgOTcsIDk3LCAxMDIsIDEwOCwgMTE0LCA5OSwgMTA1LCAxMTUsIDk5LCAxMTYsIDEwOSwgMTE0LCA1OCwgMTE2LCA5NywgCisJOTgsIC0xLCAxMDksIDk3LCAxMDEsIDk4LCAxMDksIDEyMiwgMTEwLCAxMTYsIDExNSwgMTExLCA5NywgMTE5LCAxMjIsIDEwOSwgCisJMTIyLCAxMTEsIDExNCwgMTExLCAxMTUsIDk3LCAtMSwgMTE2LCAxMTcsIDExNywgMTE2LCAxMjIsIC0xLCAxMTAsIDk4LCAKKwkxMTEsIDExNiwgMTE0LCA1OCwgMTE1LCA1OCwgMTAxLCAxMTYsIDEyMiwgMTA4LCAxMjIsIDExNCwgMTAxLCAtMSwgMTIyLCAKKwkxMDcsIDEwMSwgMTE2LCA5NSwgMTE1LCAxMTgsIDExOCwgMTA4LCAxMjIsIDEyMiwgMTIyLCAxMDgsIDEyMiwgMTE3LCAxMTcsIAorCTExNiwgMTIyLCAxMjIsIDk5LCAxMDEsIDEwMiwgMTIyLCAxMTAsIDEwMSwgMTE4LCAxMTYsIDExMiwgMTEyLCAxMTcsIDExMiwgCisJMTE2LCA5NywgMTAxLCAtMSwgMTEwLCAxMDEsIDEwMSwgMTE3LCAxMTEsIDExNiwgMTE4LCA5NywgMTE2LCA5NywgMTIyLCAKKwkxMjIsIDExNiwgMTIyLCA5NywgMTE2LCAxMDgsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMTAwLCAtMSwgMTI0LCAtMSwgMTI0LCAKKwktMSwgLTEsIC0xLCA1OCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNTgsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgNTgsIC0xLCAtMSwgLTEsIDEyMiwgLTEsIC0xLCAtMSwgLTEsIDExNiwgLTEsIC0xLCAtMSwgLTEsIDExNCwgOTcsIAorCTExMiwgMTE1LCA5NywgMTA4LCA5NywgMTAxLCAxMDEsIDk4LCA5OSwgOTcsIDEyMiwgMTA5LCAxMTQsIDEwMCwgMTExLCAxMTUsIAorCTk3LCAxMTEsIDEwOCwgMTE2LCAxMTcsIDExNywgMTE2LCAxMDEsIDExMCwgMTE0LCA1OCwgMTAxLCA1OCwgMTE5LCAxMDUsIAorCTExMiwgMTA3LCA5NywgMTE4LCAxMTYsIDEwOCwgMTA1LCAxMTcsIDExNiwgMTIyLCAxMjIsIDEwMSwgMTE2LCAxMTIsIDExNiwgCisJOTcsIDExMCwgMTAzLCAxMDgsIDExMiwgOTcsIDExNiwgMTEwLCAxMTgsIDExNiwgLTEsIDk3LCAxMjEsIDExMSwgMTIyLCAKKwkxMjIsIDEwNywgMTAwLCAxMDEsIDEyMiwgMTEwLCAxMjIsIDEwNywgOTksIDExNSwgMTA3LCAxMDEsIDExNiwgMTA1LCAxMDEsIAorCTEyMiwgLTEsIDExNCwgOTgsIDEwOCwgMTAxLCAxMDksIDEyMiwgMTA4LCAxMjIsIC0xLCAxMTYsIDEyMiwgMTAxLCAxMjIsIAorCTEwOCwgMTE2LCAxMjIsIDEyMiwgLTEsIDU4LCAtMSwgMTIyLCAxMDAsIDExNCwgOTcsIDk4LCAxMjIsIDExNiwgMTE2LCA5NywgCisJMTE0LCAtMSwgMTIyLCAxMDAsIDEwOCwgMTIyLCAxMjIsIDEwNSwgMTExLCAtMSwgOTcsIC0xLCAxMDgsIDEwNSwgLTEsIDEyMiwgCisJOTcsIDEwOCwgMTE3LCAtMSwgOTcsIDExMCwgMTIyLCAxMDUsIDEwMSwgMTE0LCA5NywgOTcsIDEwMSwgMTExLCAxMDUsIDEwNSwgCisJLTEsIDExMSwgLTEsIC0xLCAxMjIsIC0xLCA5NywgMTA5LCAxMTQsIDEwNSwgLTEsIC0xLCAxMTYsIDEwMCwgMTIyLCAtMSwgCisJOTcsIDU4LCAxMDEsIDExNiwgMTE3LCA5NSwgMTIyLCAxMTAsIDk5LCAxMDEsIDEwMSwgMTE0LCAxMjIsIDExNSwgMTIyLCAKKwkxMjIsIDk4LCA5NywgMTIyLCA5NywgMTEwLCAxMDEsIDEwMiwgMTIyLCAxMDgsIC0xLCAtMSwgMTExLCAtMSwgMTE2LCAxMjIsIAorCTEwMSwgMTI0LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDEwNSwgMTE2LCAxMTgsIC0xLCAxMTEsIDExNywgCisJMTE2LCAxMTYsIDk3LCA5OCwgMTE0LCA5OSwgMTA4LCAxMTcsIDEwOCwgLTEsIDk3LCAxMDAsIDEwMSwgMTE0LCA5NywgOTgsIAorCTExNCwgMTE3LCAxMjIsIDExNiwgMTE2LCA5NywgMTE0LCAxMjIsIDEwNSwgMTExLCAtMSwgMTA4LCAtMSwgMTE0LCAxMTEsIAorCTExNywgOTcsIDEwOSwgOTcsIDEwMSwgMTAxLCAxMTEsIDEwNSwgMTExLCAxMTQsIDEwNSwgLTEsIC0xLCAxMDAsIDExNiwgCisJMTAxLCAxMjIsIDEwMSwgMTE0LCAxMTUsIDEwMywgMTIyLCAxMjIsIDEyMiwgMTIyLCAxMTYsIDEwNSwgMTA0LCAxMTUsIDEyMiwgCisJMTAwLCAtMSwgLTEsIDk3LCAtMSwgMTIyLCA5OSwgMTE0LCAtMSwgMTAxLCAxMDEsIDk5LCAtMSwgMTE1LCAxMDEsIDEyMiwgCisJMTIyLCA5OSwgMTIyLCAxMTAsIDEyMiwgLTEsIDExMSwgMTA4LCAxMDEsIDEyMiwgMTA1LCAxMDIsIC0xLCAxMDEsIC0xLCAKKwkxMjIsIC0xLCAxMjIsIC0xLCAxMjIsIDEyMiwgLTEsIC0xLCAtMSwgLTEsIDEyMiwgMTE2LCA5OCwgMTA4LCAtMSwgLTEsIAorCTEyMiwgMTIyLCAxMTAsIDEwMSwgMTE4LCAtMSwgOTcsIDEwNSwgLTEsIC0xLCAxMTAsIDEyMiwgMTAzLCAxMjIsIDExNSwgCisJLTEsIC0xLCAxMTYsIDExNSwgMTE2LCAxMDMsIDExNiwgLTEsIDExMCwgMTEwLCA1OCwgMTE2LCA1OCwgMTAwLCA5OSwgMTE2LCAKKwkxMDAsIDk5LCAxMTAsIC0xLCAxMTQsIDEwMSwgMTEwLCAxMjIsIDExMCwgMTExLCAxMTcsIC0xLCAxMDgsIC0xLCAxMTQsIAorCTEyMiwgMTIyLCA5OSwgMTE1LCAxMDksIC0xLCAxMDMsIDExNiwgMTEwLCAxMDksIDEwMCwgMTIyLCAtMSwgMTA1LCAtMSwgCisJLTEsIDEwOCwgMTE2LCAxMDMsIC0xLCAxMTUsIDEyMiwgMTE0LCAxMDEsIDExMSwgLTEsIDEyMiwgMTE0LCAxMDUsIC0xLCAKKwkxMjIsIC0xLCAtMSwgLTEsIC0xLCAxMjIsIDEwNSwgMTE1LCAxMTQsIDExNCwgMTAxLCAxMTQsIDEwOCwgMTE1LCAxMTYsIAorCTEwMSwgMTE2LCAxMjIsIDEwOCwgNTgsIDExNCwgMTE2LCA5OCwgMTA4LCAxMTYsIDEwMCwgLTEsIDU4LCA1OCwgMTEwLCA5NywgCisJLTEsIDExMCwgNTgsIDU4LCAxMDUsIDExMCwgMTE2LCAxMDMsIDEwMSwgMTE2LCAxMDAsIDExNCwgOTksIDExNiwgOTksIDExMCwgCisJMTEwLCAxMTAsIDExNywgMTIyLCAxMDksIC0xLCAxMDksIDEwMCwgMTA1LCAxMDEsIC0xLCAtMSwgLTEsIC0xLCAxMjIsIDExNiwgCisJMTAxLCAxMTYsIC0xLCAxMDEsIDExMCwgLTEsIDk3LCAxMjIsIDEwMCwgMTA4LCAxMTYsIDk3LCAxMjIsIC0xLCAtMSwgMTE2LCAKKwktMSwgMTE3LCAtMSwgMTIxLCAxMDEsIDEyMiwgLTEsIDk5LCAxMjIsIDEyMiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAxMjIsIAorCTEwOCwgMTAxLCAtMSwgMTE4LCAxMDEsIC0xLCA5OSwgMTE0LCA5NywgMTIyLCAxMTAsIDEwMSwgLTEsIDEwMSwgLTEsIC0xLCAKKwk5NywgMTA1LCAxMDUsIDEwOCwgMTAwLCAxMDEsIDExMSwgMTAxLCAxMjIsIDEwMSwgMTIyLCAxMTYsIDExNiwgLTEsIDEwMSwgCisJLTEsIDExNywgMTE2LCAxMjEsIDEwMSwgMTIyLCA5NywgMTE2LCAxMjIsIDEyMiwgLTEsIDEwMSwgMTE0LCAxMDgsIDEyMiwgCisJNTgsIC0xLCA5NywgLTEsIDEyMiwgMzUsIDk3LCAxMjIsIDEyMiwgMTAwLCAxMjIsIDEyMiwgLTEsIDExNiwgMTAxLCAxMjIsIAorCTEwMSwgMTE2LCAtMSwgMTE1LCAxMjIsIDExMCwgLTEsIDEyMiwgMTA4LCAtMSwgLTEsIDExMSwgMTA1LCAxMTQsIDk3LCAxMjIsIAorCTk3LCAxMDEsIDEwNSwgNTgsIDEyMiwgOTcsIC0xLCAxMDksIC0xLCA1OCwgMTIyLCAxMDgsIDEwMSwgNTgsIDEwMSwgLTEsIAorCS0xLCA5OSwgOTksIDEwMSwgLTEsIC0xLCAxMTYsIDExNSwgNTgsIDEwMSwgLTEsIDExNiwgMTAxLCAxMTcsIDExNiwgMTE2LCAKKwkxMjEsIDU4LCA1OCwgMTIyLCAxMDEsIDEwOCwgLTEsIDk3LCAxMjIsIDU4LCAxMTYsIDExNCwgLTEsIDEyMSwgMTEwLCAxMjIsIAorCTEyMiwgMTIyLCAxMTUsIC0xLCAxMjIsIDEyMiwgMTAxLCAxMTYsIC0xLCAxMjIsIDEwMSwgMTIyLCAxMjIsIC0xLCAxMjIsIAorCS0xLCAtMSwgLTEsIDEwMSwgMTIyLCAxMTcsIDExMCwgMTA4LCAxMDAsIDk3LCA5NywgMTEwLCAxMDEsIDEyMiwgMTA4LCAtMSwgCisJMTAxLCAxMjIsIDEyMiwgMTE1LCAxMDIsIDEwMiwgMTA1LCAxMTgsIDExNiwgMTE0LCAxMjIsIDExOCwgLTEsIDEyMiwgLTEsIAorCTEyMiwgMTIyLCAxMjIsIDExNCwgMTAxLCAxMTIsIDEwMCwgLTEsIDEwOCwgMTIyLCAtMSwgNTgsIC0xLCAxMjIsIDEyMiwgCisJMTAxLCAtMSwgLTEsIDk5LCAtMSwgMTE5LCAxMTQsIC0xLCAtMSwgMTIyLCAtMSwgLTEsIDExMCwgMTA1LCAxMjIsIC0xLCAKKwkxMTQsIDEyMiwgOTcsIC0xLCA5NywgLTEsIDEwMSwgMTE0LCAxMTYsIDEwMSwgMTA1LCAtMSwgMTE2LCAxMjIsIDExNiwgLTEsIAorCS0xLCA5OCwgMTA4LCAtMSwgLTEsIDEwMSwgMTIyLCAtMSwgMTIyLCAxMDEsIDExNiwgNTgsIDEwMSwgMTIyLCAtMSwgMTIyLCAKKwkxMDEsIDU4LCAxMTQsIDEyMSwgMTAxLCAxMTIsIC0xLCAtMSwgLTEsIDU4LCAtMSwgMTIyLCAxMDEsIDk5LCAtMSwgLTEsIAorCTEwNSwgNTgsIDU4LCAxMjIsIC0xLCAtMSwgLTEsIDExNiwgMTE2LCAtMSwgLTEsIDExNCwgMTIyLCAxMTQsIC0xLCAxMjIsIAorCS0xLCAtMSwgLTEsIDEyMiwgLTEsIDEwMiwgMTE4LCAxMTEsIDExOCwgMTE4LCAxMTQsIDk3LCAxMjIsIC0xLCAxMjIsIDEyMiwgCisJLTEsIC0xLCAxMTYsIDExMSwgMTExLCA5OSwgMTIyLCAxMjIsIDEyMiwgLTEsIDExNywgMTEwLCAxMDgsIDEwMCwgOTcsIC0xLCAKKwkxMDMsIC0xLCAtMSwgLTEsIDEwMSwgMTAwLCAxMDEsIDU4LCAxMjIsIC0xLCAtMSwgLTEsIC0xLCAxMjIsIDEwNCwgMTAxLCAKKwkxMTUsIDEwNSwgMTA3LCAtMSwgMTE2LCAxMTEsIC0xLCAxMjIsIC0xLCAxMDgsIDEwOCwgMTIyLCA1OCwgMTAxLCAxMTAsIAorCTExMCwgMTA1LCAtMSwgMTIxLCAxMDgsIDEyMiwgMTIyLCAtMSwgLTEsIDU4LCAxMDUsIC0xLCAxMjIsIC0xLCAtMSwgMTE0LCAKKwktMSwgMTAxLCA1OCwgMTAwLCAxMDEsIC0xLCAtMSwgLTEsIDEyMiwgMTA0LCAxMTEsIC0xLCAtMSwgLTEsIDEyMiwgMTExLCAKKwkxMjIsIC0xLCAxMjIsIC0xLCAtMSwgMTAyLCAxMjIsIDExOSwgMTIyLCAxMDEsIDEyMiwgOTgsIC0xLCAtMSwgLTEsIC0xLCAKKwkxMjIsIDEyMiwgMTIyLCAxMDUsIC0xLCAtMSwgLTEsIDEwMiwgMTE4LCAxMTEsIDExOCwgMTE0LCAxMDEsIDEyMiwgMTIyLCAKKwkxMjIsIC0xLCAtMSwgLTEsIDEwNSwgMTA1LCAxMjIsIDExNSwgMTA4LCAxMjIsIDEyMiwgMTEwLCAtMSwgMTIyLCAxMjIsIAorCS0xLCAtMSwgMTIyLCA5OSwgMTE2LCAxMTEsIDEyMiwgMTAxLCAtMSwgLTEsIC0xLCAxMTEsIC0xLCA1OCwgNTgsIC0xLCA1OCwgCisJNTgsIC0xLCAxMDUsIDExMCwgLTEsIDEyMiwgLTEsIC0xLCAxMDEsIC0xLCAxMjIsIC0xLCAxMjIsIC0xLCAxMDgsIC0xLCAKKwktMSwgLTEsIDExNiwgMTAyLCAxMjIsIDExOSwgMTIyLCAxMjIsIDExNCwgLTEsIC0xLCAtMSwgMTEwLCAxMTAsIC0xLCAxMjIsIAorCTEwOCwgLTEsIC0xLCAxMjIsIC0xLCAtMSwgLTEsIC0xLCAxMjEsIDEyMiwgMTEwLCAtMSwgNTgsIDExMCwgLTEsIC0xLCAtMSwgCisJLTEsIDExMCwgNTgsIC0xLCAxMTQsIC0xLCAtMSwgMTAxLCAxMjEsIDEwMSwgLTEsIDEyMiwgLTEsIC0xLCAxMjIsIDEwMSwgCisJMTAzLCAtMSwgMTIyLCAtMSwgMTIyLCAtMSwgNTgsIC0xLCA1OCwgMTAxLCAtMSwgMTIyLCAxMDAsIDU4LCAxMTQsIC0xLCAKKwktMSwgMTIyLCAxMjIsIC0xLCAtMSwgLTEsIC0xLCA1OCwgLTEsIDEyMiwgLTEsIDEyMiwgLTEsIC0xLCAtMSwgLTEsIC0xCisgICAgfTsKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfYWNjZXB0WzE0ODRdID0KKyAgICB7CisJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisJMzEwLCAtMSwgMzI3LCAzMjgsIDMyOSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDM3OSwgLTEsIDM4OCwgMzg5LCAKKwkzOTAsIDM4NiwgMzkyLCAxLCAyLCAtMSwgNSwgLTEsIDEwLCAzMzAsIC0xLCAxNSwgMTYsIC0xLCAxOSwgMzE4LCAzMzEsIAorCS0xLCAyMSwgLTEsIDM1OCwgMzU3LCAtMSwgLTEsIC0xLCAzNTAsIC0xLCAyOTgsIDM0OCwgMjk3LCAtMSwgLTEsIC0xLCAtMSwgCisJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMjYsIDM4NywgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMjc1LCAtMSwgMjc3LCAtMSwgMjc5LCAyODAsIDI4MSwgLTEsIC0xLCAKKwktMSwgMjg5LCAyOTAsIDI5MSwgLTEsIDMyMywgMzgxLCAzODAsIC0xLCAzMTcsIDMyNiwgLTEsIDM4NCwgMzgzLCAtMSwgLTEsIAorCTM1MiwgMzEyLCAzMDUsIDMxNiwgMzA2LCAzMTMsIDMwNywgMzE5LCAzMjEsIDMyNSwgMzA4LCAzMTEsIDMyMiwgMzI0LCAzMDksIAorCS0xLCAzMjAsIC0xLCAzNjgsIDM2NywgMzMzLCAzMzIsIC0xLCAtMSwgMzc3LCAzNzYsIDM0NiwgMzM5LCAtMSwgLTEsIDM1NCwgCisJMzU2LCAzNTMsIC0xLCAzNjIsIDM2MSwgLTEsIDM2NSwgMzkxLCAzNjQsIC0xLCAtMSwgLTEsIDYsIC0xLCAxMSwgMTIsIDEzLCAKKwkxNCwgMTcsIDE4LCAyMCwgMzYwLCAzNTksIDIyLCAyMywgMjk5LCAyNCwgMzAxLCAzNDksIC0xLCAzNzQsIDM3MywgMjUsIAorCTM0NywgMzQ1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMTI2LCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDE1MSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAxNTIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisJLTEsIDE5MSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCTI1MSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwkyNzQsIDM4MiwgMjc2LCAyNzgsIDI4NCwgLTEsIDI4NSwgLTEsIDI4OCwgLTEsIDI5NCwgMjk1LCAyOTYsIC0xLCAzNDIsIAorCTM0MCwgMzAwLCAzMzQsIDMwMiwgMzAzLCAzODUsIDMwNCwgMzUxLCAtMSwgMzcxLCAzNzAsIDMxNCwgMzE1LCAzNjksIC0xLCAKKwkzMzcsIDMzNSwgMzc4LCAtMSwgMzU1LCAzNjMsIDM2NiwgMzg2LCAtMSwgNywgOCwgOSwgMzc1LCAtMSwgLTEsIC0xLCAtMSwgCisJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisJOTYsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisJLTEsIC0xLCAtMSwgMTIzLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDEzNCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAxNDIsIC0xLCAxNDUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAxNjYsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAxNzYsIC0xLCAxNzgsIC0xLCAtMSwgMTg3LCAtMSwgLTEsIC0xLCAtMSwgCisJMTkyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAyMTMsIC0xLCAyMTQsIDIxNiwgCisJLTEsIDIxOCwgLTEsIC0xLCAtMSwgLTEsIDIyNSwgMjI2LCAtMSwgLTEsIC0xLCAyMzAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisJLTEsIC0xLCAyNjcsIDI2OCwgLTEsIDI3MCwgLTEsIC0xLCAtMSwgLTEsIDI4MywgMjg3LCAyOTIsIDI5MywgMzQzLCAzNzIsIAorCTMzOCwgMzQ0LCAtMSwgLTEsIC0xLCAyOSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA0MiwgCisJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDU5LCAtMSwgCisJNjEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA4MCwgODEsIC0xLCAtMSwgCisJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDEwMSwgMTAwLCAKKwktMSwgMTAyLCAtMSwgLTEsIC0xLCAxMDcsIC0xLCAtMSwgLTEsIDExMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAxMjIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDEzMCwgLTEsIDEzMywgLTEsIDEzNiwgLTEsIDEzOCwgLTEsIC0xLCAKKwkxNDEsIDE0MywgMTQ0LCAxNDYsIC0xLCAtMSwgLTEsIC0xLCAxNTQsIDE1MywgLTEsIC0xLCAtMSwgLTEsIC0xLCAxNjksIAorCS0xLCAtMSwgMTcyLCAxNzMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMTg5LCAxODgsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMjAxLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDIxNywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisJLTEsIDIyOSwgLTEsIDIzMiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMjQzLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwkyNDksIC0xLCAyNTQsIDI1NSwgLTEsIC0xLCAtMSwgMjU4LCAtMSwgLTEsIC0xLCAtMSwgLTEsIDI2NCwgLTEsIC0xLCAtMSwgCisJMjcyLCAtMSwgMjgyLCAyODYsIDQsIDMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDUxLCAtMSwgLTEsIC0xLCAtMSwgNTYsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgODUsIAorCS0xLCAtMSwgLTEsIC0xLCA5MCwgOTEsIDkyLCA5MywgLTEsIC0xLCAtMSwgLTEsIDk4LCAtMSwgLTEsIDEwNCwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIDExNSwgMTE2LCAtMSwgMTE5LCAtMSwgMTIxLCAtMSwgLTEsIC0xLCAxMjgsIC0xLCAtMSwgCisJLTEsIDEzNSwgMTM3LCAxMzksIDE0MCwgMTQ3LCAtMSwgLTEsIC0xLCAxNTUsIC0xLCAtMSwgMTYyLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAxNzUsIC0xLCAxODAsIDE3OSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIDIwNSwgLTEsIDIwNywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMjIzLCAtMSwgCisJLTEsIC0xLCAtMSwgLTEsIDIzNCwgLTEsIDIzNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAyNTAsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgMjYxLCAtMSwgLTEsIC0xLCAyNjYsIC0xLCAtMSwgMjczLCAyNywgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA0MSwgLTEsIDQ0LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA1MiwgNTMsIAorCS0xLCAtMSwgLTEsIDU4LCA2MCwgLTEsIC0xLCAtMSwgLTEsIDY2LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIDgzLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDk0LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAxMDYsIC0xLCAKKwktMSwgLTEsIC0xLCAxMTQsIC0xLCAtMSwgLTEsIC0xLCAxMjcsIC0xLCAxMzEsIDEzMiwgMTQ4LCAtMSwgLTEsIC0xLCAtMSwgCisJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAxNzAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIDE5OCwgLTEsIDIwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDIxMiwgLTEsIC0xLCAyMjAsIAorCS0xLCAyMjEsIC0xLCAtMSwgLTEsIDIzMSwgMjMzLCAtMSwgMjM3LCAtMSwgLTEsIDI0NCwgMjQ1LCAtMSwgMjQ3LCAyNDgsIAorCS0xLCAtMSwgLTEsIDI1NywgLTEsIC0xLCAtMSwgMjYzLCAtMSwgMjY5LCAtMSwgLTEsIC0xLCAtMSwgLTEsIDM0LCAtMSwgCisJLTEsIC0xLCAzOCwgMzksIC0xLCAtMSwgNDUsIDQ2LCAtMSwgLTEsIDQ5LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA2NCwgCisJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDczLCA3NCwgNzYsIC0xLCA3NSwgLTEsIC0xLCAtMSwgODYsIDg3LCAtMSwgCisJLTEsIC0xLCAtMSwgOTcsIDk5LCAxMDMsIC0xLCAtMSwgMTA5LCAxMTAsIC0xLCAtMSwgLTEsIDExNywgLTEsIDEyNCwgMTI1LCAKKwkxMjksIC0xLCAxNTAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMTY3LCAtMSwgLTEsIDE3NCwgMTc3LCAtMSwgCisJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMzQxLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDE5OSwgLTEsIDIwMiwgMjA0LCAyMDYsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgMjE5LCAyMjIsIDIyNCwgMjI3LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAyNDYsIC0xLCAKKwktMSwgMjU2LCAtMSwgMjYwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDM2LCAtMSwgLTEsIC0xLCAtMSwgNDgsIAorCTUwLCAtMSwgLTEsIDU3LCAtMSwgNjMsIDY1LCAtMSwgNjgsIC0xLCAtMSwgLTEsIC0xLCA3NywgNzksIDc4LCAtMSwgLTEsIAorCS0xLCA4OSwgOTUsIDMzNiwgLTEsIC0xLCAtMSwgMTEzLCAtMSwgMTIwLCAxNDksIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAxNjUsIDE2NCwgMTY4LCAxNzEsIC0xLCAtMSwgLTEsIC0xLCAxODUsIDE4NiwgMTkwLCAtMSwgLTEsIC0xLCAtMSwgCisJLTEsIC0xLCAtMSwgLTEsIC0xLCAyMTEsIDIxNSwgMjI4LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDI1OSwgCisJLTEsIC0xLCAyNzEsIDI4LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA0MywgNDcsIDU0LCAtMSwgNjIsIC0xLCAtMSwgNzAsIAorCS0xLCAtMSwgODIsIC0xLCAtMSwgMTA1LCAtMSwgMTEyLCAxMTgsIC0xLCAxNTcsIC0xLCAxNTksIC0xLCAxNjEsIC0xLCAxODEsIAorCTE4MiwgMTgzLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMjA4LCAyMDksIDIxMCwgLTEsIC0xLCAyMzksIC0xLCAtMSwgCisJMjQyLCAyNTIsIC0xLCAyNjIsIDI2NSwgMzEsIDMwLCAtMSwgLTEsIC0xLCAzNywgLTEsIC0xLCA2NywgNjksIDcxLCA3MiwgCisJLTEsIC0xLCAxMDgsIC0xLCAxNTgsIDE2MCwgLTEsIC0xLCAtMSwgMTk0LCAtMSwgMTk2LCAxOTcsIC0xLCAtMSwgLTEsIDI0MCwgCisJLTEsIDI1MywgLTEsIDMzLCAtMSwgNDAsIC0xLCAtMSwgODgsIC0xLCAtMSwgLTEsIC0xLCAxOTUsIDIwMywgLTEsIC0xLCAKKwkyNDEsIDMyLCAzNSwgNTUsIC0xLCAxNTYsIC0xLCAxODQsIC0xLCAyMzYsIDIzOCwgODQsIDE2MywgMTkzCisgICAgfTsKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfc3BlY2lhbFsxNDg0XSA9CisgICAgeworCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMQorICAgIH07CisKKy8qKiBVc2VkIHdoZW4gdGhlcmUgaXMgbm8gdHJhbnNpdGlvbiB0YWJsZSBlbnRyeSBmb3IgYSBwYXJ0aWN1bGFyIHN0YXRlICovCisjZGVmaW5lIGRmYTUwX1RfZW1wdHkJICAgIE5VTEwKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMFtdID0KKyAgICB7CisJNTMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCA1MywgNTMsIDUzLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCAtMSwgLTEsIC0xLCAtMSwgNTMsIC0xLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxW10gPQorICAgIHsKKwk2MDcKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyW10gPQorICAgIHsKKwk4MTAKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzW10gPQorICAgIHsKKwk5ODYKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0W10gPQorICAgIHsKKwkxMTMxCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNVtdID0KKyAgICB7CisJNjA4CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNltdID0KKyAgICB7CisJODExCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UN1tdID0KKyAgICB7CisJOTg3CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UOFtdID0KKyAgICB7CisJNjA5CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UOVtdID0KKyAgICB7CisJNDU2CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMTBbXSA9CisgICAgeworCTEzNTEKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxMVtdID0KKyAgICB7CisJMTQxMAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDEyW10gPQorICAgIHsKKwkxNDQ5CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMTNbXSA9CisgICAgeworCTU4NgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDE0W10gPQorICAgIHsKKwk3OTIKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxNVtdID0KKyAgICB7CisJMjk3LCAtMSwgMjk4LCAtMSwgLTEsIC0xLCAtMSwgMjk5CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMTZbXSA9CisgICAgeworCTk2NworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDE3W10gPQorICAgIHsKKwk2MTEKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxOFtdID0KKyAgICB7CisJODE0CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMTlbXSA9CisgICAgeworCTExMTQKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyMFtdID0KKyAgICB7CisJOTg5CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjFbXSA9CisgICAgeworCTExMzQKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyMltdID0KKyAgICB7CisJMTI0MAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDIzW10gPQorICAgIHsKKwkyMzEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisJLTEsIC0xLCAyMzMsIC0xLCAtMSwgMjMyCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjRbXSA9CisgICAgeworCTI0MCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAyMzksIC0xLCAtMSwgCisJMjM4CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjVbXSA9CisgICAgeworCTgxNQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDI2W10gPQorICAgIHsKKwk5OTAKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyN1tdID0KKyAgICB7CisJODE2CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjhbXSA9CisgICAgeworCTk5MQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDI5W10gPQorICAgIHsKKwkxMTM1CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMzBbXSA9CisgICAgeworCTMwNywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDMwOCwgCisJLTEsIC0xLCAtMSwgLTEsIDMwOQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDMxW10gPQorICAgIHsKKwk4MTcKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzMltdID0KKyAgICB7CisJOTkyCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMzNbXSA9CisgICAgeworCTgxOAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDM0W10gPQorICAgIHsKKwk5OTMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzNVtdID0KKyAgICB7CisJMTEzNgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDM2W10gPQorICAgIHsKKwkxMjY0CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMzdbXSA9CisgICAgeworCTEzNTIKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzOFtdID0KKyAgICB7CisJOTk0CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMzlbXSA9CisgICAgeworCTExMzcKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0MFtdID0KKyAgICB7CisJNzkzLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNzk0CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNDFbXSA9CisgICAgeworCTEyNjUKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0MltdID0KKyAgICB7CisJMTM1MworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDQzW10gPQorICAgIHsKKwkyODksIC0xLCAtMSwgMjkwLCAyOTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAyOTIsIDI5MywgLTEsIC0xLCAtMSwgCisJMjk0CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNDRbXSA9CisgICAgeworCTk5NQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDQ1W10gPQorICAgIHsKKwkxMTM4CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNDZbXSA9CisgICAgeworCTEyNjYKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0N1tdID0KKyAgICB7CisJMTM1NAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDQ4W10gPQorICAgIHsKKwk4MjEKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0OVtdID0KKyAgICB7CisJOTk2CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNTBbXSA9CisgICAgeworCTExMzkKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q1MVtdID0KKyAgICB7CisJMTI2NworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDUyW10gPQorICAgIHsKKwkxMzU1CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNTNbXSA9CisgICAgeworCTM5MQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDU0W10gPQorICAgIHsKKwk2MTgKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q1NVtdID0KKyAgICB7CisJODIyCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNTZbXSA9CisgICAgeworCTk5NworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDU3W10gPQorICAgIHsKKwk1MywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNTMsIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIDUzLCA1MywgNTMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIC0xLCAtMSwgLTEsIC0xLCA1MywgLTEsIDUzLCA1MywgNTMsIDUzLCAxMjYwLCA1MywgNTMsIDUzLCA1MywgNTMsIAorCTUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNThbXSA9CisgICAgeworCTgyMworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDU5W10gPQorICAgIHsKKwk5OTgKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q2MFtdID0KKyAgICB7CisJMTE0MQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDYxW10gPQorICAgIHsKKwkxMjY4CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNjJbXSA9CisgICAgeworCTM5NAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDYzW10gPQorICAgIHsKKwk2MjMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q2NFtdID0KKyAgICB7CisJNTkxLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA1OTIKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q2NVtdID0KKyAgICB7CisJNTMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCA1MywgNTMsIDUzLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCAtMSwgLTEsIC0xLCAtMSwgNTMsIC0xLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDMzOCwgNTMsIDUzLCA1MywgNTMsIDUzCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNjZbXSA9CisgICAgeworCTEzOSwgLTEsIC0xLCAtMSwgMTQwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAxNDEsIC0xLCAtMSwgCisJLTEsIC0xLCAtMSwgMTQyCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNjdbXSA9CisgICAgeworCTgyNQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDY4W10gPQorICAgIHsKKwk5OTkKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q2OVtdID0KKyAgICB7CisJMTE0MgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDcwW10gPQorICAgIHsKKwk4MjYKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q3MVtdID0KKyAgICB7CisJNDA5LCAtMSwgLTEsIC0xLCA0MTAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDQxMSwgLTEsIC0xLCAKKwk0MTIKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q3MltdID0KKyAgICB7CisJMTAwMAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDczW10gPQorICAgIHsKKwk2OSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNzIsIC0xLCAtMSwgNzEsIDcwCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNzRbXSA9CisgICAgeworCTEyNzAKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q3NVtdID0KKyAgICB7CisJNTk0LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA1OTUKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q3NltdID0KKyAgICB7CisJMTAwMworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDc3W10gPQorICAgIHsKKwkxMTQ2CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNzhbXSA9CisgICAgeworCTQwMAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDc5W10gPQorICAgIHsKKwk3MjIKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q4MFtdID0KKyAgICB7CisJNDAxCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODFbXSA9CisgICAgeworCTkxMworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDgyW10gPQorICAgIHsKKwkxMTksIC0xLCAxMjAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAxMjEsIC0xLCAxMjIKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q4M1tdID0KKyAgICB7CisJNTA1CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODRbXSA9CisgICAgeworCTEwNzQKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q4NVtdID0KKyAgICB7CisJMTc3LCAtMSwgLTEsIC0xLCAxNzgsIC0xLCAtMSwgLTEsIDE3OSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAxODAKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q4NltdID0KKyAgICB7CisJNzA2LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA3MDcKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q4N1tdID0KKyAgICB7CisJNDAyCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODhbXSA9CisgICAgeworCTYzMQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDg5W10gPQorICAgIHsKKwk4MzAKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q5MFtdID0KKyAgICB7CisJMTAwNAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDkxW10gPQorICAgIHsKKwkxMTQ3CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UOTJbXSA9CisgICAgeworCTQwMworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDkzW10gPQorICAgIHsKKwk2MzIKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q5NFtdID0KKyAgICB7CisJODMxCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UOTVbXSA9CisgICAgeworCTEwMDUKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q5NltdID0KKyAgICB7CisJNDY5CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UOTdbXSA9CisgICAgeworCTExNDgKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q5OFtdID0KKyAgICB7CisJMTI3MworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDk5W10gPQorICAgIHsKKwk2MzMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxMDBbXSA9CisgICAgeworCTE4MSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMTgyCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMTAxW10gPQorICAgIHsKKwk1MywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNTMsIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIDUzLCA1MywgNTMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIC0xLCAtMSwgLTEsIC0xLCA1MywgLTEsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNzcwLCA1MywgCisJNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxMDJbXSA9CisgICAgeworCTI3NywgLTEsIC0xLCAyNzgKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxMDNbXSA9CisgICAgeworCTYzNQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDEwNFtdID0KKyAgICB7CisJODMzCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMTA1W10gPQorICAgIHsKKwkxMDA2CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMTA2W10gPQorICAgIHsKKwk2MzYKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxMDdbXSA9CisgICAgeworCTgzNAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDEwOFtdID0KKyAgICB7CisJMTQ5LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMTUwLCAtMSwgLTEsIDE1MSwgCisJLTEsIC0xLCAxNTIKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxMDlbXSA9CisgICAgeworCTQwOAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDExMFtdID0KKyAgICB7CisJNjM3CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMTExW10gPQorICAgIHsKKwk1OTkKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxMTJbXSA9CisgICAgeworCTgzNQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDExM1tdID0KKyAgICB7CisJMTAwNworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDExNFtdID0KKyAgICB7CisJODAzCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMTE1W10gPQorICAgIHsKKwkxMTUwCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMTE2W10gPQorICAgIHsKKwk4MzYKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxMTdbXSA9CisgICAgeworCTQ1NSwgLTEsIDQ1MywgLTEsIDQ1NAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDExOFtdID0KKyAgICB7CisJMTE1MQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDExOVtdID0KKyAgICB7CisJMTI3NAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDEyMFtdID0KKyAgICB7CisJMTM1OAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDEyMVtdID0KKyAgICB7CisJMTQxNAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDEyMltdID0KKyAgICB7CisJMTQ1MAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDEyM1tdID0KKyAgICB7CisJMTQ2OAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDEyNFtdID0KKyAgICB7CisJMTAxMQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDEyNVtdID0KKyAgICB7CisJNjIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDYzLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisJNjQsIC0xLCAtMSwgNjUsIDY2LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA2NworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDEyNltdID0KKyAgICB7CisJMTM1OQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDEyN1tdID0KKyAgICB7CisJMTQxNQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDEyOFtdID0KKyAgICB7CisJMTQ1MQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDEyOVtdID0KKyAgICB7CisJMTQ2OQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDEzMFtdID0KKyAgICB7CisJMTM2MAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDEzMVtdID0KKyAgICB7CisJMjYyCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMTMyW10gPQorICAgIHsKKwkzMTcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisJLTEsIC0xLCAtMSwgMzE4CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMTMzW10gPQorICAgIHsKKwkxNDE3CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMTM0W10gPQorICAgIHsKKwk0NDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA0NDEKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxMzVbXSA9CisgICAgeworCTE0MTgKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxMzZbXSA9CisgICAgeworCTE0NTMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxMzdbXSA9CisgICAgeworCTEwNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAxMDYsIC0xLCAtMSwgMTA3LCAtMSwgLTEsIDEwOAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDEzOFtdID0KKyAgICB7CisJNjQwCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMTM5W10gPQorICAgIHsKKwk4NDAKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxNDBbXSA9CisgICAgeworCTEwMTMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxNDFbXSA9CisgICAgeworCTExNTQKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxNDJbXSA9CisgICAgeworCTEyNzgKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxNDNbXSA9CisgICAgeworCTIwNSwgLTEsIC0xLCAyMDQKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxNDRbXSA9CisgICAgeworCTEzNjMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxNDVbXSA9CisgICAgeworCTI0MywgLTEsIC0xLCAyNDIKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxNDZbXSA9CisgICAgeworCTQyNCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNDI1CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMTQ3W10gPQorICAgIHsKKwk0MzYsIC0xLCAtMSwgLTEsIDQzNQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDE0OFtdID0KKyAgICB7CisJNjQxCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMTQ5W10gPQorICAgIHsKKwk4NDIKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxNTBbXSA9CisgICAgeworCTEwMTQKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxNTFbXSA9CisgICAgeworCTcxNQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDE1MltdID0KKyAgICB7CisJODQzCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMTUzW10gPQorICAgIHsKKwk5MDUKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxNTRbXSA9CisgICAgeworCTEwMTUKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxNTVbXSA9CisgICAgeworCTEwNjUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDEwNjYKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxNTZbXSA9CisgICAgeworCTQxMworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDE1N1tdID0KKyAgICB7CisJNjQ0CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMTU4W10gPQorICAgIHsKKwk4NDQKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxNTlbXSA9CisgICAgeworCTEwMTYKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxNjBbXSA9CisgICAgeworCTExNTcKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxNjFbXSA9CisgICAgeworCTQxNAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDE2MltdID0KKyAgICB7CisJNjQ1CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMTYzW10gPQorICAgIHsKKwk4NDUKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxNjRbXSA9CisgICAgeworCTEwMTcKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxNjVbXSA9CisgICAgeworCTQxNQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDE2NltdID0KKyAgICB7CisJNjQ2CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMTY3W10gPQorICAgIHsKKwk4NDYKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxNjhbXSA9CisgICAgeworCTEwMTgKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxNjlbXSA9CisgICAgeworCTQ3MAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDE3MFtdID0KKyAgICB7CisJNDE3CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMTcxW10gPQorICAgIHsKKwk1MywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNTMsIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIDUzLCA1MywgNTMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIC0xLCAtMSwgLTEsIC0xLCA1MywgLTEsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNjIwLCA1MywgCisJNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxNzJbXSA9CisgICAgeworCTUyMywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDUyNAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDE3M1tdID0KKyAgICB7CisJMzc4CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMTc0W10gPQorICAgIHsKKwk2MDIKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxNzVbXSA9CisgICAgeworCTEyODAKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxNzZbXSA9CisgICAgeworCTEzNjQKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxNzdbXSA9CisgICAgeworCTEyODEKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxNzhbXSA9CisgICAgeworCTEzNjUKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxNzlbXSA9CisgICAgeworCTE0MjEKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxODBbXSA9CisgICAgeworCTY0OQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDE4MVtdID0KKyAgICB7CisJNDIwCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMTgyW10gPQorICAgIHsKKwk2NTAKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxODNbXSA9CisgICAgeworCTQyMQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDE4NFtdID0KKyAgICB7CisJNjUxCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMTg1W10gPQorICAgIHsKKwk4NTIKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxODZbXSA9CisgICAgeworCTEwMjEKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxODdbXSA9CisgICAgeworCTExNjIKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxODhbXSA9CisgICAgeworCTQyMgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDE4OVtdID0KKyAgICB7CisJNDc4CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMTkwW10gPQorICAgIHsKKwk2NTIKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxOTFbXSA9CisgICAgeworCTY3NworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDE5MltdID0KKyAgICB7CisJMzAzLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAzMDQsIC0xLCAtMSwgLTEsIC0xLCAzMDUsIDMwNgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDE5M1tdID0KKyAgICB7CisJODUzCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMTk0W10gPQorICAgIHsKKwk4NzEKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxOTVbXSA9CisgICAgeworCTEwMjIKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxOTZbXSA9CisgICAgeworCTQ3OQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDE5N1tdID0KKyAgICB7CisJNjc4CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMTk4W10gPQorICAgIHsKKwk4NzIKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QxOTlbXSA9CisgICAgeworCTEwMzQKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyMDBbXSA9CisgICAgeworCTExNzEKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyMDFbXSA9CisgICAgeworCTUzLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA1MywgNTMsIDUzLCA1MywgNTMsIAorCTUzLCA1MywgNTMsIDUzLCA1MywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIAorCTUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIAorCTUzLCA1MywgLTEsIC0xLCAtMSwgLTEsIDUzLCAtMSwgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIAorCTU3NCwgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDIwMltdID0KKyAgICB7CisJOTksIDk5LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDk5LCA5OSwgOTksIDk5LCA5OSwgCisJOTksIDk5LCA5OSwgOTksIDk5LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgCisJOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgCisJOTksIDk5LCAtMSwgLTEsIC0xLCAtMSwgOTksIC0xLCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgCisJOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTkKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyMDNbXSA9CisgICAgeworCTEyODgKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyMDRbXSA9CisgICAgeworCTEzNzAKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyMDVbXSA9CisgICAgeworCTEwMjMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyMDZbXSA9CisgICAgeworCTExNjQKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyMDdbXSA9CisgICAgeworCTEyODMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyMDhbXSA9CisgICAgeworCTkwOSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgOTEwCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjA5W10gPQorICAgIHsKKwk4NTYKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyMTBbXSA9CisgICAgeworCTEwMjQKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyMTFbXSA9CisgICAgeworCTQ3MQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDIxMltdID0KKyAgICB7CisJMTE2NQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDIxM1tdID0KKyAgICB7CisJMzc2CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjE0W10gPQorICAgIHsKKwk4NTcKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyMTVbXSA9CisgICAgeworCTYwMAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDIxNltdID0KKyAgICB7CisJODU4CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjE3W10gPQorICAgIHsKKwk0NzIKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyMThbXSA9CisgICAgeworCTEwMjYKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyMTlbXSA9CisgICAgeworCTExNjYKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyMjBbXSA9CisgICAgeworCTgwNAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDIyMVtdID0KKyAgICB7CisJMTI4NQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDIyMltdID0KKyAgICB7CisJMTM2NworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDIyM1tdID0KKyAgICB7CisJOTc3LCAtMSwgLTEsIDk3OCwgLTEsIC0xLCAtMSwgLTEsIC0xLCA5NzksIC0xLCAtMSwgLTEsIDk4MCwgLTEsIDk4MSwgOTgyCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjI0W10gPQorICAgIHsKKwk2NTcKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyMjVbXSA9CisgICAgeworCTg1OQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDIyNltdID0KKyAgICB7CisJODc0CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjI3W10gPQorICAgIHsKKwkxMDI3CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjI4W10gPQorICAgIHsKKwkxMDM2CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjI5W10gPQorICAgIHsKKwkxMTczCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjMwW10gPQorICAgIHsKKwkxMjkwCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjMxW10gPQorICAgIHsKKwkxMzcyCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjMyW10gPQorICAgIHsKKwkxNDI2CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjMzW10gPQorICAgIHsKKwkxNDU1CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjM0W10gPQorICAgIHsKKwk4NzUKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyMzVbXSA9CisgICAgeworCTEwMzcKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyMzZbXSA9CisgICAgeworCTEwMjgKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyMzdbXSA9CisgICAgeworCTExNzQKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyMzhbXSA9CisgICAgeworCTExNjgKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyMzlbXSA9CisgICAgeworCTEyNTQsIC0xLCAtMSwgMTI1NSwgMTI1NiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAxMjU3LCAKKwktMSwgLTEsIC0xLCAxMjU4CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjQwW10gPQorICAgIHsKKwkxMjkxCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjQxW10gPQorICAgIHsKKwkxMjg2CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjQyW10gPQorICAgIHsKKwkxMzczCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjQzW10gPQorICAgIHsKKwkxMzY4CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjQ0W10gPQorICAgIHsKKwkxNDI3CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjQ1W10gPQorICAgIHsKKwk0ODIKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyNDZbXSA9CisgICAgeworCTY1OQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDI0N1tdID0KKyAgICB7CisJNjgzCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjQ4W10gPQorICAgIHsKKwk4NjIKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyNDlbXSA9CisgICAgeworCTg3NgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDI1MFtdID0KKyAgICB7CisJMTAzOAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDI1MVtdID0KKyAgICB7CisJMzY5LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAzNzAKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyNTJbXSA9CisgICAgeworCTQ4MworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDI1M1tdID0KKyAgICB7CisJNjg0CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjU0W10gPQorICAgIHsKKwkyMDEsIC0xLCAtMSwgODEsIDIwMgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDI1NVtdID0KKyAgICB7CisJODc3CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjU2W10gPQorICAgIHsKKwkxMDM5CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjU3W10gPQorICAgIHsKKwkxMTc2CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjU4W10gPQorICAgIHsKKwkxMjkyCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjU5W10gPQorICAgIHsKKwkxMzc0CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjYwW10gPQorICAgIHsKKwkxNDI4CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjYxW10gPQorICAgIHsKKwkxNDU3CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjYyW10gPQorICAgIHsKKwk0MzAKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyNjNbXSA9CisgICAgeworCTk5LCA5OSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA5OSwgOTksIDk5LCA5OSwgOTksIAorCTk5LCA5OSwgOTksIDk5LCA5OSwgMTIwNCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgCisJOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgCisJOTksIDk5LCAtMSwgLTEsIC0xLCAtMSwgOTksIC0xLCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgCisJOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCAxMjA1LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDI2NFtdID0KKyAgICB7CisJMTQ3MgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDI2NVtdID0KKyAgICB7CisJMTYwLCAtMSwgMTYxLCAtMSwgLTEsIC0xLCAxNjIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMTYzLCAtMSwgLTEsIC0xLCAtMSwgCisJMTY0LCAxNjUsIC0xLCAtMSwgLTEsIDE2NgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDI2NltdID0KKyAgICB7CisJNjYyCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjY3W10gPQorICAgIHsKKwk4NjMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyNjhbXSA9CisgICAgeworCTEwMzAKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyNjlbXSA9CisgICAgeworCTc0LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDc2LCA3NQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDI3MFtdID0KKyAgICB7CisJNjg1CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjcxW10gPQorICAgIHsKKwk0MzEKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyNzJbXSA9CisgICAgeworCTg3OAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDI3M1tdID0KKyAgICB7CisJMTA0MAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDI3NFtdID0KKyAgICB7CisJMTE3NworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDI3NVtdID0KKyAgICB7CisJNDYzCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjc2W10gPQorICAgIHsKKwk0MzIKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyNzdbXSA9CisgICAgeworCTQ3NCwgLTEsIC0xLCAtMSwgLTEsIDQ3NSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisJNDc2CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjc4W10gPQorICAgIHsKKwk2NjQKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyNzlbXSA9CisgICAgeworCTExMjksIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCA1MywgNTMsIDUzLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCAtMSwgLTEsIC0xLCAtMSwgNTMsIC0xLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyODBbXSA9CisgICAgeworCTUzLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA1MywgNTMsIDUzLCA1MywgNTMsIAorCTUzLCA1MywgNTMsIDUzLCA1MywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIAorCTUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIAorCTUzLCA1MywgLTEsIC0xLCAtMSwgLTEsIDUzLCAtMSwgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIAorCTUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgMTE0NCwgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyODFbXSA9CisgICAgeworCTg2NAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDI4MltdID0KKyAgICB7CisJMTAzMQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDI4M1tdID0KKyAgICB7CisJNjg2CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjg0W10gPQorICAgIHsKKwkxMTcwCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjg1W10gPQorICAgIHsKKwk4NzkKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyODZbXSA9CisgICAgeworCTEyODcKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyODdbXSA9CisgICAgeworCTEwNDEKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyODhbXSA9CisgICAgeworCTExNzgKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyODlbXSA9CisgICAgeworCTEyOTQKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyOTBbXSA9CisgICAgeworCTEzNzUKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyOTFbXSA9CisgICAgeworCTQzMworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDI5MltdID0KKyAgICB7CisJNjY1CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjkzW10gPQorICAgIHsKKwkxMDksIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDExMCwgLTEsIC0xLCAtMSwgMTExLCAtMSwgLTEsIDExMiwgLTEsIC0xLCAKKwktMSwgLTEsIDExMworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDI5NFtdID0KKyAgICB7CisJMzk1LCAtMSwgLTEsIC0xLCAtMSwgMzk2LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwkzOTcsIDM5OAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDI5NVtdID0KKyAgICB7CisJNDg2CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjk2W10gPQorICAgIHsKKwk2ODcKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QyOTdbXSA9CisgICAgeworCTQzNAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDI5OFtdID0KKyAgICB7CisJODgwCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMjk5W10gPQorICAgIHsKKwk2NjYKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzMDBbXSA9CisgICAgeworCTEwNDIKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzMDFbXSA9CisgICAgeworCTg2NgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDMwMltdID0KKyAgICB7CisJMTE3OQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDMwM1tdID0KKyAgICB7CisJNDg3CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMzA0W10gPQorICAgIHsKKwk2ODgKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzMDVbXSA9CisgICAgeworCTMyNywgLTEsIC0xLCAtMSwgMzI4LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAzMjkKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzMDZbXSA9CisgICAgeworCTg4MQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDMwN1tdID0KKyAgICB7CisJMTA0MworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDMwOFtdID0KKyAgICB7CisJNDg4CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMzA5W10gPQorICAgIHsKKwk2ODkKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzMTBbXSA9CisgICAgeworCTg4MgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDMxMVtdID0KKyAgICB7CisJMTA0NAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDMxMltdID0KKyAgICB7CisJMTE4MQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDMxM1tdID0KKyAgICB7CisJMTI5NQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDMxNFtdID0KKyAgICB7CisJMTM3NgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDMxNVtdID0KKyAgICB7CisJMTQzMAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDMxNltdID0KKyAgICB7CisJMTQ1OAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDMxN1tdID0KKyAgICB7CisJMzcxLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIDM3MgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDMxOFtdID0KKyAgICB7CisJNTUsIC0xLCA1NiwgLTEsIC0xLCA1NywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA1OCwgNTksIDYwCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMzE5W10gPQorICAgIHsKKwk0ODkKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzMjBbXSA9CisgICAgeworCTY3OSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwk2ODAKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzMjFbXSA9CisgICAgeworCTY5MAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDMyMltdID0KKyAgICB7CisJODgzCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMzIzW10gPQorICAgIHsKKwk4MzcsIC0xLCAtMSwgLTEsIDgzOCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA4MzkKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzMjRbXSA9CisgICAgeworCTQ5MAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDMyNVtdID0KKyAgICB7CisJMjk1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMjk2CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMzI2W10gPQorICAgIHsKKwk1MTkKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzMjdbXSA9CisgICAgeworCTcyMworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDMyOFtdID0KKyAgICB7CisJMzg0LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDM4NQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDMyOVtdID0KKyAgICB7CisJNDkxCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMzMwW10gPQorICAgIHsKKwk5MTQKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzMzFbXSA9CisgICAgeworCTY5MgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDMzMltdID0KKyAgICB7CisJODg0CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMzMzW10gPQorICAgIHsKKwkxMDc1CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMzM0W10gPQorICAgIHsKKwkxMDQ2CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMzM1W10gPQorICAgIHsKKwkxMTgyCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMzM2W10gPQorICAgIHsKKwkxMjA3CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMzM3W10gPQorICAgIHsKKwkxMjk2CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMzM4W10gPQorICAgIHsKKwk0OTIKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzMzlbXSA9CisgICAgeworCTY5MworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDM0MFtdID0KKyAgICB7CisJODg1CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMzQxW10gPQorICAgIHsKKwkxMDQ3CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMzQyW10gPQorICAgIHsKKwk0NTksIC0xLCAtMSwgNDU4CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMzQzW10gPQorICAgIHsKKwk0OTMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzNDRbXSA9CisgICAgeworCTY5NAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDM0NVtdID0KKyAgICB7CisJODg2CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMzQ2W10gPQorICAgIHsKKwkxMDQ4CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMzQ3W10gPQorICAgIHsKKwk2NzMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzNDhbXSA9CisgICAgeworCTExODMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzNDlbXSA9CisgICAgeworCTE5NCwgLTEsIDE4NiwgMTg3LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMTk5LCAxODUsIDE4OSwgCisJMTgzLCAxODgsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDE5OCwgLTEsIC0xLCAtMSwgCisJMTkxLCAtMSwgLTEsIC0xLCAtMSwgMTk1LCAtMSwgLTEsIDE5MywgMTk2LCAtMSwgLTEsIC0xLCAtMSwgMTkyLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDE5MCwgLTEsIC0xLCAtMSwgMTk3LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAxODQKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzNTBbXSA9CisgICAgeworCTQ5NAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDM1MVtdID0KKyAgICB7CisJNjk1CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMzUyW10gPQorICAgIHsKKwk4ODcKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzNTNbXSA9CisgICAgeworCTEwNDkKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzNTRbXSA9CisgICAgeworCTQ5NQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDM1NVtdID0KKyAgICB7CisJNjk2CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMzU2W10gPQorICAgIHsKKwk4ODgKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzNTdbXSA9CisgICAgeworCTEwNTAKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzNThbXSA9CisgICAgeworCTExODUKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzNTlbXSA9CisgICAgeworCTEyOTcKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzNjBbXSA9CisgICAgeworCTYxMAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDM2MVtdID0KKyAgICB7CisJNDk2CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMzYyW10gPQorICAgIHsKKwk4MTMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzNjNbXSA9CisgICAgeworCTY5NworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDM2NFtdID0KKyAgICB7CisJODg5CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMzY1W10gPQorICAgIHsKKwk5ODgKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzNjZbXSA9CisgICAgeworCTEwNTEKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzNjdbXSA9CisgICAgeworCTExMzMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzNjhbXSA9CisgICAgeworCTExODYKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzNjlbXSA9CisgICAgeworCTQ5NworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDM3MFtdID0KKyAgICB7CisJNjk4CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMzcxW10gPQorICAgIHsKKwk4OTAKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzNzJbXSA9CisgICAgeworCTEwNTIKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzNzNbXSA9CisgICAgeworCTExODcKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzNzRbXSA9CisgICAgeworCTM3NCwgMzc1CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMzc1W10gPQorICAgIHsKKwk2OTkKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzNzZbXSA9CisgICAgeworCTg5MQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDM3N1tdID0KKyAgICB7CisJMTA1MworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDM3OFtdID0KKyAgICB7CisJNDM4LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNDM3CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMzc5W10gPQorICAgIHsKKwk1MywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNTMsIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIDUzLCA1MywgNTMsIDc4OCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCAtMSwgLTEsIC0xLCAtMSwgNTMsIC0xLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzODBbXSA9CisgICAgeworCTExODgKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzODFbXSA9CisgICAgeworCTcwMAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDM4MltdID0KKyAgICB7CisJMjc1CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMzgzW10gPQorICAgIHsKKwkzMTQsIC0xLCAtMSwgLTEsIDMxNQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDM4NFtdID0KKyAgICB7CisJNzI3LCAtMSwgNzI4CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMzg1W10gPQorICAgIHsKKwk1NDYsIC0xLCAtMSwgLTEsIDU0NworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDM4NltdID0KKyAgICB7CisJNzAxCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMzg3W10gPQorICAgIHsKKwk4OTMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzODhbXSA9CisgICAgeworCTI3NgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDM4OVtdID0KKyAgICB7CisJMTA1NAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDM5MFtdID0KKyAgICB7CisJNTQsIDU0LCAtMSwgLTEsIDU0LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisJLTEsIC0xLCAtMSwgLTEsIC0xLCA1NCwgNDMsIDUwLCAxLCAyLCAzNywgNDIsIDUxLCAzMSwgMzIsIDQ2LCA0NSwgMzgsIDMsIAorCTQxLCA0NywgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsIDI4LCA0MCwgNCwgNSwgMzAsIDM5LCA2LCAKKwk1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDM1LCAtMSwgMzYsIDI5LCA0OSwgLTEsIDcsIDgsIDksIDEwLCAxMSwgCisJMTIsIDEzLCA1MywgMTQsIDE1LCA1MywgMTYsIDE3LCAxOCwgMTksIDIwLCA1MywgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgCisJNDQsIDUzLCA1MywgMzMsIDI3LCAzNCwgNDgKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzOTFbXSA9CisgICAgeworCTcwMgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDM5MltdID0KKyAgICB7CisJODk0CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMzkzW10gPQorICAgIHsKKwkxMDU1CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UMzk0W10gPQorICAgIHsKKwk3MDMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzOTVbXSA9CisgICAgeworCTg5NQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDM5NltdID0KKyAgICB7CisJMTA1NgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDM5N1tdID0KKyAgICB7CisJNjEyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA2MTMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzOThbXSA9CisgICAgeworCTExODkKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1QzOTlbXSA9CisgICAgeworCTEzMDAKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0MDBbXSA9CisgICAgeworCTEzNzkKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0MDFbXSA9CisgICAgeworCTQ3NworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDQwMltdID0KKyAgICB7CisJNzA0CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNDAzW10gPQorICAgIHsKKwk4OTYKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0MDRbXSA9CisgICAgeworCTEwNTcKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0MDVbXSA9CisgICAgeworCTExOTAKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0MDZbXSA9CisgICAgeworCTEzMDEKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0MDdbXSA9CisgICAgeworCTEzODAKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0MDhbXSA9CisgICAgeworCTE0MzEKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0MDlbXSA9CisgICAgeworCTIyOSwgLTEsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTIsIDUyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNTIKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0MTBbXSA9CisgICAgeworCTE0NTkKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0MTFbXSA9CisgICAgeworCTE0NzMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0MTJbXSA9CisgICAgeworCTI3MCwgLTEsIC0xLCAyNjkKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0MTNbXSA9CisgICAgeworCTQzOSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIDE4NgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDQxNFtdID0KKyAgICB7CisJNTA0CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNDE1W10gPQorICAgIHsKKwk3MDUKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0MTZbXSA9CisgICAgeworCTg5OAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDQxN1tdID0KKyAgICB7CisJMTA1OAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDQxOFtdID0KKyAgICB7CisJMTE5MQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDQxOVtdID0KKyAgICB7CisJMTMwMgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDQyMFtdID0KKyAgICB7CisJMjIwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMjIyLCAyMjEKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0MjFbXSA9CisgICAgeworCTg5OQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDQyMltdID0KKyAgICB7CisJMTA1OQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDQyM1tdID0KKyAgICB7CisJMzEwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMzExCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNDI0W10gPQorICAgIHsKKwk3MDgKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0MjVbXSA9CisgICAgeworCTQ4MCwgNDgxCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNDI2W10gPQorICAgIHsKKwk3MDkKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0MjdbXSA9CisgICAgeworCTkwMAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDQyOFtdID0KKyAgICB7CisJMTA2MAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDQyOVtdID0KKyAgICB7CisJOTY0LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA1MywgNTMsIDUzLCA1MywgNTMsIAorCTUzLCA1MywgNTMsIDUzLCA1MywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIAorCTUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIAorCTUzLCA1MywgLTEsIC0xLCAtMSwgLTEsIDk2NSwgLTEsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDQzMFtdID0KKyAgICB7CisJNDE4LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgNDE5CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNDMxW10gPQorICAgIHsKKwkyMTYsIDIxNywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIDIxOAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDQzMltdID0KKyAgICB7CisJNzEwCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNDMzW10gPQorICAgIHsKKwk1MDkKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0MzRbXSA9CisgICAgeworCTcxMQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDQzNVtdID0KKyAgICB7CisJNjY3CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNDM2W10gPQorICAgIHsKKwk5MDEKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0MzdbXSA9CisgICAgeworCTEwNjEKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0MzhbXSA9CisgICAgeworCTgxOSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgODIwCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNDM5W10gPQorICAgIHsKKwk4NjcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA4NjgKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0NDBbXSA9CisgICAgeworCTExOTIKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0NDFbXSA9CisgICAgeworCTEzMDMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0NDJbXSA9CisgICAgeworCTUyNywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDUyOAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDQ0M1tdID0KKyAgICB7CisJNTEwCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNDQ0W10gPQorICAgIHsKKwk3MTIKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0NDVbXSA9CisgICAgeworCTQ2NworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDQ0NltdID0KKyAgICB7CisJOTAyCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNDQ3W10gPQorICAgIHsKKwkxMDYyCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNDQ4W10gPQorICAgIHsKKwkxMTkzCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNDQ5W10gPQorICAgIHsKKwkzMjEKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0NTBbXSA9CisgICAgeworCTU0MAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDQ1MVtdID0KKyAgICB7CisJNDQyCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNDUyW10gPQorICAgIHsKKwk1MTEKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0NTNbXSA9CisgICAgeworCTY2OCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDY2OQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDQ1NFtdID0KKyAgICB7CisJNzEzCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNDU1W10gPQorICAgIHsKKwk5MDMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0NTZbXSA9CisgICAgeworCTEwNjMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0NTdbXSA9CisgICAgeworCTExOTQKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0NThbXSA9CisgICAgeworCTcxNAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDQ1OVtdID0KKyAgICB7CisJOTA0CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNDYwW10gPQorICAgIHsKKwkxMDY0CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNDYxW10gPQorICAgIHsKKwkxMTk1CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNDYyW10gPQorICAgIHsKKwk0MzksIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA0NDMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0NjNbXSA9CisgICAgeworCTMyMgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDQ2NFtdID0KKyAgICB7CisJNTQxCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNDY1W10gPQorICAgIHsKKwk1MjksIC0xLCAtMSwgLTEsIC0xLCAtMSwgNTMwCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNDY2W10gPQorICAgIHsKKwkxMjMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAxMjQsIC0xLCAtMSwgMTI1LCAtMSwgLTEsIDEyNiwgLTEsIC0xLCAKKwkxMjcsIC0xLCAtMSwgMTI4CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNDY3W10gPQorICAgIHsKKwkxMTk2CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNDY4W10gPQorICAgIHsKKwkxMzA2CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNDY5W10gPQorICAgIHsKKwkxMzgyCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNDcwW10gPQorICAgIHsKKwkxNDMyCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNDcxW10gPQorICAgIHsKKwk3NTIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDc1MworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDQ3MltdID0KKyAgICB7CisJMzEyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDMxMworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDQ3M1tdID0KKyAgICB7CisJNzE2CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNDc0W10gPQorICAgIHsKKwk5MDYKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0NzVbXSA9CisgICAgeworCTEwNjcKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0NzZbXSA9CisgICAgeworCTExOTcKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0NzdbXSA9CisgICAgeworCTEzMDcKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0NzhbXSA9CisgICAgeworCTE0NiwgLTEsIDE0NywgLTEsIC0xLCAxNDgKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0NzlbXSA9CisgICAgeworCTUzLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA1MywgNTMsIDUzLCA1MywgNTMsIAorCTUzLCA1MywgNTMsIDUzLCA1MywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIAorCTUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIAorCTUzLCA1MywgLTEsIC0xLCAtMSwgLTEsIDUzLCAtMSwgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIAorCTUzLCA1MywgMTAwOSwgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0ODBbXSA9CisgICAgeworCTMyMywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMzI0CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNDgxW10gPQorICAgIHsKKwk5MDcKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0ODJbXSA9CisgICAgeworCTEwNjgKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0ODNbXSA9CisgICAgeworCTExOTgKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0ODRbXSA9CisgICAgeworCTEzMDgKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0ODVbXSA9CisgICAgeworCTEzODMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0ODZbXSA9CisgICAgeworCTE0MzMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0ODdbXSA9CisgICAgeworCTI4NworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDQ4OFtdID0KKyAgICB7CisJMjY3LCAyNjYKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q0ODlbXSA9CisgICAgeworCTkwOAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDQ5MFtdID0KKyAgICB7CisJMTA2OQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDQ5MVtdID0KKyAgICB7CisJMjg4CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNDkyW10gPQorICAgIHsKKwkxMTk5CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNDkzW10gPQorICAgIHsKKwkxMzA5CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNDk0W10gPQorICAgIHsKKwkxMzg0CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNDk1W10gPQorICAgIHsKKwkxMDcwCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNDk2W10gPQorICAgIHsKKwkxMjAwCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNDk3W10gPQorICAgIHsKKwkxMzEwCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNDk4W10gPQorICAgIHsKKwkxMzg1CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNDk5W10gPQorICAgIHsKKwkxNDM0CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNTAwW10gPQorICAgIHsKKwkxNTMsIC0xLCAtMSwgMTU0LCAxNTUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDE1NiwgLTEsIC0xLCAKKwktMSwgLTEsIDE1NywgMTU4LCAxNTkKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q1MDFbXSA9CisgICAgeworCTEwNzEKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q1MDJbXSA9CisgICAgeworCTEyMDEKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q1MDNbXSA9CisgICAgeworCTEzMTEKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q1MDRbXSA9CisgICAgeworCTEzODYKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q1MDVbXSA9CisgICAgeworCTE0MzUKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q1MDZbXSA9CisgICAgeworCTUxNCwgLTEsIC0xLCAtMSwgLTEsIC0xLCA1MTUKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q1MDdbXSA9CisgICAgeworCTUxNgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDUwOFtdID0KKyAgICB7CisJNzIwCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNTA5W10gPQorICAgIHsKKwk1MzIKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q1MTBbXSA9CisgICAgeworCTkxMQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDUxMVtdID0KKyAgICB7CisJNzM3CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNTEyW10gPQorICAgIHsKKwkxMDcyCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNTEzW10gPQorICAgIHsKKwkxMjAyCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNTE0W10gPQorICAgIHsKKwk1MzMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q1MTVbXSA9CisgICAgeworCTY3MSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDY3MAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDUxNltdID0KKyAgICB7CisJNzM4CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNTE3W10gPQorICAgIHsKKwk3MjEKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q1MThbXSA9CisgICAgeworCTkyNworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDUxOVtdID0KKyAgICB7CisJOTEyCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNTIwW10gPQorICAgIHsKKwk3NDAKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q1MjFbXSA9CisgICAgeworCTEwNzMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q1MjJbXSA9CisgICAgeworCTE2NywgLTEsIDE2OCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAxNjksIC0xLCAtMSwgMTcwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCS0xLCAxNzEKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q1MjNbXSA9CisgICAgeworCTkyOQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDUyNFtdID0KKyAgICB7CisJMTIwMworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDUyNVtdID0KKyAgICB7CisJMTA4NQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDUyNltdID0KKyAgICB7CisJMTIxNQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDUyN1tdID0KKyAgICB7CisJMzE2CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNTI4W10gPQorICAgIHsKKwk1MzQKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q1MjlbXSA9CisgICAgeworCTczOQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDUzMFtdID0KKyAgICB7CisJOTI4CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNTMxW10gPQorICAgIHsKKwkxMDg0CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNTMyW10gPQorICAgIHsKKwkxMjE0CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNTMzW10gPQorICAgIHsKKwkxMzE5CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNTM0W10gPQorICAgIHsKKwk5MzcKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q1MzVbXSA9CisgICAgeworCTEwOTEKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q1MzZbXSA9CisgICAgeworCTUzNworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDUzN1tdID0KKyAgICB7CisJNjI1LCA2MjYKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q1MzhbXSA9CisgICAgeworCTc0MQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDUzOVtdID0KKyAgICB7CisJOTMwCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNTQwW10gPQorICAgIHsKKwkxMDg2CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNTQxW10gPQorICAgIHsKKwkzODEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCA1MywgNTMsIDUzLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCAtMSwgLTEsIC0xLCAtMSwgNTMsIC0xLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q1NDJbXSA9CisgICAgeworCTM3OQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDU0M1tdID0KKyAgICB7CisJMzE5CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNTQ0W10gPQorICAgIHsKKwk1MzgKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q1NDVbXSA9CisgICAgeworCTc0MgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDU0NltdID0KKyAgICB7CisJMTMxMgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDU0N1tdID0KKyAgICB7CisJMzIwCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNTQ4W10gPQorICAgIHsKKwk1MzkKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q1NDlbXSA9CisgICAgeworCTc0MworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDU1MFtdID0KKyAgICB7CisJOTMyCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNTUxW10gPQorICAgIHsKKwkxMDg3CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNTUyW10gPQorICAgIHsKKwk2MDQKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q1NTNbXSA9CisgICAgeworCTgwOAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDU1NFtdID0KKyAgICB7CisJOTg0CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNTU1W10gPQorICAgIHsKKwkxMTI4CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNTU2W10gPQorICAgIHsKKwkxNDMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDE0NSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAxNDQKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q1NTdbXSA9CisgICAgeworCTYyNworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDU1OFtdID0KKyAgICB7CisJNjU0LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDY1NSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgNjU2CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNTU5W10gPQorICAgIHsKKwk4MjcKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q1NjBbXSA9CisgICAgeworCTUyMAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDU2MVtdID0KKyAgICB7CisJMTAwMQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDU2MltdID0KKyAgICB7CisJNTIxCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNTYzW10gPQorICAgIHsKKwk5OSwgOTksIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgOTksIDk5LCA5OSwgOTksIDk5LCAKKwk5OSwgOTksIDk5LCA5OSwgOTksIDEzMTMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIAorCTk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIAorCTk5LCA5OSwgLTEsIC0xLCAtMSwgLTEsIDk5LCAtMSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIAorCTk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNTY0W10gPQorICAgIHsKKwk5MzMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q1NjVbXSA9CisgICAgeworCTEwODgKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q1NjZbXSA9CisgICAgeworCTExMDcsIC0xLCAtMSwgMTEwOCwgMTEwOSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAxMTEwLCAKKwkxMTExLCAtMSwgLTEsIDExMTIKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q1NjdbXSA9CisgICAgeworCTUyMgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDU2OFtdID0KKyAgICB7CisJNTMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCA1MywgNTMsIDUzLCAxMzM1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIC0xLCAtMSwgLTEsIC0xLCA1MywgLTEsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDU2OVtdID0KKyAgICB7CisJNDY4CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNTcwW10gPQorICAgIHsKKwk3MjYKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q1NzFbXSA9CisgICAgeworCTkxNQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDU3MltdID0KKyAgICB7CisJMTA3NgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDU3M1tdID0KKyAgICB7CisJMTIwOAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDU3NFtdID0KKyAgICB7CisJNTQyCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNTc1W10gPQorICAgIHsKKwkxMzE1CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNTc2W10gPQorICAgIHsKKwk3NDgKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q1NzdbXSA9CisgICAgeworCTU0MworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDU3OFtdID0KKyAgICB7CisJNzQ5CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNTc5W10gPQorICAgIHsKKwk5MTYKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q1ODBbXSA9CisgICAgeworCTkzNQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDU4MVtdID0KKyAgICB7CisJMTA4OQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDU4MltdID0KKyAgICB7CisJMTIxOQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDU4M1tdID0KKyAgICB7CisJMTMyMQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDU4NFtdID0KKyAgICB7CisJMzk5CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNTg1W10gPQorICAgIHsKKwk2MjgKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q1ODZbXSA9CisgICAgeworCTkxNworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDU4N1tdID0KKyAgICB7CisJMzI1CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNTg4W10gPQorICAgIHsKKwk4MjgsIC0xLCAtMSwgLTEsIDgyOQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDU4OVtdID0KKyAgICB7CisJMTA3OAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDU5MFtdID0KKyAgICB7CisJNTQ0CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNTkxW10gPQorICAgIHsKKwkxMjA5CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNTkyW10gPQorICAgIHsKKwk3NTAKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q1OTNbXSA9CisgICAgeworCTEzMTYKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q1OTRbXSA9CisgICAgeworCTkzNgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDU5NVtdID0KKyAgICB7CisJMTM4OAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDU5NltdID0KKyAgICB7CisJMTQzNgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDU5N1tdID0KKyAgICB7CisJMTQ2MAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDU5OFtdID0KKyAgICB7CisJMTQ3NAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDU5OVtdID0KKyAgICB7CisJMTQ4MQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDYwMFtdID0KKyAgICB7CisJMzI2CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNjAxW10gPQorICAgIHsKKwk1NDUKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q2MDJbXSA9CisgICAgeworCTcyOQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDYwM1tdID0KKyAgICB7CisJNTI1CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNjA0W10gPQorICAgIHsKKwkxMzIyCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNjA1W10gPQorICAgIHsKKwk3MzAKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q2MDZbXSA9CisgICAgeworCTEzOTEKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q2MDdbXSA9CisgICAgeworCTkxOQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDYwOFtdID0KKyAgICB7CisJMTA3OQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDYwOVtdID0KKyAgICB7CisJNTI2CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNjEwW10gPQorICAgIHsKKwk3MzEKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q2MTFbXSA9CisgICAgeworCTkyMAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDYxMltdID0KKyAgICB7CisJMTA4MAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDYxM1tdID0KKyAgICB7CisJMTIxMQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDYxNFtdID0KKyAgICB7CisJMjc5LCAtMSwgLTEsIC0xLCAyODAKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q2MTVbXSA9CisgICAgeworCTkzOAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDYxNltdID0KKyAgICB7CisJMTA5MgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDYxN1tdID0KKyAgICB7CisJNzMyCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNjE4W10gPQorICAgIHsKKwk5MjEKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q2MTlbXSA9CisgICAgeworCTMzMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDMzMQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDYyMFtdID0KKyAgICB7CisJMTA4MQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDYyMVtdID0KKyAgICB7CisJMTIxMgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDYyMltdID0KKyAgICB7CisJMTMxNworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDYyM1tdID0KKyAgICB7CisJMTM4OQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDYyNFtdID0KKyAgICB7CisJMTQzNworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDYyNVtdID0KKyAgICB7CisJMTQ2MQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDYyNltdID0KKyAgICB7CisJNTMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCA1MywgNTMsIDUzLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCAtMSwgLTEsIC0xLCAtMSwgNTMsIC0xLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCA1MywgNTMsIDUzLCA2MDUsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNjI3W10gPQorICAgIHsKKwk3MzMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q2MjhbXSA9CisgICAgeworCTkzOQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDYyOVtdID0KKyAgICB7CisJMjczLCAyNzIKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q2MzBbXSA9CisgICAgeworCTkyMgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDYzMVtdID0KKyAgICB7CisJMTA5MworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDYzMltdID0KKyAgICB7CisJMTA4MgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDYzM1tdID0KKyAgICB7CisJMTIyMworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDYzNFtdID0KKyAgICB7CisJMTIxMworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDYzNVtdID0KKyAgICB7CisJMTMyMworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDYzNltdID0KKyAgICB7CisJMTMxOAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDYzN1tdID0KKyAgICB7CisJMzMyCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNjM4W10gPQorICAgIHsKKwk1NTIsIC0xLCAtMSwgLTEsIC0xLCA1NTMsIDU1NAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDYzOVtdID0KKyAgICB7CisJNTQ4CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNjQwW10gPQorICAgIHsKKwk3NTYKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q2NDFbXSA9CisgICAgeworCTczNAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDY0MltdID0KKyAgICB7CisJOTQwCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNjQzW10gPQorICAgIHsKKwkxMDk0CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNjQ0W10gPQorICAgIHsKKwk0MjYsIC0xLCAtMSwgLTEsIDQyNworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDY0NVtdID0KKyAgICB7CisJMTIyNAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDY0NltdID0KKyAgICB7CisJMzAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMzAxLCAKKwktMSwgLTEsIDMwMgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDY0N1tdID0KKyAgICB7CisJNzM1CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNjQ4W10gPQorICAgIHsKKwk1NDkKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q2NDlbXSA9CisgICAgeworCTc1NworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDY1MFtdID0KKyAgICB7CisJOTQxCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNjUxW10gPQorICAgIHsKKwk3NjAKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q2NTJbXSA9CisgICAgeworCTUzMQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDY1M1tdID0KKyAgICB7CisJOTQ0CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNjU0W10gPQorICAgIHsKKwk3MzYKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q2NTVbXSA9CisgICAgeworCTEwOTYKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q2NTZbXSA9CisgICAgeworCTU1MAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDY1N1tdID0KKyAgICB7CisJNzU4CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNjU4W10gPQorICAgIHsKKwk0MDQsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA0MDUKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q2NTlbXSA9CisgICAgeworCTU1MQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDY2MFtdID0KKyAgICB7CisJNzU5CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNjYxW10gPQorICAgIHsKKwk0NjUsIC0xLCAtMSwgNDY0CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNjYyW10gPQorICAgIHsKKwk0NDcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA0NDksIC0xLCAtMSwgNDQ4LCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDQ0NCwgCisJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDQ0NiwgLTEsIC0xLCAtMSwgLTEsIC0xLCA0NDUKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q2NjNbXSA9CisgICAgeworCTEzMjUKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q2NjRbXSA9CisgICAgeworCTQwNiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgNDA3CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNjY1W10gPQorICAgIHsKKwk3NjEKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q2NjZbXSA9CisgICAgeworCTEzNywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDEzOAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDY2N1tdID0KKyAgICB7CisJODAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA4MCwgLTEsIC0xLCAtMSwgCisJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDc5LCAtMSwgLTEsIDc4CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNjY4W10gPQorICAgIHsKKwk3NjIKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q2NjlbXSA9CisgICAgeworCTgwOQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDY3MFtdID0KKyAgICB7CisJOTQ2CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNjcxW10gPQorICAgIHsKKwkxMDk3CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNjcyW10gPQorICAgIHsKKwk5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCAKKwk5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIC0xLCAtMSwgLTEsIC0xLCA5OSwgLTEsIDgyLCA4MywgODQsIDg1LCAKKwk4NiwgODcsIDg4LCA4OSwgOTAsIDk5LCA5OSwgOTksIDkxLCA5OSwgOTIsIDkzLCA5OSwgOTQsIDk1LCA5NiwgOTksIDk5LCAKKwk5OSwgOTcsIDk5LCA5OQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDY3M1tdID0KKyAgICB7CisJMTIyNworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDY3NFtdID0KKyAgICB7CisJOTg1CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNjc1W10gPQorICAgIHsKKwk1NTUKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q2NzZbXSA9CisgICAgeworCTc2MworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDY3N1tdID0KKyAgICB7CisJMjgxLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMjgyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwkyODMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q2NzhbXSA9CisgICAgeworCTU1NgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDY3OVtdID0KKyAgICB7CisJNTU3CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNjgwW10gPQorICAgIHsKKwk2MTQsIDYxNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorCTYxNiwgLTEsIDYxNworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDY4MVtdID0KKyAgICB7CisJMzM2CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNjgyW10gPQorICAgIHsKKwk1MzUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCA1MywgNTMsIDUzLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCAtMSwgLTEsIC0xLCAtMSwgNTMsIC0xLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q2ODNbXSA9CisgICAgeworCTU1OAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDY4NFtdID0KKyAgICB7CisJNzY1CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNjg1W10gPQorICAgIHsKKwk5NDgKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q2ODZbXSA9CisgICAgeworCTEwOTgKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q2ODdbXSA9CisgICAgeworCTMzNworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDY4OFtdID0KKyAgICB7CisJNTU5CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNjg5W10gPQorICAgIHsKKwk3NjYKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q2OTBbXSA9CisgICAgeworCTk0OQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDY5MVtdID0KKyAgICB7CisJMTA5OQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDY5MltdID0KKyAgICB7CisJMzMzLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDMzNCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAzMzUKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q2OTNbXSA9CisgICAgeworCTU2MAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDY5NFtdID0KKyAgICB7CisJNTIsIC0xLCAyNTAsIDI1MCwgMjUwLCAyNTAsIDI1MCwgMjUwLCAyNTAsIDI1MCwgMjUwLCAyNTAsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDI0OSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAyNDksIC0xLCAtMSwgLTEsIAorCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDI1MCwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgMjQ5CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNjk1W10gPQorICAgIHsKKwk3NjcKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q2OTZbXSA9CisgICAgeworCTk1MAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDY5N1tdID0KKyAgICB7CisJMzQwCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNjk4W10gPQorICAgIHsKKwk1NjEKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q2OTlbXSA9CisgICAgeworCTc2OAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDcwMFtdID0KKyAgICB7CisJMzQxCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNzAxW10gPQorICAgIHsKKwk1NjIKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q3MDJbXSA9CisgICAgeworCTc2OQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDcwM1tdID0KKyAgICB7CisJOTUyCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNzA0W10gPQorICAgIHsKKwkxMTAxCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNzA1W10gPQorICAgIHsKKwkyMzcKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q3MDZbXSA9CisgICAgeworCTk1MworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDcwN1tdID0KKyAgICB7CisJNTY0CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNzA4W10gPQorICAgIHsKKwk3NzIKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q3MDlbXSA9CisgICAgeworCTUzLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA1MywgNTMsIDUzLCA1MywgNTMsIAorCTUzLCA1MywgNTMsIDUzLCA1MywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIAorCTUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIAorCTUzLCA1MywgLTEsIC0xLCAtMSwgLTEsIDUzLCAtMSwgNTMsIDUzLCA1MywgODQ3LCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDcxMFtdID0KKyAgICB7CisJOTU0CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNzExW10gPQorICAgIHsKKwk1NjUKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q3MTJbXSA9CisgICAgeworCTI4NCwgLTEsIC0xLCAtMSwgMjg1LCAtMSwgMjg2CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNzEzW10gPQorICAgIHsKKwkzNDYKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q3MTRbXSA9CisgICAgeworCTU2NworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDcxNVtdID0KKyAgICB7CisJNzc0CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNzE2W10gPQorICAgIHsKKwk0OTgsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNDk5LCAtMSwgLTEsIC0xLCAtMSwgLTEsIDUwMCwgNTAxLCAtMSwgLTEsIDUwMiwgCisJNTAzCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNzE3W10gPQorICAgIHsKKwkzNDcKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q3MThbXSA9CisgICAgeworCTU2OAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDcxOVtdID0KKyAgICB7CisJMzQ4CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNzIwW10gPQorICAgIHsKKwk1NjkKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q3MjFbXSA9CisgICAgeworCTc3NgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDcyMltdID0KKyAgICB7CisJNTcwCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNzIzW10gPQorICAgIHsKKwkyMTAKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q3MjRbXSA9CisgICAgeworCTU3MQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDcyNVtdID0KKyAgICB7CisJNzc4CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNzI2W10gPQorICAgIHsKKwkyNDcsIC0xLCAtMSwgLTEsIC0xLCAyNDcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAyNDYsIAorCS0xLCAtMSwgMjQ1CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNzI3W10gPQorICAgIHsKKwk3NzkKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q3MjhbXSA9CisgICAgeworCTM0MgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDcyOVtdID0KKyAgICB7CisJNTYzCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNzMwW10gPQorICAgIHsKKwkyMTQKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q3MzFbXSA9CisgICAgeworCTIxMgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDczMltdID0KKyAgICB7CisJMzUzCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNzMzW10gPQorICAgIHsKKwk1NzYKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q3MzRbXSA9CisgICAgeworCTc4MgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDczNVtdID0KKyAgICB7CisJMTM2MSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDEzNjIKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q3MzZbXSA9CisgICAgeworCTM1NAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDczN1tdID0KKyAgICB7CisJMzU1CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNzM4W10gPQorICAgIHsKKwk1NzgKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q3MzlbXSA9CisgICAgeworCTM4NiwgMzg3CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNzQwW10gPQorICAgIHsKKwkzNTYKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q3NDFbXSA9CisgICAgeworCTU3OQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDc0MltdID0KKyAgICB7CisJNzg0CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNzQzW10gPQorICAgIHsKKwkxMDAsIDEwMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDEwMiwgLTEsIC0xLCAtMSwgMTAzLCAKKwktMSwgLTEsIC0xLCAxMDQKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q3NDRbXSA9CisgICAgeworCTM1NworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDc0NVtdID0KKyAgICB7CisJODY5CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNzQ2W10gPQorICAgIHsKKwk1ODAKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q3NDdbXSA9CisgICAgeworCTUzLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA1MywgNTMsIDUzLCA1MywgNTMsIAorCTUzLCA1MywgNTMsIDUzLCA1MywgOTc1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIC0xLCAtMSwgLTEsIC0xLCA1MywgLTEsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDc0OFtdID0KKyAgICB7CisJNzg1CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNzQ5W10gPQorICAgIHsKKwk5NjAKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q3NTBbXSA9CisgICAgeworCTM1OAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDc1MVtdID0KKyAgICB7CisJNTgxCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNzUyW10gPQorICAgIHsKKwk3ODYKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q3NTNbXSA9CisgICAgeworCTI1MiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAyNTMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q3NTRbXSA9CisgICAgeworCTUzLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA1MywgNTMsIDUzLCA1MywgNTMsIAorCTUzLCA1MywgNTMsIDUzLCA1MywgNzQ0LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIC0xLCAtMSwgLTEsIC0xLCA1MywgLTEsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDc1NVtdID0KKyAgICB7CisJOTYxCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNzU2W10gPQorICAgIHsKKwkxMTA1CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNzU3W10gPQorICAgIHsKKwkxMjMxCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNzU4W10gPQorICAgIHsKKwkzNTkKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q3NTlbXSA9CisgICAgeworCTU4MgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDc2MFtdID0KKyAgICB7CisJNzg3CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNzYxW10gPQorICAgIHsKKwk5NjIKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q3NjJbXSA9CisgICAgeworCTExMDYKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q3NjNbXSA9CisgICAgeworCTI2MAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDc2NFtdID0KKyAgICB7CisJMTcyLCAtMSwgMTczLCAtMSwgLTEsIDE3NCwgLTEsIC0xLCAtMSwgLTEsIDE3NSwgLTEsIC0xLCAtMSwgMTc2CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNzY1W10gPQorICAgIHsKKwk2NDIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNjQzCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNzY2W10gPQorICAgIHsKKwk1ODQKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q3NjdbXSA9CisgICAgeworCTc5MAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDc2OFtdID0KKyAgICB7CisJNTMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCA1MywgNTMsIDUzLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCAtMSwgLTEsIC0xLCAtMSwgNTMsIC0xLCA1MywgNTMsIDUzLCA1MywgNzQ2LCA1MywgNTMsIDUzLCA1MywgNTMsIAorCTUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNzY5W10gPQorICAgIHsKKwk3MTcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDcxOCwgLTEsIC0xLCAtMSwgNzE5CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNzcwW10gPQorICAgIHsKKwk0NjEKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q3NzFbXSA9CisgICAgeworCTEyMzMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q3NzJbXSA9CisgICAgeworCTEzMjgKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q3NzNbXSA9CisgICAgeworCTEzOTQKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q3NzRbXSA9CisgICAgeworCTE0MzkKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q3NzVbXSA9CisgICAgeworCTE0NjIKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q3NzZbXSA9CisgICAgeworCTM0OSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDM1MAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDc3N1tdID0KKyAgICB7CisJMTIzNAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDc3OFtdID0KKyAgICB7CisJMTMyOQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDc3OVtdID0KKyAgICB7CisJNTMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCA1MywgNTMsIDUzLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCAtMSwgLTEsIC0xLCAtMSwgNTMsIC0xLCA1MywgNTMsIDUzLCA1MywgNTg3LCA1MywgNTMsIDUzLCA1MywgNTMsIAorCTUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNzgwW10gPQorICAgIHsKKwkxMjM1CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNzgxW10gPQorICAgIHsKKwkxMzMwCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNzgyW10gPQorICAgIHsKKwkxMzk2CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNzgzW10gPQorICAgIHsKKwkzNDMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisJLTEsIC0xLCAzNDQsIDM0NQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDc4NFtdID0KKyAgICB7CisJMTAxMgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDc4NVtdID0KKyAgICB7CisJMzUxCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNzg2W10gPQorICAgIHsKKwkzODgsIC0xLCAtMSwgLTEsIDM4OSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAzOTAKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q3ODdbXSA9CisgICAgeworCTExNTMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q3ODhbXSA9CisgICAgeworCTEyMzYKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q3ODlbXSA9CisgICAgeworCTEzMzEKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q3OTBbXSA9CisgICAgeworCTU3MiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgNTczCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNzkxW10gPQorICAgIHsKKwkxMjc1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAxMjc2LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgMTI3NworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDc5MltdID0KKyAgICB7CisJNTMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCA1MywgNTMsIDUzLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCAtMSwgLTEsIC0xLCAtMSwgNTMsIC0xLCA1MywgNTMsIDUzLCA1MywgODU0LCA1MywgNTMsIDUzLCA1MywgNTMsIAorCTUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNzkzW10gPQorICAgIHsKKwkxMjM3CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNzk0W10gPQorICAgIHsKKwkxMzMyCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UNzk1W10gPQorICAgIHsKKwkyMjQsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisJMjI3LCAtMSwgLTEsIDIyNiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDIyNQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDc5NltdID0KKyAgICB7CisJMTM5OAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDc5N1tdID0KKyAgICB7CisJMTIzOAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDc5OFtdID0KKyAgICB7CisJMTMzMworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDc5OVtdID0KKyAgICB7CisJMzUyCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODAwW10gPQorICAgIHsKKwk0MTYKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q4MDFbXSA9CisgICAgeworCTY0NworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDgwMltdID0KKyAgICB7CisJODczCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODAzW10gPQorICAgIHsKKwkxMDM1CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODA0W10gPQorICAgIHsKKwkxMTcyCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODA1W10gPQorICAgIHsKKwkxMjg5CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODA2W10gPQorICAgIHsKKwkxMTEzCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODA3W10gPQorICAgIHsKKwkxMjM5CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODA4W10gPQorICAgIHsKKwkxMzcxCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODA5W10gPQorICAgIHsKKwkxMzM0CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODEwW10gPQorICAgIHsKKwkxNDAwCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODExW10gPQorICAgIHsKKwkxNDQyCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODEyW10gPQorICAgIHsKKwkxNDYzCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODEzW10gPQorICAgIHsKKwkxNDc2CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODE0W10gPQorICAgIHsKKwkyNTEKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q4MTVbXSA9CisgICAgeworCTQ3MworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDgxNltdID0KKyAgICB7CisJNjc2CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODE3W10gPQorICAgIHsKKwk5OSwgOTksIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgOTksIDk5LCA5OSwgOTksIDk5LCAKKwk5OSwgOTksIDk5LCA5OSwgOTksIDE0MjQsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIAorCTk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIAorCTk5LCA5OSwgLTEsIC0xLCAtMSwgLTEsIDk5LCAtMSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIAorCTk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODE4W10gPQorICAgIHsKKwk2NDgKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q4MTlbXSA9CisgICAgeworCTg0OQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDgyMFtdID0KKyAgICB7CisJNTA2LCA1MDcsIDUwOAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDgyMVtdID0KKyAgICB7CisJOTY4CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODIyW10gPQorICAgIHsKKwkxMDIwCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODIzW10gPQorICAgIHsKKwkxMTE1CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODI0W10gPQorICAgIHsKKwkxMTYwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDExNjEKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q4MjVbXSA9CisgICAgeworCTY4MSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNjgyCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODI2W10gPQorICAgIHsKKwk5NjkKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q4MjdbXSA9CisgICAgeworCTExMTYKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q4MjhbXSA9CisgICAgeworCTI1NCwgMjU1LCAtMSwgLTEsIC0xLCAtMSwgMjU2LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisJMjU3CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODI5W10gPQorICAgIHsKKwkxMjQyCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODMwW10gPQorICAgIHsKKwkzNjcKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q4MzFbXSA9CisgICAgeworCTU4OQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDgzMltdID0KKyAgICB7CisJNjM4LCAtMSwgNjM5CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODMzW10gPQorICAgIHsKKwkzNjgKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q4MzRbXSA9CisgICAgeworCTU5MAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDgzNVtdID0KKyAgICB7CisJNzk2CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODM2W10gPQorICAgIHsKKwk5NzAKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q4MzdbXSA9CisgICAgeworCTc5NworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDgzOFtdID0KKyAgICB7CisJMTIyMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNTMsIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIDUzLCA1MywgNTMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIC0xLCAtMSwgLTEsIC0xLCA1MywgLTEsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDgzOVtdID0KKyAgICB7CisJOTcxCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODQwW10gPQorICAgIHsKKwkyNjMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAyNjQKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q4NDFbXSA9CisgICAgeworCTExMTgKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q4NDJbXSA9CisgICAgeworCTEyNDMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q4NDNbXSA9CisgICAgeworCTQ1MQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDg0NFtdID0KKyAgICB7CisJNTkzCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODQ1W10gPQorICAgIHsKKwk1MywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNTMsIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIDUzLCA1MywgNTMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIC0xLCAtMSwgLTEsIC0xLCA1MywgLTEsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgMzYxLCA1MywgCisJNTMsIDUzLCA1MywgNTMsIDM2MiwgMzYzLCA1MywgNTMsIDM2NCwgMzY1LCA1MywgNTMsIDUzLCA1MywgNTMsIDUzCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODQ2W10gPQorICAgIHsKKwk4MDAKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q4NDdbXSA9CisgICAgeworCTk3MgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDg0OFtdID0KKyAgICB7CisJMTExOQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDg0OVtdID0KKyAgICB7CisJNTMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCA1MywgNTMsIDUzLCAtMSwgLTEsIDgwNSwgLTEsIC0xLCAtMSwgLTEsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIAorCTUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIAorCTUzLCA1MywgLTEsIC0xLCAtMSwgLTEsIDUzLCAtMSwgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIAorCTUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODUwW10gPQorICAgIHsKKwk4MDEKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q4NTFbXSA9CisgICAgeworCTY3NAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDg1MltdID0KKyAgICB7CisJNTk2CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODUzW10gPQorICAgIHsKKwk1MywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNTMsIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIDUzLCA1MywgNTMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIC0xLCAtMSwgLTEsIC0xLCA1MywgLTEsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgODYwLCA1MywgCisJNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q4NTRbXSA9CisgICAgeworCTM3MworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDg1NVtdID0KKyAgICB7CisJNTk3CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODU2W10gPQorICAgIHsKKwk4MDIKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q4NTdbXSA9CisgICAgeworCTk3NAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDg1OFtdID0KKyAgICB7CisJMTEyMAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDg1OVtdID0KKyAgICB7CisJNTk4CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODYwW10gPQorICAgIHsKKwk0MjMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q4NjFbXSA9CisgICAgeworCTUxNywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNTE4CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODYyW10gPQorICAgIHsKKwk1MywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNTMsIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIDUzLCA1MywgNTMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCAKKwk1MywgNTMsIC0xLCAtMSwgLTEsIC0xLCA1MywgLTEsIDc1NCwgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgCisJNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q4NjNbXSA9CisgICAgeworCTQ4NCwgLTEsIC0xLCA0ODUKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q4NjRbXSA9CisgICAgeworCTU4MworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDg2NVtdID0KKyAgICB7CisJNjUzCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODY2W10gPQorICAgIHsKKwkxMTIxCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODY3W10gPQorICAgIHsKKwkxMjQ2CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODY4W10gPQorICAgIHsKKwkxMzM5CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODY5W10gPQorICAgIHsKKwk1ODUKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q4NzBbXSA9CisgICAgeworCTExMjIKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q4NzFbXSA9CisgICAgeworCTc5MQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDg3MltdID0KKyAgICB7CisJMTI0NworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDg3M1tdID0KKyAgICB7CisJMTM0MAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDg3NFtdID0KKyAgICB7CisJMTE0LCAtMSwgLTEsIC0xLCAxMTUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMTE2LCAtMSwgLTEsIC0xLCAtMSwgMTE3LCAtMSwgCisJLTEsIC0xLCAtMSwgMTE4CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODc1W10gPQorICAgIHsKKwkxMTIzCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODc2W10gPQorICAgIHsKKwkxMjQ4CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODc3W10gPQorICAgIHsKKwkxMzQxCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODc4W10gPQorICAgIHsKKwkxMTI0CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODc5W10gPQorICAgIHsKKwkxMjQ5CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODgwW10gPQorICAgIHsKKwkxMzQyCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODgxW10gPQorICAgIHsKKwkxNDA0CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODgyW10gPQorICAgIHsKKwkxNDQzCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODgzW10gPQorICAgIHsKKwkxNDY0CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODg0W10gPQorICAgIHsKKwkzOTIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDM5MworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDg4NVtdID0KKyAgICB7CisJMTQ3NworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDg4NltdID0KKyAgICB7CisJMTEyNQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDg4N1tdID0KKyAgICB7CisJMTI1MAorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDg4OFtdID0KKyAgICB7CisJMTEyNgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDg4OVtdID0KKyAgICB7CisJNTEyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDUxMworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDg5MFtdID0KKyAgICB7CisJMTI1MQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDg5MVtdID0KKyAgICB7CisJMjM1CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODkyW10gPQorICAgIHsKKwkzNzcKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q4OTNbXSA9CisgICAgeworCTEzMSwgLTEsIC0xLCAxMzIsIDEzMywgMTM0LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMTM1CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODk0W10gPQorICAgIHsKKwkzODAKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q4OTVbXSA9CisgICAgeworCTYwMworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDg5NltdID0KKyAgICB7CisJODA3CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UODk3W10gPQorICAgIHsKKwkzODMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q4OThbXSA9CisgICAgeworCTk4MworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDg5OVtdID0KKyAgICB7CisJMTEyNworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDkwMFtdID0KKyAgICB7CisJMTI1MgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDkwMVtdID0KKyAgICB7CisJNjU4CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UOTAyW10gPQorICAgIHsKKwkxMzQ2CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UOTAzW10gPQorICAgIHsKKwkxNDA1CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UOTA0W10gPQorICAgIHsKKwkxNDQ0CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UOTA1W10gPQorICAgIHsKKwkxMjksIC0xLCAtMSwgLTEsIC0xLCAtMSwgMTMwCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UOTA2W10gPQorICAgIHsKKwkxNDY1CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UOTA3W10gPQorICAgIHsKKwkxNDc4CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UOTA4W10gPQorICAgIHsKKwkyNTgsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDI1OQorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDkwOVtdID0KKyAgICB7CisJMTM0NworICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDkxMFtdID0KKyAgICB7CisJMTQwNgorICAgIH07CisKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhNTBfVDkxMVtdID0KKyAgICB7CisJNjcyCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UOTEyW10gPQorICAgIHsKKwkxMzYKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q5MTNbXSA9CisgICAgeworCTEzNDgKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q5MTRbXSA9CisgICAgeworCTE0MDcKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q5MTVbXSA9CisgICAgeworCTQyOCwgLTEsIC0xLCAtMSwgLTEsIC0xLCA0MjkKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q5MTZbXSA9CisgICAgeworCTE0NDYKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q5MTdbXSA9CisgICAgeworCTUzLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA1MywgNTMsIDUzLCA1MywgNTMsIAorCTUzLCA1MywgNTMsIDUzLCA1MywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIAorCTUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIAorCTUzLCA1MywgLTEsIC0xLCAtMSwgLTEsIDUzLCAtMSwgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIAorCTUzLCA1MywgNTMsIDUzLCAxMjI1LCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMsIDUzLCA1MywgNTMKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q5MThbXSA9CisgICAgeworCTEzNDkKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q5MTlbXSA9CisgICAgeworCTE0MDgKKyAgICB9OworCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyIGRmYTUwX1Q5MjBbXSA9CisgICAgeworCTIwNywgMjA4CisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UOTIxW10gPQorICAgIHsKKwkxMzUwCisgICAgfTsKKworc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE1MF9UOTIyW10gPQorICAgIHsKKwkxNDA5CisgICAgfTsKKworCisvKiBUcmFuc2l0aW9uIHRhYmxlcyBhcmUgYSB0YWJsZSBvZiBzdWIgdGFibGVzLCB3aXRoIHNvbWUgdGFibGVzCisgKiByZXVzZWQgZm9yIGVmZmljaWVuY3kuCisgKi8KK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgKiBjb25zdCBkZmE1MF90cmFuc2l0aW9uc1tdID0KK3sKKyAgICBkZmE1MF9UMzkwLCBkZmE1MF9UMzE4LCBkZmE1MF9UMTI1LCBkZmE1MF9UNzMsIGRmYTUwX1QyNjksIGRmYTUwX1Q2NjcsIAorICAgIGRmYTUwX1Q2NzIsIGRmYTUwX1Q3NDMsIGRmYTUwX1QxMzcsIGRmYTUwX1QyOTMsIGRmYTUwX1Q4NzQsIGRmYTUwX1Q4MiwgCisgICAgZGZhNTBfVDQ2NiwgZGZhNTBfVDkwNSwgZGZhNTBfVDg5MywgZGZhNTBfVDkxMiwgZGZhNTBfVDY2NiwgZGZhNTBfVDY2LCAKKyAgICBkZmE1MF9UNTU2LCBkZmE1MF9UNDc4LCBkZmE1MF9UMTA4LCBkZmE1MF9UNTAwLCBkZmE1MF9UMjY1LCBkZmE1MF9UNTIyLCAKKyAgICBkZmE1MF9UNzY0LCBkZmE1MF9UODUsIGRmYTUwX1QxMDAsIGRmYTUwX1QzNDksIGRmYTUwX1QyNTQsIGRmYTUwX1QxNDMsIAorICAgIGRmYTUwX1Q5MjAsIGRmYTUwX1Q3MjMsIGRmYTUwX1Q3MzEsIGRmYTUwX1Q3MzAsIGRmYTUwX1Q0MzEsIGRmYTUwX1Q0MjAsIAorICAgIE5VTEwsIGRmYTUwX1Q3OTUsIE5VTEwsIE5VTEwsIE5VTEwsIGRmYTUwX1Q0MDksIGRmYTUwX1QyMywgZGZhNTBfVDg5MSwgCisgICAgZGZhNTBfVDcwNSwgZGZhNTBfVDI0LCBkZmE1MF9UMTQ1LCBkZmE1MF9UNzI2LCBOVUxMLCBkZmE1MF9UNjk0LCBOVUxMLCAKKyAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBkZmE1MF9UODE0LCBOVUxMLCBkZmE1MF9UNzUzLCBOVUxMLCAKKyAgICBOVUxMLCBkZmE1MF9UODI4LCBOVUxMLCBOVUxMLCBkZmE1MF9UOTA4LCBOVUxMLCBOVUxMLCBOVUxMLCBkZmE1MF9UNzYzLCAKKyAgICBOVUxMLCBkZmE1MF9UMTMxLCBOVUxMLCBOVUxMLCBkZmE1MF9UODQwLCBkZmE1MF9UNDg4LCBkZmE1MF9UNDEyLCBOVUxMLCAKKyAgICBkZmE1MF9UNjI5LCBOVUxMLCBOVUxMLCBOVUxMLCBkZmE1MF9UMzgyLCBkZmE1MF9UMzg4LCBkZmE1MF9UMTAyLCBkZmE1MF9UNjE0LCAKKyAgICBkZmE1MF9UNjc3LCBkZmE1MF9UNzEyLCBkZmE1MF9UNDg3LCBkZmE1MF9UNDkxLCBkZmE1MF9UNDMsIGRmYTUwX1QzMjUsIAorICAgIGRmYTUwX1QxNSwgZGZhNTBfVDY0NiwgZGZhNTBfVDE5MiwgZGZhNTBfVDMwLCBkZmE1MF9UNDIzLCBkZmE1MF9UNDcyLCAKKyAgICBOVUxMLCBOVUxMLCBkZmE1MF9UMzgzLCBkZmE1MF9UNTI3LCBkZmE1MF9UMTMyLCBkZmE1MF9UNTQzLCBkZmE1MF9UNTQ3LCAKKyAgICBkZmE1MF9UNDQ5LCBkZmE1MF9UNDYzLCBkZmE1MF9UNDgwLCBkZmE1MF9UNTg3LCBkZmE1MF9UNjAwLCBkZmE1MF9UMzA1LCAKKyAgICBkZmE1MF9UNjE5LCBkZmE1MF9UNjM3LCBkZmE1MF9UNjkyLCBkZmE1MF9UNjgxLCBkZmE1MF9UNjg3LCBkZmE1MF9UNjUsIAorICAgIGRmYTUwX1Q2OTcsIGRmYTUwX1Q3MDAsIGRmYTUwX1Q3MjgsIGRmYTUwX1Q3ODMsIGRmYTUwX1Q3MTMsIGRmYTUwX1Q3MTcsIAorICAgIGRmYTUwX1Q3MTksIGRmYTUwX1Q3NzYsIGRmYTUwX1Q3ODUsIGRmYTUwX1Q3OTksIGRmYTUwX1Q3MzIsIGRmYTUwX1Q3MzYsIAorICAgIGRmYTUwX1Q3MzcsIGRmYTUwX1Q3NDAsIGRmYTUwX1Q3NDQsIGRmYTUwX1Q3NTAsIGRmYTUwX1Q3NTgsIGRmYTUwX1QwLCAKKyAgICBkZmE1MF9UODQ1LCBkZmE1MF9UODMwLCBkZmE1MF9UODMzLCBkZmE1MF9UMjUxLCBkZmE1MF9UMzE3LCBkZmE1MF9UODU0LCAKKyAgICBkZmE1MF9UMzc0LCBkZmE1MF9UMjEzLCBkZmE1MF9UODkyLCBkZmE1MF9UMTczLCBkZmE1MF9UNTQyLCBkZmE1MF9UODk0LCAKKyAgICBkZmE1MF9UNTQxLCBkZmE1MF9UODk3LCBkZmE1MF9UMzI4LCBkZmE1MF9UNzM5LCBkZmE1MF9UNzg2LCBkZmE1MF9UNTMsIAorICAgIGRmYTUwX1Q4ODQsIGRmYTUwX1Q2MiwgZGZhNTBfVDI5NCwgZGZhNTBfVDU4NCwgZGZhNTBfVDc4LCBkZmE1MF9UODAsIAorICAgIGRmYTUwX1Q4NywgZGZhNTBfVDkyLCBkZmE1MF9UNjU4LCBkZmE1MF9UNjY0LCBkZmE1MF9UMTA5LCBkZmE1MF9UNzEsIAorICAgIGRmYTUwX1QxNTYsIGRmYTUwX1QxNjEsIGRmYTUwX1QxNjUsIGRmYTUwX1Q4MDAsIGRmYTUwX1QxNzAsIGRmYTUwX1Q0MzAsIAorICAgIGRmYTUwX1QxODEsIGRmYTUwX1QxODMsIGRmYTUwX1QxODgsIGRmYTUwX1Q4NjAsIGRmYTUwX1QxNDYsIGRmYTUwX1Q2NDQsIAorICAgIGRmYTUwX1Q5MTUsIGRmYTUwX1QyNjIsIGRmYTUwX1QyNzEsIGRmYTUwX1QyNzYsIGRmYTUwX1QyOTEsIGRmYTUwX1QyOTcsIAorICAgIGRmYTUwX1QxNDcsIE5VTEwsIGRmYTUwX1QzNzgsIE5VTEwsIGRmYTUwX1Q0MTMsIE5VTEwsIE5VTEwsIE5VTEwsIGRmYTUwX1QxMzQsIAorICAgIGRmYTUwX1Q0NTEsIGRmYTUwX1Q0NjIsIE5VTEwsIE5VTEwsIE5VTEwsIGRmYTUwX1Q2NjIsIE5VTEwsIE5VTEwsIE5VTEwsIAorICAgIGRmYTUwX1Q4NDMsIE5VTEwsIE5VTEwsIGRmYTUwX1QxMTcsIE5VTEwsIE5VTEwsIGRmYTUwX1Q5LCBkZmE1MF9UMzQyLCAKKyAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAKKyAgICBOVUxMLCBOVUxMLCBOVUxMLCBkZmE1MF9UNzcwLCBOVUxMLCBkZmE1MF9UMjc1LCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAKKyAgICBkZmE1MF9UNjYxLCBkZmE1MF9UNDQ1LCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBkZmE1MF9UNTY5LCBkZmE1MF9UOTYsIAorICAgIE5VTEwsIE5VTEwsIE5VTEwsIGRmYTUwX1QxNjksIE5VTEwsIE5VTEwsIGRmYTUwX1QyMTEsIE5VTEwsIE5VTEwsIE5VTEwsIAorICAgIGRmYTUwX1QyMTcsIGRmYTUwX1Q2OTQsIGRmYTUwX1Q4MTUsIE5VTEwsIGRmYTUwX1QyNzcsIE5VTEwsIE5VTEwsIE5VTEwsIAorICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIAorICAgIGRmYTUwX1Q0MDEsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIGRmYTUwX1QxODksIGRmYTUwX1QxOTYsIGRmYTUwX1Q0MjUsIAorICAgIGRmYTUwX1QyNDUsIGRmYTUwX1QyNTIsIGRmYTUwX1Q4NjMsIGRmYTUwX1QyOTUsIGRmYTUwX1QzMDMsIGRmYTUwX1QzMDgsIAorICAgIGRmYTUwX1QzMTksIGRmYTUwX1QzMjQsIGRmYTUwX1QzMjksIGRmYTUwX1QzMzgsIGRmYTUwX1QzNDMsIGRmYTUwX1QzNTAsIAorICAgIGRmYTUwX1QzNTQsIGRmYTUwX1QzNjEsIGRmYTUwX1QzNjksIGRmYTUwX1Q3MTYsIGRmYTUwX1Q0MTQsIGRmYTUwX1Q4MywgCisgICAgZGZhNTBfVDgyMCwgZGZhNTBfVDQzMywgZGZhNTBfVDQ0MywgZGZhNTBfVDQ1MiwgZGZhNTBfVDg4OSwgZGZhNTBfVDUwNiwgCisgICAgZGZhNTBfVDUwNywgZGZhNTBfVDg2MSwgZGZhNTBfVDMyNiwgZGZhNTBfVDU2MCwgZGZhNTBfVDU2MiwgZGZhNTBfVDU2NywgCisgICAgZGZhNTBfVDE3MiwgZGZhNTBfVDYwMywgZGZhNTBfVDYwOSwgZGZhNTBfVDQ0MiwgZGZhNTBfVDQ2NSwgZGZhNTBfVDY1MiwgCisgICAgZGZhNTBfVDUwOSwgZGZhNTBfVDUxNCwgZGZhNTBfVDUyOCwgZGZhNTBfVDY4MiwgZGZhNTBfVDUzNiwgZGZhNTBfVDU0NCwgCisgICAgZGZhNTBfVDU0OCwgZGZhNTBfVDQ1MCwgZGZhNTBfVDQ2NCwgZGZhNTBfVDU3NCwgZGZhNTBfVDU3NywgZGZhNTBfVDU5MCwgCisgICAgZGZhNTBfVDYwMSwgZGZhNTBfVDM4NSwgZGZhNTBfVDYzOSwgZGZhNTBfVDY0OCwgZGZhNTBfVDY1NiwgZGZhNTBfVDY1OSwgCisgICAgZGZhNTBfVDYzOCwgZGZhNTBfVDY3NSwgZGZhNTBfVDY3OCwgZGZhNTBfVDY3OSwgZGZhNTBfVDY4MywgZGZhNTBfVDY4OCwgCisgICAgZGZhNTBfVDY5MywgTlVMTCwgZGZhNTBfVDY5OCwgZGZhNTBfVDcwMSwgZGZhNTBfVDcyOSwgZGZhNTBfVDcwNywgZGZhNTBfVDcxMSwgCisgICAgZGZhNTBfVDAsIGRmYTUwX1Q3MTQsIGRmYTUwX1Q3MTgsIGRmYTUwX1Q3MjAsIGRmYTUwX1Q3MjIsIGRmYTUwX1Q3MjQsIAorICAgIGRmYTUwX1Q3OTAsIGRmYTUwX1QyMDEsIGRmYTUwX1Q3MzMsIGRmYTUwX1QwLCBkZmE1MF9UNzM4LCBkZmE1MF9UNzQxLCAKKyAgICBkZmE1MF9UNzQ2LCBkZmE1MF9UNzUxLCBkZmE1MF9UNzU5LCBOVUxMLCBkZmE1MF9UODY0LCBkZmE1MF9UNzY2LCBkZmE1MF9UODY5LCAKKyAgICBkZmE1MF9UMTMsIGRmYTUwX1Q3NzksIE5VTEwsIGRmYTUwX1Q4MzEsIGRmYTUwX1Q4MzQsIGRmYTUwX1Q2NCwgZGZhNTBfVDg0NCwgCisgICAgZGZhNTBfVDc1LCBkZmE1MF9UODUyLCBkZmE1MF9UODU1LCBkZmE1MF9UODU5LCBkZmE1MF9UMTExLCBkZmE1MF9UMjE1LCAKKyAgICBkZmE1MF9UMCwgZGZhNTBfVDE3NCwgZGZhNTBfVDAsIGRmYTUwX1Q4OTUsIGRmYTUwX1Q1NTIsIE5VTEwsIGRmYTUwX1Q2MjYsIAorICAgIGRmYTUwX1QxLCBkZmE1MF9UNSwgZGZhNTBfVDgsIGRmYTUwX1QzNjAsIGRmYTUwX1QxNywgZGZhNTBfVDM5NywgZGZhNTBfVDY4MCwgCisgICAgZGZhNTBfVDU0LCBkZmE1MF9UMCwgZGZhNTBfVDE3MSwgZGZhNTBfVDAsIGRmYTUwX1Q2MywgZGZhNTBfVDAsIGRmYTUwX1Q1MzcsIAorICAgIGRmYTUwX1Q1NTcsIGRmYTUwX1Q1ODUsIGRmYTUwX1QwLCBkZmE1MF9UMCwgZGZhNTBfVDg4LCBkZmE1MF9UOTMsIGRmYTUwX1Q5OSwgCisgICAgZGZhNTBfVDAsIGRmYTUwX1QxMDMsIGRmYTUwX1QxMDYsIGRmYTUwX1QxMTAsIGRmYTUwX1Q4MzIsIGRmYTUwX1QxMzgsIAorICAgIGRmYTUwX1QxNDgsIGRmYTUwX1Q3NjUsIGRmYTUwX1QxNTcsIGRmYTUwX1QxNjIsIGRmYTUwX1QxNjYsIGRmYTUwX1Q4MDEsIAorICAgIE5VTEwsIGRmYTUwX1Q4MTgsIGRmYTUwX1QxODAsIGRmYTUwX1QxODIsIGRmYTUwX1QxODQsIGRmYTUwX1QxOTAsIGRmYTUwX1Q4NjUsIAorICAgIGRmYTUwX1Q1NTgsIGRmYTUwX1QyMjQsIGRmYTUwX1Q5MDEsIGRmYTUwX1QyNDYsIGRmYTUwX1QwLCBkZmE1MF9UMCwgCisgICAgZGZhNTBfVDI2NiwgZGZhNTBfVDAsIGRmYTUwX1QyNzgsIGRmYTUwX1QyOTIsIGRmYTUwX1QyOTksIE5VTEwsIE5VTEwsIAorICAgIE5VTEwsIE5VTEwsIE5VTEwsIGRmYTUwX1Q0MzUsIE5VTEwsIGRmYTUwX1Q0NTMsIE5VTEwsIGRmYTUwX1Q1MTUsIE5VTEwsIAorICAgIE5VTEwsIE5VTEwsIGRmYTUwX1Q5MTEsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIAorICAgIE5VTEwsIGRmYTUwX1QzNDcsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIGRmYTUwX1Q4NTEsIE5VTEwsIE5VTEwsIAorICAgIE5VTEwsIGRmYTUwX1QwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBkZmE1MF9UODE2LCBOVUxMLCBOVUxMLCBOVUxMLCAKKyAgICBOVUxMLCBkZmE1MF9UMTkxLCBkZmE1MF9UMTk3LCBkZmE1MF9UMzIwLCBkZmE1MF9UODI1LCBkZmE1MF9UMjQ3LCBkZmE1MF9UMjUzLCAKKyAgICBkZmE1MF9UMjcwLCBkZmE1MF9UMjgzLCBkZmE1MF9UMjk2LCBkZmE1MF9UMzA0LCBkZmE1MF9UMzA5LCBkZmE1MF9UMzIxLCAKKyAgICBkZmE1MF9UMjAyLCBkZmE1MF9UMzMxLCBkZmE1MF9UMzM5LCBkZmE1MF9UMzQ0LCBkZmE1MF9UMzUxLCBkZmE1MF9UMzU1LCAKKyAgICBkZmE1MF9UMzYzLCBkZmE1MF9UMzcwLCBkZmE1MF9UMzc1LCBkZmE1MF9UMzgxLCBkZmE1MF9UMzg2LCBkZmE1MF9UMzkxLCAKKyAgICBkZmE1MF9UMzk0LCBkZmE1MF9UNDAyLCBkZmE1MF9UNDE1LCBkZmE1MF9UODYsIGRmYTUwX1Q0MjQsIGRmYTUwX1Q0MjYsIAorICAgIGRmYTUwX1Q0MzIsIGRmYTUwX1Q0MzQsIGRmYTUwX1Q0NDQsIGRmYTUwX1Q0NTQsIGRmYTUwX1Q0NTgsIGRmYTUwX1QxNTEsIAorICAgIGRmYTUwX1Q0NzMsIGRmYTUwX1Q3NjksIGRmYTUwX1Q1MDgsIGRmYTUwX1Q1MTcsIGRmYTUwX1Q3OSwgZGZhNTBfVDMyNywgCisgICAgZGZhNTBfVDIwMiwgZGZhNTBfVDIwMiwgZGZhNTBfVDU3MCwgZGZhNTBfVDM4NCwgZGZhNTBfVDYwMiwgZGZhNTBfVDYwNSwgCisgICAgZGZhNTBfVDYxMCwgZGZhNTBfVDYxNywgZGZhNTBfVDYyNywgZGZhNTBfVDY0MSwgZGZhNTBfVDY0NywgZGZhNTBfVDY1NCwgCisgICAgZGZhNTBfVDUxMSwgZGZhNTBfVDUxNiwgZGZhNTBfVDUyOSwgZGZhNTBfVDUyMCwgTlVMTCwgZGZhNTBfVDUzOCwgZGZhNTBfVDU0NSwgCisgICAgZGZhNTBfVDU0OSwgZGZhNTBfVDc1NCwgZGZhNTBfVDc2OCwgZGZhNTBfVDU3NiwgZGZhNTBfVDU3OCwgZGZhNTBfVDU5MiwgCisgICAgZGZhNTBfVDAsIGRmYTUwX1Q0NzEsIGRmYTUwX1Q4NjIsIGRmYTUwX1Q2NDAsIGRmYTUwX1Q2NDksIGRmYTUwX1Q2NTcsIAorICAgIGRmYTUwX1Q2NjAsIGRmYTUwX1Q2NTEsIGRmYTUwX1Q2NjUsIGRmYTUwX1Q2NjgsIGRmYTUwX1Q2NzYsIGRmYTUwX1QwLCAKKyAgICBOVUxMLCBkZmE1MF9UNjg0LCBkZmE1MF9UNjg5LCBkZmE1MF9UNjk1LCBkZmE1MF9UNjk5LCBkZmE1MF9UNzAyLCBkZmE1MF9UMTAxLCAKKyAgICBkZmE1MF9UNzA4LCBkZmE1MF9UMCwgTlVMTCwgZGZhNTBfVDcxNSwgZGZhNTBfVDAsIGRmYTUwX1Q3MjEsIGRmYTUwX1QwLCAKKyAgICBkZmE1MF9UNzI1LCBkZmE1MF9UNzI3LCBkZmE1MF9UMCwgZGZhNTBfVDAsIE5VTEwsIGRmYTUwX1Q3MzQsIE5VTEwsIAorICAgIGRmYTUwX1QwLCBkZmE1MF9UNzQyLCBkZmE1MF9UNzQ4LCBkZmE1MF9UNzUyLCBkZmE1MF9UNzYwLCBkZmE1MF9UMzc5LCAKKyAgICBkZmE1MF9UNzY3LCBkZmE1MF9UODcxLCBkZmE1MF9UMTQsIGRmYTUwX1Q0MCwgTlVMTCwgZGZhNTBfVDAsIGRmYTUwX1Q4MzUsIAorICAgIGRmYTUwX1Q4MzcsIGRmYTUwX1QwLCBkZmE1MF9UMCwgZGZhNTBfVDg0NiwgZGZhNTBfVDg1MCwgTlVMTCwgZGZhNTBfVDg1NiwgCisgICAgTlVMTCwgZGZhNTBfVDExNCwgZGZhNTBfVDIyMCwgTlVMTCwgZGZhNTBfVDg0OSwgZGZhNTBfVDg5NiwgZGZhNTBfVDU1MywgCisgICAgZGZhNTBfVDY2OSwgTlVMTCwgZGZhNTBfVDIsIGRmYTUwX1Q2LCBkZmE1MF9UMCwgZGZhNTBfVDM2MiwgZGZhNTBfVDE4LCAKKyAgICBkZmE1MF9UMjUsIGRmYTUwX1QyNywgZGZhNTBfVDMxLCBkZmE1MF9UMzMsIGRmYTUwX1Q0MzgsIGRmYTUwX1Q0OCwgZGZhNTBfVDU1LCAKKyAgICBOVUxMLCBkZmE1MF9UNTgsIE5VTEwsIE5VTEwsIGRmYTUwX1QwLCBOVUxMLCBkZmE1MF9UNjcsIGRmYTUwX1Q3MCwgZGZhNTBfVDU1OSwgCisgICAgZGZhNTBfVDU4OCwgTlVMTCwgTlVMTCwgZGZhNTBfVDg5LCBkZmE1MF9UOTQsIGRmYTUwX1QwLCBOVUxMLCBkZmE1MF9UMTA0LCAKKyAgICBkZmE1MF9UMTA3LCBkZmE1MF9UMTEyLCBkZmE1MF9UMTE2LCBkZmE1MF9UMzIzLCBkZmE1MF9UMTM5LCBkZmE1MF9UMCwgCisgICAgZGZhNTBfVDE0OSwgZGZhNTBfVDE1MiwgZGZhNTBfVDE1OCwgZGZhNTBfVDE2MywgZGZhNTBfVDE2NywgZGZhNTBfVDcwOSwgCisgICAgZGZhNTBfVDgxOSwgZGZhNTBfVDAsIGRmYTUwX1QwLCBkZmE1MF9UMTg1LCBkZmE1MF9UMTkzLCBkZmE1MF9UNzkyLCAKKyAgICBkZmE1MF9UMjA5LCBkZmE1MF9UMjE0LCBkZmE1MF9UMjE2LCBkZmE1MF9UMjI1LCBkZmE1MF9UODUzLCBkZmE1MF9UMjQ4LCAKKyAgICBOVUxMLCBOVUxMLCBkZmE1MF9UMjY3LCBOVUxMLCBkZmE1MF9UMjgxLCBkZmE1MF9UMCwgZGZhNTBfVDMwMSwgZGZhNTBfVDQzOSwgCisgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgZGZhNTBfVDc0NSwgZGZhNTBfVDE5NCwgCisgICAgZGZhNTBfVDE5OCwgTlVMTCwgZGZhNTBfVDgwMiwgZGZhNTBfVDIyNiwgZGZhNTBfVDIzNCwgZGZhNTBfVDI0OSwgZGZhNTBfVDI1NSwgCisgICAgZGZhNTBfVDI3MiwgZGZhNTBfVDI4NSwgZGZhNTBfVDI5OCwgZGZhNTBfVDMwNiwgZGZhNTBfVDMxMCwgZGZhNTBfVDMyMiwgCisgICAgTlVMTCwgZGZhNTBfVDMzMiwgZGZhNTBfVDM0MCwgZGZhNTBfVDM0NSwgZGZhNTBfVDM1MiwgZGZhNTBfVDM1NiwgZGZhNTBfVDM2NCwgCisgICAgZGZhNTBfVDM3MSwgZGZhNTBfVDM3NiwgZGZhNTBfVDIwMiwgZGZhNTBfVDM4NywgZGZhNTBfVDM5MiwgZGZhNTBfVDM5NSwgCisgICAgZGZhNTBfVDQwMywgZGZhNTBfVDIwMiwgZGZhNTBfVDQxNiwgZGZhNTBfVDQyMSwgTlVMTCwgZGZhNTBfVDQyNywgTlVMTCwgCisgICAgZGZhNTBfVDQzNiwgZGZhNTBfVDQ0NiwgZGZhNTBfVDQ1NSwgZGZhNTBfVDQ1OSwgZGZhNTBfVDE1MywgZGZhNTBfVDQ3NCwgCisgICAgZGZhNTBfVDQ4MSwgZGZhNTBfVDQ4OSwgZGZhNTBfVDIwOCwgZGZhNTBfVDUxMCwgZGZhNTBfVDUxOSwgZGZhNTBfVDgxLCAKKyAgICBkZmE1MF9UMzMwLCBOVUxMLCBOVUxMLCBkZmE1MF9UNTcxLCBkZmE1MF9UNTc5LCBkZmE1MF9UNTg2LCBkZmE1MF9UMjAyLCAKKyAgICBkZmE1MF9UNjA3LCBkZmE1MF9UNjExLCBkZmE1MF9UNjE4LCBkZmE1MF9UNjMwLCBkZmE1MF9UMjAyLCBkZmE1MF9UMjAyLCAKKyAgICBkZmE1MF9UMjAyLCBkZmE1MF9UMCwgZGZhNTBfVDUxOCwgZGZhNTBfVDUzMCwgZGZhNTBfVDUyMywgZGZhNTBfVDUzOSwgCisgICAgZGZhNTBfVDAsIGRmYTUwX1Q1NTAsIE5VTEwsIE5VTEwsIGRmYTUwX1Q1NjQsIE5VTEwsIGRmYTUwX1QwLCBkZmE1MF9UNTgwLCAKKyAgICBkZmE1MF9UNTk0LCBOVUxMLCBkZmE1MF9UNTM0LCBkZmE1MF9UNjE1LCBkZmE1MF9UNjI4LCBOVUxMLCBkZmE1MF9UNjQyLCAKKyAgICBkZmE1MF9UNjUwLCBkZmE1MF9UMCwgZGZhNTBfVDAsIGRmYTUwX1Q2NTMsIGRmYTUwX1QwLCBkZmE1MF9UNjcwLCBkZmE1MF9UMCwgCisgICAgTlVMTCwgZGZhNTBfVDY4NSwgZGZhNTBfVDY5MCwgZGZhNTBfVDY5NiwgZGZhNTBfVDAsIGRmYTUwX1Q3MDMsIGRmYTUwX1Q3MDYsIAorICAgIE5VTEwsIGRmYTUwX1Q3MTAsIE5VTEwsIGRmYTUwX1QwLCBOVUxMLCBkZmE1MF9UMCwgTlVMTCwgZGZhNTBfVDAsIGRmYTUwX1QwLCAKKyAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBkZmE1MF9UMCwgZGZhNTBfVDc0OSwgZGZhNTBfVDc1NSwgZGZhNTBfVDc2MSwgCisgICAgTlVMTCwgTlVMTCwgZGZhNTBfVDAsIGRmYTUwX1Q0MjksIGRmYTUwX1QxNiwgZGZhNTBfVDgyMSwgZGZhNTBfVDgyNiwgCisgICAgTlVMTCwgZGZhNTBfVDgzNiwgZGZhNTBfVDgzOSwgTlVMTCwgTlVMTCwgZGZhNTBfVDg0NywgZGZhNTBfVDAsIGRmYTUwX1Q4NTcsIAorICAgIGRmYTUwX1Q3NDcsIGRmYTUwX1QyMjMsIE5VTEwsIE5VTEwsIGRmYTUwX1Q4OTgsIGRmYTUwX1Q1NTQsIGRmYTUwX1Q2NzQsIAorICAgIGRmYTUwX1QzLCBkZmE1MF9UNywgTlVMTCwgZGZhNTBfVDM2NSwgZGZhNTBfVDIwLCBkZmE1MF9UMjYsIGRmYTUwX1QyOCwgCisgICAgZGZhNTBfVDMyLCBkZmE1MF9UMzQsIGRmYTUwX1QzOCwgZGZhNTBfVDQ0LCBkZmE1MF9UNDksIGRmYTUwX1Q1NiwgZGZhNTBfVDU5LCAKKyAgICBOVUxMLCBkZmE1MF9UNjgsIGRmYTUwX1Q3MiwgZGZhNTBfVDU2MSwgZGZhNTBfVDAsIGRmYTUwX1Q3NiwgZGZhNTBfVDkwLCAKKyAgICBkZmE1MF9UOTUsIE5VTEwsIGRmYTUwX1QxMDUsIE5VTEwsIGRmYTUwX1QxMTMsIGRmYTUwX1QwLCBkZmE1MF9UNDc5LCAKKyAgICBkZmE1MF9UMTI0LCBkZmE1MF9UNzg0LCBkZmE1MF9UMTQwLCBOVUxMLCBkZmE1MF9UMTUwLCBkZmE1MF9UMTU0LCBkZmE1MF9UMTU5LCAKKyAgICBkZmE1MF9UMTY0LCBkZmE1MF9UMTY4LCBkZmE1MF9UMCwgTlVMTCwgZGZhNTBfVDgyMiwgTlVMTCwgTlVMTCwgZGZhNTBfVDE4NiwgCisgICAgZGZhNTBfVDE5NSwgZGZhNTBfVDIwNSwgTlVMTCwgZGZhNTBfVDIxMCwgZGZhNTBfVDAsIGRmYTUwX1QyMTgsIGRmYTUwX1QyMjcsIAorICAgIGRmYTUwX1QyMzYsIE5VTEwsIGRmYTUwX1QwLCBkZmE1MF9UMjY4LCBkZmE1MF9UMjgyLCBOVUxMLCBkZmE1MF9UMCwgCisgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgZGZhNTBfVDIwMiwgZGZhNTBfVDE5OSwgZGZhNTBfVDgwMywgZGZhNTBfVDIyOCwgCisgICAgZGZhNTBfVDIzNSwgZGZhNTBfVDI1MCwgZGZhNTBfVDI1NiwgZGZhNTBfVDI3MywgZGZhNTBfVDI4NywgZGZhNTBfVDMwMCwgCisgICAgZGZhNTBfVDMwNywgZGZhNTBfVDMxMSwgZGZhNTBfVDIwMiwgZGZhNTBfVDMzNCwgZGZhNTBfVDM0MSwgZGZhNTBfVDM0NiwgCisgICAgZGZhNTBfVDM1MywgZGZhNTBfVDM1NywgZGZhNTBfVDM2NiwgZGZhNTBfVDM3MiwgZGZhNTBfVDM3NywgTlVMTCwgZGZhNTBfVDM4OSwgCisgICAgZGZhNTBfVDM5MywgZGZhNTBfVDM5NiwgZGZhNTBfVDQwNCwgTlVMTCwgZGZhNTBfVDQxNywgZGZhNTBfVDQyMiwgZGZhNTBfVDQyOCwgCisgICAgZGZhNTBfVDQzNywgZGZhNTBfVDQ0NywgZGZhNTBfVDQ1NiwgZGZhNTBfVDQ2MCwgZGZhNTBfVDE1NSwgZGZhNTBfVDQ3NSwgCisgICAgZGZhNTBfVDQ4MiwgZGZhNTBfVDQ5MCwgZGZhNTBfVDQ5NSwgZGZhNTBfVDUwMSwgZGZhNTBfVDUxMiwgZGZhNTBfVDUyMSwgCisgICAgZGZhNTBfVDg0LCBkZmE1MF9UMzMzLCBkZmE1MF9UNTcyLCBkZmE1MF9UMjAyLCBkZmE1MF9UNTg5LCBOVUxMLCBkZmE1MF9UNjA4LCAKKyAgICBkZmE1MF9UNjEyLCBkZmE1MF9UNjIwLCBkZmE1MF9UNjMyLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBkZmE1MF9UMCwgCisgICAgZGZhNTBfVDUzMSwgZGZhNTBfVDUyNSwgZGZhNTBfVDU0MCwgTlVMTCwgZGZhNTBfVDU1MSwgZGZhNTBfVDU2NSwgTlVMTCwgCisgICAgZGZhNTBfVDU4MSwgZGZhNTBfVDAsIGRmYTUwX1Q1MzUsIGRmYTUwX1Q2MTYsIGRmYTUwX1Q2MzEsIGRmYTUwX1Q2NDMsIAorICAgIGRmYTUwX1QwLCBOVUxMLCBOVUxMLCBkZmE1MF9UNjU1LCBOVUxMLCBkZmE1MF9UNjcxLCBOVUxMLCBkZmE1MF9UNjg2LCAKKyAgICBkZmE1MF9UNjkxLCBkZmE1MF9UMCwgTlVMTCwgZGZhNTBfVDcwNCwgZGZhNTBfVDAsIGRmYTUwX1QwLCBOVUxMLCBOVUxMLCAKKyAgICBOVUxMLCBOVUxMLCBOVUxMLCBkZmE1MF9UMCwgZGZhNTBfVDc1NiwgZGZhNTBfVDc2MiwgTlVMTCwgZGZhNTBfVDU2NiwgCisgICAgZGZhNTBfVDgwNiwgTlVMTCwgZGZhNTBfVDE5LCBkZmE1MF9UODIzLCBkZmE1MF9UODI3LCBkZmE1MF9UMCwgZGZhNTBfVDg0MSwgCisgICAgZGZhNTBfVDg0OCwgTlVMTCwgZGZhNTBfVDg1OCwgTlVMTCwgTlVMTCwgZGZhNTBfVDg2NiwgZGZhNTBfVDg3MCwgZGZhNTBfVDg3NSwgCisgICAgZGZhNTBfVDg3OCwgZGZhNTBfVDg4NiwgZGZhNTBfVDg4OCwgZGZhNTBfVDg5OSwgZGZhNTBfVDU1NSwgZGZhNTBfVDI3OSwgCisgICAgZGZhNTBfVDQsIGRmYTUwX1QwLCBkZmE1MF9UMzY3LCBkZmE1MF9UMjEsIE5VTEwsIGRmYTUwX1QyOSwgTlVMTCwgZGZhNTBfVDM1LCAKKyAgICBkZmE1MF9UMzksIGRmYTUwX1Q0NSwgZGZhNTBfVDUwLCBkZmE1MF9UMCwgZGZhNTBfVDYwLCBkZmE1MF9UNjksIGRmYTUwX1QwLCAKKyAgICBkZmE1MF9UMjgwLCBOVUxMLCBkZmE1MF9UNzcsIGRmYTUwX1Q5MSwgZGZhNTBfVDk3LCBkZmE1MF9UMCwgZGZhNTBfVDExNSwgCisgICAgTlVMTCwgZGZhNTBfVDExOCwgTlVMTCwgZGZhNTBfVDAsIGRmYTUwX1Q3ODcsIGRmYTUwX1QxNDEsIGRmYTUwX1QwLCAKKyAgICBkZmE1MF9UMCwgZGZhNTBfVDE2MCwgZGZhNTBfVDAsIGRmYTUwX1QwLCBOVUxMLCBkZmE1MF9UODI0LCBkZmE1MF9UMTg3LCAKKyAgICBkZmE1MF9UMCwgZGZhNTBfVDIwNiwgZGZhNTBfVDIxMiwgTlVMTCwgZGZhNTBfVDIxOSwgZGZhNTBfVDAsIGRmYTUwX1QyMzgsIAorICAgIE5VTEwsIGRmYTUwX1QwLCBkZmE1MF9UMjg0LCBOVUxMLCBOVUxMLCBkZmE1MF9UMjAwLCBkZmE1MF9UODA0LCBkZmE1MF9UMjI5LCAKKyAgICBkZmE1MF9UMjM3LCBkZmE1MF9UMjAyLCBkZmE1MF9UMjU3LCBkZmE1MF9UMjc0LCBkZmE1MF9UMjg4LCBkZmE1MF9UMzAyLCAKKyAgICBkZmE1MF9UMjAyLCBkZmE1MF9UMzEyLCBOVUxMLCBkZmE1MF9UMzM1LCBOVUxMLCBkZmE1MF9UMzQ4LCBkZmE1MF9UMjAyLCAKKyAgICBkZmE1MF9UMzU4LCBkZmE1MF9UMzY4LCBkZmE1MF9UMzczLCBkZmE1MF9UMzgwLCBOVUxMLCBOVUxMLCBkZmE1MF9UMzk4LCAKKyAgICBkZmE1MF9UNDA1LCBkZmE1MF9UNDE4LCBOVUxMLCBOVUxMLCBkZmE1MF9UNDQwLCBkZmE1MF9UNDQ4LCBkZmE1MF9UNDU3LCAKKyAgICBkZmE1MF9UNDYxLCBOVUxMLCBkZmE1MF9UNDY3LCBkZmE1MF9UNDc2LCBkZmE1MF9UNDgzLCBkZmE1MF9UNDkyLCBkZmE1MF9UNDk2LCAKKyAgICBkZmE1MF9UNTAyLCBkZmE1MF9UNTEzLCBkZmE1MF9UNTI0LCBkZmE1MF9UMjYzLCBkZmE1MF9UMzM2LCBkZmE1MF9UNTczLCAKKyAgICBOVUxMLCBkZmE1MF9UNTkxLCBkZmE1MF9UMjAyLCBkZmE1MF9UNjEzLCBkZmE1MF9UNjIxLCBkZmE1MF9UNjM0LCBOVUxMLCAKKyAgICBkZmE1MF9UNTMyLCBkZmE1MF9UNTI2LCBkZmE1MF9UMCwgZGZhNTBfVDAsIGRmYTUwX1QwLCBkZmE1MF9UNTgyLCBOVUxMLCAKKyAgICBkZmE1MF9UODM4LCBkZmE1MF9UMCwgZGZhNTBfVDYzMywgZGZhNTBfVDY0NSwgTlVMTCwgZGZhNTBfVDkxNywgZGZhNTBfVDY3MywgCisgICAgZGZhNTBfVDAsIGRmYTUwX1QwLCBOVUxMLCBkZmE1MF9UMCwgTlVMTCwgTlVMTCwgTlVMTCwgZGZhNTBfVDc1NywgZGZhNTBfVDAsIAorICAgIGRmYTUwX1Q3NzEsIGRmYTUwX1Q3NzcsIGRmYTUwX1Q3ODAsIGRmYTUwX1Q3ODgsIGRmYTUwX1Q3OTMsIGRmYTUwX1Q3OTcsIAorICAgIGRmYTUwX1Q4MDcsIGRmYTUwX1QyMiwgZGZhNTBfVDAsIGRmYTUwX1Q4MjksIE5VTEwsIGRmYTUwX1Q4NDIsIGRmYTUwX1QwLCAKKyAgICBkZmE1MF9UMCwgZGZhNTBfVDg2NywgZGZhNTBfVDg3MiwgZGZhNTBfVDg3NiwgZGZhNTBfVDg3OSwgZGZhNTBfVDg4NywgCisgICAgZGZhNTBfVDg5MCwgZGZhNTBfVDkwMCwgZGZhNTBfVDAsIGRmYTUwX1QyMzksIE5VTEwsIGRmYTUwX1QwLCBOVUxMLCAKKyAgICBkZmE1MF9UNTcsIGRmYTUwX1QwLCBkZmE1MF9UMCwgZGZhNTBfVDM2LCBkZmE1MF9UNDEsIGRmYTUwX1Q0NiwgZGZhNTBfVDUxLCAKKyAgICBOVUxMLCBkZmE1MF9UNjEsIGRmYTUwX1QwLCBOVUxMLCBkZmE1MF9UNzQsIE5VTEwsIGRmYTUwX1QwLCBkZmE1MF9UMCwgCisgICAgZGZhNTBfVDk4LCBOVUxMLCBOVUxMLCBkZmE1MF9UMTE5LCBOVUxMLCBkZmE1MF9UNzkxLCBkZmE1MF9UMTQyLCBOVUxMLCAKKyAgICBOVUxMLCBkZmE1MF9UMCwgTlVMTCwgTlVMTCwgZGZhNTBfVDE3NSwgZGZhNTBfVDE3NywgZGZhNTBfVDAsIE5VTEwsIAorICAgIGRmYTUwX1QyMDcsIGRmYTUwX1QwLCBkZmE1MF9UMjIxLCBOVUxMLCBkZmE1MF9UMjQxLCBOVUxMLCBkZmE1MF9UMjg2LCAKKyAgICBkZmE1MF9UMjAzLCBkZmE1MF9UODA1LCBkZmE1MF9UMjMwLCBkZmE1MF9UMjQwLCBOVUxMLCBkZmE1MF9UMjU4LCBkZmE1MF9UMjAyLCAKKyAgICBkZmE1MF9UMjg5LCBOVUxMLCBOVUxMLCBkZmE1MF9UMzEzLCBkZmE1MF9UMzM3LCBOVUxMLCBOVUxMLCBkZmE1MF9UMzU5LCAKKyAgICBkZmE1MF9UMjAyLCBOVUxMLCBkZmE1MF9UMjAyLCBkZmE1MF9UMzk5LCBkZmE1MF9UNDA2LCBkZmE1MF9UNDE5LCBkZmE1MF9UNDQxLCAKKyAgICBkZmE1MF9UMjAyLCBOVUxMLCBkZmE1MF9UMjAyLCBkZmE1MF9UNDY4LCBkZmE1MF9UNDc3LCBkZmE1MF9UNDg0LCBkZmE1MF9UNDkzLCAKKyAgICBkZmE1MF9UNDk3LCBkZmE1MF9UNTAzLCBOVUxMLCBOVUxMLCBOVUxMLCBkZmE1MF9UNTQ2LCBOVUxMLCBkZmE1MF9UNTYzLCAKKyAgICBkZmE1MF9UNTc1LCBkZmE1MF9UNTkzLCBOVUxMLCBOVUxMLCBkZmE1MF9UNjIyLCBkZmE1MF9UNjM2LCBkZmE1MF9UNTMzLCAKKyAgICBkZmE1MF9UMCwgTlVMTCwgTlVMTCwgTlVMTCwgZGZhNTBfVDU4MywgZGZhNTBfVDYwNCwgTlVMTCwgTlVMTCwgZGZhNTBfVDYzNSwgCisgICAgZGZhNTBfVDAsIGRmYTUwX1Q2NjMsIE5VTEwsIGRmYTUwX1QwLCBOVUxMLCBOVUxMLCBOVUxMLCBkZmE1MF9UMCwgTlVMTCwgCisgICAgZGZhNTBfVDc3MiwgZGZhNTBfVDc3OCwgZGZhNTBfVDc4MSwgZGZhNTBfVDc4OSwgZGZhNTBfVDc5NCwgZGZhNTBfVDc5OCwgCisgICAgZGZhNTBfVDgwOSwgZGZhNTBfVDU2OCwgTlVMTCwgZGZhNTBfVDAsIGRmYTUwX1QwLCBOVUxMLCBOVUxMLCBkZmE1MF9UODY4LCAKKyAgICBkZmE1MF9UODczLCBkZmE1MF9UODc3LCBkZmE1MF9UODgwLCBkZmE1MF9UMCwgZGZhNTBfVDAsIGRmYTUwX1QwLCBOVUxMLCAKKyAgICBkZmE1MF9UOTAyLCBkZmE1MF9UOTA5LCBkZmE1MF9UOTEzLCBkZmE1MF9UOTE4LCBkZmE1MF9UOTIxLCBOVUxMLCBkZmE1MF9UMTAsIAorICAgIE5VTEwsIE5VTEwsIE5VTEwsIGRmYTUwX1QzNywgZGZhNTBfVDQyLCBkZmE1MF9UNDcsIGRmYTUwX1Q1MiwgZGZhNTBfVDAsIAorICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIGRmYTUwX1QwLCBkZmE1MF9UMTIwLCBkZmE1MF9UMTI2LCBkZmE1MF9UMTMwLCAKKyAgICBkZmE1MF9UNzM1LCBkZmE1MF9UMTQ0LCBOVUxMLCBkZmE1MF9UMTc2LCBkZmE1MF9UMTc4LCBOVUxMLCBkZmE1MF9UMCwgCisgICAgTlVMTCwgZGZhNTBfVDIyMiwgZGZhNTBfVDI0MywgZGZhNTBfVDAsIGRmYTUwX1QyMDQsIGRmYTUwX1Q4MDgsIGRmYTUwX1QyMzEsIAorICAgIGRmYTUwX1QyNDIsIGRmYTUwX1QyNTksIE5VTEwsIGRmYTUwX1QyOTAsIGRmYTUwX1QzMTQsIGRmYTUwX1QyMDIsIGRmYTUwX1QyMDIsIAorICAgIE5VTEwsIE5VTEwsIGRmYTUwX1Q0MDAsIGRmYTUwX1Q0MDcsIE5VTEwsIGRmYTUwX1QyMDIsIE5VTEwsIE5VTEwsIGRmYTUwX1Q0NjksIAorICAgIE5VTEwsIGRmYTUwX1Q0ODUsIGRmYTUwX1Q0OTQsIGRmYTUwX1Q0OTgsIGRmYTUwX1Q1MDQsIE5VTEwsIE5VTEwsIE5VTEwsIAorICAgIGRmYTUwX1QyMDIsIGRmYTUwX1Q1OTUsIGRmYTUwX1Q2MjMsIE5VTEwsIE5VTEwsIE5VTEwsIGRmYTUwX1QwLCBkZmE1MF9UNjA2LCAKKyAgICBkZmE1MF9UMCwgTlVMTCwgZGZhNTBfVDAsIE5VTEwsIE5VTEwsIGRmYTUwX1Q3NzMsIGRmYTUwX1QwLCBkZmE1MF9UNzgyLCAKKyAgICBkZmE1MF9UMCwgZGZhNTBfVDc5NiwgZGZhNTBfVDAsIGRmYTUwX1Q4MTAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIAorICAgIGRmYTUwX1QwLCBkZmE1MF9UMCwgZGZhNTBfVDAsIGRmYTUwX1Q4ODEsIE5VTEwsIE5VTEwsIE5VTEwsIGRmYTUwX1Q5MDMsIAorICAgIGRmYTUwX1Q5MTAsIGRmYTUwX1Q5MTQsIGRmYTUwX1Q5MTksIGRmYTUwX1Q5MjIsIGRmYTUwX1QxMSwgZGZhNTBfVDAsIAorICAgIGRmYTUwX1QwLCBkZmE1MF9UMCwgTlVMTCwgTlVMTCwgTlVMTCwgZGZhNTBfVDEyMSwgZGZhNTBfVDEyNywgZGZhNTBfVDAsIAorICAgIGRmYTUwX1QxMzMsIGRmYTUwX1QxMzUsIGRmYTUwX1QwLCBkZmE1MF9UMCwgZGZhNTBfVDE3OSwgTlVMTCwgZGZhNTBfVDAsIAorICAgIGRmYTUwX1QwLCBOVUxMLCBOVUxMLCBkZmE1MF9UODE3LCBkZmE1MF9UMjMyLCBkZmE1MF9UMjQ0LCBkZmE1MF9UMjYwLCAKKyAgICBkZmE1MF9UMjAyLCBkZmE1MF9UMzE1LCBOVUxMLCBOVUxMLCBOVUxMLCBkZmE1MF9UNDA4LCBOVUxMLCBkZmE1MF9UNDcwLCAKKyAgICBkZmE1MF9UNDg2LCBOVUxMLCBkZmE1MF9UNDk5LCBkZmE1MF9UNTA1LCBOVUxMLCBkZmE1MF9UNTk2LCBkZmE1MF9UNjI0LCAKKyAgICBOVUxMLCBkZmE1MF9UMCwgTlVMTCwgTlVMTCwgZGZhNTBfVDc3NCwgTlVMTCwgZGZhNTBfVDAsIE5VTEwsIGRmYTUwX1QwLCAKKyAgICBOVUxMLCBkZmE1MF9UODExLCBOVUxMLCBOVUxMLCBOVUxMLCBkZmE1MF9UODgyLCBkZmE1MF9UOTA0LCBkZmE1MF9UMCwgCisgICAgZGZhNTBfVDkxNiwgZGZhNTBfVDAsIGRmYTUwX1QwLCBkZmE1MF9UMTIsIE5VTEwsIE5VTEwsIE5VTEwsIGRmYTUwX1QxMjIsIAorICAgIGRmYTUwX1QxMjgsIE5VTEwsIGRmYTUwX1QwLCBkZmE1MF9UMTM2LCBOVUxMLCBOVUxMLCBkZmE1MF9UMCwgTlVMTCwgCisgICAgTlVMTCwgTlVMTCwgTlVMTCwgZGZhNTBfVDIzMywgZGZhNTBfVDIwMiwgZGZhNTBfVDI2MSwgTlVMTCwgZGZhNTBfVDMxNiwgCisgICAgZGZhNTBfVDQxMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgZGZhNTBfVDU5NywgZGZhNTBfVDYyNSwgTlVMTCwgZGZhNTBfVDc3NSwgCisgICAgTlVMTCwgTlVMTCwgZGZhNTBfVDgxMiwgZGZhNTBfVDg4MywgZGZhNTBfVDkwNiwgTlVMTCwgZGZhNTBfVDAsIE5VTEwsIAorICAgIE5VTEwsIGRmYTUwX1QwLCBkZmE1MF9UMTIzLCBkZmE1MF9UMTI5LCBOVUxMLCBkZmE1MF9UMCwgTlVMTCwgZGZhNTBfVDIwMiwgCisgICAgTlVMTCwgZGZhNTBfVDI2NCwgTlVMTCwgZGZhNTBfVDQxMSwgZGZhNTBfVDU5OCwgTlVMTCwgZGZhNTBfVDAsIGRmYTUwX1Q4MTMsIAorICAgIGRmYTUwX1Q4ODUsIGRmYTUwX1Q5MDcsIE5VTEwsIE5VTEwsIGRmYTUwX1QwLCBkZmE1MF9UMCwgTlVMTCwgTlVMTCwgCisgICAgTlVMTCwgTlVMTCwgZGZhNTBfVDU5OSwgTlVMTCwgZGZhNTBfVDAsIE5VTEwsIGRmYTUwX1QwLCBOVUxMLCBOVUxMLCAKKyAgICBOVUxMLCBOVUxMLCBOVUxMCit9OworCisKKy8qIERlY2xhcmUgdHJhY2tpbmcgc3RydWN0dXJlIGZvciBDeWNsaWMgREZBIDUwCisgKi8KK3N0YXRpYworQU5UTFIzX0NZQ0xJQ19ERkEgY2RmYTUwCisgICAgPQl7CisJICAgIDUwLAkJICAgIC8qIERlY2lzaW9uIG51bWJlciBvZiB0aGlzIGRmYQkgICAgKi8KKwkgICAgLyogV2hpY2ggZGVjaXNpb24gdGhpcyByZXByZXNlbnRzOiAgICovCisJICAgIChjb25zdCBwQU5UTFIzX1VDSEFSKSIxOjE6IFRva2VucyA6ICggVF9fMTQ0IHwgVF9fMTQ1IHwgVF9fMTQ2IHwgVF9fMTQ3IHwgVF9fMTQ4IHwgVF9fMTQ5IHwgVF9fMTUwIHwgVF9fMTUxIHwgVF9fMTUyIHwgVF9fMTUzIHwgVF9fMTU0IHwgVF9fMTU1IHwgVF9fMTU2IHwgVF9fMTU3IHwgVF9fMTU4IHwgVF9fMTU5IHwgVF9fMTYwIHwgVF9fMTYxIHwgVF9fMTYyIHwgVF9fMTYzIHwgVF9fMTY0IHwgVF9fMTY1IHwgVF9fMTY2IHwgVF9fMTY3IHwgVF9fMTY4IHwgVF9fMTY5IHwgVF9fMTcwIHwgVF9fMTcxIHwgVF9fMTcyIHwgVF9fMTczIHwgVF9fMTc0IHwgVF9fMTc1IHwgVF9fMTc2IHwgVF9fMTc3IHwgVF9fMTc4IHwgVF9fMTc5IHwgVF9fMTgwIHwgVF9fMTgxIHwgVF9fMTgyIHwgVF9fMTgzIHwgVF9fMTg0IHwgVF9fMTg1IHwgVF9fMTg2IHwgVF9fMTg3IHwgVF9fMTg4IHwgVF9fMTg5IHwgVF9fMTkwIHwgVF9fMTkxIHwgVF9fMTkyIHwgVF9fMTkzIHwgVF9fMTk0IHwgVF9fMTk1IHwgVF9fMTk2IHwgVF9fMTk3IHwgVF9fMTk4IHwgVF9fMTk5IHwgVF9fMjAwIHwgVF9fMjAxIHwgVF9fMjAyIHwgVF9fMjAzIHwgVF9fMjA0IHwgVF9fMjA1IHwgVF9fMjA2IHwgVF9fMjA3IHwgVF9fMjA4IHwgVF9fMjA5IHwgVF9fMjEwIHwgVF9fMjExIHwgVF9fMjEyIHwgVF9fMjEzIHwgVF9fMjE0IHwgVF9fMjE1IHwgVF9fMjE2IHwgVF9fMjE3IHwgVF9fMjE4IHwgVF9fMjE5IHwgVF9fMjIwIHwgVF9fMjIxIHwgVF9fMjIyIHwgVF9fMjIzIHwgVF9fMjI0IHwgVF9fMjI1IHwgVF9fMjI2IHwgVF9fMjI3IHwgVF9fMjI4IHwgVF9fMjI5IHwgVF9fMjMwIHwgVF9fMjMxIHwgVF9fMjMyIHwgVF9fMjMzIHwgVF9fMjM0IHwgVF9fMjM1IHwgVF9fMjM2IHwgVF9fMjM3IHwgVF9fMjM4IHwgVF9fMjM5IHwgVF9fMjQwIHwgVF9fMjQxIHwgVF9fMjQyIHwgVF9fMjQzIHwgVF9fMjQ0IHwgVF9fMjQ1IHwgVF9fMjQ2IHwgVF9fMjQ3IHwgVF9fMjQ4IHwgVF9fMjQ5IHwgVF9fMjUwIHwgVF9fMjUxIHwgVF9fMjUyIHwgVF9fMjUzIHwgVF9fMjU0IHwgVF9fMjU1IHwgVF9fMjU2IHwgVF9fMjU3IHwgVF9fMjU4IHwgVF9fMjU5IHwgVF9fMjYwIHwgVF9fMjYxIHwgVF9fMjYyIHwgVF9fMjYzIHwgVF9fMjY0IHwgVF9fMjY1IHwgVF9fMjY2IHwgVF9fMjY3IHwgVF9fMjY4IHwgVF9fMjY5IHwgVF9fMjcwIHwgVF9fMjcxIHwgVF9fMjcyIHwgVF9fMjczIHwgVF9fMjc0IHwgVF9fMjc1IHwgVF9fMjc2IHwgVF9fMjc3IHwgVF9fMjc4IHwgVF9fMjc5IHwgVF9fMjgwIHwgVF9fMjgxIHwgVF9fMjgyIHwgVF9fMjgzIHwgVF9fMjg0IHwgVF9fMjg1IHwgVF9fMjg2IHwgVF9fMjg3IHwgVF9fMjg4IHwgVF9fMjg5IHwgVF9fMjkwIHwgVF9fMjkxIHwgVF9fMjkyIHwgVF9fMjkzIHwgVF9fMjk0IHwgVF9fMjk1IHwgVF9fMjk2IHwgVF9fMjk3IHwgVF9fMjk4IHwgVF9fMjk5IHwgVF9fMzAwIHwgVF9fMzAxIHwgVF9fMzAyIHwgVF9fMzAzIHwgVF9fMzA0IHwgVF9fMzA1IHwgVF9fMzA2IHwgVF9fMzA3IHwgVF9fMzA4IHwgVF9fMzA5IHwgVF9fMzEwIHwgVF9fMzExIHwgVF9fMzEyIHwgVF9fMzEzIHwgVF9fMzE0IHwgVF9fMzE1IHwgVF9fMzE2IHwgVF9fMzE3IHwgVF9fMzE4IHwgVF9fMzE5IHwgVF9fMzIwIHwgVF9fMzIxIHwgVF9fMzIyIHwgVF9fMzIzIHwgVF9fMzI0IHwgVF9fMzI1IHwgVF9fMzI2IHwgVF9fMzI3IHwgVF9fMzI4IHwgVF9fMzI5IHwgVF9fMzMwIHwgVF9fMzMxIHwgVF9fMzMyIHwgVF9fMzMzIHwgVF9fMzM0IHwgVF9fMzM1IHwgVF9fMzM2IHwgVF9fMzM3IHwgVF9fMzM4IHwgVF9fMzM5IHwgVF9fMzQwIHwgVF9fMzQxIHwgVF9fMzQyIHwgVF9fMzQzIHwgVF9fMzQ0IHwgVF9fMzQ1IHwgVF9fMzQ2IHwgVF9fMzQ3IHwgVF9fMzQ4IHwgVF9fMzQ5IHwgVF9fMzUwIHwgVF9fMzUxIHwgVF9fMzUyIHwgVF9fMzUzIHwgVF9fMzU0IHwgVF9fMzU1IHwgVF9fMzU2IHwgVF9fMzU3IHwgVF9fMzU4IHwgVF9fMzU5IHwgVF9fMzYwIHwgVF9fMzYxIHwgVF9fMzYyIHwgVF9fMzYzIHwgVF9fMzY0IHwgVF9fMzY1IHwgVF9fMzY2IHwgVF9fMzY3IHwgVF9fMzY4IHwgVF9fMzY5IHwgVF9fMzcwIHwgVF9fMzcxIHwgVF9fMzcyIHwgVF9fMzczIHwgVF9fMzc0IHwgVF9fMzc1IHwgVF9fMzc2IHwgVF9fMzc3IHwgVF9fMzc4IHwgVF9fMzc5IHwgVF9fMzgwIHwgVF9fMzgxIHwgVF9fMzgyIHwgVF9fMzgzIHwgVF9fMzg0IHwgVF9fMzg1IHwgVF9fMzg2IHwgVF9fMzg3IHwgVF9fMzg4IHwgVF9fMzg5IHwgVF9fMzkwIHwgVF9fMzkxIHwgVF9fMzkyIHwgVF9fMzkzIHwgVF9fMzk0IHwgVF9fMzk1IHwgVF9fMzk2IHwgVF9fMzk3IHwgVF9fMzk4IHwgVF9fMzk5IHwgVF9fNDAwIHwgVF9fNDAxIHwgVF9fNDAyIHwgVF9fNDAzIHwgVF9fNDA0IHwgVF9fNDA1IHwgVF9fNDA2IHwgVF9fNDA3IHwgVF9fNDA4IHwgVF9fNDA5IHwgVF9fNDEwIHwgVF9fNDExIHwgVF9fNDEyIHwgVF9fNDEzIHwgVF9fNDE0IHwgVF9fNDE1IHwgVF9fNDE2IHwgVF9fNDE3IHwgT1BfQVRPTUlDX1NFUVVFTkNFIHwgT1BfU0VRVUVOQ0UgfCBPUF9TRVFVRU5DRV9TSURFIHwgT1BfU0VRVUVOQ0VfV0VBSyB8IE9QX1NDSEVEVUxFX0dUIHwgT1BfU0NIRURVTEVfTFQgfCBPUF9TQ0hFRFVMRV9YT1IgfCBPUF9TQ0hFRFVMRV9BTkRfVEhFTiB8IE9QX1NDSEVEVUxFX09SX0VMU0UgfCBPUF9OT05fREVURVJNSU5JU00gfCBPUF9DT05DVVJSRU5DWV9BU1lOQyB8IE9QX0NPTkNVUlJFTkNZX0FORCB8IE9QX0NPTkNVUlJFTkNZX09SIHwgT1BfQ09OQ1VSUkVOQ1lfSU5URVJMRUFWSU5HIHwgT1BfQ09OQ1VSUkVOQ1lfUEFSQUxMRUwgfCBPUF9GT1JLIHwgT1BfSk9JTiB8IE9QX0NPTkNVUlJFTkNZX1JEVl9BU1lOQyB8IE9QX0NPTkNVUlJFTkNZX1JEVl9BTkQgfCBPUF9DT05DVVJSRU5DWV9SRFZfT1IgfCBPUF9DT05DVVJSRU5DWV9SRFZfSU5URVJMRUFWSU5HIHwgT1BfQ09OQ1VSUkVOQ1lfUkRWX1BBUkFMTEVMIHwgQVNTSUdOIHwgQVNTSUdOX0FGVEVSIHwgQVNTSUdOX1JFRiB8IEFTU0lHTl9NQUNSTyB8IE9QX1BVU0ggfCBPUF9BU1NJR05fVE9QIHwgT1BfVE9QIHwgT1BfUE9QIHwgTFBBUkVOIHwgUlBBUkVOIHwgTENVUkxZIHwgUkNVUkxZIHwgTEJSQUNLRVQgfCBSQlJBQ0tFVCB8IExCUkFDS0VUX0VYQ0VQVCB8IExQQVJFTl9JTlZPS0UgfCBMQ1VSTFlfSU5WT0tFIHwgUEVSQ0VOVF9MUEFSRU5fSU5WT0tFIHwgUEVSQ0VOVF9MUEFSRU4gfCBSUEFSRU5fUEVSQ0VOVCB8IFNUQVRFTUVOVF9QUk9NUFQgfCBET0xMQVJfTENVUkxZIHwgUkNVUkxZX0RPTExBUiB8IFBFUkNFTlRfTENVUkxZIHwgUkNVUkxZX1BFUkNFTlQgfCBMQlJBQ0tFVF9CQVIgfCBCQVJfUkJSQUNLRVQgfCBMQlJBQ0tFVF9MQ1VSTFkgfCBSQ1VSTFlfUkJSQUNLRVQgfCBDT0xPTiB8IENPTU1BIHwgUVVFU1RJT04gfCBTRU1JIHwgRElFU0UgfCBET0xMQVIgfCBET1QgfCBET1RET1QgfCBDT0xPTngyIHwgTEFORCB8IExBTkRfVEhFTiB8IExBTkRfQVNTSUdOIHwgTEFORF9BU1NJR05fQUZURVIgfCBMTk9UIHwgTE9SIHwgTE9SX0VMU0UgfCBMT1JfQVNTSUdOIHwgTE9SX0FTU0lHTl9BRlRFUiB8IExYT1IgfCBFUVVBTCB8IE5FUVVBTCB8IFNFUVVBTCB8IE5TRVFVQUwgfCBMVEUgfCBMVF8gfCBHVEUgfCBHVCB8IFBMVVMgfCBQTFVTX0FTU0lHTiB8IFBMVVNfQVNTSUdOX0FGVEVSIHwgSU5DUiB8IE1JTlVTIHwgTUlOVVNfQVNTSUdOIHwgTUlOVVNfQVNTSUdOX0FGVEVSIHwgREVDUiB8IFNUQVIgfCBTVEFSX0FTU0lHTiB8IFNUQVJfQVNTSUdOX0FGVEVSIHwgRElWIHwgRElWX0FTU0lHTiB8IERJVl9BU1NJR05fQUZURVIgfCBNT0QgfCBNT0RfQVNTSUdOIHwgTU9EX0FTU0lHTl9BRlRFUiB8IFJTSElGVCB8IFJTSElGVF9BU1NJR04gfCBSU0hJRlRfQVNTSUdOX0FGVEVSIHwgTFNISUZUIHwgTFNISUZUX0FTU0lHTiB8IExTSElGVF9BU1NJR05fQUZURVIgfCBCQU5EIHwgQkFORF9BU1NJR04gfCBCQU5EX0FTU0lHTl9BRlRFUiB8IEJOT1QgfCBCT1IgfCBCT1JfQVNTSUdOIHwgQk9SX0FTU0lHTl9BRlRFUiB8IEJYT1IgfCBCWE9SX0FTU0lHTiB8IEJYT1JfQVNTSUdOX0FGVEVSIHwgSUQgfCBBVF9JRCB8IFN0cmluZ0xpdGVyYWwgfCBDaGFyTGl0ZXJhbCB8IE51bWJlckxpdGVyYWwgfCBDT01NRU5UIHwgV1MgKTsiLAorCSAgICAoQ0RGQV9TUEVDSUFMX0ZVTkMpIGFudGxyM2RmYXNwZWNpYWxTdGF0ZVRyYW5zaXRpb24sCS8qIERlZmF1bHQgc3BlY2lhbCBzdGF0ZSB0cmFuc2l0aW9uIGZ1bmN0aW9uCSovCisKKwkgICAgYW50bHIzZGZhc3BlY2lhbFRyYW5zaXRpb24sCQkvKiBERkEgc3BlY2lhbFRyYW5zaXRpb24gaXMgY3VycmVudGx5IGp1c3QgYSBkZWZhdWx0IGZ1bmN0aW9uIGluIHRoZSBydW50aW1lICovCisJICAgIGFudGxyM2RmYXByZWRpY3QsCQkJLyogREZBIHNpbXVsYXRvciBmdW5jdGlvbiBpcyBpbiB0aGUgcnVudGltZSAqLworCSAgICBkZmE1MF9lb3QsCSAgICAvKiBFT1QgdGFibGUJCQkgICAgKi8KKwkgICAgZGZhNTBfZW9mLAkgICAgLyogRU9GIHRhYmxlCQkJICAgICovCisJICAgIGRmYTUwX21pbiwJICAgIC8qIE1pbmltdW0gdG9rZW5zIGZvciBlYWNoIHN0YXRlICAgICovCisJICAgIGRmYTUwX21heCwJICAgIC8qIE1heGltdW0gdG9rZW5zIGZvciBlYWNoIHN0YXRlICAgICovCisJICAgIGRmYTUwX2FjY2VwdCwJLyogQWNjZXB0IHRhYmxlCQkJICAgICovCisJICAgIGRmYTUwX3NwZWNpYWwsCS8qIFNwZWNpYWwgdHJhbnNpdGlvbiBzdGF0ZXMJICAgICovCisJICAgIGRmYTUwX3RyYW5zaXRpb25zCS8qIFRhYmxlIG9mIHRyYW5zaXRpb24gdGFibGVzCSAgICAqLworCisJfTsKKy8qIEVuZCBvZiBDeWNsaWMgREZBIDUwCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLyAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEVuZCBvZiBERkEgdGFibGVzIGZvciB0aGUgbGV4ZXIKKyAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGdW5jdGlvbnMgdG8gbWF0Y2ggdGhlIGxleGVyIGdyYW1tYXIgZGVmaW5lZCB0b2tlbnMgZnJvbSB0aGUgaW5wdXQgc3RyZWFtCisgKi8KKworLy8gICBDb21lcyBmcm9tOiAxMTo4OiAoICcjZGhpc3RvcnknICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzE0NAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18xNDQKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMTQ0KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzE0NDsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTE6ODogKCAnI2RoaXN0b3J5JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTE6MTA6ICcjZGhpc3RvcnknCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzEpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18xNDRFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMTQ0RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMTQ0RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18xNDQKKworLy8gICBDb21lcyBmcm9tOiAxMjo4OiAoICcjZmluYWwnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzE0NQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18xNDUKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMTQ1KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzE0NTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTI6ODogKCAnI2ZpbmFsJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTI6MTA6ICcjZmluYWwnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzIpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18xNDVFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMTQ1RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMTQ1RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18xNDUKKworLy8gICBDb21lcyBmcm9tOiAxMzo4OiAoICcjaW5pdCcgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMTQ2CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzE0NgorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18xNDYocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMTQ2OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMzo4OiAoICcjaW5pdCcgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEzOjEwOiAnI2luaXQnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzMpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18xNDZFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMTQ2RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMTQ2RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18xNDYKKworLy8gICBDb21lcyBmcm9tOiAxNDo4OiAoICcjaW5pdGlhbCcgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMTQ3CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzE0NworICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18xNDcocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMTQ3OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNDo4OiAoICcjaW5pdGlhbCcgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE0OjEwOiAnI2luaXRpYWwnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzQpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18xNDdFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMTQ3RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMTQ3RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18xNDcKKworLy8gICBDb21lcyBmcm9tOiAxNTo4OiAoICcjcmV0dXJuJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18xNDgKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMTQ4CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzE0OChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18xNDg7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE1Ojg6ICggJyNyZXR1cm4nICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNToxMDogJyNyZXR1cm4nCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzUpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18xNDhFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMTQ4RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMTQ4RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18xNDgKKworLy8gICBDb21lcyBmcm9tOiAxNjo4OiAoICcjc2hpc3RvcnknICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzE0OQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18xNDkKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMTQ5KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzE0OTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTY6ODogKCAnI3NoaXN0b3J5JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTY6MTA6ICcjc2hpc3RvcnknCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzYpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18xNDlFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMTQ5RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMTQ5RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18xNDkKKworLy8gICBDb21lcyBmcm9tOiAxNzo4OiAoICcjc3RhcnQnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzE1MAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18xNTAKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMTUwKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzE1MDsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTc6ODogKCAnI3N0YXJ0JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTc6MTA6ICcjc3RhcnQnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzcpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18xNTBFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMTUwRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMTUwRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18xNTAKKworLy8gICBDb21lcyBmcm9tOiAxODo4OiAoICcjc3RmJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18xNTEKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMTUxCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzE1MShwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18xNTE7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE4Ojg6ICggJyNzdGYnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxODoxMDogJyNzdGYnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18xNTFFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMTUxRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMTUxRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18xNTEKKworLy8gICBDb21lcyBmcm9tOiAxOTo4OiAoICcjc3RzJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18xNTIKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMTUyCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzE1MihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18xNTI7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE5Ojg6ICggJyNzdHMnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOToxMDogJyNzdHMnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzkpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18xNTJFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMTUyRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMTUyRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18xNTIKKworLy8gICBDb21lcyBmcm9tOiAyMDo4OiAoICcjdGVybWluYWwnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzE1MworICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18xNTMKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMTUzKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzE1MzsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjA6ODogKCAnI3Rlcm1pbmFsJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjA6MTA6ICcjdGVybWluYWwnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzEwKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMTUzRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzE1M0V4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzE1M0V4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMTUzCisKKy8vICAgQ29tZXMgZnJvbTogMjE6ODogKCAnJDpjb21tZW50JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18xNTQKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMTU0CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzE1NChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18xNTQ7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIxOjg6ICggJyQ6Y29tbWVudCcgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIxOjEwOiAnJDpjb21tZW50JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8xMSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzE1NEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18xNTRFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18xNTRFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzE1NAorCisvLyAgIENvbWVzIGZyb206IDIyOjg6ICggJyQ6ZGVidWcnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzE1NQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18xNTUKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMTU1KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzE1NTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjI6ODogKCAnJDpkZWJ1ZycgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIyOjEwOiAnJDpkZWJ1ZycKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMTIpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18xNTVFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMTU1RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMTU1RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18xNTUKKworLy8gICBDb21lcyBmcm9tOiAyMzo4OiAoICckOmluZm9ybWFsJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18xNTYKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMTU2CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzE1NihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18xNTY7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIzOjg6ICggJyQ6aW5mb3JtYWwnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMzoxMDogJyQ6aW5mb3JtYWwnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzEzKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMTU2RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzE1NkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzE1NkV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMTU2CisKKy8vICAgQ29tZXMgZnJvbTogMjQ6ODogKCAnJDp0cmFjZScgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMTU3CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzE1NworICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18xNTcocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMTU3OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNDo4OiAoICckOnRyYWNlJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjQ6MTA6ICckOnRyYWNlJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8xNCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzE1N0V4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18xNTdFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18xNTdFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzE1NworCisvLyAgIENvbWVzIGZyb206IDI1Ojg6ICggJyRlbnYnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzE1OAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18xNTgKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMTU4KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzE1ODsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjU6ODogKCAnJGVudicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI1OjEwOiAnJGVudicKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMTUpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18xNThFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMTU4RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMTU4RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18xNTgKKworLy8gICBDb21lcyBmcm9tOiAyNjo4OiAoICckcGFyZW50JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18xNTkKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMTU5CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzE1OShwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18xNTk7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI2Ojg6ICggJyRwYXJlbnQnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNjoxMDogJyRwYXJlbnQnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzE2KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMTU5RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzE1OUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzE1OUV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMTU5CisKKy8vICAgQ29tZXMgZnJvbTogMjc6ODogKCAnJHNlbGYnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzE2MAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18xNjAKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMTYwKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzE2MDsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mjc6ODogKCAnJHNlbGYnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNzoxMDogJyRzZWxmJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8xNyk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzE2MEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18xNjBFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18xNjBFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzE2MAorCisvLyAgIENvbWVzIGZyb206IDI4Ojg6ICggJyRzdXBlcicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMTYxCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzE2MQorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18xNjEocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMTYxOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyODo4OiAoICckc3VwZXInICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyODoxMDogJyRzdXBlcicKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMTgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18xNjFFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMTYxRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMTYxRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18xNjEKKworLy8gICBDb21lcyBmcm9tOiAyOTo4OiAoICckdGhpcycgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMTYyCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzE2MgorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18xNjIocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMTYyOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyOTo4OiAoICckdGhpcycgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI5OjEwOiAnJHRoaXMnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzE5KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMTYyRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzE2MkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzE2MkV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMTYyCisKKy8vICAgQ29tZXMgZnJvbTogMzA6ODogKCAnLS0+JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18xNjMKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMTYzCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzE2MyhwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18xNjM7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMwOjg6ICggJy0tPicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMwOjEwOiAnLS0+JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8yMCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzE2M0V4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18xNjNFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18xNjNFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzE2MworCisvLyAgIENvbWVzIGZyb206IDMxOjg6ICggJy0+JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18xNjQKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMTY0CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzE2NChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18xNjQ7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMxOjg6ICggJy0+JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzE6MTA6ICctPicKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMjEpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18xNjRFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMTY0RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMTY0RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18xNjQKKworLy8gICBDb21lcyBmcm9tOiAzMjo4OiAoICc8LS0nICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzE2NQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18xNjUKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMTY1KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzE2NTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzI6ODogKCAnPC0tJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzI6MTA6ICc8LS0nCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzIyKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMTY1RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzE2NUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzE2NUV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMTY1CisKKy8vICAgQ29tZXMgZnJvbTogMzM6ODogKCAnPC0+JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18xNjYKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMTY2CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzE2NihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18xNjY7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMzOjg6ICggJzwtPicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMzOjEwOiAnPC0+JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8yMyk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzE2NkV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18xNjZFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18xNjZFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzE2NgorCisvLyAgIENvbWVzIGZyb206IDM0Ojg6ICggJzw9PScgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMTY3CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzE2NworICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18xNjcocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMTY3OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNDo4OiAoICc8PT0nICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNDoxMDogJzw9PScKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMjQpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18xNjdFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMTY3RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMTY3RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18xNjcKKworLy8gICBDb21lcyBmcm9tOiAzNTo4OiAoICc9PT4nICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzE2OAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18xNjgKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMTY4KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzE2ODsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzU6ODogKCAnPT0+JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzU6MTA6ICc9PT4nCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzI1KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMTY4RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzE2OEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzE2OEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMTY4CisKKy8vICAgQ29tZXMgZnJvbTogMzY6ODogKCAnQCcgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMTY5CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzE2OQorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18xNjkocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMTY5OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNjo4OiAoICdAJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzY6MTA6ICdAJworICAgIHsKKyAgICAgICAgTUFUQ0hDKCdAJyk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzE2OUV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzE2OUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzE2OUV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMTY5CisKKy8vICAgQ29tZXMgZnJvbTogMzc6ODogKCAnQGFib3J0JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18xNzAKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMTcwCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzE3MChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18xNzA7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM3Ojg6ICggJ0BhYm9ydCcgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM3OjEwOiAnQGFib3J0JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8yNik7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzE3MEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18xNzBFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18xNzBFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzE3MAorCisvLyAgIENvbWVzIGZyb206IDM4Ojg6ICggJ0BiZWhhdmlvcjonICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzE3MQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18xNzEKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMTcxKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzE3MTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mzg6ODogKCAnQGJlaGF2aW9yOicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM4OjEwOiAnQGJlaGF2aW9yOicKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMjcpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18xNzFFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMTcxRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMTcxRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18xNzEKKworLy8gICBDb21lcyBmcm9tOiAzOTo4OiAoICdAY29tOicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMTcyCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzE3MgorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18xNzIocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMTcyOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozOTo4OiAoICdAY29tOicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM5OjEwOiAnQGNvbTonCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzI4KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMTcyRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzE3MkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzE3MkV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMTcyCisKKy8vICAgQ29tZXMgZnJvbTogNDA6ODogKCAnQGNvbXBvc2l0ZScgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMTczCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzE3MworICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18xNzMocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMTczOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0MDo4OiAoICdAY29tcG9zaXRlJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDA6MTA6ICdAY29tcG9zaXRlJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8yOSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzE3M0V4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18xNzNFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18xNzNFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzE3MworCisvLyAgIENvbWVzIGZyb206IDQxOjg6ICggJ0Bjb21wb3NpdGU6JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18xNzQKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMTc0CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzE3NChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18xNzQ7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQxOjg6ICggJ0Bjb21wb3NpdGU6JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDE6MTA6ICdAY29tcG9zaXRlOicKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMzApOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18xNzRFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMTc0RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMTc0RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18xNzQKKworLy8gICBDb21lcyBmcm9tOiA0Mjo4OiAoICdAY29uY3VycmVuY3knICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzE3NQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18xNzUKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMTc1KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzE3NTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDI6ODogKCAnQGNvbmN1cnJlbmN5JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDI6MTA6ICdAY29uY3VycmVuY3knCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzMxKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMTc1RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzE3NUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzE3NUV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMTc1CisKKy8vICAgQ29tZXMgZnJvbTogNDM6ODogKCAnQGNvbnN0cmFpbnQnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzE3NgorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18xNzYKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMTc2KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzE3NjsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDM6ODogKCAnQGNvbnN0cmFpbnQnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0MzoxMDogJ0Bjb25zdHJhaW50JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8zMik7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzE3NkV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18xNzZFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18xNzZFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzE3NgorCisvLyAgIENvbWVzIGZyb206IDQ0Ojg6ICggJ0BjcmVhdGUnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzE3NworICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18xNzcKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMTc3KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzE3NzsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDQ6ODogKCAnQGNyZWF0ZScgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ0OjEwOiAnQGNyZWF0ZScKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMzMpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18xNzdFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMTc3RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMTc3RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18xNzcKKworLy8gICBDb21lcyBmcm9tOiA0NTo4OiAoICdAZGVjbGFyYXRpb246JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18xNzgKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMTc4CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzE3OChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18xNzg7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ1Ojg6ICggJ0BkZWNsYXJhdGlvbjonICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NToxMDogJ0BkZWNsYXJhdGlvbjonCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzM0KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMTc4RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzE3OEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzE3OEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMTc4CisKKy8vICAgQ29tZXMgZnJvbTogNDY6ODogKCAnQGRpc2FibGUnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzE3OQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18xNzkKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMTc5KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzE3OTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDY6ODogKCAnQGRpc2FibGUnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NjoxMDogJ0BkaXNhYmxlJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8zNSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzE3OUV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18xNzlFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18xNzlFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzE3OQorCisvLyAgIENvbWVzIGZyb206IDQ3Ojg6ICggJ0BkaXZlcnNpdHknICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzE4MAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18xODAKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMTgwKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzE4MDsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDc6ODogKCAnQGRpdmVyc2l0eScgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ3OjEwOiAnQGRpdmVyc2l0eScKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMzYpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18xODBFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMTgwRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMTgwRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18xODAKKworLy8gICBDb21lcyBmcm9tOiA0ODo4OiAoICdAZWZmZWN0OicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMTgxCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzE4MQorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18xODEocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMTgxOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0ODo4OiAoICdAZWZmZWN0OicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ4OjEwOiAnQGVmZmVjdDonCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzM3KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMTgxRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzE4MUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzE4MUV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMTgxCisKKy8vICAgQ29tZXMgZnJvbTogNDk6ODogKCAnQGVuYWJsZScgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMTgyCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzE4MgorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18xODIocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMTgyOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0OTo4OiAoICdAZW5hYmxlJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDk6MTA6ICdAZW5hYmxlJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8zOCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzE4MkV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18xODJFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18xODJFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzE4MgorCisvLyAgIENvbWVzIGZyb206IDUwOjg6ICggJ0BleGVjdXRhYmxlOicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMTgzCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzE4MworICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18xODMocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMTgzOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1MDo4OiAoICdAZXhlY3V0YWJsZTonICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1MDoxMDogJ0BleGVjdXRhYmxlOicKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMzkpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18xODNFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMTgzRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMTgzRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18xODMKKworLy8gICBDb21lcyBmcm9tOiA1MTo4OiAoICdAZmluYWwnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzE4NAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18xODQKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMTg0KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzE4NDsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTE6ODogKCAnQGZpbmFsJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTE6MTA6ICdAZmluYWwnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzQwKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMTg0RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzE4NEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzE4NEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMTg0CisKKy8vICAgQ29tZXMgZnJvbTogNTI6ODogKCAnQGZtbCcgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMTg1CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzE4NQorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18xODUocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMTg1OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1Mjo4OiAoICdAZm1sJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTI6MTA6ICdAZm1sJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF80MSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzE4NUV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18xODVFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18xODVFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzE4NQorCisvLyAgIENvbWVzIGZyb206IDUzOjg6ICggJ0Bmb3JtYWxtbCcgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMTg2CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzE4NgorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18xODYocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMTg2OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1Mzo4OiAoICdAZm9ybWFsbWwnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1MzoxMDogJ0Bmb3JtYWxtbCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfNDIpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18xODZFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMTg2RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMTg2RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18xODYKKworLy8gICBDb21lcyBmcm9tOiA1NDo4OiAoICdAZ3VhcmQ6JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18xODcKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMTg3CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzE4NyhwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18xODc7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU0Ojg6ICggJ0BndWFyZDonICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NDoxMDogJ0BndWFyZDonCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzQzKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMTg3RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzE4N0V4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzE4N0V4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMTg3CisKKy8vICAgQ29tZXMgZnJvbTogNTU6ODogKCAnQGhlYWRlcjonICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzE4OAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18xODgKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMTg4KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzE4ODsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTU6ODogKCAnQGhlYWRlcjonICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NToxMDogJ0BoZWFkZXI6JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF80NCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzE4OEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18xODhFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18xODhFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzE4OAorCisvLyAgIENvbWVzIGZyb206IDU2Ojg6ICggJ0BpYWJvcnQnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzE4OQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18xODkKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMTg5KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzE4OTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTY6ODogKCAnQGlhYm9ydCcgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU2OjEwOiAnQGlhYm9ydCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfNDUpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18xODlFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMTg5RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMTg5RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18xODkKKworLy8gICBDb21lcyBmcm9tOiA1Nzo4OiAoICdAaWRpc2FibGUnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzE5MAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18xOTAKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMTkwKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzE5MDsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTc6ODogKCAnQGlkaXNhYmxlJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTc6MTA6ICdAaWRpc2FibGUnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzQ2KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMTkwRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzE5MEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzE5MEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMTkwCisKKy8vICAgQ29tZXMgZnJvbTogNTg6ODogKCAnQGllbmFibGUnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzE5MQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18xOTEKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMTkxKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzE5MTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTg6ODogKCAnQGllbmFibGUnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1ODoxMDogJ0BpZW5hYmxlJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF80Nyk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzE5MUV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18xOTFFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18xOTFFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzE5MQorCisvLyAgIENvbWVzIGZyb206IDU5Ojg6ICggJ0BpbXBvcnQ6JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18xOTIKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMTkyCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzE5MihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18xOTI7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU5Ojg6ICggJ0BpbXBvcnQ6JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTk6MTA6ICdAaW1wb3J0OicKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfNDgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18xOTJFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMTkyRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMTkyRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18xOTIKKworLy8gICBDb21lcyBmcm9tOiA2MDo4OiAoICdAaW5jbHVkZScgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMTkzCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzE5MworICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18xOTMocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMTkzOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MDo4OiAoICdAaW5jbHVkZScgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYwOjEwOiAnQGluY2x1ZGUnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzQ5KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMTkzRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzE5M0V4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzE5M0V4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMTkzCisKKy8vICAgQ29tZXMgZnJvbTogNjE6ODogKCAnQGluaXQnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzE5NAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18xOTQKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMTk0KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzE5NDsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjE6ODogKCAnQGluaXQnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MToxMDogJ0Bpbml0JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF81MCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzE5NEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18xOTRFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18xOTRFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzE5NAorCisvLyAgIENvbWVzIGZyb206IDYyOjg6ICggJ0Bpbm91dDonICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzE5NQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18xOTUKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMTk1KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzE5NTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjI6ODogKCAnQGlub3V0OicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYyOjEwOiAnQGlub3V0OicKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfNTEpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18xOTVFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMTk1RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMTk1RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18xOTUKKworLy8gICBDb21lcyBmcm9tOiA2Mzo4OiAoICdAaW5wdXQ6JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18xOTYKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMTk2CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzE5NihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18xOTY7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYzOjg6ICggJ0BpbnB1dDonICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MzoxMDogJ0BpbnB1dDonCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzUyKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMTk2RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzE5NkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzE5NkV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMTk2CisKKy8vICAgQ29tZXMgZnJvbTogNjQ6ODogKCAnQGluc3RhbmNlOicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMTk3CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzE5NworICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18xOTcocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMTk3OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NDo4OiAoICdAaW5zdGFuY2U6JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjQ6MTA6ICdAaW5zdGFuY2U6JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF81Myk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzE5N0V4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18xOTdFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18xOTdFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzE5NworCisvLyAgIENvbWVzIGZyb206IDY1Ojg6ICggJ0BpbnRlcmFjdGlvbjonICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzE5OAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18xOTgKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMTk4KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzE5ODsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjU6ODogKCAnQGludGVyYWN0aW9uOicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY1OjEwOiAnQGludGVyYWN0aW9uOicKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfNTQpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18xOThFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMTk4RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMTk4RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18xOTgKKworLy8gICBDb21lcyBmcm9tOiA2Njo4OiAoICdAaXJ1bicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMTk5CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzE5OQorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18xOTkocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMTk5OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2Njo4OiAoICdAaXJ1bicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2OjEwOiAnQGlydW4nCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzU1KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMTk5RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzE5OUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzE5OUV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMTk5CisKKy8vICAgQ29tZXMgZnJvbTogNjc6ODogKCAnQG1hY2hpbmU6JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18yMDAKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMjAwCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzIwMChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18yMDA7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3Ojg6ICggJ0BtYWNoaW5lOicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3OjEwOiAnQG1hY2hpbmU6JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF81Nik7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzIwMEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18yMDBFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18yMDBFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzIwMAorCisvLyAgIENvbWVzIGZyb206IDY4Ojg6ICggJ0BtYWNybzonICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzIwMQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18yMDEKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMjAxKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzIwMTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Njg6ODogKCAnQG1hY3JvOicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4OjEwOiAnQG1hY3JvOicKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfNTcpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18yMDFFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMjAxRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMjAxRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18yMDEKKworLy8gICBDb21lcyBmcm9tOiA2OTo4OiAoICdAbW9jOicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMjAyCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzIwMgorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18yMDIocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMjAyOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2OTo4OiAoICdAbW9jOicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY5OjEwOiAnQG1vYzonCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzU4KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMjAyRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzIwMkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzIwMkV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMjAyCisKKy8vICAgQ29tZXMgZnJvbTogNzA6ODogKCAnQG1vZGVsOicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMjAzCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzIwMworICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18yMDMocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMjAzOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo3MDo4OiAoICdAbW9kZWw6JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NzA6MTA6ICdAbW9kZWw6JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF81OSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzIwM0V4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18yMDNFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18yMDNFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzIwMworCisvLyAgIENvbWVzIGZyb206IDcxOjg6ICggJ0Btb2U6JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18yMDQKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMjA0CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzIwNChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18yMDQ7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjcxOjg6ICggJ0Btb2U6JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NzE6MTA6ICdAbW9lOicKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfNjApOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18yMDRFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMjA0RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMjA0RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18yMDQKKworLy8gICBDb21lcyBmcm9tOiA3Mjo4OiAoICdAb25fd3JpdGUnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzIwNQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18yMDUKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMjA1KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzIwNTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NzI6ODogKCAnQG9uX3dyaXRlJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NzI6MTA6ICdAb25fd3JpdGUnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzYxKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMjA1RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzIwNUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzIwNUV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMjA1CisKKy8vICAgQ29tZXMgZnJvbTogNzM6ODogKCAnQG9wdGlvbnMnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzIwNgorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18yMDYKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMjA2KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzIwNjsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NzM6ODogKCAnQG9wdGlvbnMnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo3MzoxMDogJ0BvcHRpb25zJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF82Mik7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzIwNkV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18yMDZFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18yMDZFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzIwNgorCisvLyAgIENvbWVzIGZyb206IDc0Ojg6ICggJ0BvdXRwdXQ6JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18yMDcKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMjA3CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzIwNyhwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18yMDc7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjc0Ojg6ICggJ0BvdXRwdXQ6JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NzQ6MTA6ICdAb3V0cHV0OicKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfNjMpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18yMDdFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMjA3RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMjA3RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18yMDcKKworLy8gICBDb21lcyBmcm9tOiA3NTo4OiAoICdAcGFja2FnZScgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMjA4CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzIwOAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18yMDgocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMjA4OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo3NTo4OiAoICdAcGFja2FnZScgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjc1OjEwOiAnQHBhY2thZ2UnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzY0KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMjA4RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzIwOEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzIwOEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMjA4CisKKy8vICAgQ29tZXMgZnJvbTogNzY6ODogKCAnQHBhcmFtOicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMjA5CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzIwOQorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18yMDkocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMjA5OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo3Njo4OiAoICdAcGFyYW06JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NzY6MTA6ICdAcGFyYW06JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF82NSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzIwOUV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18yMDlFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18yMDlFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzIwOQorCisvLyAgIENvbWVzIGZyb206IDc3Ojg6ICggJ0BwYXJhbWV0ZXI6JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18yMTAKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMjEwCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzIxMChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18yMTA7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjc3Ojg6ICggJ0BwYXJhbWV0ZXI6JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Nzc6MTA6ICdAcGFyYW1ldGVyOicKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfNjYpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18yMTBFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMjEwRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMjEwRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18yMTAKKworLy8gICBDb21lcyBmcm9tOiA3ODo4OiAoICdAcHJpdmF0ZTonICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzIxMQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18yMTEKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMjExKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzIxMTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Nzg6ODogKCAnQHByaXZhdGU6JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Nzg6MTA6ICdAcHJpdmF0ZTonCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzY3KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMjExRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzIxMUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzIxMUV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMjExCisKKy8vICAgQ29tZXMgZnJvbTogNzk6ODogKCAnQHByb2NlZHVyZTonICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzIxMgorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18yMTIKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMjEyKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzIxMjsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Nzk6ODogKCAnQHByb2NlZHVyZTonICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo3OToxMDogJ0Bwcm9jZWR1cmU6JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF82OCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzIxMkV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18yMTJFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18yMTJFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzIxMgorCisvLyAgIENvbWVzIGZyb206IDgwOjg6ICggJ0Bwcm9wZXJ0eTonICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzIxMworICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18yMTMKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMjEzKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzIxMzsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6ODA6ODogKCAnQHByb3BlcnR5OicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjgwOjEwOiAnQHByb3BlcnR5OicKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfNjkpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18yMTNFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMjEzRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMjEzRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18yMTMKKworLy8gICBDb21lcyBmcm9tOiA4MTo4OiAoICdAcHJvdGVjdGVkOicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMjE0CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzIxNAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18yMTQocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMjE0OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo4MTo4OiAoICdAcHJvdGVjdGVkOicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjgxOjEwOiAnQHByb3RlY3RlZDonCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzcwKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMjE0RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzIxNEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzIxNEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMjE0CisKKy8vICAgQ29tZXMgZnJvbTogODI6ODogKCAnQHByb3RvdHlwZTonICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzIxNQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18yMTUKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMjE1KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzIxNTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6ODI6ODogKCAnQHByb3RvdHlwZTonICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo4MjoxMDogJ0Bwcm90b3R5cGU6JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF83MSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzIxNUV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18yMTVFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18yMTVFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzIxNQorCisvLyAgIENvbWVzIGZyb206IDgzOjg6ICggJ0BwdWJsaWM6JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18yMTYKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMjE2CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzIxNihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18yMTY7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjgzOjg6ICggJ0BwdWJsaWM6JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6ODM6MTA6ICdAcHVibGljOicKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfNzIpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18yMTZFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMjE2RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMjE2RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18yMTYKKworLy8gICBDb21lcyBmcm9tOiA4NDo4OiAoICdAcmVnaW9uOicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMjE3CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzIxNworICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18yMTcocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMjE3OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo4NDo4OiAoICdAcmVnaW9uOicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjg0OjEwOiAnQHJlZ2lvbjonCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzczKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMjE3RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzIxN0V4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzIxN0V4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMjE3CisKKy8vICAgQ29tZXMgZnJvbTogODU6ODogKCAnQHJldHVybicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMjE4CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzIxOAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18yMTgocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMjE4OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo4NTo4OiAoICdAcmV0dXJuJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6ODU6MTA6ICdAcmV0dXJuJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF83NCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzIxOEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18yMThFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18yMThFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzIxOAorCisvLyAgIENvbWVzIGZyb206IDg2Ojg6ICggJ0ByZXR1cm46JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18yMTkKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMjE5CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzIxOShwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18yMTk7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjg2Ojg6ICggJ0ByZXR1cm46JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6ODY6MTA6ICdAcmV0dXJuOicKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfNzUpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18yMTlFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMjE5RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMjE5RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18yMTkKKworLy8gICBDb21lcyBmcm9tOiA4Nzo4OiAoICdAcmV0dXJuczonICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzIyMAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18yMjAKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMjIwKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzIyMDsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6ODc6ODogKCAnQHJldHVybnM6JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6ODc6MTA6ICdAcmV0dXJuczonCisgICAgeworICAgICAgICBNQVRDSFMobGl0Xzc2KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMjIwRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzIyMEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzIyMEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMjIwCisKKy8vICAgQ29tZXMgZnJvbTogODg6ODogKCAnQHJvdXRpbmUnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzIyMQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18yMjEKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMjIxKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzIyMTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6ODg6ODogKCAnQHJvdXRpbmUnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo4ODoxMDogJ0Byb3V0aW5lJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF83Nyk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzIyMUV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18yMjFFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18yMjFFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzIyMQorCisvLyAgIENvbWVzIGZyb206IDg5Ojg6ICggJ0Byb3V0aW5lOicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMjIyCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzIyMgorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18yMjIocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMjIyOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo4OTo4OiAoICdAcm91dGluZTonICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo4OToxMDogJ0Byb3V0aW5lOicKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfNzgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18yMjJFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMjIyRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMjIyRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18yMjIKKworLy8gICBDb21lcyBmcm9tOiA5MDo4OiAoICdAcnRjJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18yMjMKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMjIzCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzIyMyhwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18yMjM7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjkwOjg6ICggJ0BydGMnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo5MDoxMDogJ0BydGMnCisgICAgeworICAgICAgICBNQVRDSFMobGl0Xzc5KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMjIzRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzIyM0V4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzIyM0V4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMjIzCisKKy8vICAgQ29tZXMgZnJvbTogOTE6ODogKCAnQHJ1bicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMjI0CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzIyNAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18yMjQocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMjI0OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo5MTo4OiAoICdAcnVuJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6OTE6MTA6ICdAcnVuJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF84MCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzIyNEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18yMjRFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18yMjRFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzIyNAorCisvLyAgIENvbWVzIGZyb206IDkyOjg6ICggJ0BzY2hlZHVsZScgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMjI1CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzIyNQorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18yMjUocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMjI1OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo5Mjo4OiAoICdAc2NoZWR1bGUnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo5MjoxMDogJ0BzY2hlZHVsZScKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfODEpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18yMjVFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMjI1RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMjI1RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18yMjUKKworLy8gICBDb21lcyBmcm9tOiA5Mzo4OiAoICdAc3RhcnQnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzIyNgorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18yMjYKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMjI2KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzIyNjsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6OTM6ODogKCAnQHN0YXJ0JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6OTM6MTA6ICdAc3RhcnQnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzgyKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMjI2RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzIyNkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzIyNkV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMjI2CisKKy8vICAgQ29tZXMgZnJvbTogOTQ6ODogKCAnQHN0YXRlbWFjaGluZTonICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzIyNworICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18yMjcKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMjI3KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzIyNzsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6OTQ6ODogKCAnQHN0YXRlbWFjaGluZTonICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo5NDoxMDogJ0BzdGF0ZW1hY2hpbmU6JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF84Myk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzIyN0V4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18yMjdFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18yMjdFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzIyNworCisvLyAgIENvbWVzIGZyb206IDk1Ojg6ICggJ0BzdG9wJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18yMjgKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMjI4CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzIyOChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18yMjg7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjk1Ojg6ICggJ0BzdG9wJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6OTU6MTA6ICdAc3RvcCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfODQpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18yMjhFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMjI4RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMjI4RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18yMjgKKworLy8gICBDb21lcyBmcm9tOiA5Njo4OiAoICdAc3lzdGVtJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18yMjkKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMjI5CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzIyOShwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18yMjk7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjk2Ojg6ICggJ0BzeXN0ZW0nICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo5NjoxMDogJ0BzeXN0ZW0nCisgICAgeworICAgICAgICBNQVRDSFMobGl0Xzg1KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMjI5RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzIyOUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzIyOUV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMjI5CisKKy8vICAgQ29tZXMgZnJvbTogOTc6ODogKCAnQHRndWFyZDonICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzIzMAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18yMzAKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMjMwKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzIzMDsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6OTc6ODogKCAnQHRndWFyZDonICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo5NzoxMDogJ0B0Z3VhcmQ6JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF84Nik7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzIzMEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18yMzBFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18yMzBFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzIzMAorCisvLyAgIENvbWVzIGZyb206IDk4Ojg6ICggJ0B0cmFuc2l0aW9uOicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMjMxCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzIzMQorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18yMzEocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMjMxOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo5ODo4OiAoICdAdHJhbnNpdGlvbjonICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo5ODoxMDogJ0B0cmFuc2l0aW9uOicKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfODcpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18yMzFFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMjMxRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMjMxRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18yMzEKKworLy8gICBDb21lcyBmcm9tOiA5OTo4OiAoICdAdHJpZ2dlcjonICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzIzMgorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18yMzIKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMjMyKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzIzMjsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6OTk6ODogKCAnQHRyaWdnZXI6JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6OTk6MTA6ICdAdHJpZ2dlcjonCisgICAgeworICAgICAgICBNQVRDSFMobGl0Xzg4KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMjMyRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzIzMkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzIzMkV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMjMyCisKKy8vICAgQ29tZXMgZnJvbTogMTAwOjg6ICggJ0B4Zm1sJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18yMzMKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMjMzCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzIzMyhwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18yMzM7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEwMDo4OiAoICdAeGZtbCcgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEwMDoxMDogJ0B4Zm1sJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF84OSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzIzM0V4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18yMzNFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18yMzNFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzIzMworCisvLyAgIENvbWVzIGZyb206IDEwMTo4OiAoICdAeGZzcCcgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMjM0CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzIzNAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18yMzQocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMjM0OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMDE6ODogKCAnQHhmc3AnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMDE6MTA6ICdAeGZzcCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfOTApOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18yMzRFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMjM0RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMjM0RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18yMzQKKworLy8gICBDb21lcyBmcm9tOiAxMDI6ODogKCAnQHhsaWEnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzIzNQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18yMzUKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMjM1KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzIzNTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTAyOjg6ICggJ0B4bGlhJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTAyOjEwOiAnQHhsaWEnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzkxKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMjM1RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzIzNUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzIzNUV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMjM1CisKKy8vICAgQ29tZXMgZnJvbTogMTAzOjg6ICggJ2Fib3J0JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18yMzYKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMjM2CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzIzNihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18yMzY7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEwMzo4OiAoICdhYm9ydCcgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEwMzoxMDogJ2Fib3J0JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF85Mik7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzIzNkV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18yMzZFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18yMzZFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzIzNgorCisvLyAgIENvbWVzIGZyb206IDEwNDo4OiAoICdhYnNlbnQnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzIzNworICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18yMzcKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMjM3KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzIzNzsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTA0Ojg6ICggJ2Fic2VudCcgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEwNDoxMDogJ2Fic2VudCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfOTMpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18yMzdFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMjM3RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMjM3RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18yMzcKKworLy8gICBDb21lcyBmcm9tOiAxMDU6ODogKCAnYWN0aXZpdHk6JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18yMzgKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMjM4CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzIzOChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18yMzg7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEwNTo4OiAoICdhY3Rpdml0eTonICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMDU6MTA6ICdhY3Rpdml0eTonCisgICAgeworICAgICAgICBNQVRDSFMobGl0Xzk0KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMjM4RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzIzOEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzIzOEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMjM4CisKKy8vICAgQ29tZXMgZnJvbTogMTA2Ojg6ICggJ2FuZCcgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMjM5CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzIzOQorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18yMzkocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMjM5OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMDY6ODogKCAnYW5kJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTA2OjEwOiAnYW5kJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF85NSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzIzOUV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18yMzlFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18yMzlFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzIzOQorCisvLyAgIENvbWVzIGZyb206IDEwNzo4OiAoICdhbnljYXN0JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18yNDAKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMjQwCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzI0MChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18yNDA7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEwNzo4OiAoICdhbnljYXN0JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTA3OjEwOiAnYW55Y2FzdCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfOTYpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18yNDBFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMjQwRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMjQwRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18yNDAKKworLy8gICBDb21lcyBmcm9tOiAxMDg6ODogKCAnYXJyYXknICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzI0MQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18yNDEKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMjQxKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzI0MTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTA4Ojg6ICggJ2FycmF5JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTA4OjEwOiAnYXJyYXknCisgICAgeworICAgICAgICBNQVRDSFMobGl0Xzk3KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMjQxRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzI0MUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzI0MUV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMjQxCisKKy8vICAgQ29tZXMgZnJvbTogMTA5Ojg6ICggJ2F2bWNvZGUnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzI0MgorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18yNDIKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMjQyKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzI0MjsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTA5Ojg6ICggJ2F2bWNvZGUnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMDk6MTA6ICdhdm1jb2RlJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF85OCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzI0MkV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18yNDJFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18yNDJFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzI0MgorCisvLyAgIENvbWVzIGZyb206IDExMDo4OiAoICdiaW5kJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18yNDMKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMjQzCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzI0MyhwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18yNDM7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjExMDo4OiAoICdiaW5kJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTEwOjEwOiAnYmluZCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfOTkpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18yNDNFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMjQzRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMjQzRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18yNDMKKworLy8gICBDb21lcyBmcm9tOiAxMTE6ODogKCAnYmluZDonICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzI0NAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18yNDQKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMjQ0KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzI0NDsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTExOjg6ICggJ2JpbmQ6JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTExOjEwOiAnYmluZDonCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzEwMCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzI0NEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18yNDRFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18yNDRFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzI0NAorCisvLyAgIENvbWVzIGZyb206IDExMjo4OiAoICdib29sJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18yNDUKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMjQ1CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzI0NShwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18yNDU7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjExMjo4OiAoICdib29sJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTEyOjEwOiAnYm9vbCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMTAxKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMjQ1RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzI0NUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzI0NUV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMjQ1CisKKy8vICAgQ29tZXMgZnJvbTogMTEzOjg6ICggJ2Jvb2xlYW4nICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzI0NgorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18yNDYKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMjQ2KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzI0NjsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTEzOjg6ICggJ2Jvb2xlYW4nICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMTM6MTA6ICdib29sZWFuJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8xMDIpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18yNDZFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMjQ2RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMjQ2RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18yNDYKKworLy8gICBDb21lcyBmcm9tOiAxMTQ6ODogKCAnYnJlYWsnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzI0NworICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18yNDcKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMjQ3KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzI0NzsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTE0Ojg6ICggJ2JyZWFrJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTE0OjEwOiAnYnJlYWsnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzEwMyk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzI0N0V4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18yNDdFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18yNDdFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzI0NworCisvLyAgIENvbWVzIGZyb206IDExNTo4OiAoICdicm9hZGNhc3QnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzI0OAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18yNDgKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMjQ4KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzI0ODsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTE1Ojg6ICggJ2Jyb2FkY2FzdCcgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjExNToxMDogJ2Jyb2FkY2FzdCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMTA0KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMjQ4RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzI0OEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzI0OEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMjQ4CisKKy8vICAgQ29tZXMgZnJvbTogMTE2Ojg6ICggJ2J1ZmZlcicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMjQ5CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzI0OQorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18yNDkocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMjQ5OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMTY6ODogKCAnYnVmZmVyJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTE2OjEwOiAnYnVmZmVyJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8xMDUpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18yNDlFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMjQ5RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMjQ5RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18yNDkKKworLy8gICBDb21lcyBmcm9tOiAxMTc6ODogKCAnY2FsbCcgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMjUwCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzI1MAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18yNTAocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMjUwOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMTc6ODogKCAnY2FsbCcgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjExNzoxMDogJ2NhbGwnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzEwNik7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzI1MEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18yNTBFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18yNTBFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzI1MAorCisvLyAgIENvbWVzIGZyb206IDExODo4OiAoICdjaGFuZ2VkI3RvJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18yNTEKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMjUxCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzI1MShwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18yNTE7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjExODo4OiAoICdjaGFuZ2VkI3RvJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTE4OjEwOiAnY2hhbmdlZCN0bycKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMTA3KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMjUxRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzI1MUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzI1MUV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMjUxCisKKy8vICAgQ29tZXMgZnJvbTogMTE5Ojg6ICggJ2NoYW5nZWQnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzI1MgorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18yNTIKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMjUyKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzI1MjsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTE5Ojg6ICggJ2NoYW5nZWQnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMTk6MTA6ICdjaGFuZ2VkJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8xMDgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18yNTJFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMjUyRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMjUyRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18yNTIKKworLy8gICBDb21lcyBmcm9tOiAxMjA6ODogKCAnY2hhbm5lbCcgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMjUzCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzI1MworICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18yNTMocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMjUzOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMjA6ODogKCAnY2hhbm5lbCcgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEyMDoxMDogJ2NoYW5uZWwnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzEwOSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzI1M0V4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18yNTNFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18yNTNFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzI1MworCisvLyAgIENvbWVzIGZyb206IDEyMTo4OiAoICdjaGFyJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18yNTQKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMjU0CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzI1NChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18yNTQ7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEyMTo4OiAoICdjaGFyJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTIxOjEwOiAnY2hhcicKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMTEwKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMjU0RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzI1NEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzI1NEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMjU0CisKKy8vICAgQ29tZXMgZnJvbTogMTIyOjg6ICggJ2NoYXJhY3RlcicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMjU1CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzI1NQorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18yNTUocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMjU1OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMjI6ODogKCAnY2hhcmFjdGVyJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTIyOjEwOiAnY2hhcmFjdGVyJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8xMTEpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18yNTVFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMjU1RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMjU1RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18yNTUKKworLy8gICBDb21lcyBmcm9tOiAxMjM6ODogKCAnY2hlY2tzYXQnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzI1NgorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18yNTYKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMjU2KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzI1NjsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTIzOjg6ICggJ2NoZWNrc2F0JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTIzOjEwOiAnY2hlY2tzYXQnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzExMik7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzI1NkV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18yNTZFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18yNTZFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzI1NgorCisvLyAgIENvbWVzIGZyb206IDEyNDo4OiAoICdjaG9pY2UnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzI1NworICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18yNTcKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMjU3KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzI1NzsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTI0Ojg6ICggJ2Nob2ljZScgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEyNDoxMDogJ2Nob2ljZScKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMTEzKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMjU3RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzI1N0V4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzI1N0V4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMjU3CisKKy8vICAgQ29tZXMgZnJvbTogMTI1Ojg6ICggJ2NsYXNzJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18yNTgKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMjU4CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzI1OChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18yNTg7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEyNTo4OiAoICdjbGFzcycgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEyNToxMDogJ2NsYXNzJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8xMTQpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18yNThFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMjU4RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMjU4RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18yNTgKKworLy8gICBDb21lcyBmcm9tOiAxMjY6ODogKCAnY2xvY2snICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzI1OQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18yNTkKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMjU5KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzI1OTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTI2Ojg6ICggJ2Nsb2NrJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTI2OjEwOiAnY2xvY2snCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzExNSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzI1OUV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18yNTlFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18yNTlFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzI1OQorCisvLyAgIENvbWVzIGZyb206IDEyNzo4OiAoICdjb25uZWN0JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18yNjAKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMjYwCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzI2MChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18yNjA7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEyNzo4OiAoICdjb25uZWN0JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTI3OjEwOiAnY29ubmVjdCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMTE2KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMjYwRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzI2MEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzI2MEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMjYwCisKKy8vICAgQ29tZXMgZnJvbTogMTI4Ojg6ICggJ2Nvbm5lY3RvcicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMjYxCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzI2MQorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18yNjEocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMjYxOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMjg6ODogKCAnY29ubmVjdG9yJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTI4OjEwOiAnY29ubmVjdG9yJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8xMTcpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18yNjFFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMjYxRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMjYxRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18yNjEKKworLy8gICBDb21lcyBmcm9tOiAxMjk6ODogKCAnY29uc3QnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzI2MgorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18yNjIKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMjYyKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzI2MjsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTI5Ojg6ICggJ2NvbnN0JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTI5OjEwOiAnY29uc3QnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzExOCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzI2MkV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18yNjJFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18yNjJFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzI2MgorCisvLyAgIENvbWVzIGZyb206IDEzMDo4OiAoICdjb250aW51ZScgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMjYzCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzI2MworICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18yNjMocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMjYzOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMzA6ODogKCAnY29udGludWUnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMzA6MTA6ICdjb250aW51ZScKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMTE5KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMjYzRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzI2M0V4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzI2M0V4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMjYzCisKKy8vICAgQ29tZXMgZnJvbTogMTMxOjg6ICggJ2N0aW1lJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18yNjQKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMjY0CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzI2NChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18yNjQ7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEzMTo4OiAoICdjdGltZScgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEzMToxMDogJ2N0aW1lJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8xMjApOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18yNjRFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMjY0RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMjY0RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18yNjQKKworLy8gICBDb21lcyBmcm9tOiAxMzI6ODogKCAnY3RvcicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMjY1CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzI2NQorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18yNjUocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMjY1OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMzI6ODogKCAnY3RvcicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEzMjoxMDogJ2N0b3InCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzEyMSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzI2NUV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18yNjVFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18yNjVFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzI2NQorCisvLyAgIENvbWVzIGZyb206IDEzMzo4OiAoICdjdHg6JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18yNjYKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMjY2CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzI2NihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18yNjY7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEzMzo4OiAoICdjdHg6JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTMzOjEwOiAnY3R4OicKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMTIyKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMjY2RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzI2NkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzI2NkV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMjY2CisKKy8vICAgQ29tZXMgZnJvbTogMTM0Ojg6ICggJ2Rlc3Ryb3knICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzI2NworICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18yNjcKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMjY3KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzI2NzsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTM0Ojg6ICggJ2Rlc3Ryb3knICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMzQ6MTA6ICdkZXN0cm95JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8xMjMpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18yNjdFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMjY3RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMjY3RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18yNjcKKworLy8gICBDb21lcyBmcm9tOiAxMzU6ODogKCAnZGlzYWJsZScgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMjY4CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzI2OAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18yNjgocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMjY4OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMzU6ODogKCAnZGlzYWJsZScgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEzNToxMDogJ2Rpc2FibGUnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzEyNCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzI2OEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18yNjhFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18yNjhFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzI2OAorCisvLyAgIENvbWVzIGZyb206IDEzNjo4OiAoICdkbycgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMjY5CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzI2OQorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18yNjkocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMjY5OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMzY6ODogKCAnZG8nICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMzY6MTA6ICdkbycKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMTI1KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMjY5RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzI2OUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzI2OUV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMjY5CisKKy8vICAgQ29tZXMgZnJvbTogMTM3Ojg6ICggJ2RvdWJsZScgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMjcwCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzI3MAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18yNzAocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMjcwOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMzc6ODogKCAnZG91YmxlJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTM3OjEwOiAnZG91YmxlJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8xMjYpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18yNzBFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMjcwRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMjcwRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18yNzAKKworLy8gICBDb21lcyBmcm9tOiAxMzg6ODogKCAnZHRpbWUnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzI3MQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18yNzEKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMjcxKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzI3MTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTM4Ojg6ICggJ2R0aW1lJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTM4OjEwOiAnZHRpbWUnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzEyNyk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzI3MUV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18yNzFFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18yNzFFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzI3MQorCisvLyAgIENvbWVzIGZyb206IDEzOTo4OiAoICdkeW5hbWljJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18yNzIKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMjcyCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzI3MihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18yNzI7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEzOTo4OiAoICdkeW5hbWljJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTM5OjEwOiAnZHluYW1pYycKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMTI4KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMjcyRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzI3MkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzI3MkV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMjcyCisKKy8vICAgQ29tZXMgZnJvbTogMTQwOjg6ICggJ2Vsc2UnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzI3MworICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18yNzMKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMjczKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzI3MzsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTQwOjg6ICggJ2Vsc2UnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNDA6MTA6ICdlbHNlJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8xMjkpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18yNzNFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMjczRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMjczRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18yNzMKKworLy8gICBDb21lcyBmcm9tOiAxNDE6ODogKCAnZWxzZWlmJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18yNzQKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMjc0CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzI3NChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18yNzQ7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE0MTo4OiAoICdlbHNlaWYnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNDE6MTA6ICdlbHNlaWYnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzEzMCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzI3NEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18yNzRFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18yNzRFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzI3NAorCisvLyAgIENvbWVzIGZyb206IDE0Mjo4OiAoICdlbmFibGUnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzI3NQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18yNzUKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMjc1KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzI3NTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTQyOjg6ICggJ2VuYWJsZScgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE0MjoxMDogJ2VuYWJsZScKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMTMxKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMjc1RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzI3NUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzI3NUV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMjc1CisKKy8vICAgQ29tZXMgZnJvbTogMTQzOjg6ICggJ2VudW0nICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzI3NgorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18yNzYKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMjc2KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzI3NjsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTQzOjg6ICggJ2VudW0nICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNDM6MTA6ICdlbnVtJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8xMzIpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18yNzZFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMjc2RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMjc2RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18yNzYKKworLy8gICBDb21lcyBmcm9tOiAxNDQ6ODogKCAnZW52JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18yNzcKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMjc3CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzI3NyhwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18yNzc7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE0NDo4OiAoICdlbnYnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNDQ6MTA6ICdlbnYnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzEzMyk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzI3N0V4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18yNzdFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18yNzdFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzI3NworCisvLyAgIENvbWVzIGZyb206IDE0NTo4OiAoICdldmVudCcgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMjc4CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzI3OAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18yNzgocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMjc4OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNDU6ODogKCAnZXZlbnQnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNDU6MTA6ICdldmVudCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMTM0KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMjc4RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzI3OEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzI3OEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMjc4CisKKy8vICAgQ29tZXMgZnJvbTogMTQ2Ojg6ICggJ2V4aXQnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzI3OQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18yNzkKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMjc5KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzI3OTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTQ2Ojg6ICggJ2V4aXQnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNDY6MTA6ICdleGl0JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8xMzUpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18yNzlFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMjc5RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMjc5RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18yNzkKKworLy8gICBDb21lcyBmcm9tOiAxNDc6ODogKCAnZmFsc2UnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzI4MAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18yODAKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMjgwKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzI4MDsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTQ3Ojg6ICggJ2ZhbHNlJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTQ3OjEwOiAnZmFsc2UnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzEzNik7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzI4MEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18yODBFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18yODBFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzI4MAorCisvLyAgIENvbWVzIGZyb206IDE0ODo4OiAoICdmaWZvJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18yODEKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMjgxCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzI4MShwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18yODE7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE0ODo4OiAoICdmaWZvJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTQ4OjEwOiAnZmlmbycKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMTM3KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMjgxRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzI4MUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzI4MUV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMjgxCisKKy8vICAgQ29tZXMgZnJvbTogMTQ5Ojg6ICggJ2ZpbmFsJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18yODIKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMjgyCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzI4MihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18yODI7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE0OTo4OiAoICdmaW5hbCcgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE0OToxMDogJ2ZpbmFsJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8xMzgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18yODJFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMjgyRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMjgyRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18yODIKKworLy8gICBDb21lcyBmcm9tOiAxNTA6ODogKCAnZmxvYXQnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzI4MworICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18yODMKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMjgzKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzI4MzsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTUwOjg6ICggJ2Zsb2F0JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTUwOjEwOiAnZmxvYXQnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzEzOSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzI4M0V4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18yODNFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18yODNFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzI4MworCisvLyAgIENvbWVzIGZyb206IDE1MTo4OiAoICdmbG93JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18yODQKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMjg0CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzI4NChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18yODQ7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE1MTo4OiAoICdmbG93JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTUxOjEwOiAnZmxvdycKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMTQwKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMjg0RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzI4NEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzI4NEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMjg0CisKKy8vICAgQ29tZXMgZnJvbTogMTUyOjg6ICggJ2ZvcicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMjg1CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzI4NQorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18yODUocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMjg1OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNTI6ODogKCAnZm9yJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTUyOjEwOiAnZm9yJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8xNDEpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18yODVFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMjg1RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMjg1RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18yODUKKworLy8gICBDb21lcyBmcm9tOiAxNTM6ODogKCAnZm9yaycgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMjg2CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzI4NgorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18yODYocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMjg2OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNTM6ODogKCAnZm9yaycgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE1MzoxMDogJ2ZvcmsnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzE0Mik7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzI4NkV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18yODZFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18yODZFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzI4NgorCisvLyAgIENvbWVzIGZyb206IDE1NDo4OiAoICdmcm9tOicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMjg3CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzI4NworICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18yODcocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMjg3OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNTQ6ODogKCAnZnJvbTonICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNTQ6MTA6ICdmcm9tOicKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMTQzKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMjg3RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzI4N0V4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzI4N0V4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMjg3CisKKy8vICAgQ29tZXMgZnJvbTogMTU1Ojg6ICggJ2Z1bicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMjg4CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzI4OAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18yODgocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMjg4OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNTU6ODogKCAnZnVuJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTU1OjEwOiAnZnVuJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8xNDQpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18yODhFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMjg4RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMjg4RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18yODgKKworLy8gICBDb21lcyBmcm9tOiAxNTY6ODogKCAnZ290bycgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMjg5CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzI4OQorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18yODkocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMjg5OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNTY6ODogKCAnZ290bycgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE1NjoxMDogJ2dvdG8nCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzE0NSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzI4OUV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18yODlFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18yODlFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzI4OQorCisvLyAgIENvbWVzIGZyb206IDE1Nzo4OiAoICdndWFyZCcgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMjkwCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzI5MAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18yOTAocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMjkwOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNTc6ODogKCAnZ3VhcmQnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNTc6MTA6ICdndWFyZCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMTQ2KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMjkwRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzI5MEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzI5MEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMjkwCisKKy8vICAgQ29tZXMgZnJvbTogMTU4Ojg6ICggJ2lhYm9ydCcgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMjkxCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzI5MQorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18yOTEocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMjkxOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNTg6ODogKCAnaWFib3J0JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTU4OjEwOiAnaWFib3J0JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8xNDcpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18yOTFFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMjkxRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMjkxRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18yOTEKKworLy8gICBDb21lcyBmcm9tOiAxNTk6ODogKCAnaWRpc2FibGUnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzI5MgorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18yOTIKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMjkyKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzI5MjsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTU5Ojg6ICggJ2lkaXNhYmxlJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTU5OjEwOiAnaWRpc2FibGUnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzE0OCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzI5MkV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18yOTJFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18yOTJFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzI5MgorCisvLyAgIENvbWVzIGZyb206IDE2MDo4OiAoICdpZW5hYmxlJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18yOTMKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMjkzCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzI5MyhwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18yOTM7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE2MDo4OiAoICdpZW5hYmxlJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTYwOjEwOiAnaWVuYWJsZScKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMTQ5KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMjkzRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzI5M0V4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzI5M0V4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMjkzCisKKy8vICAgQ29tZXMgZnJvbTogMTYxOjg6ICggJ2lmJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18yOTQKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMjk0CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzI5NChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18yOTQ7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE2MTo4OiAoICdpZicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE2MToxMDogJ2lmJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8xNTApOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18yOTRFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMjk0RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMjk0RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18yOTQKKworLy8gICBDb21lcyBmcm9tOiAxNjI6ODogKCAnaW4nICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzI5NQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18yOTUKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMjk1KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzI5NTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTYyOjg6ICggJ2luJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTYyOjEwOiAnaW4nCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzE1MSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzI5NUV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18yOTVFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18yOTVFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzI5NQorCisvLyAgIENvbWVzIGZyb206IDE2Mzo4OiAoICdpbml0JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18yOTYKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMjk2CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzI5NihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18yOTY7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE2Mzo4OiAoICdpbml0JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTYzOjEwOiAnaW5pdCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMTUyKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMjk2RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzI5NkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzI5NkV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMjk2CisKKy8vICAgQ29tZXMgZnJvbTogMTY0Ojg6ICggJ2luaXQ6JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18yOTcKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMjk3CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzI5NyhwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18yOTc7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE2NDo4OiAoICdpbml0OicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE2NDoxMDogJ2luaXQ6JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8xNTMpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18yOTdFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMjk3RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMjk3RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18yOTcKKworLy8gICBDb21lcyBmcm9tOiAxNjU6ODogKCAnaW5vdXQnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzI5OAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18yOTgKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMjk4KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzI5ODsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTY1Ojg6ICggJ2lub3V0JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTY1OjEwOiAnaW5vdXQnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzE1NCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzI5OEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18yOThFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18yOThFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzI5OAorCisvLyAgIENvbWVzIGZyb206IDE2Njo4OiAoICdpbnB1dCNidWZmZXInICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzI5OQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18yOTkKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMjk5KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzI5OTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTY2Ojg6ICggJ2lucHV0I2J1ZmZlcicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE2NjoxMDogJ2lucHV0I2J1ZmZlcicKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMTU1KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMjk5RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzI5OUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzI5OUV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMjk5CisKKy8vICAgQ29tZXMgZnJvbTogMTY3Ojg6ICggJ2lucHV0I2VudicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMzAwCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzMwMAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18zMDAocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMzAwOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNjc6ODogKCAnaW5wdXQjZW52JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTY3OjEwOiAnaW5wdXQjZW52JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8xNTYpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18zMDBFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMzAwRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMzAwRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18zMDAKKworLy8gICBDb21lcyBmcm9tOiAxNjg6ODogKCAnaW5wdXQjZmxvdycgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMzAxCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzMwMQorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18zMDEocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMzAxOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNjg6ODogKCAnaW5wdXQjZmxvdycgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE2ODoxMDogJ2lucHV0I2Zsb3cnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzE1Nyk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzMwMUV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18zMDFFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18zMDFFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzMwMQorCisvLyAgIENvbWVzIGZyb206IDE2OTo4OiAoICdpbnB1dCNyZHYnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzMwMgorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18zMDIKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMzAyKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzMwMjsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTY5Ojg6ICggJ2lucHV0I3JkdicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE2OToxMDogJ2lucHV0I3JkdicKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMTU4KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMzAyRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzMwMkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzMwMkV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMzAyCisKKy8vICAgQ29tZXMgZnJvbTogMTcwOjg6ICggJ2lucHV0I3NhdmUnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzMwMworICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18zMDMKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMzAzKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzMwMzsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTcwOjg6ICggJ2lucHV0I3NhdmUnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNzA6MTA6ICdpbnB1dCNzYXZlJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8xNTkpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18zMDNFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMzAzRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMzAzRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18zMDMKKworLy8gICBDb21lcyBmcm9tOiAxNzE6ODogKCAnaW5wdXQjdmFyJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18zMDQKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMzA0CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzMwNChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18zMDQ7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE3MTo4OiAoICdpbnB1dCN2YXInICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNzE6MTA6ICdpbnB1dCN2YXInCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzE2MCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzMwNEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18zMDRFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18zMDRFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzMwNAorCisvLyAgIENvbWVzIGZyb206IDE3Mjo4OiAoICdpbnB1dCcgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMzA1CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzMwNQorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18zMDUocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMzA1OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNzI6ODogKCAnaW5wdXQnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNzI6MTA6ICdpbnB1dCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMTYxKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMzA1RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzMwNUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzMwNUV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMzA1CisKKy8vICAgQ29tZXMgZnJvbTogMTczOjg6ICggJ2lucHV0X2VuYWJsZWQnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzMwNgorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18zMDYKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMzA2KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzMwNjsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTczOjg6ICggJ2lucHV0X2VuYWJsZWQnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNzM6MTA6ICdpbnB1dF9lbmFibGVkJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8xNjIpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18zMDZFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMzA2RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMzA2RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18zMDYKKworLy8gICBDb21lcyBmcm9tOiAxNzQ6ODogKCAnaW5zdGFuY2UnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzMwNworICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18zMDcKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMzA3KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzMwNzsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTc0Ojg6ICggJ2luc3RhbmNlJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTc0OjEwOiAnaW5zdGFuY2UnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzE2Myk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzMwN0V4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18zMDdFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18zMDdFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzMwNworCisvLyAgIENvbWVzIGZyb206IDE3NTo4OiAoICdpbnN0YW5jZTonICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzMwOAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18zMDgKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMzA4KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzMwODsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTc1Ojg6ICggJ2luc3RhbmNlOicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE3NToxMDogJ2luc3RhbmNlOicKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMTY0KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMzA4RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzMwOEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzMwOEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMzA4CisKKy8vICAgQ29tZXMgZnJvbTogMTc2Ojg6ICggJ2ludCcgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMzA5CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzMwOQorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18zMDkocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMzA5OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNzY6ODogKCAnaW50JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTc2OjEwOiAnaW50JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8xNjUpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18zMDlFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMzA5RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMzA5RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18zMDkKKworLy8gICBDb21lcyBmcm9tOiAxNzc6ODogKCAnaW50ZWdlcicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMzEwCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzMxMAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18zMTAocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMzEwOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNzc6ODogKCAnaW50ZWdlcicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE3NzoxMDogJ2ludGVnZXInCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzE2Nik7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzMxMEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18zMTBFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18zMTBFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzMxMAorCisvLyAgIENvbWVzIGZyb206IDE3ODo4OiAoICdpbnRlcnZhbCcgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMzExCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzMxMQorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18zMTEocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMzExOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNzg6ODogKCAnaW50ZXJ2YWwnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNzg6MTA6ICdpbnRlcnZhbCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMTY3KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMzExRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzMxMUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzMxMUV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMzExCisKKy8vICAgQ29tZXMgZnJvbTogMTc5Ojg6ICggJ2pvaW4nICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzMxMgorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18zMTIKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMzEyKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzMxMjsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTc5Ojg6ICggJ2pvaW4nICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNzk6MTA6ICdqb2luJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8xNjgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18zMTJFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMzEyRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMzEyRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18zMTIKKworLy8gICBDb21lcyBmcm9tOiAxODA6ODogKCAnbGFtYmRhJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18zMTMKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMzEzCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzMxMyhwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18zMTM7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE4MDo4OiAoICdsYW1iZGEnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxODA6MTA6ICdsYW1iZGEnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzE2OSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzMxM0V4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18zMTNFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18zMTNFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzMxMworCisvLyAgIENvbWVzIGZyb206IDE4MTo4OiAoICdsaWZlbGluZScgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMzE0CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzMxNAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18zMTQocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMzE0OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxODE6ODogKCAnbGlmZWxpbmUnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxODE6MTA6ICdsaWZlbGluZScKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMTcwKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMzE0RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzMxNEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzMxNEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMzE0CisKKy8vICAgQ29tZXMgZnJvbTogMTgyOjg6ICggJ2xpZm8nICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzMxNQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18zMTUKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMzE1KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzMxNTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTgyOjg6ICggJ2xpZm8nICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxODI6MTA6ICdsaWZvJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8xNzEpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18zMTVFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMzE1RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMzE1RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18zMTUKKworLy8gICBDb21lcyBmcm9tOiAxODM6ODogKCAnbGlzdCcgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMzE2CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzMxNgorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18zMTYocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMzE2OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxODM6ODogKCAnbGlzdCcgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE4MzoxMDogJ2xpc3QnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzE3Mik7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzMxNkV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18zMTZFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18zMTZFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzMxNgorCisvLyAgIENvbWVzIGZyb206IDE4NDo4OiAoICdtYWNoaW5lJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18zMTcKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMzE3CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzMxNyhwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18zMTc7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE4NDo4OiAoICdtYWNoaW5lJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTg0OjEwOiAnbWFjaGluZScKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMTczKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMzE3RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzMxN0V4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzMxN0V4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMzE3CisKKy8vICAgQ29tZXMgZnJvbTogMTg1Ojg6ICggJ21hY3JvJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18zMTgKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMzE4CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzMxOChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18zMTg7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE4NTo4OiAoICdtYWNybycgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE4NToxMDogJ21hY3JvJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8xNzQpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18zMThFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMzE4RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMzE4RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18zMTgKKworLy8gICBDb21lcyBmcm9tOiAxODY6ODogKCAnbWF4OicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMzE5CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzMxOQorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18zMTkocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMzE5OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxODY6ODogKCAnbWF4OicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE4NjoxMDogJ21heDonCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzE3NSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzMxOUV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18zMTlFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18zMTlFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzMxOQorCisvLyAgIENvbWVzIGZyb206IDE4Nzo4OiAoICdtZXNzYWdlJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18zMjAKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMzIwCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzMyMChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18zMjA7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE4Nzo4OiAoICdtZXNzYWdlJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTg3OjEwOiAnbWVzc2FnZScKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMTc2KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMzIwRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzMyMEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzMyMEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMzIwCisKKy8vICAgQ29tZXMgZnJvbTogMTg4Ojg6ICggJ21vYzonICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzMyMQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18zMjEKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMzIxKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzMyMTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTg4Ojg6ICggJ21vYzonICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxODg6MTA6ICdtb2M6JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8xNzcpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18zMjFFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMzIxRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMzIxRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18zMjEKKworLy8gICBDb21lcyBmcm9tOiAxODk6ODogKCAnbW9kZWwnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzMyMgorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18zMjIKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMzIyKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzMyMjsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTg5Ojg6ICggJ21vZGVsJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTg5OjEwOiAnbW9kZWwnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzE3OCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzMyMkV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18zMjJFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18zMjJFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzMyMgorCisvLyAgIENvbWVzIGZyb206IDE5MDo4OiAoICdtb2RlbDonICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzMyMworICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18zMjMKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMzIzKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzMyMzsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTkwOjg6ICggJ21vZGVsOicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE5MDoxMDogJ21vZGVsOicKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMTc5KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMzIzRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzMyM0V4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzMyM0V4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMzIzCisKKy8vICAgQ29tZXMgZnJvbTogMTkxOjg6ICggJ211bHRpY2FzdCcgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMzI0CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzMyNAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18zMjQocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMzI0OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOTE6ODogKCAnbXVsdGljYXN0JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTkxOjEwOiAnbXVsdGljYXN0JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8xODApOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18zMjRFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMzI0RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMzI0RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18zMjQKKworLy8gICBDb21lcyBmcm9tOiAxOTI6ODogKCAnbXVsdGlmaWZvJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18zMjUKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMzI1CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzMyNShwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18zMjU7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE5Mjo4OiAoICdtdWx0aWZpZm8nICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOTI6MTA6ICdtdWx0aWZpZm8nCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzE4MSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzMyNUV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18zMjVFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18zMjVFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzMyNQorCisvLyAgIENvbWVzIGZyb206IDE5Mzo4OiAoICdtdWx0aWxpZm8nICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzMyNgorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18zMjYKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMzI2KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzMyNjsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTkzOjg6ICggJ211bHRpbGlmbycgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE5MzoxMDogJ211bHRpbGlmbycKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMTgyKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMzI2RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzMyNkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzMyNkV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMzI2CisKKy8vICAgQ29tZXMgZnJvbTogMTk0Ojg6ICggJ211bHRpcGxpY2l0eTonICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzMyNworICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18zMjcKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMzI3KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzMyNzsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTk0Ojg6ICggJ211bHRpcGxpY2l0eTonICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOTQ6MTA6ICdtdWx0aXBsaWNpdHk6JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8xODMpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18zMjdFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMzI3RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMzI3RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18zMjcKKworLy8gICBDb21lcyBmcm9tOiAxOTU6ODogKCAnbXVsdGlyZHYnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzMyOAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18zMjgKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMzI4KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzMyODsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTk1Ojg6ICggJ211bHRpcmR2JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTk1OjEwOiAnbXVsdGlyZHYnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzE4NCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzMyOEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18zMjhFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18zMjhFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzMyOAorCisvLyAgIENvbWVzIGZyb206IDE5Njo4OiAoICdtdWx0aXNldCcgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMzI5CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzMyOQorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18zMjkocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMzI5OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOTY6ODogKCAnbXVsdGlzZXQnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOTY6MTA6ICdtdWx0aXNldCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMTg1KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMzI5RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzMyOUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzMyOUV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMzI5CisKKy8vICAgQ29tZXMgZnJvbTogMTk3Ojg6ICggJ25ldycgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMzMwCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzMzMAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18zMzAocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMzMwOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOTc6ODogKCAnbmV3JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTk3OjEwOiAnbmV3JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8xODYpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18zMzBFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMzMwRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMzMwRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18zMzAKKworLy8gICBDb21lcyBmcm9tOiAxOTg6ODogKCAnbnVsbCcgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMzMxCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzMzMQorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18zMzEocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMzMxOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOTg6ODogKCAnbnVsbCcgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE5ODoxMDogJ251bGwnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzE4Nyk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzMzMUV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18zMzFFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18zMzFFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzMzMQorCisvLyAgIENvbWVzIGZyb206IDE5OTo4OiAoICdudWxsPCcgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMzMyCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzMzMgorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18zMzIocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMzMyOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOTk6ODogKCAnbnVsbDwnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOTk6MTA6ICdudWxsPCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMTg4KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMzMyRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzMzMkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzMzMkV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMzMyCisKKy8vICAgQ29tZXMgZnJvbTogMjAwOjg6ICggJ29wZXJhdG9yJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18zMzMKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMzMzCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzMzMyhwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18zMzM7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIwMDo4OiAoICdvcGVyYXRvcicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIwMDoxMDogJ29wZXJhdG9yJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8xODkpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18zMzNFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMzMzRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMzMzRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18zMzMKKworLy8gICBDb21lcyBmcm9tOiAyMDE6ODogKCAnb3InICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzMzNAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18zMzQKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMzM0KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzMzNDsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjAxOjg6ICggJ29yJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjAxOjEwOiAnb3InCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzE5MCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzMzNEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18zMzRFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18zMzRFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzMzNAorCisvLyAgIENvbWVzIGZyb206IDIwMjo4OiAoICdvdXQnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzMzNQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18zMzUKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMzM1KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzMzNTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjAyOjg6ICggJ291dCcgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIwMjoxMDogJ291dCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMTkxKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMzM1RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzMzNUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzMzNUV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMzM1CisKKy8vICAgQ29tZXMgZnJvbTogMjAzOjg6ICggJ291dHB1dCNidWZmZXInICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzMzNgorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18zMzYKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMzM2KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzMzNjsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjAzOjg6ICggJ291dHB1dCNidWZmZXInICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMDM6MTA6ICdvdXRwdXQjYnVmZmVyJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8xOTIpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18zMzZFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMzM2RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMzM2RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18zMzYKKworLy8gICBDb21lcyBmcm9tOiAyMDQ6ODogKCAnb3V0cHV0I2VudicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMzM3CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzMzNworICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18zMzcocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMzM3OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMDQ6ODogKCAnb3V0cHV0I2VudicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIwNDoxMDogJ291dHB1dCNlbnYnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzE5Myk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzMzN0V4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18zMzdFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18zMzdFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzMzNworCisvLyAgIENvbWVzIGZyb206IDIwNTo4OiAoICdvdXRwdXQjZmxvdycgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMzM4CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzMzOAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18zMzgocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMzM4OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMDU6ODogKCAnb3V0cHV0I2Zsb3cnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMDU6MTA6ICdvdXRwdXQjZmxvdycKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMTk0KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMzM4RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzMzOEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzMzOEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMzM4CisKKy8vICAgQ29tZXMgZnJvbTogMjA2Ojg6ICggJ291dHB1dCNyZHYnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzMzOQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18zMzkKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMzM5KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzMzOTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjA2Ojg6ICggJ291dHB1dCNyZHYnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMDY6MTA6ICdvdXRwdXQjcmR2JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8xOTUpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18zMzlFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMzM5RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMzM5RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18zMzkKKworLy8gICBDb21lcyBmcm9tOiAyMDc6ODogKCAnb3V0cHV0I3ZhcicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMzQwCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzM0MAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18zNDAocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMzQwOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMDc6ODogKCAnb3V0cHV0I3ZhcicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIwNzoxMDogJ291dHB1dCN2YXInCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzE5Nik7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzM0MEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18zNDBFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18zNDBFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzM0MAorCisvLyAgIENvbWVzIGZyb206IDIwODo4OiAoICdvdXRwdXQnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzM0MQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18zNDEKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMzQxKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzM0MTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjA4Ojg6ICggJ291dHB1dCcgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIwODoxMDogJ291dHB1dCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMTk3KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMzQxRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzM0MUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzM0MUV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMzQxCisKKy8vICAgQ29tZXMgZnJvbTogMjA5Ojg6ICggJ3BhY2thZ2UnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzM0MgorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18zNDIKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMzQyKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzM0MjsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjA5Ojg6ICggJ3BhY2thZ2UnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMDk6MTA6ICdwYWNrYWdlJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8xOTgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18zNDJFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMzQyRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMzQyRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18zNDIKKworLy8gICBDb21lcyBmcm9tOiAyMTA6ODogKCAncGFyZW50JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18zNDMKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMzQzCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzM0MyhwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18zNDM7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIxMDo4OiAoICdwYXJlbnQnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMTA6MTA6ICdwYXJlbnQnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzE5OSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzM0M0V4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18zNDNFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18zNDNFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzM0MworCisvLyAgIENvbWVzIGZyb206IDIxMTo4OiAoICdwb3J0JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18zNDQKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMzQ0CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzM0NChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18zNDQ7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIxMTo4OiAoICdwb3J0JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjExOjEwOiAncG9ydCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMjAwKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMzQ0RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzM0NEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzM0NEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMzQ0CisKKy8vICAgQ29tZXMgZnJvbTogMjEyOjg6ICggJ3Bvc19pbnQnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzM0NQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18zNDUKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMzQ1KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzM0NTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjEyOjg6ICggJ3Bvc19pbnQnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMTI6MTA6ICdwb3NfaW50JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8yMDEpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18zNDVFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMzQ1RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMzQ1RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18zNDUKKworLy8gICBDb21lcyBmcm9tOiAyMTM6ODogKCAncG9zX2ludGVnZXInICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzM0NgorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18zNDYKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMzQ2KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzM0NjsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjEzOjg6ICggJ3Bvc19pbnRlZ2VyJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjEzOjEwOiAncG9zX2ludGVnZXInCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzIwMik7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzM0NkV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18zNDZFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18zNDZFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzM0NgorCisvLyAgIENvbWVzIGZyb206IDIxNDo4OiAoICdwcmVzZW50JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18zNDcKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMzQ3CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzM0NyhwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18zNDc7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIxNDo4OiAoICdwcmVzZW50JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjE0OjEwOiAncHJlc2VudCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMjAzKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMzQ3RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzM0N0V4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzM0N0V4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMzQ3CisKKy8vICAgQ29tZXMgZnJvbTogMjE1Ojg6ICggJ3ByaW9yOicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMzQ4CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzM0OAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18zNDgocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMzQ4OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMTU6ODogKCAncHJpb3I6JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjE1OjEwOiAncHJpb3I6JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8yMDQpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18zNDhFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMzQ4RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMzQ4RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18zNDgKKworLy8gICBDb21lcyBmcm9tOiAyMTY6ODogKCAncHJpdmF0ZScgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMzQ5CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzM0OQorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18zNDkocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMzQ5OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMTY6ODogKCAncHJpdmF0ZScgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIxNjoxMDogJ3ByaXZhdGUnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzIwNSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzM0OUV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18zNDlFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18zNDlFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzM0OQorCisvLyAgIENvbWVzIGZyb206IDIxNzo4OiAoICdwcm9iYTonICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzM1MAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18zNTAKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMzUwKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzM1MDsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjE3Ojg6ICggJ3Byb2JhOicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIxNzoxMDogJ3Byb2JhOicKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMjA2KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMzUwRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzM1MEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzM1MEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMzUwCisKKy8vICAgQ29tZXMgZnJvbTogMjE4Ojg6ICggJ3Byb2NlZHVyZScgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMzUxCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzM1MQorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18zNTEocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMzUxOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMTg6ODogKCAncHJvY2VkdXJlJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjE4OjEwOiAncHJvY2VkdXJlJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8yMDcpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18zNTFFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMzUxRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMzUxRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18zNTEKKworLy8gICBDb21lcyBmcm9tOiAyMTk6ODogKCAncHJvdGVjdGVkJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18zNTIKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMzUyCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzM1MihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18zNTI7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIxOTo4OiAoICdwcm90ZWN0ZWQnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMTk6MTA6ICdwcm90ZWN0ZWQnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzIwOCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzM1MkV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18zNTJFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18zNTJFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzM1MgorCisvLyAgIENvbWVzIGZyb206IDIyMDo4OiAoICdwcm90b3R5cGUnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzM1MworICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18zNTMKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMzUzKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzM1MzsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjIwOjg6ICggJ3Byb3RvdHlwZScgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIyMDoxMDogJ3Byb3RvdHlwZScKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMjA5KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMzUzRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzM1M0V4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzM1M0V4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMzUzCisKKy8vICAgQ29tZXMgZnJvbTogMjIxOjg6ICggJ3Byb3ZpZGVkOicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMzU0CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzM1NAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18zNTQocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMzU0OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMjE6ODogKCAncHJvdmlkZWQ6JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjIxOjEwOiAncHJvdmlkZWQ6JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8yMTApOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18zNTRFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMzU0RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMzU0RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18zNTQKKworLy8gICBDb21lcyBmcm9tOiAyMjI6ODogKCAncHVibGljJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18zNTUKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMzU1CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzM1NShwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18zNTU7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIyMjo4OiAoICdwdWJsaWMnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMjI6MTA6ICdwdWJsaWMnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzIxMSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzM1NUV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18zNTVFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18zNTVFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzM1NQorCisvLyAgIENvbWVzIGZyb206IDIyMzo4OiAoICdyYW0nICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzM1NgorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18zNTYKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMzU2KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzM1NjsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjIzOjg6ICggJ3JhbScgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIyMzoxMDogJ3JhbScKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMjEyKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMzU2RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzM1NkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzM1NkV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMzU2CisKKy8vICAgQ29tZXMgZnJvbTogMjI0Ojg6ICggJ3JhdCcgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMzU3CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzM1NworICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18zNTcocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMzU3OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMjQ6ODogKCAncmF0JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjI0OjEwOiAncmF0JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8yMTMpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18zNTdFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMzU3RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMzU3RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18zNTcKKworLy8gICBDb21lcyBmcm9tOiAyMjU6ODogKCAncmF0aW9uYWwnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzM1OAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18zNTgKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMzU4KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzM1ODsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjI1Ojg6ICggJ3JhdGlvbmFsJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjI1OjEwOiAncmF0aW9uYWwnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzIxNCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzM1OEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18zNThFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18zNThFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzM1OAorCisvLyAgIENvbWVzIGZyb206IDIyNjo4OiAoICdyZHYnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzM1OQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18zNTkKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMzU5KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzM1OTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjI2Ojg6ICggJ3JkdicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIyNjoxMDogJ3JkdicKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMjE1KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMzU5RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzM1OUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzM1OUV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMzU5CisKKy8vICAgQ29tZXMgZnJvbTogMjI3Ojg6ICggJ3JlYWwnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzM2MAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18zNjAKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMzYwKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzM2MDsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjI3Ojg6ICggJ3JlYWwnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMjc6MTA6ICdyZWFsJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8yMTYpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18zNjBFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMzYwRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMzYwRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18zNjAKKworLy8gICBDb21lcyBmcm9tOiAyMjg6ODogKCAncmVmJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18zNjEKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMzYxCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzM2MShwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18zNjE7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIyODo4OiAoICdyZWYnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMjg6MTA6ICdyZWYnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzIxNyk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzM2MUV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18zNjFFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18zNjFFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzM2MQorCisvLyAgIENvbWVzIGZyb206IDIyOTo4OiAoICdyZXN0YXJ0JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18zNjIKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMzYyCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzM2MihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18zNjI7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIyOTo4OiAoICdyZXN0YXJ0JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjI5OjEwOiAncmVzdGFydCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMjE4KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMzYyRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzM2MkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzM2MkV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMzYyCisKKy8vICAgQ29tZXMgZnJvbTogMjMwOjg6ICggJ3Jlc3VtZScgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMzYzCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzM2MworICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18zNjMocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMzYzOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMzA6ODogKCAncmVzdW1lJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjMwOjEwOiAncmVzdW1lJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8yMTkpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18zNjNFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMzYzRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMzYzRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18zNjMKKworLy8gICBDb21lcyBmcm9tOiAyMzE6ODogKCAncmV0dXJuJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18zNjQKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMzY0CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzM2NChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18zNjQ7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIzMTo4OiAoICdyZXR1cm4nICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMzE6MTA6ICdyZXR1cm4nCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzIyMCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzM2NEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18zNjRFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18zNjRFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzM2NAorCisvLyAgIENvbWVzIGZyb206IDIzMjo4OiAoICdyZXR1cm5zOicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMzY1CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzM2NQorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18zNjUocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMzY1OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMzI6ODogKCAncmV0dXJuczonICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMzI6MTA6ICdyZXR1cm5zOicKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMjIxKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMzY1RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzM2NUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzM2NUV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMzY1CisKKy8vICAgQ29tZXMgZnJvbTogMjMzOjg6ICggJ3JvdXRlJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18zNjYKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMzY2CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzM2NihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18zNjY7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIzMzo4OiAoICdyb3V0ZScgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIzMzoxMDogJ3JvdXRlJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8yMjIpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18zNjZFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMzY2RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMzY2RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18zNjYKKworLy8gICBDb21lcyBmcm9tOiAyMzQ6ODogKCAncm91dGluZScgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMzY3CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzM2NworICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18zNjcocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMzY3OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMzQ6ODogKCAncm91dGluZScgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIzNDoxMDogJ3JvdXRpbmUnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzIyMyk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzM2N0V4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18zNjdFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18zNjdFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzM2NworCisvLyAgIENvbWVzIGZyb206IDIzNTo4OiAoICdydGMnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzM2OAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18zNjgKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMzY4KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzM2ODsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjM1Ojg6ICggJ3J0YycgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIzNToxMDogJ3J0YycKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMjI0KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMzY4RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzM2OEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzM2OEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMzY4CisKKy8vICAgQ29tZXMgZnJvbTogMjM2Ojg6ICggJ3J1bicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMzY5CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzM2OQorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18zNjkocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMzY5OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMzY6ODogKCAncnVuJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjM2OjEwOiAncnVuJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8yMjUpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18zNjlFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMzY5RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMzY5RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18zNjkKKworLy8gICBDb21lcyBmcm9tOiAyMzc6ODogKCAncnZlY3RvcicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMzcwCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzM3MAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18zNzAocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMzcwOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMzc6ODogKCAncnZlY3RvcicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIzNzoxMDogJ3J2ZWN0b3InCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzIyNik7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzM3MEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18zNzBFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18zNzBFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzM3MAorCisvLyAgIENvbWVzIGZyb206IDIzODo4OiAoICdzY2hlZHVsZScgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMzcxCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzM3MQorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18zNzEocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMzcxOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMzg6ODogKCAnc2NoZWR1bGUnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMzg6MTA6ICdzY2hlZHVsZScKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMjI3KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMzcxRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzM3MUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzM3MUV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMzcxCisKKy8vICAgQ29tZXMgZnJvbTogMjM5Ojg6ICggJ3NlbGYnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzM3MgorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18zNzIKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMzcyKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzM3MjsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjM5Ojg6ICggJ3NlbGYnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMzk6MTA6ICdzZWxmJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8yMjgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18zNzJFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMzcyRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMzcyRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18zNzIKKworLy8gICBDb21lcyBmcm9tOiAyNDA6ODogKCAnc2V0JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18zNzMKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMzczCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzM3MyhwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18zNzM7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI0MDo4OiAoICdzZXQnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNDA6MTA6ICdzZXQnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzIyOSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzM3M0V4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18zNzNFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18zNzNFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzM3MworCisvLyAgIENvbWVzIGZyb206IDI0MTo4OiAoICdzaWduYWwnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzM3NAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18zNzQKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMzc0KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzM3NDsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjQxOjg6ICggJ3NpZ25hbCcgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI0MToxMDogJ3NpZ25hbCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMjMwKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMzc0RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzM3NEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzM3NEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMzc0CisKKy8vICAgQ29tZXMgZnJvbTogMjQyOjg6ICggJ3NpemU6JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18zNzUKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMzc1CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzM3NShwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18zNzU7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI0Mjo4OiAoICdzaXplOicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI0MjoxMDogJ3NpemU6JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8yMzEpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18zNzVFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMzc1RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMzc1RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18zNzUKKworLy8gICBDb21lcyBmcm9tOiAyNDM6ODogKCAnc29sdmVyOicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMzc2CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzM3NgorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18zNzYocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMzc2OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNDM6ODogKCAnc29sdmVyOicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI0MzoxMDogJ3NvbHZlcjonCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzIzMik7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzM3NkV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18zNzZFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18zNzZFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzM3NgorCisvLyAgIENvbWVzIGZyb206IDI0NDo4OiAoICdzdGFydCcgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMzc3CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzM3NworICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18zNzcocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMzc3OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNDQ6ODogKCAnc3RhcnQnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNDQ6MTA6ICdzdGFydCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMjMzKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMzc3RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzM3N0V4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzM3N0V4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMzc3CisKKy8vICAgQ29tZXMgZnJvbTogMjQ1Ojg6ICggJ3N0YXRlJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18zNzgKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMzc4CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzM3OChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18zNzg7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI0NTo4OiAoICdzdGF0ZScgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI0NToxMDogJ3N0YXRlJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8yMzQpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18zNzhFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMzc4RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMzc4RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18zNzgKKworLy8gICBDb21lcyBmcm9tOiAyNDY6ODogKCAnc3RhdGVtYWNoaW5lJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18zNzkKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMzc5CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzM3OShwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18zNzk7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI0Njo4OiAoICdzdGF0ZW1hY2hpbmUnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNDY6MTA6ICdzdGF0ZW1hY2hpbmUnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzIzNSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzM3OUV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18zNzlFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18zNzlFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzM3OQorCisvLyAgIENvbWVzIGZyb206IDI0Nzo4OiAoICdzdGF0aWMnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzM4MAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18zODAKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMzgwKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzM4MDsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjQ3Ojg6ICggJ3N0YXRpYycgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI0NzoxMDogJ3N0YXRpYycKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMjM2KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMzgwRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzM4MEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzM4MEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMzgwCisKKy8vICAgQ29tZXMgZnJvbTogMjQ4Ojg6ICggJ3N0YXR1cyNiZWluZycgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMzgxCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzM4MQorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18zODEocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMzgxOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNDg6ODogKCAnc3RhdHVzI2JlaW5nJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjQ4OjEwOiAnc3RhdHVzI2JlaW5nJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8yMzcpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18zODFFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMzgxRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMzgxRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18zODEKKworLy8gICBDb21lcyBmcm9tOiAyNDk6ODogKCAnc3RhdHVzI2lzJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18zODIKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMzgyCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzM4MihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18zODI7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI0OTo4OiAoICdzdGF0dXMjaXMnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNDk6MTA6ICdzdGF0dXMjaXMnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzIzOCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzM4MkV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18zODJFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18zODJFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzM4MgorCisvLyAgIENvbWVzIGZyb206IDI1MDo4OiAoICdzdGF0dXMjd2FzJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18zODMKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMzgzCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzM4MyhwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18zODM7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI1MDo4OiAoICdzdGF0dXMjd2FzJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjUwOjEwOiAnc3RhdHVzI3dhcycKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMjM5KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMzgzRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzM4M0V4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzM4M0V4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMzgzCisKKy8vICAgQ29tZXMgZnJvbTogMjUxOjg6ICggJ3N0YXR1cyN3aWxsJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18zODQKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMzg0CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzM4NChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18zODQ7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI1MTo4OiAoICdzdGF0dXMjd2lsbCcgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI1MToxMDogJ3N0YXR1cyN3aWxsJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8yNDApOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18zODRFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMzg0RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMzg0RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18zODQKKworLy8gICBDb21lcyBmcm9tOiAyNTI6ODogKCAnc3RlcF9tYXJrJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18zODUKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMzg1CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzM4NShwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18zODU7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI1Mjo4OiAoICdzdGVwX21hcmsnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNTI6MTA6ICdzdGVwX21hcmsnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzI0MSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzM4NUV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18zODVFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18zODVFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzM4NQorCisvLyAgIENvbWVzIGZyb206IDI1Mzo4OiAoICdzdG9wJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18zODYKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMzg2CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzM4NihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18zODY7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI1Mzo4OiAoICdzdG9wJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjUzOjEwOiAnc3RvcCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMjQyKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMzg2RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzM4NkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzM4NkV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMzg2CisKKy8vICAgQ29tZXMgZnJvbTogMjU0Ojg6ICggJ3N0cmluZycgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMzg3CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzM4NworICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18zODcocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMzg3OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNTQ6ODogKCAnc3RyaW5nJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjU0OjEwOiAnc3RyaW5nJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8yNDMpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18zODdFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMzg3RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMzg3RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18zODcKKworLy8gICBDb21lcyBmcm9tOiAyNTU6ODogKCAnc3RydWN0JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18zODgKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMzg4CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzM4OChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18zODg7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI1NTo4OiAoICdzdHJ1Y3QnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNTU6MTA6ICdzdHJ1Y3QnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzI0NCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzM4OEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18zODhFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18zODhFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzM4OAorCisvLyAgIENvbWVzIGZyb206IDI1Njo4OiAoICdzdXNwZW5kJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18zODkKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMzg5CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzM4OShwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18zODk7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI1Njo4OiAoICdzdXNwZW5kJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjU2OjEwOiAnc3VzcGVuZCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMjQ1KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMzg5RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzM4OUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzM4OUV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMzg5CisKKy8vICAgQ29tZXMgZnJvbTogMjU3Ojg6ICggJ3N5c3RlbScgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMzkwCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzM5MAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18zOTAocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMzkwOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNTc6ODogKCAnc3lzdGVtJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjU3OjEwOiAnc3lzdGVtJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8yNDYpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18zOTBFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMzkwRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMzkwRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18zOTAKKworLy8gICBDb21lcyBmcm9tOiAyNTg6ODogKCAndGd1YXJkJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18zOTEKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMzkxCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzM5MShwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18zOTE7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI1ODo4OiAoICd0Z3VhcmQnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNTg6MTA6ICd0Z3VhcmQnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzI0Nyk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzM5MUV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18zOTFFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18zOTFFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzM5MQorCisvLyAgIENvbWVzIGZyb206IDI1OTo4OiAoICd0aW1lJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18zOTIKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMzkyCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzM5MihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18zOTI7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI1OTo4OiAoICd0aW1lJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjU5OjEwOiAndGltZScKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMjQ4KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMzkyRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzM5MkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzM5MkV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMzkyCisKKy8vICAgQ29tZXMgZnJvbTogMjYwOjg6ICggJ3RpbWVkJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18zOTMKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMzkzCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzM5MyhwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18zOTM7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI2MDo4OiAoICd0aW1lZCcgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI2MDoxMDogJ3RpbWVkJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8yNDkpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18zOTNFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMzkzRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMzkzRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18zOTMKKworLy8gICBDb21lcyBmcm9tOiAyNjE6ODogKCAndG86JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18zOTQKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMzk0CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzM5NChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18zOTQ7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI2MTo4OiAoICd0bzonICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNjE6MTA6ICd0bzonCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzI1MCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzM5NEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18zOTRFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18zOTRFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzM5NAorCisvLyAgIENvbWVzIGZyb206IDI2Mjo4OiAoICd0cmFuc2llbnQnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzM5NQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18zOTUKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMzk1KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzM5NTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjYyOjg6ICggJ3RyYW5zaWVudCcgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI2MjoxMDogJ3RyYW5zaWVudCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMjUxKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMzk1RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzM5NUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzM5NUV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMzk1CisKKy8vICAgQ29tZXMgZnJvbTogMjYzOjg6ICggJ3RyYW5zaXRpb24nICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzM5NgorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18zOTYKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMzk2KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzM5NjsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjYzOjg6ICggJ3RyYW5zaXRpb24nICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNjM6MTA6ICd0cmFuc2l0aW9uJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8yNTIpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18zOTZFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMzk2RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMzk2RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18zOTYKKworLy8gICBDb21lcyBmcm9tOiAyNjQ6ODogKCAndHJ1ZScgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fMzk3CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzM5NworICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX18zOTcocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fMzk3OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNjQ6ODogKCAndHJ1ZScgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI2NDoxMDogJ3RydWUnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzI1Myk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzM5N0V4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX18zOTdFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX18zOTdFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzM5NworCisvLyAgIENvbWVzIGZyb206IDI2NTo4OiAoICd0eXBlJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX18zOTgKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fMzk4CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzM5OChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX18zOTg7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI2NTo4OiAoICd0eXBlJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjY1OjEwOiAndHlwZScKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMjU0KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fMzk4RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzM5OEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzM5OEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fMzk4CisKKy8vICAgQ29tZXMgZnJvbTogMjY2Ojg6ICggJ3Vkb3VibGUnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzM5OQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX18zOTkKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fMzk5KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzM5OTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjY2Ojg6ICggJ3Vkb3VibGUnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNjY6MTA6ICd1ZG91YmxlJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8yNTUpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX18zOTlFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fMzk5RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fMzk5RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX18zOTkKKworLy8gICBDb21lcyBmcm9tOiAyNjc6ODogKCAndWZsb2F0JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX180MDAKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fNDAwCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzQwMChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX180MDA7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI2Nzo4OiAoICd1ZmxvYXQnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNjc6MTA6ICd1ZmxvYXQnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzI1Nik7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzQwMEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX180MDBFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX180MDBFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzQwMAorCisvLyAgIENvbWVzIGZyb206IDI2ODo4OiAoICd1aW50JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX180MDEKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fNDAxCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzQwMShwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX180MDE7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI2ODo4OiAoICd1aW50JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjY4OjEwOiAndWludCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMjU3KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fNDAxRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzQwMUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzQwMUV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fNDAxCisKKy8vICAgQ29tZXMgZnJvbTogMjY5Ojg6ICggJ3VpbnRlZ2VyJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX180MDIKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fNDAyCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzQwMihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX180MDI7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI2OTo4OiAoICd1aW50ZWdlcicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI2OToxMDogJ3VpbnRlZ2VyJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8yNTgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX180MDJFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fNDAyRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fNDAyRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX180MDIKKworLy8gICBDb21lcyBmcm9tOiAyNzA6ODogKCAndW5pY2FzdCcgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fNDAzCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzQwMworICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX180MDMocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fNDAzOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNzA6ODogKCAndW5pY2FzdCcgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI3MDoxMDogJ3VuaWNhc3QnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzI1OSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzQwM0V4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX180MDNFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX180MDNFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzQwMworCisvLyAgIENvbWVzIGZyb206IDI3MTo4OiAoICd1bmlvbicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fNDA0CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzQwNAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX180MDQocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fNDA0OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNzE6ODogKCAndW5pb24nICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNzE6MTA6ICd1bmlvbicKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMjYwKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fNDA0RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzQwNEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzQwNEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fNDA0CisKKy8vICAgQ29tZXMgZnJvbTogMjcyOjg6ICggJ3VuaXZlcnNhbCcgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fNDA1CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzQwNQorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX180MDUocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fNDA1OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNzI6ODogKCAndW5pdmVyc2FsJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjcyOjEwOiAndW5pdmVyc2FsJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8yNjEpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX180MDVFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fNDA1RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fNDA1RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX180MDUKKworLy8gICBDb21lcyBmcm9tOiAyNzM6ODogKCAndW5zYWZlJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX180MDYKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fNDA2CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzQwNihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX180MDY7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI3Mzo4OiAoICd1bnNhZmUnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNzM6MTA6ICd1bnNhZmUnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzI2Mik7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzQwNkV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX180MDZFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX180MDZFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzQwNgorCisvLyAgIENvbWVzIGZyb206IDI3NDo4OiAoICd1cmF0JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX180MDcKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fNDA3CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzQwNyhwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX180MDc7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI3NDo4OiAoICd1cmF0JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mjc0OjEwOiAndXJhdCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMjYzKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fNDA3RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzQwN0V4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzQwN0V4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fNDA3CisKKy8vICAgQ29tZXMgZnJvbTogMjc1Ojg6ICggJ3VyYXRpb25hbCcgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fNDA4CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzQwOAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX180MDgocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fNDA4OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNzU6ODogKCAndXJhdGlvbmFsJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mjc1OjEwOiAndXJhdGlvbmFsJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8yNjQpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX180MDhFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fNDA4RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fNDA4RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX180MDgKKworLy8gICBDb21lcyBmcm9tOiAyNzY6ODogKCAndXJlYWwnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzQwOQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX180MDkKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fNDA5KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzQwOTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mjc2Ojg6ICggJ3VyZWFsJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mjc2OjEwOiAndXJlYWwnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzI2NSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzQwOUV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX180MDlFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX180MDlFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzQwOQorCisvLyAgIENvbWVzIGZyb206IDI3Nzo4OiAoICd2YWwnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzQxMAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX180MTAKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fNDEwKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzQxMDsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mjc3Ojg6ICggJ3ZhbCcgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI3NzoxMDogJ3ZhbCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMjY2KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fNDEwRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzQxMEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzQxMEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fNDEwCisKKy8vICAgQ29tZXMgZnJvbTogMjc4Ojg6ICggJ3ZhcicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fNDExCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzQxMQorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX180MTEocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fNDExOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNzg6ODogKCAndmFyJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mjc4OjEwOiAndmFyJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8yNjcpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX180MTFFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fNDExRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fNDExRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX180MTEKKworLy8gICBDb21lcyBmcm9tOiAyNzk6ODogKCAndmVjdG9yJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX180MTIKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fNDEyCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzQxMihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX180MTI7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI3OTo4OiAoICd2ZWN0b3InICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNzk6MTA6ICd2ZWN0b3InCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzI2OCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzQxMkV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX180MTJFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX180MTJFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzQxMgorCisvLyAgIENvbWVzIGZyb206IDI4MDo4OiAoICd2aWEnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFRfXzQxMworICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBUX180MTMKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtVF9fNDEzKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFRfXzQxMzsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjgwOjg6ICggJ3ZpYScgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI4MDoxMDogJ3ZpYScKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMjY5KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fNDEzRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzQxM0V4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzQxM0V4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fNDEzCisKKy8vICAgQ29tZXMgZnJvbTogMjgxOjg6ICggJ3ZvbGF0aWxlJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBUX180MTQKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gVF9fNDE0CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVRfXzQxNChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBUX180MTQ7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI4MTo4OiAoICd2b2xhdGlsZScgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI4MToxMDogJ3ZvbGF0aWxlJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8yNzApOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX180MTRFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fNDE0RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fNDE0RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX180MTQKKworLy8gICBDb21lcyBmcm9tOiAyODI6ODogKCAnd2FpdCcgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fNDE1CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzQxNQorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX180MTUocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fNDE1OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyODI6ODogKCAnd2FpdCcgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI4MjoxMDogJ3dhaXQnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzI3MSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRfXzQxNUV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVUX180MTVFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVUX180MTVFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFRfXzQxNQorCisvLyAgIENvbWVzIGZyb206IDI4Mzo4OiAoICd3aGlsZScgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fNDE2CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzQxNgorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX180MTYocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fNDE2OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyODM6ODogKCAnd2hpbGUnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyODM6MTA6ICd3aGlsZScKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMjcyKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVF9fNDE2RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVRfXzQxNkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVRfXzQxNkV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgVF9fNDE2CisKKy8vICAgQ29tZXMgZnJvbTogMjg0Ojg6ICggJ3w9PicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgVF9fNDE3CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFRfXzQxNworICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1UX180MTcocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gVF9fNDE3OworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyODQ6ODogKCAnfD0+JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mjg0OjEwOiAnfD0+JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8yNzMpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVUX180MTdFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlVF9fNDE3RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVF9fNDE3RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBUX180MTcKKworLy8gICBDb21lcyBmcm9tOiA2NTk1OjIwOiAoICd8wqd8JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBPUF9BVE9NSUNfU0VRVUVOQ0UKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gT1BfQVRPTUlDX1NFUVVFTkNFCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbU9QX0FUT01JQ19TRVFVRU5DRShwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBPUF9BVE9NSUNfU0VRVUVOQ0U7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY1OTU6MjA6ICggJ3zCp3wnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NTk1OjIyOiAnfMKnfCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMjc0KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlT1BfQVRPTUlDX1NFUVVFTkNFRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZU9QX0FUT01JQ19TRVFVRU5DRUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZU9QX0FUT01JQ19TRVFVRU5DRUV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgT1BfQVRPTUlDX1NFUVVFTkNFCisKKy8vICAgQ29tZXMgZnJvbTogNjU5NzoyMDogKCAnfDt8JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBPUF9TRVFVRU5DRQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBPUF9TRVFVRU5DRQorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1PUF9TRVFVRU5DRShwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBPUF9TRVFVRU5DRTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjU5NzoyMDogKCAnfDt8JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjU5NzoyMjogJ3w7fCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMjc1KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlT1BfU0VRVUVOQ0VFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlT1BfU0VRVUVOQ0VFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVPUF9TRVFVRU5DRUV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgT1BfU0VRVUVOQ0UKKworLy8gICBDb21lcyBmcm9tOiA2NTk4OjIwOiAoICd8LnwnIHwgJ3wvO3wnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IE9QX1NFUVVFTkNFX1NJREUKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gT1BfU0VRVUVOQ0VfU0lERQorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1PUF9TRVFVRU5DRV9TSURFKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IE9QX1NFUVVFTkNFX1NJREU7CisKKworICAgIHsKKyAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY1OTg6MjA6ICggJ3wufCcgfCAnfC87fCcgKQorCisgICAgICAgIEFOVExSM19VSU5UMzIgYWx0MTsKKworICAgICAgICBhbHQxPTI7CisKKyAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICB7CisgICAgICAgIGNhc2UgJ3wnOgorICAgICAgICAJeworICAgICAgICAJCXN3aXRjaCAoIExBKDIpICkKKyAgICAgICAgCQl7CisgICAgICAgIAkJY2FzZSAnLic6CisgICAgICAgIAkJCXsKKyAgICAgICAgCQkJCWFsdDE9MTsKKyAgICAgICAgCQkJfQorICAgICAgICAJCSAgICBicmVhazsKKyAgICAgICAgCQljYXNlICcvJzoKKyAgICAgICAgCQkJeworICAgICAgICAJCQkJYWx0MT0yOworICAgICAgICAJCQl9CisgICAgICAgIAkJICAgIGJyZWFrOworCisgICAgICAgIAkJZGVmYXVsdDoKKyAgICAgICAgCQkgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJCSAgICB7CisgICAgICAgIAkJICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkJICAgICAgICByZXR1cm4gOworICAgICAgICAJCSAgICB9CisKKyAgICAgICAgCQkgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCQkgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgIAkJICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgCQkgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAxOworICAgICAgICAJCSAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDE7CisKKworICAgICAgICAJCSAgICBnb3RvIHJ1bGVPUF9TRVFVRU5DRV9TSURFRXg7CisKKyAgICAgICAgCQl9CisKKyAgICAgICAgCX0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMTsKKyAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICBnb3RvIHJ1bGVPUF9TRVFVRU5DRV9TSURFRXg7CisKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYWx0MSkKKyAgICAgICAgeworICAgIAljYXNlIDE6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NTk4OjIyOiAnfC58JworICAgIAkgICAgeworICAgIAkgICAgICAgIE1BVENIUyhsaXRfMjc2KTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlT1BfU0VRVUVOQ0VfU0lERUV4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY1OTg6MzE6ICd8Lzt8JworICAgIAkgICAgeworICAgIAkgICAgICAgIE1BVENIUyhsaXRfMjc3KTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlT1BfU0VRVUVOQ0VfU0lERUV4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgfQorICAgIH0KKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZU9QX1NFUVVFTkNFX1NJREVFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVPUF9TRVFVRU5DRV9TSURFRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBPUF9TRVFVRU5DRV9TSURFCisKKy8vICAgQ29tZXMgZnJvbTogNjU5OToyMDogKCAnfDs7fCcgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgT1BfU0VRVUVOQ0VfV0VBSworICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBPUF9TRVFVRU5DRV9XRUFLCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbU9QX1NFUVVFTkNFX1dFQUsocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gT1BfU0VRVUVOQ0VfV0VBSzsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjU5OToyMDogKCAnfDs7fCcgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY1OTk6MjI6ICd8Ozt8JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8yNzgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVPUF9TRVFVRU5DRV9XRUFLRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZU9QX1NFUVVFTkNFX1dFQUtFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVPUF9TRVFVRU5DRV9XRUFLRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBPUF9TRVFVRU5DRV9XRUFLCisKKy8vICAgQ29tZXMgZnJvbTogNjYwMToyMDogKCAnfD58JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBPUF9TQ0hFRFVMRV9HVAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBPUF9TQ0hFRFVMRV9HVAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1PUF9TQ0hFRFVMRV9HVChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBPUF9TQ0hFRFVMRV9HVDsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjYwMToyMDogKCAnfD58JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjYwMToyMjogJ3w+fCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMjc5KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlT1BfU0NIRURVTEVfR1RFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlT1BfU0NIRURVTEVfR1RFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVPUF9TQ0hFRFVMRV9HVEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgT1BfU0NIRURVTEVfR1QKKworLy8gICBDb21lcyBmcm9tOiA2NjAyOjIwOiAoICd8PHwnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IE9QX1NDSEVEVUxFX0xUCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIE9QX1NDSEVEVUxFX0xUCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbU9QX1NDSEVEVUxFX0xUKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IE9QX1NDSEVEVUxFX0xUOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjAyOjIwOiAoICd8PHwnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjAyOjIyOiAnfDx8JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8yODApOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVPUF9TQ0hFRFVMRV9MVEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVPUF9TQ0hFRFVMRV9MVEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZU9QX1NDSEVEVUxFX0xURXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBPUF9TQ0hFRFVMRV9MVAorCisvLyAgIENvbWVzIGZyb206IDY2MDM6MjA6ICggJ3x4b3J8JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBPUF9TQ0hFRFVMRV9YT1IKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gT1BfU0NIRURVTEVfWE9SCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbU9QX1NDSEVEVUxFX1hPUihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBPUF9TQ0hFRFVMRV9YT1I7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2MDM6MjA6ICggJ3x4b3J8JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjYwMzoyMjogJ3x4b3J8JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8yODEpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVPUF9TQ0hFRFVMRV9YT1JFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlT1BfU0NIRURVTEVfWE9SRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlT1BfU0NIRURVTEVfWE9SRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBPUF9TQ0hFRFVMRV9YT1IKKworLy8gICBDb21lcyBmcm9tOiA2NjA1OjIyOiAoICd8YW5kI3RoZW58JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBPUF9TQ0hFRFVMRV9BTkRfVEhFTgorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBPUF9TQ0hFRFVMRV9BTkRfVEhFTgorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1PUF9TQ0hFRFVMRV9BTkRfVEhFTihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBPUF9TQ0hFRFVMRV9BTkRfVEhFTjsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjYwNToyMjogKCAnfGFuZCN0aGVufCcgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2MDU6MjQ6ICd8YW5kI3RoZW58JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8yODIpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVPUF9TQ0hFRFVMRV9BTkRfVEhFTkV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVPUF9TQ0hFRFVMRV9BTkRfVEhFTkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZU9QX1NDSEVEVUxFX0FORF9USEVORXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBPUF9TQ0hFRFVMRV9BTkRfVEhFTgorCisvLyAgIENvbWVzIGZyb206IDY2MDY6MjI6ICggJ3xvciNlbHNlfCcgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgT1BfU0NIRURVTEVfT1JfRUxTRQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBPUF9TQ0hFRFVMRV9PUl9FTFNFCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbU9QX1NDSEVEVUxFX09SX0VMU0UocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gT1BfU0NIRURVTEVfT1JfRUxTRTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjYwNjoyMjogKCAnfG9yI2Vsc2V8JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjYwNjoyNDogJ3xvciNlbHNlfCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMjgzKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlT1BfU0NIRURVTEVfT1JfRUxTRUV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVPUF9TQ0hFRFVMRV9PUl9FTFNFRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlT1BfU0NIRURVTEVfT1JfRUxTRUV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgT1BfU0NIRURVTEVfT1JfRUxTRQorCisvLyAgIENvbWVzIGZyb206IDY2MDk6MjA6ICggJ3wvXFx8JyB8ICd8aW5kZXR8JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBPUF9OT05fREVURVJNSU5JU00KKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gT1BfTk9OX0RFVEVSTUlOSVNNCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbU9QX05PTl9ERVRFUk1JTklTTShwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBPUF9OT05fREVURVJNSU5JU007CisKKworICAgIHsKKyAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2MDk6MjA6ICggJ3wvXFx8JyB8ICd8aW5kZXR8JyApCisKKyAgICAgICAgQU5UTFIzX1VJTlQzMiBhbHQyOworCisgICAgICAgIGFsdDI9MjsKKworICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAnfCc6CisgICAgICAgIAl7CisgICAgICAgIAkJc3dpdGNoICggTEEoMikgKQorICAgICAgICAJCXsKKyAgICAgICAgCQljYXNlICcvJzoKKyAgICAgICAgCQkJeworICAgICAgICAJCQkJYWx0Mj0xOworICAgICAgICAJCQl9CisgICAgICAgIAkJICAgIGJyZWFrOworICAgICAgICAJCWNhc2UgJ2knOgorICAgICAgICAJCQl7CisgICAgICAgIAkJCQlhbHQyPTI7CisgICAgICAgIAkJCX0KKyAgICAgICAgCQkgICAgYnJlYWs7CisKKyAgICAgICAgCQlkZWZhdWx0OgorICAgICAgICAJCSAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgIAkJICAgIHsKKyAgICAgICAgCQkgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCQkgICAgICAgIHJldHVybiA7CisgICAgICAgIAkJICAgIH0KKworICAgICAgICAJCSAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAJCSAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgCQkgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAJCSAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDI7CisgICAgICAgIAkJICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMTsKKworCisgICAgICAgIAkJICAgIGdvdG8gcnVsZU9QX05PTl9ERVRFUk1JTklTTUV4OworCisgICAgICAgIAkJfQorCisgICAgICAgIAl9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDI7CisgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgZ290byBydWxlT1BfTk9OX0RFVEVSTUlOSVNNRXg7CisKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYWx0MikKKyAgICAgICAgeworICAgIAljYXNlIDE6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjA5OjIyOiAnfC9cXHwnCisgICAgCSAgICB7CisgICAgCSAgICAgICAgTUFUQ0hTKGxpdF8yODQpOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVPUF9OT05fREVURVJNSU5JU01FeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDI6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjA5OjMxOiAnfGluZGV0fCcKKyAgICAJICAgIHsKKyAgICAJICAgICAgICBNQVRDSFMobGl0XzI4NSk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZU9QX05PTl9ERVRFUk1JTklTTUV4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgfQorICAgIH0KKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZU9QX05PTl9ERVRFUk1JTklTTUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZU9QX05PTl9ERVRFUk1JTklTTUV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgT1BfTk9OX0RFVEVSTUlOSVNNCisKKy8vICAgQ29tZXMgZnJvbTogNjYxMToyOTogKCAnfGF8JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBPUF9DT05DVVJSRU5DWV9BU1lOQworICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBPUF9DT05DVVJSRU5DWV9BU1lOQworICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1PUF9DT05DVVJSRU5DWV9BU1lOQyhwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBPUF9DT05DVVJSRU5DWV9BU1lOQzsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjYxMToyOTogKCAnfGF8JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjYxMTozMTogJ3xhfCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMjg2KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlT1BfQ09OQ1VSUkVOQ1lfQVNZTkNFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlT1BfQ09OQ1VSUkVOQ1lfQVNZTkNFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVPUF9DT05DVVJSRU5DWV9BU1lOQ0V4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgT1BfQ09OQ1VSUkVOQ1lfQVNZTkMKKworLy8gICBDb21lcyBmcm9tOiA2NjEyOjI5OiAoICd8YW5kfCcgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgT1BfQ09OQ1VSUkVOQ1lfQU5ECisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIE9QX0NPTkNVUlJFTkNZX0FORAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1PUF9DT05DVVJSRU5DWV9BTkQocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gT1BfQ09OQ1VSUkVOQ1lfQU5EOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjEyOjI5OiAoICd8YW5kfCcgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2MTI6MzE6ICd8YW5kfCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMjg3KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlT1BfQ09OQ1VSUkVOQ1lfQU5ERXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZU9QX0NPTkNVUlJFTkNZX0FOREV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZU9QX0NPTkNVUlJFTkNZX0FOREV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgT1BfQ09OQ1VSUkVOQ1lfQU5ECisKKy8vICAgQ29tZXMgZnJvbTogNjYxMzoyOTogKCAnfG9yfCcgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgT1BfQ09OQ1VSUkVOQ1lfT1IKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gT1BfQ09OQ1VSUkVOQ1lfT1IKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtT1BfQ09OQ1VSUkVOQ1lfT1IocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gT1BfQ09OQ1VSUkVOQ1lfT1I7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2MTM6Mjk6ICggJ3xvcnwnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjEzOjMxOiAnfG9yfCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMjg4KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlT1BfQ09OQ1VSUkVOQ1lfT1JFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlT1BfQ09OQ1VSUkVOQ1lfT1JFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVPUF9DT05DVVJSRU5DWV9PUkV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgT1BfQ09OQ1VSUkVOQ1lfT1IKKworLy8gICBDb21lcyBmcm9tOiA2NjE0OjI5OiAoICd8aXwnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IE9QX0NPTkNVUlJFTkNZX0lOVEVSTEVBVklORworICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBPUF9DT05DVVJSRU5DWV9JTlRFUkxFQVZJTkcKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtT1BfQ09OQ1VSUkVOQ1lfSU5URVJMRUFWSU5HKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IE9QX0NPTkNVUlJFTkNZX0lOVEVSTEVBVklORzsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjYxNDoyOTogKCAnfGl8JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjYxNDozMTogJ3xpfCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMjg5KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlT1BfQ09OQ1VSUkVOQ1lfSU5URVJMRUFWSU5HRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZU9QX0NPTkNVUlJFTkNZX0lOVEVSTEVBVklOR0V4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZU9QX0NPTkNVUlJFTkNZX0lOVEVSTEVBVklOR0V4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgT1BfQ09OQ1VSUkVOQ1lfSU5URVJMRUFWSU5HCisKKy8vICAgQ29tZXMgZnJvbTogNjYxNToyOTogKCAnfCx8JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBPUF9DT05DVVJSRU5DWV9QQVJBTExFTAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBPUF9DT05DVVJSRU5DWV9QQVJBTExFTAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1PUF9DT05DVVJSRU5DWV9QQVJBTExFTChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBPUF9DT05DVVJSRU5DWV9QQVJBTExFTDsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjYxNToyOTogKCAnfCx8JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjYxNTozMTogJ3wsfCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMjkwKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlT1BfQ09OQ1VSUkVOQ1lfUEFSQUxMRUxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlT1BfQ09OQ1VSUkVOQ1lfUEFSQUxMRUxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVPUF9DT05DVVJSRU5DWV9QQVJBTExFTEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgT1BfQ09OQ1VSUkVOQ1lfUEFSQUxMRUwKKworLy8gICBDb21lcyBmcm9tOiA2NjE3OjIxOiAoICd8Zm9ya3wnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IE9QX0ZPUksKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gT1BfRk9SSworICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1PUF9GT1JLKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IE9QX0ZPUks7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2MTc6MjE6ICggJ3xmb3JrfCcgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2MTc6MjM6ICd8Zm9ya3wnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzI5MSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZU9QX0ZPUktFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlT1BfRk9SS0V4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZU9QX0ZPUktFeDogOworCit9CisvLyAkQU5UTFIgZW5kIE9QX0ZPUksKKworLy8gICBDb21lcyBmcm9tOiA2NjE4OjIxOiAoICd8am9pbnwnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IE9QX0pPSU4KKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gT1BfSk9JTgorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1PUF9KT0lOKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IE9QX0pPSU47CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2MTg6MjE6ICggJ3xqb2lufCcgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2MTg6MjM6ICd8am9pbnwnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzI5Mik7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZU9QX0pPSU5FeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlT1BfSk9JTkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZU9QX0pPSU5FeDogOworCit9CisvLyAkQU5UTFIgZW5kIE9QX0pPSU4KKworLy8gICBDb21lcyBmcm9tOiA2NjIxOjMzOiAoICd8fGF8fCcgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgT1BfQ09OQ1VSUkVOQ1lfUkRWX0FTWU5DCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIE9QX0NPTkNVUlJFTkNZX1JEVl9BU1lOQworICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1PUF9DT05DVVJSRU5DWV9SRFZfQVNZTkMocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gT1BfQ09OQ1VSUkVOQ1lfUkRWX0FTWU5DOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjIxOjMzOiAoICd8fGF8fCcgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2MjE6MzU6ICd8fGF8fCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMjkzKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlT1BfQ09OQ1VSUkVOQ1lfUkRWX0FTWU5DRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZU9QX0NPTkNVUlJFTkNZX1JEVl9BU1lOQ0V4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZU9QX0NPTkNVUlJFTkNZX1JEVl9BU1lOQ0V4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgT1BfQ09OQ1VSUkVOQ1lfUkRWX0FTWU5DCisKKy8vICAgQ29tZXMgZnJvbTogNjYyMjozMzogKCAnfHxhbmR8fCcgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgT1BfQ09OQ1VSUkVOQ1lfUkRWX0FORAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBPUF9DT05DVVJSRU5DWV9SRFZfQU5ECisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbU9QX0NPTkNVUlJFTkNZX1JEVl9BTkQocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gT1BfQ09OQ1VSUkVOQ1lfUkRWX0FORDsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjYyMjozMzogKCAnfHxhbmR8fCcgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2MjI6MzU6ICd8fGFuZHx8JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8yOTQpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVPUF9DT05DVVJSRU5DWV9SRFZfQU5ERXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZU9QX0NPTkNVUlJFTkNZX1JEVl9BTkRFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVPUF9DT05DVVJSRU5DWV9SRFZfQU5ERXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBPUF9DT05DVVJSRU5DWV9SRFZfQU5ECisKKy8vICAgQ29tZXMgZnJvbTogNjYyMzozMzogKCAnfHxvcnx8JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBPUF9DT05DVVJSRU5DWV9SRFZfT1IKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gT1BfQ09OQ1VSUkVOQ1lfUkRWX09SCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbU9QX0NPTkNVUlJFTkNZX1JEVl9PUihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBPUF9DT05DVVJSRU5DWV9SRFZfT1I7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2MjM6MzM6ICggJ3x8b3J8fCcgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2MjM6MzU6ICd8fG9yfHwnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzI5NSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZU9QX0NPTkNVUlJFTkNZX1JEVl9PUkV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVPUF9DT05DVVJSRU5DWV9SRFZfT1JFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVPUF9DT05DVVJSRU5DWV9SRFZfT1JFeDogOworCit9CisvLyAkQU5UTFIgZW5kIE9QX0NPTkNVUlJFTkNZX1JEVl9PUgorCisvLyAgIENvbWVzIGZyb206IDY2MjQ6MzM6ICggJ3x8aXx8JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBPUF9DT05DVVJSRU5DWV9SRFZfSU5URVJMRUFWSU5HCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIE9QX0NPTkNVUlJFTkNZX1JEVl9JTlRFUkxFQVZJTkcKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtT1BfQ09OQ1VSUkVOQ1lfUkRWX0lOVEVSTEVBVklORyhwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBPUF9DT05DVVJSRU5DWV9SRFZfSU5URVJMRUFWSU5HOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjI0OjMzOiAoICd8fGl8fCcgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2MjQ6MzU6ICd8fGl8fCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMjk2KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlT1BfQ09OQ1VSUkVOQ1lfUkRWX0lOVEVSTEVBVklOR0V4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVPUF9DT05DVVJSRU5DWV9SRFZfSU5URVJMRUFWSU5HRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlT1BfQ09OQ1VSUkVOQ1lfUkRWX0lOVEVSTEVBVklOR0V4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgT1BfQ09OQ1VSUkVOQ1lfUkRWX0lOVEVSTEVBVklORworCisvLyAgIENvbWVzIGZyb206IDY2MjU6MzM6ICggJ3x8LHx8JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBPUF9DT05DVVJSRU5DWV9SRFZfUEFSQUxMRUwKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gT1BfQ09OQ1VSUkVOQ1lfUkRWX1BBUkFMTEVMCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbU9QX0NPTkNVUlJFTkNZX1JEVl9QQVJBTExFTChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBPUF9DT05DVVJSRU5DWV9SRFZfUEFSQUxMRUw7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2MjU6MzM6ICggJ3x8LHx8JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjYyNTozNTogJ3x8LHx8JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8yOTcpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVPUF9DT05DVVJSRU5DWV9SRFZfUEFSQUxMRUxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlT1BfQ09OQ1VSUkVOQ1lfUkRWX1BBUkFMTEVMRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlT1BfQ09OQ1VSUkVOQ1lfUkRWX1BBUkFMTEVMRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBPUF9DT05DVVJSRU5DWV9SRFZfUEFSQUxMRUwKKworLy8gICBDb21lcyBmcm9tOiA2NjI5OjE3OiAoICc9JyB8ICc6PScgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgQVNTSUdOCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIEFTU0lHTgorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1BU1NJR04ocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gQVNTSUdOOworCisKKyAgICB7CisgICAgICAgIC8vICAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjI5OjE3OiAoICc9JyB8ICc6PScgKQorCisgICAgICAgIEFOVExSM19VSU5UMzIgYWx0MzsKKworICAgICAgICBhbHQzPTI7CisKKyAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICB7CisgICAgICAgIGNhc2UgJz0nOgorICAgICAgICAJeworICAgICAgICAJCWFsdDM9MTsKKyAgICAgICAgCX0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICc6JzoKKyAgICAgICAgCXsKKyAgICAgICAgCQlhbHQzPTI7CisgICAgICAgIAl9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDM7CisgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgZ290byBydWxlQVNTSUdORXg7CisKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYWx0MykKKyAgICAgICAgeworICAgIAljYXNlIDE6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjI5OjE5OiAnPScKKyAgICAJICAgIHsKKyAgICAJICAgICAgICBNQVRDSEMoJz0nKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlQVNTSUdORXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDI6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjI5OjI3OiAnOj0nCisgICAgCSAgICB7CisgICAgCSAgICAgICAgTUFUQ0hTKGxpdF8yOTgpOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVBU1NJR05FeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworCisgICAgICAgIH0KKyAgICB9CisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVBU1NJR05FeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVBU1NJR05FeDogOworCit9CisvLyAkQU5UTFIgZW5kIEFTU0lHTgorCisvLyAgIENvbWVzIGZyb206IDY2MzA6MTc6ICggJz06JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBBU1NJR05fQUZURVIKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gQVNTSUdOX0FGVEVSCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbUFTU0lHTl9BRlRFUihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBBU1NJR05fQUZURVI7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2MzA6MTc6ICggJz06JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjYzMDoxOTogJz06JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8yOTkpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVBU1NJR05fQUZURVJFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlQVNTSUdOX0FGVEVSRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlQVNTSUdOX0FGVEVSRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBBU1NJR05fQUZURVIKKworLy8gICBDb21lcyBmcm9tOiA2NjMxOjE3OiAoICc8LScgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgQVNTSUdOX1JFRgorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBBU1NJR05fUkVGCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbUFTU0lHTl9SRUYocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gQVNTSUdOX1JFRjsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjYzMToxNzogKCAnPC0nICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjMxOjE5OiAnPC0nCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzMwMCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZUFTU0lHTl9SRUZFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlQVNTSUdOX1JFRkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZUFTU0lHTl9SRUZFeDogOworCit9CisvLyAkQU5UTFIgZW5kIEFTU0lHTl9SRUYKKworLy8gICBDb21lcyBmcm9tOiA2NjMyOjE3OiAoICc6Oj0nICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IEFTU0lHTl9NQUNSTworICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBBU1NJR05fTUFDUk8KKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtQVNTSUdOX01BQ1JPKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IEFTU0lHTl9NQUNSTzsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjYzMjoxNzogKCAnOjo9JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjYzMjoxOTogJzo6PScKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMzAxKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlQVNTSUdOX01BQ1JPRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZUFTU0lHTl9NQUNST0V4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZUFTU0lHTl9NQUNST0V4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgQVNTSUdOX01BQ1JPCisKKy8vICAgQ29tZXMgZnJvbTogNjYzNDoxNzogKCAnPD08JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBPUF9QVVNICisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIE9QX1BVU0gKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtT1BfUFVTSChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBPUF9QVVNIOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjM0OjE3OiAoICc8PTwnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjM0OjE5OiAnPD08JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8zMDIpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVPUF9QVVNIRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZU9QX1BVU0hFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVPUF9QVVNIRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBPUF9QVVNICisKKy8vICAgQ29tZXMgZnJvbTogNjYzNToxNzogKCAnXj08JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBPUF9BU1NJR05fVE9QCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIE9QX0FTU0lHTl9UT1AKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtT1BfQVNTSUdOX1RPUChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBPUF9BU1NJR05fVE9QOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjM1OjE3OiAoICdePTwnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjM1OjE5OiAnXj08JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8zMDMpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVPUF9BU1NJR05fVE9QRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZU9QX0FTU0lHTl9UT1BFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVPUF9BU1NJR05fVE9QRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBPUF9BU1NJR05fVE9QCisKKy8vICAgQ29tZXMgZnJvbTogNjYzNjoxNzogKCAnXj0+JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBPUF9UT1AKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gT1BfVE9QCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbU9QX1RPUChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBPUF9UT1A7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2MzY6MTc6ICggJ149PicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2MzY6MTk6ICdePT4nCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzMwNCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZU9QX1RPUEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVPUF9UT1BFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVPUF9UT1BFeDogOworCit9CisvLyAkQU5UTFIgZW5kIE9QX1RPUAorCisvLyAgIENvbWVzIGZyb206IDY2Mzc6MTc6ICggJz49PicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgT1BfUE9QCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIE9QX1BPUAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1PUF9QT1AocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gT1BfUE9QOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjM3OjE3OiAoICc+PT4nICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjM3OjE5OiAnPj0+JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8zMDUpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVPUF9QT1BFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlT1BfUE9QRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlT1BfUE9QRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBPUF9QT1AKKworLy8gICBDb21lcyBmcm9tOiA2NjM5OjE3OiAoICcoJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBMUEFSRU4KKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gTFBBUkVOCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbUxQQVJFTihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBMUEFSRU47CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2Mzk6MTc6ICggJygnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjM5OjE5OiAnKCcKKyAgICB7CisgICAgICAgIE1BVENIQygnKCcpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVMUEFSRU5FeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVMUEFSRU5FeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVMUEFSRU5FeDogOworCit9CisvLyAkQU5UTFIgZW5kIExQQVJFTgorCisvLyAgIENvbWVzIGZyb206IDY2NDA6MTc6ICggJyknICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFJQQVJFTgorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBSUEFSRU4KKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtUlBBUkVOKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFJQQVJFTjsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjY0MDoxNzogKCAnKScgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2NDA6MTk6ICcpJworICAgIHsKKyAgICAgICAgTUFUQ0hDKCcpJyk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVJQQVJFTkV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVJQQVJFTkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVJQQVJFTkV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgUlBBUkVOCisKKy8vICAgQ29tZXMgZnJvbTogNjY0MToxNzogKCAneycgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgTENVUkxZCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIExDVVJMWQorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1MQ1VSTFkocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gTENVUkxZOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjQxOjE3OiAoICd7JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjY0MToxOTogJ3snCisgICAgeworICAgICAgICBNQVRDSEMoJ3snKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlTENVUkxZRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlTENVUkxZRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlTENVUkxZRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBMQ1VSTFkKKworLy8gICBDb21lcyBmcm9tOiA2NjQyOjE3OiAoICd9JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBSQ1VSTFkKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gUkNVUkxZCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVJDVVJMWShwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBSQ1VSTFk7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2NDI6MTc6ICggJ30nICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjQyOjE5OiAnfScKKyAgICB7CisgICAgICAgIE1BVENIQygnfScpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVSQ1VSTFlFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVSQ1VSTFlFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVSQ1VSTFlFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFJDVVJMWQorCisvLyAgIENvbWVzIGZyb206IDY2NDM6MTc6ICggJ1snICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IExCUkFDS0VUCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIExCUkFDS0VUCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbUxCUkFDS0VUKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IExCUkFDS0VUOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjQzOjE3OiAoICdbJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjY0MzoxOTogJ1snCisgICAgeworICAgICAgICBNQVRDSEMoJ1snKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlTEJSQUNLRVRFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVMQlJBQ0tFVEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZUxCUkFDS0VURXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBMQlJBQ0tFVAorCisvLyAgIENvbWVzIGZyb206IDY2NDQ6MTc6ICggJ10nICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFJCUkFDS0VUCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFJCUkFDS0VUCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVJCUkFDS0VUKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFJCUkFDS0VUOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjQ0OjE3OiAoICddJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjY0NDoxOTogJ10nCisgICAgeworICAgICAgICBNQVRDSEMoJ10nKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlUkJSQUNLRVRFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVSQlJBQ0tFVEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVJCUkFDS0VURXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBSQlJBQ0tFVAorCisvLyAgIENvbWVzIGZyb206IDY2NDY6MTc6ICggJ1teJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBMQlJBQ0tFVF9FWENFUFQKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gTEJSQUNLRVRfRVhDRVBUCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbUxCUkFDS0VUX0VYQ0VQVChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBMQlJBQ0tFVF9FWENFUFQ7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2NDY6MTc6ICggJ1teJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjY0NjoxOTogJ1teJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8zMDYpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVMQlJBQ0tFVF9FWENFUFRFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlTEJSQUNLRVRfRVhDRVBURXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlTEJSQUNLRVRfRVhDRVBURXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBMQlJBQ0tFVF9FWENFUFQKKworLy8gICBDb21lcyBmcm9tOiA2NjQ4OjE3OiAoICcoOicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgTFBBUkVOX0lOVk9LRQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBMUEFSRU5fSU5WT0tFCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbUxQQVJFTl9JTlZPS0UocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gTFBBUkVOX0lOVk9LRTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjY0ODoxNzogKCAnKDonICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjQ4OjE5OiAnKDonCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzMwNyk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZUxQQVJFTl9JTlZPS0VFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlTFBBUkVOX0lOVk9LRUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZUxQQVJFTl9JTlZPS0VFeDogOworCit9CisvLyAkQU5UTFIgZW5kIExQQVJFTl9JTlZPS0UKKworLy8gICBDb21lcyBmcm9tOiA2NjQ5OjE3OiAoICd7OicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgTENVUkxZX0lOVk9LRQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBMQ1VSTFlfSU5WT0tFCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbUxDVVJMWV9JTlZPS0UocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gTENVUkxZX0lOVk9LRTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjY0OToxNzogKCAnezonICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjQ5OjE5OiAnezonCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzMwOCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZUxDVVJMWV9JTlZPS0VFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlTENVUkxZX0lOVk9LRUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZUxDVVJMWV9JTlZPS0VFeDogOworCit9CisvLyAkQU5UTFIgZW5kIExDVVJMWV9JTlZPS0UKKworLy8gICBDb21lcyBmcm9tOiA2NjUxOjIzOiAoICclKDonICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFBFUkNFTlRfTFBBUkVOX0lOVk9LRQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBQRVJDRU5UX0xQQVJFTl9JTlZPS0UKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtUEVSQ0VOVF9MUEFSRU5fSU5WT0tFKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFBFUkNFTlRfTFBBUkVOX0lOVk9LRTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjY1MToyMzogKCAnJSg6JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjY1MToyNTogJyUoOicKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMzA5KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlUEVSQ0VOVF9MUEFSRU5fSU5WT0tFRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVBFUkNFTlRfTFBBUkVOX0lOVk9LRUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVBFUkNFTlRfTFBBUkVOX0lOVk9LRUV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgUEVSQ0VOVF9MUEFSRU5fSU5WT0tFCisKKy8vICAgQ29tZXMgZnJvbTogNjY1MzoxNzogKCAnJSgnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFBFUkNFTlRfTFBBUkVOCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFBFUkNFTlRfTFBBUkVOCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVBFUkNFTlRfTFBBUkVOKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFBFUkNFTlRfTFBBUkVOOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjUzOjE3OiAoICclKCcgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2NTM6MTk6ICclKCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMzEwKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlUEVSQ0VOVF9MUEFSRU5FeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlUEVSQ0VOVF9MUEFSRU5FeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVQRVJDRU5UX0xQQVJFTkV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgUEVSQ0VOVF9MUEFSRU4KKworLy8gICBDb21lcyBmcm9tOiA2NjU0OjE3OiAoICcpJScgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgUlBBUkVOX1BFUkNFTlQKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gUlBBUkVOX1BFUkNFTlQKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtUlBBUkVOX1BFUkNFTlQocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gUlBBUkVOX1BFUkNFTlQ7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2NTQ6MTc6ICggJyklJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjY1NDoxOTogJyklJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8zMTEpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVSUEFSRU5fUEVSQ0VOVEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVSUEFSRU5fUEVSQ0VOVEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVJQQVJFTl9QRVJDRU5URXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBSUEFSRU5fUEVSQ0VOVAorCisvLyAgIENvbWVzIGZyb206IDY2NTc6MTc6ICggJzo+JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBTVEFURU1FTlRfUFJPTVBUCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFNUQVRFTUVOVF9QUk9NUFQKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtU1RBVEVNRU5UX1BST01QVChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBTVEFURU1FTlRfUFJPTVBUOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjU3OjE3OiAoICc6PicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2NTc6MTk6ICc6PicKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMzEyKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlU1RBVEVNRU5UX1BST01QVEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVTVEFURU1FTlRfUFJPTVBURXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlU1RBVEVNRU5UX1BST01QVEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgU1RBVEVNRU5UX1BST01QVAorCisvLyAgIENvbWVzIGZyb206IDY2NTk6MTc6ICggJyR7JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBET0xMQVJfTENVUkxZCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIERPTExBUl9MQ1VSTFkKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtRE9MTEFSX0xDVVJMWShwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBET0xMQVJfTENVUkxZOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjU5OjE3OiAoICckeycgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2NTk6MTk6ICckeycKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMzEzKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlRE9MTEFSX0xDVVJMWUV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVET0xMQVJfTENVUkxZRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlRE9MTEFSX0xDVVJMWUV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgRE9MTEFSX0xDVVJMWQorCisvLyAgIENvbWVzIGZyb206IDY2NjA6MTc6ICggJ30kJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBSQ1VSTFlfRE9MTEFSCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFJDVVJMWV9ET0xMQVIKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtUkNVUkxZX0RPTExBUihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBSQ1VSTFlfRE9MTEFSOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjYwOjE3OiAoICd9JCcgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2NjA6MTk6ICd9JCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMzE0KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlUkNVUkxZX0RPTExBUkV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVSQ1VSTFlfRE9MTEFSRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlUkNVUkxZX0RPTExBUkV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgUkNVUkxZX0RPTExBUgorCisvLyAgIENvbWVzIGZyb206IDY2NjI6MTc6ICggJyV7JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBQRVJDRU5UX0xDVVJMWQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBQRVJDRU5UX0xDVVJMWQorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1QRVJDRU5UX0xDVVJMWShwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBQRVJDRU5UX0xDVVJMWTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjY2MjoxNzogKCAnJXsnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjYyOjE5OiAnJXsnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzMxNSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVBFUkNFTlRfTENVUkxZRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVBFUkNFTlRfTENVUkxZRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlUEVSQ0VOVF9MQ1VSTFlFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFBFUkNFTlRfTENVUkxZCisKKy8vICAgQ29tZXMgZnJvbTogNjY2MzoxNzogKCAnfSUnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFJDVVJMWV9QRVJDRU5UCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFJDVVJMWV9QRVJDRU5UCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVJDVVJMWV9QRVJDRU5UKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFJDVVJMWV9QRVJDRU5UOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjYzOjE3OiAoICd9JScgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2NjM6MTk6ICd9JScKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMzE2KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlUkNVUkxZX1BFUkNFTlRFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlUkNVUkxZX1BFUkNFTlRFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVSQ1VSTFlfUEVSQ0VOVEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgUkNVUkxZX1BFUkNFTlQKKworLy8gICBDb21lcyBmcm9tOiA2NjY1OjE3OiAoICdbfCcgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgTEJSQUNLRVRfQkFSCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIExCUkFDS0VUX0JBUgorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1MQlJBQ0tFVF9CQVIocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gTEJSQUNLRVRfQkFSOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjY1OjE3OiAoICdbfCcgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2NjU6MTk6ICdbfCcKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMzE3KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlTEJSQUNLRVRfQkFSRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZUxCUkFDS0VUX0JBUkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZUxCUkFDS0VUX0JBUkV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgTEJSQUNLRVRfQkFSCisKKy8vICAgQ29tZXMgZnJvbTogNjY2NjoxNzogKCAnfF0nICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IEJBUl9SQlJBQ0tFVAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBCQVJfUkJSQUNLRVQKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtQkFSX1JCUkFDS0VUKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IEJBUl9SQlJBQ0tFVDsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjY2NjoxNzogKCAnfF0nICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjY2OjE5OiAnfF0nCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzMxOCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZUJBUl9SQlJBQ0tFVEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVCQVJfUkJSQUNLRVRFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVCQVJfUkJSQUNLRVRFeDogOworCit9CisvLyAkQU5UTFIgZW5kIEJBUl9SQlJBQ0tFVAorCisvLyAgIENvbWVzIGZyb206IDY2Njg6MTc6ICggJ1t7JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBMQlJBQ0tFVF9MQ1VSTFkKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gTEJSQUNLRVRfTENVUkxZCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbUxCUkFDS0VUX0xDVVJMWShwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBMQlJBQ0tFVF9MQ1VSTFk7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2Njg6MTc6ICggJ1t7JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjY2ODoxOTogJ1t7JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8zMTkpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVMQlJBQ0tFVF9MQ1VSTFlFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlTEJSQUNLRVRfTENVUkxZRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlTEJSQUNLRVRfTENVUkxZRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBMQlJBQ0tFVF9MQ1VSTFkKKworLy8gICBDb21lcyBmcm9tOiA2NjY5OjE3OiAoICd9XScgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgUkNVUkxZX1JCUkFDS0VUCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFJDVVJMWV9SQlJBQ0tFVAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1SQ1VSTFlfUkJSQUNLRVQocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gUkNVUkxZX1JCUkFDS0VUOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjY5OjE3OiAoICd9XScgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2Njk6MTk6ICd9XScKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMzIwKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlUkNVUkxZX1JCUkFDS0VURXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVJDVVJMWV9SQlJBQ0tFVEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVJDVVJMWV9SQlJBQ0tFVEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgUkNVUkxZX1JCUkFDS0VUCisKKy8vICAgQ29tZXMgZnJvbTogNjY3MToxNzogKCAnOicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgQ09MT04KKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gQ09MT04KKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtQ09MT04ocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gQ09MT047CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2NzE6MTc6ICggJzonICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjcxOjE5OiAnOicKKyAgICB7CisgICAgICAgIE1BVENIQygnOicpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVDT0xPTkV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZUNPTE9ORXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlQ09MT05FeDogOworCit9CisvLyAkQU5UTFIgZW5kIENPTE9OCisKKy8vICAgQ29tZXMgZnJvbTogNjY3MjoxNzogKCAnLCcgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgQ09NTUEKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gQ09NTUEKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtQ09NTUEocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gQ09NTUE7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2NzI6MTc6ICggJywnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjcyOjE5OiAnLCcKKyAgICB7CisgICAgICAgIE1BVENIQygnLCcpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVDT01NQUV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZUNPTU1BRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlQ09NTUFFeDogOworCit9CisvLyAkQU5UTFIgZW5kIENPTU1BCisKKy8vICAgQ29tZXMgZnJvbTogNjY3MzoxNzogKCAnPycgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgUVVFU1RJT04KKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gUVVFU1RJT04KKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtUVVFU1RJT04ocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gUVVFU1RJT047CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2NzM6MTc6ICggJz8nICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjczOjE5OiAnPycKKyAgICB7CisgICAgICAgIE1BVENIQygnPycpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVRVUVTVElPTkV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVFVRVNUSU9ORXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlUVVFU1RJT05FeDogOworCit9CisvLyAkQU5UTFIgZW5kIFFVRVNUSU9OCisKKy8vICAgQ29tZXMgZnJvbTogNjY3NDoxNzogKCAnOycgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgU0VNSQorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBTRU1JCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVNFTUkocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gU0VNSTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjY3NDoxNzogKCAnOycgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2NzQ6MTk6ICc7JworICAgIHsKKyAgICAgICAgTUFUQ0hDKCc7Jyk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVNFTUlFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVTRU1JRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlU0VNSUV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgU0VNSQorCisvLyAgIENvbWVzIGZyb206IDY2NzY6MTc6ICggJyMnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IERJRVNFCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIERJRVNFCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbURJRVNFKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IERJRVNFOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2Njc2OjE3OiAoICcjJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjY3NjoxOTogJyMnCisgICAgeworICAgICAgICBNQVRDSEMoJyMnKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlRElFU0VFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVESUVTRUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZURJRVNFRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBESUVTRQorCisvLyAgIENvbWVzIGZyb206IDY2Nzc6MTc6ICggJyQnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IERPTExBUgorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBET0xMQVIKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtRE9MTEFSKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IERPTExBUjsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjY3NzoxNzogKCAnJCcgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2Nzc6MTk6ICckJworICAgIHsKKyAgICAgICAgTUFUQ0hDKCckJyk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZURPTExBUkV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZURPTExBUkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZURPTExBUkV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgRE9MTEFSCisKKy8vICAgQ29tZXMgZnJvbTogNjY3OToxNzogKCAnLicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgRE9UCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIERPVAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1ET1QocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gRE9UOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2Njc5OjE3OiAoICcuJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjY3OToxOTogJy4nCisgICAgeworICAgICAgICBNQVRDSEMoJy4nKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlRE9URXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlRE9URXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlRE9URXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBET1QKKworLy8gICBDb21lcyBmcm9tOiA2NjgwOjE3OiAoICcuLicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgRE9URE9UCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIERPVERPVAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1ET1RET1QocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gRE9URE9UOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjgwOjE3OiAoICcuLicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2ODA6MTk6ICcuLicKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMzIxKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlRE9URE9URXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZURPVERPVEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZURPVERPVEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgRE9URE9UCisKKy8vICAgQ29tZXMgZnJvbTogNjY4MToxNzogKCAnOjonICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IENPTE9OeDIKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gQ09MT054MgorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1DT0xPTngyKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IENPTE9OeDI7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2ODE6MTc6ICggJzo6JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjY4MToxOTogJzo6JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8zMjIpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVDT0xPTngyRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZUNPTE9OeDJFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVDT0xPTngyRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBDT0xPTngyCisKKy8vICAgQ29tZXMgZnJvbTogNjY4NDoyMTogKCAnJiYnIHwgJ2FuZCcgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgTEFORAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBMQU5ECisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbUxBTkQocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gTEFORDsKKworCisgICAgeworICAgICAgICAvLyAgL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjY4NDoyMTogKCAnJiYnIHwgJ2FuZCcgKQorCisgICAgICAgIEFOVExSM19VSU5UMzIgYWx0NDsKKworICAgICAgICBhbHQ0PTI7CisKKyAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICB7CisgICAgICAgIGNhc2UgJyYnOgorICAgICAgICAJeworICAgICAgICAJCWFsdDQ9MTsKKyAgICAgICAgCX0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdhJzoKKyAgICAgICAgCXsKKyAgICAgICAgCQlhbHQ0PTI7CisgICAgICAgIAl9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDQ7CisgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgZ290byBydWxlTEFOREV4OworCisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGFsdDQpCisgICAgICAgIHsKKyAgICAJY2FzZSAxOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjY4NDoyMzogJyYmJworICAgIAkgICAgeworICAgIAkgICAgICAgIE1BVENIUyhsaXRfMzIzKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlTEFOREV4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2ODQ6MzE6ICdhbmQnCisgICAgCSAgICB7CisgICAgCSAgICAgICAgTUFUQ0hTKGxpdF85NSk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZUxBTkRFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworCisgICAgICAgIH0KKyAgICB9CisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVMQU5ERXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlTEFOREV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgTEFORAorCisvLyAgIENvbWVzIGZyb206IDY2ODU6MjE6ICggJ2FuZCN0aGVuJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBMQU5EX1RIRU4KKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gTEFORF9USEVOCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbUxBTkRfVEhFTihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBMQU5EX1RIRU47CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2ODU6MjE6ICggJ2FuZCN0aGVuJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjY4NToyMzogJ2FuZCN0aGVuJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8zMjQpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVMQU5EX1RIRU5FeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlTEFORF9USEVORXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlTEFORF9USEVORXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBMQU5EX1RIRU4KKworLy8gICBDb21lcyBmcm9tOiA2Njg2OjIxOiAoICcmJj0nIHwgJyYmOj0nICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IExBTkRfQVNTSUdOCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIExBTkRfQVNTSUdOCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbUxBTkRfQVNTSUdOKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IExBTkRfQVNTSUdOOworCisKKyAgICB7CisgICAgICAgIC8vICAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2Njg2OjIxOiAoICcmJj0nIHwgJyYmOj0nICkKKworICAgICAgICBBTlRMUjNfVUlOVDMyIGFsdDU7CisKKyAgICAgICAgYWx0NT0yOworCisgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgeworICAgICAgICBjYXNlICcmJzoKKyAgICAgICAgCXsKKyAgICAgICAgCQlzd2l0Y2ggKCBMQSgyKSApCisgICAgICAgIAkJeworICAgICAgICAJCWNhc2UgJyYnOgorICAgICAgICAJCQl7CisgICAgICAgIAkJCQlzd2l0Y2ggKCBMQSgzKSApCisgICAgICAgIAkJCQl7CisgICAgICAgIAkJCQljYXNlICc9JzoKKyAgICAgICAgCQkJCQl7CisgICAgICAgIAkJCQkJCWFsdDU9MTsKKyAgICAgICAgCQkJCQl9CisgICAgICAgIAkJCQkgICAgYnJlYWs7CisgICAgICAgIAkJCQljYXNlICc6JzoKKyAgICAgICAgCQkJCQl7CisgICAgICAgIAkJCQkJCWFsdDU9MjsKKyAgICAgICAgCQkJCQl9CisgICAgICAgIAkJCQkgICAgYnJlYWs7CisKKyAgICAgICAgCQkJCWRlZmF1bHQ6CisgICAgICAgIAkJCQkgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJCQkJICAgIHsKKyAgICAgICAgCQkJCSAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAJCQkJICAgICAgICByZXR1cm4gOworICAgICAgICAJCQkJICAgIH0KKworICAgICAgICAJCQkJICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgIAkJCQkgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgIAkJCQkgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAJCQkJICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gNTsKKyAgICAgICAgCQkJCSAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDI7CisKKworICAgICAgICAJCQkJICAgIGdvdG8gcnVsZUxBTkRfQVNTSUdORXg7CisKKyAgICAgICAgCQkJCX0KKworICAgICAgICAJCQl9CisgICAgICAgIAkJICAgIGJyZWFrOworCisgICAgICAgIAkJZGVmYXVsdDoKKyAgICAgICAgCQkgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJCSAgICB7CisgICAgICAgIAkJICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkJICAgICAgICByZXR1cm4gOworICAgICAgICAJCSAgICB9CisKKyAgICAgICAgCQkgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCQkgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgIAkJICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgCQkgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA1OworICAgICAgICAJCSAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDE7CisKKworICAgICAgICAJCSAgICBnb3RvIHJ1bGVMQU5EX0FTU0lHTkV4OworCisgICAgICAgIAkJfQorCisgICAgICAgIAl9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDU7CisgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgZ290byBydWxlTEFORF9BU1NJR05FeDsKKworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChhbHQ1KQorICAgICAgICB7CisgICAgCWNhc2UgMToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2ODY6MjM6ICcmJj0nCisgICAgCSAgICB7CisgICAgCSAgICAgICAgTUFUQ0hTKGxpdF8zMjUpOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVMQU5EX0FTU0lHTkV4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2ODY6MzE6ICcmJjo9JworICAgIAkgICAgeworICAgIAkgICAgICAgIE1BVENIUyhsaXRfMzI2KTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlTEFORF9BU1NJR05FeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworCisgICAgICAgIH0KKyAgICB9CisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVMQU5EX0FTU0lHTkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZUxBTkRfQVNTSUdORXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBMQU5EX0FTU0lHTgorCisvLyAgIENvbWVzIGZyb206IDY2ODc6MjE6ICggJyYmPTonICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IExBTkRfQVNTSUdOX0FGVEVSCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIExBTkRfQVNTSUdOX0FGVEVSCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbUxBTkRfQVNTSUdOX0FGVEVSKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IExBTkRfQVNTSUdOX0FGVEVSOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2Njg3OjIxOiAoICcmJj06JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjY4NzoyMzogJyYmPTonCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzMyNyk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZUxBTkRfQVNTSUdOX0FGVEVSRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZUxBTkRfQVNTSUdOX0FGVEVSRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlTEFORF9BU1NJR05fQUZURVJFeDogOworCit9CisvLyAkQU5UTFIgZW5kIExBTkRfQVNTSUdOX0FGVEVSCisKKy8vICAgQ29tZXMgZnJvbTogNjY4OToyMTogKCAnIScgfCAnbm90JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBMTk9UCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIExOT1QKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtTE5PVChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBMTk9UOworCisKKyAgICB7CisgICAgICAgIC8vICAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2Njg5OjIxOiAoICchJyB8ICdub3QnICkKKworICAgICAgICBBTlRMUjNfVUlOVDMyIGFsdDY7CisKKyAgICAgICAgYWx0Nj0yOworCisgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgeworICAgICAgICBjYXNlICchJzoKKyAgICAgICAgCXsKKyAgICAgICAgCQlhbHQ2PTE7CisgICAgICAgIAl9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnbic6CisgICAgICAgIAl7CisgICAgICAgIAkJYWx0Nj0yOworICAgICAgICAJfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA2OworICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgIGdvdG8gcnVsZUxOT1RFeDsKKworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChhbHQ2KQorICAgICAgICB7CisgICAgCWNhc2UgMToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2ODk6MjM6ICchJworICAgIAkgICAgeworICAgIAkgICAgICAgIE1BVENIQygnIScpOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVMTk9URXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDI6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2Njg5OjMxOiAnbm90JworICAgIAkgICAgeworICAgIAkgICAgICAgIE1BVENIUyhsaXRfMzI4KTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlTE5PVEV4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgfQorICAgIH0KKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZUxOT1RFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVMTk9URXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBMTk9UCisKKy8vICAgQ29tZXMgZnJvbTogNjY5MToyMTogKCAnfHwnIHwgJ29yJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBMT1IKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gTE9SCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbUxPUihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBMT1I7CisKKworICAgIHsKKyAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2OTE6MjE6ICggJ3x8JyB8ICdvcicgKQorCisgICAgICAgIEFOVExSM19VSU5UMzIgYWx0NzsKKworICAgICAgICBhbHQ3PTI7CisKKyAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICB7CisgICAgICAgIGNhc2UgJ3wnOgorICAgICAgICAJeworICAgICAgICAJCWFsdDc9MTsKKyAgICAgICAgCX0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdvJzoKKyAgICAgICAgCXsKKyAgICAgICAgCQlhbHQ3PTI7CisgICAgICAgIAl9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDc7CisgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgZ290byBydWxlTE9SRXg7CisKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYWx0NykKKyAgICAgICAgeworICAgIAljYXNlIDE6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjkxOjIzOiAnfHwnCisgICAgCSAgICB7CisgICAgCSAgICAgICAgTUFUQ0hTKGxpdF8zMjkpOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVMT1JFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDI6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjkxOjMxOiAnb3InCisgICAgCSAgICB7CisgICAgCSAgICAgICAgTUFUQ0hTKGxpdF8xOTApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVMT1JFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworCisgICAgICAgIH0KKyAgICB9CisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVMT1JFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVMT1JFeDogOworCit9CisvLyAkQU5UTFIgZW5kIExPUgorCisvLyAgIENvbWVzIGZyb206IDY2OTI6MjE6ICggJ29yI2Vsc2UnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IExPUl9FTFNFCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIExPUl9FTFNFCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbUxPUl9FTFNFKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IExPUl9FTFNFOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjkyOjIxOiAoICdvciNlbHNlJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjY5MjoyMzogJ29yI2Vsc2UnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzMzMCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZUxPUl9FTFNFRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZUxPUl9FTFNFRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlTE9SX0VMU0VFeDogOworCit9CisvLyAkQU5UTFIgZW5kIExPUl9FTFNFCisKKy8vICAgQ29tZXMgZnJvbTogNjY5MzoyMTogKCAnfHw9JyB8ICd8fDo9JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBMT1JfQVNTSUdOCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIExPUl9BU1NJR04KKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtTE9SX0FTU0lHTihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBMT1JfQVNTSUdOOworCisKKyAgICB7CisgICAgICAgIC8vICAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NjkzOjIxOiAoICd8fD0nIHwgJ3x8Oj0nICkKKworICAgICAgICBBTlRMUjNfVUlOVDMyIGFsdDg7CisKKyAgICAgICAgYWx0OD0yOworCisgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgeworICAgICAgICBjYXNlICd8JzoKKyAgICAgICAgCXsKKyAgICAgICAgCQlzd2l0Y2ggKCBMQSgyKSApCisgICAgICAgIAkJeworICAgICAgICAJCWNhc2UgJ3wnOgorICAgICAgICAJCQl7CisgICAgICAgIAkJCQlzd2l0Y2ggKCBMQSgzKSApCisgICAgICAgIAkJCQl7CisgICAgICAgIAkJCQljYXNlICc9JzoKKyAgICAgICAgCQkJCQl7CisgICAgICAgIAkJCQkJCWFsdDg9MTsKKyAgICAgICAgCQkJCQl9CisgICAgICAgIAkJCQkgICAgYnJlYWs7CisgICAgICAgIAkJCQljYXNlICc6JzoKKyAgICAgICAgCQkJCQl7CisgICAgICAgIAkJCQkJCWFsdDg9MjsKKyAgICAgICAgCQkJCQl9CisgICAgICAgIAkJCQkgICAgYnJlYWs7CisKKyAgICAgICAgCQkJCWRlZmF1bHQ6CisgICAgICAgIAkJCQkgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJCQkJICAgIHsKKyAgICAgICAgCQkJCSAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAJCQkJICAgICAgICByZXR1cm4gOworICAgICAgICAJCQkJICAgIH0KKworICAgICAgICAJCQkJICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgIAkJCQkgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgIAkJCQkgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAJCQkJICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gODsKKyAgICAgICAgCQkJCSAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDI7CisKKworICAgICAgICAJCQkJICAgIGdvdG8gcnVsZUxPUl9BU1NJR05FeDsKKworICAgICAgICAJCQkJfQorCisgICAgICAgIAkJCX0KKyAgICAgICAgCQkgICAgYnJlYWs7CisKKyAgICAgICAgCQlkZWZhdWx0OgorICAgICAgICAJCSAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgIAkJICAgIHsKKyAgICAgICAgCQkgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCQkgICAgICAgIHJldHVybiA7CisgICAgICAgIAkJICAgIH0KKworICAgICAgICAJCSAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAJCSAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgCQkgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAJCSAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDg7CisgICAgICAgIAkJICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMTsKKworCisgICAgICAgIAkJICAgIGdvdG8gcnVsZUxPUl9BU1NJR05FeDsKKworICAgICAgICAJCX0KKworICAgICAgICAJfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA4OworICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgIGdvdG8gcnVsZUxPUl9BU1NJR05FeDsKKworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChhbHQ4KQorICAgICAgICB7CisgICAgCWNhc2UgMToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2OTM6MjM6ICd8fD0nCisgICAgCSAgICB7CisgICAgCSAgICAgICAgTUFUQ0hTKGxpdF8zMzEpOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVMT1JfQVNTSUdORXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjY5MzozMTogJ3x8Oj0nCisgICAgCSAgICB7CisgICAgCSAgICAgICAgTUFUQ0hTKGxpdF8zMzIpOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVMT1JfQVNTSUdORXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKworICAgICAgICB9CisgICAgfQorCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlTE9SX0FTU0lHTkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZUxPUl9BU1NJR05FeDogOworCit9CisvLyAkQU5UTFIgZW5kIExPUl9BU1NJR04KKworLy8gICBDb21lcyBmcm9tOiA2Njk0OjIxOiAoICd8fD06JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBMT1JfQVNTSUdOX0FGVEVSCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIExPUl9BU1NJR05fQUZURVIKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtTE9SX0FTU0lHTl9BRlRFUihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBMT1JfQVNTSUdOX0FGVEVSOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2Njk0OjIxOiAoICd8fD06JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjY5NDoyMzogJ3x8PTonCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzMzMyk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZUxPUl9BU1NJR05fQUZURVJFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlTE9SX0FTU0lHTl9BRlRFUkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZUxPUl9BU1NJR05fQUZURVJFeDogOworCit9CisvLyAkQU5UTFIgZW5kIExPUl9BU1NJR05fQUZURVIKKworLy8gICBDb21lcyBmcm9tOiA2Njk1OjIxOiAoICd4b3InICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IExYT1IKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gTFhPUgorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1MWE9SKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IExYT1I7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2OTU6MjE6ICggJ3hvcicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2OTU6MjM6ICd4b3InCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzMzNCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZUxYT1JFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlTFhPUkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZUxYT1JFeDogOworCit9CisvLyAkQU5UTFIgZW5kIExYT1IKKworLy8gICBDb21lcyBmcm9tOiA2Njk3OjIxOiAoICc9PScgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgRVFVQUwKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gRVFVQUwKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtRVFVQUwocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gRVFVQUw7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2OTc6MjE6ICggJz09JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjY5NzoyMzogJz09JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8zMzUpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVFUVVBTEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVFUVVBTEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZUVRVUFMRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBFUVVBTAorCisvLyAgIENvbWVzIGZyb206IDY2OTg6MjE6ICggJyE9JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBORVFVQUwKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gTkVRVUFMCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbU5FUVVBTChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBORVFVQUw7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2OTg6MjE6ICggJyE9JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjY5ODoyMzogJyE9JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8zMzYpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVORVFVQUxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlTkVRVUFMRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlTkVRVUFMRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBORVFVQUwKKworLy8gICBDb21lcyBmcm9tOiA2NzAwOjIxOiAoICc9PT0nICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFNFUVVBTAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBTRVFVQUwKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtU0VRVUFMKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFNFUVVBTDsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjcwMDoyMTogKCAnPT09JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjcwMDoyMzogJz09PScKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMzM3KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlU0VRVUFMRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVNFUVVBTEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVNFUVVBTEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgU0VRVUFMCisKKy8vICAgQ29tZXMgZnJvbTogNjcwMToyMTogKCAnPSE9JyB8ICc9Lz0nICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IE5TRVFVQUwKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gTlNFUVVBTAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1OU0VRVUFMKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IE5TRVFVQUw7CisKKworICAgIHsKKyAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3MDE6MjE6ICggJz0hPScgfCAnPS89JyApCisKKyAgICAgICAgQU5UTFIzX1VJTlQzMiBhbHQ5OworCisgICAgICAgIGFsdDk9MjsKKworICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAnPSc6CisgICAgICAgIAl7CisgICAgICAgIAkJc3dpdGNoICggTEEoMikgKQorICAgICAgICAJCXsKKyAgICAgICAgCQljYXNlICchJzoKKyAgICAgICAgCQkJeworICAgICAgICAJCQkJYWx0OT0xOworICAgICAgICAJCQl9CisgICAgICAgIAkJICAgIGJyZWFrOworICAgICAgICAJCWNhc2UgJy8nOgorICAgICAgICAJCQl7CisgICAgICAgIAkJCQlhbHQ5PTI7CisgICAgICAgIAkJCX0KKyAgICAgICAgCQkgICAgYnJlYWs7CisKKyAgICAgICAgCQlkZWZhdWx0OgorICAgICAgICAJCSAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgIAkJICAgIHsKKyAgICAgICAgCQkgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCQkgICAgICAgIHJldHVybiA7CisgICAgICAgIAkJICAgIH0KKworICAgICAgICAJCSAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAJCSAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgCQkgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAJCSAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDk7CisgICAgICAgIAkJICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMTsKKworCisgICAgICAgIAkJICAgIGdvdG8gcnVsZU5TRVFVQUxFeDsKKworICAgICAgICAJCX0KKworICAgICAgICAJfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA5OworICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgIGdvdG8gcnVsZU5TRVFVQUxFeDsKKworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChhbHQ5KQorICAgICAgICB7CisgICAgCWNhc2UgMToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3MDE6MjM6ICc9IT0nCisgICAgCSAgICB7CisgICAgCSAgICAgICAgTUFUQ0hTKGxpdF8zMzgpOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVOU0VRVUFMRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjcwMTozMTogJz0vPScKKyAgICAJICAgIHsKKyAgICAJICAgICAgICBNQVRDSFMobGl0XzMzOSk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZU5TRVFVQUxFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworCisgICAgICAgIH0KKyAgICB9CisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVOU0VRVUFMRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlTlNFUVVBTEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgTlNFUVVBTAorCisvLyAgIENvbWVzIGZyb206IDY3MDM6MjE6ICggJzw9JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBMVEUKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gTFRFCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbUxURShwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBMVEU7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3MDM6MjE6ICggJzw9JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjcwMzoyMzogJzw9JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8zNDApOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVMVEVFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlTFRFRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlTFRFRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBMVEUKKworLy8gICBDb21lcyBmcm9tOiA2NzA0OjIxOiAoICc8JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBMVF8KKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gTFRfCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbUxUXyhwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBMVF87CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3MDQ6MjE6ICggJzwnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NzA0OjIzOiAnPCcKKyAgICB7CisgICAgICAgIE1BVENIQygnPCcpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVMVF9FeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVMVF9FeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVMVF9FeDogOworCit9CisvLyAkQU5UTFIgZW5kIExUXworCisvLyAgIENvbWVzIGZyb206IDY3MDU6MjE6ICggJz49JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBHVEUKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gR1RFCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbUdURShwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBHVEU7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3MDU6MjE6ICggJz49JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjcwNToyMzogJz49JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8zNDEpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVHVEVFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlR1RFRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlR1RFRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBHVEUKKworLy8gICBDb21lcyBmcm9tOiA2NzA2OjIxOiAoICc+JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBHVAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBHVAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1HVChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBHVDsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjcwNjoyMTogKCAnPicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3MDY6MjM6ICc+JworICAgIHsKKyAgICAgICAgTUFUQ0hDKCc+Jyk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZUdURXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlR1RFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVHVEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgR1QKKworLy8gICBDb21lcyBmcm9tOiA2NzA5OjIxOiAoICcrJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBQTFVTCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFBMVVMKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtUExVUyhwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBQTFVTOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NzA5OjIxOiAoICcrJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjcwOToyMzogJysnCisgICAgeworICAgICAgICBNQVRDSEMoJysnKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlUExVU0V4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVBMVVNFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVQTFVTRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBQTFVTCisKKy8vICAgQ29tZXMgZnJvbTogNjcxMDoyMTogKCAnKz0nIHwgJys6PScgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgUExVU19BU1NJR04KKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gUExVU19BU1NJR04KKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtUExVU19BU1NJR04ocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gUExVU19BU1NJR047CisKKworICAgIHsKKyAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3MTA6MjE6ICggJys9JyB8ICcrOj0nICkKKworICAgICAgICBBTlRMUjNfVUlOVDMyIGFsdDEwOworCisgICAgICAgIGFsdDEwPTI7CisKKyAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICB7CisgICAgICAgIGNhc2UgJysnOgorICAgICAgICAJeworICAgICAgICAJCXN3aXRjaCAoIExBKDIpICkKKyAgICAgICAgCQl7CisgICAgICAgIAkJY2FzZSAnPSc6CisgICAgICAgIAkJCXsKKyAgICAgICAgCQkJCWFsdDEwPTE7CisgICAgICAgIAkJCX0KKyAgICAgICAgCQkgICAgYnJlYWs7CisgICAgICAgIAkJY2FzZSAnOic6CisgICAgICAgIAkJCXsKKyAgICAgICAgCQkJCWFsdDEwPTI7CisgICAgICAgIAkJCX0KKyAgICAgICAgCQkgICAgYnJlYWs7CisKKyAgICAgICAgCQlkZWZhdWx0OgorICAgICAgICAJCSAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgIAkJICAgIHsKKyAgICAgICAgCQkgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCQkgICAgICAgIHJldHVybiA7CisgICAgICAgIAkJICAgIH0KKworICAgICAgICAJCSAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAJCSAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgCQkgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAJCSAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDEwOworICAgICAgICAJCSAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDE7CisKKworICAgICAgICAJCSAgICBnb3RvIHJ1bGVQTFVTX0FTU0lHTkV4OworCisgICAgICAgIAkJfQorCisgICAgICAgIAl9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDEwOworICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgIGdvdG8gcnVsZVBMVVNfQVNTSUdORXg7CisKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYWx0MTApCisgICAgICAgIHsKKyAgICAJY2FzZSAxOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjcxMDoyMzogJys9JworICAgIAkgICAgeworICAgIAkgICAgICAgIE1BVENIUyhsaXRfMzQyKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlUExVU19BU1NJR05FeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDI6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NzEwOjMxOiAnKzo9JworICAgIAkgICAgeworICAgIAkgICAgICAgIE1BVENIUyhsaXRfMzQzKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlUExVU19BU1NJR05FeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworCisgICAgICAgIH0KKyAgICB9CisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVQTFVTX0FTU0lHTkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVBMVVNfQVNTSUdORXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBQTFVTX0FTU0lHTgorCisvLyAgIENvbWVzIGZyb206IDY3MTE6MjE6ICggJys9OicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgUExVU19BU1NJR05fQUZURVIKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gUExVU19BU1NJR05fQUZURVIKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtUExVU19BU1NJR05fQUZURVIocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gUExVU19BU1NJR05fQUZURVI7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3MTE6MjE6ICggJys9OicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3MTE6MjM6ICcrPTonCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzM0NCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVBMVVNfQVNTSUdOX0FGVEVSRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVBMVVNfQVNTSUdOX0FGVEVSRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlUExVU19BU1NJR05fQUZURVJFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFBMVVNfQVNTSUdOX0FGVEVSCisKKy8vICAgQ29tZXMgZnJvbTogNjcxMjoyMTogKCAnKysnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IElOQ1IKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gSU5DUgorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1JTkNSKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IElOQ1I7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3MTI6MjE6ICggJysrJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjcxMjoyMzogJysrJworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8zNDUpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVJTkNSRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZUlOQ1JFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVJTkNSRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBJTkNSCisKKy8vICAgQ29tZXMgZnJvbTogNjcxNDoyMTogKCAnLScgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgTUlOVVMKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gTUlOVVMKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtTUlOVVMocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gTUlOVVM7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3MTQ6MjE6ICggJy0nICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NzE0OjIzOiAnLScKKyAgICB7CisgICAgICAgIE1BVENIQygnLScpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVNSU5VU0V4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZU1JTlVTRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlTUlOVVNFeDogOworCit9CisvLyAkQU5UTFIgZW5kIE1JTlVTCisKKy8vICAgQ29tZXMgZnJvbTogNjcxNToyMTogKCAnLT0nIHwgJy06PScgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgTUlOVVNfQVNTSUdOCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIE1JTlVTX0FTU0lHTgorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1NSU5VU19BU1NJR04ocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gTUlOVVNfQVNTSUdOOworCisKKyAgICB7CisgICAgICAgIC8vICAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NzE1OjIxOiAoICctPScgfCAnLTo9JyApCisKKyAgICAgICAgQU5UTFIzX1VJTlQzMiBhbHQxMTsKKworICAgICAgICBhbHQxMT0yOworCisgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgeworICAgICAgICBjYXNlICctJzoKKyAgICAgICAgCXsKKyAgICAgICAgCQlzd2l0Y2ggKCBMQSgyKSApCisgICAgICAgIAkJeworICAgICAgICAJCWNhc2UgJz0nOgorICAgICAgICAJCQl7CisgICAgICAgIAkJCQlhbHQxMT0xOworICAgICAgICAJCQl9CisgICAgICAgIAkJICAgIGJyZWFrOworICAgICAgICAJCWNhc2UgJzonOgorICAgICAgICAJCQl7CisgICAgICAgIAkJCQlhbHQxMT0yOworICAgICAgICAJCQl9CisgICAgICAgIAkJICAgIGJyZWFrOworCisgICAgICAgIAkJZGVmYXVsdDoKKyAgICAgICAgCQkgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJCSAgICB7CisgICAgICAgIAkJICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkJICAgICAgICByZXR1cm4gOworICAgICAgICAJCSAgICB9CisKKyAgICAgICAgCQkgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCQkgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgIAkJICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgCQkgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAxMTsKKyAgICAgICAgCQkgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAxOworCisKKyAgICAgICAgCQkgICAgZ290byBydWxlTUlOVVNfQVNTSUdORXg7CisKKyAgICAgICAgCQl9CisKKyAgICAgICAgCX0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMTE7CisgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgZ290byBydWxlTUlOVVNfQVNTSUdORXg7CisKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYWx0MTEpCisgICAgICAgIHsKKyAgICAJY2FzZSAxOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjcxNToyMzogJy09JworICAgIAkgICAgeworICAgIAkgICAgICAgIE1BVENIUyhsaXRfMzQ2KTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlTUlOVVNfQVNTSUdORXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjcxNTozMTogJy06PScKKyAgICAJICAgIHsKKyAgICAJICAgICAgICBNQVRDSFMobGl0XzM0Nyk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZU1JTlVTX0FTU0lHTkV4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgfQorICAgIH0KKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZU1JTlVTX0FTU0lHTkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZU1JTlVTX0FTU0lHTkV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgTUlOVVNfQVNTSUdOCisKKy8vICAgQ29tZXMgZnJvbTogNjcxNjoyMTogKCAnLT06JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBNSU5VU19BU1NJR05fQUZURVIKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gTUlOVVNfQVNTSUdOX0FGVEVSCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbU1JTlVTX0FTU0lHTl9BRlRFUihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBNSU5VU19BU1NJR05fQUZURVI7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3MTY6MjE6ICggJy09OicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3MTY6MjM6ICctPTonCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzM0OCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZU1JTlVTX0FTU0lHTl9BRlRFUkV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVNSU5VU19BU1NJR05fQUZURVJFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVNSU5VU19BU1NJR05fQUZURVJFeDogOworCit9CisvLyAkQU5UTFIgZW5kIE1JTlVTX0FTU0lHTl9BRlRFUgorCisvLyAgIENvbWVzIGZyb206IDY3MTc6MjE6ICggJy0tJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBERUNSCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIERFQ1IKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtREVDUihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBERUNSOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NzE3OjIxOiAoICctLScgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3MTc6MjM6ICctLScKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMzQ5KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlREVDUkV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVERUNSRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlREVDUkV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgREVDUgorCisvLyAgIENvbWVzIGZyb206IDY3MTk6MjE6ICggJyonICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFNUQVIKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gU1RBUgorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1TVEFSKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFNUQVI7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3MTk6MjE6ICggJyonICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NzE5OjIzOiAnKicKKyAgICB7CisgICAgICAgIE1BVENIQygnKicpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVTVEFSRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlU1RBUkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVNUQVJFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFNUQVIKKworLy8gICBDb21lcyBmcm9tOiA2NzIwOjIxOiAoICcqPScgfCAnKjo9JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBTVEFSX0FTU0lHTgorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBTVEFSX0FTU0lHTgorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1TVEFSX0FTU0lHTihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBTVEFSX0FTU0lHTjsKKworCisgICAgeworICAgICAgICAvLyAgL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjcyMDoyMTogKCAnKj0nIHwgJyo6PScgKQorCisgICAgICAgIEFOVExSM19VSU5UMzIgYWx0MTI7CisKKyAgICAgICAgYWx0MTI9MjsKKworICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAnKic6CisgICAgICAgIAl7CisgICAgICAgIAkJc3dpdGNoICggTEEoMikgKQorICAgICAgICAJCXsKKyAgICAgICAgCQljYXNlICc9JzoKKyAgICAgICAgCQkJeworICAgICAgICAJCQkJYWx0MTI9MTsKKyAgICAgICAgCQkJfQorICAgICAgICAJCSAgICBicmVhazsKKyAgICAgICAgCQljYXNlICc6JzoKKyAgICAgICAgCQkJeworICAgICAgICAJCQkJYWx0MTI9MjsKKyAgICAgICAgCQkJfQorICAgICAgICAJCSAgICBicmVhazsKKworICAgICAgICAJCWRlZmF1bHQ6CisgICAgICAgIAkJICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgCQkgICAgeworICAgICAgICAJCSAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAJCSAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCQkgICAgfQorCisgICAgICAgIAkJICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgIAkJICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAJCSAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgIAkJICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMTI7CisgICAgICAgIAkJICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMTsKKworCisgICAgICAgIAkJICAgIGdvdG8gcnVsZVNUQVJfQVNTSUdORXg7CisKKyAgICAgICAgCQl9CisKKyAgICAgICAgCX0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMTI7CisgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgZ290byBydWxlU1RBUl9BU1NJR05FeDsKKworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChhbHQxMikKKyAgICAgICAgeworICAgIAljYXNlIDE6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NzIwOjIzOiAnKj0nCisgICAgCSAgICB7CisgICAgCSAgICAgICAgTUFUQ0hTKGxpdF8zNTApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVTVEFSX0FTU0lHTkV4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3MjA6MzE6ICcqOj0nCisgICAgCSAgICB7CisgICAgCSAgICAgICAgTUFUQ0hTKGxpdF8zNTEpOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVTVEFSX0FTU0lHTkV4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgfQorICAgIH0KKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVNUQVJfQVNTSUdORXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlU1RBUl9BU1NJR05FeDogOworCit9CisvLyAkQU5UTFIgZW5kIFNUQVJfQVNTSUdOCisKKy8vICAgQ29tZXMgZnJvbTogNjcyMToyMTogKCAnKj06JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBTVEFSX0FTU0lHTl9BRlRFUgorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBTVEFSX0FTU0lHTl9BRlRFUgorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1TVEFSX0FTU0lHTl9BRlRFUihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBTVEFSX0FTU0lHTl9BRlRFUjsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjcyMToyMTogKCAnKj06JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjcyMToyMzogJyo9OicKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMzUyKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlU1RBUl9BU1NJR05fQUZURVJFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlU1RBUl9BU1NJR05fQUZURVJFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVTVEFSX0FTU0lHTl9BRlRFUkV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgU1RBUl9BU1NJR05fQUZURVIKKworLy8gICBDb21lcyBmcm9tOiA2NzIyOjIxOiAoICcvJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBESVYKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gRElWCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbURJVihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBESVY7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3MjI6MjE6ICggJy8nICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NzIyOjIzOiAnLycKKyAgICB7CisgICAgICAgIE1BVENIQygnLycpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVESVZFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVESVZFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVESVZFeDogOworCit9CisvLyAkQU5UTFIgZW5kIERJVgorCisvLyAgIENvbWVzIGZyb206IDY3MjM6MjE6ICggJy89JyB8ICcvOj0nICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IERJVl9BU1NJR04KKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gRElWX0FTU0lHTgorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1ESVZfQVNTSUdOKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IERJVl9BU1NJR047CisKKworICAgIHsKKyAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3MjM6MjE6ICggJy89JyB8ICcvOj0nICkKKworICAgICAgICBBTlRMUjNfVUlOVDMyIGFsdDEzOworCisgICAgICAgIGFsdDEzPTI7CisKKyAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICB7CisgICAgICAgIGNhc2UgJy8nOgorICAgICAgICAJeworICAgICAgICAJCXN3aXRjaCAoIExBKDIpICkKKyAgICAgICAgCQl7CisgICAgICAgIAkJY2FzZSAnPSc6CisgICAgICAgIAkJCXsKKyAgICAgICAgCQkJCWFsdDEzPTE7CisgICAgICAgIAkJCX0KKyAgICAgICAgCQkgICAgYnJlYWs7CisgICAgICAgIAkJY2FzZSAnOic6CisgICAgICAgIAkJCXsKKyAgICAgICAgCQkJCWFsdDEzPTI7CisgICAgICAgIAkJCX0KKyAgICAgICAgCQkgICAgYnJlYWs7CisKKyAgICAgICAgCQlkZWZhdWx0OgorICAgICAgICAJCSAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgIAkJICAgIHsKKyAgICAgICAgCQkgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCQkgICAgICAgIHJldHVybiA7CisgICAgICAgIAkJICAgIH0KKworICAgICAgICAJCSAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAJCSAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgCQkgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAJCSAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDEzOworICAgICAgICAJCSAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDE7CisKKworICAgICAgICAJCSAgICBnb3RvIHJ1bGVESVZfQVNTSUdORXg7CisKKyAgICAgICAgCQl9CisKKyAgICAgICAgCX0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMTM7CisgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgZ290byBydWxlRElWX0FTU0lHTkV4OworCisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGFsdDEzKQorICAgICAgICB7CisgICAgCWNhc2UgMToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3MjM6MjM6ICcvPScKKyAgICAJICAgIHsKKyAgICAJICAgICAgICBNQVRDSFMobGl0XzM1Myk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZURJVl9BU1NJR05FeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDI6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NzIzOjMxOiAnLzo9JworICAgIAkgICAgeworICAgIAkgICAgICAgIE1BVENIUyhsaXRfMzU0KTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlRElWX0FTU0lHTkV4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgfQorICAgIH0KKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZURJVl9BU1NJR05FeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVESVZfQVNTSUdORXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBESVZfQVNTSUdOCisKKy8vICAgQ29tZXMgZnJvbTogNjcyNDoyMTogKCAnLz06JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBESVZfQVNTSUdOX0FGVEVSCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIERJVl9BU1NJR05fQUZURVIKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtRElWX0FTU0lHTl9BRlRFUihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBESVZfQVNTSUdOX0FGVEVSOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NzI0OjIxOiAoICcvPTonICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NzI0OjIzOiAnLz06JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8zNTUpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVESVZfQVNTSUdOX0FGVEVSRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZURJVl9BU1NJR05fQUZURVJFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVESVZfQVNTSUdOX0FGVEVSRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBESVZfQVNTSUdOX0FGVEVSCisKKy8vICAgQ29tZXMgZnJvbTogNjcyNToyMTogKCAnJScgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgTU9ECisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIE1PRAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1NT0QocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gTU9EOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NzI1OjIxOiAoICclJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjcyNToyMzogJyUnCisgICAgeworICAgICAgICBNQVRDSEMoJyUnKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlTU9ERXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlTU9ERXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlTU9ERXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBNT0QKKworLy8gICBDb21lcyBmcm9tOiA2NzI2OjIxOiAoICclPScgfCAnJTo9JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBNT0RfQVNTSUdOCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIE1PRF9BU1NJR04KKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtTU9EX0FTU0lHTihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBNT0RfQVNTSUdOOworCisKKyAgICB7CisgICAgICAgIC8vICAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NzI2OjIxOiAoICclPScgfCAnJTo9JyApCisKKyAgICAgICAgQU5UTFIzX1VJTlQzMiBhbHQxNDsKKworICAgICAgICBhbHQxND0yOworCisgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgeworICAgICAgICBjYXNlICclJzoKKyAgICAgICAgCXsKKyAgICAgICAgCQlzd2l0Y2ggKCBMQSgyKSApCisgICAgICAgIAkJeworICAgICAgICAJCWNhc2UgJz0nOgorICAgICAgICAJCQl7CisgICAgICAgIAkJCQlhbHQxND0xOworICAgICAgICAJCQl9CisgICAgICAgIAkJICAgIGJyZWFrOworICAgICAgICAJCWNhc2UgJzonOgorICAgICAgICAJCQl7CisgICAgICAgIAkJCQlhbHQxND0yOworICAgICAgICAJCQl9CisgICAgICAgIAkJICAgIGJyZWFrOworCisgICAgICAgIAkJZGVmYXVsdDoKKyAgICAgICAgCQkgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJCSAgICB7CisgICAgICAgIAkJICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkJICAgICAgICByZXR1cm4gOworICAgICAgICAJCSAgICB9CisKKyAgICAgICAgCQkgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCQkgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgIAkJICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgCQkgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAxNDsKKyAgICAgICAgCQkgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAxOworCisKKyAgICAgICAgCQkgICAgZ290byBydWxlTU9EX0FTU0lHTkV4OworCisgICAgICAgIAkJfQorCisgICAgICAgIAl9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDE0OworICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgIGdvdG8gcnVsZU1PRF9BU1NJR05FeDsKKworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChhbHQxNCkKKyAgICAgICAgeworICAgIAljYXNlIDE6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NzI2OjIzOiAnJT0nCisgICAgCSAgICB7CisgICAgCSAgICAgICAgTUFUQ0hTKGxpdF8zNTYpOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVNT0RfQVNTSUdORXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjcyNjozMTogJyU6PScKKyAgICAJICAgIHsKKyAgICAJICAgICAgICBNQVRDSFMobGl0XzM1Nyk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZU1PRF9BU1NJR05FeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworCisgICAgICAgIH0KKyAgICB9CisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVNT0RfQVNTSUdORXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlTU9EX0FTU0lHTkV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgTU9EX0FTU0lHTgorCisvLyAgIENvbWVzIGZyb206IDY3Mjc6MjE6ICggJyU9OicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgTU9EX0FTU0lHTl9BRlRFUgorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBNT0RfQVNTSUdOX0FGVEVSCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbU1PRF9BU1NJR05fQUZURVIocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gTU9EX0FTU0lHTl9BRlRFUjsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjcyNzoyMTogKCAnJT06JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjcyNzoyMzogJyU9OicKKyAgICB7CisgICAgICAgIE1BVENIUyhsaXRfMzU4KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlTU9EX0FTU0lHTl9BRlRFUkV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVNT0RfQVNTSUdOX0FGVEVSRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlTU9EX0FTU0lHTl9BRlRFUkV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgTU9EX0FTU0lHTl9BRlRFUgorCisvLyAgIENvbWVzIGZyb206IDY3MzE6MjE6ICggJz4+JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBSU0hJRlQKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gUlNISUZUCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVJTSElGVChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBSU0hJRlQ7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3MzE6MjE6ICggJz4+JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjczMToyMzogJz4+JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8zNTkpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVSU0hJRlRFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlUlNISUZURXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlUlNISUZURXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBSU0hJRlQKKworLy8gICBDb21lcyBmcm9tOiA2NzMyOjIxOiAoICc+Pj0nIHwgJz4+Oj0nICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFJTSElGVF9BU1NJR04KKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gUlNISUZUX0FTU0lHTgorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1SU0hJRlRfQVNTSUdOKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFJTSElGVF9BU1NJR047CisKKworICAgIHsKKyAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3MzI6MjE6ICggJz4+PScgfCAnPj46PScgKQorCisgICAgICAgIEFOVExSM19VSU5UMzIgYWx0MTU7CisKKyAgICAgICAgYWx0MTU9MjsKKworICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAnPic6CisgICAgICAgIAl7CisgICAgICAgIAkJc3dpdGNoICggTEEoMikgKQorICAgICAgICAJCXsKKyAgICAgICAgCQljYXNlICc+JzoKKyAgICAgICAgCQkJeworICAgICAgICAJCQkJc3dpdGNoICggTEEoMykgKQorICAgICAgICAJCQkJeworICAgICAgICAJCQkJY2FzZSAnPSc6CisgICAgICAgIAkJCQkJeworICAgICAgICAJCQkJCQlhbHQxNT0xOworICAgICAgICAJCQkJCX0KKyAgICAgICAgCQkJCSAgICBicmVhazsKKyAgICAgICAgCQkJCWNhc2UgJzonOgorICAgICAgICAJCQkJCXsKKyAgICAgICAgCQkJCQkJYWx0MTU9MjsKKyAgICAgICAgCQkJCQl9CisgICAgICAgIAkJCQkgICAgYnJlYWs7CisKKyAgICAgICAgCQkJCWRlZmF1bHQ6CisgICAgICAgIAkJCQkgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJCQkJICAgIHsKKyAgICAgICAgCQkJCSAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAJCQkJICAgICAgICByZXR1cm4gOworICAgICAgICAJCQkJICAgIH0KKworICAgICAgICAJCQkJICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgIAkJCQkgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgIAkJCQkgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAJCQkJICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMTU7CisgICAgICAgIAkJCQkgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAyOworCisKKyAgICAgICAgCQkJCSAgICBnb3RvIHJ1bGVSU0hJRlRfQVNTSUdORXg7CisKKyAgICAgICAgCQkJCX0KKworICAgICAgICAJCQl9CisgICAgICAgIAkJICAgIGJyZWFrOworCisgICAgICAgIAkJZGVmYXVsdDoKKyAgICAgICAgCQkgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJCSAgICB7CisgICAgICAgIAkJICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkJICAgICAgICByZXR1cm4gOworICAgICAgICAJCSAgICB9CisKKyAgICAgICAgCQkgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCQkgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgIAkJICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgCQkgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAxNTsKKyAgICAgICAgCQkgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAxOworCisKKyAgICAgICAgCQkgICAgZ290byBydWxlUlNISUZUX0FTU0lHTkV4OworCisgICAgICAgIAkJfQorCisgICAgICAgIAl9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDE1OworICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgIGdvdG8gcnVsZVJTSElGVF9BU1NJR05FeDsKKworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChhbHQxNSkKKyAgICAgICAgeworICAgIAljYXNlIDE6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NzMyOjIzOiAnPj49JworICAgIAkgICAgeworICAgIAkgICAgICAgIE1BVENIUyhsaXRfMzYwKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlUlNISUZUX0FTU0lHTkV4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3MzI6MzE6ICc+Pjo9JworICAgIAkgICAgeworICAgIAkgICAgICAgIE1BVENIUyhsaXRfMzYxKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlUlNISUZUX0FTU0lHTkV4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgfQorICAgIH0KKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVJTSElGVF9BU1NJR05FeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVSU0hJRlRfQVNTSUdORXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBSU0hJRlRfQVNTSUdOCisKKy8vICAgQ29tZXMgZnJvbTogNjczMzoyMTogKCAnPj49OicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgUlNISUZUX0FTU0lHTl9BRlRFUgorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBSU0hJRlRfQVNTSUdOX0FGVEVSCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVJTSElGVF9BU1NJR05fQUZURVIocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gUlNISUZUX0FTU0lHTl9BRlRFUjsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjczMzoyMTogKCAnPj49OicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3MzM6MjM6ICc+Pj06JworICAgIHsKKyAgICAgICAgTUFUQ0hTKGxpdF8zNjIpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVSU0hJRlRfQVNTSUdOX0FGVEVSRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVJTSElGVF9BU1NJR05fQUZURVJFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVSU0hJRlRfQVNTSUdOX0FGVEVSRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBSU0hJRlRfQVNTSUdOX0FGVEVSCisKKy8vICAgQ29tZXMgZnJvbTogNjczNDoyMTogKCAnPDwnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IExTSElGVAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBMU0hJRlQKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtTFNISUZUKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IExTSElGVDsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjczNDoyMTogKCAnPDwnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NzM0OjIzOiAnPDwnCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzM2Myk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZUxTSElGVEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVMU0hJRlRFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVMU0hJRlRFeDogOworCit9CisvLyAkQU5UTFIgZW5kIExTSElGVAorCisvLyAgIENvbWVzIGZyb206IDY3MzU6MjE6ICggJzw8PScgfCAnPDw6PScgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgTFNISUZUX0FTU0lHTgorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBMU0hJRlRfQVNTSUdOCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbUxTSElGVF9BU1NJR04ocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gTFNISUZUX0FTU0lHTjsKKworCisgICAgeworICAgICAgICAvLyAgL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjczNToyMTogKCAnPDw9JyB8ICc8PDo9JyApCisKKyAgICAgICAgQU5UTFIzX1VJTlQzMiBhbHQxNjsKKworICAgICAgICBhbHQxNj0yOworCisgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgeworICAgICAgICBjYXNlICc8JzoKKyAgICAgICAgCXsKKyAgICAgICAgCQlzd2l0Y2ggKCBMQSgyKSApCisgICAgICAgIAkJeworICAgICAgICAJCWNhc2UgJzwnOgorICAgICAgICAJCQl7CisgICAgICAgIAkJCQlzd2l0Y2ggKCBMQSgzKSApCisgICAgICAgIAkJCQl7CisgICAgICAgIAkJCQljYXNlICc9JzoKKyAgICAgICAgCQkJCQl7CisgICAgICAgIAkJCQkJCWFsdDE2PTE7CisgICAgICAgIAkJCQkJfQorICAgICAgICAJCQkJICAgIGJyZWFrOworICAgICAgICAJCQkJY2FzZSAnOic6CisgICAgICAgIAkJCQkJeworICAgICAgICAJCQkJCQlhbHQxNj0yOworICAgICAgICAJCQkJCX0KKyAgICAgICAgCQkJCSAgICBicmVhazsKKworICAgICAgICAJCQkJZGVmYXVsdDoKKyAgICAgICAgCQkJCSAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgIAkJCQkgICAgeworICAgICAgICAJCQkJICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkJCQkgICAgICAgIHJldHVybiA7CisgICAgICAgIAkJCQkgICAgfQorCisgICAgICAgIAkJCQkgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCQkJCSAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgCQkJCSAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgIAkJCQkgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAxNjsKKyAgICAgICAgCQkJCSAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDI7CisKKworICAgICAgICAJCQkJICAgIGdvdG8gcnVsZUxTSElGVF9BU1NJR05FeDsKKworICAgICAgICAJCQkJfQorCisgICAgICAgIAkJCX0KKyAgICAgICAgCQkgICAgYnJlYWs7CisKKyAgICAgICAgCQlkZWZhdWx0OgorICAgICAgICAJCSAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgIAkJICAgIHsKKyAgICAgICAgCQkgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCQkgICAgICAgIHJldHVybiA7CisgICAgICAgIAkJICAgIH0KKworICAgICAgICAJCSAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAJCSAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgCQkgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAJCSAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDE2OworICAgICAgICAJCSAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDE7CisKKworICAgICAgICAJCSAgICBnb3RvIHJ1bGVMU0hJRlRfQVNTSUdORXg7CisKKyAgICAgICAgCQl9CisKKyAgICAgICAgCX0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMTY7CisgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgZ290byBydWxlTFNISUZUX0FTU0lHTkV4OworCisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGFsdDE2KQorICAgICAgICB7CisgICAgCWNhc2UgMToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3MzU6MjM6ICc8PD0nCisgICAgCSAgICB7CisgICAgCSAgICAgICAgTUFUQ0hTKGxpdF8zNjQpOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVMU0hJRlRfQVNTSUdORXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjczNTozMTogJzw8Oj0nCisgICAgCSAgICB7CisgICAgCSAgICAgICAgTUFUQ0hTKGxpdF8zNjUpOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVMU0hJRlRfQVNTSUdORXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKworICAgICAgICB9CisgICAgfQorCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlTFNISUZUX0FTU0lHTkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZUxTSElGVF9BU1NJR05FeDogOworCit9CisvLyAkQU5UTFIgZW5kIExTSElGVF9BU1NJR04KKworLy8gICBDb21lcyBmcm9tOiA2NzM2OjIxOiAoICc8PD06JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBMU0hJRlRfQVNTSUdOX0FGVEVSCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIExTSElGVF9BU1NJR05fQUZURVIKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtTFNISUZUX0FTU0lHTl9BRlRFUihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBMU0hJRlRfQVNTSUdOX0FGVEVSOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NzM2OjIxOiAoICc8PD06JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjczNjoyMzogJzw8PTonCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzM2Nik7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZUxTSElGVF9BU1NJR05fQUZURVJFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlTFNISUZUX0FTU0lHTl9BRlRFUkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZUxTSElGVF9BU1NJR05fQUZURVJFeDogOworCit9CisvLyAkQU5UTFIgZW5kIExTSElGVF9BU1NJR05fQUZURVIKKworLy8gICBDb21lcyBmcm9tOiA2NzM4OjIxOiAoICcmJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBCQU5ECisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIEJBTkQKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtQkFORChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBCQU5EOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NzM4OjIxOiAoICcmJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjczODoyMzogJyYnCisgICAgeworICAgICAgICBNQVRDSEMoJyYnKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlQkFOREV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZUJBTkRFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVCQU5ERXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBCQU5ECisKKy8vICAgQ29tZXMgZnJvbTogNjczOToyMTogKCAnJj0nIHwgJyY6PScgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgQkFORF9BU1NJR04KKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gQkFORF9BU1NJR04KKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtQkFORF9BU1NJR04ocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gQkFORF9BU1NJR047CisKKworICAgIHsKKyAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3Mzk6MjE6ICggJyY9JyB8ICcmOj0nICkKKworICAgICAgICBBTlRMUjNfVUlOVDMyIGFsdDE3OworCisgICAgICAgIGFsdDE3PTI7CisKKyAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICB7CisgICAgICAgIGNhc2UgJyYnOgorICAgICAgICAJeworICAgICAgICAJCXN3aXRjaCAoIExBKDIpICkKKyAgICAgICAgCQl7CisgICAgICAgIAkJY2FzZSAnPSc6CisgICAgICAgIAkJCXsKKyAgICAgICAgCQkJCWFsdDE3PTE7CisgICAgICAgIAkJCX0KKyAgICAgICAgCQkgICAgYnJlYWs7CisgICAgICAgIAkJY2FzZSAnOic6CisgICAgICAgIAkJCXsKKyAgICAgICAgCQkJCWFsdDE3PTI7CisgICAgICAgIAkJCX0KKyAgICAgICAgCQkgICAgYnJlYWs7CisKKyAgICAgICAgCQlkZWZhdWx0OgorICAgICAgICAJCSAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgIAkJICAgIHsKKyAgICAgICAgCQkgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCQkgICAgICAgIHJldHVybiA7CisgICAgICAgIAkJICAgIH0KKworICAgICAgICAJCSAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAJCSAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgCQkgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAJCSAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDE3OworICAgICAgICAJCSAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDE7CisKKworICAgICAgICAJCSAgICBnb3RvIHJ1bGVCQU5EX0FTU0lHTkV4OworCisgICAgICAgIAkJfQorCisgICAgICAgIAl9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDE3OworICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgIGdvdG8gcnVsZUJBTkRfQVNTSUdORXg7CisKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYWx0MTcpCisgICAgICAgIHsKKyAgICAJY2FzZSAxOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjczOToyMzogJyY9JworICAgIAkgICAgeworICAgIAkgICAgICAgIE1BVENIUyhsaXRfMzY3KTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlQkFORF9BU1NJR05FeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDI6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NzM5OjMxOiAnJjo9JworICAgIAkgICAgeworICAgIAkgICAgICAgIE1BVENIUyhsaXRfMzY4KTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlQkFORF9BU1NJR05FeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworCisgICAgICAgIH0KKyAgICB9CisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVCQU5EX0FTU0lHTkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZUJBTkRfQVNTSUdORXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBCQU5EX0FTU0lHTgorCisvLyAgIENvbWVzIGZyb206IDY3NDA6MjE6ICggJyY9OicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgQkFORF9BU1NJR05fQUZURVIKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gQkFORF9BU1NJR05fQUZURVIKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtQkFORF9BU1NJR05fQUZURVIocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gQkFORF9BU1NJR05fQUZURVI7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3NDA6MjE6ICggJyY9OicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3NDA6MjM6ICcmPTonCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzM2OSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZUJBTkRfQVNTSUdOX0FGVEVSRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZUJBTkRfQVNTSUdOX0FGVEVSRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlQkFORF9BU1NJR05fQUZURVJFeDogOworCit9CisvLyAkQU5UTFIgZW5kIEJBTkRfQVNTSUdOX0FGVEVSCisKKy8vICAgQ29tZXMgZnJvbTogNjc0MToyMTogKCAnficgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgQk5PVAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBCTk9UCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbUJOT1QocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gQk5PVDsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Njc0MToyMTogKCAnficgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3NDE6MjM6ICd+JworICAgIHsKKyAgICAgICAgTUFUQ0hDKCd+Jyk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZUJOT1RFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVCTk9URXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlQk5PVEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgQk5PVAorCisvLyAgIENvbWVzIGZyb206IDY3NDI6MjE6ICggJ3wnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IEJPUgorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBCT1IKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtQk9SKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IEJPUjsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Njc0MjoyMTogKCAnfCcgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3NDI6MjM6ICd8JworICAgIHsKKyAgICAgICAgTUFUQ0hDKCd8Jyk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZUJPUkV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZUJPUkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZUJPUkV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgQk9SCisKKy8vICAgQ29tZXMgZnJvbTogNjc0MzoyMTogKCAnfD0nIHwgJ3w6PScgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgQk9SX0FTU0lHTgorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBCT1JfQVNTSUdOCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbUJPUl9BU1NJR04ocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gQk9SX0FTU0lHTjsKKworCisgICAgeworICAgICAgICAvLyAgL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Njc0MzoyMTogKCAnfD0nIHwgJ3w6PScgKQorCisgICAgICAgIEFOVExSM19VSU5UMzIgYWx0MTg7CisKKyAgICAgICAgYWx0MTg9MjsKKworICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAnfCc6CisgICAgICAgIAl7CisgICAgICAgIAkJc3dpdGNoICggTEEoMikgKQorICAgICAgICAJCXsKKyAgICAgICAgCQljYXNlICc9JzoKKyAgICAgICAgCQkJeworICAgICAgICAJCQkJYWx0MTg9MTsKKyAgICAgICAgCQkJfQorICAgICAgICAJCSAgICBicmVhazsKKyAgICAgICAgCQljYXNlICc6JzoKKyAgICAgICAgCQkJeworICAgICAgICAJCQkJYWx0MTg9MjsKKyAgICAgICAgCQkJfQorICAgICAgICAJCSAgICBicmVhazsKKworICAgICAgICAJCWRlZmF1bHQ6CisgICAgICAgIAkJICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgCQkgICAgeworICAgICAgICAJCSAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAJCSAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCQkgICAgfQorCisgICAgICAgIAkJICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgIAkJICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAJCSAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgIAkJICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMTg7CisgICAgICAgIAkJICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMTsKKworCisgICAgICAgIAkJICAgIGdvdG8gcnVsZUJPUl9BU1NJR05FeDsKKworICAgICAgICAJCX0KKworICAgICAgICAJfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAxODsKKyAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICBnb3RvIHJ1bGVCT1JfQVNTSUdORXg7CisKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYWx0MTgpCisgICAgICAgIHsKKyAgICAJY2FzZSAxOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Njc0MzoyMzogJ3w9JworICAgIAkgICAgeworICAgIAkgICAgICAgIE1BVENIUyhsaXRfMzcwKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlQk9SX0FTU0lHTkV4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3NDM6MzE6ICd8Oj0nCisgICAgCSAgICB7CisgICAgCSAgICAgICAgTUFUQ0hTKGxpdF8zNzEpOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVCT1JfQVNTSUdORXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKworICAgICAgICB9CisgICAgfQorCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlQk9SX0FTU0lHTkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZUJPUl9BU1NJR05FeDogOworCit9CisvLyAkQU5UTFIgZW5kIEJPUl9BU1NJR04KKworLy8gICBDb21lcyBmcm9tOiA2NzQ0OjIxOiAoICd8PTonICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IEJPUl9BU1NJR05fQUZURVIKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gQk9SX0FTU0lHTl9BRlRFUgorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1CT1JfQVNTSUdOX0FGVEVSKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IEJPUl9BU1NJR05fQUZURVI7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3NDQ6MjE6ICggJ3w9OicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3NDQ6MjM6ICd8PTonCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzM3Mik7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZUJPUl9BU1NJR05fQUZURVJFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKworICAgIH0KKworCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlQk9SX0FTU0lHTl9BRlRFUkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZUJPUl9BU1NJR05fQUZURVJFeDogOworCit9CisvLyAkQU5UTFIgZW5kIEJPUl9BU1NJR05fQUZURVIKKworLy8gICBDb21lcyBmcm9tOiA2NzQ1OjIxOiAoICdeJyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBCWE9SCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIEJYT1IKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtQlhPUihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBCWE9SOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NzQ1OjIxOiAoICdeJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Njc0NToyMzogJ14nCisgICAgeworICAgICAgICBNQVRDSEMoJ14nKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlQlhPUkV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZUJYT1JFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVCWE9SRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBCWE9SCisKKy8vICAgQ29tZXMgZnJvbTogNjc0NjoyMTogKCAnXj0nIHwgJ146PScgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgQlhPUl9BU1NJR04KKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gQlhPUl9BU1NJR04KKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtQlhPUl9BU1NJR04ocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gQlhPUl9BU1NJR047CisKKworICAgIHsKKyAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3NDY6MjE6ICggJ149JyB8ICdeOj0nICkKKworICAgICAgICBBTlRMUjNfVUlOVDMyIGFsdDE5OworCisgICAgICAgIGFsdDE5PTI7CisKKyAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICB7CisgICAgICAgIGNhc2UgJ14nOgorICAgICAgICAJeworICAgICAgICAJCXN3aXRjaCAoIExBKDIpICkKKyAgICAgICAgCQl7CisgICAgICAgIAkJY2FzZSAnPSc6CisgICAgICAgIAkJCXsKKyAgICAgICAgCQkJCWFsdDE5PTE7CisgICAgICAgIAkJCX0KKyAgICAgICAgCQkgICAgYnJlYWs7CisgICAgICAgIAkJY2FzZSAnOic6CisgICAgICAgIAkJCXsKKyAgICAgICAgCQkJCWFsdDE5PTI7CisgICAgICAgIAkJCX0KKyAgICAgICAgCQkgICAgYnJlYWs7CisKKyAgICAgICAgCQlkZWZhdWx0OgorICAgICAgICAJCSAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgIAkJICAgIHsKKyAgICAgICAgCQkgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCQkgICAgICAgIHJldHVybiA7CisgICAgICAgIAkJICAgIH0KKworICAgICAgICAJCSAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAJCSAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgCQkgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAJCSAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDE5OworICAgICAgICAJCSAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDE7CisKKworICAgICAgICAJCSAgICBnb3RvIHJ1bGVCWE9SX0FTU0lHTkV4OworCisgICAgICAgIAkJfQorCisgICAgICAgIAl9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDE5OworICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgIGdvdG8gcnVsZUJYT1JfQVNTSUdORXg7CisKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYWx0MTkpCisgICAgICAgIHsKKyAgICAJY2FzZSAxOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Njc0NjoyMzogJ149JworICAgIAkgICAgeworICAgIAkgICAgICAgIE1BVENIUyhsaXRfMzczKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlQlhPUl9BU1NJR05FeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDI6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NzQ2OjMxOiAnXjo9JworICAgIAkgICAgeworICAgIAkgICAgICAgIE1BVENIUyhsaXRfMzc0KTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlQlhPUl9BU1NJR05FeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworCisgICAgICAgIH0KKyAgICB9CisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVCWE9SX0FTU0lHTkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZUJYT1JfQVNTSUdORXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBCWE9SX0FTU0lHTgorCisvLyAgIENvbWVzIGZyb206IDY3NDc6MjE6ICggJ149OicgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgQlhPUl9BU1NJR05fQUZURVIKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gQlhPUl9BU1NJR05fQUZURVIKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtQlhPUl9BU1NJR05fQUZURVIocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gQlhPUl9BU1NJR05fQUZURVI7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3NDc6MjE6ICggJ149OicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3NDc6MjM6ICdePTonCisgICAgeworICAgICAgICBNQVRDSFMobGl0XzM3NSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZUJYT1JfQVNTSUdOX0FGVEVSRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisKKyAgICB9CisKKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZUJYT1JfQVNTSUdOX0FGVEVSRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlQlhPUl9BU1NJR05fQUZURVJFeDogOworCit9CisvLyAkQU5UTFIgZW5kIEJYT1JfQVNTSUdOX0FGVEVSCisKKy8vICAgQ29tZXMgZnJvbTogNjc1MjoyOiAoICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnXycgKSAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJzAnIC4uICc5JyB8ICdfJyB8ICcjJyApKiApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBJRAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBJRAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1JRChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBJRDsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Njc1MjoyOiAoICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnXycgKSAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJzAnIC4uICc5JyB8ICdfJyB8ICcjJyApKiApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Njc1Mjo0OiAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJ18nICkgKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICcwJyAuLiAnOScgfCAnXycgfCAnIycgKSoKKyAgICB7CisgICAgICAgIGlmICggKChMQSgxKSA+PSAnQScpICYmIChMQSgxKSA8PSAnWicpKSB8fCBMQSgxKSA9PSAnXycgfHwgKChMQSgxKSA+PSAnYScpICYmIChMQSgxKSA8PSAneicpKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIENPTlNVTUUoKTsKKyAgICAgICAgICAgIEZBSUxFREZMQUc9QU5UTFIzX0ZBTFNFOworCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19NSVNNQVRDSEVEX1NFVF9FWENFUFRJT047CisgICAgICAgICAgICBFWENFUFRJT04tPm5hbWUgICAgICAgICA9ICh2b2lkICopQU5UTFIzX01JU01BVENIRURfU0VUX05BTUU7CisKKyAgICAgICAgICAgIExSRUNPVkVSKCk7CisgICAgICAgICAgICBnb3RvIHJ1bGVJREV4OworICAgICAgICB9CisKKworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NzUyOjI4OiAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJzAnIC4uICc5JyB8ICdfJyB8ICcjJyApKgorCisgICAgICAgIGZvciAoOzspCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBhbHQyMD0yOworICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAnIyc6CisgICAgICAgICAgICBjYXNlICcwJzoKKyAgICAgICAgICAgIGNhc2UgJzEnOgorICAgICAgICAgICAgY2FzZSAnMic6CisgICAgICAgICAgICBjYXNlICczJzoKKyAgICAgICAgICAgIGNhc2UgJzQnOgorICAgICAgICAgICAgY2FzZSAnNSc6CisgICAgICAgICAgICBjYXNlICc2JzoKKyAgICAgICAgICAgIGNhc2UgJzcnOgorICAgICAgICAgICAgY2FzZSAnOCc6CisgICAgICAgICAgICBjYXNlICc5JzoKKyAgICAgICAgICAgIGNhc2UgJ0EnOgorICAgICAgICAgICAgY2FzZSAnQic6CisgICAgICAgICAgICBjYXNlICdDJzoKKyAgICAgICAgICAgIGNhc2UgJ0QnOgorICAgICAgICAgICAgY2FzZSAnRSc6CisgICAgICAgICAgICBjYXNlICdGJzoKKyAgICAgICAgICAgIGNhc2UgJ0cnOgorICAgICAgICAgICAgY2FzZSAnSCc6CisgICAgICAgICAgICBjYXNlICdJJzoKKyAgICAgICAgICAgIGNhc2UgJ0onOgorICAgICAgICAgICAgY2FzZSAnSyc6CisgICAgICAgICAgICBjYXNlICdMJzoKKyAgICAgICAgICAgIGNhc2UgJ00nOgorICAgICAgICAgICAgY2FzZSAnTic6CisgICAgICAgICAgICBjYXNlICdPJzoKKyAgICAgICAgICAgIGNhc2UgJ1AnOgorICAgICAgICAgICAgY2FzZSAnUSc6CisgICAgICAgICAgICBjYXNlICdSJzoKKyAgICAgICAgICAgIGNhc2UgJ1MnOgorICAgICAgICAgICAgY2FzZSAnVCc6CisgICAgICAgICAgICBjYXNlICdVJzoKKyAgICAgICAgICAgIGNhc2UgJ1YnOgorICAgICAgICAgICAgY2FzZSAnVyc6CisgICAgICAgICAgICBjYXNlICdYJzoKKyAgICAgICAgICAgIGNhc2UgJ1knOgorICAgICAgICAgICAgY2FzZSAnWic6CisgICAgICAgICAgICBjYXNlICdfJzoKKyAgICAgICAgICAgIGNhc2UgJ2EnOgorICAgICAgICAgICAgY2FzZSAnYic6CisgICAgICAgICAgICBjYXNlICdjJzoKKyAgICAgICAgICAgIGNhc2UgJ2QnOgorICAgICAgICAgICAgY2FzZSAnZSc6CisgICAgICAgICAgICBjYXNlICdmJzoKKyAgICAgICAgICAgIGNhc2UgJ2cnOgorICAgICAgICAgICAgY2FzZSAnaCc6CisgICAgICAgICAgICBjYXNlICdpJzoKKyAgICAgICAgICAgIGNhc2UgJ2onOgorICAgICAgICAgICAgY2FzZSAnayc6CisgICAgICAgICAgICBjYXNlICdsJzoKKyAgICAgICAgICAgIGNhc2UgJ20nOgorICAgICAgICAgICAgY2FzZSAnbic6CisgICAgICAgICAgICBjYXNlICdvJzoKKyAgICAgICAgICAgIGNhc2UgJ3AnOgorICAgICAgICAgICAgY2FzZSAncSc6CisgICAgICAgICAgICBjYXNlICdyJzoKKyAgICAgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICAgICAgY2FzZSAndCc6CisgICAgICAgICAgICBjYXNlICd1JzoKKyAgICAgICAgICAgIGNhc2UgJ3YnOgorICAgICAgICAgICAgY2FzZSAndyc6CisgICAgICAgICAgICBjYXNlICd4JzoKKyAgICAgICAgICAgIGNhc2UgJ3knOgorICAgICAgICAgICAgY2FzZSAneic6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQyMD0xOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDIwKQorICAgICAgICAgICAgeworICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOgorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgaWYgKCBMQSgxKSA9PSAnIycgfHwgKChMQSgxKSA+PSAnMCcpICYmIChMQSgxKSA8PSAnOScpKSB8fCAoKExBKDEpID49ICdBJykgJiYgKExBKDEpIDw9ICdaJykpIHx8IExBKDEpID09ICdfJyB8fCAoKExBKDEpID49ICdhJykgJiYgKExBKDEpIDw9ICd6JykpICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgQ09OU1VNRSgpOworICAgICAgICAJICAgICAgICAgICAgRkFJTEVERkxBRz1BTlRMUjNfRkFMU0U7CisKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBlbHNlCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX01JU01BVENIRURfU0VUX0VYQ0VQVElPTjsKKyAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+bmFtZSAgICAgICAgID0gKHZvaWQgKilBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfTkFNRTsKKworICAgICAgICAJICAgICAgICAgICAgTFJFQ09WRVIoKTsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZUlERXg7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAJICAgIGdvdG8gbG9vcDIwOwkvKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgKi8KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBsb29wMjA6IDsgLyogSnVtcCBvdXQgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVJREV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZUlERXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBJRAorCisvLyAgIENvbWVzIGZyb206IDY3NjE6MjogKCAnQCcgKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICdfJyApICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnMCcgLi4gJzknIHwgJ18nIHwgJyMnIHwgJyQnICkqICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IEFUX0lECisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIEFUX0lECisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbUFUX0lEKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IEFUX0lEOworCisKKyAgICAJQU5UTFIzX01BUktFUiB0aGVTdGFydCA9IExFWFNUQVRFLT50b2tlblN0YXJ0Q2hhckluZGV4OworICAgIAkvL3NlcDo6QVZNX09TX0RFQlVHIDw8ICJBVF9JRDo+IHN0YXJ0ID0gIiA8PCB0aGVTdGFydDsKKyAgICAgCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NzYxOjI6ICggJ0AnICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnXycgKSAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJzAnIC4uICc5JyB8ICdfJyB8ICcjJyB8ICckJyApKiApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Njc2MTo0OiAnQCcgKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICdfJyApICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnMCcgLi4gJzknIHwgJ18nIHwgJyMnIHwgJyQnICkqCisgICAgeworICAgICAgICBNQVRDSEMoJ0AnKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlQVRfSURFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgeworCisgICAgICAgICAgICAJCXRoZVN0YXJ0ID0gR0VUQ0hBUklOREVYKCk7CisgICAgICAgICAgICAJCS8vc2VwOjpBVk1fT1NfREVCVUcgPDwgIiAgR0VUQ0hBUklOREVYKCkgPSAiIDw8IHRoZVN0YXJ0IDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIAkKKyAgICAgICAgfQorCisKKyAgICAgICAgaWYgKCAoKExBKDEpID49ICdBJykgJiYgKExBKDEpIDw9ICdaJykpIHx8IExBKDEpID09ICdfJyB8fCAoKExBKDEpID49ICdhJykgJiYgKExBKDEpIDw9ICd6JykpICkKKyAgICAgICAgeworICAgICAgICAgICAgQ09OU1VNRSgpOworICAgICAgICAgICAgRkFJTEVERkxBRz1BTlRMUjNfRkFMU0U7CisKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX01JU01BVENIRURfU0VUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIEVYQ0VQVElPTi0+bmFtZSAgICAgICAgID0gKHZvaWQgKilBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfTkFNRTsKKworICAgICAgICAgICAgTFJFQ09WRVIoKTsKKyAgICAgICAgICAgIGdvdG8gcnVsZUFUX0lERXg7CisgICAgICAgIH0KKworCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3NjY6Mjg6ICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnMCcgLi4gJzknIHwgJ18nIHwgJyMnIHwgJyQnICkqCisKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGFsdDIxPTI7CisgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlICcjJzoKKyAgICAgICAgICAgIGNhc2UgJyQnOgorICAgICAgICAgICAgY2FzZSAnMCc6CisgICAgICAgICAgICBjYXNlICcxJzoKKyAgICAgICAgICAgIGNhc2UgJzInOgorICAgICAgICAgICAgY2FzZSAnMyc6CisgICAgICAgICAgICBjYXNlICc0JzoKKyAgICAgICAgICAgIGNhc2UgJzUnOgorICAgICAgICAgICAgY2FzZSAnNic6CisgICAgICAgICAgICBjYXNlICc3JzoKKyAgICAgICAgICAgIGNhc2UgJzgnOgorICAgICAgICAgICAgY2FzZSAnOSc6CisgICAgICAgICAgICBjYXNlICdBJzoKKyAgICAgICAgICAgIGNhc2UgJ0InOgorICAgICAgICAgICAgY2FzZSAnQyc6CisgICAgICAgICAgICBjYXNlICdEJzoKKyAgICAgICAgICAgIGNhc2UgJ0UnOgorICAgICAgICAgICAgY2FzZSAnRic6CisgICAgICAgICAgICBjYXNlICdHJzoKKyAgICAgICAgICAgIGNhc2UgJ0gnOgorICAgICAgICAgICAgY2FzZSAnSSc6CisgICAgICAgICAgICBjYXNlICdKJzoKKyAgICAgICAgICAgIGNhc2UgJ0snOgorICAgICAgICAgICAgY2FzZSAnTCc6CisgICAgICAgICAgICBjYXNlICdNJzoKKyAgICAgICAgICAgIGNhc2UgJ04nOgorICAgICAgICAgICAgY2FzZSAnTyc6CisgICAgICAgICAgICBjYXNlICdQJzoKKyAgICAgICAgICAgIGNhc2UgJ1EnOgorICAgICAgICAgICAgY2FzZSAnUic6CisgICAgICAgICAgICBjYXNlICdTJzoKKyAgICAgICAgICAgIGNhc2UgJ1QnOgorICAgICAgICAgICAgY2FzZSAnVSc6CisgICAgICAgICAgICBjYXNlICdWJzoKKyAgICAgICAgICAgIGNhc2UgJ1cnOgorICAgICAgICAgICAgY2FzZSAnWCc6CisgICAgICAgICAgICBjYXNlICdZJzoKKyAgICAgICAgICAgIGNhc2UgJ1onOgorICAgICAgICAgICAgY2FzZSAnXyc6CisgICAgICAgICAgICBjYXNlICdhJzoKKyAgICAgICAgICAgIGNhc2UgJ2InOgorICAgICAgICAgICAgY2FzZSAnYyc6CisgICAgICAgICAgICBjYXNlICdkJzoKKyAgICAgICAgICAgIGNhc2UgJ2UnOgorICAgICAgICAgICAgY2FzZSAnZic6CisgICAgICAgICAgICBjYXNlICdnJzoKKyAgICAgICAgICAgIGNhc2UgJ2gnOgorICAgICAgICAgICAgY2FzZSAnaSc6CisgICAgICAgICAgICBjYXNlICdqJzoKKyAgICAgICAgICAgIGNhc2UgJ2snOgorICAgICAgICAgICAgY2FzZSAnbCc6CisgICAgICAgICAgICBjYXNlICdtJzoKKyAgICAgICAgICAgIGNhc2UgJ24nOgorICAgICAgICAgICAgY2FzZSAnbyc6CisgICAgICAgICAgICBjYXNlICdwJzoKKyAgICAgICAgICAgIGNhc2UgJ3EnOgorICAgICAgICAgICAgY2FzZSAncic6CisgICAgICAgICAgICBjYXNlICdzJzoKKyAgICAgICAgICAgIGNhc2UgJ3QnOgorICAgICAgICAgICAgY2FzZSAndSc6CisgICAgICAgICAgICBjYXNlICd2JzoKKyAgICAgICAgICAgIGNhc2UgJ3cnOgorICAgICAgICAgICAgY2FzZSAneCc6CisgICAgICAgICAgICBjYXNlICd5JzoKKyAgICAgICAgICAgIGNhc2UgJ3onOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MjE9MTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQyMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIGlmICggKChMQSgxKSA+PSAnIycpICYmIChMQSgxKSA8PSAnJCcpKSB8fCAoKExBKDEpID49ICcwJykgJiYgKExBKDEpIDw9ICc5JykpIHx8ICgoTEEoMSkgPj0gJ0EnKSAmJiAoTEEoMSkgPD0gJ1onKSkgfHwgTEEoMSkgPT0gJ18nIHx8ICgoTEEoMSkgPj0gJ2EnKSAmJiAoTEEoMSkgPD0gJ3onKSkgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBDT05TVU1FKCk7CisgICAgICAgIAkgICAgICAgICAgICBGQUlMRURGTEFHPUFOVExSM19GQUxTRTsKKworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGVsc2UKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfRVhDRVBUSU9OOworICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT5uYW1lICAgICAgICAgPSAodm9pZCAqKUFOVExSM19NSVNNQVRDSEVEX1NFVF9OQU1FOworCisgICAgICAgIAkgICAgICAgICAgICBMUkVDT1ZFUigpOworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlQVRfSURFeDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCWRlZmF1bHQ6CisgICAgICAgIAkgICAgZ290byBsb29wMjE7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxvb3AyMTogOyAvKiBKdW1wIG91dCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworCisKKyAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICB7CisgICAgICAgICAgICAgTEVYU1RBVEUtPnRva2VuU3RhcnRDaGFySW5kZXggPSB0aGVTdGFydDsgIEVNSVQoKTsgCisgICAgICAgIH0KKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVBVF9JREV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZUFUX0lERXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBBVF9JRAorCisvLyAgIENvbWVzIGZyb206IDY3NzU6MjogKCAnXCInICggRVNDX1NFUSB8fiAoICdcXFxcJyB8ICdcIicgKSApKiAnXCInICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFN0cmluZ0xpdGVyYWwKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gU3RyaW5nTGl0ZXJhbAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1TdHJpbmdMaXRlcmFsKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworICAgIF90eXBlCSAgICA9IFN0cmluZ0xpdGVyYWw7CisKKworICAgIAlBTlRMUjNfTUFSS0VSIHRoZVN0YXJ0ID0gTEVYU1RBVEUtPnRva2VuU3RhcnRDaGFySW5kZXg7CisgICAgIAorCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Njc3NToyOiAoICdcIicgKCBFU0NfU0VRIHx+ICggJ1xcXFwnIHwgJ1wiJyApICkqICdcIicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3NzU6NDogJ1wiJyAoIEVTQ19TRVEgfH4gKCAnXFxcXCcgfCAnXCInICkgKSogJ1wiJworICAgIHsKKyAgICAgICAgTUFUQ0hDKCciJyk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVN0cmluZ0xpdGVyYWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgeworICAgICAgICAgICAgIHRoZVN0YXJ0ID0gR0VUQ0hBUklOREVYKCk7IAorICAgICAgICB9CisKKworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2Nzc3OjQ6ICggRVNDX1NFUSB8fiAoICdcXFxcJyB8ICdcIicgKSApKgorCisgICAgICAgIGZvciAoOzspCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBhbHQyMj0zOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgLyogZGZhTG9vcGJhY2tTdGF0ZShrLGVkZ2VzLGVvdFByZWRpY3RzQWx0LGRlc2NyaXB0aW9uLHN0YXRlTnVtYmVyLHNlbVByZWRTdGF0ZSkKKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGludCBMQTIyXzAgPSBMQSgxKTsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTIyXzAgPT0gJ1xcJykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhbHQyMj0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggKCgoTEEyMl8wID49IDB4MDAwMCkgJiYgKExBMjJfMCA8PSAnIScpKSB8fCAoKExBMjJfMCA+PSAnIycpICYmIChMQTIyXzAgPD0gJ1snKSkgfHwgKChMQTIyXzAgPj0gJ10nKSAmJiAoTEEyMl8wIDw9IDB4RkZGRikpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFsdDIyPTI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDIyKQorICAgICAgICAgICAgeworICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3Nzc6NjogRVNDX1NFUQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgLyogNjc3Nzo2OiBFU0NfU0VRICovCisgICAgICAgIAkgICAgICAgIG1FU0NfU0VRKGN0eCApOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVTdHJpbmdMaXRlcmFsRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAyOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3Nzc6MTY6IH4gKCAnXFxcXCcgfCAnXCInICkKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIGlmICggKChMQSgxKSA+PSAweDAwMDApICYmIChMQSgxKSA8PSAnIScpKSB8fCAoKExBKDEpID49ICcjJykgJiYgKExBKDEpIDw9ICdbJykpIHx8ICgoTEEoMSkgPj0gJ10nKSAmJiAoTEEoMSkgPD0gMHhGRkZGKSkgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBDT05TVU1FKCk7CisgICAgICAgIAkgICAgICAgICAgICBGQUlMRURGTEFHPUFOVExSM19GQUxTRTsKKworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGVsc2UKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfRVhDRVBUSU9OOworICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT5uYW1lICAgICAgICAgPSAodm9pZCAqKUFOVExSM19NSVNNQVRDSEVEX1NFVF9OQU1FOworCisgICAgICAgIAkgICAgICAgICAgICBMUkVDT1ZFUigpOworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlU3RyaW5nTGl0ZXJhbEV4OworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJZGVmYXVsdDoKKyAgICAgICAgCSAgICBnb3RvIGxvb3AyMjsJLyogYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbG9vcDIyOiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIHsKKyAgICAgICAgICAgICBMRVhTVEFURS0+dG9rZW5TdGFydENoYXJJbmRleCA9IHRoZVN0YXJ0OyAgRU1JVCgpOyAKKyAgICAgICAgfQorCisKKyAgICAgICAgTUFUQ0hDKCciJyk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVN0cmluZ0xpdGVyYWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVTdHJpbmdMaXRlcmFsRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlU3RyaW5nTGl0ZXJhbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgU3RyaW5nTGl0ZXJhbAorCisvLyAgIENvbWVzIGZyb206IDY3ODY6MjogKCAnXFwnJyAoIEVTQ19TRVEgfH4gKCAnXFwnJyB8ICdcXFxcJyApICkgJ1xcJycgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgQ2hhckxpdGVyYWwKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gQ2hhckxpdGVyYWwKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtQ2hhckxpdGVyYWwocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gQ2hhckxpdGVyYWw7CisKKworICAgIAlBTlRMUjNfTUFSS0VSIHRoZVN0YXJ0ID0gTEVYU1RBVEUtPnRva2VuU3RhcnRDaGFySW5kZXg7CisgICAgIAorCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Njc4NjoyOiAoICdcXCcnICggRVNDX1NFUSB8fiAoICdcXCcnIHwgJ1xcXFwnICkgKSAnXFwnJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Njc4Njo0OiAnXFwnJyAoIEVTQ19TRVEgfH4gKCAnXFwnJyB8ICdcXFxcJyApICkgJ1xcJycKKyAgICB7CisgICAgICAgIE1BVENIQygnXCcnKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlQ2hhckxpdGVyYWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgeworICAgICAgICAgICAgIHRoZVN0YXJ0ID0gR0VUQ0hBUklOREVYKCk7IAorICAgICAgICB9CisKKworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2Nzg4OjQ6ICggRVNDX1NFUSB8fiAoICdcXCcnIHwgJ1xcXFwnICkgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgYWx0MjM9MjsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgTEEyM18wID0gTEEoMSk7CisgICAgICAgICAgICAgICAgaWYgKCAoTEEyM18wID09ICdcXCcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MjM9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoICgoKExBMjNfMCA+PSAweDAwMDApICYmIChMQTIzXzAgPD0gJyYnKSkgfHwgKChMQTIzXzAgPj0gJygnKSAmJiAoTEEyM18wIDw9ICdbJykpIHx8ICgoTEEyM18wID49ICddJykgJiYgKExBMjNfMCA8PSAweEZGRkYpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhbHQyMz0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMjM7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgICAgIGdvdG8gcnVsZUNoYXJMaXRlcmFsRXg7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDIzKQorICAgICAgICAgICAgeworICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3ODg6NjogRVNDX1NFUQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgLyogNjc4ODo2OiBFU0NfU0VRICovCisgICAgICAgIAkgICAgICAgIG1FU0NfU0VRKGN0eCApOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVDaGFyTGl0ZXJhbEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2Nzg4OjE2OiB+ICggJ1xcJycgfCAnXFxcXCcgKQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgaWYgKCAoKExBKDEpID49IDB4MDAwMCkgJiYgKExBKDEpIDw9ICcmJykpIHx8ICgoTEEoMSkgPj0gJygnKSAmJiAoTEEoMSkgPD0gJ1snKSkgfHwgKChMQSgxKSA+PSAnXScpICYmIChMQSgxKSA8PSAweEZGRkYpKSApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIENPTlNVTUUoKTsKKyAgICAgICAgCSAgICAgICAgICAgIEZBSUxFREZMQUc9QU5UTFIzX0ZBTFNFOworCisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgZWxzZQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19NSVNNQVRDSEVEX1NFVF9FWENFUFRJT047CisgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPm5hbWUgICAgICAgICA9ICh2b2lkICopQU5UTFIzX01JU01BVENIRURfU0VUX05BTUU7CisKKyAgICAgICAgCSAgICAgICAgICAgIExSRUNPVkVSKCk7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVDaGFyTGl0ZXJhbEV4OworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICB7CisgICAgICAgICAgICAgTEVYU1RBVEUtPnRva2VuU3RhcnRDaGFySW5kZXggPSB0aGVTdGFydDsgIEVNSVQoKTsgCisgICAgICAgIH0KKworCisgICAgICAgIE1BVENIQygnXCcnKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlQ2hhckxpdGVyYWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVDaGFyTGl0ZXJhbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZUNoYXJMaXRlcmFsRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBDaGFyTGl0ZXJhbAorCisvLyAgIENvbWVzIGZyb206IDY3OTU6MjogKCAoIEludGVnZXJMaXRlcmFsIERPVERPVCApPT4gSW50ZWdlckxpdGVyYWwgfCAoIEZsb2F0TGl0ZXJhbCApPT4gRmxvYXRMaXRlcmFsIHwgSW50ZWdlckxpdGVyYWwgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgTnVtYmVyTGl0ZXJhbAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBOdW1iZXJMaXRlcmFsCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbU51bWJlckxpdGVyYWwocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gTnVtYmVyTGl0ZXJhbDsKKworCisgICAgeworICAgICAgICAvLyAgL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Njc5NToyOiAoICggSW50ZWdlckxpdGVyYWwgRE9URE9UICk9PiBJbnRlZ2VyTGl0ZXJhbCB8ICggRmxvYXRMaXRlcmFsICk9PiBGbG9hdExpdGVyYWwgfCBJbnRlZ2VyTGl0ZXJhbCApCisKKyAgICAgICAgQU5UTFIzX1VJTlQzMiBhbHQyNDsKKworICAgICAgICBhbHQyND0zOworCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBMQTI0XzAgPSBMQSgxKTsKKyAgICAgICAgICAgIGlmICggKExBMjRfMCA9PSAnMCcpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBMjRfMSA9IExBKDIpOworICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMl9mbWwoY3R4KSkgJiYgKExBMjRfMSA9PSAnRicgfHwgTEEyNF8xID09ICdMJyB8fCBMQTI0XzEgPT0gJ2YnKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MjQ9MjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQyX2ZtbChjdHgpKSAmJiAoKChMQTI0XzEgPj0gJzAnKSAmJiAoTEEyNF8xIDw9ICc5JykpIHx8IExBMjRfMSA9PSAnXycpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQyND0yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDJfZm1sKGN0eCkpICYmIChMQTI0XzEgPT0gJy4nKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MjQ9MjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQxX2ZtbChjdHgpKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MjQ9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKEFOVExSM19UUlVFKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MjQ9MzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDI0OworICAgICAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAxOworCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcnVsZU51bWJlckxpdGVyYWxFeDsKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoICgoKExBMjRfMCA+PSAnMScpICYmIChMQTI0XzAgPD0gJzknKSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBMjRfMiA9IExBKDIpOworICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMl9mbWwoY3R4KSkgJiYgKCgoTEEyNF8yID49ICcwJykgJiYgKExBMjRfMiA8PSAnOScpKSB8fCBMQTI0XzIgPT0gJ18nKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MjQ9MjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQyX2ZtbChjdHgpKSAmJiAoTEEyNF8yID09ICdGJyB8fCBMQTI0XzIgPT0gJ0wnIHx8IExBMjRfMiA9PSAnZicpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQyND0yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDJfZm1sKGN0eCkpICYmIChMQTI0XzIgPT0gJy4nKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MjQ9MjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQxX2ZtbChjdHgpKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MjQ9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKEFOVExSM19UUlVFKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MjQ9MzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDI0OworICAgICAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAyOworCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcnVsZU51bWJlckxpdGVyYWxFeDsKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMl9mbWwoY3R4KSkgJiYgKExBMjRfMCA9PSAnXycpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDI0PTI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQyX2ZtbChjdHgpKSAmJiAoTEEyNF8wID09ICcuJykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0MjQ9MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDI0OworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgZ290byBydWxlTnVtYmVyTGl0ZXJhbEV4OworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChhbHQyNCkKKyAgICAgICAgeworICAgIAljYXNlIDE6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2Nzk1OjQ6ICggSW50ZWdlckxpdGVyYWwgRE9URE9UICk9PiBJbnRlZ2VyTGl0ZXJhbAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDY3OTU6NDogKCBJbnRlZ2VyTGl0ZXJhbCBET1RET1QgKT0+IEludGVnZXJMaXRlcmFsICovCisgICAgCSAgICAgICAgbUludGVnZXJMaXRlcmFsKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVOdW1iZXJMaXRlcmFsRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgICBfdHlwZT1JbnRlZ2VyTGl0ZXJhbDsgIAorICAgIAkgICAgICAgIH0KKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Njc5Nzo0OiAoIEZsb2F0TGl0ZXJhbCApPT4gRmxvYXRMaXRlcmFsCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogNjc5Nzo0OiAoIEZsb2F0TGl0ZXJhbCApPT4gRmxvYXRMaXRlcmFsICovCisgICAgCSAgICAgICAgbUZsb2F0TGl0ZXJhbChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlTnVtYmVyTGl0ZXJhbEV4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICAgX3R5cGU9RmxvYXRMaXRlcmFsOyAgICAKKyAgICAJICAgICAgICB9CisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMzoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3OTg6NDogSW50ZWdlckxpdGVyYWwKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiA2Nzk4OjQ6IEludGVnZXJMaXRlcmFsICovCisgICAgCSAgICAgICAgbUludGVnZXJMaXRlcmFsKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVOdW1iZXJMaXRlcmFsRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgICBfdHlwZT1JbnRlZ2VyTGl0ZXJhbDsgIAorICAgIAkgICAgICAgIH0KKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKworICAgICAgICB9CisgICAgfQorCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlTnVtYmVyTGl0ZXJhbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZU51bWJlckxpdGVyYWxFeDogOworCit9CisvLyAkQU5UTFIgZW5kIE51bWJlckxpdGVyYWwKKworLy8gICBDb21lcyBmcm9tOiA2ODAyOjI2OiAoIEZsb2F0ICggSW1hZ2luYXJ5U3VmZml4ICk/ICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IEZsb2F0TGl0ZXJhbAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBGbG9hdExpdGVyYWwKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtRmxvYXRMaXRlcmFsKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjgwMjoyNjogKCBGbG9hdCAoIEltYWdpbmFyeVN1ZmZpeCApPyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjgwMjoyODogRmxvYXQgKCBJbWFnaW5hcnlTdWZmaXggKT8KKyAgICB7CisgICAgICAgIC8qIDY4MDI6Mjg6IEZsb2F0ICggSW1hZ2luYXJ5U3VmZml4ICk/ICovCisgICAgICAgIG1GbG9hdChjdHggKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlRmxvYXRMaXRlcmFsRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4MDI6MzQ6ICggSW1hZ2luYXJ5U3VmZml4ICk/CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBhbHQyNT0yOworICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgJ2knOgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQyNT0xOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDI1KQorICAgICAgICAgICAgeworICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOgorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgaWYgKCBMQSgxKSA9PSAnaScgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBDT05TVU1FKCk7CisgICAgICAgIAkgICAgICAgICAgICBGQUlMRURGTEFHPUFOVExSM19GQUxTRTsKKworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGVsc2UKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfRVhDRVBUSU9OOworICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT5uYW1lICAgICAgICAgPSAodm9pZCAqKUFOVExSM19NSVNNQVRDSEVEX1NFVF9OQU1FOworCisgICAgICAgIAkgICAgICAgICAgICBMUkVDT1ZFUigpOworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlRmxvYXRMaXRlcmFsRXg7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlRmxvYXRMaXRlcmFsRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlRmxvYXRMaXRlcmFsRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBGbG9hdExpdGVyYWwKKworLy8gICBDb21lcyBmcm9tOiA2ODA0OjI2OiAoIEludGVnZXJMaXRlcmFsIERJViBJbnRlZ2VyICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFJhdGlvbmFsTGl0ZXJhbAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBSYXRpb25hbExpdGVyYWwKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtUmF0aW9uYWxMaXRlcmFsKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjgwNDoyNjogKCBJbnRlZ2VyTGl0ZXJhbCBESVYgSW50ZWdlciApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjgwNDoyODogSW50ZWdlckxpdGVyYWwgRElWIEludGVnZXIKKyAgICB7CisgICAgICAgIC8qIDY4MDQ6Mjg6IEludGVnZXJMaXRlcmFsIERJViBJbnRlZ2VyICovCisgICAgICAgIG1JbnRlZ2VyTGl0ZXJhbChjdHggKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlUmF0aW9uYWxMaXRlcmFsRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisgICAgICAgIC8qIDY4MDQ6Mjg6IEludGVnZXJMaXRlcmFsIERJViBJbnRlZ2VyICovCisgICAgICAgIG1ESVYoY3R4ICk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVJhdGlvbmFsTGl0ZXJhbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworICAgICAgICAvKiA2ODA0OjI4OiBJbnRlZ2VyTGl0ZXJhbCBESVYgSW50ZWdlciAqLworICAgICAgICBtSW50ZWdlcihjdHggKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlUmF0aW9uYWxMaXRlcmFsRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisgICAgfQorCisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVSYXRpb25hbExpdGVyYWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVSYXRpb25hbExpdGVyYWxFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFJhdGlvbmFsTGl0ZXJhbAorCisvLyAgIENvbWVzIGZyb206IDY4MDY6MjY6ICggSW50ZWdlciAoIEludFN1ZmZpeCApPyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBJbnRlZ2VyTGl0ZXJhbAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBJbnRlZ2VyTGl0ZXJhbAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1JbnRlZ2VyTGl0ZXJhbChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4MDY6MjY6ICggSW50ZWdlciAoIEludFN1ZmZpeCApPyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjgwNjoyODogSW50ZWdlciAoIEludFN1ZmZpeCApPworICAgIHsKKyAgICAgICAgLyogNjgwNjoyODogSW50ZWdlciAoIEludFN1ZmZpeCApPyAqLworICAgICAgICBtSW50ZWdlcihjdHggKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlSW50ZWdlckxpdGVyYWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjgwNjozNjogKCBJbnRTdWZmaXggKT8KKyAgICAgICAgeworICAgICAgICAgICAgaW50IGFsdDI2PTI7CisgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAnTCc6CisgICAgICAgICAgICAgICAgY2FzZSAnVSc6CisgICAgICAgICAgICAgICAgY2FzZSAndSc6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDI2PTE7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MjYpCisgICAgICAgICAgICB7CisgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjgwNjozNjogSW50U3VmZml4CisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAvKiA2ODA2OjM2OiBJbnRTdWZmaXggKi8KKyAgICAgICAgCSAgICAgICAgbUludFN1ZmZpeChjdHggKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlSW50ZWdlckxpdGVyYWxFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVJbnRlZ2VyTGl0ZXJhbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZUludGVnZXJMaXRlcmFsRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBJbnRlZ2VyTGl0ZXJhbAorCisvLyAgIENvbWVzIGZyb206IDY4MDg6MjY6ICggJ2YnIHwgJ0YnIHwgJ0wnICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IEZsb2F0VHlwZVN1ZmZpeAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBGbG9hdFR5cGVTdWZmaXgKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtRmxvYXRUeXBlU3VmZml4KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjgwODoyNjogKCAnZicgfCAnRicgfCAnTCcgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOgorICAgIHsKKyAgICAgICAgaWYgKCBMQSgxKSA9PSAnRicgfHwgTEEoMSkgPT0gJ0wnIHx8IExBKDEpID09ICdmJyApCisgICAgICAgIHsKKyAgICAgICAgICAgIENPTlNVTUUoKTsKKyAgICAgICAgICAgIEZBSUxFREZMQUc9QU5UTFIzX0ZBTFNFOworCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19NSVNNQVRDSEVEX1NFVF9FWENFUFRJT047CisgICAgICAgICAgICBFWENFUFRJT04tPm5hbWUgICAgICAgICA9ICh2b2lkICopQU5UTFIzX01JU01BVENIRURfU0VUX05BTUU7CisKKyAgICAgICAgICAgIExSRUNPVkVSKCk7CisgICAgICAgICAgICBnb3RvIHJ1bGVGbG9hdFR5cGVTdWZmaXhFeDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZUZsb2F0VHlwZVN1ZmZpeEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZUZsb2F0VHlwZVN1ZmZpeEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgRmxvYXRUeXBlU3VmZml4CisKKy8vICAgQ29tZXMgZnJvbTogNjgwOToyNjogKCAnaScgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgSW1hZ2luYXJ5U3VmZml4CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIEltYWdpbmFyeVN1ZmZpeAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1JbWFnaW5hcnlTdWZmaXgocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2ODA5OjI2OiAoICdpJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjgwOToyODogJ2knCisgICAgeworICAgICAgICBNQVRDSEMoJ2knKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlSW1hZ2luYXJ5U3VmZml4RXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlSW1hZ2luYXJ5U3VmZml4RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlSW1hZ2luYXJ5U3VmZml4RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBJbWFnaW5hcnlTdWZmaXgKKworLy8gICBDb21lcyBmcm9tOiA2ODEwOjI2OiAoICdMJyB8ICd1JyB8ICdVJyB8ICdMdScgfCAnTFUnIHwgJ3VMJyB8ICdVTCcgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgSW50U3VmZml4CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIEludFN1ZmZpeAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1JbnRTdWZmaXgocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisKKyAgICB7CisgICAgICAgIC8vICAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2ODEwOjI2OiAoICdMJyB8ICd1JyB8ICdVJyB8ICdMdScgfCAnTFUnIHwgJ3VMJyB8ICdVTCcgKQorCisgICAgICAgIEFOVExSM19VSU5UMzIgYWx0Mjc7CisKKyAgICAgICAgYWx0Mjc9NzsKKworICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAnTCc6CisgICAgICAgIAl7CisgICAgICAgIAkJc3dpdGNoICggTEEoMikgKQorICAgICAgICAJCXsKKyAgICAgICAgCQljYXNlICd1JzoKKyAgICAgICAgCQkJeworICAgICAgICAJCQkJYWx0Mjc9NDsKKyAgICAgICAgCQkJfQorICAgICAgICAJCSAgICBicmVhazsKKyAgICAgICAgCQljYXNlICdVJzoKKyAgICAgICAgCQkJeworICAgICAgICAJCQkJYWx0Mjc9NTsKKyAgICAgICAgCQkJfQorICAgICAgICAJCSAgICBicmVhazsKKworICAgICAgICAJCWRlZmF1bHQ6CisgICAgICAgIAkJICAgIGFsdDI3PTE7CisgICAgICAgIAkJfQorCisgICAgICAgIAl9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAndSc6CisgICAgICAgIAl7CisgICAgICAgIAkJc3dpdGNoICggTEEoMikgKQorICAgICAgICAJCXsKKyAgICAgICAgCQljYXNlICdMJzoKKyAgICAgICAgCQkJeworICAgICAgICAJCQkJYWx0Mjc9NjsKKyAgICAgICAgCQkJfQorICAgICAgICAJCSAgICBicmVhazsKKworICAgICAgICAJCWRlZmF1bHQ6CisgICAgICAgIAkJICAgIGFsdDI3PTI7CisgICAgICAgIAkJfQorCisgICAgICAgIAl9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnVSc6CisgICAgICAgIAl7CisgICAgICAgIAkJc3dpdGNoICggTEEoMikgKQorICAgICAgICAJCXsKKyAgICAgICAgCQljYXNlICdMJzoKKyAgICAgICAgCQkJeworICAgICAgICAJCQkJYWx0Mjc9NzsKKyAgICAgICAgCQkJfQorICAgICAgICAJCSAgICBicmVhazsKKworICAgICAgICAJCWRlZmF1bHQ6CisgICAgICAgIAkJICAgIGFsdDI3PTM7CisgICAgICAgIAkJfQorCisgICAgICAgIAl9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDI3OworICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgIGdvdG8gcnVsZUludFN1ZmZpeEV4OworCisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGFsdDI3KQorICAgICAgICB7CisgICAgCWNhc2UgMToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4MTA6Mjg6ICdMJworICAgIAkgICAgeworICAgIAkgICAgICAgIE1BVENIQygnTCcpOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVJbnRTdWZmaXhFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4MTA6MzI6ICd1JworICAgIAkgICAgeworICAgIAkgICAgICAgIE1BVENIQygndScpOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVJbnRTdWZmaXhFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMzoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4MTA6MzY6ICdVJworICAgIAkgICAgeworICAgIAkgICAgICAgIE1BVENIQygnVScpOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVJbnRTdWZmaXhFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgNDoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4MTA6NDA6ICdMdScKKyAgICAJICAgIHsKKyAgICAJICAgICAgICBNQVRDSFMobGl0XzM3Nik7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZUludFN1ZmZpeEV4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgNToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4MTA6NDU6ICdMVScKKyAgICAJICAgIHsKKyAgICAJICAgICAgICBNQVRDSFMobGl0XzM3Nyk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZUludFN1ZmZpeEV4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgNjoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4MTA6NTA6ICd1TCcKKyAgICAJICAgIHsKKyAgICAJICAgICAgICBNQVRDSFMobGl0XzM3OCk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZUludFN1ZmZpeEV4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgNzoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4MTA6NTU6ICdVTCcKKyAgICAJICAgIHsKKyAgICAJICAgICAgICBNQVRDSFMobGl0XzM3OSk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZUludFN1ZmZpeEV4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZUludFN1ZmZpeEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZUludFN1ZmZpeEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgSW50U3VmZml4CisKKy8vICAgQ29tZXMgZnJvbTogNjgxMjoyNjogKCBEZWNpbWFsIHwgQmluYXJ5IHwgT2N0YWwgfCBIZXhhZGVjaW1hbCApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBJbnRlZ2VyCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIEludGVnZXIKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtSW50ZWdlcihwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKworICAgIHsKKyAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4MTI6MjY6ICggRGVjaW1hbCB8IEJpbmFyeSB8IE9jdGFsIHwgSGV4YWRlY2ltYWwgKQorCisgICAgICAgIEFOVExSM19VSU5UMzIgYWx0Mjg7CisKKyAgICAgICAgYWx0Mjg9NDsKKworICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAnMCc6CisgICAgICAgIAl7CisgICAgICAgIAkJc3dpdGNoICggTEEoMikgKQorICAgICAgICAJCXsKKyAgICAgICAgCQljYXNlICdCJzoKKyAgICAgICAgCQljYXNlICdiJzoKKyAgICAgICAgCQkJeworICAgICAgICAJCQkJYWx0Mjg9MjsKKyAgICAgICAgCQkJfQorICAgICAgICAJCSAgICBicmVhazsKKyAgICAgICAgCQljYXNlICdYJzoKKyAgICAgICAgCQljYXNlICd4JzoKKyAgICAgICAgCQkJeworICAgICAgICAJCQkJYWx0Mjg9NDsKKyAgICAgICAgCQkJfQorICAgICAgICAJCSAgICBicmVhazsKKyAgICAgICAgCQljYXNlICcwJzoKKyAgICAgICAgCQljYXNlICcxJzoKKyAgICAgICAgCQljYXNlICcyJzoKKyAgICAgICAgCQljYXNlICczJzoKKyAgICAgICAgCQljYXNlICc0JzoKKyAgICAgICAgCQljYXNlICc1JzoKKyAgICAgICAgCQljYXNlICc2JzoKKyAgICAgICAgCQljYXNlICc3JzoKKyAgICAgICAgCQljYXNlICdfJzoKKyAgICAgICAgCQkJeworICAgICAgICAJCQkJYWx0Mjg9MzsKKyAgICAgICAgCQkJfQorICAgICAgICAJCSAgICBicmVhazsKKworICAgICAgICAJCWRlZmF1bHQ6CisgICAgICAgIAkJICAgIGFsdDI4PTE7CisgICAgICAgIAkJfQorCisgICAgICAgIAl9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnMSc6CisgICAgICAgIGNhc2UgJzInOgorICAgICAgICBjYXNlICczJzoKKyAgICAgICAgY2FzZSAnNCc6CisgICAgICAgIGNhc2UgJzUnOgorICAgICAgICBjYXNlICc2JzoKKyAgICAgICAgY2FzZSAnNyc6CisgICAgICAgIGNhc2UgJzgnOgorICAgICAgICBjYXNlICc5JzoKKyAgICAgICAgCXsKKyAgICAgICAgCQlhbHQyOD0xOworICAgICAgICAJfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAyODsKKyAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICBnb3RvIHJ1bGVJbnRlZ2VyRXg7CisKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYWx0MjgpCisgICAgICAgIHsKKyAgICAJY2FzZSAxOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjgxMjoyODogRGVjaW1hbAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDY4MTI6Mjg6IERlY2ltYWwgKi8KKyAgICAJICAgICAgICBtRGVjaW1hbChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlSW50ZWdlckV4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDI6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2ODEyOjM4OiBCaW5hcnkKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiA2ODEyOjM4OiBCaW5hcnkgKi8KKyAgICAJICAgICAgICBtQmluYXJ5KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVJbnRlZ2VyRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMzoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4MTI6NDc6IE9jdGFsCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogNjgxMjo0NzogT2N0YWwgKi8KKyAgICAJICAgICAgICBtT2N0YWwoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZUludGVnZXJFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSA0OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjgxMjo1NTogSGV4YWRlY2ltYWwKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiA2ODEyOjU1OiBIZXhhZGVjaW1hbCAqLworICAgIAkgICAgICAgIG1IZXhhZGVjaW1hbChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlSW50ZWdlckV4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVJbnRlZ2VyRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlSW50ZWdlckV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgSW50ZWdlcgorCisvLyAgIENvbWVzIGZyb206IDY4MTM6MjY6ICggJzAnIHwgJzEnIC4uICc5JyAoIERlY2ltYWxEaWdpdCB8ICdfJyApKiApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBEZWNpbWFsCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIERlY2ltYWwKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtRGVjaW1hbChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKworICAgIHsKKyAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4MTM6MjY6ICggJzAnIHwgJzEnIC4uICc5JyAoIERlY2ltYWxEaWdpdCB8ICdfJyApKiApCisKKyAgICAgICAgQU5UTFIzX1VJTlQzMiBhbHQzMDsKKworICAgICAgICBhbHQzMD0yOworCisgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgeworICAgICAgICBjYXNlICcwJzoKKyAgICAgICAgCXsKKyAgICAgICAgCQlhbHQzMD0xOworICAgICAgICAJfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzEnOgorICAgICAgICBjYXNlICcyJzoKKyAgICAgICAgY2FzZSAnMyc6CisgICAgICAgIGNhc2UgJzQnOgorICAgICAgICBjYXNlICc1JzoKKyAgICAgICAgY2FzZSAnNic6CisgICAgICAgIGNhc2UgJzcnOgorICAgICAgICBjYXNlICc4JzoKKyAgICAgICAgY2FzZSAnOSc6CisgICAgICAgIAl7CisgICAgICAgIAkJYWx0MzA9MjsKKyAgICAgICAgCX0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMzA7CisgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgZ290byBydWxlRGVjaW1hbEV4OworCisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGFsdDMwKQorICAgICAgICB7CisgICAgCWNhc2UgMToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4MTM6Mjg6ICcwJworICAgIAkgICAgeworICAgIAkgICAgICAgIE1BVENIQygnMCcpOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVEZWNpbWFsRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDI6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2ODEzOjM0OiAnMScgLi4gJzknICggRGVjaW1hbERpZ2l0IHwgJ18nICkqCisgICAgCSAgICB7CisgICAgCSAgICAgICAgTUFUQ0hSQU5HRSgnMScsICc5Jyk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZURlY2ltYWxFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4MTM6NDM6ICggRGVjaW1hbERpZ2l0IHwgJ18nICkqCisKKyAgICAJICAgICAgICBmb3IgKDs7KQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgaW50IGFsdDI5PTI7CisgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAJICAgICAgICAgICAgeworICAgIAkgICAgICAgICAgICBjYXNlICcwJzoKKyAgICAJICAgICAgICAgICAgY2FzZSAnMSc6CisgICAgCSAgICAgICAgICAgIGNhc2UgJzInOgorICAgIAkgICAgICAgICAgICBjYXNlICczJzoKKyAgICAJICAgICAgICAgICAgY2FzZSAnNCc6CisgICAgCSAgICAgICAgICAgIGNhc2UgJzUnOgorICAgIAkgICAgICAgICAgICBjYXNlICc2JzoKKyAgICAJICAgICAgICAgICAgY2FzZSAnNyc6CisgICAgCSAgICAgICAgICAgIGNhc2UgJzgnOgorICAgIAkgICAgICAgICAgICBjYXNlICc5JzoKKyAgICAJICAgICAgICAgICAgY2FzZSAnXyc6CisgICAgCSAgICAgICAgICAgIAl7CisgICAgCSAgICAgICAgICAgIAkJYWx0Mjk9MTsKKyAgICAJICAgICAgICAgICAgCX0KKyAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgCSAgICAgICAgICAgIH0KKworICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDI5KQorICAgIAkgICAgICAgICAgICB7CisgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOgorICAgIAkgICAgICAgIAkgICAgeworICAgIAkgICAgICAgIAkgICAgICAgIGlmICggKChMQSgxKSA+PSAnMCcpICYmIChMQSgxKSA8PSAnOScpKSB8fCBMQSgxKSA9PSAnXycgKQorICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAJICAgICAgICAgICAgQ09OU1VNRSgpOworICAgIAkgICAgICAgIAkgICAgICAgICAgICBGQUlMRURGTEFHPUFOVExSM19GQUxTRTsKKworICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICAJICAgICAgICBlbHNlCisgICAgCSAgICAgICAgCSAgICAgICAgeworICAgIAkgICAgICAgIAkgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgIAkgICAgICAgIAkgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgIAkgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19NSVNNQVRDSEVEX1NFVF9FWENFUFRJT047CisgICAgCSAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+bmFtZSAgICAgICAgID0gKHZvaWQgKilBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfTkFNRTsKKworICAgIAkgICAgICAgIAkgICAgICAgICAgICBMUkVDT1ZFUigpOworICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVEZWNpbWFsRXg7CisgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAJICAgICAgICAJICAgIH0KKyAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgCSAgICAgICAgCWRlZmF1bHQ6CisgICAgCSAgICAgICAgCSAgICBnb3RvIGxvb3AyOTsJLyogYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAJICAgICAgICAgICAgfQorICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBsb29wMjk6IDsgLyogSnVtcCBvdXQgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlRGVjaW1hbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZURlY2ltYWxFeDogOworCit9CisvLyAkQU5UTFIgZW5kIERlY2ltYWwKKworLy8gICBDb21lcyBmcm9tOiA2ODE1OjI2OiAoICggJzBiJyB8ICcwQicgKSAoICcwJyB8ICcxJyB8ICdfJyApKyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBCaW5hcnkKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gQmluYXJ5CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbUJpbmFyeShwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4MTU6MjY6ICggKCAnMGInIHwgJzBCJyApICggJzAnIHwgJzEnIHwgJ18nICkrICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2ODE1OjI4OiAoICcwYicgfCAnMEInICkgKCAnMCcgfCAnMScgfCAnXycgKSsKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4MTU6Mjg6ICggJzBiJyB8ICcwQicgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgYWx0MzE9MjsKKyAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgJzAnOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJc3dpdGNoICggTEEoMikgKQorICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAJCWNhc2UgJ2InOgorICAgICAgICAgICAgCQkJeworICAgICAgICAgICAgCQkJCWFsdDMxPTE7CisgICAgICAgICAgICAJCQl9CisgICAgICAgICAgICAJCSAgICBicmVhazsKKyAgICAgICAgICAgIAkJY2FzZSAnQic6CisgICAgICAgICAgICAJCQl7CisgICAgICAgICAgICAJCQkJYWx0MzE9MjsKKyAgICAgICAgICAgIAkJCX0KKyAgICAgICAgICAgIAkJICAgIGJyZWFrOworCisgICAgICAgICAgICAJCWRlZmF1bHQ6CisgICAgICAgICAgICAJCSAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAJCSAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgCQkgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJCSAgICB9CisKKyAgICAgICAgICAgIAkJICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAJCSAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIAkJICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgIAkJICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMzE7CisgICAgICAgICAgICAJCSAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDE7CisKKworICAgICAgICAgICAgCQkgICAgZ290byBydWxlQmluYXJ5RXg7CisKKyAgICAgICAgICAgIAkJfQorCisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDMxOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgZ290byBydWxlQmluYXJ5RXg7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQzMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2ODE1OjI5OiAnMGInCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBNQVRDSFMobGl0XzM4MCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZUJpbmFyeUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAyOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4MTU6MzY6ICcwQicKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIE1BVENIUyhsaXRfMzgxKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlQmluYXJ5RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4MTU6NDI6ICggJzAnIHwgJzEnIHwgJ18nICkrCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjbnQzMj0wOworCisgICAgICAgICAgICBmb3IgKDs7KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQzMj0yOworICAgICAgICAJc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJeworICAgICAgICAJY2FzZSAnMCc6CisgICAgICAgIAljYXNlICcxJzoKKyAgICAgICAgCWNhc2UgJ18nOgorICAgICAgICAJCXsKKyAgICAgICAgCQkJYWx0MzI9MTsKKyAgICAgICAgCQl9CisgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCX0KKworICAgICAgICAJc3dpdGNoIChhbHQzMikKKyAgICAgICAgCXsKKyAgICAgICAgCSAgICBjYXNlIDE6CisgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOgorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpZiAoICgoTEEoMSkgPj0gJzAnKSAmJiAoTEEoMSkgPD0gJzEnKSkgfHwgTEEoMSkgPT0gJ18nICkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBDT05TVU1FKCk7CisgICAgICAgIAkgICAgICAgICAgICAgICAgRkFJTEVERkxBRz1BTlRMUjNfRkFMU0U7CisKKyAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgIGVsc2UKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19NSVNNQVRDSEVEX1NFVF9FWENFUFRJT047CisgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5uYW1lICAgICAgICAgPSAodm9pZCAqKUFOVExSM19NSVNNQVRDSEVEX1NFVF9OQU1FOworCisgICAgICAgIAkgICAgICAgICAgICAgICAgTFJFQ09WRVIoKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVCaW5hcnlFeDsKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICBkZWZhdWx0OgorCisgICAgICAgIAkJaWYgKCBjbnQzMiA+PSAxICkKKyAgICAgICAgCQl7CisgICAgICAgIAkJICAgIGdvdG8gbG9vcDMyOworICAgICAgICAJCX0KKyAgICAgICAgCQlpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgIAkJeworICAgICAgICAJCSAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkJICAgIHJldHVybiA7CisgICAgICAgIAkJfQorCisgICAgICAgIAkJLyogbWlzbWF0Y2hlZFNldEV4KCkKKyAgICAgICAgCQkgKi8KKyAgICAgICAgCQlDT05TVFJVQ1RFWCgpOworICAgICAgICAJCUVYQ0VQVElPTi0+dHlwZSA9IEFOVExSM19FQVJMWV9FWElUX0VYQ0VQVElPTjsKKyAgICAgICAgCQlFWENFUFRJT04tPm5hbWUgPSAodm9pZCAqKUFOVExSM19FQVJMWV9FWElUX05BTUU7CisKKworICAgICAgICAJCWdvdG8gcnVsZUJpbmFyeUV4OworICAgICAgICAJfQorICAgICAgICAJY250MzIrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvb3AzMjogOwkvKiBKdW1wIHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlQmluYXJ5RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlQmluYXJ5RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBCaW5hcnkKKworLy8gICBDb21lcyBmcm9tOiA2ODE2OjI2OiAoICcwJyAoIE9jdGFsRGlnaXQgfCAnXycgKSsgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgT2N0YWwKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gT2N0YWwKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtT2N0YWwocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2ODE2OjI2OiAoICcwJyAoIE9jdGFsRGlnaXQgfCAnXycgKSsgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4MTY6Mjg6ICcwJyAoIE9jdGFsRGlnaXQgfCAnXycgKSsKKyAgICB7CisgICAgICAgIE1BVENIQygnMCcpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVPY3RhbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjgxNjozMjogKCBPY3RhbERpZ2l0IHwgJ18nICkrCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjbnQzMz0wOworCisgICAgICAgICAgICBmb3IgKDs7KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQzMz0yOworICAgICAgICAJc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJeworICAgICAgICAJY2FzZSAnMCc6CisgICAgICAgIAljYXNlICcxJzoKKyAgICAgICAgCWNhc2UgJzInOgorICAgICAgICAJY2FzZSAnMyc6CisgICAgICAgIAljYXNlICc0JzoKKyAgICAgICAgCWNhc2UgJzUnOgorICAgICAgICAJY2FzZSAnNic6CisgICAgICAgIAljYXNlICc3JzoKKyAgICAgICAgCWNhc2UgJ18nOgorICAgICAgICAJCXsKKyAgICAgICAgCQkJYWx0MzM9MTsKKyAgICAgICAgCQl9CisgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCX0KKworICAgICAgICAJc3dpdGNoIChhbHQzMykKKyAgICAgICAgCXsKKyAgICAgICAgCSAgICBjYXNlIDE6CisgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOgorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpZiAoICgoTEEoMSkgPj0gJzAnKSAmJiAoTEEoMSkgPD0gJzcnKSkgfHwgTEEoMSkgPT0gJ18nICkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBDT05TVU1FKCk7CisgICAgICAgIAkgICAgICAgICAgICAgICAgRkFJTEVERkxBRz1BTlRMUjNfRkFMU0U7CisKKyAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgIGVsc2UKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19NSVNNQVRDSEVEX1NFVF9FWENFUFRJT047CisgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5uYW1lICAgICAgICAgPSAodm9pZCAqKUFOVExSM19NSVNNQVRDSEVEX1NFVF9OQU1FOworCisgICAgICAgIAkgICAgICAgICAgICAgICAgTFJFQ09WRVIoKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVPY3RhbEV4OworICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBicmVhazsKKworICAgICAgICAJICAgIGRlZmF1bHQ6CisKKyAgICAgICAgCQlpZiAoIGNudDMzID49IDEgKQorICAgICAgICAJCXsKKyAgICAgICAgCQkgICAgZ290byBsb29wMzM7CisgICAgICAgIAkJfQorICAgICAgICAJCWlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgCQl7CisgICAgICAgIAkJICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCQkgICAgcmV0dXJuIDsKKyAgICAgICAgCQl9CisKKyAgICAgICAgCQkvKiBtaXNtYXRjaGVkU2V0RXgoKQorICAgICAgICAJCSAqLworICAgICAgICAJCUNPTlNUUlVDVEVYKCk7CisgICAgICAgIAkJRVhDRVBUSU9OLT50eXBlID0gQU5UTFIzX0VBUkxZX0VYSVRfRVhDRVBUSU9OOworICAgICAgICAJCUVYQ0VQVElPTi0+bmFtZSA9ICh2b2lkICopQU5UTFIzX0VBUkxZX0VYSVRfTkFNRTsKKworCisgICAgICAgIAkJZ290byBydWxlT2N0YWxFeDsKKyAgICAgICAgCX0KKyAgICAgICAgCWNudDMzKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb29wMzM6IDsJLyogSnVtcCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZU9jdGFsRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlT2N0YWxFeDogOworCit9CisvLyAkQU5UTFIgZW5kIE9jdGFsCisKKy8vICAgQ29tZXMgZnJvbTogNjgxNzoyNjogKCAoICcweCcgfCAnMFgnICkgKCBIZXhEaWdpdCB8ICdfJyApKyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBIZXhhZGVjaW1hbAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBIZXhhZGVjaW1hbAorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1IZXhhZGVjaW1hbChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4MTc6MjY6ICggKCAnMHgnIHwgJzBYJyApICggSGV4RGlnaXQgfCAnXycgKSsgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4MTc6Mjg6ICggJzB4JyB8ICcwWCcgKSAoIEhleERpZ2l0IHwgJ18nICkrCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2ODE3OjI4OiAoICcweCcgfCAnMFgnICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGFsdDM0PTI7CisgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlICcwJzoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCXN3aXRjaCAoIExBKDIpICkKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQljYXNlICd4JzoKKyAgICAgICAgICAgIAkJCXsKKyAgICAgICAgICAgIAkJCQlhbHQzND0xOworICAgICAgICAgICAgCQkJfQorICAgICAgICAgICAgCQkgICAgYnJlYWs7CisgICAgICAgICAgICAJCWNhc2UgJ1gnOgorICAgICAgICAgICAgCQkJeworICAgICAgICAgICAgCQkJCWFsdDM0PTI7CisgICAgICAgICAgICAJCQl9CisgICAgICAgICAgICAJCSAgICBicmVhazsKKworICAgICAgICAgICAgCQlkZWZhdWx0OgorICAgICAgICAgICAgCQkgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgCQkgICAgeworICAgICAgICAgICAgCQkgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgIAkJICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCQkgICAgfQorCisgICAgICAgICAgICAJCSAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgCQkgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAJCSAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAJCSAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDM0OworICAgICAgICAgICAgCQkgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAxOworCisKKyAgICAgICAgICAgIAkJICAgIGdvdG8gcnVsZUhleGFkZWNpbWFsRXg7CisKKyAgICAgICAgICAgIAkJfQorCisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDM0OworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgZ290byBydWxlSGV4YWRlY2ltYWxFeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDM0KQorICAgICAgICAgICAgeworICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4MTc6Mjk6ICcweCcKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIE1BVENIUyhsaXRfMzgyKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlSGV4YWRlY2ltYWxFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2ODE3OjM2OiAnMFgnCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBNQVRDSFMobGl0XzM4Myk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZUhleGFkZWNpbWFsRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4MTc6NDI6ICggSGV4RGlnaXQgfCAnXycgKSsKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGNudDM1PTA7CisKKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDM1PTI7CisgICAgICAgIAlzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAl7CisgICAgICAgIAljYXNlICcwJzoKKyAgICAgICAgCWNhc2UgJzEnOgorICAgICAgICAJY2FzZSAnMic6CisgICAgICAgIAljYXNlICczJzoKKyAgICAgICAgCWNhc2UgJzQnOgorICAgICAgICAJY2FzZSAnNSc6CisgICAgICAgIAljYXNlICc2JzoKKyAgICAgICAgCWNhc2UgJzcnOgorICAgICAgICAJY2FzZSAnOCc6CisgICAgICAgIAljYXNlICc5JzoKKyAgICAgICAgCWNhc2UgJ0EnOgorICAgICAgICAJY2FzZSAnQic6CisgICAgICAgIAljYXNlICdDJzoKKyAgICAgICAgCWNhc2UgJ0QnOgorICAgICAgICAJY2FzZSAnRSc6CisgICAgICAgIAljYXNlICdGJzoKKyAgICAgICAgCWNhc2UgJ18nOgorICAgICAgICAJY2FzZSAnYSc6CisgICAgICAgIAljYXNlICdiJzoKKyAgICAgICAgCWNhc2UgJ2MnOgorICAgICAgICAJY2FzZSAnZCc6CisgICAgICAgIAljYXNlICdlJzoKKyAgICAgICAgCWNhc2UgJ2YnOgorICAgICAgICAJCXsKKyAgICAgICAgCQkJYWx0MzU9MTsKKyAgICAgICAgCQl9CisgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCX0KKworICAgICAgICAJc3dpdGNoIChhbHQzNSkKKyAgICAgICAgCXsKKyAgICAgICAgCSAgICBjYXNlIDE6CisgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOgorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpZiAoICgoTEEoMSkgPj0gJzAnKSAmJiAoTEEoMSkgPD0gJzknKSkgfHwgKChMQSgxKSA+PSAnQScpICYmIChMQSgxKSA8PSAnRicpKSB8fCBMQSgxKSA9PSAnXycgfHwgKChMQSgxKSA+PSAnYScpICYmIChMQSgxKSA8PSAnZicpKSApCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgQ09OU1VNRSgpOworICAgICAgICAJICAgICAgICAgICAgICAgIEZBSUxFREZMQUc9QU5UTFIzX0ZBTFNFOworCisgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICBlbHNlCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfRVhDRVBUSU9OOworICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bmFtZSAgICAgICAgID0gKHZvaWQgKilBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfTkFNRTsKKworICAgICAgICAJICAgICAgICAgICAgICAgIExSRUNPVkVSKCk7CisgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlSGV4YWRlY2ltYWxFeDsKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICBkZWZhdWx0OgorCisgICAgICAgIAkJaWYgKCBjbnQzNSA+PSAxICkKKyAgICAgICAgCQl7CisgICAgICAgIAkJICAgIGdvdG8gbG9vcDM1OworICAgICAgICAJCX0KKyAgICAgICAgCQlpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgIAkJeworICAgICAgICAJCSAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkJICAgIHJldHVybiA7CisgICAgICAgIAkJfQorCisgICAgICAgIAkJLyogbWlzbWF0Y2hlZFNldEV4KCkKKyAgICAgICAgCQkgKi8KKyAgICAgICAgCQlDT05TVFJVQ1RFWCgpOworICAgICAgICAJCUVYQ0VQVElPTi0+dHlwZSA9IEFOVExSM19FQVJMWV9FWElUX0VYQ0VQVElPTjsKKyAgICAgICAgCQlFWENFUFRJT04tPm5hbWUgPSAodm9pZCAqKUFOVExSM19FQVJMWV9FWElUX05BTUU7CisKKworICAgICAgICAJCWdvdG8gcnVsZUhleGFkZWNpbWFsRXg7CisgICAgICAgIAl9CisgICAgICAgIAljbnQzNSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9vcDM1OiA7CS8qIEp1bXAgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVIZXhhZGVjaW1hbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZUhleGFkZWNpbWFsRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBIZXhhZGVjaW1hbAorCisvLyAgIENvbWVzIGZyb206IDY4MTk6MjY6ICggJzAnIC4uICc5JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBEZWNpbWFsRGlnaXQKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gRGVjaW1hbERpZ2l0CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbURlY2ltYWxEaWdpdChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4MTk6MjY6ICggJzAnIC4uICc5JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6CisgICAgeworICAgICAgICBpZiAoICgoTEEoMSkgPj0gJzAnKSAmJiAoTEEoMSkgPD0gJzknKSkgKQorICAgICAgICB7CisgICAgICAgICAgICBDT05TVU1FKCk7CisgICAgICAgICAgICBGQUlMRURGTEFHPUFOVExSM19GQUxTRTsKKworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfRVhDRVBUSU9OOworICAgICAgICAgICAgRVhDRVBUSU9OLT5uYW1lICAgICAgICAgPSAodm9pZCAqKUFOVExSM19NSVNNQVRDSEVEX1NFVF9OQU1FOworCisgICAgICAgICAgICBMUkVDT1ZFUigpOworICAgICAgICAgICAgZ290byBydWxlRGVjaW1hbERpZ2l0RXg7CisgICAgICAgIH0KKworCisgICAgfQorCisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVEZWNpbWFsRGlnaXRFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVEZWNpbWFsRGlnaXRFeDogOworCit9CisvLyAkQU5UTFIgZW5kIERlY2ltYWxEaWdpdAorCisvLyAgIENvbWVzIGZyb206IDY4MjA6MjY6ICggJzAnIC4uICc3JyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBPY3RhbERpZ2l0CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIE9jdGFsRGlnaXQKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtT2N0YWxEaWdpdChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4MjA6MjY6ICggJzAnIC4uICc3JyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6CisgICAgeworICAgICAgICBpZiAoICgoTEEoMSkgPj0gJzAnKSAmJiAoTEEoMSkgPD0gJzcnKSkgKQorICAgICAgICB7CisgICAgICAgICAgICBDT05TVU1FKCk7CisgICAgICAgICAgICBGQUlMRURGTEFHPUFOVExSM19GQUxTRTsKKworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfRVhDRVBUSU9OOworICAgICAgICAgICAgRVhDRVBUSU9OLT5uYW1lICAgICAgICAgPSAodm9pZCAqKUFOVExSM19NSVNNQVRDSEVEX1NFVF9OQU1FOworCisgICAgICAgICAgICBMUkVDT1ZFUigpOworICAgICAgICAgICAgZ290byBydWxlT2N0YWxEaWdpdEV4OworICAgICAgICB9CisKKworICAgIH0KKworCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlT2N0YWxEaWdpdEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZU9jdGFsRGlnaXRFeDogOworCit9CisvLyAkQU5UTFIgZW5kIE9jdGFsRGlnaXQKKworLy8gICBDb21lcyBmcm9tOiA2ODIxOjI2OiAoICggJzAnIC4uICc5JyB8ICdhJyAuLiAnZicgfCAnQScgLi4gJ0YnICkgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgSGV4RGlnaXQKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gSGV4RGlnaXQKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtSGV4RGlnaXQocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2ODIxOjI2OiAoICggJzAnIC4uICc5JyB8ICdhJyAuLiAnZicgfCAnQScgLi4gJ0YnICkgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOgorICAgIHsKKyAgICAgICAgaWYgKCAoKExBKDEpID49ICcwJykgJiYgKExBKDEpIDw9ICc5JykpIHx8ICgoTEEoMSkgPj0gJ0EnKSAmJiAoTEEoMSkgPD0gJ0YnKSkgfHwgKChMQSgxKSA+PSAnYScpICYmIChMQSgxKSA8PSAnZicpKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIENPTlNVTUUoKTsKKyAgICAgICAgICAgIEZBSUxFREZMQUc9QU5UTFIzX0ZBTFNFOworCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19NSVNNQVRDSEVEX1NFVF9FWENFUFRJT047CisgICAgICAgICAgICBFWENFUFRJT04tPm5hbWUgICAgICAgICA9ICh2b2lkICopQU5UTFIzX01JU01BVENIRURfU0VUX05BTUU7CisKKyAgICAgICAgICAgIExSRUNPVkVSKCk7CisgICAgICAgICAgICBnb3RvIHJ1bGVIZXhEaWdpdEV4OworICAgICAgICB9CisKKworICAgIH0KKworCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlSGV4RGlnaXRFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVIZXhEaWdpdEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgSGV4RGlnaXQKKworLy8gICBDb21lcyBmcm9tOiA2ODIzOjI2OiAoICdlJyB8ICdFJyB8ICdlKycgfCAnRSsnIHwgJ2UtJyB8ICdFLScgRGVjaW1hbERpZ2l0cyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBEZWNpbWFsRXhwb25lbnQKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gRGVjaW1hbEV4cG9uZW50CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbURlY2ltYWxFeHBvbmVudChwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKworICAgIHsKKyAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4MjM6MjY6ICggJ2UnIHwgJ0UnIHwgJ2UrJyB8ICdFKycgfCAnZS0nIHwgJ0UtJyBEZWNpbWFsRGlnaXRzICkKKworICAgICAgICBBTlRMUjNfVUlOVDMyIGFsdDM2OworCisgICAgICAgIGFsdDM2PTY7CisKKyAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICB7CisgICAgICAgIGNhc2UgJ2UnOgorICAgICAgICAJeworICAgICAgICAJCXN3aXRjaCAoIExBKDIpICkKKyAgICAgICAgCQl7CisgICAgICAgIAkJY2FzZSAnKyc6CisgICAgICAgIAkJCXsKKyAgICAgICAgCQkJCWFsdDM2PTM7CisgICAgICAgIAkJCX0KKyAgICAgICAgCQkgICAgYnJlYWs7CisgICAgICAgIAkJY2FzZSAnLSc6CisgICAgICAgIAkJCXsKKyAgICAgICAgCQkJCWFsdDM2PTU7CisgICAgICAgIAkJCX0KKyAgICAgICAgCQkgICAgYnJlYWs7CisKKyAgICAgICAgCQlkZWZhdWx0OgorICAgICAgICAJCSAgICBhbHQzNj0xOworICAgICAgICAJCX0KKworICAgICAgICAJfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ0UnOgorICAgICAgICAJeworICAgICAgICAJCXN3aXRjaCAoIExBKDIpICkKKyAgICAgICAgCQl7CisgICAgICAgIAkJY2FzZSAnKyc6CisgICAgICAgIAkJCXsKKyAgICAgICAgCQkJCWFsdDM2PTQ7CisgICAgICAgIAkJCX0KKyAgICAgICAgCQkgICAgYnJlYWs7CisgICAgICAgIAkJY2FzZSAnLSc6CisgICAgICAgIAkJCXsKKyAgICAgICAgCQkJCWFsdDM2PTY7CisgICAgICAgIAkJCX0KKyAgICAgICAgCQkgICAgYnJlYWs7CisKKyAgICAgICAgCQlkZWZhdWx0OgorICAgICAgICAJCSAgICBhbHQzNj0yOworICAgICAgICAJCX0KKworICAgICAgICAJfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAzNjsKKyAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICBnb3RvIHJ1bGVEZWNpbWFsRXhwb25lbnRFeDsKKworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChhbHQzNikKKyAgICAgICAgeworICAgIAljYXNlIDE6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2ODIzOjI4OiAnZScKKyAgICAJICAgIHsKKyAgICAJICAgICAgICBNQVRDSEMoJ2UnKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlRGVjaW1hbEV4cG9uZW50RXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDI6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2ODIzOjM0OiAnRScKKyAgICAJICAgIHsKKyAgICAJICAgICAgICBNQVRDSEMoJ0UnKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlRGVjaW1hbEV4cG9uZW50RXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDM6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2ODIzOjQwOiAnZSsnCisgICAgCSAgICB7CisgICAgCSAgICAgICAgTUFUQ0hTKGxpdF8zODQpOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVEZWNpbWFsRXhwb25lbnRFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDQ6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2ODIzOjQ3OiAnRSsnCisgICAgCSAgICB7CisgICAgCSAgICAgICAgTUFUQ0hTKGxpdF8zODUpOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVEZWNpbWFsRXhwb25lbnRFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDU6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2ODIzOjU0OiAnZS0nCisgICAgCSAgICB7CisgICAgCSAgICAgICAgTUFUQ0hTKGxpdF8zODYpOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVEZWNpbWFsRXhwb25lbnRFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDY6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2ODIzOjYxOiAnRS0nIERlY2ltYWxEaWdpdHMKKyAgICAJICAgIHsKKyAgICAJICAgICAgICBNQVRDSFMobGl0XzM4Nyk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZURlY2ltYWxFeHBvbmVudEV4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKworICAgIAkgICAgICAgIC8qIDY4MjM6NjE6ICdFLScgRGVjaW1hbERpZ2l0cyAqLworICAgIAkgICAgICAgIG1EZWNpbWFsRGlnaXRzKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVEZWNpbWFsRXhwb25lbnRFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlRGVjaW1hbEV4cG9uZW50RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlRGVjaW1hbEV4cG9uZW50RXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBEZWNpbWFsRXhwb25lbnQKKworLy8gICBDb21lcyBmcm9tOiA2ODI0OjI2OiAoICggJzAnIC4uICc5JyB8ICdfJyApKyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBEZWNpbWFsRGlnaXRzCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIERlY2ltYWxEaWdpdHMKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtRGVjaW1hbERpZ2l0cyhwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4MjQ6MjY6ICggKCAnMCcgLi4gJzknIHwgJ18nICkrICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2ODI0OjI4OiAoICcwJyAuLiAnOScgfCAnXycgKSsKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4MjQ6Mjg6ICggJzAnIC4uICc5JyB8ICdfJyApKworICAgICAgICB7CisgICAgICAgICAgICBpbnQgY250Mzc9MDsKKworICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0Mzc9MjsKKyAgICAgICAgCXN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCXsKKyAgICAgICAgCWNhc2UgJzAnOgorICAgICAgICAJY2FzZSAnMSc6CisgICAgICAgIAljYXNlICcyJzoKKyAgICAgICAgCWNhc2UgJzMnOgorICAgICAgICAJY2FzZSAnNCc6CisgICAgICAgIAljYXNlICc1JzoKKyAgICAgICAgCWNhc2UgJzYnOgorICAgICAgICAJY2FzZSAnNyc6CisgICAgICAgIAljYXNlICc4JzoKKyAgICAgICAgCWNhc2UgJzknOgorICAgICAgICAJY2FzZSAnXyc6CisgICAgICAgIAkJeworICAgICAgICAJCQlhbHQzNz0xOworICAgICAgICAJCX0KKyAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJfQorCisgICAgICAgIAlzd2l0Y2ggKGFsdDM3KQorICAgICAgICAJeworICAgICAgICAJICAgIGNhc2UgMToKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6CisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGlmICggKChMQSgxKSA+PSAnMCcpICYmIChMQSgxKSA8PSAnOScpKSB8fCBMQSgxKSA9PSAnXycgKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgIENPTlNVTUUoKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBGQUlMRURGTEFHPUFOVExSM19GQUxTRTsKKworICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgZWxzZQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX01JU01BVENIRURfU0VUX0VYQ0VQVElPTjsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPm5hbWUgICAgICAgICA9ICh2b2lkICopQU5UTFIzX01JU01BVENIRURfU0VUX05BTUU7CisKKyAgICAgICAgCSAgICAgICAgICAgICAgICBMUkVDT1ZFUigpOworICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZURlY2ltYWxEaWdpdHNFeDsKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICBkZWZhdWx0OgorCisgICAgICAgIAkJaWYgKCBjbnQzNyA+PSAxICkKKyAgICAgICAgCQl7CisgICAgICAgIAkJICAgIGdvdG8gbG9vcDM3OworICAgICAgICAJCX0KKyAgICAgICAgCQlpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgIAkJeworICAgICAgICAJCSAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkJICAgIHJldHVybiA7CisgICAgICAgIAkJfQorCisgICAgICAgIAkJLyogbWlzbWF0Y2hlZFNldEV4KCkKKyAgICAgICAgCQkgKi8KKyAgICAgICAgCQlDT05TVFJVQ1RFWCgpOworICAgICAgICAJCUVYQ0VQVElPTi0+dHlwZSA9IEFOVExSM19FQVJMWV9FWElUX0VYQ0VQVElPTjsKKyAgICAgICAgCQlFWENFUFRJT04tPm5hbWUgPSAodm9pZCAqKUFOVExSM19FQVJMWV9FWElUX05BTUU7CisKKworICAgICAgICAJCWdvdG8gcnVsZURlY2ltYWxEaWdpdHNFeDsKKyAgICAgICAgCX0KKyAgICAgICAgCWNudDM3Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb29wMzc6IDsJLyogSnVtcCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZURlY2ltYWxEaWdpdHNFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVEZWNpbWFsRGlnaXRzRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBEZWNpbWFsRGlnaXRzCisKKy8vICAgQ29tZXMgZnJvbTogNjgyOToyOiAoZD0gRGVjaW1hbERpZ2l0cyAoIG9wdGlvbnMge2dyZWVkeT10cnVlOyB9IDogRmxvYXRUeXBlU3VmZml4IHwgJy4nIERlY2ltYWxEaWdpdHMgKCBEZWNpbWFsRXhwb25lbnQgKT8gKSB8ICcuJyBEZWNpbWFsRGlnaXRzICggRGVjaW1hbEV4cG9uZW50ICk/ICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IEZsb2F0CisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIEZsb2F0CisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbUZsb2F0KHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKyAgICBwQU5UTFIzX0NPTU1PTl9UT0tFTiBkOworCisKKyAgICBkID0gTlVMTDsKKworCisgICAgeworICAgICAgICAvLyAgL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjgyOToyOiAoZD0gRGVjaW1hbERpZ2l0cyAoIG9wdGlvbnMge2dyZWVkeT10cnVlOyB9IDogRmxvYXRUeXBlU3VmZml4IHwgJy4nIERlY2ltYWxEaWdpdHMgKCBEZWNpbWFsRXhwb25lbnQgKT8gKSB8ICcuJyBEZWNpbWFsRGlnaXRzICggRGVjaW1hbEV4cG9uZW50ICk/ICkKKworICAgICAgICBBTlRMUjNfVUlOVDMyIGFsdDQxOworCisgICAgICAgIGFsdDQxPTI7CisKKyAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICB7CisgICAgICAgIGNhc2UgJzAnOgorICAgICAgICBjYXNlICcxJzoKKyAgICAgICAgY2FzZSAnMic6CisgICAgICAgIGNhc2UgJzMnOgorICAgICAgICBjYXNlICc0JzoKKyAgICAgICAgY2FzZSAnNSc6CisgICAgICAgIGNhc2UgJzYnOgorICAgICAgICBjYXNlICc3JzoKKyAgICAgICAgY2FzZSAnOCc6CisgICAgICAgIGNhc2UgJzknOgorICAgICAgICBjYXNlICdfJzoKKyAgICAgICAgCXsKKyAgICAgICAgCQlhbHQ0MT0xOworICAgICAgICAJfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJy4nOgorICAgICAgICAJeworICAgICAgICAJCWFsdDQxPTI7CisgICAgICAgIAl9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDQxOworICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgIGdvdG8gcnVsZUZsb2F0RXg7CisKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYWx0NDEpCisgICAgICAgIHsKKyAgICAJY2FzZSAxOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjgyOTo0OiBkPSBEZWNpbWFsRGlnaXRzICggb3B0aW9ucyB7Z3JlZWR5PXRydWU7IH0gOiBGbG9hdFR5cGVTdWZmaXggfCAnLicgRGVjaW1hbERpZ2l0cyAoIERlY2ltYWxFeHBvbmVudCApPyApCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogNjgyOTo0OiBkPSBEZWNpbWFsRGlnaXRzICggb3B0aW9ucyB7Z3JlZWR5PXRydWU7IH0gOiBGbG9hdFR5cGVTdWZmaXggfCAnLicgRGVjaW1hbERpZ2l0cyAoIERlY2ltYWxFeHBvbmVudCApPyApICovCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBBTlRMUjNfTUFSS0VSIGRTdGFydDQ3NjkgPSBHRVRDSEFSSU5ERVgoKTsKKyAgICAJICAgICAgICBtRGVjaW1hbERpZ2l0cyhjdHggKTsKKyAgICAJICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICAgICAgeworICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlRmxvYXRFeDsKKyAgICAJICAgICAgICAgICAgfQorICAgIAkgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgICAgIH0KKworICAgIAkgICAgICAgICAgICBkID0gTEVYU1RBVEUtPnRva0ZhY3RvcnktPm5ld1Rva2VuKExFWFNUQVRFLT50b2tGYWN0b3J5KTsKKyAgICAJICAgICAgICAgICAgZC0+c2V0VHlwZShkLCBBTlRMUjNfVE9LRU5fSU5WQUxJRCk7CisgICAgCSAgICAgICAgICAgIGQtPnNldFN0YXJ0SW5kZXgoZCwgZFN0YXJ0NDc2OSk7CisgICAgCSAgICAgICAgICAgIGQtPnNldFN0b3BJbmRleChkLCBHRVRDSEFSSU5ERVgoKS0xKTsKKyAgICAJICAgICAgICAgICAgZC0+aW5wdXQgPSBJTlBVVDsKKyAgICAJICAgICAgICB9CisKKworICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4MzA6NDogKCBvcHRpb25zIHtncmVlZHk9dHJ1ZTsgfSA6IEZsb2F0VHlwZVN1ZmZpeCB8ICcuJyBEZWNpbWFsRGlnaXRzICggRGVjaW1hbEV4cG9uZW50ICk/ICkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGludCBhbHQzOT0yOworICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgCSAgICAgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgY2FzZSAnRic6CisgICAgCSAgICAgICAgICAgIGNhc2UgJ0wnOgorICAgIAkgICAgICAgICAgICBjYXNlICdmJzoKKyAgICAJICAgICAgICAgICAgCXsKKyAgICAJICAgICAgICAgICAgCQlhbHQzOT0xOworICAgIAkgICAgICAgICAgICAJfQorICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgCSAgICAgICAgICAgIGNhc2UgJy4nOgorICAgIAkgICAgICAgICAgICAJeworICAgIAkgICAgICAgICAgICAJCWFsdDM5PTI7CisgICAgCSAgICAgICAgICAgIAl9CisgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKworICAgIAkgICAgICAgICAgICBkZWZhdWx0OgorICAgIAkgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgIAkgICAgICAgICAgICAgICAgeworICAgIAkgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAJICAgICAgICAgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgICAgICAgICAgfQorCisgICAgCSAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDM5OworICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZUZsb2F0RXg7CisKKyAgICAJICAgICAgICAgICAgfQorCisgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0MzkpCisgICAgCSAgICAgICAgICAgIHsKKyAgICAJICAgICAgICAJY2FzZSAxOgorICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjgzMDozNDogRmxvYXRUeXBlU3VmZml4CisgICAgCSAgICAgICAgCSAgICB7CisgICAgCSAgICAgICAgCSAgICAgICAgLyogNjgzMDozNDogRmxvYXRUeXBlU3VmZml4ICovCisgICAgCSAgICAgICAgCSAgICAgICAgbUZsb2F0VHlwZVN1ZmZpeChjdHggKTsKKyAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlRmxvYXRFeDsKKyAgICAJICAgICAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICAgICAgCSAgICB9CisgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAJICAgICAgICAJY2FzZSAyOgorICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjgzMTo2OiAnLicgRGVjaW1hbERpZ2l0cyAoIERlY2ltYWxFeHBvbmVudCApPworICAgIAkgICAgICAgIAkgICAgeworICAgIAkgICAgICAgIAkgICAgICAgIE1BVENIQygnLicpOworICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgCSAgICAgICAgeworICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVGbG9hdEV4OworICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgCSAgICAgICAgeworICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgCSAgICAgICAgCSAgICAgICAgLyogNjgzMTo2OiAnLicgRGVjaW1hbERpZ2l0cyAoIERlY2ltYWxFeHBvbmVudCApPyAqLworICAgIAkgICAgICAgIAkgICAgICAgIG1EZWNpbWFsRGlnaXRzKGN0eCApOworICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgCSAgICAgICAgeworICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVGbG9hdEV4OworICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgCSAgICAgICAgeworICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2ODMxOjI0OiAoIERlY2ltYWxFeHBvbmVudCApPworICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDM4PTI7CisgICAgCSAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAnRSc6CisgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlICdlJzoKKyAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAJCWFsdDM4PTE7CisgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAJICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQzOCkKKyAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgIAkgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2ODMxOjI0OiBEZWNpbWFsRXhwb25lbnQKKyAgICAJICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAvKiA2ODMxOjI0OiBEZWNpbWFsRXhwb25lbnQgKi8KKyAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBtRGVjaW1hbEV4cG9uZW50KGN0eCApOworICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVGbG9hdEV4OworICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAJICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAJICAgICAgICAJICAgICAgICB9CisKKyAgICAJICAgICAgICAJICAgIH0KKyAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgCSAgICAgICAgICAgIH0KKyAgICAJICAgICAgICB9CisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDI6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2ODMzOjU6ICcuJyBEZWNpbWFsRGlnaXRzICggRGVjaW1hbEV4cG9uZW50ICk/CisgICAgCSAgICB7CisgICAgCSAgICAgICAgTUFUQ0hDKCcuJyk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZUZsb2F0RXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKyAgICAJICAgICAgICAvKiA2ODMzOjU6ICcuJyBEZWNpbWFsRGlnaXRzICggRGVjaW1hbEV4cG9uZW50ICk/ICovCisgICAgCSAgICAgICAgbURlY2ltYWxEaWdpdHMoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZUZsb2F0RXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4MzM6MjM6ICggRGVjaW1hbEV4cG9uZW50ICk/CisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBpbnQgYWx0NDA9MjsKKyAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgIAkgICAgICAgICAgICB7CisgICAgCSAgICAgICAgICAgICAgICBjYXNlICdFJzoKKyAgICAJICAgICAgICAgICAgICAgIGNhc2UgJ2UnOgorICAgIAkgICAgICAgICAgICAgICAgCXsKKyAgICAJICAgICAgICAgICAgICAgIAkJYWx0NDA9MTsKKyAgICAJICAgICAgICAgICAgICAgIAl9CisgICAgCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgCSAgICAgICAgICAgIH0KKworICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDQwKQorICAgIAkgICAgICAgICAgICB7CisgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4MzM6MjM6IERlY2ltYWxFeHBvbmVudAorICAgIAkgICAgICAgIAkgICAgeworICAgIAkgICAgICAgIAkgICAgICAgIC8qIDY4MzM6MjM6IERlY2ltYWxFeHBvbmVudCAqLworICAgIAkgICAgICAgIAkgICAgICAgIG1EZWNpbWFsRXhwb25lbnQoY3R4ICk7CisgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZUZsb2F0RXg7CisgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgICAgIAkgICAgfQorICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAJICAgICAgICAgICAgfQorICAgIAkgICAgICAgIH0KKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZUZsb2F0RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlRmxvYXRFeDogOworCisgICAgZCA9IE5VTEw7CisKK30KKy8vICRBTlRMUiBlbmQgRmxvYXQKKworLy8gICBDb21lcyBmcm9tOiA2ODQwOjI6ICggKCAnZScgfCAnRScgKSAoICcrJyB8ICctJyApPyAoICcwJyAuLiAnOScgKSsgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgRVhQT05FTlQKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gRVhQT05FTlQKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtRVhQT05FTlQocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2ODQwOjI6ICggKCAnZScgfCAnRScgKSAoICcrJyB8ICctJyApPyAoICcwJyAuLiAnOScgKSsgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4NDA6NDogKCAnZScgfCAnRScgKSAoICcrJyB8ICctJyApPyAoICcwJyAuLiAnOScgKSsKKyAgICB7CisgICAgICAgIGlmICggTEEoMSkgPT0gJ0UnIHx8IExBKDEpID09ICdlJyApCisgICAgICAgIHsKKyAgICAgICAgICAgIENPTlNVTUUoKTsKKyAgICAgICAgICAgIEZBSUxFREZMQUc9QU5UTFIzX0ZBTFNFOworCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19NSVNNQVRDSEVEX1NFVF9FWENFUFRJT047CisgICAgICAgICAgICBFWENFUFRJT04tPm5hbWUgICAgICAgICA9ICh2b2lkICopQU5UTFIzX01JU01BVENIRURfU0VUX05BTUU7CisKKyAgICAgICAgICAgIExSRUNPVkVSKCk7CisgICAgICAgICAgICBnb3RvIHJ1bGVFWFBPTkVOVEV4OworICAgICAgICB9CisKKworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2ODQwOjE1OiAoICcrJyB8ICctJyApPworICAgICAgICB7CisgICAgICAgICAgICBpbnQgYWx0NDI9MjsKKyAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlICcrJzoKKyAgICAgICAgICAgICAgICBjYXNlICctJzoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0NDI9MTsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQ0MikKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIGlmICggTEEoMSkgPT0gJysnIHx8IExBKDEpID09ICctJyApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIENPTlNVTUUoKTsKKyAgICAgICAgCSAgICAgICAgICAgIEZBSUxFREZMQUc9QU5UTFIzX0ZBTFNFOworCisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgZWxzZQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19NSVNNQVRDSEVEX1NFVF9FWENFUFRJT047CisgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPm5hbWUgICAgICAgICA9ICh2b2lkICopQU5UTFIzX01JU01BVENIRURfU0VUX05BTUU7CisKKyAgICAgICAgCSAgICAgICAgICAgIExSRUNPVkVSKCk7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVFWFBPTkVOVEV4OworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Njg0MDoyNzogKCAnMCcgLi4gJzknICkrCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjbnQ0Mz0wOworCisgICAgICAgICAgICBmb3IgKDs7KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQ0Mz0yOworICAgICAgICAJc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJeworICAgICAgICAJY2FzZSAnMCc6CisgICAgICAgIAljYXNlICcxJzoKKyAgICAgICAgCWNhc2UgJzInOgorICAgICAgICAJY2FzZSAnMyc6CisgICAgICAgIAljYXNlICc0JzoKKyAgICAgICAgCWNhc2UgJzUnOgorICAgICAgICAJY2FzZSAnNic6CisgICAgICAgIAljYXNlICc3JzoKKyAgICAgICAgCWNhc2UgJzgnOgorICAgICAgICAJY2FzZSAnOSc6CisgICAgICAgIAkJeworICAgICAgICAJCQlhbHQ0Mz0xOworICAgICAgICAJCX0KKyAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJfQorCisgICAgICAgIAlzd2l0Y2ggKGFsdDQzKQorICAgICAgICAJeworICAgICAgICAJICAgIGNhc2UgMToKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6CisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGlmICggKChMQSgxKSA+PSAnMCcpICYmIChMQSgxKSA8PSAnOScpKSApCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgQ09OU1VNRSgpOworICAgICAgICAJICAgICAgICAgICAgICAgIEZBSUxFREZMQUc9QU5UTFIzX0ZBTFNFOworCisgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICBlbHNlCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfRVhDRVBUSU9OOworICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bmFtZSAgICAgICAgID0gKHZvaWQgKilBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfTkFNRTsKKworICAgICAgICAJICAgICAgICAgICAgICAgIExSRUNPVkVSKCk7CisgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlRVhQT05FTlRFeDsKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICBkZWZhdWx0OgorCisgICAgICAgIAkJaWYgKCBjbnQ0MyA+PSAxICkKKyAgICAgICAgCQl7CisgICAgICAgIAkJICAgIGdvdG8gbG9vcDQzOworICAgICAgICAJCX0KKyAgICAgICAgCQlpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgIAkJeworICAgICAgICAJCSAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkJICAgIHJldHVybiA7CisgICAgICAgIAkJfQorCisgICAgICAgIAkJLyogbWlzbWF0Y2hlZFNldEV4KCkKKyAgICAgICAgCQkgKi8KKyAgICAgICAgCQlDT05TVFJVQ1RFWCgpOworICAgICAgICAJCUVYQ0VQVElPTi0+dHlwZSA9IEFOVExSM19FQVJMWV9FWElUX0VYQ0VQVElPTjsKKyAgICAgICAgCQlFWENFUFRJT04tPm5hbWUgPSAodm9pZCAqKUFOVExSM19FQVJMWV9FWElUX05BTUU7CisKKworICAgICAgICAJCWdvdG8gcnVsZUVYUE9ORU5URXg7CisgICAgICAgIAl9CisgICAgICAgIAljbnQ0MysrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9vcDQzOiA7CS8qIEp1bXAgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVFWFBPTkVOVEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZUVYUE9ORU5URXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBFWFBPTkVOVAorCisvLyAgIENvbWVzIGZyb206IDY4NDU6MjogKCAoICcwJyAuLiAnOScgfCAnYScgLi4gJ2YnIHwgJ0EnIC4uICdGJyApICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IEhFWF9ESUdJVAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBIRVhfRElHSVQKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtSEVYX0RJR0lUKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Njg0NToyOiAoICggJzAnIC4uICc5JyB8ICdhJyAuLiAnZicgfCAnQScgLi4gJ0YnICkgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOgorICAgIHsKKyAgICAgICAgaWYgKCAoKExBKDEpID49ICcwJykgJiYgKExBKDEpIDw9ICc5JykpIHx8ICgoTEEoMSkgPj0gJ0EnKSAmJiAoTEEoMSkgPD0gJ0YnKSkgfHwgKChMQSgxKSA+PSAnYScpICYmIChMQSgxKSA8PSAnZicpKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIENPTlNVTUUoKTsKKyAgICAgICAgICAgIEZBSUxFREZMQUc9QU5UTFIzX0ZBTFNFOworCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19NSVNNQVRDSEVEX1NFVF9FWENFUFRJT047CisgICAgICAgICAgICBFWENFUFRJT04tPm5hbWUgICAgICAgICA9ICh2b2lkICopQU5UTFIzX01JU01BVENIRURfU0VUX05BTUU7CisKKyAgICAgICAgICAgIExSRUNPVkVSKCk7CisgICAgICAgICAgICBnb3RvIHJ1bGVIRVhfRElHSVRFeDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZUhFWF9ESUdJVEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZUhFWF9ESUdJVEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgSEVYX0RJR0lUCisKKy8vICAgQ29tZXMgZnJvbTogNjg1MDoyOiAoICdcXFxcJyAoICdiJyB8ICd0JyB8ICduJyB8ICdmJyB8ICdyJyB8ICdcXFwiJyB8ICdcXCcnIHwgJ1xcXFwnICkgfCBVTklDT0RFX0VTQyB8IE9DVEFMX0VTQyApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBFU0NfU0VRCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIEVTQ19TRVEKKyAqIGZyb20gdGhlIGF0dGFjaGVkIGlucHV0IHN0cmVhbS4KKyAqCisgKgorICogXHJlbWFyaworICogIC0gbGV4ZXItPmVycm9yID09IEFOVExSM19UUlVFIGlmIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgorICovCitzdGF0aWMgQU5UTFIzX0lOTElORQordm9pZCBtRVNDX1NFUShwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKworICAgIHsKKyAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4NTA6MjogKCAnXFxcXCcgKCAnYicgfCAndCcgfCAnbicgfCAnZicgfCAncicgfCAnXFxcIicgfCAnXFwnJyB8ICdcXFxcJyApIHwgVU5JQ09ERV9FU0MgfCBPQ1RBTF9FU0MgKQorCisgICAgICAgIEFOVExSM19VSU5UMzIgYWx0NDQ7CisKKyAgICAgICAgYWx0NDQ9MzsKKworICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAJeworICAgICAgICAJCXN3aXRjaCAoIExBKDIpICkKKyAgICAgICAgCQl7CisgICAgICAgIAkJY2FzZSAnIic6CisgICAgICAgIAkJY2FzZSAnXCcnOgorICAgICAgICAJCWNhc2UgJ1xcJzoKKyAgICAgICAgCQljYXNlICdiJzoKKyAgICAgICAgCQljYXNlICdmJzoKKyAgICAgICAgCQljYXNlICduJzoKKyAgICAgICAgCQljYXNlICdyJzoKKyAgICAgICAgCQljYXNlICd0JzoKKyAgICAgICAgCQkJeworICAgICAgICAJCQkJYWx0NDQ9MTsKKyAgICAgICAgCQkJfQorICAgICAgICAJCSAgICBicmVhazsKKyAgICAgICAgCQljYXNlICd1JzoKKyAgICAgICAgCQkJeworICAgICAgICAJCQkJYWx0NDQ9MjsKKyAgICAgICAgCQkJfQorICAgICAgICAJCSAgICBicmVhazsKKyAgICAgICAgCQljYXNlICcwJzoKKyAgICAgICAgCQljYXNlICcxJzoKKyAgICAgICAgCQljYXNlICcyJzoKKyAgICAgICAgCQljYXNlICczJzoKKyAgICAgICAgCQljYXNlICc0JzoKKyAgICAgICAgCQljYXNlICc1JzoKKyAgICAgICAgCQljYXNlICc2JzoKKyAgICAgICAgCQljYXNlICc3JzoKKyAgICAgICAgCQkJeworICAgICAgICAJCQkJYWx0NDQ9MzsKKyAgICAgICAgCQkJfQorICAgICAgICAJCSAgICBicmVhazsKKworICAgICAgICAJCWRlZmF1bHQ6CisgICAgICAgIAkJICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgCQkgICAgeworICAgICAgICAJCSAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAJCSAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCQkgICAgfQorCisgICAgICAgIAkJICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgIAkJICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAJCSAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgIAkJICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gNDQ7CisgICAgICAgIAkJICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMTsKKworCisgICAgICAgIAkJICAgIGdvdG8gcnVsZUVTQ19TRVFFeDsKKworICAgICAgICAJCX0KKworICAgICAgICAJfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA0NDsKKyAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICBnb3RvIHJ1bGVFU0NfU0VRRXg7CisKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYWx0NDQpCisgICAgICAgIHsKKyAgICAJY2FzZSAxOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Njg1MDo0OiAnXFxcXCcgKCAnYicgfCAndCcgfCAnbicgfCAnZicgfCAncicgfCAnXFxcIicgfCAnXFwnJyB8ICdcXFxcJyApCisgICAgCSAgICB7CisgICAgCSAgICAgICAgTUFUQ0hDKCdcXCcpOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVFU0NfU0VRRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKyAgICAJICAgICAgICBpZiAoIExBKDEpID09ICciJyB8fCBMQSgxKSA9PSAnXCcnIHx8IExBKDEpID09ICdcXCcgfHwgTEEoMSkgPT0gJ2InIHx8IExBKDEpID09ICdmJyB8fCBMQSgxKSA9PSAnbicgfHwgTEEoMSkgPT0gJ3InIHx8IExBKDEpID09ICd0JyApCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBDT05TVU1FKCk7CisgICAgCSAgICAgICAgICAgIEZBSUxFREZMQUc9QU5UTFIzX0ZBTFNFOworCisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGVsc2UKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAJICAgICAgICAgICAgeworICAgIAkgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICAgICAgfQorCisgICAgCSAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX01JU01BVENIRURfU0VUX0VYQ0VQVElPTjsKKyAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT5uYW1lICAgICAgICAgPSAodm9pZCAqKUFOVExSM19NSVNNQVRDSEVEX1NFVF9OQU1FOworCisgICAgCSAgICAgICAgICAgIExSRUNPVkVSKCk7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZUVTQ19TRVFFeDsKKyAgICAJICAgICAgICB9CisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4NTE6NDogVU5JQ09ERV9FU0MKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiA2ODUxOjQ6IFVOSUNPREVfRVNDICovCisgICAgCSAgICAgICAgbVVOSUNPREVfRVNDKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVFU0NfU0VRRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMzoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4NTI6NDogT0NUQUxfRVNDCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogNjg1Mjo0OiBPQ1RBTF9FU0MgKi8KKyAgICAJICAgICAgICBtT0NUQUxfRVNDKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVFU0NfU0VRRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZUVTQ19TRVFFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVFU0NfU0VRRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBFU0NfU0VRCisKKy8vICAgQ29tZXMgZnJvbTogNjg1NzoyOiAoICdcXFxcJyAoICcwJyAuLiAnMycgKSAoICcwJyAuLiAnNycgKSAoICcwJyAuLiAnNycgKSB8ICdcXFxcJyAoICcwJyAuLiAnNycgKSAoICcwJyAuLiAnNycgKSB8ICdcXFxcJyAoICcwJyAuLiAnNycgKSApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBPQ1RBTF9FU0MKKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gT0NUQUxfRVNDCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbU9DVEFMX0VTQyhwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKworICAgIHsKKyAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4NTc6MjogKCAnXFxcXCcgKCAnMCcgLi4gJzMnICkgKCAnMCcgLi4gJzcnICkgKCAnMCcgLi4gJzcnICkgfCAnXFxcXCcgKCAnMCcgLi4gJzcnICkgKCAnMCcgLi4gJzcnICkgfCAnXFxcXCcgKCAnMCcgLi4gJzcnICkgKQorCisgICAgICAgIEFOVExSM19VSU5UMzIgYWx0NDU7CisKKyAgICAgICAgYWx0NDU9MzsKKworICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAJeworICAgICAgICAJCXN3aXRjaCAoIExBKDIpICkKKyAgICAgICAgCQl7CisgICAgICAgIAkJY2FzZSAnMCc6CisgICAgICAgIAkJY2FzZSAnMSc6CisgICAgICAgIAkJY2FzZSAnMic6CisgICAgICAgIAkJY2FzZSAnMyc6CisgICAgICAgIAkJCXsKKyAgICAgICAgCQkJCXN3aXRjaCAoIExBKDMpICkKKyAgICAgICAgCQkJCXsKKyAgICAgICAgCQkJCWNhc2UgJzAnOgorICAgICAgICAJCQkJY2FzZSAnMSc6CisgICAgICAgIAkJCQljYXNlICcyJzoKKyAgICAgICAgCQkJCWNhc2UgJzMnOgorICAgICAgICAJCQkJY2FzZSAnNCc6CisgICAgICAgIAkJCQljYXNlICc1JzoKKyAgICAgICAgCQkJCWNhc2UgJzYnOgorICAgICAgICAJCQkJY2FzZSAnNyc6CisgICAgICAgIAkJCQkJeworICAgICAgICAJCQkJCQlzd2l0Y2ggKCBMQSg0KSApCisgICAgICAgIAkJCQkJCXsKKyAgICAgICAgCQkJCQkJY2FzZSAnMCc6CisgICAgICAgIAkJCQkJCWNhc2UgJzEnOgorICAgICAgICAJCQkJCQljYXNlICcyJzoKKyAgICAgICAgCQkJCQkJY2FzZSAnMyc6CisgICAgICAgIAkJCQkJCWNhc2UgJzQnOgorICAgICAgICAJCQkJCQljYXNlICc1JzoKKyAgICAgICAgCQkJCQkJY2FzZSAnNic6CisgICAgICAgIAkJCQkJCWNhc2UgJzcnOgorICAgICAgICAJCQkJCQkJeworICAgICAgICAJCQkJCQkJCWFsdDQ1PTE7CisgICAgICAgIAkJCQkJCQl9CisgICAgICAgIAkJCQkJCSAgICBicmVhazsKKworICAgICAgICAJCQkJCQlkZWZhdWx0OgorICAgICAgICAJCQkJCQkgICAgYWx0NDU9MjsKKyAgICAgICAgCQkJCQkJfQorCisgICAgICAgIAkJCQkJfQorICAgICAgICAJCQkJICAgIGJyZWFrOworCisgICAgICAgIAkJCQlkZWZhdWx0OgorICAgICAgICAJCQkJICAgIGFsdDQ1PTM7CisgICAgICAgIAkJCQl9CisKKyAgICAgICAgCQkJfQorICAgICAgICAJCSAgICBicmVhazsKKyAgICAgICAgCQljYXNlICc0JzoKKyAgICAgICAgCQljYXNlICc1JzoKKyAgICAgICAgCQljYXNlICc2JzoKKyAgICAgICAgCQljYXNlICc3JzoKKyAgICAgICAgCQkJeworICAgICAgICAJCQkJc3dpdGNoICggTEEoMykgKQorICAgICAgICAJCQkJeworICAgICAgICAJCQkJY2FzZSAnMCc6CisgICAgICAgIAkJCQljYXNlICcxJzoKKyAgICAgICAgCQkJCWNhc2UgJzInOgorICAgICAgICAJCQkJY2FzZSAnMyc6CisgICAgICAgIAkJCQljYXNlICc0JzoKKyAgICAgICAgCQkJCWNhc2UgJzUnOgorICAgICAgICAJCQkJY2FzZSAnNic6CisgICAgICAgIAkJCQljYXNlICc3JzoKKyAgICAgICAgCQkJCQl7CisgICAgICAgIAkJCQkJCWFsdDQ1PTI7CisgICAgICAgIAkJCQkJfQorICAgICAgICAJCQkJICAgIGJyZWFrOworCisgICAgICAgIAkJCQlkZWZhdWx0OgorICAgICAgICAJCQkJICAgIGFsdDQ1PTM7CisgICAgICAgIAkJCQl9CisKKyAgICAgICAgCQkJfQorICAgICAgICAJCSAgICBicmVhazsKKworICAgICAgICAJCWRlZmF1bHQ6CisgICAgICAgIAkJICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgCQkgICAgeworICAgICAgICAJCSAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAJCSAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCQkgICAgfQorCisgICAgICAgIAkJICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgIAkJICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAJCSAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgIAkJICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gNDU7CisgICAgICAgIAkJICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMTsKKworCisgICAgICAgIAkJICAgIGdvdG8gcnVsZU9DVEFMX0VTQ0V4OworCisgICAgICAgIAkJfQorCisgICAgICAgIAl9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDQ1OworICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgIGdvdG8gcnVsZU9DVEFMX0VTQ0V4OworCisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGFsdDQ1KQorICAgICAgICB7CisgICAgCWNhc2UgMToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4NTc6NDogJ1xcXFwnICggJzAnIC4uICczJyApICggJzAnIC4uICc3JyApICggJzAnIC4uICc3JyApCisgICAgCSAgICB7CisgICAgCSAgICAgICAgTUFUQ0hDKCdcXCcpOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVPQ1RBTF9FU0NFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworICAgIAkgICAgICAgIGlmICggKChMQSgxKSA+PSAnMCcpICYmIChMQSgxKSA8PSAnMycpKSApCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBDT05TVU1FKCk7CisgICAgCSAgICAgICAgICAgIEZBSUxFREZMQUc9QU5UTFIzX0ZBTFNFOworCisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGVsc2UKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAJICAgICAgICAgICAgeworICAgIAkgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICAgICAgfQorCisgICAgCSAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX01JU01BVENIRURfU0VUX0VYQ0VQVElPTjsKKyAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT5uYW1lICAgICAgICAgPSAodm9pZCAqKUFOVExSM19NSVNNQVRDSEVEX1NFVF9OQU1FOworCisgICAgCSAgICAgICAgICAgIExSRUNPVkVSKCk7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZU9DVEFMX0VTQ0V4OworICAgIAkgICAgICAgIH0KKworCisgICAgCSAgICAgICAgaWYgKCAoKExBKDEpID49ICcwJykgJiYgKExBKDEpIDw9ICc3JykpICkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIENPTlNVTUUoKTsKKyAgICAJICAgICAgICAgICAgRkFJTEVERkxBRz1BTlRMUjNfRkFMU0U7CisKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgZWxzZQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgIAkgICAgICAgICAgICB7CisgICAgCSAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgICAgICB9CisKKyAgICAJICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfRVhDRVBUSU9OOworICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPm5hbWUgICAgICAgICA9ICh2b2lkICopQU5UTFIzX01JU01BVENIRURfU0VUX05BTUU7CisKKyAgICAJICAgICAgICAgICAgTFJFQ09WRVIoKTsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlT0NUQUxfRVNDRXg7CisgICAgCSAgICAgICAgfQorCisKKyAgICAJICAgICAgICBpZiAoICgoTEEoMSkgPj0gJzAnKSAmJiAoTEEoMSkgPD0gJzcnKSkgKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgQ09OU1VNRSgpOworICAgIAkgICAgICAgICAgICBGQUlMRURGTEFHPUFOVExSM19GQUxTRTsKKworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBlbHNlCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgCSAgICAgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAJICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgICAgIH0KKworICAgIAkgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19NSVNNQVRDSEVEX1NFVF9FWENFUFRJT047CisgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+bmFtZSAgICAgICAgID0gKHZvaWQgKilBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfTkFNRTsKKworICAgIAkgICAgICAgICAgICBMUkVDT1ZFUigpOworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVPQ1RBTF9FU0NFeDsKKyAgICAJICAgICAgICB9CisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4NTg6NDogJ1xcXFwnICggJzAnIC4uICc3JyApICggJzAnIC4uICc3JyApCisgICAgCSAgICB7CisgICAgCSAgICAgICAgTUFUQ0hDKCdcXCcpOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVPQ1RBTF9FU0NFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworICAgIAkgICAgICAgIGlmICggKChMQSgxKSA+PSAnMCcpICYmIChMQSgxKSA8PSAnNycpKSApCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBDT05TVU1FKCk7CisgICAgCSAgICAgICAgICAgIEZBSUxFREZMQUc9QU5UTFIzX0ZBTFNFOworCisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGVsc2UKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAJICAgICAgICAgICAgeworICAgIAkgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICAgICAgfQorCisgICAgCSAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX01JU01BVENIRURfU0VUX0VYQ0VQVElPTjsKKyAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT5uYW1lICAgICAgICAgPSAodm9pZCAqKUFOVExSM19NSVNNQVRDSEVEX1NFVF9OQU1FOworCisgICAgCSAgICAgICAgICAgIExSRUNPVkVSKCk7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZU9DVEFMX0VTQ0V4OworICAgIAkgICAgICAgIH0KKworCisgICAgCSAgICAgICAgaWYgKCAoKExBKDEpID49ICcwJykgJiYgKExBKDEpIDw9ICc3JykpICkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIENPTlNVTUUoKTsKKyAgICAJICAgICAgICAgICAgRkFJTEVERkxBRz1BTlRMUjNfRkFMU0U7CisKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgZWxzZQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgIAkgICAgICAgICAgICB7CisgICAgCSAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgICAgICB9CisKKyAgICAJICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfRVhDRVBUSU9OOworICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPm5hbWUgICAgICAgICA9ICh2b2lkICopQU5UTFIzX01JU01BVENIRURfU0VUX05BTUU7CisKKyAgICAJICAgICAgICAgICAgTFJFQ09WRVIoKTsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlT0NUQUxfRVNDRXg7CisgICAgCSAgICAgICAgfQorCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDM6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2ODU5OjQ6ICdcXFxcJyAoICcwJyAuLiAnNycgKQorICAgIAkgICAgeworICAgIAkgICAgICAgIE1BVENIQygnXFwnKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlT0NUQUxfRVNDRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKyAgICAJICAgICAgICBpZiAoICgoTEEoMSkgPj0gJzAnKSAmJiAoTEEoMSkgPD0gJzcnKSkgKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgQ09OU1VNRSgpOworICAgIAkgICAgICAgICAgICBGQUlMRURGTEFHPUFOVExSM19GQUxTRTsKKworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBlbHNlCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgCSAgICAgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAJICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgICAgIH0KKworICAgIAkgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19NSVNNQVRDSEVEX1NFVF9FWENFUFRJT047CisgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+bmFtZSAgICAgICAgID0gKHZvaWQgKilBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfTkFNRTsKKworICAgIAkgICAgICAgICAgICBMUkVDT1ZFUigpOworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVPQ1RBTF9FU0NFeDsKKyAgICAJICAgICAgICB9CisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZU9DVEFMX0VTQ0V4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZU9DVEFMX0VTQ0V4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgT0NUQUxfRVNDCisKKy8vICAgQ29tZXMgZnJvbTogNjg2NDoyOiAoICdcXFxcJyAndScgSEVYX0RJR0lUIEhFWF9ESUdJVCBIRVhfRElHSVQgSEVYX0RJR0lUICkKKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IFVOSUNPREVfRVNDCisgKgorICogTG9va3MgdG8gbWF0Y2ggdGhlIGNoYXJhY3RlcnMgdGhlIGNvbnN0aXR1dGUgdGhlIHRva2VuIFVOSUNPREVfRVNDCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbVVOSUNPREVfRVNDKHBmbWxMZXhlciBjdHgpCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Njg2NDoyOiAoICdcXFxcJyAndScgSEVYX0RJR0lUIEhFWF9ESUdJVCBIRVhfRElHSVQgSEVYX0RJR0lUICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2ODY0OjQ6ICdcXFxcJyAndScgSEVYX0RJR0lUIEhFWF9ESUdJVCBIRVhfRElHSVQgSEVYX0RJR0lUCisgICAgeworICAgICAgICBNQVRDSEMoJ1xcJyk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVVOSUNPREVfRVNDRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgICAgICBNQVRDSEMoJ3UnKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVU5JQ09ERV9FU0NFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgICAgIC8qIDY4NjQ6NDogJ1xcXFwnICd1JyBIRVhfRElHSVQgSEVYX0RJR0lUIEhFWF9ESUdJVCBIRVhfRElHSVQgKi8KKyAgICAgICAgbUhFWF9ESUdJVChjdHggKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVU5JQ09ERV9FU0NFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKyAgICAgICAgLyogNjg2NDo0OiAnXFxcXCcgJ3UnIEhFWF9ESUdJVCBIRVhfRElHSVQgSEVYX0RJR0lUIEhFWF9ESUdJVCAqLworICAgICAgICBtSEVYX0RJR0lUKGN0eCApOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVVTklDT0RFX0VTQ0V4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworICAgICAgICAvKiA2ODY0OjQ6ICdcXFxcJyAndScgSEVYX0RJR0lUIEhFWF9ESUdJVCBIRVhfRElHSVQgSEVYX0RJR0lUICovCisgICAgICAgIG1IRVhfRElHSVQoY3R4ICk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVVOSUNPREVfRVNDRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisgICAgICAgIC8qIDY4NjQ6NDogJ1xcXFwnICd1JyBIRVhfRElHSVQgSEVYX0RJR0lUIEhFWF9ESUdJVCBIRVhfRElHSVQgKi8KKyAgICAgICAgbUhFWF9ESUdJVChjdHggKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlVU5JQ09ERV9FU0NFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKyAgICB9CisKKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZVVOSUNPREVfRVNDRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlVU5JQ09ERV9FU0NFeDogOworCit9CisvLyAkQU5UTFIgZW5kIFVOSUNPREVfRVNDCisKKy8vICAgQ29tZXMgZnJvbTogNjg2ODoyOiAoICcvLycgKH4gKCAnXFxuJyB8ICdcXHInICkgKSogKCAnXFxyJyApPyAnXFxuJyB8ICcvKicgKCBvcHRpb25zIHtncmVlZHk9ZmFsc2U7IH0gOiAuICkqICcqLycgKQorLyoqIFxicmllZiBMZXhlciBydWxlIGdlbmVyYXRlZCBieSBBTlRMUjMKKyAqCisgKiAkQU5UTFIgc3RhcnQgQ09NTUVOVAorICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBDT01NRU5UCisgKiBmcm9tIHRoZSBhdHRhY2hlZCBpbnB1dCBzdHJlYW0uCisgKgorICoKKyAqIFxyZW1hcmsKKyAqICAtIGxleGVyLT5lcnJvciA9PSBBTlRMUjNfVFJVRSBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93bi4KKyAqLworc3RhdGljIEFOVExSM19JTkxJTkUKK3ZvaWQgbUNPTU1FTlQocGZtbExleGVyIGN0eCkKK3sKKwlBTlRMUjNfVUlOVDMyCV90eXBlOworCisgICAgX3R5cGUJICAgID0gQ09NTUVOVDsKKworCisgICAgeworICAgICAgICAvLyAgL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Njg2ODoyOiAoICcvLycgKH4gKCAnXFxuJyB8ICdcXHInICkgKSogKCAnXFxyJyApPyAnXFxuJyB8ICcvKicgKCBvcHRpb25zIHtncmVlZHk9ZmFsc2U7IH0gOiAuICkqICcqLycgKQorCisgICAgICAgIEFOVExSM19VSU5UMzIgYWx0NDk7CisKKyAgICAgICAgYWx0NDk9MjsKKworICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAnLyc6CisgICAgICAgIAl7CisgICAgICAgIAkJc3dpdGNoICggTEEoMikgKQorICAgICAgICAJCXsKKyAgICAgICAgCQljYXNlICcvJzoKKyAgICAgICAgCQkJeworICAgICAgICAJCQkJYWx0NDk9MTsKKyAgICAgICAgCQkJfQorICAgICAgICAJCSAgICBicmVhazsKKyAgICAgICAgCQljYXNlICcqJzoKKyAgICAgICAgCQkJeworICAgICAgICAJCQkJYWx0NDk9MjsKKyAgICAgICAgCQkJfQorICAgICAgICAJCSAgICBicmVhazsKKworICAgICAgICAJCWRlZmF1bHQ6CisgICAgICAgIAkJICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgCQkgICAgeworICAgICAgICAJCSAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAJCSAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCQkgICAgfQorCisgICAgICAgIAkJICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgIAkJICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAJCSAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgIAkJICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gNDk7CisgICAgICAgIAkJICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMTsKKworCisgICAgICAgIAkJICAgIGdvdG8gcnVsZUNPTU1FTlRFeDsKKworICAgICAgICAJCX0KKworICAgICAgICAJfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA0OTsKKyAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICBnb3RvIHJ1bGVDT01NRU5URXg7CisKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYWx0NDkpCisgICAgICAgIHsKKyAgICAJY2FzZSAxOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Njg2ODo0OiAnLy8nICh+ICggJ1xcbicgfCAnXFxyJyApICkqICggJ1xccicgKT8gJ1xcbicKKyAgICAJICAgIHsKKyAgICAJICAgICAgICBNQVRDSFMobGl0XzM4OCk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZUNPTU1FTlRFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisKKyAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2ODY4Ojk6ICh+ICggJ1xcbicgfCAnXFxyJyApICkqCisKKyAgICAJICAgICAgICBmb3IgKDs7KQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgaW50IGFsdDQ2PTI7CisgICAgCSAgICAgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgICAgLyogZGZhTG9vcGJhY2tTdGF0ZShrLGVkZ2VzLGVvdFByZWRpY3RzQWx0LGRlc2NyaXB0aW9uLHN0YXRlTnVtYmVyLHNlbVByZWRTdGF0ZSkKKyAgICAJICAgICAgICAgICAgICAgICovCisgICAgCSAgICAgICAgICAgICAgICBpbnQgTEE0Nl8wID0gTEEoMSk7CisgICAgCSAgICAgICAgICAgICAgICBpZiAoICgoKExBNDZfMCA+PSAweDAwMDApICYmIChMQTQ2XzAgPD0gJ1x0JykpIHx8ICgoTEE0Nl8wID49IDB4MDAwQikgJiYgKExBNDZfMCA8PSAnXGYnKSkgfHwgKChMQTQ2XzAgPj0gMHgwMDBFKSAmJiAoTEE0Nl8wIDw9IDB4RkZGRikpKSkKKyAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgICAgICAgICBhbHQ0Nj0xOworICAgIAkgICAgICAgICAgICAgICAgfQorCisgICAgCSAgICAgICAgICAgIH0KKyAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQ0NikKKyAgICAJICAgICAgICAgICAgeworICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoKKyAgICAJICAgICAgICAJICAgIHsKKyAgICAJICAgICAgICAJICAgICAgICBpZiAoICgoTEEoMSkgPj0gMHgwMDAwKSAmJiAoTEEoMSkgPD0gJ1x0JykpIHx8ICgoTEEoMSkgPj0gMHgwMDBCKSAmJiAoTEEoMSkgPD0gJ1xmJykpIHx8ICgoTEEoMSkgPj0gMHgwMDBFKSAmJiAoTEEoMSkgPD0gMHhGRkZGKSkgKQorICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAJICAgICAgICAgICAgQ09OU1VNRSgpOworICAgIAkgICAgICAgIAkgICAgICAgICAgICBGQUlMRURGTEFHPUFOVExSM19GQUxTRTsKKworICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICAJICAgICAgICBlbHNlCisgICAgCSAgICAgICAgCSAgICAgICAgeworICAgIAkgICAgICAgIAkgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgIAkgICAgICAgIAkgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgIAkgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19NSVNNQVRDSEVEX1NFVF9FWENFUFRJT047CisgICAgCSAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+bmFtZSAgICAgICAgID0gKHZvaWQgKilBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfTkFNRTsKKworICAgIAkgICAgICAgIAkgICAgICAgICAgICBMUkVDT1ZFUigpOworICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVDT01NRU5URXg7CisgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAJICAgICAgICAJICAgIH0KKyAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgCSAgICAgICAgCWRlZmF1bHQ6CisgICAgCSAgICAgICAgCSAgICBnb3RvIGxvb3A0NjsJLyogYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAJICAgICAgICAgICAgfQorICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBsb29wNDY6IDsgLyogSnVtcCBvdXQgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKworCisgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Njg2ODoyMzogKCAnXFxyJyApPworICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgaW50IGFsdDQ3PTI7CisgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAJICAgICAgICAgICAgeworICAgIAkgICAgICAgICAgICAgICAgY2FzZSAnXHInOgorICAgIAkgICAgICAgICAgICAgICAgCXsKKyAgICAJICAgICAgICAgICAgICAgIAkJYWx0NDc9MTsKKyAgICAJICAgICAgICAgICAgICAgIAl9CisgICAgCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgCSAgICAgICAgICAgIH0KKworICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ3KQorICAgIAkgICAgICAgICAgICB7CisgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4Njg6MjM6ICdcXHInCisgICAgCSAgICAgICAgCSAgICB7CisgICAgCSAgICAgICAgCSAgICAgICAgTUFUQ0hDKCdccicpOworICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgCSAgICAgICAgeworICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVDT01NRU5URXg7CisgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAJICAgICAgICAJICAgIH0KKyAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgCSAgICAgICAgICAgIH0KKyAgICAJICAgICAgICB9CisKKyAgICAJICAgICAgICBNQVRDSEMoJ1xuJyk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZUNPTU1FTlRFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIExFWFNUQVRFLT5jaGFubmVsPUhJRERFTjsKKyAgICAJICAgICAgICB9CisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4Njk6NDogJy8qJyAoIG9wdGlvbnMge2dyZWVkeT1mYWxzZTsgfSA6IC4gKSogJyovJworICAgIAkgICAgeworICAgIAkgICAgICAgIE1BVENIUyhsaXRfMzg5KTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlQ09NTUVOVEV4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKworICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4Njk6OTogKCBvcHRpb25zIHtncmVlZHk9ZmFsc2U7IH0gOiAuICkqCisKKyAgICAJICAgICAgICBmb3IgKDs7KQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgaW50IGFsdDQ4PTI7CisgICAgCSAgICAgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgICAgLyogZGZhTG9vcGJhY2tTdGF0ZShrLGVkZ2VzLGVvdFByZWRpY3RzQWx0LGRlc2NyaXB0aW9uLHN0YXRlTnVtYmVyLHNlbVByZWRTdGF0ZSkKKyAgICAJICAgICAgICAgICAgICAgICovCisgICAgCSAgICAgICAgICAgICAgICBpbnQgTEE0OF8wID0gTEEoMSk7CisgICAgCSAgICAgICAgICAgICAgICBpZiAoIChMQTQ4XzAgPT0gJyonKSkKKyAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgICAgICAgICB7CisgICAgCSAgICAgICAgICAgICAgICAgICAgICAgLyogZGZhTG9vcGJhY2tTdGF0ZShrLGVkZ2VzLGVvdFByZWRpY3RzQWx0LGRlc2NyaXB0aW9uLHN0YXRlTnVtYmVyLHNlbVByZWRTdGF0ZSkKKyAgICAJICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAJICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBNDhfMSA9IExBKDIpOworICAgIAkgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTQ4XzEgPT0gJy8nKSkKKyAgICAJICAgICAgICAgICAgICAgICAgICAgICAgeworICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0NDg9MjsKKyAgICAJICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIAkgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKCgoTEE0OF8xID49IDB4MDAwMCkgJiYgKExBNDhfMSA8PSAnLicpKSB8fCAoKExBNDhfMSA+PSAnMCcpICYmIChMQTQ4XzEgPD0gMHhGRkZGKSkpKQorICAgIAkgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ0OD0xOworICAgIAkgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAJICAgICAgICAgICAgICAgICAgICB9CisgICAgCSAgICAgICAgICAgICAgICB9CisgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKCgoTEE0OF8wID49IDB4MDAwMCkgJiYgKExBNDhfMCA8PSAnKScpKSB8fCAoKExBNDhfMCA+PSAnKycpICYmIChMQTQ4XzAgPD0gMHhGRkZGKSkpKQorICAgIAkgICAgICAgICAgICAgICAgeworICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDQ4PTE7CisgICAgCSAgICAgICAgICAgICAgICB9CisKKyAgICAJICAgICAgICAgICAgfQorICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ4KQorICAgIAkgICAgICAgICAgICB7CisgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4Njk6Mzc6IC4KKyAgICAJICAgICAgICAJICAgIHsKKyAgICAJICAgICAgICAJICAgICAgICBNQVRDSEFOWSgpOworICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgCSAgICAgICAgeworICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVDT01NRU5URXg7CisgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAJICAgICAgICAJICAgIH0KKyAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgCSAgICAgICAgCWRlZmF1bHQ6CisgICAgCSAgICAgICAgCSAgICBnb3RvIGxvb3A0ODsJLyogYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAJICAgICAgICAgICAgfQorICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBsb29wNDg6IDsgLyogSnVtcCBvdXQgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKworCisgICAgCSAgICAgICAgTUFUQ0hTKGxpdF8zOTApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVDT01NRU5URXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworCisgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgTEVYU1RBVEUtPmNoYW5uZWw9SElEREVOOworICAgIAkgICAgICAgIH0KKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKworICAgICAgICB9CisgICAgfQorCUxFWFNUQVRFLT50eXBlID0gX3R5cGU7CisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlQ09NTUVOVEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZUNPTU1FTlRFeDogOworCit9CisvLyAkQU5UTFIgZW5kIENPTU1FTlQKKworLy8gICBDb21lcyBmcm9tOiA2ODczOjI6ICggKCAnICcgfCAnXFx0JyB8ICdcXHInIHwgJ1xcbicgKSApCisvKiogXGJyaWVmIExleGVyIHJ1bGUgZ2VuZXJhdGVkIGJ5IEFOVExSMworICoKKyAqICRBTlRMUiBzdGFydCBXUworICoKKyAqIExvb2tzIHRvIG1hdGNoIHRoZSBjaGFyYWN0ZXJzIHRoZSBjb25zdGl0dXRlIHRoZSB0b2tlbiBXUworICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG1XUyhwZm1sTGV4ZXIgY3R4KQoreworCUFOVExSM19VSU5UMzIJX3R5cGU7CisKKyAgICBfdHlwZQkgICAgPSBXUzsKKworCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Njg3MzoyOiAoICggJyAnIHwgJ1xcdCcgfCAnXFxyJyB8ICdcXG4nICkgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4NzM6NDogKCAnICcgfCAnXFx0JyB8ICdcXHInIHwgJ1xcbicgKQorICAgIHsKKyAgICAgICAgaWYgKCAoKExBKDEpID49ICdcdCcpICYmIChMQSgxKSA8PSAnXG4nKSkgfHwgTEEoMSkgPT0gJ1xyJyB8fCBMQSgxKSA9PSAnICcgKQorICAgICAgICB7CisgICAgICAgICAgICBDT05TVU1FKCk7CisgICAgICAgICAgICBGQUlMRURGTEFHPUFOVExSM19GQUxTRTsKKworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfRVhDRVBUSU9OOworICAgICAgICAgICAgRVhDRVBUSU9OLT5uYW1lICAgICAgICAgPSAodm9pZCAqKUFOVExSM19NSVNNQVRDSEVEX1NFVF9OQU1FOworCisgICAgICAgICAgICBMUkVDT1ZFUigpOworICAgICAgICAgICAgZ290byBydWxlV1NFeDsKKyAgICAgICAgfQorCisKKyAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICB7CisgICAgICAgICAgICBMRVhTVEFURS0+Y2hhbm5lbD1ISURERU47CisgICAgICAgIH0KKworCisgICAgfQorCisJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVXU0V4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZVdTRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBXUworCisvKiogVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgaW4gdG8gdGhlIGxleGVyIGZyb20gYW4gb2JqZWN0IHRoYXQKKyAqICB3YW50cyB0byBnZW5lcmF0ZSB0aGUgbmV4dCB0b2tlbiwgc3VjaCBhcyBhIHBDT01NT05fVE9LRU5fU1RSRUFNCisgKi8KK3N0YXRpYyB2b2lkCittVG9rZW5zKHBmbWxMZXhlciBjdHgpCit7CisgICAgeworICAgICAgICAvLyAgL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTo4OiAoIFRfXzE0NCB8IFRfXzE0NSB8IFRfXzE0NiB8IFRfXzE0NyB8IFRfXzE0OCB8IFRfXzE0OSB8IFRfXzE1MCB8IFRfXzE1MSB8IFRfXzE1MiB8IFRfXzE1MyB8IFRfXzE1NCB8IFRfXzE1NSB8IFRfXzE1NiB8IFRfXzE1NyB8IFRfXzE1OCB8IFRfXzE1OSB8IFRfXzE2MCB8IFRfXzE2MSB8IFRfXzE2MiB8IFRfXzE2MyB8IFRfXzE2NCB8IFRfXzE2NSB8IFRfXzE2NiB8IFRfXzE2NyB8IFRfXzE2OCB8IFRfXzE2OSB8IFRfXzE3MCB8IFRfXzE3MSB8IFRfXzE3MiB8IFRfXzE3MyB8IFRfXzE3NCB8IFRfXzE3NSB8IFRfXzE3NiB8IFRfXzE3NyB8IFRfXzE3OCB8IFRfXzE3OSB8IFRfXzE4MCB8IFRfXzE4MSB8IFRfXzE4MiB8IFRfXzE4MyB8IFRfXzE4NCB8IFRfXzE4NSB8IFRfXzE4NiB8IFRfXzE4NyB8IFRfXzE4OCB8IFRfXzE4OSB8IFRfXzE5MCB8IFRfXzE5MSB8IFRfXzE5MiB8IFRfXzE5MyB8IFRfXzE5NCB8IFRfXzE5NSB8IFRfXzE5NiB8IFRfXzE5NyB8IFRfXzE5OCB8IFRfXzE5OSB8IFRfXzIwMCB8IFRfXzIwMSB8IFRfXzIwMiB8IFRfXzIwMyB8IFRfXzIwNCB8IFRfXzIwNSB8IFRfXzIwNiB8IFRfXzIwNyB8IFRfXzIwOCB8IFRfXzIwOSB8IFRfXzIxMCB8IFRfXzIxMSB8IFRfXzIxMiB8IFRfXzIxMyB8IFRfXzIxNCB8IFRfXzIxNSB8IFRfXzIxNiB8IFRfXzIxNyB8IFRfXzIxOCB8IFRfXzIxOSB8IFRfXzIyMCB8IFRfXzIyMSB8IFRfXzIyMiB8IFRfXzIyMyB8IFRfXzIyNCB8IFRfXzIyNSB8IFRfXzIyNiB8IFRfXzIyNyB8IFRfXzIyOCB8IFRfXzIyOSB8IFRfXzIzMCB8IFRfXzIzMSB8IFRfXzIzMiB8IFRfXzIzMyB8IFRfXzIzNCB8IFRfXzIzNSB8IFRfXzIzNiB8IFRfXzIzNyB8IFRfXzIzOCB8IFRfXzIzOSB8IFRfXzI0MCB8IFRfXzI0MSB8IFRfXzI0MiB8IFRfXzI0MyB8IFRfXzI0NCB8IFRfXzI0NSB8IFRfXzI0NiB8IFRfXzI0NyB8IFRfXzI0OCB8IFRfXzI0OSB8IFRfXzI1MCB8IFRfXzI1MSB8IFRfXzI1MiB8IFRfXzI1MyB8IFRfXzI1NCB8IFRfXzI1NSB8IFRfXzI1NiB8IFRfXzI1NyB8IFRfXzI1OCB8IFRfXzI1OSB8IFRfXzI2MCB8IFRfXzI2MSB8IFRfXzI2MiB8IFRfXzI2MyB8IFRfXzI2NCB8IFRfXzI2NSB8IFRfXzI2NiB8IFRfXzI2NyB8IFRfXzI2OCB8IFRfXzI2OSB8IFRfXzI3MCB8IFRfXzI3MSB8IFRfXzI3MiB8IFRfXzI3MyB8IFRfXzI3NCB8IFRfXzI3NSB8IFRfXzI3NiB8IFRfXzI3NyB8IFRfXzI3OCB8IFRfXzI3OSB8IFRfXzI4MCB8IFRfXzI4MSB8IFRfXzI4MiB8IFRfXzI4MyB8IFRfXzI4NCB8IFRfXzI4NSB8IFRfXzI4NiB8IFRfXzI4NyB8IFRfXzI4OCB8IFRfXzI4OSB8IFRfXzI5MCB8IFRfXzI5MSB8IFRfXzI5MiB8IFRfXzI5MyB8IFRfXzI5NCB8IFRfXzI5NSB8IFRfXzI5NiB8IFRfXzI5NyB8IFRfXzI5OCB8IFRfXzI5OSB8IFRfXzMwMCB8IFRfXzMwMSB8IFRfXzMwMiB8IFRfXzMwMyB8IFRfXzMwNCB8IFRfXzMwNSB8IFRfXzMwNiB8IFRfXzMwNyB8IFRfXzMwOCB8IFRfXzMwOSB8IFRfXzMxMCB8IFRfXzMxMSB8IFRfXzMxMiB8IFRfXzMxMyB8IFRfXzMxNCB8IFRfXzMxNSB8IFRfXzMxNiB8IFRfXzMxNyB8IFRfXzMxOCB8IFRfXzMxOSB8IFRfXzMyMCB8IFRfXzMyMSB8IFRfXzMyMiB8IFRfXzMyMyB8IFRfXzMyNCB8IFRfXzMyNSB8IFRfXzMyNiB8IFRfXzMyNyB8IFRfXzMyOCB8IFRfXzMyOSB8IFRfXzMzMCB8IFRfXzMzMSB8IFRfXzMzMiB8IFRfXzMzMyB8IFRfXzMzNCB8IFRfXzMzNSB8IFRfXzMzNiB8IFRfXzMzNyB8IFRfXzMzOCB8IFRfXzMzOSB8IFRfXzM0MCB8IFRfXzM0MSB8IFRfXzM0MiB8IFRfXzM0MyB8IFRfXzM0NCB8IFRfXzM0NSB8IFRfXzM0NiB8IFRfXzM0NyB8IFRfXzM0OCB8IFRfXzM0OSB8IFRfXzM1MCB8IFRfXzM1MSB8IFRfXzM1MiB8IFRfXzM1MyB8IFRfXzM1NCB8IFRfXzM1NSB8IFRfXzM1NiB8IFRfXzM1NyB8IFRfXzM1OCB8IFRfXzM1OSB8IFRfXzM2MCB8IFRfXzM2MSB8IFRfXzM2MiB8IFRfXzM2MyB8IFRfXzM2NCB8IFRfXzM2NSB8IFRfXzM2NiB8IFRfXzM2NyB8IFRfXzM2OCB8IFRfXzM2OSB8IFRfXzM3MCB8IFRfXzM3MSB8IFRfXzM3MiB8IFRfXzM3MyB8IFRfXzM3NCB8IFRfXzM3NSB8IFRfXzM3NiB8IFRfXzM3NyB8IFRfXzM3OCB8IFRfXzM3OSB8IFRfXzM4MCB8IFRfXzM4MSB8IFRfXzM4MiB8IFRfXzM4MyB8IFRfXzM4NCB8IFRfXzM4NSB8IFRfXzM4NiB8IFRfXzM4NyB8IFRfXzM4OCB8IFRfXzM4OSB8IFRfXzM5MCB8IFRfXzM5MSB8IFRfXzM5MiB8IFRfXzM5MyB8IFRfXzM5NCB8IFRfXzM5NSB8IFRfXzM5NiB8IFRfXzM5NyB8IFRfXzM5OCB8IFRfXzM5OSB8IFRfXzQwMCB8IFRfXzQwMSB8IFRfXzQwMiB8IFRfXzQwMyB8IFRfXzQwNCB8IFRfXzQwNSB8IFRfXzQwNiB8IFRfXzQwNyB8IFRfXzQwOCB8IFRfXzQwOSB8IFRfXzQxMCB8IFRfXzQxMSB8IFRfXzQxMiB8IFRfXzQxMyB8IFRfXzQxNCB8IFRfXzQxNSB8IFRfXzQxNiB8IFRfXzQxNyB8IE9QX0FUT01JQ19TRVFVRU5DRSB8IE9QX1NFUVVFTkNFIHwgT1BfU0VRVUVOQ0VfU0lERSB8IE9QX1NFUVVFTkNFX1dFQUsgfCBPUF9TQ0hFRFVMRV9HVCB8IE9QX1NDSEVEVUxFX0xUIHwgT1BfU0NIRURVTEVfWE9SIHwgT1BfU0NIRURVTEVfQU5EX1RIRU4gfCBPUF9TQ0hFRFVMRV9PUl9FTFNFIHwgT1BfTk9OX0RFVEVSTUlOSVNNIHwgT1BfQ09OQ1VSUkVOQ1lfQVNZTkMgfCBPUF9DT05DVVJSRU5DWV9BTkQgfCBPUF9DT05DVVJSRU5DWV9PUiB8IE9QX0NPTkNVUlJFTkNZX0lOVEVSTEVBVklORyB8IE9QX0NPTkNVUlJFTkNZX1BBUkFMTEVMIHwgT1BfRk9SSyB8IE9QX0pPSU4gfCBPUF9DT05DVVJSRU5DWV9SRFZfQVNZTkMgfCBPUF9DT05DVVJSRU5DWV9SRFZfQU5EIHwgT1BfQ09OQ1VSUkVOQ1lfUkRWX09SIHwgT1BfQ09OQ1VSUkVOQ1lfUkRWX0lOVEVSTEVBVklORyB8IE9QX0NPTkNVUlJFTkNZX1JEVl9QQVJBTExFTCB8IEFTU0lHTiB8IEFTU0lHTl9BRlRFUiB8IEFTU0lHTl9SRUYgfCBBU1NJR05fTUFDUk8gfCBPUF9QVVNIIHwgT1BfQVNTSUdOX1RPUCB8IE9QX1RPUCB8IE9QX1BPUCB8IExQQVJFTiB8IFJQQVJFTiB8IExDVVJMWSB8IFJDVVJMWSB8IExCUkFDS0VUIHwgUkJSQUNLRVQgfCBMQlJBQ0tFVF9FWENFUFQgfCBMUEFSRU5fSU5WT0tFIHwgTENVUkxZX0lOVk9LRSB8IFBFUkNFTlRfTFBBUkVOX0lOVk9LRSB8IFBFUkNFTlRfTFBBUkVOIHwgUlBBUkVOX1BFUkNFTlQgfCBTVEFURU1FTlRfUFJPTVBUIHwgRE9MTEFSX0xDVVJMWSB8IFJDVVJMWV9ET0xMQVIgfCBQRVJDRU5UX0xDVVJMWSB8IFJDVVJMWV9QRVJDRU5UIHwgTEJSQUNLRVRfQkFSIHwgQkFSX1JCUkFDS0VUIHwgTEJSQUNLRVRfTENVUkxZIHwgUkNVUkxZX1JCUkFDS0VUIHwgQ09MT04gfCBDT01NQSB8IFFVRVNUSU9OIHwgU0VNSSB8IERJRVNFIHwgRE9MTEFSIHwgRE9UIHwgRE9URE9UIHwgQ09MT054MiB8IExBTkQgfCBMQU5EX1RIRU4gfCBMQU5EX0FTU0lHTiB8IExBTkRfQVNTSUdOX0FGVEVSIHwgTE5PVCB8IExPUiB8IExPUl9FTFNFIHwgTE9SX0FTU0lHTiB8IExPUl9BU1NJR05fQUZURVIgfCBMWE9SIHwgRVFVQUwgfCBORVFVQUwgfCBTRVFVQUwgfCBOU0VRVUFMIHwgTFRFIHwgTFRfIHwgR1RFIHwgR1QgfCBQTFVTIHwgUExVU19BU1NJR04gfCBQTFVTX0FTU0lHTl9BRlRFUiB8IElOQ1IgfCBNSU5VUyB8IE1JTlVTX0FTU0lHTiB8IE1JTlVTX0FTU0lHTl9BRlRFUiB8IERFQ1IgfCBTVEFSIHwgU1RBUl9BU1NJR04gfCBTVEFSX0FTU0lHTl9BRlRFUiB8IERJViB8IERJVl9BU1NJR04gfCBESVZfQVNTSUdOX0FGVEVSIHwgTU9EIHwgTU9EX0FTU0lHTiB8IE1PRF9BU1NJR05fQUZURVIgfCBSU0hJRlQgfCBSU0hJRlRfQVNTSUdOIHwgUlNISUZUX0FTU0lHTl9BRlRFUiB8IExTSElGVCB8IExTSElGVF9BU1NJR04gfCBMU0hJRlRfQVNTSUdOX0FGVEVSIHwgQkFORCB8IEJBTkRfQVNTSUdOIHwgQkFORF9BU1NJR05fQUZURVIgfCBCTk9UIHwgQk9SIHwgQk9SX0FTU0lHTiB8IEJPUl9BU1NJR05fQUZURVIgfCBCWE9SIHwgQlhPUl9BU1NJR04gfCBCWE9SX0FTU0lHTl9BRlRFUiB8IElEIHwgQVRfSUQgfCBTdHJpbmdMaXRlcmFsIHwgQ2hhckxpdGVyYWwgfCBOdW1iZXJMaXRlcmFsIHwgQ09NTUVOVCB8IFdTICkKKworICAgICAgICBBTlRMUjNfVUlOVDMyIGFsdDUwOworCisgICAgICAgIGFsdDUwPTM5MjsKKworICAgICAgICBhbHQ1MCA9IGNkZmE1MC5wcmVkaWN0KGN0eCwgUkVDT0dOSVpFUiwgSVNUUkVBTSwgJmNkZmE1MCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYWx0NTApCisgICAgICAgIHsKKyAgICAJY2FzZSAxOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxMDogVF9fMTQ0CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxMDogVF9fMTQ0ICovCisgICAgCSAgICAgICAgbVRfXzE0NChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTc6IFRfXzE0NQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTc6IFRfXzE0NSAqLworICAgIAkgICAgICAgIG1UX18xNDUoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDM6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjI0OiBUX18xNDYKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjI0OiBUX18xNDYgKi8KKyAgICAJICAgICAgICBtVF9fMTQ2KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSA0OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTozMTogVF9fMTQ3CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTozMTogVF9fMTQ3ICovCisgICAgCSAgICAgICAgbVRfXzE0NyhjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgNToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6Mzg6IFRfXzE0OAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6Mzg6IFRfXzE0OCAqLworICAgIAkgICAgICAgIG1UX18xNDgoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDY6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjQ1OiBUX18xNDkKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjQ1OiBUX18xNDkgKi8KKyAgICAJICAgICAgICBtVF9fMTQ5KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSA3OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTo1MjogVF9fMTUwCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTo1MjogVF9fMTUwICovCisgICAgCSAgICAgICAgbVRfXzE1MChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgODoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6NTk6IFRfXzE1MQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6NTk6IFRfXzE1MSAqLworICAgIAkgICAgICAgIG1UX18xNTEoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDk6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjY2OiBUX18xNTIKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjY2OiBUX18xNTIgKi8KKyAgICAJICAgICAgICBtVF9fMTUyKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAxMDoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6NzM6IFRfXzE1MworICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6NzM6IFRfXzE1MyAqLworICAgIAkgICAgICAgIG1UX18xNTMoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDExOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTo4MDogVF9fMTU0CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTo4MDogVF9fMTU0ICovCisgICAgCSAgICAgICAgbVRfXzE1NChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMTI6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjg3OiBUX18xNTUKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjg3OiBUX18xNTUgKi8KKyAgICAJICAgICAgICBtVF9fMTU1KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAxMzoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6OTQ6IFRfXzE1NgorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6OTQ6IFRfXzE1NiAqLworICAgIAkgICAgICAgIG1UX18xNTYoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDE0OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxMDE6IFRfXzE1NworICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTAxOiBUX18xNTcgKi8KKyAgICAJICAgICAgICBtVF9fMTU3KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAxNToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTA4OiBUX18xNTgKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjEwODogVF9fMTU4ICovCisgICAgCSAgICAgICAgbVRfXzE1OChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMTY6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjExNTogVF9fMTU5CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxMTU6IFRfXzE1OSAqLworICAgIAkgICAgICAgIG1UX18xNTkoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDE3OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxMjI6IFRfXzE2MAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTIyOiBUX18xNjAgKi8KKyAgICAJICAgICAgICBtVF9fMTYwKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAxODoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTI5OiBUX18xNjEKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjEyOTogVF9fMTYxICovCisgICAgCSAgICAgICAgbVRfXzE2MShjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMTk6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjEzNjogVF9fMTYyCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxMzY6IFRfXzE2MiAqLworICAgIAkgICAgICAgIG1UX18xNjIoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDIwOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxNDM6IFRfXzE2MworICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTQzOiBUX18xNjMgKi8KKyAgICAJICAgICAgICBtVF9fMTYzKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyMToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTUwOiBUX18xNjQKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjE1MDogVF9fMTY0ICovCisgICAgCSAgICAgICAgbVRfXzE2NChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjI6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjE1NzogVF9fMTY1CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxNTc6IFRfXzE2NSAqLworICAgIAkgICAgICAgIG1UX18xNjUoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDIzOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxNjQ6IFRfXzE2NgorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTY0OiBUX18xNjYgKi8KKyAgICAJICAgICAgICBtVF9fMTY2KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyNDoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTcxOiBUX18xNjcKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjE3MTogVF9fMTY3ICovCisgICAgCSAgICAgICAgbVRfXzE2NyhjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjU6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjE3ODogVF9fMTY4CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxNzg6IFRfXzE2OCAqLworICAgIAkgICAgICAgIG1UX18xNjgoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDI2OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxODU6IFRfXzE2OQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTg1OiBUX18xNjkgKi8KKyAgICAJICAgICAgICBtVF9fMTY5KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyNzoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTkyOiBUX18xNzAKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjE5MjogVF9fMTcwICovCisgICAgCSAgICAgICAgbVRfXzE3MChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjg6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjE5OTogVF9fMTcxCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxOTk6IFRfXzE3MSAqLworICAgIAkgICAgICAgIG1UX18xNzEoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDI5OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToyMDY6IFRfXzE3MgorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MjA2OiBUX18xNzIgKi8KKyAgICAJICAgICAgICBtVF9fMTcyKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAzMDoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MjEzOiBUX18xNzMKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjIxMzogVF9fMTczICovCisgICAgCSAgICAgICAgbVRfXzE3MyhjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMzE6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjIyMDogVF9fMTc0CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToyMjA6IFRfXzE3NCAqLworICAgIAkgICAgICAgIG1UX18xNzQoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDMyOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToyMjc6IFRfXzE3NQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MjI3OiBUX18xNzUgKi8KKyAgICAJICAgICAgICBtVF9fMTc1KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAzMzoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MjM0OiBUX18xNzYKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjIzNDogVF9fMTc2ICovCisgICAgCSAgICAgICAgbVRfXzE3NihjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMzQ6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjI0MTogVF9fMTc3CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToyNDE6IFRfXzE3NyAqLworICAgIAkgICAgICAgIG1UX18xNzcoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDM1OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToyNDg6IFRfXzE3OAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MjQ4OiBUX18xNzggKi8KKyAgICAJICAgICAgICBtVF9fMTc4KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAzNjoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MjU1OiBUX18xNzkKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjI1NTogVF9fMTc5ICovCisgICAgCSAgICAgICAgbVRfXzE3OShjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMzc6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjI2MjogVF9fMTgwCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToyNjI6IFRfXzE4MCAqLworICAgIAkgICAgICAgIG1UX18xODAoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDM4OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToyNjk6IFRfXzE4MQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MjY5OiBUX18xODEgKi8KKyAgICAJICAgICAgICBtVF9fMTgxKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAzOToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6Mjc2OiBUX18xODIKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjI3NjogVF9fMTgyICovCisgICAgCSAgICAgICAgbVRfXzE4MihjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgNDA6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjI4MzogVF9fMTgzCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToyODM6IFRfXzE4MyAqLworICAgIAkgICAgICAgIG1UX18xODMoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDQxOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToyOTA6IFRfXzE4NAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MjkwOiBUX18xODQgKi8KKyAgICAJICAgICAgICBtVF9fMTg0KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSA0MjoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6Mjk3OiBUX18xODUKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjI5NzogVF9fMTg1ICovCisgICAgCSAgICAgICAgbVRfXzE4NShjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgNDM6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjMwNDogVF9fMTg2CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTozMDQ6IFRfXzE4NiAqLworICAgIAkgICAgICAgIG1UX18xODYoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDQ0OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTozMTE6IFRfXzE4NworICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MzExOiBUX18xODcgKi8KKyAgICAJICAgICAgICBtVF9fMTg3KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSA0NToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MzE4OiBUX18xODgKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjMxODogVF9fMTg4ICovCisgICAgCSAgICAgICAgbVRfXzE4OChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgNDY6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjMyNTogVF9fMTg5CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTozMjU6IFRfXzE4OSAqLworICAgIAkgICAgICAgIG1UX18xODkoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDQ3OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTozMzI6IFRfXzE5MAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MzMyOiBUX18xOTAgKi8KKyAgICAJICAgICAgICBtVF9fMTkwKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSA0ODoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MzM5OiBUX18xOTEKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjMzOTogVF9fMTkxICovCisgICAgCSAgICAgICAgbVRfXzE5MShjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgNDk6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjM0NjogVF9fMTkyCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTozNDY6IFRfXzE5MiAqLworICAgIAkgICAgICAgIG1UX18xOTIoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDUwOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTozNTM6IFRfXzE5MworICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MzUzOiBUX18xOTMgKi8KKyAgICAJICAgICAgICBtVF9fMTkzKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSA1MToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MzYwOiBUX18xOTQKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjM2MDogVF9fMTk0ICovCisgICAgCSAgICAgICAgbVRfXzE5NChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgNTI6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjM2NzogVF9fMTk1CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTozNjc6IFRfXzE5NSAqLworICAgIAkgICAgICAgIG1UX18xOTUoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDUzOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTozNzQ6IFRfXzE5NgorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6Mzc0OiBUX18xOTYgKi8KKyAgICAJICAgICAgICBtVF9fMTk2KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSA1NDoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MzgxOiBUX18xOTcKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjM4MTogVF9fMTk3ICovCisgICAgCSAgICAgICAgbVRfXzE5NyhjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgNTU6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjM4ODogVF9fMTk4CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTozODg6IFRfXzE5OCAqLworICAgIAkgICAgICAgIG1UX18xOTgoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDU2OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTozOTU6IFRfXzE5OQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6Mzk1OiBUX18xOTkgKi8KKyAgICAJICAgICAgICBtVF9fMTk5KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSA1NzoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6NDAyOiBUX18yMDAKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjQwMjogVF9fMjAwICovCisgICAgCSAgICAgICAgbVRfXzIwMChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgNTg6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjQwOTogVF9fMjAxCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTo0MDk6IFRfXzIwMSAqLworICAgIAkgICAgICAgIG1UX18yMDEoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDU5OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTo0MTY6IFRfXzIwMgorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6NDE2OiBUX18yMDIgKi8KKyAgICAJICAgICAgICBtVF9fMjAyKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSA2MDoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6NDIzOiBUX18yMDMKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjQyMzogVF9fMjAzICovCisgICAgCSAgICAgICAgbVRfXzIwMyhjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgNjE6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjQzMDogVF9fMjA0CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTo0MzA6IFRfXzIwNCAqLworICAgIAkgICAgICAgIG1UX18yMDQoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDYyOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTo0Mzc6IFRfXzIwNQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6NDM3OiBUX18yMDUgKi8KKyAgICAJICAgICAgICBtVF9fMjA1KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSA2MzoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6NDQ0OiBUX18yMDYKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjQ0NDogVF9fMjA2ICovCisgICAgCSAgICAgICAgbVRfXzIwNihjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgNjQ6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjQ1MTogVF9fMjA3CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTo0NTE6IFRfXzIwNyAqLworICAgIAkgICAgICAgIG1UX18yMDcoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDY1OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTo0NTg6IFRfXzIwOAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6NDU4OiBUX18yMDggKi8KKyAgICAJICAgICAgICBtVF9fMjA4KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSA2NjoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6NDY1OiBUX18yMDkKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjQ2NTogVF9fMjA5ICovCisgICAgCSAgICAgICAgbVRfXzIwOShjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgNjc6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjQ3MjogVF9fMjEwCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTo0NzI6IFRfXzIxMCAqLworICAgIAkgICAgICAgIG1UX18yMTAoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDY4OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTo0Nzk6IFRfXzIxMQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6NDc5OiBUX18yMTEgKi8KKyAgICAJICAgICAgICBtVF9fMjExKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSA2OToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6NDg2OiBUX18yMTIKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjQ4NjogVF9fMjEyICovCisgICAgCSAgICAgICAgbVRfXzIxMihjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgNzA6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjQ5MzogVF9fMjEzCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTo0OTM6IFRfXzIxMyAqLworICAgIAkgICAgICAgIG1UX18yMTMoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDcxOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTo1MDA6IFRfXzIxNAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6NTAwOiBUX18yMTQgKi8KKyAgICAJICAgICAgICBtVF9fMjE0KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSA3MjoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6NTA3OiBUX18yMTUKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjUwNzogVF9fMjE1ICovCisgICAgCSAgICAgICAgbVRfXzIxNShjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgNzM6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjUxNDogVF9fMjE2CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTo1MTQ6IFRfXzIxNiAqLworICAgIAkgICAgICAgIG1UX18yMTYoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDc0OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTo1MjE6IFRfXzIxNworICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6NTIxOiBUX18yMTcgKi8KKyAgICAJICAgICAgICBtVF9fMjE3KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSA3NToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6NTI4OiBUX18yMTgKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjUyODogVF9fMjE4ICovCisgICAgCSAgICAgICAgbVRfXzIxOChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgNzY6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjUzNTogVF9fMjE5CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTo1MzU6IFRfXzIxOSAqLworICAgIAkgICAgICAgIG1UX18yMTkoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDc3OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTo1NDI6IFRfXzIyMAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6NTQyOiBUX18yMjAgKi8KKyAgICAJICAgICAgICBtVF9fMjIwKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSA3ODoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6NTQ5OiBUX18yMjEKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjU0OTogVF9fMjIxICovCisgICAgCSAgICAgICAgbVRfXzIyMShjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgNzk6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjU1NjogVF9fMjIyCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTo1NTY6IFRfXzIyMiAqLworICAgIAkgICAgICAgIG1UX18yMjIoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDgwOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTo1NjM6IFRfXzIyMworICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6NTYzOiBUX18yMjMgKi8KKyAgICAJICAgICAgICBtVF9fMjIzKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSA4MToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6NTcwOiBUX18yMjQKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjU3MDogVF9fMjI0ICovCisgICAgCSAgICAgICAgbVRfXzIyNChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgODI6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjU3NzogVF9fMjI1CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTo1Nzc6IFRfXzIyNSAqLworICAgIAkgICAgICAgIG1UX18yMjUoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDgzOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTo1ODQ6IFRfXzIyNgorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6NTg0OiBUX18yMjYgKi8KKyAgICAJICAgICAgICBtVF9fMjI2KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSA4NDoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6NTkxOiBUX18yMjcKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjU5MTogVF9fMjI3ICovCisgICAgCSAgICAgICAgbVRfXzIyNyhjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgODU6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjU5ODogVF9fMjI4CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTo1OTg6IFRfXzIyOCAqLworICAgIAkgICAgICAgIG1UX18yMjgoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDg2OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTo2MDU6IFRfXzIyOQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6NjA1OiBUX18yMjkgKi8KKyAgICAJICAgICAgICBtVF9fMjI5KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSA4NzoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6NjEyOiBUX18yMzAKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjYxMjogVF9fMjMwICovCisgICAgCSAgICAgICAgbVRfXzIzMChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgODg6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjYxOTogVF9fMjMxCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTo2MTk6IFRfXzIzMSAqLworICAgIAkgICAgICAgIG1UX18yMzEoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDg5OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTo2MjY6IFRfXzIzMgorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6NjI2OiBUX18yMzIgKi8KKyAgICAJICAgICAgICBtVF9fMjMyKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSA5MDoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6NjMzOiBUX18yMzMKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjYzMzogVF9fMjMzICovCisgICAgCSAgICAgICAgbVRfXzIzMyhjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgOTE6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjY0MDogVF9fMjM0CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTo2NDA6IFRfXzIzNCAqLworICAgIAkgICAgICAgIG1UX18yMzQoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDkyOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTo2NDc6IFRfXzIzNQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6NjQ3OiBUX18yMzUgKi8KKyAgICAJICAgICAgICBtVF9fMjM1KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSA5MzoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6NjU0OiBUX18yMzYKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjY1NDogVF9fMjM2ICovCisgICAgCSAgICAgICAgbVRfXzIzNihjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgOTQ6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjY2MTogVF9fMjM3CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTo2NjE6IFRfXzIzNyAqLworICAgIAkgICAgICAgIG1UX18yMzcoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDk1OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTo2Njg6IFRfXzIzOAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6NjY4OiBUX18yMzggKi8KKyAgICAJICAgICAgICBtVF9fMjM4KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSA5NjoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6Njc1OiBUX18yMzkKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjY3NTogVF9fMjM5ICovCisgICAgCSAgICAgICAgbVRfXzIzOShjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgOTc6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjY4MjogVF9fMjQwCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTo2ODI6IFRfXzI0MCAqLworICAgIAkgICAgICAgIG1UX18yNDAoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDk4OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTo2ODk6IFRfXzI0MQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6Njg5OiBUX18yNDEgKi8KKyAgICAJICAgICAgICBtVF9fMjQxKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSA5OToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6Njk2OiBUX18yNDIKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjY5NjogVF9fMjQyICovCisgICAgCSAgICAgICAgbVRfXzI0MihjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMTAwOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTo3MDM6IFRfXzI0MworICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6NzAzOiBUX18yNDMgKi8KKyAgICAJICAgICAgICBtVF9fMjQzKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAxMDE6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjcxMDogVF9fMjQ0CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTo3MTA6IFRfXzI0NCAqLworICAgIAkgICAgICAgIG1UX18yNDQoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDEwMjoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6NzE3OiBUX18yNDUKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjcxNzogVF9fMjQ1ICovCisgICAgCSAgICAgICAgbVRfXzI0NShjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMTAzOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTo3MjQ6IFRfXzI0NgorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6NzI0OiBUX18yNDYgKi8KKyAgICAJICAgICAgICBtVF9fMjQ2KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAxMDQ6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjczMTogVF9fMjQ3CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTo3MzE6IFRfXzI0NyAqLworICAgIAkgICAgICAgIG1UX18yNDcoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDEwNToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6NzM4OiBUX18yNDgKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjczODogVF9fMjQ4ICovCisgICAgCSAgICAgICAgbVRfXzI0OChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMTA2OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTo3NDU6IFRfXzI0OQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6NzQ1OiBUX18yNDkgKi8KKyAgICAJICAgICAgICBtVF9fMjQ5KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAxMDc6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjc1MjogVF9fMjUwCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTo3NTI6IFRfXzI1MCAqLworICAgIAkgICAgICAgIG1UX18yNTAoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDEwODoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6NzU5OiBUX18yNTEKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjc1OTogVF9fMjUxICovCisgICAgCSAgICAgICAgbVRfXzI1MShjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMTA5OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTo3NjY6IFRfXzI1MgorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6NzY2OiBUX18yNTIgKi8KKyAgICAJICAgICAgICBtVF9fMjUyKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAxMTA6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjc3MzogVF9fMjUzCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTo3NzM6IFRfXzI1MyAqLworICAgIAkgICAgICAgIG1UX18yNTMoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDExMToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6NzgwOiBUX18yNTQKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjc4MDogVF9fMjU0ICovCisgICAgCSAgICAgICAgbVRfXzI1NChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMTEyOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTo3ODc6IFRfXzI1NQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6Nzg3OiBUX18yNTUgKi8KKyAgICAJICAgICAgICBtVF9fMjU1KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAxMTM6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjc5NDogVF9fMjU2CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTo3OTQ6IFRfXzI1NiAqLworICAgIAkgICAgICAgIG1UX18yNTYoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDExNDoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6ODAxOiBUX18yNTcKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjgwMTogVF9fMjU3ICovCisgICAgCSAgICAgICAgbVRfXzI1NyhjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMTE1OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTo4MDg6IFRfXzI1OAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6ODA4OiBUX18yNTggKi8KKyAgICAJICAgICAgICBtVF9fMjU4KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAxMTY6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjgxNTogVF9fMjU5CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTo4MTU6IFRfXzI1OSAqLworICAgIAkgICAgICAgIG1UX18yNTkoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDExNzoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6ODIyOiBUX18yNjAKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjgyMjogVF9fMjYwICovCisgICAgCSAgICAgICAgbVRfXzI2MChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMTE4OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTo4Mjk6IFRfXzI2MQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6ODI5OiBUX18yNjEgKi8KKyAgICAJICAgICAgICBtVF9fMjYxKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAxMTk6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjgzNjogVF9fMjYyCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTo4MzY6IFRfXzI2MiAqLworICAgIAkgICAgICAgIG1UX18yNjIoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDEyMDoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6ODQzOiBUX18yNjMKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjg0MzogVF9fMjYzICovCisgICAgCSAgICAgICAgbVRfXzI2MyhjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMTIxOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTo4NTA6IFRfXzI2NAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6ODUwOiBUX18yNjQgKi8KKyAgICAJICAgICAgICBtVF9fMjY0KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAxMjI6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjg1NzogVF9fMjY1CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTo4NTc6IFRfXzI2NSAqLworICAgIAkgICAgICAgIG1UX18yNjUoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDEyMzoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6ODY0OiBUX18yNjYKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjg2NDogVF9fMjY2ICovCisgICAgCSAgICAgICAgbVRfXzI2NihjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMTI0OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTo4NzE6IFRfXzI2NworICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6ODcxOiBUX18yNjcgKi8KKyAgICAJICAgICAgICBtVF9fMjY3KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAxMjU6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjg3ODogVF9fMjY4CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTo4Nzg6IFRfXzI2OCAqLworICAgIAkgICAgICAgIG1UX18yNjgoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDEyNjoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6ODg1OiBUX18yNjkKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjg4NTogVF9fMjY5ICovCisgICAgCSAgICAgICAgbVRfXzI2OShjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMTI3OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTo4OTI6IFRfXzI3MAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6ODkyOiBUX18yNzAgKi8KKyAgICAJICAgICAgICBtVF9fMjcwKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAxMjg6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjg5OTogVF9fMjcxCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTo4OTk6IFRfXzI3MSAqLworICAgIAkgICAgICAgIG1UX18yNzEoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDEyOToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6OTA2OiBUX18yNzIKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjkwNjogVF9fMjcyICovCisgICAgCSAgICAgICAgbVRfXzI3MihjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMTMwOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTo5MTM6IFRfXzI3MworICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6OTEzOiBUX18yNzMgKi8KKyAgICAJICAgICAgICBtVF9fMjczKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAxMzE6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjkyMDogVF9fMjc0CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTo5MjA6IFRfXzI3NCAqLworICAgIAkgICAgICAgIG1UX18yNzQoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDEzMjoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6OTI3OiBUX18yNzUKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjkyNzogVF9fMjc1ICovCisgICAgCSAgICAgICAgbVRfXzI3NShjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMTMzOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTo5MzQ6IFRfXzI3NgorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6OTM0OiBUX18yNzYgKi8KKyAgICAJICAgICAgICBtVF9fMjc2KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAxMzQ6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjk0MTogVF9fMjc3CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTo5NDE6IFRfXzI3NyAqLworICAgIAkgICAgICAgIG1UX18yNzcoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDEzNToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6OTQ4OiBUX18yNzgKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjk0ODogVF9fMjc4ICovCisgICAgCSAgICAgICAgbVRfXzI3OChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMTM2OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTo5NTU6IFRfXzI3OQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6OTU1OiBUX18yNzkgKi8KKyAgICAJICAgICAgICBtVF9fMjc5KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAxMzc6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjk2MjogVF9fMjgwCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTo5NjI6IFRfXzI4MCAqLworICAgIAkgICAgICAgIG1UX18yODAoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDEzODoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6OTY5OiBUX18yODEKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjk2OTogVF9fMjgxICovCisgICAgCSAgICAgICAgbVRfXzI4MShjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMTM5OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTo5NzY6IFRfXzI4MgorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6OTc2OiBUX18yODIgKi8KKyAgICAJICAgICAgICBtVF9fMjgyKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAxNDA6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjk4MzogVF9fMjgzCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTo5ODM6IFRfXzI4MyAqLworICAgIAkgICAgICAgIG1UX18yODMoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDE0MToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6OTkwOiBUX18yODQKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjk5MDogVF9fMjg0ICovCisgICAgCSAgICAgICAgbVRfXzI4NChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMTQyOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTo5OTc6IFRfXzI4NQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6OTk3OiBUX18yODUgKi8KKyAgICAJICAgICAgICBtVF9fMjg1KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAxNDM6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjEwMDQ6IFRfXzI4NgorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTAwNDogVF9fMjg2ICovCisgICAgCSAgICAgICAgbVRfXzI4NihjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMTQ0OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxMDExOiBUX18yODcKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjEwMTE6IFRfXzI4NyAqLworICAgIAkgICAgICAgIG1UX18yODcoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDE0NToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTAxODogVF9fMjg4CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxMDE4OiBUX18yODggKi8KKyAgICAJICAgICAgICBtVF9fMjg4KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAxNDY6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjEwMjU6IFRfXzI4OQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTAyNTogVF9fMjg5ICovCisgICAgCSAgICAgICAgbVRfXzI4OShjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMTQ3OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxMDMyOiBUX18yOTAKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjEwMzI6IFRfXzI5MCAqLworICAgIAkgICAgICAgIG1UX18yOTAoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDE0ODoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTAzOTogVF9fMjkxCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxMDM5OiBUX18yOTEgKi8KKyAgICAJICAgICAgICBtVF9fMjkxKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAxNDk6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjEwNDY6IFRfXzI5MgorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTA0NjogVF9fMjkyICovCisgICAgCSAgICAgICAgbVRfXzI5MihjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMTUwOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxMDUzOiBUX18yOTMKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjEwNTM6IFRfXzI5MyAqLworICAgIAkgICAgICAgIG1UX18yOTMoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDE1MToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTA2MDogVF9fMjk0CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxMDYwOiBUX18yOTQgKi8KKyAgICAJICAgICAgICBtVF9fMjk0KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAxNTI6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjEwNjc6IFRfXzI5NQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTA2NzogVF9fMjk1ICovCisgICAgCSAgICAgICAgbVRfXzI5NShjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMTUzOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxMDc0OiBUX18yOTYKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjEwNzQ6IFRfXzI5NiAqLworICAgIAkgICAgICAgIG1UX18yOTYoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDE1NDoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTA4MTogVF9fMjk3CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxMDgxOiBUX18yOTcgKi8KKyAgICAJICAgICAgICBtVF9fMjk3KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAxNTU6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjEwODg6IFRfXzI5OAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTA4ODogVF9fMjk4ICovCisgICAgCSAgICAgICAgbVRfXzI5OChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMTU2OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxMDk1OiBUX18yOTkKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjEwOTU6IFRfXzI5OSAqLworICAgIAkgICAgICAgIG1UX18yOTkoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDE1NzoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTEwMjogVF9fMzAwCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxMTAyOiBUX18zMDAgKi8KKyAgICAJICAgICAgICBtVF9fMzAwKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAxNTg6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjExMDk6IFRfXzMwMQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTEwOTogVF9fMzAxICovCisgICAgCSAgICAgICAgbVRfXzMwMShjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMTU5OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxMTE2OiBUX18zMDIKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjExMTY6IFRfXzMwMiAqLworICAgIAkgICAgICAgIG1UX18zMDIoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDE2MDoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTEyMzogVF9fMzAzCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxMTIzOiBUX18zMDMgKi8KKyAgICAJICAgICAgICBtVF9fMzAzKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAxNjE6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjExMzA6IFRfXzMwNAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTEzMDogVF9fMzA0ICovCisgICAgCSAgICAgICAgbVRfXzMwNChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMTYyOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxMTM3OiBUX18zMDUKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjExMzc6IFRfXzMwNSAqLworICAgIAkgICAgICAgIG1UX18zMDUoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDE2MzoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTE0NDogVF9fMzA2CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxMTQ0OiBUX18zMDYgKi8KKyAgICAJICAgICAgICBtVF9fMzA2KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAxNjQ6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjExNTE6IFRfXzMwNworICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTE1MTogVF9fMzA3ICovCisgICAgCSAgICAgICAgbVRfXzMwNyhjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMTY1OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxMTU4OiBUX18zMDgKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjExNTg6IFRfXzMwOCAqLworICAgIAkgICAgICAgIG1UX18zMDgoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDE2NjoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTE2NTogVF9fMzA5CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxMTY1OiBUX18zMDkgKi8KKyAgICAJICAgICAgICBtVF9fMzA5KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAxNjc6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjExNzI6IFRfXzMxMAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTE3MjogVF9fMzEwICovCisgICAgCSAgICAgICAgbVRfXzMxMChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMTY4OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxMTc5OiBUX18zMTEKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjExNzk6IFRfXzMxMSAqLworICAgIAkgICAgICAgIG1UX18zMTEoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDE2OToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTE4NjogVF9fMzEyCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxMTg2OiBUX18zMTIgKi8KKyAgICAJICAgICAgICBtVF9fMzEyKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAxNzA6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjExOTM6IFRfXzMxMworICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTE5MzogVF9fMzEzICovCisgICAgCSAgICAgICAgbVRfXzMxMyhjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMTcxOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxMjAwOiBUX18zMTQKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjEyMDA6IFRfXzMxNCAqLworICAgIAkgICAgICAgIG1UX18zMTQoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDE3MjoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTIwNzogVF9fMzE1CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxMjA3OiBUX18zMTUgKi8KKyAgICAJICAgICAgICBtVF9fMzE1KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAxNzM6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjEyMTQ6IFRfXzMxNgorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTIxNDogVF9fMzE2ICovCisgICAgCSAgICAgICAgbVRfXzMxNihjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMTc0OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxMjIxOiBUX18zMTcKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjEyMjE6IFRfXzMxNyAqLworICAgIAkgICAgICAgIG1UX18zMTcoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDE3NToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTIyODogVF9fMzE4CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxMjI4OiBUX18zMTggKi8KKyAgICAJICAgICAgICBtVF9fMzE4KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAxNzY6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjEyMzU6IFRfXzMxOQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTIzNTogVF9fMzE5ICovCisgICAgCSAgICAgICAgbVRfXzMxOShjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMTc3OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxMjQyOiBUX18zMjAKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjEyNDI6IFRfXzMyMCAqLworICAgIAkgICAgICAgIG1UX18zMjAoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDE3ODoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTI0OTogVF9fMzIxCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxMjQ5OiBUX18zMjEgKi8KKyAgICAJICAgICAgICBtVF9fMzIxKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAxNzk6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjEyNTY6IFRfXzMyMgorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTI1NjogVF9fMzIyICovCisgICAgCSAgICAgICAgbVRfXzMyMihjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMTgwOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxMjYzOiBUX18zMjMKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjEyNjM6IFRfXzMyMyAqLworICAgIAkgICAgICAgIG1UX18zMjMoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDE4MToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTI3MDogVF9fMzI0CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxMjcwOiBUX18zMjQgKi8KKyAgICAJICAgICAgICBtVF9fMzI0KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAxODI6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjEyNzc6IFRfXzMyNQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTI3NzogVF9fMzI1ICovCisgICAgCSAgICAgICAgbVRfXzMyNShjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMTgzOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxMjg0OiBUX18zMjYKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjEyODQ6IFRfXzMyNiAqLworICAgIAkgICAgICAgIG1UX18zMjYoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDE4NDoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTI5MTogVF9fMzI3CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxMjkxOiBUX18zMjcgKi8KKyAgICAJICAgICAgICBtVF9fMzI3KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAxODU6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjEyOTg6IFRfXzMyOAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTI5ODogVF9fMzI4ICovCisgICAgCSAgICAgICAgbVRfXzMyOChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMTg2OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxMzA1OiBUX18zMjkKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjEzMDU6IFRfXzMyOSAqLworICAgIAkgICAgICAgIG1UX18zMjkoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDE4NzoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTMxMjogVF9fMzMwCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxMzEyOiBUX18zMzAgKi8KKyAgICAJICAgICAgICBtVF9fMzMwKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAxODg6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjEzMTk6IFRfXzMzMQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTMxOTogVF9fMzMxICovCisgICAgCSAgICAgICAgbVRfXzMzMShjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMTg5OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxMzI2OiBUX18zMzIKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjEzMjY6IFRfXzMzMiAqLworICAgIAkgICAgICAgIG1UX18zMzIoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDE5MDoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTMzMzogVF9fMzMzCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxMzMzOiBUX18zMzMgKi8KKyAgICAJICAgICAgICBtVF9fMzMzKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAxOTE6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjEzNDA6IFRfXzMzNAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTM0MDogVF9fMzM0ICovCisgICAgCSAgICAgICAgbVRfXzMzNChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMTkyOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxMzQ3OiBUX18zMzUKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjEzNDc6IFRfXzMzNSAqLworICAgIAkgICAgICAgIG1UX18zMzUoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDE5MzoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTM1NDogVF9fMzM2CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxMzU0OiBUX18zMzYgKi8KKyAgICAJICAgICAgICBtVF9fMzM2KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAxOTQ6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjEzNjE6IFRfXzMzNworICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTM2MTogVF9fMzM3ICovCisgICAgCSAgICAgICAgbVRfXzMzNyhjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMTk1OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxMzY4OiBUX18zMzgKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjEzNjg6IFRfXzMzOCAqLworICAgIAkgICAgICAgIG1UX18zMzgoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDE5NjoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTM3NTogVF9fMzM5CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxMzc1OiBUX18zMzkgKi8KKyAgICAJICAgICAgICBtVF9fMzM5KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAxOTc6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjEzODI6IFRfXzM0MAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTM4MjogVF9fMzQwICovCisgICAgCSAgICAgICAgbVRfXzM0MChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMTk4OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxMzg5OiBUX18zNDEKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjEzODk6IFRfXzM0MSAqLworICAgIAkgICAgICAgIG1UX18zNDEoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDE5OToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTM5NjogVF9fMzQyCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxMzk2OiBUX18zNDIgKi8KKyAgICAJICAgICAgICBtVF9fMzQyKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyMDA6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjE0MDM6IFRfXzM0MworICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTQwMzogVF9fMzQzICovCisgICAgCSAgICAgICAgbVRfXzM0MyhjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjAxOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxNDEwOiBUX18zNDQKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjE0MTA6IFRfXzM0NCAqLworICAgIAkgICAgICAgIG1UX18zNDQoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDIwMjoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTQxNzogVF9fMzQ1CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxNDE3OiBUX18zNDUgKi8KKyAgICAJICAgICAgICBtVF9fMzQ1KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyMDM6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjE0MjQ6IFRfXzM0NgorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTQyNDogVF9fMzQ2ICovCisgICAgCSAgICAgICAgbVRfXzM0NihjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjA0OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxNDMxOiBUX18zNDcKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjE0MzE6IFRfXzM0NyAqLworICAgIAkgICAgICAgIG1UX18zNDcoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDIwNToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTQzODogVF9fMzQ4CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxNDM4OiBUX18zNDggKi8KKyAgICAJICAgICAgICBtVF9fMzQ4KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyMDY6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjE0NDU6IFRfXzM0OQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTQ0NTogVF9fMzQ5ICovCisgICAgCSAgICAgICAgbVRfXzM0OShjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjA3OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxNDUyOiBUX18zNTAKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjE0NTI6IFRfXzM1MCAqLworICAgIAkgICAgICAgIG1UX18zNTAoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDIwODoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTQ1OTogVF9fMzUxCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxNDU5OiBUX18zNTEgKi8KKyAgICAJICAgICAgICBtVF9fMzUxKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyMDk6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjE0NjY6IFRfXzM1MgorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTQ2NjogVF9fMzUyICovCisgICAgCSAgICAgICAgbVRfXzM1MihjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjEwOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxNDczOiBUX18zNTMKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjE0NzM6IFRfXzM1MyAqLworICAgIAkgICAgICAgIG1UX18zNTMoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDIxMToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTQ4MDogVF9fMzU0CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxNDgwOiBUX18zNTQgKi8KKyAgICAJICAgICAgICBtVF9fMzU0KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyMTI6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjE0ODc6IFRfXzM1NQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTQ4NzogVF9fMzU1ICovCisgICAgCSAgICAgICAgbVRfXzM1NShjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjEzOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxNDk0OiBUX18zNTYKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjE0OTQ6IFRfXzM1NiAqLworICAgIAkgICAgICAgIG1UX18zNTYoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDIxNDoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTUwMTogVF9fMzU3CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxNTAxOiBUX18zNTcgKi8KKyAgICAJICAgICAgICBtVF9fMzU3KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyMTU6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjE1MDg6IFRfXzM1OAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTUwODogVF9fMzU4ICovCisgICAgCSAgICAgICAgbVRfXzM1OChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjE2OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxNTE1OiBUX18zNTkKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjE1MTU6IFRfXzM1OSAqLworICAgIAkgICAgICAgIG1UX18zNTkoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDIxNzoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTUyMjogVF9fMzYwCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxNTIyOiBUX18zNjAgKi8KKyAgICAJICAgICAgICBtVF9fMzYwKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyMTg6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjE1Mjk6IFRfXzM2MQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTUyOTogVF9fMzYxICovCisgICAgCSAgICAgICAgbVRfXzM2MShjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjE5OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxNTM2OiBUX18zNjIKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjE1MzY6IFRfXzM2MiAqLworICAgIAkgICAgICAgIG1UX18zNjIoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDIyMDoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTU0MzogVF9fMzYzCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxNTQzOiBUX18zNjMgKi8KKyAgICAJICAgICAgICBtVF9fMzYzKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyMjE6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjE1NTA6IFRfXzM2NAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTU1MDogVF9fMzY0ICovCisgICAgCSAgICAgICAgbVRfXzM2NChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjIyOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxNTU3OiBUX18zNjUKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjE1NTc6IFRfXzM2NSAqLworICAgIAkgICAgICAgIG1UX18zNjUoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDIyMzoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTU2NDogVF9fMzY2CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxNTY0OiBUX18zNjYgKi8KKyAgICAJICAgICAgICBtVF9fMzY2KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyMjQ6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjE1NzE6IFRfXzM2NworICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTU3MTogVF9fMzY3ICovCisgICAgCSAgICAgICAgbVRfXzM2NyhjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjI1OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxNTc4OiBUX18zNjgKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjE1Nzg6IFRfXzM2OCAqLworICAgIAkgICAgICAgIG1UX18zNjgoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDIyNjoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTU4NTogVF9fMzY5CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxNTg1OiBUX18zNjkgKi8KKyAgICAJICAgICAgICBtVF9fMzY5KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyMjc6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjE1OTI6IFRfXzM3MAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTU5MjogVF9fMzcwICovCisgICAgCSAgICAgICAgbVRfXzM3MChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjI4OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxNTk5OiBUX18zNzEKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjE1OTk6IFRfXzM3MSAqLworICAgIAkgICAgICAgIG1UX18zNzEoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDIyOToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTYwNjogVF9fMzcyCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxNjA2OiBUX18zNzIgKi8KKyAgICAJICAgICAgICBtVF9fMzcyKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyMzA6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjE2MTM6IFRfXzM3MworICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTYxMzogVF9fMzczICovCisgICAgCSAgICAgICAgbVRfXzM3MyhjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjMxOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxNjIwOiBUX18zNzQKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjE2MjA6IFRfXzM3NCAqLworICAgIAkgICAgICAgIG1UX18zNzQoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDIzMjoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTYyNzogVF9fMzc1CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxNjI3OiBUX18zNzUgKi8KKyAgICAJICAgICAgICBtVF9fMzc1KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyMzM6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjE2MzQ6IFRfXzM3NgorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTYzNDogVF9fMzc2ICovCisgICAgCSAgICAgICAgbVRfXzM3NihjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjM0OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxNjQxOiBUX18zNzcKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjE2NDE6IFRfXzM3NyAqLworICAgIAkgICAgICAgIG1UX18zNzcoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDIzNToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTY0ODogVF9fMzc4CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxNjQ4OiBUX18zNzggKi8KKyAgICAJICAgICAgICBtVF9fMzc4KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyMzY6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjE2NTU6IFRfXzM3OQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTY1NTogVF9fMzc5ICovCisgICAgCSAgICAgICAgbVRfXzM3OShjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjM3OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxNjYyOiBUX18zODAKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjE2NjI6IFRfXzM4MCAqLworICAgIAkgICAgICAgIG1UX18zODAoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDIzODoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTY2OTogVF9fMzgxCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxNjY5OiBUX18zODEgKi8KKyAgICAJICAgICAgICBtVF9fMzgxKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyMzk6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjE2NzY6IFRfXzM4MgorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTY3NjogVF9fMzgyICovCisgICAgCSAgICAgICAgbVRfXzM4MihjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjQwOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxNjgzOiBUX18zODMKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjE2ODM6IFRfXzM4MyAqLworICAgIAkgICAgICAgIG1UX18zODMoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDI0MToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTY5MDogVF9fMzg0CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxNjkwOiBUX18zODQgKi8KKyAgICAJICAgICAgICBtVF9fMzg0KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyNDI6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjE2OTc6IFRfXzM4NQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTY5NzogVF9fMzg1ICovCisgICAgCSAgICAgICAgbVRfXzM4NShjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjQzOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxNzA0OiBUX18zODYKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjE3MDQ6IFRfXzM4NiAqLworICAgIAkgICAgICAgIG1UX18zODYoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDI0NDoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTcxMTogVF9fMzg3CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxNzExOiBUX18zODcgKi8KKyAgICAJICAgICAgICBtVF9fMzg3KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyNDU6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjE3MTg6IFRfXzM4OAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTcxODogVF9fMzg4ICovCisgICAgCSAgICAgICAgbVRfXzM4OChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjQ2OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxNzI1OiBUX18zODkKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjE3MjU6IFRfXzM4OSAqLworICAgIAkgICAgICAgIG1UX18zODkoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDI0NzoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTczMjogVF9fMzkwCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxNzMyOiBUX18zOTAgKi8KKyAgICAJICAgICAgICBtVF9fMzkwKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyNDg6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjE3Mzk6IFRfXzM5MQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTczOTogVF9fMzkxICovCisgICAgCSAgICAgICAgbVRfXzM5MShjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjQ5OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxNzQ2OiBUX18zOTIKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjE3NDY6IFRfXzM5MiAqLworICAgIAkgICAgICAgIG1UX18zOTIoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDI1MDoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTc1MzogVF9fMzkzCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxNzUzOiBUX18zOTMgKi8KKyAgICAJICAgICAgICBtVF9fMzkzKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyNTE6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjE3NjA6IFRfXzM5NAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTc2MDogVF9fMzk0ICovCisgICAgCSAgICAgICAgbVRfXzM5NChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjUyOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxNzY3OiBUX18zOTUKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjE3Njc6IFRfXzM5NSAqLworICAgIAkgICAgICAgIG1UX18zOTUoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDI1MzoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTc3NDogVF9fMzk2CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxNzc0OiBUX18zOTYgKi8KKyAgICAJICAgICAgICBtVF9fMzk2KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyNTQ6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjE3ODE6IFRfXzM5NworICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTc4MTogVF9fMzk3ICovCisgICAgCSAgICAgICAgbVRfXzM5NyhjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjU1OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxNzg4OiBUX18zOTgKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjE3ODg6IFRfXzM5OCAqLworICAgIAkgICAgICAgIG1UX18zOTgoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDI1NjoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTc5NTogVF9fMzk5CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxNzk1OiBUX18zOTkgKi8KKyAgICAJICAgICAgICBtVF9fMzk5KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyNTc6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjE4MDI6IFRfXzQwMAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTgwMjogVF9fNDAwICovCisgICAgCSAgICAgICAgbVRfXzQwMChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjU4OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxODA5OiBUX180MDEKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjE4MDk6IFRfXzQwMSAqLworICAgIAkgICAgICAgIG1UX180MDEoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDI1OToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTgxNjogVF9fNDAyCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxODE2OiBUX180MDIgKi8KKyAgICAJICAgICAgICBtVF9fNDAyKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyNjA6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjE4MjM6IFRfXzQwMworICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTgyMzogVF9fNDAzICovCisgICAgCSAgICAgICAgbVRfXzQwMyhjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjYxOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxODMwOiBUX180MDQKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjE4MzA6IFRfXzQwNCAqLworICAgIAkgICAgICAgIG1UX180MDQoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDI2MjoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTgzNzogVF9fNDA1CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxODM3OiBUX180MDUgKi8KKyAgICAJICAgICAgICBtVF9fNDA1KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyNjM6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjE4NDQ6IFRfXzQwNgorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTg0NDogVF9fNDA2ICovCisgICAgCSAgICAgICAgbVRfXzQwNihjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjY0OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxODUxOiBUX180MDcKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjE4NTE6IFRfXzQwNyAqLworICAgIAkgICAgICAgIG1UX180MDcoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDI2NToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTg1ODogVF9fNDA4CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxODU4OiBUX180MDggKi8KKyAgICAJICAgICAgICBtVF9fNDA4KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyNjY6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjE4NjU6IFRfXzQwOQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTg2NTogVF9fNDA5ICovCisgICAgCSAgICAgICAgbVRfXzQwOShjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjY3OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxODcyOiBUX180MTAKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjE4NzI6IFRfXzQxMCAqLworICAgIAkgICAgICAgIG1UX180MTAoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDI2ODoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTg3OTogVF9fNDExCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxODc5OiBUX180MTEgKi8KKyAgICAJICAgICAgICBtVF9fNDExKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyNjk6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjE4ODY6IFRfXzQxMgorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTg4NjogVF9fNDEyICovCisgICAgCSAgICAgICAgbVRfXzQxMihjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjcwOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxODkzOiBUX180MTMKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjE4OTM6IFRfXzQxMyAqLworICAgIAkgICAgICAgIG1UX180MTMoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDI3MToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTkwMDogVF9fNDE0CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxOTAwOiBUX180MTQgKi8KKyAgICAJICAgICAgICBtVF9fNDE0KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyNzI6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjE5MDc6IFRfXzQxNQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTkwNzogVF9fNDE1ICovCisgICAgCSAgICAgICAgbVRfXzQxNShjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjczOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxOTE0OiBUX180MTYKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjE5MTQ6IFRfXzQxNiAqLworICAgIAkgICAgICAgIG1UX180MTYoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDI3NDoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTkyMTogVF9fNDE3CisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToxOTIxOiBUX180MTcgKi8KKyAgICAJICAgICAgICBtVF9fNDE3KGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyNzU6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjE5Mjg6IE9QX0FUT01JQ19TRVFVRU5DRQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTkyODogT1BfQVRPTUlDX1NFUVVFTkNFICovCisgICAgCSAgICAgICAgbU9QX0FUT01JQ19TRVFVRU5DRShjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjc2OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxOTQ3OiBPUF9TRVFVRU5DRQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTk0NzogT1BfU0VRVUVOQ0UgKi8KKyAgICAJICAgICAgICBtT1BfU0VRVUVOQ0UoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDI3NzoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MTk1OTogT1BfU0VRVUVOQ0VfU0lERQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTk1OTogT1BfU0VRVUVOQ0VfU0lERSAqLworICAgIAkgICAgICAgIG1PUF9TRVFVRU5DRV9TSURFKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyNzg6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjE5NzY6IE9QX1NFUVVFTkNFX1dFQUsKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjE5NzY6IE9QX1NFUVVFTkNFX1dFQUsgKi8KKyAgICAJICAgICAgICBtT1BfU0VRVUVOQ0VfV0VBSyhjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjc5OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToxOTkzOiBPUF9TQ0hFRFVMRV9HVAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MTk5MzogT1BfU0NIRURVTEVfR1QgKi8KKyAgICAJICAgICAgICBtT1BfU0NIRURVTEVfR1QoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDI4MDoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MjAwODogT1BfU0NIRURVTEVfTFQKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjIwMDg6IE9QX1NDSEVEVUxFX0xUICovCisgICAgCSAgICAgICAgbU9QX1NDSEVEVUxFX0xUKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyODE6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjIwMjM6IE9QX1NDSEVEVUxFX1hPUgorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MjAyMzogT1BfU0NIRURVTEVfWE9SICovCisgICAgCSAgICAgICAgbU9QX1NDSEVEVUxFX1hPUihjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjgyOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToyMDM5OiBPUF9TQ0hFRFVMRV9BTkRfVEhFTgorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MjAzOTogT1BfU0NIRURVTEVfQU5EX1RIRU4gKi8KKyAgICAJICAgICAgICBtT1BfU0NIRURVTEVfQU5EX1RIRU4oY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDI4MzoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MjA2MDogT1BfU0NIRURVTEVfT1JfRUxTRQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MjA2MDogT1BfU0NIRURVTEVfT1JfRUxTRSAqLworICAgIAkgICAgICAgIG1PUF9TQ0hFRFVMRV9PUl9FTFNFKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyODQ6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjIwODA6IE9QX05PTl9ERVRFUk1JTklTTQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MjA4MDogT1BfTk9OX0RFVEVSTUlOSVNNICovCisgICAgCSAgICAgICAgbU9QX05PTl9ERVRFUk1JTklTTShjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjg1OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToyMDk5OiBPUF9DT05DVVJSRU5DWV9BU1lOQworICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MjA5OTogT1BfQ09OQ1VSUkVOQ1lfQVNZTkMgKi8KKyAgICAJICAgICAgICBtT1BfQ09OQ1VSUkVOQ1lfQVNZTkMoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDI4NjoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MjEyMDogT1BfQ09OQ1VSUkVOQ1lfQU5ECisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToyMTIwOiBPUF9DT05DVVJSRU5DWV9BTkQgKi8KKyAgICAJICAgICAgICBtT1BfQ09OQ1VSUkVOQ1lfQU5EKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyODc6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjIxMzk6IE9QX0NPTkNVUlJFTkNZX09SCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToyMTM5OiBPUF9DT05DVVJSRU5DWV9PUiAqLworICAgIAkgICAgICAgIG1PUF9DT05DVVJSRU5DWV9PUihjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjg4OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToyMTU3OiBPUF9DT05DVVJSRU5DWV9JTlRFUkxFQVZJTkcKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjIxNTc6IE9QX0NPTkNVUlJFTkNZX0lOVEVSTEVBVklORyAqLworICAgIAkgICAgICAgIG1PUF9DT05DVVJSRU5DWV9JTlRFUkxFQVZJTkcoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDI4OToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MjE4NTogT1BfQ09OQ1VSUkVOQ1lfUEFSQUxMRUwKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjIxODU6IE9QX0NPTkNVUlJFTkNZX1BBUkFMTEVMICovCisgICAgCSAgICAgICAgbU9QX0NPTkNVUlJFTkNZX1BBUkFMTEVMKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyOTA6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjIyMDk6IE9QX0ZPUksKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjIyMDk6IE9QX0ZPUksgKi8KKyAgICAJICAgICAgICBtT1BfRk9SSyhjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjkxOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToyMjE3OiBPUF9KT0lOCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToyMjE3OiBPUF9KT0lOICovCisgICAgCSAgICAgICAgbU9QX0pPSU4oY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDI5MjoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MjIyNTogT1BfQ09OQ1VSUkVOQ1lfUkRWX0FTWU5DCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToyMjI1OiBPUF9DT05DVVJSRU5DWV9SRFZfQVNZTkMgKi8KKyAgICAJICAgICAgICBtT1BfQ09OQ1VSUkVOQ1lfUkRWX0FTWU5DKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyOTM6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjIyNTA6IE9QX0NPTkNVUlJFTkNZX1JEVl9BTkQKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjIyNTA6IE9QX0NPTkNVUlJFTkNZX1JEVl9BTkQgKi8KKyAgICAJICAgICAgICBtT1BfQ09OQ1VSUkVOQ1lfUkRWX0FORChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjk0OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToyMjczOiBPUF9DT05DVVJSRU5DWV9SRFZfT1IKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjIyNzM6IE9QX0NPTkNVUlJFTkNZX1JEVl9PUiAqLworICAgIAkgICAgICAgIG1PUF9DT05DVVJSRU5DWV9SRFZfT1IoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDI5NToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MjI5NTogT1BfQ09OQ1VSUkVOQ1lfUkRWX0lOVEVSTEVBVklORworICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MjI5NTogT1BfQ09OQ1VSUkVOQ1lfUkRWX0lOVEVSTEVBVklORyAqLworICAgIAkgICAgICAgIG1PUF9DT05DVVJSRU5DWV9SRFZfSU5URVJMRUFWSU5HKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyOTY6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjIzMjc6IE9QX0NPTkNVUlJFTkNZX1JEVl9QQVJBTExFTAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MjMyNzogT1BfQ09OQ1VSUkVOQ1lfUkRWX1BBUkFMTEVMICovCisgICAgCSAgICAgICAgbU9QX0NPTkNVUlJFTkNZX1JEVl9QQVJBTExFTChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMjk3OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToyMzU1OiBBU1NJR04KKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjIzNTU6IEFTU0lHTiAqLworICAgIAkgICAgICAgIG1BU1NJR04oY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDI5ODoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MjM2MjogQVNTSUdOX0FGVEVSCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToyMzYyOiBBU1NJR05fQUZURVIgKi8KKyAgICAJICAgICAgICBtQVNTSUdOX0FGVEVSKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAyOTk6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjIzNzU6IEFTU0lHTl9SRUYKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjIzNzU6IEFTU0lHTl9SRUYgKi8KKyAgICAJICAgICAgICBtQVNTSUdOX1JFRihjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMzAwOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToyMzg2OiBBU1NJR05fTUFDUk8KKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjIzODY6IEFTU0lHTl9NQUNSTyAqLworICAgIAkgICAgICAgIG1BU1NJR05fTUFDUk8oY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDMwMToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MjM5OTogT1BfUFVTSAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MjM5OTogT1BfUFVTSCAqLworICAgIAkgICAgICAgIG1PUF9QVVNIKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAzMDI6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjI0MDc6IE9QX0FTU0lHTl9UT1AKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjI0MDc6IE9QX0FTU0lHTl9UT1AgKi8KKyAgICAJICAgICAgICBtT1BfQVNTSUdOX1RPUChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMzAzOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToyNDIxOiBPUF9UT1AKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjI0MjE6IE9QX1RPUCAqLworICAgIAkgICAgICAgIG1PUF9UT1AoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDMwNDoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MjQyODogT1BfUE9QCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToyNDI4OiBPUF9QT1AgKi8KKyAgICAJICAgICAgICBtT1BfUE9QKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAzMDU6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjI0MzU6IExQQVJFTgorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MjQzNTogTFBBUkVOICovCisgICAgCSAgICAgICAgbUxQQVJFTihjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMzA2OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToyNDQyOiBSUEFSRU4KKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjI0NDI6IFJQQVJFTiAqLworICAgIAkgICAgICAgIG1SUEFSRU4oY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDMwNzoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MjQ0OTogTENVUkxZCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToyNDQ5OiBMQ1VSTFkgKi8KKyAgICAJICAgICAgICBtTENVUkxZKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAzMDg6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjI0NTY6IFJDVVJMWQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MjQ1NjogUkNVUkxZICovCisgICAgCSAgICAgICAgbVJDVVJMWShjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMzA5OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToyNDYzOiBMQlJBQ0tFVAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MjQ2MzogTEJSQUNLRVQgKi8KKyAgICAJICAgICAgICBtTEJSQUNLRVQoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDMxMDoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MjQ3MjogUkJSQUNLRVQKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjI0NzI6IFJCUkFDS0VUICovCisgICAgCSAgICAgICAgbVJCUkFDS0VUKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAzMTE6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjI0ODE6IExCUkFDS0VUX0VYQ0VQVAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MjQ4MTogTEJSQUNLRVRfRVhDRVBUICovCisgICAgCSAgICAgICAgbUxCUkFDS0VUX0VYQ0VQVChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMzEyOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToyNDk3OiBMUEFSRU5fSU5WT0tFCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToyNDk3OiBMUEFSRU5fSU5WT0tFICovCisgICAgCSAgICAgICAgbUxQQVJFTl9JTlZPS0UoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDMxMzoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MjUxMTogTENVUkxZX0lOVk9LRQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MjUxMTogTENVUkxZX0lOVk9LRSAqLworICAgIAkgICAgICAgIG1MQ1VSTFlfSU5WT0tFKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAzMTQ6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjI1MjU6IFBFUkNFTlRfTFBBUkVOX0lOVk9LRQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MjUyNTogUEVSQ0VOVF9MUEFSRU5fSU5WT0tFICovCisgICAgCSAgICAgICAgbVBFUkNFTlRfTFBBUkVOX0lOVk9LRShjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMzE1OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToyNTQ3OiBQRVJDRU5UX0xQQVJFTgorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MjU0NzogUEVSQ0VOVF9MUEFSRU4gKi8KKyAgICAJICAgICAgICBtUEVSQ0VOVF9MUEFSRU4oY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDMxNjoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MjU2MjogUlBBUkVOX1BFUkNFTlQKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjI1NjI6IFJQQVJFTl9QRVJDRU5UICovCisgICAgCSAgICAgICAgbVJQQVJFTl9QRVJDRU5UKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAzMTc6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjI1Nzc6IFNUQVRFTUVOVF9QUk9NUFQKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjI1Nzc6IFNUQVRFTUVOVF9QUk9NUFQgKi8KKyAgICAJICAgICAgICBtU1RBVEVNRU5UX1BST01QVChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMzE4OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToyNTk0OiBET0xMQVJfTENVUkxZCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToyNTk0OiBET0xMQVJfTENVUkxZICovCisgICAgCSAgICAgICAgbURPTExBUl9MQ1VSTFkoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDMxOToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MjYwODogUkNVUkxZX0RPTExBUgorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MjYwODogUkNVUkxZX0RPTExBUiAqLworICAgIAkgICAgICAgIG1SQ1VSTFlfRE9MTEFSKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAzMjA6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjI2MjI6IFBFUkNFTlRfTENVUkxZCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToyNjIyOiBQRVJDRU5UX0xDVVJMWSAqLworICAgIAkgICAgICAgIG1QRVJDRU5UX0xDVVJMWShjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMzIxOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToyNjM3OiBSQ1VSTFlfUEVSQ0VOVAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MjYzNzogUkNVUkxZX1BFUkNFTlQgKi8KKyAgICAJICAgICAgICBtUkNVUkxZX1BFUkNFTlQoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDMyMjoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MjY1MjogTEJSQUNLRVRfQkFSCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToyNjUyOiBMQlJBQ0tFVF9CQVIgKi8KKyAgICAJICAgICAgICBtTEJSQUNLRVRfQkFSKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAzMjM6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjI2NjU6IEJBUl9SQlJBQ0tFVAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MjY2NTogQkFSX1JCUkFDS0VUICovCisgICAgCSAgICAgICAgbUJBUl9SQlJBQ0tFVChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMzI0OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToyNjc4OiBMQlJBQ0tFVF9MQ1VSTFkKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjI2Nzg6IExCUkFDS0VUX0xDVVJMWSAqLworICAgIAkgICAgICAgIG1MQlJBQ0tFVF9MQ1VSTFkoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDMyNToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MjY5NDogUkNVUkxZX1JCUkFDS0VUCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToyNjk0OiBSQ1VSTFlfUkJSQUNLRVQgKi8KKyAgICAJICAgICAgICBtUkNVUkxZX1JCUkFDS0VUKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAzMjY6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjI3MTA6IENPTE9OCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToyNzEwOiBDT0xPTiAqLworICAgIAkgICAgICAgIG1DT0xPTihjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMzI3OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToyNzE2OiBDT01NQQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MjcxNjogQ09NTUEgKi8KKyAgICAJICAgICAgICBtQ09NTUEoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDMyODoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MjcyMjogUVVFU1RJT04KKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjI3MjI6IFFVRVNUSU9OICovCisgICAgCSAgICAgICAgbVFVRVNUSU9OKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAzMjk6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjI3MzE6IFNFTUkKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjI3MzE6IFNFTUkgKi8KKyAgICAJICAgICAgICBtU0VNSShjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMzMwOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToyNzM2OiBESUVTRQorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MjczNjogRElFU0UgKi8KKyAgICAJICAgICAgICBtRElFU0UoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDMzMToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6Mjc0MjogRE9MTEFSCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToyNzQyOiBET0xMQVIgKi8KKyAgICAJICAgICAgICBtRE9MTEFSKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAzMzI6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjI3NDk6IERPVAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6Mjc0OTogRE9UICovCisgICAgCSAgICAgICAgbURPVChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMzMzOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToyNzUzOiBET1RET1QKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjI3NTM6IERPVERPVCAqLworICAgIAkgICAgICAgIG1ET1RET1QoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDMzNDoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6Mjc2MDogQ09MT054MgorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6Mjc2MDogQ09MT054MiAqLworICAgIAkgICAgICAgIG1DT0xPTngyKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAzMzU6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjI3Njg6IExBTkQKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjI3Njg6IExBTkQgKi8KKyAgICAJICAgICAgICBtTEFORChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMzM2OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToyNzczOiBMQU5EX1RIRU4KKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjI3NzM6IExBTkRfVEhFTiAqLworICAgIAkgICAgICAgIG1MQU5EX1RIRU4oY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDMzNzoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6Mjc4MzogTEFORF9BU1NJR04KKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjI3ODM6IExBTkRfQVNTSUdOICovCisgICAgCSAgICAgICAgbUxBTkRfQVNTSUdOKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAzMzg6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjI3OTU6IExBTkRfQVNTSUdOX0FGVEVSCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToyNzk1OiBMQU5EX0FTU0lHTl9BRlRFUiAqLworICAgIAkgICAgICAgIG1MQU5EX0FTU0lHTl9BRlRFUihjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMzM5OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToyODEzOiBMTk9UCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToyODEzOiBMTk9UICovCisgICAgCSAgICAgICAgbUxOT1QoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDM0MDoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MjgxODogTE9SCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToyODE4OiBMT1IgKi8KKyAgICAJICAgICAgICBtTE9SKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAzNDE6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjI4MjI6IExPUl9FTFNFCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToyODIyOiBMT1JfRUxTRSAqLworICAgIAkgICAgICAgIG1MT1JfRUxTRShjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMzQyOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToyODMxOiBMT1JfQVNTSUdOCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToyODMxOiBMT1JfQVNTSUdOICovCisgICAgCSAgICAgICAgbUxPUl9BU1NJR04oY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDM0MzoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6Mjg0MjogTE9SX0FTU0lHTl9BRlRFUgorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6Mjg0MjogTE9SX0FTU0lHTl9BRlRFUiAqLworICAgIAkgICAgICAgIG1MT1JfQVNTSUdOX0FGVEVSKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAzNDQ6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjI4NTk6IExYT1IKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjI4NTk6IExYT1IgKi8KKyAgICAJICAgICAgICBtTFhPUihjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMzQ1OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToyODY0OiBFUVVBTAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6Mjg2NDogRVFVQUwgKi8KKyAgICAJICAgICAgICBtRVFVQUwoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDM0NjoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6Mjg3MDogTkVRVUFMCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToyODcwOiBORVFVQUwgKi8KKyAgICAJICAgICAgICBtTkVRVUFMKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAzNDc6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjI4Nzc6IFNFUVVBTAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6Mjg3NzogU0VRVUFMICovCisgICAgCSAgICAgICAgbVNFUVVBTChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMzQ4OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToyODg0OiBOU0VRVUFMCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToyODg0OiBOU0VRVUFMICovCisgICAgCSAgICAgICAgbU5TRVFVQUwoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDM0OToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6Mjg5MjogTFRFCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToyODkyOiBMVEUgKi8KKyAgICAJICAgICAgICBtTFRFKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAzNTA6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjI4OTY6IExUXworICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6Mjg5NjogTFRfICovCisgICAgCSAgICAgICAgbUxUXyhjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMzUxOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToyOTAwOiBHVEUKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjI5MDA6IEdURSAqLworICAgIAkgICAgICAgIG1HVEUoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDM1MjoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MjkwNDogR1QKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjI5MDQ6IEdUICovCisgICAgCSAgICAgICAgbUdUKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAzNTM6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjI5MDc6IFBMVVMKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjI5MDc6IFBMVVMgKi8KKyAgICAJICAgICAgICBtUExVUyhjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMzU0OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToyOTEyOiBQTFVTX0FTU0lHTgorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MjkxMjogUExVU19BU1NJR04gKi8KKyAgICAJICAgICAgICBtUExVU19BU1NJR04oY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDM1NToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MjkyNDogUExVU19BU1NJR05fQUZURVIKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjI5MjQ6IFBMVVNfQVNTSUdOX0FGVEVSICovCisgICAgCSAgICAgICAgbVBMVVNfQVNTSUdOX0FGVEVSKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAzNTY6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjI5NDI6IElOQ1IKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjI5NDI6IElOQ1IgKi8KKyAgICAJICAgICAgICBtSU5DUihjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMzU3OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToyOTQ3OiBNSU5VUworICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6Mjk0NzogTUlOVVMgKi8KKyAgICAJICAgICAgICBtTUlOVVMoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDM1ODoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6Mjk1MzogTUlOVVNfQVNTSUdOCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToyOTUzOiBNSU5VU19BU1NJR04gKi8KKyAgICAJICAgICAgICBtTUlOVVNfQVNTSUdOKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAzNTk6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjI5NjY6IE1JTlVTX0FTU0lHTl9BRlRFUgorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6Mjk2NjogTUlOVVNfQVNTSUdOX0FGVEVSICovCisgICAgCSAgICAgICAgbU1JTlVTX0FTU0lHTl9BRlRFUihjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMzYwOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MToyOTg1OiBERUNSCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToyOTg1OiBERUNSICovCisgICAgCSAgICAgICAgbURFQ1IoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDM2MToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6Mjk5MDogU1RBUgorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6Mjk5MDogU1RBUiAqLworICAgIAkgICAgICAgIG1TVEFSKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAzNjI6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjI5OTU6IFNUQVJfQVNTSUdOCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMToyOTk1OiBTVEFSX0FTU0lHTiAqLworICAgIAkgICAgICAgIG1TVEFSX0FTU0lHTihjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMzYzOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTozMDA3OiBTVEFSX0FTU0lHTl9BRlRFUgorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MzAwNzogU1RBUl9BU1NJR05fQUZURVIgKi8KKyAgICAJICAgICAgICBtU1RBUl9BU1NJR05fQUZURVIoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDM2NDoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MzAyNTogRElWCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTozMDI1OiBESVYgKi8KKyAgICAJICAgICAgICBtRElWKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAzNjU6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjMwMjk6IERJVl9BU1NJR04KKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjMwMjk6IERJVl9BU1NJR04gKi8KKyAgICAJICAgICAgICBtRElWX0FTU0lHTihjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMzY2OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTozMDQwOiBESVZfQVNTSUdOX0FGVEVSCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTozMDQwOiBESVZfQVNTSUdOX0FGVEVSICovCisgICAgCSAgICAgICAgbURJVl9BU1NJR05fQUZURVIoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDM2NzoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MzA1NzogTU9ECisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTozMDU3OiBNT0QgKi8KKyAgICAJICAgICAgICBtTU9EKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAzNjg6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjMwNjE6IE1PRF9BU1NJR04KKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjMwNjE6IE1PRF9BU1NJR04gKi8KKyAgICAJICAgICAgICBtTU9EX0FTU0lHTihjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMzY5OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTozMDcyOiBNT0RfQVNTSUdOX0FGVEVSCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTozMDcyOiBNT0RfQVNTSUdOX0FGVEVSICovCisgICAgCSAgICAgICAgbU1PRF9BU1NJR05fQUZURVIoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDM3MDoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MzA4OTogUlNISUZUCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTozMDg5OiBSU0hJRlQgKi8KKyAgICAJICAgICAgICBtUlNISUZUKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAzNzE6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjMwOTY6IFJTSElGVF9BU1NJR04KKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjMwOTY6IFJTSElGVF9BU1NJR04gKi8KKyAgICAJICAgICAgICBtUlNISUZUX0FTU0lHTihjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMzcyOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTozMTEwOiBSU0hJRlRfQVNTSUdOX0FGVEVSCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTozMTEwOiBSU0hJRlRfQVNTSUdOX0FGVEVSICovCisgICAgCSAgICAgICAgbVJTSElGVF9BU1NJR05fQUZURVIoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDM3MzoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MzEzMDogTFNISUZUCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTozMTMwOiBMU0hJRlQgKi8KKyAgICAJICAgICAgICBtTFNISUZUKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAzNzQ6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjMxMzc6IExTSElGVF9BU1NJR04KKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjMxMzc6IExTSElGVF9BU1NJR04gKi8KKyAgICAJICAgICAgICBtTFNISUZUX0FTU0lHTihjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMzc1OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTozMTUxOiBMU0hJRlRfQVNTSUdOX0FGVEVSCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTozMTUxOiBMU0hJRlRfQVNTSUdOX0FGVEVSICovCisgICAgCSAgICAgICAgbUxTSElGVF9BU1NJR05fQUZURVIoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDM3NjoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MzE3MTogQkFORAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MzE3MTogQkFORCAqLworICAgIAkgICAgICAgIG1CQU5EKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAzNzc6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjMxNzY6IEJBTkRfQVNTSUdOCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTozMTc2OiBCQU5EX0FTU0lHTiAqLworICAgIAkgICAgICAgIG1CQU5EX0FTU0lHTihjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMzc4OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTozMTg4OiBCQU5EX0FTU0lHTl9BRlRFUgorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MzE4ODogQkFORF9BU1NJR05fQUZURVIgKi8KKyAgICAJICAgICAgICBtQkFORF9BU1NJR05fQUZURVIoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDM3OToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MzIwNjogQk5PVAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MzIwNjogQk5PVCAqLworICAgIAkgICAgICAgIG1CTk9UKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAzODA6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjMyMTE6IEJPUgorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MzIxMTogQk9SICovCisgICAgCSAgICAgICAgbUJPUihjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMzgxOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTozMjE1OiBCT1JfQVNTSUdOCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTozMjE1OiBCT1JfQVNTSUdOICovCisgICAgCSAgICAgICAgbUJPUl9BU1NJR04oY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDM4MjoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MzIyNjogQk9SX0FTU0lHTl9BRlRFUgorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MzIyNjogQk9SX0FTU0lHTl9BRlRFUiAqLworICAgIAkgICAgICAgIG1CT1JfQVNTSUdOX0FGVEVSKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAzODM6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjMyNDM6IEJYT1IKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjMyNDM6IEJYT1IgKi8KKyAgICAJICAgICAgICBtQlhPUihjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMzg0OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTozMjQ4OiBCWE9SX0FTU0lHTgorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MzI0ODogQlhPUl9BU1NJR04gKi8KKyAgICAJICAgICAgICBtQlhPUl9BU1NJR04oY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDM4NToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MzI2MDogQlhPUl9BU1NJR05fQUZURVIKKyAgICAJICAgIHsKKyAgICAJICAgICAgICAvKiAxOjMyNjA6IEJYT1JfQVNTSUdOX0FGVEVSICovCisgICAgCSAgICAgICAgbUJYT1JfQVNTSUdOX0FGVEVSKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAzODY6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjMyNzg6IElECisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTozMjc4OiBJRCAqLworICAgIAkgICAgICAgIG1JRChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMzg3OgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTozMjgxOiBBVF9JRAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MzI4MTogQVRfSUQgKi8KKyAgICAJICAgICAgICBtQVRfSUQoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDM4ODoKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MzI4NzogU3RyaW5nTGl0ZXJhbAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MzI4NzogU3RyaW5nTGl0ZXJhbCAqLworICAgIAkgICAgICAgIG1TdHJpbmdMaXRlcmFsKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAzODk6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjMzMDE6IENoYXJMaXRlcmFsCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTozMzAxOiBDaGFyTGl0ZXJhbCAqLworICAgIAkgICAgICAgIG1DaGFyTGl0ZXJhbChjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisgICAgCWNhc2UgMzkwOgorICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTozMzEzOiBOdW1iZXJMaXRlcmFsCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTozMzEzOiBOdW1iZXJMaXRlcmFsICovCisgICAgCSAgICAgICAgbU51bWJlckxpdGVyYWwoY3R4ICk7CisgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZVRva2Vuc0V4OworICAgIAkgICAgICAgIH0KKyAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgIAkgICAgICAgIH0KKworCisKKyAgICAJICAgIH0KKyAgICAJICAgIGJyZWFrOworICAgIAljYXNlIDM5MToKKyAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE6MzMyNzogQ09NTUVOVAorICAgIAkgICAgeworICAgIAkgICAgICAgIC8qIDE6MzMyNzogQ09NTUVOVCAqLworICAgIAkgICAgICAgIG1DT01NRU5UKGN0eCApOworICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgCSAgICAgICAgeworICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVUb2tlbnNFeDsKKyAgICAJICAgICAgICB9CisgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAJICAgICAgICB9CisKKworCisgICAgCSAgICB9CisgICAgCSAgICBicmVhazsKKyAgICAJY2FzZSAzOTI6CisgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOjMzMzU6IFdTCisgICAgCSAgICB7CisgICAgCSAgICAgICAgLyogMTozMzM1OiBXUyAqLworICAgIAkgICAgICAgIG1XUyhjdHggKTsKKyAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgIAkgICAgICAgIHsKKyAgICAJICAgICAgICAgICAgZ290byBydWxlVG9rZW5zRXg7CisgICAgCSAgICAgICAgfQorICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAJICAgICAgICB7CisgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgCSAgICAgICAgfQorCisKKworICAgIAkgICAgfQorICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgfQorICAgIH0KKworCisgICAgZ290byBydWxlVG9rZW5zRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVUb2tlbnNFeDogOworfQorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDFfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkMV9mbWxfZnJhZ21lbnQocGZtbExleGVyIGN0eCApCit7CisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Njc5NTo0OiAoIEludGVnZXJMaXRlcmFsIERPVERPVCApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Njc5NTo2OiBJbnRlZ2VyTGl0ZXJhbCBET1RET1QKKyAgICB7CisgICAgICAgIC8qIDY3OTU6NjogSW50ZWdlckxpdGVyYWwgRE9URE9UICovCisgICAgICAgIG1JbnRlZ2VyTGl0ZXJhbChjdHggKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDFfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworCisgICAgICAgIC8qIDY3OTU6NjogSW50ZWdlckxpdGVyYWwgRE9URE9UICovCisgICAgICAgIG1ET1RET1QoY3R4ICk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQxX2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQxX2ZtbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCitydWxlc3lucHJlZDFfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkMV9mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQyX2ZtbAorc3RhdGljIHZvaWQgc3lucHJlZDJfZm1sX2ZyYWdtZW50KHBmbWxMZXhlciBjdHggKQoreworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3OTc6NDogKCBGbG9hdExpdGVyYWwgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3OTc6NjogRmxvYXRMaXRlcmFsCisgICAgeworICAgICAgICAvKiA2Nzk3OjY6IEZsb2F0TGl0ZXJhbCAqLworICAgICAgICBtRmxvYXRMaXRlcmFsKGN0eCApOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkMl9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisKKyAgICB9CisKKy8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKy8vCitnb3RvIHJ1bGVzeW5wcmVkMl9mbWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworcnVsZXN5bnByZWQyX2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDJfZm1sCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExleGVyIG1hdGNoaW5nIHJ1bGVzIGVuZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMZXhlciBzeW50YWN0aWMgcHJlZGljYXRlcworICovCitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDFfZm1sKHBmbWxMZXhlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDFfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQyX2ZtbChwZm1sTGV4ZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQyX2ZtbF9mcmFnbWVudChjdHgpOwkgICAgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgIHN1Y2Nlc3MJPSAhKEZBSUxFREZMQUcpOworICAgIFJFV0lORChzdGFydCk7CisgICAgQkFDS1RSQUNLSU5HLS07CisgICAgRkFJTEVERkxBRwk9IEFOVExSM19GQUxTRTsKKyAgICByZXR1cm4gc3VjY2VzczsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGV4ZXIgc3ludGFjdGljIHByZWRpY2F0ZXMgZW5kLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKy8qIEVuZCBvZiBMZXhlciBjb2RlCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKworLyogRW5kIG9mIGNvZGUKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWxMZXhlci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbExleGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E5OWRkOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWxMZXhlci5oCkBAIC0wLDAgKzEsMzA5MSBAQAorLyoqIFxmaWxlCisgKiAgVGhpcyBDIGhlYWRlciBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgJEFOVExSIHZlcnNpb24gMy40CisgKgorICogICAgIC0gIEZyb20gdGhlIGdyYW1tYXIgc291cmNlIGZpbGUgOiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZworICogICAgIC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT24gOiAyMDE3LTA1LTMwIDA5OjIxOjUzCisgKiAgICAgLSAgICAgICAgICAgICAgICAgZm9yIHRoZSBsZXhlciA6IGZtbExleGVyTGV4ZXIKKyAqCisgKiBFZGl0aW5nIGl0LCBhdCBsZWFzdCBtYW51YWxseSwgaXMgbm90IHdpc2UuCisgKgorICogQyBsYW5ndWFnZSBnZW5lcmF0b3IgYW5kIHJ1bnRpbWUgYnkgSmltIElkbGUsIGppbWl8aGVyZWlzYW5hdHxpZGxlfGRvdGdvZXNoZXJlfHdzLgorICoKKyAqCisgKiBUaGUgbGV4ZXIgCitmbWxMZXhlcgorCitoYXMgdGhlIGNhbGxhYmxlIGZ1bmN0aW9ucyAocnVsZXMpIHNob3duIGJlbG93LAorICogd2hpY2ggd2lsbCBpbnZva2UgdGhlIGNvZGUgZm9yIHRoZSBhc3NvY2lhdGVkIHJ1bGUgaW4gdGhlIHNvdXJjZSBncmFtbWFyCisgKiBhc3N1bWluZyB0aGF0IHRoZSBpbnB1dCBzdHJlYW0gaXMgcG9pbnRpbmcgdG8gYSB0b2tlbi90ZXh0IHN0cmVhbSB0aGF0IGNvdWxkIGJlZ2luCisgKiB0aGlzIHJ1bGUuCisgKgorICogRm9yIGluc3RhbmNlIGlmIHlvdSBjYWxsIHRoZSBmaXJzdCAodG9wbW9zdCkgcnVsZSBpbiBhIHBhcnNlciBncmFtbWFyLCB5b3Ugd2lsbAorICogZ2V0IHRoZSByZXN1bHRzIG9mIGEgZnVsbCBwYXJzZSwgYnV0IGNhbGxpbmcgYSBydWxlIGhhbGYgd2F5IHRocm91Z2ggdGhlIGdyYW1tYXIgd2lsbAorICogYWxsb3cgeW91IHRvIHBhc3MgcGFydCBvZiBhIGZ1bGwgdG9rZW4gc3RyZWFtIHRvIHRoZSBwYXJzZXIsIHN1Y2ggYXMgZm9yIHN5bnRheCBjaGVja2luZworICogaW4gZWRpdG9ycyBhbmQgc28gb24uCisgKgorICogVGhlIHBhcnNlciBlbnRyeSBwb2ludHMgYXJlIGNhbGxlZCBpbmRpcmVjdGx5IChieSBmdW5jdGlvbiBwb2ludGVyIHRvIGZ1bmN0aW9uKSB2aWEKKyAqIGEgcGFyc2VyIGNvbnRleHQgdHlwZWRlZiBwZm1sTGV4ZXIsIHdoaWNoIGlzIHJldHVybmVkIGZyb20gYSBjYWxsIHRvIGZtbExleGVyTmV3KCkuCisgKgorICogQXMgdGhpcyBpcyBhIGdlbmVyYXRlZCBsZXhlciwgaXQgaXMgdW5saWtlbHkgeW91IHdpbGwgY2FsbCBpdCAnbWFudWFsbHknLiBIb3dldmVyCisgKiB0aGUgbWV0aG9kcyBhcmUgcHJvdmlkZWQgYW55d2F5LgorICoKKyAqIFRoZSBtZXRob2RzIGluIHBmbWxMZXhlciBhcmUgIGFzIGZvbGxvd3M6CisgKgorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xNDQocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xNDUocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xNDYocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xNDcocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xNDgocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xNDkocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xNTAocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xNTEocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xNTIocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xNTMocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xNTQocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xNTUocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xNTYocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xNTcocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xNTgocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xNTkocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xNjAocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xNjEocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xNjIocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xNjMocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xNjQocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xNjUocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xNjYocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xNjcocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xNjgocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xNjkocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xNzAocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xNzEocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xNzIocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xNzMocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xNzQocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xNzUocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xNzYocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xNzcocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xNzgocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xNzkocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xODAocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xODEocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xODIocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xODMocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xODQocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xODUocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xODYocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xODcocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xODgocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xODkocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xOTAocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xOTEocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xOTIocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xOTMocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xOTQocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xOTUocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xOTYocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xOTcocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xOTgocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18xOTkocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMDAocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMDEocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMDIocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMDMocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMDQocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMDUocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMDYocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMDcocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMDgocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMDkocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMTAocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMTEocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMTIocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMTMocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMTQocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMTUocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMTYocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMTcocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMTgocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMTkocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMjAocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMjEocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMjIocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMjMocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMjQocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMjUocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMjYocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMjcocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMjgocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMjkocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMzAocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMzEocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMzIocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMzMocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMzQocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMzUocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMzYocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMzcocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMzgocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yMzkocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNDAocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNDEocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNDIocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNDMocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNDQocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNDUocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNDYocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNDcocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNDgocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNDkocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNTAocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNTEocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNTIocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNTMocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNTQocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNTUocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNTYocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNTcocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNTgocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNTkocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNjAocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNjEocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNjIocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNjMocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNjQocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNjUocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNjYocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNjcocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNjgocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNjkocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNzAocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNzEocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNzIocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNzMocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNzQocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNzUocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNzYocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNzcocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNzgocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yNzkocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yODAocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yODEocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yODIocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yODMocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yODQocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yODUocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yODYocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yODcocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yODgocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yODkocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yOTAocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yOTEocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yOTIocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yOTMocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yOTQocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yOTUocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yOTYocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yOTcocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yOTgocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18yOTkocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMDAocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMDEocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMDIocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMDMocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMDQocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMDUocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMDYocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMDcocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMDgocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMDkocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMTAocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMTEocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMTIocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMTMocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMTQocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMTUocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMTYocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMTcocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMTgocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMTkocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMjAocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMjEocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMjIocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMjMocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMjQocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMjUocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMjYocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMjcocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMjgocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMjkocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMzAocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMzEocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMzIocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMzMocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMzQocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMzUocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMzYocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMzcocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMzgocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zMzkocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNDAocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNDEocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNDIocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNDMocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNDQocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNDUocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNDYocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNDcocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNDgocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNDkocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNTAocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNTEocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNTIocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNTMocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNTQocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNTUocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNTYocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNTcocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNTgocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNTkocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNjAocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNjEocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNjIocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNjMocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNjQocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNjUocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNjYocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNjcocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNjgocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNjkocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNzAocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNzEocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNzIocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNzMocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNzQocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNzUocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNzYocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNzcocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNzgocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zNzkocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zODAocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zODEocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zODIocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zODMocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zODQocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zODUocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zODYocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zODcocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zODgocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zODkocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zOTAocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zOTEocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zOTIocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zOTMocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zOTQocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zOTUocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zOTYocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zOTcocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zOTgocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX18zOTkocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX180MDAocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX180MDEocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX180MDIocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX180MDMocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX180MDQocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX180MDUocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX180MDYocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX180MDcocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX180MDgocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX180MDkocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX180MTAocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX180MTEocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX180MTIocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX180MTMocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX180MTQocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX180MTUocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX180MTYocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5UX180MTcocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5PUF9BVE9NSUNfU0VRVUVOQ0UocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5PUF9TRVFVRU5DRShwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPk9QX1NFUVVFTkNFX1NJREUocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5PUF9TRVFVRU5DRV9XRUFLKHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+T1BfU0NIRURVTEVfR1QocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5PUF9TQ0hFRFVMRV9MVChwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPk9QX1NDSEVEVUxFX1hPUihwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPk9QX1NDSEVEVUxFX0FORF9USEVOKHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+T1BfU0NIRURVTEVfT1JfRUxTRShwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPk9QX05PTl9ERVRFUk1JTklTTShwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPk9QX0NPTkNVUlJFTkNZX0FTWU5DKHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+T1BfQ09OQ1VSUkVOQ1lfQU5EKHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+T1BfQ09OQ1VSUkVOQ1lfT1IocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5PUF9DT05DVVJSRU5DWV9JTlRFUkxFQVZJTkcocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5PUF9DT05DVVJSRU5DWV9QQVJBTExFTChwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPk9QX0ZPUksocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5PUF9KT0lOKHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+T1BfQ09OQ1VSUkVOQ1lfUkRWX0FTWU5DKHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+T1BfQ09OQ1VSUkVOQ1lfUkRWX0FORChwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPk9QX0NPTkNVUlJFTkNZX1JEVl9PUihwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPk9QX0NPTkNVUlJFTkNZX1JEVl9JTlRFUkxFQVZJTkcocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5PUF9DT05DVVJSRU5DWV9SRFZfUEFSQUxMRUwocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5BU1NJR04ocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5BU1NJR05fQUZURVIocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5BU1NJR05fUkVGKHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+QVNTSUdOX01BQ1JPKHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+T1BfUFVTSChwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPk9QX0FTU0lHTl9UT1AocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5PUF9UT1AocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5PUF9QT1AocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5MUEFSRU4ocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5SUEFSRU4ocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5MQ1VSTFkocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5SQ1VSTFkocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5MQlJBQ0tFVChwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPlJCUkFDS0VUKHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+TEJSQUNLRVRfRVhDRVBUKHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+TFBBUkVOX0lOVk9LRShwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPkxDVVJMWV9JTlZPS0UocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5QRVJDRU5UX0xQQVJFTl9JTlZPS0UocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5QRVJDRU5UX0xQQVJFTihwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPlJQQVJFTl9QRVJDRU5UKHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+U1RBVEVNRU5UX1BST01QVChwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPkRPTExBUl9MQ1VSTFkocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5SQ1VSTFlfRE9MTEFSKHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+UEVSQ0VOVF9MQ1VSTFkocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5SQ1VSTFlfUEVSQ0VOVChwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPkxCUkFDS0VUX0JBUihwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPkJBUl9SQlJBQ0tFVChwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPkxCUkFDS0VUX0xDVVJMWShwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPlJDVVJMWV9SQlJBQ0tFVChwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPkNPTE9OKHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+Q09NTUEocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5RVUVTVElPTihwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPlNFTUkocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5ESUVTRShwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPkRPTExBUihwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPkRPVChwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPkRPVERPVChwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPkNPTE9OeDIocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5MQU5EKHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+TEFORF9USEVOKHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+TEFORF9BU1NJR04ocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5MQU5EX0FTU0lHTl9BRlRFUihwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPkxOT1QocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5MT1IocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5MT1JfRUxTRShwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPkxPUl9BU1NJR04ocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5MT1JfQVNTSUdOX0FGVEVSKHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+TFhPUihwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPkVRVUFMKHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+TkVRVUFMKHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+U0VRVUFMKHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+TlNFUVVBTChwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPkxURShwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPkxUXyhwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPkdURShwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPkdUKHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+UExVUyhwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPlBMVVNfQVNTSUdOKHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+UExVU19BU1NJR05fQUZURVIocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5JTkNSKHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+TUlOVVMocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5NSU5VU19BU1NJR04ocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5NSU5VU19BU1NJR05fQUZURVIocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5ERUNSKHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+U1RBUihwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPlNUQVJfQVNTSUdOKHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+U1RBUl9BU1NJR05fQUZURVIocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5ESVYocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5ESVZfQVNTSUdOKHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+RElWX0FTU0lHTl9BRlRFUihwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPk1PRChwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPk1PRF9BU1NJR04ocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5NT0RfQVNTSUdOX0FGVEVSKHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+UlNISUZUKHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+UlNISUZUX0FTU0lHTihwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPlJTSElGVF9BU1NJR05fQUZURVIocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5MU0hJRlQocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5MU0hJRlRfQVNTSUdOKHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+TFNISUZUX0FTU0lHTl9BRlRFUihwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPkJBTkQocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5CQU5EX0FTU0lHTihwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPkJBTkRfQVNTSUdOX0FGVEVSKHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+Qk5PVChwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPkJPUihwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPkJPUl9BU1NJR04ocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5CT1JfQVNTSUdOX0FGVEVSKHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+QlhPUihwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPkJYT1JfQVNTSUdOKHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+QlhPUl9BU1NJR05fQUZURVIocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5JRChwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPkFUX0lEKHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+U3RyaW5nTGl0ZXJhbChwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPkNoYXJMaXRlcmFsKHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+TnVtYmVyTGl0ZXJhbChwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPkZsb2F0TGl0ZXJhbChwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPlJhdGlvbmFsTGl0ZXJhbChwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPkludGVnZXJMaXRlcmFsKHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+RmxvYXRUeXBlU3VmZml4KHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+SW1hZ2luYXJ5U3VmZml4KHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+SW50U3VmZml4KHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+SW50ZWdlcihwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPkRlY2ltYWwocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5CaW5hcnkocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5PY3RhbChwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPkhleGFkZWNpbWFsKHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+RGVjaW1hbERpZ2l0KHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+T2N0YWxEaWdpdChwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPkhleERpZ2l0KHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+RGVjaW1hbEV4cG9uZW50KHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+RGVjaW1hbERpZ2l0cyhwZm1sTGV4ZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sTGV4ZXItPkZsb2F0KHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+RVhQT05FTlQocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5IRVhfRElHSVQocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5FU0NfU0VRKHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+T0NUQUxfRVNDKHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+VU5JQ09ERV9FU0MocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5DT01NRU5UKHBmbWxMZXhlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxMZXhlci0+V1MocGZtbExleGVyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbExleGVyLT5Ub2tlbnMocGZtbExleGVyKQorICogCisgKiAKKyAqCisgKiBUaGUgcmV0dXJuIHR5cGUgZm9yIGFueSBwYXJ0aWN1bGFyIHJ1bGUgaXMgb2YgY291cnNlIGRldGVybWluZWQgYnkgdGhlIHNvdXJjZQorICogZ3JhbW1hciBmaWxlLgorICovCisvLyBbVGhlICJCU0QgbGljZW5zZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBKaW0gSWRsZSwgVGVtcG9yYWwgV2F2ZSBMTEMKKy8vIGh0dHA6Ly93d3cudGVtcG9yYWwtd2F2ZS5jb20KKy8vIGh0dHA6Ly93d3cubGlua2VkaW4uY29tL2luL2ppbWlkbGUKKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYJX2ZtbExleGVyX0gKKyNkZWZpbmUgX2ZtbExleGVyX0gKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTdGFuZGFyZCBhbnRscjMgQyBydW50aW1lIGRlZmluaXRpb25zCisgKi8KKyNpbmNsdWRlICAgIDxhbnRscjMuaD4KKworLyogRW5kIG9mIHN0YW5kYXJkIGFudGxyIDMgcnVudGltZSBkZWZpbml0aW9ucworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vIEZvcndhcmQgZGVjbGFyZSB0aGUgY29udGV4dCB0eXBlZGVmIHNvIHRoYXQgd2UgY2FuIHVzZSBpdCBiZWZvcmUgaXQgaXMKKy8vIHByb3Blcmx5IGRlZmluZWQuIERlbGVnYXRvcnMgYW5kIGRlbGVnYXRlcyAoZnJvbSBpbXBvcnQgc3RhdGVtZW50cykgYXJlCisvLyBpbnRlcmRlcGVuZGVudCBhbmQgdGhlaXIgY29udGV4dCBzdHJ1Y3R1cmVzIGNvbnRhaW4gcG9pbnRlcnMgdG8gZWFjaCBvdGhlcgorLy8gQyBvbmx5IGFsbG93cyBzdWNoIHRoaW5ncyB0byBiZSBkZWNsYXJlZCBpZiB5b3UgcHJlLWRlY2xhcmUgdGhlIHR5cGVkZWYuCisvLwordHlwZWRlZiBzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCBmbWxMZXhlciwgKiBwZm1sTGV4ZXI7CisKKworCisKKworCisjaWZkZWYJQU5UTFIzX1dJTkRPV1MKKy8vIERpc2FibGU6IFVucmVmZXJlbmNlZCBwYXJhbWV0ZXIsCQkJCQkJCS0gUnVsZXMgd2l0aCBwYXJhbWV0ZXJzIHRoYXQgYXJlIG5vdCB1c2VkCisvLyAgICAgICAgICBjb25zdGFudCBjb25kaXRpb25hbCwJCQkJCQkJLSBBTlRMUiByZWFsaXplcyB0aGF0IGEgcHJlZGljdGlvbiBpcyBhbHdheXMgdHJ1ZSAoc3lucHJlZCB1c3VhbGx5KQorLy8gICAgICAgICAgaW5pdGlhbGl6ZWQgYnV0IHVudXNlZCB2YXJpYWJsZQkJCQkJLSB0cmVlIHJld3JpdGUgdmFyaWFibGVzIGRlY2xhcmVkIGJ1dCBub3QgbmVlZGVkCisvLyAgICAgICAgICBVbnJlZmVyZW5jZWQgbG9jYWwgdmFyaWFibGUJCQkJCQktIGxleGVyIHJ1bGUgZGVjbGFyZXMgYnV0IGRvZXMgbm90IGFsd2F5cyB1c2UgX3R5cGUKKy8vICAgICAgICAgIHBvdGVudGlhbGx5IHVuaXRpYWxpemVkIHZhcmlhYmxlIHVzZWQJCQktIHJldHZhbCBhbHdheXMgcmV0dXJuZWQgZnJvbSBhIHJ1bGUKKy8vCQkJdW5yZWZlcmVuY2VkIGxvY2FsIGZ1bmN0aW9uIGhhcyBiZWVuIHJlbW92ZWQJLSBzdXN1YWxseSBnZXRUb2tlbk5hbWVzIG9yIGZyZWVTY29wZSwgdGhleSBjYW4gZ28gd2l0aG91dCB3YXJuaWducworLy8KKy8vIFRoZXNlIGFyZSBvbmx5IHJlYWxseSBkaXNwbGF5ZWQgYXQgd2FybmluZyBsZXZlbCAvVzQgYnV0IHRoYXQgaXMgdGhlIGNvZGUgaWRlYWwgSSBhbSBhaW1pbmcgYXQKKy8vIGFuZCB0aGUgY29kZWdlbiBtdXN0IGdlbmVyYXRlIHNvbWUgb2YgdGhlc2Ugd2FybmluZ3MgYnkgbmVjZXNzaXR5LCBhcGFydCBmcm9tIDQxMDAsIHdoaWNoIGlzCisvLyB1c3VhbGx5IGdlbmVyYXRlZCB3aGVuIGEgcGFyc2VyIHJ1bGUgaXMgZ2l2ZW4gYSBwYXJhbWV0ZXIgdGhhdCBpdCBkb2VzIG5vdCB1c2UuIE1vc3RseSB0aG91Z2gKKy8vIHRoaXMgaXMgYSBtYXR0ZXIgb2Ygb3J0aG9nb25hbGl0eSBoZW5jZSBJIGRpc2FibGUgdGhhdCBvbmUuCisvLworI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDEwMCApCisjcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0MTAxICkKKyNwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQxMjcgKQorI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDE4OSApCisjcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0NTA1ICkKKyNwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQ3MDEgKQorI2VuZGlmCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PQorICogQkFDS1RSQUNLSU5HIElTIEVOQUJMRUQKKyAqID09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKworLyoqIENvbnRleHQgdHJhY2tpbmcgc3RydWN0dXJlIGZvciAKK2ZtbExleGVyCisKKyAqLworc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QKK3sKKyAgICAvKiogQnVpbHQgaW4gQU5UTFIzIGNvbnRleHQgdHJhY2tlciBjb250YWlucyBhbGwgdGhlIGdlbmVyaWMgZWxlbWVudHMKKyAgICAgKiAgcmVxdWlyZWQgZm9yIGNvbnRleHQgdHJhY2tpbmcuCisgICAgICovCisgICAgcEFOVExSM19MRVhFUiAgICBwTGV4ZXI7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xNDQpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xNDUpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xNDYpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xNDcpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xNDgpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xNDkpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xNTApCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xNTEpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xNTIpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xNTMpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xNTQpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xNTUpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xNTYpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xNTcpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xNTgpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xNTkpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xNjApCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xNjEpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xNjIpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xNjMpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xNjQpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xNjUpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xNjYpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xNjcpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xNjgpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xNjkpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xNzApCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xNzEpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xNzIpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xNzMpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xNzQpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xNzUpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xNzYpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xNzcpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xNzgpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xNzkpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xODApCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xODEpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xODIpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xODMpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xODQpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xODUpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xODYpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xODcpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xODgpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xODkpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xOTApCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xOTEpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xOTIpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xOTMpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xOTQpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xOTUpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xOTYpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xOTcpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xOTgpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18xOTkpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMDApCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMDEpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMDIpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMDMpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMDQpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMDUpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMDYpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMDcpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMDgpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMDkpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMTApCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMTEpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMTIpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMTMpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMTQpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMTUpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMTYpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMTcpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMTgpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMTkpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMjApCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMjEpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMjIpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMjMpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMjQpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMjUpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMjYpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMjcpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMjgpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMjkpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMzApCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMzEpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMzIpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMzMpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMzQpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMzUpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMzYpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMzcpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMzgpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yMzkpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNDApCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNDEpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNDIpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNDMpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNDQpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNDUpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNDYpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNDcpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNDgpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNDkpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNTApCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNTEpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNTIpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNTMpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNTQpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNTUpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNTYpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNTcpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNTgpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNTkpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNjApCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNjEpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNjIpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNjMpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNjQpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNjUpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNjYpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNjcpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNjgpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNjkpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNzApCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNzEpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNzIpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNzMpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNzQpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNzUpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNzYpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNzcpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNzgpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yNzkpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yODApCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yODEpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yODIpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yODMpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yODQpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yODUpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yODYpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yODcpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yODgpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yODkpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yOTApCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yOTEpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yOTIpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yOTMpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yOTQpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yOTUpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yOTYpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yOTcpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yOTgpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18yOTkpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMDApCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMDEpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMDIpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMDMpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMDQpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMDUpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMDYpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMDcpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMDgpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMDkpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMTApCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMTEpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMTIpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMTMpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMTQpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMTUpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMTYpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMTcpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMTgpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMTkpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMjApCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMjEpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMjIpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMjMpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMjQpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMjUpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMjYpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMjcpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMjgpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMjkpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMzApCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMzEpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMzIpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMzMpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMzQpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMzUpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMzYpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMzcpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMzgpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zMzkpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNDApCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNDEpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNDIpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNDMpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNDQpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNDUpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNDYpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNDcpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNDgpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNDkpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNTApCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNTEpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNTIpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNTMpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNTQpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNTUpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNTYpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNTcpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNTgpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNTkpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNjApCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNjEpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNjIpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNjMpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNjQpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNjUpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNjYpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNjcpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNjgpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNjkpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNzApCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNzEpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNzIpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNzMpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNzQpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNzUpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNzYpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNzcpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNzgpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zNzkpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zODApCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zODEpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zODIpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zODMpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zODQpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zODUpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zODYpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zODcpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zODgpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zODkpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zOTApCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zOTEpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zOTIpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zOTMpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zOTQpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zOTUpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zOTYpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zOTcpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zOTgpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX18zOTkpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX180MDApCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX180MDEpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX180MDIpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX180MDMpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX180MDQpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX180MDUpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX180MDYpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX180MDcpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX180MDgpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX180MDkpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX180MTApCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX180MTEpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX180MTIpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX180MTMpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX180MTQpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX180MTUpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX180MTYpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1UX180MTcpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1PUF9BVE9NSUNfU0VRVUVOQ0UpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1PUF9TRVFVRU5DRSkJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbU9QX1NFUVVFTkNFX1NJREUpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1PUF9TRVFVRU5DRV9XRUFLKQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptT1BfU0NIRURVTEVfR1QpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1PUF9TQ0hFRFVMRV9MVCkJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbU9QX1NDSEVEVUxFX1hPUikJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbU9QX1NDSEVEVUxFX0FORF9USEVOKQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptT1BfU0NIRURVTEVfT1JfRUxTRSkJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbU9QX05PTl9ERVRFUk1JTklTTSkJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbU9QX0NPTkNVUlJFTkNZX0FTWU5DKQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptT1BfQ09OQ1VSUkVOQ1lfQU5EKQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptT1BfQ09OQ1VSUkVOQ1lfT1IpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1PUF9DT05DVVJSRU5DWV9JTlRFUkxFQVZJTkcpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1PUF9DT05DVVJSRU5DWV9QQVJBTExFTCkJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbU9QX0ZPUkspCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1PUF9KT0lOKQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptT1BfQ09OQ1VSUkVOQ1lfUkRWX0FTWU5DKQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptT1BfQ09OQ1VSUkVOQ1lfUkRWX0FORCkJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbU9QX0NPTkNVUlJFTkNZX1JEVl9PUikJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbU9QX0NPTkNVUlJFTkNZX1JEVl9JTlRFUkxFQVZJTkcpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1PUF9DT05DVVJSRU5DWV9SRFZfUEFSQUxMRUwpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1BU1NJR04pCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1BU1NJR05fQUZURVIpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1BU1NJR05fUkVGKQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptQVNTSUdOX01BQ1JPKQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptT1BfUFVTSCkJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbU9QX0FTU0lHTl9UT1ApCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1PUF9UT1ApCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1PUF9QT1ApCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1MUEFSRU4pCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1SUEFSRU4pCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1MQ1VSTFkpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1SQ1VSTFkpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1MQlJBQ0tFVCkJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbVJCUkFDS0VUKQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptTEJSQUNLRVRfRVhDRVBUKQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptTFBBUkVOX0lOVk9LRSkJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbUxDVVJMWV9JTlZPS0UpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1QRVJDRU5UX0xQQVJFTl9JTlZPS0UpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1QRVJDRU5UX0xQQVJFTikJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbVJQQVJFTl9QRVJDRU5UKQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptU1RBVEVNRU5UX1BST01QVCkJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbURPTExBUl9MQ1VSTFkpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1SQ1VSTFlfRE9MTEFSKQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptUEVSQ0VOVF9MQ1VSTFkpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1SQ1VSTFlfUEVSQ0VOVCkJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbUxCUkFDS0VUX0JBUikJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbUJBUl9SQlJBQ0tFVCkJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbUxCUkFDS0VUX0xDVVJMWSkJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbVJDVVJMWV9SQlJBQ0tFVCkJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbUNPTE9OKQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptQ09NTUEpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1RVUVTVElPTikJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbVNFTUkpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1ESUVTRSkJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbURPTExBUikJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbURPVCkJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbURPVERPVCkJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbUNPTE9OeDIpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1MQU5EKQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptTEFORF9USEVOKQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptTEFORF9BU1NJR04pCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1MQU5EX0FTU0lHTl9BRlRFUikJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbUxOT1QpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1MT1IpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1MT1JfRUxTRSkJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbUxPUl9BU1NJR04pCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1MT1JfQVNTSUdOX0FGVEVSKQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptTFhPUikJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbUVRVUFMKQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptTkVRVUFMKQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptU0VRVUFMKQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptTlNFUVVBTCkJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbUxURSkJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbUxUXykJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbUdURSkJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbUdUKQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptUExVUykJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbVBMVVNfQVNTSUdOKQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptUExVU19BU1NJR05fQUZURVIpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1JTkNSKQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptTUlOVVMpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1NSU5VU19BU1NJR04pCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1NSU5VU19BU1NJR05fQUZURVIpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1ERUNSKQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptU1RBUikJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbVNUQVJfQVNTSUdOKQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptU1RBUl9BU1NJR05fQUZURVIpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1ESVYpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1ESVZfQVNTSUdOKQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptRElWX0FTU0lHTl9BRlRFUikJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbU1PRCkJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbU1PRF9BU1NJR04pCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1NT0RfQVNTSUdOX0FGVEVSKQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptUlNISUZUKQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptUlNISUZUX0FTU0lHTikJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbVJTSElGVF9BU1NJR05fQUZURVIpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1MU0hJRlQpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1MU0hJRlRfQVNTSUdOKQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptTFNISUZUX0FTU0lHTl9BRlRFUikJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbUJBTkQpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1CQU5EX0FTU0lHTikJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbUJBTkRfQVNTSUdOX0FGVEVSKQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptQk5PVCkJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbUJPUikJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbUJPUl9BU1NJR04pCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1CT1JfQVNTSUdOX0FGVEVSKQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptQlhPUikJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbUJYT1JfQVNTSUdOKQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptQlhPUl9BU1NJR05fQUZURVIpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1JRCkJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbUFUX0lEKQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptU3RyaW5nTGl0ZXJhbCkJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbUNoYXJMaXRlcmFsKQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptTnVtYmVyTGl0ZXJhbCkJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbUZsb2F0TGl0ZXJhbCkJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbVJhdGlvbmFsTGl0ZXJhbCkJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbUludGVnZXJMaXRlcmFsKQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptRmxvYXRUeXBlU3VmZml4KQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptSW1hZ2luYXJ5U3VmZml4KQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptSW50U3VmZml4KQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptSW50ZWdlcikJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbURlY2ltYWwpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1CaW5hcnkpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1PY3RhbCkJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbUhleGFkZWNpbWFsKQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptRGVjaW1hbERpZ2l0KQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptT2N0YWxEaWdpdCkJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbUhleERpZ2l0KQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptRGVjaW1hbEV4cG9uZW50KQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptRGVjaW1hbERpZ2l0cykJKHN0cnVjdCBmbWxMZXhlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbUZsb2F0KQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptRVhQT05FTlQpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1IRVhfRElHSVQpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1FU0NfU0VRKQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptT0NUQUxfRVNDKQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptVU5JQ09ERV9FU0MpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1DT01NRU5UKQkoc3RydWN0IGZtbExleGVyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCptV1MpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1Ub2tlbnMpCShzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKworICAgIGNvbnN0IGNoYXIgKiAoKmdldEdyYW1tYXJGaWxlTmFtZSkoKTsKKyAgICB2b2lkICAgICAgICAgICAgKCpyZXNldCkgIChzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisgICAgdm9pZAkgICAgKCpmcmVlKSAgIChzdHJ1Y3QgZm1sTGV4ZXJfQ3R4X3N0cnVjdCAqIGN0eCk7Cit9OworCisvLyBGdW5jdGlvbiBwcm90b3lwZXMgZm9yIHRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMgdGhhdCBleHRlcm5hbCB0cmFuc2xhdGlvbiB1bml0cworLy8gc3VjaCBhcyBkZWxlZ2F0b3JzIGFuZCBkZWxlZ2F0ZXMgbWF5IHdpc2ggdG8gY2FsbC4KKy8vCitBTlRMUjNfQVBJIHBmbWxMZXhlciBmbWxMZXhlck5ldyAgICAgICAgICgKK3BBTlRMUjNfSU5QVVRfU1RSRUFNCisgaW5zdHJlYW0pOworQU5UTFIzX0FQSSBwZm1sTGV4ZXIgZm1sTGV4ZXJOZXdTU0QgICAgICAoCitwQU5UTFIzX0lOUFVUX1NUUkVBTQorIGluc3RyZWFtLCBwQU5UTFIzX1JFQ09HTklaRVJfU0hBUkVEX1NUQVRFIHN0YXRlKTsKKworLyoqIFN5bWJvbGljIGRlZmluaXRpb25zIG9mIGFsbCB0aGUgdG9rZW5zIHRoYXQgdGhlIAorbGV4ZXIKKyB3aWxsIHdvcmsgd2l0aC4KKyAqIFx7CisgKgorICogQW50bHIgd2lsbCBkZWZpbmUgRU9GLCBidXQgd2UgY2FuJ3QgdXNlIHRoYXQgYXMgaXQgaXQgaXMgdG9vIGNvbW1vbiBpbgorICogaW4gQyBoZWFkZXIgZmlsZXMgYW5kIHRoYXQgd291bGQgYmUgY29uZnVzaW5nLiBUaGVyZSBpcyBubyB3YXkgdG8gZmlsdGVyIHRoaXMgb3V0IGF0IHRoZSBtb21lbnQKKyAqIHNvIHdlIGp1c3QgdW5kZWYgaXQgaGVyZSBmb3Igbm93LiBUaGF0IGlzbid0IHRoZSB2YWx1ZSB3ZSBnZXQgYmFjayBmcm9tIEMgcmVjb2duaXplcnMKKyAqIGFueXdheS4gV2UgYXJlIGxvb2tpbmcgZm9yIEFOVExSM19UT0tFTl9FT0YuCisgKi8KKyNpZmRlZglFT0YKKyN1bmRlZglFT0YKKyNlbmRpZgorI2lmZGVmCVRva2VucworI3VuZGVmCVRva2VucworI2VuZGlmCisjZGVmaW5lIEVPRiAgICAgIC0xCisjZGVmaW5lIFRfXzE0NCAgICAgIDE0NAorI2RlZmluZSBUX18xNDUgICAgICAxNDUKKyNkZWZpbmUgVF9fMTQ2ICAgICAgMTQ2CisjZGVmaW5lIFRfXzE0NyAgICAgIDE0NworI2RlZmluZSBUX18xNDggICAgICAxNDgKKyNkZWZpbmUgVF9fMTQ5ICAgICAgMTQ5CisjZGVmaW5lIFRfXzE1MCAgICAgIDE1MAorI2RlZmluZSBUX18xNTEgICAgICAxNTEKKyNkZWZpbmUgVF9fMTUyICAgICAgMTUyCisjZGVmaW5lIFRfXzE1MyAgICAgIDE1MworI2RlZmluZSBUX18xNTQgICAgICAxNTQKKyNkZWZpbmUgVF9fMTU1ICAgICAgMTU1CisjZGVmaW5lIFRfXzE1NiAgICAgIDE1NgorI2RlZmluZSBUX18xNTcgICAgICAxNTcKKyNkZWZpbmUgVF9fMTU4ICAgICAgMTU4CisjZGVmaW5lIFRfXzE1OSAgICAgIDE1OQorI2RlZmluZSBUX18xNjAgICAgICAxNjAKKyNkZWZpbmUgVF9fMTYxICAgICAgMTYxCisjZGVmaW5lIFRfXzE2MiAgICAgIDE2MgorI2RlZmluZSBUX18xNjMgICAgICAxNjMKKyNkZWZpbmUgVF9fMTY0ICAgICAgMTY0CisjZGVmaW5lIFRfXzE2NSAgICAgIDE2NQorI2RlZmluZSBUX18xNjYgICAgICAxNjYKKyNkZWZpbmUgVF9fMTY3ICAgICAgMTY3CisjZGVmaW5lIFRfXzE2OCAgICAgIDE2OAorI2RlZmluZSBUX18xNjkgICAgICAxNjkKKyNkZWZpbmUgVF9fMTcwICAgICAgMTcwCisjZGVmaW5lIFRfXzE3MSAgICAgIDE3MQorI2RlZmluZSBUX18xNzIgICAgICAxNzIKKyNkZWZpbmUgVF9fMTczICAgICAgMTczCisjZGVmaW5lIFRfXzE3NCAgICAgIDE3NAorI2RlZmluZSBUX18xNzUgICAgICAxNzUKKyNkZWZpbmUgVF9fMTc2ICAgICAgMTc2CisjZGVmaW5lIFRfXzE3NyAgICAgIDE3NworI2RlZmluZSBUX18xNzggICAgICAxNzgKKyNkZWZpbmUgVF9fMTc5ICAgICAgMTc5CisjZGVmaW5lIFRfXzE4MCAgICAgIDE4MAorI2RlZmluZSBUX18xODEgICAgICAxODEKKyNkZWZpbmUgVF9fMTgyICAgICAgMTgyCisjZGVmaW5lIFRfXzE4MyAgICAgIDE4MworI2RlZmluZSBUX18xODQgICAgICAxODQKKyNkZWZpbmUgVF9fMTg1ICAgICAgMTg1CisjZGVmaW5lIFRfXzE4NiAgICAgIDE4NgorI2RlZmluZSBUX18xODcgICAgICAxODcKKyNkZWZpbmUgVF9fMTg4ICAgICAgMTg4CisjZGVmaW5lIFRfXzE4OSAgICAgIDE4OQorI2RlZmluZSBUX18xOTAgICAgICAxOTAKKyNkZWZpbmUgVF9fMTkxICAgICAgMTkxCisjZGVmaW5lIFRfXzE5MiAgICAgIDE5MgorI2RlZmluZSBUX18xOTMgICAgICAxOTMKKyNkZWZpbmUgVF9fMTk0ICAgICAgMTk0CisjZGVmaW5lIFRfXzE5NSAgICAgIDE5NQorI2RlZmluZSBUX18xOTYgICAgICAxOTYKKyNkZWZpbmUgVF9fMTk3ICAgICAgMTk3CisjZGVmaW5lIFRfXzE5OCAgICAgIDE5OAorI2RlZmluZSBUX18xOTkgICAgICAxOTkKKyNkZWZpbmUgVF9fMjAwICAgICAgMjAwCisjZGVmaW5lIFRfXzIwMSAgICAgIDIwMQorI2RlZmluZSBUX18yMDIgICAgICAyMDIKKyNkZWZpbmUgVF9fMjAzICAgICAgMjAzCisjZGVmaW5lIFRfXzIwNCAgICAgIDIwNAorI2RlZmluZSBUX18yMDUgICAgICAyMDUKKyNkZWZpbmUgVF9fMjA2ICAgICAgMjA2CisjZGVmaW5lIFRfXzIwNyAgICAgIDIwNworI2RlZmluZSBUX18yMDggICAgICAyMDgKKyNkZWZpbmUgVF9fMjA5ICAgICAgMjA5CisjZGVmaW5lIFRfXzIxMCAgICAgIDIxMAorI2RlZmluZSBUX18yMTEgICAgICAyMTEKKyNkZWZpbmUgVF9fMjEyICAgICAgMjEyCisjZGVmaW5lIFRfXzIxMyAgICAgIDIxMworI2RlZmluZSBUX18yMTQgICAgICAyMTQKKyNkZWZpbmUgVF9fMjE1ICAgICAgMjE1CisjZGVmaW5lIFRfXzIxNiAgICAgIDIxNgorI2RlZmluZSBUX18yMTcgICAgICAyMTcKKyNkZWZpbmUgVF9fMjE4ICAgICAgMjE4CisjZGVmaW5lIFRfXzIxOSAgICAgIDIxOQorI2RlZmluZSBUX18yMjAgICAgICAyMjAKKyNkZWZpbmUgVF9fMjIxICAgICAgMjIxCisjZGVmaW5lIFRfXzIyMiAgICAgIDIyMgorI2RlZmluZSBUX18yMjMgICAgICAyMjMKKyNkZWZpbmUgVF9fMjI0ICAgICAgMjI0CisjZGVmaW5lIFRfXzIyNSAgICAgIDIyNQorI2RlZmluZSBUX18yMjYgICAgICAyMjYKKyNkZWZpbmUgVF9fMjI3ICAgICAgMjI3CisjZGVmaW5lIFRfXzIyOCAgICAgIDIyOAorI2RlZmluZSBUX18yMjkgICAgICAyMjkKKyNkZWZpbmUgVF9fMjMwICAgICAgMjMwCisjZGVmaW5lIFRfXzIzMSAgICAgIDIzMQorI2RlZmluZSBUX18yMzIgICAgICAyMzIKKyNkZWZpbmUgVF9fMjMzICAgICAgMjMzCisjZGVmaW5lIFRfXzIzNCAgICAgIDIzNAorI2RlZmluZSBUX18yMzUgICAgICAyMzUKKyNkZWZpbmUgVF9fMjM2ICAgICAgMjM2CisjZGVmaW5lIFRfXzIzNyAgICAgIDIzNworI2RlZmluZSBUX18yMzggICAgICAyMzgKKyNkZWZpbmUgVF9fMjM5ICAgICAgMjM5CisjZGVmaW5lIFRfXzI0MCAgICAgIDI0MAorI2RlZmluZSBUX18yNDEgICAgICAyNDEKKyNkZWZpbmUgVF9fMjQyICAgICAgMjQyCisjZGVmaW5lIFRfXzI0MyAgICAgIDI0MworI2RlZmluZSBUX18yNDQgICAgICAyNDQKKyNkZWZpbmUgVF9fMjQ1ICAgICAgMjQ1CisjZGVmaW5lIFRfXzI0NiAgICAgIDI0NgorI2RlZmluZSBUX18yNDcgICAgICAyNDcKKyNkZWZpbmUgVF9fMjQ4ICAgICAgMjQ4CisjZGVmaW5lIFRfXzI0OSAgICAgIDI0OQorI2RlZmluZSBUX18yNTAgICAgICAyNTAKKyNkZWZpbmUgVF9fMjUxICAgICAgMjUxCisjZGVmaW5lIFRfXzI1MiAgICAgIDI1MgorI2RlZmluZSBUX18yNTMgICAgICAyNTMKKyNkZWZpbmUgVF9fMjU0ICAgICAgMjU0CisjZGVmaW5lIFRfXzI1NSAgICAgIDI1NQorI2RlZmluZSBUX18yNTYgICAgICAyNTYKKyNkZWZpbmUgVF9fMjU3ICAgICAgMjU3CisjZGVmaW5lIFRfXzI1OCAgICAgIDI1OAorI2RlZmluZSBUX18yNTkgICAgICAyNTkKKyNkZWZpbmUgVF9fMjYwICAgICAgMjYwCisjZGVmaW5lIFRfXzI2MSAgICAgIDI2MQorI2RlZmluZSBUX18yNjIgICAgICAyNjIKKyNkZWZpbmUgVF9fMjYzICAgICAgMjYzCisjZGVmaW5lIFRfXzI2NCAgICAgIDI2NAorI2RlZmluZSBUX18yNjUgICAgICAyNjUKKyNkZWZpbmUgVF9fMjY2ICAgICAgMjY2CisjZGVmaW5lIFRfXzI2NyAgICAgIDI2NworI2RlZmluZSBUX18yNjggICAgICAyNjgKKyNkZWZpbmUgVF9fMjY5ICAgICAgMjY5CisjZGVmaW5lIFRfXzI3MCAgICAgIDI3MAorI2RlZmluZSBUX18yNzEgICAgICAyNzEKKyNkZWZpbmUgVF9fMjcyICAgICAgMjcyCisjZGVmaW5lIFRfXzI3MyAgICAgIDI3MworI2RlZmluZSBUX18yNzQgICAgICAyNzQKKyNkZWZpbmUgVF9fMjc1ICAgICAgMjc1CisjZGVmaW5lIFRfXzI3NiAgICAgIDI3NgorI2RlZmluZSBUX18yNzcgICAgICAyNzcKKyNkZWZpbmUgVF9fMjc4ICAgICAgMjc4CisjZGVmaW5lIFRfXzI3OSAgICAgIDI3OQorI2RlZmluZSBUX18yODAgICAgICAyODAKKyNkZWZpbmUgVF9fMjgxICAgICAgMjgxCisjZGVmaW5lIFRfXzI4MiAgICAgIDI4MgorI2RlZmluZSBUX18yODMgICAgICAyODMKKyNkZWZpbmUgVF9fMjg0ICAgICAgMjg0CisjZGVmaW5lIFRfXzI4NSAgICAgIDI4NQorI2RlZmluZSBUX18yODYgICAgICAyODYKKyNkZWZpbmUgVF9fMjg3ICAgICAgMjg3CisjZGVmaW5lIFRfXzI4OCAgICAgIDI4OAorI2RlZmluZSBUX18yODkgICAgICAyODkKKyNkZWZpbmUgVF9fMjkwICAgICAgMjkwCisjZGVmaW5lIFRfXzI5MSAgICAgIDI5MQorI2RlZmluZSBUX18yOTIgICAgICAyOTIKKyNkZWZpbmUgVF9fMjkzICAgICAgMjkzCisjZGVmaW5lIFRfXzI5NCAgICAgIDI5NAorI2RlZmluZSBUX18yOTUgICAgICAyOTUKKyNkZWZpbmUgVF9fMjk2ICAgICAgMjk2CisjZGVmaW5lIFRfXzI5NyAgICAgIDI5NworI2RlZmluZSBUX18yOTggICAgICAyOTgKKyNkZWZpbmUgVF9fMjk5ICAgICAgMjk5CisjZGVmaW5lIFRfXzMwMCAgICAgIDMwMAorI2RlZmluZSBUX18zMDEgICAgICAzMDEKKyNkZWZpbmUgVF9fMzAyICAgICAgMzAyCisjZGVmaW5lIFRfXzMwMyAgICAgIDMwMworI2RlZmluZSBUX18zMDQgICAgICAzMDQKKyNkZWZpbmUgVF9fMzA1ICAgICAgMzA1CisjZGVmaW5lIFRfXzMwNiAgICAgIDMwNgorI2RlZmluZSBUX18zMDcgICAgICAzMDcKKyNkZWZpbmUgVF9fMzA4ICAgICAgMzA4CisjZGVmaW5lIFRfXzMwOSAgICAgIDMwOQorI2RlZmluZSBUX18zMTAgICAgICAzMTAKKyNkZWZpbmUgVF9fMzExICAgICAgMzExCisjZGVmaW5lIFRfXzMxMiAgICAgIDMxMgorI2RlZmluZSBUX18zMTMgICAgICAzMTMKKyNkZWZpbmUgVF9fMzE0ICAgICAgMzE0CisjZGVmaW5lIFRfXzMxNSAgICAgIDMxNQorI2RlZmluZSBUX18zMTYgICAgICAzMTYKKyNkZWZpbmUgVF9fMzE3ICAgICAgMzE3CisjZGVmaW5lIFRfXzMxOCAgICAgIDMxOAorI2RlZmluZSBUX18zMTkgICAgICAzMTkKKyNkZWZpbmUgVF9fMzIwICAgICAgMzIwCisjZGVmaW5lIFRfXzMyMSAgICAgIDMyMQorI2RlZmluZSBUX18zMjIgICAgICAzMjIKKyNkZWZpbmUgVF9fMzIzICAgICAgMzIzCisjZGVmaW5lIFRfXzMyNCAgICAgIDMyNAorI2RlZmluZSBUX18zMjUgICAgICAzMjUKKyNkZWZpbmUgVF9fMzI2ICAgICAgMzI2CisjZGVmaW5lIFRfXzMyNyAgICAgIDMyNworI2RlZmluZSBUX18zMjggICAgICAzMjgKKyNkZWZpbmUgVF9fMzI5ICAgICAgMzI5CisjZGVmaW5lIFRfXzMzMCAgICAgIDMzMAorI2RlZmluZSBUX18zMzEgICAgICAzMzEKKyNkZWZpbmUgVF9fMzMyICAgICAgMzMyCisjZGVmaW5lIFRfXzMzMyAgICAgIDMzMworI2RlZmluZSBUX18zMzQgICAgICAzMzQKKyNkZWZpbmUgVF9fMzM1ICAgICAgMzM1CisjZGVmaW5lIFRfXzMzNiAgICAgIDMzNgorI2RlZmluZSBUX18zMzcgICAgICAzMzcKKyNkZWZpbmUgVF9fMzM4ICAgICAgMzM4CisjZGVmaW5lIFRfXzMzOSAgICAgIDMzOQorI2RlZmluZSBUX18zNDAgICAgICAzNDAKKyNkZWZpbmUgVF9fMzQxICAgICAgMzQxCisjZGVmaW5lIFRfXzM0MiAgICAgIDM0MgorI2RlZmluZSBUX18zNDMgICAgICAzNDMKKyNkZWZpbmUgVF9fMzQ0ICAgICAgMzQ0CisjZGVmaW5lIFRfXzM0NSAgICAgIDM0NQorI2RlZmluZSBUX18zNDYgICAgICAzNDYKKyNkZWZpbmUgVF9fMzQ3ICAgICAgMzQ3CisjZGVmaW5lIFRfXzM0OCAgICAgIDM0OAorI2RlZmluZSBUX18zNDkgICAgICAzNDkKKyNkZWZpbmUgVF9fMzUwICAgICAgMzUwCisjZGVmaW5lIFRfXzM1MSAgICAgIDM1MQorI2RlZmluZSBUX18zNTIgICAgICAzNTIKKyNkZWZpbmUgVF9fMzUzICAgICAgMzUzCisjZGVmaW5lIFRfXzM1NCAgICAgIDM1NAorI2RlZmluZSBUX18zNTUgICAgICAzNTUKKyNkZWZpbmUgVF9fMzU2ICAgICAgMzU2CisjZGVmaW5lIFRfXzM1NyAgICAgIDM1NworI2RlZmluZSBUX18zNTggICAgICAzNTgKKyNkZWZpbmUgVF9fMzU5ICAgICAgMzU5CisjZGVmaW5lIFRfXzM2MCAgICAgIDM2MAorI2RlZmluZSBUX18zNjEgICAgICAzNjEKKyNkZWZpbmUgVF9fMzYyICAgICAgMzYyCisjZGVmaW5lIFRfXzM2MyAgICAgIDM2MworI2RlZmluZSBUX18zNjQgICAgICAzNjQKKyNkZWZpbmUgVF9fMzY1ICAgICAgMzY1CisjZGVmaW5lIFRfXzM2NiAgICAgIDM2NgorI2RlZmluZSBUX18zNjcgICAgICAzNjcKKyNkZWZpbmUgVF9fMzY4ICAgICAgMzY4CisjZGVmaW5lIFRfXzM2OSAgICAgIDM2OQorI2RlZmluZSBUX18zNzAgICAgICAzNzAKKyNkZWZpbmUgVF9fMzcxICAgICAgMzcxCisjZGVmaW5lIFRfXzM3MiAgICAgIDM3MgorI2RlZmluZSBUX18zNzMgICAgICAzNzMKKyNkZWZpbmUgVF9fMzc0ICAgICAgMzc0CisjZGVmaW5lIFRfXzM3NSAgICAgIDM3NQorI2RlZmluZSBUX18zNzYgICAgICAzNzYKKyNkZWZpbmUgVF9fMzc3ICAgICAgMzc3CisjZGVmaW5lIFRfXzM3OCAgICAgIDM3OAorI2RlZmluZSBUX18zNzkgICAgICAzNzkKKyNkZWZpbmUgVF9fMzgwICAgICAgMzgwCisjZGVmaW5lIFRfXzM4MSAgICAgIDM4MQorI2RlZmluZSBUX18zODIgICAgICAzODIKKyNkZWZpbmUgVF9fMzgzICAgICAgMzgzCisjZGVmaW5lIFRfXzM4NCAgICAgIDM4NAorI2RlZmluZSBUX18zODUgICAgICAzODUKKyNkZWZpbmUgVF9fMzg2ICAgICAgMzg2CisjZGVmaW5lIFRfXzM4NyAgICAgIDM4NworI2RlZmluZSBUX18zODggICAgICAzODgKKyNkZWZpbmUgVF9fMzg5ICAgICAgMzg5CisjZGVmaW5lIFRfXzM5MCAgICAgIDM5MAorI2RlZmluZSBUX18zOTEgICAgICAzOTEKKyNkZWZpbmUgVF9fMzkyICAgICAgMzkyCisjZGVmaW5lIFRfXzM5MyAgICAgIDM5MworI2RlZmluZSBUX18zOTQgICAgICAzOTQKKyNkZWZpbmUgVF9fMzk1ICAgICAgMzk1CisjZGVmaW5lIFRfXzM5NiAgICAgIDM5NgorI2RlZmluZSBUX18zOTcgICAgICAzOTcKKyNkZWZpbmUgVF9fMzk4ICAgICAgMzk4CisjZGVmaW5lIFRfXzM5OSAgICAgIDM5OQorI2RlZmluZSBUX180MDAgICAgICA0MDAKKyNkZWZpbmUgVF9fNDAxICAgICAgNDAxCisjZGVmaW5lIFRfXzQwMiAgICAgIDQwMgorI2RlZmluZSBUX180MDMgICAgICA0MDMKKyNkZWZpbmUgVF9fNDA0ICAgICAgNDA0CisjZGVmaW5lIFRfXzQwNSAgICAgIDQwNQorI2RlZmluZSBUX180MDYgICAgICA0MDYKKyNkZWZpbmUgVF9fNDA3ICAgICAgNDA3CisjZGVmaW5lIFRfXzQwOCAgICAgIDQwOAorI2RlZmluZSBUX180MDkgICAgICA0MDkKKyNkZWZpbmUgVF9fNDEwICAgICAgNDEwCisjZGVmaW5lIFRfXzQxMSAgICAgIDQxMQorI2RlZmluZSBUX180MTIgICAgICA0MTIKKyNkZWZpbmUgVF9fNDEzICAgICAgNDEzCisjZGVmaW5lIFRfXzQxNCAgICAgIDQxNAorI2RlZmluZSBUX180MTUgICAgICA0MTUKKyNkZWZpbmUgVF9fNDE2ICAgICAgNDE2CisjZGVmaW5lIFRfXzQxNyAgICAgIDQxNworI2RlZmluZSBBU1NJR04gICAgICA0CisjZGVmaW5lIEFTU0lHTl9BRlRFUiAgICAgIDUKKyNkZWZpbmUgQVNTSUdOX01BQ1JPICAgICAgNgorI2RlZmluZSBBU1NJR05fUkVGICAgICAgNworI2RlZmluZSBBVF9JRCAgICAgIDgKKyNkZWZpbmUgQkFORCAgICAgIDkKKyNkZWZpbmUgQkFORF9BU1NJR04gICAgICAxMAorI2RlZmluZSBCQU5EX0FTU0lHTl9BRlRFUiAgICAgIDExCisjZGVmaW5lIEJBUl9SQlJBQ0tFVCAgICAgIDEyCisjZGVmaW5lIEJOT1QgICAgICAxMworI2RlZmluZSBCT1IgICAgICAxNAorI2RlZmluZSBCT1JfQVNTSUdOICAgICAgMTUKKyNkZWZpbmUgQk9SX0FTU0lHTl9BRlRFUiAgICAgIDE2CisjZGVmaW5lIEJYT1IgICAgICAxNworI2RlZmluZSBCWE9SX0FTU0lHTiAgICAgIDE4CisjZGVmaW5lIEJYT1JfQVNTSUdOX0FGVEVSICAgICAgMTkKKyNkZWZpbmUgQmluYXJ5ICAgICAgMjAKKyNkZWZpbmUgQ09MT04gICAgICAyMQorI2RlZmluZSBDT0xPTngyICAgICAgMjIKKyNkZWZpbmUgQ09NTUEgICAgICAyMworI2RlZmluZSBDT01NRU5UICAgICAgMjQKKyNkZWZpbmUgQ2hhckxpdGVyYWwgICAgICAyNQorI2RlZmluZSBERUNSICAgICAgMjYKKyNkZWZpbmUgRElFU0UgICAgICAyNworI2RlZmluZSBESVYgICAgICAyOAorI2RlZmluZSBESVZfQVNTSUdOICAgICAgMjkKKyNkZWZpbmUgRElWX0FTU0lHTl9BRlRFUiAgICAgIDMwCisjZGVmaW5lIERPTExBUiAgICAgIDMxCisjZGVmaW5lIERPTExBUl9MQ1VSTFkgICAgICAzMgorI2RlZmluZSBET1QgICAgICAzMworI2RlZmluZSBET1RET1QgICAgICAzNAorI2RlZmluZSBEZWNpbWFsICAgICAgMzUKKyNkZWZpbmUgRGVjaW1hbERpZ2l0ICAgICAgMzYKKyNkZWZpbmUgRGVjaW1hbERpZ2l0cyAgICAgIDM3CisjZGVmaW5lIERlY2ltYWxFeHBvbmVudCAgICAgIDM4CisjZGVmaW5lIEVRVUFMICAgICAgMzkKKyNkZWZpbmUgRVNDX1NFUSAgICAgIDQwCisjZGVmaW5lIEVYUE9ORU5UICAgICAgNDEKKyNkZWZpbmUgRmxvYXQgICAgICA0MgorI2RlZmluZSBGbG9hdExpdGVyYWwgICAgICA0MworI2RlZmluZSBGbG9hdFR5cGVTdWZmaXggICAgICA0NAorI2RlZmluZSBHVCAgICAgIDQ1CisjZGVmaW5lIEdURSAgICAgIDQ2CisjZGVmaW5lIEhFWF9ESUdJVCAgICAgIDQ3CisjZGVmaW5lIEhleERpZ2l0ICAgICAgNDgKKyNkZWZpbmUgSGV4YWRlY2ltYWwgICAgICA0OQorI2RlZmluZSBJRCAgICAgIDUwCisjZGVmaW5lIElOQ1IgICAgICA1MQorI2RlZmluZSBJbWFnaW5hcnlTdWZmaXggICAgICA1MgorI2RlZmluZSBJbnRTdWZmaXggICAgICA1MworI2RlZmluZSBJbnRlZ2VyICAgICAgNTQKKyNkZWZpbmUgSW50ZWdlckxpdGVyYWwgICAgICA1NQorI2RlZmluZSBMQU5EICAgICAgNTYKKyNkZWZpbmUgTEFORF9BU1NJR04gICAgICA1NworI2RlZmluZSBMQU5EX0FTU0lHTl9BRlRFUiAgICAgIDU4CisjZGVmaW5lIExBTkRfVEhFTiAgICAgIDU5CisjZGVmaW5lIExCUkFDS0VUICAgICAgNjAKKyNkZWZpbmUgTEJSQUNLRVRfQkFSICAgICAgNjEKKyNkZWZpbmUgTEJSQUNLRVRfRVhDRVBUICAgICAgNjIKKyNkZWZpbmUgTEJSQUNLRVRfTENVUkxZICAgICAgNjMKKyNkZWZpbmUgTENVUkxZICAgICAgNjQKKyNkZWZpbmUgTENVUkxZX0lOVk9LRSAgICAgIDY1CisjZGVmaW5lIExOT1QgICAgICA2NgorI2RlZmluZSBMT1IgICAgICA2NworI2RlZmluZSBMT1JfQVNTSUdOICAgICAgNjgKKyNkZWZpbmUgTE9SX0FTU0lHTl9BRlRFUiAgICAgIDY5CisjZGVmaW5lIExPUl9FTFNFICAgICAgNzAKKyNkZWZpbmUgTFBBUkVOICAgICAgNzEKKyNkZWZpbmUgTFBBUkVOX0lOVk9LRSAgICAgIDcyCisjZGVmaW5lIExTSElGVCAgICAgIDczCisjZGVmaW5lIExTSElGVF9BU1NJR04gICAgICA3NAorI2RlZmluZSBMU0hJRlRfQVNTSUdOX0FGVEVSICAgICAgNzUKKyNkZWZpbmUgTFRFICAgICAgNzYKKyNkZWZpbmUgTFRfICAgICAgNzcKKyNkZWZpbmUgTFhPUiAgICAgIDc4CisjZGVmaW5lIE1JTlVTICAgICAgNzkKKyNkZWZpbmUgTUlOVVNfQVNTSUdOICAgICAgODAKKyNkZWZpbmUgTUlOVVNfQVNTSUdOX0FGVEVSICAgICAgODEKKyNkZWZpbmUgTU9EICAgICAgODIKKyNkZWZpbmUgTU9EX0FTU0lHTiAgICAgIDgzCisjZGVmaW5lIE1PRF9BU1NJR05fQUZURVIgICAgICA4NAorI2RlZmluZSBORVFVQUwgICAgICA4NQorI2RlZmluZSBOU0VRVUFMICAgICAgODYKKyNkZWZpbmUgTnVtYmVyTGl0ZXJhbCAgICAgIDg3CisjZGVmaW5lIE9DVEFMX0VTQyAgICAgIDg4CisjZGVmaW5lIE9QX0FTU0lHTl9UT1AgICAgICA4OQorI2RlZmluZSBPUF9BVE9NSUNfU0VRVUVOQ0UgICAgICA5MAorI2RlZmluZSBPUF9DT05DVVJSRU5DWV9BTkQgICAgICA5MQorI2RlZmluZSBPUF9DT05DVVJSRU5DWV9BU1lOQyAgICAgIDkyCisjZGVmaW5lIE9QX0NPTkNVUlJFTkNZX0lOVEVSTEVBVklORyAgICAgIDkzCisjZGVmaW5lIE9QX0NPTkNVUlJFTkNZX09SICAgICAgOTQKKyNkZWZpbmUgT1BfQ09OQ1VSUkVOQ1lfUEFSQUxMRUwgICAgICA5NQorI2RlZmluZSBPUF9DT05DVVJSRU5DWV9SRFZfQU5EICAgICAgOTYKKyNkZWZpbmUgT1BfQ09OQ1VSUkVOQ1lfUkRWX0FTWU5DICAgICAgOTcKKyNkZWZpbmUgT1BfQ09OQ1VSUkVOQ1lfUkRWX0lOVEVSTEVBVklORyAgICAgIDk4CisjZGVmaW5lIE9QX0NPTkNVUlJFTkNZX1JEVl9PUiAgICAgIDk5CisjZGVmaW5lIE9QX0NPTkNVUlJFTkNZX1JEVl9QQVJBTExFTCAgICAgIDEwMAorI2RlZmluZSBPUF9GT1JLICAgICAgMTAxCisjZGVmaW5lIE9QX0pPSU4gICAgICAxMDIKKyNkZWZpbmUgT1BfTk9OX0RFVEVSTUlOSVNNICAgICAgMTAzCisjZGVmaW5lIE9QX1BPUCAgICAgIDEwNAorI2RlZmluZSBPUF9QVVNIICAgICAgMTA1CisjZGVmaW5lIE9QX1NDSEVEVUxFX0FORF9USEVOICAgICAgMTA2CisjZGVmaW5lIE9QX1NDSEVEVUxFX0dUICAgICAgMTA3CisjZGVmaW5lIE9QX1NDSEVEVUxFX0xUICAgICAgMTA4CisjZGVmaW5lIE9QX1NDSEVEVUxFX09SX0VMU0UgICAgICAxMDkKKyNkZWZpbmUgT1BfU0NIRURVTEVfWE9SICAgICAgMTEwCisjZGVmaW5lIE9QX1NFUVVFTkNFICAgICAgMTExCisjZGVmaW5lIE9QX1NFUVVFTkNFX1NJREUgICAgICAxMTIKKyNkZWZpbmUgT1BfU0VRVUVOQ0VfV0VBSyAgICAgIDExMworI2RlZmluZSBPUF9UT1AgICAgICAxMTQKKyNkZWZpbmUgT2N0YWwgICAgICAxMTUKKyNkZWZpbmUgT2N0YWxEaWdpdCAgICAgIDExNgorI2RlZmluZSBQRVJDRU5UX0xDVVJMWSAgICAgIDExNworI2RlZmluZSBQRVJDRU5UX0xQQVJFTiAgICAgIDExOAorI2RlZmluZSBQRVJDRU5UX0xQQVJFTl9JTlZPS0UgICAgICAxMTkKKyNkZWZpbmUgUExVUyAgICAgIDEyMAorI2RlZmluZSBQTFVTX0FTU0lHTiAgICAgIDEyMQorI2RlZmluZSBQTFVTX0FTU0lHTl9BRlRFUiAgICAgIDEyMgorI2RlZmluZSBRVUVTVElPTiAgICAgIDEyMworI2RlZmluZSBSQlJBQ0tFVCAgICAgIDEyNAorI2RlZmluZSBSQ1VSTFkgICAgICAxMjUKKyNkZWZpbmUgUkNVUkxZX0RPTExBUiAgICAgIDEyNgorI2RlZmluZSBSQ1VSTFlfUEVSQ0VOVCAgICAgIDEyNworI2RlZmluZSBSQ1VSTFlfUkJSQUNLRVQgICAgICAxMjgKKyNkZWZpbmUgUlBBUkVOICAgICAgMTI5CisjZGVmaW5lIFJQQVJFTl9QRVJDRU5UICAgICAgMTMwCisjZGVmaW5lIFJTSElGVCAgICAgIDEzMQorI2RlZmluZSBSU0hJRlRfQVNTSUdOICAgICAgMTMyCisjZGVmaW5lIFJTSElGVF9BU1NJR05fQUZURVIgICAgICAxMzMKKyNkZWZpbmUgUmF0aW9uYWxMaXRlcmFsICAgICAgMTM0CisjZGVmaW5lIFNFTUkgICAgICAxMzUKKyNkZWZpbmUgU0VRVUFMICAgICAgMTM2CisjZGVmaW5lIFNUQVIgICAgICAxMzcKKyNkZWZpbmUgU1RBUl9BU1NJR04gICAgICAxMzgKKyNkZWZpbmUgU1RBUl9BU1NJR05fQUZURVIgICAgICAxMzkKKyNkZWZpbmUgU1RBVEVNRU5UX1BST01QVCAgICAgIDE0MAorI2RlZmluZSBTdHJpbmdMaXRlcmFsICAgICAgMTQxCisjZGVmaW5lIFVOSUNPREVfRVNDICAgICAgMTQyCisjZGVmaW5lIFdTICAgICAgMTQzCisjaWZkZWYJRU9GCisjdW5kZWYJRU9GCisjZGVmaW5lCUVPRglBTlRMUjNfVE9LRU5fRU9GCisjZW5kaWYKKworI2lmbmRlZiBUT0tFTlNPVVJDRQorI2RlZmluZSBUT0tFTlNPVVJDRShseHIpIGx4ci0+cExleGVyLT5yZWMtPnN0YXRlLT50b2tTb3VyY2UKKyNlbmRpZgorCisvKiBFbmQgb2YgdG9rZW4gZGVmaW5pdGlvbnMgZm9yIGZtbExleGVyCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvKiogfSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKKworLyogRU5EIC0gTm90ZTpLZWVwIGV4dHJhIGxpbmUgZmVlZCB0byBzYXRpc2Z5IFVOSVggc3lzdGVtcyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbFBhcnNlci5jIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbFBhcnNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZTBjNDAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sUGFyc2VyLmMKQEAgLTAsMCArMSw5MTMyMCBAQAorLyoqIFxmaWxlCisgKiAgVGhpcyBDIHNvdXJjZSBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgJEFOVExSIHZlcnNpb24gMy40CisgKgorICogICAgIC0gIEZyb20gdGhlIGdyYW1tYXIgc291cmNlIGZpbGUgOiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZworICogICAgIC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT24gOiAyMDE3LTA1LTMwIDA5OjIxOjUyCisgKiAgICAgLSAgICAgICAgICAgICAgICBmb3IgdGhlIHBhcnNlciA6IGZtbFBhcnNlclBhcnNlcgorICoKKyAqIEVkaXRpbmcgaXQsIGF0IGxlYXN0IG1hbnVhbGx5LCBpcyBub3Qgd2lzZS4KKyAqCisgKiBDIGxhbmd1YWdlIGdlbmVyYXRvciBhbmQgcnVudGltZSBieSBKaW0gSWRsZSwgamltaXxoZXJlaXNhbmF0fGlkbGV8ZG90Z29lc2hlcmV8d3MuCisgKgorICoKKyovCisvLyBbVGhlICJCU0QgbGljZW5zZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBKaW0gSWRsZSwgVGVtcG9yYWwgV2F2ZSBMTEMKKy8vIGh0dHA6Ly93d3cudGVtcG9yYWwtd2F2ZS5jb20KKy8vIGh0dHA6Ly93d3cubGlua2VkaW4uY29tL2luL2ppbWlkbGUKKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFRoaXMgaXMgd2hhdCB0aGUgZ3JhbW1hciBwcm9ncmFtbWVyIGFza2VkIHVzIHRvIHB1dCBhdCB0aGUgdG9wIG9mIGV2ZXJ5IGZpbGUuCisgKi8KKworCisjaW5jbHVkZSA8cGFyc2VyL21vZGVsL1BhcnNlclV0aWwuaD4KKworI2luY2x1ZGUgPGNvbW1vbi9CRi5oPgorCisjaW5jbHVkZSA8Y29sbGVjdGlvbi9CRkNvbnRhaW5lci5oPgorCisjaW5jbHVkZSA8Zm1sL2NvbW1vbi9CZWhhdmlvcmFsRWxlbWVudC5oPgorI2luY2x1ZGUgPGZtbC9jb21tb24vTW9kaWZpZXJFbGVtZW50Lmg+CisjaW5jbHVkZSA8Zm1sL2NvbW1vbi9TcGVjaWZpZXJFbGVtZW50Lmg+CisKKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlTGliLmg+CisKKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9Bdm1Db2RlLmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQnVpbHRpbkFycmF5Lmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkNvbnN0YW50Lmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkNvbnN0cnVjdG9yLmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vU3RhdGVtZW50Q29uc3RydWN0b3IuaD4KKworI2luY2x1ZGUgPGZtbC9saWIvSUNvbVBvaW50Lmg+CisKKyNpbmNsdWRlIDxmbWwvb3BlcmF0b3IvT3BlcmF0b3IuaD4KKyNpbmNsdWRlIDxmbWwvb3BlcmF0b3IvT3BlcmF0b3JNYW5hZ2VyLmg+CisKKyNpbmNsdWRlIDxmbWwvdGVtcGxhdGUvVGVtcGxhdGVGYWN0b3J5Lmg+CisKKyNpbmNsdWRlIDxmbWwvdHlwZS9UeXBlU3BlY2lmaWVyLmg+CisKKyNpbmNsdWRlIDxmbWwvdHlwZS9UeXBlTWFuYWdlci5oPgorCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0J1ZmZlci5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9DaGFubmVsLmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0NvbVBvaW50Lmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0NvbVByb3RvY29sLmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0NvbVJvdXRlLmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0Nvbm5lY3Rvci5oPgorCisvLyBleHRlcm4gIkMiIGFuZCBDKysgdGVtcGxhdGUgaW5jb21wYXRpYmlsaXR5ICEhIQorLy8jaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1Byb3BlcnR5UGFydC5oPgorCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0RhdGFUeXBlLmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL01hY2hpbmUuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvUGFja2FnZS5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Qb3J0Lmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1JvdXRpbmUuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvU3lzdGVtLmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1RyYW5zaXRpb24uaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvVmFyaWFibGUuaD4KKworI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9CZWhhdmlvcmFsUGFydC5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Db21wb3NpdGVQYXJ0Lmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0luc3RhbmNlU3BlY2lmaWVyUGFydC5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9JbnRlcmFjdGlvblBhcnQuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvTW9kZWxPZkNvbXB1dGF0aW9uUGFydC5oPgorCisvLyBleHRlcm4gIkMiIGFuZCBDKysgdGVtcGxhdGUgaW5jb21wYXRpYmlsaXR5ICEhIQorLy8jaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1Byb3BlcnR5UGFydC5oPgorCisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1F1ZXJ5Lmg+CisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1VuaUZvcm1JZGVudGlmaWVyLmg+CisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1dPYmplY3QuaD4KKworCisvL3ZvaWQgZm1sRGlzcGxheVJlY29nbml0aW9uRXJyb3IoCisvLwkJcEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjb2duaXplciwgcEFOVExSM19VSU5UOCAqIHRva2VuTmFtZXMpOworCisKKy8qIEVuZCBvZiBIZWFkZXIgYWN0aW9uLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSB0aGUgQU5UTFIzIGdlbmVyYXRlZCBoZWFkZXIgZmlsZS4KKyAqLworI2luY2x1ZGUgICAgImZtbFBhcnNlci5oIgorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisKKworCisvKiBNQUNST1MgdGhhdCBoaWRlIHRoZSBDIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbnMgZnJvbSB0aGUKKyAqIGdlbmVyYXRlZCBjb2RlLCB3aGljaCBtYWtlcyBpdCBhIGxpdHRsZSBtb3JlIHVuZGVyc3RhbmRhYmxlIHRvIHRoZSBodW1hbiBleWUuCisgKiBJIGFtIHZlcnkgbXVjaCBhZ2FpbnN0IHVzaW5nIEMgcHJlLXByb2Nlc3NvciBtYWNyb3MgZm9yIGZ1bmN0aW9uIGNhbGxzIGFuZCBiaXRzCisgKiBvZiBjb2RlIGFzIHlvdSBjYW5ub3Qgc2VlIHdoYXQgaXMgaGFwcGVuaW5nIHdoZW4gc2luZ2xlIHN0ZXBwaW5nIGluIGRlYnVnZ2VycworICogYW5kIHNvIG9uLiBUaGUgZXhjZXB0aW9uIChpbiBteSBib29rIGF0IGxlYXN0KSBpcyBmb3IgZ2VuZXJhdGVkIGNvZGUsIHdoZXJlIHlvdSBhcmUKKyAqIG5vdCBtYWludGFpbmluZyBpdCwgYnV0IG1heSB3aXNoIHRvIHJlYWQgYW5kIHVuZGVyc3RhbmQgaXQuIElmIHlvdSBzaW5nbGUgc3RlcCBpdCwgeW91IGtub3cgdGhhdCBpbnB1dCgpCisgKiBoaWRlcyBzb21lIGluZGlyZWN0IGNhbGxzLCBidXQgaXMgYWx3YXlzIHJlZmVycmluZyB0byB0aGUgaW5wdXQgc3RyZWFtLiBUaGlzIGlzCisgKiBwcm9iYWJseSBtb3JlIHJlYWRhYmxlIHRoYW4gY3R4LT5pbnB1dC0+aXN0cmVhbS0+aW5wdXQoc25hcmZsZTAtPmJsYXJnKSBhbmQgYWxsb3dzIG1lIHRvIHJlamlnCisgKiB0aGUgcnVudGltZSBpbnRlcmZhY2VzIHdpdGhvdXQgY2hhbmdpbmcgdGhlIGdlbmVyYXRlZCBjb2RlIHRvbyBvZnRlbiwgd2l0aG91dAorICogY29uZnVzaW5nIHRoZSByZWFkZXIgb2YgdGhlIGdlbmVyYXRlZCBvdXRwdXQsIHdobyBtYXkgbm90IHdpc2ggdG8ga25vdyB0aGUgZ29yeQorICogZGV0YWlscyBvZiB0aGUgaW50ZXJmYWNlIGluaGVyaXRhbmNlLgorICovCisKKyNkZWZpbmUJCUNUWAljdHgKKworLyogQWlkcyBpbiBhY2Nlc3Npbmcgc2NvcGVzIGZvciBncmFtbWFyIHByb2dyYW1tZXJzCisgKi8KKyN1bmRlZglTQ09QRV9UWVBFCisjdW5kZWYJU0NPUEVfU1RBQ0sKKyN1bmRlZglTQ09QRV9UT1AKKyNkZWZpbmUJU0NPUEVfVFlQRShzY29wZSkgICBwZm1sUGFyc2VyXyMjc2NvcGUjI19TQ09QRQorI2RlZmluZSBTQ09QRV9TVEFDSyhzY29wZSkgIHBmbWxQYXJzZXJfIyNzY29wZSMjU3RhY2sKKyNkZWZpbmUJU0NPUEVfVE9QKHNjb3BlKSAgICBjdHgtPnBmbWxQYXJzZXJfIyNzY29wZSMjVG9wCisjZGVmaW5lCVNDT1BFX1NJWkUoc2NvcGUpCQljdHgtPnBmbWxQYXJzZXJfIyNzY29wZSMjU3RhY2tfbGltaXQKKyNkZWZpbmUgU0NPUEVfSU5TVEFOQ0Uoc2NvcGUsIGkpCShjdHgtPlNDT1BFX1NUQUNLKHNjb3BlKS0+Z2V0KGN0eC0+U0NPUEVfU1RBQ0soc2NvcGUpLGkpKQorCisvKiBNYWNyb3MgZm9yIGFjY2Vzc2luZyB0aGluZ3MgaW4gdGhlIHBhcnNlcgorICovCisKKyN1bmRlZgkgICAgUEFSU0VSCisjdW5kZWYJICAgIFJFQ09HTklaRVIKKyN1bmRlZgkgICAgSEFWRVBBUlNFRFJVTEUKKyN1bmRlZgkJTUVNT0laRQorI3VuZGVmCSAgICBJTlBVVAorI3VuZGVmCSAgICBTVFJTVFJFQU0KKyN1bmRlZgkgICAgSEFTRVhDRVBUSU9OCisjdW5kZWYJICAgIEVYQ0VQVElPTgorI3VuZGVmCSAgICBNQVRDSFQKKyN1bmRlZgkgICAgTUFUQ0hBTllUCisjdW5kZWYJICAgIEZPTExPV1NUQUNLCisjdW5kZWYJICAgIEZPTExPV1BVU0gKKyN1bmRlZgkgICAgRk9MTE9XUE9QCisjdW5kZWYJICAgIFBSRUNPVkVSCisjdW5kZWYJICAgIFBSRVBPUlRFUlJPUgorI3VuZGVmCSAgICBMQQorI3VuZGVmCSAgICBMVAorI3VuZGVmCSAgICBDT05TVFJVQ1RFWAorI3VuZGVmCSAgICBDT05TVU1FCisjdW5kZWYJICAgIE1BUksKKyN1bmRlZgkgICAgUkVXSU5ECisjdW5kZWYJICAgIFJFV0lORExBU1QKKyN1bmRlZgkgICAgUEVSUk9SUkVDT1ZFUlkKKyN1bmRlZgkgICAgSEFTRkFJTEVECisjdW5kZWYJICAgIEZBSUxFREZMQUcKKyN1bmRlZgkgICAgUkVDT1ZFUkZST01NSVNNQVRDSEVEU0VUCisjdW5kZWYJICAgIFJFQ09WRVJGUk9NTUlTTUFUQ0hFREVMRU1FTlQKKyN1bmRlZgkJSU5ERVgKKyN1bmRlZiAgICAgIEFEQVBUT1IKKyN1bmRlZgkJU0VFSworI3VuZGVmCSAgICBSVUxFTUVNTworI3VuZGVmCQlEQkcKKworI2RlZmluZQkgICAgUEFSU0VSCQkJCWN0eC0+cFBhcnNlcgorI2RlZmluZQkgICAgUkVDT0dOSVpFUgkJCQlQQVJTRVItPnJlYworI2RlZmluZQkgICAgUFNSU1RBVEUJCQkJUkVDT0dOSVpFUi0+c3RhdGUKKyNkZWZpbmUJICAgIEhBVkVQQVJTRURSVUxFKHIpCQkJUkVDT0dOSVpFUi0+YWxyZWFkeVBhcnNlZFJ1bGUoUkVDT0dOSVpFUiwgcikKKyNkZWZpbmUJICAgIE1FTU9JWkUocmksc2kpCQkJUkVDT0dOSVpFUi0+bWVtb2l6ZShSRUNPR05JWkVSLCByaSwgc2kpCisjZGVmaW5lCSAgICBJTlBVVAkJCQlQQVJTRVItPnRzdHJlYW0KKyNkZWZpbmUJICAgIFNUUlNUUkVBTQkJCQlJTlBVVAorI2RlZmluZQkgICAgSVNUUkVBTQkJCQlJTlBVVC0+aXN0cmVhbQorI2RlZmluZQkgICAgSU5ERVgoKQkJCQlJU1RSRUFNLT5pbmRleChJTlBVVC0+aXN0cmVhbSkKKyNkZWZpbmUJICAgIEhBU0VYQ0VQVElPTigpCQkJKFBTUlNUQVRFLT5lcnJvciA9PSBBTlRMUjNfVFJVRSkKKyNkZWZpbmUJICAgIEVYQ0VQVElPTgkJCQlQU1JTVEFURS0+ZXhjZXB0aW9uCisjZGVmaW5lCSAgICBNQVRDSFQodCwgZnMpCQkJUkVDT0dOSVpFUi0+bWF0Y2goUkVDT0dOSVpFUiwgdCwgZnMpCisjZGVmaW5lCSAgICBNQVRDSEFOWVQoKQkJCQlSRUNPR05JWkVSLT5tYXRjaEFueShSRUNPR05JWkVSKQorI2RlZmluZQkgICAgRk9MTE9XU1RBQ0sJCQkJUFNSU1RBVEUtPmZvbGxvd2luZworI2lmZGVmICBTS0lQX0ZPTExPV19TRVRTCisjZGVmaW5lCSAgICBGT0xMT1dQVVNIKHgpCisjZGVmaW5lCSAgICBGT0xMT1dQT1AoKQorI2Vsc2UKKyNkZWZpbmUJICAgIEZPTExPV1BVU0goeCkJCQlGT0xMT1dTVEFDSy0+cHVzaChGT0xMT1dTVEFDSywgKCh2b2lkICopKCYoeCkpKSwgTlVMTCkKKyNkZWZpbmUJICAgIEZPTExPV1BPUCgpCQkJCUZPTExPV1NUQUNLLT5wb3AoRk9MTE9XU1RBQ0spCisjZW5kaWYKKyNkZWZpbmUJICAgIFBSRUNPVkVSKCkJCQkJUkVDT0dOSVpFUi0+cmVjb3ZlcihSRUNPR05JWkVSKQorI2RlZmluZQkgICAgUFJFUE9SVEVSUk9SKCkJCQlSRUNPR05JWkVSLT5yZXBvcnRFcnJvcihSRUNPR05JWkVSKQorI2RlZmluZQkgICAgTEEobikJCQkJSU5QVVQtPmlzdHJlYW0tPl9MQShJU1RSRUFNLCBuKQorI2RlZmluZQkgICAgTFQobikJCQkJSU5QVVQtPl9MVChJTlBVVCwgbikKKyNkZWZpbmUJICAgIENPTlNUUlVDVEVYKCkJCQlSRUNPR05JWkVSLT5leENvbnN0cnVjdChSRUNPR05JWkVSKQorI2RlZmluZQkgICAgQ09OU1VNRSgpCQkJCUlTVFJFQU0tPmNvbnN1bWUoSVNUUkVBTSkKKyNkZWZpbmUJICAgIE1BUksoKQkJCQlJU1RSRUFNLT5tYXJrKElTVFJFQU0pCisjZGVmaW5lCSAgICBSRVdJTkQobSkJCQkJSVNUUkVBTS0+cmV3aW5kKElTVFJFQU0sIG0pCisjZGVmaW5lCSAgICBSRVdJTkRMQVNUKCkJCQlJU1RSRUFNLT5yZXdpbmRMYXN0KElTVFJFQU0pCisjZGVmaW5lCSAgICBTRUVLKG4pCQkJCUlTVFJFQU0tPnNlZWsoSVNUUkVBTSwgbikKKyNkZWZpbmUJICAgIFBFUlJPUlJFQ09WRVJZCQkJUFNSU1RBVEUtPmVycm9yUmVjb3ZlcnkKKyNkZWZpbmUJICAgIEZBSUxFREZMQUcJCQkJUFNSU1RBVEUtPmZhaWxlZAorI2RlZmluZQkgICAgSEFTRkFJTEVEKCkJCQkJKEZBSUxFREZMQUcgPT0gQU5UTFIzX1RSVUUpCisjZGVmaW5lCSAgICBCQUNLVFJBQ0tJTkcJCQlQU1JTVEFURS0+YmFja3RyYWNraW5nCisjZGVmaW5lCSAgICBSRUNPVkVSRlJPTU1JU01BVENIRURTRVQocykJCVJFQ09HTklaRVItPnJlY292ZXJGcm9tTWlzbWF0Y2hlZFNldChSRUNPR05JWkVSLCBzKQorI2RlZmluZQkgICAgUkVDT1ZFUkZST01NSVNNQVRDSEVERUxFTUVOVChlKQlSRUNPR05JWkVSLT5yZWNvdmVyRnJvbU1pc21hdGNoZWRFbGVtZW50KFJFQ09HTklaRVIsIHMpCisjZGVmaW5lICAgICBBREFQVE9SICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+YWRhcHRvcgorI2RlZmluZQkJUlVMRU1FTU8JCQkJCQlQU1JTVEFURS0+cnVsZU1lbW8KKyNkZWZpbmUJCURCRwkJCQkJCQkJUkVDT0dOSVpFUi0+ZGVidWdnZXIKKworCisjZGVmaW5lCQlUT0tURVhUKHRvaywgdHh0KQkJCQl0b2ssIChwQU5UTFIzX1VJTlQ4KXR4dAorCisvKiBUaGUgNCB0b2tlbnMgZGVmaW5lZCBiZWxvdyBtYXkgd2VsbCBjbGFzaCB3aXRoIHlvdXIgb3duICNkZWZpbmVzIG9yIHRva2VuIHR5cGVzLiBJZiBzbworICogdGhlbiBmb3IgdGhlIHByZXNlbnQgeW91IG11c3QgdXNlIGRpZmZlcmVudCBuYW1lcyBmb3IgeW91ciBkZWZpbmVzIGFzIHRoZXNlIGFyZSBoYXJkIGNvZGVkCisgKiBpbiB0aGUgY29kZSBnZW5lcmF0b3IuIEl0IHdvdWxkIGJlIGJldHRlciBub3QgdG8gdXNlIHN1Y2ggbmFtZXMgaW50ZXJuYWxseSwgYW5kIG1heWJlCisgKiB3ZSBjYW4gY2hhbmdlIHRoaXMgaW4gYSBmb3J0aGNvbWluZyByZWxlYXNlLiBJIGRlbGliZXJhdGVseSBkbyBub3QgI3VuZGVmIHRoZXNlCisgKiBoZXJlIGFzIHRoaXMgd2lsbCBhdCBsZWFzdCBnaXZlIHlvdSBhIHJlZGVmaW5lZCBlcnJvciBzb21ld2hlcmUgaWYgdGhleSBjbGFzaC4KKyAqLworI2RlZmluZQkgICAgVVAJICAgIEFOVExSM19UT0tFTl9VUAorI2RlZmluZQkgICAgRE9XTiAgICBBTlRMUjNfVE9LRU5fRE9XTgorI2RlZmluZQkgICAgRU9SCSAgICBBTlRMUjNfVE9LRU5fRU9SCisjZGVmaW5lCSAgICBJTlZBTElEIEFOVExSM19UT0tFTl9JTlZBTElECisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZ1bmN0aW9ucyB0byBjcmVhdGUgYW5kIGRlc3Ryb3kgc2NvcGVzLiBGaXJzdCBjb21lIHRoZSBydWxlIHNjb3BlcywgZm9sbG93ZWQKKyAqIGJ5IHRoZSBnbG9iYWwgZGVjbGFyZWQgc2NvcGVzLgorICovCisKKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU3RhcnQgb2YgcmVjb2duaXplcgorICovCisKKworLyoqIFxicmllZiBUYWJsZSBvZiBhbGwgdG9rZW4gbmFtZXMgaW4gc3ltYm9saWMgb3JkZXIsIG1haW5seSB1c2VkIGZvcgorICogICAgICAgICBlcnJvciByZXBvcnRpbmcuCisgKi8KK3BBTlRMUjNfVUlOVDggICBmbWxQYXJzZXJUb2tlbk5hbWVzWzQxNCs0XQorICAgICA9IHsKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICI8aW52YWxpZD4iLCAgICAgICAvKiBTdHJpbmcgdG8gcHJpbnQgdG8gaW5kaWNhdGUgYW4gaW52YWxpZCB0b2tlbiAqLworICAgICAgICAocEFOVExSM19VSU5UOCkgIjxFT1I+IiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICI8RE9XTj4iLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIjxVUD4iLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIkFTU0lHTiIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiQVNTSUdOX0FGVEVSIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJBU1NJR05fTUFDUk8iLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIkFTU0lHTl9SRUYiLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIkFUX0lEIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJCQU5EIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJCQU5EX0FTU0lHTiIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiQkFORF9BU1NJR05fQUZURVIiLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIkJBUl9SQlJBQ0tFVCIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiQk5PVCIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiQk9SIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJCT1JfQVNTSUdOIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJCT1JfQVNTSUdOX0FGVEVSIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJCWE9SIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJCWE9SX0FTU0lHTiIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiQlhPUl9BU1NJR05fQUZURVIiLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIkJpbmFyeSIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiQ09MT04iLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIkNPTE9OeDIiLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIkNPTU1BIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJDT01NRU5UIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJDaGFyTGl0ZXJhbCIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiREVDUiIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiRElFU0UiLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIkRJViIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiRElWX0FTU0lHTiIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiRElWX0FTU0lHTl9BRlRFUiIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiRE9MTEFSIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJET0xMQVJfTENVUkxZIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJET1QiLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIkRPVERPVCIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiRGVjaW1hbCIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiRGVjaW1hbERpZ2l0IiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJEZWNpbWFsRGlnaXRzIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJEZWNpbWFsRXhwb25lbnQiLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIkVRVUFMIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJFU0NfU0VRIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJFWFBPTkVOVCIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiRmxvYXQiLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIkZsb2F0TGl0ZXJhbCIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiRmxvYXRUeXBlU3VmZml4IiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJHVCIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiR1RFIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJIRVhfRElHSVQiLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIkhleERpZ2l0IiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJIZXhhZGVjaW1hbCIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiSUQiLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIklOQ1IiLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIkltYWdpbmFyeVN1ZmZpeCIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiSW50U3VmZml4IiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJJbnRlZ2VyIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJJbnRlZ2VyTGl0ZXJhbCIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiTEFORCIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiTEFORF9BU1NJR04iLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIkxBTkRfQVNTSUdOX0FGVEVSIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJMQU5EX1RIRU4iLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIkxCUkFDS0VUIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJMQlJBQ0tFVF9CQVIiLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIkxCUkFDS0VUX0VYQ0VQVCIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiTEJSQUNLRVRfTENVUkxZIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJMQ1VSTFkiLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIkxDVVJMWV9JTlZPS0UiLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIkxOT1QiLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIkxPUiIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiTE9SX0FTU0lHTiIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiTE9SX0FTU0lHTl9BRlRFUiIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiTE9SX0VMU0UiLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIkxQQVJFTiIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiTFBBUkVOX0lOVk9LRSIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiTFNISUZUIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJMU0hJRlRfQVNTSUdOIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJMU0hJRlRfQVNTSUdOX0FGVEVSIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJMVEUiLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIkxUXyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiTFhPUiIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiTUlOVVMiLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIk1JTlVTX0FTU0lHTiIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiTUlOVVNfQVNTSUdOX0FGVEVSIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJNT0QiLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIk1PRF9BU1NJR04iLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIk1PRF9BU1NJR05fQUZURVIiLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIk5FUVVBTCIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiTlNFUVVBTCIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiTnVtYmVyTGl0ZXJhbCIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiT0NUQUxfRVNDIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJPUF9BU1NJR05fVE9QIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJPUF9BVE9NSUNfU0VRVUVOQ0UiLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIk9QX0NPTkNVUlJFTkNZX0FORCIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiT1BfQ09OQ1VSUkVOQ1lfQVNZTkMiLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIk9QX0NPTkNVUlJFTkNZX0lOVEVSTEVBVklORyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiT1BfQ09OQ1VSUkVOQ1lfT1IiLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIk9QX0NPTkNVUlJFTkNZX1BBUkFMTEVMIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJPUF9DT05DVVJSRU5DWV9SRFZfQU5EIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJPUF9DT05DVVJSRU5DWV9SRFZfQVNZTkMiLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIk9QX0NPTkNVUlJFTkNZX1JEVl9JTlRFUkxFQVZJTkciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIk9QX0NPTkNVUlJFTkNZX1JEVl9PUiIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiT1BfQ09OQ1VSUkVOQ1lfUkRWX1BBUkFMTEVMIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJPUF9GT1JLIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJPUF9KT0lOIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJPUF9OT05fREVURVJNSU5JU00iLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIk9QX1BPUCIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiT1BfUFVTSCIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiT1BfU0NIRURVTEVfQU5EX1RIRU4iLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIk9QX1NDSEVEVUxFX0dUIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJPUF9TQ0hFRFVMRV9MVCIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiT1BfU0NIRURVTEVfT1JfRUxTRSIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiT1BfU0NIRURVTEVfWE9SIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJPUF9TRVFVRU5DRSIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiT1BfU0VRVUVOQ0VfU0lERSIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiT1BfU0VRVUVOQ0VfV0VBSyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiT1BfVE9QIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJPY3RhbCIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiT2N0YWxEaWdpdCIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiUEVSQ0VOVF9MQ1VSTFkiLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIlBFUkNFTlRfTFBBUkVOIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJQRVJDRU5UX0xQQVJFTl9JTlZPS0UiLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIlBMVVMiLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIlBMVVNfQVNTSUdOIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJQTFVTX0FTU0lHTl9BRlRFUiIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiUVVFU1RJT04iLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIlJCUkFDS0VUIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJSQ1VSTFkiLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIlJDVVJMWV9ET0xMQVIiLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIlJDVVJMWV9QRVJDRU5UIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJSQ1VSTFlfUkJSQUNLRVQiLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIlJQQVJFTiIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiUlBBUkVOX1BFUkNFTlQiLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIlJTSElGVCIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiUlNISUZUX0FTU0lHTiIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiUlNISUZUX0FTU0lHTl9BRlRFUiIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiUmF0aW9uYWxMaXRlcmFsIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJTRU1JIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJTRVFVQUwiLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIlNUQVIiLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIlNUQVJfQVNTSUdOIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJTVEFSX0FTU0lHTl9BRlRFUiIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiU1RBVEVNRU5UX1BST01QVCIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiU3RyaW5nTGl0ZXJhbCIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiVU5JQ09ERV9FU0MiLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIldTIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInI2RoaXN0b3J5JyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJyNmaW5hbCciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIicjaW5pdCciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIicjaW5pdGlhbCciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIicjcmV0dXJuJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJyNzaGlzdG9yeSciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIicjc3RhcnQnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInI3N0ZiciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIicjc3RzJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJyN0ZXJtaW5hbCciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIickOmNvbW1lbnQnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInJDpkZWJ1ZyciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIickOmluZm9ybWFsJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJyQ6dHJhY2UnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInJGVudiciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIickcGFyZW50JyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJyRzZWxmJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJyRzdXBlciciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIickdGhpcyciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIictLT4nIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInLT4nIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInPC0tJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJzwtPiciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIic8PT0nIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInPT0+JyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ0AnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInQGFib3J0JyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ0BiZWhhdmlvcjonIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInQGNvbTonIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInQGNvbXBvc2l0ZSciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidAY29tcG9zaXRlOiciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidAY29uY3VycmVuY3knIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInQGNvbnN0cmFpbnQnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInQGNyZWF0ZSciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidAZGVjbGFyYXRpb246JyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ0BkaXNhYmxlJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ0BkaXZlcnNpdHknIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInQGVmZmVjdDonIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInQGVuYWJsZSciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidAZXhlY3V0YWJsZTonIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInQGZpbmFsJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ0BmbWwnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInQGZvcm1hbG1sJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ0BndWFyZDonIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInQGhlYWRlcjonIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInQGlhYm9ydCciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidAaWRpc2FibGUnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInQGllbmFibGUnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInQGltcG9ydDonIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInQGluY2x1ZGUnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInQGluaXQnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInQGlub3V0OiciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidAaW5wdXQ6JyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ0BpbnN0YW5jZTonIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInQGludGVyYWN0aW9uOiciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidAaXJ1biciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidAbWFjaGluZTonIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInQG1hY3JvOiciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidAbW9jOiciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidAbW9kZWw6JyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ0Btb2U6JyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ0Bvbl93cml0ZSciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidAb3B0aW9ucyciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidAb3V0cHV0OiciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidAcGFja2FnZSciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidAcGFyYW06JyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ0BwYXJhbWV0ZXI6JyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ0Bwcml2YXRlOiciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidAcHJvY2VkdXJlOiciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidAcHJvcGVydHk6JyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ0Bwcm90ZWN0ZWQ6JyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ0Bwcm90b3R5cGU6JyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ0BwdWJsaWM6JyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ0ByZWdpb246JyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ0ByZXR1cm4nIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInQHJldHVybjonIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInQHJldHVybnM6JyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ0Byb3V0aW5lJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ0Byb3V0aW5lOiciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidAcnRjJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ0BydW4nIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInQHNjaGVkdWxlJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ0BzdGFydCciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidAc3RhdGVtYWNoaW5lOiciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidAc3RvcCciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidAc3lzdGVtJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ0B0Z3VhcmQ6JyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ0B0cmFuc2l0aW9uOiciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidAdHJpZ2dlcjonIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInQHhmbWwnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInQHhmc3AnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInQHhsaWEnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInYWJvcnQnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInYWJzZW50JyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ2FjdGl2aXR5OiciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidhbmQnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInYW55Y2FzdCciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidhcnJheSciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidhdm1jb2RlJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ2JpbmQnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInYmluZDonIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInYm9vbCciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidib29sZWFuJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ2JyZWFrJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ2Jyb2FkY2FzdCciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIididWZmZXInIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInY2FsbCciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidjaGFuZ2VkI3RvJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ2NoYW5nZWQnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInY2hhbm5lbCciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidjaGFyJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ2NoYXJhY3RlciciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidjaGVja3NhdCciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidjaG9pY2UnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInY2xhc3MnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInY2xvY2snIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInY29ubmVjdCciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidjb25uZWN0b3InIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInY29uc3QnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInY29udGludWUnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInY3RpbWUnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInY3RvciciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidjdHg6JyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ2Rlc3Ryb3knIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInZGlzYWJsZSciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidkbyciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidkb3VibGUnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInZHRpbWUnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInZHluYW1pYyciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidlbHNlJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ2Vsc2VpZiciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidlbmFibGUnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInZW51bSciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidlbnYnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInZXZlbnQnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInZXhpdCciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidmYWxzZSciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidmaWZvJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ2ZpbmFsJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ2Zsb2F0JyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ2Zsb3cnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInZm9yJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ2ZvcmsnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInZnJvbTonIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInZnVuJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ2dvdG8nIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInZ3VhcmQnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInaWFib3J0JyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ2lkaXNhYmxlJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ2llbmFibGUnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInaWYnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInaW4nIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInaW5pdCciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidpbml0OiciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidpbm91dCciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidpbnB1dCNidWZmZXInIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInaW5wdXQjZW52JyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ2lucHV0I2Zsb3cnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInaW5wdXQjcmR2JyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ2lucHV0I3NhdmUnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInaW5wdXQjdmFyJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ2lucHV0JyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ2lucHV0X2VuYWJsZWQnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInaW5zdGFuY2UnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInaW5zdGFuY2U6JyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ2ludCciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidpbnRlZ2VyJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ2ludGVydmFsJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ2pvaW4nIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInbGFtYmRhJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ2xpZmVsaW5lJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ2xpZm8nIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInbGlzdCciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidtYWNoaW5lJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ21hY3JvJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ21heDonIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInbWVzc2FnZSciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidtb2M6JyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ21vZGVsJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ21vZGVsOiciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidtdWx0aWNhc3QnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInbXVsdGlmaWZvJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ211bHRpbGlmbyciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidtdWx0aXBsaWNpdHk6JyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ211bHRpcmR2JyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ211bHRpc2V0JyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ25ldyciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidudWxsJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ251bGw8JyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ29wZXJhdG9yJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ29yJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ291dCciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidvdXRwdXQjYnVmZmVyJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ291dHB1dCNlbnYnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInb3V0cHV0I2Zsb3cnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInb3V0cHV0I3JkdiciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidvdXRwdXQjdmFyJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ291dHB1dCciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidwYWNrYWdlJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ3BhcmVudCciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidwb3J0JyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ3Bvc19pbnQnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICIncG9zX2ludGVnZXInIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICIncHJlc2VudCciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidwcmlvcjonIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICIncHJpdmF0ZSciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidwcm9iYTonIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICIncHJvY2VkdXJlJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ3Byb3RlY3RlZCciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidwcm90b3R5cGUnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICIncHJvdmlkZWQ6JyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ3B1YmxpYyciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidyYW0nIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICIncmF0JyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ3JhdGlvbmFsJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ3JkdiciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidyZWFsJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ3JlZiciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidyZXN0YXJ0JyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ3Jlc3VtZSciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidyZXR1cm4nIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICIncmV0dXJuczonIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICIncm91dGUnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICIncm91dGluZSciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidydGMnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICIncnVuJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ3J2ZWN0b3InIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInc2NoZWR1bGUnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInc2VsZiciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidzZXQnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInc2lnbmFsJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ3NpemU6JyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ3NvbHZlcjonIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInc3RhcnQnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInc3RhdGUnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInc3RhdGVtYWNoaW5lJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ3N0YXRpYyciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidzdGF0dXMjYmVpbmcnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInc3RhdHVzI2lzJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ3N0YXR1cyN3YXMnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInc3RhdHVzI3dpbGwnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInc3RlcF9tYXJrJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ3N0b3AnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICInc3RyaW5nJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ3N0cnVjdCciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIidzdXNwZW5kJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ3N5c3RlbSciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIid0Z3VhcmQnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICIndGltZSciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIid0aW1lZCciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIid0bzonIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICIndHJhbnNpZW50JyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ3RyYW5zaXRpb24nIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICIndHJ1ZSciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIid0eXBlJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ3Vkb3VibGUnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICIndWZsb2F0JyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ3VpbnQnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICIndWludGVnZXInIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICIndW5pY2FzdCciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIid1bmlvbiciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIid1bml2ZXJzYWwnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICIndW5zYWZlJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ3VyYXQnIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICIndXJhdGlvbmFsJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ3VyZWFsJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ3ZhbCciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIid2YXInIiwKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICIndmVjdG9yJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ3ZpYSciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIid2b2xhdGlsZSciLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIid3YWl0JyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ3doaWxlJyIsCisgICAgICAgIChwQU5UTFIzX1VJTlQ4KSAiJ3w9PiciCisgICAgICAgfTsKKworCisKKy8vIEZvcndhcmQgZGVjbGFyZSB0aGUgbG9jYWxseSBzdGF0aWMgbWF0Y2hpbmcgZnVuY3Rpb25zIHdlIGhhdmUgZ2VuZXJhdGVkLgorLy8KK3N0YXRpYyAKKyBzZXA6OlN5c3RlbSAqCisJZm9ybWFsTUwgICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6OldPYmplY3RNYW5hZ2VyICYgYVdPYmplY3RNYW5hZ2VyKTsKK3N0YXRpYyAKKyB2b2lkCisJcHJvbG9ndWVfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgdm9pZAorCXByb2xvZ3VlX2F0dHJpYnV0ZSAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIHZvaWQKKwlwcm9sb2d1ZV9vcHRpb25zICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgc2VwOjpNb2RpZmllcgorCW1vZGlmaWVyX2RlY2xhcmF0aW9uICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgc2VwOjpNb2RpZmllcgorCW1vZGlmaWVyX2RpcmVjdGlvbiAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIHNlcDo6TW9kaWZpZXIKKwltb2RpZmllcl9kaXJlY3Rpb25fdGV4dCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIHZvaWQKKwltb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0ICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpNb2RpZmllciAmIG1kZnIpOworc3RhdGljIAorIHNlcDo6TW9kaWZpZXIKKwltb2RpZmllcl9kaXJlY3Rpb25fc3ltYm9sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgc2VwOjpNb2RpZmllcgorCW1vZGlmaWVyX3BhcmFtICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgZm1sUGFyc2VyX3Byb2NlZHVyZV9tb2RpZmllcl9zcGVjaWZpZXJfcmV0dXJuCisJcHJvY2VkdXJlX21vZGlmaWVyX3NwZWNpZmllciAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIGZtbFBhcnNlcl9leGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllcl9yZXR1cm4KKwlleGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllciAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIGZtbFBhcnNlcl9pbnN0YW5jZV9tb2RpZmllcl9zcGVjaWZpZXJfcmV0dXJuCisJaW5zdGFuY2VfbW9kaWZpZXJfc3BlY2lmaWVyICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgZm1sUGFyc2VyX21vZGlmaWVyX3RyYW5zaXRpb25fcmV0dXJuCisJbW9kaWZpZXJfdHJhbnNpdGlvbiAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIHNlcDo6UGFja2FnZSAqCisJZGVmX3BhY2thZ2UgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBzZXA6OlN5c3RlbSAqCisJZGVmX3N5c3RlbSAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIGZtbFBhcnNlcl9xdWFsaWZpZWROYW1lSURfcmV0dXJuCisJcXVhbGlmaWVkTmFtZUlEICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgc2VwOjphdm1fc2l6ZV90CisJaW50ZWdlcl9jb25zdGFudCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIHNlcDo6YXZtX2Zsb2F0X3QKKwlmbG9hdF9jb25zdGFudCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIHZvaWQKKwlzZWN0aW9uX2hlYWRlciAgICAocGZtbFBhcnNlciBjdHgsIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lcik7CitzdGF0aWMgCisgdm9pZAorCXNlY3Rpb25faW1wb3J0ICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpNYWNoaW5lICogY29udGFpbmVyKTsKK3N0YXRpYyAKKyB2b2lkCisJaW5jbHVkZV9wYWNrYWdlICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgdm9pZAorCXNlY3Rpb25fcHJvY2VkdXJlICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpNYWNoaW5lICogY29udGFpbmVyKTsKK3N0YXRpYyAKKyBzZXA6Ok1hY2hpbmUgKgorCWRlZl9wcm9jZWR1cmUgICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIpOworc3RhdGljIAorIHZvaWQKKwlkZWZfbWFjaGluZV9wYXJhbWV0ZXJzICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpNYWNoaW5lICogbWFjaGluZSk7CitzdGF0aWMgCisgdm9pZAorCWRlZl9tYWNoaW5lX3ZhcmlhYmxlX3BhcmFtZXRlcl9hdG9tICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpQcm9wZXJ0eVBhcnQgJiBwYXJhbURlY2wsIHNlcDo6TW9kaWZpZXIgbWRmciwgc2VwOjphdm1fb2Zmc2V0X3Qgb2Zmc2V0KTsKK3N0YXRpYyAKKyB2b2lkCisJZGVmX21hY2hpbmVfcmV0dXJucyAgICAocGZtbFBhcnNlciBjdHgsIHNlcDo6TWFjaGluZSAqIG1hY2hpbmUsIHNlcDo6TW9kaWZpZXIgbWRmcik7CitzdGF0aWMgCisgdm9pZAorCWRlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpQcm9wZXJ0eVBhcnQgJiBwYXJhbURlY2wsIHNlcDo6TW9kaWZpZXIgbWRmciwgc2VwOjphdm1fb2Zmc2V0X3Qgb2Zmc2V0KTsKK3N0YXRpYyAKKyB2b2lkCisJZGVmX2JvZHlfcHJvY2VkdXJlICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpNYWNoaW5lICogcHJvY2VkdXJlKTsKK3N0YXRpYyAKKyB2b2lkCisJZGVmX2JvZHlfcHJvY2VkdXJlX3NlY3Rpb24gICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBwcm9jZWR1cmUpOworc3RhdGljIAorIHZvaWQKKwlkZWZfYm9keV9wcm9jZWR1cmVfc2ltcGxpZiAgICAocGZtbFBhcnNlciBjdHgsIHNlcDo6TWFjaGluZSAqIHByb2NlZHVyZSk7CitzdGF0aWMgCisgdm9pZAorCXNlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZSAgICAocGZtbFBhcnNlciBjdHgsIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lcik7CitzdGF0aWMgCisgdm9pZAorCXNlY3Rpb25fY29tcG9zaXRlX2dlbmVyaWMgICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIpOworc3RhdGljIAorIHZvaWQKKwlzZWN0aW9uX21hY2hpbmVfbW9kZWwgICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIpOworc3RhdGljIAorIHZvaWQKKwlzZWN0aW9uX21hY2hpbmVfcHJvdG90eXBlICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpNYWNoaW5lICogY29udGFpbmVyKTsKK3N0YXRpYyAKKyB2b2lkCisJc2VjdGlvbl9tYWNoaW5lX2luc3RhbmNlICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpNYWNoaW5lICogY29udGFpbmVyKTsKK3N0YXRpYyAKKyBzZXA6Ok1hY2hpbmUgKgorCWV4ZWN1dGFibGVfbWFjaGluZSAgICAocGZtbFBhcnNlciBjdHgsIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lcik7CitzdGF0aWMgCisgc2VwOjpNYWNoaW5lICoKKwlleGVjdXRhYmxlX21vZGVsX2RlZmluaXRvbiAgICAocGZtbFBhcnNlciBjdHgsIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lciwgc2VwOjpNb2RpZmllciBtZGZyLCBzZXA6OlNwZWNpZmllciBzcGNmcik7CitzdGF0aWMgCisgc2VwOjpNYWNoaW5lICoKKwlleGVjdXRhYmxlX2luc3RhbmNlX2RlZmluaXRvbiAgICAocGZtbFBhcnNlciBjdHgsIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lcik7CitzdGF0aWMgCisgc2VwOjpNYWNoaW5lICoKKwlkZWNsX2luc3RhbmNlICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpNYWNoaW5lICogY29udGFpbmVyLCBzZXA6Ok1vZGlmaWVyIG1kZnIsIHNlcDo6U3BlY2lmaWVyIHNwY2ZyKTsKK3N0YXRpYyAKKyB2b2lkCisJZGVmX2luc3RhbmNlX29uX25ld19hY3Rpdml0eSAgICAocGZtbFBhcnNlciBjdHgsIHNlcDo6TWFjaGluZSAqIGluc3RhbmNlKTsKK3N0YXRpYyAKKyB2b2lkCisJZGVmX2luc3RhbmNlX29uX25ld19hY3Rpdml0eV9wYXJhbWV0ZXIgICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBpbnN0YW5jZSwgc2VwOjphdm1fc2l6ZV90IHBvc2l0aW9uKTsKK3N0YXRpYyAKKyBzZXA6Ok9wZXJhdG9yICoKKwlvcF9hc3NpZ25fcGFyYW0gICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyB2b2lkCisJZGVmX2luc3RhbmNlX2FjdGl2aXR5ICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpNYWNoaW5lICogaW5zdGFuY2UpOworc3RhdGljIAorIHZvaWQKKwlzZWN0aW9uX2JlaGF2aW9yICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpNYWNoaW5lICogY29udGFpbmVyKTsKK3N0YXRpYyAKKyB2b2lkCisJZGVmX2luc3RhbmNlX2NvdW50ICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjphdm1fc2l6ZV90ICYgaW5pdGlhbCwgc2VwOjphdm1fc2l6ZV90ICYgbWF4aW1hbCk7CitzdGF0aWMgCisgdm9pZAorCWRlZl9pbnN0YW5jZV9jb3VudF9hdG9tICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjphdm1fc2l6ZV90ICYgaW5pdGlhbCwgc2VwOjphdm1fc2l6ZV90ICYgbWF4aW1hbCk7CitzdGF0aWMgCisgc2VwOjpNYWNoaW5lICoKKwlkZWZfbWFjaGluZSAgICAocGZtbFBhcnNlciBjdHgsIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lciwgc2VwOjpNb2RpZmllciBtZGZyLCBzZXA6OlNwZWNpZmllciBzcGNmcik7CitzdGF0aWMgCisgdm9pZAorCWRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9oZWFkZXJfcHJlZGljYXQgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyB2b2lkCisJZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX2ltcG9ydF9wcmVkaWNhdCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIHZvaWQKKwlkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcGFyYW1ldGVyX3ByZWRpY2F0ICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgdm9pZAorCWRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcm9wZXJ0eV9wcmVkaWNhdCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIHZvaWQKKwlkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJlZGljYXQgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyB2b2lkCisJZGVmX2JvZHlfbWFjaGluZSAgICAocGZtbFBhcnNlciBjdHgsIHNlcDo6TWFjaGluZSAqIG1hY2hpbmUpOworc3RhdGljIAorIHZvaWQKKwlkZWZfYm9keV9tYWNoaW5lX3NlY3Rpb24gICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBtYWNoaW5lKTsKK3N0YXRpYyAKKyB2b2lkCisJZGVmX2JvZHlfbWFjaGluZV9zaW1wbGlmICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpNYWNoaW5lICogbWFjaGluZSk7CitzdGF0aWMgCisgc2VwOjpNYWNoaW5lICoKKwlhbnlfZGVmX3N0YXRlbWFjaGluZSAgICAocGZtbFBhcnNlciBjdHgsIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lciwgc2VwOjpNb2RpZmllciBtZGZyLCBzZXA6OlNwZWNpZmllciBzcGNmcik7CitzdGF0aWMgCisgc2VwOjpNYWNoaW5lICoKKwlkZWZfc3RhdGVtYWNoaW5lICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpNYWNoaW5lICogY29udGFpbmVyLCBzZXA6Ok1vZGlmaWVyIG1kZnIsIHNlcDo6U3BlY2lmaWVyIHNwY2ZyKTsKK3N0YXRpYyAKKyB2b2lkCisJZGVmX2JvZHlfc3RhdGVtYWNoaW5lICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpNYWNoaW5lICogbWFjaGluZSk7CitzdGF0aWMgCisgdm9pZAorCXNlY3Rpb25fcmVnaW9uICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpNYWNoaW5lICogY29udGFpbmVyKTsKK3N0YXRpYyAKKyB2b2lkCisJc2VjdGlvbl9zdGF0ZW1hY2hpbmUgICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIpOworc3RhdGljIAorIHNlcDo6TWFjaGluZSAqCisJZGVmX3N0YXRlICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpNYWNoaW5lICogY29udGFpbmVyLCBzZXA6Ok1vZGlmaWVyIG1kZnIsIHNlcDo6U3BlY2lmaWVyIHNwY2ZyKTsKK3N0YXRpYyAKKyBzdGQ6OnN0cmluZworCXN0YXRlX2t3X2lkICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgc3RkOjpzdHJpbmcKKwlzdGF0ZV9pZCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIHNlcDo6TWFjaGluZSAqCisJZGVmX3N0YXRlX3NpbmdsZXRvbiAgICAocGZtbFBhcnNlciBjdHgsIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lciwgc2VwOjpNb2RpZmllciBtZGZyLCBzZXA6OlNwZWNpZmllciBzcGNmcik7CitzdGF0aWMgCisgdm9pZAorCWV4ZWN1dGFibGVfc3BlY2lmaWVyICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpTcGVjaWZpZXIgJiBzcGNmcik7CitzdGF0aWMgCisgdm9pZAorCWV4ZWN1dGFibGVfc3BlY2lmaWVyX2F0b20gICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6OlNwZWNpZmllciAmIHNwY2ZyKTsKK3N0YXRpYyAKKyBzZXA6OkJGCisJaW5zdGFuY2VfbWFjaGluZV9tb2RlbCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIHZvaWQKKwlkZWZfYm9keV9zdGF0ZSAgICAocGZtbFBhcnNlciBjdHgsIHNlcDo6TWFjaGluZSAqIHN0YXRlKTsKK3N0YXRpYyAKKyB2b2lkCisJZGVmX2JvZHlfc3RhdGVfc2VjdGlvbiAgICAocGZtbFBhcnNlciBjdHgsIHNlcDo6TWFjaGluZSAqIG1hY2hpbmUpOworc3RhdGljIAorIHZvaWQKKwlkZWZfYm9keV9zdGF0ZV9zaW1wbGlmICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpNYWNoaW5lICogc3RhdGUpOworc3RhdGljIAorIHZvaWQKKwlzZWN0aW9uX3RyYW5zaXRpb24gICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBzdGF0ZSk7CitzdGF0aWMgCisgdm9pZAorCWRlZl90cmFuc2l0aW9uICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpNYWNoaW5lICogc3RhdGUsIHNlcDo6TW9kaWZpZXIgbWRmciwgc2VwOjpTcGVjaWZpZXIgc3BjZnIpOworc3RhdGljIAorIHNlcDo6VHJhbnNpdGlvbjo6TU9DX0tJTkQKKwlraW5kX3RyYW5zaXRpb24gICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBzZXA6OlRyYW5zaXRpb246Om1vY19raW5kX3QKKwltb2NfdHJhbnNpdGlvbl9hdHRyaWJ1dGUgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyB2b2lkCisJbW9jX3RyYW5zaXRpb24gICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6OlRyYW5zaXRpb24gKiB0cmFucyk7CitzdGF0aWMgCisgdm9pZAorCW1vY190cmFuc2l0aW9uX2F0b20gICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6OlRyYW5zaXRpb24gKiB0cmFucyk7CitzdGF0aWMgCisgdm9pZAorCW1vZV90cmFuc2l0aW9uICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpUcmFuc2l0aW9uICogdHJhbnMpOworc3RhdGljIAorIHNlcDo6QkZDb2RlCisJdHJhbnNpdGlvbl9zdGF0ZW1lbnQgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyB2b2lkCisJdHJhbnNpdGlvbl90cmlnZ2VyICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpCRkNvZGUgJiBhYyk7CitzdGF0aWMgCisgdm9pZAorCXRyYW5zaXRpb25fZ3VhcmQgICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6OkJGQ29kZSAmIGFjKTsKK3N0YXRpYyAKKyB2b2lkCisJdHJhbnNpdGlvbl90aW1lZF9ndWFyZCAgICAocGZtbFBhcnNlciBjdHgsIHNlcDo6QkZDb2RlICYgYWMpOworc3RhdGljIAorIHZvaWQKKwl0cmFuc2l0aW9uX2VmZmVjdCAgICAocGZtbFBhcnNlciBjdHgsIHNlcDo6QkZDb2RlICYgYWMpOworc3RhdGljIAorIHNlcDo6QkYKKwl0YXJnZXRfc3RhdGVfaWQgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBzdGQ6OnN0cmluZworCXRhcmdldF9zdGF0ZV9rd19pZCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIHZvaWQKKwlkZWZfc3RhdGVfYWN0aXZpdHkgICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBzdGF0ZSk7CitzdGF0aWMgCisgdm9pZAorCXNlY3Rpb25faGVhZGVyX2ltcG9ydF9wYXJhbWV0ZXJfcHJvcGVydHkgICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIpOworc3RhdGljIAorIHZvaWQKKwlzZWN0aW9uX3BhcmFtZXRlciAgICAocGZtbFBhcnNlciBjdHgsIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lcik7CitzdGF0aWMgCisgdm9pZAorCXNlY3Rpb25fcHJvcGVydHkgICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIpOworc3RhdGljIAorIHZvaWQKKwlzZWN0aW9uX3Byb3BlcnR5X2ZyZWVfZGVjbGFyYXRpb24gICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIpOworc3RhdGljIAorIHZvaWQKKwlwcm9wZXJ0eV9kZWNsYXJhdGlvbiAgICAocGZtbFBhcnNlciBjdHgsIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5LCBzZXA6Ok1vZGlmaWVyIG1kZnIpOworc3RhdGljIAorIHZvaWQKKwlkZWNsX3Byb3BlcnR5X2VsZW1lbnQgICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSwgc2VwOjpNb2RpZmllciBtZGZyKTsKK3N0YXRpYyAKKyBmbWxQYXJzZXJfbGFiZWxsZWRfYXJndW1lbnRfcmV0dXJuCisJbGFiZWxsZWRfYXJndW1lbnQgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyB2b2lkCisJZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3BhcmFtcyAgICAocGZtbFBhcnNlciBjdHgsIHNlcDo6TWFjaGluZSAqIG1hY2hpbmUpOworc3RhdGljIAorIHZvaWQKKwlkZWNsX2luc3RhbmNlX21hY2hpbmVfcmV0dXJucyAgICAocGZtbFBhcnNlciBjdHgsIHNlcDo6TWFjaGluZSAqIG1hY2hpbmUpOworc3RhdGljIAorIHZvaWQKKwlhY3Rpdml0eV9tYWNoaW5lX3BhcmFtX3JldHVybiAgICAocGZtbFBhcnNlciBjdHgsIGNvbnN0IHNlcDo6QkYgJiBhcmdNYWNoaW5lLCBzZXA6OkJGQ29kZSAmIGFjKTsKK3N0YXRpYyAKKyB2b2lkCisJZGVjbF9wb3J0ICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHksIHNlcDo6TW9kaWZpZXIgbWRmcik7CitzdGF0aWMgCisgdm9pZAorCWRlY2xfcG9ydF9pbXBsICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHksIHNlcDo6TW9kaWZpZXIgbWRmciwgc2VwOjpJQ29tUG9pbnQ6OkVOVU1fSU9fTkFUVVJFIG5hdHVyZSk7CitzdGF0aWMgCisgdm9pZAorCWRlY2xfc2lnbmFsICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHksIHNlcDo6TW9kaWZpZXIgbWRmcik7CitzdGF0aWMgCisgdm9pZAorCWRlY2xfc2lnbmFsX2ltcGwgICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSwgc2VwOjpNb2RpZmllciBtZGZyLCBzZXA6OklDb21Qb2ludDo6RU5VTV9JT19OQVRVUkUgbmF0dXJlKTsKK3N0YXRpYyAKKyB2b2lkCisJdHlwZV9wYXJhbV9jb20gICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6OlBvcnQgKiBwb3J0KTsKK3N0YXRpYyAKKyB2b2lkCisJcGFyYW1fY29tX2F0b20gICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6OlBvcnQgKiBwb3J0LCBzZXA6OmF2bV9vZmZzZXRfdCBvZmZzZXQpOworc3RhdGljIAorIHZvaWQKKwlkZWNsX2J1ZmZlciAgICAocGZtbFBhcnNlciBjdHgsIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5LCBzZXA6Ok1vZGlmaWVyIG1kZnIpOworc3RhdGljIAorIHZvaWQKKwlkZWNsX2J1ZmZlcl9pbXBsICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHksIHNlcDo6TW9kaWZpZXIgbWRmcik7CitzdGF0aWMgCisgZm1sUGFyc2VyX2RlZl9idWZmZXJfcmV0dXJuCisJZGVmX2J1ZmZlciAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIHNlcDo6YXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdAorCXBvbGljeV9idWZmZXIgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBzZXA6OkJGCisJcmVmX2J1ZmZlciAgICAocGZtbFBhcnNlciBjdHgsIHNlcDo6TWFjaGluZSAqIG1hY2hpbmUpOworc3RhdGljIAorIHZvaWQKKwlpbml0aWFsX2J1ZmZlcl9jb250ZW50cyAgICAocGZtbFBhcnNlciBjdHgsIGNvbnN0IHNlcDo6QnVmZmVyICogYnVmZmVyKTsKK3N0YXRpYyAKKyB2b2lkCisJZGVjbF9jaGFubmVsICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHksIHNlcDo6TW9kaWZpZXIgbWRmcik7CitzdGF0aWMgCisgdm9pZAorCWRlY2xfY2hhbm5lbF9wb3J0ICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHksIHNlcDo6TW9kaWZpZXIgbWRmcik7CitzdGF0aWMgCisgdm9pZAorCWRlY2xfY2hhbm5lbF92YXIgICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSwgc2VwOjpNb2RpZmllciBtZGZyKTsKK3N0YXRpYyAKKyB2b2lkCisJZGVjbF92YXJpYWJsZSAgICAocGZtbFBhcnNlciBjdHgsIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5LCBzZXA6Ok1vZGlmaWVyIG1kZnIpOworc3RhdGljIAorIHZvaWQKKwlkZWNsX3ZhcmlhYmxlX3RpbWVfY2xvY2tfaW1wbCAgICAocGZtbFBhcnNlciBjdHgsIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5LCBzZXA6Ok1vZGlmaWVyIG1kZnIpOworc3RhdGljIAorIHZvaWQKKwlkZWNsX3ZhcmlhYmxlX2ltcGwgICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSwgc2VwOjpNb2RpZmllciBtZGZyKTsKK3N0YXRpYyAKKyB2b2lkCisJZGVjbF92YXJpYWJsZV9hdG9tX2ltcGwgICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSwgc2VwOjpNb2RpZmllciBtZGZyKTsKK3N0YXRpYyAKKyB2b2lkCisJZGVjbF90eXBlZF92YXJpYWJsZV9hdG9tX2ltcGwgICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSwgc2VwOjpNb2RpZmllciBtZGZyLCBjb25zdCBzZXA6OkJGICYgdHlwZSk7CitzdGF0aWMgCisgc2VwOjpCRgorCWluaXRpYWxfdmFsdWUgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBzZXA6OkJGCisJdHlwZV92YXIgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBzZXA6OkJGCisJZGVmX3R5cGVfYXJyYXkgICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6OkJGIGJhc2VULCBjb25zdCBzdGQ6OnN0cmluZyAmIHRpZCk7CitzdGF0aWMgCisgaW50CisJZGVmX3R5cGVfYXJyYXlfc2l6ZSAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIHNlcDo6QkYKKwlkZWZfdHlwZV9jb250YWluZXIgICAgKHBmbWxQYXJzZXIgY3R4LCBjb25zdCBzdGQ6OnN0cmluZyAmIHRpZCk7CitzdGF0aWMgCisgc2VwOjphdm1fdHlwZV9zcGVjaWZpZXJfa2luZF90CisJc3BlY2lmaWVyX2J1ZmZlciAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIHNlcDo6QkYKKwlkZWZfdHlwZV9pbnRlcnZhbCAgICAocGZtbFBhcnNlciBjdHgsIGNvbnN0IHN0ZDo6c3RyaW5nICYgdGlkKTsKK3N0YXRpYyAKKyBzZXA6OkJGCisJYmFzZV90eXBlX3ZhciAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIHNlcDo6VHlwZVNwZWNpZmllcgorCXByaW1pdGl2ZV90eXBlICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgaW50CisJYml0X2ZpZWxkX3NpemUgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBmbWxQYXJzZXJfc3RyaW5nX2ZpZWxkX3NpemVfcmV0dXJuCisJc3RyaW5nX2ZpZWxkX3NpemUgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBmbWxQYXJzZXJfcmFuZ2VfY29uc3RhbnRfcmV0dXJuCisJcmFuZ2VfY29uc3RhbnQgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyB2b2lkCisJb25fd3JpdGVfdmFyX3JvdXRpbmVfZGVmICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpWYXJpYWJsZSAqIHZhcik7CitzdGF0aWMgCisgdm9pZAorCXZhcl9yb3V0aW5lX2RlZiAgICAocGZtbFBhcnNlciBjdHgsIHNlcDo6VmFyaWFibGUgKiB2YXIpOworc3RhdGljIAorIHZvaWQKKwlyb3V0aW5lX3NpbmdsZV9wYXJhbSAgICAocGZtbFBhcnNlciBjdHgsIHNlcDo6Um91dGluZSAmIHJvdXRpbmUsIGNvbnN0IHNlcDo6QkYgJiBkZnRUeXBlKTsKK3N0YXRpYyAKKyB2b2lkCisJZGVmX2VudW0gICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSwgc2VwOjpNb2RpZmllciBtZGZyKTsKK3N0YXRpYyAKKyB2b2lkCisJZGVmX2VudW1faW1wbCAgICAocGZtbFBhcnNlciBjdHgsIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5LCBzZXA6Ok1vZGlmaWVyIG1kZnIsIGNvbnN0IHN0ZDo6c3RyaW5nICYgdGlkKTsKK3N0YXRpYyAKKyB2b2lkCisJZGVmX3N0cnVjdCAgICAocGZtbFBhcnNlciBjdHgsIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5LCBzZXA6Ok1vZGlmaWVyIG1kZnIpOworc3RhdGljIAorIHZvaWQKKwlkZWZfY2xhc3Nfc3RydWN0dXJlX2ltcGwgICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSwgc2VwOjpNb2RpZmllciBtZGZyLCBjb25zdCBzdGQ6OnN0cmluZyAmIHRpZCk7CitzdGF0aWMgCisgdm9pZAorCWRlZl9jaG9pY2UgICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSwgc2VwOjpNb2RpZmllciBtZGZyKTsKK3N0YXRpYyAKKyB2b2lkCisJZGVmX2Nob2ljZV9pbXBsICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHksIHNlcDo6TW9kaWZpZXIgbWRmciwgY29uc3Qgc3RkOjpzdHJpbmcgJiB0aWQpOworc3RhdGljIAorIHZvaWQKKwlkZWZfdW5pb24gICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSwgc2VwOjpNb2RpZmllciBtZGZyKTsKK3N0YXRpYyAKKyB2b2lkCisJZGVmX3VuaW9uX2ltcGwgICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSwgc2VwOjpNb2RpZmllciBtZGZyLCBjb25zdCBzdGQ6OnN0cmluZyAmIHRpZCk7CitzdGF0aWMgCisgdm9pZAorCWRlZl9tZXRob2QgICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSk7CitzdGF0aWMgCisgdm9pZAorCWRlY2xfcGFyYW1ldGVycyAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIHZvaWQKKwlkZWZfdHlwZSAgICAocGZtbFBhcnNlciBjdHgsIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5LCBzZXA6Ok1vZGlmaWVyIG1kZnIpOworc3RhdGljIAorIHZvaWQKKwlkZWZfdHlwZV9pbXBsICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHksIHNlcDo6TW9kaWZpZXIgbWRmcik7CitzdGF0aWMgCisgdm9pZAorCWRlZl90eXBlX2F0b21faW1wbCAgICAocGZtbFBhcnNlciBjdHgsIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5LCBzZXA6Ok1vZGlmaWVyIG1kZnIpOworc3RhdGljIAorIHZvaWQKKwlkZWZfdHlwZWRlZl9jb25zdHJhaW50ICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpEYXRhVHlwZSAqIGFsaWFzVCk7CitzdGF0aWMgCisgc2VwOjpUeXBlU3BlY2lmaWVyCisJdGltZV90eXBlICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgc2VwOjpUeXBlU3BlY2lmaWVyCisJdGltZV9jbG9ja190eXBlICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgc2VwOjpUeXBlU3BlY2lmaWVyCisJdGltZV90eXBlX2RvbWFpbiAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIHZvaWQKKwlzZWN0aW9uX21vZGVsX29mX2NvbXB1dGF0aW9uICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpNYWNoaW5lICogY29udGFpbmVyKTsKK3N0YXRpYyAKKyB2b2lkCisJc2VjdGlvbl9yb3V0aW5lICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpNYWNoaW5lICogY29udGFpbmVyKTsKK3N0YXRpYyAKKyB2b2lkCisJZGVmX3JvdXRpbmVfbW9kZWwgICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIsIHNlcDo6TW9kaWZpZXIgbWRmciwgc2VwOjpTcGVjaWZpZXIgc3BjZnIpOworc3RhdGljIAorIHZvaWQKKwlkZWZfcm91dGluZV9tb2RlbF9pbXBsICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpNYWNoaW5lICogY29udGFpbmVyLCBzZXA6Ok1vZGlmaWVyIG1kZnIsIHNlcDo6U3BlY2lmaWVyIHNwY2ZyKTsKK3N0YXRpYyAKKyB2b2lkCisJZGVmX3JvdXRpbmVfcGFyYW1ldGVycyAgICAocGZtbFBhcnNlciBjdHgsIHNlcDo6Um91dGluZSAmIHJvdXRpbmUpOworc3RhdGljIAorIHZvaWQKKwlkZWZfcm91dGluZV9wYXJhbV9hdG9tICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpSb3V0aW5lICYgcm91dGluZSwgc2VwOjphdm1fc2l6ZV90IG9mZnNldCk7CitzdGF0aWMgCisgdm9pZAorCWRlZl9yb3V0aW5lX3JldHVybnMgICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6OlJvdXRpbmUgJiByb3V0aW5lKTsKK3N0YXRpYyAKKyB2b2lkCisJZGVmX3JvdXRpbmVfcmV0dXJuc19hdG9tICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpSb3V0aW5lICYgcm91dGluZSwgc2VwOjphdm1fc2l6ZV90IG9mZnNldCk7CitzdGF0aWMgCisgdm9pZAorCXNlY3Rpb25fbW9kZWxfb2ZfZXhlY3V0aW9uICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpNYWNoaW5lICogY29udGFpbmVyKTsKK3N0YXRpYyAKKyB2b2lkCisJZGVmX21vZV9wcmltaXRpdmUgICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIpOworc3RhdGljIAorIHZvaWQKKwlkZWZfcm91dGluZV9zZXEgICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6OlJvdXRpbmUgJiByb3V0aW5lKTsKK3N0YXRpYyAKKyB2b2lkCisJc2VjdGlvbl9tb2RlbF9vZl9pbnRlcmFjdGlvbiAgICAocGZtbFBhcnNlciBjdHgsIHNlcDo6TWFjaGluZSAqIG1hY2hpbmUpOworc3RhdGljIAorIHZvaWQKKwljb21fcHJvdG9jb2wgICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBtYWNoaW5lLCBzZXA6OkNvbVByb3RvY29sICogY3ApOworc3RhdGljIAorIHZvaWQKKwljb21fY2FzdCAgICAocGZtbFBhcnNlciBjdHgsIHNlcDo6Q29tUHJvdG9jb2wgKiBjcCk7CitzdGF0aWMgCisgc2VwOjpCRgorCWJ1ZmZlcl9jb20gICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBtYWNoaW5lKTsKK3N0YXRpYyAKKyB2b2lkCisJY29tX2Nvbm5lY3QgICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBtYWNoaW5lLCBzZXA6OkludGVyYWN0aW9uUGFydCAqIGFuSW50ZXJhY3Rpb24pOworc3RhdGljIAorIHZvaWQKKwljb21fcm91dGUgICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBtYWNoaW5lLCBzZXA6OkNvbm5lY3RvciAqIGFDb25uZWN0b3IpOworc3RhdGljIAorIHZvaWQKKwljb21fcG9ydCAgICAocGZtbFBhcnNlciBjdHgsIHNlcDo6TWFjaGluZSAqIG1hY2hpbmUsIHNlcDo6Q29tUm91dGUgKiBjb21Sb3V0ZSk7CitzdGF0aWMgCisgc2VwOjpCRgorCWNvbV9wb3J0X2lkICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpNYWNoaW5lICogbWFjaGluZSwgc2VwOjpNYWNoaW5lICogY29tTWFjaGluZSk7CitzdGF0aWMgCisgc2VwOjpCRkNvZGUKKwlzdGF0ZW1lbnQgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBzZXA6OkJGQ29kZQorCWJsb2NrX3N0YXRlbWVudCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIHNlcDo6T3BlcmF0b3IgKgorCW9wX2Jsb2NrICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgc2VwOjpPcGVyYXRvciAqCisJb3Bfc2VxdWVuY2UgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBzZXA6Ok9wZXJhdG9yICoKKwlvcF9zY2hlZHVsaW5nICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgc2VwOjpPcGVyYXRvciAqCisJb3BfY29uY3VycmVuY3kgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBzZXA6Ok9wZXJhdG9yICoKKwlvcF9pbnZva2FibGUgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBzZXA6OkJGQ29kZQorCXByZWZpeF9zdGF0ZW1lbnQgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBzZXA6OkJGQ29kZQorCXByZWZpeF9leHByZXNzaW9uICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgc2VwOjpPcGVyYXRvciAqCisJYXZtX29wZXJhdG9yICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgc2VwOjpCRkNvZGUKKwlzdGF0ZW1lbnRfaW52b2tlX21ldGhvZCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIHNlcDo6QkZDb2RlCisJc3RhdGVtZW50X2ludm9rZSAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIHNlcDo6QkZDb2RlCisJZXhwcmVzc2lvbl9pbnZva2UgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBzZXA6OkJGQ29kZQorCXN0YXRlbWVudF9hY3Rpdml0eV9uZXcgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyB2b2lkCisJZGVjbF9pbnN0YW5jZV9keW5hbWljX2ltcGwgICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIsIHNlcDo6TWFjaGluZSAqIHB0ckluc3RhbmNlKTsKK3N0YXRpYyAKKyBzZXA6OkJGQ29kZQorCWV4cHJlc3Npb25fYWN0aXZpdHlfbmV3ICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgc2VwOjpCRkNvZGUKKwlzdGF0ZW1lbnRfcHJvbXB0ICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgc2VwOjpCRkNvZGUKKwlzdGF0ZW1lbnRfcHJvbXB0X2ltcGwgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBzZXA6OkJGQ29kZQorCXN0YXRlbWVudF9wcm9tcHRfb2JzICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgc2VwOjpCRkNvZGUKKwlzdGF0ZW1lbnRfcHJvbXB0X29ic19jb20gICAgKHBmbWxQYXJzZXIgY3R4LCBjb25zdCBzZXA6OkJGICYgdmFyTWFjaGluZSk7CitzdGF0aWMgCisgc2VwOjpCRkNvZGUKKwltZXRhX3N0YXRlbWVudCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIHNlcDo6QkZDb2RlCisJc3RhdGVtZW50X2Fzc2lnbiAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIHNlcDo6QkYKKwlsdmFsdWUgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyB2b2lkCisJcGFyYW1ldGVycyAgICAocGZtbFBhcnNlciBjdHgsIGNvbnN0IHNlcDo6QkZDb2RlICYgYWMpOworc3RhdGljIAorIHNlcDo6QkZDb2RlCisJc3RhdGVtZW50X2NvbSAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIHNlcDo6QkZDb2RlCisJc3RhdGVtZW50X2NvbV9pbnB1dCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIHNlcDo6QkZDb2RlCisJc3RhdGVtZW50X2NvbV9vdXRwdXQgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyB2b2lkCisJcGFyYW1ldGVyc19wb3J0ICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpQb3J0ICogcG9ydCwgY29uc3Qgc2VwOjpCRkNvZGUgJiBhYyk7CitzdGF0aWMgCisgc2VwOjpCRkNvZGUKKwlleHByZXNzaW9uX2NvbSAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIHNlcDo6QkZDb2RlCisJc3RhdGVtZW50X2NvbnN0cmFpbnQgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBzZXA6OkJGQ29kZQorCXN0YXRlbWVudF9ndWFyZCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIHNlcDo6QkZDb2RlCisJc3RhdGVtZW50X3RpbWVkX2d1YXJkICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgc2VwOjpCRkNvZGUKKwlzdGF0ZW1lbnRfY2hlY2tzYXQgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBzZXA6OkJGQ29kZQorCWV4cHJlc3Npb25fZ3VhcmQgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBzZXA6OkJGQ29kZQorCXN0YXRlbWVudF9pdGUgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBzZXA6OkJGQ29kZQorCWV4cHJlc3Npb25faXRlICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgc2VwOjpCRkNvZGUKKwlzdGF0ZW1lbnRfaXRlcmF0aW9uICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgc2VwOjpCRkNvZGUKKwlmb3JfYXNzaWduX2hlYWRlciAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIHNlcDo6QkZDb2RlCisJc3RhdGVtZW50X2p1bXAgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBzZXA6OkJGQ29kZQorCWV4cHJlc3Npb25fbGFtYmRhICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgc2VwOjpCRkNvZGUKKwlleHByZXNzaW9uX3N0YXR1cyAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIHNlcDo6T3BlcmF0b3IgKgorCW9wX2FjdGl2aXR5ICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgc2VwOjpCRkNvZGUKKwlzdGF0ZW1lbnRfYWN0aXZpdHkgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBzZXA6OkJGQ29kZQorCXN0YXRlbWVudF9pbml0X2Zsb3cgICAgKHBmbWxQYXJzZXIgY3R4LCBjb25zdCBzZXA6OkJGICYgZmxvd1RhcmdldCk7CitzdGF0aWMgCisgc2VwOjpCRkNvZGUKKwlzdGF0ZW1lbnRfaW52b2tlX3JvdXRpbmUgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyB2b2lkCisJaW52b2tlX3JvdXRpbmVfcGFyYW1zICAgIChwZm1sUGFyc2VyIGN0eCwgc2VwOjpSb3V0aW5lICogaW52b2tlUm91dGluZSk7CitzdGF0aWMgCisgdm9pZAorCWludm9rZV9yb3V0aW5lX3JldHVybnMgICAgKHBmbWxQYXJzZXIgY3R4LCBzZXA6OlJvdXRpbmUgKiBpbnZva2VSb3V0aW5lKTsKK3N0YXRpYyAKKyBzZXA6OkJGQ29kZQorCXN0YXRlbWVudF9tb2MgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBzZXA6OkJGCisJZXhwcmVzc2lvbiAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIHNlcDo6QkYKKwljb25kaXRpb25hbEV4cHJlc3Npb24gICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBzZXA6OkJGCisJc2NoZWR1bGVFeHByZXNzaW9uICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgc2VwOjpCRgorCWNvbmRpdGlvbmFsT3JFeHByZXNzaW9uICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgc2VwOjpCRgorCWNvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbiAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIHNlcDo6QkYKKwliaXR3aXNlT3JFeHByZXNzaW9uICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgc2VwOjpCRgorCWJpdHdpc2VYb3JFeHByZXNzaW9uICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgc2VwOjpCRgorCWJpdHdpc2VBbmRFeHByZXNzaW9uICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgc2VwOjpCRgorCWVxdWFsaXR5RXhwcmVzc2lvbiAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIHNlcDo6T3BlcmF0b3IgKgorCWVxdWFsT3AgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBzZXA6OkJGCisJcmVsYXRpb25hbEV4cHJlc3Npb24gICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBzZXA6Ok9wZXJhdG9yICoKKwlyZWxhdGlvbmFsT3AgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBzZXA6OkJGCisJc2hpZnRFeHByZXNzaW9uICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgc2VwOjpPcGVyYXRvciAqCisJc2hpZnRPcCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIHNlcDo6QkYKKwlhZGRpdGl2ZUV4cHJlc3Npb24gICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBzZXA6OkJGCisJbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgc2VwOjpCRgorCXVuYXJ5RXhwcmVzc2lvbiAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIHNlcDo6QkZDb2RlCisJY3RvckV4cHJlc3Npb24gICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBzZXA6OkJGQ29kZQorCXF1b3RlX2V4cHJlc3Npb24gICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBzZXA6OkJGQ29kZQorCW1ldGFfZXZhbF9leHByZXNzaW9uICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgc2VwOjpCRgorCXByaW1hcnkgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBzZXA6OkJGCisJcHJpbWFyeV91ZmlkICAgIChwZm1sUGFyc2VyIGN0eCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBtYWluSWQpOworc3RhdGljIAorIHNlcDo6QkYKKwlwcmltYXJ5X3VmaSAgICAocGZtbFBhcnNlciBjdHgsIGNvbnN0IHN0ZDo6c3RyaW5nICYgbG9jYXRvcklkKTsKK3N0YXRpYyAKKyBzZXA6OkJGCisJcHJpbWFyeV9pbnZva2UgICAgKHBmbWxQYXJzZXIgY3R4LCBjb25zdCBzdGQ6OnN0cmluZyAmIG1haW5JZCk7CitzdGF0aWMgCisgc2VwOjpCRgorCWxpdGVyYWwgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBzZXA6OkJGCisJY29sbGVjdGlvbl9vZl9leHByZXNzaW9uICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkMjFfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkNTZfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkNTdfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkNThfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkNTlfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkNjBfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkNjFfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkNjJfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkOTVfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkMTE1X2ZtbCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIEFOVExSM19CT09MRUFOCisJc3lucHJlZDEyNl9mbWwgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBBTlRMUjNfQk9PTEVBTgorCXN5bnByZWQxMjdfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkMTM4X2ZtbCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIEFOVExSM19CT09MRUFOCisJc3lucHJlZDE1M19mbWwgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBBTlRMUjNfQk9PTEVBTgorCXN5bnByZWQxNzBfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkMjk2X2ZtbCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIEFOVExSM19CT09MRUFOCisJc3lucHJlZDMwNF9mbWwgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBBTlRMUjNfQk9PTEVBTgorCXN5bnByZWQzMjRfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkMzI2X2ZtbCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIEFOVExSM19CT09MRUFOCisJc3lucHJlZDMyOV9mbWwgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBBTlRMUjNfQk9PTEVBTgorCXN5bnByZWQzNDBfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkMzQxX2ZtbCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIEFOVExSM19CT09MRUFOCisJc3lucHJlZDM0M19mbWwgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBBTlRMUjNfQk9PTEVBTgorCXN5bnByZWQzNDRfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkMzY2X2ZtbCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIEFOVExSM19CT09MRUFOCisJc3lucHJlZDM3MF9mbWwgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBBTlRMUjNfQk9PTEVBTgorCXN5bnByZWQzNzNfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkMzc1X2ZtbCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIEFOVExSM19CT09MRUFOCisJc3lucHJlZDQwN19mbWwgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBBTlRMUjNfQk9PTEVBTgorCXN5bnByZWQ0MTJfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkNDE3X2ZtbCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIEFOVExSM19CT09MRUFOCisJc3lucHJlZDQxOV9mbWwgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBBTlRMUjNfQk9PTEVBTgorCXN5bnByZWQ0MjZfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkNDMxX2ZtbCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIEFOVExSM19CT09MRUFOCisJc3lucHJlZDQzOF9mbWwgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBBTlRMUjNfQk9PTEVBTgorCXN5bnByZWQ0NDZfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkNDkzX2ZtbCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIEFOVExSM19CT09MRUFOCisJc3lucHJlZDUxNF9mbWwgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBBTlRMUjNfQk9PTEVBTgorCXN5bnByZWQ1MTdfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkNTIwX2ZtbCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIEFOVExSM19CT09MRUFOCisJc3lucHJlZDUzMV9mbWwgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBBTlRMUjNfQk9PTEVBTgorCXN5bnByZWQ1MzVfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkNTM3X2ZtbCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIEFOVExSM19CT09MRUFOCisJc3lucHJlZDUzOV9mbWwgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBBTlRMUjNfQk9PTEVBTgorCXN5bnByZWQ1NTVfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkNTU5X2ZtbCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIEFOVExSM19CT09MRUFOCisJc3lucHJlZDU3NF9mbWwgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBBTlRMUjNfQk9PTEVBTgorCXN5bnByZWQ2MDlfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkNjM2X2ZtbCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIEFOVExSM19CT09MRUFOCisJc3lucHJlZDY0M19mbWwgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBBTlRMUjNfQk9PTEVBTgorCXN5bnByZWQ3MDVfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkNzA5X2ZtbCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIEFOVExSM19CT09MRUFOCisJc3lucHJlZDcxNF9mbWwgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBBTlRMUjNfQk9PTEVBTgorCXN5bnByZWQ3NzhfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkNzc5X2ZtbCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIEFOVExSM19CT09MRUFOCisJc3lucHJlZDc4MF9mbWwgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBBTlRMUjNfQk9PTEVBTgorCXN5bnByZWQ3ODFfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkODAyX2ZtbCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIEFOVExSM19CT09MRUFOCisJc3lucHJlZDgwNF9mbWwgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBBTlRMUjNfQk9PTEVBTgorCXN5bnByZWQ4NjFfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkODcyX2ZtbCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIEFOVExSM19CT09MRUFOCisJc3lucHJlZDg5MV9mbWwgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBBTlRMUjNfQk9PTEVBTgorCXN5bnByZWQ4OTRfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkODk2X2ZtbCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIEFOVExSM19CT09MRUFOCisJc3lucHJlZDg5N19mbWwgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBBTlRMUjNfQk9PTEVBTgorCXN5bnByZWQ4OThfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkOTQ2X2ZtbCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIEFOVExSM19CT09MRUFOCisJc3lucHJlZDk0N19mbWwgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBBTlRMUjNfQk9PTEVBTgorCXN5bnByZWQ5NDhfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkOTQ5X2ZtbCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIEFOVExSM19CT09MRUFOCisJc3lucHJlZDk1MF9mbWwgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBBTlRMUjNfQk9PTEVBTgorCXN5bnByZWQ5NTFfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkOTUyX2ZtbCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIEFOVExSM19CT09MRUFOCisJc3lucHJlZDk1M19mbWwgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBBTlRMUjNfQk9PTEVBTgorCXN5bnByZWQ5NTRfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkOTU1X2ZtbCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIEFOVExSM19CT09MRUFOCisJc3lucHJlZDk1Nl9mbWwgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBBTlRMUjNfQk9PTEVBTgorCXN5bnByZWQ5NTdfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkOTU4X2ZtbCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIEFOVExSM19CT09MRUFOCisJc3lucHJlZDk1OV9mbWwgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBBTlRMUjNfQk9PTEVBTgorCXN5bnByZWQ5NjBfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkOTYxX2ZtbCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIEFOVExSM19CT09MRUFOCisJc3lucHJlZDk2Ml9mbWwgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBBTlRMUjNfQk9PTEVBTgorCXN5bnByZWQ5NjNfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkOTY0X2ZtbCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIEFOVExSM19CT09MRUFOCisJc3lucHJlZDk2NV9mbWwgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBBTlRMUjNfQk9PTEVBTgorCXN5bnByZWQ5NjZfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkOTY3X2ZtbCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIEFOVExSM19CT09MRUFOCisJc3lucHJlZDk2OF9mbWwgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBBTlRMUjNfQk9PTEVBTgorCXN5bnByZWQ5NjlfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkOTcwX2ZtbCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIEFOVExSM19CT09MRUFOCisJc3lucHJlZDk3MV9mbWwgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBBTlRMUjNfQk9PTEVBTgorCXN5bnByZWQ5NzJfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkOTczX2ZtbCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIEFOVExSM19CT09MRUFOCisJc3lucHJlZDk3NF9mbWwgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBBTlRMUjNfQk9PTEVBTgorCXN5bnByZWQ5NzVfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkOTc2X2ZtbCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIEFOVExSM19CT09MRUFOCisJc3lucHJlZDk3N19mbWwgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBBTlRMUjNfQk9PTEVBTgorCXN5bnByZWQ5ODBfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkOTgxX2ZtbCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIEFOVExSM19CT09MRUFOCisJc3lucHJlZDk4Ml9mbWwgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBBTlRMUjNfQk9PTEVBTgorCXN5bnByZWQ5ODNfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkOTg0X2ZtbCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIEFOVExSM19CT09MRUFOCisJc3lucHJlZDk4NV9mbWwgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBBTlRMUjNfQk9PTEVBTgorCXN5bnByZWQ5ODZfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkOTg3X2ZtbCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIEFOVExSM19CT09MRUFOCisJc3lucHJlZDk5MV9mbWwgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBBTlRMUjNfQk9PTEVBTgorCXN5bnByZWQ5OTJfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkOTk3X2ZtbCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIEFOVExSM19CT09MRUFOCisJc3lucHJlZDEwMDBfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkMTAwM19mbWwgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBBTlRMUjNfQk9PTEVBTgorCXN5bnByZWQxMDIwX2ZtbCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIEFOVExSM19CT09MRUFOCisJc3lucHJlZDEwMjFfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkMTAyN19mbWwgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBBTlRMUjNfQk9PTEVBTgorCXN5bnByZWQxMDI5X2ZtbCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIAorIEFOVExSM19CT09MRUFOCisJc3lucHJlZDEwMzBfZm1sICAgIChwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgCisgQU5UTFIzX0JPT0xFQU4KKwlzeW5wcmVkMTAzM19mbWwgICAgKHBmbWxQYXJzZXIgY3R4KTsKK3N0YXRpYyAKKyBBTlRMUjNfQk9PTEVBTgorCXN5bnByZWQxMDM1X2ZtbCAgICAocGZtbFBhcnNlciBjdHgpOworc3RhdGljIHZvaWQJZm1sUGFyc2VyRnJlZShwZm1sUGFyc2VyIGN0eCk7CitzdGF0aWMgdm9pZCAgICAgZm1sUGFyc2VyUmVzZXQgKHBmbWxQYXJzZXIgY3R4KTsKKworLyogRm9yIHVzZSBpbiB0cmVlIG91dHB1dCB3aGVyZSB3ZSBhcmUgYWNjdW11bGF0aW5nIHJ1bGUgbGFiZWxzIHZpYSBsYWJlbCArPSBydWxlUmVmCisgKiB3ZSBuZWVkIGEgZnVuY3Rpb24gdGhhdCBrbm93cyBob3cgdG8gZnJlZSBhIHJldHVybiBzY29wZSB3aGVuIHRoZSBsaXN0IGlzIGRlc3Ryb3llZC4KKyAqIFdlIGNhbm5vdCBqdXN0IHVzZSBBTlRMUjNfRlJFRSBiZWNhdXNlIGluIGRlYnVnIHRyYWNraW5nIG1vZGUsIHRoaXMgaXMgYSBtYWNyby4KKyAqLworc3RhdGljCXZvaWQgQU5UTFIzX0NERUNMIGZyZWVTY29wZSh2b2lkICogc2NvcGUpCit7CisgICAgQU5UTFIzX0ZSRUUoc2NvcGUpOworfQorCisvKiogXGJyaWVmIE5hbWUgb2YgdGhlIGdyYW1tYXIgZmlsZSB0aGF0IGdlbmVyYXRlZCB0aGlzIGNvZGUKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgZmlsZU5hbWVbXSA9ICIvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZyI7CisKKy8qKiBcYnJpZWYgUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBncmFtbWFyIGZpbGUgdGhhdCBnZW5lcmF0ZWQgdGhpcyBjb2RlLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqIGdldEdyYW1tYXJGaWxlTmFtZSgpCit7CisJcmV0dXJuIGZpbGVOYW1lOworfQorLyoqIFxicmllZiBDcmVhdGUgYSBuZXcgZm1sUGFyc2VyIHBhcnNlciBhbmQgcmV0dXJuIGEgY29udGV4dCBmb3IgaXQuCisgKgorICogXHBhcmFtW2luXSBpbnN0cmVhbSBQb2ludGVyIHRvIGFuIGlucHV0IHN0cmVhbSBpbnRlcmZhY2UuCisgKgorICogXHJldHVybiBQb2ludGVyIHRvIG5ldyBwYXJzZXIgY29udGV4dCB1cG9uIHN1Y2Nlc3MuCisgKi8KK0FOVExSM19BUEkgcGZtbFBhcnNlcgorZm1sUGFyc2VyTmV3ICAgKHBBTlRMUjNfQ09NTU9OX1RPS0VOX1NUUkVBTSBpbnN0cmVhbSkKK3sKKwkvLyBTZWUgaWYgd2UgY2FuIGNyZWF0ZSBhIG5ldyBwYXJzZXIgd2l0aCB0aGUgc3RhbmRhcmQgY29uc3RydWN0b3IKKwkvLworCXJldHVybiBmbWxQYXJzZXJOZXdTU0QoaW5zdHJlYW0sIE5VTEwpOworfQorCisvKiogXGJyaWVmIENyZWF0ZSBhIG5ldyBmbWxQYXJzZXIgcGFyc2VyIGFuZCByZXR1cm4gYSBjb250ZXh0IGZvciBpdC4KKyAqCisgKiBccGFyYW1baW5dIGluc3RyZWFtIFBvaW50ZXIgdG8gYW4gaW5wdXQgc3RyZWFtIGludGVyZmFjZS4KKyAqCisgKiBccmV0dXJuIFBvaW50ZXIgdG8gbmV3IHBhcnNlciBjb250ZXh0IHVwb24gc3VjY2Vzcy4KKyAqLworQU5UTFIzX0FQSSBwZm1sUGFyc2VyCitmbWxQYXJzZXJOZXdTU0QgICAocEFOVExSM19DT01NT05fVE9LRU5fU1RSRUFNIGluc3RyZWFtLCBwQU5UTFIzX1JFQ09HTklaRVJfU0hBUkVEX1NUQVRFIHN0YXRlKQoreworICAgIHBmbWxQYXJzZXIgY3R4OwkgICAgLyogQ29udGV4dCBzdHJ1Y3R1cmUgd2Ugd2lsbCBidWlsZCBhbmQgcmV0dXJuICAgKi8KKworICAgIGN0eAk9IChwZm1sUGFyc2VyKSBBTlRMUjNfQ0FMTE9DKDEsIHNpemVvZihmbWxQYXJzZXIpKTsKKworICAgIGlmCShjdHggPT0gTlVMTCkKKyAgICB7CisJCS8vIEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHBhcnNlciBjb250ZXh0CisJCS8vCisgICAgICAgIHJldHVybiAgTlVMTDsKKyAgICB9CisKKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogTWVtb3J5IGZvciBiYXNpYyBzdHJ1Y3R1cmUgaXMgYWxsb2NhdGVkLCBub3cgdG8gZmlsbCBpbgorICAgICAqIHRoZSBiYXNlIEFOVExSMyBzdHJ1Y3R1cmVzLiBXZSBpbml0aWFsaXplIHRoZSBmdW5jdGlvbiBwb2ludGVycworICAgICAqIGZvciB0aGUgc3RhbmRhcmQgQU5UTFIzIHBhcnNlciBmdW5jdGlvbiBzZXQsIGJ1dCB1cG9uIHJldHVybgorICAgICAqIGZyb20gaGVyZSwgdGhlIHByb2dyYW1tZXIgbWF5IHNldCB0aGUgcG9pbnRlcnMgdG8gcHJvdmlkZSBjdXN0b20KKyAgICAgKiBpbXBsZW1lbnRhdGlvbnMgb2YgZWFjaCBmdW5jdGlvbi4KKyAgICAgKgorICAgICAqIFdlIGRvbid0IHVzZSB0aGUgbWFjcm9zIGRlZmluZWQgaW4gZm1sUGFyc2VyLmggaGVyZSwgaW4gb3JkZXIgdGhhdCB5b3UgY2FuIGdldCBhIHNlbnNlCisgICAgICogb2Ygd2hhdCBnb2VzIHdoZXJlLgorICAgICAqLworCisgICAgLyogQ3JlYXRlIGEgYmFzZSBwYXJzZXIvcmVjb2duaXplciwgdXNpbmcgdGhlIHN1cHBsaWVkIHRva2VuIHN0cmVhbQorICAgICAqLworICAgIGN0eC0+cFBhcnNlcgkgICAgPSBhbnRscjNQYXJzZXJOZXdTdHJlYW0oQU5UTFIzX1NJWkVfSElOVCwgaW5zdHJlYW0tPnRzdHJlYW0sIHN0YXRlKTsKKyAgICAvKiBJbnN0YWxsIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBvdXIgZm1sUGFyc2VyIGludGVyZmFjZQorICAgICAqLworICAgIGN0eC0+Zm9ybWFsTUwJPSBmb3JtYWxNTDsKKyAgICBjdHgtPnByb2xvZ3VlX2ZtbAk9IHByb2xvZ3VlX2ZtbDsKKyAgICBjdHgtPnByb2xvZ3VlX2F0dHJpYnV0ZQk9IHByb2xvZ3VlX2F0dHJpYnV0ZTsKKyAgICBjdHgtPnByb2xvZ3VlX29wdGlvbnMJPSBwcm9sb2d1ZV9vcHRpb25zOworICAgIGN0eC0+bW9kaWZpZXJfZGVjbGFyYXRpb24JPSBtb2RpZmllcl9kZWNsYXJhdGlvbjsKKyAgICBjdHgtPm1vZGlmaWVyX2RpcmVjdGlvbgk9IG1vZGlmaWVyX2RpcmVjdGlvbjsKKyAgICBjdHgtPm1vZGlmaWVyX2RpcmVjdGlvbl90ZXh0CT0gbW9kaWZpZXJfZGlyZWN0aW9uX3RleHQ7CisgICAgY3R4LT5tb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0CT0gbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dDsKKyAgICBjdHgtPm1vZGlmaWVyX2RpcmVjdGlvbl9zeW1ib2wJPSBtb2RpZmllcl9kaXJlY3Rpb25fc3ltYm9sOworICAgIGN0eC0+bW9kaWZpZXJfcGFyYW0JPSBtb2RpZmllcl9wYXJhbTsKKyAgICBjdHgtPnByb2NlZHVyZV9tb2RpZmllcl9zcGVjaWZpZXIJPSBwcm9jZWR1cmVfbW9kaWZpZXJfc3BlY2lmaWVyOworICAgIGN0eC0+ZXhlY3V0YWJsZV9tb2RpZmllcl9zcGVjaWZpZXIJPSBleGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllcjsKKyAgICBjdHgtPmluc3RhbmNlX21vZGlmaWVyX3NwZWNpZmllcgk9IGluc3RhbmNlX21vZGlmaWVyX3NwZWNpZmllcjsKKyAgICBjdHgtPm1vZGlmaWVyX3RyYW5zaXRpb24JPSBtb2RpZmllcl90cmFuc2l0aW9uOworICAgIGN0eC0+ZGVmX3BhY2thZ2UJPSBkZWZfcGFja2FnZTsKKyAgICBjdHgtPmRlZl9zeXN0ZW0JPSBkZWZfc3lzdGVtOworICAgIGN0eC0+cXVhbGlmaWVkTmFtZUlECT0gcXVhbGlmaWVkTmFtZUlEOworICAgIGN0eC0+aW50ZWdlcl9jb25zdGFudAk9IGludGVnZXJfY29uc3RhbnQ7CisgICAgY3R4LT5mbG9hdF9jb25zdGFudAk9IGZsb2F0X2NvbnN0YW50OworICAgIGN0eC0+c2VjdGlvbl9oZWFkZXIJPSBzZWN0aW9uX2hlYWRlcjsKKyAgICBjdHgtPnNlY3Rpb25faW1wb3J0CT0gc2VjdGlvbl9pbXBvcnQ7CisgICAgY3R4LT5pbmNsdWRlX3BhY2thZ2UJPSBpbmNsdWRlX3BhY2thZ2U7CisgICAgY3R4LT5zZWN0aW9uX3Byb2NlZHVyZQk9IHNlY3Rpb25fcHJvY2VkdXJlOworICAgIGN0eC0+ZGVmX3Byb2NlZHVyZQk9IGRlZl9wcm9jZWR1cmU7CisgICAgY3R4LT5kZWZfbWFjaGluZV9wYXJhbWV0ZXJzCT0gZGVmX21hY2hpbmVfcGFyYW1ldGVyczsKKyAgICBjdHgtPmRlZl9tYWNoaW5lX3ZhcmlhYmxlX3BhcmFtZXRlcl9hdG9tCT0gZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b207CisgICAgY3R4LT5kZWZfbWFjaGluZV9yZXR1cm5zCT0gZGVmX21hY2hpbmVfcmV0dXJuczsKKyAgICBjdHgtPmRlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tCT0gZGVmX21hY2hpbmVfdmFyaWFibGVfcmV0dXJuX2F0b207CisgICAgY3R4LT5kZWZfYm9keV9wcm9jZWR1cmUJPSBkZWZfYm9keV9wcm9jZWR1cmU7CisgICAgY3R4LT5kZWZfYm9keV9wcm9jZWR1cmVfc2VjdGlvbgk9IGRlZl9ib2R5X3Byb2NlZHVyZV9zZWN0aW9uOworICAgIGN0eC0+ZGVmX2JvZHlfcHJvY2VkdXJlX3NpbXBsaWYJPSBkZWZfYm9keV9wcm9jZWR1cmVfc2ltcGxpZjsKKyAgICBjdHgtPnNlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZQk9IHNlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZTsKKyAgICBjdHgtPnNlY3Rpb25fY29tcG9zaXRlX2dlbmVyaWMJPSBzZWN0aW9uX2NvbXBvc2l0ZV9nZW5lcmljOworICAgIGN0eC0+c2VjdGlvbl9tYWNoaW5lX21vZGVsCT0gc2VjdGlvbl9tYWNoaW5lX21vZGVsOworICAgIGN0eC0+c2VjdGlvbl9tYWNoaW5lX3Byb3RvdHlwZQk9IHNlY3Rpb25fbWFjaGluZV9wcm90b3R5cGU7CisgICAgY3R4LT5zZWN0aW9uX21hY2hpbmVfaW5zdGFuY2UJPSBzZWN0aW9uX21hY2hpbmVfaW5zdGFuY2U7CisgICAgY3R4LT5leGVjdXRhYmxlX21hY2hpbmUJPSBleGVjdXRhYmxlX21hY2hpbmU7CisgICAgY3R4LT5leGVjdXRhYmxlX21vZGVsX2RlZmluaXRvbgk9IGV4ZWN1dGFibGVfbW9kZWxfZGVmaW5pdG9uOworICAgIGN0eC0+ZXhlY3V0YWJsZV9pbnN0YW5jZV9kZWZpbml0b24JPSBleGVjdXRhYmxlX2luc3RhbmNlX2RlZmluaXRvbjsKKyAgICBjdHgtPmRlY2xfaW5zdGFuY2UJPSBkZWNsX2luc3RhbmNlOworICAgIGN0eC0+ZGVmX2luc3RhbmNlX29uX25ld19hY3Rpdml0eQk9IGRlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHk7CisgICAgY3R4LT5kZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5X3BhcmFtZXRlcgk9IGRlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlfcGFyYW1ldGVyOworICAgIGN0eC0+b3BfYXNzaWduX3BhcmFtCT0gb3BfYXNzaWduX3BhcmFtOworICAgIGN0eC0+ZGVmX2luc3RhbmNlX2FjdGl2aXR5CT0gZGVmX2luc3RhbmNlX2FjdGl2aXR5OworICAgIGN0eC0+c2VjdGlvbl9iZWhhdmlvcgk9IHNlY3Rpb25fYmVoYXZpb3I7CisgICAgY3R4LT5kZWZfaW5zdGFuY2VfY291bnQJPSBkZWZfaW5zdGFuY2VfY291bnQ7CisgICAgY3R4LT5kZWZfaW5zdGFuY2VfY291bnRfYXRvbQk9IGRlZl9pbnN0YW5jZV9jb3VudF9hdG9tOworICAgIGN0eC0+ZGVmX21hY2hpbmUJPSBkZWZfbWFjaGluZTsKKyAgICBjdHgtPmRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9oZWFkZXJfcHJlZGljYXQJPSBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25faGVhZGVyX3ByZWRpY2F0OworICAgIGN0eC0+ZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX2ltcG9ydF9wcmVkaWNhdAk9IGRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9pbXBvcnRfcHJlZGljYXQ7CisgICAgY3R4LT5kZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcGFyYW1ldGVyX3ByZWRpY2F0CT0gZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3BhcmFtZXRlcl9wcmVkaWNhdDsKKyAgICBjdHgtPmRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcm9wZXJ0eV9wcmVkaWNhdAk9IGRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcm9wZXJ0eV9wcmVkaWNhdDsKKyAgICBjdHgtPmRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdAk9IGRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdDsKKyAgICBjdHgtPmRlZl9ib2R5X21hY2hpbmUJPSBkZWZfYm9keV9tYWNoaW5lOworICAgIGN0eC0+ZGVmX2JvZHlfbWFjaGluZV9zZWN0aW9uCT0gZGVmX2JvZHlfbWFjaGluZV9zZWN0aW9uOworICAgIGN0eC0+ZGVmX2JvZHlfbWFjaGluZV9zaW1wbGlmCT0gZGVmX2JvZHlfbWFjaGluZV9zaW1wbGlmOworICAgIGN0eC0+YW55X2RlZl9zdGF0ZW1hY2hpbmUJPSBhbnlfZGVmX3N0YXRlbWFjaGluZTsKKyAgICBjdHgtPmRlZl9zdGF0ZW1hY2hpbmUJPSBkZWZfc3RhdGVtYWNoaW5lOworICAgIGN0eC0+ZGVmX2JvZHlfc3RhdGVtYWNoaW5lCT0gZGVmX2JvZHlfc3RhdGVtYWNoaW5lOworICAgIGN0eC0+c2VjdGlvbl9yZWdpb24JPSBzZWN0aW9uX3JlZ2lvbjsKKyAgICBjdHgtPnNlY3Rpb25fc3RhdGVtYWNoaW5lCT0gc2VjdGlvbl9zdGF0ZW1hY2hpbmU7CisgICAgY3R4LT5kZWZfc3RhdGUJPSBkZWZfc3RhdGU7CisgICAgY3R4LT5zdGF0ZV9rd19pZAk9IHN0YXRlX2t3X2lkOworICAgIGN0eC0+c3RhdGVfaWQJPSBzdGF0ZV9pZDsKKyAgICBjdHgtPmRlZl9zdGF0ZV9zaW5nbGV0b24JPSBkZWZfc3RhdGVfc2luZ2xldG9uOworICAgIGN0eC0+ZXhlY3V0YWJsZV9zcGVjaWZpZXIJPSBleGVjdXRhYmxlX3NwZWNpZmllcjsKKyAgICBjdHgtPmV4ZWN1dGFibGVfc3BlY2lmaWVyX2F0b20JPSBleGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tOworICAgIGN0eC0+aW5zdGFuY2VfbWFjaGluZV9tb2RlbAk9IGluc3RhbmNlX21hY2hpbmVfbW9kZWw7CisgICAgY3R4LT5kZWZfYm9keV9zdGF0ZQk9IGRlZl9ib2R5X3N0YXRlOworICAgIGN0eC0+ZGVmX2JvZHlfc3RhdGVfc2VjdGlvbgk9IGRlZl9ib2R5X3N0YXRlX3NlY3Rpb247CisgICAgY3R4LT5kZWZfYm9keV9zdGF0ZV9zaW1wbGlmCT0gZGVmX2JvZHlfc3RhdGVfc2ltcGxpZjsKKyAgICBjdHgtPnNlY3Rpb25fdHJhbnNpdGlvbgk9IHNlY3Rpb25fdHJhbnNpdGlvbjsKKyAgICBjdHgtPmRlZl90cmFuc2l0aW9uCT0gZGVmX3RyYW5zaXRpb247CisgICAgY3R4LT5raW5kX3RyYW5zaXRpb24JPSBraW5kX3RyYW5zaXRpb247CisgICAgY3R4LT5tb2NfdHJhbnNpdGlvbl9hdHRyaWJ1dGUJPSBtb2NfdHJhbnNpdGlvbl9hdHRyaWJ1dGU7CisgICAgY3R4LT5tb2NfdHJhbnNpdGlvbgk9IG1vY190cmFuc2l0aW9uOworICAgIGN0eC0+bW9jX3RyYW5zaXRpb25fYXRvbQk9IG1vY190cmFuc2l0aW9uX2F0b207CisgICAgY3R4LT5tb2VfdHJhbnNpdGlvbgk9IG1vZV90cmFuc2l0aW9uOworICAgIGN0eC0+dHJhbnNpdGlvbl9zdGF0ZW1lbnQJPSB0cmFuc2l0aW9uX3N0YXRlbWVudDsKKyAgICBjdHgtPnRyYW5zaXRpb25fdHJpZ2dlcgk9IHRyYW5zaXRpb25fdHJpZ2dlcjsKKyAgICBjdHgtPnRyYW5zaXRpb25fZ3VhcmQJPSB0cmFuc2l0aW9uX2d1YXJkOworICAgIGN0eC0+dHJhbnNpdGlvbl90aW1lZF9ndWFyZAk9IHRyYW5zaXRpb25fdGltZWRfZ3VhcmQ7CisgICAgY3R4LT50cmFuc2l0aW9uX2VmZmVjdAk9IHRyYW5zaXRpb25fZWZmZWN0OworICAgIGN0eC0+dGFyZ2V0X3N0YXRlX2lkCT0gdGFyZ2V0X3N0YXRlX2lkOworICAgIGN0eC0+dGFyZ2V0X3N0YXRlX2t3X2lkCT0gdGFyZ2V0X3N0YXRlX2t3X2lkOworICAgIGN0eC0+ZGVmX3N0YXRlX2FjdGl2aXR5CT0gZGVmX3N0YXRlX2FjdGl2aXR5OworICAgIGN0eC0+c2VjdGlvbl9oZWFkZXJfaW1wb3J0X3BhcmFtZXRlcl9wcm9wZXJ0eQk9IHNlY3Rpb25faGVhZGVyX2ltcG9ydF9wYXJhbWV0ZXJfcHJvcGVydHk7CisgICAgY3R4LT5zZWN0aW9uX3BhcmFtZXRlcgk9IHNlY3Rpb25fcGFyYW1ldGVyOworICAgIGN0eC0+c2VjdGlvbl9wcm9wZXJ0eQk9IHNlY3Rpb25fcHJvcGVydHk7CisgICAgY3R4LT5zZWN0aW9uX3Byb3BlcnR5X2ZyZWVfZGVjbGFyYXRpb24JPSBzZWN0aW9uX3Byb3BlcnR5X2ZyZWVfZGVjbGFyYXRpb247CisgICAgY3R4LT5wcm9wZXJ0eV9kZWNsYXJhdGlvbgk9IHByb3BlcnR5X2RlY2xhcmF0aW9uOworICAgIGN0eC0+ZGVjbF9wcm9wZXJ0eV9lbGVtZW50CT0gZGVjbF9wcm9wZXJ0eV9lbGVtZW50OworICAgIGN0eC0+bGFiZWxsZWRfYXJndW1lbnQJPSBsYWJlbGxlZF9hcmd1bWVudDsKKyAgICBjdHgtPmRlY2xfaW5zdGFuY2VfbWFjaGluZV9wYXJhbXMJPSBkZWNsX2luc3RhbmNlX21hY2hpbmVfcGFyYW1zOworICAgIGN0eC0+ZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3JldHVybnMJPSBkZWNsX2luc3RhbmNlX21hY2hpbmVfcmV0dXJuczsKKyAgICBjdHgtPmFjdGl2aXR5X21hY2hpbmVfcGFyYW1fcmV0dXJuCT0gYWN0aXZpdHlfbWFjaGluZV9wYXJhbV9yZXR1cm47CisgICAgY3R4LT5kZWNsX3BvcnQJPSBkZWNsX3BvcnQ7CisgICAgY3R4LT5kZWNsX3BvcnRfaW1wbAk9IGRlY2xfcG9ydF9pbXBsOworICAgIGN0eC0+ZGVjbF9zaWduYWwJPSBkZWNsX3NpZ25hbDsKKyAgICBjdHgtPmRlY2xfc2lnbmFsX2ltcGwJPSBkZWNsX3NpZ25hbF9pbXBsOworICAgIGN0eC0+dHlwZV9wYXJhbV9jb20JPSB0eXBlX3BhcmFtX2NvbTsKKyAgICBjdHgtPnBhcmFtX2NvbV9hdG9tCT0gcGFyYW1fY29tX2F0b207CisgICAgY3R4LT5kZWNsX2J1ZmZlcgk9IGRlY2xfYnVmZmVyOworICAgIGN0eC0+ZGVjbF9idWZmZXJfaW1wbAk9IGRlY2xfYnVmZmVyX2ltcGw7CisgICAgY3R4LT5kZWZfYnVmZmVyCT0gZGVmX2J1ZmZlcjsKKyAgICBjdHgtPnBvbGljeV9idWZmZXIJPSBwb2xpY3lfYnVmZmVyOworICAgIGN0eC0+cmVmX2J1ZmZlcgk9IHJlZl9idWZmZXI7CisgICAgY3R4LT5pbml0aWFsX2J1ZmZlcl9jb250ZW50cwk9IGluaXRpYWxfYnVmZmVyX2NvbnRlbnRzOworICAgIGN0eC0+ZGVjbF9jaGFubmVsCT0gZGVjbF9jaGFubmVsOworICAgIGN0eC0+ZGVjbF9jaGFubmVsX3BvcnQJPSBkZWNsX2NoYW5uZWxfcG9ydDsKKyAgICBjdHgtPmRlY2xfY2hhbm5lbF92YXIJPSBkZWNsX2NoYW5uZWxfdmFyOworICAgIGN0eC0+ZGVjbF92YXJpYWJsZQk9IGRlY2xfdmFyaWFibGU7CisgICAgY3R4LT5kZWNsX3ZhcmlhYmxlX3RpbWVfY2xvY2tfaW1wbAk9IGRlY2xfdmFyaWFibGVfdGltZV9jbG9ja19pbXBsOworICAgIGN0eC0+ZGVjbF92YXJpYWJsZV9pbXBsCT0gZGVjbF92YXJpYWJsZV9pbXBsOworICAgIGN0eC0+ZGVjbF92YXJpYWJsZV9hdG9tX2ltcGwJPSBkZWNsX3ZhcmlhYmxlX2F0b21faW1wbDsKKyAgICBjdHgtPmRlY2xfdHlwZWRfdmFyaWFibGVfYXRvbV9pbXBsCT0gZGVjbF90eXBlZF92YXJpYWJsZV9hdG9tX2ltcGw7CisgICAgY3R4LT5pbml0aWFsX3ZhbHVlCT0gaW5pdGlhbF92YWx1ZTsKKyAgICBjdHgtPnR5cGVfdmFyCT0gdHlwZV92YXI7CisgICAgY3R4LT5kZWZfdHlwZV9hcnJheQk9IGRlZl90eXBlX2FycmF5OworICAgIGN0eC0+ZGVmX3R5cGVfYXJyYXlfc2l6ZQk9IGRlZl90eXBlX2FycmF5X3NpemU7CisgICAgY3R4LT5kZWZfdHlwZV9jb250YWluZXIJPSBkZWZfdHlwZV9jb250YWluZXI7CisgICAgY3R4LT5zcGVjaWZpZXJfYnVmZmVyCT0gc3BlY2lmaWVyX2J1ZmZlcjsKKyAgICBjdHgtPmRlZl90eXBlX2ludGVydmFsCT0gZGVmX3R5cGVfaW50ZXJ2YWw7CisgICAgY3R4LT5iYXNlX3R5cGVfdmFyCT0gYmFzZV90eXBlX3ZhcjsKKyAgICBjdHgtPnByaW1pdGl2ZV90eXBlCT0gcHJpbWl0aXZlX3R5cGU7CisgICAgY3R4LT5iaXRfZmllbGRfc2l6ZQk9IGJpdF9maWVsZF9zaXplOworICAgIGN0eC0+c3RyaW5nX2ZpZWxkX3NpemUJPSBzdHJpbmdfZmllbGRfc2l6ZTsKKyAgICBjdHgtPnJhbmdlX2NvbnN0YW50CT0gcmFuZ2VfY29uc3RhbnQ7CisgICAgY3R4LT5vbl93cml0ZV92YXJfcm91dGluZV9kZWYJPSBvbl93cml0ZV92YXJfcm91dGluZV9kZWY7CisgICAgY3R4LT52YXJfcm91dGluZV9kZWYJPSB2YXJfcm91dGluZV9kZWY7CisgICAgY3R4LT5yb3V0aW5lX3NpbmdsZV9wYXJhbQk9IHJvdXRpbmVfc2luZ2xlX3BhcmFtOworICAgIGN0eC0+ZGVmX2VudW0JPSBkZWZfZW51bTsKKyAgICBjdHgtPmRlZl9lbnVtX2ltcGwJPSBkZWZfZW51bV9pbXBsOworICAgIGN0eC0+ZGVmX3N0cnVjdAk9IGRlZl9zdHJ1Y3Q7CisgICAgY3R4LT5kZWZfY2xhc3Nfc3RydWN0dXJlX2ltcGwJPSBkZWZfY2xhc3Nfc3RydWN0dXJlX2ltcGw7CisgICAgY3R4LT5kZWZfY2hvaWNlCT0gZGVmX2Nob2ljZTsKKyAgICBjdHgtPmRlZl9jaG9pY2VfaW1wbAk9IGRlZl9jaG9pY2VfaW1wbDsKKyAgICBjdHgtPmRlZl91bmlvbgk9IGRlZl91bmlvbjsKKyAgICBjdHgtPmRlZl91bmlvbl9pbXBsCT0gZGVmX3VuaW9uX2ltcGw7CisgICAgY3R4LT5kZWZfbWV0aG9kCT0gZGVmX21ldGhvZDsKKyAgICBjdHgtPmRlY2xfcGFyYW1ldGVycwk9IGRlY2xfcGFyYW1ldGVyczsKKyAgICBjdHgtPmRlZl90eXBlCT0gZGVmX3R5cGU7CisgICAgY3R4LT5kZWZfdHlwZV9pbXBsCT0gZGVmX3R5cGVfaW1wbDsKKyAgICBjdHgtPmRlZl90eXBlX2F0b21faW1wbAk9IGRlZl90eXBlX2F0b21faW1wbDsKKyAgICBjdHgtPmRlZl90eXBlZGVmX2NvbnN0cmFpbnQJPSBkZWZfdHlwZWRlZl9jb25zdHJhaW50OworICAgIGN0eC0+dGltZV90eXBlCT0gdGltZV90eXBlOworICAgIGN0eC0+dGltZV9jbG9ja190eXBlCT0gdGltZV9jbG9ja190eXBlOworICAgIGN0eC0+dGltZV90eXBlX2RvbWFpbgk9IHRpbWVfdHlwZV9kb21haW47CisgICAgY3R4LT5zZWN0aW9uX21vZGVsX29mX2NvbXB1dGF0aW9uCT0gc2VjdGlvbl9tb2RlbF9vZl9jb21wdXRhdGlvbjsKKyAgICBjdHgtPnNlY3Rpb25fcm91dGluZQk9IHNlY3Rpb25fcm91dGluZTsKKyAgICBjdHgtPmRlZl9yb3V0aW5lX21vZGVsCT0gZGVmX3JvdXRpbmVfbW9kZWw7CisgICAgY3R4LT5kZWZfcm91dGluZV9tb2RlbF9pbXBsCT0gZGVmX3JvdXRpbmVfbW9kZWxfaW1wbDsKKyAgICBjdHgtPmRlZl9yb3V0aW5lX3BhcmFtZXRlcnMJPSBkZWZfcm91dGluZV9wYXJhbWV0ZXJzOworICAgIGN0eC0+ZGVmX3JvdXRpbmVfcGFyYW1fYXRvbQk9IGRlZl9yb3V0aW5lX3BhcmFtX2F0b207CisgICAgY3R4LT5kZWZfcm91dGluZV9yZXR1cm5zCT0gZGVmX3JvdXRpbmVfcmV0dXJuczsKKyAgICBjdHgtPmRlZl9yb3V0aW5lX3JldHVybnNfYXRvbQk9IGRlZl9yb3V0aW5lX3JldHVybnNfYXRvbTsKKyAgICBjdHgtPnNlY3Rpb25fbW9kZWxfb2ZfZXhlY3V0aW9uCT0gc2VjdGlvbl9tb2RlbF9vZl9leGVjdXRpb247CisgICAgY3R4LT5kZWZfbW9lX3ByaW1pdGl2ZQk9IGRlZl9tb2VfcHJpbWl0aXZlOworICAgIGN0eC0+ZGVmX3JvdXRpbmVfc2VxCT0gZGVmX3JvdXRpbmVfc2VxOworICAgIGN0eC0+c2VjdGlvbl9tb2RlbF9vZl9pbnRlcmFjdGlvbgk9IHNlY3Rpb25fbW9kZWxfb2ZfaW50ZXJhY3Rpb247CisgICAgY3R4LT5jb21fcHJvdG9jb2wJPSBjb21fcHJvdG9jb2w7CisgICAgY3R4LT5jb21fY2FzdAk9IGNvbV9jYXN0OworICAgIGN0eC0+YnVmZmVyX2NvbQk9IGJ1ZmZlcl9jb207CisgICAgY3R4LT5jb21fY29ubmVjdAk9IGNvbV9jb25uZWN0OworICAgIGN0eC0+Y29tX3JvdXRlCT0gY29tX3JvdXRlOworICAgIGN0eC0+Y29tX3BvcnQJPSBjb21fcG9ydDsKKyAgICBjdHgtPmNvbV9wb3J0X2lkCT0gY29tX3BvcnRfaWQ7CisgICAgY3R4LT5zdGF0ZW1lbnQJPSBzdGF0ZW1lbnQ7CisgICAgY3R4LT5ibG9ja19zdGF0ZW1lbnQJPSBibG9ja19zdGF0ZW1lbnQ7CisgICAgY3R4LT5vcF9ibG9jawk9IG9wX2Jsb2NrOworICAgIGN0eC0+b3Bfc2VxdWVuY2UJPSBvcF9zZXF1ZW5jZTsKKyAgICBjdHgtPm9wX3NjaGVkdWxpbmcJPSBvcF9zY2hlZHVsaW5nOworICAgIGN0eC0+b3BfY29uY3VycmVuY3kJPSBvcF9jb25jdXJyZW5jeTsKKyAgICBjdHgtPm9wX2ludm9rYWJsZQk9IG9wX2ludm9rYWJsZTsKKyAgICBjdHgtPnByZWZpeF9zdGF0ZW1lbnQJPSBwcmVmaXhfc3RhdGVtZW50OworICAgIGN0eC0+cHJlZml4X2V4cHJlc3Npb24JPSBwcmVmaXhfZXhwcmVzc2lvbjsKKyAgICBjdHgtPmF2bV9vcGVyYXRvcgk9IGF2bV9vcGVyYXRvcjsKKyAgICBjdHgtPnN0YXRlbWVudF9pbnZva2VfbWV0aG9kCT0gc3RhdGVtZW50X2ludm9rZV9tZXRob2Q7CisgICAgY3R4LT5zdGF0ZW1lbnRfaW52b2tlCT0gc3RhdGVtZW50X2ludm9rZTsKKyAgICBjdHgtPmV4cHJlc3Npb25faW52b2tlCT0gZXhwcmVzc2lvbl9pbnZva2U7CisgICAgY3R4LT5zdGF0ZW1lbnRfYWN0aXZpdHlfbmV3CT0gc3RhdGVtZW50X2FjdGl2aXR5X25ldzsKKyAgICBjdHgtPmRlY2xfaW5zdGFuY2VfZHluYW1pY19pbXBsCT0gZGVjbF9pbnN0YW5jZV9keW5hbWljX2ltcGw7CisgICAgY3R4LT5leHByZXNzaW9uX2FjdGl2aXR5X25ldwk9IGV4cHJlc3Npb25fYWN0aXZpdHlfbmV3OworICAgIGN0eC0+c3RhdGVtZW50X3Byb21wdAk9IHN0YXRlbWVudF9wcm9tcHQ7CisgICAgY3R4LT5zdGF0ZW1lbnRfcHJvbXB0X2ltcGwJPSBzdGF0ZW1lbnRfcHJvbXB0X2ltcGw7CisgICAgY3R4LT5zdGF0ZW1lbnRfcHJvbXB0X29icwk9IHN0YXRlbWVudF9wcm9tcHRfb2JzOworICAgIGN0eC0+c3RhdGVtZW50X3Byb21wdF9vYnNfY29tCT0gc3RhdGVtZW50X3Byb21wdF9vYnNfY29tOworICAgIGN0eC0+bWV0YV9zdGF0ZW1lbnQJPSBtZXRhX3N0YXRlbWVudDsKKyAgICBjdHgtPnN0YXRlbWVudF9hc3NpZ24JPSBzdGF0ZW1lbnRfYXNzaWduOworICAgIGN0eC0+bHZhbHVlCT0gbHZhbHVlOworICAgIGN0eC0+cGFyYW1ldGVycwk9IHBhcmFtZXRlcnM7CisgICAgY3R4LT5zdGF0ZW1lbnRfY29tCT0gc3RhdGVtZW50X2NvbTsKKyAgICBjdHgtPnN0YXRlbWVudF9jb21faW5wdXQJPSBzdGF0ZW1lbnRfY29tX2lucHV0OworICAgIGN0eC0+c3RhdGVtZW50X2NvbV9vdXRwdXQJPSBzdGF0ZW1lbnRfY29tX291dHB1dDsKKyAgICBjdHgtPnBhcmFtZXRlcnNfcG9ydAk9IHBhcmFtZXRlcnNfcG9ydDsKKyAgICBjdHgtPmV4cHJlc3Npb25fY29tCT0gZXhwcmVzc2lvbl9jb207CisgICAgY3R4LT5zdGF0ZW1lbnRfY29uc3RyYWludAk9IHN0YXRlbWVudF9jb25zdHJhaW50OworICAgIGN0eC0+c3RhdGVtZW50X2d1YXJkCT0gc3RhdGVtZW50X2d1YXJkOworICAgIGN0eC0+c3RhdGVtZW50X3RpbWVkX2d1YXJkCT0gc3RhdGVtZW50X3RpbWVkX2d1YXJkOworICAgIGN0eC0+c3RhdGVtZW50X2NoZWNrc2F0CT0gc3RhdGVtZW50X2NoZWNrc2F0OworICAgIGN0eC0+ZXhwcmVzc2lvbl9ndWFyZAk9IGV4cHJlc3Npb25fZ3VhcmQ7CisgICAgY3R4LT5zdGF0ZW1lbnRfaXRlCT0gc3RhdGVtZW50X2l0ZTsKKyAgICBjdHgtPmV4cHJlc3Npb25faXRlCT0gZXhwcmVzc2lvbl9pdGU7CisgICAgY3R4LT5zdGF0ZW1lbnRfaXRlcmF0aW9uCT0gc3RhdGVtZW50X2l0ZXJhdGlvbjsKKyAgICBjdHgtPmZvcl9hc3NpZ25faGVhZGVyCT0gZm9yX2Fzc2lnbl9oZWFkZXI7CisgICAgY3R4LT5zdGF0ZW1lbnRfanVtcAk9IHN0YXRlbWVudF9qdW1wOworICAgIGN0eC0+ZXhwcmVzc2lvbl9sYW1iZGEJPSBleHByZXNzaW9uX2xhbWJkYTsKKyAgICBjdHgtPmV4cHJlc3Npb25fc3RhdHVzCT0gZXhwcmVzc2lvbl9zdGF0dXM7CisgICAgY3R4LT5vcF9hY3Rpdml0eQk9IG9wX2FjdGl2aXR5OworICAgIGN0eC0+c3RhdGVtZW50X2FjdGl2aXR5CT0gc3RhdGVtZW50X2FjdGl2aXR5OworICAgIGN0eC0+c3RhdGVtZW50X2luaXRfZmxvdwk9IHN0YXRlbWVudF9pbml0X2Zsb3c7CisgICAgY3R4LT5zdGF0ZW1lbnRfaW52b2tlX3JvdXRpbmUJPSBzdGF0ZW1lbnRfaW52b2tlX3JvdXRpbmU7CisgICAgY3R4LT5pbnZva2Vfcm91dGluZV9wYXJhbXMJPSBpbnZva2Vfcm91dGluZV9wYXJhbXM7CisgICAgY3R4LT5pbnZva2Vfcm91dGluZV9yZXR1cm5zCT0gaW52b2tlX3JvdXRpbmVfcmV0dXJuczsKKyAgICBjdHgtPnN0YXRlbWVudF9tb2MJPSBzdGF0ZW1lbnRfbW9jOworICAgIGN0eC0+ZXhwcmVzc2lvbgk9IGV4cHJlc3Npb247CisgICAgY3R4LT5jb25kaXRpb25hbEV4cHJlc3Npb24JPSBjb25kaXRpb25hbEV4cHJlc3Npb247CisgICAgY3R4LT5zY2hlZHVsZUV4cHJlc3Npb24JPSBzY2hlZHVsZUV4cHJlc3Npb247CisgICAgY3R4LT5jb25kaXRpb25hbE9yRXhwcmVzc2lvbgk9IGNvbmRpdGlvbmFsT3JFeHByZXNzaW9uOworICAgIGN0eC0+Y29uZGl0aW9uYWxBbmRFeHByZXNzaW9uCT0gY29uZGl0aW9uYWxBbmRFeHByZXNzaW9uOworICAgIGN0eC0+Yml0d2lzZU9yRXhwcmVzc2lvbgk9IGJpdHdpc2VPckV4cHJlc3Npb247CisgICAgY3R4LT5iaXR3aXNlWG9yRXhwcmVzc2lvbgk9IGJpdHdpc2VYb3JFeHByZXNzaW9uOworICAgIGN0eC0+Yml0d2lzZUFuZEV4cHJlc3Npb24JPSBiaXR3aXNlQW5kRXhwcmVzc2lvbjsKKyAgICBjdHgtPmVxdWFsaXR5RXhwcmVzc2lvbgk9IGVxdWFsaXR5RXhwcmVzc2lvbjsKKyAgICBjdHgtPmVxdWFsT3AJPSBlcXVhbE9wOworICAgIGN0eC0+cmVsYXRpb25hbEV4cHJlc3Npb24JPSByZWxhdGlvbmFsRXhwcmVzc2lvbjsKKyAgICBjdHgtPnJlbGF0aW9uYWxPcAk9IHJlbGF0aW9uYWxPcDsKKyAgICBjdHgtPnNoaWZ0RXhwcmVzc2lvbgk9IHNoaWZ0RXhwcmVzc2lvbjsKKyAgICBjdHgtPnNoaWZ0T3AJPSBzaGlmdE9wOworICAgIGN0eC0+YWRkaXRpdmVFeHByZXNzaW9uCT0gYWRkaXRpdmVFeHByZXNzaW9uOworICAgIGN0eC0+bXVsdGlwbGljYXRpdmVFeHByZXNzaW9uCT0gbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uOworICAgIGN0eC0+dW5hcnlFeHByZXNzaW9uCT0gdW5hcnlFeHByZXNzaW9uOworICAgIGN0eC0+Y3RvckV4cHJlc3Npb24JPSBjdG9yRXhwcmVzc2lvbjsKKyAgICBjdHgtPnF1b3RlX2V4cHJlc3Npb24JPSBxdW90ZV9leHByZXNzaW9uOworICAgIGN0eC0+bWV0YV9ldmFsX2V4cHJlc3Npb24JPSBtZXRhX2V2YWxfZXhwcmVzc2lvbjsKKyAgICBjdHgtPnByaW1hcnkJPSBwcmltYXJ5OworICAgIGN0eC0+cHJpbWFyeV91ZmlkCT0gcHJpbWFyeV91ZmlkOworICAgIGN0eC0+cHJpbWFyeV91ZmkJPSBwcmltYXJ5X3VmaTsKKyAgICBjdHgtPnByaW1hcnlfaW52b2tlCT0gcHJpbWFyeV9pbnZva2U7CisgICAgY3R4LT5saXRlcmFsCT0gbGl0ZXJhbDsKKyAgICBjdHgtPmNvbGxlY3Rpb25fb2ZfZXhwcmVzc2lvbgk9IGNvbGxlY3Rpb25fb2ZfZXhwcmVzc2lvbjsKKyAgICBjdHgtPnN5bnByZWQyMV9mbWwJPSBzeW5wcmVkMjFfZm1sOworICAgIGN0eC0+c3lucHJlZDU2X2ZtbAk9IHN5bnByZWQ1Nl9mbWw7CisgICAgY3R4LT5zeW5wcmVkNTdfZm1sCT0gc3lucHJlZDU3X2ZtbDsKKyAgICBjdHgtPnN5bnByZWQ1OF9mbWwJPSBzeW5wcmVkNThfZm1sOworICAgIGN0eC0+c3lucHJlZDU5X2ZtbAk9IHN5bnByZWQ1OV9mbWw7CisgICAgY3R4LT5zeW5wcmVkNjBfZm1sCT0gc3lucHJlZDYwX2ZtbDsKKyAgICBjdHgtPnN5bnByZWQ2MV9mbWwJPSBzeW5wcmVkNjFfZm1sOworICAgIGN0eC0+c3lucHJlZDYyX2ZtbAk9IHN5bnByZWQ2Ml9mbWw7CisgICAgY3R4LT5zeW5wcmVkOTVfZm1sCT0gc3lucHJlZDk1X2ZtbDsKKyAgICBjdHgtPnN5bnByZWQxMTVfZm1sCT0gc3lucHJlZDExNV9mbWw7CisgICAgY3R4LT5zeW5wcmVkMTI2X2ZtbAk9IHN5bnByZWQxMjZfZm1sOworICAgIGN0eC0+c3lucHJlZDEyN19mbWwJPSBzeW5wcmVkMTI3X2ZtbDsKKyAgICBjdHgtPnN5bnByZWQxMzhfZm1sCT0gc3lucHJlZDEzOF9mbWw7CisgICAgY3R4LT5zeW5wcmVkMTUzX2ZtbAk9IHN5bnByZWQxNTNfZm1sOworICAgIGN0eC0+c3lucHJlZDE3MF9mbWwJPSBzeW5wcmVkMTcwX2ZtbDsKKyAgICBjdHgtPnN5bnByZWQyOTZfZm1sCT0gc3lucHJlZDI5Nl9mbWw7CisgICAgY3R4LT5zeW5wcmVkMzA0X2ZtbAk9IHN5bnByZWQzMDRfZm1sOworICAgIGN0eC0+c3lucHJlZDMyNF9mbWwJPSBzeW5wcmVkMzI0X2ZtbDsKKyAgICBjdHgtPnN5bnByZWQzMjZfZm1sCT0gc3lucHJlZDMyNl9mbWw7CisgICAgY3R4LT5zeW5wcmVkMzI5X2ZtbAk9IHN5bnByZWQzMjlfZm1sOworICAgIGN0eC0+c3lucHJlZDM0MF9mbWwJPSBzeW5wcmVkMzQwX2ZtbDsKKyAgICBjdHgtPnN5bnByZWQzNDFfZm1sCT0gc3lucHJlZDM0MV9mbWw7CisgICAgY3R4LT5zeW5wcmVkMzQzX2ZtbAk9IHN5bnByZWQzNDNfZm1sOworICAgIGN0eC0+c3lucHJlZDM0NF9mbWwJPSBzeW5wcmVkMzQ0X2ZtbDsKKyAgICBjdHgtPnN5bnByZWQzNjZfZm1sCT0gc3lucHJlZDM2Nl9mbWw7CisgICAgY3R4LT5zeW5wcmVkMzcwX2ZtbAk9IHN5bnByZWQzNzBfZm1sOworICAgIGN0eC0+c3lucHJlZDM3M19mbWwJPSBzeW5wcmVkMzczX2ZtbDsKKyAgICBjdHgtPnN5bnByZWQzNzVfZm1sCT0gc3lucHJlZDM3NV9mbWw7CisgICAgY3R4LT5zeW5wcmVkNDA3X2ZtbAk9IHN5bnByZWQ0MDdfZm1sOworICAgIGN0eC0+c3lucHJlZDQxMl9mbWwJPSBzeW5wcmVkNDEyX2ZtbDsKKyAgICBjdHgtPnN5bnByZWQ0MTdfZm1sCT0gc3lucHJlZDQxN19mbWw7CisgICAgY3R4LT5zeW5wcmVkNDE5X2ZtbAk9IHN5bnByZWQ0MTlfZm1sOworICAgIGN0eC0+c3lucHJlZDQyNl9mbWwJPSBzeW5wcmVkNDI2X2ZtbDsKKyAgICBjdHgtPnN5bnByZWQ0MzFfZm1sCT0gc3lucHJlZDQzMV9mbWw7CisgICAgY3R4LT5zeW5wcmVkNDM4X2ZtbAk9IHN5bnByZWQ0MzhfZm1sOworICAgIGN0eC0+c3lucHJlZDQ0Nl9mbWwJPSBzeW5wcmVkNDQ2X2ZtbDsKKyAgICBjdHgtPnN5bnByZWQ0OTNfZm1sCT0gc3lucHJlZDQ5M19mbWw7CisgICAgY3R4LT5zeW5wcmVkNTE0X2ZtbAk9IHN5bnByZWQ1MTRfZm1sOworICAgIGN0eC0+c3lucHJlZDUxN19mbWwJPSBzeW5wcmVkNTE3X2ZtbDsKKyAgICBjdHgtPnN5bnByZWQ1MjBfZm1sCT0gc3lucHJlZDUyMF9mbWw7CisgICAgY3R4LT5zeW5wcmVkNTMxX2ZtbAk9IHN5bnByZWQ1MzFfZm1sOworICAgIGN0eC0+c3lucHJlZDUzNV9mbWwJPSBzeW5wcmVkNTM1X2ZtbDsKKyAgICBjdHgtPnN5bnByZWQ1MzdfZm1sCT0gc3lucHJlZDUzN19mbWw7CisgICAgY3R4LT5zeW5wcmVkNTM5X2ZtbAk9IHN5bnByZWQ1MzlfZm1sOworICAgIGN0eC0+c3lucHJlZDU1NV9mbWwJPSBzeW5wcmVkNTU1X2ZtbDsKKyAgICBjdHgtPnN5bnByZWQ1NTlfZm1sCT0gc3lucHJlZDU1OV9mbWw7CisgICAgY3R4LT5zeW5wcmVkNTc0X2ZtbAk9IHN5bnByZWQ1NzRfZm1sOworICAgIGN0eC0+c3lucHJlZDYwOV9mbWwJPSBzeW5wcmVkNjA5X2ZtbDsKKyAgICBjdHgtPnN5bnByZWQ2MzZfZm1sCT0gc3lucHJlZDYzNl9mbWw7CisgICAgY3R4LT5zeW5wcmVkNjQzX2ZtbAk9IHN5bnByZWQ2NDNfZm1sOworICAgIGN0eC0+c3lucHJlZDcwNV9mbWwJPSBzeW5wcmVkNzA1X2ZtbDsKKyAgICBjdHgtPnN5bnByZWQ3MDlfZm1sCT0gc3lucHJlZDcwOV9mbWw7CisgICAgY3R4LT5zeW5wcmVkNzE0X2ZtbAk9IHN5bnByZWQ3MTRfZm1sOworICAgIGN0eC0+c3lucHJlZDc3OF9mbWwJPSBzeW5wcmVkNzc4X2ZtbDsKKyAgICBjdHgtPnN5bnByZWQ3NzlfZm1sCT0gc3lucHJlZDc3OV9mbWw7CisgICAgY3R4LT5zeW5wcmVkNzgwX2ZtbAk9IHN5bnByZWQ3ODBfZm1sOworICAgIGN0eC0+c3lucHJlZDc4MV9mbWwJPSBzeW5wcmVkNzgxX2ZtbDsKKyAgICBjdHgtPnN5bnByZWQ4MDJfZm1sCT0gc3lucHJlZDgwMl9mbWw7CisgICAgY3R4LT5zeW5wcmVkODA0X2ZtbAk9IHN5bnByZWQ4MDRfZm1sOworICAgIGN0eC0+c3lucHJlZDg2MV9mbWwJPSBzeW5wcmVkODYxX2ZtbDsKKyAgICBjdHgtPnN5bnByZWQ4NzJfZm1sCT0gc3lucHJlZDg3Ml9mbWw7CisgICAgY3R4LT5zeW5wcmVkODkxX2ZtbAk9IHN5bnByZWQ4OTFfZm1sOworICAgIGN0eC0+c3lucHJlZDg5NF9mbWwJPSBzeW5wcmVkODk0X2ZtbDsKKyAgICBjdHgtPnN5bnByZWQ4OTZfZm1sCT0gc3lucHJlZDg5Nl9mbWw7CisgICAgY3R4LT5zeW5wcmVkODk3X2ZtbAk9IHN5bnByZWQ4OTdfZm1sOworICAgIGN0eC0+c3lucHJlZDg5OF9mbWwJPSBzeW5wcmVkODk4X2ZtbDsKKyAgICBjdHgtPnN5bnByZWQ5NDZfZm1sCT0gc3lucHJlZDk0Nl9mbWw7CisgICAgY3R4LT5zeW5wcmVkOTQ3X2ZtbAk9IHN5bnByZWQ5NDdfZm1sOworICAgIGN0eC0+c3lucHJlZDk0OF9mbWwJPSBzeW5wcmVkOTQ4X2ZtbDsKKyAgICBjdHgtPnN5bnByZWQ5NDlfZm1sCT0gc3lucHJlZDk0OV9mbWw7CisgICAgY3R4LT5zeW5wcmVkOTUwX2ZtbAk9IHN5bnByZWQ5NTBfZm1sOworICAgIGN0eC0+c3lucHJlZDk1MV9mbWwJPSBzeW5wcmVkOTUxX2ZtbDsKKyAgICBjdHgtPnN5bnByZWQ5NTJfZm1sCT0gc3lucHJlZDk1Ml9mbWw7CisgICAgY3R4LT5zeW5wcmVkOTUzX2ZtbAk9IHN5bnByZWQ5NTNfZm1sOworICAgIGN0eC0+c3lucHJlZDk1NF9mbWwJPSBzeW5wcmVkOTU0X2ZtbDsKKyAgICBjdHgtPnN5bnByZWQ5NTVfZm1sCT0gc3lucHJlZDk1NV9mbWw7CisgICAgY3R4LT5zeW5wcmVkOTU2X2ZtbAk9IHN5bnByZWQ5NTZfZm1sOworICAgIGN0eC0+c3lucHJlZDk1N19mbWwJPSBzeW5wcmVkOTU3X2ZtbDsKKyAgICBjdHgtPnN5bnByZWQ5NThfZm1sCT0gc3lucHJlZDk1OF9mbWw7CisgICAgY3R4LT5zeW5wcmVkOTU5X2ZtbAk9IHN5bnByZWQ5NTlfZm1sOworICAgIGN0eC0+c3lucHJlZDk2MF9mbWwJPSBzeW5wcmVkOTYwX2ZtbDsKKyAgICBjdHgtPnN5bnByZWQ5NjFfZm1sCT0gc3lucHJlZDk2MV9mbWw7CisgICAgY3R4LT5zeW5wcmVkOTYyX2ZtbAk9IHN5bnByZWQ5NjJfZm1sOworICAgIGN0eC0+c3lucHJlZDk2M19mbWwJPSBzeW5wcmVkOTYzX2ZtbDsKKyAgICBjdHgtPnN5bnByZWQ5NjRfZm1sCT0gc3lucHJlZDk2NF9mbWw7CisgICAgY3R4LT5zeW5wcmVkOTY1X2ZtbAk9IHN5bnByZWQ5NjVfZm1sOworICAgIGN0eC0+c3lucHJlZDk2Nl9mbWwJPSBzeW5wcmVkOTY2X2ZtbDsKKyAgICBjdHgtPnN5bnByZWQ5NjdfZm1sCT0gc3lucHJlZDk2N19mbWw7CisgICAgY3R4LT5zeW5wcmVkOTY4X2ZtbAk9IHN5bnByZWQ5NjhfZm1sOworICAgIGN0eC0+c3lucHJlZDk2OV9mbWwJPSBzeW5wcmVkOTY5X2ZtbDsKKyAgICBjdHgtPnN5bnByZWQ5NzBfZm1sCT0gc3lucHJlZDk3MF9mbWw7CisgICAgY3R4LT5zeW5wcmVkOTcxX2ZtbAk9IHN5bnByZWQ5NzFfZm1sOworICAgIGN0eC0+c3lucHJlZDk3Ml9mbWwJPSBzeW5wcmVkOTcyX2ZtbDsKKyAgICBjdHgtPnN5bnByZWQ5NzNfZm1sCT0gc3lucHJlZDk3M19mbWw7CisgICAgY3R4LT5zeW5wcmVkOTc0X2ZtbAk9IHN5bnByZWQ5NzRfZm1sOworICAgIGN0eC0+c3lucHJlZDk3NV9mbWwJPSBzeW5wcmVkOTc1X2ZtbDsKKyAgICBjdHgtPnN5bnByZWQ5NzZfZm1sCT0gc3lucHJlZDk3Nl9mbWw7CisgICAgY3R4LT5zeW5wcmVkOTc3X2ZtbAk9IHN5bnByZWQ5NzdfZm1sOworICAgIGN0eC0+c3lucHJlZDk4MF9mbWwJPSBzeW5wcmVkOTgwX2ZtbDsKKyAgICBjdHgtPnN5bnByZWQ5ODFfZm1sCT0gc3lucHJlZDk4MV9mbWw7CisgICAgY3R4LT5zeW5wcmVkOTgyX2ZtbAk9IHN5bnByZWQ5ODJfZm1sOworICAgIGN0eC0+c3lucHJlZDk4M19mbWwJPSBzeW5wcmVkOTgzX2ZtbDsKKyAgICBjdHgtPnN5bnByZWQ5ODRfZm1sCT0gc3lucHJlZDk4NF9mbWw7CisgICAgY3R4LT5zeW5wcmVkOTg1X2ZtbAk9IHN5bnByZWQ5ODVfZm1sOworICAgIGN0eC0+c3lucHJlZDk4Nl9mbWwJPSBzeW5wcmVkOTg2X2ZtbDsKKyAgICBjdHgtPnN5bnByZWQ5ODdfZm1sCT0gc3lucHJlZDk4N19mbWw7CisgICAgY3R4LT5zeW5wcmVkOTkxX2ZtbAk9IHN5bnByZWQ5OTFfZm1sOworICAgIGN0eC0+c3lucHJlZDk5Ml9mbWwJPSBzeW5wcmVkOTkyX2ZtbDsKKyAgICBjdHgtPnN5bnByZWQ5OTdfZm1sCT0gc3lucHJlZDk5N19mbWw7CisgICAgY3R4LT5zeW5wcmVkMTAwMF9mbWwJPSBzeW5wcmVkMTAwMF9mbWw7CisgICAgY3R4LT5zeW5wcmVkMTAwM19mbWwJPSBzeW5wcmVkMTAwM19mbWw7CisgICAgY3R4LT5zeW5wcmVkMTAyMF9mbWwJPSBzeW5wcmVkMTAyMF9mbWw7CisgICAgY3R4LT5zeW5wcmVkMTAyMV9mbWwJPSBzeW5wcmVkMTAyMV9mbWw7CisgICAgY3R4LT5zeW5wcmVkMTAyN19mbWwJPSBzeW5wcmVkMTAyN19mbWw7CisgICAgY3R4LT5zeW5wcmVkMTAyOV9mbWwJPSBzeW5wcmVkMTAyOV9mbWw7CisgICAgY3R4LT5zeW5wcmVkMTAzMF9mbWwJPSBzeW5wcmVkMTAzMF9mbWw7CisgICAgY3R4LT5zeW5wcmVkMTAzM19mbWwJPSBzeW5wcmVkMTAzM19mbWw7CisgICAgY3R4LT5zeW5wcmVkMTAzNV9mbWwJPSBzeW5wcmVkMTAzNV9mbWw7CisgICAgY3R4LT5mcmVlCQkJPSBmbWxQYXJzZXJGcmVlOworICAgIGN0eC0+cmVzZXQJCQk9IGZtbFBhcnNlclJlc2V0OworICAgIGN0eC0+Z2V0R3JhbW1hckZpbGVOYW1lCT0gZ2V0R3JhbW1hckZpbGVOYW1lOworCisgICAgLyogSW5zdGFsbCB0aGUgc2NvcGUgcHVzaGluZyBtZXRob2RzLgorICAgICAqLworCisgICAgLyogQ3JlYXRlIGEgTElTVCBmb3IgcmVjb3JkaW5nIHJ1bGUgbWVtb3MuCisgICAgICovCisgICAgIFJVTEVNRU1PICAgID0gYW50bHIzSW50VHJpZU5ldygxNSk7CS8qIDE2IGJpdCBkZXB0aCBpcyBlbm91Z2ggZm9yIDMyNzY4IHJ1bGVzISAqLworCisgICAgLyogSW5zdGFsbCB0aGUgdG9rZW4gdGFibGUKKyAgICAgKi8KKyAgICBQU1JTVEFURS0+dG9rZW5OYW1lcyAgID0gZm1sUGFyc2VyVG9rZW5OYW1lczsKKworCisgICAgLyogUmV0dXJuIHRoZSBuZXdseSBidWlsdCBwYXJzZXIgdG8gdGhlIGNhbGxlcgorICAgICAqLworICAgIHJldHVybiAgY3R4OworfQorCitzdGF0aWMgdm9pZAorZm1sUGFyc2VyUmVzZXQgKHBmbWxQYXJzZXIgY3R4KQoreworICAgIFJFQ09HTklaRVItPnJlc2V0KFJFQ09HTklaRVIpOworfQorCisvKiogRnJlZSB0aGUgcGFyc2VyIHJlc291cmNlcworICovCisgc3RhdGljIHZvaWQKKyBmbWxQYXJzZXJGcmVlKHBmbWxQYXJzZXIgY3R4KQorIHsKKyAgICAvKiBGcmVlIGFueSBzY29wZSBtZW1vcnkKKyAgICAgKi8KKworCWlmCShSVUxFTUVNTyAhPSBOVUxMKQorCXsKKwkJUlVMRU1FTU8tPmZyZWUoUlVMRU1FTU8pOworCQlSVUxFTUVNTyA9IE5VTEw7CisJfQorCS8vIEZyZWUgdGhpcyBwYXJzZXIKKwkvLworICAgIGN0eC0+cFBhcnNlci0+ZnJlZShjdHgtPnBQYXJzZXIpOworCisKKyAgICBBTlRMUjNfRlJFRShjdHgpOworCisgICAgLyogRXZlcnl0aGluZyBpcyByZWxlYXNlZCwgc28gd2UgY2FuIHJldHVybgorICAgICAqLworICAgIHJldHVybjsKKyB9CisKKy8qKiBSZXR1cm4gdG9rZW4gbmFtZXMgdXNlZCBieSB0aGlzIAorcGFyc2VyCisKKyAqCisgKiBUaGUgcmV0dXJuZWQgcG9pbnRlciBpcyB1c2VkIGFzIGFuIGluZGV4IGludG8gdGhlIHRva2VuIG5hbWVzIHRhYmxlICh1c2luZyB0aGUgdG9rZW4KKyAqIG51bWJlciBhcyB0aGUgaW5kZXgpLgorICoKKyAqIFxyZXR1cm4gUG9pbnRlciB0byBmaXJzdCBjaGFyICogaW4gdGhlIHRhYmxlLgorICovCitzdGF0aWMgcEFOVExSM19VSU5UOCAgICAqZ2V0VG9rZW5OYW1lcygpCit7CisgICAgICAgIHJldHVybiBmbWxQYXJzZXJUb2tlbk5hbWVzOworfQorCisKKworICAgIC8vIGV4dGVybiAiQyIgYW5kIEMrKyBUZW1wbGF0ZSBpbmNvbXBhdGliaWxpdHkgISEhCisgICAgI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Qcm9wZXJ0eVBhcnQuaD4KKworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBTRVQgTE9DQVRJT04gSU4gVFJBQ0VBQkxFIEZPUk0KKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgI2RlZmluZSBTQVZFX1JVTEVfQkVHSU5fTE9DQVRJT04gIHNlcDo6YXZtX3NpemVfdCBiTGluZSA9IExUKDEpLT5nZXRMaW5lKExUKDEpKQorCisgICAgI2RlZmluZSBTRVRfUlVMRV9MT0NBVElPTihmb3JtKSAgIFwKKyAgICAJCXNlcDo6UGFyc2VyVXRpbDo6c2V0TG9jYXRpb24oZm9ybSwgYkxpbmUsIExUKC0xKS0+Z2V0TGluZShMVCgtMSkpKQorCisKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gWExJQSBvciBYRlNQIE1BQ1JPCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICNkZWZpbmUgT1Aob3ApICAgICAgICAgICAgc2VwOjpPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SXyMjb3AKKworICAgICNkZWZpbmUgTkVXX0VYUFIoZSkgICAgICAgc2VwOjpFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0V4cHIoZSkKKworICAgICNkZWZpbmUgTkVXX0JPT0woYikgICAgICAgc2VwOjpFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oKGJvb2wpIGIpCisgICAgI2RlZmluZSBORVdfSU5URUdFUihpKSAgICBzZXA6OkV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3SW50ZWdlcihpKQorICAgICNkZWZpbmUgTkVXX1JBVElPTkFMKHEpICAgc2VwOjpFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld1JhdGlvbmFsKHEpCisgICAgI2RlZmluZSBORVdfRkxPQVQoZikgICAgICBzZXA6OkV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3RmxvYXQoZikKKyAgICAjZGVmaW5lIE5FV19DSEFSKGMpICAgICAgIHNlcDo6RXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDaGFyKGMpCisgICAgI2RlZmluZSBORVdfU1RSSU5HKHMpICAgICBzZXA6OkV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3U3RyaW5nKHMpCisKKyAgICAjZGVmaW5lIE5FV19JRChpZCkgICAgICAgIHNlcDo6RXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdJZGVudGlmaWVyKGlkKQorICAgICNkZWZpbmUgTkVXX1FJRChpZCkgICAgICAgc2VwOjpFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld1F1YWxpZmllZElkZW50aWZpZXIoaWQpCisgICAgI2RlZmluZSBORVdfUU5JRChpZCwgbmIpICAoIChuYiA+IDEpPyBORVdfUUlEKGlkKSA6IE5FV19JRChpZCkgKQorCisKKyAgICAjZGVmaW5lIE5FV19JTlNUQU5DRV9VRklEKG1hY2hpbmUsIHZhcikgIFwKKyAgICAJCXNlcDo6RXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdRdWFsaWZpZWRJZGVudGlmaWVyKCAgXAorICAgIAkJCXNlcDo6T1NTKCkgPDwgbWFjaGluZS0+Z2V0TmFtZUlEKCkgPDwgJy4nIDw8IHZhci0+Z2V0TmFtZUlEKCkgKQorCisKKyAgICAjZGVmaW5lIE5FV19DT0RFKG9wKSAgICAgICAgICAgICAgIHNlcDo6RXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlKG9wKQorICAgICNkZWZpbmUgTkVXX0NPREUxKG9wLCBlKSAgICAgICAgICAgc2VwOjpFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NvZGUob3AsIGUpCisgICAgI2RlZmluZSBORVdfQ09ERTIob3AsIGUxLCBlMikgICAgICBzZXA6OkV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q29kZShvcCwgZTEsIGUyKQorICAgICNkZWZpbmUgTkVXX0NPREUzKG9wLCBlMSwgZTIsIGUzKSAgc2VwOjpFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NvZGUob3AsIGUxLCBlMiwgZTMpCisKKyAgICAjZGVmaW5lIE5FV19DT0RFX0ZMQVQob3AsIGUxLCBlMikgIHNlcDo6RXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlRmxhdChvcCwgZTEsIGUyKQorCisgICAgI2RlZmluZSBORVdfU1RNVChvcCkgICAgICAgICAgICAgICBzZXA6OlN0YXRlbWVudENvbnN0cnVjdG9yOjpuZXdDb2RlKG9wKQorICAgICNkZWZpbmUgTkVXX1NUTVQxKG9wLCBzKSAgICAgICAgICAgc2VwOjpTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZShvcCwgcykKKyAgICAjZGVmaW5lIE5FV19TVE1UMihvcCwgczEsIHMyKSAgICAgIHNlcDo6U3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUob3AsIHMxLCBzMikKKyAgICAjZGVmaW5lIE5FV19TVE1UMyhvcCwgczEsIHMyLCBzMykgIHNlcDo6U3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUob3AsIHMxLCBzMiwgczMpCisKKworICAgICNkZWZpbmUgTkVXX1NUTVRfQVNTSUdOX09QKG9wLCBsdiwgZSkgIFwKKyAgICAJCQkJCU5FV19TVE1UMihPUChBU1NJR05fT1ApLCBsdiwgTkVXX0NPREUxKG9wLCBlKSkKKworICAgICNkZWZpbmUgTkVXX1NUTVRfQVNTSUdOX09QX0FGVEVSKG9wLCBsdiwgZSkgIFwKKyAgICAJCQkJCU5FV19TVE1UMihPUChBU1NJR05fT1BfQUZURVIpLCBsdiwgTkVXX0NPREUxKG9wLCBlKSkKKworCisgICAgI2RlZmluZSAgTlVNX0lOVChzKSAgICBzdGQ6OmF0b2koKGNvbnN0IGNoYXIqKShzKSkKKyAgICAjZGVmaW5lICBOVU1fRkxPQVQocykgIHN0ZDo6YXRvZigoY29uc3QgY2hhciopKHMpKQorCisgICAgI2RlZmluZSAgQ0hBUihzKSAgICAgICggKigoY29uc3QgY2hhciopKHMpKSApCisKKyAgICAjZGVmaW5lICBTVFIocykgICAgICAgc3RkOjpzdHJpbmcoKGNvbnN0IGNoYXIqKShzKSkKKworICAgICNkZWZpbmUgIFNUUl9JRChzKSAgICBzdGQ6OnN0cmluZygoY29uc3QgY2hhciopKChzLT5nZXRUZXh0KHMpKS0+Y2hhcnMpKQorCisKKyAgICBzZXA6OkJGIG5ld191bWludXNfZXhwcihzZXA6OkJGICYgYXJnKQorICAgIHsKKyAgICAJaWYoIGFyZy5pc051bWVyaWMoKSApCisgICAgCXsKKyAgICAJCXJldHVybiggc2VwOjpFeHByZXNzaW9uQ29uc3RydWN0b3I6OnVtaW51c0V4cHIoYXJnKSApOworICAgIAl9CisgICAgCXJldHVybiggTkVXX0NPREUxKE9QKFVNSU5VUyksIGFyZykgKTsKKyAgICB9CisKKyAgICBzZXA6OkJGIG5ld19ub3RfZXhwcihzZXA6OkJGICYgYXJnKQorICAgIHsKKyAgICAJaWYoIGFyZy5pc0Jvb2xlYW4oKSApCisgICAgCXsKKyAgICAJCXJldHVybiggc2VwOjpFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5vdEV4cHIoYXJnKSApOworICAgIAl9CisgICAgCXJldHVybiggTkVXX0NPREUxKE9QKE5PVCksIGFyZykgKTsKKyAgICB9CisKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gUEFSU0VSIEdMT0JBTCBWQVJJQUJMRQorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAvLyBXT2JqZWN0IE1hbmFnZXIKKyAgICBzZXA6OldPYmplY3RNYW5hZ2VyICogbVdPYmplY3RNYW5hZ2VyID0gTlVMTDsKKworICAgIC8vIEN1cnJlbnQgRGl2ZXJzaXR5IHByb2xvZ3VlIHNwZWNpZmljYXRpb24KKyAgICBzZXA6OldPYmplY3QgKiBESVZFUklUWV9QUk9MT0cgPSBzZXA6OldPYmplY3Q6Ol9OVUxMXzsKKworCisgICAgLy8gQ3VycmVudCBQYXJzZSBTeXN0ZW0KKyAgICBzdGF0aWMgc2VwOjpTeXN0ZW0gKiBfU1lTVEVNXyA9IE5VTEw7CisKKyAgICAvLyBDdXJyZW50IFBhcnNlIE1hY2hpbmUKKyAgICBzdGF0aWMgc2VwOjpNYWNoaW5lICogX0NQTV8gPSBOVUxMOworCisgICAgI2RlZmluZSBQVVNIX0NUWF9DUE0oIGNwbSApICAgc2VwOjpQYXJzZXJVdGlsOjpwdXNoQ1RYKCBfQ1BNXyA9IGNwbSApCisKKyAgICAjZGVmaW5lIFBVU0hfQ1RYX05FVyggY3BtICkgICBzZXA6OlBhcnNlclV0aWw6OnB1c2hEeW5hbWljQ1RYKCBfQ1BNXyA9IGNwbSApCisKKworICAgIC8vIEN1cnJlbnQgUGFyc2UgUm91dGluZQorICAgIHN0YXRpYyBzZXA6OlJvdXRpbmUgKiBfQ1BSXyA9IE5VTEw7CisKKyAgICAjZGVmaW5lIFBVU0hfQ1RYX0NQUiggY3ByICkgICBzZXA6OlBhcnNlclV0aWw6OnB1c2hDVFgoIF9DUFJfID0gY3ByICkKKworICAgIC8vIFBvcCBvbGQgbG9jYWwgcGFyc2UgY29udGV4dCAmIHVwZGF0ZSBjdXJyZW50IG1hY2hpbmUgJiByb3V0aW5lCisgICAgI2RlZmluZSBQT1BfQ1RYICAgICAgICAgICAgICAgc2VwOjpQYXJzZXJVdGlsOjpwb3BDVFgoIF9DUE1fICwgX0NQUl8gKQorCisgICAgI2RlZmluZSBQT1BfQ1RYX0lGKCBjcG0gKSAgIFwKKyAgICAJCWlmKCBfQ1BNXyA9PSBjcG0gKSB7IHNlcDo6UGFyc2VyVXRpbDo6cG9wQ1RYKCBfQ1BNXyAsIF9DUFJfICk7IH0KKworICAgIC8vIEN1cnJlbnQgUGFyc2UgUm91dGluZSB8IE1hY2hpbmUgfCBTeXN0ZW0KKyAgICAjZGVmaW5lIF9DUFJNU18gICggKCBfQ1BSXyAhPSBOVUxMICkgIFwKKyAgICAJCT8gc3RhdGljX2Nhc3Q8IHNlcDo6QmVoYXZpb3JhbEVsZW1lbnQgKiA+KF9DUFJfKSAgXAorICAgIAkJOiAoICggX0NQTV8gIT0gTlVMTCApICBcCisgICAgCQkJCT8gc3RhdGljX2Nhc3Q8IHNlcDo6QmVoYXZpb3JhbEVsZW1lbnQgKiA+KF9DUE1fKSAgXAorICAgIAkJCQk6IHN0YXRpY19jYXN0PCBzZXA6OkJlaGF2aW9yYWxFbGVtZW50ICogPihfU1lTVEVNXykgKSApCisKKworICAgIC8vIEN1cnJlbnQgUGFyc2UgWyBbIEZ1bGx5IF0gUXVhbGlmaWVkIF0gTmFtZSBJRAorICAgIHN0ZDo6c3RyaW5nIGNwTE9DQVRPUjsKKyAgICBzdGQ6OnZlY3Rvcjwgc3RkOjpzdHJpbmcgPiBjcFFOSUQ7CisKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gREVGQVVMVCBTVEFURSAgI2ZpbmFsLCAjdGVybWluYWwsICNyZXR1cm4KKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgc3RhdGljIHNlcDo6TGlzdE9mTWFjaGluZSBuZWVkRGVmYXVsdFN0YXRlRmluYWw7CisKKyAgICBzdGF0aWMgc2VwOjpMaXN0T2ZNYWNoaW5lIG5lZWREZWZhdWx0U3RhdGVUZXJtaW5hbDsKKworICAgIHN0YXRpYyBzZXA6Okxpc3RPZk1hY2hpbmUgbmVlZERlZmF1bHRTdGF0ZVJldHVybjsKKworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBUUkFOU0lUSU9OIElECisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIHN0YXRpYyBzZXA6OmF2bV9zaXplX3QgdHJhbnNpdGlvbl9pZCA9IDA7CisKKyAgICBzdGF0aWMgdm9pZCByZXNldFRyYW5zaXRpb25JRCgpCisgICAgeworICAgIAl0cmFuc2l0aW9uX2lkID0gMDsKKyAgICB9CisKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgbmV3VHJhbnNpdGlvbklEKAorICAgIAkJY29uc3Qgc3RkOjpzdHJpbmcgJiBpZCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBwcmVmaXggPSAidCIpCisgICAgeworICAgIAlyZXR1cm4oIGlkLmVtcHR5KCkgPworICAgIAkJCShzZXA6Ok9TUygpIDw8IHByZWZpeCA8PCAnIycgPDwgdHJhbnNpdGlvbl9pZCsrKS5zdHIoKSA6IGlkICk7CisgICAgfQorCisKKyAgICBzdGF0aWMgaW50IG1JbnZva2VOZXdJbnN0YW5jZUNvdW50ID0gMDsKKworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBuZXdJbnZva2VOZXdJbnN0YW5jZU5hbWVJRCgKKyAgICAJCXNlcDo6TWFjaGluZSAqIGNvbnRhaW5lciwgY29uc3Qgc3RkOjpzdHJpbmcgbW9kZWxOYW1lSUQpCisgICAgeworICAgIAlyZXR1cm4oIHNlcDo6T1NTKCkgPDwgbW9kZWxOYW1lSUQgPDwgJyMnIDw8IG1JbnZva2VOZXdJbnN0YW5jZUNvdW50KysgKTsKKyAgICB9CisKKworCisgICAgc3RhdGljIGludCBtUHJvY2VkdXJlQ2FsbENvdW50ID0gMDsKKworCisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIENPTk5FQ1QgSUQKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgc3RhdGljIHNlcDo6YXZtX3NpemVfdCBidWZmZXJfaWQgPSAwOworCisgICAgc3RhdGljIHZvaWQgcmVzZXRCdWZmZXJJRCgpCisgICAgeworICAgIAlidWZmZXJfaWQgPSAwOworICAgIH0KKworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBuZXdCdWZmZXJJRChjb25zdCBzdGQ6OnN0cmluZyAmIHByZWZpeCA9IHNlcDo6QnVmZmVyOjpBTk9OWU1fSUQpCisgICAgeworICAgIAlyZXR1cm4oIHNlcDo6T1NTKCkgPDwgcHJlZml4IDw8ICcjJyA8PCBidWZmZXJfaWQrKyApOworICAgIH0KKworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBDT05ORUNUIElECisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIHN0YXRpYyBzZXA6OmF2bV9zaXplX3QgY29ubmVjdG9yX2lkID0gMDsKKworICAgIHN0YXRpYyB2b2lkIHJlc2V0Q29ubmVjdElEKCkKKyAgICB7CisgICAgCWNvbm5lY3Rvcl9pZCA9IDA7CisgICAgfQorCisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIG5ld0Nvbm5lY3RJRChjb25zdCBzdGQ6OnN0cmluZyAmIGlkLAorICAgIAkJY29uc3Qgc3RkOjpzdHJpbmcgJiBwcmVmaXggPSBzZXA6OkNvbm5lY3Rvcjo6QU5PTllNX0lEKQorICAgIHsKKyAgICAJcmV0dXJuKCBpZC5lbXB0eSgpID8KKyAgICAJCQkoc2VwOjpPU1MoKSA8PCBwcmVmaXggPDwgJyMnIDw8IGNvbm5lY3Rvcl9pZCsrKS5zdHIoKSA6IGlkICk7CisgICAgfQorCisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIFBBUlNFUiBNQUNSTyBGT1IgU0VNQU5USUMgUFJFRElDQVRFIEZPUiBLRVlXT1JEIERFVEVDVElPTgorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAjZGVmaW5lIElTX0tFWVdPUkQoa3cpICAgXAorICAgIAkoIChTVFIoTFQoMSktPmdldFRleHQoTFQoMSkpLT5jaGFycykgPT0ga3cpPyBBTlRMUjNfVFJVRSA6IEFOVExSM19GQUxTRSApCisKKworCisgICAgdm9pZCBmbWxEaXNwbGF5UmVjb2duaXRpb25FcnJvcigKKyAgICAJCXBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlY29nbml6ZXIsIHBBTlRMUjNfVUlOVDggKiB0b2tlbk5hbWVzKQorICAgIHsKKyAgICAJcEFOVExSM19QQVJTRVIJCQlwYXJzZXI7CisgICAgCXBBTlRMUjNfVFJFRV9QQVJTRVIJICAgIHRwYXJzZXI7CisgICAgCXBBTlRMUjNfSU5UX1NUUkVBTQkgICAgaXM7CisgICAgCXBBTlRMUjNfU1RSSU5HCQkJdHRleHQ7CisgICAgCXBBTlRMUjNfU1RSSU5HCQkJZnRleHQ7CisgICAgCXBBTlRMUjNfRVhDRVBUSU9OCSAgICBleDsKKyAgICAJcEFOVExSM19DT01NT05fVE9LRU4gICAgdGhlVG9rZW47CisgICAgCXBBTlRMUjNfQkFTRV9UUkVFCSAgICB0aGVCYXNlVHJlZTsKKyAgICAJcEFOVExSM19DT01NT05fVFJFRQkgICAgdGhlQ29tbW9uVHJlZTsKKworICAgIAkvLyBSZXRyaWV2ZSBzb21lIGluZm8gZm9yIGVhc3kgcmVhZGluZy4KKyAgICAJLy8KKyAgICAJZXgJICAgID0JCXJlY29nbml6ZXItPnN0YXRlLT5leGNlcHRpb247CisgICAgCXR0ZXh0ICAgPQkJTlVMTDsKKworICAgIAkvLyBTZWUgaWYgdGhlcmUgaXMgYSAnZmlsZW5hbWUnIHdlIGNhbiB1c2UKKyAgICAJLy8KKyAgICAJaWYJKGV4LT5zdHJlYW1OYW1lID09IE5VTEwpCisgICAgCXsKKyAgICAJCWlmCSgoKHBBTlRMUjNfQ09NTU9OX1RPS0VOKShleC0+dG9rZW4pKS0+dHlwZSA9PSBBTlRMUjNfVE9LRU5fRU9GKQorICAgIAkJeworICAgIAkJCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgIi1lbmQgb2YgaW5wdXQtKCIpOworICAgIAkJfQorICAgIAkJZWxzZQorICAgIAkJeworICAgIAkJCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgIi11bmtub3duIHNvdXJjZS0oIik7CisgICAgCQl9CisgICAgCX0KKyAgICAJZWxzZQorICAgIAl7CisgICAgCQlmdGV4dCA9IGV4LT5zdHJlYW1OYW1lLT50bzgoZXgtPnN0cmVhbU5hbWUpOworICAgIAkJQU5UTFIzX0ZQUklOVEYoc3RkZXJyLCAiJXMoIiwgZnRleHQtPmNoYXJzKTsKKyAgICAJfQorCisgICAgCS8vIE5leHQgY29tZXMgdGhlIGxpbmUgbnVtYmVyCisgICAgCS8vCisKKyAgICAJQU5UTFIzX0ZQUklOVEYoc3RkZXJyLCAiJWQpICIsIHJlY29nbml6ZXItPnN0YXRlLT5leGNlcHRpb24tPmxpbmUpOworICAgIAlBTlRMUjNfRlBSSU5URihzdGRlcnIsICIgOiBlcnJvciAlZCA6ICVzIiwKKyAgICAJCQkJCQkJCQkJcmVjb2duaXplci0+c3RhdGUtPmV4Y2VwdGlvbi0+dHlwZSwKKyAgICAJCQkJCShwQU5UTFIzX1VJTlQ4KQkgICAocmVjb2duaXplci0+c3RhdGUtPmV4Y2VwdGlvbi0+bWVzc2FnZSkpOworCisKKyAgICAJLy8gSG93IHdlIGRldGVybWluZSB0aGUgbmV4dCBwaWVjZSBpcyBkZXBlbmRlbnQgb24gd2hpY2ggdGhpbmcgcmFpc2VkIHRoZQorICAgIAkvLyBlcnJvci4KKyAgICAJLy8KKyAgICAJc3dpdGNoCShyZWNvZ25pemVyLT50eXBlKQorICAgIAl7CisgICAgCWNhc2UJQU5UTFIzX1RZUEVfUEFSU0VSOgorCisgICAgCQkvLyBQcmVwYXJlIHRoZSBrbm93bGVkZ2Ugd2Uga25vdyB3ZSBoYXZlCisgICAgCQkvLworICAgIAkJcGFyc2VyCSAgICA9IChwQU5UTFIzX1BBUlNFUikgKHJlY29nbml6ZXItPnN1cGVyKTsKKyAgICAJCXRwYXJzZXIJICAgID0gTlVMTDsKKyAgICAJCWlzCQkJPSBwYXJzZXItPnRzdHJlYW0tPmlzdHJlYW07CisgICAgCQl0aGVUb2tlbiAgICA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTikocmVjb2duaXplci0+c3RhdGUtPmV4Y2VwdGlvbi0+dG9rZW4pOworICAgIAkJdHRleHQJICAgID0gdGhlVG9rZW4tPnRvU3RyaW5nKHRoZVRva2VuKTsKKworICAgIAkJQU5UTFIzX0ZQUklOVEYoc3RkZXJyLCAiLCBhdCBvZmZzZXQgJWQiLCByZWNvZ25pemVyLT5zdGF0ZS0+ZXhjZXB0aW9uLT5jaGFyUG9zaXRpb25JbkxpbmUpOworICAgIAkJaWYgICh0aGVUb2tlbiAhPSBOVUxMKQorICAgIAkJeworICAgIAkJCWlmICh0aGVUb2tlbi0+dHlwZSA9PSBBTlRMUjNfVE9LRU5fRU9GKQorICAgIAkJCXsKKyAgICAJCQkJQU5UTFIzX0ZQUklOVEYoc3RkZXJyLCAiLCBhdCA8RU9GPiIpOworICAgIAkJCX0KKyAgICAJCQllbHNlCisgICAgCQkJeworICAgIAkJCQkvLyBHdWFyZCBhZ2FpbnN0IG51bGwgdGV4dCBpbiBhIHRva2VuCisgICAgCQkJCS8vCisgICAgCQkJCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgIlxuICAgIE5FQVIgJXNcbiAgICAiLCB0dGV4dCA9PSBOVUxMID8gKHBBTlRMUjNfVUlOVDgpIjxubyB0ZXh0IGZvciB0aGUgdG9rZW4+IiA6IHR0ZXh0LT5jaGFycyk7CisgICAgCQkJfQorICAgIAkJfQorICAgIAkJYnJlYWs7CisKKyAgICAJY2FzZQlBTlRMUjNfVFlQRV9UUkVFX1BBUlNFUjoKKworICAgIAkJdHBhcnNlcgkJPSAocEFOVExSM19UUkVFX1BBUlNFUikgKHJlY29nbml6ZXItPnN1cGVyKTsKKyAgICAJCXBhcnNlcgkJPSBOVUxMOworICAgIAkJaXMJCQk9IHRwYXJzZXItPmN0bnN0cmVhbS0+dG5zdHJlYW0tPmlzdHJlYW07CisgICAgCQl0aGVCYXNlVHJlZQk9IChwQU5UTFIzX0JBU0VfVFJFRSkocmVjb2duaXplci0+c3RhdGUtPmV4Y2VwdGlvbi0+dG9rZW4pOworICAgIAkJdHRleHQJCT0gdGhlQmFzZVRyZWUtPnRvU3RyaW5nVHJlZSh0aGVCYXNlVHJlZSk7CisKKyAgICAJCWlmICAodGhlQmFzZVRyZWUgIT0gTlVMTCkKKyAgICAJCXsKKyAgICAJCQl0aGVDb21tb25UcmVlCT0gKHBBTlRMUjNfQ09NTU9OX1RSRUUpCSAgICB0aGVCYXNlVHJlZS0+c3VwZXI7CisKKyAgICAJCQlpZgkodGhlQ29tbW9uVHJlZSAhPSBOVUxMKQorICAgIAkJCXsKKyAgICAJCQkJdGhlVG9rZW4JPSAocEFOVExSM19DT01NT05fVE9LRU4pICAgIHRoZUJhc2VUcmVlLT5nZXRUb2tlbih0aGVCYXNlVHJlZSk7CisgICAgCQkJfQorICAgIAkJCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgIiwgYXQgb2Zmc2V0ICVkIiwgdGhlQmFzZVRyZWUtPmdldENoYXJQb3NpdGlvbkluTGluZSh0aGVCYXNlVHJlZSkpOworICAgIAkJCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgIiwgbmVhciAlcyIsIHR0ZXh0LT5jaGFycyk7CisgICAgCQl9CisgICAgCQlicmVhazsKKworICAgIAlkZWZhdWx0OgorCisgICAgCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICJCYXNlIHJlY29nbml6ZXIgZnVuY3Rpb24gZGlzcGxheVJlY29nbml0aW9uRXJyb3IgY2FsbGVkIGJ5IHVua25vd24gcGFyc2VyIHR5cGUgLSBwcm92aWRlIG92ZXJyaWRlIGZvciB0aGlzIGZ1bmN0aW9uXG4iKTsKKyAgICAJCXJldHVybjsKKyAgICAJCWJyZWFrOworICAgIAl9CisKKyAgICAJLy8gQWx0aG91Z2ggdGhpcyBmdW5jdGlvbiBzaG91bGQgZ2VuZXJhbGx5IGJlIHByb3ZpZGVkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbiwgdGhpcyBvbmUKKyAgICAJLy8gc2hvdWxkIGJlIGFzIGhlbHBmdWwgYXMgcG9zc2libGUgZm9yIGdyYW1tYXIgZGV2ZWxvcGVycyBhbmQgc2VydmUgYXMgYW4gZXhhbXBsZQorICAgIAkvLyBvZiB3aGF0IHlvdSBjYW4gZG8gd2l0aCBlYWNoIGV4Y2VwdGlvbiB0eXBlLiBJbiBnZW5lcmFsLCB3aGVuIHlvdSBtYWtlIHVwIHlvdXIKKyAgICAJLy8gJ3JlYWwnIGhhbmRsZXIsIHlvdSBzaG91bGQgZGVidWcgdGhlIHJvdXRpbmUgd2l0aCBhbGwgcG9zc2libGUgZXJyb3JzIHlvdSBleHBlY3QKKyAgICAJLy8gd2hpY2ggd2lsbCB0aGVuIGxldCB5b3UgYmUgYXMgc3BlY2lmaWMgYXMgcG9zc2libGUgYWJvdXQgYWxsIGNpcmN1bXN0YW5jZXMuCisgICAgCS8vCisgICAgCS8vIE5vdGUgdGhhdCBpbiB0aGUgZ2VuZXJhbCBjYXNlLCBlcnJvcnMgdGhyb3duIGJ5IHRyZWUgcGFyc2VycyBpbmRpY2F0ZSBhIHByb2JsZW0KKyAgICAJLy8gd2l0aCB0aGUgb3V0cHV0IG9mIHRoZSBwYXJzZXIgb3Igd2l0aCB0aGUgdHJlZSBncmFtbWFyIGl0c2VsZi4gVGhlIGpvYiBvZiB0aGUgcGFyc2VyCisgICAgCS8vIGlzIHRvIHByb2R1Y2UgYSBwZXJmZWN0IChpbiB0cmF2ZXJzYWwgdGVybXMpIHN5bnRhY3RpY2FsbHkgY29ycmVjdCB0cmVlLCBzbyBlcnJvcnMKKyAgICAJLy8gYXQgdGhhdCBzdGFnZSBzaG91bGQgcmVhbGx5IGJlIHNlbWFudGljIGVycm9ycyB0aGF0IHlvdXIgb3duIGNvZGUgZGV0ZXJtaW5lcyBhbmQgaGFuZGxlcworICAgIAkvLyBpbiB3aGF0ZXZlciB3YXkgaXMgYXBwcm9wcmlhdGUuCisgICAgCS8vCisgICAgCXN3aXRjaCAgKGV4LT50eXBlKQorICAgIAl7CisgICAgCWNhc2UJQU5UTFIzX1VOV0FOVEVEX1RPS0VOX0VYQ0VQVElPTjoKKworICAgIAkJLy8gSW5kaWNhdGVzIHRoYXQgdGhlIHJlY29nbml6ZXIgd2FzIGZlZCBhIHRva2VuIHdoaWNoIHNlZXNtIHRvIGJlCisgICAgCQkvLyBzcHVyaW91cyBpbnB1dC4gV2UgY2FuIGRldGVjdCB0aGlzIHdoZW4gdGhlIHRva2VuIHRoYXQgZm9sbG93cworICAgIAkJLy8gdGhpcyB1bndhbnRlZCB0b2tlbiB3b3VsZCBub3JtYWxseSBiZSBwYXJ0IG9mIHRoZSBzeW50YWN0aWNhbGx5CisgICAgCQkvLyBjb3JyZWN0IHN0cmVhbS4gVGhlbiB3ZSBjYW4gc2VlIHRoYXQgdGhlIHRva2VuIHdlIGFyZSBsb29raW5nIGF0CisgICAgCQkvLyBpcyBqdXN0IHNvbWV0aGluZyB0aGF0IHNob3VsZCBub3QgYmUgdGhlcmUgYW5kIHRocm93IHRoaXMgZXhjZXB0aW9uLgorICAgIAkJLy8KKyAgICAJCWlmCSh0b2tlbk5hbWVzID09IE5VTEwpCisgICAgCQl7CisgICAgCQkJQU5UTFIzX0ZQUklOVEYoc3RkZXJyLCAiIDogRXh0cmFuZW91cyBpbnB1dC4uLiIpOworICAgIAkJfQorICAgIAkJZWxzZQorICAgIAkJeworICAgIAkJCWlmCShleC0+ZXhwZWN0aW5nID09IEFOVExSM19UT0tFTl9FT0YpCisgICAgCQkJeworICAgIAkJCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICIgOiBFeHRyYW5lb3VzIGlucHV0IC0gZXhwZWN0ZWQgPEVPRj5cbiIpOworICAgIAkJCX0KKyAgICAJCQllbHNlCisgICAgCQkJeworICAgIAkJCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICIgOiBFeHRyYW5lb3VzIGlucHV0IC0gZXhwZWN0ZWQgJXMgLi4uXG4iLCB0b2tlbk5hbWVzW2V4LT5leHBlY3RpbmddKTsKKyAgICAJCQl9CisgICAgCQl9CisgICAgCQlicmVhazsKKworICAgIAljYXNlCUFOVExSM19NSVNTSU5HX1RPS0VOX0VYQ0VQVElPTjoKKworICAgIAkJLy8gSW5kaWNhdGVzIHRoYXQgdGhlIHJlY29nbml6ZXIgZGV0ZWN0ZWQgdGhhdCB0aGUgdG9rZW4gd2UganVzdAorICAgIAkJLy8gaGl0IHdvdWxkIGJlIHZhbGlkIHN5bnRhY3RpY2FsbHkgaWYgcHJlY2VlZGVkIGJ5IGEgcGFydGljdWxhcgorICAgIAkJLy8gdG9rZW4uIFBlcmhhcHMgYSBtaXNzaW5nICc7JyBhdCBsaW5lIGVuZCBvciBhIG1pc3NpbmcgJywnIGluIGFuCisgICAgCQkvLyBleHByZXNzaW9uIGxpc3QsIGFuZCBzdWNoIGxpa2UuCisgICAgCQkvLworICAgIAkJaWYJKHRva2VuTmFtZXMgPT0gTlVMTCkKKyAgICAJCXsKKyAgICAJCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICIgOiBNaXNzaW5nIHRva2VuICglZCkuLi5cbiIsIGV4LT5leHBlY3RpbmcpOworICAgIAkJfQorICAgIAkJZWxzZQorICAgIAkJeworICAgIAkJCWlmCShleC0+ZXhwZWN0aW5nID09IEFOVExSM19UT0tFTl9FT0YpCisgICAgCQkJeworICAgIAkJCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICIgOiBNaXNzaW5nIDxFT0Y+XG4iKTsKKyAgICAJCQl9CisgICAgCQkJZWxzZQorICAgIAkJCXsKKyAgICAJCQkJQU5UTFIzX0ZQUklOVEYoc3RkZXJyLCAiIDogTWlzc2luZyAlcyBcbiIsIHRva2VuTmFtZXNbZXgtPmV4cGVjdGluZ10pOworICAgIAkJCX0KKyAgICAJCX0KKyAgICAJCWJyZWFrOworCisgICAgCWNhc2UJQU5UTFIzX1JFQ09HTklUSU9OX0VYQ0VQVElPTjoKKworICAgIAkJLy8gSW5kaWNhdGVzIHRoYXQgdGhlIHJlY29nbml6ZXIgcmVjZWl2ZWQgYSB0b2tlbgorICAgIAkJLy8gaW4gdGhlIGlucHV0IHRoYXQgd2FzIG5vdCBwcmVkaWN0ZWQuIFRoaXMgaXMgdGhlIGJhc2ljIGV4Y2VwdGlvbiB0eXBlCisgICAgCQkvLyBmcm9tIHdoaWNoIGFsbCBvdGhlcnMgYXJlIGRlcml2ZWQuIFNvIHdlIGFzc3VtZSBpdCB3YXMgYSBzeW50YXggZXJyb3IuCisgICAgCQkvLyBZb3UgbWF5IGdldCB0aGlzIGlmIHRoZXJlIGFyZSBub3QgbW9yZSB0b2tlbnMgYW5kIG1vcmUgYXJlIG5lZWRlZAorICAgIAkJLy8gdG8gY29tcGxldGUgYSBwYXJzZSBmb3IgaW5zdGFuY2UuCisgICAgCQkvLworICAgIAkJQU5UTFIzX0ZQUklOVEYoc3RkZXJyLCAiIDogc3ludGF4IGVycm9yLi4uXG4iKTsKKyAgICAJCWJyZWFrOworCisgICAgCWNhc2UgICAgQU5UTFIzX01JU01BVENIRURfVE9LRU5fRVhDRVBUSU9OOgorCisgICAgCQkvLyBXZSB3ZXJlIGV4cGVjdGluZyB0byBzZWUgb25lIHRoaW5nIGFuZCBnb3QgYW5vdGhlci4gVGhpcyBpcyB0aGUKKyAgICAJCS8vIG1vc3QgY29tbW9uIGVycm9yIGlmIHdlIGNvdWRsIG5vdCBkZXRlY3QgYSBtaXNzaW5nIG9yIHVud2FudGVkIHRva2VuLgorICAgIAkJLy8gSGVyZSB5b3UgY2FuIHNwZW5kIHlvdXIgZWZmb3J0cyB0bworICAgIAkJLy8gZGVyaXZlIG1vcmUgdXNlZnVsIGVycm9yIG1lc3NhZ2VzIGJhc2VkIG9uIHRoZSBleHBlY3RlZAorICAgIAkJLy8gdG9rZW4gc2V0IGFuZCB0aGUgbGFzdCB0b2tlbiBhbmQgc28gb24uIFRoZSBlcnJvciBmb2xsb3dpbmcKKyAgICAJCS8vIGJpdG1hcHMgZG8gYSBnb29kIGpvYiBvZiByZWR1Y2luZyB0aGUgc2V0IHRoYXQgd2Ugd2VyZSBsb29raW5nCisgICAgCQkvLyBmb3IgZG93biB0byBzb21ldGhpbmcgc21hbGwuIEtub3dpbmcgd2hhdCB5b3UgYXJlIHBhcnNpbmcgbWF5IGJlCisgICAgCQkvLyBhYmxlIHRvIGFsbG93IHlvdSB0byBiZSBldmVuIG1vcmUgc3BlY2lmaWMgYWJvdXQgYW4gZXJyb3IuCisgICAgCQkvLworICAgIAkJaWYJKHRva2VuTmFtZXMgPT0gTlVMTCkKKyAgICAJCXsKKyAgICAJCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICIgOiBzeW50YXggZXJyb3IuLi5cbiIpOworICAgIAkJfQorICAgIAkJZWxzZQorICAgIAkJeworICAgIAkJCWlmCShleC0+ZXhwZWN0aW5nID09IEFOVExSM19UT0tFTl9FT0YpCisgICAgCQkJeworICAgIAkJCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICIgOiBleHBlY3RlZCA8RU9GPlxuIik7CisgICAgCQkJfQorICAgIAkJCWVsc2UKKyAgICAJCQl7CisgICAgCQkJCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgIiA6IGV4cGVjdGVkICVzIC4uLlxuIiwgdG9rZW5OYW1lc1tleC0+ZXhwZWN0aW5nXSk7CisgICAgCQkJfQorICAgIAkJfQorICAgIAkJYnJlYWs7CisKKyAgICAJY2FzZQlBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT046CisKKyAgICAJCS8vIFdlIGNvdWxkIG5vdCBwaWNrIGFueSBhbHQgZGVjaXNpb24gZnJvbSB0aGUgaW5wdXQgZ2l2ZW4KKyAgICAJCS8vIHNvIGdvZCBrbm93cyB3aGF0IGhhcHBlbmVkIC0gaG93ZXZlciB3aGVuIHlvdSBleGFtaW5lIHlvdXIgZ3JhbW1hciwKKyAgICAJCS8vIHlvdSBzaG91bGQuIEl0IG1lYW5zIHRoYXQgYXQgdGhlIHBvaW50IHdoZXJlIHRoZSBjdXJyZW50IHRva2VuIG9jY3VycmVkCisgICAgCQkvLyB0aGF0IHRoZSBERkEgaW5kaWNhdGVzIG5vd2hlcmUgdG8gZ28gZnJvbSBoZXJlLgorICAgIAkJLy8KKyAgICAJCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgIiA6IGNhbm5vdCBtYXRjaCB0byBhbnkgcHJlZGljdGVkIGlucHV0Li4uXG4iKTsKKworICAgIAkJYnJlYWs7CisKKyAgICAJY2FzZQlBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfRVhDRVBUSU9OOgorCisgICAgCQl7CisgICAgCQkJQU5UTFIzX1VJTlQzMgkgIGNvdW50OworICAgIAkJCUFOVExSM19VSU5UMzIJICBiaXQ7CisgICAgCQkJQU5UTFIzX1VJTlQzMgkgIHNpemU7CisgICAgCQkJQU5UTFIzX1VJTlQzMgkgIG51bWJpdHM7CisgICAgCQkJcEFOVExSM19CSVRTRVQJICBlcnJCaXRzOworCisgICAgCQkJLy8gVGhpcyBtZWFucyB3ZSB3ZXJlIGFibGUgdG8gZGVhbCB3aXRoIG9uZSBvZiBhIHNldCBvZgorICAgIAkJCS8vIHBvc3NpYmxlIHRva2VucyBhdCB0aGlzIHBvaW50LCBidXQgd2UgZGlkIG5vdCBzZWUgYW55CisgICAgCQkJLy8gbWVtYmVyIG9mIHRoYXQgc2V0LgorICAgIAkJCS8vCisgICAgCQkJQU5UTFIzX0ZQUklOVEYoc3RkZXJyLCAiIDogdW5leHBlY3RlZCBpbnB1dC4uLlxuICBleHBlY3RlZCBvbmUgb2YgOiAiKTsKKworICAgIAkJCS8vIFdoYXQgdG9rZW5zIGNvdWxkIHdlIGhhdmUgYWNjZXB0ZWQgYXQgdGhpcyBwb2ludCBpbiB0aGUKKyAgICAJCQkvLyBwYXJzZT8KKyAgICAJCQkvLworICAgIAkJCWNvdW50ICAgPSAwOworICAgIAkJCWVyckJpdHMgPSBhbnRscjNCaXRzZXRMb2FkCQkoZXgtPmV4cGVjdGluZ1NldCk7CisgICAgCQkJbnVtYml0cyA9IGVyckJpdHMtPm51bUJpdHMJCShlcnJCaXRzKTsKKyAgICAJCQlzaXplICAgID0gZXJyQml0cy0+c2l6ZQkJCShlcnJCaXRzKTsKKworICAgIAkJCWlmICAoc2l6ZSA+IDApCisgICAgCQkJeworICAgIAkJCQkvLyBIb3dldmVyIG1hbnkgdG9rZW5zIHdlIGNvdWxkIGhhdmUgZGVhbHQgd2l0aCBoZXJlLCBpdCBpcyB1c3VhbGx5CisgICAgCQkJCS8vIG5vdCB1c2VmdWwgdG8gcHJpbnQgQUxMIG9mIHRoZSBzZXQgaGVyZS4gSSBhcmJpdHJhcmlseSBjaG9zZSA4CisgICAgCQkJCS8vIGhlcmUsIGJ1dCB5b3Ugc2hvdWxkIGRvIHdoYXRldmVyIG1ha2VzIHNlbnNlIGZvciB5b3Ugb2YgY291cnNlLgorICAgIAkJCQkvLyBObyB0b2tlbiBudW1iZXIgMCwgc28gbG9vayBmb3IgYml0IDEgYW5kIG9uLgorICAgIAkJCQkvLworICAgIAkJCQlmb3IJKGJpdCA9IDE7IGJpdCA8IG51bWJpdHMgJiYgY291bnQgPCA4ICYmIGNvdW50IDwgc2l6ZTsgYml0KyspCisgICAgCQkJCXsKKyAgICAJCQkJCS8vIFRPRE86IFRoaXMgZG9lc247dCBsb29rIHJpZ2h0IC0gc2hvdWxkIGJlIGFza2luZyBpZiB0aGUgYml0IGlzIHNldCEhCisgICAgCQkJCQkvLworICAgIAkJCQkJaWYgICh0b2tlbk5hbWVzW2JpdF0pCisgICAgCQkJCQl7CisgICAgCQkJCQkJQU5UTFIzX0ZQUklOVEYoc3RkZXJyLCAiJXMlcyIsIGNvdW50ID4gMCA/ICIsICIgOiAiIiwgdG9rZW5OYW1lc1tiaXRdKTsKKyAgICAJCQkJCQljb3VudCsrOworICAgIAkJCQkJfQorICAgIAkJCQl9CisgICAgCQkJCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgIlxuIik7CisgICAgCQkJfQorICAgIAkJCWVsc2UKKyAgICAJCQl7CisgICAgCQkJCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgIkFjdHVhbGx5IGR1ZGUsIHdlIGRpZG4ndCBzZWVtIHRvIGJlIGV4cGVjdGluZyBhbnl0aGluZyBoZXJlLCBvciBhdCBsZWFzdFxuIik7CisgICAgCQkJCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgIkkgY291bGQgbm90IHdvcmsgb3V0IHdoYXQgSSB3YXMgZXhwZWN0aW5nLCBsaWtlIHNvIG1hbnkgb2YgdXMgdGhlc2UgZGF5cyFcbiIpOworICAgIAkJCX0KKyAgICAJCX0KKyAgICAJCWJyZWFrOworCisgICAgCWNhc2UJQU5UTFIzX0VBUkxZX0VYSVRfRVhDRVBUSU9OOgorCisgICAgCQkvLyBXZSBlbnRlcmVkIGEgbG9vcCByZXF1aXJpbmcgYSBudW1iZXIgb2YgdG9rZW4gc2VxdWVuY2VzCisgICAgCQkvLyBidXQgZm91bmQgYSB0b2tlbiB0aGF0IGVuZGVkIHRoYXQgc2VxdWVuY2UgZWFybGllciB0aGFuCisgICAgCQkvLyB3ZSBzaG91bGQgaGF2ZSBkb25lLgorICAgIAkJLy8KKyAgICAJCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgIiA6IG1pc3NpbmcgZWxlbWVudHMuLi5cbiIpOworICAgIAkJYnJlYWs7CisKKyAgICAJZGVmYXVsdDoKKworICAgIAkJLy8gV2UgZG9uJ3QgaGFuZGxlIGFueSBvdGhlciBleGNlcHRpb25zIGhlcmUsIGJ1dCB5b3UgY2FuCisgICAgCQkvLyBpZiB5b3Ugd2lzaC4gSWYgd2UgZ2V0IGFuIGV4Y2VwdGlvbiB0aGF0IGhpdHMgdGhpcyBwb2ludAorICAgIAkJLy8gdGhlbiB3ZSBhcmUganVzdCBnb2luZyB0byByZXBvcnQgd2hhdCB3ZSBrbm93IGFib3V0IHRoZQorICAgIAkJLy8gdG9rZW4uCisgICAgCQkvLworICAgIAkJQU5UTFIzX0ZQUklOVEYoc3RkZXJyLCAiIDogc3ludGF4IG5vdCByZWNvZ25pemVkLi4uXG4iKTsKKyAgICAJCWJyZWFrOworICAgIAl9CisKKyAgICAJLy8gSGVyZSB5b3UgaGF2ZSB0aGUgdG9rZW4gdGhhdCB3YXMgaW4gZXJyb3Igd2hpY2ggaWYgdGhpcyBpcworICAgIAkvLyB0aGUgc3RhbmRhcmQgaW1wbGVtZW50YXRpb24gd2lsbCB0ZWxsIHlvdSB0aGUgbGluZSBhbmQgb2Zmc2V0CisgICAgCS8vIGFuZCBhbHNvIHJlY29yZCB0aGUgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIGxpbmUgaW4gdGhlCisgICAgCS8vIGlucHV0IHN0cmVhbS4gWW91IGNvdWxkIHRoZXJlZm9yZSBwcmludCB0aGUgc291cmNlIGxpbmUgYW5kIHNvIG9uLgorICAgIAkvLyBHZW5lcmFsbHkgdGhvdWdoLCBJIHdvdWxkIGV4cGVjdCB0aGF0IHlvdXIgbGV4ZXIvcGFyc2VyIHdpbGwga2VlcAorICAgIAkvLyBpdHMgb3duIG1hcCBvZiBsaW5lcyBhbmQgc291cmNlIHBvaW50ZXJzIG9yIHdoYXRldmVyIGFzIHRoZXJlCisgICAgCS8vIGFyZSBhIGxvdCBvZiBzcGVjaWZpYyB0aGluZ3MgeW91IG5lZWQgdG8ga25vdyBhYm91dCB0aGUgaW5wdXQKKyAgICAJLy8gdG8gZG8gc29tZXRoaW5nIGxpa2UgdGhhdC4KKyAgICAJLy8gSGVyZSBpcyB3aGVyZSB5b3UgZG8gaXQgdGhvdWdoIDotKS4KKyAgICAJLy8KKyAgICB9CisKKworCisKKy8qIERlY2xhcmUgdGhlIGJpdHNldHMKKyAqLworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfcHJvbG9ndWVfZm1sX2luX2Zvcm1hbE1MOTAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3Byb2xvZ3VlX2ZtbF9pbl9mb3JtYWxNTDkwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwNDA0MDAwMDAwMDEwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMjAwMDAwMDA0KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwNDAwMjQwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3Byb2xvZ3VlX2ZtbF9pbl9mb3JtYWxNTDkwCT0geyBGT0xMT1dfcHJvbG9ndWVfZm1sX2luX2Zvcm1hbE1MOTBfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX3N5c3RlbV9pbl9mb3JtYWxNTDk5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWZfc3lzdGVtX2luX2Zvcm1hbE1MOTlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX3N5c3RlbV9pbl9mb3JtYWxNTDk5CT0geyBGT0xMT1dfZGVmX3N5c3RlbV9pbl9mb3JtYWxNTDk5X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzE4Nl9pbl9wcm9sb2d1ZV9mbWwxMzEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzE4Nl9pbl9wcm9sb2d1ZV9mbWwxMzFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMTg2X2luX3Byb2xvZ3VlX2ZtbDEzMQk9IHsgRk9MTE9XXzE4Nl9pbl9wcm9sb2d1ZV9mbWwxMzFfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjMzX2luX3Byb2xvZ3VlX2ZtbDE0MSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjMzX2luX3Byb2xvZ3VlX2ZtbDE0MV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yMzNfaW5fcHJvbG9ndWVfZm1sMTQxCT0geyBGT0xMT1dfMjMzX2luX3Byb2xvZ3VlX2ZtbDE0MV9iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18xODVfaW5fcHJvbG9ndWVfZm1sMTU1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18xODVfaW5fcHJvbG9ndWVfZm1sMTU1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE4NV9pbl9wcm9sb2d1ZV9mbWwxNTUJPSB7IEZPTExPV18xODVfaW5fcHJvbG9ndWVfZm1sMTU1X2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzE4MF9pbl9wcm9sb2d1ZV9mbWwxNzAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzE4MF9pbl9wcm9sb2d1ZV9mbWwxNzBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMTgwX2luX3Byb2xvZ3VlX2ZtbDE3MAk9IHsgRk9MTE9XXzE4MF9pbl9wcm9sb2d1ZV9mbWwxNzBfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjM1X2luX3Byb2xvZ3VlX2ZtbDE3OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjM1X2luX3Byb2xvZ3VlX2ZtbDE3OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yMzVfaW5fcHJvbG9ndWVfZm1sMTc5CT0geyBGT0xMT1dfMjM1X2luX3Byb2xvZ3VlX2ZtbDE3OV9iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yMzRfaW5fcHJvbG9ndWVfZm1sMTkzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yMzRfaW5fcHJvbG9ndWVfZm1sMTkzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzIzNF9pbl9wcm9sb2d1ZV9mbWwxOTMJPSB7IEZPTExPV18yMzRfaW5fcHJvbG9ndWVfZm1sMTkzX2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xUX19pbl9wcm9sb2d1ZV9mbWwyMTcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xUX19pbl9wcm9sb2d1ZV9mbWwyMTdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA0MDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwNDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTFRfX2luX3Byb2xvZ3VlX2ZtbDIxNwk9IHsgRk9MTE9XX0xUX19pbl9wcm9sb2d1ZV9mbWwyMTdfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzkwX2luX3Byb2xvZ3VlX2ZtbDIyNiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzkwX2luX3Byb2xvZ3VlX2ZtbDIyNl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDgwMDAxMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zOTBfaW5fcHJvbG9ndWVfZm1sMjI2CT0geyBGT0xMT1dfMzkwX2luX3Byb2xvZ3VlX2ZtbDIyNl9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zNDJfaW5fcHJvbG9ndWVfZm1sMjM5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zNDJfaW5fcHJvbG9ndWVfZm1sMjM5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwODAwMDEwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzM0Ml9pbl9wcm9sb2d1ZV9mbWwyMzkJPSB7IEZPTExPV18zNDJfaW5fcHJvbG9ndWVfZm1sMjM5X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lEX2luX3Byb2xvZ3VlX2ZtbDI1MyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfSURfaW5fcHJvbG9ndWVfZm1sMjUzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwODAwMDEwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0lEX2luX3Byb2xvZ3VlX2ZtbDI1Mwk9IHsgRk9MTE9XX0lEX2luX3Byb2xvZ3VlX2ZtbDI1M19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19BU1NJR05faW5fcHJvbG9ndWVfZm1sMjc2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19BU1NJR05faW5fcHJvbG9ndWVfZm1sMjc2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0FTU0lHTl9pbl9wcm9sb2d1ZV9mbWwyNzYJPSB7IEZPTExPV19BU1NJR05faW5fcHJvbG9ndWVfZm1sMjc2X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lEX2luX3Byb2xvZ3VlX2ZtbDI4MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfSURfaW5fcHJvbG9ndWVfZm1sMjgwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwODAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0lEX2luX3Byb2xvZ3VlX2ZtbDI4MAk9IHsgRk9MTE9XX0lEX2luX3Byb2xvZ3VlX2ZtbDI4MF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19DT01NQV9pbl9wcm9sb2d1ZV9mbWwyOTkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0NPTU1BX2luX3Byb2xvZ3VlX2ZtbDI5OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDA4MDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19DT01NQV9pbl9wcm9sb2d1ZV9mbWwyOTkJPSB7IEZPTExPV19DT01NQV9pbl9wcm9sb2d1ZV9mbWwyOTlfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2V0X2luX3Byb2xvZ3VlX2ZtbDMwMSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2V0X2luX3Byb2xvZ3VlX2ZtbDMwMV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDgwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZXRfaW5fcHJvbG9ndWVfZm1sMzAxCT0geyBGT0xMT1dfc2V0X2luX3Byb2xvZ3VlX2ZtbDMwMV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19HVF9pbl9wcm9sb2d1ZV9mbWwzMjEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0dUX2luX3Byb2xvZ3VlX2ZtbDMyMV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDIwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19HVF9pbl9wcm9sb2d1ZV9mbWwzMjEJPSB7IEZPTExPV19HVF9pbl9wcm9sb2d1ZV9mbWwzMjFfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfQ09MT05faW5fcHJvbG9ndWVfZm1sMzI2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19DT0xPTl9pbl9wcm9sb2d1ZV9mbWwzMjZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDIwMDAwMTQwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQ09MT05faW5fcHJvbG9ndWVfZm1sMzI2CT0geyBGT0xMT1dfQ09MT05faW5fcHJvbG9ndWVfZm1sMzI2X2JpdHMsIDQJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3Byb2xvZ3VlX2F0dHJpYnV0ZV9pbl9wcm9sb2d1ZV9mbWwzMzMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3Byb2xvZ3VlX2F0dHJpYnV0ZV9pbl9wcm9sb2d1ZV9mbWwzMzNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDQwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfcHJvbG9ndWVfYXR0cmlidXRlX2luX3Byb2xvZ3VlX2ZtbDMzMwk9IHsgRk9MTE9XX3Byb2xvZ3VlX2F0dHJpYnV0ZV9pbl9wcm9sb2d1ZV9mbWwzMzNfYml0cywgNAl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfcHJvbG9ndWVfb3B0aW9uc19pbl9wcm9sb2d1ZV9mbWwzNDMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3Byb2xvZ3VlX29wdGlvbnNfaW5fcHJvbG9ndWVfZm1sMzQzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3Byb2xvZ3VlX29wdGlvbnNfaW5fcHJvbG9ndWVfZm1sMzQzCT0geyBGT0xMT1dfcHJvbG9ndWVfb3B0aW9uc19pbl9wcm9sb2d1ZV9mbWwzNDNfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjA4X2luX3Byb2xvZ3VlX2F0dHJpYnV0ZTM1OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjA4X2luX3Byb2xvZ3VlX2F0dHJpYnV0ZTM1OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAxMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yMDhfaW5fcHJvbG9ndWVfYXR0cmlidXRlMzU4CT0geyBGT0xMT1dfMjA4X2luX3Byb2xvZ3VlX2F0dHJpYnV0ZTM1OF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19BU1NJR05faW5fcHJvbG9ndWVfYXR0cmlidXRlMzYxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19BU1NJR05faW5fcHJvbG9ndWVfYXR0cmlidXRlMzYxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0FTU0lHTl9pbl9wcm9sb2d1ZV9hdHRyaWJ1dGUzNjEJPSB7IEZPTExPV19BU1NJR05faW5fcHJvbG9ndWVfYXR0cmlidXRlMzYxX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lEX2luX3Byb2xvZ3VlX2F0dHJpYnV0ZTM2NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfSURfaW5fcHJvbG9ndWVfYXR0cmlidXRlMzY2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0lEX2luX3Byb2xvZ3VlX2F0dHJpYnV0ZTM2Ngk9IHsgRk9MTE9XX0lEX2luX3Byb2xvZ3VlX2F0dHJpYnV0ZTM2Nl9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TRU1JX2luX3Byb2xvZ3VlX2F0dHJpYnV0ZTM2OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU0VNSV9pbl9wcm9sb2d1ZV9hdHRyaWJ1dGUzNjlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU0VNSV9pbl9wcm9sb2d1ZV9hdHRyaWJ1dGUzNjkJPSB7IEZPTExPV19TRU1JX2luX3Byb2xvZ3VlX2F0dHJpYnV0ZTM2OV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yMjlfaW5fcHJvbG9ndWVfYXR0cmlidXRlMzc4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yMjlfaW5fcHJvbG9ndWVfYXR0cmlidXRlMzc4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDEwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzIyOV9pbl9wcm9sb2d1ZV9hdHRyaWJ1dGUzNzgJPSB7IEZPTExPV18yMjlfaW5fcHJvbG9ndWVfYXR0cmlidXRlMzc4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0FTU0lHTl9pbl9wcm9sb2d1ZV9hdHRyaWJ1dGUzODEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0FTU0lHTl9pbl9wcm9sb2d1ZV9hdHRyaWJ1dGUzODFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQVNTSUdOX2luX3Byb2xvZ3VlX2F0dHJpYnV0ZTM4MQk9IHsgRk9MTE9XX0FTU0lHTl9pbl9wcm9sb2d1ZV9hdHRyaWJ1dGUzODFfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfSURfaW5fcHJvbG9ndWVfYXR0cmlidXRlMzg2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19JRF9pbl9wcm9sb2d1ZV9hdHRyaWJ1dGUzODZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfSURfaW5fcHJvbG9ndWVfYXR0cmlidXRlMzg2CT0geyBGT0xMT1dfSURfaW5fcHJvbG9ndWVfYXR0cmlidXRlMzg2X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1NFTUlfaW5fcHJvbG9ndWVfYXR0cmlidXRlMzg5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19TRU1JX2luX3Byb2xvZ3VlX2F0dHJpYnV0ZTM4OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19TRU1JX2luX3Byb2xvZ3VlX2F0dHJpYnV0ZTM4OQk9IHsgRk9MTE9XX1NFTUlfaW5fcHJvbG9ndWVfYXR0cmlidXRlMzg5X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzIwNl9pbl9wcm9sb2d1ZV9vcHRpb25zNDA0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yMDZfaW5fcHJvbG9ndWVfb3B0aW9uczQwNF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMSkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yMDZfaW5fcHJvbG9ndWVfb3B0aW9uczQwNAk9IHsgRk9MTE9XXzIwNl9pbl9wcm9sb2d1ZV9vcHRpb25zNDA0X2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xDVVJMWV9pbl9wcm9sb2d1ZV9vcHRpb25zNDA3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MQ1VSTFlfaW5fcHJvbG9ndWVfb3B0aW9uczQwN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjAwMDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MQ1VSTFlfaW5fcHJvbG9ndWVfb3B0aW9uczQwNwk9IHsgRk9MTE9XX0xDVVJMWV9pbl9wcm9sb2d1ZV9vcHRpb25zNDA3X2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lEX2luX3Byb2xvZ3VlX29wdGlvbnM0MTcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0lEX2luX3Byb2xvZ3VlX29wdGlvbnM0MTdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMTApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfSURfaW5fcHJvbG9ndWVfb3B0aW9uczQxNwk9IHsgRk9MTE9XX0lEX2luX3Byb2xvZ3VlX29wdGlvbnM0MTdfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfQVNTSUdOX2luX3Byb2xvZ3VlX29wdGlvbnM0MTkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0FTU0lHTl9pbl9wcm9sb2d1ZV9vcHRpb25zNDE5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0FTU0lHTl9pbl9wcm9sb2d1ZV9vcHRpb25zNDE5CT0geyBGT0xMT1dfQVNTSUdOX2luX3Byb2xvZ3VlX29wdGlvbnM0MTlfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9wcm9sb2d1ZV9vcHRpb25zNDIzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX3Byb2xvZ3VlX29wdGlvbnM0MjNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9wcm9sb2d1ZV9vcHRpb25zNDIzCT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9wcm9sb2d1ZV9vcHRpb25zNDIzX2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1NFTUlfaW5fcHJvbG9ndWVfb3B0aW9uczQyNSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU0VNSV9pbl9wcm9sb2d1ZV9vcHRpb25zNDI1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1NFTUlfaW5fcHJvbG9ndWVfb3B0aW9uczQyNQk9IHsgRk9MTE9XX1NFTUlfaW5fcHJvbG9ndWVfb3B0aW9uczQyNV9iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19SQ1VSTFlfaW5fcHJvbG9ndWVfb3B0aW9uczQ0NCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfUkNVUkxZX2luX3Byb2xvZ3VlX29wdGlvbnM0NDRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUkNVUkxZX2luX3Byb2xvZ3VlX29wdGlvbnM0NDQJPSB7IEZPTExPV19SQ1VSTFlfaW5fcHJvbG9ndWVfb3B0aW9uczQ0NF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yODJfaW5fbW9kaWZpZXJfZGVjbGFyYXRpb240NjcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzI4Ml9pbl9tb2RpZmllcl9kZWNsYXJhdGlvbjQ2N19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwODAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMjA0MDAwNDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MTAwMDEyMDgyMDIwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDA0MDQwMDgwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yODJfaW5fbW9kaWZpZXJfZGVjbGFyYXRpb240NjcJPSB7IEZPTExPV18yODJfaW5fbW9kaWZpZXJfZGVjbGFyYXRpb240NjdfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzgwX2luX21vZGlmaWVyX2RlY2xhcmF0aW9uNDg2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zODBfaW5fbW9kaWZpZXJfZGVjbGFyYXRpb240ODZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDgwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDIwNDAwMDQwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDEwMDAxMjA4MjAyMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwNDA0MDA4MDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzgwX2luX21vZGlmaWVyX2RlY2xhcmF0aW9uNDg2CT0geyBGT0xMT1dfMzgwX2luX21vZGlmaWVyX2RlY2xhcmF0aW9uNDg2X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzQxNF9pbl9tb2RpZmllcl9kZWNsYXJhdGlvbjUwMyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfNDE0X2luX21vZGlmaWVyX2RlY2xhcmF0aW9uNTAzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA4MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAyMDQwMDA0MDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgxMDAwMTIwODIwMjAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDQwNDAwODAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzQxNF9pbl9tb2RpZmllcl9kZWNsYXJhdGlvbjUwMwk9IHsgRk9MTE9XXzQxNF9pbl9tb2RpZmllcl9kZWNsYXJhdGlvbjUwM19iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zOTVfaW5fbW9kaWZpZXJfZGVjbGFyYXRpb241MTcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzM5NV9pbl9tb2RpZmllcl9kZWNsYXJhdGlvbjUxN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwODAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMjA0MDAwNDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MTAwMDEyMDgyMDIwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDA0MDQwMDgwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zOTVfaW5fbW9kaWZpZXJfZGVjbGFyYXRpb241MTcJPSB7IEZPTExPV18zOTVfaW5fbW9kaWZpZXJfZGVjbGFyYXRpb241MTdfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfNDA2X2luX21vZGlmaWVyX2RlY2xhcmF0aW9uNTMxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV180MDZfaW5fbW9kaWZpZXJfZGVjbGFyYXRpb241MzFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDgwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDIwNDAwMDQwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDEwMDAxMjA4MjAyMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwNDA0MDA4MDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfNDA2X2luX21vZGlmaWVyX2RlY2xhcmF0aW9uNTMxCT0geyBGT0xMT1dfNDA2X2luX21vZGlmaWVyX2RlY2xhcmF0aW9uNTMxX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzM2MV9pbl9tb2RpZmllcl9kZWNsYXJhdGlvbjU0OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzYxX2luX21vZGlmaWVyX2RlY2xhcmF0aW9uNTQ4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA4MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAyMDQwMDA0MDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgxMDAwMTIwODIwMjAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDQwNDAwODAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzM2MV9pbl9tb2RpZmllcl9kZWNsYXJhdGlvbjU0OAk9IHsgRk9MTE9XXzM2MV9pbl9tb2RpZmllcl9kZWNsYXJhdGlvbjU0OF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yNDNfaW5fbW9kaWZpZXJfZGVjbGFyYXRpb241NjkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzI0M19pbl9tb2RpZmllcl9kZWNsYXJhdGlvbjU2OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwODAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMjA0MDAwNDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MTAwMDEyMDgyMDIwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDA0MDQwMDgwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yNDNfaW5fbW9kaWZpZXJfZGVjbGFyYXRpb241NjkJPSB7IEZPTExPV18yNDNfaW5fbW9kaWZpZXJfZGVjbGFyYXRpb241NjlfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzU1X2luX21vZGlmaWVyX2RlY2xhcmF0aW9uNTg4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zNTVfaW5fbW9kaWZpZXJfZGVjbGFyYXRpb241ODhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDgwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDIwNDAwMDQwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDEwMDAxMjA4MjAyMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwNDA0MDA4MDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzU1X2luX21vZGlmaWVyX2RlY2xhcmF0aW9uNTg4CT0geyBGT0xMT1dfMzU1X2luX21vZGlmaWVyX2RlY2xhcmF0aW9uNTg4X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzM0OV9pbl9tb2RpZmllcl9kZWNsYXJhdGlvbjYwNSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzQ5X2luX21vZGlmaWVyX2RlY2xhcmF0aW9uNjA1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA4MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAyMDQwMDA0MDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgxMDAwMTIwODIwMjAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDQwNDAwODAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzM0OV9pbl9tb2RpZmllcl9kZWNsYXJhdGlvbjYwNQk9IHsgRk9MTE9XXzM0OV9pbl9tb2RpZmllcl9kZWNsYXJhdGlvbjYwNV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19tb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0X2luX21vZGlmaWVyX2RlY2xhcmF0aW9uNjIxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19tb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0X2luX21vZGlmaWVyX2RlY2xhcmF0aW9uNjIxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA4MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAyMDQwMDA0MDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgxMDAwMTIwODIwMjAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDQwNDAwODAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX21vZGlmaWVyX3NldF9kaXJlY3Rpb25fc3RyaWN0X3RleHRfaW5fbW9kaWZpZXJfZGVjbGFyYXRpb242MjEJPSB7IEZPTExPV19tb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0X2luX21vZGlmaWVyX2RlY2xhcmF0aW9uNjIxX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3NldF9pbl9tb2RpZmllcl9kaXJlY3Rpb242NDUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NldF9pbl9tb2RpZmllcl9kaXJlY3Rpb242NDVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2V0X2luX21vZGlmaWVyX2RpcmVjdGlvbjY0NQk9IHsgRk9MTE9XX3NldF9pbl9tb2RpZmllcl9kaXJlY3Rpb242NDVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2V0X2luX21vZGlmaWVyX2RpcmVjdGlvbjY2OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2V0X2luX21vZGlmaWVyX2RpcmVjdGlvbjY2OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZXRfaW5fbW9kaWZpZXJfZGlyZWN0aW9uNjY4CT0geyBGT0xMT1dfc2V0X2luX21vZGlmaWVyX2RpcmVjdGlvbjY2OF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zZXRfaW5fbW9kaWZpZXJfZGlyZWN0aW9uNjg5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zZXRfaW5fbW9kaWZpZXJfZGlyZWN0aW9uNjg5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3NldF9pbl9tb2RpZmllcl9kaXJlY3Rpb242ODkJPSB7IEZPTExPV19zZXRfaW5fbW9kaWZpZXJfZGlyZWN0aW9uNjg5X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3NldF9pbl9tb2RpZmllcl9kaXJlY3Rpb243MTQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NldF9pbl9tb2RpZmllcl9kaXJlY3Rpb243MTRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2V0X2luX21vZGlmaWVyX2RpcmVjdGlvbjcxNAk9IHsgRk9MTE9XX3NldF9pbl9tb2RpZmllcl9kaXJlY3Rpb243MTRfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2V0X2luX21vZGlmaWVyX2RpcmVjdGlvbl90ZXh0NzQ5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zZXRfaW5fbW9kaWZpZXJfZGlyZWN0aW9uX3RleHQ3NDlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2V0X2luX21vZGlmaWVyX2RpcmVjdGlvbl90ZXh0NzQ5CT0geyBGT0xMT1dfc2V0X2luX21vZGlmaWVyX2RpcmVjdGlvbl90ZXh0NzQ5X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3NldF9pbl9tb2RpZmllcl9kaXJlY3Rpb25fdGV4dDc2NyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2V0X2luX21vZGlmaWVyX2RpcmVjdGlvbl90ZXh0NzY3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3NldF9pbl9tb2RpZmllcl9kaXJlY3Rpb25fdGV4dDc2Nwk9IHsgRk9MTE9XX3NldF9pbl9tb2RpZmllcl9kaXJlY3Rpb25fdGV4dDc2N19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yOThfaW5fbW9kaWZpZXJfZGlyZWN0aW9uX3RleHQ3ODUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzI5OF9pbl9tb2RpZmllcl9kaXJlY3Rpb25fdGV4dDc4NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yOThfaW5fbW9kaWZpZXJfZGlyZWN0aW9uX3RleHQ3ODUJPSB7IEZPTExPV18yOThfaW5fbW9kaWZpZXJfZGlyZWN0aW9uX3RleHQ3ODVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzY0X2luX21vZGlmaWVyX2RpcmVjdGlvbl90ZXh0ODA2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zNjRfaW5fbW9kaWZpZXJfZGlyZWN0aW9uX3RleHQ4MDZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzY0X2luX21vZGlmaWVyX2RpcmVjdGlvbl90ZXh0ODA2CT0geyBGT0xMT1dfMzY0X2luX21vZGlmaWVyX2RpcmVjdGlvbl90ZXh0ODA2X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzMwNV9pbl9tb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0ODMzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zMDVfaW5fbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dDgzM19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zMDVfaW5fbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dDgzMwk9IHsgRk9MTE9XXzMwNV9pbl9tb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0ODMzX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzM0MV9pbl9tb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0ODQzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zNDFfaW5fbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dDg0M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zNDFfaW5fbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dDg0Mwk9IHsgRk9MTE9XXzM0MV9pbl9tb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0ODQzX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzI5OF9pbl9tb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0ODUyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yOThfaW5fbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dDg1Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yOThfaW5fbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dDg1Mgk9IHsgRk9MTE9XXzI5OF9pbl9tb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0ODUyX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzM2NF9pbl9tb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0ODYyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zNjRfaW5fbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dDg2Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zNjRfaW5fbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dDg2Mgk9IHsgRk9MTE9XXzM2NF9pbl9tb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0ODYyX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzE2NF9pbl9tb2RpZmllcl9kaXJlY3Rpb25fc3ltYm9sODgxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18xNjRfaW5fbW9kaWZpZXJfZGlyZWN0aW9uX3N5bWJvbDg4MV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18xNjRfaW5fbW9kaWZpZXJfZGlyZWN0aW9uX3N5bWJvbDg4MQk9IHsgRk9MTE9XXzE2NF9pbl9tb2RpZmllcl9kaXJlY3Rpb25fc3ltYm9sODgxX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0FTU0lHTl9SRUZfaW5fbW9kaWZpZXJfZGlyZWN0aW9uX3N5bWJvbDg5MSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQVNTSUdOX1JFRl9pbl9tb2RpZmllcl9kaXJlY3Rpb25fc3ltYm9sODkxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0FTU0lHTl9SRUZfaW5fbW9kaWZpZXJfZGlyZWN0aW9uX3N5bWJvbDg5MQk9IHsgRk9MTE9XX0FTU0lHTl9SRUZfaW5fbW9kaWZpZXJfZGlyZWN0aW9uX3N5bWJvbDg5MV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18xNjZfaW5fbW9kaWZpZXJfZGlyZWN0aW9uX3N5bWJvbDkwMSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMTY2X2luX21vZGlmaWVyX2RpcmVjdGlvbl9zeW1ib2w5MDFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMTY2X2luX21vZGlmaWVyX2RpcmVjdGlvbl9zeW1ib2w5MDEJPSB7IEZPTExPV18xNjZfaW5fbW9kaWZpZXJfZGlyZWN0aW9uX3N5bWJvbDkwMV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MVEVfaW5fbW9kaWZpZXJfZGlyZWN0aW9uX3N5bWJvbDkxMCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTFRFX2luX21vZGlmaWVyX2RpcmVjdGlvbl9zeW1ib2w5MTBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTFRFX2luX21vZGlmaWVyX2RpcmVjdGlvbl9zeW1ib2w5MTAJPSB7IEZPTExPV19MVEVfaW5fbW9kaWZpZXJfZGlyZWN0aW9uX3N5bWJvbDkxMF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19tb2RpZmllcl9kaXJlY3Rpb25faW5fbW9kaWZpZXJfcGFyYW05MzQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX21vZGlmaWVyX2RpcmVjdGlvbl9pbl9tb2RpZmllcl9wYXJhbTkzNF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19tb2RpZmllcl9kaXJlY3Rpb25faW5fbW9kaWZpZXJfcGFyYW05MzQJPSB7IEZPTExPV19tb2RpZmllcl9kaXJlY3Rpb25faW5fbW9kaWZpZXJfcGFyYW05MzRfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjgyX2luX21vZGlmaWVyX3BhcmFtOTQzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yODJfaW5fbW9kaWZpZXJfcGFyYW05NDNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjgyX2luX21vZGlmaWVyX3BhcmFtOTQzCT0geyBGT0xMT1dfMjgyX2luX21vZGlmaWVyX3BhcmFtOTQzX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzI2Ml9pbl9tb2RpZmllcl9wYXJhbTk2MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjYyX2luX21vZGlmaWVyX3BhcmFtOTYwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzI2Ml9pbl9tb2RpZmllcl9wYXJhbTk2MAk9IHsgRk9MTE9XXzI2Ml9pbl9tb2RpZmllcl9wYXJhbTk2MF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zZXRfaW5fbW9kaWZpZXJfcGFyYW05NzggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NldF9pbl9tb2RpZmllcl9wYXJhbTk3OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZXRfaW5fbW9kaWZpZXJfcGFyYW05NzgJPSB7IEZPTExPV19zZXRfaW5fbW9kaWZpZXJfcGFyYW05NzhfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzE4X2luX21vZGlmaWVyX3BhcmFtOTk1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zMThfaW5fbW9kaWZpZXJfcGFyYW05OTVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzE4X2luX21vZGlmaWVyX3BhcmFtOTk1CT0geyBGT0xMT1dfMzE4X2luX21vZGlmaWVyX3BhcmFtOTk1X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzI0M19pbl9tb2RpZmllcl9wYXJhbTEwMTMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzI0M19pbl9tb2RpZmllcl9wYXJhbTEwMTNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjQzX2luX21vZGlmaWVyX3BhcmFtMTAxMwk9IHsgRk9MTE9XXzI0M19pbl9tb2RpZmllcl9wYXJhbTEwMTNfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzkzX2luX3Byb2NlZHVyZV9tb2RpZmllcl9zcGVjaWZpZXIxMDYyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zOTNfaW5fcHJvY2VkdXJlX21vZGlmaWVyX3NwZWNpZmllcjEwNjJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA0MDAyMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzkzX2luX3Byb2NlZHVyZV9tb2RpZmllcl9zcGVjaWZpZXIxMDYyCT0geyBGT0xMT1dfMzkzX2luX3Byb2NlZHVyZV9tb2RpZmllcl9zcGVjaWZpZXIxMDYyX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzMwNl9pbl9wcm9jZWR1cmVfbW9kaWZpZXJfc3BlY2lmaWVyMTA3OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzA2X2luX3Byb2NlZHVyZV9tb2RpZmllcl9zcGVjaWZpZXIxMDc5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwNDAwMjAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzMwNl9pbl9wcm9jZWR1cmVfbW9kaWZpZXJfc3BlY2lmaWVyMTA3OQk9IHsgRk9MTE9XXzMwNl9pbl9wcm9jZWR1cmVfbW9kaWZpZXJfc3BlY2lmaWVyMTA3OV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV180MDZfaW5fcHJvY2VkdXJlX21vZGlmaWVyX3NwZWNpZmllcjEwODkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzQwNl9pbl9wcm9jZWR1cmVfbW9kaWZpZXJfc3BlY2lmaWVyMTA4OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDQwMDIwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV180MDZfaW5fcHJvY2VkdXJlX21vZGlmaWVyX3NwZWNpZmllcjEwODkJPSB7IEZPTExPV180MDZfaW5fcHJvY2VkdXJlX21vZGlmaWVyX3NwZWNpZmllcjEwODlfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzIyX2luX2V4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyMTEyNyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzIyX2luX2V4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyMTEyN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDQwNDAwMDAwMDAxMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDIwMDAwMDAwNCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDQwMDIwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zMjJfaW5fZXhlY3V0YWJsZV9tb2RpZmllcl9zcGVjaWZpZXIxMTI3CT0geyBGT0xMT1dfMzIyX2luX2V4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyMTEyN19iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zNTNfaW5fZXhlY3V0YWJsZV9tb2RpZmllcl9zcGVjaWZpZXIxMTQ0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zNTNfaW5fZXhlY3V0YWJsZV9tb2RpZmllcl9zcGVjaWZpZXIxMTQ0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwNDA0MDAwMDAwMDEwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMjAwMDAwMDA0KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwNDAwMjAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzM1M19pbl9leGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllcjExNDQJPSB7IEZPTExPV18zNTNfaW5fZXhlY3V0YWJsZV9tb2RpZmllcl9zcGVjaWZpZXIxMTQ0X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzI3Ml9pbl9leGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllcjExNTggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzI3Ml9pbl9leGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllcjExNThfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDA0MDQwMDAwMDAwMTAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAyMDAwMDAwMDQpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA0MDAyMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjcyX2luX2V4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyMTE1OAk9IHsgRk9MTE9XXzI3Ml9pbl9leGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllcjExNThfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfNDA2X2luX2V4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyMTE4MSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfNDA2X2luX2V4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyMTE4MV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDQwNDAwMDAwMDAxMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDIwMDAwMDAwNCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDQwMDIwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV180MDZfaW5fZXhlY3V0YWJsZV9tb2RpZmllcl9zcGVjaWZpZXIxMTgxCT0geyBGT0xMT1dfNDA2X2luX2V4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyMTE4MV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zOTNfaW5fZXhlY3V0YWJsZV9tb2RpZmllcl9zcGVjaWZpZXIxMTk4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zOTNfaW5fZXhlY3V0YWJsZV9tb2RpZmllcl9zcGVjaWZpZXIxMTk4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwNDA0MDAwMDAwMDEwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMjAwMDAwMDA0KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwNDAwMjAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzM5M19pbl9leGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllcjExOTgJPSB7IEZPTExPV18zOTNfaW5fZXhlY3V0YWJsZV9tb2RpZmllcl9zcGVjaWZpZXIxMTk4X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzMwNl9pbl9leGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllcjEyMTUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzMwNl9pbl9leGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllcjEyMTVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDA0MDQwMDAwMDAwMTAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAyMDAwMDAwMDQpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA0MDAyMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzA2X2luX2V4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyMTIxNQk9IHsgRk9MTE9XXzMwNl9pbl9leGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllcjEyMTVfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzE0X2luX2V4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyMTIyNCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzE0X2luX2V4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyMTIyNF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDQwNDAwMDAwMDAxMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDIwMDAwMDAwNCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDQwMDIwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zMTRfaW5fZXhlY3V0YWJsZV9tb2RpZmllcl9zcGVjaWZpZXIxMjI0CT0geyBGT0xMT1dfMzE0X2luX2V4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyMTIyNF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yODJfaW5faW5zdGFuY2VfbW9kaWZpZXJfc3BlY2lmaWVyMTI1NCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjgyX2luX2luc3RhbmNlX21vZGlmaWVyX3NwZWNpZmllcjEyNTRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDA0MDQwMDAwMDQwMTAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA5MjAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA0MDAyMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjgyX2luX2luc3RhbmNlX21vZGlmaWVyX3NwZWNpZmllcjEyNTQJPSB7IEZPTExPV18yODJfaW5faW5zdGFuY2VfbW9kaWZpZXJfc3BlY2lmaWVyMTI1NF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yNzJfaW5faW5zdGFuY2VfbW9kaWZpZXJfc3BlY2lmaWVyMTI3OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjcyX2luX2luc3RhbmNlX21vZGlmaWVyX3NwZWNpZmllcjEyNzhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDA0MDQwMDAwMDQwMTAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA5MjAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA0MDAyMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjcyX2luX2luc3RhbmNlX21vZGlmaWVyX3NwZWNpZmllcjEyNzgJPSB7IEZPTExPV18yNzJfaW5faW5zdGFuY2VfbW9kaWZpZXJfc3BlY2lmaWVyMTI3OF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zNTVfaW5faW5zdGFuY2VfbW9kaWZpZXJfc3BlY2lmaWVyMTI5NyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzU1X2luX2luc3RhbmNlX21vZGlmaWVyX3NwZWNpZmllcjEyOTdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDA0MDQwMDAwMDQwMTAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA5MjAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA0MDAyMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzU1X2luX2luc3RhbmNlX21vZGlmaWVyX3NwZWNpZmllcjEyOTcJPSB7IEZPTExPV18zNTVfaW5faW5zdGFuY2VfbW9kaWZpZXJfc3BlY2lmaWVyMTI5N19iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zNTJfaW5faW5zdGFuY2VfbW9kaWZpZXJfc3BlY2lmaWVyMTMxMyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzUyX2luX2luc3RhbmNlX21vZGlmaWVyX3NwZWNpZmllcjEzMTNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDA0MDQwMDAwMDQwMTAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA5MjAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA0MDAyMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzUyX2luX2luc3RhbmNlX21vZGlmaWVyX3NwZWNpZmllcjEzMTMJPSB7IEZPTExPV18zNTJfaW5faW5zdGFuY2VfbW9kaWZpZXJfc3BlY2lmaWVyMTMxM19iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zNDlfaW5faW5zdGFuY2VfbW9kaWZpZXJfc3BlY2lmaWVyMTMyNiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzQ5X2luX2luc3RhbmNlX21vZGlmaWVyX3NwZWNpZmllcjEzMjZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDA0MDQwMDAwMDQwMTAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA5MjAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA0MDAyMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzQ5X2luX2luc3RhbmNlX21vZGlmaWVyX3NwZWNpZmllcjEzMjYJPSB7IEZPTExPV18zNDlfaW5faW5zdGFuY2VfbW9kaWZpZXJfc3BlY2lmaWVyMTMyNl9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV180MDZfaW5faW5zdGFuY2VfbW9kaWZpZXJfc3BlY2lmaWVyMTM0MiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfNDA2X2luX2luc3RhbmNlX21vZGlmaWVyX3NwZWNpZmllcjEzNDJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDA0MDQwMDAwMDQwMTAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA5MjAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA0MDAyMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfNDA2X2luX2luc3RhbmNlX21vZGlmaWVyX3NwZWNpZmllcjEzNDIJPSB7IEZPTExPV180MDZfaW5faW5zdGFuY2VfbW9kaWZpZXJfc3BlY2lmaWVyMTM0Ml9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zOTNfaW5faW5zdGFuY2VfbW9kaWZpZXJfc3BlY2lmaWVyMTM1OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzkzX2luX2luc3RhbmNlX21vZGlmaWVyX3NwZWNpZmllcjEzNTlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDA0MDQwMDAwMDQwMTAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA5MjAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA0MDAyMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzkzX2luX2luc3RhbmNlX21vZGlmaWVyX3NwZWNpZmllcjEzNTkJPSB7IEZPTExPV18zOTNfaW5faW5zdGFuY2VfbW9kaWZpZXJfc3BlY2lmaWVyMTM1OV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zMDZfaW5faW5zdGFuY2VfbW9kaWZpZXJfc3BlY2lmaWVyMTM3NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzA2X2luX2luc3RhbmNlX21vZGlmaWVyX3NwZWNpZmllcjEzNzZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDA0MDQwMDAwMDQwMTAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA5MjAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA0MDAyMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzA2X2luX2luc3RhbmNlX21vZGlmaWVyX3NwZWNpZmllcjEzNzYJPSB7IEZPTExPV18zMDZfaW5faW5zdGFuY2VfbW9kaWZpZXJfc3BlY2lmaWVyMTM3Nl9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zMTRfaW5faW5zdGFuY2VfbW9kaWZpZXJfc3BlY2lmaWVyMTM4NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzE0X2luX2luc3RhbmNlX21vZGlmaWVyX3NwZWNpZmllcjEzODVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDA0MDQwMDAwMDQwMTAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA5MjAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA0MDAyMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzE0X2luX2luc3RhbmNlX21vZGlmaWVyX3NwZWNpZmllcjEzODUJPSB7IEZPTExPV18zMTRfaW5faW5zdGFuY2VfbW9kaWZpZXJfc3BlY2lmaWVyMTM4NV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zOTVfaW5fbW9kaWZpZXJfdHJhbnNpdGlvbjE0MjAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzM5NV9pbl9tb2RpZmllcl90cmFuc2l0aW9uMTQyMF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMEEwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zOTVfaW5fbW9kaWZpZXJfdHJhbnNpdGlvbjE0MjAJPSB7IEZPTExPV18zOTVfaW5fbW9kaWZpZXJfdHJhbnNpdGlvbjE0MjBfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzkzX2luX21vZGlmaWVyX3RyYW5zaXRpb24xNDM2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zOTNfaW5fbW9kaWZpZXJfdHJhbnNpdGlvbjE0MzZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDBBMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzkzX2luX21vZGlmaWVyX3RyYW5zaXRpb24xNDM2CT0geyBGT0xMT1dfMzkzX2luX21vZGlmaWVyX3RyYW5zaXRpb24xNDM2X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzMwNl9pbl9tb2RpZmllcl90cmFuc2l0aW9uMTQ1MyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzA2X2luX21vZGlmaWVyX3RyYW5zaXRpb24xNDUzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwQTAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzMwNl9pbl9tb2RpZmllcl90cmFuc2l0aW9uMTQ1Mwk9IHsgRk9MTE9XXzMwNl9pbl9tb2RpZmllcl90cmFuc2l0aW9uMTQ1M19iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zNDJfaW5fZGVmX3BhY2thZ2UxNDg1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zNDJfaW5fZGVmX3BhY2thZ2UxNDg1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzM0Ml9pbl9kZWZfcGFja2FnZTE0ODUJPSB7IEZPTExPV18zNDJfaW5fZGVmX3BhY2thZ2UxNDg1X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lEX2luX2RlZl9wYWNrYWdlMTQ4OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfSURfaW5fZGVmX3BhY2thZ2UxNDg5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0lEX2luX2RlZl9wYWNrYWdlMTQ4OQk9IHsgRk9MTE9XX0lEX2luX2RlZl9wYWNrYWdlMTQ4OV9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TdHJpbmdMaXRlcmFsX2luX2RlZl9wYWNrYWdlMTUwNiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU3RyaW5nTGl0ZXJhbF9pbl9kZWZfcGFja2FnZTE1MDZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDEpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU3RyaW5nTGl0ZXJhbF9pbl9kZWZfcGFja2FnZTE1MDYJPSB7IEZPTExPV19TdHJpbmdMaXRlcmFsX2luX2RlZl9wYWNrYWdlMTUwNl9iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MQ1VSTFlfaW5fZGVmX3BhY2thZ2UxNTI3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MQ1VSTFlfaW5fZGVmX3BhY2thZ2UxNTI3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgxMDg0NDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDQxRjgwQjIxKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xDVVJMWV9pbl9kZWZfcGFja2FnZTE1MjcJPSB7IEZPTExPV19MQ1VSTFlfaW5fZGVmX3BhY2thZ2UxNTI3X2JpdHMsIDQJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3NlY3Rpb25faGVhZGVyX2luX2RlZl9wYWNrYWdlMTUzMiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2VjdGlvbl9oZWFkZXJfaW5fZGVmX3BhY2thZ2UxNTMyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDg0NDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDQxRjgwQjIxKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3NlY3Rpb25faGVhZGVyX2luX2RlZl9wYWNrYWdlMTUzMgk9IHsgRk9MTE9XX3NlY3Rpb25faGVhZGVyX2luX2RlZl9wYWNrYWdlMTUzMl9iaXRzLCA0CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zZWN0aW9uX2ltcG9ydF9pbl9kZWZfcGFja2FnZTE1NDAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NlY3Rpb25faW1wb3J0X2luX2RlZl9wYWNrYWdlMTU0MF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDA4NDQwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDA0MUY4MEIyMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZWN0aW9uX2ltcG9ydF9pbl9kZWZfcGFja2FnZTE1NDAJPSB7IEZPTExPV19zZWN0aW9uX2ltcG9ydF9pbl9kZWZfcGFja2FnZTE1NDBfYml0cywgNAl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2VjdGlvbl9wcm9wZXJ0eV9pbl9kZWZfcGFja2FnZTE1NTEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NlY3Rpb25fcHJvcGVydHlfaW5fZGVmX3BhY2thZ2UxNTUxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDg0NDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDQxRjgwQjIwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3NlY3Rpb25fcHJvcGVydHlfaW5fZGVmX3BhY2thZ2UxNTUxCT0geyBGT0xMT1dfc2VjdGlvbl9wcm9wZXJ0eV9pbl9kZWZfcGFja2FnZTE1NTFfYml0cywgNAl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlX2luX2RlZl9wYWNrYWdlMTU2MyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlX2luX2RlZl9wYWNrYWdlMTU2M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDA4MDQwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDA0MDkwMEIyMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmVfaW5fZGVmX3BhY2thZ2UxNTYzCT0geyBGT0xMT1dfc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlX2luX2RlZl9wYWNrYWdlMTU2M19iaXRzLCA0CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19SQ1VSTFlfaW5fZGVmX3BhY2thZ2UxNTcyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19SQ1VSTFlfaW5fZGVmX3BhY2thZ2UxNTcyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1JDVVJMWV9pbl9kZWZfcGFja2FnZTE1NzIJPSB7IEZPTExPV19SQ1VSTFlfaW5fZGVmX3BhY2thZ2UxNTcyX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyX2luX2RlZl9zeXN0ZW0xNjA0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllcl9pbl9kZWZfc3lzdGVtMTYwNF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA0MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllcl9pbl9kZWZfc3lzdGVtMTYwNAk9IHsgRk9MTE9XX2V4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyX2luX2RlZl9zeXN0ZW0xNjA0X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzM5MF9pbl9kZWZfc3lzdGVtMTYxOCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzkwX2luX2RlZl9zeXN0ZW0xNjE4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzM5MF9pbl9kZWZfc3lzdGVtMTYxOAk9IHsgRk9MTE9XXzM5MF9pbl9kZWZfc3lzdGVtMTYxOF9iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MVF9faW5fZGVmX3N5c3RlbTE2MjYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xUX19pbl9kZWZfc3lzdGVtMTYyNl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMTgwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDgwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEwMDAwMDA1NDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDEwMDAwMDAwNDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MVF9faW5fZGVmX3N5c3RlbTE2MjYJPSB7IEZPTExPV19MVF9faW5fZGVmX3N5c3RlbTE2MjZfYml0cywgNgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzIxX2luX2RlZl9zeXN0ZW0xNjMwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zMjFfaW5fZGVmX3N5c3RlbTE2MzBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDE4MDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDA4MDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMDAwMDAwNTQwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAxMDAwMDAwMDQwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzIxX2luX2RlZl9zeXN0ZW0xNjMwCT0geyBGT0xMT1dfMzIxX2luX2RlZl9zeXN0ZW0xNjMwX2JpdHMsIDYJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4ZWN1dGFibGVfc3BlY2lmaWVyX2luX2RlZl9zeXN0ZW0xNjM2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leGVjdXRhYmxlX3NwZWNpZmllcl9pbl9kZWZfc3lzdGVtMTYzNl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leGVjdXRhYmxlX3NwZWNpZmllcl9pbl9kZWZfc3lzdGVtMTYzNgk9IHsgRk9MTE9XX2V4ZWN1dGFibGVfc3BlY2lmaWVyX2luX2RlZl9zeXN0ZW0xNjM2X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0dUX2luX2RlZl9zeXN0ZW0xNjM5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19HVF9pbl9kZWZfc3lzdGVtMTYzOV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19HVF9pbl9kZWZfc3lzdGVtMTYzOQk9IHsgRk9MTE9XX0dUX2luX2RlZl9zeXN0ZW0xNjM5X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lEX2luX2RlZl9zeXN0ZW0xNjQ5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19JRF9pbl9kZWZfc3lzdGVtMTY0OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JRF9pbl9kZWZfc3lzdGVtMTY0OQk9IHsgRk9MTE9XX0lEX2luX2RlZl9zeXN0ZW0xNjQ5X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1N0cmluZ0xpdGVyYWxfaW5fZGVmX3N5c3RlbTE2NjIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1N0cmluZ0xpdGVyYWxfaW5fZGVmX3N5c3RlbTE2NjJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDEpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU3RyaW5nTGl0ZXJhbF9pbl9kZWZfc3lzdGVtMTY2Mgk9IHsgRk9MTE9XX1N0cmluZ0xpdGVyYWxfaW5fZGVmX3N5c3RlbTE2NjJfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTENVUkxZX2luX2RlZl9zeXN0ZW0xNjc5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MQ1VSTFlfaW5fZGVmX3N5c3RlbTE2NzlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDIwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDEwODQ1ODAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA4NTlGRTlGNzkpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTENVUkxZX2luX2RlZl9zeXN0ZW0xNjc5CT0geyBGT0xMT1dfTENVUkxZX2luX2RlZl9zeXN0ZW0xNjc5X2JpdHMsIDQJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3NlY3Rpb25faGVhZGVyX2luX2RlZl9zeXN0ZW0xNjg3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zZWN0aW9uX2hlYWRlcl9pbl9kZWZfc3lzdGVtMTY4N19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDA4NDU4MDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDg1OUZFOUY3OSkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZWN0aW9uX2hlYWRlcl9pbl9kZWZfc3lzdGVtMTY4Nwk9IHsgRk9MTE9XX3NlY3Rpb25faGVhZGVyX2luX2RlZl9zeXN0ZW0xNjg3X2JpdHMsIDQJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3NlY3Rpb25faW1wb3J0X2luX2RlZl9zeXN0ZW0xNjk1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zZWN0aW9uX2ltcG9ydF9pbl9kZWZfc3lzdGVtMTY5NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDA4NDU4MDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDg1OUZFOUY3OCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZWN0aW9uX2ltcG9ydF9pbl9kZWZfc3lzdGVtMTY5NQk9IHsgRk9MTE9XX3NlY3Rpb25faW1wb3J0X2luX2RlZl9zeXN0ZW0xNjk1X2JpdHMsIDQJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3NlY3Rpb25fcGFyYW1ldGVyX2luX2RlZl9zeXN0ZW0xNzA2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zZWN0aW9uX3BhcmFtZXRlcl9pbl9kZWZfc3lzdGVtMTcwNl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDA4NDU4MDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDg1OUZFOUY3OCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZWN0aW9uX3BhcmFtZXRlcl9pbl9kZWZfc3lzdGVtMTcwNgk9IHsgRk9MTE9XX3NlY3Rpb25fcGFyYW1ldGVyX2luX2RlZl9zeXN0ZW0xNzA2X2JpdHMsIDQJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3NlY3Rpb25fcHJvcGVydHlfaW5fZGVmX3N5c3RlbTE3MjggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NlY3Rpb25fcHJvcGVydHlfaW5fZGVmX3N5c3RlbTE3MjhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDIwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwODQ1ODAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA4NDFGODFGNjApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2VjdGlvbl9wcm9wZXJ0eV9pbl9kZWZfc3lzdGVtMTcyOAk9IHsgRk9MTE9XX3NlY3Rpb25fcHJvcGVydHlfaW5fZGVmX3N5c3RlbTE3MjhfYml0cywgNAl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlX2luX2RlZl9zeXN0ZW0xNzQwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmVfaW5fZGVmX3N5c3RlbTE3NDBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDIwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwODA1ODAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA4NDA5MDFGNjApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlX2luX2RlZl9zeXN0ZW0xNzQwCT0geyBGT0xMT1dfc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlX2luX2RlZl9zeXN0ZW0xNzQwX2JpdHMsIDQJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3NlY3Rpb25fYmVoYXZpb3JfaW5fZGVmX3N5c3RlbTE3NTIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NlY3Rpb25fYmVoYXZpb3JfaW5fZGVmX3N5c3RlbTE3NTJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDIwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAxMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDE0NDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2VjdGlvbl9iZWhhdmlvcl9pbl9kZWZfc3lzdGVtMTc1Mgk9IHsgRk9MTE9XX3NlY3Rpb25fYmVoYXZpb3JfaW5fZGVmX3N5c3RlbTE3NTJfYml0cywgNAl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2VjdGlvbl9zdGF0ZW1hY2hpbmVfaW5fZGVmX3N5c3RlbTE3NjAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NlY3Rpb25fc3RhdGVtYWNoaW5lX2luX2RlZl9zeXN0ZW0xNzYwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMTAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAxNDQwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3NlY3Rpb25fc3RhdGVtYWNoaW5lX2luX2RlZl9zeXN0ZW0xNzYwCT0geyBGT0xMT1dfc2VjdGlvbl9zdGF0ZW1hY2hpbmVfaW5fZGVmX3N5c3RlbTE3NjBfYml0cywgNAl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2VjdGlvbl9tb2RlbF9vZl9jb21wdXRhdGlvbl9pbl9kZWZfc3lzdGVtMTc4OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2VjdGlvbl9tb2RlbF9vZl9jb21wdXRhdGlvbl9pbl9kZWZfc3lzdGVtMTc4OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDEwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMTQ0MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZWN0aW9uX21vZGVsX29mX2NvbXB1dGF0aW9uX2luX2RlZl9zeXN0ZW0xNzg4CT0geyBGT0xMT1dfc2VjdGlvbl9tb2RlbF9vZl9jb21wdXRhdGlvbl9pbl9kZWZfc3lzdGVtMTc4OF9iaXRzLCA0CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zZWN0aW9uX21vZGVsX29mX2ludGVyYWN0aW9uX2luX2RlZl9zeXN0ZW0xNzk2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zZWN0aW9uX21vZGVsX29mX2ludGVyYWN0aW9uX2luX2RlZl9zeXN0ZW0xNzk2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMTAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAxNDQwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3NlY3Rpb25fbW9kZWxfb2ZfaW50ZXJhY3Rpb25faW5fZGVmX3N5c3RlbTE3OTYJPSB7IEZPTExPV19zZWN0aW9uX21vZGVsX29mX2ludGVyYWN0aW9uX2luX2RlZl9zeXN0ZW0xNzk2X2JpdHMsIDQJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3NlY3Rpb25fbW9kZWxfb2ZfZXhlY3V0aW9uX2luX2RlZl9zeXN0ZW0xODA0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zZWN0aW9uX21vZGVsX29mX2V4ZWN1dGlvbl9pbl9kZWZfc3lzdGVtMTgwNF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDEwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMTQ0MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZWN0aW9uX21vZGVsX29mX2V4ZWN1dGlvbl9pbl9kZWZfc3lzdGVtMTgwNAk9IHsgRk9MTE9XX3NlY3Rpb25fbW9kZWxfb2ZfZXhlY3V0aW9uX2luX2RlZl9zeXN0ZW0xODA0X2JpdHMsIDQJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1JDVVJMWV9pbl9kZWZfc3lzdGVtMTgxNiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfUkNVUkxZX2luX2RlZl9zeXN0ZW0xODE2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1JDVVJMWV9pbl9kZWZfc3lzdGVtMTgxNgk9IHsgRk9MTE9XX1JDVVJMWV9pbl9kZWZfc3lzdGVtMTgxNl9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19JRF9pbl9xdWFsaWZpZWROYW1lSUQxODQyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19JRF9pbl9xdWFsaWZpZWROYW1lSUQxODQyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMjAwNDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0lEX2luX3F1YWxpZmllZE5hbWVJRDE4NDIJPSB7IEZPTExPV19JRF9pbl9xdWFsaWZpZWROYW1lSUQxODQyX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0RPVF9pbl9xdWFsaWZpZWROYW1lSUQxODU5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19ET1RfaW5fcXVhbGlmaWVkTmFtZUlEMTg1OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19ET1RfaW5fcXVhbGlmaWVkTmFtZUlEMTg1OQk9IHsgRk9MTE9XX0RPVF9pbl9xdWFsaWZpZWROYW1lSUQxODU5X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0NPTE9OeDJfaW5fcXVhbGlmaWVkTmFtZUlEMTg3NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQ09MT054Ml9pbl9xdWFsaWZpZWROYW1lSUQxODc1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0NPTE9OeDJfaW5fcXVhbGlmaWVkTmFtZUlEMTg3NQk9IHsgRk9MTE9XX0NPTE9OeDJfaW5fcXVhbGlmaWVkTmFtZUlEMTg3NV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19JRF9pbl9xdWFsaWZpZWROYW1lSUQxODkzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19JRF9pbl9xdWFsaWZpZWROYW1lSUQxODkzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMjAwNDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0lEX2luX3F1YWxpZmllZE5hbWVJRDE4OTMJPSB7IEZPTExPV19JRF9pbl9xdWFsaWZpZWROYW1lSUQxODkzX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0ludGVnZXJMaXRlcmFsX2luX2ludGVnZXJfY29uc3RhbnQxOTIzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19JbnRlZ2VyTGl0ZXJhbF9pbl9pbnRlZ2VyX2NvbnN0YW50MTkyM19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JbnRlZ2VyTGl0ZXJhbF9pbl9pbnRlZ2VyX2NvbnN0YW50MTkyMwk9IHsgRk9MTE9XX0ludGVnZXJMaXRlcmFsX2luX2ludGVnZXJfY29uc3RhbnQxOTIzX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9pbnRlZ2VyX2NvbnN0YW50MTkzNCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX2ludGVnZXJfY29uc3RhbnQxOTM0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9pbnRlZ2VyX2NvbnN0YW50MTkzNAk9IHsgRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9pbnRlZ2VyX2NvbnN0YW50MTkzNF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19GbG9hdExpdGVyYWxfaW5fZmxvYXRfY29uc3RhbnQxOTU1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19GbG9hdExpdGVyYWxfaW5fZmxvYXRfY29uc3RhbnQxOTU1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0Zsb2F0TGl0ZXJhbF9pbl9mbG9hdF9jb25zdGFudDE5NTUJPSB7IEZPTExPV19GbG9hdExpdGVyYWxfaW5fZmxvYXRfY29uc3RhbnQxOTU1X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9mbG9hdF9jb25zdGFudDE5NjYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9mbG9hdF9jb25zdGFudDE5NjZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX2Zsb2F0X2NvbnN0YW50MTk2Ngk9IHsgRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9mbG9hdF9jb25zdGFudDE5NjZfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTg4X2luX3NlY3Rpb25faGVhZGVyMTk4NyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMTg4X2luX3NlY3Rpb25faGVhZGVyMTk4N19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18xODhfaW5fc2VjdGlvbl9oZWFkZXIxOTg3CT0geyBGT0xMT1dfMTg4X2luX3NlY3Rpb25faGVhZGVyMTk4N19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18xOTJfaW5fc2VjdGlvbl9pbXBvcnQyMDA1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18xOTJfaW5fc2VjdGlvbl9pbXBvcnQyMDA1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE5Ml9pbl9zZWN0aW9uX2ltcG9ydDIwMDUJPSB7IEZPTExPV18xOTJfaW5fc2VjdGlvbl9pbXBvcnQyMDA1X2JpdHMsIDQJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2luY2x1ZGVfcGFja2FnZV9pbl9zZWN0aW9uX2ltcG9ydDIwMDkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2luY2x1ZGVfcGFja2FnZV9pbl9zZWN0aW9uX2ltcG9ydDIwMDlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfaW5jbHVkZV9wYWNrYWdlX2luX3NlY3Rpb25faW1wb3J0MjAwOQk9IHsgRk9MTE9XX2luY2x1ZGVfcGFja2FnZV9pbl9zZWN0aW9uX2ltcG9ydDIwMDlfYml0cywgNAl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTkzX2luX2luY2x1ZGVfcGFja2FnZTIwMjMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzE5M19pbl9pbmNsdWRlX3BhY2thZ2UyMDIzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE5M19pbl9pbmNsdWRlX3BhY2thZ2UyMDIzCT0geyBGT0xMT1dfMTkzX2luX2luY2x1ZGVfcGFja2FnZTIwMjNfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfU3RyaW5nTGl0ZXJhbF9pbl9pbmNsdWRlX3BhY2thZ2UyMDMwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19TdHJpbmdMaXRlcmFsX2luX2luY2x1ZGVfcGFja2FnZTIwMzBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU3RyaW5nTGl0ZXJhbF9pbl9pbmNsdWRlX3BhY2thZ2UyMDMwCT0geyBGT0xMT1dfU3RyaW5nTGl0ZXJhbF9pbl9pbmNsdWRlX3BhY2thZ2UyMDMwX2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1NFTUlfaW5faW5jbHVkZV9wYWNrYWdlMjAzMyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU0VNSV9pbl9pbmNsdWRlX3BhY2thZ2UyMDMzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1NFTUlfaW5faW5jbHVkZV9wYWNrYWdlMjAzMwk9IHsgRk9MTE9XX1NFTUlfaW5faW5jbHVkZV9wYWNrYWdlMjAzM19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MQ1VSTFlfaW5faW5jbHVkZV9wYWNrYWdlMjA0MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTENVUkxZX2luX2luY2x1ZGVfcGFja2FnZTIwNDBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTENVUkxZX2luX2luY2x1ZGVfcGFja2FnZTIwNDAJPSB7IEZPTExPV19MQ1VSTFlfaW5faW5jbHVkZV9wYWNrYWdlMjA0MF9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TdHJpbmdMaXRlcmFsX2luX2luY2x1ZGVfcGFja2FnZTIwNDUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1N0cmluZ0xpdGVyYWxfaW5faW5jbHVkZV9wYWNrYWdlMjA0NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19TdHJpbmdMaXRlcmFsX2luX2luY2x1ZGVfcGFja2FnZTIwNDUJPSB7IEZPTExPV19TdHJpbmdMaXRlcmFsX2luX2luY2x1ZGVfcGFja2FnZTIwNDVfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfUkNVUkxZX2luX2luY2x1ZGVfcGFja2FnZTIwNTEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1JDVVJMWV9pbl9pbmNsdWRlX3BhY2thZ2UyMDUxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1JDVVJMWV9pbl9pbmNsdWRlX3BhY2thZ2UyMDUxCT0geyBGT0xMT1dfUkNVUkxZX2luX2luY2x1ZGVfcGFja2FnZTIwNTFfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjEyX2luX3NlY3Rpb25fcHJvY2VkdXJlMjA4MSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjEyX2luX3NlY3Rpb25fcHJvY2VkdXJlMjA4MV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDA4MDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDQwMDIwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yMTJfaW5fc2VjdGlvbl9wcm9jZWR1cmUyMDgxCT0geyBGT0xMT1dfMjEyX2luX3NlY3Rpb25fcHJvY2VkdXJlMjA4MV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfcHJvY2VkdXJlX2luX3NlY3Rpb25fcHJvY2VkdXJlMjA5MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX3Byb2NlZHVyZV9pbl9zZWN0aW9uX3Byb2NlZHVyZTIwOTBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwODAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA0MDAyMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX3Byb2NlZHVyZV9pbl9zZWN0aW9uX3Byb2NlZHVyZTIwOTAJPSB7IEZPTExPV19kZWZfcHJvY2VkdXJlX2luX3NlY3Rpb25fcHJvY2VkdXJlMjA5MF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19wcm9jZWR1cmVfbW9kaWZpZXJfc3BlY2lmaWVyX2luX2RlZl9wcm9jZWR1cmUyMTI0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19wcm9jZWR1cmVfbW9kaWZpZXJfc3BlY2lmaWVyX2luX2RlZl9wcm9jZWR1cmUyMTI0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDgwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3Byb2NlZHVyZV9tb2RpZmllcl9zcGVjaWZpZXJfaW5fZGVmX3Byb2NlZHVyZTIxMjQJPSB7IEZPTExPV19wcm9jZWR1cmVfbW9kaWZpZXJfc3BlY2lmaWVyX2luX2RlZl9wcm9jZWR1cmUyMTI0X2JpdHMsIDYJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzM1MV9pbl9kZWZfcHJvY2VkdXJlMjE0MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzUxX2luX2RlZl9wcm9jZWR1cmUyMTQwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzM1MV9pbl9kZWZfcHJvY2VkdXJlMjE0MAk9IHsgRk9MTE9XXzM1MV9pbl9kZWZfcHJvY2VkdXJlMjE0MF9iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MVF9faW5fZGVmX3Byb2NlZHVyZTIxNDcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xUX19pbl9kZWZfcHJvY2VkdXJlMjE0N19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMTgwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDgwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEwMDAwMDA1NDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDEwMDAwMDAwNDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MVF9faW5fZGVmX3Byb2NlZHVyZTIxNDcJPSB7IEZPTExPV19MVF9faW5fZGVmX3Byb2NlZHVyZTIxNDdfYml0cywgNgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzIxX2luX2RlZl9wcm9jZWR1cmUyMTUxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zMjFfaW5fZGVmX3Byb2NlZHVyZTIxNTFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDE4MDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDA4MDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMDAwMDAwNTQwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAxMDAwMDAwMDQwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzIxX2luX2RlZl9wcm9jZWR1cmUyMTUxCT0geyBGT0xMT1dfMzIxX2luX2RlZl9wcm9jZWR1cmUyMTUxX2JpdHMsIDYJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4ZWN1dGFibGVfc3BlY2lmaWVyX2luX2RlZl9wcm9jZWR1cmUyMTU3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leGVjdXRhYmxlX3NwZWNpZmllcl9pbl9kZWZfcHJvY2VkdXJlMjE1N19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leGVjdXRhYmxlX3NwZWNpZmllcl9pbl9kZWZfcHJvY2VkdXJlMjE1Nwk9IHsgRk9MTE9XX2V4ZWN1dGFibGVfc3BlY2lmaWVyX2luX2RlZl9wcm9jZWR1cmUyMTU3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0dUX2luX2RlZl9wcm9jZWR1cmUyMTYxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19HVF9pbl9kZWZfcHJvY2VkdXJlMjE2MV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19HVF9pbl9kZWZfcHJvY2VkdXJlMjE2MQk9IHsgRk9MTE9XX0dUX2luX2RlZl9wcm9jZWR1cmUyMTYxX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lEX2luX2RlZl9wcm9jZWR1cmUyMTcxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19JRF9pbl9kZWZfcHJvY2VkdXJlMjE3MV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MTAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDgwMDAwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JRF9pbl9kZWZfcHJvY2VkdXJlMjE3MQk9IHsgRk9MTE9XX0lEX2luX2RlZl9wcm9jZWR1cmUyMTcxX2JpdHMsIDYJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1N0cmluZ0xpdGVyYWxfaW5fZGVmX3Byb2NlZHVyZTIxODQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1N0cmluZ0xpdGVyYWxfaW5fZGVmX3Byb2NlZHVyZTIxODRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDEwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA4MDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU3RyaW5nTGl0ZXJhbF9pbl9kZWZfcHJvY2VkdXJlMjE4NAk9IHsgRk9MTE9XX1N0cmluZ0xpdGVyYWxfaW5fZGVmX3Byb2NlZHVyZTIxODRfYml0cywgNgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX21hY2hpbmVfcGFyYW1ldGVyc19pbl9kZWZfcHJvY2VkdXJlMjIwMSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX21hY2hpbmVfcGFyYW1ldGVyc19pbl9kZWZfcHJvY2VkdXJlMjIwMV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDgwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWZfbWFjaGluZV9wYXJhbWV0ZXJzX2luX2RlZl9wcm9jZWR1cmUyMjAxCT0geyBGT0xMT1dfZGVmX21hY2hpbmVfcGFyYW1ldGVyc19pbl9kZWZfcHJvY2VkdXJlMjIwMV9iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfbWFjaGluZV9yZXR1cm5zX2luX2RlZl9wcm9jZWR1cmUyMjEwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWZfbWFjaGluZV9yZXR1cm5zX2luX2RlZl9wcm9jZWR1cmUyMjEwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl9tYWNoaW5lX3JldHVybnNfaW5fZGVmX3Byb2NlZHVyZTIyMTAJPSB7IEZPTExPV19kZWZfbWFjaGluZV9yZXR1cm5zX2luX2RlZl9wcm9jZWR1cmUyMjEwX2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2RlZl9ib2R5X3Byb2NlZHVyZV9pbl9kZWZfcHJvY2VkdXJlMjIxOSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX2JvZHlfcHJvY2VkdXJlX2luX2RlZl9wcm9jZWR1cmUyMjE5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl9ib2R5X3Byb2NlZHVyZV9pbl9kZWZfcHJvY2VkdXJlMjIxOQk9IHsgRk9MTE9XX2RlZl9ib2R5X3Byb2NlZHVyZV9pbl9kZWZfcHJvY2VkdXJlMjIxOV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MQlJBQ0tFVF9pbl9kZWZfbWFjaGluZV9wYXJhbWV0ZXJzMjIzOCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTEJSQUNLRVRfaW5fZGVmX21hY2hpbmVfcGFyYW1ldGVyczIyMzhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAyODApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDEwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDUwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweEMyN0UwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDc4RTIwNDgwMEUwMEMxNjgpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwNjQxMzYwMDcyMEEyNjEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMTNBNzgxMDgpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTEJSQUNLRVRfaW5fZGVmX21hY2hpbmVfcGFyYW1ldGVyczIyMzgJPSB7IEZPTExPV19MQlJBQ0tFVF9pbl9kZWZfbWFjaGluZV9wYXJhbWV0ZXJzMjIzOF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfbWFjaGluZV92YXJpYWJsZV9wYXJhbWV0ZXJfYXRvbV9pbl9kZWZfbWFjaGluZV9wYXJhbWV0ZXJzMjI0MSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b21faW5fZGVmX21hY2hpbmVfcGFyYW1ldGVyczIyNDFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA4MDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDEwMDAwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b21faW5fZGVmX21hY2hpbmVfcGFyYW1ldGVyczIyNDEJPSB7IEZPTExPV19kZWZfbWFjaGluZV92YXJpYWJsZV9wYXJhbWV0ZXJfYXRvbV9pbl9kZWZfbWFjaGluZV9wYXJhbWV0ZXJzMjI0MV9iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19DT01NQV9pbl9kZWZfbWFjaGluZV9wYXJhbWV0ZXJzMjI0OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQ09NTUFfaW5fZGVmX21hY2hpbmVfcGFyYW1ldGVyczIyNDlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAyODApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDEwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDUwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweEMyN0UwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDc4RTIwNDgwMEUwMEMxNjgpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwNjQxMzYwMDcyMEEyNjEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMTNBNzgxMDgpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQ09NTUFfaW5fZGVmX21hY2hpbmVfcGFyYW1ldGVyczIyNDkJPSB7IEZPTExPV19DT01NQV9pbl9kZWZfbWFjaGluZV9wYXJhbWV0ZXJzMjI0OV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfbWFjaGluZV92YXJpYWJsZV9wYXJhbWV0ZXJfYXRvbV9pbl9kZWZfbWFjaGluZV9wYXJhbWV0ZXJzMjI1MyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b21faW5fZGVmX21hY2hpbmVfcGFyYW1ldGVyczIyNTNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA4MDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDEwMDAwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b21faW5fZGVmX21hY2hpbmVfcGFyYW1ldGVyczIyNTMJPSB7IEZPTExPV19kZWZfbWFjaGluZV92YXJpYWJsZV9wYXJhbWV0ZXJfYXRvbV9pbl9kZWZfbWFjaGluZV9wYXJhbWV0ZXJzMjI1M19iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19SQlJBQ0tFVF9pbl9kZWZfbWFjaGluZV9wYXJhbWV0ZXJzMjI2MiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfUkJSQUNLRVRfaW5fZGVmX21hY2hpbmVfcGFyYW1ldGVyczIyNjJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUkJSQUNLRVRfaW5fZGVmX21hY2hpbmVfcGFyYW1ldGVyczIyNjIJPSB7IEZPTExPV19SQlJBQ0tFVF9pbl9kZWZfbWFjaGluZV9wYXJhbWV0ZXJzMjI2Ml9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MUEFSRU5faW5fZGVmX21hY2hpbmVfcGFyYW1ldGVyczIyNjggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xQQVJFTl9pbl9kZWZfbWFjaGluZV9wYXJhbWV0ZXJzMjI2OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDI4MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMTAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwNTAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4QzI3RTAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4NzhFMjA0ODAwRTAwQzE2OCksIEFOVExSM19VSU5UNjRfTElUKDB4MDA2NDEzNjAwNzIwQTI2MSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAxM0E3ODEwOCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MUEFSRU5faW5fZGVmX21hY2hpbmVfcGFyYW1ldGVyczIyNjgJPSB7IEZPTExPV19MUEFSRU5faW5fZGVmX21hY2hpbmVfcGFyYW1ldGVyczIyNjhfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b21faW5fZGVmX21hY2hpbmVfcGFyYW1ldGVyczIyNzIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlZl9tYWNoaW5lX3ZhcmlhYmxlX3BhcmFtZXRlcl9hdG9tX2luX2RlZl9tYWNoaW5lX3BhcmFtZXRlcnMyMjcyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwODAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl9tYWNoaW5lX3ZhcmlhYmxlX3BhcmFtZXRlcl9hdG9tX2luX2RlZl9tYWNoaW5lX3BhcmFtZXRlcnMyMjcyCT0geyBGT0xMT1dfZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b21faW5fZGVmX21hY2hpbmVfcGFyYW1ldGVyczIyNzJfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfQ09NTUFfaW5fZGVmX21hY2hpbmVfcGFyYW1ldGVyczIyODAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0NPTU1BX2luX2RlZl9tYWNoaW5lX3BhcmFtZXRlcnMyMjgwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMjgwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAxMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDA1MDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHhDMjdFMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHg3OEUyMDQ4MDBFMDBDMTY4KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDY0MTM2MDA3MjBBMjYxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDEzQTc4MTA4KSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0NPTU1BX2luX2RlZl9tYWNoaW5lX3BhcmFtZXRlcnMyMjgwCT0geyBGT0xMT1dfQ09NTUFfaW5fZGVmX21hY2hpbmVfcGFyYW1ldGVyczIyODBfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b21faW5fZGVmX21hY2hpbmVfcGFyYW1ldGVyczIyODMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlZl9tYWNoaW5lX3ZhcmlhYmxlX3BhcmFtZXRlcl9hdG9tX2luX2RlZl9tYWNoaW5lX3BhcmFtZXRlcnMyMjgzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwODAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl9tYWNoaW5lX3ZhcmlhYmxlX3BhcmFtZXRlcl9hdG9tX2luX2RlZl9tYWNoaW5lX3BhcmFtZXRlcnMyMjgzCT0geyBGT0xMT1dfZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b21faW5fZGVmX21hY2hpbmVfcGFyYW1ldGVyczIyODNfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfUlBBUkVOX2luX2RlZl9tYWNoaW5lX3BhcmFtZXRlcnMyMjkyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19SUEFSRU5faW5fZGVmX21hY2hpbmVfcGFyYW1ldGVyczIyOTJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUlBBUkVOX2luX2RlZl9tYWNoaW5lX3BhcmFtZXRlcnMyMjkyCT0geyBGT0xMT1dfUlBBUkVOX2luX2RlZl9tYWNoaW5lX3BhcmFtZXRlcnMyMjkyX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX21vZGlmaWVyX3BhcmFtX2luX2RlZl9tYWNoaW5lX3ZhcmlhYmxlX3BhcmFtZXRlcl9hdG9tMjMxNSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfbW9kaWZpZXJfcGFyYW1faW5fZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b20yMzE1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHhDMjY2MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzOEUwMDAwMDBBMDBDMTI4KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDY0MDE2MDA3MDAyMjYxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDEzQTc4MTA4KSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX21vZGlmaWVyX3BhcmFtX2luX2RlZl9tYWNoaW5lX3ZhcmlhYmxlX3BhcmFtZXRlcl9hdG9tMjMxNQk9IHsgRk9MTE9XX21vZGlmaWVyX3BhcmFtX2luX2RlZl9tYWNoaW5lX3ZhcmlhYmxlX3BhcmFtZXRlcl9hdG9tMjMxNV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV190eXBlX3Zhcl9pbl9kZWZfbWFjaGluZV92YXJpYWJsZV9wYXJhbWV0ZXJfYXRvbTIzMjcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3R5cGVfdmFyX2luX2RlZl9tYWNoaW5lX3ZhcmlhYmxlX3BhcmFtZXRlcl9hdG9tMjMyN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV190eXBlX3Zhcl9pbl9kZWZfbWFjaGluZV92YXJpYWJsZV9wYXJhbWV0ZXJfYXRvbTIzMjcJPSB7IEZPTExPV190eXBlX3Zhcl9pbl9kZWZfbWFjaGluZV92YXJpYWJsZV9wYXJhbWV0ZXJfYXRvbTIzMjdfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfSURfaW5fZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b20yMzM4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19JRF9pbl9kZWZfbWFjaGluZV92YXJpYWJsZV9wYXJhbWV0ZXJfYXRvbTIzMzhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMTIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfSURfaW5fZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b20yMzM4CT0geyBGT0xMT1dfSURfaW5fZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b20yMzM4X2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2luaXRpYWxfdmFsdWVfaW5fZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b20yMzU1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19pbml0aWFsX3ZhbHVlX2luX2RlZl9tYWNoaW5lX3ZhcmlhYmxlX3BhcmFtZXRlcl9hdG9tMjM1NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19pbml0aWFsX3ZhbHVlX2luX2RlZl9tYWNoaW5lX3ZhcmlhYmxlX3BhcmFtZXRlcl9hdG9tMjM1NQk9IHsgRk9MTE9XX2luaXRpYWxfdmFsdWVfaW5fZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b20yMzU1X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzI0NF9pbl9kZWZfbWFjaGluZV92YXJpYWJsZV9wYXJhbWV0ZXJfYXRvbTIzNzggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzI0NF9pbl9kZWZfbWFjaGluZV92YXJpYWJsZV9wYXJhbWV0ZXJfYXRvbTIzNzhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweEMyNjYwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDM4RTAwMDAwMEEwMEMxMjgpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwNjQwMTYwMDcwMDIyNjEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMTNBNzgxMDgpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjQ0X2luX2RlZl9tYWNoaW5lX3ZhcmlhYmxlX3BhcmFtZXRlcl9hdG9tMjM3OAk9IHsgRk9MTE9XXzI0NF9pbl9kZWZfbWFjaGluZV92YXJpYWJsZV9wYXJhbWV0ZXJfYXRvbTIzNzhfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfdHlwZV92YXJfaW5fZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b20yMzk5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV190eXBlX3Zhcl9pbl9kZWZfbWFjaGluZV92YXJpYWJsZV9wYXJhbWV0ZXJfYXRvbTIzOTlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAyMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfdHlwZV92YXJfaW5fZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b20yMzk5CT0geyBGT0xMT1dfdHlwZV92YXJfaW5fZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b20yMzk5X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0NPTE9OX2luX2RlZl9tYWNoaW5lX3ZhcmlhYmxlX3BhcmFtZXRlcl9hdG9tMjQwMSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQ09MT05faW5fZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b20yNDAxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0NPTE9OX2luX2RlZl9tYWNoaW5lX3ZhcmlhYmxlX3BhcmFtZXRlcl9hdG9tMjQwMQk9IHsgRk9MTE9XX0NPTE9OX2luX2RlZl9tYWNoaW5lX3ZhcmlhYmxlX3BhcmFtZXRlcl9hdG9tMjQwMV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX2RlZl9tYWNoaW5lX3ZhcmlhYmxlX3BhcmFtZXRlcl9hdG9tMjQxMiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9kZWZfbWFjaGluZV92YXJpYWJsZV9wYXJhbWV0ZXJfYXRvbTI0MTJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9kZWZfbWFjaGluZV92YXJpYWJsZV9wYXJhbWV0ZXJfYXRvbTI0MTIJPSB7IEZPTExPV19leHByZXNzaW9uX2luX2RlZl9tYWNoaW5lX3ZhcmlhYmxlX3BhcmFtZXRlcl9hdG9tMjQxMl9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b20yNDIzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b20yNDIzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9kZWZfbWFjaGluZV92YXJpYWJsZV9wYXJhbWV0ZXJfYXRvbTI0MjMJPSB7IEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b20yNDIzX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3NldF9pbl9kZWZfbWFjaGluZV9yZXR1cm5zMjQ1NyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2V0X2luX2RlZl9tYWNoaW5lX3JldHVybnMyNDU3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgxMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHhDMjY2MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzOEUwMDAwMDBBMDBDMTI4KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDY0MDE2MDA3MDAyMjYxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDEzQTc4MTA4KSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3NldF9pbl9kZWZfbWFjaGluZV9yZXR1cm5zMjQ1Nwk9IHsgRk9MTE9XX3NldF9pbl9kZWZfbWFjaGluZV9yZXR1cm5zMjQ1N19iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MQlJBQ0tFVF9pbl9kZWZfbWFjaGluZV9yZXR1cm5zMjQ3NCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTEJSQUNLRVRfaW5fZGVmX21hY2hpbmVfcmV0dXJuczI0NzRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAyODApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDEwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDUwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweEMyN0UwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDc4RTIwNDgwMEUwMEMxNjgpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwNjQxMzYwMDcyMEEyNjEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMTNBNzgxMDgpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTEJSQUNLRVRfaW5fZGVmX21hY2hpbmVfcmV0dXJuczI0NzQJPSB7IEZPTExPV19MQlJBQ0tFVF9pbl9kZWZfbWFjaGluZV9yZXR1cm5zMjQ3NF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbV9pbl9kZWZfbWFjaGluZV9yZXR1cm5zMjQ3NyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX21hY2hpbmVfdmFyaWFibGVfcmV0dXJuX2F0b21faW5fZGVmX21hY2hpbmVfcmV0dXJuczI0NzdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA4MDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDEwMDAwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX21hY2hpbmVfdmFyaWFibGVfcmV0dXJuX2F0b21faW5fZGVmX21hY2hpbmVfcmV0dXJuczI0NzcJPSB7IEZPTExPV19kZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbV9pbl9kZWZfbWFjaGluZV9yZXR1cm5zMjQ3N19iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19DT01NQV9pbl9kZWZfbWFjaGluZV9yZXR1cm5zMjQ4OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQ09NTUFfaW5fZGVmX21hY2hpbmVfcmV0dXJuczI0ODlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAyODApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDEwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDUwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweEMyN0UwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDc4RTIwNDgwMEUwMEMxNjgpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwNjQxMzYwMDcyMEEyNjEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMTNBNzgxMDgpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQ09NTUFfaW5fZGVmX21hY2hpbmVfcmV0dXJuczI0ODkJPSB7IEZPTExPV19DT01NQV9pbl9kZWZfbWFjaGluZV9yZXR1cm5zMjQ4OV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbV9pbl9kZWZfbWFjaGluZV9yZXR1cm5zMjQ5MyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX21hY2hpbmVfdmFyaWFibGVfcmV0dXJuX2F0b21faW5fZGVmX21hY2hpbmVfcmV0dXJuczI0OTNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA4MDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDEwMDAwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX21hY2hpbmVfdmFyaWFibGVfcmV0dXJuX2F0b21faW5fZGVmX21hY2hpbmVfcmV0dXJuczI0OTMJPSB7IEZPTExPV19kZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbV9pbl9kZWZfbWFjaGluZV9yZXR1cm5zMjQ5M19iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19SQlJBQ0tFVF9pbl9kZWZfbWFjaGluZV9yZXR1cm5zMjUwNiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfUkJSQUNLRVRfaW5fZGVmX21hY2hpbmVfcmV0dXJuczI1MDZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUkJSQUNLRVRfaW5fZGVmX21hY2hpbmVfcmV0dXJuczI1MDYJPSB7IEZPTExPV19SQlJBQ0tFVF9pbl9kZWZfbWFjaGluZV9yZXR1cm5zMjUwNl9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MUEFSRU5faW5fZGVmX21hY2hpbmVfcmV0dXJuczI1MjMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xQQVJFTl9pbl9kZWZfbWFjaGluZV9yZXR1cm5zMjUyM19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDI4MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMTAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwNTAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4QzI3RTAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4NzhFMjA0ODAwRTAwQzE2OCksIEFOVExSM19VSU5UNjRfTElUKDB4MDA2NDEzNjAwNzIwQTI2MSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAxM0E3ODEwOCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MUEFSRU5faW5fZGVmX21hY2hpbmVfcmV0dXJuczI1MjMJPSB7IEZPTExPV19MUEFSRU5faW5fZGVmX21hY2hpbmVfcmV0dXJuczI1MjNfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX21hY2hpbmVfdmFyaWFibGVfcmV0dXJuX2F0b21faW5fZGVmX21hY2hpbmVfcmV0dXJuczI1MjcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tX2luX2RlZl9tYWNoaW5lX3JldHVybnMyNTI3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwODAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tX2luX2RlZl9tYWNoaW5lX3JldHVybnMyNTI3CT0geyBGT0xMT1dfZGVmX21hY2hpbmVfdmFyaWFibGVfcmV0dXJuX2F0b21faW5fZGVmX21hY2hpbmVfcmV0dXJuczI1MjdfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfQ09NTUFfaW5fZGVmX21hY2hpbmVfcmV0dXJuczI1MzkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0NPTU1BX2luX2RlZl9tYWNoaW5lX3JldHVybnMyNTM5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMjgwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAxMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDA1MDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHhDMjdFMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHg3OEUyMDQ4MDBFMDBDMTY4KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDY0MTM2MDA3MjBBMjYxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDEzQTc4MTA4KSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0NPTU1BX2luX2RlZl9tYWNoaW5lX3JldHVybnMyNTM5CT0geyBGT0xMT1dfQ09NTUFfaW5fZGVmX21hY2hpbmVfcmV0dXJuczI1MzlfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX21hY2hpbmVfdmFyaWFibGVfcmV0dXJuX2F0b21faW5fZGVmX21hY2hpbmVfcmV0dXJuczI1NDIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tX2luX2RlZl9tYWNoaW5lX3JldHVybnMyNTQyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwODAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tX2luX2RlZl9tYWNoaW5lX3JldHVybnMyNTQyCT0geyBGT0xMT1dfZGVmX21hY2hpbmVfdmFyaWFibGVfcmV0dXJuX2F0b21faW5fZGVmX21hY2hpbmVfcmV0dXJuczI1NDJfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfUlBBUkVOX2luX2RlZl9tYWNoaW5lX3JldHVybnMyNTU1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19SUEFSRU5faW5fZGVmX21hY2hpbmVfcmV0dXJuczI1NTVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUlBBUkVOX2luX2RlZl9tYWNoaW5lX3JldHVybnMyNTU1CT0geyBGT0xMT1dfUlBBUkVOX2luX2RlZl9tYWNoaW5lX3JldHVybnMyNTU1X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3R5cGVfdmFyX2luX2RlZl9tYWNoaW5lX3JldHVybnMyNTcyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV190eXBlX3Zhcl9pbl9kZWZfbWFjaGluZV9yZXR1cm5zMjU3Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAxMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV190eXBlX3Zhcl9pbl9kZWZfbWFjaGluZV9yZXR1cm5zMjU3Mgk9IHsgRk9MTE9XX3R5cGVfdmFyX2luX2RlZl9tYWNoaW5lX3JldHVybnMyNTcyX2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2luaXRpYWxfdmFsdWVfaW5fZGVmX21hY2hpbmVfcmV0dXJuczI1NzggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2luaXRpYWxfdmFsdWVfaW5fZGVmX21hY2hpbmVfcmV0dXJuczI1NzhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfaW5pdGlhbF92YWx1ZV9pbl9kZWZfbWFjaGluZV9yZXR1cm5zMjU3OAk9IHsgRk9MTE9XX2luaXRpYWxfdmFsdWVfaW5fZGVmX21hY2hpbmVfcmV0dXJuczI1NzhfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfbW9kaWZpZXJfcGFyYW1faW5fZGVmX21hY2hpbmVfdmFyaWFibGVfcmV0dXJuX2F0b20yNjE3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19tb2RpZmllcl9wYXJhbV9pbl9kZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbTI2MTdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweEMyNjYwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDM4RTAwMDAwMEEwMEMxMjgpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwNjQwMTYwMDcwMDIyNjEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMTNBNzgxMDgpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfbW9kaWZpZXJfcGFyYW1faW5fZGVmX21hY2hpbmVfdmFyaWFibGVfcmV0dXJuX2F0b20yNjE3CT0geyBGT0xMT1dfbW9kaWZpZXJfcGFyYW1faW5fZGVmX21hY2hpbmVfdmFyaWFibGVfcmV0dXJuX2F0b20yNjE3X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3R5cGVfdmFyX2luX2RlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tMjYyOSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfdHlwZV92YXJfaW5fZGVmX21hY2hpbmVfdmFyaWFibGVfcmV0dXJuX2F0b20yNjI5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3R5cGVfdmFyX2luX2RlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tMjYyOQk9IHsgRk9MTE9XX3R5cGVfdmFyX2luX2RlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tMjYyOV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19JRF9pbl9kZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbTI2NDAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0lEX2luX2RlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tMjY0MF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAxMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JRF9pbl9kZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbTI2NDAJPSB7IEZPTExPV19JRF9pbl9kZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbTI2NDBfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfaW5pdGlhbF92YWx1ZV9pbl9kZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbTI2NTcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2luaXRpYWxfdmFsdWVfaW5fZGVmX21hY2hpbmVfdmFyaWFibGVfcmV0dXJuX2F0b20yNjU3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2luaXRpYWxfdmFsdWVfaW5fZGVmX21hY2hpbmVfdmFyaWFibGVfcmV0dXJuX2F0b20yNjU3CT0geyBGT0xMT1dfaW5pdGlhbF92YWx1ZV9pbl9kZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbTI2NTdfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjQ0X2luX2RlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tMjY4MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjQ0X2luX2RlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tMjY4MF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4QzI2NjAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MzhFMDAwMDAwQTAwQzEyOCksIEFOVExSM19VSU5UNjRfTElUKDB4MDA2NDAxNjAwNzAwMjI2MSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAxM0E3ODEwOCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yNDRfaW5fZGVmX21hY2hpbmVfdmFyaWFibGVfcmV0dXJuX2F0b20yNjgwCT0geyBGT0xMT1dfMjQ0X2luX2RlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tMjY4MF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV190eXBlX3Zhcl9pbl9kZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbTI3MDEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3R5cGVfdmFyX2luX2RlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tMjcwMV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDIwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV190eXBlX3Zhcl9pbl9kZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbTI3MDEJPSB7IEZPTExPV190eXBlX3Zhcl9pbl9kZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbTI3MDFfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfQ09MT05faW5fZGVmX21hY2hpbmVfdmFyaWFibGVfcmV0dXJuX2F0b20yNzAzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19DT0xPTl9pbl9kZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbTI3MDNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQ09MT05faW5fZGVmX21hY2hpbmVfdmFyaWFibGVfcmV0dXJuX2F0b20yNzAzCT0geyBGT0xMT1dfQ09MT05faW5fZGVmX21hY2hpbmVfdmFyaWFibGVfcmV0dXJuX2F0b20yNzAzX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fZGVmX21hY2hpbmVfdmFyaWFibGVfcmV0dXJuX2F0b20yNzE0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX2RlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tMjcxNF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX2RlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tMjcxNAk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fZGVmX21hY2hpbmVfdmFyaWFibGVfcmV0dXJuX2F0b20yNzE0X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9kZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbTI3MjUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9kZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbTI3MjVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX2RlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tMjcyNQk9IHsgRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9kZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbTI3MjVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTENVUkxZX2luX2RlZl9ib2R5X3Byb2NlZHVyZTI3NTUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xDVVJMWV9pbl9kZWZfYm9keV9wcm9jZWR1cmUyNzU1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHhGMUNFNUMwMDAyN0IwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA4MDAwOUQ5RkU5RkZEKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHg0NDA2MDQwMDA0MDEwMDQ4KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgxQzAwMTIwQTIwMjAwMDA0KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDRDNDAwQTAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xDVVJMWV9pbl9kZWZfYm9keV9wcm9jZWR1cmUyNzU1CT0geyBGT0xMT1dfTENVUkxZX2luX2RlZl9ib2R5X3Byb2NlZHVyZTI3NTVfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX2JvZHlfcHJvY2VkdXJlX3NlY3Rpb25faW5fZGVmX2JvZHlfcHJvY2VkdXJlMjc3NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX2JvZHlfcHJvY2VkdXJlX3NlY3Rpb25faW5fZGVmX2JvZHlfcHJvY2VkdXJlMjc3NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjAwMDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWZfYm9keV9wcm9jZWR1cmVfc2VjdGlvbl9pbl9kZWZfYm9keV9wcm9jZWR1cmUyNzc1CT0geyBGT0xMT1dfZGVmX2JvZHlfcHJvY2VkdXJlX3NlY3Rpb25faW5fZGVmX2JvZHlfcHJvY2VkdXJlMjc3NV9iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfYm9keV9wcm9jZWR1cmVfc2ltcGxpZl9pbl9kZWZfYm9keV9wcm9jZWR1cmUyNzg0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWZfYm9keV9wcm9jZWR1cmVfc2ltcGxpZl9pbl9kZWZfYm9keV9wcm9jZWR1cmUyNzg0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl9ib2R5X3Byb2NlZHVyZV9zaW1wbGlmX2luX2RlZl9ib2R5X3Byb2NlZHVyZTI3ODQJPSB7IEZPTExPV19kZWZfYm9keV9wcm9jZWR1cmVfc2ltcGxpZl9pbl9kZWZfYm9keV9wcm9jZWR1cmUyNzg0X2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1JDVVJMWV9pbl9kZWZfYm9keV9wcm9jZWR1cmUyNzk1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19SQ1VSTFlfaW5fZGVmX2JvZHlfcHJvY2VkdXJlMjc5NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19SQ1VSTFlfaW5fZGVmX2JvZHlfcHJvY2VkdXJlMjc5NQk9IHsgRk9MTE9XX1JDVVJMWV9pbl9kZWZfYm9keV9wcm9jZWR1cmUyNzk1X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3NlY3Rpb25faGVhZGVyX2luX2RlZl9ib2R5X3Byb2NlZHVyZV9zZWN0aW9uMjgwOCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2VjdGlvbl9oZWFkZXJfaW5fZGVmX2JvZHlfcHJvY2VkdXJlX3NlY3Rpb24yODA4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDg0NTgwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwODU5RkU5Rjc5KSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3NlY3Rpb25faGVhZGVyX2luX2RlZl9ib2R5X3Byb2NlZHVyZV9zZWN0aW9uMjgwOAk9IHsgRk9MTE9XX3NlY3Rpb25faGVhZGVyX2luX2RlZl9ib2R5X3Byb2NlZHVyZV9zZWN0aW9uMjgwOF9iaXRzLCA0CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zZWN0aW9uX2ltcG9ydF9pbl9kZWZfYm9keV9wcm9jZWR1cmVfc2VjdGlvbjI4MTYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NlY3Rpb25faW1wb3J0X2luX2RlZl9ib2R5X3Byb2NlZHVyZV9zZWN0aW9uMjgxNl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDA4NDU4MDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDg1OUZFOUY3OCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZWN0aW9uX2ltcG9ydF9pbl9kZWZfYm9keV9wcm9jZWR1cmVfc2VjdGlvbjI4MTYJPSB7IEZPTExPV19zZWN0aW9uX2ltcG9ydF9pbl9kZWZfYm9keV9wcm9jZWR1cmVfc2VjdGlvbjI4MTZfYml0cywgNAl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2VjdGlvbl9wYXJhbWV0ZXJfaW5fZGVmX2JvZHlfcHJvY2VkdXJlX3NlY3Rpb24yODI3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zZWN0aW9uX3BhcmFtZXRlcl9pbl9kZWZfYm9keV9wcm9jZWR1cmVfc2VjdGlvbjI4MjdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwODQ1ODAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA4NTlGRTlGNzgpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2VjdGlvbl9wYXJhbWV0ZXJfaW5fZGVmX2JvZHlfcHJvY2VkdXJlX3NlY3Rpb24yODI3CT0geyBGT0xMT1dfc2VjdGlvbl9wYXJhbWV0ZXJfaW5fZGVmX2JvZHlfcHJvY2VkdXJlX3NlY3Rpb24yODI3X2JpdHMsIDQJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3NlY3Rpb25fcHJvcGVydHlfaW5fZGVmX2JvZHlfcHJvY2VkdXJlX3NlY3Rpb24yODM5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zZWN0aW9uX3Byb3BlcnR5X2luX2RlZl9ib2R5X3Byb2NlZHVyZV9zZWN0aW9uMjgzOV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDA4NDU4MDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDg0MUY4MUY2MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZWN0aW9uX3Byb3BlcnR5X2luX2RlZl9ib2R5X3Byb2NlZHVyZV9zZWN0aW9uMjgzOQk9IHsgRk9MTE9XX3NlY3Rpb25fcHJvcGVydHlfaW5fZGVmX2JvZHlfcHJvY2VkdXJlX3NlY3Rpb24yODM5X2JpdHMsIDQJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3NlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZV9pbl9kZWZfYm9keV9wcm9jZWR1cmVfc2VjdGlvbjI4NTIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZV9pbl9kZWZfYm9keV9wcm9jZWR1cmVfc2VjdGlvbjI4NTJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwODA1ODAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA4NDA5MDFGNjApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlX2luX2RlZl9ib2R5X3Byb2NlZHVyZV9zZWN0aW9uMjg1Mgk9IHsgRk9MTE9XX3NlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZV9pbl9kZWZfYm9keV9wcm9jZWR1cmVfc2VjdGlvbjI4NTJfYml0cywgNAl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2VjdGlvbl9iZWhhdmlvcl9pbl9kZWZfYm9keV9wcm9jZWR1cmVfc2VjdGlvbjI4NjQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NlY3Rpb25fYmVoYXZpb3JfaW5fZGVmX2JvZHlfcHJvY2VkdXJlX3NlY3Rpb24yODY0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMTAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAxNDQwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3NlY3Rpb25fYmVoYXZpb3JfaW5fZGVmX2JvZHlfcHJvY2VkdXJlX3NlY3Rpb24yODY0CT0geyBGT0xMT1dfc2VjdGlvbl9iZWhhdmlvcl9pbl9kZWZfYm9keV9wcm9jZWR1cmVfc2VjdGlvbjI4NjRfYml0cywgNAl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2VjdGlvbl9zdGF0ZW1hY2hpbmVfaW5fZGVmX2JvZHlfcHJvY2VkdXJlX3NlY3Rpb24yODcyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zZWN0aW9uX3N0YXRlbWFjaGluZV9pbl9kZWZfYm9keV9wcm9jZWR1cmVfc2VjdGlvbjI4NzJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAxMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDE0NDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2VjdGlvbl9zdGF0ZW1hY2hpbmVfaW5fZGVmX2JvZHlfcHJvY2VkdXJlX3NlY3Rpb24yODcyCT0geyBGT0xMT1dfc2VjdGlvbl9zdGF0ZW1hY2hpbmVfaW5fZGVmX2JvZHlfcHJvY2VkdXJlX3NlY3Rpb24yODcyX2JpdHMsIDQJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3NlY3Rpb25fbW9kZWxfb2ZfY29tcHV0YXRpb25faW5fZGVmX2JvZHlfcHJvY2VkdXJlX3NlY3Rpb24yODg3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zZWN0aW9uX21vZGVsX29mX2NvbXB1dGF0aW9uX2luX2RlZl9ib2R5X3Byb2NlZHVyZV9zZWN0aW9uMjg4N19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDEwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMTQ0MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZWN0aW9uX21vZGVsX29mX2NvbXB1dGF0aW9uX2luX2RlZl9ib2R5X3Byb2NlZHVyZV9zZWN0aW9uMjg4Nwk9IHsgRk9MTE9XX3NlY3Rpb25fbW9kZWxfb2ZfY29tcHV0YXRpb25faW5fZGVmX2JvZHlfcHJvY2VkdXJlX3NlY3Rpb24yODg3X2JpdHMsIDQJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3NlY3Rpb25fbW9kZWxfb2ZfZXhlY3V0aW9uX2luX2RlZl9ib2R5X3Byb2NlZHVyZV9zZWN0aW9uMjg5NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2VjdGlvbl9tb2RlbF9vZl9leGVjdXRpb25faW5fZGVmX2JvZHlfcHJvY2VkdXJlX3NlY3Rpb24yODk1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMTAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAxNDQwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3NlY3Rpb25fbW9kZWxfb2ZfZXhlY3V0aW9uX2luX2RlZl9ib2R5X3Byb2NlZHVyZV9zZWN0aW9uMjg5NQk9IHsgRk9MTE9XX3NlY3Rpb25fbW9kZWxfb2ZfZXhlY3V0aW9uX2luX2RlZl9ib2R5X3Byb2NlZHVyZV9zZWN0aW9uMjg5NV9iaXRzLCA0CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zZWN0aW9uX21vZGVsX29mX2ludGVyYWN0aW9uX2luX2RlZl9ib2R5X3Byb2NlZHVyZV9zZWN0aW9uMjkwMyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2VjdGlvbl9tb2RlbF9vZl9pbnRlcmFjdGlvbl9pbl9kZWZfYm9keV9wcm9jZWR1cmVfc2VjdGlvbjI5MDNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAxMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDE0NDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2VjdGlvbl9tb2RlbF9vZl9pbnRlcmFjdGlvbl9pbl9kZWZfYm9keV9wcm9jZWR1cmVfc2VjdGlvbjI5MDMJPSB7IEZPTExPV19zZWN0aW9uX21vZGVsX29mX2ludGVyYWN0aW9uX2luX2RlZl9ib2R5X3Byb2NlZHVyZV9zZWN0aW9uMjkwM19iaXRzLCA0CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19tb2RpZmllcl9kZWNsYXJhdGlvbl9pbl9kZWZfYm9keV9wcm9jZWR1cmVfc2ltcGxpZjI5MzkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX21vZGlmaWVyX2RlY2xhcmF0aW9uX2luX2RlZl9ib2R5X3Byb2NlZHVyZV9zaW1wbGlmMjkzOV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4RTE0QTA0MDAwMjdCMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDE4MDAwMDA4NCksIEFOVExSM19VSU5UNjRfTElUKDB4NDQwNDAwMDAwMDAxMDA0OCksIEFOVExSM19VSU5UNjRfTElUKDB4MEMwMDAwMDIwMDAwMDAwNCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwQzQwMDIwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19tb2RpZmllcl9kZWNsYXJhdGlvbl9pbl9kZWZfYm9keV9wcm9jZWR1cmVfc2ltcGxpZjI5MzkJPSB7IEZPTExPV19tb2RpZmllcl9kZWNsYXJhdGlvbl9pbl9kZWZfYm9keV9wcm9jZWR1cmVfc2ltcGxpZjI5MzlfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVjbF92YXJpYWJsZV9pbl9kZWZfYm9keV9wcm9jZWR1cmVfc2ltcGxpZjI5NTUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlY2xfdmFyaWFibGVfaW5fZGVmX2JvZHlfcHJvY2VkdXJlX3NpbXBsaWYyOTU1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHhFMTRBMDQwMDAyN0IwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA4MDAwMTgwMDAwMDg0KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHg0NDA2MDQwMDA0MDEwMDQ4KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgxQzAwMTIwQTIwMjAwMDA0KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDRDNDAwQTAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlY2xfdmFyaWFibGVfaW5fZGVmX2JvZHlfcHJvY2VkdXJlX3NpbXBsaWYyOTU1CT0geyBGT0xMT1dfZGVjbF92YXJpYWJsZV9pbl9kZWZfYm9keV9wcm9jZWR1cmVfc2ltcGxpZjI5NTVfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfYW55X2RlZl9zdGF0ZW1hY2hpbmVfaW5fZGVmX2JvZHlfcHJvY2VkdXJlX3NpbXBsaWYyOTY4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19hbnlfZGVmX3N0YXRlbWFjaGluZV9pbl9kZWZfYm9keV9wcm9jZWR1cmVfc2ltcGxpZjI5NjhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweEUxNEEwNDAwMDI3QjAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDgwMDAxODAwMDAwODQpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDQ0MDYwNDAwMDQwMTAwNDgpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDFDMDAxMjBBMjAyMDAwMDQpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwNEM0MDBBMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfYW55X2RlZl9zdGF0ZW1hY2hpbmVfaW5fZGVmX2JvZHlfcHJvY2VkdXJlX3NpbXBsaWYyOTY4CT0geyBGT0xMT1dfYW55X2RlZl9zdGF0ZW1hY2hpbmVfaW5fZGVmX2JvZHlfcHJvY2VkdXJlX3NpbXBsaWYyOTY4X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2RlZl9zdGF0ZV9hY3Rpdml0eV9pbl9kZWZfYm9keV9wcm9jZWR1cmVfc2ltcGxpZjI5NzkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlZl9zdGF0ZV9hY3Rpdml0eV9pbl9kZWZfYm9keV9wcm9jZWR1cmVfc2ltcGxpZjI5NzlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweEUxNEEwNDAwMDI3QjAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDgwMDAxODAwMDAwODQpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDQ0MDYwNDAwMDQwMTAwNDgpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDFDMDAxMjBBMjAyMDAwMDQpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwNEM0MDBBMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX3N0YXRlX2FjdGl2aXR5X2luX2RlZl9ib2R5X3Byb2NlZHVyZV9zaW1wbGlmMjk3OQk9IHsgRk9MTE9XX2RlZl9zdGF0ZV9hY3Rpdml0eV9pbl9kZWZfYm9keV9wcm9jZWR1cmVfc2ltcGxpZjI5NzlfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2VjdGlvbl9yb3V0aW5lX2luX3NlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZTMwMTEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NlY3Rpb25fcm91dGluZV9pbl9zZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmUzMDExX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3NlY3Rpb25fcm91dGluZV9pbl9zZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmUzMDExCT0geyBGT0xMT1dfc2VjdGlvbl9yb3V0aW5lX2luX3NlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZTMwMTFfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2VjdGlvbl9wcm9jZWR1cmVfaW5fc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlMzAxNyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2VjdGlvbl9wcm9jZWR1cmVfaW5fc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlMzAxN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZWN0aW9uX3Byb2NlZHVyZV9pbl9zZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmUzMDE3CT0geyBGT0xMT1dfc2VjdGlvbl9wcm9jZWR1cmVfaW5fc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlMzAxN19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zZWN0aW9uX2NvbXBvc2l0ZV9nZW5lcmljX2luX3NlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZTMwMjQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NlY3Rpb25fY29tcG9zaXRlX2dlbmVyaWNfaW5fc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlMzAyNF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZWN0aW9uX2NvbXBvc2l0ZV9nZW5lcmljX2luX3NlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZTMwMjQJPSB7IEZPTExPV19zZWN0aW9uX2NvbXBvc2l0ZV9nZW5lcmljX2luX3NlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZTMwMjRfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2VjdGlvbl9tYWNoaW5lX21vZGVsX2luX3NlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZTMwMzAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NlY3Rpb25fbWFjaGluZV9tb2RlbF9pbl9zZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmUzMDMwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3NlY3Rpb25fbWFjaGluZV9tb2RlbF9pbl9zZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmUzMDMwCT0geyBGT0xMT1dfc2VjdGlvbl9tYWNoaW5lX21vZGVsX2luX3NlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZTMwMzBfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2VjdGlvbl9tYWNoaW5lX3Byb3RvdHlwZV9pbl9zZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmUzMDM2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zZWN0aW9uX21hY2hpbmVfcHJvdG90eXBlX2luX3NlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZTMwMzZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2VjdGlvbl9tYWNoaW5lX3Byb3RvdHlwZV9pbl9zZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmUzMDM2CT0geyBGT0xMT1dfc2VjdGlvbl9tYWNoaW5lX3Byb3RvdHlwZV9pbl9zZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmUzMDM2X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3NlY3Rpb25fbWFjaGluZV9pbnN0YW5jZV9pbl9zZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmUzMDQyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zZWN0aW9uX21hY2hpbmVfaW5zdGFuY2VfaW5fc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlMzA0Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZWN0aW9uX21hY2hpbmVfaW5zdGFuY2VfaW5fc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlMzA0Mgk9IHsgRk9MTE9XX3NlY3Rpb25fbWFjaGluZV9pbnN0YW5jZV9pbl9zZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmUzMDQyX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3NldF9pbl9zZWN0aW9uX2NvbXBvc2l0ZV9nZW5lcmljMzA1NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2V0X2luX3NlY3Rpb25fY29tcG9zaXRlX2dlbmVyaWMzMDU2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAyN0IwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyNDBDMDAwMDAwMDEwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwQzAwMDAwMjAwMDAwMDA0KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwNDAwMjAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3NldF9pbl9zZWN0aW9uX2NvbXBvc2l0ZV9nZW5lcmljMzA1Ngk9IHsgRk9MTE9XX3NldF9pbl9zZWN0aW9uX2NvbXBvc2l0ZV9nZW5lcmljMzA1Nl9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leGVjdXRhYmxlX21hY2hpbmVfaW5fc2VjdGlvbl9jb21wb3NpdGVfZ2VuZXJpYzMwODEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4ZWN1dGFibGVfbWFjaGluZV9pbl9zZWN0aW9uX2NvbXBvc2l0ZV9nZW5lcmljMzA4MV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMjdCMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjQwQzAwMDAwMDAxMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MEMwMDAwMDIwMDAwMDAwNCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDQwMDIwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leGVjdXRhYmxlX21hY2hpbmVfaW5fc2VjdGlvbl9jb21wb3NpdGVfZ2VuZXJpYzMwODEJPSB7IEZPTExPV19leGVjdXRhYmxlX21hY2hpbmVfaW5fc2VjdGlvbl9jb21wb3NpdGVfZ2VuZXJpYzMwODFfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjAzX2luX3NlY3Rpb25fbWFjaGluZV9tb2RlbDMxMDMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzIwM19pbl9zZWN0aW9uX21hY2hpbmVfbW9kZWwzMTAzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyNDA0MDAwMDAwMDEwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwODAwMDAwMjAwMDAwMDA0KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwNDAwMjAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzIwM19pbl9zZWN0aW9uX21hY2hpbmVfbW9kZWwzMTAzCT0geyBGT0xMT1dfMjAzX2luX3NlY3Rpb25fbWFjaGluZV9tb2RlbDMxMDNfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhlY3V0YWJsZV9tb2RlbF9kZWZpbml0b25faW5fc2VjdGlvbl9tYWNoaW5lX21vZGVsMzExMiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhlY3V0YWJsZV9tb2RlbF9kZWZpbml0b25faW5fc2VjdGlvbl9tYWNoaW5lX21vZGVsMzExMl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjQwNDAwMDAwMDAxMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDgwMDAwMDIwMDAwMDAwNCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDQwMDIwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leGVjdXRhYmxlX21vZGVsX2RlZmluaXRvbl9pbl9zZWN0aW9uX21hY2hpbmVfbW9kZWwzMTEyCT0geyBGT0xMT1dfZXhlY3V0YWJsZV9tb2RlbF9kZWZpbml0b25faW5fc2VjdGlvbl9tYWNoaW5lX21vZGVsMzExMl9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yMTVfaW5fc2VjdGlvbl9tYWNoaW5lX3Byb3RvdHlwZTMxMzQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzIxNV9pbl9zZWN0aW9uX21hY2hpbmVfcHJvdG90eXBlMzEzNF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjQwNDAwMDAwMDAxMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDgwMDAwMDIwMDAwMDAwNCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDQwMDIwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yMTVfaW5fc2VjdGlvbl9tYWNoaW5lX3Byb3RvdHlwZTMxMzQJPSB7IEZPTExPV18yMTVfaW5fc2VjdGlvbl9tYWNoaW5lX3Byb3RvdHlwZTMxMzRfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhlY3V0YWJsZV9tb2RlbF9kZWZpbml0b25faW5fc2VjdGlvbl9tYWNoaW5lX3Byb3RvdHlwZTMxNDMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4ZWN1dGFibGVfbW9kZWxfZGVmaW5pdG9uX2luX3NlY3Rpb25fbWFjaGluZV9wcm90b3R5cGUzMTQzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyNDA0MDAwMDAwMDEwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwODAwMDAwMjAwMDAwMDA0KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwNDAwMjAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4ZWN1dGFibGVfbW9kZWxfZGVmaW5pdG9uX2luX3NlY3Rpb25fbWFjaGluZV9wcm90b3R5cGUzMTQzCT0geyBGT0xMT1dfZXhlY3V0YWJsZV9tb2RlbF9kZWZpbml0b25faW5fc2VjdGlvbl9tYWNoaW5lX3Byb3RvdHlwZTMxNDNfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTk3X2luX3NlY3Rpb25fbWFjaGluZV9pbnN0YW5jZTMxNjAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzE5N19pbl9zZWN0aW9uX21hY2hpbmVfaW5zdGFuY2UzMTYwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwNDBDMDAwMDA0MDEwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwOTIwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwNDAwMjAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE5N19pbl9zZWN0aW9uX21hY2hpbmVfaW5zdGFuY2UzMTYwCT0geyBGT0xMT1dfMTk3X2luX3NlY3Rpb25fbWFjaGluZV9pbnN0YW5jZTMxNjBfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhlY3V0YWJsZV9pbnN0YW5jZV9kZWZpbml0b25faW5fc2VjdGlvbl9tYWNoaW5lX2luc3RhbmNlMzE2OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhlY3V0YWJsZV9pbnN0YW5jZV9kZWZpbml0b25faW5fc2VjdGlvbl9tYWNoaW5lX2luc3RhbmNlMzE2OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDQwQzAwMDAwNDAxMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDkyMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDQwMDIwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leGVjdXRhYmxlX2luc3RhbmNlX2RlZmluaXRvbl9pbl9zZWN0aW9uX21hY2hpbmVfaW5zdGFuY2UzMTY5CT0geyBGT0xMT1dfZXhlY3V0YWJsZV9pbnN0YW5jZV9kZWZpbml0b25faW5fc2VjdGlvbl9tYWNoaW5lX2luc3RhbmNlMzE2OV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllcl9pbl9leGVjdXRhYmxlX21hY2hpbmUzMTk5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllcl9pbl9leGVjdXRhYmxlX21hY2hpbmUzMTk5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAyN0IwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyNDBDMDAwMDAwMDEwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwQzAwMDAwMjAwMDAwMDA0KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwNDAwMjAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyX2luX2V4ZWN1dGFibGVfbWFjaGluZTMxOTkJPSB7IEZPTExPV19leGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllcl9pbl9leGVjdXRhYmxlX21hY2hpbmUzMTk5X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2RlZl9tYWNoaW5lX2luX2V4ZWN1dGFibGVfbWFjaGluZTMyMjAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlZl9tYWNoaW5lX2luX2V4ZWN1dGFibGVfbWFjaGluZTMyMjBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX21hY2hpbmVfaW5fZXhlY3V0YWJsZV9tYWNoaW5lMzIyMAk9IHsgRk9MTE9XX2RlZl9tYWNoaW5lX2luX2V4ZWN1dGFibGVfbWFjaGluZTMyMjBfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfYW55X2RlZl9zdGF0ZW1hY2hpbmVfaW5fZXhlY3V0YWJsZV9tYWNoaW5lMzIzNiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfYW55X2RlZl9zdGF0ZW1hY2hpbmVfaW5fZXhlY3V0YWJsZV9tYWNoaW5lMzIzNl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19hbnlfZGVmX3N0YXRlbWFjaGluZV9pbl9leGVjdXRhYmxlX21hY2hpbmUzMjM2CT0geyBGT0xMT1dfYW55X2RlZl9zdGF0ZW1hY2hpbmVfaW5fZXhlY3V0YWJsZV9tYWNoaW5lMzIzNl9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWNsX2luc3RhbmNlX2luX2V4ZWN1dGFibGVfbWFjaGluZTMyNTIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlY2xfaW5zdGFuY2VfaW5fZXhlY3V0YWJsZV9tYWNoaW5lMzI1Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWNsX2luc3RhbmNlX2luX2V4ZWN1dGFibGVfbWFjaGluZTMyNTIJPSB7IEZPTExPV19kZWNsX2luc3RhbmNlX2luX2V4ZWN1dGFibGVfbWFjaGluZTMyNTJfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhlY3V0YWJsZV9tb2RpZmllcl9zcGVjaWZpZXJfaW5fZXhlY3V0YWJsZV9tb2RlbF9kZWZpbml0b24zMjg2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllcl9pbl9leGVjdXRhYmxlX21vZGVsX2RlZmluaXRvbjMyODZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDIwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDA4MDAwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhlY3V0YWJsZV9tb2RpZmllcl9zcGVjaWZpZXJfaW5fZXhlY3V0YWJsZV9tb2RlbF9kZWZpbml0b24zMjg2CT0geyBGT0xMT1dfZXhlY3V0YWJsZV9tb2RpZmllcl9zcGVjaWZpZXJfaW5fZXhlY3V0YWJsZV9tb2RlbF9kZWZpbml0b24zMjg2X2JpdHMsIDYJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2RlZl9tYWNoaW5lX2luX2V4ZWN1dGFibGVfbW9kZWxfZGVmaW5pdG9uMzMwNyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX21hY2hpbmVfaW5fZXhlY3V0YWJsZV9tb2RlbF9kZWZpbml0b24zMzA3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl9tYWNoaW5lX2luX2V4ZWN1dGFibGVfbW9kZWxfZGVmaW5pdG9uMzMwNwk9IHsgRk9MTE9XX2RlZl9tYWNoaW5lX2luX2V4ZWN1dGFibGVfbW9kZWxfZGVmaW5pdG9uMzMwN19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfc3RhdGVtYWNoaW5lX2luX2V4ZWN1dGFibGVfbW9kZWxfZGVmaW5pdG9uMzMyOSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX3N0YXRlbWFjaGluZV9pbl9leGVjdXRhYmxlX21vZGVsX2RlZmluaXRvbjMzMjlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX3N0YXRlbWFjaGluZV9pbl9leGVjdXRhYmxlX21vZGVsX2RlZmluaXRvbjMzMjkJPSB7IEZPTExPV19kZWZfc3RhdGVtYWNoaW5lX2luX2V4ZWN1dGFibGVfbW9kZWxfZGVmaW5pdG9uMzMyOV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19pbnN0YW5jZV9tb2RpZmllcl9zcGVjaWZpZXJfaW5fZXhlY3V0YWJsZV9pbnN0YW5jZV9kZWZpbml0b24zMzY1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19pbnN0YW5jZV9tb2RpZmllcl9zcGVjaWZpZXJfaW5fZXhlY3V0YWJsZV9pbnN0YW5jZV9kZWZpbml0b24zMzY1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA4MDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2luc3RhbmNlX21vZGlmaWVyX3NwZWNpZmllcl9pbl9leGVjdXRhYmxlX2luc3RhbmNlX2RlZmluaXRvbjMzNjUJPSB7IEZPTExPV19pbnN0YW5jZV9tb2RpZmllcl9zcGVjaWZpZXJfaW5fZXhlY3V0YWJsZV9pbnN0YW5jZV9kZWZpbml0b24zMzY1X2JpdHMsIDUJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2RlY2xfaW5zdGFuY2VfaW5fZXhlY3V0YWJsZV9pbnN0YW5jZV9kZWZpbml0b24zMzg0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWNsX2luc3RhbmNlX2luX2V4ZWN1dGFibGVfaW5zdGFuY2VfZGVmaW5pdG9uMzM4NF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWNsX2luc3RhbmNlX2luX2V4ZWN1dGFibGVfaW5zdGFuY2VfZGVmaW5pdG9uMzM4NAk9IHsgRk9MTE9XX2RlY2xfaW5zdGFuY2VfaW5fZXhlY3V0YWJsZV9pbnN0YW5jZV9kZWZpbml0b24zMzg0X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzMwN19pbl9kZWNsX2luc3RhbmNlMzQyMSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzA3X2luX2RlY2xfaW5zdGFuY2UzNDIxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwODAwMDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzMwN19pbl9kZWNsX2luc3RhbmNlMzQyMQk9IHsgRk9MTE9XXzMwN19pbl9kZWNsX2luc3RhbmNlMzQyMV9iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MVF9faW5fZGVjbF9pbnN0YW5jZTM0MzggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xUX19pbl9kZWNsX2luc3RhbmNlMzQzOF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwOCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MVF9faW5fZGVjbF9pbnN0YW5jZTM0MzgJPSB7IEZPTExPV19MVF9faW5fZGVjbF9pbnN0YW5jZTM0MzhfYml0cywgNgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzIzX2luX2RlY2xfaW5zdGFuY2UzNDQ2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zMjNfaW5fZGVjbF9pbnN0YW5jZTM0NDZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzIzX2luX2RlY2xfaW5zdGFuY2UzNDQ2CT0geyBGT0xMT1dfMzIzX2luX2RlY2xfaW5zdGFuY2UzNDQ2X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2luc3RhbmNlX21hY2hpbmVfbW9kZWxfaW5fZGVjbF9pbnN0YW5jZTM0NTMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2luc3RhbmNlX21hY2hpbmVfbW9kZWxfaW5fZGVjbF9pbnN0YW5jZTM0NTNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDA4MDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfaW5zdGFuY2VfbWFjaGluZV9tb2RlbF9pbl9kZWNsX2luc3RhbmNlMzQ1Mwk9IHsgRk9MTE9XX2luc3RhbmNlX21hY2hpbmVfbW9kZWxfaW5fZGVjbF9pbnN0YW5jZTM0NTNfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfQ09NTUFfaW5fZGVjbF9pbnN0YW5jZTM0NjUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0NPTU1BX2luX2RlY2xfaW5zdGFuY2UzNDY1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgxMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0NPTU1BX2luX2RlY2xfaW5zdGFuY2UzNDY1CT0geyBGT0xMT1dfQ09NTUFfaW5fZGVjbF9pbnN0YW5jZTM0NjVfYml0cywgNgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX2luc3RhbmNlX2NvdW50X2luX2RlY2xfaW5zdGFuY2UzNDY4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWZfaW5zdGFuY2VfY291bnRfaW5fZGVjbF9pbnN0YW5jZTM0NjhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX2luc3RhbmNlX2NvdW50X2luX2RlY2xfaW5zdGFuY2UzNDY4CT0geyBGT0xMT1dfZGVmX2luc3RhbmNlX2NvdW50X2luX2RlY2xfaW5zdGFuY2UzNDY4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0dUX2luX2RlY2xfaW5zdGFuY2UzNDc3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19HVF9pbl9kZWNsX2luc3RhbmNlMzQ3N19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19HVF9pbl9kZWNsX2luc3RhbmNlMzQ3Nwk9IHsgRk9MTE9XX0dUX2luX2RlY2xfaW5zdGFuY2UzNDc3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lEX2luX2RlY2xfaW5zdGFuY2UzNDgyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19JRF9pbl9kZWNsX2luc3RhbmNlMzQ4Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JRF9pbl9kZWNsX2luc3RhbmNlMzQ4Mgk9IHsgRk9MTE9XX0lEX2luX2RlY2xfaW5zdGFuY2UzNDgyX2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1N0cmluZ0xpdGVyYWxfaW5fZGVjbF9pbnN0YW5jZTM0OTUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1N0cmluZ0xpdGVyYWxfaW5fZGVjbF9pbnN0YW5jZTM0OTVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU3RyaW5nTGl0ZXJhbF9pbl9kZWNsX2luc3RhbmNlMzQ5NQk9IHsgRk9MTE9XX1N0cmluZ0xpdGVyYWxfaW5fZGVjbF9pbnN0YW5jZTM0OTVfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTFBBUkVOX2luX2RlY2xfaW5zdGFuY2UzNTE1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MUEFSRU5faW5fZGVjbF9pbnN0YW5jZTM1MTVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTFBBUkVOX2luX2RlY2xfaW5zdGFuY2UzNTE1CT0geyBGT0xMT1dfTFBBUkVOX2luX2RlY2xfaW5zdGFuY2UzNTE1X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2RlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlfaW5fZGVjbF9pbnN0YW5jZTM1MjQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlfaW5fZGVjbF9pbnN0YW5jZTM1MjRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX2luc3RhbmNlX29uX25ld19hY3Rpdml0eV9pbl9kZWNsX2luc3RhbmNlMzUyNAk9IHsgRk9MTE9XX2RlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlfaW5fZGVjbF9pbnN0YW5jZTM1MjRfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfUlBBUkVOX2luX2RlY2xfaW5zdGFuY2UzNTM2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19SUEFSRU5faW5fZGVjbF9pbnN0YW5jZTM1MzZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUlBBUkVOX2luX2RlY2xfaW5zdGFuY2UzNTM2CT0geyBGT0xMT1dfUlBBUkVOX2luX2RlY2xfaW5zdGFuY2UzNTM2X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1NFTUlfaW5fZGVjbF9pbnN0YW5jZTM1NTAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1NFTUlfaW5fZGVjbF9pbnN0YW5jZTM1NTBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU0VNSV9pbl9kZWNsX2luc3RhbmNlMzU1MAk9IHsgRk9MTE9XX1NFTUlfaW5fZGVjbF9pbnN0YW5jZTM1NTBfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTENVUkxZX2luX2RlY2xfaW5zdGFuY2UzNTU4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MQ1VSTFlfaW5fZGVjbF9pbnN0YW5jZTM1NThfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMEMwMDAxMDQ0MDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDIwMDAwMDAwMDAwMDAxMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDIwMDAwM0MwMDEwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDA0ODAxMDA0MDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMDNGOTdFMjRDODM4ODEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMEIxQzAwMDAzRjA0MDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAxODAwMDAwQTYpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTENVUkxZX2luX2RlY2xfaW5zdGFuY2UzNTU4CT0geyBGT0xMT1dfTENVUkxZX2luX2RlY2xfaW5zdGFuY2UzNTU4X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3N0YXRlbWVudF9pbl9kZWNsX2luc3RhbmNlMzU2NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc3RhdGVtZW50X2luX2RlY2xfaW5zdGFuY2UzNTY2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDBDMDAwMTA0NDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMTAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAyMDAwMDNDMDAxMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwNDgwMTAwNDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTAzRjk3RTI0QzgzODgxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjBCMUMwMDAwM0YwNDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMTgwMDAwMEE2KSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3N0YXRlbWVudF9pbl9kZWNsX2luc3RhbmNlMzU2Ngk9IHsgRk9MTE9XX3N0YXRlbWVudF9pbl9kZWNsX2luc3RhbmNlMzU2Nl9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfaW5zdGFuY2VfYWN0aXZpdHlfaW5fZGVjbF9pbnN0YW5jZTM1NzggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlZl9pbnN0YW5jZV9hY3Rpdml0eV9pbl9kZWNsX2luc3RhbmNlMzU3OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMjAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDQwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWZfaW5zdGFuY2VfYWN0aXZpdHlfaW5fZGVjbF9pbnN0YW5jZTM1NzgJPSB7IEZPTExPV19kZWZfaW5zdGFuY2VfYWN0aXZpdHlfaW5fZGVjbF9pbnN0YW5jZTM1NzhfYml0cywgNAl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfUkNVUkxZX2luX2RlY2xfaW5zdGFuY2UzNTg5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19SQ1VSTFlfaW5fZGVjbF9pbnN0YW5jZTM1ODlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUkNVUkxZX2luX2RlY2xfaW5zdGFuY2UzNTg5CT0geyBGT0xMT1dfUkNVUkxZX2luX2RlY2xfaW5zdGFuY2UzNTg5X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2RlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlfcGFyYW1ldGVyX2luX2RlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHkzNjEyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5X3BhcmFtZXRlcl9pbl9kZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5MzYxMl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDgwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5X3BhcmFtZXRlcl9pbl9kZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5MzYxMgk9IHsgRk9MTE9XX2RlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlfcGFyYW1ldGVyX2luX2RlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHkzNjEyX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0NPTU1BX2luX2RlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHkzNjIzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19DT01NQV9pbl9kZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5MzYyM19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19DT01NQV9pbl9kZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5MzYyMwk9IHsgRk9MTE9XX0NPTU1BX2luX2RlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHkzNjIzX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2RlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlfcGFyYW1ldGVyX2luX2RlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHkzNjI1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5X3BhcmFtZXRlcl9pbl9kZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5MzYyNV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDgwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5X3BhcmFtZXRlcl9pbl9kZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5MzYyNQk9IHsgRk9MTE9XX2RlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlfcGFyYW1ldGVyX2luX2RlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHkzNjI1X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2x2YWx1ZV9pbl9kZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5X3BhcmFtZXRlcjM2NTkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2x2YWx1ZV9pbl9kZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5X3BhcmFtZXRlcjM2NTlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAyMDAwRDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfbHZhbHVlX2luX2RlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlfcGFyYW1ldGVyMzY1OQk9IHsgRk9MTE9XX2x2YWx1ZV9pbl9kZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5X3BhcmFtZXRlcjM2NTlfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfb3BfYXNzaWduX3BhcmFtX2luX2RlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlfcGFyYW1ldGVyMzY2NCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfb3BfYXNzaWduX3BhcmFtX2luX2RlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlfcGFyYW1ldGVyMzY2NF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19vcF9hc3NpZ25fcGFyYW1faW5fZGVmX2luc3RhbmNlX29uX25ld19hY3Rpdml0eV9wYXJhbWV0ZXIzNjY0CT0geyBGT0xMT1dfb3BfYXNzaWduX3BhcmFtX2luX2RlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlfcGFyYW1ldGVyMzY2NF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX2RlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlfcGFyYW1ldGVyMzY2OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9kZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5X3BhcmFtZXRlcjM2NjlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9kZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5X3BhcmFtZXRlcjM2NjkJPSB7IEZPTExPV19leHByZXNzaW9uX2luX2RlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlfcGFyYW1ldGVyMzY2OV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX2RlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlfcGFyYW1ldGVyMzY4MiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9kZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5X3BhcmFtZXRlcjM2ODJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9kZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5X3BhcmFtZXRlcjM2ODIJPSB7IEZPTExPV19leHByZXNzaW9uX2luX2RlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlfcGFyYW1ldGVyMzY4Ml9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zZXRfaW5fb3BfYXNzaWduX3BhcmFtMzcwMiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2V0X2luX29wX2Fzc2lnbl9wYXJhbTM3MDJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2V0X2luX29wX2Fzc2lnbl9wYXJhbTM3MDIJPSB7IEZPTExPV19zZXRfaW5fb3BfYXNzaWduX3BhcmFtMzcwMl9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19BU1NJR05fUkVGX2luX29wX2Fzc2lnbl9wYXJhbTM3MTggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0FTU0lHTl9SRUZfaW5fb3BfYXNzaWduX3BhcmFtMzcxOF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19BU1NJR05fUkVGX2luX29wX2Fzc2lnbl9wYXJhbTM3MTgJPSB7IEZPTExPV19BU1NJR05fUkVGX2luX29wX2Fzc2lnbl9wYXJhbTM3MThfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfQVNTSUdOX01BQ1JPX2luX29wX2Fzc2lnbl9wYXJhbTM3MzQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0FTU0lHTl9NQUNST19pbl9vcF9hc3NpZ25fcGFyYW0zNzM0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0FTU0lHTl9NQUNST19pbl9vcF9hc3NpZ25fcGFyYW0zNzM0CT0geyBGT0xMT1dfQVNTSUdOX01BQ1JPX2luX29wX2Fzc2lnbl9wYXJhbTM3MzRfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTc3X2luX2RlZl9pbnN0YW5jZV9hY3Rpdml0eTM3NjEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzE3N19pbl9kZWZfaW5zdGFuY2VfYWN0aXZpdHkzNzYxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE3N19pbl9kZWZfaW5zdGFuY2VfYWN0aXZpdHkzNzYxCT0geyBGT0xMT1dfMTc3X2luX2RlZl9pbnN0YW5jZV9hY3Rpdml0eTM3NjFfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9pbnN0YW5jZV9hY3Rpdml0eTM3NjcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfaW5zdGFuY2VfYWN0aXZpdHkzNzY3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfaW5zdGFuY2VfYWN0aXZpdHkzNzY3CT0geyBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9pbnN0YW5jZV9hY3Rpdml0eTM3NjdfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjI2X2luX2RlZl9pbnN0YW5jZV9hY3Rpdml0eTM3NzUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzIyNl9pbl9kZWZfaW5zdGFuY2VfYWN0aXZpdHkzNzc1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzIyNl9pbl9kZWZfaW5zdGFuY2VfYWN0aXZpdHkzNzc1CT0geyBGT0xMT1dfMjI2X2luX2RlZl9pbnN0YW5jZV9hY3Rpdml0eTM3NzVfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9pbnN0YW5jZV9hY3Rpdml0eTM3ODMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfaW5zdGFuY2VfYWN0aXZpdHkzNzgzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfaW5zdGFuY2VfYWN0aXZpdHkzNzgzCT0geyBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9pbnN0YW5jZV9hY3Rpdml0eTM3ODNfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTcxX2luX3NlY3Rpb25fYmVoYXZpb3IzODA1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18xNzFfaW5fc2VjdGlvbl9iZWhhdmlvcjM4MDVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDI3QjAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDI0MEMwMDAwMDAwMTAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDBDMDAwMDAyMDAwMDAwMDQpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA0MDAyMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMTcxX2luX3NlY3Rpb25fYmVoYXZpb3IzODA1CT0geyBGT0xMT1dfMTcxX2luX3NlY3Rpb25fYmVoYXZpb3IzODA1X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4ZWN1dGFibGVfbWFjaGluZV9pbl9zZWN0aW9uX2JlaGF2aW9yMzgxNCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhlY3V0YWJsZV9tYWNoaW5lX2luX3NlY3Rpb25fYmVoYXZpb3IzODE0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAyN0IwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyNDBDMDAwMDAwMDEwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwQzAwMDAwMjAwMDAwMDA0KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwNDAwMjAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4ZWN1dGFibGVfbWFjaGluZV9pbl9zZWN0aW9uX2JlaGF2aW9yMzgxNAk9IHsgRk9MTE9XX2V4ZWN1dGFibGVfbWFjaGluZV9pbl9zZWN0aW9uX2JlaGF2aW9yMzgxNF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MQlJBQ0tFVF9pbl9kZWZfaW5zdGFuY2VfY291bnQzODU3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MQlJBQ0tFVF9pbl9kZWZfaW5zdGFuY2VfY291bnQzODU3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDg0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMjAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xCUkFDS0VUX2luX2RlZl9pbnN0YW5jZV9jb3VudDM4NTcJPSB7IEZPTExPV19MQlJBQ0tFVF9pbl9kZWZfaW5zdGFuY2VfY291bnQzODU3X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fZGVmX2luc3RhbmNlX2NvdW50Mzg2OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfaW50ZWdlcl9jb25zdGFudF9pbl9kZWZfaW5zdGFuY2VfY291bnQzODY4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwODAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fZGVmX2luc3RhbmNlX2NvdW50Mzg2OAk9IHsgRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fZGVmX2luc3RhbmNlX2NvdW50Mzg2OF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19DT01NQV9pbl9kZWZfaW5zdGFuY2VfY291bnQzODgwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19DT01NQV9pbl9kZWZfaW5zdGFuY2VfY291bnQzODgwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDg0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMjAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0NPTU1BX2luX2RlZl9pbnN0YW5jZV9jb3VudDM4ODAJPSB7IEZPTExPV19DT01NQV9pbl9kZWZfaW5zdGFuY2VfY291bnQzODgwX2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fZGVmX2luc3RhbmNlX2NvdW50Mzg5MyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfaW50ZWdlcl9jb25zdGFudF9pbl9kZWZfaW5zdGFuY2VfY291bnQzODkzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgxMDAwMDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fZGVmX2luc3RhbmNlX2NvdW50Mzg5Mwk9IHsgRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fZGVmX2luc3RhbmNlX2NvdW50Mzg5M19iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zZXRfaW5fZGVmX2luc3RhbmNlX2NvdW50MzkwNyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2V0X2luX2RlZl9pbnN0YW5jZV9jb3VudDM5MDdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDEwMDAwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2V0X2luX2RlZl9pbnN0YW5jZV9jb3VudDM5MDcJPSB7IEZPTExPV19zZXRfaW5fZGVmX2luc3RhbmNlX2NvdW50MzkwN19iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TVEFSX2luX2RlZl9pbnN0YW5jZV9jb3VudDM5MzkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1NUQVJfaW5fZGVmX2luc3RhbmNlX2NvdW50MzkzOV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MTAwMDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19TVEFSX2luX2RlZl9pbnN0YW5jZV9jb3VudDM5MzkJPSB7IEZPTExPV19TVEFSX2luX2RlZl9pbnN0YW5jZV9jb3VudDM5MzlfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfUExVU19pbl9kZWZfaW5zdGFuY2VfY291bnQzOTUxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19QTFVTX2luX2RlZl9pbnN0YW5jZV9jb3VudDM5NTFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDEwMDAwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUExVU19pbl9kZWZfaW5zdGFuY2VfY291bnQzOTUxCT0geyBGT0xMT1dfUExVU19pbl9kZWZfaW5zdGFuY2VfY291bnQzOTUxX2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1JCUkFDS0VUX2luX2RlZl9pbnN0YW5jZV9jb3VudDM5NjggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1JCUkFDS0VUX2luX2RlZl9pbnN0YW5jZV9jb3VudDM5NjhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUkJSQUNLRVRfaW5fZGVmX2luc3RhbmNlX2NvdW50Mzk2OAk9IHsgRk9MTE9XX1JCUkFDS0VUX2luX2RlZl9pbnN0YW5jZV9jb3VudDM5NjhfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTFBBUkVOX2luX2RlZl9pbnN0YW5jZV9jb3VudDM5NzYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xQQVJFTl9pbl9kZWZfaW5zdGFuY2VfY291bnQzOTc2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHg4MDAwMDIwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xQQVJFTl9pbl9kZWZfaW5zdGFuY2VfY291bnQzOTc2CT0geyBGT0xMT1dfTFBBUkVOX2luX2RlZl9pbnN0YW5jZV9jb3VudDM5NzZfYml0cywgNQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX2luc3RhbmNlX2NvdW50X2F0b21faW5fZGVmX2luc3RhbmNlX2NvdW50Mzk4MyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX2luc3RhbmNlX2NvdW50X2F0b21faW5fZGVmX2luc3RhbmNlX2NvdW50Mzk4M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDgwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4ODAwMDAyMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWZfaW5zdGFuY2VfY291bnRfYXRvbV9pbl9kZWZfaW5zdGFuY2VfY291bnQzOTgzCT0geyBGT0xMT1dfZGVmX2luc3RhbmNlX2NvdW50X2F0b21faW5fZGVmX2luc3RhbmNlX2NvdW50Mzk4M19iaXRzLCA1CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19DT01NQV9pbl9kZWZfaW5zdGFuY2VfY291bnQzOTkzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19DT01NQV9pbl9kZWZfaW5zdGFuY2VfY291bnQzOTkzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHg4MDAwMDIwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0NPTU1BX2luX2RlZl9pbnN0YW5jZV9jb3VudDM5OTMJPSB7IEZPTExPV19DT01NQV9pbl9kZWZfaW5zdGFuY2VfY291bnQzOTkzX2JpdHMsIDUJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2RlZl9pbnN0YW5jZV9jb3VudF9hdG9tX2luX2RlZl9pbnN0YW5jZV9jb3VudDM5OTggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlZl9pbnN0YW5jZV9jb3VudF9hdG9tX2luX2RlZl9pbnN0YW5jZV9jb3VudDM5OThfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA4MDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDgwMDAwMjAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX2luc3RhbmNlX2NvdW50X2F0b21faW5fZGVmX2luc3RhbmNlX2NvdW50Mzk5OAk9IHsgRk9MTE9XX2RlZl9pbnN0YW5jZV9jb3VudF9hdG9tX2luX2RlZl9pbnN0YW5jZV9jb3VudDM5OThfYml0cywgNQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfUlBBUkVOX2luX2RlZl9pbnN0YW5jZV9jb3VudDQwMDkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1JQQVJFTl9pbl9kZWZfaW5zdGFuY2VfY291bnQ0MDA5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1JQQVJFTl9pbl9kZWZfaW5zdGFuY2VfY291bnQ0MDA5CT0geyBGT0xMT1dfUlBBUkVOX2luX2RlZl9pbnN0YW5jZV9jb3VudDQwMDlfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjk3X2luX2RlZl9pbnN0YW5jZV9jb3VudF9hdG9tNDAyOCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjk3X2luX2RlZl9pbnN0YW5jZV9jb3VudF9hdG9tNDAyOF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDA4NDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yOTdfaW5fZGVmX2luc3RhbmNlX2NvdW50X2F0b200MDI4CT0geyBGT0xMT1dfMjk3X2luX2RlZl9pbnN0YW5jZV9jb3VudF9hdG9tNDAyOF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19pbnRlZ2VyX2NvbnN0YW50X2luX2RlZl9pbnN0YW5jZV9jb3VudF9hdG9tNDAzMiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfaW50ZWdlcl9jb25zdGFudF9pbl9kZWZfaW5zdGFuY2VfY291bnRfYXRvbTQwMzJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfaW50ZWdlcl9jb25zdGFudF9pbl9kZWZfaW5zdGFuY2VfY291bnRfYXRvbTQwMzIJPSB7IEZPTExPV19pbnRlZ2VyX2NvbnN0YW50X2luX2RlZl9pbnN0YW5jZV9jb3VudF9hdG9tNDAzMl9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zMTlfaW5fZGVmX2luc3RhbmNlX2NvdW50X2F0b200MDQwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zMTlfaW5fZGVmX2luc3RhbmNlX2NvdW50X2F0b200MDQwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDg0MDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzMxOV9pbl9kZWZfaW5zdGFuY2VfY291bnRfYXRvbTQwNDAJPSB7IEZPTExPV18zMTlfaW5fZGVmX2luc3RhbmNlX2NvdW50X2F0b200MDQwX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fZGVmX2luc3RhbmNlX2NvdW50X2F0b200MDQ1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19pbnRlZ2VyX2NvbnN0YW50X2luX2RlZl9pbnN0YW5jZV9jb3VudF9hdG9tNDA0NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19pbnRlZ2VyX2NvbnN0YW50X2luX2RlZl9pbnN0YW5jZV9jb3VudF9hdG9tNDA0NQk9IHsgRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fZGVmX2luc3RhbmNlX2NvdW50X2F0b200MDQ1X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzMxN19pbl9kZWZfbWFjaGluZTQwNzUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzMxN19pbl9kZWZfbWFjaGluZTQwNzVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzE3X2luX2RlZl9tYWNoaW5lNDA3NQk9IHsgRk9MTE9XXzMxN19pbl9kZWZfbWFjaGluZTQwNzVfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTFRfX2luX2RlZl9tYWNoaW5lNDA4MiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTFRfX2luX2RlZl9tYWNoaW5lNDA4Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MTAwNDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMTgwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDgwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDExMDAwMDA1NDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDEwMDAwMDAwNDA4MikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MVF9faW5fZGVmX21hY2hpbmU0MDgyCT0geyBGT0xMT1dfTFRfX2luX2RlZl9tYWNoaW5lNDA4Ml9iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zMjFfaW5fZGVmX21hY2hpbmU0MDkyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zMjFfaW5fZGVmX21hY2hpbmU0MDkyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAxODAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwODAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTAwMDAwMDU0MDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMTAwMDAwMDA0MDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzMyMV9pbl9kZWZfbWFjaGluZTQwOTIJPSB7IEZPTExPV18zMjFfaW5fZGVmX21hY2hpbmU0MDkyX2JpdHMsIDYJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4ZWN1dGFibGVfc3BlY2lmaWVyX2luX2RlZl9tYWNoaW5lNDA5OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhlY3V0YWJsZV9zcGVjaWZpZXJfaW5fZGVmX21hY2hpbmU0MDk4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwODAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4ZWN1dGFibGVfc3BlY2lmaWVyX2luX2RlZl9tYWNoaW5lNDA5OAk9IHsgRk9MTE9XX2V4ZWN1dGFibGVfc3BlY2lmaWVyX2luX2RlZl9tYWNoaW5lNDA5OF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19DT01NQV9pbl9kZWZfbWFjaGluZTQxMDggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0NPTU1BX2luX2RlZl9tYWNoaW5lNDEwOF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MTAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19DT01NQV9pbl9kZWZfbWFjaGluZTQxMDgJPSB7IEZPTExPV19DT01NQV9pbl9kZWZfbWFjaGluZTQxMDhfYml0cywgNgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX2luc3RhbmNlX2NvdW50X2luX2RlZl9tYWNoaW5lNDExMSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX2luc3RhbmNlX2NvdW50X2luX2RlZl9tYWNoaW5lNDExMV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWZfaW5zdGFuY2VfY291bnRfaW5fZGVmX21hY2hpbmU0MTExCT0geyBGT0xMT1dfZGVmX2luc3RhbmNlX2NvdW50X2luX2RlZl9tYWNoaW5lNDExMV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfaW5zdGFuY2VfY291bnRfaW5fZGVmX21hY2hpbmU0MTI0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWZfaW5zdGFuY2VfY291bnRfaW5fZGVmX21hY2hpbmU0MTI0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl9pbnN0YW5jZV9jb3VudF9pbl9kZWZfbWFjaGluZTQxMjQJPSB7IEZPTExPV19kZWZfaW5zdGFuY2VfY291bnRfaW5fZGVmX21hY2hpbmU0MTI0X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0dUX2luX2RlZl9tYWNoaW5lNDEzNyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfR1RfaW5fZGVmX21hY2hpbmU0MTM3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0dUX2luX2RlZl9tYWNoaW5lNDEzNwk9IHsgRk9MTE9XX0dUX2luX2RlZl9tYWNoaW5lNDEzN19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19JRF9pbl9kZWZfbWFjaGluZTQxNDcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0lEX2luX2RlZl9tYWNoaW5lNDE0N19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MTAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDgwMDAwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JRF9pbl9kZWZfbWFjaGluZTQxNDcJPSB7IEZPTExPV19JRF9pbl9kZWZfbWFjaGluZTQxNDdfYml0cywgNgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfU3RyaW5nTGl0ZXJhbF9pbl9kZWZfbWFjaGluZTQxNjAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1N0cmluZ0xpdGVyYWxfaW5fZGVmX21hY2hpbmU0MTYwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgxMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwODAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1N0cmluZ0xpdGVyYWxfaW5fZGVmX21hY2hpbmU0MTYwCT0geyBGT0xMT1dfU3RyaW5nTGl0ZXJhbF9pbl9kZWZfbWFjaGluZTQxNjBfYml0cywgNgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX21hY2hpbmVfcGFyYW1ldGVyc19pbl9kZWZfbWFjaGluZTQxNzcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlZl9tYWNoaW5lX3BhcmFtZXRlcnNfaW5fZGVmX21hY2hpbmU0MTc3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwODAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl9tYWNoaW5lX3BhcmFtZXRlcnNfaW5fZGVmX21hY2hpbmU0MTc3CT0geyBGT0xMT1dfZGVmX21hY2hpbmVfcGFyYW1ldGVyc19pbl9kZWZfbWFjaGluZTQxNzdfYml0cywgNgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX21hY2hpbmVfcmV0dXJuc19pbl9kZWZfbWFjaGluZTQxODYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlZl9tYWNoaW5lX3JldHVybnNfaW5fZGVmX21hY2hpbmU0MTg2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl9tYWNoaW5lX3JldHVybnNfaW5fZGVmX21hY2hpbmU0MTg2CT0geyBGT0xMT1dfZGVmX21hY2hpbmVfcmV0dXJuc19pbl9kZWZfbWFjaGluZTQxODZfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX2JvZHlfbWFjaGluZV9pbl9kZWZfbWFjaGluZTQxOTUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlZl9ib2R5X21hY2hpbmVfaW5fZGVmX21hY2hpbmU0MTk1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl9ib2R5X21hY2hpbmVfaW5fZGVmX21hY2hpbmU0MTk1CT0geyBGT0xMT1dfZGVmX2JvZHlfbWFjaGluZV9pbl9kZWZfbWFjaGluZTQxOTVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTg4X2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9oZWFkZXJfcHJlZGljYXQ0MjA4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18xODhfaW5fZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX2hlYWRlcl9wcmVkaWNhdDQyMDhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMTg4X2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9oZWFkZXJfcHJlZGljYXQ0MjA4CT0geyBGT0xMT1dfMTg4X2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9oZWFkZXJfcHJlZGljYXQ0MjA4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzE5Ml9pbl9kZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25faW1wb3J0X3ByZWRpY2F0NDIxOSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMTkyX2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9pbXBvcnRfcHJlZGljYXQ0MjE5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE5Ml9pbl9kZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25faW1wb3J0X3ByZWRpY2F0NDIxOQk9IHsgRk9MTE9XXzE5Ml9pbl9kZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25faW1wb3J0X3ByZWRpY2F0NDIxOV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25faGVhZGVyX3ByZWRpY2F0X2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdDQzMTMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9oZWFkZXJfcHJlZGljYXRfaW5fZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0NDMxM19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25faGVhZGVyX3ByZWRpY2F0X2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdDQzMTMJPSB7IEZPTExPV19kZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25faGVhZGVyX3ByZWRpY2F0X2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdDQzMTNfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX2ltcG9ydF9wcmVkaWNhdF9pbl9kZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJlZGljYXQ0MzE4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25faW1wb3J0X3ByZWRpY2F0X2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdDQzMThfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX2ltcG9ydF9wcmVkaWNhdF9pbl9kZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJlZGljYXQ0MzE4CT0geyBGT0xMT1dfZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX2ltcG9ydF9wcmVkaWNhdF9pbl9kZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJlZGljYXQ0MzE4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wYXJhbWV0ZXJfcHJlZGljYXRfaW5fZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0NDMyMyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3BhcmFtZXRlcl9wcmVkaWNhdF9pbl9kZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJlZGljYXQ0MzIzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wYXJhbWV0ZXJfcHJlZGljYXRfaW5fZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0NDMyMwk9IHsgRk9MTE9XX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wYXJhbWV0ZXJfcHJlZGljYXRfaW5fZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0NDMyM19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJvcGVydHlfcHJlZGljYXRfaW5fZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0NDMyOCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3Byb3BlcnR5X3ByZWRpY2F0X2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdDQzMjhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3Byb3BlcnR5X3ByZWRpY2F0X2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdDQzMjgJPSB7IEZPTExPV19kZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJvcGVydHlfcHJlZGljYXRfaW5fZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0NDMyOF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yMDFfaW5fZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0NDMzNCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjAxX2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdDQzMzRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjAxX2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdDQzMzQJPSB7IEZPTExPV18yMDFfaW5fZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0NDMzNF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yMjFfaW5fZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0NDMzOCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjIxX2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdDQzMzhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjIxX2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdDQzMzgJPSB7IEZPTExPV18yMjFfaW5fZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0NDMzOF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yMTJfaW5fZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0NDM0MiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjEyX2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdDQzNDJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjEyX2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdDQzNDIJPSB7IEZPTExPV18yMTJfaW5fZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0NDM0Ml9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18xNzNfaW5fZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0NDM0OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMTczX2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdDQzNDhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMTczX2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdDQzNDgJPSB7IEZPTExPV18xNzNfaW5fZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0NDM0OF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yMDBfaW5fZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0NDM1MiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjAwX2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdDQzNTJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjAwX2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdDQzNTIJPSB7IEZPTExPV18yMDBfaW5fZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0NDM1Ml9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yMTdfaW5fZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0NDM1NyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjE3X2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdDQzNTdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjE3X2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdDQzNTcJPSB7IEZPTExPV18yMTdfaW5fZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0NDM1N19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yMjdfaW5fZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0NDM2MyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjI3X2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdDQzNjNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjI3X2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdDQzNjMJPSB7IEZPTExPV18yMjdfaW5fZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0NDM2M19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18xNzFfaW5fZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0NDM2OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMTcxX2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdDQzNjlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMTcxX2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdDQzNjkJPSB7IEZPTExPV18xNzFfaW5fZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0NDM2OV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yMzFfaW5fZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0NDM3MyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjMxX2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdDQzNzNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjMxX2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdDQzNzMJPSB7IEZPTExPV18yMzFfaW5fZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0NDM3M19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yMDJfaW5fZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0NDM4MSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjAyX2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdDQzODFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjAyX2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdDQzODEJPSB7IEZPTExPV18yMDJfaW5fZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0NDM4MV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yMDRfaW5fZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0NDM4NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjA0X2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdDQzODVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjA0X2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdDQzODUJPSB7IEZPTExPV18yMDRfaW5fZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0NDM4NV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18xNzJfaW5fZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0NDM4OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMTcyX2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdDQzODlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMTcyX2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdDQzODkJPSB7IEZPTExPV18xNzJfaW5fZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0NDM4OV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18xOThfaW5fZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0NDM5MyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMTk4X2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdDQzOTNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMTk4X2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdDQzOTMJPSB7IEZPTExPV18xOThfaW5fZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0NDM5M19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MQ1VSTFlfaW5fZGVmX2JvZHlfbWFjaGluZTQ0MDcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xDVVJMWV9pbl9kZWZfYm9keV9tYWNoaW5lNDQwN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MTA4NDU4MDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDg1OUZFOUY3OSkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MQ1VSTFlfaW5fZGVmX2JvZHlfbWFjaGluZTQ0MDcJPSB7IEZPTExPV19MQ1VSTFlfaW5fZGVmX2JvZHlfbWFjaGluZTQ0MDdfYml0cywgNAl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX2JvZHlfbWFjaGluZV9zZWN0aW9uX2luX2RlZl9ib2R5X21hY2hpbmU0NDI0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWZfYm9keV9tYWNoaW5lX3NlY3Rpb25faW5fZGVmX2JvZHlfbWFjaGluZTQ0MjRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDIwMDAwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX2JvZHlfbWFjaGluZV9zZWN0aW9uX2luX2RlZl9ib2R5X21hY2hpbmU0NDI0CT0geyBGT0xMT1dfZGVmX2JvZHlfbWFjaGluZV9zZWN0aW9uX2luX2RlZl9ib2R5X21hY2hpbmU0NDI0X2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1JDVVJMWV9pbl9kZWZfYm9keV9tYWNoaW5lNDQzNyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfUkNVUkxZX2luX2RlZl9ib2R5X21hY2hpbmU0NDM3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1JDVVJMWV9pbl9kZWZfYm9keV9tYWNoaW5lNDQzNwk9IHsgRk9MTE9XX1JDVVJMWV9pbl9kZWZfYm9keV9tYWNoaW5lNDQzN19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zZWN0aW9uX2hlYWRlcl9pbl9kZWZfYm9keV9tYWNoaW5lX3NlY3Rpb240NDUwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zZWN0aW9uX2hlYWRlcl9pbl9kZWZfYm9keV9tYWNoaW5lX3NlY3Rpb240NDUwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDg0NTgwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwODU5RkU5Rjc5KSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3NlY3Rpb25faGVhZGVyX2luX2RlZl9ib2R5X21hY2hpbmVfc2VjdGlvbjQ0NTAJPSB7IEZPTExPV19zZWN0aW9uX2hlYWRlcl9pbl9kZWZfYm9keV9tYWNoaW5lX3NlY3Rpb240NDUwX2JpdHMsIDQJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3NlY3Rpb25faW1wb3J0X2luX2RlZl9ib2R5X21hY2hpbmVfc2VjdGlvbjQ0NTggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NlY3Rpb25faW1wb3J0X2luX2RlZl9ib2R5X21hY2hpbmVfc2VjdGlvbjQ0NThfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwODQ1ODAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA4NTlGRTlGNzgpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2VjdGlvbl9pbXBvcnRfaW5fZGVmX2JvZHlfbWFjaGluZV9zZWN0aW9uNDQ1OAk9IHsgRk9MTE9XX3NlY3Rpb25faW1wb3J0X2luX2RlZl9ib2R5X21hY2hpbmVfc2VjdGlvbjQ0NThfYml0cywgNAl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2VjdGlvbl9wYXJhbWV0ZXJfaW5fZGVmX2JvZHlfbWFjaGluZV9zZWN0aW9uNDQ2OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2VjdGlvbl9wYXJhbWV0ZXJfaW5fZGVmX2JvZHlfbWFjaGluZV9zZWN0aW9uNDQ2OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDA4NDU4MDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDg1OUZFOUY3OCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZWN0aW9uX3BhcmFtZXRlcl9pbl9kZWZfYm9keV9tYWNoaW5lX3NlY3Rpb240NDY5CT0geyBGT0xMT1dfc2VjdGlvbl9wYXJhbWV0ZXJfaW5fZGVmX2JvZHlfbWFjaGluZV9zZWN0aW9uNDQ2OV9iaXRzLCA0CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zZWN0aW9uX3Byb3BlcnR5X2luX2RlZl9ib2R5X21hY2hpbmVfc2VjdGlvbjQ0OTEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NlY3Rpb25fcHJvcGVydHlfaW5fZGVmX2JvZHlfbWFjaGluZV9zZWN0aW9uNDQ5MV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDA4NDU4MDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDg0MUY4MUY2MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZWN0aW9uX3Byb3BlcnR5X2luX2RlZl9ib2R5X21hY2hpbmVfc2VjdGlvbjQ0OTEJPSB7IEZPTExPV19zZWN0aW9uX3Byb3BlcnR5X2luX2RlZl9ib2R5X21hY2hpbmVfc2VjdGlvbjQ0OTFfYml0cywgNAl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlX2luX2RlZl9ib2R5X21hY2hpbmVfc2VjdGlvbjQ1MDQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZV9pbl9kZWZfYm9keV9tYWNoaW5lX3NlY3Rpb240NTA0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDgwNTgwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwODQwOTAxRjYwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3NlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZV9pbl9kZWZfYm9keV9tYWNoaW5lX3NlY3Rpb240NTA0CT0geyBGT0xMT1dfc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlX2luX2RlZl9ib2R5X21hY2hpbmVfc2VjdGlvbjQ1MDRfYml0cywgNAl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2VjdGlvbl9iZWhhdmlvcl9pbl9kZWZfYm9keV9tYWNoaW5lX3NlY3Rpb240NTE2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zZWN0aW9uX2JlaGF2aW9yX2luX2RlZl9ib2R5X21hY2hpbmVfc2VjdGlvbjQ1MTZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAxMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDE0NDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2VjdGlvbl9iZWhhdmlvcl9pbl9kZWZfYm9keV9tYWNoaW5lX3NlY3Rpb240NTE2CT0geyBGT0xMT1dfc2VjdGlvbl9iZWhhdmlvcl9pbl9kZWZfYm9keV9tYWNoaW5lX3NlY3Rpb240NTE2X2JpdHMsIDQJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3NlY3Rpb25fc3RhdGVtYWNoaW5lX2luX2RlZl9ib2R5X21hY2hpbmVfc2VjdGlvbjQ1MjQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NlY3Rpb25fc3RhdGVtYWNoaW5lX2luX2RlZl9ib2R5X21hY2hpbmVfc2VjdGlvbjQ1MjRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAxMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDE0NDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2VjdGlvbl9zdGF0ZW1hY2hpbmVfaW5fZGVmX2JvZHlfbWFjaGluZV9zZWN0aW9uNDUyNAk9IHsgRk9MTE9XX3NlY3Rpb25fc3RhdGVtYWNoaW5lX2luX2RlZl9ib2R5X21hY2hpbmVfc2VjdGlvbjQ1MjRfYml0cywgNAl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2VjdGlvbl9tb2RlbF9vZl9jb21wdXRhdGlvbl9pbl9kZWZfYm9keV9tYWNoaW5lX3NlY3Rpb240NTQ5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zZWN0aW9uX21vZGVsX29mX2NvbXB1dGF0aW9uX2luX2RlZl9ib2R5X21hY2hpbmVfc2VjdGlvbjQ1NDlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAxMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDE0NDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2VjdGlvbl9tb2RlbF9vZl9jb21wdXRhdGlvbl9pbl9kZWZfYm9keV9tYWNoaW5lX3NlY3Rpb240NTQ5CT0geyBGT0xMT1dfc2VjdGlvbl9tb2RlbF9vZl9jb21wdXRhdGlvbl9pbl9kZWZfYm9keV9tYWNoaW5lX3NlY3Rpb240NTQ5X2JpdHMsIDQJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3NlY3Rpb25fbW9kZWxfb2ZfZXhlY3V0aW9uX2luX2RlZl9ib2R5X21hY2hpbmVfc2VjdGlvbjQ1NTcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NlY3Rpb25fbW9kZWxfb2ZfZXhlY3V0aW9uX2luX2RlZl9ib2R5X21hY2hpbmVfc2VjdGlvbjQ1NTdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAxMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDE0NDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2VjdGlvbl9tb2RlbF9vZl9leGVjdXRpb25faW5fZGVmX2JvZHlfbWFjaGluZV9zZWN0aW9uNDU1Nwk9IHsgRk9MTE9XX3NlY3Rpb25fbW9kZWxfb2ZfZXhlY3V0aW9uX2luX2RlZl9ib2R5X21hY2hpbmVfc2VjdGlvbjQ1NTdfYml0cywgNAl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2VjdGlvbl9tb2RlbF9vZl9pbnRlcmFjdGlvbl9pbl9kZWZfYm9keV9tYWNoaW5lX3NlY3Rpb240NTY1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zZWN0aW9uX21vZGVsX29mX2ludGVyYWN0aW9uX2luX2RlZl9ib2R5X21hY2hpbmVfc2VjdGlvbjQ1NjVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAxMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDE0NDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2VjdGlvbl9tb2RlbF9vZl9pbnRlcmFjdGlvbl9pbl9kZWZfYm9keV9tYWNoaW5lX3NlY3Rpb240NTY1CT0geyBGT0xMT1dfc2VjdGlvbl9tb2RlbF9vZl9pbnRlcmFjdGlvbl9pbl9kZWZfYm9keV9tYWNoaW5lX3NlY3Rpb240NTY1X2JpdHMsIDQJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3Byb3BlcnR5X2RlY2xhcmF0aW9uX2luX2RlZl9ib2R5X21hY2hpbmVfc2ltcGxpZjQ1OTMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3Byb3BlcnR5X2RlY2xhcmF0aW9uX2luX2RlZl9ib2R5X21hY2hpbmVfc2ltcGxpZjQ1OTNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDIyMDgwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDQwMDIwNDAwMDQxMDAwNEUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDEwNDAxMjA4MjEyMDAwMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwNEM1MDQ4MTApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfcHJvcGVydHlfZGVjbGFyYXRpb25faW5fZGVmX2JvZHlfbWFjaGluZV9zaW1wbGlmNDU5Mwk9IHsgRk9MTE9XX3Byb3BlcnR5X2RlY2xhcmF0aW9uX2luX2RlZl9ib2R5X21hY2hpbmVfc2ltcGxpZjQ1OTNfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX21vZV9wcmltaXRpdmVfaW5fZGVmX2JvZHlfbWFjaGluZV9zaW1wbGlmNDYwOSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX21vZV9wcmltaXRpdmVfaW5fZGVmX2JvZHlfbWFjaGluZV9zaW1wbGlmNDYwOV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4RTE0QTg0MDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMTc4NDAwMDA4NCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDgwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWZfbW9lX3ByaW1pdGl2ZV9pbl9kZWZfYm9keV9tYWNoaW5lX3NpbXBsaWY0NjA5CT0geyBGT0xMT1dfZGVmX21vZV9wcmltaXRpdmVfaW5fZGVmX2JvZHlfbWFjaGluZV9zaW1wbGlmNDYwOV9iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllcl9pbl9hbnlfZGVmX3N0YXRlbWFjaGluZTQ2NDQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyX2luX2FueV9kZWZfc3RhdGVtYWNoaW5lNDY0NF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMjdCMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MEMwMDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllcl9pbl9hbnlfZGVmX3N0YXRlbWFjaGluZTQ2NDQJPSB7IEZPTExPV19leGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllcl9pbl9hbnlfZGVmX3N0YXRlbWFjaGluZTQ2NDRfYml0cywgNgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX3N0YXRlX3NpbmdsZXRvbl9pbl9hbnlfZGVmX3N0YXRlbWFjaGluZTQ2NjYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlZl9zdGF0ZV9zaW5nbGV0b25faW5fYW55X2RlZl9zdGF0ZW1hY2hpbmU0NjY2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl9zdGF0ZV9zaW5nbGV0b25faW5fYW55X2RlZl9zdGF0ZW1hY2hpbmU0NjY2CT0geyBGT0xMT1dfZGVmX3N0YXRlX3NpbmdsZXRvbl9pbl9hbnlfZGVmX3N0YXRlbWFjaGluZTQ2NjZfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX3N0YXRlX2luX2FueV9kZWZfc3RhdGVtYWNoaW5lNDY4MiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX3N0YXRlX2luX2FueV9kZWZfc3RhdGVtYWNoaW5lNDY4Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWZfc3RhdGVfaW5fYW55X2RlZl9zdGF0ZW1hY2hpbmU0NjgyCT0geyBGT0xMT1dfZGVmX3N0YXRlX2luX2FueV9kZWZfc3RhdGVtYWNoaW5lNDY4Ml9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfc3RhdGVtYWNoaW5lX2luX2FueV9kZWZfc3RhdGVtYWNoaW5lNDY5OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX3N0YXRlbWFjaGluZV9pbl9hbnlfZGVmX3N0YXRlbWFjaGluZTQ2OThfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX3N0YXRlbWFjaGluZV9pbl9hbnlfZGVmX3N0YXRlbWFjaGluZTQ2OTgJPSB7IEZPTExPV19kZWZfc3RhdGVtYWNoaW5lX2luX2FueV9kZWZfc3RhdGVtYWNoaW5lNDY5OF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zNzlfaW5fZGVmX3N0YXRlbWFjaGluZTQ3MzYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzM3OV9pbl9kZWZfc3RhdGVtYWNoaW5lNDczNl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4NTAwNDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zNzlfaW5fZGVmX3N0YXRlbWFjaGluZTQ3MzYJPSB7IEZPTExPV18zNzlfaW5fZGVmX3N0YXRlbWFjaGluZTQ3MzZfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTFRfX2luX2RlZl9zdGF0ZW1hY2hpbmU0NzQzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MVF9faW5fZGVmX3N0YXRlbWFjaGluZTQ3NDNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDEwMDQyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDE4MDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDA4MDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMTAwMDAwNTQwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAxMDAwMDAwMDQwODIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTFRfX2luX2RlZl9zdGF0ZW1hY2hpbmU0NzQzCT0geyBGT0xMT1dfTFRfX2luX2RlZl9zdGF0ZW1hY2hpbmU0NzQzX2JpdHMsIDYJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzMyMV9pbl9kZWZfc3RhdGVtYWNoaW5lNDc1MyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzIxX2luX2RlZl9zdGF0ZW1hY2hpbmU0NzUzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAxODAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwODAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTAwMDAwMDU0MDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMTAwMDAwMDA0MDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzMyMV9pbl9kZWZfc3RhdGVtYWNoaW5lNDc1Mwk9IHsgRk9MTE9XXzMyMV9pbl9kZWZfc3RhdGVtYWNoaW5lNDc1M19iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leGVjdXRhYmxlX3NwZWNpZmllcl9pbl9kZWZfc3RhdGVtYWNoaW5lNDc1OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhlY3V0YWJsZV9zcGVjaWZpZXJfaW5fZGVmX3N0YXRlbWFjaGluZTQ3NTlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDA4MDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhlY3V0YWJsZV9zcGVjaWZpZXJfaW5fZGVmX3N0YXRlbWFjaGluZTQ3NTkJPSB7IEZPTExPV19leGVjdXRhYmxlX3NwZWNpZmllcl9pbl9kZWZfc3RhdGVtYWNoaW5lNDc1OV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19DT01NQV9pbl9kZWZfc3RhdGVtYWNoaW5lNDc2OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQ09NTUFfaW5fZGVmX3N0YXRlbWFjaGluZTQ3NjlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDEwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQ09NTUFfaW5fZGVmX3N0YXRlbWFjaGluZTQ3NjkJPSB7IEZPTExPV19DT01NQV9pbl9kZWZfc3RhdGVtYWNoaW5lNDc2OV9iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfaW5zdGFuY2VfY291bnRfaW5fZGVmX3N0YXRlbWFjaGluZTQ3NzIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlZl9pbnN0YW5jZV9jb3VudF9pbl9kZWZfc3RhdGVtYWNoaW5lNDc3Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWZfaW5zdGFuY2VfY291bnRfaW5fZGVmX3N0YXRlbWFjaGluZTQ3NzIJPSB7IEZPTExPV19kZWZfaW5zdGFuY2VfY291bnRfaW5fZGVmX3N0YXRlbWFjaGluZTQ3NzJfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX2luc3RhbmNlX2NvdW50X2luX2RlZl9zdGF0ZW1hY2hpbmU0Nzg1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWZfaW5zdGFuY2VfY291bnRfaW5fZGVmX3N0YXRlbWFjaGluZTQ3ODVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX2luc3RhbmNlX2NvdW50X2luX2RlZl9zdGF0ZW1hY2hpbmU0Nzg1CT0geyBGT0xMT1dfZGVmX2luc3RhbmNlX2NvdW50X2luX2RlZl9zdGF0ZW1hY2hpbmU0Nzg1X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0dUX2luX2RlZl9zdGF0ZW1hY2hpbmU0Nzk4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19HVF9pbl9kZWZfc3RhdGVtYWNoaW5lNDc5OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4NTAwNDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19HVF9pbl9kZWZfc3RhdGVtYWNoaW5lNDc5OAk9IHsgRk9MTE9XX0dUX2luX2RlZl9zdGF0ZW1hY2hpbmU0Nzk4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lEX2luX2RlZl9zdGF0ZW1hY2hpbmU0ODE0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19JRF9pbl9kZWZfc3RhdGVtYWNoaW5lNDgxNF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MTAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDgwMDAwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JRF9pbl9kZWZfc3RhdGVtYWNoaW5lNDgxNAk9IHsgRk9MTE9XX0lEX2luX2RlZl9zdGF0ZW1hY2hpbmU0ODE0X2JpdHMsIDYJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xCUkFDS0VUX2luX2RlZl9zdGF0ZW1hY2hpbmU0ODI4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MQlJBQ0tFVF9pbl9kZWZfc3RhdGVtYWNoaW5lNDgyOF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDIwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MQlJBQ0tFVF9pbl9kZWZfc3RhdGVtYWNoaW5lNDgyOAk9IHsgRk9MTE9XX0xCUkFDS0VUX2luX2RlZl9zdGF0ZW1hY2hpbmU0ODI4X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xCUkFDS0VUX0VYQ0VQVF9pbl9kZWZfc3RhdGVtYWNoaW5lNDg0NyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTEJSQUNLRVRfRVhDRVBUX2luX2RlZl9zdGF0ZW1hY2hpbmU0ODQ3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMjAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xCUkFDS0VUX0VYQ0VQVF9pbl9kZWZfc3RhdGVtYWNoaW5lNDg0Nwk9IHsgRk9MTE9XX0xCUkFDS0VUX0VYQ0VQVF9pbl9kZWZfc3RhdGVtYWNoaW5lNDg0N19iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19JRF9pbl9kZWZfc3RhdGVtYWNoaW5lNDg3MyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfSURfaW5fZGVmX3N0YXRlbWFjaGluZTQ4NzNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA4MDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDEwMDAwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfSURfaW5fZGVmX3N0YXRlbWFjaGluZTQ4NzMJPSB7IEZPTExPV19JRF9pbl9kZWZfc3RhdGVtYWNoaW5lNDg3M19iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19DT01NQV9pbl9kZWZfc3RhdGVtYWNoaW5lNDg5NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQ09NTUFfaW5fZGVmX3N0YXRlbWFjaGluZTQ4OTVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQ09NTUFfaW5fZGVmX3N0YXRlbWFjaGluZTQ4OTUJPSB7IEZPTExPV19DT01NQV9pbl9kZWZfc3RhdGVtYWNoaW5lNDg5NV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19JRF9pbl9kZWZfc3RhdGVtYWNoaW5lNDg5OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfSURfaW5fZGVmX3N0YXRlbWFjaGluZTQ4OTlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA4MDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDEwMDAwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfSURfaW5fZGVmX3N0YXRlbWFjaGluZTQ4OTkJPSB7IEZPTExPV19JRF9pbl9kZWZfc3RhdGVtYWNoaW5lNDg5OV9iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TVEFSX2luX2RlZl9zdGF0ZW1hY2hpbmU0OTE1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19TVEFSX2luX2RlZl9zdGF0ZW1hY2hpbmU0OTE1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgxMDAwMDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1NUQVJfaW5fZGVmX3N0YXRlbWFjaGluZTQ5MTUJPSB7IEZPTExPV19TVEFSX2luX2RlZl9zdGF0ZW1hY2hpbmU0OTE1X2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1JCUkFDS0VUX2luX2RlZl9zdGF0ZW1hY2hpbmU0OTM2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19SQlJBQ0tFVF9pbl9kZWZfc3RhdGVtYWNoaW5lNDkzNl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MTAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDgwMDAwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19SQlJBQ0tFVF9pbl9kZWZfc3RhdGVtYWNoaW5lNDkzNgk9IHsgRk9MTE9XX1JCUkFDS0VUX2luX2RlZl9zdGF0ZW1hY2hpbmU0OTM2X2JpdHMsIDYJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1N0cmluZ0xpdGVyYWxfaW5fZGVmX3N0YXRlbWFjaGluZTQ5NTMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1N0cmluZ0xpdGVyYWxfaW5fZGVmX3N0YXRlbWFjaGluZTQ5NTNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDEwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA4MDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU3RyaW5nTGl0ZXJhbF9pbl9kZWZfc3RhdGVtYWNoaW5lNDk1Mwk9IHsgRk9MTE9XX1N0cmluZ0xpdGVyYWxfaW5fZGVmX3N0YXRlbWFjaGluZTQ5NTNfYml0cywgNgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX21hY2hpbmVfcGFyYW1ldGVyc19pbl9kZWZfc3RhdGVtYWNoaW5lNDk3MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX21hY2hpbmVfcGFyYW1ldGVyc19pbl9kZWZfc3RhdGVtYWNoaW5lNDk3MF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDgwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWZfbWFjaGluZV9wYXJhbWV0ZXJzX2luX2RlZl9zdGF0ZW1hY2hpbmU0OTcwCT0geyBGT0xMT1dfZGVmX21hY2hpbmVfcGFyYW1ldGVyc19pbl9kZWZfc3RhdGVtYWNoaW5lNDk3MF9iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfbWFjaGluZV9yZXR1cm5zX2luX2RlZl9zdGF0ZW1hY2hpbmU0OTc5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWZfbWFjaGluZV9yZXR1cm5zX2luX2RlZl9zdGF0ZW1hY2hpbmU0OTc5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl9tYWNoaW5lX3JldHVybnNfaW5fZGVmX3N0YXRlbWFjaGluZTQ5NzkJPSB7IEZPTExPV19kZWZfbWFjaGluZV9yZXR1cm5zX2luX2RlZl9zdGF0ZW1hY2hpbmU0OTc5X2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2RlZl9ib2R5X3N0YXRlbWFjaGluZV9pbl9kZWZfc3RhdGVtYWNoaW5lNDk4OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX2JvZHlfc3RhdGVtYWNoaW5lX2luX2RlZl9zdGF0ZW1hY2hpbmU0OTg4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl9ib2R5X3N0YXRlbWFjaGluZV9pbl9kZWZfc3RhdGVtYWNoaW5lNDk4OAk9IHsgRk9MTE9XX2RlZl9ib2R5X3N0YXRlbWFjaGluZV9pbl9kZWZfc3RhdGVtYWNoaW5lNDk4OF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MQ1VSTFlfaW5fZGVmX2JvZHlfc3RhdGVtYWNoaW5lNTAwNyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTENVUkxZX2luX2RlZl9ib2R5X3N0YXRlbWFjaGluZTUwMDdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDIwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDEwODQ1MDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDgwNUJGRTlGNzkpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTENVUkxZX2luX2RlZl9ib2R5X3N0YXRlbWFjaGluZTUwMDcJPSB7IEZPTExPV19MQ1VSTFlfaW5fZGVmX2JvZHlfc3RhdGVtYWNoaW5lNTAwN19iaXRzLCA0CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zZWN0aW9uX2hlYWRlcl9pbl9kZWZfYm9keV9zdGF0ZW1hY2hpbmU1MDEyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zZWN0aW9uX2hlYWRlcl9pbl9kZWZfYm9keV9zdGF0ZW1hY2hpbmU1MDEyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDg0NTAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDA4MDVCRkU5Rjc5KSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3NlY3Rpb25faGVhZGVyX2luX2RlZl9ib2R5X3N0YXRlbWFjaGluZTUwMTIJPSB7IEZPTExPV19zZWN0aW9uX2hlYWRlcl9pbl9kZWZfYm9keV9zdGF0ZW1hY2hpbmU1MDEyX2JpdHMsIDQJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3NlY3Rpb25faW1wb3J0X2luX2RlZl9ib2R5X3N0YXRlbWFjaGluZTUwMjAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NlY3Rpb25faW1wb3J0X2luX2RlZl9ib2R5X3N0YXRlbWFjaGluZTUwMjBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDIwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwODQ1MDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDgwNUJGRTlGNzgpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2VjdGlvbl9pbXBvcnRfaW5fZGVmX2JvZHlfc3RhdGVtYWNoaW5lNTAyMAk9IHsgRk9MTE9XX3NlY3Rpb25faW1wb3J0X2luX2RlZl9ib2R5X3N0YXRlbWFjaGluZTUwMjBfYml0cywgNAl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2VjdGlvbl9wYXJhbWV0ZXJfaW5fZGVmX2JvZHlfc3RhdGVtYWNoaW5lNTAzMSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2VjdGlvbl9wYXJhbWV0ZXJfaW5fZGVmX2JvZHlfc3RhdGVtYWNoaW5lNTAzMV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDA4NDUwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwODA1QkZFOUY3OCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZWN0aW9uX3BhcmFtZXRlcl9pbl9kZWZfYm9keV9zdGF0ZW1hY2hpbmU1MDMxCT0geyBGT0xMT1dfc2VjdGlvbl9wYXJhbWV0ZXJfaW5fZGVmX2JvZHlfc3RhdGVtYWNoaW5lNTAzMV9iaXRzLCA0CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zZWN0aW9uX3Byb3BlcnR5X2luX2RlZl9ib2R5X3N0YXRlbWFjaGluZTUwNTMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NlY3Rpb25fcHJvcGVydHlfaW5fZGVmX2JvZHlfc3RhdGVtYWNoaW5lNTA1M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDA4NDUwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwODA0M0Y4MUY2MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZWN0aW9uX3Byb3BlcnR5X2luX2RlZl9ib2R5X3N0YXRlbWFjaGluZTUwNTMJPSB7IEZPTExPV19zZWN0aW9uX3Byb3BlcnR5X2luX2RlZl9ib2R5X3N0YXRlbWFjaGluZTUwNTNfYml0cywgNAl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlX2luX2RlZl9ib2R5X3N0YXRlbWFjaGluZTUwNjYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZV9pbl9kZWZfYm9keV9zdGF0ZW1hY2hpbmU1MDY2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDgwNTAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDA4MDQyOTAxRjYwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3NlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZV9pbl9kZWZfYm9keV9zdGF0ZW1hY2hpbmU1MDY2CT0geyBGT0xMT1dfc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlX2luX2RlZl9ib2R5X3N0YXRlbWFjaGluZTUwNjZfYml0cywgNAl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2VjdGlvbl9yZWdpb25faW5fZGVmX2JvZHlfc3RhdGVtYWNoaW5lNTA3NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2VjdGlvbl9yZWdpb25faW5fZGVmX2JvZHlfc3RhdGVtYWNoaW5lNTA3Nl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDEwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwODAwMDAwMTQ0MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZWN0aW9uX3JlZ2lvbl9pbl9kZWZfYm9keV9zdGF0ZW1hY2hpbmU1MDc2CT0geyBGT0xMT1dfc2VjdGlvbl9yZWdpb25faW5fZGVmX2JvZHlfc3RhdGVtYWNoaW5lNTA3Nl9iaXRzLCA0CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zZWN0aW9uX3RyYW5zaXRpb25faW5fZGVmX2JvZHlfc3RhdGVtYWNoaW5lNTA4NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2VjdGlvbl90cmFuc2l0aW9uX2luX2RlZl9ib2R5X3N0YXRlbWFjaGluZTUwODVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDIwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAxMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDE0NDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2VjdGlvbl90cmFuc2l0aW9uX2luX2RlZl9ib2R5X3N0YXRlbWFjaGluZTUwODUJPSB7IEZPTExPV19zZWN0aW9uX3RyYW5zaXRpb25faW5fZGVmX2JvZHlfc3RhdGVtYWNoaW5lNTA4NV9iaXRzLCA0CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zZWN0aW9uX21vZGVsX29mX2NvbXB1dGF0aW9uX2luX2RlZl9ib2R5X3N0YXRlbWFjaGluZTUxMDYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NlY3Rpb25fbW9kZWxfb2ZfY29tcHV0YXRpb25faW5fZGVmX2JvZHlfc3RhdGVtYWNoaW5lNTEwNl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDEwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMTQ0MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZWN0aW9uX21vZGVsX29mX2NvbXB1dGF0aW9uX2luX2RlZl9ib2R5X3N0YXRlbWFjaGluZTUxMDYJPSB7IEZPTExPV19zZWN0aW9uX21vZGVsX29mX2NvbXB1dGF0aW9uX2luX2RlZl9ib2R5X3N0YXRlbWFjaGluZTUxMDZfYml0cywgNAl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2VjdGlvbl9tb2RlbF9vZl9leGVjdXRpb25faW5fZGVmX2JvZHlfc3RhdGVtYWNoaW5lNTExNCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2VjdGlvbl9tb2RlbF9vZl9leGVjdXRpb25faW5fZGVmX2JvZHlfc3RhdGVtYWNoaW5lNTExNF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDEwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMTQ0MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZWN0aW9uX21vZGVsX29mX2V4ZWN1dGlvbl9pbl9kZWZfYm9keV9zdGF0ZW1hY2hpbmU1MTE0CT0geyBGT0xMT1dfc2VjdGlvbl9tb2RlbF9vZl9leGVjdXRpb25faW5fZGVmX2JvZHlfc3RhdGVtYWNoaW5lNTExNF9iaXRzLCA0CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zZWN0aW9uX21vZGVsX29mX2ludGVyYWN0aW9uX2luX2RlZl9ib2R5X3N0YXRlbWFjaGluZTUxMjIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NlY3Rpb25fbW9kZWxfb2ZfaW50ZXJhY3Rpb25faW5fZGVmX2JvZHlfc3RhdGVtYWNoaW5lNTEyMl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDEwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMTQ0MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZWN0aW9uX21vZGVsX29mX2ludGVyYWN0aW9uX2luX2RlZl9ib2R5X3N0YXRlbWFjaGluZTUxMjIJPSB7IEZPTExPV19zZWN0aW9uX21vZGVsX29mX2ludGVyYWN0aW9uX2luX2RlZl9ib2R5X3N0YXRlbWFjaGluZTUxMjJfYml0cywgNAl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfUkNVUkxZX2luX2RlZl9ib2R5X3N0YXRlbWFjaGluZTUxMzQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1JDVVJMWV9pbl9kZWZfYm9keV9zdGF0ZW1hY2hpbmU1MTM0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1JDVVJMWV9pbl9kZWZfYm9keV9zdGF0ZW1hY2hpbmU1MTM0CT0geyBGT0xMT1dfUkNVUkxZX2luX2RlZl9ib2R5X3N0YXRlbWFjaGluZTUxMzRfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjE3X2luX3NlY3Rpb25fcmVnaW9uNTE1MiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjE3X2luX3NlY3Rpb25fcmVnaW9uNTE1Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMjdCMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDQwNDAwMDAwMDAxMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MEMwMDAwMDIwMDAwMDAwNCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDQwMDIwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yMTdfaW5fc2VjdGlvbl9yZWdpb241MTUyCT0geyBGT0xMT1dfMjE3X2luX3NlY3Rpb25fcmVnaW9uNTE1Ml9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19hbnlfZGVmX3N0YXRlbWFjaGluZV9pbl9zZWN0aW9uX3JlZ2lvbjUxNjcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2FueV9kZWZfc3RhdGVtYWNoaW5lX2luX3NlY3Rpb25fcmVnaW9uNTE2N19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMjdCMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDQwNDAwMDAwMDAxMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MEMwMDAwMDIwMDAwMDAwNCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDQwMDIwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19hbnlfZGVmX3N0YXRlbWFjaGluZV9pbl9zZWN0aW9uX3JlZ2lvbjUxNjcJPSB7IEZPTExPV19hbnlfZGVmX3N0YXRlbWFjaGluZV9pbl9zZWN0aW9uX3JlZ2lvbjUxNjdfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjI3X2luX3NlY3Rpb25fc3RhdGVtYWNoaW5lNTE4OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjI3X2luX3NlY3Rpb25fc3RhdGVtYWNoaW5lNTE4OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMjdCMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDQwNDAwMDAwMDAxMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MEMwMDAwMDIwMDAwMDAwNCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDQwMDIwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yMjdfaW5fc2VjdGlvbl9zdGF0ZW1hY2hpbmU1MTg4CT0geyBGT0xMT1dfMjI3X2luX3NlY3Rpb25fc3RhdGVtYWNoaW5lNTE4OF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19hbnlfZGVmX3N0YXRlbWFjaGluZV9pbl9zZWN0aW9uX3N0YXRlbWFjaGluZTUyMDMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2FueV9kZWZfc3RhdGVtYWNoaW5lX2luX3NlY3Rpb25fc3RhdGVtYWNoaW5lNTIwM19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMjdCMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDQwNDAwMDAwMDAxMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MEMwMDAwMDIwMDAwMDAwNCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDQwMDIwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19hbnlfZGVmX3N0YXRlbWFjaGluZV9pbl9zZWN0aW9uX3N0YXRlbWFjaGluZTUyMDMJPSB7IEZPTExPV19hbnlfZGVmX3N0YXRlbWFjaGluZV9pbl9zZWN0aW9uX3N0YXRlbWFjaGluZTUyMDNfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzc4X2luX2RlZl9zdGF0ZTUyMzUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzM3OF9pbl9kZWZfc3RhdGU1MjM1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHg1MDA0MDAwMDgwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAyN0YyMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzM3OF9pbl9kZWZfc3RhdGU1MjM1CT0geyBGT0xMT1dfMzc4X2luX2RlZl9zdGF0ZTUyMzVfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTFRfX2luX2RlZl9zdGF0ZTUyNDIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xUX19pbl9kZWZfc3RhdGU1MjQyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAxODAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwODAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTAwMDAwMDU0MDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMTAwMDAwMDA0MDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xUX19pbl9kZWZfc3RhdGU1MjQyCT0geyBGT0xMT1dfTFRfX2luX2RlZl9zdGF0ZTUyNDJfYml0cywgNgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzIxX2luX2RlZl9zdGF0ZTUyNDYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzMyMV9pbl9kZWZfc3RhdGU1MjQ2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAxODAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwODAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTAwMDAwMDU0MDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMTAwMDAwMDA0MDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzMyMV9pbl9kZWZfc3RhdGU1MjQ2CT0geyBGT0xMT1dfMzIxX2luX2RlZl9zdGF0ZTUyNDZfYml0cywgNgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhlY3V0YWJsZV9zcGVjaWZpZXJfaW5fZGVmX3N0YXRlNTI1MiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhlY3V0YWJsZV9zcGVjaWZpZXJfaW5fZGVmX3N0YXRlNTI1Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leGVjdXRhYmxlX3NwZWNpZmllcl9pbl9kZWZfc3RhdGU1MjUyCT0geyBGT0xMT1dfZXhlY3V0YWJsZV9zcGVjaWZpZXJfaW5fZGVmX3N0YXRlNTI1Ml9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19HVF9pbl9kZWZfc3RhdGU1MjU2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19HVF9pbl9kZWZfc3RhdGU1MjU2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHg1MDA0MDAwMDgwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAyN0YyMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0dUX2luX2RlZl9zdGF0ZTUyNTYJPSB7IEZPTExPV19HVF9pbl9kZWZfc3RhdGU1MjU2X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3N0YXRlX2lkX2luX2RlZl9zdGF0ZTUyNzggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3N0YXRlX2lkX2luX2RlZl9zdGF0ZTUyNzhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc3RhdGVfaWRfaW5fZGVmX3N0YXRlNTI3OAk9IHsgRk9MTE9XX3N0YXRlX2lkX2luX2RlZl9zdGF0ZTUyNzhfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTEJSQUNLRVRfaW5fZGVmX3N0YXRlNTI5NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTEJSQUNLRVRfaW5fZGVmX3N0YXRlNTI5NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDA4MDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMjdGMDIwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MQlJBQ0tFVF9pbl9kZWZfc3RhdGU1Mjk1CT0geyBGT0xMT1dfTEJSQUNLRVRfaW5fZGVmX3N0YXRlNTI5NV9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MQlJBQ0tFVF9FWENFUFRfaW5fZGVmX3N0YXRlNTMxNCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTEJSQUNLRVRfRVhDRVBUX2luX2RlZl9zdGF0ZTUzMTRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwODAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDI3RjAyMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTEJSQUNLRVRfRVhDRVBUX2luX2RlZl9zdGF0ZTUzMTQJPSB7IEZPTExPV19MQlJBQ0tFVF9FWENFUFRfaW5fZGVmX3N0YXRlNTMxNF9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zdGF0ZV9pZF9pbl9kZWZfc3RhdGU1MzQwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zdGF0ZV9pZF9pbl9kZWZfc3RhdGU1MzQwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwODAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgxMDAwMDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3N0YXRlX2lkX2luX2RlZl9zdGF0ZTUzNDAJPSB7IEZPTExPV19zdGF0ZV9pZF9pbl9kZWZfc3RhdGU1MzQwX2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0NPTU1BX2luX2RlZl9zdGF0ZTUzNjIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0NPTU1BX2luX2RlZl9zdGF0ZTUzNjJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwODAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDI3RjAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQ09NTUFfaW5fZGVmX3N0YXRlNTM2Mgk9IHsgRk9MTE9XX0NPTU1BX2luX2RlZl9zdGF0ZTUzNjJfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc3RhdGVfaWRfaW5fZGVmX3N0YXRlNTM2NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc3RhdGVfaWRfaW5fZGVmX3N0YXRlNTM2Nl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDgwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MTAwMDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zdGF0ZV9pZF9pbl9kZWZfc3RhdGU1MzY2CT0geyBGT0xMT1dfc3RhdGVfaWRfaW5fZGVmX3N0YXRlNTM2Nl9iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TVEFSX2luX2RlZl9zdGF0ZTUzODIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1NUQVJfaW5fZGVmX3N0YXRlNTM4Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MTAwMDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19TVEFSX2luX2RlZl9zdGF0ZTUzODIJPSB7IEZPTExPV19TVEFSX2luX2RlZl9zdGF0ZTUzODJfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfUkJSQUNLRVRfaW5fZGVmX3N0YXRlNTQwMyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfUkJSQUNLRVRfaW5fZGVmX3N0YXRlNTQwM19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19SQlJBQ0tFVF9pbl9kZWZfc3RhdGU1NDAzCT0geyBGT0xMT1dfUkJSQUNLRVRfaW5fZGVmX3N0YXRlNTQwM19iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TdHJpbmdMaXRlcmFsX2luX2RlZl9zdGF0ZTU0MjcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1N0cmluZ0xpdGVyYWxfaW5fZGVmX3N0YXRlNTQyN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19TdHJpbmdMaXRlcmFsX2luX2RlZl9zdGF0ZTU0MjcJPSB7IEZPTExPV19TdHJpbmdMaXRlcmFsX2luX2RlZl9zdGF0ZTU0MjdfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX2JvZHlfc3RhdGVfaW5fZGVmX3N0YXRlNTQ0NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX2JvZHlfc3RhdGVfaW5fZGVmX3N0YXRlNTQ0Nl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWZfYm9keV9zdGF0ZV9pbl9kZWZfc3RhdGU1NDQ2CT0geyBGT0xMT1dfZGVmX2JvZHlfc3RhdGVfaW5fZGVmX3N0YXRlNTQ0Nl9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TRU1JX2luX2RlZl9zdGF0ZTU0NTEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1NFTUlfaW5fZGVmX3N0YXRlNTQ1MV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19TRU1JX2luX2RlZl9zdGF0ZTU0NTEJPSB7IEZPTExPV19TRU1JX2luX2RlZl9zdGF0ZTU0NTFfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTQ2X2luX3N0YXRlX2t3X2lkNTQ2OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMTQ2X2luX3N0YXRlX2t3X2lkNTQ2OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18xNDZfaW5fc3RhdGVfa3dfaWQ1NDY5CT0geyBGT0xMT1dfMTQ2X2luX3N0YXRlX2t3X2lkNTQ2OV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18xNDdfaW5fc3RhdGVfa3dfaWQ1NDgxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18xNDdfaW5fc3RhdGVfa3dfaWQ1NDgxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE0N19pbl9zdGF0ZV9rd19pZDU0ODEJPSB7IEZPTExPV18xNDdfaW5fc3RhdGVfa3dfaWQ1NDgxX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzE1MF9pbl9zdGF0ZV9rd19pZDU0OTAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzE1MF9pbl9zdGF0ZV9rd19pZDU0OTBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMTUwX2luX3N0YXRlX2t3X2lkNTQ5MAk9IHsgRk9MTE9XXzE1MF9pbl9zdGF0ZV9rd19pZDU0OTBfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTQ0X2luX3N0YXRlX2t3X2lkNTUwMiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMTQ0X2luX3N0YXRlX2t3X2lkNTUwMl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18xNDRfaW5fc3RhdGVfa3dfaWQ1NTAyCT0geyBGT0xMT1dfMTQ0X2luX3N0YXRlX2t3X2lkNTUwMl9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18xNDlfaW5fc3RhdGVfa3dfaWQ1NTEwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18xNDlfaW5fc3RhdGVfa3dfaWQ1NTEwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE0OV9pbl9zdGF0ZV9rd19pZDU1MTAJPSB7IEZPTExPV18xNDlfaW5fc3RhdGVfa3dfaWQ1NTEwX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzE0NV9pbl9zdGF0ZV9rd19pZDU1MTkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzE0NV9pbl9zdGF0ZV9rd19pZDU1MTlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMTQ1X2luX3N0YXRlX2t3X2lkNTUxOQk9IHsgRk9MTE9XXzE0NV9pbl9zdGF0ZV9rd19pZDU1MTlfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTUzX2luX3N0YXRlX2t3X2lkNTUyOCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMTUzX2luX3N0YXRlX2t3X2lkNTUyOF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18xNTNfaW5fc3RhdGVfa3dfaWQ1NTI4CT0geyBGT0xMT1dfMTUzX2luX3N0YXRlX2t3X2lkNTUyOF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18xNDhfaW5fc3RhdGVfa3dfaWQ1NTM3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18xNDhfaW5fc3RhdGVfa3dfaWQ1NTM3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE0OF9pbl9zdGF0ZV9rd19pZDU1MzcJPSB7IEZPTExPV18xNDhfaW5fc3RhdGVfa3dfaWQ1NTM3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3N0YXRlX2t3X2lkX2luX3N0YXRlX2lkNTU1NyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc3RhdGVfa3dfaWRfaW5fc3RhdGVfaWQ1NTU3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3N0YXRlX2t3X2lkX2luX3N0YXRlX2lkNTU1Nwk9IHsgRk9MTE9XX3N0YXRlX2t3X2lkX2luX3N0YXRlX2lkNTU1N19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19JRF9pbl9zdGF0ZV9pZDU1NjcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0lEX2luX3N0YXRlX2lkNTU2N19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JRF9pbl9zdGF0ZV9pZDU1NjcJPSB7IEZPTExPV19JRF9pbl9zdGF0ZV9pZDU1NjdfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfRE9MTEFSX2luX3N0YXRlX2lkNTU4NCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfRE9MTEFSX2luX3N0YXRlX2lkNTU4NF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19ET0xMQVJfaW5fc3RhdGVfaWQ1NTg0CT0geyBGT0xMT1dfRE9MTEFSX2luX3N0YXRlX2lkNTU4NF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19JRF9pbl9zdGF0ZV9pZDU1ODggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0lEX2luX3N0YXRlX2lkNTU4OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JRF9pbl9zdGF0ZV9pZDU1ODgJPSB7IEZPTExPV19JRF9pbl9zdGF0ZV9pZDU1ODhfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTQ3X2luX2RlZl9zdGF0ZV9zaW5nbGV0b241NjI0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18xNDdfaW5fZGVmX3N0YXRlX3NpbmdsZXRvbjU2MjRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDEpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMTQ3X2luX2RlZl9zdGF0ZV9zaW5nbGV0b241NjI0CT0geyBGT0xMT1dfMTQ3X2luX2RlZl9zdGF0ZV9zaW5nbGV0b241NjI0X2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzE1MF9pbl9kZWZfc3RhdGVfc2luZ2xldG9uNTYzNyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMTUwX2luX2RlZl9zdGF0ZV9zaW5nbGV0b241NjM3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE1MF9pbl9kZWZfc3RhdGVfc2luZ2xldG9uNTYzNwk9IHsgRk9MTE9XXzE1MF9pbl9kZWZfc3RhdGVfc2luZ2xldG9uNTYzN19iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18xNDRfaW5fZGVmX3N0YXRlX3NpbmdsZXRvbjU2NTAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzE0NF9pbl9kZWZfc3RhdGVfc2luZ2xldG9uNTY1MF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMSkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18xNDRfaW5fZGVmX3N0YXRlX3NpbmdsZXRvbjU2NTAJPSB7IEZPTExPV18xNDRfaW5fZGVmX3N0YXRlX3NpbmdsZXRvbjU2NTBfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTQ5X2luX2RlZl9zdGF0ZV9zaW5nbGV0b241NjYzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18xNDlfaW5fZGVmX3N0YXRlX3NpbmdsZXRvbjU2NjNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDEpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMTQ5X2luX2RlZl9zdGF0ZV9zaW5nbGV0b241NjYzCT0geyBGT0xMT1dfMTQ5X2luX2RlZl9zdGF0ZV9zaW5nbGV0b241NjYzX2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xDVVJMWV9pbl9kZWZfc3RhdGVfc2luZ2xldG9uNTY3OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTENVUkxZX2luX2RlZl9zdGF0ZV9zaW5nbGV0b241Njc4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMTAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHhFMTRBMDYwMDAyN0IwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA4MDAwMTgwMDAwMDg0KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHg0NDA2MDQwMDA0MDEwMDQ4KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgxQzAwMTIwQTIwMjAwMDA0KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDRDNDAxQTAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xDVVJMWV9pbl9kZWZfc3RhdGVfc2luZ2xldG9uNTY3OAk9IHsgRk9MTE9XX0xDVVJMWV9pbl9kZWZfc3RhdGVfc2luZ2xldG9uNTY3OF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfYm9keV9zdGF0ZV9zaW1wbGlmX2luX2RlZl9zdGF0ZV9zaW5nbGV0b241NjgxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWZfYm9keV9zdGF0ZV9zaW1wbGlmX2luX2RlZl9zdGF0ZV9zaW5nbGV0b241NjgxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl9ib2R5X3N0YXRlX3NpbXBsaWZfaW5fZGVmX3N0YXRlX3NpbmdsZXRvbjU2ODEJPSB7IEZPTExPV19kZWZfYm9keV9zdGF0ZV9zaW1wbGlmX2luX2RlZl9zdGF0ZV9zaW5nbGV0b241NjgxX2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1JDVVJMWV9pbl9kZWZfc3RhdGVfc2luZ2xldG9uNTY4NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfUkNVUkxZX2luX2RlZl9zdGF0ZV9zaW5nbGV0b241Njg1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1JDVVJMWV9pbl9kZWZfc3RhdGVfc2luZ2xldG9uNTY4NQk9IHsgRk9MTE9XX1JDVVJMWV9pbl9kZWZfc3RhdGVfc2luZ2xldG9uNTY4NV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18xNDVfaW5fZGVmX3N0YXRlX3NpbmdsZXRvbjU2OTEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzE0NV9pbl9kZWZfc3RhdGVfc2luZ2xldG9uNTY5MV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMSkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18xNDVfaW5fZGVmX3N0YXRlX3NpbmdsZXRvbjU2OTEJPSB7IEZPTExPV18xNDVfaW5fZGVmX3N0YXRlX3NpbmdsZXRvbjU2OTFfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9zdGF0ZV9zaW5nbGV0b241Njk1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19ibG9ja19zdGF0ZW1lbnRfaW5fZGVmX3N0YXRlX3NpbmdsZXRvbjU2OTVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9zdGF0ZV9zaW5nbGV0b241Njk1CT0geyBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9zdGF0ZV9zaW5nbGV0b241Njk1X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzE1M19pbl9kZWZfc3RhdGVfc2luZ2xldG9uNTcwNCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMTUzX2luX2RlZl9zdGF0ZV9zaW5nbGV0b241NzA0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE1M19pbl9kZWZfc3RhdGVfc2luZ2xldG9uNTcwNAk9IHsgRk9MTE9XXzE1M19pbl9kZWZfc3RhdGVfc2luZ2xldG9uNTcwNF9iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19ibG9ja19zdGF0ZW1lbnRfaW5fZGVmX3N0YXRlX3NpbmdsZXRvbjU3MDggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfc3RhdGVfc2luZ2xldG9uNTcwOF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19ibG9ja19zdGF0ZW1lbnRfaW5fZGVmX3N0YXRlX3NpbmdsZXRvbjU3MDgJPSB7IEZPTExPV19ibG9ja19zdGF0ZW1lbnRfaW5fZGVmX3N0YXRlX3NpbmdsZXRvbjU3MDhfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTQ4X2luX2RlZl9zdGF0ZV9zaW5nbGV0b241NzE3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18xNDhfaW5fZGVmX3N0YXRlX3NpbmdsZXRvbjU3MTdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDEpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMTQ4X2luX2RlZl9zdGF0ZV9zaW5nbGV0b241NzE3CT0geyBGT0xMT1dfMTQ4X2luX2RlZl9zdGF0ZV9zaW5nbGV0b241NzE3X2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfc3RhdGVfc2luZ2xldG9uNTcyMSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9zdGF0ZV9zaW5nbGV0b241NzIxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfc3RhdGVfc2luZ2xldG9uNTcyMQk9IHsgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfc3RhdGVfc2luZ2xldG9uNTcyMV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tX2luX2V4ZWN1dGFibGVfc3BlY2lmaWVyNTc0MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhlY3V0YWJsZV9zcGVjaWZpZXJfYXRvbV9pbl9leGVjdXRhYmxlX3NwZWNpZmllcjU3NDBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAyMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhlY3V0YWJsZV9zcGVjaWZpZXJfYXRvbV9pbl9leGVjdXRhYmxlX3NwZWNpZmllcjU3NDAJPSB7IEZPTExPV19leGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tX2luX2V4ZWN1dGFibGVfc3BlY2lmaWVyNTc0MF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19CQU5EX2luX2V4ZWN1dGFibGVfc3BlY2lmaWVyNTc0OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQkFORF9pbl9leGVjdXRhYmxlX3NwZWNpZmllcjU3NDhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDE4MDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDA4MDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMDAwMDAwNTQwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAxMDAwMDAwMDQwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQkFORF9pbl9leGVjdXRhYmxlX3NwZWNpZmllcjU3NDgJPSB7IEZPTExPV19CQU5EX2luX2V4ZWN1dGFibGVfc3BlY2lmaWVyNTc0OF9iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tX2luX2V4ZWN1dGFibGVfc3BlY2lmaWVyNTc1MiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhlY3V0YWJsZV9zcGVjaWZpZXJfYXRvbV9pbl9leGVjdXRhYmxlX3NwZWNpZmllcjU3NTJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAyMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhlY3V0YWJsZV9zcGVjaWZpZXJfYXRvbV9pbl9leGVjdXRhYmxlX3NwZWNpZmllcjU3NTIJPSB7IEZPTExPV19leGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tX2luX2V4ZWN1dGFibGVfc3BlY2lmaWVyNTc1Ml9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19JRF9pbl9leGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tNTc3MiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfSURfaW5fZXhlY3V0YWJsZV9zcGVjaWZpZXJfYXRvbTU3NzJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfSURfaW5fZXhlY3V0YWJsZV9zcGVjaWZpZXJfYXRvbTU3NzIJPSB7IEZPTExPV19JRF9pbl9leGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tNTc3Ml9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zNzdfaW5fZXhlY3V0YWJsZV9zcGVjaWZpZXJfYXRvbTU3ODIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzM3N19pbl9leGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tNTc4Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zNzdfaW5fZXhlY3V0YWJsZV9zcGVjaWZpZXJfYXRvbTU3ODIJPSB7IEZPTExPV18zNzdfaW5fZXhlY3V0YWJsZV9zcGVjaWZpZXJfYXRvbTU3ODJfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjgyX2luX2V4ZWN1dGFibGVfc3BlY2lmaWVyX2F0b201Nzk0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yODJfaW5fZXhlY3V0YWJsZV9zcGVjaWZpZXJfYXRvbTU3OTRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjgyX2luX2V4ZWN1dGFibGVfc3BlY2lmaWVyX2F0b201Nzk0CT0geyBGT0xMT1dfMjgyX2luX2V4ZWN1dGFibGVfc3BlY2lmaWVyX2F0b201Nzk0X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzM2NF9pbl9leGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tNTgxMCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzY0X2luX2V4ZWN1dGFibGVfc3BlY2lmaWVyX2F0b201ODEwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzM2NF9pbl9leGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tNTgxMAk9IHsgRk9MTE9XXzM2NF9pbl9leGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tNTgxMF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yNTdfaW5fZXhlY3V0YWJsZV9zcGVjaWZpZXJfYXRvbTU4MjMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzI1N19pbl9leGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tNTgyM19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yNTdfaW5fZXhlY3V0YWJsZV9zcGVjaWZpZXJfYXRvbTU4MjMJPSB7IEZPTExPV18yNTdfaW5fZXhlY3V0YWJsZV9zcGVjaWZpZXJfYXRvbTU4MjNfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjg2X2luX2V4ZWN1dGFibGVfc3BlY2lmaWVyX2F0b201ODM1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yODZfaW5fZXhlY3V0YWJsZV9zcGVjaWZpZXJfYXRvbTU4MzVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjg2X2luX2V4ZWN1dGFibGVfc3BlY2lmaWVyX2F0b201ODM1CT0geyBGT0xMT1dfMjg2X2luX2V4ZWN1dGFibGVfc3BlY2lmaWVyX2F0b201ODM1X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzMxMl9pbl9leGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tNTg0OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzEyX2luX2V4ZWN1dGFibGVfc3BlY2lmaWVyX2F0b201ODQ4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzMxMl9pbl9leGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tNTg0OAk9IHsgRk9MTE9XXzMxMl9pbl9leGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tNTg0OF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yMzlfaW5fZXhlY3V0YWJsZV9zcGVjaWZpZXJfYXRvbTU4NjUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzIzOV9pbl9leGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tNTg2NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yMzlfaW5fZXhlY3V0YWJsZV9zcGVjaWZpZXJfYXRvbTU4NjUJPSB7IEZPTExPV18yMzlfaW5fZXhlY3V0YWJsZV9zcGVjaWZpZXJfYXRvbTU4NjVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzM0X2luX2V4ZWN1dGFibGVfc3BlY2lmaWVyX2F0b201ODc5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zMzRfaW5fZXhlY3V0YWJsZV9zcGVjaWZpZXJfYXRvbTU4NzlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzM0X2luX2V4ZWN1dGFibGVfc3BlY2lmaWVyX2F0b201ODc5CT0geyBGT0xMT1dfMzM0X2luX2V4ZWN1dGFibGVfc3BlY2lmaWVyX2F0b201ODc5X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzE1Ml9pbl9leGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tNTg5NCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMTUyX2luX2V4ZWN1dGFibGVfc3BlY2lmaWVyX2F0b201ODk0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE1Ml9pbl9leGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tNTg5NAk9IHsgRk9MTE9XXzE1Ml9pbl9leGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tNTg5NF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18xNTFfaW5fZXhlY3V0YWJsZV9zcGVjaWZpZXJfYXRvbTU5MDcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzE1MV9pbl9leGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tNTkwN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18xNTFfaW5fZXhlY3V0YWJsZV9zcGVjaWZpZXJfYXRvbTU5MDcJPSB7IEZPTExPV18xNTFfaW5fZXhlY3V0YWJsZV9zcGVjaWZpZXJfYXRvbTU5MDdfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjg0X2luX2V4ZWN1dGFibGVfc3BlY2lmaWVyX2F0b201OTIwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yODRfaW5fZXhlY3V0YWJsZV9zcGVjaWZpZXJfYXRvbTU5MjBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjg0X2luX2V4ZWN1dGFibGVfc3BlY2lmaWVyX2F0b201OTIwCT0geyBGT0xMT1dfMjg0X2luX2V4ZWN1dGFibGVfc3BlY2lmaWVyX2F0b201OTIwX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9pbnN0YW5jZV9tYWNoaW5lX21vZGVsNTk0NyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX2luc3RhbmNlX21hY2hpbmVfbW9kZWw1OTQ3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9pbnN0YW5jZV9tYWNoaW5lX21vZGVsNTk0Nwk9IHsgRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9pbnN0YW5jZV9tYWNoaW5lX21vZGVsNTk0N19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MQ1VSTFlfaW5fZGVmX2JvZHlfc3RhdGU1OTY0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MQ1VSTFlfaW5fZGVmX2JvZHlfc3RhdGU1OTY0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMTAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHhFMUNFNTYwMDAyN0IwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA4MDA4MUMzRjgxRkU0KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHg0NDA2MDQwMDA0MDEwMDQ4KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgxQzAwMTIwQTIwMjAwMDA0KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDRDNDAxQTAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xDVVJMWV9pbl9kZWZfYm9keV9zdGF0ZTU5NjQJPSB7IEZPTExPV19MQ1VSTFlfaW5fZGVmX2JvZHlfc3RhdGU1OTY0X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2RlZl9ib2R5X3N0YXRlX3NlY3Rpb25faW5fZGVmX2JvZHlfc3RhdGU1OTg0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWZfYm9keV9zdGF0ZV9zZWN0aW9uX2luX2RlZl9ib2R5X3N0YXRlNTk4NF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjAwMDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWZfYm9keV9zdGF0ZV9zZWN0aW9uX2luX2RlZl9ib2R5X3N0YXRlNTk4NAk9IHsgRk9MTE9XX2RlZl9ib2R5X3N0YXRlX3NlY3Rpb25faW5fZGVmX2JvZHlfc3RhdGU1OTg0X2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2RlZl9ib2R5X3N0YXRlX3NpbXBsaWZfaW5fZGVmX2JvZHlfc3RhdGU1OTkzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWZfYm9keV9zdGF0ZV9zaW1wbGlmX2luX2RlZl9ib2R5X3N0YXRlNTk5M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjAwMDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWZfYm9keV9zdGF0ZV9zaW1wbGlmX2luX2RlZl9ib2R5X3N0YXRlNTk5Mwk9IHsgRk9MTE9XX2RlZl9ib2R5X3N0YXRlX3NpbXBsaWZfaW5fZGVmX2JvZHlfc3RhdGU1OTkzX2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1JDVVJMWV9pbl9kZWZfYm9keV9zdGF0ZTYwMDQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1JDVVJMWV9pbl9kZWZfYm9keV9zdGF0ZTYwMDRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUkNVUkxZX2luX2RlZl9ib2R5X3N0YXRlNjAwNAk9IHsgRk9MTE9XX1JDVVJMWV9pbl9kZWZfYm9keV9zdGF0ZTYwMDRfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2VjdGlvbl9wcm9wZXJ0eV9pbl9kZWZfYm9keV9zdGF0ZV9zZWN0aW9uNjAxOSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2VjdGlvbl9wcm9wZXJ0eV9pbl9kZWZfYm9keV9zdGF0ZV9zZWN0aW9uNjAxOV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDA4NDUwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwODA0M0Y4MUY2MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZWN0aW9uX3Byb3BlcnR5X2luX2RlZl9ib2R5X3N0YXRlX3NlY3Rpb242MDE5CT0geyBGT0xMT1dfc2VjdGlvbl9wcm9wZXJ0eV9pbl9kZWZfYm9keV9zdGF0ZV9zZWN0aW9uNjAxOV9iaXRzLCA0CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmVfaW5fZGVmX2JvZHlfc3RhdGVfc2VjdGlvbjYwMzEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZV9pbl9kZWZfYm9keV9zdGF0ZV9zZWN0aW9uNjAzMV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDA4MDUwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwODA0MjkwMUY2MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmVfaW5fZGVmX2JvZHlfc3RhdGVfc2VjdGlvbjYwMzEJPSB7IEZPTExPV19zZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmVfaW5fZGVmX2JvZHlfc3RhdGVfc2VjdGlvbjYwMzFfYml0cywgNAl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2VjdGlvbl9yZWdpb25faW5fZGVmX2JvZHlfc3RhdGVfc2VjdGlvbjYwNDEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NlY3Rpb25fcmVnaW9uX2luX2RlZl9ib2R5X3N0YXRlX3NlY3Rpb242MDQxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMTAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDA4MDAwMDAxNDQwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3NlY3Rpb25fcmVnaW9uX2luX2RlZl9ib2R5X3N0YXRlX3NlY3Rpb242MDQxCT0geyBGT0xMT1dfc2VjdGlvbl9yZWdpb25faW5fZGVmX2JvZHlfc3RhdGVfc2VjdGlvbjYwNDFfYml0cywgNAl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2VjdGlvbl90cmFuc2l0aW9uX2luX2RlZl9ib2R5X3N0YXRlX3NlY3Rpb242MDUwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zZWN0aW9uX3RyYW5zaXRpb25faW5fZGVmX2JvZHlfc3RhdGVfc2VjdGlvbjYwNTBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAxMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDE0NDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2VjdGlvbl90cmFuc2l0aW9uX2luX2RlZl9ib2R5X3N0YXRlX3NlY3Rpb242MDUwCT0geyBGT0xMT1dfc2VjdGlvbl90cmFuc2l0aW9uX2luX2RlZl9ib2R5X3N0YXRlX3NlY3Rpb242MDUwX2JpdHMsIDQJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3NlY3Rpb25fbW9kZWxfb2ZfY29tcHV0YXRpb25faW5fZGVmX2JvZHlfc3RhdGVfc2VjdGlvbjYwNjEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NlY3Rpb25fbW9kZWxfb2ZfY29tcHV0YXRpb25faW5fZGVmX2JvZHlfc3RhdGVfc2VjdGlvbjYwNjFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAxMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDE0NDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2VjdGlvbl9tb2RlbF9vZl9jb21wdXRhdGlvbl9pbl9kZWZfYm9keV9zdGF0ZV9zZWN0aW9uNjA2MQk9IHsgRk9MTE9XX3NlY3Rpb25fbW9kZWxfb2ZfY29tcHV0YXRpb25faW5fZGVmX2JvZHlfc3RhdGVfc2VjdGlvbjYwNjFfYml0cywgNAl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2VjdGlvbl9tb2RlbF9vZl9leGVjdXRpb25faW5fZGVmX2JvZHlfc3RhdGVfc2VjdGlvbjYwNjkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NlY3Rpb25fbW9kZWxfb2ZfZXhlY3V0aW9uX2luX2RlZl9ib2R5X3N0YXRlX3NlY3Rpb242MDY5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMTAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAxNDQwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3NlY3Rpb25fbW9kZWxfb2ZfZXhlY3V0aW9uX2luX2RlZl9ib2R5X3N0YXRlX3NlY3Rpb242MDY5CT0geyBGT0xMT1dfc2VjdGlvbl9tb2RlbF9vZl9leGVjdXRpb25faW5fZGVmX2JvZHlfc3RhdGVfc2VjdGlvbjYwNjlfYml0cywgNAl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2VjdGlvbl9tb2RlbF9vZl9pbnRlcmFjdGlvbl9pbl9kZWZfYm9keV9zdGF0ZV9zZWN0aW9uNjA3NyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2VjdGlvbl9tb2RlbF9vZl9pbnRlcmFjdGlvbl9pbl9kZWZfYm9keV9zdGF0ZV9zZWN0aW9uNjA3N19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDEwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMTQ0MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZWN0aW9uX21vZGVsX29mX2ludGVyYWN0aW9uX2luX2RlZl9ib2R5X3N0YXRlX3NlY3Rpb242MDc3CT0geyBGT0xMT1dfc2VjdGlvbl9tb2RlbF9vZl9pbnRlcmFjdGlvbl9pbl9kZWZfYm9keV9zdGF0ZV9zZWN0aW9uNjA3N19iaXRzLCA0CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19tb2RpZmllcl9kZWNsYXJhdGlvbl9pbl9kZWZfYm9keV9zdGF0ZV9zaW1wbGlmNjExMiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfbW9kaWZpZXJfZGVjbGFyYXRpb25faW5fZGVmX2JvZHlfc3RhdGVfc2ltcGxpZjYxMTJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAxMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweEUxNEEwNjAwMDI3QjAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAxODAwMDAwODQpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDQ0MDQwMDAwMDAwMTAwNDgpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDBDMDAwMDAyMDAwMDAwMDQpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMEM0MDEyMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfbW9kaWZpZXJfZGVjbGFyYXRpb25faW5fZGVmX2JvZHlfc3RhdGVfc2ltcGxpZjYxMTIJPSB7IEZPTExPV19tb2RpZmllcl9kZWNsYXJhdGlvbl9pbl9kZWZfYm9keV9zdGF0ZV9zaW1wbGlmNjExMl9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWNsX3ZhcmlhYmxlX2luX2RlZl9ib2R5X3N0YXRlX3NpbXBsaWY2MTI4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWNsX3ZhcmlhYmxlX2luX2RlZl9ib2R5X3N0YXRlX3NpbXBsaWY2MTI4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMTAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHhFMTRBMDYwMDAyN0IwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA4MDAwMTgwMDAwMDg0KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHg0NDA2MDQwMDA0MDEwMDQ4KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgxQzAwMTIwQTIwMjAwMDA0KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDRDNDAxQTAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlY2xfdmFyaWFibGVfaW5fZGVmX2JvZHlfc3RhdGVfc2ltcGxpZjYxMjgJPSB7IEZPTExPV19kZWNsX3ZhcmlhYmxlX2luX2RlZl9ib2R5X3N0YXRlX3NpbXBsaWY2MTI4X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2FueV9kZWZfc3RhdGVtYWNoaW5lX2luX2RlZl9ib2R5X3N0YXRlX3NpbXBsaWY2MTQxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19hbnlfZGVmX3N0YXRlbWFjaGluZV9pbl9kZWZfYm9keV9zdGF0ZV9zaW1wbGlmNjE0MV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDEwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4RTE0QTA2MDAwMjdCMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwODAwMDE4MDAwMDA4NCksIEFOVExSM19VSU5UNjRfTElUKDB4NDQwNjA0MDAwNDAxMDA0OCksIEFOVExSM19VSU5UNjRfTElUKDB4MUMwMDEyMEEyMDIwMDAwNCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDA0QzQwMUEwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19hbnlfZGVmX3N0YXRlbWFjaGluZV9pbl9kZWZfYm9keV9zdGF0ZV9zaW1wbGlmNjE0MQk9IHsgRk9MTE9XX2FueV9kZWZfc3RhdGVtYWNoaW5lX2luX2RlZl9ib2R5X3N0YXRlX3NpbXBsaWY2MTQxX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2RlZl90cmFuc2l0aW9uX2luX2RlZl9ib2R5X3N0YXRlX3NpbXBsaWY2MTUyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWZfdHJhbnNpdGlvbl9pbl9kZWZfYm9keV9zdGF0ZV9zaW1wbGlmNjE1Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDEwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4RTE0QTA2MDAwMjdCMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwODAwMDE4MDAwMDA4NCksIEFOVExSM19VSU5UNjRfTElUKDB4NDQwNjA0MDAwNDAxMDA0OCksIEFOVExSM19VSU5UNjRfTElUKDB4MUMwMDEyMEEyMDIwMDAwNCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDA0QzQwMUEwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWZfdHJhbnNpdGlvbl9pbl9kZWZfYm9keV9zdGF0ZV9zaW1wbGlmNjE1Mgk9IHsgRk9MTE9XX2RlZl90cmFuc2l0aW9uX2luX2RlZl9ib2R5X3N0YXRlX3NpbXBsaWY2MTUyX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2RlZl9zdGF0ZV9hY3Rpdml0eV9pbl9kZWZfYm9keV9zdGF0ZV9zaW1wbGlmNjE2MyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX3N0YXRlX2FjdGl2aXR5X2luX2RlZl9ib2R5X3N0YXRlX3NpbXBsaWY2MTYzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMTAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHhFMTRBMDYwMDAyN0IwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA4MDAwMTgwMDAwMDg0KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHg0NDA2MDQwMDA0MDEwMDQ4KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgxQzAwMTIwQTIwMjAwMDA0KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDRDNDAxQTAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl9zdGF0ZV9hY3Rpdml0eV9pbl9kZWZfYm9keV9zdGF0ZV9zaW1wbGlmNjE2Mwk9IHsgRk9MTE9XX2RlZl9zdGF0ZV9hY3Rpdml0eV9pbl9kZWZfYm9keV9zdGF0ZV9zaW1wbGlmNjE2M19iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yMzFfaW5fc2VjdGlvbl90cmFuc2l0aW9uNjE5NCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjMxX2luX3NlY3Rpb25fdHJhbnNpdGlvbjYxOTRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAxMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMjAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDFBMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjMxX2luX3NlY3Rpb25fdHJhbnNpdGlvbjYxOTQJPSB7IEZPTExPV18yMzFfaW5fc2VjdGlvbl90cmFuc2l0aW9uNjE5NF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19tb2RpZmllcl90cmFuc2l0aW9uX2luX3NlY3Rpb25fdHJhbnNpdGlvbjYyMDUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX21vZGlmaWVyX3RyYW5zaXRpb25faW5fc2VjdGlvbl90cmFuc2l0aW9uNjIwNV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDEwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAyMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMTAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19tb2RpZmllcl90cmFuc2l0aW9uX2luX3NlY3Rpb25fdHJhbnNpdGlvbjYyMDUJPSB7IEZPTExPV19tb2RpZmllcl90cmFuc2l0aW9uX2luX3NlY3Rpb25fdHJhbnNpdGlvbjYyMDVfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX3RyYW5zaXRpb25faW5fc2VjdGlvbl90cmFuc2l0aW9uNjIxOCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX3RyYW5zaXRpb25faW5fc2VjdGlvbl90cmFuc2l0aW9uNjIxOF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDEwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAyMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMUEwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWZfdHJhbnNpdGlvbl9pbl9zZWN0aW9uX3RyYW5zaXRpb242MjE4CT0geyBGT0xMT1dfZGVmX3RyYW5zaXRpb25faW5fc2VjdGlvbl90cmFuc2l0aW9uNjIxOF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18xNjlfaW5fZGVmX3RyYW5zaXRpb242MjUxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18xNjlfaW5fZGVmX3RyYW5zaXRpb242MjUxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwODAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE2OV9pbl9kZWZfdHJhbnNpdGlvbjYyNTEJPSB7IEZPTExPV18xNjlfaW5fZGVmX3RyYW5zaXRpb242MjUxX2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0FUX0lEX2luX2RlZl90cmFuc2l0aW9uNjI2MiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQVRfSURfaW5fZGVmX3RyYW5zaXRpb242MjYyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwODAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0FUX0lEX2luX2RlZl90cmFuc2l0aW9uNjI2Mgk9IHsgRk9MTE9XX0FUX0lEX2luX2RlZl90cmFuc2l0aW9uNjI2Ml9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MVF9faW5fZGVmX3RyYW5zaXRpb242Mjg0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MVF9faW5fZGVmX3RyYW5zaXRpb242Mjg0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDg0MDgwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMTAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDE0MDIwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDUwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xUX19pbl9kZWZfdHJhbnNpdGlvbjYyODQJPSB7IEZPTExPV19MVF9faW5fZGVmX3RyYW5zaXRpb242Mjg0X2JpdHMsIDYJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX21vY190cmFuc2l0aW9uX2luX2RlZl90cmFuc2l0aW9uNjI4NyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfbW9jX3RyYW5zaXRpb25faW5fZGVmX3RyYW5zaXRpb242Mjg3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX21vY190cmFuc2l0aW9uX2luX2RlZl90cmFuc2l0aW9uNjI4Nwk9IHsgRk9MTE9XX21vY190cmFuc2l0aW9uX2luX2RlZl90cmFuc2l0aW9uNjI4N19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19HVF9pbl9kZWZfdHJhbnNpdGlvbjYyOTEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0dUX2luX2RlZl90cmFuc2l0aW9uNjI5MV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDgwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19HVF9pbl9kZWZfdHJhbnNpdGlvbjYyOTEJPSB7IEZPTExPV19HVF9pbl9kZWZfdHJhbnNpdGlvbjYyOTFfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfbW9lX3RyYW5zaXRpb25faW5fZGVmX3RyYW5zaXRpb242MzAwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19tb2VfdHJhbnNpdGlvbl9pbl9kZWZfdHJhbnNpdGlvbjYzMDBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfbW9lX3RyYW5zaXRpb25faW5fZGVmX3RyYW5zaXRpb242MzAwCT0geyBGT0xMT1dfbW9lX3RyYW5zaXRpb25faW5fZGVmX3RyYW5zaXRpb242MzAwX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzM5Nl9pbl9kZWZfdHJhbnNpdGlvbjYzMDcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzM5Nl9pbl9kZWZfdHJhbnNpdGlvbjYzMDdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA4MDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzk2X2luX2RlZl90cmFuc2l0aW9uNjMwNwk9IHsgRk9MTE9XXzM5Nl9pbl9kZWZfdHJhbnNpdGlvbjYzMDdfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTFRfX2luX2RlZl90cmFuc2l0aW9uNjMxOSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTFRfX2luX2RlZl90cmFuc2l0aW9uNjMxOV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDA4NDA4MDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDEwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAxNDAyMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDA1MDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MVF9faW5fZGVmX3RyYW5zaXRpb242MzE5CT0geyBGT0xMT1dfTFRfX2luX2RlZl90cmFuc2l0aW9uNjMxOV9iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19tb2NfdHJhbnNpdGlvbl9pbl9kZWZfdHJhbnNpdGlvbjYzMjEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX21vY190cmFuc2l0aW9uX2luX2RlZl90cmFuc2l0aW9uNjMyMV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19tb2NfdHJhbnNpdGlvbl9pbl9kZWZfdHJhbnNpdGlvbjYzMjEJPSB7IEZPTExPV19tb2NfdHJhbnNpdGlvbl9pbl9kZWZfdHJhbnNpdGlvbjYzMjFfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfR1RfaW5fZGVmX3RyYW5zaXRpb242MzI0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19HVF9pbl9kZWZfdHJhbnNpdGlvbjYzMjRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA4MDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfR1RfaW5fZGVmX3RyYW5zaXRpb242MzI0CT0geyBGT0xMT1dfR1RfaW5fZGVmX3RyYW5zaXRpb242MzI0X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lEX2luX2RlZl90cmFuc2l0aW9uNjMzNyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfSURfaW5fZGVmX3RyYW5zaXRpb242MzM3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwODAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0lEX2luX2RlZl90cmFuc2l0aW9uNjMzNwk9IHsgRk9MTE9XX0lEX2luX2RlZl90cmFuc2l0aW9uNjMzN19iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TdHJpbmdMaXRlcmFsX2luX2RlZl90cmFuc2l0aW9uNjM1NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU3RyaW5nTGl0ZXJhbF9pbl9kZWZfdHJhbnNpdGlvbjYzNTVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA4MDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU3RyaW5nTGl0ZXJhbF9pbl9kZWZfdHJhbnNpdGlvbjYzNTUJPSB7IEZPTExPV19TdHJpbmdMaXRlcmFsX2luX2RlZl90cmFuc2l0aW9uNjM1NV9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19tb2VfdHJhbnNpdGlvbl9pbl9kZWZfdHJhbnNpdGlvbjYzNzIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX21vZV90cmFuc2l0aW9uX2luX2RlZl90cmFuc2l0aW9uNjM3Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19tb2VfdHJhbnNpdGlvbl9pbl9kZWZfdHJhbnNpdGlvbjYzNzIJPSB7IEZPTExPV19tb2VfdHJhbnNpdGlvbl9pbl9kZWZfdHJhbnNpdGlvbjYzNzJfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfSURfaW5fa2luZF90cmFuc2l0aW9uNjM5MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfSURfaW5fa2luZF90cmFuc2l0aW9uNjM5MF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JRF9pbl9raW5kX3RyYW5zaXRpb242MzkwCT0geyBGT0xMT1dfSURfaW5fa2luZF90cmFuc2l0aW9uNjM5MF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yMzZfaW5fa2luZF90cmFuc2l0aW9uNjM5OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjM2X2luX2tpbmRfdHJhbnNpdGlvbjYzOTlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjM2X2luX2tpbmRfdHJhbnNpdGlvbjYzOTkJPSB7IEZPTExPV18yMzZfaW5fa2luZF90cmFuc2l0aW9uNjM5OV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yODJfaW5fa2luZF90cmFuc2l0aW9uNjQwOSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjgyX2luX2tpbmRfdHJhbnNpdGlvbjY0MDlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjgyX2luX2tpbmRfdHJhbnNpdGlvbjY0MDkJPSB7IEZPTExPV18yODJfaW5fa2luZF90cmFuc2l0aW9uNjQwOV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yNzNfaW5fa2luZF90cmFuc2l0aW9uNjQxOSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjczX2luX2tpbmRfdHJhbnNpdGlvbjY0MTlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjczX2luX2tpbmRfdHJhbnNpdGlvbjY0MTkJPSB7IEZPTExPV18yNzNfaW5fa2luZF90cmFuc2l0aW9uNjQxOV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yODRfaW5fa2luZF90cmFuc2l0aW9uNjQzMiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjg0X2luX2tpbmRfdHJhbnNpdGlvbjY0MzJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjg0X2luX2tpbmRfdHJhbnNpdGlvbjY0MzIJPSB7IEZPTExPV18yODRfaW5fa2luZF90cmFuc2l0aW9uNjQzMl9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19raW5kX3RyYW5zaXRpb25faW5fbW9jX3RyYW5zaXRpb25fYXR0cmlidXRlNjQ2MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfa2luZF90cmFuc2l0aW9uX2luX21vY190cmFuc2l0aW9uX2F0dHJpYnV0ZTY0NjBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAyMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfa2luZF90cmFuc2l0aW9uX2luX21vY190cmFuc2l0aW9uX2F0dHJpYnV0ZTY0NjAJPSB7IEZPTExPV19raW5kX3RyYW5zaXRpb25faW5fbW9jX3RyYW5zaXRpb25fYXR0cmlidXRlNjQ2MF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19CQU5EX2luX21vY190cmFuc2l0aW9uX2F0dHJpYnV0ZTY0NjcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0JBTkRfaW5fbW9jX3RyYW5zaXRpb25fYXR0cmlidXRlNjQ2N19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAyMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19CQU5EX2luX21vY190cmFuc2l0aW9uX2F0dHJpYnV0ZTY0NjcJPSB7IEZPTExPV19CQU5EX2luX21vY190cmFuc2l0aW9uX2F0dHJpYnV0ZTY0NjdfYml0cywgNQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjczX2luX21vY190cmFuc2l0aW9uX2F0dHJpYnV0ZTY0NjkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzI3M19pbl9tb2NfdHJhbnNpdGlvbl9hdHRyaWJ1dGU2NDY5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzI3M19pbl9tb2NfdHJhbnNpdGlvbl9hdHRyaWJ1dGU2NDY5CT0geyBGT0xMT1dfMjczX2luX21vY190cmFuc2l0aW9uX2F0dHJpYnV0ZTY0NjlfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfbW9jX3RyYW5zaXRpb25fYXRvbV9pbl9tb2NfdHJhbnNpdGlvbjY0OTQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX21vY190cmFuc2l0aW9uX2F0b21faW5fbW9jX3RyYW5zaXRpb242NDk0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwODAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX21vY190cmFuc2l0aW9uX2F0b21faW5fbW9jX3RyYW5zaXRpb242NDk0CT0geyBGT0xMT1dfbW9jX3RyYW5zaXRpb25fYXRvbV9pbl9tb2NfdHJhbnNpdGlvbjY0OTRfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfQ09NTUFfaW5fbW9jX3RyYW5zaXRpb242NDk5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19DT01NQV9pbl9tb2NfdHJhbnNpdGlvbjY0OTlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwODQwODAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAxMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMTQwMjAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwNTAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQ09NTUFfaW5fbW9jX3RyYW5zaXRpb242NDk5CT0geyBGT0xMT1dfQ09NTUFfaW5fbW9jX3RyYW5zaXRpb242NDk5X2JpdHMsIDYJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX21vY190cmFuc2l0aW9uX2F0b21faW5fbW9jX3RyYW5zaXRpb242NTAxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19tb2NfdHJhbnNpdGlvbl9hdG9tX2luX21vY190cmFuc2l0aW9uNjUwMV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDgwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19tb2NfdHJhbnNpdGlvbl9hdG9tX2luX21vY190cmFuc2l0aW9uNjUwMQk9IHsgRk9MTE9XX21vY190cmFuc2l0aW9uX2F0b21faW5fbW9jX3RyYW5zaXRpb242NTAxX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzMyMV9pbl9tb2NfdHJhbnNpdGlvbl9hdG9tNjUyMCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzIxX2luX21vY190cmFuc2l0aW9uX2F0b202NTIwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMTAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDE0MDIwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzMyMV9pbl9tb2NfdHJhbnNpdGlvbl9hdG9tNjUyMAk9IHsgRk9MTE9XXzMyMV9pbl9tb2NfdHJhbnNpdGlvbl9hdG9tNjUyMF9iaXRzLCA1CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19tb2NfdHJhbnNpdGlvbl9hdHRyaWJ1dGVfaW5fbW9jX3RyYW5zaXRpb25fYXRvbTY1MjcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX21vY190cmFuc2l0aW9uX2F0dHJpYnV0ZV9pbl9tb2NfdHJhbnNpdGlvbl9hdG9tNjUyN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19tb2NfdHJhbnNpdGlvbl9hdHRyaWJ1dGVfaW5fbW9jX3RyYW5zaXRpb25fYXRvbTY1MjcJPSB7IEZPTExPV19tb2NfdHJhbnNpdGlvbl9hdHRyaWJ1dGVfaW5fbW9jX3RyYW5zaXRpb25fYXRvbTY1MjdfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzQ4X2luX21vY190cmFuc2l0aW9uX2F0b202NTM4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zNDhfaW5fbW9jX3RyYW5zaXRpb25fYXRvbTY1MzhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwODQwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzQ4X2luX21vY190cmFuc2l0aW9uX2F0b202NTM4CT0geyBGT0xMT1dfMzQ4X2luX21vY190cmFuc2l0aW9uX2F0b202NTM4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fbW9jX3RyYW5zaXRpb25fYXRvbTY1NDUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fbW9jX3RyYW5zaXRpb25fYXRvbTY1NDVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfaW50ZWdlcl9jb25zdGFudF9pbl9tb2NfdHJhbnNpdGlvbl9hdG9tNjU0NQk9IHsgRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fbW9jX3RyYW5zaXRpb25fYXRvbTY1NDVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzUwX2luX21vY190cmFuc2l0aW9uX2F0b202NTU2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zNTBfaW5fbW9jX3RyYW5zaXRpb25fYXRvbTY1NTZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwODAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzUwX2luX21vY190cmFuc2l0aW9uX2F0b202NTU2CT0geyBGT0xMT1dfMzUwX2luX21vY190cmFuc2l0aW9uX2F0b202NTU2X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2Zsb2F0X2NvbnN0YW50X2luX21vY190cmFuc2l0aW9uX2F0b202NTYzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19mbG9hdF9jb25zdGFudF9pbl9tb2NfdHJhbnNpdGlvbl9hdG9tNjU2M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19mbG9hdF9jb25zdGFudF9pbl9tb2NfdHJhbnNpdGlvbl9hdG9tNjU2Mwk9IHsgRk9MTE9XX2Zsb2F0X2NvbnN0YW50X2luX21vY190cmFuc2l0aW9uX2F0b202NTYzX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3RyYW5zaXRpb25fc3RhdGVtZW50X2luX21vZV90cmFuc2l0aW9uNjU4MiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfdHJhbnNpdGlvbl9zdGF0ZW1lbnRfaW5fbW9lX3RyYW5zaXRpb242NTgyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDgwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwODAyN0YwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3RyYW5zaXRpb25fc3RhdGVtZW50X2luX21vZV90cmFuc2l0aW9uNjU4Mgk9IHsgRk9MTE9XX3RyYW5zaXRpb25fc3RhdGVtZW50X2luX21vZV90cmFuc2l0aW9uNjU4Ml9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18xNjNfaW5fbW9lX3RyYW5zaXRpb242NjAwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18xNjNfaW5fbW9lX3RyYW5zaXRpb242NjAwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDgwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAyN0YwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE2M19pbl9tb2VfdHJhbnNpdGlvbjY2MDAJPSB7IEZPTExPV18xNjNfaW5fbW9lX3RyYW5zaXRpb242NjAwX2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3RhcmdldF9zdGF0ZV9pZF9pbl9tb2VfdHJhbnNpdGlvbjY2MTIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3RhcmdldF9zdGF0ZV9pZF9pbl9tb2VfdHJhbnNpdGlvbjY2MTJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfdGFyZ2V0X3N0YXRlX2lkX2luX21vZV90cmFuc2l0aW9uNjYxMgk9IHsgRk9MTE9XX3RhcmdldF9zdGF0ZV9pZF9pbl9tb2VfdHJhbnNpdGlvbjY2MTJfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfU0VNSV9pbl9tb2VfdHJhbnNpdGlvbjY2MjkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1NFTUlfaW5fbW9lX3RyYW5zaXRpb242NjI5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1NFTUlfaW5fbW9lX3RyYW5zaXRpb242NjI5CT0geyBGT0xMT1dfU0VNSV9pbl9tb2VfdHJhbnNpdGlvbjY2MjlfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTYzX2luX21vZV90cmFuc2l0aW9uNjYzOCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMTYzX2luX21vZV90cmFuc2l0aW9uNjYzOF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDA4MDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMjdGMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18xNjNfaW5fbW9lX3RyYW5zaXRpb242NjM4CT0geyBGT0xMT1dfMTYzX2luX21vZV90cmFuc2l0aW9uNjYzOF9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV190YXJnZXRfc3RhdGVfaWRfaW5fbW9lX3RyYW5zaXRpb242NjQyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV190YXJnZXRfc3RhdGVfaWRfaW5fbW9lX3RyYW5zaXRpb242NjQyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3RhcmdldF9zdGF0ZV9pZF9pbl9tb2VfdHJhbnNpdGlvbjY2NDIJPSB7IEZPTExPV190YXJnZXRfc3RhdGVfaWRfaW5fbW9lX3RyYW5zaXRpb242NjQyX2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3RyYW5zaXRpb25fc3RhdGVtZW50X2luX21vZV90cmFuc2l0aW9uNjY1OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfdHJhbnNpdGlvbl9zdGF0ZW1lbnRfaW5fbW9lX3RyYW5zaXRpb242NjU5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3RyYW5zaXRpb25fc3RhdGVtZW50X2luX21vZV90cmFuc2l0aW9uNjY1OQk9IHsgRk9MTE9XX3RyYW5zaXRpb25fc3RhdGVtZW50X2luX21vZV90cmFuc2l0aW9uNjY1OV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TRU1JX2luX21vZV90cmFuc2l0aW9uNjY3MyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU0VNSV9pbl9tb2VfdHJhbnNpdGlvbjY2NzNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU0VNSV9pbl9tb2VfdHJhbnNpdGlvbjY2NzMJPSB7IEZPTExPV19TRU1JX2luX21vZV90cmFuc2l0aW9uNjY3M19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MQ1VSTFlfaW5fdHJhbnNpdGlvbl9zdGF0ZW1lbnQ2NzAxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MQ1VSTFlfaW5fdHJhbnNpdGlvbl9zdGF0ZW1lbnQ2NzAxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDBDMDAwMTA0NDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAzRkNGRkZDMDAwMTAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwODIwMDAwMDNDMDAxMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwNDgwMTE0MDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTAzRjk3RTI0QzgzODgxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjBCMUMwMDAwM0YwNDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMTgwMDAwMEE2KSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xDVVJMWV9pbl90cmFuc2l0aW9uX3N0YXRlbWVudDY3MDEJPSB7IEZPTExPV19MQ1VSTFlfaW5fdHJhbnNpdGlvbl9zdGF0ZW1lbnQ2NzAxX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX29wX2Jsb2NrX2luX3RyYW5zaXRpb25fc3RhdGVtZW50NjcwOCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfb3BfYmxvY2tfaW5fdHJhbnNpdGlvbl9zdGF0ZW1lbnQ2NzA4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDBDMDAwMTA0NDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMTAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwODIwMDAwMDNDMDAxMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwNDgwMTE0MDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTAzRjk3RTI0QzgzODgxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjBCMUMwMDAwM0YwNDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMTgwMDAwMEE2KSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX29wX2Jsb2NrX2luX3RyYW5zaXRpb25fc3RhdGVtZW50NjcwOAk9IHsgRk9MTE9XX29wX2Jsb2NrX2luX3RyYW5zaXRpb25fc3RhdGVtZW50NjcwOF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zdGF0ZW1lbnRfaW5fdHJhbnNpdGlvbl9zdGF0ZW1lbnQ2NzI4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zdGF0ZW1lbnRfaW5fdHJhbnNpdGlvbl9zdGF0ZW1lbnQ2NzI4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDBDMDAwMTA0NDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMTAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwODIwMDAwMDNDMDAxMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwNDgwMTE0MDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTAzRjk3RTI0QzgzODgxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjBCMUMwMDAwM0YwNDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMTgwMDAwMEE2KSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3N0YXRlbWVudF9pbl90cmFuc2l0aW9uX3N0YXRlbWVudDY3MjgJPSB7IEZPTExPV19zdGF0ZW1lbnRfaW5fdHJhbnNpdGlvbl9zdGF0ZW1lbnQ2NzI4X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3RyYW5zaXRpb25fdHJpZ2dlcl9pbl90cmFuc2l0aW9uX3N0YXRlbWVudDY3NDEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3RyYW5zaXRpb25fdHJpZ2dlcl9pbl90cmFuc2l0aW9uX3N0YXRlbWVudDY3NDFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDIwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDA4MjAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDQwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfdHJhbnNpdGlvbl90cmlnZ2VyX2luX3RyYW5zaXRpb25fc3RhdGVtZW50Njc0MQk9IHsgRk9MTE9XX3RyYW5zaXRpb25fdHJpZ2dlcl9pbl90cmFuc2l0aW9uX3N0YXRlbWVudDY3NDFfYml0cywgNAl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfdHJhbnNpdGlvbl9ndWFyZF9pbl90cmFuc2l0aW9uX3N0YXRlbWVudDY3NTEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3RyYW5zaXRpb25fZ3VhcmRfaW5fdHJhbnNpdGlvbl9zdGF0ZW1lbnQ2NzUxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDIwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDA0MDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3RyYW5zaXRpb25fZ3VhcmRfaW5fdHJhbnNpdGlvbl9zdGF0ZW1lbnQ2NzUxCT0geyBGT0xMT1dfdHJhbnNpdGlvbl9ndWFyZF9pbl90cmFuc2l0aW9uX3N0YXRlbWVudDY3NTFfYml0cywgNAl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfdHJhbnNpdGlvbl90aW1lZF9ndWFyZF9pbl90cmFuc2l0aW9uX3N0YXRlbWVudDY3NjEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3RyYW5zaXRpb25fdGltZWRfZ3VhcmRfaW5fdHJhbnNpdGlvbl9zdGF0ZW1lbnQ2NzYxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDIwMDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3RyYW5zaXRpb25fdGltZWRfZ3VhcmRfaW5fdHJhbnNpdGlvbl9zdGF0ZW1lbnQ2NzYxCT0geyBGT0xMT1dfdHJhbnNpdGlvbl90aW1lZF9ndWFyZF9pbl90cmFuc2l0aW9uX3N0YXRlbWVudDY3NjFfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfdHJhbnNpdGlvbl9lZmZlY3RfaW5fdHJhbnNpdGlvbl9zdGF0ZW1lbnQ2NzcxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV190cmFuc2l0aW9uX2VmZmVjdF9pbl90cmFuc2l0aW9uX3N0YXRlbWVudDY3NzFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDIwMDAwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfdHJhbnNpdGlvbl9lZmZlY3RfaW5fdHJhbnNpdGlvbl9zdGF0ZW1lbnQ2NzcxCT0geyBGT0xMT1dfdHJhbnNpdGlvbl9lZmZlY3RfaW5fdHJhbnNpdGlvbl9zdGF0ZW1lbnQ2NzcxX2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1JDVVJMWV9pbl90cmFuc2l0aW9uX3N0YXRlbWVudDY3ODAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1JDVVJMWV9pbl90cmFuc2l0aW9uX3N0YXRlbWVudDY3ODBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUkNVUkxZX2luX3RyYW5zaXRpb25fc3RhdGVtZW50Njc4MAk9IHsgRk9MTE9XX1JDVVJMWV9pbl90cmFuc2l0aW9uX3N0YXRlbWVudDY3ODBfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjMyX2luX3RyYW5zaXRpb25fdHJpZ2dlcjY3OTMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzIzMl9pbl90cmFuc2l0aW9uX3RyaWdnZXI2NzkzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAzRjgwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzIzMl9pbl90cmFuc2l0aW9uX3RyaWdnZXI2NzkzCT0geyBGT0xMT1dfMjMyX2luX3RyYW5zaXRpb25fdHJpZ2dlcjY3OTNfYml0cywgNQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc3RhdGVtZW50X2NvbV9pbnB1dF9pbl90cmFuc2l0aW9uX3RyaWdnZXI2Nzk5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zdGF0ZW1lbnRfY29tX2lucHV0X2luX3RyYW5zaXRpb25fdHJpZ2dlcjY3OTlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDNGODAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc3RhdGVtZW50X2NvbV9pbnB1dF9pbl90cmFuc2l0aW9uX3RyaWdnZXI2Nzk5CT0geyBGT0xMT1dfc3RhdGVtZW50X2NvbV9pbnB1dF9pbl90cmFuc2l0aW9uX3RyaWdnZXI2Nzk5X2JpdHMsIDUJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzE4N19pbl90cmFuc2l0aW9uX2d1YXJkNjgxOSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMTg3X2luX3RyYW5zaXRpb25fZ3VhcmQ2ODE5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0NDAxNjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE4N19pbl90cmFuc2l0aW9uX2d1YXJkNjgxOQk9IHsgRk9MTE9XXzE4N19pbl90cmFuc2l0aW9uX2d1YXJkNjgxOV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zdGF0ZW1lbnRfZ3VhcmRfaW5fdHJhbnNpdGlvbl9ndWFyZDY4MjcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3N0YXRlbWVudF9ndWFyZF9pbl90cmFuc2l0aW9uX2d1YXJkNjgyN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDQwMTYwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zdGF0ZW1lbnRfZ3VhcmRfaW5fdHJhbnNpdGlvbl9ndWFyZDY4MjcJPSB7IEZPTExPV19zdGF0ZW1lbnRfZ3VhcmRfaW5fdHJhbnNpdGlvbl9ndWFyZDY4MjdfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl90cmFuc2l0aW9uX2d1YXJkNjg0MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl90cmFuc2l0aW9uX2d1YXJkNjg0MF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDQwMTYwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX3RyYW5zaXRpb25fZ3VhcmQ2ODQwCT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl90cmFuc2l0aW9uX2d1YXJkNjg0MF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MQlJBQ0tFVF9pbl90cmFuc2l0aW9uX2d1YXJkNjg1MSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTEJSQUNLRVRfaW5fdHJhbnNpdGlvbl9ndWFyZDY4NTFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTEJSQUNLRVRfaW5fdHJhbnNpdGlvbl9ndWFyZDY4NTEJPSB7IEZPTExPV19MQlJBQ0tFVF9pbl90cmFuc2l0aW9uX2d1YXJkNjg1MV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX3RyYW5zaXRpb25fZ3VhcmQ2ODU1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX3RyYW5zaXRpb25fZ3VhcmQ2ODU1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgxMDAwMDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fdHJhbnNpdGlvbl9ndWFyZDY4NTUJPSB7IEZPTExPV19leHByZXNzaW9uX2luX3RyYW5zaXRpb25fZ3VhcmQ2ODU1X2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1JCUkFDS0VUX2luX3RyYW5zaXRpb25fZ3VhcmQ2ODU3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19SQlJBQ0tFVF9pbl90cmFuc2l0aW9uX2d1YXJkNjg1N19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDQwMTYwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19SQlJBQ0tFVF9pbl90cmFuc2l0aW9uX2d1YXJkNjg1Nwk9IHsgRk9MTE9XX1JCUkFDS0VUX2luX3RyYW5zaXRpb25fZ3VhcmQ2ODU3X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzIzMF9pbl90cmFuc2l0aW9uX3RpbWVkX2d1YXJkNjg3OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjMwX2luX3RyYW5zaXRpb25fdGltZWRfZ3VhcmQ2ODc5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzIzMF9pbl90cmFuc2l0aW9uX3RpbWVkX2d1YXJkNjg3OQk9IHsgRk9MTE9XXzIzMF9pbl90cmFuc2l0aW9uX3RpbWVkX2d1YXJkNjg3OV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zdGF0ZW1lbnRfdGltZWRfZ3VhcmRfaW5fdHJhbnNpdGlvbl90aW1lZF9ndWFyZDY4ODcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3N0YXRlbWVudF90aW1lZF9ndWFyZF9pbl90cmFuc2l0aW9uX3RpbWVkX2d1YXJkNjg4N19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zdGF0ZW1lbnRfdGltZWRfZ3VhcmRfaW5fdHJhbnNpdGlvbl90aW1lZF9ndWFyZDY4ODcJPSB7IEZPTExPV19zdGF0ZW1lbnRfdGltZWRfZ3VhcmRfaW5fdHJhbnNpdGlvbl90aW1lZF9ndWFyZDY4ODdfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl90cmFuc2l0aW9uX3RpbWVkX2d1YXJkNjkwMCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl90cmFuc2l0aW9uX3RpbWVkX2d1YXJkNjkwMF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX3RyYW5zaXRpb25fdGltZWRfZ3VhcmQ2OTAwCT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl90cmFuc2l0aW9uX3RpbWVkX2d1YXJkNjkwMF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MQ1VSTFlfaW5fdHJhbnNpdGlvbl90aW1lZF9ndWFyZDY5MTEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xDVVJMWV9pbl90cmFuc2l0aW9uX3RpbWVkX2d1YXJkNjkxMV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MQ1VSTFlfaW5fdHJhbnNpdGlvbl90aW1lZF9ndWFyZDY5MTEJPSB7IEZPTExPV19MQ1VSTFlfaW5fdHJhbnNpdGlvbl90aW1lZF9ndWFyZDY5MTFfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl90cmFuc2l0aW9uX3RpbWVkX2d1YXJkNjkxNSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl90cmFuc2l0aW9uX3RpbWVkX2d1YXJkNjkxNV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjAwMDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX3RyYW5zaXRpb25fdGltZWRfZ3VhcmQ2OTE1CT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl90cmFuc2l0aW9uX3RpbWVkX2d1YXJkNjkxNV9iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19SQ1VSTFlfaW5fdHJhbnNpdGlvbl90aW1lZF9ndWFyZDY5MTcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1JDVVJMWV9pbl90cmFuc2l0aW9uX3RpbWVkX2d1YXJkNjkxN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19SQ1VSTFlfaW5fdHJhbnNpdGlvbl90aW1lZF9ndWFyZDY5MTcJPSB7IEZPTExPV19SQ1VSTFlfaW5fdHJhbnNpdGlvbl90aW1lZF9ndWFyZDY5MTdfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTgxX2luX3RyYW5zaXRpb25fZWZmZWN0NjkzOSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMTgxX2luX3RyYW5zaXRpb25fZWZmZWN0NjkzOV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwQzAwMDEwNDQwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDEwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAzQzAwMTAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDQ4MDEwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEwM0Y5N0UyNEM4Mzg4MSksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwQjFDMDAwMDNGMDQwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDE4MDAwMDBBNikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18xODFfaW5fdHJhbnNpdGlvbl9lZmZlY3Q2OTM5CT0geyBGT0xMT1dfMTgxX2luX3RyYW5zaXRpb25fZWZmZWN0NjkzOV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zdGF0ZW1lbnRfaW5fdHJhbnNpdGlvbl9lZmZlY3Q2OTQ1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zdGF0ZW1lbnRfaW5fdHJhbnNpdGlvbl9lZmZlY3Q2OTQ1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDBDMDAwMTA0NDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMTAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDNDMDAxMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwNDgwMTAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTAzRjk3RTI0QzgzODgxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjBCMUMwMDAwM0YwNDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMTgwMDAwMEE2KSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3N0YXRlbWVudF9pbl90cmFuc2l0aW9uX2VmZmVjdDY5NDUJPSB7IEZPTExPV19zdGF0ZW1lbnRfaW5fdHJhbnNpdGlvbl9lZmZlY3Q2OTQ1X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3RhcmdldF9zdGF0ZV9rd19pZF9pbl90YXJnZXRfc3RhdGVfaWQ2OTc3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV190YXJnZXRfc3RhdGVfa3dfaWRfaW5fdGFyZ2V0X3N0YXRlX2lkNjk3N19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV190YXJnZXRfc3RhdGVfa3dfaWRfaW5fdGFyZ2V0X3N0YXRlX2lkNjk3Nwk9IHsgRk9MTE9XX3RhcmdldF9zdGF0ZV9rd19pZF9pbl90YXJnZXRfc3RhdGVfaWQ2OTc3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl90YXJnZXRfc3RhdGVfaWQ2OTg4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fdGFyZ2V0X3N0YXRlX2lkNjk4OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fdGFyZ2V0X3N0YXRlX2lkNjk4OAk9IHsgRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl90YXJnZXRfc3RhdGVfaWQ2OTg4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0RPTExBUl9pbl90YXJnZXRfc3RhdGVfaWQ3MDA1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19ET0xMQVJfaW5fdGFyZ2V0X3N0YXRlX2lkNzAwNV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19ET0xMQVJfaW5fdGFyZ2V0X3N0YXRlX2lkNzAwNQk9IHsgRk9MTE9XX0RPTExBUl9pbl90YXJnZXRfc3RhdGVfaWQ3MDA1X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lEX2luX3RhcmdldF9zdGF0ZV9pZDcwMDkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0lEX2luX3RhcmdldF9zdGF0ZV9pZDcwMDlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfSURfaW5fdGFyZ2V0X3N0YXRlX2lkNzAwOQk9IHsgRk9MTE9XX0lEX2luX3RhcmdldF9zdGF0ZV9pZDcwMDlfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTQ2X2luX3RhcmdldF9zdGF0ZV9rd19pZDcwMzAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzE0Nl9pbl90YXJnZXRfc3RhdGVfa3dfaWQ3MDMwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE0Nl9pbl90YXJnZXRfc3RhdGVfa3dfaWQ3MDMwCT0geyBGT0xMT1dfMTQ2X2luX3RhcmdldF9zdGF0ZV9rd19pZDcwMzBfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTQ3X2luX3RhcmdldF9zdGF0ZV9rd19pZDcwNDIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzE0N19pbl90YXJnZXRfc3RhdGVfa3dfaWQ3MDQyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE0N19pbl90YXJnZXRfc3RhdGVfa3dfaWQ3MDQyCT0geyBGT0xMT1dfMTQ3X2luX3RhcmdldF9zdGF0ZV9rd19pZDcwNDJfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTUwX2luX3RhcmdldF9zdGF0ZV9rd19pZDcwNTEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzE1MF9pbl90YXJnZXRfc3RhdGVfa3dfaWQ3MDUxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE1MF9pbl90YXJnZXRfc3RhdGVfa3dfaWQ3MDUxCT0geyBGT0xMT1dfMTUwX2luX3RhcmdldF9zdGF0ZV9rd19pZDcwNTFfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTQ0X2luX3RhcmdldF9zdGF0ZV9rd19pZDcwNjMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzE0NF9pbl90YXJnZXRfc3RhdGVfa3dfaWQ3MDYzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE0NF9pbl90YXJnZXRfc3RhdGVfa3dfaWQ3MDYzCT0geyBGT0xMT1dfMTQ0X2luX3RhcmdldF9zdGF0ZV9rd19pZDcwNjNfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTQ5X2luX3RhcmdldF9zdGF0ZV9rd19pZDcwNzEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzE0OV9pbl90YXJnZXRfc3RhdGVfa3dfaWQ3MDcxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE0OV9pbl90YXJnZXRfc3RhdGVfa3dfaWQ3MDcxCT0geyBGT0xMT1dfMTQ5X2luX3RhcmdldF9zdGF0ZV9rd19pZDcwNzFfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTQ1X2luX3RhcmdldF9zdGF0ZV9rd19pZDcwODAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzE0NV9pbl90YXJnZXRfc3RhdGVfa3dfaWQ3MDgwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE0NV9pbl90YXJnZXRfc3RhdGVfa3dfaWQ3MDgwCT0geyBGT0xMT1dfMTQ1X2luX3RhcmdldF9zdGF0ZV9rd19pZDcwODBfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTUzX2luX3RhcmdldF9zdGF0ZV9rd19pZDcwODkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzE1M19pbl90YXJnZXRfc3RhdGVfa3dfaWQ3MDg5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE1M19pbl90YXJnZXRfc3RhdGVfa3dfaWQ3MDg5CT0geyBGT0xMT1dfMTUzX2luX3RhcmdldF9zdGF0ZV9rd19pZDcwODlfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTQ4X2luX3RhcmdldF9zdGF0ZV9rd19pZDcwOTggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzE0OF9pbl90YXJnZXRfc3RhdGVfa3dfaWQ3MDk4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE0OF9pbl90YXJnZXRfc3RhdGVfa3dfaWQ3MDk4CT0geyBGT0xMT1dfMTQ4X2luX3RhcmdldF9zdGF0ZV9rd19pZDcwOThfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTc3X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcxMTkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzE3N19pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MTE5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE3N19pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MTE5CT0geyBGT0xMT1dfMTc3X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcxMTlfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcxMjUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MTI1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MTI1CT0geyBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcxMjVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTk0X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcxMzMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzE5NF9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MTMzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE5NF9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MTMzCT0geyBGT0xMT1dfMTk0X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcxMzNfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcxNDEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MTQxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MTQxCT0geyBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcxNDFfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTkxX2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcxNTAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzE5MV9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MTUwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE5MV9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MTUwCT0geyBGT0xMT1dfMTkxX2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcxNTBfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcxNTUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MTU1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MTU1CT0geyBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcxNTVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTgyX2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcxNjMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzE4Ml9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MTYzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE4Ml9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MTYzCT0geyBGT0xMT1dfMTgyX2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcxNjNfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcxNjkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MTY5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MTY5CT0geyBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcxNjlfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTkwX2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcxNzggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzE5MF9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MTc4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE5MF9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MTc4CT0geyBGT0xMT1dfMTkwX2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcxNzhfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcxODIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MTgyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MTgyCT0geyBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcxODJfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTc5X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcxOTAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzE3OV9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MTkwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE3OV9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MTkwCT0geyBGT0xMT1dfMTc5X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcxOTBfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcxOTUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MTk1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MTk1CT0geyBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcxOTVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTg5X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcyMDQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzE4OV9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MjA0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE4OV9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MjA0CT0geyBGT0xMT1dfMTg5X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcyMDRfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcyMTAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MjEwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MjEwCT0geyBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcyMTBfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTcwX2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcyMTggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzE3MF9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MjE4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE3MF9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MjE4CT0geyBGT0xMT1dfMTcwX2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcyMThfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcyMjUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MjI1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MjI1CT0geyBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcyMjVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTk5X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcyMzQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzE5OV9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MjM0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE5OV9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MjM0CT0geyBGT0xMT1dfMTk5X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcyMzRfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcyNDIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MjQyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MjQyCT0geyBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcyNDJfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjI0X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcyNTAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzIyNF9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MjUwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzIyNF9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MjUwCT0geyBGT0xMT1dfMjI0X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcyNTBfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcyNTkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MjU5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MjU5CT0geyBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcyNTlfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjIzX2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcyNjcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzIyM19pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MjY3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzIyM19pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MjY3CT0geyBGT0xMT1dfMjIzX2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcyNjdfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcyNzYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3Mjc2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3Mjc2CT0geyBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcyNzZfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTg0X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcyODUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzE4NF9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3Mjg1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE4NF9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3Mjg1CT0geyBGT0xMT1dfMTg0X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcyODVfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcyOTIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MjkyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MjkyCT0geyBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcyOTJfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2VjdGlvbl9oZWFkZXJfaW5fc2VjdGlvbl9oZWFkZXJfaW1wb3J0X3BhcmFtZXRlcl9wcm9wZXJ0eTczMjUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NlY3Rpb25faGVhZGVyX2luX3NlY3Rpb25faGVhZGVyX2ltcG9ydF9wYXJhbWV0ZXJfcHJvcGVydHk3MzI1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDE5NkU4MDE5KSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3NlY3Rpb25faGVhZGVyX2luX3NlY3Rpb25faGVhZGVyX2ltcG9ydF9wYXJhbWV0ZXJfcHJvcGVydHk3MzI1CT0geyBGT0xMT1dfc2VjdGlvbl9oZWFkZXJfaW5fc2VjdGlvbl9oZWFkZXJfaW1wb3J0X3BhcmFtZXRlcl9wcm9wZXJ0eTczMjVfYml0cywgNAl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2VjdGlvbl9pbXBvcnRfaW5fc2VjdGlvbl9oZWFkZXJfaW1wb3J0X3BhcmFtZXRlcl9wcm9wZXJ0eTczMzQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NlY3Rpb25faW1wb3J0X2luX3NlY3Rpb25faGVhZGVyX2ltcG9ydF9wYXJhbWV0ZXJfcHJvcGVydHk3MzM0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDE5NkU4MDE4KSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3NlY3Rpb25faW1wb3J0X2luX3NlY3Rpb25faGVhZGVyX2ltcG9ydF9wYXJhbWV0ZXJfcHJvcGVydHk3MzM0CT0geyBGT0xMT1dfc2VjdGlvbl9pbXBvcnRfaW5fc2VjdGlvbl9oZWFkZXJfaW1wb3J0X3BhcmFtZXRlcl9wcm9wZXJ0eTczMzRfYml0cywgNAl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2VjdGlvbl9wYXJhbWV0ZXJfaW5fc2VjdGlvbl9oZWFkZXJfaW1wb3J0X3BhcmFtZXRlcl9wcm9wZXJ0eTczNDYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NlY3Rpb25fcGFyYW1ldGVyX2luX3NlY3Rpb25faGVhZGVyX2ltcG9ydF9wYXJhbWV0ZXJfcHJvcGVydHk3MzQ2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAxNjgwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3NlY3Rpb25fcGFyYW1ldGVyX2luX3NlY3Rpb25faGVhZGVyX2ltcG9ydF9wYXJhbWV0ZXJfcHJvcGVydHk3MzQ2CT0geyBGT0xMT1dfc2VjdGlvbl9wYXJhbWV0ZXJfaW5fc2VjdGlvbl9oZWFkZXJfaW1wb3J0X3BhcmFtZXRlcl9wcm9wZXJ0eTczNDZfYml0cywgNAl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2VjdGlvbl9wcm9wZXJ0eV9pbl9zZWN0aW9uX2hlYWRlcl9pbXBvcnRfcGFyYW1ldGVyX3Byb3BlcnR5NzM2OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2VjdGlvbl9wcm9wZXJ0eV9pbl9zZWN0aW9uX2hlYWRlcl9pbXBvcnRfcGFyYW1ldGVyX3Byb3BlcnR5NzM2OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMTY4MDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZWN0aW9uX3Byb3BlcnR5X2luX3NlY3Rpb25faGVhZGVyX2ltcG9ydF9wYXJhbWV0ZXJfcHJvcGVydHk3MzY4CT0geyBGT0xMT1dfc2VjdGlvbl9wcm9wZXJ0eV9pbl9zZWN0aW9uX2hlYWRlcl9pbXBvcnRfcGFyYW1ldGVyX3Byb3BlcnR5NzM2OF9iaXRzLCA0CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zZWN0aW9uX2ltcG9ydF9pbl9zZWN0aW9uX2hlYWRlcl9pbXBvcnRfcGFyYW1ldGVyX3Byb3BlcnR5NzM4OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2VjdGlvbl9pbXBvcnRfaW5fc2VjdGlvbl9oZWFkZXJfaW1wb3J0X3BhcmFtZXRlcl9wcm9wZXJ0eTczODlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMTk2RTgwMTgpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2VjdGlvbl9pbXBvcnRfaW5fc2VjdGlvbl9oZWFkZXJfaW1wb3J0X3BhcmFtZXRlcl9wcm9wZXJ0eTczODkJPSB7IEZPTExPV19zZWN0aW9uX2ltcG9ydF9pbl9zZWN0aW9uX2hlYWRlcl9pbXBvcnRfcGFyYW1ldGVyX3Byb3BlcnR5NzM4OV9iaXRzLCA0CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zZWN0aW9uX3BhcmFtZXRlcl9pbl9zZWN0aW9uX2hlYWRlcl9pbXBvcnRfcGFyYW1ldGVyX3Byb3BlcnR5NzM5OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2VjdGlvbl9wYXJhbWV0ZXJfaW5fc2VjdGlvbl9oZWFkZXJfaW1wb3J0X3BhcmFtZXRlcl9wcm9wZXJ0eTczOThfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDE2ODAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2VjdGlvbl9wYXJhbWV0ZXJfaW5fc2VjdGlvbl9oZWFkZXJfaW1wb3J0X3BhcmFtZXRlcl9wcm9wZXJ0eTczOTgJPSB7IEZPTExPV19zZWN0aW9uX3BhcmFtZXRlcl9pbl9zZWN0aW9uX2hlYWRlcl9pbXBvcnRfcGFyYW1ldGVyX3Byb3BlcnR5NzM5OF9iaXRzLCA0CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zZWN0aW9uX3Byb3BlcnR5X2luX3NlY3Rpb25faGVhZGVyX2ltcG9ydF9wYXJhbWV0ZXJfcHJvcGVydHk3NDIwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zZWN0aW9uX3Byb3BlcnR5X2luX3NlY3Rpb25faGVhZGVyX2ltcG9ydF9wYXJhbWV0ZXJfcHJvcGVydHk3NDIwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAxNjgwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3NlY3Rpb25fcHJvcGVydHlfaW5fc2VjdGlvbl9oZWFkZXJfaW1wb3J0X3BhcmFtZXRlcl9wcm9wZXJ0eTc0MjAJPSB7IEZPTExPV19zZWN0aW9uX3Byb3BlcnR5X2luX3NlY3Rpb25faGVhZGVyX2ltcG9ydF9wYXJhbWV0ZXJfcHJvcGVydHk3NDIwX2JpdHMsIDQJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3NlY3Rpb25fcGFyYW1ldGVyX2luX3NlY3Rpb25faGVhZGVyX2ltcG9ydF9wYXJhbWV0ZXJfcHJvcGVydHk3NDQxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zZWN0aW9uX3BhcmFtZXRlcl9pbl9zZWN0aW9uX2hlYWRlcl9pbXBvcnRfcGFyYW1ldGVyX3Byb3BlcnR5NzQ0MV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMTY4MDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZWN0aW9uX3BhcmFtZXRlcl9pbl9zZWN0aW9uX2hlYWRlcl9pbXBvcnRfcGFyYW1ldGVyX3Byb3BlcnR5NzQ0MQk9IHsgRk9MTE9XX3NlY3Rpb25fcGFyYW1ldGVyX2luX3NlY3Rpb25faGVhZGVyX2ltcG9ydF9wYXJhbWV0ZXJfcHJvcGVydHk3NDQxX2JpdHMsIDQJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3NlY3Rpb25fcHJvcGVydHlfaW5fc2VjdGlvbl9oZWFkZXJfaW1wb3J0X3BhcmFtZXRlcl9wcm9wZXJ0eTc0NjAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NlY3Rpb25fcHJvcGVydHlfaW5fc2VjdGlvbl9oZWFkZXJfaW1wb3J0X3BhcmFtZXRlcl9wcm9wZXJ0eTc0NjBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDE2ODAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2VjdGlvbl9wcm9wZXJ0eV9pbl9zZWN0aW9uX2hlYWRlcl9pbXBvcnRfcGFyYW1ldGVyX3Byb3BlcnR5NzQ2MAk9IHsgRk9MTE9XX3NlY3Rpb25fcHJvcGVydHlfaW5fc2VjdGlvbl9oZWFkZXJfaW1wb3J0X3BhcmFtZXRlcl9wcm9wZXJ0eTc0NjBfYml0cywgNAl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2VjdGlvbl9wcm9wZXJ0eV9pbl9zZWN0aW9uX2hlYWRlcl9pbXBvcnRfcGFyYW1ldGVyX3Byb3BlcnR5NzQ5MyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2VjdGlvbl9wcm9wZXJ0eV9pbl9zZWN0aW9uX2hlYWRlcl9pbXBvcnRfcGFyYW1ldGVyX3Byb3BlcnR5NzQ5M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMTY4MDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZWN0aW9uX3Byb3BlcnR5X2luX3NlY3Rpb25faGVhZGVyX2ltcG9ydF9wYXJhbWV0ZXJfcHJvcGVydHk3NDkzCT0geyBGT0xMT1dfc2VjdGlvbl9wcm9wZXJ0eV9pbl9zZWN0aW9uX2hlYWRlcl9pbXBvcnRfcGFyYW1ldGVyX3Byb3BlcnR5NzQ5M19iaXRzLCA0CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zZWN0aW9uX3Byb3BlcnR5X2ZyZWVfZGVjbGFyYXRpb25faW5fc2VjdGlvbl9oZWFkZXJfaW1wb3J0X3BhcmFtZXRlcl9wcm9wZXJ0eTc1MDggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NlY3Rpb25fcHJvcGVydHlfZnJlZV9kZWNsYXJhdGlvbl9pbl9zZWN0aW9uX2hlYWRlcl9pbXBvcnRfcGFyYW1ldGVyX3Byb3BlcnR5NzUwOF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZWN0aW9uX3Byb3BlcnR5X2ZyZWVfZGVjbGFyYXRpb25faW5fc2VjdGlvbl9oZWFkZXJfaW1wb3J0X3BhcmFtZXRlcl9wcm9wZXJ0eTc1MDgJPSB7IEZPTExPV19zZWN0aW9uX3Byb3BlcnR5X2ZyZWVfZGVjbGFyYXRpb25faW5fc2VjdGlvbl9oZWFkZXJfaW1wb3J0X3BhcmFtZXRlcl9wcm9wZXJ0eTc1MDhfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2V0X2luX3NlY3Rpb25fcGFyYW1ldGVyNzUzNiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2V0X2luX3NlY3Rpb25fcGFyYW1ldGVyNzUzNl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjIwODAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4NDAwMjA0MDAwNDEwMDA0RSksIEFOVExSM19VSU5UNjRfTElUKDB4MTA0MDEyMDgyMTIwMDAwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDA0QzUwNDgxMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZXRfaW5fc2VjdGlvbl9wYXJhbWV0ZXI3NTM2CT0geyBGT0xMT1dfc2V0X2luX3NlY3Rpb25fcGFyYW1ldGVyNzUzNl9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19wcm9wZXJ0eV9kZWNsYXJhdGlvbl9pbl9zZWN0aW9uX3BhcmFtZXRlcjc1NTMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3Byb3BlcnR5X2RlY2xhcmF0aW9uX2luX3NlY3Rpb25fcGFyYW1ldGVyNzU1M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjIwODAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4NDAwMjA0MDAwNDEwMDA0RSksIEFOVExSM19VSU5UNjRfTElUKDB4MTA0MDEyMDgyMTIwMDAwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDA0QzUwNDgxMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19wcm9wZXJ0eV9kZWNsYXJhdGlvbl9pbl9zZWN0aW9uX3BhcmFtZXRlcjc1NTMJPSB7IEZPTExPV19wcm9wZXJ0eV9kZWNsYXJhdGlvbl9pbl9zZWN0aW9uX3BhcmFtZXRlcjc1NTNfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTk2X2luX3NlY3Rpb25fcGFyYW1ldGVyNzU2NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMTk2X2luX3NlY3Rpb25fcGFyYW1ldGVyNzU2Nl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjIwODAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4NDAwMjA0MDAwNDEwMDA0RSksIEFOVExSM19VSU5UNjRfTElUKDB4MTA0MDEyMDgyMTIwMDAwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDA0QzUwNDgxMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18xOTZfaW5fc2VjdGlvbl9wYXJhbWV0ZXI3NTY2CT0geyBGT0xMT1dfMTk2X2luX3NlY3Rpb25fcGFyYW1ldGVyNzU2Nl9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19wcm9wZXJ0eV9kZWNsYXJhdGlvbl9pbl9zZWN0aW9uX3BhcmFtZXRlcjc1NzEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3Byb3BlcnR5X2RlY2xhcmF0aW9uX2luX3NlY3Rpb25fcGFyYW1ldGVyNzU3MV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjIwODAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4NDAwMjA0MDAwNDEwMDA0RSksIEFOVExSM19VSU5UNjRfTElUKDB4MTA0MDEyMDgyMTIwMDAwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDA0QzUwNDgxMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19wcm9wZXJ0eV9kZWNsYXJhdGlvbl9pbl9zZWN0aW9uX3BhcmFtZXRlcjc1NzEJPSB7IEZPTExPV19wcm9wZXJ0eV9kZWNsYXJhdGlvbl9pbl9zZWN0aW9uX3BhcmFtZXRlcjc1NzFfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTk1X2luX3NlY3Rpb25fcGFyYW1ldGVyNzU4NCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMTk1X2luX3NlY3Rpb25fcGFyYW1ldGVyNzU4NF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjIwODAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4NDAwMjA0MDAwNDEwMDA0RSksIEFOVExSM19VSU5UNjRfTElUKDB4MTA0MDEyMDgyMTIwMDAwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDA0QzUwNDgxMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18xOTVfaW5fc2VjdGlvbl9wYXJhbWV0ZXI3NTg0CT0geyBGT0xMT1dfMTk1X2luX3NlY3Rpb25fcGFyYW1ldGVyNzU4NF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19wcm9wZXJ0eV9kZWNsYXJhdGlvbl9pbl9zZWN0aW9uX3BhcmFtZXRlcjc1ODkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3Byb3BlcnR5X2RlY2xhcmF0aW9uX2luX3NlY3Rpb25fcGFyYW1ldGVyNzU4OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjIwODAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4NDAwMjA0MDAwNDEwMDA0RSksIEFOVExSM19VSU5UNjRfTElUKDB4MTA0MDEyMDgyMTIwMDAwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDA0QzUwNDgxMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19wcm9wZXJ0eV9kZWNsYXJhdGlvbl9pbl9zZWN0aW9uX3BhcmFtZXRlcjc1ODkJPSB7IEZPTExPV19wcm9wZXJ0eV9kZWNsYXJhdGlvbl9pbl9zZWN0aW9uX3BhcmFtZXRlcjc1ODlfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjA3X2luX3NlY3Rpb25fcGFyYW1ldGVyNzYwMiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjA3X2luX3NlY3Rpb25fcGFyYW1ldGVyNzYwMl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjIwODAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4NDAwMjA0MDAwNDEwMDA0RSksIEFOVExSM19VSU5UNjRfTElUKDB4MTA0MDEyMDgyMTIwMDAwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDA0QzUwNDgxMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yMDdfaW5fc2VjdGlvbl9wYXJhbWV0ZXI3NjAyCT0geyBGT0xMT1dfMjA3X2luX3NlY3Rpb25fcGFyYW1ldGVyNzYwMl9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19wcm9wZXJ0eV9kZWNsYXJhdGlvbl9pbl9zZWN0aW9uX3BhcmFtZXRlcjc2MDYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3Byb3BlcnR5X2RlY2xhcmF0aW9uX2luX3NlY3Rpb25fcGFyYW1ldGVyNzYwNl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjIwODAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4NDAwMjA0MDAwNDEwMDA0RSksIEFOVExSM19VSU5UNjRfTElUKDB4MTA0MDEyMDgyMTIwMDAwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDA0QzUwNDgxMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19wcm9wZXJ0eV9kZWNsYXJhdGlvbl9pbl9zZWN0aW9uX3BhcmFtZXRlcjc2MDYJPSB7IEZPTExPV19wcm9wZXJ0eV9kZWNsYXJhdGlvbl9pbl9zZWN0aW9uX3BhcmFtZXRlcjc2MDZfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2V0X2luX3NlY3Rpb25fcGFyYW1ldGVyNzYxOSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2V0X2luX3NlY3Rpb25fcGFyYW1ldGVyNzYxOV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjIwODAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4NDAwMjA0MDAwNDEwMDA0RSksIEFOVExSM19VSU5UNjRfTElUKDB4MTA0MDEyMDgyMTIwMDAwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDA0QzUwNDgxMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZXRfaW5fc2VjdGlvbl9wYXJhbWV0ZXI3NjE5CT0geyBGT0xMT1dfc2V0X2luX3NlY3Rpb25fcGFyYW1ldGVyNzYxOV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19wcm9wZXJ0eV9kZWNsYXJhdGlvbl9pbl9zZWN0aW9uX3BhcmFtZXRlcjc2MzYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3Byb3BlcnR5X2RlY2xhcmF0aW9uX2luX3NlY3Rpb25fcGFyYW1ldGVyNzYzNl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjIwODAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4NDAwMjA0MDAwNDEwMDA0RSksIEFOVExSM19VSU5UNjRfTElUKDB4MTA0MDEyMDgyMTIwMDAwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDA0QzUwNDgxMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19wcm9wZXJ0eV9kZWNsYXJhdGlvbl9pbl9zZWN0aW9uX3BhcmFtZXRlcjc2MzYJPSB7IEZPTExPV19wcm9wZXJ0eV9kZWNsYXJhdGlvbl9pbl9zZWN0aW9uX3BhcmFtZXRlcjc2MzZfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2V0X2luX3NlY3Rpb25fcHJvcGVydHk3NjY5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zZXRfaW5fc2VjdGlvbl9wcm9wZXJ0eTc2NjlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDIyMDgwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDQwMDIwNDAwMDQxMDAwNEUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDEwNDAxMjA4MjEyMDAwMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwNEM1MDQ4MTApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2V0X2luX3NlY3Rpb25fcHJvcGVydHk3NjY5CT0geyBGT0xMT1dfc2V0X2luX3NlY3Rpb25fcHJvcGVydHk3NjY5X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3Byb3BlcnR5X2RlY2xhcmF0aW9uX2luX3NlY3Rpb25fcHJvcGVydHk3Njg2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19wcm9wZXJ0eV9kZWNsYXJhdGlvbl9pbl9zZWN0aW9uX3Byb3BlcnR5NzY4Nl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjIwODAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4NDAwMjA0MDAwNDEwMDA0RSksIEFOVExSM19VSU5UNjRfTElUKDB4MTA0MDEyMDgyMTIwMDAwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDA0QzUwNDgxMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19wcm9wZXJ0eV9kZWNsYXJhdGlvbl9pbl9zZWN0aW9uX3Byb3BlcnR5NzY4Ngk9IHsgRk9MTE9XX3Byb3BlcnR5X2RlY2xhcmF0aW9uX2luX3NlY3Rpb25fcHJvcGVydHk3Njg2X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzIxNl9pbl9zZWN0aW9uX3Byb3BlcnR5NzY5OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjE2X2luX3NlY3Rpb25fcHJvcGVydHk3Njk5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMjA4MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHg0MDAyMDQwMDA0MTAwMDRFKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgxMDQwMTIwODIxMjAwMDAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDRDNTA0ODEwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzIxNl9pbl9zZWN0aW9uX3Byb3BlcnR5NzY5OQk9IHsgRk9MTE9XXzIxNl9pbl9zZWN0aW9uX3Byb3BlcnR5NzY5OV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19wcm9wZXJ0eV9kZWNsYXJhdGlvbl9pbl9zZWN0aW9uX3Byb3BlcnR5NzcwNiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfcHJvcGVydHlfZGVjbGFyYXRpb25faW5fc2VjdGlvbl9wcm9wZXJ0eTc3MDZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDIyMDgwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDQwMDIwNDAwMDQxMDAwNEUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDEwNDAxMjA4MjEyMDAwMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwNEM1MDQ4MTApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfcHJvcGVydHlfZGVjbGFyYXRpb25faW5fc2VjdGlvbl9wcm9wZXJ0eTc3MDYJPSB7IEZPTExPV19wcm9wZXJ0eV9kZWNsYXJhdGlvbl9pbl9zZWN0aW9uX3Byb3BlcnR5NzcwNl9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yMTRfaW5fc2VjdGlvbl9wcm9wZXJ0eTc3MTkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzIxNF9pbl9zZWN0aW9uX3Byb3BlcnR5NzcxOV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjIwODAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4NDAwMjA0MDAwNDEwMDA0RSksIEFOVExSM19VSU5UNjRfTElUKDB4MTA0MDEyMDgyMTIwMDAwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDA0QzUwNDgxMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yMTRfaW5fc2VjdGlvbl9wcm9wZXJ0eTc3MTkJPSB7IEZPTExPV18yMTRfaW5fc2VjdGlvbl9wcm9wZXJ0eTc3MTlfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfcHJvcGVydHlfZGVjbGFyYXRpb25faW5fc2VjdGlvbl9wcm9wZXJ0eTc3MjYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3Byb3BlcnR5X2RlY2xhcmF0aW9uX2luX3NlY3Rpb25fcHJvcGVydHk3NzI2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMjA4MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHg0MDAyMDQwMDA0MTAwMDRFKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgxMDQwMTIwODIxMjAwMDAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDRDNTA0ODEwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3Byb3BlcnR5X2RlY2xhcmF0aW9uX2luX3NlY3Rpb25fcHJvcGVydHk3NzI2CT0geyBGT0xMT1dfcHJvcGVydHlfZGVjbGFyYXRpb25faW5fc2VjdGlvbl9wcm9wZXJ0eTc3MjZfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjExX2luX3NlY3Rpb25fcHJvcGVydHk3NzM5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yMTFfaW5fc2VjdGlvbl9wcm9wZXJ0eTc3MzlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDIyMDgwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDQwMDIwNDAwMDQxMDAwNEUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDEwNDAxMjA4MjEyMDAwMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwNEM1MDQ4MTApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjExX2luX3NlY3Rpb25fcHJvcGVydHk3NzM5CT0geyBGT0xMT1dfMjExX2luX3NlY3Rpb25fcHJvcGVydHk3NzM5X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3Byb3BlcnR5X2RlY2xhcmF0aW9uX2luX3NlY3Rpb25fcHJvcGVydHk3NzQ2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19wcm9wZXJ0eV9kZWNsYXJhdGlvbl9pbl9zZWN0aW9uX3Byb3BlcnR5Nzc0Nl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjIwODAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4NDAwMjA0MDAwNDEwMDA0RSksIEFOVExSM19VSU5UNjRfTElUKDB4MTA0MDEyMDgyMTIwMDAwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDA0QzUwNDgxMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19wcm9wZXJ0eV9kZWNsYXJhdGlvbl9pbl9zZWN0aW9uX3Byb3BlcnR5Nzc0Ngk9IHsgRk9MTE9XX3Byb3BlcnR5X2RlY2xhcmF0aW9uX2luX3NlY3Rpb25fcHJvcGVydHk3NzQ2X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3Byb3BlcnR5X2RlY2xhcmF0aW9uX2luX3NlY3Rpb25fcHJvcGVydHlfZnJlZV9kZWNsYXJhdGlvbjc3NzcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3Byb3BlcnR5X2RlY2xhcmF0aW9uX2luX3NlY3Rpb25fcHJvcGVydHlfZnJlZV9kZWNsYXJhdGlvbjc3NzdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDIyMDgwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDQwMDIwNDAwMDQxMDAwNEUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDEwNDAxMjA4MjEyMDAwMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwNEM1MDQ4MTApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfcHJvcGVydHlfZGVjbGFyYXRpb25faW5fc2VjdGlvbl9wcm9wZXJ0eV9mcmVlX2RlY2xhcmF0aW9uNzc3Nwk9IHsgRk9MTE9XX3Byb3BlcnR5X2RlY2xhcmF0aW9uX2luX3NlY3Rpb25fcHJvcGVydHlfZnJlZV9kZWNsYXJhdGlvbjc3NzdfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfbW9kaWZpZXJfZGVjbGFyYXRpb25faW5fcHJvcGVydHlfZGVjbGFyYXRpb243ODA2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19tb2RpZmllcl9kZWNsYXJhdGlvbl9pbl9wcm9wZXJ0eV9kZWNsYXJhdGlvbjc4MDZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDIyMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDQwMDAwMDAwMDAxMDAwNEUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwNDAwMDAwMDEwMDAwMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMEMxMDQwMTApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfbW9kaWZpZXJfZGVjbGFyYXRpb25faW5fcHJvcGVydHlfZGVjbGFyYXRpb243ODA2CT0geyBGT0xMT1dfbW9kaWZpZXJfZGVjbGFyYXRpb25faW5fcHJvcGVydHlfZGVjbGFyYXRpb243ODA2X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2RlY2xfcHJvcGVydHlfZWxlbWVudF9pbl9wcm9wZXJ0eV9kZWNsYXJhdGlvbjc4MTYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlY2xfcHJvcGVydHlfZWxlbWVudF9pbl9wcm9wZXJ0eV9kZWNsYXJhdGlvbjc4MTZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVjbF9wcm9wZXJ0eV9lbGVtZW50X2luX3Byb3BlcnR5X2RlY2xhcmF0aW9uNzgxNgk9IHsgRk9MTE9XX2RlY2xfcHJvcGVydHlfZWxlbWVudF9pbl9wcm9wZXJ0eV9kZWNsYXJhdGlvbjc4MTZfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVjbF92YXJpYWJsZV9pbl9kZWNsX3Byb3BlcnR5X2VsZW1lbnQ3ODMxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWNsX3ZhcmlhYmxlX2luX2RlY2xfcHJvcGVydHlfZWxlbWVudDc4MzFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVjbF92YXJpYWJsZV9pbl9kZWNsX3Byb3BlcnR5X2VsZW1lbnQ3ODMxCT0geyBGT0xMT1dfZGVjbF92YXJpYWJsZV9pbl9kZWNsX3Byb3BlcnR5X2VsZW1lbnQ3ODMxX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2RlY2xfcG9ydF9pbl9kZWNsX3Byb3BlcnR5X2VsZW1lbnQ3ODM4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWNsX3BvcnRfaW5fZGVjbF9wcm9wZXJ0eV9lbGVtZW50NzgzOF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWNsX3BvcnRfaW5fZGVjbF9wcm9wZXJ0eV9lbGVtZW50NzgzOAk9IHsgRk9MTE9XX2RlY2xfcG9ydF9pbl9kZWNsX3Byb3BlcnR5X2VsZW1lbnQ3ODM4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2RlY2xfc2lnbmFsX2luX2RlY2xfcHJvcGVydHlfZWxlbWVudDc4NDcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlY2xfc2lnbmFsX2luX2RlY2xfcHJvcGVydHlfZWxlbWVudDc4NDdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVjbF9zaWduYWxfaW5fZGVjbF9wcm9wZXJ0eV9lbGVtZW50Nzg0Nwk9IHsgRk9MTE9XX2RlY2xfc2lnbmFsX2luX2RlY2xfcHJvcGVydHlfZWxlbWVudDc4NDdfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVjbF9idWZmZXJfaW5fZGVjbF9wcm9wZXJ0eV9lbGVtZW50Nzg1NCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVjbF9idWZmZXJfaW5fZGVjbF9wcm9wZXJ0eV9lbGVtZW50Nzg1NF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWNsX2J1ZmZlcl9pbl9kZWNsX3Byb3BlcnR5X2VsZW1lbnQ3ODU0CT0geyBGT0xMT1dfZGVjbF9idWZmZXJfaW5fZGVjbF9wcm9wZXJ0eV9lbGVtZW50Nzg1NF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWNsX2NoYW5uZWxfaW5fZGVjbF9wcm9wZXJ0eV9lbGVtZW50Nzg2MSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVjbF9jaGFubmVsX2luX2RlY2xfcHJvcGVydHlfZWxlbWVudDc4NjFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVjbF9jaGFubmVsX2luX2RlY2xfcHJvcGVydHlfZWxlbWVudDc4NjEJPSB7IEZPTExPV19kZWNsX2NoYW5uZWxfaW5fZGVjbF9wcm9wZXJ0eV9lbGVtZW50Nzg2MV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfdHlwZV9pbl9kZWNsX3Byb3BlcnR5X2VsZW1lbnQ3ODY4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWZfdHlwZV9pbl9kZWNsX3Byb3BlcnR5X2VsZW1lbnQ3ODY4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl90eXBlX2luX2RlY2xfcHJvcGVydHlfZWxlbWVudDc4NjgJPSB7IEZPTExPV19kZWZfdHlwZV9pbl9kZWNsX3Byb3BlcnR5X2VsZW1lbnQ3ODY4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2RlZl9lbnVtX2luX2RlY2xfcHJvcGVydHlfZWxlbWVudDc4NzYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlZl9lbnVtX2luX2RlY2xfcHJvcGVydHlfZWxlbWVudDc4NzZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX2VudW1faW5fZGVjbF9wcm9wZXJ0eV9lbGVtZW50Nzg3Ngk9IHsgRk9MTE9XX2RlZl9lbnVtX2luX2RlY2xfcHJvcGVydHlfZWxlbWVudDc4NzZfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX3VuaW9uX2luX2RlY2xfcHJvcGVydHlfZWxlbWVudDc4ODQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlZl91bmlvbl9pbl9kZWNsX3Byb3BlcnR5X2VsZW1lbnQ3ODg0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl91bmlvbl9pbl9kZWNsX3Byb3BlcnR5X2VsZW1lbnQ3ODg0CT0geyBGT0xMT1dfZGVmX3VuaW9uX2luX2RlY2xfcHJvcGVydHlfZWxlbWVudDc4ODRfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX2Nob2ljZV9pbl9kZWNsX3Byb3BlcnR5X2VsZW1lbnQ3ODkxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWZfY2hvaWNlX2luX2RlY2xfcHJvcGVydHlfZWxlbWVudDc4OTFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX2Nob2ljZV9pbl9kZWNsX3Byb3BlcnR5X2VsZW1lbnQ3ODkxCT0geyBGT0xMT1dfZGVmX2Nob2ljZV9pbl9kZWNsX3Byb3BlcnR5X2VsZW1lbnQ3ODkxX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2RlZl9zdHJ1Y3RfaW5fZGVjbF9wcm9wZXJ0eV9lbGVtZW50Nzg5NyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX3N0cnVjdF9pbl9kZWNsX3Byb3BlcnR5X2VsZW1lbnQ3ODk3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl9zdHJ1Y3RfaW5fZGVjbF9wcm9wZXJ0eV9lbGVtZW50Nzg5Nwk9IHsgRk9MTE9XX2RlZl9zdHJ1Y3RfaW5fZGVjbF9wcm9wZXJ0eV9lbGVtZW50Nzg5N19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19JRF9pbl9sYWJlbGxlZF9hcmd1bWVudDc5MzMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0lEX2luX2xhYmVsbGVkX2FyZ3VtZW50NzkzM19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDIwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JRF9pbl9sYWJlbGxlZF9hcmd1bWVudDc5MzMJPSB7IEZPTExPV19JRF9pbl9sYWJlbGxlZF9hcmd1bWVudDc5MzNfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfQ09MT05faW5fbGFiZWxsZWRfYXJndW1lbnQ3OTM1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19DT0xPTl9pbl9sYWJlbGxlZF9hcmd1bWVudDc5MzVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQ09MT05faW5fbGFiZWxsZWRfYXJndW1lbnQ3OTM1CT0geyBGT0xMT1dfQ09MT05faW5fbGFiZWxsZWRfYXJndW1lbnQ3OTM1X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fbGFiZWxsZWRfYXJndW1lbnQ3OTQ1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX2xhYmVsbGVkX2FyZ3VtZW50Nzk0NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX2xhYmVsbGVkX2FyZ3VtZW50Nzk0NQk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fbGFiZWxsZWRfYXJndW1lbnQ3OTQ1X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fbGFiZWxsZWRfYXJndW1lbnQ3OTU1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX2xhYmVsbGVkX2FyZ3VtZW50Nzk1NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX2xhYmVsbGVkX2FyZ3VtZW50Nzk1NQk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fbGFiZWxsZWRfYXJndW1lbnQ3OTU1X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xQQVJFTl9pbl9kZWNsX2luc3RhbmNlX21hY2hpbmVfcGFyYW1zNzk3OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTFBBUkVOX2luX2RlY2xfaW5zdGFuY2VfbWFjaGluZV9wYXJhbXM3OTc5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xQQVJFTl9pbl9kZWNsX2luc3RhbmNlX21hY2hpbmVfcGFyYW1zNzk3OQk9IHsgRk9MTE9XX0xQQVJFTl9pbl9kZWNsX2luc3RhbmNlX21hY2hpbmVfcGFyYW1zNzk3OV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9kZWNsX2luc3RhbmNlX21hY2hpbmVfcGFyYW1zNzk4OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5fZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3BhcmFtczc5ODhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA4MDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5fZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3BhcmFtczc5ODgJPSB7IEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9kZWNsX2luc3RhbmNlX21hY2hpbmVfcGFyYW1zNzk4OF9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19DT01NQV9pbl9kZWNsX2luc3RhbmNlX21hY2hpbmVfcGFyYW1zODAwNCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQ09NTUFfaW5fZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3BhcmFtczgwMDRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQ09NTUFfaW5fZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3BhcmFtczgwMDQJPSB7IEZPTExPV19DT01NQV9pbl9kZWNsX2luc3RhbmNlX21hY2hpbmVfcGFyYW1zODAwNF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9kZWNsX2luc3RhbmNlX21hY2hpbmVfcGFyYW1zODAxMyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5fZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3BhcmFtczgwMTNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA4MDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5fZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3BhcmFtczgwMTMJPSB7IEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9kZWNsX2luc3RhbmNlX21hY2hpbmVfcGFyYW1zODAxM19iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19SUEFSRU5faW5fZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3BhcmFtczgwMzkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1JQQVJFTl9pbl9kZWNsX2luc3RhbmNlX21hY2hpbmVfcGFyYW1zODAzOV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19SUEFSRU5faW5fZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3BhcmFtczgwMzkJPSB7IEZPTExPV19SUEFSRU5faW5fZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3BhcmFtczgwMzlfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2V0X2luX2RlY2xfaW5zdGFuY2VfbWFjaGluZV9yZXR1cm5zODA2MSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2V0X2luX2RlY2xfaW5zdGFuY2VfbWFjaGluZV9yZXR1cm5zODA2MV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZXRfaW5fZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3JldHVybnM4MDYxCT0geyBGT0xMT1dfc2V0X2luX2RlY2xfaW5zdGFuY2VfbWFjaGluZV9yZXR1cm5zODA2MV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MUEFSRU5faW5fZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3JldHVybnM4MDc2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MUEFSRU5faW5fZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3JldHVybnM4MDc2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xQQVJFTl9pbl9kZWNsX2luc3RhbmNlX21hY2hpbmVfcmV0dXJuczgwNzYJPSB7IEZPTExPV19MUEFSRU5faW5fZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3JldHVybnM4MDc2X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2xhYmVsbGVkX2FyZ3VtZW50X2luX2RlY2xfaW5zdGFuY2VfbWFjaGluZV9yZXR1cm5zODA4NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5fZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3JldHVybnM4MDg1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwODAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2xhYmVsbGVkX2FyZ3VtZW50X2luX2RlY2xfaW5zdGFuY2VfbWFjaGluZV9yZXR1cm5zODA4NQk9IHsgRk9MTE9XX2xhYmVsbGVkX2FyZ3VtZW50X2luX2RlY2xfaW5zdGFuY2VfbWFjaGluZV9yZXR1cm5zODA4NV9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19DT01NQV9pbl9kZWNsX2luc3RhbmNlX21hY2hpbmVfcmV0dXJuczgxMDEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0NPTU1BX2luX2RlY2xfaW5zdGFuY2VfbWFjaGluZV9yZXR1cm5zODEwMV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19DT01NQV9pbl9kZWNsX2luc3RhbmNlX21hY2hpbmVfcmV0dXJuczgxMDEJPSB7IEZPTExPV19DT01NQV9pbl9kZWNsX2luc3RhbmNlX21hY2hpbmVfcmV0dXJuczgxMDFfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5fZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3JldHVybnM4MTEyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9kZWNsX2luc3RhbmNlX21hY2hpbmVfcmV0dXJuczgxMTJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA4MDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5fZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3JldHVybnM4MTEyCT0geyBGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5fZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3JldHVybnM4MTEyX2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1JQQVJFTl9pbl9kZWNsX2luc3RhbmNlX21hY2hpbmVfcmV0dXJuczgxMzYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1JQQVJFTl9pbl9kZWNsX2luc3RhbmNlX21hY2hpbmVfcmV0dXJuczgxMzZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUlBBUkVOX2luX2RlY2xfaW5zdGFuY2VfbWFjaGluZV9yZXR1cm5zODEzNgk9IHsgRk9MTE9XX1JQQVJFTl9pbl9kZWNsX2luc3RhbmNlX21hY2hpbmVfcmV0dXJuczgxMzZfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5fZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3JldHVybnM4MTQ2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9kZWNsX2luc3RhbmNlX21hY2hpbmVfcmV0dXJuczgxNDZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5fZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3JldHVybnM4MTQ2CT0geyBGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5fZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3JldHVybnM4MTQ2X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xQQVJFTl9pbl9hY3Rpdml0eV9tYWNoaW5lX3BhcmFtX3JldHVybjgxODIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xQQVJFTl9pbl9hY3Rpdml0eV9tYWNoaW5lX3BhcmFtX3JldHVybjgxODJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTFBBUkVOX2luX2FjdGl2aXR5X21hY2hpbmVfcGFyYW1fcmV0dXJuODE4Mgk9IHsgRk9MTE9XX0xQQVJFTl9pbl9hY3Rpdml0eV9tYWNoaW5lX3BhcmFtX3JldHVybjgxODJfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5fYWN0aXZpdHlfbWFjaGluZV9wYXJhbV9yZXR1cm44MTkzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9hY3Rpdml0eV9tYWNoaW5lX3BhcmFtX3JldHVybjgxOTNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA4MDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5fYWN0aXZpdHlfbWFjaGluZV9wYXJhbV9yZXR1cm44MTkzCT0geyBGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5fYWN0aXZpdHlfbWFjaGluZV9wYXJhbV9yZXR1cm44MTkzX2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0NPTU1BX2luX2FjdGl2aXR5X21hY2hpbmVfcGFyYW1fcmV0dXJuODIwOSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQ09NTUFfaW5fYWN0aXZpdHlfbWFjaGluZV9wYXJhbV9yZXR1cm44MjA5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0NPTU1BX2luX2FjdGl2aXR5X21hY2hpbmVfcGFyYW1fcmV0dXJuODIwOQk9IHsgRk9MTE9XX0NPTU1BX2luX2FjdGl2aXR5X21hY2hpbmVfcGFyYW1fcmV0dXJuODIwOV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9hY3Rpdml0eV9tYWNoaW5lX3BhcmFtX3JldHVybjgyMTggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2xhYmVsbGVkX2FyZ3VtZW50X2luX2FjdGl2aXR5X21hY2hpbmVfcGFyYW1fcmV0dXJuODIxOF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDgwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9hY3Rpdml0eV9tYWNoaW5lX3BhcmFtX3JldHVybjgyMTgJPSB7IEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9hY3Rpdml0eV9tYWNoaW5lX3BhcmFtX3JldHVybjgyMThfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfUlBBUkVOX2luX2FjdGl2aXR5X21hY2hpbmVfcGFyYW1fcmV0dXJuODI0NCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfUlBBUkVOX2luX2FjdGl2aXR5X21hY2hpbmVfcGFyYW1fcmV0dXJuODI0NF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDgwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19SUEFSRU5faW5fYWN0aXZpdHlfbWFjaGluZV9wYXJhbV9yZXR1cm44MjQ0CT0geyBGT0xMT1dfUlBBUkVOX2luX2FjdGl2aXR5X21hY2hpbmVfcGFyYW1fcmV0dXJuODI0NF9iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zZXRfaW5fYWN0aXZpdHlfbWFjaGluZV9wYXJhbV9yZXR1cm44MjUwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zZXRfaW5fYWN0aXZpdHlfbWFjaGluZV9wYXJhbV9yZXR1cm44MjUwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3NldF9pbl9hY3Rpdml0eV9tYWNoaW5lX3BhcmFtX3JldHVybjgyNTAJPSB7IEZPTExPV19zZXRfaW5fYWN0aXZpdHlfbWFjaGluZV9wYXJhbV9yZXR1cm44MjUwX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xQQVJFTl9pbl9hY3Rpdml0eV9tYWNoaW5lX3BhcmFtX3JldHVybjgyNjUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xQQVJFTl9pbl9hY3Rpdml0eV9tYWNoaW5lX3BhcmFtX3JldHVybjgyNjVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTFBBUkVOX2luX2FjdGl2aXR5X21hY2hpbmVfcGFyYW1fcmV0dXJuODI2NQk9IHsgRk9MTE9XX0xQQVJFTl9pbl9hY3Rpdml0eV9tYWNoaW5lX3BhcmFtX3JldHVybjgyNjVfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5fYWN0aXZpdHlfbWFjaGluZV9wYXJhbV9yZXR1cm44Mjc0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9hY3Rpdml0eV9tYWNoaW5lX3BhcmFtX3JldHVybjgyNzRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA4MDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5fYWN0aXZpdHlfbWFjaGluZV9wYXJhbV9yZXR1cm44Mjc0CT0geyBGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5fYWN0aXZpdHlfbWFjaGluZV9wYXJhbV9yZXR1cm44Mjc0X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0NPTU1BX2luX2FjdGl2aXR5X21hY2hpbmVfcGFyYW1fcmV0dXJuODI5MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQ09NTUFfaW5fYWN0aXZpdHlfbWFjaGluZV9wYXJhbV9yZXR1cm44MjkwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0NPTU1BX2luX2FjdGl2aXR5X21hY2hpbmVfcGFyYW1fcmV0dXJuODI5MAk9IHsgRk9MTE9XX0NPTU1BX2luX2FjdGl2aXR5X21hY2hpbmVfcGFyYW1fcmV0dXJuODI5MF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9hY3Rpdml0eV9tYWNoaW5lX3BhcmFtX3JldHVybjgzMDEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2xhYmVsbGVkX2FyZ3VtZW50X2luX2FjdGl2aXR5X21hY2hpbmVfcGFyYW1fcmV0dXJuODMwMV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDgwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9hY3Rpdml0eV9tYWNoaW5lX3BhcmFtX3JldHVybjgzMDEJPSB7IEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9hY3Rpdml0eV9tYWNoaW5lX3BhcmFtX3JldHVybjgzMDFfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfUlBBUkVOX2luX2FjdGl2aXR5X21hY2hpbmVfcGFyYW1fcmV0dXJuODMyNSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfUlBBUkVOX2luX2FjdGl2aXR5X21hY2hpbmVfcGFyYW1fcmV0dXJuODMyNV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19SUEFSRU5faW5fYWN0aXZpdHlfbWFjaGluZV9wYXJhbV9yZXR1cm44MzI1CT0geyBGT0xMT1dfUlBBUkVOX2luX2FjdGl2aXR5X21hY2hpbmVfcGFyYW1fcmV0dXJuODMyNV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9hY3Rpdml0eV9tYWNoaW5lX3BhcmFtX3JldHVybjgzMzUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2xhYmVsbGVkX2FyZ3VtZW50X2luX2FjdGl2aXR5X21hY2hpbmVfcGFyYW1fcmV0dXJuODMzNV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9hY3Rpdml0eV9tYWNoaW5lX3BhcmFtX3JldHVybjgzMzUJPSB7IEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9hY3Rpdml0eV9tYWNoaW5lX3BhcmFtX3JldHVybjgzMzVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzQ0X2luX2RlY2xfcG9ydDgzNzYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzM0NF9pbl9kZWNsX3BvcnQ4Mzc2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAyMDQwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMTAwMDAwMjAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzM0NF9pbl9kZWNsX3BvcnQ4Mzc2CT0geyBGT0xMT1dfMzQ0X2luX2RlY2xfcG9ydDgzNzZfYml0cywgNgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVjbF9wb3J0X2ltcGxfaW5fZGVjbF9wb3J0ODM4NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVjbF9wb3J0X2ltcGxfaW5fZGVjbF9wb3J0ODM4Nl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWNsX3BvcnRfaW1wbF9pbl9kZWNsX3BvcnQ4Mzg2CT0geyBGT0xMT1dfZGVjbF9wb3J0X2ltcGxfaW5fZGVjbF9wb3J0ODM4Nl9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19JRF9pbl9kZWNsX3BvcnRfaW1wbDg0MTYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0lEX2luX2RlY2xfcG9ydF9pbXBsODQxNl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JRF9pbl9kZWNsX3BvcnRfaW1wbDg0MTYJPSB7IEZPTExPV19JRF9pbl9kZWNsX3BvcnRfaW1wbDg0MTZfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfdHlwZV9wYXJhbV9jb21faW5fZGVjbF9wb3J0X2ltcGw4NDI4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV190eXBlX3BhcmFtX2NvbV9pbl9kZWNsX3BvcnRfaW1wbDg0MjhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfdHlwZV9wYXJhbV9jb21faW5fZGVjbF9wb3J0X2ltcGw4NDI4CT0geyBGT0xMT1dfdHlwZV9wYXJhbV9jb21faW5fZGVjbF9wb3J0X2ltcGw4NDI4X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1NFTUlfaW5fZGVjbF9wb3J0X2ltcGw4NDM1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19TRU1JX2luX2RlY2xfcG9ydF9pbXBsODQzNV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19TRU1JX2luX2RlY2xfcG9ydF9pbXBsODQzNQk9IHsgRk9MTE9XX1NFTUlfaW5fZGVjbF9wb3J0X2ltcGw4NDM1X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX21vZGlmaWVyX3NldF9kaXJlY3Rpb25fc3RyaWN0X3RleHRfaW5fZGVjbF9wb3J0X2ltcGw4NDQxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19tb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0X2luX2RlY2xfcG9ydF9pbXBsODQ0MV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMSkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19tb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0X2luX2RlY2xfcG9ydF9pbXBsODQ0MQk9IHsgRk9MTE9XX21vZGlmaWVyX3NldF9kaXJlY3Rpb25fc3RyaWN0X3RleHRfaW5fZGVjbF9wb3J0X2ltcGw4NDQxX2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lEX2luX2RlY2xfcG9ydF9pbXBsODQ1MSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfSURfaW5fZGVjbF9wb3J0X2ltcGw4NDUxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0lEX2luX2RlY2xfcG9ydF9pbXBsODQ1MQk9IHsgRk9MTE9XX0lEX2luX2RlY2xfcG9ydF9pbXBsODQ1MV9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV190eXBlX3BhcmFtX2NvbV9pbl9kZWNsX3BvcnRfaW1wbDg0NjEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3R5cGVfcGFyYW1fY29tX2luX2RlY2xfcG9ydF9pbXBsODQ2MV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV190eXBlX3BhcmFtX2NvbV9pbl9kZWNsX3BvcnRfaW1wbDg0NjEJPSB7IEZPTExPV190eXBlX3BhcmFtX2NvbV9pbl9kZWNsX3BvcnRfaW1wbDg0NjFfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfU0VNSV9pbl9kZWNsX3BvcnRfaW1wbDg0NjggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1NFTUlfaW5fZGVjbF9wb3J0X2ltcGw4NDY4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1NFTUlfaW5fZGVjbF9wb3J0X2ltcGw4NDY4CT0geyBGT0xMT1dfU0VNSV9pbl9kZWNsX3BvcnRfaW1wbDg0NjhfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTENVUkxZX2luX2RlY2xfcG9ydF9pbXBsODQ3NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTENVUkxZX2luX2RlY2xfcG9ydF9pbXBsODQ3Nl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MQ1VSTFlfaW5fZGVjbF9wb3J0X2ltcGw4NDc2CT0geyBGT0xMT1dfTENVUkxZX2luX2RlY2xfcG9ydF9pbXBsODQ3Nl9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19JRF9pbl9kZWNsX3BvcnRfaW1wbDg0ODYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0lEX2luX2RlY2xfcG9ydF9pbXBsODQ4Nl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JRF9pbl9kZWNsX3BvcnRfaW1wbDg0ODYJPSB7IEZPTExPV19JRF9pbl9kZWNsX3BvcnRfaW1wbDg0ODZfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfdHlwZV9wYXJhbV9jb21faW5fZGVjbF9wb3J0X2ltcGw4NTA2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV190eXBlX3BhcmFtX2NvbV9pbl9kZWNsX3BvcnRfaW1wbDg1MDZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfdHlwZV9wYXJhbV9jb21faW5fZGVjbF9wb3J0X2ltcGw4NTA2CT0geyBGT0xMT1dfdHlwZV9wYXJhbV9jb21faW5fZGVjbF9wb3J0X2ltcGw4NTA2X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1NFTUlfaW5fZGVjbF9wb3J0X2ltcGw4NTEzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19TRU1JX2luX2RlY2xfcG9ydF9pbXBsODUxM19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjAwMDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19TRU1JX2luX2RlY2xfcG9ydF9pbXBsODUxMwk9IHsgRk9MTE9XX1NFTUlfaW5fZGVjbF9wb3J0X2ltcGw4NTEzX2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1JDVVJMWV9pbl9kZWNsX3BvcnRfaW1wbDg1MjMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1JDVVJMWV9pbl9kZWNsX3BvcnRfaW1wbDg1MjNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUkNVUkxZX2luX2RlY2xfcG9ydF9pbXBsODUyMwk9IHsgRk9MTE9XX1JDVVJMWV9pbl9kZWNsX3BvcnRfaW1wbDg1MjNfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTENVUkxZX2luX2RlY2xfcG9ydF9pbXBsODUzMyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTENVUkxZX2luX2RlY2xfcG9ydF9pbXBsODUzM19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMjA0MDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDEwMDAwMDIwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MQ1VSTFlfaW5fZGVjbF9wb3J0X2ltcGw4NTMzCT0geyBGT0xMT1dfTENVUkxZX2luX2RlY2xfcG9ydF9pbXBsODUzM19iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19JRF9pbl9kZWNsX3BvcnRfaW1wbDg1NTEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0lEX2luX2RlY2xfcG9ydF9pbXBsODU1MV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JRF9pbl9kZWNsX3BvcnRfaW1wbDg1NTEJPSB7IEZPTExPV19JRF9pbl9kZWNsX3BvcnRfaW1wbDg1NTFfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfdHlwZV9wYXJhbV9jb21faW5fZGVjbF9wb3J0X2ltcGw4NTY3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV190eXBlX3BhcmFtX2NvbV9pbl9kZWNsX3BvcnRfaW1wbDg1NjdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfdHlwZV9wYXJhbV9jb21faW5fZGVjbF9wb3J0X2ltcGw4NTY3CT0geyBGT0xMT1dfdHlwZV9wYXJhbV9jb21faW5fZGVjbF9wb3J0X2ltcGw4NTY3X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1NFTUlfaW5fZGVjbF9wb3J0X2ltcGw4NTc0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19TRU1JX2luX2RlY2xfcG9ydF9pbXBsODU3NF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMjA0MDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDEwMDAwMDIwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19TRU1JX2luX2RlY2xfcG9ydF9pbXBsODU3NAk9IHsgRk9MTE9XX1NFTUlfaW5fZGVjbF9wb3J0X2ltcGw4NTc0X2JpdHMsIDYJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX21vZGlmaWVyX3NldF9kaXJlY3Rpb25fc3RyaWN0X3RleHRfaW5fZGVjbF9wb3J0X2ltcGw4NTgyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19tb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0X2luX2RlY2xfcG9ydF9pbXBsODU4Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19tb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0X2luX2RlY2xfcG9ydF9pbXBsODU4Mgk9IHsgRk9MTE9XX21vZGlmaWVyX3NldF9kaXJlY3Rpb25fc3RyaWN0X3RleHRfaW5fZGVjbF9wb3J0X2ltcGw4NTgyX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lEX2luX2RlY2xfcG9ydF9pbXBsODU4NyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfSURfaW5fZGVjbF9wb3J0X2ltcGw4NTg3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0lEX2luX2RlY2xfcG9ydF9pbXBsODU4Nwk9IHsgRk9MTE9XX0lEX2luX2RlY2xfcG9ydF9pbXBsODU4N19iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV190eXBlX3BhcmFtX2NvbV9pbl9kZWNsX3BvcnRfaW1wbDg2MDMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3R5cGVfcGFyYW1fY29tX2luX2RlY2xfcG9ydF9pbXBsODYwM19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV190eXBlX3BhcmFtX2NvbV9pbl9kZWNsX3BvcnRfaW1wbDg2MDMJPSB7IEZPTExPV190eXBlX3BhcmFtX2NvbV9pbl9kZWNsX3BvcnRfaW1wbDg2MDNfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfU0VNSV9pbl9kZWNsX3BvcnRfaW1wbDg2MTAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1NFTUlfaW5fZGVjbF9wb3J0X2ltcGw4NjEwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAyMDQwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMTAwMDAwMjAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1NFTUlfaW5fZGVjbF9wb3J0X2ltcGw4NjEwCT0geyBGT0xMT1dfU0VNSV9pbl9kZWNsX3BvcnRfaW1wbDg2MTBfYml0cywgNgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfUkNVUkxZX2luX2RlY2xfcG9ydF9pbXBsODYyMSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfUkNVUkxZX2luX2RlY2xfcG9ydF9pbXBsODYyMV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19SQ1VSTFlfaW5fZGVjbF9wb3J0X2ltcGw4NjIxCT0geyBGT0xMT1dfUkNVUkxZX2luX2RlY2xfcG9ydF9pbXBsODYyMV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zNzRfaW5fZGVjbF9zaWduYWw4NjQ2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zNzRfaW5fZGVjbF9zaWduYWw4NjQ2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAyMDQwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMTAwMDAwMjAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzM3NF9pbl9kZWNsX3NpZ25hbDg2NDYJPSB7IEZPTExPV18zNzRfaW5fZGVjbF9zaWduYWw4NjQ2X2JpdHMsIDYJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzMyMF9pbl9kZWNsX3NpZ25hbDg2NTYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzMyMF9pbl9kZWNsX3NpZ25hbDg2NTZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDIwNDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAxMDAwMDAyMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzIwX2luX2RlY2xfc2lnbmFsODY1Ngk9IHsgRk9MTE9XXzMyMF9pbl9kZWNsX3NpZ25hbDg2NTZfYml0cywgNgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVjbF9zaWduYWxfaW1wbF9pbl9kZWNsX3NpZ25hbDg2NjggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlY2xfc2lnbmFsX2ltcGxfaW5fZGVjbF9zaWduYWw4NjY4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlY2xfc2lnbmFsX2ltcGxfaW5fZGVjbF9zaWduYWw4NjY4CT0geyBGT0xMT1dfZGVjbF9zaWduYWxfaW1wbF9pbl9kZWNsX3NpZ25hbDg2NjhfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfSURfaW5fZGVjbF9zaWduYWxfaW1wbDg2OTggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0lEX2luX2RlY2xfc2lnbmFsX2ltcGw4Njk4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0lEX2luX2RlY2xfc2lnbmFsX2ltcGw4Njk4CT0geyBGT0xMT1dfSURfaW5fZGVjbF9zaWduYWxfaW1wbDg2OThfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfdHlwZV9wYXJhbV9jb21faW5fZGVjbF9zaWduYWxfaW1wbDg3MTAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3R5cGVfcGFyYW1fY29tX2luX2RlY2xfc2lnbmFsX2ltcGw4NzEwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3R5cGVfcGFyYW1fY29tX2luX2RlY2xfc2lnbmFsX2ltcGw4NzEwCT0geyBGT0xMT1dfdHlwZV9wYXJhbV9jb21faW5fZGVjbF9zaWduYWxfaW1wbDg3MTBfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfU0VNSV9pbl9kZWNsX3NpZ25hbF9pbXBsODcxNyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU0VNSV9pbl9kZWNsX3NpZ25hbF9pbXBsODcxN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19TRU1JX2luX2RlY2xfc2lnbmFsX2ltcGw4NzE3CT0geyBGT0xMT1dfU0VNSV9pbl9kZWNsX3NpZ25hbF9pbXBsODcxN19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19tb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0X2luX2RlY2xfc2lnbmFsX2ltcGw4NzIzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19tb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0X2luX2RlY2xfc2lnbmFsX2ltcGw4NzIzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX21vZGlmaWVyX3NldF9kaXJlY3Rpb25fc3RyaWN0X3RleHRfaW5fZGVjbF9zaWduYWxfaW1wbDg3MjMJPSB7IEZPTExPV19tb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0X2luX2RlY2xfc2lnbmFsX2ltcGw4NzIzX2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lEX2luX2RlY2xfc2lnbmFsX2ltcGw4NzMzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19JRF9pbl9kZWNsX3NpZ25hbF9pbXBsODczM19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JRF9pbl9kZWNsX3NpZ25hbF9pbXBsODczMwk9IHsgRk9MTE9XX0lEX2luX2RlY2xfc2lnbmFsX2ltcGw4NzMzX2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3R5cGVfcGFyYW1fY29tX2luX2RlY2xfc2lnbmFsX2ltcGw4NzQzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV190eXBlX3BhcmFtX2NvbV9pbl9kZWNsX3NpZ25hbF9pbXBsODc0M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV190eXBlX3BhcmFtX2NvbV9pbl9kZWNsX3NpZ25hbF9pbXBsODc0Mwk9IHsgRk9MTE9XX3R5cGVfcGFyYW1fY29tX2luX2RlY2xfc2lnbmFsX2ltcGw4NzQzX2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1NFTUlfaW5fZGVjbF9zaWduYWxfaW1wbDg3NTAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1NFTUlfaW5fZGVjbF9zaWduYWxfaW1wbDg3NTBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU0VNSV9pbl9kZWNsX3NpZ25hbF9pbXBsODc1MAk9IHsgRk9MTE9XX1NFTUlfaW5fZGVjbF9zaWduYWxfaW1wbDg3NTBfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTENVUkxZX2luX2RlY2xfc2lnbmFsX2ltcGw4NzU4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MQ1VSTFlfaW5fZGVjbF9zaWduYWxfaW1wbDg3NThfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTENVUkxZX2luX2RlY2xfc2lnbmFsX2ltcGw4NzU4CT0geyBGT0xMT1dfTENVUkxZX2luX2RlY2xfc2lnbmFsX2ltcGw4NzU4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lEX2luX2RlY2xfc2lnbmFsX2ltcGw4NzY4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19JRF9pbl9kZWNsX3NpZ25hbF9pbXBsODc2OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JRF9pbl9kZWNsX3NpZ25hbF9pbXBsODc2OAk9IHsgRk9MTE9XX0lEX2luX2RlY2xfc2lnbmFsX2ltcGw4NzY4X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3R5cGVfcGFyYW1fY29tX2luX2RlY2xfc2lnbmFsX2ltcGw4Nzg4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV190eXBlX3BhcmFtX2NvbV9pbl9kZWNsX3NpZ25hbF9pbXBsODc4OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV190eXBlX3BhcmFtX2NvbV9pbl9kZWNsX3NpZ25hbF9pbXBsODc4OAk9IHsgRk9MTE9XX3R5cGVfcGFyYW1fY29tX2luX2RlY2xfc2lnbmFsX2ltcGw4Nzg4X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1NFTUlfaW5fZGVjbF9zaWduYWxfaW1wbDg3OTUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1NFTUlfaW5fZGVjbF9zaWduYWxfaW1wbDg3OTVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDIwMDAwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU0VNSV9pbl9kZWNsX3NpZ25hbF9pbXBsODc5NQk9IHsgRk9MTE9XX1NFTUlfaW5fZGVjbF9zaWduYWxfaW1wbDg3OTVfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfUkNVUkxZX2luX2RlY2xfc2lnbmFsX2ltcGw4ODA1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19SQ1VSTFlfaW5fZGVjbF9zaWduYWxfaW1wbDg4MDVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUkNVUkxZX2luX2RlY2xfc2lnbmFsX2ltcGw4ODA1CT0geyBGT0xMT1dfUkNVUkxZX2luX2RlY2xfc2lnbmFsX2ltcGw4ODA1X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xDVVJMWV9pbl9kZWNsX3NpZ25hbF9pbXBsODgxNSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTENVUkxZX2luX2RlY2xfc2lnbmFsX2ltcGw4ODE1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAyMDQwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMTAwMDAwMjAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xDVVJMWV9pbl9kZWNsX3NpZ25hbF9pbXBsODgxNQk9IHsgRk9MTE9XX0xDVVJMWV9pbl9kZWNsX3NpZ25hbF9pbXBsODgxNV9iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19JRF9pbl9kZWNsX3NpZ25hbF9pbXBsODgzMyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfSURfaW5fZGVjbF9zaWduYWxfaW1wbDg4MzNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfSURfaW5fZGVjbF9zaWduYWxfaW1wbDg4MzMJPSB7IEZPTExPV19JRF9pbl9kZWNsX3NpZ25hbF9pbXBsODgzM19iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV190eXBlX3BhcmFtX2NvbV9pbl9kZWNsX3NpZ25hbF9pbXBsODg0OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfdHlwZV9wYXJhbV9jb21faW5fZGVjbF9zaWduYWxfaW1wbDg4NDlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfdHlwZV9wYXJhbV9jb21faW5fZGVjbF9zaWduYWxfaW1wbDg4NDkJPSB7IEZPTExPV190eXBlX3BhcmFtX2NvbV9pbl9kZWNsX3NpZ25hbF9pbXBsODg0OV9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TRU1JX2luX2RlY2xfc2lnbmFsX2ltcGw4ODU2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19TRU1JX2luX2RlY2xfc2lnbmFsX2ltcGw4ODU2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAyMDQwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMTAwMDAwMjAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1NFTUlfaW5fZGVjbF9zaWduYWxfaW1wbDg4NTYJPSB7IEZPTExPV19TRU1JX2luX2RlY2xfc2lnbmFsX2ltcGw4ODU2X2JpdHMsIDYJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX21vZGlmaWVyX3NldF9kaXJlY3Rpb25fc3RyaWN0X3RleHRfaW5fZGVjbF9zaWduYWxfaW1wbDg4NjQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX21vZGlmaWVyX3NldF9kaXJlY3Rpb25fc3RyaWN0X3RleHRfaW5fZGVjbF9zaWduYWxfaW1wbDg4NjRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dF9pbl9kZWNsX3NpZ25hbF9pbXBsODg2NAk9IHsgRk9MTE9XX21vZGlmaWVyX3NldF9kaXJlY3Rpb25fc3RyaWN0X3RleHRfaW5fZGVjbF9zaWduYWxfaW1wbDg4NjRfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfSURfaW5fZGVjbF9zaWduYWxfaW1wbDg4NjkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0lEX2luX2RlY2xfc2lnbmFsX2ltcGw4ODY5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0lEX2luX2RlY2xfc2lnbmFsX2ltcGw4ODY5CT0geyBGT0xMT1dfSURfaW5fZGVjbF9zaWduYWxfaW1wbDg4NjlfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfdHlwZV9wYXJhbV9jb21faW5fZGVjbF9zaWduYWxfaW1wbDg4ODUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3R5cGVfcGFyYW1fY29tX2luX2RlY2xfc2lnbmFsX2ltcGw4ODg1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3R5cGVfcGFyYW1fY29tX2luX2RlY2xfc2lnbmFsX2ltcGw4ODg1CT0geyBGT0xMT1dfdHlwZV9wYXJhbV9jb21faW5fZGVjbF9zaWduYWxfaW1wbDg4ODVfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfU0VNSV9pbl9kZWNsX3NpZ25hbF9pbXBsODg5MiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU0VNSV9pbl9kZWNsX3NpZ25hbF9pbXBsODg5Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMjA0MDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDEwMDAwMDIwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19TRU1JX2luX2RlY2xfc2lnbmFsX2ltcGw4ODkyCT0geyBGT0xMT1dfU0VNSV9pbl9kZWNsX3NpZ25hbF9pbXBsODg5Ml9iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19SQ1VSTFlfaW5fZGVjbF9zaWduYWxfaW1wbDg5MDMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1JDVVJMWV9pbl9kZWNsX3NpZ25hbF9pbXBsODkwM19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19SQ1VSTFlfaW5fZGVjbF9zaWduYWxfaW1wbDg5MDMJPSB7IEZPTExPV19SQ1VSTFlfaW5fZGVjbF9zaWduYWxfaW1wbDg5MDNfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTFBBUkVOX2luX3R5cGVfcGFyYW1fY29tODkyNSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTFBBUkVOX2luX3R5cGVfcGFyYW1fY29tODkyNV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4QzI3NjAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MzhFMDAwMDAwQTAwQzEyOCksIEFOVExSM19VSU5UNjRfTElUKDB4MDA2NDAxNjAwNzAwMjI2MSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAxM0E3ODEwOCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MUEFSRU5faW5fdHlwZV9wYXJhbV9jb204OTI1CT0geyBGT0xMT1dfTFBBUkVOX2luX3R5cGVfcGFyYW1fY29tODkyNV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19wYXJhbV9jb21fYXRvbV9pbl90eXBlX3BhcmFtX2NvbTg5MzIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3BhcmFtX2NvbV9hdG9tX2luX3R5cGVfcGFyYW1fY29tODkzMl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDgwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19wYXJhbV9jb21fYXRvbV9pbl90eXBlX3BhcmFtX2NvbTg5MzIJPSB7IEZPTExPV19wYXJhbV9jb21fYXRvbV9pbl90eXBlX3BhcmFtX2NvbTg5MzJfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfQ09NTUFfaW5fdHlwZV9wYXJhbV9jb204OTQyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19DT01NQV9pbl90eXBlX3BhcmFtX2NvbTg5NDJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweEMyNzYwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDM4RTAwMDAwMEEwMEMxMjgpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwNjQwMTYwMDcwMDIyNjEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMTNBNzgxMDgpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQ09NTUFfaW5fdHlwZV9wYXJhbV9jb204OTQyCT0geyBGT0xMT1dfQ09NTUFfaW5fdHlwZV9wYXJhbV9jb204OTQyX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3BhcmFtX2NvbV9hdG9tX2luX3R5cGVfcGFyYW1fY29tODk0NCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfcGFyYW1fY29tX2F0b21faW5fdHlwZV9wYXJhbV9jb204OTQ0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwODAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3BhcmFtX2NvbV9hdG9tX2luX3R5cGVfcGFyYW1fY29tODk0NAk9IHsgRk9MTE9XX3BhcmFtX2NvbV9hdG9tX2luX3R5cGVfcGFyYW1fY29tODk0NF9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19SUEFSRU5faW5fdHlwZV9wYXJhbV9jb204OTUzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19SUEFSRU5faW5fdHlwZV9wYXJhbV9jb204OTUzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1JQQVJFTl9pbl90eXBlX3BhcmFtX2NvbTg5NTMJPSB7IEZPTExPV19SUEFSRU5faW5fdHlwZV9wYXJhbV9jb204OTUzX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3R5cGVfdmFyX2luX3BhcmFtX2NvbV9hdG9tODk3MyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfdHlwZV92YXJfaW5fcGFyYW1fY29tX2F0b204OTczX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3R5cGVfdmFyX2luX3BhcmFtX2NvbV9hdG9tODk3Mwk9IHsgRk9MTE9XX3R5cGVfdmFyX2luX3BhcmFtX2NvbV9hdG9tODk3M19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19JRF9pbl9wYXJhbV9jb21fYXRvbTg5ODQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0lEX2luX3BhcmFtX2NvbV9hdG9tODk4NF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAxMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JRF9pbl9wYXJhbV9jb21fYXRvbTg5ODQJPSB7IEZPTExPV19JRF9pbl9wYXJhbV9jb21fYXRvbTg5ODRfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfaW5pdGlhbF92YWx1ZV9pbl9wYXJhbV9jb21fYXRvbTkwMDEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2luaXRpYWxfdmFsdWVfaW5fcGFyYW1fY29tX2F0b205MDAxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2luaXRpYWxfdmFsdWVfaW5fcGFyYW1fY29tX2F0b205MDAxCT0geyBGT0xMT1dfaW5pdGlhbF92YWx1ZV9pbl9wYXJhbV9jb21fYXRvbTkwMDFfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjQ0X2luX3BhcmFtX2NvbV9hdG9tOTAyMiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjQ0X2luX3BhcmFtX2NvbV9hdG9tOTAyMl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4QzI2NjAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MzhFMDAwMDAwQTAwQzEyOCksIEFOVExSM19VSU5UNjRfTElUKDB4MDA2NDAxNjAwNzAwMjI2MSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAxM0E3ODEwOCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yNDRfaW5fcGFyYW1fY29tX2F0b205MDIyCT0geyBGT0xMT1dfMjQ0X2luX3BhcmFtX2NvbV9hdG9tOTAyMl9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV190eXBlX3Zhcl9pbl9wYXJhbV9jb21fYXRvbTkwNDIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3R5cGVfdmFyX2luX3BhcmFtX2NvbV9hdG9tOTA0Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDIwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV190eXBlX3Zhcl9pbl9wYXJhbV9jb21fYXRvbTkwNDIJPSB7IEZPTExPV190eXBlX3Zhcl9pbl9wYXJhbV9jb21fYXRvbTkwNDJfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfQ09MT05faW5fcGFyYW1fY29tX2F0b205MDQ0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19DT0xPTl9pbl9wYXJhbV9jb21fYXRvbTkwNDRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQ09MT05faW5fcGFyYW1fY29tX2F0b205MDQ0CT0geyBGT0xMT1dfQ09MT05faW5fcGFyYW1fY29tX2F0b205MDQ0X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fcGFyYW1fY29tX2F0b205MDU2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX3BhcmFtX2NvbV9hdG9tOTA1Nl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX3BhcmFtX2NvbV9hdG9tOTA1Ngk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fcGFyYW1fY29tX2F0b205MDU2X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9wYXJhbV9jb21fYXRvbTkwNjcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9wYXJhbV9jb21fYXRvbTkwNjdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX3BhcmFtX2NvbV9hdG9tOTA2Nwk9IHsgRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9wYXJhbV9jb21fYXRvbTkwNjdfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjQ5X2luX2RlY2xfYnVmZmVyOTA5OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjQ5X2luX2RlY2xfYnVmZmVyOTA5OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDgwMDAwMDAwMjAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAyNDAwMTAwMDAwMDI2MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAxMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yNDlfaW5fZGVjbF9idWZmZXI5MDk4CT0geyBGT0xMT1dfMjQ5X2luX2RlY2xfYnVmZmVyOTA5OF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWNsX2J1ZmZlcl9pbXBsX2luX2RlY2xfYnVmZmVyOTEwMSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVjbF9idWZmZXJfaW1wbF9pbl9kZWNsX2J1ZmZlcjkxMDFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVjbF9idWZmZXJfaW1wbF9pbl9kZWNsX2J1ZmZlcjkxMDEJPSB7IEZPTExPV19kZWNsX2J1ZmZlcl9pbXBsX2luX2RlY2xfYnVmZmVyOTEwMV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfYnVmZmVyX2luX2RlY2xfYnVmZmVyX2ltcGw5MTIyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWZfYnVmZmVyX2luX2RlY2xfYnVmZmVyX2ltcGw5MTIyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl9idWZmZXJfaW5fZGVjbF9idWZmZXJfaW1wbDkxMjIJPSB7IEZPTExPV19kZWZfYnVmZmVyX2luX2RlY2xfYnVmZmVyX2ltcGw5MTIyX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lEX2luX2RlY2xfYnVmZmVyX2ltcGw5MTI3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19JRF9pbl9kZWNsX2J1ZmZlcl9pbXBsOTEyN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAxMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JRF9pbl9kZWNsX2J1ZmZlcl9pbXBsOTEyNwk9IHsgRk9MTE9XX0lEX2luX2RlY2xfYnVmZmVyX2ltcGw5MTI3X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2luaXRpYWxfYnVmZmVyX2NvbnRlbnRzX2luX2RlY2xfYnVmZmVyX2ltcGw5MTM3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19pbml0aWFsX2J1ZmZlcl9jb250ZW50c19pbl9kZWNsX2J1ZmZlcl9pbXBsOTEzN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19pbml0aWFsX2J1ZmZlcl9jb250ZW50c19pbl9kZWNsX2J1ZmZlcl9pbXBsOTEzNwk9IHsgRk9MTE9XX2luaXRpYWxfYnVmZmVyX2NvbnRlbnRzX2luX2RlY2xfYnVmZmVyX2ltcGw5MTM3X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1NFTUlfaW5fZGVjbF9idWZmZXJfaW1wbDkxNDQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1NFTUlfaW5fZGVjbF9idWZmZXJfaW1wbDkxNDRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU0VNSV9pbl9kZWNsX2J1ZmZlcl9pbXBsOTE0NAk9IHsgRk9MTE9XX1NFTUlfaW5fZGVjbF9idWZmZXJfaW1wbDkxNDRfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTENVUkxZX2luX2RlY2xfYnVmZmVyX2ltcGw5MTUwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MQ1VSTFlfaW5fZGVjbF9idWZmZXJfaW1wbDkxNTBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDA4MDAwMDAwMDIwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMjQwMDEwMDAwMDAyNjApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMTAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTENVUkxZX2luX2RlY2xfYnVmZmVyX2ltcGw5MTUwCT0geyBGT0xMT1dfTENVUkxZX2luX2RlY2xfYnVmZmVyX2ltcGw5MTUwX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2RlZl9idWZmZXJfaW5fZGVjbF9idWZmZXJfaW1wbDkxNjQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlZl9idWZmZXJfaW5fZGVjbF9idWZmZXJfaW1wbDkxNjRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX2J1ZmZlcl9pbl9kZWNsX2J1ZmZlcl9pbXBsOTE2NAk9IHsgRk9MTE9XX2RlZl9idWZmZXJfaW5fZGVjbF9idWZmZXJfaW1wbDkxNjRfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfSURfaW5fZGVjbF9idWZmZXJfaW1wbDkxNjkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0lEX2luX2RlY2xfYnVmZmVyX2ltcGw5MTY5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwODAwMDAwMDAyMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDI0MDAxMDAwMDAwMjYwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDEwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0lEX2luX2RlY2xfYnVmZmVyX2ltcGw5MTY5CT0geyBGT0xMT1dfSURfaW5fZGVjbF9idWZmZXJfaW1wbDkxNjlfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfUkNVUkxZX2luX2RlY2xfYnVmZmVyX2ltcGw5MTg3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19SQ1VSTFlfaW5fZGVjbF9idWZmZXJfaW1wbDkxODdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUkNVUkxZX2luX2RlY2xfYnVmZmVyX2ltcGw5MTg3CT0geyBGT0xMT1dfUkNVUkxZX2luX2RlY2xfYnVmZmVyX2ltcGw5MTg3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3BvbGljeV9idWZmZXJfaW5fZGVmX2J1ZmZlcjkyMDUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3BvbGljeV9idWZmZXJfaW5fZGVmX2J1ZmZlcjkyMDVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfcG9saWN5X2J1ZmZlcl9pbl9kZWZfYnVmZmVyOTIwNQk9IHsgRk9MTE9XX3BvbGljeV9idWZmZXJfaW5fZGVmX2J1ZmZlcjkyMDVfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTFRfX2luX2RlZl9idWZmZXI5MjE1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MVF9faW5fZGVmX2J1ZmZlcjkyMTVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwODQwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAyMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTFRfX2luX2RlZl9idWZmZXI5MjE1CT0geyBGT0xMT1dfTFRfX2luX2RlZl9idWZmZXI5MjE1X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fZGVmX2J1ZmZlcjkyMjYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fZGVmX2J1ZmZlcjkyMjZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfaW50ZWdlcl9jb25zdGFudF9pbl9kZWZfYnVmZmVyOTIyNgk9IHsgRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fZGVmX2J1ZmZlcjkyMjZfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfU1RBUl9pbl9kZWZfYnVmZmVyOTIzOCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU1RBUl9pbl9kZWZfYnVmZmVyOTIzOF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19TVEFSX2luX2RlZl9idWZmZXI5MjM4CT0geyBGT0xMT1dfU1RBUl9pbl9kZWZfYnVmZmVyOTIzOF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19HVF9pbl9kZWZfYnVmZmVyOTI2NyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfR1RfaW5fZGVmX2J1ZmZlcjkyNjdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfR1RfaW5fZGVmX2J1ZmZlcjkyNjcJPSB7IEZPTExPV19HVF9pbl9kZWZfYnVmZmVyOTI2N19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zNTZfaW5fZGVmX2J1ZmZlcjkyNzYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzM1Nl9pbl9kZWZfYnVmZmVyOTI3Nl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zNTZfaW5fZGVmX2J1ZmZlcjkyNzYJPSB7IEZPTExPV18zNTZfaW5fZGVmX2J1ZmZlcjkyNzZfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjgxX2luX3BvbGljeV9idWZmZXI5Mjk1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yODFfaW5fcG9saWN5X2J1ZmZlcjkyOTVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjgxX2luX3BvbGljeV9idWZmZXI5Mjk1CT0geyBGT0xMT1dfMjgxX2luX3BvbGljeV9idWZmZXI5Mjk1X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzMxNV9pbl9wb2xpY3lfYnVmZmVyOTMwNyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzE1X2luX3BvbGljeV9idWZmZXI5MzA3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzMxNV9pbl9wb2xpY3lfYnVmZmVyOTMwNwk9IHsgRk9MTE9XXzMxNV9pbl9wb2xpY3lfYnVmZmVyOTMwN19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zMjVfaW5fcG9saWN5X2J1ZmZlcjkzMTkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzMyNV9pbl9wb2xpY3lfYnVmZmVyOTMxOV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zMjVfaW5fcG9saWN5X2J1ZmZlcjkzMTkJPSB7IEZPTExPV18zMjVfaW5fcG9saWN5X2J1ZmZlcjkzMTlfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzI2X2luX3BvbGljeV9idWZmZXI5MzI2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zMjZfaW5fcG9saWN5X2J1ZmZlcjkzMjZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzI2X2luX3BvbGljeV9idWZmZXI5MzI2CT0geyBGT0xMT1dfMzI2X2luX3BvbGljeV9idWZmZXI5MzI2X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzM3M19pbl9wb2xpY3lfYnVmZmVyOTMzMyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzczX2luX3BvbGljeV9idWZmZXI5MzMzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzM3M19pbl9wb2xpY3lfYnVmZmVyOTMzMwk9IHsgRk9MTE9XXzM3M19pbl9wb2xpY3lfYnVmZmVyOTMzM19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zMjlfaW5fcG9saWN5X2J1ZmZlcjkzNDYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzMyOV9pbl9wb2xpY3lfYnVmZmVyOTM0Nl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zMjlfaW5fcG9saWN5X2J1ZmZlcjkzNDYJPSB7IEZPTExPV18zMjlfaW5fcG9saWN5X2J1ZmZlcjkzNDZfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfNDEyX2luX3BvbGljeV9idWZmZXI5MzU0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV180MTJfaW5fcG9saWN5X2J1ZmZlcjkzNTRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfNDEyX2luX3BvbGljeV9idWZmZXI5MzU0CT0geyBGT0xMT1dfNDEyX2luX3BvbGljeV9idWZmZXI5MzU0X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzM3MF9pbl9wb2xpY3lfYnVmZmVyOTM2NCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzcwX2luX3BvbGljeV9idWZmZXI5MzY0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzM3MF9pbl9wb2xpY3lfYnVmZmVyOTM2NAk9IHsgRk9MTE9XXzM3MF9pbl9wb2xpY3lfYnVmZmVyOTM2NF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fcmVmX2J1ZmZlcjkzODYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9yZWZfYnVmZmVyOTM4Nl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fcmVmX2J1ZmZlcjkzODYJPSB7IEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fcmVmX2J1ZmZlcjkzODZfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfQVNTSUdOX2luX2luaXRpYWxfYnVmZmVyX2NvbnRlbnRzOTQwNiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQVNTSUdOX2luX2luaXRpYWxfYnVmZmVyX2NvbnRlbnRzOTQwNl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MTAwMDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19BU1NJR05faW5faW5pdGlhbF9idWZmZXJfY29udGVudHM5NDA2CT0geyBGT0xMT1dfQVNTSUdOX2luX2luaXRpYWxfYnVmZmVyX2NvbnRlbnRzOTQwNl9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MQlJBQ0tFVF9pbl9pbml0aWFsX2J1ZmZlcl9jb250ZW50czk0MDggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xCUkFDS0VUX2luX2luaXRpYWxfYnVmZmVyX2NvbnRlbnRzOTQwOF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MQlJBQ0tFVF9pbl9pbml0aWFsX2J1ZmZlcl9jb250ZW50czk0MDgJPSB7IEZPTExPV19MQlJBQ0tFVF9pbl9pbml0aWFsX2J1ZmZlcl9jb250ZW50czk0MDhfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX2luaXRpYWxfYnVmZmVyX2NvbnRlbnRzOTQxNyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX2luaXRpYWxfYnVmZmVyX2NvbnRlbnRzOTQxN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDgwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MTAwMDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5faW5pdGlhbF9idWZmZXJfY29udGVudHM5NDE3CT0geyBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX2luaXRpYWxfYnVmZmVyX2NvbnRlbnRzOTQxN19iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19DT01NQV9pbl9pbml0aWFsX2J1ZmZlcl9jb250ZW50czk0MzEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0NPTU1BX2luX2luaXRpYWxfYnVmZmVyX2NvbnRlbnRzOTQzMV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19DT01NQV9pbl9pbml0aWFsX2J1ZmZlcl9jb250ZW50czk0MzEJPSB7IEZPTExPV19DT01NQV9pbl9pbml0aWFsX2J1ZmZlcl9jb250ZW50czk0MzFfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX2luaXRpYWxfYnVmZmVyX2NvbnRlbnRzOTQzNSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX2luaXRpYWxfYnVmZmVyX2NvbnRlbnRzOTQzNV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDgwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MTAwMDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5faW5pdGlhbF9idWZmZXJfY29udGVudHM5NDM1CT0geyBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX2luaXRpYWxfYnVmZmVyX2NvbnRlbnRzOTQzNV9iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19SQlJBQ0tFVF9pbl9pbml0aWFsX2J1ZmZlcl9jb250ZW50czk0NDYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1JCUkFDS0VUX2luX2luaXRpYWxfYnVmZmVyX2NvbnRlbnRzOTQ0Nl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19SQlJBQ0tFVF9pbl9pbml0aWFsX2J1ZmZlcl9jb250ZW50czk0NDYJPSB7IEZPTExPV19SQlJBQ0tFVF9pbl9pbml0aWFsX2J1ZmZlcl9jb250ZW50czk0NDZfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjUzX2luX2RlY2xfY2hhbm5lbDk0NjUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzI1M19pbl9kZWNsX2NoYW5uZWw5NDY1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAyMDQwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMTAwMDAwMjAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzI1M19pbl9kZWNsX2NoYW5uZWw5NDY1CT0geyBGT0xMT1dfMjUzX2luX2RlY2xfY2hhbm5lbDk0NjVfYml0cywgNgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVjbF9jaGFubmVsX3BvcnRfaW5fZGVjbF9jaGFubmVsOTQ2OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVjbF9jaGFubmVsX3BvcnRfaW5fZGVjbF9jaGFubmVsOTQ2OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWNsX2NoYW5uZWxfcG9ydF9pbl9kZWNsX2NoYW5uZWw5NDY4CT0geyBGT0xMT1dfZGVjbF9jaGFubmVsX3BvcnRfaW5fZGVjbF9jaGFubmVsOTQ2OF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MVF9faW5fZGVjbF9jaGFubmVsX3BvcnQ5NDkxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MVF9faW5fZGVjbF9jaGFubmVsX3BvcnQ5NDkxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMzAxMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwODAwMDAwMDEyMjAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDI0MDA5MDAwMDAwMzcwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDEwMDgwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xUX19pbl9kZWNsX2NoYW5uZWxfcG9ydDk0OTEJPSB7IEZPTExPV19MVF9faW5fZGVjbF9jaGFubmVsX3BvcnQ5NDkxX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2NvbV9wcm90b2NvbF9pbl9kZWNsX2NoYW5uZWxfcG9ydDk0OTggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2NvbV9wcm90b2NvbF9pbl9kZWNsX2NoYW5uZWxfcG9ydDk0OThfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDA4MDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfY29tX3Byb3RvY29sX2luX2RlY2xfY2hhbm5lbF9wb3J0OTQ5OAk9IHsgRk9MTE9XX2NvbV9wcm90b2NvbF9pbl9kZWNsX2NoYW5uZWxfcG9ydDk0OThfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfQ09NTUFfaW5fZGVjbF9jaGFubmVsX3BvcnQ5NTA4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19DT01NQV9pbl9kZWNsX2NoYW5uZWxfcG9ydDk1MDhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMDEwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMTApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwODAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQ09NTUFfaW5fZGVjbF9jaGFubmVsX3BvcnQ5NTA4CT0geyBGT0xMT1dfQ09NTUFfaW5fZGVjbF9jaGFubmVsX3BvcnQ5NTA4X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2NvbV9jYXN0X2luX2RlY2xfY2hhbm5lbF9wb3J0OTUxMCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfY29tX2Nhc3RfaW5fZGVjbF9jaGFubmVsX3BvcnQ5NTEwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2NvbV9jYXN0X2luX2RlY2xfY2hhbm5lbF9wb3J0OTUxMAk9IHsgRk9MTE9XX2NvbV9jYXN0X2luX2RlY2xfY2hhbm5lbF9wb3J0OTUxMF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19HVF9pbl9kZWNsX2NoYW5uZWxfcG9ydDk1MjEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0dUX2luX2RlY2xfY2hhbm5lbF9wb3J0OTUyMV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMjA0MDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDEwMDAwMDIwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19HVF9pbl9kZWNsX2NoYW5uZWxfcG9ydDk1MjEJPSB7IEZPTExPV19HVF9pbl9kZWNsX2NoYW5uZWxfcG9ydDk1MjFfYml0cywgNgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dF9pbl9kZWNsX2NoYW5uZWxfcG9ydDk1MzUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX21vZGlmaWVyX3NldF9kaXJlY3Rpb25fc3RyaWN0X3RleHRfaW5fZGVjbF9jaGFubmVsX3BvcnQ5NTM1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX21vZGlmaWVyX3NldF9kaXJlY3Rpb25fc3RyaWN0X3RleHRfaW5fZGVjbF9jaGFubmVsX3BvcnQ5NTM1CT0geyBGT0xMT1dfbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dF9pbl9kZWNsX2NoYW5uZWxfcG9ydDk1MzVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfSURfaW5fZGVjbF9jaGFubmVsX3BvcnQ5NTQ3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19JRF9pbl9kZWNsX2NoYW5uZWxfcG9ydDk1NDdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDEpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfSURfaW5fZGVjbF9jaGFubmVsX3BvcnQ5NTQ3CT0geyBGT0xMT1dfSURfaW5fZGVjbF9jaGFubmVsX3BvcnQ5NTQ3X2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xDVVJMWV9pbl9kZWNsX2NoYW5uZWxfcG9ydDk1NTYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xDVVJMWV9pbl9kZWNsX2NoYW5uZWxfcG9ydDk1NTZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDEwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDUwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDIwNDgwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwNDAxMDAwMDEyMDgwMDEpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTENVUkxZX2luX2RlY2xfY2hhbm5lbF9wb3J0OTU1Ngk9IHsgRk9MTE9XX0xDVVJMWV9pbl9kZWNsX2NoYW5uZWxfcG9ydDk1NTZfYml0cywgNgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfbW9kaWZpZXJfZGlyZWN0aW9uX2luX2RlY2xfY2hhbm5lbF9wb3J0OTU3MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfbW9kaWZpZXJfZGlyZWN0aW9uX2luX2RlY2xfY2hhbm5lbF9wb3J0OTU3MF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19tb2RpZmllcl9kaXJlY3Rpb25faW5fZGVjbF9jaGFubmVsX3BvcnQ5NTcwCT0geyBGT0xMT1dfbW9kaWZpZXJfZGlyZWN0aW9uX2luX2RlY2xfY2hhbm5lbF9wb3J0OTU3MF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fZGVjbF9jaGFubmVsX3BvcnQ5NTc1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fZGVjbF9jaGFubmVsX3BvcnQ5NTc1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9kZWNsX2NoYW5uZWxfcG9ydDk1NzUJPSB7IEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fZGVjbF9jaGFubmVsX3BvcnQ5NTc1X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1NFTUlfaW5fZGVjbF9jaGFubmVsX3BvcnQ5NTc3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19TRU1JX2luX2RlY2xfY2hhbm5lbF9wb3J0OTU3N19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCksIEFOVExSM19VSU5UNjRfTElUKDB4MjAwMDAwMDAwMDAwMTAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwNTAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMjA0ODAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDA0MDEwMDAwMTIwODAwMSkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19TRU1JX2luX2RlY2xfY2hhbm5lbF9wb3J0OTU3Nwk9IHsgRk9MTE9XX1NFTUlfaW5fZGVjbF9jaGFubmVsX3BvcnQ5NTc3X2JpdHMsIDYJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2RlY2xfcG9ydF9pbl9kZWNsX2NoYW5uZWxfcG9ydDk1OTIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlY2xfcG9ydF9pbl9kZWNsX2NoYW5uZWxfcG9ydDk1OTJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDIwMDAwMDAwMDAwMDEwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDUwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDIwNDgwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwNDAxMDAwMDEyMDgwMDEpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVjbF9wb3J0X2luX2RlY2xfY2hhbm5lbF9wb3J0OTU5Mgk9IHsgRk9MTE9XX2RlY2xfcG9ydF9pbl9kZWNsX2NoYW5uZWxfcG9ydDk1OTJfYml0cywgNgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVjbF9zaWduYWxfaW5fZGVjbF9jaGFubmVsX3BvcnQ5NjA5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWNsX3NpZ25hbF9pbl9kZWNsX2NoYW5uZWxfcG9ydDk2MDlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDIwMDAwMDAwMDAwMDEwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDUwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDIwNDgwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwNDAxMDAwMDEyMDgwMDEpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVjbF9zaWduYWxfaW5fZGVjbF9jaGFubmVsX3BvcnQ5NjA5CT0geyBGT0xMT1dfZGVjbF9zaWduYWxfaW5fZGVjbF9jaGFubmVsX3BvcnQ5NjA5X2JpdHMsIDYJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1JDVVJMWV9pbl9kZWNsX2NoYW5uZWxfcG9ydDk2MjEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1JDVVJMWV9pbl9kZWNsX2NoYW5uZWxfcG9ydDk2MjFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUkNVUkxZX2luX2RlY2xfY2hhbm5lbF9wb3J0OTYyMQk9IHsgRk9MTE9XX1JDVVJMWV9pbl9kZWNsX2NoYW5uZWxfcG9ydDk2MjFfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfdHlwZV92YXJfaW5fZGVjbF9jaGFubmVsX3Zhcjk2NDIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3R5cGVfdmFyX2luX2RlY2xfY2hhbm5lbF92YXI5NjQyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3R5cGVfdmFyX2luX2RlY2xfY2hhbm5lbF92YXI5NjQyCT0geyBGT0xMT1dfdHlwZV92YXJfaW5fZGVjbF9jaGFubmVsX3Zhcjk2NDJfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfSURfaW5fZGVjbF9jaGFubmVsX3Zhcjk2NDcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0lEX2luX2RlY2xfY2hhbm5lbF92YXI5NjQ3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDEwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0lEX2luX2RlY2xfY2hhbm5lbF92YXI5NjQ3CT0geyBGT0xMT1dfSURfaW5fZGVjbF9jaGFubmVsX3Zhcjk2NDdfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfaW5pdGlhbF92YWx1ZV9pbl9kZWNsX2NoYW5uZWxfdmFyOTY2MSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfaW5pdGlhbF92YWx1ZV9pbl9kZWNsX2NoYW5uZWxfdmFyOTY2MV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19pbml0aWFsX3ZhbHVlX2luX2RlY2xfY2hhbm5lbF92YXI5NjYxCT0geyBGT0xMT1dfaW5pdGlhbF92YWx1ZV9pbl9kZWNsX2NoYW5uZWxfdmFyOTY2MV9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TRU1JX2luX2RlY2xfY2hhbm5lbF92YXI5Njc0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19TRU1JX2luX2RlY2xfY2hhbm5lbF92YXI5Njc0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1NFTUlfaW5fZGVjbF9jaGFubmVsX3Zhcjk2NzQJPSB7IEZPTExPV19TRU1JX2luX2RlY2xfY2hhbm5lbF92YXI5Njc0X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX29uX3dyaXRlX3Zhcl9yb3V0aW5lX2RlZl9pbl9kZWNsX2NoYW5uZWxfdmFyOTY4MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfb25fd3JpdGVfdmFyX3JvdXRpbmVfZGVmX2luX2RlY2xfY2hhbm5lbF92YXI5NjgwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX29uX3dyaXRlX3Zhcl9yb3V0aW5lX2RlZl9pbl9kZWNsX2NoYW5uZWxfdmFyOTY4MAk9IHsgRk9MTE9XX29uX3dyaXRlX3Zhcl9yb3V0aW5lX2RlZl9pbl9kZWNsX2NoYW5uZWxfdmFyOTY4MF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MQ1VSTFlfaW5fZGVjbF9jaGFubmVsX3Zhcjk2ODkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xDVVJMWV9pbl9kZWNsX2NoYW5uZWxfdmFyOTY4OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4QzI2NjAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MzhFMDAwMDAwQTAwQzEyOCksIEFOVExSM19VSU5UNjRfTElUKDB4MDA2NDAxNjAwNzAwMjI2MSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAxM0E3ODEwOCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MQ1VSTFlfaW5fZGVjbF9jaGFubmVsX3Zhcjk2ODkJPSB7IEZPTExPV19MQ1VSTFlfaW5fZGVjbF9jaGFubmVsX3Zhcjk2ODlfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfdHlwZV92YXJfaW5fZGVjbF9jaGFubmVsX3Zhcjk2OTggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3R5cGVfdmFyX2luX2RlY2xfY2hhbm5lbF92YXI5Njk4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3R5cGVfdmFyX2luX2RlY2xfY2hhbm5lbF92YXI5Njk4CT0geyBGT0xMT1dfdHlwZV92YXJfaW5fZGVjbF9jaGFubmVsX3Zhcjk2OThfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfSURfaW5fZGVjbF9jaGFubmVsX3Zhcjk3MDMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0lEX2luX2RlY2xfY2hhbm5lbF92YXI5NzAzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDEwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0lEX2luX2RlY2xfY2hhbm5lbF92YXI5NzAzCT0geyBGT0xMT1dfSURfaW5fZGVjbF9jaGFubmVsX3Zhcjk3MDNfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfaW5pdGlhbF92YWx1ZV9pbl9kZWNsX2NoYW5uZWxfdmFyOTcxNyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfaW5pdGlhbF92YWx1ZV9pbl9kZWNsX2NoYW5uZWxfdmFyOTcxN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19pbml0aWFsX3ZhbHVlX2luX2RlY2xfY2hhbm5lbF92YXI5NzE3CT0geyBGT0xMT1dfaW5pdGlhbF92YWx1ZV9pbl9kZWNsX2NoYW5uZWxfdmFyOTcxN19iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TRU1JX2luX2RlY2xfY2hhbm5lbF92YXI5NzMwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19TRU1JX2luX2RlY2xfY2hhbm5lbF92YXI5NzMwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHhDMjY2MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzOEUwMDAwMDBBMDBDMTI4KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDY0MDE2MDA3MDAyMjYxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDEzQTc4MTA4KSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1NFTUlfaW5fZGVjbF9jaGFubmVsX3Zhcjk3MzAJPSB7IEZPTExPV19TRU1JX2luX2RlY2xfY2hhbm5lbF92YXI5NzMwX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX29uX3dyaXRlX3Zhcl9yb3V0aW5lX2RlZl9pbl9kZWNsX2NoYW5uZWxfdmFyOTczNiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfb25fd3JpdGVfdmFyX3JvdXRpbmVfZGVmX2luX2RlY2xfY2hhbm5lbF92YXI5NzM2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHhDMjY2MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzOEUwMDAwMDBBMDBDMTI4KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDY0MDE2MDA3MDAyMjYxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDEzQTc4MTA4KSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX29uX3dyaXRlX3Zhcl9yb3V0aW5lX2RlZl9pbl9kZWNsX2NoYW5uZWxfdmFyOTczNgk9IHsgRk9MTE9XX29uX3dyaXRlX3Zhcl9yb3V0aW5lX2RlZl9pbl9kZWNsX2NoYW5uZWxfdmFyOTczNl9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19SQ1VSTFlfaW5fZGVjbF9jaGFubmVsX3Zhcjk3NDggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1JDVVJMWV9pbl9kZWNsX2NoYW5uZWxfdmFyOTc0OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19SQ1VSTFlfaW5fZGVjbF9jaGFubmVsX3Zhcjk3NDgJPSB7IEZPTExPV19SQ1VSTFlfaW5fZGVjbF9jaGFubmVsX3Zhcjk3NDhfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfNDExX2luX2RlY2xfdmFyaWFibGU5NzY5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV180MTFfaW5fZGVjbF92YXJpYWJsZTk3NjlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweEMyNjYwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDM4RTAwMDAwMEEwMEMxMjgpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwNjQwMTYwMDcwMDIyNjEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMTNBNzgxMDgpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfNDExX2luX2RlY2xfdmFyaWFibGU5NzY5CT0geyBGT0xMT1dfNDExX2luX2RlY2xfdmFyaWFibGU5NzY5X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzQxMF9pbl9kZWNsX3ZhcmlhYmxlOTc4MyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfNDEwX2luX2RlY2xfdmFyaWFibGU5NzgzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHhDMjY2MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzOEUwMDAwMDBBMDBDMTI4KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDY0MDE2MDA3MDAyMjYxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDEzQTc4MTA4KSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzQxMF9pbl9kZWNsX3ZhcmlhYmxlOTc4Mwk9IHsgRk9MTE9XXzQxMF9pbl9kZWNsX3ZhcmlhYmxlOTc4M19iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yNjJfaW5fZGVjbF92YXJpYWJsZTk3OTkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzI2Ml9pbl9kZWNsX3ZhcmlhYmxlOTc5OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4QzI2NjAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4NzhFMDAwMDAwQTAwQzE2OCksIEFOVExSM19VSU5UNjRfTElUKDB4MDA2NDAxNjAwNzAwMjI2MSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAxQkE3ODEwOCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yNjJfaW5fZGVjbF92YXJpYWJsZTk3OTkJPSB7IEZPTExPV18yNjJfaW5fZGVjbF92YXJpYWJsZTk3OTlfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzE4X2luX2RlY2xfdmFyaWFibGU5ODExICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zMThfaW5fZGVjbF92YXJpYWJsZTk4MTFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweEMyNjYwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDc4RTAwMDAwMEEwMEMxNjgpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwNjQwMTYwMDcwMDIyNjEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMUJBNzgxMDgpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzE4X2luX2RlY2xfdmFyaWFibGU5ODExCT0geyBGT0xMT1dfMzE4X2luX2RlY2xfdmFyaWFibGU5ODExX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzQxMV9pbl9kZWNsX3ZhcmlhYmxlOTgzMSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfNDExX2luX2RlY2xfdmFyaWFibGU5ODMxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHhDMjY2MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzOEUwMDAwMDBBMDBDMTI4KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDY0MDE2MDA3MDAyMjYxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDEzQTc4MTA4KSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzQxMV9pbl9kZWNsX3ZhcmlhYmxlOTgzMQk9IHsgRk9MTE9XXzQxMV9pbl9kZWNsX3ZhcmlhYmxlOTgzMV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWNsX3ZhcmlhYmxlX2ltcGxfaW5fZGVjbF92YXJpYWJsZTk4NDQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlY2xfdmFyaWFibGVfaW1wbF9pbl9kZWNsX3ZhcmlhYmxlOTg0NF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWNsX3ZhcmlhYmxlX2ltcGxfaW5fZGVjbF92YXJpYWJsZTk4NDQJPSB7IEZPTExPV19kZWNsX3ZhcmlhYmxlX2ltcGxfaW5fZGVjbF92YXJpYWJsZTk4NDRfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVjbF92YXJpYWJsZV90aW1lX2Nsb2NrX2ltcGxfaW5fZGVjbF92YXJpYWJsZTk4NTEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlY2xfdmFyaWFibGVfdGltZV9jbG9ja19pbXBsX2luX2RlY2xfdmFyaWFibGU5ODUxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlY2xfdmFyaWFibGVfdGltZV9jbG9ja19pbXBsX2luX2RlY2xfdmFyaWFibGU5ODUxCT0geyBGT0xMT1dfZGVjbF92YXJpYWJsZV90aW1lX2Nsb2NrX2ltcGxfaW5fZGVjbF92YXJpYWJsZTk4NTFfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfdGltZV9jbG9ja190eXBlX2luX2RlY2xfdmFyaWFibGVfdGltZV9jbG9ja19pbXBsOTg3MyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfdGltZV9jbG9ja190eXBlX2luX2RlY2xfdmFyaWFibGVfdGltZV9jbG9ja19pbXBsOTg3M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV190aW1lX2Nsb2NrX3R5cGVfaW5fZGVjbF92YXJpYWJsZV90aW1lX2Nsb2NrX2ltcGw5ODczCT0geyBGT0xMT1dfdGltZV9jbG9ja190eXBlX2luX2RlY2xfdmFyaWFibGVfdGltZV9jbG9ja19pbXBsOTg3M19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWNsX3R5cGVkX3ZhcmlhYmxlX2F0b21faW1wbF9pbl9kZWNsX3ZhcmlhYmxlX3RpbWVfY2xvY2tfaW1wbDk4NzggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlY2xfdHlwZWRfdmFyaWFibGVfYXRvbV9pbXBsX2luX2RlY2xfdmFyaWFibGVfdGltZV9jbG9ja19pbXBsOTg3OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWNsX3R5cGVkX3ZhcmlhYmxlX2F0b21faW1wbF9pbl9kZWNsX3ZhcmlhYmxlX3RpbWVfY2xvY2tfaW1wbDk4NzgJPSB7IEZPTExPV19kZWNsX3R5cGVkX3ZhcmlhYmxlX2F0b21faW1wbF9pbl9kZWNsX3ZhcmlhYmxlX3RpbWVfY2xvY2tfaW1wbDk4NzhfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVjbF92YXJpYWJsZV9hdG9tX2ltcGxfaW5fZGVjbF92YXJpYWJsZV9pbXBsOTg5NCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVjbF92YXJpYWJsZV9hdG9tX2ltcGxfaW5fZGVjbF92YXJpYWJsZV9pbXBsOTg5NF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWNsX3ZhcmlhYmxlX2F0b21faW1wbF9pbl9kZWNsX3ZhcmlhYmxlX2ltcGw5ODk0CT0geyBGT0xMT1dfZGVjbF92YXJpYWJsZV9hdG9tX2ltcGxfaW5fZGVjbF92YXJpYWJsZV9pbXBsOTg5NF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MQ1VSTFlfaW5fZGVjbF92YXJpYWJsZV9pbXBsOTkwMSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTENVUkxZX2luX2RlY2xfdmFyaWFibGVfaW1wbDk5MDFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweEMyNjYwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDM4RTAwMDAwMEEwMEMxMjgpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwNjQwMTYwMDcwMDIyNjEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMTNBNzgxMDgpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTENVUkxZX2luX2RlY2xfdmFyaWFibGVfaW1wbDk5MDEJPSB7IEZPTExPV19MQ1VSTFlfaW5fZGVjbF92YXJpYWJsZV9pbXBsOTkwMV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWNsX3ZhcmlhYmxlX2F0b21faW1wbF9pbl9kZWNsX3ZhcmlhYmxlX2ltcGw5OTA4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWNsX3ZhcmlhYmxlX2F0b21faW1wbF9pbl9kZWNsX3ZhcmlhYmxlX2ltcGw5OTA4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHhDMjY2MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzOEUwMDAwMDBBMDBDMTI4KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDY0MDE2MDA3MDAyMjYxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDEzQTc4MTA4KSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlY2xfdmFyaWFibGVfYXRvbV9pbXBsX2luX2RlY2xfdmFyaWFibGVfaW1wbDk5MDgJPSB7IEZPTExPV19kZWNsX3ZhcmlhYmxlX2F0b21faW1wbF9pbl9kZWNsX3ZhcmlhYmxlX2ltcGw5OTA4X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1JDVVJMWV9pbl9kZWNsX3ZhcmlhYmxlX2ltcGw5OTE3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19SQ1VSTFlfaW5fZGVjbF92YXJpYWJsZV9pbXBsOTkxN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19SQ1VSTFlfaW5fZGVjbF92YXJpYWJsZV9pbXBsOTkxNwk9IHsgRk9MTE9XX1JDVVJMWV9pbl9kZWNsX3ZhcmlhYmxlX2ltcGw5OTE3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3R5cGVfdmFyX2luX2RlY2xfdmFyaWFibGVfYXRvbV9pbXBsOTkzMyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfdHlwZV92YXJfaW5fZGVjbF92YXJpYWJsZV9hdG9tX2ltcGw5OTMzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3R5cGVfdmFyX2luX2RlY2xfdmFyaWFibGVfYXRvbV9pbXBsOTkzMwk9IHsgRk9MTE9XX3R5cGVfdmFyX2luX2RlY2xfdmFyaWFibGVfYXRvbV9pbXBsOTkzM19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWNsX3R5cGVkX3ZhcmlhYmxlX2F0b21faW1wbF9pbl9kZWNsX3ZhcmlhYmxlX2F0b21faW1wbDk5MzggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlY2xfdHlwZWRfdmFyaWFibGVfYXRvbV9pbXBsX2luX2RlY2xfdmFyaWFibGVfYXRvbV9pbXBsOTkzOF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWNsX3R5cGVkX3ZhcmlhYmxlX2F0b21faW1wbF9pbl9kZWNsX3ZhcmlhYmxlX2F0b21faW1wbDk5MzgJPSB7IEZPTExPV19kZWNsX3R5cGVkX3ZhcmlhYmxlX2F0b21faW1wbF9pbl9kZWNsX3ZhcmlhYmxlX2F0b21faW1wbDk5MzhfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfSURfaW5fZGVjbF90eXBlZF92YXJpYWJsZV9hdG9tX2ltcGw5OTU5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19JRF9pbl9kZWNsX3R5cGVkX3ZhcmlhYmxlX2F0b21faW1wbDk5NTlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMTApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfSURfaW5fZGVjbF90eXBlZF92YXJpYWJsZV9hdG9tX2ltcGw5OTU5CT0geyBGT0xMT1dfSURfaW5fZGVjbF90eXBlZF92YXJpYWJsZV9hdG9tX2ltcGw5OTU5X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1N0cmluZ0xpdGVyYWxfaW5fZGVjbF90eXBlZF92YXJpYWJsZV9hdG9tX2ltcGw5OTcyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19TdHJpbmdMaXRlcmFsX2luX2RlY2xfdHlwZWRfdmFyaWFibGVfYXRvbV9pbXBsOTk3Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAxMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19TdHJpbmdMaXRlcmFsX2luX2RlY2xfdHlwZWRfdmFyaWFibGVfYXRvbV9pbXBsOTk3Mgk9IHsgRk9MTE9XX1N0cmluZ0xpdGVyYWxfaW5fZGVjbF90eXBlZF92YXJpYWJsZV9hdG9tX2ltcGw5OTcyX2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2luaXRpYWxfdmFsdWVfaW5fZGVjbF90eXBlZF92YXJpYWJsZV9hdG9tX2ltcGw5OTkzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19pbml0aWFsX3ZhbHVlX2luX2RlY2xfdHlwZWRfdmFyaWFibGVfYXRvbV9pbXBsOTk5M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19pbml0aWFsX3ZhbHVlX2luX2RlY2xfdHlwZWRfdmFyaWFibGVfYXRvbV9pbXBsOTk5Mwk9IHsgRk9MTE9XX2luaXRpYWxfdmFsdWVfaW5fZGVjbF90eXBlZF92YXJpYWJsZV9hdG9tX2ltcGw5OTkzX2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1NFTUlfaW5fZGVjbF90eXBlZF92YXJpYWJsZV9hdG9tX2ltcGwxMDAwNiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU0VNSV9pbl9kZWNsX3R5cGVkX3ZhcmlhYmxlX2F0b21faW1wbDEwMDA2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1NFTUlfaW5fZGVjbF90eXBlZF92YXJpYWJsZV9hdG9tX2ltcGwxMDAwNgk9IHsgRk9MTE9XX1NFTUlfaW5fZGVjbF90eXBlZF92YXJpYWJsZV9hdG9tX2ltcGwxMDAwNl9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19vbl93cml0ZV92YXJfcm91dGluZV9kZWZfaW5fZGVjbF90eXBlZF92YXJpYWJsZV9hdG9tX2ltcGwxMDAxMiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfb25fd3JpdGVfdmFyX3JvdXRpbmVfZGVmX2luX2RlY2xfdHlwZWRfdmFyaWFibGVfYXRvbV9pbXBsMTAwMTJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfb25fd3JpdGVfdmFyX3JvdXRpbmVfZGVmX2luX2RlY2xfdHlwZWRfdmFyaWFibGVfYXRvbV9pbXBsMTAwMTIJPSB7IEZPTExPV19vbl93cml0ZV92YXJfcm91dGluZV9kZWZfaW5fZGVjbF90eXBlZF92YXJpYWJsZV9hdG9tX2ltcGwxMDAxMl9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19BU1NJR05faW5faW5pdGlhbF92YWx1ZTEwMDMxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19BU1NJR05faW5faW5pdGlhbF92YWx1ZTEwMDMxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0FTU0lHTl9pbl9pbml0aWFsX3ZhbHVlMTAwMzEJPSB7IEZPTExPV19BU1NJR05faW5faW5pdGlhbF92YWx1ZTEwMDMxX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5faW5pdGlhbF92YWx1ZTEwMDM2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX2luaXRpYWxfdmFsdWUxMDAzNl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX2luaXRpYWxfdmFsdWUxMDAzNgk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5faW5pdGlhbF92YWx1ZTEwMDM2X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xQQVJFTl9pbl9pbml0aWFsX3ZhbHVlMTAwNTIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xQQVJFTl9pbl9pbml0aWFsX3ZhbHVlMTAwNTJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTFBBUkVOX2luX2luaXRpYWxfdmFsdWUxMDA1Mgk9IHsgRk9MTE9XX0xQQVJFTl9pbl9pbml0aWFsX3ZhbHVlMTAwNTJfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9pbml0aWFsX3ZhbHVlMTAwNTcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5faW5pdGlhbF92YWx1ZTEwMDU3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5faW5pdGlhbF92YWx1ZTEwMDU3CT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9pbml0aWFsX3ZhbHVlMTAwNTdfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfUlBBUkVOX2luX2luaXRpYWxfdmFsdWUxMDA2MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfUlBBUkVOX2luX2luaXRpYWxfdmFsdWUxMDA2MF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19SUEFSRU5faW5faW5pdGlhbF92YWx1ZTEwMDYwCT0geyBGT0xMT1dfUlBBUkVOX2luX2luaXRpYWxfdmFsdWUxMDA2MF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19iYXNlX3R5cGVfdmFyX2luX3R5cGVfdmFyMTAwODEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2Jhc2VfdHlwZV92YXJfaW5fdHlwZV92YXIxMDA4MV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MTAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19iYXNlX3R5cGVfdmFyX2luX3R5cGVfdmFyMTAwODEJPSB7IEZPTExPV19iYXNlX3R5cGVfdmFyX2luX3R5cGVfdmFyMTAwODFfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX3R5cGVfYXJyYXlfaW5fdHlwZV92YXIxMDEwOSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX3R5cGVfYXJyYXlfaW5fdHlwZV92YXIxMDEwOV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWZfdHlwZV9hcnJheV9pbl90eXBlX3ZhcjEwMTA5CT0geyBGT0xMT1dfZGVmX3R5cGVfYXJyYXlfaW5fdHlwZV92YXIxMDEwOV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfdHlwZV9jb250YWluZXJfaW5fdHlwZV92YXIxMDEyNCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX3R5cGVfY29udGFpbmVyX2luX3R5cGVfdmFyMTAxMjRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX3R5cGVfY29udGFpbmVyX2luX3R5cGVfdmFyMTAxMjQJPSB7IEZPTExPV19kZWZfdHlwZV9jb250YWluZXJfaW5fdHlwZV92YXIxMDEyNF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfdHlwZV9pbnRlcnZhbF9pbl90eXBlX3ZhcjEwMTQxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWZfdHlwZV9pbnRlcnZhbF9pbl90eXBlX3ZhcjEwMTQxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl90eXBlX2ludGVydmFsX2luX3R5cGVfdmFyMTAxNDEJPSB7IEZPTExPV19kZWZfdHlwZV9pbnRlcnZhbF9pbl90eXBlX3ZhcjEwMTQxX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2RlZl90eXBlX2FycmF5X3NpemVfaW5fZGVmX3R5cGVfYXJyYXkxMDE3OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX3R5cGVfYXJyYXlfc2l6ZV9pbl9kZWZfdHlwZV9hcnJheTEwMTc4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgxMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl90eXBlX2FycmF5X3NpemVfaW5fZGVmX3R5cGVfYXJyYXkxMDE3OAk9IHsgRk9MTE9XX2RlZl90eXBlX2FycmF5X3NpemVfaW5fZGVmX3R5cGVfYXJyYXkxMDE3OF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MQlJBQ0tFVF9pbl9kZWZfdHlwZV9hcnJheV9zaXplMTAyMDIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xCUkFDS0VUX2luX2RlZl90eXBlX2FycmF5X3NpemUxMDIwMl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDA4NDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MQlJBQ0tFVF9pbl9kZWZfdHlwZV9hcnJheV9zaXplMTAyMDIJPSB7IEZPTExPV19MQlJBQ0tFVF9pbl9kZWZfdHlwZV9hcnJheV9zaXplMTAyMDJfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfSW50ZWdlckxpdGVyYWxfaW5fZGVmX3R5cGVfYXJyYXlfc2l6ZTEwMjEzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19JbnRlZ2VyTGl0ZXJhbF9pbl9kZWZfdHlwZV9hcnJheV9zaXplMTAyMTNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDEwMDAwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfSW50ZWdlckxpdGVyYWxfaW5fZGVmX3R5cGVfYXJyYXlfc2l6ZTEwMjEzCT0geyBGT0xMT1dfSW50ZWdlckxpdGVyYWxfaW5fZGVmX3R5cGVfYXJyYXlfc2l6ZTEwMjEzX2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9kZWZfdHlwZV9hcnJheV9zaXplMTAyMjggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9kZWZfdHlwZV9hcnJheV9zaXplMTAyMjhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDEwMDAwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX2RlZl90eXBlX2FycmF5X3NpemUxMDIyOAk9IHsgRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9kZWZfdHlwZV9hcnJheV9zaXplMTAyMjhfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfUkJSQUNLRVRfaW5fZGVmX3R5cGVfYXJyYXlfc2l6ZTEwMjQxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19SQlJBQ0tFVF9pbl9kZWZfdHlwZV9hcnJheV9zaXplMTAyNDFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUkJSQUNLRVRfaW5fZGVmX3R5cGVfYXJyYXlfc2l6ZTEwMjQxCT0geyBGT0xMT1dfUkJSQUNLRVRfaW5fZGVmX3R5cGVfYXJyYXlfc2l6ZTEwMjQxX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3NwZWNpZmllcl9idWZmZXJfaW5fZGVmX3R5cGVfY29udGFpbmVyMTAyNjYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NwZWNpZmllcl9idWZmZXJfaW5fZGVmX3R5cGVfY29udGFpbmVyMTAyNjZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc3BlY2lmaWVyX2J1ZmZlcl9pbl9kZWZfdHlwZV9jb250YWluZXIxMDI2Ngk9IHsgRk9MTE9XX3NwZWNpZmllcl9idWZmZXJfaW5fZGVmX3R5cGVfY29udGFpbmVyMTAyNjZfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTFRfX2luX2RlZl90eXBlX2NvbnRhaW5lcjEwMjc0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MVF9faW5fZGVmX3R5cGVfY29udGFpbmVyMTAyNzRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwODQwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweEMyNjQwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDIwNjAwMDAwMDgwMEMxMjgpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwQzAwMTYwMDcwMDIwMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDNBNzgxMDgpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTFRfX2luX2RlZl90eXBlX2NvbnRhaW5lcjEwMjc0CT0geyBGT0xMT1dfTFRfX2luX2RlZl90eXBlX2NvbnRhaW5lcjEwMjc0X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2Jhc2VfdHlwZV92YXJfaW5fZGVmX3R5cGVfY29udGFpbmVyMTAyODcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2Jhc2VfdHlwZV92YXJfaW5fZGVmX3R5cGVfY29udGFpbmVyMTAyODdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDA4MDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfYmFzZV90eXBlX3Zhcl9pbl9kZWZfdHlwZV9jb250YWluZXIxMDI4Nwk9IHsgRk9MTE9XX2Jhc2VfdHlwZV92YXJfaW5fZGVmX3R5cGVfY29udGFpbmVyMTAyODdfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfQ09NTUFfaW5fZGVmX3R5cGVfY29udGFpbmVyMTAzMDMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0NPTU1BX2luX2RlZl90eXBlX2NvbnRhaW5lcjEwMzAzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDg0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMjAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDgwMDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0NPTU1BX2luX2RlZl90eXBlX2NvbnRhaW5lcjEwMzAzCT0geyBGT0xMT1dfQ09NTUFfaW5fZGVmX3R5cGVfY29udGFpbmVyMTAzMDNfYml0cywgNgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzc1X2luX2RlZl90eXBlX2NvbnRhaW5lcjEwMzA4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zNzVfaW5fZGVmX3R5cGVfY29udGFpbmVyMTAzMDhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwODQwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAyMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzc1X2luX2RlZl90eXBlX2NvbnRhaW5lcjEwMzA4CT0geyBGT0xMT1dfMzc1X2luX2RlZl90eXBlX2NvbnRhaW5lcjEwMzA4X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fZGVmX3R5cGVfY29udGFpbmVyMTAzMjggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fZGVmX3R5cGVfY29udGFpbmVyMTAzMjhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfaW50ZWdlcl9jb25zdGFudF9pbl9kZWZfdHlwZV9jb250YWluZXIxMDMyOAk9IHsgRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fZGVmX3R5cGVfY29udGFpbmVyMTAzMjhfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfU1RBUl9pbl9kZWZfdHlwZV9jb250YWluZXIxMDM0NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU1RBUl9pbl9kZWZfdHlwZV9jb250YWluZXIxMDM0NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19TVEFSX2luX2RlZl90eXBlX2NvbnRhaW5lcjEwMzQ1CT0geyBGT0xMT1dfU1RBUl9pbl9kZWZfdHlwZV9jb250YWluZXIxMDM0NV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zNzVfaW5fZGVmX3R5cGVfY29udGFpbmVyMTA0MDcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzM3NV9pbl9kZWZfdHlwZV9jb250YWluZXIxMDQwN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDA4NDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zNzVfaW5fZGVmX3R5cGVfY29udGFpbmVyMTA0MDcJPSB7IEZPTExPV18zNzVfaW5fZGVmX3R5cGVfY29udGFpbmVyMTA0MDdfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfaW50ZWdlcl9jb25zdGFudF9pbl9kZWZfdHlwZV9jb250YWluZXIxMDQxNCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfaW50ZWdlcl9jb25zdGFudF9pbl9kZWZfdHlwZV9jb250YWluZXIxMDQxNF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19pbnRlZ2VyX2NvbnN0YW50X2luX2RlZl90eXBlX2NvbnRhaW5lcjEwNDE0CT0geyBGT0xMT1dfaW50ZWdlcl9jb25zdGFudF9pbl9kZWZfdHlwZV9jb250YWluZXIxMDQxNF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19HVF9pbl9kZWZfdHlwZV9jb250YWluZXIxMDQzMSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfR1RfaW5fZGVmX3R5cGVfY29udGFpbmVyMTA0MzFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfR1RfaW5fZGVmX3R5cGVfY29udGFpbmVyMTA0MzEJPSB7IEZPTExPV19HVF9pbl9kZWZfdHlwZV9jb250YWluZXIxMDQzMV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yNDFfaW5fc3BlY2lmaWVyX2J1ZmZlcjEwNDU2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yNDFfaW5fc3BlY2lmaWVyX2J1ZmZlcjEwNDU2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzI0MV9pbl9zcGVjaWZpZXJfYnVmZmVyMTA0NTYJPSB7IEZPTExPV18yNDFfaW5fc3BlY2lmaWVyX2J1ZmZlcjEwNDU2X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzQxMl9pbl9zcGVjaWZpZXJfYnVmZmVyMTA0NjcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzQxMl9pbl9zcGVjaWZpZXJfYnVmZmVyMTA0NjdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfNDEyX2luX3NwZWNpZmllcl9idWZmZXIxMDQ2Nwk9IHsgRk9MTE9XXzQxMl9pbl9zcGVjaWZpZXJfYnVmZmVyMTA0NjdfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzcwX2luX3NwZWNpZmllcl9idWZmZXIxMDQ3NyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzcwX2luX3NwZWNpZmllcl9idWZmZXIxMDQ3N19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zNzBfaW5fc3BlY2lmaWVyX2J1ZmZlcjEwNDc3CT0geyBGT0xMT1dfMzcwX2luX3NwZWNpZmllcl9idWZmZXIxMDQ3N19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zMTZfaW5fc3BlY2lmaWVyX2J1ZmZlcjEwNDg2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zMTZfaW5fc3BlY2lmaWVyX2J1ZmZlcjEwNDg2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzMxNl9pbl9zcGVjaWZpZXJfYnVmZmVyMTA0ODYJPSB7IEZPTExPV18zMTZfaW5fc3BlY2lmaWVyX2J1ZmZlcjEwNDg2X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzI4MV9pbl9zcGVjaWZpZXJfYnVmZmVyMTA0OTggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzI4MV9pbl9zcGVjaWZpZXJfYnVmZmVyMTA0OThfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjgxX2luX3NwZWNpZmllcl9idWZmZXIxMDQ5OAk9IHsgRk9MTE9XXzI4MV9pbl9zcGVjaWZpZXJfYnVmZmVyMTA0OThfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzE1X2luX3NwZWNpZmllcl9idWZmZXIxMDUxMCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzE1X2luX3NwZWNpZmllcl9idWZmZXIxMDUxMF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zMTVfaW5fc3BlY2lmaWVyX2J1ZmZlcjEwNTEwCT0geyBGT0xMT1dfMzE1X2luX3NwZWNpZmllcl9idWZmZXIxMDUxMF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zMjVfaW5fc3BlY2lmaWVyX2J1ZmZlcjEwNTIyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zMjVfaW5fc3BlY2lmaWVyX2J1ZmZlcjEwNTIyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzMyNV9pbl9zcGVjaWZpZXJfYnVmZmVyMTA1MjIJPSB7IEZPTExPV18zMjVfaW5fc3BlY2lmaWVyX2J1ZmZlcjEwNTIyX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzMyNl9pbl9zcGVjaWZpZXJfYnVmZmVyMTA1MjkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzMyNl9pbl9zcGVjaWZpZXJfYnVmZmVyMTA1MjlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzI2X2luX3NwZWNpZmllcl9idWZmZXIxMDUyOQk9IHsgRk9MTE9XXzMyNl9pbl9zcGVjaWZpZXJfYnVmZmVyMTA1MjlfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzczX2luX3NwZWNpZmllcl9idWZmZXIxMDUzNiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzczX2luX3NwZWNpZmllcl9idWZmZXIxMDUzNl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zNzNfaW5fc3BlY2lmaWVyX2J1ZmZlcjEwNTM2CT0geyBGT0xMT1dfMzczX2luX3NwZWNpZmllcl9idWZmZXIxMDUzNl9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zMjlfaW5fc3BlY2lmaWVyX2J1ZmZlcjEwNTQ5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zMjlfaW5fc3BlY2lmaWVyX2J1ZmZlcjEwNTQ5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzMyOV9pbl9zcGVjaWZpZXJfYnVmZmVyMTA1NDkJPSB7IEZPTExPV18zMjlfaW5fc3BlY2lmaWVyX2J1ZmZlcjEwNTQ5X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzMxMV9pbl9kZWZfdHlwZV9pbnRlcnZhbDEwNTc0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zMTFfaW5fZGVmX3R5cGVfaW50ZXJ2YWwxMDU3NF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zMTFfaW5fZGVmX3R5cGVfaW50ZXJ2YWwxMDU3NAk9IHsgRk9MTE9XXzMxMV9pbl9kZWZfdHlwZV9pbnRlcnZhbDEwNTc0X2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xUX19pbl9kZWZfdHlwZV9pbnRlcnZhbDEwNTgyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MVF9faW5fZGVmX3R5cGVfaW50ZXJ2YWwxMDU4Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MTAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MTAwMDAwMDAwMDAwMDA4MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4QzI2NDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjA2MDAwMDAwODAwQzEyOCksIEFOVExSM19VSU5UNjRfTElUKDB4MDA0MDAxNjAwNzAwMjAwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwM0E3ODEwOCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MVF9faW5fZGVmX3R5cGVfaW50ZXJ2YWwxMDU4Mgk9IHsgRk9MTE9XX0xUX19pbl9kZWZfdHlwZV9pbnRlcnZhbDEwNTgyX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3ByaW1pdGl2ZV90eXBlX2luX2RlZl90eXBlX2ludGVydmFsMTA1OTMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3ByaW1pdGl2ZV90eXBlX2luX2RlZl90eXBlX2ludGVydmFsMTA1OTNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDEwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDEwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfcHJpbWl0aXZlX3R5cGVfaW5fZGVmX3R5cGVfaW50ZXJ2YWwxMDU5Mwk9IHsgRk9MTE9XX3ByaW1pdGl2ZV90eXBlX2luX2RlZl90eXBlX2ludGVydmFsMTA1OTNfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTEJSQUNLRVRfaW5fZGVmX3R5cGVfaW50ZXJ2YWwxMDYwOCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTEJSQUNLRVRfaW5fZGVmX3R5cGVfaW50ZXJ2YWwxMDYwOF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MQlJBQ0tFVF9pbl9kZWZfdHlwZV9pbnRlcnZhbDEwNjA4CT0geyBGT0xMT1dfTEJSQUNLRVRfaW5fZGVmX3R5cGVfaW50ZXJ2YWwxMDYwOF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19SQlJBQ0tFVF9pbl9kZWZfdHlwZV9pbnRlcnZhbDEwNjE0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19SQlJBQ0tFVF9pbl9kZWZfdHlwZV9pbnRlcnZhbDEwNjE0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1JCUkFDS0VUX2luX2RlZl90eXBlX2ludGVydmFsMTA2MTQJPSB7IEZPTExPV19SQlJBQ0tFVF9pbl9kZWZfdHlwZV9pbnRlcnZhbDEwNjE0X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xQQVJFTl9pbl9kZWZfdHlwZV9pbnRlcnZhbDEwNjIwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MUEFSRU5faW5fZGVmX3R5cGVfaW50ZXJ2YWwxMDYyMF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MUEFSRU5faW5fZGVmX3R5cGVfaW50ZXJ2YWwxMDYyMAk9IHsgRk9MTE9XX0xQQVJFTl9pbl9kZWZfdHlwZV9pbnRlcnZhbDEwNjIwX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fZGVmX3R5cGVfaW50ZXJ2YWwxMDYzMCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9kZWZfdHlwZV9pbnRlcnZhbDEwNjMwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwODAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fZGVmX3R5cGVfaW50ZXJ2YWwxMDYzMAk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fZGVmX3R5cGVfaW50ZXJ2YWwxMDYzMF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19DT01NQV9pbl9kZWZfdHlwZV9pbnRlcnZhbDEwNjMyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19DT01NQV9pbl9kZWZfdHlwZV9pbnRlcnZhbDEwNjMyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0NPTU1BX2luX2RlZl90eXBlX2ludGVydmFsMTA2MzIJPSB7IEZPTExPV19DT01NQV9pbl9kZWZfdHlwZV9pbnRlcnZhbDEwNjMyX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fZGVmX3R5cGVfaW50ZXJ2YWwxMDYzNyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9kZWZfdHlwZV9pbnRlcnZhbDEwNjM3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgxMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgxMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fZGVmX3R5cGVfaW50ZXJ2YWwxMDYzNwk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fZGVmX3R5cGVfaW50ZXJ2YWwxMDYzN19iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MQlJBQ0tFVF9pbl9kZWZfdHlwZV9pbnRlcnZhbDEwNjQ3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MQlJBQ0tFVF9pbl9kZWZfdHlwZV9pbnRlcnZhbDEwNjQ3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xCUkFDS0VUX2luX2RlZl90eXBlX2ludGVydmFsMTA2NDcJPSB7IEZPTExPV19MQlJBQ0tFVF9pbl9kZWZfdHlwZV9pbnRlcnZhbDEwNjQ3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1JCUkFDS0VUX2luX2RlZl90eXBlX2ludGVydmFsMTA2NTMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1JCUkFDS0VUX2luX2RlZl90eXBlX2ludGVydmFsMTA2NTNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUkJSQUNLRVRfaW5fZGVmX3R5cGVfaW50ZXJ2YWwxMDY1Mwk9IHsgRk9MTE9XX1JCUkFDS0VUX2luX2RlZl90eXBlX2ludGVydmFsMTA2NTNfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfUlBBUkVOX2luX2RlZl90eXBlX2ludGVydmFsMTA2NTkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1JQQVJFTl9pbl9kZWZfdHlwZV9pbnRlcnZhbDEwNjU5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1JQQVJFTl9pbl9kZWZfdHlwZV9pbnRlcnZhbDEwNjU5CT0geyBGT0xMT1dfUlBBUkVOX2luX2RlZl90eXBlX2ludGVydmFsMTA2NTlfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfR1RfaW5fZGVmX3R5cGVfaW50ZXJ2YWwxMDY2NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfR1RfaW5fZGVmX3R5cGVfaW50ZXJ2YWwxMDY2NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19HVF9pbl9kZWZfdHlwZV9pbnRlcnZhbDEwNjY1CT0geyBGT0xMT1dfR1RfaW5fZGVmX3R5cGVfaW50ZXJ2YWwxMDY2NV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19wcmltaXRpdmVfdHlwZV9pbl9iYXNlX3R5cGVfdmFyMTA2ODYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3ByaW1pdGl2ZV90eXBlX2luX2Jhc2VfdHlwZV92YXIxMDY4Nl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19wcmltaXRpdmVfdHlwZV9pbl9iYXNlX3R5cGVfdmFyMTA2ODYJPSB7IEZPTExPV19wcmltaXRpdmVfdHlwZV9pbl9iYXNlX3R5cGVfdmFyMTA2ODZfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX2Jhc2VfdHlwZV92YXIxMDY5NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX2Jhc2VfdHlwZV92YXIxMDY5Nl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fYmFzZV90eXBlX3ZhcjEwNjk2CT0geyBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX2Jhc2VfdHlwZV92YXIxMDY5Nl9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zZXRfaW5fcHJpbWl0aXZlX3R5cGUxMDcxOSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2V0X2luX3ByaW1pdGl2ZV90eXBlMTA3MTlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2V0X2luX3ByaW1pdGl2ZV90eXBlMTA3MTkJPSB7IEZPTExPV19zZXRfaW5fcHJpbWl0aXZlX3R5cGUxMDcxOV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zZXRfaW5fcHJpbWl0aXZlX3R5cGUxMDczNSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2V0X2luX3ByaW1pdGl2ZV90eXBlMTA3MzVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAyMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2V0X2luX3ByaW1pdGl2ZV90eXBlMTA3MzUJPSB7IEZPTExPV19zZXRfaW5fcHJpbWl0aXZlX3R5cGUxMDczNV9iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19iaXRfZmllbGRfc2l6ZV9pbl9wcmltaXRpdmVfdHlwZTEwNzU1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19iaXRfZmllbGRfc2l6ZV9pbl9wcmltaXRpdmVfdHlwZTEwNzU1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2JpdF9maWVsZF9zaXplX2luX3ByaW1pdGl2ZV90eXBlMTA3NTUJPSB7IEZPTExPV19iaXRfZmllbGRfc2l6ZV9pbl9wcmltaXRpdmVfdHlwZTEwNzU1X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3NldF9pbl9wcmltaXRpdmVfdHlwZTEwNzc0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zZXRfaW5fcHJpbWl0aXZlX3R5cGUxMDc3NF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDIwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZXRfaW5fcHJpbWl0aXZlX3R5cGUxMDc3NAk9IHsgRk9MTE9XX3NldF9pbl9wcmltaXRpdmVfdHlwZTEwNzc0X2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2JpdF9maWVsZF9zaXplX2luX3ByaW1pdGl2ZV90eXBlMTA3OTQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2JpdF9maWVsZF9zaXplX2luX3ByaW1pdGl2ZV90eXBlMTA3OTRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfYml0X2ZpZWxkX3NpemVfaW5fcHJpbWl0aXZlX3R5cGUxMDc5NAk9IHsgRk9MTE9XX2JpdF9maWVsZF9zaXplX2luX3ByaW1pdGl2ZV90eXBlMTA3OTRfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2V0X2luX3ByaW1pdGl2ZV90eXBlMTA4MTEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NldF9pbl9wcmltaXRpdmVfdHlwZTEwODExX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMjAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3NldF9pbl9wcmltaXRpdmVfdHlwZTEwODExCT0geyBGT0xMT1dfc2V0X2luX3ByaW1pdGl2ZV90eXBlMTA4MTFfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfYml0X2ZpZWxkX3NpemVfaW5fcHJpbWl0aXZlX3R5cGUxMDgzMSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfYml0X2ZpZWxkX3NpemVfaW5fcHJpbWl0aXZlX3R5cGUxMDgzMV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19iaXRfZmllbGRfc2l6ZV9pbl9wcmltaXRpdmVfdHlwZTEwODMxCT0geyBGT0xMT1dfYml0X2ZpZWxkX3NpemVfaW5fcHJpbWl0aXZlX3R5cGUxMDgzMV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zZXRfaW5fcHJpbWl0aXZlX3R5cGUxMDg1MSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2V0X2luX3ByaW1pdGl2ZV90eXBlMTA4NTFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAyMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2V0X2luX3ByaW1pdGl2ZV90eXBlMTA4NTEJPSB7IEZPTExPV19zZXRfaW5fcHJpbWl0aXZlX3R5cGUxMDg1MV9iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zZXRfaW5fcHJpbWl0aXZlX3R5cGUxMDg3MSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2V0X2luX3ByaW1pdGl2ZV90eXBlMTA4NzFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAyMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2V0X2luX3ByaW1pdGl2ZV90eXBlMTA4NzEJPSB7IEZPTExPV19zZXRfaW5fcHJpbWl0aXZlX3R5cGUxMDg3MV9iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yODNfaW5fcHJpbWl0aXZlX3R5cGUxMDg5MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjgzX2luX3ByaW1pdGl2ZV90eXBlMTA4OTBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAyMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjgzX2luX3ByaW1pdGl2ZV90eXBlMTA4OTAJPSB7IEZPTExPV18yODNfaW5fcHJpbWl0aXZlX3R5cGUxMDg5MF9iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV180MDBfaW5fcHJpbWl0aXZlX3R5cGUxMDkwMiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfNDAwX2luX3ByaW1pdGl2ZV90eXBlMTA5MDJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAyMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfNDAwX2luX3ByaW1pdGl2ZV90eXBlMTA5MDIJPSB7IEZPTExPV180MDBfaW5fcHJpbWl0aXZlX3R5cGUxMDkwMl9iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yNzBfaW5fcHJpbWl0aXZlX3R5cGUxMDkxNCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjcwX2luX3ByaW1pdGl2ZV90eXBlMTA5MTRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAyMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjcwX2luX3ByaW1pdGl2ZV90eXBlMTA5MTQJPSB7IEZPTExPV18yNzBfaW5fcHJpbWl0aXZlX3R5cGUxMDkxNF9iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zOTlfaW5fcHJpbWl0aXZlX3R5cGUxMDkyNSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzk5X2luX3ByaW1pdGl2ZV90eXBlMTA5MjVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAyMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzk5X2luX3ByaW1pdGl2ZV90eXBlMTA5MjUJPSB7IEZPTExPV18zOTlfaW5fcHJpbWl0aXZlX3R5cGUxMDkyNV9iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zNjBfaW5fcHJpbWl0aXZlX3R5cGUxMDkzNiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzYwX2luX3ByaW1pdGl2ZV90eXBlMTA5MzZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAyMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzYwX2luX3ByaW1pdGl2ZV90eXBlMTA5MzYJPSB7IEZPTExPV18zNjBfaW5fcHJpbWl0aXZlX3R5cGUxMDkzNl9iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV180MDlfaW5fcHJpbWl0aXZlX3R5cGUxMDk0OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfNDA5X2luX3ByaW1pdGl2ZV90eXBlMTA5NDlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAyMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfNDA5X2luX3ByaW1pdGl2ZV90eXBlMTA5NDkJPSB7IEZPTExPV180MDlfaW5fcHJpbWl0aXZlX3R5cGUxMDk0OV9iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19iaXRfZmllbGRfc2l6ZV9pbl9wcmltaXRpdmVfdHlwZTEwOTY4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19iaXRfZmllbGRfc2l6ZV9pbl9wcmltaXRpdmVfdHlwZTEwOTY4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2JpdF9maWVsZF9zaXplX2luX3ByaW1pdGl2ZV90eXBlMTA5NjgJPSB7IEZPTExPV19iaXRfZmllbGRfc2l6ZV9pbl9wcmltaXRpdmVfdHlwZTEwOTY4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3RpbWVfY2xvY2tfdHlwZV9pbl9wcmltaXRpdmVfdHlwZTEwOTg4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV190aW1lX2Nsb2NrX3R5cGVfaW5fcHJpbWl0aXZlX3R5cGUxMDk4OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV190aW1lX2Nsb2NrX3R5cGVfaW5fcHJpbWl0aXZlX3R5cGUxMDk4OAk9IHsgRk9MTE9XX3RpbWVfY2xvY2tfdHlwZV9pbl9wcmltaXRpdmVfdHlwZTEwOTg4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3RpbWVfdHlwZV9pbl9wcmltaXRpdmVfdHlwZTEwOTk4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV190aW1lX3R5cGVfaW5fcHJpbWl0aXZlX3R5cGUxMDk5OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV190aW1lX3R5cGVfaW5fcHJpbWl0aXZlX3R5cGUxMDk5OAk9IHsgRk9MTE9XX3RpbWVfdHlwZV9pbl9wcmltaXRpdmVfdHlwZTEwOTk4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzI1NF9pbl9wcmltaXRpdmVfdHlwZTExMDA2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yNTRfaW5fcHJpbWl0aXZlX3R5cGUxMTAwNl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDIwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yNTRfaW5fcHJpbWl0aXZlX3R5cGUxMTAwNgk9IHsgRk9MTE9XXzI1NF9pbl9wcmltaXRpdmVfdHlwZTExMDA2X2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2JpdF9maWVsZF9zaXplX2luX3ByaW1pdGl2ZV90eXBlMTEwMjAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2JpdF9maWVsZF9zaXplX2luX3ByaW1pdGl2ZV90eXBlMTEwMjBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfYml0X2ZpZWxkX3NpemVfaW5fcHJpbWl0aXZlX3R5cGUxMTAyMAk9IHsgRk9MTE9XX2JpdF9maWVsZF9zaXplX2luX3ByaW1pdGl2ZV90eXBlMTEwMjBfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjU1X2luX3ByaW1pdGl2ZV90eXBlMTEwMzcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzI1NV9pbl9wcmltaXRpdmVfdHlwZTExMDM3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMjAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzI1NV9pbl9wcmltaXRpdmVfdHlwZTExMDM3CT0geyBGT0xMT1dfMjU1X2luX3ByaW1pdGl2ZV90eXBlMTEwMzdfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfYml0X2ZpZWxkX3NpemVfaW5fcHJpbWl0aXZlX3R5cGUxMTA1MSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfYml0X2ZpZWxkX3NpemVfaW5fcHJpbWl0aXZlX3R5cGUxMTA1MV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19iaXRfZmllbGRfc2l6ZV9pbl9wcmltaXRpdmVfdHlwZTExMDUxCT0geyBGT0xMT1dfYml0X2ZpZWxkX3NpemVfaW5fcHJpbWl0aXZlX3R5cGUxMTA1MV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zODdfaW5fcHJpbWl0aXZlX3R5cGUxMTA2OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzg3X2luX3ByaW1pdGl2ZV90eXBlMTEwNjhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAyMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzg3X2luX3ByaW1pdGl2ZV90eXBlMTEwNjgJPSB7IEZPTExPV18zODdfaW5fcHJpbWl0aXZlX3R5cGUxMTA2OF9iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zdHJpbmdfZmllbGRfc2l6ZV9pbl9wcmltaXRpdmVfdHlwZTExMDgwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zdHJpbmdfZmllbGRfc2l6ZV9pbl9wcmltaXRpdmVfdHlwZTExMDgwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3N0cmluZ19maWVsZF9zaXplX2luX3ByaW1pdGl2ZV90eXBlMTEwODAJPSB7IEZPTExPV19zdHJpbmdfZmllbGRfc2l6ZV9pbl9wcmltaXRpdmVfdHlwZTExMDgwX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzMzM19pbl9wcmltaXRpdmVfdHlwZTExMDk4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zMzNfaW5fcHJpbWl0aXZlX3R5cGUxMTA5OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zMzNfaW5fcHJpbWl0aXZlX3R5cGUxMTA5OAk9IHsgRk9MTE9XXzMzM19pbl9wcmltaXRpdmVfdHlwZTExMDk4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzI0Ml9pbl9wcmltaXRpdmVfdHlwZTExMTA3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yNDJfaW5fcHJpbWl0aXZlX3R5cGUxMTEwN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yNDJfaW5fcHJpbWl0aXZlX3R5cGUxMTEwNwk9IHsgRk9MTE9XXzI0Ml9pbl9wcmltaXRpdmVfdHlwZTExMTA3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzM0NF9pbl9wcmltaXRpdmVfdHlwZTExMTE4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zNDRfaW5fcHJpbWl0aXZlX3R5cGUxMTExOF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zNDRfaW5fcHJpbWl0aXZlX3R5cGUxMTExOAk9IHsgRk9MTE9XXzM0NF9pbl9wcmltaXRpdmVfdHlwZTExMTE4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzI0OV9pbl9wcmltaXRpdmVfdHlwZTExMTMxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yNDlfaW5fcHJpbWl0aXZlX3R5cGUxMTEzMV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yNDlfaW5fcHJpbWl0aXZlX3R5cGUxMTEzMQk9IHsgRk9MTE9XXzI0OV9pbl9wcmltaXRpdmVfdHlwZTExMTMxX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzMyMF9pbl9wcmltaXRpdmVfdHlwZTExMTQyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zMjBfaW5fcHJpbWl0aXZlX3R5cGUxMTE0Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zMjBfaW5fcHJpbWl0aXZlX3R5cGUxMTE0Mgk9IHsgRk9MTE9XXzMyMF9pbl9wcmltaXRpdmVfdHlwZTExMTQyX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzM3NF9pbl9wcmltaXRpdmVfdHlwZTExMTUyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zNzRfaW5fcHJpbWl0aXZlX3R5cGUxMTE1Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zNzRfaW5fcHJpbWl0aXZlX3R5cGUxMTE1Mgk9IHsgRk9MTE9XXzM3NF9pbl9wcmltaXRpdmVfdHlwZTExMTUyX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzI2MV9pbl9wcmltaXRpdmVfdHlwZTExMTYzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yNjFfaW5fcHJpbWl0aXZlX3R5cGUxMTE2M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yNjFfaW5fcHJpbWl0aXZlX3R5cGUxMTE2Mwk9IHsgRk9MTE9XXzI2MV9pbl9wcmltaXRpdmVfdHlwZTExMTYzX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzMxN19pbl9wcmltaXRpdmVfdHlwZTExMTcyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zMTdfaW5fcHJpbWl0aXZlX3R5cGUxMTE3Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zMTdfaW5fcHJpbWl0aXZlX3R5cGUxMTE3Mgk9IHsgRk9MTE9XXzMxN19pbl9wcmltaXRpdmVfdHlwZTExMTcyX2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xUX19pbl9wcmltaXRpdmVfdHlwZTExMTg0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MVF9faW5fcHJpbWl0aXZlX3R5cGUxMTE4NF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MVF9faW5fcHJpbWl0aXZlX3R5cGUxMTE4NAk9IHsgRk9MTE9XX0xUX19pbl9wcmltaXRpdmVfdHlwZTExMTg0X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9wcmltaXRpdmVfdHlwZTExMTg5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fcHJpbWl0aXZlX3R5cGUxMTE4OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fcHJpbWl0aXZlX3R5cGUxMTE4OQk9IHsgRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9wcmltaXRpdmVfdHlwZTExMTg5X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0dUX2luX3ByaW1pdGl2ZV90eXBlMTExOTIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0dUX2luX3ByaW1pdGl2ZV90eXBlMTExOTJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfR1RfaW5fcHJpbWl0aXZlX3R5cGUxMTE5Mgk9IHsgRk9MTE9XX0dUX2luX3ByaW1pdGl2ZV90eXBlMTExOTJfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfNDA1X2luX3ByaW1pdGl2ZV90eXBlMTEyMDkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzQwNV9pbl9wcmltaXRpdmVfdHlwZTExMjA5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzQwNV9pbl9wcmltaXRpdmVfdHlwZTExMjA5CT0geyBGT0xMT1dfNDA1X2luX3ByaW1pdGl2ZV90eXBlMTEyMDlfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfQ09MT05faW5fYml0X2ZpZWxkX3NpemUxMTIyOCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQ09MT05faW5fYml0X2ZpZWxkX3NpemUxMTIyOF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDA4NDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19DT0xPTl9pbl9iaXRfZmllbGRfc2l6ZTExMjI4CT0geyBGT0xMT1dfQ09MT05faW5fYml0X2ZpZWxkX3NpemUxMTIyOF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19pbnRlZ2VyX2NvbnN0YW50X2luX2JpdF9maWVsZF9zaXplMTEyMzMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fYml0X2ZpZWxkX3NpemUxMTIzM19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19pbnRlZ2VyX2NvbnN0YW50X2luX2JpdF9maWVsZF9zaXplMTEyMzMJPSB7IEZPTExPV19pbnRlZ2VyX2NvbnN0YW50X2luX2JpdF9maWVsZF9zaXplMTEyMzNfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTFRfX2luX2JpdF9maWVsZF9zaXplMTEyNTcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xUX19pbl9iaXRfZmllbGRfc2l6ZTExMjU3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDg0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDgwMDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xUX19pbl9iaXRfZmllbGRfc2l6ZTExMjU3CT0geyBGT0xMT1dfTFRfX2luX2JpdF9maWVsZF9zaXplMTEyNTdfYml0cywgNgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzc1X2luX2JpdF9maWVsZF9zaXplMTEyNjIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzM3NV9pbl9iaXRfZmllbGRfc2l6ZTExMjYyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDg0MDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzM3NV9pbl9iaXRfZmllbGRfc2l6ZTExMjYyCT0geyBGT0xMT1dfMzc1X2luX2JpdF9maWVsZF9zaXplMTEyNjJfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfaW50ZWdlcl9jb25zdGFudF9pbl9iaXRfZmllbGRfc2l6ZTExMjcwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19pbnRlZ2VyX2NvbnN0YW50X2luX2JpdF9maWVsZF9zaXplMTEyNzBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfaW50ZWdlcl9jb25zdGFudF9pbl9iaXRfZmllbGRfc2l6ZTExMjcwCT0geyBGT0xMT1dfaW50ZWdlcl9jb25zdGFudF9pbl9iaXRfZmllbGRfc2l6ZTExMjcwX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0dUX2luX2JpdF9maWVsZF9zaXplMTEyNzMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0dUX2luX2JpdF9maWVsZF9zaXplMTEyNzNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfR1RfaW5fYml0X2ZpZWxkX3NpemUxMTI3Mwk9IHsgRk9MTE9XX0dUX2luX2JpdF9maWVsZF9zaXplMTEyNzNfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfQ09MT05faW5fc3RyaW5nX2ZpZWxkX3NpemUxMTI5MiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQ09MT05faW5fc3RyaW5nX2ZpZWxkX3NpemUxMTI5Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDA4NDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19DT0xPTl9pbl9zdHJpbmdfZmllbGRfc2l6ZTExMjkyCT0geyBGT0xMT1dfQ09MT05faW5fc3RyaW5nX2ZpZWxkX3NpemUxMTI5Ml9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19yYW5nZV9jb25zdGFudF9pbl9zdHJpbmdfZmllbGRfc2l6ZTExMjk2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19yYW5nZV9jb25zdGFudF9pbl9zdHJpbmdfZmllbGRfc2l6ZTExMjk2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3JhbmdlX2NvbnN0YW50X2luX3N0cmluZ19maWVsZF9zaXplMTEyOTYJPSB7IEZPTExPV19yYW5nZV9jb25zdGFudF9pbl9zdHJpbmdfZmllbGRfc2l6ZTExMjk2X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xUX19pbl9zdHJpbmdfZmllbGRfc2l6ZTExMzA3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MVF9faW5fc3RyaW5nX2ZpZWxkX3NpemUxMTMwN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDA4NDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDA4MDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MVF9faW5fc3RyaW5nX2ZpZWxkX3NpemUxMTMwNwk9IHsgRk9MTE9XX0xUX19pbl9zdHJpbmdfZmllbGRfc2l6ZTExMzA3X2JpdHMsIDYJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzM3NV9pbl9zdHJpbmdfZmllbGRfc2l6ZTExMzEyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zNzVfaW5fc3RyaW5nX2ZpZWxkX3NpemUxMTMxMl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDA4NDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zNzVfaW5fc3RyaW5nX2ZpZWxkX3NpemUxMTMxMgk9IHsgRk9MTE9XXzM3NV9pbl9zdHJpbmdfZmllbGRfc2l6ZTExMzEyX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3JhbmdlX2NvbnN0YW50X2luX3N0cmluZ19maWVsZF9zaXplMTEzMjAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3JhbmdlX2NvbnN0YW50X2luX3N0cmluZ19maWVsZF9zaXplMTEzMjBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfcmFuZ2VfY29uc3RhbnRfaW5fc3RyaW5nX2ZpZWxkX3NpemUxMTMyMAk9IHsgRk9MTE9XX3JhbmdlX2NvbnN0YW50X2luX3N0cmluZ19maWVsZF9zaXplMTEzMjBfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfR1RfaW5fc3RyaW5nX2ZpZWxkX3NpemUxMTMyMyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfR1RfaW5fc3RyaW5nX2ZpZWxkX3NpemUxMTMyM19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19HVF9pbl9zdHJpbmdfZmllbGRfc2l6ZTExMzIzCT0geyBGT0xMT1dfR1RfaW5fc3RyaW5nX2ZpZWxkX3NpemUxMTMyM19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19pbnRlZ2VyX2NvbnN0YW50X2luX3JhbmdlX2NvbnN0YW50MTEzNDUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fcmFuZ2VfY29uc3RhbnQxMTM0NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDQwMDgwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19pbnRlZ2VyX2NvbnN0YW50X2luX3JhbmdlX2NvbnN0YW50MTEzNDUJPSB7IEZPTExPV19pbnRlZ2VyX2NvbnN0YW50X2luX3JhbmdlX2NvbnN0YW50MTEzNDVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2V0X2luX3JhbmdlX2NvbnN0YW50MTEzNTcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NldF9pbl9yYW5nZV9jb25zdGFudDExMzU3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDg0MDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3NldF9pbl9yYW5nZV9jb25zdGFudDExMzU3CT0geyBGT0xMT1dfc2V0X2luX3JhbmdlX2NvbnN0YW50MTEzNTdfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfaW50ZWdlcl9jb25zdGFudF9pbl9yYW5nZV9jb25zdGFudDExMzc0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19pbnRlZ2VyX2NvbnN0YW50X2luX3JhbmdlX2NvbnN0YW50MTEzNzRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfaW50ZWdlcl9jb25zdGFudF9pbl9yYW5nZV9jb25zdGFudDExMzc0CT0geyBGT0xMT1dfaW50ZWdlcl9jb25zdGFudF9pbl9yYW5nZV9jb25zdGFudDExMzc0X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xDVVJMWV9pbl9vbl93cml0ZV92YXJfcm91dGluZV9kZWYxMTM5NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTENVUkxZX2luX29uX3dyaXRlX3Zhcl9yb3V0aW5lX2RlZjExMzk2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xDVVJMWV9pbl9vbl93cml0ZV92YXJfcm91dGluZV9kZWYxMTM5Ngk9IHsgRk9MTE9XX0xDVVJMWV9pbl9vbl93cml0ZV92YXJfcm91dGluZV9kZWYxMTM5Nl9iaXRzLCA0CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV192YXJfcm91dGluZV9kZWZfaW5fb25fd3JpdGVfdmFyX3JvdXRpbmVfZGVmMTE0MDEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3Zhcl9yb3V0aW5lX2RlZl9pbl9vbl93cml0ZV92YXJfcm91dGluZV9kZWYxMTQwMV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV192YXJfcm91dGluZV9kZWZfaW5fb25fd3JpdGVfdmFyX3JvdXRpbmVfZGVmMTE0MDEJPSB7IEZPTExPV192YXJfcm91dGluZV9kZWZfaW5fb25fd3JpdGVfdmFyX3JvdXRpbmVfZGVmMTE0MDFfYml0cywgNAl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfUkNVUkxZX2luX29uX3dyaXRlX3Zhcl9yb3V0aW5lX2RlZjExNDA3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19SQ1VSTFlfaW5fb25fd3JpdGVfdmFyX3JvdXRpbmVfZGVmMTE0MDdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUkNVUkxZX2luX29uX3dyaXRlX3Zhcl9yb3V0aW5lX2RlZjExNDA3CT0geyBGT0xMT1dfUkNVUkxZX2luX29uX3dyaXRlX3Zhcl9yb3V0aW5lX2RlZjExNDA3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzIwNV9pbl92YXJfcm91dGluZV9kZWYxMTQyOSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjA1X2luX3Zhcl9yb3V0aW5lX2RlZjExNDI5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMjAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzIwNV9pbl92YXJfcm91dGluZV9kZWYxMTQyOQk9IHsgRk9MTE9XXzIwNV9pbl92YXJfcm91dGluZV9kZWYxMTQyOV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19yb3V0aW5lX3NpbmdsZV9wYXJhbV9pbl92YXJfcm91dGluZV9kZWYxMTQ0MSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfcm91dGluZV9zaW5nbGVfcGFyYW1faW5fdmFyX3JvdXRpbmVfZGVmMTE0NDFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAyMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfcm91dGluZV9zaW5nbGVfcGFyYW1faW5fdmFyX3JvdXRpbmVfZGVmMTE0NDEJPSB7IEZPTExPV19yb3V0aW5lX3NpbmdsZV9wYXJhbV9pbl92YXJfcm91dGluZV9kZWYxMTQ0MV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19ibG9ja19zdGF0ZW1lbnRfaW5fdmFyX3JvdXRpbmVfZGVmMTE0NTQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl92YXJfcm91dGluZV9kZWYxMTQ1NF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19ibG9ja19zdGF0ZW1lbnRfaW5fdmFyX3JvdXRpbmVfZGVmMTE0NTQJPSB7IEZPTExPV19ibG9ja19zdGF0ZW1lbnRfaW5fdmFyX3JvdXRpbmVfZGVmMTE0NTRfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfNDE3X2luX3Zhcl9yb3V0aW5lX2RlZjExNDY0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV180MTdfaW5fdmFyX3JvdXRpbmVfZGVmMTE0NjRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfNDE3X2luX3Zhcl9yb3V0aW5lX2RlZjExNDY0CT0geyBGT0xMT1dfNDE3X2luX3Zhcl9yb3V0aW5lX2RlZjExNDY0X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2NvbmRpdGlvbmFsRXhwcmVzc2lvbl9pbl92YXJfcm91dGluZV9kZWYxMTQ2OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfY29uZGl0aW9uYWxFeHByZXNzaW9uX2luX3Zhcl9yb3V0aW5lX2RlZjExNDY4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2NvbmRpdGlvbmFsRXhwcmVzc2lvbl9pbl92YXJfcm91dGluZV9kZWYxMTQ2OAk9IHsgRk9MTE9XX2NvbmRpdGlvbmFsRXhwcmVzc2lvbl9pbl92YXJfcm91dGluZV9kZWYxMTQ2OF9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TRU1JX2luX3Zhcl9yb3V0aW5lX2RlZjExNDcwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19TRU1JX2luX3Zhcl9yb3V0aW5lX2RlZjExNDcwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1NFTUlfaW5fdmFyX3JvdXRpbmVfZGVmMTE0NzAJPSB7IEZPTExPV19TRU1JX2luX3Zhcl9yb3V0aW5lX2RlZjExNDcwX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xQQVJFTl9pbl9yb3V0aW5lX3NpbmdsZV9wYXJhbTExNDk4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MUEFSRU5faW5fcm91dGluZV9zaW5nbGVfcGFyYW0xMTQ5OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4QzI2NjAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MzhFMDAwMDAwQTAwQzEyOCksIEFOVExSM19VSU5UNjRfTElUKDB4MDA2NDAxNjAwNzAwMjI2MSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAxM0E3ODEwOCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MUEFSRU5faW5fcm91dGluZV9zaW5nbGVfcGFyYW0xMTQ5OAk9IHsgRk9MTE9XX0xQQVJFTl9pbl9yb3V0aW5lX3NpbmdsZV9wYXJhbTExNDk4X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3R5cGVfdmFyX2luX3JvdXRpbmVfc2luZ2xlX3BhcmFtMTE1MTcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3R5cGVfdmFyX2luX3JvdXRpbmVfc2luZ2xlX3BhcmFtMTE1MTdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfdHlwZV92YXJfaW5fcm91dGluZV9zaW5nbGVfcGFyYW0xMTUxNwk9IHsgRk9MTE9XX3R5cGVfdmFyX2luX3JvdXRpbmVfc2luZ2xlX3BhcmFtMTE1MTdfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfSURfaW5fcm91dGluZV9zaW5nbGVfcGFyYW0xMTUyNCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfSURfaW5fcm91dGluZV9zaW5nbGVfcGFyYW0xMTUyNF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAxMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JRF9pbl9yb3V0aW5lX3NpbmdsZV9wYXJhbTExNTI0CT0geyBGT0xMT1dfSURfaW5fcm91dGluZV9zaW5nbGVfcGFyYW0xMTUyNF9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19JRF9pbl9yb3V0aW5lX3NpbmdsZV9wYXJhbTExNTMzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19JRF9pbl9yb3V0aW5lX3NpbmdsZV9wYXJhbTExNTMzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDEwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0lEX2luX3JvdXRpbmVfc2luZ2xlX3BhcmFtMTE1MzMJPSB7IEZPTExPV19JRF9pbl9yb3V0aW5lX3NpbmdsZV9wYXJhbTExNTMzX2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2luaXRpYWxfdmFsdWVfaW5fcm91dGluZV9zaW5nbGVfcGFyYW0xMTU0NyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfaW5pdGlhbF92YWx1ZV9pbl9yb3V0aW5lX3NpbmdsZV9wYXJhbTExNTQ3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2luaXRpYWxfdmFsdWVfaW5fcm91dGluZV9zaW5nbGVfcGFyYW0xMTU0Nwk9IHsgRk9MTE9XX2luaXRpYWxfdmFsdWVfaW5fcm91dGluZV9zaW5nbGVfcGFyYW0xMTU0N19iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19SUEFSRU5faW5fcm91dGluZV9zaW5nbGVfcGFyYW0xMTU2MyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfUlBBUkVOX2luX3JvdXRpbmVfc2luZ2xlX3BhcmFtMTE1NjNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUlBBUkVOX2luX3JvdXRpbmVfc2luZ2xlX3BhcmFtMTE1NjMJPSB7IEZPTExPV19SUEFSRU5faW5fcm91dGluZV9zaW5nbGVfcGFyYW0xMTU2M19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yNzZfaW5fZGVmX2VudW0xMTU4MiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjc2X2luX2RlZl9lbnVtMTE1ODJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjc2X2luX2RlZl9lbnVtMTE1ODIJPSB7IEZPTExPV18yNzZfaW5fZGVmX2VudW0xMTU4Ml9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19JRF9pbl9kZWZfZW51bTExNTg3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19JRF9pbl9kZWZfZW51bTExNTg3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0lEX2luX2RlZl9lbnVtMTE1ODcJPSB7IEZPTExPV19JRF9pbl9kZWZfZW51bTExNTg3X2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2RlZl9lbnVtX2ltcGxfaW5fZGVmX2VudW0xMTU5MiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX2VudW1faW1wbF9pbl9kZWZfZW51bTExNTkyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl9lbnVtX2ltcGxfaW5fZGVmX2VudW0xMTU5Mgk9IHsgRk9MTE9XX2RlZl9lbnVtX2ltcGxfaW5fZGVmX2VudW0xMTU5Ml9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MQ1VSTFlfaW5fZGVmX2VudW1faW1wbDExNjExICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MQ1VSTFlfaW5fZGVmX2VudW1faW1wbDExNjExX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xDVVJMWV9pbl9kZWZfZW51bV9pbXBsMTE2MTEJPSB7IEZPTExPV19MQ1VSTFlfaW5fZGVmX2VudW1faW1wbDExNjExX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lEX2luX2RlZl9lbnVtX2ltcGwxMTYyMCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfSURfaW5fZGVmX2VudW1faW1wbDExNjIwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwODAwMDEwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0lEX2luX2RlZl9lbnVtX2ltcGwxMTYyMAk9IHsgRk9MTE9XX0lEX2luX2RlZl9lbnVtX2ltcGwxMTYyMF9iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19BU1NJR05faW5fZGVmX2VudW1faW1wbDExNjM5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19BU1NJR05faW5fZGVmX2VudW1faW1wbDExNjM5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0FTU0lHTl9pbl9kZWZfZW51bV9pbXBsMTE2MzkJPSB7IEZPTExPV19BU1NJR05faW5fZGVmX2VudW1faW1wbDExNjM5X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fZGVmX2VudW1faW1wbDExNjQzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX2RlZl9lbnVtX2ltcGwxMTY0M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDgwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjAwMDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX2RlZl9lbnVtX2ltcGwxMTY0Mwk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fZGVmX2VudW1faW1wbDExNjQzX2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0NPTU1BX2luX2RlZl9lbnVtX2ltcGwxMTY1OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQ09NTUFfaW5fZGVmX2VudW1faW1wbDExNjU5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0NPTU1BX2luX2RlZl9lbnVtX2ltcGwxMTY1OQk9IHsgRk9MTE9XX0NPTU1BX2luX2RlZl9lbnVtX2ltcGwxMTY1OV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19JRF9pbl9kZWZfZW51bV9pbXBsMTE2NjMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0lEX2luX2RlZl9lbnVtX2ltcGwxMTY2M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDgwMDAxMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjAwMDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JRF9pbl9kZWZfZW51bV9pbXBsMTE2NjMJPSB7IEZPTExPV19JRF9pbl9kZWZfZW51bV9pbXBsMTE2NjNfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfQVNTSUdOX2luX2RlZl9lbnVtX2ltcGwxMTY4MiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQVNTSUdOX2luX2RlZl9lbnVtX2ltcGwxMTY4Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19BU1NJR05faW5fZGVmX2VudW1faW1wbDExNjgyCT0geyBGT0xMT1dfQVNTSUdOX2luX2RlZl9lbnVtX2ltcGwxMTY4Ml9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX2RlZl9lbnVtX2ltcGwxMTY4NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9kZWZfZW51bV9pbXBsMTE2ODZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA4MDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDIwMDAwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9kZWZfZW51bV9pbXBsMTE2ODYJPSB7IEZPTExPV19leHByZXNzaW9uX2luX2RlZl9lbnVtX2ltcGwxMTY4Nl9iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19SQ1VSTFlfaW5fZGVmX2VudW1faW1wbDExNzA3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19SQ1VSTFlfaW5fZGVmX2VudW1faW1wbDExNzA3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1JDVVJMWV9pbl9kZWZfZW51bV9pbXBsMTE3MDcJPSB7IEZPTExPV19SQ1VSTFlfaW5fZGVmX2VudW1faW1wbDExNzA3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3NldF9pbl9kZWZfc3RydWN0MTE3MjIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NldF9pbl9kZWZfc3RydWN0MTE3MjJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2V0X2luX2RlZl9zdHJ1Y3QxMTcyMgk9IHsgRk9MTE9XX3NldF9pbl9kZWZfc3RydWN0MTE3MjJfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfSURfaW5fZGVmX3N0cnVjdDExNzM1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19JRF9pbl9kZWZfc3RydWN0MTE3MzVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDEpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfSURfaW5fZGVmX3N0cnVjdDExNzM1CT0geyBGT0xMT1dfSURfaW5fZGVmX3N0cnVjdDExNzM1X2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2RlZl9jbGFzc19zdHJ1Y3R1cmVfaW1wbF9pbl9kZWZfc3RydWN0MTE3NDAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlZl9jbGFzc19zdHJ1Y3R1cmVfaW1wbF9pbl9kZWZfc3RydWN0MTE3NDBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX2NsYXNzX3N0cnVjdHVyZV9pbXBsX2luX2RlZl9zdHJ1Y3QxMTc0MAk9IHsgRk9MTE9XX2RlZl9jbGFzc19zdHJ1Y3R1cmVfaW1wbF9pbl9kZWZfc3RydWN0MTE3NDBfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTENVUkxZX2luX2RlZl9jbGFzc19zdHJ1Y3R1cmVfaW1wbDExNzU5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MQ1VSTFlfaW5fZGVmX2NsYXNzX3N0cnVjdHVyZV9pbXBsMTE3NTlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDgwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDQwMDIwNDAxMDQwMDAwNDgpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDEwMDAxMjA4MjAyMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwNEM0MDA4MDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTENVUkxZX2luX2RlZl9jbGFzc19zdHJ1Y3R1cmVfaW1wbDExNzU5CT0geyBGT0xMT1dfTENVUkxZX2luX2RlZl9jbGFzc19zdHJ1Y3R1cmVfaW1wbDExNzU5X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX21vZGlmaWVyX2RlY2xhcmF0aW9uX2luX2RlZl9jbGFzc19zdHJ1Y3R1cmVfaW1wbDExNzc1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19tb2RpZmllcl9kZWNsYXJhdGlvbl9pbl9kZWZfY2xhc3Nfc3RydWN0dXJlX2ltcGwxMTc3NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4NDAwMDAwMDEwMDAwMDA0OCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwQzAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19tb2RpZmllcl9kZWNsYXJhdGlvbl9pbl9kZWZfY2xhc3Nfc3RydWN0dXJlX2ltcGwxMTc3NQk9IHsgRk9MTE9XX21vZGlmaWVyX2RlY2xhcmF0aW9uX2luX2RlZl9jbGFzc19zdHJ1Y3R1cmVfaW1wbDExNzc1X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2RlY2xfdmFyaWFibGVfaW5fZGVmX2NsYXNzX3N0cnVjdHVyZV9pbXBsMTE3OTIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlY2xfdmFyaWFibGVfaW5fZGVmX2NsYXNzX3N0cnVjdHVyZV9pbXBsMTE3OTJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDIwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDgwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDQwMDIwNDAxMDQwMDAwNDgpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDEwMDAxMjA4MjAyMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwNEM0MDA4MDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVjbF92YXJpYWJsZV9pbl9kZWZfY2xhc3Nfc3RydWN0dXJlX2ltcGwxMTc5Mgk9IHsgRk9MTE9XX2RlY2xfdmFyaWFibGVfaW5fZGVmX2NsYXNzX3N0cnVjdHVyZV9pbXBsMTE3OTJfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX21ldGhvZF9pbl9kZWZfY2xhc3Nfc3RydWN0dXJlX2ltcGwxMTgwMyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX21ldGhvZF9pbl9kZWZfY2xhc3Nfc3RydWN0dXJlX2ltcGwxMTgwM19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwODAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4NDAwMjA0MDEwNDAwMDA0OCksIEFOVExSM19VSU5UNjRfTElUKDB4MTAwMDEyMDgyMDIwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDA0QzQwMDgwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWZfbWV0aG9kX2luX2RlZl9jbGFzc19zdHJ1Y3R1cmVfaW1wbDExODAzCT0geyBGT0xMT1dfZGVmX21ldGhvZF9pbl9kZWZfY2xhc3Nfc3RydWN0dXJlX2ltcGwxMTgwM19iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19SQ1VSTFlfaW5fZGVmX2NsYXNzX3N0cnVjdHVyZV9pbXBsMTE4MjUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1JDVVJMWV9pbl9kZWZfY2xhc3Nfc3RydWN0dXJlX2ltcGwxMTgyNV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19SQ1VSTFlfaW5fZGVmX2NsYXNzX3N0cnVjdHVyZV9pbXBsMTE4MjUJPSB7IEZPTExPV19SQ1VSTFlfaW5fZGVmX2NsYXNzX3N0cnVjdHVyZV9pbXBsMTE4MjVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjU3X2luX2RlZl9jaG9pY2UxMTg0MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjU3X2luX2RlZl9jaG9pY2UxMTg0MF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yNTdfaW5fZGVmX2Nob2ljZTExODQwCT0geyBGT0xMT1dfMjU3X2luX2RlZl9jaG9pY2UxMTg0MF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19JRF9pbl9kZWZfY2hvaWNlMTE4NDUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0lEX2luX2RlZl9jaG9pY2UxMTg0NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMSkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JRF9pbl9kZWZfY2hvaWNlMTE4NDUJPSB7IEZPTExPV19JRF9pbl9kZWZfY2hvaWNlMTE4NDVfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX2Nob2ljZV9pbXBsX2luX2RlZl9jaG9pY2UxMTg1MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX2Nob2ljZV9pbXBsX2luX2RlZl9jaG9pY2UxMTg1MF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWZfY2hvaWNlX2ltcGxfaW5fZGVmX2Nob2ljZTExODUwCT0geyBGT0xMT1dfZGVmX2Nob2ljZV9pbXBsX2luX2RlZl9jaG9pY2UxMTg1MF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MQ1VSTFlfaW5fZGVmX2Nob2ljZV9pbXBsMTE4NjkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xDVVJMWV9pbl9kZWZfY2hvaWNlX2ltcGwxMTg2OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwODAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4NDAwMjA0MDEwNDAwMDA0OCksIEFOVExSM19VSU5UNjRfTElUKDB4MTAwMDEyMDgyMDIwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDA0QzQwMDgwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MQ1VSTFlfaW5fZGVmX2Nob2ljZV9pbXBsMTE4NjkJPSB7IEZPTExPV19MQ1VSTFlfaW5fZGVmX2Nob2ljZV9pbXBsMTE4NjlfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfbW9kaWZpZXJfZGVjbGFyYXRpb25faW5fZGVmX2Nob2ljZV9pbXBsMTE4ODUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX21vZGlmaWVyX2RlY2xhcmF0aW9uX2luX2RlZl9jaG9pY2VfaW1wbDExODg1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHg0MDAwMDAwMTAwMDAwMDQ4KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDBDMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX21vZGlmaWVyX2RlY2xhcmF0aW9uX2luX2RlZl9jaG9pY2VfaW1wbDExODg1CT0geyBGT0xMT1dfbW9kaWZpZXJfZGVjbGFyYXRpb25faW5fZGVmX2Nob2ljZV9pbXBsMTE4ODVfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVjbF92YXJpYWJsZV9pbl9kZWZfY2hvaWNlX2ltcGwxMTkwMiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVjbF92YXJpYWJsZV9pbl9kZWZfY2hvaWNlX2ltcGwxMTkwMl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwODAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4NDAwMjA0MDEwNDAwMDA0OCksIEFOVExSM19VSU5UNjRfTElUKDB4MTAwMDEyMDgyMDIwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDA0QzQwMDgwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWNsX3ZhcmlhYmxlX2luX2RlZl9jaG9pY2VfaW1wbDExOTAyCT0geyBGT0xMT1dfZGVjbF92YXJpYWJsZV9pbl9kZWZfY2hvaWNlX2ltcGwxMTkwMl9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfbWV0aG9kX2luX2RlZl9jaG9pY2VfaW1wbDExOTEzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWZfbWV0aG9kX2luX2RlZl9jaG9pY2VfaW1wbDExOTEzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA4MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHg0MDAyMDQwMTA0MDAwMDQ4KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgxMDAwMTIwODIwMjAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDRDNDAwODAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl9tZXRob2RfaW5fZGVmX2Nob2ljZV9pbXBsMTE5MTMJPSB7IEZPTExPV19kZWZfbWV0aG9kX2luX2RlZl9jaG9pY2VfaW1wbDExOTEzX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1JDVVJMWV9pbl9kZWZfY2hvaWNlX2ltcGwxMTkzNSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfUkNVUkxZX2luX2RlZl9jaG9pY2VfaW1wbDExOTM1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1JDVVJMWV9pbl9kZWZfY2hvaWNlX2ltcGwxMTkzNQk9IHsgRk9MTE9XX1JDVVJMWV9pbl9kZWZfY2hvaWNlX2ltcGwxMTkzNV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV180MDRfaW5fZGVmX3VuaW9uMTE5NTAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzQwNF9pbl9kZWZfdW5pb24xMTk1MF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV180MDRfaW5fZGVmX3VuaW9uMTE5NTAJPSB7IEZPTExPV180MDRfaW5fZGVmX3VuaW9uMTE5NTBfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfSURfaW5fZGVmX3VuaW9uMTE5NTUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0lEX2luX2RlZl91bmlvbjExOTU1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0lEX2luX2RlZl91bmlvbjExOTU1CT0geyBGT0xMT1dfSURfaW5fZGVmX3VuaW9uMTE5NTVfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX3VuaW9uX2ltcGxfaW5fZGVmX3VuaW9uMTE5NjAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlZl91bmlvbl9pbXBsX2luX2RlZl91bmlvbjExOTYwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl91bmlvbl9pbXBsX2luX2RlZl91bmlvbjExOTYwCT0geyBGT0xMT1dfZGVmX3VuaW9uX2ltcGxfaW5fZGVmX3VuaW9uMTE5NjBfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTENVUkxZX2luX2RlZl91bmlvbl9pbXBsMTE5ODAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xDVVJMWV9pbl9kZWZfdW5pb25faW1wbDExOTgwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA4MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHg0MDAyMDQwMDA0MDAwMDQ4KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgxMDAwMTIwODIwMjAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDRDNDAwODAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xDVVJMWV9pbl9kZWZfdW5pb25faW1wbDExOTgwCT0geyBGT0xMT1dfTENVUkxZX2luX2RlZl91bmlvbl9pbXBsMTE5ODBfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfbW9kaWZpZXJfZGVjbGFyYXRpb25faW5fZGVmX3VuaW9uX2ltcGwxMTk5NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfbW9kaWZpZXJfZGVjbGFyYXRpb25faW5fZGVmX3VuaW9uX2ltcGwxMTk5Nl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4NDAwMDAwMDAwMDAwMDA0OCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwQzAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19tb2RpZmllcl9kZWNsYXJhdGlvbl9pbl9kZWZfdW5pb25faW1wbDExOTk2CT0geyBGT0xMT1dfbW9kaWZpZXJfZGVjbGFyYXRpb25faW5fZGVmX3VuaW9uX2ltcGwxMTk5Nl9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWNsX3ZhcmlhYmxlX2luX2RlZl91bmlvbl9pbXBsMTIwMTEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlY2xfdmFyaWFibGVfaW5fZGVmX3VuaW9uX2ltcGwxMjAxMV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwODAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4NDAwMjA0MDAwNDAwMDA0OCksIEFOVExSM19VSU5UNjRfTElUKDB4MTAwMDEyMDgyMDIwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDA0QzQwMDgwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWNsX3ZhcmlhYmxlX2luX2RlZl91bmlvbl9pbXBsMTIwMTEJPSB7IEZPTExPV19kZWNsX3ZhcmlhYmxlX2luX2RlZl91bmlvbl9pbXBsMTIwMTFfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfUkNVUkxZX2luX2RlZl91bmlvbl9pbXBsMTIwMjUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1JDVVJMWV9pbl9kZWZfdW5pb25faW1wbDEyMDI1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1JDVVJMWV9pbl9kZWZfdW5pb25faW1wbDEyMDI1CT0geyBGT0xMT1dfUkNVUkxZX2luX2RlZl91bmlvbl9pbXBsMTIwMjVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjg4X2luX2RlZl9tZXRob2QxMjAzOCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjg4X2luX2RlZl9tZXRob2QxMjAzOF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yODhfaW5fZGVmX21ldGhvZDEyMDM4CT0geyBGT0xMT1dfMjg4X2luX2RlZl9tZXRob2QxMjAzOF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19JRF9pbl9kZWZfbWV0aG9kMTIwNDEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0lEX2luX2RlZl9tZXRob2QxMjA0MV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JRF9pbl9kZWZfbWV0aG9kMTIwNDEJPSB7IEZPTExPV19JRF9pbl9kZWZfbWV0aG9kMTIwNDFfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTFBBUkVOX2luX2RlZl9tZXRob2QxMjA0NCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTFBBUkVOX2luX2RlZl9tZXRob2QxMjA0NF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4QzI2NjAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MzhFMDAwMDAwQTAwQzEyOCksIEFOVExSM19VSU5UNjRfTElUKDB4MDA2NDAxNjAwNzAwMjI2MSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAxM0E3ODEwOCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MUEFSRU5faW5fZGVmX21ldGhvZDEyMDQ0CT0geyBGT0xMT1dfTFBBUkVOX2luX2RlZl9tZXRob2QxMjA0NF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWNsX3BhcmFtZXRlcnNfaW5fZGVmX21ldGhvZDEyMDQ3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWNsX3BhcmFtZXRlcnNfaW5fZGVmX21ldGhvZDEyMDQ3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlY2xfcGFyYW1ldGVyc19pbl9kZWZfbWV0aG9kMTIwNDcJPSB7IEZPTExPV19kZWNsX3BhcmFtZXRlcnNfaW5fZGVmX21ldGhvZDEyMDQ3X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1JQQVJFTl9pbl9kZWZfbWV0aG9kMTIwNTIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1JQQVJFTl9pbl9kZWZfbWV0aG9kMTIwNTJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweEMyNjYwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDM4RTAwMDAwMEEwMEMxMjgpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwNjQwMTYwMDcwMDIyNjEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMTNBNzgxMDgpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUlBBUkVOX2luX2RlZl9tZXRob2QxMjA1Mgk9IHsgRk9MTE9XX1JQQVJFTl9pbl9kZWZfbWV0aG9kMTIwNTJfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfdHlwZV92YXJfaW5fZGVmX21ldGhvZDEyMDU3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV190eXBlX3Zhcl9pbl9kZWZfbWV0aG9kMTIwNTdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfdHlwZV92YXJfaW5fZGVmX21ldGhvZDEyMDU3CT0geyBGT0xMT1dfdHlwZV92YXJfaW5fZGVmX21ldGhvZDEyMDU3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3R5cGVfdmFyX2luX2RlY2xfcGFyYW1ldGVyczEyMDcxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV190eXBlX3Zhcl9pbl9kZWNsX3BhcmFtZXRlcnMxMjA3MV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV190eXBlX3Zhcl9pbl9kZWNsX3BhcmFtZXRlcnMxMjA3MQk9IHsgRk9MTE9XX3R5cGVfdmFyX2luX2RlY2xfcGFyYW1ldGVyczEyMDcxX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lEX2luX2RlY2xfcGFyYW1ldGVyczEyMDczICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19JRF9pbl9kZWNsX3BhcmFtZXRlcnMxMjA3M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDgwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JRF9pbl9kZWNsX3BhcmFtZXRlcnMxMjA3Mwk9IHsgRk9MTE9XX0lEX2luX2RlY2xfcGFyYW1ldGVyczEyMDczX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0NPTU1BX2luX2RlY2xfcGFyYW1ldGVyczEyMDc3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19DT01NQV9pbl9kZWNsX3BhcmFtZXRlcnMxMjA3N19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4QzI2NjAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MzhFMDAwMDAwQTAwQzEyOCksIEFOVExSM19VSU5UNjRfTElUKDB4MDA2NDAxNjAwNzAwMjI2MSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAxM0E3ODEwOCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19DT01NQV9pbl9kZWNsX3BhcmFtZXRlcnMxMjA3Nwk9IHsgRk9MTE9XX0NPTU1BX2luX2RlY2xfcGFyYW1ldGVyczEyMDc3X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3R5cGVfdmFyX2luX2RlY2xfcGFyYW1ldGVyczEyMDc5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV190eXBlX3Zhcl9pbl9kZWNsX3BhcmFtZXRlcnMxMjA3OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV190eXBlX3Zhcl9pbl9kZWNsX3BhcmFtZXRlcnMxMjA3OQk9IHsgRk9MTE9XX3R5cGVfdmFyX2luX2RlY2xfcGFyYW1ldGVyczEyMDc5X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lEX2luX2RlY2xfcGFyYW1ldGVyczEyMDgxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19JRF9pbl9kZWNsX3BhcmFtZXRlcnMxMjA4MV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDgwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JRF9pbl9kZWNsX3BhcmFtZXRlcnMxMjA4MQk9IHsgRk9MTE9XX0lEX2luX2RlY2xfcGFyYW1ldGVyczEyMDgxX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzM5OF9pbl9kZWZfdHlwZTEyMDk5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zOThfaW5fZGVmX3R5cGUxMjA5OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDEwMDAwNiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDEwMDAxMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zOThfaW5fZGVmX3R5cGUxMjA5OQk9IHsgRk9MTE9XXzM5OF9pbl9kZWZfdHlwZTEyMDk5X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2RlZl90eXBlX2ltcGxfaW5fZGVmX3R5cGUxMjEwMiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX3R5cGVfaW1wbF9pbl9kZWZfdHlwZTEyMTAyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl90eXBlX2ltcGxfaW5fZGVmX3R5cGUxMjEwMgk9IHsgRk9MTE9XX2RlZl90eXBlX2ltcGxfaW5fZGVmX3R5cGUxMjEwMl9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfdHlwZV9hdG9tX2ltcGxfaW5fZGVmX3R5cGVfaW1wbDEyMTE3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWZfdHlwZV9hdG9tX2ltcGxfaW5fZGVmX3R5cGVfaW1wbDEyMTE3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl90eXBlX2F0b21faW1wbF9pbl9kZWZfdHlwZV9pbXBsMTIxMTcJPSB7IEZPTExPV19kZWZfdHlwZV9hdG9tX2ltcGxfaW5fZGVmX3R5cGVfaW1wbDEyMTE3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xDVVJMWV9pbl9kZWZfdHlwZV9pbXBsMTIxMjQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xDVVJMWV9pbl9kZWZfdHlwZV9pbXBsMTIxMjRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAxMDAwMDYpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAxMDAwMTApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTENVUkxZX2luX2RlZl90eXBlX2ltcGwxMjEyNAk9IHsgRk9MTE9XX0xDVVJMWV9pbl9kZWZfdHlwZV9pbXBsMTIxMjRfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX3R5cGVfYXRvbV9pbXBsX2luX2RlZl90eXBlX2ltcGwxMjEzMSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX3R5cGVfYXRvbV9pbXBsX2luX2RlZl90eXBlX2ltcGwxMjEzMV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDEwMDAwNiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDEwMDAxMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWZfdHlwZV9hdG9tX2ltcGxfaW5fZGVmX3R5cGVfaW1wbDEyMTMxCT0geyBGT0xMT1dfZGVmX3R5cGVfYXRvbV9pbXBsX2luX2RlZl90eXBlX2ltcGwxMjEzMV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19SQ1VSTFlfaW5fZGVmX3R5cGVfaW1wbDEyMTQwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19SQ1VSTFlfaW5fZGVmX3R5cGVfaW1wbDEyMTQwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1JDVVJMWV9pbl9kZWZfdHlwZV9pbXBsMTIxNDAJPSB7IEZPTExPV19SQ1VSTFlfaW5fZGVmX3R5cGVfaW1wbDEyMTQwX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lEX2luX2RlZl90eXBlX2F0b21faW1wbDEyMTYxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19JRF9pbl9kZWZfdHlwZV9hdG9tX2ltcGwxMjE2MV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4QzI2NjAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MzhFMDAwMDAwQTEwQzEyRSksIEFOVExSM19VSU5UNjRfTElUKDB4MDA2NDAxNjAwNzAwMjI2MSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAxM0I3ODExOCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JRF9pbl9kZWZfdHlwZV9hdG9tX2ltcGwxMjE2MQk9IHsgRk9MTE9XX0lEX2luX2RlZl90eXBlX2F0b21faW1wbDEyMTYxX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2Jhc2VfdHlwZV92YXJfaW5fZGVmX3R5cGVfYXRvbV9pbXBsMTIxNzAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2Jhc2VfdHlwZV92YXJfaW5fZGVmX3R5cGVfYXRvbV9pbXBsMTIxNzBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDEwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfYmFzZV90eXBlX3Zhcl9pbl9kZWZfdHlwZV9hdG9tX2ltcGwxMjE3MAk9IHsgRk9MTE9XX2Jhc2VfdHlwZV92YXJfaW5fZGVmX3R5cGVfYXRvbV9pbXBsMTIxNzBfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX3R5cGVfYXJyYXlfaW5fZGVmX3R5cGVfYXRvbV9pbXBsMTIxODUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlZl90eXBlX2FycmF5X2luX2RlZl90eXBlX2F0b21faW1wbDEyMTg1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl90eXBlX2FycmF5X2luX2RlZl90eXBlX2F0b21faW1wbDEyMTg1CT0geyBGT0xMT1dfZGVmX3R5cGVfYXJyYXlfaW5fZGVmX3R5cGVfYXRvbV9pbXBsMTIxODVfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX3R5cGVkZWZfY29uc3RyYWludF9pbl9kZWZfdHlwZV9hdG9tX2ltcGwxMjIyMiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX3R5cGVkZWZfY29uc3RyYWludF9pbl9kZWZfdHlwZV9hdG9tX2ltcGwxMjIyMl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWZfdHlwZWRlZl9jb25zdHJhaW50X2luX2RlZl90eXBlX2F0b21faW1wbDEyMjIyCT0geyBGT0xMT1dfZGVmX3R5cGVkZWZfY29uc3RyYWludF9pbl9kZWZfdHlwZV9hdG9tX2ltcGwxMjIyMl9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TRU1JX2luX2RlZl90eXBlX2F0b21faW1wbDEyMjI3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19TRU1JX2luX2RlZl90eXBlX2F0b21faW1wbDEyMjI3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1NFTUlfaW5fZGVmX3R5cGVfYXRvbV9pbXBsMTIyMjcJPSB7IEZPTExPV19TRU1JX2luX2RlZl90eXBlX2F0b21faW1wbDEyMjI3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2RlZl90eXBlX2NvbnRhaW5lcl9pbl9kZWZfdHlwZV9hdG9tX2ltcGwxMjI0MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX3R5cGVfY29udGFpbmVyX2luX2RlZl90eXBlX2F0b21faW1wbDEyMjQwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl90eXBlX2NvbnRhaW5lcl9pbl9kZWZfdHlwZV9hdG9tX2ltcGwxMjI0MAk9IHsgRk9MTE9XX2RlZl90eXBlX2NvbnRhaW5lcl9pbl9kZWZfdHlwZV9hdG9tX2ltcGwxMjI0MF9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfdHlwZWRlZl9jb25zdHJhaW50X2luX2RlZl90eXBlX2F0b21faW1wbDEyMjUzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWZfdHlwZWRlZl9jb25zdHJhaW50X2luX2RlZl90eXBlX2F0b21faW1wbDEyMjUzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl90eXBlZGVmX2NvbnN0cmFpbnRfaW5fZGVmX3R5cGVfYXRvbV9pbXBsMTIyNTMJPSB7IEZPTExPV19kZWZfdHlwZWRlZl9jb25zdHJhaW50X2luX2RlZl90eXBlX2F0b21faW1wbDEyMjUzX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1NFTUlfaW5fZGVmX3R5cGVfYXRvbV9pbXBsMTIyNTggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1NFTUlfaW5fZGVmX3R5cGVfYXRvbV9pbXBsMTIyNThfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU0VNSV9pbl9kZWZfdHlwZV9hdG9tX2ltcGwxMjI1OAk9IHsgRk9MTE9XX1NFTUlfaW5fZGVmX3R5cGVfYXRvbV9pbXBsMTIyNThfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX3R5cGVfaW50ZXJ2YWxfaW5fZGVmX3R5cGVfYXRvbV9pbXBsMTIyNzEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlZl90eXBlX2ludGVydmFsX2luX2RlZl90eXBlX2F0b21faW1wbDEyMjcxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl90eXBlX2ludGVydmFsX2luX2RlZl90eXBlX2F0b21faW1wbDEyMjcxCT0geyBGT0xMT1dfZGVmX3R5cGVfaW50ZXJ2YWxfaW5fZGVmX3R5cGVfYXRvbV9pbXBsMTIyNzFfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfU0VNSV9pbl9kZWZfdHlwZV9hdG9tX2ltcGwxMjI3NCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU0VNSV9pbl9kZWZfdHlwZV9hdG9tX2ltcGwxMjI3NF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19TRU1JX2luX2RlZl90eXBlX2F0b21faW1wbDEyMjc0CT0geyBGT0xMT1dfU0VNSV9pbl9kZWZfdHlwZV9hdG9tX2ltcGwxMjI3NF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yNzZfaW5fZGVmX3R5cGVfYXRvbV9pbXBsMTIyODcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzI3Nl9pbl9kZWZfdHlwZV9hdG9tX2ltcGwxMjI4N19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMSkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yNzZfaW5fZGVmX3R5cGVfYXRvbV9pbXBsMTIyODcJPSB7IEZPTExPV18yNzZfaW5fZGVmX3R5cGVfYXRvbV9pbXBsMTIyODdfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX2VudW1faW1wbF9pbl9kZWZfdHlwZV9hdG9tX2ltcGwxMjI5NCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX2VudW1faW1wbF9pbl9kZWZfdHlwZV9hdG9tX2ltcGwxMjI5NF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWZfZW51bV9pbXBsX2luX2RlZl90eXBlX2F0b21faW1wbDEyMjk0CT0geyBGT0xMT1dfZGVmX2VudW1faW1wbF9pbl9kZWZfdHlwZV9hdG9tX2ltcGwxMjI5NF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV180MDRfaW5fZGVmX3R5cGVfYXRvbV9pbXBsMTIzMDMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzQwNF9pbl9kZWZfdHlwZV9hdG9tX2ltcGwxMjMwM19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMSkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV180MDRfaW5fZGVmX3R5cGVfYXRvbV9pbXBsMTIzMDMJPSB7IEZPTExPV180MDRfaW5fZGVmX3R5cGVfYXRvbV9pbXBsMTIzMDNfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX3VuaW9uX2ltcGxfaW5fZGVmX3R5cGVfYXRvbV9pbXBsMTIzMTAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlZl91bmlvbl9pbXBsX2luX2RlZl90eXBlX2F0b21faW1wbDEyMzEwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl91bmlvbl9pbXBsX2luX2RlZl90eXBlX2F0b21faW1wbDEyMzEwCT0geyBGT0xMT1dfZGVmX3VuaW9uX2ltcGxfaW5fZGVmX3R5cGVfYXRvbV9pbXBsMTIzMTBfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjU3X2luX2RlZl90eXBlX2F0b21faW1wbDEyMzE5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yNTdfaW5fZGVmX3R5cGVfYXRvbV9pbXBsMTIzMTlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDEpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjU3X2luX2RlZl90eXBlX2F0b21faW1wbDEyMzE5CT0geyBGT0xMT1dfMjU3X2luX2RlZl90eXBlX2F0b21faW1wbDEyMzE5X2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2RlZl9jaG9pY2VfaW1wbF9pbl9kZWZfdHlwZV9hdG9tX2ltcGwxMjMyNiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX2Nob2ljZV9pbXBsX2luX2RlZl90eXBlX2F0b21faW1wbDEyMzI2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl9jaG9pY2VfaW1wbF9pbl9kZWZfdHlwZV9hdG9tX2ltcGwxMjMyNgk9IHsgRk9MTE9XX2RlZl9jaG9pY2VfaW1wbF9pbl9kZWZfdHlwZV9hdG9tX2ltcGwxMjMyNl9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zZXRfaW5fZGVmX3R5cGVfYXRvbV9pbXBsMTIzMzUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NldF9pbl9kZWZfdHlwZV9hdG9tX2ltcGwxMjMzNV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMSkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZXRfaW5fZGVmX3R5cGVfYXRvbV9pbXBsMTIzMzUJPSB7IEZPTExPV19zZXRfaW5fZGVmX3R5cGVfYXRvbV9pbXBsMTIzMzVfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX2NsYXNzX3N0cnVjdHVyZV9pbXBsX2luX2RlZl90eXBlX2F0b21faW1wbDEyMzUwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWZfY2xhc3Nfc3RydWN0dXJlX2ltcGxfaW5fZGVmX3R5cGVfYXRvbV9pbXBsMTIzNTBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX2NsYXNzX3N0cnVjdHVyZV9pbXBsX2luX2RlZl90eXBlX2F0b21faW1wbDEyMzUwCT0geyBGT0xMT1dfZGVmX2NsYXNzX3N0cnVjdHVyZV9pbXBsX2luX2RlZl90eXBlX2F0b21faW1wbDEyMzUwX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2RlZl9lbnVtX2luX2RlZl90eXBlX2F0b21faW1wbDEyMzYyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWZfZW51bV9pbl9kZWZfdHlwZV9hdG9tX2ltcGwxMjM2Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWZfZW51bV9pbl9kZWZfdHlwZV9hdG9tX2ltcGwxMjM2Mgk9IHsgRk9MTE9XX2RlZl9lbnVtX2luX2RlZl90eXBlX2F0b21faW1wbDEyMzYyX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2RlZl91bmlvbl9pbl9kZWZfdHlwZV9hdG9tX2ltcGwxMjM3MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX3VuaW9uX2luX2RlZl90eXBlX2F0b21faW1wbDEyMzcwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl91bmlvbl9pbl9kZWZfdHlwZV9hdG9tX2ltcGwxMjM3MAk9IHsgRk9MTE9XX2RlZl91bmlvbl9pbl9kZWZfdHlwZV9hdG9tX2ltcGwxMjM3MF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfY2hvaWNlX2luX2RlZl90eXBlX2F0b21faW1wbDEyMzc3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWZfY2hvaWNlX2luX2RlZl90eXBlX2F0b21faW1wbDEyMzc3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl9jaG9pY2VfaW5fZGVmX3R5cGVfYXRvbV9pbXBsMTIzNzcJPSB7IEZPTExPV19kZWZfY2hvaWNlX2luX2RlZl90eXBlX2F0b21faW1wbDEyMzc3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2RlZl9zdHJ1Y3RfaW5fZGVmX3R5cGVfYXRvbV9pbXBsMTIzODMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlZl9zdHJ1Y3RfaW5fZGVmX3R5cGVfYXRvbV9pbXBsMTIzODNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX3N0cnVjdF9pbl9kZWZfdHlwZV9hdG9tX2ltcGwxMjM4Mwk9IHsgRk9MTE9XX2RlZl9zdHJ1Y3RfaW5fZGVmX3R5cGVfYXRvbV9pbXBsMTIzODNfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTENVUkxZX2luX2RlZl90eXBlZGVmX2NvbnN0cmFpbnQxMjQwNSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTENVUkxZX2luX2RlZl90eXBlZGVmX2NvbnN0cmFpbnQxMjQwNV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMTAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MQ1VSTFlfaW5fZGVmX3R5cGVkZWZfY29uc3RyYWludDEyNDA1CT0geyBGT0xMT1dfTENVUkxZX2luX2RlZl90eXBlZGVmX2NvbnN0cmFpbnQxMjQwNV9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18xNzZfaW5fZGVmX3R5cGVkZWZfY29uc3RyYWludDEyNDA5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18xNzZfaW5fZGVmX3R5cGVkZWZfY29uc3RyYWludDEyNDA5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMjAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE3Nl9pbl9kZWZfdHlwZWRlZl9jb25zdHJhaW50MTI0MDkJPSB7IEZPTExPV18xNzZfaW5fZGVmX3R5cGVkZWZfY29uc3RyYWludDEyNDA5X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3JvdXRpbmVfc2luZ2xlX3BhcmFtX2luX2RlZl90eXBlZGVmX2NvbnN0cmFpbnQxMjQyNSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfcm91dGluZV9zaW5nbGVfcGFyYW1faW5fZGVmX3R5cGVkZWZfY29uc3RyYWludDEyNDI1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMjAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3JvdXRpbmVfc2luZ2xlX3BhcmFtX2luX2RlZl90eXBlZGVmX2NvbnN0cmFpbnQxMjQyNQk9IHsgRk9MTE9XX3JvdXRpbmVfc2luZ2xlX3BhcmFtX2luX2RlZl90eXBlZGVmX2NvbnN0cmFpbnQxMjQyNV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19ibG9ja19zdGF0ZW1lbnRfaW5fZGVmX3R5cGVkZWZfY29uc3RyYWludDEyNDQwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19ibG9ja19zdGF0ZW1lbnRfaW5fZGVmX3R5cGVkZWZfY29uc3RyYWludDEyNDQwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfdHlwZWRlZl9jb25zdHJhaW50MTI0NDAJPSB7IEZPTExPV19ibG9ja19zdGF0ZW1lbnRfaW5fZGVmX3R5cGVkZWZfY29uc3RyYWludDEyNDQwX2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzQxN19pbl9kZWZfdHlwZWRlZl9jb25zdHJhaW50MTI0NTIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzQxN19pbl9kZWZfdHlwZWRlZl9jb25zdHJhaW50MTI0NTJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfNDE3X2luX2RlZl90eXBlZGVmX2NvbnN0cmFpbnQxMjQ1Mgk9IHsgRk9MTE9XXzQxN19pbl9kZWZfdHlwZWRlZl9jb25zdHJhaW50MTI0NTJfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfY29uZGl0aW9uYWxFeHByZXNzaW9uX2luX2RlZl90eXBlZGVmX2NvbnN0cmFpbnQxMjQ1NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfY29uZGl0aW9uYWxFeHByZXNzaW9uX2luX2RlZl90eXBlZGVmX2NvbnN0cmFpbnQxMjQ1Nl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19jb25kaXRpb25hbEV4cHJlc3Npb25faW5fZGVmX3R5cGVkZWZfY29uc3RyYWludDEyNDU2CT0geyBGT0xMT1dfY29uZGl0aW9uYWxFeHByZXNzaW9uX2luX2RlZl90eXBlZGVmX2NvbnN0cmFpbnQxMjQ1Nl9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TRU1JX2luX2RlZl90eXBlZGVmX2NvbnN0cmFpbnQxMjQ1OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU0VNSV9pbl9kZWZfdHlwZWRlZl9jb25zdHJhaW50MTI0NThfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDIwMDAwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU0VNSV9pbl9kZWZfdHlwZWRlZl9jb25zdHJhaW50MTI0NTgJPSB7IEZPTExPV19TRU1JX2luX2RlZl90eXBlZGVmX2NvbnN0cmFpbnQxMjQ1OF9iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19SQ1VSTFlfaW5fZGVmX3R5cGVkZWZfY29uc3RyYWludDEyNDc5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19SQ1VSTFlfaW5fZGVmX3R5cGVkZWZfY29uc3RyYWludDEyNDc5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1JDVVJMWV9pbl9kZWZfdHlwZWRlZl9jb25zdHJhaW50MTI0NzkJPSB7IEZPTExPV19SQ1VSTFlfaW5fZGVmX3R5cGVkZWZfY29uc3RyYWludDEyNDc5X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzM5Ml9pbl90aW1lX3R5cGUxMjUwNSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzkyX2luX3RpbWVfdHlwZTEyNTA1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDYwMDAwMDA4MDA0MDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDE2MDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAzODc4MDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzM5Ml9pbl90aW1lX3R5cGUxMjUwNQk9IHsgRk9MTE9XXzM5Ml9pbl90aW1lX3R5cGUxMjUwNV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yNjRfaW5fdGltZV90eXBlMTI1MTYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzI2NF9pbl90aW1lX3R5cGUxMjUxNl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDA2MDAwMDAwODAwNDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAxNjAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMzg3ODAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yNjRfaW5fdGltZV90eXBlMTI1MTYJPSB7IEZPTExPV18yNjRfaW5fdGltZV90eXBlMTI1MTZfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjcxX2luX3RpbWVfdHlwZTEyNTI2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yNzFfaW5fdGltZV90eXBlMTI1MjZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwNjAwMDAwMDgwMDQwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMTYwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDM4NzgwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjcxX2luX3RpbWVfdHlwZTEyNTI2CT0geyBGT0xMT1dfMjcxX2luX3RpbWVfdHlwZTEyNTI2X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xUX19pbl90aW1lX3R5cGUxMjU0MSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTFRfX2luX3RpbWVfdHlwZTEyNTQxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDYwMDAwMDA4MDA0MDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDE2MDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAzODc4MDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xUX19pbl90aW1lX3R5cGUxMjU0MQk9IHsgRk9MTE9XX0xUX19pbl90aW1lX3R5cGUxMjU0MV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV190aW1lX3R5cGVfZG9tYWluX2luX3RpbWVfdHlwZTEyNTU3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV190aW1lX3R5cGVfZG9tYWluX2luX3RpbWVfdHlwZTEyNTU3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwODAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3RpbWVfdHlwZV9kb21haW5faW5fdGltZV90eXBlMTI1NTcJPSB7IEZPTExPV190aW1lX3R5cGVfZG9tYWluX2luX3RpbWVfdHlwZTEyNTU3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0NPTU1BX2luX3RpbWVfdHlwZTEyNTc4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19DT01NQV9pbl90aW1lX3R5cGUxMjU3OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDA4NDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19DT01NQV9pbl90aW1lX3R5cGUxMjU3OAk9IHsgRk9MTE9XX0NPTU1BX2luX3RpbWVfdHlwZTEyNTc4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fdGltZV90eXBlMTI1ODMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fdGltZV90eXBlMTI1ODNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfaW50ZWdlcl9jb25zdGFudF9pbl90aW1lX3R5cGUxMjU4Mwk9IHsgRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fdGltZV90eXBlMTI1ODNfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfR1RfaW5fdGltZV90eXBlMTI1OTUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0dUX2luX3RpbWVfdHlwZTEyNTk1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0dUX2luX3RpbWVfdHlwZTEyNTk1CT0geyBGT0xMT1dfR1RfaW5fdGltZV90eXBlMTI1OTVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfdGltZV90eXBlX2RvbWFpbl9pbl90aW1lX3R5cGUxMjYxMSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfdGltZV90eXBlX2RvbWFpbl9pbl90aW1lX3R5cGUxMjYxMV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV190aW1lX3R5cGVfZG9tYWluX2luX3RpbWVfdHlwZTEyNjExCT0geyBGT0xMT1dfdGltZV90eXBlX2RvbWFpbl9pbl90aW1lX3R5cGUxMjYxMV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yNTlfaW5fdGltZV9jbG9ja190eXBlMTI2NDIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzI1OV9pbl90aW1lX2Nsb2NrX3R5cGUxMjY0Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDA2MDAwMDAwODAwQzEwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAxNjAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMzg3ODEwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yNTlfaW5fdGltZV9jbG9ja190eXBlMTI2NDIJPSB7IEZPTExPV18yNTlfaW5fdGltZV9jbG9ja190eXBlMTI2NDJfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTFRfX2luX3RpbWVfY2xvY2tfdHlwZTEyNjUyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MVF9faW5fdGltZV9jbG9ja190eXBlMTI2NTJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwNjAwMDAwMDgwMEMxMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMTYwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDM4NzgxMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTFRfX2luX3RpbWVfY2xvY2tfdHlwZTEyNjUyCT0geyBGT0xMT1dfTFRfX2luX3RpbWVfY2xvY2tfdHlwZTEyNjUyX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzM5Ml9pbl90aW1lX2Nsb2NrX3R5cGUxMjY1OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzkyX2luX3RpbWVfY2xvY2tfdHlwZTEyNjU4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwODAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzM5Ml9pbl90aW1lX2Nsb2NrX3R5cGUxMjY1OAk9IHsgRk9MTE9XXzM5Ml9pbl90aW1lX2Nsb2NrX3R5cGUxMjY1OF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yNjRfaW5fdGltZV9jbG9ja190eXBlMTI2NjggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzI2NF9pbl90aW1lX2Nsb2NrX3R5cGUxMjY2OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDgwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yNjRfaW5fdGltZV9jbG9ja190eXBlMTI2NjgJPSB7IEZPTExPV18yNjRfaW5fdGltZV9jbG9ja190eXBlMTI2NjhfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjcxX2luX3RpbWVfY2xvY2tfdHlwZTEyNjc3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yNzFfaW5fdGltZV9jbG9ja190eXBlMTI2NzdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDA4MDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjcxX2luX3RpbWVfY2xvY2tfdHlwZTEyNjc3CT0geyBGT0xMT1dfMjcxX2luX3RpbWVfY2xvY2tfdHlwZTEyNjc3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3RpbWVfdHlwZV9kb21haW5faW5fdGltZV9jbG9ja190eXBlMTI2ODggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3RpbWVfdHlwZV9kb21haW5faW5fdGltZV9jbG9ja190eXBlMTI2ODhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDA4MDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfdGltZV90eXBlX2RvbWFpbl9pbl90aW1lX2Nsb2NrX3R5cGUxMjY4OAk9IHsgRk9MTE9XX3RpbWVfdHlwZV9kb21haW5faW5fdGltZV9jbG9ja190eXBlMTI2ODhfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfQ09NTUFfaW5fdGltZV9jbG9ja190eXBlMTI3MDAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0NPTU1BX2luX3RpbWVfY2xvY2tfdHlwZTEyNzAwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDg0MDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0NPTU1BX2luX3RpbWVfY2xvY2tfdHlwZTEyNzAwCT0geyBGT0xMT1dfQ09NTUFfaW5fdGltZV9jbG9ja190eXBlMTI3MDBfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfaW50ZWdlcl9jb25zdGFudF9pbl90aW1lX2Nsb2NrX3R5cGUxMjcwNSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfaW50ZWdlcl9jb25zdGFudF9pbl90aW1lX2Nsb2NrX3R5cGUxMjcwNV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19pbnRlZ2VyX2NvbnN0YW50X2luX3RpbWVfY2xvY2tfdHlwZTEyNzA1CT0geyBGT0xMT1dfaW50ZWdlcl9jb25zdGFudF9pbl90aW1lX2Nsb2NrX3R5cGUxMjcwNV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19HVF9pbl90aW1lX2Nsb2NrX3R5cGUxMjcxNyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfR1RfaW5fdGltZV9jbG9ja190eXBlMTI3MTdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfR1RfaW5fdGltZV9jbG9ja190eXBlMTI3MTcJPSB7IEZPTExPV19HVF9pbl90aW1lX2Nsb2NrX3R5cGUxMjcxN19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zOTJfaW5fdGltZV9jbG9ja190eXBlMTI3MzMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzM5Ml9pbl90aW1lX2Nsb2NrX3R5cGUxMjczM19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDgwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zOTJfaW5fdGltZV9jbG9ja190eXBlMTI3MzMJPSB7IEZPTExPV18zOTJfaW5fdGltZV9jbG9ja190eXBlMTI3MzNfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjY0X2luX3RpbWVfY2xvY2tfdHlwZTEyNzQzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yNjRfaW5fdGltZV9jbG9ja190eXBlMTI3NDNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA4MDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjY0X2luX3RpbWVfY2xvY2tfdHlwZTEyNzQzCT0geyBGT0xMT1dfMjY0X2luX3RpbWVfY2xvY2tfdHlwZTEyNzQzX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzI3MV9pbl90aW1lX2Nsb2NrX3R5cGUxMjc1MiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjcxX2luX3RpbWVfY2xvY2tfdHlwZTEyNzUyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwODAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzI3MV9pbl90aW1lX2Nsb2NrX3R5cGUxMjc1Mgk9IHsgRk9MTE9XXzI3MV9pbl90aW1lX2Nsb2NrX3R5cGUxMjc1Ml9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV190aW1lX3R5cGVfZG9tYWluX2luX3RpbWVfY2xvY2tfdHlwZTEyNzYzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV190aW1lX3R5cGVfZG9tYWluX2luX3RpbWVfY2xvY2tfdHlwZTEyNzYzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwODAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3RpbWVfdHlwZV9kb21haW5faW5fdGltZV9jbG9ja190eXBlMTI3NjMJPSB7IEZPTExPV190aW1lX3R5cGVfZG9tYWluX2luX3RpbWVfY2xvY2tfdHlwZTEyNzYzX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0NPTU1BX2luX3RpbWVfY2xvY2tfdHlwZTEyNzc1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19DT01NQV9pbl90aW1lX2Nsb2NrX3R5cGUxMjc3NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDA4NDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19DT01NQV9pbl90aW1lX2Nsb2NrX3R5cGUxMjc3NQk9IHsgRk9MTE9XX0NPTU1BX2luX3RpbWVfY2xvY2tfdHlwZTEyNzc1X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fdGltZV9jbG9ja190eXBlMTI3ODAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fdGltZV9jbG9ja190eXBlMTI3ODBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfaW50ZWdlcl9jb25zdGFudF9pbl90aW1lX2Nsb2NrX3R5cGUxMjc4MAk9IHsgRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fdGltZV9jbG9ja190eXBlMTI3ODBfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2V0X2luX3RpbWVfdHlwZV9kb21haW4xMjgxNCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2V0X2luX3RpbWVfdHlwZV9kb21haW4xMjgxNF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZXRfaW5fdGltZV90eXBlX2RvbWFpbjEyODE0CT0geyBGT0xMT1dfc2V0X2luX3RpbWVfdHlwZV9kb21haW4xMjgxNF9iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MVF9faW5fdGltZV90eXBlX2RvbWFpbjEyODM0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MVF9faW5fdGltZV90eXBlX2RvbWFpbjEyODM0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDg0MDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xUX19pbl90aW1lX3R5cGVfZG9tYWluMTI4MzQJPSB7IEZPTExPV19MVF9faW5fdGltZV90eXBlX2RvbWFpbjEyODM0X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fdGltZV90eXBlX2RvbWFpbjEyODQzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19pbnRlZ2VyX2NvbnN0YW50X2luX3RpbWVfdHlwZV9kb21haW4xMjg0M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19pbnRlZ2VyX2NvbnN0YW50X2luX3RpbWVfdHlwZV9kb21haW4xMjg0Mwk9IHsgRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fdGltZV90eXBlX2RvbWFpbjEyODQzX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0dUX2luX3RpbWVfdHlwZV9kb21haW4xMjg1NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfR1RfaW5fdGltZV90eXBlX2RvbWFpbjEyODU2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0dUX2luX3RpbWVfdHlwZV9kb21haW4xMjg1Ngk9IHsgRk9MTE9XX0dUX2luX3RpbWVfdHlwZV9kb21haW4xMjg1Nl9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zZXRfaW5fdGltZV90eXBlX2RvbWFpbjEyODY1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zZXRfaW5fdGltZV90eXBlX2RvbWFpbjEyODY1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3NldF9pbl90aW1lX3R5cGVfZG9tYWluMTI4NjUJPSB7IEZPTExPV19zZXRfaW5fdGltZV90eXBlX2RvbWFpbjEyODY1X2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xUX19pbl90aW1lX3R5cGVfZG9tYWluMTI4ODUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xUX19pbl90aW1lX3R5cGVfZG9tYWluMTI4ODVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwODQwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTFRfX2luX3RpbWVfdHlwZV9kb21haW4xMjg4NQk9IHsgRk9MTE9XX0xUX19pbl90aW1lX3R5cGVfZG9tYWluMTI4ODVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfaW50ZWdlcl9jb25zdGFudF9pbl90aW1lX3R5cGVfZG9tYWluMTI4OTQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fdGltZV90eXBlX2RvbWFpbjEyODk0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fdGltZV90eXBlX2RvbWFpbjEyODk0CT0geyBGT0xMT1dfaW50ZWdlcl9jb25zdGFudF9pbl90aW1lX3R5cGVfZG9tYWluMTI4OTRfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfR1RfaW5fdGltZV90eXBlX2RvbWFpbjEyOTA3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19HVF9pbl90aW1lX3R5cGVfZG9tYWluMTI5MDdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfR1RfaW5fdGltZV90eXBlX2RvbWFpbjEyOTA3CT0geyBGT0xMT1dfR1RfaW5fdGltZV90eXBlX2RvbWFpbjEyOTA3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3NldF9pbl90aW1lX3R5cGVfZG9tYWluMTI5MTYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NldF9pbl90aW1lX3R5cGVfZG9tYWluMTI5MTZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2V0X2luX3RpbWVfdHlwZV9kb21haW4xMjkxNgk9IHsgRk9MTE9XX3NldF9pbl90aW1lX3R5cGVfZG9tYWluMTI5MTZfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2V0X2luX3RpbWVfdHlwZV9kb21haW4xMjkzNCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2V0X2luX3RpbWVfdHlwZV9kb21haW4xMjkzNF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZXRfaW5fdGltZV90eXBlX2RvbWFpbjEyOTM0CT0geyBGT0xMT1dfc2V0X2luX3RpbWVfdHlwZV9kb21haW4xMjkzNF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yODNfaW5fdGltZV90eXBlX2RvbWFpbjEyOTUxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yODNfaW5fdGltZV90eXBlX2RvbWFpbjEyOTUxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzI4M19pbl90aW1lX3R5cGVfZG9tYWluMTI5NTEJPSB7IEZPTExPV18yODNfaW5fdGltZV90eXBlX2RvbWFpbjEyOTUxX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzQwMF9pbl90aW1lX3R5cGVfZG9tYWluMTI5NjMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzQwMF9pbl90aW1lX3R5cGVfZG9tYWluMTI5NjNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfNDAwX2luX3RpbWVfdHlwZV9kb21haW4xMjk2Mwk9IHsgRk9MTE9XXzQwMF9pbl90aW1lX3R5cGVfZG9tYWluMTI5NjNfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjcwX2luX3RpbWVfdHlwZV9kb21haW4xMjk3NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjcwX2luX3RpbWVfdHlwZV9kb21haW4xMjk3NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yNzBfaW5fdGltZV90eXBlX2RvbWFpbjEyOTc1CT0geyBGT0xMT1dfMjcwX2luX3RpbWVfdHlwZV9kb21haW4xMjk3NV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zOTlfaW5fdGltZV90eXBlX2RvbWFpbjEyOTg2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zOTlfaW5fdGltZV90eXBlX2RvbWFpbjEyOTg2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzM5OV9pbl90aW1lX3R5cGVfZG9tYWluMTI5ODYJPSB7IEZPTExPV18zOTlfaW5fdGltZV90eXBlX2RvbWFpbjEyOTg2X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzM2MF9pbl90aW1lX3R5cGVfZG9tYWluMTI5OTcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzM2MF9pbl90aW1lX3R5cGVfZG9tYWluMTI5OTdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzYwX2luX3RpbWVfdHlwZV9kb21haW4xMjk5Nwk9IHsgRk9MTE9XXzM2MF9pbl90aW1lX3R5cGVfZG9tYWluMTI5OTdfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfNDA5X2luX3RpbWVfdHlwZV9kb21haW4xMzAxMCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfNDA5X2luX3RpbWVfdHlwZV9kb21haW4xMzAxMF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV180MDlfaW5fdGltZV90eXBlX2RvbWFpbjEzMDEwCT0geyBGT0xMT1dfNDA5X2luX3RpbWVfdHlwZV9kb21haW4xMzAxMF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yMDJfaW5fc2VjdGlvbl9tb2RlbF9vZl9jb21wdXRhdGlvbjEzMDQyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yMDJfaW5fc2VjdGlvbl9tb2RlbF9vZl9jb21wdXRhdGlvbjEzMDQyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzIwMl9pbl9zZWN0aW9uX21vZGVsX29mX2NvbXB1dGF0aW9uMTMwNDIJPSB7IEZPTExPV18yMDJfaW5fc2VjdGlvbl9tb2RlbF9vZl9jb21wdXRhdGlvbjEzMDQyX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzIyMl9pbl9zZWN0aW9uX3JvdXRpbmUxMzA2NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjIyX2luX3NlY3Rpb25fcm91dGluZTEzMDY2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHg0MDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwODAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzIyMl9pbl9zZWN0aW9uX3JvdXRpbmUxMzA2Ngk9IHsgRk9MTE9XXzIyMl9pbl9zZWN0aW9uX3JvdXRpbmUxMzA2Nl9iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yMDFfaW5fc2VjdGlvbl9yb3V0aW5lMTMwNzMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzIwMV9pbl9zZWN0aW9uX3JvdXRpbmUxMzA3M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4NDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDgwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yMDFfaW5fc2VjdGlvbl9yb3V0aW5lMTMwNzMJPSB7IEZPTExPV18yMDFfaW5fc2VjdGlvbl9yb3V0aW5lMTMwNzNfYml0cywgNgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX3JvdXRpbmVfbW9kZWxfaW5fc2VjdGlvbl9yb3V0aW5lMTMwODggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlZl9yb3V0aW5lX21vZGVsX2luX3NlY3Rpb25fcm91dGluZTEzMDg4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHg0MDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwODAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl9yb3V0aW5lX21vZGVsX2luX3NlY3Rpb25fcm91dGluZTEzMDg4CT0geyBGT0xMT1dfZGVmX3JvdXRpbmVfbW9kZWxfaW5fc2VjdGlvbl9yb3V0aW5lMTMwODhfYml0cywgNgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzY3X2luX2RlZl9yb3V0aW5lX21vZGVsMTMxMDcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzM2N19pbl9kZWZfcm91dGluZV9tb2RlbDEzMTA3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzM2N19pbl9kZWZfcm91dGluZV9tb2RlbDEzMTA3CT0geyBGT0xMT1dfMzY3X2luX2RlZl9yb3V0aW5lX21vZGVsMTMxMDdfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzE4X2luX2RlZl9yb3V0aW5lX21vZGVsMTMxMTQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzMxOF9pbl9kZWZfcm91dGluZV9tb2RlbDEzMTE0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwODAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzMxOF9pbl9kZWZfcm91dGluZV9tb2RlbDEzMTE0CT0geyBGT0xMT1dfMzE4X2luX2RlZl9yb3V0aW5lX21vZGVsMTMxMTRfYml0cywgNgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzY3X2luX2RlZl9yb3V0aW5lX21vZGVsMTMxMjcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzM2N19pbl9kZWZfcm91dGluZV9tb2RlbDEzMTI3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzM2N19pbl9kZWZfcm91dGluZV9tb2RlbDEzMTI3CT0geyBGT0xMT1dfMzY3X2luX2RlZl9yb3V0aW5lX21vZGVsMTMxMjdfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX3JvdXRpbmVfbW9kZWxfaW1wbF9pbl9kZWZfcm91dGluZV9tb2RlbDEzMTQxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWZfcm91dGluZV9tb2RlbF9pbXBsX2luX2RlZl9yb3V0aW5lX21vZGVsMTMxNDFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX3JvdXRpbmVfbW9kZWxfaW1wbF9pbl9kZWZfcm91dGluZV9tb2RlbDEzMTQxCT0geyBGT0xMT1dfZGVmX3JvdXRpbmVfbW9kZWxfaW1wbF9pbl9kZWZfcm91dGluZV9tb2RlbDEzMTQxX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lEX2luX2RlZl9yb3V0aW5lX21vZGVsX2ltcGwxMzE2NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfSURfaW5fZGVmX3JvdXRpbmVfbW9kZWxfaW1wbDEzMTY1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwODAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0lEX2luX2RlZl9yb3V0aW5lX21vZGVsX2ltcGwxMzE2NQk9IHsgRk9MTE9XX0lEX2luX2RlZl9yb3V0aW5lX21vZGVsX2ltcGwxMzE2NV9iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfcm91dGluZV9wYXJhbWV0ZXJzX2luX2RlZl9yb3V0aW5lX21vZGVsX2ltcGwxMzE3OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX3JvdXRpbmVfcGFyYW1ldGVyc19pbl9kZWZfcm91dGluZV9tb2RlbF9pbXBsMTMxNzhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA4MDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX3JvdXRpbmVfcGFyYW1ldGVyc19pbl9kZWZfcm91dGluZV9tb2RlbF9pbXBsMTMxNzgJPSB7IEZPTExPV19kZWZfcm91dGluZV9wYXJhbWV0ZXJzX2luX2RlZl9yb3V0aW5lX21vZGVsX2ltcGwxMzE3OF9iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zZXRfaW5fZGVmX3JvdXRpbmVfbW9kZWxfaW1wbDEzMTg5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zZXRfaW5fZGVmX3JvdXRpbmVfbW9kZWxfaW1wbDEzMTg5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHhDMjY2MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzOEUwMDAwMDBBMDBDMTI4KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDY0MDE2MDA3MDAyMjYxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDEzQTc4MTA4KSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3NldF9pbl9kZWZfcm91dGluZV9tb2RlbF9pbXBsMTMxODkJPSB7IEZPTExPV19zZXRfaW5fZGVmX3JvdXRpbmVfbW9kZWxfaW1wbDEzMTg5X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2RlZl9yb3V0aW5lX3JldHVybnNfaW5fZGVmX3JvdXRpbmVfbW9kZWxfaW1wbDEzMjAwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWZfcm91dGluZV9yZXR1cm5zX2luX2RlZl9yb3V0aW5lX21vZGVsX2ltcGwxMzIwMF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMSkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWZfcm91dGluZV9yZXR1cm5zX2luX2RlZl9yb3V0aW5lX21vZGVsX2ltcGwxMzIwMAk9IHsgRk9MTE9XX2RlZl9yb3V0aW5lX3JldHVybnNfaW5fZGVmX3JvdXRpbmVfbW9kZWxfaW1wbDEzMjAwX2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfcm91dGluZV9tb2RlbF9pbXBsMTMyMTIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfcm91dGluZV9tb2RlbF9pbXBsMTMyMTJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9yb3V0aW5lX21vZGVsX2ltcGwxMzIxMgk9IHsgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfcm91dGluZV9tb2RlbF9pbXBsMTMyMTJfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTFBBUkVOX2luX2RlZl9yb3V0aW5lX3BhcmFtZXRlcnMxMzIzMyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTFBBUkVOX2luX2RlZl9yb3V0aW5lX3BhcmFtZXRlcnMxMzIzM19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDI4MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMTAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwNTAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4QzI2RTAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4NzhFMjA0ODAwRTAwQzE2OCksIEFOVExSM19VSU5UNjRfTElUKDB4MDA2NDEzNjAwNzIwQTI2MSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAxM0E3ODEwOCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MUEFSRU5faW5fZGVmX3JvdXRpbmVfcGFyYW1ldGVyczEzMjMzCT0geyBGT0xMT1dfTFBBUkVOX2luX2RlZl9yb3V0aW5lX3BhcmFtZXRlcnMxMzIzM19iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfcm91dGluZV9wYXJhbV9hdG9tX2luX2RlZl9yb3V0aW5lX3BhcmFtZXRlcnMxMzI0MyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX3JvdXRpbmVfcGFyYW1fYXRvbV9pbl9kZWZfcm91dGluZV9wYXJhbWV0ZXJzMTMyNDNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA4MDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX3JvdXRpbmVfcGFyYW1fYXRvbV9pbl9kZWZfcm91dGluZV9wYXJhbWV0ZXJzMTMyNDMJPSB7IEZPTExPV19kZWZfcm91dGluZV9wYXJhbV9hdG9tX2luX2RlZl9yb3V0aW5lX3BhcmFtZXRlcnMxMzI0M19iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19DT01NQV9pbl9kZWZfcm91dGluZV9wYXJhbWV0ZXJzMTMyNTUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0NPTU1BX2luX2RlZl9yb3V0aW5lX3BhcmFtZXRlcnMxMzI1NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDI4MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMTAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwNTAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4QzI2RTAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4NzhFMjA0ODAwRTAwQzE2OCksIEFOVExSM19VSU5UNjRfTElUKDB4MDA2NDEzNjAwNzIwQTI2MSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAxM0E3ODEwOCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19DT01NQV9pbl9kZWZfcm91dGluZV9wYXJhbWV0ZXJzMTMyNTUJPSB7IEZPTExPV19DT01NQV9pbl9kZWZfcm91dGluZV9wYXJhbWV0ZXJzMTMyNTVfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX3JvdXRpbmVfcGFyYW1fYXRvbV9pbl9kZWZfcm91dGluZV9wYXJhbWV0ZXJzMTMyNTcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlZl9yb3V0aW5lX3BhcmFtX2F0b21faW5fZGVmX3JvdXRpbmVfcGFyYW1ldGVyczEzMjU3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwODAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl9yb3V0aW5lX3BhcmFtX2F0b21faW5fZGVmX3JvdXRpbmVfcGFyYW1ldGVyczEzMjU3CT0geyBGT0xMT1dfZGVmX3JvdXRpbmVfcGFyYW1fYXRvbV9pbl9kZWZfcm91dGluZV9wYXJhbWV0ZXJzMTMyNTdfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfUlBBUkVOX2luX2RlZl9yb3V0aW5lX3BhcmFtZXRlcnMxMzI2OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfUlBBUkVOX2luX2RlZl9yb3V0aW5lX3BhcmFtZXRlcnMxMzI2OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19SUEFSRU5faW5fZGVmX3JvdXRpbmVfcGFyYW1ldGVyczEzMjY5CT0geyBGT0xMT1dfUlBBUkVOX2luX2RlZl9yb3V0aW5lX3BhcmFtZXRlcnMxMzI2OV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19tb2RpZmllcl9wYXJhbV9pbl9kZWZfcm91dGluZV9wYXJhbV9hdG9tMTMzMTIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX21vZGlmaWVyX3BhcmFtX2luX2RlZl9yb3V0aW5lX3BhcmFtX2F0b20xMzMxMl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4QzI2NjAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MzhFMDAwMDAwQTAwQzEyOCksIEFOVExSM19VSU5UNjRfTElUKDB4MDA2NDAxNjAwNzAwMjI2MSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAxM0E3ODEwOCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19tb2RpZmllcl9wYXJhbV9pbl9kZWZfcm91dGluZV9wYXJhbV9hdG9tMTMzMTIJPSB7IEZPTExPV19tb2RpZmllcl9wYXJhbV9pbl9kZWZfcm91dGluZV9wYXJhbV9hdG9tMTMzMTJfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfdHlwZV92YXJfaW5fZGVmX3JvdXRpbmVfcGFyYW1fYXRvbTEzMzI2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV190eXBlX3Zhcl9pbl9kZWZfcm91dGluZV9wYXJhbV9hdG9tMTMzMjZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfdHlwZV92YXJfaW5fZGVmX3JvdXRpbmVfcGFyYW1fYXRvbTEzMzI2CT0geyBGT0xMT1dfdHlwZV92YXJfaW5fZGVmX3JvdXRpbmVfcGFyYW1fYXRvbTEzMzI2X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lEX2luX2RlZl9yb3V0aW5lX3BhcmFtX2F0b20xMzMzMyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfSURfaW5fZGVmX3JvdXRpbmVfcGFyYW1fYXRvbTEzMzMzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDEyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0lEX2luX2RlZl9yb3V0aW5lX3BhcmFtX2F0b20xMzMzMwk9IHsgRk9MTE9XX0lEX2luX2RlZl9yb3V0aW5lX3BhcmFtX2F0b20xMzMzM19iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19JRF9pbl9kZWZfcm91dGluZV9wYXJhbV9hdG9tMTMzNDMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0lEX2luX2RlZl9yb3V0aW5lX3BhcmFtX2F0b20xMzM0M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAxMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JRF9pbl9kZWZfcm91dGluZV9wYXJhbV9hdG9tMTMzNDMJPSB7IEZPTExPV19JRF9pbl9kZWZfcm91dGluZV9wYXJhbV9hdG9tMTMzNDNfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfaW5pdGlhbF92YWx1ZV9pbl9kZWZfcm91dGluZV9wYXJhbV9hdG9tMTMzNjkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2luaXRpYWxfdmFsdWVfaW5fZGVmX3JvdXRpbmVfcGFyYW1fYXRvbTEzMzY5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2luaXRpYWxfdmFsdWVfaW5fZGVmX3JvdXRpbmVfcGFyYW1fYXRvbTEzMzY5CT0geyBGT0xMT1dfaW5pdGlhbF92YWx1ZV9pbl9kZWZfcm91dGluZV9wYXJhbV9hdG9tMTMzNjlfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTFBBUkVOX2luX2RlZl9yb3V0aW5lX3JldHVybnMxMzM5MyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTFBBUkVOX2luX2RlZl9yb3V0aW5lX3JldHVybnMxMzM5M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDI4MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMTAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwNTAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4QzI2RTAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4NzhFMjA0ODAwRTAwQzE2OCksIEFOVExSM19VSU5UNjRfTElUKDB4MDA2NDEzNjAwNzIwQTI2MSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAxM0E3ODEwOCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MUEFSRU5faW5fZGVmX3JvdXRpbmVfcmV0dXJuczEzMzkzCT0geyBGT0xMT1dfTFBBUkVOX2luX2RlZl9yb3V0aW5lX3JldHVybnMxMzM5M19iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfcm91dGluZV9yZXR1cm5zX2F0b21faW5fZGVmX3JvdXRpbmVfcmV0dXJuczEzNDAxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWZfcm91dGluZV9yZXR1cm5zX2F0b21faW5fZGVmX3JvdXRpbmVfcmV0dXJuczEzNDAxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwODAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl9yb3V0aW5lX3JldHVybnNfYXRvbV9pbl9kZWZfcm91dGluZV9yZXR1cm5zMTM0MDEJPSB7IEZPTExPV19kZWZfcm91dGluZV9yZXR1cm5zX2F0b21faW5fZGVmX3JvdXRpbmVfcmV0dXJuczEzNDAxX2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0NPTU1BX2luX2RlZl9yb3V0aW5lX3JldHVybnMxMzQxMyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQ09NTUFfaW5fZGVmX3JvdXRpbmVfcmV0dXJuczEzNDEzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMjgwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAxMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDA1MDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHhDMjZFMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHg3OEUyMDQ4MDBFMDBDMTY4KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDY0MTM2MDA3MjBBMjYxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDEzQTc4MTA4KSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0NPTU1BX2luX2RlZl9yb3V0aW5lX3JldHVybnMxMzQxMwk9IHsgRk9MTE9XX0NPTU1BX2luX2RlZl9yb3V0aW5lX3JldHVybnMxMzQxM19iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfcm91dGluZV9yZXR1cm5zX2F0b21faW5fZGVmX3JvdXRpbmVfcmV0dXJuczEzNDE1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWZfcm91dGluZV9yZXR1cm5zX2F0b21faW5fZGVmX3JvdXRpbmVfcmV0dXJuczEzNDE1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwODAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl9yb3V0aW5lX3JldHVybnNfYXRvbV9pbl9kZWZfcm91dGluZV9yZXR1cm5zMTM0MTUJPSB7IEZPTExPV19kZWZfcm91dGluZV9yZXR1cm5zX2F0b21faW5fZGVmX3JvdXRpbmVfcmV0dXJuczEzNDE1X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1JQQVJFTl9pbl9kZWZfcm91dGluZV9yZXR1cm5zMTM0MjQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1JQQVJFTl9pbl9kZWZfcm91dGluZV9yZXR1cm5zMTM0MjRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUlBBUkVOX2luX2RlZl9yb3V0aW5lX3JldHVybnMxMzQyNAk9IHsgRk9MTE9XX1JQQVJFTl9pbl9kZWZfcm91dGluZV9yZXR1cm5zMTM0MjRfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfdHlwZV92YXJfaW5fZGVmX3JvdXRpbmVfcmV0dXJuczEzNDMyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV190eXBlX3Zhcl9pbl9kZWZfcm91dGluZV9yZXR1cm5zMTM0MzJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMTIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfdHlwZV92YXJfaW5fZGVmX3JvdXRpbmVfcmV0dXJuczEzNDMyCT0geyBGT0xMT1dfdHlwZV92YXJfaW5fZGVmX3JvdXRpbmVfcmV0dXJuczEzNDMyX2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2luaXRpYWxfdmFsdWVfaW5fZGVmX3JvdXRpbmVfcmV0dXJuczEzNDM4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19pbml0aWFsX3ZhbHVlX2luX2RlZl9yb3V0aW5lX3JldHVybnMxMzQzOF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19pbml0aWFsX3ZhbHVlX2luX2RlZl9yb3V0aW5lX3JldHVybnMxMzQzOAk9IHsgRk9MTE9XX2luaXRpYWxfdmFsdWVfaW5fZGVmX3JvdXRpbmVfcmV0dXJuczEzNDM4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX21vZGlmaWVyX3BhcmFtX2luX2RlZl9yb3V0aW5lX3JldHVybnNfYXRvbTEzNDkxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19tb2RpZmllcl9wYXJhbV9pbl9kZWZfcm91dGluZV9yZXR1cm5zX2F0b20xMzQ5MV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4QzI2NjAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MzhFMDAwMDAwQTAwQzEyOCksIEFOVExSM19VSU5UNjRfTElUKDB4MDA2NDAxNjAwNzAwMjI2MSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAxM0E3ODEwOCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19tb2RpZmllcl9wYXJhbV9pbl9kZWZfcm91dGluZV9yZXR1cm5zX2F0b20xMzQ5MQk9IHsgRk9MTE9XX21vZGlmaWVyX3BhcmFtX2luX2RlZl9yb3V0aW5lX3JldHVybnNfYXRvbTEzNDkxX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3R5cGVfdmFyX2luX2RlZl9yb3V0aW5lX3JldHVybnNfYXRvbTEzNTA1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV190eXBlX3Zhcl9pbl9kZWZfcm91dGluZV9yZXR1cm5zX2F0b20xMzUwNV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV190eXBlX3Zhcl9pbl9kZWZfcm91dGluZV9yZXR1cm5zX2F0b20xMzUwNQk9IHsgRk9MTE9XX3R5cGVfdmFyX2luX2RlZl9yb3V0aW5lX3JldHVybnNfYXRvbTEzNTA1X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lEX2luX2RlZl9yb3V0aW5lX3JldHVybnNfYXRvbTEzNTEyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19JRF9pbl9kZWZfcm91dGluZV9yZXR1cm5zX2F0b20xMzUxMl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAxMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JRF9pbl9kZWZfcm91dGluZV9yZXR1cm5zX2F0b20xMzUxMgk9IHsgRk9MTE9XX0lEX2luX2RlZl9yb3V0aW5lX3JldHVybnNfYXRvbTEzNTEyX2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lEX2luX2RlZl9yb3V0aW5lX3JldHVybnNfYXRvbTEzNTIyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19JRF9pbl9kZWZfcm91dGluZV9yZXR1cm5zX2F0b20xMzUyMl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAxMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JRF9pbl9kZWZfcm91dGluZV9yZXR1cm5zX2F0b20xMzUyMgk9IHsgRk9MTE9XX0lEX2luX2RlZl9yb3V0aW5lX3JldHVybnNfYXRvbTEzNTIyX2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2luaXRpYWxfdmFsdWVfaW5fZGVmX3JvdXRpbmVfcmV0dXJuc19hdG9tMTM1NTAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2luaXRpYWxfdmFsdWVfaW5fZGVmX3JvdXRpbmVfcmV0dXJuc19hdG9tMTM1NTBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfaW5pdGlhbF92YWx1ZV9pbl9kZWZfcm91dGluZV9yZXR1cm5zX2F0b20xMzU1MAk9IHsgRk9MTE9XX2luaXRpYWxfdmFsdWVfaW5fZGVmX3JvdXRpbmVfcmV0dXJuc19hdG9tMTM1NTBfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjA0X2luX3NlY3Rpb25fbW9kZWxfb2ZfZXhlY3V0aW9uMTM1NzQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzIwNF9pbl9zZWN0aW9uX21vZGVsX29mX2V4ZWN1dGlvbjEzNTc0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHhFMTRBODQwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAxNzg0MDAwMDg0KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwODAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzIwNF9pbl9zZWN0aW9uX21vZGVsX29mX2V4ZWN1dGlvbjEzNTc0CT0geyBGT0xMT1dfMjA0X2luX3NlY3Rpb25fbW9kZWxfb2ZfZXhlY3V0aW9uMTM1NzRfYml0cywgNgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX21vZV9wcmltaXRpdmVfaW5fc2VjdGlvbl9tb2RlbF9vZl9leGVjdXRpb24xMzU3OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX21vZV9wcmltaXRpdmVfaW5fc2VjdGlvbl9tb2RlbF9vZl9leGVjdXRpb24xMzU3OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4RTE0QTg0MDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMTc4NDAwMDA4NCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDgwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWZfbW9lX3ByaW1pdGl2ZV9pbl9zZWN0aW9uX21vZGVsX29mX2V4ZWN1dGlvbjEzNTc5CT0geyBGT0xMT1dfZGVmX21vZV9wcmltaXRpdmVfaW5fc2VjdGlvbl9tb2RlbF9vZl9leGVjdXRpb24xMzU3OV9iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18xNzdfaW5fZGVmX21vZV9wcmltaXRpdmUxMzYwMCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMTc3X2luX2RlZl9tb2VfcHJpbWl0aXZlMTM2MDBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA4MDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMTc3X2luX2RlZl9tb2VfcHJpbWl0aXZlMTM2MDAJPSB7IEZPTExPV18xNzdfaW5fZGVmX21vZV9wcmltaXRpdmUxMzYwMF9iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzYwOCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX3JvdXRpbmVfc2VxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM2MDhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX3JvdXRpbmVfc2VxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM2MDgJPSB7IEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzYwOF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18xOTRfaW5fZGVmX21vZV9wcmltaXRpdmUxMzYxNCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMTk0X2luX2RlZl9tb2VfcHJpbWl0aXZlMTM2MTRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA4MDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMTk0X2luX2RlZl9tb2VfcHJpbWl0aXZlMTM2MTQJPSB7IEZPTExPV18xOTRfaW5fZGVmX21vZV9wcmltaXRpdmUxMzYxNF9iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzYyNCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX3JvdXRpbmVfc2VxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM2MjRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX3JvdXRpbmVfc2VxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM2MjQJPSB7IEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzYyNF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18xODRfaW5fZGVmX21vZV9wcmltaXRpdmUxMzYzMCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMTg0X2luX2RlZl9tb2VfcHJpbWl0aXZlMTM2MzBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA4MDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMTg0X2luX2RlZl9tb2VfcHJpbWl0aXZlMTM2MzAJPSB7IEZPTExPV18xODRfaW5fZGVmX21vZV9wcmltaXRpdmUxMzYzMF9iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzYzOSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX3JvdXRpbmVfc2VxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM2MzlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX3JvdXRpbmVfc2VxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM2MzkJPSB7IEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzYzOV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yMjZfaW5fZGVmX21vZV9wcmltaXRpdmUxMzY0NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjI2X2luX2RlZl9tb2VfcHJpbWl0aXZlMTM2NDZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA4MDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjI2X2luX2RlZl9tb2VfcHJpbWl0aXZlMTM2NDYJPSB7IEZPTExPV18yMjZfaW5fZGVmX21vZV9wcmltaXRpdmUxMzY0Nl9iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzY1NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX3JvdXRpbmVfc2VxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM2NTVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX3JvdXRpbmVfc2VxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM2NTUJPSB7IEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzY1NV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yMjhfaW5fZGVmX21vZV9wcmltaXRpdmUxMzY2MSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjI4X2luX2RlZl9tb2VfcHJpbWl0aXZlMTM2NjFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA4MDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjI4X2luX2RlZl9tb2VfcHJpbWl0aXZlMTM2NjEJPSB7IEZPTExPV18yMjhfaW5fZGVmX21vZV9wcmltaXRpdmUxMzY2MV9iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzY3MSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX3JvdXRpbmVfc2VxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM2NzFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX3JvdXRpbmVfc2VxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM2NzEJPSB7IEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzY3MV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18xOTFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzY3OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMTkxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM2NzhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA4MDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMTkxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM2NzgJPSB7IEZPTExPV18xOTFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzY3OF9iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzY4NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX3JvdXRpbmVfc2VxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM2ODVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX3JvdXRpbmVfc2VxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM2ODUJPSB7IEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzY4NV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18xODJfaW5fZGVmX21vZV9wcmltaXRpdmUxMzY5MSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMTgyX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM2OTFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA4MDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMTgyX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM2OTEJPSB7IEZPTExPV18xODJfaW5fZGVmX21vZV9wcmltaXRpdmUxMzY5MV9iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzY5OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX3JvdXRpbmVfc2VxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM2OTlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX3JvdXRpbmVfc2VxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM2OTkJPSB7IEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzY5OV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18xOTBfaW5fZGVmX21vZV9wcmltaXRpdmUxMzcwNiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMTkwX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM3MDZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA4MDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMTkwX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM3MDYJPSB7IEZPTExPV18xOTBfaW5fZGVmX21vZV9wcmltaXRpdmUxMzcwNl9iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzcxMiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX3JvdXRpbmVfc2VxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM3MTJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX3JvdXRpbmVfc2VxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM3MTIJPSB7IEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzcxMl9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18xNzlfaW5fZGVmX21vZV9wcmltaXRpdmUxMzcxOCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMTc5X2luX2RlZl9tb2VfcHJpbWl0aXZlMTM3MThfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA4MDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMTc5X2luX2RlZl9tb2VfcHJpbWl0aXZlMTM3MTgJPSB7IEZPTExPV18xNzlfaW5fZGVmX21vZV9wcmltaXRpdmUxMzcxOF9iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzcyNSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX3JvdXRpbmVfc2VxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM3MjVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX3JvdXRpbmVfc2VxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM3MjUJPSB7IEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzcyNV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18xODlfaW5fZGVmX21vZV9wcmltaXRpdmUxMzczMiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMTg5X2luX2RlZl9tb2VfcHJpbWl0aXZlMTM3MzJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA4MDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMTg5X2luX2RlZl9tb2VfcHJpbWl0aXZlMTM3MzIJPSB7IEZPTExPV18xODlfaW5fZGVmX21vZV9wcmltaXRpdmUxMzczMl9iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzc0MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX3JvdXRpbmVfc2VxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM3NDBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX3JvdXRpbmVfc2VxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM3NDAJPSB7IEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzc0MF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18xNzBfaW5fZGVmX21vZV9wcmltaXRpdmUxMzc0NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMTcwX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM3NDZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA4MDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMTcwX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM3NDYJPSB7IEZPTExPV18xNzBfaW5fZGVmX21vZV9wcmltaXRpdmUxMzc0Nl9iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzc1NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX3JvdXRpbmVfc2VxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM3NTVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX3JvdXRpbmVfc2VxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM3NTUJPSB7IEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzc1NV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18xOTlfaW5fZGVmX21vZV9wcmltaXRpdmUxMzc2MiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMTk5X2luX2RlZl9tb2VfcHJpbWl0aXZlMTM3NjJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA4MDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMTk5X2luX2RlZl9tb2VfcHJpbWl0aXZlMTM3NjIJPSB7IEZPTExPV18xOTlfaW5fZGVmX21vZV9wcmltaXRpdmUxMzc2Ml9iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzc3MiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX3JvdXRpbmVfc2VxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM3NzJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX3JvdXRpbmVfc2VxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM3NzIJPSB7IEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzc3Ml9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yMjRfaW5fZGVmX21vZV9wcmltaXRpdmUxMzc3OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjI0X2luX2RlZl9tb2VfcHJpbWl0aXZlMTM3NzhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA4MDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjI0X2luX2RlZl9tb2VfcHJpbWl0aXZlMTM3NzgJPSB7IEZPTExPV18yMjRfaW5fZGVmX21vZV9wcmltaXRpdmUxMzc3OF9iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzc4OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX3JvdXRpbmVfc2VxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM3ODlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX3JvdXRpbmVfc2VxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM3ODkJPSB7IEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzc4OV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yMjNfaW5fZGVmX21vZV9wcmltaXRpdmUxMzc5NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjIzX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM3OTVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA4MDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjIzX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM3OTUJPSB7IEZPTExPV18yMjNfaW5fZGVmX21vZV9wcmltaXRpdmUxMzc5NV9iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzgwNiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX3JvdXRpbmVfc2VxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM4MDZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX3JvdXRpbmVfc2VxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM4MDYJPSB7IEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzgwNl9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yMThfaW5fZGVmX21vZV9wcmltaXRpdmUxMzgxMyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjE4X2luX2RlZl9tb2VfcHJpbWl0aXZlMTM4MTNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA4MDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjE4X2luX2RlZl9tb2VfcHJpbWl0aXZlMTM4MTMJPSB7IEZPTExPV18yMThfaW5fZGVmX21vZV9wcmltaXRpdmUxMzgxM19iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzgyMSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX3JvdXRpbmVfc2VxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM4MjFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX3JvdXRpbmVfc2VxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM4MjEJPSB7IEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzgyMV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18xNzVfaW5fZGVmX21vZV9wcmltaXRpdmUxMzgyOCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMTc1X2luX2RlZl9tb2VfcHJpbWl0aXZlMTM4MjhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA4MDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMTc1X2luX2RlZl9tb2VfcHJpbWl0aXZlMTM4MjgJPSB7IEZPTExPV18xNzVfaW5fZGVmX21vZV9wcmltaXRpdmUxMzgyOF9iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzgzMSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX3JvdXRpbmVfc2VxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM4MzFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX3JvdXRpbmVfc2VxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM4MzEJPSB7IEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzgzMV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yMjVfaW5fZGVmX21vZV9wcmltaXRpdmUxMzgzNyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjI1X2luX2RlZl9tb2VfcHJpbWl0aXZlMTM4MzdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA4MDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjI1X2luX2RlZl9tb2VfcHJpbWl0aXZlMTM4MzcJPSB7IEZPTExPV18yMjVfaW5fZGVmX21vZV9wcmltaXRpdmUxMzgzN19iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzg0MyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX3JvdXRpbmVfc2VxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM4NDNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX3JvdXRpbmVfc2VxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM4NDMJPSB7IEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzg0M19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zNjdfaW5fZGVmX21vZV9wcmltaXRpdmUxMzg1MSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzY3X2luX2RlZl9tb2VfcHJpbWl0aXZlMTM4NTFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzY3X2luX2RlZl9tb2VfcHJpbWl0aXZlMTM4NTEJPSB7IEZPTExPV18zNjdfaW5fZGVmX21vZV9wcmltaXRpdmUxMzg1MV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfcm91dGluZV9tb2RlbF9pbXBsX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM4NTYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlZl9yb3V0aW5lX21vZGVsX2ltcGxfaW5fZGVmX21vZV9wcmltaXRpdmUxMzg1Nl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWZfcm91dGluZV9tb2RlbF9pbXBsX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM4NTYJPSB7IEZPTExPV19kZWZfcm91dGluZV9tb2RlbF9pbXBsX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM4NTZfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX3JvdXRpbmVfcGFyYW1ldGVyc19pbl9kZWZfcm91dGluZV9zZXExMzg4MSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX3JvdXRpbmVfcGFyYW1ldGVyc19pbl9kZWZfcm91dGluZV9zZXExMzg4MV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDgwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWZfcm91dGluZV9wYXJhbWV0ZXJzX2luX2RlZl9yb3V0aW5lX3NlcTEzODgxCT0geyBGT0xMT1dfZGVmX3JvdXRpbmVfcGFyYW1ldGVyc19pbl9kZWZfcm91dGluZV9zZXExMzg4MV9iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zZXRfaW5fZGVmX3JvdXRpbmVfc2VxMTM4OTIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NldF9pbl9kZWZfcm91dGluZV9zZXExMzg5Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4QzI2NjAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MzhFMDAwMDAwQTAwQzEyOCksIEFOVExSM19VSU5UNjRfTElUKDB4MDA2NDAxNjAwNzAwMjI2MSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAxM0E3ODEwOCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZXRfaW5fZGVmX3JvdXRpbmVfc2VxMTM4OTIJPSB7IEZPTExPV19zZXRfaW5fZGVmX3JvdXRpbmVfc2VxMTM4OTJfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX3JvdXRpbmVfcmV0dXJuc19pbl9kZWZfcm91dGluZV9zZXExMzkwMyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX3JvdXRpbmVfcmV0dXJuc19pbl9kZWZfcm91dGluZV9zZXExMzkwM19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMSkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWZfcm91dGluZV9yZXR1cm5zX2luX2RlZl9yb3V0aW5lX3NlcTEzOTAzCT0geyBGT0xMT1dfZGVmX3JvdXRpbmVfcmV0dXJuc19pbl9kZWZfcm91dGluZV9zZXExMzkwM19iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19ibG9ja19zdGF0ZW1lbnRfaW5fZGVmX3JvdXRpbmVfc2VxMTM5MTUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfcm91dGluZV9zZXExMzkxNV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19ibG9ja19zdGF0ZW1lbnRfaW5fZGVmX3JvdXRpbmVfc2VxMTM5MTUJPSB7IEZPTExPV19ibG9ja19zdGF0ZW1lbnRfaW5fZGVmX3JvdXRpbmVfc2VxMTM5MTVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2V0X2luX3NlY3Rpb25fbW9kZWxfb2ZfaW50ZXJhY3Rpb24xMzk0NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2V0X2luX3NlY3Rpb25fbW9kZWxfb2ZfaW50ZXJhY3Rpb24xMzk0NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAzMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDQwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZXRfaW5fc2VjdGlvbl9tb2RlbF9vZl9pbnRlcmFjdGlvbjEzOTQ1CT0geyBGT0xMT1dfc2V0X2luX3NlY3Rpb25fbW9kZWxfb2ZfaW50ZXJhY3Rpb24xMzk0NV9iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19jb21fY29ubmVjdF9pbl9zZWN0aW9uX21vZGVsX29mX2ludGVyYWN0aW9uMTM5NjAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2NvbV9jb25uZWN0X2luX3NlY3Rpb25fbW9kZWxfb2ZfaW50ZXJhY3Rpb24xMzk2MF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAzMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDQwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19jb21fY29ubmVjdF9pbl9zZWN0aW9uX21vZGVsX29mX2ludGVyYWN0aW9uMTM5NjAJPSB7IEZPTExPV19jb21fY29ubmVjdF9pbl9zZWN0aW9uX21vZGVsX29mX2ludGVyYWN0aW9uMTM5NjBfYml0cywgNgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjc3X2luX2NvbV9wcm90b2NvbDEzOTc4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yNzdfaW5fY29tX3Byb3RvY29sMTM5NzhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjc3X2luX2NvbV9wcm90b2NvbDEzOTc4CT0geyBGT0xMT1dfMjc3X2luX2NvbV9wcm90b2NvbDEzOTc4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzM1OV9pbl9jb21fcHJvdG9jb2wxMzk5MiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzU5X2luX2NvbV9wcm90b2NvbDEzOTkyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzM1OV9pbl9jb21fcHJvdG9jb2wxMzk5Mgk9IHsgRk9MTE9XXzM1OV9pbl9jb21fcHJvdG9jb2wxMzk5Ml9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zMjhfaW5fY29tX3Byb3RvY29sMTQwMDUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzMyOF9pbl9jb21fcHJvdG9jb2wxNDAwNV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zMjhfaW5fY29tX3Byb3RvY29sMTQwMDUJPSB7IEZPTExPV18zMjhfaW5fY29tX3Byb3RvY29sMTQwMDVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjg0X2luX2NvbV9wcm90b2NvbDE0MDE0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yODRfaW5fY29tX3Byb3RvY29sMTQwMTRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjg0X2luX2NvbV9wcm90b2NvbDE0MDE0CT0geyBGT0xMT1dfMjg0X2luX2NvbV9wcm90b2NvbDE0MDE0X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzI0MF9pbl9jb21fcHJvdG9jb2wxNDAyOCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjQwX2luX2NvbV9wcm90b2NvbDE0MDI4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzI0MF9pbl9jb21fcHJvdG9jb2wxNDAyOAk9IHsgRk9MTE9XXzI0MF9pbl9jb21fcHJvdG9jb2wxNDAyOF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV180MDNfaW5fY29tX3Byb3RvY29sMTQwMzggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzQwM19pbl9jb21fcHJvdG9jb2wxNDAzOF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV180MDNfaW5fY29tX3Byb3RvY29sMTQwMzgJPSB7IEZPTExPV180MDNfaW5fY29tX3Byb3RvY29sMTQwMzhfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzI0X2luX2NvbV9wcm90b2NvbDE0MDQ4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zMjRfaW5fY29tX3Byb3RvY29sMTQwNDhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzI0X2luX2NvbV9wcm90b2NvbDE0MDQ4CT0geyBGT0xMT1dfMzI0X2luX2NvbV9wcm90b2NvbDE0MDQ4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzI0OF9pbl9jb21fcHJvdG9jb2wxNDA1NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjQ4X2luX2NvbV9wcm90b2NvbDE0MDU2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzI0OF9pbl9jb21fcHJvdG9jb2wxNDA1Ngk9IHsgRk9MTE9XXzI0OF9pbl9jb21fcHJvdG9jb2wxNDA1Nl9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19idWZmZXJfY29tX2luX2NvbV9wcm90b2NvbDE0MDY2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19idWZmZXJfY29tX2luX2NvbV9wcm90b2NvbDE0MDY2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2J1ZmZlcl9jb21faW5fY29tX3Byb3RvY29sMTQwNjYJPSB7IEZPTExPV19idWZmZXJfY29tX2luX2NvbV9wcm90b2NvbDE0MDY2X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzI0MF9pbl9jb21fY2FzdDE0MDgzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yNDBfaW5fY29tX2Nhc3QxNDA4M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yNDBfaW5fY29tX2Nhc3QxNDA4Mwk9IHsgRk9MTE9XXzI0MF9pbl9jb21fY2FzdDE0MDgzX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzQwM19pbl9jb21fY2FzdDE0MDkzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV180MDNfaW5fY29tX2Nhc3QxNDA5M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV180MDNfaW5fY29tX2Nhc3QxNDA5Mwk9IHsgRk9MTE9XXzQwM19pbl9jb21fY2FzdDE0MDkzX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzMyNF9pbl9jb21fY2FzdDE0MTAzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zMjRfaW5fY29tX2Nhc3QxNDEwM19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zMjRfaW5fY29tX2Nhc3QxNDEwMwk9IHsgRk9MTE9XXzMyNF9pbl9jb21fY2FzdDE0MTAzX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzI0OF9pbl9jb21fY2FzdDE0MTExICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yNDhfaW5fY29tX2Nhc3QxNDExMV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yNDhfaW5fY29tX2Nhc3QxNDExMQk9IHsgRk9MTE9XXzI0OF9pbl9jb21fY2FzdDE0MTExX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzI0OV9pbl9idWZmZXJfY29tMTQxMzIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzI0OV9pbl9idWZmZXJfY29tMTQxMzJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAyMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjQ5X2luX2J1ZmZlcl9jb20xNDEzMgk9IHsgRk9MTE9XXzI0OV9pbl9idWZmZXJfY29tMTQxMzJfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfQ09MT05faW5fYnVmZmVyX2NvbTE0MTM5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19DT0xPTl9pbl9idWZmZXJfY29tMTQxMzlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDA4MDAwMDAwMDIwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMjQwMDEwMDAwMDAyNjApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMTAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQ09MT05faW5fYnVmZmVyX2NvbTE0MTM5CT0geyBGT0xMT1dfQ09MT05faW5fYnVmZmVyX2NvbTE0MTM5X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3JlZl9idWZmZXJfaW5fYnVmZmVyX2NvbTE0MTUwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19yZWZfYnVmZmVyX2luX2J1ZmZlcl9jb20xNDE1MF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19yZWZfYnVmZmVyX2luX2J1ZmZlcl9jb20xNDE1MAk9IHsgRk9MTE9XX3JlZl9idWZmZXJfaW5fYnVmZmVyX2NvbTE0MTUwX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2RlZl9idWZmZXJfaW5fYnVmZmVyX2NvbTE0MTY1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWZfYnVmZmVyX2luX2J1ZmZlcl9jb20xNDE2NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWZfYnVmZmVyX2luX2J1ZmZlcl9jb20xNDE2NQk9IHsgRk9MTE9XX2RlZl9idWZmZXJfaW5fYnVmZmVyX2NvbTE0MTY1X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xUX19pbl9idWZmZXJfY29tMTQxODcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xUX19pbl9idWZmZXJfY29tMTQxODdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDA4MDAwMDAwMDIwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMjQwMDEwMDAwMDAyNjApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMTAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTFRfX2luX2J1ZmZlcl9jb20xNDE4Nwk9IHsgRk9MTE9XX0xUX19pbl9idWZmZXJfY29tMTQxODdfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfcmVmX2J1ZmZlcl9pbl9idWZmZXJfY29tMTQyMDAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3JlZl9idWZmZXJfaW5fYnVmZmVyX2NvbTE0MjAwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3JlZl9idWZmZXJfaW5fYnVmZmVyX2NvbTE0MjAwCT0geyBGT0xMT1dfcmVmX2J1ZmZlcl9pbl9idWZmZXJfY29tMTQyMDBfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX2J1ZmZlcl9pbl9idWZmZXJfY29tMTQyMTcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlZl9idWZmZXJfaW5fYnVmZmVyX2NvbTE0MjE3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl9idWZmZXJfaW5fYnVmZmVyX2NvbTE0MjE3CT0geyBGT0xMT1dfZGVmX2J1ZmZlcl9pbl9idWZmZXJfY29tMTQyMTdfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfR1RfaW5fYnVmZmVyX2NvbTE0MjM4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19HVF9pbl9idWZmZXJfY29tMTQyMzhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfR1RfaW5fYnVmZmVyX2NvbTE0MjM4CT0geyBGT0xMT1dfR1RfaW5fYnVmZmVyX2NvbTE0MjM4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2RlZl9idWZmZXJfaW5fYnVmZmVyX2NvbTE0MjUwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWZfYnVmZmVyX2luX2J1ZmZlcl9jb20xNDI1MF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWZfYnVmZmVyX2luX2J1ZmZlcl9jb20xNDI1MAk9IHsgRk9MTE9XX2RlZl9idWZmZXJfaW5fYnVmZmVyX2NvbTE0MjUwX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3NldF9pbl9jb21fY29ubmVjdDE0Mjc2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zZXRfaW5fY29tX2Nvbm5lY3QxNDI3Nl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMSkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZXRfaW5fY29tX2Nvbm5lY3QxNDI3Ngk9IHsgRk9MTE9XX3NldF9pbl9jb21fY29ubmVjdDE0Mjc2X2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xUX19pbl9jb21fY29ubmVjdDE0MjkxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MVF9faW5fY29tX2Nvbm5lY3QxNDI5MV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDMwMTAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDgwMDAwMDAxMjIwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAyNDAwOTAwMDAwMDM3MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAxMDA4MDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MVF9faW5fY29tX2Nvbm5lY3QxNDI5MQk9IHsgRk9MTE9XX0xUX19pbl9jb21fY29ubmVjdDE0MjkxX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2NvbV9wcm90b2NvbF9pbl9jb21fY29ubmVjdDE0Mjk4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19jb21fcHJvdG9jb2xfaW5fY29tX2Nvbm5lY3QxNDI5OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDgwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19jb21fcHJvdG9jb2xfaW5fY29tX2Nvbm5lY3QxNDI5OAk9IHsgRk9MTE9XX2NvbV9wcm90b2NvbF9pbl9jb21fY29ubmVjdDE0Mjk4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0NPTU1BX2luX2NvbV9jb25uZWN0MTQzMDggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0NPTU1BX2luX2NvbV9jb25uZWN0MTQzMDhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMDEwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMTApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwODAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQ09NTUFfaW5fY29tX2Nvbm5lY3QxNDMwOAk9IHsgRk9MTE9XX0NPTU1BX2luX2NvbV9jb25uZWN0MTQzMDhfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfY29tX2Nhc3RfaW5fY29tX2Nvbm5lY3QxNDMxMCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfY29tX2Nhc3RfaW5fY29tX2Nvbm5lY3QxNDMxMF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19jb21fY2FzdF9pbl9jb21fY29ubmVjdDE0MzEwCT0geyBGT0xMT1dfY29tX2Nhc3RfaW5fY29tX2Nvbm5lY3QxNDMxMF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19HVF9pbl9jb21fY29ubmVjdDE0MzIxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19HVF9pbl9jb21fY29ubmVjdDE0MzIxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0dUX2luX2NvbV9jb25uZWN0MTQzMjEJPSB7IEZPTExPV19HVF9pbl9jb21fY29ubmVjdDE0MzIxX2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lEX2luX2NvbV9jb25uZWN0MTQzMzQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0lEX2luX2NvbV9jb25uZWN0MTQzMzRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDEpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfSURfaW5fY29tX2Nvbm5lY3QxNDMzNAk9IHsgRk9MTE9XX0lEX2luX2NvbV9jb25uZWN0MTQzMzRfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTENVUkxZX2luX2NvbV9jb25uZWN0MTQzNDkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xDVVJMWV9pbl9jb21fY29ubmVjdDE0MzQ5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAyMDQwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMTAwMDAwMjAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xDVVJMWV9pbl9jb21fY29ubmVjdDE0MzQ5CT0geyBGT0xMT1dfTENVUkxZX2luX2NvbV9jb25uZWN0MTQzNDlfYml0cywgNgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfY29tX3JvdXRlX2luX2NvbV9jb25uZWN0MTQzNTYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2NvbV9yb3V0ZV9pbl9jb21fY29ubmVjdDE0MzU2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAyMDQwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMTAwMDAwMjAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2NvbV9yb3V0ZV9pbl9jb21fY29ubmVjdDE0MzU2CT0geyBGT0xMT1dfY29tX3JvdXRlX2luX2NvbV9jb25uZWN0MTQzNTZfYml0cywgNgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfUkNVUkxZX2luX2NvbV9jb25uZWN0MTQzNjUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1JDVVJMWV9pbl9jb21fY29ubmVjdDE0MzY1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1JDVVJMWV9pbl9jb21fY29ubmVjdDE0MzY1CT0geyBGT0xMT1dfUkNVUkxZX2luX2NvbV9jb25uZWN0MTQzNjVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzY2X2luX2NvbV9jb25uZWN0MTQzNzQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzM2Nl9pbl9jb21fY29ubmVjdDE0Mzc0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgxMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAyMDQwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMTAwMDAwMjAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzM2Nl9pbl9jb21fY29ubmVjdDE0Mzc0CT0geyBGT0xMT1dfMzY2X2luX2NvbV9jb25uZWN0MTQzNzRfYml0cywgNgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTFRfX2luX2NvbV9jb25uZWN0MTQzODggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xUX19pbl9jb21fY29ubmVjdDE0Mzg4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMzAxMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwODAwMDAwMDEyMjAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDI0MDA5MDAwMDAwMzcwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDEwMDgwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xUX19pbl9jb21fY29ubmVjdDE0Mzg4CT0geyBGT0xMT1dfTFRfX2luX2NvbV9jb25uZWN0MTQzODhfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfY29tX3Byb3RvY29sX2luX2NvbV9jb25uZWN0MTQzOTUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2NvbV9wcm90b2NvbF9pbl9jb21fY29ubmVjdDE0Mzk1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwODAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2NvbV9wcm90b2NvbF9pbl9jb21fY29ubmVjdDE0Mzk1CT0geyBGT0xMT1dfY29tX3Byb3RvY29sX2luX2NvbV9jb25uZWN0MTQzOTVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfQ09NTUFfaW5fY29tX2Nvbm5lY3QxNDQwNSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQ09NTUFfaW5fY29tX2Nvbm5lY3QxNDQwNV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEwMTAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAxMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDA4MDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19DT01NQV9pbl9jb21fY29ubmVjdDE0NDA1CT0geyBGT0xMT1dfQ09NTUFfaW5fY29tX2Nvbm5lY3QxNDQwNV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19jb21fY2FzdF9pbl9jb21fY29ubmVjdDE0NDA3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19jb21fY2FzdF9pbl9jb21fY29ubmVjdDE0NDA3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2NvbV9jYXN0X2luX2NvbV9jb25uZWN0MTQ0MDcJPSB7IEZPTExPV19jb21fY2FzdF9pbl9jb21fY29ubmVjdDE0NDA3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0dUX2luX2NvbV9jb25uZWN0MTQ0MTggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0dUX2luX2NvbV9jb25uZWN0MTQ0MThfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDEwMDQwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDIwNDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAxMDAwMDAyMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfR1RfaW5fY29tX2Nvbm5lY3QxNDQxOAk9IHsgRk9MTE9XX0dUX2luX2NvbV9jb25uZWN0MTQ0MThfYml0cywgNgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfY29tX3JvdXRlX2luX2NvbV9jb25uZWN0MTQ0MzIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2NvbV9yb3V0ZV9pbl9jb21fY29ubmVjdDE0NDMyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2NvbV9yb3V0ZV9pbl9jb21fY29ubmVjdDE0NDMyCT0geyBGT0xMT1dfY29tX3JvdXRlX2luX2NvbV9jb25uZWN0MTQ0MzJfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTENVUkxZX2luX2NvbV9jb25uZWN0MTQ0NDEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xDVVJMWV9pbl9jb21fY29ubmVjdDE0NDQxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAyMDQwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMTAwMDAwMjAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xDVVJMWV9pbl9jb21fY29ubmVjdDE0NDQxCT0geyBGT0xMT1dfTENVUkxZX2luX2NvbV9jb25uZWN0MTQ0NDFfYml0cywgNgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfY29tX3JvdXRlX2luX2NvbV9jb25uZWN0MTQ0NTAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2NvbV9yb3V0ZV9pbl9jb21fY29ubmVjdDE0NDUwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAyMDQwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMTAwMDAwMjAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2NvbV9yb3V0ZV9pbl9jb21fY29ubmVjdDE0NDUwCT0geyBGT0xMT1dfY29tX3JvdXRlX2luX2NvbV9jb25uZWN0MTQ0NTBfYml0cywgNgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfUkNVUkxZX2luX2NvbV9jb25uZWN0MTQ0NjEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1JDVVJMWV9pbl9jb21fY29ubmVjdDE0NDYxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1JDVVJMWV9pbl9jb21fY29ubmVjdDE0NDYxCT0geyBGT0xMT1dfUkNVUkxZX2luX2NvbV9jb25uZWN0MTQ0NjFfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTEJSQUNLRVRfaW5fY29tX2Nvbm5lY3QxNDQ2OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTEJSQUNLRVRfaW5fY29tX2Nvbm5lY3QxNDQ2OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDIwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MQlJBQ0tFVF9pbl9jb21fY29ubmVjdDE0NDY5CT0geyBGT0xMT1dfTEJSQUNLRVRfaW5fY29tX2Nvbm5lY3QxNDQ2OV9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19jb21fcG9ydF9pbl9jb21fY29ubmVjdDE0NDg1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19jb21fcG9ydF9pbl9jb21fY29ubmVjdDE0NDg1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwODAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgxMDAwMDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2NvbV9wb3J0X2luX2NvbV9jb25uZWN0MTQ0ODUJPSB7IEZPTExPV19jb21fcG9ydF9pbl9jb21fY29ubmVjdDE0NDg1X2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0NPTU1BX2luX2NvbV9jb25uZWN0MTQ0OTcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0NPTU1BX2luX2NvbV9jb25uZWN0MTQ0OTdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQ09NTUFfaW5fY29tX2Nvbm5lY3QxNDQ5Nwk9IHsgRk9MTE9XX0NPTU1BX2luX2NvbV9jb25uZWN0MTQ0OTdfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfY29tX3BvcnRfaW5fY29tX2Nvbm5lY3QxNDUwMCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfY29tX3BvcnRfaW5fY29tX2Nvbm5lY3QxNDUwMF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDgwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MTAwMDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19jb21fcG9ydF9pbl9jb21fY29ubmVjdDE0NTAwCT0geyBGT0xMT1dfY29tX3BvcnRfaW5fY29tX2Nvbm5lY3QxNDUwMF9iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TVEFSX2luX2NvbV9jb25uZWN0MTQ1MTQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1NUQVJfaW5fY29tX2Nvbm5lY3QxNDUxNF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MTAwMDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19TVEFSX2luX2NvbV9jb25uZWN0MTQ1MTQJPSB7IEZPTExPV19TVEFSX2luX2NvbV9jb25uZWN0MTQ1MTRfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfUkJSQUNLRVRfaW5fY29tX2Nvbm5lY3QxNDUzNSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfUkJSQUNLRVRfaW5fY29tX2Nvbm5lY3QxNDUzNV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19SQlJBQ0tFVF9pbl9jb21fY29ubmVjdDE0NTM1CT0geyBGT0xMT1dfUkJSQUNLRVRfaW5fY29tX2Nvbm5lY3QxNDUzNV9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TRU1JX2luX2NvbV9jb25uZWN0MTQ1NDIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1NFTUlfaW5fY29tX2Nvbm5lY3QxNDU0Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19TRU1JX2luX2NvbV9jb25uZWN0MTQ1NDIJPSB7IEZPTExPV19TRU1JX2luX2NvbV9jb25uZWN0MTQ1NDJfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dF9pbl9jb21fcm91dGUxNDU3MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dF9pbl9jb21fcm91dGUxNDU3MF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MTAwNDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMSkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19tb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0X2luX2NvbV9yb3V0ZTE0NTcwCT0geyBGT0xMT1dfbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dF9pbl9jb21fcm91dGUxNDU3MF9iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MVF9faW5fY29tX3JvdXRlMTQ1NzggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xUX19pbl9jb21fcm91dGUxNDU3OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDMwMTAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDgwMDAwMDAwMjAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAyNDAwMTAwMDAwMDI3MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAxMDA4MDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MVF9faW5fY29tX3JvdXRlMTQ1NzgJPSB7IEZPTExPV19MVF9faW5fY29tX3JvdXRlMTQ1NzhfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfYnVmZmVyX2NvbV9pbl9jb21fcm91dGUxNDU4OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfYnVmZmVyX2NvbV9pbl9jb21fcm91dGUxNDU4OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19idWZmZXJfY29tX2luX2NvbV9yb3V0ZTE0NTg5CT0geyBGT0xMT1dfYnVmZmVyX2NvbV9pbl9jb21fcm91dGUxNDU4OV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19jb21fY2FzdF9pbl9jb21fcm91dGUxNDYwNiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfY29tX2Nhc3RfaW5fY29tX3JvdXRlMTQ2MDZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfY29tX2Nhc3RfaW5fY29tX3JvdXRlMTQ2MDYJPSB7IEZPTExPV19jb21fY2FzdF9pbl9jb21fcm91dGUxNDYwNl9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19HVF9pbl9jb21fcm91dGUxNDYxNCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfR1RfaW5fY29tX3JvdXRlMTQ2MTRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDEwMDQwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDEpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfR1RfaW5fY29tX3JvdXRlMTQ2MTQJPSB7IEZPTExPV19HVF9pbl9jb21fcm91dGUxNDYxNF9iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19jb21fcG9ydF9pbl9jb21fcm91dGUxNDYyNSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfY29tX3BvcnRfaW5fY29tX3JvdXRlMTQ2MjVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfY29tX3BvcnRfaW5fY29tX3JvdXRlMTQ2MjUJPSB7IEZPTExPV19jb21fcG9ydF9pbl9jb21fcm91dGUxNDYyNV9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TRU1JX2luX2NvbV9yb3V0ZTE0NjI5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19TRU1JX2luX2NvbV9yb3V0ZTE0NjI5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1NFTUlfaW5fY29tX3JvdXRlMTQ2MjkJPSB7IEZPTExPV19TRU1JX2luX2NvbV9yb3V0ZTE0NjI5X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xDVVJMWV9pbl9jb21fcm91dGUxNDYzNyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTENVUkxZX2luX2NvbV9yb3V0ZTE0NjM3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xDVVJMWV9pbl9jb21fcm91dGUxNDYzNwk9IHsgRk9MTE9XX0xDVVJMWV9pbl9jb21fcm91dGUxNDYzN19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19jb21fcG9ydF9pbl9jb21fcm91dGUxNDY0NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfY29tX3BvcnRfaW5fY29tX3JvdXRlMTQ2NDZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfY29tX3BvcnRfaW5fY29tX3JvdXRlMTQ2NDYJPSB7IEZPTExPV19jb21fcG9ydF9pbl9jb21fcm91dGUxNDY0Nl9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TRU1JX2luX2NvbV9yb3V0ZTE0NjUwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19TRU1JX2luX2NvbV9yb3V0ZTE0NjUwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1NFTUlfaW5fY29tX3JvdXRlMTQ2NTAJPSB7IEZPTExPV19TRU1JX2luX2NvbV9yb3V0ZTE0NjUwX2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1JDVVJMWV9pbl9jb21fcm91dGUxNDY2MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfUkNVUkxZX2luX2NvbV9yb3V0ZTE0NjYwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1JDVVJMWV9pbl9jb21fcm91dGUxNDY2MAk9IHsgRk9MTE9XX1JDVVJMWV9pbl9jb21fcm91dGUxNDY2MF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MQlJBQ0tFVF9pbl9jb21fcm91dGUxNDY2OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTEJSQUNLRVRfaW5fY29tX3JvdXRlMTQ2NjhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAyMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTEJSQUNLRVRfaW5fY29tX3JvdXRlMTQ2NjgJPSB7IEZPTExPV19MQlJBQ0tFVF9pbl9jb21fcm91dGUxNDY2OF9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19jb21fcG9ydF9pbl9jb21fcm91dGUxNDY3NyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfY29tX3BvcnRfaW5fY29tX3JvdXRlMTQ2NzdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA4MDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDEwMDAwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfY29tX3BvcnRfaW5fY29tX3JvdXRlMTQ2NzcJPSB7IEZPTExPV19jb21fcG9ydF9pbl9jb21fcm91dGUxNDY3N19iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19DT01NQV9pbl9jb21fcm91dGUxNDY4OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQ09NTUFfaW5fY29tX3JvdXRlMTQ2ODlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQ09NTUFfaW5fY29tX3JvdXRlMTQ2ODkJPSB7IEZPTExPV19DT01NQV9pbl9jb21fcm91dGUxNDY4OV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19jb21fcG9ydF9pbl9jb21fcm91dGUxNDY5MiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfY29tX3BvcnRfaW5fY29tX3JvdXRlMTQ2OTJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA4MDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDEwMDAwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfY29tX3BvcnRfaW5fY29tX3JvdXRlMTQ2OTIJPSB7IEZPTExPV19jb21fcG9ydF9pbl9jb21fcm91dGUxNDY5Ml9iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TVEFSX2luX2NvbV9yb3V0ZTE0NzA2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19TVEFSX2luX2NvbV9yb3V0ZTE0NzA2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgxMDAwMDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1NUQVJfaW5fY29tX3JvdXRlMTQ3MDYJPSB7IEZPTExPV19TVEFSX2luX2NvbV9yb3V0ZTE0NzA2X2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1JCUkFDS0VUX2luX2NvbV9yb3V0ZTE0NzI3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19SQlJBQ0tFVF9pbl9jb21fcm91dGUxNDcyN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19SQlJBQ0tFVF9pbl9jb21fcm91dGUxNDcyNwk9IHsgRk9MTE9XX1JCUkFDS0VUX2luX2NvbV9yb3V0ZTE0NzI3X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1NFTUlfaW5fY29tX3JvdXRlMTQ3MzQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1NFTUlfaW5fY29tX3JvdXRlMTQ3MzRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU0VNSV9pbl9jb21fcm91dGUxNDczNAk9IHsgRk9MTE9XX1NFTUlfaW5fY29tX3JvdXRlMTQ3MzRfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfY29tX3BvcnRfaW5fY29tX3JvdXRlMTQ3NDggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2NvbV9wb3J0X2luX2NvbV9yb3V0ZTE0NzQ4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2NvbV9wb3J0X2luX2NvbV9yb3V0ZTE0NzQ4CT0geyBGT0xMT1dfY29tX3BvcnRfaW5fY29tX3JvdXRlMTQ3NDhfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfU0VNSV9pbl9jb21fcm91dGUxNDc1MiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU0VNSV9pbl9jb21fcm91dGUxNDc1Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19TRU1JX2luX2NvbV9yb3V0ZTE0NzUyCT0geyBGT0xMT1dfU0VNSV9pbl9jb21fcm91dGUxNDc1Ml9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fY29tX3BvcnQxNDc4NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX2NvbV9wb3J0MTQ3ODZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDEwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX2NvbV9wb3J0MTQ3ODYJPSB7IEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fY29tX3BvcnQxNDc4Nl9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18xNjRfaW5fY29tX3BvcnQxNDgwMCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMTY0X2luX2NvbV9wb3J0MTQ4MDBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDEwMDQwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMTY0X2luX2NvbV9wb3J0MTQ4MDAJPSB7IEZPTExPV18xNjRfaW5fY29tX3BvcnQxNDgwMF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19jb21fcG9ydF9pZF9pbl9jb21fcG9ydDE0ODEwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19jb21fcG9ydF9pZF9pbl9jb21fcG9ydDE0ODEwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2NvbV9wb3J0X2lkX2luX2NvbV9wb3J0MTQ4MTAJPSB7IEZPTExPV19jb21fcG9ydF9pZF9pbl9jb21fcG9ydDE0ODEwX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xCUkFDS0VUX2luX2NvbV9wb3J0MTQ4MjYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xCUkFDS0VUX2luX2NvbV9wb3J0MTQ4MjZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAyMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTEJSQUNLRVRfaW5fY29tX3BvcnQxNDgyNgk9IHsgRk9MTE9XX0xCUkFDS0VUX2luX2NvbV9wb3J0MTQ4MjZfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfY29tX3BvcnRfaWRfaW5fY29tX3BvcnQxNDgzNyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfY29tX3BvcnRfaWRfaW5fY29tX3BvcnQxNDgzN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDgwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MTAwMDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19jb21fcG9ydF9pZF9pbl9jb21fcG9ydDE0ODM3CT0geyBGT0xMT1dfY29tX3BvcnRfaWRfaW5fY29tX3BvcnQxNDgzN19iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19DT01NQV9pbl9jb21fcG9ydDE0ODU5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19DT01NQV9pbl9jb21fcG9ydDE0ODU5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0NPTU1BX2luX2NvbV9wb3J0MTQ4NTkJPSB7IEZPTExPV19DT01NQV9pbl9jb21fcG9ydDE0ODU5X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2NvbV9wb3J0X2lkX2luX2NvbV9wb3J0MTQ4NjQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2NvbV9wb3J0X2lkX2luX2NvbV9wb3J0MTQ4NjRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA4MDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDEwMDAwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfY29tX3BvcnRfaWRfaW5fY29tX3BvcnQxNDg2NAk9IHsgRk9MTE9XX2NvbV9wb3J0X2lkX2luX2NvbV9wb3J0MTQ4NjRfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfU1RBUl9pbl9jb21fcG9ydDE0ODg3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19TVEFSX2luX2NvbV9wb3J0MTQ4ODdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDEwMDAwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU1RBUl9pbl9jb21fcG9ydDE0ODg3CT0geyBGT0xMT1dfU1RBUl9pbl9jb21fcG9ydDE0ODg3X2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1JCUkFDS0VUX2luX2NvbV9wb3J0MTQ5MDggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1JCUkFDS0VUX2luX2NvbV9wb3J0MTQ5MDhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUkJSQUNLRVRfaW5fY29tX3BvcnQxNDkwOAk9IHsgRk9MTE9XX1JCUkFDS0VUX2luX2NvbV9wb3J0MTQ5MDhfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfY29tX3BvcnRfaWRfaW5fY29tX3BvcnQxNDkyMiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfY29tX3BvcnRfaWRfaW5fY29tX3BvcnQxNDkyMl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19jb21fcG9ydF9pZF9pbl9jb21fcG9ydDE0OTIyCT0geyBGT0xMT1dfY29tX3BvcnRfaWRfaW5fY29tX3BvcnQxNDkyMl9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fY29tX3BvcnRfaWQxNDk1MSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX2NvbV9wb3J0X2lkMTQ5NTFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX2NvbV9wb3J0X2lkMTQ5NTEJPSB7IEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fY29tX3BvcnRfaWQxNDk1MV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zdGF0ZW1lbnRfYXNzaWduX2luX3N0YXRlbWVudDE0OTgxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zdGF0ZW1lbnRfYXNzaWduX2luX3N0YXRlbWVudDE0OTgxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3N0YXRlbWVudF9hc3NpZ25faW5fc3RhdGVtZW50MTQ5ODEJPSB7IEZPTExPV19zdGF0ZW1lbnRfYXNzaWduX2luX3N0YXRlbWVudDE0OTgxX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3N0YXRlbWVudF9jb21faW5fc3RhdGVtZW50MTUwMDIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3N0YXRlbWVudF9jb21faW5fc3RhdGVtZW50MTUwMDJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc3RhdGVtZW50X2NvbV9pbl9zdGF0ZW1lbnQxNTAwMgk9IHsgRk9MTE9XX3N0YXRlbWVudF9jb21faW5fc3RhdGVtZW50MTUwMDJfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc3RhdGVtZW50X2NvbnN0cmFpbnRfaW5fc3RhdGVtZW50MTUwMjUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3N0YXRlbWVudF9jb25zdHJhaW50X2luX3N0YXRlbWVudDE1MDI1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3N0YXRlbWVudF9jb25zdHJhaW50X2luX3N0YXRlbWVudDE1MDI1CT0geyBGT0xMT1dfc3RhdGVtZW50X2NvbnN0cmFpbnRfaW5fc3RhdGVtZW50MTUwMjVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc3RhdGVtZW50X2p1bXBfaW5fc3RhdGVtZW50MTUwNDEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3N0YXRlbWVudF9qdW1wX2luX3N0YXRlbWVudDE1MDQxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3N0YXRlbWVudF9qdW1wX2luX3N0YXRlbWVudDE1MDQxCT0geyBGT0xMT1dfc3RhdGVtZW50X2p1bXBfaW5fc3RhdGVtZW50MTUwNDFfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc3RhdGVtZW50X2FjdGl2aXR5X2luX3N0YXRlbWVudDE1MDY1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zdGF0ZW1lbnRfYWN0aXZpdHlfaW5fc3RhdGVtZW50MTUwNjVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc3RhdGVtZW50X2FjdGl2aXR5X2luX3N0YXRlbWVudDE1MDY1CT0geyBGT0xMT1dfc3RhdGVtZW50X2FjdGl2aXR5X2luX3N0YXRlbWVudDE1MDY1X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3N0YXRlbWVudF9pbnZva2Vfcm91dGluZV9pbl9zdGF0ZW1lbnQxNTA4MyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc3RhdGVtZW50X2ludm9rZV9yb3V0aW5lX2luX3N0YXRlbWVudDE1MDgzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3N0YXRlbWVudF9pbnZva2Vfcm91dGluZV9pbl9zdGF0ZW1lbnQxNTA4Mwk9IHsgRk9MTE9XX3N0YXRlbWVudF9pbnZva2Vfcm91dGluZV9pbl9zdGF0ZW1lbnQxNTA4M19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zdGF0ZW1lbnRfbW9jX2luX3N0YXRlbWVudDE1MDk2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zdGF0ZW1lbnRfbW9jX2luX3N0YXRlbWVudDE1MDk2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3N0YXRlbWVudF9tb2NfaW5fc3RhdGVtZW50MTUwOTYJPSB7IEZPTExPV19zdGF0ZW1lbnRfbW9jX2luX3N0YXRlbWVudDE1MDk2X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3N0YXRlbWVudF9pbnZva2VfaW5fc3RhdGVtZW50MTUxMjAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3N0YXRlbWVudF9pbnZva2VfaW5fc3RhdGVtZW50MTUxMjBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc3RhdGVtZW50X2ludm9rZV9pbl9zdGF0ZW1lbnQxNTEyMAk9IHsgRk9MTE9XX3N0YXRlbWVudF9pbnZva2VfaW5fc3RhdGVtZW50MTUxMjBfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc3RhdGVtZW50X2ludm9rZV9tZXRob2RfaW5fc3RhdGVtZW50MTUxNDAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3N0YXRlbWVudF9pbnZva2VfbWV0aG9kX2luX3N0YXRlbWVudDE1MTQwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3N0YXRlbWVudF9pbnZva2VfbWV0aG9kX2luX3N0YXRlbWVudDE1MTQwCT0geyBGT0xMT1dfc3RhdGVtZW50X2ludm9rZV9tZXRob2RfaW5fc3RhdGVtZW50MTUxNDBfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc3RhdGVtZW50X2FjdGl2aXR5X25ld19pbl9zdGF0ZW1lbnQxNTE1NCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc3RhdGVtZW50X2FjdGl2aXR5X25ld19pbl9zdGF0ZW1lbnQxNTE1NF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zdGF0ZW1lbnRfYWN0aXZpdHlfbmV3X2luX3N0YXRlbWVudDE1MTU0CT0geyBGT0xMT1dfc3RhdGVtZW50X2FjdGl2aXR5X25ld19pbl9zdGF0ZW1lbnQxNTE1NF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zdGF0ZW1lbnRfaXRlX2luX3N0YXRlbWVudDE1MTY5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zdGF0ZW1lbnRfaXRlX2luX3N0YXRlbWVudDE1MTY5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3N0YXRlbWVudF9pdGVfaW5fc3RhdGVtZW50MTUxNjkJPSB7IEZPTExPV19zdGF0ZW1lbnRfaXRlX2luX3N0YXRlbWVudDE1MTY5X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3N0YXRlbWVudF9pdGVyYXRpb25faW5fc3RhdGVtZW50MTUxOTIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3N0YXRlbWVudF9pdGVyYXRpb25faW5fc3RhdGVtZW50MTUxOTJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc3RhdGVtZW50X2l0ZXJhdGlvbl9pbl9zdGF0ZW1lbnQxNTE5Mgk9IHsgRk9MTE9XX3N0YXRlbWVudF9pdGVyYXRpb25faW5fc3RhdGVtZW50MTUxOTJfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX3N0YXRlbWVudDE1MjEyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19ibG9ja19zdGF0ZW1lbnRfaW5fc3RhdGVtZW50MTUyMTJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX3N0YXRlbWVudDE1MjEyCT0geyBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX3N0YXRlbWVudDE1MjEyX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3ByZWZpeF9zdGF0ZW1lbnRfaW5fc3RhdGVtZW50MTUyMzQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3ByZWZpeF9zdGF0ZW1lbnRfaW5fc3RhdGVtZW50MTUyMzRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfcHJlZml4X3N0YXRlbWVudF9pbl9zdGF0ZW1lbnQxNTIzNAk9IHsgRk9MTE9XX3ByZWZpeF9zdGF0ZW1lbnRfaW5fc3RhdGVtZW50MTUyMzRfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc3RhdGVtZW50X3Byb21wdF9pbl9zdGF0ZW1lbnQxNTI1NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc3RhdGVtZW50X3Byb21wdF9pbl9zdGF0ZW1lbnQxNTI1NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zdGF0ZW1lbnRfcHJvbXB0X2luX3N0YXRlbWVudDE1MjU1CT0geyBGT0xMT1dfc3RhdGVtZW50X3Byb21wdF9pbl9zdGF0ZW1lbnQxNTI1NV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19tZXRhX3N0YXRlbWVudF9pbl9zdGF0ZW1lbnQxNTI3NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfbWV0YV9zdGF0ZW1lbnRfaW5fc3RhdGVtZW50MTUyNzZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfbWV0YV9zdGF0ZW1lbnRfaW5fc3RhdGVtZW50MTUyNzYJPSB7IEZPTExPV19tZXRhX3N0YXRlbWVudF9pbl9zdGF0ZW1lbnQxNTI3Nl9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MQ1VSTFlfaW5fYmxvY2tfc3RhdGVtZW50MTUzMTcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xDVVJMWV9pbl9ibG9ja19zdGF0ZW1lbnQxNTMxN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwQzAwMDEwNDQwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjAwM0ZDRkZGQzAwMDEwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAzQzAwMTAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDQ4MDEwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEwM0Y5N0UyNEM4Mzg4MSksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwQjFDMDAwMDNGMDQwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDE4MDAwMDBBNikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MQ1VSTFlfaW5fYmxvY2tfc3RhdGVtZW50MTUzMTcJPSB7IEZPTExPV19MQ1VSTFlfaW5fYmxvY2tfc3RhdGVtZW50MTUzMTdfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfb3BfYmxvY2tfaW5fYmxvY2tfc3RhdGVtZW50MTUzMjQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX29wX2Jsb2NrX2luX2Jsb2NrX3N0YXRlbWVudDE1MzI0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDBDMDAwMTA0NDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMTAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDNDMDAxMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwNDgwMTAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTAzRjk3RTI0QzgzODgxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjBCMUMwMDAwM0YwNDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMTgwMDAwMEE2KSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX29wX2Jsb2NrX2luX2Jsb2NrX3N0YXRlbWVudDE1MzI0CT0geyBGT0xMT1dfb3BfYmxvY2tfaW5fYmxvY2tfc3RhdGVtZW50MTUzMjRfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc3RhdGVtZW50X2luX2Jsb2NrX3N0YXRlbWVudDE1MzQ4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zdGF0ZW1lbnRfaW5fYmxvY2tfc3RhdGVtZW50MTUzNDhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMEMwMDAxMDQ0MDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDIwMDAwMDAwMDAwMDAxMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwM0MwMDEwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDA0ODAxMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMDNGOTdFMjRDODM4ODEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMEIxQzAwMDAzRjA0MDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAxODAwMDAwQTYpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc3RhdGVtZW50X2luX2Jsb2NrX3N0YXRlbWVudDE1MzQ4CT0geyBGT0xMT1dfc3RhdGVtZW50X2luX2Jsb2NrX3N0YXRlbWVudDE1MzQ4X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1JDVVJMWV9pbl9ibG9ja19zdGF0ZW1lbnQxNTM2MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfUkNVUkxZX2luX2Jsb2NrX3N0YXRlbWVudDE1MzYwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1JDVVJMWV9pbl9ibG9ja19zdGF0ZW1lbnQxNTM2MAk9IHsgRk9MTE9XX1JDVVJMWV9pbl9ibG9ja19zdGF0ZW1lbnQxNTM2MF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19vcF9zZXF1ZW5jZV9pbl9vcF9ibG9jazE1Mzc3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19vcF9zZXF1ZW5jZV9pbl9vcF9ibG9jazE1Mzc3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX29wX3NlcXVlbmNlX2luX29wX2Jsb2NrMTUzNzcJPSB7IEZPTExPV19vcF9zZXF1ZW5jZV9pbl9vcF9ibG9jazE1Mzc3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX29wX3NjaGVkdWxpbmdfaW5fb3BfYmxvY2sxNTM4OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfb3Bfc2NoZWR1bGluZ19pbl9vcF9ibG9jazE1Mzg5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX29wX3NjaGVkdWxpbmdfaW5fb3BfYmxvY2sxNTM4OQk9IHsgRk9MTE9XX29wX3NjaGVkdWxpbmdfaW5fb3BfYmxvY2sxNTM4OV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19vcF9jb25jdXJyZW5jeV9pbl9vcF9ibG9jazE1Mzk5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19vcF9jb25jdXJyZW5jeV9pbl9vcF9ibG9jazE1Mzk5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX29wX2NvbmN1cnJlbmN5X2luX29wX2Jsb2NrMTUzOTkJPSB7IEZPTExPV19vcF9jb25jdXJyZW5jeV9pbl9vcF9ibG9jazE1Mzk5X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX09QX0ZPUktfaW5fb3BfYmxvY2sxNTQwNyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfT1BfRk9SS19pbl9vcF9ibG9jazE1NDA3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX09QX0ZPUktfaW5fb3BfYmxvY2sxNTQwNwk9IHsgRk9MTE9XX09QX0ZPUktfaW5fb3BfYmxvY2sxNTQwN19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19PUF9KT0lOX2luX29wX2Jsb2NrMTU0MjMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX09QX0pPSU5faW5fb3BfYmxvY2sxNTQyM19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19PUF9KT0lOX2luX29wX2Jsb2NrMTU0MjMJPSB7IEZPTExPV19PUF9KT0lOX2luX29wX2Jsb2NrMTU0MjNfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfT1BfU0VRVUVOQ0VfaW5fb3Bfc2VxdWVuY2UxNTQ0OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfT1BfU0VRVUVOQ0VfaW5fb3Bfc2VxdWVuY2UxNTQ0OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19PUF9TRVFVRU5DRV9pbl9vcF9zZXF1ZW5jZTE1NDQ5CT0geyBGT0xMT1dfT1BfU0VRVUVOQ0VfaW5fb3Bfc2VxdWVuY2UxNTQ0OV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19PUF9TRVFVRU5DRV9TSURFX2luX29wX3NlcXVlbmNlMTU0NjQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX09QX1NFUVVFTkNFX1NJREVfaW5fb3Bfc2VxdWVuY2UxNTQ2NF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19PUF9TRVFVRU5DRV9TSURFX2luX29wX3NlcXVlbmNlMTU0NjQJPSB7IEZPTExPV19PUF9TRVFVRU5DRV9TSURFX2luX29wX3NlcXVlbmNlMTU0NjRfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfT1BfU0VRVUVOQ0VfV0VBS19pbl9vcF9zZXF1ZW5jZTE1NDc0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19PUF9TRVFVRU5DRV9XRUFLX2luX29wX3NlcXVlbmNlMTU0NzRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfT1BfU0VRVUVOQ0VfV0VBS19pbl9vcF9zZXF1ZW5jZTE1NDc0CT0geyBGT0xMT1dfT1BfU0VRVUVOQ0VfV0VBS19pbl9vcF9zZXF1ZW5jZTE1NDc0X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX09QX0FUT01JQ19TRVFVRU5DRV9pbl9vcF9zZXF1ZW5jZTE1NDg1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19PUF9BVE9NSUNfU0VRVUVOQ0VfaW5fb3Bfc2VxdWVuY2UxNTQ4NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19PUF9BVE9NSUNfU0VRVUVOQ0VfaW5fb3Bfc2VxdWVuY2UxNTQ4NQk9IHsgRk9MTE9XX09QX0FUT01JQ19TRVFVRU5DRV9pbl9vcF9zZXF1ZW5jZTE1NDg1X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX09QX1NDSEVEVUxFX0dUX2luX29wX3NjaGVkdWxpbmcxNTUwMyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfT1BfU0NIRURVTEVfR1RfaW5fb3Bfc2NoZWR1bGluZzE1NTAzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX09QX1NDSEVEVUxFX0dUX2luX29wX3NjaGVkdWxpbmcxNTUwMwk9IHsgRk9MTE9XX09QX1NDSEVEVUxFX0dUX2luX29wX3NjaGVkdWxpbmcxNTUwM19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19PUF9TQ0hFRFVMRV9MVF9pbl9vcF9zY2hlZHVsaW5nMTU1MTcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX09QX1NDSEVEVUxFX0xUX2luX29wX3NjaGVkdWxpbmcxNTUxN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19PUF9TQ0hFRFVMRV9MVF9pbl9vcF9zY2hlZHVsaW5nMTU1MTcJPSB7IEZPTExPV19PUF9TQ0hFRFVMRV9MVF9pbl9vcF9zY2hlZHVsaW5nMTU1MTdfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfT1BfU0NIRURVTEVfWE9SX2luX29wX3NjaGVkdWxpbmcxNTUzMSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfT1BfU0NIRURVTEVfWE9SX2luX29wX3NjaGVkdWxpbmcxNTUzMV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19PUF9TQ0hFRFVMRV9YT1JfaW5fb3Bfc2NoZWR1bGluZzE1NTMxCT0geyBGT0xMT1dfT1BfU0NIRURVTEVfWE9SX2luX29wX3NjaGVkdWxpbmcxNTUzMV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19PUF9TQ0hFRFVMRV9BTkRfVEhFTl9pbl9vcF9zY2hlZHVsaW5nMTU1NDUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX09QX1NDSEVEVUxFX0FORF9USEVOX2luX29wX3NjaGVkdWxpbmcxNTU0NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19PUF9TQ0hFRFVMRV9BTkRfVEhFTl9pbl9vcF9zY2hlZHVsaW5nMTU1NDUJPSB7IEZPTExPV19PUF9TQ0hFRFVMRV9BTkRfVEhFTl9pbl9vcF9zY2hlZHVsaW5nMTU1NDVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfT1BfU0NIRURVTEVfT1JfRUxTRV9pbl9vcF9zY2hlZHVsaW5nMTU1NTMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX09QX1NDSEVEVUxFX09SX0VMU0VfaW5fb3Bfc2NoZWR1bGluZzE1NTUzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX09QX1NDSEVEVUxFX09SX0VMU0VfaW5fb3Bfc2NoZWR1bGluZzE1NTUzCT0geyBGT0xMT1dfT1BfU0NIRURVTEVfT1JfRUxTRV9pbl9vcF9zY2hlZHVsaW5nMTU1NTNfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfT1BfTk9OX0RFVEVSTUlOSVNNX2luX29wX3NjaGVkdWxpbmcxNTU2MyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfT1BfTk9OX0RFVEVSTUlOSVNNX2luX29wX3NjaGVkdWxpbmcxNTU2M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19PUF9OT05fREVURVJNSU5JU01faW5fb3Bfc2NoZWR1bGluZzE1NTYzCT0geyBGT0xMT1dfT1BfTk9OX0RFVEVSTUlOSVNNX2luX29wX3NjaGVkdWxpbmcxNTU2M19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19PUF9DT05DVVJSRU5DWV9BU1lOQ19pbl9vcF9jb25jdXJyZW5jeTE1NTgzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19PUF9DT05DVVJSRU5DWV9BU1lOQ19pbl9vcF9jb25jdXJyZW5jeTE1NTgzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX09QX0NPTkNVUlJFTkNZX0FTWU5DX2luX29wX2NvbmN1cnJlbmN5MTU1ODMJPSB7IEZPTExPV19PUF9DT05DVVJSRU5DWV9BU1lOQ19pbl9vcF9jb25jdXJyZW5jeTE1NTgzX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX09QX0NPTkNVUlJFTkNZX0FORF9pbl9vcF9jb25jdXJyZW5jeTE1NjAxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19PUF9DT05DVVJSRU5DWV9BTkRfaW5fb3BfY29uY3VycmVuY3kxNTYwMV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19PUF9DT05DVVJSRU5DWV9BTkRfaW5fb3BfY29uY3VycmVuY3kxNTYwMQk9IHsgRk9MTE9XX09QX0NPTkNVUlJFTkNZX0FORF9pbl9vcF9jb25jdXJyZW5jeTE1NjAxX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX09QX0NPTkNVUlJFTkNZX09SX2luX29wX2NvbmN1cnJlbmN5MTU2MjEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX09QX0NPTkNVUlJFTkNZX09SX2luX29wX2NvbmN1cnJlbmN5MTU2MjFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfT1BfQ09OQ1VSUkVOQ1lfT1JfaW5fb3BfY29uY3VycmVuY3kxNTYyMQk9IHsgRk9MTE9XX09QX0NPTkNVUlJFTkNZX09SX2luX29wX2NvbmN1cnJlbmN5MTU2MjFfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfT1BfQ09OQ1VSUkVOQ1lfSU5URVJMRUFWSU5HX2luX29wX2NvbmN1cnJlbmN5MTU2NDIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX09QX0NPTkNVUlJFTkNZX0lOVEVSTEVBVklOR19pbl9vcF9jb25jdXJyZW5jeTE1NjQyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX09QX0NPTkNVUlJFTkNZX0lOVEVSTEVBVklOR19pbl9vcF9jb25jdXJyZW5jeTE1NjQyCT0geyBGT0xMT1dfT1BfQ09OQ1VSUkVOQ1lfSU5URVJMRUFWSU5HX2luX29wX2NvbmN1cnJlbmN5MTU2NDJfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfT1BfQ09OQ1VSUkVOQ1lfUEFSQUxMRUxfaW5fb3BfY29uY3VycmVuY3kxNTY1MyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfT1BfQ09OQ1VSUkVOQ1lfUEFSQUxMRUxfaW5fb3BfY29uY3VycmVuY3kxNTY1M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19PUF9DT05DVVJSRU5DWV9QQVJBTExFTF9pbl9vcF9jb25jdXJyZW5jeTE1NjUzCT0geyBGT0xMT1dfT1BfQ09OQ1VSUkVOQ1lfUEFSQUxMRUxfaW5fb3BfY29uY3VycmVuY3kxNTY1M19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19PUF9DT05DVVJSRU5DWV9SRFZfQVNZTkNfaW5fb3BfY29uY3VycmVuY3kxNTY2OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfT1BfQ09OQ1VSUkVOQ1lfUkRWX0FTWU5DX2luX29wX2NvbmN1cnJlbmN5MTU2NjlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfT1BfQ09OQ1VSUkVOQ1lfUkRWX0FTWU5DX2luX29wX2NvbmN1cnJlbmN5MTU2NjkJPSB7IEZPTExPV19PUF9DT05DVVJSRU5DWV9SRFZfQVNZTkNfaW5fb3BfY29uY3VycmVuY3kxNTY2OV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19PUF9DT05DVVJSRU5DWV9SRFZfQU5EX2luX29wX2NvbmN1cnJlbmN5MTU2ODMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX09QX0NPTkNVUlJFTkNZX1JEVl9BTkRfaW5fb3BfY29uY3VycmVuY3kxNTY4M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19PUF9DT05DVVJSRU5DWV9SRFZfQU5EX2luX29wX2NvbmN1cnJlbmN5MTU2ODMJPSB7IEZPTExPV19PUF9DT05DVVJSRU5DWV9SRFZfQU5EX2luX29wX2NvbmN1cnJlbmN5MTU2ODNfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfT1BfQ09OQ1VSUkVOQ1lfUkRWX09SX2luX29wX2NvbmN1cnJlbmN5MTU2OTkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX09QX0NPTkNVUlJFTkNZX1JEVl9PUl9pbl9vcF9jb25jdXJyZW5jeTE1Njk5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX09QX0NPTkNVUlJFTkNZX1JEVl9PUl9pbl9vcF9jb25jdXJyZW5jeTE1Njk5CT0geyBGT0xMT1dfT1BfQ09OQ1VSUkVOQ1lfUkRWX09SX2luX29wX2NvbmN1cnJlbmN5MTU2OTlfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfT1BfQ09OQ1VSUkVOQ1lfUkRWX0lOVEVSTEVBVklOR19pbl9vcF9jb25jdXJyZW5jeTE1NzE2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19PUF9DT05DVVJSRU5DWV9SRFZfSU5URVJMRUFWSU5HX2luX29wX2NvbmN1cnJlbmN5MTU3MTZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfT1BfQ09OQ1VSUkVOQ1lfUkRWX0lOVEVSTEVBVklOR19pbl9vcF9jb25jdXJyZW5jeTE1NzE2CT0geyBGT0xMT1dfT1BfQ09OQ1VSUkVOQ1lfUkRWX0lOVEVSTEVBVklOR19pbl9vcF9jb25jdXJyZW5jeTE1NzE2X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX09QX0NPTkNVUlJFTkNZX1JEVl9QQVJBTExFTF9pbl9vcF9jb25jdXJyZW5jeTE1NzIzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19PUF9DT05DVVJSRU5DWV9SRFZfUEFSQUxMRUxfaW5fb3BfY29uY3VycmVuY3kxNTcyM19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19PUF9DT05DVVJSRU5DWV9SRFZfUEFSQUxMRUxfaW5fb3BfY29uY3VycmVuY3kxNTcyMwk9IHsgRk9MTE9XX09QX0NPTkNVUlJFTkNZX1JEVl9QQVJBTExFTF9pbl9vcF9jb25jdXJyZW5jeTE1NzIzX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1BMVVNfaW5fb3BfaW52b2thYmxlMTU3NDYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1BMVVNfaW5fb3BfaW52b2thYmxlMTU3NDZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUExVU19pbl9vcF9pbnZva2FibGUxNTc0Ngk9IHsgRk9MTE9XX1BMVVNfaW5fb3BfaW52b2thYmxlMTU3NDZfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTUlOVVNfaW5fb3BfaW52b2thYmxlMTU3NjYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX01JTlVTX2luX29wX2ludm9rYWJsZTE1NzY2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX01JTlVTX2luX29wX2ludm9rYWJsZTE1NzY2CT0geyBGT0xMT1dfTUlOVVNfaW5fb3BfaW52b2thYmxlMTU3NjZfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfU1RBUl9pbl9vcF9pbnZva2FibGUxNTc4NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU1RBUl9pbl9vcF9pbnZva2FibGUxNTc4NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19TVEFSX2luX29wX2ludm9rYWJsZTE1Nzg1CT0geyBGT0xMT1dfU1RBUl9pbl9vcF9pbnZva2FibGUxNTc4NV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19ESVZfaW5fb3BfaW52b2thYmxlMTU4MDQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0RJVl9pbl9vcF9pbnZva2FibGUxNTgwNF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19ESVZfaW5fb3BfaW52b2thYmxlMTU4MDQJPSB7IEZPTExPV19ESVZfaW5fb3BfaW52b2thYmxlMTU4MDRfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTU9EX2luX29wX2ludm9rYWJsZTE1ODI0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19NT0RfaW5fb3BfaW52b2thYmxlMTU4MjRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTU9EX2luX29wX2ludm9rYWJsZTE1ODI0CT0geyBGT0xMT1dfTU9EX2luX29wX2ludm9rYWJsZTE1ODI0X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0VRVUFMX2luX29wX2ludm9rYWJsZTE1ODQ3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19FUVVBTF9pbl9vcF9pbnZva2FibGUxNTg0N19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19FUVVBTF9pbl9vcF9pbnZva2FibGUxNTg0Nwk9IHsgRk9MTE9XX0VRVUFMX2luX29wX2ludm9rYWJsZTE1ODQ3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX05FUVVBTF9pbl9vcF9pbnZva2FibGUxNTg2NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTkVRVUFMX2luX29wX2ludm9rYWJsZTE1ODY1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX05FUVVBTF9pbl9vcF9pbnZva2FibGUxNTg2NQk9IHsgRk9MTE9XX05FUVVBTF9pbl9vcF9pbnZva2FibGUxNTg2NV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TRVFVQUxfaW5fb3BfaW52b2thYmxlMTU4ODMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1NFUVVBTF9pbl9vcF9pbnZva2FibGUxNTg4M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19TRVFVQUxfaW5fb3BfaW52b2thYmxlMTU4ODMJPSB7IEZPTExPV19TRVFVQUxfaW5fb3BfaW52b2thYmxlMTU4ODNfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTlNFUVVBTF9pbl9vcF9pbnZva2FibGUxNTkwMCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTlNFUVVBTF9pbl9vcF9pbnZva2FibGUxNTkwMF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19OU0VRVUFMX2luX29wX2ludm9rYWJsZTE1OTAwCT0geyBGT0xMT1dfTlNFUVVBTF9pbl9vcF9pbnZva2FibGUxNTkwMF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19HVF9pbl9vcF9pbnZva2FibGUxNTkxNyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfR1RfaW5fb3BfaW52b2thYmxlMTU5MTdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfR1RfaW5fb3BfaW52b2thYmxlMTU5MTcJPSB7IEZPTExPV19HVF9pbl9vcF9pbnZva2FibGUxNTkxN19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19HVEVfaW5fb3BfaW52b2thYmxlMTU5MzggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0dURV9pbl9vcF9pbnZva2FibGUxNTkzOF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19HVEVfaW5fb3BfaW52b2thYmxlMTU5MzgJPSB7IEZPTExPV19HVEVfaW5fb3BfaW52b2thYmxlMTU5MzhfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTFRfX2luX29wX2ludm9rYWJsZTE1OTU4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MVF9faW5fb3BfaW52b2thYmxlMTU5NThfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTFRfX2luX29wX2ludm9rYWJsZTE1OTU4CT0geyBGT0xMT1dfTFRfX2luX29wX2ludm9rYWJsZTE1OTU4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xURV9pbl9vcF9pbnZva2FibGUxNTk3OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTFRFX2luX29wX2ludm9rYWJsZTE1OTc4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xURV9pbl9vcF9pbnZva2FibGUxNTk3OAk9IHsgRk9MTE9XX0xURV9pbl9vcF9pbnZva2FibGUxNTk3OF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MTk9UX2luX29wX2ludm9rYWJsZTE1OTk5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MTk9UX2luX29wX2ludm9rYWJsZTE1OTk5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xOT1RfaW5fb3BfaW52b2thYmxlMTU5OTkJPSB7IEZPTExPV19MTk9UX2luX29wX2ludm9rYWJsZTE1OTk5X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xBTkRfaW5fb3BfaW52b2thYmxlMTYwMTggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xBTkRfaW5fb3BfaW52b2thYmxlMTYwMThfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTEFORF9pbl9vcF9pbnZva2FibGUxNjAxOAk9IHsgRk9MTE9XX0xBTkRfaW5fb3BfaW52b2thYmxlMTYwMThfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTEFORF9USEVOX2luX29wX2ludm9rYWJsZTE2MDM3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MQU5EX1RIRU5faW5fb3BfaW52b2thYmxlMTYwMzdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTEFORF9USEVOX2luX29wX2ludm9rYWJsZTE2MDM3CT0geyBGT0xMT1dfTEFORF9USEVOX2luX29wX2ludm9rYWJsZTE2MDM3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xPUl9pbl9vcF9pbnZva2FibGUxNjA1MSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTE9SX2luX29wX2ludm9rYWJsZTE2MDUxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xPUl9pbl9vcF9pbnZva2FibGUxNjA1MQk9IHsgRk9MTE9XX0xPUl9pbl9vcF9pbnZva2FibGUxNjA1MV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MT1JfRUxTRV9pbl9vcF9pbnZva2FibGUxNjA3MSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTE9SX0VMU0VfaW5fb3BfaW52b2thYmxlMTYwNzFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTE9SX0VMU0VfaW5fb3BfaW52b2thYmxlMTYwNzEJPSB7IEZPTExPV19MT1JfRUxTRV9pbl9vcF9pbnZva2FibGUxNjA3MV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19CTk9UX2luX29wX2ludm9rYWJsZTE2MDg3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19CTk9UX2luX29wX2ludm9rYWJsZTE2MDg3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0JOT1RfaW5fb3BfaW52b2thYmxlMTYwODcJPSB7IEZPTExPV19CTk9UX2luX29wX2ludm9rYWJsZTE2MDg3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0JBTkRfaW5fb3BfaW52b2thYmxlMTYxMDYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0JBTkRfaW5fb3BfaW52b2thYmxlMTYxMDZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQkFORF9pbl9vcF9pbnZva2FibGUxNjEwNgk9IHsgRk9MTE9XX0JBTkRfaW5fb3BfaW52b2thYmxlMTYxMDZfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfQk9SX2luX29wX2ludm9rYWJsZTE2MTI1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19CT1JfaW5fb3BfaW52b2thYmxlMTYxMjVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQk9SX2luX29wX2ludm9rYWJsZTE2MTI1CT0geyBGT0xMT1dfQk9SX2luX29wX2ludm9rYWJsZTE2MTI1X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0JYT1JfaW5fb3BfaW52b2thYmxlMTYxNDUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0JYT1JfaW5fb3BfaW52b2thYmxlMTYxNDVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQlhPUl9pbl9vcF9pbnZva2FibGUxNjE0NQk9IHsgRk9MTE9XX0JYT1JfaW5fb3BfaW52b2thYmxlMTYxNDVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTFNISUZUX2luX29wX2ludm9rYWJsZTE2MTY1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MU0hJRlRfaW5fb3BfaW52b2thYmxlMTYxNjVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTFNISUZUX2luX29wX2ludm9rYWJsZTE2MTY1CT0geyBGT0xMT1dfTFNISUZUX2luX29wX2ludm9rYWJsZTE2MTY1X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1JTSElGVF9pbl9vcF9pbnZva2FibGUxNjE4MiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfUlNISUZUX2luX29wX2ludm9rYWJsZTE2MTgyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1JTSElGVF9pbl9vcF9pbnZva2FibGUxNjE4Mgk9IHsgRk9MTE9XX1JTSElGVF9pbl9vcF9pbnZva2FibGUxNjE4Ml9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19BU1NJR05faW5fb3BfaW52b2thYmxlMTYyMDAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0FTU0lHTl9pbl9vcF9pbnZva2FibGUxNjIwMF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19BU1NJR05faW5fb3BfaW52b2thYmxlMTYyMDAJPSB7IEZPTExPV19BU1NJR05faW5fb3BfaW52b2thYmxlMTYyMDBfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfQVNTSUdOX0FGVEVSX2luX29wX2ludm9rYWJsZTE2MjE3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19BU1NJR05fQUZURVJfaW5fb3BfaW52b2thYmxlMTYyMTdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQVNTSUdOX0FGVEVSX2luX29wX2ludm9rYWJsZTE2MjE3CT0geyBGT0xMT1dfQVNTSUdOX0FGVEVSX2luX29wX2ludm9rYWJsZTE2MjE3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0FTU0lHTl9SRUZfaW5fb3BfaW52b2thYmxlMTYyMjggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0FTU0lHTl9SRUZfaW5fb3BfaW52b2thYmxlMTYyMjhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQVNTSUdOX1JFRl9pbl9vcF9pbnZva2FibGUxNjIyOAk9IHsgRk9MTE9XX0FTU0lHTl9SRUZfaW5fb3BfaW52b2thYmxlMTYyMjhfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfQVNTSUdOX01BQ1JPX2luX29wX2ludm9rYWJsZTE2MjQxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19BU1NJR05fTUFDUk9faW5fb3BfaW52b2thYmxlMTYyNDFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQVNTSUdOX01BQ1JPX2luX29wX2ludm9rYWJsZTE2MjQxCT0geyBGT0xMT1dfQVNTSUdOX01BQ1JPX2luX29wX2ludm9rYWJsZTE2MjQxX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX09QX1BVU0hfaW5fb3BfaW52b2thYmxlMTYyNTMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX09QX1BVU0hfaW5fb3BfaW52b2thYmxlMTYyNTNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfT1BfUFVTSF9pbl9vcF9pbnZva2FibGUxNjI1Mwk9IHsgRk9MTE9XX09QX1BVU0hfaW5fb3BfaW52b2thYmxlMTYyNTNfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfT1BfQVNTSUdOX1RPUF9pbl9vcF9pbnZva2FibGUxNjI2OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfT1BfQVNTSUdOX1RPUF9pbl9vcF9pbnZva2FibGUxNjI2OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19PUF9BU1NJR05fVE9QX2luX29wX2ludm9rYWJsZTE2MjY5CT0geyBGT0xMT1dfT1BfQVNTSUdOX1RPUF9pbl9vcF9pbnZva2FibGUxNjI2OV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19PUF9UT1BfaW5fb3BfaW52b2thYmxlMTYyNzkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX09QX1RPUF9pbl9vcF9pbnZva2FibGUxNjI3OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19PUF9UT1BfaW5fb3BfaW52b2thYmxlMTYyNzkJPSB7IEZPTExPV19PUF9UT1BfaW5fb3BfaW52b2thYmxlMTYyNzlfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfT1BfUE9QX2luX29wX2ludm9rYWJsZTE2Mjk2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19PUF9QT1BfaW5fb3BfaW52b2thYmxlMTYyOTZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfT1BfUE9QX2luX29wX2ludm9rYWJsZTE2Mjk2CT0geyBGT0xMT1dfT1BfUE9QX2luX29wX2ludm9rYWJsZTE2Mjk2X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0RPTExBUl9MQ1VSTFlfaW5fcHJlZml4X3N0YXRlbWVudDE2MzI3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19ET0xMQVJfTENVUkxZX2luX3ByZWZpeF9zdGF0ZW1lbnQxNjMyN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDkwNDYwODAxMDAyNjJGMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEwNDAzMDAwMjY0QjI0QyksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDMwOCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDEwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAxMzgwNDA4MTgwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwQjBDMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDA4MDAwMDAyNCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19ET0xMQVJfTENVUkxZX2luX3ByZWZpeF9zdGF0ZW1lbnQxNjMyNwk9IHsgRk9MTE9XX0RPTExBUl9MQ1VSTFlfaW5fcHJlZml4X3N0YXRlbWVudDE2MzI3X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2F2bV9vcGVyYXRvcl9pbl9wcmVmaXhfc3RhdGVtZW50MTYzMzIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2F2bV9vcGVyYXRvcl9pbl9wcmVmaXhfc3RhdGVtZW50MTYzMzJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDIxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfYXZtX29wZXJhdG9yX2luX3ByZWZpeF9zdGF0ZW1lbnQxNjMzMgk9IHsgRk9MTE9XX2F2bV9vcGVyYXRvcl9pbl9wcmVmaXhfc3RhdGVtZW50MTYzMzJfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfcHJlZml4X3N0YXRlbWVudF9pbl9wcmVmaXhfc3RhdGVtZW50MTYzNDYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3ByZWZpeF9zdGF0ZW1lbnRfaW5fcHJlZml4X3N0YXRlbWVudDE2MzQ2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3ByZWZpeF9zdGF0ZW1lbnRfaW5fcHJlZml4X3N0YXRlbWVudDE2MzQ2CT0geyBGT0xMT1dfcHJlZml4X3N0YXRlbWVudF9pbl9wcmVmaXhfc3RhdGVtZW50MTYzNDZfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfdW5hcnlFeHByZXNzaW9uX2luX3ByZWZpeF9zdGF0ZW1lbnQxNjM2NyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfdW5hcnlFeHByZXNzaW9uX2luX3ByZWZpeF9zdGF0ZW1lbnQxNjM2N19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fcHJlZml4X3N0YXRlbWVudDE2MzY3CT0geyBGT0xMT1dfdW5hcnlFeHByZXNzaW9uX2luX3ByZWZpeF9zdGF0ZW1lbnQxNjM2N19iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19SQ1VSTFlfaW5fcHJlZml4X3N0YXRlbWVudDE2MzkyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19SQ1VSTFlfaW5fcHJlZml4X3N0YXRlbWVudDE2MzkyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1JDVVJMWV9pbl9wcmVmaXhfc3RhdGVtZW50MTYzOTIJPSB7IEZPTExPV19SQ1VSTFlfaW5fcHJlZml4X3N0YXRlbWVudDE2MzkyX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0RPTExBUl9MQ1VSTFlfaW5fcHJlZml4X2V4cHJlc3Npb24xNjQwNyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfRE9MTEFSX0xDVVJMWV9pbl9wcmVmaXhfZXhwcmVzc2lvbjE2NDA3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwOTA0NjA4MDEwMDI2MkYwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTA0MDMwMDAyNjRCMjRDKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMzA4KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMTAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDEzODA0MDgxODAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjBCMEMwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDgwMDAwMDI0KSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0RPTExBUl9MQ1VSTFlfaW5fcHJlZml4X2V4cHJlc3Npb24xNjQwNwk9IHsgRk9MTE9XX0RPTExBUl9MQ1VSTFlfaW5fcHJlZml4X2V4cHJlc3Npb24xNjQwN19iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19hdm1fb3BlcmF0b3JfaW5fcHJlZml4X2V4cHJlc3Npb24xNjQxMiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfYXZtX29wZXJhdG9yX2luX3ByZWZpeF9leHByZXNzaW9uMTY0MTJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDIxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfYXZtX29wZXJhdG9yX2luX3ByZWZpeF9leHByZXNzaW9uMTY0MTIJPSB7IEZPTExPV19hdm1fb3BlcmF0b3JfaW5fcHJlZml4X2V4cHJlc3Npb24xNjQxMl9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19wcmVmaXhfZXhwcmVzc2lvbl9pbl9wcmVmaXhfZXhwcmVzc2lvbjE2NDI2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19wcmVmaXhfZXhwcmVzc2lvbl9pbl9wcmVmaXhfZXhwcmVzc2lvbjE2NDI2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3ByZWZpeF9leHByZXNzaW9uX2luX3ByZWZpeF9leHByZXNzaW9uMTY0MjYJPSB7IEZPTExPV19wcmVmaXhfZXhwcmVzc2lvbl9pbl9wcmVmaXhfZXhwcmVzc2lvbjE2NDI2X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3VuYXJ5RXhwcmVzc2lvbl9pbl9wcmVmaXhfZXhwcmVzc2lvbjE2NDQ2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fcHJlZml4X2V4cHJlc3Npb24xNjQ0Nl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MjEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fcHJlZml4X2V4cHJlc3Npb24xNjQ0Ngk9IHsgRk9MTE9XX3VuYXJ5RXhwcmVzc2lvbl9pbl9wcmVmaXhfZXhwcmVzc2lvbjE2NDQ2X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1JDVVJMWV9pbl9wcmVmaXhfZXhwcmVzc2lvbjE2NDcxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19SQ1VSTFlfaW5fcHJlZml4X2V4cHJlc3Npb24xNjQ3MV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19SQ1VSTFlfaW5fcHJlZml4X2V4cHJlc3Npb24xNjQ3MQk9IHsgRk9MTE9XX1JDVVJMWV9pbl9wcmVmaXhfZXhwcmVzc2lvbjE2NDcxX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX29wX2ludm9rYWJsZV9pbl9hdm1fb3BlcmF0b3IxNjQ4OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfb3BfaW52b2thYmxlX2luX2F2bV9vcGVyYXRvcjE2NDg4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX29wX2ludm9rYWJsZV9pbl9hdm1fb3BlcmF0b3IxNjQ4OAk9IHsgRk9MTE9XX29wX2ludm9rYWJsZV9pbl9hdm1fb3BlcmF0b3IxNjQ4OF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19vcF9hY3Rpdml0eV9pbl9hdm1fb3BlcmF0b3IxNjUwMCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfb3BfYWN0aXZpdHlfaW5fYXZtX29wZXJhdG9yMTY1MDBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfb3BfYWN0aXZpdHlfaW5fYXZtX29wZXJhdG9yMTY1MDAJPSB7IEZPTExPV19vcF9hY3Rpdml0eV9pbl9hdm1fb3BlcmF0b3IxNjUwMF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19JRF9pbl9hdm1fb3BlcmF0b3IxNjUxMiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfSURfaW5fYXZtX29wZXJhdG9yMTY1MTJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfSURfaW5fYXZtX29wZXJhdG9yMTY1MTIJPSB7IEZPTExPV19JRF9pbl9hdm1fb3BlcmF0b3IxNjUxMl9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yNTBfaW5fc3RhdGVtZW50X2ludm9rZV9tZXRob2QxNjU0MSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjUwX2luX3N0YXRlbWVudF9pbnZva2VfbWV0aG9kMTY1NDFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjUwX2luX3N0YXRlbWVudF9pbnZva2VfbWV0aG9kMTY1NDEJPSB7IEZPTExPV18yNTBfaW5fc3RhdGVtZW50X2ludm9rZV9tZXRob2QxNjU0MV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19JRF9pbl9zdGF0ZW1lbnRfaW52b2tlX21ldGhvZDE2NTQ1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19JRF9pbl9zdGF0ZW1lbnRfaW52b2tlX21ldGhvZDE2NTQ1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwODAwMDAwMDgwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0lEX2luX3N0YXRlbWVudF9pbnZva2VfbWV0aG9kMTY1NDUJPSB7IEZPTExPV19JRF9pbl9zdGF0ZW1lbnRfaW52b2tlX21ldGhvZDE2NTQ1X2JpdHMsIDYJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2RlY2xfaW5zdGFuY2VfbWFjaGluZV9wYXJhbXNfaW5fc3RhdGVtZW50X2ludm9rZV9tZXRob2QxNjU1NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3BhcmFtc19pbl9zdGF0ZW1lbnRfaW52b2tlX21ldGhvZDE2NTU2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwODAwMDAwMDgwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlY2xfaW5zdGFuY2VfbWFjaGluZV9wYXJhbXNfaW5fc3RhdGVtZW50X2ludm9rZV9tZXRob2QxNjU1Ngk9IHsgRk9MTE9XX2RlY2xfaW5zdGFuY2VfbWFjaGluZV9wYXJhbXNfaW5fc3RhdGVtZW50X2ludm9rZV9tZXRob2QxNjU1Nl9iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWNsX2luc3RhbmNlX21hY2hpbmVfcmV0dXJuc19pbl9zdGF0ZW1lbnRfaW52b2tlX21ldGhvZDE2NTY1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWNsX2luc3RhbmNlX21hY2hpbmVfcmV0dXJuc19pbl9zdGF0ZW1lbnRfaW52b2tlX21ldGhvZDE2NTY1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlY2xfaW5zdGFuY2VfbWFjaGluZV9yZXR1cm5zX2luX3N0YXRlbWVudF9pbnZva2VfbWV0aG9kMTY1NjUJPSB7IEZPTExPV19kZWNsX2luc3RhbmNlX21hY2hpbmVfcmV0dXJuc19pbl9zdGF0ZW1lbnRfaW52b2tlX21ldGhvZDE2NTY1X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2ludm9rZV9tZXRob2QxNjU3NCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfaW52b2tlX21ldGhvZDE2NTc0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2ludm9rZV9tZXRob2QxNjU3NAk9IHsgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2ludm9rZV9tZXRob2QxNjU3NF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MUEFSRU5fSU5WT0tFX2luX3N0YXRlbWVudF9pbnZva2UxNjU5MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTFBBUkVOX0lOVk9LRV9pbl9zdGF0ZW1lbnRfaW52b2tlMTY1OTBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTFBBUkVOX0lOVk9LRV9pbl9zdGF0ZW1lbnRfaW52b2tlMTY1OTAJPSB7IEZPTExPV19MUEFSRU5fSU5WT0tFX2luX3N0YXRlbWVudF9pbnZva2UxNjU5MF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fc3RhdGVtZW50X2ludm9rZTE2NTk5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fc3RhdGVtZW50X2ludm9rZTE2NTk5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwOTA0NjA4MDEwMDI2MkYwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTA0MDMwMDAyNjRCMjRDKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMzA4KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDA4MDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3VuYXJ5RXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfaW52b2tlMTY1OTkJPSB7IEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fc3RhdGVtZW50X2ludm9rZTE2NTk5X2JpdHMsIDUJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lEX2luX3N0YXRlbWVudF9pbnZva2UxNjYxMiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfSURfaW5fc3RhdGVtZW50X2ludm9rZTE2NjEyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwNjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDgxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwNDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyNDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0lEX2luX3N0YXRlbWVudF9pbnZva2UxNjYxMgk9IHsgRk9MTE9XX0lEX2luX3N0YXRlbWVudF9pbnZva2UxNjYxMl9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yOTVfaW5fc3RhdGVtZW50X2ludm9rZTE2NjM0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yOTVfaW5fc3RhdGVtZW50X2ludm9rZTE2NjM0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwNjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDgxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwNDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyNDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzI5NV9pbl9zdGF0ZW1lbnRfaW52b2tlMTY2MzQJPSB7IEZPTExPV18yOTVfaW5fc3RhdGVtZW50X2ludm9rZTE2NjM0X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX29wX2ludm9rYWJsZV9pbl9zdGF0ZW1lbnRfaW52b2tlMTY2NTkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX29wX2ludm9rYWJsZV9pbl9zdGF0ZW1lbnRfaW52b2tlMTY2NTlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDA2MDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwODEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDA0MDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDI0MDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfb3BfaW52b2thYmxlX2luX3N0YXRlbWVudF9pbnZva2UxNjY1OQk9IHsgRk9MTE9XX29wX2ludm9rYWJsZV9pbl9zdGF0ZW1lbnRfaW52b2tlMTY2NTlfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfaW52b2tlMTY2ODAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2ludm9rZTE2NjgwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwNjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDgxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwNDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyNDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2ludm9rZTE2NjgwCT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfaW52b2tlMTY2ODBfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzU0X2luX3N0YXRlbWVudF9pbnZva2UxNjY5OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzU0X2luX3N0YXRlbWVudF9pbnZva2UxNjY5OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zNTRfaW5fc3RhdGVtZW50X2ludm9rZTE2Njk4CT0geyBGT0xMT1dfMzU0X2luX3N0YXRlbWVudF9pbnZva2UxNjY5OF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9pbnZva2UxNjcwNCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfaW52b2tlMTY3MDRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfaW52b2tlMTY3MDQJPSB7IEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9pbnZva2UxNjcwNF9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yODdfaW5fc3RhdGVtZW50X2ludm9rZTE2NzEzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yODdfaW5fc3RhdGVtZW50X2ludm9rZTE2NzEzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzI4N19pbl9zdGF0ZW1lbnRfaW52b2tlMTY3MTMJPSB7IEZPTExPV18yODdfaW5fc3RhdGVtZW50X2ludm9rZTE2NzEzX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3VuYXJ5RXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfaW52b2tlMTY3MjMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3VuYXJ5RXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfaW52b2tlMTY3MjNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfdW5hcnlFeHByZXNzaW9uX2luX3N0YXRlbWVudF9pbnZva2UxNjcyMwk9IHsgRk9MTE9XX3VuYXJ5RXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfaW52b2tlMTY3MjNfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzk0X2luX3N0YXRlbWVudF9pbnZva2UxNjczMiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzk0X2luX3N0YXRlbWVudF9pbnZva2UxNjczMl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zOTRfaW5fc3RhdGVtZW50X2ludm9rZTE2NzMyCT0geyBGT0xMT1dfMzk0X2luX3N0YXRlbWVudF9pbnZva2UxNjczMl9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fc3RhdGVtZW50X2ludm9rZTE2NzQ0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fc3RhdGVtZW50X2ludm9rZTE2NzQ0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3VuYXJ5RXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfaW52b2tlMTY3NDQJPSB7IEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fc3RhdGVtZW50X2ludm9rZTE2NzQ0X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzIzOF9pbl9zdGF0ZW1lbnRfaW52b2tlMTY3NTMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzIzOF9pbl9zdGF0ZW1lbnRfaW52b2tlMTY3NTNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAxMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMTM4MDQwODE4MDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMEIwQzAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwODAwMDAwMjQpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjM4X2luX3N0YXRlbWVudF9pbnZva2UxNjc1Mwk9IHsgRk9MTE9XXzIzOF9pbl9zdGF0ZW1lbnRfaW52b2tlMTY3NTNfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfb3BfYWN0aXZpdHlfaW5fc3RhdGVtZW50X2ludm9rZTE2NzU5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19vcF9hY3Rpdml0eV9pbl9zdGF0ZW1lbnRfaW52b2tlMTY3NTlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfb3BfYWN0aXZpdHlfaW5fc3RhdGVtZW50X2ludm9rZTE2NzU5CT0geyBGT0xMT1dfb3BfYWN0aXZpdHlfaW5fc3RhdGVtZW50X2ludm9rZTE2NzU5X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1JQQVJFTl9pbl9zdGF0ZW1lbnRfaW52b2tlMTY3NzIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1JQQVJFTl9pbl9zdGF0ZW1lbnRfaW52b2tlMTY3NzJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUlBBUkVOX2luX3N0YXRlbWVudF9pbnZva2UxNjc3Mgk9IHsgRk9MTE9XX1JQQVJFTl9pbl9zdGF0ZW1lbnRfaW52b2tlMTY3NzJfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfaW52b2tlMTY3NzcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2ludm9rZTE2Nzc3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2ludm9rZTE2Nzc3CT0geyBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfaW52b2tlMTY3NzdfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTFBBUkVOX0lOVk9LRV9pbl9leHByZXNzaW9uX2ludm9rZTE2NzkyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MUEFSRU5fSU5WT0tFX2luX2V4cHJlc3Npb25faW52b2tlMTY3OTJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTFBBUkVOX0lOVk9LRV9pbl9leHByZXNzaW9uX2ludm9rZTE2NzkyCT0geyBGT0xMT1dfTFBBUkVOX0lOVk9LRV9pbl9leHByZXNzaW9uX2ludm9rZTE2NzkyX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3VuYXJ5RXhwcmVzc2lvbl9pbl9leHByZXNzaW9uX2ludm9rZTE2ODAxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fZXhwcmVzc2lvbl9pbnZva2UxNjgwMV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDkwNDYwODAxMDAyNjJGMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEwNDAzMDAwMjY0QjI0QyksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDMwOCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwODAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fZXhwcmVzc2lvbl9pbnZva2UxNjgwMQk9IHsgRk9MTE9XX3VuYXJ5RXhwcmVzc2lvbl9pbl9leHByZXNzaW9uX2ludm9rZTE2ODAxX2JpdHMsIDUJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lEX2luX2V4cHJlc3Npb25faW52b2tlMTY4MTUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0lEX2luX2V4cHJlc3Npb25faW52b2tlMTY4MTVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDA2MDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwODEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDA0MDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDI0MDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfSURfaW5fZXhwcmVzc2lvbl9pbnZva2UxNjgxNQk9IHsgRk9MTE9XX0lEX2luX2V4cHJlc3Npb25faW52b2tlMTY4MTVfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjk1X2luX2V4cHJlc3Npb25faW52b2tlMTY4MzcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzI5NV9pbl9leHByZXNzaW9uX2ludm9rZTE2ODM3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwNjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDgxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwNDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyNDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzI5NV9pbl9leHByZXNzaW9uX2ludm9rZTE2ODM3CT0geyBGT0xMT1dfMjk1X2luX2V4cHJlc3Npb25faW52b2tlMTY4MzdfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfb3BfaW52b2thYmxlX2luX2V4cHJlc3Npb25faW52b2tlMTY4NjIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX29wX2ludm9rYWJsZV9pbl9leHByZXNzaW9uX2ludm9rZTE2ODYyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwNjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDgxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwNDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyNDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX29wX2ludm9rYWJsZV9pbl9leHByZXNzaW9uX2ludm9rZTE2ODYyCT0geyBGT0xMT1dfb3BfaW52b2thYmxlX2luX2V4cHJlc3Npb25faW52b2tlMTY4NjJfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uX2ludm9rZTE2ODgzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb25faW52b2tlMTY4ODNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDA2MDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwODEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDA0MDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDI0MDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uX2ludm9rZTE2ODgzCT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uX2ludm9rZTE2ODgzX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzM1NF9pbl9leHByZXNzaW9uX2ludm9rZTE2OTAxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zNTRfaW5fZXhwcmVzc2lvbl9pbnZva2UxNjkwMV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zNTRfaW5fZXhwcmVzc2lvbl9pbnZva2UxNjkwMQk9IHsgRk9MTE9XXzM1NF9pbl9leHByZXNzaW9uX2ludm9rZTE2OTAxX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbl9pbnZva2UxNjkwNyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uX2ludm9rZTE2OTA3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbl9pbnZva2UxNjkwNwk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbl9pbnZva2UxNjkwN19iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yODdfaW5fZXhwcmVzc2lvbl9pbnZva2UxNjkxNiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjg3X2luX2V4cHJlc3Npb25faW52b2tlMTY5MTZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjg3X2luX2V4cHJlc3Npb25faW52b2tlMTY5MTYJPSB7IEZPTExPV18yODdfaW5fZXhwcmVzc2lvbl9pbnZva2UxNjkxNl9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fZXhwcmVzc2lvbl9pbnZva2UxNjkyNSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfdW5hcnlFeHByZXNzaW9uX2luX2V4cHJlc3Npb25faW52b2tlMTY5MjVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfdW5hcnlFeHByZXNzaW9uX2luX2V4cHJlc3Npb25faW52b2tlMTY5MjUJPSB7IEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fZXhwcmVzc2lvbl9pbnZva2UxNjkyNV9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zOTRfaW5fZXhwcmVzc2lvbl9pbnZva2UxNjkzNCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzk0X2luX2V4cHJlc3Npb25faW52b2tlMTY5MzRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzk0X2luX2V4cHJlc3Npb25faW52b2tlMTY5MzQJPSB7IEZPTExPV18zOTRfaW5fZXhwcmVzc2lvbl9pbnZva2UxNjkzNF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fZXhwcmVzc2lvbl9pbnZva2UxNjk0NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfdW5hcnlFeHByZXNzaW9uX2luX2V4cHJlc3Npb25faW52b2tlMTY5NDVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfdW5hcnlFeHByZXNzaW9uX2luX2V4cHJlc3Npb25faW52b2tlMTY5NDUJPSB7IEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fZXhwcmVzc2lvbl9pbnZva2UxNjk0NV9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yMzhfaW5fZXhwcmVzc2lvbl9pbnZva2UxNjk1NCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjM4X2luX2V4cHJlc3Npb25faW52b2tlMTY5NTRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAxMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMTM4MDQwODE4MDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMEIwQzAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwODAwMDAwMjQpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjM4X2luX2V4cHJlc3Npb25faW52b2tlMTY5NTQJPSB7IEZPTExPV18yMzhfaW5fZXhwcmVzc2lvbl9pbnZva2UxNjk1NF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19vcF9hY3Rpdml0eV9pbl9leHByZXNzaW9uX2ludm9rZTE2OTYwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19vcF9hY3Rpdml0eV9pbl9leHByZXNzaW9uX2ludm9rZTE2OTYwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX29wX2FjdGl2aXR5X2luX2V4cHJlc3Npb25faW52b2tlMTY5NjAJPSB7IEZPTExPV19vcF9hY3Rpdml0eV9pbl9leHByZXNzaW9uX2ludm9rZTE2OTYwX2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1JQQVJFTl9pbl9leHByZXNzaW9uX2ludm9rZTE2OTczICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19SUEFSRU5faW5fZXhwcmVzc2lvbl9pbnZva2UxNjk3M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19SUEFSRU5faW5fZXhwcmVzc2lvbl9pbnZva2UxNjk3Mwk9IHsgRk9MTE9XX1JQQVJFTl9pbl9leHByZXNzaW9uX2ludm9rZTE2OTczX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzMzMF9pbl9zdGF0ZW1lbnRfYWN0aXZpdHlfbmV3MTcwMDEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzMzMF9pbl9zdGF0ZW1lbnRfYWN0aXZpdHlfbmV3MTcwMDFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzMwX2luX3N0YXRlbWVudF9hY3Rpdml0eV9uZXcxNzAwMQk9IHsgRk9MTE9XXzMzMF9pbl9zdGF0ZW1lbnRfYWN0aXZpdHlfbmV3MTcwMDFfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX3N0YXRlbWVudF9hY3Rpdml0eV9uZXcxNzAxMiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX3N0YXRlbWVudF9hY3Rpdml0eV9uZXcxNzAxMl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDgwMDAwMDA4MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fc3RhdGVtZW50X2FjdGl2aXR5X25ldzE3MDEyCT0geyBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX3N0YXRlbWVudF9hY3Rpdml0eV9uZXcxNzAxMl9iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWNsX2luc3RhbmNlX2R5bmFtaWNfaW1wbF9pbl9zdGF0ZW1lbnRfYWN0aXZpdHlfbmV3MTcwMjcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlY2xfaW5zdGFuY2VfZHluYW1pY19pbXBsX2luX3N0YXRlbWVudF9hY3Rpdml0eV9uZXcxNzAyN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDgwMDAwMDA4MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWNsX2luc3RhbmNlX2R5bmFtaWNfaW1wbF9pbl9zdGF0ZW1lbnRfYWN0aXZpdHlfbmV3MTcwMjcJPSB7IEZPTExPV19kZWNsX2luc3RhbmNlX2R5bmFtaWNfaW1wbF9pbl9zdGF0ZW1lbnRfYWN0aXZpdHlfbmV3MTcwMjdfYml0cywgNgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2V0X2luX3N0YXRlbWVudF9hY3Rpdml0eV9uZXcxNzAzNiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2V0X2luX3N0YXRlbWVudF9hY3Rpdml0eV9uZXcxNzAzNl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZXRfaW5fc3RhdGVtZW50X2FjdGl2aXR5X25ldzE3MDM2CT0geyBGT0xMT1dfc2V0X2luX3N0YXRlbWVudF9hY3Rpdml0eV9uZXcxNzAzNl9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9hY3Rpdml0eV9uZXcxNzA0OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfYWN0aXZpdHlfbmV3MTcwNDhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfYWN0aXZpdHlfbmV3MTcwNDgJPSB7IEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9hY3Rpdml0eV9uZXcxNzA0OF9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hY3Rpdml0eV9uZXcxNzA2MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYWN0aXZpdHlfbmV3MTcwNjBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYWN0aXZpdHlfbmV3MTcwNjAJPSB7IEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hY3Rpdml0eV9uZXcxNzA2MF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MUEFSRU5faW5fZGVjbF9pbnN0YW5jZV9keW5hbWljX2ltcGwxNzA5MyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTFBBUkVOX2luX2RlY2xfaW5zdGFuY2VfZHluYW1pY19pbXBsMTcwOTNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTFBBUkVOX2luX2RlY2xfaW5zdGFuY2VfZHluYW1pY19pbXBsMTcwOTMJPSB7IEZPTExPV19MUEFSRU5faW5fZGVjbF9pbnN0YW5jZV9keW5hbWljX2ltcGwxNzA5M19iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5X2luX2RlY2xfaW5zdGFuY2VfZHluYW1pY19pbXBsMTcxMDIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlfaW5fZGVjbF9pbnN0YW5jZV9keW5hbWljX2ltcGwxNzEwMl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19kZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5X2luX2RlY2xfaW5zdGFuY2VfZHluYW1pY19pbXBsMTcxMDIJPSB7IEZPTExPV19kZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5X2luX2RlY2xfaW5zdGFuY2VfZHluYW1pY19pbXBsMTcxMDJfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfUlBBUkVOX2luX2RlY2xfaW5zdGFuY2VfZHluYW1pY19pbXBsMTcxMTQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1JQQVJFTl9pbl9kZWNsX2luc3RhbmNlX2R5bmFtaWNfaW1wbDE3MTE0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1JQQVJFTl9pbl9kZWNsX2luc3RhbmNlX2R5bmFtaWNfaW1wbDE3MTE0CT0geyBGT0xMT1dfUlBBUkVOX2luX2RlY2xfaW5zdGFuY2VfZHluYW1pY19pbXBsMTcxMTRfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTENVUkxZX2luX2RlY2xfaW5zdGFuY2VfZHluYW1pY19pbXBsMTcxMzYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xDVVJMWV9pbl9kZWNsX2luc3RhbmNlX2R5bmFtaWNfaW1wbDE3MTM2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDBDMDAwMTA0NDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMTAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAyMDAwMDNDMDAxMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwNDgwMTAwNDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTAzRjk3RTI0QzgzODgxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjBCMUMwMDAwM0YwNDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMTgwMDAwMEE2KSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xDVVJMWV9pbl9kZWNsX2luc3RhbmNlX2R5bmFtaWNfaW1wbDE3MTM2CT0geyBGT0xMT1dfTENVUkxZX2luX2RlY2xfaW5zdGFuY2VfZHluYW1pY19pbXBsMTcxMzZfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc3RhdGVtZW50X2luX2RlY2xfaW5zdGFuY2VfZHluYW1pY19pbXBsMTcxNDcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3N0YXRlbWVudF9pbl9kZWNsX2luc3RhbmNlX2R5bmFtaWNfaW1wbDE3MTQ3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDBDMDAwMTA0NDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMTAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAyMDAwMDNDMDAxMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwNDgwMTAwNDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTAzRjk3RTI0QzgzODgxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjBCMUMwMDAwM0YwNDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMTgwMDAwMEE2KSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3N0YXRlbWVudF9pbl9kZWNsX2luc3RhbmNlX2R5bmFtaWNfaW1wbDE3MTQ3CT0geyBGT0xMT1dfc3RhdGVtZW50X2luX2RlY2xfaW5zdGFuY2VfZHluYW1pY19pbXBsMTcxNDdfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZGVmX2luc3RhbmNlX2FjdGl2aXR5X2luX2RlY2xfaW5zdGFuY2VfZHluYW1pY19pbXBsMTcxNjIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlZl9pbnN0YW5jZV9hY3Rpdml0eV9pbl9kZWNsX2luc3RhbmNlX2R5bmFtaWNfaW1wbDE3MTYyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAyMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwNDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl9pbnN0YW5jZV9hY3Rpdml0eV9pbl9kZWNsX2luc3RhbmNlX2R5bmFtaWNfaW1wbDE3MTYyCT0geyBGT0xMT1dfZGVmX2luc3RhbmNlX2FjdGl2aXR5X2luX2RlY2xfaW5zdGFuY2VfZHluYW1pY19pbXBsMTcxNjJfYml0cywgNAl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfUkNVUkxZX2luX2RlY2xfaW5zdGFuY2VfZHluYW1pY19pbXBsMTcxNzMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1JDVVJMWV9pbl9kZWNsX2luc3RhbmNlX2R5bmFtaWNfaW1wbDE3MTczX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1JDVVJMWV9pbl9kZWNsX2luc3RhbmNlX2R5bmFtaWNfaW1wbDE3MTczCT0geyBGT0xMT1dfUkNVUkxZX2luX2RlY2xfaW5zdGFuY2VfZHluYW1pY19pbXBsMTcxNzNfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzMwX2luX2V4cHJlc3Npb25fYWN0aXZpdHlfbmV3MTcyMDQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzMzMF9pbl9leHByZXNzaW9uX2FjdGl2aXR5X25ldzE3MjA0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzMzMF9pbl9leHByZXNzaW9uX2FjdGl2aXR5X25ldzE3MjA0CT0geyBGT0xMT1dfMzMwX2luX2V4cHJlc3Npb25fYWN0aXZpdHlfbmV3MTcyMDRfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX2V4cHJlc3Npb25fYWN0aXZpdHlfbmV3MTcyMTYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9leHByZXNzaW9uX2FjdGl2aXR5X25ldzE3MjE2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9leHByZXNzaW9uX2FjdGl2aXR5X25ldzE3MjE2CT0geyBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX2V4cHJlc3Npb25fYWN0aXZpdHlfbmV3MTcyMTZfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfYWN0aXZpdHlfbWFjaGluZV9wYXJhbV9yZXR1cm5faW5fZXhwcmVzc2lvbl9hY3Rpdml0eV9uZXcxNzIyNyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfYWN0aXZpdHlfbWFjaGluZV9wYXJhbV9yZXR1cm5faW5fZXhwcmVzc2lvbl9hY3Rpdml0eV9uZXcxNzIyN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19hY3Rpdml0eV9tYWNoaW5lX3BhcmFtX3JldHVybl9pbl9leHByZXNzaW9uX2FjdGl2aXR5X25ldzE3MjI3CT0geyBGT0xMT1dfYWN0aXZpdHlfbWFjaGluZV9wYXJhbV9yZXR1cm5faW5fZXhwcmVzc2lvbl9hY3Rpdml0eV9uZXcxNzIyN19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TVEFURU1FTlRfUFJPTVBUX2luX3N0YXRlbWVudF9wcm9tcHQxNzI1MSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU1RBVEVNRU5UX1BST01QVF9pbl9zdGF0ZW1lbnRfcHJvbXB0MTcyNTFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU1RBVEVNRU5UX1BST01QVF9pbl9zdGF0ZW1lbnRfcHJvbXB0MTcyNTEJPSB7IEZPTExPV19TVEFURU1FTlRfUFJPTVBUX2luX3N0YXRlbWVudF9wcm9tcHQxNzI1MV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zdGF0ZW1lbnRfcHJvbXB0X2ltcGxfaW5fc3RhdGVtZW50X3Byb21wdDE3MjU2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zdGF0ZW1lbnRfcHJvbXB0X2ltcGxfaW5fc3RhdGVtZW50X3Byb21wdDE3MjU2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3N0YXRlbWVudF9wcm9tcHRfaW1wbF9pbl9zdGF0ZW1lbnRfcHJvbXB0MTcyNTYJPSB7IEZPTExPV19zdGF0ZW1lbnRfcHJvbXB0X2ltcGxfaW5fc3RhdGVtZW50X3Byb21wdDE3MjU2X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3N0YXRlbWVudF9wcm9tcHRfb2JzX2luX3N0YXRlbWVudF9wcm9tcHRfaW1wbDE3Mjc1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zdGF0ZW1lbnRfcHJvbXB0X29ic19pbl9zdGF0ZW1lbnRfcHJvbXB0X2ltcGwxNzI3NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zdGF0ZW1lbnRfcHJvbXB0X29ic19pbl9zdGF0ZW1lbnRfcHJvbXB0X2ltcGwxNzI3NQk9IHsgRk9MTE9XX3N0YXRlbWVudF9wcm9tcHRfb2JzX2luX3N0YXRlbWVudF9wcm9tcHRfaW1wbDE3Mjc1X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lEX2luX3N0YXRlbWVudF9wcm9tcHRfb2JzMTczMDAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0lEX2luX3N0YXRlbWVudF9wcm9tcHRfb2JzMTczMDBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDA0MDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfSURfaW5fc3RhdGVtZW50X3Byb21wdF9vYnMxNzMwMAk9IHsgRk9MTE9XX0lEX2luX3N0YXRlbWVudF9wcm9tcHRfb2JzMTczMDBfYml0cywgNQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjY2X2luX3N0YXRlbWVudF9wcm9tcHRfb2JzMTczMDggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzI2Nl9pbl9zdGF0ZW1lbnRfcHJvbXB0X29iczE3MzA4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzI2Nl9pbl9zdGF0ZW1lbnRfcHJvbXB0X29iczE3MzA4CT0geyBGT0xMT1dfMjY2X2luX3N0YXRlbWVudF9wcm9tcHRfb2JzMTczMDhfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX3N0YXRlbWVudF9wcm9tcHRfb2JzMTczMTIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9zdGF0ZW1lbnRfcHJvbXB0X29iczE3MzEyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9zdGF0ZW1lbnRfcHJvbXB0X29iczE3MzEyCT0geyBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX3N0YXRlbWVudF9wcm9tcHRfb2JzMTczMTJfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTENVUkxZX2luX3N0YXRlbWVudF9wcm9tcHRfb2JzMTczMjkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xDVVJMWV9pbl9zdGF0ZW1lbnRfcHJvbXB0X29iczE3MzI5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAzRjgwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwM0YwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xDVVJMWV9pbl9zdGF0ZW1lbnRfcHJvbXB0X29iczE3MzI5CT0geyBGT0xMT1dfTENVUkxZX2luX3N0YXRlbWVudF9wcm9tcHRfb2JzMTczMjlfYml0cywgNgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc3RhdGVtZW50X3Byb21wdF9vYnNfY29tX2luX3N0YXRlbWVudF9wcm9tcHRfb2JzMTczMzggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3N0YXRlbWVudF9wcm9tcHRfb2JzX2NvbV9pbl9zdGF0ZW1lbnRfcHJvbXB0X29iczE3MzM4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3N0YXRlbWVudF9wcm9tcHRfb2JzX2NvbV9pbl9zdGF0ZW1lbnRfcHJvbXB0X29iczE3MzM4CT0geyBGT0xMT1dfc3RhdGVtZW50X3Byb21wdF9vYnNfY29tX2luX3N0YXRlbWVudF9wcm9tcHRfb2JzMTczMzhfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfUkNVUkxZX2luX3N0YXRlbWVudF9wcm9tcHRfb2JzMTczNDQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1JDVVJMWV9pbl9zdGF0ZW1lbnRfcHJvbXB0X29iczE3MzQ0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgxMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwNDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1JDVVJMWV9pbl9zdGF0ZW1lbnRfcHJvbXB0X29iczE3MzQ0CT0geyBGT0xMT1dfUkNVUkxZX2luX3N0YXRlbWVudF9wcm9tcHRfb2JzMTczNDRfYml0cywgNgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzU0X2luX3N0YXRlbWVudF9wcm9tcHRfb2JzMTczNTIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzM1NF9pbl9zdGF0ZW1lbnRfcHJvbXB0X29iczE3MzUyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzM1NF9pbl9zdGF0ZW1lbnRfcHJvbXB0X29iczE3MzUyCT0geyBGT0xMT1dfMzU0X2luX3N0YXRlbWVudF9wcm9tcHRfb2JzMTczNTJfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfcHJvbXB0X29iczE3MzU2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9wcm9tcHRfb2JzMTczNTZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfcHJvbXB0X29iczE3MzU2CT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfcHJvbXB0X29iczE3MzU2X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xCUkFDS0VUX2luX3N0YXRlbWVudF9wcm9tcHRfb2JzMTczNjMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xCUkFDS0VUX2luX3N0YXRlbWVudF9wcm9tcHRfb2JzMTczNjNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTEJSQUNLRVRfaW5fc3RhdGVtZW50X3Byb21wdF9vYnMxNzM2Mwk9IHsgRk9MTE9XX0xCUkFDS0VUX2luX3N0YXRlbWVudF9wcm9tcHRfb2JzMTczNjNfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfcHJvbXB0X29iczE3MzY3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9wcm9tcHRfb2JzMTczNjdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDEwMDAwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfcHJvbXB0X29iczE3MzY3CT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfcHJvbXB0X29iczE3MzY3X2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1JCUkFDS0VUX2luX3N0YXRlbWVudF9wcm9tcHRfb2JzMTczNjkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1JCUkFDS0VUX2luX3N0YXRlbWVudF9wcm9tcHRfb2JzMTczNjlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUkJSQUNLRVRfaW5fc3RhdGVtZW50X3Byb21wdF9vYnMxNzM2OQk9IHsgRk9MTE9XX1JCUkFDS0VUX2luX3N0YXRlbWVudF9wcm9tcHRfb2JzMTczNjlfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfcHJvbXB0X29iczE3Mzc5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9wcm9tcHRfb2JzMTczNzlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfcHJvbXB0X29iczE3Mzc5CT0geyBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfcHJvbXB0X29iczE3Mzc5X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3N0YXRlbWVudF9jb21faW5fc3RhdGVtZW50X3Byb21wdF9vYnNfY29tMTc0MDQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3N0YXRlbWVudF9jb21faW5fc3RhdGVtZW50X3Byb21wdF9vYnNfY29tMTc0MDRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc3RhdGVtZW50X2NvbV9pbl9zdGF0ZW1lbnRfcHJvbXB0X29ic19jb20xNzQwNAk9IHsgRk9MTE9XX3N0YXRlbWVudF9jb21faW5fc3RhdGVtZW50X3Byb21wdF9vYnNfY29tMTc0MDRfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTU2X2luX21ldGFfc3RhdGVtZW50MTc0MjcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzE1Nl9pbl9tZXRhX3N0YXRlbWVudDE3NDI3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE1Nl9pbl9tZXRhX3N0YXRlbWVudDE3NDI3CT0geyBGT0xMT1dfMTU2X2luX21ldGFfc3RhdGVtZW50MTc0MjdfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX21ldGFfc3RhdGVtZW50MTc0MzIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9tZXRhX3N0YXRlbWVudDE3NDMyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9tZXRhX3N0YXRlbWVudDE3NDMyCT0geyBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX21ldGFfc3RhdGVtZW50MTc0MzJfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTU3X2luX21ldGFfc3RhdGVtZW50MTc0NDAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzE1N19pbl9tZXRhX3N0YXRlbWVudDE3NDQwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE1N19pbl9tZXRhX3N0YXRlbWVudDE3NDQwCT0geyBGT0xMT1dfMTU3X2luX21ldGFfc3RhdGVtZW50MTc0NDBfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX21ldGFfc3RhdGVtZW50MTc0NDggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9tZXRhX3N0YXRlbWVudDE3NDQ4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9tZXRhX3N0YXRlbWVudDE3NDQ4CT0geyBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX21ldGFfc3RhdGVtZW50MTc0NDhfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTU1X2luX21ldGFfc3RhdGVtZW50MTc0NTYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzE1NV9pbl9tZXRhX3N0YXRlbWVudDE3NDU2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE1NV9pbl9tZXRhX3N0YXRlbWVudDE3NDU2CT0geyBGT0xMT1dfMTU1X2luX21ldGFfc3RhdGVtZW50MTc0NTZfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX21ldGFfc3RhdGVtZW50MTc0NjQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9tZXRhX3N0YXRlbWVudDE3NDY0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9tZXRhX3N0YXRlbWVudDE3NDY0CT0geyBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX21ldGFfc3RhdGVtZW50MTc0NjRfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTU0X2luX21ldGFfc3RhdGVtZW50MTc0NzIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzE1NF9pbl9tZXRhX3N0YXRlbWVudDE3NDcyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE1NF9pbl9tZXRhX3N0YXRlbWVudDE3NDcyCT0geyBGT0xMT1dfMTU0X2luX21ldGFfc3RhdGVtZW50MTc0NzJfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX21ldGFfc3RhdGVtZW50MTc0NzggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9tZXRhX3N0YXRlbWVudDE3NDc4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9tZXRhX3N0YXRlbWVudDE3NDc4CT0geyBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX21ldGFfc3RhdGVtZW50MTc0NzhfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfbHZhbHVlX2luX3N0YXRlbWVudF9hc3NpZ24xNzUxMCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfbHZhbHVlX2luX3N0YXRlbWVudF9hc3NpZ24xNzUxMF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDYwODAwMDA2NDBEOENGMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDYwNDAzMDAwMjFCMEMzMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMEMzMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19sdmFsdWVfaW5fc3RhdGVtZW50X2Fzc2lnbjE3NTEwCT0geyBGT0xMT1dfbHZhbHVlX2luX3N0YXRlbWVudF9hc3NpZ24xNzUxMF9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zZXRfaW5fc3RhdGVtZW50X2Fzc2lnbjE3NTE1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zZXRfaW5fc3RhdGVtZW50X2Fzc2lnbjE3NTE1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3NldF9pbl9zdGF0ZW1lbnRfYXNzaWduMTc1MTUJPSB7IEZPTExPV19zZXRfaW5fc3RhdGVtZW50X2Fzc2lnbjE3NTE1X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2Fzc2lnbjE3NTI4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9hc3NpZ24xNzUyOF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9hc3NpZ24xNzUyOAk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2Fzc2lnbjE3NTI4X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2Fzc2lnbjE3NTMxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xNzUzMV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xNzUzMQk9IHsgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2Fzc2lnbjE3NTMxX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0FTU0lHTl9SRUZfaW5fc3RhdGVtZW50X2Fzc2lnbjE3NTQyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19BU1NJR05fUkVGX2luX3N0YXRlbWVudF9hc3NpZ24xNzU0Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDQwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19BU1NJR05fUkVGX2luX3N0YXRlbWVudF9hc3NpZ24xNzU0Mgk9IHsgRk9MTE9XX0FTU0lHTl9SRUZfaW5fc3RhdGVtZW50X2Fzc2lnbjE3NTQyX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2x2YWx1ZV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc1NDcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2x2YWx1ZV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc1NDdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfbHZhbHVlX2luX3N0YXRlbWVudF9hc3NpZ24xNzU0Nwk9IHsgRk9MTE9XX2x2YWx1ZV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc1NDdfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc1NTAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2Fzc2lnbjE3NTUwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2Fzc2lnbjE3NTUwCT0geyBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc1NTBfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfQVNTSUdOX01BQ1JPX2luX3N0YXRlbWVudF9hc3NpZ24xNzU1OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQVNTSUdOX01BQ1JPX2luX3N0YXRlbWVudF9hc3NpZ24xNzU1OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19BU1NJR05fTUFDUk9faW5fc3RhdGVtZW50X2Fzc2lnbjE3NTU5CT0geyBGT0xMT1dfQVNTSUdOX01BQ1JPX2luX3N0YXRlbWVudF9hc3NpZ24xNzU1OV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9hc3NpZ24xNzU2NCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfYXNzaWduMTc1NjRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfYXNzaWduMTc1NjQJPSB7IEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9hc3NpZ24xNzU2NF9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xNzU2NyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc1NjdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc1NjcJPSB7IEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xNzU2N19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zZXRfaW5fc3RhdGVtZW50X2Fzc2lnbjE3NTc3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zZXRfaW5fc3RhdGVtZW50X2Fzc2lnbjE3NTc3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3NldF9pbl9zdGF0ZW1lbnRfYXNzaWduMTc1NzcJPSB7IEZPTExPV19zZXRfaW5fc3RhdGVtZW50X2Fzc2lnbjE3NTc3X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2Fzc2lnbjE3NTkwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9hc3NpZ24xNzU5MF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9hc3NpZ24xNzU5MAk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2Fzc2lnbjE3NTkwX2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2Fzc2lnbjE3NTkzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xNzU5M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xNzU5Mwk9IHsgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2Fzc2lnbjE3NTkzX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3NldF9pbl9zdGF0ZW1lbnRfYXNzaWduMTc2MDIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NldF9pbl9zdGF0ZW1lbnRfYXNzaWduMTc2MDJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2V0X2luX3N0YXRlbWVudF9hc3NpZ24xNzYwMgk9IHsgRk9MTE9XX3NldF9pbl9zdGF0ZW1lbnRfYXNzaWduMTc2MDJfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfYXNzaWduMTc2MTUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2Fzc2lnbjE3NjE1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2Fzc2lnbjE3NjE1CT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfYXNzaWduMTc2MTVfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc2MTggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2Fzc2lnbjE3NjE4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2Fzc2lnbjE3NjE4CT0geyBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc2MThfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2V0X2luX3N0YXRlbWVudF9hc3NpZ24xNzYyNyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2V0X2luX3N0YXRlbWVudF9hc3NpZ24xNzYyN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZXRfaW5fc3RhdGVtZW50X2Fzc2lnbjE3NjI3CT0geyBGT0xMT1dfc2V0X2luX3N0YXRlbWVudF9hc3NpZ24xNzYyN19iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9hc3NpZ24xNzY0MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfYXNzaWduMTc2NDBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfYXNzaWduMTc2NDAJPSB7IEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9hc3NpZ24xNzY0MF9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xNzY0MyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc2NDNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc2NDMJPSB7IEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xNzY0M19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zZXRfaW5fc3RhdGVtZW50X2Fzc2lnbjE3NjUyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zZXRfaW5fc3RhdGVtZW50X2Fzc2lnbjE3NjUyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3NldF9pbl9zdGF0ZW1lbnRfYXNzaWduMTc2NTIJPSB7IEZPTExPV19zZXRfaW5fc3RhdGVtZW50X2Fzc2lnbjE3NjUyX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2Fzc2lnbjE3NjY1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9hc3NpZ24xNzY2NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9hc3NpZ24xNzY2NQk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2Fzc2lnbjE3NjY1X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2Fzc2lnbjE3NjY4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xNzY2OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xNzY2OAk9IHsgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2Fzc2lnbjE3NjY4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3NldF9pbl9zdGF0ZW1lbnRfYXNzaWduMTc2NzcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NldF9pbl9zdGF0ZW1lbnRfYXNzaWduMTc2NzdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2V0X2luX3N0YXRlbWVudF9hc3NpZ24xNzY3Nwk9IHsgRk9MTE9XX3NldF9pbl9zdGF0ZW1lbnRfYXNzaWduMTc2NzdfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfYXNzaWduMTc2OTAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2Fzc2lnbjE3NjkwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2Fzc2lnbjE3NjkwCT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfYXNzaWduMTc2OTBfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc2OTMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2Fzc2lnbjE3NjkzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2Fzc2lnbjE3NjkzCT0geyBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc2OTNfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2V0X2luX3N0YXRlbWVudF9hc3NpZ24xNzcwMyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2V0X2luX3N0YXRlbWVudF9hc3NpZ24xNzcwM19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZXRfaW5fc3RhdGVtZW50X2Fzc2lnbjE3NzAzCT0geyBGT0xMT1dfc2V0X2luX3N0YXRlbWVudF9hc3NpZ24xNzcwM19iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9hc3NpZ24xNzcxNiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfYXNzaWduMTc3MTZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfYXNzaWduMTc3MTYJPSB7IEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9hc3NpZ24xNzcxNl9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xNzcxOSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc3MTlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc3MTkJPSB7IEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xNzcxOV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zZXRfaW5fc3RhdGVtZW50X2Fzc2lnbjE3NzI4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zZXRfaW5fc3RhdGVtZW50X2Fzc2lnbjE3NzI4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3NldF9pbl9zdGF0ZW1lbnRfYXNzaWduMTc3MjgJPSB7IEZPTExPV19zZXRfaW5fc3RhdGVtZW50X2Fzc2lnbjE3NzI4X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2Fzc2lnbjE3NzQxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9hc3NpZ24xNzc0MV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9hc3NpZ24xNzc0MQk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2Fzc2lnbjE3NzQxX2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2Fzc2lnbjE3NzQ0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xNzc0NF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xNzc0NAk9IHsgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2Fzc2lnbjE3NzQ0X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3NldF9pbl9zdGF0ZW1lbnRfYXNzaWduMTc3NTQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NldF9pbl9zdGF0ZW1lbnRfYXNzaWduMTc3NTRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2V0X2luX3N0YXRlbWVudF9hc3NpZ24xNzc1NAk9IHsgRk9MTE9XX3NldF9pbl9zdGF0ZW1lbnRfYXNzaWduMTc3NTRfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfYXNzaWduMTc3NjcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2Fzc2lnbjE3NzY3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2Fzc2lnbjE3NzY3CT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfYXNzaWduMTc3NjdfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc3NzAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2Fzc2lnbjE3NzcwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2Fzc2lnbjE3NzcwCT0geyBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc3NzBfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2V0X2luX3N0YXRlbWVudF9hc3NpZ24xNzc3OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2V0X2luX3N0YXRlbWVudF9hc3NpZ24xNzc3OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZXRfaW5fc3RhdGVtZW50X2Fzc2lnbjE3Nzc5CT0geyBGT0xMT1dfc2V0X2luX3N0YXRlbWVudF9hc3NpZ24xNzc3OV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9hc3NpZ24xNzc5MiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfYXNzaWduMTc3OTJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfYXNzaWduMTc3OTIJPSB7IEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9hc3NpZ24xNzc5Ml9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xNzc5NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc3OTVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc3OTUJPSB7IEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xNzc5NV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zZXRfaW5fc3RhdGVtZW50X2Fzc2lnbjE3ODA0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zZXRfaW5fc3RhdGVtZW50X2Fzc2lnbjE3ODA0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3NldF9pbl9zdGF0ZW1lbnRfYXNzaWduMTc4MDQJPSB7IEZPTExPV19zZXRfaW5fc3RhdGVtZW50X2Fzc2lnbjE3ODA0X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2Fzc2lnbjE3ODE3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9hc3NpZ24xNzgxN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9hc3NpZ24xNzgxNwk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2Fzc2lnbjE3ODE3X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2Fzc2lnbjE3ODIwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xNzgyMF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xNzgyMAk9IHsgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2Fzc2lnbjE3ODIwX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3NldF9pbl9zdGF0ZW1lbnRfYXNzaWduMTc4MzAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NldF9pbl9zdGF0ZW1lbnRfYXNzaWduMTc4MzBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2V0X2luX3N0YXRlbWVudF9hc3NpZ24xNzgzMAk9IHsgRk9MTE9XX3NldF9pbl9zdGF0ZW1lbnRfYXNzaWduMTc4MzBfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfYXNzaWduMTc4NDMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2Fzc2lnbjE3ODQzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2Fzc2lnbjE3ODQzCT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfYXNzaWduMTc4NDNfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc4NDYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2Fzc2lnbjE3ODQ2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2Fzc2lnbjE3ODQ2CT0geyBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc4NDZfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2V0X2luX3N0YXRlbWVudF9hc3NpZ24xNzg1NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2V0X2luX3N0YXRlbWVudF9hc3NpZ24xNzg1NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZXRfaW5fc3RhdGVtZW50X2Fzc2lnbjE3ODU1CT0geyBGT0xMT1dfc2V0X2luX3N0YXRlbWVudF9hc3NpZ24xNzg1NV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9hc3NpZ24xNzg2OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfYXNzaWduMTc4NjhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfYXNzaWduMTc4NjgJPSB7IEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9hc3NpZ24xNzg2OF9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xNzg3MSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc4NzFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc4NzEJPSB7IEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xNzg3MV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19PUF9QVVNIX2luX3N0YXRlbWVudF9hc3NpZ24xNzg4NyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfT1BfUFVTSF9pbl9zdGF0ZW1lbnRfYXNzaWduMTc4ODdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfT1BfUFVTSF9pbl9zdGF0ZW1lbnRfYXNzaWduMTc4ODcJPSB7IEZPTExPV19PUF9QVVNIX2luX3N0YXRlbWVudF9hc3NpZ24xNzg4N19iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9hc3NpZ24xNzg5MiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfYXNzaWduMTc4OTJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMjAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfYXNzaWduMTc4OTIJPSB7IEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9hc3NpZ24xNzg5Ml9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19PUF9QVVNIX2luX3N0YXRlbWVudF9hc3NpZ24xNzkwMiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfT1BfUFVTSF9pbl9zdGF0ZW1lbnRfYXNzaWduMTc5MDJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfT1BfUFVTSF9pbl9zdGF0ZW1lbnRfYXNzaWduMTc5MDIJPSB7IEZPTExPV19PUF9QVVNIX2luX3N0YXRlbWVudF9hc3NpZ24xNzkwMl9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9hc3NpZ24xNzkwNyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfYXNzaWduMTc5MDdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMjAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfYXNzaWduMTc5MDcJPSB7IEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9hc3NpZ24xNzkwN19iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xNzkxOCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc5MThfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc5MTgJPSB7IEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xNzkxOF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19PUF9BU1NJR05fVE9QX2luX3N0YXRlbWVudF9hc3NpZ24xNzkzMCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfT1BfQVNTSUdOX1RPUF9pbl9zdGF0ZW1lbnRfYXNzaWduMTc5MzBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfT1BfQVNTSUdOX1RPUF9pbl9zdGF0ZW1lbnRfYXNzaWduMTc5MzAJPSB7IEZPTExPV19PUF9BU1NJR05fVE9QX2luX3N0YXRlbWVudF9hc3NpZ24xNzkzMF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9hc3NpZ24xNzkzNSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfYXNzaWduMTc5MzVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfYXNzaWduMTc5MzUJPSB7IEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9hc3NpZ24xNzkzNV9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xNzkzOCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc5MzhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc5MzgJPSB7IEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xNzkzOF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19PUF9UT1BfaW5fc3RhdGVtZW50X2Fzc2lnbjE3OTUzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19PUF9UT1BfaW5fc3RhdGVtZW50X2Fzc2lnbjE3OTUzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwNDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX09QX1RPUF9pbl9zdGF0ZW1lbnRfYXNzaWduMTc5NTMJPSB7IEZPTExPV19PUF9UT1BfaW5fc3RhdGVtZW50X2Fzc2lnbjE3OTUzX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2x2YWx1ZV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc5NTggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2x2YWx1ZV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc5NThfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfbHZhbHVlX2luX3N0YXRlbWVudF9hc3NpZ24xNzk1OAk9IHsgRk9MTE9XX2x2YWx1ZV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc5NThfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc5NjEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2Fzc2lnbjE3OTYxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2Fzc2lnbjE3OTYxCT0geyBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc5NjFfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfT1BfUE9QX2luX3N0YXRlbWVudF9hc3NpZ24xNzk3NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfT1BfUE9QX2luX3N0YXRlbWVudF9hc3NpZ24xNzk3Nl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDQwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19PUF9QT1BfaW5fc3RhdGVtZW50X2Fzc2lnbjE3OTc2CT0geyBGT0xMT1dfT1BfUE9QX2luX3N0YXRlbWVudF9hc3NpZ24xNzk3Nl9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19sdmFsdWVfaW5fc3RhdGVtZW50X2Fzc2lnbjE3OTkyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19sdmFsdWVfaW5fc3RhdGVtZW50X2Fzc2lnbjE3OTkyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwNDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2x2YWx1ZV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc5OTIJPSB7IEZPTExPV19sdmFsdWVfaW5fc3RhdGVtZW50X2Fzc2lnbjE3OTkyX2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2Fzc2lnbjE4MDAzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xODAwM19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xODAwMwk9IHsgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2Fzc2lnbjE4MDAzX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lOQ1JfaW5fc3RhdGVtZW50X2Fzc2lnbjE4MDExICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19JTkNSX2luX3N0YXRlbWVudF9hc3NpZ24xODAxMV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JTkNSX2luX3N0YXRlbWVudF9hc3NpZ24xODAxMQk9IHsgRk9MTE9XX0lOQ1JfaW5fc3RhdGVtZW50X2Fzc2lnbjE4MDExX2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2Fzc2lnbjE4MDE0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xODAxNF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xODAxNAk9IHsgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2Fzc2lnbjE4MDE0X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0RFQ1JfaW5fc3RhdGVtZW50X2Fzc2lnbjE4MDI1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19ERUNSX2luX3N0YXRlbWVudF9hc3NpZ24xODAyNV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19ERUNSX2luX3N0YXRlbWVudF9hc3NpZ24xODAyNQk9IHsgRk9MTE9XX0RFQ1JfaW5fc3RhdGVtZW50X2Fzc2lnbjE4MDI1X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2Fzc2lnbjE4MDI4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xODAyOF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xODAyOAk9IHsgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2Fzc2lnbjE4MDI4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lOQ1JfaW5fc3RhdGVtZW50X2Fzc2lnbjE4MDQ4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19JTkNSX2luX3N0YXRlbWVudF9hc3NpZ24xODA0OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDQwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JTkNSX2luX3N0YXRlbWVudF9hc3NpZ24xODA0OAk9IHsgRk9MTE9XX0lOQ1JfaW5fc3RhdGVtZW50X2Fzc2lnbjE4MDQ4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2x2YWx1ZV9pbl9zdGF0ZW1lbnRfYXNzaWduMTgwNTMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2x2YWx1ZV9pbl9zdGF0ZW1lbnRfYXNzaWduMTgwNTNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfbHZhbHVlX2luX3N0YXRlbWVudF9hc3NpZ24xODA1Mwk9IHsgRk9MTE9XX2x2YWx1ZV9pbl9zdGF0ZW1lbnRfYXNzaWduMTgwNTNfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTgwNTYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2Fzc2lnbjE4MDU2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2Fzc2lnbjE4MDU2CT0geyBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTgwNTZfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfREVDUl9pbl9zdGF0ZW1lbnRfYXNzaWduMTgwNjcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0RFQ1JfaW5fc3RhdGVtZW50X2Fzc2lnbjE4MDY3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwNDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0RFQ1JfaW5fc3RhdGVtZW50X2Fzc2lnbjE4MDY3CT0geyBGT0xMT1dfREVDUl9pbl9zdGF0ZW1lbnRfYXNzaWduMTgwNjdfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfbHZhbHVlX2luX3N0YXRlbWVudF9hc3NpZ24xODA3MiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfbHZhbHVlX2luX3N0YXRlbWVudF9hc3NpZ24xODA3Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19sdmFsdWVfaW5fc3RhdGVtZW50X2Fzc2lnbjE4MDcyCT0geyBGT0xMT1dfbHZhbHVlX2luX3N0YXRlbWVudF9hc3NpZ24xODA3Ml9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xODA3NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTgwNzVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTgwNzUJPSB7IEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xODA3NV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19DT0xPTngyX2luX2x2YWx1ZTE4MTAwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19DT0xPTngyX2luX2x2YWx1ZTE4MTAwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0NPTE9OeDJfaW5fbHZhbHVlMTgxMDAJPSB7IEZPTExPV19DT0xPTngyX2luX2x2YWx1ZTE4MTAwX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lEX2luX2x2YWx1ZTE4MTEyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19JRF9pbl9sdmFsdWUxODExMl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MTAwMDAwMDIwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JRF9pbl9sdmFsdWUxODExMgk9IHsgRk9MTE9XX0lEX2luX2x2YWx1ZTE4MTEyX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0RPVF9pbl9sdmFsdWUxODEyNyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfRE9UX2luX2x2YWx1ZTE4MTI3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0RPVF9pbl9sdmFsdWUxODEyNwk9IHsgRk9MTE9XX0RPVF9pbl9sdmFsdWUxODEyN19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19JRF9pbl9sdmFsdWUxODEzMSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfSURfaW5fbHZhbHVlMTgxMzFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDEwMDAwMDAyMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfSURfaW5fbHZhbHVlMTgxMzEJPSB7IEZPTExPV19JRF9pbl9sdmFsdWUxODEzMV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MQlJBQ0tFVF9pbl9sdmFsdWUxODE1MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTEJSQUNLRVRfaW5fbHZhbHVlMTgxNTBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTEJSQUNLRVRfaW5fbHZhbHVlMTgxNTAJPSB7IEZPTExPV19MQlJBQ0tFVF9pbl9sdmFsdWUxODE1MF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX2x2YWx1ZTE4MTU1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX2x2YWx1ZTE4MTU1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgxMDAwMDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fbHZhbHVlMTgxNTUJPSB7IEZPTExPV19leHByZXNzaW9uX2luX2x2YWx1ZTE4MTU1X2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1JCUkFDS0VUX2luX2x2YWx1ZTE4MTU4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19SQlJBQ0tFVF9pbl9sdmFsdWUxODE1OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MTAwMDAwMDIwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19SQlJBQ0tFVF9pbl9sdmFsdWUxODE1OAk9IHsgRk9MTE9XX1JCUkFDS0VUX2luX2x2YWx1ZTE4MTU4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xQQVJFTl9pbl9wYXJhbWV0ZXJzMTgyMzkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xQQVJFTl9pbl9wYXJhbWV0ZXJzMTgyMzlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTFBBUkVOX2luX3BhcmFtZXRlcnMxODIzOQk9IHsgRk9MTE9XX0xQQVJFTl9pbl9wYXJhbWV0ZXJzMTgyMzlfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9wYXJhbWV0ZXJzMTgyNDQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fcGFyYW1ldGVyczE4MjQ0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwODAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fcGFyYW1ldGVyczE4MjQ0CT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9wYXJhbWV0ZXJzMTgyNDRfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfQ09NTUFfaW5fcGFyYW1ldGVyczE4MjU0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19DT01NQV9pbl9wYXJhbWV0ZXJzMTgyNTRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQ09NTUFfaW5fcGFyYW1ldGVyczE4MjU0CT0geyBGT0xMT1dfQ09NTUFfaW5fcGFyYW1ldGVyczE4MjU0X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fcGFyYW1ldGVyczE4MjU4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX3BhcmFtZXRlcnMxODI1OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDgwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX3BhcmFtZXRlcnMxODI1OAk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fcGFyYW1ldGVyczE4MjU4X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1JQQVJFTl9pbl9wYXJhbWV0ZXJzMTgyNzAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1JQQVJFTl9pbl9wYXJhbWV0ZXJzMTgyNzBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUlBBUkVOX2luX3BhcmFtZXRlcnMxODI3MAk9IHsgRk9MTE9XX1JQQVJFTl9pbl9wYXJhbWV0ZXJzMTgyNzBfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc3RhdGVtZW50X2NvbV9pbnB1dF9pbl9zdGF0ZW1lbnRfY29tMTgyOTIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3N0YXRlbWVudF9jb21faW5wdXRfaW5fc3RhdGVtZW50X2NvbTE4MjkyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3N0YXRlbWVudF9jb21faW5wdXRfaW5fc3RhdGVtZW50X2NvbTE4MjkyCT0geyBGT0xMT1dfc3RhdGVtZW50X2NvbV9pbnB1dF9pbl9zdGF0ZW1lbnRfY29tMTgyOTJfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc3RhdGVtZW50X2NvbV9vdXRwdXRfaW5fc3RhdGVtZW50X2NvbTE4MzAzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zdGF0ZW1lbnRfY29tX291dHB1dF9pbl9zdGF0ZW1lbnRfY29tMTgzMDNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc3RhdGVtZW50X2NvbV9vdXRwdXRfaW5fc3RhdGVtZW50X2NvbTE4MzAzCT0geyBGT0xMT1dfc3RhdGVtZW50X2NvbV9vdXRwdXRfaW5fc3RhdGVtZW50X2NvbTE4MzAzX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzMwNV9pbl9zdGF0ZW1lbnRfY29tX2lucHV0MTgzMjkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzMwNV9pbl9zdGF0ZW1lbnRfY29tX2lucHV0MTgzMjlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzA1X2luX3N0YXRlbWVudF9jb21faW5wdXQxODMyOQk9IHsgRk9MTE9XXzMwNV9pbl9zdGF0ZW1lbnRfY29tX2lucHV0MTgzMjlfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzAzX2luX3N0YXRlbWVudF9jb21faW5wdXQxODM0NyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzAzX2luX3N0YXRlbWVudF9jb21faW5wdXQxODM0N19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zMDNfaW5fc3RhdGVtZW50X2NvbV9pbnB1dDE4MzQ3CT0geyBGT0xMT1dfMzAzX2luX3N0YXRlbWVudF9jb21faW5wdXQxODM0N19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zMDRfaW5fc3RhdGVtZW50X2NvbV9pbnB1dDE4MzYwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zMDRfaW5fc3RhdGVtZW50X2NvbV9pbnB1dDE4MzYwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzMwNF9pbl9zdGF0ZW1lbnRfY29tX2lucHV0MTgzNjAJPSB7IEZPTExPV18zMDRfaW5fc3RhdGVtZW50X2NvbV9pbnB1dDE4MzYwX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzMwMV9pbl9zdGF0ZW1lbnRfY29tX2lucHV0MTgzNzQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzMwMV9pbl9zdGF0ZW1lbnRfY29tX2lucHV0MTgzNzRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzAxX2luX3N0YXRlbWVudF9jb21faW5wdXQxODM3NAk9IHsgRk9MTE9XXzMwMV9pbl9zdGF0ZW1lbnRfY29tX2lucHV0MTgzNzRfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzAwX2luX3N0YXRlbWVudF9jb21faW5wdXQxODM4NyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzAwX2luX3N0YXRlbWVudF9jb21faW5wdXQxODM4N19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zMDBfaW5fc3RhdGVtZW50X2NvbV9pbnB1dDE4Mzg3CT0geyBGT0xMT1dfMzAwX2luX3N0YXRlbWVudF9jb21faW5wdXQxODM4N19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yOTlfaW5fc3RhdGVtZW50X2NvbV9pbnB1dDE4NDAxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yOTlfaW5fc3RhdGVtZW50X2NvbV9pbnB1dDE4NDAxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzI5OV9pbl9zdGF0ZW1lbnRfY29tX2lucHV0MTg0MDEJPSB7IEZPTExPV18yOTlfaW5fc3RhdGVtZW50X2NvbV9pbnB1dDE4NDAxX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzMwMl9pbl9zdGF0ZW1lbnRfY29tX2lucHV0MTg0MTIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzMwMl9pbl9zdGF0ZW1lbnRfY29tX2lucHV0MTg0MTJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzAyX2luX3N0YXRlbWVudF9jb21faW5wdXQxODQxMgk9IHsgRk9MTE9XXzMwMl9pbl9zdGF0ZW1lbnRfY29tX2lucHV0MTg0MTJfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX3N0YXRlbWVudF9jb21faW5wdXQxODQyNiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX3N0YXRlbWVudF9jb21faW5wdXQxODQyNl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwQTAwMDAwMDA4MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAyMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fc3RhdGVtZW50X2NvbV9pbnB1dDE4NDI2CT0geyBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX3N0YXRlbWVudF9jb21faW5wdXQxODQyNl9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19wYXJhbWV0ZXJzX3BvcnRfaW5fc3RhdGVtZW50X2NvbV9pbnB1dDE4NDM2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19wYXJhbWV0ZXJzX3BvcnRfaW5fc3RhdGVtZW50X2NvbV9pbnB1dDE4NDM2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDBBMDAwMDAwMDgwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDIwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3BhcmFtZXRlcnNfcG9ydF9pbl9zdGF0ZW1lbnRfY29tX2lucHV0MTg0MzYJPSB7IEZPTExPV19wYXJhbWV0ZXJzX3BvcnRfaW5fc3RhdGVtZW50X2NvbV9pbnB1dDE4NDM2X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzE2NV9pbl9zdGF0ZW1lbnRfY29tX2lucHV0MTg0NDYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzE2NV9pbl9zdGF0ZW1lbnRfY29tX2lucHV0MTg0NDZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMTY1X2luX3N0YXRlbWVudF9jb21faW5wdXQxODQ0Ngk9IHsgRk9MTE9XXzE2NV9pbl9zdGF0ZW1lbnRfY29tX2lucHV0MTg0NDZfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjc3X2luX3N0YXRlbWVudF9jb21faW5wdXQxODQ1NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjc3X2luX3N0YXRlbWVudF9jb21faW5wdXQxODQ1NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwODAwMDAwMDA4MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAyMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yNzdfaW5fc3RhdGVtZW50X2NvbV9pbnB1dDE4NDU1CT0geyBGT0xMT1dfMjc3X2luX3N0YXRlbWVudF9jb21faW5wdXQxODQ1NV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9jb21faW5wdXQxODQ2OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfY29tX2lucHV0MTg0NjlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDgwMDAwMDAwODApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMjAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfY29tX2lucHV0MTg0NjkJPSB7IEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9jb21faW5wdXQxODQ2OV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19BU1NJR05fUkVGX2luX3N0YXRlbWVudF9jb21faW5wdXQxODQ4OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQVNTSUdOX1JFRl9pbl9zdGF0ZW1lbnRfY29tX2lucHV0MTg0ODlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQVNTSUdOX1JFRl9pbl9zdGF0ZW1lbnRfY29tX2lucHV0MTg0ODkJPSB7IEZPTExPV19BU1NJR05fUkVGX2luX3N0YXRlbWVudF9jb21faW5wdXQxODQ4OV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fc3RhdGVtZW50X2NvbV9pbnB1dDE4NDkzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fc3RhdGVtZW50X2NvbV9pbnB1dDE4NDkzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDA4MDAwMDAwMDgwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDIwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9zdGF0ZW1lbnRfY29tX2lucHV0MTg0OTMJPSB7IEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fc3RhdGVtZW50X2NvbV9pbnB1dDE4NDkzX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3NldF9pbl9zdGF0ZW1lbnRfY29tX2lucHV0MTg1MjEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NldF9pbl9zdGF0ZW1lbnRfY29tX2lucHV0MTg1MjFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2V0X2luX3N0YXRlbWVudF9jb21faW5wdXQxODUyMQk9IHsgRk9MTE9XX3NldF9pbl9zdGF0ZW1lbnRfY29tX2lucHV0MTg1MjFfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX3N0YXRlbWVudF9jb21faW5wdXQxODUzMyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX3N0YXRlbWVudF9jb21faW5wdXQxODUzM19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fc3RhdGVtZW50X2NvbV9pbnB1dDE4NTMzCT0geyBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX3N0YXRlbWVudF9jb21faW5wdXQxODUzM19iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9jb21faW5wdXQxODU0OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfY29tX2lucHV0MTg1NDlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfY29tX2lucHV0MTg1NDkJPSB7IEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9jb21faW5wdXQxODU0OV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zNDFfaW5fc3RhdGVtZW50X2NvbV9vdXRwdXQxODU3MiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzQxX2luX3N0YXRlbWVudF9jb21fb3V0cHV0MTg1NzJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzQxX2luX3N0YXRlbWVudF9jb21fb3V0cHV0MTg1NzIJPSB7IEZPTExPV18zNDFfaW5fc3RhdGVtZW50X2NvbV9vdXRwdXQxODU3Ml9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zNDBfaW5fc3RhdGVtZW50X2NvbV9vdXRwdXQxODU5MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzQwX2luX3N0YXRlbWVudF9jb21fb3V0cHV0MTg1OTBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzQwX2luX3N0YXRlbWVudF9jb21fb3V0cHV0MTg1OTAJPSB7IEZPTExPV18zNDBfaW5fc3RhdGVtZW50X2NvbV9vdXRwdXQxODU5MF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zMzhfaW5fc3RhdGVtZW50X2NvbV9vdXRwdXQxODYwNCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzM4X2luX3N0YXRlbWVudF9jb21fb3V0cHV0MTg2MDRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzM4X2luX3N0YXRlbWVudF9jb21fb3V0cHV0MTg2MDQJPSB7IEZPTExPV18zMzhfaW5fc3RhdGVtZW50X2NvbV9vdXRwdXQxODYwNF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zMzdfaW5fc3RhdGVtZW50X2NvbV9vdXRwdXQxODYxNyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzM3X2luX3N0YXRlbWVudF9jb21fb3V0cHV0MTg2MTdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzM3X2luX3N0YXRlbWVudF9jb21fb3V0cHV0MTg2MTcJPSB7IEZPTExPV18zMzdfaW5fc3RhdGVtZW50X2NvbV9vdXRwdXQxODYxN19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zMzZfaW5fc3RhdGVtZW50X2NvbV9vdXRwdXQxODYzMSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzM2X2luX3N0YXRlbWVudF9jb21fb3V0cHV0MTg2MzFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzM2X2luX3N0YXRlbWVudF9jb21fb3V0cHV0MTg2MzEJPSB7IEZPTExPV18zMzZfaW5fc3RhdGVtZW50X2NvbV9vdXRwdXQxODYzMV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zMzlfaW5fc3RhdGVtZW50X2NvbV9vdXRwdXQxODY0MiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzM5X2luX3N0YXRlbWVudF9jb21fb3V0cHV0MTg2NDJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzM5X2luX3N0YXRlbWVudF9jb21fb3V0cHV0MTg2NDIJPSB7IEZPTExPV18zMzlfaW5fc3RhdGVtZW50X2NvbV9vdXRwdXQxODY0Ml9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fc3RhdGVtZW50X2NvbV9vdXRwdXQxODY1NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX3N0YXRlbWVudF9jb21fb3V0cHV0MTg2NTZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMTA4MDAwMDAwODApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMjAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX3N0YXRlbWVudF9jb21fb3V0cHV0MTg2NTYJPSB7IEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fc3RhdGVtZW50X2NvbV9vdXRwdXQxODY1Nl9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19wYXJhbWV0ZXJzX3BvcnRfaW5fc3RhdGVtZW50X2NvbV9vdXRwdXQxODY2NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfcGFyYW1ldGVyc19wb3J0X2luX3N0YXRlbWVudF9jb21fb3V0cHV0MTg2NjZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMTA4MDAwMDAwODApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMjAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfcGFyYW1ldGVyc19wb3J0X2luX3N0YXRlbWVudF9jb21fb3V0cHV0MTg2NjYJPSB7IEZPTExPV19wYXJhbWV0ZXJzX3BvcnRfaW5fc3RhdGVtZW50X2NvbV9vdXRwdXQxODY2Nl9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18xNjNfaW5fc3RhdGVtZW50X2NvbV9vdXRwdXQxODY3NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMTYzX2luX3N0YXRlbWVudF9jb21fb3V0cHV0MTg2NzZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMTYzX2luX3N0YXRlbWVudF9jb21fb3V0cHV0MTg2NzYJPSB7IEZPTExPV18xNjNfaW5fc3RhdGVtZW50X2NvbV9vdXRwdXQxODY3Nl9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yNzdfaW5fc3RhdGVtZW50X2NvbV9vdXRwdXQxODY4NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjc3X2luX3N0YXRlbWVudF9jb21fb3V0cHV0MTg2ODVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMTEwMDAwMDAwODApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMjAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjc3X2luX3N0YXRlbWVudF9jb21fb3V0cHV0MTg2ODUJPSB7IEZPTExPV18yNzdfaW5fc3RhdGVtZW50X2NvbV9vdXRwdXQxODY4NV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9jb21fb3V0cHV0MTg2OTkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2NvbV9vdXRwdXQxODY5OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAxMTAwMDAwMDA4MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAyMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9jb21fb3V0cHV0MTg2OTkJPSB7IEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9jb21fb3V0cHV0MTg2OTlfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTY0X2luX3N0YXRlbWVudF9jb21fb3V0cHV0MTg3MjEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzE2NF9pbl9zdGF0ZW1lbnRfY29tX291dHB1dDE4NzIxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE2NF9pbl9zdGF0ZW1lbnRfY29tX291dHB1dDE4NzIxCT0geyBGT0xMT1dfMTY0X2luX3N0YXRlbWVudF9jb21fb3V0cHV0MTg3MjFfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX3N0YXRlbWVudF9jb21fb3V0cHV0MTg3MjUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9zdGF0ZW1lbnRfY29tX291dHB1dDE4NzI1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDEwMDAwMDAwMDgwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDIwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9zdGF0ZW1lbnRfY29tX291dHB1dDE4NzI1CT0geyBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX3N0YXRlbWVudF9jb21fb3V0cHV0MTg3MjVfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2V0X2luX3N0YXRlbWVudF9jb21fb3V0cHV0MTg3NTMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NldF9pbl9zdGF0ZW1lbnRfY29tX291dHB1dDE4NzUzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3NldF9pbl9zdGF0ZW1lbnRfY29tX291dHB1dDE4NzUzCT0geyBGT0xMT1dfc2V0X2luX3N0YXRlbWVudF9jb21fb3V0cHV0MTg3NTNfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX3N0YXRlbWVudF9jb21fb3V0cHV0MTg3NjUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9zdGF0ZW1lbnRfY29tX291dHB1dDE4NzY1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9zdGF0ZW1lbnRfY29tX291dHB1dDE4NzY1CT0geyBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX3N0YXRlbWVudF9jb21fb3V0cHV0MTg3NjVfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfY29tX291dHB1dDE4NzgxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9jb21fb3V0cHV0MTg3ODFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfY29tX291dHB1dDE4NzgxCT0geyBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfY29tX291dHB1dDE4NzgxX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xQQVJFTl9pbl9wYXJhbWV0ZXJzX3BvcnQxODgwNCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTFBBUkVOX2luX3BhcmFtZXRlcnNfcG9ydDE4ODA0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xQQVJFTl9pbl9wYXJhbWV0ZXJzX3BvcnQxODgwNAk9IHsgRk9MTE9XX0xQQVJFTl9pbl9wYXJhbWV0ZXJzX3BvcnQxODgwNF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9wYXJhbWV0ZXJzX3BvcnQxODgxMyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5fcGFyYW1ldGVyc19wb3J0MTg4MTNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA4MDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5fcGFyYW1ldGVyc19wb3J0MTg4MTMJPSB7IEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9wYXJhbWV0ZXJzX3BvcnQxODgxM19iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19DT01NQV9pbl9wYXJhbWV0ZXJzX3BvcnQxODgyNyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQ09NTUFfaW5fcGFyYW1ldGVyc19wb3J0MTg4MjdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQ09NTUFfaW5fcGFyYW1ldGVyc19wb3J0MTg4MjcJPSB7IEZPTExPV19DT01NQV9pbl9wYXJhbWV0ZXJzX3BvcnQxODgyN19iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9wYXJhbWV0ZXJzX3BvcnQxODgzMiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5fcGFyYW1ldGVyc19wb3J0MTg4MzJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA4MDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5fcGFyYW1ldGVyc19wb3J0MTg4MzIJPSB7IEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9wYXJhbWV0ZXJzX3BvcnQxODgzMl9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19SUEFSRU5faW5fcGFyYW1ldGVyc19wb3J0MTg4NTIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1JQQVJFTl9pbl9wYXJhbWV0ZXJzX3BvcnQxODg1Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19SUEFSRU5faW5fcGFyYW1ldGVyc19wb3J0MTg4NTIJPSB7IEZPTExPV19SUEFSRU5faW5fcGFyYW1ldGVyc19wb3J0MTg4NTJfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzQ3X2luX2V4cHJlc3Npb25fY29tMTg4NjkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzM0N19pbl9leHByZXNzaW9uX2NvbTE4ODY5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzM0N19pbl9leHByZXNzaW9uX2NvbTE4ODY5CT0geyBGT0xMT1dfMzQ3X2luX2V4cHJlc3Npb25fY29tMTg4NjlfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX2V4cHJlc3Npb25fY29tMTg4NzQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9leHByZXNzaW9uX2NvbTE4ODc0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9leHByZXNzaW9uX2NvbTE4ODc0CT0geyBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX2V4cHJlc3Npb25fY29tMTg4NzRfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjM3X2luX2V4cHJlc3Npb25fY29tMTg4ODMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzIzN19pbl9leHByZXNzaW9uX2NvbTE4ODgzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzIzN19pbl9leHByZXNzaW9uX2NvbTE4ODgzCT0geyBGT0xMT1dfMjM3X2luX2V4cHJlc3Npb25fY29tMTg4ODNfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX2V4cHJlc3Npb25fY29tMTg4ODggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9leHByZXNzaW9uX2NvbTE4ODg4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9leHByZXNzaW9uX2NvbTE4ODg4CT0geyBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX2V4cHJlc3Npb25fY29tMTg4ODhfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc3RhdGVtZW50X2d1YXJkX2luX3N0YXRlbWVudF9jb25zdHJhaW50MTg5MTIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3N0YXRlbWVudF9ndWFyZF9pbl9zdGF0ZW1lbnRfY29uc3RyYWludDE4OTEyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3N0YXRlbWVudF9ndWFyZF9pbl9zdGF0ZW1lbnRfY29uc3RyYWludDE4OTEyCT0geyBGT0xMT1dfc3RhdGVtZW50X2d1YXJkX2luX3N0YXRlbWVudF9jb25zdHJhaW50MTg5MTJfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc3RhdGVtZW50X3RpbWVkX2d1YXJkX2luX3N0YXRlbWVudF9jb25zdHJhaW50MTg5MjggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3N0YXRlbWVudF90aW1lZF9ndWFyZF9pbl9zdGF0ZW1lbnRfY29uc3RyYWludDE4OTI4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3N0YXRlbWVudF90aW1lZF9ndWFyZF9pbl9zdGF0ZW1lbnRfY29uc3RyYWludDE4OTI4CT0geyBGT0xMT1dfc3RhdGVtZW50X3RpbWVkX2d1YXJkX2luX3N0YXRlbWVudF9jb25zdHJhaW50MTg5MjhfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc3RhdGVtZW50X2NoZWNrc2F0X2luX3N0YXRlbWVudF9jb25zdHJhaW50MTg5MzggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3N0YXRlbWVudF9jaGVja3NhdF9pbl9zdGF0ZW1lbnRfY29uc3RyYWludDE4OTM4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3N0YXRlbWVudF9jaGVja3NhdF9pbl9zdGF0ZW1lbnRfY29uc3RyYWludDE4OTM4CT0geyBGT0xMT1dfc3RhdGVtZW50X2NoZWNrc2F0X2luX3N0YXRlbWVudF9jb25zdHJhaW50MTg5MzhfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjkwX2luX3N0YXRlbWVudF9ndWFyZDE4OTYwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yOTBfaW5fc3RhdGVtZW50X2d1YXJkMTg5NjBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjkwX2luX3N0YXRlbWVudF9ndWFyZDE4OTYwCT0geyBGT0xMT1dfMjkwX2luX3N0YXRlbWVudF9ndWFyZDE4OTYwX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2d1YXJkMTg5NjUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2d1YXJkMTg5NjVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfZ3VhcmQxODk2NQk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2d1YXJkMTg5NjVfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfZ3VhcmQxODk2OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfZ3VhcmQxODk2OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9ndWFyZDE4OTY4CT0geyBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfZ3VhcmQxODk2OF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yNzhfaW5fc3RhdGVtZW50X2d1YXJkMTg5NzcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzI3OF9pbl9zdGF0ZW1lbnRfZ3VhcmQxODk3N19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yNzhfaW5fc3RhdGVtZW50X2d1YXJkMTg5NzcJPSB7IEZPTExPV18yNzhfaW5fc3RhdGVtZW50X2d1YXJkMTg5NzdfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfZ3VhcmQxODk4MiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfZ3VhcmQxODk4Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9ndWFyZDE4OTgyCT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfZ3VhcmQxODk4Ml9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9ndWFyZDE4OTg1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9ndWFyZDE4OTg1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2d1YXJkMTg5ODUJPSB7IEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9ndWFyZDE4OTg1X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzM5MV9pbl9zdGF0ZW1lbnRfdGltZWRfZ3VhcmQxOTAwMyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzkxX2luX3N0YXRlbWVudF90aW1lZF9ndWFyZDE5MDAzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzM5MV9pbl9zdGF0ZW1lbnRfdGltZWRfZ3VhcmQxOTAwMwk9IHsgRk9MTE9XXzM5MV9pbl9zdGF0ZW1lbnRfdGltZWRfZ3VhcmQxOTAwM19iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF90aW1lZF9ndWFyZDE5MDA4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF90aW1lZF9ndWFyZDE5MDA4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X3RpbWVkX2d1YXJkMTkwMDgJPSB7IEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF90aW1lZF9ndWFyZDE5MDA4X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X3RpbWVkX2d1YXJkMTkwMTEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X3RpbWVkX2d1YXJkMTkwMTFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfdGltZWRfZ3VhcmQxOTAxMQk9IHsgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X3RpbWVkX2d1YXJkMTkwMTFfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjU2X2luX3N0YXRlbWVudF9jaGVja3NhdDE5MDMzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yNTZfaW5fc3RhdGVtZW50X2NoZWNrc2F0MTkwMzNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMEExODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjU2X2luX3N0YXRlbWVudF9jaGVja3NhdDE5MDMzCT0geyBGT0xMT1dfMjU2X2luX3N0YXRlbWVudF9jaGVja3NhdDE5MDMzX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xUX19pbl9zdGF0ZW1lbnRfY2hlY2tzYXQxOTA0MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTFRfX2luX3N0YXRlbWVudF9jaGVja3NhdDE5MDQwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xUX19pbl9zdGF0ZW1lbnRfY2hlY2tzYXQxOTA0MAk9IHsgRk9MTE9XX0xUX19pbl9zdGF0ZW1lbnRfY2hlY2tzYXQxOTA0MF9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TdHJpbmdMaXRlcmFsX2luX3N0YXRlbWVudF9jaGVja3NhdDE5MDQ3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19TdHJpbmdMaXRlcmFsX2luX3N0YXRlbWVudF9jaGVja3NhdDE5MDQ3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1N0cmluZ0xpdGVyYWxfaW5fc3RhdGVtZW50X2NoZWNrc2F0MTkwNDcJPSB7IEZPTExPV19TdHJpbmdMaXRlcmFsX2luX3N0YXRlbWVudF9jaGVja3NhdDE5MDQ3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lEX2luX3N0YXRlbWVudF9jaGVja3NhdDE5MDUzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19JRF9pbl9zdGF0ZW1lbnRfY2hlY2tzYXQxOTA1M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JRF9pbl9zdGF0ZW1lbnRfY2hlY2tzYXQxOTA1Mwk9IHsgRk9MTE9XX0lEX2luX3N0YXRlbWVudF9jaGVja3NhdDE5MDUzX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0dUX2luX3N0YXRlbWVudF9jaGVja3NhdDE5MDU4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19HVF9pbl9zdGF0ZW1lbnRfY2hlY2tzYXQxOTA1OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19HVF9pbl9zdGF0ZW1lbnRfY2hlY2tzYXQxOTA1OAk9IHsgRk9MTE9XX0dUX2luX3N0YXRlbWVudF9jaGVja3NhdDE5MDU4X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzM3Nl9pbl9zdGF0ZW1lbnRfY2hlY2tzYXQxOTA3MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzc2X2luX3N0YXRlbWVudF9jaGVja3NhdDE5MDcwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzM3Nl9pbl9zdGF0ZW1lbnRfY2hlY2tzYXQxOTA3MAk9IHsgRk9MTE9XXzM3Nl9pbl9zdGF0ZW1lbnRfY2hlY2tzYXQxOTA3MF9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TdHJpbmdMaXRlcmFsX2luX3N0YXRlbWVudF9jaGVja3NhdDE5MDc3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19TdHJpbmdMaXRlcmFsX2luX3N0YXRlbWVudF9jaGVja3NhdDE5MDc3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1N0cmluZ0xpdGVyYWxfaW5fc3RhdGVtZW50X2NoZWNrc2F0MTkwNzcJPSB7IEZPTExPV19TdHJpbmdMaXRlcmFsX2luX3N0YXRlbWVudF9jaGVja3NhdDE5MDc3X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lEX2luX3N0YXRlbWVudF9jaGVja3NhdDE5MDgzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19JRF9pbl9zdGF0ZW1lbnRfY2hlY2tzYXQxOTA4M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JRF9pbl9zdGF0ZW1lbnRfY2hlY2tzYXQxOTA4Mwk9IHsgRk9MTE9XX0lEX2luX3N0YXRlbWVudF9jaGVja3NhdDE5MDgzX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2NoZWNrc2F0MTkxMDEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2NoZWNrc2F0MTkxMDFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfY2hlY2tzYXQxOTEwMQk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2NoZWNrc2F0MTkxMDFfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfY2hlY2tzYXQxOTEwNCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfY2hlY2tzYXQxOTEwNF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9jaGVja3NhdDE5MTA0CT0geyBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfY2hlY2tzYXQxOTEwNF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yNTZfaW5fZXhwcmVzc2lvbl9ndWFyZDE5MTI3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yNTZfaW5fZXhwcmVzc2lvbl9ndWFyZDE5MTI3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDBBMTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzI1Nl9pbl9leHByZXNzaW9uX2d1YXJkMTkxMjcJPSB7IEZPTExPV18yNTZfaW5fZXhwcmVzc2lvbl9ndWFyZDE5MTI3X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xUX19pbl9leHByZXNzaW9uX2d1YXJkMTkxMzQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xUX19pbl9leHByZXNzaW9uX2d1YXJkMTkxMzRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTFRfX2luX2V4cHJlc3Npb25fZ3VhcmQxOTEzNAk9IHsgRk9MTE9XX0xUX19pbl9leHByZXNzaW9uX2d1YXJkMTkxMzRfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfU3RyaW5nTGl0ZXJhbF9pbl9leHByZXNzaW9uX2d1YXJkMTkxNDEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1N0cmluZ0xpdGVyYWxfaW5fZXhwcmVzc2lvbl9ndWFyZDE5MTQxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1N0cmluZ0xpdGVyYWxfaW5fZXhwcmVzc2lvbl9ndWFyZDE5MTQxCT0geyBGT0xMT1dfU3RyaW5nTGl0ZXJhbF9pbl9leHByZXNzaW9uX2d1YXJkMTkxNDFfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfSURfaW5fZXhwcmVzc2lvbl9ndWFyZDE5MTQ3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19JRF9pbl9leHByZXNzaW9uX2d1YXJkMTkxNDdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfSURfaW5fZXhwcmVzc2lvbl9ndWFyZDE5MTQ3CT0geyBGT0xMT1dfSURfaW5fZXhwcmVzc2lvbl9ndWFyZDE5MTQ3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0dUX2luX2V4cHJlc3Npb25fZ3VhcmQxOTE1MiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfR1RfaW5fZXhwcmVzc2lvbl9ndWFyZDE5MTUyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0dUX2luX2V4cHJlc3Npb25fZ3VhcmQxOTE1Mgk9IHsgRk9MTE9XX0dUX2luX2V4cHJlc3Npb25fZ3VhcmQxOTE1Ml9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zNzZfaW5fZXhwcmVzc2lvbl9ndWFyZDE5MTY0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zNzZfaW5fZXhwcmVzc2lvbl9ndWFyZDE5MTY0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzM3Nl9pbl9leHByZXNzaW9uX2d1YXJkMTkxNjQJPSB7IEZPTExPV18zNzZfaW5fZXhwcmVzc2lvbl9ndWFyZDE5MTY0X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1N0cmluZ0xpdGVyYWxfaW5fZXhwcmVzc2lvbl9ndWFyZDE5MTcxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19TdHJpbmdMaXRlcmFsX2luX2V4cHJlc3Npb25fZ3VhcmQxOTE3MV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19TdHJpbmdMaXRlcmFsX2luX2V4cHJlc3Npb25fZ3VhcmQxOTE3MQk9IHsgRk9MTE9XX1N0cmluZ0xpdGVyYWxfaW5fZXhwcmVzc2lvbl9ndWFyZDE5MTcxX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lEX2luX2V4cHJlc3Npb25fZ3VhcmQxOTE3NyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfSURfaW5fZXhwcmVzc2lvbl9ndWFyZDE5MTc3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0lEX2luX2V4cHJlc3Npb25fZ3VhcmQxOTE3Nwk9IHsgRk9MTE9XX0lEX2luX2V4cHJlc3Npb25fZ3VhcmQxOTE3N19iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb25fZ3VhcmQxOTE5NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uX2d1YXJkMTkxOTVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uX2d1YXJkMTkxOTUJPSB7IEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb25fZ3VhcmQxOTE5NV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yOTRfaW5fc3RhdGVtZW50X2l0ZTE5MjIxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yOTRfaW5fc3RhdGVtZW50X2l0ZTE5MjIxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzI5NF9pbl9zdGF0ZW1lbnRfaXRlMTkyMjEJPSB7IEZPTExPV18yOTRfaW5fc3RhdGVtZW50X2l0ZTE5MjIxX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2l0ZTE5MjI2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9pdGUxOTIyNl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMSkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9pdGUxOTIyNgk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2l0ZTE5MjI2X2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9zdGF0ZW1lbnRfaXRlMTkyMzEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9zdGF0ZW1lbnRfaXRlMTkyMzFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwNjAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX3N0YXRlbWVudF9pdGUxOTIzMQk9IHsgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9zdGF0ZW1lbnRfaXRlMTkyMzFfYml0cywgNQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjc0X2luX3N0YXRlbWVudF9pdGUxOTI0NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjc0X2luX3N0YXRlbWVudF9pdGUxOTI0NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yNzRfaW5fc3RhdGVtZW50X2l0ZTE5MjQ1CT0geyBGT0xMT1dfMjc0X2luX3N0YXRlbWVudF9pdGUxOTI0NV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yNzNfaW5fc3RhdGVtZW50X2l0ZTE5MjQ5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yNzNfaW5fc3RhdGVtZW50X2l0ZTE5MjQ5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDA0MDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzI3M19pbl9zdGF0ZW1lbnRfaXRlMTkyNDkJPSB7IEZPTExPV18yNzNfaW5fc3RhdGVtZW50X2l0ZTE5MjQ5X2JpdHMsIDUJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzI5NF9pbl9zdGF0ZW1lbnRfaXRlMTkyNTEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzI5NF9pbl9zdGF0ZW1lbnRfaXRlMTkyNTFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjk0X2luX3N0YXRlbWVudF9pdGUxOTI1MQk9IHsgRk9MTE9XXzI5NF9pbl9zdGF0ZW1lbnRfaXRlMTkyNTFfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfaXRlMTkyNTggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2l0ZTE5MjU4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2l0ZTE5MjU4CT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfaXRlMTkyNThfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX3N0YXRlbWVudF9pdGUxOTI2MyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX3N0YXRlbWVudF9pdGUxOTI2M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDA2MDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19ibG9ja19zdGF0ZW1lbnRfaW5fc3RhdGVtZW50X2l0ZTE5MjYzCT0geyBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX3N0YXRlbWVudF9pdGUxOTI2M19iaXRzLCA1CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yNzNfaW5fc3RhdGVtZW50X2l0ZTE5MjgzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yNzNfaW5fc3RhdGVtZW50X2l0ZTE5MjgzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzI3M19pbl9zdGF0ZW1lbnRfaXRlMTkyODMJPSB7IEZPTExPV18yNzNfaW5fc3RhdGVtZW50X2l0ZTE5MjgzX2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9zdGF0ZW1lbnRfaXRlMTkyODggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9zdGF0ZW1lbnRfaXRlMTkyODhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX3N0YXRlbWVudF9pdGUxOTI4OAk9IHsgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9zdGF0ZW1lbnRfaXRlMTkyODhfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjk0X2luX2V4cHJlc3Npb25faXRlMTkzMjAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzI5NF9pbl9leHByZXNzaW9uX2l0ZTE5MzIwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzI5NF9pbl9leHByZXNzaW9uX2l0ZTE5MzIwCT0geyBGT0xMT1dfMjk0X2luX2V4cHJlc3Npb25faXRlMTkzMjBfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uX2l0ZTE5MzI1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb25faXRlMTkzMjVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDEpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uX2l0ZTE5MzI1CT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uX2l0ZTE5MzI1X2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xDVVJMWV9pbl9leHByZXNzaW9uX2l0ZTE5MzI4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MQ1VSTFlfaW5fZXhwcmVzc2lvbl9pdGUxOTMyOF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MQ1VSTFlfaW5fZXhwcmVzc2lvbl9pdGUxOTMyOAk9IHsgRk9MTE9XX0xDVVJMWV9pbl9leHByZXNzaW9uX2l0ZTE5MzI4X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbl9pdGUxOTMzMyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uX2l0ZTE5MzMzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbl9pdGUxOTMzMwk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbl9pdGUxOTMzM19iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19SQ1VSTFlfaW5fZXhwcmVzc2lvbl9pdGUxOTMzNiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfUkNVUkxZX2luX2V4cHJlc3Npb25faXRlMTkzMzZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwNjAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUkNVUkxZX2luX2V4cHJlc3Npb25faXRlMTkzMzYJPSB7IEZPTExPV19SQ1VSTFlfaW5fZXhwcmVzc2lvbl9pdGUxOTMzNl9iaXRzLCA1CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yNzRfaW5fZXhwcmVzc2lvbl9pdGUxOTM1MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjc0X2luX2V4cHJlc3Npb25faXRlMTkzNTBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjc0X2luX2V4cHJlc3Npb25faXRlMTkzNTAJPSB7IEZPTExPV18yNzRfaW5fZXhwcmVzc2lvbl9pdGUxOTM1MF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yNzNfaW5fZXhwcmVzc2lvbl9pdGUxOTM1NCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjczX2luX2V4cHJlc3Npb25faXRlMTkzNTRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDQwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjczX2luX2V4cHJlc3Npb25faXRlMTkzNTQJPSB7IEZPTExPV18yNzNfaW5fZXhwcmVzc2lvbl9pdGUxOTM1NF9iaXRzLCA1CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yOTRfaW5fZXhwcmVzc2lvbl9pdGUxOTM1NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjk0X2luX2V4cHJlc3Npb25faXRlMTkzNTZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjk0X2luX2V4cHJlc3Npb25faXRlMTkzNTYJPSB7IEZPTExPV18yOTRfaW5fZXhwcmVzc2lvbl9pdGUxOTM1Nl9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb25faXRlMTkzNjIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbl9pdGUxOTM2Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMSkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb25faXRlMTkzNjIJPSB7IEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb25faXRlMTkzNjJfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTENVUkxZX2luX2V4cHJlc3Npb25faXRlMTkzNjUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xDVVJMWV9pbl9leHByZXNzaW9uX2l0ZTE5MzY1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xDVVJMWV9pbl9leHByZXNzaW9uX2l0ZTE5MzY1CT0geyBGT0xMT1dfTENVUkxZX2luX2V4cHJlc3Npb25faXRlMTkzNjVfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uX2l0ZTE5MzcwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb25faXRlMTkzNzBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDIwMDAwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uX2l0ZTE5MzcwCT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uX2l0ZTE5MzcwX2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1JDVVJMWV9pbl9leHByZXNzaW9uX2l0ZTE5MzczICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19SQ1VSTFlfaW5fZXhwcmVzc2lvbl9pdGUxOTM3M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDA2MDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19SQ1VSTFlfaW5fZXhwcmVzc2lvbl9pdGUxOTM3Mwk9IHsgRk9MTE9XX1JDVVJMWV9pbl9leHByZXNzaW9uX2l0ZTE5MzczX2JpdHMsIDUJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzI3M19pbl9leHByZXNzaW9uX2l0ZTE5MzkzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yNzNfaW5fZXhwcmVzc2lvbl9pdGUxOTM5M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMSkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yNzNfaW5fZXhwcmVzc2lvbl9pdGUxOTM5Mwk9IHsgRk9MTE9XXzI3M19pbl9leHByZXNzaW9uX2l0ZTE5MzkzX2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xDVVJMWV9pbl9leHByZXNzaW9uX2l0ZTE5Mzk2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MQ1VSTFlfaW5fZXhwcmVzc2lvbl9pdGUxOTM5Nl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MQ1VSTFlfaW5fZXhwcmVzc2lvbl9pdGUxOTM5Ngk9IHsgRk9MTE9XX0xDVVJMWV9pbl9leHByZXNzaW9uX2l0ZTE5Mzk2X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbl9pdGUxOTQwMSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uX2l0ZTE5NDAxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbl9pdGUxOTQwMQk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbl9pdGUxOTQwMV9iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19SQ1VSTFlfaW5fZXhwcmVzc2lvbl9pdGUxOTQwNCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfUkNVUkxZX2luX2V4cHJlc3Npb25faXRlMTk0MDRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUkNVUkxZX2luX2V4cHJlc3Npb25faXRlMTk0MDQJPSB7IEZPTExPV19SQ1VSTFlfaW5fZXhwcmVzc2lvbl9pdGUxOTQwNF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yODVfaW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NDUxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yODVfaW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NDUxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDBDMDAwMDA0NDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzI4NV9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk0NTEJPSB7IEZPTExPV18yODVfaW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NDUxX2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2Zvcl9hc3NpZ25faGVhZGVyX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTQ2MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZm9yX2Fzc2lnbl9oZWFkZXJfaW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NDYwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2Zvcl9hc3NpZ25faGVhZGVyX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTQ2MAk9IHsgRk9MTE9XX2Zvcl9hc3NpZ25faGVhZGVyX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTQ2MF9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTQ2MyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk0NjNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk0NjMJPSB7IEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTQ2M19iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTQ2OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk0NjhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk0NjgJPSB7IEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTQ2OF9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTQ3MSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk0NzFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMEMwMDAwMDQ0MDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk0NzEJPSB7IEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTQ3MV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19mb3JfYXNzaWduX2hlYWRlcl9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk0NzYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2Zvcl9hc3NpZ25faGVhZGVyX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTQ3Nl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMSkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19mb3JfYXNzaWduX2hlYWRlcl9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk0NzYJPSB7IEZPTExPV19mb3JfYXNzaWduX2hlYWRlcl9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk0NzZfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTFBBUkVOX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTQ5NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTFBBUkVOX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTQ5NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwQzAwMDAwNDQwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MUEFSRU5faW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NDk1CT0geyBGT0xMT1dfTFBBUkVOX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTQ5NV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19mb3JfYXNzaWduX2hlYWRlcl9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk1MDYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2Zvcl9hc3NpZ25faGVhZGVyX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTUwNl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19mb3JfYXNzaWduX2hlYWRlcl9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk1MDYJPSB7IEZPTExPV19mb3JfYXNzaWduX2hlYWRlcl9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk1MDZfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk1MDkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NTA5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NTA5CT0geyBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk1MDlfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk1MTQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NTE0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NTE0CT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk1MTRfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk1MTcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NTE3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDBDMDAwMDA0NDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NTE3CT0geyBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk1MTdfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZm9yX2Fzc2lnbl9oZWFkZXJfaW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NTIyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19mb3JfYXNzaWduX2hlYWRlcl9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk1MjJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZm9yX2Fzc2lnbl9oZWFkZXJfaW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NTIyCT0geyBGT0xMT1dfZm9yX2Fzc2lnbl9oZWFkZXJfaW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NTIyX2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1JQQVJFTl9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk1MjkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1JQQVJFTl9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk1MjlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDEpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUlBBUkVOX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTUyOQk9IHsgRk9MTE9XX1JQQVJFTl9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk1MjlfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfbHZhbHVlX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTU1MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfbHZhbHVlX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTU1MF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDIwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19sdmFsdWVfaW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NTUwCT0geyBGT0xMT1dfbHZhbHVlX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTU1MF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19DT0xPTl9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk1NTMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0NPTE9OX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTU1M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19DT0xPTl9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk1NTMJPSB7IEZPTExPV19DT0xPTl9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk1NTNfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk1NTggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NTU4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NTU4CT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk1NThfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTFBBUkVOX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTU3NyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTFBBUkVOX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTU3N19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDQwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MUEFSRU5faW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NTc3CT0geyBGT0xMT1dfTFBBUkVOX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTU3N19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19sdmFsdWVfaW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NTgyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19sdmFsdWVfaW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NTgyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMjAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2x2YWx1ZV9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk1ODIJPSB7IEZPTExPV19sdmFsdWVfaW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NTgyX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0NPTE9OX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTU4NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQ09MT05faW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NTg1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0NPTE9OX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTU4NQk9IHsgRk9MTE9XX0NPTE9OX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTU4NV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTU5MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk1OTBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk1OTAJPSB7IEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTU5MF9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19SUEFSRU5faW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NTkzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19SUEFSRU5faW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NTkzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAxKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1JQQVJFTl9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk1OTMJPSB7IEZPTExPV19SUEFSRU5faW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NTkzX2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk2MTIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk2MTJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTYxMgk9IHsgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk2MTJfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfNDE2X2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTYyMSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfNDE2X2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTYyMV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV180MTZfaW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NjIxCT0geyBGT0xMT1dfNDE2X2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTYyMV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTYyNiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk2MjZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDEpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk2MjYJPSB7IEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTYyNl9iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19ibG9ja19zdGF0ZW1lbnRfaW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NjMxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19ibG9ja19zdGF0ZW1lbnRfaW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NjMxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk2MzEJPSB7IEZPTExPV19ibG9ja19zdGF0ZW1lbnRfaW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NjMxX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzI2OV9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk2NDAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzI2OV9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk2NDBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDEpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjY5X2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTY0MAk9IHsgRk9MTE9XXzI2OV9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk2NDBfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTY0NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTY0NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDEwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19ibG9ja19zdGF0ZW1lbnRfaW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NjQ1CT0geyBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTY0NV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV180MTZfaW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NjQ4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV180MTZfaW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NjQ4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzQxNl9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk2NDgJPSB7IEZPTExPV180MTZfaW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NjQ4X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NjUzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTY1M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTY1Mwk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NjUzX2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NjU2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTY1Nl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTY1Ngk9IHsgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NjU2X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2x2YWx1ZV9pbl9mb3JfYXNzaWduX2hlYWRlcjE5Njc5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19sdmFsdWVfaW5fZm9yX2Fzc2lnbl9oZWFkZXIxOTY3OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwODAwMDAwNDAwMDAxMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19sdmFsdWVfaW5fZm9yX2Fzc2lnbl9oZWFkZXIxOTY3OQk9IHsgRk9MTE9XX2x2YWx1ZV9pbl9mb3JfYXNzaWduX2hlYWRlcjE5Njc5X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0FTU0lHTl9pbl9mb3JfYXNzaWduX2hlYWRlcjE5Njg0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19BU1NJR05faW5fZm9yX2Fzc2lnbl9oZWFkZXIxOTY4NF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19BU1NJR05faW5fZm9yX2Fzc2lnbl9oZWFkZXIxOTY4NAk9IHsgRk9MTE9XX0FTU0lHTl9pbl9mb3JfYXNzaWduX2hlYWRlcjE5Njg0X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fZm9yX2Fzc2lnbl9oZWFkZXIxOTY4OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9mb3JfYXNzaWduX2hlYWRlcjE5Njg5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fZm9yX2Fzc2lnbl9oZWFkZXIxOTY4OQk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fZm9yX2Fzc2lnbl9oZWFkZXIxOTY4OV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19JTkNSX2luX2Zvcl9hc3NpZ25faGVhZGVyMTk3MDIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0lOQ1JfaW5fZm9yX2Fzc2lnbl9oZWFkZXIxOTcwMl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JTkNSX2luX2Zvcl9hc3NpZ25faGVhZGVyMTk3MDIJPSB7IEZPTExPV19JTkNSX2luX2Zvcl9hc3NpZ25faGVhZGVyMTk3MDJfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfREVDUl9pbl9mb3JfYXNzaWduX2hlYWRlcjE5NzEzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19ERUNSX2luX2Zvcl9hc3NpZ25faGVhZGVyMTk3MTNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfREVDUl9pbl9mb3JfYXNzaWduX2hlYWRlcjE5NzEzCT0geyBGT0xMT1dfREVDUl9pbl9mb3JfYXNzaWduX2hlYWRlcjE5NzEzX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lOQ1JfaW5fZm9yX2Fzc2lnbl9oZWFkZXIxOTcyNSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfSU5DUl9pbl9mb3JfYXNzaWduX2hlYWRlcjE5NzI1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwNDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0lOQ1JfaW5fZm9yX2Fzc2lnbl9oZWFkZXIxOTcyNQk9IHsgRk9MTE9XX0lOQ1JfaW5fZm9yX2Fzc2lnbl9oZWFkZXIxOTcyNV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19sdmFsdWVfaW5fZm9yX2Fzc2lnbl9oZWFkZXIxOTczMCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfbHZhbHVlX2luX2Zvcl9hc3NpZ25faGVhZGVyMTk3MzBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfbHZhbHVlX2luX2Zvcl9hc3NpZ25faGVhZGVyMTk3MzAJPSB7IEZPTExPV19sdmFsdWVfaW5fZm9yX2Fzc2lnbl9oZWFkZXIxOTczMF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19ERUNSX2luX2Zvcl9hc3NpZ25faGVhZGVyMTk3NDEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0RFQ1JfaW5fZm9yX2Fzc2lnbl9oZWFkZXIxOTc0MV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDQwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19ERUNSX2luX2Zvcl9hc3NpZ25faGVhZGVyMTk3NDEJPSB7IEZPTExPV19ERUNSX2luX2Zvcl9hc3NpZ25faGVhZGVyMTk3NDFfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfbHZhbHVlX2luX2Zvcl9hc3NpZ25faGVhZGVyMTk3NDYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2x2YWx1ZV9pbl9mb3JfYXNzaWduX2hlYWRlcjE5NzQ2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2x2YWx1ZV9pbl9mb3JfYXNzaWduX2hlYWRlcjE5NzQ2CT0geyBGT0xMT1dfbHZhbHVlX2luX2Zvcl9hc3NpZ25faGVhZGVyMTk3NDZfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjQ3X2luX3N0YXRlbWVudF9qdW1wMTk3NjkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzI0N19pbl9zdGF0ZW1lbnRfanVtcDE5NzY5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMEMwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzI0N19pbl9zdGF0ZW1lbnRfanVtcDE5NzY5CT0geyBGT0xMT1dfMjQ3X2luX3N0YXRlbWVudF9qdW1wMTk3NjlfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfanVtcDE5Nzg4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9qdW1wMTk3ODhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfanVtcDE5Nzg4CT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfanVtcDE5Nzg4X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2p1bXAxOTc5OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfanVtcDE5Nzk5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2p1bXAxOTc5OQk9IHsgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2p1bXAxOTc5OV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yNjNfaW5fc3RhdGVtZW50X2p1bXAxOTgwNSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjYzX2luX3N0YXRlbWVudF9qdW1wMTk4MDVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwQzApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjYzX2luX3N0YXRlbWVudF9qdW1wMTk4MDUJPSB7IEZPTExPV18yNjNfaW5fc3RhdGVtZW50X2p1bXAxOTgwNV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9qdW1wMTk4MjEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2p1bXAxOTgyMV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9qdW1wMTk4MjEJPSB7IEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9qdW1wMTk4MjFfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfanVtcDE5ODMyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9qdW1wMTk4MzJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfanVtcDE5ODMyCT0geyBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfanVtcDE5ODMyX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzM2NF9pbl9zdGF0ZW1lbnRfanVtcDE5ODM4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zNjRfaW5fc3RhdGVtZW50X2p1bXAxOTgzOF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjBDMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zNjRfaW5fc3RhdGVtZW50X2p1bXAxOTgzOAk9IHsgRk9MTE9XXzM2NF9pbl9zdGF0ZW1lbnRfanVtcDE5ODM4X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2p1bXAxOTg1NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfanVtcDE5ODU2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwODAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2p1bXAxOTg1Ngk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2p1bXAxOTg1Nl9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19DT01NQV9pbl9zdGF0ZW1lbnRfanVtcDE5ODY4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19DT01NQV9pbl9zdGF0ZW1lbnRfanVtcDE5ODY4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0NPTU1BX2luX3N0YXRlbWVudF9qdW1wMTk4NjgJPSB7IEZPTExPV19DT01NQV9pbl9zdGF0ZW1lbnRfanVtcDE5ODY4X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2p1bXAxOTg3MiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfanVtcDE5ODcyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwODAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2p1bXAxOTg3Mgk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2p1bXAxOTg3Ml9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9qdW1wMTk4ODkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2p1bXAxOTg4OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9qdW1wMTk4ODkJPSB7IEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9qdW1wMTk4ODlfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjc5X2luX3N0YXRlbWVudF9qdW1wMTk4OTUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzI3OV9pbl9zdGF0ZW1lbnRfanVtcDE5ODk1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMEMwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzI3OV9pbl9zdGF0ZW1lbnRfanVtcDE5ODk1CT0geyBGT0xMT1dfMjc5X2luX3N0YXRlbWVudF9qdW1wMTk4OTVfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfanVtcDE5OTE1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9qdW1wMTk5MTVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfanVtcDE5OTE1CT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfanVtcDE5OTE1X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2p1bXAxOTkyNiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfanVtcDE5OTI2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2p1bXAxOTkyNgk9IHsgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2p1bXAxOTkyNl9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zMTNfaW5fZXhwcmVzc2lvbl9sYW1iZGExOTk0NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzEzX2luX2V4cHJlc3Npb25fbGFtYmRhMTk5NDVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDEwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzEzX2luX2V4cHJlc3Npb25fbGFtYmRhMTk5NDUJPSB7IEZPTExPV18zMTNfaW5fZXhwcmVzc2lvbl9sYW1iZGExOTk0NV9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19JRF9pbl9leHByZXNzaW9uX2xhbWJkYTE5OTU3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19JRF9pbl9leHByZXNzaW9uX2xhbWJkYTE5OTU3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAxMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0lEX2luX2V4cHJlc3Npb25fbGFtYmRhMTk5NTcJPSB7IEZPTExPV19JRF9pbl9leHByZXNzaW9uX2xhbWJkYTE5OTU3X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzE2NF9pbl9leHByZXNzaW9uX2xhbWJkYTE5OTY5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18xNjRfaW5fZXhwcmVzc2lvbl9sYW1iZGExOTk2OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18xNjRfaW5fZXhwcmVzc2lvbl9sYW1iZGExOTk2OQk9IHsgRk9MTE9XXzE2NF9pbl9leHByZXNzaW9uX2xhbWJkYTE5OTY5X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbl9sYW1iZGExOTk3MyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uX2xhbWJkYTE5OTczX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbl9sYW1iZGExOTk3Mwk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbl9sYW1iZGExOTk3M19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zODNfaW5fZXhwcmVzc2lvbl9zdGF0dXMxOTk5NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzgzX2luX2V4cHJlc3Npb25fc3RhdHVzMTk5OTZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAxMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMTM4MDQwODE4MDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMEIwQzAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwODAwMDAwMjQpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzgzX2luX2V4cHJlc3Npb25fc3RhdHVzMTk5OTYJPSB7IEZPTExPV18zODNfaW5fZXhwcmVzc2lvbl9zdGF0dXMxOTk5Nl9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19vcF9hY3Rpdml0eV9pbl9leHByZXNzaW9uX3N0YXR1czIwMDAzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19vcF9hY3Rpdml0eV9pbl9leHByZXNzaW9uX3N0YXR1czIwMDAzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX29wX2FjdGl2aXR5X2luX2V4cHJlc3Npb25fc3RhdHVzMjAwMDMJPSB7IEZPTExPV19vcF9hY3Rpdml0eV9pbl9leHByZXNzaW9uX3N0YXR1czIwMDAzX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9leHByZXNzaW9uX3N0YXR1czIwMDA4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fZXhwcmVzc2lvbl9zdGF0dXMyMDAwOF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fZXhwcmVzc2lvbl9zdGF0dXMyMDAwOAk9IHsgRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9leHByZXNzaW9uX3N0YXR1czIwMDA4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzM4Ml9pbl9leHByZXNzaW9uX3N0YXR1czIwMDE3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zODJfaW5fZXhwcmVzc2lvbl9zdGF0dXMyMDAxN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDEwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAxMzgwNDA4MTgwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwQjBDMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDA4MDAwMDAyNCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zODJfaW5fZXhwcmVzc2lvbl9zdGF0dXMyMDAxNwk9IHsgRk9MTE9XXzM4Ml9pbl9leHByZXNzaW9uX3N0YXR1czIwMDE3X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX29wX2FjdGl2aXR5X2luX2V4cHJlc3Npb25fc3RhdHVzMjAwMjUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX29wX2FjdGl2aXR5X2luX2V4cHJlc3Npb25fc3RhdHVzMjAwMjVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfb3BfYWN0aXZpdHlfaW5fZXhwcmVzc2lvbl9zdGF0dXMyMDAyNQk9IHsgRk9MTE9XX29wX2FjdGl2aXR5X2luX2V4cHJlc3Npb25fc3RhdHVzMjAwMjVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX2V4cHJlc3Npb25fc3RhdHVzMjAwMzAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9leHByZXNzaW9uX3N0YXR1czIwMDMwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9leHByZXNzaW9uX3N0YXR1czIwMDMwCT0geyBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX2V4cHJlc3Npb25fc3RhdHVzMjAwMzBfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzgxX2luX2V4cHJlc3Npb25fc3RhdHVzMjAwMzkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzM4MV9pbl9leHByZXNzaW9uX3N0YXR1czIwMDM5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMTAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDEzODA0MDgxODAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjBCMEMwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDgwMDAwMDI0KSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzM4MV9pbl9leHByZXNzaW9uX3N0YXR1czIwMDM5CT0geyBGT0xMT1dfMzgxX2luX2V4cHJlc3Npb25fc3RhdHVzMjAwMzlfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfb3BfYWN0aXZpdHlfaW5fZXhwcmVzc2lvbl9zdGF0dXMyMDA0NCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfb3BfYWN0aXZpdHlfaW5fZXhwcmVzc2lvbl9zdGF0dXMyMDA0NF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19vcF9hY3Rpdml0eV9pbl9leHByZXNzaW9uX3N0YXR1czIwMDQ0CT0geyBGT0xMT1dfb3BfYWN0aXZpdHlfaW5fZXhwcmVzc2lvbl9zdGF0dXMyMDA0NF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fZXhwcmVzc2lvbl9zdGF0dXMyMDA0OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX2V4cHJlc3Npb25fc3RhdHVzMjAwNDlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX2V4cHJlc3Npb25fc3RhdHVzMjAwNDkJPSB7IEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fZXhwcmVzc2lvbl9zdGF0dXMyMDA0OV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zODRfaW5fZXhwcmVzc2lvbl9zdGF0dXMyMDA1OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzg0X2luX2V4cHJlc3Npb25fc3RhdHVzMjAwNThfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAxMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMTM4MDQwODE4MDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMEIwQzAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwODAwMDAwMjQpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzg0X2luX2V4cHJlc3Npb25fc3RhdHVzMjAwNTgJPSB7IEZPTExPV18zODRfaW5fZXhwcmVzc2lvbl9zdGF0dXMyMDA1OF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19vcF9hY3Rpdml0eV9pbl9leHByZXNzaW9uX3N0YXR1czIwMDY0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19vcF9hY3Rpdml0eV9pbl9leHByZXNzaW9uX3N0YXR1czIwMDY0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX29wX2FjdGl2aXR5X2luX2V4cHJlc3Npb25fc3RhdHVzMjAwNjQJPSB7IEZPTExPV19vcF9hY3Rpdml0eV9pbl9leHByZXNzaW9uX3N0YXR1czIwMDY0X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9leHByZXNzaW9uX3N0YXR1czIwMDY5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fZXhwcmVzc2lvbl9zdGF0dXMyMDA2OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fZXhwcmVzc2lvbl9zdGF0dXMyMDA2OQk9IHsgRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9leHByZXNzaW9uX3N0YXR1czIwMDY5X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzI1Ml9pbl9leHByZXNzaW9uX3N0YXR1czIwMDc4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yNTJfaW5fZXhwcmVzc2lvbl9zdGF0dXMyMDA3OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDQwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yNTJfaW5fZXhwcmVzc2lvbl9zdGF0dXMyMDA3OAk9IHsgRk9MTE9XXzI1Ml9pbl9leHByZXNzaW9uX3N0YXR1czIwMDc4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2x2YWx1ZV9pbl9leHByZXNzaW9uX3N0YXR1czIwMDg2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19sdmFsdWVfaW5fZXhwcmVzc2lvbl9zdGF0dXMyMDA4Nl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19sdmFsdWVfaW5fZXhwcmVzc2lvbl9zdGF0dXMyMDA4Ngk9IHsgRk9MTE9XX2x2YWx1ZV9pbl9leHByZXNzaW9uX3N0YXR1czIwMDg2X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzI1MV9pbl9leHByZXNzaW9uX3N0YXR1czIwMDk1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yNTFfaW5fZXhwcmVzc2lvbl9zdGF0dXMyMDA5NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDQwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yNTFfaW5fZXhwcmVzc2lvbl9zdGF0dXMyMDA5NQk9IHsgRk9MTE9XXzI1MV9pbl9leHByZXNzaW9uX3N0YXR1czIwMDk1X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2x2YWx1ZV9pbl9leHByZXNzaW9uX3N0YXR1czIwMTAwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19sdmFsdWVfaW5fZXhwcmVzc2lvbl9zdGF0dXMyMDEwMF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19sdmFsdWVfaW5fZXhwcmVzc2lvbl9zdGF0dXMyMDEwMAk9IHsgRk9MTE9XX2x2YWx1ZV9pbl9leHByZXNzaW9uX3N0YXR1czIwMTAwX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzI5Nl9pbl9vcF9hY3Rpdml0eTIwMTE4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yOTZfaW5fb3BfYWN0aXZpdHkyMDExOF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yOTZfaW5fb3BfYWN0aXZpdHkyMDExOAk9IHsgRk9MTE9XXzI5Nl9pbl9vcF9hY3Rpdml0eTIwMTE4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzI4Ml9pbl9vcF9hY3Rpdml0eTIwMTI5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yODJfaW5fb3BfYWN0aXZpdHkyMDEyOV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yODJfaW5fb3BfYWN0aXZpdHkyMDEyOQk9IHsgRk9MTE9XXzI4Ml9pbl9vcF9hY3Rpdml0eTIwMTI5X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzI2N19pbl9vcF9hY3Rpdml0eTIwMTM5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yNjdfaW5fb3BfYWN0aXZpdHkyMDEzOV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yNjdfaW5fb3BfYWN0aXZpdHkyMDEzOQk9IHsgRk9MTE9XXzI2N19pbl9vcF9hY3Rpdml0eTIwMTM5X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzM3N19pbl9vcF9hY3Rpdml0eTIwMTQ3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zNzdfaW5fb3BfYWN0aXZpdHkyMDE0N19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zNzdfaW5fb3BfYWN0aXZpdHkyMDE0Nwk9IHsgRk9MTE9XXzM3N19pbl9vcF9hY3Rpdml0eTIwMTQ3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzM2Ml9pbl9vcF9hY3Rpdml0eTIwMTU3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zNjJfaW5fb3BfYWN0aXZpdHkyMDE1N19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zNjJfaW5fb3BfYWN0aXZpdHkyMDE1Nwk9IHsgRk9MTE9XXzM2Ml9pbl9vcF9hY3Rpdml0eTIwMTU3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzM4Nl9pbl9vcF9hY3Rpdml0eTIwMTY1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zODZfaW5fb3BfYWN0aXZpdHkyMDE2NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zODZfaW5fb3BfYWN0aXZpdHkyMDE2NQk9IHsgRk9MTE9XXzM4Nl9pbl9vcF9hY3Rpdml0eTIwMTY1X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzI5M19pbl9vcF9hY3Rpdml0eTIwMTc2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yOTNfaW5fb3BfYWN0aXZpdHkyMDE3Nl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yOTNfaW5fb3BfYWN0aXZpdHkyMDE3Ngk9IHsgRk9MTE9XXzI5M19pbl9vcF9hY3Rpdml0eTIwMTc2X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzI3NV9pbl9vcF9hY3Rpdml0eTIwMTg0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yNzVfaW5fb3BfYWN0aXZpdHkyMDE4NF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yNzVfaW5fb3BfYWN0aXZpdHkyMDE4NAk9IHsgRk9MTE9XXzI3NV9pbl9vcF9hY3Rpdml0eTIwMTg0X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzI5Ml9pbl9vcF9hY3Rpdml0eTIwMTkzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yOTJfaW5fb3BfYWN0aXZpdHkyMDE5M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yOTJfaW5fb3BfYWN0aXZpdHkyMDE5Mwk9IHsgRk9MTE9XXzI5Ml9pbl9vcF9hY3Rpdml0eTIwMTkzX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzI2OF9pbl9vcF9hY3Rpdml0eTIwMjAwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yNjhfaW5fb3BfYWN0aXZpdHkyMDIwMF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yNjhfaW5fb3BfYWN0aXZpdHkyMDIwMAk9IHsgRk9MTE9XXzI2OF9pbl9vcF9hY3Rpdml0eTIwMjAwX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzI5MV9pbl9vcF9hY3Rpdml0eTIwMjA4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yOTFfaW5fb3BfYWN0aXZpdHkyMDIwOF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yOTFfaW5fb3BfYWN0aXZpdHkyMDIwOAk9IHsgRk9MTE9XXzI5MV9pbl9vcF9hY3Rpdml0eTIwMjA4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzIzNl9pbl9vcF9hY3Rpdml0eTIwMjE3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yMzZfaW5fb3BfYWN0aXZpdHkyMDIxN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yMzZfaW5fb3BfYWN0aXZpdHkyMDIxNwk9IHsgRk9MTE9XXzIzNl9pbl9vcF9hY3Rpdml0eTIwMjE3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzM2OV9pbl9vcF9hY3Rpdml0eTIwMjI3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zNjlfaW5fb3BfYWN0aXZpdHkyMDIyN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zNjlfaW5fb3BfYWN0aXZpdHkyMDIyNwk9IHsgRk9MTE9XXzM2OV9pbl9vcF9hY3Rpdml0eTIwMjI3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzM2OF9pbl9vcF9hY3Rpdml0eTIwMjM5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zNjhfaW5fb3BfYWN0aXZpdHkyMDIzOV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zNjhfaW5fb3BfYWN0aXZpdHkyMDIzOQk9IHsgRk9MTE9XXzM2OF9pbl9vcF9hY3Rpdml0eTIwMjM5X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzM3MV9pbl9vcF9hY3Rpdml0eTIwMjUxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zNzFfaW5fb3BfYWN0aXZpdHkyMDI1MV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zNzFfaW5fb3BfYWN0aXZpdHkyMDI1MQk9IHsgRk9MTE9XXzM3MV9pbl9vcF9hY3Rpdml0eTIwMjUxX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzM4OV9pbl9vcF9hY3Rpdml0eTIwMjU4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zODlfaW5fb3BfYWN0aXZpdHkyMDI1OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zODlfaW5fb3BfYWN0aXZpdHkyMDI1OAk9IHsgRk9MTE9XXzM4OV9pbl9vcF9hY3Rpdml0eTIwMjU4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzM2M19pbl9vcF9hY3Rpdml0eTIwMjY2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zNjNfaW5fb3BfYWN0aXZpdHkyMDI2Nl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zNjNfaW5fb3BfYWN0aXZpdHkyMDI2Ngk9IHsgRk9MTE9XXzM2M19pbl9vcF9hY3Rpdml0eTIwMjY2X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzQxNV9pbl9vcF9hY3Rpdml0eTIwMjc1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV180MTVfaW5fb3BfYWN0aXZpdHkyMDI3NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV180MTVfaW5fb3BfYWN0aXZpdHkyMDI3NQk9IHsgRk9MTE9XXzQxNV9pbl9vcF9hY3Rpdml0eTIwMjc1X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX29wX2FjdGl2aXR5X2luX3N0YXRlbWVudF9hY3Rpdml0eTIwMzA3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19vcF9hY3Rpdml0eV9pbl9zdGF0ZW1lbnRfYWN0aXZpdHkyMDMwN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19vcF9hY3Rpdml0eV9pbl9zdGF0ZW1lbnRfYWN0aXZpdHkyMDMwNwk9IHsgRk9MTE9XX29wX2FjdGl2aXR5X2luX3N0YXRlbWVudF9hY3Rpdml0eTIwMzA3X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9zdGF0ZW1lbnRfYWN0aXZpdHkyMDMxOSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX3N0YXRlbWVudF9hY3Rpdml0eTIwMzE5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9zdGF0ZW1lbnRfYWN0aXZpdHkyMDMxOQk9IHsgRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9zdGF0ZW1lbnRfYWN0aXZpdHkyMDMxOV9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19hY3Rpdml0eV9tYWNoaW5lX3BhcmFtX3JldHVybl9pbl9zdGF0ZW1lbnRfYWN0aXZpdHkyMDMzOCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfYWN0aXZpdHlfbWFjaGluZV9wYXJhbV9yZXR1cm5faW5fc3RhdGVtZW50X2FjdGl2aXR5MjAzMzhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfYWN0aXZpdHlfbWFjaGluZV9wYXJhbV9yZXR1cm5faW5fc3RhdGVtZW50X2FjdGl2aXR5MjAzMzgJPSB7IEZPTExPV19hY3Rpdml0eV9tYWNoaW5lX3BhcmFtX3JldHVybl9pbl9zdGF0ZW1lbnRfYWN0aXZpdHkyMDMzOF9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hY3Rpdml0eTIwMzQ2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hY3Rpdml0eTIwMzQ2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2FjdGl2aXR5MjAzNDYJPSB7IEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hY3Rpdml0eTIwMzQ2X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzI4OV9pbl9zdGF0ZW1lbnRfYWN0aXZpdHkyMDM1NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjg5X2luX3N0YXRlbWVudF9hY3Rpdml0eTIwMzU1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzI4OV9pbl9zdGF0ZW1lbnRfYWN0aXZpdHkyMDM1NQk9IHsgRk9MTE9XXzI4OV9pbl9zdGF0ZW1lbnRfYWN0aXZpdHkyMDM1NV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fc3RhdGVtZW50X2FjdGl2aXR5MjAzNjAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9zdGF0ZW1lbnRfYWN0aXZpdHkyMDM2MF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAxMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fc3RhdGVtZW50X2FjdGl2aXR5MjAzNjAJPSB7IEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fc3RhdGVtZW50X2FjdGl2aXR5MjAzNjBfYml0cywgNQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc3RhdGVtZW50X2luaXRfZmxvd19pbl9zdGF0ZW1lbnRfYWN0aXZpdHkyMDM3NCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc3RhdGVtZW50X2luaXRfZmxvd19pbl9zdGF0ZW1lbnRfYWN0aXZpdHkyMDM3NF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zdGF0ZW1lbnRfaW5pdF9mbG93X2luX3N0YXRlbWVudF9hY3Rpdml0eTIwMzc0CT0geyBGT0xMT1dfc3RhdGVtZW50X2luaXRfZmxvd19pbl9zdGF0ZW1lbnRfYWN0aXZpdHkyMDM3NF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hY3Rpdml0eTIwMzg1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hY3Rpdml0eTIwMzg1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2FjdGl2aXR5MjAzODUJPSB7IEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hY3Rpdml0eTIwMzg1X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzMxMl9pbl9zdGF0ZW1lbnRfYWN0aXZpdHkyMDM5NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzEyX2luX3N0YXRlbWVudF9hY3Rpdml0eTIwMzk2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzMxMl9pbl9zdGF0ZW1lbnRfYWN0aXZpdHkyMDM5Ngk9IHsgRk9MTE9XXzMxMl9pbl9zdGF0ZW1lbnRfYWN0aXZpdHkyMDM5Nl9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9hY3Rpdml0eTIwNDAxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9hY3Rpdml0eTIwNDAxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2FjdGl2aXR5MjA0MDEJPSB7IEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9hY3Rpdml0eTIwNDAxX2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2FjdGl2aXR5MjA0MDQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2FjdGl2aXR5MjA0MDRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYWN0aXZpdHkyMDQwNAk9IHsgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2FjdGl2aXR5MjA0MDRfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjg0X2luX3N0YXRlbWVudF9pbml0X2Zsb3cyMDQzNCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjg0X2luX3N0YXRlbWVudF9pbml0X2Zsb3cyMDQzNF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMSkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yODRfaW5fc3RhdGVtZW50X2luaXRfZmxvdzIwNDM0CT0geyBGT0xMT1dfMjg0X2luX3N0YXRlbWVudF9pbml0X2Zsb3cyMDQzNF9iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19ibG9ja19zdGF0ZW1lbnRfaW5fc3RhdGVtZW50X2luaXRfZmxvdzIwNDM4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19ibG9ja19zdGF0ZW1lbnRfaW5fc3RhdGVtZW50X2luaXRfZmxvdzIwNDM4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9zdGF0ZW1lbnRfaW5pdF9mbG93MjA0MzgJPSB7IEZPTExPV19ibG9ja19zdGF0ZW1lbnRfaW5fc3RhdGVtZW50X2luaXRfZmxvdzIwNDM4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lEX2luX3N0YXRlbWVudF9pbnZva2Vfcm91dGluZTIwNDY4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19JRF9pbl9zdGF0ZW1lbnRfaW52b2tlX3JvdXRpbmUyMDQ2OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JRF9pbl9zdGF0ZW1lbnRfaW52b2tlX3JvdXRpbmUyMDQ2OAk9IHsgRk9MTE9XX0lEX2luX3N0YXRlbWVudF9pbnZva2Vfcm91dGluZTIwNDY4X2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2ludm9rZV9yb3V0aW5lX3BhcmFtc19pbl9zdGF0ZW1lbnRfaW52b2tlX3JvdXRpbmUyMDQ3OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfaW52b2tlX3JvdXRpbmVfcGFyYW1zX2luX3N0YXRlbWVudF9pbnZva2Vfcm91dGluZTIwNDc5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwODAwMDAwMDgwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2ludm9rZV9yb3V0aW5lX3BhcmFtc19pbl9zdGF0ZW1lbnRfaW52b2tlX3JvdXRpbmUyMDQ3OQk9IHsgRk9MTE9XX2ludm9rZV9yb3V0aW5lX3BhcmFtc19pbl9zdGF0ZW1lbnRfaW52b2tlX3JvdXRpbmUyMDQ3OV9iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19pbnZva2Vfcm91dGluZV9yZXR1cm5zX2luX3N0YXRlbWVudF9pbnZva2Vfcm91dGluZTIwNDkwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19pbnZva2Vfcm91dGluZV9yZXR1cm5zX2luX3N0YXRlbWVudF9pbnZva2Vfcm91dGluZTIwNDkwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2ludm9rZV9yb3V0aW5lX3JldHVybnNfaW5fc3RhdGVtZW50X2ludm9rZV9yb3V0aW5lMjA0OTAJPSB7IEZPTExPV19pbnZva2Vfcm91dGluZV9yZXR1cm5zX2luX3N0YXRlbWVudF9pbnZva2Vfcm91dGluZTIwNDkwX2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2ludm9rZV9yb3V0aW5lMjA1MDIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2ludm9rZV9yb3V0aW5lMjA1MDJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfaW52b2tlX3JvdXRpbmUyMDUwMgk9IHsgRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2ludm9rZV9yb3V0aW5lMjA1MDJfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTFBBUkVOX2luX2ludm9rZV9yb3V0aW5lX3BhcmFtczIwNTI1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MUEFSRU5faW5faW52b2tlX3JvdXRpbmVfcGFyYW1zMjA1MjVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTFBBUkVOX2luX2ludm9rZV9yb3V0aW5lX3BhcmFtczIwNTI1CT0geyBGT0xMT1dfTFBBUkVOX2luX2ludm9rZV9yb3V0aW5lX3BhcmFtczIwNTI1X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2xhYmVsbGVkX2FyZ3VtZW50X2luX2ludm9rZV9yb3V0aW5lX3BhcmFtczIwNTM0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9pbnZva2Vfcm91dGluZV9wYXJhbXMyMDUzNF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDgwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9pbnZva2Vfcm91dGluZV9wYXJhbXMyMDUzNAk9IHsgRk9MTE9XX2xhYmVsbGVkX2FyZ3VtZW50X2luX2ludm9rZV9yb3V0aW5lX3BhcmFtczIwNTM0X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0NPTU1BX2luX2ludm9rZV9yb3V0aW5lX3BhcmFtczIwNTUwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19DT01NQV9pbl9pbnZva2Vfcm91dGluZV9wYXJhbXMyMDU1MF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19DT01NQV9pbl9pbnZva2Vfcm91dGluZV9wYXJhbXMyMDU1MAk9IHsgRk9MTE9XX0NPTU1BX2luX2ludm9rZV9yb3V0aW5lX3BhcmFtczIwNTUwX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2xhYmVsbGVkX2FyZ3VtZW50X2luX2ludm9rZV9yb3V0aW5lX3BhcmFtczIwNTU5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9pbnZva2Vfcm91dGluZV9wYXJhbXMyMDU1OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDgwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9pbnZva2Vfcm91dGluZV9wYXJhbXMyMDU1OQk9IHsgRk9MTE9XX2xhYmVsbGVkX2FyZ3VtZW50X2luX2ludm9rZV9yb3V0aW5lX3BhcmFtczIwNTU5X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1JQQVJFTl9pbl9pbnZva2Vfcm91dGluZV9wYXJhbXMyMDU4NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfUlBBUkVOX2luX2ludm9rZV9yb3V0aW5lX3BhcmFtczIwNTg1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1JQQVJFTl9pbl9pbnZva2Vfcm91dGluZV9wYXJhbXMyMDU4NQk9IHsgRk9MTE9XX1JQQVJFTl9pbl9pbnZva2Vfcm91dGluZV9wYXJhbXMyMDU4NV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zZXRfaW5faW52b2tlX3JvdXRpbmVfcmV0dXJuczIwNTk5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zZXRfaW5faW52b2tlX3JvdXRpbmVfcmV0dXJuczIwNTk5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3NldF9pbl9pbnZva2Vfcm91dGluZV9yZXR1cm5zMjA1OTkJPSB7IEZPTExPV19zZXRfaW5faW52b2tlX3JvdXRpbmVfcmV0dXJuczIwNTk5X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xQQVJFTl9pbl9pbnZva2Vfcm91dGluZV9yZXR1cm5zMjA2MTQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xQQVJFTl9pbl9pbnZva2Vfcm91dGluZV9yZXR1cm5zMjA2MTRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTFBBUkVOX2luX2ludm9rZV9yb3V0aW5lX3JldHVybnMyMDYxNAk9IHsgRk9MTE9XX0xQQVJFTl9pbl9pbnZva2Vfcm91dGluZV9yZXR1cm5zMjA2MTRfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5faW52b2tlX3JvdXRpbmVfcmV0dXJuczIwNjIzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9pbnZva2Vfcm91dGluZV9yZXR1cm5zMjA2MjNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA4MDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5faW52b2tlX3JvdXRpbmVfcmV0dXJuczIwNjIzCT0geyBGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5faW52b2tlX3JvdXRpbmVfcmV0dXJuczIwNjIzX2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0NPTU1BX2luX2ludm9rZV9yb3V0aW5lX3JldHVybnMyMDYzOSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQ09NTUFfaW5faW52b2tlX3JvdXRpbmVfcmV0dXJuczIwNjM5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0NPTU1BX2luX2ludm9rZV9yb3V0aW5lX3JldHVybnMyMDYzOQk9IHsgRk9MTE9XX0NPTU1BX2luX2ludm9rZV9yb3V0aW5lX3JldHVybnMyMDYzOV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9pbnZva2Vfcm91dGluZV9yZXR1cm5zMjA2NTAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2xhYmVsbGVkX2FyZ3VtZW50X2luX2ludm9rZV9yb3V0aW5lX3JldHVybnMyMDY1MF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDgwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9pbnZva2Vfcm91dGluZV9yZXR1cm5zMjA2NTAJPSB7IEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9pbnZva2Vfcm91dGluZV9yZXR1cm5zMjA2NTBfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfUlBBUkVOX2luX2ludm9rZV9yb3V0aW5lX3JldHVybnMyMDY3NCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfUlBBUkVOX2luX2ludm9rZV9yb3V0aW5lX3JldHVybnMyMDY3NF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19SUEFSRU5faW5faW52b2tlX3JvdXRpbmVfcmV0dXJuczIwNjc0CT0geyBGT0xMT1dfUlBBUkVOX2luX2ludm9rZV9yb3V0aW5lX3JldHVybnMyMDY3NF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9pbnZva2Vfcm91dGluZV9yZXR1cm5zMjA2ODQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2xhYmVsbGVkX2FyZ3VtZW50X2luX2ludm9rZV9yb3V0aW5lX3JldHVybnMyMDY4NF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9pbnZva2Vfcm91dGluZV9yZXR1cm5zMjA2ODQJPSB7IEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9pbnZva2Vfcm91dGluZV9yZXR1cm5zMjA2ODRfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzg1X2luX3N0YXRlbWVudF9tb2MyMDcyMiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzg1X2luX3N0YXRlbWVudF9tb2MyMDcyMl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zODVfaW5fc3RhdGVtZW50X21vYzIwNzIyCT0geyBGT0xMT1dfMzg1X2luX3N0YXRlbWVudF9tb2MyMDcyMl9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TdHJpbmdMaXRlcmFsX2luX3N0YXRlbWVudF9tb2MyMDcyNSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU3RyaW5nTGl0ZXJhbF9pbl9zdGF0ZW1lbnRfbW9jMjA3MjVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU3RyaW5nTGl0ZXJhbF9pbl9zdGF0ZW1lbnRfbW9jMjA3MjUJPSB7IEZPTExPV19TdHJpbmdMaXRlcmFsX2luX3N0YXRlbWVudF9tb2MyMDcyNV9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9tb2MyMDcyOCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfbW9jMjA3MjhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfbW9jMjA3MjgJPSB7IEZPTExPV19TRU1JX2luX3N0YXRlbWVudF9tb2MyMDcyOF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19jb25kaXRpb25hbEV4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIwNzU3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19jb25kaXRpb25hbEV4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIwNzU3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwNjAwMDAwMDYwMEQ4QzcyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwNjAwMDMwMDAyMUIwQzMwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwQzMwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2NvbmRpdGlvbmFsRXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjA3NTcJPSB7IEZPTExPV19jb25kaXRpb25hbEV4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIwNzU3X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0FTU0lHTl9pbl9leHByZXNzaW9uMjA3NjYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0FTU0lHTl9pbl9leHByZXNzaW9uMjA3NjZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQVNTSUdOX2luX2V4cHJlc3Npb24yMDc2Ngk9IHsgRk9MTE9XX0FTU0lHTl9pbl9leHByZXNzaW9uMjA3NjZfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjA3NzEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIwNzcxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIwNzcxCT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjA3NzFfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfQVNTSUdOX01BQ1JPX2luX2V4cHJlc3Npb24yMDc4MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQVNTSUdOX01BQ1JPX2luX2V4cHJlc3Npb24yMDc4MF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19BU1NJR05fTUFDUk9faW5fZXhwcmVzc2lvbjIwNzgwCT0geyBGT0xMT1dfQVNTSUdOX01BQ1JPX2luX2V4cHJlc3Npb24yMDc4MF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb24yMDc4NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjA3ODVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjA3ODUJPSB7IEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb24yMDc4NV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19BU1NJR05fQUZURVJfaW5fZXhwcmVzc2lvbjIwNzk0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19BU1NJR05fQUZURVJfaW5fZXhwcmVzc2lvbjIwNzk0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0FTU0lHTl9BRlRFUl9pbl9leHByZXNzaW9uMjA3OTQJPSB7IEZPTExPV19BU1NJR05fQUZURVJfaW5fZXhwcmVzc2lvbjIwNzk0X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIwNzk5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb24yMDc5OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb24yMDc5OQk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIwNzk5X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1BMVVNfQVNTSUdOX2luX2V4cHJlc3Npb24yMDgwOCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfUExVU19BU1NJR05faW5fZXhwcmVzc2lvbjIwODA4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1BMVVNfQVNTSUdOX2luX2V4cHJlc3Npb24yMDgwOAk9IHsgRk9MTE9XX1BMVVNfQVNTSUdOX2luX2V4cHJlc3Npb24yMDgwOF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb24yMDgxMyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjA4MTNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjA4MTMJPSB7IEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb24yMDgxM19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19QTFVTX0FTU0lHTl9BRlRFUl9pbl9leHByZXNzaW9uMjA4MjIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1BMVVNfQVNTSUdOX0FGVEVSX2luX2V4cHJlc3Npb24yMDgyMl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19QTFVTX0FTU0lHTl9BRlRFUl9pbl9leHByZXNzaW9uMjA4MjIJPSB7IEZPTExPV19QTFVTX0FTU0lHTl9BRlRFUl9pbl9leHByZXNzaW9uMjA4MjJfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjA4MjcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIwODI3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIwODI3CT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjA4MjdfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTUlOVVNfQVNTSUdOX2luX2V4cHJlc3Npb24yMDgzNiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTUlOVVNfQVNTSUdOX2luX2V4cHJlc3Npb24yMDgzNl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19NSU5VU19BU1NJR05faW5fZXhwcmVzc2lvbjIwODM2CT0geyBGT0xMT1dfTUlOVVNfQVNTSUdOX2luX2V4cHJlc3Npb24yMDgzNl9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb24yMDg0MSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjA4NDFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjA4NDEJPSB7IEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb24yMDg0MV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19NSU5VU19BU1NJR05fQUZURVJfaW5fZXhwcmVzc2lvbjIwODUwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19NSU5VU19BU1NJR05fQUZURVJfaW5fZXhwcmVzc2lvbjIwODUwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX01JTlVTX0FTU0lHTl9BRlRFUl9pbl9leHByZXNzaW9uMjA4NTAJPSB7IEZPTExPV19NSU5VU19BU1NJR05fQUZURVJfaW5fZXhwcmVzc2lvbjIwODUwX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIwODU1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb24yMDg1NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb24yMDg1NQk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIwODU1X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1NUQVJfQVNTSUdOX2luX2V4cHJlc3Npb24yMDg2NCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU1RBUl9BU1NJR05faW5fZXhwcmVzc2lvbjIwODY0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1NUQVJfQVNTSUdOX2luX2V4cHJlc3Npb24yMDg2NAk9IHsgRk9MTE9XX1NUQVJfQVNTSUdOX2luX2V4cHJlc3Npb24yMDg2NF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb24yMDg2OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjA4NjlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjA4NjkJPSB7IEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb24yMDg2OV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TVEFSX0FTU0lHTl9BRlRFUl9pbl9leHByZXNzaW9uMjA4NzggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1NUQVJfQVNTSUdOX0FGVEVSX2luX2V4cHJlc3Npb24yMDg3OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19TVEFSX0FTU0lHTl9BRlRFUl9pbl9leHByZXNzaW9uMjA4NzgJPSB7IEZPTExPV19TVEFSX0FTU0lHTl9BRlRFUl9pbl9leHByZXNzaW9uMjA4NzhfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjA4ODMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIwODgzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIwODgzCT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjA4ODNfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfRElWX0FTU0lHTl9pbl9leHByZXNzaW9uMjA4OTIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0RJVl9BU1NJR05faW5fZXhwcmVzc2lvbjIwODkyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0RJVl9BU1NJR05faW5fZXhwcmVzc2lvbjIwODkyCT0geyBGT0xMT1dfRElWX0FTU0lHTl9pbl9leHByZXNzaW9uMjA4OTJfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjA4OTcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIwODk3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIwODk3CT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjA4OTdfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfRElWX0FTU0lHTl9BRlRFUl9pbl9leHByZXNzaW9uMjA5MDYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0RJVl9BU1NJR05fQUZURVJfaW5fZXhwcmVzc2lvbjIwOTA2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0RJVl9BU1NJR05fQUZURVJfaW5fZXhwcmVzc2lvbjIwOTA2CT0geyBGT0xMT1dfRElWX0FTU0lHTl9BRlRFUl9pbl9leHByZXNzaW9uMjA5MDZfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjA5MTEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIwOTExX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIwOTExCT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjA5MTFfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTU9EX0FTU0lHTl9pbl9leHByZXNzaW9uMjA5MjAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX01PRF9BU1NJR05faW5fZXhwcmVzc2lvbjIwOTIwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX01PRF9BU1NJR05faW5fZXhwcmVzc2lvbjIwOTIwCT0geyBGT0xMT1dfTU9EX0FTU0lHTl9pbl9leHByZXNzaW9uMjA5MjBfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjA5MjUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIwOTI1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIwOTI1CT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjA5MjVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTU9EX0FTU0lHTl9BRlRFUl9pbl9leHByZXNzaW9uMjA5MzQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX01PRF9BU1NJR05fQUZURVJfaW5fZXhwcmVzc2lvbjIwOTM0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX01PRF9BU1NJR05fQUZURVJfaW5fZXhwcmVzc2lvbjIwOTM0CT0geyBGT0xMT1dfTU9EX0FTU0lHTl9BRlRFUl9pbl9leHByZXNzaW9uMjA5MzRfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjA5MzkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIwOTM5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIwOTM5CT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjA5MzlfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTEFORF9BU1NJR05faW5fZXhwcmVzc2lvbjIwOTQ4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MQU5EX0FTU0lHTl9pbl9leHByZXNzaW9uMjA5NDhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTEFORF9BU1NJR05faW5fZXhwcmVzc2lvbjIwOTQ4CT0geyBGT0xMT1dfTEFORF9BU1NJR05faW5fZXhwcmVzc2lvbjIwOTQ4X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIwOTUzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb24yMDk1M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb24yMDk1Mwk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIwOTUzX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xBTkRfQVNTSUdOX0FGVEVSX2luX2V4cHJlc3Npb24yMDk2MiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTEFORF9BU1NJR05fQUZURVJfaW5fZXhwcmVzc2lvbjIwOTYyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xBTkRfQVNTSUdOX0FGVEVSX2luX2V4cHJlc3Npb24yMDk2Mgk9IHsgRk9MTE9XX0xBTkRfQVNTSUdOX0FGVEVSX2luX2V4cHJlc3Npb24yMDk2Ml9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb24yMDk2NyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjA5NjdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjA5NjcJPSB7IEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb24yMDk2N19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MT1JfQVNTSUdOX2luX2V4cHJlc3Npb24yMDk3NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTE9SX0FTU0lHTl9pbl9leHByZXNzaW9uMjA5NzZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTE9SX0FTU0lHTl9pbl9leHByZXNzaW9uMjA5NzYJPSB7IEZPTExPV19MT1JfQVNTSUdOX2luX2V4cHJlc3Npb24yMDk3Nl9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb24yMDk4MSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjA5ODFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjA5ODEJPSB7IEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb24yMDk4MV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MT1JfQVNTSUdOX0FGVEVSX2luX2V4cHJlc3Npb24yMDk5MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTE9SX0FTU0lHTl9BRlRFUl9pbl9leHByZXNzaW9uMjA5OTBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTE9SX0FTU0lHTl9BRlRFUl9pbl9leHByZXNzaW9uMjA5OTAJPSB7IEZPTExPV19MT1JfQVNTSUdOX0FGVEVSX2luX2V4cHJlc3Npb24yMDk5MF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb24yMDk5NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjA5OTVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjA5OTUJPSB7IEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb24yMDk5NV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19CQU5EX0FTU0lHTl9pbl9leHByZXNzaW9uMjEwMDQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0JBTkRfQVNTSUdOX2luX2V4cHJlc3Npb24yMTAwNF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19CQU5EX0FTU0lHTl9pbl9leHByZXNzaW9uMjEwMDQJPSB7IEZPTExPV19CQU5EX0FTU0lHTl9pbl9leHByZXNzaW9uMjEwMDRfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjEwMDkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIxMDA5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIxMDA5CT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjEwMDlfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfQkFORF9BU1NJR05fQUZURVJfaW5fZXhwcmVzc2lvbjIxMDE4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19CQU5EX0FTU0lHTl9BRlRFUl9pbl9leHByZXNzaW9uMjEwMThfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQkFORF9BU1NJR05fQUZURVJfaW5fZXhwcmVzc2lvbjIxMDE4CT0geyBGT0xMT1dfQkFORF9BU1NJR05fQUZURVJfaW5fZXhwcmVzc2lvbjIxMDE4X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIxMDIzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb24yMTAyM19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb24yMTAyMwk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIxMDIzX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0JPUl9BU1NJR05faW5fZXhwcmVzc2lvbjIxMDMyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19CT1JfQVNTSUdOX2luX2V4cHJlc3Npb24yMTAzMl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19CT1JfQVNTSUdOX2luX2V4cHJlc3Npb24yMTAzMgk9IHsgRk9MTE9XX0JPUl9BU1NJR05faW5fZXhwcmVzc2lvbjIxMDMyX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIxMDM3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb24yMTAzN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb24yMTAzNwk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIxMDM3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0JPUl9BU1NJR05fQUZURVJfaW5fZXhwcmVzc2lvbjIxMDQ2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19CT1JfQVNTSUdOX0FGVEVSX2luX2V4cHJlc3Npb24yMTA0Nl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19CT1JfQVNTSUdOX0FGVEVSX2luX2V4cHJlc3Npb24yMTA0Ngk9IHsgRk9MTE9XX0JPUl9BU1NJR05fQUZURVJfaW5fZXhwcmVzc2lvbjIxMDQ2X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIxMDUxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb24yMTA1MV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb24yMTA1MQk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIxMDUxX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0JYT1JfQVNTSUdOX2luX2V4cHJlc3Npb24yMTA2MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQlhPUl9BU1NJR05faW5fZXhwcmVzc2lvbjIxMDYwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0JYT1JfQVNTSUdOX2luX2V4cHJlc3Npb24yMTA2MAk9IHsgRk9MTE9XX0JYT1JfQVNTSUdOX2luX2V4cHJlc3Npb24yMTA2MF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb24yMTA2NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjEwNjVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjEwNjUJPSB7IEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb24yMTA2NV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19CWE9SX0FTU0lHTl9BRlRFUl9pbl9leHByZXNzaW9uMjEwNzQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0JYT1JfQVNTSUdOX0FGVEVSX2luX2V4cHJlc3Npb24yMTA3NF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19CWE9SX0FTU0lHTl9BRlRFUl9pbl9leHByZXNzaW9uMjEwNzQJPSB7IEZPTExPV19CWE9SX0FTU0lHTl9BRlRFUl9pbl9leHByZXNzaW9uMjEwNzRfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjEwNzkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIxMDc5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIxMDc5CT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjEwNzlfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTFNISUZUX0FTU0lHTl9pbl9leHByZXNzaW9uMjEwODggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xTSElGVF9BU1NJR05faW5fZXhwcmVzc2lvbjIxMDg4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xTSElGVF9BU1NJR05faW5fZXhwcmVzc2lvbjIxMDg4CT0geyBGT0xMT1dfTFNISUZUX0FTU0lHTl9pbl9leHByZXNzaW9uMjEwODhfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjEwOTMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIxMDkzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIxMDkzCT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjEwOTNfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTFNISUZUX0FTU0lHTl9BRlRFUl9pbl9leHByZXNzaW9uMjExMDIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xTSElGVF9BU1NJR05fQUZURVJfaW5fZXhwcmVzc2lvbjIxMTAyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xTSElGVF9BU1NJR05fQUZURVJfaW5fZXhwcmVzc2lvbjIxMTAyCT0geyBGT0xMT1dfTFNISUZUX0FTU0lHTl9BRlRFUl9pbl9leHByZXNzaW9uMjExMDJfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjExMDcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIxMTA3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIxMTA3CT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjExMDdfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfUlNISUZUX0FTU0lHTl9pbl9leHByZXNzaW9uMjExMTYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1JTSElGVF9BU1NJR05faW5fZXhwcmVzc2lvbjIxMTE2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1JTSElGVF9BU1NJR05faW5fZXhwcmVzc2lvbjIxMTE2CT0geyBGT0xMT1dfUlNISUZUX0FTU0lHTl9pbl9leHByZXNzaW9uMjExMTZfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjExMjEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIxMTIxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIxMTIxCT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjExMjFfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfUlNISUZUX0FTU0lHTl9BRlRFUl9pbl9leHByZXNzaW9uMjExMzAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1JTSElGVF9BU1NJR05fQUZURVJfaW5fZXhwcmVzc2lvbjIxMTMwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1JTSElGVF9BU1NJR05fQUZURVJfaW5fZXhwcmVzc2lvbjIxMTMwCT0geyBGT0xMT1dfUlNISUZUX0FTU0lHTl9BRlRFUl9pbl9leHByZXNzaW9uMjExMzBfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjExMzUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIxMTM1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIxMTM1CT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjExMzVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfT1BfUFVTSF9pbl9leHByZXNzaW9uMjExNDQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX09QX1BVU0hfaW5fZXhwcmVzc2lvbjIxMTQ0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX09QX1BVU0hfaW5fZXhwcmVzc2lvbjIxMTQ0CT0geyBGT0xMT1dfT1BfUFVTSF9pbl9leHByZXNzaW9uMjExNDRfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjExNDkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIxMTQ5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIxMTQ5CT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjExNDlfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfT1BfQVNTSUdOX1RPUF9pbl9leHByZXNzaW9uMjExNTggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX09QX0FTU0lHTl9UT1BfaW5fZXhwcmVzc2lvbjIxMTU4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX09QX0FTU0lHTl9UT1BfaW5fZXhwcmVzc2lvbjIxMTU4CT0geyBGT0xMT1dfT1BfQVNTSUdOX1RPUF9pbl9leHByZXNzaW9uMjExNThfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjExNjMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIxMTYzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIxMTYzCT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjExNjNfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfT1BfUE9QX2luX2V4cHJlc3Npb24yMTE3MiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfT1BfUE9QX2luX2V4cHJlc3Npb24yMTE3Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19PUF9QT1BfaW5fZXhwcmVzc2lvbjIxMTcyCT0geyBGT0xMT1dfT1BfUE9QX2luX2V4cHJlc3Npb24yMTE3Ml9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb24yMTE3NyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjExNzdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjExNzcJPSB7IEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb24yMTE3N19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zY2hlZHVsZUV4cHJlc3Npb25faW5fY29uZGl0aW9uYWxFeHByZXNzaW9uMjEyMDUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NjaGVkdWxlRXhwcmVzc2lvbl9pbl9jb25kaXRpb25hbEV4cHJlc3Npb24yMTIwNV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDgwMDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zY2hlZHVsZUV4cHJlc3Npb25faW5fY29uZGl0aW9uYWxFeHByZXNzaW9uMjEyMDUJPSB7IEZPTExPV19zY2hlZHVsZUV4cHJlc3Npb25faW5fY29uZGl0aW9uYWxFeHByZXNzaW9uMjEyMDVfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfUVVFU1RJT05faW5fY29uZGl0aW9uYWxFeHByZXNzaW9uMjEyMTUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1FVRVNUSU9OX2luX2NvbmRpdGlvbmFsRXhwcmVzc2lvbjIxMjE1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1FVRVNUSU9OX2luX2NvbmRpdGlvbmFsRXhwcmVzc2lvbjIxMjE1CT0geyBGT0xMT1dfUVVFU1RJT05faW5fY29uZGl0aW9uYWxFeHByZXNzaW9uMjEyMTVfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9jb25kaXRpb25hbEV4cHJlc3Npb24yMTIyMCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9jb25kaXRpb25hbEV4cHJlc3Npb24yMTIyMF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDIwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX2NvbmRpdGlvbmFsRXhwcmVzc2lvbjIxMjIwCT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9jb25kaXRpb25hbEV4cHJlc3Npb24yMTIyMF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19DT0xPTl9pbl9jb25kaXRpb25hbEV4cHJlc3Npb24yMTIyMyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQ09MT05faW5fY29uZGl0aW9uYWxFeHByZXNzaW9uMjEyMjNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQ09MT05faW5fY29uZGl0aW9uYWxFeHByZXNzaW9uMjEyMjMJPSB7IEZPTExPV19DT0xPTl9pbl9jb25kaXRpb25hbEV4cHJlc3Npb24yMTIyM19iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX2NvbmRpdGlvbmFsRXhwcmVzc2lvbjIxMjI4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX2NvbmRpdGlvbmFsRXhwcmVzc2lvbjIxMjI4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fY29uZGl0aW9uYWxFeHByZXNzaW9uMjEyMjgJPSB7IEZPTExPV19leHByZXNzaW9uX2luX2NvbmRpdGlvbmFsRXhwcmVzc2lvbjIxMjI4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2NvbmRpdGlvbmFsT3JFeHByZXNzaW9uX2luX3NjaGVkdWxlRXhwcmVzc2lvbjIxMjU2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19jb25kaXRpb25hbE9yRXhwcmVzc2lvbl9pbl9zY2hlZHVsZUV4cHJlc3Npb24yMTI1Nl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwM0ZDOUZGQzAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19jb25kaXRpb25hbE9yRXhwcmVzc2lvbl9pbl9zY2hlZHVsZUV4cHJlc3Npb24yMTI1Ngk9IHsgRk9MTE9XX2NvbmRpdGlvbmFsT3JFeHByZXNzaW9uX2luX3NjaGVkdWxlRXhwcmVzc2lvbjIxMjU2X2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX29wX3NlcXVlbmNlX2luX3NjaGVkdWxlRXhwcmVzc2lvbjIxMjcwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19vcF9zZXF1ZW5jZV9pbl9zY2hlZHVsZUV4cHJlc3Npb24yMTI3MF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19vcF9zZXF1ZW5jZV9pbl9zY2hlZHVsZUV4cHJlc3Npb24yMTI3MAk9IHsgRk9MTE9XX29wX3NlcXVlbmNlX2luX3NjaGVkdWxlRXhwcmVzc2lvbjIxMjcwX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX29wX3NjaGVkdWxpbmdfaW5fc2NoZWR1bGVFeHByZXNzaW9uMjEyNzggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX29wX3NjaGVkdWxpbmdfaW5fc2NoZWR1bGVFeHByZXNzaW9uMjEyNzhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfb3Bfc2NoZWR1bGluZ19pbl9zY2hlZHVsZUV4cHJlc3Npb24yMTI3OAk9IHsgRk9MTE9XX29wX3NjaGVkdWxpbmdfaW5fc2NoZWR1bGVFeHByZXNzaW9uMjEyNzhfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfb3BfY29uY3VycmVuY3lfaW5fc2NoZWR1bGVFeHByZXNzaW9uMjEyODYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX29wX2NvbmN1cnJlbmN5X2luX3NjaGVkdWxlRXhwcmVzc2lvbjIxMjg2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX29wX2NvbmN1cnJlbmN5X2luX3NjaGVkdWxlRXhwcmVzc2lvbjIxMjg2CT0geyBGT0xMT1dfb3BfY29uY3VycmVuY3lfaW5fc2NoZWR1bGVFeHByZXNzaW9uMjEyODZfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfY29uZGl0aW9uYWxPckV4cHJlc3Npb25faW5fc2NoZWR1bGVFeHByZXNzaW9uMjEyOTcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2NvbmRpdGlvbmFsT3JFeHByZXNzaW9uX2luX3NjaGVkdWxlRXhwcmVzc2lvbjIxMjk3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAzRkM5RkZDMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2NvbmRpdGlvbmFsT3JFeHByZXNzaW9uX2luX3NjaGVkdWxlRXhwcmVzc2lvbjIxMjk3CT0geyBGT0xMT1dfY29uZGl0aW9uYWxPckV4cHJlc3Npb25faW5fc2NoZWR1bGVFeHByZXNzaW9uMjEyOTdfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfY29uZGl0aW9uYWxBbmRFeHByZXNzaW9uX2luX2NvbmRpdGlvbmFsT3JFeHByZXNzaW9uMjEzMjMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2NvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbl9pbl9jb25kaXRpb25hbE9yRXhwcmVzc2lvbjIxMzIzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDA4KSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2NvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbl9pbl9jb25kaXRpb25hbE9yRXhwcmVzc2lvbjIxMzIzCT0geyBGT0xMT1dfY29uZGl0aW9uYWxBbmRFeHByZXNzaW9uX2luX2NvbmRpdGlvbmFsT3JFeHByZXNzaW9uMjEzMjNfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTE9SX2luX2NvbmRpdGlvbmFsT3JFeHByZXNzaW9uMjEzMzMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xPUl9pbl9jb25kaXRpb25hbE9yRXhwcmVzc2lvbjIxMzMzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xPUl9pbl9jb25kaXRpb25hbE9yRXhwcmVzc2lvbjIxMzMzCT0geyBGT0xMT1dfTE9SX2luX2NvbmRpdGlvbmFsT3JFeHByZXNzaW9uMjEzMzNfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfY29uZGl0aW9uYWxBbmRFeHByZXNzaW9uX2luX2NvbmRpdGlvbmFsT3JFeHByZXNzaW9uMjEzMzcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2NvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbl9pbl9jb25kaXRpb25hbE9yRXhwcmVzc2lvbjIxMzM3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDA4KSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2NvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbl9pbl9jb25kaXRpb25hbE9yRXhwcmVzc2lvbjIxMzM3CT0geyBGT0xMT1dfY29uZGl0aW9uYWxBbmRFeHByZXNzaW9uX2luX2NvbmRpdGlvbmFsT3JFeHByZXNzaW9uMjEzMzdfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfYml0d2lzZU9yRXhwcmVzc2lvbl9pbl9jb25kaXRpb25hbEFuZEV4cHJlc3Npb24yMTM2NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfYml0d2lzZU9yRXhwcmVzc2lvbl9pbl9jb25kaXRpb25hbEFuZEV4cHJlc3Npb24yMTM2NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDEwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19iaXR3aXNlT3JFeHByZXNzaW9uX2luX2NvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbjIxMzY1CT0geyBGT0xMT1dfYml0d2lzZU9yRXhwcmVzc2lvbl9pbl9jb25kaXRpb25hbEFuZEV4cHJlc3Npb24yMTM2NV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MQU5EX2luX2NvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbjIxMzc1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MQU5EX2luX2NvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbjIxMzc1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xBTkRfaW5fY29uZGl0aW9uYWxBbmRFeHByZXNzaW9uMjEzNzUJPSB7IEZPTExPV19MQU5EX2luX2NvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbjIxMzc1X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2JpdHdpc2VPckV4cHJlc3Npb25faW5fY29uZGl0aW9uYWxBbmRFeHByZXNzaW9uMjEzNzkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2JpdHdpc2VPckV4cHJlc3Npb25faW5fY29uZGl0aW9uYWxBbmRFeHByZXNzaW9uMjEzNzlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfYml0d2lzZU9yRXhwcmVzc2lvbl9pbl9jb25kaXRpb25hbEFuZEV4cHJlc3Npb24yMTM3OQk9IHsgRk9MTE9XX2JpdHdpc2VPckV4cHJlc3Npb25faW5fY29uZGl0aW9uYWxBbmRFeHByZXNzaW9uMjEzNzlfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfYml0d2lzZVhvckV4cHJlc3Npb25faW5fYml0d2lzZU9yRXhwcmVzc2lvbjIxNDA3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19iaXR3aXNlWG9yRXhwcmVzc2lvbl9pbl9iaXR3aXNlT3JFeHByZXNzaW9uMjE0MDdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDQwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfYml0d2lzZVhvckV4cHJlc3Npb25faW5fYml0d2lzZU9yRXhwcmVzc2lvbjIxNDA3CT0geyBGT0xMT1dfYml0d2lzZVhvckV4cHJlc3Npb25faW5fYml0d2lzZU9yRXhwcmVzc2lvbjIxNDA3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0JPUl9pbl9iaXR3aXNlT3JFeHByZXNzaW9uMjE0MTcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0JPUl9pbl9iaXR3aXNlT3JFeHByZXNzaW9uMjE0MTdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQk9SX2luX2JpdHdpc2VPckV4cHJlc3Npb24yMTQxNwk9IHsgRk9MTE9XX0JPUl9pbl9iaXR3aXNlT3JFeHByZXNzaW9uMjE0MTdfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfYml0d2lzZVhvckV4cHJlc3Npb25faW5fYml0d2lzZU9yRXhwcmVzc2lvbjIxNDIxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19iaXR3aXNlWG9yRXhwcmVzc2lvbl9pbl9iaXR3aXNlT3JFeHByZXNzaW9uMjE0MjFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDQwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfYml0d2lzZVhvckV4cHJlc3Npb25faW5fYml0d2lzZU9yRXhwcmVzc2lvbjIxNDIxCT0geyBGT0xMT1dfYml0d2lzZVhvckV4cHJlc3Npb25faW5fYml0d2lzZU9yRXhwcmVzc2lvbjIxNDIxX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2JpdHdpc2VBbmRFeHByZXNzaW9uX2luX2JpdHdpc2VYb3JFeHByZXNzaW9uMjE0NDkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2JpdHdpc2VBbmRFeHByZXNzaW9uX2luX2JpdHdpc2VYb3JFeHByZXNzaW9uMjE0NDlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMjAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfYml0d2lzZUFuZEV4cHJlc3Npb25faW5fYml0d2lzZVhvckV4cHJlc3Npb24yMTQ0OQk9IHsgRk9MTE9XX2JpdHdpc2VBbmRFeHByZXNzaW9uX2luX2JpdHdpc2VYb3JFeHByZXNzaW9uMjE0NDlfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfQlhPUl9pbl9iaXR3aXNlWG9yRXhwcmVzc2lvbjIxNDU5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19CWE9SX2luX2JpdHdpc2VYb3JFeHByZXNzaW9uMjE0NTlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQlhPUl9pbl9iaXR3aXNlWG9yRXhwcmVzc2lvbjIxNDU5CT0geyBGT0xMT1dfQlhPUl9pbl9iaXR3aXNlWG9yRXhwcmVzc2lvbjIxNDU5X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2JpdHdpc2VBbmRFeHByZXNzaW9uX2luX2JpdHdpc2VYb3JFeHByZXNzaW9uMjE0NjMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2JpdHdpc2VBbmRFeHByZXNzaW9uX2luX2JpdHdpc2VYb3JFeHByZXNzaW9uMjE0NjNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMjAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfYml0d2lzZUFuZEV4cHJlc3Npb25faW5fYml0d2lzZVhvckV4cHJlc3Npb24yMTQ2Mwk9IHsgRk9MTE9XX2JpdHdpc2VBbmRFeHByZXNzaW9uX2luX2JpdHdpc2VYb3JFeHByZXNzaW9uMjE0NjNfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXF1YWxpdHlFeHByZXNzaW9uX2luX2JpdHdpc2VBbmRFeHByZXNzaW9uMjE0OTEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2VxdWFsaXR5RXhwcmVzc2lvbl9pbl9iaXR3aXNlQW5kRXhwcmVzc2lvbjIxNDkxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMjAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2VxdWFsaXR5RXhwcmVzc2lvbl9pbl9iaXR3aXNlQW5kRXhwcmVzc2lvbjIxNDkxCT0geyBGT0xMT1dfZXF1YWxpdHlFeHByZXNzaW9uX2luX2JpdHdpc2VBbmRFeHByZXNzaW9uMjE0OTFfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfQkFORF9pbl9iaXR3aXNlQW5kRXhwcmVzc2lvbjIxNTAxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19CQU5EX2luX2JpdHdpc2VBbmRFeHByZXNzaW9uMjE1MDFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQkFORF9pbl9iaXR3aXNlQW5kRXhwcmVzc2lvbjIxNTAxCT0geyBGT0xMT1dfQkFORF9pbl9iaXR3aXNlQW5kRXhwcmVzc2lvbjIxNTAxX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2VxdWFsaXR5RXhwcmVzc2lvbl9pbl9iaXR3aXNlQW5kRXhwcmVzc2lvbjIxNTA1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19lcXVhbGl0eUV4cHJlc3Npb25faW5fYml0d2lzZUFuZEV4cHJlc3Npb24yMTUwNV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDIwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19lcXVhbGl0eUV4cHJlc3Npb25faW5fYml0d2lzZUFuZEV4cHJlc3Npb24yMTUwNQk9IHsgRk9MTE9XX2VxdWFsaXR5RXhwcmVzc2lvbl9pbl9iaXR3aXNlQW5kRXhwcmVzc2lvbjIxNTA1X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3JlbGF0aW9uYWxFeHByZXNzaW9uX2luX2VxdWFsaXR5RXhwcmVzc2lvbjIxNTM3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19yZWxhdGlvbmFsRXhwcmVzc2lvbl9pbl9lcXVhbGl0eUV4cHJlc3Npb24yMTUzN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwODAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDYwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDEwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19yZWxhdGlvbmFsRXhwcmVzc2lvbl9pbl9lcXVhbGl0eUV4cHJlc3Npb24yMTUzNwk9IHsgRk9MTE9XX3JlbGF0aW9uYWxFeHByZXNzaW9uX2luX2VxdWFsaXR5RXhwcmVzc2lvbjIxNTM3X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2VxdWFsT3BfaW5fZXF1YWxpdHlFeHByZXNzaW9uMjE1NDkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2VxdWFsT3BfaW5fZXF1YWxpdHlFeHByZXNzaW9uMjE1NDlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXF1YWxPcF9pbl9lcXVhbGl0eUV4cHJlc3Npb24yMTU0OQk9IHsgRk9MTE9XX2VxdWFsT3BfaW5fZXF1YWxpdHlFeHByZXNzaW9uMjE1NDlfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfcmVsYXRpb25hbEV4cHJlc3Npb25faW5fZXF1YWxpdHlFeHByZXNzaW9uMjE1NTMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3JlbGF0aW9uYWxFeHByZXNzaW9uX2luX2VxdWFsaXR5RXhwcmVzc2lvbjIxNTUzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDA4MDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwNjAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMTAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3JlbGF0aW9uYWxFeHByZXNzaW9uX2luX2VxdWFsaXR5RXhwcmVzc2lvbjIxNTUzCT0geyBGT0xMT1dfcmVsYXRpb25hbEV4cHJlc3Npb25faW5fZXF1YWxpdHlFeHByZXNzaW9uMjE1NTNfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXF1YWxPcF9pbl9lcXVhbGl0eUV4cHJlc3Npb24yMTU2OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXF1YWxPcF9pbl9lcXVhbGl0eUV4cHJlc3Npb24yMTU2OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19lcXVhbE9wX2luX2VxdWFsaXR5RXhwcmVzc2lvbjIxNTY5CT0geyBGT0xMT1dfZXF1YWxPcF9pbl9lcXVhbGl0eUV4cHJlc3Npb24yMTU2OV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19yZWxhdGlvbmFsRXhwcmVzc2lvbl9pbl9lcXVhbGl0eUV4cHJlc3Npb24yMTU3MyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfcmVsYXRpb25hbEV4cHJlc3Npb25faW5fZXF1YWxpdHlFeHByZXNzaW9uMjE1NzNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDgwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA2MDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAxMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfcmVsYXRpb25hbEV4cHJlc3Npb25faW5fZXF1YWxpdHlFeHByZXNzaW9uMjE1NzMJPSB7IEZPTExPV19yZWxhdGlvbmFsRXhwcmVzc2lvbl9pbl9lcXVhbGl0eUV4cHJlc3Npb24yMTU3M19iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19FUVVBTF9pbl9lcXVhbE9wMjE2MTQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0VRVUFMX2luX2VxdWFsT3AyMTYxNF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19FUVVBTF9pbl9lcXVhbE9wMjE2MTQJPSB7IEZPTExPV19FUVVBTF9pbl9lcXVhbE9wMjE2MTRfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTkVRVUFMX2luX2VxdWFsT3AyMTYyMyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTkVRVUFMX2luX2VxdWFsT3AyMTYyM19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19ORVFVQUxfaW5fZXF1YWxPcDIxNjIzCT0geyBGT0xMT1dfTkVRVUFMX2luX2VxdWFsT3AyMTYyM19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TRVFVQUxfaW5fZXF1YWxPcDIxNjMxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19TRVFVQUxfaW5fZXF1YWxPcDIxNjMxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1NFUVVBTF9pbl9lcXVhbE9wMjE2MzEJPSB7IEZPTExPV19TRVFVQUxfaW5fZXF1YWxPcDIxNjMxX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX05TRVFVQUxfaW5fZXF1YWxPcDIxNjM5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19OU0VRVUFMX2luX2VxdWFsT3AyMTYzOV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19OU0VRVUFMX2luX2VxdWFsT3AyMTYzOQk9IHsgRk9MTE9XX05TRVFVQUxfaW5fZXF1YWxPcDIxNjM5X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3NoaWZ0RXhwcmVzc2lvbl9pbl9yZWxhdGlvbmFsRXhwcmVzc2lvbjIxNjYzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zaGlmdEV4cHJlc3Npb25faW5fcmVsYXRpb25hbEV4cHJlc3Npb24yMTY2M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDYwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMzAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwODAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zaGlmdEV4cHJlc3Npb25faW5fcmVsYXRpb25hbEV4cHJlc3Npb24yMTY2Mwk9IHsgRk9MTE9XX3NoaWZ0RXhwcmVzc2lvbl9pbl9yZWxhdGlvbmFsRXhwcmVzc2lvbjIxNjYzX2JpdHMsIDUJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3JlbGF0aW9uYWxPcF9pbl9yZWxhdGlvbmFsRXhwcmVzc2lvbjIxNjc1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19yZWxhdGlvbmFsT3BfaW5fcmVsYXRpb25hbEV4cHJlc3Npb24yMTY3NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19yZWxhdGlvbmFsT3BfaW5fcmVsYXRpb25hbEV4cHJlc3Npb24yMTY3NQk9IHsgRk9MTE9XX3JlbGF0aW9uYWxPcF9pbl9yZWxhdGlvbmFsRXhwcmVzc2lvbjIxNjc1X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3NoaWZ0RXhwcmVzc2lvbl9pbl9yZWxhdGlvbmFsRXhwcmVzc2lvbjIxNjc5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zaGlmdEV4cHJlc3Npb25faW5fcmVsYXRpb25hbEV4cHJlc3Npb24yMTY3OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDYwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMzAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwODAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zaGlmdEV4cHJlc3Npb25faW5fcmVsYXRpb25hbEV4cHJlc3Npb24yMTY3OQk9IHsgRk9MTE9XX3NoaWZ0RXhwcmVzc2lvbl9pbl9yZWxhdGlvbmFsRXhwcmVzc2lvbjIxNjc5X2JpdHMsIDUJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3JlbGF0aW9uYWxPcF9pbl9yZWxhdGlvbmFsRXhwcmVzc2lvbjIxNjk1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19yZWxhdGlvbmFsT3BfaW5fcmVsYXRpb25hbEV4cHJlc3Npb24yMTY5NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19yZWxhdGlvbmFsT3BfaW5fcmVsYXRpb25hbEV4cHJlc3Npb24yMTY5NQk9IHsgRk9MTE9XX3JlbGF0aW9uYWxPcF9pbl9yZWxhdGlvbmFsRXhwcmVzc2lvbjIxNjk1X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3NoaWZ0RXhwcmVzc2lvbl9pbl9yZWxhdGlvbmFsRXhwcmVzc2lvbjIxNjk5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zaGlmdEV4cHJlc3Npb25faW5fcmVsYXRpb25hbEV4cHJlc3Npb24yMTY5OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDYwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMzAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwODAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zaGlmdEV4cHJlc3Npb25faW5fcmVsYXRpb25hbEV4cHJlc3Npb24yMTY5OQk9IHsgRk9MTE9XX3NoaWZ0RXhwcmVzc2lvbl9pbl9yZWxhdGlvbmFsRXhwcmVzc2lvbjIxNjk5X2JpdHMsIDUJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xURV9pbl9yZWxhdGlvbmFsT3AyMTc0MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTFRFX2luX3JlbGF0aW9uYWxPcDIxNzQwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xURV9pbl9yZWxhdGlvbmFsT3AyMTc0MAk9IHsgRk9MTE9XX0xURV9pbl9yZWxhdGlvbmFsT3AyMTc0MF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19HVEVfaW5fcmVsYXRpb25hbE9wMjE3NDggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0dURV9pbl9yZWxhdGlvbmFsT3AyMTc0OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19HVEVfaW5fcmVsYXRpb25hbE9wMjE3NDgJPSB7IEZPTExPV19HVEVfaW5fcmVsYXRpb25hbE9wMjE3NDhfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTFRfX2luX3JlbGF0aW9uYWxPcDIxNzU2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MVF9faW5fcmVsYXRpb25hbE9wMjE3NTZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTFRfX2luX3JlbGF0aW9uYWxPcDIxNzU2CT0geyBGT0xMT1dfTFRfX2luX3JlbGF0aW9uYWxPcDIxNzU2X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0dUX2luX3JlbGF0aW9uYWxPcDIxNzY0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19HVF9pbl9yZWxhdGlvbmFsT3AyMTc2NF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19HVF9pbl9yZWxhdGlvbmFsT3AyMTc2NAk9IHsgRk9MTE9XX0dUX2luX3JlbGF0aW9uYWxPcDIxNzY0X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzI5NV9pbl9yZWxhdGlvbmFsT3AyMTc3NCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjk1X2luX3JlbGF0aW9uYWxPcDIxNzc0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzI5NV9pbl9yZWxhdGlvbmFsT3AyMTc3NAk9IHsgRk9MTE9XXzI5NV9pbl9yZWxhdGlvbmFsT3AyMTc3NF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19hZGRpdGl2ZUV4cHJlc3Npb25faW5fc2hpZnRFeHByZXNzaW9uMjE4MDYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2FkZGl0aXZlRXhwcmVzc2lvbl9pbl9zaGlmdEV4cHJlc3Npb24yMTgwNl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDIwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwOCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19hZGRpdGl2ZUV4cHJlc3Npb25faW5fc2hpZnRFeHByZXNzaW9uMjE4MDYJPSB7IEZPTExPV19hZGRpdGl2ZUV4cHJlc3Npb25faW5fc2hpZnRFeHByZXNzaW9uMjE4MDZfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2hpZnRPcF9pbl9zaGlmdEV4cHJlc3Npb24yMTgxOCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2hpZnRPcF9pbl9zaGlmdEV4cHJlc3Npb24yMTgxOF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zaGlmdE9wX2luX3NoaWZ0RXhwcmVzc2lvbjIxODE4CT0geyBGT0xMT1dfc2hpZnRPcF9pbl9zaGlmdEV4cHJlc3Npb24yMTgxOF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19hZGRpdGl2ZUV4cHJlc3Npb25faW5fc2hpZnRFeHByZXNzaW9uMjE4MjIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2FkZGl0aXZlRXhwcmVzc2lvbl9pbl9zaGlmdEV4cHJlc3Npb24yMTgyMl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDIwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwOCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19hZGRpdGl2ZUV4cHJlc3Npb25faW5fc2hpZnRFeHByZXNzaW9uMjE4MjIJPSB7IEZPTExPV19hZGRpdGl2ZUV4cHJlc3Npb25faW5fc2hpZnRFeHByZXNzaW9uMjE4MjJfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTFNISUZUX2luX3NoaWZ0T3AyMTg0OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTFNISUZUX2luX3NoaWZ0T3AyMTg0OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MU0hJRlRfaW5fc2hpZnRPcDIxODQ5CT0geyBGT0xMT1dfTFNISUZUX2luX3NoaWZ0T3AyMTg0OV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19SU0hJRlRfaW5fc2hpZnRPcDIxODU3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19SU0hJRlRfaW5fc2hpZnRPcDIxODU3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1JTSElGVF9pbl9zaGlmdE9wMjE4NTcJPSB7IEZPTExPV19SU0hJRlRfaW5fc2hpZnRPcDIxODU3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX211bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9pbl9hZGRpdGl2ZUV4cHJlc3Npb24yMTg4MiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX2luX2FkZGl0aXZlRXhwcmVzc2lvbjIxODgyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTAwMDAwMDAwMDA4MDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX211bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9pbl9hZGRpdGl2ZUV4cHJlc3Npb24yMTg4Mgk9IHsgRk9MTE9XX211bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9pbl9hZGRpdGl2ZUV4cHJlc3Npb24yMTg4Ml9iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19QTFVTX2luX2FkZGl0aXZlRXhwcmVzc2lvbjIxODk0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19QTFVTX2luX2FkZGl0aXZlRXhwcmVzc2lvbjIxODk0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1BMVVNfaW5fYWRkaXRpdmVFeHByZXNzaW9uMjE4OTQJPSB7IEZPTExPV19QTFVTX2luX2FkZGl0aXZlRXhwcmVzc2lvbjIxODk0X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX01JTlVTX2luX2FkZGl0aXZlRXhwcmVzc2lvbjIxOTA2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19NSU5VU19pbl9hZGRpdGl2ZUV4cHJlc3Npb24yMTkwNl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19NSU5VU19pbl9hZGRpdGl2ZUV4cHJlc3Npb24yMTkwNgk9IHsgRk9MTE9XX01JTlVTX2luX2FkZGl0aXZlRXhwcmVzc2lvbjIxOTA2X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX211bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9pbl9hZGRpdGl2ZUV4cHJlc3Npb24yMTkyNCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX2luX2FkZGl0aXZlRXhwcmVzc2lvbjIxOTI0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTAwMDAwMDAwMDA4MDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX211bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9pbl9hZGRpdGl2ZUV4cHJlc3Npb24yMTkyNAk9IHsgRk9MTE9XX211bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9pbl9hZGRpdGl2ZUV4cHJlc3Npb24yMTkyNF9iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uMjE5NTggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3VuYXJ5RXhwcmVzc2lvbl9pbl9tdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24yMTk1OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAxMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDA0MDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDIwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uMjE5NTgJPSB7IEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uMjE5NThfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfU1RBUl9pbl9tdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24yMTk3MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU1RBUl9pbl9tdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24yMTk3MF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19TVEFSX2luX211bHRpcGxpY2F0aXZlRXhwcmVzc2lvbjIxOTcwCT0geyBGT0xMT1dfU1RBUl9pbl9tdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24yMTk3MF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19ESVZfaW5fbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uMjE5ODEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0RJVl9pbl9tdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24yMTk4MV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19ESVZfaW5fbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uMjE5ODEJPSB7IEZPTExPV19ESVZfaW5fbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uMjE5ODFfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTU9EX2luX211bHRpcGxpY2F0aXZlRXhwcmVzc2lvbjIxOTkzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19NT0RfaW5fbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uMjE5OTNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTU9EX2luX211bHRpcGxpY2F0aXZlRXhwcmVzc2lvbjIxOTkzCT0geyBGT0xMT1dfTU9EX2luX211bHRpcGxpY2F0aXZlRXhwcmVzc2lvbjIxOTkzX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3VuYXJ5RXhwcmVzc2lvbl9pbl9tdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24yMjAxMiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfdW5hcnlFeHByZXNzaW9uX2luX211bHRpcGxpY2F0aXZlRXhwcmVzc2lvbjIyMDEyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDEwMDAwMDAyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDQwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMjAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3VuYXJ5RXhwcmVzc2lvbl9pbl9tdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24yMjAxMgk9IHsgRk9MTE9XX3VuYXJ5RXhwcmVzc2lvbl9pbl9tdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24yMjAxMl9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19QTFVTX2luX3VuYXJ5RXhwcmVzc2lvbjIyMDQyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19QTFVTX2luX3VuYXJ5RXhwcmVzc2lvbjIyMDQyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1BMVVNfaW5fdW5hcnlFeHByZXNzaW9uMjIwNDIJPSB7IEZPTExPV19QTFVTX2luX3VuYXJ5RXhwcmVzc2lvbjIyMDQyX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3VuYXJ5RXhwcmVzc2lvbl9pbl91bmFyeUV4cHJlc3Npb24yMjA0NyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfdW5hcnlFeHByZXNzaW9uX2luX3VuYXJ5RXhwcmVzc2lvbjIyMDQ3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3VuYXJ5RXhwcmVzc2lvbl9pbl91bmFyeUV4cHJlc3Npb24yMjA0Nwk9IHsgRk9MTE9XX3VuYXJ5RXhwcmVzc2lvbl9pbl91bmFyeUV4cHJlc3Npb24yMjA0N19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19NSU5VU19pbl91bmFyeUV4cHJlc3Npb24yMjA1NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTUlOVVNfaW5fdW5hcnlFeHByZXNzaW9uMjIwNTZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTUlOVVNfaW5fdW5hcnlFeHByZXNzaW9uMjIwNTYJPSB7IEZPTExPV19NSU5VU19pbl91bmFyeUV4cHJlc3Npb24yMjA1Nl9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fdW5hcnlFeHByZXNzaW9uMjIwNjAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3VuYXJ5RXhwcmVzc2lvbl9pbl91bmFyeUV4cHJlc3Npb24yMjA2MF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fdW5hcnlFeHByZXNzaW9uMjIwNjAJPSB7IEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fdW5hcnlFeHByZXNzaW9uMjIwNjBfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfSU5DUl9pbl91bmFyeUV4cHJlc3Npb24yMjA2OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfSU5DUl9pbl91bmFyeUV4cHJlc3Npb24yMjA2OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JTkNSX2luX3VuYXJ5RXhwcmVzc2lvbjIyMDY5CT0geyBGT0xMT1dfSU5DUl9pbl91bmFyeUV4cHJlc3Npb24yMjA2OV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fdW5hcnlFeHByZXNzaW9uMjIwNzQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3VuYXJ5RXhwcmVzc2lvbl9pbl91bmFyeUV4cHJlc3Npb24yMjA3NF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fdW5hcnlFeHByZXNzaW9uMjIwNzQJPSB7IEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fdW5hcnlFeHByZXNzaW9uMjIwNzRfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfREVDUl9pbl91bmFyeUV4cHJlc3Npb24yMjA4MiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfREVDUl9pbl91bmFyeUV4cHJlc3Npb24yMjA4Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19ERUNSX2luX3VuYXJ5RXhwcmVzc2lvbjIyMDgyCT0geyBGT0xMT1dfREVDUl9pbl91bmFyeUV4cHJlc3Npb24yMjA4Ml9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fdW5hcnlFeHByZXNzaW9uMjIwODcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3VuYXJ5RXhwcmVzc2lvbl9pbl91bmFyeUV4cHJlc3Npb24yMjA4N19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fdW5hcnlFeHByZXNzaW9uMjIwODcJPSB7IEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fdW5hcnlFeHByZXNzaW9uMjIwODdfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTE5PVF9pbl91bmFyeUV4cHJlc3Npb24yMjA5NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTE5PVF9pbl91bmFyeUV4cHJlc3Npb24yMjA5Nl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MTk9UX2luX3VuYXJ5RXhwcmVzc2lvbjIyMDk2CT0geyBGT0xMT1dfTE5PVF9pbl91bmFyeUV4cHJlc3Npb24yMjA5Nl9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fdW5hcnlFeHByZXNzaW9uMjIxMDAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3VuYXJ5RXhwcmVzc2lvbl9pbl91bmFyeUV4cHJlc3Npb24yMjEwMF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fdW5hcnlFeHByZXNzaW9uMjIxMDAJPSB7IEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fdW5hcnlFeHByZXNzaW9uMjIxMDBfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfQk5PVF9pbl91bmFyeUV4cHJlc3Npb24yMjEwOSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQk5PVF9pbl91bmFyeUV4cHJlc3Npb24yMjEwOV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19CTk9UX2luX3VuYXJ5RXhwcmVzc2lvbjIyMTA5CT0geyBGT0xMT1dfQk5PVF9pbl91bmFyeUV4cHJlc3Npb24yMjEwOV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fdW5hcnlFeHByZXNzaW9uMjIxMTMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3VuYXJ5RXhwcmVzc2lvbl9pbl91bmFyeUV4cHJlc3Npb24yMjExM19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fdW5hcnlFeHByZXNzaW9uMjIxMTMJPSB7IEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fdW5hcnlFeHByZXNzaW9uMjIxMTNfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfT1BfUE9QX2luX3VuYXJ5RXhwcmVzc2lvbjIyMTIyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19PUF9QT1BfaW5fdW5hcnlFeHByZXNzaW9uMjIxMjJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfT1BfUE9QX2luX3VuYXJ5RXhwcmVzc2lvbjIyMTIyCT0geyBGT0xMT1dfT1BfUE9QX2luX3VuYXJ5RXhwcmVzc2lvbjIyMTIyX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3VuYXJ5RXhwcmVzc2lvbl9pbl91bmFyeUV4cHJlc3Npb24yMjEyOCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfdW5hcnlFeHByZXNzaW9uX2luX3VuYXJ5RXhwcmVzc2lvbjIyMTI4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3VuYXJ5RXhwcmVzc2lvbl9pbl91bmFyeUV4cHJlc3Npb24yMjEyOAk9IHsgRk9MTE9XX3VuYXJ5RXhwcmVzc2lvbl9pbl91bmFyeUV4cHJlc3Npb24yMjEyOF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19PUF9UT1BfaW5fdW5hcnlFeHByZXNzaW9uMjIxMzcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX09QX1RPUF9pbl91bmFyeUV4cHJlc3Npb24yMjEzN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19PUF9UT1BfaW5fdW5hcnlFeHByZXNzaW9uMjIxMzcJPSB7IEZPTExPV19PUF9UT1BfaW5fdW5hcnlFeHByZXNzaW9uMjIxMzdfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfdW5hcnlFeHByZXNzaW9uX2luX3VuYXJ5RXhwcmVzc2lvbjIyMTQzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fdW5hcnlFeHByZXNzaW9uMjIxNDNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfdW5hcnlFeHByZXNzaW9uX2luX3VuYXJ5RXhwcmVzc2lvbjIyMTQzCT0geyBGT0xMT1dfdW5hcnlFeHByZXNzaW9uX2luX3VuYXJ5RXhwcmVzc2lvbjIyMTQzX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3ByZWZpeF9leHByZXNzaW9uX2luX3VuYXJ5RXhwcmVzc2lvbjIyMTU4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19wcmVmaXhfZXhwcmVzc2lvbl9pbl91bmFyeUV4cHJlc3Npb24yMjE1OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19wcmVmaXhfZXhwcmVzc2lvbl9pbl91bmFyeUV4cHJlc3Npb24yMjE1OAk9IHsgRk9MTE9XX3ByZWZpeF9leHByZXNzaW9uX2luX3VuYXJ5RXhwcmVzc2lvbjIyMTU4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW52b2tlX2luX3VuYXJ5RXhwcmVzc2lvbjIyMTc4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2ludm9rZV9pbl91bmFyeUV4cHJlc3Npb24yMjE3OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2ludm9rZV9pbl91bmFyeUV4cHJlc3Npb24yMjE3OAk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW52b2tlX2luX3VuYXJ5RXhwcmVzc2lvbjIyMTc4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25fYWN0aXZpdHlfbmV3X2luX3VuYXJ5RXhwcmVzc2lvbjIyMTk4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2FjdGl2aXR5X25ld19pbl91bmFyeUV4cHJlc3Npb24yMjE5OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2FjdGl2aXR5X25ld19pbl91bmFyeUV4cHJlc3Npb24yMjE5OAk9IHsgRk9MTE9XX2V4cHJlc3Npb25fYWN0aXZpdHlfbmV3X2luX3VuYXJ5RXhwcmVzc2lvbjIyMTk4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25fY29tX2luX3VuYXJ5RXhwcmVzc2lvbjIyMjEzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2NvbV9pbl91bmFyeUV4cHJlc3Npb24yMjIxM19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2NvbV9pbl91bmFyeUV4cHJlc3Npb24yMjIxMwk9IHsgRk9MTE9XX2V4cHJlc3Npb25fY29tX2luX3VuYXJ5RXhwcmVzc2lvbjIyMjEzX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25fZ3VhcmRfaW5fdW5hcnlFeHByZXNzaW9uMjIyMzUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25fZ3VhcmRfaW5fdW5hcnlFeHByZXNzaW9uMjIyMzVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9ndWFyZF9pbl91bmFyeUV4cHJlc3Npb24yMjIzNQk9IHsgRk9MTE9XX2V4cHJlc3Npb25fZ3VhcmRfaW5fdW5hcnlFeHByZXNzaW9uMjIyMzVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pdGVfaW5fdW5hcnlFeHByZXNzaW9uMjIyNTUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faXRlX2luX3VuYXJ5RXhwcmVzc2lvbjIyMjU1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faXRlX2luX3VuYXJ5RXhwcmVzc2lvbjIyMjU1CT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pdGVfaW5fdW5hcnlFeHByZXNzaW9uMjIyNTVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9sYW1iZGFfaW5fdW5hcnlFeHByZXNzaW9uMjIyNzcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25fbGFtYmRhX2luX3VuYXJ5RXhwcmVzc2lvbjIyMjc3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25fbGFtYmRhX2luX3VuYXJ5RXhwcmVzc2lvbjIyMjc3CT0geyBGT0xMT1dfZXhwcmVzc2lvbl9sYW1iZGFfaW5fdW5hcnlFeHByZXNzaW9uMjIyNzdfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfY3RvckV4cHJlc3Npb25faW5fdW5hcnlFeHByZXNzaW9uMjIzMDEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2N0b3JFeHByZXNzaW9uX2luX3VuYXJ5RXhwcmVzc2lvbjIyMzAxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2N0b3JFeHByZXNzaW9uX2luX3VuYXJ5RXhwcmVzc2lvbjIyMzAxCT0geyBGT0xMT1dfY3RvckV4cHJlc3Npb25faW5fdW5hcnlFeHByZXNzaW9uMjIzMDFfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfcHJpbWFyeV9pbl91bmFyeUV4cHJlc3Npb24yMjMyNCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfcHJpbWFyeV9pbl91bmFyeUV4cHJlc3Npb24yMjMyNF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwODAwMDAwNDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19wcmltYXJ5X2luX3VuYXJ5RXhwcmVzc2lvbjIyMzI0CT0geyBGT0xMT1dfcHJpbWFyeV9pbl91bmFyeUV4cHJlc3Npb24yMjMyNF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19JTkNSX2luX3VuYXJ5RXhwcmVzc2lvbjIyMzUzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19JTkNSX2luX3VuYXJ5RXhwcmVzc2lvbjIyMzUzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0lOQ1JfaW5fdW5hcnlFeHByZXNzaW9uMjIzNTMJPSB7IEZPTExPV19JTkNSX2luX3VuYXJ5RXhwcmVzc2lvbjIyMzUzX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0RFQ1JfaW5fdW5hcnlFeHByZXNzaW9uMjIzNjQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0RFQ1JfaW5fdW5hcnlFeHByZXNzaW9uMjIzNjRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfREVDUl9pbl91bmFyeUV4cHJlc3Npb24yMjM2NAk9IHsgRk9MTE9XX0RFQ1JfaW5fdW5hcnlFeHByZXNzaW9uMjIzNjRfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfbGl0ZXJhbF9pbl91bmFyeUV4cHJlc3Npb24yMjM4MiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfbGl0ZXJhbF9pbl91bmFyeUV4cHJlc3Npb24yMjM4Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19saXRlcmFsX2luX3VuYXJ5RXhwcmVzc2lvbjIyMzgyCT0geyBGT0xMT1dfbGl0ZXJhbF9pbl91bmFyeUV4cHJlc3Npb24yMjM4Ml9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19xdW90ZV9leHByZXNzaW9uX2luX3VuYXJ5RXhwcmVzc2lvbjIyNDEyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19xdW90ZV9leHByZXNzaW9uX2luX3VuYXJ5RXhwcmVzc2lvbjIyNDEyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3F1b3RlX2V4cHJlc3Npb25faW5fdW5hcnlFeHByZXNzaW9uMjI0MTIJPSB7IEZPTExPV19xdW90ZV9leHByZXNzaW9uX2luX3VuYXJ5RXhwcmVzc2lvbjIyNDEyX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX21ldGFfZXZhbF9leHByZXNzaW9uX2luX3VuYXJ5RXhwcmVzc2lvbjIyNDMzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19tZXRhX2V2YWxfZXhwcmVzc2lvbl9pbl91bmFyeUV4cHJlc3Npb24yMjQzM19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19tZXRhX2V2YWxfZXhwcmVzc2lvbl9pbl91bmFyeUV4cHJlc3Npb24yMjQzMwk9IHsgRk9MTE9XX21ldGFfZXZhbF9leHByZXNzaW9uX2luX3VuYXJ5RXhwcmVzc2lvbjIyNDMzX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xQQVJFTl9pbl91bmFyeUV4cHJlc3Npb24yMjQ0OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTFBBUkVOX2luX3VuYXJ5RXhwcmVzc2lvbjIyNDQ4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xQQVJFTl9pbl91bmFyeUV4cHJlc3Npb24yMjQ0OAk9IHsgRk9MTE9XX0xQQVJFTl9pbl91bmFyeUV4cHJlc3Npb24yMjQ0OF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX3VuYXJ5RXhwcmVzc2lvbjIyNDUzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX3VuYXJ5RXhwcmVzc2lvbjIyNDUzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fdW5hcnlFeHByZXNzaW9uMjI0NTMJPSB7IEZPTExPV19leHByZXNzaW9uX2luX3VuYXJ5RXhwcmVzc2lvbjIyNDUzX2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1JQQVJFTl9pbl91bmFyeUV4cHJlc3Npb24yMjQ1NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfUlBBUkVOX2luX3VuYXJ5RXhwcmVzc2lvbjIyNDU2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1JQQVJFTl9pbl91bmFyeUV4cHJlc3Npb24yMjQ1Ngk9IHsgRk9MTE9XX1JQQVJFTl9pbl91bmFyeUV4cHJlc3Npb24yMjQ1Nl9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19jb2xsZWN0aW9uX29mX2V4cHJlc3Npb25faW5fdW5hcnlFeHByZXNzaW9uMjI0NjcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2NvbGxlY3Rpb25fb2ZfZXhwcmVzc2lvbl9pbl91bmFyeUV4cHJlc3Npb24yMjQ2N19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19jb2xsZWN0aW9uX29mX2V4cHJlc3Npb25faW5fdW5hcnlFeHByZXNzaW9uMjI0NjcJPSB7IEZPTExPV19jb2xsZWN0aW9uX29mX2V4cHJlc3Npb25faW5fdW5hcnlFeHByZXNzaW9uMjI0NjdfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjY1X2luX2N0b3JFeHByZXNzaW9uMjI0ODggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzI2NV9pbl9jdG9yRXhwcmVzc2lvbjIyNDg4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzI2NV9pbl9jdG9yRXhwcmVzc2lvbjIyNDg4CT0geyBGT0xMT1dfMjY1X2luX2N0b3JFeHByZXNzaW9uMjI0ODhfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTFRfX2luX2N0b3JFeHByZXNzaW9uMjI0OTAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xUX19pbl9jdG9yRXhwcmVzc2lvbjIyNDkwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDA0MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHhDMjY2MDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzOEUwMDAwMDBBMDBDMTI4KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDY0MDE2MDA3MDAyMjYxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDEzQTc4MTA4KSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xUX19pbl9jdG9yRXhwcmVzc2lvbjIyNDkwCT0geyBGT0xMT1dfTFRfX2luX2N0b3JFeHByZXNzaW9uMjI0OTBfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfdHlwZV92YXJfaW5fY3RvckV4cHJlc3Npb24yMjQ5NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfdHlwZV92YXJfaW5fY3RvckV4cHJlc3Npb24yMjQ5NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV190eXBlX3Zhcl9pbl9jdG9yRXhwcmVzc2lvbjIyNDk1CT0geyBGT0xMT1dfdHlwZV92YXJfaW5fY3RvckV4cHJlc3Npb24yMjQ5NV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19HVF9pbl9jdG9yRXhwcmVzc2lvbjIyNDk4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19HVF9pbl9jdG9yRXhwcmVzc2lvbjIyNDk4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0dUX2luX2N0b3JFeHByZXNzaW9uMjI0OTgJPSB7IEZPTExPV19HVF9pbl9jdG9yRXhwcmVzc2lvbjIyNDk4X2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xQQVJFTl9pbl9jdG9yRXhwcmVzc2lvbjIyNTAxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MUEFSRU5faW5fY3RvckV4cHJlc3Npb24yMjUwMV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MUEFSRU5faW5fY3RvckV4cHJlc3Npb24yMjUwMQk9IHsgRk9MTE9XX0xQQVJFTl9pbl9jdG9yRXhwcmVzc2lvbjIyNTAxX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fY3RvckV4cHJlc3Npb24yMjUwNiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9jdG9yRXhwcmVzc2lvbjIyNTA2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fY3RvckV4cHJlc3Npb24yMjUwNgk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fY3RvckV4cHJlc3Npb24yMjUwNl9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19SUEFSRU5faW5fY3RvckV4cHJlc3Npb24yMjUwOSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfUlBBUkVOX2luX2N0b3JFeHByZXNzaW9uMjI1MDlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUlBBUkVOX2luX2N0b3JFeHByZXNzaW9uMjI1MDkJPSB7IEZPTExPV19SUEFSRU5faW5fY3RvckV4cHJlc3Npb24yMjUwOV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19QRVJDRU5UX0xDVVJMWV9pbl9xdW90ZV9leHByZXNzaW9uMjI1MzIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1BFUkNFTlRfTENVUkxZX2luX3F1b3RlX2V4cHJlc3Npb24yMjUzMl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19QRVJDRU5UX0xDVVJMWV9pbl9xdW90ZV9leHByZXNzaW9uMjI1MzIJPSB7IEZPTExPV19QRVJDRU5UX0xDVVJMWV9pbl9xdW90ZV9leHByZXNzaW9uMjI1MzJfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9xdW90ZV9leHByZXNzaW9uMjI1MzcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fcXVvdGVfZXhwcmVzc2lvbjIyNTM3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHg4MDAwMDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fcXVvdGVfZXhwcmVzc2lvbjIyNTM3CT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9xdW90ZV9leHByZXNzaW9uMjI1MzdfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfUkNVUkxZX1BFUkNFTlRfaW5fcXVvdGVfZXhwcmVzc2lvbjIyNTQwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19SQ1VSTFlfUEVSQ0VOVF9pbl9xdW90ZV9leHByZXNzaW9uMjI1NDBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUkNVUkxZX1BFUkNFTlRfaW5fcXVvdGVfZXhwcmVzc2lvbjIyNTQwCT0geyBGT0xMT1dfUkNVUkxZX1BFUkNFTlRfaW5fcXVvdGVfZXhwcmVzc2lvbjIyNTQwX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xCUkFDS0VUX0JBUl9pbl9tZXRhX2V2YWxfZXhwcmVzc2lvbjIyNTU5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MQlJBQ0tFVF9CQVJfaW5fbWV0YV9ldmFsX2V4cHJlc3Npb24yMjU1OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MQlJBQ0tFVF9CQVJfaW5fbWV0YV9ldmFsX2V4cHJlc3Npb24yMjU1OQk9IHsgRk9MTE9XX0xCUkFDS0VUX0JBUl9pbl9tZXRhX2V2YWxfZXhwcmVzc2lvbjIyNTU5X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fbWV0YV9ldmFsX2V4cHJlc3Npb24yMjU2NCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9tZXRhX2V2YWxfZXhwcmVzc2lvbjIyNTY0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAxMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fbWV0YV9ldmFsX2V4cHJlc3Npb24yMjU2NAk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fbWV0YV9ldmFsX2V4cHJlc3Npb24yMjU2NF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19CQVJfUkJSQUNLRVRfaW5fbWV0YV9ldmFsX2V4cHJlc3Npb24yMjU2NyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQkFSX1JCUkFDS0VUX2luX21ldGFfZXZhbF9leHByZXNzaW9uMjI1NjdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQkFSX1JCUkFDS0VUX2luX21ldGFfZXZhbF9leHByZXNzaW9uMjI1NjcJPSB7IEZPTExPV19CQVJfUkJSQUNLRVRfaW5fbWV0YV9ldmFsX2V4cHJlc3Npb24yMjU2N19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19JRF9pbl9wcmltYXJ5MjI1OTQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0lEX2luX3ByaW1hcnkyMjU5NF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MTAwMDAwMDIwMDQwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JRF9pbl9wcmltYXJ5MjI1OTQJPSB7IEZPTExPV19JRF9pbl9wcmltYXJ5MjI1OTRfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfcHJpbWFyeV9pbnZva2VfaW5fcHJpbWFyeTIyNjE5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19wcmltYXJ5X2ludm9rZV9pbl9wcmltYXJ5MjI2MTlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfcHJpbWFyeV9pbnZva2VfaW5fcHJpbWFyeTIyNjE5CT0geyBGT0xMT1dfcHJpbWFyeV9pbnZva2VfaW5fcHJpbWFyeTIyNjE5X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3ByaW1hcnlfdWZpZF9pbl9wcmltYXJ5MjI2NDkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3ByaW1hcnlfdWZpZF9pbl9wcmltYXJ5MjI2NDlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfcHJpbWFyeV91ZmlkX2luX3ByaW1hcnkyMjY0OQk9IHsgRk9MTE9XX3ByaW1hcnlfdWZpZF9pbl9wcmltYXJ5MjI2NDlfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfcHJpbWFyeV91ZmlfaW5fcHJpbWFyeTIyNjgxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19wcmltYXJ5X3VmaV9pbl9wcmltYXJ5MjI2ODFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfcHJpbWFyeV91ZmlfaW5fcHJpbWFyeTIyNjgxCT0geyBGT0xMT1dfcHJpbWFyeV91ZmlfaW5fcHJpbWFyeTIyNjgxX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3ByaW1hcnlfdWZpX2luX3ByaW1hcnkyMjcwOCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfcHJpbWFyeV91ZmlfaW5fcHJpbWFyeTIyNzA4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3ByaW1hcnlfdWZpX2luX3ByaW1hcnkyMjcwOAk9IHsgRk9MTE9XX3ByaW1hcnlfdWZpX2luX3ByaW1hcnkyMjcwOF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19ET1RfaW5fcHJpbWFyeV91ZmlkMjI3MzggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0RPVF9pbl9wcmltYXJ5X3VmaWQyMjczOF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19ET1RfaW5fcHJpbWFyeV91ZmlkMjI3MzgJPSB7IEZPTExPV19ET1RfaW5fcHJpbWFyeV91ZmlkMjI3MzhfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfSURfaW5fcHJpbWFyeV91ZmlkMjI3NDIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0lEX2luX3ByaW1hcnlfdWZpZDIyNzQyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgxMDAwMDAwMjAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0lEX2luX3ByaW1hcnlfdWZpZDIyNzQyCT0geyBGT0xMT1dfSURfaW5fcHJpbWFyeV91ZmlkMjI3NDJfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTEJSQUNLRVRfaW5fcHJpbWFyeV91ZmlkMjI3NjEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xCUkFDS0VUX2luX3ByaW1hcnlfdWZpZDIyNzYxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xCUkFDS0VUX2luX3ByaW1hcnlfdWZpZDIyNzYxCT0geyBGT0xMT1dfTEJSQUNLRVRfaW5fcHJpbWFyeV91ZmlkMjI3NjFfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9wcmltYXJ5X3VmaWQyMjc2NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9wcmltYXJ5X3VmaWQyMjc2Nl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MTAwMDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX3ByaW1hcnlfdWZpZDIyNzY2CT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9wcmltYXJ5X3VmaWQyMjc2Nl9iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19SQlJBQ0tFVF9pbl9wcmltYXJ5X3VmaWQyMjc2OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfUkJSQUNLRVRfaW5fcHJpbWFyeV91ZmlkMjI3NjlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDEwMDAwMDAyMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUkJSQUNLRVRfaW5fcHJpbWFyeV91ZmlkMjI3NjkJPSB7IEZPTExPV19SQlJBQ0tFVF9pbl9wcmltYXJ5X3VmaWQyMjc2OV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19DT0xPTngyX2luX3ByaW1hcnlfdWZpMjI4MTUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0NPTE9OeDJfaW5fcHJpbWFyeV91ZmkyMjgxNV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19DT0xPTngyX2luX3ByaW1hcnlfdWZpMjI4MTUJPSB7IEZPTExPV19DT0xPTngyX2luX3ByaW1hcnlfdWZpMjI4MTVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfSURfaW5fcHJpbWFyeV91ZmkyMjgxOSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfSURfaW5fcHJpbWFyeV91ZmkyMjgxOV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MTAwMDAwMDIwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JRF9pbl9wcmltYXJ5X3VmaTIyODE5CT0geyBGT0xMT1dfSURfaW5fcHJpbWFyeV91ZmkyMjgxOV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19ET1RfaW5fcHJpbWFyeV91ZmkyMjgzNCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfRE9UX2luX3ByaW1hcnlfdWZpMjI4MzRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfRE9UX2luX3ByaW1hcnlfdWZpMjI4MzQJPSB7IEZPTExPV19ET1RfaW5fcHJpbWFyeV91ZmkyMjgzNF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19JRF9pbl9wcmltYXJ5X3VmaTIyODM4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19JRF9pbl9wcmltYXJ5X3VmaTIyODM4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgxMDAwMDAwMjAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0lEX2luX3ByaW1hcnlfdWZpMjI4MzgJPSB7IEZPTExPV19JRF9pbl9wcmltYXJ5X3VmaTIyODM4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xCUkFDS0VUX2luX3ByaW1hcnlfdWZpMjI4NTcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xCUkFDS0VUX2luX3ByaW1hcnlfdWZpMjI4NTdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTEJSQUNLRVRfaW5fcHJpbWFyeV91ZmkyMjg1Nwk9IHsgRk9MTE9XX0xCUkFDS0VUX2luX3ByaW1hcnlfdWZpMjI4NTdfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9wcmltYXJ5X3VmaTIyODYyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX3ByaW1hcnlfdWZpMjI4NjJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDEwMDAwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9wcmltYXJ5X3VmaTIyODYyCT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9wcmltYXJ5X3VmaTIyODYyX2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1JCUkFDS0VUX2luX3ByaW1hcnlfdWZpMjI4NjUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1JCUkFDS0VUX2luX3ByaW1hcnlfdWZpMjI4NjVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDEwMDAwMDAyMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUkJSQUNLRVRfaW5fcHJpbWFyeV91ZmkyMjg2NQk9IHsgRk9MTE9XX1JCUkFDS0VUX2luX3ByaW1hcnlfdWZpMjI4NjVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTFBBUkVOX2luX3ByaW1hcnlfaW52b2tlMjI5MTUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xQQVJFTl9pbl9wcmltYXJ5X2ludm9rZTIyOTE1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQyKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xQQVJFTl9pbl9wcmltYXJ5X2ludm9rZTIyOTE1CT0geyBGT0xMT1dfTFBBUkVOX2luX3ByaW1hcnlfaW52b2tlMjI5MTVfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5fcHJpbWFyeV9pbnZva2UyMjkyNCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5fcHJpbWFyeV9pbnZva2UyMjkyNF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDgwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9wcmltYXJ5X2ludm9rZTIyOTI0CT0geyBGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5fcHJpbWFyeV9pbnZva2UyMjkyNF9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19DT01NQV9pbl9wcmltYXJ5X2ludm9rZTIyOTQwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19DT01NQV9pbl9wcmltYXJ5X2ludm9rZTIyOTQwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0NPTU1BX2luX3ByaW1hcnlfaW52b2tlMjI5NDAJPSB7IEZPTExPV19DT01NQV9pbl9wcmltYXJ5X2ludm9rZTIyOTQwX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2xhYmVsbGVkX2FyZ3VtZW50X2luX3ByaW1hcnlfaW52b2tlMjI5NDkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2xhYmVsbGVkX2FyZ3VtZW50X2luX3ByaW1hcnlfaW52b2tlMjI5NDlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA4MDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5fcHJpbWFyeV9pbnZva2UyMjk0OQk9IHsgRk9MTE9XX2xhYmVsbGVkX2FyZ3VtZW50X2luX3ByaW1hcnlfaW52b2tlMjI5NDlfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfUlBBUkVOX2luX3ByaW1hcnlfaW52b2tlMjI5NzUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1JQQVJFTl9pbl9wcmltYXJ5X2ludm9rZTIyOTc1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1JQQVJFTl9pbl9wcmltYXJ5X2ludm9rZTIyOTc1CT0geyBGT0xMT1dfUlBBUkVOX2luX3ByaW1hcnlfaW52b2tlMjI5NzVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfSW50ZWdlckxpdGVyYWxfaW5fbGl0ZXJhbDIyOTk3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19JbnRlZ2VyTGl0ZXJhbF9pbl9saXRlcmFsMjI5OTdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfSW50ZWdlckxpdGVyYWxfaW5fbGl0ZXJhbDIyOTk3CT0geyBGT0xMT1dfSW50ZWdlckxpdGVyYWxfaW5fbGl0ZXJhbDIyOTk3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1JhdGlvbmFsTGl0ZXJhbF9pbl9saXRlcmFsMjMwMDUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1JhdGlvbmFsTGl0ZXJhbF9pbl9saXRlcmFsMjMwMDVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUmF0aW9uYWxMaXRlcmFsX2luX2xpdGVyYWwyMzAwNQk9IHsgRk9MTE9XX1JhdGlvbmFsTGl0ZXJhbF9pbl9saXRlcmFsMjMwMDVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfRmxvYXRMaXRlcmFsX2luX2xpdGVyYWwyMzAxMiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfRmxvYXRMaXRlcmFsX2luX2xpdGVyYWwyMzAxMl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19GbG9hdExpdGVyYWxfaW5fbGl0ZXJhbDIzMDEyCT0geyBGT0xMT1dfRmxvYXRMaXRlcmFsX2luX2xpdGVyYWwyMzAxMl9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19DaGFyTGl0ZXJhbF9pbl9saXRlcmFsMjMwMjMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0NoYXJMaXRlcmFsX2luX2xpdGVyYWwyMzAyM19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19DaGFyTGl0ZXJhbF9pbl9saXRlcmFsMjMwMjMJPSB7IEZPTExPV19DaGFyTGl0ZXJhbF9pbl9saXRlcmFsMjMwMjNfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfU3RyaW5nTGl0ZXJhbF9pbl9saXRlcmFsMjMwMzQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1N0cmluZ0xpdGVyYWxfaW5fbGl0ZXJhbDIzMDM0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1N0cmluZ0xpdGVyYWxfaW5fbGl0ZXJhbDIzMDM0CT0geyBGT0xMT1dfU3RyaW5nTGl0ZXJhbF9pbl9saXRlcmFsMjMwMzRfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzk3X2luX2xpdGVyYWwyMzA0NCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzk3X2luX2xpdGVyYWwyMzA0NF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zOTdfaW5fbGl0ZXJhbDIzMDQ0CT0geyBGT0xMT1dfMzk3X2luX2xpdGVyYWwyMzA0NF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yODBfaW5fbGl0ZXJhbDIzMDUzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yODBfaW5fbGl0ZXJhbDIzMDUzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzI4MF9pbl9saXRlcmFsMjMwNTMJPSB7IEZPTExPV18yODBfaW5fbGl0ZXJhbDIzMDUzX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzM3Ml9pbl9saXRlcmFsMjMwNjIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzM3Ml9pbl9saXRlcmFsMjMwNjJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzcyX2luX2xpdGVyYWwyMzA2Mgk9IHsgRk9MTE9XXzM3Ml9pbl9saXRlcmFsMjMwNjJfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzQzX2luX2xpdGVyYWwyMzA3MSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzQzX2luX2xpdGVyYWwyMzA3MV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zNDNfaW5fbGl0ZXJhbDIzMDcxCT0geyBGT0xMT1dfMzQzX2luX2xpdGVyYWwyMzA3MV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yNzdfaW5fbGl0ZXJhbDIzMDc4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yNzdfaW5fbGl0ZXJhbDIzMDc4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzI3N19pbl9saXRlcmFsMjMwNzgJPSB7IEZPTExPV18yNzdfaW5fbGl0ZXJhbDIzMDc4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzE2Ml9pbl9saXRlcmFsMjMwODkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzE2Ml9pbl9saXRlcmFsMjMwODlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMTYyX2luX2xpdGVyYWwyMzA4OQk9IHsgRk9MTE9XXzE2Ml9pbl9saXRlcmFsMjMwODlfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTYwX2luX2xpdGVyYWwyMzA5OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMTYwX2luX2xpdGVyYWwyMzA5OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18xNjBfaW5fbGl0ZXJhbDIzMDk4CT0geyBGT0xMT1dfMTYwX2luX2xpdGVyYWwyMzA5OF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18xNTlfaW5fbGl0ZXJhbDIzMTA3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18xNTlfaW5fbGl0ZXJhbDIzMTA3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzE1OV9pbl9saXRlcmFsMjMxMDcJPSB7IEZPTExPV18xNTlfaW5fbGl0ZXJhbDIzMTA3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzE2MV9pbl9saXRlcmFsMjMxMTQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzE2MV9pbl9saXRlcmFsMjMxMTRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMTYxX2luX2xpdGVyYWwyMzExNAk9IHsgRk9MTE9XXzE2MV9pbl9saXRlcmFsMjMxMTRfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMTU4X2luX2xpdGVyYWwyMzEyMiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMTU4X2luX2xpdGVyYWwyMzEyMl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18xNThfaW5fbGl0ZXJhbDIzMTIyCT0geyBGT0xMT1dfMTU4X2luX2xpdGVyYWwyMzEyMl9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zMzJfaW5fbGl0ZXJhbDIzMTMzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zMzJfaW5fbGl0ZXJhbDIzMTMzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMjAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDQwMDAwMDAxMDAwMDAxKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzMzMl9pbl9saXRlcmFsMjMxMzMJPSB7IEZPTExPV18zMzJfaW5fbGl0ZXJhbDIzMTMzX2JpdHMsIDYJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzMxN19pbl9saXRlcmFsMjMxNDEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzMxN19pbl9saXRlcmFsMjMxNDFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzE3X2luX2xpdGVyYWwyMzE0MQk9IHsgRk9MTE9XXzMxN19pbl9saXRlcmFsMjMxNDFfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjUzX2luX2xpdGVyYWwyMzE1MiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjUzX2luX2xpdGVyYWwyMzE1Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18yNTNfaW5fbGl0ZXJhbDIzMTUyCT0geyBGT0xMT1dfMjUzX2luX2xpdGVyYWwyMzE1Ml9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zNDRfaW5fbGl0ZXJhbDIzMTYzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zNDRfaW5fbGl0ZXJhbDIzMTYzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzM0NF9pbl9saXRlcmFsMjMxNjMJPSB7IEZPTExPV18zNDRfaW5fbGl0ZXJhbDIzMTYzX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzM3NF9pbl9saXRlcmFsMjMxNzcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzM3NF9pbl9saXRlcmFsMjMxNzdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzc0X2luX2xpdGVyYWwyMzE3Nwk9IHsgRk9MTE9XXzM3NF9pbl9saXRlcmFsMjMxNzdfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzIwX2luX2xpdGVyYWwyMzE4OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzIwX2luX2xpdGVyYWwyMzE4OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zMjBfaW5fbGl0ZXJhbDIzMTg5CT0geyBGT0xMT1dfMzIwX2luX2xpdGVyYWwyMzE4OV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yNDlfaW5fbGl0ZXJhbDIzMjAwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18yNDlfaW5fbGl0ZXJhbDIzMjAwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzI0OV9pbl9saXRlcmFsMjMyMDAJPSB7IEZPTExPV18yNDlfaW5fbGl0ZXJhbDIzMjAwX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0dUX2luX2xpdGVyYWwyMzIxMiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfR1RfaW5fbGl0ZXJhbDIzMjEyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0dUX2luX2xpdGVyYWwyMzIxMgk9IHsgRk9MTE9XX0dUX2luX2xpdGVyYWwyMzIxMl9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zMzFfaW5fbGl0ZXJhbDIzMjE3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zMzFfaW5fbGl0ZXJhbDIzMjE3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzMzMV9pbl9saXRlcmFsMjMyMTcJPSB7IEZPTExPV18zMzFfaW5fbGl0ZXJhbDIzMjE3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xDVVJMWV9pbl9jb2xsZWN0aW9uX29mX2V4cHJlc3Npb24yMzI0NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTENVUkxZX2luX2NvbGxlY3Rpb25fb2ZfZXhwcmVzc2lvbjIzMjQ2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xDVVJMWV9pbl9jb2xsZWN0aW9uX29mX2V4cHJlc3Npb24yMzI0Ngk9IHsgRk9MTE9XX0xDVVJMWV9pbl9jb2xsZWN0aW9uX29mX2V4cHJlc3Npb24yMzI0Nl9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX2NvbGxlY3Rpb25fb2ZfZXhwcmVzc2lvbjIzMjU1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX2NvbGxlY3Rpb25fb2ZfZXhwcmVzc2lvbjIzMjU1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwODAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fY29sbGVjdGlvbl9vZl9leHByZXNzaW9uMjMyNTUJPSB7IEZPTExPV19leHByZXNzaW9uX2luX2NvbGxlY3Rpb25fb2ZfZXhwcmVzc2lvbjIzMjU1X2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0NPTU1BX2luX2NvbGxlY3Rpb25fb2ZfZXhwcmVzc2lvbjIzMjc1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19DT01NQV9pbl9jb2xsZWN0aW9uX29mX2V4cHJlc3Npb24yMzI3NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19DT01NQV9pbl9jb2xsZWN0aW9uX29mX2V4cHJlc3Npb24yMzI3NQk9IHsgRk9MTE9XX0NPTU1BX2luX2NvbGxlY3Rpb25fb2ZfZXhwcmVzc2lvbjIzMjc1X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fY29sbGVjdGlvbl9vZl9leHByZXNzaW9uMjMyNzkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fY29sbGVjdGlvbl9vZl9leHByZXNzaW9uMjMyNzlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA4MDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDIwMDAwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9jb2xsZWN0aW9uX29mX2V4cHJlc3Npb24yMzI3OQk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fY29sbGVjdGlvbl9vZl9leHByZXNzaW9uMjMyNzlfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfUkNVUkxZX2luX2NvbGxlY3Rpb25fb2ZfZXhwcmVzc2lvbjIzMjkwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19SQ1VSTFlfaW5fY29sbGVjdGlvbl9vZl9leHByZXNzaW9uMjMyOTBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUkNVUkxZX2luX2NvbGxlY3Rpb25fb2ZfZXhwcmVzc2lvbjIzMjkwCT0geyBGT0xMT1dfUkNVUkxZX2luX2NvbGxlY3Rpb25fb2ZfZXhwcmVzc2lvbjIzMjkwX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xCUkFDS0VUX2luX2NvbGxlY3Rpb25fb2ZfZXhwcmVzc2lvbjIzMzAxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MQlJBQ0tFVF9pbl9jb2xsZWN0aW9uX29mX2V4cHJlc3Npb24yMzMwMV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MQlJBQ0tFVF9pbl9jb2xsZWN0aW9uX29mX2V4cHJlc3Npb24yMzMwMQk9IHsgRk9MTE9XX0xCUkFDS0VUX2luX2NvbGxlY3Rpb25fb2ZfZXhwcmVzc2lvbjIzMzAxX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fY29sbGVjdGlvbl9vZl9leHByZXNzaW9uMjMzMTAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fY29sbGVjdGlvbl9vZl9leHByZXNzaW9uMjMzMTBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA4MDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDEwMDAwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9jb2xsZWN0aW9uX29mX2V4cHJlc3Npb24yMzMxMAk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fY29sbGVjdGlvbl9vZl9leHByZXNzaW9uMjMzMTBfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfQ09NTUFfaW5fY29sbGVjdGlvbl9vZl9leHByZXNzaW9uMjMzMzAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0NPTU1BX2luX2NvbGxlY3Rpb25fb2ZfZXhwcmVzc2lvbjIzMzMwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0NPTU1BX2luX2NvbGxlY3Rpb25fb2ZfZXhwcmVzc2lvbjIzMzMwCT0geyBGT0xMT1dfQ09NTUFfaW5fY29sbGVjdGlvbl9vZl9leHByZXNzaW9uMjMzMzBfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9jb2xsZWN0aW9uX29mX2V4cHJlc3Npb24yMzMzNCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9jb2xsZWN0aW9uX29mX2V4cHJlc3Npb24yMzMzNF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDgwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MTAwMDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX2NvbGxlY3Rpb25fb2ZfZXhwcmVzc2lvbjIzMzM0CT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9jb2xsZWN0aW9uX29mX2V4cHJlc3Npb24yMzMzNF9iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19SQlJBQ0tFVF9pbl9jb2xsZWN0aW9uX29mX2V4cHJlc3Npb24yMzM0NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfUkJSQUNLRVRfaW5fY29sbGVjdGlvbl9vZl9leHByZXNzaW9uMjMzNDVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUkJSQUNLRVRfaW5fY29sbGVjdGlvbl9vZl9leHByZXNzaW9uMjMzNDUJPSB7IEZPTExPV19SQlJBQ0tFVF9pbl9jb2xsZWN0aW9uX29mX2V4cHJlc3Npb24yMzM0NV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV180MDZfaW5fc3lucHJlZDIxX2ZtbDUzMSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfNDA2X2luX3N5bnByZWQyMV9mbWw1MzFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfNDA2X2luX3N5bnByZWQyMV9mbWw1MzEJPSB7IEZPTExPV180MDZfaW5fc3lucHJlZDIxX2ZtbDUzMV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zMjJfaW5fc3lucHJlZDU2X2ZtbDExMjcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzMyMl9pbl9zeW5wcmVkNTZfZm1sMTEyN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zMjJfaW5fc3lucHJlZDU2X2ZtbDExMjcJPSB7IEZPTExPV18zMjJfaW5fc3lucHJlZDU2X2ZtbDExMjdfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzUzX2luX3N5bnByZWQ1N19mbWwxMTQ0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zNTNfaW5fc3lucHJlZDU3X2ZtbDExNDRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzUzX2luX3N5bnByZWQ1N19mbWwxMTQ0CT0geyBGT0xMT1dfMzUzX2luX3N5bnByZWQ1N19mbWwxMTQ0X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzI3Ml9pbl9zeW5wcmVkNThfZm1sMTE1OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjcyX2luX3N5bnByZWQ1OF9mbWwxMTU4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzI3Ml9pbl9zeW5wcmVkNThfZm1sMTE1OAk9IHsgRk9MTE9XXzI3Ml9pbl9zeW5wcmVkNThfZm1sMTE1OF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV180MDZfaW5fc3lucHJlZDU5X2ZtbDExODEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzQwNl9pbl9zeW5wcmVkNTlfZm1sMTE4MV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV180MDZfaW5fc3lucHJlZDU5X2ZtbDExODEJPSB7IEZPTExPV180MDZfaW5fc3lucHJlZDU5X2ZtbDExODFfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMzkzX2luX3N5bnByZWQ2MF9mbWwxMTk4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zOTNfaW5fc3lucHJlZDYwX2ZtbDExOThfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzkzX2luX3N5bnByZWQ2MF9mbWwxMTk4CT0geyBGT0xMT1dfMzkzX2luX3N5bnByZWQ2MF9mbWwxMTk4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzMwNl9pbl9zeW5wcmVkNjFfZm1sMTIxNSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzA2X2luX3N5bnByZWQ2MV9mbWwxMjE1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzMwNl9pbl9zeW5wcmVkNjFfZm1sMTIxNQk9IHsgRk9MTE9XXzMwNl9pbl9zeW5wcmVkNjFfZm1sMTIxNV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zMTRfaW5fc3lucHJlZDYyX2ZtbDEyMjQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzMxNF9pbl9zeW5wcmVkNjJfZm1sMTIyNF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18zMTRfaW5fc3lucHJlZDYyX2ZtbDEyMjQJPSB7IEZPTExPV18zMTRfaW5fc3lucHJlZDYyX2ZtbDEyMjRfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2V0X2luX3N5bnByZWQ5NV9mbWwxODU3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zZXRfaW5fc3lucHJlZDk1X2ZtbDE4NTdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2V0X2luX3N5bnByZWQ5NV9mbWwxODU3CT0geyBGT0xMT1dfc2V0X2luX3N5bnByZWQ5NV9mbWwxODU3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lEX2luX3N5bnByZWQ5NV9mbWwxODkzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19JRF9pbl9zeW5wcmVkOTVfZm1sMTg5M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JRF9pbl9zeW5wcmVkOTVfZm1sMTg5Mwk9IHsgRk9MTE9XX0lEX2luX3N5bnByZWQ5NV9mbWwxODkzX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3R5cGVfdmFyX2luX3N5bnByZWQxMTVfZm1sMjM4NyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfdHlwZV92YXJfaW5fc3lucHJlZDExNV9mbWwyMzg3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMjAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3R5cGVfdmFyX2luX3N5bnByZWQxMTVfZm1sMjM4Nwk9IHsgRk9MTE9XX3R5cGVfdmFyX2luX3N5bnByZWQxMTVfZm1sMjM4N19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19DT0xPTl9pbl9zeW5wcmVkMTE1X2ZtbDIzODkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0NPTE9OX2luX3N5bnByZWQxMTVfZm1sMjM4OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19DT0xPTl9pbl9zeW5wcmVkMTE1X2ZtbDIzODkJPSB7IEZPTExPV19DT0xPTl9pbl9zeW5wcmVkMTE1X2ZtbDIzODlfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfdHlwZV92YXJfaW5fc3lucHJlZDEyNl9mbWwyNjg5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV190eXBlX3Zhcl9pbl9zeW5wcmVkMTI2X2ZtbDI2ODlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAyMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfdHlwZV92YXJfaW5fc3lucHJlZDEyNl9mbWwyNjg5CT0geyBGT0xMT1dfdHlwZV92YXJfaW5fc3lucHJlZDEyNl9mbWwyNjg5X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0NPTE9OX2luX3N5bnByZWQxMjZfZm1sMjY5MSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQ09MT05faW5fc3lucHJlZDEyNl9mbWwyNjkxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0NPTE9OX2luX3N5bnByZWQxMjZfZm1sMjY5MQk9IHsgRk9MTE9XX0NPTE9OX2luX3N5bnByZWQxMjZfZm1sMjY5MV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJlZGljYXRfaW5fc3lucHJlZDEyN19mbWwyNzY0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJlZGljYXRfaW5fc3lucHJlZDEyN19mbWwyNzY0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdF9pbl9zeW5wcmVkMTI3X2ZtbDI3NjQJPSB7IEZPTExPV19kZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJlZGljYXRfaW5fc3lucHJlZDEyN19mbWwyNzY0X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX21vZGlmaWVyX2RlY2xhcmF0aW9uX2luX3N5bnByZWQxMzhfZm1sMjkzOSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfbW9kaWZpZXJfZGVjbGFyYXRpb25faW5fc3lucHJlZDEzOF9mbWwyOTM5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX21vZGlmaWVyX2RlY2xhcmF0aW9uX2luX3N5bnByZWQxMzhfZm1sMjkzOQk9IHsgRk9MTE9XX21vZGlmaWVyX2RlY2xhcmF0aW9uX2luX3N5bnByZWQxMzhfZm1sMjkzOV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllcl9pbl9zeW5wcmVkMTUzX2ZtbDMxOTkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyX2luX3N5bnByZWQxNTNfZm1sMzE5OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllcl9pbl9zeW5wcmVkMTUzX2ZtbDMxOTkJPSB7IEZPTExPV19leGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllcl9pbl9zeW5wcmVkMTUzX2ZtbDMxOTlfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfbHZhbHVlX2luX3N5bnByZWQxNzBfZm1sMzY0NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfbHZhbHVlX2luX3N5bnByZWQxNzBfZm1sMzY0NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDIwMDBEMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19sdmFsdWVfaW5fc3lucHJlZDE3MF9mbWwzNjQ1CT0geyBGT0xMT1dfbHZhbHVlX2luX3N5bnByZWQxNzBfZm1sMzY0NV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19vcF9hc3NpZ25fcGFyYW1faW5fc3lucHJlZDE3MF9mbWwzNjQ4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19vcF9hc3NpZ25fcGFyYW1faW5fc3lucHJlZDE3MF9mbWwzNjQ4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX29wX2Fzc2lnbl9wYXJhbV9pbl9zeW5wcmVkMTcwX2ZtbDM2NDgJPSB7IEZPTExPV19vcF9hc3NpZ25fcGFyYW1faW5fc3lucHJlZDE3MF9mbWwzNjQ4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdF9pbl9zeW5wcmVkMjk2X2ZtbDU5NzMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdF9pbl9zeW5wcmVkMjk2X2ZtbDU5NzNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0X2luX3N5bnByZWQyOTZfZm1sNTk3Mwk9IHsgRk9MTE9XX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdF9pbl9zeW5wcmVkMjk2X2ZtbDU5NzNfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfbW9kaWZpZXJfZGVjbGFyYXRpb25faW5fc3lucHJlZDMwNF9mbWw2MTEyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19tb2RpZmllcl9kZWNsYXJhdGlvbl9pbl9zeW5wcmVkMzA0X2ZtbDYxMTJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfbW9kaWZpZXJfZGVjbGFyYXRpb25faW5fc3lucHJlZDMwNF9mbWw2MTEyCT0geyBGT0xMT1dfbW9kaWZpZXJfZGVjbGFyYXRpb25faW5fc3lucHJlZDMwNF9mbWw2MTEyX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzMyMV9pbl9zeW5wcmVkMzI0X2ZtbDY1MjAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzMyMV9pbl9zeW5wcmVkMzI0X2ZtbDY1MjBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAxMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMTQwMjAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzIxX2luX3N5bnByZWQzMjRfZm1sNjUyMAk9IHsgRk9MTE9XXzMyMV9pbl9zeW5wcmVkMzI0X2ZtbDY1MjBfYml0cywgNQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfbW9jX3RyYW5zaXRpb25fYXR0cmlidXRlX2luX3N5bnByZWQzMjRfZm1sNjUyNyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfbW9jX3RyYW5zaXRpb25fYXR0cmlidXRlX2luX3N5bnByZWQzMjRfZm1sNjUyN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19tb2NfdHJhbnNpdGlvbl9hdHRyaWJ1dGVfaW5fc3lucHJlZDMyNF9mbWw2NTI3CT0geyBGT0xMT1dfbW9jX3RyYW5zaXRpb25fYXR0cmlidXRlX2luX3N5bnByZWQzMjRfZm1sNjUyN19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zNDhfaW5fc3lucHJlZDMyNl9mbWw2NTM4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18zNDhfaW5fc3lucHJlZDMyNl9mbWw2NTM4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDg0MDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzM0OF9pbl9zeW5wcmVkMzI2X2ZtbDY1MzgJPSB7IEZPTExPV18zNDhfaW5fc3lucHJlZDMyNl9mbWw2NTM4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fc3lucHJlZDMyNl9mbWw2NTQ1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19pbnRlZ2VyX2NvbnN0YW50X2luX3N5bnByZWQzMjZfZm1sNjU0NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19pbnRlZ2VyX2NvbnN0YW50X2luX3N5bnByZWQzMjZfZm1sNjU0NQk9IHsgRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fc3lucHJlZDMyNl9mbWw2NTQ1X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzE2M19pbl9zeW5wcmVkMzI5X2ZtbDY2MDAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzE2M19pbl9zeW5wcmVkMzI5X2ZtbDY2MDBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwODAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDI3RjAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMTYzX2luX3N5bnByZWQzMjlfZm1sNjYwMAk9IHsgRk9MTE9XXzE2M19pbl9zeW5wcmVkMzI5X2ZtbDY2MDBfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfdGFyZ2V0X3N0YXRlX2lkX2luX3N5bnByZWQzMjlfZm1sNjYxMiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfdGFyZ2V0X3N0YXRlX2lkX2luX3N5bnByZWQzMjlfZm1sNjYxMl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV190YXJnZXRfc3RhdGVfaWRfaW5fc3lucHJlZDMyOV9mbWw2NjEyCT0geyBGT0xMT1dfdGFyZ2V0X3N0YXRlX2lkX2luX3N5bnByZWQzMjlfZm1sNjYxMl9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TRU1JX2luX3N5bnByZWQzMjlfZm1sNjYyOSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU0VNSV9pbl9zeW5wcmVkMzI5X2ZtbDY2MjlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU0VNSV9pbl9zeW5wcmVkMzI5X2ZtbDY2MjkJPSB7IEZPTExPV19TRU1JX2luX3N5bnByZWQzMjlfZm1sNjYyOV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQzNDBfZm1sNjg0MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkMzQwX2ZtbDY4NDBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkMzQwX2ZtbDY4NDAJPSB7IEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQzNDBfZm1sNjg0MF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MQlJBQ0tFVF9pbl9zeW5wcmVkMzQxX2ZtbDY4NTEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xCUkFDS0VUX2luX3N5bnByZWQzNDFfZm1sNjg1MV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MQlJBQ0tFVF9pbl9zeW5wcmVkMzQxX2ZtbDY4NTEJPSB7IEZPTExPV19MQlJBQ0tFVF9pbl9zeW5wcmVkMzQxX2ZtbDY4NTFfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkMzQxX2ZtbDY4NTUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDM0MV9mbWw2ODU1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgxMDAwMDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDM0MV9mbWw2ODU1CT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkMzQxX2ZtbDY4NTVfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfUkJSQUNLRVRfaW5fc3lucHJlZDM0MV9mbWw2ODU3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19SQlJBQ0tFVF9pbl9zeW5wcmVkMzQxX2ZtbDY4NTdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUkJSQUNLRVRfaW5fc3lucHJlZDM0MV9mbWw2ODU3CT0geyBGT0xMT1dfUkJSQUNLRVRfaW5fc3lucHJlZDM0MV9mbWw2ODU3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDM0M19mbWw2OTAwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQzNDNfZm1sNjkwMF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQzNDNfZm1sNjkwMAk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDM0M19mbWw2OTAwX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xDVVJMWV9pbl9zeW5wcmVkMzQ0X2ZtbDY5MTEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xDVVJMWV9pbl9zeW5wcmVkMzQ0X2ZtbDY5MTFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTENVUkxZX2luX3N5bnByZWQzNDRfZm1sNjkxMQk9IHsgRk9MTE9XX0xDVVJMWV9pbl9zeW5wcmVkMzQ0X2ZtbDY5MTFfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkMzQ0X2ZtbDY5MTUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDM0NF9mbWw2OTE1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDM0NF9mbWw2OTE1CT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkMzQ0X2ZtbDY5MTVfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfUkNVUkxZX2luX3N5bnByZWQzNDRfZm1sNjkxNyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfUkNVUkxZX2luX3N5bnByZWQzNDRfZm1sNjkxN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19SQ1VSTFlfaW5fc3lucHJlZDM0NF9mbWw2OTE3CT0geyBGT0xMT1dfUkNVUkxZX2luX3N5bnByZWQzNDRfZm1sNjkxN19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25faGVhZGVyX3ByZWRpY2F0X2luX3N5bnByZWQzNjZfZm1sNzMxNiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX2hlYWRlcl9wcmVkaWNhdF9pbl9zeW5wcmVkMzY2X2ZtbDczMTZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX2hlYWRlcl9wcmVkaWNhdF9pbl9zeW5wcmVkMzY2X2ZtbDczMTYJPSB7IEZPTExPV19kZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25faGVhZGVyX3ByZWRpY2F0X2luX3N5bnByZWQzNjZfZm1sNzMxNl9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25faW1wb3J0X3ByZWRpY2F0X2luX3N5bnByZWQzNzBfZm1sNzM4MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX2ltcG9ydF9wcmVkaWNhdF9pbl9zeW5wcmVkMzcwX2ZtbDczODBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX2ltcG9ydF9wcmVkaWNhdF9pbl9zeW5wcmVkMzcwX2ZtbDczODAJPSB7IEZPTExPV19kZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25faW1wb3J0X3ByZWRpY2F0X2luX3N5bnByZWQzNzBfZm1sNzM4MF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcGFyYW1ldGVyX3ByZWRpY2F0X2luX3N5bnByZWQzNzNfZm1sNzQzMiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3BhcmFtZXRlcl9wcmVkaWNhdF9pbl9zeW5wcmVkMzczX2ZtbDc0MzJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3BhcmFtZXRlcl9wcmVkaWNhdF9pbl9zeW5wcmVkMzczX2ZtbDc0MzIJPSB7IEZPTExPV19kZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcGFyYW1ldGVyX3ByZWRpY2F0X2luX3N5bnByZWQzNzNfZm1sNzQzMl9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19kZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJvcGVydHlfcHJlZGljYXRfaW5fc3lucHJlZDM3NV9mbWw3NDcyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19kZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJvcGVydHlfcHJlZGljYXRfaW5fc3lucHJlZDM3NV9mbWw3NDcyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcm9wZXJ0eV9wcmVkaWNhdF9pbl9zeW5wcmVkMzc1X2ZtbDc0NzIJPSB7IEZPTExPV19kZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJvcGVydHlfcHJlZGljYXRfaW5fc3lucHJlZDM3NV9mbWw3NDcyX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lEX2luX3N5bnByZWQ0MDdfZm1sNzkyMiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfSURfaW5fc3lucHJlZDQwN19mbWw3OTIyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMjAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0lEX2luX3N5bnByZWQ0MDdfZm1sNzkyMgk9IHsgRk9MTE9XX0lEX2luX3N5bnByZWQ0MDdfZm1sNzkyMl9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19DT0xPTl9pbl9zeW5wcmVkNDA3X2ZtbDc5MjQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0NPTE9OX2luX3N5bnByZWQ0MDdfZm1sNzkyNF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19DT0xPTl9pbl9zeW5wcmVkNDA3X2ZtbDc5MjQJPSB7IEZPTExPV19DT0xPTl9pbl9zeW5wcmVkNDA3X2ZtbDc5MjRfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTFBBUkVOX2luX3N5bnByZWQ0MTJfZm1sODA3NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTFBBUkVOX2luX3N5bnByZWQ0MTJfZm1sODA3Nl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MUEFSRU5faW5fc3lucHJlZDQxMl9mbWw4MDc2CT0geyBGT0xMT1dfTFBBUkVOX2luX3N5bnByZWQ0MTJfZm1sODA3Nl9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9zeW5wcmVkNDEyX2ZtbDgwODUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2xhYmVsbGVkX2FyZ3VtZW50X2luX3N5bnByZWQ0MTJfZm1sODA4NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDgwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9zeW5wcmVkNDEyX2ZtbDgwODUJPSB7IEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9zeW5wcmVkNDEyX2ZtbDgwODVfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfQ09NTUFfaW5fc3lucHJlZDQxMl9mbWw4MTAxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19DT01NQV9pbl9zeW5wcmVkNDEyX2ZtbDgxMDFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQ09NTUFfaW5fc3lucHJlZDQxMl9mbWw4MTAxCT0geyBGT0xMT1dfQ09NTUFfaW5fc3lucHJlZDQxMl9mbWw4MTAxX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2xhYmVsbGVkX2FyZ3VtZW50X2luX3N5bnByZWQ0MTJfZm1sODExMiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5fc3lucHJlZDQxMl9mbWw4MTEyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwODAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2xhYmVsbGVkX2FyZ3VtZW50X2luX3N5bnByZWQ0MTJfZm1sODExMgk9IHsgRk9MTE9XX2xhYmVsbGVkX2FyZ3VtZW50X2luX3N5bnByZWQ0MTJfZm1sODExMl9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19SUEFSRU5faW5fc3lucHJlZDQxMl9mbWw4MTM2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19SUEFSRU5faW5fc3lucHJlZDQxMl9mbWw4MTM2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1JQQVJFTl9pbl9zeW5wcmVkNDEyX2ZtbDgxMzYJPSB7IEZPTExPV19SUEFSRU5faW5fc3lucHJlZDQxMl9mbWw4MTM2X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xQQVJFTl9pbl9zeW5wcmVkNDE3X2ZtbDgyNjUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xQQVJFTl9pbl9zeW5wcmVkNDE3X2ZtbDgyNjVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTFBBUkVOX2luX3N5bnByZWQ0MTdfZm1sODI2NQk9IHsgRk9MTE9XX0xQQVJFTl9pbl9zeW5wcmVkNDE3X2ZtbDgyNjVfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5fc3lucHJlZDQxN19mbWw4Mjc0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9zeW5wcmVkNDE3X2ZtbDgyNzRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA4MDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5fc3lucHJlZDQxN19mbWw4Mjc0CT0geyBGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5fc3lucHJlZDQxN19mbWw4Mjc0X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0NPTU1BX2luX3N5bnByZWQ0MTdfZm1sODI5MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQ09NTUFfaW5fc3lucHJlZDQxN19mbWw4MjkwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0NPTU1BX2luX3N5bnByZWQ0MTdfZm1sODI5MAk9IHsgRk9MTE9XX0NPTU1BX2luX3N5bnByZWQ0MTdfZm1sODI5MF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9zeW5wcmVkNDE3X2ZtbDgzMDEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2xhYmVsbGVkX2FyZ3VtZW50X2luX3N5bnByZWQ0MTdfZm1sODMwMV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDgwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9zeW5wcmVkNDE3X2ZtbDgzMDEJPSB7IEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9zeW5wcmVkNDE3X2ZtbDgzMDFfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfUlBBUkVOX2luX3N5bnByZWQ0MTdfZm1sODMyNSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfUlBBUkVOX2luX3N5bnByZWQ0MTdfZm1sODMyNV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19SUEFSRU5faW5fc3lucHJlZDQxN19mbWw4MzI1CT0geyBGT0xMT1dfUlBBUkVOX2luX3N5bnByZWQ0MTdfZm1sODMyNV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19JRF9pbl9zeW5wcmVkNDE5X2ZtbDg0MDcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0lEX2luX3N5bnByZWQ0MTlfZm1sODQwN19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JRF9pbl9zeW5wcmVkNDE5X2ZtbDg0MDcJPSB7IEZPTExPV19JRF9pbl9zeW5wcmVkNDE5X2ZtbDg0MDdfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfSURfaW5fc3lucHJlZDQyNl9mbWw4NTQyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19JRF9pbl9zeW5wcmVkNDI2X2ZtbDg1NDJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfSURfaW5fc3lucHJlZDQyNl9mbWw4NTQyCT0geyBGT0xMT1dfSURfaW5fc3lucHJlZDQyNl9mbWw4NTQyX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lEX2luX3N5bnByZWQ0MzFfZm1sODY4OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfSURfaW5fc3lucHJlZDQzMV9mbWw4Njg5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0lEX2luX3N5bnByZWQ0MzFfZm1sODY4OQk9IHsgRk9MTE9XX0lEX2luX3N5bnByZWQ0MzFfZm1sODY4OV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19JRF9pbl9zeW5wcmVkNDM4X2ZtbDg4MjQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0lEX2luX3N5bnByZWQ0MzhfZm1sODgyNF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JRF9pbl9zeW5wcmVkNDM4X2ZtbDg4MjQJPSB7IEZPTExPV19JRF9pbl9zeW5wcmVkNDM4X2ZtbDg4MjRfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfdHlwZV92YXJfaW5fc3lucHJlZDQ0Nl9mbWw5MDMxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV190eXBlX3Zhcl9pbl9zeW5wcmVkNDQ2X2ZtbDkwMzFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAyMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfdHlwZV92YXJfaW5fc3lucHJlZDQ0Nl9mbWw5MDMxCT0geyBGT0xMT1dfdHlwZV92YXJfaW5fc3lucHJlZDQ0Nl9mbWw5MDMxX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0NPTE9OX2luX3N5bnByZWQ0NDZfZm1sOTAzMyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQ09MT05faW5fc3lucHJlZDQ0Nl9mbWw5MDMzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0NPTE9OX2luX3N5bnByZWQ0NDZfZm1sOTAzMwk9IHsgRk9MTE9XX0NPTE9OX2luX3N5bnByZWQ0NDZfZm1sOTAzM19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19iYXNlX3R5cGVfdmFyX2luX3N5bnByZWQ0OTNfZm1sMTAyODcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2Jhc2VfdHlwZV92YXJfaW5fc3lucHJlZDQ5M19mbWwxMDI4N19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDgwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19iYXNlX3R5cGVfdmFyX2luX3N5bnByZWQ0OTNfZm1sMTAyODcJPSB7IEZPTExPV19iYXNlX3R5cGVfdmFyX2luX3N5bnByZWQ0OTNfZm1sMTAyODdfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfQ09NTUFfaW5fc3lucHJlZDQ5M19mbWwxMDMwMyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQ09NTUFfaW5fc3lucHJlZDQ5M19mbWwxMDMwM19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDA4NDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDIwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDA4MDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19DT01NQV9pbl9zeW5wcmVkNDkzX2ZtbDEwMzAzCT0geyBGT0xMT1dfQ09NTUFfaW5fc3lucHJlZDQ5M19mbWwxMDMwM19iaXRzLCA2CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18zNzVfaW5fc3lucHJlZDQ5M19mbWwxMDMwOCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMzc1X2luX3N5bnByZWQ0OTNfZm1sMTAzMDhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwODQwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAyMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMzc1X2luX3N5bnByZWQ0OTNfZm1sMTAzMDgJPSB7IEZPTExPV18zNzVfaW5fc3lucHJlZDQ5M19mbWwxMDMwOF9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19pbnRlZ2VyX2NvbnN0YW50X2luX3N5bnByZWQ0OTNfZm1sMTAzMjggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fc3lucHJlZDQ5M19mbWwxMDMyOF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19pbnRlZ2VyX2NvbnN0YW50X2luX3N5bnByZWQ0OTNfZm1sMTAzMjgJPSB7IEZPTExPV19pbnRlZ2VyX2NvbnN0YW50X2luX3N5bnByZWQ0OTNfZm1sMTAzMjhfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfU1RBUl9pbl9zeW5wcmVkNDkzX2ZtbDEwMzQ1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19TVEFSX2luX3N5bnByZWQ0OTNfZm1sMTAzNDVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU1RBUl9pbl9zeW5wcmVkNDkzX2ZtbDEwMzQ1CT0geyBGT0xMT1dfU1RBUl9pbl9zeW5wcmVkNDkzX2ZtbDEwMzQ1X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2JpdF9maWVsZF9zaXplX2luX3N5bnByZWQ1MTRfZm1sMTA3NTUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2JpdF9maWVsZF9zaXplX2luX3N5bnByZWQ1MTRfZm1sMTA3NTVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfYml0X2ZpZWxkX3NpemVfaW5fc3lucHJlZDUxNF9mbWwxMDc1NQk9IHsgRk9MTE9XX2JpdF9maWVsZF9zaXplX2luX3N5bnByZWQ1MTRfZm1sMTA3NTVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfYml0X2ZpZWxkX3NpemVfaW5fc3lucHJlZDUxN19mbWwxMDc5NCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfYml0X2ZpZWxkX3NpemVfaW5fc3lucHJlZDUxN19mbWwxMDc5NF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19iaXRfZmllbGRfc2l6ZV9pbl9zeW5wcmVkNTE3X2ZtbDEwNzk0CT0geyBGT0xMT1dfYml0X2ZpZWxkX3NpemVfaW5fc3lucHJlZDUxN19mbWwxMDc5NF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19iaXRfZmllbGRfc2l6ZV9pbl9zeW5wcmVkNTIwX2ZtbDEwODMxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19iaXRfZmllbGRfc2l6ZV9pbl9zeW5wcmVkNTIwX2ZtbDEwODMxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2JpdF9maWVsZF9zaXplX2luX3N5bnByZWQ1MjBfZm1sMTA4MzEJPSB7IEZPTExPV19iaXRfZmllbGRfc2l6ZV9pbl9zeW5wcmVkNTIwX2ZtbDEwODMxX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2JpdF9maWVsZF9zaXplX2luX3N5bnByZWQ1MzFfZm1sMTA5NjggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2JpdF9maWVsZF9zaXplX2luX3N5bnByZWQ1MzFfZm1sMTA5NjhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfYml0X2ZpZWxkX3NpemVfaW5fc3lucHJlZDUzMV9mbWwxMDk2OAk9IHsgRk9MTE9XX2JpdF9maWVsZF9zaXplX2luX3N5bnByZWQ1MzFfZm1sMTA5NjhfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfYml0X2ZpZWxkX3NpemVfaW5fc3lucHJlZDUzNV9mbWwxMTAyMCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfYml0X2ZpZWxkX3NpemVfaW5fc3lucHJlZDUzNV9mbWwxMTAyMF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19iaXRfZmllbGRfc2l6ZV9pbl9zeW5wcmVkNTM1X2ZtbDExMDIwCT0geyBGT0xMT1dfYml0X2ZpZWxkX3NpemVfaW5fc3lucHJlZDUzNV9mbWwxMTAyMF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19iaXRfZmllbGRfc2l6ZV9pbl9zeW5wcmVkNTM3X2ZtbDExMDUxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19iaXRfZmllbGRfc2l6ZV9pbl9zeW5wcmVkNTM3X2ZtbDExMDUxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2JpdF9maWVsZF9zaXplX2luX3N5bnByZWQ1MzdfZm1sMTEwNTEJPSB7IEZPTExPV19iaXRfZmllbGRfc2l6ZV9pbl9zeW5wcmVkNTM3X2ZtbDExMDUxX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3N0cmluZ19maWVsZF9zaXplX2luX3N5bnByZWQ1MzlfZm1sMTEwODAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3N0cmluZ19maWVsZF9zaXplX2luX3N5bnByZWQ1MzlfZm1sMTEwODBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc3RyaW5nX2ZpZWxkX3NpemVfaW5fc3lucHJlZDUzOV9mbWwxMTA4MAk9IHsgRk9MTE9XX3N0cmluZ19maWVsZF9zaXplX2luX3N5bnByZWQ1MzlfZm1sMTEwODBfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2V0X2luX3N5bnByZWQ1NTVfZm1sMTEzNTcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NldF9pbl9zeW5wcmVkNTU1X2ZtbDExMzU3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDg0MDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3NldF9pbl9zeW5wcmVkNTU1X2ZtbDExMzU3CT0geyBGT0xMT1dfc2V0X2luX3N5bnByZWQ1NTVfZm1sMTEzNTdfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfaW50ZWdlcl9jb25zdGFudF9pbl9zeW5wcmVkNTU1X2ZtbDExMzc0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19pbnRlZ2VyX2NvbnN0YW50X2luX3N5bnByZWQ1NTVfZm1sMTEzNzRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfaW50ZWdlcl9jb25zdGFudF9pbl9zeW5wcmVkNTU1X2ZtbDExMzc0CT0geyBGT0xMT1dfaW50ZWdlcl9jb25zdGFudF9pbl9zeW5wcmVkNTU1X2ZtbDExMzc0X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3R5cGVfdmFyX2luX3N5bnByZWQ1NTlfZm1sMTE1MDcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3R5cGVfdmFyX2luX3N5bnByZWQ1NTlfZm1sMTE1MDdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfdHlwZV92YXJfaW5fc3lucHJlZDU1OV9mbWwxMTUwNwk9IHsgRk9MTE9XX3R5cGVfdmFyX2luX3N5bnByZWQ1NTlfZm1sMTE1MDdfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfSURfaW5fc3lucHJlZDU1OV9mbWwxMTUwOSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfSURfaW5fc3lucHJlZDU1OV9mbWwxMTUwOV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19JRF9pbl9zeW5wcmVkNTU5X2ZtbDExNTA5CT0geyBGT0xMT1dfSURfaW5fc3lucHJlZDU1OV9mbWwxMTUwOV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV190eXBlX3Zhcl9pbl9zeW5wcmVkNTc0X2ZtbDEyMDU3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV190eXBlX3Zhcl9pbl9zeW5wcmVkNTc0X2ZtbDEyMDU3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3R5cGVfdmFyX2luX3N5bnByZWQ1NzRfZm1sMTIwNTcJPSB7IEZPTExPV190eXBlX3Zhcl9pbl9zeW5wcmVkNTc0X2ZtbDEyMDU3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0NPTU1BX2luX3N5bnByZWQ2MDlfZm1sMTI3NzUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0NPTU1BX2luX3N5bnByZWQ2MDlfZm1sMTI3NzVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwODQwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQ09NTUFfaW5fc3lucHJlZDYwOV9mbWwxMjc3NQk9IHsgRk9MTE9XX0NPTU1BX2luX3N5bnByZWQ2MDlfZm1sMTI3NzVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfaW50ZWdlcl9jb25zdGFudF9pbl9zeW5wcmVkNjA5X2ZtbDEyNzgwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19pbnRlZ2VyX2NvbnN0YW50X2luX3N5bnByZWQ2MDlfZm1sMTI3ODBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfaW50ZWdlcl9jb25zdGFudF9pbl9zeW5wcmVkNjA5X2ZtbDEyNzgwCT0geyBGT0xMT1dfaW50ZWdlcl9jb25zdGFudF9pbl9zeW5wcmVkNjA5X2ZtbDEyNzgwX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX21vZGlmaWVyX3BhcmFtX2luX3N5bnByZWQ2MzZfZm1sMTMyOTEgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX21vZGlmaWVyX3BhcmFtX2luX3N5bnByZWQ2MzZfZm1sMTMyOTFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweEMyNjYwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDM4RTAwMDAwMEEwMEMxMjgpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwNjQwMTYwMDcwMDIyNjEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMTNBNzgxMDgpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfbW9kaWZpZXJfcGFyYW1faW5fc3lucHJlZDYzNl9mbWwxMzI5MQk9IHsgRk9MTE9XX21vZGlmaWVyX3BhcmFtX2luX3N5bnByZWQ2MzZfZm1sMTMyOTFfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfdHlwZV92YXJfaW5fc3lucHJlZDYzNl9mbWwxMzI5NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfdHlwZV92YXJfaW5fc3lucHJlZDYzNl9mbWwxMzI5NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV190eXBlX3Zhcl9pbl9zeW5wcmVkNjM2X2ZtbDEzMjk1CT0geyBGT0xMT1dfdHlwZV92YXJfaW5fc3lucHJlZDYzNl9mbWwxMzI5NV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19JRF9pbl9zeW5wcmVkNjM2X2ZtbDEzMjk3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19JRF9pbl9zeW5wcmVkNjM2X2ZtbDEzMjk3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0lEX2luX3N5bnByZWQ2MzZfZm1sMTMyOTcJPSB7IEZPTExPV19JRF9pbl9zeW5wcmVkNjM2X2ZtbDEzMjk3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX21vZGlmaWVyX3BhcmFtX2luX3N5bnByZWQ2NDNfZm1sMTM0NzAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX21vZGlmaWVyX3BhcmFtX2luX3N5bnByZWQ2NDNfZm1sMTM0NzBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDQwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweEMyNjYwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDM4RTAwMDAwMEEwMEMxMjgpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwNjQwMTYwMDcwMDIyNjEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMTNBNzgxMDgpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfbW9kaWZpZXJfcGFyYW1faW5fc3lucHJlZDY0M19mbWwxMzQ3MAk9IHsgRk9MTE9XX21vZGlmaWVyX3BhcmFtX2luX3N5bnByZWQ2NDNfZm1sMTM0NzBfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfdHlwZV92YXJfaW5fc3lucHJlZDY0M19mbWwxMzQ3NCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfdHlwZV92YXJfaW5fc3lucHJlZDY0M19mbWwxMzQ3NF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwNDAwMDAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV190eXBlX3Zhcl9pbl9zeW5wcmVkNjQzX2ZtbDEzNDc0CT0geyBGT0xMT1dfdHlwZV92YXJfaW5fc3lucHJlZDY0M19mbWwxMzQ3NF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19JRF9pbl9zeW5wcmVkNjQzX2ZtbDEzNDc2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19JRF9pbl9zeW5wcmVkNjQzX2ZtbDEzNDc2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0lEX2luX3N5bnByZWQ2NDNfZm1sMTM0NzYJPSB7IEZPTExPV19JRF9pbl9zeW5wcmVkNjQzX2ZtbDEzNDc2X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9zeW5wcmVkNzA1X2ZtbDE0NzczICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fc3lucHJlZDcwNV9mbWwxNDc3M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMTAwMDAwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fc3lucHJlZDcwNV9mbWwxNDc3Mwk9IHsgRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9zeW5wcmVkNzA1X2ZtbDE0NzczX2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XXzE2NF9pbl9zeW5wcmVkNzA1X2ZtbDE0Nzc1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV18xNjRfaW5fc3lucHJlZDcwNV9mbWwxNDc3NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV18xNjRfaW5fc3lucHJlZDcwNV9mbWwxNDc3NQk9IHsgRk9MTE9XXzE2NF9pbl9zeW5wcmVkNzA1X2ZtbDE0Nzc1X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX3N0YXRlbWVudF9hc3NpZ25faW5fc3lucHJlZDcwOV9mbWwxNDk4MSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc3RhdGVtZW50X2Fzc2lnbl9pbl9zeW5wcmVkNzA5X2ZtbDE0OTgxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3N0YXRlbWVudF9hc3NpZ25faW5fc3lucHJlZDcwOV9mbWwxNDk4MQk9IHsgRk9MTE9XX3N0YXRlbWVudF9hc3NpZ25faW5fc3lucHJlZDcwOV9mbWwxNDk4MV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zdGF0ZW1lbnRfaW52b2tlX3JvdXRpbmVfaW5fc3lucHJlZDcxNF9mbWwxNTA4MyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc3RhdGVtZW50X2ludm9rZV9yb3V0aW5lX2luX3N5bnByZWQ3MTRfZm1sMTUwODNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc3RhdGVtZW50X2ludm9rZV9yb3V0aW5lX2luX3N5bnByZWQ3MTRfZm1sMTUwODMJPSB7IEZPTExPV19zdGF0ZW1lbnRfaW52b2tlX3JvdXRpbmVfaW5fc3lucHJlZDcxNF9mbWwxNTA4M19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19wcmVmaXhfc3RhdGVtZW50X2luX3N5bnByZWQ3NzhfZm1sMTYzNDYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3ByZWZpeF9zdGF0ZW1lbnRfaW5fc3lucHJlZDc3OF9mbWwxNjM0Nl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19wcmVmaXhfc3RhdGVtZW50X2luX3N5bnByZWQ3NzhfZm1sMTYzNDYJPSB7IEZPTExPV19wcmVmaXhfc3RhdGVtZW50X2luX3N5bnByZWQ3NzhfZm1sMTYzNDZfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfdW5hcnlFeHByZXNzaW9uX2luX3N5bnByZWQ3NzlfZm1sMTYzNjcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3VuYXJ5RXhwcmVzc2lvbl9pbl9zeW5wcmVkNzc5X2ZtbDE2MzY3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX3VuYXJ5RXhwcmVzc2lvbl9pbl9zeW5wcmVkNzc5X2ZtbDE2MzY3CT0geyBGT0xMT1dfdW5hcnlFeHByZXNzaW9uX2luX3N5bnByZWQ3NzlfZm1sMTYzNjdfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfcHJlZml4X2V4cHJlc3Npb25faW5fc3lucHJlZDc4MF9mbWwxNjQyNiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfcHJlZml4X2V4cHJlc3Npb25faW5fc3lucHJlZDc4MF9mbWwxNjQyNl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19wcmVmaXhfZXhwcmVzc2lvbl9pbl9zeW5wcmVkNzgwX2ZtbDE2NDI2CT0geyBGT0xMT1dfcHJlZml4X2V4cHJlc3Npb25faW5fc3lucHJlZDc4MF9mbWwxNjQyNl9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fc3lucHJlZDc4MV9mbWwxNjQ0NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfdW5hcnlFeHByZXNzaW9uX2luX3N5bnByZWQ3ODFfZm1sMTY0NDZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfdW5hcnlFeHByZXNzaW9uX2luX3N5bnByZWQ3ODFfZm1sMTY0NDYJPSB7IEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fc3lucHJlZDc4MV9mbWwxNjQ0Nl9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MUEFSRU5faW5fc3lucHJlZDgwMl9mbWwxNzA4NyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTFBBUkVOX2luX3N5bnByZWQ4MDJfZm1sMTcwODdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTFBBUkVOX2luX3N5bnByZWQ4MDJfZm1sMTcwODcJPSB7IEZPTExPV19MUEFSRU5faW5fc3lucHJlZDgwMl9mbWwxNzA4N19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MQ1VSTFlfaW5fc3lucHJlZDgwNF9mbWwxNzEzMCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTENVUkxZX2luX3N5bnByZWQ4MDRfZm1sMTcxMzBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTENVUkxZX2luX3N5bnByZWQ4MDRfZm1sMTcxMzAJPSB7IEZPTExPV19MQ1VSTFlfaW5fc3lucHJlZDgwNF9mbWwxNzEzMF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yNzdfaW5fc3lucHJlZDg2MV9mbWwxODQ1NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjc3X2luX3N5bnByZWQ4NjFfZm1sMTg0NTVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjc3X2luX3N5bnByZWQ4NjFfZm1sMTg0NTUJPSB7IEZPTExPV18yNzdfaW5fc3lucHJlZDg2MV9mbWwxODQ1NV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yNzdfaW5fc3lucHJlZDg3Ml9mbWwxODY4NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjc3X2luX3N5bnByZWQ4NzJfZm1sMTg2ODVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjc3X2luX3N5bnByZWQ4NzJfZm1sMTg2ODUJPSB7IEZPTExPV18yNzdfaW5fc3lucHJlZDg3Ml9mbWwxODY4NV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yNzRfaW5fc3lucHJlZDg5MV9mbWwxOTI0NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjc0X2luX3N5bnByZWQ4OTFfZm1sMTkyNDVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjc0X2luX3N5bnByZWQ4OTFfZm1sMTkyNDUJPSB7IEZPTExPV18yNzRfaW5fc3lucHJlZDg5MV9mbWwxOTI0NV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yNzNfaW5fc3lucHJlZDg5MV9mbWwxOTI0OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjczX2luX3N5bnByZWQ4OTFfZm1sMTkyNDlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDQwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjczX2luX3N5bnByZWQ4OTFfZm1sMTkyNDkJPSB7IEZPTExPV18yNzNfaW5fc3lucHJlZDg5MV9mbWwxOTI0OV9iaXRzLCA1CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV18yOTRfaW5fc3lucHJlZDg5MV9mbWwxOTI1MSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfMjk0X2luX3N5bnByZWQ4OTFfZm1sMTkyNTFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfMjk0X2luX3N5bnByZWQ4OTFfZm1sMTkyNTEJPSB7IEZPTExPV18yOTRfaW5fc3lucHJlZDg5MV9mbWwxOTI1MV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ4OTFfZm1sMTkyNTggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDg5MV9mbWwxOTI1OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMSkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ4OTFfZm1sMTkyNTgJPSB7IEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ4OTFfZm1sMTkyNThfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX3N5bnByZWQ4OTFfZm1sMTkyNjMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9zeW5wcmVkODkxX2ZtbDE5MjYzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9zeW5wcmVkODkxX2ZtbDE5MjYzCT0geyBGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX3N5bnByZWQ4OTFfZm1sMTkyNjNfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjc0X2luX3N5bnByZWQ4OTRfZm1sMTkzNTAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzI3NF9pbl9zeW5wcmVkODk0X2ZtbDE5MzUwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzI3NF9pbl9zeW5wcmVkODk0X2ZtbDE5MzUwCT0geyBGT0xMT1dfMjc0X2luX3N5bnByZWQ4OTRfZm1sMTkzNTBfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjczX2luX3N5bnByZWQ4OTRfZm1sMTkzNTQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzI3M19pbl9zeW5wcmVkODk0X2ZtbDE5MzU0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDA0MDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzI3M19pbl9zeW5wcmVkODk0X2ZtbDE5MzU0CT0geyBGT0xMT1dfMjczX2luX3N5bnByZWQ4OTRfZm1sMTkzNTRfYml0cywgNQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfMjk0X2luX3N5bnByZWQ4OTRfZm1sMTkzNTYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XXzI5NF9pbl9zeW5wcmVkODk0X2ZtbDE5MzU2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XXzI5NF9pbl9zeW5wcmVkODk0X2ZtbDE5MzU2CT0geyBGT0xMT1dfMjk0X2luX3N5bnByZWQ4OTRfZm1sMTkzNTZfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkODk0X2ZtbDE5MzYyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ4OTRfZm1sMTkzNjJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDEpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkODk0X2ZtbDE5MzYyCT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkODk0X2ZtbDE5MzYyX2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xDVVJMWV9pbl9zeW5wcmVkODk0X2ZtbDE5MzY1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MQ1VSTFlfaW5fc3lucHJlZDg5NF9mbWwxOTM2NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MQ1VSTFlfaW5fc3lucHJlZDg5NF9mbWwxOTM2NQk9IHsgRk9MTE9XX0xDVVJMWV9pbl9zeW5wcmVkODk0X2ZtbDE5MzY1X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDg5NF9mbWwxOTM3MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkODk0X2ZtbDE5MzcwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgyMDAwMDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDg5NF9mbWwxOTM3MAk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDg5NF9mbWwxOTM3MF9iaXRzLCAyCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19SQ1VSTFlfaW5fc3lucHJlZDg5NF9mbWwxOTM3MyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfUkNVUkxZX2luX3N5bnByZWQ4OTRfZm1sMTkzNzNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUkNVUkxZX2luX3N5bnByZWQ4OTRfZm1sMTkzNzMJPSB7IEZPTExPV19SQ1VSTFlfaW5fc3lucHJlZDg5NF9mbWwxOTM3M19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19mb3JfYXNzaWduX2hlYWRlcl9pbl9zeW5wcmVkODk2X2ZtbDE5NDYwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19mb3JfYXNzaWduX2hlYWRlcl9pbl9zeW5wcmVkODk2X2ZtbDE5NDYwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDgwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2Zvcl9hc3NpZ25faGVhZGVyX2luX3N5bnByZWQ4OTZfZm1sMTk0NjAJPSB7IEZPTExPV19mb3JfYXNzaWduX2hlYWRlcl9pbl9zeW5wcmVkODk2X2ZtbDE5NDYwX2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1NFTUlfaW5fc3lucHJlZDg5Nl9mbWwxOTQ2MyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU0VNSV9pbl9zeW5wcmVkODk2X2ZtbDE5NDYzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1NFTUlfaW5fc3lucHJlZDg5Nl9mbWwxOTQ2Mwk9IHsgRk9MTE9XX1NFTUlfaW5fc3lucHJlZDg5Nl9mbWwxOTQ2M19iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ4OTZfZm1sMTk0NjggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDg5Nl9mbWwxOTQ2OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ4OTZfZm1sMTk0NjgJPSB7IEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ4OTZfZm1sMTk0NjhfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfU0VNSV9pbl9zeW5wcmVkODk2X2ZtbDE5NDcxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19TRU1JX2luX3N5bnByZWQ4OTZfZm1sMTk0NzFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMEMwMDAwMDQ0MDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfU0VNSV9pbl9zeW5wcmVkODk2X2ZtbDE5NDcxCT0geyBGT0xMT1dfU0VNSV9pbl9zeW5wcmVkODk2X2ZtbDE5NDcxX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2Zvcl9hc3NpZ25faGVhZGVyX2luX3N5bnByZWQ4OTZfZm1sMTk0NzYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2Zvcl9hc3NpZ25faGVhZGVyX2luX3N5bnByZWQ4OTZfZm1sMTk0NzZfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZm9yX2Fzc2lnbl9oZWFkZXJfaW5fc3lucHJlZDg5Nl9mbWwxOTQ3Ngk9IHsgRk9MTE9XX2Zvcl9hc3NpZ25faGVhZGVyX2luX3N5bnByZWQ4OTZfZm1sMTk0NzZfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTFBBUkVOX2luX3N5bnByZWQ4OTdfZm1sMTk0OTUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xQQVJFTl9pbl9zeW5wcmVkODk3X2ZtbDE5NDk1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDBDMDAwMDA0NDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xQQVJFTl9pbl9zeW5wcmVkODk3X2ZtbDE5NDk1CT0geyBGT0xMT1dfTFBBUkVOX2luX3N5bnByZWQ4OTdfZm1sMTk0OTVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZm9yX2Fzc2lnbl9oZWFkZXJfaW5fc3lucHJlZDg5N19mbWwxOTUwNiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZm9yX2Fzc2lnbl9oZWFkZXJfaW5fc3lucHJlZDg5N19mbWwxOTUwNl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDA4MCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19mb3JfYXNzaWduX2hlYWRlcl9pbl9zeW5wcmVkODk3X2ZtbDE5NTA2CT0geyBGT0xMT1dfZm9yX2Fzc2lnbl9oZWFkZXJfaW5fc3lucHJlZDg5N19mbWwxOTUwNl9iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19TRU1JX2luX3N5bnByZWQ4OTdfZm1sMTk1MDkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1NFTUlfaW5fc3lucHJlZDg5N19mbWwxOTUwOV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19TRU1JX2luX3N5bnByZWQ4OTdfZm1sMTk1MDkJPSB7IEZPTExPV19TRU1JX2luX3N5bnByZWQ4OTdfZm1sMTk1MDlfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkODk3X2ZtbDE5NTE0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ4OTdfZm1sMTk1MTRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwODApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkODk3X2ZtbDE5NTE0CT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkODk3X2ZtbDE5NTE0X2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1NFTUlfaW5fc3lucHJlZDg5N19mbWwxOTUxNyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU0VNSV9pbl9zeW5wcmVkODk3X2ZtbDE5NTE3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDBDMDAwMDA0NDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1NFTUlfaW5fc3lucHJlZDg5N19mbWwxOTUxNwk9IHsgRk9MTE9XX1NFTUlfaW5fc3lucHJlZDg5N19mbWwxOTUxN19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19mb3JfYXNzaWduX2hlYWRlcl9pbl9zeW5wcmVkODk3X2ZtbDE5NTIyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19mb3JfYXNzaWduX2hlYWRlcl9pbl9zeW5wcmVkODk3X2ZtbDE5NTIyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2Zvcl9hc3NpZ25faGVhZGVyX2luX3N5bnByZWQ4OTdfZm1sMTk1MjIJPSB7IEZPTExPV19mb3JfYXNzaWduX2hlYWRlcl9pbl9zeW5wcmVkODk3X2ZtbDE5NTIyX2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1JQQVJFTl9pbl9zeW5wcmVkODk3X2ZtbDE5NTI5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19SUEFSRU5faW5fc3lucHJlZDg5N19mbWwxOTUyOV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19SUEFSRU5faW5fc3lucHJlZDg5N19mbWwxOTUyOQk9IHsgRk9MTE9XX1JQQVJFTl9pbl9zeW5wcmVkODk3X2ZtbDE5NTI5X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2x2YWx1ZV9pbl9zeW5wcmVkODk4X2ZtbDE5NTUwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19sdmFsdWVfaW5fc3lucHJlZDg5OF9mbWwxOTU1MF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDIwMDAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19sdmFsdWVfaW5fc3lucHJlZDg5OF9mbWwxOTU1MAk9IHsgRk9MTE9XX2x2YWx1ZV9pbl9zeW5wcmVkODk4X2ZtbDE5NTUwX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0NPTE9OX2luX3N5bnByZWQ4OThfZm1sMTk1NTMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0NPTE9OX2luX3N5bnByZWQ4OThfZm1sMTk1NTNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQ09MT05faW5fc3lucHJlZDg5OF9mbWwxOTU1Mwk9IHsgRk9MTE9XX0NPTE9OX2luX3N5bnByZWQ4OThfZm1sMTk1NTNfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkODk4X2ZtbDE5NTU4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ4OThfZm1sMTk1NThfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkODk4X2ZtbDE5NTU4CT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkODk4X2ZtbDE5NTU4X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xQQVJFTl9pbl9zeW5wcmVkOTQ2X2ZtbDIwNjE0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MUEFSRU5faW5fc3lucHJlZDk0Nl9mbWwyMDYxNF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MUEFSRU5faW5fc3lucHJlZDk0Nl9mbWwyMDYxNAk9IHsgRk9MTE9XX0xQQVJFTl9pbl9zeW5wcmVkOTQ2X2ZtbDIwNjE0X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2xhYmVsbGVkX2FyZ3VtZW50X2luX3N5bnByZWQ5NDZfZm1sMjA2MjMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2xhYmVsbGVkX2FyZ3VtZW50X2luX3N5bnByZWQ5NDZfZm1sMjA2MjNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDA4MDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5fc3lucHJlZDk0Nl9mbWwyMDYyMwk9IHsgRk9MTE9XX2xhYmVsbGVkX2FyZ3VtZW50X2luX3N5bnByZWQ5NDZfZm1sMjA2MjNfYml0cywgMwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfQ09NTUFfaW5fc3lucHJlZDk0Nl9mbWwyMDYzOSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQ09NTUFfaW5fc3lucHJlZDk0Nl9mbWwyMDYzOV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19DT01NQV9pbl9zeW5wcmVkOTQ2X2ZtbDIwNjM5CT0geyBGT0xMT1dfQ09NTUFfaW5fc3lucHJlZDk0Nl9mbWwyMDYzOV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9zeW5wcmVkOTQ2X2ZtbDIwNjUwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9zeW5wcmVkOTQ2X2ZtbDIwNjUwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwODAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2xhYmVsbGVkX2FyZ3VtZW50X2luX3N5bnByZWQ5NDZfZm1sMjA2NTAJPSB7IEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9zeW5wcmVkOTQ2X2ZtbDIwNjUwX2JpdHMsIDMJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1JQQVJFTl9pbl9zeW5wcmVkOTQ2X2ZtbDIwNjc0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19SUEFSRU5faW5fc3lucHJlZDk0Nl9mbWwyMDY3NF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19SUEFSRU5faW5fc3lucHJlZDk0Nl9mbWwyMDY3NAk9IHsgRk9MTE9XX1JQQVJFTl9pbl9zeW5wcmVkOTQ2X2ZtbDIwNjc0X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0FTU0lHTl9pbl9zeW5wcmVkOTQ3X2ZtbDIwNzY2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19BU1NJR05faW5fc3lucHJlZDk0N19mbWwyMDc2Nl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19BU1NJR05faW5fc3lucHJlZDk0N19mbWwyMDc2Ngk9IHsgRk9MTE9XX0FTU0lHTl9pbl9zeW5wcmVkOTQ3X2ZtbDIwNzY2X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk0N19mbWwyMDc3MSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTQ3X2ZtbDIwNzcxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk0N19mbWwyMDc3MQk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk0N19mbWwyMDc3MV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19BU1NJR05fTUFDUk9faW5fc3lucHJlZDk0OF9mbWwyMDc4MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQVNTSUdOX01BQ1JPX2luX3N5bnByZWQ5NDhfZm1sMjA3ODBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQVNTSUdOX01BQ1JPX2luX3N5bnByZWQ5NDhfZm1sMjA3ODAJPSB7IEZPTExPV19BU1NJR05fTUFDUk9faW5fc3lucHJlZDk0OF9mbWwyMDc4MF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NDhfZm1sMjA3ODUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk0OF9mbWwyMDc4NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NDhfZm1sMjA3ODUJPSB7IEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NDhfZm1sMjA3ODVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfQVNTSUdOX0FGVEVSX2luX3N5bnByZWQ5NDlfZm1sMjA3OTQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0FTU0lHTl9BRlRFUl9pbl9zeW5wcmVkOTQ5X2ZtbDIwNzk0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0FTU0lHTl9BRlRFUl9pbl9zeW5wcmVkOTQ5X2ZtbDIwNzk0CT0geyBGT0xMT1dfQVNTSUdOX0FGVEVSX2luX3N5bnByZWQ5NDlfZm1sMjA3OTRfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTQ5X2ZtbDIwNzk5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NDlfZm1sMjA3OTlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTQ5X2ZtbDIwNzk5CT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTQ5X2ZtbDIwNzk5X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1BMVVNfQVNTSUdOX2luX3N5bnByZWQ5NTBfZm1sMjA4MDggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1BMVVNfQVNTSUdOX2luX3N5bnByZWQ5NTBfZm1sMjA4MDhfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUExVU19BU1NJR05faW5fc3lucHJlZDk1MF9mbWwyMDgwOAk9IHsgRk9MTE9XX1BMVVNfQVNTSUdOX2luX3N5bnByZWQ5NTBfZm1sMjA4MDhfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTUwX2ZtbDIwODEzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NTBfZm1sMjA4MTNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTUwX2ZtbDIwODEzCT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTUwX2ZtbDIwODEzX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1BMVVNfQVNTSUdOX0FGVEVSX2luX3N5bnByZWQ5NTFfZm1sMjA4MjIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1BMVVNfQVNTSUdOX0FGVEVSX2luX3N5bnByZWQ5NTFfZm1sMjA4MjJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfUExVU19BU1NJR05fQUZURVJfaW5fc3lucHJlZDk1MV9mbWwyMDgyMgk9IHsgRk9MTE9XX1BMVVNfQVNTSUdOX0FGVEVSX2luX3N5bnByZWQ5NTFfZm1sMjA4MjJfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTUxX2ZtbDIwODI3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NTFfZm1sMjA4MjdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTUxX2ZtbDIwODI3CT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTUxX2ZtbDIwODI3X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX01JTlVTX0FTU0lHTl9pbl9zeW5wcmVkOTUyX2ZtbDIwODM2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19NSU5VU19BU1NJR05faW5fc3lucHJlZDk1Ml9mbWwyMDgzNl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19NSU5VU19BU1NJR05faW5fc3lucHJlZDk1Ml9mbWwyMDgzNgk9IHsgRk9MTE9XX01JTlVTX0FTU0lHTl9pbl9zeW5wcmVkOTUyX2ZtbDIwODM2X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk1Ml9mbWwyMDg0MSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTUyX2ZtbDIwODQxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk1Ml9mbWwyMDg0MQk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk1Ml9mbWwyMDg0MV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19NSU5VU19BU1NJR05fQUZURVJfaW5fc3lucHJlZDk1M19mbWwyMDg1MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTUlOVVNfQVNTSUdOX0FGVEVSX2luX3N5bnByZWQ5NTNfZm1sMjA4NTBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTUlOVVNfQVNTSUdOX0FGVEVSX2luX3N5bnByZWQ5NTNfZm1sMjA4NTAJPSB7IEZPTExPV19NSU5VU19BU1NJR05fQUZURVJfaW5fc3lucHJlZDk1M19mbWwyMDg1MF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NTNfZm1sMjA4NTUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk1M19mbWwyMDg1NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NTNfZm1sMjA4NTUJPSB7IEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NTNfZm1sMjA4NTVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfU1RBUl9BU1NJR05faW5fc3lucHJlZDk1NF9mbWwyMDg2NCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU1RBUl9BU1NJR05faW5fc3lucHJlZDk1NF9mbWwyMDg2NF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19TVEFSX0FTU0lHTl9pbl9zeW5wcmVkOTU0X2ZtbDIwODY0CT0geyBGT0xMT1dfU1RBUl9BU1NJR05faW5fc3lucHJlZDk1NF9mbWwyMDg2NF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NTRfZm1sMjA4NjkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk1NF9mbWwyMDg2OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NTRfZm1sMjA4NjkJPSB7IEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NTRfZm1sMjA4NjlfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfU1RBUl9BU1NJR05fQUZURVJfaW5fc3lucHJlZDk1NV9mbWwyMDg3OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfU1RBUl9BU1NJR05fQUZURVJfaW5fc3lucHJlZDk1NV9mbWwyMDg3OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19TVEFSX0FTU0lHTl9BRlRFUl9pbl9zeW5wcmVkOTU1X2ZtbDIwODc4CT0geyBGT0xMT1dfU1RBUl9BU1NJR05fQUZURVJfaW5fc3lucHJlZDk1NV9mbWwyMDg3OF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NTVfZm1sMjA4ODMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk1NV9mbWwyMDg4M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NTVfZm1sMjA4ODMJPSB7IEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NTVfZm1sMjA4ODNfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfRElWX0FTU0lHTl9pbl9zeW5wcmVkOTU2X2ZtbDIwODkyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19ESVZfQVNTSUdOX2luX3N5bnByZWQ5NTZfZm1sMjA4OTJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfRElWX0FTU0lHTl9pbl9zeW5wcmVkOTU2X2ZtbDIwODkyCT0geyBGT0xMT1dfRElWX0FTU0lHTl9pbl9zeW5wcmVkOTU2X2ZtbDIwODkyX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk1Nl9mbWwyMDg5NyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTU2X2ZtbDIwODk3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk1Nl9mbWwyMDg5Nwk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk1Nl9mbWwyMDg5N19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19ESVZfQVNTSUdOX0FGVEVSX2luX3N5bnByZWQ5NTdfZm1sMjA5MDYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0RJVl9BU1NJR05fQUZURVJfaW5fc3lucHJlZDk1N19mbWwyMDkwNl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19ESVZfQVNTSUdOX0FGVEVSX2luX3N5bnByZWQ5NTdfZm1sMjA5MDYJPSB7IEZPTExPV19ESVZfQVNTSUdOX0FGVEVSX2luX3N5bnByZWQ5NTdfZm1sMjA5MDZfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTU3X2ZtbDIwOTExICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NTdfZm1sMjA5MTFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTU3X2ZtbDIwOTExCT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTU3X2ZtbDIwOTExX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX01PRF9BU1NJR05faW5fc3lucHJlZDk1OF9mbWwyMDkyMCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTU9EX0FTU0lHTl9pbl9zeW5wcmVkOTU4X2ZtbDIwOTIwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX01PRF9BU1NJR05faW5fc3lucHJlZDk1OF9mbWwyMDkyMAk9IHsgRk9MTE9XX01PRF9BU1NJR05faW5fc3lucHJlZDk1OF9mbWwyMDkyMF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NThfZm1sMjA5MjUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk1OF9mbWwyMDkyNV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NThfZm1sMjA5MjUJPSB7IEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NThfZm1sMjA5MjVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTU9EX0FTU0lHTl9BRlRFUl9pbl9zeW5wcmVkOTU5X2ZtbDIwOTM0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19NT0RfQVNTSUdOX0FGVEVSX2luX3N5bnByZWQ5NTlfZm1sMjA5MzRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTU9EX0FTU0lHTl9BRlRFUl9pbl9zeW5wcmVkOTU5X2ZtbDIwOTM0CT0geyBGT0xMT1dfTU9EX0FTU0lHTl9BRlRFUl9pbl9zeW5wcmVkOTU5X2ZtbDIwOTM0X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk1OV9mbWwyMDkzOSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTU5X2ZtbDIwOTM5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk1OV9mbWwyMDkzOQk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk1OV9mbWwyMDkzOV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MQU5EX0FTU0lHTl9pbl9zeW5wcmVkOTYwX2ZtbDIwOTQ4ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MQU5EX0FTU0lHTl9pbl9zeW5wcmVkOTYwX2ZtbDIwOTQ4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xBTkRfQVNTSUdOX2luX3N5bnByZWQ5NjBfZm1sMjA5NDgJPSB7IEZPTExPV19MQU5EX0FTU0lHTl9pbl9zeW5wcmVkOTYwX2ZtbDIwOTQ4X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk2MF9mbWwyMDk1MyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTYwX2ZtbDIwOTUzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk2MF9mbWwyMDk1Mwk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk2MF9mbWwyMDk1M19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MQU5EX0FTU0lHTl9BRlRFUl9pbl9zeW5wcmVkOTYxX2ZtbDIwOTYyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MQU5EX0FTU0lHTl9BRlRFUl9pbl9zeW5wcmVkOTYxX2ZtbDIwOTYyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xBTkRfQVNTSUdOX0FGVEVSX2luX3N5bnByZWQ5NjFfZm1sMjA5NjIJPSB7IEZPTExPV19MQU5EX0FTU0lHTl9BRlRFUl9pbl9zeW5wcmVkOTYxX2ZtbDIwOTYyX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk2MV9mbWwyMDk2NyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTYxX2ZtbDIwOTY3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk2MV9mbWwyMDk2Nwk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk2MV9mbWwyMDk2N19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MT1JfQVNTSUdOX2luX3N5bnByZWQ5NjJfZm1sMjA5NzYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xPUl9BU1NJR05faW5fc3lucHJlZDk2Ml9mbWwyMDk3Nl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MT1JfQVNTSUdOX2luX3N5bnByZWQ5NjJfZm1sMjA5NzYJPSB7IEZPTExPV19MT1JfQVNTSUdOX2luX3N5bnByZWQ5NjJfZm1sMjA5NzZfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTYyX2ZtbDIwOTgxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NjJfZm1sMjA5ODFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTYyX2ZtbDIwOTgxCT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTYyX2ZtbDIwOTgxX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xPUl9BU1NJR05fQUZURVJfaW5fc3lucHJlZDk2M19mbWwyMDk5MCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTE9SX0FTU0lHTl9BRlRFUl9pbl9zeW5wcmVkOTYzX2ZtbDIwOTkwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xPUl9BU1NJR05fQUZURVJfaW5fc3lucHJlZDk2M19mbWwyMDk5MAk9IHsgRk9MTE9XX0xPUl9BU1NJR05fQUZURVJfaW5fc3lucHJlZDk2M19mbWwyMDk5MF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NjNfZm1sMjA5OTUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk2M19mbWwyMDk5NV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NjNfZm1sMjA5OTUJPSB7IEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NjNfZm1sMjA5OTVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfQkFORF9BU1NJR05faW5fc3lucHJlZDk2NF9mbWwyMTAwNCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQkFORF9BU1NJR05faW5fc3lucHJlZDk2NF9mbWwyMTAwNF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19CQU5EX0FTU0lHTl9pbl9zeW5wcmVkOTY0X2ZtbDIxMDA0CT0geyBGT0xMT1dfQkFORF9BU1NJR05faW5fc3lucHJlZDk2NF9mbWwyMTAwNF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NjRfZm1sMjEwMDkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk2NF9mbWwyMTAwOV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NjRfZm1sMjEwMDkJPSB7IEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NjRfZm1sMjEwMDlfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfQkFORF9BU1NJR05fQUZURVJfaW5fc3lucHJlZDk2NV9mbWwyMTAxOCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQkFORF9BU1NJR05fQUZURVJfaW5fc3lucHJlZDk2NV9mbWwyMTAxOF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19CQU5EX0FTU0lHTl9BRlRFUl9pbl9zeW5wcmVkOTY1X2ZtbDIxMDE4CT0geyBGT0xMT1dfQkFORF9BU1NJR05fQUZURVJfaW5fc3lucHJlZDk2NV9mbWwyMTAxOF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NjVfZm1sMjEwMjMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk2NV9mbWwyMTAyM19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NjVfZm1sMjEwMjMJPSB7IEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NjVfZm1sMjEwMjNfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfQk9SX0FTU0lHTl9pbl9zeW5wcmVkOTY2X2ZtbDIxMDMyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19CT1JfQVNTSUdOX2luX3N5bnByZWQ5NjZfZm1sMjEwMzJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQk9SX0FTU0lHTl9pbl9zeW5wcmVkOTY2X2ZtbDIxMDMyCT0geyBGT0xMT1dfQk9SX0FTU0lHTl9pbl9zeW5wcmVkOTY2X2ZtbDIxMDMyX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk2Nl9mbWwyMTAzNyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTY2X2ZtbDIxMDM3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk2Nl9mbWwyMTAzNwk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk2Nl9mbWwyMTAzN19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19CT1JfQVNTSUdOX0FGVEVSX2luX3N5bnByZWQ5NjdfZm1sMjEwNDYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0JPUl9BU1NJR05fQUZURVJfaW5fc3lucHJlZDk2N19mbWwyMTA0Nl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19CT1JfQVNTSUdOX0FGVEVSX2luX3N5bnByZWQ5NjdfZm1sMjEwNDYJPSB7IEZPTExPV19CT1JfQVNTSUdOX0FGVEVSX2luX3N5bnByZWQ5NjdfZm1sMjEwNDZfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTY3X2ZtbDIxMDUxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NjdfZm1sMjEwNTFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTY3X2ZtbDIxMDUxCT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTY3X2ZtbDIxMDUxX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0JYT1JfQVNTSUdOX2luX3N5bnByZWQ5NjhfZm1sMjEwNjAgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0JYT1JfQVNTSUdOX2luX3N5bnByZWQ5NjhfZm1sMjEwNjBfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQlhPUl9BU1NJR05faW5fc3lucHJlZDk2OF9mbWwyMTA2MAk9IHsgRk9MTE9XX0JYT1JfQVNTSUdOX2luX3N5bnByZWQ5NjhfZm1sMjEwNjBfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTY4X2ZtbDIxMDY1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NjhfZm1sMjEwNjVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTY4X2ZtbDIxMDY1CT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTY4X2ZtbDIxMDY1X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0JYT1JfQVNTSUdOX0FGVEVSX2luX3N5bnByZWQ5NjlfZm1sMjEwNzQgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0JYT1JfQVNTSUdOX0FGVEVSX2luX3N5bnByZWQ5NjlfZm1sMjEwNzRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQlhPUl9BU1NJR05fQUZURVJfaW5fc3lucHJlZDk2OV9mbWwyMTA3NAk9IHsgRk9MTE9XX0JYT1JfQVNTSUdOX0FGVEVSX2luX3N5bnByZWQ5NjlfZm1sMjEwNzRfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTY5X2ZtbDIxMDc5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NjlfZm1sMjEwNzlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTY5X2ZtbDIxMDc5CT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTY5X2ZtbDIxMDc5X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xTSElGVF9BU1NJR05faW5fc3lucHJlZDk3MF9mbWwyMTA4OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTFNISUZUX0FTU0lHTl9pbl9zeW5wcmVkOTcwX2ZtbDIxMDg4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xTSElGVF9BU1NJR05faW5fc3lucHJlZDk3MF9mbWwyMTA4OAk9IHsgRk9MTE9XX0xTSElGVF9BU1NJR05faW5fc3lucHJlZDk3MF9mbWwyMTA4OF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NzBfZm1sMjEwOTMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk3MF9mbWwyMTA5M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NzBfZm1sMjEwOTMJPSB7IEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NzBfZm1sMjEwOTNfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTFNISUZUX0FTU0lHTl9BRlRFUl9pbl9zeW5wcmVkOTcxX2ZtbDIxMTAyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MU0hJRlRfQVNTSUdOX0FGVEVSX2luX3N5bnByZWQ5NzFfZm1sMjExMDJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTFNISUZUX0FTU0lHTl9BRlRFUl9pbl9zeW5wcmVkOTcxX2ZtbDIxMTAyCT0geyBGT0xMT1dfTFNISUZUX0FTU0lHTl9BRlRFUl9pbl9zeW5wcmVkOTcxX2ZtbDIxMTAyX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk3MV9mbWwyMTEwNyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTcxX2ZtbDIxMTA3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk3MV9mbWwyMTEwNwk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk3MV9mbWwyMTEwN19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19SU0hJRlRfQVNTSUdOX2luX3N5bnByZWQ5NzJfZm1sMjExMTYgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1JTSElGVF9BU1NJR05faW5fc3lucHJlZDk3Ml9mbWwyMTExNl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19SU0hJRlRfQVNTSUdOX2luX3N5bnByZWQ5NzJfZm1sMjExMTYJPSB7IEZPTExPV19SU0hJRlRfQVNTSUdOX2luX3N5bnByZWQ5NzJfZm1sMjExMTZfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTcyX2ZtbDIxMTIxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NzJfZm1sMjExMjFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTcyX2ZtbDIxMTIxCT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTcyX2ZtbDIxMTIxX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1JTSElGVF9BU1NJR05fQUZURVJfaW5fc3lucHJlZDk3M19mbWwyMTEzMCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfUlNISUZUX0FTU0lHTl9BRlRFUl9pbl9zeW5wcmVkOTczX2ZtbDIxMTMwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1JTSElGVF9BU1NJR05fQUZURVJfaW5fc3lucHJlZDk3M19mbWwyMTEzMAk9IHsgRk9MTE9XX1JTSElGVF9BU1NJR05fQUZURVJfaW5fc3lucHJlZDk3M19mbWwyMTEzMF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NzNfZm1sMjExMzUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk3M19mbWwyMTEzNV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NzNfZm1sMjExMzUJPSB7IEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NzNfZm1sMjExMzVfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfT1BfUFVTSF9pbl9zeW5wcmVkOTc0X2ZtbDIxMTQ0ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19PUF9QVVNIX2luX3N5bnByZWQ5NzRfZm1sMjExNDRfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfT1BfUFVTSF9pbl9zeW5wcmVkOTc0X2ZtbDIxMTQ0CT0geyBGT0xMT1dfT1BfUFVTSF9pbl9zeW5wcmVkOTc0X2ZtbDIxMTQ0X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk3NF9mbWwyMTE0OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTc0X2ZtbDIxMTQ5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk3NF9mbWwyMTE0OQk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk3NF9mbWwyMTE0OV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19PUF9BU1NJR05fVE9QX2luX3N5bnByZWQ5NzVfZm1sMjExNTggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX09QX0FTU0lHTl9UT1BfaW5fc3lucHJlZDk3NV9mbWwyMTE1OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19PUF9BU1NJR05fVE9QX2luX3N5bnByZWQ5NzVfZm1sMjExNTgJPSB7IEZPTExPV19PUF9BU1NJR05fVE9QX2luX3N5bnByZWQ5NzVfZm1sMjExNThfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTc1X2ZtbDIxMTYzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NzVfZm1sMjExNjNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTc1X2ZtbDIxMTYzCT0geyBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTc1X2ZtbDIxMTYzX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX09QX1BPUF9pbl9zeW5wcmVkOTc2X2ZtbDIxMTcyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19PUF9QT1BfaW5fc3lucHJlZDk3Nl9mbWwyMTE3Ml9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19PUF9QT1BfaW5fc3lucHJlZDk3Nl9mbWwyMTE3Mgk9IHsgRk9MTE9XX09QX1BPUF9pbl9zeW5wcmVkOTc2X2ZtbDIxMTcyX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk3Nl9mbWwyMTE3NyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTc2X2ZtbDIxMTc3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk3Nl9mbWwyMTE3Nwk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk3Nl9mbWwyMTE3N19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19RVUVTVElPTl9pbl9zeW5wcmVkOTc3X2ZtbDIxMjE1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19RVUVTVElPTl9pbl9zeW5wcmVkOTc3X2ZtbDIxMjE1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1FVRVNUSU9OX2luX3N5bnByZWQ5NzdfZm1sMjEyMTUJPSB7IEZPTExPV19RVUVTVElPTl9pbl9zeW5wcmVkOTc3X2ZtbDIxMjE1X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk3N19mbWwyMTIyMCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTc3X2ZtbDIxMjIwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMjAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk3N19mbWwyMTIyMAk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk3N19mbWwyMTIyMF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19DT0xPTl9pbl9zeW5wcmVkOTc3X2ZtbDIxMjIzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19DT0xPTl9pbl9zeW5wcmVkOTc3X2ZtbDIxMjIzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0NPTE9OX2luX3N5bnByZWQ5NzdfZm1sMjEyMjMJPSB7IEZPTExPV19DT0xPTl9pbl9zeW5wcmVkOTc3X2ZtbDIxMjIzX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk3N19mbWwyMTIyOCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTc3X2ZtbDIxMjI4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk3N19mbWwyMTIyOAk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk3N19mbWwyMTIyOF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19vcF9zZXF1ZW5jZV9pbl9zeW5wcmVkOTgwX2ZtbDIxMjcwICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19vcF9zZXF1ZW5jZV9pbl9zeW5wcmVkOTgwX2ZtbDIxMjcwX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX29wX3NlcXVlbmNlX2luX3N5bnByZWQ5ODBfZm1sMjEyNzAJPSB7IEZPTExPV19vcF9zZXF1ZW5jZV9pbl9zeW5wcmVkOTgwX2ZtbDIxMjcwX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX29wX3NjaGVkdWxpbmdfaW5fc3lucHJlZDk4MF9mbWwyMTI3OCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfb3Bfc2NoZWR1bGluZ19pbl9zeW5wcmVkOTgwX2ZtbDIxMjc4X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX29wX3NjaGVkdWxpbmdfaW5fc3lucHJlZDk4MF9mbWwyMTI3OAk9IHsgRk9MTE9XX29wX3NjaGVkdWxpbmdfaW5fc3lucHJlZDk4MF9mbWwyMTI3OF9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19vcF9jb25jdXJyZW5jeV9pbl9zeW5wcmVkOTgwX2ZtbDIxMjg2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19vcF9jb25jdXJyZW5jeV9pbl9zeW5wcmVkOTgwX2ZtbDIxMjg2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX29wX2NvbmN1cnJlbmN5X2luX3N5bnByZWQ5ODBfZm1sMjEyODYJPSB7IEZPTExPV19vcF9jb25jdXJyZW5jeV9pbl9zeW5wcmVkOTgwX2ZtbDIxMjg2X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2NvbmRpdGlvbmFsT3JFeHByZXNzaW9uX2luX3N5bnByZWQ5ODBfZm1sMjEyOTcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2NvbmRpdGlvbmFsT3JFeHByZXNzaW9uX2luX3N5bnByZWQ5ODBfZm1sMjEyOTdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfY29uZGl0aW9uYWxPckV4cHJlc3Npb25faW5fc3lucHJlZDk4MF9mbWwyMTI5Nwk9IHsgRk9MTE9XX2NvbmRpdGlvbmFsT3JFeHByZXNzaW9uX2luX3N5bnByZWQ5ODBfZm1sMjEyOTdfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTE9SX2luX3N5bnByZWQ5ODFfZm1sMjEzMzMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xPUl9pbl9zeW5wcmVkOTgxX2ZtbDIxMzMzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0xPUl9pbl9zeW5wcmVkOTgxX2ZtbDIxMzMzCT0geyBGT0xMT1dfTE9SX2luX3N5bnByZWQ5ODFfZm1sMjEzMzNfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfY29uZGl0aW9uYWxBbmRFeHByZXNzaW9uX2luX3N5bnByZWQ5ODFfZm1sMjEzMzcgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2NvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbl9pbl9zeW5wcmVkOTgxX2ZtbDIxMzM3X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2NvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbl9pbl9zeW5wcmVkOTgxX2ZtbDIxMzM3CT0geyBGT0xMT1dfY29uZGl0aW9uYWxBbmRFeHByZXNzaW9uX2luX3N5bnByZWQ5ODFfZm1sMjEzMzdfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfTEFORF9pbl9zeW5wcmVkOTgyX2ZtbDIxMzc1ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MQU5EX2luX3N5bnByZWQ5ODJfZm1sMjEzNzVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTEFORF9pbl9zeW5wcmVkOTgyX2ZtbDIxMzc1CT0geyBGT0xMT1dfTEFORF9pbl9zeW5wcmVkOTgyX2ZtbDIxMzc1X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2JpdHdpc2VPckV4cHJlc3Npb25faW5fc3lucHJlZDk4Ml9mbWwyMTM3OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfYml0d2lzZU9yRXhwcmVzc2lvbl9pbl9zeW5wcmVkOTgyX2ZtbDIxMzc5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2JpdHdpc2VPckV4cHJlc3Npb25faW5fc3lucHJlZDk4Ml9mbWwyMTM3OQk9IHsgRk9MTE9XX2JpdHdpc2VPckV4cHJlc3Npb25faW5fc3lucHJlZDk4Ml9mbWwyMTM3OV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19CT1JfaW5fc3lucHJlZDk4M19mbWwyMTQxNyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQk9SX2luX3N5bnByZWQ5ODNfZm1sMjE0MTdfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfQk9SX2luX3N5bnByZWQ5ODNfZm1sMjE0MTcJPSB7IEZPTExPV19CT1JfaW5fc3lucHJlZDk4M19mbWwyMTQxN19iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19iaXR3aXNlWG9yRXhwcmVzc2lvbl9pbl9zeW5wcmVkOTgzX2ZtbDIxNDIxICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19iaXR3aXNlWG9yRXhwcmVzc2lvbl9pbl9zeW5wcmVkOTgzX2ZtbDIxNDIxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2JpdHdpc2VYb3JFeHByZXNzaW9uX2luX3N5bnByZWQ5ODNfZm1sMjE0MjEJPSB7IEZPTExPV19iaXR3aXNlWG9yRXhwcmVzc2lvbl9pbl9zeW5wcmVkOTgzX2ZtbDIxNDIxX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0JYT1JfaW5fc3lucHJlZDk4NF9mbWwyMTQ1OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQlhPUl9pbl9zeW5wcmVkOTg0X2ZtbDIxNDU5X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0JYT1JfaW5fc3lucHJlZDk4NF9mbWwyMTQ1OQk9IHsgRk9MTE9XX0JYT1JfaW5fc3lucHJlZDk4NF9mbWwyMTQ1OV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19iaXR3aXNlQW5kRXhwcmVzc2lvbl9pbl9zeW5wcmVkOTg0X2ZtbDIxNDYzICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19iaXR3aXNlQW5kRXhwcmVzc2lvbl9pbl9zeW5wcmVkOTg0X2ZtbDIxNDYzX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2JpdHdpc2VBbmRFeHByZXNzaW9uX2luX3N5bnByZWQ5ODRfZm1sMjE0NjMJPSB7IEZPTExPV19iaXR3aXNlQW5kRXhwcmVzc2lvbl9pbl9zeW5wcmVkOTg0X2ZtbDIxNDYzX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0JBTkRfaW5fc3lucHJlZDk4NV9mbWwyMTUwMSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQkFORF9pbl9zeW5wcmVkOTg1X2ZtbDIxNTAxX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgzMDhDMDgwMTA2NDAyMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMTI0MDEwMDAwMDA4MTg1KSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwN0MwMDAyMDQwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMjAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMjAwMDA0MDAxMjAwMjAxKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDEwMDAwMDA4ODAxQzAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAyMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX0JBTkRfaW5fc3lucHJlZDk4NV9mbWwyMTUwMQk9IHsgRk9MTE9XX0JBTkRfaW5fc3lucHJlZDk4NV9mbWwyMTUwMV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19lcXVhbGl0eUV4cHJlc3Npb25faW5fc3lucHJlZDk4NV9mbWwyMTUwNSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfZXF1YWxpdHlFeHByZXNzaW9uX2luX3N5bnByZWQ5ODVfZm1sMjE1MDVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXF1YWxpdHlFeHByZXNzaW9uX2luX3N5bnByZWQ5ODVfZm1sMjE1MDUJPSB7IEZPTExPV19lcXVhbGl0eUV4cHJlc3Npb25faW5fc3lucHJlZDk4NV9mbWwyMTUwNV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19lcXVhbE9wX2luX3N5bnByZWQ5ODZfZm1sMjE1NjkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2VxdWFsT3BfaW5fc3lucHJlZDk4Nl9mbWwyMTU2OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19lcXVhbE9wX2luX3N5bnByZWQ5ODZfZm1sMjE1NjkJPSB7IEZPTExPV19lcXVhbE9wX2luX3N5bnByZWQ5ODZfZm1sMjE1NjlfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfcmVsYXRpb25hbEV4cHJlc3Npb25faW5fc3lucHJlZDk4Nl9mbWwyMTU3MyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfcmVsYXRpb25hbEV4cHJlc3Npb25faW5fc3lucHJlZDk4Nl9mbWwyMTU3M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19yZWxhdGlvbmFsRXhwcmVzc2lvbl9pbl9zeW5wcmVkOTg2X2ZtbDIxNTczCT0geyBGT0xMT1dfcmVsYXRpb25hbEV4cHJlc3Npb25faW5fc3lucHJlZDk4Nl9mbWwyMTU3M19iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19lcXVhbE9wX2luX3N5bnByZWQ5ODdfZm1sMjE1NDkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2VxdWFsT3BfaW5fc3lucHJlZDk4N19mbWwyMTU0OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19lcXVhbE9wX2luX3N5bnByZWQ5ODdfZm1sMjE1NDkJPSB7IEZPTExPV19lcXVhbE9wX2luX3N5bnByZWQ5ODdfZm1sMjE1NDlfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfcmVsYXRpb25hbEV4cHJlc3Npb25faW5fc3lucHJlZDk4N19mbWwyMTU1MyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfcmVsYXRpb25hbEV4cHJlc3Npb25faW5fc3lucHJlZDk4N19mbWwyMTU1M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwODAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDYwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDEwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19yZWxhdGlvbmFsRXhwcmVzc2lvbl9pbl9zeW5wcmVkOTg3X2ZtbDIxNTUzCT0geyBGT0xMT1dfcmVsYXRpb25hbEV4cHJlc3Npb25faW5fc3lucHJlZDk4N19mbWwyMTU1M19iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19lcXVhbE9wX2luX3N5bnByZWQ5ODdfZm1sMjE1NjkgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2VxdWFsT3BfaW5fc3lucHJlZDk4N19mbWwyMTU2OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19lcXVhbE9wX2luX3N5bnByZWQ5ODdfZm1sMjE1NjkJPSB7IEZPTExPV19lcXVhbE9wX2luX3N5bnByZWQ5ODdfZm1sMjE1NjlfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfcmVsYXRpb25hbEV4cHJlc3Npb25faW5fc3lucHJlZDk4N19mbWwyMTU3MyAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfcmVsYXRpb25hbEV4cHJlc3Npb25faW5fc3lucHJlZDk4N19mbWwyMTU3M19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwODAwMDAwMDAwMiksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDYwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDEwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19yZWxhdGlvbmFsRXhwcmVzc2lvbl9pbl9zeW5wcmVkOTg3X2ZtbDIxNTczCT0geyBGT0xMT1dfcmVsYXRpb25hbEV4cHJlc3Npb25faW5fc3lucHJlZDk4N19mbWwyMTU3M19iaXRzLCAzCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19yZWxhdGlvbmFsT3BfaW5fc3lucHJlZDk5MV9mbWwyMTY5NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfcmVsYXRpb25hbE9wX2luX3N5bnByZWQ5OTFfZm1sMjE2OTVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfcmVsYXRpb25hbE9wX2luX3N5bnByZWQ5OTFfZm1sMjE2OTUJPSB7IEZPTExPV19yZWxhdGlvbmFsT3BfaW5fc3lucHJlZDk5MV9mbWwyMTY5NV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zaGlmdEV4cHJlc3Npb25faW5fc3lucHJlZDk5MV9mbWwyMTY5OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2hpZnRFeHByZXNzaW9uX2luX3N5bnByZWQ5OTFfZm1sMjE2OTlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2hpZnRFeHByZXNzaW9uX2luX3N5bnByZWQ5OTFfZm1sMjE2OTkJPSB7IEZPTExPV19zaGlmdEV4cHJlc3Npb25faW5fc3lucHJlZDk5MV9mbWwyMTY5OV9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19yZWxhdGlvbmFsT3BfaW5fc3lucHJlZDk5Ml9mbWwyMTY3NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfcmVsYXRpb25hbE9wX2luX3N5bnByZWQ5OTJfZm1sMjE2NzVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfcmVsYXRpb25hbE9wX2luX3N5bnByZWQ5OTJfZm1sMjE2NzUJPSB7IEZPTExPV19yZWxhdGlvbmFsT3BfaW5fc3lucHJlZDk5Ml9mbWwyMTY3NV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zaGlmdEV4cHJlc3Npb25faW5fc3lucHJlZDk5Ml9mbWwyMTY3OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2hpZnRFeHByZXNzaW9uX2luX3N5bnByZWQ5OTJfZm1sMjE2NzlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDA2MDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDMwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDgwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2hpZnRFeHByZXNzaW9uX2luX3N5bnByZWQ5OTJfZm1sMjE2NzkJPSB7IEZPTExPV19zaGlmdEV4cHJlc3Npb25faW5fc3lucHJlZDk5Ml9mbWwyMTY3OV9iaXRzLCA1CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19yZWxhdGlvbmFsT3BfaW5fc3lucHJlZDk5Ml9mbWwyMTY5NSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfcmVsYXRpb25hbE9wX2luX3N5bnByZWQ5OTJfZm1sMjE2OTVfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfcmVsYXRpb25hbE9wX2luX3N5bnByZWQ5OTJfZm1sMjE2OTUJPSB7IEZPTExPV19yZWxhdGlvbmFsT3BfaW5fc3lucHJlZDk5Ml9mbWwyMTY5NV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zaGlmdEV4cHJlc3Npb25faW5fc3lucHJlZDk5Ml9mbWwyMTY5OSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfc2hpZnRFeHByZXNzaW9uX2luX3N5bnByZWQ5OTJfZm1sMjE2OTlfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDA2MDAwMDAwMDAwMDIpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDMwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDgwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2hpZnRFeHByZXNzaW9uX2luX3N5bnByZWQ5OTJfZm1sMjE2OTkJPSB7IEZPTExPV19zaGlmdEV4cHJlc3Npb25faW5fc3lucHJlZDk5Ml9mbWwyMTY5OV9iaXRzLCA1CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zaGlmdE9wX2luX3N5bnByZWQ5OTdfZm1sMjE4MTggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NoaWZ0T3BfaW5fc3lucHJlZDk5N19mbWwyMTgxOF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zaGlmdE9wX2luX3N5bnByZWQ5OTdfZm1sMjE4MTgJPSB7IEZPTExPV19zaGlmdE9wX2luX3N5bnByZWQ5OTdfZm1sMjE4MThfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfYWRkaXRpdmVFeHByZXNzaW9uX2luX3N5bnByZWQ5OTdfZm1sMjE4MjIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2FkZGl0aXZlRXhwcmVzc2lvbl9pbl9zeW5wcmVkOTk3X2ZtbDIxODIyX2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2FkZGl0aXZlRXhwcmVzc2lvbl9pbl9zeW5wcmVkOTk3X2ZtbDIxODIyCT0geyBGT0xMT1dfYWRkaXRpdmVFeHByZXNzaW9uX2luX3N5bnByZWQ5OTdfZm1sMjE4MjJfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfc2V0X2luX3N5bnByZWQxMDAwX2ZtbDIxODkyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19zZXRfaW5fc3lucHJlZDEwMDBfZm1sMjE4OTJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfc2V0X2luX3N5bnByZWQxMDAwX2ZtbDIxODkyCT0geyBGT0xMT1dfc2V0X2luX3N5bnByZWQxMDAwX2ZtbDIxODkyX2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX211bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9pbl9zeW5wcmVkMTAwMF9mbWwyMTkyNCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX2luX3N5bnByZWQxMDAwX2ZtbDIxOTI0X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX211bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9pbl9zeW5wcmVkMTAwMF9mbWwyMTkyNAk9IHsgRk9MTE9XX211bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9pbl9zeW5wcmVkMTAwMF9mbWwyMTkyNF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19zZXRfaW5fc3lucHJlZDEwMDNfZm1sMjE5NjggICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX3NldF9pbl9zeW5wcmVkMTAwM19mbWwyMTk2OF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19zZXRfaW5fc3lucHJlZDEwMDNfZm1sMjE5NjgJPSB7IEZPTExPV19zZXRfaW5fc3lucHJlZDEwMDNfZm1sMjE5NjhfYml0cywgNwl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfdW5hcnlFeHByZXNzaW9uX2luX3N5bnByZWQxMDAzX2ZtbDIyMDEyICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fc3lucHJlZDEwMDNfZm1sMjIwMTJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfdW5hcnlFeHByZXNzaW9uX2luX3N5bnByZWQxMDAzX2ZtbDIyMDEyCT0geyBGT0xMT1dfdW5hcnlFeHByZXNzaW9uX2luX3N5bnByZWQxMDAzX2ZtbDIyMDEyX2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0lOQ1JfaW5fc3lucHJlZDEwMjBfZm1sMjIzNTMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0lOQ1JfaW5fc3lucHJlZDEwMjBfZm1sMjIzNTNfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDIpIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfSU5DUl9pbl9zeW5wcmVkMTAyMF9mbWwyMjM1Mwk9IHsgRk9MTE9XX0lOQ1JfaW5fc3lucHJlZDEwMjBfZm1sMjIzNTNfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfREVDUl9pbl9zeW5wcmVkMTAyMV9mbWwyMjM2NCAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfREVDUl9pbl9zeW5wcmVkMTAyMV9mbWwyMjM2NF9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19ERUNSX2luX3N5bnByZWQxMDIxX2ZtbDIyMzY0CT0geyBGT0xMT1dfREVDUl9pbl9zeW5wcmVkMTAyMV9mbWwyMjM2NF9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MUEFSRU5faW5fc3lucHJlZDEwMjdfZm1sMjI2MDMgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX0xQQVJFTl9pbl9zeW5wcmVkMTAyN19mbWwyMjYwM19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MUEFSRU5faW5fc3lucHJlZDEwMjdfZm1sMjI2MDMJPSB7IEZPTExPV19MUEFSRU5faW5fc3lucHJlZDEwMjdfZm1sMjI2MDNfYml0cywgMQl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfQ09MT054Ml9pbl9zeW5wcmVkMTAzMF9mbWwyMjY2NiAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfQ09MT054Ml9pbl9zeW5wcmVkMTAzMF9mbWwyMjY2Nl9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19DT0xPTngyX2luX3N5bnByZWQxMDMwX2ZtbDIyNjY2CT0geyBGT0xMT1dfQ09MT054Ml9pbl9zeW5wcmVkMTAzMF9mbWwyMjY2Nl9iaXRzLCAxCX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19MQlJBQ0tFVF9pbl9zeW5wcmVkMTAzM19mbWwyMjc2MSAgKi8KK3N0YXRpYwlBTlRMUjNfQklUV09SRCBGT0xMT1dfTEJSQUNLRVRfaW5fc3lucHJlZDEwMzNfZm1sMjI3NjFfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDMwOEMwODAxMDY0MDIwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAxMjQwMTAwMDAwMDgxODUpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDA3QzAwMDIwNDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAyMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAyMDAwMDQwMDEyMDAyMDEpLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMTAwMDAwMDg4MDFDMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDIwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfTEJSQUNLRVRfaW5fc3lucHJlZDEwMzNfZm1sMjI3NjEJPSB7IEZPTExPV19MQlJBQ0tFVF9pbl9zeW5wcmVkMTAzM19mbWwyMjc2MV9iaXRzLCA3CX07CisvKiogQml0c2V0IGRlZmluaW5nIGZvbGxvdyBzZXQgZm9yIGVycm9yIHJlY292ZXJ5IGluIHJ1bGUgc3RhdGU6IEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQxMDMzX2ZtbDIyNzY2ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQxMDMzX2ZtbDIyNzY2X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQU5UTFIzX1VJTlQ2NF9MSVQoMHgxMDAwMDAwMDAwMDAwMDAwKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDEwMzNfZm1sMjI3NjYJPSB7IEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQxMDMzX2ZtbDIyNzY2X2JpdHMsIDIJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX1JCUkFDS0VUX2luX3N5bnByZWQxMDMzX2ZtbDIyNzY5ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19SQlJBQ0tFVF9pbl9zeW5wcmVkMTAzM19mbWwyMjc2OV9iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMDAwMikgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19SQlJBQ0tFVF9pbl9zeW5wcmVkMTAzM19mbWwyMjc2OQk9IHsgRk9MTE9XX1JCUkFDS0VUX2luX3N5bnByZWQxMDMzX2ZtbDIyNzY5X2JpdHMsIDEJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX0xCUkFDS0VUX2luX3N5bnByZWQxMDM1X2ZtbDIyODU3ICAqLworc3RhdGljCUFOVExSM19CSVRXT1JEIEZPTExPV19MQlJBQ0tFVF9pbl9zeW5wcmVkMTAzNV9mbWwyMjg1N19iaXRzW10JPSB7IEFOVExSM19VSU5UNjRfTElUKDB4MzA4QzA4MDEwNjQwMjAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDEyNDAxMDAwMDAwODE4NSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDdDMDAwMjA0MCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDIwMDAwMDAwMDAwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDIwMDAwNDAwMTIwMDIwMSksIEFOVExSM19VSU5UNjRfTElUKDB4MDAxMDAwMDAwODgwMUMwMCksIEFOVExSM19VSU5UNjRfTElUKDB4MDAwMDAwMDAwMDAwMjAwMCkgfTsKK3N0YXRpYyAgQU5UTFIzX0JJVFNFVF9MSVNUIEZPTExPV19MQlJBQ0tFVF9pbl9zeW5wcmVkMTAzNV9mbWwyMjg1Nwk9IHsgRk9MTE9XX0xCUkFDS0VUX2luX3N5bnByZWQxMDM1X2ZtbDIyODU3X2JpdHMsIDcJfTsKKy8qKiBCaXRzZXQgZGVmaW5pbmcgZm9sbG93IHNldCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gcnVsZSBzdGF0ZTogRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDEwMzVfZm1sMjI4NjIgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDEwMzVfZm1sMjI4NjJfYml0c1tdCT0geyBBTlRMUjNfVUlOVDY0X0xJVCgweDAwMDAwMDAwMDAwMDAwMDApLCBBTlRMUjNfVUlOVDY0X0xJVCgweDEwMDAwMDAwMDAwMDAwMDApIH07CitzdGF0aWMgIEFOVExSM19CSVRTRVRfTElTVCBGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkMTAzNV9mbWwyMjg2Mgk9IHsgRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDEwMzVfZm1sMjI4NjJfYml0cywgMgl9OworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiBGT0xMT1dfUkJSQUNLRVRfaW5fc3lucHJlZDEwMzVfZm1sMjI4NjUgICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgRk9MTE9XX1JCUkFDS0VUX2luX3N5bnByZWQxMDM1X2ZtbDIyODY1X2JpdHNbXQk9IHsgQU5UTFIzX1VJTlQ2NF9MSVQoMHgwMDAwMDAwMDAwMDAwMDAyKSB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgRk9MTE9XX1JCUkFDS0VUX2luX3N5bnByZWQxMDM1X2ZtbDIyODY1CT0geyBGT0xMT1dfUkJSQUNLRVRfaW5fc3lucHJlZDEwMzVfZm1sMjI4NjVfYml0cywgMQl9OworCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFBhcnNpbmcgcnVsZXMKKyAqLworLyoqCisgKiAkQU5UTFIgc3RhcnQgZm9ybWFsTUwKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYyNjoxOiBmb3JtYWxNTFsgc2VwOjpXT2JqZWN0TWFuYWdlciAmIGFXT2JqZWN0TWFuYWdlciBdIHJldHVybnMgWyBzZXA6OlN5c3RlbSAqIHNwZWMgXSA6IHByb2xvZ3VlX2ZtbCAocz0gZGVmX3N5c3RlbSApIDsKKyAqLworc3RhdGljIHNlcDo6U3lzdGVtICoKK2Zvcm1hbE1MKHBmbWxQYXJzZXIgY3R4LCBzZXA6OldPYmplY3RNYW5hZ2VyICYgYVdPYmplY3RNYW5hZ2VyKQoreworICAgIHNlcDo6U3lzdGVtICogc3BlYzsKKworICAgIEFOVExSM19VSU5UMzIgZm9ybWFsTUxfU3RhcnRJbmRleDsKKworICAgIHNlcDo6U3lzdGVtICogczsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfcworICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfcyBzZXA6OlN5c3RlbSAqCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgZm9ybWFsTUxfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworCisgICAgCW1XT2JqZWN0TWFuYWdlciA9ICYoIGFXT2JqZWN0TWFuYWdlciApOworCisgICAgCXNwZWMgPSBOVUxMOworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgxKSkgKQorICAgIHsKKyAgICAgICAgeworCisgICAgICAgICAgICAJc3BlYy0+c2V0V09iamVjdChESVZFUklUWV9QUk9MT0cpOworCisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiBzcGVjOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjM2OjI6ICggcHJvbG9ndWVfZm1sIChzPSBkZWZfc3lzdGVtICkgKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MzY6NDogcHJvbG9ndWVfZm1sIChzPSBkZWZfc3lzdGVtICkKKyAgICAgICAgeworICAgICAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfcHJvbG9ndWVfZm1sX2luX2Zvcm1hbE1MOTApOworICAgICAgICAgICAgcHJvbG9ndWVfZm1sKGN0eCk7CisKKyAgICAgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVmb3JtYWxNTEV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBzcGVjOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYzNzo0OiAocz0gZGVmX3N5c3RlbSApCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2Mzc6Njogcz0gZGVmX3N5c3RlbQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlZl9zeXN0ZW1faW5fZm9ybWFsTUw5OSk7CisgICAgICAgICAgICAgICAgcz1kZWZfc3lzdGVtKGN0eCk7CisKKyAgICAgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZ290byBydWxlZm9ybWFsTUxFeDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNwZWM7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgc3BlYz0gCisgICAgICAgICAgICAgICAgICAgIHMKKyAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVmb3JtYWxNTEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZWZvcm1hbE1MRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIAlzcGVjLT5zZXRXT2JqZWN0KERJVkVSSVRZX1BST0xPRyk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKworICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMSwgZm9ybWFsTUxfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiBzcGVjOworfQorLyogJEFOVExSIGVuZCBmb3JtYWxNTCAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBwcm9sb2d1ZV9mbWwKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY0NzoxOiBwcm9sb2d1ZV9mbWwgOiAoICdAZm9ybWFsbWwnIHwgJ0B4Zm1sJyB8ICdAZm1sJyB8ICdAZGl2ZXJzaXR5JyB8ICdAeGxpYScgfCAnQHhmc3AnICk/IExUXyAoICdzeXN0ZW0nIHwgJ3BhY2thZ2UnIHxpZD0gSUQgKSAoIEFTU0lHTiBpZD0gSUQgKT8gKCBDT01NQSAoIEZsb2F0TGl0ZXJhbCB8IElEIHwgU3RyaW5nTGl0ZXJhbCApICkqIEdUIENPTE9OICggcHJvbG9ndWVfYXR0cmlidXRlICk/ICggcHJvbG9ndWVfb3B0aW9ucyApPyA7CisgKi8KK3N0YXRpYyB2b2lkCitwcm9sb2d1ZV9mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX1VJTlQzMiBwcm9sb2d1ZV9mbWxfU3RhcnRJbmRleDsKKworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIGlkOworCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIHByb2xvZ3VlX2ZtbF9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisKKyAgICAJc3RkOjpzdHJpbmcgYXR0cklEOworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgyKSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgaWQgICAgICAgPSBOVUxMOworCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NTE6MjogKCAoICdAZm9ybWFsbWwnIHwgJ0B4Zm1sJyB8ICdAZm1sJyB8ICdAZGl2ZXJzaXR5JyB8ICdAeGxpYScgfCAnQHhmc3AnICk/IExUXyAoICdzeXN0ZW0nIHwgJ3BhY2thZ2UnIHxpZD0gSUQgKSAoIEFTU0lHTiBpZD0gSUQgKT8gKCBDT01NQSAoIEZsb2F0TGl0ZXJhbCB8IElEIHwgU3RyaW5nTGl0ZXJhbCApICkqIEdUIENPTE9OICggcHJvbG9ndWVfYXR0cmlidXRlICk/ICggcHJvbG9ndWVfb3B0aW9ucyApPyApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY1MTo0OiAoICdAZm9ybWFsbWwnIHwgJ0B4Zm1sJyB8ICdAZm1sJyB8ICdAZGl2ZXJzaXR5JyB8ICdAeGxpYScgfCAnQHhmc3AnICk/IExUXyAoICdzeXN0ZW0nIHwgJ3BhY2thZ2UnIHxpZD0gSUQgKSAoIEFTU0lHTiBpZD0gSUQgKT8gKCBDT01NQSAoIEZsb2F0TGl0ZXJhbCB8IElEIHwgU3RyaW5nTGl0ZXJhbCApICkqIEdUIENPTE9OICggcHJvbG9ndWVfYXR0cmlidXRlICk/ICggcHJvbG9ndWVfb3B0aW9ucyApPworICAgICAgICB7CisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NTE6NDogKCAnQGZvcm1hbG1sJyB8ICdAeGZtbCcgfCAnQGZtbCcgfCAnQGRpdmVyc2l0eScgfCAnQHhsaWEnIHwgJ0B4ZnNwJyApPworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQxPTc7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxODY6CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJYWx0MT0xOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjMzOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDE9MjsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDE4NToKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQxPTM7CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxODA6CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJYWx0MT00OworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjM1OgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDE9NTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDIzNDoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQxPTY7CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjUxOjY6ICdAZm9ybWFsbWwnCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoMTg2LCAmRk9MTE9XXzE4Nl9pbl9wcm9sb2d1ZV9mbWwxMzEpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVwcm9sb2d1ZV9mbWxFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgRElWRVJJVFlfUFJPTE9HID0gbVdPYmplY3RNYW5hZ2VyLT5uZXdXU2VxdWVuY2Uoc2VwOjpXT2JqZWN0OjpfTlVMTF8sICJmb3JtYWxtbCIgKTsgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjUyOjY6ICdAeGZtbCcKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVCgyMzMsICZGT0xMT1dfMjMzX2luX3Byb2xvZ3VlX2ZtbDE0MSk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXByb2xvZ3VlX2ZtbEV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBESVZFUklUWV9QUk9MT0cgPSBtV09iamVjdE1hbmFnZXItPm5ld1dTZXF1ZW5jZShzZXA6OldPYmplY3Q6Ol9OVUxMXywgInhmbWwiICAgICApOyAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAzOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NTM6NjogJ0BmbWwnCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoMTg1LCAmRk9MTE9XXzE4NV9pbl9wcm9sb2d1ZV9mbWwxNTUpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVwcm9sb2d1ZV9mbWxFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgRElWRVJJVFlfUFJPTE9HID0gbVdPYmplY3RNYW5hZ2VyLT5uZXdXU2VxdWVuY2Uoc2VwOjpXT2JqZWN0OjpfTlVMTF8sICJmbWwiICAgICAgKTsgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgNDoKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjU0OjY6ICdAZGl2ZXJzaXR5JworICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKDE4MCwgJkZPTExPV18xODBfaW5fcHJvbG9ndWVfZm1sMTcwKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlcHJvbG9ndWVfZm1sRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIERJVkVSSVRZX1BST0xPRyA9IG1XT2JqZWN0TWFuYWdlci0+bmV3V1NlcXVlbmNlKHNlcDo6V09iamVjdDo6X05VTExfLCAiZGl2ZXJzaXR5Iik7IAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDU6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY1NTo2OiAnQHhsaWEnCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoMjM1LCAmRk9MTE9XXzIzNV9pbl9wcm9sb2d1ZV9mbWwxNzkpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVwcm9sb2d1ZV9mbWxFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgRElWRVJJVFlfUFJPTE9HID0gbVdPYmplY3RNYW5hZ2VyLT5uZXdXU2VxdWVuY2Uoc2VwOjpXT2JqZWN0OjpfTlVMTF8sICJ4bGlhIiAgICAgKTsgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgNjoKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjU2OjY6ICdAeGZzcCcKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVCgyMzQsICZGT0xMT1dfMjM0X2luX3Byb2xvZ3VlX2ZtbDE5Myk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXByb2xvZ3VlX2ZtbEV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBESVZFUklUWV9QUk9MT0cgPSBtV09iamVjdE1hbmFnZXItPm5ld1dTZXF1ZW5jZShzZXA6OldPYmplY3Q6Ol9OVUxMXywgInhmc3AiICAgICApOyAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIAkgIAlpZiggRElWRVJJVFlfUFJPTE9HID09IHNlcDo6V09iamVjdDo6X05VTExfICkKKyAgICAgICAgICAgICAgICAJICAJeyBESVZFUklUWV9QUk9MT0cgPSBtV09iamVjdE1hbmFnZXItPm5ld1dTZXF1ZW5jZShzZXA6OldPYmplY3Q6Ol9OVUxMXywgInN5bWJleCIpOyB9CisgICAgICAgICAgICAgICAgCSAgCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgIE1BVENIVChMVF8sICZGT0xMT1dfTFRfX2luX3Byb2xvZ3VlX2ZtbDIxNyk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXByb2xvZ3VlX2ZtbEV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjYzOjY6ICggJ3N5c3RlbScgfCAncGFja2FnZScgfGlkPSBJRCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDI9MzsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgMzkwOgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQyPTE7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzNDI6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDI9MjsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIElEOgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQyPTM7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDI7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgICAgIGdvdG8gcnVsZXByb2xvZ3VlX2ZtbEV4OworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY2Mzo4OiAnc3lzdGVtJworICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKDM5MCwgJkZPTExPV18zOTBfaW5fcHJvbG9ndWVfZm1sMjI2KTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlcHJvbG9ndWVfZm1sRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIGF0dHJJRCA9ICJzeXN0ZW0iOyAgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjY0Ojg6ICdwYWNrYWdlJworICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKDM0MiwgJkZPTExPV18zNDJfaW5fcHJvbG9ndWVfZm1sMjM5KTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlcHJvbG9ndWVfZm1sRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIGF0dHJJRCA9ICJwYWNrYWdlIjsgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMzoKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjY1Ojg6IGlkPSBJRAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBpZCA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTikgTUFUQ0hUKElELCAmRk9MTE9XX0lEX2luX3Byb2xvZ3VlX2ZtbDI1Myk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXByb2xvZ3VlX2ZtbEV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBhdHRySUQgPSBTVFIoKGlkLT5nZXRUZXh0KGlkKSktPmNoYXJzKTsgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2Njc6NjogKCBBU1NJR04gaWQ9IElEICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDM9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEFTU0lHTjoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQzPTE7CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjY3Ojg6IEFTU0lHTiBpZD0gSUQKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChBU1NJR04sICZGT0xMT1dfQVNTSUdOX2luX3Byb2xvZ3VlX2ZtbDI3Nik7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXByb2xvZ3VlX2ZtbEV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWQgPSAocEFOVExSM19DT01NT05fVE9LRU4pIE1BVENIVChJRCwgJkZPTExPV19JRF9pbl9wcm9sb2d1ZV9mbWwyODApOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVwcm9sb2d1ZV9mbWxFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJCURJVkVSSVRZX1BST0xPRy0+YXBwZW5kKCBtV09iamVjdE1hbmFnZXItPm5ld1dQcm9wZXJ0eUlkZW50aWZpZXIoCisgICAgICAgICAgICAJICAgICAgICAgICAgCQkJCQlESVZFUklUWV9QUk9MT0csIGF0dHJJRCwgU1RSKChpZC0+Z2V0VGV4dChpZCkpLT5jaGFycykgKSApOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NzM6NDogKCBDT01NQSAoIEZsb2F0TGl0ZXJhbCB8IElEIHwgU3RyaW5nTGl0ZXJhbCApICkqCisKKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDQ9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQ09NTUE6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDQ9MTsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NzM6NjogQ09NTUEgKCBGbG9hdExpdGVyYWwgfCBJRCB8IFN0cmluZ0xpdGVyYWwgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKENPTU1BLCAmRk9MTE9XX0NPTU1BX2luX3Byb2xvZ3VlX2ZtbDI5OSk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXByb2xvZ3VlX2ZtbEV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBMQSgxKSA9PSBGbG9hdExpdGVyYWwgfHwgTEEoMSkgPT0gSUQgfHwgTEEoMSkgPT0gU3RyaW5nTGl0ZXJhbCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgQ09OU1VNRSgpOworICAgICAgICAgICAgCSAgICAgICAgICAgIFBFUlJPUlJFQ09WRVJZPUFOVExSM19GQUxTRTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBGQUlMRURGTEFHPUFOVExSM19GQUxTRTsKKworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgZWxzZQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX01JU01BVENIRURfU0VUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPm5hbWUgICAgICAgICA9ICh2b2lkICopQU5UTFIzX01JU01BVENIRURfU0VUX05BTUU7CisgICAgICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT5leHBlY3RpbmdTZXQgPSBOVUxMOworCisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlcHJvbG9ndWVfZm1sRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdDoKKyAgICAgICAgICAgIAkgICAgZ290byBsb29wNDsJLyogYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvb3A0OiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICAgICAgIE1BVENIVChHVCwgJkZPTExPV19HVF9pbl9wcm9sb2d1ZV9mbWwzMjEpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVwcm9sb2d1ZV9mbWxFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICBNQVRDSFQoQ09MT04sICZGT0xMT1dfQ09MT05faW5fcHJvbG9ndWVfZm1sMzI2KTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlcHJvbG9ndWVfZm1sRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NzY6NDogKCBwcm9sb2d1ZV9hdHRyaWJ1dGUgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0NT0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjA4OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDIyOToKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQ1PTE7CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Njc2OjY6IHByb2xvZ3VlX2F0dHJpYnV0ZQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19wcm9sb2d1ZV9hdHRyaWJ1dGVfaW5fcHJvbG9ndWVfZm1sMzMzKTsKKyAgICAgICAgICAgIAkgICAgICAgIHByb2xvZ3VlX2F0dHJpYnV0ZShjdHgpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlcHJvbG9ndWVfZm1sRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY3Nzo0OiAoIHByb2xvZ3VlX29wdGlvbnMgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0Nj0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjA2OgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDY9MTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2Nzc6NjogcHJvbG9ndWVfb3B0aW9ucworICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19wcm9sb2d1ZV9vcHRpb25zX2luX3Byb2xvZ3VlX2ZtbDM0Myk7CisgICAgICAgICAgICAJICAgICAgICBwcm9sb2d1ZV9vcHRpb25zKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVwcm9sb2d1ZV9mbWxFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVwcm9sb2d1ZV9mbWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVwcm9sb2d1ZV9mbWxFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDIsIHByb2xvZ3VlX2ZtbF9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgcHJvbG9ndWVfZm1sICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IHByb2xvZ3VlX2F0dHJpYnV0ZQorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjgxOjE6IHByb2xvZ3VlX2F0dHJpYnV0ZSA6ICggJ0BwYWNrYWdlJyBBU1NJR04gaWQ9IElEIFNFTUkgfCAnQHN5c3RlbScgQVNTSUdOIGlkPSBJRCBTRU1JICk7CisgKi8KK3N0YXRpYyB2b2lkCitwcm9sb2d1ZV9hdHRyaWJ1dGUocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX1VJTlQzMiBwcm9sb2d1ZV9hdHRyaWJ1dGVfU3RhcnRJbmRleDsKKworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIGlkOworCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIHByb2xvZ3VlX2F0dHJpYnV0ZV9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgzKSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgaWQgICAgICAgPSBOVUxMOworCisgICAgeworICAgICAgICB7CisgICAgICAgICAgICAvLyAgL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjgyOjI6ICggJ0BwYWNrYWdlJyBBU1NJR04gaWQ9IElEIFNFTUkgfCAnQHN5c3RlbScgQVNTSUdOIGlkPSBJRCBTRU1JICkKKworICAgICAgICAgICAgQU5UTFIzX1VJTlQzMiBhbHQ3OworCisgICAgICAgICAgICBhbHQ3PTI7CisKKyAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMjA4OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0Nz0xOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjI5OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0Nz0yOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA3OworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgZ290byBydWxlcHJvbG9ndWVfYXR0cmlidXRlRXg7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQ3KQorICAgICAgICAgICAgeworICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY4Mjo0OiAnQHBhY2thZ2UnIEFTU0lHTiBpZD0gSUQgU0VNSQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgyMDgsICZGT0xMT1dfMjA4X2luX3Byb2xvZ3VlX2F0dHJpYnV0ZTM1OCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXByb2xvZ3VlX2F0dHJpYnV0ZUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChBU1NJR04sICZGT0xMT1dfQVNTSUdOX2luX3Byb2xvZ3VlX2F0dHJpYnV0ZTM2MSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXByb2xvZ3VlX2F0dHJpYnV0ZUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWQgPSAocEFOVExSM19DT01NT05fVE9LRU4pIE1BVENIVChJRCwgJkZPTExPV19JRF9pbl9wcm9sb2d1ZV9hdHRyaWJ1dGUzNjYpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVwcm9sb2d1ZV9hdHRyaWJ1dGVFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgICBNQVRDSFQoU0VNSSwgJkZPTExPV19TRU1JX2luX3Byb2xvZ3VlX2F0dHJpYnV0ZTM2OSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXByb2xvZ3VlX2F0dHJpYnV0ZUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisKKyAgICAgICAgCSAgICAgICAgICAgIAkJRElWRVJJVFlfUFJPTE9HLT5hcHBlbmQoIG1XT2JqZWN0TWFuYWdlci0+bmV3V1Byb3BlcnR5SWRlbnRpZmllcigKKyAgICAgICAgCSAgICAgICAgICAgIAkJCQlESVZFUklUWV9QUk9MT0csICJwYWNrYWdlIiwgU1RSKChpZC0+Z2V0VGV4dChpZCkpLT5jaGFycykgKSApOworICAgICAgICAJICAgICAgICAgICAgCQorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2ODg6NDogJ0BzeXN0ZW0nIEFTU0lHTiBpZD0gSUQgU0VNSQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgyMjksICZGT0xMT1dfMjI5X2luX3Byb2xvZ3VlX2F0dHJpYnV0ZTM3OCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXByb2xvZ3VlX2F0dHJpYnV0ZUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChBU1NJR04sICZGT0xMT1dfQVNTSUdOX2luX3Byb2xvZ3VlX2F0dHJpYnV0ZTM4MSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXByb2xvZ3VlX2F0dHJpYnV0ZUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWQgPSAocEFOVExSM19DT01NT05fVE9LRU4pIE1BVENIVChJRCwgJkZPTExPV19JRF9pbl9wcm9sb2d1ZV9hdHRyaWJ1dGUzODYpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVwcm9sb2d1ZV9hdHRyaWJ1dGVFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgICBNQVRDSFQoU0VNSSwgJkZPTExPV19TRU1JX2luX3Byb2xvZ3VlX2F0dHJpYnV0ZTM4OSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXByb2xvZ3VlX2F0dHJpYnV0ZUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisKKyAgICAgICAgCSAgICAgICAgICAgIAkJRElWRVJJVFlfUFJPTE9HLT5hcHBlbmQoIG1XT2JqZWN0TWFuYWdlci0+bmV3V1Byb3BlcnR5SWRlbnRpZmllcigKKyAgICAgICAgCSAgICAgICAgICAgIAkJCQlESVZFUklUWV9QUk9MT0csICJzeXN0ZW0iLCBTVFIoKGlkLT5nZXRUZXh0KGlkKSktPmNoYXJzKSApICk7CisgICAgICAgIAkgICAgICAgICAgICAJCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVwcm9sb2d1ZV9hdHRyaWJ1dGVFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVwcm9sb2d1ZV9hdHRyaWJ1dGVFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDMsIHByb2xvZ3VlX2F0dHJpYnV0ZV9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgcHJvbG9ndWVfYXR0cmlidXRlICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IHByb2xvZ3VlX29wdGlvbnMKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY5NjoxOiBwcm9sb2d1ZV9vcHRpb25zIDogJ0BvcHRpb25zJyBMQ1VSTFkgKGlkPSBJRCBBU1NJR04gZT0gZXhwcmVzc2lvbiBTRU1JICkqIFJDVVJMWSA7CisgKi8KK3N0YXRpYyB2b2lkCitwcm9sb2d1ZV9vcHRpb25zKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19VSU5UMzIgcHJvbG9ndWVfb3B0aW9uc19TdGFydEluZGV4OworCisgICAgcEFOVExSM19DT01NT05fVE9LRU4gICAgaWQ7CisgICAgc2VwOjpCRiBlOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9lCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9lIHNlcDo6QkYKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBwcm9sb2d1ZV9vcHRpb25zX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDQpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICBpZCAgICAgICA9IE5VTEw7CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY5NzoyOiAoICdAb3B0aW9ucycgTENVUkxZIChpZD0gSUQgQVNTSUdOIGU9IGV4cHJlc3Npb24gU0VNSSApKiBSQ1VSTFkgKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2OTc6NDogJ0BvcHRpb25zJyBMQ1VSTFkgKGlkPSBJRCBBU1NJR04gZT0gZXhwcmVzc2lvbiBTRU1JICkqIFJDVVJMWQorICAgICAgICB7CisgICAgICAgICAgICAgTUFUQ0hUKDIwNiwgJkZPTExPV18yMDZfaW5fcHJvbG9ndWVfb3B0aW9uczQwNCk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXByb2xvZ3VlX29wdGlvbnNFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICBNQVRDSFQoTENVUkxZLCAmRk9MTE9XX0xDVVJMWV9pbl9wcm9sb2d1ZV9vcHRpb25zNDA3KTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlcHJvbG9ndWVfb3B0aW9uc0V4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Njk4OjU6IChpZD0gSUQgQVNTSUdOIGU9IGV4cHJlc3Npb24gU0VNSSApKgorCisgICAgICAgICAgICBmb3IgKDs7KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQ4PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIElEOgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQ4PTE7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Njk4Ojc6IGlkPSBJRCBBU1NJR04gZT0gZXhwcmVzc2lvbiBTRU1JCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlkID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoSUQsICZGT0xMT1dfSURfaW5fcHJvbG9ndWVfb3B0aW9uczQxNyk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXByb2xvZ3VlX29wdGlvbnNFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoQVNTSUdOLCAmRk9MTE9XX0FTU0lHTl9pbl9wcm9sb2d1ZV9vcHRpb25zNDE5KTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlcHJvbG9ndWVfb3B0aW9uc0V4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9wcm9sb2d1ZV9vcHRpb25zNDIzKTsKKyAgICAgICAgICAgIAkgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlcHJvbG9ndWVfb3B0aW9uc0V4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChTRU1JLCAmRk9MTE9XX1NFTUlfaW5fcHJvbG9ndWVfb3B0aW9uczQyNSk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXByb2xvZ3VlX29wdGlvbnNFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgc2VwOjpQYXJzZXJVdGlsOjpzZXRQcm9sb2d1ZU9wdGlvbihTVFIoKGlkLT5nZXRUZXh0KGlkKSktPmNoYXJzKSwgCisgICAgICAgICAgICAJICAgICAgICAgICAgZQorICAgICAgICAgICAgCSAgICAgICAgICAgICk7IAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQ6CisgICAgICAgICAgICAJICAgIGdvdG8gbG9vcDg7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb29wODogOyAvKiBKdW1wIG91dCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworCisKKyAgICAgICAgICAgICBNQVRDSFQoUkNVUkxZLCAmRk9MTE9XX1JDVVJMWV9pbl9wcm9sb2d1ZV9vcHRpb25zNDQ0KTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlcHJvbG9ndWVfb3B0aW9uc0V4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVwcm9sb2d1ZV9vcHRpb25zRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlcHJvbG9ndWVfb3B0aW9uc0V4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoNCwgcHJvbG9ndWVfb3B0aW9uc19TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgcHJvbG9ndWVfb3B0aW9ucyAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBtb2RpZmllcl9kZWNsYXJhdGlvbgorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NzEwOjE6IG1vZGlmaWVyX2RlY2xhcmF0aW9uIHJldHVybnMgWyBzZXA6Ok1vZGlmaWVyIG1kZnIgXSA6ICggJ2ZpbmFsJyB8ICdzdGF0aWMnIHwgJ3ZvbGF0aWxlJyB8ICd0cmFuc2llbnQnIHwgJ3Vuc2FmZScgfCAncmVmJyB8ICdiaW5kJyB8ICdwdWJsaWMnIHwgJ3ByaXZhdGUnIHwgbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dFsgbWRmciBdICkrIDsKKyAqLworc3RhdGljIHNlcDo6TW9kaWZpZXIKK21vZGlmaWVyX2RlY2xhcmF0aW9uKHBmbWxQYXJzZXIgY3R4KQoreworICAgIHNlcDo6TW9kaWZpZXIgbWRmcjsKKworICAgIEFOVExSM19VSU5UMzIgbW9kaWZpZXJfZGVjbGFyYXRpb25fU3RhcnRJbmRleDsKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBtb2RpZmllcl9kZWNsYXJhdGlvbl9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSg1KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiBtZGZyOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NzEyOjI6ICggKCAnZmluYWwnIHwgJ3N0YXRpYycgfCAndm9sYXRpbGUnIHwgJ3RyYW5zaWVudCcgfCAndW5zYWZlJyB8ICdyZWYnIHwgJ2JpbmQnIHwgJ3B1YmxpYycgfCAncHJpdmF0ZScgfCBtb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0WyBtZGZyIF0gKSsgKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo3MTI6NDogKCAnZmluYWwnIHwgJ3N0YXRpYycgfCAndm9sYXRpbGUnIHwgJ3RyYW5zaWVudCcgfCAndW5zYWZlJyB8ICdyZWYnIHwgJ2JpbmQnIHwgJ3B1YmxpYycgfCAncHJpdmF0ZScgfCBtb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0WyBtZGZyIF0gKSsKKyAgICAgICAgeworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NzEyOjQ6ICggJ2ZpbmFsJyB8ICdzdGF0aWMnIHwgJ3ZvbGF0aWxlJyB8ICd0cmFuc2llbnQnIHwgJ3Vuc2FmZScgfCAncmVmJyB8ICdiaW5kJyB8ICdwdWJsaWMnIHwgJ3ByaXZhdGUnIHwgbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dFsgbWRmciBdICkrCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGNudDk9MDsKKworICAgICAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgYWx0OT0xMTsKKyAgICAgICAgICAgIAlzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCWNhc2UgMjgyOgorICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAJCQlhbHQ5PTE7CisgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAzODA6CisgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgIAkJCWFsdDk9MjsKKyAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDQxNDoKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkJYWx0OT0zOworICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMzk1OgorICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAJCQlhbHQ5PTQ7CisgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSA0MDY6CisgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgIAkJCXsKKyAgICAgICAgICAgIAkJCSAgIC8qIGRmYUxvb3BiYWNrU3RhdGUoayxlZGdlcyxlb3RQcmVkaWN0c0FsdCxkZXNjcmlwdGlvbixzdGF0ZU51bWJlcixzZW1QcmVkU3RhdGUpCisgICAgICAgICAgICAJCQkgICAgKi8KKyAgICAgICAgICAgIAkJCSAgICBpbnQgTEE5XzUgPSBMQSgyKTsKKyAgICAgICAgICAgIAkJCSAgICBpZiAoIChzeW5wcmVkMjFfZm1sKGN0eCkpKQorICAgICAgICAgICAgCQkJICAgIHsKKyAgICAgICAgICAgIAkJCSAgICAgICAgYWx0OT01OworICAgICAgICAgICAgCQkJICAgIH0KKworICAgICAgICAgICAgCQkJfQorICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMzYxOgorICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAJCQlhbHQ5PTY7CisgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAyNDM6CisgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgIAkJCWFsdDk9NzsKKyAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDM1NToKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkJYWx0OT04OworICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMzQ5OgorICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAJCQlhbHQ5PTk7CisgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAyOTg6CisgICAgICAgICAgICAJY2FzZSAzMDU6CisgICAgICAgICAgICAJY2FzZSAzNDE6CisgICAgICAgICAgICAJY2FzZSAzNjQ6CisgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgIAkJCWFsdDk9MTA7CisgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAl9CisKKyAgICAgICAgICAgIAlzd2l0Y2ggKGFsdDkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICBjYXNlIDE6CisgICAgICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo3MTI6NjogJ2ZpbmFsJworICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBNQVRDSFQoMjgyLCAmRk9MTE9XXzI4Ml9pbl9tb2RpZmllcl9kZWNsYXJhdGlvbjQ2Nyk7CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZW1vZGlmaWVyX2RlY2xhcmF0aW9uRXg7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiBtZGZyOworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgIG1kZnIuc2V0RmVhdHVyZUZpbmFsKCk7ICAgICAKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgIGNhc2UgMjoKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjcxNTo2OiAnc3RhdGljJworICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBNQVRDSFQoMzgwLCAmRk9MTE9XXzM4MF9pbl9tb2RpZmllcl9kZWNsYXJhdGlvbjQ4Nik7CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZW1vZGlmaWVyX2RlY2xhcmF0aW9uRXg7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiBtZGZyOworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgIG1kZnIuc2V0RmVhdHVyZVN0YXRpYygpOyAgICAKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgIGNhc2UgMzoKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjcxNzo2OiAndm9sYXRpbGUnCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIE1BVENIVCg0MTQsICZGT0xMT1dfNDE0X2luX21vZGlmaWVyX2RlY2xhcmF0aW9uNTAzKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlbW9kaWZpZXJfZGVjbGFyYXRpb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIG1kZnI7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgbWRmci5zZXRGZWF0dXJlVm9sYXRpbGUoKTsgIAorICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgY2FzZSA0OgorICAgICAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NzE4OjY6ICd0cmFuc2llbnQnCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIE1BVENIVCgzOTUsICZGT0xMT1dfMzk1X2luX21vZGlmaWVyX2RlY2xhcmF0aW9uNTE3KTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlbW9kaWZpZXJfZGVjbGFyYXRpb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIG1kZnI7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgbWRmci5zZXRGZWF0dXJlVHJhbnNpZW50KCk7IAorICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgY2FzZSA1OgorICAgICAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NzIwOjY6ICd1bnNhZmUnCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIE1BVENIVCg0MDYsICZGT0xMT1dfNDA2X2luX21vZGlmaWVyX2RlY2xhcmF0aW9uNTMxKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlbW9kaWZpZXJfZGVjbGFyYXRpb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIG1kZnI7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgbWRmci5zZXRGZWF0dXJlVW5zYWZlKCk7ICAgIAorICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgY2FzZSA2OgorICAgICAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NzIyOjY6ICdyZWYnCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIE1BVENIVCgzNjEsICZGT0xMT1dfMzYxX2luX21vZGlmaWVyX2RlY2xhcmF0aW9uNTQ4KTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlbW9kaWZpZXJfZGVjbGFyYXRpb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIG1kZnI7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgbWRmci5zZXROYXR1cmVSZWZlcmVuY2UoKTsgIAorICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgY2FzZSA3OgorICAgICAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NzI1OjY6ICdiaW5kJworICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBNQVRDSFQoMjQzLCAmRk9MTE9XXzI0M19pbl9tb2RpZmllcl9kZWNsYXJhdGlvbjU2OSk7CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZW1vZGlmaWVyX2RlY2xhcmF0aW9uRXg7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiBtZGZyOworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgIG1kZnIuc2V0TmF0dXJlQmluZCgpOyAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgIGNhc2UgODoKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjcyNzo2OiAncHVibGljJworICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBNQVRDSFQoMzU1LCAmRk9MTE9XXzM1NV9pbl9tb2RpZmllcl9kZWNsYXJhdGlvbjU4OCk7CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZW1vZGlmaWVyX2RlY2xhcmF0aW9uRXg7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiBtZGZyOworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgIG1kZnIuc2V0VmlzaWJpbGl0eVB1YmxpYygpOyAgICAKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgIGNhc2UgOToKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjcyOTo2OiAncHJpdmF0ZScKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgTUFUQ0hUKDM0OSwgJkZPTExPV18zNDlfaW5fbW9kaWZpZXJfZGVjbGFyYXRpb242MDUpOworICAgICAgICAgICAgCSAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVtb2RpZmllcl9kZWNsYXJhdGlvbkV4OworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gbWRmcjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICBtZGZyLnNldFZpc2liaWxpdHlQcml2YXRlKCk7ICAgCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICBjYXNlIDEwOgorICAgICAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NzMxOjY6IG1vZGlmaWVyX3NldF9kaXJlY3Rpb25fc3RyaWN0X3RleHRbIG1kZnIgXQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX21vZGlmaWVyX3NldF9kaXJlY3Rpb25fc3RyaWN0X3RleHRfaW5fbW9kaWZpZXJfZGVjbGFyYXRpb242MjEpOworICAgICAgICAgICAgCSAgICAgICAgICAgIG1vZGlmaWVyX3NldF9kaXJlY3Rpb25fc3RyaWN0X3RleHQoY3R4LCBtZGZyKTsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVtb2RpZmllcl9kZWNsYXJhdGlvbkV4OworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gbWRmcjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgZGVmYXVsdDoKKworICAgICAgICAgICAgCQlpZiAoIGNudDkgPj0gMSApCisgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgIAkJICAgIGdvdG8gbG9vcDk7CisgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgIAkJaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAJCSAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAJCSAgICByZXR1cm4gbWRmcjsKKyAgICAgICAgICAgIAkJfQorCisgICAgICAgICAgICAJCS8qIG1pc21hdGNoZWRTZXRFeCgpCisgICAgICAgICAgICAJCSAqLworICAgICAgICAgICAgCQlDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgCQlFWENFUFRJT04tPnR5cGUgPSBBTlRMUjNfRUFSTFlfRVhJVF9FWENFUFRJT047CisgICAgICAgICAgICAJCUVYQ0VQVElPTi0+bmFtZSA9ICh2b2lkICopQU5UTFIzX0VBUkxZX0VYSVRfTkFNRTsKKworCisgICAgICAgICAgICAJCWdvdG8gcnVsZW1vZGlmaWVyX2RlY2xhcmF0aW9uRXg7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgCWNudDkrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9vcDk6IDsJLyogSnVtcCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZW1vZGlmaWVyX2RlY2xhcmF0aW9uRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlbW9kaWZpZXJfZGVjbGFyYXRpb25FeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDUsIG1vZGlmaWVyX2RlY2xhcmF0aW9uX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gbWRmcjsKK30KKy8qICRBTlRMUiBlbmQgbW9kaWZpZXJfZGVjbGFyYXRpb24gKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgbW9kaWZpZXJfZGlyZWN0aW9uCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo3Mzc6MTogbW9kaWZpZXJfZGlyZWN0aW9uIHJldHVybnMgWyBzZXA6Ok1vZGlmaWVyIG1kZnIgXSA6ICggKCAnLT4nIHwgJ2luJyB8ICdpbnB1dCcgKSB8ICggJzwtJyB8ICdvdXQnIHwgJ291dHB1dCcgKSB8ICggJzwtPicgfCAnaW5vdXQnICkgfCAoICc8PScgfCAncmV0dXJuJyApICk7CisgKi8KK3N0YXRpYyBzZXA6Ok1vZGlmaWVyCittb2RpZmllcl9kaXJlY3Rpb24ocGZtbFBhcnNlciBjdHgpCit7CisgICAgc2VwOjpNb2RpZmllciBtZGZyOworCisgICAgQU5UTFIzX1VJTlQzMiBtb2RpZmllcl9kaXJlY3Rpb25fU3RhcnRJbmRleDsKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBtb2RpZmllcl9kaXJlY3Rpb25fU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoNikpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gbWRmcjsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vICAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo3Mzk6MjogKCAoICctPicgfCAnaW4nIHwgJ2lucHV0JyApIHwgKCAnPC0nIHwgJ291dCcgfCAnb3V0cHV0JyApIHwgKCAnPC0+JyB8ICdpbm91dCcgKSB8ICggJzw9JyB8ICdyZXR1cm4nICkgKQorCisgICAgICAgICAgICBBTlRMUjNfVUlOVDMyIGFsdDEwOworCisgICAgICAgICAgICBhbHQxMD00OworCisgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDE2NDoKKyAgICAgICAgICAgIGNhc2UgMjk1OgorICAgICAgICAgICAgY2FzZSAzMDU6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQxMD0xOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVNTSUdOX1JFRjoKKyAgICAgICAgICAgIGNhc2UgMzM1OgorICAgICAgICAgICAgY2FzZSAzNDE6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQxMD0yOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTY2OgorICAgICAgICAgICAgY2FzZSAyOTg6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQxMD0zOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTFRFOgorICAgICAgICAgICAgY2FzZSAzNjQ6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQxMD00OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtZGZyOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMTA7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVtb2RpZmllcl9kaXJlY3Rpb25FeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDEwKQorICAgICAgICAgICAgeworICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjczOTo0OiAoICctPicgfCAnaW4nIHwgJ2lucHV0JyApCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBpZiAoIExBKDEpID09IDE2NCB8fCBMQSgxKSA9PSAyOTUgfHwgTEEoMSkgPT0gMzA1ICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgQ09OU1VNRSgpOworICAgICAgICAJICAgICAgICAgICAgUEVSUk9SUkVDT1ZFUlk9QU5UTFIzX0ZBTFNFOworICAgICAgICAJICAgICAgICAgICAgRkFJTEVERkxBRz1BTlRMUjNfRkFMU0U7CisKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBlbHNlCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIG1kZnI7CisgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19NSVNNQVRDSEVEX1NFVF9FWENFUFRJT047CisgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPm5hbWUgICAgICAgICA9ICh2b2lkICopQU5UTFIzX01JU01BVENIRURfU0VUX05BTUU7CisgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPmV4cGVjdGluZ1NldCA9IE5VTEw7CisKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW1vZGlmaWVyX2RpcmVjdGlvbkV4OworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBtZGZyLnNldERpcmVjdGlvbklucHV0KCk7ICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDI6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NzQwOjQ6ICggJzwtJyB8ICdvdXQnIHwgJ291dHB1dCcgKQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgaWYgKCBMQSgxKSA9PSBBU1NJR05fUkVGIHx8IExBKDEpID09IDMzNSB8fCBMQSgxKSA9PSAzNDEgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBDT05TVU1FKCk7CisgICAgICAgIAkgICAgICAgICAgICBQRVJST1JSRUNPVkVSWT1BTlRMUjNfRkFMU0U7CisgICAgICAgIAkgICAgICAgICAgICBGQUlMRURGTEFHPUFOVExSM19GQUxTRTsKKworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGVsc2UKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gbWRmcjsKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX01JU01BVENIRURfU0VUX0VYQ0VQVElPTjsKKyAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+bmFtZSAgICAgICAgID0gKHZvaWQgKilBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfTkFNRTsKKyAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+ZXhwZWN0aW5nU2V0ID0gTlVMTDsKKworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlbW9kaWZpZXJfZGlyZWN0aW9uRXg7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG1kZnIuc2V0RGlyZWN0aW9uT3V0cHV0KCk7IAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMzoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo3NDE6NDogKCAnPC0+JyB8ICdpbm91dCcgKQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgaWYgKCBMQSgxKSA9PSAxNjYgfHwgTEEoMSkgPT0gMjk4ICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgQ09OU1VNRSgpOworICAgICAgICAJICAgICAgICAgICAgUEVSUk9SUkVDT1ZFUlk9QU5UTFIzX0ZBTFNFOworICAgICAgICAJICAgICAgICAgICAgRkFJTEVERkxBRz1BTlRMUjNfRkFMU0U7CisKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBlbHNlCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIG1kZnI7CisgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19NSVNNQVRDSEVEX1NFVF9FWENFUFRJT047CisgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPm5hbWUgICAgICAgICA9ICh2b2lkICopQU5UTFIzX01JU01BVENIRURfU0VUX05BTUU7CisgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPmV4cGVjdGluZ1NldCA9IE5VTEw7CisKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW1vZGlmaWVyX2RpcmVjdGlvbkV4OworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBtZGZyLnNldERpcmVjdGlvbklub3V0KCk7ICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDQ6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NzQyOjQ6ICggJzw9JyB8ICdyZXR1cm4nICkKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIGlmICggTEEoMSkgPT0gTFRFIHx8IExBKDEpID09IDM2NCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIENPTlNVTUUoKTsKKyAgICAgICAgCSAgICAgICAgICAgIFBFUlJPUlJFQ09WRVJZPUFOVExSM19GQUxTRTsKKyAgICAgICAgCSAgICAgICAgICAgIEZBSUxFREZMQUc9QU5UTFIzX0ZBTFNFOworCisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgZWxzZQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiBtZGZyOworICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfRVhDRVBUSU9OOworICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT5uYW1lICAgICAgICAgPSAodm9pZCAqKUFOVExSM19NSVNNQVRDSEVEX1NFVF9OQU1FOworICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT5leHBlY3RpbmdTZXQgPSBOVUxMOworCisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVtb2RpZmllcl9kaXJlY3Rpb25FeDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgbWRmci5zZXREaXJlY3Rpb25SZXR1cm4oKTsgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVtb2RpZmllcl9kaXJlY3Rpb25FeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVtb2RpZmllcl9kaXJlY3Rpb25FeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDYsIG1vZGlmaWVyX2RpcmVjdGlvbl9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIG1kZnI7Cit9CisvKiAkQU5UTFIgZW5kIG1vZGlmaWVyX2RpcmVjdGlvbiAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBtb2RpZmllcl9kaXJlY3Rpb25fdGV4dAorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NzQ1OjE6IG1vZGlmaWVyX2RpcmVjdGlvbl90ZXh0IHJldHVybnMgWyBzZXA6Ok1vZGlmaWVyIG1kZnIgXSA6ICggKCAnaW4nIHwgJ2lucHV0JyApIHwgKCAnb3V0JyB8ICdvdXRwdXQnICkgfCAoICdpbm91dCcgKSB8ICggJ3JldHVybicgKSApOworICovCitzdGF0aWMgc2VwOjpNb2RpZmllcgorbW9kaWZpZXJfZGlyZWN0aW9uX3RleHQocGZtbFBhcnNlciBjdHgpCit7CisgICAgc2VwOjpNb2RpZmllciBtZGZyOworCisgICAgQU5UTFIzX1VJTlQzMiBtb2RpZmllcl9kaXJlY3Rpb25fdGV4dF9TdGFydEluZGV4OworCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIG1vZGlmaWVyX2RpcmVjdGlvbl90ZXh0X1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDcpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIG1kZnI7CisgICAgfQorCisgICAgeworICAgICAgICB7CisgICAgICAgICAgICAvLyAgL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NzQ3OjI6ICggKCAnaW4nIHwgJ2lucHV0JyApIHwgKCAnb3V0JyB8ICdvdXRwdXQnICkgfCAoICdpbm91dCcgKSB8ICggJ3JldHVybicgKSApCisKKyAgICAgICAgICAgIEFOVExSM19VSU5UMzIgYWx0MTE7CisKKyAgICAgICAgICAgIGFsdDExPTQ7CisKKyAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMjk1OgorICAgICAgICAgICAgY2FzZSAzMDU6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQxMT0xOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzM1OgorICAgICAgICAgICAgY2FzZSAzNDE6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQxMT0yOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjk4OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MTE9MzsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM2NDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDExPTQ7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1kZnI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAxMTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgIGdvdG8gcnVsZW1vZGlmaWVyX2RpcmVjdGlvbl90ZXh0RXg7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQxMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo3NDc6NDogKCAnaW4nIHwgJ2lucHV0JyApCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBpZiAoIExBKDEpID09IDI5NSB8fCBMQSgxKSA9PSAzMDUgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBDT05TVU1FKCk7CisgICAgICAgIAkgICAgICAgICAgICBQRVJST1JSRUNPVkVSWT1BTlRMUjNfRkFMU0U7CisgICAgICAgIAkgICAgICAgICAgICBGQUlMRURGTEFHPUFOVExSM19GQUxTRTsKKworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGVsc2UKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gbWRmcjsKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX01JU01BVENIRURfU0VUX0VYQ0VQVElPTjsKKyAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+bmFtZSAgICAgICAgID0gKHZvaWQgKilBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfTkFNRTsKKyAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+ZXhwZWN0aW5nU2V0ID0gTlVMTDsKKworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlbW9kaWZpZXJfZGlyZWN0aW9uX3RleHRFeDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgbWRmci5zZXREaXJlY3Rpb25JbnB1dCgpOyAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAyOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjc0ODo0OiAoICdvdXQnIHwgJ291dHB1dCcgKQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgaWYgKCBMQSgxKSA9PSAzMzUgfHwgTEEoMSkgPT0gMzQxICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgQ09OU1VNRSgpOworICAgICAgICAJICAgICAgICAgICAgUEVSUk9SUkVDT1ZFUlk9QU5UTFIzX0ZBTFNFOworICAgICAgICAJICAgICAgICAgICAgRkFJTEVERkxBRz1BTlRMUjNfRkFMU0U7CisKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBlbHNlCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIG1kZnI7CisgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19NSVNNQVRDSEVEX1NFVF9FWENFUFRJT047CisgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPm5hbWUgICAgICAgICA9ICh2b2lkICopQU5UTFIzX01JU01BVENIRURfU0VUX05BTUU7CisgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPmV4cGVjdGluZ1NldCA9IE5VTEw7CisKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW1vZGlmaWVyX2RpcmVjdGlvbl90ZXh0RXg7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG1kZnIuc2V0RGlyZWN0aW9uT3V0cHV0KCk7IAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMzoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo3NDk6NDogKCAnaW5vdXQnICkKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjc0OTo0OiAoICdpbm91dCcgKQorICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo3NDk6NjogJ2lub3V0JworICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgTUFUQ0hUKDI5OCwgJkZPTExPV18yOThfaW5fbW9kaWZpZXJfZGlyZWN0aW9uX3RleHQ3ODUpOworICAgICAgICAJICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVtb2RpZmllcl9kaXJlY3Rpb25fdGV4dEV4OworICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiBtZGZyOworICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgbWRmci5zZXREaXJlY3Rpb25Jbm91dCgpOyAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA0OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjc1MDo0OiAoICdyZXR1cm4nICkKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjc1MDo0OiAoICdyZXR1cm4nICkKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NzUwOjY6ICdyZXR1cm4nCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBNQVRDSFQoMzY0LCAmRk9MTE9XXzM2NF9pbl9tb2RpZmllcl9kaXJlY3Rpb25fdGV4dDgwNik7CisgICAgICAgIAkgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZW1vZGlmaWVyX2RpcmVjdGlvbl90ZXh0RXg7CisgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIG1kZnI7CisgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBtZGZyLnNldERpcmVjdGlvblJldHVybigpOyAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZW1vZGlmaWVyX2RpcmVjdGlvbl90ZXh0RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlbW9kaWZpZXJfZGlyZWN0aW9uX3RleHRFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDcsIG1vZGlmaWVyX2RpcmVjdGlvbl90ZXh0X1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gbWRmcjsKK30KKy8qICRBTlRMUiBlbmQgbW9kaWZpZXJfZGlyZWN0aW9uX3RleHQgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dAorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NzUzOjE6IG1vZGlmaWVyX3NldF9kaXJlY3Rpb25fc3RyaWN0X3RleHRbIHNlcDo6TW9kaWZpZXIgJiBtZGZyIF0gOiAoICdpbnB1dCcgfCAnb3V0cHV0JyB8ICdpbm91dCcgfCAncmV0dXJuJyApOworICovCitzdGF0aWMgdm9pZAorbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dChwZm1sUGFyc2VyIGN0eCwgc2VwOjpNb2RpZmllciAmIG1kZnIpCit7CisgICAgQU5UTFIzX1VJTlQzMiBtb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0X1N0YXJ0SW5kZXg7CisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dF9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSg4KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgeworICAgICAgICB7CisgICAgICAgICAgICAvLyAgL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NzU1OjI6ICggJ2lucHV0JyB8ICdvdXRwdXQnIHwgJ2lub3V0JyB8ICdyZXR1cm4nICkKKworICAgICAgICAgICAgQU5UTFIzX1VJTlQzMiBhbHQxMjsKKworICAgICAgICAgICAgYWx0MTI9NDsKKworICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAzMDU6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQxMj0xOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzQxOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MTI9MjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI5ODoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDEyPTM7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzNjQ6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQxMj00OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAxMjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgIGdvdG8gcnVsZW1vZGlmaWVyX3NldF9kaXJlY3Rpb25fc3RyaWN0X3RleHRFeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDEyKQorICAgICAgICAgICAgeworICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjc1NTo0OiAnaW5wdXQnCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDMwNSwgJkZPTExPV18zMDVfaW5fbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dDgzMyk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW1vZGlmaWVyX3NldF9kaXJlY3Rpb25fc3RyaWN0X3RleHRFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG1kZnIuc2V0RGlyZWN0aW9uSW5wdXQoKTsgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo3NTY6NDogJ291dHB1dCcKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMzQxLCAmRk9MTE9XXzM0MV9pbl9tb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0ODQzKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgbWRmci5zZXREaXJlY3Rpb25PdXRwdXQoKTsgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAzOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjc1Nzo0OiAnaW5vdXQnCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDI5OCwgJkZPTExPV18yOThfaW5fbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dDg1Mik7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW1vZGlmaWVyX3NldF9kaXJlY3Rpb25fc3RyaWN0X3RleHRFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG1kZnIuc2V0RGlyZWN0aW9uSW5vdXQoKTsgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgNDoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo3NTg6NDogJ3JldHVybicKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMzY0LCAmRk9MTE9XXzM2NF9pbl9tb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0ODYyKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgbWRmci5zZXREaXJlY3Rpb25SZXR1cm4oKTsgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVtb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dEV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoOCwgbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dF9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dCAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBtb2RpZmllcl9kaXJlY3Rpb25fc3ltYm9sCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo3NjE6MTogbW9kaWZpZXJfZGlyZWN0aW9uX3N5bWJvbCByZXR1cm5zIFsgc2VwOjpNb2RpZmllciBtZGZyIF0gOiAoICctPicgfCAnPC0nIHwgJzwtPicgfCAnPD0nICk7CisgKi8KK3N0YXRpYyBzZXA6Ok1vZGlmaWVyCittb2RpZmllcl9kaXJlY3Rpb25fc3ltYm9sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIHNlcDo6TW9kaWZpZXIgbWRmcjsKKworICAgIEFOVExSM19VSU5UMzIgbW9kaWZpZXJfZGlyZWN0aW9uX3N5bWJvbF9TdGFydEluZGV4OworCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIG1vZGlmaWVyX2RpcmVjdGlvbl9zeW1ib2xfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoOSkpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gbWRmcjsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vICAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo3NjM6MjogKCAnLT4nIHwgJzwtJyB8ICc8LT4nIHwgJzw9JyApCisKKyAgICAgICAgICAgIEFOVExSM19VSU5UMzIgYWx0MTM7CisKKyAgICAgICAgICAgIGFsdDEzPTQ7CisKKyAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMTY0OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MTM9MTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTU0lHTl9SRUY6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQxMz0yOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTY2OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MTM9MzsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIExURToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDEzPTQ7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1kZnI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAxMzsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgIGdvdG8gcnVsZW1vZGlmaWVyX2RpcmVjdGlvbl9zeW1ib2xFeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDEzKQorICAgICAgICAgICAgeworICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjc2Mzo0OiAnLT4nCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDE2NCwgJkZPTExPV18xNjRfaW5fbW9kaWZpZXJfZGlyZWN0aW9uX3N5bWJvbDg4MSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW1vZGlmaWVyX2RpcmVjdGlvbl9zeW1ib2xFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBtZGZyOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBtZGZyLnNldERpcmVjdGlvbklucHV0KCk7ICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDI6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NzY0OjQ6ICc8LScKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoQVNTSUdOX1JFRiwgJkZPTExPV19BU1NJR05fUkVGX2luX21vZGlmaWVyX2RpcmVjdGlvbl9zeW1ib2w4OTEpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVtb2RpZmllcl9kaXJlY3Rpb25fc3ltYm9sRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gbWRmcjsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgbWRmci5zZXREaXJlY3Rpb25PdXRwdXQoKTsgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAzOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjc2NTo0OiAnPC0+JworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgxNjYsICZGT0xMT1dfMTY2X2luX21vZGlmaWVyX2RpcmVjdGlvbl9zeW1ib2w5MDEpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVtb2RpZmllcl9kaXJlY3Rpb25fc3ltYm9sRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gbWRmcjsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgbWRmci5zZXREaXJlY3Rpb25Jbm91dCgpOyAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA0OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjc2Njo0OiAnPD0nCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKExURSwgJkZPTExPV19MVEVfaW5fbW9kaWZpZXJfZGlyZWN0aW9uX3N5bWJvbDkxMCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW1vZGlmaWVyX2RpcmVjdGlvbl9zeW1ib2xFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBtZGZyOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBtZGZyLnNldERpcmVjdGlvblJldHVybigpOyAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZW1vZGlmaWVyX2RpcmVjdGlvbl9zeW1ib2xFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVtb2RpZmllcl9kaXJlY3Rpb25fc3ltYm9sRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSg5LCBtb2RpZmllcl9kaXJlY3Rpb25fc3ltYm9sX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gbWRmcjsKK30KKy8qICRBTlRMUiBlbmQgbW9kaWZpZXJfZGlyZWN0aW9uX3N5bWJvbCAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBtb2RpZmllcl9wYXJhbQorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NzcxOjE6IG1vZGlmaWVyX3BhcmFtIHJldHVybnMgWyBzZXA6Ok1vZGlmaWVyIG1kZnIgXSA6IChtPSBtb2RpZmllcl9kaXJlY3Rpb24gfCAnZmluYWwnIHwgJ2NvbnN0JyB8ICggJyYnIHwgJ3JlZicgKSB8ICdtYWNybycgfCAnYmluZCcgKTsKKyAqLworc3RhdGljIHNlcDo6TW9kaWZpZXIKK21vZGlmaWVyX3BhcmFtKHBmbWxQYXJzZXIgY3R4KQoreworICAgIHNlcDo6TW9kaWZpZXIgbWRmcjsKKworICAgIEFOVExSM19VSU5UMzIgbW9kaWZpZXJfcGFyYW1fU3RhcnRJbmRleDsKKworICAgIHNlcDo6TW9kaWZpZXIgbTsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfbQorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfbSBzZXA6Ok1vZGlmaWVyCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgbW9kaWZpZXJfcGFyYW1fU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTApKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIG1kZnI7CisgICAgfQorCisgICAgeworICAgICAgICB7CisgICAgICAgICAgICAvLyAgL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NzczOjI6IChtPSBtb2RpZmllcl9kaXJlY3Rpb24gfCAnZmluYWwnIHwgJ2NvbnN0JyB8ICggJyYnIHwgJ3JlZicgKSB8ICdtYWNybycgfCAnYmluZCcgKQorCisgICAgICAgICAgICBBTlRMUjNfVUlOVDMyIGFsdDE0OworCisgICAgICAgICAgICBhbHQxND02OworCisgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEFTU0lHTl9SRUY6CisgICAgICAgICAgICBjYXNlIExURToKKyAgICAgICAgICAgIGNhc2UgMTY0OgorICAgICAgICAgICAgY2FzZSAxNjY6CisgICAgICAgICAgICBjYXNlIDI5NToKKyAgICAgICAgICAgIGNhc2UgMjk4OgorICAgICAgICAgICAgY2FzZSAzMDU6CisgICAgICAgICAgICBjYXNlIDMzNToKKyAgICAgICAgICAgIGNhc2UgMzQxOgorICAgICAgICAgICAgY2FzZSAzNjQ6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQxND0xOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjgyOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MTQ9MjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI2MjoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDE0PTM7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQU5EOgorICAgICAgICAgICAgY2FzZSAzNjE6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQxND00OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzE4OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MTQ9NTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI0MzoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDE0PTY7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1kZnI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAxNDsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgIGdvdG8gcnVsZW1vZGlmaWVyX3BhcmFtRXg7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQxNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo3NzM6NDogbT0gbW9kaWZpZXJfZGlyZWN0aW9uCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19tb2RpZmllcl9kaXJlY3Rpb25faW5fbW9kaWZpZXJfcGFyYW05MzQpOworICAgICAgICAJICAgICAgICBtPW1vZGlmaWVyX2RpcmVjdGlvbihjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVtb2RpZmllcl9wYXJhbUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG1kZnI7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG1kZnIgPSBtCisgICAgICAgIAkgICAgICAgICAgICA7IAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo3NzU6NDogJ2ZpbmFsJworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgyODIsICZGT0xMT1dfMjgyX2luX21vZGlmaWVyX3BhcmFtOTQzKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlbW9kaWZpZXJfcGFyYW1FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBtZGZyOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBtZGZyLnNldEZlYXR1cmVGaW5hbCgpOyAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDM6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Nzc2OjQ6ICdjb25zdCcKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMjYyLCAmRk9MTE9XXzI2Ml9pbl9tb2RpZmllcl9wYXJhbTk2MCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW1vZGlmaWVyX3BhcmFtRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gbWRmcjsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgbWRmci5zZXRGZWF0dXJlQ29uc3QoKTsgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA0OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjc3ODo0OiAoICcmJyB8ICdyZWYnICkKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIGlmICggTEEoMSkgPT0gQkFORCB8fCBMQSgxKSA9PSAzNjEgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBDT05TVU1FKCk7CisgICAgICAgIAkgICAgICAgICAgICBQRVJST1JSRUNPVkVSWT1BTlRMUjNfRkFMU0U7CisgICAgICAgIAkgICAgICAgICAgICBGQUlMRURGTEFHPUFOVExSM19GQUxTRTsKKworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGVsc2UKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gbWRmcjsKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX01JU01BVENIRURfU0VUX0VYQ0VQVElPTjsKKyAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+bmFtZSAgICAgICAgID0gKHZvaWQgKilBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfTkFNRTsKKyAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+ZXhwZWN0aW5nU2V0ID0gTlVMTDsKKworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlbW9kaWZpZXJfcGFyYW1FeDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgbWRmci5zZXROYXR1cmVSZWZlcmVuY2UoKTsgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA1OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjc3OTo0OiAnbWFjcm8nCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDMxOCwgJkZPTExPV18zMThfaW5fbW9kaWZpZXJfcGFyYW05OTUpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVtb2RpZmllcl9wYXJhbUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG1kZnI7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG1kZnIuc2V0TmF0dXJlTWFjcm8oKTsgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgNjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo3ODE6NDogJ2JpbmQnCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDI0MywgJkZPTExPV18yNDNfaW5fbW9kaWZpZXJfcGFyYW0xMDEzKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlbW9kaWZpZXJfcGFyYW1FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBtZGZyOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBtZGZyLnNldE5hdHVyZUJpbmQoKTsgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZW1vZGlmaWVyX3BhcmFtRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlbW9kaWZpZXJfcGFyYW1FeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDEwLCBtb2RpZmllcl9wYXJhbV9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIG1kZnI7Cit9CisvKiAkQU5UTFIgZW5kIG1vZGlmaWVyX3BhcmFtICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IHByb2NlZHVyZV9tb2RpZmllcl9zcGVjaWZpZXIKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjc4NjoxOiBwcm9jZWR1cmVfbW9kaWZpZXJfc3BlY2lmaWVyIHJldHVybnMgWyBzZXA6Ok1vZGlmaWVyIG1kZnIgLCBzZXA6OlNwZWNpZmllciBzcGNmciBdIDogKCAndGltZWQnIHwgJ2lucHV0X2VuYWJsZWQnIHwgJ3Vuc2FmZScgKSsgOworICovCitzdGF0aWMgZm1sUGFyc2VyX3Byb2NlZHVyZV9tb2RpZmllcl9zcGVjaWZpZXJfcmV0dXJuCitwcm9jZWR1cmVfbW9kaWZpZXJfc3BlY2lmaWVyKHBmbWxQYXJzZXIgY3R4KQoreworICAgIGZtbFBhcnNlcl9wcm9jZWR1cmVfbW9kaWZpZXJfc3BlY2lmaWVyX3JldHVybiByZXR2YWw7CisKKyAgICBBTlRMUjNfVUlOVDMyIHByb2NlZHVyZV9tb2RpZmllcl9zcGVjaWZpZXJfU3RhcnRJbmRleDsKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBwcm9jZWR1cmVfbW9kaWZpZXJfc3BlY2lmaWVyX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDExKSkgKQorICAgIHsKKyAgICAJcmV0dmFsLnN0YXJ0ID0gMDsKKworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CisKKyAgICByZXR2YWwuc3RhcnQgPSBMVCgxKTsgcmV0dmFsLnN0b3AgPSByZXR2YWwuc3RhcnQ7CisKKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6ODA1OjI6ICggKCAndGltZWQnIHwgJ2lucHV0X2VuYWJsZWQnIHwgJ3Vuc2FmZScgKSsgKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo4MDU6NDogKCAndGltZWQnIHwgJ2lucHV0X2VuYWJsZWQnIHwgJ3Vuc2FmZScgKSsKKyAgICAgICAgeworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6ODA1OjQ6ICggJ3RpbWVkJyB8ICdpbnB1dF9lbmFibGVkJyB8ICd1bnNhZmUnICkrCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGNudDE1PTA7CisKKyAgICAgICAgICAgICAgICBmb3IgKDs7KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGFsdDE1PTQ7CisgICAgICAgICAgICAJc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAljYXNlIDM5MzoKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkJYWx0MTU9MTsKKyAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDMwNjoKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkJYWx0MTU9MjsKKyAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDQwNjoKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkJYWx0MTU9MzsKKyAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCX0KKworICAgICAgICAgICAgCXN3aXRjaCAoYWx0MTUpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICBjYXNlIDE6CisgICAgICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo4MDU6NjogJ3RpbWVkJworICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBNQVRDSFQoMzkzLCAmRk9MTE9XXzM5M19pbl9wcm9jZWR1cmVfbW9kaWZpZXJfc3BlY2lmaWVyMTA2Mik7CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZXByb2NlZHVyZV9tb2RpZmllcl9zcGVjaWZpZXJFeDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICByZXR2YWwuc3BjZnIKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgLnNldEZlYXR1cmVUaW1lZCgpOyAgICAgICAgCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICBjYXNlIDI6CisgICAgICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo4MDY6NjogJ2lucHV0X2VuYWJsZWQnCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIE1BVENIVCgzMDYsICZGT0xMT1dfMzA2X2luX3Byb2NlZHVyZV9tb2RpZmllcl9zcGVjaWZpZXIxMDc5KTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlcHJvY2VkdXJlX21vZGlmaWVyX3NwZWNpZmllckV4OworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgIHJldHZhbC5zcGNmcgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAuc2V0RmVhdHVyZUlucHV0RW5hYmxlZCgpOyAKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgIGNhc2UgMzoKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjgwODo2OiAndW5zYWZlJworICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBNQVRDSFQoNDA2LCAmRk9MTE9XXzQwNl9pbl9wcm9jZWR1cmVfbW9kaWZpZXJfc3BlY2lmaWVyMTA4OSk7CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZXByb2NlZHVyZV9tb2RpZmllcl9zcGVjaWZpZXJFeDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICByZXR2YWwubWRmcgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAuc2V0RmVhdHVyZVVuc2FmZSgpOyAgICAgICAgCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgIGRlZmF1bHQ6CisKKyAgICAgICAgICAgIAkJaWYgKCBjbnQxNSA+PSAxICkKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkgICAgZ290byBsb29wMTU7CisgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgIAkJaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAJCSAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAJCSAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgCQl9CisKKyAgICAgICAgICAgIAkJLyogbWlzbWF0Y2hlZFNldEV4KCkKKyAgICAgICAgICAgIAkJICovCisgICAgICAgICAgICAJCUNPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAJCUVYQ0VQVElPTi0+dHlwZSA9IEFOVExSM19FQVJMWV9FWElUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIAkJRVhDRVBUSU9OLT5uYW1lID0gKHZvaWQgKilBTlRMUjNfRUFSTFlfRVhJVF9OQU1FOworCisKKyAgICAgICAgICAgIAkJZ290byBydWxlcHJvY2VkdXJlX21vZGlmaWVyX3NwZWNpZmllckV4OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAljbnQxNSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsb29wMTU6IDsJLyogSnVtcCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZXByb2NlZHVyZV9tb2RpZmllcl9zcGVjaWZpZXJFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVwcm9jZWR1cmVfbW9kaWZpZXJfc3BlY2lmaWVyRXg6IDsKKyAgICByZXR2YWwuc3RvcCA9IExUKC0xKTsKKworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDExLCBwcm9jZWR1cmVfbW9kaWZpZXJfc3BlY2lmaWVyX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gcmV0dmFsOworfQorLyogJEFOVExSIGVuZCBwcm9jZWR1cmVfbW9kaWZpZXJfc3BlY2lmaWVyICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGV4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo4MTM6MTogZXhlY3V0YWJsZV9tb2RpZmllcl9zcGVjaWZpZXIgcmV0dXJucyBbIHNlcDo6TW9kaWZpZXIgbWRmciAsIHNlcDo6U3BlY2lmaWVyIHNwY2ZyIF0gOiAoICdtb2RlbCcgfCAncHJvdG90eXBlJyB8ICdkeW5hbWljJyB8ICd1bnNhZmUnIHwgJ3RpbWVkJyB8ICdpbnB1dF9lbmFibGVkJyB8ICdsaWZlbGluZScgKSsgOworICovCitzdGF0aWMgZm1sUGFyc2VyX2V4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyX3JldHVybgorZXhlY3V0YWJsZV9tb2RpZmllcl9zcGVjaWZpZXIocGZtbFBhcnNlciBjdHgpCit7CisgICAgZm1sUGFyc2VyX2V4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyX3JldHVybiByZXR2YWw7CisKKyAgICBBTlRMUjNfVUlOVDMyIGV4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyX1N0YXJ0SW5kZXg7CisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgZXhlY3V0YWJsZV9tb2RpZmllcl9zcGVjaWZpZXJfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTIpKSApCisgICAgeworICAgIAlyZXR2YWwuc3RhcnQgPSAwOworCisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKworICAgIHJldHZhbC5zdGFydCA9IExUKDEpOyByZXR2YWwuc3RvcCA9IHJldHZhbC5zdGFydDsKKworCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo4MjA6MjogKCAoICdtb2RlbCcgfCAncHJvdG90eXBlJyB8ICdkeW5hbWljJyB8ICd1bnNhZmUnIHwgJ3RpbWVkJyB8ICdpbnB1dF9lbmFibGVkJyB8ICdsaWZlbGluZScgKSsgKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo4MjA6NDogKCAnbW9kZWwnIHwgJ3Byb3RvdHlwZScgfCAnZHluYW1pYycgfCAndW5zYWZlJyB8ICd0aW1lZCcgfCAnaW5wdXRfZW5hYmxlZCcgfCAnbGlmZWxpbmUnICkrCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjgyMDo0OiAoICdtb2RlbCcgfCAncHJvdG90eXBlJyB8ICdkeW5hbWljJyB8ICd1bnNhZmUnIHwgJ3RpbWVkJyB8ICdpbnB1dF9lbmFibGVkJyB8ICdsaWZlbGluZScgKSsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgY250MTY9MDsKKworICAgICAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTY9ODsKKyAgICAgICAgICAgIAlzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCWNhc2UgMzIyOgorICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAJCQl7CisgICAgICAgICAgICAJCQkgICAvKiBkZmFMb29wYmFja1N0YXRlKGssZWRnZXMsZW90UHJlZGljdHNBbHQsZGVzY3JpcHRpb24sc3RhdGVOdW1iZXIsc2VtUHJlZFN0YXRlKQorICAgICAgICAgICAgCQkJICAgICovCisgICAgICAgICAgICAJCQkgICAgaW50IExBMTZfMSA9IExBKDIpOworICAgICAgICAgICAgCQkJICAgIGlmICggKHN5bnByZWQ1Nl9mbWwoY3R4KSkpCisgICAgICAgICAgICAJCQkgICAgeworICAgICAgICAgICAgCQkJICAgICAgICBhbHQxNj0xOworICAgICAgICAgICAgCQkJICAgIH0KKworICAgICAgICAgICAgCQkJfQorICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMzUzOgorICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAJCQl7CisgICAgICAgICAgICAJCQkgICAvKiBkZmFMb29wYmFja1N0YXRlKGssZWRnZXMsZW90UHJlZGljdHNBbHQsZGVzY3JpcHRpb24sc3RhdGVOdW1iZXIsc2VtUHJlZFN0YXRlKQorICAgICAgICAgICAgCQkJICAgICovCisgICAgICAgICAgICAJCQkgICAgaW50IExBMTZfNCA9IExBKDIpOworICAgICAgICAgICAgCQkJICAgIGlmICggKHN5bnByZWQ1N19mbWwoY3R4KSkpCisgICAgICAgICAgICAJCQkgICAgeworICAgICAgICAgICAgCQkJICAgICAgICBhbHQxNj0yOworICAgICAgICAgICAgCQkJICAgIH0KKworICAgICAgICAgICAgCQkJfQorICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMjcyOgorICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAJCQl7CisgICAgICAgICAgICAJCQkgICAvKiBkZmFMb29wYmFja1N0YXRlKGssZWRnZXMsZW90UHJlZGljdHNBbHQsZGVzY3JpcHRpb24sc3RhdGVOdW1iZXIsc2VtUHJlZFN0YXRlKQorICAgICAgICAgICAgCQkJICAgICovCisgICAgICAgICAgICAJCQkgICAgaW50IExBMTZfNiA9IExBKDIpOworICAgICAgICAgICAgCQkJICAgIGlmICggKHN5bnByZWQ1OF9mbWwoY3R4KSkpCisgICAgICAgICAgICAJCQkgICAgeworICAgICAgICAgICAgCQkJICAgICAgICBhbHQxNj0zOworICAgICAgICAgICAgCQkJICAgIH0KKworICAgICAgICAgICAgCQkJfQorICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgNDA2OgorICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAJCQl7CisgICAgICAgICAgICAJCQkgICAvKiBkZmFMb29wYmFja1N0YXRlKGssZWRnZXMsZW90UHJlZGljdHNBbHQsZGVzY3JpcHRpb24sc3RhdGVOdW1iZXIsc2VtUHJlZFN0YXRlKQorICAgICAgICAgICAgCQkJICAgICovCisgICAgICAgICAgICAJCQkgICAgaW50IExBMTZfOCA9IExBKDIpOworICAgICAgICAgICAgCQkJICAgIGlmICggKHN5bnByZWQ1OV9mbWwoY3R4KSkpCisgICAgICAgICAgICAJCQkgICAgeworICAgICAgICAgICAgCQkJICAgICAgICBhbHQxNj00OworICAgICAgICAgICAgCQkJICAgIH0KKworICAgICAgICAgICAgCQkJfQorICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMzkzOgorICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAJCQl7CisgICAgICAgICAgICAJCQkgICAvKiBkZmFMb29wYmFja1N0YXRlKGssZWRnZXMsZW90UHJlZGljdHNBbHQsZGVzY3JpcHRpb24sc3RhdGVOdW1iZXIsc2VtUHJlZFN0YXRlKQorICAgICAgICAgICAgCQkJICAgICovCisgICAgICAgICAgICAJCQkgICAgaW50IExBMTZfMTAgPSBMQSgyKTsKKyAgICAgICAgICAgIAkJCSAgICBpZiAoIChzeW5wcmVkNjBfZm1sKGN0eCkpKQorICAgICAgICAgICAgCQkJICAgIHsKKyAgICAgICAgICAgIAkJCSAgICAgICAgYWx0MTY9NTsKKyAgICAgICAgICAgIAkJCSAgICB9CisKKyAgICAgICAgICAgIAkJCX0KKyAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDMwNjoKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkJeworICAgICAgICAgICAgCQkJICAgLyogZGZhTG9vcGJhY2tTdGF0ZShrLGVkZ2VzLGVvdFByZWRpY3RzQWx0LGRlc2NyaXB0aW9uLHN0YXRlTnVtYmVyLHNlbVByZWRTdGF0ZSkKKyAgICAgICAgICAgIAkJCSAgICAqLworICAgICAgICAgICAgCQkJICAgIGludCBMQTE2XzEyID0gTEEoMik7CisgICAgICAgICAgICAJCQkgICAgaWYgKCAoc3lucHJlZDYxX2ZtbChjdHgpKSkKKyAgICAgICAgICAgIAkJCSAgICB7CisgICAgICAgICAgICAJCQkgICAgICAgIGFsdDE2PTY7CisgICAgICAgICAgICAJCQkgICAgfQorCisgICAgICAgICAgICAJCQl9CisgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAzMTQ6CisgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgIAkJCXsKKyAgICAgICAgICAgIAkJCSAgIC8qIGRmYUxvb3BiYWNrU3RhdGUoayxlZGdlcyxlb3RQcmVkaWN0c0FsdCxkZXNjcmlwdGlvbixzdGF0ZU51bWJlcixzZW1QcmVkU3RhdGUpCisgICAgICAgICAgICAJCQkgICAgKi8KKyAgICAgICAgICAgIAkJCSAgICBpbnQgTEExNl8xNCA9IExBKDIpOworICAgICAgICAgICAgCQkJICAgIGlmICggKHN5bnByZWQ2Ml9mbWwoY3R4KSkpCisgICAgICAgICAgICAJCQkgICAgeworICAgICAgICAgICAgCQkJICAgICAgICBhbHQxNj03OworICAgICAgICAgICAgCQkJICAgIH0KKworICAgICAgICAgICAgCQkJfQorICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJfQorCisgICAgICAgICAgICAJc3dpdGNoIChhbHQxNikKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgIGNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjgyMDo2OiAnbW9kZWwnCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIE1BVENIVCgzMjIsICZGT0xMT1dfMzIyX2luX2V4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyMTEyNyk7CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZWV4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyRXg7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgcmV0dmFsLnNwY2ZyCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIC5zZXREZXNpZ25Nb2RlbCgpOyAgICAgICAgICAgCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICBjYXNlIDI6CisgICAgICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo4MjE6NjogJ3Byb3RvdHlwZScKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgTUFUQ0hUKDM1MywgJkZPTExPV18zNTNfaW5fZXhlY3V0YWJsZV9tb2RpZmllcl9zcGVjaWZpZXIxMTQ0KTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlZXhlY3V0YWJsZV9tb2RpZmllcl9zcGVjaWZpZXJFeDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICByZXR2YWwuc3BjZnIKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgLnNldERlc2lnblByb3RvdHlwZVN0YXRpYygpOyAKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgIGNhc2UgMzoKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjgyMzo2OiAnZHluYW1pYycKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgTUFUQ0hUKDI3MiwgJkZPTExPV18yNzJfaW5fZXhlY3V0YWJsZV9tb2RpZmllcl9zcGVjaWZpZXIxMTU4KTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlZXhlY3V0YWJsZV9tb2RpZmllcl9zcGVjaWZpZXJFeDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICByZXR2YWwuc3BjZnIKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgLnNldERlc2lnbkluc3RhbmNlRHluYW1pYygpOyAKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgIGNhc2UgNDoKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjgzMjo2OiAndW5zYWZlJworICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBNQVRDSFQoNDA2LCAmRk9MTE9XXzQwNl9pbl9leGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllcjExODEpOworICAgICAgICAgICAgCSAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVleGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllckV4OworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgIHJldHZhbC5tZGZyCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIC5zZXRGZWF0dXJlVW5zYWZlKCk7ICAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgIGNhc2UgNToKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjgzNDo2OiAndGltZWQnCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIE1BVENIVCgzOTMsICZGT0xMT1dfMzkzX2luX2V4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyMTE5OCk7CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZWV4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyRXg7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgcmV0dmFsLnNwY2ZyCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIC5zZXRGZWF0dXJlVGltZWQoKTsgICAgICAgIAorICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgY2FzZSA2OgorICAgICAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6ODM1OjY6ICdpbnB1dF9lbmFibGVkJworICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBNQVRDSFQoMzA2LCAmRk9MTE9XXzMwNl9pbl9leGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllcjEyMTUpOworICAgICAgICAgICAgCSAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVleGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllckV4OworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgIHJldHZhbC5zcGNmcgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAuc2V0RmVhdHVyZUlucHV0RW5hYmxlZCgpOyAKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgIGNhc2UgNzoKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjgzNjo2OiAnbGlmZWxpbmUnCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIE1BVENIVCgzMTQsICZGT0xMT1dfMzE0X2luX2V4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyMTIyNCk7CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZWV4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyRXg7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgcmV0dmFsLnNwY2ZyCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIC5zZXRGZWF0dXJlTGlmZWxpbmUoKTsgICAgIAorICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICBkZWZhdWx0OgorCisgICAgICAgICAgICAJCWlmICggY250MTYgPj0gMSApCisgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgIAkJICAgIGdvdG8gbG9vcDE2OworICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAJCWlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgCQkgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgICAgIAkJfQorCisgICAgICAgICAgICAJCS8qIG1pc21hdGNoZWRTZXRFeCgpCisgICAgICAgICAgICAJCSAqLworICAgICAgICAgICAgCQlDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgCQlFWENFUFRJT04tPnR5cGUgPSBBTlRMUjNfRUFSTFlfRVhJVF9FWENFUFRJT047CisgICAgICAgICAgICAJCUVYQ0VQVElPTi0+bmFtZSA9ICh2b2lkICopQU5UTFIzX0VBUkxZX0VYSVRfTkFNRTsKKworCisgICAgICAgICAgICAJCWdvdG8gcnVsZWV4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyRXg7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgCWNudDE2Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxvb3AxNjogOwkvKiBKdW1wIHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlZXhlY3V0YWJsZV9tb2RpZmllcl9zcGVjaWZpZXJFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVleGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllckV4OiA7CisgICAgcmV0dmFsLnN0b3AgPSBMVCgtMSk7CisKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgxMiwgZXhlY3V0YWJsZV9tb2RpZmllcl9zcGVjaWZpZXJfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiByZXR2YWw7Cit9CisvKiAkQU5UTFIgZW5kIGV4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGluc3RhbmNlX21vZGlmaWVyX3NwZWNpZmllcgorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6ODQwOjE6IGluc3RhbmNlX21vZGlmaWVyX3NwZWNpZmllciByZXR1cm5zIFsgc2VwOjpNb2RpZmllciBtZGZyICwgc2VwOjpTcGVjaWZpZXIgc3BjZnIgXSA6ICggJ2ZpbmFsJyB8ICdkeW5hbWljJyB8ICdwdWJsaWMnIHwgJ3Byb3RlY3RlZCcgfCAncHJpdmF0ZScgfCAndW5zYWZlJyB8ICd0aW1lZCcgfCAnaW5wdXRfZW5hYmxlZCcgfCAnbGlmZWxpbmUnICkrIDsKKyAqLworc3RhdGljIGZtbFBhcnNlcl9pbnN0YW5jZV9tb2RpZmllcl9zcGVjaWZpZXJfcmV0dXJuCitpbnN0YW5jZV9tb2RpZmllcl9zcGVjaWZpZXIocGZtbFBhcnNlciBjdHgpCit7CisgICAgZm1sUGFyc2VyX2luc3RhbmNlX21vZGlmaWVyX3NwZWNpZmllcl9yZXR1cm4gcmV0dmFsOworCisgICAgQU5UTFIzX1VJTlQzMiBpbnN0YW5jZV9tb2RpZmllcl9zcGVjaWZpZXJfU3RhcnRJbmRleDsKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBpbnN0YW5jZV9tb2RpZmllcl9zcGVjaWZpZXJfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTMpKSApCisgICAgeworICAgIAlyZXR2YWwuc3RhcnQgPSAwOworCisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKworICAgIHJldHZhbC5zdGFydCA9IExUKDEpOyByZXR2YWwuc3RvcCA9IHJldHZhbC5zdGFydDsKKworCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo4NDI6MjogKCAoICdmaW5hbCcgfCAnZHluYW1pYycgfCAncHVibGljJyB8ICdwcm90ZWN0ZWQnIHwgJ3ByaXZhdGUnIHwgJ3Vuc2FmZScgfCAndGltZWQnIHwgJ2lucHV0X2VuYWJsZWQnIHwgJ2xpZmVsaW5lJyApKyApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjg0Mjo0OiAoICdmaW5hbCcgfCAnZHluYW1pYycgfCAncHVibGljJyB8ICdwcm90ZWN0ZWQnIHwgJ3ByaXZhdGUnIHwgJ3Vuc2FmZScgfCAndGltZWQnIHwgJ2lucHV0X2VuYWJsZWQnIHwgJ2xpZmVsaW5lJyApKworICAgICAgICB7CisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo4NDI6NDogKCAnZmluYWwnIHwgJ2R5bmFtaWMnIHwgJ3B1YmxpYycgfCAncHJvdGVjdGVkJyB8ICdwcml2YXRlJyB8ICd1bnNhZmUnIHwgJ3RpbWVkJyB8ICdpbnB1dF9lbmFibGVkJyB8ICdsaWZlbGluZScgKSsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgY250MTc9MDsKKworICAgICAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTc9MTA7CisgICAgICAgICAgICAJc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAljYXNlIDI4MjoKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkJYWx0MTc9MTsKKyAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDI3MjoKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkJYWx0MTc9MjsKKyAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDM1NToKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkJYWx0MTc9MzsKKyAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDM1MjoKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkJYWx0MTc9NDsKKyAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDM0OToKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkJYWx0MTc9NTsKKyAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDQwNjoKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkJYWx0MTc9NjsKKyAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDM5MzoKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkJYWx0MTc9NzsKKyAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDMwNjoKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkJYWx0MTc9ODsKKyAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDMxNDoKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkJYWx0MTc9OTsKKyAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCX0KKworICAgICAgICAgICAgCXN3aXRjaCAoYWx0MTcpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICBjYXNlIDE6CisgICAgICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo4NDI6NjogJ2ZpbmFsJworICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBNQVRDSFQoMjgyLCAmRk9MTE9XXzI4Ml9pbl9pbnN0YW5jZV9tb2RpZmllcl9zcGVjaWZpZXIxMjU0KTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlaW5zdGFuY2VfbW9kaWZpZXJfc3BlY2lmaWVyRXg7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgcmV0dmFsLm1kZnIKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgLnNldEZlYXR1cmVGaW5hbCgpOyAgICAgCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICBjYXNlIDI6CisgICAgICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo4NTA6NjogJ2R5bmFtaWMnCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIE1BVENIVCgyNzIsICZGT0xMT1dfMjcyX2luX2luc3RhbmNlX21vZGlmaWVyX3NwZWNpZmllcjEyNzgpOworICAgICAgICAgICAgCSAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVpbnN0YW5jZV9tb2RpZmllcl9zcGVjaWZpZXJFeDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICByZXR2YWwuc3BjZnIKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgLnNldERlc2lnbkluc3RhbmNlRHluYW1pYygpOyAKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgIGNhc2UgMzoKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjg1NTo2OiAncHVibGljJworICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBNQVRDSFQoMzU1LCAmRk9MTE9XXzM1NV9pbl9pbnN0YW5jZV9tb2RpZmllcl9zcGVjaWZpZXIxMjk3KTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlaW5zdGFuY2VfbW9kaWZpZXJfc3BlY2lmaWVyRXg7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgcmV0dmFsLm1kZnIKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgLnNldFZpc2liaWxpdHlQdWJsaWMoKTsgICAgCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICBjYXNlIDQ6CisgICAgICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo4NTY6NjogJ3Byb3RlY3RlZCcKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgTUFUQ0hUKDM1MiwgJkZPTExPV18zNTJfaW5faW5zdGFuY2VfbW9kaWZpZXJfc3BlY2lmaWVyMTMxMyk7CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZWluc3RhbmNlX21vZGlmaWVyX3NwZWNpZmllckV4OworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgIHJldHZhbC5tZGZyCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIC5zZXRWaXNpYmlsaXR5UHJvdGVjdGVkKCk7IAorICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgY2FzZSA1OgorICAgICAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6ODU3OjY6ICdwcml2YXRlJworICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBNQVRDSFQoMzQ5LCAmRk9MTE9XXzM0OV9pbl9pbnN0YW5jZV9tb2RpZmllcl9zcGVjaWZpZXIxMzI2KTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlaW5zdGFuY2VfbW9kaWZpZXJfc3BlY2lmaWVyRXg7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgcmV0dmFsLm1kZnIKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgLnNldFZpc2liaWxpdHlQcml2YXRlKCk7ICAgCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICBjYXNlIDY6CisgICAgICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo4NTk6NjogJ3Vuc2FmZScKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgTUFUQ0hUKDQwNiwgJkZPTExPV180MDZfaW5faW5zdGFuY2VfbW9kaWZpZXJfc3BlY2lmaWVyMTM0Mik7CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZWluc3RhbmNlX21vZGlmaWVyX3NwZWNpZmllckV4OworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgIHJldHZhbC5tZGZyCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIC5zZXRGZWF0dXJlVW5zYWZlKCk7ICAgICAgIAorICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgY2FzZSA3OgorICAgICAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6ODYxOjY6ICd0aW1lZCcKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgTUFUQ0hUKDM5MywgJkZPTExPV18zOTNfaW5faW5zdGFuY2VfbW9kaWZpZXJfc3BlY2lmaWVyMTM1OSk7CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZWluc3RhbmNlX21vZGlmaWVyX3NwZWNpZmllckV4OworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgIHJldHZhbC5zcGNmcgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAuc2V0RmVhdHVyZVRpbWVkKCk7ICAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgIGNhc2UgODoKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjg2Mjo2OiAnaW5wdXRfZW5hYmxlZCcKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgTUFUQ0hUKDMwNiwgJkZPTExPV18zMDZfaW5faW5zdGFuY2VfbW9kaWZpZXJfc3BlY2lmaWVyMTM3Nik7CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZWluc3RhbmNlX21vZGlmaWVyX3NwZWNpZmllckV4OworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgIHJldHZhbC5zcGNmcgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAuc2V0RmVhdHVyZUlucHV0RW5hYmxlZCgpOyAKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgIGNhc2UgOToKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjg2Mzo2OiAnbGlmZWxpbmUnCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIE1BVENIVCgzMTQsICZGT0xMT1dfMzE0X2luX2luc3RhbmNlX21vZGlmaWVyX3NwZWNpZmllcjEzODUpOworICAgICAgICAgICAgCSAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVpbnN0YW5jZV9tb2RpZmllcl9zcGVjaWZpZXJFeDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICByZXR2YWwuc3BjZnIKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgLnNldEZlYXR1cmVMaWZlbGluZSgpOyAgICAgCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgIGRlZmF1bHQ6CisKKyAgICAgICAgICAgIAkJaWYgKCBjbnQxNyA+PSAxICkKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkgICAgZ290byBsb29wMTc7CisgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgIAkJaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAJCSAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAJCSAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgCQl9CisKKyAgICAgICAgICAgIAkJLyogbWlzbWF0Y2hlZFNldEV4KCkKKyAgICAgICAgICAgIAkJICovCisgICAgICAgICAgICAJCUNPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAJCUVYQ0VQVElPTi0+dHlwZSA9IEFOVExSM19FQVJMWV9FWElUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIAkJRVhDRVBUSU9OLT5uYW1lID0gKHZvaWQgKilBTlRMUjNfRUFSTFlfRVhJVF9OQU1FOworCisKKyAgICAgICAgICAgIAkJZ290byBydWxlaW5zdGFuY2VfbW9kaWZpZXJfc3BlY2lmaWVyRXg7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgCWNudDE3Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxvb3AxNzogOwkvKiBKdW1wIHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlaW5zdGFuY2VfbW9kaWZpZXJfc3BlY2lmaWVyRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlaW5zdGFuY2VfbW9kaWZpZXJfc3BlY2lmaWVyRXg6IDsKKyAgICByZXR2YWwuc3RvcCA9IExUKC0xKTsKKworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDEzLCBpbnN0YW5jZV9tb2RpZmllcl9zcGVjaWZpZXJfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiByZXR2YWw7Cit9CisvKiAkQU5UTFIgZW5kIGluc3RhbmNlX21vZGlmaWVyX3NwZWNpZmllciAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBtb2RpZmllcl90cmFuc2l0aW9uCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo4Njk6MTogbW9kaWZpZXJfdHJhbnNpdGlvbiByZXR1cm5zIFsgc2VwOjpNb2RpZmllciBtZGZyICwgc2VwOjpTcGVjaWZpZXIgc3BjZnIgXSA6ICggJ3RyYW5zaWVudCcgfCAndGltZWQnIHwgJ2lucHV0X2VuYWJsZWQnICkrIDsKKyAqLworc3RhdGljIGZtbFBhcnNlcl9tb2RpZmllcl90cmFuc2l0aW9uX3JldHVybgorbW9kaWZpZXJfdHJhbnNpdGlvbihwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBmbWxQYXJzZXJfbW9kaWZpZXJfdHJhbnNpdGlvbl9yZXR1cm4gcmV0dmFsOworCisgICAgQU5UTFIzX1VJTlQzMiBtb2RpZmllcl90cmFuc2l0aW9uX1N0YXJ0SW5kZXg7CisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgbW9kaWZpZXJfdHJhbnNpdGlvbl9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgxNCkpICkKKyAgICB7CisgICAgCXJldHZhbC5zdGFydCA9IDA7CisKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorCisgICAgcmV0dmFsLnN0YXJ0ID0gTFQoMSk7IHJldHZhbC5zdG9wID0gcmV0dmFsLnN0YXJ0OworCisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjg3NDoyOiAoICggJ3RyYW5zaWVudCcgfCAndGltZWQnIHwgJ2lucHV0X2VuYWJsZWQnICkrICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6ODc0OjQ6ICggJ3RyYW5zaWVudCcgfCAndGltZWQnIHwgJ2lucHV0X2VuYWJsZWQnICkrCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjg3NDo0OiAoICd0cmFuc2llbnQnIHwgJ3RpbWVkJyB8ICdpbnB1dF9lbmFibGVkJyApKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBjbnQxOD0wOworCisgICAgICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBhbHQxOD00OworICAgICAgICAgICAgCXN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJY2FzZSAzOTU6CisgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgIAkJCWFsdDE4PTE7CisgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAzOTM6CisgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgIAkJCWFsdDE4PTI7CisgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAzMDY6CisgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgIAkJCWFsdDE4PTM7CisgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAl9CisKKyAgICAgICAgICAgIAlzd2l0Y2ggKGFsdDE4KQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgY2FzZSAxOgorICAgICAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6ODc0OjY6ICd0cmFuc2llbnQnCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIE1BVENIVCgzOTUsICZGT0xMT1dfMzk1X2luX21vZGlmaWVyX3RyYW5zaXRpb24xNDIwKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlbW9kaWZpZXJfdHJhbnNpdGlvbkV4OworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgIHJldHZhbC5tZGZyCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIC5zZXRGZWF0dXJlVHJhbnNpZW50KCk7ICAgICAKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgIGNhc2UgMjoKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjg3ODo2OiAndGltZWQnCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIE1BVENIVCgzOTMsICZGT0xMT1dfMzkzX2luX21vZGlmaWVyX3RyYW5zaXRpb24xNDM2KTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlbW9kaWZpZXJfdHJhbnNpdGlvbkV4OworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgIHJldHZhbC5zcGNmcgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAuc2V0RmVhdHVyZVRpbWVkKCk7ICAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgIGNhc2UgMzoKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjg3OTo2OiAnaW5wdXRfZW5hYmxlZCcKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgTUFUQ0hUKDMwNiwgJkZPTExPV18zMDZfaW5fbW9kaWZpZXJfdHJhbnNpdGlvbjE0NTMpOworICAgICAgICAgICAgCSAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVtb2RpZmllcl90cmFuc2l0aW9uRXg7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgcmV0dmFsLnNwY2ZyCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIC5zZXRGZWF0dXJlSW5wdXRFbmFibGVkKCk7IAorICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICBkZWZhdWx0OgorCisgICAgICAgICAgICAJCWlmICggY250MTggPj0gMSApCisgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgIAkJICAgIGdvdG8gbG9vcDE4OworICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAJCWlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgCQkgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgICAgIAkJfQorCisgICAgICAgICAgICAJCS8qIG1pc21hdGNoZWRTZXRFeCgpCisgICAgICAgICAgICAJCSAqLworICAgICAgICAgICAgCQlDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgCQlFWENFUFRJT04tPnR5cGUgPSBBTlRMUjNfRUFSTFlfRVhJVF9FWENFUFRJT047CisgICAgICAgICAgICAJCUVYQ0VQVElPTi0+bmFtZSA9ICh2b2lkICopQU5UTFIzX0VBUkxZX0VYSVRfTkFNRTsKKworCisgICAgICAgICAgICAJCWdvdG8gcnVsZW1vZGlmaWVyX3RyYW5zaXRpb25FeDsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJY250MTgrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9vcDE4OiA7CS8qIEp1bXAgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVtb2RpZmllcl90cmFuc2l0aW9uRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlbW9kaWZpZXJfdHJhbnNpdGlvbkV4OiA7CisgICAgcmV0dmFsLnN0b3AgPSBMVCgtMSk7CisKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgxNCwgbW9kaWZpZXJfdHJhbnNpdGlvbl9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIHJldHZhbDsKK30KKy8qICRBTlRMUiBlbmQgbW9kaWZpZXJfdHJhbnNpdGlvbiAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBkZWZfcGFja2FnZQorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6ODg4OjE6IGRlZl9wYWNrYWdlIHJldHVybnMgWyBzZXA6OlBhY2thZ2UgKiBwYWNrIF0gOiAncGFja2FnZScgaWQ9IElEICggU3RyaW5nTGl0ZXJhbCApPyBMQ1VSTFkgKCBzZWN0aW9uX2hlYWRlclsgcGFjayBdICk/ICggc2VjdGlvbl9pbXBvcnRbIHBhY2sgXSApPyAoIHNlY3Rpb25fcHJvcGVydHlbIHBhY2sgXSApKiAoIHNlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZVsgcGFjayBdICkqIFJDVVJMWSA7CisgKi8KK3N0YXRpYyBzZXA6OlBhY2thZ2UgKgorZGVmX3BhY2thZ2UocGZtbFBhcnNlciBjdHgpCit7CisgICAgc2VwOjpQYWNrYWdlICogcGFjazsKKworICAgIEFOVExSM19VSU5UMzIgZGVmX3BhY2thZ2VfU3RhcnRJbmRleDsKKworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIGlkOworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIFN0cmluZ0xpdGVyYWwxOworCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGRlZl9wYWNrYWdlX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDE1KSkgKQorICAgIHsKKyAgICAgICAgeworCisgICAgICAgICAgICAJUE9QX0NUWDsKKworICAgICAgICAgICAgCXNlcDo6UGFyc2VyVXRpbDo6ZGVjbGFyZURlZmF1bHRFbmRpbmdTdGF0ZUlmTmVlZChuZWVkRGVmYXVsdFN0YXRlRmluYWwsCisgICAgICAgICAgICAJCQluZWVkRGVmYXVsdFN0YXRlVGVybWluYWwsIG5lZWREZWZhdWx0U3RhdGVSZXR1cm4pOworCisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiBwYWNrOworICAgIH0KKworICAgIGlkICAgICAgID0gTlVMTDsKKyAgICBTdHJpbmdMaXRlcmFsMSAgICAgICA9IE5VTEw7CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjg5NjoyOiAoICdwYWNrYWdlJyBpZD0gSUQgKCBTdHJpbmdMaXRlcmFsICk/IExDVVJMWSAoIHNlY3Rpb25faGVhZGVyWyBwYWNrIF0gKT8gKCBzZWN0aW9uX2ltcG9ydFsgcGFjayBdICk/ICggc2VjdGlvbl9wcm9wZXJ0eVsgcGFjayBdICkqICggc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlWyBwYWNrIF0gKSogUkNVUkxZICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6ODk2OjQ6ICdwYWNrYWdlJyBpZD0gSUQgKCBTdHJpbmdMaXRlcmFsICk/IExDVVJMWSAoIHNlY3Rpb25faGVhZGVyWyBwYWNrIF0gKT8gKCBzZWN0aW9uX2ltcG9ydFsgcGFjayBdICk/ICggc2VjdGlvbl9wcm9wZXJ0eVsgcGFjayBdICkqICggc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlWyBwYWNrIF0gKSogUkNVUkxZCisgICAgICAgIHsKKyAgICAgICAgICAgICBNQVRDSFQoMzQyLCAmRk9MTE9XXzM0Ml9pbl9kZWZfcGFja2FnZTE0ODUpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfcGFja2FnZUV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBwYWNrOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlkID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoSUQsICZGT0xMT1dfSURfaW5fZGVmX3BhY2thZ2UxNDg5KTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX3BhY2thZ2VFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcGFjazsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIFBVU0hfQ1RYX0NQTSggcGFjaz0gbmV3IHNlcDo6UGFja2FnZShTVFIoKGlkLT5nZXRUZXh0KGlkKSktPmNoYXJzKSkgKTsKKyAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6ODk5OjY6ICggU3RyaW5nTGl0ZXJhbCApPworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQxOT0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU3RyaW5nTGl0ZXJhbDoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQxOT0xOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxOSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo4OTk6ODogU3RyaW5nTGl0ZXJhbAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBTdHJpbmdMaXRlcmFsMSA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTikgTUFUQ0hUKFN0cmluZ0xpdGVyYWwsICZGT0xMT1dfU3RyaW5nTGl0ZXJhbF9pbl9kZWZfcGFja2FnZTE1MDYpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfcGFja2FnZUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBwYWNrOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgcGFjaworICAgICAgICAgICAgCSAgICAgICAgICAgIC0+c2V0VW5yZXN0cmljdGVkTmFtZShTVFIoKFN0cmluZ0xpdGVyYWwxLT5nZXRUZXh0KFN0cmluZ0xpdGVyYWwxKSktPmNoYXJzKSk7IAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgIE1BVENIVChMQ1VSTFksICZGT0xMT1dfTENVUkxZX2luX2RlZl9wYWNrYWdlMTUyNyk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9wYWNrYWdlRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhY2s7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6OTA0OjQ6ICggc2VjdGlvbl9oZWFkZXJbIHBhY2sgXSApPworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQyMD0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg4OgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDIwPTE7CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDIwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjkwNDo0OiBzZWN0aW9uX2hlYWRlclsgcGFjayBdCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3NlY3Rpb25faGVhZGVyX2luX2RlZl9wYWNrYWdlMTUzMik7CisgICAgICAgICAgICAJICAgICAgICBzZWN0aW9uX2hlYWRlcihjdHgsIHBhY2spOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3BhY2thZ2VFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gcGFjazsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjkwNTo0OiAoIHNlY3Rpb25faW1wb3J0WyBwYWNrIF0gKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MjE9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDE5MjoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQyMT0xOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQyMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo5MDU6NDogc2VjdGlvbl9pbXBvcnRbIHBhY2sgXQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19zZWN0aW9uX2ltcG9ydF9pbl9kZWZfcGFja2FnZTE1NDApOworICAgICAgICAgICAgCSAgICAgICAgc2VjdGlvbl9pbXBvcnQoY3R4LCBwYWNrKTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9wYWNrYWdlRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHBhY2s7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo5MDc6NDogKCBzZWN0aW9uX3Byb3BlcnR5WyBwYWNrIF0gKSoKKworICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MjI9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgMTc4OgorICAgICAgICAgICAgICAgIGNhc2UgMjExOgorICAgICAgICAgICAgICAgIGNhc2UgMjEzOgorICAgICAgICAgICAgICAgIGNhc2UgMjE0OgorICAgICAgICAgICAgICAgIGNhc2UgMjE2OgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQyMj0xOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQyMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo5MDc6Njogc2VjdGlvbl9wcm9wZXJ0eVsgcGFjayBdCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3NlY3Rpb25fcHJvcGVydHlfaW5fZGVmX3BhY2thZ2UxNTUxKTsKKyAgICAgICAgICAgIAkgICAgICAgIHNlY3Rpb25fcHJvcGVydHkoY3R4LCBwYWNrKTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9wYWNrYWdlRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHBhY2s7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdDoKKyAgICAgICAgICAgIAkgICAgZ290byBsb29wMjI7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb29wMjI6IDsgLyogSnVtcCBvdXQgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo5MDk6NDogKCBzZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmVbIHBhY2sgXSApKgorCisgICAgICAgICAgICBmb3IgKDs7KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQyMz0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAxNzQ6CisgICAgICAgICAgICAgICAgY2FzZSAxODM6CisgICAgICAgICAgICAgICAgY2FzZSAxOTc6CisgICAgICAgICAgICAgICAgY2FzZSAyMDA6CisgICAgICAgICAgICAgICAgY2FzZSAyMDE6CisgICAgICAgICAgICAgICAgY2FzZSAyMDM6CisgICAgICAgICAgICAgICAgY2FzZSAyMTI6CisgICAgICAgICAgICAgICAgY2FzZSAyMTU6CisgICAgICAgICAgICAgICAgY2FzZSAyMjI6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDIzPTE7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDIzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjkwOTo2OiBzZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmVbIHBhY2sgXQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19zZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmVfaW5fZGVmX3BhY2thZ2UxNTYzKTsKKyAgICAgICAgICAgIAkgICAgICAgIHNlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZShjdHgsIHBhY2spOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3BhY2thZ2VFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gcGFjazsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAgICAgCSAgICBnb3RvIGxvb3AyMzsJLyogYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvb3AyMzogOyAvKiBKdW1wIG91dCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworCisKKyAgICAgICAgICAgICBNQVRDSFQoUkNVUkxZLCAmRk9MTE9XX1JDVVJMWV9pbl9kZWZfcGFja2FnZTE1NzIpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfcGFja2FnZUV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBwYWNrOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlZGVmX3BhY2thZ2VFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVkZWZfcGFja2FnZUV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICAJUE9QX0NUWDsKKworICAgICAgICAgICAgICAgICAgICAJc2VwOjpQYXJzZXJVdGlsOjpkZWNsYXJlRGVmYXVsdEVuZGluZ1N0YXRlSWZOZWVkKG5lZWREZWZhdWx0U3RhdGVGaW5hbCwKKyAgICAgICAgICAgICAgICAgICAgCQkJbmVlZERlZmF1bHRTdGF0ZVRlcm1pbmFsLCBuZWVkRGVmYXVsdFN0YXRlUmV0dXJuKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgxNSwgZGVmX3BhY2thZ2VfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiBwYWNrOworfQorLyogJEFOVExSIGVuZCBkZWZfcGFja2FnZSAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBkZWZfc3lzdGVtCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo5MTg6MTogZGVmX3N5c3RlbSByZXR1cm5zIFsgc2VwOjpTeXN0ZW0gKiBzeXMgXSA6IChtcz0gZXhlY3V0YWJsZV9tb2RpZmllcl9zcGVjaWZpZXIgKT8gJ3N5c3RlbScgKCBMVF8gKCAnbW9jOicgKT8gZXhlY3V0YWJsZV9zcGVjaWZpZXJbIHNwY2ZyIF0gR1QgKT8gaWQ9IElEICggU3RyaW5nTGl0ZXJhbCApPyBMQ1VSTFkgKCBzZWN0aW9uX2hlYWRlclsgc3lzIF0gKT8gKCBzZWN0aW9uX2ltcG9ydFsgc3lzIF0gKT8gKCBzZWN0aW9uX3BhcmFtZXRlclsgc3lzIF0gKSogKCBzZWN0aW9uX3Byb3BlcnR5WyBzeXMgXSApKiAoIHNlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZVsgc3lzIF0gKSogKCBzZWN0aW9uX2JlaGF2aW9yWyBzeXMgXSB8IHNlY3Rpb25fc3RhdGVtYWNoaW5lWyBzeXMgXSApPyAoIHNlY3Rpb25fbW9kZWxfb2ZfY29tcHV0YXRpb25bIHN5cyBdIHwgc2VjdGlvbl9tb2RlbF9vZl9pbnRlcmFjdGlvblsgc3lzIF0gfCBzZWN0aW9uX21vZGVsX29mX2V4ZWN1dGlvblsgc3lzIF0gKSogUkNVUkxZIDsKKyAqLworc3RhdGljIHNlcDo6U3lzdGVtICoKK2RlZl9zeXN0ZW0ocGZtbFBhcnNlciBjdHgpCit7CisgICAgc2VwOjpTeXN0ZW0gKiBzeXM7CisKKyAgICBBTlRMUjNfVUlOVDMyIGRlZl9zeXN0ZW1fU3RhcnRJbmRleDsKKworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIGlkOworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIFN0cmluZ0xpdGVyYWwyOworICAgIGZtbFBhcnNlcl9leGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllcl9yZXR1cm4gbXM7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX21zCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9tcyBmbWxQYXJzZXJfZXhlY3V0YWJsZV9tb2RpZmllcl9zcGVjaWZpZXJfcmV0dXJuCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgZGVmX3N5c3RlbV9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisKKyAgICAJIHNlcDo6TW9kaWZpZXIgbWRmcjsKKworICAgIAlzZXA6OlNwZWNpZmllciBzcGNmciggc2VwOjpTcGVjaWZpZXI6OkNPTVBPTkVOVF9TWVNURU1fS0lORCApOworCisgICAgCVNBVkVfUlVMRV9CRUdJTl9MT0NBVElPTjsKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTYpKSApCisgICAgeworICAgICAgICB7CisKKyAgICAgICAgICAgIAlQT1BfQ1RYOworCisgICAgICAgICAgICAJc2VwOjpQYXJzZXJVdGlsOjpkZWNsYXJlRGVmYXVsdEVuZGluZ1N0YXRlSWZOZWVkKG5lZWREZWZhdWx0U3RhdGVGaW5hbCwKKyAgICAgICAgICAgIAkJCW5lZWREZWZhdWx0U3RhdGVUZXJtaW5hbCwgbmVlZERlZmF1bHRTdGF0ZVJldHVybik7CisKKyAgICAgICAgICAgIAlTRVRfUlVMRV9MT0NBVElPTihzeXMpOworCisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiBzeXM7CisgICAgfQorCisgICAgaWQgICAgICAgPSBOVUxMOworICAgIFN0cmluZ0xpdGVyYWwyICAgICAgID0gTlVMTDsKKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6OTM1OjI6ICggKG1zPSBleGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllciApPyAnc3lzdGVtJyAoIExUXyAoICdtb2M6JyApPyBleGVjdXRhYmxlX3NwZWNpZmllclsgc3BjZnIgXSBHVCApPyBpZD0gSUQgKCBTdHJpbmdMaXRlcmFsICk/IExDVVJMWSAoIHNlY3Rpb25faGVhZGVyWyBzeXMgXSApPyAoIHNlY3Rpb25faW1wb3J0WyBzeXMgXSApPyAoIHNlY3Rpb25fcGFyYW1ldGVyWyBzeXMgXSApKiAoIHNlY3Rpb25fcHJvcGVydHlbIHN5cyBdICkqICggc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlWyBzeXMgXSApKiAoIHNlY3Rpb25fYmVoYXZpb3JbIHN5cyBdIHwgc2VjdGlvbl9zdGF0ZW1hY2hpbmVbIHN5cyBdICk/ICggc2VjdGlvbl9tb2RlbF9vZl9jb21wdXRhdGlvblsgc3lzIF0gfCBzZWN0aW9uX21vZGVsX29mX2ludGVyYWN0aW9uWyBzeXMgXSB8IHNlY3Rpb25fbW9kZWxfb2ZfZXhlY3V0aW9uWyBzeXMgXSApKiBSQ1VSTFkgKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo5MzU6NDogKG1zPSBleGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllciApPyAnc3lzdGVtJyAoIExUXyAoICdtb2M6JyApPyBleGVjdXRhYmxlX3NwZWNpZmllclsgc3BjZnIgXSBHVCApPyBpZD0gSUQgKCBTdHJpbmdMaXRlcmFsICk/IExDVVJMWSAoIHNlY3Rpb25faGVhZGVyWyBzeXMgXSApPyAoIHNlY3Rpb25faW1wb3J0WyBzeXMgXSApPyAoIHNlY3Rpb25fcGFyYW1ldGVyWyBzeXMgXSApKiAoIHNlY3Rpb25fcHJvcGVydHlbIHN5cyBdICkqICggc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlWyBzeXMgXSApKiAoIHNlY3Rpb25fYmVoYXZpb3JbIHN5cyBdIHwgc2VjdGlvbl9zdGF0ZW1hY2hpbmVbIHN5cyBdICk/ICggc2VjdGlvbl9tb2RlbF9vZl9jb21wdXRhdGlvblsgc3lzIF0gfCBzZWN0aW9uX21vZGVsX29mX2ludGVyYWN0aW9uWyBzeXMgXSB8IHNlY3Rpb25fbW9kZWxfb2ZfZXhlY3V0aW9uWyBzeXMgXSApKiBSQ1VSTFkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6OTM1OjQ6IChtcz0gZXhlY3V0YWJsZV9tb2RpZmllcl9zcGVjaWZpZXIgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MjQ9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDI3MjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzMDY6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzE0OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDMyMjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzNTM6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzkzOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDQwNjoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQyND0xOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQyNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo5MzU6NjogbXM9IGV4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyX2luX2RlZl9zeXN0ZW0xNjA0KTsKKyAgICAgICAgICAgIAkgICAgICAgIG1zPWV4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfc3lzdGVtRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHN5czsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIG1kZnIgPSBtcy5tZGZyCisgICAgICAgICAgICAJICAgICAgICAgICAgOyBzcGNmci5pZm5vdF9kZWZpbmUoIG1zLnNwY2ZyCisgICAgICAgICAgICAJICAgICAgICAgICAgICk7IAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgIE1BVENIVCgzOTAsICZGT0xMT1dfMzkwX2luX2RlZl9zeXN0ZW0xNjE4KTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX3N5c3RlbUV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBzeXM7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6OTM5OjQ6ICggTFRfICggJ21vYzonICk/IGV4ZWN1dGFibGVfc3BlY2lmaWVyWyBzcGNmciBdIEdUICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDI2PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMVF86CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJYWx0MjY9MTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MjYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6OTM5OjY6IExUXyAoICdtb2M6JyApPyBleGVjdXRhYmxlX3NwZWNpZmllclsgc3BjZnIgXSBHVAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKExUXywgJkZPTExPV19MVF9faW5fZGVmX3N5c3RlbTE2MjYpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfc3lzdGVtRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHN5czsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo5Mzk6MTA6ICggJ21vYzonICk/CisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDI1PTI7CisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzMjE6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAkJYWx0MjU9MTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0MjUpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6OTM5OjEyOiAnbW9jOicKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVCgzMjEsICZGT0xMT1dfMzIxX2luX2RlZl9zeXN0ZW0xNjMwKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3N5c3RlbUV4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBzeXM7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leGVjdXRhYmxlX3NwZWNpZmllcl9pbl9kZWZfc3lzdGVtMTYzNik7CisgICAgICAgICAgICAJICAgICAgICBleGVjdXRhYmxlX3NwZWNpZmllcihjdHgsIHNwY2ZyKTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9zeXN0ZW1FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gc3lzOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoR1QsICZGT0xMT1dfR1RfaW5fZGVmX3N5c3RlbTE2MzkpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfc3lzdGVtRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHN5czsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlkID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoSUQsICZGT0xMT1dfSURfaW5fZGVmX3N5c3RlbTE2NDkpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfc3lzdGVtRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN5czsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAJICAJUFVTSF9DVFhfQ1BNKCBfU1lTVEVNXyA9IHN5cz0gbmV3IHNlcDo6U3lzdGVtKFNUUigoaWQtPmdldFRleHQoaWQpKS0+Y2hhcnMpKSApOworCisKKyAgICAgICAgICAgICAgICAJICAJc3lzCisgICAgICAgICAgICAgICAgLT5nZXR3TW9kaWZpZXIoKS5vdmVycmlkZV9pZmRlZiggbWRmciApOworCisgICAgICAgICAgICAgICAgCSAgCXN5cworICAgICAgICAgICAgICAgIC0+Z2V0d1NwZWNpZmllcigpLmlmbm90X2RlZmluZSggc3BjZnIgKTsKKyAgICAgICAgICAgICAgICAJICAKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo5NDk6NDogKCBTdHJpbmdMaXRlcmFsICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDI3PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTdHJpbmdMaXRlcmFsOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDI3PTE7CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDI3KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjk0OTo2OiBTdHJpbmdMaXRlcmFsCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIFN0cmluZ0xpdGVyYWwyID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoU3RyaW5nTGl0ZXJhbCwgJkZPTExPV19TdHJpbmdMaXRlcmFsX2luX2RlZl9zeXN0ZW0xNjYyKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3N5c3RlbUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBzeXM7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBzeXMKKyAgICAgICAgICAgIAkgICAgICAgICAgICAtPnNldFVucmVzdHJpY3RlZE5hbWUoU1RSKChTdHJpbmdMaXRlcmFsMi0+Z2V0VGV4dChTdHJpbmdMaXRlcmFsMikpLT5jaGFycykpOyAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICBNQVRDSFQoTENVUkxZLCAmRk9MTE9XX0xDVVJMWV9pbl9kZWZfc3lzdGVtMTY3OSk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9zeXN0ZW1FeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3lzOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjk1Nzo0OiAoIHNlY3Rpb25faGVhZGVyWyBzeXMgXSApPworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQyOD0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg4OgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDI4PTE7CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDI4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjk1Nzo0OiBzZWN0aW9uX2hlYWRlclsgc3lzIF0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfc2VjdGlvbl9oZWFkZXJfaW5fZGVmX3N5c3RlbTE2ODcpOworICAgICAgICAgICAgCSAgICAgICAgc2VjdGlvbl9oZWFkZXIoY3R4LCBzeXMpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3N5c3RlbUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBzeXM7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo5NTg6NDogKCBzZWN0aW9uX2ltcG9ydFsgc3lzIF0gKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0Mjk9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDE5MjoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQyOT0xOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQyOSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo5NTg6NDogc2VjdGlvbl9pbXBvcnRbIHN5cyBdCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3NlY3Rpb25faW1wb3J0X2luX2RlZl9zeXN0ZW0xNjk1KTsKKyAgICAgICAgICAgIAkgICAgICAgIHNlY3Rpb25faW1wb3J0KGN0eCwgc3lzKTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9zeXN0ZW1FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gc3lzOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6OTYwOjQ6ICggc2VjdGlvbl9wYXJhbWV0ZXJbIHN5cyBdICkqCisKKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDMwPTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDE5NToKKyAgICAgICAgICAgICAgICBjYXNlIDE5NjoKKyAgICAgICAgICAgICAgICBjYXNlIDIwNzoKKyAgICAgICAgICAgICAgICBjYXNlIDIwOToKKyAgICAgICAgICAgICAgICBjYXNlIDIxMDoKKyAgICAgICAgICAgICAgICBjYXNlIDIxOToKKyAgICAgICAgICAgICAgICBjYXNlIDIyMDoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0MzA9MTsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MzApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6OTYwOjY6IHNlY3Rpb25fcGFyYW1ldGVyWyBzeXMgXQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19zZWN0aW9uX3BhcmFtZXRlcl9pbl9kZWZfc3lzdGVtMTcwNik7CisgICAgICAgICAgICAJICAgICAgICBzZWN0aW9uX3BhcmFtZXRlcihjdHgsIHN5cyk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfc3lzdGVtRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHN5czsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAgICAgCSAgICBnb3RvIGxvb3AzMDsJLyogYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvb3AzMDogOyAvKiBKdW1wIG91dCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworCisKKyAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHNlcDo6VGVtcGxhdGVGYWN0b3J5OjpnZW5Qcm9wZXJ0eShzeXMpOyAKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo5NjU6NDogKCBzZWN0aW9uX3Byb3BlcnR5WyBzeXMgXSApKgorCisgICAgICAgICAgICBmb3IgKDs7KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQzMT0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAxNzg6CisgICAgICAgICAgICAgICAgY2FzZSAyMTE6CisgICAgICAgICAgICAgICAgY2FzZSAyMTM6CisgICAgICAgICAgICAgICAgY2FzZSAyMTQ6CisgICAgICAgICAgICAgICAgY2FzZSAyMTY6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDMxPTE7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDMxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjk2NTo2OiBzZWN0aW9uX3Byb3BlcnR5WyBzeXMgXQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19zZWN0aW9uX3Byb3BlcnR5X2luX2RlZl9zeXN0ZW0xNzI4KTsKKyAgICAgICAgICAgIAkgICAgICAgIHNlY3Rpb25fcHJvcGVydHkoY3R4LCBzeXMpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3N5c3RlbUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBzeXM7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdDoKKyAgICAgICAgICAgIAkgICAgZ290byBsb29wMzE7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb29wMzE6IDsgLyogSnVtcCBvdXQgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo5Njc6NDogKCBzZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmVbIHN5cyBdICkqCisKKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDMyPTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDE3NDoKKyAgICAgICAgICAgICAgICBjYXNlIDE4MzoKKyAgICAgICAgICAgICAgICBjYXNlIDE5NzoKKyAgICAgICAgICAgICAgICBjYXNlIDIwMDoKKyAgICAgICAgICAgICAgICBjYXNlIDIwMToKKyAgICAgICAgICAgICAgICBjYXNlIDIwMzoKKyAgICAgICAgICAgICAgICBjYXNlIDIxMjoKKyAgICAgICAgICAgICAgICBjYXNlIDIxNToKKyAgICAgICAgICAgICAgICBjYXNlIDIyMjoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0MzI9MTsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MzIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6OTY3OjY6IHNlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZVsgc3lzIF0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlX2luX2RlZl9zeXN0ZW0xNzQwKTsKKyAgICAgICAgICAgIAkgICAgICAgIHNlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZShjdHgsIHN5cyk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfc3lzdGVtRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHN5czsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAgICAgCSAgICBnb3RvIGxvb3AzMjsJLyogYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvb3AzMjogOyAvKiBKdW1wIG91dCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjk2OTo0OiAoIHNlY3Rpb25fYmVoYXZpb3JbIHN5cyBdIHwgc2VjdGlvbl9zdGF0ZW1hY2hpbmVbIHN5cyBdICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDMzPTM7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzE6CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJYWx0MzM9MTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDIyNzoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQzMz0yOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQzMykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo5Njk6Njogc2VjdGlvbl9iZWhhdmlvclsgc3lzIF0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfc2VjdGlvbl9iZWhhdmlvcl9pbl9kZWZfc3lzdGVtMTc1Mik7CisgICAgICAgICAgICAJICAgICAgICBzZWN0aW9uX2JlaGF2aW9yKGN0eCwgc3lzKTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9zeXN0ZW1FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gc3lzOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDI6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjk3MDo2OiBzZWN0aW9uX3N0YXRlbWFjaGluZVsgc3lzIF0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfc2VjdGlvbl9zdGF0ZW1hY2hpbmVfaW5fZGVmX3N5c3RlbTE3NjApOworICAgICAgICAgICAgCSAgICAgICAgc2VjdGlvbl9zdGF0ZW1hY2hpbmUoY3R4LCBzeXMpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3N5c3RlbUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBzeXM7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzZXA6OlRlbXBsYXRlRmFjdG9yeTo6Z2VuQmVoYXZpb3Ioc3lzKTsgCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6OTc2OjQ6ICggc2VjdGlvbl9tb2RlbF9vZl9jb21wdXRhdGlvblsgc3lzIF0gfCBzZWN0aW9uX21vZGVsX29mX2ludGVyYWN0aW9uWyBzeXMgXSB8IHNlY3Rpb25fbW9kZWxfb2ZfZXhlY3V0aW9uWyBzeXMgXSApKgorCisgICAgICAgICAgICBmb3IgKDs7KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQzND00OworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAyMDI6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDM0PTE7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxNzI6CisgICAgICAgICAgICAgICAgY2FzZSAxOTg6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDM0PTI7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyMDQ6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDM0PTM7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDM0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjk3Njo2OiBzZWN0aW9uX21vZGVsX29mX2NvbXB1dGF0aW9uWyBzeXMgXQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19zZWN0aW9uX21vZGVsX29mX2NvbXB1dGF0aW9uX2luX2RlZl9zeXN0ZW0xNzg4KTsKKyAgICAgICAgICAgIAkgICAgICAgIHNlY3Rpb25fbW9kZWxfb2ZfY29tcHV0YXRpb24oY3R4LCBzeXMpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3N5c3RlbUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBzeXM7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6OTc3OjY6IHNlY3Rpb25fbW9kZWxfb2ZfaW50ZXJhY3Rpb25bIHN5cyBdCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3NlY3Rpb25fbW9kZWxfb2ZfaW50ZXJhY3Rpb25faW5fZGVmX3N5c3RlbTE3OTYpOworICAgICAgICAgICAgCSAgICAgICAgc2VjdGlvbl9tb2RlbF9vZl9pbnRlcmFjdGlvbihjdHgsIHN5cyk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfc3lzdGVtRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHN5czsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAzOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo5Nzg6Njogc2VjdGlvbl9tb2RlbF9vZl9leGVjdXRpb25bIHN5cyBdCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3NlY3Rpb25fbW9kZWxfb2ZfZXhlY3V0aW9uX2luX2RlZl9zeXN0ZW0xODA0KTsKKyAgICAgICAgICAgIAkgICAgICAgIHNlY3Rpb25fbW9kZWxfb2ZfZXhlY3V0aW9uKGN0eCwgc3lzKTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9zeXN0ZW1FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gc3lzOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQ6CisgICAgICAgICAgICAJICAgIGdvdG8gbG9vcDM0OwkvKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgKi8KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9vcDM0OiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICAgICAgIE1BVENIVChSQ1VSTFksICZGT0xMT1dfUkNVUkxZX2luX2RlZl9zeXN0ZW0xODE2KTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX3N5c3RlbUV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBzeXM7CisgICAgICAgICAgICB9CisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVkZWZfc3lzdGVtRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlZGVmX3N5c3RlbUV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICAJUE9QX0NUWDsKKworICAgICAgICAgICAgICAgICAgICAJc2VwOjpQYXJzZXJVdGlsOjpkZWNsYXJlRGVmYXVsdEVuZGluZ1N0YXRlSWZOZWVkKG5lZWREZWZhdWx0U3RhdGVGaW5hbCwKKyAgICAgICAgICAgICAgICAgICAgCQkJbmVlZERlZmF1bHRTdGF0ZVRlcm1pbmFsLCBuZWVkRGVmYXVsdFN0YXRlUmV0dXJuKTsKKworICAgICAgICAgICAgICAgICAgICAJU0VUX1JVTEVfTE9DQVRJT04oc3lzKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgxNiwgZGVmX3N5c3RlbV9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIHN5czsKK30KKy8qICRBTlRMUiBlbmQgZGVmX3N5c3RlbSAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBxdWFsaWZpZWROYW1lSUQKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjk4ODoxOiBxdWFsaWZpZWROYW1lSUQgcmV0dXJucyBbIHN0ZDo6c3RyaW5nIHMgLCBzZXA6OmF2bV9zaXplX3QgbmIgPSAxIF0gOiBpZD0gSUQgKCAoIERPVCB8IENPTE9OeDIgKSBpZD0gSUQgKSogOworICovCitzdGF0aWMgZm1sUGFyc2VyX3F1YWxpZmllZE5hbWVJRF9yZXR1cm4KK3F1YWxpZmllZE5hbWVJRChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBmbWxQYXJzZXJfcXVhbGlmaWVkTmFtZUlEX3JldHVybiByZXR2YWw7CisKKyAgICBBTlRMUjNfVUlOVDMyIHF1YWxpZmllZE5hbWVJRF9TdGFydEluZGV4OworCisgICAgcEFOVExSM19DT01NT05fVE9LRU4gICAgaWQ7CisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgcmV0dmFsLm5iID0gIDE7CisKKyAgICBxdWFsaWZpZWROYW1lSURfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworCisgICAgCWNwTE9DQVRPUi5jbGVhcigpOworICAgIAljcFFOSUQuY2xlYXIoKTsKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTcpKSApCisgICAgeworICAgIAlyZXR2YWwuc3RhcnQgPSAwOworCisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKworICAgIGlkICAgICAgID0gTlVMTDsKKyAgICByZXR2YWwuc3RhcnQgPSBMVCgxKTsgcmV0dmFsLnN0b3AgPSByZXR2YWwuc3RhcnQ7CisKKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6OTk0OjI6IChpZD0gSUQgKCAoIERPVCB8IENPTE9OeDIgKSBpZD0gSUQgKSogKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo5OTQ6NDogaWQ9IElEICggKCBET1QgfCBDT0xPTngyICkgaWQ9IElEICkqCisgICAgICAgIHsKKyAgICAgICAgICAgIGlkID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoSUQsICZGT0xMT1dfSURfaW5fcXVhbGlmaWVkTmFtZUlEMTg0Mik7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXF1YWxpZmllZE5hbWVJREV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICByZXR2YWwucz0gU1RSKChpZC0+Z2V0VGV4dChpZCkpLT5jaGFycyk7CisgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjk5NTo0OiAoICggRE9UIHwgQ09MT054MiApIGlkPSBJRCApKgorCisgICAgICAgICAgICBmb3IgKDs7KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQzNj0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBDT0xPTngyOgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAgICAgCQkgICAvKiBkZmFMb29wYmFja1N0YXRlKGssZWRnZXMsZW90UHJlZGljdHNBbHQsZGVzY3JpcHRpb24sc3RhdGVOdW1iZXIsc2VtUHJlZFN0YXRlKQorICAgICAgICAgICAgICAgIAkJICAgICovCisgICAgICAgICAgICAgICAgCQkgICAgaW50IExBMzZfMSA9IExBKDIpOworICAgICAgICAgICAgICAgIAkJICAgIGlmICggKHN5bnByZWQ5NV9mbWwoY3R4KSkpCisgICAgICAgICAgICAgICAgCQkgICAgeworICAgICAgICAgICAgICAgIAkJICAgICAgICBhbHQzNj0xOworICAgICAgICAgICAgICAgIAkJICAgIH0KKworICAgICAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRE9UOgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQzNj0xOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQzNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo5OTU6NjogKCBET1QgfCBDT0xPTngyICkgaWQ9IElECisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjk5NTo2OiAoIERPVCB8IENPTE9OeDIgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQzNT0yOworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBET1Q6CisgICAgICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCWFsdDM1PTE7CisgICAgICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBDT0xPTngyOgorICAgICAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQlhbHQzNT0yOworICAgICAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAzNTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlcXVhbGlmaWVkTmFtZUlERXg7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDM1KQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjk5NTo4OiBET1QKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChET1QsICZGT0xMT1dfRE9UX2luX3F1YWxpZmllZE5hbWVJRDE4NTkpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVxdWFsaWZpZWROYW1lSURFeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgY3BRTklELnB1c2hfYmFjayhyZXR2YWwucworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICk7IHJldHZhbC5zPSAKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR2YWwucworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICArICIuIiA7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICArK3JldHZhbC5uYgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIDsgCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6OTk3Ojg6IENPTE9OeDIKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChDT0xPTngyLCAmRk9MTE9XX0NPTE9OeDJfaW5fcXVhbGlmaWVkTmFtZUlEMTg3NSk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXF1YWxpZmllZE5hbWVJREV4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICBjcExPQ0FUT1IgPSByZXR2YWwucworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIDsgY3BRTklELmNsZWFyKCk7IHJldHZhbC5zPSAKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR2YWwucworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICArICI6OiI7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgaWQgPSAocEFOVExSM19DT01NT05fVE9LRU4pIE1BVENIVChJRCwgJkZPTExPV19JRF9pbl9xdWFsaWZpZWROYW1lSUQxODkzKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlcXVhbGlmaWVkTmFtZUlERXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIGNwUU5JRC5wdXNoX2JhY2soU1RSX0lEKGlkKSk7ICAKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR2YWwucz0gCisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dmFsLnMKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgKyBTVFJfSUQoaWQpOworICAgICAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAgICAgCSAgICBnb3RvIGxvb3AzNjsJLyogYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvb3AzNjogOyAvKiBKdW1wIG91dCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworCisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlcXVhbGlmaWVkTmFtZUlERXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlcXVhbGlmaWVkTmFtZUlERXg6IDsKKyAgICByZXR2YWwuc3RvcCA9IExUKC0xKTsKKworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDE3LCBxdWFsaWZpZWROYW1lSURfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiByZXR2YWw7Cit9CisvKiAkQU5UTFIgZW5kIHF1YWxpZmllZE5hbWVJRCAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBpbnRlZ2VyX2NvbnN0YW50CisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMDA0OjE6IGludGVnZXJfY29uc3RhbnQgcmV0dXJucyBbIHNlcDo6YXZtX3NpemVfdCB2YWwgXSA6IChuPSBJbnRlZ2VyTGl0ZXJhbCB8Y2lkPSBxdWFsaWZpZWROYW1lSUQgKTsKKyAqLworc3RhdGljIHNlcDo6YXZtX3NpemVfdAoraW50ZWdlcl9jb25zdGFudChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBzZXA6OmF2bV9zaXplX3QgdmFsOworCisgICAgQU5UTFIzX1VJTlQzMiBpbnRlZ2VyX2NvbnN0YW50X1N0YXJ0SW5kZXg7CisKKyAgICBwQU5UTFIzX0NPTU1PTl9UT0tFTiAgICBuOworICAgIGZtbFBhcnNlcl9xdWFsaWZpZWROYW1lSURfcmV0dXJuIGNpZDsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfY2lkCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9jaWQgZm1sUGFyc2VyX3F1YWxpZmllZE5hbWVJRF9yZXR1cm4KKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBpbnRlZ2VyX2NvbnN0YW50X1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDE4KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiB2YWw7CisgICAgfQorCisgICAgbiAgICAgICA9IE5VTEw7CisKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vICAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMDA2OjI6IChuPSBJbnRlZ2VyTGl0ZXJhbCB8Y2lkPSBxdWFsaWZpZWROYW1lSUQgKQorCisgICAgICAgICAgICBBTlRMUjNfVUlOVDMyIGFsdDM3OworCisgICAgICAgICAgICBhbHQzNz0yOworCisgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEludGVnZXJMaXRlcmFsOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0Mzc9MTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIElEOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0Mzc9MjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMzc7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVpbnRlZ2VyX2NvbnN0YW50RXg7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQzNykKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMDA2OjQ6IG49IEludGVnZXJMaXRlcmFsCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBuID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoSW50ZWdlckxpdGVyYWwsICZGT0xMT1dfSW50ZWdlckxpdGVyYWxfaW5faW50ZWdlcl9jb25zdGFudDE5MjMpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVpbnRlZ2VyX2NvbnN0YW50RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICB2YWw9IE5VTV9JTlQoKG4tPmdldFRleHQobikpLT5jaGFycyk7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAyOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEwMDk6NDogY2lkPSBxdWFsaWZpZWROYW1lSUQKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9pbnRlZ2VyX2NvbnN0YW50MTkzNCk7CisgICAgICAgIAkgICAgICAgIGNpZD1xdWFsaWZpZWROYW1lSUQoY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlaW50ZWdlcl9jb25zdGFudEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgdmFsPSBzZXA6OlBhcnNlclV0aWw6OmdldEludGVnZXJDb25zdGFudCgKKyAgICAgICAgCSAgICAgICAgICAgIGNpZC5zCisgICAgICAgIAkgICAgICAgICAgICAsIGNpZC5uYgorICAgICAgICAJICAgICAgICAgICAgKTsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZWludGVnZXJfY29uc3RhbnRFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVpbnRlZ2VyX2NvbnN0YW50RXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgxOCwgaW50ZWdlcl9jb25zdGFudF9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIHZhbDsKK30KKy8qICRBTlRMUiBlbmQgaW50ZWdlcl9jb25zdGFudCAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBmbG9hdF9jb25zdGFudAorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTAxNDoxOiBmbG9hdF9jb25zdGFudCByZXR1cm5zIFsgc2VwOjphdm1fZmxvYXRfdCB2YWwgXSA6IChmPSBGbG9hdExpdGVyYWwgfGNpZD0gcXVhbGlmaWVkTmFtZUlEICk7CisgKi8KK3N0YXRpYyBzZXA6OmF2bV9mbG9hdF90CitmbG9hdF9jb25zdGFudChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBzZXA6OmF2bV9mbG9hdF90IHZhbDsKKworICAgIEFOVExSM19VSU5UMzIgZmxvYXRfY29uc3RhbnRfU3RhcnRJbmRleDsKKworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIGY7CisgICAgZm1sUGFyc2VyX3F1YWxpZmllZE5hbWVJRF9yZXR1cm4gY2lkOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9jaWQKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2NpZCBmbWxQYXJzZXJfcXVhbGlmaWVkTmFtZUlEX3JldHVybgorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGZsb2F0X2NvbnN0YW50X1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDE5KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiB2YWw7CisgICAgfQorCisgICAgZiAgICAgICA9IE5VTEw7CisKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vICAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMDE2OjI6IChmPSBGbG9hdExpdGVyYWwgfGNpZD0gcXVhbGlmaWVkTmFtZUlEICkKKworICAgICAgICAgICAgQU5UTFIzX1VJTlQzMiBhbHQzODsKKworICAgICAgICAgICAgYWx0Mzg9MjsKKworICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBGbG9hdExpdGVyYWw6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQzOD0xOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSUQ6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQzOD0yOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAzODsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWZsb2F0X2NvbnN0YW50RXg7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQzOCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMDE2OjQ6IGY9IEZsb2F0TGl0ZXJhbAorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgZiA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTikgTUFUQ0hUKEZsb2F0TGl0ZXJhbCwgJkZPTExPV19GbG9hdExpdGVyYWxfaW5fZmxvYXRfY29uc3RhbnQxOTU1KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZmxvYXRfY29uc3RhbnRFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiB2YWw7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIHZhbD0gTlVNX0ZMT0FUKChmLT5nZXRUZXh0KGYpKS0+Y2hhcnMpOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMDE5OjQ6IGNpZD0gcXVhbGlmaWVkTmFtZUlECisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fZmxvYXRfY29uc3RhbnQxOTY2KTsKKyAgICAgICAgCSAgICAgICAgY2lkPXF1YWxpZmllZE5hbWVJRChjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVmbG9hdF9jb25zdGFudEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgdmFsPSBzZXA6OlBhcnNlclV0aWw6OmdldEZsb2F0Q29uc3RhbnQoCisgICAgICAgIAkgICAgICAgICAgICBjaWQucworICAgICAgICAJICAgICAgICAgICAgLCBjaWQubmIKKyAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVmbG9hdF9jb25zdGFudEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZWZsb2F0X2NvbnN0YW50RXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgxOSwgZmxvYXRfY29uc3RhbnRfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiB2YWw7Cit9CisvKiAkQU5UTFIgZW5kIGZsb2F0X2NvbnN0YW50ICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IHNlY3Rpb25faGVhZGVyCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMDI4OjE6IHNlY3Rpb25faGVhZGVyWyBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIgXSA6ICdAaGVhZGVyOicgOworICovCitzdGF0aWMgdm9pZAorc2VjdGlvbl9oZWFkZXIocGZtbFBhcnNlciBjdHgsIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lcikKK3sKKyAgICBBTlRMUjNfVUlOVDMyIHNlY3Rpb25faGVhZGVyX1N0YXJ0SW5kZXg7CisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgc2VjdGlvbl9oZWFkZXJfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMjApKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEwMjk6MjogKCAnQGhlYWRlcjonICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTAyOTo0OiAnQGhlYWRlcjonCisgICAgICAgIHsKKyAgICAgICAgICAgICBNQVRDSFQoMTg4LCAmRk9MTE9XXzE4OF9pbl9zZWN0aW9uX2hlYWRlcjE5ODcpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVzZWN0aW9uX2hlYWRlckV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVzZWN0aW9uX2hlYWRlckV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZXNlY3Rpb25faGVhZGVyRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgyMCwgc2VjdGlvbl9oZWFkZXJfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIHNlY3Rpb25faGVhZGVyICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IHNlY3Rpb25faW1wb3J0CisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMDM3OjE6IHNlY3Rpb25faW1wb3J0WyBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIgXSA6ICdAaW1wb3J0OicgKCBpbmNsdWRlX3BhY2thZ2UgKSsgOworICovCitzdGF0aWMgdm9pZAorc2VjdGlvbl9pbXBvcnQocGZtbFBhcnNlciBjdHgsIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lcikKK3sKKyAgICBBTlRMUjNfVUlOVDMyIHNlY3Rpb25faW1wb3J0X1N0YXJ0SW5kZXg7CisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgc2VjdGlvbl9pbXBvcnRfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMjEpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEwMzg6MjogKCAnQGltcG9ydDonICggaW5jbHVkZV9wYWNrYWdlICkrICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTAzODo0OiAnQGltcG9ydDonICggaW5jbHVkZV9wYWNrYWdlICkrCisgICAgICAgIHsKKyAgICAgICAgICAgICBNQVRDSFQoMTkyLCAmRk9MTE9XXzE5Ml9pbl9zZWN0aW9uX2ltcG9ydDIwMDUpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVzZWN0aW9uX2ltcG9ydEV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTAzODoxNTogKCBpbmNsdWRlX3BhY2thZ2UgKSsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgY250Mzk9MDsKKworICAgICAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgYWx0Mzk9MjsKKyAgICAgICAgICAgIAlzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCWNhc2UgMTkzOgorICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAJCQlhbHQzOT0xOworICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJfQorCisgICAgICAgICAgICAJc3dpdGNoIChhbHQzOSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgIGNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEwMzg6MTc6IGluY2x1ZGVfcGFja2FnZQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2luY2x1ZGVfcGFja2FnZV9pbl9zZWN0aW9uX2ltcG9ydDIwMDkpOworICAgICAgICAgICAgCSAgICAgICAgICAgIGluY2x1ZGVfcGFja2FnZShjdHgpOworCisgICAgICAgICAgICAJICAgICAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZXNlY3Rpb25faW1wb3J0RXg7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgIGRlZmF1bHQ6CisKKyAgICAgICAgICAgIAkJaWYgKCBjbnQzOSA+PSAxICkKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkgICAgZ290byBsb29wMzk7CisgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgIAkJaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAJCSAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAJCSAgICByZXR1cm4gOworICAgICAgICAgICAgCQl9CisKKyAgICAgICAgICAgIAkJLyogbWlzbWF0Y2hlZFNldEV4KCkKKyAgICAgICAgICAgIAkJICovCisgICAgICAgICAgICAJCUNPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAJCUVYQ0VQVElPTi0+dHlwZSA9IEFOVExSM19FQVJMWV9FWElUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIAkJRVhDRVBUSU9OLT5uYW1lID0gKHZvaWQgKilBTlRMUjNfRUFSTFlfRVhJVF9OQU1FOworCisKKyAgICAgICAgICAgIAkJZ290byBydWxlc2VjdGlvbl9pbXBvcnRFeDsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJY250MzkrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9vcDM5OiA7CS8qIEp1bXAgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVzZWN0aW9uX2ltcG9ydEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZXNlY3Rpb25faW1wb3J0RXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgyMSwgc2VjdGlvbl9pbXBvcnRfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIHNlY3Rpb25faW1wb3J0ICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGluY2x1ZGVfcGFja2FnZQorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTA0MToxOiBpbmNsdWRlX3BhY2thZ2UgOiAnQGluY2x1ZGUnICggU3RyaW5nTGl0ZXJhbCBTRU1JIHwgTENVUkxZICggU3RyaW5nTGl0ZXJhbCApKyBSQ1VSTFkgKSA7CisgKi8KK3N0YXRpYyB2b2lkCitpbmNsdWRlX3BhY2thZ2UocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX1VJTlQzMiBpbmNsdWRlX3BhY2thZ2VfU3RhcnRJbmRleDsKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBpbmNsdWRlX3BhY2thZ2VfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMjIpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEwNDI6MjogKCAnQGluY2x1ZGUnICggU3RyaW5nTGl0ZXJhbCBTRU1JIHwgTENVUkxZICggU3RyaW5nTGl0ZXJhbCApKyBSQ1VSTFkgKSApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEwNDI6NDogJ0BpbmNsdWRlJyAoIFN0cmluZ0xpdGVyYWwgU0VNSSB8IExDVVJMWSAoIFN0cmluZ0xpdGVyYWwgKSsgUkNVUkxZICkKKyAgICAgICAgeworICAgICAgICAgICAgIE1BVENIVCgxOTMsICZGT0xMT1dfMTkzX2luX2luY2x1ZGVfcGFja2FnZTIwMjMpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVpbmNsdWRlX3BhY2thZ2VFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEwNDM6NDogKCBTdHJpbmdMaXRlcmFsIFNFTUkgfCBMQ1VSTFkgKCBTdHJpbmdMaXRlcmFsICkrIFJDVVJMWSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDQxPTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFN0cmluZ0xpdGVyYWw6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDQxPTE7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBMQ1VSTFk6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDQxPTI7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDQxOworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgICAgICBnb3RvIHJ1bGVpbmNsdWRlX3BhY2thZ2VFeDsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTA0Mzo2OiBTdHJpbmdMaXRlcmFsIFNFTUkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChTdHJpbmdMaXRlcmFsLCAmRk9MTE9XX1N0cmluZ0xpdGVyYWxfaW5faW5jbHVkZV9wYWNrYWdlMjAzMCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWluY2x1ZGVfcGFja2FnZUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChTRU1JLCAmRk9MTE9XX1NFTUlfaW5faW5jbHVkZV9wYWNrYWdlMjAzMyk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWluY2x1ZGVfcGFja2FnZUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTA0NDo2OiBMQ1VSTFkgKCBTdHJpbmdMaXRlcmFsICkrIFJDVVJMWQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKExDVVJMWSwgJkZPTExPV19MQ1VSTFlfaW5faW5jbHVkZV9wYWNrYWdlMjA0MCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWluY2x1ZGVfcGFja2FnZUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTA0NDoxNDogKCBTdHJpbmdMaXRlcmFsICkrCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgaW50IGNudDQwPTA7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBmb3IgKDs7KQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgaW50IGFsdDQwPTI7CisgICAgICAgICAgICAJICAgICAgICAJc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCSAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIFN0cmluZ0xpdGVyYWw6CisgICAgICAgICAgICAJICAgICAgICAJCXsKKyAgICAgICAgICAgIAkgICAgICAgIAkJCWFsdDQwPTE7CisgICAgICAgICAgICAJICAgICAgICAJCX0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgIAl9CisKKyAgICAgICAgICAgIAkgICAgICAgIAlzd2l0Y2ggKGFsdDQwKQorICAgICAgICAgICAgCSAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgY2FzZSAxOgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTA0NDoxNjogU3RyaW5nTGl0ZXJhbAorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICBNQVRDSFQoU3RyaW5nTGl0ZXJhbCwgJkZPTExPV19TdHJpbmdMaXRlcmFsX2luX2luY2x1ZGVfcGFja2FnZTIwNDUpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVpbmNsdWRlX3BhY2thZ2VFeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgZGVmYXVsdDoKKworICAgICAgICAgICAgCSAgICAgICAgCQlpZiAoIGNudDQwID49IDEgKQorICAgICAgICAgICAgCSAgICAgICAgCQl7CisgICAgICAgICAgICAJICAgICAgICAJCSAgICBnb3RvIGxvb3A0MDsKKyAgICAgICAgICAgIAkgICAgICAgIAkJfQorICAgICAgICAgICAgCSAgICAgICAgCQlpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAJICAgICAgICAJCXsKKyAgICAgICAgICAgIAkgICAgICAgIAkJICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgIAkgICAgICAgIAkJICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAJCX0KKworICAgICAgICAgICAgCSAgICAgICAgCQkvKiBtaXNtYXRjaGVkU2V0RXgoKQorICAgICAgICAgICAgCSAgICAgICAgCQkgKi8KKyAgICAgICAgICAgIAkgICAgICAgIAkJQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkJRVhDRVBUSU9OLT50eXBlID0gQU5UTFIzX0VBUkxZX0VYSVRfRVhDRVBUSU9OOworICAgICAgICAgICAgCSAgICAgICAgCQlFWENFUFRJT04tPm5hbWUgPSAodm9pZCAqKUFOVExSM19FQVJMWV9FWElUX05BTUU7CisKKworICAgICAgICAgICAgCSAgICAgICAgCQlnb3RvIHJ1bGVpbmNsdWRlX3BhY2thZ2VFeDsKKyAgICAgICAgICAgIAkgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAJY250NDArKzsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgbG9vcDQwOiA7CS8qIEp1bXAgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKyAgICAgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChSQ1VSTFksICZGT0xMT1dfUkNVUkxZX2luX2luY2x1ZGVfcGFja2FnZTIwNTEpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVpbmNsdWRlX3BhY2thZ2VFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVpbmNsdWRlX3BhY2thZ2VFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVpbmNsdWRlX3BhY2thZ2VFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDIyLCBpbmNsdWRlX3BhY2thZ2VfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGluY2x1ZGVfcGFja2FnZSAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBzZWN0aW9uX3Byb2NlZHVyZQorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTExNzoxOiBzZWN0aW9uX3Byb2NlZHVyZVsgc2VwOjpNYWNoaW5lICogY29udGFpbmVyIF0gOiAnQHByb2NlZHVyZTonIChwPSBkZWZfcHJvY2VkdXJlWyBjb250YWluZXIgXSApKiA7CisgKi8KK3N0YXRpYyB2b2lkCitzZWN0aW9uX3Byb2NlZHVyZShwZm1sUGFyc2VyIGN0eCwgc2VwOjpNYWNoaW5lICogY29udGFpbmVyKQoreworICAgIEFOVExSM19VSU5UMzIgc2VjdGlvbl9wcm9jZWR1cmVfU3RhcnRJbmRleDsKKworICAgIHNlcDo6TWFjaGluZSAqIHA7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX3AKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX3Agc2VwOjpNYWNoaW5lICoKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBzZWN0aW9uX3Byb2NlZHVyZV9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgyMykpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTExODoyOiAoICdAcHJvY2VkdXJlOicgKHA9IGRlZl9wcm9jZWR1cmVbIGNvbnRhaW5lciBdICkqICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTExODo0OiAnQHByb2NlZHVyZTonIChwPSBkZWZfcHJvY2VkdXJlWyBjb250YWluZXIgXSApKgorICAgICAgICB7CisgICAgICAgICAgICAgTUFUQ0hUKDIxMiwgJkZPTExPV18yMTJfaW5fc2VjdGlvbl9wcm9jZWR1cmUyMDgxKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlc2VjdGlvbl9wcm9jZWR1cmVFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjExMTk6NDogKHA9IGRlZl9wcm9jZWR1cmVbIGNvbnRhaW5lciBdICkqCisKKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDQyPTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDMwNjoKKyAgICAgICAgICAgICAgICBjYXNlIDM1MToKKyAgICAgICAgICAgICAgICBjYXNlIDM5MzoKKyAgICAgICAgICAgICAgICBjYXNlIDQwNjoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0NDI9MTsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NDIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTExOTo2OiBwPSBkZWZfcHJvY2VkdXJlWyBjb250YWluZXIgXQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfcHJvY2VkdXJlX2luX3NlY3Rpb25fcHJvY2VkdXJlMjA5MCk7CisgICAgICAgICAgICAJICAgICAgICBwPWRlZl9wcm9jZWR1cmUoY3R4LCBjb250YWluZXIpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc2VjdGlvbl9wcm9jZWR1cmVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQ6CisgICAgICAgICAgICAJICAgIGdvdG8gbG9vcDQyOwkvKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgKi8KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9vcDQyOiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVzZWN0aW9uX3Byb2NlZHVyZUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZXNlY3Rpb25fcHJvY2VkdXJlRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgyMywgc2VjdGlvbl9wcm9jZWR1cmVfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIHNlY3Rpb25fcHJvY2VkdXJlICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGRlZl9wcm9jZWR1cmUKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjExMjM6MTogZGVmX3Byb2NlZHVyZVsgc2VwOjpNYWNoaW5lICogY29udGFpbmVyIF0gcmV0dXJucyBbIHNlcDo6TWFjaGluZSAqIHByb2NlZHVyZSBdIDogKG1zPSBwcm9jZWR1cmVfbW9kaWZpZXJfc3BlY2lmaWVyICk/ICdwcm9jZWR1cmUnICggTFRfICggJ21vYzonICk/IGV4ZWN1dGFibGVfc3BlY2lmaWVyWyBzcGNmciBdIEdUICk/IGlkPSBJRCAoIFN0cmluZ0xpdGVyYWwgKT8gKCBkZWZfbWFjaGluZV9wYXJhbWV0ZXJzWyBwcm9jZWR1cmUgXSApPyAoIGRlZl9tYWNoaW5lX3JldHVybnNbIHByb2NlZHVyZSAsXG5cdCBcdFx0c2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfUkVUVVJOX1BBUkFNRVRFUl9NT0RJRklFUiBdICk/IGRlZl9ib2R5X3Byb2NlZHVyZVsgcHJvY2VkdXJlIF0gOworICovCitzdGF0aWMgc2VwOjpNYWNoaW5lICoKK2RlZl9wcm9jZWR1cmUocGZtbFBhcnNlciBjdHgsIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lcikKK3sKKyAgICBzZXA6Ok1hY2hpbmUgKiBwcm9jZWR1cmU7CisKKyAgICBBTlRMUjNfVUlOVDMyIGRlZl9wcm9jZWR1cmVfU3RhcnRJbmRleDsKKworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIGlkOworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIFN0cmluZ0xpdGVyYWwzOworICAgIGZtbFBhcnNlcl9wcm9jZWR1cmVfbW9kaWZpZXJfc3BlY2lmaWVyX3JldHVybiBtczsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfbXMKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX21zIGZtbFBhcnNlcl9wcm9jZWR1cmVfbW9kaWZpZXJfc3BlY2lmaWVyX3JldHVybgorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGRlZl9wcm9jZWR1cmVfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworCisgICAgCXNlcDo6TW9kaWZpZXIgbWRmcjsKKworICAgIAlzZXA6OlNwZWNpZmllciBzcGNmciggc2VwOjpTcGVjaWZpZXI6OkVYRUNVVEFCTEVfUFJPQ0VEVVJFX01PREVMX1NQRUNJRklFUiApOworCisgICAgCVNBVkVfUlVMRV9CRUdJTl9MT0NBVElPTjsKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMjQpKSApCisgICAgeworICAgICAgICB7CisKKyAgICAgICAgICAgIAlQT1BfQ1RYOworCisgICAgICAgICAgICAJc2VwOjpQYXJzZXJVdGlsOjpjaGVja1Byb2NlZHVyZUNvbXBvc2l0ZU1vY0tpbmQocHJvY2VkdXJlKTsKKworICAgICAgICAgICAgCVNFVF9SVUxFX0xPQ0FUSU9OKHByb2NlZHVyZSk7CisKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIHByb2NlZHVyZTsKKyAgICB9CisKKyAgICBpZCAgICAgICA9IE5VTEw7CisgICAgU3RyaW5nTGl0ZXJhbDMgICAgICAgPSBOVUxMOworCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMTM5OjI6ICggKG1zPSBwcm9jZWR1cmVfbW9kaWZpZXJfc3BlY2lmaWVyICk/ICdwcm9jZWR1cmUnICggTFRfICggJ21vYzonICk/IGV4ZWN1dGFibGVfc3BlY2lmaWVyWyBzcGNmciBdIEdUICk/IGlkPSBJRCAoIFN0cmluZ0xpdGVyYWwgKT8gKCBkZWZfbWFjaGluZV9wYXJhbWV0ZXJzWyBwcm9jZWR1cmUgXSApPyAoIGRlZl9tYWNoaW5lX3JldHVybnNbIHByb2NlZHVyZSAsXG5cdCBcdFx0c2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfUkVUVVJOX1BBUkFNRVRFUl9NT0RJRklFUiBdICk/IGRlZl9ib2R5X3Byb2NlZHVyZVsgcHJvY2VkdXJlIF0gKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMTM5OjQ6IChtcz0gcHJvY2VkdXJlX21vZGlmaWVyX3NwZWNpZmllciApPyAncHJvY2VkdXJlJyAoIExUXyAoICdtb2M6JyApPyBleGVjdXRhYmxlX3NwZWNpZmllclsgc3BjZnIgXSBHVCApPyBpZD0gSUQgKCBTdHJpbmdMaXRlcmFsICk/ICggZGVmX21hY2hpbmVfcGFyYW1ldGVyc1sgcHJvY2VkdXJlIF0gKT8gKCBkZWZfbWFjaGluZV9yZXR1cm5zWyBwcm9jZWR1cmUgLFxuXHQgXHRcdHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX1JFVFVSTl9QQVJBTUVURVJfTU9ESUZJRVIgXSApPyBkZWZfYm9keV9wcm9jZWR1cmVbIHByb2NlZHVyZSBdCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjExMzk6NDogKG1zPSBwcm9jZWR1cmVfbW9kaWZpZXJfc3BlY2lmaWVyICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDQzPTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzMDY6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzkzOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDQwNjoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQ0Mz0xOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ0MykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMTM5OjY6IG1zPSBwcm9jZWR1cmVfbW9kaWZpZXJfc3BlY2lmaWVyCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3Byb2NlZHVyZV9tb2RpZmllcl9zcGVjaWZpZXJfaW5fZGVmX3Byb2NlZHVyZTIxMjQpOworICAgICAgICAgICAgCSAgICAgICAgbXM9cHJvY2VkdXJlX21vZGlmaWVyX3NwZWNpZmllcihjdHgpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3Byb2NlZHVyZUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBwcm9jZWR1cmU7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBtZGZyLm92ZXJyaWRlX2lmZGVmKCBtcy5tZGZyCisgICAgICAgICAgICAJICAgICAgICAgICAgICk7IHNwY2ZyLm92ZXJyaWRlX2lmZGVmKCBtcy5zcGNmcgorICAgICAgICAgICAgCSAgICAgICAgICAgICApOyAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICBNQVRDSFQoMzUxLCAmRk9MTE9XXzM1MV9pbl9kZWZfcHJvY2VkdXJlMjE0MCk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9wcm9jZWR1cmVFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJvY2VkdXJlOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjExNDM6NDogKCBMVF8gKCAnbW9jOicgKT8gZXhlY3V0YWJsZV9zcGVjaWZpZXJbIHNwY2ZyIF0gR1QgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0NDU9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIExUXzoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQ0NT0xOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ0NSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMTQzOjY6IExUXyAoICdtb2M6JyApPyBleGVjdXRhYmxlX3NwZWNpZmllclsgc3BjZnIgXSBHVAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKExUXywgJkZPTExPV19MVF9faW5fZGVmX3Byb2NlZHVyZTIxNDcpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfcHJvY2VkdXJlRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHByb2NlZHVyZTsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMTQzOjEwOiAoICdtb2M6JyApPworICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQ0ND0yOworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzIxOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJCWFsdDQ0PTE7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ0KQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjExNDM6MTI6ICdtb2M6JworICAgICAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKDMyMSwgJkZPTExPV18zMjFfaW5fZGVmX3Byb2NlZHVyZTIxNTEpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfcHJvY2VkdXJlRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHByb2NlZHVyZTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4ZWN1dGFibGVfc3BlY2lmaWVyX2luX2RlZl9wcm9jZWR1cmUyMTU3KTsKKyAgICAgICAgICAgIAkgICAgICAgIGV4ZWN1dGFibGVfc3BlY2lmaWVyKGN0eCwgc3BjZnIpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3Byb2NlZHVyZUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBwcm9jZWR1cmU7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChHVCwgJkZPTExPV19HVF9pbl9kZWZfcHJvY2VkdXJlMjE2MSk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9wcm9jZWR1cmVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gcHJvY2VkdXJlOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWQgPSAocEFOVExSM19DT01NT05fVE9LRU4pIE1BVENIVChJRCwgJkZPTExPV19JRF9pbl9kZWZfcHJvY2VkdXJlMjE3MSk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9wcm9jZWR1cmVFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJvY2VkdXJlOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIAkJUFVTSF9DVFhfQ1BNKCBwcm9jZWR1cmU9IHNlcDo6TWFjaGluZTo6bmV3UHJvY2VkdXJlKAorICAgICAgICAgICAgICAgIAkJCQljb250YWluZXIsIFNUUigoaWQtPmdldFRleHQoaWQpKS0+Y2hhcnMpLCBzcGNmcikgKTsKKworCisgICAgICAgICAgICAgICAgCQlwcm9jZWR1cmUKKyAgICAgICAgICAgICAgICAtPmdldHdNb2RpZmllcigpLm92ZXJyaWRlX2lmZGVmKCBtZGZyICk7CisKKyAgICAgICAgICAgICAgICAJCWNvbnRhaW5lci0+c2F2ZU93bmVkRWxlbWVudCggcHJvY2VkdXJlCisgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgCSAgCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTE1NDo0OiAoIFN0cmluZ0xpdGVyYWwgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0NDY9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFN0cmluZ0xpdGVyYWw6CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJYWx0NDY9MTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NDYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTE1NDo2OiBTdHJpbmdMaXRlcmFsCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIFN0cmluZ0xpdGVyYWwzID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoU3RyaW5nTGl0ZXJhbCwgJkZPTExPV19TdHJpbmdMaXRlcmFsX2luX2RlZl9wcm9jZWR1cmUyMTg0KTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3Byb2NlZHVyZUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBwcm9jZWR1cmU7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBwcm9jZWR1cmUKKyAgICAgICAgICAgIAkgICAgICAgICAgICAtPnNldFVucmVzdHJpY3RlZE5hbWUoU1RSKChTdHJpbmdMaXRlcmFsMy0+Z2V0VGV4dChTdHJpbmdMaXRlcmFsMykpLT5jaGFycykpOyAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjExNTg6NDogKCBkZWZfbWFjaGluZV9wYXJhbWV0ZXJzWyBwcm9jZWR1cmUgXSApPworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQ0Nz0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTEJSQUNLRVQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTFBBUkVOOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDQ3PTE7CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ3KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjExNTg6NDogZGVmX21hY2hpbmVfcGFyYW1ldGVyc1sgcHJvY2VkdXJlIF0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX21hY2hpbmVfcGFyYW1ldGVyc19pbl9kZWZfcHJvY2VkdXJlMjIwMSk7CisgICAgICAgICAgICAJICAgICAgICBkZWZfbWFjaGluZV9wYXJhbWV0ZXJzKGN0eCwgcHJvY2VkdXJlKTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9wcm9jZWR1cmVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gcHJvY2VkdXJlOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTE2MDo0OiAoIGRlZl9tYWNoaW5lX3JldHVybnNbIHByb2NlZHVyZSAsXG5cdCBcdFx0c2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfUkVUVVJOX1BBUkFNRVRFUl9NT0RJRklFUiBdICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDQ4PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjM6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzY1OgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDQ4PTE7CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjExNjA6NDogZGVmX21hY2hpbmVfcmV0dXJuc1sgcHJvY2VkdXJlICxcblx0IFx0XHRzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9SRVRVUk5fUEFSQU1FVEVSX01PRElGSUVSIF0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX21hY2hpbmVfcmV0dXJuc19pbl9kZWZfcHJvY2VkdXJlMjIxMCk7CisgICAgICAgICAgICAJICAgICAgICBkZWZfbWFjaGluZV9yZXR1cm5zKGN0eCwgcHJvY2VkdXJlLCBzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9SRVRVUk5fUEFSQU1FVEVSX01PRElGSUVSKTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9wcm9jZWR1cmVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gcHJvY2VkdXJlOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX2JvZHlfcHJvY2VkdXJlX2luX2RlZl9wcm9jZWR1cmUyMjE5KTsKKyAgICAgICAgICAgIGRlZl9ib2R5X3Byb2NlZHVyZShjdHgsIHByb2NlZHVyZSk7CisKKyAgICAgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfcHJvY2VkdXJlRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHByb2NlZHVyZTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZWRlZl9wcm9jZWR1cmVFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVkZWZfcHJvY2VkdXJlRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIAlQT1BfQ1RYOworCisgICAgICAgICAgICAgICAgICAgIAlzZXA6OlBhcnNlclV0aWw6OmNoZWNrUHJvY2VkdXJlQ29tcG9zaXRlTW9jS2luZChwcm9jZWR1cmUpOworCisgICAgICAgICAgICAgICAgICAgIAlTRVRfUlVMRV9MT0NBVElPTihwcm9jZWR1cmUpOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisKKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDI0LCBkZWZfcHJvY2VkdXJlX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gcHJvY2VkdXJlOworfQorLyogJEFOVExSIGVuZCBkZWZfcHJvY2VkdXJlICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGRlZl9tYWNoaW5lX3BhcmFtZXRlcnMKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjExNjc6MTogZGVmX21hY2hpbmVfcGFyYW1ldGVyc1sgc2VwOjpNYWNoaW5lICogbWFjaGluZSBdIDogKCBMQlJBQ0tFVCBkZWZfbWFjaGluZV92YXJpYWJsZV9wYXJhbWV0ZXJfYXRvbVsgZGVjbFByb3BlcnR5ICwgbWRmciAsIG9mZnNldCBdICggQ09NTUEgZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b21bIGRlY2xQcm9wZXJ0eSAsIG1kZnIgLCArK29mZnNldCBdICkqIFJCUkFDS0VUIHwgTFBBUkVOIGRlZl9tYWNoaW5lX3ZhcmlhYmxlX3BhcmFtZXRlcl9hdG9tWyBkZWNsUHJvcGVydHkgLCBtZGZyICwgb2Zmc2V0IF0gKCBDT01NQSBkZWZfbWFjaGluZV92YXJpYWJsZV9wYXJhbWV0ZXJfYXRvbVsgZGVjbFByb3BlcnR5ICwgbWRmciAsICsrb2Zmc2V0IF0gKSogUlBBUkVOICk7CisgKi8KK3N0YXRpYyB2b2lkCitkZWZfbWFjaGluZV9wYXJhbWV0ZXJzKHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBtYWNoaW5lKQoreworICAgIEFOVExSM19VSU5UMzIgZGVmX21hY2hpbmVfcGFyYW1ldGVyc19TdGFydEluZGV4OworCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGRlZl9tYWNoaW5lX3BhcmFtZXRlcnNfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworCisgICAgCXNlcDo6YXZtX29mZnNldF90IG9mZnNldCA9IDA7CisgICAgCXNlcDo6TW9kaWZpZXIgbWRmciA9IHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX1BBUkFNRVRFUl9NT0RJRklFUjsKKworICAgIAlzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSA9IG1hY2hpbmUtPmdldFByb3BlcnR5UGFydCgpOworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgyNSkpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjExNzQ6MjogKCBMQlJBQ0tFVCBkZWZfbWFjaGluZV92YXJpYWJsZV9wYXJhbWV0ZXJfYXRvbVsgZGVjbFByb3BlcnR5ICwgbWRmciAsIG9mZnNldCBdICggQ09NTUEgZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b21bIGRlY2xQcm9wZXJ0eSAsIG1kZnIgLCArK29mZnNldCBdICkqIFJCUkFDS0VUIHwgTFBBUkVOIGRlZl9tYWNoaW5lX3ZhcmlhYmxlX3BhcmFtZXRlcl9hdG9tWyBkZWNsUHJvcGVydHkgLCBtZGZyICwgb2Zmc2V0IF0gKCBDT01NQSBkZWZfbWFjaGluZV92YXJpYWJsZV9wYXJhbWV0ZXJfYXRvbVsgZGVjbFByb3BlcnR5ICwgbWRmciAsICsrb2Zmc2V0IF0gKSogUlBBUkVOICkKKworICAgICAgICAgICAgQU5UTFIzX1VJTlQzMiBhbHQ1MTsKKworICAgICAgICAgICAgYWx0NTE9MjsKKworICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBMQlJBQ0tFVDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDUxPTE7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBMUEFSRU46CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ1MT0yOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA1MTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9tYWNoaW5lX3BhcmFtZXRlcnNFeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDUxKQorICAgICAgICAgICAgeworICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjExNzQ6NDogTEJSQUNLRVQgZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b21bIGRlY2xQcm9wZXJ0eSAsIG1kZnIgLCBvZmZzZXQgXSAoIENPTU1BIGRlZl9tYWNoaW5lX3ZhcmlhYmxlX3BhcmFtZXRlcl9hdG9tWyBkZWNsUHJvcGVydHkgLCBtZGZyICwgKytvZmZzZXQgXSApKiBSQlJBQ0tFVAorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChMQlJBQ0tFVCwgJkZPTExPV19MQlJBQ0tFVF9pbl9kZWZfbWFjaGluZV9wYXJhbWV0ZXJzMjIzOCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9tYWNoaW5lX3BhcmFtZXRlcnNFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlZl9tYWNoaW5lX3ZhcmlhYmxlX3BhcmFtZXRlcl9hdG9tX2luX2RlZl9tYWNoaW5lX3BhcmFtZXRlcnMyMjQxKTsKKyAgICAgICAgCSAgICAgICAgZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b20oY3R4LCBkZWNsUHJvcGVydHksIG1kZnIsIG9mZnNldCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9tYWNoaW5lX3BhcmFtZXRlcnNFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjExNzU6NDogKCBDT01NQSBkZWZfbWFjaGluZV92YXJpYWJsZV9wYXJhbWV0ZXJfYXRvbVsgZGVjbFByb3BlcnR5ICwgbWRmciAsICsrb2Zmc2V0IF0gKSoKKworICAgICAgICAJICAgICAgICBmb3IgKDs7KQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0NDk9MjsKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgQ09NTUE6CisgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgCQlhbHQ0OT0xOworICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ5KQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjExNzU6NjogQ09NTUEgZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b21bIGRlY2xQcm9wZXJ0eSAsIG1kZnIgLCArK29mZnNldCBdCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKENPTU1BLCAmRk9MTE9XX0NPTU1BX2luX2RlZl9tYWNoaW5lX3BhcmFtZXRlcnMyMjQ5KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX21hY2hpbmVfcGFyYW1ldGVyc0V4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b21faW5fZGVmX21hY2hpbmVfcGFyYW1ldGVyczIyNTMpOworICAgICAgICAJICAgICAgICAJICAgICAgICBkZWZfbWFjaGluZV92YXJpYWJsZV9wYXJhbWV0ZXJfYXRvbShjdHgsIGRlY2xQcm9wZXJ0eSwgbWRmciwgKytvZmZzZXQpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfbWFjaGluZV9wYXJhbWV0ZXJzRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAJZGVmYXVsdDoKKyAgICAgICAgCSAgICAgICAgCSAgICBnb3RvIGxvb3A0OTsJLyogYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgbG9vcDQ5OiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICAJICAgICAgICAgTUFUQ0hUKFJCUkFDS0VULCAmRk9MTE9XX1JCUkFDS0VUX2luX2RlZl9tYWNoaW5lX3BhcmFtZXRlcnMyMjYyKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX21hY2hpbmVfcGFyYW1ldGVyc0V4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDI6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTE3ODo0OiBMUEFSRU4gZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b21bIGRlY2xQcm9wZXJ0eSAsIG1kZnIgLCBvZmZzZXQgXSAoIENPTU1BIGRlZl9tYWNoaW5lX3ZhcmlhYmxlX3BhcmFtZXRlcl9hdG9tWyBkZWNsUHJvcGVydHkgLCBtZGZyICwgKytvZmZzZXQgXSApKiBSUEFSRU4KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoTFBBUkVOLCAmRk9MTE9XX0xQQVJFTl9pbl9kZWZfbWFjaGluZV9wYXJhbWV0ZXJzMjI2OCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9tYWNoaW5lX3BhcmFtZXRlcnNFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlZl9tYWNoaW5lX3ZhcmlhYmxlX3BhcmFtZXRlcl9hdG9tX2luX2RlZl9tYWNoaW5lX3BhcmFtZXRlcnMyMjcyKTsKKyAgICAgICAgCSAgICAgICAgZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b20oY3R4LCBkZWNsUHJvcGVydHksIG1kZnIsIG9mZnNldCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9tYWNoaW5lX3BhcmFtZXRlcnNFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjExNzk6NDogKCBDT01NQSBkZWZfbWFjaGluZV92YXJpYWJsZV9wYXJhbWV0ZXJfYXRvbVsgZGVjbFByb3BlcnR5ICwgbWRmciAsICsrb2Zmc2V0IF0gKSoKKworICAgICAgICAJICAgICAgICBmb3IgKDs7KQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0NTA9MjsKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgQ09NTUE6CisgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgCQlhbHQ1MD0xOworICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDUwKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjExNzk6NjogQ09NTUEgZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b21bIGRlY2xQcm9wZXJ0eSAsIG1kZnIgLCArK29mZnNldCBdCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKENPTU1BLCAmRk9MTE9XX0NPTU1BX2luX2RlZl9tYWNoaW5lX3BhcmFtZXRlcnMyMjgwKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX21hY2hpbmVfcGFyYW1ldGVyc0V4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b21faW5fZGVmX21hY2hpbmVfcGFyYW1ldGVyczIyODMpOworICAgICAgICAJICAgICAgICAJICAgICAgICBkZWZfbWFjaGluZV92YXJpYWJsZV9wYXJhbWV0ZXJfYXRvbShjdHgsIGRlY2xQcm9wZXJ0eSwgbWRmciwgKytvZmZzZXQpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfbWFjaGluZV9wYXJhbWV0ZXJzRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAJZGVmYXVsdDoKKyAgICAgICAgCSAgICAgICAgCSAgICBnb3RvIGxvb3A1MDsJLyogYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgbG9vcDUwOiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICAJICAgICAgICAgTUFUQ0hUKFJQQVJFTiwgJkZPTExPV19SUEFSRU5faW5fZGVmX21hY2hpbmVfcGFyYW1ldGVyczIyOTIpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfbWFjaGluZV9wYXJhbWV0ZXJzRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlZGVmX21hY2hpbmVfcGFyYW1ldGVyc0V4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZWRlZl9tYWNoaW5lX3BhcmFtZXRlcnNFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDI1LCBkZWZfbWFjaGluZV9wYXJhbWV0ZXJzX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBkZWZfbWFjaGluZV9wYXJhbWV0ZXJzICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGRlZl9tYWNoaW5lX3ZhcmlhYmxlX3BhcmFtZXRlcl9hdG9tCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMTg0OjE6IGRlZl9tYWNoaW5lX3ZhcmlhYmxlX3BhcmFtZXRlcl9hdG9tWyBzZXA6OlByb3BlcnR5UGFydCAmIHBhcmFtRGVjbCAsXG5cdFx0c2VwOjpNb2RpZmllciBtZGZyICwgc2VwOjphdm1fb2Zmc2V0X3Qgb2Zmc2V0IF0gOiAoIChtPSBtb2RpZmllcl9wYXJhbSApPyB0dj0gdHlwZV92YXIgKGlkPSBJRCAoaXY9IGluaXRpYWxfdmFsdWUgKT8gKT8gfCAnYmluZDonICggKCB0eXBlX3ZhciBDT0xPTiApPT50dj0gdHlwZV92YXIgQ09MT04gZT0gZXhwcmVzc2lvbiB8dmlkPSBxdWFsaWZpZWROYW1lSUQgKSApOworICovCitzdGF0aWMgdm9pZAorZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b20ocGZtbFBhcnNlciBjdHgsIHNlcDo6UHJvcGVydHlQYXJ0ICYgcGFyYW1EZWNsLCBzZXA6Ok1vZGlmaWVyIG1kZnIsIHNlcDo6YXZtX29mZnNldF90IG9mZnNldCkKK3sKKyAgICBBTlRMUjNfVUlOVDMyIGRlZl9tYWNoaW5lX3ZhcmlhYmxlX3BhcmFtZXRlcl9hdG9tX1N0YXJ0SW5kZXg7CisKKyAgICBwQU5UTFIzX0NPTU1PTl9UT0tFTiAgICBpZDsKKyAgICBzZXA6Ok1vZGlmaWVyIG07CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX20KKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX20gc2VwOjpNb2RpZmllcgorCisgICAgc2VwOjpCRiB0djsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfdHYKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX3R2IHNlcDo6QkYKKworICAgIHNlcDo6QkYgaXY7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2l2CisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9pdiBzZXA6OkJGCisKKyAgICBzZXA6OkJGIGU7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2UKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisgICAgZm1sUGFyc2VyX3F1YWxpZmllZE5hbWVJRF9yZXR1cm4gdmlkOworICAgICN1bmRlZglSRVRVUk5fVFlQRV92aWQKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX3ZpZCBmbWxQYXJzZXJfcXVhbGlmaWVkTmFtZUlEX3JldHVybgorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGRlZl9tYWNoaW5lX3ZhcmlhYmxlX3BhcmFtZXRlcl9hdG9tX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKworICAgIAlzZXA6OlZhcmlhYmxlICogdmFyaWFibGU7CisgICAgCXNlcDo6TWFjaGluZSAqIG1hY2hpbmUgPSBwYXJhbURlY2wuZ2V0Q29udGFpbmVyKCktPmFzPCBzZXA6Ok1hY2hpbmUgPigpOworICAgIAlzZXA6OkJGIHBhcmFtVCA9IHNlcDo6VHlwZU1hbmFnZXI6OlVOSVZFUlNBTDsKKyAgICAJc3RkOjpzdHJpbmcgcGFyYW1JRDsKKyAgICAJc2VwOjpCRiB2YWx1ZTsKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMjYpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICBpZCAgICAgICA9IE5VTEw7CisKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vICAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMTk0OjI6ICggKG09IG1vZGlmaWVyX3BhcmFtICk/IHR2PSB0eXBlX3ZhciAoaWQ9IElEIChpdj0gaW5pdGlhbF92YWx1ZSApPyApPyB8ICdiaW5kOicgKCAoIHR5cGVfdmFyIENPTE9OICk9PnR2PSB0eXBlX3ZhciBDT0xPTiBlPSBleHByZXNzaW9uIHx2aWQ9IHF1YWxpZmllZE5hbWVJRCApICkKKworICAgICAgICAgICAgQU5UTFIzX1VJTlQzMiBhbHQ1NjsKKworICAgICAgICAgICAgYWx0NTY9MjsKKworICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBBU1NJR05fUkVGOgorICAgICAgICAgICAgY2FzZSBCQU5EOgorICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgICAgIGNhc2UgTFRFOgorICAgICAgICAgICAgY2FzZSAxNjQ6CisgICAgICAgICAgICBjYXNlIDE2NjoKKyAgICAgICAgICAgIGNhc2UgMjQxOgorICAgICAgICAgICAgY2FzZSAyNDI6CisgICAgICAgICAgICBjYXNlIDI0MzoKKyAgICAgICAgICAgIGNhc2UgMjQ1OgorICAgICAgICAgICAgY2FzZSAyNDY6CisgICAgICAgICAgICBjYXNlIDI0OToKKyAgICAgICAgICAgIGNhc2UgMjU0OgorICAgICAgICAgICAgY2FzZSAyNTU6CisgICAgICAgICAgICBjYXNlIDI1OToKKyAgICAgICAgICAgIGNhc2UgMjYxOgorICAgICAgICAgICAgY2FzZSAyNjI6CisgICAgICAgICAgICBjYXNlIDI2NDoKKyAgICAgICAgICAgIGNhc2UgMjcwOgorICAgICAgICAgICAgY2FzZSAyNzE6CisgICAgICAgICAgICBjYXNlIDI4MToKKyAgICAgICAgICAgIGNhc2UgMjgyOgorICAgICAgICAgICAgY2FzZSAyODM6CisgICAgICAgICAgICBjYXNlIDI5NToKKyAgICAgICAgICAgIGNhc2UgMjk4OgorICAgICAgICAgICAgY2FzZSAzMDU6CisgICAgICAgICAgICBjYXNlIDMwOToKKyAgICAgICAgICAgIGNhc2UgMzEwOgorICAgICAgICAgICAgY2FzZSAzMTE6CisgICAgICAgICAgICBjYXNlIDMxNToKKyAgICAgICAgICAgIGNhc2UgMzE2OgorICAgICAgICAgICAgY2FzZSAzMTc6CisgICAgICAgICAgICBjYXNlIDMxODoKKyAgICAgICAgICAgIGNhc2UgMzIwOgorICAgICAgICAgICAgY2FzZSAzMjU6CisgICAgICAgICAgICBjYXNlIDMyNjoKKyAgICAgICAgICAgIGNhc2UgMzI5OgorICAgICAgICAgICAgY2FzZSAzMzM6CisgICAgICAgICAgICBjYXNlIDMzNToKKyAgICAgICAgICAgIGNhc2UgMzQxOgorICAgICAgICAgICAgY2FzZSAzNDQ6CisgICAgICAgICAgICBjYXNlIDM0NToKKyAgICAgICAgICAgIGNhc2UgMzQ2OgorICAgICAgICAgICAgY2FzZSAzNTc6CisgICAgICAgICAgICBjYXNlIDM1ODoKKyAgICAgICAgICAgIGNhc2UgMzYwOgorICAgICAgICAgICAgY2FzZSAzNjE6CisgICAgICAgICAgICBjYXNlIDM2NDoKKyAgICAgICAgICAgIGNhc2UgMzcwOgorICAgICAgICAgICAgY2FzZSAzNzM6CisgICAgICAgICAgICBjYXNlIDM3NDoKKyAgICAgICAgICAgIGNhc2UgMzg3OgorICAgICAgICAgICAgY2FzZSAzOTI6CisgICAgICAgICAgICBjYXNlIDM5OToKKyAgICAgICAgICAgIGNhc2UgNDAwOgorICAgICAgICAgICAgY2FzZSA0MDE6CisgICAgICAgICAgICBjYXNlIDQwMjoKKyAgICAgICAgICAgIGNhc2UgNDA1OgorICAgICAgICAgICAgY2FzZSA0MDc6CisgICAgICAgICAgICBjYXNlIDQwODoKKyAgICAgICAgICAgIGNhc2UgNDA5OgorICAgICAgICAgICAgY2FzZSA0MTI6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ1Nj0xOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjQ0OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NTY9MjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gNTY7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfbWFjaGluZV92YXJpYWJsZV9wYXJhbWV0ZXJfYXRvbUV4OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NTYpCisgICAgICAgICAgICB7CisgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTE5NDo0OiAobT0gbW9kaWZpZXJfcGFyYW0gKT8gdHY9IHR5cGVfdmFyIChpZD0gSUQgKGl2PSBpbml0aWFsX3ZhbHVlICk/ICk/CisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMTk0OjQ6IChtPSBtb2RpZmllcl9wYXJhbSApPworICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0NTI9MjsKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIEFTU0lHTl9SRUY6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBCQU5EOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgTFRFOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMTY0OgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMTY2OgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMjQzOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMjYyOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMjgyOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMjk1OgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMjk4OgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzA1OgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzE4OgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzM1OgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzQxOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzYxOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzY0OgorICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQlhbHQ1Mj0xOworICAgICAgICAJICAgICAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDUyKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjExOTQ6NjogbT0gbW9kaWZpZXJfcGFyYW0KKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX21vZGlmaWVyX3BhcmFtX2luX2RlZl9tYWNoaW5lX3ZhcmlhYmxlX3BhcmFtZXRlcl9hdG9tMjMxNSk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIG09bW9kaWZpZXJfcGFyYW0oY3R4KTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b21FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIG1kZnIub3ZlcnJpZGVfaWZkZWYoIG0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICApOyAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3R5cGVfdmFyX2luX2RlZl9tYWNoaW5lX3ZhcmlhYmxlX3BhcmFtZXRlcl9hdG9tMjMyNyk7CisgICAgICAgIAkgICAgICAgIHR2PXR5cGVfdmFyKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9tYWNoaW5lX3ZhcmlhYmxlX3BhcmFtZXRlcl9hdG9tRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBwYXJhbVQgPSB0dgorICAgICAgICAJICAgICAgICAgICAgOyAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTE5Njo0OiAoaWQ9IElEIChpdj0gaW5pdGlhbF92YWx1ZSApPyApPworICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0NTQ9MjsKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIElEOgorICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQlhbHQ1ND0xOworICAgICAgICAJICAgICAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDU0KQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjExOTY6NjogaWQ9IElEIChpdj0gaW5pdGlhbF92YWx1ZSApPworICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWQgPSAocEFOVExSM19DT01NT05fVE9LRU4pIE1BVENIVChJRCwgJkZPTExPV19JRF9pbl9kZWZfbWFjaGluZV92YXJpYWJsZV9wYXJhbWV0ZXJfYXRvbTIzMzgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfbWFjaGluZV92YXJpYWJsZV9wYXJhbWV0ZXJfYXRvbUV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgcGFyYW1JRCA9IFNUUigoaWQtPmdldFRleHQoaWQpKS0+Y2hhcnMpOyAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTE5Nzo2OiAoaXY9IGluaXRpYWxfdmFsdWUgKT8KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDUzPTI7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBBU1NJR046CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBMUEFSRU46CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAJCWFsdDUzPTE7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0NTMpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTE5Nzo4OiBpdj0gaW5pdGlhbF92YWx1ZQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfaW5pdGlhbF92YWx1ZV9pbl9kZWZfbWFjaGluZV92YXJpYWJsZV9wYXJhbWV0ZXJfYXRvbTIzNTUpOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpdj1pbml0aWFsX3ZhbHVlKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9tYWNoaW5lX3ZhcmlhYmxlX3BhcmFtZXRlcl9hdG9tRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICB2YWx1ZSA9IGl2CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICA7IAorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworCisgICAgICAgIAkgICAgICAgICAgICAJCXBhcmFtRGVjbC5zYXZlT3duZWRWYXJpYWJsZSggdmFyaWFibGUgPSBuZXcgc2VwOjpWYXJpYWJsZSgKKyAgICAgICAgCSAgICAgICAgICAgIAkJCQltYWNoaW5lLCBtZGZyLCBwYXJhbVQsIHBhcmFtSUQsIHZhbHVlICkgKTsKKyAgICAgICAgCSAgICAgICAgICAgIAkgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMjA0OjQ6ICdiaW5kOicgKCAoIHR5cGVfdmFyIENPTE9OICk9PnR2PSB0eXBlX3ZhciBDT0xPTiBlPSBleHByZXNzaW9uIHx2aWQ9IHF1YWxpZmllZE5hbWVJRCApCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDI0NCwgJkZPTExPV18yNDRfaW5fZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b20yMzc4KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b21FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEyMDU6NDogKCAoIHR5cGVfdmFyIENPTE9OICk9PnR2PSB0eXBlX3ZhciBDT0xPTiBlPSBleHByZXNzaW9uIHx2aWQ9IHF1YWxpZmllZE5hbWVJRCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQ1NT0yOworICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgIGludCBMQTU1XzAgPSBMQSgxKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTE1X2ZtbChjdHgpKSAmJiAoKChMQTU1XzAgPj0gMjQ1KSAmJiAoTEE1NV8wIDw9IDI0NikpKSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDU1PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDExNV9mbWwoY3R4KSkgJiYgKCgoTEE1NV8wID49IDMwOSkgJiYgKExBNTVfMCA8PSAzMTApKSkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQ1NT0xOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQxMTVfZm1sKGN0eCkpICYmICgoKExBNTVfMCA+PSA0MDEpICYmIChMQTU1XzAgPD0gNDAyKSkpKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0NTU9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMTE1X2ZtbChjdHgpKSAmJiAoKChMQTU1XzAgPj0gMzQ1KSAmJiAoTEE1NV8wIDw9IDM0NikpKSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDU1PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDExNV9mbWwoY3R4KSkgJiYgKCgoTEE1NV8wID49IDM1NykgJiYgKExBNTVfMCA8PSAzNTgpKSkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQ1NT0xOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQxMTVfZm1sKGN0eCkpICYmICgoKExBNTVfMCA+PSA0MDcpICYmIChMQTU1XzAgPD0gNDA4KSkpKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0NTU9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMTE1X2ZtbChjdHgpKSAmJiAoTEE1NV8wID09IDI4MykpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQ1NT0xOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQxMTVfZm1sKGN0eCkpICYmIChMQTU1XzAgPT0gNDAwKSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDU1PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDExNV9mbWwoY3R4KSkgJiYgKExBNTVfMCA9PSAyNzApKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0NTU9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMTE1X2ZtbChjdHgpKSAmJiAoTEE1NV8wID09IDM5OSkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQ1NT0xOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQxMTVfZm1sKGN0eCkpICYmIChMQTU1XzAgPT0gMzYwKSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDU1PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDExNV9mbWwoY3R4KSkgJiYgKExBNTVfMCA9PSA0MDkpKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0NTU9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMTE1X2ZtbChjdHgpKSAmJiAoTEE1NV8wID09IDI1OSkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQ1NT0xOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQxMTVfZm1sKGN0eCkpICYmIChMQTU1XzAgPT0gMzkyKSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDU1PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDExNV9mbWwoY3R4KSkgJiYgKExBNTVfMCA9PSAyNjQpKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0NTU9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMTE1X2ZtbChjdHgpKSAmJiAoTEE1NV8wID09IDI3MSkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQ1NT0xOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQxMTVfZm1sKGN0eCkpICYmIChMQTU1XzAgPT0gMjU0KSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDU1PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDExNV9mbWwoY3R4KSkgJiYgKExBNTVfMCA9PSAyNTUpKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0NTU9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMTE1X2ZtbChjdHgpKSAmJiAoTEE1NV8wID09IDM4NykpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQ1NT0xOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQxMTVfZm1sKGN0eCkpICYmIChMQTU1XzAgPT0gMzMzKSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDU1PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDExNV9mbWwoY3R4KSkgJiYgKExBNTVfMCA9PSAyNDIpKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0NTU9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMTE1X2ZtbChjdHgpKSAmJiAoTEE1NV8wID09IDM0NCkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQ1NT0xOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQxMTVfZm1sKGN0eCkpICYmIChMQTU1XzAgPT0gMjQ5KSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDU1PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDExNV9mbWwoY3R4KSkgJiYgKExBNTVfMCA9PSAzMjApKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0NTU9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMTE1X2ZtbChjdHgpKSAmJiAoTEE1NV8wID09IDM3NCkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQ1NT0xOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQxMTVfZm1sKGN0eCkpICYmIChMQTU1XzAgPT0gMjYxKSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDU1PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDExNV9mbWwoY3R4KSkgJiYgKExBNTVfMCA9PSAzMTcpKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0NTU9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMTE1X2ZtbChjdHgpKSAmJiAoTEE1NV8wID09IDQwNSkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQ1NT0xOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBNTVfMCA9PSBJRCkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE1NV8yOSA9IExBKDIpOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDExNV9mbWwoY3R4KSkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0NTU9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoQU5UTFIzX1RSVUUpKQorICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDU1PTI7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA1NTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDI5OworCisKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfbWFjaGluZV92YXJpYWJsZV9wYXJhbWV0ZXJfYXRvbUV4OworCisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMTE1X2ZtbChjdHgpKSAmJiAoTEE1NV8wID09IDI0MSkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQ1NT0xOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQxMTVfZm1sKGN0eCkpICYmIChMQTU1XzAgPT0gNDEyKSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDU1PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDExNV9mbWwoY3R4KSkgJiYgKExBNTVfMCA9PSAzNzApKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0NTU9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMTE1X2ZtbChjdHgpKSAmJiAoTEE1NV8wID09IDMxNikpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQ1NT0xOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQxMTVfZm1sKGN0eCkpICYmIChMQTU1XzAgPT0gMjgxKSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDU1PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDExNV9mbWwoY3R4KSkgJiYgKExBNTVfMCA9PSAzMTUpKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0NTU9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMTE1X2ZtbChjdHgpKSAmJiAoTEE1NV8wID09IDMyNSkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQ1NT0xOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQxMTVfZm1sKGN0eCkpICYmIChMQTU1XzAgPT0gMzI2KSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDU1PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDExNV9mbWwoY3R4KSkgJiYgKExBNTVfMCA9PSAzNzMpKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0NTU9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMTE1X2ZtbChjdHgpKSAmJiAoTEE1NV8wID09IDMyOSkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQ1NT0xOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQxMTVfZm1sKGN0eCkpICYmIChMQTU1XzAgPT0gMzExKSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDU1PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA1NTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b21FeDsKKworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0NTUpCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTIwNTo2OiAoIHR5cGVfdmFyIENPTE9OICk9PnR2PSB0eXBlX3ZhciBDT0xPTiBlPSBleHByZXNzaW9uCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV190eXBlX3Zhcl9pbl9kZWZfbWFjaGluZV92YXJpYWJsZV9wYXJhbWV0ZXJfYXRvbTIzOTkpOworICAgICAgICAJICAgICAgICAJICAgICAgICB0dj10eXBlX3ZhcihjdHgpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfbWFjaGluZV92YXJpYWJsZV9wYXJhbWV0ZXJfYXRvbUV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChDT0xPTiwgJkZPTExPV19DT0xPTl9pbl9kZWZfbWFjaGluZV92YXJpYWJsZV9wYXJhbWV0ZXJfYXRvbTI0MDEpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfbWFjaGluZV92YXJpYWJsZV9wYXJhbWV0ZXJfYXRvbUV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgcGFyYW1UID0gdHYKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIDsgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b20yNDEyKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9tYWNoaW5lX3ZhcmlhYmxlX3BhcmFtZXRlcl9hdG9tRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICB2YWx1ZSA9IGUKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIDsgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAJY2FzZSAyOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEyMDc6NjogdmlkPSBxdWFsaWZpZWROYW1lSUQKKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9kZWZfbWFjaGluZV92YXJpYWJsZV9wYXJhbWV0ZXJfYXRvbTI0MjMpOworICAgICAgICAJICAgICAgICAJICAgICAgICB2aWQ9cXVhbGlmaWVkTmFtZUlEKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9tYWNoaW5lX3ZhcmlhYmxlX3BhcmFtZXRlcl9hdG9tRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgCXZhbHVlID0gc2VwOjpQYXJzZXJVdGlsOjpnZXRWYXJpYWJsZSh2aWQucworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgLCB2aWQubmIKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAJaWYoIHZhbHVlLnZhbGlkKCkgKSB7IHBhcmFtVCA9IHZhbHVlLnRvX3B0cjwgc2VwOjpWYXJpYWJsZSA+KCktPmdldFR5cGUoKTsgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKworICAgICAgICAJICAgICAgICAgICAgCQlwYXJhbUlEID0gc2VwOjpPU1MoKSA8PCAnIycgPDwgb2Zmc2V0OworICAgICAgICAJICAgICAgICAgICAgCQlwYXJhbURlY2wuc2F2ZU93bmVkVmFyaWFibGUoIHZhcmlhYmxlID0gbmV3IHNlcDo6VmFyaWFibGUobWFjaGluZSwKKyAgICAgICAgCSAgICAgICAgICAgIAkJCQkJCW1kZnIuYWRkTmF0dXJlS2luZCggc2VwOjpNb2RpZmllcjo6TkFUVVJFX0JJTkRfS0lORCApLAorICAgICAgICAJICAgICAgICAgICAgCQkJCQkJcGFyYW1ULCBwYXJhbUlELCB2YWx1ZSApICk7CisKKyAgICAgICAgCSAgICAgICAgICAgIAkJdmFyaWFibGUtPnNldE9mZnNldCggb2Zmc2V0ICk7CisgICAgICAgIAkgICAgICAgICAgICAJICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZWRlZl9tYWNoaW5lX3ZhcmlhYmxlX3BhcmFtZXRlcl9hdG9tRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b21FeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDI2LCBkZWZfbWFjaGluZV92YXJpYWJsZV9wYXJhbWV0ZXJfYXRvbV9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b20gKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgZGVmX21hY2hpbmVfcmV0dXJucworICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTIyNDoxOiBkZWZfbWFjaGluZV9yZXR1cm5zWyBzZXA6Ok1hY2hpbmUgKiBtYWNoaW5lICwgc2VwOjpNb2RpZmllciBtZGZyIF0gOiAoICctLT4nIHwgJ3JldHVybnM6JyApICggKCBMQlJBQ0tFVCBkZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbVsgZGVjbFByb3BlcnR5ICwgbWRmciAsIG9mZnNldF0gKCBDT01NQSBkZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbVsgZGVjbFByb3BlcnR5ICwgbWRmciAsICsrb2Zmc2V0IF0gKSogUkJSQUNLRVQgKSB8ICggTFBBUkVOIGRlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tWyBkZWNsUHJvcGVydHkgLCBtZGZyICwgb2Zmc2V0XSAoIENPTU1BIGRlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tWyBkZWNsUHJvcGVydHkgLCBtZGZyICwgKytvZmZzZXQgXSApKiBSUEFSRU4gKSB8dHY9IHR5cGVfdmFyIChpdj0gaW5pdGlhbF92YWx1ZSApPyApIDsKKyAqLworc3RhdGljIHZvaWQKK2RlZl9tYWNoaW5lX3JldHVybnMocGZtbFBhcnNlciBjdHgsIHNlcDo6TWFjaGluZSAqIG1hY2hpbmUsIHNlcDo6TW9kaWZpZXIgbWRmcikKK3sKKyAgICBBTlRMUjNfVUlOVDMyIGRlZl9tYWNoaW5lX3JldHVybnNfU3RhcnRJbmRleDsKKworICAgIHNlcDo6QkYgdHY7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX3R2CisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV90diBzZXA6OkJGCisKKyAgICBzZXA6OkJGIGl2OworICAgICN1bmRlZglSRVRVUk5fVFlQRV9pdgorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfaXYgc2VwOjpCRgorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGRlZl9tYWNoaW5lX3JldHVybnNfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworCisgICAgCXNlcDo6YXZtX29mZnNldF90IG9mZnNldCA9IDA7CisgICAgCW1kZnIuc2V0RGlyZWN0aW9uS2luZCggc2VwOjpNb2RpZmllcjo6RElSRUNUSU9OX1JFVFVSTl9LSU5EICk7CisgICAgCXNlcDo6QkYgdmFsdWU7CisKKyAgICAJc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHkgPSBtYWNoaW5lLT5nZXRQcm9wZXJ0eVBhcnQoKTsKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMjcpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEyMzM6MjogKCAoICctLT4nIHwgJ3JldHVybnM6JyApICggKCBMQlJBQ0tFVCBkZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbVsgZGVjbFByb3BlcnR5ICwgbWRmciAsIG9mZnNldF0gKCBDT01NQSBkZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbVsgZGVjbFByb3BlcnR5ICwgbWRmciAsICsrb2Zmc2V0IF0gKSogUkJSQUNLRVQgKSB8ICggTFBBUkVOIGRlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tWyBkZWNsUHJvcGVydHkgLCBtZGZyICwgb2Zmc2V0XSAoIENPTU1BIGRlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tWyBkZWNsUHJvcGVydHkgLCBtZGZyICwgKytvZmZzZXQgXSApKiBSUEFSRU4gKSB8dHY9IHR5cGVfdmFyIChpdj0gaW5pdGlhbF92YWx1ZSApPyApICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTIzMzo0OiAoICctLT4nIHwgJ3JldHVybnM6JyApICggKCBMQlJBQ0tFVCBkZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbVsgZGVjbFByb3BlcnR5ICwgbWRmciAsIG9mZnNldF0gKCBDT01NQSBkZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbVsgZGVjbFByb3BlcnR5ICwgbWRmciAsICsrb2Zmc2V0IF0gKSogUkJSQUNLRVQgKSB8ICggTFBBUkVOIGRlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tWyBkZWNsUHJvcGVydHkgLCBtZGZyICwgb2Zmc2V0XSAoIENPTU1BIGRlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tWyBkZWNsUHJvcGVydHkgLCBtZGZyICwgKytvZmZzZXQgXSApKiBSUEFSRU4gKSB8dHY9IHR5cGVfdmFyIChpdj0gaW5pdGlhbF92YWx1ZSApPyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggTEEoMSkgPT0gMTYzIHx8IExBKDEpID09IDM2NSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ09OU1VNRSgpOworICAgICAgICAgICAgICAgIFBFUlJPUlJFQ09WRVJZPUFOVExSM19GQUxTRTsKKyAgICAgICAgICAgICAgICBGQUlMRURGTEFHPUFOVExSM19GQUxTRTsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX01JU01BVENIRURfU0VUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPm5hbWUgICAgICAgICA9ICh2b2lkICopQU5UTFIzX01JU01BVENIRURfU0VUX05BTUU7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5leHBlY3RpbmdTZXQgPSBOVUxMOworCisgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX21hY2hpbmVfcmV0dXJuc0V4OworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEyMzQ6NDogKCAoIExCUkFDS0VUIGRlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tWyBkZWNsUHJvcGVydHkgLCBtZGZyICwgb2Zmc2V0XSAoIENPTU1BIGRlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tWyBkZWNsUHJvcGVydHkgLCBtZGZyICwgKytvZmZzZXQgXSApKiBSQlJBQ0tFVCApIHwgKCBMUEFSRU4gZGVmX21hY2hpbmVfdmFyaWFibGVfcmV0dXJuX2F0b21bIGRlY2xQcm9wZXJ0eSAsIG1kZnIgLCBvZmZzZXRdICggQ09NTUEgZGVmX21hY2hpbmVfdmFyaWFibGVfcmV0dXJuX2F0b21bIGRlY2xQcm9wZXJ0eSAsIG1kZnIgLCArK29mZnNldCBdICkqIFJQQVJFTiApIHx0dj0gdHlwZV92YXIgKGl2PSBpbml0aWFsX3ZhbHVlICk/ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0NjA9MzsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgTEJSQUNLRVQ6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDYwPTE7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBMUEFSRU46CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDYwPTI7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgICAgICAgICBjYXNlIDI0MToKKyAgICAgICAgICAgICAgICBjYXNlIDI0MjoKKyAgICAgICAgICAgICAgICBjYXNlIDI0NToKKyAgICAgICAgICAgICAgICBjYXNlIDI0NjoKKyAgICAgICAgICAgICAgICBjYXNlIDI0OToKKyAgICAgICAgICAgICAgICBjYXNlIDI1NDoKKyAgICAgICAgICAgICAgICBjYXNlIDI1NToKKyAgICAgICAgICAgICAgICBjYXNlIDI1OToKKyAgICAgICAgICAgICAgICBjYXNlIDI2MToKKyAgICAgICAgICAgICAgICBjYXNlIDI2NDoKKyAgICAgICAgICAgICAgICBjYXNlIDI3MDoKKyAgICAgICAgICAgICAgICBjYXNlIDI3MToKKyAgICAgICAgICAgICAgICBjYXNlIDI4MToKKyAgICAgICAgICAgICAgICBjYXNlIDI4MzoKKyAgICAgICAgICAgICAgICBjYXNlIDMwOToKKyAgICAgICAgICAgICAgICBjYXNlIDMxMDoKKyAgICAgICAgICAgICAgICBjYXNlIDMxMToKKyAgICAgICAgICAgICAgICBjYXNlIDMxNToKKyAgICAgICAgICAgICAgICBjYXNlIDMxNjoKKyAgICAgICAgICAgICAgICBjYXNlIDMxNzoKKyAgICAgICAgICAgICAgICBjYXNlIDMyMDoKKyAgICAgICAgICAgICAgICBjYXNlIDMyNToKKyAgICAgICAgICAgICAgICBjYXNlIDMyNjoKKyAgICAgICAgICAgICAgICBjYXNlIDMyOToKKyAgICAgICAgICAgICAgICBjYXNlIDMzMzoKKyAgICAgICAgICAgICAgICBjYXNlIDM0NDoKKyAgICAgICAgICAgICAgICBjYXNlIDM0NToKKyAgICAgICAgICAgICAgICBjYXNlIDM0NjoKKyAgICAgICAgICAgICAgICBjYXNlIDM1NzoKKyAgICAgICAgICAgICAgICBjYXNlIDM1ODoKKyAgICAgICAgICAgICAgICBjYXNlIDM2MDoKKyAgICAgICAgICAgICAgICBjYXNlIDM3MDoKKyAgICAgICAgICAgICAgICBjYXNlIDM3MzoKKyAgICAgICAgICAgICAgICBjYXNlIDM3NDoKKyAgICAgICAgICAgICAgICBjYXNlIDM4NzoKKyAgICAgICAgICAgICAgICBjYXNlIDM5MjoKKyAgICAgICAgICAgICAgICBjYXNlIDM5OToKKyAgICAgICAgICAgICAgICBjYXNlIDQwMDoKKyAgICAgICAgICAgICAgICBjYXNlIDQwMToKKyAgICAgICAgICAgICAgICBjYXNlIDQwMjoKKyAgICAgICAgICAgICAgICBjYXNlIDQwNToKKyAgICAgICAgICAgICAgICBjYXNlIDQwNzoKKyAgICAgICAgICAgICAgICBjYXNlIDQwODoKKyAgICAgICAgICAgICAgICBjYXNlIDQwOToKKyAgICAgICAgICAgICAgICBjYXNlIDQxMjoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0NjA9MzsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gNjA7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9tYWNoaW5lX3JldHVybnNFeDsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NjApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTIzNDo2OiAoIExCUkFDS0VUIGRlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tWyBkZWNsUHJvcGVydHkgLCBtZGZyICwgb2Zmc2V0XSAoIENPTU1BIGRlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tWyBkZWNsUHJvcGVydHkgLCBtZGZyICwgKytvZmZzZXQgXSApKiBSQlJBQ0tFVCApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEyMzQ6NjogKCBMQlJBQ0tFVCBkZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbVsgZGVjbFByb3BlcnR5ICwgbWRmciAsIG9mZnNldF0gKCBDT01NQSBkZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbVsgZGVjbFByb3BlcnR5ICwgbWRmciAsICsrb2Zmc2V0IF0gKSogUkJSQUNLRVQgKQorICAgICAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTIzNDo4OiBMQlJBQ0tFVCBkZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbVsgZGVjbFByb3BlcnR5ICwgbWRmciAsIG9mZnNldF0gKCBDT01NQSBkZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbVsgZGVjbFByb3BlcnR5ICwgbWRmciAsICsrb2Zmc2V0IF0gKSogUkJSQUNLRVQKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgTUFUQ0hUKExCUkFDS0VULCAmRk9MTE9XX0xCUkFDS0VUX2luX2RlZl9tYWNoaW5lX3JldHVybnMyNDc0KTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX21hY2hpbmVfcmV0dXJuc0V4OworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX21hY2hpbmVfdmFyaWFibGVfcmV0dXJuX2F0b21faW5fZGVmX21hY2hpbmVfcmV0dXJuczI0NzcpOworICAgICAgICAgICAgCSAgICAgICAgICAgIGRlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tKGN0eCwgZGVjbFByb3BlcnR5LCBtZGZyLCBvZmZzZXQpOworCisgICAgICAgICAgICAJICAgICAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9tYWNoaW5lX3JldHVybnNFeDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEyMzU6ODogKCBDT01NQSBkZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbVsgZGVjbFByb3BlcnR5ICwgbWRmciAsICsrb2Zmc2V0IF0gKSoKKworICAgICAgICAgICAgCSAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBpbnQgYWx0NTc9MjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgQ09NTUE6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAkJYWx0NTc9MTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDU3KQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEyMzU6MTA6IENPTU1BIGRlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tWyBkZWNsUHJvcGVydHkgLCBtZGZyICwgKytvZmZzZXQgXQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoQ09NTUEsICZGT0xMT1dfQ09NTUFfaW5fZGVmX21hY2hpbmVfcmV0dXJuczI0ODkpOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfbWFjaGluZV9yZXR1cm5zRXg7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbV9pbl9kZWZfbWFjaGluZV9yZXR1cm5zMjQ5Myk7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgZGVmX21hY2hpbmVfdmFyaWFibGVfcmV0dXJuX2F0b20oY3R4LCBkZWNsUHJvcGVydHksIG1kZnIsICsrb2Zmc2V0KTsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfbWFjaGluZV9yZXR1cm5zRXg7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAgICAgCWRlZmF1bHQ6CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICBnb3RvIGxvb3A1NzsJLyogYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICBsb29wNTc6IDsgLyogSnVtcCBvdXQgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgIE1BVENIVChSQlJBQ0tFVCwgJkZPTExPV19SQlJBQ0tFVF9pbl9kZWZfbWFjaGluZV9yZXR1cm5zMjUwNik7CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9tYWNoaW5lX3JldHVybnNFeDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDI6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEyMzk6NjogKCBMUEFSRU4gZGVmX21hY2hpbmVfdmFyaWFibGVfcmV0dXJuX2F0b21bIGRlY2xQcm9wZXJ0eSAsIG1kZnIgLCBvZmZzZXRdICggQ09NTUEgZGVmX21hY2hpbmVfdmFyaWFibGVfcmV0dXJuX2F0b21bIGRlY2xQcm9wZXJ0eSAsIG1kZnIgLCArK29mZnNldCBdICkqIFJQQVJFTiApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEyMzk6NjogKCBMUEFSRU4gZGVmX21hY2hpbmVfdmFyaWFibGVfcmV0dXJuX2F0b21bIGRlY2xQcm9wZXJ0eSAsIG1kZnIgLCBvZmZzZXRdICggQ09NTUEgZGVmX21hY2hpbmVfdmFyaWFibGVfcmV0dXJuX2F0b21bIGRlY2xQcm9wZXJ0eSAsIG1kZnIgLCArK29mZnNldCBdICkqIFJQQVJFTiApCisgICAgICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMjM5Ojg6IExQQVJFTiBkZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbVsgZGVjbFByb3BlcnR5ICwgbWRmciAsIG9mZnNldF0gKCBDT01NQSBkZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbVsgZGVjbFByb3BlcnR5ICwgbWRmciAsICsrb2Zmc2V0IF0gKSogUlBBUkVOCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIE1BVENIVChMUEFSRU4sICZGT0xMT1dfTFBBUkVOX2luX2RlZl9tYWNoaW5lX3JldHVybnMyNTIzKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX21hY2hpbmVfcmV0dXJuc0V4OworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX21hY2hpbmVfdmFyaWFibGVfcmV0dXJuX2F0b21faW5fZGVmX21hY2hpbmVfcmV0dXJuczI1MjcpOworICAgICAgICAgICAgCSAgICAgICAgICAgIGRlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tKGN0eCwgZGVjbFByb3BlcnR5LCBtZGZyLCBvZmZzZXQpOworCisgICAgICAgICAgICAJICAgICAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9tYWNoaW5lX3JldHVybnNFeDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEyNDA6ODogKCBDT01NQSBkZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbVsgZGVjbFByb3BlcnR5ICwgbWRmciAsICsrb2Zmc2V0IF0gKSoKKworICAgICAgICAgICAgCSAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBpbnQgYWx0NTg9MjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgQ09NTUE6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAkJYWx0NTg9MTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDU4KQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEyNDA6MTA6IENPTU1BIGRlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tWyBkZWNsUHJvcGVydHkgLCBtZGZyICwgKytvZmZzZXQgXQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoQ09NTUEsICZGT0xMT1dfQ09NTUFfaW5fZGVmX21hY2hpbmVfcmV0dXJuczI1MzkpOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfbWFjaGluZV9yZXR1cm5zRXg7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbV9pbl9kZWZfbWFjaGluZV9yZXR1cm5zMjU0Mik7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgZGVmX21hY2hpbmVfdmFyaWFibGVfcmV0dXJuX2F0b20oY3R4LCBkZWNsUHJvcGVydHksIG1kZnIsICsrb2Zmc2V0KTsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfbWFjaGluZV9yZXR1cm5zRXg7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAgICAgCWRlZmF1bHQ6CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICBnb3RvIGxvb3A1ODsJLyogYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICBsb29wNTg6IDsgLyogSnVtcCBvdXQgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgIE1BVENIVChSUEFSRU4sICZGT0xMT1dfUlBBUkVOX2luX2RlZl9tYWNoaW5lX3JldHVybnMyNTU1KTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX21hY2hpbmVfcmV0dXJuc0V4OworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMzoKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTI0NDo2OiB0dj0gdHlwZV92YXIgKGl2PSBpbml0aWFsX3ZhbHVlICk/CisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3R5cGVfdmFyX2luX2RlZl9tYWNoaW5lX3JldHVybnMyNTcyKTsKKyAgICAgICAgICAgIAkgICAgICAgIHR2PXR5cGVfdmFyKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfbWFjaGluZV9yZXR1cm5zRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMjQ0OjE4OiAoaXY9IGluaXRpYWxfdmFsdWUgKT8KKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0NTk9MjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIEFTU0lHTjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBMUEFSRU46CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAkJYWx0NTk9MTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0NTkpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTI0NDoyMDogaXY9IGluaXRpYWxfdmFsdWUKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfaW5pdGlhbF92YWx1ZV9pbl9kZWZfbWFjaGluZV9yZXR1cm5zMjU3OCk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpdj1pbml0aWFsX3ZhbHVlKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfbWFjaGluZV9yZXR1cm5zRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIHZhbHVlID0gaXYKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICA7IAorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworCisgICAgICAgICAgICAJICAgICAgICAgICAgCQlzZXA6OlZhcmlhYmxlICogdmFyaWFibGUgPQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkJCQluZXcgc2VwOjpWYXJpYWJsZShtYWNoaW5lLCBtZGZyLCB0dgorICAgICAgICAgICAgCSAgICAgICAgICAgICwgIiMwIiwgdmFsdWUpOworCisgICAgICAgICAgICAJICAgICAgICAgICAgCQlkZWNsUHJvcGVydHkuc2F2ZU93bmVkVmFyaWFibGUoIHZhcmlhYmxlICk7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZWRlZl9tYWNoaW5lX3JldHVybnNFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVkZWZfbWFjaGluZV9yZXR1cm5zRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgyNywgZGVmX21hY2hpbmVfcmV0dXJuc19TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgZGVmX21hY2hpbmVfcmV0dXJucyAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBkZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbQorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTI1NToxOiBkZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbVsgc2VwOjpQcm9wZXJ0eVBhcnQgJiBwYXJhbURlY2wgLFxuXHRcdHNlcDo6TW9kaWZpZXIgbWRmciAsIHNlcDo6YXZtX29mZnNldF90IG9mZnNldCBdIDogKCAobT0gbW9kaWZpZXJfcGFyYW0gKT8gdHY9IHR5cGVfdmFyIChpZD0gSUQgKGl2PSBpbml0aWFsX3ZhbHVlICk/ICk/IHwgJ2JpbmQ6JyAoICggdHlwZV92YXIgQ09MT04gKT0+dHY9IHR5cGVfdmFyIENPTE9OIGU9IGV4cHJlc3Npb24gfHZpZD0gcXVhbGlmaWVkTmFtZUlEICkgKTsKKyAqLworc3RhdGljIHZvaWQKK2RlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tKHBmbWxQYXJzZXIgY3R4LCBzZXA6OlByb3BlcnR5UGFydCAmIHBhcmFtRGVjbCwgc2VwOjpNb2RpZmllciBtZGZyLCBzZXA6OmF2bV9vZmZzZXRfdCBvZmZzZXQpCit7CisgICAgQU5UTFIzX1VJTlQzMiBkZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbV9TdGFydEluZGV4OworCisgICAgcEFOVExSM19DT01NT05fVE9LRU4gICAgaWQ7CisgICAgc2VwOjpNb2RpZmllciBtOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9tCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9tIHNlcDo6TW9kaWZpZXIKKworICAgIHNlcDo6QkYgdHY7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX3R2CisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV90diBzZXA6OkJGCisKKyAgICBzZXA6OkJGIGl2OworICAgICN1bmRlZglSRVRVUk5fVFlQRV9pdgorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfaXYgc2VwOjpCRgorCisgICAgc2VwOjpCRiBlOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9lCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9lIHNlcDo6QkYKKworICAgIGZtbFBhcnNlcl9xdWFsaWZpZWROYW1lSURfcmV0dXJuIHZpZDsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfdmlkCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV92aWQgZm1sUGFyc2VyX3F1YWxpZmllZE5hbWVJRF9yZXR1cm4KKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBkZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbV9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisKKyAgICAJc2VwOjpWYXJpYWJsZSAqIHZhcmlhYmxlOworICAgIAlzZXA6Ok1hY2hpbmUgKiBtYWNoaW5lID0gcGFyYW1EZWNsLmdldENvbnRhaW5lcigpLT5hczwgc2VwOjpNYWNoaW5lID4oKTsKKyAgICAJc2VwOjpCRiBwYXJhbVQgPSBzZXA6OlR5cGVNYW5hZ2VyOjpVTklWRVJTQUw7CisgICAgCXN0ZDo6c3RyaW5nIHBhcmFtSUQ7CisgICAgCXNlcDo6QkYgdmFsdWU7CisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDI4KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgaWQgICAgICAgPSBOVUxMOworCisgICAgeworICAgICAgICB7CisgICAgICAgICAgICAvLyAgL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTI2NToyOiAoIChtPSBtb2RpZmllcl9wYXJhbSApPyB0dj0gdHlwZV92YXIgKGlkPSBJRCAoaXY9IGluaXRpYWxfdmFsdWUgKT8gKT8gfCAnYmluZDonICggKCB0eXBlX3ZhciBDT0xPTiApPT50dj0gdHlwZV92YXIgQ09MT04gZT0gZXhwcmVzc2lvbiB8dmlkPSBxdWFsaWZpZWROYW1lSUQgKSApCisKKyAgICAgICAgICAgIEFOVExSM19VSU5UMzIgYWx0NjU7CisKKyAgICAgICAgICAgIGFsdDY1PTI7CisKKyAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQVNTSUdOX1JFRjoKKyAgICAgICAgICAgIGNhc2UgQkFORDoKKyAgICAgICAgICAgIGNhc2UgSUQ6CisgICAgICAgICAgICBjYXNlIExURToKKyAgICAgICAgICAgIGNhc2UgMTY0OgorICAgICAgICAgICAgY2FzZSAxNjY6CisgICAgICAgICAgICBjYXNlIDI0MToKKyAgICAgICAgICAgIGNhc2UgMjQyOgorICAgICAgICAgICAgY2FzZSAyNDM6CisgICAgICAgICAgICBjYXNlIDI0NToKKyAgICAgICAgICAgIGNhc2UgMjQ2OgorICAgICAgICAgICAgY2FzZSAyNDk6CisgICAgICAgICAgICBjYXNlIDI1NDoKKyAgICAgICAgICAgIGNhc2UgMjU1OgorICAgICAgICAgICAgY2FzZSAyNTk6CisgICAgICAgICAgICBjYXNlIDI2MToKKyAgICAgICAgICAgIGNhc2UgMjYyOgorICAgICAgICAgICAgY2FzZSAyNjQ6CisgICAgICAgICAgICBjYXNlIDI3MDoKKyAgICAgICAgICAgIGNhc2UgMjcxOgorICAgICAgICAgICAgY2FzZSAyODE6CisgICAgICAgICAgICBjYXNlIDI4MjoKKyAgICAgICAgICAgIGNhc2UgMjgzOgorICAgICAgICAgICAgY2FzZSAyOTU6CisgICAgICAgICAgICBjYXNlIDI5ODoKKyAgICAgICAgICAgIGNhc2UgMzA1OgorICAgICAgICAgICAgY2FzZSAzMDk6CisgICAgICAgICAgICBjYXNlIDMxMDoKKyAgICAgICAgICAgIGNhc2UgMzExOgorICAgICAgICAgICAgY2FzZSAzMTU6CisgICAgICAgICAgICBjYXNlIDMxNjoKKyAgICAgICAgICAgIGNhc2UgMzE3OgorICAgICAgICAgICAgY2FzZSAzMTg6CisgICAgICAgICAgICBjYXNlIDMyMDoKKyAgICAgICAgICAgIGNhc2UgMzI1OgorICAgICAgICAgICAgY2FzZSAzMjY6CisgICAgICAgICAgICBjYXNlIDMyOToKKyAgICAgICAgICAgIGNhc2UgMzMzOgorICAgICAgICAgICAgY2FzZSAzMzU6CisgICAgICAgICAgICBjYXNlIDM0MToKKyAgICAgICAgICAgIGNhc2UgMzQ0OgorICAgICAgICAgICAgY2FzZSAzNDU6CisgICAgICAgICAgICBjYXNlIDM0NjoKKyAgICAgICAgICAgIGNhc2UgMzU3OgorICAgICAgICAgICAgY2FzZSAzNTg6CisgICAgICAgICAgICBjYXNlIDM2MDoKKyAgICAgICAgICAgIGNhc2UgMzYxOgorICAgICAgICAgICAgY2FzZSAzNjQ6CisgICAgICAgICAgICBjYXNlIDM3MDoKKyAgICAgICAgICAgIGNhc2UgMzczOgorICAgICAgICAgICAgY2FzZSAzNzQ6CisgICAgICAgICAgICBjYXNlIDM4NzoKKyAgICAgICAgICAgIGNhc2UgMzkyOgorICAgICAgICAgICAgY2FzZSAzOTk6CisgICAgICAgICAgICBjYXNlIDQwMDoKKyAgICAgICAgICAgIGNhc2UgNDAxOgorICAgICAgICAgICAgY2FzZSA0MDI6CisgICAgICAgICAgICBjYXNlIDQwNToKKyAgICAgICAgICAgIGNhc2UgNDA3OgorICAgICAgICAgICAgY2FzZSA0MDg6CisgICAgICAgICAgICBjYXNlIDQwOToKKyAgICAgICAgICAgIGNhc2UgNDEyOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NjU9MTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI0NDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDY1PTI7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDY1OworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX21hY2hpbmVfdmFyaWFibGVfcmV0dXJuX2F0b21FeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDY1KQorICAgICAgICAgICAgeworICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEyNjU6NDogKG09IG1vZGlmaWVyX3BhcmFtICk/IHR2PSB0eXBlX3ZhciAoaWQ9IElEIChpdj0gaW5pdGlhbF92YWx1ZSApPyApPworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTI2NTo0OiAobT0gbW9kaWZpZXJfcGFyYW0gKT8KKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDYxPTI7CisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBBU1NJR05fUkVGOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgQkFORDoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIExURToKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDE2NDoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDE2NjoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDI0MzoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDI2MjoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDI4MjoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDI5NToKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDI5ODoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDMwNToKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDMxODoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDMzNToKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDM0MToKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDM2MToKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDM2NDoKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgICAgIAkJYWx0NjE9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQ2MSkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMjY1OjY6IG09IG1vZGlmaWVyX3BhcmFtCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19tb2RpZmllcl9wYXJhbV9pbl9kZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbTI2MTcpOworICAgICAgICAJICAgICAgICAJICAgICAgICBtPW1vZGlmaWVyX3BhcmFtKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICBtZGZyLm92ZXJyaWRlX2lmZGVmKCBtCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgKTsgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV190eXBlX3Zhcl9pbl9kZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbTI2MjkpOworICAgICAgICAJICAgICAgICB0dj10eXBlX3ZhcihjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgcGFyYW1UID0gdHYKKyAgICAgICAgCSAgICAgICAgICAgIDsgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEyNjc6NDogKGlkPSBJRCAoaXY9IGluaXRpYWxfdmFsdWUgKT8gKT8KKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDYzPTI7CisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgICAgIAkJYWx0NjM9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQ2MykKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMjY3OjY6IGlkPSBJRCAoaXY9IGluaXRpYWxfdmFsdWUgKT8KKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlkID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoSUQsICZGT0xMT1dfSURfaW5fZGVmX21hY2hpbmVfdmFyaWFibGVfcmV0dXJuX2F0b20yNjQwKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX21hY2hpbmVfdmFyaWFibGVfcmV0dXJuX2F0b21FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIHBhcmFtSUQgPSBTVFIoKGlkLT5nZXRUZXh0KGlkKSktPmNoYXJzKTsgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEyNjg6NjogKGl2PSBpbml0aWFsX3ZhbHVlICk/CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQ2Mj0yOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgQVNTSUdOOgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgTFBBUkVOOgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgCQlhbHQ2Mj0xOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDYyKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEyNjg6ODogaXY9IGluaXRpYWxfdmFsdWUKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2luaXRpYWxfdmFsdWVfaW5fZGVmX21hY2hpbmVfdmFyaWFibGVfcmV0dXJuX2F0b20yNjU3KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaXY9aW5pdGlhbF92YWx1ZShjdHgpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbUV4OworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgdmFsdWUgPSBpdgorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgOyAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKworICAgICAgICAJICAgICAgICAgICAgCQlwYXJhbURlY2wuc2F2ZU93bmVkVmFyaWFibGUoIHZhcmlhYmxlID0KKyAgICAgICAgCSAgICAgICAgICAgIAkJCQluZXcgc2VwOjpWYXJpYWJsZShtYWNoaW5lLCBtZGZyLCBwYXJhbVQsIHBhcmFtSUQsIHZhbHVlKSApOworICAgICAgICAJICAgICAgICAgICAgCSAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAyOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEyNzU6NDogJ2JpbmQ6JyAoICggdHlwZV92YXIgQ09MT04gKT0+dHY9IHR5cGVfdmFyIENPTE9OIGU9IGV4cHJlc3Npb24gfHZpZD0gcXVhbGlmaWVkTmFtZUlEICkKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMjQ0LCAmRk9MTE9XXzI0NF9pbl9kZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbTI2ODApOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTI3Njo0OiAoICggdHlwZV92YXIgQ09MT04gKT0+dHY9IHR5cGVfdmFyIENPTE9OIGU9IGV4cHJlc3Npb24gfHZpZD0gcXVhbGlmaWVkTmFtZUlEICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDY0PTI7CisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgaW50IExBNjRfMCA9IExBKDEpOworICAgICAgICAJICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMjZfZm1sKGN0eCkpICYmICgoKExBNjRfMCA+PSAyNDUpICYmIChMQTY0XzAgPD0gMjQ2KSkpKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0NjQ9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMTI2X2ZtbChjdHgpKSAmJiAoKChMQTY0XzAgPj0gMzA5KSAmJiAoTEE2NF8wIDw9IDMxMCkpKSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDY0PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDEyNl9mbWwoY3R4KSkgJiYgKCgoTEE2NF8wID49IDQwMSkgJiYgKExBNjRfMCA8PSA0MDIpKSkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQ2ND0xOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQxMjZfZm1sKGN0eCkpICYmICgoKExBNjRfMCA+PSAzNDUpICYmIChMQTY0XzAgPD0gMzQ2KSkpKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0NjQ9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMTI2X2ZtbChjdHgpKSAmJiAoKChMQTY0XzAgPj0gMzU3KSAmJiAoTEE2NF8wIDw9IDM1OCkpKSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDY0PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDEyNl9mbWwoY3R4KSkgJiYgKCgoTEE2NF8wID49IDQwNykgJiYgKExBNjRfMCA8PSA0MDgpKSkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQ2ND0xOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQxMjZfZm1sKGN0eCkpICYmIChMQTY0XzAgPT0gMjgzKSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDY0PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDEyNl9mbWwoY3R4KSkgJiYgKExBNjRfMCA9PSA0MDApKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0NjQ9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMTI2X2ZtbChjdHgpKSAmJiAoTEE2NF8wID09IDI3MCkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQ2ND0xOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQxMjZfZm1sKGN0eCkpICYmIChMQTY0XzAgPT0gMzk5KSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDY0PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDEyNl9mbWwoY3R4KSkgJiYgKExBNjRfMCA9PSAzNjApKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0NjQ9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMTI2X2ZtbChjdHgpKSAmJiAoTEE2NF8wID09IDQwOSkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQ2ND0xOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQxMjZfZm1sKGN0eCkpICYmIChMQTY0XzAgPT0gMjU5KSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDY0PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDEyNl9mbWwoY3R4KSkgJiYgKExBNjRfMCA9PSAzOTIpKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0NjQ9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMTI2X2ZtbChjdHgpKSAmJiAoTEE2NF8wID09IDI2NCkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQ2ND0xOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQxMjZfZm1sKGN0eCkpICYmIChMQTY0XzAgPT0gMjcxKSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDY0PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDEyNl9mbWwoY3R4KSkgJiYgKExBNjRfMCA9PSAyNTQpKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0NjQ9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMTI2X2ZtbChjdHgpKSAmJiAoTEE2NF8wID09IDI1NSkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQ2ND0xOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQxMjZfZm1sKGN0eCkpICYmIChMQTY0XzAgPT0gMzg3KSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDY0PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDEyNl9mbWwoY3R4KSkgJiYgKExBNjRfMCA9PSAzMzMpKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0NjQ9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMTI2X2ZtbChjdHgpKSAmJiAoTEE2NF8wID09IDI0MikpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQ2ND0xOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQxMjZfZm1sKGN0eCkpICYmIChMQTY0XzAgPT0gMzQ0KSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDY0PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDEyNl9mbWwoY3R4KSkgJiYgKExBNjRfMCA9PSAyNDkpKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0NjQ9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMTI2X2ZtbChjdHgpKSAmJiAoTEE2NF8wID09IDMyMCkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQ2ND0xOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQxMjZfZm1sKGN0eCkpICYmIChMQTY0XzAgPT0gMzc0KSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDY0PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDEyNl9mbWwoY3R4KSkgJiYgKExBNjRfMCA9PSAyNjEpKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0NjQ9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMTI2X2ZtbChjdHgpKSAmJiAoTEE2NF8wID09IDMxNykpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQ2ND0xOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQxMjZfZm1sKGN0eCkpICYmIChMQTY0XzAgPT0gNDA1KSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDY0PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE2NF8wID09IElEKSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTY0XzI5ID0gTEEoMik7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTI2X2ZtbChjdHgpKSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ2ND0xOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChBTlRMUjNfVFJVRSkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0NjQ9MjsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDY0OworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMjk7CisKKworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tRXg7CisKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQxMjZfZm1sKGN0eCkpICYmIChMQTY0XzAgPT0gMjQxKSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDY0PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDEyNl9mbWwoY3R4KSkgJiYgKExBNjRfMCA9PSA0MTIpKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0NjQ9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMTI2X2ZtbChjdHgpKSAmJiAoTEE2NF8wID09IDM3MCkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQ2ND0xOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQxMjZfZm1sKGN0eCkpICYmIChMQTY0XzAgPT0gMzE2KSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDY0PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDEyNl9mbWwoY3R4KSkgJiYgKExBNjRfMCA9PSAyODEpKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0NjQ9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMTI2X2ZtbChjdHgpKSAmJiAoTEE2NF8wID09IDMxNSkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQ2ND0xOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQxMjZfZm1sKGN0eCkpICYmIChMQTY0XzAgPT0gMzI1KSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDY0PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDEyNl9mbWwoY3R4KSkgJiYgKExBNjRfMCA9PSAzMjYpKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0NjQ9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMTI2X2ZtbChjdHgpKSAmJiAoTEE2NF8wID09IDM3MykpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQ2ND0xOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQxMjZfZm1sKGN0eCkpICYmIChMQTY0XzAgPT0gMzI5KSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDY0PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDEyNl9mbWwoY3R4KSkgJiYgKExBNjRfMCA9PSAzMTEpKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0NjQ9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDY0OworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbUV4OworCisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQ2NCkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMjc2OjY6ICggdHlwZV92YXIgQ09MT04gKT0+dHY9IHR5cGVfdmFyIENPTE9OIGU9IGV4cHJlc3Npb24KKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3R5cGVfdmFyX2luX2RlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tMjcwMSk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHR2PXR5cGVfdmFyKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKENPTE9OLCAmRk9MTE9XX0NPTE9OX2luX2RlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tMjcwMyk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICBwYXJhbVQgPSB0dgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgOyAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9kZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbTI3MTQpOworICAgICAgICAJICAgICAgICAJICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX21hY2hpbmVfdmFyaWFibGVfcmV0dXJuX2F0b21FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIHZhbHVlID0gZQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgOyAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAljYXNlIDI6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTI3ODo2OiB2aWQ9IHF1YWxpZmllZE5hbWVJRAorICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX2RlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tMjcyNSk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHZpZD1xdWFsaWZpZWROYW1lSUQoY3R4KTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX21hY2hpbmVfdmFyaWFibGVfcmV0dXJuX2F0b21FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAJdmFsdWUgPSBzZXA6OlBhcnNlclV0aWw6OmdldFZhcmlhYmxlKHZpZC5zCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAsIHZpZC5uYgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgIAlpZiggdmFsdWUudmFsaWQoKSApIHsgcGFyYW1UID0gdmFsdWUudG9fcHRyPCBzZXA6OlZhcmlhYmxlID4oKS0+Z2V0VHlwZSgpOyB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworCisgICAgICAgIAkgICAgICAgICAgICAJCXBhcmFtSUQgPSBzZXA6Ok9TUygpIDw8ICcjJyA8PCBvZmZzZXQ7CisKKyAgICAgICAgCSAgICAgICAgICAgIAkJdmFyaWFibGUgPSBuZXcgc2VwOjpWYXJpYWJsZShtYWNoaW5lLAorICAgICAgICAJICAgICAgICAgICAgCQkJCW1kZnIuYWRkTmF0dXJlS2luZCggc2VwOjpNb2RpZmllcjo6TkFUVVJFX0JJTkRfS0lORCApLAorICAgICAgICAJICAgICAgICAgICAgCQkJCXBhcmFtVCwgcGFyYW1JRCwgdmFsdWUpOworCisgICAgICAgIAkgICAgICAgICAgICAJCXBhcmFtRGVjbC5zYXZlT3duZWRWYXJpYWJsZSggdmFyaWFibGUgKTsKKworICAgICAgICAJICAgICAgICAgICAgCQl2YXJpYWJsZS0+c2V0T2Zmc2V0KCBvZmZzZXQgKTsKKyAgICAgICAgCSAgICAgICAgICAgIAkgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlZGVmX21hY2hpbmVfdmFyaWFibGVfcmV0dXJuX2F0b21FeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVkZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbUV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMjgsIGRlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBkZWZfbWFjaGluZV92YXJpYWJsZV9yZXR1cm5fYXRvbSAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBkZWZfYm9keV9wcm9jZWR1cmUKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEyOTk6MTogZGVmX2JvZHlfcHJvY2VkdXJlWyBzZXA6Ok1hY2hpbmUgKiBwcm9jZWR1cmUgXSA6IExDVVJMWSAoICggZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0ICk9PiBkZWZfYm9keV9wcm9jZWR1cmVfc2VjdGlvblsgcHJvY2VkdXJlIF0gfCBkZWZfYm9keV9wcm9jZWR1cmVfc2ltcGxpZlsgcHJvY2VkdXJlIF0gKSBSQ1VSTFkgOworICovCitzdGF0aWMgdm9pZAorZGVmX2JvZHlfcHJvY2VkdXJlKHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBwcm9jZWR1cmUpCit7CisgICAgQU5UTFIzX1VJTlQzMiBkZWZfYm9keV9wcm9jZWR1cmVfU3RhcnRJbmRleDsKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBkZWZfYm9keV9wcm9jZWR1cmVfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMjkpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEzMDA6MjogKCBMQ1VSTFkgKCAoIGRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdCApPT4gZGVmX2JvZHlfcHJvY2VkdXJlX3NlY3Rpb25bIHByb2NlZHVyZSBdIHwgZGVmX2JvZHlfcHJvY2VkdXJlX3NpbXBsaWZbIHByb2NlZHVyZSBdICkgUkNVUkxZICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTMwMDo0OiBMQ1VSTFkgKCAoIGRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdCApPT4gZGVmX2JvZHlfcHJvY2VkdXJlX3NlY3Rpb25bIHByb2NlZHVyZSBdIHwgZGVmX2JvZHlfcHJvY2VkdXJlX3NpbXBsaWZbIHByb2NlZHVyZSBdICkgUkNVUkxZCisgICAgICAgIHsKKyAgICAgICAgICAgICBNQVRDSFQoTENVUkxZLCAmRk9MTE9XX0xDVVJMWV9pbl9kZWZfYm9keV9wcm9jZWR1cmUyNzU1KTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX2JvZHlfcHJvY2VkdXJlRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMzAxOjQ6ICggKCBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJlZGljYXQgKT0+IGRlZl9ib2R5X3Byb2NlZHVyZV9zZWN0aW9uWyBwcm9jZWR1cmUgXSB8IGRlZl9ib2R5X3Byb2NlZHVyZV9zaW1wbGlmWyBwcm9jZWR1cmUgXSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDY2PTI7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEE2Nl8wID0gTEEoMSk7CisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMjdfZm1sKGN0eCkpICYmIChMQTY2XzAgPT0gMTg4KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0NjY9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQxMjdfZm1sKGN0eCkpICYmIChMQTY2XzAgPT0gMTkyKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0NjY9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQxMjdfZm1sKGN0eCkpICYmICgoKExBNjZfMCA+PSAyMDkpICYmIChMQTY2XzAgPD0gMjEwKSkpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ2Nj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDEyN19mbWwoY3R4KSkgJiYgKExBNjZfMCA9PSAxOTYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ2Nj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDEyN19mbWwoY3R4KSkgJiYgKExBNjZfMCA9PSAxOTUpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ2Nj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDEyN19mbWwoY3R4KSkgJiYgKExBNjZfMCA9PSAyMDcpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ2Nj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDEyN19mbWwoY3R4KSkgJiYgKCgoTEE2Nl8wID49IDIxOSkgJiYgKExBNjZfMCA8PSAyMjApKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDY2PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMTI3X2ZtbChjdHgpKSAmJiAoTEE2Nl8wID09IDE3OCB8fCBMQTY2XzAgPT0gMjEzKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0NjY9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQxMjdfZm1sKGN0eCkpICYmIChMQTY2XzAgPT0gMjE2KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0NjY9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQxMjdfZm1sKGN0eCkpICYmIChMQTY2XzAgPT0gMjE0KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0NjY9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQxMjdfZm1sKGN0eCkpICYmIChMQTY2XzAgPT0gMjExKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0NjY9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQxMjdfZm1sKGN0eCkpICYmIChMQTY2XzAgPT0gMjIyKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0NjY9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQxMjdfZm1sKGN0eCkpICYmIChMQTY2XzAgPT0gMjAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0NjY9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQxMjdfZm1sKGN0eCkpICYmIChMQTY2XzAgPT0gMjEyKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0NjY9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQxMjdfZm1sKGN0eCkpICYmIChMQTY2XzAgPT0gMTc0IHx8IExBNjZfMCA9PSAxODMgfHwgTEE2Nl8wID09IDIwMCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDY2PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMTI3X2ZtbChjdHgpKSAmJiAoTEE2Nl8wID09IDIwMykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDY2PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMTI3X2ZtbChjdHgpKSAmJiAoTEE2Nl8wID09IDIxNSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDY2PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMTI3X2ZtbChjdHgpKSAmJiAoTEE2Nl8wID09IDE5NykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDY2PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMTI3X2ZtbChjdHgpKSAmJiAoTEE2Nl8wID09IDE3MSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDY2PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMTI3X2ZtbChjdHgpKSAmJiAoTEE2Nl8wID09IDIyNykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDY2PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMTI3X2ZtbChjdHgpKSAmJiAoTEE2Nl8wID09IDIwMikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDY2PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMTI3X2ZtbChjdHgpKSAmJiAoTEE2Nl8wID09IDIwNCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDY2PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMTI3X2ZtbChjdHgpKSAmJiAoTEE2Nl8wID09IDE3MiB8fCBMQTY2XzAgPT0gMTk4KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0NjY9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQxMjdfZm1sKGN0eCkpICYmIChMQTY2XzAgPT0gUkNVUkxZKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0NjY9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKCgoTEE2Nl8wID49IDE0NCkgJiYgKExBNjZfMCA8PSAxNDUpKSB8fCAoKExBNjZfMCA+PSAxNDcpICYmIChMQTY2XzAgPD0gMTUwKSkgfHwgTEE2Nl8wID09IDE1MyB8fCBMQTY2XzAgPT0gMTcwIHx8IExBNjZfMCA9PSAxNzcgfHwgTEE2Nl8wID09IDE3OSB8fCBMQTY2XzAgPT0gMTgyIHx8IExBNjZfMCA9PSAxODQgfHwgKChMQTY2XzAgPj0gMTg5KSAmJiAoTEE2Nl8wIDw9IDE5MSkpIHx8IExBNjZfMCA9PSAxOTQgfHwgTEE2Nl8wID09IDE5OSB8fCAoKExBNjZfMCA+PSAyMjMpICYmIChMQTY2XzAgPD0gMjI0KSkgfHwgTEE2Nl8wID09IDI0MyB8fCBMQTY2XzAgPT0gMjU5IHx8IExBNjZfMCA9PSAyNjIgfHwgTEE2Nl8wID09IDI3MiB8fCBMQTY2XzAgPT0gMjgyIHx8IExBNjZfMCA9PSAyOTggfHwgKChMQTY2XzAgPj0gMzA1KSAmJiAoTEE2Nl8wIDw9IDMwNikpIHx8IExBNjZfMCA9PSAzMTQgfHwgTEE2Nl8wID09IDMxOCB8fCBMQTY2XzAgPT0gMzIyIHx8IExBNjZfMCA9PSAzNDEgfHwgTEE2Nl8wID09IDM0OSB8fCBMQTY2XzAgPT0gMzUzIHx8IExBNjZfMCA9PSAzNTUgfHwgTEE2Nl8wID09IDM2MSB8fCBMQTY2XzAgPT0gMzY0IHx8ICgoTEE2Nl8wID49IDM3OCkgJiYgKExBNjZfMCA8PSAzODApKSB8fCBMQTY2XzAgPT0gMzkzIHx8IExBNjZfMCA9PSAzOTUgfHwgTEE2Nl8wID09IDQwNiB8fCAoKExBNjZfMCA+PSA0MTApICYmIChMQTY2XzAgPD0gNDExKSkgfHwgTEE2Nl8wID09IDQxNCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDY2PTI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA2NjsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfYm9keV9wcm9jZWR1cmVFeDsKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NjYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTMwMTo2OiAoIGRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdCApPT4gZGVmX2JvZHlfcHJvY2VkdXJlX3NlY3Rpb25bIHByb2NlZHVyZSBdCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlZl9ib2R5X3Byb2NlZHVyZV9zZWN0aW9uX2luX2RlZl9ib2R5X3Byb2NlZHVyZTI3NzUpOworICAgICAgICAgICAgCSAgICAgICAgZGVmX2JvZHlfcHJvY2VkdXJlX3NlY3Rpb24oY3R4LCBwcm9jZWR1cmUpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2JvZHlfcHJvY2VkdXJlRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAyOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMzA0OjY6IGRlZl9ib2R5X3Byb2NlZHVyZV9zaW1wbGlmWyBwcm9jZWR1cmUgXQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfYm9keV9wcm9jZWR1cmVfc2ltcGxpZl9pbl9kZWZfYm9keV9wcm9jZWR1cmUyNzg0KTsKKyAgICAgICAgICAgIAkgICAgICAgIGRlZl9ib2R5X3Byb2NlZHVyZV9zaW1wbGlmKGN0eCwgcHJvY2VkdXJlKTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9ib2R5X3Byb2NlZHVyZUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgTUFUQ0hUKFJDVVJMWSwgJkZPTExPV19SQ1VSTFlfaW5fZGVmX2JvZHlfcHJvY2VkdXJlMjc5NSk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9ib2R5X3Byb2NlZHVyZUV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVkZWZfYm9keV9wcm9jZWR1cmVFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVkZWZfYm9keV9wcm9jZWR1cmVFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDI5LCBkZWZfYm9keV9wcm9jZWR1cmVfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGRlZl9ib2R5X3Byb2NlZHVyZSAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBkZWZfYm9keV9wcm9jZWR1cmVfc2VjdGlvbgorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTMwOToxOiBkZWZfYm9keV9wcm9jZWR1cmVfc2VjdGlvblsgc2VwOjpNYWNoaW5lICogcHJvY2VkdXJlIF0gOiAoIHNlY3Rpb25faGVhZGVyWyBwcm9jZWR1cmUgXSApPyAoIHNlY3Rpb25faW1wb3J0WyBwcm9jZWR1cmUgXSApPyAoIHNlY3Rpb25fcGFyYW1ldGVyWyBwcm9jZWR1cmUgXSApKiAoIHNlY3Rpb25fcHJvcGVydHlbIHByb2NlZHVyZSBdICkqICggc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlWyBwcm9jZWR1cmUgXSApKiAoIHNlY3Rpb25fYmVoYXZpb3JbIHByb2NlZHVyZSBdIHwgc2VjdGlvbl9zdGF0ZW1hY2hpbmVbIHByb2NlZHVyZSBdICk/ICggc2VjdGlvbl9tb2RlbF9vZl9jb21wdXRhdGlvblsgcHJvY2VkdXJlIF0gfCBzZWN0aW9uX21vZGVsX29mX2V4ZWN1dGlvblsgcHJvY2VkdXJlIF0gfCBzZWN0aW9uX21vZGVsX29mX2ludGVyYWN0aW9uWyBwcm9jZWR1cmUgXSApKiA7CisgKi8KK3N0YXRpYyB2b2lkCitkZWZfYm9keV9wcm9jZWR1cmVfc2VjdGlvbihwZm1sUGFyc2VyIGN0eCwgc2VwOjpNYWNoaW5lICogcHJvY2VkdXJlKQoreworICAgIEFOVExSM19VSU5UMzIgZGVmX2JvZHlfcHJvY2VkdXJlX3NlY3Rpb25fU3RhcnRJbmRleDsKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBkZWZfYm9keV9wcm9jZWR1cmVfc2VjdGlvbl9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgzMCkpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTMxMDoyOiAoICggc2VjdGlvbl9oZWFkZXJbIHByb2NlZHVyZSBdICk/ICggc2VjdGlvbl9pbXBvcnRbIHByb2NlZHVyZSBdICk/ICggc2VjdGlvbl9wYXJhbWV0ZXJbIHByb2NlZHVyZSBdICkqICggc2VjdGlvbl9wcm9wZXJ0eVsgcHJvY2VkdXJlIF0gKSogKCBzZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmVbIHByb2NlZHVyZSBdICkqICggc2VjdGlvbl9iZWhhdmlvclsgcHJvY2VkdXJlIF0gfCBzZWN0aW9uX3N0YXRlbWFjaGluZVsgcHJvY2VkdXJlIF0gKT8gKCBzZWN0aW9uX21vZGVsX29mX2NvbXB1dGF0aW9uWyBwcm9jZWR1cmUgXSB8IHNlY3Rpb25fbW9kZWxfb2ZfZXhlY3V0aW9uWyBwcm9jZWR1cmUgXSB8IHNlY3Rpb25fbW9kZWxfb2ZfaW50ZXJhY3Rpb25bIHByb2NlZHVyZSBdICkqICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTMxMDo0OiAoIHNlY3Rpb25faGVhZGVyWyBwcm9jZWR1cmUgXSApPyAoIHNlY3Rpb25faW1wb3J0WyBwcm9jZWR1cmUgXSApPyAoIHNlY3Rpb25fcGFyYW1ldGVyWyBwcm9jZWR1cmUgXSApKiAoIHNlY3Rpb25fcHJvcGVydHlbIHByb2NlZHVyZSBdICkqICggc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlWyBwcm9jZWR1cmUgXSApKiAoIHNlY3Rpb25fYmVoYXZpb3JbIHByb2NlZHVyZSBdIHwgc2VjdGlvbl9zdGF0ZW1hY2hpbmVbIHByb2NlZHVyZSBdICk/ICggc2VjdGlvbl9tb2RlbF9vZl9jb21wdXRhdGlvblsgcHJvY2VkdXJlIF0gfCBzZWN0aW9uX21vZGVsX29mX2V4ZWN1dGlvblsgcHJvY2VkdXJlIF0gfCBzZWN0aW9uX21vZGVsX29mX2ludGVyYWN0aW9uWyBwcm9jZWR1cmUgXSApKgorICAgICAgICB7CisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMzEwOjQ6ICggc2VjdGlvbl9oZWFkZXJbIHByb2NlZHVyZSBdICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDY3PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxODg6CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJYWx0Njc9MTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NjcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTMxMDo0OiBzZWN0aW9uX2hlYWRlclsgcHJvY2VkdXJlIF0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfc2VjdGlvbl9oZWFkZXJfaW5fZGVmX2JvZHlfcHJvY2VkdXJlX3NlY3Rpb24yODA4KTsKKyAgICAgICAgICAgIAkgICAgICAgIHNlY3Rpb25faGVhZGVyKGN0eCwgcHJvY2VkdXJlKTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9ib2R5X3Byb2NlZHVyZV9zZWN0aW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEzMTE6NDogKCBzZWN0aW9uX2ltcG9ydFsgcHJvY2VkdXJlIF0gKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0Njg9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDE5MjoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQ2OD0xOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ2OCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMzExOjQ6IHNlY3Rpb25faW1wb3J0WyBwcm9jZWR1cmUgXQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19zZWN0aW9uX2ltcG9ydF9pbl9kZWZfYm9keV9wcm9jZWR1cmVfc2VjdGlvbjI4MTYpOworICAgICAgICAgICAgCSAgICAgICAgc2VjdGlvbl9pbXBvcnQoY3R4LCBwcm9jZWR1cmUpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2JvZHlfcHJvY2VkdXJlX3NlY3Rpb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTMxMzo0OiAoIHNlY3Rpb25fcGFyYW1ldGVyWyBwcm9jZWR1cmUgXSApKgorCisgICAgICAgICAgICBmb3IgKDs7KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQ2OT0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAxOTU6CisgICAgICAgICAgICAgICAgY2FzZSAxOTY6CisgICAgICAgICAgICAgICAgY2FzZSAyMDc6CisgICAgICAgICAgICAgICAgY2FzZSAyMDk6CisgICAgICAgICAgICAgICAgY2FzZSAyMTA6CisgICAgICAgICAgICAgICAgY2FzZSAyMTk6CisgICAgICAgICAgICAgICAgY2FzZSAyMjA6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDY5PTE7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDY5KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEzMTM6Njogc2VjdGlvbl9wYXJhbWV0ZXJbIHByb2NlZHVyZSBdCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3NlY3Rpb25fcGFyYW1ldGVyX2luX2RlZl9ib2R5X3Byb2NlZHVyZV9zZWN0aW9uMjgyNyk7CisgICAgICAgICAgICAJICAgICAgICBzZWN0aW9uX3BhcmFtZXRlcihjdHgsIHByb2NlZHVyZSk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfYm9keV9wcm9jZWR1cmVfc2VjdGlvbkV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdDoKKyAgICAgICAgICAgIAkgICAgZ290byBsb29wNjk7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb29wNjk6IDsgLyogSnVtcCBvdXQgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMzE1OjQ6ICggc2VjdGlvbl9wcm9wZXJ0eVsgcHJvY2VkdXJlIF0gKSoKKworICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0NzA9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgMTc4OgorICAgICAgICAgICAgICAgIGNhc2UgMjExOgorICAgICAgICAgICAgICAgIGNhc2UgMjEzOgorICAgICAgICAgICAgICAgIGNhc2UgMjE0OgorICAgICAgICAgICAgICAgIGNhc2UgMjE2OgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQ3MD0xOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ3MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMzE1OjY6IHNlY3Rpb25fcHJvcGVydHlbIHByb2NlZHVyZSBdCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3NlY3Rpb25fcHJvcGVydHlfaW5fZGVmX2JvZHlfcHJvY2VkdXJlX3NlY3Rpb24yODM5KTsKKyAgICAgICAgICAgIAkgICAgICAgIHNlY3Rpb25fcHJvcGVydHkoY3R4LCBwcm9jZWR1cmUpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2JvZHlfcHJvY2VkdXJlX3NlY3Rpb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQ6CisgICAgICAgICAgICAJICAgIGdvdG8gbG9vcDcwOwkvKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgKi8KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9vcDcwOiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTMxNzo0OiAoIHNlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZVsgcHJvY2VkdXJlIF0gKSoKKworICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0NzE9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgMTc0OgorICAgICAgICAgICAgICAgIGNhc2UgMTgzOgorICAgICAgICAgICAgICAgIGNhc2UgMTk3OgorICAgICAgICAgICAgICAgIGNhc2UgMjAwOgorICAgICAgICAgICAgICAgIGNhc2UgMjAxOgorICAgICAgICAgICAgICAgIGNhc2UgMjAzOgorICAgICAgICAgICAgICAgIGNhc2UgMjEyOgorICAgICAgICAgICAgICAgIGNhc2UgMjE1OgorICAgICAgICAgICAgICAgIGNhc2UgMjIyOgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQ3MT0xOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ3MSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMzE3OjY6IHNlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZVsgcHJvY2VkdXJlIF0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlX2luX2RlZl9ib2R5X3Byb2NlZHVyZV9zZWN0aW9uMjg1Mik7CisgICAgICAgICAgICAJICAgICAgICBzZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmUoY3R4LCBwcm9jZWR1cmUpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2JvZHlfcHJvY2VkdXJlX3NlY3Rpb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQ6CisgICAgICAgICAgICAJICAgIGdvdG8gbG9vcDcxOwkvKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgKi8KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9vcDcxOiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTMxOTo0OiAoIHNlY3Rpb25fYmVoYXZpb3JbIHByb2NlZHVyZSBdIHwgc2VjdGlvbl9zdGF0ZW1hY2hpbmVbIHByb2NlZHVyZSBdICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDcyPTM7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzE6CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJYWx0NzI9MTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDIyNzoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQ3Mj0yOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ3MikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMzE5OjY6IHNlY3Rpb25fYmVoYXZpb3JbIHByb2NlZHVyZSBdCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3NlY3Rpb25fYmVoYXZpb3JfaW5fZGVmX2JvZHlfcHJvY2VkdXJlX3NlY3Rpb24yODY0KTsKKyAgICAgICAgICAgIAkgICAgICAgIHNlY3Rpb25fYmVoYXZpb3IoY3R4LCBwcm9jZWR1cmUpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2JvZHlfcHJvY2VkdXJlX3NlY3Rpb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDI6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEzMjA6Njogc2VjdGlvbl9zdGF0ZW1hY2hpbmVbIHByb2NlZHVyZSBdCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3NlY3Rpb25fc3RhdGVtYWNoaW5lX2luX2RlZl9ib2R5X3Byb2NlZHVyZV9zZWN0aW9uMjg3Mik7CisgICAgICAgICAgICAJICAgICAgICBzZWN0aW9uX3N0YXRlbWFjaGluZShjdHgsIHByb2NlZHVyZSk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfYm9keV9wcm9jZWR1cmVfc2VjdGlvbkV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMzIzOjQ6ICggc2VjdGlvbl9tb2RlbF9vZl9jb21wdXRhdGlvblsgcHJvY2VkdXJlIF0gfCBzZWN0aW9uX21vZGVsX29mX2V4ZWN1dGlvblsgcHJvY2VkdXJlIF0gfCBzZWN0aW9uX21vZGVsX29mX2ludGVyYWN0aW9uWyBwcm9jZWR1cmUgXSApKgorCisgICAgICAgICAgICBmb3IgKDs7KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQ3Mz00OworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAyMDI6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDczPTE7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyMDQ6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDczPTI7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxNzI6CisgICAgICAgICAgICAgICAgY2FzZSAxOTg6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDczPTM7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDczKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEzMjM6Njogc2VjdGlvbl9tb2RlbF9vZl9jb21wdXRhdGlvblsgcHJvY2VkdXJlIF0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfc2VjdGlvbl9tb2RlbF9vZl9jb21wdXRhdGlvbl9pbl9kZWZfYm9keV9wcm9jZWR1cmVfc2VjdGlvbjI4ODcpOworICAgICAgICAgICAgCSAgICAgICAgc2VjdGlvbl9tb2RlbF9vZl9jb21wdXRhdGlvbihjdHgsIHByb2NlZHVyZSk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfYm9keV9wcm9jZWR1cmVfc2VjdGlvbkV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTMyNDo2OiBzZWN0aW9uX21vZGVsX29mX2V4ZWN1dGlvblsgcHJvY2VkdXJlIF0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfc2VjdGlvbl9tb2RlbF9vZl9leGVjdXRpb25faW5fZGVmX2JvZHlfcHJvY2VkdXJlX3NlY3Rpb24yODk1KTsKKyAgICAgICAgICAgIAkgICAgICAgIHNlY3Rpb25fbW9kZWxfb2ZfZXhlY3V0aW9uKGN0eCwgcHJvY2VkdXJlKTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9ib2R5X3Byb2NlZHVyZV9zZWN0aW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAzOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMzI1OjY6IHNlY3Rpb25fbW9kZWxfb2ZfaW50ZXJhY3Rpb25bIHByb2NlZHVyZSBdCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3NlY3Rpb25fbW9kZWxfb2ZfaW50ZXJhY3Rpb25faW5fZGVmX2JvZHlfcHJvY2VkdXJlX3NlY3Rpb24yOTAzKTsKKyAgICAgICAgICAgIAkgICAgICAgIHNlY3Rpb25fbW9kZWxfb2ZfaW50ZXJhY3Rpb24oY3R4LCBwcm9jZWR1cmUpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2JvZHlfcHJvY2VkdXJlX3NlY3Rpb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQ6CisgICAgICAgICAgICAJICAgIGdvdG8gbG9vcDczOwkvKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgKi8KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9vcDczOiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVkZWZfYm9keV9wcm9jZWR1cmVfc2VjdGlvbkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZWRlZl9ib2R5X3Byb2NlZHVyZV9zZWN0aW9uRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgzMCwgZGVmX2JvZHlfcHJvY2VkdXJlX3NlY3Rpb25fU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGRlZl9ib2R5X3Byb2NlZHVyZV9zZWN0aW9uICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGRlZl9ib2R5X3Byb2NlZHVyZV9zaW1wbGlmCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMzMwOjE6IGRlZl9ib2R5X3Byb2NlZHVyZV9zaW1wbGlmWyBzZXA6Ok1hY2hpbmUgKiBwcm9jZWR1cmUgXSA6ICggKG09IG1vZGlmaWVyX2RlY2xhcmF0aW9uICk/ICggZGVjbF92YXJpYWJsZVsgcHJvY2VkdXJlLT5nZXRQcm9wZXJ0eVBhcnQoKSAsIG1kZnIgXSB8YWRzPSBhbnlfZGVmX3N0YXRlbWFjaGluZVsgcHJvY2VkdXJlICwgbWRmciAsIHNwY2ZyIF0gfCBkZWZfc3RhdGVfYWN0aXZpdHlbIHByb2NlZHVyZSBdICkgKSsgOworICovCitzdGF0aWMgdm9pZAorZGVmX2JvZHlfcHJvY2VkdXJlX3NpbXBsaWYocGZtbFBhcnNlciBjdHgsIHNlcDo6TWFjaGluZSAqIHByb2NlZHVyZSkKK3sKKyAgICBBTlRMUjNfVUlOVDMyIGRlZl9ib2R5X3Byb2NlZHVyZV9zaW1wbGlmX1N0YXJ0SW5kZXg7CisKKyAgICBzZXA6Ok1vZGlmaWVyIG07CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX20KKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX20gc2VwOjpNb2RpZmllcgorCisgICAgc2VwOjpNYWNoaW5lICogYWRzOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9hZHMKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2FkcyBzZXA6Ok1hY2hpbmUgKgorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGRlZl9ib2R5X3Byb2NlZHVyZV9zaW1wbGlmX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKworICAgIAkgc2VwOjpNb2RpZmllciBtZGZyOworCisgICAgCXNlcDo6U3BlY2lmaWVyIHNwY2ZyOworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgzMSkpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTMzNjoyOiAoICggKG09IG1vZGlmaWVyX2RlY2xhcmF0aW9uICk/ICggZGVjbF92YXJpYWJsZVsgcHJvY2VkdXJlLT5nZXRQcm9wZXJ0eVBhcnQoKSAsIG1kZnIgXSB8YWRzPSBhbnlfZGVmX3N0YXRlbWFjaGluZVsgcHJvY2VkdXJlICwgbWRmciAsIHNwY2ZyIF0gfCBkZWZfc3RhdGVfYWN0aXZpdHlbIHByb2NlZHVyZSBdICkgKSsgKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMzM2OjQ6ICggKG09IG1vZGlmaWVyX2RlY2xhcmF0aW9uICk/ICggZGVjbF92YXJpYWJsZVsgcHJvY2VkdXJlLT5nZXRQcm9wZXJ0eVBhcnQoKSAsIG1kZnIgXSB8YWRzPSBhbnlfZGVmX3N0YXRlbWFjaGluZVsgcHJvY2VkdXJlICwgbWRmciAsIHNwY2ZyIF0gfCBkZWZfc3RhdGVfYWN0aXZpdHlbIHByb2NlZHVyZSBdICkgKSsKKyAgICAgICAgeworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTMzNjo0OiAoIChtPSBtb2RpZmllcl9kZWNsYXJhdGlvbiApPyAoIGRlY2xfdmFyaWFibGVbIHByb2NlZHVyZS0+Z2V0UHJvcGVydHlQYXJ0KCkgLCBtZGZyIF0gfGFkcz0gYW55X2RlZl9zdGF0ZW1hY2hpbmVbIHByb2NlZHVyZSAsIG1kZnIgLCBzcGNmciBdIHwgZGVmX3N0YXRlX2FjdGl2aXR5WyBwcm9jZWR1cmUgXSApICkrCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGNudDc2PTA7CisKKyAgICAgICAgICAgICAgICBmb3IgKDs7KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGFsdDc2PTI7CisgICAgICAgICAgICAJc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAljYXNlIDE0NDoKKyAgICAgICAgICAgIAljYXNlIDE0NToKKyAgICAgICAgICAgIAljYXNlIDE0NzoKKyAgICAgICAgICAgIAljYXNlIDE0ODoKKyAgICAgICAgICAgIAljYXNlIDE0OToKKyAgICAgICAgICAgIAljYXNlIDE1MDoKKyAgICAgICAgICAgIAljYXNlIDE1MzoKKyAgICAgICAgICAgIAljYXNlIDE3MDoKKyAgICAgICAgICAgIAljYXNlIDE3NzoKKyAgICAgICAgICAgIAljYXNlIDE3OToKKyAgICAgICAgICAgIAljYXNlIDE4MjoKKyAgICAgICAgICAgIAljYXNlIDE4NDoKKyAgICAgICAgICAgIAljYXNlIDE4OToKKyAgICAgICAgICAgIAljYXNlIDE5MDoKKyAgICAgICAgICAgIAljYXNlIDE5MToKKyAgICAgICAgICAgIAljYXNlIDE5NDoKKyAgICAgICAgICAgIAljYXNlIDE5OToKKyAgICAgICAgICAgIAljYXNlIDIyMzoKKyAgICAgICAgICAgIAljYXNlIDIyNDoKKyAgICAgICAgICAgIAljYXNlIDI0MzoKKyAgICAgICAgICAgIAljYXNlIDI1OToKKyAgICAgICAgICAgIAljYXNlIDI2MjoKKyAgICAgICAgICAgIAljYXNlIDI3MjoKKyAgICAgICAgICAgIAljYXNlIDI4MjoKKyAgICAgICAgICAgIAljYXNlIDI5ODoKKyAgICAgICAgICAgIAljYXNlIDMwNToKKyAgICAgICAgICAgIAljYXNlIDMwNjoKKyAgICAgICAgICAgIAljYXNlIDMxNDoKKyAgICAgICAgICAgIAljYXNlIDMxODoKKyAgICAgICAgICAgIAljYXNlIDMyMjoKKyAgICAgICAgICAgIAljYXNlIDM0MToKKyAgICAgICAgICAgIAljYXNlIDM0OToKKyAgICAgICAgICAgIAljYXNlIDM1MzoKKyAgICAgICAgICAgIAljYXNlIDM1NToKKyAgICAgICAgICAgIAljYXNlIDM2MToKKyAgICAgICAgICAgIAljYXNlIDM2NDoKKyAgICAgICAgICAgIAljYXNlIDM3ODoKKyAgICAgICAgICAgIAljYXNlIDM3OToKKyAgICAgICAgICAgIAljYXNlIDM4MDoKKyAgICAgICAgICAgIAljYXNlIDM5MzoKKyAgICAgICAgICAgIAljYXNlIDM5NToKKyAgICAgICAgICAgIAljYXNlIDQwNjoKKyAgICAgICAgICAgIAljYXNlIDQxMDoKKyAgICAgICAgICAgIAljYXNlIDQxMToKKyAgICAgICAgICAgIAljYXNlIDQxNDoKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkJYWx0NzY9MTsKKyAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCX0KKworICAgICAgICAgICAgCXN3aXRjaCAoYWx0NzYpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICBjYXNlIDE6CisgICAgICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMzM2OjY6IChtPSBtb2RpZmllcl9kZWNsYXJhdGlvbiApPyAoIGRlY2xfdmFyaWFibGVbIHByb2NlZHVyZS0+Z2V0UHJvcGVydHlQYXJ0KCkgLCBtZGZyIF0gfGFkcz0gYW55X2RlZl9zdGF0ZW1hY2hpbmVbIHByb2NlZHVyZSAsIG1kZnIgLCBzcGNmciBdIHwgZGVmX3N0YXRlX2FjdGl2aXR5WyBwcm9jZWR1cmUgXSApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgIG1kZnIgPSBzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9VTkRFRklORURfTU9ESUZJRVI7IAorICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTMzODozOiAobT0gbW9kaWZpZXJfZGVjbGFyYXRpb24gKT8KKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGludCBhbHQ3ND0yOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGNhc2UgNDA2OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgCQkgICAgaW50IExBNzRfMSA9IExBKDIpOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgCQkgICAgaWYgKCAoc3lucHJlZDEzOF9mbWwoY3R4KSkpCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAJCSAgICAgICAgYWx0NzQ9MTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIAkJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQzOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgY2FzZSAyODI6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBjYXNlIDI5ODoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGNhc2UgMzA1OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgY2FzZSAzNDE6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBjYXNlIDM0OToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGNhc2UgMzU1OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgY2FzZSAzNjE6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBjYXNlIDM2NDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGNhc2UgMzgwOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgY2FzZSAzOTU6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBjYXNlIDQxNDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAJCWFsdDc0PTE7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ3NCkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMzM4OjU6IG09IG1vZGlmaWVyX2RlY2xhcmF0aW9uCisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfbW9kaWZpZXJfZGVjbGFyYXRpb25faW5fZGVmX2JvZHlfcHJvY2VkdXJlX3NpbXBsaWYyOTM5KTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICBtPW1vZGlmaWVyX2RlY2xhcmF0aW9uKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2JvZHlfcHJvY2VkdXJlX3NpbXBsaWZFeDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgICBtZGZyID0gbQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgICAgICA7IAorICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTM0MDo2OiAoIGRlY2xfdmFyaWFibGVbIHByb2NlZHVyZS0+Z2V0UHJvcGVydHlQYXJ0KCkgLCBtZGZyIF0gfGFkcz0gYW55X2RlZl9zdGF0ZW1hY2hpbmVbIHByb2NlZHVyZSAsIG1kZnIgLCBzcGNmciBdIHwgZGVmX3N0YXRlX2FjdGl2aXR5WyBwcm9jZWR1cmUgXSApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBpbnQgYWx0NzU9MzsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMjU5OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDI2MjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzMTg6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgNDEwOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDQxMToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCQlhbHQ3NT0xOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMTQ0OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDE0NToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAxNDc6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMTQ4OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDE0OToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAxNTA6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMTUzOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDI3MjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzMDY6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzE0OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDMyMjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzNTM6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzc4OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDM3OToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzOTM6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgNDA2OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJCWFsdDc1PTI7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAxNzA6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMTc3OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDE3OToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAxODI6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMTg0OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDE4OToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAxOTA6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMTkxOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDE5NDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAxOTk6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMjIzOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDIyNDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCQlhbHQ3NT0zOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA3NTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfYm9keV9wcm9jZWR1cmVfc2ltcGxpZkV4OworCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDc1KQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEzNDA6ODogZGVjbF92YXJpYWJsZVsgcHJvY2VkdXJlLT5nZXRQcm9wZXJ0eVBhcnQoKSAsIG1kZnIgXQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlY2xfdmFyaWFibGVfaW5fZGVmX2JvZHlfcHJvY2VkdXJlX3NpbXBsaWYyOTU1KTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICBkZWNsX3ZhcmlhYmxlKGN0eCwgcHJvY2VkdXJlLT5nZXRQcm9wZXJ0eVBhcnQoKSwgbWRmcik7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2JvZHlfcHJvY2VkdXJlX3NpbXBsaWZFeDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgICAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEzNDI6ODogYWRzPSBhbnlfZGVmX3N0YXRlbWFjaGluZVsgcHJvY2VkdXJlICwgbWRmciAsIHNwY2ZyIF0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19hbnlfZGVmX3N0YXRlbWFjaGluZV9pbl9kZWZfYm9keV9wcm9jZWR1cmVfc2ltcGxpZjI5NjgpOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIGFkcz1hbnlfZGVmX3N0YXRlbWFjaGluZShjdHgsIHByb2NlZHVyZSwgbWRmciwgc3BjZnIpOworCisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9ib2R5X3Byb2NlZHVyZV9zaW1wbGlmRXg7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgICAgIAljYXNlIDM6CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMzQ0Ojg6IGRlZl9zdGF0ZV9hY3Rpdml0eVsgcHJvY2VkdXJlIF0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfc3RhdGVfYWN0aXZpdHlfaW5fZGVmX2JvZHlfcHJvY2VkdXJlX3NpbXBsaWYyOTc5KTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICBkZWZfc3RhdGVfYWN0aXZpdHkoY3R4LCBwcm9jZWR1cmUpOworCisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9ib2R5X3Byb2NlZHVyZV9zaW1wbGlmRXg7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgIGRlZmF1bHQ6CisKKyAgICAgICAgICAgIAkJaWYgKCBjbnQ3NiA+PSAxICkKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkgICAgZ290byBsb29wNzY7CisgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgIAkJaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAJCSAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAJCSAgICByZXR1cm4gOworICAgICAgICAgICAgCQl9CisKKyAgICAgICAgICAgIAkJLyogbWlzbWF0Y2hlZFNldEV4KCkKKyAgICAgICAgICAgIAkJICovCisgICAgICAgICAgICAJCUNPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAJCUVYQ0VQVElPTi0+dHlwZSA9IEFOVExSM19FQVJMWV9FWElUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIAkJRVhDRVBUSU9OLT5uYW1lID0gKHZvaWQgKilBTlRMUjNfRUFSTFlfRVhJVF9OQU1FOworCisKKyAgICAgICAgICAgIAkJZ290byBydWxlZGVmX2JvZHlfcHJvY2VkdXJlX3NpbXBsaWZFeDsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJY250NzYrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9vcDc2OiA7CS8qIEp1bXAgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVkZWZfYm9keV9wcm9jZWR1cmVfc2ltcGxpZkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZWRlZl9ib2R5X3Byb2NlZHVyZV9zaW1wbGlmRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgzMSwgZGVmX2JvZHlfcHJvY2VkdXJlX3NpbXBsaWZfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGRlZl9ib2R5X3Byb2NlZHVyZV9zaW1wbGlmICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IHNlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZQorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTM1NDoxOiBzZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmVbIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lciBdIDogKCBzZWN0aW9uX3JvdXRpbmVbIGNvbnRhaW5lciBdIHwgc2VjdGlvbl9wcm9jZWR1cmVbIGNvbnRhaW5lciBdIHwgc2VjdGlvbl9jb21wb3NpdGVfZ2VuZXJpY1sgY29udGFpbmVyIF0gfCBzZWN0aW9uX21hY2hpbmVfbW9kZWxbIGNvbnRhaW5lciBdIHwgc2VjdGlvbl9tYWNoaW5lX3Byb3RvdHlwZVsgY29udGFpbmVyIF0gfCBzZWN0aW9uX21hY2hpbmVfaW5zdGFuY2VbIGNvbnRhaW5lciBdICk7CisgKi8KK3N0YXRpYyB2b2lkCitzZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmUocGZtbFBhcnNlciBjdHgsIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lcikKK3sKKyAgICBBTlRMUjNfVUlOVDMyIHNlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZV9TdGFydEluZGV4OworCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIHNlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZV9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgzMikpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEzNTU6MjogKCBzZWN0aW9uX3JvdXRpbmVbIGNvbnRhaW5lciBdIHwgc2VjdGlvbl9wcm9jZWR1cmVbIGNvbnRhaW5lciBdIHwgc2VjdGlvbl9jb21wb3NpdGVfZ2VuZXJpY1sgY29udGFpbmVyIF0gfCBzZWN0aW9uX21hY2hpbmVfbW9kZWxbIGNvbnRhaW5lciBdIHwgc2VjdGlvbl9tYWNoaW5lX3Byb3RvdHlwZVsgY29udGFpbmVyIF0gfCBzZWN0aW9uX21hY2hpbmVfaW5zdGFuY2VbIGNvbnRhaW5lciBdICkKKworICAgICAgICAgICAgQU5UTFIzX1VJTlQzMiBhbHQ3NzsKKworICAgICAgICAgICAgYWx0Nzc9NjsKKworICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAyMDE6CisgICAgICAgICAgICBjYXNlIDIyMjoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDc3PTE7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMTI6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ3Nz0yOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTc0OgorICAgICAgICAgICAgY2FzZSAxODM6CisgICAgICAgICAgICBjYXNlIDIwMDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDc3PTM7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMDM6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ3Nz00OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjE1OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0Nzc9NTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE5NzoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDc3PTY7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDc3OworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgZ290byBydWxlc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlRXg7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQ3NykKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMzU1OjQ6IHNlY3Rpb25fcm91dGluZVsgY29udGFpbmVyIF0KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3NlY3Rpb25fcm91dGluZV9pbl9zZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmUzMDExKTsKKyAgICAgICAgCSAgICAgICAgc2VjdGlvbl9yb3V0aW5lKGN0eCwgY29udGFpbmVyKTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMzU2OjQ6IHNlY3Rpb25fcHJvY2VkdXJlWyBjb250YWluZXIgXQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfc2VjdGlvbl9wcm9jZWR1cmVfaW5fc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlMzAxNyk7CisgICAgICAgIAkgICAgICAgIHNlY3Rpb25fcHJvY2VkdXJlKGN0eCwgY29udGFpbmVyKTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMzoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMzU4OjQ6IHNlY3Rpb25fY29tcG9zaXRlX2dlbmVyaWNbIGNvbnRhaW5lciBdCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19zZWN0aW9uX2NvbXBvc2l0ZV9nZW5lcmljX2luX3NlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZTMwMjQpOworICAgICAgICAJICAgICAgICBzZWN0aW9uX2NvbXBvc2l0ZV9nZW5lcmljKGN0eCwgY29udGFpbmVyKTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgNDoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMzU5OjQ6IHNlY3Rpb25fbWFjaGluZV9tb2RlbFsgY29udGFpbmVyIF0KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3NlY3Rpb25fbWFjaGluZV9tb2RlbF9pbl9zZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmUzMDMwKTsKKyAgICAgICAgCSAgICAgICAgc2VjdGlvbl9tYWNoaW5lX21vZGVsKGN0eCwgY29udGFpbmVyKTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgNToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMzYwOjQ6IHNlY3Rpb25fbWFjaGluZV9wcm90b3R5cGVbIGNvbnRhaW5lciBdCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19zZWN0aW9uX21hY2hpbmVfcHJvdG90eXBlX2luX3NlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZTMwMzYpOworICAgICAgICAJICAgICAgICBzZWN0aW9uX21hY2hpbmVfcHJvdG90eXBlKGN0eCwgY29udGFpbmVyKTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgNjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMzYxOjQ6IHNlY3Rpb25fbWFjaGluZV9pbnN0YW5jZVsgY29udGFpbmVyIF0KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3NlY3Rpb25fbWFjaGluZV9pbnN0YW5jZV9pbl9zZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmUzMDQyKTsKKyAgICAgICAgCSAgICAgICAgc2VjdGlvbl9tYWNoaW5lX2luc3RhbmNlKGN0eCwgY29udGFpbmVyKTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgzMiwgc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBzZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmUgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgc2VjdGlvbl9jb21wb3NpdGVfZ2VuZXJpYworICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTM2NDoxOiBzZWN0aW9uX2NvbXBvc2l0ZV9nZW5lcmljWyBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIgXSA6ICggJ0Bjb21wb3NpdGU6JyB8ICdAZXhlY3V0YWJsZTonIHwgJ0BtYWNoaW5lOicgKSAobT0gZXhlY3V0YWJsZV9tYWNoaW5lWyBjb250YWluZXIgXSApKiA7CisgKi8KK3N0YXRpYyB2b2lkCitzZWN0aW9uX2NvbXBvc2l0ZV9nZW5lcmljKHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIpCit7CisgICAgQU5UTFIzX1VJTlQzMiBzZWN0aW9uX2NvbXBvc2l0ZV9nZW5lcmljX1N0YXJ0SW5kZXg7CisKKyAgICBzZXA6Ok1hY2hpbmUgKiBtOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9tCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9tIHNlcDo6TWFjaGluZSAqCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgc2VjdGlvbl9jb21wb3NpdGVfZ2VuZXJpY19TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgzMykpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTM2NToyOiAoICggJ0Bjb21wb3NpdGU6JyB8ICdAZXhlY3V0YWJsZTonIHwgJ0BtYWNoaW5lOicgKSAobT0gZXhlY3V0YWJsZV9tYWNoaW5lWyBjb250YWluZXIgXSApKiApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEzNjU6NDogKCAnQGNvbXBvc2l0ZTonIHwgJ0BleGVjdXRhYmxlOicgfCAnQG1hY2hpbmU6JyApIChtPSBleGVjdXRhYmxlX21hY2hpbmVbIGNvbnRhaW5lciBdICkqCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggTEEoMSkgPT0gMTc0IHx8IExBKDEpID09IDE4MyB8fCBMQSgxKSA9PSAyMDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENPTlNVTUUoKTsKKyAgICAgICAgICAgICAgICBQRVJST1JSRUNPVkVSWT1BTlRMUjNfRkFMU0U7CisgICAgICAgICAgICAgICAgRkFJTEVERkxBRz1BTlRMUjNfRkFMU0U7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19NSVNNQVRDSEVEX1NFVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5uYW1lICAgICAgICAgPSAodm9pZCAqKUFOVExSM19NSVNNQVRDSEVEX1NFVF9OQU1FOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZXhwZWN0aW5nU2V0ID0gTlVMTDsKKworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXNlY3Rpb25fY29tcG9zaXRlX2dlbmVyaWNFeDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMzY2OjQ6IChtPSBleGVjdXRhYmxlX21hY2hpbmVbIGNvbnRhaW5lciBdICkqCisKKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDc4PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDE0NDoKKyAgICAgICAgICAgICAgICBjYXNlIDE0NToKKyAgICAgICAgICAgICAgICBjYXNlIDE0NzoKKyAgICAgICAgICAgICAgICBjYXNlIDE0ODoKKyAgICAgICAgICAgICAgICBjYXNlIDE0OToKKyAgICAgICAgICAgICAgICBjYXNlIDE1MDoKKyAgICAgICAgICAgICAgICBjYXNlIDE1MzoKKyAgICAgICAgICAgICAgICBjYXNlIDI3MjoKKyAgICAgICAgICAgICAgICBjYXNlIDMwNjoKKyAgICAgICAgICAgICAgICBjYXNlIDMwNzoKKyAgICAgICAgICAgICAgICBjYXNlIDMxNDoKKyAgICAgICAgICAgICAgICBjYXNlIDMxNzoKKyAgICAgICAgICAgICAgICBjYXNlIDMyMjoKKyAgICAgICAgICAgICAgICBjYXNlIDM1MzoKKyAgICAgICAgICAgICAgICBjYXNlIDM3ODoKKyAgICAgICAgICAgICAgICBjYXNlIDM3OToKKyAgICAgICAgICAgICAgICBjYXNlIDM5MzoKKyAgICAgICAgICAgICAgICBjYXNlIDQwNjoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0Nzg9MTsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NzgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTM2Njo2OiBtPSBleGVjdXRhYmxlX21hY2hpbmVbIGNvbnRhaW5lciBdCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4ZWN1dGFibGVfbWFjaGluZV9pbl9zZWN0aW9uX2NvbXBvc2l0ZV9nZW5lcmljMzA4MSk7CisgICAgICAgICAgICAJICAgICAgICBtPWV4ZWN1dGFibGVfbWFjaGluZShjdHgsIGNvbnRhaW5lcik7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzZWN0aW9uX2NvbXBvc2l0ZV9nZW5lcmljRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAgICAgCSAgICBnb3RvIGxvb3A3ODsJLyogYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvb3A3ODogOyAvKiBKdW1wIG91dCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworCisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlc2VjdGlvbl9jb21wb3NpdGVfZ2VuZXJpY0V4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZXNlY3Rpb25fY29tcG9zaXRlX2dlbmVyaWNFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDMzLCBzZWN0aW9uX2NvbXBvc2l0ZV9nZW5lcmljX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBzZWN0aW9uX2NvbXBvc2l0ZV9nZW5lcmljICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IHNlY3Rpb25fbWFjaGluZV9tb2RlbAorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTM3MDoxOiBzZWN0aW9uX21hY2hpbmVfbW9kZWxbIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lciBdIDogJ0Btb2RlbDonIChtPSBleGVjdXRhYmxlX21vZGVsX2RlZmluaXRvblsgY29udGFpbmVyICwgbWRmciAsIHNwY2ZyIF0gKSogOworICovCitzdGF0aWMgdm9pZAorc2VjdGlvbl9tYWNoaW5lX21vZGVsKHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIpCit7CisgICAgQU5UTFIzX1VJTlQzMiBzZWN0aW9uX21hY2hpbmVfbW9kZWxfU3RhcnRJbmRleDsKKworICAgIHNlcDo6TWFjaGluZSAqIG07CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX20KKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX20gc2VwOjpNYWNoaW5lICoKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBzZWN0aW9uX21hY2hpbmVfbW9kZWxfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworCisgICAgCXNlcDo6TW9kaWZpZXIgbWRmcjsKKworICAgIAlzZXA6OlNwZWNpZmllciBzcGNmciggc2VwOjpTcGVjaWZpZXI6OkRFU0lHTl9NT0RFTF9TUEVDSUZJRVIgKTsKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMzQpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEzNzY6MjogKCAnQG1vZGVsOicgKG09IGV4ZWN1dGFibGVfbW9kZWxfZGVmaW5pdG9uWyBjb250YWluZXIgLCBtZGZyICwgc3BjZnIgXSApKiApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEzNzY6NDogJ0Btb2RlbDonIChtPSBleGVjdXRhYmxlX21vZGVsX2RlZmluaXRvblsgY29udGFpbmVyICwgbWRmciAsIHNwY2ZyIF0gKSoKKyAgICAgICAgeworICAgICAgICAgICAgIE1BVENIVCgyMDMsICZGT0xMT1dfMjAzX2luX3NlY3Rpb25fbWFjaGluZV9tb2RlbDMxMDMpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVzZWN0aW9uX21hY2hpbmVfbW9kZWxFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEzNzc6NDogKG09IGV4ZWN1dGFibGVfbW9kZWxfZGVmaW5pdG9uWyBjb250YWluZXIgLCBtZGZyICwgc3BjZnIgXSApKgorCisgICAgICAgICAgICBmb3IgKDs7KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQ3OT0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAyNzI6CisgICAgICAgICAgICAgICAgY2FzZSAzMDY6CisgICAgICAgICAgICAgICAgY2FzZSAzMTQ6CisgICAgICAgICAgICAgICAgY2FzZSAzMTc6CisgICAgICAgICAgICAgICAgY2FzZSAzMjI6CisgICAgICAgICAgICAgICAgY2FzZSAzNTM6CisgICAgICAgICAgICAgICAgY2FzZSAzNzk6CisgICAgICAgICAgICAgICAgY2FzZSAzOTM6CisgICAgICAgICAgICAgICAgY2FzZSA0MDY6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDc5PTE7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDc5KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEzNzc6NjogbT0gZXhlY3V0YWJsZV9tb2RlbF9kZWZpbml0b25bIGNvbnRhaW5lciAsIG1kZnIgLCBzcGNmciBdCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4ZWN1dGFibGVfbW9kZWxfZGVmaW5pdG9uX2luX3NlY3Rpb25fbWFjaGluZV9tb2RlbDMxMTIpOworICAgICAgICAgICAgCSAgICAgICAgbT1leGVjdXRhYmxlX21vZGVsX2RlZmluaXRvbihjdHgsIGNvbnRhaW5lciwgbWRmciwgc3BjZnIpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc2VjdGlvbl9tYWNoaW5lX21vZGVsRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAgICAgCSAgICBnb3RvIGxvb3A3OTsJLyogYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvb3A3OTogOyAvKiBKdW1wIG91dCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworCisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlc2VjdGlvbl9tYWNoaW5lX21vZGVsRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlc2VjdGlvbl9tYWNoaW5lX21vZGVsRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgzNCwgc2VjdGlvbl9tYWNoaW5lX21vZGVsX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBzZWN0aW9uX21hY2hpbmVfbW9kZWwgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgc2VjdGlvbl9tYWNoaW5lX3Byb3RvdHlwZQorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTM4MToxOiBzZWN0aW9uX21hY2hpbmVfcHJvdG90eXBlWyBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIgXSA6ICdAcHJvdG90eXBlOicgKG09IGV4ZWN1dGFibGVfbW9kZWxfZGVmaW5pdG9uWyBjb250YWluZXIgLCBtZGZyICwgc3BjZnIgXSApKiA7CisgKi8KK3N0YXRpYyB2b2lkCitzZWN0aW9uX21hY2hpbmVfcHJvdG90eXBlKHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIpCit7CisgICAgQU5UTFIzX1VJTlQzMiBzZWN0aW9uX21hY2hpbmVfcHJvdG90eXBlX1N0YXJ0SW5kZXg7CisKKyAgICBzZXA6Ok1hY2hpbmUgKiBtOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9tCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9tIHNlcDo6TWFjaGluZSAqCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgc2VjdGlvbl9tYWNoaW5lX3Byb3RvdHlwZV9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisKKyAgICAJc2VwOjpNb2RpZmllciBtZGZyOworCisgICAgCXNlcDo6U3BlY2lmaWVyIHNwY2ZyKCBzZXA6OlNwZWNpZmllcjo6REVTSUdOX1BST1RPVFlQRV9TVEFUSUNfU1BFQ0lGSUVSICk7CisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDM1KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMzg3OjI6ICggJ0Bwcm90b3R5cGU6JyAobT0gZXhlY3V0YWJsZV9tb2RlbF9kZWZpbml0b25bIGNvbnRhaW5lciAsIG1kZnIgLCBzcGNmciBdICkqICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTM4Nzo0OiAnQHByb3RvdHlwZTonIChtPSBleGVjdXRhYmxlX21vZGVsX2RlZmluaXRvblsgY29udGFpbmVyICwgbWRmciAsIHNwY2ZyIF0gKSoKKyAgICAgICAgeworICAgICAgICAgICAgIE1BVENIVCgyMTUsICZGT0xMT1dfMjE1X2luX3NlY3Rpb25fbWFjaGluZV9wcm90b3R5cGUzMTM0KTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlc2VjdGlvbl9tYWNoaW5lX3Byb3RvdHlwZUV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTM4ODo0OiAobT0gZXhlY3V0YWJsZV9tb2RlbF9kZWZpbml0b25bIGNvbnRhaW5lciAsIG1kZnIgLCBzcGNmciBdICkqCisKKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDgwPTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDI3MjoKKyAgICAgICAgICAgICAgICBjYXNlIDMwNjoKKyAgICAgICAgICAgICAgICBjYXNlIDMxNDoKKyAgICAgICAgICAgICAgICBjYXNlIDMxNzoKKyAgICAgICAgICAgICAgICBjYXNlIDMyMjoKKyAgICAgICAgICAgICAgICBjYXNlIDM1MzoKKyAgICAgICAgICAgICAgICBjYXNlIDM3OToKKyAgICAgICAgICAgICAgICBjYXNlIDM5MzoKKyAgICAgICAgICAgICAgICBjYXNlIDQwNjoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0ODA9MTsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0ODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTM4ODo2OiBtPSBleGVjdXRhYmxlX21vZGVsX2RlZmluaXRvblsgY29udGFpbmVyICwgbWRmciAsIHNwY2ZyIF0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhlY3V0YWJsZV9tb2RlbF9kZWZpbml0b25faW5fc2VjdGlvbl9tYWNoaW5lX3Byb3RvdHlwZTMxNDMpOworICAgICAgICAgICAgCSAgICAgICAgbT1leGVjdXRhYmxlX21vZGVsX2RlZmluaXRvbihjdHgsIGNvbnRhaW5lciwgbWRmciwgc3BjZnIpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc2VjdGlvbl9tYWNoaW5lX3Byb3RvdHlwZUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdDoKKyAgICAgICAgICAgIAkgICAgZ290byBsb29wODA7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb29wODA6IDsgLyogSnVtcCBvdXQgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKworCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZXNlY3Rpb25fbWFjaGluZV9wcm90b3R5cGVFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVzZWN0aW9uX21hY2hpbmVfcHJvdG90eXBlRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgzNSwgc2VjdGlvbl9tYWNoaW5lX3Byb3RvdHlwZV9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgc2VjdGlvbl9tYWNoaW5lX3Byb3RvdHlwZSAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBzZWN0aW9uX21hY2hpbmVfaW5zdGFuY2UKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEzOTE6MTogc2VjdGlvbl9tYWNoaW5lX2luc3RhbmNlWyBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIgXSA6ICdAaW5zdGFuY2U6JyAoZWRpPSBleGVjdXRhYmxlX2luc3RhbmNlX2RlZmluaXRvblsgY29udGFpbmVyIF0gKSogOworICovCitzdGF0aWMgdm9pZAorc2VjdGlvbl9tYWNoaW5lX2luc3RhbmNlKHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIpCit7CisgICAgQU5UTFIzX1VJTlQzMiBzZWN0aW9uX21hY2hpbmVfaW5zdGFuY2VfU3RhcnRJbmRleDsKKworICAgIHNlcDo6TWFjaGluZSAqIGVkaTsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfZWRpCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9lZGkgc2VwOjpNYWNoaW5lICoKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBzZWN0aW9uX21hY2hpbmVfaW5zdGFuY2VfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMzYpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEzOTI6MjogKCAnQGluc3RhbmNlOicgKGVkaT0gZXhlY3V0YWJsZV9pbnN0YW5jZV9kZWZpbml0b25bIGNvbnRhaW5lciBdICkqICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTM5Mjo0OiAnQGluc3RhbmNlOicgKGVkaT0gZXhlY3V0YWJsZV9pbnN0YW5jZV9kZWZpbml0b25bIGNvbnRhaW5lciBdICkqCisgICAgICAgIHsKKyAgICAgICAgICAgICBNQVRDSFQoMTk3LCAmRk9MTE9XXzE5N19pbl9zZWN0aW9uX21hY2hpbmVfaW5zdGFuY2UzMTYwKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlc2VjdGlvbl9tYWNoaW5lX2luc3RhbmNlRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMzkzOjQ6IChlZGk9IGV4ZWN1dGFibGVfaW5zdGFuY2VfZGVmaW5pdG9uWyBjb250YWluZXIgXSApKgorCisgICAgICAgICAgICBmb3IgKDs7KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQ4MT0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAyNzI6CisgICAgICAgICAgICAgICAgY2FzZSAyODI6CisgICAgICAgICAgICAgICAgY2FzZSAzMDY6CisgICAgICAgICAgICAgICAgY2FzZSAzMDc6CisgICAgICAgICAgICAgICAgY2FzZSAzMTQ6CisgICAgICAgICAgICAgICAgY2FzZSAzNDk6CisgICAgICAgICAgICAgICAgY2FzZSAzNTI6CisgICAgICAgICAgICAgICAgY2FzZSAzNTU6CisgICAgICAgICAgICAgICAgY2FzZSAzOTM6CisgICAgICAgICAgICAgICAgY2FzZSA0MDY6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDgxPTE7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDgxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEzOTM6NjogZWRpPSBleGVjdXRhYmxlX2luc3RhbmNlX2RlZmluaXRvblsgY29udGFpbmVyIF0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhlY3V0YWJsZV9pbnN0YW5jZV9kZWZpbml0b25faW5fc2VjdGlvbl9tYWNoaW5lX2luc3RhbmNlMzE2OSk7CisgICAgICAgICAgICAJICAgICAgICBlZGk9ZXhlY3V0YWJsZV9pbnN0YW5jZV9kZWZpbml0b24oY3R4LCBjb250YWluZXIpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc2VjdGlvbl9tYWNoaW5lX2luc3RhbmNlRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAgICAgCSAgICBnb3RvIGxvb3A4MTsJLyogYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvb3A4MTogOyAvKiBKdW1wIG91dCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworCisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlc2VjdGlvbl9tYWNoaW5lX2luc3RhbmNlRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlc2VjdGlvbl9tYWNoaW5lX2luc3RhbmNlRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgzNiwgc2VjdGlvbl9tYWNoaW5lX2luc3RhbmNlX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBzZWN0aW9uX21hY2hpbmVfaW5zdGFuY2UgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgZXhlY3V0YWJsZV9tYWNoaW5lCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMzk3OjE6IGV4ZWN1dGFibGVfbWFjaGluZVsgc2VwOjpNYWNoaW5lICogY29udGFpbmVyIF0gcmV0dXJucyBbIHNlcDo6TWFjaGluZSAqIG1hY2hpbmUgXSA6IChtcz0gZXhlY3V0YWJsZV9tb2RpZmllcl9zcGVjaWZpZXIgKT8gKGRtPSBkZWZfbWFjaGluZVsgY29udGFpbmVyICwgbWRmciAsIHNwY2ZyIF0gfGFkcz0gYW55X2RlZl9zdGF0ZW1hY2hpbmVbIGNvbnRhaW5lciAsIG1kZnIgLCBzcGNmciBdIHxlbWk9IGRlY2xfaW5zdGFuY2VbIGNvbnRhaW5lciAsIG1kZnIgLCBzcGNmciBdICkgOworICovCitzdGF0aWMgc2VwOjpNYWNoaW5lICoKK2V4ZWN1dGFibGVfbWFjaGluZShwZm1sUGFyc2VyIGN0eCwgc2VwOjpNYWNoaW5lICogY29udGFpbmVyKQoreworICAgIHNlcDo6TWFjaGluZSAqIG1hY2hpbmU7CisKKyAgICBBTlRMUjNfVUlOVDMyIGV4ZWN1dGFibGVfbWFjaGluZV9TdGFydEluZGV4OworCisgICAgZm1sUGFyc2VyX2V4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyX3JldHVybiBtczsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfbXMKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX21zIGZtbFBhcnNlcl9leGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllcl9yZXR1cm4KKworICAgIHNlcDo6TWFjaGluZSAqIGRtOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9kbQorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfZG0gc2VwOjpNYWNoaW5lICoKKworICAgIHNlcDo6TWFjaGluZSAqIGFkczsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfYWRzCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9hZHMgc2VwOjpNYWNoaW5lICoKKworICAgIHNlcDo6TWFjaGluZSAqIGVtaTsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfZW1pCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9lbWkgc2VwOjpNYWNoaW5lICoKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBleGVjdXRhYmxlX21hY2hpbmVfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworCisgICAgCSBzZXA6Ok1vZGlmaWVyIG1kZnI7CisKKyAgICAJc2VwOjpTcGVjaWZpZXIgc3BjZnI7CisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDM3KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiBtYWNoaW5lOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTQwNDoyOiAoIChtcz0gZXhlY3V0YWJsZV9tb2RpZmllcl9zcGVjaWZpZXIgKT8gKGRtPSBkZWZfbWFjaGluZVsgY29udGFpbmVyICwgbWRmciAsIHNwY2ZyIF0gfGFkcz0gYW55X2RlZl9zdGF0ZW1hY2hpbmVbIGNvbnRhaW5lciAsIG1kZnIgLCBzcGNmciBdIHxlbWk9IGRlY2xfaW5zdGFuY2VbIGNvbnRhaW5lciAsIG1kZnIgLCBzcGNmciBdICkgKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNDA0OjQ6IChtcz0gZXhlY3V0YWJsZV9tb2RpZmllcl9zcGVjaWZpZXIgKT8gKGRtPSBkZWZfbWFjaGluZVsgY29udGFpbmVyICwgbWRmciAsIHNwY2ZyIF0gfGFkcz0gYW55X2RlZl9zdGF0ZW1hY2hpbmVbIGNvbnRhaW5lciAsIG1kZnIgLCBzcGNmciBdIHxlbWk9IGRlY2xfaW5zdGFuY2VbIGNvbnRhaW5lciAsIG1kZnIgLCBzcGNmciBdICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTQwNDo0OiAobXM9IGV4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDgyPTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNzI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzA2OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDMxNDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzUzOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM5MzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDY6CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJeworICAgICAgICAgICAgICAgICAgICAJCSAgICBpbnQgTEE4Ml8xID0gTEEoMik7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIGlmICggKHN5bnByZWQxNTNfZm1sKGN0eCkpKQorICAgICAgICAgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkJICAgICAgICBhbHQ4Mj0xOworICAgICAgICAgICAgICAgICAgICAJCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ4MikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNDA0OjY6IG1zPSBleGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllcgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllcl9pbl9leGVjdXRhYmxlX21hY2hpbmUzMTk5KTsKKyAgICAgICAgICAgIAkgICAgICAgIG1zPWV4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleGVjdXRhYmxlX21hY2hpbmVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gbWFjaGluZTsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIG1kZnIgPSBtcy5tZGZyCisgICAgICAgICAgICAJICAgICAgICAgICAgOyBzcGNmciA9IG1zLnNwY2ZyCisgICAgICAgICAgICAJICAgICAgICAgICAgOyAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE0MDg6NDogKGRtPSBkZWZfbWFjaGluZVsgY29udGFpbmVyICwgbWRmciAsIHNwY2ZyIF0gfGFkcz0gYW55X2RlZl9zdGF0ZW1hY2hpbmVbIGNvbnRhaW5lciAsIG1kZnIgLCBzcGNmciBdIHxlbWk9IGRlY2xfaW5zdGFuY2VbIGNvbnRhaW5lciAsIG1kZnIgLCBzcGNmciBdICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0ODM9MzsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgMzE3OgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQ4Mz0xOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMTQ0OgorICAgICAgICAgICAgICAgIGNhc2UgMTQ1OgorICAgICAgICAgICAgICAgIGNhc2UgMTQ3OgorICAgICAgICAgICAgICAgIGNhc2UgMTQ4OgorICAgICAgICAgICAgICAgIGNhc2UgMTQ5OgorICAgICAgICAgICAgICAgIGNhc2UgMTUwOgorICAgICAgICAgICAgICAgIGNhc2UgMTUzOgorICAgICAgICAgICAgICAgIGNhc2UgMjcyOgorICAgICAgICAgICAgICAgIGNhc2UgMzA2OgorICAgICAgICAgICAgICAgIGNhc2UgMzE0OgorICAgICAgICAgICAgICAgIGNhc2UgMzIyOgorICAgICAgICAgICAgICAgIGNhc2UgMzUzOgorICAgICAgICAgICAgICAgIGNhc2UgMzc4OgorICAgICAgICAgICAgICAgIGNhc2UgMzc5OgorICAgICAgICAgICAgICAgIGNhc2UgMzkzOgorICAgICAgICAgICAgICAgIGNhc2UgNDA2OgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQ4Mz0yOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzA3OgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQ4Mz0zOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFjaGluZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gODM7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgICAgIGdvdG8gcnVsZWV4ZWN1dGFibGVfbWFjaGluZUV4OworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ4MykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNDA4OjY6IGRtPSBkZWZfbWFjaGluZVsgY29udGFpbmVyICwgbWRmciAsIHNwY2ZyIF0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX21hY2hpbmVfaW5fZXhlY3V0YWJsZV9tYWNoaW5lMzIyMCk7CisgICAgICAgICAgICAJICAgICAgICBkbT1kZWZfbWFjaGluZShjdHgsIGNvbnRhaW5lciwgbWRmciwgc3BjZnIpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhlY3V0YWJsZV9tYWNoaW5lRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG1hY2hpbmU7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBtYWNoaW5lPSAKKyAgICAgICAgICAgIAkgICAgICAgICAgICBkbQorICAgICAgICAgICAgCSAgICAgICAgICAgIDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDI6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE0MTE6NjogYWRzPSBhbnlfZGVmX3N0YXRlbWFjaGluZVsgY29udGFpbmVyICwgbWRmciAsIHNwY2ZyIF0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfYW55X2RlZl9zdGF0ZW1hY2hpbmVfaW5fZXhlY3V0YWJsZV9tYWNoaW5lMzIzNik7CisgICAgICAgICAgICAJICAgICAgICBhZHM9YW55X2RlZl9zdGF0ZW1hY2hpbmUoY3R4LCBjb250YWluZXIsIG1kZnIsIHNwY2ZyKTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4ZWN1dGFibGVfbWFjaGluZUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBtYWNoaW5lOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgbWFjaGluZT0gCisgICAgICAgICAgICAJICAgICAgICAgICAgYWRzCisgICAgICAgICAgICAJICAgICAgICAgICAgOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMzoKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTQxNDo2OiBlbWk9IGRlY2xfaW5zdGFuY2VbIGNvbnRhaW5lciAsIG1kZnIgLCBzcGNmciBdCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlY2xfaW5zdGFuY2VfaW5fZXhlY3V0YWJsZV9tYWNoaW5lMzI1Mik7CisgICAgICAgICAgICAJICAgICAgICBlbWk9ZGVjbF9pbnN0YW5jZShjdHgsIGNvbnRhaW5lciwgbWRmciwgc3BjZnIpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhlY3V0YWJsZV9tYWNoaW5lRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG1hY2hpbmU7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBtYWNoaW5lPSAKKyAgICAgICAgICAgIAkgICAgICAgICAgICBlbWkKKyAgICAgICAgICAgIAkgICAgICAgICAgICA7CisgICAgICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVleGVjdXRhYmxlX21hY2hpbmVFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVleGVjdXRhYmxlX21hY2hpbmVFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDM3LCBleGVjdXRhYmxlX21hY2hpbmVfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiBtYWNoaW5lOworfQorLyogJEFOVExSIGVuZCBleGVjdXRhYmxlX21hY2hpbmUgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgZXhlY3V0YWJsZV9tb2RlbF9kZWZpbml0b24KKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE0MjA6MTogZXhlY3V0YWJsZV9tb2RlbF9kZWZpbml0b25bIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lciAsXG5cdFx0c2VwOjpNb2RpZmllciBtZGZyICwgc2VwOjpTcGVjaWZpZXIgc3BjZnIgXSByZXR1cm5zIFsgc2VwOjpNYWNoaW5lICogbWFjaGluZSBdIDogKG1zPSBleGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllciApPyAoZG09IGRlZl9tYWNoaW5lWyBjb250YWluZXIgLCBtZGZyICwgc3BjZnIgXSB8YWRzPSBkZWZfc3RhdGVtYWNoaW5lWyBjb250YWluZXIgLCBtZGZyICwgc3BjZnIgXSApIDsKKyAqLworc3RhdGljIHNlcDo6TWFjaGluZSAqCitleGVjdXRhYmxlX21vZGVsX2RlZmluaXRvbihwZm1sUGFyc2VyIGN0eCwgc2VwOjpNYWNoaW5lICogY29udGFpbmVyLCBzZXA6Ok1vZGlmaWVyIG1kZnIsIHNlcDo6U3BlY2lmaWVyIHNwY2ZyKQoreworICAgIHNlcDo6TWFjaGluZSAqIG1hY2hpbmU7CisKKyAgICBBTlRMUjNfVUlOVDMyIGV4ZWN1dGFibGVfbW9kZWxfZGVmaW5pdG9uX1N0YXJ0SW5kZXg7CisKKyAgICBmbWxQYXJzZXJfZXhlY3V0YWJsZV9tb2RpZmllcl9zcGVjaWZpZXJfcmV0dXJuIG1zOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9tcworICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfbXMgZm1sUGFyc2VyX2V4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyX3JldHVybgorCisgICAgc2VwOjpNYWNoaW5lICogZG07CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2RtCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9kbSBzZXA6Ok1hY2hpbmUgKgorCisgICAgc2VwOjpNYWNoaW5lICogYWRzOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9hZHMKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2FkcyBzZXA6Ok1hY2hpbmUgKgorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGV4ZWN1dGFibGVfbW9kZWxfZGVmaW5pdG9uX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDM4KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiBtYWNoaW5lOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTQyNDoyOiAoIChtcz0gZXhlY3V0YWJsZV9tb2RpZmllcl9zcGVjaWZpZXIgKT8gKGRtPSBkZWZfbWFjaGluZVsgY29udGFpbmVyICwgbWRmciAsIHNwY2ZyIF0gfGFkcz0gZGVmX3N0YXRlbWFjaGluZVsgY29udGFpbmVyICwgbWRmciAsIHNwY2ZyIF0gKSApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE0MjQ6NDogKG1zPSBleGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllciApPyAoZG09IGRlZl9tYWNoaW5lWyBjb250YWluZXIgLCBtZGZyICwgc3BjZnIgXSB8YWRzPSBkZWZfc3RhdGVtYWNoaW5lWyBjb250YWluZXIgLCBtZGZyICwgc3BjZnIgXSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE0MjQ6NDogKG1zPSBleGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllciApPworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQ4ND0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjcyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDMwNjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzMTQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzIyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM1MzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzOTM6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDA2OgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDg0PTE7CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDg0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE0MjQ6NjogbXM9IGV4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyX2luX2V4ZWN1dGFibGVfbW9kZWxfZGVmaW5pdG9uMzI4Nik7CisgICAgICAgICAgICAJICAgICAgICBtcz1leGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllcihjdHgpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhlY3V0YWJsZV9tb2RlbF9kZWZpbml0b25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gbWFjaGluZTsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIG1kZnIub3ZlcnJpZGVfaWZkZWYoIG1zLm1kZnIKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgKTsgIHNwY2ZyLm92ZXJyaWRlX2lmZGVmKCBtcy5zcGNmcgorICAgICAgICAgICAgCSAgICAgICAgICAgICApOyAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE0Mjg6NDogKGRtPSBkZWZfbWFjaGluZVsgY29udGFpbmVyICwgbWRmciAsIHNwY2ZyIF0gfGFkcz0gZGVmX3N0YXRlbWFjaGluZVsgY29udGFpbmVyICwgbWRmciAsIHNwY2ZyIF0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQ4NT0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAzMTc6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDg1PTE7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzNzk6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDg1PTI7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYWNoaW5lOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA4NTsKKyAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgICAgICAgICAgZ290byBydWxlZXhlY3V0YWJsZV9tb2RlbF9kZWZpbml0b25FeDsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0ODUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTQyODo2OiBkbT0gZGVmX21hY2hpbmVbIGNvbnRhaW5lciAsIG1kZnIgLCBzcGNmciBdCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlZl9tYWNoaW5lX2luX2V4ZWN1dGFibGVfbW9kZWxfZGVmaW5pdG9uMzMwNyk7CisgICAgICAgICAgICAJICAgICAgICBkbT1kZWZfbWFjaGluZShjdHgsIGNvbnRhaW5lciwgbWRmciwgc3BjZnIpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhlY3V0YWJsZV9tb2RlbF9kZWZpbml0b25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gbWFjaGluZTsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIG1hY2hpbmU9IAorICAgICAgICAgICAgCSAgICAgICAgICAgIGRtCisgICAgICAgICAgICAJICAgICAgICAgICAgOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTQzMTo2OiBhZHM9IGRlZl9zdGF0ZW1hY2hpbmVbIGNvbnRhaW5lciAsIG1kZnIgLCBzcGNmciBdCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlZl9zdGF0ZW1hY2hpbmVfaW5fZXhlY3V0YWJsZV9tb2RlbF9kZWZpbml0b24zMzI5KTsKKyAgICAgICAgICAgIAkgICAgICAgIGFkcz1kZWZfc3RhdGVtYWNoaW5lKGN0eCwgY29udGFpbmVyLCBtZGZyLCBzcGNmcik7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleGVjdXRhYmxlX21vZGVsX2RlZmluaXRvbkV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBtYWNoaW5lOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgbWFjaGluZT0gCisgICAgICAgICAgICAJICAgICAgICAgICAgYWRzCisgICAgICAgICAgICAJICAgICAgICAgICAgOworICAgICAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlZXhlY3V0YWJsZV9tb2RlbF9kZWZpbml0b25FeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVleGVjdXRhYmxlX21vZGVsX2RlZmluaXRvbkV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMzgsIGV4ZWN1dGFibGVfbW9kZWxfZGVmaW5pdG9uX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gbWFjaGluZTsKK30KKy8qICRBTlRMUiBlbmQgZXhlY3V0YWJsZV9tb2RlbF9kZWZpbml0b24gKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgZXhlY3V0YWJsZV9pbnN0YW5jZV9kZWZpbml0b24KKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE0MzY6MTogZXhlY3V0YWJsZV9pbnN0YW5jZV9kZWZpbml0b25bIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lciBdIHJldHVybnMgWyBzZXA6Ok1hY2hpbmUgKiBpbnN0YW5jZSBdIDogKG1zPSBpbnN0YW5jZV9tb2RpZmllcl9zcGVjaWZpZXIgKT8gZW1pPSBkZWNsX2luc3RhbmNlWyBjb250YWluZXIgLCBtZGZyICwgc3BjZnIgXSA7CisgKi8KK3N0YXRpYyBzZXA6Ok1hY2hpbmUgKgorZXhlY3V0YWJsZV9pbnN0YW5jZV9kZWZpbml0b24ocGZtbFBhcnNlciBjdHgsIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lcikKK3sKKyAgICBzZXA6Ok1hY2hpbmUgKiBpbnN0YW5jZTsKKworICAgIEFOVExSM19VSU5UMzIgZXhlY3V0YWJsZV9pbnN0YW5jZV9kZWZpbml0b25fU3RhcnRJbmRleDsKKworICAgIGZtbFBhcnNlcl9pbnN0YW5jZV9tb2RpZmllcl9zcGVjaWZpZXJfcmV0dXJuIG1zOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9tcworICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfbXMgZm1sUGFyc2VyX2luc3RhbmNlX21vZGlmaWVyX3NwZWNpZmllcl9yZXR1cm4KKworICAgIHNlcDo6TWFjaGluZSAqIGVtaTsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfZW1pCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9lbWkgc2VwOjpNYWNoaW5lICoKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBleGVjdXRhYmxlX2luc3RhbmNlX2RlZmluaXRvbl9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisKKyAgICAJc2VwOjpNb2RpZmllciBtZGZyOworCisgICAgCXNlcDo6U3BlY2lmaWVyIHNwY2ZyKCBzZXA6OlNwZWNpZmllcjo6REVTSUdOX0lOU1RBTkNFX1NUQVRJQ19TUEVDSUZJRVIgKTsKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMzkpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIGluc3RhbmNlOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTQ0MzoyOiAoIChtcz0gaW5zdGFuY2VfbW9kaWZpZXJfc3BlY2lmaWVyICk/IGVtaT0gZGVjbF9pbnN0YW5jZVsgY29udGFpbmVyICwgbWRmciAsIHNwY2ZyIF0gKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNDQzOjQ6IChtcz0gaW5zdGFuY2VfbW9kaWZpZXJfc3BlY2lmaWVyICk/IGVtaT0gZGVjbF9pbnN0YW5jZVsgY29udGFpbmVyICwgbWRmciAsIHNwY2ZyIF0KKyAgICAgICAgeworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTQ0Mzo0OiAobXM9IGluc3RhbmNlX21vZGlmaWVyX3NwZWNpZmllciApPworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQ4Nj0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjcyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDI4MjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzMDY6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzE0OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM0OToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzNTI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzU1OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM5MzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDY6CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJYWx0ODY9MTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0ODYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTQ0Mzo2OiBtcz0gaW5zdGFuY2VfbW9kaWZpZXJfc3BlY2lmaWVyCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2luc3RhbmNlX21vZGlmaWVyX3NwZWNpZmllcl9pbl9leGVjdXRhYmxlX2luc3RhbmNlX2RlZmluaXRvbjMzNjUpOworICAgICAgICAgICAgCSAgICAgICAgbXM9aW5zdGFuY2VfbW9kaWZpZXJfc3BlY2lmaWVyKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleGVjdXRhYmxlX2luc3RhbmNlX2RlZmluaXRvbkV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIG1kZnIgPSBtcy5tZGZyCisgICAgICAgICAgICAJICAgICAgICAgICAgOyBzcGNmciA9IG1zLnNwY2ZyCisgICAgICAgICAgICAJICAgICAgICAgICAgOyAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlY2xfaW5zdGFuY2VfaW5fZXhlY3V0YWJsZV9pbnN0YW5jZV9kZWZpbml0b24zMzg0KTsKKyAgICAgICAgICAgIGVtaT1kZWNsX2luc3RhbmNlKGN0eCwgY29udGFpbmVyLCBtZGZyLCBzcGNmcik7CisKKyAgICAgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVleGVjdXRhYmxlX2luc3RhbmNlX2RlZmluaXRvbkV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIGluc3RhbmNlPSAKKyAgICAgICAgICAgICAgICBlbWkKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlZXhlY3V0YWJsZV9pbnN0YW5jZV9kZWZpbml0b25FeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVleGVjdXRhYmxlX2luc3RhbmNlX2RlZmluaXRvbkV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMzksIGV4ZWN1dGFibGVfaW5zdGFuY2VfZGVmaW5pdG9uX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gaW5zdGFuY2U7Cit9CisvKiAkQU5UTFIgZW5kIGV4ZWN1dGFibGVfaW5zdGFuY2VfZGVmaW5pdG9uICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGRlY2xfaW5zdGFuY2UKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE0NTY6MTogZGVjbF9pbnN0YW5jZVsgc2VwOjpNYWNoaW5lICogY29udGFpbmVyICxcblx0XHRzZXA6Ok1vZGlmaWVyIG1kZnIgLCBzZXA6OlNwZWNpZmllciBzcGNmciBdIHJldHVybnMgWyBzZXA6Ok1hY2hpbmUgKiBpbnN0YW5jZSBdIDogJ2luc3RhbmNlJyAoICdtYWNoaW5lJyB8ICdzdGF0ZW1hY2hpbmUnICk/IExUXyAoICdtb2RlbDonICk/IG1tPSBpbnN0YW5jZV9tYWNoaW5lX21vZGVsICggQ09NTUEgZGVmX2luc3RhbmNlX2NvdW50WyBpbml0aWFsQ291bnQgLCBtYXhpbWFsQ291bnQgXSApPyBHVCBpZD0gSUQgKCBTdHJpbmdMaXRlcmFsICk/ICggTFBBUkVOICggZGVmX2luc3RhbmNlX29uX25ld19hY3Rpdml0eVsgJGluc3RhbmNlIF0gKT8gUlBBUkVOICk/ICggU0VNSSB8IExDVVJMWSAocz0gc3RhdGVtZW50ICkqICggZGVmX2luc3RhbmNlX2FjdGl2aXR5WyAkaW5zdGFuY2UgXSApKiBSQ1VSTFkgKSA7CisgKi8KK3N0YXRpYyBzZXA6Ok1hY2hpbmUgKgorZGVjbF9pbnN0YW5jZShwZm1sUGFyc2VyIGN0eCwgc2VwOjpNYWNoaW5lICogY29udGFpbmVyLCBzZXA6Ok1vZGlmaWVyIG1kZnIsIHNlcDo6U3BlY2lmaWVyIHNwY2ZyKQoreworICAgIHNlcDo6TWFjaGluZSAqIGluc3RhbmNlOworCisgICAgQU5UTFIzX1VJTlQzMiBkZWNsX2luc3RhbmNlX1N0YXJ0SW5kZXg7CisKKyAgICBwQU5UTFIzX0NPTU1PTl9UT0tFTiAgICBpZDsKKyAgICBwQU5UTFIzX0NPTU1PTl9UT0tFTiAgICBTdHJpbmdMaXRlcmFsNDsKKyAgICBzZXA6OkJGIG1tOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9tbQorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfbW0gc2VwOjpCRgorCisgICAgc2VwOjpCRkNvZGUgczsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfcworICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfcyBzZXA6OkJGQ29kZQorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGRlY2xfaW5zdGFuY2VfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworCisgICAgCXNlcDo6QkYgYU1vZGVsOworCisgICAgCXNlcDo6YXZtX3NpemVfdCBpbml0aWFsQ291bnQgPSAxOworICAgIAlzZXA6OmF2bV9zaXplX3QgbWF4aW1hbENvdW50ID0gQVZNX05VTUVSSUNfTUFYX1NJWkVfVDsKKworICAgIAlTQVZFX1JVTEVfQkVHSU5fTE9DQVRJT047CisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDQwKSkgKQorICAgIHsKKyAgICAgICAgeworCisgICAgICAgICAgICAJaWYoIGFNb2RlbC5pczwgc2VwOjpNYWNoaW5lID4oKSApCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlQT1BfQ1RYOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAlTRVRfUlVMRV9MT0NBVElPTihpbnN0YW5jZSk7CisKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIGluc3RhbmNlOworICAgIH0KKworICAgIGlkICAgICAgID0gTlVMTDsKKyAgICBTdHJpbmdMaXRlcmFsNCAgICAgICA9IE5VTEw7CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE0NzU6MjogKCAnaW5zdGFuY2UnICggJ21hY2hpbmUnIHwgJ3N0YXRlbWFjaGluZScgKT8gTFRfICggJ21vZGVsOicgKT8gbW09IGluc3RhbmNlX21hY2hpbmVfbW9kZWwgKCBDT01NQSBkZWZfaW5zdGFuY2VfY291bnRbIGluaXRpYWxDb3VudCAsIG1heGltYWxDb3VudCBdICk/IEdUIGlkPSBJRCAoIFN0cmluZ0xpdGVyYWwgKT8gKCBMUEFSRU4gKCBkZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5WyAkaW5zdGFuY2UgXSApPyBSUEFSRU4gKT8gKCBTRU1JIHwgTENVUkxZIChzPSBzdGF0ZW1lbnQgKSogKCBkZWZfaW5zdGFuY2VfYWN0aXZpdHlbICRpbnN0YW5jZSBdICkqIFJDVVJMWSApICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTQ3NTo0OiAnaW5zdGFuY2UnICggJ21hY2hpbmUnIHwgJ3N0YXRlbWFjaGluZScgKT8gTFRfICggJ21vZGVsOicgKT8gbW09IGluc3RhbmNlX21hY2hpbmVfbW9kZWwgKCBDT01NQSBkZWZfaW5zdGFuY2VfY291bnRbIGluaXRpYWxDb3VudCAsIG1heGltYWxDb3VudCBdICk/IEdUIGlkPSBJRCAoIFN0cmluZ0xpdGVyYWwgKT8gKCBMUEFSRU4gKCBkZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5WyAkaW5zdGFuY2UgXSApPyBSUEFSRU4gKT8gKCBTRU1JIHwgTENVUkxZIChzPSBzdGF0ZW1lbnQgKSogKCBkZWZfaW5zdGFuY2VfYWN0aXZpdHlbICRpbnN0YW5jZSBdICkqIFJDVVJMWSApCisgICAgICAgIHsKKyAgICAgICAgICAgICBNQVRDSFQoMzA3LCAmRk9MTE9XXzMwN19pbl9kZWNsX2luc3RhbmNlMzQyMSk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfaW5zdGFuY2VFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTQ3NToxNjogKCAnbWFjaGluZScgfCAnc3RhdGVtYWNoaW5lJyApPworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQ4Nz0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzE3OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM3OToKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQ4Nz0xOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ4NykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBMQSgxKSA9PSAzMTcgfHwgTEEoMSkgPT0gMzc5ICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBDT05TVU1FKCk7CisgICAgICAgICAgICAJICAgICAgICAgICAgUEVSUk9SUkVDT1ZFUlk9QU5UTFIzX0ZBTFNFOworICAgICAgICAgICAgCSAgICAgICAgICAgIEZBSUxFREZMQUc9QU5UTFIzX0ZBTFNFOworCisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBlbHNlCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19NSVNNQVRDSEVEX1NFVF9FWENFUFRJT047CisgICAgICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT5uYW1lICAgICAgICAgPSAodm9pZCAqKUFOVExSM19NSVNNQVRDSEVEX1NFVF9OQU1FOworICAgICAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+ZXhwZWN0aW5nU2V0ID0gTlVMTDsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfaW5zdGFuY2VFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICBNQVRDSFQoTFRfLCAmRk9MTE9XX0xUX19pbl9kZWNsX2luc3RhbmNlMzQzOCk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfaW5zdGFuY2VFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTQ3Nzo1OiAoICdtb2RlbDonICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDg4PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjM6CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJYWx0ODg9MTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0ODgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTQ3Nzo3OiAnbW9kZWw6JworICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKDMyMywgJkZPTExPV18zMjNfaW5fZGVjbF9pbnN0YW5jZTM0NDYpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX2luc3RhbmNlRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfaW5zdGFuY2VfbWFjaGluZV9tb2RlbF9pbl9kZWNsX2luc3RhbmNlMzQ1Myk7CisgICAgICAgICAgICBtbT1pbnN0YW5jZV9tYWNoaW5lX21vZGVsKGN0eCk7CisKKyAgICAgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX2luc3RhbmNlRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgYU1vZGVsID0gbW0KKyAgICAgICAgICAgICAgICA7IAorICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE0Nzk6NTogKCBDT01NQSBkZWZfaW5zdGFuY2VfY291bnRbIGluaXRpYWxDb3VudCAsIG1heGltYWxDb3VudCBdICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDg5PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT01NQToKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQ4OT0xOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ4OSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNDc5Ojc6IENPTU1BIGRlZl9pbnN0YW5jZV9jb3VudFsgaW5pdGlhbENvdW50ICwgbWF4aW1hbENvdW50IF0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChDT01NQSwgJkZPTExPV19DT01NQV9pbl9kZWNsX2luc3RhbmNlMzQ2NSk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfaW5zdGFuY2VFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX2luc3RhbmNlX2NvdW50X2luX2RlY2xfaW5zdGFuY2UzNDY4KTsKKyAgICAgICAgICAgIAkgICAgICAgIGRlZl9pbnN0YW5jZV9jb3VudChjdHgsIGluaXRpYWxDb3VudCwgbWF4aW1hbENvdW50KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfaW5zdGFuY2VFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgTUFUQ0hUKEdULCAmRk9MTE9XX0dUX2luX2RlY2xfaW5zdGFuY2UzNDc3KTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZGVjbF9pbnN0YW5jZUV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZCA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTikgTUFUQ0hUKElELCAmRk9MTE9XX0lEX2luX2RlY2xfaW5zdGFuY2UzNDgyKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZGVjbF9pbnN0YW5jZUV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAJICAJaWYoIGFNb2RlbC5pczwgc2VwOjpNYWNoaW5lID4oKSApCisgICAgICAgICAgICAgICAgCSAgCXsKKyAgICAgICAgICAgICAgICAJICAJCVBVU0hfQ1RYX05FVyggYU1vZGVsLnRvX3B0cjwgc2VwOjpNYWNoaW5lID4oKSApOworICAgICAgICAgICAgICAgIAkgIAl9CisKKyAgICAgICAgICAgICAgICAJICAJaW5zdGFuY2U9IHNlcDo6TWFjaGluZTo6bmV3SW5zdGFuY2UoY29udGFpbmVyLAorICAgICAgICAgICAgICAgIAkgIAkJCVNUUigoaWQtPmdldFRleHQoaWQpKS0+Y2hhcnMpLCBhTW9kZWwsIGluaXRpYWxDb3VudCwgbWF4aW1hbENvdW50KTsKKworCisgICAgICAgICAgICAgICAgCQlpbnN0YW5jZQorICAgICAgICAgICAgICAgIC0+Z2V0d01vZGlmaWVyKCkub3ZlcnJpZGVfaWZkZWYoIG1kZnIgKTsKKworICAgICAgICAgICAgICAgIAkJaW5zdGFuY2UKKyAgICAgICAgICAgICAgICAtPmdldHdTcGVjaWZpZXIoKS5vdmVycmlkZV9pZmRlZigKKyAgICAgICAgICAgICAgICAJCQkJc3BjZnIuaXNEZXNpZ25JbnN0YW5jZUR5bmFtaWMoKSA/CisgICAgICAgICAgICAgICAgCQkJCQkJc3BjZnIgOiBzcGNmci5zZXREZXNpZ25JbnN0YW5jZVN0YXRpYygpICk7CisKKyAgICAgICAgICAgICAgICAJICAJY29udGFpbmVyLT5zYXZlT3duZWRFbGVtZW50KCBpbnN0YW5jZQorICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIAkgIAorICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE0OTk6NDogKCBTdHJpbmdMaXRlcmFsICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDkwPTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTdHJpbmdMaXRlcmFsOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDkwPTE7CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDkwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE0OTk6NjogU3RyaW5nTGl0ZXJhbAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBTdHJpbmdMaXRlcmFsNCA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTikgTUFUQ0hUKFN0cmluZ0xpdGVyYWwsICZGT0xMT1dfU3RyaW5nTGl0ZXJhbF9pbl9kZWNsX2luc3RhbmNlMzQ5NSk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfaW5zdGFuY2VFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBpbnN0YW5jZQorICAgICAgICAgICAgCSAgICAgICAgICAgIC0+c2V0VW5yZXN0cmljdGVkTmFtZShTVFIoKFN0cmluZ0xpdGVyYWw0LT5nZXRUZXh0KFN0cmluZ0xpdGVyYWw0KSktPmNoYXJzKSk7IAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTUwODo0OiAoIExQQVJFTiAoIGRlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlbICRpbnN0YW5jZSBdICk/IFJQQVJFTiApPworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQ5Mj0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTFBBUkVOOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDkyPTE7CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDkyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE1MDg6NjogTFBBUkVOICggZGVmX2luc3RhbmNlX29uX25ld19hY3Rpdml0eVsgJGluc3RhbmNlIF0gKT8gUlBBUkVOCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoTFBBUkVOLCAmRk9MTE9XX0xQQVJFTl9pbl9kZWNsX2luc3RhbmNlMzUxNSk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfaW5zdGFuY2VFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTUwOTo2OiAoIGRlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlbICRpbnN0YW5jZSBdICk/CisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDkxPTI7CisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBCTk9UOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIENPTE9OeDI6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgQ2hhckxpdGVyYWw6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgREVDUjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBET0xMQVJfTENVUkxZOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIEZsb2F0TGl0ZXJhbDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBJTkNSOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIEludGVnZXJMaXRlcmFsOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIExCUkFDS0VUOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIExCUkFDS0VUX0JBUjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBMQ1VSTFk6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgTE5PVDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBMUEFSRU46CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgTFBBUkVOX0lOVk9LRToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBNSU5VUzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBPUF9QT1A6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgT1BfVE9QOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIFBFUkNFTlRfTENVUkxZOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIFBMVVM6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgUmF0aW9uYWxMaXRlcmFsOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIFN0cmluZ0xpdGVyYWw6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMTU4OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDE1OToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAxNjA6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMTYxOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDE2MjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAyMzc6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMjU2OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDI2NToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAyNzc6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMjgwOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDI5NDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzMTM6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzMwOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDMzMToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzMzI6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzQzOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDM0NzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzNzI6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzk3OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJCWFsdDkxPTE7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDkxKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE1MDk6ODogZGVmX2luc3RhbmNlX29uX25ld19hY3Rpdml0eVsgJGluc3RhbmNlIF0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX2luc3RhbmNlX29uX25ld19hY3Rpdml0eV9pbl9kZWNsX2luc3RhbmNlMzUyNCk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBkZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5KGN0eCwgCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpbnN0YW5jZQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgKTsKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfaW5zdGFuY2VFeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKFJQQVJFTiwgJkZPTExPV19SUEFSRU5faW5fZGVjbF9pbnN0YW5jZTM1MzYpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX2luc3RhbmNlRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTUxMzo0OiAoIFNFTUkgfCBMQ1VSTFkgKHM9IHN0YXRlbWVudCApKiAoIGRlZl9pbnN0YW5jZV9hY3Rpdml0eVsgJGluc3RhbmNlIF0gKSogUkNVUkxZICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0OTU9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgU0VNSToKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0OTU9MTsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIExDVVJMWToKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0OTU9MjsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA5NTsKKyAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgICAgICAgICAgZ290byBydWxlZGVjbF9pbnN0YW5jZUV4OworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ5NSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNTEzOjY6IFNFTUkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChTRU1JLCAmRk9MTE9XX1NFTUlfaW5fZGVjbF9pbnN0YW5jZTM1NTApOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX2luc3RhbmNlRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDI6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE1MTU6NjogTENVUkxZIChzPSBzdGF0ZW1lbnQgKSogKCBkZWZfaW5zdGFuY2VfYWN0aXZpdHlbICRpbnN0YW5jZSBdICkqIFJDVVJMWQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKExDVVJMWSwgJkZPTExPV19MQ1VSTFlfaW5fZGVjbF9pbnN0YW5jZTM1NTgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX2luc3RhbmNlRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE1MTY6MzogKHM9IHN0YXRlbWVudCApKgorCisgICAgICAgICAgICAJICAgICAgICBmb3IgKDs7KQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQ5Mz0yOworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBDT0xPTngyOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgREVDUjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIERPTExBUl9MQ1VSTFk6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIElOQ1I6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBMQ1VSTFk6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBMUEFSRU5fSU5WT0tFOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgU1RBVEVNRU5UX1BST01QVDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDE1NDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDE1NToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDE1NjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDE1NzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDIzNjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI0NzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI1MDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI1NjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI2MzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI2NzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI2ODoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI2OToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI3NToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI3ODoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI3OToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI4MjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI4NToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI4OToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI5MDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI5MToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI5MjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI5MzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI5NDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI5NjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI5OToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMwMDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMwMToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMwMjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMwMzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMwNDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMwNToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMxMjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMzMDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMzNjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMzNzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMzODoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMzOToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM0MDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM0MToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM2MjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM2MzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM2NDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM2ODoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM2OToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM3MToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM3NzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM4NToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM4NjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM4OToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM5MToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDQxNToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDQxNjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJYWx0OTM9MTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0OTMpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTUxNjo1OiBzPSBzdGF0ZW1lbnQKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfc3RhdGVtZW50X2luX2RlY2xfaW5zdGFuY2UzNTY2KTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHM9c3RhdGVtZW50KGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX2luc3RhbmNlRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgaW5zdGFuY2UtPmdldFVuaXFCZWhhdmlvclBhcnQoKS0+c2VxT25DcmVhdGUocworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICk7IAorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICAgICAgCWRlZmF1bHQ6CisgICAgICAgICAgICAJICAgICAgICAJICAgIGdvdG8gbG9vcDkzOwkvKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgKi8KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgbG9vcDkzOiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTUxODozOiAoIGRlZl9pbnN0YW5jZV9hY3Rpdml0eVsgJGluc3RhbmNlIF0gKSoKKworICAgICAgICAgICAgCSAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0OTQ9MjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMTc3OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjI2OgorICAgICAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQlhbHQ5ND0xOworICAgICAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQ5NCkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNTE4OjU6IGRlZl9pbnN0YW5jZV9hY3Rpdml0eVsgJGluc3RhbmNlIF0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX2luc3RhbmNlX2FjdGl2aXR5X2luX2RlY2xfaW5zdGFuY2UzNTc4KTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGRlZl9pbnN0YW5jZV9hY3Rpdml0eShjdHgsIAorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaW5zdGFuY2UKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICk7CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX2luc3RhbmNlRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICAgICAgCWRlZmF1bHQ6CisgICAgICAgICAgICAJICAgICAgICAJICAgIGdvdG8gbG9vcDk0OwkvKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgKi8KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgbG9vcDk0OiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChSQ1VSTFksICZGT0xMT1dfUkNVUkxZX2luX2RlY2xfaW5zdGFuY2UzNTg5KTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVjbF9pbnN0YW5jZUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlZGVjbF9pbnN0YW5jZUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZWRlY2xfaW5zdGFuY2VFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgCWlmKCBhTW9kZWwuaXM8IHNlcDo6TWFjaGluZSA+KCkgKQorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCVBPUF9DVFg7CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIAlTRVRfUlVMRV9MT0NBVElPTihpbnN0YW5jZSk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKworICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoNDAsIGRlY2xfaW5zdGFuY2VfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiBpbnN0YW5jZTsKK30KKy8qICRBTlRMUiBlbmQgZGVjbF9pbnN0YW5jZSAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBkZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5CisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNTI0OjE6IGRlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlbIHNlcDo6TWFjaGluZSAqIGluc3RhbmNlIF0gOiBkZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5X3BhcmFtZXRlclsgJGluc3RhbmNlICwgcG9zaXRpb24rKyBdICggQ09NTUEgZGVmX2luc3RhbmNlX29uX25ld19hY3Rpdml0eV9wYXJhbWV0ZXJbICRpbnN0YW5jZSAsIHBvc2l0aW9uKysgXSApKiA7CisgKi8KK3N0YXRpYyB2b2lkCitkZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5KHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBpbnN0YW5jZSkKK3sKKyAgICBBTlRMUjNfVUlOVDMyIGRlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlfU3RhcnRJbmRleDsKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBkZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5X1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKworICAgIAlzZXA6OmF2bV9zaXplX3QgcG9zaXRpb24gPSAwOworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSg0MSkpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTUyODoyOiAoIGRlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlfcGFyYW1ldGVyWyAkaW5zdGFuY2UgLCBwb3NpdGlvbisrIF0gKCBDT01NQSBkZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5X3BhcmFtZXRlclsgJGluc3RhbmNlICwgcG9zaXRpb24rKyBdICkqICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTUyODo0OiBkZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5X3BhcmFtZXRlclsgJGluc3RhbmNlICwgcG9zaXRpb24rKyBdICggQ09NTUEgZGVmX2luc3RhbmNlX29uX25ld19hY3Rpdml0eV9wYXJhbWV0ZXJbICRpbnN0YW5jZSAsIHBvc2l0aW9uKysgXSApKgorICAgICAgICB7CisgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5X3BhcmFtZXRlcl9pbl9kZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5MzYxMik7CisgICAgICAgICAgICBkZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5X3BhcmFtZXRlcihjdHgsIGluc3RhbmNlLCBwb3NpdGlvbisrKTsKKworICAgICAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE1Mjk6NzogKCBDT01NQSBkZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5X3BhcmFtZXRlclsgJGluc3RhbmNlICwgcG9zaXRpb24rKyBdICkqCisKKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDk2PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIENPTU1BOgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQ5Nj0xOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ5NikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNTI5Ojk6IENPTU1BIGRlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlfcGFyYW1ldGVyWyAkaW5zdGFuY2UgLCBwb3NpdGlvbisrIF0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChDT01NQSwgJkZPTExPV19DT01NQV9pbl9kZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5MzYyMyk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlfcGFyYW1ldGVyX2luX2RlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHkzNjI1KTsKKyAgICAgICAgICAgIAkgICAgICAgIGRlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlfcGFyYW1ldGVyKGN0eCwgaW5zdGFuY2UsIHBvc2l0aW9uKyspOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2luc3RhbmNlX29uX25ld19hY3Rpdml0eUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdDoKKyAgICAgICAgICAgIAkgICAgZ290byBsb29wOTY7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb29wOTY6IDsgLyogSnVtcCBvdXQgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKworCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZWRlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVkZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5RXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSg0MSwgZGVmX2luc3RhbmNlX29uX25ld19hY3Rpdml0eV9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgZGVmX2luc3RhbmNlX29uX25ld19hY3Rpdml0eSAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBkZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5X3BhcmFtZXRlcgorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTUzMjoxOiBkZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5X3BhcmFtZXRlclsgc2VwOjpNYWNoaW5lICogaW5zdGFuY2UgLCBzZXA6OmF2bV9zaXplX3QgcG9zaXRpb24gXSA6ICggKCBsdmFsdWUgb3BfYXNzaWduX3BhcmFtICk9Pmx2PSBsdmFsdWUgb2FwPSBvcF9hc3NpZ25fcGFyYW0gZT0gZXhwcmVzc2lvbiB8ZT0gZXhwcmVzc2lvbiApOworICovCitzdGF0aWMgdm9pZAorZGVmX2luc3RhbmNlX29uX25ld19hY3Rpdml0eV9wYXJhbWV0ZXIocGZtbFBhcnNlciBjdHgsIHNlcDo6TWFjaGluZSAqIGluc3RhbmNlLCBzZXA6OmF2bV9zaXplX3QgcG9zaXRpb24pCit7CisgICAgQU5UTFIzX1VJTlQzMiBkZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5X3BhcmFtZXRlcl9TdGFydEluZGV4OworCisgICAgc2VwOjpCRiBsdjsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfbHYKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2x2IHNlcDo6QkYKKworICAgIHNlcDo6T3BlcmF0b3IgKiBvYXA7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX29hcAorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfb2FwIHNlcDo6T3BlcmF0b3IgKgorCisgICAgc2VwOjpCRiBlOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9lCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9lIHNlcDo6QkYKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBkZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5X3BhcmFtZXRlcl9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSg0MikpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE1MzQ6MjogKCAoIGx2YWx1ZSBvcF9hc3NpZ25fcGFyYW0gKT0+bHY9IGx2YWx1ZSBvYXA9IG9wX2Fzc2lnbl9wYXJhbSBlPSBleHByZXNzaW9uIHxlPSBleHByZXNzaW9uICkKKworICAgICAgICAgICAgQU5UTFIzX1VJTlQzMiBhbHQ5NzsKKworICAgICAgICAgICAgYWx0OTc9MjsKKworICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBDT0xPTngyOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkgICAgaW50IExBOTdfMSA9IExBKDIpOworICAgICAgICAgICAgCQkgICAgaWYgKCAoc3lucHJlZDE3MF9mbWwoY3R4KSkpCisgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAJCSAgICAgICAgYWx0OTc9MTsKKyAgICAgICAgICAgIAkJICAgIH0KKyAgICAgICAgICAgIAkJICAgIGVsc2UgaWYgKCAoQU5UTFIzX1RSVUUpKQorICAgICAgICAgICAgCQkgICAgeworICAgICAgICAgICAgCQkgICAgICAgIGFsdDk3PTI7CisgICAgICAgICAgICAJCSAgICB9CisgICAgICAgICAgICAJCSAgICBlbHNlCisgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAJCSAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgCQkgICAgICAgIHsKKyAgICAgICAgICAgIAkJICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgCQkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCQkgICAgICAgIH0KKworCisgICAgICAgICAgICAJCSAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgIAkJICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIAkJICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAJCSAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA5NzsKKyAgICAgICAgICAgIAkJICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDE7CisKKworICAgICAgICAgICAgCQkgICAgICAgIGdvdG8gcnVsZWRlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlfcGFyYW1ldGVyRXg7CisKKyAgICAgICAgICAgIAkJICAgIH0KKyAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSUQ6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAJCSAgICBpbnQgTEE5N18yID0gTEEoMik7CisgICAgICAgICAgICAJCSAgICBpZiAoIChzeW5wcmVkMTcwX2ZtbChjdHgpKSkKKyAgICAgICAgICAgIAkJICAgIHsKKyAgICAgICAgICAgIAkJICAgICAgICBhbHQ5Nz0xOworICAgICAgICAgICAgCQkgICAgfQorICAgICAgICAgICAgCQkgICAgZWxzZSBpZiAoIChBTlRMUjNfVFJVRSkpCisgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAJCSAgICAgICAgYWx0OTc9MjsKKyAgICAgICAgICAgIAkJICAgIH0KKyAgICAgICAgICAgIAkJICAgIGVsc2UKKyAgICAgICAgICAgIAkJICAgIHsKKyAgICAgICAgICAgIAkJICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAJCSAgICAgICAgeworICAgICAgICAgICAgCQkgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAJCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkJICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgCQkgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgCQkgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgIAkJICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDk3OworICAgICAgICAgICAgCQkgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMjsKKworCisgICAgICAgICAgICAJCSAgICAgICAgZ290byBydWxlZGVmX2luc3RhbmNlX29uX25ld19hY3Rpdml0eV9wYXJhbWV0ZXJFeDsKKworICAgICAgICAgICAgCQkgICAgfQorICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCTk9UOgorICAgICAgICAgICAgY2FzZSBDaGFyTGl0ZXJhbDoKKyAgICAgICAgICAgIGNhc2UgREVDUjoKKyAgICAgICAgICAgIGNhc2UgRE9MTEFSX0xDVVJMWToKKyAgICAgICAgICAgIGNhc2UgRmxvYXRMaXRlcmFsOgorICAgICAgICAgICAgY2FzZSBJTkNSOgorICAgICAgICAgICAgY2FzZSBJbnRlZ2VyTGl0ZXJhbDoKKyAgICAgICAgICAgIGNhc2UgTEJSQUNLRVQ6CisgICAgICAgICAgICBjYXNlIExCUkFDS0VUX0JBUjoKKyAgICAgICAgICAgIGNhc2UgTENVUkxZOgorICAgICAgICAgICAgY2FzZSBMTk9UOgorICAgICAgICAgICAgY2FzZSBMUEFSRU46CisgICAgICAgICAgICBjYXNlIExQQVJFTl9JTlZPS0U6CisgICAgICAgICAgICBjYXNlIE1JTlVTOgorICAgICAgICAgICAgY2FzZSBPUF9QT1A6CisgICAgICAgICAgICBjYXNlIE9QX1RPUDoKKyAgICAgICAgICAgIGNhc2UgUEVSQ0VOVF9MQ1VSTFk6CisgICAgICAgICAgICBjYXNlIFBMVVM6CisgICAgICAgICAgICBjYXNlIFJhdGlvbmFsTGl0ZXJhbDoKKyAgICAgICAgICAgIGNhc2UgU3RyaW5nTGl0ZXJhbDoKKyAgICAgICAgICAgIGNhc2UgMTU4OgorICAgICAgICAgICAgY2FzZSAxNTk6CisgICAgICAgICAgICBjYXNlIDE2MDoKKyAgICAgICAgICAgIGNhc2UgMTYxOgorICAgICAgICAgICAgY2FzZSAxNjI6CisgICAgICAgICAgICBjYXNlIDIzNzoKKyAgICAgICAgICAgIGNhc2UgMjU2OgorICAgICAgICAgICAgY2FzZSAyNjU6CisgICAgICAgICAgICBjYXNlIDI3NzoKKyAgICAgICAgICAgIGNhc2UgMjgwOgorICAgICAgICAgICAgY2FzZSAyOTQ6CisgICAgICAgICAgICBjYXNlIDMxMzoKKyAgICAgICAgICAgIGNhc2UgMzMwOgorICAgICAgICAgICAgY2FzZSAzMzE6CisgICAgICAgICAgICBjYXNlIDMzMjoKKyAgICAgICAgICAgIGNhc2UgMzQzOgorICAgICAgICAgICAgY2FzZSAzNDc6CisgICAgICAgICAgICBjYXNlIDM3MjoKKyAgICAgICAgICAgIGNhc2UgMzk3OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0OTc9MjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gOTc7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5X3BhcmFtZXRlckV4OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0OTcpCisgICAgICAgICAgICB7CisgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTUzNDo0OiAoIGx2YWx1ZSBvcF9hc3NpZ25fcGFyYW0gKT0+bHY9IGx2YWx1ZSBvYXA9IG9wX2Fzc2lnbl9wYXJhbSBlPSBleHByZXNzaW9uCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19sdmFsdWVfaW5fZGVmX2luc3RhbmNlX29uX25ld19hY3Rpdml0eV9wYXJhbWV0ZXIzNjU5KTsKKyAgICAgICAgCSAgICAgICAgbHY9bHZhbHVlKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlfcGFyYW1ldGVyRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19vcF9hc3NpZ25fcGFyYW1faW5fZGVmX2luc3RhbmNlX29uX25ld19hY3Rpdml0eV9wYXJhbWV0ZXIzNjY0KTsKKyAgICAgICAgCSAgICAgICAgb2FwPW9wX2Fzc2lnbl9wYXJhbShjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5X3BhcmFtZXRlckV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9kZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5X3BhcmFtZXRlcjM2NjkpOworICAgICAgICAJICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2luc3RhbmNlX29uX25ld19hY3Rpdml0eV9wYXJhbWV0ZXJFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGluc3RhbmNlLT5nZXRVbmlxQmVoYXZpb3JQYXJ0KCktPnNlcU9uQ3JlYXRlKCBORVdfU1RNVDIob2FwCisgICAgICAgIAkgICAgICAgICAgICAsIGx2CisgICAgICAgIAkgICAgICAgICAgICAsIGUKKyAgICAgICAgCSAgICAgICAgICAgICkgKTsgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAyOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE1Mzg6NDogZT0gZXhwcmVzc2lvbgorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9kZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5X3BhcmFtZXRlcjM2ODIpOworICAgICAgICAJICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2luc3RhbmNlX29uX25ld19hY3Rpdml0eV9wYXJhbWV0ZXJFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworCisgICAgICAgIAkgICAgICAgICAgICAJICAJc2VwOjpQYXJzZXJVdGlsOjphcHBlbmRJbnN0YW5jZUR5bmFtaWNQb3NpdGlvbmFsUGFyYW1ldGVyKAorICAgICAgICAJICAgICAgICAgICAgCSAgCQkJaW5zdGFuY2UsIGUKKyAgICAgICAgCSAgICAgICAgICAgICwgcG9zaXRpb24pOworICAgICAgICAJICAgICAgICAgICAgCSAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVkZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5X3BhcmFtZXRlckV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZWRlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlfcGFyYW1ldGVyRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSg0MiwgZGVmX2luc3RhbmNlX29uX25ld19hY3Rpdml0eV9wYXJhbWV0ZXJfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGRlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlfcGFyYW1ldGVyICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IG9wX2Fzc2lnbl9wYXJhbQorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTU0NToxOiBvcF9hc3NpZ25fcGFyYW0gcmV0dXJucyBbIHNlcDo6T3BlcmF0b3IgKiBvcCBdIDogKCAoIEFTU0lHTiB8IENPTE9OICkgfCBBU1NJR05fUkVGIHwgQVNTSUdOX01BQ1JPICk7CisgKi8KK3N0YXRpYyBzZXA6Ok9wZXJhdG9yICoKK29wX2Fzc2lnbl9wYXJhbShwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBzZXA6Ok9wZXJhdG9yICogb3A7CisKKyAgICBBTlRMUjNfVUlOVDMyIG9wX2Fzc2lnbl9wYXJhbV9TdGFydEluZGV4OworCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIG9wX2Fzc2lnbl9wYXJhbV9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSg0MykpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gb3A7CisgICAgfQorCisgICAgeworICAgICAgICB7CisgICAgICAgICAgICAvLyAgL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTU0NzoyOiAoICggQVNTSUdOIHwgQ09MT04gKSB8IEFTU0lHTl9SRUYgfCBBU1NJR05fTUFDUk8gKQorCisgICAgICAgICAgICBBTlRMUjNfVUlOVDMyIGFsdDk4OworCisgICAgICAgICAgICBhbHQ5OD0zOworCisgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEFTU0lHTjoKKyAgICAgICAgICAgIGNhc2UgQ09MT046CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ5OD0xOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVNTSUdOX1JFRjoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDk4PTI7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBU1NJR05fTUFDUk86CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ5OD0zOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDk4OworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgZ290byBydWxlb3BfYXNzaWduX3BhcmFtRXg7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQ5OCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNTQ3OjQ6ICggQVNTSUdOIHwgQ09MT04gKQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgaWYgKCBMQSgxKSA9PSBBU1NJR04gfHwgTEEoMSkgPT0gQ09MT04gKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBDT05TVU1FKCk7CisgICAgICAgIAkgICAgICAgICAgICBQRVJST1JSRUNPVkVSWT1BTlRMUjNfRkFMU0U7CisgICAgICAgIAkgICAgICAgICAgICBGQUlMRURGTEFHPUFOVExSM19GQUxTRTsKKworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGVsc2UKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19NSVNNQVRDSEVEX1NFVF9FWENFUFRJT047CisgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPm5hbWUgICAgICAgICA9ICh2b2lkICopQU5UTFIzX01JU01BVENIRURfU0VUX05BTUU7CisgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPmV4cGVjdGluZ1NldCA9IE5VTEw7CisKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW9wX2Fzc2lnbl9wYXJhbUV4OworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBvcD0gT1AoQVNTSUdOKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDI6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTU0ODo0OiBBU1NJR05fUkVGCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKEFTU0lHTl9SRUYsICZGT0xMT1dfQVNTSUdOX1JFRl9pbl9vcF9hc3NpZ25fcGFyYW0zNzE4KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlb3BfYXNzaWduX3BhcmFtRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG9wPSBPUChBU1NJR05fUkVGKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMzoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNTQ5OjQ6IEFTU0lHTl9NQUNSTworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChBU1NJR05fTUFDUk8sICZGT0xMT1dfQVNTSUdOX01BQ1JPX2luX29wX2Fzc2lnbl9wYXJhbTM3MzQpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVvcF9hc3NpZ25fcGFyYW1FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBvcDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgb3A9IE9QKEFTU0lHTl9NQUNSTyk7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVvcF9hc3NpZ25fcGFyYW1FeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVvcF9hc3NpZ25fcGFyYW1FeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDQzLCBvcF9hc3NpZ25fcGFyYW1fU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiBvcDsKK30KKy8qICRBTlRMUiBlbmQgb3BfYXNzaWduX3BhcmFtICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGRlZl9pbnN0YW5jZV9hY3Rpdml0eQorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTU1MzoxOiBkZWZfaW5zdGFuY2VfYWN0aXZpdHlbIHNlcDo6TWFjaGluZSAqIGluc3RhbmNlIF0gOiAoICdAY3JlYXRlJyBicz0gYmxvY2tfc3RhdGVtZW50IHwgJ0BzdGFydCcgYnM9IGJsb2NrX3N0YXRlbWVudCApOworICovCitzdGF0aWMgdm9pZAorZGVmX2luc3RhbmNlX2FjdGl2aXR5KHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBpbnN0YW5jZSkKK3sKKyAgICBBTlRMUjNfVUlOVDMyIGRlZl9pbnN0YW5jZV9hY3Rpdml0eV9TdGFydEluZGV4OworCisgICAgc2VwOjpCRkNvZGUgYnM7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2JzCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9icyBzZXA6OkJGQ29kZQorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGRlZl9pbnN0YW5jZV9hY3Rpdml0eV9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisKKyAgICAJc2VwOjpCZWhhdmlvcmFsUGFydCAqIHRoZUJlaGF2aW9yID0gaW5zdGFuY2UtPmdldFVuaXFCZWhhdmlvclBhcnQoKTsKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoNDQpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vICAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNTU3OjI6ICggJ0BjcmVhdGUnIGJzPSBibG9ja19zdGF0ZW1lbnQgfCAnQHN0YXJ0JyBicz0gYmxvY2tfc3RhdGVtZW50ICkKKworICAgICAgICAgICAgQU5UTFIzX1VJTlQzMiBhbHQ5OTsKKworICAgICAgICAgICAgYWx0OTk9MjsKKworICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAxNzc6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ5OT0xOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjI2OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0OTk9MjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gOTk7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfaW5zdGFuY2VfYWN0aXZpdHlFeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDk5KQorICAgICAgICAgICAgeworICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE1NTc6NDogJ0BjcmVhdGUnIGJzPSBibG9ja19zdGF0ZW1lbnQKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMTc3LCAmRk9MTE9XXzE3N19pbl9kZWZfaW5zdGFuY2VfYWN0aXZpdHkzNzYxKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2luc3RhbmNlX2FjdGl2aXR5RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19ibG9ja19zdGF0ZW1lbnRfaW5fZGVmX2luc3RhbmNlX2FjdGl2aXR5Mzc2Nyk7CisgICAgICAgIAkgICAgICAgIGJzPWJsb2NrX3N0YXRlbWVudChjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfaW5zdGFuY2VfYWN0aXZpdHlFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIHRoZUJlaGF2aW9yLT5zZXFPbkNyZWF0ZShicworICAgICAgICAJICAgICAgICAgICAgKTsgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAyOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE1NTg6NDogJ0BzdGFydCcgYnM9IGJsb2NrX3N0YXRlbWVudAorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgyMjYsICZGT0xMT1dfMjI2X2luX2RlZl9pbnN0YW5jZV9hY3Rpdml0eTM3NzUpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfaW5zdGFuY2VfYWN0aXZpdHlFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfaW5zdGFuY2VfYWN0aXZpdHkzNzgzKTsKKyAgICAgICAgCSAgICAgICAgYnM9YmxvY2tfc3RhdGVtZW50KGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9pbnN0YW5jZV9hY3Rpdml0eUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgdGhlQmVoYXZpb3ItPnNlcU9uU3RhcnQoYnMKKyAgICAgICAgCSAgICAgICAgICAgICk7ICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVkZWZfaW5zdGFuY2VfYWN0aXZpdHlFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVkZWZfaW5zdGFuY2VfYWN0aXZpdHlFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDQ0LCBkZWZfaW5zdGFuY2VfYWN0aXZpdHlfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGRlZl9pbnN0YW5jZV9hY3Rpdml0eSAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBzZWN0aW9uX2JlaGF2aW9yCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNTgzOjE6IHNlY3Rpb25fYmVoYXZpb3JbIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lciBdIDogJ0BiZWhhdmlvcjonIChtPSBleGVjdXRhYmxlX21hY2hpbmVbIGNvbnRhaW5lciBdICkrIDsKKyAqLworc3RhdGljIHZvaWQKK3NlY3Rpb25fYmVoYXZpb3IocGZtbFBhcnNlciBjdHgsIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lcikKK3sKKyAgICBBTlRMUjNfVUlOVDMyIHNlY3Rpb25fYmVoYXZpb3JfU3RhcnRJbmRleDsKKworICAgIHNlcDo6TWFjaGluZSAqIG07CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX20KKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX20gc2VwOjpNYWNoaW5lICoKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBzZWN0aW9uX2JlaGF2aW9yX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDQ1KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNTg0OjI6ICggJ0BiZWhhdmlvcjonIChtPSBleGVjdXRhYmxlX21hY2hpbmVbIGNvbnRhaW5lciBdICkrICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTU4NDo0OiAnQGJlaGF2aW9yOicgKG09IGV4ZWN1dGFibGVfbWFjaGluZVsgY29udGFpbmVyIF0gKSsKKyAgICAgICAgeworICAgICAgICAgICAgIE1BVENIVCgxNzEsICZGT0xMT1dfMTcxX2luX3NlY3Rpb25fYmVoYXZpb3IzODA1KTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlc2VjdGlvbl9iZWhhdmlvckV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTU4NTo0OiAobT0gZXhlY3V0YWJsZV9tYWNoaW5lWyBjb250YWluZXIgXSApKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBjbnQxMDA9MDsKKworICAgICAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTAwPTI7CisgICAgICAgICAgICAJc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAljYXNlIDE0NDoKKyAgICAgICAgICAgIAljYXNlIDE0NToKKyAgICAgICAgICAgIAljYXNlIDE0NzoKKyAgICAgICAgICAgIAljYXNlIDE0ODoKKyAgICAgICAgICAgIAljYXNlIDE0OToKKyAgICAgICAgICAgIAljYXNlIDE1MDoKKyAgICAgICAgICAgIAljYXNlIDE1MzoKKyAgICAgICAgICAgIAljYXNlIDI3MjoKKyAgICAgICAgICAgIAljYXNlIDMwNjoKKyAgICAgICAgICAgIAljYXNlIDMwNzoKKyAgICAgICAgICAgIAljYXNlIDMxNDoKKyAgICAgICAgICAgIAljYXNlIDMxNzoKKyAgICAgICAgICAgIAljYXNlIDMyMjoKKyAgICAgICAgICAgIAljYXNlIDM1MzoKKyAgICAgICAgICAgIAljYXNlIDM3ODoKKyAgICAgICAgICAgIAljYXNlIDM3OToKKyAgICAgICAgICAgIAljYXNlIDM5MzoKKyAgICAgICAgICAgIAljYXNlIDQwNjoKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkJYWx0MTAwPTE7CisgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAl9CisKKyAgICAgICAgICAgIAlzd2l0Y2ggKGFsdDEwMCkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgIGNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE1ODU6NjogbT0gZXhlY3V0YWJsZV9tYWNoaW5lWyBjb250YWluZXIgXQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4ZWN1dGFibGVfbWFjaGluZV9pbl9zZWN0aW9uX2JlaGF2aW9yMzgxNCk7CisgICAgICAgICAgICAJICAgICAgICAgICAgbT1leGVjdXRhYmxlX21hY2hpbmUoY3R4LCBjb250YWluZXIpOworCisgICAgICAgICAgICAJICAgICAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZXNlY3Rpb25fYmVoYXZpb3JFeDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgZGVmYXVsdDoKKworICAgICAgICAgICAgCQlpZiAoIGNudDEwMCA+PSAxICkKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkgICAgZ290byBsb29wMTAwOworICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAJCWlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgCQkgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkJfQorCisgICAgICAgICAgICAJCS8qIG1pc21hdGNoZWRTZXRFeCgpCisgICAgICAgICAgICAJCSAqLworICAgICAgICAgICAgCQlDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgCQlFWENFUFRJT04tPnR5cGUgPSBBTlRMUjNfRUFSTFlfRVhJVF9FWENFUFRJT047CisgICAgICAgICAgICAJCUVYQ0VQVElPTi0+bmFtZSA9ICh2b2lkICopQU5UTFIzX0VBUkxZX0VYSVRfTkFNRTsKKworCisgICAgICAgICAgICAJCWdvdG8gcnVsZXNlY3Rpb25fYmVoYXZpb3JFeDsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJY250MTAwKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxvb3AxMDA6IDsJLyogSnVtcCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZXNlY3Rpb25fYmVoYXZpb3JFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVzZWN0aW9uX2JlaGF2aW9yRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSg0NSwgc2VjdGlvbl9iZWhhdmlvcl9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgc2VjdGlvbl9iZWhhdmlvciAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBkZWZfaW5zdGFuY2VfY291bnQKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE1OTM6MTogZGVmX2luc3RhbmNlX2NvdW50WyBzZXA6OmF2bV9zaXplX3QgJiBpbml0aWFsICwgc2VwOjphdm1fc2l6ZV90ICYgbWF4aW1hbCBdIDogKCAnbXVsdGlwbGljaXR5OicgfCAnaW5zdGFuY2U6JyApPyAoIExCUkFDS0VUIChuPSBpbnRlZ2VyX2NvbnN0YW50IENPTU1BIChuPSBpbnRlZ2VyX2NvbnN0YW50IHwgKCBTVEFSIHwgUExVUyApICkgfCBTVEFSIHwgUExVUyApIFJCUkFDS0VUIHwgTFBBUkVOIGRlZl9pbnN0YW5jZV9jb3VudF9hdG9tWyAkaW5pdGlhbCAsICRtYXhpbWFsIF0gKCAoIENPTU1BICk/IGRlZl9pbnN0YW5jZV9jb3VudF9hdG9tWyAkaW5pdGlhbCAsICRtYXhpbWFsIF0gKSogUlBBUkVOICkgOworICovCitzdGF0aWMgdm9pZAorZGVmX2luc3RhbmNlX2NvdW50KHBmbWxQYXJzZXIgY3R4LCBzZXA6OmF2bV9zaXplX3QgJiBpbml0aWFsLCBzZXA6OmF2bV9zaXplX3QgJiBtYXhpbWFsKQoreworICAgIEFOVExSM19VSU5UMzIgZGVmX2luc3RhbmNlX2NvdW50X1N0YXJ0SW5kZXg7CisKKyAgICBzZXA6OmF2bV9zaXplX3QgbjsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfbgorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfbiBzZXA6OmF2bV9zaXplX3QKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBkZWZfaW5zdGFuY2VfY291bnRfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoNDYpKSApCisgICAgeworICAgICAgICB7CisKKyAgICAgICAgICAgIAlpZiggbWF4aW1hbCA8IGluaXRpYWwgKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJbWF4aW1hbD0gaW5pdGlhbDsKKyAgICAgICAgICAgIAl9CisKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE2MDE6MjogKCAoICdtdWx0aXBsaWNpdHk6JyB8ICdpbnN0YW5jZTonICk/ICggTEJSQUNLRVQgKG49IGludGVnZXJfY29uc3RhbnQgQ09NTUEgKG49IGludGVnZXJfY29uc3RhbnQgfCAoIFNUQVIgfCBQTFVTICkgKSB8IFNUQVIgfCBQTFVTICkgUkJSQUNLRVQgfCBMUEFSRU4gZGVmX2luc3RhbmNlX2NvdW50X2F0b21bICRpbml0aWFsICwgJG1heGltYWwgXSAoICggQ09NTUEgKT8gZGVmX2luc3RhbmNlX2NvdW50X2F0b21bICRpbml0aWFsICwgJG1heGltYWwgXSApKiBSUEFSRU4gKSApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE2MDE6NDogKCAnbXVsdGlwbGljaXR5OicgfCAnaW5zdGFuY2U6JyApPyAoIExCUkFDS0VUIChuPSBpbnRlZ2VyX2NvbnN0YW50IENPTU1BIChuPSBpbnRlZ2VyX2NvbnN0YW50IHwgKCBTVEFSIHwgUExVUyApICkgfCBTVEFSIHwgUExVUyApIFJCUkFDS0VUIHwgTFBBUkVOIGRlZl9pbnN0YW5jZV9jb3VudF9hdG9tWyAkaW5pdGlhbCAsICRtYXhpbWFsIF0gKCAoIENPTU1BICk/IGRlZl9pbnN0YW5jZV9jb3VudF9hdG9tWyAkaW5pdGlhbCAsICRtYXhpbWFsIF0gKSogUlBBUkVOICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTYwMTo0OiAoICdtdWx0aXBsaWNpdHk6JyB8ICdpbnN0YW5jZTonICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDEwMT0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzA4OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDMyNzoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQxMDE9MTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBpZiAoIExBKDEpID09IDMwOCB8fCBMQSgxKSA9PSAzMjcgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIENPTlNVTUUoKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBQRVJST1JSRUNPVkVSWT1BTlRMUjNfRkFMU0U7CisgICAgICAgICAgICAJICAgICAgICAgICAgRkFJTEVERkxBRz1BTlRMUjNfRkFMU0U7CisKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGVsc2UKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19NSVNNQVRDSEVEX1NFVF9FWENFUFRJT047CisgICAgICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT5uYW1lICAgICAgICAgPSAodm9pZCAqKUFOVExSM19NSVNNQVRDSEVEX1NFVF9OQU1FOworICAgICAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+ZXhwZWN0aW5nU2V0ID0gTlVMTDsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9pbnN0YW5jZV9jb3VudEV4OworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTYwMjo0OiAoIExCUkFDS0VUIChuPSBpbnRlZ2VyX2NvbnN0YW50IENPTU1BIChuPSBpbnRlZ2VyX2NvbnN0YW50IHwgKCBTVEFSIHwgUExVUyApICkgfCBTVEFSIHwgUExVUyApIFJCUkFDS0VUIHwgTFBBUkVOIGRlZl9pbnN0YW5jZV9jb3VudF9hdG9tWyAkaW5pdGlhbCAsICRtYXhpbWFsIF0gKCAoIENPTU1BICk/IGRlZl9pbnN0YW5jZV9jb3VudF9hdG9tWyAkaW5pdGlhbCAsICRtYXhpbWFsIF0gKSogUlBBUkVOICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTA2PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIExCUkFDS0VUOgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQxMDY9MTsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIExQQVJFTjoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0MTA2PTI7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDEwNjsKKyAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX2luc3RhbmNlX2NvdW50RXg7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEwNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNjAyOjY6IExCUkFDS0VUIChuPSBpbnRlZ2VyX2NvbnN0YW50IENPTU1BIChuPSBpbnRlZ2VyX2NvbnN0YW50IHwgKCBTVEFSIHwgUExVUyApICkgfCBTVEFSIHwgUExVUyApIFJCUkFDS0VUCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoTEJSQUNLRVQsICZGT0xMT1dfTEJSQUNLRVRfaW5fZGVmX2luc3RhbmNlX2NvdW50Mzg1Nyk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9pbnN0YW5jZV9jb3VudEV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTYwMzo2OiAobj0gaW50ZWdlcl9jb25zdGFudCBDT01NQSAobj0gaW50ZWdlcl9jb25zdGFudCB8ICggU1RBUiB8IFBMVVMgKSApIHwgU1RBUiB8IFBMVVMgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQxMDM9MzsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgSUQ6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBJbnRlZ2VyTGl0ZXJhbDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJYWx0MTAzPTE7CisgICAgICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBTVEFSOgorICAgICAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQlhbHQxMDM9MjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIFBMVVM6CisgICAgICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCWFsdDEwMz0zOworICAgICAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAxMDM7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9pbnN0YW5jZV9jb3VudEV4OworCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQxMDMpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTYwMzo4OiBuPSBpbnRlZ2VyX2NvbnN0YW50IENPTU1BIChuPSBpbnRlZ2VyX2NvbnN0YW50IHwgKCBTVEFSIHwgUExVUyApICkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfaW50ZWdlcl9jb25zdGFudF9pbl9kZWZfaW5zdGFuY2VfY291bnQzODY4KTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIG49aW50ZWdlcl9jb25zdGFudChjdHgpOworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2luc3RhbmNlX2NvdW50RXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIGluaXRpYWw9IAorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIG4KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICA7IAorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoQ09NTUEsICZGT0xMT1dfQ09NTUFfaW5fZGVmX2luc3RhbmNlX2NvdW50Mzg4MCk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9pbnN0YW5jZV9jb3VudEV4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTYwNTo4OiAobj0gaW50ZWdlcl9jb25zdGFudCB8ICggU1RBUiB8IFBMVVMgKSApCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDEwMj0yOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBjYXNlIEludGVnZXJMaXRlcmFsOgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCQlhbHQxMDI9MTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBjYXNlIFBMVVM6CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgY2FzZSBTVEFSOgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCQlhbHQxMDI9MjsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMTAyOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfaW5zdGFuY2VfY291bnRFeDsKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTAyKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE2MDU6MTA6IG49IGludGVnZXJfY29uc3RhbnQKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfaW50ZWdlcl9jb25zdGFudF9pbl9kZWZfaW5zdGFuY2VfY291bnQzODkzKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIG49aW50ZWdlcl9jb25zdGFudChjdHgpOworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2luc3RhbmNlX2NvdW50RXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIG1heGltYWw9IAorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIG4KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICA7IAorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAljYXNlIDI6CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE2MDY6MTA6ICggU1RBUiB8IFBMVVMgKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIExBKDEpID09IFBMVVMgfHwgTEEoMSkgPT0gU1RBUiApCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgQ09OU1VNRSgpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIFBFUlJPUlJFQ09WRVJZPUFOVExSM19GQUxTRTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBGQUlMRURGTEFHPUFOVExSM19GQUxTRTsKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgZWxzZQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX01JU01BVENIRURfU0VUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPm5hbWUgICAgICAgICA9ICh2b2lkICopQU5UTFIzX01JU01BVENIRURfU0VUX05BTUU7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT5leHBlY3RpbmdTZXQgPSBOVUxMOworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2luc3RhbmNlX2NvdW50RXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICBtYXhpbWFsPSBBVk1fTlVNRVJJQ19NQVhfU0laRV9UOyAKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDI6CisgICAgICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE2MDg6ODogU1RBUgorICAgICAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKFNUQVIsICZGT0xMT1dfU1RBUl9pbl9kZWZfaW5zdGFuY2VfY291bnQzOTM5KTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2luc3RhbmNlX2NvdW50RXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIGluaXRpYWw9IDA7IG1heGltYWw9IEFWTV9OVU1FUklDX01BWF9TSVpFX1Q7IAorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDM6CisgICAgICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE2MDk6ODogUExVUworICAgICAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKFBMVVMsICZGT0xMT1dfUExVU19pbl9kZWZfaW5zdGFuY2VfY291bnQzOTUxKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2luc3RhbmNlX2NvdW50RXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIGluaXRpYWw9IDE7IG1heGltYWw9IEFWTV9OVU1FUklDX01BWF9TSVpFX1Q7IAorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChSQlJBQ0tFVCwgJkZPTExPV19SQlJBQ0tFVF9pbl9kZWZfaW5zdGFuY2VfY291bnQzOTY4KTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2luc3RhbmNlX2NvdW50RXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAyOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNjEzOjY6IExQQVJFTiBkZWZfaW5zdGFuY2VfY291bnRfYXRvbVsgJGluaXRpYWwgLCAkbWF4aW1hbCBdICggKCBDT01NQSApPyBkZWZfaW5zdGFuY2VfY291bnRfYXRvbVsgJGluaXRpYWwgLCAkbWF4aW1hbCBdICkqIFJQQVJFTgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKExQQVJFTiwgJkZPTExPV19MUEFSRU5faW5fZGVmX2luc3RhbmNlX2NvdW50Mzk3Nik7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9pbnN0YW5jZV9jb3VudEV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX2luc3RhbmNlX2NvdW50X2F0b21faW5fZGVmX2luc3RhbmNlX2NvdW50Mzk4Myk7CisgICAgICAgICAgICAJICAgICAgICBkZWZfaW5zdGFuY2VfY291bnRfYXRvbShjdHgsIGluaXRpYWwsIG1heGltYWwpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2luc3RhbmNlX2NvdW50RXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNjE1OjY6ICggKCBDT01NQSApPyBkZWZfaW5zdGFuY2VfY291bnRfYXRvbVsgJGluaXRpYWwgLCAkbWF4aW1hbCBdICkqCisKKyAgICAgICAgICAgIAkgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDEwNT0yOworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBDT01NQToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI5NzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMxOToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJYWx0MTA1PTE7CisgICAgICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDEwNSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNjE1Ojg6ICggQ09NTUEgKT8gZGVmX2luc3RhbmNlX2NvdW50X2F0b21bICRpbml0aWFsICwgJG1heGltYWwgXQorICAgICAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNjE1Ojg6ICggQ09NTUEgKT8KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0MTA0PTI7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBDT01NQToKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgCQlhbHQxMDQ9MTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTA0KQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE2MTU6ODogQ09NTUEKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChDT01NQSwgJkZPTExPV19DT01NQV9pbl9kZWZfaW5zdGFuY2VfY291bnQzOTkzKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2luc3RhbmNlX2NvdW50RXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlZl9pbnN0YW5jZV9jb3VudF9hdG9tX2luX2RlZl9pbnN0YW5jZV9jb3VudDM5OTgpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgZGVmX2luc3RhbmNlX2NvdW50X2F0b20oY3R4LCBpbml0aWFsLCBtYXhpbWFsKTsKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9pbnN0YW5jZV9jb3VudEV4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAJZGVmYXVsdDoKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgZ290byBsb29wMTA1OwkvKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgKi8KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgbG9vcDEwNTogOyAvKiBKdW1wIG91dCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworCisKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoUlBBUkVOLCAmRk9MTE9XX1JQQVJFTl9pbl9kZWZfaW5zdGFuY2VfY291bnQ0MDA5KTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2luc3RhbmNlX2NvdW50RXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlZGVmX2luc3RhbmNlX2NvdW50RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlZGVmX2luc3RhbmNlX2NvdW50RXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIAlpZiggbWF4aW1hbCA8IGluaXRpYWwgKQorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCW1heGltYWw9IGluaXRpYWw7CisgICAgICAgICAgICAgICAgICAgIAl9CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKworICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoNDYsIGRlZl9pbnN0YW5jZV9jb3VudF9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgZGVmX2luc3RhbmNlX2NvdW50ICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGRlZl9pbnN0YW5jZV9jb3VudF9hdG9tCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNjIwOjE6IGRlZl9pbnN0YW5jZV9jb3VudF9hdG9tWyBzZXA6OmF2bV9zaXplX3QgJiBpbml0aWFsICwgc2VwOjphdm1fc2l6ZV90ICYgbWF4aW1hbCBdIDogKCAnaW5pdDonIG49IGludGVnZXJfY29uc3RhbnQgfCAnbWF4Oicgbj0gaW50ZWdlcl9jb25zdGFudCApOworICovCitzdGF0aWMgdm9pZAorZGVmX2luc3RhbmNlX2NvdW50X2F0b20ocGZtbFBhcnNlciBjdHgsIHNlcDo6YXZtX3NpemVfdCAmIGluaXRpYWwsIHNlcDo6YXZtX3NpemVfdCAmIG1heGltYWwpCit7CisgICAgQU5UTFIzX1VJTlQzMiBkZWZfaW5zdGFuY2VfY291bnRfYXRvbV9TdGFydEluZGV4OworCisgICAgc2VwOjphdm1fc2l6ZV90IG47CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX24KKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX24gc2VwOjphdm1fc2l6ZV90CisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgZGVmX2luc3RhbmNlX2NvdW50X2F0b21fU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoNDcpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vICAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNjIyOjI6ICggJ2luaXQ6JyBuPSBpbnRlZ2VyX2NvbnN0YW50IHwgJ21heDonIG49IGludGVnZXJfY29uc3RhbnQgKQorCisgICAgICAgICAgICBBTlRMUjNfVUlOVDMyIGFsdDEwNzsKKworICAgICAgICAgICAgYWx0MTA3PTI7CisKKyAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMjk3OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MTA3PTE7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzMTk6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQxMDc9MjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMTA3OworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX2luc3RhbmNlX2NvdW50X2F0b21FeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDEwNykKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNjIyOjQ6ICdpbml0Oicgbj0gaW50ZWdlcl9jb25zdGFudAorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgyOTcsICZGT0xMT1dfMjk3X2luX2RlZl9pbnN0YW5jZV9jb3VudF9hdG9tNDAyOCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9pbnN0YW5jZV9jb3VudF9hdG9tRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19pbnRlZ2VyX2NvbnN0YW50X2luX2RlZl9pbnN0YW5jZV9jb3VudF9hdG9tNDAzMik7CisgICAgICAgIAkgICAgICAgIG49aW50ZWdlcl9jb25zdGFudChjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfaW5zdGFuY2VfY291bnRfYXRvbUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgaW5pdGlhbD0gCisgICAgICAgIAkgICAgICAgICAgICBuCisgICAgICAgIAkgICAgICAgICAgICA7IAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNjIzOjQ6ICdtYXg6JyBuPSBpbnRlZ2VyX2NvbnN0YW50CisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDMxOSwgJkZPTExPV18zMTlfaW5fZGVmX2luc3RhbmNlX2NvdW50X2F0b200MDQwKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2luc3RhbmNlX2NvdW50X2F0b21FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fZGVmX2luc3RhbmNlX2NvdW50X2F0b200MDQ1KTsKKyAgICAgICAgCSAgICAgICAgbj1pbnRlZ2VyX2NvbnN0YW50KGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9pbnN0YW5jZV9jb3VudF9hdG9tRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBtYXhpbWFsPSAKKyAgICAgICAgCSAgICAgICAgICAgIG4KKyAgICAgICAgCSAgICAgICAgICAgIDsgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVkZWZfaW5zdGFuY2VfY291bnRfYXRvbUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZWRlZl9pbnN0YW5jZV9jb3VudF9hdG9tRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSg0NywgZGVmX2luc3RhbmNlX2NvdW50X2F0b21fU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGRlZl9pbnN0YW5jZV9jb3VudF9hdG9tICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGRlZl9tYWNoaW5lCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNjI3OjE6IGRlZl9tYWNoaW5lWyBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIgLFxuXHRcdHNlcDo6TW9kaWZpZXIgbWRmciAsIHNlcDo6U3BlY2lmaWVyIHNwY2ZyIF0gcmV0dXJucyBbIHNlcDo6TWFjaGluZSAqIG1hY2hpbmUgXSA6ICdtYWNoaW5lJyAoIExUXyAoICggJ21vYzonICk/IGV4ZWN1dGFibGVfc3BlY2lmaWVyWyBzcGNmciBdICggQ09NTUEgZGVmX2luc3RhbmNlX2NvdW50WyBpbml0aWFsQ291bnQgLCBtYXhpbWFsQ291bnQgXSApPyB8IGRlZl9pbnN0YW5jZV9jb3VudFsgaW5pdGlhbENvdW50ICwgbWF4aW1hbENvdW50IF0gKT8gR1QgKT8gaWQ9IElEICggU3RyaW5nTGl0ZXJhbCApPyAoIGRlZl9tYWNoaW5lX3BhcmFtZXRlcnNbIG1hY2hpbmUgXSApPyAoIGRlZl9tYWNoaW5lX3JldHVybnNbIG1hY2hpbmUgLCBzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9SRVRVUk5fUEFSQU1FVEVSX01PRElGSUVSIF0gKT8gZGVmX2JvZHlfbWFjaGluZVsgbWFjaGluZSBdIDsKKyAqLworc3RhdGljIHNlcDo6TWFjaGluZSAqCitkZWZfbWFjaGluZShwZm1sUGFyc2VyIGN0eCwgc2VwOjpNYWNoaW5lICogY29udGFpbmVyLCBzZXA6Ok1vZGlmaWVyIG1kZnIsIHNlcDo6U3BlY2lmaWVyIHNwY2ZyKQoreworICAgIHNlcDo6TWFjaGluZSAqIG1hY2hpbmU7CisKKyAgICBBTlRMUjNfVUlOVDMyIGRlZl9tYWNoaW5lX1N0YXJ0SW5kZXg7CisKKyAgICBwQU5UTFIzX0NPTU1PTl9UT0tFTiAgICBpZDsKKyAgICBwQU5UTFIzX0NPTU1PTl9UT0tFTiAgICBTdHJpbmdMaXRlcmFsNTsKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBkZWZfbWFjaGluZV9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisKKyAgICAJc2VwOjphdm1fc2l6ZV90IGluaXRpYWxDb3VudCA9IDE7CisgICAgCXNlcDo6YXZtX3NpemVfdCBtYXhpbWFsQ291bnQgPSBBVk1fTlVNRVJJQ19NQVhfU0laRV9UOworCisgICAgCVNBVkVfUlVMRV9CRUdJTl9MT0NBVElPTjsKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoNDgpKSApCisgICAgeworICAgICAgICB7CisKKyAgICAgICAgICAgIAlQT1BfQ1RYOworCisgICAgICAgICAgICAJU0VUX1JVTEVfTE9DQVRJT04obWFjaGluZSk7CisKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIG1hY2hpbmU7CisgICAgfQorCisgICAgaWQgICAgICAgPSBOVUxMOworICAgIFN0cmluZ0xpdGVyYWw1ICAgICAgID0gTlVMTDsKKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTY0MjoyOiAoICdtYWNoaW5lJyAoIExUXyAoICggJ21vYzonICk/IGV4ZWN1dGFibGVfc3BlY2lmaWVyWyBzcGNmciBdICggQ09NTUEgZGVmX2luc3RhbmNlX2NvdW50WyBpbml0aWFsQ291bnQgLCBtYXhpbWFsQ291bnQgXSApPyB8IGRlZl9pbnN0YW5jZV9jb3VudFsgaW5pdGlhbENvdW50ICwgbWF4aW1hbENvdW50IF0gKT8gR1QgKT8gaWQ9IElEICggU3RyaW5nTGl0ZXJhbCApPyAoIGRlZl9tYWNoaW5lX3BhcmFtZXRlcnNbIG1hY2hpbmUgXSApPyAoIGRlZl9tYWNoaW5lX3JldHVybnNbIG1hY2hpbmUgLCBzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9SRVRVUk5fUEFSQU1FVEVSX01PRElGSUVSIF0gKT8gZGVmX2JvZHlfbWFjaGluZVsgbWFjaGluZSBdICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTY0Mjo0OiAnbWFjaGluZScgKCBMVF8gKCAoICdtb2M6JyApPyBleGVjdXRhYmxlX3NwZWNpZmllclsgc3BjZnIgXSAoIENPTU1BIGRlZl9pbnN0YW5jZV9jb3VudFsgaW5pdGlhbENvdW50ICwgbWF4aW1hbENvdW50IF0gKT8gfCBkZWZfaW5zdGFuY2VfY291bnRbIGluaXRpYWxDb3VudCAsIG1heGltYWxDb3VudCBdICk/IEdUICk/IGlkPSBJRCAoIFN0cmluZ0xpdGVyYWwgKT8gKCBkZWZfbWFjaGluZV9wYXJhbWV0ZXJzWyBtYWNoaW5lIF0gKT8gKCBkZWZfbWFjaGluZV9yZXR1cm5zWyBtYWNoaW5lICwgc2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfUkVUVVJOX1BBUkFNRVRFUl9NT0RJRklFUiBdICk/IGRlZl9ib2R5X21hY2hpbmVbIG1hY2hpbmUgXQorICAgICAgICB7CisgICAgICAgICAgICAgTUFUQ0hUKDMxNywgJkZPTExPV18zMTdfaW5fZGVmX21hY2hpbmU0MDc1KTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX21hY2hpbmVFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWFjaGluZTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNjQzOjQ6ICggTFRfICggKCAnbW9jOicgKT8gZXhlY3V0YWJsZV9zcGVjaWZpZXJbIHNwY2ZyIF0gKCBDT01NQSBkZWZfaW5zdGFuY2VfY291bnRbIGluaXRpYWxDb3VudCAsIG1heGltYWxDb3VudCBdICk/IHwgZGVmX2luc3RhbmNlX2NvdW50WyBpbml0aWFsQ291bnQgLCBtYXhpbWFsQ291bnQgXSApPyBHVCApPworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQxMTE9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIExUXzoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQxMTE9MTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTExKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE2NDM6NjogTFRfICggKCAnbW9jOicgKT8gZXhlY3V0YWJsZV9zcGVjaWZpZXJbIHNwY2ZyIF0gKCBDT01NQSBkZWZfaW5zdGFuY2VfY291bnRbIGluaXRpYWxDb3VudCAsIG1heGltYWxDb3VudCBdICk/IHwgZGVmX2luc3RhbmNlX2NvdW50WyBpbml0aWFsQ291bnQgLCBtYXhpbWFsQ291bnQgXSApPyBHVAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKExUXywgJkZPTExPV19MVF9faW5fZGVmX21hY2hpbmU0MDgyKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX21hY2hpbmVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gbWFjaGluZTsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNjQ0OjU6ICggKCAnbW9jOicgKT8gZXhlY3V0YWJsZV9zcGVjaWZpZXJbIHNwY2ZyIF0gKCBDT01NQSBkZWZfaW5zdGFuY2VfY291bnRbIGluaXRpYWxDb3VudCAsIG1heGltYWxDb3VudCBdICk/IHwgZGVmX2luc3RhbmNlX2NvdW50WyBpbml0aWFsQ291bnQgLCBtYXhpbWFsQ291bnQgXSApPworICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQxMTA9MzsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIElEOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDE1MToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAxNTI6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMjM5OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDI1NzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAyODI6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMjg0OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDI4NjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzMTI6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzIxOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDMzNDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzNjQ6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzc3OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJCWFsdDExMD0xOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgTEJSQUNLRVQ6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgTFBBUkVOOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDMwODoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzMjc6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAkJYWx0MTEwPTI7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDExMCkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNjQ0Ojc6ICggJ21vYzonICk/IGV4ZWN1dGFibGVfc3BlY2lmaWVyWyBzcGNmciBdICggQ09NTUEgZGVmX2luc3RhbmNlX2NvdW50WyBpbml0aWFsQ291bnQgLCBtYXhpbWFsQ291bnQgXSApPworICAgICAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNjQ0Ojc6ICggJ21vYzonICk/CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDEwOD0yOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzIxOgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAJCWFsdDEwOD0xOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQxMDgpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTY0NDo5OiAnbW9jOicKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVCgzMjEsICZGT0xMT1dfMzIxX2luX2RlZl9tYWNoaW5lNDA5Mik7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9tYWNoaW5lRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG1hY2hpbmU7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leGVjdXRhYmxlX3NwZWNpZmllcl9pbl9kZWZfbWFjaGluZTQwOTgpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgZXhlY3V0YWJsZV9zcGVjaWZpZXIoY3R4LCBzcGNmcik7CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfbWFjaGluZUV4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBtYWNoaW5lOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE2NDU6NjogKCBDT01NQSBkZWZfaW5zdGFuY2VfY291bnRbIGluaXRpYWxDb3VudCAsIG1heGltYWxDb3VudCBdICk/CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDEwOT0yOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgQ09NTUE6CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIAkJYWx0MTA5PTE7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDEwOSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNjQ1Ojg6IENPTU1BIGRlZl9pbnN0YW5jZV9jb3VudFsgaW5pdGlhbENvdW50ICwgbWF4aW1hbENvdW50IF0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChDT01NQSwgJkZPTExPV19DT01NQV9pbl9kZWZfbWFjaGluZTQxMDgpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfbWFjaGluZUV4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBtYWNoaW5lOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlZl9pbnN0YW5jZV9jb3VudF9pbl9kZWZfbWFjaGluZTQxMTEpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgZGVmX2luc3RhbmNlX2NvdW50KGN0eCwgaW5pdGlhbENvdW50LCBtYXhpbWFsQ291bnQpOworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX21hY2hpbmVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gbWFjaGluZTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDI6CisgICAgICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE2NDc6NzogZGVmX2luc3RhbmNlX2NvdW50WyBpbml0aWFsQ291bnQgLCBtYXhpbWFsQ291bnQgXQorICAgICAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfaW5zdGFuY2VfY291bnRfaW5fZGVmX21hY2hpbmU0MTI0KTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGRlZl9pbnN0YW5jZV9jb3VudChjdHgsIGluaXRpYWxDb3VudCwgbWF4aW1hbENvdW50KTsKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9tYWNoaW5lRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG1hY2hpbmU7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKEdULCAmRk9MTE9XX0dUX2luX2RlZl9tYWNoaW5lNDEzNyk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9tYWNoaW5lRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG1hY2hpbmU7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZCA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTikgTUFUQ0hUKElELCAmRk9MTE9XX0lEX2luX2RlZl9tYWNoaW5lNDE0Nyk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9tYWNoaW5lRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1hY2hpbmU7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgCSAgCVBVU0hfQ1RYX0NQTSggbWFjaGluZT0gc2VwOjpNYWNoaW5lOjpuZXdFeGVjdXRhYmxlKAorICAgICAgICAgICAgICAgIAkgIAkJCWNvbnRhaW5lciwgU1RSKChpZC0+Z2V0VGV4dChpZCkpLT5jaGFycyksIHNwY2ZyKSApOworCisKKyAgICAgICAgICAgICAgICAJCW1hY2hpbmUKKyAgICAgICAgICAgICAgICAtPmdldHdNb2RpZmllcigpLm92ZXJyaWRlX2lmZGVmKCBtZGZyICk7CisKKyAgICAgICAgICAgICAgICAJICAJY29udGFpbmVyLT5zYXZlT3duZWRFbGVtZW50KCBtYWNoaW5lCisgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICAJCW1hY2hpbmUKKyAgICAgICAgICAgICAgICAtPmdldFVuaXFJbnN0YW5jZVNwZWNpZmllcigpLT4KKyAgICAgICAgICAgICAgICAJCQkJc2V0SW5zdGFuY2VDb3VudChpbml0aWFsQ291bnQsIG1heGltYWxDb3VudCk7CisgICAgICAgICAgICAgICAgCSAgCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTY2Mzo0OiAoIFN0cmluZ0xpdGVyYWwgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTEyPTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTdHJpbmdMaXRlcmFsOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDExMj0xOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMTIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTY2Mzo2OiBTdHJpbmdMaXRlcmFsCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIFN0cmluZ0xpdGVyYWw1ID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoU3RyaW5nTGl0ZXJhbCwgJkZPTExPV19TdHJpbmdMaXRlcmFsX2luX2RlZl9tYWNoaW5lNDE2MCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9tYWNoaW5lRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG1hY2hpbmU7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBtYWNoaW5lCisgICAgICAgICAgICAJICAgICAgICAgICAgLT5zZXRVbnJlc3RyaWN0ZWROYW1lKFNUUigoU3RyaW5nTGl0ZXJhbDUtPmdldFRleHQoU3RyaW5nTGl0ZXJhbDUpKS0+Y2hhcnMpKTsgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNjY3OjQ6ICggZGVmX21hY2hpbmVfcGFyYW1ldGVyc1sgbWFjaGluZSBdICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDExMz0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTEJSQUNLRVQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTFBBUkVOOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDExMz0xOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMTMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTY2Nzo0OiBkZWZfbWFjaGluZV9wYXJhbWV0ZXJzWyBtYWNoaW5lIF0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX21hY2hpbmVfcGFyYW1ldGVyc19pbl9kZWZfbWFjaGluZTQxNzcpOworICAgICAgICAgICAgCSAgICAgICAgZGVmX21hY2hpbmVfcGFyYW1ldGVycyhjdHgsIG1hY2hpbmUpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX21hY2hpbmVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gbWFjaGluZTsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE2Njk6NDogKCBkZWZfbWFjaGluZV9yZXR1cm5zWyBtYWNoaW5lICwgc2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfUkVUVVJOX1BBUkFNRVRFUl9NT0RJRklFUiBdICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDExND0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTYzOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM2NToKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQxMTQ9MTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTE0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE2Njk6NDogZGVmX21hY2hpbmVfcmV0dXJuc1sgbWFjaGluZSAsIHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX1JFVFVSTl9QQVJBTUVURVJfTU9ESUZJRVIgXQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfbWFjaGluZV9yZXR1cm5zX2luX2RlZl9tYWNoaW5lNDE4Nik7CisgICAgICAgICAgICAJICAgICAgICBkZWZfbWFjaGluZV9yZXR1cm5zKGN0eCwgbWFjaGluZSwgc2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfUkVUVVJOX1BBUkFNRVRFUl9NT0RJRklFUik7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfbWFjaGluZUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBtYWNoaW5lOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX2JvZHlfbWFjaGluZV9pbl9kZWZfbWFjaGluZTQxOTUpOworICAgICAgICAgICAgZGVmX2JvZHlfbWFjaGluZShjdHgsIG1hY2hpbmUpOworCisgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX21hY2hpbmVFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWFjaGluZTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZWRlZl9tYWNoaW5lRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlZGVmX21hY2hpbmVFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgCVBPUF9DVFg7CisKKyAgICAgICAgICAgICAgICAgICAgCVNFVF9SVUxFX0xPQ0FUSU9OKG1hY2hpbmUpOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisKKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDQ4LCBkZWZfbWFjaGluZV9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIG1hY2hpbmU7Cit9CisvKiAkQU5UTFIgZW5kIGRlZl9tYWNoaW5lICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9oZWFkZXJfcHJlZGljYXQKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE2NzU6MTogZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX2hlYWRlcl9wcmVkaWNhdCA6ICdAaGVhZGVyOicgOworICovCitzdGF0aWMgdm9pZAorZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX2hlYWRlcl9wcmVkaWNhdChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBBTlRMUjNfVUlOVDMyIGRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9oZWFkZXJfcHJlZGljYXRfU3RhcnRJbmRleDsKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25faGVhZGVyX3ByZWRpY2F0X1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDQ5KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNjc2OjI6ICggJ0BoZWFkZXI6JyApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE2NzY6NDogJ0BoZWFkZXI6JworICAgICAgICB7CisgICAgICAgICAgICAgTUFUQ0hUKDE4OCwgJkZPTExPV18xODhfaW5fZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX2hlYWRlcl9wcmVkaWNhdDQyMDgpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25faGVhZGVyX3ByZWRpY2F0RXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZWRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9oZWFkZXJfcHJlZGljYXRFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25faGVhZGVyX3ByZWRpY2F0RXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSg0OSwgZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX2hlYWRlcl9wcmVkaWNhdF9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX2hlYWRlcl9wcmVkaWNhdCAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25faW1wb3J0X3ByZWRpY2F0CisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNjc5OjE6IGRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9pbXBvcnRfcHJlZGljYXQgOiAnQGltcG9ydDonIDsKKyAqLworc3RhdGljIHZvaWQKK2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9pbXBvcnRfcHJlZGljYXQocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX1VJTlQzMiBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25faW1wb3J0X3ByZWRpY2F0X1N0YXJ0SW5kZXg7CisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX2ltcG9ydF9wcmVkaWNhdF9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSg1MCkpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTY4MDoyOiAoICdAaW1wb3J0OicgKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNjgwOjQ6ICdAaW1wb3J0OicKKyAgICAgICAgeworICAgICAgICAgICAgIE1BVENIVCgxOTIsICZGT0xMT1dfMTkyX2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9pbXBvcnRfcHJlZGljYXQ0MjE5KTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX2ltcG9ydF9wcmVkaWNhdEV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25faW1wb3J0X3ByZWRpY2F0RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX2ltcG9ydF9wcmVkaWNhdEV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoNTAsIGRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9pbXBvcnRfcHJlZGljYXRfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9pbXBvcnRfcHJlZGljYXQgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3BhcmFtZXRlcl9wcmVkaWNhdAorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTY4MzoxOiBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcGFyYW1ldGVyX3ByZWRpY2F0IDogKCAnQHBhcmFtZXRlcjonIHwgJ0BwYXJhbTonIHwgJ0BpbnB1dDonIHwgJ0Bpbm91dDonIHwgJ0BvdXRwdXQ6JyB8ICdAcmV0dXJuczonIHwgJ0ByZXR1cm46JyApOworICovCitzdGF0aWMgdm9pZAorZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3BhcmFtZXRlcl9wcmVkaWNhdChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBBTlRMUjNfVUlOVDMyIGRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wYXJhbWV0ZXJfcHJlZGljYXRfU3RhcnRJbmRleDsKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcGFyYW1ldGVyX3ByZWRpY2F0X1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDUxKSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNjg0OjI6ICggJ0BwYXJhbWV0ZXI6JyB8ICdAcGFyYW06JyB8ICdAaW5wdXQ6JyB8ICdAaW5vdXQ6JyB8ICdAb3V0cHV0OicgfCAnQHJldHVybnM6JyB8ICdAcmV0dXJuOicgKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCAoKExBKDEpID49IDE5NSkgJiYgKExBKDEpIDw9IDE5NikpIHx8IExBKDEpID09IDIwNyB8fCAoKExBKDEpID49IDIwOSkgJiYgKExBKDEpIDw9IDIxMCkpIHx8ICgoTEEoMSkgPj0gMjE5KSAmJiAoTEEoMSkgPD0gMjIwKSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENPTlNVTUUoKTsKKyAgICAgICAgICAgICAgICBQRVJST1JSRUNPVkVSWT1BTlRMUjNfRkFMU0U7CisgICAgICAgICAgICAgICAgRkFJTEVERkxBRz1BTlRMUjNfRkFMU0U7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19NSVNNQVRDSEVEX1NFVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5uYW1lICAgICAgICAgPSAodm9pZCAqKUFOVExSM19NSVNNQVRDSEVEX1NFVF9OQU1FOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZXhwZWN0aW5nU2V0ID0gTlVMTDsKKworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wYXJhbWV0ZXJfcHJlZGljYXRFeDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZWRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wYXJhbWV0ZXJfcHJlZGljYXRFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcGFyYW1ldGVyX3ByZWRpY2F0RXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSg1MSwgZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3BhcmFtZXRlcl9wcmVkaWNhdF9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3BhcmFtZXRlcl9wcmVkaWNhdCAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJvcGVydHlfcHJlZGljYXQKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE2ODk6MTogZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3Byb3BlcnR5X3ByZWRpY2F0IDogKCAnQHByb3BlcnR5OicgfCAnQHB1YmxpYzonIHwgJ0Bwcm90ZWN0ZWQ6JyB8ICdAcHJpdmF0ZTonIHwgJ0BkZWNsYXJhdGlvbjonICk7CisgKi8KK3N0YXRpYyB2b2lkCitkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJvcGVydHlfcHJlZGljYXQocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX1VJTlQzMiBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJvcGVydHlfcHJlZGljYXRfU3RhcnRJbmRleDsKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJvcGVydHlfcHJlZGljYXRfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoNTIpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE2OTA6MjogKCAnQHByb3BlcnR5OicgfCAnQHB1YmxpYzonIHwgJ0Bwcm90ZWN0ZWQ6JyB8ICdAcHJpdmF0ZTonIHwgJ0BkZWNsYXJhdGlvbjonICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggTEEoMSkgPT0gMTc4IHx8IExBKDEpID09IDIxMSB8fCAoKExBKDEpID49IDIxMykgJiYgKExBKDEpIDw9IDIxNCkpIHx8IExBKDEpID09IDIxNiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ09OU1VNRSgpOworICAgICAgICAgICAgICAgIFBFUlJPUlJFQ09WRVJZPUFOVExSM19GQUxTRTsKKyAgICAgICAgICAgICAgICBGQUlMRURGTEFHPUFOVExSM19GQUxTRTsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX01JU01BVENIRURfU0VUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPm5hbWUgICAgICAgICA9ICh2b2lkICopQU5UTFIzX01JU01BVENIRURfU0VUX05BTUU7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5leHBlY3RpbmdTZXQgPSBOVUxMOworCisgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3Byb3BlcnR5X3ByZWRpY2F0RXg7CisgICAgICAgICAgICB9CisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJvcGVydHlfcHJlZGljYXRFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJvcGVydHlfcHJlZGljYXRFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDUyLCBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJvcGVydHlfcHJlZGljYXRfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcm9wZXJ0eV9wcmVkaWNhdCAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJlZGljYXQKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE2OTU6MTogZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0IDogKCBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25faGVhZGVyX3ByZWRpY2F0IHwgZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX2ltcG9ydF9wcmVkaWNhdCB8IGRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wYXJhbWV0ZXJfcHJlZGljYXQgfCBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJvcGVydHlfcHJlZGljYXQgfCAnQG1hY3JvOicgfCAnQHJvdXRpbmUnIHwgJ0Bwcm9jZWR1cmU6JyB8ICdAY29tcG9zaXRlJyB8ICdAbWFjaGluZTonIHwgJ0ByZWdpb246JyB8ICdAc3RhdGVtYWNoaW5lOicgfCAnQGJlaGF2aW9yOicgfCAnQHRyYW5zaXRpb246JyB8ICdAbW9jOicgfCAnQG1vZTonIHwgJ0Bjb206JyB8ICdAaW50ZXJhY3Rpb246JyApOworICovCitzdGF0aWMgdm9pZAorZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0KHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19VSU5UMzIgZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0X1N0YXJ0SW5kZXg7CisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0X1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDUzKSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgeworICAgICAgICB7CisgICAgICAgICAgICAvLyAgL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTY5NjoyOiAoIGRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9oZWFkZXJfcHJlZGljYXQgfCBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25faW1wb3J0X3ByZWRpY2F0IHwgZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3BhcmFtZXRlcl9wcmVkaWNhdCB8IGRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcm9wZXJ0eV9wcmVkaWNhdCB8ICdAbWFjcm86JyB8ICdAcm91dGluZScgfCAnQHByb2NlZHVyZTonIHwgJ0Bjb21wb3NpdGUnIHwgJ0BtYWNoaW5lOicgfCAnQHJlZ2lvbjonIHwgJ0BzdGF0ZW1hY2hpbmU6JyB8ICdAYmVoYXZpb3I6JyB8ICdAdHJhbnNpdGlvbjonIHwgJ0Btb2M6JyB8ICdAbW9lOicgfCAnQGNvbTonIHwgJ0BpbnRlcmFjdGlvbjonICkKKworICAgICAgICAgICAgQU5UTFIzX1VJTlQzMiBhbHQxMTU7CisKKyAgICAgICAgICAgIGFsdDExNT0xNzsKKworICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAxODg6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQxMTU9MTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE5MjoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDExNT0yOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTk1OgorICAgICAgICAgICAgY2FzZSAxOTY6CisgICAgICAgICAgICBjYXNlIDIwNzoKKyAgICAgICAgICAgIGNhc2UgMjA5OgorICAgICAgICAgICAgY2FzZSAyMTA6CisgICAgICAgICAgICBjYXNlIDIxOToKKyAgICAgICAgICAgIGNhc2UgMjIwOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MTE1PTM7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNzg6CisgICAgICAgICAgICBjYXNlIDIxMToKKyAgICAgICAgICAgIGNhc2UgMjEzOgorICAgICAgICAgICAgY2FzZSAyMTQ6CisgICAgICAgICAgICBjYXNlIDIxNjoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDExNT00OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjAxOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MTE1PTU7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMjE6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQxMTU9NjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIxMjoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDExNT03OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTczOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MTE1PTg7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMDA6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQxMTU9OTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIxNzoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDExNT0xMDsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIyNzoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDExNT0xMTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE3MToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDExNT0xMjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIzMToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDExNT0xMzsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIwMjoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDExNT0xNDsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIwNDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDExNT0xNTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE3MjoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDExNT0xNjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE5ODoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDExNT0xNzsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMTE1OworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0RXg7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQxMTUpCisgICAgICAgICAgICB7CisgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTY5Njo0OiBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25faGVhZGVyX3ByZWRpY2F0CisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25faGVhZGVyX3ByZWRpY2F0X2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdDQzMTMpOworICAgICAgICAJICAgICAgICBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25faGVhZGVyX3ByZWRpY2F0KGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDI6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTY5Nzo0OiBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25faW1wb3J0X3ByZWRpY2F0CisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25faW1wb3J0X3ByZWRpY2F0X2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdDQzMTgpOworICAgICAgICAJICAgICAgICBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25faW1wb3J0X3ByZWRpY2F0KGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDM6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTY5ODo0OiBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcGFyYW1ldGVyX3ByZWRpY2F0CisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcGFyYW1ldGVyX3ByZWRpY2F0X2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdDQzMjMpOworICAgICAgICAJICAgICAgICBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcGFyYW1ldGVyX3ByZWRpY2F0KGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDQ6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTY5OTo0OiBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJvcGVydHlfcHJlZGljYXQKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcm9wZXJ0eV9wcmVkaWNhdF9pbl9kZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJlZGljYXQ0MzI4KTsKKyAgICAgICAgCSAgICAgICAgZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3Byb3BlcnR5X3ByZWRpY2F0KGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDU6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTcwMTo0OiAnQG1hY3JvOicKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMjAxLCAmRk9MTE9XXzIwMV9pbl9kZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJlZGljYXQ0MzM0KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgNjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNzAxOjE2OiAnQHJvdXRpbmUnCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDIyMSwgJkZPTExPV18yMjFfaW5fZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0NDMzOCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDc6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTcwMToyOTogJ0Bwcm9jZWR1cmU6JworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgyMTIsICZGT0xMT1dfMjEyX2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdDQzNDIpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJlZGljYXRFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA4OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE3MDM6NDogJ0Bjb21wb3NpdGUnCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDE3MywgJkZPTExPV18xNzNfaW5fZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0NDM0OCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDk6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTcwMzoxOTogJ0BtYWNoaW5lOicKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMjAwLCAmRk9MTE9XXzIwMF9pbl9kZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJlZGljYXQ0MzUyKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMTA6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTcwNDo0OiAnQHJlZ2lvbjonCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDIxNywgJkZPTExPV18yMTdfaW5fZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0NDM1Nyk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDExOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE3MDQ6MTk6ICdAc3RhdGVtYWNoaW5lOicKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMjI3LCAmRk9MTE9XXzIyN19pbl9kZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJlZGljYXQ0MzYzKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMTI6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTcwNjo0OiAnQGJlaGF2aW9yOicKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMTcxLCAmRk9MTE9XXzE3MV9pbl9kZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJlZGljYXQ0MzY5KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMTM6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTcwNjoxOTogJ0B0cmFuc2l0aW9uOicKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMjMxLCAmRk9MTE9XXzIzMV9pbl9kZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJlZGljYXQ0MzczKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMTQ6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTcwOTo0OiAnQG1vYzonCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDIwMiwgJkZPTExPV18yMDJfaW5fZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0NDM4MSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDE1OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE3MDk6MTQ6ICdAbW9lOicKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMjA0LCAmRk9MTE9XXzIwNF9pbl9kZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJlZGljYXQ0Mzg1KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMTY6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTcwOToyNDogJ0Bjb206JworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgxNzIsICZGT0xMT1dfMTcyX2luX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdDQzODkpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJlZGljYXRFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAxNzoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNzA5OjM0OiAnQGludGVyYWN0aW9uOicKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMTk4LCAmRk9MTE9XXzE5OF9pbl9kZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJlZGljYXQ0MzkzKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0RXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSg1MywgZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0X1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJlZGljYXQgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgZGVmX2JvZHlfbWFjaGluZQorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTcxMzoxOiBkZWZfYm9keV9tYWNoaW5lWyBzZXA6Ok1hY2hpbmUgKiBtYWNoaW5lIF0gOiBMQ1VSTFkgZGVmX2JvZHlfbWFjaGluZV9zZWN0aW9uWyBtYWNoaW5lIF0gUkNVUkxZIDsKKyAqLworc3RhdGljIHZvaWQKK2RlZl9ib2R5X21hY2hpbmUocGZtbFBhcnNlciBjdHgsIHNlcDo6TWFjaGluZSAqIG1hY2hpbmUpCit7CisgICAgQU5UTFIzX1VJTlQzMiBkZWZfYm9keV9tYWNoaW5lX1N0YXJ0SW5kZXg7CisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgZGVmX2JvZHlfbWFjaGluZV9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSg1NCkpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTcxNDoyOiAoIExDVVJMWSBkZWZfYm9keV9tYWNoaW5lX3NlY3Rpb25bIG1hY2hpbmUgXSBSQ1VSTFkgKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNzE0OjQ6IExDVVJMWSBkZWZfYm9keV9tYWNoaW5lX3NlY3Rpb25bIG1hY2hpbmUgXSBSQ1VSTFkKKyAgICAgICAgeworICAgICAgICAgICAgIE1BVENIVChMQ1VSTFksICZGT0xMT1dfTENVUkxZX2luX2RlZl9ib2R5X21hY2hpbmU0NDA3KTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX2JvZHlfbWFjaGluZUV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX2JvZHlfbWFjaGluZV9zZWN0aW9uX2luX2RlZl9ib2R5X21hY2hpbmU0NDI0KTsKKyAgICAgICAgICAgIGRlZl9ib2R5X21hY2hpbmVfc2VjdGlvbihjdHgsIG1hY2hpbmUpOworCisgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX2JvZHlfbWFjaGluZUV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgIE1BVENIVChSQ1VSTFksICZGT0xMT1dfUkNVUkxZX2luX2RlZl9ib2R5X21hY2hpbmU0NDM3KTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX2JvZHlfbWFjaGluZUV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVkZWZfYm9keV9tYWNoaW5lRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlZGVmX2JvZHlfbWFjaGluZUV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoNTQsIGRlZl9ib2R5X21hY2hpbmVfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGRlZl9ib2R5X21hY2hpbmUgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgZGVmX2JvZHlfbWFjaGluZV9zZWN0aW9uCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNzIyOjE6IGRlZl9ib2R5X21hY2hpbmVfc2VjdGlvblsgc2VwOjpNYWNoaW5lICogbWFjaGluZSBdIDogKCBzZWN0aW9uX2hlYWRlclsgbWFjaGluZSBdICk/ICggc2VjdGlvbl9pbXBvcnRbIG1hY2hpbmUgXSApPyAoIHNlY3Rpb25fcGFyYW1ldGVyWyBtYWNoaW5lIF0gKSogKCBzZWN0aW9uX3Byb3BlcnR5WyBtYWNoaW5lIF0gKSogKCBzZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmVbIG1hY2hpbmUgXSApKiAoIHNlY3Rpb25fYmVoYXZpb3JbIG1hY2hpbmUgXSB8IHNlY3Rpb25fc3RhdGVtYWNoaW5lWyBtYWNoaW5lIF0gKT8gKCBzZWN0aW9uX21vZGVsX29mX2NvbXB1dGF0aW9uWyBtYWNoaW5lIF0gfCBzZWN0aW9uX21vZGVsX29mX2V4ZWN1dGlvblsgbWFjaGluZSBdIHwgc2VjdGlvbl9tb2RlbF9vZl9pbnRlcmFjdGlvblsgbWFjaGluZSBdICkqIDsKKyAqLworc3RhdGljIHZvaWQKK2RlZl9ib2R5X21hY2hpbmVfc2VjdGlvbihwZm1sUGFyc2VyIGN0eCwgc2VwOjpNYWNoaW5lICogbWFjaGluZSkKK3sKKyAgICBBTlRMUjNfVUlOVDMyIGRlZl9ib2R5X21hY2hpbmVfc2VjdGlvbl9TdGFydEluZGV4OworCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGRlZl9ib2R5X21hY2hpbmVfc2VjdGlvbl9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSg1NSkpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTcyMzoyOiAoICggc2VjdGlvbl9oZWFkZXJbIG1hY2hpbmUgXSApPyAoIHNlY3Rpb25faW1wb3J0WyBtYWNoaW5lIF0gKT8gKCBzZWN0aW9uX3BhcmFtZXRlclsgbWFjaGluZSBdICkqICggc2VjdGlvbl9wcm9wZXJ0eVsgbWFjaGluZSBdICkqICggc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlWyBtYWNoaW5lIF0gKSogKCBzZWN0aW9uX2JlaGF2aW9yWyBtYWNoaW5lIF0gfCBzZWN0aW9uX3N0YXRlbWFjaGluZVsgbWFjaGluZSBdICk/ICggc2VjdGlvbl9tb2RlbF9vZl9jb21wdXRhdGlvblsgbWFjaGluZSBdIHwgc2VjdGlvbl9tb2RlbF9vZl9leGVjdXRpb25bIG1hY2hpbmUgXSB8IHNlY3Rpb25fbW9kZWxfb2ZfaW50ZXJhY3Rpb25bIG1hY2hpbmUgXSApKiApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE3MjM6NDogKCBzZWN0aW9uX2hlYWRlclsgbWFjaGluZSBdICk/ICggc2VjdGlvbl9pbXBvcnRbIG1hY2hpbmUgXSApPyAoIHNlY3Rpb25fcGFyYW1ldGVyWyBtYWNoaW5lIF0gKSogKCBzZWN0aW9uX3Byb3BlcnR5WyBtYWNoaW5lIF0gKSogKCBzZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmVbIG1hY2hpbmUgXSApKiAoIHNlY3Rpb25fYmVoYXZpb3JbIG1hY2hpbmUgXSB8IHNlY3Rpb25fc3RhdGVtYWNoaW5lWyBtYWNoaW5lIF0gKT8gKCBzZWN0aW9uX21vZGVsX29mX2NvbXB1dGF0aW9uWyBtYWNoaW5lIF0gfCBzZWN0aW9uX21vZGVsX29mX2V4ZWN1dGlvblsgbWFjaGluZSBdIHwgc2VjdGlvbl9tb2RlbF9vZl9pbnRlcmFjdGlvblsgbWFjaGluZSBdICkqCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE3MjM6NDogKCBzZWN0aW9uX2hlYWRlclsgbWFjaGluZSBdICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDExNj0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg4OgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDExNj0xOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMTYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTcyMzo0OiBzZWN0aW9uX2hlYWRlclsgbWFjaGluZSBdCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3NlY3Rpb25faGVhZGVyX2luX2RlZl9ib2R5X21hY2hpbmVfc2VjdGlvbjQ0NTApOworICAgICAgICAgICAgCSAgICAgICAgc2VjdGlvbl9oZWFkZXIoY3R4LCBtYWNoaW5lKTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9ib2R5X21hY2hpbmVfc2VjdGlvbkV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNzI0OjQ6ICggc2VjdGlvbl9pbXBvcnRbIG1hY2hpbmUgXSApPworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQxMTc9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDE5MjoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQxMTc9MTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTE3KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE3MjQ6NDogc2VjdGlvbl9pbXBvcnRbIG1hY2hpbmUgXQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19zZWN0aW9uX2ltcG9ydF9pbl9kZWZfYm9keV9tYWNoaW5lX3NlY3Rpb240NDU4KTsKKyAgICAgICAgICAgIAkgICAgICAgIHNlY3Rpb25faW1wb3J0KGN0eCwgbWFjaGluZSk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfYm9keV9tYWNoaW5lX3NlY3Rpb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTcyNjo0OiAoIHNlY3Rpb25fcGFyYW1ldGVyWyBtYWNoaW5lIF0gKSoKKworICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTE4PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDE5NToKKyAgICAgICAgICAgICAgICBjYXNlIDE5NjoKKyAgICAgICAgICAgICAgICBjYXNlIDIwNzoKKyAgICAgICAgICAgICAgICBjYXNlIDIwOToKKyAgICAgICAgICAgICAgICBjYXNlIDIxMDoKKyAgICAgICAgICAgICAgICBjYXNlIDIxOToKKyAgICAgICAgICAgICAgICBjYXNlIDIyMDoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0MTE4PTE7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDExOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNzI2OjY6IHNlY3Rpb25fcGFyYW1ldGVyWyBtYWNoaW5lIF0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfc2VjdGlvbl9wYXJhbWV0ZXJfaW5fZGVmX2JvZHlfbWFjaGluZV9zZWN0aW9uNDQ2OSk7CisgICAgICAgICAgICAJICAgICAgICBzZWN0aW9uX3BhcmFtZXRlcihjdHgsIG1hY2hpbmUpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2JvZHlfbWFjaGluZV9zZWN0aW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAgICAgCSAgICBnb3RvIGxvb3AxMTg7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb29wMTE4OiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc2VwOjpUZW1wbGF0ZUZhY3Rvcnk6OmdlblByb3BlcnR5KCBtYWNoaW5lICk7IAorICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE3MzE6NDogKCBzZWN0aW9uX3Byb3BlcnR5WyBtYWNoaW5lIF0gKSoKKworICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTE5PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDE3ODoKKyAgICAgICAgICAgICAgICBjYXNlIDIxMToKKyAgICAgICAgICAgICAgICBjYXNlIDIxMzoKKyAgICAgICAgICAgICAgICBjYXNlIDIxNDoKKyAgICAgICAgICAgICAgICBjYXNlIDIxNjoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0MTE5PTE7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDExOSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNzMxOjY6IHNlY3Rpb25fcHJvcGVydHlbIG1hY2hpbmUgXQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19zZWN0aW9uX3Byb3BlcnR5X2luX2RlZl9ib2R5X21hY2hpbmVfc2VjdGlvbjQ0OTEpOworICAgICAgICAgICAgCSAgICAgICAgc2VjdGlvbl9wcm9wZXJ0eShjdHgsIG1hY2hpbmUpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2JvZHlfbWFjaGluZV9zZWN0aW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAgICAgCSAgICBnb3RvIGxvb3AxMTk7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb29wMTE5OiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTczMzo0OiAoIHNlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZVsgbWFjaGluZSBdICkqCisKKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDEyMD0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAxNzQ6CisgICAgICAgICAgICAgICAgY2FzZSAxODM6CisgICAgICAgICAgICAgICAgY2FzZSAxOTc6CisgICAgICAgICAgICAgICAgY2FzZSAyMDA6CisgICAgICAgICAgICAgICAgY2FzZSAyMDE6CisgICAgICAgICAgICAgICAgY2FzZSAyMDM6CisgICAgICAgICAgICAgICAgY2FzZSAyMTI6CisgICAgICAgICAgICAgICAgY2FzZSAyMTU6CisgICAgICAgICAgICAgICAgY2FzZSAyMjI6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDEyMD0xOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMjApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTczMzo2OiBzZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmVbIG1hY2hpbmUgXQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19zZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmVfaW5fZGVmX2JvZHlfbWFjaGluZV9zZWN0aW9uNDUwNCk7CisgICAgICAgICAgICAJICAgICAgICBzZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmUoY3R4LCBtYWNoaW5lKTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9ib2R5X21hY2hpbmVfc2VjdGlvbkV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdDoKKyAgICAgICAgICAgIAkgICAgZ290byBsb29wMTIwOwkvKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgKi8KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9vcDEyMDogOyAvKiBKdW1wIG91dCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE3MzU6NDogKCBzZWN0aW9uX2JlaGF2aW9yWyBtYWNoaW5lIF0gfCBzZWN0aW9uX3N0YXRlbWFjaGluZVsgbWFjaGluZSBdICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDEyMT0zOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTcxOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDEyMT0xOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjI3OgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDEyMT0yOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMjEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTczNTo2OiBzZWN0aW9uX2JlaGF2aW9yWyBtYWNoaW5lIF0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfc2VjdGlvbl9iZWhhdmlvcl9pbl9kZWZfYm9keV9tYWNoaW5lX3NlY3Rpb240NTE2KTsKKyAgICAgICAgICAgIAkgICAgICAgIHNlY3Rpb25fYmVoYXZpb3IoY3R4LCBtYWNoaW5lKTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9ib2R5X21hY2hpbmVfc2VjdGlvbkV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTczNjo2OiBzZWN0aW9uX3N0YXRlbWFjaGluZVsgbWFjaGluZSBdCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3NlY3Rpb25fc3RhdGVtYWNoaW5lX2luX2RlZl9ib2R5X21hY2hpbmVfc2VjdGlvbjQ1MjQpOworICAgICAgICAgICAgCSAgICAgICAgc2VjdGlvbl9zdGF0ZW1hY2hpbmUoY3R4LCBtYWNoaW5lKTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9ib2R5X21hY2hpbmVfc2VjdGlvbkV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzZXA6OlRlbXBsYXRlRmFjdG9yeTo6Z2VuQmVoYXZpb3IobWFjaGluZSk7IAorICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE3NDI6NDogKCBzZWN0aW9uX21vZGVsX29mX2NvbXB1dGF0aW9uWyBtYWNoaW5lIF0gfCBzZWN0aW9uX21vZGVsX29mX2V4ZWN1dGlvblsgbWFjaGluZSBdIHwgc2VjdGlvbl9tb2RlbF9vZl9pbnRlcmFjdGlvblsgbWFjaGluZSBdICkqCisKKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDEyMj00OworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAyMDI6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDEyMj0xOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjA0OgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQxMjI9MjsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE3MjoKKyAgICAgICAgICAgICAgICBjYXNlIDE5ODoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0MTIyPTM7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEyMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNzQyOjY6IHNlY3Rpb25fbW9kZWxfb2ZfY29tcHV0YXRpb25bIG1hY2hpbmUgXQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19zZWN0aW9uX21vZGVsX29mX2NvbXB1dGF0aW9uX2luX2RlZl9ib2R5X21hY2hpbmVfc2VjdGlvbjQ1NDkpOworICAgICAgICAgICAgCSAgICAgICAgc2VjdGlvbl9tb2RlbF9vZl9jb21wdXRhdGlvbihjdHgsIG1hY2hpbmUpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2JvZHlfbWFjaGluZV9zZWN0aW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAyOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNzQzOjY6IHNlY3Rpb25fbW9kZWxfb2ZfZXhlY3V0aW9uWyBtYWNoaW5lIF0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfc2VjdGlvbl9tb2RlbF9vZl9leGVjdXRpb25faW5fZGVmX2JvZHlfbWFjaGluZV9zZWN0aW9uNDU1Nyk7CisgICAgICAgICAgICAJICAgICAgICBzZWN0aW9uX21vZGVsX29mX2V4ZWN1dGlvbihjdHgsIG1hY2hpbmUpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2JvZHlfbWFjaGluZV9zZWN0aW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAzOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNzQ0OjY6IHNlY3Rpb25fbW9kZWxfb2ZfaW50ZXJhY3Rpb25bIG1hY2hpbmUgXQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19zZWN0aW9uX21vZGVsX29mX2ludGVyYWN0aW9uX2luX2RlZl9ib2R5X21hY2hpbmVfc2VjdGlvbjQ1NjUpOworICAgICAgICAgICAgCSAgICAgICAgc2VjdGlvbl9tb2RlbF9vZl9pbnRlcmFjdGlvbihjdHgsIG1hY2hpbmUpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2JvZHlfbWFjaGluZV9zZWN0aW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAgICAgCSAgICBnb3RvIGxvb3AxMjI7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb29wMTIyOiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVkZWZfYm9keV9tYWNoaW5lX3NlY3Rpb25FeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVkZWZfYm9keV9tYWNoaW5lX3NlY3Rpb25FeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDU1LCBkZWZfYm9keV9tYWNoaW5lX3NlY3Rpb25fU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGRlZl9ib2R5X21hY2hpbmVfc2VjdGlvbiAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBkZWZfYm9keV9tYWNoaW5lX3NpbXBsaWYKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE3NDg6MTogZGVmX2JvZHlfbWFjaGluZV9zaW1wbGlmWyBzZXA6Ok1hY2hpbmUgKiBtYWNoaW5lIF0gOiAoICggcHJvcGVydHlfZGVjbGFyYXRpb25bIGRlY2xQcm9wZXJ0eSAsXG5cdFx0XHRcdHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX1VOREVGSU5FRF9NT0RJRklFUiBdICkqIHwgKCBkZWZfbW9lX3ByaW1pdGl2ZVsgbWFjaGluZSBdICkrICkgOworICovCitzdGF0aWMgdm9pZAorZGVmX2JvZHlfbWFjaGluZV9zaW1wbGlmKHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBtYWNoaW5lKQoreworICAgIEFOVExSM19VSU5UMzIgZGVmX2JvZHlfbWFjaGluZV9zaW1wbGlmX1N0YXJ0SW5kZXg7CisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgZGVmX2JvZHlfbWFjaGluZV9zaW1wbGlmX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKworICAgIAlzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSA9IG1hY2hpbmUtPmdldFByb3BlcnR5UGFydCgpOworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSg1NikpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTc1MjoyOiAoICggKCBwcm9wZXJ0eV9kZWNsYXJhdGlvblsgZGVjbFByb3BlcnR5ICxcblx0XHRcdFx0c2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfVU5ERUZJTkVEX01PRElGSUVSIF0gKSogfCAoIGRlZl9tb2VfcHJpbWl0aXZlWyBtYWNoaW5lIF0gKSsgKSApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE3NTI6NDogKCAoIHByb3BlcnR5X2RlY2xhcmF0aW9uWyBkZWNsUHJvcGVydHkgLFxuXHRcdFx0XHRzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9VTkRFRklORURfTU9ESUZJRVIgXSApKiB8ICggZGVmX21vZV9wcmltaXRpdmVbIG1hY2hpbmUgXSApKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE3NTI6NDogKCAoIHByb3BlcnR5X2RlY2xhcmF0aW9uWyBkZWNsUHJvcGVydHkgLFxuXHRcdFx0XHRzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9VTkRFRklORURfTU9ESUZJRVIgXSApKiB8ICggZGVmX21vZV9wcmltaXRpdmVbIG1hY2hpbmUgXSApKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDEyNT0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBFT0Y6CisgICAgICAgICAgICAgICAgY2FzZSAyNDM6CisgICAgICAgICAgICAgICAgY2FzZSAyNDk6CisgICAgICAgICAgICAgICAgY2FzZSAyNTM6CisgICAgICAgICAgICAgICAgY2FzZSAyNTc6CisgICAgICAgICAgICAgICAgY2FzZSAyNTg6CisgICAgICAgICAgICAgICAgY2FzZSAyNTk6CisgICAgICAgICAgICAgICAgY2FzZSAyNjI6CisgICAgICAgICAgICAgICAgY2FzZSAyNzY6CisgICAgICAgICAgICAgICAgY2FzZSAyODI6CisgICAgICAgICAgICAgICAgY2FzZSAyOTg6CisgICAgICAgICAgICAgICAgY2FzZSAzMDU6CisgICAgICAgICAgICAgICAgY2FzZSAzMTg6CisgICAgICAgICAgICAgICAgY2FzZSAzMjA6CisgICAgICAgICAgICAgICAgY2FzZSAzNDE6CisgICAgICAgICAgICAgICAgY2FzZSAzNDQ6CisgICAgICAgICAgICAgICAgY2FzZSAzNDk6CisgICAgICAgICAgICAgICAgY2FzZSAzNTU6CisgICAgICAgICAgICAgICAgY2FzZSAzNjE6CisgICAgICAgICAgICAgICAgY2FzZSAzNjQ6CisgICAgICAgICAgICAgICAgY2FzZSAzNzQ6CisgICAgICAgICAgICAgICAgY2FzZSAzODA6CisgICAgICAgICAgICAgICAgY2FzZSAzODg6CisgICAgICAgICAgICAgICAgY2FzZSAzOTU6CisgICAgICAgICAgICAgICAgY2FzZSAzOTg6CisgICAgICAgICAgICAgICAgY2FzZSA0MDQ6CisgICAgICAgICAgICAgICAgY2FzZSA0MDY6CisgICAgICAgICAgICAgICAgY2FzZSA0MTA6CisgICAgICAgICAgICAgICAgY2FzZSA0MTE6CisgICAgICAgICAgICAgICAgY2FzZSA0MTQ6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDEyNT0xOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMTcwOgorICAgICAgICAgICAgICAgIGNhc2UgMTc1OgorICAgICAgICAgICAgICAgIGNhc2UgMTc3OgorICAgICAgICAgICAgICAgIGNhc2UgMTc5OgorICAgICAgICAgICAgICAgIGNhc2UgMTgyOgorICAgICAgICAgICAgICAgIGNhc2UgMTg0OgorICAgICAgICAgICAgICAgIGNhc2UgMTg5OgorICAgICAgICAgICAgICAgIGNhc2UgMTkwOgorICAgICAgICAgICAgICAgIGNhc2UgMTkxOgorICAgICAgICAgICAgICAgIGNhc2UgMTk0OgorICAgICAgICAgICAgICAgIGNhc2UgMTk5OgorICAgICAgICAgICAgICAgIGNhc2UgMjE4OgorICAgICAgICAgICAgICAgIGNhc2UgMjIzOgorICAgICAgICAgICAgICAgIGNhc2UgMjI0OgorICAgICAgICAgICAgICAgIGNhc2UgMjI1OgorICAgICAgICAgICAgICAgIGNhc2UgMjI2OgorICAgICAgICAgICAgICAgIGNhc2UgMjI4OgorICAgICAgICAgICAgICAgIGNhc2UgMzY3OgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQxMjU9MjsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMTI1OworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfYm9keV9tYWNoaW5lX3NpbXBsaWZFeDsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTI1KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE3NTI6NjogKCBwcm9wZXJ0eV9kZWNsYXJhdGlvblsgZGVjbFByb3BlcnR5ICxcblx0XHRcdFx0c2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfVU5ERUZJTkVEX01PRElGSUVSIF0gKSoKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTc1Mjo2OiAoIHByb3BlcnR5X2RlY2xhcmF0aW9uWyBkZWNsUHJvcGVydHkgLFxuXHRcdFx0XHRzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9VTkRFRklORURfTU9ESUZJRVIgXSApKgorCisgICAgICAgICAgICAJICAgICAgICBmb3IgKDs7KQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQxMjM9MjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjQzOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjQ5OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjUzOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjU3OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjU4OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjU5OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjYyOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjc2OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjgyOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjk4OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzA1OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzE4OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzIwOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzQxOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzQ0OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzQ5OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzU1OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzYxOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzY0OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzc0OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzgwOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzg4OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzk1OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzk4OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgNDA0OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgNDA2OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgNDEwOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgNDExOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgNDE0OgorICAgICAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQlhbHQxMjM9MTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTIzKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE3NTI6ODogcHJvcGVydHlfZGVjbGFyYXRpb25bIGRlY2xQcm9wZXJ0eSAsXG5cdFx0XHRcdHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX1VOREVGSU5FRF9NT0RJRklFUiBdCisgICAgICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3Byb3BlcnR5X2RlY2xhcmF0aW9uX2luX2RlZl9ib2R5X21hY2hpbmVfc2ltcGxpZjQ1OTMpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgcHJvcGVydHlfZGVjbGFyYXRpb24oY3R4LCBkZWNsUHJvcGVydHksIHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX1VOREVGSU5FRF9NT0RJRklFUik7CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfYm9keV9tYWNoaW5lX3NpbXBsaWZFeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICAgICAgCWRlZmF1bHQ6CisgICAgICAgICAgICAJICAgICAgICAJICAgIGdvdG8gbG9vcDEyMzsJLyogYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGxvb3AxMjM6IDsgLyogSnVtcCBvdXQgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAyOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNzU2OjY6ICggZGVmX21vZV9wcmltaXRpdmVbIG1hY2hpbmUgXSApKworICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNzU2OjY6ICggZGVmX21vZV9wcmltaXRpdmVbIG1hY2hpbmUgXSApKworICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGludCBjbnQxMjQ9MDsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBpbnQgYWx0MTI0PTI7CisgICAgICAgICAgICAJICAgICAgICAJc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCSAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDE3MDoKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDE3NToKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDE3NzoKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDE3OToKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDE4MjoKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDE4NDoKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDE4OToKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDE5MDoKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDE5MToKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDE5NDoKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDE5OToKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDIxODoKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDIyMzoKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDIyNDoKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDIyNToKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDIyNjoKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDIyODoKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDM2NzoKKyAgICAgICAgICAgIAkgICAgICAgIAkJeworICAgICAgICAgICAgCSAgICAgICAgCQkJYWx0MTI0PTE7CisgICAgICAgICAgICAJICAgICAgICAJCX0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgIAl9CisKKyAgICAgICAgICAgIAkgICAgICAgIAlzd2l0Y2ggKGFsdDEyNCkKKyAgICAgICAgICAgIAkgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAJICAgIGNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE3NTY6ODogZGVmX21vZV9wcmltaXRpdmVbIG1hY2hpbmUgXQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlZl9tb2VfcHJpbWl0aXZlX2luX2RlZl9ib2R5X21hY2hpbmVfc2ltcGxpZjQ2MDkpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGRlZl9tb2VfcHJpbWl0aXZlKGN0eCwgbWFjaGluZSk7CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX2JvZHlfbWFjaGluZV9zaW1wbGlmRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAJICAgIGRlZmF1bHQ6CisKKyAgICAgICAgICAgIAkgICAgICAgIAkJaWYgKCBjbnQxMjQgPj0gMSApCisgICAgICAgICAgICAJICAgICAgICAJCXsKKyAgICAgICAgICAgIAkgICAgICAgIAkJICAgIGdvdG8gbG9vcDEyNDsKKyAgICAgICAgICAgIAkgICAgICAgIAkJfQorICAgICAgICAgICAgCSAgICAgICAgCQlpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAJICAgICAgICAJCXsKKyAgICAgICAgICAgIAkgICAgICAgIAkJICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgIAkgICAgICAgIAkJICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAJCX0KKworICAgICAgICAgICAgCSAgICAgICAgCQkvKiBtaXNtYXRjaGVkU2V0RXgoKQorICAgICAgICAgICAgCSAgICAgICAgCQkgKi8KKyAgICAgICAgICAgIAkgICAgICAgIAkJQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkJRVhDRVBUSU9OLT50eXBlID0gQU5UTFIzX0VBUkxZX0VYSVRfRVhDRVBUSU9OOworICAgICAgICAgICAgCSAgICAgICAgCQlFWENFUFRJT04tPm5hbWUgPSAodm9pZCAqKUFOVExSM19FQVJMWV9FWElUX05BTUU7CisKKworICAgICAgICAgICAgCSAgICAgICAgCQlnb3RvIHJ1bGVkZWZfYm9keV9tYWNoaW5lX3NpbXBsaWZFeDsKKyAgICAgICAgICAgIAkgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAJY250MTI0Kys7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIGxvb3AxMjQ6IDsJLyogSnVtcCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworICAgICAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlZGVmX2JvZHlfbWFjaGluZV9zaW1wbGlmRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlZGVmX2JvZHlfbWFjaGluZV9zaW1wbGlmRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSg1NiwgZGVmX2JvZHlfbWFjaGluZV9zaW1wbGlmX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBkZWZfYm9keV9tYWNoaW5lX3NpbXBsaWYgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgYW55X2RlZl9zdGF0ZW1hY2hpbmUKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE3NjQ6MTogYW55X2RlZl9zdGF0ZW1hY2hpbmVbIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lciAsXG5cdFx0c2VwOjpNb2RpZmllciBtZGZyICwgc2VwOjpTcGVjaWZpZXIgc3BjZnIgXSByZXR1cm5zIFsgc2VwOjpNYWNoaW5lICogbWFjaGluZSBdIDogKG1zPSBleGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllciApPyAoc3Q9IGRlZl9zdGF0ZV9zaW5nbGV0b25bIGNvbnRhaW5lciAsIG1kZnIgLCBzcGNmciBdIHxzdD0gZGVmX3N0YXRlWyBjb250YWluZXIgLCBtZGZyICwgc3BjZnIgXSB8c209IGRlZl9zdGF0ZW1hY2hpbmVbIGNvbnRhaW5lciAsIG1kZnIgLCBzcGNmciBdICkgOworICovCitzdGF0aWMgc2VwOjpNYWNoaW5lICoKK2FueV9kZWZfc3RhdGVtYWNoaW5lKHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIsIHNlcDo6TW9kaWZpZXIgbWRmciwgc2VwOjpTcGVjaWZpZXIgc3BjZnIpCit7CisgICAgc2VwOjpNYWNoaW5lICogbWFjaGluZTsKKworICAgIEFOVExSM19VSU5UMzIgYW55X2RlZl9zdGF0ZW1hY2hpbmVfU3RhcnRJbmRleDsKKworICAgIGZtbFBhcnNlcl9leGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllcl9yZXR1cm4gbXM7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX21zCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9tcyBmbWxQYXJzZXJfZXhlY3V0YWJsZV9tb2RpZmllcl9zcGVjaWZpZXJfcmV0dXJuCisKKyAgICBzZXA6Ok1hY2hpbmUgKiBzdDsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfc3QKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX3N0IHNlcDo6TWFjaGluZSAqCisKKyAgICBzZXA6Ok1hY2hpbmUgKiBzbTsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfc20KKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX3NtIHNlcDo6TWFjaGluZSAqCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgYW55X2RlZl9zdGF0ZW1hY2hpbmVfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoNTcpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIG1hY2hpbmU7CisgICAgfQorCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNzY4OjI6ICggKG1zPSBleGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllciApPyAoc3Q9IGRlZl9zdGF0ZV9zaW5nbGV0b25bIGNvbnRhaW5lciAsIG1kZnIgLCBzcGNmciBdIHxzdD0gZGVmX3N0YXRlWyBjb250YWluZXIgLCBtZGZyICwgc3BjZnIgXSB8c209IGRlZl9zdGF0ZW1hY2hpbmVbIGNvbnRhaW5lciAsIG1kZnIgLCBzcGNmciBdICkgKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNzY4OjQ6IChtcz0gZXhlY3V0YWJsZV9tb2RpZmllcl9zcGVjaWZpZXIgKT8gKHN0PSBkZWZfc3RhdGVfc2luZ2xldG9uWyBjb250YWluZXIgLCBtZGZyICwgc3BjZnIgXSB8c3Q9IGRlZl9zdGF0ZVsgY29udGFpbmVyICwgbWRmciAsIHNwY2ZyIF0gfHNtPSBkZWZfc3RhdGVtYWNoaW5lWyBjb250YWluZXIgLCBtZGZyICwgc3BjZnIgXSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE3Njg6NDogKG1zPSBleGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllciApPworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQxMjY9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDI3MjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzMDY6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzE0OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDMyMjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzNTM6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzkzOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDQwNjoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQxMjY9MTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTI2KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE3Njg6NjogbXM9IGV4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyX2luX2FueV9kZWZfc3RhdGVtYWNoaW5lNDY0NCk7CisgICAgICAgICAgICAJICAgICAgICBtcz1leGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllcihjdHgpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlYW55X2RlZl9zdGF0ZW1hY2hpbmVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gbWFjaGluZTsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIG1kZnIub3ZlcnJpZGVfaWZkZWYoIG1zLm1kZnIKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgKTsgc3BjZnIub3ZlcnJpZGVfaWZkZWYoIG1zLnNwY2ZyCisgICAgICAgICAgICAJICAgICAgICAgICAgICk7IAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTc3Mjo0OiAoc3Q9IGRlZl9zdGF0ZV9zaW5nbGV0b25bIGNvbnRhaW5lciAsIG1kZnIgLCBzcGNmciBdIHxzdD0gZGVmX3N0YXRlWyBjb250YWluZXIgLCBtZGZyICwgc3BjZnIgXSB8c209IGRlZl9zdGF0ZW1hY2hpbmVbIGNvbnRhaW5lciAsIG1kZnIgLCBzcGNmciBdICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTI3PTM7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDE0NDoKKyAgICAgICAgICAgICAgICBjYXNlIDE0NToKKyAgICAgICAgICAgICAgICBjYXNlIDE0NzoKKyAgICAgICAgICAgICAgICBjYXNlIDE0ODoKKyAgICAgICAgICAgICAgICBjYXNlIDE0OToKKyAgICAgICAgICAgICAgICBjYXNlIDE1MDoKKyAgICAgICAgICAgICAgICBjYXNlIDE1MzoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0MTI3PTE7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzNzg6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDEyNz0yOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzc5OgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQxMjc9MzsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hY2hpbmU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDEyNzsKKyAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgICAgICAgICAgZ290byBydWxlYW55X2RlZl9zdGF0ZW1hY2hpbmVFeDsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTI3KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE3NzI6Nzogc3Q9IGRlZl9zdGF0ZV9zaW5nbGV0b25bIGNvbnRhaW5lciAsIG1kZnIgLCBzcGNmciBdCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlZl9zdGF0ZV9zaW5nbGV0b25faW5fYW55X2RlZl9zdGF0ZW1hY2hpbmU0NjY2KTsKKyAgICAgICAgICAgIAkgICAgICAgIHN0PWRlZl9zdGF0ZV9zaW5nbGV0b24oY3R4LCBjb250YWluZXIsIG1kZnIsIHNwY2ZyKTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWFueV9kZWZfc3RhdGVtYWNoaW5lRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG1hY2hpbmU7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBtYWNoaW5lPSAKKyAgICAgICAgICAgIAkgICAgICAgICAgICBzdAorICAgICAgICAgICAgCSAgICAgICAgICAgIDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAyOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxNzc1OjY6IHN0PSBkZWZfc3RhdGVbIGNvbnRhaW5lciAsIG1kZnIgLCBzcGNmciBdCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlZl9zdGF0ZV9pbl9hbnlfZGVmX3N0YXRlbWFjaGluZTQ2ODIpOworICAgICAgICAgICAgCSAgICAgICAgc3Q9ZGVmX3N0YXRlKGN0eCwgY29udGFpbmVyLCBtZGZyLCBzcGNmcik7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVhbnlfZGVmX3N0YXRlbWFjaGluZUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBtYWNoaW5lOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgbWFjaGluZT0gCisgICAgICAgICAgICAJICAgICAgICAgICAgc3QKKyAgICAgICAgICAgIAkgICAgICAgICAgICA7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMzoKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTc3ODo2OiBzbT0gZGVmX3N0YXRlbWFjaGluZVsgY29udGFpbmVyICwgbWRmciAsIHNwY2ZyIF0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX3N0YXRlbWFjaGluZV9pbl9hbnlfZGVmX3N0YXRlbWFjaGluZTQ2OTgpOworICAgICAgICAgICAgCSAgICAgICAgc209ZGVmX3N0YXRlbWFjaGluZShjdHgsIGNvbnRhaW5lciwgbWRmciwgc3BjZnIpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlYW55X2RlZl9zdGF0ZW1hY2hpbmVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gbWFjaGluZTsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIG1hY2hpbmU9IAorICAgICAgICAgICAgCSAgICAgICAgICAgIHNtCisgICAgICAgICAgICAJICAgICAgICAgICAgOworICAgICAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlYW55X2RlZl9zdGF0ZW1hY2hpbmVFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVhbnlfZGVmX3N0YXRlbWFjaGluZUV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoNTcsIGFueV9kZWZfc3RhdGVtYWNoaW5lX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gbWFjaGluZTsKK30KKy8qICRBTlRMUiBlbmQgYW55X2RlZl9zdGF0ZW1hY2hpbmUgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgZGVmX3N0YXRlbWFjaGluZQorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTc4NDoxOiBkZWZfc3RhdGVtYWNoaW5lWyBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIgLFxuXHRcdHNlcDo6TW9kaWZpZXIgbWRmciAsIHNlcDo6U3BlY2lmaWVyIHNwY2ZyIF0gcmV0dXJucyBbIHNlcDo6TWFjaGluZSAqIG1hY2hpbmUgXSA6ICdzdGF0ZW1hY2hpbmUnICggTFRfICggKCAnbW9jOicgKT8gZXhlY3V0YWJsZV9zcGVjaWZpZXJbIHNwY2ZyIF0gKCBDT01NQSBkZWZfaW5zdGFuY2VfY291bnRbIGluaXRpYWxDb3VudCAsIG1heGltYWxDb3VudCBdICk/IHwgZGVmX2luc3RhbmNlX2NvdW50WyBpbml0aWFsQ291bnQgLCBtYXhpbWFsQ291bnQgXSApPyBHVCApPyAoaWQ9IElEIHwgKCBMQlJBQ0tFVCB8IExCUkFDS0VUX0VYQ0VQVCApIChpZD0gSUQgKCBDT01NQSBpZD0gSUQgKSogfCBTVEFSICkgUkJSQUNLRVQgKSAoIFN0cmluZ0xpdGVyYWwgKT8gKCBkZWZfbWFjaGluZV9wYXJhbWV0ZXJzWyBtYWNoaW5lIF0gKT8gKCBkZWZfbWFjaGluZV9yZXR1cm5zWyBtYWNoaW5lICwgc2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfUkVUVVJOX1BBUkFNRVRFUl9NT0RJRklFUiBdICk/IGRlZl9ib2R5X3N0YXRlbWFjaGluZVsgbWFjaGluZSBdIDsKKyAqLworc3RhdGljIHNlcDo6TWFjaGluZSAqCitkZWZfc3RhdGVtYWNoaW5lKHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIsIHNlcDo6TW9kaWZpZXIgbWRmciwgc2VwOjpTcGVjaWZpZXIgc3BjZnIpCit7CisgICAgc2VwOjpNYWNoaW5lICogbWFjaGluZTsKKworICAgIEFOVExSM19VSU5UMzIgZGVmX3N0YXRlbWFjaGluZV9TdGFydEluZGV4OworCisgICAgcEFOVExSM19DT01NT05fVE9LRU4gICAgaWQ7CisgICAgcEFOVExSM19DT01NT05fVE9LRU4gICAgU3RyaW5nTGl0ZXJhbDY7CisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgZGVmX3N0YXRlbWFjaGluZV9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisKKyAgICAvLwlyZXNldFRyYW5zaXRpb25JRCgpOworICAgIAlyZXNldENvbm5lY3RJRCgpOworICAgIAlyZXNldEJ1ZmZlcklEKCk7CisKKyAgICAJc2VwOjphdm1fc2l6ZV90IGluaXRpYWxDb3VudCA9IDE7CisgICAgCXNlcDo6YXZtX3NpemVfdCBtYXhpbWFsQ291bnQgPSBBVk1fTlVNRVJJQ19NQVhfU0laRV9UOworCisgICAgCVNBVkVfUlVMRV9CRUdJTl9MT0NBVElPTjsKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoNTgpKSApCisgICAgeworICAgICAgICB7CisKKyAgICAgICAgICAgIAlQT1BfQ1RYOworCisgICAgICAgICAgICAJU0VUX1JVTEVfTE9DQVRJT04obWFjaGluZSk7CisKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIG1hY2hpbmU7CisgICAgfQorCisgICAgaWQgICAgICAgPSBOVUxMOworICAgIFN0cmluZ0xpdGVyYWw2ICAgICAgID0gTlVMTDsKKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTgwMzoyOiAoICdzdGF0ZW1hY2hpbmUnICggTFRfICggKCAnbW9jOicgKT8gZXhlY3V0YWJsZV9zcGVjaWZpZXJbIHNwY2ZyIF0gKCBDT01NQSBkZWZfaW5zdGFuY2VfY291bnRbIGluaXRpYWxDb3VudCAsIG1heGltYWxDb3VudCBdICk/IHwgZGVmX2luc3RhbmNlX2NvdW50WyBpbml0aWFsQ291bnQgLCBtYXhpbWFsQ291bnQgXSApPyBHVCApPyAoaWQ9IElEIHwgKCBMQlJBQ0tFVCB8IExCUkFDS0VUX0VYQ0VQVCApIChpZD0gSUQgKCBDT01NQSBpZD0gSUQgKSogfCBTVEFSICkgUkJSQUNLRVQgKSAoIFN0cmluZ0xpdGVyYWwgKT8gKCBkZWZfbWFjaGluZV9wYXJhbWV0ZXJzWyBtYWNoaW5lIF0gKT8gKCBkZWZfbWFjaGluZV9yZXR1cm5zWyBtYWNoaW5lICwgc2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfUkVUVVJOX1BBUkFNRVRFUl9NT0RJRklFUiBdICk/IGRlZl9ib2R5X3N0YXRlbWFjaGluZVsgbWFjaGluZSBdICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTgwMzo0OiAnc3RhdGVtYWNoaW5lJyAoIExUXyAoICggJ21vYzonICk/IGV4ZWN1dGFibGVfc3BlY2lmaWVyWyBzcGNmciBdICggQ09NTUEgZGVmX2luc3RhbmNlX2NvdW50WyBpbml0aWFsQ291bnQgLCBtYXhpbWFsQ291bnQgXSApPyB8IGRlZl9pbnN0YW5jZV9jb3VudFsgaW5pdGlhbENvdW50ICwgbWF4aW1hbENvdW50IF0gKT8gR1QgKT8gKGlkPSBJRCB8ICggTEJSQUNLRVQgfCBMQlJBQ0tFVF9FWENFUFQgKSAoaWQ9IElEICggQ09NTUEgaWQ9IElEICkqIHwgU1RBUiApIFJCUkFDS0VUICkgKCBTdHJpbmdMaXRlcmFsICk/ICggZGVmX21hY2hpbmVfcGFyYW1ldGVyc1sgbWFjaGluZSBdICk/ICggZGVmX21hY2hpbmVfcmV0dXJuc1sgbWFjaGluZSAsIHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX1JFVFVSTl9QQVJBTUVURVJfTU9ESUZJRVIgXSApPyBkZWZfYm9keV9zdGF0ZW1hY2hpbmVbIG1hY2hpbmUgXQorICAgICAgICB7CisgICAgICAgICAgICAgTUFUQ0hUKDM3OSwgJkZPTExPV18zNzlfaW5fZGVmX3N0YXRlbWFjaGluZTQ3MzYpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfc3RhdGVtYWNoaW5lRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1hY2hpbmU7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTgwNDo0OiAoIExUXyAoICggJ21vYzonICk/IGV4ZWN1dGFibGVfc3BlY2lmaWVyWyBzcGNmciBdICggQ09NTUEgZGVmX2luc3RhbmNlX2NvdW50WyBpbml0aWFsQ291bnQgLCBtYXhpbWFsQ291bnQgXSApPyB8IGRlZl9pbnN0YW5jZV9jb3VudFsgaW5pdGlhbENvdW50ICwgbWF4aW1hbENvdW50IF0gKT8gR1QgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTMxPTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMVF86CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJYWx0MTMxPTE7CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEzMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxODA0OjY6IExUXyAoICggJ21vYzonICk/IGV4ZWN1dGFibGVfc3BlY2lmaWVyWyBzcGNmciBdICggQ09NTUEgZGVmX2luc3RhbmNlX2NvdW50WyBpbml0aWFsQ291bnQgLCBtYXhpbWFsQ291bnQgXSApPyB8IGRlZl9pbnN0YW5jZV9jb3VudFsgaW5pdGlhbENvdW50ICwgbWF4aW1hbENvdW50IF0gKT8gR1QKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChMVF8sICZGT0xMT1dfTFRfX2luX2RlZl9zdGF0ZW1hY2hpbmU0NzQzKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3N0YXRlbWFjaGluZUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBtYWNoaW5lOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE4MDU6NTogKCAoICdtb2M6JyApPyBleGVjdXRhYmxlX3NwZWNpZmllclsgc3BjZnIgXSAoIENPTU1BIGRlZl9pbnN0YW5jZV9jb3VudFsgaW5pdGlhbENvdW50ICwgbWF4aW1hbENvdW50IF0gKT8gfCBkZWZfaW5zdGFuY2VfY291bnRbIGluaXRpYWxDb3VudCAsIG1heGltYWxDb3VudCBdICk/CisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDEzMD0zOworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgSUQ6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMTUxOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDE1MjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAyMzk6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMjU3OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDI4MjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAyODQ6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMjg2OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDMxMjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzMjE6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzM0OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDM2NDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzNzc6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAkJYWx0MTMwPTE7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBMQlJBQ0tFVDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBMUEFSRU46CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzA4OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDMyNzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCQlhbHQxMzA9MjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTMwKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE4MDU6NzogKCAnbW9jOicgKT8gZXhlY3V0YWJsZV9zcGVjaWZpZXJbIHNwY2ZyIF0gKCBDT01NQSBkZWZfaW5zdGFuY2VfY291bnRbIGluaXRpYWxDb3VudCAsIG1heGltYWxDb3VudCBdICk/CisgICAgICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE4MDU6NzogKCAnbW9jOicgKT8KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0MTI4PTI7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzMjE6CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIAkJYWx0MTI4PTE7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDEyOCkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxODA1Ojk6ICdtb2M6JworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKDMyMSwgJkZPTExPV18zMjFfaW5fZGVmX3N0YXRlbWFjaGluZTQ3NTMpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfc3RhdGVtYWNoaW5lRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG1hY2hpbmU7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leGVjdXRhYmxlX3NwZWNpZmllcl9pbl9kZWZfc3RhdGVtYWNoaW5lNDc1OSk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBleGVjdXRhYmxlX3NwZWNpZmllcihjdHgsIHNwY2ZyKTsKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9zdGF0ZW1hY2hpbmVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gbWFjaGluZTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxODA2OjY6ICggQ09NTUEgZGVmX2luc3RhbmNlX2NvdW50WyBpbml0aWFsQ291bnQgLCBtYXhpbWFsQ291bnQgXSApPworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQxMjk9MjsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIENPTU1BOgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAJCWFsdDEyOT0xOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQxMjkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTgwNjo4OiBDT01NQSBkZWZfaW5zdGFuY2VfY291bnRbIGluaXRpYWxDb3VudCAsIG1heGltYWxDb3VudCBdCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoQ09NTUEsICZGT0xMT1dfQ09NTUFfaW5fZGVmX3N0YXRlbWFjaGluZTQ3NjkpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfc3RhdGVtYWNoaW5lRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG1hY2hpbmU7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX2luc3RhbmNlX2NvdW50X2luX2RlZl9zdGF0ZW1hY2hpbmU0NzcyKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGRlZl9pbnN0YW5jZV9jb3VudChjdHgsIGluaXRpYWxDb3VudCwgbWF4aW1hbENvdW50KTsKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9zdGF0ZW1hY2hpbmVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gbWFjaGluZTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDI6CisgICAgICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE4MDg6NzogZGVmX2luc3RhbmNlX2NvdW50WyBpbml0aWFsQ291bnQgLCBtYXhpbWFsQ291bnQgXQorICAgICAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfaW5zdGFuY2VfY291bnRfaW5fZGVmX3N0YXRlbWFjaGluZTQ3ODUpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgZGVmX2luc3RhbmNlX2NvdW50KGN0eCwgaW5pdGlhbENvdW50LCBtYXhpbWFsQ291bnQpOworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3N0YXRlbWFjaGluZUV4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBtYWNoaW5lOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChHVCwgJkZPTExPV19HVF9pbl9kZWZfc3RhdGVtYWNoaW5lNDc5OCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9zdGF0ZW1hY2hpbmVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gbWFjaGluZTsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE4MTM6NDogKGlkPSBJRCB8ICggTEJSQUNLRVQgfCBMQlJBQ0tFVF9FWENFUFQgKSAoaWQ9IElEICggQ09NTUEgaWQ9IElEICkqIHwgU1RBUiApIFJCUkFDS0VUICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTM1PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIElEOgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQxMzU9MTsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIExCUkFDS0VUOgorICAgICAgICAgICAgICAgIGNhc2UgTEJSQUNLRVRfRVhDRVBUOgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQxMzU9MjsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hY2hpbmU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDEzNTsKKyAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX3N0YXRlbWFjaGluZUV4OworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMzUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTgxMzo2OiBpZD0gSUQKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgaWQgPSAocEFOVExSM19DT01NT05fVE9LRU4pIE1BVENIVChJRCwgJkZPTExPV19JRF9pbl9kZWZfc3RhdGVtYWNoaW5lNDgxNCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9zdGF0ZW1hY2hpbmVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gbWFjaGluZTsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCSAgCWlmKCBzcGNmci5pc1VuZGVmaW5lZCgpICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCSAgCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCSAgCQlzcGNmci5zZXRDb21wb25lbnRFeGVjdXRhYmxlKCk7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQkgIAl9CisgICAgICAgICAgICAJICAgICAgICAgICAgCQkgIAlQVVNIX0NUWF9DUE0oIG1hY2hpbmU9IHNlcDo6TWFjaGluZTo6bmV3U3RhdGVtYWNoaW5lKAorICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAJCQljb250YWluZXIsIFNUUigoaWQtPmdldFRleHQoaWQpKS0+Y2hhcnMpLCBzcGNmcikgKTsKKworCisgICAgICAgICAgICAJICAgICAgICAgICAgCQkgIAltYWNoaW5lCisgICAgICAgICAgICAJICAgICAgICAgICAgLT5nZXR3TW9kaWZpZXIoKS5vdmVycmlkZV9pZmRlZiggbWRmciApOworCisgICAgICAgICAgICAJICAgICAgICAgICAgCQkJY29udGFpbmVyLT5zYXZlT3duZWRFbGVtZW50KCBtYWNoaW5lCisgICAgICAgICAgICAJICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCQltYWNoaW5lCisgICAgICAgICAgICAJICAgICAgICAgICAgLT5nZXRVbmlxSW5zdGFuY2VTcGVjaWZpZXIoKS0+CisgICAgICAgICAgICAJICAgICAgICAgICAgCQkJCQlzZXRJbnN0YW5jZUNvdW50KGluaXRpYWxDb3VudCwgbWF4aW1hbENvdW50KTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCQorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDI6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE4MzA6NjogKCBMQlJBQ0tFVCB8IExCUkFDS0VUX0VYQ0VQVCApIChpZD0gSUQgKCBDT01NQSBpZD0gSUQgKSogfCBTVEFSICkgUkJSQUNLRVQKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTgzMDo2OiAoIExCUkFDS0VUIHwgTEJSQUNLRVRfRVhDRVBUICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0MTMyPTI7CisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIExCUkFDS0VUOgorICAgICAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQlhbHQxMzI9MTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIExCUkFDS0VUX0VYQ0VQVDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJYWx0MTMyPTI7CisgICAgICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYWNoaW5lOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAxMzI7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9zdGF0ZW1hY2hpbmVFeDsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTMyKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE4MzA6ODogTEJSQUNLRVQKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChMQlJBQ0tFVCwgJkZPTExPV19MQlJBQ0tFVF9pbl9kZWZfc3RhdGVtYWNoaW5lNDgyOCk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9zdGF0ZW1hY2hpbmVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gbWFjaGluZTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIHNwY2ZyLnNldEdyb3VwU29tZSgpOyAKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgICAgICAJY2FzZSAyOgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxODMxOjg6IExCUkFDS0VUX0VYQ0VQVAorICAgICAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKExCUkFDS0VUX0VYQ0VQVCwgJkZPTExPV19MQlJBQ0tFVF9FWENFUFRfaW5fZGVmX3N0YXRlbWFjaGluZTQ4NDcpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfc3RhdGVtYWNoaW5lRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG1hY2hpbmU7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICBzcGNmci5zZXRHcm91cEV4Y2VwdCgpOyAKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAJUFVTSF9DVFhfQ1BNKCBtYWNoaW5lPSBzZXA6Ok1hY2hpbmU6Om5ld1N0YXRlbWFjaGluZSgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCSAgCQkJY29udGFpbmVyLCAiW10iLCBzcGNmci8qLCB0eXBlKi8pICk7CisKKworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAJbWFjaGluZQorICAgICAgICAgICAgCSAgICAgICAgICAgIC0+Z2V0d01vZGlmaWVyKCkub3ZlcnJpZGVfaWZkZWYoIG1kZnIgKTsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJCWNvbnRhaW5lci0+c2F2ZU93bmVkRWxlbWVudCggbWFjaGluZQorICAgICAgICAgICAgCSAgICAgICAgICAgICApOworCisgICAgICAgICAgICAJICAgICAgICAgICAgCQkJbWFjaGluZQorICAgICAgICAgICAgCSAgICAgICAgICAgIC0+Z2V0VW5pcUluc3RhbmNlU3BlY2lmaWVyKCktPgorICAgICAgICAgICAgCSAgICAgICAgICAgIAkJCQkJc2V0SW5zdGFuY2VDb3VudChpbml0aWFsQ291bnQsIG1heGltYWxDb3VudCk7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQkKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxODQ1OjY6IChpZD0gSUQgKCBDT01NQSBpZD0gSUQgKSogfCBTVEFSICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0MTM0PTI7CisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIElEOgorICAgICAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQlhbHQxMzQ9MTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIFNUQVI6CisgICAgICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCWFsdDEzND0yOworICAgICAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFjaGluZTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMTM0OworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfc3RhdGVtYWNoaW5lRXg7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDEzNCkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxODQ1Ojg6IGlkPSBJRCAoIENPTU1BIGlkPSBJRCApKgorICAgICAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZCA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTikgTUFUQ0hUKElELCAmRk9MTE9XX0lEX2luX2RlZl9zdGF0ZW1hY2hpbmU0ODczKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3N0YXRlbWFjaGluZUV4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBtYWNoaW5lOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgbWFjaGluZQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIC0+YXBwZW5kR3JvdXBJZCggU1RSKChpZC0+Z2V0VGV4dChpZCkpLT5jaGFycykgKTsgCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTg0Njo4OiAoIENPTU1BIGlkPSBJRCApKgorCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBmb3IgKDs7KQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQxMzM9MjsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGNhc2UgQ09NTUE6CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJCWFsdDEzMz0xOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQxMzMpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTg0NjoxMDogQ09NTUEgaWQ9IElECisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoQ09NTUEsICZGT0xMT1dfQ09NTUFfaW5fZGVmX3N0YXRlbWFjaGluZTQ4OTUpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfc3RhdGVtYWNoaW5lRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG1hY2hpbmU7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWQgPSAocEFOVExSM19DT01NT05fVE9LRU4pIE1BVENIVChJRCwgJkZPTExPV19JRF9pbl9kZWZfc3RhdGVtYWNoaW5lNDg5OSk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9zdGF0ZW1hY2hpbmVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gbWFjaGluZTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIG1hY2hpbmUKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAtPmFwcGVuZEdyb3VwSWQoIFNUUigoaWQtPmdldFRleHQoaWQpKS0+Y2hhcnMpICk7IAorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCWRlZmF1bHQ6CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIGdvdG8gbG9vcDEzMzsJLyogYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGxvb3AxMzM6IDsgLyogSnVtcCBvdXQgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgICAgICAJY2FzZSAyOgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxODQ4Ojg6IFNUQVIKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChTVEFSLCAmRk9MTE9XX1NUQVJfaW5fZGVmX3N0YXRlbWFjaGluZTQ5MTUpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfc3RhdGVtYWNoaW5lRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG1hY2hpbmU7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICBtYWNoaW5lCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgLT5nZXR3U3BlY2lmaWVyKCkuc2V0R3JvdXBFdmVyeSgpOyAKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoUkJSQUNLRVQsICZGT0xMT1dfUkJSQUNLRVRfaW5fZGVmX3N0YXRlbWFjaGluZTQ5MzYpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfc3RhdGVtYWNoaW5lRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG1hY2hpbmU7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBtYWNoaW5lCisgICAgICAgICAgICAJICAgICAgICAgICAgLT5zZXRHcm91cElkKCk7IAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTg1NDo0OiAoIFN0cmluZ0xpdGVyYWwgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTM2PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTdHJpbmdMaXRlcmFsOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDEzNj0xOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMzYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTg1NDo2OiBTdHJpbmdMaXRlcmFsCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIFN0cmluZ0xpdGVyYWw2ID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoU3RyaW5nTGl0ZXJhbCwgJkZPTExPV19TdHJpbmdMaXRlcmFsX2luX2RlZl9zdGF0ZW1hY2hpbmU0OTUzKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3N0YXRlbWFjaGluZUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBtYWNoaW5lOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgbWFjaGluZQorICAgICAgICAgICAgCSAgICAgICAgICAgIC0+c2V0VW5yZXN0cmljdGVkTmFtZShTVFIoKFN0cmluZ0xpdGVyYWw2LT5nZXRUZXh0KFN0cmluZ0xpdGVyYWw2KSktPmNoYXJzKSk7IAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTg1ODo0OiAoIGRlZl9tYWNoaW5lX3BhcmFtZXRlcnNbIG1hY2hpbmUgXSApPworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQxMzc9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIExCUkFDS0VUOgorICAgICAgICAgICAgICAgICAgICBjYXNlIExQQVJFTjoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQxMzc9MTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTM3KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE4NTg6NDogZGVmX21hY2hpbmVfcGFyYW1ldGVyc1sgbWFjaGluZSBdCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlZl9tYWNoaW5lX3BhcmFtZXRlcnNfaW5fZGVmX3N0YXRlbWFjaGluZTQ5NzApOworICAgICAgICAgICAgCSAgICAgICAgZGVmX21hY2hpbmVfcGFyYW1ldGVycyhjdHgsIG1hY2hpbmUpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3N0YXRlbWFjaGluZUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBtYWNoaW5lOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTg2MDo0OiAoIGRlZl9tYWNoaW5lX3JldHVybnNbIG1hY2hpbmUgLCBzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9SRVRVUk5fUEFSQU1FVEVSX01PRElGSUVSIF0gKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTM4PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjM6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzY1OgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDEzOD0xOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMzgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTg2MDo0OiBkZWZfbWFjaGluZV9yZXR1cm5zWyBtYWNoaW5lICwgc2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfUkVUVVJOX1BBUkFNRVRFUl9NT0RJRklFUiBdCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlZl9tYWNoaW5lX3JldHVybnNfaW5fZGVmX3N0YXRlbWFjaGluZTQ5NzkpOworICAgICAgICAgICAgCSAgICAgICAgZGVmX21hY2hpbmVfcmV0dXJucyhjdHgsIG1hY2hpbmUsIHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX1JFVFVSTl9QQVJBTUVURVJfTU9ESUZJRVIpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3N0YXRlbWFjaGluZUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBtYWNoaW5lOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX2JvZHlfc3RhdGVtYWNoaW5lX2luX2RlZl9zdGF0ZW1hY2hpbmU0OTg4KTsKKyAgICAgICAgICAgIGRlZl9ib2R5X3N0YXRlbWFjaGluZShjdHgsIG1hY2hpbmUpOworCisgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX3N0YXRlbWFjaGluZUV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBtYWNoaW5lOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlZGVmX3N0YXRlbWFjaGluZUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZWRlZl9zdGF0ZW1hY2hpbmVFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgCVBPUF9DVFg7CisKKyAgICAgICAgICAgICAgICAgICAgCVNFVF9SVUxFX0xPQ0FUSU9OKG1hY2hpbmUpOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisKKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDU4LCBkZWZfc3RhdGVtYWNoaW5lX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gbWFjaGluZTsKK30KKy8qICRBTlRMUiBlbmQgZGVmX3N0YXRlbWFjaGluZSAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBkZWZfYm9keV9zdGF0ZW1hY2hpbmUKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE5MjM6MTogZGVmX2JvZHlfc3RhdGVtYWNoaW5lWyBzZXA6Ok1hY2hpbmUgKiBtYWNoaW5lIF0gOiBMQ1VSTFkgKCBzZWN0aW9uX2hlYWRlclsgbWFjaGluZSBdICk/ICggc2VjdGlvbl9pbXBvcnRbIG1hY2hpbmUgXSApPyAoIHNlY3Rpb25fcGFyYW1ldGVyWyBtYWNoaW5lIF0gKSogKCBzZWN0aW9uX3Byb3BlcnR5WyBtYWNoaW5lIF0gKSogKCBzZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmVbIG1hY2hpbmUgXSApKiAoIHNlY3Rpb25fcmVnaW9uWyBtYWNoaW5lIF0gKT8gKCBzZWN0aW9uX3RyYW5zaXRpb25bIG1hY2hpbmUgXSApPyAoIHNlY3Rpb25fbW9kZWxfb2ZfY29tcHV0YXRpb25bIG1hY2hpbmUgXSB8IHNlY3Rpb25fbW9kZWxfb2ZfZXhlY3V0aW9uWyBtYWNoaW5lIF0gfCBzZWN0aW9uX21vZGVsX29mX2ludGVyYWN0aW9uWyBtYWNoaW5lIF0gKSogUkNVUkxZIDsKKyAqLworc3RhdGljIHZvaWQKK2RlZl9ib2R5X3N0YXRlbWFjaGluZShwZm1sUGFyc2VyIGN0eCwgc2VwOjpNYWNoaW5lICogbWFjaGluZSkKK3sKKyAgICBBTlRMUjNfVUlOVDMyIGRlZl9ib2R5X3N0YXRlbWFjaGluZV9TdGFydEluZGV4OworCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGRlZl9ib2R5X3N0YXRlbWFjaGluZV9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSg1OSkpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTkyNDoyOiAoIExDVVJMWSAoIHNlY3Rpb25faGVhZGVyWyBtYWNoaW5lIF0gKT8gKCBzZWN0aW9uX2ltcG9ydFsgbWFjaGluZSBdICk/ICggc2VjdGlvbl9wYXJhbWV0ZXJbIG1hY2hpbmUgXSApKiAoIHNlY3Rpb25fcHJvcGVydHlbIG1hY2hpbmUgXSApKiAoIHNlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZVsgbWFjaGluZSBdICkqICggc2VjdGlvbl9yZWdpb25bIG1hY2hpbmUgXSApPyAoIHNlY3Rpb25fdHJhbnNpdGlvblsgbWFjaGluZSBdICk/ICggc2VjdGlvbl9tb2RlbF9vZl9jb21wdXRhdGlvblsgbWFjaGluZSBdIHwgc2VjdGlvbl9tb2RlbF9vZl9leGVjdXRpb25bIG1hY2hpbmUgXSB8IHNlY3Rpb25fbW9kZWxfb2ZfaW50ZXJhY3Rpb25bIG1hY2hpbmUgXSApKiBSQ1VSTFkgKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOTI0OjQ6IExDVVJMWSAoIHNlY3Rpb25faGVhZGVyWyBtYWNoaW5lIF0gKT8gKCBzZWN0aW9uX2ltcG9ydFsgbWFjaGluZSBdICk/ICggc2VjdGlvbl9wYXJhbWV0ZXJbIG1hY2hpbmUgXSApKiAoIHNlY3Rpb25fcHJvcGVydHlbIG1hY2hpbmUgXSApKiAoIHNlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZVsgbWFjaGluZSBdICkqICggc2VjdGlvbl9yZWdpb25bIG1hY2hpbmUgXSApPyAoIHNlY3Rpb25fdHJhbnNpdGlvblsgbWFjaGluZSBdICk/ICggc2VjdGlvbl9tb2RlbF9vZl9jb21wdXRhdGlvblsgbWFjaGluZSBdIHwgc2VjdGlvbl9tb2RlbF9vZl9leGVjdXRpb25bIG1hY2hpbmUgXSB8IHNlY3Rpb25fbW9kZWxfb2ZfaW50ZXJhY3Rpb25bIG1hY2hpbmUgXSApKiBSQ1VSTFkKKyAgICAgICAgeworICAgICAgICAgICAgIE1BVENIVChMQ1VSTFksICZGT0xMT1dfTENVUkxZX2luX2RlZl9ib2R5X3N0YXRlbWFjaGluZTUwMDcpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfYm9keV9zdGF0ZW1hY2hpbmVFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE5MjU6NDogKCBzZWN0aW9uX2hlYWRlclsgbWFjaGluZSBdICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDEzOT0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg4OgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDEzOT0xOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMzkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTkyNTo0OiBzZWN0aW9uX2hlYWRlclsgbWFjaGluZSBdCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3NlY3Rpb25faGVhZGVyX2luX2RlZl9ib2R5X3N0YXRlbWFjaGluZTUwMTIpOworICAgICAgICAgICAgCSAgICAgICAgc2VjdGlvbl9oZWFkZXIoY3R4LCBtYWNoaW5lKTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9ib2R5X3N0YXRlbWFjaGluZUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOTI2OjQ6ICggc2VjdGlvbl9pbXBvcnRbIG1hY2hpbmUgXSApPworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQxNDA9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDE5MjoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQxNDA9MTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTQwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE5MjY6NDogc2VjdGlvbl9pbXBvcnRbIG1hY2hpbmUgXQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19zZWN0aW9uX2ltcG9ydF9pbl9kZWZfYm9keV9zdGF0ZW1hY2hpbmU1MDIwKTsKKyAgICAgICAgICAgIAkgICAgICAgIHNlY3Rpb25faW1wb3J0KGN0eCwgbWFjaGluZSk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfYm9keV9zdGF0ZW1hY2hpbmVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTkyODo0OiAoIHNlY3Rpb25fcGFyYW1ldGVyWyBtYWNoaW5lIF0gKSoKKworICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTQxPTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDE5NToKKyAgICAgICAgICAgICAgICBjYXNlIDE5NjoKKyAgICAgICAgICAgICAgICBjYXNlIDIwNzoKKyAgICAgICAgICAgICAgICBjYXNlIDIwOToKKyAgICAgICAgICAgICAgICBjYXNlIDIxMDoKKyAgICAgICAgICAgICAgICBjYXNlIDIxOToKKyAgICAgICAgICAgICAgICBjYXNlIDIyMDoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0MTQxPTE7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE0MSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOTI4OjY6IHNlY3Rpb25fcGFyYW1ldGVyWyBtYWNoaW5lIF0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfc2VjdGlvbl9wYXJhbWV0ZXJfaW5fZGVmX2JvZHlfc3RhdGVtYWNoaW5lNTAzMSk7CisgICAgICAgICAgICAJICAgICAgICBzZWN0aW9uX3BhcmFtZXRlcihjdHgsIG1hY2hpbmUpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2JvZHlfc3RhdGVtYWNoaW5lRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAgICAgCSAgICBnb3RvIGxvb3AxNDE7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb29wMTQxOiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc2VwOjpUZW1wbGF0ZUZhY3Rvcnk6OmdlblByb3BlcnR5KCBtYWNoaW5lICk7IAorICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE5MzM6NDogKCBzZWN0aW9uX3Byb3BlcnR5WyBtYWNoaW5lIF0gKSoKKworICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTQyPTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDE3ODoKKyAgICAgICAgICAgICAgICBjYXNlIDIxMToKKyAgICAgICAgICAgICAgICBjYXNlIDIxMzoKKyAgICAgICAgICAgICAgICBjYXNlIDIxNDoKKyAgICAgICAgICAgICAgICBjYXNlIDIxNjoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0MTQyPTE7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE0MikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOTMzOjY6IHNlY3Rpb25fcHJvcGVydHlbIG1hY2hpbmUgXQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19zZWN0aW9uX3Byb3BlcnR5X2luX2RlZl9ib2R5X3N0YXRlbWFjaGluZTUwNTMpOworICAgICAgICAgICAgCSAgICAgICAgc2VjdGlvbl9wcm9wZXJ0eShjdHgsIG1hY2hpbmUpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2JvZHlfc3RhdGVtYWNoaW5lRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAgICAgCSAgICBnb3RvIGxvb3AxNDI7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb29wMTQyOiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTkzNTo0OiAoIHNlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZVsgbWFjaGluZSBdICkqCisKKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDE0Mz0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAxNzQ6CisgICAgICAgICAgICAgICAgY2FzZSAxODM6CisgICAgICAgICAgICAgICAgY2FzZSAxOTc6CisgICAgICAgICAgICAgICAgY2FzZSAyMDA6CisgICAgICAgICAgICAgICAgY2FzZSAyMDE6CisgICAgICAgICAgICAgICAgY2FzZSAyMDM6CisgICAgICAgICAgICAgICAgY2FzZSAyMTI6CisgICAgICAgICAgICAgICAgY2FzZSAyMTU6CisgICAgICAgICAgICAgICAgY2FzZSAyMjI6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDE0Mz0xOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNDMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTkzNTo2OiBzZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmVbIG1hY2hpbmUgXQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19zZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmVfaW5fZGVmX2JvZHlfc3RhdGVtYWNoaW5lNTA2Nik7CisgICAgICAgICAgICAJICAgICAgICBzZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmUoY3R4LCBtYWNoaW5lKTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9ib2R5X3N0YXRlbWFjaGluZUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdDoKKyAgICAgICAgICAgIAkgICAgZ290byBsb29wMTQzOwkvKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgKi8KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9vcDE0MzogOyAvKiBKdW1wIG91dCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE5Mzc6NDogKCBzZWN0aW9uX3JlZ2lvblsgbWFjaGluZSBdICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDE0ND0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjE3OgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDE0ND0xOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTkzNzo0OiBzZWN0aW9uX3JlZ2lvblsgbWFjaGluZSBdCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3NlY3Rpb25fcmVnaW9uX2luX2RlZl9ib2R5X3N0YXRlbWFjaGluZTUwNzYpOworICAgICAgICAgICAgCSAgICAgICAgc2VjdGlvbl9yZWdpb24oY3R4LCBtYWNoaW5lKTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9ib2R5X3N0YXRlbWFjaGluZUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOTM5OjQ6ICggc2VjdGlvbl90cmFuc2l0aW9uWyBtYWNoaW5lIF0gKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTQ1PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzE6CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJYWx0MTQ1PTE7CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE0NSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOTM5OjQ6IHNlY3Rpb25fdHJhbnNpdGlvblsgbWFjaGluZSBdCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3NlY3Rpb25fdHJhbnNpdGlvbl9pbl9kZWZfYm9keV9zdGF0ZW1hY2hpbmU1MDg1KTsKKyAgICAgICAgICAgIAkgICAgICAgIHNlY3Rpb25fdHJhbnNpdGlvbihjdHgsIG1hY2hpbmUpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2JvZHlfc3RhdGVtYWNoaW5lRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHNlcDo6VGVtcGxhdGVGYWN0b3J5OjpnZW5CZWhhdmlvcihtYWNoaW5lKTsgCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTk0NDo0OiAoIHNlY3Rpb25fbW9kZWxfb2ZfY29tcHV0YXRpb25bIG1hY2hpbmUgXSB8IHNlY3Rpb25fbW9kZWxfb2ZfZXhlY3V0aW9uWyBtYWNoaW5lIF0gfCBzZWN0aW9uX21vZGVsX29mX2ludGVyYWN0aW9uWyBtYWNoaW5lIF0gKSoKKworICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTQ2PTQ7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDIwMjoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0MTQ2PTE7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyMDQ6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDE0Nj0yOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMTcyOgorICAgICAgICAgICAgICAgIGNhc2UgMTk4OgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQxNDY9MzsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTQ2KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE5NDQ6Njogc2VjdGlvbl9tb2RlbF9vZl9jb21wdXRhdGlvblsgbWFjaGluZSBdCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3NlY3Rpb25fbW9kZWxfb2ZfY29tcHV0YXRpb25faW5fZGVmX2JvZHlfc3RhdGVtYWNoaW5lNTEwNik7CisgICAgICAgICAgICAJICAgICAgICBzZWN0aW9uX21vZGVsX29mX2NvbXB1dGF0aW9uKGN0eCwgbWFjaGluZSk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfYm9keV9zdGF0ZW1hY2hpbmVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDI6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE5NDU6Njogc2VjdGlvbl9tb2RlbF9vZl9leGVjdXRpb25bIG1hY2hpbmUgXQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19zZWN0aW9uX21vZGVsX29mX2V4ZWN1dGlvbl9pbl9kZWZfYm9keV9zdGF0ZW1hY2hpbmU1MTE0KTsKKyAgICAgICAgICAgIAkgICAgICAgIHNlY3Rpb25fbW9kZWxfb2ZfZXhlY3V0aW9uKGN0eCwgbWFjaGluZSk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfYm9keV9zdGF0ZW1hY2hpbmVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDM6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE5NDY6Njogc2VjdGlvbl9tb2RlbF9vZl9pbnRlcmFjdGlvblsgbWFjaGluZSBdCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3NlY3Rpb25fbW9kZWxfb2ZfaW50ZXJhY3Rpb25faW5fZGVmX2JvZHlfc3RhdGVtYWNoaW5lNTEyMik7CisgICAgICAgICAgICAJICAgICAgICBzZWN0aW9uX21vZGVsX29mX2ludGVyYWN0aW9uKGN0eCwgbWFjaGluZSk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfYm9keV9zdGF0ZW1hY2hpbmVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQ6CisgICAgICAgICAgICAJICAgIGdvdG8gbG9vcDE0NjsJLyogYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvb3AxNDY6IDsgLyogSnVtcCBvdXQgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKworCisgICAgICAgICAgICAgTUFUQ0hUKFJDVVJMWSwgJkZPTExPV19SQ1VSTFlfaW5fZGVmX2JvZHlfc3RhdGVtYWNoaW5lNTEzNCk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9ib2R5X3N0YXRlbWFjaGluZUV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVkZWZfYm9keV9zdGF0ZW1hY2hpbmVFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVkZWZfYm9keV9zdGF0ZW1hY2hpbmVFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDU5LCBkZWZfYm9keV9zdGF0ZW1hY2hpbmVfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGRlZl9ib2R5X3N0YXRlbWFjaGluZSAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBzZWN0aW9uX3JlZ2lvbgorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTk1MjoxOiBzZWN0aW9uX3JlZ2lvblsgc2VwOjpNYWNoaW5lICogY29udGFpbmVyIF0gOiAnQHJlZ2lvbjonIChtPSBhbnlfZGVmX3N0YXRlbWFjaGluZVsgY29udGFpbmVyICwgbWRmciAsIHNwY2ZyIF0gKSsgOworICovCitzdGF0aWMgdm9pZAorc2VjdGlvbl9yZWdpb24ocGZtbFBhcnNlciBjdHgsIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lcikKK3sKKyAgICBBTlRMUjNfVUlOVDMyIHNlY3Rpb25fcmVnaW9uX1N0YXJ0SW5kZXg7CisKKyAgICBzZXA6Ok1hY2hpbmUgKiBtOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9tCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9tIHNlcDo6TWFjaGluZSAqCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgc2VjdGlvbl9yZWdpb25fU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworCisgICAgCSBzZXA6Ok1vZGlmaWVyIG1kZnI7CisKKyAgICAJc2VwOjpTcGVjaWZpZXIgc3BjZnI7CisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDYwKSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOTU4OjI6ICggJ0ByZWdpb246JyAobT0gYW55X2RlZl9zdGF0ZW1hY2hpbmVbIGNvbnRhaW5lciAsIG1kZnIgLCBzcGNmciBdICkrICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTk1ODo0OiAnQHJlZ2lvbjonIChtPSBhbnlfZGVmX3N0YXRlbWFjaGluZVsgY29udGFpbmVyICwgbWRmciAsIHNwY2ZyIF0gKSsKKyAgICAgICAgeworICAgICAgICAgICAgIE1BVENIVCgyMTcsICZGT0xMT1dfMjE3X2luX3NlY3Rpb25fcmVnaW9uNTE1Mik7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXNlY3Rpb25fcmVnaW9uRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIGNvbnRhaW5lci0+Z2V0d1NwZWNpZmllcigpLnNldE1vY1N0YXRlVHJhbnNpdGlvblN5c3RlbSgpOyAKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOTYxOjQ6IChtPSBhbnlfZGVmX3N0YXRlbWFjaGluZVsgY29udGFpbmVyICwgbWRmciAsIHNwY2ZyIF0gKSsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgY250MTQ3PTA7CisKKyAgICAgICAgICAgICAgICBmb3IgKDs7KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGFsdDE0Nz0yOworICAgICAgICAgICAgCXN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJY2FzZSAxNDQ6CisgICAgICAgICAgICAJY2FzZSAxNDU6CisgICAgICAgICAgICAJY2FzZSAxNDc6CisgICAgICAgICAgICAJY2FzZSAxNDg6CisgICAgICAgICAgICAJY2FzZSAxNDk6CisgICAgICAgICAgICAJY2FzZSAxNTA6CisgICAgICAgICAgICAJY2FzZSAxNTM6CisgICAgICAgICAgICAJY2FzZSAyNzI6CisgICAgICAgICAgICAJY2FzZSAzMDY6CisgICAgICAgICAgICAJY2FzZSAzMTQ6CisgICAgICAgICAgICAJY2FzZSAzMjI6CisgICAgICAgICAgICAJY2FzZSAzNTM6CisgICAgICAgICAgICAJY2FzZSAzNzg6CisgICAgICAgICAgICAJY2FzZSAzNzk6CisgICAgICAgICAgICAJY2FzZSAzOTM6CisgICAgICAgICAgICAJY2FzZSA0MDY6CisgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgIAkJCWFsdDE0Nz0xOworICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJfQorCisgICAgICAgICAgICAJc3dpdGNoIChhbHQxNDcpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICBjYXNlIDE6CisgICAgICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOTYxOjY6IG09IGFueV9kZWZfc3RhdGVtYWNoaW5lWyBjb250YWluZXIgLCBtZGZyICwgc3BjZnIgXQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2FueV9kZWZfc3RhdGVtYWNoaW5lX2luX3NlY3Rpb25fcmVnaW9uNTE2Nyk7CisgICAgICAgICAgICAJICAgICAgICAgICAgbT1hbnlfZGVmX3N0YXRlbWFjaGluZShjdHgsIGNvbnRhaW5lciwgbWRmciwgc3BjZnIpOworCisgICAgICAgICAgICAJICAgICAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZXNlY3Rpb25fcmVnaW9uRXg7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgIGRlZmF1bHQ6CisKKyAgICAgICAgICAgIAkJaWYgKCBjbnQxNDcgPj0gMSApCisgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgIAkJICAgIGdvdG8gbG9vcDE0NzsKKyAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgCQlpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgIAkJICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgIAkJICAgIHJldHVybiA7CisgICAgICAgICAgICAJCX0KKworICAgICAgICAgICAgCQkvKiBtaXNtYXRjaGVkU2V0RXgoKQorICAgICAgICAgICAgCQkgKi8KKyAgICAgICAgICAgIAkJQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgIAkJRVhDRVBUSU9OLT50eXBlID0gQU5UTFIzX0VBUkxZX0VYSVRfRVhDRVBUSU9OOworICAgICAgICAgICAgCQlFWENFUFRJT04tPm5hbWUgPSAodm9pZCAqKUFOVExSM19FQVJMWV9FWElUX05BTUU7CisKKworICAgICAgICAgICAgCQlnb3RvIHJ1bGVzZWN0aW9uX3JlZ2lvbkV4OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAljbnQxNDcrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9vcDE0NzogOwkvKiBKdW1wIHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlc2VjdGlvbl9yZWdpb25FeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVzZWN0aW9uX3JlZ2lvbkV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoNjAsIHNlY3Rpb25fcmVnaW9uX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBzZWN0aW9uX3JlZ2lvbiAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBzZWN0aW9uX3N0YXRlbWFjaGluZQorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTk2NDoxOiBzZWN0aW9uX3N0YXRlbWFjaGluZVsgc2VwOjpNYWNoaW5lICogY29udGFpbmVyIF0gOiAnQHN0YXRlbWFjaGluZTonIChtPSBhbnlfZGVmX3N0YXRlbWFjaGluZVsgY29udGFpbmVyICwgbWRmciAsIHNwY2ZyIF0gKSsgOworICovCitzdGF0aWMgdm9pZAorc2VjdGlvbl9zdGF0ZW1hY2hpbmUocGZtbFBhcnNlciBjdHgsIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lcikKK3sKKyAgICBBTlRMUjNfVUlOVDMyIHNlY3Rpb25fc3RhdGVtYWNoaW5lX1N0YXJ0SW5kZXg7CisKKyAgICBzZXA6Ok1hY2hpbmUgKiBtOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9tCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9tIHNlcDo6TWFjaGluZSAqCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgc2VjdGlvbl9zdGF0ZW1hY2hpbmVfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworCisgICAgCSBzZXA6Ok1vZGlmaWVyIG1kZnI7CisKKyAgICAJc2VwOjpTcGVjaWZpZXIgc3BjZnI7CisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDYxKSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOTcwOjI6ICggJ0BzdGF0ZW1hY2hpbmU6JyAobT0gYW55X2RlZl9zdGF0ZW1hY2hpbmVbIGNvbnRhaW5lciAsIG1kZnIgLCBzcGNmciBdICkrICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTk3MDo0OiAnQHN0YXRlbWFjaGluZTonIChtPSBhbnlfZGVmX3N0YXRlbWFjaGluZVsgY29udGFpbmVyICwgbWRmciAsIHNwY2ZyIF0gKSsKKyAgICAgICAgeworICAgICAgICAgICAgIE1BVENIVCgyMjcsICZGT0xMT1dfMjI3X2luX3NlY3Rpb25fc3RhdGVtYWNoaW5lNTE4OCk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXNlY3Rpb25fc3RhdGVtYWNoaW5lRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIGNvbnRhaW5lci0+Z2V0d1NwZWNpZmllcigpLnNldE1vY1N0YXRlVHJhbnNpdGlvblN5c3RlbSgpOyAKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOTczOjQ6IChtPSBhbnlfZGVmX3N0YXRlbWFjaGluZVsgY29udGFpbmVyICwgbWRmciAsIHNwY2ZyIF0gKSsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgY250MTQ4PTA7CisKKyAgICAgICAgICAgICAgICBmb3IgKDs7KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGFsdDE0OD0yOworICAgICAgICAgICAgCXN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJY2FzZSAxNDQ6CisgICAgICAgICAgICAJY2FzZSAxNDU6CisgICAgICAgICAgICAJY2FzZSAxNDc6CisgICAgICAgICAgICAJY2FzZSAxNDg6CisgICAgICAgICAgICAJY2FzZSAxNDk6CisgICAgICAgICAgICAJY2FzZSAxNTA6CisgICAgICAgICAgICAJY2FzZSAxNTM6CisgICAgICAgICAgICAJY2FzZSAyNzI6CisgICAgICAgICAgICAJY2FzZSAzMDY6CisgICAgICAgICAgICAJY2FzZSAzMTQ6CisgICAgICAgICAgICAJY2FzZSAzMjI6CisgICAgICAgICAgICAJY2FzZSAzNTM6CisgICAgICAgICAgICAJY2FzZSAzNzg6CisgICAgICAgICAgICAJY2FzZSAzNzk6CisgICAgICAgICAgICAJY2FzZSAzOTM6CisgICAgICAgICAgICAJY2FzZSA0MDY6CisgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgIAkJCWFsdDE0OD0xOworICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJfQorCisgICAgICAgICAgICAJc3dpdGNoIChhbHQxNDgpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICBjYXNlIDE6CisgICAgICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOTczOjY6IG09IGFueV9kZWZfc3RhdGVtYWNoaW5lWyBjb250YWluZXIgLCBtZGZyICwgc3BjZnIgXQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2FueV9kZWZfc3RhdGVtYWNoaW5lX2luX3NlY3Rpb25fc3RhdGVtYWNoaW5lNTIwMyk7CisgICAgICAgICAgICAJICAgICAgICAgICAgbT1hbnlfZGVmX3N0YXRlbWFjaGluZShjdHgsIGNvbnRhaW5lciwgbWRmciwgc3BjZnIpOworCisgICAgICAgICAgICAJICAgICAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZXNlY3Rpb25fc3RhdGVtYWNoaW5lRXg7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgIGRlZmF1bHQ6CisKKyAgICAgICAgICAgIAkJaWYgKCBjbnQxNDggPj0gMSApCisgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgIAkJICAgIGdvdG8gbG9vcDE0ODsKKyAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgCQlpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgIAkJICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgIAkJICAgIHJldHVybiA7CisgICAgICAgICAgICAJCX0KKworICAgICAgICAgICAgCQkvKiBtaXNtYXRjaGVkU2V0RXgoKQorICAgICAgICAgICAgCQkgKi8KKyAgICAgICAgICAgIAkJQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgIAkJRVhDRVBUSU9OLT50eXBlID0gQU5UTFIzX0VBUkxZX0VYSVRfRVhDRVBUSU9OOworICAgICAgICAgICAgCQlFWENFUFRJT04tPm5hbWUgPSAodm9pZCAqKUFOVExSM19FQVJMWV9FWElUX05BTUU7CisKKworICAgICAgICAgICAgCQlnb3RvIHJ1bGVzZWN0aW9uX3N0YXRlbWFjaGluZUV4OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAljbnQxNDgrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9vcDE0ODogOwkvKiBKdW1wIHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlc2VjdGlvbl9zdGF0ZW1hY2hpbmVFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVzZWN0aW9uX3N0YXRlbWFjaGluZUV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoNjEsIHNlY3Rpb25fc3RhdGVtYWNoaW5lX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBzZWN0aW9uX3N0YXRlbWFjaGluZSAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBkZWZfc3RhdGUKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE5Nzg6MTogZGVmX3N0YXRlWyBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIgLFxuXHRcdHNlcDo6TW9kaWZpZXIgbWRmciAsIHNlcDo6U3BlY2lmaWVyIHNwY2ZyIF0gcmV0dXJucyBbIHNlcDo6TWFjaGluZSAqIHN0YXRlID0gTlVMTCBdIDogJ3N0YXRlJyAoIExUXyAoICdtb2M6JyApPyBleGVjdXRhYmxlX3NwZWNpZmllclsgc3BjZnIgXSBHVCApPyAoaWQ9IHN0YXRlX2lkIHwgKCBMQlJBQ0tFVCB8IExCUkFDS0VUX0VYQ0VQVCApIChpZD0gc3RhdGVfaWQgKCBDT01NQSBpZD0gc3RhdGVfaWQgKSogfCBTVEFSICkgUkJSQUNLRVQgKT8gKCBTdHJpbmdMaXRlcmFsICk/ICggZGVmX2JvZHlfc3RhdGVbIHN0YXRlIF0gfCBTRU1JICkgOworICovCitzdGF0aWMgc2VwOjpNYWNoaW5lICoKK2RlZl9zdGF0ZShwZm1sUGFyc2VyIGN0eCwgc2VwOjpNYWNoaW5lICogY29udGFpbmVyLCBzZXA6Ok1vZGlmaWVyIG1kZnIsIHNlcDo6U3BlY2lmaWVyIHNwY2ZyKQoreworICAgIHNlcDo6TWFjaGluZSAqIHN0YXRlOworCisgICAgQU5UTFIzX1VJTlQzMiBkZWZfc3RhdGVfU3RhcnRJbmRleDsKKworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIFN0cmluZ0xpdGVyYWw3OworICAgIHN0ZDo6c3RyaW5nIGlkOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9pZAorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfaWQgc3RkOjpzdHJpbmcKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBzdGF0ZSA9ICBOVUxMOworCisgICAgZGVmX3N0YXRlX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKworICAgIAlzdGQ6OnN0cmluZyBzaWQ7CisKKyAgICAJU0FWRV9SVUxFX0JFR0lOX0xPQ0FUSU9OOworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSg2MikpICkKKyAgICB7CisgICAgICAgIHsKKworICAgICAgICAgICAgCVBPUF9DVFg7CisKKyAgICAgICAgICAgIAlTRVRfUlVMRV9MT0NBVElPTihzdGF0ZSk7CisKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIHN0YXRlOworICAgIH0KKworICAgIFN0cmluZ0xpdGVyYWw3ICAgICAgID0gTlVMTDsKKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTk5MjoyOiAoICdzdGF0ZScgKCBMVF8gKCAnbW9jOicgKT8gZXhlY3V0YWJsZV9zcGVjaWZpZXJbIHNwY2ZyIF0gR1QgKT8gKGlkPSBzdGF0ZV9pZCB8ICggTEJSQUNLRVQgfCBMQlJBQ0tFVF9FWENFUFQgKSAoaWQ9IHN0YXRlX2lkICggQ09NTUEgaWQ9IHN0YXRlX2lkICkqIHwgU1RBUiApIFJCUkFDS0VUICk/ICggU3RyaW5nTGl0ZXJhbCApPyAoIGRlZl9ib2R5X3N0YXRlWyBzdGF0ZSBdIHwgU0VNSSApICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTk5Mjo0OiAnc3RhdGUnICggTFRfICggJ21vYzonICk/IGV4ZWN1dGFibGVfc3BlY2lmaWVyWyBzcGNmciBdIEdUICk/IChpZD0gc3RhdGVfaWQgfCAoIExCUkFDS0VUIHwgTEJSQUNLRVRfRVhDRVBUICkgKGlkPSBzdGF0ZV9pZCAoIENPTU1BIGlkPSBzdGF0ZV9pZCApKiB8IFNUQVIgKSBSQlJBQ0tFVCApPyAoIFN0cmluZ0xpdGVyYWwgKT8gKCBkZWZfYm9keV9zdGF0ZVsgc3RhdGUgXSB8IFNFTUkgKQorICAgICAgICB7CisgICAgICAgICAgICAgTUFUQ0hUKDM3OCwgJkZPTExPV18zNzhfaW5fZGVmX3N0YXRlNTIzNSk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9zdGF0ZUV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOTkzOjQ6ICggTFRfICggJ21vYzonICk/IGV4ZWN1dGFibGVfc3BlY2lmaWVyWyBzcGNmciBdIEdUICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDE1MD0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTFRfOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDE1MD0xOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNTApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTk5Mzo2OiBMVF8gKCAnbW9jOicgKT8gZXhlY3V0YWJsZV9zcGVjaWZpZXJbIHNwY2ZyIF0gR1QKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChMVF8sICZGT0xMT1dfTFRfX2luX2RlZl9zdGF0ZTUyNDIpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfc3RhdGVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gc3RhdGU7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTk5MzoxMDogKCAnbW9jOicgKT8KKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0MTQ5PTI7CisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzMjE6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAkJYWx0MTQ5PTE7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDE0OSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOTkzOjEyOiAnbW9jOicKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVCgzMjEsICZGT0xMT1dfMzIxX2luX2RlZl9zdGF0ZTUyNDYpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfc3RhdGVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gc3RhdGU7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leGVjdXRhYmxlX3NwZWNpZmllcl9pbl9kZWZfc3RhdGU1MjUyKTsKKyAgICAgICAgICAgIAkgICAgICAgIGV4ZWN1dGFibGVfc3BlY2lmaWVyKGN0eCwgc3BjZnIpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3N0YXRlRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHN0YXRlOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoR1QsICZGT0xMT1dfR1RfaW5fZGVmX3N0YXRlNTI1Nik7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9zdGF0ZUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBzdGF0ZTsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIHNpZCA9ICIkIiArIHNwY2ZyLnN0ckFueVN0YXRlTW9jKCIiKTsgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxOTk2OjQ6IChpZD0gc3RhdGVfaWQgfCAoIExCUkFDS0VUIHwgTEJSQUNLRVRfRVhDRVBUICkgKGlkPSBzdGF0ZV9pZCAoIENPTU1BIGlkPSBzdGF0ZV9pZCApKiB8IFNUQVIgKSBSQlJBQ0tFVCApPworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQxNTQ9MzsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIERPTExBUjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ1OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDE0NjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ4OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTA6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTUzOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDE1ND0xOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTEJSQUNLRVQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTEJSQUNLRVRfRVhDRVBUOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDE1ND0yOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNTQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTk5Njo2OiBpZD0gc3RhdGVfaWQKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfc3RhdGVfaWRfaW5fZGVmX3N0YXRlNTI3OCk7CisgICAgICAgICAgICAJICAgICAgICBpZD1zdGF0ZV9pZChjdHgpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3N0YXRlRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHN0YXRlOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgCWlmKCBzcGNmci5jb3VsZEJlU3RhdGVNb2NTSU1QTEUoKSApCisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAJeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgCQlzcGNmci5zZXRTdGF0ZU1vY1NJTVBMRSgpOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgCX0KKworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgCVBVU0hfQ1RYX0NQTSgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIAkJCXN0YXRlPSBzZXA6Ok1hY2hpbmU6Om5ld1N0YXRlKGNvbnRhaW5lciwgCisgICAgICAgICAgICAJICAgICAgICAgICAgaWQKKyAgICAgICAgICAgIAkgICAgICAgICAgICAsIHNwY2ZyKSApOworCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIAlzdGF0ZQorICAgICAgICAgICAgCSAgICAgICAgICAgIC0+Z2V0d01vZGlmaWVyKCkub3ZlcnJpZGVfaWZkZWYoIG1kZnIgKTsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJCWNvbnRhaW5lci0+c2F2ZU93bmVkRWxlbWVudCggc3RhdGUKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDI6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIwMTE6NjogKCBMQlJBQ0tFVCB8IExCUkFDS0VUX0VYQ0VQVCApIChpZD0gc3RhdGVfaWQgKCBDT01NQSBpZD0gc3RhdGVfaWQgKSogfCBTVEFSICkgUkJSQUNLRVQKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjAxMTo2OiAoIExCUkFDS0VUIHwgTEJSQUNLRVRfRVhDRVBUICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0MTUxPTI7CisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIExCUkFDS0VUOgorICAgICAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQlhbHQxNTE9MTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIExCUkFDS0VUX0VYQ0VQVDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJYWx0MTUxPTI7CisgICAgICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMTUxOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfc3RhdGVFeDsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTUxKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIwMTE6ODogTEJSQUNLRVQKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChMQlJBQ0tFVCwgJkZPTExPV19MQlJBQ0tFVF9pbl9kZWZfc3RhdGU1Mjk1KTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3N0YXRlRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHN0YXRlOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgc3BjZnIuc2V0R3JvdXBTb21lKCk7IAorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDI6CisgICAgICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIwMTI6ODogTEJSQUNLRVRfRVhDRVBUCisgICAgICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoTEJSQUNLRVRfRVhDRVBULCAmRk9MTE9XX0xCUkFDS0VUX0VYQ0VQVF9pbl9kZWZfc3RhdGU1MzE0KTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3N0YXRlRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHN0YXRlOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgc3BjZnIuc2V0R3JvdXBFeGNlcHQoKTsgCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCSAgCVBVU0hfQ1RYX0NQTSgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCSAgCQkJc3RhdGU9IHNlcDo6TWFjaGluZTo6bmV3U3RhdGUoY29udGFpbmVyLCAiW10iLCBzcGNmcikgKTsKKworCisgICAgICAgICAgICAJICAgICAgICAgICAgCQkJY29udGFpbmVyLT5zYXZlT3duZWRFbGVtZW50KCBzdGF0ZQorICAgICAgICAgICAgCSAgICAgICAgICAgICApOworCisgICAgICAgICAgICAJICAgICAgICAgICAgCQkgIAlzdGF0ZQorICAgICAgICAgICAgCSAgICAgICAgICAgIC0+Z2V0d01vZGlmaWVyKCkub3ZlcnJpZGVfaWZkZWYoIG1kZnIgKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCQorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIwMjM6NjogKGlkPSBzdGF0ZV9pZCAoIENPTU1BIGlkPSBzdGF0ZV9pZCApKiB8IFNUQVIgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQxNTM9MjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgRE9MTEFSOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgSUQ6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSAxNDQ6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSAxNDU6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSAxNDY6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSAxNDc6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSAxNDg6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSAxNDk6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSAxNTA6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSAxNTM6CisgICAgICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCWFsdDE1Mz0xOworICAgICAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgU1RBUjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJYWx0MTUzPTI7CisgICAgICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMTUzOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfc3RhdGVFeDsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTUzKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIwMjM6ODogaWQ9IHN0YXRlX2lkICggQ09NTUEgaWQ9IHN0YXRlX2lkICkqCisgICAgICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3N0YXRlX2lkX2luX2RlZl9zdGF0ZTUzNDApOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWQ9c3RhdGVfaWQoY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9zdGF0ZUV4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBzdGF0ZTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIHN0YXRlCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgLT5hcHBlbmRHcm91cElkKCBpZAorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICApOyAKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMDI0Ojg6ICggQ09NTUEgaWQ9IHN0YXRlX2lkICkqCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDE1Mj0yOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgY2FzZSBDT01NQToKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkJYWx0MTUyPTE7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDE1MikKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMDI0OjEwOiBDT01NQSBpZD0gc3RhdGVfaWQKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChDT01NQSwgJkZPTExPV19DT01NQV9pbl9kZWZfc3RhdGU1MzYyKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3N0YXRlRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHN0YXRlOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3N0YXRlX2lkX2luX2RlZl9zdGF0ZTUzNjYpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWQ9c3RhdGVfaWQoY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9zdGF0ZUV4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBzdGF0ZTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIHN0YXRlCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgLT5hcHBlbmRHcm91cElkKCBpZAorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICApOyAKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICBnb3RvIGxvb3AxNTI7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBsb29wMTUyOiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjAyNjo4OiBTVEFSCisgICAgICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoU1RBUiwgJkZPTExPV19TVEFSX2luX2RlZl9zdGF0ZTUzODIpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfc3RhdGVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gc3RhdGU7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICBzdGF0ZQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIC0+Z2V0d1NwZWNpZmllcigpLnNldEdyb3VwRXZlcnkoKTsgCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKFJCUkFDS0VULCAmRk9MTE9XX1JCUkFDS0VUX2luX2RlZl9zdGF0ZTU0MDMpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfc3RhdGVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gc3RhdGU7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBzdGF0ZQorICAgICAgICAgICAgCSAgICAgICAgICAgIC0+c2V0R3JvdXBJZCgpOyAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIAkJaWYoIHN0YXRlCisgICAgICAgICAgICAgICAgID09IE5VTEwgKQorICAgICAgICAgICAgICAgIAkJeworICAgICAgICAgICAgICAgIAkJCVBVU0hfQ1RYX0NQTSgKKyAgICAgICAgICAgICAgICAJCQkJCXN0YXRlPSBzZXA6Ok1hY2hpbmU6Om5ld1N0YXRlKGNvbnRhaW5lciwgc2lkLCBzcGNmcikgKTsKKworCisgICAgICAgICAgICAgICAgCQkJc3RhdGUKKyAgICAgICAgICAgICAgICAtPmdldHdNb2RpZmllcigpLm92ZXJyaWRlX2lmZGVmKCBtZGZyICk7CisKKyAgICAgICAgICAgICAgICAJCQljb250YWluZXItPnNhdmVPd25lZEVsZW1lbnQoIHN0YXRlCisgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAgICAgCSAgCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjA0NDo0OiAoIFN0cmluZ0xpdGVyYWwgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTU1PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTdHJpbmdMaXRlcmFsOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDE1NT0xOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNTUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjA0NDo2OiBTdHJpbmdMaXRlcmFsCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIFN0cmluZ0xpdGVyYWw3ID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoU3RyaW5nTGl0ZXJhbCwgJkZPTExPV19TdHJpbmdMaXRlcmFsX2luX2RlZl9zdGF0ZTU0MjcpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfc3RhdGVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gc3RhdGU7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBzdGF0ZQorICAgICAgICAgICAgCSAgICAgICAgICAgIC0+c2V0VW5yZXN0cmljdGVkTmFtZShTVFIoKFN0cmluZ0xpdGVyYWw3LT5nZXRUZXh0KFN0cmluZ0xpdGVyYWw3KSktPmNoYXJzKSk7IAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjA0ODo0OiAoIGRlZl9ib2R5X3N0YXRlWyBzdGF0ZSBdIHwgU0VNSSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDE1Nj0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBMQ1VSTFk6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDE1Nj0xOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU0VNSToKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0MTU2PTI7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMTU2OworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfc3RhdGVFeDsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTU2KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIwNDg6NjogZGVmX2JvZHlfc3RhdGVbIHN0YXRlIF0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX2JvZHlfc3RhdGVfaW5fZGVmX3N0YXRlNTQ0Nik7CisgICAgICAgICAgICAJICAgICAgICBkZWZfYm9keV9zdGF0ZShjdHgsIHN0YXRlKTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9zdGF0ZUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBzdGF0ZTsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAyOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMDQ4OjMyOiBTRU1JCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoU0VNSSwgJkZPTExPV19TRU1JX2luX2RlZl9zdGF0ZTU0NTEpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfc3RhdGVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gc3RhdGU7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZWRlZl9zdGF0ZUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZWRlZl9zdGF0ZUV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICAJUE9QX0NUWDsKKworICAgICAgICAgICAgICAgICAgICAJU0VUX1JVTEVfTE9DQVRJT04oc3RhdGUpOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisKKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDYyLCBkZWZfc3RhdGVfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiBzdGF0ZTsKK30KKy8qICRBTlRMUiBlbmQgZGVmX3N0YXRlICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IHN0YXRlX2t3X2lkCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMDUyOjE6IHN0YXRlX2t3X2lkIHJldHVybnMgWyBzdGQ6OnN0cmluZyBzIF0gOiAoICcjaW5pdCcgfCAnI2luaXRpYWwnIHwgJyNzdGFydCcgfCAnI2RoaXN0b3J5JyB8ICcjc2hpc3RvcnknIHwgJyNmaW5hbCcgfCAnI3Rlcm1pbmFsJyB8ICcjcmV0dXJuJyApOworICovCitzdGF0aWMgc3RkOjpzdHJpbmcKK3N0YXRlX2t3X2lkKHBmbWxQYXJzZXIgY3R4KQoreworICAgIHN0ZDo6c3RyaW5nIHM7CisKKyAgICBBTlRMUjNfVUlOVDMyIHN0YXRlX2t3X2lkX1N0YXJ0SW5kZXg7CisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgc3RhdGVfa3dfaWRfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoNjMpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIHM7CisgICAgfQorCisgICAgeworICAgICAgICB7CisgICAgICAgICAgICAvLyAgL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjA1NDoyOiAoICcjaW5pdCcgfCAnI2luaXRpYWwnIHwgJyNzdGFydCcgfCAnI2RoaXN0b3J5JyB8ICcjc2hpc3RvcnknIHwgJyNmaW5hbCcgfCAnI3Rlcm1pbmFsJyB8ICcjcmV0dXJuJyApCisKKyAgICAgICAgICAgIEFOVExSM19VSU5UMzIgYWx0MTU3OworCisgICAgICAgICAgICBhbHQxNTc9ODsKKworICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAxNDY6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQxNTc9MTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE0NzoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDE1Nz0yOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTUwOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MTU3PTM7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNDQ6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQxNTc9NDsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE0OToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDE1Nz01OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTQ1OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MTU3PTY7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNTM6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQxNTc9NzsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE0ODoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDE1Nz04OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMTU3OworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgZ290byBydWxlc3RhdGVfa3dfaWRFeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE1NykKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMDU0OjQ6ICcjaW5pdCcKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMTQ2LCAmRk9MTE9XXzE0Nl9pbl9zdGF0ZV9rd19pZDU0NjkpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZV9rd19pZEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIHM9ICIjaW5pdCIgICAgOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMDU1OjQ6ICcjaW5pdGlhbCcKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMTQ3LCAmRk9MTE9XXzE0N19pbl9zdGF0ZV9rd19pZDU0ODEpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZV9rd19pZEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIHM9ICIjaW5pdGlhbCIgOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMzoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMDU2OjQ6ICcjc3RhcnQnCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDE1MCwgJkZPTExPV18xNTBfaW5fc3RhdGVfa3dfaWQ1NDkwKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVfa3dfaWRFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBzPSAiI3N0YXJ0IiAgIDsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDQ6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjA1ODo0OiAnI2RoaXN0b3J5JworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgxNDQsICZGT0xMT1dfMTQ0X2luX3N0YXRlX2t3X2lkNTUwMik7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlX2t3X2lkRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgcz0gIiNkaGlzdG9yeSI7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA1OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIwNTk6NDogJyNzaGlzdG9yeScKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMTQ5LCAmRk9MTE9XXzE0OV9pbl9zdGF0ZV9rd19pZDU1MTApOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZV9rd19pZEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIHM9ICIjc2hpc3RvcnkiOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgNjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMDYxOjQ6ICcjZmluYWwnCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDE0NSwgJkZPTExPV18xNDVfaW5fc3RhdGVfa3dfaWQ1NTE5KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVfa3dfaWRFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBzPSAiI2ZpbmFsIiAgIDsKKyAgICAgICAgCSAgICAgICAgICAgICBuZWVkRGVmYXVsdFN0YXRlRmluYWwucmVtb3ZlKF9DUE1fKTsgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA3OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIwNjQ6NDogJyN0ZXJtaW5hbCcKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMTUzLCAmRk9MTE9XXzE1M19pbl9zdGF0ZV9rd19pZDU1MjgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZV9rd19pZEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIHM9ICIjdGVybWluYWwiOworICAgICAgICAJICAgICAgICAgICAgIG5lZWREZWZhdWx0U3RhdGVUZXJtaW5hbC5yZW1vdmUoX0NQTV8pOyAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDg6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjA2Nzo0OiAnI3JldHVybicKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMTQ4LCAmRk9MTE9XXzE0OF9pbl9zdGF0ZV9rd19pZDU1MzcpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZV9rd19pZEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIHM9ICIjcmV0dXJuIiAgOworICAgICAgICAJICAgICAgICAgICAgIG5lZWREZWZhdWx0U3RhdGVSZXR1cm4ucmVtb3ZlKF9DUE1fKTsgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZXN0YXRlX2t3X2lkRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlc3RhdGVfa3dfaWRFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDYzLCBzdGF0ZV9rd19pZF9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIHM7Cit9CisvKiAkQU5UTFIgZW5kIHN0YXRlX2t3X2lkICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IHN0YXRlX2lkCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMDcxOjE6IHN0YXRlX2lkIHJldHVybnMgWyBzdGQ6OnN0cmluZyBzIF0gOiAoa3c9IHN0YXRlX2t3X2lkIHxpZD0gSUQgfCBET0xMQVIgaWQ9IElEICk7CisgKi8KK3N0YXRpYyBzdGQ6OnN0cmluZworc3RhdGVfaWQocGZtbFBhcnNlciBjdHgpCit7CisgICAgc3RkOjpzdHJpbmcgczsKKworICAgIEFOVExSM19VSU5UMzIgc3RhdGVfaWRfU3RhcnRJbmRleDsKKworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIGlkOworICAgIHN0ZDo6c3RyaW5nIGt3OworICAgICN1bmRlZglSRVRVUk5fVFlQRV9rdworICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfa3cgc3RkOjpzdHJpbmcKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBzdGF0ZV9pZF9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSg2NCkpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gczsKKyAgICB9CisKKyAgICBpZCAgICAgICA9IE5VTEw7CisKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vICAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMDczOjI6IChrdz0gc3RhdGVfa3dfaWQgfGlkPSBJRCB8IERPTExBUiBpZD0gSUQgKQorCisgICAgICAgICAgICBBTlRMUjNfVUlOVDMyIGFsdDE1ODsKKworICAgICAgICAgICAgYWx0MTU4PTM7CisKKyAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMTQ0OgorICAgICAgICAgICAgY2FzZSAxNDU6CisgICAgICAgICAgICBjYXNlIDE0NjoKKyAgICAgICAgICAgIGNhc2UgMTQ3OgorICAgICAgICAgICAgY2FzZSAxNDg6CisgICAgICAgICAgICBjYXNlIDE0OToKKyAgICAgICAgICAgIGNhc2UgMTUwOgorICAgICAgICAgICAgY2FzZSAxNTM6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQxNTg9MTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIElEOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MTU4PTI7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBET0xMQVI6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQxNTg9MzsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDE1ODsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlX2lkRXg7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQxNTgpCisgICAgICAgICAgICB7CisgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjA3Mzo0OiBrdz0gc3RhdGVfa3dfaWQKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3N0YXRlX2t3X2lkX2luX3N0YXRlX2lkNTU1Nyk7CisgICAgICAgIAkgICAgICAgIGt3PXN0YXRlX2t3X2lkKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlX2lkRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgcz0gCisgICAgICAgIAkgICAgICAgICAgICBrdworICAgICAgICAJICAgICAgICAgICAgOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMDc0OjQ6IGlkPSBJRAorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgaWQgPSAocEFOVExSM19DT01NT05fVE9LRU4pIE1BVENIVChJRCwgJkZPTExPV19JRF9pbl9zdGF0ZV9pZDU1NjcpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZV9pZEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIHM9IFNUUigoaWQtPmdldFRleHQoaWQpKS0+Y2hhcnMpOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMzoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMDc1OjQ6IERPTExBUiBpZD0gSUQKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoRE9MTEFSLCAmRk9MTE9XX0RPTExBUl9pbl9zdGF0ZV9pZDU1ODQpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZV9pZEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlkID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoSUQsICZGT0xMT1dfSURfaW5fc3RhdGVfaWQ1NTg4KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVfaWRFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBzPSAiJCIgKyBTVFIoKGlkLT5nZXRUZXh0KGlkKSktPmNoYXJzKTsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZXN0YXRlX2lkRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlc3RhdGVfaWRFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDY0LCBzdGF0ZV9pZF9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIHM7Cit9CisvKiAkQU5UTFIgZW5kIHN0YXRlX2lkICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGRlZl9zdGF0ZV9zaW5nbGV0b24KKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIwODE6MTogZGVmX3N0YXRlX3NpbmdsZXRvblsgc2VwOjpNYWNoaW5lICogY29udGFpbmVyICxcblx0XHRzZXA6Ok1vZGlmaWVyIG1kZnIgLCBzZXA6OlNwZWNpZmllciBzcGNmciBdIHJldHVybnMgWyBzZXA6Ok1hY2hpbmUgKiBzdGF0ZSBdIDogKCAoICcjaW5pdGlhbCcgfCAnI3N0YXJ0JyB8ICcjZGhpc3RvcnknIHwgJyNzaGlzdG9yeScgKSBMQ1VSTFkgZGVmX2JvZHlfc3RhdGVfc2ltcGxpZlsgc3RhdGUgXSBSQ1VSTFkgfCAnI2ZpbmFsJyBicz0gYmxvY2tfc3RhdGVtZW50IHwgJyN0ZXJtaW5hbCcgYnM9IGJsb2NrX3N0YXRlbWVudCB8ICcjcmV0dXJuJyBicz0gYmxvY2tfc3RhdGVtZW50ICk7CisgKi8KK3N0YXRpYyBzZXA6Ok1hY2hpbmUgKgorZGVmX3N0YXRlX3NpbmdsZXRvbihwZm1sUGFyc2VyIGN0eCwgc2VwOjpNYWNoaW5lICogY29udGFpbmVyLCBzZXA6Ok1vZGlmaWVyIG1kZnIsIHNlcDo6U3BlY2lmaWVyIHNwY2ZyKQoreworICAgIHNlcDo6TWFjaGluZSAqIHN0YXRlOworCisgICAgQU5UTFIzX1VJTlQzMiBkZWZfc3RhdGVfc2luZ2xldG9uX1N0YXJ0SW5kZXg7CisKKyAgICBzZXA6OkJGQ29kZSBiczsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfYnMKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2JzIHNlcDo6QkZDb2RlCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgZGVmX3N0YXRlX3NpbmdsZXRvbl9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisKKyAgICAJU0FWRV9SVUxFX0JFR0lOX0xPQ0FUSU9OOworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSg2NSkpICkKKyAgICB7CisgICAgICAgIHsKKworICAgICAgICAgICAgCXN0YXRlLT5nZXR3TW9kaWZpZXIoKS5vdmVycmlkZV9pZmRlZiggbWRmciApOworCisgICAgICAgICAgICAJUE9QX0NUWDsKKworICAgICAgICAgICAgCVNFVF9SVUxFX0xPQ0FUSU9OKHN0YXRlKTsKKworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gc3RhdGU7CisgICAgfQorCisgICAgeworICAgICAgICB7CisgICAgICAgICAgICAvLyAgL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjA5NToyOiAoICggJyNpbml0aWFsJyB8ICcjc3RhcnQnIHwgJyNkaGlzdG9yeScgfCAnI3NoaXN0b3J5JyApIExDVVJMWSBkZWZfYm9keV9zdGF0ZV9zaW1wbGlmWyBzdGF0ZSBdIFJDVVJMWSB8ICcjZmluYWwnIGJzPSBibG9ja19zdGF0ZW1lbnQgfCAnI3Rlcm1pbmFsJyBicz0gYmxvY2tfc3RhdGVtZW50IHwgJyNyZXR1cm4nIGJzPSBibG9ja19zdGF0ZW1lbnQgKQorCisgICAgICAgICAgICBBTlRMUjNfVUlOVDMyIGFsdDE2MDsKKworICAgICAgICAgICAgYWx0MTYwPTQ7CisKKyAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMTQ0OgorICAgICAgICAgICAgY2FzZSAxNDc6CisgICAgICAgICAgICBjYXNlIDE0OToKKyAgICAgICAgICAgIGNhc2UgMTUwOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MTYwPTE7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNDU6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQxNjA9MjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE1MzoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDE2MD0zOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTQ4OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MTYwPTQ7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMTYwOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX3N0YXRlX3NpbmdsZXRvbkV4OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTYwKQorICAgICAgICAgICAgeworICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIwOTU6NDogKCAnI2luaXRpYWwnIHwgJyNzdGFydCcgfCAnI2RoaXN0b3J5JyB8ICcjc2hpc3RvcnknICkgTENVUkxZIGRlZl9ib2R5X3N0YXRlX3NpbXBsaWZbIHN0YXRlIF0gUkNVUkxZCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMDk1OjQ6ICggJyNpbml0aWFsJyB8ICcjc3RhcnQnIHwgJyNkaGlzdG9yeScgfCAnI3NoaXN0b3J5JyApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQxNTk9NDsKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMTQ3OgorICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgIAkJYWx0MTU5PTE7CisgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgY2FzZSAxNTA6CisgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgCQlhbHQxNTk9MjsKKyAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDE0NDoKKyAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAJCWFsdDE1OT0zOworICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMTQ5OgorICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgIAkJYWx0MTU5PTQ7CisgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAJICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMTU5OworICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX3N0YXRlX3NpbmdsZXRvbkV4OworCisgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTU5KQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIwOTU6NjogJyNpbml0aWFsJworICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVCgxNDcsICZGT0xMT1dfMTQ3X2luX2RlZl9zdGF0ZV9zaW5nbGV0b241NjI0KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3N0YXRlX3NpbmdsZXRvbkV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHN0YXRlOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgCVBVU0hfQ1RYX0NQTSggc3RhdGU9IHNlcDo6TWFjaGluZTo6bmV3U3RhdGUoCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAJCQljb250YWluZXIsICIjaW5pdGlhbCIsIHNwY2ZyLnNldFBzZXVkb3N0YXRlTW9jSU5JVElBTCgpKSApOworCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgIAljb250YWluZXItPnNhdmVPd25lZEVsZW1lbnQoIHN0YXRlCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgIAorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMTAzOjY6ICcjc3RhcnQnCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKDE1MCwgJkZPTExPV18xNTBfaW5fZGVmX3N0YXRlX3NpbmdsZXRvbjU2MzcpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfc3RhdGVfc2luZ2xldG9uRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gc3RhdGU7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAJUFVTSF9DVFhfQ1BNKCBzdGF0ZT0gc2VwOjpNYWNoaW5lOjpuZXdTdGF0ZSgKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgIAkJCWNvbnRhaW5lciwgIiNzdGFydCIsIHNwY2ZyLnNldFN0YXRlTW9jU1RBUlQoKSkgKTsKKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAJY29udGFpbmVyLT5zYXZlT3duZWRFbGVtZW50KCBzdGF0ZQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAljYXNlIDM6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjExMTo2OiAnI2RoaXN0b3J5JworICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVCgxNDQsICZGT0xMT1dfMTQ0X2luX2RlZl9zdGF0ZV9zaW5nbGV0b241NjUwKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3N0YXRlX3NpbmdsZXRvbkV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHN0YXRlOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgCVBVU0hfQ1RYX0NQTSggc3RhdGU9IHNlcDo6TWFjaGluZTo6bmV3U3RhdGUoCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAJCQljb250YWluZXIsICIjZGhpc3RvcnkiLAorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgCQkJc3BjZnIuc2V0UHNldWRvc3RhdGVNb2NERUVQX0hJU1RPUlkoKSkgKTsKKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAJY29udGFpbmVyLT5zYXZlT3duZWRFbGVtZW50KCBzdGF0ZQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAljYXNlIDQ6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjEyMDo2OiAnI3NoaXN0b3J5JworICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVCgxNDksICZGT0xMT1dfMTQ5X2luX2RlZl9zdGF0ZV9zaW5nbGV0b241NjYzKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3N0YXRlX3NpbmdsZXRvbkV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHN0YXRlOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgCVBVU0hfQ1RYX0NQTSggc3RhdGU9IHNlcDo6TWFjaGluZTo6bmV3U3RhdGUoCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAJCQljb250YWluZXIsICIjc2hpc3RvcnkiLAorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgCQkJc3BjZnIuc2V0UHNldWRvc3RhdGVNb2NTSEFMTE9XX0hJU1RPUlkoKSkgKTsKKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAJY29udGFpbmVyLT5zYXZlT3duZWRFbGVtZW50KCBzdGF0ZQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICBNQVRDSFQoTENVUkxZLCAmRk9MTE9XX0xDVVJMWV9pbl9kZWZfc3RhdGVfc2luZ2xldG9uNTY3OCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9zdGF0ZV9zaW5nbGV0b25FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBzdGF0ZTsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX2JvZHlfc3RhdGVfc2ltcGxpZl9pbl9kZWZfc3RhdGVfc2luZ2xldG9uNTY4MSk7CisgICAgICAgIAkgICAgICAgIGRlZl9ib2R5X3N0YXRlX3NpbXBsaWYoY3R4LCBzdGF0ZSk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9zdGF0ZV9zaW5nbGV0b25FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBzdGF0ZTsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChSQ1VSTFksICZGT0xMT1dfUkNVUkxZX2luX2RlZl9zdGF0ZV9zaW5nbGV0b241Njg1KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3N0YXRlX3NpbmdsZXRvbkV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHN0YXRlOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMTMxOjQ6ICcjZmluYWwnIGJzPSBibG9ja19zdGF0ZW1lbnQKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMTQ1LCAmRk9MTE9XXzE0NV9pbl9kZWZfc3RhdGVfc2luZ2xldG9uNTY5MSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9zdGF0ZV9zaW5nbGV0b25FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBzdGF0ZTsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9zdGF0ZV9zaW5nbGV0b241Njk1KTsKKyAgICAgICAgCSAgICAgICAgYnM9YmxvY2tfc3RhdGVtZW50KGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9zdGF0ZV9zaW5nbGV0b25FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBzdGF0ZTsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisKKyAgICAgICAgCSAgICAgICAgICAgIAkJUFVTSF9DVFhfQ1BNKCBzdGF0ZT0gc2VwOjpNYWNoaW5lOjpuZXdTdGF0ZSgKKyAgICAgICAgCSAgICAgICAgICAgIAkJCWNvbnRhaW5lciwgIiNmaW5hbCIsIHNwY2ZyLnNldFN0YXRlTW9jRklOQUwoKSkgKTsKKworCisgICAgICAgIAkgICAgICAgICAgICAJICAJY29udGFpbmVyLT5zYXZlT3duZWRFbGVtZW50KCBzdGF0ZQorICAgICAgICAJICAgICAgICAgICAgICk7CisKKyAgICAgICAgCSAgICAgICAgICAgIAkJc3RhdGUKKyAgICAgICAgCSAgICAgICAgICAgIC0+Z2V0VW5pcUJlaGF2aW9yUGFydCgpLT5zZXFPbkZpbmFsKGJzCisgICAgICAgIAkgICAgICAgICAgICApOworCisgICAgICAgIAkgICAgICAgICAgICAJCW5lZWREZWZhdWx0U3RhdGVGaW5hbC5yZW1vdmUoY29udGFpbmVyKTsKKyAgICAgICAgCSAgICAgICAgICAgIAkKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDM6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjE0Mzo0OiAnI3Rlcm1pbmFsJyBicz0gYmxvY2tfc3RhdGVtZW50CisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDE1MywgJkZPTExPV18xNTNfaW5fZGVmX3N0YXRlX3NpbmdsZXRvbjU3MDQpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfc3RhdGVfc2luZ2xldG9uRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gc3RhdGU7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfc3RhdGVfc2luZ2xldG9uNTcwOCk7CisgICAgICAgIAkgICAgICAgIGJzPWJsb2NrX3N0YXRlbWVudChjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfc3RhdGVfc2luZ2xldG9uRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gc3RhdGU7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworCisgICAgICAgIAkgICAgICAgICAgICAJCVBVU0hfQ1RYX0NQTSggc3RhdGU9IHNlcDo6TWFjaGluZTo6bmV3U3RhdGUoCisgICAgICAgIAkgICAgICAgICAgICAJCQljb250YWluZXIsICIjdGVybWluYWwiLCBzcGNmci5zZXRQc2V1ZG9zdGF0ZU1vY1RFUk1JTkFMKCkpICk7CisKKworICAgICAgICAJICAgICAgICAgICAgCSAgCWNvbnRhaW5lci0+c2F2ZU93bmVkRWxlbWVudCggc3RhdGUKKyAgICAgICAgCSAgICAgICAgICAgICApOworCisgICAgICAgIAkgICAgICAgICAgICAJCXN0YXRlCisgICAgICAgIAkgICAgICAgICAgICAtPmdldFVuaXFCZWhhdmlvclBhcnQoKS0+c2VxT25GaW5hbChicworICAgICAgICAJICAgICAgICAgICAgKTsKKworICAgICAgICAJICAgICAgICAgICAgCQluZWVkRGVmYXVsdFN0YXRlVGVybWluYWwucmVtb3ZlKGNvbnRhaW5lcik7CisgICAgICAgIAkgICAgICAgICAgICAJCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA0OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIxNTU6NDogJyNyZXR1cm4nIGJzPSBibG9ja19zdGF0ZW1lbnQKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMTQ4LCAmRk9MTE9XXzE0OF9pbl9kZWZfc3RhdGVfc2luZ2xldG9uNTcxNyk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9zdGF0ZV9zaW5nbGV0b25FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBzdGF0ZTsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9zdGF0ZV9zaW5nbGV0b241NzIxKTsKKyAgICAgICAgCSAgICAgICAgYnM9YmxvY2tfc3RhdGVtZW50KGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9zdGF0ZV9zaW5nbGV0b25FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBzdGF0ZTsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisKKyAgICAgICAgCSAgICAgICAgICAgIAkJUFVTSF9DVFhfQ1BNKCBzdGF0ZT0gc2VwOjpNYWNoaW5lOjpuZXdTdGF0ZSgKKyAgICAgICAgCSAgICAgICAgICAgIAkJCWNvbnRhaW5lciwgIiNyZXR1cm4iLCBzcGNmci5zZXRQc2V1ZG9zdGF0ZU1vY1JFVFVSTigpKSApOworCisKKyAgICAgICAgCSAgICAgICAgICAgIAkgIAljb250YWluZXItPnNhdmVPd25lZEVsZW1lbnQoIHN0YXRlCisgICAgICAgIAkgICAgICAgICAgICAgKTsKKworICAgICAgICAJICAgICAgICAgICAgCQlzdGF0ZQorICAgICAgICAJICAgICAgICAgICAgLT5nZXRVbmlxQmVoYXZpb3JQYXJ0KCktPnNlcU9uRmluYWwoYnMKKyAgICAgICAgCSAgICAgICAgICAgICk7CisKKyAgICAgICAgCSAgICAgICAgICAgIAkJbmVlZERlZmF1bHRTdGF0ZVJldHVybi5yZW1vdmUoY29udGFpbmVyKTsKKyAgICAgICAgCSAgICAgICAgICAgIAkKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZWRlZl9zdGF0ZV9zaW5nbGV0b25FeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVkZWZfc3RhdGVfc2luZ2xldG9uRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIAlzdGF0ZS0+Z2V0d01vZGlmaWVyKCkub3ZlcnJpZGVfaWZkZWYoIG1kZnIgKTsKKworICAgICAgICAgICAgICAgICAgICAJUE9QX0NUWDsKKworICAgICAgICAgICAgICAgICAgICAJU0VUX1JVTEVfTE9DQVRJT04oc3RhdGUpOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisKKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDY1LCBkZWZfc3RhdGVfc2luZ2xldG9uX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gc3RhdGU7Cit9CisvKiAkQU5UTFIgZW5kIGRlZl9zdGF0ZV9zaW5nbGV0b24gKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgZXhlY3V0YWJsZV9zcGVjaWZpZXIKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIxNjk6MTogZXhlY3V0YWJsZV9zcGVjaWZpZXJbIHNlcDo6U3BlY2lmaWVyICYgc3BjZnIgXSA6IGthPSBleGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tWyBzcGNmciBdICggQkFORCBrYT0gZXhlY3V0YWJsZV9zcGVjaWZpZXJfYXRvbVsgc3BjZnIgXSApKiA7CisgKi8KK3N0YXRpYyB2b2lkCitleGVjdXRhYmxlX3NwZWNpZmllcihwZm1sUGFyc2VyIGN0eCwgc2VwOjpTcGVjaWZpZXIgJiBzcGNmcikKK3sKKyAgICBBTlRMUjNfVUlOVDMyIGV4ZWN1dGFibGVfc3BlY2lmaWVyX1N0YXJ0SW5kZXg7CisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgZXhlY3V0YWJsZV9zcGVjaWZpZXJfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoNjYpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIxNzA6MjogKGthPSBleGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tWyBzcGNmciBdICggQkFORCBrYT0gZXhlY3V0YWJsZV9zcGVjaWZpZXJfYXRvbVsgc3BjZnIgXSApKiApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIxNzA6NDoga2E9IGV4ZWN1dGFibGVfc3BlY2lmaWVyX2F0b21bIHNwY2ZyIF0gKCBCQU5EIGthPSBleGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tWyBzcGNmciBdICkqCisgICAgICAgIHsKKyAgICAgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4ZWN1dGFibGVfc3BlY2lmaWVyX2F0b21faW5fZXhlY3V0YWJsZV9zcGVjaWZpZXI1NzQwKTsKKyAgICAgICAgICAgIGV4ZWN1dGFibGVfc3BlY2lmaWVyX2F0b20oY3R4LCBzcGNmcik7CisKKyAgICAgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVleGVjdXRhYmxlX3NwZWNpZmllckV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjE3MTo0OiAoIEJBTkQga2E9IGV4ZWN1dGFibGVfc3BlY2lmaWVyX2F0b21bIHNwY2ZyIF0gKSoKKworICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTYxPTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJBTkQ6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDE2MT0xOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNjEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjE3MTo2OiBCQU5EIGthPSBleGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tWyBzcGNmciBdCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoQkFORCwgJkZPTExPV19CQU5EX2luX2V4ZWN1dGFibGVfc3BlY2lmaWVyNTc0OCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4ZWN1dGFibGVfc3BlY2lmaWVyRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tX2luX2V4ZWN1dGFibGVfc3BlY2lmaWVyNTc1Mik7CisgICAgICAgICAgICAJICAgICAgICBleGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tKGN0eCwgc3BjZnIpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhlY3V0YWJsZV9zcGVjaWZpZXJFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQ6CisgICAgICAgICAgICAJICAgIGdvdG8gbG9vcDE2MTsJLyogYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvb3AxNjE6IDsgLyogSnVtcCBvdXQgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKworCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZWV4ZWN1dGFibGVfc3BlY2lmaWVyRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlZXhlY3V0YWJsZV9zcGVjaWZpZXJFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDY2LCBleGVjdXRhYmxlX3NwZWNpZmllcl9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgZXhlY3V0YWJsZV9zcGVjaWZpZXIgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgZXhlY3V0YWJsZV9zcGVjaWZpZXJfYXRvbQorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjE3NToxOiBleGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tWyBzZXA6OlNwZWNpZmllciAmIHNwY2ZyIF0gOiAoaWQ9IElEIHwgJ3N0YXJ0JyB8ICdmaW5hbCcgfCAncmV0dXJuJyB8ICdjaG9pY2UnIHwgJ2ZvcmsnIHwgJ2pvaW4nIHwgJ2FuZCcgfCAnb3InIHwgJyNzdHMnIHwgJyNzdGYnIHwgJ2Zsb3cnICk7CisgKi8KK3N0YXRpYyB2b2lkCitleGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tKHBmbWxQYXJzZXIgY3R4LCBzZXA6OlNwZWNpZmllciAmIHNwY2ZyKQoreworICAgIEFOVExSM19VSU5UMzIgZXhlY3V0YWJsZV9zcGVjaWZpZXJfYXRvbV9TdGFydEluZGV4OworCisgICAgcEFOVExSM19DT01NT05fVE9LRU4gICAgaWQ7CisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgZXhlY3V0YWJsZV9zcGVjaWZpZXJfYXRvbV9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSg2NykpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIGlkICAgICAgID0gTlVMTDsKKworICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIxNzY6MjogKGlkPSBJRCB8ICdzdGFydCcgfCAnZmluYWwnIHwgJ3JldHVybicgfCAnY2hvaWNlJyB8ICdmb3JrJyB8ICdqb2luJyB8ICdhbmQnIHwgJ29yJyB8ICcjc3RzJyB8ICcjc3RmJyB8ICdmbG93JyApCisKKyAgICAgICAgICAgIEFOVExSM19VSU5UMzIgYWx0MTYyOworCisgICAgICAgICAgICBhbHQxNjI9MTI7CisKKyAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgSUQ6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQxNjI9MTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM3NzoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDE2Mj0yOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjgyOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MTYyPTM7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzNjQ6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQxNjI9NDsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI1NzoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDE2Mj01OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjg2OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MTYyPTY7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzMTI6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQxNjI9NzsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIzOToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDE2Mj04OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzM0OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MTYyPTk7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNTI6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQxNjI9MTA7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNTE6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQxNjI9MTE7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyODQ6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQxNjI9MTI7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDE2MjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWV4ZWN1dGFibGVfc3BlY2lmaWVyX2F0b21FeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE2MikKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMTc2OjQ6IGlkPSBJRAorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgaWQgPSAocEFOVExSM19DT01NT05fVE9LRU4pIE1BVENIVChJRCwgJkZPTExPV19JRF9pbl9leGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tNTc3Mik7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4ZWN1dGFibGVfc3BlY2lmaWVyX2F0b21FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIHNwY2ZyLnNldE1vYyggU1RSKChpZC0+Z2V0VGV4dChpZCkpLT5jaGFycykgKTsgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAyOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIxNzk6NDogJ3N0YXJ0JworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgzNzcsICZGT0xMT1dfMzc3X2luX2V4ZWN1dGFibGVfc3BlY2lmaWVyX2F0b201NzgyKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhlY3V0YWJsZV9zcGVjaWZpZXJfYXRvbUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgc3BjZnIuc2V0U3RhdGVNb2NTVEFSVCgpOyAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAzOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIxODA6NDogJ2ZpbmFsJworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgyODIsICZGT0xMT1dfMjgyX2luX2V4ZWN1dGFibGVfc3BlY2lmaWVyX2F0b201Nzk0KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhlY3V0YWJsZV9zcGVjaWZpZXJfYXRvbUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgc3BjZnIuc2V0U3RhdGVNb2NGSU5BTCgpOyAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA0OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIxODU6NDogJ3JldHVybicKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMzY0LCAmRk9MTE9XXzM2NF9pbl9leGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tNTgxMCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4ZWN1dGFibGVfc3BlY2lmaWVyX2F0b21FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIHNwY2ZyLnNldFBzZXVkb3N0YXRlTW9jUkVUVVJOKCk7ICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA1OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIxODg6NDogJ2Nob2ljZScKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMjU3LCAmRk9MTE9XXzI1N19pbl9leGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tNTgyMyk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4ZWN1dGFibGVfc3BlY2lmaWVyX2F0b21FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIHNwY2ZyLnNldFBzZXVkb3N0YXRlTW9jQ0hPSUNFKCk7ICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA2OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIxOTA6NDogJ2ZvcmsnCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDI4NiwgJkZPTExPV18yODZfaW5fZXhlY3V0YWJsZV9zcGVjaWZpZXJfYXRvbTU4MzUpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBzcGNmci5zZXRQc2V1ZG9zdGF0ZU1vY0ZPUksoKTsgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA3OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIxOTE6NDogJ2pvaW4nCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDMxMiwgJkZPTExPV18zMTJfaW5fZXhlY3V0YWJsZV9zcGVjaWZpZXJfYXRvbTU4NDgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBzcGNmci5zZXRQc2V1ZG9zdGF0ZU1vY0pPSU4oKTsgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA4OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIxOTY6NDogJ2FuZCcKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMjM5LCAmRk9MTE9XXzIzOV9pbl9leGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tNTg2NSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4ZWN1dGFibGVfc3BlY2lmaWVyX2F0b21FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIHNwY2ZyLnNldE1vY0NvbXBvc2l0ZVN0cnVjdHVyZSgpOyAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA5OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIxOTc6NDogJ29yJworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgzMzQsICZGT0xMT1dfMzM0X2luX2V4ZWN1dGFibGVfc3BlY2lmaWVyX2F0b201ODc5KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhlY3V0YWJsZV9zcGVjaWZpZXJfYXRvbUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgc3BjZnIuc2V0TW9jU3RhdGVUcmFuc2l0aW9uU3lzdGVtKCk7ICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDEwOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIxOTg6NDogJyNzdHMnCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDE1MiwgJkZPTExPV18xNTJfaW5fZXhlY3V0YWJsZV9zcGVjaWZpZXJfYXRvbTU4OTQpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBzcGNmci5zZXRNb2NTdGF0ZVRyYW5zaXRpb25TeXN0ZW0oKTsgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMTE6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjE5OTo0OiAnI3N0ZicKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMTUxLCAmRk9MTE9XXzE1MV9pbl9leGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tNTkwNyk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4ZWN1dGFibGVfc3BlY2lmaWVyX2F0b21FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIHNwY2ZyLnNldE1vY1N0YXRlVHJhbnNpdGlvbkZsb3coKTsgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMTI6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjIwMDo0OiAnZmxvdycKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMjg0LCAmRk9MTE9XXzI4NF9pbl9leGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tNTkyMCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4ZWN1dGFibGVfc3BlY2lmaWVyX2F0b21FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIHNwY2ZyLnNldENvbXBvc2l0ZU1vY0RhdGFGbG93KCk7ICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVleGVjdXRhYmxlX3NwZWNpZmllcl9hdG9tRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlZXhlY3V0YWJsZV9zcGVjaWZpZXJfYXRvbUV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoNjcsIGV4ZWN1dGFibGVfc3BlY2lmaWVyX2F0b21fU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGV4ZWN1dGFibGVfc3BlY2lmaWVyX2F0b20gKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgaW5zdGFuY2VfbWFjaGluZV9tb2RlbAorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjIwNToxOiBpbnN0YW5jZV9tYWNoaW5lX21vZGVsIHJldHVybnMgWyBzZXA6OkJGIG1vZGVsIF0gOiB0aWQ9IHF1YWxpZmllZE5hbWVJRCA7CisgKi8KK3N0YXRpYyBzZXA6OkJGCitpbnN0YW5jZV9tYWNoaW5lX21vZGVsKHBmbWxQYXJzZXIgY3R4KQoreworICAgIHNlcDo6QkYgbW9kZWw7CisKKyAgICBBTlRMUjNfVUlOVDMyIGluc3RhbmNlX21hY2hpbmVfbW9kZWxfU3RhcnRJbmRleDsKKworICAgIGZtbFBhcnNlcl9xdWFsaWZpZWROYW1lSURfcmV0dXJuIHRpZDsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfdGlkCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV90aWQgZm1sUGFyc2VyX3F1YWxpZmllZE5hbWVJRF9yZXR1cm4KKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBpbnN0YW5jZV9tYWNoaW5lX21vZGVsX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDY4KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiBtb2RlbDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIyMDc6MjogKHRpZD0gcXVhbGlmaWVkTmFtZUlEICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjIwNzo0OiB0aWQ9IHF1YWxpZmllZE5hbWVJRAorICAgICAgICB7CisgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5faW5zdGFuY2VfbWFjaGluZV9tb2RlbDU5NDcpOworICAgICAgICAgICAgdGlkPXF1YWxpZmllZE5hbWVJRChjdHgpOworCisgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlaW5zdGFuY2VfbWFjaGluZV9tb2RlbEV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBtb2RlbDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAJCW1vZGVsPSBzZXA6OlBhcnNlclV0aWw6OmdldEV4ZWN1dGFibGVNYWNoaW5lKAorICAgICAgICAgICAgICAgIHRpZC5zCisgICAgICAgICAgICAgICAgLCB0aWQubmIKKyAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAgICAgCQlpZiggbW9kZWwKKyAgICAgICAgICAgICAgICAuaW52YWxpZCgpICkKKyAgICAgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgICAgICAJCQlzZXA6OlBhcnNlclV0aWw6OmF2bV9zeW50YXhfZXJyb3IoCisgICAgICAgICAgICAgICAgCQkJCSJpbnN0YW5jZV9tYWNoaW5lX21vZGVsIiwgTFQoMCktPmdldExpbmUoTFQoMCkpICkKKyAgICAgICAgICAgICAgICAJCQkJCTw8ICJ1bmV4cGVjdGVkIElEPCAiIDw8IHRpZC5zCisgICAgICAgICAgICAgICAgIDw8ICIgPiIKKyAgICAgICAgICAgICAgICAJCQkJCTw8IHNlcDo6UGFyc2VyVXRpbDo6U1lOVEFYX0VSUk9SX0VPTDsKKyAgICAgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgICAgICAJCisgICAgICAgICAgICB9CisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVpbnN0YW5jZV9tYWNoaW5lX21vZGVsRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlaW5zdGFuY2VfbWFjaGluZV9tb2RlbEV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoNjgsIGluc3RhbmNlX21hY2hpbmVfbW9kZWxfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiBtb2RlbDsKK30KKy8qICRBTlRMUiBlbmQgaW5zdGFuY2VfbWFjaGluZV9tb2RlbCAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBkZWZfYm9keV9zdGF0ZQorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjIyMToxOiBkZWZfYm9keV9zdGF0ZVsgc2VwOjpNYWNoaW5lICogc3RhdGUgXSA6IExDVVJMWSAoICggZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0ICk9PiBkZWZfYm9keV9zdGF0ZV9zZWN0aW9uWyBzdGF0ZSBdIHwgZGVmX2JvZHlfc3RhdGVfc2ltcGxpZlsgc3RhdGUgXSApIFJDVVJMWSA7CisgKi8KK3N0YXRpYyB2b2lkCitkZWZfYm9keV9zdGF0ZShwZm1sUGFyc2VyIGN0eCwgc2VwOjpNYWNoaW5lICogc3RhdGUpCit7CisgICAgQU5UTFIzX1VJTlQzMiBkZWZfYm9keV9zdGF0ZV9TdGFydEluZGV4OworCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGRlZl9ib2R5X3N0YXRlX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDY5KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMjIyOjI6ICggTENVUkxZICggKCBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJlZGljYXQgKT0+IGRlZl9ib2R5X3N0YXRlX3NlY3Rpb25bIHN0YXRlIF0gfCBkZWZfYm9keV9zdGF0ZV9zaW1wbGlmWyBzdGF0ZSBdICkgUkNVUkxZICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjIyMjo0OiBMQ1VSTFkgKCAoIGRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdCApPT4gZGVmX2JvZHlfc3RhdGVfc2VjdGlvblsgc3RhdGUgXSB8IGRlZl9ib2R5X3N0YXRlX3NpbXBsaWZbIHN0YXRlIF0gKSBSQ1VSTFkKKyAgICAgICAgeworICAgICAgICAgICAgIE1BVENIVChMQ1VSTFksICZGT0xMT1dfTENVUkxZX2luX2RlZl9ib2R5X3N0YXRlNTk2NCk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9ib2R5X3N0YXRlRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMjIzOjQ6ICggKCBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJlZGljYXQgKT0+IGRlZl9ib2R5X3N0YXRlX3NlY3Rpb25bIHN0YXRlIF0gfCBkZWZfYm9keV9zdGF0ZV9zaW1wbGlmWyBzdGF0ZSBdICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTYzPTI7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEExNjNfMCA9IExBKDEpOworICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMjk2X2ZtbChjdHgpKSAmJiAoTEExNjNfMCA9PSAxNzggfHwgTEExNjNfMCA9PSAyMTMpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQxNjM9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQyOTZfZm1sKGN0eCkpICYmIChMQTE2M18wID09IDIxNikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDE2Mz0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDI5Nl9mbWwoY3R4KSkgJiYgKExBMTYzXzAgPT0gMjE0KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTYzPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMjk2X2ZtbChjdHgpKSAmJiAoTEExNjNfMCA9PSAyMTEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQxNjM9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQyOTZfZm1sKGN0eCkpICYmIChMQTE2M18wID09IDIyMikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDE2Mz0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDI5Nl9mbWwoY3R4KSkgJiYgKExBMTYzXzAgPT0gMjAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTYzPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMjk2X2ZtbChjdHgpKSAmJiAoTEExNjNfMCA9PSAyMTIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQxNjM9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQyOTZfZm1sKGN0eCkpICYmIChMQTE2M18wID09IDE3NCB8fCBMQTE2M18wID09IDE4MyB8fCBMQTE2M18wID09IDIwMCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDE2Mz0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDI5Nl9mbWwoY3R4KSkgJiYgKExBMTYzXzAgPT0gMjAzKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTYzPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMjk2X2ZtbChjdHgpKSAmJiAoTEExNjNfMCA9PSAyMTUpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQxNjM9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQyOTZfZm1sKGN0eCkpICYmIChMQTE2M18wID09IDE5NykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDE2Mz0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDI5Nl9mbWwoY3R4KSkgJiYgKExBMTYzXzAgPT0gMjE3KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTYzPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMjk2X2ZtbChjdHgpKSAmJiAoTEExNjNfMCA9PSAyMzEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQxNjM9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQyOTZfZm1sKGN0eCkpICYmIChMQTE2M18wID09IDIwMikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDE2Mz0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDI5Nl9mbWwoY3R4KSkgJiYgKExBMTYzXzAgPT0gMjA0KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTYzPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMjk2X2ZtbChjdHgpKSAmJiAoTEExNjNfMCA9PSAxNzIgfHwgTEExNjNfMCA9PSAxOTgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQxNjM9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMTYzXzAgPT0gUkNVUkxZKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTE2M18xNyA9IExBKDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQyOTZfZm1sKGN0eCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTYzPTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoQU5UTFIzX1RSVUUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTYzPTI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAxNjM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMTc7CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfYm9keV9zdGF0ZUV4OworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEExNjNfMCA9PSBBVF9JRCB8fCAoKExBMTYzXzAgPj0gMTQ0KSAmJiAoTEExNjNfMCA8PSAxNDUpKSB8fCAoKExBMTYzXzAgPj0gMTQ3KSAmJiAoTEExNjNfMCA8PSAxNTApKSB8fCBMQTE2M18wID09IDE1MyB8fCAoKExBMTYzXzAgPj0gMTY5KSAmJiAoTEExNjNfMCA8PSAxNzApKSB8fCBMQTE2M18wID09IDE3NyB8fCBMQTE2M18wID09IDE3OSB8fCBMQTE2M18wID09IDE4MiB8fCBMQTE2M18wID09IDE4NCB8fCAoKExBMTYzXzAgPj0gMTg5KSAmJiAoTEExNjNfMCA8PSAxOTEpKSB8fCBMQTE2M18wID09IDE5NCB8fCBMQTE2M18wID09IDE5OSB8fCAoKExBMTYzXzAgPj0gMjIzKSAmJiAoTEExNjNfMCA8PSAyMjQpKSB8fCBMQTE2M18wID09IDI0MyB8fCBMQTE2M18wID09IDI1OSB8fCBMQTE2M18wID09IDI2MiB8fCBMQTE2M18wID09IDI3MiB8fCBMQTE2M18wID09IDI4MiB8fCBMQTE2M18wID09IDI5OCB8fCAoKExBMTYzXzAgPj0gMzA1KSAmJiAoTEExNjNfMCA8PSAzMDYpKSB8fCBMQTE2M18wID09IDMxNCB8fCBMQTE2M18wID09IDMxOCB8fCBMQTE2M18wID09IDMyMiB8fCBMQTE2M18wID09IDM0MSB8fCBMQTE2M18wID09IDM0OSB8fCBMQTE2M18wID09IDM1MyB8fCBMQTE2M18wID09IDM1NSB8fCBMQTE2M18wID09IDM2MSB8fCBMQTE2M18wID09IDM2NCB8fCAoKExBMTYzXzAgPj0gMzc4KSAmJiAoTEExNjNfMCA8PSAzODApKSB8fCBMQTE2M18wID09IDM5MyB8fCAoKExBMTYzXzAgPj0gMzk1KSAmJiAoTEExNjNfMCA8PSAzOTYpKSB8fCBMQTE2M18wID09IDQwNiB8fCAoKExBMTYzXzAgPj0gNDEwKSAmJiAoTEExNjNfMCA8PSA0MTEpKSB8fCBMQTE2M18wID09IDQxNCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDE2Mz0yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMTYzOworICAgICAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9ib2R5X3N0YXRlRXg7CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE2MykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMjIzOjY6ICggZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0ICk9PiBkZWZfYm9keV9zdGF0ZV9zZWN0aW9uWyBzdGF0ZSBdCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlZl9ib2R5X3N0YXRlX3NlY3Rpb25faW5fZGVmX2JvZHlfc3RhdGU1OTg0KTsKKyAgICAgICAgICAgIAkgICAgICAgIGRlZl9ib2R5X3N0YXRlX3NlY3Rpb24oY3R4LCBzdGF0ZSk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfYm9keV9zdGF0ZUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjIyNjo2OiBkZWZfYm9keV9zdGF0ZV9zaW1wbGlmWyBzdGF0ZSBdCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlZl9ib2R5X3N0YXRlX3NpbXBsaWZfaW5fZGVmX2JvZHlfc3RhdGU1OTkzKTsKKyAgICAgICAgICAgIAkgICAgICAgIGRlZl9ib2R5X3N0YXRlX3NpbXBsaWYoY3R4LCBzdGF0ZSk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfYm9keV9zdGF0ZUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgTUFUQ0hUKFJDVVJMWSwgJkZPTExPV19SQ1VSTFlfaW5fZGVmX2JvZHlfc3RhdGU2MDA0KTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX2JvZHlfc3RhdGVFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlZGVmX2JvZHlfc3RhdGVFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVkZWZfYm9keV9zdGF0ZUV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoNjksIGRlZl9ib2R5X3N0YXRlX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBkZWZfYm9keV9zdGF0ZSAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBkZWZfYm9keV9zdGF0ZV9zZWN0aW9uCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMjMxOjE6IGRlZl9ib2R5X3N0YXRlX3NlY3Rpb25bIHNlcDo6TWFjaGluZSAqIG1hY2hpbmUgXSA6ICggc2VjdGlvbl9wcm9wZXJ0eVsgbWFjaGluZSBdICkqICggc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlWyBtYWNoaW5lIF0gKSogKCBzZWN0aW9uX3JlZ2lvblsgbWFjaGluZSBdICk/ICggc2VjdGlvbl90cmFuc2l0aW9uWyBtYWNoaW5lIF0gKT8gKCBzZWN0aW9uX21vZGVsX29mX2NvbXB1dGF0aW9uWyBtYWNoaW5lIF0gfCBzZWN0aW9uX21vZGVsX29mX2V4ZWN1dGlvblsgbWFjaGluZSBdIHwgc2VjdGlvbl9tb2RlbF9vZl9pbnRlcmFjdGlvblsgbWFjaGluZSBdICkqIDsKKyAqLworc3RhdGljIHZvaWQKK2RlZl9ib2R5X3N0YXRlX3NlY3Rpb24ocGZtbFBhcnNlciBjdHgsIHNlcDo6TWFjaGluZSAqIG1hY2hpbmUpCit7CisgICAgQU5UTFIzX1VJTlQzMiBkZWZfYm9keV9zdGF0ZV9zZWN0aW9uX1N0YXJ0SW5kZXg7CisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgZGVmX2JvZHlfc3RhdGVfc2VjdGlvbl9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSg3MCkpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjIzMjoyOiAoICggc2VjdGlvbl9wcm9wZXJ0eVsgbWFjaGluZSBdICkqICggc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlWyBtYWNoaW5lIF0gKSogKCBzZWN0aW9uX3JlZ2lvblsgbWFjaGluZSBdICk/ICggc2VjdGlvbl90cmFuc2l0aW9uWyBtYWNoaW5lIF0gKT8gKCBzZWN0aW9uX21vZGVsX29mX2NvbXB1dGF0aW9uWyBtYWNoaW5lIF0gfCBzZWN0aW9uX21vZGVsX29mX2V4ZWN1dGlvblsgbWFjaGluZSBdIHwgc2VjdGlvbl9tb2RlbF9vZl9pbnRlcmFjdGlvblsgbWFjaGluZSBdICkqICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjIzMjo0OiAoIHNlY3Rpb25fcHJvcGVydHlbIG1hY2hpbmUgXSApKiAoIHNlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZVsgbWFjaGluZSBdICkqICggc2VjdGlvbl9yZWdpb25bIG1hY2hpbmUgXSApPyAoIHNlY3Rpb25fdHJhbnNpdGlvblsgbWFjaGluZSBdICk/ICggc2VjdGlvbl9tb2RlbF9vZl9jb21wdXRhdGlvblsgbWFjaGluZSBdIHwgc2VjdGlvbl9tb2RlbF9vZl9leGVjdXRpb25bIG1hY2hpbmUgXSB8IHNlY3Rpb25fbW9kZWxfb2ZfaW50ZXJhY3Rpb25bIG1hY2hpbmUgXSApKgorICAgICAgICB7CisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMjMyOjQ6ICggc2VjdGlvbl9wcm9wZXJ0eVsgbWFjaGluZSBdICkqCisKKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDE2ND0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAxNzg6CisgICAgICAgICAgICAgICAgY2FzZSAyMTE6CisgICAgICAgICAgICAgICAgY2FzZSAyMTM6CisgICAgICAgICAgICAgICAgY2FzZSAyMTQ6CisgICAgICAgICAgICAgICAgY2FzZSAyMTY6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDE2ND0xOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNjQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjIzMjo2OiBzZWN0aW9uX3Byb3BlcnR5WyBtYWNoaW5lIF0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfc2VjdGlvbl9wcm9wZXJ0eV9pbl9kZWZfYm9keV9zdGF0ZV9zZWN0aW9uNjAxOSk7CisgICAgICAgICAgICAJICAgICAgICBzZWN0aW9uX3Byb3BlcnR5KGN0eCwgbWFjaGluZSk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfYm9keV9zdGF0ZV9zZWN0aW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAgICAgCSAgICBnb3RvIGxvb3AxNjQ7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb29wMTY0OiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjIzNDo0OiAoIHNlY3Rpb25fY29tcG9zaXRlX3N0cnVjdHVyZVsgbWFjaGluZSBdICkqCisKKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDE2NT0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAxNzQ6CisgICAgICAgICAgICAgICAgY2FzZSAxODM6CisgICAgICAgICAgICAgICAgY2FzZSAxOTc6CisgICAgICAgICAgICAgICAgY2FzZSAyMDA6CisgICAgICAgICAgICAgICAgY2FzZSAyMDE6CisgICAgICAgICAgICAgICAgY2FzZSAyMDM6CisgICAgICAgICAgICAgICAgY2FzZSAyMTI6CisgICAgICAgICAgICAgICAgY2FzZSAyMTU6CisgICAgICAgICAgICAgICAgY2FzZSAyMjI6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDE2NT0xOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNjUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjIzNDo2OiBzZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmVbIG1hY2hpbmUgXQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19zZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmVfaW5fZGVmX2JvZHlfc3RhdGVfc2VjdGlvbjYwMzEpOworICAgICAgICAgICAgCSAgICAgICAgc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlKGN0eCwgbWFjaGluZSk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfYm9keV9zdGF0ZV9zZWN0aW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAgICAgCSAgICBnb3RvIGxvb3AxNjU7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb29wMTY1OiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjIzNjo0OiAoIHNlY3Rpb25fcmVnaW9uWyBtYWNoaW5lIF0gKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTY2PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyMTc6CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJYWx0MTY2PTE7CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE2NikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMjM2OjQ6IHNlY3Rpb25fcmVnaW9uWyBtYWNoaW5lIF0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfc2VjdGlvbl9yZWdpb25faW5fZGVmX2JvZHlfc3RhdGVfc2VjdGlvbjYwNDEpOworICAgICAgICAgICAgCSAgICAgICAgc2VjdGlvbl9yZWdpb24oY3R4LCBtYWNoaW5lKTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9ib2R5X3N0YXRlX3NlY3Rpb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjIzODo0OiAoIHNlY3Rpb25fdHJhbnNpdGlvblsgbWFjaGluZSBdICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDE2Nz0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjMxOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDE2Nz0xOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNjcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjIzODo0OiBzZWN0aW9uX3RyYW5zaXRpb25bIG1hY2hpbmUgXQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19zZWN0aW9uX3RyYW5zaXRpb25faW5fZGVmX2JvZHlfc3RhdGVfc2VjdGlvbjYwNTApOworICAgICAgICAgICAgCSAgICAgICAgc2VjdGlvbl90cmFuc2l0aW9uKGN0eCwgbWFjaGluZSk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfYm9keV9zdGF0ZV9zZWN0aW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIyNDA6NDogKCBzZWN0aW9uX21vZGVsX29mX2NvbXB1dGF0aW9uWyBtYWNoaW5lIF0gfCBzZWN0aW9uX21vZGVsX29mX2V4ZWN1dGlvblsgbWFjaGluZSBdIHwgc2VjdGlvbl9tb2RlbF9vZl9pbnRlcmFjdGlvblsgbWFjaGluZSBdICkqCisKKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDE2OD00OworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAyMDI6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDE2OD0xOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjA0OgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQxNjg9MjsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE3MjoKKyAgICAgICAgICAgICAgICBjYXNlIDE5ODoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0MTY4PTM7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE2OCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMjQwOjY6IHNlY3Rpb25fbW9kZWxfb2ZfY29tcHV0YXRpb25bIG1hY2hpbmUgXQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19zZWN0aW9uX21vZGVsX29mX2NvbXB1dGF0aW9uX2luX2RlZl9ib2R5X3N0YXRlX3NlY3Rpb242MDYxKTsKKyAgICAgICAgICAgIAkgICAgICAgIHNlY3Rpb25fbW9kZWxfb2ZfY29tcHV0YXRpb24oY3R4LCBtYWNoaW5lKTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9ib2R5X3N0YXRlX3NlY3Rpb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDI6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIyNDE6Njogc2VjdGlvbl9tb2RlbF9vZl9leGVjdXRpb25bIG1hY2hpbmUgXQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19zZWN0aW9uX21vZGVsX29mX2V4ZWN1dGlvbl9pbl9kZWZfYm9keV9zdGF0ZV9zZWN0aW9uNjA2OSk7CisgICAgICAgICAgICAJICAgICAgICBzZWN0aW9uX21vZGVsX29mX2V4ZWN1dGlvbihjdHgsIG1hY2hpbmUpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2JvZHlfc3RhdGVfc2VjdGlvbkV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMzoKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjI0Mjo2OiBzZWN0aW9uX21vZGVsX29mX2ludGVyYWN0aW9uWyBtYWNoaW5lIF0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfc2VjdGlvbl9tb2RlbF9vZl9pbnRlcmFjdGlvbl9pbl9kZWZfYm9keV9zdGF0ZV9zZWN0aW9uNjA3Nyk7CisgICAgICAgICAgICAJICAgICAgICBzZWN0aW9uX21vZGVsX29mX2ludGVyYWN0aW9uKGN0eCwgbWFjaGluZSk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfYm9keV9zdGF0ZV9zZWN0aW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAgICAgCSAgICBnb3RvIGxvb3AxNjg7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb29wMTY4OiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVkZWZfYm9keV9zdGF0ZV9zZWN0aW9uRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlZGVmX2JvZHlfc3RhdGVfc2VjdGlvbkV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoNzAsIGRlZl9ib2R5X3N0YXRlX3NlY3Rpb25fU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGRlZl9ib2R5X3N0YXRlX3NlY3Rpb24gKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgZGVmX2JvZHlfc3RhdGVfc2ltcGxpZgorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjI0NjoxOiBkZWZfYm9keV9zdGF0ZV9zaW1wbGlmWyBzZXA6Ok1hY2hpbmUgKiBzdGF0ZSBdIDogKCAobT0gbW9kaWZpZXJfZGVjbGFyYXRpb24gKT8gKCBkZWNsX3ZhcmlhYmxlWyBzdGF0ZS0+Z2V0UHJvcGVydHlQYXJ0KCkgLCBtZGZyIF0gfGFkcz0gYW55X2RlZl9zdGF0ZW1hY2hpbmVbIHN0YXRlICwgbWRmciAsIHNwY2ZyIF0gfCBkZWZfdHJhbnNpdGlvblsgc3RhdGUgLCBtZGZyICwgc3BjZnIgXSB8IGRlZl9zdGF0ZV9hY3Rpdml0eVsgc3RhdGUgXSApICkqIDsKKyAqLworc3RhdGljIHZvaWQKK2RlZl9ib2R5X3N0YXRlX3NpbXBsaWYocGZtbFBhcnNlciBjdHgsIHNlcDo6TWFjaGluZSAqIHN0YXRlKQoreworICAgIEFOVExSM19VSU5UMzIgZGVmX2JvZHlfc3RhdGVfc2ltcGxpZl9TdGFydEluZGV4OworCisgICAgc2VwOjpNb2RpZmllciBtOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9tCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9tIHNlcDo6TW9kaWZpZXIKKworICAgIHNlcDo6TWFjaGluZSAqIGFkczsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfYWRzCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9hZHMgc2VwOjpNYWNoaW5lICoKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBkZWZfYm9keV9zdGF0ZV9zaW1wbGlmX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKworICAgIAkgc2VwOjpNb2RpZmllciBtZGZyOworCisgICAgCXNlcDo6U3BlY2lmaWVyIHNwY2ZyOworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSg3MSkpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjI1MjoyOiAoICggKG09IG1vZGlmaWVyX2RlY2xhcmF0aW9uICk/ICggZGVjbF92YXJpYWJsZVsgc3RhdGUtPmdldFByb3BlcnR5UGFydCgpICwgbWRmciBdIHxhZHM9IGFueV9kZWZfc3RhdGVtYWNoaW5lWyBzdGF0ZSAsIG1kZnIgLCBzcGNmciBdIHwgZGVmX3RyYW5zaXRpb25bIHN0YXRlICwgbWRmciAsIHNwY2ZyIF0gfCBkZWZfc3RhdGVfYWN0aXZpdHlbIHN0YXRlIF0gKSApKiApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIyNTI6NDogKCAobT0gbW9kaWZpZXJfZGVjbGFyYXRpb24gKT8gKCBkZWNsX3ZhcmlhYmxlWyBzdGF0ZS0+Z2V0UHJvcGVydHlQYXJ0KCkgLCBtZGZyIF0gfGFkcz0gYW55X2RlZl9zdGF0ZW1hY2hpbmVbIHN0YXRlICwgbWRmciAsIHNwY2ZyIF0gfCBkZWZfdHJhbnNpdGlvblsgc3RhdGUgLCBtZGZyICwgc3BjZnIgXSB8IGRlZl9zdGF0ZV9hY3Rpdml0eVsgc3RhdGUgXSApICkqCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIyNTI6NDogKCAobT0gbW9kaWZpZXJfZGVjbGFyYXRpb24gKT8gKCBkZWNsX3ZhcmlhYmxlWyBzdGF0ZS0+Z2V0UHJvcGVydHlQYXJ0KCkgLCBtZGZyIF0gfGFkcz0gYW55X2RlZl9zdGF0ZW1hY2hpbmVbIHN0YXRlICwgbWRmciAsIHNwY2ZyIF0gfCBkZWZfdHJhbnNpdGlvblsgc3RhdGUgLCBtZGZyICwgc3BjZnIgXSB8IGRlZl9zdGF0ZV9hY3Rpdml0eVsgc3RhdGUgXSApICkqCisKKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDE3MT0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBBVF9JRDoKKyAgICAgICAgICAgICAgICBjYXNlIDE0NDoKKyAgICAgICAgICAgICAgICBjYXNlIDE0NToKKyAgICAgICAgICAgICAgICBjYXNlIDE0NzoKKyAgICAgICAgICAgICAgICBjYXNlIDE0ODoKKyAgICAgICAgICAgICAgICBjYXNlIDE0OToKKyAgICAgICAgICAgICAgICBjYXNlIDE1MDoKKyAgICAgICAgICAgICAgICBjYXNlIDE1MzoKKyAgICAgICAgICAgICAgICBjYXNlIDE2OToKKyAgICAgICAgICAgICAgICBjYXNlIDE3MDoKKyAgICAgICAgICAgICAgICBjYXNlIDE3NzoKKyAgICAgICAgICAgICAgICBjYXNlIDE3OToKKyAgICAgICAgICAgICAgICBjYXNlIDE4MjoKKyAgICAgICAgICAgICAgICBjYXNlIDE4NDoKKyAgICAgICAgICAgICAgICBjYXNlIDE4OToKKyAgICAgICAgICAgICAgICBjYXNlIDE5MDoKKyAgICAgICAgICAgICAgICBjYXNlIDE5MToKKyAgICAgICAgICAgICAgICBjYXNlIDE5NDoKKyAgICAgICAgICAgICAgICBjYXNlIDE5OToKKyAgICAgICAgICAgICAgICBjYXNlIDIyMzoKKyAgICAgICAgICAgICAgICBjYXNlIDIyNDoKKyAgICAgICAgICAgICAgICBjYXNlIDI0MzoKKyAgICAgICAgICAgICAgICBjYXNlIDI1OToKKyAgICAgICAgICAgICAgICBjYXNlIDI2MjoKKyAgICAgICAgICAgICAgICBjYXNlIDI3MjoKKyAgICAgICAgICAgICAgICBjYXNlIDI4MjoKKyAgICAgICAgICAgICAgICBjYXNlIDI5ODoKKyAgICAgICAgICAgICAgICBjYXNlIDMwNToKKyAgICAgICAgICAgICAgICBjYXNlIDMwNjoKKyAgICAgICAgICAgICAgICBjYXNlIDMxNDoKKyAgICAgICAgICAgICAgICBjYXNlIDMxODoKKyAgICAgICAgICAgICAgICBjYXNlIDMyMjoKKyAgICAgICAgICAgICAgICBjYXNlIDM0MToKKyAgICAgICAgICAgICAgICBjYXNlIDM0OToKKyAgICAgICAgICAgICAgICBjYXNlIDM1MzoKKyAgICAgICAgICAgICAgICBjYXNlIDM1NToKKyAgICAgICAgICAgICAgICBjYXNlIDM2MToKKyAgICAgICAgICAgICAgICBjYXNlIDM2NDoKKyAgICAgICAgICAgICAgICBjYXNlIDM3ODoKKyAgICAgICAgICAgICAgICBjYXNlIDM3OToKKyAgICAgICAgICAgICAgICBjYXNlIDM4MDoKKyAgICAgICAgICAgICAgICBjYXNlIDM5MzoKKyAgICAgICAgICAgICAgICBjYXNlIDM5NToKKyAgICAgICAgICAgICAgICBjYXNlIDM5NjoKKyAgICAgICAgICAgICAgICBjYXNlIDQwNjoKKyAgICAgICAgICAgICAgICBjYXNlIDQxMDoKKyAgICAgICAgICAgICAgICBjYXNlIDQxMToKKyAgICAgICAgICAgICAgICBjYXNlIDQxNDoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0MTcxPTE7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE3MSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMjUyOjY6IChtPSBtb2RpZmllcl9kZWNsYXJhdGlvbiApPyAoIGRlY2xfdmFyaWFibGVbIHN0YXRlLT5nZXRQcm9wZXJ0eVBhcnQoKSAsIG1kZnIgXSB8YWRzPSBhbnlfZGVmX3N0YXRlbWFjaGluZVsgc3RhdGUgLCBtZGZyICwgc3BjZnIgXSB8IGRlZl90cmFuc2l0aW9uWyBzdGF0ZSAsIG1kZnIgLCBzcGNmciBdIHwgZGVmX3N0YXRlX2FjdGl2aXR5WyBzdGF0ZSBdICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBtZGZyID0gc2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfVU5ERUZJTkVEX01PRElGSUVSOyAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMjU0OjM6IChtPSBtb2RpZmllcl9kZWNsYXJhdGlvbiApPworICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQxNjk9MjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDQwNjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAkJICAgIGludCBMQTE2OV8xID0gTEEoMik7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAkJICAgIGlmICggKHN5bnByZWQzMDRfZm1sKGN0eCkpKQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAkJICAgICAgICBhbHQxNjk9MTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCQkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDI0MzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAyODI6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMjk4OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDMwNToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzNDE6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzQ5OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDM1NToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzNjE6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzY0OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDM4MDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzOTU6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgNDE0OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJCWFsdDE2OT0xOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQxNjkpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjI1NDo1OiBtPSBtb2RpZmllcl9kZWNsYXJhdGlvbgorICAgICAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19tb2RpZmllcl9kZWNsYXJhdGlvbl9pbl9kZWZfYm9keV9zdGF0ZV9zaW1wbGlmNjExMik7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBtPW1vZGlmaWVyX2RlY2xhcmF0aW9uKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfYm9keV9zdGF0ZV9zaW1wbGlmRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIG1kZnIgPSBtCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgOyAKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIyNTY6NjogKCBkZWNsX3ZhcmlhYmxlWyBzdGF0ZS0+Z2V0UHJvcGVydHlQYXJ0KCkgLCBtZGZyIF0gfGFkcz0gYW55X2RlZl9zdGF0ZW1hY2hpbmVbIHN0YXRlICwgbWRmciAsIHNwY2ZyIF0gfCBkZWZfdHJhbnNpdGlvblsgc3RhdGUgLCBtZGZyICwgc3BjZnIgXSB8IGRlZl9zdGF0ZV9hY3Rpdml0eVsgc3RhdGUgXSApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDE3MD00OworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSAyNTk6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSAyNjI6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSAzMTg6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSA0MTA6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSA0MTE6CisgICAgICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCWFsdDE3MD0xOworICAgICAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMTQ0OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMTQ1OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMTQ3OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMTQ4OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMTQ5OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMTUwOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMTUzOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjcyOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzA2OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzE0OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzIyOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzUzOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzc4OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzc5OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzkzOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgNDA2OgorICAgICAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQlhbHQxNzA9MjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIEFUX0lEOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMTY5OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzk2OgorICAgICAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQlhbHQxNzA9MzsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDE3MDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDE3NzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDE3OToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDE4MjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDE4NDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDE4OToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDE5MDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDE5MToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDE5NDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDE5OToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDIyMzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDIyNDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJYWx0MTcwPTQ7CisgICAgICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDE3MDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX2JvZHlfc3RhdGVfc2ltcGxpZkV4OworCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQxNzApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjI1Njo4OiBkZWNsX3ZhcmlhYmxlWyBzdGF0ZS0+Z2V0UHJvcGVydHlQYXJ0KCkgLCBtZGZyIF0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVjbF92YXJpYWJsZV9pbl9kZWZfYm9keV9zdGF0ZV9zaW1wbGlmNjEyOCk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBkZWNsX3ZhcmlhYmxlKGN0eCwgc3RhdGUtPmdldFByb3BlcnR5UGFydCgpLCBtZGZyKTsKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9ib2R5X3N0YXRlX3NpbXBsaWZFeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDI6CisgICAgICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIyNTg6ODogYWRzPSBhbnlfZGVmX3N0YXRlbWFjaGluZVsgc3RhdGUgLCBtZGZyICwgc3BjZnIgXQorICAgICAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19hbnlfZGVmX3N0YXRlbWFjaGluZV9pbl9kZWZfYm9keV9zdGF0ZV9zaW1wbGlmNjE0MSk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBhZHM9YW55X2RlZl9zdGF0ZW1hY2hpbmUoY3R4LCBzdGF0ZSwgbWRmciwgc3BjZnIpOworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2JvZHlfc3RhdGVfc2ltcGxpZkV4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgCWNhc2UgMzoKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjI2MDo4OiBkZWZfdHJhbnNpdGlvblsgc3RhdGUgLCBtZGZyICwgc3BjZnIgXQorICAgICAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfdHJhbnNpdGlvbl9pbl9kZWZfYm9keV9zdGF0ZV9zaW1wbGlmNjE1Mik7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBkZWZfdHJhbnNpdGlvbihjdHgsIHN0YXRlLCBtZGZyLCBzcGNmcik7CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfYm9keV9zdGF0ZV9zaW1wbGlmRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgICAgICAJY2FzZSA0OgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMjYyOjg6IGRlZl9zdGF0ZV9hY3Rpdml0eVsgc3RhdGUgXQorICAgICAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfc3RhdGVfYWN0aXZpdHlfaW5fZGVmX2JvZHlfc3RhdGVfc2ltcGxpZjYxNjMpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgZGVmX3N0YXRlX2FjdGl2aXR5KGN0eCwgc3RhdGUpOworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2JvZHlfc3RhdGVfc2ltcGxpZkV4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAgICAgCSAgICBnb3RvIGxvb3AxNzE7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb29wMTcxOiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVkZWZfYm9keV9zdGF0ZV9zaW1wbGlmRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlZGVmX2JvZHlfc3RhdGVfc2ltcGxpZkV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoNzEsIGRlZl9ib2R5X3N0YXRlX3NpbXBsaWZfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGRlZl9ib2R5X3N0YXRlX3NpbXBsaWYgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgc2VjdGlvbl90cmFuc2l0aW9uCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMjY3OjE6IHNlY3Rpb25fdHJhbnNpdGlvblsgc2VwOjpNYWNoaW5lICogc3RhdGUgXSA6ICdAdHJhbnNpdGlvbjonICggKG09IG1vZGlmaWVyX3RyYW5zaXRpb24gKT8gZGVmX3RyYW5zaXRpb25bIHN0YXRlICwgbWRmciAsIHNwY2ZyIF0gKSogOworICovCitzdGF0aWMgdm9pZAorc2VjdGlvbl90cmFuc2l0aW9uKHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBzdGF0ZSkKK3sKKyAgICBBTlRMUjNfVUlOVDMyIHNlY3Rpb25fdHJhbnNpdGlvbl9TdGFydEluZGV4OworCisgICAgZm1sUGFyc2VyX21vZGlmaWVyX3RyYW5zaXRpb25fcmV0dXJuIG07CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX20KKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX20gZm1sUGFyc2VyX21vZGlmaWVyX3RyYW5zaXRpb25fcmV0dXJuCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgc2VjdGlvbl90cmFuc2l0aW9uX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKworICAgIAkgc2VwOjpNb2RpZmllciBtZGZyOworCisgICAgCXNlcDo6U3BlY2lmaWVyIHNwY2ZyOworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSg3MikpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjI3MzoyOiAoICdAdHJhbnNpdGlvbjonICggKG09IG1vZGlmaWVyX3RyYW5zaXRpb24gKT8gZGVmX3RyYW5zaXRpb25bIHN0YXRlICwgbWRmciAsIHNwY2ZyIF0gKSogKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMjczOjQ6ICdAdHJhbnNpdGlvbjonICggKG09IG1vZGlmaWVyX3RyYW5zaXRpb24gKT8gZGVmX3RyYW5zaXRpb25bIHN0YXRlICwgbWRmciAsIHNwY2ZyIF0gKSoKKyAgICAgICAgeworICAgICAgICAgICAgIE1BVENIVCgyMzEsICZGT0xMT1dfMjMxX2luX3NlY3Rpb25fdHJhbnNpdGlvbjYxOTQpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVzZWN0aW9uX3RyYW5zaXRpb25FeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIyNzQ6NDogKCAobT0gbW9kaWZpZXJfdHJhbnNpdGlvbiApPyBkZWZfdHJhbnNpdGlvblsgc3RhdGUgLCBtZGZyICwgc3BjZnIgXSApKgorCisgICAgICAgICAgICBmb3IgKDs7KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQxNzM9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQVRfSUQ6CisgICAgICAgICAgICAgICAgY2FzZSAxNjk6CisgICAgICAgICAgICAgICAgY2FzZSAzMDY6CisgICAgICAgICAgICAgICAgY2FzZSAzOTM6CisgICAgICAgICAgICAgICAgY2FzZSAzOTU6CisgICAgICAgICAgICAgICAgY2FzZSAzOTY6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDE3Mz0xOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNzMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjI3NDo2OiAobT0gbW9kaWZpZXJfdHJhbnNpdGlvbiApPyBkZWZfdHJhbnNpdGlvblsgc3RhdGUgLCBtZGZyICwgc3BjZnIgXQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMjc0OjY6IChtPSBtb2RpZmllcl90cmFuc2l0aW9uICk/CisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDE3Mj0yOworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzA2OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDM5MzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzOTU6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAkJYWx0MTcyPTE7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDE3MikKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMjc0Ojg6IG09IG1vZGlmaWVyX3RyYW5zaXRpb24KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfbW9kaWZpZXJfdHJhbnNpdGlvbl9pbl9zZWN0aW9uX3RyYW5zaXRpb242MjA1KTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIG09bW9kaWZpZXJfdHJhbnNpdGlvbihjdHgpOworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc2VjdGlvbl90cmFuc2l0aW9uRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIG1kZnIgPSBtLm1kZnIKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICA7IAorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX3RyYW5zaXRpb25faW5fc2VjdGlvbl90cmFuc2l0aW9uNjIxOCk7CisgICAgICAgICAgICAJICAgICAgICBkZWZfdHJhbnNpdGlvbihjdHgsIHN0YXRlLCBtZGZyLCBzcGNmcik7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzZWN0aW9uX3RyYW5zaXRpb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQ6CisgICAgICAgICAgICAJICAgIGdvdG8gbG9vcDE3MzsJLyogYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvb3AxNzM6IDsgLyogSnVtcCBvdXQgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKworCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZXNlY3Rpb25fdHJhbnNpdGlvbkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZXNlY3Rpb25fdHJhbnNpdGlvbkV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoNzIsIHNlY3Rpb25fdHJhbnNpdGlvbl9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgc2VjdGlvbl90cmFuc2l0aW9uICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGRlZl90cmFuc2l0aW9uCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMjc5OjE6IGRlZl90cmFuc2l0aW9uWyBzZXA6Ok1hY2hpbmUgKiBzdGF0ZSAsXG5cdFx0c2VwOjpNb2RpZmllciBtZGZyICwgc2VwOjpTcGVjaWZpZXIgc3BjZnIgXSA6ICggKHRvaz0gJ0AnIHwgKHRvaz0gQVRfSUQgKSApICggTFRfIG1vY190cmFuc2l0aW9uWyB0cmFucyBdIEdUICk/IG1vZV90cmFuc2l0aW9uWyB0cmFucyBdIHwgJ3RyYW5zaXRpb24nICggTFRfIG1vY190cmFuc2l0aW9uWyB0cmFucyBdIEdUICk/IChpZD0gSUQgKT8gKCBTdHJpbmdMaXRlcmFsICk/IG1vZV90cmFuc2l0aW9uWyB0cmFucyBdICk7CisgKi8KK3N0YXRpYyB2b2lkCitkZWZfdHJhbnNpdGlvbihwZm1sUGFyc2VyIGN0eCwgc2VwOjpNYWNoaW5lICogc3RhdGUsIHNlcDo6TW9kaWZpZXIgbWRmciwgc2VwOjpTcGVjaWZpZXIgc3BjZnIpCit7CisgICAgQU5UTFIzX1VJTlQzMiBkZWZfdHJhbnNpdGlvbl9TdGFydEluZGV4OworCisgICAgcEFOVExSM19DT01NT05fVE9LRU4gICAgdG9rOworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIGlkOworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIFN0cmluZ0xpdGVyYWw4OworCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGRlZl90cmFuc2l0aW9uX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKworICAgIAlzZXA6OlRyYW5zaXRpb24gKiB0cmFucyA9IE5VTEw7CisgICAgCXN0ZDo6c3RyaW5nIHRfaWQ7CisKKyAgICAJbVByb2NlZHVyZUNhbGxDb3VudCA9IDA7CisKKyAgICAJU0FWRV9SVUxFX0JFR0lOX0xPQ0FUSU9OOworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSg3MykpICkKKyAgICB7CisgICAgICAgIHsKKworICAgICAgICAgICAgCWlmKCAobVByb2NlZHVyZUNhbGxDb3VudCA+IDApICYmICh0cmFucyAhPSBOVUxMKSApCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlzZXA6OlBhcnNlclV0aWw6OmlubGluZVRyYW5zaXRpb25Qcm9jZWR1cmVDYWxsKHRyYW5zLCB0cmFucy0+Z2V0TmFtZUlEKCkpOworICAgICAgICAgICAgCX0KKworICAgICAgICAgICAgCVNFVF9SVUxFX0xPQ0FUSU9OKHRyYW5zKTsKKworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHRvayAgICAgICA9IE5VTEw7CisgICAgaWQgICAgICAgPSBOVUxMOworICAgIFN0cmluZ0xpdGVyYWw4ICAgICAgID0gTlVMTDsKKworICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIyOTg6MjogKCAodG9rPSAnQCcgfCAodG9rPSBBVF9JRCApICkgKCBMVF8gbW9jX3RyYW5zaXRpb25bIHRyYW5zIF0gR1QgKT8gbW9lX3RyYW5zaXRpb25bIHRyYW5zIF0gfCAndHJhbnNpdGlvbicgKCBMVF8gbW9jX3RyYW5zaXRpb25bIHRyYW5zIF0gR1QgKT8gKGlkPSBJRCApPyAoIFN0cmluZ0xpdGVyYWwgKT8gbW9lX3RyYW5zaXRpb25bIHRyYW5zIF0gKQorCisgICAgICAgICAgICBBTlRMUjNfVUlOVDMyIGFsdDE3OTsKKworICAgICAgICAgICAgYWx0MTc5PTI7CisKKyAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQVRfSUQ6CisgICAgICAgICAgICBjYXNlIDE2OToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDE3OT0xOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzk2OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MTc5PTI7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDE3OTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl90cmFuc2l0aW9uRXg7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQxNzkpCisgICAgICAgICAgICB7CisgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjI5ODo0OiAodG9rPSAnQCcgfCAodG9rPSBBVF9JRCApICkgKCBMVF8gbW9jX3RyYW5zaXRpb25bIHRyYW5zIF0gR1QgKT8gbW9lX3RyYW5zaXRpb25bIHRyYW5zIF0KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIyOTg6NDogKHRvaz0gJ0AnIHwgKHRvaz0gQVRfSUQgKSApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQxNzQ9MjsKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMTY5OgorICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgIAkJYWx0MTc0PTE7CisgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgY2FzZSBBVF9JRDoKKyAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAJCWFsdDE3ND0yOworICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAxNzQ7CisgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfdHJhbnNpdGlvbkV4OworCisgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTc0KQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIyOTg6NjogdG9rPSAnQCcKKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHRvayA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTikgTUFUQ0hUKDE2OSwgJkZPTExPV18xNjlfaW5fZGVmX3RyYW5zaXRpb242MjUxKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3RyYW5zaXRpb25FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAJY2FzZSAyOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIyOTk6NjogKHRvaz0gQVRfSUQgKQorICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjI5OTo2OiAodG9rPSBBVF9JRCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIyOTk6ODogdG9rPSBBVF9JRAorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB0b2sgPSAocEFOVExSM19DT01NT05fVE9LRU4pIE1BVENIVChBVF9JRCwgJkZPTExPV19BVF9JRF9pbl9kZWZfdHJhbnNpdGlvbjYyNjIpOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfdHJhbnNpdGlvbkV4OworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgICB0X2lkID0gU1RSKCh0b2stPmdldFRleHQodG9rKSktPmNoYXJzKTsgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisKKyAgICAgICAgCSAgICAgICAgICAgIAkgIAlzdGF0ZS0+Z2V0VW5pcUJlaGF2aW9yUGFydCgpLT5zYXZlT3V0Z29pbmdUcmFuc2l0aW9uKAorICAgICAgICAJICAgICAgICAgICAgCSAgCQkJdHJhbnMgPSBuZXcgc2VwOjpUcmFuc2l0aW9uKHN0YXRlLCBuZXdUcmFuc2l0aW9uSUQodF9pZCkpICk7CisKKyAgICAgICAgCSAgICAgICAgICAgIAkgIAl0cmFucy0+c2V0TW9kaWZpZXIoIG1kZnIgKTsKKworICAgICAgICAJICAgICAgICAgICAgCSAgCXRyYW5zLT5zZXRTcGVjaWZpZXIoIHNwY2ZyICk7CisgICAgICAgIAkgICAgICAgICAgICAJICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjMwOTo0OiAoIExUXyBtb2NfdHJhbnNpdGlvblsgdHJhbnMgXSBHVCApPworICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0MTc1PTI7CisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBMVF86CisgICAgICAgIAkgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJCWFsdDE3NT0xOworICAgICAgICAJICAgICAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDE3NSkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMzA5OjY6IExUXyBtb2NfdHJhbnNpdGlvblsgdHJhbnMgXSBHVAorICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChMVF8sICZGT0xMT1dfTFRfX2luX2RlZl90cmFuc2l0aW9uNjI4NCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl90cmFuc2l0aW9uRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19tb2NfdHJhbnNpdGlvbl9pbl9kZWZfdHJhbnNpdGlvbjYyODcpOworICAgICAgICAJICAgICAgICAJICAgICAgICBtb2NfdHJhbnNpdGlvbihjdHgsIHRyYW5zKTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3RyYW5zaXRpb25FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoR1QsICZGT0xMT1dfR1RfaW5fZGVmX3RyYW5zaXRpb242MjkxKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3RyYW5zaXRpb25FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19tb2VfdHJhbnNpdGlvbl9pbl9kZWZfdHJhbnNpdGlvbjYzMDApOworICAgICAgICAJICAgICAgICBtb2VfdHJhbnNpdGlvbihjdHgsIHRyYW5zKTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3RyYW5zaXRpb25FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAyOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIzMTM6NDogJ3RyYW5zaXRpb24nICggTFRfIG1vY190cmFuc2l0aW9uWyB0cmFucyBdIEdUICk/IChpZD0gSUQgKT8gKCBTdHJpbmdMaXRlcmFsICk/IG1vZV90cmFuc2l0aW9uWyB0cmFucyBdCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDM5NiwgJkZPTExPV18zOTZfaW5fZGVmX3RyYW5zaXRpb242MzA3KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3RyYW5zaXRpb25FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworCisgICAgICAgIAkgICAgICAgICAgICAJICAJc3RhdGUtPmdldFVuaXFCZWhhdmlvclBhcnQoKS0+c2F2ZU91dGdvaW5nVHJhbnNpdGlvbigKKyAgICAgICAgCSAgICAgICAgICAgIAkgIAkJCXRyYW5zID0gbmV3IHNlcDo6VHJhbnNpdGlvbihzdGF0ZSkgKTsKKworICAgICAgICAJICAgICAgICAgICAgCSAgCXRyYW5zLT5zZXRNb2RpZmllciggbWRmciApOworCisgICAgICAgIAkgICAgICAgICAgICAJICAJdHJhbnMtPnNldFNwZWNpZmllciggc3BjZnIgKTsKKyAgICAgICAgCSAgICAgICAgICAgIAkgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMzIyOjQ6ICggTFRfIG1vY190cmFuc2l0aW9uWyB0cmFucyBdIEdUICk/CisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQxNzY9MjsKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIExUXzoKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgICAgIAkJYWx0MTc2PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTc2KQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIzMjI6NjogTFRfIG1vY190cmFuc2l0aW9uWyB0cmFucyBdIEdUCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKExUXywgJkZPTExPV19MVF9faW5fZGVmX3RyYW5zaXRpb242MzE5KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3RyYW5zaXRpb25FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX21vY190cmFuc2l0aW9uX2luX2RlZl90cmFuc2l0aW9uNjMyMSk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIG1vY190cmFuc2l0aW9uKGN0eCwgdHJhbnMpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfdHJhbnNpdGlvbkV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChHVCwgJkZPTExPV19HVF9pbl9kZWZfdHJhbnNpdGlvbjYzMjQpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfdHJhbnNpdGlvbkV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIzMjQ6NDogKGlkPSBJRCApPworICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0MTc3PTI7CisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgICAgIAkJYWx0MTc3PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTc3KQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIzMjQ6NjogaWQ9IElECisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICBpZCA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTikgTUFUQ0hUKElELCAmRk9MTE9XX0lEX2luX2RlZl90cmFuc2l0aW9uNjMzNyk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl90cmFuc2l0aW9uRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICB0X2lkID0gU1RSKChpZC0+Z2V0VGV4dChpZCkpLT5jaGFycyk7IAorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgdHJhbnMtPmZ1bGx5VXBkYXRlQWxsTmFtZUlEKCBuZXdUcmFuc2l0aW9uSUQodF9pZCkgKTsgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIzMjc6NDogKCBTdHJpbmdMaXRlcmFsICk/CisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQxNzg9MjsKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIFN0cmluZ0xpdGVyYWw6CisgICAgICAgIAkgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJCWFsdDE3OD0xOworICAgICAgICAJICAgICAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDE3OCkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMzI3OjY6IFN0cmluZ0xpdGVyYWwKKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIFN0cmluZ0xpdGVyYWw4ID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoU3RyaW5nTGl0ZXJhbCwgJkZPTExPV19TdHJpbmdMaXRlcmFsX2luX2RlZl90cmFuc2l0aW9uNjM1NSk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl90cmFuc2l0aW9uRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICB0cmFucy0+c2V0VW5yZXN0cmljdGVkTmFtZShTVFIoKFN0cmluZ0xpdGVyYWw4LT5nZXRUZXh0KFN0cmluZ0xpdGVyYWw4KSktPmNoYXJzKSk7IAorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfbW9lX3RyYW5zaXRpb25faW5fZGVmX3RyYW5zaXRpb242MzcyKTsKKyAgICAgICAgCSAgICAgICAgbW9lX3RyYW5zaXRpb24oY3R4LCB0cmFucyk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl90cmFuc2l0aW9uRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlZGVmX3RyYW5zaXRpb25FeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVkZWZfdHJhbnNpdGlvbkV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICAJaWYoIChtUHJvY2VkdXJlQ2FsbENvdW50ID4gMCkgJiYgKHRyYW5zICE9IE5VTEwpICkKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlzZXA6OlBhcnNlclV0aWw6OmlubGluZVRyYW5zaXRpb25Qcm9jZWR1cmVDYWxsKHRyYW5zLCB0cmFucy0+Z2V0TmFtZUlEKCkpOworICAgICAgICAgICAgICAgICAgICAJfQorCisgICAgICAgICAgICAgICAgICAgIAlTRVRfUlVMRV9MT0NBVElPTih0cmFucyk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKworICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoNzMsIGRlZl90cmFuc2l0aW9uX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBkZWZfdHJhbnNpdGlvbiAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBraW5kX3RyYW5zaXRpb24KKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIzMzQ6MToga2luZF90cmFuc2l0aW9uIHJldHVybnMgWyBzZXA6OlRyYW5zaXRpb246Ok1PQ19LSU5EIGtpbmQgXSA6IChpZD0gSUQgfCAnYWJvcnQnIHwgJ2ZpbmFsJyB8ICdlbHNlJyB8ICdmbG93JyApOworICovCitzdGF0aWMgc2VwOjpUcmFuc2l0aW9uOjpNT0NfS0lORAora2luZF90cmFuc2l0aW9uKHBmbWxQYXJzZXIgY3R4KQoreworICAgIHNlcDo6VHJhbnNpdGlvbjo6TU9DX0tJTkQga2luZDsKKworICAgIEFOVExSM19VSU5UMzIga2luZF90cmFuc2l0aW9uX1N0YXJ0SW5kZXg7CisKKyAgICBwQU5UTFIzX0NPTU1PTl9UT0tFTiAgICBpZDsKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBraW5kX3RyYW5zaXRpb25fU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoNzQpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIGtpbmQ7CisgICAgfQorCisgICAgaWQgICAgICAgPSBOVUxMOworCisgICAgeworICAgICAgICB7CisgICAgICAgICAgICAvLyAgL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjMzNjoyOiAoaWQ9IElEIHwgJ2Fib3J0JyB8ICdmaW5hbCcgfCAnZWxzZScgfCAnZmxvdycgKQorCisgICAgICAgICAgICBBTlRMUjNfVUlOVDMyIGFsdDE4MDsKKworICAgICAgICAgICAgYWx0MTgwPTU7CisKKyAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgSUQ6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQxODA9MTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIzNjoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDE4MD0yOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjgyOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MTgwPTM7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNzM6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQxODA9NDsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI4NDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDE4MD01OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBraW5kOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMTgwOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgZ290byBydWxla2luZF90cmFuc2l0aW9uRXg7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQxODApCisgICAgICAgICAgICB7CisgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjMzNjo0OiBpZD0gSUQKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIGlkID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoSUQsICZGT0xMT1dfSURfaW5fa2luZF90cmFuc2l0aW9uNjM5MCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWtpbmRfdHJhbnNpdGlvbkV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGtpbmQ7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworCisgICAgICAgIAkgICAgICAgICAgICAJCWlmKCAoa2luZD0gc2VwOjpUcmFuc2l0aW9uOjp0b01vY0tpbmQoU1RSKChpZC0+Z2V0VGV4dChpZCkpLT5jaGFycykpKSA9PQorICAgICAgICAJICAgICAgICAgICAgCQkJc2VwOjpUcmFuc2l0aW9uOjpNT0NfVU5ERUZJTkVEX0tJTkQgKQorICAgICAgICAJICAgICAgICAgICAgCQl7CisgICAgICAgIAkgICAgICAgICAgICAJCQlzZXA6OlBhcnNlclV0aWw6OmF2bV9zeW50YXhfZXJyb3IoICJraW5kX3RyYW5zaXRpb24iLCAoaWQtPmdldExpbmUoaWQpKSApCisgICAgICAgIAkgICAgICAgICAgICAJCQkJCTw8ICJ1bmV4cGVjdGVkIElEPCAiIDw8IFNUUigoaWQtPmdldFRleHQoaWQpKS0+Y2hhcnMpIDw8ICIgPiIKKyAgICAgICAgCSAgICAgICAgICAgIAkJCQkJPDwgc2VwOjpQYXJzZXJVdGlsOjpTWU5UQVhfRVJST1JfRU9MOworCisgICAgICAgIAkgICAgICAgICAgICAJCX0KKyAgICAgICAgCSAgICAgICAgICAgIAkKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDI6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjM0Nzo0OiAnYWJvcnQnCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDIzNiwgJkZPTExPV18yMzZfaW5fa2luZF90cmFuc2l0aW9uNjM5OSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWtpbmRfdHJhbnNpdGlvbkV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGtpbmQ7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGtpbmQ9IHNlcDo6VHJhbnNpdGlvbjo6TU9DX0FCT1JUX0tJTkQ7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAzOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIzNDg6NDogJ2ZpbmFsJworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgyODIsICZGT0xMT1dfMjgyX2luX2tpbmRfdHJhbnNpdGlvbjY0MDkpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVraW5kX3RyYW5zaXRpb25FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBraW5kOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBraW5kPSBzZXA6OlRyYW5zaXRpb246Ok1PQ19GSU5BTF9LSU5EOworICAgICAgICAJICAgICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgNDoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMzQ5OjQ6ICdlbHNlJworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgyNzMsICZGT0xMT1dfMjczX2luX2tpbmRfdHJhbnNpdGlvbjY0MTkpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVraW5kX3RyYW5zaXRpb25FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBraW5kOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBraW5kPSBzZXA6OlRyYW5zaXRpb246Ok1PQ19FTFNFX0tJTkQ7CisgICAgICAgIAkgICAgICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgNToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMzUyOjQ6ICdmbG93JworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgyODQsICZGT0xMT1dfMjg0X2luX2tpbmRfdHJhbnNpdGlvbjY0MzIpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVraW5kX3RyYW5zaXRpb25FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBraW5kOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBraW5kPSBzZXA6OlRyYW5zaXRpb246Ok1PQ19GTE9XX0tJTkQ7CisgICAgICAgIAkgICAgICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxla2luZF90cmFuc2l0aW9uRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxla2luZF90cmFuc2l0aW9uRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSg3NCwga2luZF90cmFuc2l0aW9uX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4ga2luZDsKK30KKy8qICRBTlRMUiBlbmQga2luZF90cmFuc2l0aW9uICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IG1vY190cmFuc2l0aW9uX2F0dHJpYnV0ZQorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjM1NjoxOiBtb2NfdHJhbnNpdGlvbl9hdHRyaWJ1dGUgcmV0dXJucyBbIHNlcDo6VHJhbnNpdGlvbjo6bW9jX2tpbmRfdCBraW5kIF0gOiBrdD0ga2luZF90cmFuc2l0aW9uICggQkFORCAnZWxzZScgKT8gOworICovCitzdGF0aWMgc2VwOjpUcmFuc2l0aW9uOjptb2Nfa2luZF90Cittb2NfdHJhbnNpdGlvbl9hdHRyaWJ1dGUocGZtbFBhcnNlciBjdHgpCit7CisgICAgc2VwOjpUcmFuc2l0aW9uOjptb2Nfa2luZF90IGtpbmQ7CisKKyAgICBBTlRMUjNfVUlOVDMyIG1vY190cmFuc2l0aW9uX2F0dHJpYnV0ZV9TdGFydEluZGV4OworCisgICAgc2VwOjpUcmFuc2l0aW9uOjpNT0NfS0lORCBrdDsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfa3QKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2t0IHNlcDo6VHJhbnNpdGlvbjo6TU9DX0tJTkQKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBtb2NfdHJhbnNpdGlvbl9hdHRyaWJ1dGVfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworCisgICAgCWtpbmQ9IHNlcDo6VHJhbnNpdGlvbjo6TU9DX1VOREVGSU5FRF9LSU5EOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDc1KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiBraW5kOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjM2MToyOiAoa3Q9IGtpbmRfdHJhbnNpdGlvbiAoIEJBTkQgJ2Vsc2UnICk/ICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjM2MTo0OiBrdD0ga2luZF90cmFuc2l0aW9uICggQkFORCAnZWxzZScgKT8KKyAgICAgICAgeworICAgICAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfa2luZF90cmFuc2l0aW9uX2luX21vY190cmFuc2l0aW9uX2F0dHJpYnV0ZTY0NjApOworICAgICAgICAgICAga3Q9a2luZF90cmFuc2l0aW9uKGN0eCk7CisKKyAgICAgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVtb2NfdHJhbnNpdGlvbl9hdHRyaWJ1dGVFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4ga2luZDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIGtpbmQ9IAorICAgICAgICAgICAgICAgIGt0CisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMzYyOjI6ICggQkFORCAnZWxzZScgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTgxPTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCQU5EOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDE4MT0xOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxODEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjM2Mjo0OiBCQU5EICdlbHNlJworICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKEJBTkQsICZGT0xMT1dfQkFORF9pbl9tb2NfdHJhbnNpdGlvbl9hdHRyaWJ1dGU2NDY3KTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlbW9jX3RyYW5zaXRpb25fYXR0cmlidXRlRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGtpbmQ7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVCgyNzMsICZGT0xMT1dfMjczX2luX21vY190cmFuc2l0aW9uX2F0dHJpYnV0ZTY0NjkpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVtb2NfdHJhbnNpdGlvbl9hdHRyaWJ1dGVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4ga2luZDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIGtpbmQ9IAorICAgICAgICAgICAgCSAgICAgICAgICAgIGtpbmQKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgfCBzZXA6OlRyYW5zaXRpb246Ok1PQ19FTFNFX0tJTkQ7CisgICAgICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVtb2NfdHJhbnNpdGlvbl9hdHRyaWJ1dGVFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVtb2NfdHJhbnNpdGlvbl9hdHRyaWJ1dGVFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDc1LCBtb2NfdHJhbnNpdGlvbl9hdHRyaWJ1dGVfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiBraW5kOworfQorLyogJEFOVExSIGVuZCBtb2NfdHJhbnNpdGlvbl9hdHRyaWJ1dGUgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgbW9jX3RyYW5zaXRpb24KKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIzNjU6MTogbW9jX3RyYW5zaXRpb25bIHNlcDo6VHJhbnNpdGlvbiAqIHRyYW5zIF0gOiBtb2NfdHJhbnNpdGlvbl9hdG9tWyB0cmFucyBdICggQ09NTUEgbW9jX3RyYW5zaXRpb25fYXRvbVsgdHJhbnMgXSApKiA7CisgKi8KK3N0YXRpYyB2b2lkCittb2NfdHJhbnNpdGlvbihwZm1sUGFyc2VyIGN0eCwgc2VwOjpUcmFuc2l0aW9uICogdHJhbnMpCit7CisgICAgQU5UTFIzX1VJTlQzMiBtb2NfdHJhbnNpdGlvbl9TdGFydEluZGV4OworCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIG1vY190cmFuc2l0aW9uX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDc2KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMzY2OjI6ICggbW9jX3RyYW5zaXRpb25fYXRvbVsgdHJhbnMgXSAoIENPTU1BIG1vY190cmFuc2l0aW9uX2F0b21bIHRyYW5zIF0gKSogKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMzY2OjQ6IG1vY190cmFuc2l0aW9uX2F0b21bIHRyYW5zIF0gKCBDT01NQSBtb2NfdHJhbnNpdGlvbl9hdG9tWyB0cmFucyBdICkqCisgICAgICAgIHsKKyAgICAgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX21vY190cmFuc2l0aW9uX2F0b21faW5fbW9jX3RyYW5zaXRpb242NDk0KTsKKyAgICAgICAgICAgIG1vY190cmFuc2l0aW9uX2F0b20oY3R4LCB0cmFucyk7CisKKyAgICAgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVtb2NfdHJhbnNpdGlvbkV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjM2NjozMzogKCBDT01NQSBtb2NfdHJhbnNpdGlvbl9hdG9tWyB0cmFucyBdICkqCisKKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDE4Mj0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBDT01NQToKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0MTgyPTE7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE4MikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMzY2OjM1OiBDT01NQSBtb2NfdHJhbnNpdGlvbl9hdG9tWyB0cmFucyBdCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoQ09NTUEsICZGT0xMT1dfQ09NTUFfaW5fbW9jX3RyYW5zaXRpb242NDk5KTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlbW9jX3RyYW5zaXRpb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX21vY190cmFuc2l0aW9uX2F0b21faW5fbW9jX3RyYW5zaXRpb242NTAxKTsKKyAgICAgICAgICAgIAkgICAgICAgIG1vY190cmFuc2l0aW9uX2F0b20oY3R4LCB0cmFucyk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVtb2NfdHJhbnNpdGlvbkV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdDoKKyAgICAgICAgICAgIAkgICAgZ290byBsb29wMTgyOwkvKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgKi8KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9vcDE4MjogOyAvKiBKdW1wIG91dCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworCisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlbW9jX3RyYW5zaXRpb25FeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVtb2NfdHJhbnNpdGlvbkV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoNzYsIG1vY190cmFuc2l0aW9uX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBtb2NfdHJhbnNpdGlvbiAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBtb2NfdHJhbnNpdGlvbl9hdG9tCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMzY5OjE6IG1vY190cmFuc2l0aW9uX2F0b21bIHNlcDo6VHJhbnNpdGlvbiAqIHRyYW5zIF0gOiAoICggJ21vYzonICk/IGt0PSBtb2NfdHJhbnNpdGlvbl9hdHRyaWJ1dGUgfCAoICdwcmlvcjonICk/IG49IGludGVnZXJfY29uc3RhbnQgfCAoICdwcm9iYTonICk/IHA9IGZsb2F0X2NvbnN0YW50ICk7CisgKi8KK3N0YXRpYyB2b2lkCittb2NfdHJhbnNpdGlvbl9hdG9tKHBmbWxQYXJzZXIgY3R4LCBzZXA6OlRyYW5zaXRpb24gKiB0cmFucykKK3sKKyAgICBBTlRMUjNfVUlOVDMyIG1vY190cmFuc2l0aW9uX2F0b21fU3RhcnRJbmRleDsKKworICAgIHNlcDo6VHJhbnNpdGlvbjo6bW9jX2tpbmRfdCBrdDsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfa3QKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2t0IHNlcDo6VHJhbnNpdGlvbjo6bW9jX2tpbmRfdAorCisgICAgc2VwOjphdm1fc2l6ZV90IG47CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX24KKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX24gc2VwOjphdm1fc2l6ZV90CisKKyAgICBzZXA6OmF2bV9mbG9hdF90IHA7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX3AKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX3Agc2VwOjphdm1fZmxvYXRfdAorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIG1vY190cmFuc2l0aW9uX2F0b21fU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoNzcpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vICAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMzcwOjI6ICggKCAnbW9jOicgKT8ga3Q9IG1vY190cmFuc2l0aW9uX2F0dHJpYnV0ZSB8ICggJ3ByaW9yOicgKT8gbj0gaW50ZWdlcl9jb25zdGFudCB8ICggJ3Byb2JhOicgKT8gcD0gZmxvYXRfY29uc3RhbnQgKQorCisgICAgICAgICAgICBBTlRMUjNfVUlOVDMyIGFsdDE4NjsKKworICAgICAgICAgICAgYWx0MTg2PTM7CisKKyAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgSUQ6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAJCSAgICBpbnQgTEExODZfMSA9IExBKDIpOworICAgICAgICAgICAgCQkgICAgaWYgKCAoc3lucHJlZDMyNF9mbWwoY3R4KSkpCisgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAJCSAgICAgICAgYWx0MTg2PTE7CisgICAgICAgICAgICAJCSAgICB9CisgICAgICAgICAgICAJCSAgICBlbHNlIGlmICggKHN5bnByZWQzMjZfZm1sKGN0eCkpKQorICAgICAgICAgICAgCQkgICAgeworICAgICAgICAgICAgCQkgICAgICAgIGFsdDE4Nj0yOworICAgICAgICAgICAgCQkgICAgfQorICAgICAgICAgICAgCQkgICAgZWxzZSBpZiAoIChBTlRMUjNfVFJVRSkpCisgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAJCSAgICAgICAgYWx0MTg2PTM7CisgICAgICAgICAgICAJCSAgICB9CisgICAgICAgICAgICAJCSAgICBlbHNlCisgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAJCSAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgCQkgICAgICAgIHsKKyAgICAgICAgICAgIAkJICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgCQkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCQkgICAgICAgIH0KKworCisgICAgICAgICAgICAJCSAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgIAkJICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIAkJICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAJCSAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAxODY7CisgICAgICAgICAgICAJCSAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAxOworCisKKyAgICAgICAgICAgIAkJICAgICAgICBnb3RvIHJ1bGVtb2NfdHJhbnNpdGlvbl9hdG9tRXg7CisKKyAgICAgICAgICAgIAkJICAgIH0KKyAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjM2OgorICAgICAgICAgICAgY2FzZSAyNzM6CisgICAgICAgICAgICBjYXNlIDI4MjoKKyAgICAgICAgICAgIGNhc2UgMjg0OgorICAgICAgICAgICAgY2FzZSAzMjE6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQxODY9MTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEludGVnZXJMaXRlcmFsOgorICAgICAgICAgICAgY2FzZSAzNDg6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQxODY9MjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZsb2F0TGl0ZXJhbDoKKyAgICAgICAgICAgIGNhc2UgMzUwOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MTg2PTM7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDE4NjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgIGdvdG8gcnVsZW1vY190cmFuc2l0aW9uX2F0b21FeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE4NikKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMzcwOjQ6ICggJ21vYzonICk/IGt0PSBtb2NfdHJhbnNpdGlvbl9hdHRyaWJ1dGUKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIzNzA6NDogKCAnbW9jOicgKT8KKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDE4Mz0yOworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzIxOgorICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQlhbHQxODM9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQxODMpCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjM3MDo2OiAnbW9jOicKKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoMzIxLCAmRk9MTE9XXzMyMV9pbl9tb2NfdHJhbnNpdGlvbl9hdG9tNjUyMCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW1vY190cmFuc2l0aW9uX2F0b21FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19tb2NfdHJhbnNpdGlvbl9hdHRyaWJ1dGVfaW5fbW9jX3RyYW5zaXRpb25fYXRvbTY1MjcpOworICAgICAgICAJICAgICAgICBrdD1tb2NfdHJhbnNpdGlvbl9hdHRyaWJ1dGUoY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlbW9jX3RyYW5zaXRpb25fYXRvbUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgdHJhbnMtPnNldE1vY0tpbmQoIGt0CisgICAgICAgIAkgICAgICAgICAgICAgKTsgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAyOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIzNzM6NDogKCAncHJpb3I6JyApPyBuPSBpbnRlZ2VyX2NvbnN0YW50CisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMzczOjQ6ICggJ3ByaW9yOicgKT8KKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDE4ND0yOworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzQ4OgorICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQlhbHQxODQ9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQxODQpCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjM3Mzo2OiAncHJpb3I6JworICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVCgzNDgsICZGT0xMT1dfMzQ4X2luX21vY190cmFuc2l0aW9uX2F0b202NTM4KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlbW9jX3RyYW5zaXRpb25fYXRvbUV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fbW9jX3RyYW5zaXRpb25fYXRvbTY1NDUpOworICAgICAgICAJICAgICAgICBuPWludGVnZXJfY29uc3RhbnQoY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlbW9jX3RyYW5zaXRpb25fYXRvbUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgdHJhbnMtPnNldFByaW9yaXR5KCBuCisgICAgICAgIAkgICAgICAgICAgICAgKTsgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAzOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIzNzY6NDogKCAncHJvYmE6JyApPyBwPSBmbG9hdF9jb25zdGFudAorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjM3Njo0OiAoICdwcm9iYTonICk/CisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQxODU9MjsKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDM1MDoKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgICAgIAkJYWx0MTg1PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTg1KQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIzNzY6NjogJ3Byb2JhOicKKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoMzUwLCAmRk9MTE9XXzM1MF9pbl9tb2NfdHJhbnNpdGlvbl9hdG9tNjU1Nik7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW1vY190cmFuc2l0aW9uX2F0b21FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19mbG9hdF9jb25zdGFudF9pbl9tb2NfdHJhbnNpdGlvbl9hdG9tNjU2Myk7CisgICAgICAgIAkgICAgICAgIHA9ZmxvYXRfY29uc3RhbnQoY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlbW9jX3RyYW5zaXRpb25fYXRvbUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgdHJhbnMtPnNldFByb2JhYmlsaXR5KCBwCisgICAgICAgIAkgICAgICAgICAgICAgKTsgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVtb2NfdHJhbnNpdGlvbl9hdG9tRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlbW9jX3RyYW5zaXRpb25fYXRvbUV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoNzcsIG1vY190cmFuc2l0aW9uX2F0b21fU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIG1vY190cmFuc2l0aW9uX2F0b20gKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgbW9lX3RyYW5zaXRpb24KKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIzODE6MTogbW9lX3RyYW5zaXRpb25bIHNlcDo6VHJhbnNpdGlvbiAqIHRyYW5zIF0gOiAoYnM9IHRyYW5zaXRpb25fc3RhdGVtZW50ICggKCAnLS0+JyApPyB0aWQ9IHRhcmdldF9zdGF0ZV9pZCBTRU1JICk/IHwgJy0tPicgdGlkPSB0YXJnZXRfc3RhdGVfaWQgKGJzPSB0cmFuc2l0aW9uX3N0YXRlbWVudCB8IFNFTUkgKSApOworICovCitzdGF0aWMgdm9pZAorbW9lX3RyYW5zaXRpb24ocGZtbFBhcnNlciBjdHgsIHNlcDo6VHJhbnNpdGlvbiAqIHRyYW5zKQoreworICAgIEFOVExSM19VSU5UMzIgbW9lX3RyYW5zaXRpb25fU3RhcnRJbmRleDsKKworICAgIHNlcDo6QkZDb2RlIGJzOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9icworICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfYnMgc2VwOjpCRkNvZGUKKworICAgIHNlcDo6QkYgdGlkOworICAgICN1bmRlZglSRVRVUk5fVFlQRV90aWQKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX3RpZCBzZXA6OkJGCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgbW9lX3RyYW5zaXRpb25fU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoNzgpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vICAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMzgyOjI6IChicz0gdHJhbnNpdGlvbl9zdGF0ZW1lbnQgKCAoICctLT4nICk/IHRpZD0gdGFyZ2V0X3N0YXRlX2lkIFNFTUkgKT8gfCAnLS0+JyB0aWQ9IHRhcmdldF9zdGF0ZV9pZCAoYnM9IHRyYW5zaXRpb25fc3RhdGVtZW50IHwgU0VNSSApICkKKworICAgICAgICAgICAgQU5UTFIzX1VJTlQzMiBhbHQxOTA7CisKKyAgICAgICAgICAgIGFsdDE5MD0yOworCisgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIExDVVJMWToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDE5MD0xOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTYzOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MTkwPTI7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDE5MDsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgIGdvdG8gcnVsZW1vZV90cmFuc2l0aW9uRXg7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQxOTApCisgICAgICAgICAgICB7CisgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjM4Mjo0OiBicz0gdHJhbnNpdGlvbl9zdGF0ZW1lbnQgKCAoICctLT4nICk/IHRpZD0gdGFyZ2V0X3N0YXRlX2lkIFNFTUkgKT8KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3RyYW5zaXRpb25fc3RhdGVtZW50X2luX21vZV90cmFuc2l0aW9uNjU4Mik7CisgICAgICAgIAkgICAgICAgIGJzPXRyYW5zaXRpb25fc3RhdGVtZW50KGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW1vZV90cmFuc2l0aW9uRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICB0cmFucy0+c2V0U3RhdGVtZW50KGJzCisgICAgICAgIAkgICAgICAgICAgICApOyAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMzgzOjQ6ICggKCAnLS0+JyApPyB0aWQ9IHRhcmdldF9zdGF0ZV9pZCBTRU1JICk/CisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQxODg9MjsKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDE0NDoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDE0NToKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDE0NzoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDE0ODoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDE0OToKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDE1MDoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDE1MzoKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgICAgIAkJeworICAgICAgICAJICAgICAgICAgICAgICAgIAkJICAgIGludCBMQTE4OF8xID0gTEEoMik7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQkgICAgaWYgKCAoc3lucHJlZDMyOV9mbWwoY3R4KSkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgCQkgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgIAkJICAgICAgICBhbHQxODg9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJCSAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBET0xMQVI6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDE0NjoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDE2MzoKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgICAgIAkJYWx0MTg4PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0MTg4KQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIzODM6NjogKCAnLS0+JyApPyB0aWQ9IHRhcmdldF9zdGF0ZV9pZCBTRU1JCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMzgzOjY6ICggJy0tPicgKT8KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDE4Nz0yOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMTYzOgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgCQlhbHQxODc9MTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQxODcpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjM4Mzo4OiAnLS0+JworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVCgxNjMsICZGT0xMT1dfMTYzX2luX21vZV90cmFuc2l0aW9uNjYwMCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW1vZV90cmFuc2l0aW9uRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfdGFyZ2V0X3N0YXRlX2lkX2luX21vZV90cmFuc2l0aW9uNjYxMik7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHRpZD10YXJnZXRfc3RhdGVfaWQoY3R4KTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlbW9lX3RyYW5zaXRpb25FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIHRyYW5zLT5zZXRUYXJnZXQodGlkCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICApOyAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChTRU1JLCAmRk9MTE9XX1NFTUlfaW5fbW9lX3RyYW5zaXRpb242NjI5KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlbW9lX3RyYW5zaXRpb25FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMzg4OjQ6ICctLT4nIHRpZD0gdGFyZ2V0X3N0YXRlX2lkIChicz0gdHJhbnNpdGlvbl9zdGF0ZW1lbnQgfCBTRU1JICkKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMTYzLCAmRk9MTE9XXzE2M19pbl9tb2VfdHJhbnNpdGlvbjY2MzgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVtb2VfdHJhbnNpdGlvbkV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfdGFyZ2V0X3N0YXRlX2lkX2luX21vZV90cmFuc2l0aW9uNjY0Mik7CisgICAgICAgIAkgICAgICAgIHRpZD10YXJnZXRfc3RhdGVfaWQoY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlbW9lX3RyYW5zaXRpb25FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIHRyYW5zLT5zZXRUYXJnZXQodGlkCisgICAgICAgIAkgICAgICAgICAgICApOyAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjM5MDo0OiAoYnM9IHRyYW5zaXRpb25fc3RhdGVtZW50IHwgU0VNSSApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQxODk9MjsKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgTENVUkxZOgorICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgIAkJYWx0MTg5PTE7CisgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgY2FzZSBTRU1JOgorICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgIAkJYWx0MTg5PTI7CisgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAJICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDE4OTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZW1vZV90cmFuc2l0aW9uRXg7CisKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQxODkpCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjM5MDo2OiBicz0gdHJhbnNpdGlvbl9zdGF0ZW1lbnQKKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3RyYW5zaXRpb25fc3RhdGVtZW50X2luX21vZV90cmFuc2l0aW9uNjY1OSk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGJzPXRyYW5zaXRpb25fc3RhdGVtZW50KGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW1vZV90cmFuc2l0aW9uRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICB0cmFucy0+c2V0U3RhdGVtZW50KGJzCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICApOyAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAljYXNlIDI6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjM5MTo2OiBTRU1JCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKFNFTUksICZGT0xMT1dfU0VNSV9pbl9tb2VfdHJhbnNpdGlvbjY2NzMpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVtb2VfdHJhbnNpdGlvbkV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVtb2VfdHJhbnNpdGlvbkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZW1vZV90cmFuc2l0aW9uRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSg3OCwgbW9lX3RyYW5zaXRpb25fU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIG1vZV90cmFuc2l0aW9uICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IHRyYW5zaXRpb25fc3RhdGVtZW50CisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMzk1OjE6IHRyYW5zaXRpb25fc3RhdGVtZW50IHJldHVybnMgWyBzZXA6OkJGQ29kZSBhYyBdIDogTENVUkxZIChvPSBvcF9ibG9jayApPyAocz0gc3RhdGVtZW50ICkqICggdHJhbnNpdGlvbl90cmlnZ2VyWyBhYyBdICk/ICggdHJhbnNpdGlvbl9ndWFyZFsgYWMgXSApPyAoIHRyYW5zaXRpb25fdGltZWRfZ3VhcmRbIGFjIF0gKT8gKCB0cmFuc2l0aW9uX2VmZmVjdFsgYWMgXSApPyBSQ1VSTFkgOworICovCitzdGF0aWMgc2VwOjpCRkNvZGUKK3RyYW5zaXRpb25fc3RhdGVtZW50KHBmbWxQYXJzZXIgY3R4KQoreworICAgIHNlcDo6QkZDb2RlIGFjOworCisgICAgQU5UTFIzX1VJTlQzMiB0cmFuc2l0aW9uX3N0YXRlbWVudF9TdGFydEluZGV4OworCisgICAgc2VwOjpPcGVyYXRvciAqIG87CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX28KKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX28gc2VwOjpPcGVyYXRvciAqCisKKyAgICBzZXA6OkJGQ29kZSBzOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9zCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9zIHNlcDo6QkZDb2RlCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgdHJhbnNpdGlvbl9zdGF0ZW1lbnRfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworCisgICAgCXNlcDo6T3BlcmF0b3IgKiBvcCA9IE9QKFNFUVVFTkNFKTsKKyAgICAJYm9vbCBpbXBsaWNpdFNlcXVlbmNlT3AgPSB0cnVlOworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSg3OSkpICkKKyAgICB7CisgICAgICAgIHsKKworICAgICAgICAgICAgCWlmKCBpbXBsaWNpdFNlcXVlbmNlT3AgJiYgYWMKKyAgICAgICAgICAgIC52YWxpZCgpICYmIGFjCisgICAgICAgICAgICAtPnNpbmdsZXRvbigpICYmCisgICAgICAgICAgICAJCQlzZXA6Ok9wZXJhdG9yTWFuYWdlcjo6aXNTY2hlZHVsZShvcCkgKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJc2VwOjpCRkNvZGUgc2luZ2xlQ29kZSA9IGFjCisgICAgICAgICAgICAtPmZpcnN0KCkuYmZDb2RlKCk7CisgICAgICAgICAgICAJCWFjPSBzaW5nbGVDb2RlOworCisgICAgICAgICAgICAJfQorCisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiBhYzsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI0MDk6MjogKCBMQ1VSTFkgKG89IG9wX2Jsb2NrICk/IChzPSBzdGF0ZW1lbnQgKSogKCB0cmFuc2l0aW9uX3RyaWdnZXJbIGFjIF0gKT8gKCB0cmFuc2l0aW9uX2d1YXJkWyBhYyBdICk/ICggdHJhbnNpdGlvbl90aW1lZF9ndWFyZFsgYWMgXSApPyAoIHRyYW5zaXRpb25fZWZmZWN0WyBhYyBdICk/IFJDVVJMWSApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI0MDk6NDogTENVUkxZIChvPSBvcF9ibG9jayApPyAocz0gc3RhdGVtZW50ICkqICggdHJhbnNpdGlvbl90cmlnZ2VyWyBhYyBdICk/ICggdHJhbnNpdGlvbl9ndWFyZFsgYWMgXSApPyAoIHRyYW5zaXRpb25fdGltZWRfZ3VhcmRbIGFjIF0gKT8gKCB0cmFuc2l0aW9uX2VmZmVjdFsgYWMgXSApPyBSQ1VSTFkKKyAgICAgICAgeworICAgICAgICAgICAgIE1BVENIVChMQ1VSTFksICZGT0xMT1dfTENVUkxZX2luX3RyYW5zaXRpb25fc3RhdGVtZW50NjcwMSk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXRyYW5zaXRpb25fc3RhdGVtZW50RXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI0MDk6MTI6IChvPSBvcF9ibG9jayApPworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQxOTE9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIE9QX0FUT01JQ19TRVFVRU5DRToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPUF9DT05DVVJSRU5DWV9BTkQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BfQ09OQ1VSUkVOQ1lfQVNZTkM6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BfQ09OQ1VSUkVOQ1lfSU5URVJMRUFWSU5HOgorICAgICAgICAgICAgICAgICAgICBjYXNlIE9QX0NPTkNVUlJFTkNZX09SOgorICAgICAgICAgICAgICAgICAgICBjYXNlIE9QX0NPTkNVUlJFTkNZX1BBUkFMTEVMOgorICAgICAgICAgICAgICAgICAgICBjYXNlIE9QX0NPTkNVUlJFTkNZX1JEVl9BTkQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BfQ09OQ1VSUkVOQ1lfUkRWX0FTWU5DOgorICAgICAgICAgICAgICAgICAgICBjYXNlIE9QX0NPTkNVUlJFTkNZX1JEVl9JTlRFUkxFQVZJTkc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BfQ09OQ1VSUkVOQ1lfUkRWX09SOgorICAgICAgICAgICAgICAgICAgICBjYXNlIE9QX0NPTkNVUlJFTkNZX1JEVl9QQVJBTExFTDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPUF9GT1JLOgorICAgICAgICAgICAgICAgICAgICBjYXNlIE9QX0pPSU46CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BfTk9OX0RFVEVSTUlOSVNNOgorICAgICAgICAgICAgICAgICAgICBjYXNlIE9QX1NDSEVEVUxFX0FORF9USEVOOgorICAgICAgICAgICAgICAgICAgICBjYXNlIE9QX1NDSEVEVUxFX0dUOgorICAgICAgICAgICAgICAgICAgICBjYXNlIE9QX1NDSEVEVUxFX0xUOgorICAgICAgICAgICAgICAgICAgICBjYXNlIE9QX1NDSEVEVUxFX09SX0VMU0U6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BfU0NIRURVTEVfWE9SOgorICAgICAgICAgICAgICAgICAgICBjYXNlIE9QX1NFUVVFTkNFOgorICAgICAgICAgICAgICAgICAgICBjYXNlIE9QX1NFUVVFTkNFX1NJREU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BfU0VRVUVOQ0VfV0VBSzoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQxOTE9MTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTkxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI0MDk6MTQ6IG89IG9wX2Jsb2NrCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX29wX2Jsb2NrX2luX3RyYW5zaXRpb25fc3RhdGVtZW50NjcwOCk7CisgICAgICAgICAgICAJICAgICAgICBvPW9wX2Jsb2NrKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV0cmFuc2l0aW9uX3N0YXRlbWVudEV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIG9wID0gbworICAgICAgICAgICAgCSAgICAgICAgICAgIDsgaW1wbGljaXRTZXF1ZW5jZU9wID0gZmFsc2U7IAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBhYz0gTkVXX1NUTVQob3ApOworICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNDExOjM6IChzPSBzdGF0ZW1lbnQgKSoKKworICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTkyPTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIENPTE9OeDI6CisgICAgICAgICAgICAgICAgY2FzZSBERUNSOgorICAgICAgICAgICAgICAgIGNhc2UgRE9MTEFSX0xDVVJMWToKKyAgICAgICAgICAgICAgICBjYXNlIElEOgorICAgICAgICAgICAgICAgIGNhc2UgSU5DUjoKKyAgICAgICAgICAgICAgICBjYXNlIExDVVJMWToKKyAgICAgICAgICAgICAgICBjYXNlIExQQVJFTl9JTlZPS0U6CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURU1FTlRfUFJPTVBUOgorICAgICAgICAgICAgICAgIGNhc2UgMTU0OgorICAgICAgICAgICAgICAgIGNhc2UgMTU1OgorICAgICAgICAgICAgICAgIGNhc2UgMTU2OgorICAgICAgICAgICAgICAgIGNhc2UgMTU3OgorICAgICAgICAgICAgICAgIGNhc2UgMjM2OgorICAgICAgICAgICAgICAgIGNhc2UgMjQ3OgorICAgICAgICAgICAgICAgIGNhc2UgMjUwOgorICAgICAgICAgICAgICAgIGNhc2UgMjU2OgorICAgICAgICAgICAgICAgIGNhc2UgMjYzOgorICAgICAgICAgICAgICAgIGNhc2UgMjY3OgorICAgICAgICAgICAgICAgIGNhc2UgMjY4OgorICAgICAgICAgICAgICAgIGNhc2UgMjY5OgorICAgICAgICAgICAgICAgIGNhc2UgMjc1OgorICAgICAgICAgICAgICAgIGNhc2UgMjc4OgorICAgICAgICAgICAgICAgIGNhc2UgMjc5OgorICAgICAgICAgICAgICAgIGNhc2UgMjgyOgorICAgICAgICAgICAgICAgIGNhc2UgMjg1OgorICAgICAgICAgICAgICAgIGNhc2UgMjg5OgorICAgICAgICAgICAgICAgIGNhc2UgMjkwOgorICAgICAgICAgICAgICAgIGNhc2UgMjkxOgorICAgICAgICAgICAgICAgIGNhc2UgMjkyOgorICAgICAgICAgICAgICAgIGNhc2UgMjkzOgorICAgICAgICAgICAgICAgIGNhc2UgMjk0OgorICAgICAgICAgICAgICAgIGNhc2UgMjk2OgorICAgICAgICAgICAgICAgIGNhc2UgMjk5OgorICAgICAgICAgICAgICAgIGNhc2UgMzAwOgorICAgICAgICAgICAgICAgIGNhc2UgMzAxOgorICAgICAgICAgICAgICAgIGNhc2UgMzAyOgorICAgICAgICAgICAgICAgIGNhc2UgMzAzOgorICAgICAgICAgICAgICAgIGNhc2UgMzA0OgorICAgICAgICAgICAgICAgIGNhc2UgMzA1OgorICAgICAgICAgICAgICAgIGNhc2UgMzEyOgorICAgICAgICAgICAgICAgIGNhc2UgMzMwOgorICAgICAgICAgICAgICAgIGNhc2UgMzM2OgorICAgICAgICAgICAgICAgIGNhc2UgMzM3OgorICAgICAgICAgICAgICAgIGNhc2UgMzM4OgorICAgICAgICAgICAgICAgIGNhc2UgMzM5OgorICAgICAgICAgICAgICAgIGNhc2UgMzQwOgorICAgICAgICAgICAgICAgIGNhc2UgMzQxOgorICAgICAgICAgICAgICAgIGNhc2UgMzYyOgorICAgICAgICAgICAgICAgIGNhc2UgMzYzOgorICAgICAgICAgICAgICAgIGNhc2UgMzY0OgorICAgICAgICAgICAgICAgIGNhc2UgMzY4OgorICAgICAgICAgICAgICAgIGNhc2UgMzY5OgorICAgICAgICAgICAgICAgIGNhc2UgMzcxOgorICAgICAgICAgICAgICAgIGNhc2UgMzc3OgorICAgICAgICAgICAgICAgIGNhc2UgMzg1OgorICAgICAgICAgICAgICAgIGNhc2UgMzg2OgorICAgICAgICAgICAgICAgIGNhc2UgMzg5OgorICAgICAgICAgICAgICAgIGNhc2UgMzkxOgorICAgICAgICAgICAgICAgIGNhc2UgNDE1OgorICAgICAgICAgICAgICAgIGNhc2UgNDE2OgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQxOTI9MTsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTkyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI0MTE6NTogcz0gc3RhdGVtZW50CisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3N0YXRlbWVudF9pbl90cmFuc2l0aW9uX3N0YXRlbWVudDY3MjgpOworICAgICAgICAgICAgCSAgICAgICAgcz1zdGF0ZW1lbnQoY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXRyYW5zaXRpb25fc3RhdGVtZW50RXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgYWMKKyAgICAgICAgICAgIAkgICAgICAgICAgICAtPmFwcGVuZChzCisgICAgICAgICAgICAJICAgICAgICAgICAgKTsgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdDoKKyAgICAgICAgICAgIAkgICAgZ290byBsb29wMTkyOwkvKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgKi8KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9vcDE5MjogOyAvKiBKdW1wIG91dCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI0MTM6MzogKCB0cmFuc2l0aW9uX3RyaWdnZXJbIGFjIF0gKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTkzPTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzI6CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJYWx0MTkzPTE7CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE5MykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNDEzOjU6IHRyYW5zaXRpb25fdHJpZ2dlclsgYWMgXQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV190cmFuc2l0aW9uX3RyaWdnZXJfaW5fdHJhbnNpdGlvbl9zdGF0ZW1lbnQ2NzQxKTsKKyAgICAgICAgICAgIAkgICAgICAgIHRyYW5zaXRpb25fdHJpZ2dlcihjdHgsIGFjKTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXRyYW5zaXRpb25fc3RhdGVtZW50RXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjQxNDozOiAoIHRyYW5zaXRpb25fZ3VhcmRbIGFjIF0gKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTk0PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxODc6CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJYWx0MTk0PTE7CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE5NCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNDE0OjU6IHRyYW5zaXRpb25fZ3VhcmRbIGFjIF0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfdHJhbnNpdGlvbl9ndWFyZF9pbl90cmFuc2l0aW9uX3N0YXRlbWVudDY3NTEpOworICAgICAgICAgICAgCSAgICAgICAgdHJhbnNpdGlvbl9ndWFyZChjdHgsIGFjKTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXRyYW5zaXRpb25fc3RhdGVtZW50RXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjQxNTozOiAoIHRyYW5zaXRpb25fdGltZWRfZ3VhcmRbIGFjIF0gKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTk1PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzA6CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJYWx0MTk1PTE7CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE5NSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNDE1OjU6IHRyYW5zaXRpb25fdGltZWRfZ3VhcmRbIGFjIF0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfdHJhbnNpdGlvbl90aW1lZF9ndWFyZF9pbl90cmFuc2l0aW9uX3N0YXRlbWVudDY3NjEpOworICAgICAgICAgICAgCSAgICAgICAgdHJhbnNpdGlvbl90aW1lZF9ndWFyZChjdHgsIGFjKTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXRyYW5zaXRpb25fc3RhdGVtZW50RXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjQxNjozOiAoIHRyYW5zaXRpb25fZWZmZWN0WyBhYyBdICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDE5Nj0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTgxOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDE5Nj0xOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxOTYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjQxNjo1OiB0cmFuc2l0aW9uX2VmZmVjdFsgYWMgXQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV190cmFuc2l0aW9uX2VmZmVjdF9pbl90cmFuc2l0aW9uX3N0YXRlbWVudDY3NzEpOworICAgICAgICAgICAgCSAgICAgICAgdHJhbnNpdGlvbl9lZmZlY3QoY3R4LCBhYyk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV0cmFuc2l0aW9uX3N0YXRlbWVudEV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICBNQVRDSFQoUkNVUkxZLCAmRk9MTE9XX1JDVVJMWV9pbl90cmFuc2l0aW9uX3N0YXRlbWVudDY3ODApOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGV0cmFuc2l0aW9uX3N0YXRlbWVudEV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZXRyYW5zaXRpb25fc3RhdGVtZW50RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxldHJhbnNpdGlvbl9zdGF0ZW1lbnRFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgCWlmKCBpbXBsaWNpdFNlcXVlbmNlT3AgJiYgYWMKKyAgICAgICAgICAgICAgICAgICAgLnZhbGlkKCkgJiYgYWMKKyAgICAgICAgICAgICAgICAgICAgLT5zaW5nbGV0b24oKSAmJgorICAgICAgICAgICAgICAgICAgICAJCQlzZXA6Ok9wZXJhdG9yTWFuYWdlcjo6aXNTY2hlZHVsZShvcCkgKQorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCXNlcDo6QkZDb2RlIHNpbmdsZUNvZGUgPSBhYworICAgICAgICAgICAgICAgICAgICAtPmZpcnN0KCkuYmZDb2RlKCk7CisgICAgICAgICAgICAgICAgICAgIAkJYWM9IHNpbmdsZUNvZGU7CisKKyAgICAgICAgICAgICAgICAgICAgCX0KKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSg3OSwgdHJhbnNpdGlvbl9zdGF0ZW1lbnRfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiBhYzsKK30KKy8qICRBTlRMUiBlbmQgdHJhbnNpdGlvbl9zdGF0ZW1lbnQgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgdHJhbnNpdGlvbl90cmlnZ2VyCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNDIwOjE6IHRyYW5zaXRpb25fdHJpZ2dlclsgc2VwOjpCRkNvZGUgJiBhYyBdIDogJ0B0cmlnZ2VyOicgKHM9IHN0YXRlbWVudF9jb21faW5wdXQgKSogOworICovCitzdGF0aWMgdm9pZAordHJhbnNpdGlvbl90cmlnZ2VyKHBmbWxQYXJzZXIgY3R4LCBzZXA6OkJGQ29kZSAmIGFjKQoreworICAgIEFOVExSM19VSU5UMzIgdHJhbnNpdGlvbl90cmlnZ2VyX1N0YXJ0SW5kZXg7CisKKyAgICBzZXA6OkJGQ29kZSBzOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9zCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9zIHNlcDo6QkZDb2RlCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgdHJhbnNpdGlvbl90cmlnZ2VyX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDgwKSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNDIxOjI6ICggJ0B0cmlnZ2VyOicgKHM9IHN0YXRlbWVudF9jb21faW5wdXQgKSogKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNDIxOjQ6ICdAdHJpZ2dlcjonIChzPSBzdGF0ZW1lbnRfY29tX2lucHV0ICkqCisgICAgICAgIHsKKyAgICAgICAgICAgICBNQVRDSFQoMjMyLCAmRk9MTE9XXzIzMl9pbl90cmFuc2l0aW9uX3RyaWdnZXI2NzkzKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxldHJhbnNpdGlvbl90cmlnZ2VyRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNDIxOjE2OiAocz0gc3RhdGVtZW50X2NvbV9pbnB1dCApKgorCisgICAgICAgICAgICBmb3IgKDs7KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQxOTc9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgMjk5OgorICAgICAgICAgICAgICAgIGNhc2UgMzAwOgorICAgICAgICAgICAgICAgIGNhc2UgMzAxOgorICAgICAgICAgICAgICAgIGNhc2UgMzAyOgorICAgICAgICAgICAgICAgIGNhc2UgMzAzOgorICAgICAgICAgICAgICAgIGNhc2UgMzA0OgorICAgICAgICAgICAgICAgIGNhc2UgMzA1OgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQxOTc9MTsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTk3KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI0MjE6MTg6IHM9IHN0YXRlbWVudF9jb21faW5wdXQKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfc3RhdGVtZW50X2NvbV9pbnB1dF9pbl90cmFuc2l0aW9uX3RyaWdnZXI2Nzk5KTsKKyAgICAgICAgICAgIAkgICAgICAgIHM9c3RhdGVtZW50X2NvbV9pbnB1dChjdHgpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxldHJhbnNpdGlvbl90cmlnZ2VyRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIGFjLT5hcHBlbmQoIAorICAgICAgICAgICAgCSAgICAgICAgICAgIHMKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgKTsgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdDoKKyAgICAgICAgICAgIAkgICAgZ290byBsb29wMTk3OwkvKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgKi8KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9vcDE5NzogOyAvKiBKdW1wIG91dCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworCisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxldHJhbnNpdGlvbl90cmlnZ2VyRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxldHJhbnNpdGlvbl90cmlnZ2VyRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSg4MCwgdHJhbnNpdGlvbl90cmlnZ2VyX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCB0cmFuc2l0aW9uX3RyaWdnZXIgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgdHJhbnNpdGlvbl9ndWFyZAorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjQyNDoxOiB0cmFuc2l0aW9uX2d1YXJkWyBzZXA6OkJGQ29kZSAmIGFjIF0gOiAnQGd1YXJkOicgKHM9IHN0YXRlbWVudF9ndWFyZCB8ZT0gZXhwcmVzc2lvbiB8IExCUkFDS0VUIGU9IGV4cHJlc3Npb24gUkJSQUNLRVQgKSogOworICovCitzdGF0aWMgdm9pZAordHJhbnNpdGlvbl9ndWFyZChwZm1sUGFyc2VyIGN0eCwgc2VwOjpCRkNvZGUgJiBhYykKK3sKKyAgICBBTlRMUjNfVUlOVDMyIHRyYW5zaXRpb25fZ3VhcmRfU3RhcnRJbmRleDsKKworICAgIHNlcDo6QkZDb2RlIHM7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX3MKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX3Mgc2VwOjpCRkNvZGUKKworICAgIHNlcDo6QkYgZTsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfZQorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfZSBzZXA6OkJGCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgdHJhbnNpdGlvbl9ndWFyZF9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSg4MSkpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjQyNToyOiAoICdAZ3VhcmQ6JyAocz0gc3RhdGVtZW50X2d1YXJkIHxlPSBleHByZXNzaW9uIHwgTEJSQUNLRVQgZT0gZXhwcmVzc2lvbiBSQlJBQ0tFVCApKiApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI0MjU6NDogJ0BndWFyZDonIChzPSBzdGF0ZW1lbnRfZ3VhcmQgfGU9IGV4cHJlc3Npb24gfCBMQlJBQ0tFVCBlPSBleHByZXNzaW9uIFJCUkFDS0VUICkqCisgICAgICAgIHsKKyAgICAgICAgICAgICBNQVRDSFQoMTg3LCAmRk9MTE9XXzE4N19pbl90cmFuc2l0aW9uX2d1YXJkNjgxOSk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXRyYW5zaXRpb25fZ3VhcmRFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI0MjY6MzogKHM9IHN0YXRlbWVudF9ndWFyZCB8ZT0gZXhwcmVzc2lvbiB8IExCUkFDS0VUIGU9IGV4cHJlc3Npb24gUkJSQUNLRVQgKSoKKworICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTk4PTQ7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDI3ODoKKyAgICAgICAgICAgICAgICBjYXNlIDI5MDoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0MTk4PTE7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBMQlJBQ0tFVDoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJeworICAgICAgICAgICAgICAgIAkJICAgLyogZGZhTG9vcGJhY2tTdGF0ZShrLGVkZ2VzLGVvdFByZWRpY3RzQWx0LGRlc2NyaXB0aW9uLHN0YXRlTnVtYmVyLHNlbVByZWRTdGF0ZSkKKyAgICAgICAgICAgICAgICAJCSAgICAqLworICAgICAgICAgICAgICAgIAkJICAgIGludCBMQTE5OF8yID0gTEEoMik7CisgICAgICAgICAgICAgICAgCQkgICAgaWYgKCAoc3lucHJlZDM0MF9mbWwoY3R4KSkpCisgICAgICAgICAgICAgICAgCQkgICAgeworICAgICAgICAgICAgICAgIAkJICAgICAgICBhbHQxOTg9MjsKKyAgICAgICAgICAgICAgICAJCSAgICB9CisgICAgICAgICAgICAgICAgCQkgICAgZWxzZSBpZiAoIChzeW5wcmVkMzQxX2ZtbChjdHgpKSkKKyAgICAgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAgICAgCQkgICAgICAgIGFsdDE5OD0zOworICAgICAgICAgICAgICAgIAkJICAgIH0KKworICAgICAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQk5PVDoKKyAgICAgICAgICAgICAgICBjYXNlIENPTE9OeDI6CisgICAgICAgICAgICAgICAgY2FzZSBDaGFyTGl0ZXJhbDoKKyAgICAgICAgICAgICAgICBjYXNlIERFQ1I6CisgICAgICAgICAgICAgICAgY2FzZSBET0xMQVJfTENVUkxZOgorICAgICAgICAgICAgICAgIGNhc2UgRmxvYXRMaXRlcmFsOgorICAgICAgICAgICAgICAgIGNhc2UgSUQ6CisgICAgICAgICAgICAgICAgY2FzZSBJTkNSOgorICAgICAgICAgICAgICAgIGNhc2UgSW50ZWdlckxpdGVyYWw6CisgICAgICAgICAgICAgICAgY2FzZSBMQlJBQ0tFVF9CQVI6CisgICAgICAgICAgICAgICAgY2FzZSBMQ1VSTFk6CisgICAgICAgICAgICAgICAgY2FzZSBMTk9UOgorICAgICAgICAgICAgICAgIGNhc2UgTFBBUkVOOgorICAgICAgICAgICAgICAgIGNhc2UgTFBBUkVOX0lOVk9LRToKKyAgICAgICAgICAgICAgICBjYXNlIE1JTlVTOgorICAgICAgICAgICAgICAgIGNhc2UgT1BfUE9QOgorICAgICAgICAgICAgICAgIGNhc2UgT1BfVE9QOgorICAgICAgICAgICAgICAgIGNhc2UgUEVSQ0VOVF9MQ1VSTFk6CisgICAgICAgICAgICAgICAgY2FzZSBQTFVTOgorICAgICAgICAgICAgICAgIGNhc2UgUmF0aW9uYWxMaXRlcmFsOgorICAgICAgICAgICAgICAgIGNhc2UgU3RyaW5nTGl0ZXJhbDoKKyAgICAgICAgICAgICAgICBjYXNlIDE1ODoKKyAgICAgICAgICAgICAgICBjYXNlIDE1OToKKyAgICAgICAgICAgICAgICBjYXNlIDE2MDoKKyAgICAgICAgICAgICAgICBjYXNlIDE2MToKKyAgICAgICAgICAgICAgICBjYXNlIDE2MjoKKyAgICAgICAgICAgICAgICBjYXNlIDIzNzoKKyAgICAgICAgICAgICAgICBjYXNlIDI1NjoKKyAgICAgICAgICAgICAgICBjYXNlIDI2NToKKyAgICAgICAgICAgICAgICBjYXNlIDI3NzoKKyAgICAgICAgICAgICAgICBjYXNlIDI4MDoKKyAgICAgICAgICAgICAgICBjYXNlIDI5NDoKKyAgICAgICAgICAgICAgICBjYXNlIDMxMzoKKyAgICAgICAgICAgICAgICBjYXNlIDMzMDoKKyAgICAgICAgICAgICAgICBjYXNlIDMzMToKKyAgICAgICAgICAgICAgICBjYXNlIDMzMjoKKyAgICAgICAgICAgICAgICBjYXNlIDM0MzoKKyAgICAgICAgICAgICAgICBjYXNlIDM0NzoKKyAgICAgICAgICAgICAgICBjYXNlIDM3MjoKKyAgICAgICAgICAgICAgICBjYXNlIDM5NzoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0MTk4PTI7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE5OCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNDI2OjU6IHM9IHN0YXRlbWVudF9ndWFyZAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19zdGF0ZW1lbnRfZ3VhcmRfaW5fdHJhbnNpdGlvbl9ndWFyZDY4MjcpOworICAgICAgICAgICAgCSAgICAgICAgcz1zdGF0ZW1lbnRfZ3VhcmQoY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXRyYW5zaXRpb25fZ3VhcmRFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgYWMtPmFwcGVuZCggCisgICAgICAgICAgICAJICAgICAgICAgICAgcworICAgICAgICAgICAgCSAgICAgICAgICAgICApOyAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAyOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNDI5OjU6IGU9IGV4cHJlc3Npb24KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl90cmFuc2l0aW9uX2d1YXJkNjg0MCk7CisgICAgICAgICAgICAJICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXRyYW5zaXRpb25fZ3VhcmRFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgYWMtPmFwcGVuZCggTkVXX1NUTVQxKE9QKEdVQVJEKSwgCisgICAgICAgICAgICAJICAgICAgICAgICAgZQorICAgICAgICAgICAgCSAgICAgICAgICAgICkgKTsgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMzoKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjQzMjo1OiBMQlJBQ0tFVCBlPSBleHByZXNzaW9uIFJCUkFDS0VUCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoTEJSQUNLRVQsICZGT0xMT1dfTEJSQUNLRVRfaW5fdHJhbnNpdGlvbl9ndWFyZDY4NTEpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV0cmFuc2l0aW9uX2d1YXJkRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX3RyYW5zaXRpb25fZ3VhcmQ2ODU1KTsKKyAgICAgICAgICAgIAkgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxldHJhbnNpdGlvbl9ndWFyZEV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChSQlJBQ0tFVCwgJkZPTExPV19SQlJBQ0tFVF9pbl90cmFuc2l0aW9uX2d1YXJkNjg1Nyk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXRyYW5zaXRpb25fZ3VhcmRFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgYWMtPmFwcGVuZCggTkVXX1NUTVQxKE9QKEdVQVJEKSwgCisgICAgICAgICAgICAJICAgICAgICAgICAgZQorICAgICAgICAgICAgCSAgICAgICAgICAgICkgKTsgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdDoKKyAgICAgICAgICAgIAkgICAgZ290byBsb29wMTk4OwkvKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgKi8KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9vcDE5ODogOyAvKiBKdW1wIG91dCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworCisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxldHJhbnNpdGlvbl9ndWFyZEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZXRyYW5zaXRpb25fZ3VhcmRFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDgxLCB0cmFuc2l0aW9uX2d1YXJkX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCB0cmFuc2l0aW9uX2d1YXJkICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IHRyYW5zaXRpb25fdGltZWRfZ3VhcmQKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI0Mzc6MTogdHJhbnNpdGlvbl90aW1lZF9ndWFyZFsgc2VwOjpCRkNvZGUgJiBhYyBdIDogJ0B0Z3VhcmQ6JyAocz0gc3RhdGVtZW50X3RpbWVkX2d1YXJkIHxlPSBleHByZXNzaW9uIHwgTENVUkxZIGU9IGV4cHJlc3Npb24gUkNVUkxZICkqIDsKKyAqLworc3RhdGljIHZvaWQKK3RyYW5zaXRpb25fdGltZWRfZ3VhcmQocGZtbFBhcnNlciBjdHgsIHNlcDo6QkZDb2RlICYgYWMpCit7CisgICAgQU5UTFIzX1VJTlQzMiB0cmFuc2l0aW9uX3RpbWVkX2d1YXJkX1N0YXJ0SW5kZXg7CisKKyAgICBzZXA6OkJGQ29kZSBzOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9zCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9zIHNlcDo6QkZDb2RlCisKKyAgICBzZXA6OkJGIGU7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2UKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIHRyYW5zaXRpb25fdGltZWRfZ3VhcmRfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoODIpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI0Mzg6MjogKCAnQHRndWFyZDonIChzPSBzdGF0ZW1lbnRfdGltZWRfZ3VhcmQgfGU9IGV4cHJlc3Npb24gfCBMQ1VSTFkgZT0gZXhwcmVzc2lvbiBSQ1VSTFkgKSogKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNDM4OjQ6ICdAdGd1YXJkOicgKHM9IHN0YXRlbWVudF90aW1lZF9ndWFyZCB8ZT0gZXhwcmVzc2lvbiB8IExDVVJMWSBlPSBleHByZXNzaW9uIFJDVVJMWSApKgorICAgICAgICB7CisgICAgICAgICAgICAgTUFUQ0hUKDIzMCwgJkZPTExPV18yMzBfaW5fdHJhbnNpdGlvbl90aW1lZF9ndWFyZDY4NzkpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGV0cmFuc2l0aW9uX3RpbWVkX2d1YXJkRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNDM5OjM6IChzPSBzdGF0ZW1lbnRfdGltZWRfZ3VhcmQgfGU9IGV4cHJlc3Npb24gfCBMQ1VSTFkgZT0gZXhwcmVzc2lvbiBSQ1VSTFkgKSoKKworICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTk5PTQ7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDM5MToKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0MTk5PTE7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBMQ1VSTFk6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgICAgICAJCSAgIC8qIGRmYUxvb3BiYWNrU3RhdGUoayxlZGdlcyxlb3RQcmVkaWN0c0FsdCxkZXNjcmlwdGlvbixzdGF0ZU51bWJlcixzZW1QcmVkU3RhdGUpCisgICAgICAgICAgICAgICAgCQkgICAgKi8KKyAgICAgICAgICAgICAgICAJCSAgICBpbnQgTEExOTlfMiA9IExBKDIpOworICAgICAgICAgICAgICAgIAkJICAgIGlmICggKHN5bnByZWQzNDNfZm1sKGN0eCkpKQorICAgICAgICAgICAgICAgIAkJICAgIHsKKyAgICAgICAgICAgICAgICAJCSAgICAgICAgYWx0MTk5PTI7CisgICAgICAgICAgICAgICAgCQkgICAgfQorICAgICAgICAgICAgICAgIAkJICAgIGVsc2UgaWYgKCAoc3lucHJlZDM0NF9mbWwoY3R4KSkpCisgICAgICAgICAgICAgICAgCQkgICAgeworICAgICAgICAgICAgICAgIAkJICAgICAgICBhbHQxOTk9MzsKKyAgICAgICAgICAgICAgICAJCSAgICB9CisKKyAgICAgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJOT1Q6CisgICAgICAgICAgICAgICAgY2FzZSBDT0xPTngyOgorICAgICAgICAgICAgICAgIGNhc2UgQ2hhckxpdGVyYWw6CisgICAgICAgICAgICAgICAgY2FzZSBERUNSOgorICAgICAgICAgICAgICAgIGNhc2UgRE9MTEFSX0xDVVJMWToKKyAgICAgICAgICAgICAgICBjYXNlIEZsb2F0TGl0ZXJhbDoKKyAgICAgICAgICAgICAgICBjYXNlIElEOgorICAgICAgICAgICAgICAgIGNhc2UgSU5DUjoKKyAgICAgICAgICAgICAgICBjYXNlIEludGVnZXJMaXRlcmFsOgorICAgICAgICAgICAgICAgIGNhc2UgTEJSQUNLRVQ6CisgICAgICAgICAgICAgICAgY2FzZSBMQlJBQ0tFVF9CQVI6CisgICAgICAgICAgICAgICAgY2FzZSBMTk9UOgorICAgICAgICAgICAgICAgIGNhc2UgTFBBUkVOOgorICAgICAgICAgICAgICAgIGNhc2UgTFBBUkVOX0lOVk9LRToKKyAgICAgICAgICAgICAgICBjYXNlIE1JTlVTOgorICAgICAgICAgICAgICAgIGNhc2UgT1BfUE9QOgorICAgICAgICAgICAgICAgIGNhc2UgT1BfVE9QOgorICAgICAgICAgICAgICAgIGNhc2UgUEVSQ0VOVF9MQ1VSTFk6CisgICAgICAgICAgICAgICAgY2FzZSBQTFVTOgorICAgICAgICAgICAgICAgIGNhc2UgUmF0aW9uYWxMaXRlcmFsOgorICAgICAgICAgICAgICAgIGNhc2UgU3RyaW5nTGl0ZXJhbDoKKyAgICAgICAgICAgICAgICBjYXNlIDE1ODoKKyAgICAgICAgICAgICAgICBjYXNlIDE1OToKKyAgICAgICAgICAgICAgICBjYXNlIDE2MDoKKyAgICAgICAgICAgICAgICBjYXNlIDE2MToKKyAgICAgICAgICAgICAgICBjYXNlIDE2MjoKKyAgICAgICAgICAgICAgICBjYXNlIDIzNzoKKyAgICAgICAgICAgICAgICBjYXNlIDI1NjoKKyAgICAgICAgICAgICAgICBjYXNlIDI2NToKKyAgICAgICAgICAgICAgICBjYXNlIDI3NzoKKyAgICAgICAgICAgICAgICBjYXNlIDI4MDoKKyAgICAgICAgICAgICAgICBjYXNlIDI5NDoKKyAgICAgICAgICAgICAgICBjYXNlIDMxMzoKKyAgICAgICAgICAgICAgICBjYXNlIDMzMDoKKyAgICAgICAgICAgICAgICBjYXNlIDMzMToKKyAgICAgICAgICAgICAgICBjYXNlIDMzMjoKKyAgICAgICAgICAgICAgICBjYXNlIDM0MzoKKyAgICAgICAgICAgICAgICBjYXNlIDM0NzoKKyAgICAgICAgICAgICAgICBjYXNlIDM3MjoKKyAgICAgICAgICAgICAgICBjYXNlIDM5NzoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0MTk5PTI7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE5OSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNDM5OjU6IHM9IHN0YXRlbWVudF90aW1lZF9ndWFyZAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19zdGF0ZW1lbnRfdGltZWRfZ3VhcmRfaW5fdHJhbnNpdGlvbl90aW1lZF9ndWFyZDY4ODcpOworICAgICAgICAgICAgCSAgICAgICAgcz1zdGF0ZW1lbnRfdGltZWRfZ3VhcmQoY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXRyYW5zaXRpb25fdGltZWRfZ3VhcmRFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgYWMtPmFwcGVuZCggCisgICAgICAgICAgICAJICAgICAgICAgICAgcworICAgICAgICAgICAgCSAgICAgICAgICAgICApOyAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAyOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNDQyOjU6IGU9IGV4cHJlc3Npb24KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl90cmFuc2l0aW9uX3RpbWVkX2d1YXJkNjkwMCk7CisgICAgICAgICAgICAJICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXRyYW5zaXRpb25fdGltZWRfZ3VhcmRFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgYWMtPmFwcGVuZCggTkVXX1NUTVQxKE9QKFRJTUVEX0dVQVJEKSwgCisgICAgICAgICAgICAJICAgICAgICAgICAgZQorICAgICAgICAgICAgCSAgICAgICAgICAgICkgKTsgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMzoKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjQ0NTo1OiBMQ1VSTFkgZT0gZXhwcmVzc2lvbiBSQ1VSTFkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChMQ1VSTFksICZGT0xMT1dfTENVUkxZX2luX3RyYW5zaXRpb25fdGltZWRfZ3VhcmQ2OTExKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxldHJhbnNpdGlvbl90aW1lZF9ndWFyZEV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl90cmFuc2l0aW9uX3RpbWVkX2d1YXJkNjkxNSk7CisgICAgICAgICAgICAJICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXRyYW5zaXRpb25fdGltZWRfZ3VhcmRFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoUkNVUkxZLCAmRk9MTE9XX1JDVVJMWV9pbl90cmFuc2l0aW9uX3RpbWVkX2d1YXJkNjkxNyk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXRyYW5zaXRpb25fdGltZWRfZ3VhcmRFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgYWMtPmFwcGVuZCggTkVXX1NUTVQxKE9QKFRJTUVEX0dVQVJEKSwgCisgICAgICAgICAgICAJICAgICAgICAgICAgZQorICAgICAgICAgICAgCSAgICAgICAgICAgICkgKTsgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdDoKKyAgICAgICAgICAgIAkgICAgZ290byBsb29wMTk5OwkvKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgKi8KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9vcDE5OTogOyAvKiBKdW1wIG91dCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworCisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxldHJhbnNpdGlvbl90aW1lZF9ndWFyZEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZXRyYW5zaXRpb25fdGltZWRfZ3VhcmRFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDgyLCB0cmFuc2l0aW9uX3RpbWVkX2d1YXJkX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCB0cmFuc2l0aW9uX3RpbWVkX2d1YXJkICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IHRyYW5zaXRpb25fZWZmZWN0CisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNDUwOjE6IHRyYW5zaXRpb25fZWZmZWN0WyBzZXA6OkJGQ29kZSAmIGFjIF0gOiAnQGVmZmVjdDonIChzPSBzdGF0ZW1lbnQgKSogOworICovCitzdGF0aWMgdm9pZAordHJhbnNpdGlvbl9lZmZlY3QocGZtbFBhcnNlciBjdHgsIHNlcDo6QkZDb2RlICYgYWMpCit7CisgICAgQU5UTFIzX1VJTlQzMiB0cmFuc2l0aW9uX2VmZmVjdF9TdGFydEluZGV4OworCisgICAgc2VwOjpCRkNvZGUgczsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfcworICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfcyBzZXA6OkJGQ29kZQorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIHRyYW5zaXRpb25fZWZmZWN0X1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDgzKSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNDUxOjI6ICggJ0BlZmZlY3Q6JyAocz0gc3RhdGVtZW50ICkqICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjQ1MTo0OiAnQGVmZmVjdDonIChzPSBzdGF0ZW1lbnQgKSoKKyAgICAgICAgeworICAgICAgICAgICAgIE1BVENIVCgxODEsICZGT0xMT1dfMTgxX2luX3RyYW5zaXRpb25fZWZmZWN0NjkzOSk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXRyYW5zaXRpb25fZWZmZWN0RXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNDUxOjE1OiAocz0gc3RhdGVtZW50ICkqCisKKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDIwMD0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBDT0xPTngyOgorICAgICAgICAgICAgICAgIGNhc2UgREVDUjoKKyAgICAgICAgICAgICAgICBjYXNlIERPTExBUl9MQ1VSTFk6CisgICAgICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgICAgICAgICBjYXNlIElOQ1I6CisgICAgICAgICAgICAgICAgY2FzZSBMQ1VSTFk6CisgICAgICAgICAgICAgICAgY2FzZSBMUEFSRU5fSU5WT0tFOgorICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVNRU5UX1BST01QVDoKKyAgICAgICAgICAgICAgICBjYXNlIDE1NDoKKyAgICAgICAgICAgICAgICBjYXNlIDE1NToKKyAgICAgICAgICAgICAgICBjYXNlIDE1NjoKKyAgICAgICAgICAgICAgICBjYXNlIDE1NzoKKyAgICAgICAgICAgICAgICBjYXNlIDIzNjoKKyAgICAgICAgICAgICAgICBjYXNlIDI0NzoKKyAgICAgICAgICAgICAgICBjYXNlIDI1MDoKKyAgICAgICAgICAgICAgICBjYXNlIDI1NjoKKyAgICAgICAgICAgICAgICBjYXNlIDI2MzoKKyAgICAgICAgICAgICAgICBjYXNlIDI2NzoKKyAgICAgICAgICAgICAgICBjYXNlIDI2ODoKKyAgICAgICAgICAgICAgICBjYXNlIDI2OToKKyAgICAgICAgICAgICAgICBjYXNlIDI3NToKKyAgICAgICAgICAgICAgICBjYXNlIDI3ODoKKyAgICAgICAgICAgICAgICBjYXNlIDI3OToKKyAgICAgICAgICAgICAgICBjYXNlIDI4MjoKKyAgICAgICAgICAgICAgICBjYXNlIDI4NToKKyAgICAgICAgICAgICAgICBjYXNlIDI4OToKKyAgICAgICAgICAgICAgICBjYXNlIDI5MDoKKyAgICAgICAgICAgICAgICBjYXNlIDI5MToKKyAgICAgICAgICAgICAgICBjYXNlIDI5MjoKKyAgICAgICAgICAgICAgICBjYXNlIDI5MzoKKyAgICAgICAgICAgICAgICBjYXNlIDI5NDoKKyAgICAgICAgICAgICAgICBjYXNlIDI5NjoKKyAgICAgICAgICAgICAgICBjYXNlIDI5OToKKyAgICAgICAgICAgICAgICBjYXNlIDMwMDoKKyAgICAgICAgICAgICAgICBjYXNlIDMwMToKKyAgICAgICAgICAgICAgICBjYXNlIDMwMjoKKyAgICAgICAgICAgICAgICBjYXNlIDMwMzoKKyAgICAgICAgICAgICAgICBjYXNlIDMwNDoKKyAgICAgICAgICAgICAgICBjYXNlIDMwNToKKyAgICAgICAgICAgICAgICBjYXNlIDMxMjoKKyAgICAgICAgICAgICAgICBjYXNlIDMzMDoKKyAgICAgICAgICAgICAgICBjYXNlIDMzNjoKKyAgICAgICAgICAgICAgICBjYXNlIDMzNzoKKyAgICAgICAgICAgICAgICBjYXNlIDMzODoKKyAgICAgICAgICAgICAgICBjYXNlIDMzOToKKyAgICAgICAgICAgICAgICBjYXNlIDM0MDoKKyAgICAgICAgICAgICAgICBjYXNlIDM0MToKKyAgICAgICAgICAgICAgICBjYXNlIDM2MjoKKyAgICAgICAgICAgICAgICBjYXNlIDM2MzoKKyAgICAgICAgICAgICAgICBjYXNlIDM2NDoKKyAgICAgICAgICAgICAgICBjYXNlIDM2ODoKKyAgICAgICAgICAgICAgICBjYXNlIDM2OToKKyAgICAgICAgICAgICAgICBjYXNlIDM3MToKKyAgICAgICAgICAgICAgICBjYXNlIDM3NzoKKyAgICAgICAgICAgICAgICBjYXNlIDM4NToKKyAgICAgICAgICAgICAgICBjYXNlIDM4NjoKKyAgICAgICAgICAgICAgICBjYXNlIDM4OToKKyAgICAgICAgICAgICAgICBjYXNlIDM5MToKKyAgICAgICAgICAgICAgICBjYXNlIDQxNToKKyAgICAgICAgICAgICAgICBjYXNlIDQxNjoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0MjAwPTE7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDIwMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNDUxOjE3OiBzPSBzdGF0ZW1lbnQKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfc3RhdGVtZW50X2luX3RyYW5zaXRpb25fZWZmZWN0Njk0NSk7CisgICAgICAgICAgICAJICAgICAgICBzPXN0YXRlbWVudChjdHgpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxldHJhbnNpdGlvbl9lZmZlY3RFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgYWMtPmFwcGVuZCggCisgICAgICAgICAgICAJICAgICAgICAgICAgcworICAgICAgICAgICAgCSAgICAgICAgICAgICApOyAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAgICAgCSAgICBnb3RvIGxvb3AyMDA7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb29wMjAwOiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGV0cmFuc2l0aW9uX2VmZmVjdEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZXRyYW5zaXRpb25fZWZmZWN0RXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSg4MywgdHJhbnNpdGlvbl9lZmZlY3RfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIHRyYW5zaXRpb25fZWZmZWN0ICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IHRhcmdldF9zdGF0ZV9pZAorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjQ1NToxOiB0YXJnZXRfc3RhdGVfaWQgcmV0dXJucyBbIHNlcDo6QkYgdGFyZ2V0IF0gOiAoa3c9IHRhcmdldF9zdGF0ZV9rd19pZCB8dT0gcXVhbGlmaWVkTmFtZUlEIHwgRE9MTEFSIGlkPSBJRCApOworICovCitzdGF0aWMgc2VwOjpCRgordGFyZ2V0X3N0YXRlX2lkKHBmbWxQYXJzZXIgY3R4KQoreworICAgIHNlcDo6QkYgdGFyZ2V0OworCisgICAgQU5UTFIzX1VJTlQzMiB0YXJnZXRfc3RhdGVfaWRfU3RhcnRJbmRleDsKKworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIGlkOworICAgIHN0ZDo6c3RyaW5nIGt3OworICAgICN1bmRlZglSRVRVUk5fVFlQRV9rdworICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfa3cgc3RkOjpzdHJpbmcKKworICAgIGZtbFBhcnNlcl9xdWFsaWZpZWROYW1lSURfcmV0dXJuIHU7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX3UKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX3UgZm1sUGFyc2VyX3F1YWxpZmllZE5hbWVJRF9yZXR1cm4KKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICB0YXJnZXRfc3RhdGVfaWRfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworCisgICAgCXN0ZDo6c3RyaW5nIHRpZDsKKyAgICAJc2VwOjphdm1fc2l6ZV90IG5iID0gMTsKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoODQpKSApCisgICAgeworICAgICAgICB7CisKKyAgICAgICAgICAgIAlpZiggKHRhcmdldCA9IHNlcDo6UGFyc2VyVXRpbDo6Z2V0dmFyTWFjaGluZSh0aWQsIG5iKSkuaW52YWxpZCgpICkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCXRhcmdldCA9IE5FV19RTklEKHRpZCwgbmIpOworICAgICAgICAgICAgCX0KKworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gdGFyZ2V0OworICAgIH0KKworICAgIGlkICAgICAgID0gTlVMTDsKKworICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI0Njc6MjogKGt3PSB0YXJnZXRfc3RhdGVfa3dfaWQgfHU9IHF1YWxpZmllZE5hbWVJRCB8IERPTExBUiBpZD0gSUQgKQorCisgICAgICAgICAgICBBTlRMUjNfVUlOVDMyIGFsdDIwMTsKKworICAgICAgICAgICAgYWx0MjAxPTM7CisKKyAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMTQ0OgorICAgICAgICAgICAgY2FzZSAxNDU6CisgICAgICAgICAgICBjYXNlIDE0NjoKKyAgICAgICAgICAgIGNhc2UgMTQ3OgorICAgICAgICAgICAgY2FzZSAxNDg6CisgICAgICAgICAgICBjYXNlIDE0OToKKyAgICAgICAgICAgIGNhc2UgMTUwOgorICAgICAgICAgICAgY2FzZSAxNTM6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQyMDE9MTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIElEOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MjAxPTI7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBET0xMQVI6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQyMDE9MzsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMjAxOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgZ290byBydWxldGFyZ2V0X3N0YXRlX2lkRXg7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQyMDEpCisgICAgICAgICAgICB7CisgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjQ2Nzo0OiBrdz0gdGFyZ2V0X3N0YXRlX2t3X2lkCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV190YXJnZXRfc3RhdGVfa3dfaWRfaW5fdGFyZ2V0X3N0YXRlX2lkNjk3Nyk7CisgICAgICAgIAkgICAgICAgIGt3PXRhcmdldF9zdGF0ZV9rd19pZChjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV0YXJnZXRfc3RhdGVfaWRFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIHRpZCA9IGt3CisgICAgICAgIAkgICAgICAgICAgICA7IAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNDY5OjQ6IHU9IHF1YWxpZmllZE5hbWVJRAorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX3RhcmdldF9zdGF0ZV9pZDY5ODgpOworICAgICAgICAJICAgICAgICB1PXF1YWxpZmllZE5hbWVJRChjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV0YXJnZXRfc3RhdGVfaWRFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIHRpZCA9IHUucworICAgICAgICAJICAgICAgICAgICAgOyBuYiA9IHUubmIKKyAgICAgICAgCSAgICAgICAgICAgIDsgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAzOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI0NzE6NDogRE9MTEFSIGlkPSBJRAorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChET0xMQVIsICZGT0xMT1dfRE9MTEFSX2luX3RhcmdldF9zdGF0ZV9pZDcwMDUpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV0YXJnZXRfc3RhdGVfaWRFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlkID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoSUQsICZGT0xMT1dfSURfaW5fdGFyZ2V0X3N0YXRlX2lkNzAwOSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXRhcmdldF9zdGF0ZV9pZEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgdGlkID0iJCIgKyBTVFIoKGlkLT5nZXRUZXh0KGlkKSktPmNoYXJzKTsgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGV0YXJnZXRfc3RhdGVfaWRFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGV0YXJnZXRfc3RhdGVfaWRFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgCWlmKCAodGFyZ2V0ID0gc2VwOjpQYXJzZXJVdGlsOjpnZXR2YXJNYWNoaW5lKHRpZCwgbmIpKS5pbnZhbGlkKCkgKQorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCXRhcmdldCA9IE5FV19RTklEKHRpZCwgbmIpOworICAgICAgICAgICAgICAgICAgICAJfQorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisKKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDg0LCB0YXJnZXRfc3RhdGVfaWRfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiB0YXJnZXQ7Cit9CisvKiAkQU5UTFIgZW5kIHRhcmdldF9zdGF0ZV9pZCAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCB0YXJnZXRfc3RhdGVfa3dfaWQKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI0NzU6MTogdGFyZ2V0X3N0YXRlX2t3X2lkIHJldHVybnMgWyBzdGQ6OnN0cmluZyBzIF0gOiAoICcjaW5pdCcgfCAnI2luaXRpYWwnIHwgJyNzdGFydCcgfCAnI2RoaXN0b3J5JyB8ICcjc2hpc3RvcnknIHwgJyNmaW5hbCcgfCAnI3Rlcm1pbmFsJyB8ICcjcmV0dXJuJyApOworICovCitzdGF0aWMgc3RkOjpzdHJpbmcKK3RhcmdldF9zdGF0ZV9rd19pZChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBzdGQ6OnN0cmluZyBzOworCisgICAgQU5UTFIzX1VJTlQzMiB0YXJnZXRfc3RhdGVfa3dfaWRfU3RhcnRJbmRleDsKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICB0YXJnZXRfc3RhdGVfa3dfaWRfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoODUpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIHM7CisgICAgfQorCisgICAgeworICAgICAgICB7CisgICAgICAgICAgICAvLyAgL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjQ3NzoyOiAoICcjaW5pdCcgfCAnI2luaXRpYWwnIHwgJyNzdGFydCcgfCAnI2RoaXN0b3J5JyB8ICcjc2hpc3RvcnknIHwgJyNmaW5hbCcgfCAnI3Rlcm1pbmFsJyB8ICcjcmV0dXJuJyApCisKKyAgICAgICAgICAgIEFOVExSM19VSU5UMzIgYWx0MjAyOworCisgICAgICAgICAgICBhbHQyMDI9ODsKKworICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAxNDY6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQyMDI9MTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE0NzoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDIwMj0yOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTUwOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MjAyPTM7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNDQ6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQyMDI9NDsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE0OToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDIwMj01OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTQ1OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MjAyPTY7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNTM6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQyMDI9NzsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE0ODoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDIwMj04OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMjAyOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgZ290byBydWxldGFyZ2V0X3N0YXRlX2t3X2lkRXg7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQyMDIpCisgICAgICAgICAgICB7CisgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjQ3Nzo0OiAnI2luaXQnCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDE0NiwgJkZPTExPV18xNDZfaW5fdGFyZ2V0X3N0YXRlX2t3X2lkNzAzMCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXRhcmdldF9zdGF0ZV9rd19pZEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIHM9ICIjaW5pdCIgICAgOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNDc4OjQ6ICcjaW5pdGlhbCcKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMTQ3LCAmRk9MTE9XXzE0N19pbl90YXJnZXRfc3RhdGVfa3dfaWQ3MDQyKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxldGFyZ2V0X3N0YXRlX2t3X2lkRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgcz0gIiNpbml0aWFsIiA7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAzOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI0Nzk6NDogJyNzdGFydCcKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMTUwLCAmRk9MTE9XXzE1MF9pbl90YXJnZXRfc3RhdGVfa3dfaWQ3MDUxKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxldGFyZ2V0X3N0YXRlX2t3X2lkRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgcz0gIiNzdGFydCIgICA7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA0OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI0ODE6NDogJyNkaGlzdG9yeScKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMTQ0LCAmRk9MTE9XXzE0NF9pbl90YXJnZXRfc3RhdGVfa3dfaWQ3MDYzKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxldGFyZ2V0X3N0YXRlX2t3X2lkRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgcz0gIiNkaGlzdG9yeSI7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA1OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI0ODI6NDogJyNzaGlzdG9yeScKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMTQ5LCAmRk9MTE9XXzE0OV9pbl90YXJnZXRfc3RhdGVfa3dfaWQ3MDcxKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxldGFyZ2V0X3N0YXRlX2t3X2lkRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgcz0gIiNzaGlzdG9yeSI7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA2OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI0ODQ6NDogJyNmaW5hbCcKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMTQ1LCAmRk9MTE9XXzE0NV9pbl90YXJnZXRfc3RhdGVfa3dfaWQ3MDgwKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxldGFyZ2V0X3N0YXRlX2t3X2lkRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgcz0gIiNmaW5hbCI7CisKKyAgICAgICAgCSAgICAgICAgICAgIAkJbmVlZERlZmF1bHRTdGF0ZUZpbmFsLnB1c2hfYmFjayhfQ1BNXy0+Z2V0Q29udGFpbmVyTWFjaGluZSgpKTsgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA3OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI0ODg6NDogJyN0ZXJtaW5hbCcKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMTUzLCAmRk9MTE9XXzE1M19pbl90YXJnZXRfc3RhdGVfa3dfaWQ3MDg5KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxldGFyZ2V0X3N0YXRlX2t3X2lkRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgcz0gIiN0ZXJtaW5hbCI7CisKKyAgICAgICAgCSAgICAgICAgICAgIAkJbmVlZERlZmF1bHRTdGF0ZVRlcm1pbmFsLnB1c2hfYmFjayhfQ1BNXy0+Z2V0Q29udGFpbmVyTWFjaGluZSgpKTsgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA4OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI0OTI6NDogJyNyZXR1cm4nCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDE0OCwgJkZPTExPV18xNDhfaW5fdGFyZ2V0X3N0YXRlX2t3X2lkNzA5OCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXRhcmdldF9zdGF0ZV9rd19pZEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIHM9ICIjcmV0dXJuIjsKKworICAgICAgICAJICAgICAgICAgICAgCQluZWVkRGVmYXVsdFN0YXRlUmV0dXJuLnB1c2hfYmFjayhfQ1BNXy0+Z2V0Q29udGFpbmVyTWFjaGluZSgpKTsgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGV0YXJnZXRfc3RhdGVfa3dfaWRFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGV0YXJnZXRfc3RhdGVfa3dfaWRFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDg1LCB0YXJnZXRfc3RhdGVfa3dfaWRfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiBzOworfQorLyogJEFOVExSIGVuZCB0YXJnZXRfc3RhdGVfa3dfaWQgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgZGVmX3N0YXRlX2FjdGl2aXR5CisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNDk4OjE6IGRlZl9zdGF0ZV9hY3Rpdml0eVsgc2VwOjpNYWNoaW5lICogc3RhdGUgXSA6ICggJ0BjcmVhdGUnIGJzPSBibG9ja19zdGF0ZW1lbnQgfCAnQGluaXQnIGJzPSBibG9ja19zdGF0ZW1lbnQgfCAnQGllbmFibGUnIGJzPSBibG9ja19zdGF0ZW1lbnQgfCAnQGVuYWJsZScgYnM9IGJsb2NrX3N0YXRlbWVudCB8ICdAaWRpc2FibGUnIGJzPSBibG9ja19zdGF0ZW1lbnQgfCAnQGRpc2FibGUnIGJzPSBibG9ja19zdGF0ZW1lbnQgfCAnQGlhYm9ydCcgYnM9IGJsb2NrX3N0YXRlbWVudCB8ICdAYWJvcnQnIGJzPSBibG9ja19zdGF0ZW1lbnQgfCAnQGlydW4nIGJzPSBibG9ja19zdGF0ZW1lbnQgfCAnQHJ1bicgYnM9IGJsb2NrX3N0YXRlbWVudCB8ICdAcnRjJyBicz0gYmxvY2tfc3RhdGVtZW50IHwgJ0BmaW5hbCcgYnM9IGJsb2NrX3N0YXRlbWVudCApOworICovCitzdGF0aWMgdm9pZAorZGVmX3N0YXRlX2FjdGl2aXR5KHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBzdGF0ZSkKK3sKKyAgICBBTlRMUjNfVUlOVDMyIGRlZl9zdGF0ZV9hY3Rpdml0eV9TdGFydEluZGV4OworCisgICAgc2VwOjpCRkNvZGUgYnM7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2JzCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9icyBzZXA6OkJGQ29kZQorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGRlZl9zdGF0ZV9hY3Rpdml0eV9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisKKyAgICAJc2VwOjpCZWhhdmlvcmFsUGFydCAqIHRoZUJlaGF2aW9yID0gc3RhdGUtPmdldFVuaXFCZWhhdmlvclBhcnQoKTsKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoODYpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vICAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNTAyOjI6ICggJ0BjcmVhdGUnIGJzPSBibG9ja19zdGF0ZW1lbnQgfCAnQGluaXQnIGJzPSBibG9ja19zdGF0ZW1lbnQgfCAnQGllbmFibGUnIGJzPSBibG9ja19zdGF0ZW1lbnQgfCAnQGVuYWJsZScgYnM9IGJsb2NrX3N0YXRlbWVudCB8ICdAaWRpc2FibGUnIGJzPSBibG9ja19zdGF0ZW1lbnQgfCAnQGRpc2FibGUnIGJzPSBibG9ja19zdGF0ZW1lbnQgfCAnQGlhYm9ydCcgYnM9IGJsb2NrX3N0YXRlbWVudCB8ICdAYWJvcnQnIGJzPSBibG9ja19zdGF0ZW1lbnQgfCAnQGlydW4nIGJzPSBibG9ja19zdGF0ZW1lbnQgfCAnQHJ1bicgYnM9IGJsb2NrX3N0YXRlbWVudCB8ICdAcnRjJyBicz0gYmxvY2tfc3RhdGVtZW50IHwgJ0BmaW5hbCcgYnM9IGJsb2NrX3N0YXRlbWVudCApCisKKyAgICAgICAgICAgIEFOVExSM19VSU5UMzIgYWx0MjAzOworCisgICAgICAgICAgICBhbHQyMDM9MTI7CisKKyAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMTc3OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MjAzPTE7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOTQ6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQyMDM9MjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE5MToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDIwMz0zOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTgyOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MjAzPTQ7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOTA6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQyMDM9NTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE3OToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDIwMz02OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTg5OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MjAzPTc7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNzA6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQyMDM9ODsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE5OToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDIwMz05OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjI0OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MjAzPTEwOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjIzOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MjAzPTExOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTg0OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MjAzPTEyOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAyMDM7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfc3RhdGVfYWN0aXZpdHlFeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDIwMykKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNTAyOjQ6ICdAY3JlYXRlJyBicz0gYmxvY2tfc3RhdGVtZW50CisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDE3NywgJkZPTExPV18xNzdfaW5fZGVmX3N0YXRlX2FjdGl2aXR5NzExOSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9zdGF0ZV9hY3Rpdml0eUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcxMjUpOworICAgICAgICAJICAgICAgICBicz1ibG9ja19zdGF0ZW1lbnQoY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3N0YXRlX2FjdGl2aXR5RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICB0aGVCZWhhdmlvci0+c2VxT25DcmVhdGUoYnMKKyAgICAgICAgCSAgICAgICAgICAgICk7IAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNTAzOjQ6ICdAaW5pdCcgYnM9IGJsb2NrX3N0YXRlbWVudAorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgxOTQsICZGT0xMT1dfMTk0X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcxMzMpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfc3RhdGVfYWN0aXZpdHlFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MTQxKTsKKyAgICAgICAgCSAgICAgICAgYnM9YmxvY2tfc3RhdGVtZW50KGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9zdGF0ZV9hY3Rpdml0eUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgdGhlQmVoYXZpb3ItPnNlcU9uSW5pdChicworICAgICAgICAJICAgICAgICAgICAgKTsgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDM6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjUwNTo0OiAnQGllbmFibGUnIGJzPSBibG9ja19zdGF0ZW1lbnQKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMTkxLCAmRk9MTE9XXzE5MV9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MTUwKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3N0YXRlX2FjdGl2aXR5RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19ibG9ja19zdGF0ZW1lbnRfaW5fZGVmX3N0YXRlX2FjdGl2aXR5NzE1NSk7CisgICAgICAgIAkgICAgICAgIGJzPWJsb2NrX3N0YXRlbWVudChjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfc3RhdGVfYWN0aXZpdHlFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIHRoZUJlaGF2aW9yLT5zZXFPbklFbmFibGUoYnMKKyAgICAgICAgCSAgICAgICAgICAgICk7IAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgNDoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNTA2OjQ6ICdAZW5hYmxlJyBicz0gYmxvY2tfc3RhdGVtZW50CisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDE4MiwgJkZPTExPV18xODJfaW5fZGVmX3N0YXRlX2FjdGl2aXR5NzE2Myk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9zdGF0ZV9hY3Rpdml0eUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcxNjkpOworICAgICAgICAJICAgICAgICBicz1ibG9ja19zdGF0ZW1lbnQoY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3N0YXRlX2FjdGl2aXR5RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICB0aGVCZWhhdmlvci0+c2VxT25FbmFibGUgKGJzCisgICAgICAgIAkgICAgICAgICAgICApOyAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDU6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjUwODo0OiAnQGlkaXNhYmxlJyBicz0gYmxvY2tfc3RhdGVtZW50CisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDE5MCwgJkZPTExPV18xOTBfaW5fZGVmX3N0YXRlX2FjdGl2aXR5NzE3OCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9zdGF0ZV9hY3Rpdml0eUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcxODIpOworICAgICAgICAJICAgICAgICBicz1ibG9ja19zdGF0ZW1lbnQoY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3N0YXRlX2FjdGl2aXR5RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICB0aGVCZWhhdmlvci0+c2VxT25JRGlzYWJsZShicworICAgICAgICAJICAgICAgICAgICAgKTsgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA2OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI1MDk6NDogJ0BkaXNhYmxlJyBicz0gYmxvY2tfc3RhdGVtZW50CisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDE3OSwgJkZPTExPV18xNzlfaW5fZGVmX3N0YXRlX2FjdGl2aXR5NzE5MCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9zdGF0ZV9hY3Rpdml0eUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcxOTUpOworICAgICAgICAJICAgICAgICBicz1ibG9ja19zdGF0ZW1lbnQoY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3N0YXRlX2FjdGl2aXR5RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICB0aGVCZWhhdmlvci0+c2VxT25EaXNhYmxlIChicworICAgICAgICAJICAgICAgICAgICAgKTsgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA3OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI1MTE6NDogJ0BpYWJvcnQnIGJzPSBibG9ja19zdGF0ZW1lbnQKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMTg5LCAmRk9MTE9XXzE4OV9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MjA0KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3N0YXRlX2FjdGl2aXR5RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19ibG9ja19zdGF0ZW1lbnRfaW5fZGVmX3N0YXRlX2FjdGl2aXR5NzIxMCk7CisgICAgICAgIAkgICAgICAgIGJzPWJsb2NrX3N0YXRlbWVudChjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfc3RhdGVfYWN0aXZpdHlFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIHRoZUJlaGF2aW9yLT5zZXFPbklBYm9ydChicworICAgICAgICAJICAgICAgICAgICAgKTsgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA4OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI1MTI6NDogJ0BhYm9ydCcgYnM9IGJsb2NrX3N0YXRlbWVudAorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgxNzAsICZGT0xMT1dfMTcwX2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcyMTgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfc3RhdGVfYWN0aXZpdHlFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MjI1KTsKKyAgICAgICAgCSAgICAgICAgYnM9YmxvY2tfc3RhdGVtZW50KGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9zdGF0ZV9hY3Rpdml0eUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgdGhlQmVoYXZpb3ItPnNlcU9uQWJvcnQoYnMKKyAgICAgICAgCSAgICAgICAgICAgICk7IAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgOToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNTE0OjQ6ICdAaXJ1bicgYnM9IGJsb2NrX3N0YXRlbWVudAorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgxOTksICZGT0xMT1dfMTk5X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcyMzQpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfc3RhdGVfYWN0aXZpdHlFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MjQyKTsKKyAgICAgICAgCSAgICAgICAgYnM9YmxvY2tfc3RhdGVtZW50KGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9zdGF0ZV9hY3Rpdml0eUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgdGhlQmVoYXZpb3ItPnNlcU9uSVJ1bihicworICAgICAgICAJICAgICAgICAgICAgKTsgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAxMDoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNTE1OjQ6ICdAcnVuJyBicz0gYmxvY2tfc3RhdGVtZW50CisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDIyNCwgJkZPTExPV18yMjRfaW5fZGVmX3N0YXRlX2FjdGl2aXR5NzI1MCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9zdGF0ZV9hY3Rpdml0eUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcyNTkpOworICAgICAgICAJICAgICAgICBicz1ibG9ja19zdGF0ZW1lbnQoY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3N0YXRlX2FjdGl2aXR5RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICB0aGVCZWhhdmlvci0+c2VxT25SdW4oYnMKKyAgICAgICAgCSAgICAgICAgICAgICk7IAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMTE6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjUxNjo0OiAnQHJ0YycgYnM9IGJsb2NrX3N0YXRlbWVudAorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgyMjMsICZGT0xMT1dfMjIzX2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcyNjcpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfc3RhdGVfYWN0aXZpdHlFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3Mjc2KTsKKyAgICAgICAgCSAgICAgICAgYnM9YmxvY2tfc3RhdGVtZW50KGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9zdGF0ZV9hY3Rpdml0eUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgdGhlQmVoYXZpb3ItPnNlcU9uUnRjKGJzCisgICAgICAgIAkgICAgICAgICAgICApOyAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDEyOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI1MTg6NDogJ0BmaW5hbCcgYnM9IGJsb2NrX3N0YXRlbWVudAorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgxODQsICZGT0xMT1dfMTg0X2luX2RlZl9zdGF0ZV9hY3Rpdml0eTcyODUpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfc3RhdGVfYWN0aXZpdHlFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9kZWZfc3RhdGVfYWN0aXZpdHk3MjkyKTsKKyAgICAgICAgCSAgICAgICAgYnM9YmxvY2tfc3RhdGVtZW50KGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9zdGF0ZV9hY3Rpdml0eUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgdGhlQmVoYXZpb3ItPnNlcU9uRmluYWwoYnMKKyAgICAgICAgCSAgICAgICAgICAgICk7IAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlZGVmX3N0YXRlX2FjdGl2aXR5RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlZGVmX3N0YXRlX2FjdGl2aXR5RXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSg4NiwgZGVmX3N0YXRlX2FjdGl2aXR5X1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBkZWZfc3RhdGVfYWN0aXZpdHkgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgc2VjdGlvbl9oZWFkZXJfaW1wb3J0X3BhcmFtZXRlcl9wcm9wZXJ0eQorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjUyNjoxOiBzZWN0aW9uX2hlYWRlcl9pbXBvcnRfcGFyYW1ldGVyX3Byb3BlcnR5WyBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIgXSA6ICggKCBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25faGVhZGVyX3ByZWRpY2F0ICk9PiBzZWN0aW9uX2hlYWRlclsgY29udGFpbmVyIF0gKCBzZWN0aW9uX2ltcG9ydFsgY29udGFpbmVyIF0gKT8gKCBzZWN0aW9uX3BhcmFtZXRlclsgY29udGFpbmVyIF0gKT8gKCBzZWN0aW9uX3Byb3BlcnR5WyBjb250YWluZXIgXSApKiB8ICggZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX2ltcG9ydF9wcmVkaWNhdCApPT4gc2VjdGlvbl9pbXBvcnRbIGNvbnRhaW5lciBdICggc2VjdGlvbl9wYXJhbWV0ZXJbIGNvbnRhaW5lciBdICk/ICggc2VjdGlvbl9wcm9wZXJ0eVsgY29udGFpbmVyIF0gKSogfCAoIGRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wYXJhbWV0ZXJfcHJlZGljYXQgKT0+IHNlY3Rpb25fcGFyYW1ldGVyWyBjb250YWluZXIgXSAoIHNlY3Rpb25fcHJvcGVydHlbIGNvbnRhaW5lciBdICkqIHwgKCBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJvcGVydHlfcHJlZGljYXQgKT0+ICggc2VjdGlvbl9wcm9wZXJ0eVsgY29udGFpbmVyIF0gKSsgfCBzZWN0aW9uX3Byb3BlcnR5X2ZyZWVfZGVjbGFyYXRpb25bIGNvbnRhaW5lciBdICk7CisgKi8KK3N0YXRpYyB2b2lkCitzZWN0aW9uX2hlYWRlcl9pbXBvcnRfcGFyYW1ldGVyX3Byb3BlcnR5KHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIpCit7CisgICAgQU5UTFIzX1VJTlQzMiBzZWN0aW9uX2hlYWRlcl9pbXBvcnRfcGFyYW1ldGVyX3Byb3BlcnR5X1N0YXJ0SW5kZXg7CisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgc2VjdGlvbl9oZWFkZXJfaW1wb3J0X3BhcmFtZXRlcl9wcm9wZXJ0eV9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSg4NykpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI1Mjg6MjogKCAoIGRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9oZWFkZXJfcHJlZGljYXQgKT0+IHNlY3Rpb25faGVhZGVyWyBjb250YWluZXIgXSAoIHNlY3Rpb25faW1wb3J0WyBjb250YWluZXIgXSApPyAoIHNlY3Rpb25fcGFyYW1ldGVyWyBjb250YWluZXIgXSApPyAoIHNlY3Rpb25fcHJvcGVydHlbIGNvbnRhaW5lciBdICkqIHwgKCBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25faW1wb3J0X3ByZWRpY2F0ICk9PiBzZWN0aW9uX2ltcG9ydFsgY29udGFpbmVyIF0gKCBzZWN0aW9uX3BhcmFtZXRlclsgY29udGFpbmVyIF0gKT8gKCBzZWN0aW9uX3Byb3BlcnR5WyBjb250YWluZXIgXSApKiB8ICggZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3BhcmFtZXRlcl9wcmVkaWNhdCApPT4gc2VjdGlvbl9wYXJhbWV0ZXJbIGNvbnRhaW5lciBdICggc2VjdGlvbl9wcm9wZXJ0eVsgY29udGFpbmVyIF0gKSogfCAoIGRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcm9wZXJ0eV9wcmVkaWNhdCApPT4gKCBzZWN0aW9uX3Byb3BlcnR5WyBjb250YWluZXIgXSApKyB8IHNlY3Rpb25fcHJvcGVydHlfZnJlZV9kZWNsYXJhdGlvblsgY29udGFpbmVyIF0gKQorCisgICAgICAgICAgICBBTlRMUjNfVUlOVDMyIGFsdDIxMTsKKworICAgICAgICAgICAgYWx0MjExPTU7CisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgTEEyMTFfMCA9IExBKDEpOworICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQzNjZfZm1sKGN0eCkpICYmIChMQTIxMV8wID09IDE4OCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhbHQyMTE9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMzcwX2ZtbChjdHgpKSAmJiAoTEEyMTFfMCA9PSAxOTIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MjExPTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDM3M19mbWwoY3R4KSkgJiYgKCgoTEEyMTFfMCA+PSAyMDkpICYmIChMQTIxMV8wIDw9IDIxMCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFsdDIxMT0zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQzNzNfZm1sKGN0eCkpICYmIChMQTIxMV8wID09IDE5NikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhbHQyMTE9MzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMzczX2ZtbChjdHgpKSAmJiAoTEEyMTFfMCA9PSAxOTUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MjExPTM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDM3M19mbWwoY3R4KSkgJiYgKExBMjExXzAgPT0gMjA3KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFsdDIxMT0zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQzNzNfZm1sKGN0eCkpICYmICgoKExBMjExXzAgPj0gMjE5KSAmJiAoTEEyMTFfMCA8PSAyMjApKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhbHQyMTE9MzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMzc1X2ZtbChjdHgpKSAmJiAoTEEyMTFfMCA9PSAxNzggfHwgTEEyMTFfMCA9PSAyMTMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MjExPTQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDM3NV9mbWwoY3R4KSkgJiYgKExBMjExXzAgPT0gMjE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFsdDIxMT00OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQzNzVfZm1sKGN0eCkpICYmIChMQTIxMV8wID09IDIxNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhbHQyMTE9NDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkMzc1X2ZtbChjdHgpKSAmJiAoTEEyMTFfMCA9PSAyMTEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MjExPTQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMTFfMCA9PSBFT0YgfHwgTEEyMTFfMCA9PSAyNDMgfHwgTEEyMTFfMCA9PSAyNDkgfHwgTEEyMTFfMCA9PSAyNTMgfHwgKChMQTIxMV8wID49IDI1NykgJiYgKExBMjExXzAgPD0gMjU5KSkgfHwgTEEyMTFfMCA9PSAyNjIgfHwgTEEyMTFfMCA9PSAyNzYgfHwgTEEyMTFfMCA9PSAyODIgfHwgTEEyMTFfMCA9PSAyOTggfHwgTEEyMTFfMCA9PSAzMDUgfHwgTEEyMTFfMCA9PSAzMTggfHwgTEEyMTFfMCA9PSAzMjAgfHwgTEEyMTFfMCA9PSAzNDEgfHwgTEEyMTFfMCA9PSAzNDQgfHwgTEEyMTFfMCA9PSAzNDkgfHwgTEEyMTFfMCA9PSAzNTUgfHwgTEEyMTFfMCA9PSAzNjEgfHwgTEEyMTFfMCA9PSAzNjQgfHwgTEEyMTFfMCA9PSAzNzQgfHwgTEEyMTFfMCA9PSAzODAgfHwgTEEyMTFfMCA9PSAzODggfHwgTEEyMTFfMCA9PSAzOTUgfHwgTEEyMTFfMCA9PSAzOTggfHwgTEEyMTFfMCA9PSA0MDQgfHwgTEEyMTFfMCA9PSA0MDYgfHwgKChMQTIxMV8wID49IDQxMCkgJiYgKExBMjExXzAgPD0gNDExKSkgfHwgTEEyMTFfMCA9PSA0MTQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MjExPTU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAyMTE7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgICAgIGdvdG8gcnVsZXNlY3Rpb25faGVhZGVyX2ltcG9ydF9wYXJhbWV0ZXJfcHJvcGVydHlFeDsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MjExKQorICAgICAgICAgICAgeworICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI1Mjg6NDogKCBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25faGVhZGVyX3ByZWRpY2F0ICk9PiBzZWN0aW9uX2hlYWRlclsgY29udGFpbmVyIF0gKCBzZWN0aW9uX2ltcG9ydFsgY29udGFpbmVyIF0gKT8gKCBzZWN0aW9uX3BhcmFtZXRlclsgY29udGFpbmVyIF0gKT8gKCBzZWN0aW9uX3Byb3BlcnR5WyBjb250YWluZXIgXSApKgorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfc2VjdGlvbl9oZWFkZXJfaW5fc2VjdGlvbl9oZWFkZXJfaW1wb3J0X3BhcmFtZXRlcl9wcm9wZXJ0eTczMjUpOworICAgICAgICAJICAgICAgICBzZWN0aW9uX2hlYWRlcihjdHgsIGNvbnRhaW5lcik7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXNlY3Rpb25faGVhZGVyX2ltcG9ydF9wYXJhbWV0ZXJfcHJvcGVydHlFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI1MzE6NDogKCBzZWN0aW9uX2ltcG9ydFsgY29udGFpbmVyIF0gKT8KKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDIwND0yOworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMTkyOgorICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQlhbHQyMDQ9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQyMDQpCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjUzMTo2OiBzZWN0aW9uX2ltcG9ydFsgY29udGFpbmVyIF0KKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3NlY3Rpb25faW1wb3J0X2luX3NlY3Rpb25faGVhZGVyX2ltcG9ydF9wYXJhbWV0ZXJfcHJvcGVydHk3MzM0KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgc2VjdGlvbl9pbXBvcnQoY3R4LCBjb250YWluZXIpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzZWN0aW9uX2hlYWRlcl9pbXBvcnRfcGFyYW1ldGVyX3Byb3BlcnR5RXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjUzMzo0OiAoIHNlY3Rpb25fcGFyYW1ldGVyWyBjb250YWluZXIgXSApPworICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0MjA1PTI7CisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAxOTU6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAxOTY6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAyMDc6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAyMDk6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAyMTA6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAyMTk6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAyMjA6CisgICAgICAgIAkgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJCWFsdDIwNT0xOworICAgICAgICAJICAgICAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDIwNSkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNTMzOjY6IHNlY3Rpb25fcGFyYW1ldGVyWyBjb250YWluZXIgXQorICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfc2VjdGlvbl9wYXJhbWV0ZXJfaW5fc2VjdGlvbl9oZWFkZXJfaW1wb3J0X3BhcmFtZXRlcl9wcm9wZXJ0eTczNDYpOworICAgICAgICAJICAgICAgICAJICAgICAgICBzZWN0aW9uX3BhcmFtZXRlcihjdHgsIGNvbnRhaW5lcik7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXNlY3Rpb25faGVhZGVyX2ltcG9ydF9wYXJhbWV0ZXJfcHJvcGVydHlFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgc2VwOjpUZW1wbGF0ZUZhY3Rvcnk6OmdlblByb3BlcnR5KCBjb250YWluZXIgKTsgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI1Mzg6NDogKCBzZWN0aW9uX3Byb3BlcnR5WyBjb250YWluZXIgXSApKgorCisgICAgICAgIAkgICAgICAgIGZvciAoOzspCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQyMDY9MjsKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMTc4OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAyMTE6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDIxMzoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjE0OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAyMTY6CisgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgCQlhbHQyMDY9MTsKKyAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQyMDYpCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjUzODo2OiBzZWN0aW9uX3Byb3BlcnR5WyBjb250YWluZXIgXQorICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfc2VjdGlvbl9wcm9wZXJ0eV9pbl9zZWN0aW9uX2hlYWRlcl9pbXBvcnRfcGFyYW1ldGVyX3Byb3BlcnR5NzM2OCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHNlY3Rpb25fcHJvcGVydHkoY3R4LCBjb250YWluZXIpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzZWN0aW9uX2hlYWRlcl9pbXBvcnRfcGFyYW1ldGVyX3Byb3BlcnR5RXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAJZGVmYXVsdDoKKyAgICAgICAgCSAgICAgICAgCSAgICBnb3RvIGxvb3AyMDY7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGxvb3AyMDY6IDsgLyogSnVtcCBvdXQgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAyOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI1NDA6NDogKCBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25faW1wb3J0X3ByZWRpY2F0ICk9PiBzZWN0aW9uX2ltcG9ydFsgY29udGFpbmVyIF0gKCBzZWN0aW9uX3BhcmFtZXRlclsgY29udGFpbmVyIF0gKT8gKCBzZWN0aW9uX3Byb3BlcnR5WyBjb250YWluZXIgXSApKgorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfc2VjdGlvbl9pbXBvcnRfaW5fc2VjdGlvbl9oZWFkZXJfaW1wb3J0X3BhcmFtZXRlcl9wcm9wZXJ0eTczODkpOworICAgICAgICAJICAgICAgICBzZWN0aW9uX2ltcG9ydChjdHgsIGNvbnRhaW5lcik7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXNlY3Rpb25faGVhZGVyX2ltcG9ydF9wYXJhbWV0ZXJfcHJvcGVydHlFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI1NDM6NDogKCBzZWN0aW9uX3BhcmFtZXRlclsgY29udGFpbmVyIF0gKT8KKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDIwNz0yOworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMTk1OgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMTk2OgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMjA3OgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMjA5OgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMjEwOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMjE5OgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMjIwOgorICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQlhbHQyMDc9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQyMDcpCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjU0Mzo2OiBzZWN0aW9uX3BhcmFtZXRlclsgY29udGFpbmVyIF0KKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3NlY3Rpb25fcGFyYW1ldGVyX2luX3NlY3Rpb25faGVhZGVyX2ltcG9ydF9wYXJhbWV0ZXJfcHJvcGVydHk3Mzk4KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgc2VjdGlvbl9wYXJhbWV0ZXIoY3R4LCBjb250YWluZXIpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzZWN0aW9uX2hlYWRlcl9pbXBvcnRfcGFyYW1ldGVyX3Byb3BlcnR5RXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgIHNlcDo6VGVtcGxhdGVGYWN0b3J5OjpnZW5Qcm9wZXJ0eSggY29udGFpbmVyICk7IAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNTQ4OjQ6ICggc2VjdGlvbl9wcm9wZXJ0eVsgY29udGFpbmVyIF0gKSoKKworICAgICAgICAJICAgICAgICBmb3IgKDs7KQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0MjA4PTI7CisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDE3ODoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjExOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAyMTM6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDIxNDoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjE2OgorICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgIAkJYWx0MjA4PTE7CisgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0MjA4KQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI1NDg6Njogc2VjdGlvbl9wcm9wZXJ0eVsgY29udGFpbmVyIF0KKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3NlY3Rpb25fcHJvcGVydHlfaW5fc2VjdGlvbl9oZWFkZXJfaW1wb3J0X3BhcmFtZXRlcl9wcm9wZXJ0eTc0MjApOworICAgICAgICAJICAgICAgICAJICAgICAgICBzZWN0aW9uX3Byb3BlcnR5KGN0eCwgY29udGFpbmVyKTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc2VjdGlvbl9oZWFkZXJfaW1wb3J0X3BhcmFtZXRlcl9wcm9wZXJ0eUV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgCWRlZmF1bHQ6CisgICAgICAgIAkgICAgICAgIAkgICAgZ290byBsb29wMjA4OwkvKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgKi8KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBsb29wMjA4OiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMzoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNTUwOjQ6ICggZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3BhcmFtZXRlcl9wcmVkaWNhdCApPT4gc2VjdGlvbl9wYXJhbWV0ZXJbIGNvbnRhaW5lciBdICggc2VjdGlvbl9wcm9wZXJ0eVsgY29udGFpbmVyIF0gKSoKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3NlY3Rpb25fcGFyYW1ldGVyX2luX3NlY3Rpb25faGVhZGVyX2ltcG9ydF9wYXJhbWV0ZXJfcHJvcGVydHk3NDQxKTsKKyAgICAgICAgCSAgICAgICAgc2VjdGlvbl9wYXJhbWV0ZXIoY3R4LCBjb250YWluZXIpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzZWN0aW9uX2hlYWRlcl9pbXBvcnRfcGFyYW1ldGVyX3Byb3BlcnR5RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgc2VwOjpUZW1wbGF0ZUZhY3Rvcnk6OmdlblByb3BlcnR5KCBjb250YWluZXIgKTsgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI1NTY6NDogKCBzZWN0aW9uX3Byb3BlcnR5WyBjb250YWluZXIgXSApKgorCisgICAgICAgIAkgICAgICAgIGZvciAoOzspCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQyMDk9MjsKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMTc4OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAyMTE6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDIxMzoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjE0OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAyMTY6CisgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgCQlhbHQyMDk9MTsKKyAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQyMDkpCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjU1Njo2OiBzZWN0aW9uX3Byb3BlcnR5WyBjb250YWluZXIgXQorICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfc2VjdGlvbl9wcm9wZXJ0eV9pbl9zZWN0aW9uX2hlYWRlcl9pbXBvcnRfcGFyYW1ldGVyX3Byb3BlcnR5NzQ2MCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHNlY3Rpb25fcHJvcGVydHkoY3R4LCBjb250YWluZXIpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzZWN0aW9uX2hlYWRlcl9pbXBvcnRfcGFyYW1ldGVyX3Byb3BlcnR5RXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAJZGVmYXVsdDoKKyAgICAgICAgCSAgICAgICAgCSAgICBnb3RvIGxvb3AyMDk7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGxvb3AyMDk6IDsgLyogSnVtcCBvdXQgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA0OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI1NTg6NDogKCBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJvcGVydHlfcHJlZGljYXQgKT0+ICggc2VjdGlvbl9wcm9wZXJ0eVsgY29udGFpbmVyIF0gKSsKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICBzZXA6OlRlbXBsYXRlRmFjdG9yeTo6Z2VuUHJvcGVydHkoIGNvbnRhaW5lciApOyAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjU2Mjo0OiAoIHNlY3Rpb25fcHJvcGVydHlbIGNvbnRhaW5lciBdICkrCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGludCBjbnQyMTA9MDsKKworICAgICAgICAJICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBpbnQgYWx0MjEwPTI7CisgICAgICAgIAkgICAgICAgIAlzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAkgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgIAljYXNlIDE3ODoKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMjExOgorICAgICAgICAJICAgICAgICAJY2FzZSAyMTM6CisgICAgICAgIAkgICAgICAgIAljYXNlIDIxNDoKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMjE2OgorICAgICAgICAJICAgICAgICAJCXsKKyAgICAgICAgCSAgICAgICAgCQkJYWx0MjEwPTE7CisgICAgICAgIAkgICAgICAgIAkJfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgIAl9CisKKyAgICAgICAgCSAgICAgICAgCXN3aXRjaCAoYWx0MjEwKQorICAgICAgICAJICAgICAgICAJeworICAgICAgICAJICAgICAgICAJICAgIGNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjU2Mjo2OiBzZWN0aW9uX3Byb3BlcnR5WyBjb250YWluZXIgXQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19zZWN0aW9uX3Byb3BlcnR5X2luX3NlY3Rpb25faGVhZGVyX2ltcG9ydF9wYXJhbWV0ZXJfcHJvcGVydHk3NDkzKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHNlY3Rpb25fcHJvcGVydHkoY3R4LCBjb250YWluZXIpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlc2VjdGlvbl9oZWFkZXJfaW1wb3J0X3BhcmFtZXRlcl9wcm9wZXJ0eUV4OworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgIAkgICAgZGVmYXVsdDoKKworICAgICAgICAJICAgICAgICAJCWlmICggY250MjEwID49IDEgKQorICAgICAgICAJICAgICAgICAJCXsKKyAgICAgICAgCSAgICAgICAgCQkgICAgZ290byBsb29wMjEwOworICAgICAgICAJICAgICAgICAJCX0KKyAgICAgICAgCSAgICAgICAgCQlpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgIAkgICAgICAgIAkJeworICAgICAgICAJICAgICAgICAJCSAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkgICAgICAgIAkJICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkJfQorCisgICAgICAgIAkgICAgICAgIAkJLyogbWlzbWF0Y2hlZFNldEV4KCkKKyAgICAgICAgCSAgICAgICAgCQkgKi8KKyAgICAgICAgCSAgICAgICAgCQlDT05TVFJVQ1RFWCgpOworICAgICAgICAJICAgICAgICAJCUVYQ0VQVElPTi0+dHlwZSA9IEFOVExSM19FQVJMWV9FWElUX0VYQ0VQVElPTjsKKyAgICAgICAgCSAgICAgICAgCQlFWENFUFRJT04tPm5hbWUgPSAodm9pZCAqKUFOVExSM19FQVJMWV9FWElUX05BTUU7CisKKworICAgICAgICAJICAgICAgICAJCWdvdG8gcnVsZXNlY3Rpb25faGVhZGVyX2ltcG9ydF9wYXJhbWV0ZXJfcHJvcGVydHlFeDsKKyAgICAgICAgCSAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgCWNudDIxMCsrOworICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgbG9vcDIxMDogOwkvKiBKdW1wIHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgNToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNTY0OjQ6IHNlY3Rpb25fcHJvcGVydHlfZnJlZV9kZWNsYXJhdGlvblsgY29udGFpbmVyIF0KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICBzZXA6OlRlbXBsYXRlRmFjdG9yeTo6Z2VuUHJvcGVydHkoIGNvbnRhaW5lciApOyAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfc2VjdGlvbl9wcm9wZXJ0eV9mcmVlX2RlY2xhcmF0aW9uX2luX3NlY3Rpb25faGVhZGVyX2ltcG9ydF9wYXJhbWV0ZXJfcHJvcGVydHk3NTA4KTsKKyAgICAgICAgCSAgICAgICAgc2VjdGlvbl9wcm9wZXJ0eV9mcmVlX2RlY2xhcmF0aW9uKGN0eCwgY29udGFpbmVyKTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc2VjdGlvbl9oZWFkZXJfaW1wb3J0X3BhcmFtZXRlcl9wcm9wZXJ0eUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZXNlY3Rpb25faGVhZGVyX2ltcG9ydF9wYXJhbWV0ZXJfcHJvcGVydHlFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVzZWN0aW9uX2hlYWRlcl9pbXBvcnRfcGFyYW1ldGVyX3Byb3BlcnR5RXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSg4Nywgc2VjdGlvbl9oZWFkZXJfaW1wb3J0X3BhcmFtZXRlcl9wcm9wZXJ0eV9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgc2VjdGlvbl9oZWFkZXJfaW1wb3J0X3BhcmFtZXRlcl9wcm9wZXJ0eSAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBzZWN0aW9uX3BhcmFtZXRlcgorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjU3NDoxOiBzZWN0aW9uX3BhcmFtZXRlclsgc2VwOjpNYWNoaW5lICogY29udGFpbmVyIF0gOiAoICggJ0BwYXJhbWV0ZXI6JyB8ICdAcGFyYW06JyApICggcHJvcGVydHlfZGVjbGFyYXRpb25bIGRlY2xQcm9wZXJ0eSAsXG5cdCBcdFx0XHRzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9JTlBVVF9QQVJBTUVURVJfTU9ESUZJRVIgXSApKiB8ICdAaW5wdXQ6JyAoIHByb3BlcnR5X2RlY2xhcmF0aW9uWyBkZWNsUHJvcGVydHkgLFxuXHRcdFx0XHRzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9JTlBVVF9QQVJBTUVURVJfTU9ESUZJRVIgXSApKiB8ICdAaW5vdXQ6JyAoIHByb3BlcnR5X2RlY2xhcmF0aW9uWyBkZWNsUHJvcGVydHkgLFxuXHRcdFx0XHRzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9JTk9VVF9QQVJBTUVURVJfTU9ESUZJRVIgXSApKiB8ICdAb3V0cHV0OicgKCBwcm9wZXJ0eV9kZWNsYXJhdGlvblsgZGVjbFByb3BlcnR5ICxcblx0XHRcdFx0c2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfT1VUUFVUX1BBUkFNRVRFUl9NT0RJRklFUiBdICkqIHwgKCAnQHJldHVybnM6JyB8ICdAcmV0dXJuOicgKSAoIHByb3BlcnR5X2RlY2xhcmF0aW9uWyBkZWNsUHJvcGVydHkgLFxuXHQgXHRcdFx0c2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfUkVUVVJOX1BBUkFNRVRFUl9NT0RJRklFUiBdICkqICk7CisgKi8KK3N0YXRpYyB2b2lkCitzZWN0aW9uX3BhcmFtZXRlcihwZm1sUGFyc2VyIGN0eCwgc2VwOjpNYWNoaW5lICogY29udGFpbmVyKQoreworICAgIEFOVExSM19VSU5UMzIgc2VjdGlvbl9wYXJhbWV0ZXJfU3RhcnRJbmRleDsKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBzZWN0aW9uX3BhcmFtZXRlcl9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisKKyAgICAJc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHkgPSBjb250YWluZXItPmdldFByb3BlcnR5UGFydCgpOworCisgICAgCVNBVkVfUlVMRV9CRUdJTl9MT0NBVElPTjsKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoODgpKSApCisgICAgeworICAgICAgICB7CisKKyAgICAgICAgICAgIAlTRVRfUlVMRV9MT0NBVElPTihkZWNsUHJvcGVydHkpOworCisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgeworICAgICAgICB7CisgICAgICAgICAgICAvLyAgL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjU4MzoyOiAoICggJ0BwYXJhbWV0ZXI6JyB8ICdAcGFyYW06JyApICggcHJvcGVydHlfZGVjbGFyYXRpb25bIGRlY2xQcm9wZXJ0eSAsXG5cdCBcdFx0XHRzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9JTlBVVF9QQVJBTUVURVJfTU9ESUZJRVIgXSApKiB8ICdAaW5wdXQ6JyAoIHByb3BlcnR5X2RlY2xhcmF0aW9uWyBkZWNsUHJvcGVydHkgLFxuXHRcdFx0XHRzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9JTlBVVF9QQVJBTUVURVJfTU9ESUZJRVIgXSApKiB8ICdAaW5vdXQ6JyAoIHByb3BlcnR5X2RlY2xhcmF0aW9uWyBkZWNsUHJvcGVydHkgLFxuXHRcdFx0XHRzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9JTk9VVF9QQVJBTUVURVJfTU9ESUZJRVIgXSApKiB8ICdAb3V0cHV0OicgKCBwcm9wZXJ0eV9kZWNsYXJhdGlvblsgZGVjbFByb3BlcnR5ICxcblx0XHRcdFx0c2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfT1VUUFVUX1BBUkFNRVRFUl9NT0RJRklFUiBdICkqIHwgKCAnQHJldHVybnM6JyB8ICdAcmV0dXJuOicgKSAoIHByb3BlcnR5X2RlY2xhcmF0aW9uWyBkZWNsUHJvcGVydHkgLFxuXHQgXHRcdFx0c2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfUkVUVVJOX1BBUkFNRVRFUl9NT0RJRklFUiBdICkqICkKKworICAgICAgICAgICAgQU5UTFIzX1VJTlQzMiBhbHQyMTc7CisKKyAgICAgICAgICAgIGFsdDIxNz01OworCisgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDIwOToKKyAgICAgICAgICAgIGNhc2UgMjEwOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MjE3PTE7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOTY6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQyMTc9MjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE5NToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDIxNz0zOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjA3OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MjE3PTQ7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMTk6CisgICAgICAgICAgICBjYXNlIDIyMDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDIxNz01OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAyMTc7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVzZWN0aW9uX3BhcmFtZXRlckV4OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MjE3KQorICAgICAgICAgICAgeworICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI1ODM6NDogKCAnQHBhcmFtZXRlcjonIHwgJ0BwYXJhbTonICkgKCBwcm9wZXJ0eV9kZWNsYXJhdGlvblsgZGVjbFByb3BlcnR5ICxcblx0IFx0XHRcdHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX0lOUFVUX1BBUkFNRVRFUl9NT0RJRklFUiBdICkqCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBpZiAoICgoTEEoMSkgPj0gMjA5KSAmJiAoTEEoMSkgPD0gMjEwKSkgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBDT05TVU1FKCk7CisgICAgICAgIAkgICAgICAgICAgICBQRVJST1JSRUNPVkVSWT1BTlRMUjNfRkFMU0U7CisgICAgICAgIAkgICAgICAgICAgICBGQUlMRURGTEFHPUFOVExSM19GQUxTRTsKKworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGVsc2UKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfRVhDRVBUSU9OOworICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT5uYW1lICAgICAgICAgPSAodm9pZCAqKUFOVExSM19NSVNNQVRDSEVEX1NFVF9OQU1FOworICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT5leHBlY3RpbmdTZXQgPSBOVUxMOworCisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzZWN0aW9uX3BhcmFtZXRlckV4OworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNTg0OjQ6ICggcHJvcGVydHlfZGVjbGFyYXRpb25bIGRlY2xQcm9wZXJ0eSAsXG5cdCBcdFx0XHRzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9JTlBVVF9QQVJBTUVURVJfTU9ESUZJRVIgXSApKgorCisgICAgICAgIAkgICAgICAgIGZvciAoOzspCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQyMTI9MjsKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjQzOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAyNDk6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI1MzoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjU3OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAyNTg6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI1OToKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjYyOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAyNzY6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI4MjoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjk4OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzMDU6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMxODoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzIwOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzNDE6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM0NDoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzQ5OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzNTU6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM2MToKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzY0OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzNzQ6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM4MDoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzg4OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzOTU6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM5ODoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgNDA0OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSA0MDY6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDQxMDoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgNDExOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSA0MTQ6CisgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgCQlhbHQyMTI9MTsKKyAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQyMTIpCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjU4NDo2OiBwcm9wZXJ0eV9kZWNsYXJhdGlvblsgZGVjbFByb3BlcnR5ICxcblx0IFx0XHRcdHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX0lOUFVUX1BBUkFNRVRFUl9NT0RJRklFUiBdCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19wcm9wZXJ0eV9kZWNsYXJhdGlvbl9pbl9zZWN0aW9uX3BhcmFtZXRlcjc1NTMpOworICAgICAgICAJICAgICAgICAJICAgICAgICBwcm9wZXJ0eV9kZWNsYXJhdGlvbihjdHgsIGRlY2xQcm9wZXJ0eSwgc2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfSU5QVVRfUEFSQU1FVEVSX01PRElGSUVSKTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc2VjdGlvbl9wYXJhbWV0ZXJFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAJICAgICAgICAJICAgIGdvdG8gbG9vcDIxMjsJLyogYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgbG9vcDIxMjogOyAvKiBKdW1wIG91dCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDI6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjU4ODo0OiAnQGlucHV0OicgKCBwcm9wZXJ0eV9kZWNsYXJhdGlvblsgZGVjbFByb3BlcnR5ICxcblx0XHRcdFx0c2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfSU5QVVRfUEFSQU1FVEVSX01PRElGSUVSIF0gKSoKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMTk2LCAmRk9MTE9XXzE5Nl9pbl9zZWN0aW9uX3BhcmFtZXRlcjc1NjYpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzZWN0aW9uX3BhcmFtZXRlckV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjU4ODoxNTogKCBwcm9wZXJ0eV9kZWNsYXJhdGlvblsgZGVjbFByb3BlcnR5ICxcblx0XHRcdFx0c2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfSU5QVVRfUEFSQU1FVEVSX01PRElGSUVSIF0gKSoKKworICAgICAgICAJICAgICAgICBmb3IgKDs7KQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0MjEzPTI7CisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI0MzoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjQ5OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAyNTM6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI1NzoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjU4OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAyNTk6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI2MjoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjc2OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAyODI6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI5ODoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzA1OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzMTg6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMyMDoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzQxOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzNDQ6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM0OToKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzU1OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzNjE6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM2NDoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzc0OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzODA6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM4ODoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzk1OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzOTg6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDQwNDoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgNDA2OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSA0MTA6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDQxMToKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgNDE0OgorICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgIAkJYWx0MjEzPTE7CisgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0MjEzKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI1ODg6MTc6IHByb3BlcnR5X2RlY2xhcmF0aW9uWyBkZWNsUHJvcGVydHkgLFxuXHRcdFx0XHRzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9JTlBVVF9QQVJBTUVURVJfTU9ESUZJRVIgXQorICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfcHJvcGVydHlfZGVjbGFyYXRpb25faW5fc2VjdGlvbl9wYXJhbWV0ZXI3NTcxKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgcHJvcGVydHlfZGVjbGFyYXRpb24oY3R4LCBkZWNsUHJvcGVydHksIHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX0lOUFVUX1BBUkFNRVRFUl9NT0RJRklFUik7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXNlY3Rpb25fcGFyYW1ldGVyRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAJZGVmYXVsdDoKKyAgICAgICAgCSAgICAgICAgCSAgICBnb3RvIGxvb3AyMTM7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGxvb3AyMTM6IDsgLyogSnVtcCBvdXQgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAzOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI1OTI6NDogJ0Bpbm91dDonICggcHJvcGVydHlfZGVjbGFyYXRpb25bIGRlY2xQcm9wZXJ0eSAsXG5cdFx0XHRcdHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX0lOT1VUX1BBUkFNRVRFUl9NT0RJRklFUiBdICkqCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDE5NSwgJkZPTExPV18xOTVfaW5fc2VjdGlvbl9wYXJhbWV0ZXI3NTg0KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc2VjdGlvbl9wYXJhbWV0ZXJFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI1OTI6MTU6ICggcHJvcGVydHlfZGVjbGFyYXRpb25bIGRlY2xQcm9wZXJ0eSAsXG5cdFx0XHRcdHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX0lOT1VUX1BBUkFNRVRFUl9NT0RJRklFUiBdICkqCisKKyAgICAgICAgCSAgICAgICAgZm9yICg7OykKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDIxND0yOworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgY2FzZSAyNDM6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI0OToKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjUzOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAyNTc6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI1ODoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjU5OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAyNjI6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI3NjoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjgyOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAyOTg6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMwNToKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzE4OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzMjA6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM0MToKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzQ0OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzNDk6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM1NToKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzYxOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzNjQ6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM3NDoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzgwOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzODg6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM5NToKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzk4OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSA0MDQ6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDQwNjoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgNDEwOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSA0MTE6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDQxNDoKKyAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAJCWFsdDIxND0xOworICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDIxNCkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNTkyOjE3OiBwcm9wZXJ0eV9kZWNsYXJhdGlvblsgZGVjbFByb3BlcnR5ICxcblx0XHRcdFx0c2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfSU5PVVRfUEFSQU1FVEVSX01PRElGSUVSIF0KKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3Byb3BlcnR5X2RlY2xhcmF0aW9uX2luX3NlY3Rpb25fcGFyYW1ldGVyNzU4OSk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHByb3BlcnR5X2RlY2xhcmF0aW9uKGN0eCwgZGVjbFByb3BlcnR5LCBzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9JTk9VVF9QQVJBTUVURVJfTU9ESUZJRVIpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzZWN0aW9uX3BhcmFtZXRlckV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgCWRlZmF1bHQ6CisgICAgICAgIAkgICAgICAgIAkgICAgZ290byBsb29wMjE0OwkvKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgKi8KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBsb29wMjE0OiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgNDoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNTk2OjQ6ICdAb3V0cHV0OicgKCBwcm9wZXJ0eV9kZWNsYXJhdGlvblsgZGVjbFByb3BlcnR5ICxcblx0XHRcdFx0c2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfT1VUUFVUX1BBUkFNRVRFUl9NT0RJRklFUiBdICkqCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDIwNywgJkZPTExPV18yMDdfaW5fc2VjdGlvbl9wYXJhbWV0ZXI3NjAyKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc2VjdGlvbl9wYXJhbWV0ZXJFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI1OTY6MTU6ICggcHJvcGVydHlfZGVjbGFyYXRpb25bIGRlY2xQcm9wZXJ0eSAsXG5cdFx0XHRcdHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX09VVFBVVF9QQVJBTUVURVJfTU9ESUZJRVIgXSApKgorCisgICAgICAgIAkgICAgICAgIGZvciAoOzspCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQyMTU9MjsKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjQzOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAyNDk6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI1MzoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjU3OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAyNTg6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI1OToKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjYyOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAyNzY6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI4MjoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjk4OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzMDU6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMxODoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzIwOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzNDE6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM0NDoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzQ5OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzNTU6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM2MToKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzY0OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzNzQ6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM4MDoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzg4OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzOTU6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM5ODoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgNDA0OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSA0MDY6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDQxMDoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgNDExOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSA0MTQ6CisgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgCQlhbHQyMTU9MTsKKyAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQyMTUpCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjU5NjoxNzogcHJvcGVydHlfZGVjbGFyYXRpb25bIGRlY2xQcm9wZXJ0eSAsXG5cdFx0XHRcdHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX09VVFBVVF9QQVJBTUVURVJfTU9ESUZJRVIgXQorICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfcHJvcGVydHlfZGVjbGFyYXRpb25faW5fc2VjdGlvbl9wYXJhbWV0ZXI3NjA2KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgcHJvcGVydHlfZGVjbGFyYXRpb24oY3R4LCBkZWNsUHJvcGVydHksIHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX09VVFBVVF9QQVJBTUVURVJfTU9ESUZJRVIpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzZWN0aW9uX3BhcmFtZXRlckV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgCWRlZmF1bHQ6CisgICAgICAgIAkgICAgICAgIAkgICAgZ290byBsb29wMjE1OwkvKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgKi8KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBsb29wMjE1OiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgNToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNjAwOjQ6ICggJ0ByZXR1cm5zOicgfCAnQHJldHVybjonICkgKCBwcm9wZXJ0eV9kZWNsYXJhdGlvblsgZGVjbFByb3BlcnR5ICxcblx0IFx0XHRcdHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX1JFVFVSTl9QQVJBTUVURVJfTU9ESUZJRVIgXSApKgorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgaWYgKCAoKExBKDEpID49IDIxOSkgJiYgKExBKDEpIDw9IDIyMCkpICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgQ09OU1VNRSgpOworICAgICAgICAJICAgICAgICAgICAgUEVSUk9SUkVDT1ZFUlk9QU5UTFIzX0ZBTFNFOworICAgICAgICAJICAgICAgICAgICAgRkFJTEVERkxBRz1BTlRMUjNfRkFMU0U7CisKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBlbHNlCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX01JU01BVENIRURfU0VUX0VYQ0VQVElPTjsKKyAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+bmFtZSAgICAgICAgID0gKHZvaWQgKilBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfTkFNRTsKKyAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+ZXhwZWN0aW5nU2V0ID0gTlVMTDsKKworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc2VjdGlvbl9wYXJhbWV0ZXJFeDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjYwMTo0OiAoIHByb3BlcnR5X2RlY2xhcmF0aW9uWyBkZWNsUHJvcGVydHkgLFxuXHQgXHRcdFx0c2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfUkVUVVJOX1BBUkFNRVRFUl9NT0RJRklFUiBdICkqCisKKyAgICAgICAgCSAgICAgICAgZm9yICg7OykKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDIxNj0yOworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgY2FzZSAyNDM6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI0OToKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjUzOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAyNTc6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI1ODoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjU5OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAyNjI6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI3NjoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjgyOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAyOTg6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMwNToKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzE4OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzMjA6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM0MToKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzQ0OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzNDk6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM1NToKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzYxOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzNjQ6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM3NDoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzgwOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzODg6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM5NToKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzk4OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSA0MDQ6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDQwNjoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgNDEwOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSA0MTE6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDQxNDoKKyAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAJCWFsdDIxNj0xOworICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDIxNikKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNjAxOjY6IHByb3BlcnR5X2RlY2xhcmF0aW9uWyBkZWNsUHJvcGVydHkgLFxuXHQgXHRcdFx0c2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfUkVUVVJOX1BBUkFNRVRFUl9NT0RJRklFUiBdCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19wcm9wZXJ0eV9kZWNsYXJhdGlvbl9pbl9zZWN0aW9uX3BhcmFtZXRlcjc2MzYpOworICAgICAgICAJICAgICAgICAJICAgICAgICBwcm9wZXJ0eV9kZWNsYXJhdGlvbihjdHgsIGRlY2xQcm9wZXJ0eSwgc2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfUkVUVVJOX1BBUkFNRVRFUl9NT0RJRklFUik7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXNlY3Rpb25fcGFyYW1ldGVyRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAJZGVmYXVsdDoKKyAgICAgICAgCSAgICAgICAgCSAgICBnb3RvIGxvb3AyMTY7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGxvb3AyMTY6IDsgLyogSnVtcCBvdXQgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVzZWN0aW9uX3BhcmFtZXRlckV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZXNlY3Rpb25fcGFyYW1ldGVyRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIAlTRVRfUlVMRV9MT0NBVElPTihkZWNsUHJvcGVydHkpOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisKKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDg4LCBzZWN0aW9uX3BhcmFtZXRlcl9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgc2VjdGlvbl9wYXJhbWV0ZXIgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgc2VjdGlvbl9wcm9wZXJ0eQorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjYxMToxOiBzZWN0aW9uX3Byb3BlcnR5WyBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIgXSA6ICggKCAnQHByb3BlcnR5OicgfCAnQGRlY2xhcmF0aW9uOicgKSAoIHByb3BlcnR5X2RlY2xhcmF0aW9uWyBkZWNsUHJvcGVydHkgLFxuXHQgXHRcdFx0c2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfVU5ERUZJTkVEX01PRElGSUVSIF0gKSogfCAnQHB1YmxpYzonICggcHJvcGVydHlfZGVjbGFyYXRpb25bIGRlY2xQcm9wZXJ0eSAsXG5cdCBcdFx0XHRzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9QVUJMSUNfTU9ESUZJRVIgXSApKiB8ICdAcHJvdGVjdGVkOicgKCBwcm9wZXJ0eV9kZWNsYXJhdGlvblsgZGVjbFByb3BlcnR5ICxcblx0IFx0XHRcdHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX1BST1RFQ1RFRF9NT0RJRklFUiBdICkqIHwgJ0Bwcml2YXRlOicgKCBwcm9wZXJ0eV9kZWNsYXJhdGlvblsgZGVjbFByb3BlcnR5ICxcblx0IFx0XHRcdHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX1BSSVZBVEVfTU9ESUZJRVIgXSApKiApOworICovCitzdGF0aWMgdm9pZAorc2VjdGlvbl9wcm9wZXJ0eShwZm1sUGFyc2VyIGN0eCwgc2VwOjpNYWNoaW5lICogY29udGFpbmVyKQoreworICAgIEFOVExSM19VSU5UMzIgc2VjdGlvbl9wcm9wZXJ0eV9TdGFydEluZGV4OworCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIHNlY3Rpb25fcHJvcGVydHlfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworCisgICAgCXNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5ID0gY29udGFpbmVyLT5nZXRQcm9wZXJ0eVBhcnQoKTsKKworICAgIAlTQVZFX1JVTEVfQkVHSU5fTE9DQVRJT047CisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDg5KSkgKQorICAgIHsKKyAgICAgICAgeworCisgICAgICAgICAgICAJU0VUX1JVTEVfTE9DQVRJT04oZGVjbFByb3BlcnR5KTsKKworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI2MjA6MjogKCAoICdAcHJvcGVydHk6JyB8ICdAZGVjbGFyYXRpb246JyApICggcHJvcGVydHlfZGVjbGFyYXRpb25bIGRlY2xQcm9wZXJ0eSAsXG5cdCBcdFx0XHRzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9VTkRFRklORURfTU9ESUZJRVIgXSApKiB8ICdAcHVibGljOicgKCBwcm9wZXJ0eV9kZWNsYXJhdGlvblsgZGVjbFByb3BlcnR5ICxcblx0IFx0XHRcdHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX1BVQkxJQ19NT0RJRklFUiBdICkqIHwgJ0Bwcm90ZWN0ZWQ6JyAoIHByb3BlcnR5X2RlY2xhcmF0aW9uWyBkZWNsUHJvcGVydHkgLFxuXHQgXHRcdFx0c2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfUFJPVEVDVEVEX01PRElGSUVSIF0gKSogfCAnQHByaXZhdGU6JyAoIHByb3BlcnR5X2RlY2xhcmF0aW9uWyBkZWNsUHJvcGVydHkgLFxuXHQgXHRcdFx0c2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfUFJJVkFURV9NT0RJRklFUiBdICkqICkKKworICAgICAgICAgICAgQU5UTFIzX1VJTlQzMiBhbHQyMjI7CisKKyAgICAgICAgICAgIGFsdDIyMj00OworCisgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDE3ODoKKyAgICAgICAgICAgIGNhc2UgMjEzOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MjIyPTE7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMTY6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQyMjI9MjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIxNDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDIyMj0zOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjExOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MjIyPTQ7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDIyMjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXNlY3Rpb25fcHJvcGVydHlFeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDIyMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNjIwOjQ6ICggJ0Bwcm9wZXJ0eTonIHwgJ0BkZWNsYXJhdGlvbjonICkgKCBwcm9wZXJ0eV9kZWNsYXJhdGlvblsgZGVjbFByb3BlcnR5ICxcblx0IFx0XHRcdHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX1VOREVGSU5FRF9NT0RJRklFUiBdICkqCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBpZiAoIExBKDEpID09IDE3OCB8fCBMQSgxKSA9PSAyMTMgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBDT05TVU1FKCk7CisgICAgICAgIAkgICAgICAgICAgICBQRVJST1JSRUNPVkVSWT1BTlRMUjNfRkFMU0U7CisgICAgICAgIAkgICAgICAgICAgICBGQUlMRURGTEFHPUFOVExSM19GQUxTRTsKKworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGVsc2UKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfRVhDRVBUSU9OOworICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT5uYW1lICAgICAgICAgPSAodm9pZCAqKUFOVExSM19NSVNNQVRDSEVEX1NFVF9OQU1FOworICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT5leHBlY3RpbmdTZXQgPSBOVUxMOworCisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzZWN0aW9uX3Byb3BlcnR5RXg7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI2MjE6NDogKCBwcm9wZXJ0eV9kZWNsYXJhdGlvblsgZGVjbFByb3BlcnR5ICxcblx0IFx0XHRcdHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX1VOREVGSU5FRF9NT0RJRklFUiBdICkqCisKKyAgICAgICAgCSAgICAgICAgZm9yICg7OykKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDIxOD0yOworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgY2FzZSAyNDM6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI0OToKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjUzOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAyNTc6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI1ODoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjU5OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAyNjI6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI3NjoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjgyOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAyOTg6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMwNToKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzE4OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzMjA6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM0MToKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzQ0OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzNDk6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM1NToKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzYxOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzNjQ6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM3NDoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzgwOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzODg6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM5NToKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzk4OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSA0MDQ6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDQwNjoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgNDEwOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSA0MTE6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDQxNDoKKyAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAJCWFsdDIxOD0xOworICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDIxOCkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNjIxOjY6IHByb3BlcnR5X2RlY2xhcmF0aW9uWyBkZWNsUHJvcGVydHkgLFxuXHQgXHRcdFx0c2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfVU5ERUZJTkVEX01PRElGSUVSIF0KKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3Byb3BlcnR5X2RlY2xhcmF0aW9uX2luX3NlY3Rpb25fcHJvcGVydHk3Njg2KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgcHJvcGVydHlfZGVjbGFyYXRpb24oY3R4LCBkZWNsUHJvcGVydHksIHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX1VOREVGSU5FRF9NT0RJRklFUik7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXNlY3Rpb25fcHJvcGVydHlFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAJICAgICAgICAJICAgIGdvdG8gbG9vcDIxODsJLyogYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgbG9vcDIxODogOyAvKiBKdW1wIG91dCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDI6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjYyNTo0OiAnQHB1YmxpYzonICggcHJvcGVydHlfZGVjbGFyYXRpb25bIGRlY2xQcm9wZXJ0eSAsXG5cdCBcdFx0XHRzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9QVUJMSUNfTU9ESUZJRVIgXSApKgorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgyMTYsICZGT0xMT1dfMjE2X2luX3NlY3Rpb25fcHJvcGVydHk3Njk5KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc2VjdGlvbl9wcm9wZXJ0eUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjYyNjo0OiAoIHByb3BlcnR5X2RlY2xhcmF0aW9uWyBkZWNsUHJvcGVydHkgLFxuXHQgXHRcdFx0c2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfUFVCTElDX01PRElGSUVSIF0gKSoKKworICAgICAgICAJICAgICAgICBmb3IgKDs7KQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0MjE5PTI7CisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI0MzoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjQ5OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAyNTM6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI1NzoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjU4OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAyNTk6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI2MjoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjc2OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAyODI6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI5ODoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzA1OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzMTg6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMyMDoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzQxOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzNDQ6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM0OToKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzU1OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzNjE6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM2NDoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzc0OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzODA6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM4ODoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzk1OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzOTg6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDQwNDoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgNDA2OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSA0MTA6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDQxMToKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgNDE0OgorICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgIAkJYWx0MjE5PTE7CisgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0MjE5KQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI2MjY6NjogcHJvcGVydHlfZGVjbGFyYXRpb25bIGRlY2xQcm9wZXJ0eSAsXG5cdCBcdFx0XHRzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9QVUJMSUNfTU9ESUZJRVIgXQorICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfcHJvcGVydHlfZGVjbGFyYXRpb25faW5fc2VjdGlvbl9wcm9wZXJ0eTc3MDYpOworICAgICAgICAJICAgICAgICAJICAgICAgICBwcm9wZXJ0eV9kZWNsYXJhdGlvbihjdHgsIGRlY2xQcm9wZXJ0eSwgc2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfUFVCTElDX01PRElGSUVSKTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc2VjdGlvbl9wcm9wZXJ0eUV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgCWRlZmF1bHQ6CisgICAgICAgIAkgICAgICAgIAkgICAgZ290byBsb29wMjE5OwkvKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgKi8KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBsb29wMjE5OiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMzoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNjMwOjQ6ICdAcHJvdGVjdGVkOicgKCBwcm9wZXJ0eV9kZWNsYXJhdGlvblsgZGVjbFByb3BlcnR5ICxcblx0IFx0XHRcdHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX1BST1RFQ1RFRF9NT0RJRklFUiBdICkqCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDIxNCwgJkZPTExPV18yMTRfaW5fc2VjdGlvbl9wcm9wZXJ0eTc3MTkpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzZWN0aW9uX3Byb3BlcnR5RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNjMxOjQ6ICggcHJvcGVydHlfZGVjbGFyYXRpb25bIGRlY2xQcm9wZXJ0eSAsXG5cdCBcdFx0XHRzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9QUk9URUNURURfTU9ESUZJRVIgXSApKgorCisgICAgICAgIAkgICAgICAgIGZvciAoOzspCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQyMjA9MjsKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjQzOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAyNDk6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI1MzoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjU3OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAyNTg6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI1OToKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjYyOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAyNzY6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI4MjoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjk4OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzMDU6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMxODoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzIwOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzNDE6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM0NDoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzQ5OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzNTU6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM2MToKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzY0OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzNzQ6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM4MDoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzg4OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzOTU6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM5ODoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgNDA0OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSA0MDY6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDQxMDoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgNDExOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSA0MTQ6CisgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgCQlhbHQyMjA9MTsKKyAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQyMjApCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjYzMTo2OiBwcm9wZXJ0eV9kZWNsYXJhdGlvblsgZGVjbFByb3BlcnR5ICxcblx0IFx0XHRcdHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX1BST1RFQ1RFRF9NT0RJRklFUiBdCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19wcm9wZXJ0eV9kZWNsYXJhdGlvbl9pbl9zZWN0aW9uX3Byb3BlcnR5NzcyNik7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHByb3BlcnR5X2RlY2xhcmF0aW9uKGN0eCwgZGVjbFByb3BlcnR5LCBzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9QUk9URUNURURfTU9ESUZJRVIpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzZWN0aW9uX3Byb3BlcnR5RXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAJZGVmYXVsdDoKKyAgICAgICAgCSAgICAgICAgCSAgICBnb3RvIGxvb3AyMjA7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGxvb3AyMjA6IDsgLyogSnVtcCBvdXQgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA0OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI2MzU6NDogJ0Bwcml2YXRlOicgKCBwcm9wZXJ0eV9kZWNsYXJhdGlvblsgZGVjbFByb3BlcnR5ICxcblx0IFx0XHRcdHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX1BSSVZBVEVfTU9ESUZJRVIgXSApKgorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgyMTEsICZGT0xMT1dfMjExX2luX3NlY3Rpb25fcHJvcGVydHk3NzM5KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc2VjdGlvbl9wcm9wZXJ0eUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjYzNjo0OiAoIHByb3BlcnR5X2RlY2xhcmF0aW9uWyBkZWNsUHJvcGVydHkgLFxuXHQgXHRcdFx0c2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfUFJJVkFURV9NT0RJRklFUiBdICkqCisKKyAgICAgICAgCSAgICAgICAgZm9yICg7OykKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDIyMT0yOworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgY2FzZSAyNDM6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI0OToKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjUzOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAyNTc6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI1ODoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjU5OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAyNjI6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI3NjoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjgyOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAyOTg6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMwNToKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzE4OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzMjA6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM0MToKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzQ0OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzNDk6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM1NToKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzYxOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzNjQ6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM3NDoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzgwOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzODg6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM5NToKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzk4OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSA0MDQ6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDQwNjoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgNDEwOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSA0MTE6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDQxNDoKKyAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAJCWFsdDIyMT0xOworICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDIyMSkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNjM2OjY6IHByb3BlcnR5X2RlY2xhcmF0aW9uWyBkZWNsUHJvcGVydHkgLFxuXHQgXHRcdFx0c2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfUFJJVkFURV9NT0RJRklFUiBdCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19wcm9wZXJ0eV9kZWNsYXJhdGlvbl9pbl9zZWN0aW9uX3Byb3BlcnR5Nzc0Nik7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHByb3BlcnR5X2RlY2xhcmF0aW9uKGN0eCwgZGVjbFByb3BlcnR5LCBzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9QUklWQVRFX01PRElGSUVSKTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc2VjdGlvbl9wcm9wZXJ0eUV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgCWRlZmF1bHQ6CisgICAgICAgIAkgICAgICAgIAkgICAgZ290byBsb29wMjIxOwkvKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgKi8KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBsb29wMjIxOiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlc2VjdGlvbl9wcm9wZXJ0eUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZXNlY3Rpb25fcHJvcGVydHlFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgCVNFVF9SVUxFX0xPQ0FUSU9OKGRlY2xQcm9wZXJ0eSk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKworICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoODksIHNlY3Rpb25fcHJvcGVydHlfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIHNlY3Rpb25fcHJvcGVydHkgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgc2VjdGlvbl9wcm9wZXJ0eV9mcmVlX2RlY2xhcmF0aW9uCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNjQyOjE6IHNlY3Rpb25fcHJvcGVydHlfZnJlZV9kZWNsYXJhdGlvblsgc2VwOjpNYWNoaW5lICogY29udGFpbmVyIF0gOiAoIHByb3BlcnR5X2RlY2xhcmF0aW9uWyBkZWNsUHJvcGVydHkgLFxuXHQgXHRcdFx0c2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfVU5ERUZJTkVEX01PRElGSUVSIF0gKSogOworICovCitzdGF0aWMgdm9pZAorc2VjdGlvbl9wcm9wZXJ0eV9mcmVlX2RlY2xhcmF0aW9uKHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIpCit7CisgICAgQU5UTFIzX1VJTlQzMiBzZWN0aW9uX3Byb3BlcnR5X2ZyZWVfZGVjbGFyYXRpb25fU3RhcnRJbmRleDsKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBzZWN0aW9uX3Byb3BlcnR5X2ZyZWVfZGVjbGFyYXRpb25fU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworCisgICAgCXNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5ID0gY29udGFpbmVyLT5nZXRQcm9wZXJ0eVBhcnQoKTsKKworICAgIAlTQVZFX1JVTEVfQkVHSU5fTE9DQVRJT047CisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDkwKSkgKQorICAgIHsKKyAgICAgICAgeworCisgICAgICAgICAgICAJU0VUX1JVTEVfTE9DQVRJT04oZGVjbFByb3BlcnR5KTsKKworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjY1MToyOiAoICggcHJvcGVydHlfZGVjbGFyYXRpb25bIGRlY2xQcm9wZXJ0eSAsXG5cdCBcdFx0XHRzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9VTkRFRklORURfTU9ESUZJRVIgXSApKiApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI2NTE6NDogKCBwcm9wZXJ0eV9kZWNsYXJhdGlvblsgZGVjbFByb3BlcnR5ICxcblx0IFx0XHRcdHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX1VOREVGSU5FRF9NT0RJRklFUiBdICkqCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI2NTE6NDogKCBwcm9wZXJ0eV9kZWNsYXJhdGlvblsgZGVjbFByb3BlcnR5ICxcblx0IFx0XHRcdHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX1VOREVGSU5FRF9NT0RJRklFUiBdICkqCisKKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDIyMz0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAyNDM6CisgICAgICAgICAgICAgICAgY2FzZSAyNDk6CisgICAgICAgICAgICAgICAgY2FzZSAyNTM6CisgICAgICAgICAgICAgICAgY2FzZSAyNTc6CisgICAgICAgICAgICAgICAgY2FzZSAyNTg6CisgICAgICAgICAgICAgICAgY2FzZSAyNTk6CisgICAgICAgICAgICAgICAgY2FzZSAyNjI6CisgICAgICAgICAgICAgICAgY2FzZSAyNzY6CisgICAgICAgICAgICAgICAgY2FzZSAyODI6CisgICAgICAgICAgICAgICAgY2FzZSAyOTg6CisgICAgICAgICAgICAgICAgY2FzZSAzMDU6CisgICAgICAgICAgICAgICAgY2FzZSAzMTg6CisgICAgICAgICAgICAgICAgY2FzZSAzMjA6CisgICAgICAgICAgICAgICAgY2FzZSAzNDE6CisgICAgICAgICAgICAgICAgY2FzZSAzNDQ6CisgICAgICAgICAgICAgICAgY2FzZSAzNDk6CisgICAgICAgICAgICAgICAgY2FzZSAzNTU6CisgICAgICAgICAgICAgICAgY2FzZSAzNjE6CisgICAgICAgICAgICAgICAgY2FzZSAzNjQ6CisgICAgICAgICAgICAgICAgY2FzZSAzNzQ6CisgICAgICAgICAgICAgICAgY2FzZSAzODA6CisgICAgICAgICAgICAgICAgY2FzZSAzODg6CisgICAgICAgICAgICAgICAgY2FzZSAzOTU6CisgICAgICAgICAgICAgICAgY2FzZSAzOTg6CisgICAgICAgICAgICAgICAgY2FzZSA0MDQ6CisgICAgICAgICAgICAgICAgY2FzZSA0MDY6CisgICAgICAgICAgICAgICAgY2FzZSA0MTA6CisgICAgICAgICAgICAgICAgY2FzZSA0MTE6CisgICAgICAgICAgICAgICAgY2FzZSA0MTQ6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDIyMz0xOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQyMjMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjY1MTo2OiBwcm9wZXJ0eV9kZWNsYXJhdGlvblsgZGVjbFByb3BlcnR5ICxcblx0IFx0XHRcdHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX1VOREVGSU5FRF9NT0RJRklFUiBdCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3Byb3BlcnR5X2RlY2xhcmF0aW9uX2luX3NlY3Rpb25fcHJvcGVydHlfZnJlZV9kZWNsYXJhdGlvbjc3NzcpOworICAgICAgICAgICAgCSAgICAgICAgcHJvcGVydHlfZGVjbGFyYXRpb24oY3R4LCBkZWNsUHJvcGVydHksIHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX1VOREVGSU5FRF9NT0RJRklFUik7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzZWN0aW9uX3Byb3BlcnR5X2ZyZWVfZGVjbGFyYXRpb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQ6CisgICAgICAgICAgICAJICAgIGdvdG8gbG9vcDIyMzsJLyogYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvb3AyMjM6IDsgLyogSnVtcCBvdXQgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKworCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZXNlY3Rpb25fcHJvcGVydHlfZnJlZV9kZWNsYXJhdGlvbkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZXNlY3Rpb25fcHJvcGVydHlfZnJlZV9kZWNsYXJhdGlvbkV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICAJU0VUX1JVTEVfTE9DQVRJT04oZGVjbFByb3BlcnR5KTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSg5MCwgc2VjdGlvbl9wcm9wZXJ0eV9mcmVlX2RlY2xhcmF0aW9uX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBzZWN0aW9uX3Byb3BlcnR5X2ZyZWVfZGVjbGFyYXRpb24gKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgcHJvcGVydHlfZGVjbGFyYXRpb24KKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI2NjA6MTogcHJvcGVydHlfZGVjbGFyYXRpb25bIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5ICwgc2VwOjpNb2RpZmllciBtZGZyIF0gOiAobT0gbW9kaWZpZXJfZGVjbGFyYXRpb24gKT8gZGVjbF9wcm9wZXJ0eV9lbGVtZW50WyBkZWNsUHJvcGVydHkgLCBtZGZyIF0gOworICovCitzdGF0aWMgdm9pZAorcHJvcGVydHlfZGVjbGFyYXRpb24ocGZtbFBhcnNlciBjdHgsIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5LCBzZXA6Ok1vZGlmaWVyIG1kZnIpCit7CisgICAgQU5UTFIzX1VJTlQzMiBwcm9wZXJ0eV9kZWNsYXJhdGlvbl9TdGFydEluZGV4OworCisgICAgc2VwOjpNb2RpZmllciBtOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9tCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9tIHNlcDo6TW9kaWZpZXIKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBwcm9wZXJ0eV9kZWNsYXJhdGlvbl9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSg5MSkpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjY2MjoyOiAoIChtPSBtb2RpZmllcl9kZWNsYXJhdGlvbiApPyBkZWNsX3Byb3BlcnR5X2VsZW1lbnRbIGRlY2xQcm9wZXJ0eSAsIG1kZnIgXSApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI2NjI6NDogKG09IG1vZGlmaWVyX2RlY2xhcmF0aW9uICk/IGRlY2xfcHJvcGVydHlfZWxlbWVudFsgZGVjbFByb3BlcnR5ICwgbWRmciBdCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI2NjI6NDogKG09IG1vZGlmaWVyX2RlY2xhcmF0aW9uICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDIyND0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQzOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDI4MjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOTg6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzA1OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM0MToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzNDk6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzU1OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM2MToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzNjQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzgwOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM5NToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDY6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDE0OgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDIyND0xOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQyMjQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjY2Mjo2OiBtPSBtb2RpZmllcl9kZWNsYXJhdGlvbgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19tb2RpZmllcl9kZWNsYXJhdGlvbl9pbl9wcm9wZXJ0eV9kZWNsYXJhdGlvbjc4MDYpOworICAgICAgICAgICAgCSAgICAgICAgbT1tb2RpZmllcl9kZWNsYXJhdGlvbihjdHgpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlcHJvcGVydHlfZGVjbGFyYXRpb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgbWRmci5vdmVycmlkZV9pZmRlZiggbQorICAgICAgICAgICAgCSAgICAgICAgICAgICApOyAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlY2xfcHJvcGVydHlfZWxlbWVudF9pbl9wcm9wZXJ0eV9kZWNsYXJhdGlvbjc4MTYpOworICAgICAgICAgICAgZGVjbF9wcm9wZXJ0eV9lbGVtZW50KGN0eCwgZGVjbFByb3BlcnR5LCBtZGZyKTsKKworICAgICAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXByb3BlcnR5X2RlY2xhcmF0aW9uRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZXByb3BlcnR5X2RlY2xhcmF0aW9uRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlcHJvcGVydHlfZGVjbGFyYXRpb25FeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDkxLCBwcm9wZXJ0eV9kZWNsYXJhdGlvbl9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgcHJvcGVydHlfZGVjbGFyYXRpb24gKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgZGVjbF9wcm9wZXJ0eV9lbGVtZW50CisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNjY2OjE6IGRlY2xfcHJvcGVydHlfZWxlbWVudFsgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHkgLCBzZXA6Ok1vZGlmaWVyIG1kZnIgXSA6ICggZGVjbF92YXJpYWJsZVsgZGVjbFByb3BlcnR5ICwgbWRmciBdIHwgZGVjbF9wb3J0WyBkZWNsUHJvcGVydHkgLCBtZGZyIF0gfCBkZWNsX3NpZ25hbFsgZGVjbFByb3BlcnR5ICwgbWRmciBdIHwgZGVjbF9idWZmZXJbIGRlY2xQcm9wZXJ0eSAsIG1kZnIgXSB8IGRlY2xfY2hhbm5lbFsgZGVjbFByb3BlcnR5ICwgbWRmciBdIHwgZGVmX3R5cGVbIGRlY2xQcm9wZXJ0eSAsIG1kZnIgXSB8IGRlZl9lbnVtWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0gfCBkZWZfdW5pb25bIGRlY2xQcm9wZXJ0eSAsIG1kZnIgXSB8IGRlZl9jaG9pY2VbIGRlY2xQcm9wZXJ0eSAsIG1kZnIgXSB8IGRlZl9zdHJ1Y3RbIGRlY2xQcm9wZXJ0eSAsIG1kZnIgXSApOworICovCitzdGF0aWMgdm9pZAorZGVjbF9wcm9wZXJ0eV9lbGVtZW50KHBmbWxQYXJzZXIgY3R4LCBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSwgc2VwOjpNb2RpZmllciBtZGZyKQoreworICAgIEFOVExSM19VSU5UMzIgZGVjbF9wcm9wZXJ0eV9lbGVtZW50X1N0YXJ0SW5kZXg7CisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgZGVjbF9wcm9wZXJ0eV9lbGVtZW50X1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDkyKSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgeworICAgICAgICB7CisgICAgICAgICAgICAvLyAgL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjY2ODoyOiAoIGRlY2xfdmFyaWFibGVbIGRlY2xQcm9wZXJ0eSAsIG1kZnIgXSB8IGRlY2xfcG9ydFsgZGVjbFByb3BlcnR5ICwgbWRmciBdIHwgZGVjbF9zaWduYWxbIGRlY2xQcm9wZXJ0eSAsIG1kZnIgXSB8IGRlY2xfYnVmZmVyWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0gfCBkZWNsX2NoYW5uZWxbIGRlY2xQcm9wZXJ0eSAsIG1kZnIgXSB8IGRlZl90eXBlWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0gfCBkZWZfZW51bVsgZGVjbFByb3BlcnR5ICwgbWRmciBdIHwgZGVmX3VuaW9uWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0gfCBkZWZfY2hvaWNlWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0gfCBkZWZfc3RydWN0WyBkZWNsUHJvcGVydHkgLCBtZGZyIF0gKQorCisgICAgICAgICAgICBBTlRMUjNfVUlOVDMyIGFsdDIyNTsKKworICAgICAgICAgICAgYWx0MjI1PTEwOworCisgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDI1OToKKyAgICAgICAgICAgIGNhc2UgMjYyOgorICAgICAgICAgICAgY2FzZSAzMTg6CisgICAgICAgICAgICBjYXNlIDQxMDoKKyAgICAgICAgICAgIGNhc2UgNDExOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MjI1PTE7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzNDQ6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQyMjU9MjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMyMDoKKyAgICAgICAgICAgIGNhc2UgMzc0OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MjI1PTM7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNDk6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQyMjU9NDsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI1MzoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDIyNT01OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzk4OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MjI1PTY7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNzY6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQyMjU9NzsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQwNDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDIyNT04OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjU3OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MjI1PTk7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNTg6CisgICAgICAgICAgICBjYXNlIDM4ODoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDIyNT0xMDsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMjI1OworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgZ290byBydWxlZGVjbF9wcm9wZXJ0eV9lbGVtZW50RXg7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQyMjUpCisgICAgICAgICAgICB7CisgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjY2ODo0OiBkZWNsX3ZhcmlhYmxlWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlY2xfdmFyaWFibGVfaW5fZGVjbF9wcm9wZXJ0eV9lbGVtZW50NzgzMSk7CisgICAgICAgIAkgICAgICAgIGRlY2xfdmFyaWFibGUoY3R4LCBkZWNsUHJvcGVydHksIG1kZnIpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX3Byb3BlcnR5X2VsZW1lbnRFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAyOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI2NzA6NDogZGVjbF9wb3J0WyBkZWNsUHJvcGVydHkgLCBtZGZyIF0KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlY2xfcG9ydF9pbl9kZWNsX3Byb3BlcnR5X2VsZW1lbnQ3ODM4KTsKKyAgICAgICAgCSAgICAgICAgZGVjbF9wb3J0KGN0eCwgZGVjbFByb3BlcnR5LCBtZGZyKTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVjbF9wcm9wZXJ0eV9lbGVtZW50RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMzoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNjcxOjQ6IGRlY2xfc2lnbmFsWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlY2xfc2lnbmFsX2luX2RlY2xfcHJvcGVydHlfZWxlbWVudDc4NDcpOworICAgICAgICAJICAgICAgICBkZWNsX3NpZ25hbChjdHgsIGRlY2xQcm9wZXJ0eSwgbWRmcik7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfcHJvcGVydHlfZWxlbWVudEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDQ6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjY3Mjo0OiBkZWNsX2J1ZmZlclsgZGVjbFByb3BlcnR5ICwgbWRmciBdCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWNsX2J1ZmZlcl9pbl9kZWNsX3Byb3BlcnR5X2VsZW1lbnQ3ODU0KTsKKyAgICAgICAgCSAgICAgICAgZGVjbF9idWZmZXIoY3R4LCBkZWNsUHJvcGVydHksIG1kZnIpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX3Byb3BlcnR5X2VsZW1lbnRFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA1OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI2NzM6NDogZGVjbF9jaGFubmVsWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlY2xfY2hhbm5lbF9pbl9kZWNsX3Byb3BlcnR5X2VsZW1lbnQ3ODYxKTsKKyAgICAgICAgCSAgICAgICAgZGVjbF9jaGFubmVsKGN0eCwgZGVjbFByb3BlcnR5LCBtZGZyKTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVjbF9wcm9wZXJ0eV9lbGVtZW50RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgNjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNjc1OjQ6IGRlZl90eXBlWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlZl90eXBlX2luX2RlY2xfcHJvcGVydHlfZWxlbWVudDc4NjgpOworICAgICAgICAJICAgICAgICBkZWZfdHlwZShjdHgsIGRlY2xQcm9wZXJ0eSwgbWRmcik7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfcHJvcGVydHlfZWxlbWVudEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDc6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjY3Njo0OiBkZWZfZW51bVsgZGVjbFByb3BlcnR5ICwgbWRmciBdCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfZW51bV9pbl9kZWNsX3Byb3BlcnR5X2VsZW1lbnQ3ODc2KTsKKyAgICAgICAgCSAgICAgICAgZGVmX2VudW0oY3R4LCBkZWNsUHJvcGVydHksIG1kZnIpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX3Byb3BlcnR5X2VsZW1lbnRFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA4OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI2Nzc6NDogZGVmX3VuaW9uWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlZl91bmlvbl9pbl9kZWNsX3Byb3BlcnR5X2VsZW1lbnQ3ODg0KTsKKyAgICAgICAgCSAgICAgICAgZGVmX3VuaW9uKGN0eCwgZGVjbFByb3BlcnR5LCBtZGZyKTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVjbF9wcm9wZXJ0eV9lbGVtZW50RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgOToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNjc4OjQ6IGRlZl9jaG9pY2VbIGRlY2xQcm9wZXJ0eSAsIG1kZnIgXQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX2Nob2ljZV9pbl9kZWNsX3Byb3BlcnR5X2VsZW1lbnQ3ODkxKTsKKyAgICAgICAgCSAgICAgICAgZGVmX2Nob2ljZShjdHgsIGRlY2xQcm9wZXJ0eSwgbWRmcik7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfcHJvcGVydHlfZWxlbWVudEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDEwOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI2Nzk6NDogZGVmX3N0cnVjdFsgZGVjbFByb3BlcnR5ICwgbWRmciBdCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfc3RydWN0X2luX2RlY2xfcHJvcGVydHlfZWxlbWVudDc4OTcpOworICAgICAgICAJICAgICAgICBkZWZfc3RydWN0KGN0eCwgZGVjbFByb3BlcnR5LCBtZGZyKTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVjbF9wcm9wZXJ0eV9lbGVtZW50RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlZGVjbF9wcm9wZXJ0eV9lbGVtZW50RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlZGVjbF9wcm9wZXJ0eV9lbGVtZW50RXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSg5MiwgZGVjbF9wcm9wZXJ0eV9lbGVtZW50X1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBkZWNsX3Byb3BlcnR5X2VsZW1lbnQgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgbGFiZWxsZWRfYXJndW1lbnQKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI2OTM6MTogbGFiZWxsZWRfYXJndW1lbnQgcmV0dXJucyBbIHN0ZDo6c3RyaW5nIGxhYmVsLCBzZXA6OkJGIGFyZyBdIDogKCAoIElEIENPTE9OICk9PmlkPSBJRCBDT0xPTiBlPSBleHByZXNzaW9uIHxlPSBleHByZXNzaW9uICk7CisgKi8KK3N0YXRpYyBmbWxQYXJzZXJfbGFiZWxsZWRfYXJndW1lbnRfcmV0dXJuCitsYWJlbGxlZF9hcmd1bWVudChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBmbWxQYXJzZXJfbGFiZWxsZWRfYXJndW1lbnRfcmV0dXJuIHJldHZhbDsKKworICAgIEFOVExSM19VSU5UMzIgbGFiZWxsZWRfYXJndW1lbnRfU3RhcnRJbmRleDsKKworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIGlkOworICAgIHNlcDo6QkYgZTsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfZQorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfZSBzZXA6OkJGCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgbGFiZWxsZWRfYXJndW1lbnRfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoOTMpKSApCisgICAgeworICAgIAlyZXR2YWwuc3RhcnQgPSAwOworCisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKworICAgIGlkICAgICAgID0gTlVMTDsKKyAgICByZXR2YWwuc3RhcnQgPSBMVCgxKTsgcmV0dmFsLnN0b3AgPSByZXR2YWwuc3RhcnQ7CisKKworICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI2OTU6MjogKCAoIElEIENPTE9OICk9PmlkPSBJRCBDT0xPTiBlPSBleHByZXNzaW9uIHxlPSBleHByZXNzaW9uICkKKworICAgICAgICAgICAgQU5UTFIzX1VJTlQzMiBhbHQyMjY7CisKKyAgICAgICAgICAgIGFsdDIyNj0yOworCisgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIElEOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkgICAgaW50IExBMjI2XzEgPSBMQSgyKTsKKyAgICAgICAgICAgIAkJICAgIGlmICggKHN5bnByZWQ0MDdfZm1sKGN0eCkpKQorICAgICAgICAgICAgCQkgICAgeworICAgICAgICAgICAgCQkgICAgICAgIGFsdDIyNj0xOworICAgICAgICAgICAgCQkgICAgfQorICAgICAgICAgICAgCQkgICAgZWxzZSBpZiAoIChBTlRMUjNfVFJVRSkpCisgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAJCSAgICAgICAgYWx0MjI2PTI7CisgICAgICAgICAgICAJCSAgICB9CisgICAgICAgICAgICAJCSAgICBlbHNlCisgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAJCSAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgCQkgICAgICAgIHsKKyAgICAgICAgICAgIAkJICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgCQkgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgCQkgICAgICAgIH0KKworCisgICAgICAgICAgICAJCSAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgIAkJICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIAkJICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAJCSAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAyMjY7CisgICAgICAgICAgICAJCSAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAxOworCisKKyAgICAgICAgICAgIAkJICAgICAgICBnb3RvIHJ1bGVsYWJlbGxlZF9hcmd1bWVudEV4OworCisgICAgICAgICAgICAJCSAgICB9CisgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJOT1Q6CisgICAgICAgICAgICBjYXNlIENPTE9OeDI6CisgICAgICAgICAgICBjYXNlIENoYXJMaXRlcmFsOgorICAgICAgICAgICAgY2FzZSBERUNSOgorICAgICAgICAgICAgY2FzZSBET0xMQVJfTENVUkxZOgorICAgICAgICAgICAgY2FzZSBGbG9hdExpdGVyYWw6CisgICAgICAgICAgICBjYXNlIElOQ1I6CisgICAgICAgICAgICBjYXNlIEludGVnZXJMaXRlcmFsOgorICAgICAgICAgICAgY2FzZSBMQlJBQ0tFVDoKKyAgICAgICAgICAgIGNhc2UgTEJSQUNLRVRfQkFSOgorICAgICAgICAgICAgY2FzZSBMQ1VSTFk6CisgICAgICAgICAgICBjYXNlIExOT1Q6CisgICAgICAgICAgICBjYXNlIExQQVJFTjoKKyAgICAgICAgICAgIGNhc2UgTFBBUkVOX0lOVk9LRToKKyAgICAgICAgICAgIGNhc2UgTUlOVVM6CisgICAgICAgICAgICBjYXNlIE9QX1BPUDoKKyAgICAgICAgICAgIGNhc2UgT1BfVE9QOgorICAgICAgICAgICAgY2FzZSBQRVJDRU5UX0xDVVJMWToKKyAgICAgICAgICAgIGNhc2UgUExVUzoKKyAgICAgICAgICAgIGNhc2UgUmF0aW9uYWxMaXRlcmFsOgorICAgICAgICAgICAgY2FzZSBTdHJpbmdMaXRlcmFsOgorICAgICAgICAgICAgY2FzZSAxNTg6CisgICAgICAgICAgICBjYXNlIDE1OToKKyAgICAgICAgICAgIGNhc2UgMTYwOgorICAgICAgICAgICAgY2FzZSAxNjE6CisgICAgICAgICAgICBjYXNlIDE2MjoKKyAgICAgICAgICAgIGNhc2UgMjM3OgorICAgICAgICAgICAgY2FzZSAyNTY6CisgICAgICAgICAgICBjYXNlIDI2NToKKyAgICAgICAgICAgIGNhc2UgMjc3OgorICAgICAgICAgICAgY2FzZSAyODA6CisgICAgICAgICAgICBjYXNlIDI5NDoKKyAgICAgICAgICAgIGNhc2UgMzEzOgorICAgICAgICAgICAgY2FzZSAzMzA6CisgICAgICAgICAgICBjYXNlIDMzMToKKyAgICAgICAgICAgIGNhc2UgMzMyOgorICAgICAgICAgICAgY2FzZSAzNDM6CisgICAgICAgICAgICBjYXNlIDM0NzoKKyAgICAgICAgICAgIGNhc2UgMzcyOgorICAgICAgICAgICAgY2FzZSAzOTc6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQyMjY9MjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMjI2OworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgZ290byBydWxlbGFiZWxsZWRfYXJndW1lbnRFeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDIyNikKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNjk1OjQ6ICggSUQgQ09MT04gKT0+aWQ9IElEIENPTE9OIGU9IGV4cHJlc3Npb24KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIGlkID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoSUQsICZGT0xMT1dfSURfaW5fbGFiZWxsZWRfYXJndW1lbnQ3OTMzKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlbGFiZWxsZWRfYXJndW1lbnRFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgICBNQVRDSFQoQ09MT04sICZGT0xMT1dfQ09MT05faW5fbGFiZWxsZWRfYXJndW1lbnQ3OTM1KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlbGFiZWxsZWRfYXJndW1lbnRFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIHJldHZhbC5sYWJlbD0gU1RSKChpZC0+Z2V0VGV4dChpZCkpLT5jaGFycyk7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fbGFiZWxsZWRfYXJndW1lbnQ3OTQ1KTsKKyAgICAgICAgCSAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWxhYmVsbGVkX2FyZ3VtZW50RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICByZXR2YWwuYXJnPSAKKyAgICAgICAgCSAgICAgICAgICAgIGUKKyAgICAgICAgCSAgICAgICAgICAgIDsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDI6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjY5Nzo0OiBlPSBleHByZXNzaW9uCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX2xhYmVsbGVkX2FyZ3VtZW50Nzk1NSk7CisgICAgICAgIAkgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVsYWJlbGxlZF9hcmd1bWVudEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgcmV0dmFsLmFyZz0gCisgICAgICAgIAkgICAgICAgICAgICBlCisgICAgICAgIAkgICAgICAgICAgICA7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVsYWJlbGxlZF9hcmd1bWVudEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZWxhYmVsbGVkX2FyZ3VtZW50RXg6IDsKKyAgICByZXR2YWwuc3RvcCA9IExUKC0xKTsKKworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDkzLCBsYWJlbGxlZF9hcmd1bWVudF9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIHJldHZhbDsKK30KKy8qICRBTlRMUiBlbmQgbGFiZWxsZWRfYXJndW1lbnQgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3BhcmFtcworICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjcwMDoxOiBkZWNsX2luc3RhbmNlX21hY2hpbmVfcGFyYW1zWyBzZXA6Ok1hY2hpbmUgKiBtYWNoaW5lIF0gOiBMUEFSRU4gKGxwPSBsYWJlbGxlZF9hcmd1bWVudCAoIENPTU1BIGxwPSBsYWJlbGxlZF9hcmd1bWVudCApKiApPyBSUEFSRU4gOworICovCitzdGF0aWMgdm9pZAorZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3BhcmFtcyhwZm1sUGFyc2VyIGN0eCwgc2VwOjpNYWNoaW5lICogbWFjaGluZSkKK3sKKyAgICBBTlRMUjNfVUlOVDMyIGRlY2xfaW5zdGFuY2VfbWFjaGluZV9wYXJhbXNfU3RhcnRJbmRleDsKKworICAgIGZtbFBhcnNlcl9sYWJlbGxlZF9hcmd1bWVudF9yZXR1cm4gbHA7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2xwCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9scCBmbWxQYXJzZXJfbGFiZWxsZWRfYXJndW1lbnRfcmV0dXJuCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3BhcmFtc19TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisKKyAgICAJc2VwOjpCRlZlY3RvciBsYWJlbGxlZFBhcmFtcygKKyAgICAJCSggbWFjaGluZS0+Z2V0VHlwZSgpLmlzPCBzZXA6Ok1hY2hpbmUgPigpICkgPyBtYWNoaW5lLT5nZXRUeXBlKCkuCisgICAgCQkJdG9fcHRyPCBzZXA6Ok1hY2hpbmUgPigpLT5nZXRWYXJpYWJsZVBhcmFtZXRlcnNDb3VudCgpIDogMCApOworCisgICAgCXNlcDo6QkZMaXN0IHBvc2l0aW9uYWxQYXJhbXM7CisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDk0KSkgKQorICAgIHsKKyAgICAgICAgeworCisgICAgICAgICAgICAJaWYoIGxhYmVsbGVkUGFyYW1zLm5vbmVtcHR5KCkgKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJc2VwOjpQYXJzZXJVdGlsOjpjb21wdXRlSW5zdGFuY2VNYWNoaW5lUGFyYW1ldGVyKAorICAgICAgICAgICAgCQkJCW1hY2hpbmUsIGxhYmVsbGVkUGFyYW1zLCBwb3NpdGlvbmFsUGFyYW1zKTsKKyAgICAgICAgICAgIAl9CisKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI3MTU6MjogKCBMUEFSRU4gKGxwPSBsYWJlbGxlZF9hcmd1bWVudCAoIENPTU1BIGxwPSBsYWJlbGxlZF9hcmd1bWVudCApKiApPyBSUEFSRU4gKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNzE1OjQ6IExQQVJFTiAobHA9IGxhYmVsbGVkX2FyZ3VtZW50ICggQ09NTUEgbHA9IGxhYmVsbGVkX2FyZ3VtZW50ICkqICk/IFJQQVJFTgorICAgICAgICB7CisgICAgICAgICAgICAgTUFUQ0hUKExQQVJFTiwgJkZPTExPV19MUEFSRU5faW5fZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3BhcmFtczc5NzkpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX2luc3RhbmNlX21hY2hpbmVfcGFyYW1zRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNzE2OjQ6IChscD0gbGFiZWxsZWRfYXJndW1lbnQgKCBDT01NQSBscD0gbGFiZWxsZWRfYXJndW1lbnQgKSogKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MjI4PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCTk9UOgorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9OeDI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhckxpdGVyYWw6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgREVDUjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBET0xMQVJfTENVUkxZOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEZsb2F0TGl0ZXJhbDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBJTkNSOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEludGVnZXJMaXRlcmFsOgorICAgICAgICAgICAgICAgICAgICBjYXNlIExCUkFDS0VUOgorICAgICAgICAgICAgICAgICAgICBjYXNlIExCUkFDS0VUX0JBUjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMQ1VSTFk6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTE5PVDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMUEFSRU46CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTFBBUkVOX0lOVk9LRToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBNSU5VUzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPUF9QT1A6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BfVE9QOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFBFUkNFTlRfTENVUkxZOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFBMVVM6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmF0aW9uYWxMaXRlcmFsOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFN0cmluZ0xpdGVyYWw6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU4OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjA6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTYxOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDE2MjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjU2OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDI2NToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNzc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjgwOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDI5NDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzMTM6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzMwOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDMzMToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzMzI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzQzOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM0NzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzNzI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzk3OgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDIyOD0xOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQyMjgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjcxNjo2OiBscD0gbGFiZWxsZWRfYXJndW1lbnQgKCBDT01NQSBscD0gbGFiZWxsZWRfYXJndW1lbnQgKSoKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5fZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3BhcmFtczc5ODgpOworICAgICAgICAgICAgCSAgICAgICAgbHA9bGFiZWxsZWRfYXJndW1lbnQoY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfaW5zdGFuY2VfbWFjaGluZV9wYXJhbXNFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgCXNlcDo6UGFyc2VyVXRpbDo6YXBwZW5kSW5zdGFuY2VNYWNoaW5lUGFyYW1ldGVyKG1hY2hpbmUsIGxwLmxhYmVsCisgICAgICAgICAgICAJICAgICAgICAgICAgLAorICAgICAgICAgICAgCSAgICAgICAgICAgIAkJCQkJbGFiZWxsZWRQYXJhbXMsIHBvc2l0aW9uYWxQYXJhbXMsIGxwLmFyZworICAgICAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNzIxOjY6ICggQ09NTUEgbHA9IGxhYmVsbGVkX2FyZ3VtZW50ICkqCisKKyAgICAgICAgICAgIAkgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDIyNz0yOworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBDT01NQToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJYWx0MjI3PTE7CisgICAgICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDIyNykKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNzIxOjg6IENPTU1BIGxwPSBsYWJlbGxlZF9hcmd1bWVudAorICAgICAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKENPTU1BLCAmRk9MTE9XX0NPTU1BX2luX2RlY2xfaW5zdGFuY2VfbWFjaGluZV9wYXJhbXM4MDA0KTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3BhcmFtc0V4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5fZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3BhcmFtczgwMTMpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgbHA9bGFiZWxsZWRfYXJndW1lbnQoY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfaW5zdGFuY2VfbWFjaGluZV9wYXJhbXNFeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgCXNlcDo6UGFyc2VyVXRpbDo6YXBwZW5kSW5zdGFuY2VNYWNoaW5lUGFyYW1ldGVyKG1hY2hpbmUsIGxwLmxhYmVsCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgLAorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkJCQkJbGFiZWxsZWRQYXJhbXMsIHBvc2l0aW9uYWxQYXJhbXMsIGxwLmFyZworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAgICAgCSAgICAgICAgCSAgICBnb3RvIGxvb3AyMjc7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBsb29wMjI3OiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgTUFUQ0hUKFJQQVJFTiwgJkZPTExPV19SUEFSRU5faW5fZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3BhcmFtczgwMzkpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX2luc3RhbmNlX21hY2hpbmVfcGFyYW1zRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZWRlY2xfaW5zdGFuY2VfbWFjaGluZV9wYXJhbXNFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVkZWNsX2luc3RhbmNlX21hY2hpbmVfcGFyYW1zRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIAlpZiggbGFiZWxsZWRQYXJhbXMubm9uZW1wdHkoKSApCisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJc2VwOjpQYXJzZXJVdGlsOjpjb21wdXRlSW5zdGFuY2VNYWNoaW5lUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAJCQkJbWFjaGluZSwgbGFiZWxsZWRQYXJhbXMsIHBvc2l0aW9uYWxQYXJhbXMpOworICAgICAgICAgICAgICAgICAgICAJfQorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisKKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDk0LCBkZWNsX2luc3RhbmNlX21hY2hpbmVfcGFyYW1zX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBkZWNsX2luc3RhbmNlX21hY2hpbmVfcGFyYW1zICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGRlY2xfaW5zdGFuY2VfbWFjaGluZV9yZXR1cm5zCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNzMzOjE6IGRlY2xfaW5zdGFuY2VfbWFjaGluZV9yZXR1cm5zWyBzZXA6Ok1hY2hpbmUgKiBtYWNoaW5lIF0gOiAoICctLT4nIHwgJ3JldHVybnM6JyApICggTFBBUkVOIGxwPSBsYWJlbGxlZF9hcmd1bWVudCAoIENPTU1BIGxwPSBsYWJlbGxlZF9hcmd1bWVudCApKiBSUEFSRU4gfGxwPSBsYWJlbGxlZF9hcmd1bWVudCApIDsKKyAqLworc3RhdGljIHZvaWQKK2RlY2xfaW5zdGFuY2VfbWFjaGluZV9yZXR1cm5zKHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBtYWNoaW5lKQoreworICAgIEFOVExSM19VSU5UMzIgZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3JldHVybnNfU3RhcnRJbmRleDsKKworICAgIGZtbFBhcnNlcl9sYWJlbGxlZF9hcmd1bWVudF9yZXR1cm4gbHA7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2xwCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9scCBmbWxQYXJzZXJfbGFiZWxsZWRfYXJndW1lbnRfcmV0dXJuCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3JldHVybnNfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworCisgICAgCXNlcDo6QkZWZWN0b3IgbGFiZWxsZWRSZXR1cm5zKAorICAgIAkJKCBtYWNoaW5lLT5nZXRUeXBlKCkuaXM8IHNlcDo6TWFjaGluZSA+KCkgKSA/IG1hY2hpbmUtPmdldFR5cGUoKS4KKyAgICAJCQl0b19wdHI8IHNlcDo6TWFjaGluZSA+KCktPmdldFZhcmlhYmxlUGFyYW1ldGVyc0NvdW50KCkgOiAwICk7CisKKyAgICAJc2VwOjpCRkxpc3QgcG9zaXRpb25hbFJldHVybnM7CisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDk1KSkgKQorICAgIHsKKyAgICAgICAgeworCisgICAgICAgICAgICAJaWYoIGxhYmVsbGVkUmV0dXJucy5ub25lbXB0eSgpICkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCXNlcDo6UGFyc2VyVXRpbDo6Y29tcHV0ZUluc3RhbmNlTWFjaGluZVJldHVybigKKyAgICAgICAgICAgIAkJCQltYWNoaW5lLCBsYWJlbGxlZFJldHVybnMsIHBvc2l0aW9uYWxSZXR1cm5zKTsKKyAgICAgICAgICAgIAl9CisKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI3NDg6MjogKCAoICctLT4nIHwgJ3JldHVybnM6JyApICggTFBBUkVOIGxwPSBsYWJlbGxlZF9hcmd1bWVudCAoIENPTU1BIGxwPSBsYWJlbGxlZF9hcmd1bWVudCApKiBSUEFSRU4gfGxwPSBsYWJlbGxlZF9hcmd1bWVudCApICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mjc0ODo0OiAoICctLT4nIHwgJ3JldHVybnM6JyApICggTFBBUkVOIGxwPSBsYWJlbGxlZF9hcmd1bWVudCAoIENPTU1BIGxwPSBsYWJlbGxlZF9hcmd1bWVudCApKiBSUEFSRU4gfGxwPSBsYWJlbGxlZF9hcmd1bWVudCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggTEEoMSkgPT0gMTYzIHx8IExBKDEpID09IDM2NSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ09OU1VNRSgpOworICAgICAgICAgICAgICAgIFBFUlJPUlJFQ09WRVJZPUFOVExSM19GQUxTRTsKKyAgICAgICAgICAgICAgICBGQUlMRURGTEFHPUFOVExSM19GQUxTRTsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX01JU01BVENIRURfU0VUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPm5hbWUgICAgICAgICA9ICh2b2lkICopQU5UTFIzX01JU01BVENIRURfU0VUX05BTUU7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5leHBlY3RpbmdTZXQgPSBOVUxMOworCisgICAgICAgICAgICAgICAgZ290byBydWxlZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3JldHVybnNFeDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNzQ5OjQ6ICggTFBBUkVOIGxwPSBsYWJlbGxlZF9hcmd1bWVudCAoIENPTU1BIGxwPSBsYWJlbGxlZF9hcmd1bWVudCApKiBSUEFSRU4gfGxwPSBsYWJlbGxlZF9hcmd1bWVudCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDIzMD0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBMUEFSRU46CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgICAgICAJCSAgICBpbnQgTEEyMzBfMSA9IExBKDIpOworICAgICAgICAgICAgICAgIAkJICAgIGlmICggKHN5bnByZWQ0MTJfZm1sKGN0eCkpKQorICAgICAgICAgICAgICAgIAkJICAgIHsKKyAgICAgICAgICAgICAgICAJCSAgICAgICAgYWx0MjMwPTE7CisgICAgICAgICAgICAgICAgCQkgICAgfQorICAgICAgICAgICAgICAgIAkJICAgIGVsc2UgaWYgKCAoQU5UTFIzX1RSVUUpKQorICAgICAgICAgICAgICAgIAkJICAgIHsKKyAgICAgICAgICAgICAgICAJCSAgICAgICAgYWx0MjMwPTI7CisgICAgICAgICAgICAgICAgCQkgICAgfQorICAgICAgICAgICAgICAgIAkJICAgIGVsc2UKKyAgICAgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAgICAgCQkgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICAJCSAgICAgICAgeworICAgICAgICAgICAgICAgIAkJICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgIAkJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAJCSAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAJCSAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICAJCSAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgCQkgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICAJCSAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAyMzA7CisgICAgICAgICAgICAgICAgCQkgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMTsKKworCisgICAgICAgICAgICAgICAgCQkgICAgICAgIGdvdG8gcnVsZWRlY2xfaW5zdGFuY2VfbWFjaGluZV9yZXR1cm5zRXg7CisKKyAgICAgICAgICAgICAgICAJCSAgICB9CisgICAgICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCTk9UOgorICAgICAgICAgICAgICAgIGNhc2UgQ09MT054MjoKKyAgICAgICAgICAgICAgICBjYXNlIENoYXJMaXRlcmFsOgorICAgICAgICAgICAgICAgIGNhc2UgREVDUjoKKyAgICAgICAgICAgICAgICBjYXNlIERPTExBUl9MQ1VSTFk6CisgICAgICAgICAgICAgICAgY2FzZSBGbG9hdExpdGVyYWw6CisgICAgICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgICAgICAgICBjYXNlIElOQ1I6CisgICAgICAgICAgICAgICAgY2FzZSBJbnRlZ2VyTGl0ZXJhbDoKKyAgICAgICAgICAgICAgICBjYXNlIExCUkFDS0VUOgorICAgICAgICAgICAgICAgIGNhc2UgTEJSQUNLRVRfQkFSOgorICAgICAgICAgICAgICAgIGNhc2UgTENVUkxZOgorICAgICAgICAgICAgICAgIGNhc2UgTE5PVDoKKyAgICAgICAgICAgICAgICBjYXNlIExQQVJFTl9JTlZPS0U6CisgICAgICAgICAgICAgICAgY2FzZSBNSU5VUzoKKyAgICAgICAgICAgICAgICBjYXNlIE9QX1BPUDoKKyAgICAgICAgICAgICAgICBjYXNlIE9QX1RPUDoKKyAgICAgICAgICAgICAgICBjYXNlIFBFUkNFTlRfTENVUkxZOgorICAgICAgICAgICAgICAgIGNhc2UgUExVUzoKKyAgICAgICAgICAgICAgICBjYXNlIFJhdGlvbmFsTGl0ZXJhbDoKKyAgICAgICAgICAgICAgICBjYXNlIFN0cmluZ0xpdGVyYWw6CisgICAgICAgICAgICAgICAgY2FzZSAxNTg6CisgICAgICAgICAgICAgICAgY2FzZSAxNTk6CisgICAgICAgICAgICAgICAgY2FzZSAxNjA6CisgICAgICAgICAgICAgICAgY2FzZSAxNjE6CisgICAgICAgICAgICAgICAgY2FzZSAxNjI6CisgICAgICAgICAgICAgICAgY2FzZSAyMzc6CisgICAgICAgICAgICAgICAgY2FzZSAyNTY6CisgICAgICAgICAgICAgICAgY2FzZSAyNjU6CisgICAgICAgICAgICAgICAgY2FzZSAyNzc6CisgICAgICAgICAgICAgICAgY2FzZSAyODA6CisgICAgICAgICAgICAgICAgY2FzZSAyOTQ6CisgICAgICAgICAgICAgICAgY2FzZSAzMTM6CisgICAgICAgICAgICAgICAgY2FzZSAzMzA6CisgICAgICAgICAgICAgICAgY2FzZSAzMzE6CisgICAgICAgICAgICAgICAgY2FzZSAzMzI6CisgICAgICAgICAgICAgICAgY2FzZSAzNDM6CisgICAgICAgICAgICAgICAgY2FzZSAzNDc6CisgICAgICAgICAgICAgICAgY2FzZSAzNzI6CisgICAgICAgICAgICAgICAgY2FzZSAzOTc6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDIzMD0yOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAyMzA7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfaW5zdGFuY2VfbWFjaGluZV9yZXR1cm5zRXg7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDIzMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNzQ5OjY6IExQQVJFTiBscD0gbGFiZWxsZWRfYXJndW1lbnQgKCBDT01NQSBscD0gbGFiZWxsZWRfYXJndW1lbnQgKSogUlBBUkVOCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoTFBBUkVOLCAmRk9MTE9XX0xQQVJFTl9pbl9kZWNsX2luc3RhbmNlX21hY2hpbmVfcmV0dXJuczgwNzYpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX2luc3RhbmNlX21hY2hpbmVfcmV0dXJuc0V4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5fZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3JldHVybnM4MDg1KTsKKyAgICAgICAgICAgIAkgICAgICAgIGxwPWxhYmVsbGVkX2FyZ3VtZW50KGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX2luc3RhbmNlX21hY2hpbmVfcmV0dXJuc0V4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworCisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAJc2VwOjpQYXJzZXJVdGlsOjphcHBlbmRJbnN0YW5jZU1hY2hpbmVSZXR1cm4obWFjaGluZSwgbHAubGFiZWwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAsCisgICAgICAgICAgICAJICAgICAgICAgICAgCQkJCQlsYWJlbGxlZFJldHVybnMsIHBvc2l0aW9uYWxSZXR1cm5zLCBscC5hcmcKKyAgICAgICAgICAgIAkgICAgICAgICAgICApOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mjc1NTo2OiAoIENPTU1BIGxwPSBsYWJlbGxlZF9hcmd1bWVudCApKgorCisgICAgICAgICAgICAJICAgICAgICBmb3IgKDs7KQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQyMjk9MjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgQ09NTUE6CisgICAgICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCWFsdDIyOT0xOworICAgICAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQyMjkpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mjc1NTo4OiBDT01NQSBscD0gbGFiZWxsZWRfYXJndW1lbnQKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChDT01NQSwgJkZPTExPV19DT01NQV9pbl9kZWNsX2luc3RhbmNlX21hY2hpbmVfcmV0dXJuczgxMDEpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX2luc3RhbmNlX21hY2hpbmVfcmV0dXJuc0V4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5fZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3JldHVybnM4MTEyKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGxwPWxhYmVsbGVkX2FyZ3VtZW50KGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX2luc3RhbmNlX21hY2hpbmVfcmV0dXJuc0V4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAJc2VwOjpQYXJzZXJVdGlsOjphcHBlbmRJbnN0YW5jZU1hY2hpbmVSZXR1cm4obWFjaGluZSwgbHAubGFiZWwKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAsCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCQkJCQlsYWJlbGxlZFJldHVybnMsIHBvc2l0aW9uYWxSZXR1cm5zLCBscC5hcmcKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICApOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAgICAgCSAgICAgICAgCSAgICBnb3RvIGxvb3AyMjk7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBsb29wMjI5OiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChSUEFSRU4sICZGT0xMT1dfUlBBUkVOX2luX2RlY2xfaW5zdGFuY2VfbWFjaGluZV9yZXR1cm5zODEzNik7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfaW5zdGFuY2VfbWFjaGluZV9yZXR1cm5zRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAyOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNzY0OjY6IGxwPSBsYWJlbGxlZF9hcmd1bWVudAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9kZWNsX2luc3RhbmNlX21hY2hpbmVfcmV0dXJuczgxNDYpOworICAgICAgICAgICAgCSAgICAgICAgbHA9bGFiZWxsZWRfYXJndW1lbnQoY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfaW5zdGFuY2VfbWFjaGluZV9yZXR1cm5zRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIAlzZXA6OlBhcnNlclV0aWw6OmFwcGVuZEluc3RhbmNlTWFjaGluZVJldHVybihtYWNoaW5lLCBscC5sYWJlbAorICAgICAgICAgICAgCSAgICAgICAgICAgICwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCQkJCWxhYmVsbGVkUmV0dXJucywgcG9zaXRpb25hbFJldHVybnMsIGxwLmFyZworICAgICAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3JldHVybnNFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVkZWNsX2luc3RhbmNlX21hY2hpbmVfcmV0dXJuc0V4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICAJaWYoIGxhYmVsbGVkUmV0dXJucy5ub25lbXB0eSgpICkKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlzZXA6OlBhcnNlclV0aWw6OmNvbXB1dGVJbnN0YW5jZU1hY2hpbmVSZXR1cm4oCisgICAgICAgICAgICAgICAgICAgIAkJCQltYWNoaW5lLCBsYWJlbGxlZFJldHVybnMsIHBvc2l0aW9uYWxSZXR1cm5zKTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSg5NSwgZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3JldHVybnNfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGRlY2xfaW5zdGFuY2VfbWFjaGluZV9yZXR1cm5zICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGFjdGl2aXR5X21hY2hpbmVfcGFyYW1fcmV0dXJuCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNzc0OjE6IGFjdGl2aXR5X21hY2hpbmVfcGFyYW1fcmV0dXJuWyBjb25zdCBzZXA6OkJGICYgYXJnTWFjaGluZSAsIHNlcDo6QkZDb2RlICYgYWMgXSA6IExQQVJFTiAobHA9IGxhYmVsbGVkX2FyZ3VtZW50ICggQ09NTUEgbHA9IGxhYmVsbGVkX2FyZ3VtZW50ICkqICk/IFJQQVJFTiAoICggJy0tPicgfCAncmV0dXJuczonICkgKCBMUEFSRU4gbHA9IGxhYmVsbGVkX2FyZ3VtZW50ICggQ09NTUEgbHA9IGxhYmVsbGVkX2FyZ3VtZW50ICkqIFJQQVJFTiB8bHA9IGxhYmVsbGVkX2FyZ3VtZW50ICkgKT8gOworICovCitzdGF0aWMgdm9pZAorYWN0aXZpdHlfbWFjaGluZV9wYXJhbV9yZXR1cm4ocGZtbFBhcnNlciBjdHgsIGNvbnN0IHNlcDo6QkYgJiBhcmdNYWNoaW5lLCBzZXA6OkJGQ29kZSAmIGFjKQoreworICAgIEFOVExSM19VSU5UMzIgYWN0aXZpdHlfbWFjaGluZV9wYXJhbV9yZXR1cm5fU3RhcnRJbmRleDsKKworICAgIGZtbFBhcnNlcl9sYWJlbGxlZF9hcmd1bWVudF9yZXR1cm4gbHA7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2xwCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9scCBmbWxQYXJzZXJfbGFiZWxsZWRfYXJndW1lbnRfcmV0dXJuCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgYWN0aXZpdHlfbWFjaGluZV9wYXJhbV9yZXR1cm5fU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworCisgICAgCXNlcDo6TWFjaGluZSAqIG1hY2hpbmUgPSBhcmdNYWNoaW5lLmlzPCBzZXA6Ok1hY2hpbmUgPigpID8KKyAgICAJCQlhcmdNYWNoaW5lLnRvX3B0cjwgc2VwOjpNYWNoaW5lID4oKSA6IE5VTEw7CisKKyAgICAJc2VwOjpSb3V0aW5lICogcm91dGluZSA9IE5VTEw7CisKKyAgICAJc2VwOjphdm1fc2l6ZV90IHBhcmFtQ291bnQgPSAwOworICAgIAlzZXA6OmF2bV9zaXplX3QgcmV0dXJuQ291bnQgPSAwOworICAgIAlpZiggbWFjaGluZSA9PSBOVUxMICkKKyAgICAJeworICAgIAkJcm91dGluZSA9IE5VTEw7CisgICAgCX0KKyAgICAJZWxzZSBpZiggbWFjaGluZS0+Z2V0U3BlY2lmaWVyKCkuaXNEZXNpZ25JbnN0YW5jZVN0YXRpYygpCisgICAgCQkJJiYgbWFjaGluZS0+Z2V0VHlwZSgpLmlzPCBzZXA6Ok1hY2hpbmUgPigpICkKKyAgICAJeworICAgIAkJcm91dGluZSA9ICYoIG1hY2hpbmUtPmdldFR5cGUoKS50b19wdHI8IHNlcDo6TWFjaGluZSA+KCktPgorICAgIAkJCWdldEJlaGF2aW9yKCktPmdldEFjdGl2aXR5KCBhYy0+Z2V0QXZtT3BDb2RlKCkgKSApOworICAgIAl9CisgICAgCWVsc2UgaWYoIGFjLT5pc25vdE9wQ29kZSggc2VwOjpBVk1fT1BDT0RFX0lOVk9LRV9ORVcgKSApCisgICAgLy8JaWYoIG1hY2hpbmUtPmlzRGVzaWduUHJvdG90eXBlU3RhdGljKCkgKQorICAgIAl7CisgICAgCQlyb3V0aW5lID0gJiggbWFjaGluZS0+Z2V0QmVoYXZpb3IoKS0+CisgICAgCQkJCWdldEFjdGl2aXR5KCBhYy0+Z2V0QXZtT3BDb2RlKCkgKSApOworICAgIAl9CisKKyAgICAJaWYoIHJvdXRpbmUgIT0gTlVMTCApCisgICAgCXsKKyAgICAJCXBhcmFtQ291bnQgID0gcm91dGluZS0+Z2V0UGFyYW1ldGVycygpLnNpemUoKTsKKyAgICAJCXJldHVybkNvdW50ID0gcm91dGluZS0+Z2V0UmV0dXJucygpLnNpemUoKTsKKyAgICAJfQorCisKKyAgICAJc2VwOjpCRlZlY3RvciBsYWJlbGxlZFBhcmFtcyggcGFyYW1Db3VudCApOworICAgIAlzZXA6OkJGTGlzdCBwb3NpdGlvbmFsUGFyYW1zOworCisgICAgCXNlcDo6QkZWZWN0b3IgbGFiZWxsZWRSZXR1cm5zKCByZXR1cm5Db3VudCApOworICAgIAlzZXA6OkJGTGlzdCBwb3NpdGlvbmFsUmV0dXJuczsKKworICAgIAlpZiggbWFjaGluZSAhPSBOVUxMICkKKyAgICAJeworICAgIAkJUFVTSF9DVFhfQ1BNKCBtYWNoaW5lICk7CisgICAgCX0KKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoOTYpKSApCisgICAgeworICAgICAgICB7CisKKyAgICAgICAgICAgIAlpZiggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCXNlcDo6UGFyc2VyVXRpbDo6Y29tcHV0ZUFjdGl2aXR5Um91dGluZVBhcmFtUmV0dXJuKGFyZ01hY2hpbmUsIHJvdXRpbmUsIGFjLAorICAgICAgICAgICAgCQkJbGFiZWxsZWRQYXJhbXMgLCBwb3NpdGlvbmFsUGFyYW1zLCBsYWJlbGxlZFJldHVybnMsIHBvc2l0aW9uYWxSZXR1cm5zKTsKKyAgICAgICAgICAgIAl9CisKKyAgICAgICAgICAgIAlpZiggbWFjaGluZSAhPSBOVUxMICkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCVBPUF9DVFg7CisgICAgICAgICAgICAJfQorCisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyODMxOjI6ICggTFBBUkVOIChscD0gbGFiZWxsZWRfYXJndW1lbnQgKCBDT01NQSBscD0gbGFiZWxsZWRfYXJndW1lbnQgKSogKT8gUlBBUkVOICggKCAnLS0+JyB8ICdyZXR1cm5zOicgKSAoIExQQVJFTiBscD0gbGFiZWxsZWRfYXJndW1lbnQgKCBDT01NQSBscD0gbGFiZWxsZWRfYXJndW1lbnQgKSogUlBBUkVOIHxscD0gbGFiZWxsZWRfYXJndW1lbnQgKSApPyApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI4MzE6NDogTFBBUkVOIChscD0gbGFiZWxsZWRfYXJndW1lbnQgKCBDT01NQSBscD0gbGFiZWxsZWRfYXJndW1lbnQgKSogKT8gUlBBUkVOICggKCAnLS0+JyB8ICdyZXR1cm5zOicgKSAoIExQQVJFTiBscD0gbGFiZWxsZWRfYXJndW1lbnQgKCBDT01NQSBscD0gbGFiZWxsZWRfYXJndW1lbnQgKSogUlBBUkVOIHxscD0gbGFiZWxsZWRfYXJndW1lbnQgKSApPworICAgICAgICB7CisgICAgICAgICAgICAgTUFUQ0hUKExQQVJFTiwgJkZPTExPV19MUEFSRU5faW5fYWN0aXZpdHlfbWFjaGluZV9wYXJhbV9yZXR1cm44MTgyKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlYWN0aXZpdHlfbWFjaGluZV9wYXJhbV9yZXR1cm5FeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI4MzI6NDogKGxwPSBsYWJlbGxlZF9hcmd1bWVudCAoIENPTU1BIGxwPSBsYWJlbGxlZF9hcmd1bWVudCApKiApPworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQyMzI9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEJOT1Q6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT054MjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyTGl0ZXJhbDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBERUNSOgorICAgICAgICAgICAgICAgICAgICBjYXNlIERPTExBUl9MQ1VSTFk6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRmxvYXRMaXRlcmFsOgorICAgICAgICAgICAgICAgICAgICBjYXNlIElEOgorICAgICAgICAgICAgICAgICAgICBjYXNlIElOQ1I6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSW50ZWdlckxpdGVyYWw6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTEJSQUNLRVQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTEJSQUNLRVRfQkFSOgorICAgICAgICAgICAgICAgICAgICBjYXNlIExDVVJMWToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMTk9UOgorICAgICAgICAgICAgICAgICAgICBjYXNlIExQQVJFTjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMUEFSRU5fSU5WT0tFOgorICAgICAgICAgICAgICAgICAgICBjYXNlIE1JTlVTOgorICAgICAgICAgICAgICAgICAgICBjYXNlIE9QX1BPUDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPUF9UT1A6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUEVSQ0VOVF9MQ1VSTFk6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUExVUzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSYXRpb25hbExpdGVyYWw6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU3RyaW5nTGl0ZXJhbDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTg6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU5OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDE2MDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjE6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTYyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDIzNzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNTY6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjY1OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDI3NzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyODA6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjk0OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDMxMzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzMzA6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzMxOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDMzMjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzNDM6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzQ3OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM3MjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzOTc6CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJYWx0MjMyPTE7CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDIzMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyODMyOjY6IGxwPSBsYWJlbGxlZF9hcmd1bWVudCAoIENPTU1BIGxwPSBsYWJlbGxlZF9hcmd1bWVudCApKgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9hY3Rpdml0eV9tYWNoaW5lX3BhcmFtX3JldHVybjgxOTMpOworICAgICAgICAgICAgCSAgICAgICAgbHA9bGFiZWxsZWRfYXJndW1lbnQoY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWFjdGl2aXR5X21hY2hpbmVfcGFyYW1fcmV0dXJuRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIAlzZXA6OlBhcnNlclV0aWw6OmFwcGVuZFJvdXRpbmVQYXJhbWV0ZXJzKHJvdXRpbmUsIGxwLmxhYmVsCisgICAgICAgICAgICAJICAgICAgICAgICAgLAorICAgICAgICAgICAgCSAgICAgICAgICAgIAkJCQkJbGFiZWxsZWRQYXJhbXMsIHBvc2l0aW9uYWxQYXJhbXMsIGxwLmFyZworICAgICAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyODM3OjY6ICggQ09NTUEgbHA9IGxhYmVsbGVkX2FyZ3VtZW50ICkqCisKKyAgICAgICAgICAgIAkgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDIzMT0yOworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBDT01NQToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJYWx0MjMxPTE7CisgICAgICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDIzMSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyODM3Ojg6IENPTU1BIGxwPSBsYWJlbGxlZF9hcmd1bWVudAorICAgICAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKENPTU1BLCAmRk9MTE9XX0NPTU1BX2luX2FjdGl2aXR5X21hY2hpbmVfcGFyYW1fcmV0dXJuODIwOSk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWFjdGl2aXR5X21hY2hpbmVfcGFyYW1fcmV0dXJuRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9hY3Rpdml0eV9tYWNoaW5lX3BhcmFtX3JldHVybjgyMTgpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgbHA9bGFiZWxsZWRfYXJndW1lbnQoY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWFjdGl2aXR5X21hY2hpbmVfcGFyYW1fcmV0dXJuRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgIAlzZXA6OlBhcnNlclV0aWw6OmFwcGVuZFJvdXRpbmVQYXJhbWV0ZXJzKHJvdXRpbmUsIGxwLmxhYmVsCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgLAorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkJCQkJbGFiZWxsZWRQYXJhbXMsIHBvc2l0aW9uYWxQYXJhbXMsIGxwLmFyZworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAgICAgCSAgICAgICAgCSAgICBnb3RvIGxvb3AyMzE7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBsb29wMjMxOiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgTUFUQ0hUKFJQQVJFTiwgJkZPTExPV19SUEFSRU5faW5fYWN0aXZpdHlfbWFjaGluZV9wYXJhbV9yZXR1cm44MjQ0KTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlYWN0aXZpdHlfbWFjaGluZV9wYXJhbV9yZXR1cm5FeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI4NDc6MjogKCAoICctLT4nIHwgJ3JldHVybnM6JyApICggTFBBUkVOIGxwPSBsYWJlbGxlZF9hcmd1bWVudCAoIENPTU1BIGxwPSBsYWJlbGxlZF9hcmd1bWVudCApKiBSUEFSRU4gfGxwPSBsYWJlbGxlZF9hcmd1bWVudCApICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDIzNT0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTYzOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM2NToKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQyMzU9MTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MjM1KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI4NDc6NDogKCAnLS0+JyB8ICdyZXR1cm5zOicgKSAoIExQQVJFTiBscD0gbGFiZWxsZWRfYXJndW1lbnQgKCBDT01NQSBscD0gbGFiZWxsZWRfYXJndW1lbnQgKSogUlBBUkVOIHxscD0gbGFiZWxsZWRfYXJndW1lbnQgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBpZiAoIExBKDEpID09IDE2MyB8fCBMQSgxKSA9PSAzNjUgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIENPTlNVTUUoKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBQRVJST1JSRUNPVkVSWT1BTlRMUjNfRkFMU0U7CisgICAgICAgICAgICAJICAgICAgICAgICAgRkFJTEVERkxBRz1BTlRMUjNfRkFMU0U7CisKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGVsc2UKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19NSVNNQVRDSEVEX1NFVF9FWENFUFRJT047CisgICAgICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT5uYW1lICAgICAgICAgPSAodm9pZCAqKUFOVExSM19NSVNNQVRDSEVEX1NFVF9OQU1FOworICAgICAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+ZXhwZWN0aW5nU2V0ID0gTlVMTDsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWFjdGl2aXR5X21hY2hpbmVfcGFyYW1fcmV0dXJuRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mjg0ODo0OiAoIExQQVJFTiBscD0gbGFiZWxsZWRfYXJndW1lbnQgKCBDT01NQSBscD0gbGFiZWxsZWRfYXJndW1lbnQgKSogUlBBUkVOIHxscD0gbGFiZWxsZWRfYXJndW1lbnQgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQyMzQ9MjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgTFBBUkVOOgorICAgICAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQkgICAgaW50IExBMjM0XzEgPSBMQSgyKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCSAgICBpZiAoIChzeW5wcmVkNDE3X2ZtbChjdHgpKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQkgICAgICAgIGFsdDIzND0xOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCSAgICBlbHNlIGlmICggKEFOVExSM19UUlVFKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQkgICAgICAgIGFsdDIzND0yOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCSAgICBlbHNlCisgICAgICAgICAgICAJICAgICAgICAgICAgCQkgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAJICAgICAgICAgICAgCQkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCSAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgCQkgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQkgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQkgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMjM0OworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDE7CisKKworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgICAgICBnb3RvIHJ1bGVhY3Rpdml0eV9tYWNoaW5lX3BhcmFtX3JldHVybkV4OworCisgICAgICAgICAgICAJICAgICAgICAgICAgCQkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgQk5PVDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIENPTE9OeDI6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBDaGFyTGl0ZXJhbDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIERFQ1I6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBET0xMQVJfTENVUkxZOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgRmxvYXRMaXRlcmFsOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgSUQ6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBJTkNSOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgSW50ZWdlckxpdGVyYWw6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBMQlJBQ0tFVDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIExCUkFDS0VUX0JBUjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIExDVVJMWToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIExOT1Q6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBMUEFSRU5fSU5WT0tFOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgTUlOVVM6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBPUF9QT1A6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBPUF9UT1A6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBQRVJDRU5UX0xDVVJMWToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIFBMVVM6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBSYXRpb25hbExpdGVyYWw6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBTdHJpbmdMaXRlcmFsOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMTU4OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMTU5OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMTYwOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMTYxOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMTYyOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjM3OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjU2OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjY1OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjc3OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjgwOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjk0OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzEzOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzMwOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzMxOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzMyOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzQzOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzQ3OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzcyOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzk3OgorICAgICAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQlhbHQyMzQ9MjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMjM0OworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVhY3Rpdml0eV9tYWNoaW5lX3BhcmFtX3JldHVybkV4OworCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQyMzQpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mjg0ODo2OiBMUEFSRU4gbHA9IGxhYmVsbGVkX2FyZ3VtZW50ICggQ09NTUEgbHA9IGxhYmVsbGVkX2FyZ3VtZW50ICkqIFJQQVJFTgorICAgICAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKExQQVJFTiwgJkZPTExPV19MUEFSRU5faW5fYWN0aXZpdHlfbWFjaGluZV9wYXJhbV9yZXR1cm44MjY1KTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlYWN0aXZpdHlfbWFjaGluZV9wYXJhbV9yZXR1cm5FeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2xhYmVsbGVkX2FyZ3VtZW50X2luX2FjdGl2aXR5X21hY2hpbmVfcGFyYW1fcmV0dXJuODI3NCk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBscD1sYWJlbGxlZF9hcmd1bWVudChjdHgpOworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlYWN0aXZpdHlfbWFjaGluZV9wYXJhbV9yZXR1cm5FeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgCXNlcDo6UGFyc2VyVXRpbDo6YXBwZW5kUm91dGluZVJldHVybnMocm91dGluZSwgbHAubGFiZWwKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAsCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCQkJCQlsYWJlbGxlZFJldHVybnMsIHBvc2l0aW9uYWxSZXR1cm5zLCBscC5hcmcKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICApOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mjg1NDo2OiAoIENPTU1BIGxwPSBsYWJlbGxlZF9hcmd1bWVudCApKgorCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBmb3IgKDs7KQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQyMzM9MjsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGNhc2UgQ09NTUE6CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJCWFsdDIzMz0xOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQyMzMpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mjg1NDo4OiBDT01NQSBscD0gbGFiZWxsZWRfYXJndW1lbnQKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChDT01NQSwgJkZPTExPV19DT01NQV9pbl9hY3Rpdml0eV9tYWNoaW5lX3BhcmFtX3JldHVybjgyOTApOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVhY3Rpdml0eV9tYWNoaW5lX3BhcmFtX3JldHVybkV4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5fYWN0aXZpdHlfbWFjaGluZV9wYXJhbV9yZXR1cm44MzAxKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGxwPWxhYmVsbGVkX2FyZ3VtZW50KGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVhY3Rpdml0eV9tYWNoaW5lX3BhcmFtX3JldHVybkV4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAJc2VwOjpQYXJzZXJVdGlsOjphcHBlbmRSb3V0aW5lUmV0dXJucyhyb3V0aW5lLCBscC5sYWJlbAorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICwKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJCQkJCWxhYmVsbGVkUmV0dXJucywgcG9zaXRpb25hbFJldHVybnMsIGxwLmFyZworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgIAorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCWRlZmF1bHQ6CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIGdvdG8gbG9vcDIzMzsJLyogYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGxvb3AyMzM6IDsgLyogSnVtcCBvdXQgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKFJQQVJFTiwgJkZPTExPV19SUEFSRU5faW5fYWN0aXZpdHlfbWFjaGluZV9wYXJhbV9yZXR1cm44MzI1KTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlYWN0aXZpdHlfbWFjaGluZV9wYXJhbV9yZXR1cm5FeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDI6CisgICAgICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI4NjM6NjogbHA9IGxhYmVsbGVkX2FyZ3VtZW50CisgICAgICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2xhYmVsbGVkX2FyZ3VtZW50X2luX2FjdGl2aXR5X21hY2hpbmVfcGFyYW1fcmV0dXJuODMzNSk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBscD1sYWJlbGxlZF9hcmd1bWVudChjdHgpOworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlYWN0aXZpdHlfbWFjaGluZV9wYXJhbV9yZXR1cm5FeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgCXNlcDo6UGFyc2VyVXRpbDo6YXBwZW5kUm91dGluZVJldHVybnMocm91dGluZSwgbHAubGFiZWwKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAsCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCQkJCQlsYWJlbGxlZFJldHVybnMsIHBvc2l0aW9uYWxSZXR1cm5zLCBscC5hcmcKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICApOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlYWN0aXZpdHlfbWFjaGluZV9wYXJhbV9yZXR1cm5FeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVhY3Rpdml0eV9tYWNoaW5lX3BhcmFtX3JldHVybkV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICAJaWYoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJc2VwOjpQYXJzZXJVdGlsOjpjb21wdXRlQWN0aXZpdHlSb3V0aW5lUGFyYW1SZXR1cm4oYXJnTWFjaGluZSwgcm91dGluZSwgYWMsCisgICAgICAgICAgICAgICAgICAgIAkJCWxhYmVsbGVkUGFyYW1zICwgcG9zaXRpb25hbFBhcmFtcywgbGFiZWxsZWRSZXR1cm5zLCBwb3NpdGlvbmFsUmV0dXJucyk7CisgICAgICAgICAgICAgICAgICAgIAl9CisKKyAgICAgICAgICAgICAgICAgICAgCWlmKCBtYWNoaW5lICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCVBPUF9DVFg7CisgICAgICAgICAgICAgICAgICAgIAl9CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKworICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoOTYsIGFjdGl2aXR5X21hY2hpbmVfcGFyYW1fcmV0dXJuX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBhY3Rpdml0eV9tYWNoaW5lX3BhcmFtX3JldHVybiAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBkZWNsX3BvcnQKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI4Nzk6MTogZGVjbF9wb3J0WyBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSAsIHNlcDo6TW9kaWZpZXIgbWRmciBdIDogJ3BvcnQnIGRlY2xfcG9ydF9pbXBsWyBkZWNsUHJvcGVydHkgLCBtZGZyLCBuYXR1cmUgXSA7CisgKi8KK3N0YXRpYyB2b2lkCitkZWNsX3BvcnQocGZtbFBhcnNlciBjdHgsIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5LCBzZXA6Ok1vZGlmaWVyIG1kZnIpCit7CisgICAgQU5UTFIzX1VJTlQzMiBkZWNsX3BvcnRfU3RhcnRJbmRleDsKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBkZWNsX3BvcnRfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworCisgICAgCXNlcDo6SUNvbVBvaW50OjpFTlVNX0lPX05BVFVSRSBuYXR1cmUgPSBzZXA6OklDb21Qb2ludDo6SU9fVU5ERUZJTkVEX05BVFVSRTsKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoOTcpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI4ODQ6MjogKCAncG9ydCcgZGVjbF9wb3J0X2ltcGxbIGRlY2xQcm9wZXJ0eSAsIG1kZnIsIG5hdHVyZSBdICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mjg4NDo0OiAncG9ydCcgZGVjbF9wb3J0X2ltcGxbIGRlY2xQcm9wZXJ0eSAsIG1kZnIsIG5hdHVyZSBdCisgICAgICAgIHsKKyAgICAgICAgICAgICBNQVRDSFQoMzQ0LCAmRk9MTE9XXzM0NF9pbl9kZWNsX3BvcnQ4Mzc2KTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZGVjbF9wb3J0RXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIG5hdHVyZSA9IHNlcDo6SUNvbVBvaW50OjpJT19QT1JUX05BVFVSRTsgCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVjbF9wb3J0X2ltcGxfaW5fZGVjbF9wb3J0ODM4Nik7CisgICAgICAgICAgICBkZWNsX3BvcnRfaW1wbChjdHgsIGRlY2xQcm9wZXJ0eSwgbWRmciwgbmF0dXJlKTsKKworICAgICAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfcG9ydEV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVkZWNsX3BvcnRFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVkZWNsX3BvcnRFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDk3LCBkZWNsX3BvcnRfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGRlY2xfcG9ydCAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBkZWNsX3BvcnRfaW1wbAorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mjg4OToxOiBkZWNsX3BvcnRfaW1wbFsgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHkgLCBzZXA6Ok1vZGlmaWVyIG1kZnIgLFxuXHRcdHNlcDo6SUNvbVBvaW50OjpFTlVNX0lPX05BVFVSRSBuYXR1cmUgXSA6ICggKCBJRCApPT5pZD0gSUQgKCB0eXBlX3BhcmFtX2NvbVsgcG9ydCBdICk/IFNFTUkgfCBtb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0WyBtZGZyIF0gKGlkPSBJRCAoIHR5cGVfcGFyYW1fY29tWyBwb3J0IF0gKT8gU0VNSSB8IExDVVJMWSAoaWQ9IElEICggdHlwZV9wYXJhbV9jb21bIHBvcnQgXSApPyBTRU1JICkrIFJDVVJMWSApIHwgTENVUkxZICggKCBJRCApPT5pZD0gSUQgKCB0eXBlX3BhcmFtX2NvbVsgcG9ydCBdICk/IFNFTUkgfCBtb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0WyBtZGZyIF0gaWQ9IElEICggdHlwZV9wYXJhbV9jb21bIHBvcnQgXSApPyBTRU1JICkrIFJDVVJMWSApOworICovCitzdGF0aWMgdm9pZAorZGVjbF9wb3J0X2ltcGwocGZtbFBhcnNlciBjdHgsIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5LCBzZXA6Ok1vZGlmaWVyIG1kZnIsIHNlcDo6SUNvbVBvaW50OjpFTlVNX0lPX05BVFVSRSBuYXR1cmUpCit7CisgICAgQU5UTFIzX1VJTlQzMiBkZWNsX3BvcnRfaW1wbF9TdGFydEluZGV4OworCisgICAgcEFOVExSM19DT01NT05fVE9LRU4gICAgaWQ7CisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgZGVjbF9wb3J0X2ltcGxfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworCisgICAgCXNlcDo6UG9ydCAqIHBvcnQ7CisgICAgCXNlcDo6QkYgVFBvcnQ7CisgICAgCWJvb2wgaXNhVHlwZSA9IHRydWU7CisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDk4KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgaWQgICAgICAgPSBOVUxMOworCisgICAgeworICAgICAgICB7CisgICAgICAgICAgICAvLyAgL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mjg5NzoyOiAoICggSUQgKT0+aWQ9IElEICggdHlwZV9wYXJhbV9jb21bIHBvcnQgXSApPyBTRU1JIHwgbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dFsgbWRmciBdIChpZD0gSUQgKCB0eXBlX3BhcmFtX2NvbVsgcG9ydCBdICk/IFNFTUkgfCBMQ1VSTFkgKGlkPSBJRCAoIHR5cGVfcGFyYW1fY29tWyBwb3J0IF0gKT8gU0VNSSApKyBSQ1VSTFkgKSB8IExDVVJMWSAoICggSUQgKT0+aWQ9IElEICggdHlwZV9wYXJhbV9jb21bIHBvcnQgXSApPyBTRU1JIHwgbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dFsgbWRmciBdIGlkPSBJRCAoIHR5cGVfcGFyYW1fY29tWyBwb3J0IF0gKT8gU0VNSSApKyBSQ1VSTFkgKQorCisgICAgICAgICAgICBBTlRMUjNfVUlOVDMyIGFsdDI0NDsKKworICAgICAgICAgICAgYWx0MjQ0PTM7CisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgTEEyNDRfMCA9IExBKDEpOworICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQ0MTlfZm1sKGN0eCkpICYmIChMQTI0NF8wID09IElEKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFsdDI0ND0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjQ0XzAgPT0gMjk4IHx8IExBMjQ0XzAgPT0gMzA1IHx8IExBMjQ0XzAgPT0gMzQxIHx8IExBMjQ0XzAgPT0gMzY0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFsdDI0ND0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjQ0XzAgPT0gTENVUkxZKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFsdDI0ND0zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMjQ0OworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX3BvcnRfaW1wbEV4OworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQyNDQpCisgICAgICAgICAgICB7CisgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mjg5Nzo0OiAoIElEICk9PmlkPSBJRCAoIHR5cGVfcGFyYW1fY29tWyBwb3J0IF0gKT8gU0VNSQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgaWQgPSAocEFOVExSM19DT01NT05fVE9LRU4pIE1BVENIVChJRCwgJkZPTExPV19JRF9pbl9kZWNsX3BvcnRfaW1wbDg0MTYpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX3BvcnRfaW1wbEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisKKyAgICAgICAgCSAgICAgICAgICAgIAkJZGVjbFByb3BlcnR5LmFwcGVuZFBvcnQoIHNlcDo6QkYoCisgICAgICAgIAkgICAgICAgICAgICAJCQkJcG9ydCA9IG5ldyBzZXA6OlBvcnQoZGVjbFByb3BlcnR5LAorICAgICAgICAJICAgICAgICAgICAgCQkJCQkJU1RSKChpZC0+Z2V0VGV4dChpZCkpLT5jaGFycyksIG5hdHVyZSwKKyAgICAgICAgCSAgICAgICAgICAgIAkJCQkJCW1kZnIuc2V0RGlyZWN0aW9uSW5vdXRFbHNlKCkgKSApICk7CisgICAgICAgIAkgICAgICAgICAgICAJICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjkwNDo0OiAoIHR5cGVfcGFyYW1fY29tWyBwb3J0IF0gKT8KKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDIzNj0yOworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgTFBBUkVOOgorICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQlhbHQyMzY9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQyMzYpCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjkwNDo2OiB0eXBlX3BhcmFtX2NvbVsgcG9ydCBdCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV190eXBlX3BhcmFtX2NvbV9pbl9kZWNsX3BvcnRfaW1wbDg0MjgpOworICAgICAgICAJICAgICAgICAJICAgICAgICB0eXBlX3BhcmFtX2NvbShjdHgsIHBvcnQpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX3BvcnRfaW1wbEV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICBNQVRDSFQoU0VNSSwgJkZPTExPV19TRU1JX2luX2RlY2xfcG9ydF9pbXBsODQzNSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfcG9ydF9pbXBsRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyOTA2OjQ6IG1vZGlmaWVyX3NldF9kaXJlY3Rpb25fc3RyaWN0X3RleHRbIG1kZnIgXSAoaWQ9IElEICggdHlwZV9wYXJhbV9jb21bIHBvcnQgXSApPyBTRU1JIHwgTENVUkxZIChpZD0gSUQgKCB0eXBlX3BhcmFtX2NvbVsgcG9ydCBdICk/IFNFTUkgKSsgUkNVUkxZICkKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX21vZGlmaWVyX3NldF9kaXJlY3Rpb25fc3RyaWN0X3RleHRfaW5fZGVjbF9wb3J0X2ltcGw4NDQxKTsKKyAgICAgICAgCSAgICAgICAgbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dChjdHgsIG1kZnIpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX3BvcnRfaW1wbEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjkwNzo0OiAoaWQ9IElEICggdHlwZV9wYXJhbV9jb21bIHBvcnQgXSApPyBTRU1JIHwgTENVUkxZIChpZD0gSUQgKCB0eXBlX3BhcmFtX2NvbVsgcG9ydCBdICk/IFNFTUkgKSsgUkNVUkxZICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDI0MD0yOworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAJCWFsdDI0MD0xOworICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgTENVUkxZOgorICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgIAkJYWx0MjQwPTI7CisgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAJICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDI0MDsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfcG9ydF9pbXBsRXg7CisKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQyNDApCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjkwNzo2OiBpZD0gSUQgKCB0eXBlX3BhcmFtX2NvbVsgcG9ydCBdICk/IFNFTUkKKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlkID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoSUQsICZGT0xMT1dfSURfaW5fZGVjbF9wb3J0X2ltcGw4NDUxKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVjbF9wb3J0X2ltcGxFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJCQlkZWNsUHJvcGVydHkuYXBwZW5kUG9ydCggc2VwOjpCRigKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkJICAJCQlwb3J0ID0gbmV3IHNlcDo6UG9ydChkZWNsUHJvcGVydHksCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJCSAgCQkJCQlTVFIoKGlkLT5nZXRUZXh0KGlkKSktPmNoYXJzKSwgbmF0dXJlLCBtZGZyICkgKSApOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCQkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjkxMzozOiAoIHR5cGVfcGFyYW1fY29tWyBwb3J0IF0gKT8KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDIzNz0yOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgTFBBUkVOOgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgCQlhbHQyMzc9MTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQyMzcpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjkxMzo1OiB0eXBlX3BhcmFtX2NvbVsgcG9ydCBdCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV190eXBlX3BhcmFtX2NvbV9pbl9kZWNsX3BvcnRfaW1wbDg0NjEpOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB0eXBlX3BhcmFtX2NvbShjdHgsIHBvcnQpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX3BvcnRfaW1wbEV4OworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoU0VNSSwgJkZPTExPV19TRU1JX2luX2RlY2xfcG9ydF9pbXBsODQ2OCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfcG9ydF9pbXBsRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyOTE1OjY6IExDVVJMWSAoaWQ9IElEICggdHlwZV9wYXJhbV9jb21bIHBvcnQgXSApPyBTRU1JICkrIFJDVVJMWQorICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChMQ1VSTFksICZGT0xMT1dfTENVUkxZX2luX2RlY2xfcG9ydF9pbXBsODQ3Nik7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfcG9ydF9pbXBsRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyOTE2OjU6IChpZD0gSUQgKCB0eXBlX3BhcmFtX2NvbVsgcG9ydCBdICk/IFNFTUkgKSsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaW50IGNudDIzOT0wOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBmb3IgKDs7KQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIGludCBhbHQyMzk9MjsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCXN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCWNhc2UgSUQ6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkJeworICAgICAgICAJICAgICAgICAJICAgICAgICAJCQlhbHQyMzk9MTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCQl9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCX0KKworICAgICAgICAJICAgICAgICAJICAgICAgICAJc3dpdGNoIChhbHQyMzkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyOTE2Ojc6IGlkPSBJRCAoIHR5cGVfcGFyYW1fY29tWyBwb3J0IF0gKT8gU0VNSQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpZCA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTikgTUFUQ0hUKElELCAmRk9MTE9XX0lEX2luX2RlY2xfcG9ydF9pbXBsODQ4Nik7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfcG9ydF9pbXBsRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAJICAgIAlkZWNsUHJvcGVydHkuYXBwZW5kUG9ydCggc2VwOjpCRigKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAJICAgIAkJCXBvcnQgPSBuZXcgc2VwOjpQb3J0KGRlY2xQcm9wZXJ0eSwKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAJICAgIAkJCQkJU1RSKChpZC0+Z2V0VGV4dChpZCkpLT5jaGFycyksIG5hdHVyZSwgbWRmcikgKSApOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIAkgICAgICAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyOTIyOjg6ICggdHlwZV9wYXJhbV9jb21bIHBvcnQgXSApPworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIGludCBhbHQyMzg9MjsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgICAgICBjYXNlIExQQVJFTjoKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgCQlhbHQyMzg9MTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MjM4KQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI5MjI6MTA6IHR5cGVfcGFyYW1fY29tWyBwb3J0IF0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfdHlwZV9wYXJhbV9jb21faW5fZGVjbF9wb3J0X2ltcGw4NTA2KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIHR5cGVfcGFyYW1fY29tKGN0eCwgcG9ydCk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX3BvcnRfaW1wbEV4OworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgTUFUQ0hUKFNFTUksICZGT0xMT1dfU0VNSV9pbl9kZWNsX3BvcnRfaW1wbDg1MTMpOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX3BvcnRfaW1wbEV4OworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgZGVmYXVsdDoKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJCWlmICggY250MjM5ID49IDEgKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJCXsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCQkgICAgZ290byBsb29wMjM5OworICAgICAgICAJICAgICAgICAJICAgICAgICAJCX0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCQlpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkJeworICAgICAgICAJICAgICAgICAJICAgICAgICAJCSAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkJICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkJfQorCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkJLyogbWlzbWF0Y2hlZFNldEV4KCkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCQkgKi8KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCQlDT05TVFJVQ1RFWCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICAJCUVYQ0VQVElPTi0+dHlwZSA9IEFOVExSM19FQVJMWV9FWElUX0VYQ0VQVElPTjsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCQlFWENFUFRJT04tPm5hbWUgPSAodm9pZCAqKUFOVExSM19FQVJMWV9FWElUX05BTUU7CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJCWdvdG8gcnVsZWRlY2xfcG9ydF9pbXBsRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAljbnQyMzkrKzsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGxvb3AyMzk6IDsJLyogSnVtcCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChSQ1VSTFksICZGT0xMT1dfUkNVUkxZX2luX2RlY2xfcG9ydF9pbXBsODUyMyk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfcG9ydF9pbXBsRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDM6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjkyNjo0OiBMQ1VSTFkgKCAoIElEICk9PmlkPSBJRCAoIHR5cGVfcGFyYW1fY29tWyBwb3J0IF0gKT8gU0VNSSB8IG1vZGlmaWVyX3NldF9kaXJlY3Rpb25fc3RyaWN0X3RleHRbIG1kZnIgXSBpZD0gSUQgKCB0eXBlX3BhcmFtX2NvbVsgcG9ydCBdICk/IFNFTUkgKSsgUkNVUkxZCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKExDVVJMWSwgJkZPTExPV19MQ1VSTFlfaW5fZGVjbF9wb3J0X2ltcGw4NTMzKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVjbF9wb3J0X2ltcGxFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI5Mjc6NDogKCAoIElEICk9PmlkPSBJRCAoIHR5cGVfcGFyYW1fY29tWyBwb3J0IF0gKT8gU0VNSSB8IG1vZGlmaWVyX3NldF9kaXJlY3Rpb25fc3RyaWN0X3RleHRbIG1kZnIgXSBpZD0gSUQgKCB0eXBlX3BhcmFtX2NvbVsgcG9ydCBdICk/IFNFTUkgKSsKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaW50IGNudDI0Mz0wOworCisgICAgICAgIAkgICAgICAgICAgICBmb3IgKDs7KQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgIGludCBhbHQyNDM9MzsKKyAgICAgICAgCSAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgCSAgIC8qIGRmYUxvb3BiYWNrU3RhdGUoayxlZGdlcyxlb3RQcmVkaWN0c0FsdCxkZXNjcmlwdGlvbixzdGF0ZU51bWJlcixzZW1QcmVkU3RhdGUpCisgICAgICAgIAkgICAgICAgIAkgICAgKi8KKyAgICAgICAgCSAgICAgICAgCSAgICBpbnQgTEEyNDNfMCA9IExBKDEpOworICAgICAgICAJICAgICAgICAJICAgIGlmICggKHN5bnByZWQ0MjZfZm1sKGN0eCkpICYmIChMQTI0M18wID09IElEKSkKKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGFsdDI0Mz0xOworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBlbHNlIGlmICggKExBMjQzXzAgPT0gMjk4IHx8IExBMjQzXzAgPT0gMzA1IHx8IExBMjQzXzAgPT0gMzQxIHx8IExBMjQzXzAgPT0gMzY0KSkKKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGFsdDI0Mz0yOworICAgICAgICAJICAgICAgICAJICAgIH0KKworICAgICAgICAJICAgICAgICAJfQorICAgICAgICAJICAgICAgICAJc3dpdGNoIChhbHQyNDMpCisgICAgICAgIAkgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgIAkgICAgY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyOTI3OjY6ICggSUQgKT0+aWQ9IElEICggdHlwZV9wYXJhbV9jb21bIHBvcnQgXSApPyBTRU1JCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGlkID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoSUQsICZGT0xMT1dfSURfaW5fZGVjbF9wb3J0X2ltcGw4NTUxKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlZGVjbF9wb3J0X2ltcGxFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIAkJCWRlY2xQcm9wZXJ0eS5hcHBlbmRQb3J0KCBzZXA6OkJGKAorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIAkgICAgCQkJcG9ydCA9IG5ldyBzZXA6OlBvcnQoZGVjbFByb3BlcnR5LAorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIAkJCSAgICAJCQlTVFIoKGlkLT5nZXRUZXh0KGlkKSktPmNoYXJzKSwgbmF0dXJlLAorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIAkJCSAgICAJCQltZGZyLnNldERpcmVjdGlvbklub3V0RWxzZSgpICkgKSApOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIAkgIAkJcG9ydC0+c2V0TW9kaWZpZXIoIG1kZnIgKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAJICAgIAorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI5MzU6NjogKCB0eXBlX3BhcmFtX2NvbVsgcG9ydCBdICk/CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgaW50IGFsdDI0MT0yOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGNhc2UgTFBBUkVOOgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgICAgICAJCWFsdDI0MT0xOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQyNDEpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjkzNTo4OiB0eXBlX3BhcmFtX2NvbVsgcG9ydCBdCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3R5cGVfcGFyYW1fY29tX2luX2RlY2xfcG9ydF9pbXBsODU2Nyk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB0eXBlX3BhcmFtX2NvbShjdHgsIHBvcnQpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVjbF9wb3J0X2ltcGxFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIE1BVENIVChTRU1JLCAmRk9MTE9XX1NFTUlfaW5fZGVjbF9wb3J0X2ltcGw4NTc0KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlZGVjbF9wb3J0X2ltcGxFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCSAgICBjYXNlIDI6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI5Mzc6NjogbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dFsgbWRmciBdIGlkPSBJRCAoIHR5cGVfcGFyYW1fY29tWyBwb3J0IF0gKT8gU0VNSQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19tb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0X2luX2RlY2xfcG9ydF9pbXBsODU4Mik7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBtb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0KGN0eCwgbWRmcik7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX3BvcnRfaW1wbEV4OworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaWQgPSAocEFOVExSM19DT01NT05fVE9LRU4pIE1BVENIVChJRCwgJkZPTExPV19JRF9pbl9kZWNsX3BvcnRfaW1wbDg1ODcpOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX3BvcnRfaW1wbEV4OworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgCSAgICAJZGVjbFByb3BlcnR5LmFwcGVuZFBvcnQoIHNlcDo6QkYoCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgCSAgICAJCQlwb3J0ID0gbmV3IHNlcDo6UG9ydChkZWNsUHJvcGVydHksCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgCSAgICAJCQkJCVNUUigoaWQtPmdldFRleHQoaWQpKS0+Y2hhcnMpLCBuYXR1cmUsIG1kZnIpICkgKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAJICAgIAorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI5NDM6NjogKCB0eXBlX3BhcmFtX2NvbVsgcG9ydCBdICk/CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgaW50IGFsdDI0Mj0yOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGNhc2UgTFBBUkVOOgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgICAgICAJCWFsdDI0Mj0xOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQyNDIpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mjk0Mzo4OiB0eXBlX3BhcmFtX2NvbVsgcG9ydCBdCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3R5cGVfcGFyYW1fY29tX2luX2RlY2xfcG9ydF9pbXBsODYwMyk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB0eXBlX3BhcmFtX2NvbShjdHgsIHBvcnQpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVjbF9wb3J0X2ltcGxFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIE1BVENIVChTRU1JLCAmRk9MTE9XX1NFTUlfaW5fZGVjbF9wb3J0X2ltcGw4NjEwKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlZGVjbF9wb3J0X2ltcGxFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAJICAgIGRlZmF1bHQ6CisKKyAgICAgICAgCSAgICAgICAgCQlpZiAoIGNudDI0MyA+PSAxICkKKyAgICAgICAgCSAgICAgICAgCQl7CisgICAgICAgIAkgICAgICAgIAkJICAgIGdvdG8gbG9vcDI0MzsKKyAgICAgICAgCSAgICAgICAgCQl9CisgICAgICAgIAkgICAgICAgIAkJaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJICAgICAgICAJCXsKKyAgICAgICAgCSAgICAgICAgCQkgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAJICAgICAgICAJCSAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJCX0KKworICAgICAgICAJICAgICAgICAJCS8qIG1pc21hdGNoZWRTZXRFeCgpCisgICAgICAgIAkgICAgICAgIAkJICovCisgICAgICAgIAkgICAgICAgIAkJQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCSAgICAgICAgCQlFWENFUFRJT04tPnR5cGUgPSBBTlRMUjNfRUFSTFlfRVhJVF9FWENFUFRJT047CisgICAgICAgIAkgICAgICAgIAkJRVhDRVBUSU9OLT5uYW1lID0gKHZvaWQgKilBTlRMUjNfRUFSTFlfRVhJVF9OQU1FOworCisKKyAgICAgICAgCSAgICAgICAgCQlnb3RvIHJ1bGVkZWNsX3BvcnRfaW1wbEV4OworICAgICAgICAJICAgICAgICAJfQorICAgICAgICAJICAgICAgICAJY250MjQzKys7CisgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICBsb29wMjQzOiA7CS8qIEp1bXAgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKyAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICBNQVRDSFQoUkNVUkxZLCAmRk9MTE9XX1JDVVJMWV9pbl9kZWNsX3BvcnRfaW1wbDg2MjEpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX3BvcnRfaW1wbEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZWRlY2xfcG9ydF9pbXBsRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlZGVjbF9wb3J0X2ltcGxFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDk4LCBkZWNsX3BvcnRfaW1wbF9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgZGVjbF9wb3J0X2ltcGwgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgZGVjbF9zaWduYWwKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI5NTM6MTogZGVjbF9zaWduYWxbIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5ICwgc2VwOjpNb2RpZmllciBtZGZyIF0gOiAoICdzaWduYWwnIHwgJ21lc3NhZ2UnICkgZGVjbF9zaWduYWxfaW1wbFsgZGVjbFByb3BlcnR5ICwgbWRmciwgbmF0dXJlIF0gOworICovCitzdGF0aWMgdm9pZAorZGVjbF9zaWduYWwocGZtbFBhcnNlciBjdHgsIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5LCBzZXA6Ok1vZGlmaWVyIG1kZnIpCit7CisgICAgQU5UTFIzX1VJTlQzMiBkZWNsX3NpZ25hbF9TdGFydEluZGV4OworCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGRlY2xfc2lnbmFsX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKworICAgIAlzZXA6OklDb21Qb2ludDo6RU5VTV9JT19OQVRVUkUgbmF0dXJlID0gc2VwOjpJQ29tUG9pbnQ6OklPX1VOREVGSU5FRF9OQVRVUkU7CisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDk5KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyOTU4OjI6ICggKCAnc2lnbmFsJyB8ICdtZXNzYWdlJyApIGRlY2xfc2lnbmFsX2ltcGxbIGRlY2xQcm9wZXJ0eSAsIG1kZnIsIG5hdHVyZSBdICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mjk1ODo0OiAoICdzaWduYWwnIHwgJ21lc3NhZ2UnICkgZGVjbF9zaWduYWxfaW1wbFsgZGVjbFByb3BlcnR5ICwgbWRmciwgbmF0dXJlIF0KKyAgICAgICAgeworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mjk1ODo0OiAoICdzaWduYWwnIHwgJ21lc3NhZ2UnICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MjQ1PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDM3NDoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0MjQ1PTE7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzMjA6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDI0NT0yOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAyNDU7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfc2lnbmFsRXg7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDI0NSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyOTU4OjY6ICdzaWduYWwnCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoMzc0LCAmRk9MTE9XXzM3NF9pbl9kZWNsX3NpZ25hbDg2NDYpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX3NpZ25hbEV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBuYXR1cmUgPSBzZXA6OklDb21Qb2ludDo6SU9fU0lHTkFMX05BVFVSRTsgIAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDI6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI5NTk6NjogJ21lc3NhZ2UnCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoMzIwLCAmRk9MTE9XXzMyMF9pbl9kZWNsX3NpZ25hbDg2NTYpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX3NpZ25hbEV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBuYXR1cmUgPSBzZXA6OklDb21Qb2ludDo6SU9fTUVTU0FHRV9OQVRVUkU7IAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVjbF9zaWduYWxfaW1wbF9pbl9kZWNsX3NpZ25hbDg2NjgpOworICAgICAgICAgICAgZGVjbF9zaWduYWxfaW1wbChjdHgsIGRlY2xQcm9wZXJ0eSwgbWRmciwgbmF0dXJlKTsKKworICAgICAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfc2lnbmFsRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZWRlY2xfc2lnbmFsRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlZGVjbF9zaWduYWxFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDk5LCBkZWNsX3NpZ25hbF9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgZGVjbF9zaWduYWwgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgZGVjbF9zaWduYWxfaW1wbAorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mjk2NDoxOiBkZWNsX3NpZ25hbF9pbXBsWyBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSAsIHNlcDo6TW9kaWZpZXIgbWRmciAsXG5cdFx0c2VwOjpJQ29tUG9pbnQ6OkVOVU1fSU9fTkFUVVJFIG5hdHVyZSBdIDogKCAoIElEICk9PmlkPSBJRCAoIHR5cGVfcGFyYW1fY29tWyBzaWduYWwgXSApPyBTRU1JIHwgbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dFsgbWRmciBdIChpZD0gSUQgKCB0eXBlX3BhcmFtX2NvbVsgc2lnbmFsIF0gKT8gU0VNSSB8IExDVVJMWSAoaWQ9IElEICggdHlwZV9wYXJhbV9jb21bIHNpZ25hbCBdICk/IFNFTUkgKSsgUkNVUkxZICkgfCBMQ1VSTFkgKCAoIElEICk9PmlkPSBJRCAoIHR5cGVfcGFyYW1fY29tWyBzaWduYWwgXSApPyBTRU1JIHwgbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dFsgbWRmciBdIGlkPSBJRCAoIHR5cGVfcGFyYW1fY29tWyBzaWduYWwgXSApPyBTRU1JICkrIFJDVVJMWSApOworICovCitzdGF0aWMgdm9pZAorZGVjbF9zaWduYWxfaW1wbChwZm1sUGFyc2VyIGN0eCwgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHksIHNlcDo6TW9kaWZpZXIgbWRmciwgc2VwOjpJQ29tUG9pbnQ6OkVOVU1fSU9fTkFUVVJFIG5hdHVyZSkKK3sKKyAgICBBTlRMUjNfVUlOVDMyIGRlY2xfc2lnbmFsX2ltcGxfU3RhcnRJbmRleDsKKworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIGlkOworCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGRlY2xfc2lnbmFsX2ltcGxfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworCisgICAgCXNlcDo6UG9ydCAqIHNpZ25hbDsKKyAgICAJc2VwOjpCRiBUUG9ydDsKKyAgICAJYm9vbCBpc2FUeXBlID0gdHJ1ZTsKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTAwKSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgaWQgICAgICAgPSBOVUxMOworCisgICAgeworICAgICAgICB7CisgICAgICAgICAgICAvLyAgL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mjk3MjoyOiAoICggSUQgKT0+aWQ9IElEICggdHlwZV9wYXJhbV9jb21bIHNpZ25hbCBdICk/IFNFTUkgfCBtb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0WyBtZGZyIF0gKGlkPSBJRCAoIHR5cGVfcGFyYW1fY29tWyBzaWduYWwgXSApPyBTRU1JIHwgTENVUkxZIChpZD0gSUQgKCB0eXBlX3BhcmFtX2NvbVsgc2lnbmFsIF0gKT8gU0VNSSApKyBSQ1VSTFkgKSB8IExDVVJMWSAoICggSUQgKT0+aWQ9IElEICggdHlwZV9wYXJhbV9jb21bIHNpZ25hbCBdICk/IFNFTUkgfCBtb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0WyBtZGZyIF0gaWQ9IElEICggdHlwZV9wYXJhbV9jb21bIHNpZ25hbCBdICk/IFNFTUkgKSsgUkNVUkxZICkKKworICAgICAgICAgICAgQU5UTFIzX1VJTlQzMiBhbHQyNTQ7CisKKyAgICAgICAgICAgIGFsdDI1ND0zOworCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IExBMjU0XzAgPSBMQSgxKTsKKyAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkNDMxX2ZtbChjdHgpKSAmJiAoTEEyNTRfMCA9PSBJRCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhbHQyNTQ9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTI1NF8wID09IDI5OCB8fCBMQTI1NF8wID09IDMwNSB8fCBMQTI1NF8wID09IDM0MSB8fCBMQTI1NF8wID09IDM2NCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhbHQyNTQ9MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTI1NF8wID09IExDVVJMWSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhbHQyNTQ9MzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDI1NDsKKyAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgICAgICAgICAgZ290byBydWxlZGVjbF9zaWduYWxfaW1wbEV4OworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQyNTQpCisgICAgICAgICAgICB7CisgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mjk3Mjo0OiAoIElEICk9PmlkPSBJRCAoIHR5cGVfcGFyYW1fY29tWyBzaWduYWwgXSApPyBTRU1JCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBpZCA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTikgTUFUQ0hUKElELCAmRk9MTE9XX0lEX2luX2RlY2xfc2lnbmFsX2ltcGw4Njk4KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVjbF9zaWduYWxfaW1wbEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisKKyAgICAgICAgCSAgICAgICAgICAgIAkJZGVjbFByb3BlcnR5LmFwcGVuZFNpZ25hbCggc2VwOjpCRigKKyAgICAgICAgCSAgICAgICAgICAgIAkJCQlzaWduYWwgPSBuZXcgc2VwOjpTaWduYWwoZGVjbFByb3BlcnR5LAorICAgICAgICAJICAgICAgICAgICAgCQkJCQkJU1RSKChpZC0+Z2V0VGV4dChpZCkpLT5jaGFycyksIG5hdHVyZSwKKyAgICAgICAgCSAgICAgICAgICAgIAkJCQkJCW1kZnIuc2V0RGlyZWN0aW9uSW5vdXRFbHNlKCkgKSApICk7CisgICAgICAgIAkgICAgICAgICAgICAJICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mjk3OTo0OiAoIHR5cGVfcGFyYW1fY29tWyBzaWduYWwgXSApPworICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0MjQ2PTI7CisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBMUEFSRU46CisgICAgICAgIAkgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJCWFsdDI0Nj0xOworICAgICAgICAJICAgICAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDI0NikKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyOTc5OjY6IHR5cGVfcGFyYW1fY29tWyBzaWduYWwgXQorICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfdHlwZV9wYXJhbV9jb21faW5fZGVjbF9zaWduYWxfaW1wbDg3MTApOworICAgICAgICAJICAgICAgICAJICAgICAgICB0eXBlX3BhcmFtX2NvbShjdHgsIHNpZ25hbCk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfc2lnbmFsX2ltcGxFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgTUFUQ0hUKFNFTUksICZGT0xMT1dfU0VNSV9pbl9kZWNsX3NpZ25hbF9pbXBsODcxNyk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfc2lnbmFsX2ltcGxFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAyOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI5ODE6NDogbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dFsgbWRmciBdIChpZD0gSUQgKCB0eXBlX3BhcmFtX2NvbVsgc2lnbmFsIF0gKT8gU0VNSSB8IExDVVJMWSAoaWQ9IElEICggdHlwZV9wYXJhbV9jb21bIHNpZ25hbCBdICk/IFNFTUkgKSsgUkNVUkxZICkKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX21vZGlmaWVyX3NldF9kaXJlY3Rpb25fc3RyaWN0X3RleHRfaW5fZGVjbF9zaWduYWxfaW1wbDg3MjMpOworICAgICAgICAJICAgICAgICBtb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0KGN0eCwgbWRmcik7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfc2lnbmFsX2ltcGxFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI5ODI6NDogKGlkPSBJRCAoIHR5cGVfcGFyYW1fY29tWyBzaWduYWwgXSApPyBTRU1JIHwgTENVUkxZIChpZD0gSUQgKCB0eXBlX3BhcmFtX2NvbVsgc2lnbmFsIF0gKT8gU0VNSSApKyBSQ1VSTFkgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0MjUwPTI7CisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIElEOgorICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgIAkJYWx0MjUwPTE7CisgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgY2FzZSBMQ1VSTFk6CisgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgCQlhbHQyNTA9MjsKKyAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIAkgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMjUwOworICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlZGVjbF9zaWduYWxfaW1wbEV4OworCisgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0MjUwKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI5ODI6NjogaWQ9IElEICggdHlwZV9wYXJhbV9jb21bIHNpZ25hbCBdICk/IFNFTUkKKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlkID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoSUQsICZGT0xMT1dfSURfaW5fZGVjbF9zaWduYWxfaW1wbDg3MzMpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX3NpZ25hbF9pbXBsRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCQkJZGVjbFByb3BlcnR5LmFwcGVuZFNpZ25hbCggc2VwOjpCRigKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkJICAJCQlzaWduYWwgPSBuZXcgc2VwOjpTaWduYWwoZGVjbFByb3BlcnR5LAorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCQkgIAkJCQkJU1RSKChpZC0+Z2V0VGV4dChpZCkpLT5jaGFycyksIG5hdHVyZSwgbWRmciApICkgKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkJCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI5ODg6MzogKCB0eXBlX3BhcmFtX2NvbVsgc2lnbmFsIF0gKT8KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDI0Nz0yOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgTFBBUkVOOgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgCQlhbHQyNDc9MTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQyNDcpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mjk4ODo1OiB0eXBlX3BhcmFtX2NvbVsgc2lnbmFsIF0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3R5cGVfcGFyYW1fY29tX2luX2RlY2xfc2lnbmFsX2ltcGw4NzQzKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgdHlwZV9wYXJhbV9jb20oY3R4LCBzaWduYWwpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX3NpZ25hbF9pbXBsRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChTRU1JLCAmRk9MTE9XX1NFTUlfaW5fZGVjbF9zaWduYWxfaW1wbDg3NTApOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX3NpZ25hbF9pbXBsRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyOTkwOjY6IExDVVJMWSAoaWQ9IElEICggdHlwZV9wYXJhbV9jb21bIHNpZ25hbCBdICk/IFNFTUkgKSsgUkNVUkxZCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKExDVVJMWSwgJkZPTExPV19MQ1VSTFlfaW5fZGVjbF9zaWduYWxfaW1wbDg3NTgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX3NpZ25hbF9pbXBsRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyOTkxOjU6IChpZD0gSUQgKCB0eXBlX3BhcmFtX2NvbVsgc2lnbmFsIF0gKT8gU0VNSSApKworICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpbnQgY250MjQ5PTA7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgaW50IGFsdDI0OT0yOworICAgICAgICAJICAgICAgICAJICAgICAgICAJc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJeworICAgICAgICAJICAgICAgICAJICAgICAgICAJY2FzZSBJRDoKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCQl7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkJCWFsdDI0OT0xOworICAgICAgICAJICAgICAgICAJICAgICAgICAJCX0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJfQorCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAlzd2l0Y2ggKGFsdDI0OSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICBjYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI5OTE6NzogaWQ9IElEICggdHlwZV9wYXJhbV9jb21bIHNpZ25hbCBdICk/IFNFTUkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaWQgPSAocEFOVExSM19DT01NT05fVE9LRU4pIE1BVENIVChJRCwgJkZPTExPV19JRF9pbl9kZWNsX3NpZ25hbF9pbXBsODc2OCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfc2lnbmFsX2ltcGxFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIAkgICAgCWRlY2xQcm9wZXJ0eS5hcHBlbmRTaWduYWwoIHNlcDo6QkYoCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgCSAgICAJCQlzaWduYWwgPSBuZXcgc2VwOjpTaWduYWwoZGVjbFByb3BlcnR5LAorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIAkgICAgCQkJCQlTVFIoKGlkLT5nZXRUZXh0KGlkKSktPmNoYXJzKSwgbmF0dXJlLCBtZGZyKSApICk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgCSAgICAgIAorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI5OTc6ODogKCB0eXBlX3BhcmFtX2NvbVsgc2lnbmFsIF0gKT8KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBpbnQgYWx0MjQ4PTI7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgY2FzZSBMUEFSRU46CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIAkJYWx0MjQ4PTE7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDI0OCkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyOTk3OjEwOiB0eXBlX3BhcmFtX2NvbVsgc2lnbmFsIF0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfdHlwZV9wYXJhbV9jb21faW5fZGVjbF9zaWduYWxfaW1wbDg3ODgpOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgdHlwZV9wYXJhbV9jb20oY3R4LCBzaWduYWwpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVjbF9zaWduYWxfaW1wbEV4OworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgTUFUQ0hUKFNFTUksICZGT0xMT1dfU0VNSV9pbl9kZWNsX3NpZ25hbF9pbXBsODc5NSk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfc2lnbmFsX2ltcGxFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIGRlZmF1bHQ6CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCQlpZiAoIGNudDI0OSA+PSAxICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCQl7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkJICAgIGdvdG8gbG9vcDI0OTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCQl9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkJaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJCXsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCQkgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAJICAgICAgICAJICAgICAgICAJCSAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICAJCX0KKworICAgICAgICAJICAgICAgICAJICAgICAgICAJCS8qIG1pc21hdGNoZWRTZXRFeCgpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkJICovCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkJQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCQlFWENFUFRJT04tPnR5cGUgPSBBTlRMUjNfRUFSTFlfRVhJVF9FWENFUFRJT047CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkJRVhDRVBUSU9OLT5uYW1lID0gKHZvaWQgKilBTlRMUjNfRUFSTFlfRVhJVF9OQU1FOworCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCQlnb3RvIHJ1bGVkZWNsX3NpZ25hbF9pbXBsRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAljbnQyNDkrKzsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGxvb3AyNDk6IDsJLyogSnVtcCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChSQ1VSTFksICZGT0xMT1dfUkNVUkxZX2luX2RlY2xfc2lnbmFsX2ltcGw4ODA1KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVjbF9zaWduYWxfaW1wbEV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAzOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMwMDE6NDogTENVUkxZICggKCBJRCApPT5pZD0gSUQgKCB0eXBlX3BhcmFtX2NvbVsgc2lnbmFsIF0gKT8gU0VNSSB8IG1vZGlmaWVyX3NldF9kaXJlY3Rpb25fc3RyaWN0X3RleHRbIG1kZnIgXSBpZD0gSUQgKCB0eXBlX3BhcmFtX2NvbVsgc2lnbmFsIF0gKT8gU0VNSSApKyBSQ1VSTFkKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoTENVUkxZLCAmRk9MTE9XX0xDVVJMWV9pbl9kZWNsX3NpZ25hbF9pbXBsODgxNSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfc2lnbmFsX2ltcGxFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMwMDI6NDogKCAoIElEICk9PmlkPSBJRCAoIHR5cGVfcGFyYW1fY29tWyBzaWduYWwgXSApPyBTRU1JIHwgbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dFsgbWRmciBdIGlkPSBJRCAoIHR5cGVfcGFyYW1fY29tWyBzaWduYWwgXSApPyBTRU1JICkrCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGludCBjbnQyNTM9MDsKKworICAgICAgICAJICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBpbnQgYWx0MjUzPTM7CisgICAgICAgIAkgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgIAkgICAvKiBkZmFMb29wYmFja1N0YXRlKGssZWRnZXMsZW90UHJlZGljdHNBbHQsZGVzY3JpcHRpb24sc3RhdGVOdW1iZXIsc2VtUHJlZFN0YXRlKQorICAgICAgICAJICAgICAgICAJICAgICovCisgICAgICAgIAkgICAgICAgIAkgICAgaW50IExBMjUzXzAgPSBMQSgxKTsKKyAgICAgICAgCSAgICAgICAgCSAgICBpZiAoIChzeW5wcmVkNDM4X2ZtbChjdHgpKSAmJiAoTEEyNTNfMCA9PSBJRCkpCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICBhbHQyNTM9MTsKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgZWxzZSBpZiAoIChMQTI1M18wID09IDI5OCB8fCBMQTI1M18wID09IDMwNSB8fCBMQTI1M18wID09IDM0MSB8fCBMQTI1M18wID09IDM2NCkpCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICBhbHQyNTM9MjsKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisKKyAgICAgICAgCSAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgCXN3aXRjaCAoYWx0MjUzKQorICAgICAgICAJICAgICAgICAJeworICAgICAgICAJICAgICAgICAJICAgIGNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzAwMjo2OiAoIElEICk9PmlkPSBJRCAoIHR5cGVfcGFyYW1fY29tWyBzaWduYWwgXSApPyBTRU1JCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGlkID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoSUQsICZGT0xMT1dfSURfaW5fZGVjbF9zaWduYWxfaW1wbDg4MzMpOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX3NpZ25hbF9pbXBsRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAJCQlkZWNsUHJvcGVydHkuYXBwZW5kU2lnbmFsKCBzZXA6OkJGKAorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIAkgICAgCQkJc2lnbmFsID0gbmV3IHNlcDo6U2lnbmFsKGRlY2xQcm9wZXJ0eSwKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAJCQkgICAgCQkJU1RSKChpZC0+Z2V0VGV4dChpZCkpLT5jaGFycyksIG5hdHVyZSwKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAJCQkgICAgCQkJbWRmci5zZXREaXJlY3Rpb25Jbm91dEVsc2UoKSApICkgKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAJICAJCXNpZ25hbC0+c2V0TW9kaWZpZXIoIG1kZnIgKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAJICAgIAorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMwMTA6NjogKCB0eXBlX3BhcmFtX2NvbVsgc2lnbmFsIF0gKT8KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBpbnQgYWx0MjUxPTI7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgY2FzZSBMUEFSRU46CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIAkJYWx0MjUxPTE7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDI1MSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMDEwOjg6IHR5cGVfcGFyYW1fY29tWyBzaWduYWwgXQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV190eXBlX3BhcmFtX2NvbV9pbl9kZWNsX3NpZ25hbF9pbXBsODg0OSk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB0eXBlX3BhcmFtX2NvbShjdHgsIHNpZ25hbCk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX3NpZ25hbF9pbXBsRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICBNQVRDSFQoU0VNSSwgJkZPTExPV19TRU1JX2luX2RlY2xfc2lnbmFsX2ltcGw4ODU2KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlZGVjbF9zaWduYWxfaW1wbEV4OworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAJICAgIGNhc2UgMjoKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzAxMjo2OiBtb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0WyBtZGZyIF0gaWQ9IElEICggdHlwZV9wYXJhbV9jb21bIHNpZ25hbCBdICk/IFNFTUkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dF9pbl9kZWNsX3NpZ25hbF9pbXBsODg2NCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBtb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0KGN0eCwgbWRmcik7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX3NpZ25hbF9pbXBsRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpZCA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTikgTUFUQ0hUKElELCAmRk9MTE9XX0lEX2luX2RlY2xfc2lnbmFsX2ltcGw4ODY5KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlZGVjbF9zaWduYWxfaW1wbEV4OworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgCSAgICAJZGVjbFByb3BlcnR5LmFwcGVuZFNpZ25hbCggc2VwOjpCRigKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAJICAgIAkJCXNpZ25hbCA9IG5ldyBzZXA6OlNpZ25hbChkZWNsUHJvcGVydHksCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgCSAgICAJCQkJCVNUUigoaWQtPmdldFRleHQoaWQpKS0+Y2hhcnMpLCBuYXR1cmUsIG1kZnIpICkgKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAJICAgIAorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMwMTg6NjogKCB0eXBlX3BhcmFtX2NvbVsgc2lnbmFsIF0gKT8KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBpbnQgYWx0MjUyPTI7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgY2FzZSBMUEFSRU46CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIAkJYWx0MjUyPTE7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDI1MikKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMDE4Ojg6IHR5cGVfcGFyYW1fY29tWyBzaWduYWwgXQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV190eXBlX3BhcmFtX2NvbV9pbl9kZWNsX3NpZ25hbF9pbXBsODg4NSk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB0eXBlX3BhcmFtX2NvbShjdHgsIHNpZ25hbCk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX3NpZ25hbF9pbXBsRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICBNQVRDSFQoU0VNSSwgJkZPTExPV19TRU1JX2luX2RlY2xfc2lnbmFsX2ltcGw4ODkyKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlZGVjbF9zaWduYWxfaW1wbEV4OworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgIAkgICAgZGVmYXVsdDoKKworICAgICAgICAJICAgICAgICAJCWlmICggY250MjUzID49IDEgKQorICAgICAgICAJICAgICAgICAJCXsKKyAgICAgICAgCSAgICAgICAgCQkgICAgZ290byBsb29wMjUzOworICAgICAgICAJICAgICAgICAJCX0KKyAgICAgICAgCSAgICAgICAgCQlpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgIAkgICAgICAgIAkJeworICAgICAgICAJICAgICAgICAJCSAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkgICAgICAgIAkJICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkJfQorCisgICAgICAgIAkgICAgICAgIAkJLyogbWlzbWF0Y2hlZFNldEV4KCkKKyAgICAgICAgCSAgICAgICAgCQkgKi8KKyAgICAgICAgCSAgICAgICAgCQlDT05TVFJVQ1RFWCgpOworICAgICAgICAJICAgICAgICAJCUVYQ0VQVElPTi0+dHlwZSA9IEFOVExSM19FQVJMWV9FWElUX0VYQ0VQVElPTjsKKyAgICAgICAgCSAgICAgICAgCQlFWENFUFRJT04tPm5hbWUgPSAodm9pZCAqKUFOVExSM19FQVJMWV9FWElUX05BTUU7CisKKworICAgICAgICAJICAgICAgICAJCWdvdG8gcnVsZWRlY2xfc2lnbmFsX2ltcGxFeDsKKyAgICAgICAgCSAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgCWNudDI1MysrOworICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgbG9vcDI1MzogOwkvKiBKdW1wIHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgTUFUQ0hUKFJDVVJMWSwgJkZPTExPV19SQ1VSTFlfaW5fZGVjbF9zaWduYWxfaW1wbDg5MDMpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX3NpZ25hbF9pbXBsRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlZGVjbF9zaWduYWxfaW1wbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZWRlY2xfc2lnbmFsX2ltcGxFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDEwMCwgZGVjbF9zaWduYWxfaW1wbF9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgZGVjbF9zaWduYWxfaW1wbCAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCB0eXBlX3BhcmFtX2NvbQorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzAyODoxOiB0eXBlX3BhcmFtX2NvbVsgc2VwOjpQb3J0ICogcG9ydCBdIDogTFBBUkVOIHBhcmFtX2NvbV9hdG9tWyBwb3J0ICwgb2Zmc2V0XSAoIENPTU1BIHBhcmFtX2NvbV9hdG9tWyBwb3J0ICwgKytvZmZzZXQgXSApKiBSUEFSRU4gOworICovCitzdGF0aWMgdm9pZAordHlwZV9wYXJhbV9jb20ocGZtbFBhcnNlciBjdHgsIHNlcDo6UG9ydCAqIHBvcnQpCit7CisgICAgQU5UTFIzX1VJTlQzMiB0eXBlX3BhcmFtX2NvbV9TdGFydEluZGV4OworCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIHR5cGVfcGFyYW1fY29tX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKworICAgIAlzZXA6OmF2bV9vZmZzZXRfdCBvZmZzZXQgPSAwOworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgxMDEpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMwMzI6MjogKCBMUEFSRU4gcGFyYW1fY29tX2F0b21bIHBvcnQgLCBvZmZzZXRdICggQ09NTUEgcGFyYW1fY29tX2F0b21bIHBvcnQgLCArK29mZnNldCBdICkqIFJQQVJFTiApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMwMzI6NDogTFBBUkVOIHBhcmFtX2NvbV9hdG9tWyBwb3J0ICwgb2Zmc2V0XSAoIENPTU1BIHBhcmFtX2NvbV9hdG9tWyBwb3J0ICwgKytvZmZzZXQgXSApKiBSUEFSRU4KKyAgICAgICAgeworICAgICAgICAgICAgIE1BVENIVChMUEFSRU4sICZGT0xMT1dfTFBBUkVOX2luX3R5cGVfcGFyYW1fY29tODkyNSk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXR5cGVfcGFyYW1fY29tRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19wYXJhbV9jb21fYXRvbV9pbl90eXBlX3BhcmFtX2NvbTg5MzIpOworICAgICAgICAgICAgcGFyYW1fY29tX2F0b20oY3R4LCBwb3J0LCBvZmZzZXQpOworCisgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxldHlwZV9wYXJhbV9jb21FeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMwMzQ6NjogKCBDT01NQSBwYXJhbV9jb21fYXRvbVsgcG9ydCAsICsrb2Zmc2V0IF0gKSoKKworICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MjU1PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIENPTU1BOgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQyNTU9MTsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MjU1KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMwMzQ6ODogQ09NTUEgcGFyYW1fY29tX2F0b21bIHBvcnQgLCArK29mZnNldCBdCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoQ09NTUEsICZGT0xMT1dfQ09NTUFfaW5fdHlwZV9wYXJhbV9jb204OTQyKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxldHlwZV9wYXJhbV9jb21FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3BhcmFtX2NvbV9hdG9tX2luX3R5cGVfcGFyYW1fY29tODk0NCk7CisgICAgICAgICAgICAJICAgICAgICBwYXJhbV9jb21fYXRvbShjdHgsIHBvcnQsICsrb2Zmc2V0KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXR5cGVfcGFyYW1fY29tRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAgICAgCSAgICBnb3RvIGxvb3AyNTU7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb29wMjU1OiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICAgICAgIE1BVENIVChSUEFSRU4sICZGT0xMT1dfUlBBUkVOX2luX3R5cGVfcGFyYW1fY29tODk1Myk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXR5cGVfcGFyYW1fY29tRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZXR5cGVfcGFyYW1fY29tRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxldHlwZV9wYXJhbV9jb21FeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDEwMSwgdHlwZV9wYXJhbV9jb21fU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIHR5cGVfcGFyYW1fY29tICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IHBhcmFtX2NvbV9hdG9tCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMDM4OjE6IHBhcmFtX2NvbV9hdG9tWyBzZXA6OlBvcnQgKiBwb3J0ICwgc2VwOjphdm1fb2Zmc2V0X3Qgb2Zmc2V0IF0gOiAodHY9IHR5cGVfdmFyIChpZD0gSUQgKGl2PSBpbml0aWFsX3ZhbHVlICk/ICk/IHwgJ2JpbmQ6JyAoICggdHlwZV92YXIgQ09MT04gKT0+dHY9IHR5cGVfdmFyIENPTE9OIGU9IGV4cHJlc3Npb24gfHZpZD0gcXVhbGlmaWVkTmFtZUlEICkgKTsKKyAqLworc3RhdGljIHZvaWQKK3BhcmFtX2NvbV9hdG9tKHBmbWxQYXJzZXIgY3R4LCBzZXA6OlBvcnQgKiBwb3J0LCBzZXA6OmF2bV9vZmZzZXRfdCBvZmZzZXQpCit7CisgICAgQU5UTFIzX1VJTlQzMiBwYXJhbV9jb21fYXRvbV9TdGFydEluZGV4OworCisgICAgcEFOVExSM19DT01NT05fVE9LRU4gICAgaWQ7CisgICAgc2VwOjpCRiB0djsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfdHYKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX3R2IHNlcDo6QkYKKworICAgIHNlcDo6QkYgaXY7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2l2CisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9pdiBzZXA6OkJGCisKKyAgICBzZXA6OkJGIGU7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2UKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisgICAgZm1sUGFyc2VyX3F1YWxpZmllZE5hbWVJRF9yZXR1cm4gdmlkOworICAgICN1bmRlZglSRVRVUk5fVFlQRV92aWQKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX3ZpZCBmbWxQYXJzZXJfcXVhbGlmaWVkTmFtZUlEX3JldHVybgorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIHBhcmFtX2NvbV9hdG9tX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKworICAgIAlzZXA6OlZhcmlhYmxlICogdmFyaWFibGU7CisgICAgCXNlcDo6QkYgcGFyYW1UID0gc2VwOjpUeXBlTWFuYWdlcjo6VU5JVkVSU0FMOworICAgIAlzdGQ6OnN0cmluZyBwYXJhbUlEOworICAgIAlzZXA6OkJGIHZhbHVlOworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgxMDIpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICBpZCAgICAgICA9IE5VTEw7CisKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vICAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMDQ2OjI6ICh0dj0gdHlwZV92YXIgKGlkPSBJRCAoaXY9IGluaXRpYWxfdmFsdWUgKT8gKT8gfCAnYmluZDonICggKCB0eXBlX3ZhciBDT0xPTiApPT50dj0gdHlwZV92YXIgQ09MT04gZT0gZXhwcmVzc2lvbiB8dmlkPSBxdWFsaWZpZWROYW1lSUQgKSApCisKKyAgICAgICAgICAgIEFOVExSM19VSU5UMzIgYWx0MjU5OworCisgICAgICAgICAgICBhbHQyNTk9MjsKKworICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgICAgIGNhc2UgMjQxOgorICAgICAgICAgICAgY2FzZSAyNDI6CisgICAgICAgICAgICBjYXNlIDI0NToKKyAgICAgICAgICAgIGNhc2UgMjQ2OgorICAgICAgICAgICAgY2FzZSAyNDk6CisgICAgICAgICAgICBjYXNlIDI1NDoKKyAgICAgICAgICAgIGNhc2UgMjU1OgorICAgICAgICAgICAgY2FzZSAyNTk6CisgICAgICAgICAgICBjYXNlIDI2MToKKyAgICAgICAgICAgIGNhc2UgMjY0OgorICAgICAgICAgICAgY2FzZSAyNzA6CisgICAgICAgICAgICBjYXNlIDI3MToKKyAgICAgICAgICAgIGNhc2UgMjgxOgorICAgICAgICAgICAgY2FzZSAyODM6CisgICAgICAgICAgICBjYXNlIDMwOToKKyAgICAgICAgICAgIGNhc2UgMzEwOgorICAgICAgICAgICAgY2FzZSAzMTE6CisgICAgICAgICAgICBjYXNlIDMxNToKKyAgICAgICAgICAgIGNhc2UgMzE2OgorICAgICAgICAgICAgY2FzZSAzMTc6CisgICAgICAgICAgICBjYXNlIDMyMDoKKyAgICAgICAgICAgIGNhc2UgMzI1OgorICAgICAgICAgICAgY2FzZSAzMjY6CisgICAgICAgICAgICBjYXNlIDMyOToKKyAgICAgICAgICAgIGNhc2UgMzMzOgorICAgICAgICAgICAgY2FzZSAzNDQ6CisgICAgICAgICAgICBjYXNlIDM0NToKKyAgICAgICAgICAgIGNhc2UgMzQ2OgorICAgICAgICAgICAgY2FzZSAzNTc6CisgICAgICAgICAgICBjYXNlIDM1ODoKKyAgICAgICAgICAgIGNhc2UgMzYwOgorICAgICAgICAgICAgY2FzZSAzNzA6CisgICAgICAgICAgICBjYXNlIDM3MzoKKyAgICAgICAgICAgIGNhc2UgMzc0OgorICAgICAgICAgICAgY2FzZSAzODc6CisgICAgICAgICAgICBjYXNlIDM5MjoKKyAgICAgICAgICAgIGNhc2UgMzk5OgorICAgICAgICAgICAgY2FzZSA0MDA6CisgICAgICAgICAgICBjYXNlIDQwMToKKyAgICAgICAgICAgIGNhc2UgNDAyOgorICAgICAgICAgICAgY2FzZSA0MDU6CisgICAgICAgICAgICBjYXNlIDQwNzoKKyAgICAgICAgICAgIGNhc2UgNDA4OgorICAgICAgICAgICAgY2FzZSA0MDk6CisgICAgICAgICAgICBjYXNlIDQxMjoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDI1OT0xOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjQ0OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MjU5PTI7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDI1OTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXBhcmFtX2NvbV9hdG9tRXg7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQyNTkpCisgICAgICAgICAgICB7CisgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzA0Njo0OiB0dj0gdHlwZV92YXIgKGlkPSBJRCAoaXY9IGluaXRpYWxfdmFsdWUgKT8gKT8KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3R5cGVfdmFyX2luX3BhcmFtX2NvbV9hdG9tODk3Myk7CisgICAgICAgIAkgICAgICAgIHR2PXR5cGVfdmFyKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXBhcmFtX2NvbV9hdG9tRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBwYXJhbVQgPSB0dgorICAgICAgICAJICAgICAgICAgICAgOyAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzA0Nzo0OiAoaWQ9IElEIChpdj0gaW5pdGlhbF92YWx1ZSApPyApPworICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0MjU3PTI7CisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgICAgIAkJYWx0MjU3PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0MjU3KQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMwNDc6NjogaWQ9IElEIChpdj0gaW5pdGlhbF92YWx1ZSApPworICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWQgPSAocEFOVExSM19DT01NT05fVE9LRU4pIE1BVENIVChJRCwgJkZPTExPV19JRF9pbl9wYXJhbV9jb21fYXRvbTg5ODQpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVwYXJhbV9jb21fYXRvbUV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgcGFyYW1JRCA9IFNUUigoaWQtPmdldFRleHQoaWQpKS0+Y2hhcnMpOyAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzA0ODo2OiAoaXY9IGluaXRpYWxfdmFsdWUgKT8KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDI1Nj0yOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgQVNTSUdOOgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgTFBBUkVOOgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgCQlhbHQyNTY9MTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQyNTYpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzA0ODo4OiBpdj0gaW5pdGlhbF92YWx1ZQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfaW5pdGlhbF92YWx1ZV9pbl9wYXJhbV9jb21fYXRvbTkwMDEpOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpdj1pbml0aWFsX3ZhbHVlKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXBhcmFtX2NvbV9hdG9tRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICB2YWx1ZSA9IGl2CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICA7IAorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworCisgICAgICAgIAkgICAgICAgICAgICAJCXBvcnQtPnNhdmVQYXJhbWV0ZXIoIHZhcmlhYmxlID0gbmV3IHNlcDo6VmFyaWFibGUocG9ydCwKKyAgICAgICAgCSAgICAgICAgICAgIAkJCQlzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9QQVJBTUVURVJfTU9ESUZJRVIsCisgICAgICAgIAkgICAgICAgICAgICAJCQkJcGFyYW1ULCBwYXJhbUlELCB2YWx1ZSkgKTsKKyAgICAgICAgCSAgICAgICAgICAgIAkKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDI6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzA1Njo0OiAnYmluZDonICggKCB0eXBlX3ZhciBDT0xPTiApPT50dj0gdHlwZV92YXIgQ09MT04gZT0gZXhwcmVzc2lvbiB8dmlkPSBxdWFsaWZpZWROYW1lSUQgKQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgyNDQsICZGT0xMT1dfMjQ0X2luX3BhcmFtX2NvbV9hdG9tOTAyMik7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXBhcmFtX2NvbV9hdG9tRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMDU3OjQ6ICggKCB0eXBlX3ZhciBDT0xPTiApPT50dj0gdHlwZV92YXIgQ09MT04gZT0gZXhwcmVzc2lvbiB8dmlkPSBxdWFsaWZpZWROYW1lSUQgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0MjU4PTI7CisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgaW50IExBMjU4XzAgPSBMQSgxKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkNDQ2X2ZtbChjdHgpKSAmJiAoKChMQTI1OF8wID49IDI0NSkgJiYgKExBMjU4XzAgPD0gMjQ2KSkpKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0MjU4PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDQ0Nl9mbWwoY3R4KSkgJiYgKCgoTEEyNThfMCA+PSAzMDkpICYmIChMQTI1OF8wIDw9IDMxMCkpKSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDI1OD0xOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ0NDZfZm1sKGN0eCkpICYmICgoKExBMjU4XzAgPj0gNDAxKSAmJiAoTEEyNThfMCA8PSA0MDIpKSkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQyNTg9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNDQ2X2ZtbChjdHgpKSAmJiAoKChMQTI1OF8wID49IDM0NSkgJiYgKExBMjU4XzAgPD0gMzQ2KSkpKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0MjU4PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDQ0Nl9mbWwoY3R4KSkgJiYgKCgoTEEyNThfMCA+PSAzNTcpICYmIChMQTI1OF8wIDw9IDM1OCkpKSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDI1OD0xOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ0NDZfZm1sKGN0eCkpICYmICgoKExBMjU4XzAgPj0gNDA3KSAmJiAoTEEyNThfMCA8PSA0MDgpKSkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQyNTg9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNDQ2X2ZtbChjdHgpKSAmJiAoTEEyNThfMCA9PSAyODMpKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0MjU4PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDQ0Nl9mbWwoY3R4KSkgJiYgKExBMjU4XzAgPT0gNDAwKSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDI1OD0xOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ0NDZfZm1sKGN0eCkpICYmIChMQTI1OF8wID09IDI3MCkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQyNTg9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNDQ2X2ZtbChjdHgpKSAmJiAoTEEyNThfMCA9PSAzOTkpKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0MjU4PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDQ0Nl9mbWwoY3R4KSkgJiYgKExBMjU4XzAgPT0gMzYwKSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDI1OD0xOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ0NDZfZm1sKGN0eCkpICYmIChMQTI1OF8wID09IDQwOSkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQyNTg9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNDQ2X2ZtbChjdHgpKSAmJiAoTEEyNThfMCA9PSAyNTkpKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0MjU4PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDQ0Nl9mbWwoY3R4KSkgJiYgKExBMjU4XzAgPT0gMzkyKSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDI1OD0xOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ0NDZfZm1sKGN0eCkpICYmIChMQTI1OF8wID09IDI2NCkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQyNTg9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNDQ2X2ZtbChjdHgpKSAmJiAoTEEyNThfMCA9PSAyNzEpKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0MjU4PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDQ0Nl9mbWwoY3R4KSkgJiYgKExBMjU4XzAgPT0gMjU0KSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDI1OD0xOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ0NDZfZm1sKGN0eCkpICYmIChMQTI1OF8wID09IDI1NSkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQyNTg9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNDQ2X2ZtbChjdHgpKSAmJiAoTEEyNThfMCA9PSAzODcpKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0MjU4PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDQ0Nl9mbWwoY3R4KSkgJiYgKExBMjU4XzAgPT0gMzMzKSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDI1OD0xOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ0NDZfZm1sKGN0eCkpICYmIChMQTI1OF8wID09IDI0MikpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQyNTg9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNDQ2X2ZtbChjdHgpKSAmJiAoTEEyNThfMCA9PSAzNDQpKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0MjU4PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDQ0Nl9mbWwoY3R4KSkgJiYgKExBMjU4XzAgPT0gMjQ5KSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDI1OD0xOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ0NDZfZm1sKGN0eCkpICYmIChMQTI1OF8wID09IDMyMCkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQyNTg9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNDQ2X2ZtbChjdHgpKSAmJiAoTEEyNThfMCA9PSAzNzQpKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0MjU4PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDQ0Nl9mbWwoY3R4KSkgJiYgKExBMjU4XzAgPT0gMjYxKSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDI1OD0xOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ0NDZfZm1sKGN0eCkpICYmIChMQTI1OF8wID09IDMxNykpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQyNTg9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNDQ2X2ZtbChjdHgpKSAmJiAoTEEyNThfMCA9PSA0MDUpKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0MjU4PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyNThfMCA9PSBJRCkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEEyNThfMjkgPSBMQSgyKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQ0NDZfZm1sKGN0eCkpKQorICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDI1OD0xOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChBTlRMUjNfVFJVRSkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MjU4PTI7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAyNTg7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAyOTsKKworCisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBydWxlcGFyYW1fY29tX2F0b21FeDsKKworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDQ0Nl9mbWwoY3R4KSkgJiYgKExBMjU4XzAgPT0gMjQxKSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDI1OD0xOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ0NDZfZm1sKGN0eCkpICYmIChMQTI1OF8wID09IDQxMikpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQyNTg9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNDQ2X2ZtbChjdHgpKSAmJiAoTEEyNThfMCA9PSAzNzApKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0MjU4PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDQ0Nl9mbWwoY3R4KSkgJiYgKExBMjU4XzAgPT0gMzE2KSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDI1OD0xOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ0NDZfZm1sKGN0eCkpICYmIChMQTI1OF8wID09IDI4MSkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQyNTg9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNDQ2X2ZtbChjdHgpKSAmJiAoTEEyNThfMCA9PSAzMTUpKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0MjU4PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDQ0Nl9mbWwoY3R4KSkgJiYgKExBMjU4XzAgPT0gMzI1KSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDI1OD0xOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ0NDZfZm1sKGN0eCkpICYmIChMQTI1OF8wID09IDMyNikpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQyNTg9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNDQ2X2ZtbChjdHgpKSAmJiAoTEEyNThfMCA9PSAzNzMpKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYWx0MjU4PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDQ0Nl9mbWwoY3R4KSkgJiYgKExBMjU4XzAgPT0gMzI5KSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGFsdDI1OD0xOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ0NDZfZm1sKGN0eCkpICYmIChMQTI1OF8wID09IDMxMSkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQyNTg9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDI1ODsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgZ290byBydWxlcGFyYW1fY29tX2F0b21FeDsKKworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0MjU4KQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMwNTc6NjogKCB0eXBlX3ZhciBDT0xPTiApPT50dj0gdHlwZV92YXIgQ09MT04gZT0gZXhwcmVzc2lvbgorICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfdHlwZV92YXJfaW5fcGFyYW1fY29tX2F0b205MDQyKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgdHY9dHlwZV92YXIoY3R4KTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlcGFyYW1fY29tX2F0b21FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoQ09MT04sICZGT0xMT1dfQ09MT05faW5fcGFyYW1fY29tX2F0b205MDQ0KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlcGFyYW1fY29tX2F0b21FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIHBhcmFtVCA9IHR2CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICA7IAorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX3BhcmFtX2NvbV9hdG9tOTA1Nik7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVwYXJhbV9jb21fYXRvbUV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgdmFsdWUgPSBlCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICA7IAorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMDU5OjY6IHZpZD0gcXVhbGlmaWVkTmFtZUlECisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fcGFyYW1fY29tX2F0b205MDY3KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgdmlkPXF1YWxpZmllZE5hbWVJRChjdHgpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVwYXJhbV9jb21fYXRvbUV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgIAl2YWx1ZSA9IHNlcDo6UGFyc2VyVXRpbDo6Z2V0VmFyaWFibGUodmlkLnMKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICwgdmlkLm5iCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICApOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgCWlmKCB2YWx1ZS52YWxpZCgpICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgIAl7IHBhcmFtVCA9IHZhbHVlLnRvX3B0cjwgc2VwOjpWYXJpYWJsZSA+KCktPmdldFR5cGUoKTsgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKworICAgICAgICAJICAgICAgICAgICAgCQlwYXJhbUlEID0gc2VwOjpPU1MoKSA8PCAnIycgPDwgb2Zmc2V0OworICAgICAgICAJICAgICAgICAgICAgCQlwb3J0LT5zYXZlUGFyYW1ldGVyKCB2YXJpYWJsZSA9IG5ldyBzZXA6OlZhcmlhYmxlKHBvcnQsCisgICAgICAgIAkgICAgICAgICAgICAJCQkJc2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfUEFSQU1FVEVSX0JJTkRfTU9ESUZJRVIsCisgICAgICAgIAkgICAgICAgICAgICAJCQkJcGFyYW1ULCBwYXJhbUlELCB2YWx1ZSkgKTsKKyAgICAgICAgCSAgICAgICAgICAgIAkJdmFyaWFibGUtPnNldE9mZnNldCggb2Zmc2V0ICk7CisgICAgICAgIAkgICAgICAgICAgICAJCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVwYXJhbV9jb21fYXRvbUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZXBhcmFtX2NvbV9hdG9tRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgxMDIsIHBhcmFtX2NvbV9hdG9tX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBwYXJhbV9jb21fYXRvbSAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBkZWNsX2J1ZmZlcgorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzA3OToxOiBkZWNsX2J1ZmZlclsgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHkgLCBzZXA6Ok1vZGlmaWVyIG1kZnIgXSA6ICdidWZmZXInIGRlY2xfYnVmZmVyX2ltcGxbIGRlY2xQcm9wZXJ0eSAsIG1kZnIgXSA7CisgKi8KK3N0YXRpYyB2b2lkCitkZWNsX2J1ZmZlcihwZm1sUGFyc2VyIGN0eCwgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHksIHNlcDo6TW9kaWZpZXIgbWRmcikKK3sKKyAgICBBTlRMUjNfVUlOVDMyIGRlY2xfYnVmZmVyX1N0YXJ0SW5kZXg7CisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgZGVjbF9idWZmZXJfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTAzKSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMDgxOjI6ICggJ2J1ZmZlcicgZGVjbF9idWZmZXJfaW1wbFsgZGVjbFByb3BlcnR5ICwgbWRmciBdICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzA4MTo0OiAnYnVmZmVyJyBkZWNsX2J1ZmZlcl9pbXBsWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0KKyAgICAgICAgeworICAgICAgICAgICAgIE1BVENIVCgyNDksICZGT0xMT1dfMjQ5X2luX2RlY2xfYnVmZmVyOTA5OCk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfYnVmZmVyRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWNsX2J1ZmZlcl9pbXBsX2luX2RlY2xfYnVmZmVyOTEwMSk7CisgICAgICAgICAgICBkZWNsX2J1ZmZlcl9pbXBsKGN0eCwgZGVjbFByb3BlcnR5LCBtZGZyKTsKKworICAgICAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfYnVmZmVyRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZWRlY2xfYnVmZmVyRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlZGVjbF9idWZmZXJFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDEwMywgZGVjbF9idWZmZXJfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGRlY2xfYnVmZmVyICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGRlY2xfYnVmZmVyX2ltcGwKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMwODQ6MTogZGVjbF9idWZmZXJfaW1wbFsgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHkgLCBzZXA6Ok1vZGlmaWVyIG1kZnIgXSA6IChkYj0gZGVmX2J1ZmZlciBpZD0gSUQgKCBpbml0aWFsX2J1ZmZlcl9jb250ZW50c1sgYnVmZmVyIF0gKT8gU0VNSSB8IExDVVJMWSAoZGI9IGRlZl9idWZmZXIgaWQ9IElEICkrIFJDVVJMWSApOworICovCitzdGF0aWMgdm9pZAorZGVjbF9idWZmZXJfaW1wbChwZm1sUGFyc2VyIGN0eCwgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHksIHNlcDo6TW9kaWZpZXIgbWRmcikKK3sKKyAgICBBTlRMUjNfVUlOVDMyIGRlY2xfYnVmZmVyX2ltcGxfU3RhcnRJbmRleDsKKworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIGlkOworICAgIGZtbFBhcnNlcl9kZWZfYnVmZmVyX3JldHVybiBkYjsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfZGIKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2RiIGZtbFBhcnNlcl9kZWZfYnVmZmVyX3JldHVybgorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGRlY2xfYnVmZmVyX2ltcGxfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworCisgICAgCXNlcDo6QnVmZmVyICogYnVmZmVyOworCisgICAgCXNlcDo6QkYgVEJ1ZmZlcjsKKyAgICAJYm9vbCBpc2FUeXBlID0gdHJ1ZTsKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTA0KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgaWQgICAgICAgPSBOVUxMOworCisgICAgeworICAgICAgICB7CisgICAgICAgICAgICAvLyAgL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzA5MjoyOiAoZGI9IGRlZl9idWZmZXIgaWQ9IElEICggaW5pdGlhbF9idWZmZXJfY29udGVudHNbIGJ1ZmZlciBdICk/IFNFTUkgfCBMQ1VSTFkgKGRiPSBkZWZfYnVmZmVyIGlkPSBJRCApKyBSQ1VSTFkgKQorCisgICAgICAgICAgICBBTlRMUjNfVUlOVDMyIGFsdDI2MjsKKworICAgICAgICAgICAgYWx0MjYyPTI7CisKKyAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMjgxOgorICAgICAgICAgICAgY2FzZSAzMTU6CisgICAgICAgICAgICBjYXNlIDMyNToKKyAgICAgICAgICAgIGNhc2UgMzI2OgorICAgICAgICAgICAgY2FzZSAzMjk6CisgICAgICAgICAgICBjYXNlIDM1NjoKKyAgICAgICAgICAgIGNhc2UgMzcwOgorICAgICAgICAgICAgY2FzZSAzNzM6CisgICAgICAgICAgICBjYXNlIDQxMjoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDI2Mj0xOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTENVUkxZOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MjYyPTI7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDI2MjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfYnVmZmVyX2ltcGxFeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDI2MikKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMDkyOjQ6IGRiPSBkZWZfYnVmZmVyIGlkPSBJRCAoIGluaXRpYWxfYnVmZmVyX2NvbnRlbnRzWyBidWZmZXIgXSApPyBTRU1JCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfYnVmZmVyX2luX2RlY2xfYnVmZmVyX2ltcGw5MTIyKTsKKyAgICAgICAgCSAgICAgICAgZGI9ZGVmX2J1ZmZlcihjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX2J1ZmZlcl9pbXBsRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZCA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTikgTUFUQ0hUKElELCAmRk9MTE9XX0lEX2luX2RlY2xfYnVmZmVyX2ltcGw5MTI3KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVjbF9idWZmZXJfaW1wbEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisKKyAgICAgICAgCSAgICAgICAgICAgIAkJZGVjbFByb3BlcnR5LmFwcGVuZEJ1ZmZlciggc2VwOjpCRigKKyAgICAgICAgCSAgICAgICAgICAgIAkJCQlidWZmZXIgPSBuZXcgc2VwOjpCdWZmZXIoIGRlY2xQcm9wZXJ0eSwKKyAgICAgICAgCSAgICAgICAgICAgIAkJCQkJCVNUUigoaWQtPmdldFRleHQoaWQpKS0+Y2hhcnMpLCAKKyAgICAgICAgCSAgICAgICAgICAgIGRiLmtpbmQKKyAgICAgICAgCSAgICAgICAgICAgICwgZGIuc2l6ZQorICAgICAgICAJICAgICAgICAgICAgKSkgKTsKKyAgICAgICAgCSAgICAgICAgICAgIAkgIAlidWZmZXItPnNldE1vZGlmaWVyKCBtZGZyICk7CisgICAgICAgIAkgICAgICAgICAgICAJCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMwOTk6NDogKCBpbml0aWFsX2J1ZmZlcl9jb250ZW50c1sgYnVmZmVyIF0gKT8KKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDI2MD0yOworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgQVNTSUdOOgorICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQlhbHQyNjA9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQyNjApCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzA5OTo2OiBpbml0aWFsX2J1ZmZlcl9jb250ZW50c1sgYnVmZmVyIF0KKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2luaXRpYWxfYnVmZmVyX2NvbnRlbnRzX2luX2RlY2xfYnVmZmVyX2ltcGw5MTM3KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaW5pdGlhbF9idWZmZXJfY29udGVudHMoY3R4LCBidWZmZXIpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX2J1ZmZlcl9pbXBsRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChTRU1JLCAmRk9MTE9XX1NFTUlfaW5fZGVjbF9idWZmZXJfaW1wbDkxNDQpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX2J1ZmZlcl9pbXBsRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMTAxOjQ6IExDVVJMWSAoZGI9IGRlZl9idWZmZXIgaWQ9IElEICkrIFJDVVJMWQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChMQ1VSTFksICZGT0xMT1dfTENVUkxZX2luX2RlY2xfYnVmZmVyX2ltcGw5MTUwKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVjbF9idWZmZXJfaW1wbEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzEwMjo0OiAoZGI9IGRlZl9idWZmZXIgaWQ9IElEICkrCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGludCBjbnQyNjE9MDsKKworICAgICAgICAJICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBpbnQgYWx0MjYxPTI7CisgICAgICAgIAkgICAgICAgIAlzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAkgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgIAljYXNlIDI4MToKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMzE1OgorICAgICAgICAJICAgICAgICAJY2FzZSAzMjU6CisgICAgICAgIAkgICAgICAgIAljYXNlIDMyNjoKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMzI5OgorICAgICAgICAJICAgICAgICAJY2FzZSAzNTY6CisgICAgICAgIAkgICAgICAgIAljYXNlIDM3MDoKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMzczOgorICAgICAgICAJICAgICAgICAJY2FzZSA0MTI6CisgICAgICAgIAkgICAgICAgIAkJeworICAgICAgICAJICAgICAgICAJCQlhbHQyNjE9MTsKKyAgICAgICAgCSAgICAgICAgCQl9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgCX0KKworICAgICAgICAJICAgICAgICAJc3dpdGNoIChhbHQyNjEpCisgICAgICAgIAkgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgIAkgICAgY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMTAzOjY6IGRiPSBkZWZfYnVmZmVyIGlkPSBJRAorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfYnVmZmVyX2luX2RlY2xfYnVmZmVyX2ltcGw5MTY0KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGRiPWRlZl9idWZmZXIoY3R4KTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfYnVmZmVyX2ltcGxFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGlkID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoSUQsICZGT0xMT1dfSURfaW5fZGVjbF9idWZmZXJfaW1wbDkxNjkpOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX2J1ZmZlcl9pbXBsRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAJICAJCWRlY2xQcm9wZXJ0eS5hcHBlbmRCdWZmZXIoIHNlcDo6QkYoCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgCSAgCQkJCWJ1ZmZlciA9IG5ldyBzZXA6OkJ1ZmZlcihkZWNsUHJvcGVydHksCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgCSAgCQkJCQkJU1RSKChpZC0+Z2V0VGV4dChpZCkpLT5jaGFycyksIAorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIGRiLmtpbmQKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAsIGRiLnNpemUKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICApKSApOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIAkgIAkJYnVmZmVyLT5zZXRNb2RpZmllciggbWRmciApOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIAkgICAgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgIAkgICAgZGVmYXVsdDoKKworICAgICAgICAJICAgICAgICAJCWlmICggY250MjYxID49IDEgKQorICAgICAgICAJICAgICAgICAJCXsKKyAgICAgICAgCSAgICAgICAgCQkgICAgZ290byBsb29wMjYxOworICAgICAgICAJICAgICAgICAJCX0KKyAgICAgICAgCSAgICAgICAgCQlpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgIAkgICAgICAgIAkJeworICAgICAgICAJICAgICAgICAJCSAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkgICAgICAgIAkJICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkJfQorCisgICAgICAgIAkgICAgICAgIAkJLyogbWlzbWF0Y2hlZFNldEV4KCkKKyAgICAgICAgCSAgICAgICAgCQkgKi8KKyAgICAgICAgCSAgICAgICAgCQlDT05TVFJVQ1RFWCgpOworICAgICAgICAJICAgICAgICAJCUVYQ0VQVElPTi0+dHlwZSA9IEFOVExSM19FQVJMWV9FWElUX0VYQ0VQVElPTjsKKyAgICAgICAgCSAgICAgICAgCQlFWENFUFRJT04tPm5hbWUgPSAodm9pZCAqKUFOVExSM19FQVJMWV9FWElUX05BTUU7CisKKworICAgICAgICAJICAgICAgICAJCWdvdG8gcnVsZWRlY2xfYnVmZmVyX2ltcGxFeDsKKyAgICAgICAgCSAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgCWNudDI2MSsrOworICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgbG9vcDI2MTogOwkvKiBKdW1wIHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgTUFUQ0hUKFJDVVJMWSwgJkZPTExPV19SQ1VSTFlfaW5fZGVjbF9idWZmZXJfaW1wbDkxODcpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX2J1ZmZlcl9pbXBsRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlZGVjbF9idWZmZXJfaW1wbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZWRlY2xfYnVmZmVyX2ltcGxFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDEwNCwgZGVjbF9idWZmZXJfaW1wbF9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgZGVjbF9idWZmZXJfaW1wbCAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBkZWZfYnVmZmVyCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMTE1OjE6IGRlZl9idWZmZXIgcmV0dXJucyBbIHNlcDo6YXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCBraW5kICwgaW50IHNpemUgPSAtMSBdIDogKHBiPSBwb2xpY3lfYnVmZmVyICggTFRfIChuPSBpbnRlZ2VyX2NvbnN0YW50IHwgU1RBUiApIEdUICk/IHwgJ3JhbScgKTsKKyAqLworc3RhdGljIGZtbFBhcnNlcl9kZWZfYnVmZmVyX3JldHVybgorZGVmX2J1ZmZlcihwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBmbWxQYXJzZXJfZGVmX2J1ZmZlcl9yZXR1cm4gcmV0dmFsOworCisgICAgQU5UTFIzX1VJTlQzMiBkZWZfYnVmZmVyX1N0YXJ0SW5kZXg7CisKKyAgICBzZXA6OmF2bV90eXBlX3NwZWNpZmllcl9raW5kX3QgcGI7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX3BiCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9wYiBzZXA6OmF2bV90eXBlX3NwZWNpZmllcl9raW5kX3QKKworICAgIHNlcDo6YXZtX3NpemVfdCBuOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9uCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9uIHNlcDo6YXZtX3NpemVfdAorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIHJldHZhbC5zaXplID0gIC0xOworCisgICAgZGVmX2J1ZmZlcl9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgxMDUpKSApCisgICAgeworICAgIAlyZXR2YWwuc3RhcnQgPSAwOworCisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKworICAgIHJldHZhbC5zdGFydCA9IExUKDEpOyByZXR2YWwuc3RvcCA9IHJldHZhbC5zdGFydDsKKworCisgICAgeworICAgICAgICB7CisgICAgICAgICAgICAvLyAgL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzExNzoyOiAocGI9IHBvbGljeV9idWZmZXIgKCBMVF8gKG49IGludGVnZXJfY29uc3RhbnQgfCBTVEFSICkgR1QgKT8gfCAncmFtJyApCisKKyAgICAgICAgICAgIEFOVExSM19VSU5UMzIgYWx0MjY1OworCisgICAgICAgICAgICBhbHQyNjU9MjsKKworICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAyODE6CisgICAgICAgICAgICBjYXNlIDMxNToKKyAgICAgICAgICAgIGNhc2UgMzI1OgorICAgICAgICAgICAgY2FzZSAzMjY6CisgICAgICAgICAgICBjYXNlIDMyOToKKyAgICAgICAgICAgIGNhc2UgMzcwOgorICAgICAgICAgICAgY2FzZSAzNzM6CisgICAgICAgICAgICBjYXNlIDQxMjoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDI2NT0xOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzU2OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MjY1PTI7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDI2NTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9idWZmZXJFeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDI2NSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMTE3OjQ6IHBiPSBwb2xpY3lfYnVmZmVyICggTFRfIChuPSBpbnRlZ2VyX2NvbnN0YW50IHwgU1RBUiApIEdUICk/CisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19wb2xpY3lfYnVmZmVyX2luX2RlZl9idWZmZXI5MjA1KTsKKyAgICAgICAgCSAgICAgICAgcGI9cG9saWN5X2J1ZmZlcihjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfYnVmZmVyRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICByZXR2YWwua2luZD0gCisgICAgICAgIAkgICAgICAgICAgICBwYgorICAgICAgICAJICAgICAgICAgICAgOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMTE4OjQ6ICggTFRfIChuPSBpbnRlZ2VyX2NvbnN0YW50IHwgU1RBUiApIEdUICk/CisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQyNjQ9MjsKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIExUXzoKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgICAgIAkJYWx0MjY0PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0MjY0KQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMxMTg6NjogTFRfIChuPSBpbnRlZ2VyX2NvbnN0YW50IHwgU1RBUiApIEdUCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKExUXywgJkZPTExPV19MVF9faW5fZGVmX2J1ZmZlcjkyMTUpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfYnVmZmVyRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMTE5OjY6IChuPSBpbnRlZ2VyX2NvbnN0YW50IHwgU1RBUiApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQyNjM9MjsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGNhc2UgSUQ6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBjYXNlIEludGVnZXJMaXRlcmFsOgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkJYWx0MjYzPTE7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgY2FzZSBTVEFSOgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkJYWx0MjYzPTI7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDI2MzsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9idWZmZXJFeDsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDI2MykKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMTE5Ojg6IG49IGludGVnZXJfY29uc3RhbnQKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fZGVmX2J1ZmZlcjkyMjYpOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBuPWludGVnZXJfY29uc3RhbnQoY3R4KTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2J1ZmZlckV4OworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgcmV0dmFsLnNpemU9IAorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgbgorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMTIwOjg6IFNUQVIKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoU1RBUiwgJkZPTExPV19TVEFSX2luX2RlZl9idWZmZXI5MjM4KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2J1ZmZlckV4OworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgcmV0dmFsLnNpemU9IC0xOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChHVCwgJkZPTExPV19HVF9pbl9kZWZfYnVmZmVyOTI2Nyk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9idWZmZXJFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMTI0OjQ6ICdyYW0nCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDM1NiwgJkZPTExPV18zNTZfaW5fZGVmX2J1ZmZlcjkyNzYpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfYnVmZmVyRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICByZXR2YWwua2luZD0gc2VwOjpUWVBFX1JBTV9TUEVDSUZJRVI7CisgICAgICAgIAkgICAgICAgICAgICAgcmV0dmFsLnNpemU9IDE7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVkZWZfYnVmZmVyRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlZGVmX2J1ZmZlckV4OiA7CisgICAgcmV0dmFsLnN0b3AgPSBMVCgtMSk7CisKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgxMDUsIGRlZl9idWZmZXJfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiByZXR2YWw7Cit9CisvKiAkQU5UTFIgZW5kIGRlZl9idWZmZXIgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgcG9saWN5X2J1ZmZlcgorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzEyODoxOiBwb2xpY3lfYnVmZmVyIHJldHVybnMgWyBzZXA6OmF2bV90eXBlX3NwZWNpZmllcl9raW5kX3Qga2luZCBdIDogKCAnZmlmbycgfCAnbGlmbycgfCAnbXVsdGlmaWZvJyB8ICdtdWx0aWxpZm8nIHwgJ3NldCcgfCAnbXVsdGlzZXQnIHwgJ3ZlY3RvcicgfCAncnZlY3RvcicgKTsKKyAqLworc3RhdGljIHNlcDo6YXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdAorcG9saWN5X2J1ZmZlcihwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBzZXA6OmF2bV90eXBlX3NwZWNpZmllcl9raW5kX3Qga2luZDsKKworICAgIEFOVExSM19VSU5UMzIgcG9saWN5X2J1ZmZlcl9TdGFydEluZGV4OworCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIHBvbGljeV9idWZmZXJfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTA2KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiBraW5kOworICAgIH0KKworICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMxMzA6MjogKCAnZmlmbycgfCAnbGlmbycgfCAnbXVsdGlmaWZvJyB8ICdtdWx0aWxpZm8nIHwgJ3NldCcgfCAnbXVsdGlzZXQnIHwgJ3ZlY3RvcicgfCAncnZlY3RvcicgKQorCisgICAgICAgICAgICBBTlRMUjNfVUlOVDMyIGFsdDI2NjsKKworICAgICAgICAgICAgYWx0MjY2PTg7CisKKyAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMjgxOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MjY2PTE7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzMTU6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQyNjY9MjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMyNToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDI2Nj0zOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzI2OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MjY2PTQ7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzNzM6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQyNjY9NTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMyOToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDI2Nj02OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDEyOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MjY2PTc7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzNzA6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQyNjY9ODsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2luZDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDI2NjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXBvbGljeV9idWZmZXJFeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDI2NikKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMTMwOjQ6ICdmaWZvJworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgyODEsICZGT0xMT1dfMjgxX2luX3BvbGljeV9idWZmZXI5Mjk1KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlcG9saWN5X2J1ZmZlckV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGtpbmQ7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGtpbmQ9IHNlcDo6VFlQRV9GSUZPX1NQRUNJRklFUjsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAyOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMxMzE6NDogJ2xpZm8nCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDMxNSwgJkZPTExPV18zMTVfaW5fcG9saWN5X2J1ZmZlcjkzMDcpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVwb2xpY3lfYnVmZmVyRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4ga2luZDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAga2luZD0gc2VwOjpUWVBFX0xJRk9fU1BFQ0lGSUVSOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDM6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzEzMjo0OiAnbXVsdGlmaWZvJworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgzMjUsICZGT0xMT1dfMzI1X2luX3BvbGljeV9idWZmZXI5MzE5KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlcG9saWN5X2J1ZmZlckV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGtpbmQ7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGtpbmQ9IHNlcDo6VFlQRV9NVUxUSV9GSUZPX1NQRUNJRklFUjsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA0OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMxMzM6NDogJ211bHRpbGlmbycKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMzI2LCAmRk9MTE9XXzMyNl9pbl9wb2xpY3lfYnVmZmVyOTMyNik7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXBvbGljeV9idWZmZXJFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBraW5kOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBraW5kPSBzZXA6OlRZUEVfTVVMVElfTElGT19TUEVDSUZJRVI7CisgICAgICAgIAkgICAgICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgNToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMTM0OjQ6ICdzZXQnCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDM3MywgJkZPTExPV18zNzNfaW5fcG9saWN5X2J1ZmZlcjkzMzMpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVwb2xpY3lfYnVmZmVyRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4ga2luZDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAga2luZD0gc2VwOjpUWVBFX1NFVF9TUEVDSUZJRVI7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDY6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzEzNTo0OiAnbXVsdGlzZXQnCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDMyOSwgJkZPTExPV18zMjlfaW5fcG9saWN5X2J1ZmZlcjkzNDYpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVwb2xpY3lfYnVmZmVyRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4ga2luZDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAga2luZD0gc2VwOjpUWVBFX01VTFRJU0VUX1NQRUNJRklFUjsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDc6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzEzNjo0OiAndmVjdG9yJworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCg0MTIsICZGT0xMT1dfNDEyX2luX3BvbGljeV9idWZmZXI5MzU0KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlcG9saWN5X2J1ZmZlckV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGtpbmQ7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGtpbmQ9IHNlcDo6VFlQRV9WRUNUT1JfU1BFQ0lGSUVSOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA4OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMxMzc6NDogJ3J2ZWN0b3InCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDM3MCwgJkZPTExPV18zNzBfaW5fcG9saWN5X2J1ZmZlcjkzNjQpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVwb2xpY3lfYnVmZmVyRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4ga2luZDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAga2luZD0gc2VwOjpUWVBFX1JFVkVSU0VfVkVDVE9SX1NQRUNJRklFUjsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZXBvbGljeV9idWZmZXJFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVwb2xpY3lfYnVmZmVyRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgxMDYsIHBvbGljeV9idWZmZXJfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiBraW5kOworfQorLyogJEFOVExSIGVuZCBwb2xpY3lfYnVmZmVyICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IHJlZl9idWZmZXIKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMxNDA6MTogcmVmX2J1ZmZlclsgc2VwOjpNYWNoaW5lICogbWFjaGluZSBdIHJldHVybnMgWyBzZXA6OkJGIGJ1ZiBdIDogaWQ9IHF1YWxpZmllZE5hbWVJRCA7CisgKi8KK3N0YXRpYyBzZXA6OkJGCityZWZfYnVmZmVyKHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBtYWNoaW5lKQoreworICAgIHNlcDo6QkYgYnVmOworCisgICAgQU5UTFIzX1VJTlQzMiByZWZfYnVmZmVyX1N0YXJ0SW5kZXg7CisKKyAgICBmbWxQYXJzZXJfcXVhbGlmaWVkTmFtZUlEX3JldHVybiBpZDsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfaWQKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2lkIGZtbFBhcnNlcl9xdWFsaWZpZWROYW1lSURfcmV0dXJuCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgcmVmX2J1ZmZlcl9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgxMDcpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMxNDI6MjogKGlkPSBxdWFsaWZpZWROYW1lSUQgKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMTQyOjQ6IGlkPSBxdWFsaWZpZWROYW1lSUQKKyAgICAgICAgeworICAgICAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX3JlZl9idWZmZXI5Mzg2KTsKKyAgICAgICAgICAgIGlkPXF1YWxpZmllZE5hbWVJRChjdHgpOworCisgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlcmVmX2J1ZmZlckV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBidWY7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBidWY9IHNlcDo6UGFyc2VyVXRpbDo6Z2V0QnVmZmVyKG1hY2hpbmUsIAorICAgICAgICAgICAgICAgIGlkLnMKKyAgICAgICAgICAgICAgICAsIGlkLm5iCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVyZWZfYnVmZmVyRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlcmVmX2J1ZmZlckV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTA3LCByZWZfYnVmZmVyX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gYnVmOworfQorLyogJEFOVExSIGVuZCByZWZfYnVmZmVyICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGluaXRpYWxfYnVmZmVyX2NvbnRlbnRzCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMTQ3OjE6IGluaXRpYWxfYnVmZmVyX2NvbnRlbnRzWyBjb25zdCBzZXA6OkJ1ZmZlciAqIGJ1ZmZlciBdIDogQVNTSUdOIExCUkFDS0VUIG1pZD0gcXVhbGlmaWVkTmFtZUlEICggQ09NTUEgbWlkPSBxdWFsaWZpZWROYW1lSUQgKSogUkJSQUNLRVQgOworICovCitzdGF0aWMgdm9pZAoraW5pdGlhbF9idWZmZXJfY29udGVudHMocGZtbFBhcnNlciBjdHgsIGNvbnN0IHNlcDo6QnVmZmVyICogYnVmZmVyKQoreworICAgIEFOVExSM19VSU5UMzIgaW5pdGlhbF9idWZmZXJfY29udGVudHNfU3RhcnRJbmRleDsKKworICAgIGZtbFBhcnNlcl9xdWFsaWZpZWROYW1lSURfcmV0dXJuIG1pZDsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfbWlkCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9taWQgZm1sUGFyc2VyX3F1YWxpZmllZE5hbWVJRF9yZXR1cm4KKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBpbml0aWFsX2J1ZmZlcl9jb250ZW50c19TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisKKyAgICAJc2VwOjpCRiBtc2c7CisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDEwOCkpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzE1MToyOiAoIEFTU0lHTiBMQlJBQ0tFVCBtaWQ9IHF1YWxpZmllZE5hbWVJRCAoIENPTU1BIG1pZD0gcXVhbGlmaWVkTmFtZUlEICkqIFJCUkFDS0VUICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzE1MTo0OiBBU1NJR04gTEJSQUNLRVQgbWlkPSBxdWFsaWZpZWROYW1lSUQgKCBDT01NQSBtaWQ9IHF1YWxpZmllZE5hbWVJRCApKiBSQlJBQ0tFVAorICAgICAgICB7CisgICAgICAgICAgICAgTUFUQ0hUKEFTU0lHTiwgJkZPTExPV19BU1NJR05faW5faW5pdGlhbF9idWZmZXJfY29udGVudHM5NDA2KTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlaW5pdGlhbF9idWZmZXJfY29udGVudHNFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICBNQVRDSFQoTEJSQUNLRVQsICZGT0xMT1dfTEJSQUNLRVRfaW5faW5pdGlhbF9idWZmZXJfY29udGVudHM5NDA4KTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlaW5pdGlhbF9idWZmZXJfY29udGVudHNFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9pbml0aWFsX2J1ZmZlcl9jb250ZW50czk0MTcpOworICAgICAgICAgICAgbWlkPXF1YWxpZmllZE5hbWVJRChjdHgpOworCisgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlaW5pdGlhbF9idWZmZXJfY29udGVudHNFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBtc2cgPSBzZXA6OlBhcnNlclV0aWw6OmdldE1lc3NhZ2UobWlkLnMKKyAgICAgICAgICAgICAgICAsIG1pZC5uYgorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgCSAgICAJYnVmZmVyLT5hcHBlbmRNZXNzYWdlKG1zZyk7ICovCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzE1NTo0OiAoIENPTU1BIG1pZD0gcXVhbGlmaWVkTmFtZUlEICkqCisKKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDI2Nz0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBDT01NQToKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0MjY3PTE7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDI2NykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMTU1OjY6IENPTU1BIG1pZD0gcXVhbGlmaWVkTmFtZUlECisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoQ09NTUEsICZGT0xMT1dfQ09NTUFfaW5faW5pdGlhbF9idWZmZXJfY29udGVudHM5NDMxKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlaW5pdGlhbF9idWZmZXJfY29udGVudHNFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9pbml0aWFsX2J1ZmZlcl9jb250ZW50czk0MzUpOworICAgICAgICAgICAgCSAgICAgICAgbWlkPXF1YWxpZmllZE5hbWVJRChjdHgpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlaW5pdGlhbF9idWZmZXJfY29udGVudHNFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQ6CisgICAgICAgICAgICAJICAgIGdvdG8gbG9vcDI2NzsJLyogYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvb3AyNjc6IDsgLyogSnVtcCBvdXQgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKworCisgICAgICAgICAgICAgTUFUQ0hUKFJCUkFDS0VULCAmRk9MTE9XX1JCUkFDS0VUX2luX2luaXRpYWxfYnVmZmVyX2NvbnRlbnRzOTQ0Nik7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWluaXRpYWxfYnVmZmVyX2NvbnRlbnRzRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZWluaXRpYWxfYnVmZmVyX2NvbnRlbnRzRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlaW5pdGlhbF9idWZmZXJfY29udGVudHNFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDEwOCwgaW5pdGlhbF9idWZmZXJfY29udGVudHNfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGluaXRpYWxfYnVmZmVyX2NvbnRlbnRzICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGRlY2xfY2hhbm5lbAorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzE2NToxOiBkZWNsX2NoYW5uZWxbIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5ICwgc2VwOjpNb2RpZmllciBtZGZyIF0gOiAnY2hhbm5lbCcgZGVjbF9jaGFubmVsX3BvcnRbIGRlY2xQcm9wZXJ0eSAsIG1kZnIgXSA7CisgKi8KK3N0YXRpYyB2b2lkCitkZWNsX2NoYW5uZWwocGZtbFBhcnNlciBjdHgsIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5LCBzZXA6Ok1vZGlmaWVyIG1kZnIpCit7CisgICAgQU5UTFIzX1VJTlQzMiBkZWNsX2NoYW5uZWxfU3RhcnRJbmRleDsKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBkZWNsX2NoYW5uZWxfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTA5KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMTY3OjI6ICggJ2NoYW5uZWwnIGRlY2xfY2hhbm5lbF9wb3J0WyBkZWNsUHJvcGVydHkgLCBtZGZyIF0gKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMTY3OjQ6ICdjaGFubmVsJyBkZWNsX2NoYW5uZWxfcG9ydFsgZGVjbFByb3BlcnR5ICwgbWRmciBdCisgICAgICAgIHsKKyAgICAgICAgICAgICBNQVRDSFQoMjUzLCAmRk9MTE9XXzI1M19pbl9kZWNsX2NoYW5uZWw5NDY1KTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZGVjbF9jaGFubmVsRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWNsX2NoYW5uZWxfcG9ydF9pbl9kZWNsX2NoYW5uZWw5NDY4KTsKKyAgICAgICAgICAgIGRlY2xfY2hhbm5lbF9wb3J0KGN0eCwgZGVjbFByb3BlcnR5LCBtZGZyKTsKKworICAgICAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfY2hhbm5lbEV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVkZWNsX2NoYW5uZWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVkZWNsX2NoYW5uZWxFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDEwOSwgZGVjbF9jaGFubmVsX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBkZWNsX2NoYW5uZWwgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgZGVjbF9jaGFubmVsX3BvcnQKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMxNzQ6MTogZGVjbF9jaGFubmVsX3BvcnRbIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5ICwgc2VwOjpNb2RpZmllciBtZGZyIF0gOiAoIExUXyBjb21fcHJvdG9jb2xbIGRlY2xQcm9wZXJ0eS5nZXRDb250YWluZXIoKS0+YXM8IHNlcDo6TWFjaGluZSA+KCksIGFDaGFubmVsIF0gKCBDT01NQSBjb21fY2FzdFsgYUNoYW5uZWwgXSApPyBHVCApPyAoIG1vZGlmaWVyX3NldF9kaXJlY3Rpb25fc3RyaWN0X3RleHRbIGFDaGFubmVsLT5nZXR3TW9kaWZpZXIoKSBdICk/IGlkPSBJRCBMQ1VSTFkgKG09IG1vZGlmaWVyX2RpcmVjdGlvbiB1aWQ9IHF1YWxpZmllZE5hbWVJRCBTRU1JIHwgZGVjbF9wb3J0WyAqKGFDaGFubmVsLT5nZXRDb250ZW50cygpKSAsXG5cdCBcdFx0XHRcdFx0c2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfUFVCTElDX01PRElGSUVSIF0gfCBkZWNsX3NpZ25hbFsgKihhQ2hhbm5lbC0+Z2V0Q29udGVudHMoKSkgLFxuXHQgXHRcdFx0XHRcdHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX1BVQkxJQ19NT0RJRklFUiBdICkrIFJDVVJMWSA7CisgKi8KK3N0YXRpYyB2b2lkCitkZWNsX2NoYW5uZWxfcG9ydChwZm1sUGFyc2VyIGN0eCwgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHksIHNlcDo6TW9kaWZpZXIgbWRmcikKK3sKKyAgICBBTlRMUjNfVUlOVDMyIGRlY2xfY2hhbm5lbF9wb3J0X1N0YXJ0SW5kZXg7CisKKyAgICBwQU5UTFIzX0NPTU1PTl9UT0tFTiAgICBpZDsKKyAgICBzZXA6Ok1vZGlmaWVyIG07CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX20KKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX20gc2VwOjpNb2RpZmllcgorCisgICAgZm1sUGFyc2VyX3F1YWxpZmllZE5hbWVJRF9yZXR1cm4gdWlkOworICAgICN1bmRlZglSRVRVUk5fVFlQRV91aWQKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX3VpZCBmbWxQYXJzZXJfcXVhbGlmaWVkTmFtZUlEX3JldHVybgorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGRlY2xfY2hhbm5lbF9wb3J0X1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKworICAgIAlzZXA6OkNoYW5uZWwgKiBhQ2hhbm5lbDsKKworICAgICAgCWRlY2xQcm9wZXJ0eS5hcHBlbmRDaGFubmVsKCBzZXA6OkJGKCBhQ2hhbm5lbCA9CisgICAgICAJCQluZXcgc2VwOjpDaGFubmVsKCBkZWNsUHJvcGVydHksCisgICAgICAJCQkJCSIjY2hhbm5lbCMiLCBtZGZyLnNldERpcmVjdGlvbklub3V0RWxzZSgpICkgKSk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTEwKSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgaWQgICAgICAgPSBOVUxMOworCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMTg0OjI6ICggKCBMVF8gY29tX3Byb3RvY29sWyBkZWNsUHJvcGVydHkuZ2V0Q29udGFpbmVyKCktPmFzPCBzZXA6Ok1hY2hpbmUgPigpLCBhQ2hhbm5lbCBdICggQ09NTUEgY29tX2Nhc3RbIGFDaGFubmVsIF0gKT8gR1QgKT8gKCBtb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0WyBhQ2hhbm5lbC0+Z2V0d01vZGlmaWVyKCkgXSApPyBpZD0gSUQgTENVUkxZIChtPSBtb2RpZmllcl9kaXJlY3Rpb24gdWlkPSBxdWFsaWZpZWROYW1lSUQgU0VNSSB8IGRlY2xfcG9ydFsgKihhQ2hhbm5lbC0+Z2V0Q29udGVudHMoKSkgLFxuXHQgXHRcdFx0XHRcdHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX1BVQkxJQ19NT0RJRklFUiBdIHwgZGVjbF9zaWduYWxbICooYUNoYW5uZWwtPmdldENvbnRlbnRzKCkpICxcblx0IFx0XHRcdFx0XHRzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9QVUJMSUNfTU9ESUZJRVIgXSApKyBSQ1VSTFkgKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMTg0OjQ6ICggTFRfIGNvbV9wcm90b2NvbFsgZGVjbFByb3BlcnR5LmdldENvbnRhaW5lcigpLT5hczwgc2VwOjpNYWNoaW5lID4oKSwgYUNoYW5uZWwgXSAoIENPTU1BIGNvbV9jYXN0WyBhQ2hhbm5lbCBdICk/IEdUICk/ICggbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dFsgYUNoYW5uZWwtPmdldHdNb2RpZmllcigpIF0gKT8gaWQ9IElEIExDVVJMWSAobT0gbW9kaWZpZXJfZGlyZWN0aW9uIHVpZD0gcXVhbGlmaWVkTmFtZUlEIFNFTUkgfCBkZWNsX3BvcnRbICooYUNoYW5uZWwtPmdldENvbnRlbnRzKCkpICxcblx0IFx0XHRcdFx0XHRzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9QVUJMSUNfTU9ESUZJRVIgXSB8IGRlY2xfc2lnbmFsWyAqKGFDaGFubmVsLT5nZXRDb250ZW50cygpKSAsXG5cdCBcdFx0XHRcdFx0c2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfUFVCTElDX01PRElGSUVSIF0gKSsgUkNVUkxZCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMxODQ6NDogKCBMVF8gY29tX3Byb3RvY29sWyBkZWNsUHJvcGVydHkuZ2V0Q29udGFpbmVyKCktPmFzPCBzZXA6Ok1hY2hpbmUgPigpLCBhQ2hhbm5lbCBdICggQ09NTUEgY29tX2Nhc3RbIGFDaGFubmVsIF0gKT8gR1QgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MjY5PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMVF86CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJYWx0MjY5PTE7CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDI2OSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMTg0OjY6IExUXyBjb21fcHJvdG9jb2xbIGRlY2xQcm9wZXJ0eS5nZXRDb250YWluZXIoKS0+YXM8IHNlcDo6TWFjaGluZSA+KCksIGFDaGFubmVsIF0gKCBDT01NQSBjb21fY2FzdFsgYUNoYW5uZWwgXSApPyBHVAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKExUXywgJkZPTExPV19MVF9faW5fZGVjbF9jaGFubmVsX3BvcnQ5NDkxKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVjbF9jaGFubmVsX3BvcnRFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2NvbV9wcm90b2NvbF9pbl9kZWNsX2NoYW5uZWxfcG9ydDk0OTgpOworICAgICAgICAgICAgCSAgICAgICAgY29tX3Byb3RvY29sKGN0eCwgZGVjbFByb3BlcnR5LmdldENvbnRhaW5lcigpLT5hczwgc2VwOjpNYWNoaW5lID4oKSwgYUNoYW5uZWwpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVjbF9jaGFubmVsX3BvcnRFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMxODY6NjogKCBDT01NQSBjb21fY2FzdFsgYUNoYW5uZWwgXSApPworICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQyNjg9MjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIENPTU1BOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJCWFsdDI2OD0xOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQyNjgpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzE4Njo4OiBDT01NQSBjb21fY2FzdFsgYUNoYW5uZWwgXQorICAgICAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKENPTU1BLCAmRk9MTE9XX0NPTU1BX2luX2RlY2xfY2hhbm5lbF9wb3J0OTUwOCk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfY2hhbm5lbF9wb3J0RXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19jb21fY2FzdF9pbl9kZWNsX2NoYW5uZWxfcG9ydDk1MTApOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgY29tX2Nhc3QoY3R4LCBhQ2hhbm5lbCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX2NoYW5uZWxfcG9ydEV4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKEdULCAmRk9MTE9XX0dUX2luX2RlY2xfY2hhbm5lbF9wb3J0OTUyMSk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfY2hhbm5lbF9wb3J0RXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMxOTA6NDogKCBtb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0WyBhQ2hhbm5lbC0+Z2V0d01vZGlmaWVyKCkgXSApPworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQyNzA9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDI5ODoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzMDU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzQxOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM2NDoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQyNzA9MTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MjcwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMxOTA6NjogbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dFsgYUNoYW5uZWwtPmdldHdNb2RpZmllcigpIF0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dF9pbl9kZWNsX2NoYW5uZWxfcG9ydDk1MzUpOworICAgICAgICAgICAgCSAgICAgICAgbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dChjdHgsIGFDaGFubmVsLT5nZXR3TW9kaWZpZXIoKSk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX2NoYW5uZWxfcG9ydEV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZCA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTikgTUFUQ0hUKElELCAmRk9MTE9XX0lEX2luX2RlY2xfY2hhbm5lbF9wb3J0OTU0Nyk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfY2hhbm5lbF9wb3J0RXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIGFDaGFubmVsLT5mdWxseVVwZGF0ZUFsbE5hbWVJRCggU1RSKChpZC0+Z2V0VGV4dChpZCkpLT5jaGFycykgKTsgCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgIE1BVENIVChMQ1VSTFksICZGT0xMT1dfTENVUkxZX2luX2RlY2xfY2hhbm5lbF9wb3J0OTU1Nik7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfY2hhbm5lbF9wb3J0RXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMTk0OjQ6IChtPSBtb2RpZmllcl9kaXJlY3Rpb24gdWlkPSBxdWFsaWZpZWROYW1lSUQgU0VNSSB8IGRlY2xfcG9ydFsgKihhQ2hhbm5lbC0+Z2V0Q29udGVudHMoKSkgLFxuXHQgXHRcdFx0XHRcdHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX1BVQkxJQ19NT0RJRklFUiBdIHwgZGVjbF9zaWduYWxbICooYUNoYW5uZWwtPmdldENvbnRlbnRzKCkpICxcblx0IFx0XHRcdFx0XHRzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9QVUJMSUNfTU9ESUZJRVIgXSApKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBjbnQyNzE9MDsKKworICAgICAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MjcxPTQ7CisgICAgICAgICAgICAJc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAljYXNlIEFTU0lHTl9SRUY6CisgICAgICAgICAgICAJY2FzZSBMVEU6CisgICAgICAgICAgICAJY2FzZSAxNjQ6CisgICAgICAgICAgICAJY2FzZSAxNjY6CisgICAgICAgICAgICAJY2FzZSAyOTU6CisgICAgICAgICAgICAJY2FzZSAyOTg6CisgICAgICAgICAgICAJY2FzZSAzMDU6CisgICAgICAgICAgICAJY2FzZSAzMzU6CisgICAgICAgICAgICAJY2FzZSAzNDE6CisgICAgICAgICAgICAJY2FzZSAzNjQ6CisgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgIAkJCWFsdDI3MT0xOworICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMzQ0OgorICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAJCQlhbHQyNzE9MjsKKyAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDMyMDoKKyAgICAgICAgICAgIAljYXNlIDM3NDoKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkJYWx0MjcxPTM7CisgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAl9CisKKyAgICAgICAgICAgIAlzd2l0Y2ggKGFsdDI3MSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgIGNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMxOTU6NjogbT0gbW9kaWZpZXJfZGlyZWN0aW9uIHVpZD0gcXVhbGlmaWVkTmFtZUlEIFNFTUkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19tb2RpZmllcl9kaXJlY3Rpb25faW5fZGVjbF9jaGFubmVsX3BvcnQ5NTcwKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBtPW1vZGlmaWVyX2RpcmVjdGlvbihjdHgpOworCisgICAgICAgICAgICAJICAgICAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfY2hhbm5lbF9wb3J0RXg7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fZGVjbF9jaGFubmVsX3BvcnQ5NTc1KTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB1aWQ9cXVhbGlmaWVkTmFtZUlEKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlZGVjbF9jaGFubmVsX3BvcnRFeDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgICAgICBNQVRDSFQoU0VNSSwgJkZPTExPV19TRU1JX2luX2RlY2xfY2hhbm5lbF9wb3J0OTU3Nyk7CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfY2hhbm5lbF9wb3J0RXg7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAkgICAgCXNlcDo6QkYgY29tU2lnbmFsID0gc2VwOjpQYXJzZXJVdGlsOjpnZXRDb21TaWduYWwodWlkLnMKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgLCB1aWQubmIKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCSAgCQlpZiggY29tU2lnbmFsLnZhbGlkKCkgKQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJICAJCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCSAgCQkJYUNoYW5uZWwtPmFwcGVuZFNpZ25hbChtCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICwgY29tU2lnbmFsKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCSAgCQl9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICBjYXNlIDI6CisgICAgICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMjA0OjY6IGRlY2xfcG9ydFsgKihhQ2hhbm5lbC0+Z2V0Q29udGVudHMoKSkgLFxuXHQgXHRcdFx0XHRcdHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX1BVQkxJQ19NT0RJRklFUiBdCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVjbF9wb3J0X2luX2RlY2xfY2hhbm5lbF9wb3J0OTU5Mik7CisgICAgICAgICAgICAJICAgICAgICAgICAgZGVjbF9wb3J0KGN0eCwgKihhQ2hhbm5lbC0+Z2V0Q29udGVudHMoKSksIHNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX1BVQkxJQ19NT0RJRklFUik7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlZGVjbF9jaGFubmVsX3BvcnRFeDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgIGNhc2UgMzoKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMyMDc6NjogZGVjbF9zaWduYWxbICooYUNoYW5uZWwtPmdldENvbnRlbnRzKCkpICxcblx0IFx0XHRcdFx0XHRzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9QVUJMSUNfTU9ESUZJRVIgXQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlY2xfc2lnbmFsX2luX2RlY2xfY2hhbm5lbF9wb3J0OTYwOSk7CisgICAgICAgICAgICAJICAgICAgICAgICAgZGVjbF9zaWduYWwoY3R4LCAqKGFDaGFubmVsLT5nZXRDb250ZW50cygpKSwgc2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfUFVCTElDX01PRElGSUVSKTsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX2NoYW5uZWxfcG9ydEV4OworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICBkZWZhdWx0OgorCisgICAgICAgICAgICAJCWlmICggY250MjcxID49IDEgKQorICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAJCSAgICBnb3RvIGxvb3AyNzE7CisgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgIAkJaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAJCSAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAJCSAgICByZXR1cm4gOworICAgICAgICAgICAgCQl9CisKKyAgICAgICAgICAgIAkJLyogbWlzbWF0Y2hlZFNldEV4KCkKKyAgICAgICAgICAgIAkJICovCisgICAgICAgICAgICAJCUNPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAJCUVYQ0VQVElPTi0+dHlwZSA9IEFOVExSM19FQVJMWV9FWElUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIAkJRVhDRVBUSU9OLT5uYW1lID0gKHZvaWQgKilBTlRMUjNfRUFSTFlfRVhJVF9OQU1FOworCisKKyAgICAgICAgICAgIAkJZ290byBydWxlZGVjbF9jaGFubmVsX3BvcnRFeDsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJY250MjcxKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxvb3AyNzE6IDsJLyogSnVtcCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgTUFUQ0hUKFJDVVJMWSwgJkZPTExPV19SQ1VSTFlfaW5fZGVjbF9jaGFubmVsX3BvcnQ5NjIxKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZGVjbF9jaGFubmVsX3BvcnRFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlZGVjbF9jaGFubmVsX3BvcnRFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVkZWNsX2NoYW5uZWxfcG9ydEV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTEwLCBkZWNsX2NoYW5uZWxfcG9ydF9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgZGVjbF9jaGFubmVsX3BvcnQgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgZGVjbF9jaGFubmVsX3ZhcgorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzIxNDoxOiBkZWNsX2NoYW5uZWxfdmFyWyBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSAsIHNlcDo6TW9kaWZpZXIgbWRmciBdIDogKHR2PSB0eXBlX3ZhciBpZD0gSUQgKGl2PSBpbml0aWFsX3ZhbHVlICk/ICggU0VNSSB8IG9uX3dyaXRlX3Zhcl9yb3V0aW5lX2RlZlsgdmFyIF0gKSB8IExDVVJMWSAodHY9IHR5cGVfdmFyIGlkPSBJRCAoaXY9IGluaXRpYWxfdmFsdWUgKT8gKCBTRU1JIHwgb25fd3JpdGVfdmFyX3JvdXRpbmVfZGVmWyB2YXIgXSApICkrIFJDVVJMWSApOworICovCitzdGF0aWMgdm9pZAorZGVjbF9jaGFubmVsX3ZhcihwZm1sUGFyc2VyIGN0eCwgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHksIHNlcDo6TW9kaWZpZXIgbWRmcikKK3sKKyAgICBBTlRMUjNfVUlOVDMyIGRlY2xfY2hhbm5lbF92YXJfU3RhcnRJbmRleDsKKworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIGlkOworICAgIHNlcDo6QkYgdHY7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX3R2CisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV90diBzZXA6OkJGCisKKyAgICBzZXA6OkJGIGl2OworICAgICN1bmRlZglSRVRVUk5fVFlQRV9pdgorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfaXYgc2VwOjpCRgorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGRlY2xfY2hhbm5lbF92YXJfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworCisgICAgCXNlcDo6VmFyaWFibGUgKiB2YXI7CisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDExMSkpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIGlkICAgICAgID0gTlVMTDsKKworICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMyMTk6MjogKHR2PSB0eXBlX3ZhciBpZD0gSUQgKGl2PSBpbml0aWFsX3ZhbHVlICk/ICggU0VNSSB8IG9uX3dyaXRlX3Zhcl9yb3V0aW5lX2RlZlsgdmFyIF0gKSB8IExDVVJMWSAodHY9IHR5cGVfdmFyIGlkPSBJRCAoaXY9IGluaXRpYWxfdmFsdWUgKT8gKCBTRU1JIHwgb25fd3JpdGVfdmFyX3JvdXRpbmVfZGVmWyB2YXIgXSApICkrIFJDVVJMWSApCisKKyAgICAgICAgICAgIEFOVExSM19VSU5UMzIgYWx0Mjc3OworCisgICAgICAgICAgICBhbHQyNzc9MjsKKworICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgICAgIGNhc2UgMjQxOgorICAgICAgICAgICAgY2FzZSAyNDI6CisgICAgICAgICAgICBjYXNlIDI0NToKKyAgICAgICAgICAgIGNhc2UgMjQ2OgorICAgICAgICAgICAgY2FzZSAyNDk6CisgICAgICAgICAgICBjYXNlIDI1NDoKKyAgICAgICAgICAgIGNhc2UgMjU1OgorICAgICAgICAgICAgY2FzZSAyNTk6CisgICAgICAgICAgICBjYXNlIDI2MToKKyAgICAgICAgICAgIGNhc2UgMjY0OgorICAgICAgICAgICAgY2FzZSAyNzA6CisgICAgICAgICAgICBjYXNlIDI3MToKKyAgICAgICAgICAgIGNhc2UgMjgxOgorICAgICAgICAgICAgY2FzZSAyODM6CisgICAgICAgICAgICBjYXNlIDMwOToKKyAgICAgICAgICAgIGNhc2UgMzEwOgorICAgICAgICAgICAgY2FzZSAzMTE6CisgICAgICAgICAgICBjYXNlIDMxNToKKyAgICAgICAgICAgIGNhc2UgMzE2OgorICAgICAgICAgICAgY2FzZSAzMTc6CisgICAgICAgICAgICBjYXNlIDMyMDoKKyAgICAgICAgICAgIGNhc2UgMzI1OgorICAgICAgICAgICAgY2FzZSAzMjY6CisgICAgICAgICAgICBjYXNlIDMyOToKKyAgICAgICAgICAgIGNhc2UgMzMzOgorICAgICAgICAgICAgY2FzZSAzNDQ6CisgICAgICAgICAgICBjYXNlIDM0NToKKyAgICAgICAgICAgIGNhc2UgMzQ2OgorICAgICAgICAgICAgY2FzZSAzNTc6CisgICAgICAgICAgICBjYXNlIDM1ODoKKyAgICAgICAgICAgIGNhc2UgMzYwOgorICAgICAgICAgICAgY2FzZSAzNzA6CisgICAgICAgICAgICBjYXNlIDM3MzoKKyAgICAgICAgICAgIGNhc2UgMzc0OgorICAgICAgICAgICAgY2FzZSAzODc6CisgICAgICAgICAgICBjYXNlIDM5MjoKKyAgICAgICAgICAgIGNhc2UgMzk5OgorICAgICAgICAgICAgY2FzZSA0MDA6CisgICAgICAgICAgICBjYXNlIDQwMToKKyAgICAgICAgICAgIGNhc2UgNDAyOgorICAgICAgICAgICAgY2FzZSA0MDU6CisgICAgICAgICAgICBjYXNlIDQwNzoKKyAgICAgICAgICAgIGNhc2UgNDA4OgorICAgICAgICAgICAgY2FzZSA0MDk6CisgICAgICAgICAgICBjYXNlIDQxMjoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDI3Nz0xOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTENVUkxZOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0Mjc3PTI7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDI3NzsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfY2hhbm5lbF92YXJFeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDI3NykKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMjE5OjQ6IHR2PSB0eXBlX3ZhciBpZD0gSUQgKGl2PSBpbml0aWFsX3ZhbHVlICk/ICggU0VNSSB8IG9uX3dyaXRlX3Zhcl9yb3V0aW5lX2RlZlsgdmFyIF0gKQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfdHlwZV92YXJfaW5fZGVjbF9jaGFubmVsX3Zhcjk2NDIpOworICAgICAgICAJICAgICAgICB0dj10eXBlX3ZhcihjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX2NoYW5uZWxfdmFyRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZCA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTikgTUFUQ0hUKElELCAmRk9MTE9XX0lEX2luX2RlY2xfY2hhbm5lbF92YXI5NjQ3KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVjbF9jaGFubmVsX3ZhckV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisKKyAgICAgICAgCSAgICAgICAgICAgIAkgIAlkZWNsUHJvcGVydHkuc2F2ZU93bmVkVmFyaWFibGUoIHZhciA9IG5ldyBzZXA6OlZhcmlhYmxlKAorICAgICAgICAJICAgICAgICAgICAgCSAgCQkJZGVjbFByb3BlcnR5LCBtZGZyLCB0dgorICAgICAgICAJICAgICAgICAgICAgLCBTVFIoKGlkLT5nZXRUZXh0KGlkKSktPmNoYXJzKSkgKTsKKyAgICAgICAgCSAgICAgICAgICAgIAkgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMjI0OjQ6IChpdj0gaW5pdGlhbF92YWx1ZSApPworICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0MjcyPTI7CisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBBU1NJR046CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBMUEFSRU46CisgICAgICAgIAkgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJCWFsdDI3Mj0xOworICAgICAgICAJICAgICAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDI3MikKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMjI0OjY6IGl2PSBpbml0aWFsX3ZhbHVlCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19pbml0aWFsX3ZhbHVlX2luX2RlY2xfY2hhbm5lbF92YXI5NjYxKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaXY9aW5pdGlhbF92YWx1ZShjdHgpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX2NoYW5uZWxfdmFyRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICB2YXItPnNldFZhbHVlKGl2CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICApOyAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMyMjU6NDogKCBTRU1JIHwgb25fd3JpdGVfdmFyX3JvdXRpbmVfZGVmWyB2YXIgXSApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQyNzM9MjsKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgU0VNSToKKyAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAJCWFsdDI3Mz0xOworICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgTENVUkxZOgorICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgIAkJYWx0MjczPTI7CisgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAJICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDI3MzsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfY2hhbm5lbF92YXJFeDsKKworICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDI3MykKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMjI1OjY6IFNFTUkKKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoU0VNSSwgJkZPTExPV19TRU1JX2luX2RlY2xfY2hhbm5lbF92YXI5Njc0KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVjbF9jaGFubmVsX3ZhckV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAljYXNlIDI6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzIyNToxNTogb25fd3JpdGVfdmFyX3JvdXRpbmVfZGVmWyB2YXIgXQorICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfb25fd3JpdGVfdmFyX3JvdXRpbmVfZGVmX2luX2RlY2xfY2hhbm5lbF92YXI5NjgwKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgb25fd3JpdGVfdmFyX3JvdXRpbmVfZGVmKGN0eCwgdmFyKTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVjbF9jaGFubmVsX3ZhckV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAyOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMyMjc6NDogTENVUkxZICh0dj0gdHlwZV92YXIgaWQ9IElEIChpdj0gaW5pdGlhbF92YWx1ZSApPyAoIFNFTUkgfCBvbl93cml0ZV92YXJfcm91dGluZV9kZWZbIHZhciBdICkgKSsgUkNVUkxZCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKExDVVJMWSwgJkZPTExPV19MQ1VSTFlfaW5fZGVjbF9jaGFubmVsX3Zhcjk2ODkpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX2NoYW5uZWxfdmFyRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMjI3OjExOiAodHY9IHR5cGVfdmFyIGlkPSBJRCAoaXY9IGluaXRpYWxfdmFsdWUgKT8gKCBTRU1JIHwgb25fd3JpdGVfdmFyX3JvdXRpbmVfZGVmWyB2YXIgXSApICkrCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGludCBjbnQyNzY9MDsKKworICAgICAgICAJICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBpbnQgYWx0Mjc2PTI7CisgICAgICAgIAkgICAgICAgIAlzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAkgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgIAljYXNlIElEOgorICAgICAgICAJICAgICAgICAJY2FzZSAyNDE6CisgICAgICAgIAkgICAgICAgIAljYXNlIDI0MjoKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMjQ1OgorICAgICAgICAJICAgICAgICAJY2FzZSAyNDY6CisgICAgICAgIAkgICAgICAgIAljYXNlIDI0OToKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMjU0OgorICAgICAgICAJICAgICAgICAJY2FzZSAyNTU6CisgICAgICAgIAkgICAgICAgIAljYXNlIDI1OToKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMjYxOgorICAgICAgICAJICAgICAgICAJY2FzZSAyNjQ6CisgICAgICAgIAkgICAgICAgIAljYXNlIDI3MDoKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMjcxOgorICAgICAgICAJICAgICAgICAJY2FzZSAyODE6CisgICAgICAgIAkgICAgICAgIAljYXNlIDI4MzoKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMzA5OgorICAgICAgICAJICAgICAgICAJY2FzZSAzMTA6CisgICAgICAgIAkgICAgICAgIAljYXNlIDMxMToKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMzE1OgorICAgICAgICAJICAgICAgICAJY2FzZSAzMTY6CisgICAgICAgIAkgICAgICAgIAljYXNlIDMxNzoKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMzIwOgorICAgICAgICAJICAgICAgICAJY2FzZSAzMjU6CisgICAgICAgIAkgICAgICAgIAljYXNlIDMyNjoKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMzI5OgorICAgICAgICAJICAgICAgICAJY2FzZSAzMzM6CisgICAgICAgIAkgICAgICAgIAljYXNlIDM0NDoKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMzQ1OgorICAgICAgICAJICAgICAgICAJY2FzZSAzNDY6CisgICAgICAgIAkgICAgICAgIAljYXNlIDM1NzoKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMzU4OgorICAgICAgICAJICAgICAgICAJY2FzZSAzNjA6CisgICAgICAgIAkgICAgICAgIAljYXNlIDM3MDoKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMzczOgorICAgICAgICAJICAgICAgICAJY2FzZSAzNzQ6CisgICAgICAgIAkgICAgICAgIAljYXNlIDM4NzoKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMzkyOgorICAgICAgICAJICAgICAgICAJY2FzZSAzOTk6CisgICAgICAgIAkgICAgICAgIAljYXNlIDQwMDoKKyAgICAgICAgCSAgICAgICAgCWNhc2UgNDAxOgorICAgICAgICAJICAgICAgICAJY2FzZSA0MDI6CisgICAgICAgIAkgICAgICAgIAljYXNlIDQwNToKKyAgICAgICAgCSAgICAgICAgCWNhc2UgNDA3OgorICAgICAgICAJICAgICAgICAJY2FzZSA0MDg6CisgICAgICAgIAkgICAgICAgIAljYXNlIDQwOToKKyAgICAgICAgCSAgICAgICAgCWNhc2UgNDEyOgorICAgICAgICAJICAgICAgICAJCXsKKyAgICAgICAgCSAgICAgICAgCQkJYWx0Mjc2PTE7CisgICAgICAgIAkgICAgICAgIAkJfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgIAl9CisKKyAgICAgICAgCSAgICAgICAgCXN3aXRjaCAoYWx0Mjc2KQorICAgICAgICAJICAgICAgICAJeworICAgICAgICAJICAgICAgICAJICAgIGNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzIyODo0OiB0dj0gdHlwZV92YXIgaWQ9IElEIChpdj0gaW5pdGlhbF92YWx1ZSApPyAoIFNFTUkgfCBvbl93cml0ZV92YXJfcm91dGluZV9kZWZbIHZhciBdICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfdHlwZV92YXJfaW5fZGVjbF9jaGFubmVsX3Zhcjk2OTgpOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgdHY9dHlwZV92YXIoY3R4KTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfY2hhbm5lbF92YXJFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGlkID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoSUQsICZGT0xMT1dfSURfaW5fZGVjbF9jaGFubmVsX3Zhcjk3MDMpOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX2NoYW5uZWxfdmFyRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAJICAJZGVjbFByb3BlcnR5LnNhdmVPd25lZFZhcmlhYmxlKCB2YXIgPSBuZXcgc2VwOjpWYXJpYWJsZSgKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAJICAJCQlkZWNsUHJvcGVydHksIG1kZnIsIHR2CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgLCBTVFIoKGlkLT5nZXRUZXh0KGlkKSktPmNoYXJzKSkgKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAJICAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMjMzOjQ6IChpdj0gaW5pdGlhbF92YWx1ZSApPworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIGludCBhbHQyNzQ9MjsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgICAgICBjYXNlIEFTU0lHTjoKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgY2FzZSBMUEFSRU46CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIAkJYWx0Mjc0PTE7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDI3NCkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMjMzOjY6IGl2PSBpbml0aWFsX3ZhbHVlCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2luaXRpYWxfdmFsdWVfaW5fZGVjbF9jaGFubmVsX3Zhcjk3MTcpOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgaXY9aW5pdGlhbF92YWx1ZShjdHgpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVjbF9jaGFubmVsX3ZhckV4OworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgICB2YXItPnNldFZhbHVlKGl2CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAgICAgKTsgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMjM0OjQ6ICggU0VNSSB8IG9uX3dyaXRlX3Zhcl9yb3V0aW5lX2RlZlsgdmFyIF0gKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIGludCBhbHQyNzU9MjsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgU0VNSToKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIAkJYWx0Mjc1PTE7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBMQ1VSTFk6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAJCWFsdDI3NT0yOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAyNzU7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfY2hhbm5lbF92YXJFeDsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0Mjc1KQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMyMzQ6NjogU0VNSQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKFNFTUksICZGT0xMT1dfU0VNSV9pbl9kZWNsX2NoYW5uZWxfdmFyOTczMCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfY2hhbm5lbF92YXJFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAljYXNlIDI6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMyMzQ6MTU6IG9uX3dyaXRlX3Zhcl9yb3V0aW5lX2RlZlsgdmFyIF0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfb25fd3JpdGVfdmFyX3JvdXRpbmVfZGVmX2luX2RlY2xfY2hhbm5lbF92YXI5NzM2KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIG9uX3dyaXRlX3Zhcl9yb3V0aW5lX2RlZihjdHgsIHZhcik7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX2NoYW5uZWxfdmFyRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAJICAgIGRlZmF1bHQ6CisKKyAgICAgICAgCSAgICAgICAgCQlpZiAoIGNudDI3NiA+PSAxICkKKyAgICAgICAgCSAgICAgICAgCQl7CisgICAgICAgIAkgICAgICAgIAkJICAgIGdvdG8gbG9vcDI3NjsKKyAgICAgICAgCSAgICAgICAgCQl9CisgICAgICAgIAkgICAgICAgIAkJaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJICAgICAgICAJCXsKKyAgICAgICAgCSAgICAgICAgCQkgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAJICAgICAgICAJCSAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJCX0KKworICAgICAgICAJICAgICAgICAJCS8qIG1pc21hdGNoZWRTZXRFeCgpCisgICAgICAgIAkgICAgICAgIAkJICovCisgICAgICAgIAkgICAgICAgIAkJQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCSAgICAgICAgCQlFWENFUFRJT04tPnR5cGUgPSBBTlRMUjNfRUFSTFlfRVhJVF9FWENFUFRJT047CisgICAgICAgIAkgICAgICAgIAkJRVhDRVBUSU9OLT5uYW1lID0gKHZvaWQgKilBTlRMUjNfRUFSTFlfRVhJVF9OQU1FOworCisKKyAgICAgICAgCSAgICAgICAgCQlnb3RvIHJ1bGVkZWNsX2NoYW5uZWxfdmFyRXg7CisgICAgICAgIAkgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgIAljbnQyNzYrKzsKKyAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgIGxvb3AyNzY6IDsJLyogSnVtcCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChSQ1VSTFksICZGT0xMT1dfUkNVUkxZX2luX2RlY2xfY2hhbm5lbF92YXI5NzQ4KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVjbF9jaGFubmVsX3ZhckV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZWRlY2xfY2hhbm5lbF92YXJFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVkZWNsX2NoYW5uZWxfdmFyRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgxMTEsIGRlY2xfY2hhbm5lbF92YXJfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGRlY2xfY2hhbm5lbF92YXIgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgZGVjbF92YXJpYWJsZQorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzI0MzoxOiBkZWNsX3ZhcmlhYmxlWyBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSAsIHNlcDo6TW9kaWZpZXIgbWRmciBdIDogKCAoICd2YXInIHwgJ3ZhbCcgfCAoICdjb25zdCcgfCAnbWFjcm8nICkrICggJ3ZhcicgKT8gKSBkZWNsX3ZhcmlhYmxlX2ltcGxbIGRlY2xQcm9wZXJ0eSAsIG1kZnIgXSB8IGRlY2xfdmFyaWFibGVfdGltZV9jbG9ja19pbXBsWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0gKTsKKyAqLworc3RhdGljIHZvaWQKK2RlY2xfdmFyaWFibGUocGZtbFBhcnNlciBjdHgsIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5LCBzZXA6Ok1vZGlmaWVyIG1kZnIpCit7CisgICAgQU5UTFIzX1VJTlQzMiBkZWNsX3ZhcmlhYmxlX1N0YXJ0SW5kZXg7CisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgZGVjbF92YXJpYWJsZV9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgxMTIpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vICAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMjQ1OjI6ICggKCAndmFyJyB8ICd2YWwnIHwgKCAnY29uc3QnIHwgJ21hY3JvJyApKyAoICd2YXInICk/ICkgZGVjbF92YXJpYWJsZV9pbXBsWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0gfCBkZWNsX3ZhcmlhYmxlX3RpbWVfY2xvY2tfaW1wbFsgZGVjbFByb3BlcnR5ICwgbWRmciBdICkKKworICAgICAgICAgICAgQU5UTFIzX1VJTlQzMiBhbHQyODE7CisKKyAgICAgICAgICAgIGFsdDI4MT0yOworCisgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDI2MjoKKyAgICAgICAgICAgIGNhc2UgMzE4OgorICAgICAgICAgICAgY2FzZSA0MTA6CisgICAgICAgICAgICBjYXNlIDQxMToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDI4MT0xOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjU5OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MjgxPTI7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDI4MTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfdmFyaWFibGVFeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDI4MSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMjQ1OjQ6ICggJ3ZhcicgfCAndmFsJyB8ICggJ2NvbnN0JyB8ICdtYWNybycgKSsgKCAndmFyJyApPyApIGRlY2xfdmFyaWFibGVfaW1wbFsgZGVjbFByb3BlcnR5ICwgbWRmciBdCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMjQ1OjQ6ICggJ3ZhcicgfCAndmFsJyB8ICggJ2NvbnN0JyB8ICdtYWNybycgKSsgKCAndmFyJyApPyApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQyODA9MzsKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgNDExOgorICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgIAkJYWx0MjgwPTE7CisgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgY2FzZSA0MTA6CisgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgCQlhbHQyODA9MjsKKyAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI2MjoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzE4OgorICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgIAkJYWx0MjgwPTM7CisgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAJICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDI4MDsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfdmFyaWFibGVFeDsKKworICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDI4MCkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMjQ1OjY6ICd2YXInCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKDQxMSwgJkZPTExPV180MTFfaW5fZGVjbF92YXJpYWJsZTk3NjkpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX3ZhcmlhYmxlRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgbWRmci5zZXROYXR1cmVWYXJpYWJsZSgpOyAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAljYXNlIDI6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzI0Njo2OiAndmFsJworICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVCg0MTAsICZGT0xMT1dfNDEwX2luX2RlY2xfdmFyaWFibGU5NzgzKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVjbF92YXJpYWJsZUV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgIG1kZnIuc2V0RmVhdHVyZUNvbnN0KCk7ICAgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAJY2FzZSAzOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMyNDc6NjogKCAnY29uc3QnIHwgJ21hY3JvJyApKyAoICd2YXInICk/CisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMjQ3OjY6ICggJ2NvbnN0JyB8ICdtYWNybycgKSsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaW50IGNudDI3OD0wOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBmb3IgKDs7KQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIGludCBhbHQyNzg9MzsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCXN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCWNhc2UgMjYyOgorICAgICAgICAJICAgICAgICAJICAgICAgICAJCXsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCQkJYWx0Mjc4PTE7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkJfQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAJICAgICAgICAJY2FzZSAzMTg6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkJeworICAgICAgICAJICAgICAgICAJICAgICAgICAJCQlhbHQyNzg9MjsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCQl9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCX0KKworICAgICAgICAJICAgICAgICAJICAgICAgICAJc3dpdGNoIChhbHQyNzgpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMjQ3Ojg6ICdjb25zdCcKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIE1BVENIVCgyNjIsICZGT0xMT1dfMjYyX2luX2RlY2xfdmFyaWFibGU5Nzk5KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlZGVjbF92YXJpYWJsZUV4OworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgICAgbWRmci5zZXRGZWF0dXJlQ29uc3QoKTsgICAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgY2FzZSAyOgorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMjQ4Ojg6ICdtYWNybycKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIE1BVENIVCgzMTgsICZGT0xMT1dfMzE4X2luX2RlY2xfdmFyaWFibGU5ODExKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlZGVjbF92YXJpYWJsZUV4OworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgICAgbWRmci5zZXROYXR1cmVNYWNybygpOyAgICAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICBkZWZhdWx0OgorCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkJaWYgKCBjbnQyNzggPj0gMSApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkJeworICAgICAgICAJICAgICAgICAJICAgICAgICAJCSAgICBnb3RvIGxvb3AyNzg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkJfQorICAgICAgICAJICAgICAgICAJICAgICAgICAJCWlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCQl7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkJICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCQkgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCQl9CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCQkvKiBtaXNtYXRjaGVkU2V0RXgoKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJCSAqLworICAgICAgICAJICAgICAgICAJICAgICAgICAJCUNPTlNUUlVDVEVYKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkJRVhDRVBUSU9OLT50eXBlID0gQU5UTFIzX0VBUkxZX0VYSVRfRVhDRVBUSU9OOworICAgICAgICAJICAgICAgICAJICAgICAgICAJCUVYQ0VQVElPTi0+bmFtZSA9ICh2b2lkICopQU5UTFIzX0VBUkxZX0VYSVRfTkFNRTsKKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkJZ290byBydWxlZGVjbF92YXJpYWJsZUV4OworICAgICAgICAJICAgICAgICAJICAgICAgICAJfQorICAgICAgICAJICAgICAgICAJICAgICAgICAJY250Mjc4Kys7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBsb29wMjc4OiA7CS8qIEp1bXAgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMyNTA6NjogKCAndmFyJyApPworICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0Mjc5PTI7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSA0MTE6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAJCWFsdDI3OT0xOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDI3OSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMjUwOjg6ICd2YXInCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKDQxMSwgJkZPTExPV180MTFfaW5fZGVjbF92YXJpYWJsZTk4MzEpOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX3ZhcmlhYmxlRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlY2xfdmFyaWFibGVfaW1wbF9pbl9kZWNsX3ZhcmlhYmxlOTg0NCk7CisgICAgICAgIAkgICAgICAgIGRlY2xfdmFyaWFibGVfaW1wbChjdHgsIGRlY2xQcm9wZXJ0eSwgbWRmcik7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfdmFyaWFibGVFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAyOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMyNTQ6NDogZGVjbF92YXJpYWJsZV90aW1lX2Nsb2NrX2ltcGxbIGRlY2xQcm9wZXJ0eSAsIG1kZnIgXQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVjbF92YXJpYWJsZV90aW1lX2Nsb2NrX2ltcGxfaW5fZGVjbF92YXJpYWJsZTk4NTEpOworICAgICAgICAJICAgICAgICBkZWNsX3ZhcmlhYmxlX3RpbWVfY2xvY2tfaW1wbChjdHgsIGRlY2xQcm9wZXJ0eSwgbWRmcik7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfdmFyaWFibGVFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVkZWNsX3ZhcmlhYmxlRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlZGVjbF92YXJpYWJsZUV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTEyLCBkZWNsX3ZhcmlhYmxlX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBkZWNsX3ZhcmlhYmxlICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGRlY2xfdmFyaWFibGVfdGltZV9jbG9ja19pbXBsCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMjU4OjE6IGRlY2xfdmFyaWFibGVfdGltZV9jbG9ja19pbXBsWyBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSAsIHNlcDo6TW9kaWZpZXIgbWRmciBdIDogY3R2PSB0aW1lX2Nsb2NrX3R5cGUgZGVjbF90eXBlZF92YXJpYWJsZV9hdG9tX2ltcGxbIGRlY2xQcm9wZXJ0eSAsIG1kZnIgLCAkY3R2LmJ0cyBdIDsKKyAqLworc3RhdGljIHZvaWQKK2RlY2xfdmFyaWFibGVfdGltZV9jbG9ja19pbXBsKHBmbWxQYXJzZXIgY3R4LCBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSwgc2VwOjpNb2RpZmllciBtZGZyKQoreworICAgIEFOVExSM19VSU5UMzIgZGVjbF92YXJpYWJsZV90aW1lX2Nsb2NrX2ltcGxfU3RhcnRJbmRleDsKKworICAgIHNlcDo6VHlwZVNwZWNpZmllciBjdHY7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2N0dgorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfY3R2IHNlcDo6VHlwZVNwZWNpZmllcgorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGRlY2xfdmFyaWFibGVfdGltZV9jbG9ja19pbXBsX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKworICAgIAltZGZyLm92ZXJyaWRlX2lmZGVmKCBzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9QVUJMSUNfVk9MQVRJTEVfTU9ESUZJRVIgKTsKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTEzKSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMjYzOjI6IChjdHY9IHRpbWVfY2xvY2tfdHlwZSBkZWNsX3R5cGVkX3ZhcmlhYmxlX2F0b21faW1wbFsgZGVjbFByb3BlcnR5ICwgbWRmciAsICRjdHYuYnRzIF0gKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMjYzOjQ6IGN0dj0gdGltZV9jbG9ja190eXBlIGRlY2xfdHlwZWRfdmFyaWFibGVfYXRvbV9pbXBsWyBkZWNsUHJvcGVydHkgLCBtZGZyICwgJGN0di5idHMgXQorICAgICAgICB7CisgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV190aW1lX2Nsb2NrX3R5cGVfaW5fZGVjbF92YXJpYWJsZV90aW1lX2Nsb2NrX2ltcGw5ODczKTsKKyAgICAgICAgICAgIGN0dj10aW1lX2Nsb2NrX3R5cGUoY3R4KTsKKworICAgICAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfdmFyaWFibGVfdGltZV9jbG9ja19pbXBsRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWNsX3R5cGVkX3ZhcmlhYmxlX2F0b21faW1wbF9pbl9kZWNsX3ZhcmlhYmxlX3RpbWVfY2xvY2tfaW1wbDk4NzgpOworICAgICAgICAgICAgZGVjbF90eXBlZF92YXJpYWJsZV9hdG9tX2ltcGwoY3R4LCBkZWNsUHJvcGVydHksIG1kZnIsIAorICAgICAgICAgICAgY3R2CisgICAgICAgICAgICApOworCisgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZGVjbF92YXJpYWJsZV90aW1lX2Nsb2NrX2ltcGxFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlZGVjbF92YXJpYWJsZV90aW1lX2Nsb2NrX2ltcGxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVkZWNsX3ZhcmlhYmxlX3RpbWVfY2xvY2tfaW1wbEV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTEzLCBkZWNsX3ZhcmlhYmxlX3RpbWVfY2xvY2tfaW1wbF9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgZGVjbF92YXJpYWJsZV90aW1lX2Nsb2NrX2ltcGwgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgZGVjbF92YXJpYWJsZV9pbXBsCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMjY4OjE6IGRlY2xfdmFyaWFibGVfaW1wbFsgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHkgLCBzZXA6Ok1vZGlmaWVyIG1kZnIgXSA6ICggZGVjbF92YXJpYWJsZV9hdG9tX2ltcGxbIGRlY2xQcm9wZXJ0eSAsIG1kZnIgXSB8IExDVVJMWSAoIGRlY2xfdmFyaWFibGVfYXRvbV9pbXBsWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0gKSsgUkNVUkxZICk7CisgKi8KK3N0YXRpYyB2b2lkCitkZWNsX3ZhcmlhYmxlX2ltcGwocGZtbFBhcnNlciBjdHgsIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5LCBzZXA6Ok1vZGlmaWVyIG1kZnIpCit7CisgICAgQU5UTFIzX1VJTlQzMiBkZWNsX3ZhcmlhYmxlX2ltcGxfU3RhcnRJbmRleDsKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBkZWNsX3ZhcmlhYmxlX2ltcGxfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTE0KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgeworICAgICAgICB7CisgICAgICAgICAgICAvLyAgL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzI3MDoyOiAoIGRlY2xfdmFyaWFibGVfYXRvbV9pbXBsWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0gfCBMQ1VSTFkgKCBkZWNsX3ZhcmlhYmxlX2F0b21faW1wbFsgZGVjbFByb3BlcnR5ICwgbWRmciBdICkrIFJDVVJMWSApCisKKyAgICAgICAgICAgIEFOVExSM19VSU5UMzIgYWx0MjgzOworCisgICAgICAgICAgICBhbHQyODM9MjsKKworICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgICAgIGNhc2UgMjQxOgorICAgICAgICAgICAgY2FzZSAyNDI6CisgICAgICAgICAgICBjYXNlIDI0NToKKyAgICAgICAgICAgIGNhc2UgMjQ2OgorICAgICAgICAgICAgY2FzZSAyNDk6CisgICAgICAgICAgICBjYXNlIDI1NDoKKyAgICAgICAgICAgIGNhc2UgMjU1OgorICAgICAgICAgICAgY2FzZSAyNTk6CisgICAgICAgICAgICBjYXNlIDI2MToKKyAgICAgICAgICAgIGNhc2UgMjY0OgorICAgICAgICAgICAgY2FzZSAyNzA6CisgICAgICAgICAgICBjYXNlIDI3MToKKyAgICAgICAgICAgIGNhc2UgMjgxOgorICAgICAgICAgICAgY2FzZSAyODM6CisgICAgICAgICAgICBjYXNlIDMwOToKKyAgICAgICAgICAgIGNhc2UgMzEwOgorICAgICAgICAgICAgY2FzZSAzMTE6CisgICAgICAgICAgICBjYXNlIDMxNToKKyAgICAgICAgICAgIGNhc2UgMzE2OgorICAgICAgICAgICAgY2FzZSAzMTc6CisgICAgICAgICAgICBjYXNlIDMyMDoKKyAgICAgICAgICAgIGNhc2UgMzI1OgorICAgICAgICAgICAgY2FzZSAzMjY6CisgICAgICAgICAgICBjYXNlIDMyOToKKyAgICAgICAgICAgIGNhc2UgMzMzOgorICAgICAgICAgICAgY2FzZSAzNDQ6CisgICAgICAgICAgICBjYXNlIDM0NToKKyAgICAgICAgICAgIGNhc2UgMzQ2OgorICAgICAgICAgICAgY2FzZSAzNTc6CisgICAgICAgICAgICBjYXNlIDM1ODoKKyAgICAgICAgICAgIGNhc2UgMzYwOgorICAgICAgICAgICAgY2FzZSAzNzA6CisgICAgICAgICAgICBjYXNlIDM3MzoKKyAgICAgICAgICAgIGNhc2UgMzc0OgorICAgICAgICAgICAgY2FzZSAzODc6CisgICAgICAgICAgICBjYXNlIDM5MjoKKyAgICAgICAgICAgIGNhc2UgMzk5OgorICAgICAgICAgICAgY2FzZSA0MDA6CisgICAgICAgICAgICBjYXNlIDQwMToKKyAgICAgICAgICAgIGNhc2UgNDAyOgorICAgICAgICAgICAgY2FzZSA0MDU6CisgICAgICAgICAgICBjYXNlIDQwNzoKKyAgICAgICAgICAgIGNhc2UgNDA4OgorICAgICAgICAgICAgY2FzZSA0MDk6CisgICAgICAgICAgICBjYXNlIDQxMjoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDI4Mz0xOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTENVUkxZOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MjgzPTI7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDI4MzsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfdmFyaWFibGVfaW1wbEV4OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MjgzKQorICAgICAgICAgICAgeworICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMyNzA6NDogZGVjbF92YXJpYWJsZV9hdG9tX2ltcGxbIGRlY2xQcm9wZXJ0eSAsIG1kZnIgXQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVjbF92YXJpYWJsZV9hdG9tX2ltcGxfaW5fZGVjbF92YXJpYWJsZV9pbXBsOTg5NCk7CisgICAgICAgIAkgICAgICAgIGRlY2xfdmFyaWFibGVfYXRvbV9pbXBsKGN0eCwgZGVjbFByb3BlcnR5LCBtZGZyKTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVjbF92YXJpYWJsZV9pbXBsRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMjcyOjQ6IExDVVJMWSAoIGRlY2xfdmFyaWFibGVfYXRvbV9pbXBsWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0gKSsgUkNVUkxZCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKExDVVJMWSwgJkZPTExPV19MQ1VSTFlfaW5fZGVjbF92YXJpYWJsZV9pbXBsOTkwMSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfdmFyaWFibGVfaW1wbEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzI3Mzo0OiAoIGRlY2xfdmFyaWFibGVfYXRvbV9pbXBsWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0gKSsKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaW50IGNudDI4Mj0wOworCisgICAgICAgIAkgICAgICAgICAgICBmb3IgKDs7KQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgIGludCBhbHQyODI9MjsKKyAgICAgICAgCSAgICAgICAgCXN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgSUQ6CisgICAgICAgIAkgICAgICAgIAljYXNlIDI0MToKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMjQyOgorICAgICAgICAJICAgICAgICAJY2FzZSAyNDU6CisgICAgICAgIAkgICAgICAgIAljYXNlIDI0NjoKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMjQ5OgorICAgICAgICAJICAgICAgICAJY2FzZSAyNTQ6CisgICAgICAgIAkgICAgICAgIAljYXNlIDI1NToKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMjU5OgorICAgICAgICAJICAgICAgICAJY2FzZSAyNjE6CisgICAgICAgIAkgICAgICAgIAljYXNlIDI2NDoKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMjcwOgorICAgICAgICAJICAgICAgICAJY2FzZSAyNzE6CisgICAgICAgIAkgICAgICAgIAljYXNlIDI4MToKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMjgzOgorICAgICAgICAJICAgICAgICAJY2FzZSAzMDk6CisgICAgICAgIAkgICAgICAgIAljYXNlIDMxMDoKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMzExOgorICAgICAgICAJICAgICAgICAJY2FzZSAzMTU6CisgICAgICAgIAkgICAgICAgIAljYXNlIDMxNjoKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMzE3OgorICAgICAgICAJICAgICAgICAJY2FzZSAzMjA6CisgICAgICAgIAkgICAgICAgIAljYXNlIDMyNToKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMzI2OgorICAgICAgICAJICAgICAgICAJY2FzZSAzMjk6CisgICAgICAgIAkgICAgICAgIAljYXNlIDMzMzoKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMzQ0OgorICAgICAgICAJICAgICAgICAJY2FzZSAzNDU6CisgICAgICAgIAkgICAgICAgIAljYXNlIDM0NjoKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMzU3OgorICAgICAgICAJICAgICAgICAJY2FzZSAzNTg6CisgICAgICAgIAkgICAgICAgIAljYXNlIDM2MDoKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMzcwOgorICAgICAgICAJICAgICAgICAJY2FzZSAzNzM6CisgICAgICAgIAkgICAgICAgIAljYXNlIDM3NDoKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMzg3OgorICAgICAgICAJICAgICAgICAJY2FzZSAzOTI6CisgICAgICAgIAkgICAgICAgIAljYXNlIDM5OToKKyAgICAgICAgCSAgICAgICAgCWNhc2UgNDAwOgorICAgICAgICAJICAgICAgICAJY2FzZSA0MDE6CisgICAgICAgIAkgICAgICAgIAljYXNlIDQwMjoKKyAgICAgICAgCSAgICAgICAgCWNhc2UgNDA1OgorICAgICAgICAJICAgICAgICAJY2FzZSA0MDc6CisgICAgICAgIAkgICAgICAgIAljYXNlIDQwODoKKyAgICAgICAgCSAgICAgICAgCWNhc2UgNDA5OgorICAgICAgICAJICAgICAgICAJY2FzZSA0MTI6CisgICAgICAgIAkgICAgICAgIAkJeworICAgICAgICAJICAgICAgICAJCQlhbHQyODI9MTsKKyAgICAgICAgCSAgICAgICAgCQl9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgCX0KKworICAgICAgICAJICAgICAgICAJc3dpdGNoIChhbHQyODIpCisgICAgICAgIAkgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgIAkgICAgY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMjczOjY6IGRlY2xfdmFyaWFibGVfYXRvbV9pbXBsWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVjbF92YXJpYWJsZV9hdG9tX2ltcGxfaW5fZGVjbF92YXJpYWJsZV9pbXBsOTkwOCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBkZWNsX3ZhcmlhYmxlX2F0b21faW1wbChjdHgsIGRlY2xQcm9wZXJ0eSwgbWRmcik7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX3ZhcmlhYmxlX2ltcGxFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAJICAgIGRlZmF1bHQ6CisKKyAgICAgICAgCSAgICAgICAgCQlpZiAoIGNudDI4MiA+PSAxICkKKyAgICAgICAgCSAgICAgICAgCQl7CisgICAgICAgIAkgICAgICAgIAkJICAgIGdvdG8gbG9vcDI4MjsKKyAgICAgICAgCSAgICAgICAgCQl9CisgICAgICAgIAkgICAgICAgIAkJaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJICAgICAgICAJCXsKKyAgICAgICAgCSAgICAgICAgCQkgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAJICAgICAgICAJCSAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJCX0KKworICAgICAgICAJICAgICAgICAJCS8qIG1pc21hdGNoZWRTZXRFeCgpCisgICAgICAgIAkgICAgICAgIAkJICovCisgICAgICAgIAkgICAgICAgIAkJQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCSAgICAgICAgCQlFWENFUFRJT04tPnR5cGUgPSBBTlRMUjNfRUFSTFlfRVhJVF9FWENFUFRJT047CisgICAgICAgIAkgICAgICAgIAkJRVhDRVBUSU9OLT5uYW1lID0gKHZvaWQgKilBTlRMUjNfRUFSTFlfRVhJVF9OQU1FOworCisKKyAgICAgICAgCSAgICAgICAgCQlnb3RvIHJ1bGVkZWNsX3ZhcmlhYmxlX2ltcGxFeDsKKyAgICAgICAgCSAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgCWNudDI4MisrOworICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgbG9vcDI4MjogOwkvKiBKdW1wIHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgTUFUQ0hUKFJDVVJMWSwgJkZPTExPV19SQ1VSTFlfaW5fZGVjbF92YXJpYWJsZV9pbXBsOTkxNyk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfdmFyaWFibGVfaW1wbEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZWRlY2xfdmFyaWFibGVfaW1wbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZWRlY2xfdmFyaWFibGVfaW1wbEV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTE0LCBkZWNsX3ZhcmlhYmxlX2ltcGxfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGRlY2xfdmFyaWFibGVfaW1wbCAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBkZWNsX3ZhcmlhYmxlX2F0b21faW1wbAorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzI3NzoxOiBkZWNsX3ZhcmlhYmxlX2F0b21faW1wbFsgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHkgLCBzZXA6Ok1vZGlmaWVyIG1kZnIgXSA6IHR2PSB0eXBlX3ZhciBkZWNsX3R5cGVkX3ZhcmlhYmxlX2F0b21faW1wbFsgZGVjbFByb3BlcnR5ICwgbWRmciAsICR0di50eXBlIF0gOworICovCitzdGF0aWMgdm9pZAorZGVjbF92YXJpYWJsZV9hdG9tX2ltcGwocGZtbFBhcnNlciBjdHgsIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5LCBzZXA6Ok1vZGlmaWVyIG1kZnIpCit7CisgICAgQU5UTFIzX1VJTlQzMiBkZWNsX3ZhcmlhYmxlX2F0b21faW1wbF9TdGFydEluZGV4OworCisgICAgc2VwOjpCRiB0djsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfdHYKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX3R2IHNlcDo6QkYKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBkZWNsX3ZhcmlhYmxlX2F0b21faW1wbF9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgxMTUpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMyNzk6MjogKHR2PSB0eXBlX3ZhciBkZWNsX3R5cGVkX3ZhcmlhYmxlX2F0b21faW1wbFsgZGVjbFByb3BlcnR5ICwgbWRmciAsICR0di50eXBlIF0gKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMjc5OjQ6IHR2PSB0eXBlX3ZhciBkZWNsX3R5cGVkX3ZhcmlhYmxlX2F0b21faW1wbFsgZGVjbFByb3BlcnR5ICwgbWRmciAsICR0di50eXBlIF0KKyAgICAgICAgeworICAgICAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfdHlwZV92YXJfaW5fZGVjbF92YXJpYWJsZV9hdG9tX2ltcGw5OTMzKTsKKyAgICAgICAgICAgIHR2PXR5cGVfdmFyKGN0eCk7CisKKyAgICAgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX3ZhcmlhYmxlX2F0b21faW1wbEV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVjbF90eXBlZF92YXJpYWJsZV9hdG9tX2ltcGxfaW5fZGVjbF92YXJpYWJsZV9hdG9tX2ltcGw5OTM4KTsKKyAgICAgICAgICAgIGRlY2xfdHlwZWRfdmFyaWFibGVfYXRvbV9pbXBsKGN0eCwgZGVjbFByb3BlcnR5LCBtZGZyLCAKKyAgICAgICAgICAgIHR2CisgICAgICAgICAgICApOworCisgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZGVjbF92YXJpYWJsZV9hdG9tX2ltcGxFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlZGVjbF92YXJpYWJsZV9hdG9tX2ltcGxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVkZWNsX3ZhcmlhYmxlX2F0b21faW1wbEV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTE1LCBkZWNsX3ZhcmlhYmxlX2F0b21faW1wbF9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgZGVjbF92YXJpYWJsZV9hdG9tX2ltcGwgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgZGVjbF90eXBlZF92YXJpYWJsZV9hdG9tX2ltcGwKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMyODM6MTogZGVjbF90eXBlZF92YXJpYWJsZV9hdG9tX2ltcGxbIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5ICxcblx0XHRzZXA6Ok1vZGlmaWVyIG1kZnIgLCBjb25zdCBzZXA6OkJGICYgdHlwZSBdIDogaWQ9IElEICggU3RyaW5nTGl0ZXJhbCApPyAoaXY9IGluaXRpYWxfdmFsdWUgKT8gKCBTRU1JIHwgb25fd3JpdGVfdmFyX3JvdXRpbmVfZGVmWyB2YXIgXSApIDsKKyAqLworc3RhdGljIHZvaWQKK2RlY2xfdHlwZWRfdmFyaWFibGVfYXRvbV9pbXBsKHBmbWxQYXJzZXIgY3R4LCBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSwgc2VwOjpNb2RpZmllciBtZGZyLCBjb25zdCBzZXA6OkJGICYgdHlwZSkKK3sKKyAgICBBTlRMUjNfVUlOVDMyIGRlY2xfdHlwZWRfdmFyaWFibGVfYXRvbV9pbXBsX1N0YXJ0SW5kZXg7CisKKyAgICBwQU5UTFIzX0NPTU1PTl9UT0tFTiAgICBpZDsKKyAgICBwQU5UTFIzX0NPTU1PTl9UT0tFTiAgICBTdHJpbmdMaXRlcmFsOTsKKyAgICBzZXA6OkJGIGl2OworICAgICN1bmRlZglSRVRVUk5fVFlQRV9pdgorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfaXYgc2VwOjpCRgorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGRlY2xfdHlwZWRfdmFyaWFibGVfYXRvbV9pbXBsX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKworICAgIAlzZXA6OlZhcmlhYmxlICogdmFyOworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgxMTYpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICBpZCAgICAgICA9IE5VTEw7CisgICAgU3RyaW5nTGl0ZXJhbDkgICAgICAgPSBOVUxMOworCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMjg5OjI6IChpZD0gSUQgKCBTdHJpbmdMaXRlcmFsICk/IChpdj0gaW5pdGlhbF92YWx1ZSApPyAoIFNFTUkgfCBvbl93cml0ZV92YXJfcm91dGluZV9kZWZbIHZhciBdICkgKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMjg5OjQ6IGlkPSBJRCAoIFN0cmluZ0xpdGVyYWwgKT8gKGl2PSBpbml0aWFsX3ZhbHVlICk/ICggU0VNSSB8IG9uX3dyaXRlX3Zhcl9yb3V0aW5lX2RlZlsgdmFyIF0gKQorICAgICAgICB7CisgICAgICAgICAgICBpZCA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTikgTUFUQ0hUKElELCAmRk9MTE9XX0lEX2luX2RlY2xfdHlwZWRfdmFyaWFibGVfYXRvbV9pbXBsOTk1OSk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfdHlwZWRfdmFyaWFibGVfYXRvbV9pbXBsRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAJICAJZGVjbFByb3BlcnR5LnNhdmVPd25lZFZhcmlhYmxlKCB2YXIgPSBuZXcgc2VwOjpWYXJpYWJsZSgKKyAgICAgICAgICAgICAgICAJICAJCQlkZWNsUHJvcGVydHksIG1kZnIsIHR5cGUsIFNUUigoaWQtPmdldFRleHQoaWQpKS0+Y2hhcnMpKSApOworICAgICAgICAgICAgICAgIAkgIAorICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMyOTU6NDogKCBTdHJpbmdMaXRlcmFsICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDI4ND0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU3RyaW5nTGl0ZXJhbDoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQyODQ9MTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0Mjg0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMyOTU6NjogU3RyaW5nTGl0ZXJhbAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBTdHJpbmdMaXRlcmFsOSA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTikgTUFUQ0hUKFN0cmluZ0xpdGVyYWwsICZGT0xMT1dfU3RyaW5nTGl0ZXJhbF9pbl9kZWNsX3R5cGVkX3ZhcmlhYmxlX2F0b21faW1wbDk5NzIpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX3R5cGVkX3ZhcmlhYmxlX2F0b21faW1wbEV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICB2YXItPnNldFVucmVzdHJpY3RlZE5hbWUoU1RSKChTdHJpbmdMaXRlcmFsOS0+Z2V0VGV4dChTdHJpbmdMaXRlcmFsOSkpLT5jaGFycykpOyAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMyOTk6NDogKGl2PSBpbml0aWFsX3ZhbHVlICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDI4NT0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQVNTSUdOOgorICAgICAgICAgICAgICAgICAgICBjYXNlIExQQVJFTjoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQyODU9MTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0Mjg1KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMyOTk6NjogaXY9IGluaXRpYWxfdmFsdWUKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfaW5pdGlhbF92YWx1ZV9pbl9kZWNsX3R5cGVkX3ZhcmlhYmxlX2F0b21faW1wbDk5OTMpOworICAgICAgICAgICAgCSAgICAgICAgaXY9aW5pdGlhbF92YWx1ZShjdHgpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVjbF90eXBlZF92YXJpYWJsZV9hdG9tX2ltcGxFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgdmFyLT5zZXRWYWx1ZShpdgorICAgICAgICAgICAgCSAgICAgICAgICAgICk7IAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzMwMDo0OiAoIFNFTUkgfCBvbl93cml0ZV92YXJfcm91dGluZV9kZWZbIHZhciBdICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0Mjg2PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNFTUk6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDI4Nj0xOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTENVUkxZOgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQyODY9MjsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMjg2OworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX3R5cGVkX3ZhcmlhYmxlX2F0b21faW1wbEV4OworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQyODYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzMwMDo2OiBTRU1JCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoU0VNSSwgJkZPTExPV19TRU1JX2luX2RlY2xfdHlwZWRfdmFyaWFibGVfYXRvbV9pbXBsMTAwMDYpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX3R5cGVkX3ZhcmlhYmxlX2F0b21faW1wbEV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzMwMDoxNTogb25fd3JpdGVfdmFyX3JvdXRpbmVfZGVmWyB2YXIgXQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19vbl93cml0ZV92YXJfcm91dGluZV9kZWZfaW5fZGVjbF90eXBlZF92YXJpYWJsZV9hdG9tX2ltcGwxMDAxMik7CisgICAgICAgICAgICAJICAgICAgICBvbl93cml0ZV92YXJfcm91dGluZV9kZWYoY3R4LCB2YXIpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVjbF90eXBlZF92YXJpYWJsZV9hdG9tX2ltcGxFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVkZWNsX3R5cGVkX3ZhcmlhYmxlX2F0b21faW1wbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZWRlY2xfdHlwZWRfdmFyaWFibGVfYXRvbV9pbXBsRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgxMTYsIGRlY2xfdHlwZWRfdmFyaWFibGVfYXRvbV9pbXBsX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBkZWNsX3R5cGVkX3ZhcmlhYmxlX2F0b21faW1wbCAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBpbml0aWFsX3ZhbHVlCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMzA0OjE6IGluaXRpYWxfdmFsdWUgcmV0dXJucyBbIHNlcDo6QkYgYmYgXSA6ICggQVNTSUdOIGU9IGV4cHJlc3Npb24gfCBMUEFSRU4gZT0gZXhwcmVzc2lvbiBSUEFSRU4gKTsKKyAqLworc3RhdGljIHNlcDo6QkYKK2luaXRpYWxfdmFsdWUocGZtbFBhcnNlciBjdHgpCit7CisgICAgc2VwOjpCRiBiZjsKKworICAgIEFOVExSM19VSU5UMzIgaW5pdGlhbF92YWx1ZV9TdGFydEluZGV4OworCisgICAgc2VwOjpCRiBlOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9lCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9lIHNlcDo6QkYKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBpbml0aWFsX3ZhbHVlX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDExNykpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gYmY7CisgICAgfQorCisgICAgeworICAgICAgICB7CisgICAgICAgICAgICAvLyAgL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzMwNjoyOiAoIEFTU0lHTiBlPSBleHByZXNzaW9uIHwgTFBBUkVOIGU9IGV4cHJlc3Npb24gUlBBUkVOICkKKworICAgICAgICAgICAgQU5UTFIzX1VJTlQzMiBhbHQyODc7CisKKyAgICAgICAgICAgIGFsdDI4Nz0yOworCisgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEFTU0lHTjoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDI4Nz0xOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTFBBUkVOOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0Mjg3PTI7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMjg3OworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgZ290byBydWxlaW5pdGlhbF92YWx1ZUV4OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0Mjg3KQorICAgICAgICAgICAgeworICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMzMDY6NDogQVNTSUdOIGU9IGV4cHJlc3Npb24KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoQVNTSUdOLCAmRk9MTE9XX0FTU0lHTl9pbl9pbml0aWFsX3ZhbHVlMTAwMzEpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVpbml0aWFsX3ZhbHVlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5faW5pdGlhbF92YWx1ZTEwMDM2KTsKKyAgICAgICAgCSAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWluaXRpYWxfdmFsdWVFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgYmY9IAorICAgICAgICAJICAgICAgICAgICAgZQorICAgICAgICAJICAgICAgICAgICAgOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMzA3OjQ6IExQQVJFTiBlPSBleHByZXNzaW9uIFJQQVJFTgorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChMUEFSRU4sICZGT0xMT1dfTFBBUkVOX2luX2luaXRpYWxfdmFsdWUxMDA1Mik7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWluaXRpYWxfdmFsdWVFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9pbml0aWFsX3ZhbHVlMTAwNTcpOworICAgICAgICAJICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlaW5pdGlhbF92YWx1ZUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAgTUFUQ0hUKFJQQVJFTiwgJkZPTExPV19SUEFSRU5faW5faW5pdGlhbF92YWx1ZTEwMDYwKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlaW5pdGlhbF92YWx1ZUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBiZj0gCisgICAgICAgIAkgICAgICAgICAgICBlCisgICAgICAgIAkgICAgICAgICAgICA7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVpbml0aWFsX3ZhbHVlRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlaW5pdGlhbF92YWx1ZUV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTE3LCBpbml0aWFsX3ZhbHVlX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gYmY7Cit9CisvKiAkQU5UTFIgZW5kIGluaXRpYWxfdmFsdWUgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgdHlwZV92YXIKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMzMTE6MTogdHlwZV92YXIgcmV0dXJucyBbIHNlcDo6QkYgdHlwZSBdIDogKGJ0dj0gYmFzZV90eXBlX3ZhciAoZHRhPSBkZWZfdHlwZV9hcnJheVsgdHlwZSAsIFwiXCIgXSApPyB8ZHRjPSBkZWZfdHlwZV9jb250YWluZXJbIFwiXCIgXSB8ZHRpPSBkZWZfdHlwZV9pbnRlcnZhbFsgXCJcIiBdICk7CisgKi8KK3N0YXRpYyBzZXA6OkJGCit0eXBlX3ZhcihwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBzZXA6OkJGIHR5cGU7CisKKyAgICBBTlRMUjNfVUlOVDMyIHR5cGVfdmFyX1N0YXJ0SW5kZXg7CisKKyAgICBzZXA6OkJGIGJ0djsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfYnR2CisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9idHYgc2VwOjpCRgorCisgICAgc2VwOjpCRiBkdGE7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2R0YQorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfZHRhIHNlcDo6QkYKKworICAgIHNlcDo6QkYgZHRjOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9kdGMKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2R0YyBzZXA6OkJGCisKKyAgICBzZXA6OkJGIGR0aTsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfZHRpCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9kdGkgc2VwOjpCRgorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIHR5cGVfdmFyX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDExOCkpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vICAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMzEzOjI6IChidHY9IGJhc2VfdHlwZV92YXIgKGR0YT0gZGVmX3R5cGVfYXJyYXlbIHR5cGUgLCBcIlwiIF0gKT8gfGR0Yz0gZGVmX3R5cGVfY29udGFpbmVyWyBcIlwiIF0gfGR0aT0gZGVmX3R5cGVfaW50ZXJ2YWxbIFwiXCIgXSApCisKKyAgICAgICAgICAgIEFOVExSM19VSU5UMzIgYWx0Mjg5OworCisgICAgICAgICAgICBhbHQyODk9MzsKKworICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgICAgIGNhc2UgMjQyOgorICAgICAgICAgICAgY2FzZSAyNDU6CisgICAgICAgICAgICBjYXNlIDI0NjoKKyAgICAgICAgICAgIGNhc2UgMjQ5OgorICAgICAgICAgICAgY2FzZSAyNTQ6CisgICAgICAgICAgICBjYXNlIDI1NToKKyAgICAgICAgICAgIGNhc2UgMjU5OgorICAgICAgICAgICAgY2FzZSAyNjE6CisgICAgICAgICAgICBjYXNlIDI2NDoKKyAgICAgICAgICAgIGNhc2UgMjcwOgorICAgICAgICAgICAgY2FzZSAyNzE6CisgICAgICAgICAgICBjYXNlIDI4MzoKKyAgICAgICAgICAgIGNhc2UgMzA5OgorICAgICAgICAgICAgY2FzZSAzMTA6CisgICAgICAgICAgICBjYXNlIDMxNzoKKyAgICAgICAgICAgIGNhc2UgMzIwOgorICAgICAgICAgICAgY2FzZSAzMzM6CisgICAgICAgICAgICBjYXNlIDM0NDoKKyAgICAgICAgICAgIGNhc2UgMzQ1OgorICAgICAgICAgICAgY2FzZSAzNDY6CisgICAgICAgICAgICBjYXNlIDM1NzoKKyAgICAgICAgICAgIGNhc2UgMzU4OgorICAgICAgICAgICAgY2FzZSAzNjA6CisgICAgICAgICAgICBjYXNlIDM3NDoKKyAgICAgICAgICAgIGNhc2UgMzg3OgorICAgICAgICAgICAgY2FzZSAzOTI6CisgICAgICAgICAgICBjYXNlIDM5OToKKyAgICAgICAgICAgIGNhc2UgNDAwOgorICAgICAgICAgICAgY2FzZSA0MDE6CisgICAgICAgICAgICBjYXNlIDQwMjoKKyAgICAgICAgICAgIGNhc2UgNDA1OgorICAgICAgICAgICAgY2FzZSA0MDc6CisgICAgICAgICAgICBjYXNlIDQwODoKKyAgICAgICAgICAgIGNhc2UgNDA5OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0Mjg5PTE7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNDE6CisgICAgICAgICAgICBjYXNlIDI4MToKKyAgICAgICAgICAgIGNhc2UgMzE1OgorICAgICAgICAgICAgY2FzZSAzMTY6CisgICAgICAgICAgICBjYXNlIDMyNToKKyAgICAgICAgICAgIGNhc2UgMzI2OgorICAgICAgICAgICAgY2FzZSAzMjk6CisgICAgICAgICAgICBjYXNlIDM3MDoKKyAgICAgICAgICAgIGNhc2UgMzczOgorICAgICAgICAgICAgY2FzZSA0MTI6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQyODk9MjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMxMToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDI4OT0zOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMjg5OworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgZ290byBydWxldHlwZV92YXJFeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDI4OSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMzEzOjQ6IGJ0dj0gYmFzZV90eXBlX3ZhciAoZHRhPSBkZWZfdHlwZV9hcnJheVsgdHlwZSAsIFwiXCIgXSApPworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfYmFzZV90eXBlX3Zhcl9pbl90eXBlX3ZhcjEwMDgxKTsKKyAgICAgICAgCSAgICAgICAgYnR2PWJhc2VfdHlwZV92YXIoY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxldHlwZV92YXJFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICB0eXBlPSAKKyAgICAgICAgCSAgICAgICAgICAgIGJ0dgorICAgICAgICAJICAgICAgICAgICAgOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMzE0OjQ6IChkdGE9IGRlZl90eXBlX2FycmF5WyB0eXBlICwgXCJcIiBdICk/CisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQyODg9MjsKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIExCUkFDS0VUOgorICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQlhbHQyODg9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQyODgpCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzMxNDo2OiBkdGE9IGRlZl90eXBlX2FycmF5WyB0eXBlICwgXCJcIiBdCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfdHlwZV9hcnJheV9pbl90eXBlX3ZhcjEwMTA5KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgZHRhPWRlZl90eXBlX2FycmF5KGN0eCwgdHlwZSwgIiIpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV0eXBlX3ZhckV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIHR5cGU9IAorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZHRhCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMzE2OjQ6IGR0Yz0gZGVmX3R5cGVfY29udGFpbmVyWyBcIlwiIF0KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlZl90eXBlX2NvbnRhaW5lcl9pbl90eXBlX3ZhcjEwMTI0KTsKKyAgICAgICAgCSAgICAgICAgZHRjPWRlZl90eXBlX2NvbnRhaW5lcihjdHgsICIiKTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxldHlwZV92YXJFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICB0eXBlPSAKKyAgICAgICAgCSAgICAgICAgICAgIGR0YworICAgICAgICAJICAgICAgICAgICAgOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMzoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMzE4OjQ6IGR0aT0gZGVmX3R5cGVfaW50ZXJ2YWxbIFwiXCIgXQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX3R5cGVfaW50ZXJ2YWxfaW5fdHlwZV92YXIxMDE0MSk7CisgICAgICAgIAkgICAgICAgIGR0aT1kZWZfdHlwZV9pbnRlcnZhbChjdHgsICIiKTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxldHlwZV92YXJFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICB0eXBlPSAKKyAgICAgICAgCSAgICAgICAgICAgIGR0aQorICAgICAgICAJICAgICAgICAgICAgOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxldHlwZV92YXJFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGV0eXBlX3ZhckV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTE4LCB0eXBlX3Zhcl9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIHR5cGU7Cit9CisvKiAkQU5UTFIgZW5kIHR5cGVfdmFyICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGRlZl90eXBlX2FycmF5CisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMzIyOjE6IGRlZl90eXBlX2FycmF5WyBzZXA6OkJGIGJhc2VUICwgY29uc3Qgc3RkOjpzdHJpbmcgJiB0aWQgXSByZXR1cm5zIFsgc2VwOjpCRiB0eXBlIF0gOiAoZHRhPSBkZWZfdHlwZV9hcnJheV9zaXplICkrIDsKKyAqLworc3RhdGljIHNlcDo6QkYKK2RlZl90eXBlX2FycmF5KHBmbWxQYXJzZXIgY3R4LCBzZXA6OkJGIGJhc2VULCBjb25zdCBzdGQ6OnN0cmluZyAmIHRpZCkKK3sKKyAgICBzZXA6OkJGIHR5cGU7CisKKyAgICBBTlRMUjNfVUlOVDMyIGRlZl90eXBlX2FycmF5X1N0YXJ0SW5kZXg7CisKKyAgICBpbnQgZHRhOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9kdGEKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2R0YSBpbnQKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBkZWZfdHlwZV9hcnJheV9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisKKyAgICAJc2VwOjpMaXN0T2ZJbnQgbGlzdE9mU2l6ZTsKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTE5KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzMyODoyOiAoIChkdGE9IGRlZl90eXBlX2FycmF5X3NpemUgKSsgKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMzI4OjQ6IChkdGE9IGRlZl90eXBlX2FycmF5X3NpemUgKSsKKyAgICAgICAgeworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzMyODo0OiAoZHRhPSBkZWZfdHlwZV9hcnJheV9zaXplICkrCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGNudDI5MD0wOworCisgICAgICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBhbHQyOTA9MjsKKyAgICAgICAgICAgIAlzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCWNhc2UgTEJSQUNLRVQ6CisgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgIAkJCWFsdDI5MD0xOworICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJfQorCisgICAgICAgICAgICAJc3dpdGNoIChhbHQyOTApCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICBjYXNlIDE6CisgICAgICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozMzI4OjY6IGR0YT0gZGVmX3R5cGVfYXJyYXlfc2l6ZQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlZl90eXBlX2FycmF5X3NpemVfaW5fZGVmX3R5cGVfYXJyYXkxMDE3OCk7CisgICAgICAgICAgICAJICAgICAgICAgICAgZHRhPWRlZl90eXBlX2FycmF5X3NpemUoY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfdHlwZV9hcnJheUV4OworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICBsaXN0T2ZTaXplLnB1c2hfYmFjayhkdGEKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgKTsgCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgIGRlZmF1bHQ6CisKKyAgICAgICAgICAgIAkJaWYgKCBjbnQyOTAgPj0gMSApCisgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgIAkJICAgIGdvdG8gbG9vcDI5MDsKKyAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgCQlpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgIAkJICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgIAkJICAgIHJldHVybiB0eXBlOworICAgICAgICAgICAgCQl9CisKKyAgICAgICAgICAgIAkJLyogbWlzbWF0Y2hlZFNldEV4KCkKKyAgICAgICAgICAgIAkJICovCisgICAgICAgICAgICAJCUNPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAJCUVYQ0VQVElPTi0+dHlwZSA9IEFOVExSM19FQVJMWV9FWElUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIAkJRVhDRVBUSU9OLT5uYW1lID0gKHZvaWQgKilBTlRMUjNfRUFSTFlfRVhJVF9OQU1FOworCisKKyAgICAgICAgICAgIAkJZ290byBydWxlZGVmX3R5cGVfYXJyYXlFeDsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJY250MjkwKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxvb3AyOTA6IDsJLyogSnVtcCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAJCWludCBzelQgPSBsaXN0T2ZTaXplLmZyb250KCk7CisgICAgICAgICAgICAgICAgCQlsaXN0T2ZTaXplLnBvcF9mcm9udCgpOworCisgICAgICAgICAgICAgICAgCQl3aGlsZSggbGlzdE9mU2l6ZS5ub25lbXB0eSgpICkKKyAgICAgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgICAgICAJCQliYXNlVCA9IHNlcDo6QkYoIHNlcDo6RGF0YVR5cGU6Om5ld0NvbnRhaW5lcihfQ1BNXywKKyAgICAgICAgICAgICAgICAJCQkJCXNlcDo6RGF0YVR5cGU6OnN0ckNvbnRhaW5lcklkKHNlcDo6VFlQRV9BUlJBWV9TUEVDSUZJRVIsCisgICAgICAgICAgICAgICAgCQkJCQkJCWJhc2VULCBsaXN0T2ZTaXplLmJhY2soKSksCisgICAgICAgICAgICAgICAgCQkJCQlzZXA6OlRZUEVfQVJSQVlfU1BFQ0lGSUVSLCBiYXNlVCwgbGlzdE9mU2l6ZS5iYWNrKCkpICk7CisgICAgICAgICAgICAgICAgCQkJbGlzdE9mU2l6ZS5wb3BfYmFjaygpOworICAgICAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgICAgIAkJdHlwZSA9IHNlcDo6QkYoIHNlcDo6RGF0YVR5cGU6Om5ld0NvbnRhaW5lcihfQ1BNXywKKyAgICAgICAgICAgICAgICAJCQkJc2VwOjpEYXRhVHlwZTo6c3RyQ29udGFpbmVySWQoCisgICAgICAgICAgICAgICAgCQkJCQkJdGlkLCBzZXA6OlRZUEVfQVJSQVlfU1BFQ0lGSUVSLCBiYXNlVCwgc3pUKSwKKyAgICAgICAgICAgICAgICAJCQkJc2VwOjpUWVBFX0FSUkFZX1NQRUNJRklFUiwgYmFzZVQsIHN6VCkgKTsKKyAgICAgICAgICAgICAgICAJCisgICAgICAgICAgICB9CisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVkZWZfdHlwZV9hcnJheUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZWRlZl90eXBlX2FycmF5RXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgxMTksIGRlZl90eXBlX2FycmF5X1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gdHlwZTsKK30KKy8qICRBTlRMUiBlbmQgZGVmX3R5cGVfYXJyYXkgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgZGVmX3R5cGVfYXJyYXlfc2l6ZQorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzM0ODoxOiBkZWZfdHlwZV9hcnJheV9zaXplIHJldHVybnMgWyBpbnQgc2l6ZSBdIDogTEJSQUNLRVQgKHN6PSBJbnRlZ2VyTGl0ZXJhbCB8aWQ9IHF1YWxpZmllZE5hbWVJRCApIFJCUkFDS0VUIDsKKyAqLworc3RhdGljIGludAorZGVmX3R5cGVfYXJyYXlfc2l6ZShwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBpbnQgc2l6ZTsKKworICAgIEFOVExSM19VSU5UMzIgZGVmX3R5cGVfYXJyYXlfc2l6ZV9TdGFydEluZGV4OworCisgICAgcEFOVExSM19DT01NT05fVE9LRU4gICAgc3o7CisgICAgZm1sUGFyc2VyX3F1YWxpZmllZE5hbWVJRF9yZXR1cm4gaWQ7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2lkCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9pZCBmbWxQYXJzZXJfcXVhbGlmaWVkTmFtZUlEX3JldHVybgorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGRlZl90eXBlX2FycmF5X3NpemVfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTIwKSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiBzaXplOworICAgIH0KKworICAgIHN6ICAgICAgID0gTlVMTDsKKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzM1MDoyOiAoIExCUkFDS0VUIChzej0gSW50ZWdlckxpdGVyYWwgfGlkPSBxdWFsaWZpZWROYW1lSUQgKSBSQlJBQ0tFVCApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMzNTA6NDogTEJSQUNLRVQgKHN6PSBJbnRlZ2VyTGl0ZXJhbCB8aWQ9IHF1YWxpZmllZE5hbWVJRCApIFJCUkFDS0VUCisgICAgICAgIHsKKyAgICAgICAgICAgICBNQVRDSFQoTEJSQUNLRVQsICZGT0xMT1dfTEJSQUNLRVRfaW5fZGVmX3R5cGVfYXJyYXlfc2l6ZTEwMjAyKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX3R5cGVfYXJyYXlfc2l6ZUV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBzaXplOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMzNTE6NjogKHN6PSBJbnRlZ2VyTGl0ZXJhbCB8aWQ9IHF1YWxpZmllZE5hbWVJRCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDI5MT0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBJbnRlZ2VyTGl0ZXJhbDoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0MjkxPTE7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0MjkxPTI7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzaXplOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAyOTE7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl90eXBlX2FycmF5X3NpemVFeDsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MjkxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMzNTE6ODogc3o9IEludGVnZXJMaXRlcmFsCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIHN6ID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoSW50ZWdlckxpdGVyYWwsICZGT0xMT1dfSW50ZWdlckxpdGVyYWxfaW5fZGVmX3R5cGVfYXJyYXlfc2l6ZTEwMjEzKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3R5cGVfYXJyYXlfc2l6ZUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBzaXplOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgc2l6ZSA9IE5VTV9JTlQoKHN6LT5nZXRUZXh0KHN6KSktPmNoYXJzKTsgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzM1NDo1OiBpZD0gcXVhbGlmaWVkTmFtZUlECisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9kZWZfdHlwZV9hcnJheV9zaXplMTAyMjgpOworICAgICAgICAgICAgCSAgICAgICAgaWQ9cXVhbGlmaWVkTmFtZUlEKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfdHlwZV9hcnJheV9zaXplRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHNpemU7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworCisgICAgICAgICAgICAJICAgICAgICAgICAgCQkJY29uc3Qgc2VwOjpCRiAmIGNvbnN0VmFyID0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCQkJCXNlcDo6UGFyc2VyVXRpbDo6Z2V0Q29uc3RhbnQoaWQucworICAgICAgICAgICAgCSAgICAgICAgICAgICwgaWQubmIKKyAgICAgICAgICAgIAkgICAgICAgICAgICApOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJCWlmKCBjb25zdFZhci52YWxpZCgpICYmCisgICAgICAgICAgICAJICAgICAgICAgICAgCQkJCWNvbnN0VmFyLnRvX3B0cjwgc2VwOjpWYXJpYWJsZSA+KCktPmhhc1ZhbHVlKCkgJiYKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCQkJY29uc3RWYXIudG9fcHRyPCBzZXA6OlZhcmlhYmxlID4oKS0+Z2V0VmFsdWUoKS5pc0ludGVnZXIoKSApCisgICAgICAgICAgICAJICAgICAgICAgICAgCQkJeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJCQlzaXplID0gY29uc3RWYXIudG9fcHRyPCBzZXA6OlZhcmlhYmxlID4oKS0+Z2V0VmFsdWUoKS50b0ludGVnZXIoKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCQl9CisgICAgICAgICAgICAJICAgICAgICAgICAgCQkJZWxzZQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkJCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCQkJc2VwOjpCRiBhVHlwZSA9IHNlcDo6UGFyc2VyVXRpbDo6Z2V0RGF0YVR5cGUoaWQucworICAgICAgICAgICAgCSAgICAgICAgICAgICwgaWQubmIKKyAgICAgICAgICAgIAkgICAgICAgICAgICApOworCisgICAgICAgICAgICAJICAgICAgICAgICAgCQkJCWlmKCBhVHlwZS52YWxpZCgpICYmIGFUeXBlLmlzPCBzZXA6OkRhdGFUeXBlID4oKSApCisgICAgICAgICAgICAJICAgICAgICAgICAgCQkJCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCQkJCWlmKCBhVHlwZS50b19wdHI8IHNlcDo6RGF0YVR5cGUgPigpLT5pc1R5cGVkSW50ZXJ2YWwoKSApCisgICAgICAgICAgICAJICAgICAgICAgICAgCQkJCQl7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQkJCQkJc2l6ZSA9IGFUeXBlLnRvX3B0cjwgc2VwOjpEYXRhVHlwZSA+KCktPmdldEludGVydmFsTGVuZ3RoKCk7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCQkJCQlpZiggc2l6ZSA8IDAgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkJCQkJCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCQkJCQkJc2VwOjpQYXJzZXJVdGlsOjphdm1fc3ludGF4X2Vycm9yKAorICAgICAgICAgICAgCSAgICAgICAgICAgIAkJCQkJCQkJImRlZl90eXBlX2FycmF5X3NpemUoLi4uKSIgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkJCQkJCQkJCTw8ICJ1bmV4cGVjdGVkIDw8IGludGVydmFsOiAiIDw8IGlkLnMKKworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJCQkJCQkJCTw8ICIgPj4gYXMgc2l6ZSAoaS5lLiAiIDw8IHNpemUKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCQkJCQkJCQk8PCAiKSBpbiBhbiBhcnJheSB0eXBlZGVmIgorICAgICAgICAgICAgCSAgICAgICAgICAgIAkJCQkJCQkJCTw8IHNlcDo6UGFyc2VyVXRpbDo6U1lOVEFYX0VSUk9SX0VPTDsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJCQkJCQlzaXplID0gMDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCQkJCQl9CisgICAgICAgICAgICAJICAgICAgICAgICAgCQkJCQl9CisgICAgICAgICAgICAJICAgICAgICAgICAgCQkJCQllbHNlIGlmKCBhVHlwZS50b19wdHI8IHNlcDo6RGF0YVR5cGUgPigpLT5pc1R5cGVkRW51bSgpICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCQkJCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCQkJCQlzaXplID0gYVR5cGUudG9fcHRyPCBzZXA6OkRhdGFUeXBlID4oKS0+Z2V0RW51bVNpemUoKTsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJCQkJCWlmKCBzaXplID09IDAgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkJCQkJCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCQkJCQkJc2VwOjpQYXJzZXJVdGlsOjphdm1fc3ludGF4X2Vycm9yKAorICAgICAgICAgICAgCSAgICAgICAgICAgIAkJCQkJCQkJImRlZl90eXBlX2FycmF5X3NpemUoLi4uKSIgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkJCQkJCQkJCTw8ICJ1bmV4cGVjdGVkIDw8IGVudW06ICIgPDwgaWQucworCisgICAgICAgICAgICAJICAgICAgICAgICAgCQkJCQkJCQkJPDwgIiA+PiBhcyBzaXplIGluIGFuIGFycmF5IHR5cGVkZWYiCisgICAgICAgICAgICAJICAgICAgICAgICAgCQkJCQkJCQkJPDwgc2VwOjpQYXJzZXJVdGlsOjpTWU5UQVhfRVJST1JfRU9MOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJCQkJCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCQkJCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCQkJCWVsc2UKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCQkJCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCQkJCQlzaXplID0gMDsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJCQkJCXNlcDo6UGFyc2VyVXRpbDo6YXZtX3N5bnRheF9lcnJvcigKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCQkJCQkJImRlZl90eXBlX2FycmF5X3NpemUoLi4uKSIgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkJCQkJCQkJPDwgInVuZXhwZWN0ZWQgPDwgW1F1YWxpZmllZF1OYW1lSUQ6ICIgPDwgaWQucworCisgICAgICAgICAgICAJICAgICAgICAgICAgCQkJCQkJCQk8PCAiID4+IGFzIHNpemUgaW4gYW4gYXJyYXkgdHlwZWRlZiIKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCQkJCQkJCTw8IHNlcDo6UGFyc2VyVXRpbDo6U1lOVEFYX0VSUk9SX0VPTDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCQkJCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCQkJfQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkJCQllbHNlCisgICAgICAgICAgICAJICAgICAgICAgICAgCQkJCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCQkJCXNpemUgPSAwOworCisgICAgICAgICAgICAJICAgICAgICAgICAgCQkJCQlzZXA6OlBhcnNlclV0aWw6OmF2bV9zeW50YXhfZXJyb3IoCisgICAgICAgICAgICAJICAgICAgICAgICAgCQkJCQkJImRlZl90eXBlX2FycmF5X3NpemUoLi4uKSIgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkJCQkJCQk8PCAidW5leHBlY3RlZCA8PCBbUXVhbGlmaWVkXU5hbWVJRDogIiA8PCBpZC5zCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCQkJCQkJPDwgIiA+PiBhcyBzaXplIGluIGFuIGFycmF5IHR5cGVkZWYiCisgICAgICAgICAgICAJICAgICAgICAgICAgCQkJCQkJCTw8IHNlcDo6UGFyc2VyVXRpbDo6U1lOVEFYX0VSUk9SX0VPTDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCQkJfQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkJCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCQorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgIE1BVENIVChSQlJBQ0tFVCwgJkZPTExPV19SQlJBQ0tFVF9pbl9kZWZfdHlwZV9hcnJheV9zaXplMTAyNDEpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfdHlwZV9hcnJheV9zaXplRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNpemU7CisgICAgICAgICAgICB9CisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVkZWZfdHlwZV9hcnJheV9zaXplRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlZGVmX3R5cGVfYXJyYXlfc2l6ZUV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTIwLCBkZWZfdHlwZV9hcnJheV9zaXplX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gc2l6ZTsKK30KKy8qICRBTlRMUiBlbmQgZGVmX3R5cGVfYXJyYXlfc2l6ZSAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBkZWZfdHlwZV9jb250YWluZXIKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM0Mjc6MTogZGVmX3R5cGVfY29udGFpbmVyWyBjb25zdCBzdGQ6OnN0cmluZyAmIHRpZCBdIHJldHVybnMgWyBzZXA6OkJGIHR5cGUgXSA6IHNiPSBzcGVjaWZpZXJfYnVmZmVyICggTFRfICggKGJ0dj0gYmFzZV90eXBlX3ZhciAoIENPTU1BICggJ3NpemU6JyApPyAoc3o9IGludGVnZXJfY29uc3RhbnQgfCBTVEFSICkgKT8gKSB8ICggJ3NpemU6JyApPyBzej0gaW50ZWdlcl9jb25zdGFudCApIEdUICk/IDsKKyAqLworc3RhdGljIHNlcDo6QkYKK2RlZl90eXBlX2NvbnRhaW5lcihwZm1sUGFyc2VyIGN0eCwgY29uc3Qgc3RkOjpzdHJpbmcgJiB0aWQpCit7CisgICAgc2VwOjpCRiB0eXBlOworCisgICAgQU5UTFIzX1VJTlQzMiBkZWZfdHlwZV9jb250YWluZXJfU3RhcnRJbmRleDsKKworICAgIHNlcDo6YXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCBzYjsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfc2IKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX3NiIHNlcDo6YXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdAorCisgICAgc2VwOjpCRiBidHY7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2J0dgorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfYnR2IHNlcDo6QkYKKworICAgIHNlcDo6YXZtX3NpemVfdCBzejsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfc3oKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX3N6IHNlcDo6YXZtX3NpemVfdAorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGRlZl90eXBlX2NvbnRhaW5lcl9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisKKyAgICAJc2VwOjpCRiBiYXNlVCA9IHNlcDo6VHlwZU1hbmFnZXI6OlVOSVZFUlNBTDsKKyAgICAJaW50IHN6VCA9IC0xOworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgxMjEpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNDMzOjM6IChzYj0gc3BlY2lmaWVyX2J1ZmZlciAoIExUXyAoIChidHY9IGJhc2VfdHlwZV92YXIgKCBDT01NQSAoICdzaXplOicgKT8gKHN6PSBpbnRlZ2VyX2NvbnN0YW50IHwgU1RBUiApICk/ICkgfCAoICdzaXplOicgKT8gc3o9IGludGVnZXJfY29uc3RhbnQgKSBHVCApPyApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM0MzM6NTogc2I9IHNwZWNpZmllcl9idWZmZXIgKCBMVF8gKCAoYnR2PSBiYXNlX3R5cGVfdmFyICggQ09NTUEgKCAnc2l6ZTonICk/IChzej0gaW50ZWdlcl9jb25zdGFudCB8IFNUQVIgKSApPyApIHwgKCAnc2l6ZTonICk/IHN6PSBpbnRlZ2VyX2NvbnN0YW50ICkgR1QgKT8KKyAgICAgICAgeworICAgICAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfc3BlY2lmaWVyX2J1ZmZlcl9pbl9kZWZfdHlwZV9jb250YWluZXIxMDI2Nik7CisgICAgICAgICAgICBzYj1zcGVjaWZpZXJfYnVmZmVyKGN0eCk7CisKKyAgICAgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfdHlwZV9jb250YWluZXJFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNDM0OjU6ICggTFRfICggKGJ0dj0gYmFzZV90eXBlX3ZhciAoIENPTU1BICggJ3NpemU6JyApPyAoc3o9IGludGVnZXJfY29uc3RhbnQgfCBTVEFSICkgKT8gKSB8ICggJ3NpemU6JyApPyBzej0gaW50ZWdlcl9jb25zdGFudCApIEdUICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDI5Nz0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTFRfOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDI5Nz0xOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQyOTcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzQzNDo3OiBMVF8gKCAoYnR2PSBiYXNlX3R5cGVfdmFyICggQ09NTUEgKCAnc2l6ZTonICk/IChzej0gaW50ZWdlcl9jb25zdGFudCB8IFNUQVIgKSApPyApIHwgKCAnc2l6ZTonICk/IHN6PSBpbnRlZ2VyX2NvbnN0YW50ICkgR1QKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChMVF8sICZGT0xMT1dfTFRfX2luX2RlZl90eXBlX2NvbnRhaW5lcjEwMjc0KTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3R5cGVfY29udGFpbmVyRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzQzNTo2OiAoIChidHY9IGJhc2VfdHlwZV92YXIgKCBDT01NQSAoICdzaXplOicgKT8gKHN6PSBpbnRlZ2VyX2NvbnN0YW50IHwgU1RBUiApICk/ICkgfCAoICdzaXplOicgKT8gc3o9IGludGVnZXJfY29uc3RhbnQgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQyOTY9MjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgSUQ6CisgICAgICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCSAgICBpbnQgTEEyOTZfMSA9IExBKDIpOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgIGlmICggKHN5bnByZWQ0OTNfZm1sKGN0eCkpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCSAgICAgICAgYWx0Mjk2PTE7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgIGVsc2UgaWYgKCAoQU5UTFIzX1RSVUUpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCSAgICAgICAgYWx0Mjk2PTI7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgIGVsc2UKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQkgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgCQkgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQkgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQkgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMjk2OworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDE7CisKKworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgICAgICBnb3RvIHJ1bGVkZWZfdHlwZV9jb250YWluZXJFeDsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI0MjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI0NToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI0NjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI0OToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI1NDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI1NToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI1OToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI2MToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI2NDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI3MDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI3MToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI4MzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMwOToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMxMDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMxNzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMyMDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMzMzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM0NDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM0NToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM0NjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM1NzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM1ODoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM2MDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM3NDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM4NzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM5MjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM5OToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDQwMDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDQwMToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDQwMjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDQwNToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDQwNzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDQwODoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDQwOToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJYWx0Mjk2PTE7CisgICAgICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBJbnRlZ2VyTGl0ZXJhbDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM3NToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJYWx0Mjk2PTI7CisgICAgICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAyOTY7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl90eXBlX2NvbnRhaW5lckV4OworCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQyOTYpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzQzNTo4OiAoYnR2PSBiYXNlX3R5cGVfdmFyICggQ09NTUEgKCAnc2l6ZTonICk/IChzej0gaW50ZWdlcl9jb25zdGFudCB8IFNUQVIgKSApPyApCisgICAgICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM0MzU6ODogKGJ0dj0gYmFzZV90eXBlX3ZhciAoIENPTU1BICggJ3NpemU6JyApPyAoc3o9IGludGVnZXJfY29uc3RhbnQgfCBTVEFSICkgKT8gKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzQzNToxMDogYnR2PSBiYXNlX3R5cGVfdmFyICggQ09NTUEgKCAnc2l6ZTonICk/IChzej0gaW50ZWdlcl9jb25zdGFudCB8IFNUQVIgKSApPworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2Jhc2VfdHlwZV92YXJfaW5fZGVmX3R5cGVfY29udGFpbmVyMTAyODcpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGJ0dj1iYXNlX3R5cGVfdmFyKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX3R5cGVfY29udGFpbmVyRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgIGJhc2VUID0gYnR2CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIDsgCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNDM2OjEwOiAoIENPTU1BICggJ3NpemU6JyApPyAoc3o9IGludGVnZXJfY29uc3RhbnQgfCBTVEFSICkgKT8KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIGludCBhbHQyOTQ9MjsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgICAgICBjYXNlIENPTU1BOgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIAkJYWx0Mjk0PTE7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQyOTQpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzQzNjoxMjogQ09NTUEgKCAnc2l6ZTonICk/IChzej0gaW50ZWdlcl9jb25zdGFudCB8IFNUQVIgKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoQ09NTUEsICZGT0xMT1dfQ09NTUFfaW5fZGVmX3R5cGVfY29udGFpbmVyMTAzMDMpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfdHlwZV9jb250YWluZXJFeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNDM2OjE5OiAoICdzaXplOicgKT8KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQyOTI9MjsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDM3NToKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJCWFsdDI5Mj0xOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0MjkyKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM0MzY6MjE6ICdzaXplOicKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKDM3NSwgJkZPTExPV18zNzVfaW5fZGVmX3R5cGVfY29udGFpbmVyMTAzMDgpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfdHlwZV9jb250YWluZXJFeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNDM3OjEyOiAoc3o9IGludGVnZXJfY29uc3RhbnQgfCBTVEFSICkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQyOTM9MjsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgSUQ6CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgSW50ZWdlckxpdGVyYWw6CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgIAkJYWx0MjkzPTE7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBTVEFSOgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgICAgICAJCWFsdDI5Mz0yOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMjkzOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl90eXBlX2NvbnRhaW5lckV4OworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDI5MykKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNDM3OjE0OiBzej0gaW50ZWdlcl9jb25zdGFudAorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fZGVmX3R5cGVfY29udGFpbmVyMTAzMjgpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHN6PWludGVnZXJfY29uc3RhbnQoY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfdHlwZV9jb250YWluZXJFeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgc3pUID0gc3oKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgOyAKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM0Mzg6MTQ6IFNUQVIKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKFNUQVIsICZGT0xMT1dfU1RBUl9pbl9kZWZfdHlwZV9jb250YWluZXIxMDM0NSk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl90eXBlX2NvbnRhaW5lckV4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICBzelQgPSAtMTsgCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgICAgICAJY2FzZSAyOgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNDQyOjg6ICggJ3NpemU6JyApPyBzej0gaW50ZWdlcl9jb25zdGFudAorICAgICAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNDQyOjg6ICggJ3NpemU6JyApPworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQyOTU9MjsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDM3NToKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgCQlhbHQyOTU9MTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0Mjk1KQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM0NDI6MTA6ICdzaXplOicKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVCgzNzUsICZGT0xMT1dfMzc1X2luX2RlZl90eXBlX2NvbnRhaW5lcjEwNDA3KTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3R5cGVfY29udGFpbmVyRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19pbnRlZ2VyX2NvbnN0YW50X2luX2RlZl90eXBlX2NvbnRhaW5lcjEwNDE0KTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHN6PWludGVnZXJfY29uc3RhbnQoY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl90eXBlX2NvbnRhaW5lckV4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgc3pUID0gc3oKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICA7IAorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChHVCwgJkZPTExPV19HVF9pbl9kZWZfdHlwZV9jb250YWluZXIxMDQzMSk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl90eXBlX2NvbnRhaW5lckV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgCQl0eXBlPSBzZXA6OkJGKCBzZXA6OkRhdGFUeXBlOjpuZXdDb250YWluZXIoX0NQTV8sCisgICAgICAgICAgICAgICAgCQkJCXNlcDo6RGF0YVR5cGU6OnN0ckNvbnRhaW5lcklkKHRpZCwgCisgICAgICAgICAgICAgICAgc2IKKyAgICAgICAgICAgICAgICAsIGJhc2VULCBzelQpLAorICAgICAgICAgICAgICAgIAkJCQlzYgorICAgICAgICAgICAgICAgICwgYmFzZVQsIHN6VCkgKTsKKworICAgICAgICAgICAgICAgIAkKKyAgICAgICAgICAgIH0KKworCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZWRlZl90eXBlX2NvbnRhaW5lckV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZWRlZl90eXBlX2NvbnRhaW5lckV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTIxLCBkZWZfdHlwZV9jb250YWluZXJfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiB0eXBlOworfQorLyogJEFOVExSIGVuZCBkZWZfdHlwZV9jb250YWluZXIgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgc3BlY2lmaWVyX2J1ZmZlcgorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzQ1NDoxOiBzcGVjaWZpZXJfYnVmZmVyIHJldHVybnMgWyBzZXA6OmF2bV90eXBlX3NwZWNpZmllcl9raW5kX3Qga2luZCBdIDogKCAnYXJyYXknIHwgJ3ZlY3RvcicgfCAncnZlY3RvcicgfCAnbGlzdCcgfCAnZmlmbycgfCAnbGlmbycgfCAnbXVsdGlmaWZvJyB8ICdtdWx0aWxpZm8nIHwgJ3NldCcgfCAnbXVsdGlzZXQnICk7CisgKi8KK3N0YXRpYyBzZXA6OmF2bV90eXBlX3NwZWNpZmllcl9raW5kX3QKK3NwZWNpZmllcl9idWZmZXIocGZtbFBhcnNlciBjdHgpCit7CisgICAgc2VwOjphdm1fdHlwZV9zcGVjaWZpZXJfa2luZF90IGtpbmQ7CisKKyAgICBBTlRMUjNfVUlOVDMyIHNwZWNpZmllcl9idWZmZXJfU3RhcnRJbmRleDsKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBzcGVjaWZpZXJfYnVmZmVyX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDEyMikpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4ga2luZDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vICAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNDU2OjI6ICggJ2FycmF5JyB8ICd2ZWN0b3InIHwgJ3J2ZWN0b3InIHwgJ2xpc3QnIHwgJ2ZpZm8nIHwgJ2xpZm8nIHwgJ211bHRpZmlmbycgfCAnbXVsdGlsaWZvJyB8ICdzZXQnIHwgJ211bHRpc2V0JyApCisKKyAgICAgICAgICAgIEFOVExSM19VSU5UMzIgYWx0Mjk4OworCisgICAgICAgICAgICBhbHQyOTg9MTA7CisKKyAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMjQxOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0Mjk4PTE7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0MTI6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQyOTg9MjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM3MDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDI5OD0zOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzE2OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0Mjk4PTQ7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyODE6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQyOTg9NTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMxNToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDI5OD02OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzI1OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0Mjk4PTc7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzMjY6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQyOTg9ODsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM3MzoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDI5OD05OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzI5OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0Mjk4PTEwOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBraW5kOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMjk4OworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgZ290byBydWxlc3BlY2lmaWVyX2J1ZmZlckV4OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0Mjk4KQorICAgICAgICAgICAgeworICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM0NTY6NDogJ2FycmF5JworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgyNDEsICZGT0xMT1dfMjQxX2luX3NwZWNpZmllcl9idWZmZXIxMDQ1Nik7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXNwZWNpZmllcl9idWZmZXJFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBraW5kOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBraW5kPSBzZXA6OlRZUEVfQVJSQVlfU1BFQ0lGSUVSOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNDU3OjQ6ICd2ZWN0b3InCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDQxMiwgJkZPTExPV180MTJfaW5fc3BlY2lmaWVyX2J1ZmZlcjEwNDY3KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3BlY2lmaWVyX2J1ZmZlckV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGtpbmQ7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGtpbmQ9IHNlcDo6VFlQRV9WRUNUT1JfU1BFQ0lGSUVSOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAzOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM0NTg6NDogJ3J2ZWN0b3InCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDM3MCwgJkZPTExPV18zNzBfaW5fc3BlY2lmaWVyX2J1ZmZlcjEwNDc3KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3BlY2lmaWVyX2J1ZmZlckV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGtpbmQ7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGtpbmQ9IHNlcDo6VFlQRV9SRVZFUlNFX1ZFQ1RPUl9TUEVDSUZJRVI7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA0OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM0NTk6NDogJ2xpc3QnCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDMxNiwgJkZPTExPV18zMTZfaW5fc3BlY2lmaWVyX2J1ZmZlcjEwNDg2KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3BlY2lmaWVyX2J1ZmZlckV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGtpbmQ7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGtpbmQ9IHNlcDo6VFlQRV9MSVNUX1NQRUNJRklFUjsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA1OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM0NjA6NDogJ2ZpZm8nCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDI4MSwgJkZPTExPV18yODFfaW5fc3BlY2lmaWVyX2J1ZmZlcjEwNDk4KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3BlY2lmaWVyX2J1ZmZlckV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGtpbmQ7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGtpbmQ9IHNlcDo6VFlQRV9GSUZPX1NQRUNJRklFUjsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA2OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM0NjE6NDogJ2xpZm8nCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDMxNSwgJkZPTExPV18zMTVfaW5fc3BlY2lmaWVyX2J1ZmZlcjEwNTEwKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3BlY2lmaWVyX2J1ZmZlckV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGtpbmQ7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGtpbmQ9IHNlcDo6VFlQRV9MSUZPX1NQRUNJRklFUjsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA3OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM0NjI6NDogJ211bHRpZmlmbycKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMzI1LCAmRk9MTE9XXzMyNV9pbl9zcGVjaWZpZXJfYnVmZmVyMTA1MjIpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzcGVjaWZpZXJfYnVmZmVyRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4ga2luZDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAga2luZD0gc2VwOjpUWVBFX01VTFRJX0ZJRk9fU1BFQ0lGSUVSOworICAgICAgICAJICAgICAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDg6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzQ2Mzo0OiAnbXVsdGlsaWZvJworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgzMjYsICZGT0xMT1dfMzI2X2luX3NwZWNpZmllcl9idWZmZXIxMDUyOSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXNwZWNpZmllcl9idWZmZXJFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBraW5kOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBraW5kPSBzZXA6OlRZUEVfTVVMVElfTElGT19TUEVDSUZJRVI7CisgICAgICAgIAkgICAgICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgOToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNDY0OjQ6ICdzZXQnCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDM3MywgJkZPTExPV18zNzNfaW5fc3BlY2lmaWVyX2J1ZmZlcjEwNTM2KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3BlY2lmaWVyX2J1ZmZlckV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGtpbmQ7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGtpbmQ9IHNlcDo6VFlQRV9TRVRfU1BFQ0lGSUVSOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAxMDoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNDY1OjQ6ICdtdWx0aXNldCcKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMzI5LCAmRk9MTE9XXzMyOV9pbl9zcGVjaWZpZXJfYnVmZmVyMTA1NDkpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzcGVjaWZpZXJfYnVmZmVyRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4ga2luZDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAga2luZD0gc2VwOjpUWVBFX01VTFRJU0VUX1NQRUNJRklFUjsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZXNwZWNpZmllcl9idWZmZXJFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVzcGVjaWZpZXJfYnVmZmVyRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgxMjIsIHNwZWNpZmllcl9idWZmZXJfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiBraW5kOworfQorLyogJEFOVExSIGVuZCBzcGVjaWZpZXJfYnVmZmVyICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGRlZl90eXBlX2ludGVydmFsCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNDY5OjE6IGRlZl90eXBlX2ludGVydmFsWyBjb25zdCBzdGQ6OnN0cmluZyAmIHRpZCBdIHJldHVybnMgWyBzZXA6OkJGIHR5cGUgXSA6ICdpbnRlcnZhbCcgTFRfIChwdD0gcHJpbWl0aXZlX3R5cGUgKT8gKGxsPSBMQlJBQ0tFVCB8bGw9IFJCUkFDS0VUIHxsbD0gTFBBUkVOICkgbWluPSBleHByZXNzaW9uIENPTU1BIG1heD0gZXhwcmVzc2lvbiAocnI9IExCUkFDS0VUIHxycj0gUkJSQUNLRVQgfHJyPSBSUEFSRU4gKSBHVCA7CisgKi8KK3N0YXRpYyBzZXA6OkJGCitkZWZfdHlwZV9pbnRlcnZhbChwZm1sUGFyc2VyIGN0eCwgY29uc3Qgc3RkOjpzdHJpbmcgJiB0aWQpCit7CisgICAgc2VwOjpCRiB0eXBlOworCisgICAgQU5UTFIzX1VJTlQzMiBkZWZfdHlwZV9pbnRlcnZhbF9TdGFydEluZGV4OworCisgICAgcEFOVExSM19DT01NT05fVE9LRU4gICAgbGw7CisgICAgcEFOVExSM19DT01NT05fVE9LRU4gICAgcnI7CisgICAgc2VwOjpUeXBlU3BlY2lmaWVyIHB0OworICAgICN1bmRlZglSRVRVUk5fVFlQRV9wdAorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfcHQgc2VwOjpUeXBlU3BlY2lmaWVyCisKKyAgICBzZXA6OkJGIG1pbjsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfbWluCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9taW4gc2VwOjpCRgorCisgICAgc2VwOjpCRiBtYXg7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX21heAorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfbWF4IHNlcDo6QkYKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBkZWZfdHlwZV9pbnRlcnZhbF9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisKKyAgICAJc2VwOjpCRiBiYXNlVCA9IHNlcDo6VHlwZU1hbmFnZXI6OklOVEVHRVI7CisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDEyMykpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICBsbCAgICAgICA9IE5VTEw7CisgICAgcnIgICAgICAgPSBOVUxMOworCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNDc0OjI6ICggJ2ludGVydmFsJyBMVF8gKHB0PSBwcmltaXRpdmVfdHlwZSApPyAobGw9IExCUkFDS0VUIHxsbD0gUkJSQUNLRVQgfGxsPSBMUEFSRU4gKSBtaW49IGV4cHJlc3Npb24gQ09NTUEgbWF4PSBleHByZXNzaW9uIChycj0gTEJSQUNLRVQgfHJyPSBSQlJBQ0tFVCB8cnI9IFJQQVJFTiApIEdUICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzQ3NDo0OiAnaW50ZXJ2YWwnIExUXyAocHQ9IHByaW1pdGl2ZV90eXBlICk/IChsbD0gTEJSQUNLRVQgfGxsPSBSQlJBQ0tFVCB8bGw9IExQQVJFTiApIG1pbj0gZXhwcmVzc2lvbiBDT01NQSBtYXg9IGV4cHJlc3Npb24gKHJyPSBMQlJBQ0tFVCB8cnI9IFJCUkFDS0VUIHxycj0gUlBBUkVOICkgR1QKKyAgICAgICAgeworICAgICAgICAgICAgIE1BVENIVCgzMTEsICZGT0xMT1dfMzExX2luX2RlZl90eXBlX2ludGVydmFsMTA1NzQpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfdHlwZV9pbnRlcnZhbEV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgdHlwZT0gc2VwOjpUeXBlTWFuYWdlcjo6SU5URUdFUjsKKyAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgIE1BVENIVChMVF8sICZGT0xMT1dfTFRfX2luX2RlZl90eXBlX2ludGVydmFsMTA1ODIpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfdHlwZV9pbnRlcnZhbEV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM0NzY6NjogKHB0PSBwcmltaXRpdmVfdHlwZSApPworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQyOTk9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ2OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDI0OToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNTQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjU1OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDI1OToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNjE6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjY0OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDI3MDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNzE6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjgzOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDMwOToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzMTA6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzE3OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDMyMDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzMzM6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzQ0OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM0NToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzNDY6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzU3OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM1ODoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzNjA6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzc0OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM4NzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzOTI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzk5OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDQwMDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDE6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDAyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDQwNToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDA4OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDQwOToKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQyOTk9MTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0Mjk5KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM0NzY6ODogcHQ9IHByaW1pdGl2ZV90eXBlCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3ByaW1pdGl2ZV90eXBlX2luX2RlZl90eXBlX2ludGVydmFsMTA1OTMpOworICAgICAgICAgICAgCSAgICAgICAgcHQ9cHJpbWl0aXZlX3R5cGUoY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl90eXBlX2ludGVydmFsRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBiYXNlVCA9IHB0CisgICAgICAgICAgICAJICAgICAgICAgICAgOyAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM0Nzc6NjogKGxsPSBMQlJBQ0tFVCB8bGw9IFJCUkFDS0VUIHxsbD0gTFBBUkVOICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MzAwPTM7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIExCUkFDS0VUOgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQzMDA9MTsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJCUkFDS0VUOgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQzMDA9MjsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIExQQVJFTjoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0MzAwPTM7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAzMDA7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl90eXBlX2ludGVydmFsRXg7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDMwMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNDc3Ojc6IGxsPSBMQlJBQ0tFVAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBsbCA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTikgTUFUQ0hUKExCUkFDS0VULCAmRk9MTE9XX0xCUkFDS0VUX2luX2RlZl90eXBlX2ludGVydmFsMTA2MDgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfdHlwZV9pbnRlcnZhbEV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDI6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM0Nzc6MjE6IGxsPSBSQlJBQ0tFVAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBsbCA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTikgTUFUQ0hUKFJCUkFDS0VULCAmRk9MTE9XX1JCUkFDS0VUX2luX2RlZl90eXBlX2ludGVydmFsMTA2MTQpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfdHlwZV9pbnRlcnZhbEV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDM6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM0Nzc6MzU6IGxsPSBMUEFSRU4KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgbGwgPSAocEFOVExSM19DT01NT05fVE9LRU4pIE1BVENIVChMUEFSRU4sICZGT0xMT1dfTFBBUkVOX2luX2RlZl90eXBlX2ludGVydmFsMTA2MjApOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfdHlwZV9pbnRlcnZhbEV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9kZWZfdHlwZV9pbnRlcnZhbDEwNjMwKTsKKyAgICAgICAgICAgIG1pbj1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfdHlwZV9pbnRlcnZhbEV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICBNQVRDSFQoQ09NTUEsICZGT0xMT1dfQ09NTUFfaW5fZGVmX3R5cGVfaW50ZXJ2YWwxMDYzMik7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl90eXBlX2ludGVydmFsRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9kZWZfdHlwZV9pbnRlcnZhbDEwNjM3KTsKKyAgICAgICAgICAgIG1heD1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfdHlwZV9pbnRlcnZhbEV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM0Nzk6NjogKHJyPSBMQlJBQ0tFVCB8cnI9IFJCUkFDS0VUIHxycj0gUlBBUkVOICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MzAxPTM7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIExCUkFDS0VUOgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQzMDE9MTsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJCUkFDS0VUOgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQzMDE9MjsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJQQVJFTjoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0MzAxPTM7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAzMDE7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl90eXBlX2ludGVydmFsRXg7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDMwMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNDc5Ojc6IHJyPSBMQlJBQ0tFVAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICByciA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTikgTUFUQ0hUKExCUkFDS0VULCAmRk9MTE9XX0xCUkFDS0VUX2luX2RlZl90eXBlX2ludGVydmFsMTA2NDcpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfdHlwZV9pbnRlcnZhbEV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDI6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM0Nzk6MjE6IHJyPSBSQlJBQ0tFVAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICByciA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTikgTUFUQ0hUKFJCUkFDS0VULCAmRk9MTE9XX1JCUkFDS0VUX2luX2RlZl90eXBlX2ludGVydmFsMTA2NTMpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfdHlwZV9pbnRlcnZhbEV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDM6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM0Nzk6MzU6IHJyPSBSUEFSRU4KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgcnIgPSAocEFOVExSM19DT01NT05fVE9LRU4pIE1BVENIVChSUEFSRU4sICZGT0xMT1dfUlBBUkVOX2luX2RlZl90eXBlX2ludGVydmFsMTA2NTkpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfdHlwZV9pbnRlcnZhbEV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgIE1BVENIVChHVCwgJkZPTExPV19HVF9pbl9kZWZfdHlwZV9pbnRlcnZhbDEwNjY1KTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX3R5cGVfaW50ZXJ2YWxFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAJCXR5cGU9IHNlcDo6QkYoIHNlcDo6RGF0YVR5cGU6Om5ld0ludGVydmFsKF9DUE1fLCB0aWQsIGJhc2VULAorICAgICAgICAgICAgICAgIAkJCXNlcDo6SUludGVydmFsS2luZDo6Y29tcHV0ZUtpbmQoQ0hBUihsbCksIENIQVIocnIpKSwKKyAgICAgICAgICAgICAgICAJCQkKKyAgICAgICAgICAgICAgICBtaW4KKyAgICAgICAgICAgICAgICAsIG1heAorICAgICAgICAgICAgICAgICkgKTsKKworICAgICAgICAgICAgICAgIAkKKyAgICAgICAgICAgIH0KKworCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZWRlZl90eXBlX2ludGVydmFsRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlZGVmX3R5cGVfaW50ZXJ2YWxFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDEyMywgZGVmX3R5cGVfaW50ZXJ2YWxfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiB0eXBlOworfQorLyogJEFOVExSIGVuZCBkZWZfdHlwZV9pbnRlcnZhbCAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBiYXNlX3R5cGVfdmFyCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNDg5OjE6IGJhc2VfdHlwZV92YXIgcmV0dXJucyBbIHNlcDo6QkYgdHlwZSBdIDogKHB0PSBwcmltaXRpdmVfdHlwZSB8aWQ9IHF1YWxpZmllZE5hbWVJRCApOworICovCitzdGF0aWMgc2VwOjpCRgorYmFzZV90eXBlX3ZhcihwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBzZXA6OkJGIHR5cGU7CisKKyAgICBBTlRMUjNfVUlOVDMyIGJhc2VfdHlwZV92YXJfU3RhcnRJbmRleDsKKworICAgIHNlcDo6VHlwZVNwZWNpZmllciBwdDsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfcHQKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX3B0IHNlcDo6VHlwZVNwZWNpZmllcgorCisgICAgZm1sUGFyc2VyX3F1YWxpZmllZE5hbWVJRF9yZXR1cm4gaWQ7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2lkCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9pZCBmbWxQYXJzZXJfcXVhbGlmaWVkTmFtZUlEX3JldHVybgorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGJhc2VfdHlwZV92YXJfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTI0KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM0OTE6MjogKHB0PSBwcmltaXRpdmVfdHlwZSB8aWQ9IHF1YWxpZmllZE5hbWVJRCApCisKKyAgICAgICAgICAgIEFOVExSM19VSU5UMzIgYWx0MzAyOworCisgICAgICAgICAgICBhbHQzMDI9MjsKKworICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAyNDI6CisgICAgICAgICAgICBjYXNlIDI0NToKKyAgICAgICAgICAgIGNhc2UgMjQ2OgorICAgICAgICAgICAgY2FzZSAyNDk6CisgICAgICAgICAgICBjYXNlIDI1NDoKKyAgICAgICAgICAgIGNhc2UgMjU1OgorICAgICAgICAgICAgY2FzZSAyNTk6CisgICAgICAgICAgICBjYXNlIDI2MToKKyAgICAgICAgICAgIGNhc2UgMjY0OgorICAgICAgICAgICAgY2FzZSAyNzA6CisgICAgICAgICAgICBjYXNlIDI3MToKKyAgICAgICAgICAgIGNhc2UgMjgzOgorICAgICAgICAgICAgY2FzZSAzMDk6CisgICAgICAgICAgICBjYXNlIDMxMDoKKyAgICAgICAgICAgIGNhc2UgMzE3OgorICAgICAgICAgICAgY2FzZSAzMjA6CisgICAgICAgICAgICBjYXNlIDMzMzoKKyAgICAgICAgICAgIGNhc2UgMzQ0OgorICAgICAgICAgICAgY2FzZSAzNDU6CisgICAgICAgICAgICBjYXNlIDM0NjoKKyAgICAgICAgICAgIGNhc2UgMzU3OgorICAgICAgICAgICAgY2FzZSAzNTg6CisgICAgICAgICAgICBjYXNlIDM2MDoKKyAgICAgICAgICAgIGNhc2UgMzc0OgorICAgICAgICAgICAgY2FzZSAzODc6CisgICAgICAgICAgICBjYXNlIDM5MjoKKyAgICAgICAgICAgIGNhc2UgMzk5OgorICAgICAgICAgICAgY2FzZSA0MDA6CisgICAgICAgICAgICBjYXNlIDQwMToKKyAgICAgICAgICAgIGNhc2UgNDAyOgorICAgICAgICAgICAgY2FzZSA0MDU6CisgICAgICAgICAgICBjYXNlIDQwNzoKKyAgICAgICAgICAgIGNhc2UgNDA4OgorICAgICAgICAgICAgY2FzZSA0MDk6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQzMDI9MTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIElEOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MzAyPTI7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAzMDI7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGViYXNlX3R5cGVfdmFyRXg7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQzMDIpCisgICAgICAgICAgICB7CisgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzQ5MTo0OiBwdD0gcHJpbWl0aXZlX3R5cGUKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3ByaW1pdGl2ZV90eXBlX2luX2Jhc2VfdHlwZV92YXIxMDY4Nik7CisgICAgICAgIAkgICAgICAgIHB0PXByaW1pdGl2ZV90eXBlKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWJhc2VfdHlwZV92YXJFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICB0eXBlPSAKKyAgICAgICAgCSAgICAgICAgICAgIHB0CisgICAgICAgIAkgICAgICAgICAgICA7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAyOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM0OTM6NDogaWQ9IHF1YWxpZmllZE5hbWVJRAorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX2Jhc2VfdHlwZV92YXIxMDY5Nik7CisgICAgICAgIAkgICAgICAgIGlkPXF1YWxpZmllZE5hbWVJRChjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGViYXNlX3R5cGVfdmFyRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgdHlwZT0gc2VwOjpQYXJzZXJVdGlsOjpnZXREYXRhVHlwZSgKKyAgICAgICAgCSAgICAgICAgICAgIGlkLnMKKyAgICAgICAgCSAgICAgICAgICAgICwgaWQubmIKKyAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGViYXNlX3R5cGVfdmFyRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlYmFzZV90eXBlX3ZhckV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTI0LCBiYXNlX3R5cGVfdmFyX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gdHlwZTsKK30KKy8qICRBTlRMUiBlbmQgYmFzZV90eXBlX3ZhciAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBwcmltaXRpdmVfdHlwZQorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzQ5ODoxOiBwcmltaXRpdmVfdHlwZSByZXR1cm5zIFsgc2VwOjpUeXBlU3BlY2lmaWVyIGJ0cyBdIDogKCAoICdib29sZWFuJyB8ICdib29sJyApIHwgKCAnaW50ZWdlcicgfCAnaW50JyApIChiZnM9IGJpdF9maWVsZF9zaXplICk/IHwgKCAndWludGVnZXInIHwgJ3VpbnQnICkgKGJmcz0gYml0X2ZpZWxkX3NpemUgKT8gfCAoICdwb3NfaW50ZWdlcicgfCAncG9zX2ludCcgKSAoYmZzPSBiaXRfZmllbGRfc2l6ZSApPyB8ICggKCAncmF0aW9uYWwnIHwgJ3JhdCcgKSB8ICggJ3VyYXRpb25hbCcgfCAndXJhdCcgKSB8ICdmbG9hdCcgfCAndWZsb2F0JyB8ICdkb3VibGUnIHwgJ3Vkb3VibGUnIHwgJ3JlYWwnIHwgJ3VyZWFsJyApIChiZnM9IGJpdF9maWVsZF9zaXplICk/IHxjdD0gdGltZV9jbG9ja190eXBlIHx0dD0gdGltZV90eXBlIHwgJ2NoYXInIChiZnM9IGJpdF9maWVsZF9zaXplICk/IHwgJ2NoYXJhY3RlcicgKGJmcz0gYml0X2ZpZWxkX3NpemUgKT8gfCAnc3RyaW5nJyAoc2ZzPSBzdHJpbmdfZmllbGRfc2l6ZSApPyB8ICdvcGVyYXRvcicgfCAnYXZtY29kZScgfCAncG9ydCcgfCAnYnVmZmVyJyB8ICdtZXNzYWdlJyB8ICdzaWduYWwnIHwgJ2Nvbm5lY3RvcicgfCAnbWFjaGluZScgKCBMVF8gaWQ9IHF1YWxpZmllZE5hbWVJRCBHVCApPyB8ICd1bml2ZXJzYWwnICk7CisgKi8KK3N0YXRpYyBzZXA6OlR5cGVTcGVjaWZpZXIKK3ByaW1pdGl2ZV90eXBlKHBmbWxQYXJzZXIgY3R4KQoreworICAgIHNlcDo6VHlwZVNwZWNpZmllciBidHM7CisKKyAgICBBTlRMUjNfVUlOVDMyIHByaW1pdGl2ZV90eXBlX1N0YXJ0SW5kZXg7CisKKyAgICBpbnQgYmZzOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9iZnMKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2JmcyBpbnQKKworICAgIHNlcDo6VHlwZVNwZWNpZmllciBjdDsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfY3QKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2N0IHNlcDo6VHlwZVNwZWNpZmllcgorCisgICAgc2VwOjpUeXBlU3BlY2lmaWVyIHR0OworICAgICN1bmRlZglSRVRVUk5fVFlQRV90dAorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfdHQgc2VwOjpUeXBlU3BlY2lmaWVyCisKKyAgICBmbWxQYXJzZXJfc3RyaW5nX2ZpZWxkX3NpemVfcmV0dXJuIHNmczsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfc2ZzCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9zZnMgZm1sUGFyc2VyX3N0cmluZ19maWVsZF9zaXplX3JldHVybgorCisgICAgZm1sUGFyc2VyX3F1YWxpZmllZE5hbWVJRF9yZXR1cm4gaWQ7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2lkCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9pZCBmbWxQYXJzZXJfcXVhbGlmaWVkTmFtZUlEX3JldHVybgorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIHByaW1pdGl2ZV90eXBlX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKworICAgIAlzZXA6OmF2bV9zaXplX3QgYXJpdHkgPSAxOworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgxMjUpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIGJ0czsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vICAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNTAzOjI6ICggKCAnYm9vbGVhbicgfCAnYm9vbCcgKSB8ICggJ2ludGVnZXInIHwgJ2ludCcgKSAoYmZzPSBiaXRfZmllbGRfc2l6ZSApPyB8ICggJ3VpbnRlZ2VyJyB8ICd1aW50JyApIChiZnM9IGJpdF9maWVsZF9zaXplICk/IHwgKCAncG9zX2ludGVnZXInIHwgJ3Bvc19pbnQnICkgKGJmcz0gYml0X2ZpZWxkX3NpemUgKT8gfCAoICggJ3JhdGlvbmFsJyB8ICdyYXQnICkgfCAoICd1cmF0aW9uYWwnIHwgJ3VyYXQnICkgfCAnZmxvYXQnIHwgJ3VmbG9hdCcgfCAnZG91YmxlJyB8ICd1ZG91YmxlJyB8ICdyZWFsJyB8ICd1cmVhbCcgKSAoYmZzPSBiaXRfZmllbGRfc2l6ZSApPyB8Y3Q9IHRpbWVfY2xvY2tfdHlwZSB8dHQ9IHRpbWVfdHlwZSB8ICdjaGFyJyAoYmZzPSBiaXRfZmllbGRfc2l6ZSApPyB8ICdjaGFyYWN0ZXInIChiZnM9IGJpdF9maWVsZF9zaXplICk/IHwgJ3N0cmluZycgKHNmcz0gc3RyaW5nX2ZpZWxkX3NpemUgKT8gfCAnb3BlcmF0b3InIHwgJ2F2bWNvZGUnIHwgJ3BvcnQnIHwgJ2J1ZmZlcicgfCAnbWVzc2FnZScgfCAnc2lnbmFsJyB8ICdjb25uZWN0b3InIHwgJ21hY2hpbmUnICggTFRfIGlkPSBxdWFsaWZpZWROYW1lSUQgR1QgKT8gfCAndW5pdmVyc2FsJyApCisKKyAgICAgICAgICAgIEFOVExSM19VSU5UMzIgYWx0MzEyOworCisgICAgICAgICAgICBhbHQzMTI9MTk7CisKKyAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMjQ1OgorICAgICAgICAgICAgY2FzZSAyNDY6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQzMTI9MTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMwOToKKyAgICAgICAgICAgIGNhc2UgMzEwOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MzEyPTI7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0MDE6CisgICAgICAgICAgICBjYXNlIDQwMjoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDMxMj0zOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzQ1OgorICAgICAgICAgICAgY2FzZSAzNDY6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQzMTI9NDsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI3MDoKKyAgICAgICAgICAgIGNhc2UgMjgzOgorICAgICAgICAgICAgY2FzZSAzNTc6CisgICAgICAgICAgICBjYXNlIDM1ODoKKyAgICAgICAgICAgIGNhc2UgMzYwOgorICAgICAgICAgICAgY2FzZSAzOTk6CisgICAgICAgICAgICBjYXNlIDQwMDoKKyAgICAgICAgICAgIGNhc2UgNDA3OgorICAgICAgICAgICAgY2FzZSA0MDg6CisgICAgICAgICAgICBjYXNlIDQwOToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDMxMj01OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjU5OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MzEyPTY7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNjQ6CisgICAgICAgICAgICBjYXNlIDI3MToKKyAgICAgICAgICAgIGNhc2UgMzkyOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MzEyPTc7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNTQ6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQzMTI9ODsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI1NToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDMxMj05OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzg3OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MzEyPTEwOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzMzOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MzEyPTExOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjQyOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MzEyPTEyOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzQ0OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MzEyPTEzOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjQ5OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MzEyPTE0OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzIwOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MzEyPTE1OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzc0OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MzEyPTE2OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjYxOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MzEyPTE3OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzE3OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MzEyPTE4OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDA1OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MzEyPTE5OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBidHM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAzMTI7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVwcmltaXRpdmVfdHlwZUV4OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MzEyKQorICAgICAgICAgICAgeworICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM1MDM6NDogKCAnYm9vbGVhbicgfCAnYm9vbCcgKQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgaWYgKCAoKExBKDEpID49IDI0NSkgJiYgKExBKDEpIDw9IDI0NikpICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgQ09OU1VNRSgpOworICAgICAgICAJICAgICAgICAgICAgUEVSUk9SUkVDT1ZFUlk9QU5UTFIzX0ZBTFNFOworICAgICAgICAJICAgICAgICAgICAgRkFJTEVERkxBRz1BTlRMUjNfRkFMU0U7CisKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBlbHNlCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIGJ0czsKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX01JU01BVENIRURfU0VUX0VYQ0VQVElPTjsKKyAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+bmFtZSAgICAgICAgID0gKHZvaWQgKilBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfTkFNRTsKKyAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+ZXhwZWN0aW5nU2V0ID0gTlVMTDsKKworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlcHJpbWl0aXZlX3R5cGVFeDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgYnRzPSBzZXA6OlR5cGVNYW5hZ2VyOjpCT09MRUFOOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNTA1OjQ6ICggJ2ludGVnZXInIHwgJ2ludCcgKSAoYmZzPSBiaXRfZmllbGRfc2l6ZSApPworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgaWYgKCAoKExBKDEpID49IDMwOSkgJiYgKExBKDEpIDw9IDMxMCkpICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgQ09OU1VNRSgpOworICAgICAgICAJICAgICAgICAgICAgUEVSUk9SUkVDT1ZFUlk9QU5UTFIzX0ZBTFNFOworICAgICAgICAJICAgICAgICAgICAgRkFJTEVERkxBRz1BTlRMUjNfRkFMU0U7CisKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBlbHNlCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIGJ0czsKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX01JU01BVENIRURfU0VUX0VYQ0VQVElPTjsKKyAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+bmFtZSAgICAgICAgID0gKHZvaWQgKilBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfTkFNRTsKKyAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+ZXhwZWN0aW5nU2V0ID0gTlVMTDsKKworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlcHJpbWl0aXZlX3R5cGVFeDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgYnRzPSBzZXA6OlR5cGVNYW5hZ2VyOjpJTlRFR0VSOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNTA2OjQ6IChiZnM9IGJpdF9maWVsZF9zaXplICk/CisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQzMDM9MjsKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIENPTE9OOgorICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQl7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQkgICAgaW50IExBMzAzXzEgPSBMQSgyKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJCSAgICBpZiAoIChzeW5wcmVkNTE0X2ZtbChjdHgpKSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJCSAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQkgICAgICAgIGFsdDMwMz0xOworICAgICAgICAJICAgICAgICAgICAgICAgIAkJICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICAJCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIExUXzoKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgICAgIAkJYWx0MzAzPTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0MzAzKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM1MDY6NjogYmZzPSBiaXRfZmllbGRfc2l6ZQorICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfYml0X2ZpZWxkX3NpemVfaW5fcHJpbWl0aXZlX3R5cGUxMDc1NSk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGJmcz1iaXRfZmllbGRfc2l6ZShjdHgpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVwcmltaXRpdmVfdHlwZUV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJ0czsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgYnRzPSBzZXA6OlR5cGVNYW5hZ2VyOjpnZXRUeXBlSW50ZWdlciggCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBiZnMKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICApOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDM6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzUxMDo0OiAoICd1aW50ZWdlcicgfCAndWludCcgKSAoYmZzPSBiaXRfZmllbGRfc2l6ZSApPworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgaWYgKCAoKExBKDEpID49IDQwMSkgJiYgKExBKDEpIDw9IDQwMikpICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgQ09OU1VNRSgpOworICAgICAgICAJICAgICAgICAgICAgUEVSUk9SUkVDT1ZFUlk9QU5UTFIzX0ZBTFNFOworICAgICAgICAJICAgICAgICAgICAgRkFJTEVERkxBRz1BTlRMUjNfRkFMU0U7CisKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBlbHNlCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIGJ0czsKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX01JU01BVENIRURfU0VUX0VYQ0VQVElPTjsKKyAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+bmFtZSAgICAgICAgID0gKHZvaWQgKilBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfTkFNRTsKKyAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+ZXhwZWN0aW5nU2V0ID0gTlVMTDsKKworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlcHJpbWl0aXZlX3R5cGVFeDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgYnRzPSBzZXA6OlR5cGVNYW5hZ2VyOjpVSU5URUdFUjsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzUxMTo0OiAoYmZzPSBiaXRfZmllbGRfc2l6ZSApPworICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0MzA0PTI7CisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBDT0xPTjoKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgICAgIAkJeworICAgICAgICAJICAgICAgICAgICAgICAgIAkJICAgIGludCBMQTMwNF8xID0gTEEoMik7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQkgICAgaWYgKCAoc3lucHJlZDUxN19mbWwoY3R4KSkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgCQkgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgIAkJICAgICAgICBhbHQzMDQ9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJCSAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBMVF86CisgICAgICAgIAkgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJCWFsdDMwND0xOworICAgICAgICAJICAgICAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDMwNCkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNTExOjY6IGJmcz0gYml0X2ZpZWxkX3NpemUKKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2JpdF9maWVsZF9zaXplX2luX3ByaW1pdGl2ZV90eXBlMTA3OTQpOworICAgICAgICAJICAgICAgICAJICAgICAgICBiZnM9Yml0X2ZpZWxkX3NpemUoY3R4KTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlcHJpbWl0aXZlX3R5cGVFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBidHM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIGJ0cz0gc2VwOjpUeXBlTWFuYWdlcjo6Z2V0VHlwZVVJbnRlZ2VyKCAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGJmcworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgNDoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNTE1OjQ6ICggJ3Bvc19pbnRlZ2VyJyB8ICdwb3NfaW50JyApIChiZnM9IGJpdF9maWVsZF9zaXplICk/CisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBpZiAoICgoTEEoMSkgPj0gMzQ1KSAmJiAoTEEoMSkgPD0gMzQ2KSkgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBDT05TVU1FKCk7CisgICAgICAgIAkgICAgICAgICAgICBQRVJST1JSRUNPVkVSWT1BTlRMUjNfRkFMU0U7CisgICAgICAgIAkgICAgICAgICAgICBGQUlMRURGTEFHPUFOVExSM19GQUxTRTsKKworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGVsc2UKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gYnRzOworICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfRVhDRVBUSU9OOworICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT5uYW1lICAgICAgICAgPSAodm9pZCAqKUFOVExSM19NSVNNQVRDSEVEX1NFVF9OQU1FOworICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT5leHBlY3RpbmdTZXQgPSBOVUxMOworCisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVwcmltaXRpdmVfdHlwZUV4OworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBidHM9IHNlcDo6VHlwZU1hbmFnZXI6OlBPU19JTlRFR0VSOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNTE2OjQ6IChiZnM9IGJpdF9maWVsZF9zaXplICk/CisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQzMDU9MjsKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIENPTE9OOgorICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQl7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQkgICAgaW50IExBMzA1XzEgPSBMQSgyKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJCSAgICBpZiAoIChzeW5wcmVkNTIwX2ZtbChjdHgpKSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJCSAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQkgICAgICAgIGFsdDMwNT0xOworICAgICAgICAJICAgICAgICAgICAgICAgIAkJICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICAJCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIExUXzoKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgICAgIAkJYWx0MzA1PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0MzA1KQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM1MTY6NjogYmZzPSBiaXRfZmllbGRfc2l6ZQorICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfYml0X2ZpZWxkX3NpemVfaW5fcHJpbWl0aXZlX3R5cGUxMDgzMSk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGJmcz1iaXRfZmllbGRfc2l6ZShjdHgpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVwcmltaXRpdmVfdHlwZUV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJ0czsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgYnRzPSBzZXA6OlR5cGVNYW5hZ2VyOjpnZXRUeXBlUG9zSW50ZWdlciggCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBiZnMKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICApOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDU6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzUyMTo0OiAoICggJ3JhdGlvbmFsJyB8ICdyYXQnICkgfCAoICd1cmF0aW9uYWwnIHwgJ3VyYXQnICkgfCAnZmxvYXQnIHwgJ3VmbG9hdCcgfCAnZG91YmxlJyB8ICd1ZG91YmxlJyB8ICdyZWFsJyB8ICd1cmVhbCcgKSAoYmZzPSBiaXRfZmllbGRfc2l6ZSApPworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzUyMTo0OiAoICggJ3JhdGlvbmFsJyB8ICdyYXQnICkgfCAoICd1cmF0aW9uYWwnIHwgJ3VyYXQnICkgfCAnZmxvYXQnIHwgJ3VmbG9hdCcgfCAnZG91YmxlJyB8ICd1ZG91YmxlJyB8ICdyZWFsJyB8ICd1cmVhbCcgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0MzA2PTg7CisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM1NzoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzU4OgorICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgIAkJYWx0MzA2PTE7CisgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgY2FzZSA0MDc6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDQwODoKKyAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAJCWFsdDMwNj0yOworICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjgzOgorICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgIAkJYWx0MzA2PTM7CisgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgY2FzZSA0MDA6CisgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgCQlhbHQzMDY9NDsKKyAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI3MDoKKyAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAJCWFsdDMwNj01OworICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzk5OgorICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgIAkJYWx0MzA2PTY7CisgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgY2FzZSAzNjA6CisgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgCQlhbHQzMDY9NzsKKyAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDQwOToKKyAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAJCWFsdDMwNj04OworICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIHJldHVybiBidHM7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAzMDY7CisgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVwcmltaXRpdmVfdHlwZUV4OworCisgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0MzA2KQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM1MjE6NjogKCAncmF0aW9uYWwnIHwgJ3JhdCcgKQorICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCAoKExBKDEpID49IDM1NykgJiYgKExBKDEpIDw9IDM1OCkpICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgQ09OU1VNRSgpOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgUEVSUk9SUkVDT1ZFUlk9QU5UTFIzX0ZBTFNFOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgRkFJTEVERkxBRz1BTlRMUjNfRkFMU0U7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBlbHNlCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIGJ0czsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX01JU01BVENIRURfU0VUX0VYQ0VQVElPTjsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+bmFtZSAgICAgICAgID0gKHZvaWQgKilBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfTkFNRTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+ZXhwZWN0aW5nU2V0ID0gTlVMTDsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlcHJpbWl0aXZlX3R5cGVFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgYnRzPSBzZXA6OlR5cGVNYW5hZ2VyOjpSQVRJT05BTDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAljYXNlIDI6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzUyMjo2OiAoICd1cmF0aW9uYWwnIHwgJ3VyYXQnICkKKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggKChMQSgxKSA+PSA0MDcpICYmIChMQSgxKSA8PSA0MDgpKSApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIENPTlNVTUUoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIFBFUlJPUlJFQ09WRVJZPUFOVExSM19GQUxTRTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIEZBSUxFREZMQUc9QU5UTFIzX0ZBTFNFOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgZWxzZQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiBidHM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19NSVNNQVRDSEVEX1NFVF9FWENFUFRJT047CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPm5hbWUgICAgICAgICA9ICh2b2lkICopQU5UTFIzX01JU01BVENIRURfU0VUX05BTUU7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPmV4cGVjdGluZ1NldCA9IE5VTEw7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXByaW1pdGl2ZV90eXBlRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIGJ0cz0gc2VwOjpUeXBlTWFuYWdlcjo6VVJBVElPTkFMOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMzoKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNTI0OjY6ICdmbG9hdCcKKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoMjgzLCAmRk9MTE9XXzI4M19pbl9wcmltaXRpdmVfdHlwZTEwODkwKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlcHJpbWl0aXZlX3R5cGVFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBidHM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIGJ0cz0gc2VwOjpUeXBlTWFuYWdlcjo6RkxPQVQ7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAJY2FzZSA0OgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM1MjU6NjogJ3VmbG9hdCcKKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoNDAwLCAmRk9MTE9XXzQwMF9pbl9wcmltaXRpdmVfdHlwZTEwOTAyKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlcHJpbWl0aXZlX3R5cGVFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBidHM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIGJ0cz0gc2VwOjpUeXBlTWFuYWdlcjo6VUZMT0FUOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgNToKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNTI3OjY6ICdkb3VibGUnCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKDI3MCwgJkZPTExPV18yNzBfaW5fcHJpbWl0aXZlX3R5cGUxMDkxNCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXByaW1pdGl2ZV90eXBlRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYnRzOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICBidHM9IHNlcDo6VHlwZU1hbmFnZXI6OkRPVUJMRTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAljYXNlIDY6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzUyODo2OiAndWRvdWJsZScKKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoMzk5LCAmRk9MTE9XXzM5OV9pbl9wcmltaXRpdmVfdHlwZTEwOTI1KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlcHJpbWl0aXZlX3R5cGVFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBidHM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIGJ0cz0gc2VwOjpUeXBlTWFuYWdlcjo6VURPVUJMRTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAljYXNlIDc6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzUzMDo2OiAncmVhbCcKKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoMzYwLCAmRk9MTE9XXzM2MF9pbl9wcmltaXRpdmVfdHlwZTEwOTM2KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlcHJpbWl0aXZlX3R5cGVFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBidHM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIGJ0cz0gc2VwOjpUeXBlTWFuYWdlcjo6UkVBTDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAljYXNlIDg6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzUzMTo2OiAndXJlYWwnCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKDQwOSwgJkZPTExPV180MDlfaW5fcHJpbWl0aXZlX3R5cGUxMDk0OSk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXByaW1pdGl2ZV90eXBlRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYnRzOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICBidHM9IHNlcDo6VHlwZU1hbmFnZXI6OlVSRUFMOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzUzMzo0OiAoYmZzPSBiaXRfZmllbGRfc2l6ZSApPworICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0MzA3PTI7CisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBDT0xPTjoKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgICAgIAkJeworICAgICAgICAJICAgICAgICAgICAgICAgIAkJICAgIGludCBMQTMwN18xID0gTEEoMik7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQkgICAgaWYgKCAoc3lucHJlZDUzMV9mbWwoY3R4KSkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgCQkgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgIAkJICAgICAgICBhbHQzMDc9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJCSAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBMVF86CisgICAgICAgIAkgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJCWFsdDMwNz0xOworICAgICAgICAJICAgICAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDMwNykKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNTMzOjY6IGJmcz0gYml0X2ZpZWxkX3NpemUKKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2JpdF9maWVsZF9zaXplX2luX3ByaW1pdGl2ZV90eXBlMTA5NjgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBiZnM9Yml0X2ZpZWxkX3NpemUoY3R4KTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlcHJpbWl0aXZlX3R5cGVFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBidHM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAJYnRzPSBzZXA6OlR5cGVNYW5hZ2VyOjpuZXdOdW1lcmljVHlwZVNwZWNpZmllcigKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgIAkJCQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgYnRzCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAsIGJmcworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgLCBzZXA6OkV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9aRVJPKTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgNjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNTQxOjQ6IGN0PSB0aW1lX2Nsb2NrX3R5cGUKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3RpbWVfY2xvY2tfdHlwZV9pbl9wcmltaXRpdmVfdHlwZTEwOTg4KTsKKyAgICAgICAgCSAgICAgICAgY3Q9dGltZV9jbG9ja190eXBlKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXByaW1pdGl2ZV90eXBlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYnRzOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBidHM9IAorICAgICAgICAJICAgICAgICAgICAgY3QKKyAgICAgICAgCSAgICAgICAgICAgIDsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDc6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzU0Mzo0OiB0dD0gdGltZV90eXBlCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV190aW1lX3R5cGVfaW5fcHJpbWl0aXZlX3R5cGUxMDk5OCk7CisgICAgICAgIAkgICAgICAgIHR0PXRpbWVfdHlwZShjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVwcmltaXRpdmVfdHlwZUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJ0czsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgYnRzPSAKKyAgICAgICAgCSAgICAgICAgICAgIHR0CisgICAgICAgIAkgICAgICAgICAgICA7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA4OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM1NDU6NDogJ2NoYXInIChiZnM9IGJpdF9maWVsZF9zaXplICk/CisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDI1NCwgJkZPTExPV18yNTRfaW5fcHJpbWl0aXZlX3R5cGUxMTAwNik7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXByaW1pdGl2ZV90eXBlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYnRzOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBidHM9IHNlcDo6VHlwZU1hbmFnZXI6OkNIQVI7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM1NDY6NDogKGJmcz0gYml0X2ZpZWxkX3NpemUgKT8KKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDMwOD0yOworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgQ09MT046CisgICAgICAgIAkgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJCXsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJCSAgICBpbnQgTEEzMDhfMSA9IExBKDIpOworICAgICAgICAJICAgICAgICAgICAgICAgIAkJICAgIGlmICggKHN5bnByZWQ1MzVfZm1sKGN0eCkpKQorICAgICAgICAJICAgICAgICAgICAgICAgIAkJICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJCSAgICAgICAgYWx0MzA4PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQkgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIAkJfQorICAgICAgICAJICAgICAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgTFRfOgorICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQlhbHQzMDg9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQzMDgpCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzU0Njo2OiBiZnM9IGJpdF9maWVsZF9zaXplCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19iaXRfZmllbGRfc2l6ZV9pbl9wcmltaXRpdmVfdHlwZTExMDIwKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgYmZzPWJpdF9maWVsZF9zaXplKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXByaW1pdGl2ZV90eXBlRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYnRzOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICBidHM9IHNlcDo6VHlwZU1hbmFnZXI6Om5ld0NoYXJhY3RlciggImNoYXIiLCAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGJmcworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgOToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNTUwOjQ6ICdjaGFyYWN0ZXInIChiZnM9IGJpdF9maWVsZF9zaXplICk/CisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDI1NSwgJkZPTExPV18yNTVfaW5fcHJpbWl0aXZlX3R5cGUxMTAzNyk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXByaW1pdGl2ZV90eXBlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYnRzOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBidHM9IHNlcDo6VHlwZU1hbmFnZXI6OkNIQVJBQ1RFUjsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzU1MTo0OiAoYmZzPSBiaXRfZmllbGRfc2l6ZSApPworICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0MzA5PTI7CisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBDT0xPTjoKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgICAgIAkJeworICAgICAgICAJICAgICAgICAgICAgICAgIAkJICAgIGludCBMQTMwOV8xID0gTEEoMik7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQkgICAgaWYgKCAoc3lucHJlZDUzN19mbWwoY3R4KSkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgCQkgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgIAkJICAgICAgICBhbHQzMDk9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJCSAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBMVF86CisgICAgICAgIAkgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJCWFsdDMwOT0xOworICAgICAgICAJICAgICAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDMwOSkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNTUxOjY6IGJmcz0gYml0X2ZpZWxkX3NpemUKKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2JpdF9maWVsZF9zaXplX2luX3ByaW1pdGl2ZV90eXBlMTEwNTEpOworICAgICAgICAJICAgICAgICAJICAgICAgICBiZnM9Yml0X2ZpZWxkX3NpemUoY3R4KTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlcHJpbWl0aXZlX3R5cGVFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBidHM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIGJ0cz0gc2VwOjpUeXBlTWFuYWdlcjo6bmV3Q2hhcmFjdGVyKCAiY2hhcmFjdGVyIiwgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBiZnMKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICApOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDEwOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM1NTU6NDogJ3N0cmluZycgKHNmcz0gc3RyaW5nX2ZpZWxkX3NpemUgKT8KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMzg3LCAmRk9MTE9XXzM4N19pbl9wcmltaXRpdmVfdHlwZTExMDY4KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlcHJpbWl0aXZlX3R5cGVFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBidHM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGJ0cz0gc2VwOjpUeXBlTWFuYWdlcjo6U1RSSU5HOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNTU2OjQ6IChzZnM9IHN0cmluZ19maWVsZF9zaXplICk/CisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQzMTA9MjsKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIENPTE9OOgorICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQl7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQkgICAgaW50IExBMzEwXzEgPSBMQSgyKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJCSAgICBpZiAoIChzeW5wcmVkNTM5X2ZtbChjdHgpKSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJCSAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQkgICAgICAgIGFsdDMxMD0xOworICAgICAgICAJICAgICAgICAgICAgICAgIAkJICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICAJCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIExUXzoKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgICAgIAkJYWx0MzEwPTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0MzEwKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM1NTY6Njogc2ZzPSBzdHJpbmdfZmllbGRfc2l6ZQorICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfc3RyaW5nX2ZpZWxkX3NpemVfaW5fcHJpbWl0aXZlX3R5cGUxMTA4MCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHNmcz1zdHJpbmdfZmllbGRfc2l6ZShjdHgpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVwcmltaXRpdmVfdHlwZUV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJ0czsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgYnRzPSBzZXA6OlR5cGVNYW5hZ2VyOjpuZXdTdHJpbmcoIAorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgc2ZzLm1pbgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICwgc2ZzLm1heAorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMTE6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzU2MTo0OiAnb3BlcmF0b3InCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDMzMywgJkZPTExPV18zMzNfaW5fcHJpbWl0aXZlX3R5cGUxMTA5OCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXByaW1pdGl2ZV90eXBlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYnRzOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBidHM9IHNlcDo6VHlwZU1hbmFnZXI6Ok9QRVJBVE9SOworICAgICAgICAJICAgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAxMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNTYyOjQ6ICdhdm1jb2RlJworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgyNDIsICZGT0xMT1dfMjQyX2luX3ByaW1pdGl2ZV90eXBlMTExMDcpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVwcmltaXRpdmVfdHlwZUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJ0czsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgYnRzPSBzZXA6OlR5cGVNYW5hZ2VyOjpBVk1DT0RFOworICAgICAgICAJICAgICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMTM6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzU2NDo0OiAncG9ydCcKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMzQ0LCAmRk9MTE9XXzM0NF9pbl9wcmltaXRpdmVfdHlwZTExMTE4KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlcHJpbWl0aXZlX3R5cGVFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBidHM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGJ0cz0gc2VwOjpUeXBlTWFuYWdlcjo6UE9SVDsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDE0OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM1NjU6NDogJ2J1ZmZlcicKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMjQ5LCAmRk9MTE9XXzI0OV9pbl9wcmltaXRpdmVfdHlwZTExMTMxKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlcHJpbWl0aXZlX3R5cGVFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBidHM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGJ0cz0gc2VwOjpUeXBlTWFuYWdlcjo6QlVGRkVSOworICAgICAgICAJICAgICAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDE1OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM1NjY6NDogJ21lc3NhZ2UnCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDMyMCwgJkZPTExPV18zMjBfaW5fcHJpbWl0aXZlX3R5cGUxMTE0Mik7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXByaW1pdGl2ZV90eXBlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYnRzOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBidHM9IHNlcDo6VHlwZU1hbmFnZXI6Ok1FU1NBR0U7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAxNjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNTY3OjQ6ICdzaWduYWwnCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDM3NCwgJkZPTExPV18zNzRfaW5fcHJpbWl0aXZlX3R5cGUxMTE1Mik7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXByaW1pdGl2ZV90eXBlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYnRzOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBidHM9IHNlcDo6VHlwZU1hbmFnZXI6OlNJR05BTDsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAxNzoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNTY4OjQ6ICdjb25uZWN0b3InCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDI2MSwgJkZPTExPV18yNjFfaW5fcHJpbWl0aXZlX3R5cGUxMTE2Myk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXByaW1pdGl2ZV90eXBlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYnRzOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBidHM9IHNlcDo6VHlwZU1hbmFnZXI6OkNPTk5FQ1RPUjsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDE4OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM1NzA6NDogJ21hY2hpbmUnICggTFRfIGlkPSBxdWFsaWZpZWROYW1lSUQgR1QgKT8KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMzE3LCAmRk9MTE9XXzMxN19pbl9wcmltaXRpdmVfdHlwZTExMTcyKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlcHJpbWl0aXZlX3R5cGVFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBidHM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGJ0cz0gc2VwOjpUeXBlTWFuYWdlcjo6TUFDSElORTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzU3MTo0OiAoIExUXyBpZD0gcXVhbGlmaWVkTmFtZUlEIEdUICk/CisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQzMTE9MjsKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIExUXzoKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgICAgIAkJYWx0MzExPTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0MzExKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM1NzE6NjogTFRfIGlkPSBxdWFsaWZpZWROYW1lSUQgR1QKKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoTFRfLCAmRk9MTE9XX0xUX19pbl9wcmltaXRpdmVfdHlwZTExMTg0KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlcHJpbWl0aXZlX3R5cGVFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBidHM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9wcmltaXRpdmVfdHlwZTExMTg5KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWQ9cXVhbGlmaWVkTmFtZUlEKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXByaW1pdGl2ZV90eXBlRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYnRzOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKEdULCAmRk9MTE9XX0dUX2luX3ByaW1pdGl2ZV90eXBlMTExOTIpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVwcmltaXRpdmVfdHlwZUV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJ0czsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgIAlzZXA6OkJGIG1hY2hpbmVUID0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgIAkJCXNlcDo6UGFyc2VyVXRpbDo6Z2V0RXhlY3V0YWJsZU1hY2hpbmUoaWQucworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgLCBpZC5uYgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgIAorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDE5OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM1Nzg6NDogJ3VuaXZlcnNhbCcKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoNDA1LCAmRk9MTE9XXzQwNV9pbl9wcmltaXRpdmVfdHlwZTExMjA5KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlcHJpbWl0aXZlX3R5cGVFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBidHM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGJ0cz0gc2VwOjpUeXBlTWFuYWdlcjo6VU5JVkVSU0FMOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlcHJpbWl0aXZlX3R5cGVFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVwcmltaXRpdmVfdHlwZUV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTI1LCBwcmltaXRpdmVfdHlwZV9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIGJ0czsKK30KKy8qICRBTlRMUiBlbmQgcHJpbWl0aXZlX3R5cGUgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgYml0X2ZpZWxkX3NpemUKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM1ODI6MTogYml0X2ZpZWxkX3NpemUgcmV0dXJucyBbIGludCBzaXplIF0gOiAoIENPTE9OIG49IGludGVnZXJfY29uc3RhbnQgfCBMVF8gKCAnc2l6ZTonICk/IG49IGludGVnZXJfY29uc3RhbnQgR1QgKTsKKyAqLworc3RhdGljIGludAorYml0X2ZpZWxkX3NpemUocGZtbFBhcnNlciBjdHgpCit7CisgICAgaW50IHNpemU7CisKKyAgICBBTlRMUjNfVUlOVDMyIGJpdF9maWVsZF9zaXplX1N0YXJ0SW5kZXg7CisKKyAgICBzZXA6OmF2bV9zaXplX3QgbjsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfbgorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfbiBzZXA6OmF2bV9zaXplX3QKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBiaXRfZmllbGRfc2l6ZV9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgxMjYpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorCisgICAgeworICAgICAgICB7CisgICAgICAgICAgICAvLyAgL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzU4NDoyOiAoIENPTE9OIG49IGludGVnZXJfY29uc3RhbnQgfCBMVF8gKCAnc2l6ZTonICk/IG49IGludGVnZXJfY29uc3RhbnQgR1QgKQorCisgICAgICAgICAgICBBTlRMUjNfVUlOVDMyIGFsdDMxNDsKKworICAgICAgICAgICAgYWx0MzE0PTI7CisKKyAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQ09MT046CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQzMTQ9MTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIExUXzoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDMxND0yOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzaXplOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMzE0OworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgZ290byBydWxlYml0X2ZpZWxkX3NpemVFeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDMxNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNTg0OjQ6IENPTE9OIG49IGludGVnZXJfY29uc3RhbnQKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoQ09MT04sICZGT0xMT1dfQ09MT05faW5fYml0X2ZpZWxkX3NpemUxMTIyOCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWJpdF9maWVsZF9zaXplRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfaW50ZWdlcl9jb25zdGFudF9pbl9iaXRfZmllbGRfc2l6ZTExMjMzKTsKKyAgICAgICAgCSAgICAgICAgbj1pbnRlZ2VyX2NvbnN0YW50KGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWJpdF9maWVsZF9zaXplRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgc2l6ZSA9IG4KKyAgICAgICAgCSAgICAgICAgICAgIDsgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAyOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM1ODU6NDogTFRfICggJ3NpemU6JyApPyBuPSBpbnRlZ2VyX2NvbnN0YW50IEdUCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKExUXywgJkZPTExPV19MVF9faW5fYml0X2ZpZWxkX3NpemUxMTI1Nyk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWJpdF9maWVsZF9zaXplRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzU4NTo5OiAoICdzaXplOicgKT8KKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDMxMz0yOworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzc1OgorICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQlhbHQzMTM9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQzMTMpCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzU4NToxMTogJ3NpemU6JworICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVCgzNzUsICZGT0xMT1dfMzc1X2luX2JpdF9maWVsZF9zaXplMTEyNjIpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGViaXRfZmllbGRfc2l6ZUV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHNpemU7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19pbnRlZ2VyX2NvbnN0YW50X2luX2JpdF9maWVsZF9zaXplMTEyNzApOworICAgICAgICAJICAgICAgICBuPWludGVnZXJfY29uc3RhbnQoY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlYml0X2ZpZWxkX3NpemVFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBzaXplOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAgTUFUQ0hUKEdULCAmRk9MTE9XX0dUX2luX2JpdF9maWVsZF9zaXplMTEyNzMpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGViaXRfZmllbGRfc2l6ZUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHNpemU7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIHNpemUgPSBuCisgICAgICAgIAkgICAgICAgICAgICA7IAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlYml0X2ZpZWxkX3NpemVFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGViaXRfZmllbGRfc2l6ZUV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTI2LCBiaXRfZmllbGRfc2l6ZV9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIHNpemU7Cit9CisvKiAkQU5UTFIgZW5kIGJpdF9maWVsZF9zaXplICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IHN0cmluZ19maWVsZF9zaXplCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNTg5OjE6IHN0cmluZ19maWVsZF9zaXplIHJldHVybnMgWyBpbnQgbWluPTAgLCBpbnQgbWF4PS0xIF0gOiAoIENPTE9OIHJjPSByYW5nZV9jb25zdGFudCB8IExUXyAoICdzaXplOicgKT8gcmM9IHJhbmdlX2NvbnN0YW50IEdUICk7CisgKi8KK3N0YXRpYyBmbWxQYXJzZXJfc3RyaW5nX2ZpZWxkX3NpemVfcmV0dXJuCitzdHJpbmdfZmllbGRfc2l6ZShwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBmbWxQYXJzZXJfc3RyaW5nX2ZpZWxkX3NpemVfcmV0dXJuIHJldHZhbDsKKworICAgIEFOVExSM19VSU5UMzIgc3RyaW5nX2ZpZWxkX3NpemVfU3RhcnRJbmRleDsKKworICAgIGZtbFBhcnNlcl9yYW5nZV9jb25zdGFudF9yZXR1cm4gcmM7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX3JjCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9yYyBmbWxQYXJzZXJfcmFuZ2VfY29uc3RhbnRfcmV0dXJuCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgcmV0dmFsLm1pbiA9IDA7CisgICAgcmV0dmFsLm1heCA9IC0xOworCisgICAgc3RyaW5nX2ZpZWxkX3NpemVfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTI3KSkgKQorICAgIHsKKyAgICAJcmV0dmFsLnN0YXJ0ID0gMDsKKworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CisKKyAgICByZXR2YWwuc3RhcnQgPSBMVCgxKTsgcmV0dmFsLnN0b3AgPSByZXR2YWwuc3RhcnQ7CisKKworICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM1OTE6MjogKCBDT0xPTiByYz0gcmFuZ2VfY29uc3RhbnQgfCBMVF8gKCAnc2l6ZTonICk/IHJjPSByYW5nZV9jb25zdGFudCBHVCApCisKKyAgICAgICAgICAgIEFOVExSM19VSU5UMzIgYWx0MzE2OworCisgICAgICAgICAgICBhbHQzMTY9MjsKKworICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBDT0xPTjoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDMxNj0xOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTFRfOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MzE2PTI7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDMxNjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXN0cmluZ19maWVsZF9zaXplRXg7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQzMTYpCisgICAgICAgICAgICB7CisgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzU5MTo0OiBDT0xPTiByYz0gcmFuZ2VfY29uc3RhbnQKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoQ09MT04sICZGT0xMT1dfQ09MT05faW5fc3RyaW5nX2ZpZWxkX3NpemUxMTI5Mik7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0cmluZ19maWVsZF9zaXplRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19yYW5nZV9jb25zdGFudF9pbl9zdHJpbmdfZmllbGRfc2l6ZTExMjk2KTsKKyAgICAgICAgCSAgICAgICAgcmM9cmFuZ2VfY29uc3RhbnQoY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RyaW5nX2ZpZWxkX3NpemVFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIHJldHZhbC5taW49IAorICAgICAgICAJICAgICAgICAgICAgcmMubWluCisgICAgICAgIAkgICAgICAgICAgICA7CisgICAgICAgIAkgICAgICAgICAgICAgcmV0dmFsLm1heD0gCisgICAgICAgIAkgICAgICAgICAgICByYy5tYXgKKyAgICAgICAgCSAgICAgICAgICAgIDsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDI6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzU5NDo0OiBMVF8gKCAnc2l6ZTonICk/IHJjPSByYW5nZV9jb25zdGFudCBHVAorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChMVF8sICZGT0xMT1dfTFRfX2luX3N0cmluZ19maWVsZF9zaXplMTEzMDcpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdHJpbmdfZmllbGRfc2l6ZUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzU5NDo5OiAoICdzaXplOicgKT8KKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDMxNT0yOworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzc1OgorICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQlhbHQzMTU9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQzMTUpCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzU5NDoxMTogJ3NpemU6JworICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVCgzNzUsICZGT0xMT1dfMzc1X2luX3N0cmluZ19maWVsZF9zaXplMTEzMTIpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdHJpbmdfZmllbGRfc2l6ZUV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3JhbmdlX2NvbnN0YW50X2luX3N0cmluZ19maWVsZF9zaXplMTEzMjApOworICAgICAgICAJICAgICAgICByYz1yYW5nZV9jb25zdGFudChjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdHJpbmdfZmllbGRfc2l6ZUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChHVCwgJkZPTExPV19HVF9pbl9zdHJpbmdfZmllbGRfc2l6ZTExMzIzKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RyaW5nX2ZpZWxkX3NpemVFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIHJldHZhbC5taW49IAorICAgICAgICAJICAgICAgICAgICAgcmMubWluCisgICAgICAgIAkgICAgICAgICAgICA7CisgICAgICAgIAkgICAgICAgICAgICAgcmV0dmFsLm1heD0gCisgICAgICAgIAkgICAgICAgICAgICByYy5tYXgKKyAgICAgICAgCSAgICAgICAgICAgIDsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZXN0cmluZ19maWVsZF9zaXplRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlc3RyaW5nX2ZpZWxkX3NpemVFeDogOworICAgIHJldHZhbC5zdG9wID0gTFQoLTEpOworCisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTI3LCBzdHJpbmdfZmllbGRfc2l6ZV9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIHJldHZhbDsKK30KKy8qICRBTlRMUiBlbmQgc3RyaW5nX2ZpZWxkX3NpemUgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgcmFuZ2VfY29uc3RhbnQKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM1OTg6MTogcmFuZ2VfY29uc3RhbnQgcmV0dXJucyBbIGludCBtaW49MCAsIGludCBtYXg9LTEgXSA6IG49IGludGVnZXJfY29uc3RhbnQgKCAoIENPTU1BIHwgRE9URE9UICkgbj0gaW50ZWdlcl9jb25zdGFudCApPyA7CisgKi8KK3N0YXRpYyBmbWxQYXJzZXJfcmFuZ2VfY29uc3RhbnRfcmV0dXJuCityYW5nZV9jb25zdGFudChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBmbWxQYXJzZXJfcmFuZ2VfY29uc3RhbnRfcmV0dXJuIHJldHZhbDsKKworICAgIEFOVExSM19VSU5UMzIgcmFuZ2VfY29uc3RhbnRfU3RhcnRJbmRleDsKKworICAgIHNlcDo6YXZtX3NpemVfdCBuOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9uCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9uIHNlcDo6YXZtX3NpemVfdAorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIHJldHZhbC5taW4gPSAwOworICAgIHJldHZhbC5tYXggPSAtMTsKKworICAgIHJhbmdlX2NvbnN0YW50X1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDEyOCkpICkKKyAgICB7CisgICAgCXJldHZhbC5zdGFydCA9IDA7CisKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorCisgICAgcmV0dmFsLnN0YXJ0ID0gTFQoMSk7IHJldHZhbC5zdG9wID0gcmV0dmFsLnN0YXJ0OworCisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM2MDA6MjogKG49IGludGVnZXJfY29uc3RhbnQgKCAoIENPTU1BIHwgRE9URE9UICkgbj0gaW50ZWdlcl9jb25zdGFudCApPyApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM2MDA6NDogbj0gaW50ZWdlcl9jb25zdGFudCAoICggQ09NTUEgfCBET1RET1QgKSBuPSBpbnRlZ2VyX2NvbnN0YW50ICk/CisgICAgICAgIHsKKyAgICAgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fcmFuZ2VfY29uc3RhbnQxMTM0NSk7CisgICAgICAgICAgICBuPWludGVnZXJfY29uc3RhbnQoY3R4KTsKKworICAgICAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXJhbmdlX2NvbnN0YW50RXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIHJldHZhbC5tYXg9IAorICAgICAgICAgICAgICAgIG4KKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM2MDE6NDogKCAoIENPTU1BIHwgRE9URE9UICkgbj0gaW50ZWdlcl9jb25zdGFudCApPworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQzMTc9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIENPTU1BOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgaW50IExBMzE3XzEgPSBMQSgyKTsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgaWYgKCAoc3lucHJlZDU1NV9mbWwoY3R4KSkpCisgICAgICAgICAgICAgICAgICAgIAkJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgICAgIGFsdDMxNz0xOworICAgICAgICAgICAgICAgICAgICAJCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRE9URE9UOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDMxNz0xOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQzMTcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzYwMTo2OiAoIENPTU1BIHwgRE9URE9UICkgbj0gaW50ZWdlcl9jb25zdGFudAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBpZiAoIExBKDEpID09IENPTU1BIHx8IExBKDEpID09IERPVERPVCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgQ09OU1VNRSgpOworICAgICAgICAgICAgCSAgICAgICAgICAgIFBFUlJPUlJFQ09WRVJZPUFOVExSM19GQUxTRTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBGQUlMRURGTEFHPUFOVExSM19GQUxTRTsKKworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgZWxzZQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX01JU01BVENIRURfU0VUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPm5hbWUgICAgICAgICA9ICh2b2lkICopQU5UTFIzX01JU01BVENIRURfU0VUX05BTUU7CisgICAgICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT5leHBlY3RpbmdTZXQgPSBOVUxMOworCisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlcmFuZ2VfY29uc3RhbnRFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19pbnRlZ2VyX2NvbnN0YW50X2luX3JhbmdlX2NvbnN0YW50MTEzNzQpOworICAgICAgICAgICAgCSAgICAgICAgbj1pbnRlZ2VyX2NvbnN0YW50KGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVyYW5nZV9jb25zdGFudEV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICByZXR2YWwubWluPSAKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR2YWwubWF4CisgICAgICAgICAgICAJICAgICAgICAgICAgOworICAgICAgICAgICAgCSAgICAgICAgICAgICByZXR2YWwubWF4PSAKKyAgICAgICAgICAgIAkgICAgICAgICAgICBuCisgICAgICAgICAgICAJICAgICAgICAgICAgOworICAgICAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlcmFuZ2VfY29uc3RhbnRFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVyYW5nZV9jb25zdGFudEV4OiA7CisgICAgcmV0dmFsLnN0b3AgPSBMVCgtMSk7CisKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgxMjgsIHJhbmdlX2NvbnN0YW50X1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gcmV0dmFsOworfQorLyogJEFOVExSIGVuZCByYW5nZV9jb25zdGFudCAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBvbl93cml0ZV92YXJfcm91dGluZV9kZWYKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM2MDY6MTogb25fd3JpdGVfdmFyX3JvdXRpbmVfZGVmWyBzZXA6OlZhcmlhYmxlICogdmFyIF0gOiBMQ1VSTFkgKCB2YXJfcm91dGluZV9kZWZbIHZhciBdICkrIFJDVVJMWSA7CisgKi8KK3N0YXRpYyB2b2lkCitvbl93cml0ZV92YXJfcm91dGluZV9kZWYocGZtbFBhcnNlciBjdHgsIHNlcDo6VmFyaWFibGUgKiB2YXIpCit7CisgICAgQU5UTFIzX1VJTlQzMiBvbl93cml0ZV92YXJfcm91dGluZV9kZWZfU3RhcnRJbmRleDsKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBvbl93cml0ZV92YXJfcm91dGluZV9kZWZfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTI5KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNjA3OjI6ICggTENVUkxZICggdmFyX3JvdXRpbmVfZGVmWyB2YXIgXSApKyBSQ1VSTFkgKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNjA3OjQ6IExDVVJMWSAoIHZhcl9yb3V0aW5lX2RlZlsgdmFyIF0gKSsgUkNVUkxZCisgICAgICAgIHsKKyAgICAgICAgICAgICBNQVRDSFQoTENVUkxZLCAmRk9MTE9XX0xDVVJMWV9pbl9vbl93cml0ZV92YXJfcm91dGluZV9kZWYxMTM5Nik7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZW9uX3dyaXRlX3Zhcl9yb3V0aW5lX2RlZkV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzYwNzoxMjogKCB2YXJfcm91dGluZV9kZWZbIHZhciBdICkrCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGNudDMxOD0wOworCisgICAgICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBhbHQzMTg9MjsKKyAgICAgICAgICAgIAlzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCWNhc2UgMjA1OgorICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAJCQlhbHQzMTg9MTsKKyAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCX0KKworICAgICAgICAgICAgCXN3aXRjaCAoYWx0MzE4KQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgY2FzZSAxOgorICAgICAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzYwNzoxNDogdmFyX3JvdXRpbmVfZGVmWyB2YXIgXQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3Zhcl9yb3V0aW5lX2RlZl9pbl9vbl93cml0ZV92YXJfcm91dGluZV9kZWYxMTQwMSk7CisgICAgICAgICAgICAJICAgICAgICAgICAgdmFyX3JvdXRpbmVfZGVmKGN0eCwgdmFyKTsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVvbl93cml0ZV92YXJfcm91dGluZV9kZWZFeDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgZGVmYXVsdDoKKworICAgICAgICAgICAgCQlpZiAoIGNudDMxOCA+PSAxICkKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkgICAgZ290byBsb29wMzE4OworICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAJCWlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgCQkgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkJfQorCisgICAgICAgICAgICAJCS8qIG1pc21hdGNoZWRTZXRFeCgpCisgICAgICAgICAgICAJCSAqLworICAgICAgICAgICAgCQlDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgCQlFWENFUFRJT04tPnR5cGUgPSBBTlRMUjNfRUFSTFlfRVhJVF9FWENFUFRJT047CisgICAgICAgICAgICAJCUVYQ0VQVElPTi0+bmFtZSA9ICh2b2lkICopQU5UTFIzX0VBUkxZX0VYSVRfTkFNRTsKKworCisgICAgICAgICAgICAJCWdvdG8gcnVsZW9uX3dyaXRlX3Zhcl9yb3V0aW5lX2RlZkV4OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAljbnQzMTgrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9vcDMxODogOwkvKiBKdW1wIHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICBNQVRDSFQoUkNVUkxZLCAmRk9MTE9XX1JDVVJMWV9pbl9vbl93cml0ZV92YXJfcm91dGluZV9kZWYxMTQwNyk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZW9uX3dyaXRlX3Zhcl9yb3V0aW5lX2RlZkV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVvbl93cml0ZV92YXJfcm91dGluZV9kZWZFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVvbl93cml0ZV92YXJfcm91dGluZV9kZWZFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDEyOSwgb25fd3JpdGVfdmFyX3JvdXRpbmVfZGVmX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBvbl93cml0ZV92YXJfcm91dGluZV9kZWYgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgdmFyX3JvdXRpbmVfZGVmCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNjExOjE6IHZhcl9yb3V0aW5lX2RlZlsgc2VwOjpWYXJpYWJsZSAqIHZhciBdIDogJ0Bvbl93cml0ZScgKCByb3V0aW5lX3NpbmdsZV9wYXJhbVsqb25Xcml0ZVJvdXRpbmUsIHZhci0+Z2V0VHlwZSgpXSApPyAoYnM9IGJsb2NrX3N0YXRlbWVudCB8ICd8PT4nIGNlPSBjb25kaXRpb25hbEV4cHJlc3Npb24gU0VNSSApIDsKKyAqLworc3RhdGljIHZvaWQKK3Zhcl9yb3V0aW5lX2RlZihwZm1sUGFyc2VyIGN0eCwgc2VwOjpWYXJpYWJsZSAqIHZhcikKK3sKKyAgICBBTlRMUjNfVUlOVDMyIHZhcl9yb3V0aW5lX2RlZl9TdGFydEluZGV4OworCisgICAgc2VwOjpCRkNvZGUgYnM7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2JzCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9icyBzZXA6OkJGQ29kZQorCisgICAgc2VwOjpCRiBjZTsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfY2UKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2NlIHNlcDo6QkYKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICB2YXJfcm91dGluZV9kZWZfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworCisgICAgCXNlcDo6Um91dGluZSAqIG9uV3JpdGVSb3V0aW5lID0gTlVMTDsKKworICAgIAlzZXA6OkJlaGF2aW9yYWxQYXJ0ICogYUJlaGF2aW9yYWxwYXJ0ID0gdmFyLT5nZXRVbmlxQ29udGFpbmVyT2ZSb3V0aW5lcygpOworCisgICAgCVNBVkVfUlVMRV9CRUdJTl9MT0NBVElPTjsKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTMwKSkgKQorICAgIHsKKyAgICAgICAgeworCisgICAgICAgICAgICAJU0VUX1JVTEVfTE9DQVRJT04oIG9uV3JpdGVSb3V0aW5lICk7CisKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM2MjI6MjogKCAnQG9uX3dyaXRlJyAoIHJvdXRpbmVfc2luZ2xlX3BhcmFtWypvbldyaXRlUm91dGluZSwgdmFyLT5nZXRUeXBlKCldICk/IChicz0gYmxvY2tfc3RhdGVtZW50IHwgJ3w9PicgY2U9IGNvbmRpdGlvbmFsRXhwcmVzc2lvbiBTRU1JICkgKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNjIyOjQ6ICdAb25fd3JpdGUnICggcm91dGluZV9zaW5nbGVfcGFyYW1bKm9uV3JpdGVSb3V0aW5lLCB2YXItPmdldFR5cGUoKV0gKT8gKGJzPSBibG9ja19zdGF0ZW1lbnQgfCAnfD0+JyBjZT0gY29uZGl0aW9uYWxFeHByZXNzaW9uIFNFTUkgKQorICAgICAgICB7CisgICAgICAgICAgICAgTUFUQ0hUKDIwNSwgJkZPTExPV18yMDVfaW5fdmFyX3JvdXRpbmVfZGVmMTE0MjkpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGV2YXJfcm91dGluZV9kZWZFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIAkgIAlvbldyaXRlUm91dGluZSA9IG5ldyBzZXA6OlJvdXRpbmUodmFyLCAib25fd3JpdGUiKTsKKyAgICAgICAgICAgICAgICAJICAJdmFyLT5zZXRPbldyaXRlUm91dGluZShvbldyaXRlUm91dGluZSk7CisgICAgICAgICAgICAgICAgCSAgCWlmKCBhQmVoYXZpb3JhbHBhcnQgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgCSAgCXsKKyAgICAgICAgICAgICAgICAJICAJCWFCZWhhdmlvcmFscGFydC0+c2F2ZUFub255bW91c0lubmVyUm91dGluZShvbldyaXRlUm91dGluZSk7CisgICAgICAgICAgICAgICAgCSAgCX0KKyAgICAgICAgICAgICAgICAJICAKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNjMxOjQ6ICggcm91dGluZV9zaW5nbGVfcGFyYW1bKm9uV3JpdGVSb3V0aW5lLCB2YXItPmdldFR5cGUoKV0gKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MzE5PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMUEFSRU46CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJYWx0MzE5PTE7CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDMxOSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNjMxOjY6IHJvdXRpbmVfc2luZ2xlX3BhcmFtWypvbldyaXRlUm91dGluZSwgdmFyLT5nZXRUeXBlKCldCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3JvdXRpbmVfc2luZ2xlX3BhcmFtX2luX3Zhcl9yb3V0aW5lX2RlZjExNDQxKTsKKyAgICAgICAgICAgIAkgICAgICAgIHJvdXRpbmVfc2luZ2xlX3BhcmFtKGN0eCwgKm9uV3JpdGVSb3V0aW5lLCB2YXItPmdldFR5cGUoKSk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV2YXJfcm91dGluZV9kZWZFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzYzMjo0OiAoYnM9IGJsb2NrX3N0YXRlbWVudCB8ICd8PT4nIGNlPSBjb25kaXRpb25hbEV4cHJlc3Npb24gU0VNSSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDMyMD0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBMQ1VSTFk6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDMyMD0xOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNDE3OgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQzMjA9MjsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMzIwOworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgICAgICBnb3RvIHJ1bGV2YXJfcm91dGluZV9kZWZFeDsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MzIwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM2MzI6NjogYnM9IGJsb2NrX3N0YXRlbWVudAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19ibG9ja19zdGF0ZW1lbnRfaW5fdmFyX3JvdXRpbmVfZGVmMTE0NTQpOworICAgICAgICAgICAgCSAgICAgICAgYnM9YmxvY2tfc3RhdGVtZW50KGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV2YXJfcm91dGluZV9kZWZFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgb25Xcml0ZVJvdXRpbmUtPnNldENvZGUoYnMKKyAgICAgICAgICAgIAkgICAgICAgICAgICApOyAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAyOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNjMzOjY6ICd8PT4nIGNlPSBjb25kaXRpb25hbEV4cHJlc3Npb24gU0VNSQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKDQxNywgJkZPTExPV180MTdfaW5fdmFyX3JvdXRpbmVfZGVmMTE0NjQpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV2YXJfcm91dGluZV9kZWZFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2NvbmRpdGlvbmFsRXhwcmVzc2lvbl9pbl92YXJfcm91dGluZV9kZWYxMTQ2OCk7CisgICAgICAgICAgICAJICAgICAgICBjZT1jb25kaXRpb25hbEV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXZhcl9yb3V0aW5lX2RlZkV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChTRU1JLCAmRk9MTE9XX1NFTUlfaW5fdmFyX3JvdXRpbmVfZGVmMTE0NzApOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV2YXJfcm91dGluZV9kZWZFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgb25Xcml0ZVJvdXRpbmUtPnNldENvZGUoIE5FV19TVE1UMShPUChHVUFSRCksIGNlCisgICAgICAgICAgICAJICAgICAgICAgICAgKSApOyAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxldmFyX3JvdXRpbmVfZGVmRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxldmFyX3JvdXRpbmVfZGVmRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIAlTRVRfUlVMRV9MT0NBVElPTiggb25Xcml0ZVJvdXRpbmUgKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgxMzAsIHZhcl9yb3V0aW5lX2RlZl9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgdmFyX3JvdXRpbmVfZGVmICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IHJvdXRpbmVfc2luZ2xlX3BhcmFtCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNjM4OjE6IHJvdXRpbmVfc2luZ2xlX3BhcmFtWyBzZXA6OlJvdXRpbmUgJiByb3V0aW5lICwgY29uc3Qgc2VwOjpCRiAmIGRmdFR5cGUgXSA6IExQQVJFTiAoICggdHlwZV92YXIgSUQgKT0+dHY9IHR5cGVfdmFyIGlkPSBJRCB8aWQ9IElEICkgKGl2PSBpbml0aWFsX3ZhbHVlICk/IFJQQVJFTiA7CisgKi8KK3N0YXRpYyB2b2lkCityb3V0aW5lX3NpbmdsZV9wYXJhbShwZm1sUGFyc2VyIGN0eCwgc2VwOjpSb3V0aW5lICYgcm91dGluZSwgY29uc3Qgc2VwOjpCRiAmIGRmdFR5cGUpCit7CisgICAgQU5UTFIzX1VJTlQzMiByb3V0aW5lX3NpbmdsZV9wYXJhbV9TdGFydEluZGV4OworCisgICAgcEFOVExSM19DT01NT05fVE9LRU4gICAgaWQ7CisgICAgc2VwOjpCRiB0djsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfdHYKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX3R2IHNlcDo6QkYKKworICAgIHNlcDo6QkYgaXY7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2l2CisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9pdiBzZXA6OkJGCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgcm91dGluZV9zaW5nbGVfcGFyYW1fU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworCisgICAgCXNlcDo6QkYgcGFyYW1UID0gZGZ0VHlwZTsKKyAgICAJc2VwOjpCRiB2YWx1ZTsKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTMxKSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgaWQgICAgICAgPSBOVUxMOworCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNjQ0OjI6ICggTFBBUkVOICggKCB0eXBlX3ZhciBJRCApPT50dj0gdHlwZV92YXIgaWQ9IElEIHxpZD0gSUQgKSAoaXY9IGluaXRpYWxfdmFsdWUgKT8gUlBBUkVOICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzY0NDo0OiBMUEFSRU4gKCAoIHR5cGVfdmFyIElEICk9PnR2PSB0eXBlX3ZhciBpZD0gSUQgfGlkPSBJRCApIChpdj0gaW5pdGlhbF92YWx1ZSApPyBSUEFSRU4KKyAgICAgICAgeworICAgICAgICAgICAgIE1BVENIVChMUEFSRU4sICZGT0xMT1dfTFBBUkVOX2luX3JvdXRpbmVfc2luZ2xlX3BhcmFtMTE0OTgpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVyb3V0aW5lX3NpbmdsZV9wYXJhbUV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzY0NTo0OiAoICggdHlwZV92YXIgSUQgKT0+dHY9IHR5cGVfdmFyIGlkPSBJRCB8aWQ9IElEICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MzIxPTI7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEEzMjFfMCA9IExBKDEpOworICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkNTU5X2ZtbChjdHgpKSAmJiAoKChMQTMyMV8wID49IDI0NSkgJiYgKExBMzIxXzAgPD0gMjQ2KSkpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzMjE9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ1NTlfZm1sKGN0eCkpICYmICgoKExBMzIxXzAgPj0gMzA5KSAmJiAoTEEzMjFfMCA8PSAzMTApKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDMyMT0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDU1OV9mbWwoY3R4KSkgJiYgKCgoTEEzMjFfMCA+PSA0MDEpICYmIChMQTMyMV8wIDw9IDQwMikpKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzIxPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNTU5X2ZtbChjdHgpKSAmJiAoKChMQTMyMV8wID49IDM0NSkgJiYgKExBMzIxXzAgPD0gMzQ2KSkpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzMjE9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ1NTlfZm1sKGN0eCkpICYmICgoKExBMzIxXzAgPj0gMzU3KSAmJiAoTEEzMjFfMCA8PSAzNTgpKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDMyMT0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDU1OV9mbWwoY3R4KSkgJiYgKCgoTEEzMjFfMCA+PSA0MDcpICYmIChMQTMyMV8wIDw9IDQwOCkpKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzIxPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNTU5X2ZtbChjdHgpKSAmJiAoTEEzMjFfMCA9PSAyODMpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzMjE9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ1NTlfZm1sKGN0eCkpICYmIChMQTMyMV8wID09IDQwMCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDMyMT0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDU1OV9mbWwoY3R4KSkgJiYgKExBMzIxXzAgPT0gMjcwKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzIxPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNTU5X2ZtbChjdHgpKSAmJiAoTEEzMjFfMCA9PSAzOTkpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzMjE9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ1NTlfZm1sKGN0eCkpICYmIChMQTMyMV8wID09IDM2MCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDMyMT0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDU1OV9mbWwoY3R4KSkgJiYgKExBMzIxXzAgPT0gNDA5KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzIxPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNTU5X2ZtbChjdHgpKSAmJiAoTEEzMjFfMCA9PSAyNTkpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzMjE9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ1NTlfZm1sKGN0eCkpICYmIChMQTMyMV8wID09IDM5MikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDMyMT0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDU1OV9mbWwoY3R4KSkgJiYgKExBMzIxXzAgPT0gMjY0KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzIxPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNTU5X2ZtbChjdHgpKSAmJiAoTEEzMjFfMCA9PSAyNzEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzMjE9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ1NTlfZm1sKGN0eCkpICYmIChMQTMyMV8wID09IDI1NCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDMyMT0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDU1OV9mbWwoY3R4KSkgJiYgKExBMzIxXzAgPT0gMjU1KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzIxPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNTU5X2ZtbChjdHgpKSAmJiAoTEEzMjFfMCA9PSAzODcpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzMjE9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ1NTlfZm1sKGN0eCkpICYmIChMQTMyMV8wID09IDMzMykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDMyMT0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDU1OV9mbWwoY3R4KSkgJiYgKExBMzIxXzAgPT0gMjQyKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzIxPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNTU5X2ZtbChjdHgpKSAmJiAoTEEzMjFfMCA9PSAzNDQpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzMjE9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ1NTlfZm1sKGN0eCkpICYmIChMQTMyMV8wID09IDI0OSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDMyMT0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDU1OV9mbWwoY3R4KSkgJiYgKExBMzIxXzAgPT0gMzIwKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzIxPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNTU5X2ZtbChjdHgpKSAmJiAoTEEzMjFfMCA9PSAzNzQpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzMjE9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ1NTlfZm1sKGN0eCkpICYmIChMQTMyMV8wID09IDI2MSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDMyMT0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDU1OV9mbWwoY3R4KSkgJiYgKExBMzIxXzAgPT0gMzE3KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzIxPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNTU5X2ZtbChjdHgpKSAmJiAoTEEzMjFfMCA9PSA0MDUpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzMjE9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMzIxXzAgPT0gSUQpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMzIxXzI5ID0gTEEoMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDU1OV9mbWwoY3R4KSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQzMjE9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChBTlRMUjNfVFJVRSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQzMjE9MjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDMyMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAyOTsKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcnVsZXJvdXRpbmVfc2luZ2xlX3BhcmFtRXg7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNTU5X2ZtbChjdHgpKSAmJiAoTEEzMjFfMCA9PSAyNDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzMjE9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ1NTlfZm1sKGN0eCkpICYmIChMQTMyMV8wID09IDQxMikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDMyMT0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDU1OV9mbWwoY3R4KSkgJiYgKExBMzIxXzAgPT0gMzcwKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzIxPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNTU5X2ZtbChjdHgpKSAmJiAoTEEzMjFfMCA9PSAzMTYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzMjE9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ1NTlfZm1sKGN0eCkpICYmIChMQTMyMV8wID09IDI4MSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDMyMT0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDU1OV9mbWwoY3R4KSkgJiYgKExBMzIxXzAgPT0gMzE1KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzIxPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNTU5X2ZtbChjdHgpKSAmJiAoTEEzMjFfMCA9PSAzMjUpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzMjE9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ1NTlfZm1sKGN0eCkpICYmIChMQTMyMV8wID09IDMyNikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDMyMT0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDU1OV9mbWwoY3R4KSkgJiYgKExBMzIxXzAgPT0gMzczKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzIxPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNTU5X2ZtbChjdHgpKSAmJiAoTEEzMjFfMCA9PSAzMjkpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzMjE9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ1NTlfZm1sKGN0eCkpICYmIChMQTMyMV8wID09IDMxMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDMyMT0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMzIxOworICAgICAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcnVsZXJvdXRpbmVfc2luZ2xlX3BhcmFtRXg7CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDMyMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNjQ1OjY6ICggdHlwZV92YXIgSUQgKT0+dHY9IHR5cGVfdmFyIGlkPSBJRAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV190eXBlX3Zhcl9pbl9yb3V0aW5lX3NpbmdsZV9wYXJhbTExNTE3KTsKKyAgICAgICAgICAgIAkgICAgICAgIHR2PXR5cGVfdmFyKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVyb3V0aW5lX3NpbmdsZV9wYXJhbUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBwYXJhbVQgPSB0dgorICAgICAgICAgICAgCSAgICAgICAgICAgIDsgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWQgPSAocEFOVExSM19DT01NT05fVE9LRU4pIE1BVENIVChJRCwgJkZPTExPV19JRF9pbl9yb3V0aW5lX3NpbmdsZV9wYXJhbTExNTI0KTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlcm91dGluZV9zaW5nbGVfcGFyYW1FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDI6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM2NDY6NjogaWQ9IElECisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlkID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoSUQsICZGT0xMT1dfSURfaW5fcm91dGluZV9zaW5nbGVfcGFyYW0xMTUzMyk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXJvdXRpbmVfc2luZ2xlX3BhcmFtRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM2NDg6NDogKGl2PSBpbml0aWFsX3ZhbHVlICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDMyMj0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQVNTSUdOOgorICAgICAgICAgICAgICAgICAgICBjYXNlIExQQVJFTjoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQzMjI9MTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MzIyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM2NDg6NjogaXY9IGluaXRpYWxfdmFsdWUKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfaW5pdGlhbF92YWx1ZV9pbl9yb3V0aW5lX3NpbmdsZV9wYXJhbTExNTQ3KTsKKyAgICAgICAgICAgIAkgICAgICAgIGl2PWluaXRpYWxfdmFsdWUoY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXJvdXRpbmVfc2luZ2xlX3BhcmFtRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIHZhbHVlID0gaXYKKyAgICAgICAgICAgIAkgICAgICAgICAgICA7IAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgCSAgCXNlcDo6VmFyaWFibGUgKiB2YXJpYWJsZTsKKyAgICAgICAgICAgICAgICAJICAJcm91dGluZS5zYXZlUGFyYW1ldGVyKCB2YXJpYWJsZSA9IG5ldyBzZXA6OlZhcmlhYmxlKCAmcm91dGluZSwKKyAgICAgICAgICAgICAgICAJICAJCQlzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9JTlBVVF9QQVJBTUVURVJfTU9ESUZJRVIsCisgICAgICAgICAgICAgICAgCSAgCQkJcGFyYW1ULCBTVFIoKGlkLT5nZXRUZXh0KGlkKSktPmNoYXJzKSwgdmFsdWUpICk7CisgICAgICAgICAgICAgICAgCSAgCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgIE1BVENIVChSUEFSRU4sICZGT0xMT1dfUlBBUkVOX2luX3JvdXRpbmVfc2luZ2xlX3BhcmFtMTE1NjMpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVyb3V0aW5lX3NpbmdsZV9wYXJhbUV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVyb3V0aW5lX3NpbmdsZV9wYXJhbUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZXJvdXRpbmVfc2luZ2xlX3BhcmFtRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgxMzEsIHJvdXRpbmVfc2luZ2xlX3BhcmFtX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCByb3V0aW5lX3NpbmdsZV9wYXJhbSAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBkZWZfZW51bQorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzY1OToxOiBkZWZfZW51bVsgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHkgLCBzZXA6Ok1vZGlmaWVyIG1kZnIgXSA6ICdlbnVtJyBpZD0gSUQgZGVmX2VudW1faW1wbFtkZWNsUHJvcGVydHksIG1kZnIsIFNUUigkaWQudGV4dC0+Y2hhcnMpXSA7CisgKi8KK3N0YXRpYyB2b2lkCitkZWZfZW51bShwZm1sUGFyc2VyIGN0eCwgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHksIHNlcDo6TW9kaWZpZXIgbWRmcikKK3sKKyAgICBBTlRMUjNfVUlOVDMyIGRlZl9lbnVtX1N0YXJ0SW5kZXg7CisKKyAgICBwQU5UTFIzX0NPTU1PTl9UT0tFTiAgICBpZDsKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBkZWZfZW51bV9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisKKyAgICAJc2VwOjpWYXJpYWJsZSAqIHZhciA9IE5VTEw7CisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDEzMikpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIGlkICAgICAgID0gTlVMTDsKKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzY2NDoyOiAoICdlbnVtJyBpZD0gSUQgZGVmX2VudW1faW1wbFtkZWNsUHJvcGVydHksIG1kZnIsIFNUUigkaWQudGV4dC0+Y2hhcnMpXSApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM2NjQ6NDogJ2VudW0nIGlkPSBJRCBkZWZfZW51bV9pbXBsW2RlY2xQcm9wZXJ0eSwgbWRmciwgU1RSKCRpZC50ZXh0LT5jaGFycyldCisgICAgICAgIHsKKyAgICAgICAgICAgICBNQVRDSFQoMjc2LCAmRk9MTE9XXzI3Nl9pbl9kZWZfZW51bTExNTgyKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX2VudW1FeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlkID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoSUQsICZGT0xMT1dfSURfaW5fZGVmX2VudW0xMTU4Nyk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9lbnVtRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfZW51bV9pbXBsX2luX2RlZl9lbnVtMTE1OTIpOworICAgICAgICAgICAgZGVmX2VudW1faW1wbChjdHgsIGRlY2xQcm9wZXJ0eSwgbWRmciwgU1RSKChpZC0+Z2V0VGV4dChpZCkpLT5jaGFycykpOworCisgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX2VudW1FeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlZGVmX2VudW1FeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVkZWZfZW51bUV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTMyLCBkZWZfZW51bV9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgZGVmX2VudW0gKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgZGVmX2VudW1faW1wbAorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzY2ODoxOiBkZWZfZW51bV9pbXBsWyBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSAsXG5cdFx0c2VwOjpNb2RpZmllciBtZGZyICwgY29uc3Qgc3RkOjpzdHJpbmcgJiB0aWQgXSA6IExDVVJMWSBpZD0gSUQgKCBBU1NJR04gZT0gZXhwcmVzc2lvbiApPyAoIENPTU1BIGlkPSBJRCAoIEFTU0lHTiBlPSBleHByZXNzaW9uICk/ICkqIFJDVVJMWSA7CisgKi8KK3N0YXRpYyB2b2lkCitkZWZfZW51bV9pbXBsKHBmbWxQYXJzZXIgY3R4LCBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSwgc2VwOjpNb2RpZmllciBtZGZyLCBjb25zdCBzdGQ6OnN0cmluZyAmIHRpZCkKK3sKKyAgICBBTlRMUjNfVUlOVDMyIGRlZl9lbnVtX2ltcGxfU3RhcnRJbmRleDsKKworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIGlkOworICAgIHNlcDo6QkYgZTsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfZQorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfZSBzZXA6OkJGCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgZGVmX2VudW1faW1wbF9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisKKyAgICAJc2VwOjpWYXJpYWJsZSAqIHZhciA9IE5VTEw7CisgICAgCXNlcDo6RGF0YVR5cGUgKiBlbnVtVDsKKworICAgIAlzZXA6OkJGIHRkKCBlbnVtVCA9IHNlcDo6RGF0YVR5cGU6Om5ld0VudW0oZGVjbFByb3BlcnR5LCB0aWQpICk7CisgICAgCWVudW1ULT5zZXRNb2RpZmllciggbWRmciApOworICAgIAlkZWNsUHJvcGVydHkuYXBwZW5kRGF0YVR5cGUoIHRkICk7CisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDEzMykpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIGlkICAgICAgID0gTlVMTDsKKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzY3OToyOiAoIExDVVJMWSBpZD0gSUQgKCBBU1NJR04gZT0gZXhwcmVzc2lvbiApPyAoIENPTU1BIGlkPSBJRCAoIEFTU0lHTiBlPSBleHByZXNzaW9uICk/ICkqIFJDVVJMWSApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM2Nzk6NDogTENVUkxZIGlkPSBJRCAoIEFTU0lHTiBlPSBleHByZXNzaW9uICk/ICggQ09NTUEgaWQ9IElEICggQVNTSUdOIGU9IGV4cHJlc3Npb24gKT8gKSogUkNVUkxZCisgICAgICAgIHsKKyAgICAgICAgICAgICBNQVRDSFQoTENVUkxZLCAmRk9MTE9XX0xDVVJMWV9pbl9kZWZfZW51bV9pbXBsMTE2MTEpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfZW51bV9pbXBsRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZCA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTikgTUFUQ0hUKElELCAmRk9MTE9XX0lEX2luX2RlZl9lbnVtX2ltcGwxMTYyMCk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9lbnVtX2ltcGxFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIAkgICAgCWVudW1ULT5zYXZlVmFyaWFibGUoIHZhciA9IG5ldyBzZXA6OlZhcmlhYmxlKCBlbnVtVCwKKyAgICAgICAgICAgICAgICAJICAgIAkJCXNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX1VOREVGSU5FRF9NT0RJRklFUiwKKyAgICAgICAgICAgICAgICAJICAgIAkJCXNlcDo6VHlwZU1hbmFnZXI6OklOVEVHRVIsIFNUUigoaWQtPmdldFRleHQoaWQpKS0+Y2hhcnMpICkgKTsKKyAgICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM2ODY6OTogKCBBU1NJR04gZT0gZXhwcmVzc2lvbiApPworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQzMjM9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEFTU0lHTjoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQzMjM9MTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MzIzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM2ODY6MTE6IEFTU0lHTiBlPSBleHByZXNzaW9uCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoQVNTSUdOLCAmRk9MTE9XX0FTU0lHTl9pbl9kZWZfZW51bV9pbXBsMTE2MzkpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfZW51bV9pbXBsRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX2RlZl9lbnVtX2ltcGwxMTY0Myk7CisgICAgICAgICAgICAJICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9lbnVtX2ltcGxFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgdmFyLT5zZXRWYWx1ZShlCisgICAgICAgICAgICAJICAgICAgICAgICAgKTsgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNjg4OjY6ICggQ09NTUEgaWQ9IElEICggQVNTSUdOIGU9IGV4cHJlc3Npb24gKT8gKSoKKworICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MzI1PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIENPTU1BOgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQzMjU9MTsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MzI1KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM2ODg6ODogQ09NTUEgaWQ9IElEICggQVNTSUdOIGU9IGV4cHJlc3Npb24gKT8KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChDT01NQSwgJkZPTExPV19DT01NQV9pbl9kZWZfZW51bV9pbXBsMTE2NTkpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfZW51bV9pbXBsRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZCA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTikgTUFUQ0hUKElELCAmRk9MTE9XX0lEX2luX2RlZl9lbnVtX2ltcGwxMTY2Myk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9lbnVtX2ltcGxFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgCWVudW1ULT5zYXZlVmFyaWFibGUoIHZhciA9IG5ldyBzZXA6OlZhcmlhYmxlKCBlbnVtVCwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIAkJCXNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX1VOREVGSU5FRF9NT0RJRklFUiwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIAkJCXNlcDo6VHlwZU1hbmFnZXI6OklOVEVHRVIsIFNUUigoaWQtPmdldFRleHQoaWQpKS0+Y2hhcnMpICkgKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM2OTQ6OTogKCBBU1NJR04gZT0gZXhwcmVzc2lvbiApPworICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQzMjQ9MjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIEFTU0lHTjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCQlhbHQzMjQ9MTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0MzI0KQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM2OTQ6MTE6IEFTU0lHTiBlPSBleHByZXNzaW9uCisgICAgICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoQVNTSUdOLCAmRk9MTE9XX0FTU0lHTl9pbl9kZWZfZW51bV9pbXBsMTE2ODIpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfZW51bV9pbXBsRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX2RlZl9lbnVtX2ltcGwxMTY4Nik7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9lbnVtX2ltcGxFeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgdmFyLT5zZXRWYWx1ZShlCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgKTsgCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAgICAgCSAgICBnb3RvIGxvb3AzMjU7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb29wMzI1OiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICAgICAgIE1BVENIVChSQ1VSTFksICZGT0xMT1dfUkNVUkxZX2luX2RlZl9lbnVtX2ltcGwxMTcwNyk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9lbnVtX2ltcGxFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlZGVmX2VudW1faW1wbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZWRlZl9lbnVtX2ltcGxFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDEzMywgZGVmX2VudW1faW1wbF9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgZGVmX2VudW1faW1wbCAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBkZWZfc3RydWN0CisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNzAzOjE6IGRlZl9zdHJ1Y3RbIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5ICwgc2VwOjpNb2RpZmllciBtZGZyIF0gOiAoICdzdHJ1Y3QnIHwgJ2NsYXNzJyApIGlkPSBJRCBkZWZfY2xhc3Nfc3RydWN0dXJlX2ltcGxbZGVjbFByb3BlcnR5LCBtZGZyLCBTVFIoJGlkLnRleHQtPmNoYXJzKV0gOworICovCitzdGF0aWMgdm9pZAorZGVmX3N0cnVjdChwZm1sUGFyc2VyIGN0eCwgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHksIHNlcDo6TW9kaWZpZXIgbWRmcikKK3sKKyAgICBBTlRMUjNfVUlOVDMyIGRlZl9zdHJ1Y3RfU3RhcnRJbmRleDsKKworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIGlkOworCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGRlZl9zdHJ1Y3RfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTM0KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgaWQgICAgICAgPSBOVUxMOworCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNzA1OjI6ICggKCAnc3RydWN0JyB8ICdjbGFzcycgKSBpZD0gSUQgZGVmX2NsYXNzX3N0cnVjdHVyZV9pbXBsW2RlY2xQcm9wZXJ0eSwgbWRmciwgU1RSKCRpZC50ZXh0LT5jaGFycyldICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzcwNTo0OiAoICdzdHJ1Y3QnIHwgJ2NsYXNzJyApIGlkPSBJRCBkZWZfY2xhc3Nfc3RydWN0dXJlX2ltcGxbZGVjbFByb3BlcnR5LCBtZGZyLCBTVFIoJGlkLnRleHQtPmNoYXJzKV0KKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBMQSgxKSA9PSAyNTggfHwgTEEoMSkgPT0gMzg4ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDT05TVU1FKCk7CisgICAgICAgICAgICAgICAgUEVSUk9SUkVDT1ZFUlk9QU5UTFIzX0ZBTFNFOworICAgICAgICAgICAgICAgIEZBSUxFREZMQUc9QU5UTFIzX0ZBTFNFOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bmFtZSAgICAgICAgID0gKHZvaWQgKilBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfTkFNRTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPmV4cGVjdGluZ1NldCA9IE5VTEw7CisKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfc3RydWN0RXg7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWQgPSAocEFOVExSM19DT01NT05fVE9LRU4pIE1BVENIVChJRCwgJkZPTExPV19JRF9pbl9kZWZfc3RydWN0MTE3MzUpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfc3RydWN0RXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfY2xhc3Nfc3RydWN0dXJlX2ltcGxfaW5fZGVmX3N0cnVjdDExNzQwKTsKKyAgICAgICAgICAgIGRlZl9jbGFzc19zdHJ1Y3R1cmVfaW1wbChjdHgsIGRlY2xQcm9wZXJ0eSwgbWRmciwgU1RSKChpZC0+Z2V0VGV4dChpZCkpLT5jaGFycykpOworCisgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX3N0cnVjdEV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVkZWZfc3RydWN0RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlZGVmX3N0cnVjdEV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTM0LCBkZWZfc3RydWN0X1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBkZWZfc3RydWN0ICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGRlZl9jbGFzc19zdHJ1Y3R1cmVfaW1wbAorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzcwOToxOiBkZWZfY2xhc3Nfc3RydWN0dXJlX2ltcGxbIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5ICxcblx0XHRzZXA6Ok1vZGlmaWVyIG1kZnIgLCBjb25zdCBzdGQ6OnN0cmluZyAmIHRpZCBdIDogTENVUkxZICggKG09IG1vZGlmaWVyX2RlY2xhcmF0aW9uICk/ICggZGVjbF92YXJpYWJsZVsgKihzdHJ1Y3RULT5nZXRQcm9wZXJ0eVBhcnQoKSkgLCBtZGZyIF0gfCBkZWZfbWV0aG9kWyBkZWNsUHJvcGVydHkgXSApICkrIFJDVVJMWSA7CisgKi8KK3N0YXRpYyB2b2lkCitkZWZfY2xhc3Nfc3RydWN0dXJlX2ltcGwocGZtbFBhcnNlciBjdHgsIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5LCBzZXA6Ok1vZGlmaWVyIG1kZnIsIGNvbnN0IHN0ZDo6c3RyaW5nICYgdGlkKQoreworICAgIEFOVExSM19VSU5UMzIgZGVmX2NsYXNzX3N0cnVjdHVyZV9pbXBsX1N0YXJ0SW5kZXg7CisKKyAgICBzZXA6Ok1vZGlmaWVyIG07CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX20KKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX20gc2VwOjpNb2RpZmllcgorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGRlZl9jbGFzc19zdHJ1Y3R1cmVfaW1wbF9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisKKyAgICAJc2VwOjpEYXRhVHlwZSAqIHN0cnVjdFQ7CisKKyAgICAJc2VwOjpCRiB0ZCggc3RydWN0VCA9IHNlcDo6RGF0YVR5cGU6Om5ld1N0cnVjdHVyZShkZWNsUHJvcGVydHksIHRpZCkgKTsKKyAgICAJc3RydWN0VC0+c2V0TW9kaWZpZXIoIG1kZnIgKTsKKyAgICAJZGVjbFByb3BlcnR5LmFwcGVuZERhdGFUeXBlKCB0ZCApOworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgxMzUpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM3MTk6MjogKCBMQ1VSTFkgKCAobT0gbW9kaWZpZXJfZGVjbGFyYXRpb24gKT8gKCBkZWNsX3ZhcmlhYmxlWyAqKHN0cnVjdFQtPmdldFByb3BlcnR5UGFydCgpKSAsIG1kZnIgXSB8IGRlZl9tZXRob2RbIGRlY2xQcm9wZXJ0eSBdICkgKSsgUkNVUkxZICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzcxOTo0OiBMQ1VSTFkgKCAobT0gbW9kaWZpZXJfZGVjbGFyYXRpb24gKT8gKCBkZWNsX3ZhcmlhYmxlWyAqKHN0cnVjdFQtPmdldFByb3BlcnR5UGFydCgpKSAsIG1kZnIgXSB8IGRlZl9tZXRob2RbIGRlY2xQcm9wZXJ0eSBdICkgKSsgUkNVUkxZCisgICAgICAgIHsKKyAgICAgICAgICAgICBNQVRDSFQoTENVUkxZLCAmRk9MTE9XX0xDVVJMWV9pbl9kZWZfY2xhc3Nfc3RydWN0dXJlX2ltcGwxMTc1OSk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9jbGFzc19zdHJ1Y3R1cmVfaW1wbEV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzcyMDozOiAoIChtPSBtb2RpZmllcl9kZWNsYXJhdGlvbiApPyAoIGRlY2xfdmFyaWFibGVbICooc3RydWN0VC0+Z2V0UHJvcGVydHlQYXJ0KCkpICwgbWRmciBdIHwgZGVmX21ldGhvZFsgZGVjbFByb3BlcnR5IF0gKSApKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBjbnQzMjg9MDsKKworICAgICAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MzI4PTI7CisgICAgICAgICAgICAJc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAljYXNlIDI0MzoKKyAgICAgICAgICAgIAljYXNlIDI1OToKKyAgICAgICAgICAgIAljYXNlIDI2MjoKKyAgICAgICAgICAgIAljYXNlIDI4MjoKKyAgICAgICAgICAgIAljYXNlIDI4ODoKKyAgICAgICAgICAgIAljYXNlIDI5ODoKKyAgICAgICAgICAgIAljYXNlIDMwNToKKyAgICAgICAgICAgIAljYXNlIDMxODoKKyAgICAgICAgICAgIAljYXNlIDM0MToKKyAgICAgICAgICAgIAljYXNlIDM0OToKKyAgICAgICAgICAgIAljYXNlIDM1NToKKyAgICAgICAgICAgIAljYXNlIDM2MToKKyAgICAgICAgICAgIAljYXNlIDM2NDoKKyAgICAgICAgICAgIAljYXNlIDM4MDoKKyAgICAgICAgICAgIAljYXNlIDM5NToKKyAgICAgICAgICAgIAljYXNlIDQwNjoKKyAgICAgICAgICAgIAljYXNlIDQxMDoKKyAgICAgICAgICAgIAljYXNlIDQxMToKKyAgICAgICAgICAgIAljYXNlIDQxNDoKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkJYWx0MzI4PTE7CisgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAl9CisKKyAgICAgICAgICAgIAlzd2l0Y2ggKGFsdDMyOCkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgIGNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM3MjA6NTogKG09IG1vZGlmaWVyX2RlY2xhcmF0aW9uICk/ICggZGVjbF92YXJpYWJsZVsgKihzdHJ1Y3RULT5nZXRQcm9wZXJ0eVBhcnQoKSkgLCBtZGZyIF0gfCBkZWZfbWV0aG9kWyBkZWNsUHJvcGVydHkgXSApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgIG1kZnIgPSBzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9VTkRFRklORURfTU9ESUZJRVI7IAorICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzcyMjo0OiAobT0gbW9kaWZpZXJfZGVjbGFyYXRpb24gKT8KKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGludCBhbHQzMjY9MjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGNhc2UgMjgyOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgY2FzZSAyOTg6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBjYXNlIDMwNToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGNhc2UgMzQxOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgY2FzZSAzNDk6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBjYXNlIDM1NToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGNhc2UgMzYxOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgY2FzZSAzNjQ6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBjYXNlIDM4MDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGNhc2UgMzk1OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDY6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBjYXNlIDQxNDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAJCWFsdDMyNj0xOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MzI2KQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM3MjI6NjogbT0gbW9kaWZpZXJfZGVjbGFyYXRpb24KKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19tb2RpZmllcl9kZWNsYXJhdGlvbl9pbl9kZWZfY2xhc3Nfc3RydWN0dXJlX2ltcGwxMTc3NSk7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgbT1tb2RpZmllcl9kZWNsYXJhdGlvbihjdHgpOworCisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9jbGFzc19zdHJ1Y3R1cmVfaW1wbEV4OworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAgICAgIG1kZnIgPSBtCisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgIDsgCisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNzI0Ojc6ICggZGVjbF92YXJpYWJsZVsgKihzdHJ1Y3RULT5nZXRQcm9wZXJ0eVBhcnQoKSkgLCBtZGZyIF0gfCBkZWZfbWV0aG9kWyBkZWNsUHJvcGVydHkgXSApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBpbnQgYWx0MzI3PTI7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDI1OToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAyNjI6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzE4OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDQxMDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSA0MTE6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAkJYWx0MzI3PTE7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAyODg6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAkJYWx0MzI3PTI7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDMyNzsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfY2xhc3Nfc3RydWN0dXJlX2ltcGxFeDsKKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQzMjcpCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzcyNDo5OiBkZWNsX3ZhcmlhYmxlWyAqKHN0cnVjdFQtPmdldFByb3BlcnR5UGFydCgpKSAsIG1kZnIgXQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlY2xfdmFyaWFibGVfaW5fZGVmX2NsYXNzX3N0cnVjdHVyZV9pbXBsMTE3OTIpOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIGRlY2xfdmFyaWFibGUoY3R4LCAqKHN0cnVjdFQtPmdldFByb3BlcnR5UGFydCgpKSwgbWRmcik7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2NsYXNzX3N0cnVjdHVyZV9pbXBsRXg7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgICAgIAljYXNlIDI6CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNzI1Ojk6IGRlZl9tZXRob2RbIGRlY2xQcm9wZXJ0eSBdCisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX21ldGhvZF9pbl9kZWZfY2xhc3Nfc3RydWN0dXJlX2ltcGwxMTgwMyk7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgZGVmX21ldGhvZChjdHgsIGRlY2xQcm9wZXJ0eSk7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2NsYXNzX3N0cnVjdHVyZV9pbXBsRXg7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgIGRlZmF1bHQ6CisKKyAgICAgICAgICAgIAkJaWYgKCBjbnQzMjggPj0gMSApCisgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgIAkJICAgIGdvdG8gbG9vcDMyODsKKyAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgCQlpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgIAkJICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgIAkJICAgIHJldHVybiA7CisgICAgICAgICAgICAJCX0KKworICAgICAgICAgICAgCQkvKiBtaXNtYXRjaGVkU2V0RXgoKQorICAgICAgICAgICAgCQkgKi8KKyAgICAgICAgICAgIAkJQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgIAkJRVhDRVBUSU9OLT50eXBlID0gQU5UTFIzX0VBUkxZX0VYSVRfRVhDRVBUSU9OOworICAgICAgICAgICAgCQlFWENFUFRJT04tPm5hbWUgPSAodm9pZCAqKUFOVExSM19FQVJMWV9FWElUX05BTUU7CisKKworICAgICAgICAgICAgCQlnb3RvIHJ1bGVkZWZfY2xhc3Nfc3RydWN0dXJlX2ltcGxFeDsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJY250MzI4Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxvb3AzMjg6IDsJLyogSnVtcCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgTUFUQ0hUKFJDVVJMWSwgJkZPTExPV19SQ1VSTFlfaW5fZGVmX2NsYXNzX3N0cnVjdHVyZV9pbXBsMTE4MjUpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfY2xhc3Nfc3RydWN0dXJlX2ltcGxFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlZGVmX2NsYXNzX3N0cnVjdHVyZV9pbXBsRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlZGVmX2NsYXNzX3N0cnVjdHVyZV9pbXBsRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgxMzUsIGRlZl9jbGFzc19zdHJ1Y3R1cmVfaW1wbF9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgZGVmX2NsYXNzX3N0cnVjdHVyZV9pbXBsICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGRlZl9jaG9pY2UKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM3MzI6MTogZGVmX2Nob2ljZVsgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHkgLCBzZXA6Ok1vZGlmaWVyIG1kZnIgXSA6ICdjaG9pY2UnIGlkPSBJRCBkZWZfY2hvaWNlX2ltcGxbZGVjbFByb3BlcnR5LCBtZGZyLCBTVFIoJGlkLnRleHQtPmNoYXJzKV0gOworICovCitzdGF0aWMgdm9pZAorZGVmX2Nob2ljZShwZm1sUGFyc2VyIGN0eCwgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHksIHNlcDo6TW9kaWZpZXIgbWRmcikKK3sKKyAgICBBTlRMUjNfVUlOVDMyIGRlZl9jaG9pY2VfU3RhcnRJbmRleDsKKworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIGlkOworCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGRlZl9jaG9pY2VfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTM2KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgaWQgICAgICAgPSBOVUxMOworCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNzM0OjI6ICggJ2Nob2ljZScgaWQ9IElEIGRlZl9jaG9pY2VfaW1wbFtkZWNsUHJvcGVydHksIG1kZnIsIFNUUigkaWQudGV4dC0+Y2hhcnMpXSApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM3MzQ6NDogJ2Nob2ljZScgaWQ9IElEIGRlZl9jaG9pY2VfaW1wbFtkZWNsUHJvcGVydHksIG1kZnIsIFNUUigkaWQudGV4dC0+Y2hhcnMpXQorICAgICAgICB7CisgICAgICAgICAgICAgTUFUQ0hUKDI1NywgJkZPTExPV18yNTdfaW5fZGVmX2Nob2ljZTExODQwKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX2Nob2ljZUV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWQgPSAocEFOVExSM19DT01NT05fVE9LRU4pIE1BVENIVChJRCwgJkZPTExPV19JRF9pbl9kZWZfY2hvaWNlMTE4NDUpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfY2hvaWNlRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfY2hvaWNlX2ltcGxfaW5fZGVmX2Nob2ljZTExODUwKTsKKyAgICAgICAgICAgIGRlZl9jaG9pY2VfaW1wbChjdHgsIGRlY2xQcm9wZXJ0eSwgbWRmciwgU1RSKChpZC0+Z2V0VGV4dChpZCkpLT5jaGFycykpOworCisgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX2Nob2ljZUV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVkZWZfY2hvaWNlRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlZGVmX2Nob2ljZUV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTM2LCBkZWZfY2hvaWNlX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBkZWZfY2hvaWNlICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGRlZl9jaG9pY2VfaW1wbAorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzczODoxOiBkZWZfY2hvaWNlX2ltcGxbIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5ICxcblx0XHRzZXA6Ok1vZGlmaWVyIG1kZnIgLCBjb25zdCBzdGQ6OnN0cmluZyAmIHRpZCBdIDogTENVUkxZICggKG09IG1vZGlmaWVyX2RlY2xhcmF0aW9uICk/ICggZGVjbF92YXJpYWJsZVsgKihjaG9pY2VULT5nZXRQcm9wZXJ0eVBhcnQoKSkgLCBtZGZyIF0gfCBkZWZfbWV0aG9kWyBkZWNsUHJvcGVydHkgXSApICkrIFJDVVJMWSA7CisgKi8KK3N0YXRpYyB2b2lkCitkZWZfY2hvaWNlX2ltcGwocGZtbFBhcnNlciBjdHgsIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5LCBzZXA6Ok1vZGlmaWVyIG1kZnIsIGNvbnN0IHN0ZDo6c3RyaW5nICYgdGlkKQoreworICAgIEFOVExSM19VSU5UMzIgZGVmX2Nob2ljZV9pbXBsX1N0YXJ0SW5kZXg7CisKKyAgICBzZXA6Ok1vZGlmaWVyIG07CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX20KKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX20gc2VwOjpNb2RpZmllcgorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGRlZl9jaG9pY2VfaW1wbF9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisKKyAgICAJc2VwOjpEYXRhVHlwZSAqIGNob2ljZVQ7CisKKyAgICAJc2VwOjpCRiB0ZCggY2hvaWNlVCA9IHNlcDo6RGF0YVR5cGU6Om5ld0Nob2ljZShkZWNsUHJvcGVydHksIHRpZCkgKTsKKyAgICAJY2hvaWNlVC0+c2V0TW9kaWZpZXIoIG1kZnIgKTsKKyAgICAJZGVjbFByb3BlcnR5LmFwcGVuZERhdGFUeXBlKCB0ZCApOworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgxMzcpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM3NDg6MjogKCBMQ1VSTFkgKCAobT0gbW9kaWZpZXJfZGVjbGFyYXRpb24gKT8gKCBkZWNsX3ZhcmlhYmxlWyAqKGNob2ljZVQtPmdldFByb3BlcnR5UGFydCgpKSAsIG1kZnIgXSB8IGRlZl9tZXRob2RbIGRlY2xQcm9wZXJ0eSBdICkgKSsgUkNVUkxZICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mzc0ODo0OiBMQ1VSTFkgKCAobT0gbW9kaWZpZXJfZGVjbGFyYXRpb24gKT8gKCBkZWNsX3ZhcmlhYmxlWyAqKGNob2ljZVQtPmdldFByb3BlcnR5UGFydCgpKSAsIG1kZnIgXSB8IGRlZl9tZXRob2RbIGRlY2xQcm9wZXJ0eSBdICkgKSsgUkNVUkxZCisgICAgICAgIHsKKyAgICAgICAgICAgICBNQVRDSFQoTENVUkxZLCAmRk9MTE9XX0xDVVJMWV9pbl9kZWZfY2hvaWNlX2ltcGwxMTg2OSk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9jaG9pY2VfaW1wbEV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mzc0OTozOiAoIChtPSBtb2RpZmllcl9kZWNsYXJhdGlvbiApPyAoIGRlY2xfdmFyaWFibGVbICooY2hvaWNlVC0+Z2V0UHJvcGVydHlQYXJ0KCkpICwgbWRmciBdIHwgZGVmX21ldGhvZFsgZGVjbFByb3BlcnR5IF0gKSApKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBjbnQzMzE9MDsKKworICAgICAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MzMxPTI7CisgICAgICAgICAgICAJc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAljYXNlIDI0MzoKKyAgICAgICAgICAgIAljYXNlIDI1OToKKyAgICAgICAgICAgIAljYXNlIDI2MjoKKyAgICAgICAgICAgIAljYXNlIDI4MjoKKyAgICAgICAgICAgIAljYXNlIDI4ODoKKyAgICAgICAgICAgIAljYXNlIDI5ODoKKyAgICAgICAgICAgIAljYXNlIDMwNToKKyAgICAgICAgICAgIAljYXNlIDMxODoKKyAgICAgICAgICAgIAljYXNlIDM0MToKKyAgICAgICAgICAgIAljYXNlIDM0OToKKyAgICAgICAgICAgIAljYXNlIDM1NToKKyAgICAgICAgICAgIAljYXNlIDM2MToKKyAgICAgICAgICAgIAljYXNlIDM2NDoKKyAgICAgICAgICAgIAljYXNlIDM4MDoKKyAgICAgICAgICAgIAljYXNlIDM5NToKKyAgICAgICAgICAgIAljYXNlIDQwNjoKKyAgICAgICAgICAgIAljYXNlIDQxMDoKKyAgICAgICAgICAgIAljYXNlIDQxMToKKyAgICAgICAgICAgIAljYXNlIDQxNDoKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkJYWx0MzMxPTE7CisgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAl9CisKKyAgICAgICAgICAgIAlzd2l0Y2ggKGFsdDMzMSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgIGNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM3NDk6NTogKG09IG1vZGlmaWVyX2RlY2xhcmF0aW9uICk/ICggZGVjbF92YXJpYWJsZVsgKihjaG9pY2VULT5nZXRQcm9wZXJ0eVBhcnQoKSkgLCBtZGZyIF0gfCBkZWZfbWV0aG9kWyBkZWNsUHJvcGVydHkgXSApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgIG1kZnIgPSBzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9VTkRFRklORURfTU9ESUZJRVI7IAorICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mzc1MTo0OiAobT0gbW9kaWZpZXJfZGVjbGFyYXRpb24gKT8KKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGludCBhbHQzMjk9MjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGNhc2UgMjgyOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgY2FzZSAyOTg6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBjYXNlIDMwNToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGNhc2UgMzQxOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgY2FzZSAzNDk6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBjYXNlIDM1NToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGNhc2UgMzYxOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgY2FzZSAzNjQ6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBjYXNlIDM4MDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGNhc2UgMzk1OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDY6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBjYXNlIDQxNDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAJCWFsdDMyOT0xOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MzI5KQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM3NTE6NjogbT0gbW9kaWZpZXJfZGVjbGFyYXRpb24KKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19tb2RpZmllcl9kZWNsYXJhdGlvbl9pbl9kZWZfY2hvaWNlX2ltcGwxMTg4NSk7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgbT1tb2RpZmllcl9kZWNsYXJhdGlvbihjdHgpOworCisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9jaG9pY2VfaW1wbEV4OworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAgICAgIG1kZnIgPSBtCisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgIDsgCisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNzUzOjc6ICggZGVjbF92YXJpYWJsZVsgKihjaG9pY2VULT5nZXRQcm9wZXJ0eVBhcnQoKSkgLCBtZGZyIF0gfCBkZWZfbWV0aG9kWyBkZWNsUHJvcGVydHkgXSApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBpbnQgYWx0MzMwPTI7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDI1OToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAyNjI6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzE4OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDQxMDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSA0MTE6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAkJYWx0MzMwPTE7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAyODg6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAkJYWx0MzMwPTI7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDMzMDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfY2hvaWNlX2ltcGxFeDsKKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQzMzApCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mzc1Mzo5OiBkZWNsX3ZhcmlhYmxlWyAqKGNob2ljZVQtPmdldFByb3BlcnR5UGFydCgpKSAsIG1kZnIgXQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlY2xfdmFyaWFibGVfaW5fZGVmX2Nob2ljZV9pbXBsMTE5MDIpOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIGRlY2xfdmFyaWFibGUoY3R4LCAqKGNob2ljZVQtPmdldFByb3BlcnR5UGFydCgpKSwgbWRmcik7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2Nob2ljZV9pbXBsRXg7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgICAgIAljYXNlIDI6CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNzU0Ojk6IGRlZl9tZXRob2RbIGRlY2xQcm9wZXJ0eSBdCisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX21ldGhvZF9pbl9kZWZfY2hvaWNlX2ltcGwxMTkxMyk7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgZGVmX21ldGhvZChjdHgsIGRlY2xQcm9wZXJ0eSk7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX2Nob2ljZV9pbXBsRXg7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgIGRlZmF1bHQ6CisKKyAgICAgICAgICAgIAkJaWYgKCBjbnQzMzEgPj0gMSApCisgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgIAkJICAgIGdvdG8gbG9vcDMzMTsKKyAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgCQlpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgIAkJICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgIAkJICAgIHJldHVybiA7CisgICAgICAgICAgICAJCX0KKworICAgICAgICAgICAgCQkvKiBtaXNtYXRjaGVkU2V0RXgoKQorICAgICAgICAgICAgCQkgKi8KKyAgICAgICAgICAgIAkJQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgIAkJRVhDRVBUSU9OLT50eXBlID0gQU5UTFIzX0VBUkxZX0VYSVRfRVhDRVBUSU9OOworICAgICAgICAgICAgCQlFWENFUFRJT04tPm5hbWUgPSAodm9pZCAqKUFOVExSM19FQVJMWV9FWElUX05BTUU7CisKKworICAgICAgICAgICAgCQlnb3RvIHJ1bGVkZWZfY2hvaWNlX2ltcGxFeDsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJY250MzMxKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxvb3AzMzE6IDsJLyogSnVtcCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgTUFUQ0hUKFJDVVJMWSwgJkZPTExPV19SQ1VSTFlfaW5fZGVmX2Nob2ljZV9pbXBsMTE5MzUpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfY2hvaWNlX2ltcGxFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlZGVmX2Nob2ljZV9pbXBsRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlZGVmX2Nob2ljZV9pbXBsRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgxMzcsIGRlZl9jaG9pY2VfaW1wbF9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgZGVmX2Nob2ljZV9pbXBsICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGRlZl91bmlvbgorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mzc2MToxOiBkZWZfdW5pb25bIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5ICwgc2VwOjpNb2RpZmllciBtZGZyIF0gOiAndW5pb24nIGlkPSBJRCBkZWZfdW5pb25faW1wbFtkZWNsUHJvcGVydHkgLCBtZGZyLCBTVFIoJGlkLnRleHQtPmNoYXJzKV0gOworICovCitzdGF0aWMgdm9pZAorZGVmX3VuaW9uKHBmbWxQYXJzZXIgY3R4LCBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSwgc2VwOjpNb2RpZmllciBtZGZyKQoreworICAgIEFOVExSM19VSU5UMzIgZGVmX3VuaW9uX1N0YXJ0SW5kZXg7CisKKyAgICBwQU5UTFIzX0NPTU1PTl9UT0tFTiAgICBpZDsKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBkZWZfdW5pb25fU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTM4KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgaWQgICAgICAgPSBOVUxMOworCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNzYzOjI6ICggJ3VuaW9uJyBpZD0gSUQgZGVmX3VuaW9uX2ltcGxbZGVjbFByb3BlcnR5ICwgbWRmciwgU1RSKCRpZC50ZXh0LT5jaGFycyldICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mzc2Mzo0OiAndW5pb24nIGlkPSBJRCBkZWZfdW5pb25faW1wbFtkZWNsUHJvcGVydHkgLCBtZGZyLCBTVFIoJGlkLnRleHQtPmNoYXJzKV0KKyAgICAgICAgeworICAgICAgICAgICAgIE1BVENIVCg0MDQsICZGT0xMT1dfNDA0X2luX2RlZl91bmlvbjExOTUwKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX3VuaW9uRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZCA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTikgTUFUQ0hUKElELCAmRk9MTE9XX0lEX2luX2RlZl91bmlvbjExOTU1KTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX3VuaW9uRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfdW5pb25faW1wbF9pbl9kZWZfdW5pb24xMTk2MCk7CisgICAgICAgICAgICBkZWZfdW5pb25faW1wbChjdHgsIGRlY2xQcm9wZXJ0eSwgbWRmciwgU1RSKChpZC0+Z2V0VGV4dChpZCkpLT5jaGFycykpOworCisgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX3VuaW9uRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZWRlZl91bmlvbkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZWRlZl91bmlvbkV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTM4LCBkZWZfdW5pb25fU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGRlZl91bmlvbiAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBkZWZfdW5pb25faW1wbAorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mzc2ODoxOiBkZWZfdW5pb25faW1wbFsgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHkgLFxuXHRcdHNlcDo6TW9kaWZpZXIgbWRmciAsIGNvbnN0IHN0ZDo6c3RyaW5nICYgdGlkIF0gOiBMQ1VSTFkgKCAobT0gbW9kaWZpZXJfZGVjbGFyYXRpb24gKT8gZGVjbF92YXJpYWJsZVsgKih1bmlvblQtPmdldFByb3BlcnR5UGFydCgpKSAsIG1kZnIgXSApKyBSQ1VSTFkgOworICovCitzdGF0aWMgdm9pZAorZGVmX3VuaW9uX2ltcGwocGZtbFBhcnNlciBjdHgsIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5LCBzZXA6Ok1vZGlmaWVyIG1kZnIsIGNvbnN0IHN0ZDo6c3RyaW5nICYgdGlkKQoreworICAgIEFOVExSM19VSU5UMzIgZGVmX3VuaW9uX2ltcGxfU3RhcnRJbmRleDsKKworICAgIHNlcDo6TW9kaWZpZXIgbTsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfbQorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfbSBzZXA6Ok1vZGlmaWVyCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgZGVmX3VuaW9uX2ltcGxfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworCisgICAgCXNlcDo6RGF0YVR5cGUgKiB1bmlvblQ7CisKKyAgICAJc2VwOjpCRiB0ZCgJdW5pb25UID0gc2VwOjpEYXRhVHlwZTo6bmV3VW5pb24oZGVjbFByb3BlcnR5LCB0aWQpICk7CisgICAgCXVuaW9uVC0+c2V0TW9kaWZpZXIoIG1kZnIgKTsKKyAgICAJZGVjbFByb3BlcnR5LmFwcGVuZERhdGFUeXBlKCB0ZCApOworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgxMzkpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM3Nzg6MjogKCBMQ1VSTFkgKCAobT0gbW9kaWZpZXJfZGVjbGFyYXRpb24gKT8gZGVjbF92YXJpYWJsZVsgKih1bmlvblQtPmdldFByb3BlcnR5UGFydCgpKSAsIG1kZnIgXSApKyBSQ1VSTFkgKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNzc4OjQ6IExDVVJMWSAoIChtPSBtb2RpZmllcl9kZWNsYXJhdGlvbiApPyBkZWNsX3ZhcmlhYmxlWyAqKHVuaW9uVC0+Z2V0UHJvcGVydHlQYXJ0KCkpICwgbWRmciBdICkrIFJDVVJMWQorICAgICAgICB7CisgICAgICAgICAgICAgTUFUQ0hUKExDVVJMWSwgJkZPTExPV19MQ1VSTFlfaW5fZGVmX3VuaW9uX2ltcGwxMTk4MCk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl91bmlvbl9pbXBsRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNzc5OjM6ICggKG09IG1vZGlmaWVyX2RlY2xhcmF0aW9uICk/IGRlY2xfdmFyaWFibGVbICoodW5pb25ULT5nZXRQcm9wZXJ0eVBhcnQoKSkgLCBtZGZyIF0gKSsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgY250MzMzPTA7CisKKyAgICAgICAgICAgICAgICBmb3IgKDs7KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGFsdDMzMz0yOworICAgICAgICAgICAgCXN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJY2FzZSAyNDM6CisgICAgICAgICAgICAJY2FzZSAyNTk6CisgICAgICAgICAgICAJY2FzZSAyNjI6CisgICAgICAgICAgICAJY2FzZSAyODI6CisgICAgICAgICAgICAJY2FzZSAyOTg6CisgICAgICAgICAgICAJY2FzZSAzMDU6CisgICAgICAgICAgICAJY2FzZSAzMTg6CisgICAgICAgICAgICAJY2FzZSAzNDE6CisgICAgICAgICAgICAJY2FzZSAzNDk6CisgICAgICAgICAgICAJY2FzZSAzNTU6CisgICAgICAgICAgICAJY2FzZSAzNjE6CisgICAgICAgICAgICAJY2FzZSAzNjQ6CisgICAgICAgICAgICAJY2FzZSAzODA6CisgICAgICAgICAgICAJY2FzZSAzOTU6CisgICAgICAgICAgICAJY2FzZSA0MDY6CisgICAgICAgICAgICAJY2FzZSA0MTA6CisgICAgICAgICAgICAJY2FzZSA0MTE6CisgICAgICAgICAgICAJY2FzZSA0MTQ6CisgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgIAkJCWFsdDMzMz0xOworICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJfQorCisgICAgICAgICAgICAJc3dpdGNoIChhbHQzMzMpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICBjYXNlIDE6CisgICAgICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNzc5OjU6IChtPSBtb2RpZmllcl9kZWNsYXJhdGlvbiApPyBkZWNsX3ZhcmlhYmxlWyAqKHVuaW9uVC0+Z2V0UHJvcGVydHlQYXJ0KCkpICwgbWRmciBdCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgIG1kZnIgPSBzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9VTkRFRklORURfTU9ESUZJRVI7IAorICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mzc4MTo0OiAobT0gbW9kaWZpZXJfZGVjbGFyYXRpb24gKT8KKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGludCBhbHQzMzI9MjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGNhc2UgMjgyOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgY2FzZSAyOTg6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBjYXNlIDMwNToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGNhc2UgMzQxOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgY2FzZSAzNDk6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBjYXNlIDM1NToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGNhc2UgMzYxOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgY2FzZSAzNjQ6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBjYXNlIDM4MDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGNhc2UgMzk1OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDY6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBjYXNlIDQxNDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAJCWFsdDMzMj0xOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MzMyKQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM3ODE6NjogbT0gbW9kaWZpZXJfZGVjbGFyYXRpb24KKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19tb2RpZmllcl9kZWNsYXJhdGlvbl9pbl9kZWZfdW5pb25faW1wbDExOTk2KTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICBtPW1vZGlmaWVyX2RlY2xhcmF0aW9uKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3VuaW9uX2ltcGxFeDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgICAgICBtZGZyID0gbQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgICAgICA7IAorICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVjbF92YXJpYWJsZV9pbl9kZWZfdW5pb25faW1wbDEyMDExKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBkZWNsX3ZhcmlhYmxlKGN0eCwgKih1bmlvblQtPmdldFByb3BlcnR5UGFydCgpKSwgbWRmcik7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX3VuaW9uX2ltcGxFeDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgZGVmYXVsdDoKKworICAgICAgICAgICAgCQlpZiAoIGNudDMzMyA+PSAxICkKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkgICAgZ290byBsb29wMzMzOworICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAJCWlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgCQkgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkJfQorCisgICAgICAgICAgICAJCS8qIG1pc21hdGNoZWRTZXRFeCgpCisgICAgICAgICAgICAJCSAqLworICAgICAgICAgICAgCQlDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgCQlFWENFUFRJT04tPnR5cGUgPSBBTlRMUjNfRUFSTFlfRVhJVF9FWENFUFRJT047CisgICAgICAgICAgICAJCUVYQ0VQVElPTi0+bmFtZSA9ICh2b2lkICopQU5UTFIzX0VBUkxZX0VYSVRfTkFNRTsKKworCisgICAgICAgICAgICAJCWdvdG8gcnVsZWRlZl91bmlvbl9pbXBsRXg7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgCWNudDMzMysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsb29wMzMzOiA7CS8qIEp1bXAgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgIE1BVENIVChSQ1VSTFksICZGT0xMT1dfUkNVUkxZX2luX2RlZl91bmlvbl9pbXBsMTIwMjUpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfdW5pb25faW1wbEV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVkZWZfdW5pb25faW1wbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZWRlZl91bmlvbl9pbXBsRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgxMzksIGRlZl91bmlvbl9pbXBsX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBkZWZfdW5pb25faW1wbCAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBkZWZfbWV0aG9kCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNzg5OjE6IGRlZl9tZXRob2RbIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5IF0gOiAnZnVuJyBJRCBMUEFSRU4gKCBkZWNsX3BhcmFtZXRlcnMgKT8gUlBBUkVOICggdHlwZV92YXIgKT8gOworICovCitzdGF0aWMgdm9pZAorZGVmX21ldGhvZChwZm1sUGFyc2VyIGN0eCwgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHkpCit7CisgICAgQU5UTFIzX1VJTlQzMiBkZWZfbWV0aG9kX1N0YXJ0SW5kZXg7CisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgZGVmX21ldGhvZF9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgxNDApKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM3OTA6MjogKCAnZnVuJyBJRCBMUEFSRU4gKCBkZWNsX3BhcmFtZXRlcnMgKT8gUlBBUkVOICggdHlwZV92YXIgKT8gKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNzkwOjQ6ICdmdW4nIElEIExQQVJFTiAoIGRlY2xfcGFyYW1ldGVycyApPyBSUEFSRU4gKCB0eXBlX3ZhciApPworICAgICAgICB7CisgICAgICAgICAgICAgTUFUQ0hUKDI4OCwgJkZPTExPV18yODhfaW5fZGVmX21ldGhvZDEyMDM4KTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX21ldGhvZEV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgIE1BVENIVChJRCwgJkZPTExPV19JRF9pbl9kZWZfbWV0aG9kMTIwNDEpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfbWV0aG9kRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgTUFUQ0hUKExQQVJFTiwgJkZPTExPV19MUEFSRU5faW5fZGVmX21ldGhvZDEyMDQ0KTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX21ldGhvZEV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mzc5MDoyMzogKCBkZWNsX3BhcmFtZXRlcnMgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MzM0PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDE6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDI0NToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDY6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ5OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDI1NDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNTU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjU5OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDI2MToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNjQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjcwOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDI3MToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyODE6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjgzOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDMwOToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzMTA6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzExOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDMxNToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzMTY6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzE3OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDMyMDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzI2OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDMyOToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzMzM6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzQ0OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM0NToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzNDY6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzU3OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM1ODoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzNjA6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzcwOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM3MzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzNzQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzg3OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM5MjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzOTk6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDAwOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDQwMToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDA1OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDQwNzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDg6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDA5OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDQxMjoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQzMzQ9MTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MzM0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM3OTA6MjM6IGRlY2xfcGFyYW1ldGVycworICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWNsX3BhcmFtZXRlcnNfaW5fZGVmX21ldGhvZDEyMDQ3KTsKKyAgICAgICAgICAgIAkgICAgICAgIGRlY2xfcGFyYW1ldGVycyhjdHgpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX21ldGhvZEV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgTUFUQ0hUKFJQQVJFTiwgJkZPTExPV19SUEFSRU5faW5fZGVmX21ldGhvZDEyMDUyKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX21ldGhvZEV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mzc5MDo1MDogKCB0eXBlX3ZhciApPworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQzMzU9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDI1OToKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIGludCBMQTMzNV8xID0gTEEoMik7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIGlmICggKHN5bnByZWQ1NzRfZm1sKGN0eCkpKQorICAgICAgICAgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkJICAgICAgICBhbHQzMzU9MTsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgfQorICAgICAgICAgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIElEOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ1OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDI0NjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDk6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjU0OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDI1NToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNjE6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjY0OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDI3MDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNzE6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjgxOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDI4MzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzMDk6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzEwOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDMxMToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzMTU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzE2OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDMxNzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjA6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzI1OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDMyNjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjk6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzMzOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM0NDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzNDU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzQ2OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM1NzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzNTg6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzYwOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM3MDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzNzM6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzc0OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM4NzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzOTI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzk5OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDQwMDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDE6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDAyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDQwNToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDA4OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDQwOToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0MTI6CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJYWx0MzM1PTE7CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDMzNSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNzkwOjUyOiB0eXBlX3ZhcgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV190eXBlX3Zhcl9pbl9kZWZfbWV0aG9kMTIwNTcpOworICAgICAgICAgICAgCSAgICAgICAgdHlwZV92YXIoY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9tZXRob2RFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVkZWZfbWV0aG9kRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlZGVmX21ldGhvZEV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTQwLCBkZWZfbWV0aG9kX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBkZWZfbWV0aG9kICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGRlY2xfcGFyYW1ldGVycworICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mzc5MzoxOiBkZWNsX3BhcmFtZXRlcnMgOiB0eXBlX3ZhciBJRCAoIENPTU1BIHR5cGVfdmFyIElEICkqIDsKKyAqLworc3RhdGljIHZvaWQKK2RlY2xfcGFyYW1ldGVycyhwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBBTlRMUjNfVUlOVDMyIGRlY2xfcGFyYW1ldGVyc19TdGFydEluZGV4OworCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGRlY2xfcGFyYW1ldGVyc19TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgxNDEpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM3OTQ6MjogKCB0eXBlX3ZhciBJRCAoIENPTU1BIHR5cGVfdmFyIElEICkqICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mzc5NDo0OiB0eXBlX3ZhciBJRCAoIENPTU1BIHR5cGVfdmFyIElEICkqCisgICAgICAgIHsKKyAgICAgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3R5cGVfdmFyX2luX2RlY2xfcGFyYW1ldGVyczEyMDcxKTsKKyAgICAgICAgICAgIHR5cGVfdmFyKGN0eCk7CisKKyAgICAgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX3BhcmFtZXRlcnNFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICBNQVRDSFQoSUQsICZGT0xMT1dfSURfaW5fZGVjbF9wYXJhbWV0ZXJzMTIwNzMpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX3BhcmFtZXRlcnNFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM3OTQ6MTY6ICggQ09NTUEgdHlwZV92YXIgSUQgKSoKKworICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MzM2PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIENPTU1BOgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQzMzY9MTsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MzM2KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM3OTQ6MTg6IENPTU1BIHR5cGVfdmFyIElECisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoQ09NTUEsICZGT0xMT1dfQ09NTUFfaW5fZGVjbF9wYXJhbWV0ZXJzMTIwNzcpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX3BhcmFtZXRlcnNFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3R5cGVfdmFyX2luX2RlY2xfcGFyYW1ldGVyczEyMDc5KTsKKyAgICAgICAgICAgIAkgICAgICAgIHR5cGVfdmFyKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX3BhcmFtZXRlcnNFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoSUQsICZGT0xMT1dfSURfaW5fZGVjbF9wYXJhbWV0ZXJzMTIwODEpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX3BhcmFtZXRlcnNFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQ6CisgICAgICAgICAgICAJICAgIGdvdG8gbG9vcDMzNjsJLyogYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvb3AzMzY6IDsgLyogSnVtcCBvdXQgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKworCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZWRlY2xfcGFyYW1ldGVyc0V4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZWRlY2xfcGFyYW1ldGVyc0V4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTQxLCBkZWNsX3BhcmFtZXRlcnNfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGRlY2xfcGFyYW1ldGVycyAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBkZWZfdHlwZQorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mzc5ODoxOiBkZWZfdHlwZVsgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHkgLCBzZXA6Ok1vZGlmaWVyIG1kZnIgXSA6ICd0eXBlJyBkZWZfdHlwZV9pbXBsWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0gOworICovCitzdGF0aWMgdm9pZAorZGVmX3R5cGUocGZtbFBhcnNlciBjdHgsIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5LCBzZXA6Ok1vZGlmaWVyIG1kZnIpCit7CisgICAgQU5UTFIzX1VJTlQzMiBkZWZfdHlwZV9TdGFydEluZGV4OworCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGRlZl90eXBlX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDE0MikpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzgwMDoyOiAoICd0eXBlJyBkZWZfdHlwZV9pbXBsWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0gKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozODAwOjQ6ICd0eXBlJyBkZWZfdHlwZV9pbXBsWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0KKyAgICAgICAgeworICAgICAgICAgICAgIE1BVENIVCgzOTgsICZGT0xMT1dfMzk4X2luX2RlZl90eXBlMTIwOTkpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfdHlwZUV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX3R5cGVfaW1wbF9pbl9kZWZfdHlwZTEyMTAyKTsKKyAgICAgICAgICAgIGRlZl90eXBlX2ltcGwoY3R4LCBkZWNsUHJvcGVydHksIG1kZnIpOworCisgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX3R5cGVFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlZGVmX3R5cGVFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVkZWZfdHlwZUV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTQyLCBkZWZfdHlwZV9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgZGVmX3R5cGUgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgZGVmX3R5cGVfaW1wbAorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzgwMzoxOiBkZWZfdHlwZV9pbXBsWyBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSAsIHNlcDo6TW9kaWZpZXIgbWRmciBdIDogKCBkZWZfdHlwZV9hdG9tX2ltcGxbIGRlY2xQcm9wZXJ0eSAsIG1kZnIgXSB8IExDVVJMWSAoIGRlZl90eXBlX2F0b21faW1wbFsgZGVjbFByb3BlcnR5ICwgbWRmciBdICkrIFJDVVJMWSApOworICovCitzdGF0aWMgdm9pZAorZGVmX3R5cGVfaW1wbChwZm1sUGFyc2VyIGN0eCwgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHksIHNlcDo6TW9kaWZpZXIgbWRmcikKK3sKKyAgICBBTlRMUjNfVUlOVDMyIGRlZl90eXBlX2ltcGxfU3RhcnRJbmRleDsKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBkZWZfdHlwZV9pbXBsX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDE0MykpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM4MDU6MjogKCBkZWZfdHlwZV9hdG9tX2ltcGxbIGRlY2xQcm9wZXJ0eSAsIG1kZnIgXSB8IExDVVJMWSAoIGRlZl90eXBlX2F0b21faW1wbFsgZGVjbFByb3BlcnR5ICwgbWRmciBdICkrIFJDVVJMWSApCisKKyAgICAgICAgICAgIEFOVExSM19VSU5UMzIgYWx0MzM4OworCisgICAgICAgICAgICBhbHQzMzg9MjsKKworICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgICAgIGNhc2UgMjU3OgorICAgICAgICAgICAgY2FzZSAyNTg6CisgICAgICAgICAgICBjYXNlIDI3NjoKKyAgICAgICAgICAgIGNhc2UgMzg4OgorICAgICAgICAgICAgY2FzZSA0MDQ6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQzMzg9MTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIExDVVJMWToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDMzOD0yOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAzMzg7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfdHlwZV9pbXBsRXg7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQzMzgpCisgICAgICAgICAgICB7CisgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzgwNTo0OiBkZWZfdHlwZV9hdG9tX2ltcGxbIGRlY2xQcm9wZXJ0eSAsIG1kZnIgXQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX3R5cGVfYXRvbV9pbXBsX2luX2RlZl90eXBlX2ltcGwxMjExNyk7CisgICAgICAgIAkgICAgICAgIGRlZl90eXBlX2F0b21faW1wbChjdHgsIGRlY2xQcm9wZXJ0eSwgbWRmcik7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl90eXBlX2ltcGxFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAyOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM4MDc6NDogTENVUkxZICggZGVmX3R5cGVfYXRvbV9pbXBsWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0gKSsgUkNVUkxZCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKExDVVJMWSwgJkZPTExPV19MQ1VSTFlfaW5fZGVmX3R5cGVfaW1wbDEyMTI0KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3R5cGVfaW1wbEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzgwODo0OiAoIGRlZl90eXBlX2F0b21faW1wbFsgZGVjbFByb3BlcnR5ICwgbWRmciBdICkrCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGludCBjbnQzMzc9MDsKKworICAgICAgICAJICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBpbnQgYWx0MzM3PTI7CisgICAgICAgIAkgICAgICAgIAlzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAkgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgIAljYXNlIElEOgorICAgICAgICAJICAgICAgICAJY2FzZSAyNTc6CisgICAgICAgIAkgICAgICAgIAljYXNlIDI1ODoKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMjc2OgorICAgICAgICAJICAgICAgICAJY2FzZSAzODg6CisgICAgICAgIAkgICAgICAgIAljYXNlIDQwNDoKKyAgICAgICAgCSAgICAgICAgCQl7CisgICAgICAgIAkgICAgICAgIAkJCWFsdDMzNz0xOworICAgICAgICAJICAgICAgICAJCX0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAJfQorCisgICAgICAgIAkgICAgICAgIAlzd2l0Y2ggKGFsdDMzNykKKyAgICAgICAgCSAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgCSAgICBjYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM4MDg6NjogZGVmX3R5cGVfYXRvbV9pbXBsWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX3R5cGVfYXRvbV9pbXBsX2luX2RlZl90eXBlX2ltcGwxMjEzMSk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBkZWZfdHlwZV9hdG9tX2ltcGwoY3R4LCBkZWNsUHJvcGVydHksIG1kZnIpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX3R5cGVfaW1wbEV4OworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgIAkgICAgZGVmYXVsdDoKKworICAgICAgICAJICAgICAgICAJCWlmICggY250MzM3ID49IDEgKQorICAgICAgICAJICAgICAgICAJCXsKKyAgICAgICAgCSAgICAgICAgCQkgICAgZ290byBsb29wMzM3OworICAgICAgICAJICAgICAgICAJCX0KKyAgICAgICAgCSAgICAgICAgCQlpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgIAkgICAgICAgIAkJeworICAgICAgICAJICAgICAgICAJCSAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkgICAgICAgIAkJICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkJfQorCisgICAgICAgIAkgICAgICAgIAkJLyogbWlzbWF0Y2hlZFNldEV4KCkKKyAgICAgICAgCSAgICAgICAgCQkgKi8KKyAgICAgICAgCSAgICAgICAgCQlDT05TVFJVQ1RFWCgpOworICAgICAgICAJICAgICAgICAJCUVYQ0VQVElPTi0+dHlwZSA9IEFOVExSM19FQVJMWV9FWElUX0VYQ0VQVElPTjsKKyAgICAgICAgCSAgICAgICAgCQlFWENFUFRJT04tPm5hbWUgPSAodm9pZCAqKUFOVExSM19FQVJMWV9FWElUX05BTUU7CisKKworICAgICAgICAJICAgICAgICAJCWdvdG8gcnVsZWRlZl90eXBlX2ltcGxFeDsKKyAgICAgICAgCSAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgCWNudDMzNysrOworICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgbG9vcDMzNzogOwkvKiBKdW1wIHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgTUFUQ0hUKFJDVVJMWSwgJkZPTExPV19SQ1VSTFlfaW5fZGVmX3R5cGVfaW1wbDEyMTQwKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3R5cGVfaW1wbEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZWRlZl90eXBlX2ltcGxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVkZWZfdHlwZV9pbXBsRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgxNDMsIGRlZl90eXBlX2ltcGxfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGRlZl90eXBlX2ltcGwgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgZGVmX3R5cGVfYXRvbV9pbXBsCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozODEzOjE6IGRlZl90eXBlX2F0b21faW1wbFsgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHkgLCBzZXA6Ok1vZGlmaWVyIG1kZnIgXSA6IChpZD0gSUQgKGJ0dj0gYmFzZV90eXBlX3ZhciAoZHRhPSBkZWZfdHlwZV9hcnJheVsgdHlwZSAsIFNUUigkaWQudGV4dC0+Y2hhcnMpIF0gKT8gKCBkZWZfdHlwZWRlZl9jb25zdHJhaW50WyBhbGlhc1QgXSB8IFNFTUkgKT8gfGR0Yz0gZGVmX3R5cGVfY29udGFpbmVyWyBTVFIoJGlkLnRleHQtPmNoYXJzKSBdICggZGVmX3R5cGVkZWZfY29uc3RyYWludFsgYWxpYXNUIF0gfCBTRU1JICk/IHxkdGk9IGRlZl90eXBlX2ludGVydmFsWyBTVFIoJGlkLnRleHQtPmNoYXJzKSBdIFNFTUkgfCAnZW51bScgZGVmX2VudW1faW1wbFtkZWNsUHJvcGVydHksIG1kZnIsIFNUUigkaWQudGV4dC0+Y2hhcnMpXSB8ICd1bmlvbicgZGVmX3VuaW9uX2ltcGxbZGVjbFByb3BlcnR5LCBtZGZyLCBTVFIoJGlkLnRleHQtPmNoYXJzKV0gfCAnY2hvaWNlJyBkZWZfY2hvaWNlX2ltcGxbZGVjbFByb3BlcnR5LCBtZGZyLCBTVFIoJGlkLnRleHQtPmNoYXJzKV0gfCAoICdzdHJ1Y3QnIHwgJ2NsYXNzJyApIGRlZl9jbGFzc19zdHJ1Y3R1cmVfaW1wbFtkZWNsUHJvcGVydHksIG1kZnIsIFNUUigkaWQudGV4dC0+Y2hhcnMpXSApIHwgZGVmX2VudW1bIGRlY2xQcm9wZXJ0eSAsIG1kZnIgXSB8IGRlZl91bmlvblsgZGVjbFByb3BlcnR5ICwgbWRmciBdIHwgZGVmX2Nob2ljZVsgZGVjbFByb3BlcnR5ICwgbWRmciBdIHwgZGVmX3N0cnVjdFsgZGVjbFByb3BlcnR5ICwgbWRmciBdICk7CisgKi8KK3N0YXRpYyB2b2lkCitkZWZfdHlwZV9hdG9tX2ltcGwocGZtbFBhcnNlciBjdHgsIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5LCBzZXA6Ok1vZGlmaWVyIG1kZnIpCit7CisgICAgQU5UTFIzX1VJTlQzMiBkZWZfdHlwZV9hdG9tX2ltcGxfU3RhcnRJbmRleDsKKworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIGlkOworICAgIHNlcDo6QkYgYnR2OworICAgICN1bmRlZglSRVRVUk5fVFlQRV9idHYKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2J0diBzZXA6OkJGCisKKyAgICBzZXA6OkJGIGR0YTsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfZHRhCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9kdGEgc2VwOjpCRgorCisgICAgc2VwOjpCRiBkdGM7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2R0YworICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfZHRjIHNlcDo6QkYKKworICAgIHNlcDo6QkYgZHRpOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9kdGkKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2R0aSBzZXA6OkJGCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgZGVmX3R5cGVfYXRvbV9pbXBsX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKworICAgIAlzZXA6OkRhdGFUeXBlICogYWxpYXNUOworICAgIAlzZXA6OkJGIHR5cGU7CisgICAgCWJvb2wgaXNUeXBlZEFycmF5ID0gZmFsc2U7CisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDE0NCkpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIGlkICAgICAgID0gTlVMTDsKKworICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM4MjA6MjogKGlkPSBJRCAoYnR2PSBiYXNlX3R5cGVfdmFyIChkdGE9IGRlZl90eXBlX2FycmF5WyB0eXBlICwgU1RSKCRpZC50ZXh0LT5jaGFycykgXSApPyAoIGRlZl90eXBlZGVmX2NvbnN0cmFpbnRbIGFsaWFzVCBdIHwgU0VNSSApPyB8ZHRjPSBkZWZfdHlwZV9jb250YWluZXJbIFNUUigkaWQudGV4dC0+Y2hhcnMpIF0gKCBkZWZfdHlwZWRlZl9jb25zdHJhaW50WyBhbGlhc1QgXSB8IFNFTUkgKT8gfGR0aT0gZGVmX3R5cGVfaW50ZXJ2YWxbIFNUUigkaWQudGV4dC0+Y2hhcnMpIF0gU0VNSSB8ICdlbnVtJyBkZWZfZW51bV9pbXBsW2RlY2xQcm9wZXJ0eSwgbWRmciwgU1RSKCRpZC50ZXh0LT5jaGFycyldIHwgJ3VuaW9uJyBkZWZfdW5pb25faW1wbFtkZWNsUHJvcGVydHksIG1kZnIsIFNUUigkaWQudGV4dC0+Y2hhcnMpXSB8ICdjaG9pY2UnIGRlZl9jaG9pY2VfaW1wbFtkZWNsUHJvcGVydHksIG1kZnIsIFNUUigkaWQudGV4dC0+Y2hhcnMpXSB8ICggJ3N0cnVjdCcgfCAnY2xhc3MnICkgZGVmX2NsYXNzX3N0cnVjdHVyZV9pbXBsW2RlY2xQcm9wZXJ0eSwgbWRmciwgU1RSKCRpZC50ZXh0LT5jaGFycyldICkgfCBkZWZfZW51bVsgZGVjbFByb3BlcnR5ICwgbWRmciBdIHwgZGVmX3VuaW9uWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0gfCBkZWZfY2hvaWNlWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0gfCBkZWZfc3RydWN0WyBkZWNsUHJvcGVydHkgLCBtZGZyIF0gKQorCisgICAgICAgICAgICBBTlRMUjNfVUlOVDMyIGFsdDM0MzsKKworICAgICAgICAgICAgYWx0MzQzPTU7CisKKyAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgSUQ6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQzNDM9MTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI3NjoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDM0Mz0yOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDA0OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MzQzPTM7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNTc6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQzNDM9NDsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI1ODoKKyAgICAgICAgICAgIGNhc2UgMzg4OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MzQzPTU7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDM0MzsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl90eXBlX2F0b21faW1wbEV4OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MzQzKQorICAgICAgICAgICAgeworICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM4MjA6NDogaWQ9IElEIChidHY9IGJhc2VfdHlwZV92YXIgKGR0YT0gZGVmX3R5cGVfYXJyYXlbIHR5cGUgLCBTVFIoJGlkLnRleHQtPmNoYXJzKSBdICk/ICggZGVmX3R5cGVkZWZfY29uc3RyYWludFsgYWxpYXNUIF0gfCBTRU1JICk/IHxkdGM9IGRlZl90eXBlX2NvbnRhaW5lclsgU1RSKCRpZC50ZXh0LT5jaGFycykgXSAoIGRlZl90eXBlZGVmX2NvbnN0cmFpbnRbIGFsaWFzVCBdIHwgU0VNSSApPyB8ZHRpPSBkZWZfdHlwZV9pbnRlcnZhbFsgU1RSKCRpZC50ZXh0LT5jaGFycykgXSBTRU1JIHwgJ2VudW0nIGRlZl9lbnVtX2ltcGxbZGVjbFByb3BlcnR5LCBtZGZyLCBTVFIoJGlkLnRleHQtPmNoYXJzKV0gfCAndW5pb24nIGRlZl91bmlvbl9pbXBsW2RlY2xQcm9wZXJ0eSwgbWRmciwgU1RSKCRpZC50ZXh0LT5jaGFycyldIHwgJ2Nob2ljZScgZGVmX2Nob2ljZV9pbXBsW2RlY2xQcm9wZXJ0eSwgbWRmciwgU1RSKCRpZC50ZXh0LT5jaGFycyldIHwgKCAnc3RydWN0JyB8ICdjbGFzcycgKSBkZWZfY2xhc3Nfc3RydWN0dXJlX2ltcGxbZGVjbFByb3BlcnR5LCBtZGZyLCBTVFIoJGlkLnRleHQtPmNoYXJzKV0gKQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgaWQgPSAocEFOVExSM19DT01NT05fVE9LRU4pIE1BVENIVChJRCwgJkZPTExPV19JRF9pbl9kZWZfdHlwZV9hdG9tX2ltcGwxMjE2MSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl90eXBlX2F0b21faW1wbEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzgyMTo0OiAoYnR2PSBiYXNlX3R5cGVfdmFyIChkdGE9IGRlZl90eXBlX2FycmF5WyB0eXBlICwgU1RSKCRpZC50ZXh0LT5jaGFycykgXSApPyAoIGRlZl90eXBlZGVmX2NvbnN0cmFpbnRbIGFsaWFzVCBdIHwgU0VNSSApPyB8ZHRjPSBkZWZfdHlwZV9jb250YWluZXJbIFNUUigkaWQudGV4dC0+Y2hhcnMpIF0gKCBkZWZfdHlwZWRlZl9jb25zdHJhaW50WyBhbGlhc1QgXSB8IFNFTUkgKT8gfGR0aT0gZGVmX3R5cGVfaW50ZXJ2YWxbIFNUUigkaWQudGV4dC0+Y2hhcnMpIF0gU0VNSSB8ICdlbnVtJyBkZWZfZW51bV9pbXBsW2RlY2xQcm9wZXJ0eSwgbWRmciwgU1RSKCRpZC50ZXh0LT5jaGFycyldIHwgJ3VuaW9uJyBkZWZfdW5pb25faW1wbFtkZWNsUHJvcGVydHksIG1kZnIsIFNUUigkaWQudGV4dC0+Y2hhcnMpXSB8ICdjaG9pY2UnIGRlZl9jaG9pY2VfaW1wbFtkZWNsUHJvcGVydHksIG1kZnIsIFNUUigkaWQudGV4dC0+Y2hhcnMpXSB8ICggJ3N0cnVjdCcgfCAnY2xhc3MnICkgZGVmX2NsYXNzX3N0cnVjdHVyZV9pbXBsW2RlY2xQcm9wZXJ0eSwgbWRmciwgU1RSKCRpZC50ZXh0LT5jaGFycyldICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDM0Mj03OworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjQyOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAyNDU6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI0NjoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjQ5OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAyNTQ6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI1NToKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjU5OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAyNjE6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI2NDoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjcwOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAyNzE6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI4MzoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzA5OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzMTA6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMxNzoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzIwOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzMzM6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM0NDoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzQ1OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzNDY6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM1NzoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzU4OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzNjA6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM3NDoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzg3OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzOTI6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM5OToKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgNDAwOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSA0MDE6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDQwMjoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgNDA1OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSA0MDc6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDQwODoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgNDA5OgorICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgIAkJYWx0MzQyPTE7CisgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgY2FzZSAyNDE6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI4MToKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzE1OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzMTY6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMyNToKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzI2OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzMjk6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM3MDoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzczOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSA0MTI6CisgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgCQlhbHQzNDI9MjsKKyAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMxMToKKyAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAJCWFsdDM0Mj0zOworICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjc2OgorICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgIAkJYWx0MzQyPTQ7CisgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgY2FzZSA0MDQ6CisgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgCQlhbHQzNDI9NTsKKyAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI1NzoKKyAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAJCWFsdDM0Mj02OworICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjU4OgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzODg6CisgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgCQlhbHQzNDI9NzsKKyAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIAkgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMzQyOworICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX3R5cGVfYXRvbV9pbXBsRXg7CisKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQzNDIpCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzgyMTo2OiBidHY9IGJhc2VfdHlwZV92YXIgKGR0YT0gZGVmX3R5cGVfYXJyYXlbIHR5cGUgLCBTVFIoJGlkLnRleHQtPmNoYXJzKSBdICk/ICggZGVmX3R5cGVkZWZfY29uc3RyYWludFsgYWxpYXNUIF0gfCBTRU1JICk/CisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19iYXNlX3R5cGVfdmFyX2luX2RlZl90eXBlX2F0b21faW1wbDEyMTcwKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgYnR2PWJhc2VfdHlwZV92YXIoY3R4KTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3R5cGVfYXRvbV9pbXBsRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICB0eXBlID0gYnR2CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICA7IAorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozODIyOjY6IChkdGE9IGRlZl90eXBlX2FycmF5WyB0eXBlICwgU1RSKCRpZC50ZXh0LT5jaGFycykgXSApPworICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0MzM5PTI7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBMQlJBQ0tFVDoKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIAkJYWx0MzM5PTE7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0MzM5KQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM4MjI6ODogZHRhPSBkZWZfdHlwZV9hcnJheVsgdHlwZSAsIFNUUigkaWQudGV4dC0+Y2hhcnMpIF0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlZl90eXBlX2FycmF5X2luX2RlZl90eXBlX2F0b21faW1wbDEyMTg1KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgZHRhPWRlZl90eXBlX2FycmF5KGN0eCwgdHlwZSwgU1RSKChpZC0+Z2V0VGV4dChpZCkpLT5jaGFycykpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfdHlwZV9hdG9tX2ltcGxFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIHR5cGUgPSBkdGEKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIDsgaXNUeXBlZEFycmF5ID0gdHJ1ZTsgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAJaWYoIGlzVHlwZWRBcnJheSApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgIAl7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgIAkJYWxpYXNUID0gdHlwZS50b19wdHI8IHNlcDo6RGF0YVR5cGUgPigpOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgCQkJYWxpYXNULT5zZXRNb2RpZmllciggbWRmciApOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAJCWRlY2xQcm9wZXJ0eS5hcHBlbmREYXRhVHlwZSggdHlwZSApOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAJfQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAJZWxzZQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAJeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCQkJCXNlcDo6QkYgdGQoIGFsaWFzVCA9IHNlcDo6RGF0YVR5cGU6Om5ld0FsaWFzKAorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCQkJCQlkZWNsUHJvcGVydHksIFNUUigoaWQtPmdldFRleHQoaWQpKS0+Y2hhcnMpLCB0eXBlKSApOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCQkJCWFsaWFzVC0+c2V0TW9kaWZpZXIoIG1kZnIgICk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJCQkJZGVjbFByb3BlcnR5LmFwcGVuZERhdGFUeXBlKCB0ZCApOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAJfQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mzg0MDo5OiAoIGRlZl90eXBlZGVmX2NvbnN0cmFpbnRbIGFsaWFzVCBdIHwgU0VNSSApPworICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0MzQwPTM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBMQ1VSTFk6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAJCWFsdDM0MD0xOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgU0VNSToKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIAkJYWx0MzQwPTI7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0MzQwKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM4NDA6MTE6IGRlZl90eXBlZGVmX2NvbnN0cmFpbnRbIGFsaWFzVCBdCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfdHlwZWRlZl9jb25zdHJhaW50X2luX2RlZl90eXBlX2F0b21faW1wbDEyMjIyKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgZGVmX3R5cGVkZWZfY29uc3RyYWludChjdHgsIGFsaWFzVCk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl90eXBlX2F0b21faW1wbEV4OworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAljYXNlIDI6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mzg0MDo0NjogU0VNSQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChTRU1JLCAmRk9MTE9XX1NFTUlfaW5fZGVmX3R5cGVfYXRvbV9pbXBsMTIyMjcpOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfdHlwZV9hdG9tX2ltcGxFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozODQyOjY6IGR0Yz0gZGVmX3R5cGVfY29udGFpbmVyWyBTVFIoJGlkLnRleHQtPmNoYXJzKSBdICggZGVmX3R5cGVkZWZfY29uc3RyYWludFsgYWxpYXNUIF0gfCBTRU1JICk/CisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfdHlwZV9jb250YWluZXJfaW5fZGVmX3R5cGVfYXRvbV9pbXBsMTIyNDApOworICAgICAgICAJICAgICAgICAJICAgICAgICBkdGM9ZGVmX3R5cGVfY29udGFpbmVyKGN0eCwgU1RSKChpZC0+Z2V0VGV4dChpZCkpLT5jaGFycykpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfdHlwZV9hdG9tX2ltcGxFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgIGFsaWFzVCA9IGR0YworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgLnRvX3B0cjwgc2VwOjpEYXRhVHlwZSA+KCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAJYWxpYXNULT5zZXRNb2RpZmllciggbWRmciApOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgCWRlY2xQcm9wZXJ0eS5hcHBlbmREYXRhVHlwZSggZHRjCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgIAorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozODQ4OjQ6ICggZGVmX3R5cGVkZWZfY29uc3RyYWludFsgYWxpYXNUIF0gfCBTRU1JICk/CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQzNDE9MzsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIExDVVJMWToKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIAkJYWx0MzQxPTE7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBTRU1JOgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgCQlhbHQzNDE9MjsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQzNDEpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mzg0ODo2OiBkZWZfdHlwZWRlZl9jb25zdHJhaW50WyBhbGlhc1QgXQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX3R5cGVkZWZfY29uc3RyYWludF9pbl9kZWZfdHlwZV9hdG9tX2ltcGwxMjI1Myk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGRlZl90eXBlZGVmX2NvbnN0cmFpbnQoY3R4LCBhbGlhc1QpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfdHlwZV9hdG9tX2ltcGxFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAJICAgICAgICAJY2FzZSAyOgorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM4NDg6NDE6IFNFTUkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoU0VNSSwgJkZPTExPV19TRU1JX2luX2RlZl90eXBlX2F0b21faW1wbDEyMjU4KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3R5cGVfYXRvbV9pbXBsRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAljYXNlIDM6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mzg1MDo2OiBkdGk9IGRlZl90eXBlX2ludGVydmFsWyBTVFIoJGlkLnRleHQtPmNoYXJzKSBdIFNFTUkKKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlZl90eXBlX2ludGVydmFsX2luX2RlZl90eXBlX2F0b21faW1wbDEyMjcxKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgZHRpPWRlZl90eXBlX2ludGVydmFsKGN0eCwgU1RSKChpZC0+Z2V0VGV4dChpZCkpLT5jaGFycykpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfdHlwZV9hdG9tX2ltcGxFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoU0VNSSwgJkZPTExPV19TRU1JX2luX2RlZl90eXBlX2F0b21faW1wbDEyMjc0KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3R5cGVfYXRvbV9pbXBsRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICBhbGlhc1QgPSBkdGkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIC50b19wdHI8IHNlcDo6RGF0YVR5cGUgPigpOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgCWFsaWFzVC0+c2V0TW9kaWZpZXIoIG1kZnIgKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgIAlkZWNsUHJvcGVydHkuYXBwZW5kRGF0YVR5cGUoIGR0aQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAljYXNlIDQ6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mzg1Nzo2OiAnZW51bScgZGVmX2VudW1faW1wbFtkZWNsUHJvcGVydHksIG1kZnIsIFNUUigkaWQudGV4dC0+Y2hhcnMpXQorICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVCgyNzYsICZGT0xMT1dfMjc2X2luX2RlZl90eXBlX2F0b21faW1wbDEyMjg3KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3R5cGVfYXRvbV9pbXBsRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfZW51bV9pbXBsX2luX2RlZl90eXBlX2F0b21faW1wbDEyMjk0KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgZGVmX2VudW1faW1wbChjdHgsIGRlY2xQcm9wZXJ0eSwgbWRmciwgU1RSKChpZC0+Z2V0VGV4dChpZCkpLT5jaGFycykpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfdHlwZV9hdG9tX2ltcGxFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAJY2FzZSA1OgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM4NjA6NjogJ3VuaW9uJyBkZWZfdW5pb25faW1wbFtkZWNsUHJvcGVydHksIG1kZnIsIFNUUigkaWQudGV4dC0+Y2hhcnMpXQorICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVCg0MDQsICZGT0xMT1dfNDA0X2luX2RlZl90eXBlX2F0b21faW1wbDEyMzAzKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3R5cGVfYXRvbV9pbXBsRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfdW5pb25faW1wbF9pbl9kZWZfdHlwZV9hdG9tX2ltcGwxMjMxMCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGRlZl91bmlvbl9pbXBsKGN0eCwgZGVjbFByb3BlcnR5LCBtZGZyLCBTVFIoKGlkLT5nZXRUZXh0KGlkKSktPmNoYXJzKSk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl90eXBlX2F0b21faW1wbEV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAljYXNlIDY6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mzg2Mzo2OiAnY2hvaWNlJyBkZWZfY2hvaWNlX2ltcGxbZGVjbFByb3BlcnR5LCBtZGZyLCBTVFIoJGlkLnRleHQtPmNoYXJzKV0KKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoMjU3LCAmRk9MTE9XXzI1N19pbl9kZWZfdHlwZV9hdG9tX2ltcGwxMjMxOSk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl90eXBlX2F0b21faW1wbEV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX2Nob2ljZV9pbXBsX2luX2RlZl90eXBlX2F0b21faW1wbDEyMzI2KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgZGVmX2Nob2ljZV9pbXBsKGN0eCwgZGVjbFByb3BlcnR5LCBtZGZyLCBTVFIoKGlkLT5nZXRUZXh0KGlkKSktPmNoYXJzKSk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl90eXBlX2F0b21faW1wbEV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAljYXNlIDc6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mzg2Njo2OiAoICdzdHJ1Y3QnIHwgJ2NsYXNzJyApIGRlZl9jbGFzc19zdHJ1Y3R1cmVfaW1wbFtkZWNsUHJvcGVydHksIG1kZnIsIFNUUigkaWQudGV4dC0+Y2hhcnMpXQorICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBMQSgxKSA9PSAyNTggfHwgTEEoMSkgPT0gMzg4ICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgQ09OU1VNRSgpOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgUEVSUk9SUkVDT1ZFUlk9QU5UTFIzX0ZBTFNFOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgRkFJTEVERkxBRz1BTlRMUjNfRkFMU0U7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBlbHNlCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX01JU01BVENIRURfU0VUX0VYQ0VQVElPTjsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+bmFtZSAgICAgICAgID0gKHZvaWQgKilBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfTkFNRTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+ZXhwZWN0aW5nU2V0ID0gTlVMTDsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3R5cGVfYXRvbV9pbXBsRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlZl9jbGFzc19zdHJ1Y3R1cmVfaW1wbF9pbl9kZWZfdHlwZV9hdG9tX2ltcGwxMjM1MCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGRlZl9jbGFzc19zdHJ1Y3R1cmVfaW1wbChjdHgsIGRlY2xQcm9wZXJ0eSwgbWRmciwgU1RSKChpZC0+Z2V0VGV4dChpZCkpLT5jaGFycykpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfdHlwZV9hdG9tX2ltcGxFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozODcwOjQ6IGRlZl9lbnVtWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlZl9lbnVtX2luX2RlZl90eXBlX2F0b21faW1wbDEyMzYyKTsKKyAgICAgICAgCSAgICAgICAgZGVmX2VudW0oY3R4LCBkZWNsUHJvcGVydHksIG1kZnIpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfdHlwZV9hdG9tX2ltcGxFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAzOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM4NzE6NDogZGVmX3VuaW9uWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlZl91bmlvbl9pbl9kZWZfdHlwZV9hdG9tX2ltcGwxMjM3MCk7CisgICAgICAgIAkgICAgICAgIGRlZl91bmlvbihjdHgsIGRlY2xQcm9wZXJ0eSwgbWRmcik7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl90eXBlX2F0b21faW1wbEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDQ6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mzg3Mjo0OiBkZWZfY2hvaWNlWyBkZWNsUHJvcGVydHkgLCBtZGZyIF0KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlZl9jaG9pY2VfaW5fZGVmX3R5cGVfYXRvbV9pbXBsMTIzNzcpOworICAgICAgICAJICAgICAgICBkZWZfY2hvaWNlKGN0eCwgZGVjbFByb3BlcnR5LCBtZGZyKTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3R5cGVfYXRvbV9pbXBsRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgNToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozODczOjQ6IGRlZl9zdHJ1Y3RbIGRlY2xQcm9wZXJ0eSAsIG1kZnIgXQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX3N0cnVjdF9pbl9kZWZfdHlwZV9hdG9tX2ltcGwxMjM4Myk7CisgICAgICAgIAkgICAgICAgIGRlZl9zdHJ1Y3QoY3R4LCBkZWNsUHJvcGVydHksIG1kZnIpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfdHlwZV9hdG9tX2ltcGxFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVkZWZfdHlwZV9hdG9tX2ltcGxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVkZWZfdHlwZV9hdG9tX2ltcGxFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDE0NCwgZGVmX3R5cGVfYXRvbV9pbXBsX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBkZWZfdHlwZV9hdG9tX2ltcGwgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgZGVmX3R5cGVkZWZfY29uc3RyYWludAorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mzg3NzoxOiBkZWZfdHlwZWRlZl9jb25zdHJhaW50WyBzZXA6OkRhdGFUeXBlICogYWxpYXNUIF0gOiBMQ1VSTFkgJ0Bjb25zdHJhaW50JyAoIHJvdXRpbmVfc2luZ2xlX3BhcmFtWypvbkNvbnN0cmFpbnRSb3V0aW5lLCBhbGlhc1QtPmdldFR5cGVTcGVjaWZpZXIoKV0gKT8gKGJzPSBibG9ja19zdGF0ZW1lbnQgfCAnfD0+JyBjZT0gY29uZGl0aW9uYWxFeHByZXNzaW9uIFNFTUkgKSBSQ1VSTFkgOworICovCitzdGF0aWMgdm9pZAorZGVmX3R5cGVkZWZfY29uc3RyYWludChwZm1sUGFyc2VyIGN0eCwgc2VwOjpEYXRhVHlwZSAqIGFsaWFzVCkKK3sKKyAgICBBTlRMUjNfVUlOVDMyIGRlZl90eXBlZGVmX2NvbnN0cmFpbnRfU3RhcnRJbmRleDsKKworICAgIHNlcDo6QkZDb2RlIGJzOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9icworICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfYnMgc2VwOjpCRkNvZGUKKworICAgIHNlcDo6QkYgY2U7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2NlCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9jZSBzZXA6OkJGCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgZGVmX3R5cGVkZWZfY29uc3RyYWludF9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisKKyAgICAJc2VwOjpSb3V0aW5lICogb25Db25zdHJhaW50Um91dGluZSA9IE5VTEw7CisKKyAgICAJc2VwOjpCZWhhdmlvcmFsUGFydCAqIGFCZWhhdmlvcmFscGFydCA9IGFsaWFzVC0+Z2V0VW5pcUJlaGF2aW9yUGFydCgpOworCisgICAgCVNBVkVfUlVMRV9CRUdJTl9MT0NBVElPTjsKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTQ1KSkgKQorICAgIHsKKyAgICAgICAgeworCisgICAgICAgICAgICAJU0VUX1JVTEVfTE9DQVRJT04oIG9uQ29uc3RyYWludFJvdXRpbmUgKTsKKworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mzg4ODoyOiAoIExDVVJMWSAnQGNvbnN0cmFpbnQnICggcm91dGluZV9zaW5nbGVfcGFyYW1bKm9uQ29uc3RyYWludFJvdXRpbmUsIGFsaWFzVC0+Z2V0VHlwZVNwZWNpZmllcigpXSApPyAoYnM9IGJsb2NrX3N0YXRlbWVudCB8ICd8PT4nIGNlPSBjb25kaXRpb25hbEV4cHJlc3Npb24gU0VNSSApIFJDVVJMWSApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM4ODg6NDogTENVUkxZICdAY29uc3RyYWludCcgKCByb3V0aW5lX3NpbmdsZV9wYXJhbVsqb25Db25zdHJhaW50Um91dGluZSwgYWxpYXNULT5nZXRUeXBlU3BlY2lmaWVyKCldICk/IChicz0gYmxvY2tfc3RhdGVtZW50IHwgJ3w9PicgY2U9IGNvbmRpdGlvbmFsRXhwcmVzc2lvbiBTRU1JICkgUkNVUkxZCisgICAgICAgIHsKKyAgICAgICAgICAgICBNQVRDSFQoTENVUkxZLCAmRk9MTE9XX0xDVVJMWV9pbl9kZWZfdHlwZWRlZl9jb25zdHJhaW50MTI0MDUpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfdHlwZWRlZl9jb25zdHJhaW50RXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgTUFUQ0hUKDE3NiwgJkZPTExPV18xNzZfaW5fZGVmX3R5cGVkZWZfY29uc3RyYWludDEyNDA5KTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX3R5cGVkZWZfY29uc3RyYWludEV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgCSAgICAJb25Db25zdHJhaW50Um91dGluZSA9IG5ldyBzZXA6OlJvdXRpbmUoYWxpYXNULCAiY29uc3RyYWludCIpOworICAgICAgICAgICAgICAgIAkgICAgCWFsaWFzVC0+c2V0Q29uc3RyYWludFJvdXRpbmUob25Db25zdHJhaW50Um91dGluZSk7CisgICAgICAgICAgICAgICAgCSAgICAJYUJlaGF2aW9yYWxwYXJ0LT5zYXZlQW5vbnltb3VzSW5uZXJSb3V0aW5lKG9uQ29uc3RyYWludFJvdXRpbmUpOworICAgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mzg5NTo2OiAoIHJvdXRpbmVfc2luZ2xlX3BhcmFtWypvbkNvbnN0cmFpbnRSb3V0aW5lLCBhbGlhc1QtPmdldFR5cGVTcGVjaWZpZXIoKV0gKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MzQ0PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMUEFSRU46CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJYWx0MzQ0PTE7CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDM0NCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozODk1Ojg6IHJvdXRpbmVfc2luZ2xlX3BhcmFtWypvbkNvbnN0cmFpbnRSb3V0aW5lLCBhbGlhc1QtPmdldFR5cGVTcGVjaWZpZXIoKV0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfcm91dGluZV9zaW5nbGVfcGFyYW1faW5fZGVmX3R5cGVkZWZfY29uc3RyYWludDEyNDI1KTsKKyAgICAgICAgICAgIAkgICAgICAgIHJvdXRpbmVfc2luZ2xlX3BhcmFtKGN0eCwgKm9uQ29uc3RyYWludFJvdXRpbmUsIGFsaWFzVC0+Z2V0VHlwZVNwZWNpZmllcigpKTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl90eXBlZGVmX2NvbnN0cmFpbnRFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mzg5Njo2OiAoYnM9IGJsb2NrX3N0YXRlbWVudCB8ICd8PT4nIGNlPSBjb25kaXRpb25hbEV4cHJlc3Npb24gU0VNSSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDM0NT0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBMQ1VSTFk6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDM0NT0xOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNDE3OgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQzNDU9MjsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMzQ1OworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfdHlwZWRlZl9jb25zdHJhaW50RXg7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDM0NSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozODk2Ojg6IGJzPSBibG9ja19zdGF0ZW1lbnQKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl90eXBlZGVmX2NvbnN0cmFpbnQxMjQ0MCk7CisgICAgICAgICAgICAJICAgICAgICBicz1ibG9ja19zdGF0ZW1lbnQoY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl90eXBlZGVmX2NvbnN0cmFpbnRFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgb25Db25zdHJhaW50Um91dGluZS0+c2V0Q29kZSggYnMKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgKTsgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mzg5Nzo4OiAnfD0+JyBjZT0gY29uZGl0aW9uYWxFeHByZXNzaW9uIFNFTUkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVCg0MTcsICZGT0xMT1dfNDE3X2luX2RlZl90eXBlZGVmX2NvbnN0cmFpbnQxMjQ1Mik7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl90eXBlZGVmX2NvbnN0cmFpbnRFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2NvbmRpdGlvbmFsRXhwcmVzc2lvbl9pbl9kZWZfdHlwZWRlZl9jb25zdHJhaW50MTI0NTYpOworICAgICAgICAgICAgCSAgICAgICAgY2U9Y29uZGl0aW9uYWxFeHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfdHlwZWRlZl9jb25zdHJhaW50RXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKFNFTUksICZGT0xMT1dfU0VNSV9pbl9kZWZfdHlwZWRlZl9jb25zdHJhaW50MTI0NTgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfdHlwZWRlZl9jb25zdHJhaW50RXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIG9uQ29uc3RyYWludFJvdXRpbmUtPnNldENvZGUoIE5FV19TVE1UMShPUChHVUFSRCksIGNlCisgICAgICAgICAgICAJICAgICAgICAgICAgKSApOyAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICBNQVRDSFQoUkNVUkxZLCAmRk9MTE9XX1JDVVJMWV9pbl9kZWZfdHlwZWRlZl9jb25zdHJhaW50MTI0NzkpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfdHlwZWRlZl9jb25zdHJhaW50RXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZWRlZl90eXBlZGVmX2NvbnN0cmFpbnRFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVkZWZfdHlwZWRlZl9jb25zdHJhaW50RXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIAlTRVRfUlVMRV9MT0NBVElPTiggb25Db25zdHJhaW50Um91dGluZSApOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisKKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDE0NSwgZGVmX3R5cGVkZWZfY29uc3RyYWludF9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgZGVmX3R5cGVkZWZfY29uc3RyYWludCAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCB0aW1lX3R5cGUKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM5MDg6MTogdGltZV90eXBlIHJldHVybnMgWyBzZXA6OlR5cGVTcGVjaWZpZXIgYnRzIF0gOiAoICd0aW1lJyB8ICdjdGltZScgfCAnZHRpbWUnICkgKCBMVF8gcHQ9IHRpbWVfdHlwZV9kb21haW4gKCBDT01NQSBzej0gaW50ZWdlcl9jb25zdGFudCApPyBHVCB8cHQ9IHRpbWVfdHlwZV9kb21haW4gKT8gOworICovCitzdGF0aWMgc2VwOjpUeXBlU3BlY2lmaWVyCit0aW1lX3R5cGUocGZtbFBhcnNlciBjdHgpCit7CisgICAgc2VwOjpUeXBlU3BlY2lmaWVyIGJ0czsKKworICAgIEFOVExSM19VSU5UMzIgdGltZV90eXBlX1N0YXJ0SW5kZXg7CisKKyAgICBzZXA6OlR5cGVTcGVjaWZpZXIgcHQ7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX3B0CisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9wdCBzZXA6OlR5cGVTcGVjaWZpZXIKKworICAgIHNlcDo6YXZtX3NpemVfdCBzejsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfc3oKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX3N6IHNlcDo6YXZtX3NpemVfdAorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIHRpbWVfdHlwZV9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisKKyAgICAJaW50IHN6VCA9IDE7CisgICAgCXNlcDo6YXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdCB0c2sgPSBzZXA6OlRZUEVfVElNRV9TUEVDSUZJRVI7CisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDE0NikpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gYnRzOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzkxNDoyOiAoICggJ3RpbWUnIHwgJ2N0aW1lJyB8ICdkdGltZScgKSAoIExUXyBwdD0gdGltZV90eXBlX2RvbWFpbiAoIENPTU1BIHN6PSBpbnRlZ2VyX2NvbnN0YW50ICk/IEdUIHxwdD0gdGltZV90eXBlX2RvbWFpbiApPyApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM5MTQ6NDogKCAndGltZScgfCAnY3RpbWUnIHwgJ2R0aW1lJyApICggTFRfIHB0PSB0aW1lX3R5cGVfZG9tYWluICggQ09NTUEgc3o9IGludGVnZXJfY29uc3RhbnQgKT8gR1QgfHB0PSB0aW1lX3R5cGVfZG9tYWluICk/CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM5MTQ6NDogKCAndGltZScgfCAnY3RpbWUnIHwgJ2R0aW1lJyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDM0Nj0zOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAzOTI6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDM0Nj0xOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjY0OgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQzNDY9MjsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI3MToKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0MzQ2PTM7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBidHM7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDM0NjsKKyAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgICAgICAgICAgZ290byBydWxldGltZV90eXBlRXg7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDM0NikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozOTE0OjY6ICd0aW1lJworICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKDM5MiwgJkZPTExPV18zOTJfaW5fdGltZV90eXBlMTI1MDUpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV0aW1lX3R5cGVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYnRzOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgYnRzPSBzZXA6OlR5cGVNYW5hZ2VyOjpUSU1FOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDI6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM5MTU6NjogJ2N0aW1lJworICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKDI2NCwgJkZPTExPV18yNjRfaW5fdGltZV90eXBlMTI1MTYpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV0aW1lX3R5cGVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYnRzOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgYnRzPSBzZXA6OlR5cGVNYW5hZ2VyOjpDT05USU5VT1VTX1RJTUU7CisgICAgICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDM6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM5MTY6NjogJ2R0aW1lJworICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKDI3MSwgJkZPTExPV18yNzFfaW5fdGltZV90eXBlMTI1MjYpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV0aW1lX3R5cGVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYnRzOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgYnRzPSBzZXA6OlR5cGVNYW5hZ2VyOjpESVNDUkVURV9USU1FOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzkxODo0OiAoIExUXyBwdD0gdGltZV90eXBlX2RvbWFpbiAoIENPTU1BIHN6PSBpbnRlZ2VyX2NvbnN0YW50ICk/IEdUIHxwdD0gdGltZV90eXBlX2RvbWFpbiApPworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQzNDg9MzsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIExUXzoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQzNDg9MTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDI3MDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyODM6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzA5OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDMxMDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzNTc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzU4OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM2MDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzOTk6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDAwOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDQwMToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDA3OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDQwODoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDk6CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJYWx0MzQ4PTI7CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDM0OCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozOTE4OjY6IExUXyBwdD0gdGltZV90eXBlX2RvbWFpbiAoIENPTU1BIHN6PSBpbnRlZ2VyX2NvbnN0YW50ICk/IEdUCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoTFRfLCAmRk9MTE9XX0xUX19pbl90aW1lX3R5cGUxMjU0MSk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXRpbWVfdHlwZUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBidHM7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICB0c2sgPSBidHMKKyAgICAgICAgICAgIAkgICAgICAgICAgICAuZ2V0VHlwZVNwZWNpZmllcktpbmQoKTsgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfdGltZV90eXBlX2RvbWFpbl9pbl90aW1lX3R5cGUxMjU1Nyk7CisgICAgICAgICAgICAJICAgICAgICBwdD10aW1lX3R5cGVfZG9tYWluKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV0aW1lX3R5cGVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYnRzOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgYnRzPSAKKyAgICAgICAgICAgIAkgICAgICAgICAgICBwdAorICAgICAgICAgICAgCSAgICAgICAgICAgIDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzkyMDo2OiAoIENPTU1BIHN6PSBpbnRlZ2VyX2NvbnN0YW50ICk/CisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDM0Nz0yOworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgQ09NTUE6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAkJYWx0MzQ3PTE7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDM0NykKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozOTIwOjg6IENPTU1BIHN6PSBpbnRlZ2VyX2NvbnN0YW50CisgICAgICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoQ09NTUEsICZGT0xMT1dfQ09NTUFfaW5fdGltZV90eXBlMTI1NzgpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV0aW1lX3R5cGVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYnRzOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fdGltZV90eXBlMTI1ODMpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgc3o9aW50ZWdlcl9jb25zdGFudChjdHgpOworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxldGltZV90eXBlRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJ0czsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIHN6VCA9IHN6CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgOyAKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoR1QsICZGT0xMT1dfR1RfaW5fdGltZV90eXBlMTI1OTUpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV0aW1lX3R5cGVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYnRzOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgYnRzPSBzZXA6OlR5cGVNYW5hZ2VyOjpuZXdDbG9ja1RpbWUodHNrLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICBidHMKKyAgICAgICAgICAgIAkgICAgICAgICAgICAsIHN6VCk7CisgICAgICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDI6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM5MjQ6NjogcHQ9IHRpbWVfdHlwZV9kb21haW4KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfdGltZV90eXBlX2RvbWFpbl9pbl90aW1lX3R5cGUxMjYxMSk7CisgICAgICAgICAgICAJICAgICAgICBwdD10aW1lX3R5cGVfZG9tYWluKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV0aW1lX3R5cGVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYnRzOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgYnRzPSBzZXA6OlR5cGVNYW5hZ2VyOjpuZXdDbG9ja1RpbWUodHNrLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICBwdAorICAgICAgICAgICAgCSAgICAgICAgICAgICwgc3pUKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZXRpbWVfdHlwZUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZXRpbWVfdHlwZUV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTQ2LCB0aW1lX3R5cGVfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiBidHM7Cit9CisvKiAkQU5UTFIgZW5kIHRpbWVfdHlwZSAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCB0aW1lX2Nsb2NrX3R5cGUKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM5MzA6MTogdGltZV9jbG9ja190eXBlIHJldHVybnMgWyBzZXA6OlR5cGVTcGVjaWZpZXIgYnRzIF0gOiAnY2xvY2snICggTFRfICggJ3RpbWUnIHwgJ2N0aW1lJyB8ICdkdGltZScgfHB0PSB0aW1lX3R5cGVfZG9tYWluICkgKCBDT01NQSBzej0gaW50ZWdlcl9jb25zdGFudCApPyBHVCB8ICggJ3RpbWUnIHwgJ2N0aW1lJyB8ICdkdGltZScgfHB0PSB0aW1lX3R5cGVfZG9tYWluICkgKCBDT01NQSBzej0gaW50ZWdlcl9jb25zdGFudCApPyApPyA7CisgKi8KK3N0YXRpYyBzZXA6OlR5cGVTcGVjaWZpZXIKK3RpbWVfY2xvY2tfdHlwZShwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBzZXA6OlR5cGVTcGVjaWZpZXIgYnRzOworCisgICAgQU5UTFIzX1VJTlQzMiB0aW1lX2Nsb2NrX3R5cGVfU3RhcnRJbmRleDsKKworICAgIHNlcDo6VHlwZVNwZWNpZmllciBwdDsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfcHQKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX3B0IHNlcDo6VHlwZVNwZWNpZmllcgorCisgICAgc2VwOjphdm1fc2l6ZV90IHN6OworICAgICN1bmRlZglSRVRVUk5fVFlQRV9zegorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfc3ogc2VwOjphdm1fc2l6ZV90CisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgdGltZV9jbG9ja190eXBlX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKworICAgIAlpbnQgc3pUID0gMTsKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTQ3KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiBidHM7CisgICAgfQorCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozOTM1OjI6ICggJ2Nsb2NrJyAoIExUXyAoICd0aW1lJyB8ICdjdGltZScgfCAnZHRpbWUnIHxwdD0gdGltZV90eXBlX2RvbWFpbiApICggQ09NTUEgc3o9IGludGVnZXJfY29uc3RhbnQgKT8gR1QgfCAoICd0aW1lJyB8ICdjdGltZScgfCAnZHRpbWUnIHxwdD0gdGltZV90eXBlX2RvbWFpbiApICggQ09NTUEgc3o9IGludGVnZXJfY29uc3RhbnQgKT8gKT8gKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozOTM1OjQ6ICdjbG9jaycgKCBMVF8gKCAndGltZScgfCAnY3RpbWUnIHwgJ2R0aW1lJyB8cHQ9IHRpbWVfdHlwZV9kb21haW4gKSAoIENPTU1BIHN6PSBpbnRlZ2VyX2NvbnN0YW50ICk/IEdUIHwgKCAndGltZScgfCAnY3RpbWUnIHwgJ2R0aW1lJyB8cHQ9IHRpbWVfdHlwZV9kb21haW4gKSAoIENPTU1BIHN6PSBpbnRlZ2VyX2NvbnN0YW50ICk/ICk/CisgICAgICAgIHsKKyAgICAgICAgICAgICBNQVRDSFQoMjU5LCAmRk9MTE9XXzI1OV9pbl90aW1lX2Nsb2NrX3R5cGUxMjY0Mik7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXRpbWVfY2xvY2tfdHlwZUV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBidHM7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBidHM9IHNlcDo6VHlwZU1hbmFnZXI6OkNMT0NLOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozOTM2OjQ6ICggTFRfICggJ3RpbWUnIHwgJ2N0aW1lJyB8ICdkdGltZScgfHB0PSB0aW1lX3R5cGVfZG9tYWluICkgKCBDT01NQSBzej0gaW50ZWdlcl9jb25zdGFudCApPyBHVCB8ICggJ3RpbWUnIHwgJ2N0aW1lJyB8ICdkdGltZScgfHB0PSB0aW1lX3R5cGVfZG9tYWluICkgKCBDT01NQSBzej0gaW50ZWdlcl9jb25zdGFudCApPyApPworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQzNTM9MzsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIExUXzoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQzNTM9MTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDI2NDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNzA6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjcxOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDI4MzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzMDk6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzEwOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM1NzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzNTg6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzYwOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM5MjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzOTk6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDAwOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDQwMToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDA3OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDQwODoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDk6CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJYWx0MzUzPTI7CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDM1MykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozOTM2OjY6IExUXyAoICd0aW1lJyB8ICdjdGltZScgfCAnZHRpbWUnIHxwdD0gdGltZV90eXBlX2RvbWFpbiApICggQ09NTUEgc3o9IGludGVnZXJfY29uc3RhbnQgKT8gR1QKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChMVF8sICZGT0xMT1dfTFRfX2luX3RpbWVfY2xvY2tfdHlwZTEyNjUyKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxldGltZV9jbG9ja190eXBlRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJ0czsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozOTM3OjM6ICggJ3RpbWUnIHwgJ2N0aW1lJyB8ICdkdGltZScgfHB0PSB0aW1lX3R5cGVfZG9tYWluICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0MzQ5PTQ7CisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM5MjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJYWx0MzQ5PTE7CisgICAgICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSAyNjQ6CisgICAgICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCWFsdDM0OT0yOworICAgICAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjcxOgorICAgICAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQlhbHQzNDk9MzsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI3MDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI4MzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMwOToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMxMDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM1NzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM1ODoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM2MDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM5OToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDQwMDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDQwMToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDQwMjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDQwNzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDQwODoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDQwOToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJYWx0MzQ5PTQ7CisgICAgICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIHJldHVybiBidHM7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDM0OTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxldGltZV9jbG9ja190eXBlRXg7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDM0OSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozOTM3OjU6ICd0aW1lJworICAgICAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKDM5MiwgJkZPTExPV18zOTJfaW5fdGltZV9jbG9ja190eXBlMTI2NTgpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV0aW1lX2Nsb2NrX3R5cGVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYnRzOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgYnRzPSBzZXA6OlR5cGVNYW5hZ2VyOjpUSU1FOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDI6CisgICAgICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM5Mzg6NTogJ2N0aW1lJworICAgICAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKDI2NCwgJkZPTExPV18yNjRfaW5fdGltZV9jbG9ja190eXBlMTI2NjgpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV0aW1lX2Nsb2NrX3R5cGVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYnRzOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgYnRzPSBzZXA6OlR5cGVNYW5hZ2VyOjpDT05USU5VT1VTX1RJTUU7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDM6CisgICAgICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM5Mzk6NTogJ2R0aW1lJworICAgICAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKDI3MSwgJkZPTExPV18yNzFfaW5fdGltZV9jbG9ja190eXBlMTI2NzcpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV0aW1lX2Nsb2NrX3R5cGVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYnRzOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgYnRzPSBzZXA6OlR5cGVNYW5hZ2VyOjpESVNDUkVURV9USU1FOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDQ6CisgICAgICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM5NDA6NTogcHQ9IHRpbWVfdHlwZV9kb21haW4KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfdGltZV90eXBlX2RvbWFpbl9pbl90aW1lX2Nsb2NrX3R5cGUxMjY4OCk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBwdD10aW1lX3R5cGVfZG9tYWluKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV0aW1lX2Nsb2NrX3R5cGVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYnRzOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgYnRzPSAKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBwdAorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM5NDI6MzogKCBDT01NQSBzej0gaW50ZWdlcl9jb25zdGFudCApPworICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQzNTA9MjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIENPTU1BOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJCWFsdDM1MD0xOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQzNTApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mzk0Mjo1OiBDT01NQSBzej0gaW50ZWdlcl9jb25zdGFudAorICAgICAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKENPTU1BLCAmRk9MTE9XX0NPTU1BX2luX3RpbWVfY2xvY2tfdHlwZTEyNzAwKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxldGltZV9jbG9ja190eXBlRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJ0czsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19pbnRlZ2VyX2NvbnN0YW50X2luX3RpbWVfY2xvY2tfdHlwZTEyNzA1KTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHN6PWludGVnZXJfY29uc3RhbnQoY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXRpbWVfY2xvY2tfdHlwZUV4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBidHM7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICBzelQgPSBzegorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIDsgCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKEdULCAmRk9MTE9XX0dUX2luX3RpbWVfY2xvY2tfdHlwZTEyNzE3KTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxldGltZV9jbG9ja190eXBlRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJ0czsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIGJ0cz0gc2VwOjpUeXBlTWFuYWdlcjo6bmV3Q2xvY2tUaW1lKHNlcDo6VFlQRV9DTE9DS19TUEVDSUZJRVIsIAorICAgICAgICAgICAgCSAgICAgICAgICAgIGJ0cworICAgICAgICAgICAgCSAgICAgICAgICAgICwgc3pUKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mzk0Njo2OiAoICd0aW1lJyB8ICdjdGltZScgfCAnZHRpbWUnIHxwdD0gdGltZV90eXBlX2RvbWFpbiApICggQ09NTUEgc3o9IGludGVnZXJfY29uc3RhbnQgKT8KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mzk0Njo2OiAoICd0aW1lJyB8ICdjdGltZScgfCAnZHRpbWUnIHxwdD0gdGltZV90eXBlX2RvbWFpbiApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDM1MT00OworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSAzOTI6CisgICAgICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCWFsdDM1MT0xOworICAgICAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjY0OgorICAgICAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQlhbHQzNTE9MjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI3MToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJYWx0MzUxPTM7CisgICAgICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSAyNzA6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSAyODM6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSAzMDk6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSAzMTA6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSAzNTc6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSAzNTg6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSAzNjA6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSAzOTk6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSA0MDA6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSA0MDE6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSA0MDI6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSA0MDc6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSA0MDg6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSA0MDk6CisgICAgICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCWFsdDM1MT00OworICAgICAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnRzOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAzNTE7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZXRpbWVfY2xvY2tfdHlwZUV4OworCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQzNTEpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mzk0Njo4OiAndGltZScKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVCgzOTIsICZGT0xMT1dfMzkyX2luX3RpbWVfY2xvY2tfdHlwZTEyNzMzKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxldGltZV9jbG9ja190eXBlRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJ0czsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIGJ0cz0gc2VwOjpUeXBlTWFuYWdlcjo6VElNRTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgICAgICAJY2FzZSAyOgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozOTQ3OjU6ICdjdGltZScKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVCgyNjQsICZGT0xMT1dfMjY0X2luX3RpbWVfY2xvY2tfdHlwZTEyNzQzKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxldGltZV9jbG9ja190eXBlRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJ0czsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIGJ0cz0gc2VwOjpUeXBlTWFuYWdlcjo6Q09OVElOVU9VU19USU1FOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgICAgICAJY2FzZSAzOgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozOTQ4OjU6ICdkdGltZScKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVCgyNzEsICZGT0xMT1dfMjcxX2luX3RpbWVfY2xvY2tfdHlwZTEyNzUyKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxldGltZV9jbG9ja190eXBlRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJ0czsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIGJ0cz0gc2VwOjpUeXBlTWFuYWdlcjo6RElTQ1JFVEVfVElNRTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgICAgICAJY2FzZSA0OgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozOTQ5OjU6IHB0PSB0aW1lX3R5cGVfZG9tYWluCisgICAgICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3RpbWVfdHlwZV9kb21haW5faW5fdGltZV9jbG9ja190eXBlMTI3NjMpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgcHQ9dGltZV90eXBlX2RvbWFpbihjdHgpOworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxldGltZV9jbG9ja190eXBlRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJ0czsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIGJ0cz0gCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcHQKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICA7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozOTUxOjM6ICggQ09NTUEgc3o9IGludGVnZXJfY29uc3RhbnQgKT8KKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0MzUyPTI7CisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBDT01NQToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAkJICAgIGludCBMQTM1Ml8xID0gTEEoMik7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAkJICAgIGlmICggKHN5bnByZWQ2MDlfZm1sKGN0eCkpKQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAkJICAgICAgICBhbHQzNTI9MTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCQkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0MzUyKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM5NTE6NTogQ09NTUEgc3o9IGludGVnZXJfY29uc3RhbnQKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChDT01NQSwgJkZPTExPV19DT01NQV9pbl90aW1lX2Nsb2NrX3R5cGUxMjc3NSk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXRpbWVfY2xvY2tfdHlwZUV4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBidHM7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfaW50ZWdlcl9jb25zdGFudF9pbl90aW1lX2Nsb2NrX3R5cGUxMjc4MCk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBzej1pbnRlZ2VyX2NvbnN0YW50KGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV0aW1lX2Nsb2NrX3R5cGVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYnRzOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgc3pUID0gc3oKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICA7IAorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBidHM9IHNlcDo6VHlwZU1hbmFnZXI6Om5ld0Nsb2NrVGltZShzZXA6OlRZUEVfQ0xPQ0tfU1BFQ0lGSUVSLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICBidHMKKyAgICAgICAgICAgIAkgICAgICAgICAgICAsIHN6VCk7CisgICAgICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGV0aW1lX2Nsb2NrX3R5cGVFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGV0aW1lX2Nsb2NrX3R5cGVFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDE0NywgdGltZV9jbG9ja190eXBlX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gYnRzOworfQorLyogJEFOVExSIGVuZCB0aW1lX2Nsb2NrX3R5cGUgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgdGltZV90eXBlX2RvbWFpbgorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mzk1NzoxOiB0aW1lX3R5cGVfZG9tYWluIHJldHVybnMgWyBzZXA6OlR5cGVTcGVjaWZpZXIgdHlwZSBdIDogKCAoICdpbnRlZ2VyJyB8ICdpbnQnICkgKCBMVF8gbj0gaW50ZWdlcl9jb25zdGFudCBHVCApPyB8ICggJ3VpbnRlZ2VyJyB8ICd1aW50JyApICggTFRfIG49IGludGVnZXJfY29uc3RhbnQgR1QgKT8gfCAoICdyYXRpb25hbCcgfCAncmF0JyApIHwgKCAndXJhdGlvbmFsJyB8ICd1cmF0JyApIHwgJ2Zsb2F0JyB8ICd1ZmxvYXQnIHwgJ2RvdWJsZScgfCAndWRvdWJsZScgfCAncmVhbCcgfCAndXJlYWwnICk7CisgKi8KK3N0YXRpYyBzZXA6OlR5cGVTcGVjaWZpZXIKK3RpbWVfdHlwZV9kb21haW4ocGZtbFBhcnNlciBjdHgpCit7CisgICAgc2VwOjpUeXBlU3BlY2lmaWVyIHR5cGU7CisKKyAgICBBTlRMUjNfVUlOVDMyIHRpbWVfdHlwZV9kb21haW5fU3RhcnRJbmRleDsKKworICAgIHNlcDo6YXZtX3NpemVfdCBuOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9uCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9uIHNlcDo6YXZtX3NpemVfdAorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIHRpbWVfdHlwZV9kb21haW5fU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTQ4KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM5NTk6MjogKCAoICdpbnRlZ2VyJyB8ICdpbnQnICkgKCBMVF8gbj0gaW50ZWdlcl9jb25zdGFudCBHVCApPyB8ICggJ3VpbnRlZ2VyJyB8ICd1aW50JyApICggTFRfIG49IGludGVnZXJfY29uc3RhbnQgR1QgKT8gfCAoICdyYXRpb25hbCcgfCAncmF0JyApIHwgKCAndXJhdGlvbmFsJyB8ICd1cmF0JyApIHwgJ2Zsb2F0JyB8ICd1ZmxvYXQnIHwgJ2RvdWJsZScgfCAndWRvdWJsZScgfCAncmVhbCcgfCAndXJlYWwnICkKKworICAgICAgICAgICAgQU5UTFIzX1VJTlQzMiBhbHQzNTY7CisKKyAgICAgICAgICAgIGFsdDM1Nj0xMDsKKworICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAzMDk6CisgICAgICAgICAgICBjYXNlIDMxMDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDM1Nj0xOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDAxOgorICAgICAgICAgICAgY2FzZSA0MDI6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQzNTY9MjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM1NzoKKyAgICAgICAgICAgIGNhc2UgMzU4OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MzU2PTM7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0MDc6CisgICAgICAgICAgICBjYXNlIDQwODoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDM1Nj00OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjgzOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MzU2PTU7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0MDA6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQzNTY9NjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI3MDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDM1Nj03OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzk5OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MzU2PTg7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzNjA6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQzNTY9OTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQwOToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDM1Nj0xMDsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDM1NjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXRpbWVfdHlwZV9kb21haW5FeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDM1NikKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozOTU5OjQ6ICggJ2ludGVnZXInIHwgJ2ludCcgKSAoIExUXyBuPSBpbnRlZ2VyX2NvbnN0YW50IEdUICk/CisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBpZiAoICgoTEEoMSkgPj0gMzA5KSAmJiAoTEEoMSkgPD0gMzEwKSkgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBDT05TVU1FKCk7CisgICAgICAgIAkgICAgICAgICAgICBQRVJST1JSRUNPVkVSWT1BTlRMUjNfRkFMU0U7CisgICAgICAgIAkgICAgICAgICAgICBGQUlMRURGTEFHPUFOVExSM19GQUxTRTsKKworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGVsc2UKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX01JU01BVENIRURfU0VUX0VYQ0VQVElPTjsKKyAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+bmFtZSAgICAgICAgID0gKHZvaWQgKilBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfTkFNRTsKKyAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+ZXhwZWN0aW5nU2V0ID0gTlVMTDsKKworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxldGltZV90eXBlX2RvbWFpbkV4OworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICB0eXBlPSBzZXA6OlR5cGVNYW5hZ2VyOjpJTlRFR0VSOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozOTYwOjQ6ICggTFRfIG49IGludGVnZXJfY29uc3RhbnQgR1QgKT8KKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDM1ND0yOworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgTFRfOgorICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQlhbHQzNTQ9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQzNTQpCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mzk2MDo2OiBMVF8gbj0gaW50ZWdlcl9jb25zdGFudCBHVAorICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChMVF8sICZGT0xMT1dfTFRfX2luX3RpbWVfdHlwZV9kb21haW4xMjgzNCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXRpbWVfdHlwZV9kb21haW5FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19pbnRlZ2VyX2NvbnN0YW50X2luX3RpbWVfdHlwZV9kb21haW4xMjg0Myk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIG49aW50ZWdlcl9jb25zdGFudChjdHgpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV0aW1lX3R5cGVfZG9tYWluRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgdHlwZT0gc2VwOjpUeXBlTWFuYWdlcjo6Z2V0VHlwZUludGVnZXIoIAorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgbgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoR1QsICZGT0xMT1dfR1RfaW5fdGltZV90eXBlX2RvbWFpbjEyODU2KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxldGltZV90eXBlX2RvbWFpbkV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozOTY1OjQ6ICggJ3VpbnRlZ2VyJyB8ICd1aW50JyApICggTFRfIG49IGludGVnZXJfY29uc3RhbnQgR1QgKT8KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIGlmICggKChMQSgxKSA+PSA0MDEpICYmIChMQSgxKSA8PSA0MDIpKSApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIENPTlNVTUUoKTsKKyAgICAgICAgCSAgICAgICAgICAgIFBFUlJPUlJFQ09WRVJZPUFOVExSM19GQUxTRTsKKyAgICAgICAgCSAgICAgICAgICAgIEZBSUxFREZMQUc9QU5UTFIzX0ZBTFNFOworCisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgZWxzZQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfRVhDRVBUSU9OOworICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT5uYW1lICAgICAgICAgPSAodm9pZCAqKUFOVExSM19NSVNNQVRDSEVEX1NFVF9OQU1FOworICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT5leHBlY3RpbmdTZXQgPSBOVUxMOworCisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV0aW1lX3R5cGVfZG9tYWluRXg7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIHR5cGU9IHNlcDo6VHlwZU1hbmFnZXI6OlVJTlRFR0VSOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozOTY2OjQ6ICggTFRfIG49IGludGVnZXJfY29uc3RhbnQgR1QgKT8KKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDM1NT0yOworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgTFRfOgorICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQlhbHQzNTU9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQzNTUpCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mzk2Njo2OiBMVF8gbj0gaW50ZWdlcl9jb25zdGFudCBHVAorICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChMVF8sICZGT0xMT1dfTFRfX2luX3RpbWVfdHlwZV9kb21haW4xMjg4NSk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXRpbWVfdHlwZV9kb21haW5FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19pbnRlZ2VyX2NvbnN0YW50X2luX3RpbWVfdHlwZV9kb21haW4xMjg5NCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIG49aW50ZWdlcl9jb25zdGFudChjdHgpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV0aW1lX3R5cGVfZG9tYWluRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgdHlwZT0gc2VwOjpUeXBlTWFuYWdlcjo6Z2V0VHlwZVVJbnRlZ2VyKCAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIG4KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoR1QsICZGT0xMT1dfR1RfaW5fdGltZV90eXBlX2RvbWFpbjEyOTA3KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxldGltZV90eXBlX2RvbWFpbkV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMzoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozOTcxOjQ6ICggJ3JhdGlvbmFsJyB8ICdyYXQnICkKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIGlmICggKChMQSgxKSA+PSAzNTcpICYmIChMQSgxKSA8PSAzNTgpKSApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIENPTlNVTUUoKTsKKyAgICAgICAgCSAgICAgICAgICAgIFBFUlJPUlJFQ09WRVJZPUFOVExSM19GQUxTRTsKKyAgICAgICAgCSAgICAgICAgICAgIEZBSUxFREZMQUc9QU5UTFIzX0ZBTFNFOworCisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgZWxzZQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfRVhDRVBUSU9OOworICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT5uYW1lICAgICAgICAgPSAodm9pZCAqKUFOVExSM19NSVNNQVRDSEVEX1NFVF9OQU1FOworICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT5leHBlY3RpbmdTZXQgPSBOVUxMOworCisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV0aW1lX3R5cGVfZG9tYWluRXg7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIHR5cGU9IHNlcDo6VHlwZU1hbmFnZXI6OlJBVElPTkFMOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgNDoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozOTcyOjQ6ICggJ3VyYXRpb25hbCcgfCAndXJhdCcgKQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgaWYgKCAoKExBKDEpID49IDQwNykgJiYgKExBKDEpIDw9IDQwOCkpICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgQ09OU1VNRSgpOworICAgICAgICAJICAgICAgICAgICAgUEVSUk9SUkVDT1ZFUlk9QU5UTFIzX0ZBTFNFOworICAgICAgICAJICAgICAgICAgICAgRkFJTEVERkxBRz1BTlRMUjNfRkFMU0U7CisKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBlbHNlCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19NSVNNQVRDSEVEX1NFVF9FWENFUFRJT047CisgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPm5hbWUgICAgICAgICA9ICh2b2lkICopQU5UTFIzX01JU01BVENIRURfU0VUX05BTUU7CisgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPmV4cGVjdGluZ1NldCA9IE5VTEw7CisKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXRpbWVfdHlwZV9kb21haW5FeDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgdHlwZT0gc2VwOjpUeXBlTWFuYWdlcjo6VVJBVElPTkFMOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgNToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozOTc0OjQ6ICdmbG9hdCcKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMjgzLCAmRk9MTE9XXzI4M19pbl90aW1lX3R5cGVfZG9tYWluMTI5NTEpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV0aW1lX3R5cGVfZG9tYWluRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgdHlwZT0gc2VwOjpUeXBlTWFuYWdlcjo6RkxPQVQ7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA2OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM5NzU6NDogJ3VmbG9hdCcKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoNDAwLCAmRk9MTE9XXzQwMF9pbl90aW1lX3R5cGVfZG9tYWluMTI5NjMpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV0aW1lX3R5cGVfZG9tYWluRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgdHlwZT0gc2VwOjpUeXBlTWFuYWdlcjo6VUZMT0FUOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgNzoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozOTc3OjQ6ICdkb3VibGUnCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDI3MCwgJkZPTExPV18yNzBfaW5fdGltZV90eXBlX2RvbWFpbjEyOTc1KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxldGltZV90eXBlX2RvbWFpbkV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIHR5cGU9IHNlcDo6VHlwZU1hbmFnZXI6OkRPVUJMRTsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDg6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mzk3ODo0OiAndWRvdWJsZScKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMzk5LCAmRk9MTE9XXzM5OV9pbl90aW1lX3R5cGVfZG9tYWluMTI5ODYpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV0aW1lX3R5cGVfZG9tYWluRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgdHlwZT0gc2VwOjpUeXBlTWFuYWdlcjo6VURPVUJMRTsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDk6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mzk4MDo0OiAncmVhbCcKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMzYwLCAmRk9MTE9XXzM2MF9pbl90aW1lX3R5cGVfZG9tYWluMTI5OTcpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV0aW1lX3R5cGVfZG9tYWluRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgdHlwZT0gc2VwOjpUeXBlTWFuYWdlcjo6UkVBTDsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDEwOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM5ODE6NDogJ3VyZWFsJworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCg0MDksICZGT0xMT1dfNDA5X2luX3RpbWVfdHlwZV9kb21haW4xMzAxMCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXRpbWVfdHlwZV9kb21haW5FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICB0eXBlPSBzZXA6OlR5cGVNYW5hZ2VyOjpVUkVBTDsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZXRpbWVfdHlwZV9kb21haW5FeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGV0aW1lX3R5cGVfZG9tYWluRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgxNDgsIHRpbWVfdHlwZV9kb21haW5fU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiB0eXBlOworfQorLyogJEFOVExSIGVuZCB0aW1lX3R5cGVfZG9tYWluICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IHNlY3Rpb25fbW9kZWxfb2ZfY29tcHV0YXRpb24KKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQwNDU6MTogc2VjdGlvbl9tb2RlbF9vZl9jb21wdXRhdGlvblsgc2VwOjpNYWNoaW5lICogY29udGFpbmVyIF0gOiAnQG1vYzonIDsKKyAqLworc3RhdGljIHZvaWQKK3NlY3Rpb25fbW9kZWxfb2ZfY29tcHV0YXRpb24ocGZtbFBhcnNlciBjdHgsIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lcikKK3sKKyAgICBBTlRMUjNfVUlOVDMyIHNlY3Rpb25fbW9kZWxfb2ZfY29tcHV0YXRpb25fU3RhcnRJbmRleDsKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBzZWN0aW9uX21vZGVsX29mX2NvbXB1dGF0aW9uX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDE0OSkpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDA0NjoyOiAoICdAbW9jOicgKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0MDQ2OjQ6ICdAbW9jOicKKyAgICAgICAgeworICAgICAgICAgICAgIE1BVENIVCgyMDIsICZGT0xMT1dfMjAyX2luX3NlY3Rpb25fbW9kZWxfb2ZfY29tcHV0YXRpb24xMzA0Mik7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXNlY3Rpb25fbW9kZWxfb2ZfY29tcHV0YXRpb25FeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlc2VjdGlvbl9tb2RlbF9vZl9jb21wdXRhdGlvbkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZXNlY3Rpb25fbW9kZWxfb2ZfY29tcHV0YXRpb25FeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDE0OSwgc2VjdGlvbl9tb2RlbF9vZl9jb21wdXRhdGlvbl9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgc2VjdGlvbl9tb2RlbF9vZl9jb21wdXRhdGlvbiAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBzZWN0aW9uX3JvdXRpbmUKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQwNTQ6MTogc2VjdGlvbl9yb3V0aW5lWyBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIgXSA6ICggJ0Byb3V0aW5lOicgfCAnQG1hY3JvOicgKSAoIGRlZl9yb3V0aW5lX21vZGVsWyBjb250YWluZXIgLCBtZGZyICwgc3BjZnIgXSApKiA7CisgKi8KK3N0YXRpYyB2b2lkCitzZWN0aW9uX3JvdXRpbmUocGZtbFBhcnNlciBjdHgsIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lcikKK3sKKyAgICBBTlRMUjNfVUlOVDMyIHNlY3Rpb25fcm91dGluZV9TdGFydEluZGV4OworCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIHNlY3Rpb25fcm91dGluZV9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisKKyAgICAJIHNlcDo6TW9kaWZpZXIgbWRmcjsKKworICAgIAlzZXA6OlNwZWNpZmllciBzcGNmciggc2VwOjpTcGVjaWZpZXI6OkRFU0lHTl9NT0RFTF9LSU5EICk7CisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDE1MCkpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDA2MDoyOiAoICggJ0Byb3V0aW5lOicgfCAnQG1hY3JvOicgKSAoIGRlZl9yb3V0aW5lX21vZGVsWyBjb250YWluZXIgLCBtZGZyICwgc3BjZnIgXSApKiApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQwNjA6NDogKCAnQHJvdXRpbmU6JyB8ICdAbWFjcm86JyApICggZGVmX3JvdXRpbmVfbW9kZWxbIGNvbnRhaW5lciAsIG1kZnIgLCBzcGNmciBdICkqCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQwNjA6NDogKCAnQHJvdXRpbmU6JyB8ICdAbWFjcm86JyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDM1Nz0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAyMjI6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDM1Nz0xOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjAxOgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQzNTc9MjsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMzU3OworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgICAgICBnb3RvIHJ1bGVzZWN0aW9uX3JvdXRpbmVFeDsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MzU3KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQwNjA6NjogJ0Byb3V0aW5lOicKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVCgyMjIsICZGT0xMT1dfMjIyX2luX3NlY3Rpb25fcm91dGluZTEzMDY2KTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc2VjdGlvbl9yb3V0aW5lRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAyOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0MDYxOjY6ICdAbWFjcm86JworICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKDIwMSwgJkZPTExPV18yMDFfaW5fc2VjdGlvbl9yb3V0aW5lMTMwNzMpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzZWN0aW9uX3JvdXRpbmVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgbWRmci5zZXROYXR1cmVNYWNybygpOyAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQwNjM6NDogKCBkZWZfcm91dGluZV9tb2RlbFsgY29udGFpbmVyICwgbWRmciAsIHNwY2ZyIF0gKSoKKworICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MzU4PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDMxODoKKyAgICAgICAgICAgICAgICBjYXNlIDM2NzoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0MzU4PTE7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDM1OCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0MDYzOjY6IGRlZl9yb3V0aW5lX21vZGVsWyBjb250YWluZXIgLCBtZGZyICwgc3BjZnIgXQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfcm91dGluZV9tb2RlbF9pbl9zZWN0aW9uX3JvdXRpbmUxMzA4OCk7CisgICAgICAgICAgICAJICAgICAgICBkZWZfcm91dGluZV9tb2RlbChjdHgsIGNvbnRhaW5lciwgbWRmciwgc3BjZnIpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc2VjdGlvbl9yb3V0aW5lRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAgICAgCSAgICBnb3RvIGxvb3AzNTg7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb29wMzU4OiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVzZWN0aW9uX3JvdXRpbmVFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVzZWN0aW9uX3JvdXRpbmVFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDE1MCwgc2VjdGlvbl9yb3V0aW5lX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBzZWN0aW9uX3JvdXRpbmUgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgZGVmX3JvdXRpbmVfbW9kZWwKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQwNjY6MTogZGVmX3JvdXRpbmVfbW9kZWxbIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lciAsXG5cdFx0c2VwOjpNb2RpZmllciBtZGZyICwgc2VwOjpTcGVjaWZpZXIgc3BjZnIgXSA6ICggJ3JvdXRpbmUnIHwgJ21hY3JvJyAoICdyb3V0aW5lJyApPyApIGRlZl9yb3V0aW5lX21vZGVsX2ltcGxbIGNvbnRhaW5lciAsIG1kZnIgLCBzcGNmciBdIDsKKyAqLworc3RhdGljIHZvaWQKK2RlZl9yb3V0aW5lX21vZGVsKHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIsIHNlcDo6TW9kaWZpZXIgbWRmciwgc2VwOjpTcGVjaWZpZXIgc3BjZnIpCit7CisgICAgQU5UTFIzX1VJTlQzMiBkZWZfcm91dGluZV9tb2RlbF9TdGFydEluZGV4OworCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGRlZl9yb3V0aW5lX21vZGVsX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDE1MSkpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDA2OToyOiAoICggJ3JvdXRpbmUnIHwgJ21hY3JvJyAoICdyb3V0aW5lJyApPyApIGRlZl9yb3V0aW5lX21vZGVsX2ltcGxbIGNvbnRhaW5lciAsIG1kZnIgLCBzcGNmciBdICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDA2OTo0OiAoICdyb3V0aW5lJyB8ICdtYWNybycgKCAncm91dGluZScgKT8gKSBkZWZfcm91dGluZV9tb2RlbF9pbXBsWyBjb250YWluZXIgLCBtZGZyICwgc3BjZnIgXQorICAgICAgICB7CisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0MDY5OjQ6ICggJ3JvdXRpbmUnIHwgJ21hY3JvJyAoICdyb3V0aW5lJyApPyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDM2MD0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAzNjc6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDM2MD0xOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzE4OgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQzNjA9MjsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMzYwOworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfcm91dGluZV9tb2RlbEV4OworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQzNjApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDA2OTo1OiAncm91dGluZScKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVCgzNjcsICZGT0xMT1dfMzY3X2luX2RlZl9yb3V0aW5lX21vZGVsMTMxMDcpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfcm91dGluZV9tb2RlbEV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDA3MDo2OiAnbWFjcm8nICggJ3JvdXRpbmUnICk/CisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoMzE4LCAmRk9MTE9XXzMxOF9pbl9kZWZfcm91dGluZV9tb2RlbDEzMTE0KTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3JvdXRpbmVfbW9kZWxFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgbWRmci5zZXROYXR1cmVNYWNybygpOyAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0MDcxOjY6ICggJ3JvdXRpbmUnICk/CisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDM1OT0yOworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzY3OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJCWFsdDM1OT0xOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQzNTkpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDA3MTo4OiAncm91dGluZScKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVCgzNjcsICZGT0xMT1dfMzY3X2luX2RlZl9yb3V0aW5lX21vZGVsMTMxMjcpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfcm91dGluZV9tb2RlbEV4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlZl9yb3V0aW5lX21vZGVsX2ltcGxfaW5fZGVmX3JvdXRpbmVfbW9kZWwxMzE0MSk7CisgICAgICAgICAgICBkZWZfcm91dGluZV9tb2RlbF9pbXBsKGN0eCwgY29udGFpbmVyLCBtZGZyLCBzcGNmcik7CisKKyAgICAgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfcm91dGluZV9tb2RlbEV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVkZWZfcm91dGluZV9tb2RlbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZWRlZl9yb3V0aW5lX21vZGVsRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgxNTEsIGRlZl9yb3V0aW5lX21vZGVsX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBkZWZfcm91dGluZV9tb2RlbCAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBkZWZfcm91dGluZV9tb2RlbF9pbXBsCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0MDc3OjE6IGRlZl9yb3V0aW5lX21vZGVsX2ltcGxbIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lciAsXG5cdFx0c2VwOjpNb2RpZmllciBtZGZyICwgc2VwOjpTcGVjaWZpZXIgc3BjZnIgXSA6IElEICggZGVmX3JvdXRpbmVfcGFyYW1ldGVyc1sgKl9DUFJfIF0gKT8gKCAoICctLT4nIHwgJ3JldHVybnM6JyApIGRlZl9yb3V0aW5lX3JldHVybnNbICpfQ1BSXyBdICk/IGJzPSBibG9ja19zdGF0ZW1lbnQgOworICovCitzdGF0aWMgdm9pZAorZGVmX3JvdXRpbmVfbW9kZWxfaW1wbChwZm1sUGFyc2VyIGN0eCwgc2VwOjpNYWNoaW5lICogY29udGFpbmVyLCBzZXA6Ok1vZGlmaWVyIG1kZnIsIHNlcDo6U3BlY2lmaWVyIHNwY2ZyKQoreworICAgIEFOVExSM19VSU5UMzIgZGVmX3JvdXRpbmVfbW9kZWxfaW1wbF9TdGFydEluZGV4OworCisgICAgcEFOVExSM19DT01NT05fVE9LRU4gICAgSUQxMDsKKyAgICBzZXA6OkJGQ29kZSBiczsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfYnMKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2JzIHNlcDo6QkZDb2RlCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgZGVmX3JvdXRpbmVfbW9kZWxfaW1wbF9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisKKyAgICAJU0FWRV9SVUxFX0JFR0lOX0xPQ0FUSU9OOworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgxNTIpKSApCisgICAgeworICAgICAgICB7CisKKyAgICAgICAgICAgIAlTRVRfUlVMRV9MT0NBVElPTiggX0NQUl8gKTsKKworICAgICAgICAgICAgCVBPUF9DVFg7CisKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICBJRDEwICAgICAgID0gTlVMTDsKKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDA4ODoyOiAoIElEICggZGVmX3JvdXRpbmVfcGFyYW1ldGVyc1sgKl9DUFJfIF0gKT8gKCAoICctLT4nIHwgJ3JldHVybnM6JyApIGRlZl9yb3V0aW5lX3JldHVybnNbICpfQ1BSXyBdICk/IGJzPSBibG9ja19zdGF0ZW1lbnQgKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0MDg4OjQ6IElEICggZGVmX3JvdXRpbmVfcGFyYW1ldGVyc1sgKl9DUFJfIF0gKT8gKCAoICctLT4nIHwgJ3JldHVybnM6JyApIGRlZl9yb3V0aW5lX3JldHVybnNbICpfQ1BSXyBdICk/IGJzPSBibG9ja19zdGF0ZW1lbnQKKyAgICAgICAgeworICAgICAgICAgICAgSUQxMCA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTikgTUFUQ0hUKElELCAmRk9MTE9XX0lEX2luX2RlZl9yb3V0aW5lX21vZGVsX2ltcGwxMzE2NSk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9yb3V0aW5lX21vZGVsX2ltcGxFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIAkgIAlQVVNIX0NUWF9DUFIoIHNlcDo6Um91dGluZTo6bmV3RGVmaW5lKAorICAgICAgICAgICAgICAgIAkgIAkJCWNvbnRhaW5lciwgbWRmciwgc3BjZnIsIFNUUigoSUQxMC0+Z2V0VGV4dChJRDEwKSktPmNoYXJzKSkgKTsKKworICAgICAgICAgICAgICAgIAkJY29udGFpbmVyLT5zYXZlT3duZWRFbGVtZW50KCBfQ1BSXyApOworICAgICAgICAgICAgICAgIAkgIAorICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQwOTY6NDogKCBkZWZfcm91dGluZV9wYXJhbWV0ZXJzWyAqX0NQUl8gXSApPworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQzNjE9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIExQQVJFTjoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQzNjE9MTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MzYxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQwOTY6NjogZGVmX3JvdXRpbmVfcGFyYW1ldGVyc1sgKl9DUFJfIF0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX3JvdXRpbmVfcGFyYW1ldGVyc19pbl9kZWZfcm91dGluZV9tb2RlbF9pbXBsMTMxNzgpOworICAgICAgICAgICAgCSAgICAgICAgZGVmX3JvdXRpbmVfcGFyYW1ldGVycyhjdHgsICpfQ1BSXyk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfcm91dGluZV9tb2RlbF9pbXBsRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQwOTc6NDogKCAoICctLT4nIHwgJ3JldHVybnM6JyApIGRlZl9yb3V0aW5lX3JldHVybnNbICpfQ1BSXyBdICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDM2Mj0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTYzOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM2NToKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQzNjI9MTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MzYyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQwOTc6NjogKCAnLS0+JyB8ICdyZXR1cm5zOicgKSBkZWZfcm91dGluZV9yZXR1cm5zWyAqX0NQUl8gXQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBpZiAoIExBKDEpID09IDE2MyB8fCBMQSgxKSA9PSAzNjUgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIENPTlNVTUUoKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBQRVJST1JSRUNPVkVSWT1BTlRMUjNfRkFMU0U7CisgICAgICAgICAgICAJICAgICAgICAgICAgRkFJTEVERkxBRz1BTlRMUjNfRkFMU0U7CisKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGVsc2UKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19NSVNNQVRDSEVEX1NFVF9FWENFUFRJT047CisgICAgICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT5uYW1lICAgICAgICAgPSAodm9pZCAqKUFOVExSM19NSVNNQVRDSEVEX1NFVF9OQU1FOworICAgICAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+ZXhwZWN0aW5nU2V0ID0gTlVMTDsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9yb3V0aW5lX21vZGVsX2ltcGxFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfcm91dGluZV9yZXR1cm5zX2luX2RlZl9yb3V0aW5lX21vZGVsX2ltcGwxMzIwMCk7CisgICAgICAgICAgICAJICAgICAgICBkZWZfcm91dGluZV9yZXR1cm5zKGN0eCwgKl9DUFJfKTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9yb3V0aW5lX21vZGVsX2ltcGxFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX2RlZl9yb3V0aW5lX21vZGVsX2ltcGwxMzIxMik7CisgICAgICAgICAgICBicz1ibG9ja19zdGF0ZW1lbnQoY3R4KTsKKworICAgICAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9yb3V0aW5lX21vZGVsX2ltcGxFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgX0NQUl8tPnNldENvZGUoYnMKKyAgICAgICAgICAgICAgICApOyAKKyAgICAgICAgICAgIH0KKworCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZWRlZl9yb3V0aW5lX21vZGVsX2ltcGxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVkZWZfcm91dGluZV9tb2RlbF9pbXBsRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIAlTRVRfUlVMRV9MT0NBVElPTiggX0NQUl8gKTsKKworICAgICAgICAgICAgICAgICAgICAJUE9QX0NUWDsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgxNTIsIGRlZl9yb3V0aW5lX21vZGVsX2ltcGxfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGRlZl9yb3V0aW5lX21vZGVsX2ltcGwgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgZGVmX3JvdXRpbmVfcGFyYW1ldGVycworICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDEwMzoxOiBkZWZfcm91dGluZV9wYXJhbWV0ZXJzWyBzZXA6OlJvdXRpbmUgJiByb3V0aW5lIF0gOiBMUEFSRU4gKCBkZWZfcm91dGluZV9wYXJhbV9hdG9tWyByb3V0aW5lICwgb2Zmc2V0KysgXSAoIENPTU1BIGRlZl9yb3V0aW5lX3BhcmFtX2F0b21bIHJvdXRpbmUgLCBvZmZzZXQrKyBdICkqICk/IFJQQVJFTiA7CisgKi8KK3N0YXRpYyB2b2lkCitkZWZfcm91dGluZV9wYXJhbWV0ZXJzKHBmbWxQYXJzZXIgY3R4LCBzZXA6OlJvdXRpbmUgJiByb3V0aW5lKQoreworICAgIEFOVExSM19VSU5UMzIgZGVmX3JvdXRpbmVfcGFyYW1ldGVyc19TdGFydEluZGV4OworCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGRlZl9yb3V0aW5lX3BhcmFtZXRlcnNfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworCisgICAgCXNlcDo6YXZtX3NpemVfdCBvZmZzZXQgPSAwOworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgxNTMpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQxMDc6MjogKCBMUEFSRU4gKCBkZWZfcm91dGluZV9wYXJhbV9hdG9tWyByb3V0aW5lICwgb2Zmc2V0KysgXSAoIENPTU1BIGRlZl9yb3V0aW5lX3BhcmFtX2F0b21bIHJvdXRpbmUgLCBvZmZzZXQrKyBdICkqICk/IFJQQVJFTiApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQxMDc6NDogTFBBUkVOICggZGVmX3JvdXRpbmVfcGFyYW1fYXRvbVsgcm91dGluZSAsIG9mZnNldCsrIF0gKCBDT01NQSBkZWZfcm91dGluZV9wYXJhbV9hdG9tWyByb3V0aW5lICwgb2Zmc2V0KysgXSApKiApPyBSUEFSRU4KKyAgICAgICAgeworICAgICAgICAgICAgIE1BVENIVChMUEFSRU4sICZGT0xMT1dfTFBBUkVOX2luX2RlZl9yb3V0aW5lX3BhcmFtZXRlcnMxMzIzMyk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9yb3V0aW5lX3BhcmFtZXRlcnNFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQxMDg6NzogKCBkZWZfcm91dGluZV9wYXJhbV9hdG9tWyByb3V0aW5lICwgb2Zmc2V0KysgXSAoIENPTU1BIGRlZl9yb3V0aW5lX3BhcmFtX2F0b21bIHJvdXRpbmUgLCBvZmZzZXQrKyBdICkqICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDM2ND0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQVNTSUdOX1JFRjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCQU5EOgorICAgICAgICAgICAgICAgICAgICBjYXNlIElEOgorICAgICAgICAgICAgICAgICAgICBjYXNlIExURToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY2OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQzOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDI0NToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDY6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ5OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDI1NDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNTU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjU5OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDI2MToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNjI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjY0OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDI3MDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNzE6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjgxOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDI4MjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyODM6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjk1OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDI5ODoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzMDU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzA5OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDMxMDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzMTE6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzE1OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDMxNjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzMTc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzE4OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDMyMDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzI2OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDMyOToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzMzM6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzM1OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM0MToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzNDQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzQ1OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM0NjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzNTc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzU4OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM2MDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzNjE6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzY0OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM3MDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzNzM6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzc0OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM4NzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzOTI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzk5OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDQwMDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDE6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDAyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDQwNToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDA4OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDQwOToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0MTI6CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJYWx0MzY0PTE7CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDM2NCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0MTA4Ojk6IGRlZl9yb3V0aW5lX3BhcmFtX2F0b21bIHJvdXRpbmUgLCBvZmZzZXQrKyBdICggQ09NTUEgZGVmX3JvdXRpbmVfcGFyYW1fYXRvbVsgcm91dGluZSAsIG9mZnNldCsrIF0gKSoKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX3JvdXRpbmVfcGFyYW1fYXRvbV9pbl9kZWZfcm91dGluZV9wYXJhbWV0ZXJzMTMyNDMpOworICAgICAgICAgICAgCSAgICAgICAgZGVmX3JvdXRpbmVfcGFyYW1fYXRvbShjdHgsIHJvdXRpbmUsIG9mZnNldCsrKTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9yb3V0aW5lX3BhcmFtZXRlcnNFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQxMTA6NzogKCBDT01NQSBkZWZfcm91dGluZV9wYXJhbV9hdG9tWyByb3V0aW5lICwgb2Zmc2V0KysgXSApKgorCisgICAgICAgICAgICAJICAgICAgICBmb3IgKDs7KQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQzNjM9MjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgQ09NTUE6CisgICAgICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCWFsdDM2Mz0xOworICAgICAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQzNjMpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDExMDo5OiBDT01NQSBkZWZfcm91dGluZV9wYXJhbV9hdG9tWyByb3V0aW5lICwgb2Zmc2V0KysgXQorICAgICAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKENPTU1BLCAmRk9MTE9XX0NPTU1BX2luX2RlZl9yb3V0aW5lX3BhcmFtZXRlcnMxMzI1NSk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9yb3V0aW5lX3BhcmFtZXRlcnNFeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlZl9yb3V0aW5lX3BhcmFtX2F0b21faW5fZGVmX3JvdXRpbmVfcGFyYW1ldGVyczEzMjU3KTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGRlZl9yb3V0aW5lX3BhcmFtX2F0b20oY3R4LCByb3V0aW5lLCBvZmZzZXQrKyk7CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfcm91dGluZV9wYXJhbWV0ZXJzRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAgICAgCSAgICAgICAgCSAgICBnb3RvIGxvb3AzNjM7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBsb29wMzYzOiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgTUFUQ0hUKFJQQVJFTiwgJkZPTExPV19SUEFSRU5faW5fZGVmX3JvdXRpbmVfcGFyYW1ldGVyczEzMjY5KTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX3JvdXRpbmVfcGFyYW1ldGVyc0V4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVkZWZfcm91dGluZV9wYXJhbWV0ZXJzRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlZGVmX3JvdXRpbmVfcGFyYW1ldGVyc0V4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTUzLCBkZWZfcm91dGluZV9wYXJhbWV0ZXJzX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBkZWZfcm91dGluZV9wYXJhbWV0ZXJzICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGRlZl9yb3V0aW5lX3BhcmFtX2F0b20KKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQxMTQ6MTogZGVmX3JvdXRpbmVfcGFyYW1fYXRvbVsgc2VwOjpSb3V0aW5lICYgcm91dGluZSAsIHNlcDo6YXZtX3NpemVfdCBvZmZzZXQgXSA6ICggKCAoIG1vZGlmaWVyX3BhcmFtICk/IHR5cGVfdmFyIElEICk9PiAobT0gbW9kaWZpZXJfcGFyYW0gKT8gdHY9IHR5cGVfdmFyIGlkPSBJRCB8aWQ9IElEICkgKGl2PSBpbml0aWFsX3ZhbHVlICk/IDsKKyAqLworc3RhdGljIHZvaWQKK2RlZl9yb3V0aW5lX3BhcmFtX2F0b20ocGZtbFBhcnNlciBjdHgsIHNlcDo6Um91dGluZSAmIHJvdXRpbmUsIHNlcDo6YXZtX3NpemVfdCBvZmZzZXQpCit7CisgICAgQU5UTFIzX1VJTlQzMiBkZWZfcm91dGluZV9wYXJhbV9hdG9tX1N0YXJ0SW5kZXg7CisKKyAgICBwQU5UTFIzX0NPTU1PTl9UT0tFTiAgICBpZDsKKyAgICBzZXA6Ok1vZGlmaWVyIG07CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX20KKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX20gc2VwOjpNb2RpZmllcgorCisgICAgc2VwOjpCRiB0djsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfdHYKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX3R2IHNlcDo6QkYKKworICAgIHNlcDo6QkYgaXY7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2l2CisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9pdiBzZXA6OkJGCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgZGVmX3JvdXRpbmVfcGFyYW1fYXRvbV9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisKKyAgICAJc2VwOjpCRiB2YXJpYWJsZTsKKyAgICAJc2VwOjpWYXJpYWJsZSAqIHBhcmFtOworICAgIAlzZXA6Ok1hY2hpbmUgKiBtYWNoaW5lID0gcm91dGluZS5nZXRDb250YWluZXJNYWNoaW5lKCk7CisgICAgCXNlcDo6QkYgcGFyYW1UID0gc2VwOjpUeXBlTWFuYWdlcjo6VU5JVkVSU0FMOworICAgIAlzZXA6Ok1vZGlmaWVyIG1kZnIgPSBzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9QQVJBTUVURVJfTU9ESUZJRVI7CisgICAgCW1kZnIuYWRkRmVhdHVyZUtpbmQoIHNlcDo6TW9kaWZpZXI6OkZFQVRVUkVfVFJBTlNJRU5UX0tJTkQgKTsKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTU0KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgaWQgICAgICAgPSBOVUxMOworCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0MTI0OjI6ICggKCAoICggbW9kaWZpZXJfcGFyYW0gKT8gdHlwZV92YXIgSUQgKT0+IChtPSBtb2RpZmllcl9wYXJhbSApPyB0dj0gdHlwZV92YXIgaWQ9IElEIHxpZD0gSUQgKSAoaXY9IGluaXRpYWxfdmFsdWUgKT8gKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0MTI0OjQ6ICggKCAoIG1vZGlmaWVyX3BhcmFtICk/IHR5cGVfdmFyIElEICk9PiAobT0gbW9kaWZpZXJfcGFyYW0gKT8gdHY9IHR5cGVfdmFyIGlkPSBJRCB8aWQ9IElEICkgKGl2PSBpbml0aWFsX3ZhbHVlICk/CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQxMjQ6NDogKCAoICggbW9kaWZpZXJfcGFyYW0gKT8gdHlwZV92YXIgSUQgKT0+IChtPSBtb2RpZmllcl9wYXJhbSApPyB0dj0gdHlwZV92YXIgaWQ9IElEIHxpZD0gSUQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQzNjY9MjsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTM2Nl8wID0gTEEoMSk7CisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQ2MzZfZm1sKGN0eCkpICYmIChMQTM2Nl8wID09IDE2NCB8fCBMQTM2Nl8wID09IDI5NSB8fCBMQTM2Nl8wID09IDMwNSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM2Nj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDYzNl9mbWwoY3R4KSkgJiYgKExBMzY2XzAgPT0gQVNTSUdOX1JFRiB8fCBMQTM2Nl8wID09IDMzNSB8fCBMQTM2Nl8wID09IDM0MSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM2Nj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDYzNl9mbWwoY3R4KSkgJiYgKExBMzY2XzAgPT0gMTY2IHx8IExBMzY2XzAgPT0gMjk4KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzY2PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNjM2X2ZtbChjdHgpKSAmJiAoTEEzNjZfMCA9PSBMVEUgfHwgTEEzNjZfMCA9PSAzNjQpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzNjY9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ2MzZfZm1sKGN0eCkpICYmIChMQTM2Nl8wID09IDI4MikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM2Nj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDYzNl9mbWwoY3R4KSkgJiYgKExBMzY2XzAgPT0gMjYyKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzY2PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNjM2X2ZtbChjdHgpKSAmJiAoTEEzNjZfMCA9PSBCQU5EIHx8IExBMzY2XzAgPT0gMzYxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzY2PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNjM2X2ZtbChjdHgpKSAmJiAoTEEzNjZfMCA9PSAzMTgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzNjY9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ2MzZfZm1sKGN0eCkpICYmIChMQTM2Nl8wID09IDI0MykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM2Nj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDYzNl9mbWwoY3R4KSkgJiYgKCgoTEEzNjZfMCA+PSAyNDUpICYmIChMQTM2Nl8wIDw9IDI0NikpKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzY2PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNjM2X2ZtbChjdHgpKSAmJiAoKChMQTM2Nl8wID49IDMwOSkgJiYgKExBMzY2XzAgPD0gMzEwKSkpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzNjY9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ2MzZfZm1sKGN0eCkpICYmICgoKExBMzY2XzAgPj0gNDAxKSAmJiAoTEEzNjZfMCA8PSA0MDIpKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM2Nj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDYzNl9mbWwoY3R4KSkgJiYgKCgoTEEzNjZfMCA+PSAzNDUpICYmIChMQTM2Nl8wIDw9IDM0NikpKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzY2PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNjM2X2ZtbChjdHgpKSAmJiAoKChMQTM2Nl8wID49IDM1NykgJiYgKExBMzY2XzAgPD0gMzU4KSkpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzNjY9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ2MzZfZm1sKGN0eCkpICYmICgoKExBMzY2XzAgPj0gNDA3KSAmJiAoTEEzNjZfMCA8PSA0MDgpKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM2Nj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDYzNl9mbWwoY3R4KSkgJiYgKExBMzY2XzAgPT0gMjgzKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzY2PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNjM2X2ZtbChjdHgpKSAmJiAoTEEzNjZfMCA9PSA0MDApKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzNjY9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ2MzZfZm1sKGN0eCkpICYmIChMQTM2Nl8wID09IDI3MCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM2Nj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDYzNl9mbWwoY3R4KSkgJiYgKExBMzY2XzAgPT0gMzk5KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzY2PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNjM2X2ZtbChjdHgpKSAmJiAoTEEzNjZfMCA9PSAzNjApKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzNjY9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ2MzZfZm1sKGN0eCkpICYmIChMQTM2Nl8wID09IDQwOSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM2Nj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDYzNl9mbWwoY3R4KSkgJiYgKExBMzY2XzAgPT0gMjU5KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzY2PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNjM2X2ZtbChjdHgpKSAmJiAoTEEzNjZfMCA9PSAzOTIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzNjY9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ2MzZfZm1sKGN0eCkpICYmIChMQTM2Nl8wID09IDI2NCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM2Nj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDYzNl9mbWwoY3R4KSkgJiYgKExBMzY2XzAgPT0gMjcxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzY2PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNjM2X2ZtbChjdHgpKSAmJiAoTEEzNjZfMCA9PSAyNTQpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzNjY9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ2MzZfZm1sKGN0eCkpICYmIChMQTM2Nl8wID09IDI1NSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM2Nj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDYzNl9mbWwoY3R4KSkgJiYgKExBMzY2XzAgPT0gMzg3KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzY2PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNjM2X2ZtbChjdHgpKSAmJiAoTEEzNjZfMCA9PSAzMzMpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzNjY9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ2MzZfZm1sKGN0eCkpICYmIChMQTM2Nl8wID09IDI0MikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM2Nj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDYzNl9mbWwoY3R4KSkgJiYgKExBMzY2XzAgPT0gMzQ0KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzY2PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNjM2X2ZtbChjdHgpKSAmJiAoTEEzNjZfMCA9PSAyNDkpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzNjY9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ2MzZfZm1sKGN0eCkpICYmIChMQTM2Nl8wID09IDMyMCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM2Nj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDYzNl9mbWwoY3R4KSkgJiYgKExBMzY2XzAgPT0gMzc0KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzY2PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNjM2X2ZtbChjdHgpKSAmJiAoTEEzNjZfMCA9PSAyNjEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzNjY9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ2MzZfZm1sKGN0eCkpICYmIChMQTM2Nl8wID09IDMxNykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM2Nj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDYzNl9mbWwoY3R4KSkgJiYgKExBMzY2XzAgPT0gNDA1KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzY2PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTM2Nl8wID09IElEKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTM2Nl8zOCA9IExBKDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQ2MzZfZm1sKGN0eCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzY2PTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoQU5UTFIzX1RSVUUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzY2PTI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAzNjY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMzg7CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfcm91dGluZV9wYXJhbV9hdG9tRXg7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNjM2X2ZtbChjdHgpKSAmJiAoTEEzNjZfMCA9PSAyNDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzNjY9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ2MzZfZm1sKGN0eCkpICYmIChMQTM2Nl8wID09IDQxMikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM2Nj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDYzNl9mbWwoY3R4KSkgJiYgKExBMzY2XzAgPT0gMzcwKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzY2PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNjM2X2ZtbChjdHgpKSAmJiAoTEEzNjZfMCA9PSAzMTYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzNjY9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ2MzZfZm1sKGN0eCkpICYmIChMQTM2Nl8wID09IDI4MSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM2Nj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDYzNl9mbWwoY3R4KSkgJiYgKExBMzY2XzAgPT0gMzE1KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzY2PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNjM2X2ZtbChjdHgpKSAmJiAoTEEzNjZfMCA9PSAzMjUpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzNjY9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ2MzZfZm1sKGN0eCkpICYmIChMQTM2Nl8wID09IDMyNikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM2Nj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDYzNl9mbWwoY3R4KSkgJiYgKExBMzY2XzAgPT0gMzczKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzY2PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNjM2X2ZtbChjdHgpKSAmJiAoTEEzNjZfMCA9PSAzMjkpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzNjY9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ2MzZfZm1sKGN0eCkpICYmIChMQTM2Nl8wID09IDMxMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM2Nj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMzY2OworICAgICAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9yb3V0aW5lX3BhcmFtX2F0b21FeDsKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MzY2KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQxMjQ6NjogKCAoIG1vZGlmaWVyX3BhcmFtICk/IHR5cGVfdmFyIElEICk9PiAobT0gbW9kaWZpZXJfcGFyYW0gKT8gdHY9IHR5cGVfdmFyIGlkPSBJRAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0MTI1OjY6IChtPSBtb2RpZmllcl9wYXJhbSApPworICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQzNjU9MjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIEFTU0lHTl9SRUY6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgQkFORDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBMVEU6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMTY0OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDE2NjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAyNDM6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMjYyOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDI4MjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAyOTU6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMjk4OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDMwNToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzMTg6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzM1OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDM0MToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzNjE6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzY0OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJCWFsdDM2NT0xOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQzNjUpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDEyNTo4OiBtPSBtb2RpZmllcl9wYXJhbQorICAgICAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19tb2RpZmllcl9wYXJhbV9pbl9kZWZfcm91dGluZV9wYXJhbV9hdG9tMTMzMTIpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgbT1tb2RpZmllcl9wYXJhbShjdHgpOworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3JvdXRpbmVfcGFyYW1fYXRvbUV4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICBtZGZyLm92ZXJyaWRlX2lmZGVmKCBtCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICk7IAorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfdHlwZV92YXJfaW5fZGVmX3JvdXRpbmVfcGFyYW1fYXRvbTEzMzI2KTsKKyAgICAgICAgICAgIAkgICAgICAgIHR2PXR5cGVfdmFyKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfcm91dGluZV9wYXJhbV9hdG9tRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIHBhcmFtVCA9IHR2CisgICAgICAgICAgICAJICAgICAgICAgICAgOyAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZCA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTikgTUFUQ0hUKElELCAmRk9MTE9XX0lEX2luX2RlZl9yb3V0aW5lX3BhcmFtX2F0b20xMzMzMyk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9yb3V0aW5lX3BhcmFtX2F0b21FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDI6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQxMjg6NjogaWQ9IElECisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlkID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoSUQsICZGT0xMT1dfSURfaW5fZGVmX3JvdXRpbmVfcGFyYW1fYXRvbTEzMzQzKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3JvdXRpbmVfcGFyYW1fYXRvbUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworCisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAJdmFyaWFibGUgPSBzZXA6OlBhcnNlclV0aWw6OmdldFZhcmlhYmxlKFNUUigoaWQtPmdldFRleHQoaWQpKS0+Y2hhcnMpICwgMSk7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAJaWYoIHZhcmlhYmxlLmludmFsaWQoKSApCisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAJeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgCQlzZXA6OlBhcnNlclV0aWw6OmF2bV9zeW50YXhfZXJyb3IoCisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAJCQkiZGVmX3JvdXRpbmVfcGFyYW1fYXRvbTo+ICIgKyByb3V0aW5lLnN0cigpLCAoaWQtPmdldExpbmUoaWQpKSApCisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAJCQkJPDwgIlVuZm91bmQgbWFjaGluZSBwYXJhbSdzIHZhcmlhYmxlIDwgIgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkJCQkJPDwgU1RSKChpZC0+Z2V0VGV4dChpZCkpLT5jaGFycykKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJCQkJCTw8ICIgPiBpbiByb3V0aW5lIGhlYWRlciA8ICIgPDwgIiA+IgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkJCQkJPDwgc2VwOjpQYXJzZXJVdGlsOjpTWU5UQVhfRVJST1JfRU9MOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgCSAgICBpZiggdmFyaWFibGUudmFsaWQoKSApCisgICAgICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAgICAgCQkgIAlyb3V0aW5lLnNhdmVQYXJhbWV0ZXIoIHBhcmFtID0gbmV3IHNlcDo6VmFyaWFibGUoICZyb3V0aW5lLAorICAgICAgICAgICAgICAgIAkJICAJCQlzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9NQUNST19NT0RJRklFUiwKKyAgICAgICAgICAgICAgICAJCSAgCQkJdmFyaWFibGUudG9fcHRyPCBzZXA6OlZhcmlhYmxlID4oKS0+Z2V0VHlwZSgpLAorICAgICAgICAgICAgICAgIAkJICAJCQlTVFIoKGlkLT5nZXRUZXh0KGlkKSktPmNoYXJzKSkgKTsKKyAgICAgICAgICAgICAgICAJCSAgCXBhcmFtLT5zZXRPZmZzZXQoIG9mZnNldCApOworICAgICAgICAgICAgICAgIAkgICAgCXBhcmFtLT5zZXRCaW5kaW5nKCB2YXJpYWJsZSApOworICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgIAkgICAgZWxzZQorICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgIAkgICAgCXBhcmFtID0gbmV3IHNlcDo6VmFyaWFibGUoJnJvdXRpbmUsCisgICAgICAgICAgICAgICAgCSAgICAJCQltZGZyLCAKKyAgICAgICAgICAgICAgICB0dgorICAgICAgICAgICAgICAgICwgU1RSKChpZC0+Z2V0VGV4dChpZCkpLT5jaGFycykpOworICAgICAgICAgICAgICAgIAkJICAJcGFyYW0tPnNldE9mZnNldCggb2Zmc2V0ICk7CisKKyAgICAgICAgICAgICAgICAJCSAgCS8vIE9ubHkgZm9yIFJvdXRpbmUgZGVzaWduIGFzIFBST1RPVFlQRSBhLmsuYS4gcHJpbWl0aXZlIHJvdXRpbmUKKyAgICAgICAgICAgICAgICAJCSAgCWlmKCByb3V0aW5lLmdldFNwZWNpZmllcigpLmlzRGVzaWduUHJvdG90eXBlU3RhdGljKCkgKQorICAgICAgICAgICAgICAgIAkJICAJeworICAgICAgICAgICAgICAgIAkJCQlyb3V0aW5lLmFwcGVuZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAJCSAgCQkJbWFjaGluZS0+Z2V0UHJvcGVydHlQYXJ0KCkuc2F2ZU93bmVkVmFyaWFibGUoIHBhcmFtICkgKTsKKyAgICAgICAgICAgICAgICAJCQl9CisgICAgICAgICAgICAgICAgCQkJZWxzZQorICAgICAgICAgICAgICAgIAkJCXsKKyAgICAgICAgICAgICAgICAJCQkJcm91dGluZS5zYXZlUGFyYW1ldGVyKCBwYXJhbSApOworICAgICAgICAgICAgICAgIAkJCX0KKyAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAJICAKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0MTcwOjQ6IChpdj0gaW5pdGlhbF92YWx1ZSApPworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQzNjc9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEFTU0lHTjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMUEFSRU46CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJYWx0MzY3PTE7CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDM2NykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0MTcwOjY6IGl2PSBpbml0aWFsX3ZhbHVlCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2luaXRpYWxfdmFsdWVfaW5fZGVmX3JvdXRpbmVfcGFyYW1fYXRvbTEzMzY5KTsKKyAgICAgICAgICAgIAkgICAgICAgIGl2PWluaXRpYWxfdmFsdWUoY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9yb3V0aW5lX3BhcmFtX2F0b21FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgcGFyYW0tPnNldFZhbHVlKGl2CisgICAgICAgICAgICAJICAgICAgICAgICAgKTsgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZWRlZl9yb3V0aW5lX3BhcmFtX2F0b21FeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVkZWZfcm91dGluZV9wYXJhbV9hdG9tRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgxNTQsIGRlZl9yb3V0aW5lX3BhcmFtX2F0b21fU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGRlZl9yb3V0aW5lX3BhcmFtX2F0b20gKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgZGVmX3JvdXRpbmVfcmV0dXJucworICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDE3NDoxOiBkZWZfcm91dGluZV9yZXR1cm5zWyBzZXA6OlJvdXRpbmUgJiByb3V0aW5lIF0gOiAoIExQQVJFTiBkZWZfcm91dGluZV9yZXR1cm5zX2F0b21bIHJvdXRpbmUgLCBvZmZzZXQrKyBdICggQ09NTUEgZGVmX3JvdXRpbmVfcmV0dXJuc19hdG9tWyByb3V0aW5lICwgb2Zmc2V0KysgXSApKiBSUEFSRU4gfHR2PSB0eXBlX3ZhciAoaXY9IGluaXRpYWxfdmFsdWUgKT8gKTsKKyAqLworc3RhdGljIHZvaWQKK2RlZl9yb3V0aW5lX3JldHVybnMocGZtbFBhcnNlciBjdHgsIHNlcDo6Um91dGluZSAmIHJvdXRpbmUpCit7CisgICAgQU5UTFIzX1VJTlQzMiBkZWZfcm91dGluZV9yZXR1cm5zX1N0YXJ0SW5kZXg7CisKKyAgICBzZXA6OkJGIHR2OworICAgICN1bmRlZglSRVRVUk5fVFlQRV90dgorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfdHYgc2VwOjpCRgorCisgICAgc2VwOjpCRiBpdjsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfaXYKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2l2IHNlcDo6QkYKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBkZWZfcm91dGluZV9yZXR1cm5zX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKworICAgIAlzZXA6OkJGIHZhbHVlOworICAgIAlzZXA6OmF2bV9zaXplX3Qgb2Zmc2V0ID0gMDsKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTU1KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgeworICAgICAgICB7CisgICAgICAgICAgICAvLyAgL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDE3OToyOiAoIExQQVJFTiBkZWZfcm91dGluZV9yZXR1cm5zX2F0b21bIHJvdXRpbmUgLCBvZmZzZXQrKyBdICggQ09NTUEgZGVmX3JvdXRpbmVfcmV0dXJuc19hdG9tWyByb3V0aW5lICwgb2Zmc2V0KysgXSApKiBSUEFSRU4gfHR2PSB0eXBlX3ZhciAoaXY9IGluaXRpYWxfdmFsdWUgKT8gKQorCisgICAgICAgICAgICBBTlRMUjNfVUlOVDMyIGFsdDM3MDsKKworICAgICAgICAgICAgYWx0MzcwPTI7CisKKyAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgTFBBUkVOOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MzcwPTE7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgICAgIGNhc2UgMjQxOgorICAgICAgICAgICAgY2FzZSAyNDI6CisgICAgICAgICAgICBjYXNlIDI0NToKKyAgICAgICAgICAgIGNhc2UgMjQ2OgorICAgICAgICAgICAgY2FzZSAyNDk6CisgICAgICAgICAgICBjYXNlIDI1NDoKKyAgICAgICAgICAgIGNhc2UgMjU1OgorICAgICAgICAgICAgY2FzZSAyNTk6CisgICAgICAgICAgICBjYXNlIDI2MToKKyAgICAgICAgICAgIGNhc2UgMjY0OgorICAgICAgICAgICAgY2FzZSAyNzA6CisgICAgICAgICAgICBjYXNlIDI3MToKKyAgICAgICAgICAgIGNhc2UgMjgxOgorICAgICAgICAgICAgY2FzZSAyODM6CisgICAgICAgICAgICBjYXNlIDMwOToKKyAgICAgICAgICAgIGNhc2UgMzEwOgorICAgICAgICAgICAgY2FzZSAzMTE6CisgICAgICAgICAgICBjYXNlIDMxNToKKyAgICAgICAgICAgIGNhc2UgMzE2OgorICAgICAgICAgICAgY2FzZSAzMTc6CisgICAgICAgICAgICBjYXNlIDMyMDoKKyAgICAgICAgICAgIGNhc2UgMzI1OgorICAgICAgICAgICAgY2FzZSAzMjY6CisgICAgICAgICAgICBjYXNlIDMyOToKKyAgICAgICAgICAgIGNhc2UgMzMzOgorICAgICAgICAgICAgY2FzZSAzNDQ6CisgICAgICAgICAgICBjYXNlIDM0NToKKyAgICAgICAgICAgIGNhc2UgMzQ2OgorICAgICAgICAgICAgY2FzZSAzNTc6CisgICAgICAgICAgICBjYXNlIDM1ODoKKyAgICAgICAgICAgIGNhc2UgMzYwOgorICAgICAgICAgICAgY2FzZSAzNzA6CisgICAgICAgICAgICBjYXNlIDM3MzoKKyAgICAgICAgICAgIGNhc2UgMzc0OgorICAgICAgICAgICAgY2FzZSAzODc6CisgICAgICAgICAgICBjYXNlIDM5MjoKKyAgICAgICAgICAgIGNhc2UgMzk5OgorICAgICAgICAgICAgY2FzZSA0MDA6CisgICAgICAgICAgICBjYXNlIDQwMToKKyAgICAgICAgICAgIGNhc2UgNDAyOgorICAgICAgICAgICAgY2FzZSA0MDU6CisgICAgICAgICAgICBjYXNlIDQwNzoKKyAgICAgICAgICAgIGNhc2UgNDA4OgorICAgICAgICAgICAgY2FzZSA0MDk6CisgICAgICAgICAgICBjYXNlIDQxMjoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDM3MD0yOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAzNzA7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfcm91dGluZV9yZXR1cm5zRXg7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQzNzApCisgICAgICAgICAgICB7CisgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDE3OTo0OiBMUEFSRU4gZGVmX3JvdXRpbmVfcmV0dXJuc19hdG9tWyByb3V0aW5lICwgb2Zmc2V0KysgXSAoIENPTU1BIGRlZl9yb3V0aW5lX3JldHVybnNfYXRvbVsgcm91dGluZSAsIG9mZnNldCsrIF0gKSogUlBBUkVOCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKExQQVJFTiwgJkZPTExPV19MUEFSRU5faW5fZGVmX3JvdXRpbmVfcmV0dXJuczEzMzkzKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3JvdXRpbmVfcmV0dXJuc0V4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX3JvdXRpbmVfcmV0dXJuc19hdG9tX2luX2RlZl9yb3V0aW5lX3JldHVybnMxMzQwMSk7CisgICAgICAgIAkgICAgICAgIGRlZl9yb3V0aW5lX3JldHVybnNfYXRvbShjdHgsIHJvdXRpbmUsIG9mZnNldCsrKTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3JvdXRpbmVfcmV0dXJuc0V4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDE4Mjo3OiAoIENPTU1BIGRlZl9yb3V0aW5lX3JldHVybnNfYXRvbVsgcm91dGluZSAsIG9mZnNldCsrIF0gKSoKKworICAgICAgICAJICAgICAgICBmb3IgKDs7KQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0MzY4PTI7CisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIENPTU1BOgorICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgIAkJYWx0MzY4PTE7CisgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0MzY4KQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQxODI6OTogQ09NTUEgZGVmX3JvdXRpbmVfcmV0dXJuc19hdG9tWyByb3V0aW5lICwgb2Zmc2V0KysgXQorICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChDT01NQSwgJkZPTExPV19DT01NQV9pbl9kZWZfcm91dGluZV9yZXR1cm5zMTM0MTMpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfcm91dGluZV9yZXR1cm5zRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfcm91dGluZV9yZXR1cm5zX2F0b21faW5fZGVmX3JvdXRpbmVfcmV0dXJuczEzNDE1KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgZGVmX3JvdXRpbmVfcmV0dXJuc19hdG9tKGN0eCwgcm91dGluZSwgb2Zmc2V0KyspOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfcm91dGluZV9yZXR1cm5zRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAJZGVmYXVsdDoKKyAgICAgICAgCSAgICAgICAgCSAgICBnb3RvIGxvb3AzNjg7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGxvb3AzNjg6IDsgLyogSnVtcCBvdXQgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKworCisgICAgICAgIAkgICAgICAgICBNQVRDSFQoUlBBUkVOLCAmRk9MTE9XX1JQQVJFTl9pbl9kZWZfcm91dGluZV9yZXR1cm5zMTM0MjQpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfcm91dGluZV9yZXR1cm5zRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0MTg1OjQ6IHR2PSB0eXBlX3ZhciAoaXY9IGluaXRpYWxfdmFsdWUgKT8KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3R5cGVfdmFyX2luX2RlZl9yb3V0aW5lX3JldHVybnMxMzQzMik7CisgICAgICAgIAkgICAgICAgIHR2PXR5cGVfdmFyKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9yb3V0aW5lX3JldHVybnNFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQxODU6MTY6IChpdj0gaW5pdGlhbF92YWx1ZSApPworICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0MzY5PTI7CisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBBU1NJR046CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBMUEFSRU46CisgICAgICAgIAkgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJCWFsdDM2OT0xOworICAgICAgICAJICAgICAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDM2OSkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0MTg1OjE4OiBpdj0gaW5pdGlhbF92YWx1ZQorICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfaW5pdGlhbF92YWx1ZV9pbl9kZWZfcm91dGluZV9yZXR1cm5zMTM0MzgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpdj1pbml0aWFsX3ZhbHVlKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9yb3V0aW5lX3JldHVybnNFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIHZhbHVlID0gaXYKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIDsgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKworICAgICAgICAJICAgICAgICAgICAgCQlzZXA6OlZhcmlhYmxlICogdmFyaWFibGU7CisgICAgICAgIAkgICAgICAgICAgICAJCXJvdXRpbmUuc2F2ZVJldHVybiggdmFyaWFibGUgPSBuZXcgc2VwOjpWYXJpYWJsZSggJnJvdXRpbmUsCisgICAgICAgIAkgICAgICAgICAgICAJCQkJc2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfUkVUVVJOX1BBUkFNRVRFUl9NT0RJRklFUiwKKyAgICAgICAgCSAgICAgICAgICAgIAkJCQl0dgorICAgICAgICAJICAgICAgICAgICAgLCAiIzAiLCB2YWx1ZSkgKTsKKyAgICAgICAgCSAgICAgICAgICAgIAkJdmFyaWFibGUtPnNldE9mZnNldCggb2Zmc2V0ICk7CisgICAgICAgIAkgICAgICAgICAgICAJCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVkZWZfcm91dGluZV9yZXR1cm5zRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlZGVmX3JvdXRpbmVfcmV0dXJuc0V4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTU1LCBkZWZfcm91dGluZV9yZXR1cm5zX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBkZWZfcm91dGluZV9yZXR1cm5zICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGRlZl9yb3V0aW5lX3JldHVybnNfYXRvbQorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDE5NjoxOiBkZWZfcm91dGluZV9yZXR1cm5zX2F0b21bIHNlcDo6Um91dGluZSAmIHJvdXRpbmUgLCBzZXA6OmF2bV9zaXplX3Qgb2Zmc2V0IF0gOiAoICggKCBtb2RpZmllcl9wYXJhbSApPyB0eXBlX3ZhciBJRCApPT4gKG09IG1vZGlmaWVyX3BhcmFtICk/IHR2PSB0eXBlX3ZhciBpZD0gSUQgfGlkPSBJRCApIChpdj0gaW5pdGlhbF92YWx1ZSApPyA7CisgKi8KK3N0YXRpYyB2b2lkCitkZWZfcm91dGluZV9yZXR1cm5zX2F0b20ocGZtbFBhcnNlciBjdHgsIHNlcDo6Um91dGluZSAmIHJvdXRpbmUsIHNlcDo6YXZtX3NpemVfdCBvZmZzZXQpCit7CisgICAgQU5UTFIzX1VJTlQzMiBkZWZfcm91dGluZV9yZXR1cm5zX2F0b21fU3RhcnRJbmRleDsKKworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIGlkOworICAgIHNlcDo6TW9kaWZpZXIgbTsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfbQorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfbSBzZXA6Ok1vZGlmaWVyCisKKyAgICBzZXA6OkJGIHR2OworICAgICN1bmRlZglSRVRVUk5fVFlQRV90dgorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfdHYgc2VwOjpCRgorCisgICAgc2VwOjpCRiBpdjsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfaXYKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2l2IHNlcDo6QkYKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBkZWZfcm91dGluZV9yZXR1cm5zX2F0b21fU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworCisgICAgCXNlcDo6QkYgdmFyaWFibGU7CisgICAgCXNlcDo6VmFyaWFibGUgKiBwYXJhbTsKKyAgICAJc2VwOjpNYWNoaW5lICogbWFjaGluZSA9IHJvdXRpbmUuZ2V0Q29udGFpbmVyTWFjaGluZSgpOworICAgIAlzZXA6OkJGIHBhcmFtVCA9IHNlcDo6VHlwZU1hbmFnZXI6OlVOSVZFUlNBTDsKKyAgICAJc2VwOjpNb2RpZmllciBtZGZyID0gc2VwOjpNb2RpZmllcjo6UFJPUEVSVFlfUkVUVVJOX1BBUkFNRVRFUl9NT0RJRklFUjsKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTU2KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgaWQgICAgICAgPSBOVUxMOworCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0MjA1OjI6ICggKCAoICggbW9kaWZpZXJfcGFyYW0gKT8gdHlwZV92YXIgSUQgKT0+IChtPSBtb2RpZmllcl9wYXJhbSApPyB0dj0gdHlwZV92YXIgaWQ9IElEIHxpZD0gSUQgKSAoaXY9IGluaXRpYWxfdmFsdWUgKT8gKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0MjA1OjQ6ICggKCAoIG1vZGlmaWVyX3BhcmFtICk/IHR5cGVfdmFyIElEICk9PiAobT0gbW9kaWZpZXJfcGFyYW0gKT8gdHY9IHR5cGVfdmFyIGlkPSBJRCB8aWQ9IElEICkgKGl2PSBpbml0aWFsX3ZhbHVlICk/CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQyMDU6NDogKCAoICggbW9kaWZpZXJfcGFyYW0gKT8gdHlwZV92YXIgSUQgKT0+IChtPSBtb2RpZmllcl9wYXJhbSApPyB0dj0gdHlwZV92YXIgaWQ9IElEIHxpZD0gSUQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQzNzI9MjsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTM3Ml8wID0gTEEoMSk7CisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQ2NDNfZm1sKGN0eCkpICYmIChMQTM3Ml8wID09IDE2NCB8fCBMQTM3Ml8wID09IDI5NSB8fCBMQTM3Ml8wID09IDMwNSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM3Mj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDY0M19mbWwoY3R4KSkgJiYgKExBMzcyXzAgPT0gQVNTSUdOX1JFRiB8fCBMQTM3Ml8wID09IDMzNSB8fCBMQTM3Ml8wID09IDM0MSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM3Mj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDY0M19mbWwoY3R4KSkgJiYgKExBMzcyXzAgPT0gMTY2IHx8IExBMzcyXzAgPT0gMjk4KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzcyPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNjQzX2ZtbChjdHgpKSAmJiAoTEEzNzJfMCA9PSBMVEUgfHwgTEEzNzJfMCA9PSAzNjQpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzNzI9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ2NDNfZm1sKGN0eCkpICYmIChMQTM3Ml8wID09IDI4MikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM3Mj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDY0M19mbWwoY3R4KSkgJiYgKExBMzcyXzAgPT0gMjYyKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzcyPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNjQzX2ZtbChjdHgpKSAmJiAoTEEzNzJfMCA9PSBCQU5EIHx8IExBMzcyXzAgPT0gMzYxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzcyPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNjQzX2ZtbChjdHgpKSAmJiAoTEEzNzJfMCA9PSAzMTgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzNzI9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ2NDNfZm1sKGN0eCkpICYmIChMQTM3Ml8wID09IDI0MykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM3Mj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDY0M19mbWwoY3R4KSkgJiYgKCgoTEEzNzJfMCA+PSAyNDUpICYmIChMQTM3Ml8wIDw9IDI0NikpKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzcyPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNjQzX2ZtbChjdHgpKSAmJiAoKChMQTM3Ml8wID49IDMwOSkgJiYgKExBMzcyXzAgPD0gMzEwKSkpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzNzI9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ2NDNfZm1sKGN0eCkpICYmICgoKExBMzcyXzAgPj0gNDAxKSAmJiAoTEEzNzJfMCA8PSA0MDIpKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM3Mj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDY0M19mbWwoY3R4KSkgJiYgKCgoTEEzNzJfMCA+PSAzNDUpICYmIChMQTM3Ml8wIDw9IDM0NikpKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzcyPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNjQzX2ZtbChjdHgpKSAmJiAoKChMQTM3Ml8wID49IDM1NykgJiYgKExBMzcyXzAgPD0gMzU4KSkpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzNzI9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ2NDNfZm1sKGN0eCkpICYmICgoKExBMzcyXzAgPj0gNDA3KSAmJiAoTEEzNzJfMCA8PSA0MDgpKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM3Mj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDY0M19mbWwoY3R4KSkgJiYgKExBMzcyXzAgPT0gMjgzKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzcyPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNjQzX2ZtbChjdHgpKSAmJiAoTEEzNzJfMCA9PSA0MDApKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzNzI9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ2NDNfZm1sKGN0eCkpICYmIChMQTM3Ml8wID09IDI3MCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM3Mj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDY0M19mbWwoY3R4KSkgJiYgKExBMzcyXzAgPT0gMzk5KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzcyPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNjQzX2ZtbChjdHgpKSAmJiAoTEEzNzJfMCA9PSAzNjApKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzNzI9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ2NDNfZm1sKGN0eCkpICYmIChMQTM3Ml8wID09IDQwOSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM3Mj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDY0M19mbWwoY3R4KSkgJiYgKExBMzcyXzAgPT0gMjU5KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzcyPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNjQzX2ZtbChjdHgpKSAmJiAoTEEzNzJfMCA9PSAzOTIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzNzI9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ2NDNfZm1sKGN0eCkpICYmIChMQTM3Ml8wID09IDI2NCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM3Mj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDY0M19mbWwoY3R4KSkgJiYgKExBMzcyXzAgPT0gMjcxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzcyPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNjQzX2ZtbChjdHgpKSAmJiAoTEEzNzJfMCA9PSAyNTQpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzNzI9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ2NDNfZm1sKGN0eCkpICYmIChMQTM3Ml8wID09IDI1NSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM3Mj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDY0M19mbWwoY3R4KSkgJiYgKExBMzcyXzAgPT0gMzg3KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzcyPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNjQzX2ZtbChjdHgpKSAmJiAoTEEzNzJfMCA9PSAzMzMpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzNzI9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ2NDNfZm1sKGN0eCkpICYmIChMQTM3Ml8wID09IDI0MikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM3Mj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDY0M19mbWwoY3R4KSkgJiYgKExBMzcyXzAgPT0gMzQ0KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzcyPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNjQzX2ZtbChjdHgpKSAmJiAoTEEzNzJfMCA9PSAyNDkpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzNzI9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ2NDNfZm1sKGN0eCkpICYmIChMQTM3Ml8wID09IDMyMCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM3Mj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDY0M19mbWwoY3R4KSkgJiYgKExBMzcyXzAgPT0gMzc0KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzcyPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNjQzX2ZtbChjdHgpKSAmJiAoTEEzNzJfMCA9PSAyNjEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzNzI9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ2NDNfZm1sKGN0eCkpICYmIChMQTM3Ml8wID09IDMxNykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM3Mj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDY0M19mbWwoY3R4KSkgJiYgKExBMzcyXzAgPT0gNDA1KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzcyPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTM3Ml8wID09IElEKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTM3Ml8zOCA9IExBKDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQ2NDNfZm1sKGN0eCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzcyPTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoQU5UTFIzX1RSVUUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzcyPTI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAzNzI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMzg7CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfcm91dGluZV9yZXR1cm5zX2F0b21FeDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ2NDNfZm1sKGN0eCkpICYmIChMQTM3Ml8wID09IDI0MSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM3Mj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDY0M19mbWwoY3R4KSkgJiYgKExBMzcyXzAgPT0gNDEyKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzcyPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNjQzX2ZtbChjdHgpKSAmJiAoTEEzNzJfMCA9PSAzNzApKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzNzI9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ2NDNfZm1sKGN0eCkpICYmIChMQTM3Ml8wID09IDMxNikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM3Mj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDY0M19mbWwoY3R4KSkgJiYgKExBMzcyXzAgPT0gMjgxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzcyPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNjQzX2ZtbChjdHgpKSAmJiAoTEEzNzJfMCA9PSAzMTUpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzNzI9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ2NDNfZm1sKGN0eCkpICYmIChMQTM3Ml8wID09IDMyNSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM3Mj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDY0M19mbWwoY3R4KSkgJiYgKExBMzcyXzAgPT0gMzI2KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzcyPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzeW5wcmVkNjQzX2ZtbChjdHgpKSAmJiAoTEEzNzJfMCA9PSAzNzMpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzNzI9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHN5bnByZWQ2NDNfZm1sKGN0eCkpICYmIChMQTM3Ml8wID09IDMyOSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM3Mj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDY0M19mbWwoY3R4KSkgJiYgKExBMzcyXzAgPT0gMzExKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzcyPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAzNzI7CisgICAgICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBydWxlZGVmX3JvdXRpbmVfcmV0dXJuc19hdG9tRXg7CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDM3MikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0MjA1OjY6ICggKCBtb2RpZmllcl9wYXJhbSApPyB0eXBlX3ZhciBJRCApPT4gKG09IG1vZGlmaWVyX3BhcmFtICk/IHR2PSB0eXBlX3ZhciBpZD0gSUQKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDIwNjo2OiAobT0gbW9kaWZpZXJfcGFyYW0gKT8KKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0MzcxPTI7CisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBBU1NJR05fUkVGOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIEJBTkQ6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgTFRFOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDE2NDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAxNjY6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMjQzOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDI2MjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAyODI6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMjk1OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDI5ODoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzMDU6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzE4OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDMzNToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzNDE6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzYxOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDM2NDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCQlhbHQzNzE9MTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0MzcxKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQyMDY6ODogbT0gbW9kaWZpZXJfcGFyYW0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfbW9kaWZpZXJfcGFyYW1faW5fZGVmX3JvdXRpbmVfcmV0dXJuc19hdG9tMTM0OTEpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgbT1tb2RpZmllcl9wYXJhbShjdHgpOworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3JvdXRpbmVfcmV0dXJuc19hdG9tRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIG1kZnIub3ZlcnJpZGVfaWZkZWYoIG0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgKTsgCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV190eXBlX3Zhcl9pbl9kZWZfcm91dGluZV9yZXR1cm5zX2F0b20xMzUwNSk7CisgICAgICAgICAgICAJICAgICAgICB0dj10eXBlX3ZhcihjdHgpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3JvdXRpbmVfcmV0dXJuc19hdG9tRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIHBhcmFtVCA9IHR2CisgICAgICAgICAgICAJICAgICAgICAgICAgOyAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZCA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTikgTUFUQ0hUKElELCAmRk9MTE9XX0lEX2luX2RlZl9yb3V0aW5lX3JldHVybnNfYXRvbTEzNTEyKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3JvdXRpbmVfcmV0dXJuc19hdG9tRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAyOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0MjA5OjY6IGlkPSBJRAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBpZCA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTikgTUFUQ0hUKElELCAmRk9MTE9XX0lEX2luX2RlZl9yb3V0aW5lX3JldHVybnNfYXRvbTEzNTIyKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX3JvdXRpbmVfcmV0dXJuc19hdG9tRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIAl2YXJpYWJsZSA9IHNlcDo6UGFyc2VyVXRpbDo6Z2V0VmFyaWFibGUoU1RSKChpZC0+Z2V0VGV4dChpZCkpLT5jaGFycykgLCAxKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIAlpZiggdmFyaWFibGUuaW52YWxpZCgpICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAJCXNlcDo6UGFyc2VyVXRpbDo6YXZtX3N5bnRheF9lcnJvcigKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIAkJCSJkZWZfcm91dGluZV9yZXR1cm5zX2F0b206PiAiICsgcm91dGluZS5zdHIoKSwgKGlkLT5nZXRMaW5lKGlkKSkgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgCQkJCTw8ICJVbmZvdW5kIG1hY2hpbmUgcmV0dXJuJ3MgdmFyaWFibGUgPCAiCisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgCQkJCQk8PCBTVFIoKGlkLT5nZXRUZXh0KGlkKSktPmNoYXJzKQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkgIAkJCQkJPDwgIiA+IGluIHJvdXRpbmUgaGVhZGVyIDwgIiA8PCAiID4iCisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgCQkJCQk8PCBzZXA6OlBhcnNlclV0aWw6OlNZTlRBWF9FUlJPUl9FT0w7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAJICAgIGlmKCB2YXJpYWJsZS52YWxpZCgpICkKKyAgICAgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgICAgICAJCSAgCXJvdXRpbmUuc2F2ZVJldHVybiggcGFyYW0gPSBuZXcgc2VwOjpWYXJpYWJsZSggJnJvdXRpbmUsCisgICAgICAgICAgICAgICAgCQkgIAkJCXNlcDo6TW9kaWZpZXI6OlBST1BFUlRZX01BQ1JPX01PRElGSUVSLAorICAgICAgICAgICAgICAgIAkJICAJCQl2YXJpYWJsZS50b19wdHI8IHNlcDo6VmFyaWFibGUgPigpLT5nZXRUeXBlKCksCisgICAgICAgICAgICAgICAgCQkgIAkJCVNUUigoaWQtPmdldFRleHQoaWQpKS0+Y2hhcnMpKSApOworCisgICAgICAgICAgICAgICAgCQkgIAlwYXJhbS0+c2V0T2Zmc2V0KCBvZmZzZXQgKTsKKyAgICAgICAgICAgICAgICAJICAgIAlwYXJhbS0+c2V0QmluZGluZyggdmFyaWFibGUgKTsKKyAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAJICAgIGVsc2UKKyAgICAgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgICAgICAJICAgIAlwYXJhbSA9IG5ldyBzZXA6OlZhcmlhYmxlKCZyb3V0aW5lLAorICAgICAgICAgICAgICAgIAkJICAJCQltZGZyLCAKKyAgICAgICAgICAgICAgICB0dgorICAgICAgICAgICAgICAgICwgU1RSKChpZC0+Z2V0VGV4dChpZCkpLT5jaGFycykpOworICAgICAgICAgICAgICAgIAkJICAJcGFyYW0tPnNldE9mZnNldCggb2Zmc2V0ICk7CisKKyAgICAgICAgICAgICAgICAJCSAgCS8vIE9ubHkgZm9yIFJvdXRpbmUgZGVzaWduIGFzIFBST1RPVFlQRSBhLmsuYS4gcHJpbWl0aXZlIHJvdXRpbmUKKyAgICAgICAgICAgICAgICAJCSAgCWlmKCByb3V0aW5lLmdldFNwZWNpZmllcigpLmlzRGVzaWduUHJvdG90eXBlU3RhdGljKCkgKQorICAgICAgICAgICAgICAgIAkJICAJeworICAgICAgICAgICAgICAgIAkJICAJCXJvdXRpbmUuYXBwZW5kUmV0dXJuKAorICAgICAgICAgICAgICAgIAkJICAJCQltYWNoaW5lLT5nZXRQcm9wZXJ0eVBhcnQoKS5zYXZlT3duZWRWYXJpYWJsZSggcGFyYW0gKSk7CisgICAgICAgICAgICAgICAgCQkgIAl9CisgICAgICAgICAgICAgICAgCQkgIAllbHNlCisgICAgICAgICAgICAgICAgCQkgIAl7CisgICAgICAgICAgICAgICAgCQkgIAkJcm91dGluZS5zYXZlUmV0dXJuKCBwYXJhbSApOworICAgICAgICAgICAgICAgIAkJICAJfQorICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgIAkgIAorICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQyNTQ6NDogKGl2PSBpbml0aWFsX3ZhbHVlICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDM3Mz0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQVNTSUdOOgorICAgICAgICAgICAgICAgICAgICBjYXNlIExQQVJFTjoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQzNzM9MTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MzczKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQyNTQ6NjogaXY9IGluaXRpYWxfdmFsdWUKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfaW5pdGlhbF92YWx1ZV9pbl9kZWZfcm91dGluZV9yZXR1cm5zX2F0b20xMzU1MCk7CisgICAgICAgICAgICAJICAgICAgICBpdj1pbml0aWFsX3ZhbHVlKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfcm91dGluZV9yZXR1cm5zX2F0b21FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgcGFyYW0tPnNldFZhbHVlKGl2CisgICAgICAgICAgICAJICAgICAgICAgICAgKTsgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZWRlZl9yb3V0aW5lX3JldHVybnNfYXRvbUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZWRlZl9yb3V0aW5lX3JldHVybnNfYXRvbUV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTU2LCBkZWZfcm91dGluZV9yZXR1cm5zX2F0b21fU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGRlZl9yb3V0aW5lX3JldHVybnNfYXRvbSAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBzZWN0aW9uX21vZGVsX29mX2V4ZWN1dGlvbgorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDI2MjoxOiBzZWN0aW9uX21vZGVsX29mX2V4ZWN1dGlvblsgc2VwOjpNYWNoaW5lICogY29udGFpbmVyIF0gOiAnQG1vZTonICggZGVmX21vZV9wcmltaXRpdmVbIGNvbnRhaW5lciBdICkqIDsKKyAqLworc3RhdGljIHZvaWQKK3NlY3Rpb25fbW9kZWxfb2ZfZXhlY3V0aW9uKHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIpCit7CisgICAgQU5UTFIzX1VJTlQzMiBzZWN0aW9uX21vZGVsX29mX2V4ZWN1dGlvbl9TdGFydEluZGV4OworCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIHNlY3Rpb25fbW9kZWxfb2ZfZXhlY3V0aW9uX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDE1NykpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDI2MzoyOiAoICdAbW9lOicgKCBkZWZfbW9lX3ByaW1pdGl2ZVsgY29udGFpbmVyIF0gKSogKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0MjYzOjQ6ICdAbW9lOicgKCBkZWZfbW9lX3ByaW1pdGl2ZVsgY29udGFpbmVyIF0gKSoKKyAgICAgICAgeworICAgICAgICAgICAgIE1BVENIVCgyMDQsICZGT0xMT1dfMjA0X2luX3NlY3Rpb25fbW9kZWxfb2ZfZXhlY3V0aW9uMTM1NzQpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVzZWN0aW9uX21vZGVsX29mX2V4ZWN1dGlvbkV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDI2MzoxMzogKCBkZWZfbW9lX3ByaW1pdGl2ZVsgY29udGFpbmVyIF0gKSoKKworICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0Mzc0PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDE3MDoKKyAgICAgICAgICAgICAgICBjYXNlIDE3NToKKyAgICAgICAgICAgICAgICBjYXNlIDE3NzoKKyAgICAgICAgICAgICAgICBjYXNlIDE3OToKKyAgICAgICAgICAgICAgICBjYXNlIDE4MjoKKyAgICAgICAgICAgICAgICBjYXNlIDE4NDoKKyAgICAgICAgICAgICAgICBjYXNlIDE4OToKKyAgICAgICAgICAgICAgICBjYXNlIDE5MDoKKyAgICAgICAgICAgICAgICBjYXNlIDE5MToKKyAgICAgICAgICAgICAgICBjYXNlIDE5NDoKKyAgICAgICAgICAgICAgICBjYXNlIDE5OToKKyAgICAgICAgICAgICAgICBjYXNlIDIxODoKKyAgICAgICAgICAgICAgICBjYXNlIDIyMzoKKyAgICAgICAgICAgICAgICBjYXNlIDIyNDoKKyAgICAgICAgICAgICAgICBjYXNlIDIyNToKKyAgICAgICAgICAgICAgICBjYXNlIDIyNjoKKyAgICAgICAgICAgICAgICBjYXNlIDIyODoKKyAgICAgICAgICAgICAgICBjYXNlIDM2NzoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0Mzc0PTE7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDM3NCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0MjYzOjE1OiBkZWZfbW9lX3ByaW1pdGl2ZVsgY29udGFpbmVyIF0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX21vZV9wcmltaXRpdmVfaW5fc2VjdGlvbl9tb2RlbF9vZl9leGVjdXRpb24xMzU3OSk7CisgICAgICAgICAgICAJICAgICAgICBkZWZfbW9lX3ByaW1pdGl2ZShjdHgsIGNvbnRhaW5lcik7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzZWN0aW9uX21vZGVsX29mX2V4ZWN1dGlvbkV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdDoKKyAgICAgICAgICAgIAkgICAgZ290byBsb29wMzc0OwkvKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgKi8KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9vcDM3NDogOyAvKiBKdW1wIG91dCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworCisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlc2VjdGlvbl9tb2RlbF9vZl9leGVjdXRpb25FeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVzZWN0aW9uX21vZGVsX29mX2V4ZWN1dGlvbkV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTU3LCBzZWN0aW9uX21vZGVsX29mX2V4ZWN1dGlvbl9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgc2VjdGlvbl9tb2RlbF9vZl9leGVjdXRpb24gKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgZGVmX21vZV9wcmltaXRpdmUKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQyNjY6MTogZGVmX21vZV9wcmltaXRpdmVbIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lciBdIDogKCAnQGNyZWF0ZScgZGVmX3JvdXRpbmVfc2VxWyB0aGVCZWhhdmlvci0+Z2V0T25DcmVhdGVSb3V0aW5lKCkgXSB8ICdAaW5pdCcgZGVmX3JvdXRpbmVfc2VxWyB0aGVCZWhhdmlvci0+Z2V0T25Jbml0Um91dGluZSgpIF0gfCAnQGZpbmFsJyBkZWZfcm91dGluZV9zZXFbIHRoZUJlaGF2aW9yLT5nZXRPbkZpbmFsUm91dGluZSgpIF0gfCAnQHN0YXJ0JyBkZWZfcm91dGluZV9zZXFbIHRoZUJlaGF2aW9yLT5nZXRPblN0YXJ0Um91dGluZSgpIF0gfCAnQHN0b3AnIGRlZl9yb3V0aW5lX3NlcVsgdGhlQmVoYXZpb3ItPmdldE9uU3RvcFJvdXRpbmUoKSBdIHwgJ0BpZW5hYmxlJyBkZWZfcm91dGluZV9zZXFbIHRoZUJlaGF2aW9yLT5nZXRPbklFbmFibGVSb3V0aW5lKCkgXSB8ICdAZW5hYmxlJyBkZWZfcm91dGluZV9zZXFbIHRoZUJlaGF2aW9yLT5nZXRPbkVuYWJsZVJvdXRpbmUoKSBdIHwgJ0BpZGlzYWJsZScgZGVmX3JvdXRpbmVfc2VxWyB0aGVCZWhhdmlvci0+Z2V0T25JRGlzYWJsZVJvdXRpbmUoKSBdIHwgJ0BkaXNhYmxlJyBkZWZfcm91dGluZV9zZXFbIHRoZUJlaGF2aW9yLT5nZXRPbkRpc2FibGVSb3V0aW5lKCkgXSB8ICdAaWFib3J0JyBkZWZfcm91dGluZV9zZXFbIHRoZUJlaGF2aW9yLT5nZXRPbklBYm9ydFJvdXRpbmUoKSBdIHwgJ0BhYm9ydCcgZGVmX3JvdXRpbmVfc2VxWyB0aGVCZWhhdmlvci0+Z2V0T25BYm9ydFJvdXRpbmUoKSBdIHwgJ0BpcnVuJyBkZWZfcm91dGluZV9zZXFbIHRoZUJlaGF2aW9yLT5nZXRPbklSdW5Sb3V0aW5lKCkgXSB8ICdAcnVuJyBkZWZfcm91dGluZV9zZXFbIHRoZUJlaGF2aW9yLT5nZXRPblJ1blJvdXRpbmUoKSBdIHwgJ0BydGMnIGRlZl9yb3V0aW5lX3NlcVsgdGhlQmVoYXZpb3ItPmdldE9uUnRjUm91dGluZSgpIF0gfCAnQHJldHVybicgZGVmX3JvdXRpbmVfc2VxWyB0aGVCZWhhdmlvci0+Z2V0T25GaW5hbFJvdXRpbmUoKSBdIHwgJ0Bjb25jdXJyZW5jeScgZGVmX3JvdXRpbmVfc2VxWyB0aGVCZWhhdmlvci0+Z2V0T25Db25jdXJyZW5jeVJvdXRpbmUoKSBdIHwgJ0BzY2hlZHVsZScgZGVmX3JvdXRpbmVfc2VxWyB0aGVCZWhhdmlvci0+Z2V0T25TY2hlZHVsZVJvdXRpbmUoKSBdIHwgJ3JvdXRpbmUnIGRlZl9yb3V0aW5lX21vZGVsX2ltcGxbIGNvbnRhaW5lciAsIG1kZnIgLCBzcGNmciBdICk7CisgKi8KK3N0YXRpYyB2b2lkCitkZWZfbW9lX3ByaW1pdGl2ZShwZm1sUGFyc2VyIGN0eCwgc2VwOjpNYWNoaW5lICogY29udGFpbmVyKQoreworICAgIEFOVExSM19VSU5UMzIgZGVmX21vZV9wcmltaXRpdmVfU3RhcnRJbmRleDsKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBkZWZfbW9lX3ByaW1pdGl2ZV9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisKKyAgICAJc2VwOjpCZWhhdmlvcmFsUGFydCAqIHRoZUJlaGF2aW9yID0gY29udGFpbmVyLT5nZXRVbmlxQmVoYXZpb3JQYXJ0KCk7CisKKyAgICAJIHNlcDo6TW9kaWZpZXIgbWRmcjsKKworICAgIAlzZXA6OlNwZWNpZmllciBzcGNmciggc2VwOjpTcGVjaWZpZXI6OkRFU0lHTl9NT0RFTF9LSU5EICk7CisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDE1OCkpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQyNzQ6MjogKCAnQGNyZWF0ZScgZGVmX3JvdXRpbmVfc2VxWyB0aGVCZWhhdmlvci0+Z2V0T25DcmVhdGVSb3V0aW5lKCkgXSB8ICdAaW5pdCcgZGVmX3JvdXRpbmVfc2VxWyB0aGVCZWhhdmlvci0+Z2V0T25Jbml0Um91dGluZSgpIF0gfCAnQGZpbmFsJyBkZWZfcm91dGluZV9zZXFbIHRoZUJlaGF2aW9yLT5nZXRPbkZpbmFsUm91dGluZSgpIF0gfCAnQHN0YXJ0JyBkZWZfcm91dGluZV9zZXFbIHRoZUJlaGF2aW9yLT5nZXRPblN0YXJ0Um91dGluZSgpIF0gfCAnQHN0b3AnIGRlZl9yb3V0aW5lX3NlcVsgdGhlQmVoYXZpb3ItPmdldE9uU3RvcFJvdXRpbmUoKSBdIHwgJ0BpZW5hYmxlJyBkZWZfcm91dGluZV9zZXFbIHRoZUJlaGF2aW9yLT5nZXRPbklFbmFibGVSb3V0aW5lKCkgXSB8ICdAZW5hYmxlJyBkZWZfcm91dGluZV9zZXFbIHRoZUJlaGF2aW9yLT5nZXRPbkVuYWJsZVJvdXRpbmUoKSBdIHwgJ0BpZGlzYWJsZScgZGVmX3JvdXRpbmVfc2VxWyB0aGVCZWhhdmlvci0+Z2V0T25JRGlzYWJsZVJvdXRpbmUoKSBdIHwgJ0BkaXNhYmxlJyBkZWZfcm91dGluZV9zZXFbIHRoZUJlaGF2aW9yLT5nZXRPbkRpc2FibGVSb3V0aW5lKCkgXSB8ICdAaWFib3J0JyBkZWZfcm91dGluZV9zZXFbIHRoZUJlaGF2aW9yLT5nZXRPbklBYm9ydFJvdXRpbmUoKSBdIHwgJ0BhYm9ydCcgZGVmX3JvdXRpbmVfc2VxWyB0aGVCZWhhdmlvci0+Z2V0T25BYm9ydFJvdXRpbmUoKSBdIHwgJ0BpcnVuJyBkZWZfcm91dGluZV9zZXFbIHRoZUJlaGF2aW9yLT5nZXRPbklSdW5Sb3V0aW5lKCkgXSB8ICdAcnVuJyBkZWZfcm91dGluZV9zZXFbIHRoZUJlaGF2aW9yLT5nZXRPblJ1blJvdXRpbmUoKSBdIHwgJ0BydGMnIGRlZl9yb3V0aW5lX3NlcVsgdGhlQmVoYXZpb3ItPmdldE9uUnRjUm91dGluZSgpIF0gfCAnQHJldHVybicgZGVmX3JvdXRpbmVfc2VxWyB0aGVCZWhhdmlvci0+Z2V0T25GaW5hbFJvdXRpbmUoKSBdIHwgJ0Bjb25jdXJyZW5jeScgZGVmX3JvdXRpbmVfc2VxWyB0aGVCZWhhdmlvci0+Z2V0T25Db25jdXJyZW5jeVJvdXRpbmUoKSBdIHwgJ0BzY2hlZHVsZScgZGVmX3JvdXRpbmVfc2VxWyB0aGVCZWhhdmlvci0+Z2V0T25TY2hlZHVsZVJvdXRpbmUoKSBdIHwgJ3JvdXRpbmUnIGRlZl9yb3V0aW5lX21vZGVsX2ltcGxbIGNvbnRhaW5lciAsIG1kZnIgLCBzcGNmciBdICkKKworICAgICAgICAgICAgQU5UTFIzX1VJTlQzMiBhbHQzNzU7CisKKyAgICAgICAgICAgIGFsdDM3NT0xODsKKworICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAxNzc6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQzNzU9MTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE5NDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDM3NT0yOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTg0OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0Mzc1PTM7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMjY6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQzNzU9NDsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIyODoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDM3NT01OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTkxOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0Mzc1PTY7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxODI6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQzNzU9NzsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE5MDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDM3NT04OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTc5OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0Mzc1PTk7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxODk6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQzNzU9MTA7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNzA6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQzNzU9MTE7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOTk6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQzNzU9MTI7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMjQ6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQzNzU9MTM7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMjM6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQzNzU9MTQ7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMTg6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQzNzU9MTU7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNzU6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQzNzU9MTY7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMjU6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQzNzU9MTc7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzNjc6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQzNzU9MTg7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDM3NTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9tb2VfcHJpbWl0aXZlRXg7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQzNzUpCisgICAgICAgICAgICB7CisgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDI3NDo0OiAnQGNyZWF0ZScgZGVmX3JvdXRpbmVfc2VxWyB0aGVCZWhhdmlvci0+Z2V0T25DcmVhdGVSb3V0aW5lKCkgXQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgxNzcsICZGT0xMT1dfMTc3X2luX2RlZl9tb2VfcHJpbWl0aXZlMTM2MDApOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfbW9lX3ByaW1pdGl2ZUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX3JvdXRpbmVfc2VxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM2MDgpOworICAgICAgICAJICAgICAgICBkZWZfcm91dGluZV9zZXEoY3R4LCB0aGVCZWhhdmlvci0+Z2V0T25DcmVhdGVSb3V0aW5lKCkpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfbW9lX3ByaW1pdGl2ZUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDI6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDI3NTo0OiAnQGluaXQnIGRlZl9yb3V0aW5lX3NlcVsgdGhlQmVoYXZpb3ItPmdldE9uSW5pdFJvdXRpbmUoKSBdCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDE5NCwgJkZPTExPV18xOTRfaW5fZGVmX21vZV9wcmltaXRpdmUxMzYxNCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9tb2VfcHJpbWl0aXZlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzYyNCk7CisgICAgICAgIAkgICAgICAgIGRlZl9yb3V0aW5lX3NlcShjdHgsIHRoZUJlaGF2aW9yLT5nZXRPbkluaXRSb3V0aW5lKCkpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfbW9lX3ByaW1pdGl2ZUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDM6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDI3Njo0OiAnQGZpbmFsJyBkZWZfcm91dGluZV9zZXFbIHRoZUJlaGF2aW9yLT5nZXRPbkZpbmFsUm91dGluZSgpIF0KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMTg0LCAmRk9MTE9XXzE4NF9pbl9kZWZfbW9lX3ByaW1pdGl2ZTEzNjMwKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX21vZV9wcmltaXRpdmVFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlZl9yb3V0aW5lX3NlcV9pbl9kZWZfbW9lX3ByaW1pdGl2ZTEzNjM5KTsKKyAgICAgICAgCSAgICAgICAgZGVmX3JvdXRpbmVfc2VxKGN0eCwgdGhlQmVoYXZpb3ItPmdldE9uRmluYWxSb3V0aW5lKCkpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfbW9lX3ByaW1pdGl2ZUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDQ6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDI3ODo0OiAnQHN0YXJ0JyBkZWZfcm91dGluZV9zZXFbIHRoZUJlaGF2aW9yLT5nZXRPblN0YXJ0Um91dGluZSgpIF0KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMjI2LCAmRk9MTE9XXzIyNl9pbl9kZWZfbW9lX3ByaW1pdGl2ZTEzNjQ2KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX21vZV9wcmltaXRpdmVFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlZl9yb3V0aW5lX3NlcV9pbl9kZWZfbW9lX3ByaW1pdGl2ZTEzNjU1KTsKKyAgICAgICAgCSAgICAgICAgZGVmX3JvdXRpbmVfc2VxKGN0eCwgdGhlQmVoYXZpb3ItPmdldE9uU3RhcnRSb3V0aW5lKCkpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfbW9lX3ByaW1pdGl2ZUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDU6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDI3OTo0OiAnQHN0b3AnIGRlZl9yb3V0aW5lX3NlcVsgdGhlQmVoYXZpb3ItPmdldE9uU3RvcFJvdXRpbmUoKSBdCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDIyOCwgJkZPTExPV18yMjhfaW5fZGVmX21vZV9wcmltaXRpdmUxMzY2MSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9tb2VfcHJpbWl0aXZlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzY3MSk7CisgICAgICAgIAkgICAgICAgIGRlZl9yb3V0aW5lX3NlcShjdHgsIHRoZUJlaGF2aW9yLT5nZXRPblN0b3BSb3V0aW5lKCkpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfbW9lX3ByaW1pdGl2ZUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDY6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDI4MTo0OiAnQGllbmFibGUnIGRlZl9yb3V0aW5lX3NlcVsgdGhlQmVoYXZpb3ItPmdldE9uSUVuYWJsZVJvdXRpbmUoKSBdCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDE5MSwgJkZPTExPV18xOTFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzY3OCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9tb2VfcHJpbWl0aXZlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzY4NSk7CisgICAgICAgIAkgICAgICAgIGRlZl9yb3V0aW5lX3NlcShjdHgsIHRoZUJlaGF2aW9yLT5nZXRPbklFbmFibGVSb3V0aW5lKCkpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfbW9lX3ByaW1pdGl2ZUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDc6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDI4Mjo0OiAnQGVuYWJsZScgZGVmX3JvdXRpbmVfc2VxWyB0aGVCZWhhdmlvci0+Z2V0T25FbmFibGVSb3V0aW5lKCkgXQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgxODIsICZGT0xMT1dfMTgyX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM2OTEpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfbW9lX3ByaW1pdGl2ZUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX3JvdXRpbmVfc2VxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM2OTkpOworICAgICAgICAJICAgICAgICBkZWZfcm91dGluZV9zZXEoY3R4LCB0aGVCZWhhdmlvci0+Z2V0T25FbmFibGVSb3V0aW5lKCkpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfbW9lX3ByaW1pdGl2ZUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDg6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDI4NDo0OiAnQGlkaXNhYmxlJyBkZWZfcm91dGluZV9zZXFbIHRoZUJlaGF2aW9yLT5nZXRPbklEaXNhYmxlUm91dGluZSgpIF0KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMTkwLCAmRk9MTE9XXzE5MF9pbl9kZWZfbW9lX3ByaW1pdGl2ZTEzNzA2KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX21vZV9wcmltaXRpdmVFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlZl9yb3V0aW5lX3NlcV9pbl9kZWZfbW9lX3ByaW1pdGl2ZTEzNzEyKTsKKyAgICAgICAgCSAgICAgICAgZGVmX3JvdXRpbmVfc2VxKGN0eCwgdGhlQmVoYXZpb3ItPmdldE9uSURpc2FibGVSb3V0aW5lKCkpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfbW9lX3ByaW1pdGl2ZUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDk6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDI4NTo0OiAnQGRpc2FibGUnIGRlZl9yb3V0aW5lX3NlcVsgdGhlQmVoYXZpb3ItPmdldE9uRGlzYWJsZVJvdXRpbmUoKSBdCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDE3OSwgJkZPTExPV18xNzlfaW5fZGVmX21vZV9wcmltaXRpdmUxMzcxOCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9tb2VfcHJpbWl0aXZlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzcyNSk7CisgICAgICAgIAkgICAgICAgIGRlZl9yb3V0aW5lX3NlcShjdHgsIHRoZUJlaGF2aW9yLT5nZXRPbkRpc2FibGVSb3V0aW5lKCkpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfbW9lX3ByaW1pdGl2ZUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDEwOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQyODc6NDogJ0BpYWJvcnQnIGRlZl9yb3V0aW5lX3NlcVsgdGhlQmVoYXZpb3ItPmdldE9uSUFib3J0Um91dGluZSgpIF0KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMTg5LCAmRk9MTE9XXzE4OV9pbl9kZWZfbW9lX3ByaW1pdGl2ZTEzNzMyKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX21vZV9wcmltaXRpdmVFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlZl9yb3V0aW5lX3NlcV9pbl9kZWZfbW9lX3ByaW1pdGl2ZTEzNzQwKTsKKyAgICAgICAgCSAgICAgICAgZGVmX3JvdXRpbmVfc2VxKGN0eCwgdGhlQmVoYXZpb3ItPmdldE9uSUFib3J0Um91dGluZSgpKTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX21vZV9wcmltaXRpdmVFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAxMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0Mjg4OjQ6ICdAYWJvcnQnIGRlZl9yb3V0aW5lX3NlcVsgdGhlQmVoYXZpb3ItPmdldE9uQWJvcnRSb3V0aW5lKCkgXQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgxNzAsICZGT0xMT1dfMTcwX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM3NDYpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfbW9lX3ByaW1pdGl2ZUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX3JvdXRpbmVfc2VxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM3NTUpOworICAgICAgICAJICAgICAgICBkZWZfcm91dGluZV9zZXEoY3R4LCB0aGVCZWhhdmlvci0+Z2V0T25BYm9ydFJvdXRpbmUoKSk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9tb2VfcHJpbWl0aXZlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMTI6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDI5MDo0OiAnQGlydW4nIGRlZl9yb3V0aW5lX3NlcVsgdGhlQmVoYXZpb3ItPmdldE9uSVJ1blJvdXRpbmUoKSBdCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDE5OSwgJkZPTExPV18xOTlfaW5fZGVmX21vZV9wcmltaXRpdmUxMzc2Mik7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9tb2VfcHJpbWl0aXZlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzc3Mik7CisgICAgICAgIAkgICAgICAgIGRlZl9yb3V0aW5lX3NlcShjdHgsIHRoZUJlaGF2aW9yLT5nZXRPbklSdW5Sb3V0aW5lKCkpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfbW9lX3ByaW1pdGl2ZUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDEzOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQyOTE6NDogJ0BydW4nIGRlZl9yb3V0aW5lX3NlcVsgdGhlQmVoYXZpb3ItPmdldE9uUnVuUm91dGluZSgpIF0KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMjI0LCAmRk9MTE9XXzIyNF9pbl9kZWZfbW9lX3ByaW1pdGl2ZTEzNzc4KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX21vZV9wcmltaXRpdmVFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlZl9yb3V0aW5lX3NlcV9pbl9kZWZfbW9lX3ByaW1pdGl2ZTEzNzg5KTsKKyAgICAgICAgCSAgICAgICAgZGVmX3JvdXRpbmVfc2VxKGN0eCwgdGhlQmVoYXZpb3ItPmdldE9uUnVuUm91dGluZSgpKTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX21vZV9wcmltaXRpdmVFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAxNDoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0MjkyOjQ6ICdAcnRjJyBkZWZfcm91dGluZV9zZXFbIHRoZUJlaGF2aW9yLT5nZXRPblJ0Y1JvdXRpbmUoKSBdCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDIyMywgJkZPTExPV18yMjNfaW5fZGVmX21vZV9wcmltaXRpdmUxMzc5NSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9tb2VfcHJpbWl0aXZlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzgwNik7CisgICAgICAgIAkgICAgICAgIGRlZl9yb3V0aW5lX3NlcShjdHgsIHRoZUJlaGF2aW9yLT5nZXRPblJ0Y1JvdXRpbmUoKSk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9tb2VfcHJpbWl0aXZlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMTU6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDI5NDo0OiAnQHJldHVybicgZGVmX3JvdXRpbmVfc2VxWyB0aGVCZWhhdmlvci0+Z2V0T25GaW5hbFJvdXRpbmUoKSBdCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDIxOCwgJkZPTExPV18yMThfaW5fZGVmX21vZV9wcmltaXRpdmUxMzgxMyk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9tb2VfcHJpbWl0aXZlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfcm91dGluZV9zZXFfaW5fZGVmX21vZV9wcmltaXRpdmUxMzgyMSk7CisgICAgICAgIAkgICAgICAgIGRlZl9yb3V0aW5lX3NlcShjdHgsIHRoZUJlaGF2aW9yLT5nZXRPbkZpbmFsUm91dGluZSgpKTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX21vZV9wcmltaXRpdmVFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAxNjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0Mjk2OjQ6ICdAY29uY3VycmVuY3knIGRlZl9yb3V0aW5lX3NlcVsgdGhlQmVoYXZpb3ItPmdldE9uQ29uY3VycmVuY3lSb3V0aW5lKCkgXQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgxNzUsICZGT0xMT1dfMTc1X2luX2RlZl9tb2VfcHJpbWl0aXZlMTM4MjgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfbW9lX3ByaW1pdGl2ZUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX3JvdXRpbmVfc2VxX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM4MzEpOworICAgICAgICAJICAgICAgICBkZWZfcm91dGluZV9zZXEoY3R4LCB0aGVCZWhhdmlvci0+Z2V0T25Db25jdXJyZW5jeVJvdXRpbmUoKSk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9tb2VfcHJpbWl0aXZlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMTc6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDI5Nzo0OiAnQHNjaGVkdWxlJyBkZWZfcm91dGluZV9zZXFbIHRoZUJlaGF2aW9yLT5nZXRPblNjaGVkdWxlUm91dGluZSgpIF0KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMjI1LCAmRk9MTE9XXzIyNV9pbl9kZWZfbW9lX3ByaW1pdGl2ZTEzODM3KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVmX21vZV9wcmltaXRpdmVFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlZl9yb3V0aW5lX3NlcV9pbl9kZWZfbW9lX3ByaW1pdGl2ZTEzODQzKTsKKyAgICAgICAgCSAgICAgICAgZGVmX3JvdXRpbmVfc2VxKGN0eCwgdGhlQmVoYXZpb3ItPmdldE9uU2NoZWR1bGVSb3V0aW5lKCkpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfbW9lX3ByaW1pdGl2ZUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDE4OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQzMDA6NDogJ3JvdXRpbmUnIGRlZl9yb3V0aW5lX21vZGVsX2ltcGxbIGNvbnRhaW5lciAsIG1kZnIgLCBzcGNmciBdCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDM2NywgJkZPTExPV18zNjdfaW5fZGVmX21vZV9wcmltaXRpdmUxMzg1MSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9tb2VfcHJpbWl0aXZlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfcm91dGluZV9tb2RlbF9pbXBsX2luX2RlZl9tb2VfcHJpbWl0aXZlMTM4NTYpOworICAgICAgICAJICAgICAgICBkZWZfcm91dGluZV9tb2RlbF9pbXBsKGN0eCwgY29udGFpbmVyLCBtZGZyLCBzcGNmcik7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9tb2VfcHJpbWl0aXZlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlZGVmX21vZV9wcmltaXRpdmVFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVkZWZfbW9lX3ByaW1pdGl2ZUV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTU4LCBkZWZfbW9lX3ByaW1pdGl2ZV9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgZGVmX21vZV9wcmltaXRpdmUgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgZGVmX3JvdXRpbmVfc2VxCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0MzA1OjE6IGRlZl9yb3V0aW5lX3NlcVsgc2VwOjpSb3V0aW5lICYgcm91dGluZSBdIDogKCBkZWZfcm91dGluZV9wYXJhbWV0ZXJzWyByb3V0aW5lIF0gKT8gKCAoICctLT4nIHwgJ3JldHVybnM6JyApIGRlZl9yb3V0aW5lX3JldHVybnNbIHJvdXRpbmUgXSApPyBicz0gYmxvY2tfc3RhdGVtZW50IDsKKyAqLworc3RhdGljIHZvaWQKK2RlZl9yb3V0aW5lX3NlcShwZm1sUGFyc2VyIGN0eCwgc2VwOjpSb3V0aW5lICYgcm91dGluZSkKK3sKKyAgICBBTlRMUjNfVUlOVDMyIGRlZl9yb3V0aW5lX3NlcV9TdGFydEluZGV4OworCisgICAgc2VwOjpCRkNvZGUgYnM7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2JzCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9icyBzZXA6OkJGQ29kZQorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGRlZl9yb3V0aW5lX3NlcV9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisKKyAgICAJUFVTSF9DVFhfQ1BSKCAmIHJvdXRpbmUgKTsKKworICAgIAlTQVZFX1JVTEVfQkVHSU5fTE9DQVRJT047CisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDE1OSkpICkKKyAgICB7CisgICAgICAgIHsKKworICAgICAgICAgICAgCVNFVF9SVUxFX0xPQ0FUSU9OKCBfQ1BSXyApOworCisgICAgICAgICAgICAJUE9QX0NUWDs7CisKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQzMTY6MjogKCAoIGRlZl9yb3V0aW5lX3BhcmFtZXRlcnNbIHJvdXRpbmUgXSApPyAoICggJy0tPicgfCAncmV0dXJuczonICkgZGVmX3JvdXRpbmVfcmV0dXJuc1sgcm91dGluZSBdICk/IGJzPSBibG9ja19zdGF0ZW1lbnQgKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0MzE2OjQ6ICggZGVmX3JvdXRpbmVfcGFyYW1ldGVyc1sgcm91dGluZSBdICk/ICggKCAnLS0+JyB8ICdyZXR1cm5zOicgKSBkZWZfcm91dGluZV9yZXR1cm5zWyByb3V0aW5lIF0gKT8gYnM9IGJsb2NrX3N0YXRlbWVudAorICAgICAgICB7CisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0MzE2OjQ6ICggZGVmX3JvdXRpbmVfcGFyYW1ldGVyc1sgcm91dGluZSBdICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDM3Nj0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTFBBUkVOOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDM3Nj0xOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQzNzYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDMxNjo2OiBkZWZfcm91dGluZV9wYXJhbWV0ZXJzWyByb3V0aW5lIF0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX3JvdXRpbmVfcGFyYW1ldGVyc19pbl9kZWZfcm91dGluZV9zZXExMzg4MSk7CisgICAgICAgICAgICAJICAgICAgICBkZWZfcm91dGluZV9wYXJhbWV0ZXJzKGN0eCwgcm91dGluZSk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfcm91dGluZV9zZXFFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDMxNzo0OiAoICggJy0tPicgfCAncmV0dXJuczonICkgZGVmX3JvdXRpbmVfcmV0dXJuc1sgcm91dGluZSBdICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDM3Nz0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTYzOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM2NToKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQzNzc9MTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0Mzc3KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQzMTc6NjogKCAnLS0+JyB8ICdyZXR1cm5zOicgKSBkZWZfcm91dGluZV9yZXR1cm5zWyByb3V0aW5lIF0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBMQSgxKSA9PSAxNjMgfHwgTEEoMSkgPT0gMzY1ICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBDT05TVU1FKCk7CisgICAgICAgICAgICAJICAgICAgICAgICAgUEVSUk9SUkVDT1ZFUlk9QU5UTFIzX0ZBTFNFOworICAgICAgICAgICAgCSAgICAgICAgICAgIEZBSUxFREZMQUc9QU5UTFIzX0ZBTFNFOworCisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBlbHNlCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfRVhDRVBUSU9OOworICAgICAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+bmFtZSAgICAgICAgID0gKHZvaWQgKilBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfTkFNRTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPmV4cGVjdGluZ1NldCA9IE5VTEw7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfcm91dGluZV9zZXFFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfcm91dGluZV9yZXR1cm5zX2luX2RlZl9yb3V0aW5lX3NlcTEzOTAzKTsKKyAgICAgICAgICAgIAkgICAgICAgIGRlZl9yb3V0aW5lX3JldHVybnMoY3R4LCByb3V0aW5lKTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlZl9yb3V0aW5lX3NlcUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19ibG9ja19zdGF0ZW1lbnRfaW5fZGVmX3JvdXRpbmVfc2VxMTM5MTUpOworICAgICAgICAgICAgYnM9YmxvY2tfc3RhdGVtZW50KGN0eCk7CisKKyAgICAgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVkZWZfcm91dGluZV9zZXFFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgcm91dGluZS5zZXFDb2RlKGJzCisgICAgICAgICAgICAgICAgKTsgCisgICAgICAgICAgICB9CisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVkZWZfcm91dGluZV9zZXFFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVkZWZfcm91dGluZV9zZXFFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgCVNFVF9SVUxFX0xPQ0FUSU9OKCBfQ1BSXyApOworCisgICAgICAgICAgICAgICAgICAgIAlQT1BfQ1RYOzsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgxNTksIGRlZl9yb3V0aW5lX3NlcV9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgZGVmX3JvdXRpbmVfc2VxICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IHNlY3Rpb25fbW9kZWxfb2ZfaW50ZXJhY3Rpb24KKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQzMjc6MTogc2VjdGlvbl9tb2RlbF9vZl9pbnRlcmFjdGlvblsgc2VwOjpNYWNoaW5lICogbWFjaGluZSBdIDogKCAnQGludGVyYWN0aW9uOicgfCAnQGNvbTonICkgKCBjb21fY29ubmVjdFsgbWFjaGluZSwgdGhlSW50ZXJhY3Rpb24gXSApKiA7CisgKi8KK3N0YXRpYyB2b2lkCitzZWN0aW9uX21vZGVsX29mX2ludGVyYWN0aW9uKHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBtYWNoaW5lKQoreworICAgIEFOVExSM19VSU5UMzIgc2VjdGlvbl9tb2RlbF9vZl9pbnRlcmFjdGlvbl9TdGFydEluZGV4OworCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIHNlY3Rpb25fbW9kZWxfb2ZfaW50ZXJhY3Rpb25fU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworCisgICAgCXNlcDo6SW50ZXJhY3Rpb25QYXJ0ICogdGhlSW50ZXJhY3Rpb24gPSBtYWNoaW5lLT5nZXRVbmlxSW50ZXJhY3Rpb24oKTsKKworICAgIAlTQVZFX1JVTEVfQkVHSU5fTE9DQVRJT047CisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDE2MCkpICkKKyAgICB7CisgICAgICAgIHsKKworICAgICAgICAgICAgCVNFVF9SVUxFX0xPQ0FUSU9OKHRoZUludGVyYWN0aW9uKTsKKworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDMzNzoyOiAoICggJ0BpbnRlcmFjdGlvbjonIHwgJ0Bjb206JyApICggY29tX2Nvbm5lY3RbIG1hY2hpbmUsIHRoZUludGVyYWN0aW9uIF0gKSogKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0MzM3OjQ6ICggJ0BpbnRlcmFjdGlvbjonIHwgJ0Bjb206JyApICggY29tX2Nvbm5lY3RbIG1hY2hpbmUsIHRoZUludGVyYWN0aW9uIF0gKSoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBMQSgxKSA9PSAxNzIgfHwgTEEoMSkgPT0gMTk4ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDT05TVU1FKCk7CisgICAgICAgICAgICAgICAgUEVSUk9SUkVDT1ZFUlk9QU5UTFIzX0ZBTFNFOworICAgICAgICAgICAgICAgIEZBSUxFREZMQUc9QU5UTFIzX0ZBTFNFOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bmFtZSAgICAgICAgID0gKHZvaWQgKilBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfTkFNRTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPmV4cGVjdGluZ1NldCA9IE5VTEw7CisKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVzZWN0aW9uX21vZGVsX29mX2ludGVyYWN0aW9uRXg7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDMzODo0OiAoIGNvbV9jb25uZWN0WyBtYWNoaW5lLCB0aGVJbnRlcmFjdGlvbiBdICkqCisKKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDM3OD0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAyNjA6CisgICAgICAgICAgICAgICAgY2FzZSAyNjE6CisgICAgICAgICAgICAgICAgY2FzZSAzNjY6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDM3OD0xOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQzNzgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDMzODo2OiBjb21fY29ubmVjdFsgbWFjaGluZSwgdGhlSW50ZXJhY3Rpb24gXQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19jb21fY29ubmVjdF9pbl9zZWN0aW9uX21vZGVsX29mX2ludGVyYWN0aW9uMTM5NjApOworICAgICAgICAgICAgCSAgICAgICAgY29tX2Nvbm5lY3QoY3R4LCBtYWNoaW5lLCB0aGVJbnRlcmFjdGlvbik7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzZWN0aW9uX21vZGVsX29mX2ludGVyYWN0aW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAgICAgCSAgICBnb3RvIGxvb3AzNzg7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb29wMzc4OiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVzZWN0aW9uX21vZGVsX29mX2ludGVyYWN0aW9uRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlc2VjdGlvbl9tb2RlbF9vZl9pbnRlcmFjdGlvbkV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICAJU0VUX1JVTEVfTE9DQVRJT04odGhlSW50ZXJhY3Rpb24pOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisKKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDE2MCwgc2VjdGlvbl9tb2RlbF9vZl9pbnRlcmFjdGlvbl9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgc2VjdGlvbl9tb2RlbF9vZl9pbnRlcmFjdGlvbiAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBjb21fcHJvdG9jb2wKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQzNDE6MTogY29tX3Byb3RvY29sWyBzZXA6Ok1hY2hpbmUgKiBtYWNoaW5lICwgc2VwOjpDb21Qcm90b2NvbCAqIGNwIF0gOiAoICdlbnYnIHwgJ3JkdicgfCAnbXVsdGlyZHYnIHwgJ2Zsb3cnIHwgJ2FueWNhc3QnIHwgJ3VuaWNhc3QnIHwgJ211bHRpY2FzdCcgfCAnYnJvYWRjYXN0JyB8YmM9IGJ1ZmZlcl9jb21bIG1hY2hpbmUgXSApOworICovCitzdGF0aWMgdm9pZAorY29tX3Byb3RvY29sKHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBtYWNoaW5lLCBzZXA6OkNvbVByb3RvY29sICogY3ApCit7CisgICAgQU5UTFIzX1VJTlQzMiBjb21fcHJvdG9jb2xfU3RhcnRJbmRleDsKKworICAgIHNlcDo6QkYgYmM7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2JjCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9iYyBzZXA6OkJGCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgY29tX3Byb3RvY29sX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDE2MSkpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQzNDM6MjogKCAnZW52JyB8ICdyZHYnIHwgJ211bHRpcmR2JyB8ICdmbG93JyB8ICdhbnljYXN0JyB8ICd1bmljYXN0JyB8ICdtdWx0aWNhc3QnIHwgJ2Jyb2FkY2FzdCcgfGJjPSBidWZmZXJfY29tWyBtYWNoaW5lIF0gKQorCisgICAgICAgICAgICBBTlRMUjNfVUlOVDMyIGFsdDM3OTsKKworICAgICAgICAgICAgYWx0Mzc5PTk7CisKKyAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMjc3OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0Mzc5PTE7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzNTk6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQzNzk9MjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMyODoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDM3OT0zOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjg0OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0Mzc5PTQ7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNDA6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQzNzk9NTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQwMzoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDM3OT02OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzI0OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0Mzc5PTc7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNDg6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQzNzk9ODsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI0OToKKyAgICAgICAgICAgIGNhc2UgMjgxOgorICAgICAgICAgICAgY2FzZSAzMTU6CisgICAgICAgICAgICBjYXNlIDMyNToKKyAgICAgICAgICAgIGNhc2UgMzI2OgorICAgICAgICAgICAgY2FzZSAzMjk6CisgICAgICAgICAgICBjYXNlIDM1NjoKKyAgICAgICAgICAgIGNhc2UgMzcwOgorICAgICAgICAgICAgY2FzZSAzNzM6CisgICAgICAgICAgICBjYXNlIDQxMjoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDM3OT05OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAzNzk7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVjb21fcHJvdG9jb2xFeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDM3OSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0MzQzOjQ6ICdlbnYnCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDI3NywgJkZPTExPV18yNzdfaW5fY29tX3Byb3RvY29sMTM5NzgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVjb21fcHJvdG9jb2xFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGNwLT5zZXRQcm90b2NvbChzZXA6OkNvbVByb3RvY29sOjpQUk9UT0NPTF9FTlZJUk9OTUVOVF9LSU5EKTsgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAyOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQzNDU6NDogJ3JkdicKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMzU5LCAmRk9MTE9XXzM1OV9pbl9jb21fcHJvdG9jb2wxMzk5Mik7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWNvbV9wcm90b2NvbEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgY3AtPnNldFByb3RvY29sQ2FzdChzZXA6OkNvbVByb3RvY29sOjpQUk9UT0NPTF9SRFZfS0lORCwgc2VwOjpDb21Qcm90b2NvbDo6UFJPVE9DT0xfVU5JQ0FTVF9LSU5EKTsgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAzOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQzNDY6NDogJ211bHRpcmR2JworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgzMjgsICZGT0xMT1dfMzI4X2luX2NvbV9wcm90b2NvbDE0MDA1KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlY29tX3Byb3RvY29sRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBjcC0+c2V0UHJvdG9jb2xDYXN0KHNlcDo6Q29tUHJvdG9jb2w6OlBST1RPQ09MX01VTFRJUkRWX0tJTkQsIHNlcDo6Q29tUHJvdG9jb2w6OlBST1RPQ09MX01VTFRJQ0FTVF9LSU5EKTsgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA0OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQzNDg6NDogJ2Zsb3cnCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDI4NCwgJkZPTExPV18yODRfaW5fY29tX3Byb3RvY29sMTQwMTQpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVjb21fcHJvdG9jb2xFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGNwLT5zZXRQcm90b2NvbENhc3Qoc2VwOjpDb21Qcm90b2NvbDo6UFJPVE9DT0xfRkxPV19LSU5ELCBzZXA6OkNvbVByb3RvY29sOjpQUk9UT0NPTF9NVUxUSUNBU1RfS0lORCk7IAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgNToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0MzUxOjQ6ICdhbnljYXN0JworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgyNDAsICZGT0xMT1dfMjQwX2luX2NvbV9wcm90b2NvbDE0MDI4KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlY29tX3Byb3RvY29sRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBjcC0+c2V0UHJvdG9jb2xDYXN0KHNlcDo6Q29tUHJvdG9jb2w6OlBST1RPQ09MX0FOWUNBU1RfS0lORCwgc2VwOjpDb21Qcm90b2NvbDo6UFJPVE9DT0xfQU5ZQ0FTVF9LSU5EKTsgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA2OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQzNTM6NDogJ3VuaWNhc3QnCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDQwMywgJkZPTExPV180MDNfaW5fY29tX3Byb3RvY29sMTQwMzgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVjb21fcHJvdG9jb2xFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGNwLT5zZXRQcm90b2NvbENhc3Qoc2VwOjpDb21Qcm90b2NvbDo6UFJPVE9DT0xfVU5JQ0FTVF9LSU5ELCBzZXA6OkNvbVByb3RvY29sOjpQUk9UT0NPTF9VTklDQVNUX0tJTkQpOyAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDc6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDM1NTo0OiAnbXVsdGljYXN0JworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgzMjQsICZGT0xMT1dfMzI0X2luX2NvbV9wcm90b2NvbDE0MDQ4KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlY29tX3Byb3RvY29sRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBjcC0+c2V0UHJvdG9jb2xDYXN0KHNlcDo6Q29tUHJvdG9jb2w6OlBST1RPQ09MX01VTFRJQ0FTVF9LSU5ELCBzZXA6OkNvbVByb3RvY29sOjpQUk9UT0NPTF9NVUxUSUNBU1RfS0lORCk7IAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgODoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0MzU3OjQ6ICdicm9hZGNhc3QnCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDI0OCwgJkZPTExPV18yNDhfaW5fY29tX3Byb3RvY29sMTQwNTYpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVjb21fcHJvdG9jb2xFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGNwLT5zZXRQcm90b2NvbENhc3Qoc2VwOjpDb21Qcm90b2NvbDo6UFJPVE9DT0xfQlJPQURDQVNUX0tJTkQsIHNlcDo6Q29tUHJvdG9jb2w6OlBST1RPQ09MX0JST0FEQ0FTVF9LSU5EKTsgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA5OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQzNTk6NDogYmM9IGJ1ZmZlcl9jb21bIG1hY2hpbmUgXQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfYnVmZmVyX2NvbV9pbl9jb21fcHJvdG9jb2wxNDA2Nik7CisgICAgICAgIAkgICAgICAgIGJjPWJ1ZmZlcl9jb20oY3R4LCBtYWNoaW5lKTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlY29tX3Byb3RvY29sRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKworICAgICAgICAJICAgICAgICAgICAgCQljcC0+c2V0UHJvdG9jb2woc2VwOjpDb21Qcm90b2NvbDo6UFJPVE9DT0xfQlVGRkVSX0tJTkQpOworICAgICAgICAJICAgICAgICAgICAgCQljcC0+c2V0QnVmZmVyKAorICAgICAgICAJICAgICAgICAgICAgYmMKKyAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgIAkgICAgICAgICAgICAJCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVjb21fcHJvdG9jb2xFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVjb21fcHJvdG9jb2xFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDE2MSwgY29tX3Byb3RvY29sX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBjb21fcHJvdG9jb2wgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgY29tX2Nhc3QKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQzNjY6MTogY29tX2Nhc3RbIHNlcDo6Q29tUHJvdG9jb2wgKiBjcCBdIDogKCAnYW55Y2FzdCcgfCAndW5pY2FzdCcgfCAnbXVsdGljYXN0JyB8ICdicm9hZGNhc3QnICk7CisgKi8KK3N0YXRpYyB2b2lkCitjb21fY2FzdChwZm1sUGFyc2VyIGN0eCwgc2VwOjpDb21Qcm90b2NvbCAqIGNwKQoreworICAgIEFOVExSM19VSU5UMzIgY29tX2Nhc3RfU3RhcnRJbmRleDsKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBjb21fY2FzdF9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgxNjIpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vICAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0MzY3OjI6ICggJ2FueWNhc3QnIHwgJ3VuaWNhc3QnIHwgJ211bHRpY2FzdCcgfCAnYnJvYWRjYXN0JyApCisKKyAgICAgICAgICAgIEFOVExSM19VSU5UMzIgYWx0MzgwOworCisgICAgICAgICAgICBhbHQzODA9NDsKKworICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAyNDA6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQzODA9MTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQwMzoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDM4MD0yOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzI0OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0MzgwPTM7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNDg6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQzODA9NDsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMzgwOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgZ290byBydWxlY29tX2Nhc3RFeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDM4MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0MzY3OjQ6ICdhbnljYXN0JworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgyNDAsICZGT0xMT1dfMjQwX2luX2NvbV9jYXN0MTQwODMpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVjb21fY2FzdEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgY3AtPnNldENhc3Qoc2VwOjpDb21Qcm90b2NvbDo6UFJPVE9DT0xfQU5ZQ0FTVF9LSU5EKTsgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAyOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQzNjg6NDogJ3VuaWNhc3QnCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDQwMywgJkZPTExPV180MDNfaW5fY29tX2Nhc3QxNDA5Myk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWNvbV9jYXN0RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBjcC0+c2V0Q2FzdChzZXA6OkNvbVByb3RvY29sOjpQUk9UT0NPTF9VTklDQVNUX0tJTkQpOyAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDM6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDM2OTo0OiAnbXVsdGljYXN0JworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgzMjQsICZGT0xMT1dfMzI0X2luX2NvbV9jYXN0MTQxMDMpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVjb21fY2FzdEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgY3AtPnNldENhc3Qoc2VwOjpDb21Qcm90b2NvbDo6UFJPVE9DT0xfTVVMVElDQVNUX0tJTkQpOyAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDQ6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDM3MDo0OiAnYnJvYWRjYXN0JworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgyNDgsICZGT0xMT1dfMjQ4X2luX2NvbV9jYXN0MTQxMTEpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVjb21fY2FzdEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgY3AtPnNldENhc3Qoc2VwOjpDb21Qcm90b2NvbDo6UFJPVE9DT0xfQlJPQURDQVNUX0tJTkQpOyAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZWNvbV9jYXN0RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlY29tX2Nhc3RFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDE2MiwgY29tX2Nhc3RfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGNvbV9jYXN0ICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGJ1ZmZlcl9jb20KKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQzNzM6MTogYnVmZmVyX2NvbVsgc2VwOjpNYWNoaW5lICogbWFjaGluZSBdIHJldHVybnMgWyBzZXA6OkJGIGJ1ZiBdIDogKCAnYnVmZmVyJyAoIENPTE9OIChyYj0gcmVmX2J1ZmZlclttYWNoaW5lXSB8ZGI9IGRlZl9idWZmZXIgKSB8IExUXyAocmI9IHJlZl9idWZmZXJbbWFjaGluZV0gfGRiPSBkZWZfYnVmZmVyICkgR1QgKSB8ZGI9IGRlZl9idWZmZXIgKTsKKyAqLworc3RhdGljIHNlcDo6QkYKK2J1ZmZlcl9jb20ocGZtbFBhcnNlciBjdHgsIHNlcDo6TWFjaGluZSAqIG1hY2hpbmUpCit7CisgICAgc2VwOjpCRiBidWY7CisKKyAgICBBTlRMUjNfVUlOVDMyIGJ1ZmZlcl9jb21fU3RhcnRJbmRleDsKKworICAgIHNlcDo6QkYgcmI7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX3JiCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9yYiBzZXA6OkJGCisKKyAgICBmbWxQYXJzZXJfZGVmX2J1ZmZlcl9yZXR1cm4gZGI7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2RiCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9kYiBmbWxQYXJzZXJfZGVmX2J1ZmZlcl9yZXR1cm4KKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBidWZmZXJfY29tX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDE2MykpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gYnVmOworICAgIH0KKworICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQzNzU6MjogKCAnYnVmZmVyJyAoIENPTE9OIChyYj0gcmVmX2J1ZmZlclttYWNoaW5lXSB8ZGI9IGRlZl9idWZmZXIgKSB8IExUXyAocmI9IHJlZl9idWZmZXJbbWFjaGluZV0gfGRiPSBkZWZfYnVmZmVyICkgR1QgKSB8ZGI9IGRlZl9idWZmZXIgKQorCisgICAgICAgICAgICBBTlRMUjNfVUlOVDMyIGFsdDM4NDsKKworICAgICAgICAgICAgYWx0Mzg0PTI7CisKKyAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMjQ5OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0Mzg0PTE7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyODE6CisgICAgICAgICAgICBjYXNlIDMxNToKKyAgICAgICAgICAgIGNhc2UgMzI1OgorICAgICAgICAgICAgY2FzZSAzMjY6CisgICAgICAgICAgICBjYXNlIDMyOToKKyAgICAgICAgICAgIGNhc2UgMzU2OgorICAgICAgICAgICAgY2FzZSAzNzA6CisgICAgICAgICAgICBjYXNlIDM3MzoKKyAgICAgICAgICAgIGNhc2UgNDEyOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0Mzg0PTI7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDM4NDsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWJ1ZmZlcl9jb21FeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDM4NCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0Mzc1OjQ6ICdidWZmZXInICggQ09MT04gKHJiPSByZWZfYnVmZmVyW21hY2hpbmVdIHxkYj0gZGVmX2J1ZmZlciApIHwgTFRfIChyYj0gcmVmX2J1ZmZlclttYWNoaW5lXSB8ZGI9IGRlZl9idWZmZXIgKSBHVCApCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDI0OSwgJkZPTExPV18yNDlfaW5fYnVmZmVyX2NvbTE0MTMyKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlYnVmZmVyX2NvbUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDM3Njo0OiAoIENPTE9OIChyYj0gcmVmX2J1ZmZlclttYWNoaW5lXSB8ZGI9IGRlZl9idWZmZXIgKSB8IExUXyAocmI9IHJlZl9idWZmZXJbbWFjaGluZV0gfGRiPSBkZWZfYnVmZmVyICkgR1QgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0MzgzPTI7CisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIENPTE9OOgorICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgIAkJYWx0MzgzPTE7CisgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgY2FzZSBMVF86CisgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgCQlhbHQzODM9MjsKKyAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIAkgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnVmOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMzgzOworICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlYnVmZmVyX2NvbUV4OworCisgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0MzgzKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQzNzY6NjogQ09MT04gKHJiPSByZWZfYnVmZmVyW21hY2hpbmVdIHxkYj0gZGVmX2J1ZmZlciApCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKENPTE9OLCAmRk9MTE9XX0NPTE9OX2luX2J1ZmZlcl9jb20xNDEzOSk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWJ1ZmZlcl9jb21FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBidWY7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQzNzc6NjogKHJiPSByZWZfYnVmZmVyW21hY2hpbmVdIHxkYj0gZGVmX2J1ZmZlciApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQzODE9MjsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGNhc2UgSUQ6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCQlhbHQzODE9MTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI4MToKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzE1OgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgY2FzZSAzMjU6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMyNjoKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzI5OgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgY2FzZSAzNTY6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM3MDoKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzczOgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgY2FzZSA0MTI6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCQlhbHQzODE9MjsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnVmOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMzgxOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlYnVmZmVyX2NvbUV4OworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0MzgxKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQzNzc6ODogcmI9IHJlZl9idWZmZXJbbWFjaGluZV0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3JlZl9idWZmZXJfaW5fYnVmZmVyX2NvbTE0MTUwKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgcmI9cmVmX2J1ZmZlcihjdHgsIG1hY2hpbmUpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVidWZmZXJfY29tRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYnVmOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICBidWY9IAorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmIKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAljYXNlIDI6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDM3ODo4OiBkYj0gZGVmX2J1ZmZlcgorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX2J1ZmZlcl9pbl9idWZmZXJfY29tMTQxNjUpOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBkYj1kZWZfYnVmZmVyKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWJ1ZmZlcl9jb21FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBidWY7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJCQlidWY9IHNlcDo6QkYoIG5ldyBzZXA6OkJ1ZmZlcihtYWNoaW5lLAorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCQkJCW5ld0J1ZmZlcklEKCksIAorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZGIua2luZAorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgLCBkYi5zaXplCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICApICk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0Mzg1OjY6IExUXyAocmI9IHJlZl9idWZmZXJbbWFjaGluZV0gfGRiPSBkZWZfYnVmZmVyICkgR1QKKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoTFRfLCAmRk9MTE9XX0xUX19pbl9idWZmZXJfY29tMTQxODcpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVidWZmZXJfY29tRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYnVmOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0Mzg2Ojg6IChyYj0gcmVmX2J1ZmZlclttYWNoaW5lXSB8ZGI9IGRlZl9idWZmZXIgKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0MzgyPTI7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBjYXNlIElEOgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkJYWx0MzgyPTE7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgY2FzZSAyODE6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMxNToKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzI1OgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgY2FzZSAzMjY6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMyOToKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzU2OgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgY2FzZSAzNzA6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM3MzoKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGNhc2UgNDEyOgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkJYWx0MzgyPTI7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDM4MjsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZWJ1ZmZlcl9jb21FeDsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDM4MikKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0Mzg2OjEwOiByYj0gcmVmX2J1ZmZlclttYWNoaW5lXQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfcmVmX2J1ZmZlcl9pbl9idWZmZXJfY29tMTQyMDApOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICByYj1yZWZfYnVmZmVyKGN0eCwgbWFjaGluZSk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWJ1ZmZlcl9jb21FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBidWY7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIGJ1Zj0gCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByYgorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0Mzg3OjEwOiBkYj0gZGVmX2J1ZmZlcgorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX2J1ZmZlcl9pbl9idWZmZXJfY29tMTQyMTcpOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBkYj1kZWZfYnVmZmVyKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWJ1ZmZlcl9jb21FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBidWY7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJCQkJYnVmPSBzZXA6OkJGKCBuZXcgc2VwOjpCdWZmZXIobWFjaGluZSwKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkJCQkJCSBuZXdCdWZmZXJJRCgpLCAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGRiLmtpbmQKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICwgZGIuc2l6ZQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgKSApOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJCQkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoR1QsICZGT0xMT1dfR1RfaW5fYnVmZmVyX2NvbTE0MjM4KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlYnVmZmVyX2NvbUV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAyOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQzOTU6NDogZGI9IGRlZl9idWZmZXIKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlZl9idWZmZXJfaW5fYnVmZmVyX2NvbTE0MjUwKTsKKyAgICAgICAgCSAgICAgICAgZGI9ZGVmX2J1ZmZlcihjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVidWZmZXJfY29tRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYnVmOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKworICAgICAgICAJICAgICAgICAgICAgCQlidWY9IHNlcDo6QkYoIG5ldyBzZXA6OkJ1ZmZlcihtYWNoaW5lLAorICAgICAgICAJICAgICAgICAgICAgCQkJCSBuZXdCdWZmZXJJRCgpLCAKKyAgICAgICAgCSAgICAgICAgICAgIGRiLmtpbmQKKyAgICAgICAgCSAgICAgICAgICAgICwgZGIuc2l6ZQorICAgICAgICAJICAgICAgICAgICAgKSApOworCisgICAgICAgIAkgICAgICAgICAgICAJCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVidWZmZXJfY29tRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlYnVmZmVyX2NvbUV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTYzLCBidWZmZXJfY29tX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gYnVmOworfQorLyogJEFOVExSIGVuZCBidWZmZXJfY29tICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGNvbV9jb25uZWN0CisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NDAzOjE6IGNvbV9jb25uZWN0WyBzZXA6Ok1hY2hpbmUgKiBtYWNoaW5lICwgc2VwOjpJbnRlcmFjdGlvblBhcnQgKiBhbkludGVyYWN0aW9uIF0gOiAoICggJ2Nvbm5lY3RvcicgfCAnY29ubmVjdCcgKSAoIExUXyBjb21fcHJvdG9jb2xbIG1hY2hpbmUsIGFDb25uZWN0b3IgXSAoIENPTU1BIGNvbV9jYXN0WyBhQ29ubmVjdG9yIF0gKT8gR1QgKT8gKCBJRCApPyBMQ1VSTFkgKCBjb21fcm91dGVbIG1hY2hpbmUsIGFDb25uZWN0b3IgXSApKyBSQ1VSTFkgfCAoICdyb3V0ZScgKSAoIExUXyBjb21fcHJvdG9jb2xbIG1hY2hpbmUsIGFDb25uZWN0b3IgXSAoIENPTU1BIGNvbV9jYXN0WyBhQ29ubmVjdG9yIF0gKT8gR1QgKT8gKCBjb21fcm91dGVbIG1hY2hpbmUsIGFDb25uZWN0b3IgXSB8IExDVVJMWSAoIGNvbV9yb3V0ZVsgbWFjaGluZSwgYUNvbm5lY3RvciBdICkrIFJDVVJMWSB8IExCUkFDS0VUICggY29tX3BvcnRbIG1hY2hpbmUgLCBjb21Sb3V0ZSBdICggQ09NTUEgY29tX3BvcnRbIG1hY2hpbmUgLCBjb21Sb3V0ZSBdICkqIHwgU1RBUiApIFJCUkFDS0VUIFNFTUkgKSApOworICovCitzdGF0aWMgdm9pZAorY29tX2Nvbm5lY3QocGZtbFBhcnNlciBjdHgsIHNlcDo6TWFjaGluZSAqIG1hY2hpbmUsIHNlcDo6SW50ZXJhY3Rpb25QYXJ0ICogYW5JbnRlcmFjdGlvbikKK3sKKyAgICBBTlRMUjNfVUlOVDMyIGNvbV9jb25uZWN0X1N0YXJ0SW5kZXg7CisKKyAgICBwQU5UTFIzX0NPTU1PTl9UT0tFTiAgICBJRDExOworCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGNvbV9jb25uZWN0X1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKworICAgIAlzZXA6OkNvbm5lY3RvciAqIGFDb25uZWN0b3I7CisgICAgCWFuSW50ZXJhY3Rpb24tPnNhdmVDb25uZWN0b3IoIGFDb25uZWN0b3IgPSBuZXcgc2VwOjpDb25uZWN0b3IoKmFuSW50ZXJhY3Rpb24pICk7CisgICAgCWFDb25uZWN0b3ItPnVwZGF0ZShhbkludGVyYWN0aW9uKTsKKyAgICAJc3RkOjpzdHJpbmcgY19pZDsKKworICAgIAlzZXA6OkNvbVJvdXRlICogY29tUm91dGUgPSBOVUxMOworCisgICAgCVNBVkVfUlVMRV9CRUdJTl9MT0NBVElPTjsKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTY0KSkgKQorICAgIHsKKyAgICAgICAgeworCisgICAgICAgICAgICAJU0VUX1JVTEVfTE9DQVRJT04oYUNvbm5lY3Rvcik7CisKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICBJRDExICAgICAgID0gTlVMTDsKKworICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ0MTg6MjogKCAoICdjb25uZWN0b3InIHwgJ2Nvbm5lY3QnICkgKCBMVF8gY29tX3Byb3RvY29sWyBtYWNoaW5lLCBhQ29ubmVjdG9yIF0gKCBDT01NQSBjb21fY2FzdFsgYUNvbm5lY3RvciBdICk/IEdUICk/ICggSUQgKT8gTENVUkxZICggY29tX3JvdXRlWyBtYWNoaW5lLCBhQ29ubmVjdG9yIF0gKSsgUkNVUkxZIHwgKCAncm91dGUnICkgKCBMVF8gY29tX3Byb3RvY29sWyBtYWNoaW5lLCBhQ29ubmVjdG9yIF0gKCBDT01NQSBjb21fY2FzdFsgYUNvbm5lY3RvciBdICk/IEdUICk/ICggY29tX3JvdXRlWyBtYWNoaW5lLCBhQ29ubmVjdG9yIF0gfCBMQ1VSTFkgKCBjb21fcm91dGVbIG1hY2hpbmUsIGFDb25uZWN0b3IgXSApKyBSQ1VSTFkgfCBMQlJBQ0tFVCAoIGNvbV9wb3J0WyBtYWNoaW5lICwgY29tUm91dGUgXSAoIENPTU1BIGNvbV9wb3J0WyBtYWNoaW5lICwgY29tUm91dGUgXSApKiB8IFNUQVIgKSBSQlJBQ0tFVCBTRU1JICkgKQorCisgICAgICAgICAgICBBTlRMUjNfVUlOVDMyIGFsdDM5NTsKKworICAgICAgICAgICAgYWx0Mzk1PTI7CisKKyAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMjYwOgorICAgICAgICAgICAgY2FzZSAyNjE6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQzOTU9MTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM2NjoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDM5NT0yOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAzOTU7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVjb21fY29ubmVjdEV4OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0Mzk1KQorICAgICAgICAgICAgeworICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ0MTg6NDogKCAnY29ubmVjdG9yJyB8ICdjb25uZWN0JyApICggTFRfIGNvbV9wcm90b2NvbFsgbWFjaGluZSwgYUNvbm5lY3RvciBdICggQ09NTUEgY29tX2Nhc3RbIGFDb25uZWN0b3IgXSApPyBHVCApPyAoIElEICk/IExDVVJMWSAoIGNvbV9yb3V0ZVsgbWFjaGluZSwgYUNvbm5lY3RvciBdICkrIFJDVVJMWQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgaWYgKCAoKExBKDEpID49IDI2MCkgJiYgKExBKDEpIDw9IDI2MSkpICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgQ09OU1VNRSgpOworICAgICAgICAJICAgICAgICAgICAgUEVSUk9SUkVDT1ZFUlk9QU5UTFIzX0ZBTFNFOworICAgICAgICAJICAgICAgICAgICAgRkFJTEVERkxBRz1BTlRMUjNfRkFMU0U7CisKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBlbHNlCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX01JU01BVENIRURfU0VUX0VYQ0VQVElPTjsKKyAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+bmFtZSAgICAgICAgID0gKHZvaWQgKilBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfTkFNRTsKKyAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+ZXhwZWN0aW5nU2V0ID0gTlVMTDsKKworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlY29tX2Nvbm5lY3RFeDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDQxOTo0OiAoIExUXyBjb21fcHJvdG9jb2xbIG1hY2hpbmUsIGFDb25uZWN0b3IgXSAoIENPTU1BIGNvbV9jYXN0WyBhQ29ubmVjdG9yIF0gKT8gR1QgKT8KKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDM4Nj0yOworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgTFRfOgorICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQlhbHQzODY9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQzODYpCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDQxOTo2OiBMVF8gY29tX3Byb3RvY29sWyBtYWNoaW5lLCBhQ29ubmVjdG9yIF0gKCBDT01NQSBjb21fY2FzdFsgYUNvbm5lY3RvciBdICk/IEdUCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKExUXywgJkZPTExPV19MVF9faW5fY29tX2Nvbm5lY3QxNDI5MSk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWNvbV9jb25uZWN0RXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19jb21fcHJvdG9jb2xfaW5fY29tX2Nvbm5lY3QxNDI5OCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGNvbV9wcm90b2NvbChjdHgsIG1hY2hpbmUsIGFDb25uZWN0b3IpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVjb21fY29ubmVjdEV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDQyMTo2OiAoIENPTU1BIGNvbV9jYXN0WyBhQ29ubmVjdG9yIF0gKT8KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDM4NT0yOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgQ09NTUE6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAJCWFsdDM4NT0xOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDM4NSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NDIxOjg6IENPTU1BIGNvbV9jYXN0WyBhQ29ubmVjdG9yIF0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoQ09NTUEsICZGT0xMT1dfQ09NTUFfaW5fY29tX2Nvbm5lY3QxNDMwOCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWNvbV9jb25uZWN0RXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19jb21fY2FzdF9pbl9jb21fY29ubmVjdDE0MzEwKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgY29tX2Nhc3QoY3R4LCBhQ29ubmVjdG9yKTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlY29tX2Nvbm5lY3RFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKEdULCAmRk9MTE9XX0dUX2luX2NvbV9jb25uZWN0MTQzMjEpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVjb21fY29ubmVjdEV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ0MjQ6NDogKCBJRCApPworICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0Mzg3PTI7CisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgICAgIAkJYWx0Mzg3PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0Mzg3KQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ0MjQ6NjogSUQKKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIElEMTEgPSAocEFOVExSM19DT01NT05fVE9LRU4pIE1BVENIVChJRCwgJkZPTExPV19JRF9pbl9jb21fY29ubmVjdDE0MzM0KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlY29tX2Nvbm5lY3RFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIGNfaWQgPSBTVFIoKElEMTEtPmdldFRleHQoSUQxMSkpLT5jaGFycyk7IAorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgYUNvbm5lY3Rvci0+ZnVsbHlVcGRhdGVBbGxOYW1lSUQobmV3Q29ubmVjdElEKGNfaWQsICJfI2Nvbm5lY3RvciIpKTsgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgICBNQVRDSFQoTENVUkxZLCAmRk9MTE9XX0xDVVJMWV9pbl9jb21fY29ubmVjdDE0MzQ5KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlY29tX2Nvbm5lY3RFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ0Mjc6NDogKCBjb21fcm91dGVbIG1hY2hpbmUsIGFDb25uZWN0b3IgXSApKworICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpbnQgY250Mzg4PTA7CisKKyAgICAgICAgCSAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgaW50IGFsdDM4OD0yOworICAgICAgICAJICAgICAgICAJc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAJeworICAgICAgICAJICAgICAgICAJY2FzZSBJRDoKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMjk4OgorICAgICAgICAJICAgICAgICAJY2FzZSAzMDU6CisgICAgICAgIAkgICAgICAgIAljYXNlIDM0MToKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMzY0OgorICAgICAgICAJICAgICAgICAJCXsKKyAgICAgICAgCSAgICAgICAgCQkJYWx0Mzg4PTE7CisgICAgICAgIAkgICAgICAgIAkJfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgIAl9CisKKyAgICAgICAgCSAgICAgICAgCXN3aXRjaCAoYWx0Mzg4KQorICAgICAgICAJICAgICAgICAJeworICAgICAgICAJICAgICAgICAJICAgIGNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDQyNzo2OiBjb21fcm91dGVbIG1hY2hpbmUsIGFDb25uZWN0b3IgXQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19jb21fcm91dGVfaW5fY29tX2Nvbm5lY3QxNDM1Nik7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBjb21fcm91dGUoY3R4LCBtYWNoaW5lLCBhQ29ubmVjdG9yKTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZWNvbV9jb25uZWN0RXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgCSAgICBkZWZhdWx0OgorCisgICAgICAgIAkgICAgICAgIAkJaWYgKCBjbnQzODggPj0gMSApCisgICAgICAgIAkgICAgICAgIAkJeworICAgICAgICAJICAgICAgICAJCSAgICBnb3RvIGxvb3AzODg7CisgICAgICAgIAkgICAgICAgIAkJfQorICAgICAgICAJICAgICAgICAJCWlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgCSAgICAgICAgCQl7CisgICAgICAgIAkgICAgICAgIAkJICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCSAgICAgICAgCQkgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCQl9CisKKyAgICAgICAgCSAgICAgICAgCQkvKiBtaXNtYXRjaGVkU2V0RXgoKQorICAgICAgICAJICAgICAgICAJCSAqLworICAgICAgICAJICAgICAgICAJCUNPTlNUUlVDVEVYKCk7CisgICAgICAgIAkgICAgICAgIAkJRVhDRVBUSU9OLT50eXBlID0gQU5UTFIzX0VBUkxZX0VYSVRfRVhDRVBUSU9OOworICAgICAgICAJICAgICAgICAJCUVYQ0VQVElPTi0+bmFtZSA9ICh2b2lkICopQU5UTFIzX0VBUkxZX0VYSVRfTkFNRTsKKworCisgICAgICAgIAkgICAgICAgIAkJZ290byBydWxlY29tX2Nvbm5lY3RFeDsKKyAgICAgICAgCSAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgCWNudDM4OCsrOworICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgbG9vcDM4ODogOwkvKiBKdW1wIHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgTUFUQ0hUKFJDVVJMWSwgJkZPTExPV19SQ1VSTFlfaW5fY29tX2Nvbm5lY3QxNDM2NSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWNvbV9jb25uZWN0RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NDMxOjQ6ICggJ3JvdXRlJyApICggTFRfIGNvbV9wcm90b2NvbFsgbWFjaGluZSwgYUNvbm5lY3RvciBdICggQ09NTUEgY29tX2Nhc3RbIGFDb25uZWN0b3IgXSApPyBHVCApPyAoIGNvbV9yb3V0ZVsgbWFjaGluZSwgYUNvbm5lY3RvciBdIHwgTENVUkxZICggY29tX3JvdXRlWyBtYWNoaW5lLCBhQ29ubmVjdG9yIF0gKSsgUkNVUkxZIHwgTEJSQUNLRVQgKCBjb21fcG9ydFsgbWFjaGluZSAsIGNvbVJvdXRlIF0gKCBDT01NQSBjb21fcG9ydFsgbWFjaGluZSAsIGNvbVJvdXRlIF0gKSogfCBTVEFSICkgUkJSQUNLRVQgU0VNSSApCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NDMxOjQ6ICggJ3JvdXRlJyApCisgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ0MzE6NjogJ3JvdXRlJworICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgTUFUQ0hUKDM2NiwgJkZPTExPV18zNjZfaW5fY29tX2Nvbm5lY3QxNDM3NCk7CisgICAgICAgIAkgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZWNvbV9jb25uZWN0RXg7CisgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworCisgICAgICAgIAkgICAgICAgICAgICAJICAJYUNvbm5lY3Rvci0+c2V0TmF0dXJlKCBzZXA6OklDb21Qb2ludDo6SU9fU0lHTkFMX05BVFVSRSApOworICAgICAgICAJICAgICAgICAgICAgCSAgCWFDb25uZWN0b3ItPmZ1bGx5VXBkYXRlQWxsTmFtZUlEKG5ld0Nvbm5lY3RJRCgiIiwgIl8jcm91dGUiKSk7CisgICAgICAgIAkgICAgICAgICAgICAJICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDQzNjo0OiAoIExUXyBjb21fcHJvdG9jb2xbIG1hY2hpbmUsIGFDb25uZWN0b3IgXSAoIENPTU1BIGNvbV9jYXN0WyBhQ29ubmVjdG9yIF0gKT8gR1QgKT8KKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDM5MD0yOworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgTFRfOgorICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQlhbHQzOTA9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQzOTApCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDQzNjo2OiBMVF8gY29tX3Byb3RvY29sWyBtYWNoaW5lLCBhQ29ubmVjdG9yIF0gKCBDT01NQSBjb21fY2FzdFsgYUNvbm5lY3RvciBdICk/IEdUCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKExUXywgJkZPTExPV19MVF9faW5fY29tX2Nvbm5lY3QxNDM4OCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWNvbV9jb25uZWN0RXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19jb21fcHJvdG9jb2xfaW5fY29tX2Nvbm5lY3QxNDM5NSk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGNvbV9wcm90b2NvbChjdHgsIG1hY2hpbmUsIGFDb25uZWN0b3IpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVjb21fY29ubmVjdEV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDQzODo2OiAoIENPTU1BIGNvbV9jYXN0WyBhQ29ubmVjdG9yIF0gKT8KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDM4OT0yOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgQ09NTUE6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAJCWFsdDM4OT0xOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDM4OSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NDM4Ojg6IENPTU1BIGNvbV9jYXN0WyBhQ29ubmVjdG9yIF0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoQ09NTUEsICZGT0xMT1dfQ09NTUFfaW5fY29tX2Nvbm5lY3QxNDQwNSk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWNvbV9jb25uZWN0RXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19jb21fY2FzdF9pbl9jb21fY29ubmVjdDE0NDA3KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgY29tX2Nhc3QoY3R4LCBhQ29ubmVjdG9yKTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlY29tX2Nvbm5lY3RFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKEdULCAmRk9MTE9XX0dUX2luX2NvbV9jb25uZWN0MTQ0MTgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVjb21fY29ubmVjdEV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ0NDI6NDogKCBjb21fcm91dGVbIG1hY2hpbmUsIGFDb25uZWN0b3IgXSB8IExDVVJMWSAoIGNvbV9yb3V0ZVsgbWFjaGluZSwgYUNvbm5lY3RvciBdICkrIFJDVVJMWSB8IExCUkFDS0VUICggY29tX3BvcnRbIG1hY2hpbmUgLCBjb21Sb3V0ZSBdICggQ09NTUEgY29tX3BvcnRbIG1hY2hpbmUgLCBjb21Sb3V0ZSBdICkqIHwgU1RBUiApIFJCUkFDS0VUIFNFTUkgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0Mzk0PTM7CisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIElEOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAyOTg6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMwNToKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzQxOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSAzNjQ6CisgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgCQlhbHQzOTQ9MTsKKyAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIExDVVJMWToKKyAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAJCWFsdDM5ND0yOworICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgTEJSQUNLRVQ6CisgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgCQlhbHQzOTQ9MzsKKyAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIAkgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMzk0OworICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlY29tX2Nvbm5lY3RFeDsKKworICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDM5NCkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NDQyOjY6IGNvbV9yb3V0ZVsgbWFjaGluZSwgYUNvbm5lY3RvciBdCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19jb21fcm91dGVfaW5fY29tX2Nvbm5lY3QxNDQzMik7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGNvbV9yb3V0ZShjdHgsIG1hY2hpbmUsIGFDb25uZWN0b3IpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVjb21fY29ubmVjdEV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAljYXNlIDI6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDQ0NDo2OiBMQ1VSTFkgKCBjb21fcm91dGVbIG1hY2hpbmUsIGFDb25uZWN0b3IgXSApKyBSQ1VSTFkKKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoTENVUkxZLCAmRk9MTE9XX0xDVVJMWV9pbl9jb21fY29ubmVjdDE0NDQxKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlY29tX2Nvbm5lY3RFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ0NDU6NjogKCBjb21fcm91dGVbIG1hY2hpbmUsIGFDb25uZWN0b3IgXSApKworICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpbnQgY250MzkxPTA7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgaW50IGFsdDM5MT0yOworICAgICAgICAJICAgICAgICAJICAgICAgICAJc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJeworICAgICAgICAJICAgICAgICAJICAgICAgICAJY2FzZSBJRDoKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCWNhc2UgMjk4OgorICAgICAgICAJICAgICAgICAJICAgICAgICAJY2FzZSAzMDU6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAljYXNlIDM0MToKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCWNhc2UgMzY0OgorICAgICAgICAJICAgICAgICAJICAgICAgICAJCXsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCQkJYWx0MzkxPTE7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkJfQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAl9CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCXN3aXRjaCAoYWx0MzkxKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIGNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDQ0NTo4OiBjb21fcm91dGVbIG1hY2hpbmUsIGFDb25uZWN0b3IgXQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19jb21fcm91dGVfaW5fY29tX2Nvbm5lY3QxNDQ1MCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBjb21fcm91dGUoY3R4LCBtYWNoaW5lLCBhQ29ubmVjdG9yKTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZWNvbV9jb25uZWN0RXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICBkZWZhdWx0OgorCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkJaWYgKCBjbnQzOTEgPj0gMSApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkJeworICAgICAgICAJICAgICAgICAJICAgICAgICAJCSAgICBnb3RvIGxvb3AzOTE7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkJfQorICAgICAgICAJICAgICAgICAJICAgICAgICAJCWlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCQl7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkJICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCQkgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCQl9CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCQkvKiBtaXNtYXRjaGVkU2V0RXgoKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJCSAqLworICAgICAgICAJICAgICAgICAJICAgICAgICAJCUNPTlNUUlVDVEVYKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkJRVhDRVBUSU9OLT50eXBlID0gQU5UTFIzX0VBUkxZX0VYSVRfRVhDRVBUSU9OOworICAgICAgICAJICAgICAgICAJICAgICAgICAJCUVYQ0VQVElPTi0+bmFtZSA9ICh2b2lkICopQU5UTFIzX0VBUkxZX0VYSVRfTkFNRTsKKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkJZ290byBydWxlY29tX2Nvbm5lY3RFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCWNudDM5MSsrOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgbG9vcDM5MTogOwkvKiBKdW1wIHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKFJDVVJMWSwgJkZPTExPV19SQ1VSTFlfaW5fY29tX2Nvbm5lY3QxNDQ2MSk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWNvbV9jb25uZWN0RXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMzoKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NDQ4OjY6IExCUkFDS0VUICggY29tX3BvcnRbIG1hY2hpbmUgLCBjb21Sb3V0ZSBdICggQ09NTUEgY29tX3BvcnRbIG1hY2hpbmUgLCBjb21Sb3V0ZSBdICkqIHwgU1RBUiApIFJCUkFDS0VUIFNFTUkKKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoTEJSQUNLRVQsICZGT0xMT1dfTEJSQUNLRVRfaW5fY29tX2Nvbm5lY3QxNDQ2OSk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWNvbV9jb25uZWN0RXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAJY29tUm91dGUgPSBuZXcgc2VwOjpDb21Sb3V0ZShhQ29ubmVjdG9yLAorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAJCQlzZXA6Ok1vZGlmaWVyOjpQUk9QRVJUWV9JTk9VVF9ESVJFQ1RJT04pOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgIAlhQ29ubmVjdG9yLT5hcHBlbmRDb21Sb3V0ZShjb21Sb3V0ZSk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgIAorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NDU0OjY6ICggY29tX3BvcnRbIG1hY2hpbmUgLCBjb21Sb3V0ZSBdICggQ09NTUEgY29tX3BvcnRbIG1hY2hpbmUgLCBjb21Sb3V0ZSBdICkqIHwgU1RBUiApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQzOTM9MjsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGNhc2UgSUQ6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCQlhbHQzOTM9MTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBjYXNlIFNUQVI6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCQlhbHQzOTM9MjsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gMzkzOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlY29tX2Nvbm5lY3RFeDsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDM5MykKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NDU0Ojg6IGNvbV9wb3J0WyBtYWNoaW5lICwgY29tUm91dGUgXSAoIENPTU1BIGNvbV9wb3J0WyBtYWNoaW5lICwgY29tUm91dGUgXSApKgorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfY29tX3BvcnRfaW5fY29tX2Nvbm5lY3QxNDQ4NSk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGNvbV9wb3J0KGN0eCwgbWFjaGluZSwgY29tUm91dGUpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVjb21fY29ubmVjdEV4OworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDQ1NTo4OiAoIENPTU1BIGNvbV9wb3J0WyBtYWNoaW5lICwgY29tUm91dGUgXSApKgorCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGZvciAoOzspCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQzOTI9MjsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGNhc2UgQ09NTUE6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCQlhbHQzOTI9MTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQzOTIpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDQ1NToxMDogQ09NTUEgY29tX3BvcnRbIG1hY2hpbmUgLCBjb21Sb3V0ZSBdCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKENPTU1BLCAmRk9MTE9XX0NPTU1BX2luX2NvbV9jb25uZWN0MTQ0OTcpOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVjb21fY29ubmVjdEV4OworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfY29tX3BvcnRfaW5fY29tX2Nvbm5lY3QxNDUwMCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGNvbV9wb3J0KGN0eCwgbWFjaGluZSwgY29tUm91dGUpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVjb21fY29ubmVjdEV4OworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgCWRlZmF1bHQ6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgZ290byBsb29wMzkyOwkvKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgKi8KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBsb29wMzkyOiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NDU3Ojg6IFNUQVIKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoU1RBUiwgJkZPTExPV19TVEFSX2luX2NvbV9jb25uZWN0MTQ1MTQpOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVjb21fY29ubmVjdEV4OworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkJCXNlcDo6Q29tUG9pbnQgKiBjb21Qb2ludCA9IG5ldyBzZXA6OkNvbVBvaW50KCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgIAljb21Qb2ludC0+c2V0TWFjaGluZUFsbFNpZ25hbChtYWNoaW5lKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkJCWNvbVJvdXRlLT5zZXRDb21Qb2ludChjb21Qb2ludCwgc2VwOjpNb2RpZmllcjo6RElSRUNUSU9OX0lOT1VUX0tJTkQpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJCQlTRVRfUlVMRV9MT0NBVElPTihjb21Qb2ludCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgIAorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChSQlJBQ0tFVCwgJkZPTExPV19SQlJBQ0tFVF9pbl9jb21fY29ubmVjdDE0NTM1KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlY29tX2Nvbm5lY3RFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoU0VNSSwgJkZPTExPV19TRU1JX2luX2NvbV9jb25uZWN0MTQ1NDIpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVjb21fY29ubmVjdEV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVjb21fY29ubmVjdEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZWNvbV9jb25uZWN0RXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIAlTRVRfUlVMRV9MT0NBVElPTihhQ29ubmVjdG9yKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgxNjQsIGNvbV9jb25uZWN0X1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBjb21fY29ubmVjdCAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBjb21fcm91dGUKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ0NzI6MTogY29tX3JvdXRlWyBzZXA6Ok1hY2hpbmUgKiBtYWNoaW5lICwgc2VwOjpDb25uZWN0b3IgKiBhQ29ubmVjdG9yIF0gOiAoIG1vZGlmaWVyX3NldF9kaXJlY3Rpb25fc3RyaWN0X3RleHRbIGNvbVJvdXRlLT5nZXR3TW9kaWZpZXIoKSBdICggTFRfIChiYz0gYnVmZmVyX2NvbVsgbWFjaGluZSBdIHwgY29tX2Nhc3RbIGNvbVJvdXRlIF0gKSBHVCApPyAoIGNvbV9wb3J0WyBtYWNoaW5lICwgY29tUm91dGUgXSBTRU1JIHwgTENVUkxZICggY29tX3BvcnRbIG1hY2hpbmUgLCBjb21Sb3V0ZSBdIFNFTUkgKSsgUkNVUkxZIHwgTEJSQUNLRVQgKCBjb21fcG9ydFsgbWFjaGluZSAsIGNvbVJvdXRlIF0gKCBDT01NQSBjb21fcG9ydFsgbWFjaGluZSAsIGNvbVJvdXRlIF0gKSogfCBTVEFSICkgUkJSQUNLRVQgU0VNSSApIHwgY29tX3BvcnRbIG1hY2hpbmUgLCBjb21Sb3V0ZSBdIFNFTUkgKTsKKyAqLworc3RhdGljIHZvaWQKK2NvbV9yb3V0ZShwZm1sUGFyc2VyIGN0eCwgc2VwOjpNYWNoaW5lICogbWFjaGluZSwgc2VwOjpDb25uZWN0b3IgKiBhQ29ubmVjdG9yKQoreworICAgIEFOVExSM19VSU5UMzIgY29tX3JvdXRlX1N0YXJ0SW5kZXg7CisKKyAgICBzZXA6OkJGIGJjOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9iYworICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfYmMgc2VwOjpCRgorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGNvbV9yb3V0ZV9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisKKyAgICAJc2VwOjpDb21Sb3V0ZSAqIGNvbVJvdXRlID0gbmV3IHNlcDo6Q29tUm91dGUoYUNvbm5lY3Rvcik7CisgICAgCWFDb25uZWN0b3ItPmFwcGVuZENvbVJvdXRlKGNvbVJvdXRlKTsKKworICAgIAlTQVZFX1JVTEVfQkVHSU5fTE9DQVRJT047CisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDE2NSkpICkKKyAgICB7CisgICAgICAgIHsKKworICAgICAgICAgICAgCVNFVF9SVUxFX0xPQ0FUSU9OKGNvbVJvdXRlKTsKKworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ0ODM6MjogKCBtb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0WyBjb21Sb3V0ZS0+Z2V0d01vZGlmaWVyKCkgXSAoIExUXyAoYmM9IGJ1ZmZlcl9jb21bIG1hY2hpbmUgXSB8IGNvbV9jYXN0WyBjb21Sb3V0ZSBdICkgR1QgKT8gKCBjb21fcG9ydFsgbWFjaGluZSAsIGNvbVJvdXRlIF0gU0VNSSB8IExDVVJMWSAoIGNvbV9wb3J0WyBtYWNoaW5lICwgY29tUm91dGUgXSBTRU1JICkrIFJDVVJMWSB8IExCUkFDS0VUICggY29tX3BvcnRbIG1hY2hpbmUgLCBjb21Sb3V0ZSBdICggQ09NTUEgY29tX3BvcnRbIG1hY2hpbmUgLCBjb21Sb3V0ZSBdICkqIHwgU1RBUiApIFJCUkFDS0VUIFNFTUkgKSB8IGNvbV9wb3J0WyBtYWNoaW5lICwgY29tUm91dGUgXSBTRU1JICkKKworICAgICAgICAgICAgQU5UTFIzX1VJTlQzMiBhbHQ0MDI7CisKKyAgICAgICAgICAgIGFsdDQwMj0yOworCisgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDI5ODoKKyAgICAgICAgICAgIGNhc2UgMzA1OgorICAgICAgICAgICAgY2FzZSAzNDE6CisgICAgICAgICAgICBjYXNlIDM2NDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQwMj0xOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSUQ6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ0MDI9MjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gNDAyOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgZ290byBydWxlY29tX3JvdXRlRXg7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQ0MDIpCisgICAgICAgICAgICB7CisgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDQ4Mzo0OiBtb2RpZmllcl9zZXRfZGlyZWN0aW9uX3N0cmljdF90ZXh0WyBjb21Sb3V0ZS0+Z2V0d01vZGlmaWVyKCkgXSAoIExUXyAoYmM9IGJ1ZmZlcl9jb21bIG1hY2hpbmUgXSB8IGNvbV9jYXN0WyBjb21Sb3V0ZSBdICkgR1QgKT8gKCBjb21fcG9ydFsgbWFjaGluZSAsIGNvbVJvdXRlIF0gU0VNSSB8IExDVVJMWSAoIGNvbV9wb3J0WyBtYWNoaW5lICwgY29tUm91dGUgXSBTRU1JICkrIFJDVVJMWSB8IExCUkFDS0VUICggY29tX3BvcnRbIG1hY2hpbmUgLCBjb21Sb3V0ZSBdICggQ09NTUEgY29tX3BvcnRbIG1hY2hpbmUgLCBjb21Sb3V0ZSBdICkqIHwgU1RBUiApIFJCUkFDS0VUIFNFTUkgKQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfbW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dF9pbl9jb21fcm91dGUxNDU3MCk7CisgICAgICAgIAkgICAgICAgIG1vZGlmaWVyX3NldF9kaXJlY3Rpb25fc3RyaWN0X3RleHQoY3R4LCBjb21Sb3V0ZS0+Z2V0d01vZGlmaWVyKCkpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVjb21fcm91dGVFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ0ODQ6NDogKCBMVF8gKGJjPSBidWZmZXJfY29tWyBtYWNoaW5lIF0gfCBjb21fY2FzdFsgY29tUm91dGUgXSApIEdUICk/CisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQzOTc9MjsKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIExUXzoKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgICAgIAkJYWx0Mzk3PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0Mzk3KQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ0ODQ6NjogTFRfIChiYz0gYnVmZmVyX2NvbVsgbWFjaGluZSBdIHwgY29tX2Nhc3RbIGNvbVJvdXRlIF0gKSBHVAorICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChMVF8sICZGT0xMT1dfTFRfX2luX2NvbV9yb3V0ZTE0NTc4KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlY29tX3JvdXRlRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NDg0OjEwOiAoYmM9IGJ1ZmZlcl9jb21bIG1hY2hpbmUgXSB8IGNvbV9jYXN0WyBjb21Sb3V0ZSBdICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDM5Nj0yOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgY2FzZSAyNDk6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI4MToKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzE1OgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgY2FzZSAzMjU6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMyNjoKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzI5OgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgY2FzZSAzNTY6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM3MDoKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzczOgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgY2FzZSA0MTI6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCQlhbHQzOTY9MTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI0MDoKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjQ4OgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgY2FzZSAzMjQ6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBjYXNlIDQwMzoKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJCWFsdDM5Nj0yOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSAzOTY7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVjb21fcm91dGVFeDsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDM5NikKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NDg1OjY6IGJjPSBidWZmZXJfY29tWyBtYWNoaW5lIF0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2J1ZmZlcl9jb21faW5fY29tX3JvdXRlMTQ1ODkpOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBiYz1idWZmZXJfY29tKGN0eCwgbWFjaGluZSk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWNvbV9yb3V0ZUV4OworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgCWNvbVJvdXRlLT5zZXRQcm90b2NvbChzZXA6OkNvbVByb3RvY29sOjpQUk9UT0NPTF9CVUZGRVJfS0lORCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgIAljb21Sb3V0ZS0+c2V0QnVmZmVyKGJjCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICApOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAljYXNlIDI6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDQ5MDo4OiBjb21fY2FzdFsgY29tUm91dGUgXQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfY29tX2Nhc3RfaW5fY29tX3JvdXRlMTQ2MDYpOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBjb21fY2FzdChjdHgsIGNvbVJvdXRlKTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlY29tX3JvdXRlRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChHVCwgJkZPTExPV19HVF9pbl9jb21fcm91dGUxNDYxNCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWNvbV9yb3V0ZUV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ0OTM6NDogKCBjb21fcG9ydFsgbWFjaGluZSAsIGNvbVJvdXRlIF0gU0VNSSB8IExDVVJMWSAoIGNvbV9wb3J0WyBtYWNoaW5lICwgY29tUm91dGUgXSBTRU1JICkrIFJDVVJMWSB8IExCUkFDS0VUICggY29tX3BvcnRbIG1hY2hpbmUgLCBjb21Sb3V0ZSBdICggQ09NTUEgY29tX3BvcnRbIG1hY2hpbmUgLCBjb21Sb3V0ZSBdICkqIHwgU1RBUiApIFJCUkFDS0VUIFNFTUkgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0NDAxPTM7CisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIElEOgorICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgIAkJYWx0NDAxPTE7CisgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgY2FzZSBMQ1VSTFk6CisgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgCQlhbHQ0MDE9MjsKKyAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIExCUkFDS0VUOgorICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgIAkJYWx0NDAxPTM7CisgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAJICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDQwMTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZWNvbV9yb3V0ZUV4OworCisgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0NDAxKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ0OTM6NjogY29tX3BvcnRbIG1hY2hpbmUgLCBjb21Sb3V0ZSBdIFNFTUkKKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2NvbV9wb3J0X2luX2NvbV9yb3V0ZTE0NjI1KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgY29tX3BvcnQoY3R4LCBtYWNoaW5lLCBjb21Sb3V0ZSk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWNvbV9yb3V0ZUV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChTRU1JLCAmRk9MTE9XX1NFTUlfaW5fY29tX3JvdXRlMTQ2MjkpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVjb21fcm91dGVFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAJY2FzZSAyOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ0OTU6NjogTENVUkxZICggY29tX3BvcnRbIG1hY2hpbmUgLCBjb21Sb3V0ZSBdIFNFTUkgKSsgUkNVUkxZCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKExDVVJMWSwgJkZPTExPV19MQ1VSTFlfaW5fY29tX3JvdXRlMTQ2MzcpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVjb21fcm91dGVFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ0OTY6NjogKCBjb21fcG9ydFsgbWFjaGluZSAsIGNvbVJvdXRlIF0gU0VNSSApKworICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpbnQgY250Mzk4PTA7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgaW50IGFsdDM5OD0yOworICAgICAgICAJICAgICAgICAJICAgICAgICAJc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJeworICAgICAgICAJICAgICAgICAJICAgICAgICAJY2FzZSBJRDoKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCQl7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkJCWFsdDM5OD0xOworICAgICAgICAJICAgICAgICAJICAgICAgICAJCX0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJfQorCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAlzd2l0Y2ggKGFsdDM5OCkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICBjYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ0OTY6ODogY29tX3BvcnRbIG1hY2hpbmUgLCBjb21Sb3V0ZSBdIFNFTUkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfY29tX3BvcnRfaW5fY29tX3JvdXRlMTQ2NDYpOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgY29tX3BvcnQoY3R4LCBtYWNoaW5lLCBjb21Sb3V0ZSk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVjb21fcm91dGVFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICBNQVRDSFQoU0VNSSwgJkZPTExPV19TRU1JX2luX2NvbV9yb3V0ZTE0NjUwKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlY29tX3JvdXRlRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICBkZWZhdWx0OgorCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkJaWYgKCBjbnQzOTggPj0gMSApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkJeworICAgICAgICAJICAgICAgICAJICAgICAgICAJCSAgICBnb3RvIGxvb3AzOTg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkJfQorICAgICAgICAJICAgICAgICAJICAgICAgICAJCWlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCQl7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkJICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCQkgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCQl9CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCQkvKiBtaXNtYXRjaGVkU2V0RXgoKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJCSAqLworICAgICAgICAJICAgICAgICAJICAgICAgICAJCUNPTlNUUlVDVEVYKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkJRVhDRVBUSU9OLT50eXBlID0gQU5UTFIzX0VBUkxZX0VYSVRfRVhDRVBUSU9OOworICAgICAgICAJICAgICAgICAJICAgICAgICAJCUVYQ0VQVElPTi0+bmFtZSA9ICh2b2lkICopQU5UTFIzX0VBUkxZX0VYSVRfTkFNRTsKKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkJZ290byBydWxlY29tX3JvdXRlRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAljbnQzOTgrKzsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGxvb3AzOTg6IDsJLyogSnVtcCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChSQ1VSTFksICZGT0xMT1dfUkNVUkxZX2luX2NvbV9yb3V0ZTE0NjYwKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlY29tX3JvdXRlRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMzoKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NDk5OjY6IExCUkFDS0VUICggY29tX3BvcnRbIG1hY2hpbmUgLCBjb21Sb3V0ZSBdICggQ09NTUEgY29tX3BvcnRbIG1hY2hpbmUgLCBjb21Sb3V0ZSBdICkqIHwgU1RBUiApIFJCUkFDS0VUIFNFTUkKKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoTEJSQUNLRVQsICZGT0xMT1dfTEJSQUNLRVRfaW5fY29tX3JvdXRlMTQ2NjgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVjb21fcm91dGVFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ1MDA6NjogKCBjb21fcG9ydFsgbWFjaGluZSAsIGNvbVJvdXRlIF0gKCBDT01NQSBjb21fcG9ydFsgbWFjaGluZSAsIGNvbVJvdXRlIF0gKSogfCBTVEFSICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDQwMD0yOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJCWFsdDQwMD0xOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGNhc2UgU1RBUjoKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJCWFsdDQwMD0yOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA0MDA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVjb21fcm91dGVFeDsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDQwMCkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NTAwOjg6IGNvbV9wb3J0WyBtYWNoaW5lICwgY29tUm91dGUgXSAoIENPTU1BIGNvbV9wb3J0WyBtYWNoaW5lICwgY29tUm91dGUgXSApKgorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfY29tX3BvcnRfaW5fY29tX3JvdXRlMTQ2NzcpOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBjb21fcG9ydChjdHgsIG1hY2hpbmUsIGNvbVJvdXRlKTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlY29tX3JvdXRlRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NTAxOjg6ICggQ09NTUEgY29tX3BvcnRbIG1hY2hpbmUgLCBjb21Sb3V0ZSBdICkqCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgZm9yICg7OykKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDM5OT0yOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgY2FzZSBDT01NQToKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJCWFsdDM5OT0xOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDM5OSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NTAxOjEwOiBDT01NQSBjb21fcG9ydFsgbWFjaGluZSAsIGNvbVJvdXRlIF0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoQ09NTUEsICZGT0xMT1dfQ09NTUFfaW5fY29tX3JvdXRlMTQ2ODkpOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVjb21fcm91dGVFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2NvbV9wb3J0X2luX2NvbV9yb3V0ZTE0NjkyKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgY29tX3BvcnQoY3R4LCBtYWNoaW5lLCBjb21Sb3V0ZSk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWNvbV9yb3V0ZUV4OworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgCWRlZmF1bHQ6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgZ290byBsb29wMzk5OwkvKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgKi8KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBsb29wMzk5OiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NTAzOjg6IFNUQVIKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoU1RBUiwgJkZPTExPV19TVEFSX2luX2NvbV9yb3V0ZTE0NzA2KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlY29tX3JvdXRlRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCQkJc2VwOjpDb21Qb2ludCAqIGNvbVBvaW50ID0gbmV3IHNlcDo6Q29tUG9pbnQoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgCWNvbVBvaW50LT5zZXRNYWNoaW5lQWxsU2lnbmFsKG1hY2hpbmUpOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCQkJY29tUm91dGUtPnNldENvbVBvaW50KGNvbVBvaW50LCBzZXA6Ok1vZGlmaWVyOjpESVJFQ1RJT05fSU5PVVRfS0lORCk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkJCVNFVF9SVUxFX0xPQ0FUSU9OKGNvbVBvaW50KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKFJCUkFDS0VULCAmRk9MTE9XX1JCUkFDS0VUX2luX2NvbV9yb3V0ZTE0NzI3KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlY29tX3JvdXRlRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKFNFTUksICZGT0xMT1dfU0VNSV9pbl9jb21fcm91dGUxNDczNCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWNvbV9yb3V0ZUV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAyOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ1MTY6NzogY29tX3BvcnRbIG1hY2hpbmUgLCBjb21Sb3V0ZSBdIFNFTUkKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2NvbV9wb3J0X2luX2NvbV9yb3V0ZTE0NzQ4KTsKKyAgICAgICAgCSAgICAgICAgY29tX3BvcnQoY3R4LCBtYWNoaW5lLCBjb21Sb3V0ZSk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWNvbV9yb3V0ZUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChTRU1JLCAmRk9MTE9XX1NFTUlfaW5fY29tX3JvdXRlMTQ3NTIpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVjb21fcm91dGVFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVjb21fcm91dGVFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVjb21fcm91dGVFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgCVNFVF9SVUxFX0xPQ0FUSU9OKGNvbVJvdXRlKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgxNjUsIGNvbV9yb3V0ZV9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgY29tX3JvdXRlICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGNvbV9wb3J0CisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NTIwOjE6IGNvbV9wb3J0WyBzZXA6Ok1hY2hpbmUgKiBtYWNoaW5lICwgc2VwOjpDb21Sb3V0ZSAqIGNvbVJvdXRlXSA6ICggKCBxdWFsaWZpZWROYW1lSUQgJy0+JyApPT5tPSBxdWFsaWZpZWROYW1lSUQgJy0+JyAoY3A9IGNvbV9wb3J0X2lkWyBtYWNoaW5lICwgY29tTWFjaGluZSBdIHwgTEJSQUNLRVQgKGNwPSBjb21fcG9ydF9pZFsgbWFjaGluZSAsIGNvbU1hY2hpbmUgXSAoIENPTU1BIGNwPSBjb21fcG9ydF9pZFsgbWFjaGluZSAsIGNvbU1hY2hpbmUgXSApKiB8IFNUQVIgKSBSQlJBQ0tFVCApIHxjcD0gY29tX3BvcnRfaWRbIG1hY2hpbmUgLCBjb21NYWNoaW5lIF0gKTsKKyAqLworc3RhdGljIHZvaWQKK2NvbV9wb3J0KHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBtYWNoaW5lLCBzZXA6OkNvbVJvdXRlICogY29tUm91dGUpCit7CisgICAgQU5UTFIzX1VJTlQzMiBjb21fcG9ydF9TdGFydEluZGV4OworCisgICAgZm1sUGFyc2VyX3F1YWxpZmllZE5hbWVJRF9yZXR1cm4gbTsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfbQorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfbSBmbWxQYXJzZXJfcXVhbGlmaWVkTmFtZUlEX3JldHVybgorCisgICAgc2VwOjpCRiBjcDsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfY3AKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2NwIHNlcDo6QkYKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBjb21fcG9ydF9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisKKyAgICAJc2VwOjpNYWNoaW5lICogY29tTWFjaGluZSA9IG1hY2hpbmU7CisgICAgCXdoaWxlKCBjb21NYWNoaW5lICE9IE5VTEwgKQorICAgIAl7CisgICAgCQlpZiggY29tTWFjaGluZS0+aGFzUG9ydFNpZ25hbCgpIHx8ICghIGNvbU1hY2hpbmUtPmhhc0NvbnRhaW5lcigpKSApCisgICAgCQl7CisgICAgCQkJYnJlYWs7CisgICAgCQl9CisgICAgCQljb21NYWNoaW5lID0gY29tTWFjaGluZS0+Z2V0Q29udGFpbmVyTWFjaGluZSgpOworICAgIAl9CisKKyAgICAJU0FWRV9SVUxFX0JFR0lOX0xPQ0FUSU9OOworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgxNjYpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vICAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NTM1OjI6ICggKCBxdWFsaWZpZWROYW1lSUQgJy0+JyApPT5tPSBxdWFsaWZpZWROYW1lSUQgJy0+JyAoY3A9IGNvbV9wb3J0X2lkWyBtYWNoaW5lICwgY29tTWFjaGluZSBdIHwgTEJSQUNLRVQgKGNwPSBjb21fcG9ydF9pZFsgbWFjaGluZSAsIGNvbU1hY2hpbmUgXSAoIENPTU1BIGNwPSBjb21fcG9ydF9pZFsgbWFjaGluZSAsIGNvbU1hY2hpbmUgXSApKiB8IFNUQVIgKSBSQlJBQ0tFVCApIHxjcD0gY29tX3BvcnRfaWRbIG1hY2hpbmUgLCBjb21NYWNoaW5lIF0gKQorCisgICAgICAgICAgICBBTlRMUjNfVUlOVDMyIGFsdDQwNjsKKworICAgICAgICAgICAgYWx0NDA2PTI7CisKKyAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgSUQ6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAJCSAgICBpbnQgTEE0MDZfMSA9IExBKDIpOworICAgICAgICAgICAgCQkgICAgaWYgKCAoc3lucHJlZDcwNV9mbWwoY3R4KSkpCisgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAJCSAgICAgICAgYWx0NDA2PTE7CisgICAgICAgICAgICAJCSAgICB9CisgICAgICAgICAgICAJCSAgICBlbHNlIGlmICggKEFOVExSM19UUlVFKSkKKyAgICAgICAgICAgIAkJICAgIHsKKyAgICAgICAgICAgIAkJICAgICAgICBhbHQ0MDY9MjsKKyAgICAgICAgICAgIAkJICAgIH0KKyAgICAgICAgICAgIAkJICAgIGVsc2UKKyAgICAgICAgICAgIAkJICAgIHsKKyAgICAgICAgICAgIAkJICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAJCSAgICAgICAgeworICAgICAgICAgICAgCQkgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAJCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkJICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgCQkgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgCQkgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgIAkJICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDQwNjsKKyAgICAgICAgICAgIAkJICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDE7CisKKworICAgICAgICAgICAgCQkgICAgICAgIGdvdG8gcnVsZWNvbV9wb3J0RXg7CisKKyAgICAgICAgICAgIAkJICAgIH0KKyAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA0MDY7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVjb21fcG9ydEV4OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NDA2KQorICAgICAgICAgICAgeworICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ1MzU6NDogKCBxdWFsaWZpZWROYW1lSUQgJy0+JyApPT5tPSBxdWFsaWZpZWROYW1lSUQgJy0+JyAoY3A9IGNvbV9wb3J0X2lkWyBtYWNoaW5lICwgY29tTWFjaGluZSBdIHwgTEJSQUNLRVQgKGNwPSBjb21fcG9ydF9pZFsgbWFjaGluZSAsIGNvbU1hY2hpbmUgXSAoIENPTU1BIGNwPSBjb21fcG9ydF9pZFsgbWFjaGluZSAsIGNvbU1hY2hpbmUgXSApKiB8IFNUQVIgKSBSQlJBQ0tFVCApCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fY29tX3BvcnQxNDc4Nik7CisgICAgICAgIAkgICAgICAgIG09cXVhbGlmaWVkTmFtZUlEKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWNvbV9wb3J0RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBjb21NYWNoaW5lID0gc2VwOjpQYXJzZXJVdGlsOjpnZXRNYWNoaW5lKG1hY2hpbmUsIG0ucworICAgICAgICAJICAgICAgICAgICAgLCBtLm5iCisgICAgICAgIAkgICAgICAgICAgICApOyAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgxNjQsICZGT0xMT1dfMTY0X2luX2NvbV9wb3J0MTQ4MDApOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVjb21fcG9ydEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDU0MTo0OiAoY3A9IGNvbV9wb3J0X2lkWyBtYWNoaW5lICwgY29tTWFjaGluZSBdIHwgTEJSQUNLRVQgKGNwPSBjb21fcG9ydF9pZFsgbWFjaGluZSAsIGNvbU1hY2hpbmUgXSAoIENPTU1BIGNwPSBjb21fcG9ydF9pZFsgbWFjaGluZSAsIGNvbU1hY2hpbmUgXSApKiB8IFNUQVIgKSBSQlJBQ0tFVCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQ0MDU9MjsKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgSUQ6CisgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgCQlhbHQ0MDU9MTsKKyAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIExCUkFDS0VUOgorICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgIAkJYWx0NDA1PTI7CisgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAJICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDQwNTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZWNvbV9wb3J0RXg7CisKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQ0MDUpCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDU0MTo2OiBjcD0gY29tX3BvcnRfaWRbIG1hY2hpbmUgLCBjb21NYWNoaW5lIF0KKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2NvbV9wb3J0X2lkX2luX2NvbV9wb3J0MTQ4MTApOworICAgICAgICAJICAgICAgICAJICAgICAgICBjcD1jb21fcG9ydF9pZChjdHgsIG1hY2hpbmUsIGNvbU1hY2hpbmUpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVjb21fcG9ydEV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgY29tUm91dGUtPmFwcGVuZENvbVBvaW50KGNwCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICApOyAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAljYXNlIDI6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDU0NDo2OiBMQlJBQ0tFVCAoY3A9IGNvbV9wb3J0X2lkWyBtYWNoaW5lICwgY29tTWFjaGluZSBdICggQ09NTUEgY3A9IGNvbV9wb3J0X2lkWyBtYWNoaW5lICwgY29tTWFjaGluZSBdICkqIHwgU1RBUiApIFJCUkFDS0VUCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKExCUkFDS0VULCAmRk9MTE9XX0xCUkFDS0VUX2luX2NvbV9wb3J0MTQ4MjYpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVjb21fcG9ydEV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDU0NTo2OiAoY3A9IGNvbV9wb3J0X2lkWyBtYWNoaW5lICwgY29tTWFjaGluZSBdICggQ09NTUEgY3A9IGNvbV9wb3J0X2lkWyBtYWNoaW5lICwgY29tTWFjaGluZSBdICkqIHwgU1RBUiApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQ0MDQ9MjsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGNhc2UgSUQ6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCQlhbHQ0MDQ9MTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBjYXNlIFNUQVI6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCQlhbHQ0MDQ9MjsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gNDA0OworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlY29tX3BvcnRFeDsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDQwNCkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NTQ1Ojg6IGNwPSBjb21fcG9ydF9pZFsgbWFjaGluZSAsIGNvbU1hY2hpbmUgXSAoIENPTU1BIGNwPSBjb21fcG9ydF9pZFsgbWFjaGluZSAsIGNvbU1hY2hpbmUgXSApKgorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfY29tX3BvcnRfaWRfaW5fY29tX3BvcnQxNDgzNyk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGNwPWNvbV9wb3J0X2lkKGN0eCwgbWFjaGluZSwgY29tTWFjaGluZSk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWNvbV9wb3J0RXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICBjb21Sb3V0ZS0+YXBwZW5kQ29tUG9pbnQoY3AKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICk7IAorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NTQ4Ojg6ICggQ09NTUEgY3A9IGNvbV9wb3J0X2lkWyBtYWNoaW5lICwgY29tTWFjaGluZSBdICkqCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgZm9yICg7OykKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDQwMz0yOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgY2FzZSBDT01NQToKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJCWFsdDQwMz0xOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDQwMykKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NTQ4OjEwOiBDT01NQSBjcD0gY29tX3BvcnRfaWRbIG1hY2hpbmUgLCBjb21NYWNoaW5lIF0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoQ09NTUEsICZGT0xMT1dfQ09NTUFfaW5fY29tX3BvcnQxNDg1OSk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWNvbV9wb3J0RXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19jb21fcG9ydF9pZF9pbl9jb21fcG9ydDE0ODY0KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgY3A9Y29tX3BvcnRfaWQoY3R4LCBtYWNoaW5lLCBjb21NYWNoaW5lKTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlY29tX3BvcnRFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIGNvbVJvdXRlLT5hcHBlbmRDb21Qb2ludChjcAorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgKTsgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIGdvdG8gbG9vcDQwMzsJLyogYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgbG9vcDQwMzogOyAvKiBKdW1wIG91dCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAljYXNlIDI6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDU1MTo4OiBTVEFSCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKFNUQVIsICZGT0xMT1dfU1RBUl9pbl9jb21fcG9ydDE0ODg3KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlY29tX3BvcnRFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgIAlzZXA6OkNvbVBvaW50ICogY29tUG9pbnQgPSBuZXcgc2VwOjpDb21Qb2ludCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCQkJY29tUG9pbnQtPnNldE1hY2hpbmVBbGxTaWduYWwoY29tTWFjaGluZSk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJCQljb21Sb3V0ZS0+c2V0Q29tUG9pbnQoY29tUG9pbnQsIHNlcDo6TW9kaWZpZXI6OkRJUkVDVElPTl9JTk9VVF9LSU5EKTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCQkJU0VUX1JVTEVfTE9DQVRJT04oY29tUG9pbnQpOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoUkJSQUNLRVQsICZGT0xMT1dfUkJSQUNLRVRfaW5fY29tX3BvcnQxNDkwOCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWNvbV9wb3J0RXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDI6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDU2NDo0OiBjcD0gY29tX3BvcnRfaWRbIG1hY2hpbmUgLCBjb21NYWNoaW5lIF0KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2NvbV9wb3J0X2lkX2luX2NvbV9wb3J0MTQ5MjIpOworICAgICAgICAJICAgICAgICBjcD1jb21fcG9ydF9pZChjdHgsIG1hY2hpbmUsIGNvbU1hY2hpbmUpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVjb21fcG9ydEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgY29tUm91dGUtPmFwcGVuZENvbVBvaW50KGNwCisgICAgICAgIAkgICAgICAgICAgICApOyAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZWNvbV9wb3J0RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlY29tX3BvcnRFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDE2NiwgY29tX3BvcnRfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGNvbV9wb3J0ICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGNvbV9wb3J0X2lkCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NTY5OjE6IGNvbV9wb3J0X2lkWyBzZXA6Ok1hY2hpbmUgKiBtYWNoaW5lICwgc2VwOjpNYWNoaW5lICogY29tTWFjaGluZSBdIHJldHVybnMgWyBzZXA6OkJGIGNvbVBvaW50IF0gOiBpZD0gcXVhbGlmaWVkTmFtZUlEIDsKKyAqLworc3RhdGljIHNlcDo6QkYKK2NvbV9wb3J0X2lkKHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBtYWNoaW5lLCBzZXA6Ok1hY2hpbmUgKiBjb21NYWNoaW5lKQoreworICAgIHNlcDo6QkYgY29tUG9pbnQ7CisKKyAgICBBTlRMUjNfVUlOVDMyIGNvbV9wb3J0X2lkX1N0YXJ0SW5kZXg7CisKKyAgICBmbWxQYXJzZXJfcXVhbGlmaWVkTmFtZUlEX3JldHVybiBpZDsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfaWQKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2lkIGZtbFBhcnNlcl9xdWFsaWZpZWROYW1lSURfcmV0dXJuCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgY29tX3BvcnRfaWRfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworCisgICAgCVNBVkVfUlVMRV9CRUdJTl9MT0NBVElPTjsKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTY3KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiBjb21Qb2ludDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ1NzU6MjogKGlkPSBxdWFsaWZpZWROYW1lSUQgKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NTc1OjQ6IGlkPSBxdWFsaWZpZWROYW1lSUQKKyAgICAgICAgeworICAgICAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX2NvbV9wb3J0X2lkMTQ5NTEpOworICAgICAgICAgICAgaWQ9cXVhbGlmaWVkTmFtZUlEKGN0eCk7CisKKyAgICAgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVjb21fcG9ydF9pZEV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBjb21Qb2ludDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAJCXNlcDo6Q29tUG9pbnQgKiBhQ29tUG9pbnQ7CisgICAgICAgICAgICAgICAgCQljb21Qb2ludD0gc2VwOjpCRiggYUNvbVBvaW50ID0gbmV3IHNlcDo6Q29tUG9pbnQoKSApOworCisKKyAgICAgICAgICAgICAgICAJCVNFVF9SVUxFX0xPQ0FUSU9OKGFDb21Qb2ludCk7CisKKyAgICAgICAgICAgICAgICAJCWNvbnN0IHNlcDo6QkYgJiBjb21Qb3J0ID0gc2VwOjpQYXJzZXJVdGlsOjpnZXRDb21Qb3J0U2lnbmFsKAorICAgICAgICAgICAgICAgIAkJCQljb21NYWNoaW5lLCBpZC5zCisgICAgICAgICAgICAgICAgLCBpZC5uYgorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgCSAgCWlmKCBjb21Qb3J0LnZhbGlkKCkgKQorICAgICAgICAgICAgICAgIAkgIAl7CisgICAgICAgICAgICAgICAgCSAgCQlhQ29tUG9pbnQtPnNldE1hY2hpbmVQb3J0KGNvbU1hY2hpbmUsIGNvbVBvcnQudG9fcHRyPCBzZXA6OlBvcnQgPigpKTsKKyAgICAgICAgICAgICAgICAJICAJfQorICAgICAgICAgICAgICAgIAkgIAllbHNlCisgICAgICAgICAgICAgICAgCSAgCXsKKyAgICAgICAgICAgICAgICAJICAJCWFDb21Qb2ludC0+c2V0TWFjaGluZShjb21NYWNoaW5lKTsKKyAgICAgICAgICAgICAgICAJICAJCWFDb21Qb2ludC0+c2V0TWFjaGluZVBvcnQoTkVXX1FOSUQoaWQucworICAgICAgICAgICAgICAgICwgaWQubmIKKyAgICAgICAgICAgICAgICApKTsKKyAgICAgICAgICAgICAgICAJICAJfQorICAgICAgICAgICAgICAgIAkgIAorICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlY29tX3BvcnRfaWRFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVjb21fcG9ydF9pZEV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTY3LCBjb21fcG9ydF9pZF9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIGNvbVBvaW50OworfQorLyogJEFOVExSIGVuZCBjb21fcG9ydF9pZCAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBzdGF0ZW1lbnQKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ2MDQ6MTogc3RhdGVtZW50IHJldHVybnMgWyBzZXA6OkJGQ29kZSBhYyBdIDogKHM9IHN0YXRlbWVudF9hc3NpZ24gfHM9IHN0YXRlbWVudF9jb20gfHM9IHN0YXRlbWVudF9jb25zdHJhaW50IHxzPSBzdGF0ZW1lbnRfanVtcCB8cz0gc3RhdGVtZW50X2FjdGl2aXR5IHxzPSBzdGF0ZW1lbnRfaW52b2tlX3JvdXRpbmUgfHM9IHN0YXRlbWVudF9tb2MgfHM9IHN0YXRlbWVudF9pbnZva2UgfHM9IHN0YXRlbWVudF9pbnZva2VfbWV0aG9kIHxzPSBzdGF0ZW1lbnRfYWN0aXZpdHlfbmV3IHxzPSBzdGF0ZW1lbnRfaXRlIHxzPSBzdGF0ZW1lbnRfaXRlcmF0aW9uIHxzPSBibG9ja19zdGF0ZW1lbnQgfHM9IHByZWZpeF9zdGF0ZW1lbnQgfHM9IHN0YXRlbWVudF9wcm9tcHQgfHM9IG1ldGFfc3RhdGVtZW50ICk7CisgKi8KK3N0YXRpYyBzZXA6OkJGQ29kZQorc3RhdGVtZW50KHBmbWxQYXJzZXIgY3R4KQoreworICAgIHNlcDo6QkZDb2RlIGFjOworCisgICAgQU5UTFIzX1VJTlQzMiBzdGF0ZW1lbnRfU3RhcnRJbmRleDsKKworICAgIHNlcDo6QkZDb2RlIHM7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX3MKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX3Mgc2VwOjpCRkNvZGUKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBzdGF0ZW1lbnRfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTY4KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiBhYzsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vICAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NjA2OjI6IChzPSBzdGF0ZW1lbnRfYXNzaWduIHxzPSBzdGF0ZW1lbnRfY29tIHxzPSBzdGF0ZW1lbnRfY29uc3RyYWludCB8cz0gc3RhdGVtZW50X2p1bXAgfHM9IHN0YXRlbWVudF9hY3Rpdml0eSB8cz0gc3RhdGVtZW50X2ludm9rZV9yb3V0aW5lIHxzPSBzdGF0ZW1lbnRfbW9jIHxzPSBzdGF0ZW1lbnRfaW52b2tlIHxzPSBzdGF0ZW1lbnRfaW52b2tlX21ldGhvZCB8cz0gc3RhdGVtZW50X2FjdGl2aXR5X25ldyB8cz0gc3RhdGVtZW50X2l0ZSB8cz0gc3RhdGVtZW50X2l0ZXJhdGlvbiB8cz0gYmxvY2tfc3RhdGVtZW50IHxzPSBwcmVmaXhfc3RhdGVtZW50IHxzPSBzdGF0ZW1lbnRfcHJvbXB0IHxzPSBtZXRhX3N0YXRlbWVudCApCisKKyAgICAgICAgICAgIEFOVExSM19VSU5UMzIgYWx0NDA3OworCisgICAgICAgICAgICBhbHQ0MDc9MTY7CisKKyAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgSUQ6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAJCSAgICBpbnQgTEE0MDdfMSA9IExBKDIpOworICAgICAgICAgICAgCQkgICAgaWYgKCAoc3lucHJlZDcwOV9mbWwoY3R4KSkpCisgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAJCSAgICAgICAgYWx0NDA3PTE7CisgICAgICAgICAgICAJCSAgICB9CisgICAgICAgICAgICAJCSAgICBlbHNlIGlmICggKHN5bnByZWQ3MTRfZm1sKGN0eCkpKQorICAgICAgICAgICAgCQkgICAgeworICAgICAgICAgICAgCQkgICAgICAgIGFsdDQwNz02OworICAgICAgICAgICAgCQkgICAgfQorICAgICAgICAgICAgCQkgICAgZWxzZQorICAgICAgICAgICAgCQkgICAgeworICAgICAgICAgICAgCQkgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgIAkJICAgICAgICB7CisgICAgICAgICAgICAJCSAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgIAkJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCQkgICAgICAgIH0KKworCisgICAgICAgICAgICAJCSAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgIAkJICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIAkJICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAJCSAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA0MDc7CisgICAgICAgICAgICAJCSAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAxOworCisKKyAgICAgICAgICAgIAkJICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRFeDsKKworICAgICAgICAgICAgCQkgICAgfQorICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOTk6CisgICAgICAgICAgICBjYXNlIDMwMDoKKyAgICAgICAgICAgIGNhc2UgMzAxOgorICAgICAgICAgICAgY2FzZSAzMDI6CisgICAgICAgICAgICBjYXNlIDMwMzoKKyAgICAgICAgICAgIGNhc2UgMzA0OgorICAgICAgICAgICAgY2FzZSAzMDU6CisgICAgICAgICAgICBjYXNlIDMzNjoKKyAgICAgICAgICAgIGNhc2UgMzM3OgorICAgICAgICAgICAgY2FzZSAzMzg6CisgICAgICAgICAgICBjYXNlIDMzOToKKyAgICAgICAgICAgIGNhc2UgMzQwOgorICAgICAgICAgICAgY2FzZSAzNDE6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ0MDc9MjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI1NjoKKyAgICAgICAgICAgIGNhc2UgMjc4OgorICAgICAgICAgICAgY2FzZSAyOTA6CisgICAgICAgICAgICBjYXNlIDM5MToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQwNz0zOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjQ3OgorICAgICAgICAgICAgY2FzZSAyNjM6CisgICAgICAgICAgICBjYXNlIDI3OToKKyAgICAgICAgICAgIGNhc2UgMzY0OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDA3PTQ7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMzY6CisgICAgICAgICAgICBjYXNlIDI2NzoKKyAgICAgICAgICAgIGNhc2UgMjY4OgorICAgICAgICAgICAgY2FzZSAyNzU6CisgICAgICAgICAgICBjYXNlIDI4MjoKKyAgICAgICAgICAgIGNhc2UgMjg5OgorICAgICAgICAgICAgY2FzZSAyOTE6CisgICAgICAgICAgICBjYXNlIDI5MjoKKyAgICAgICAgICAgIGNhc2UgMjkzOgorICAgICAgICAgICAgY2FzZSAyOTY6CisgICAgICAgICAgICBjYXNlIDMxMjoKKyAgICAgICAgICAgIGNhc2UgMzYyOgorICAgICAgICAgICAgY2FzZSAzNjM6CisgICAgICAgICAgICBjYXNlIDM2ODoKKyAgICAgICAgICAgIGNhc2UgMzY5OgorICAgICAgICAgICAgY2FzZSAzNzE6CisgICAgICAgICAgICBjYXNlIDM3NzoKKyAgICAgICAgICAgIGNhc2UgMzg2OgorICAgICAgICAgICAgY2FzZSAzODk6CisgICAgICAgICAgICBjYXNlIDQxNToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQwNz01OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ09MT054MjoKKyAgICAgICAgICAgIGNhc2UgREVDUjoKKyAgICAgICAgICAgIGNhc2UgSU5DUjoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQwNz0xOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzg1OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDA3PTc7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBMUEFSRU5fSU5WT0tFOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDA3PTg7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNTA6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ0MDc9OTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMzMDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQwNz0xMDsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI5NDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQwNz0xMTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI2OToKKyAgICAgICAgICAgIGNhc2UgMjg1OgorICAgICAgICAgICAgY2FzZSA0MTY6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ0MDc9MTI7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBMQ1VSTFk6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ0MDc9MTM7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBET0xMQVJfTENVUkxZOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDA3PTE0OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1RBVEVNRU5UX1BST01QVDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQwNz0xNTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE1NDoKKyAgICAgICAgICAgIGNhc2UgMTU1OgorICAgICAgICAgICAgY2FzZSAxNTY6CisgICAgICAgICAgICBjYXNlIDE1NzoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQwNz0xNjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA0MDc7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRFeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDQwNykKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NjA2OjQ6IHM9IHN0YXRlbWVudF9hc3NpZ24KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3N0YXRlbWVudF9hc3NpZ25faW5fc3RhdGVtZW50MTQ5ODEpOworICAgICAgICAJICAgICAgICBzPXN0YXRlbWVudF9hc3NpZ24oY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGFjPSAKKyAgICAgICAgCSAgICAgICAgICAgIHMKKyAgICAgICAgCSAgICAgICAgICAgIDsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDI6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDYwODo0OiBzPSBzdGF0ZW1lbnRfY29tCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19zdGF0ZW1lbnRfY29tX2luX3N0YXRlbWVudDE1MDAyKTsKKyAgICAgICAgCSAgICAgICAgcz1zdGF0ZW1lbnRfY29tKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBhYz0gCisgICAgICAgIAkgICAgICAgICAgICBzCisgICAgICAgIAkgICAgICAgICAgICA7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAzOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ2MDk6NDogcz0gc3RhdGVtZW50X2NvbnN0cmFpbnQKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3N0YXRlbWVudF9jb25zdHJhaW50X2luX3N0YXRlbWVudDE1MDI1KTsKKyAgICAgICAgCSAgICAgICAgcz1zdGF0ZW1lbnRfY29uc3RyYWludChjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgYWM9IAorICAgICAgICAJICAgICAgICAgICAgcworICAgICAgICAJICAgICAgICAgICAgOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgNDoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NjEwOjQ6IHM9IHN0YXRlbWVudF9qdW1wCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19zdGF0ZW1lbnRfanVtcF9pbl9zdGF0ZW1lbnQxNTA0MSk7CisgICAgICAgIAkgICAgICAgIHM9c3RhdGVtZW50X2p1bXAoY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGFjPSAKKyAgICAgICAgCSAgICAgICAgICAgIHMKKyAgICAgICAgCSAgICAgICAgICAgIDsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDU6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDYxMzo0OiBzPSBzdGF0ZW1lbnRfYWN0aXZpdHkKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3N0YXRlbWVudF9hY3Rpdml0eV9pbl9zdGF0ZW1lbnQxNTA2NSk7CisgICAgICAgIAkgICAgICAgIHM9c3RhdGVtZW50X2FjdGl2aXR5KGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBhYz0gCisgICAgICAgIAkgICAgICAgICAgICBzCisgICAgICAgIAkgICAgICAgICAgICA7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA2OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ2MTQ6NDogcz0gc3RhdGVtZW50X2ludm9rZV9yb3V0aW5lCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19zdGF0ZW1lbnRfaW52b2tlX3JvdXRpbmVfaW5fc3RhdGVtZW50MTUwODMpOworICAgICAgICAJICAgICAgICBzPXN0YXRlbWVudF9pbnZva2Vfcm91dGluZShjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgYWM9IAorICAgICAgICAJICAgICAgICAgICAgcworICAgICAgICAJICAgICAgICAgICAgOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgNzoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NjE2OjQ6IHM9IHN0YXRlbWVudF9tb2MKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3N0YXRlbWVudF9tb2NfaW5fc3RhdGVtZW50MTUwOTYpOworICAgICAgICAJICAgICAgICBzPXN0YXRlbWVudF9tb2MoY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGFjPSAKKyAgICAgICAgCSAgICAgICAgICAgIHMKKyAgICAgICAgCSAgICAgICAgICAgIDsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDg6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDYxODo0OiBzPSBzdGF0ZW1lbnRfaW52b2tlCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19zdGF0ZW1lbnRfaW52b2tlX2luX3N0YXRlbWVudDE1MTIwKTsKKyAgICAgICAgCSAgICAgICAgcz1zdGF0ZW1lbnRfaW52b2tlKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBhYz0gCisgICAgICAgIAkgICAgICAgICAgICBzCisgICAgICAgIAkgICAgICAgICAgICA7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA5OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ2MTk6NDogcz0gc3RhdGVtZW50X2ludm9rZV9tZXRob2QKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3N0YXRlbWVudF9pbnZva2VfbWV0aG9kX2luX3N0YXRlbWVudDE1MTQwKTsKKyAgICAgICAgCSAgICAgICAgcz1zdGF0ZW1lbnRfaW52b2tlX21ldGhvZChjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgYWM9IAorICAgICAgICAJICAgICAgICAgICAgcworICAgICAgICAJICAgICAgICAgICAgOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMTA6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDYyMTo0OiBzPSBzdGF0ZW1lbnRfYWN0aXZpdHlfbmV3CisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19zdGF0ZW1lbnRfYWN0aXZpdHlfbmV3X2luX3N0YXRlbWVudDE1MTU0KTsKKyAgICAgICAgCSAgICAgICAgcz1zdGF0ZW1lbnRfYWN0aXZpdHlfbmV3KGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBhYz0gCisgICAgICAgIAkgICAgICAgICAgICBzCisgICAgICAgIAkgICAgICAgICAgICA7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAxMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NjIzOjQ6IHM9IHN0YXRlbWVudF9pdGUKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3N0YXRlbWVudF9pdGVfaW5fc3RhdGVtZW50MTUxNjkpOworICAgICAgICAJICAgICAgICBzPXN0YXRlbWVudF9pdGUoY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGFjPSAKKyAgICAgICAgCSAgICAgICAgICAgIHMKKyAgICAgICAgCSAgICAgICAgICAgIDsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDEyOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ2MjQ6NDogcz0gc3RhdGVtZW50X2l0ZXJhdGlvbgorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfc3RhdGVtZW50X2l0ZXJhdGlvbl9pbl9zdGF0ZW1lbnQxNTE5Mik7CisgICAgICAgIAkgICAgICAgIHM9c3RhdGVtZW50X2l0ZXJhdGlvbihjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgYWM9IAorICAgICAgICAJICAgICAgICAgICAgcworICAgICAgICAJICAgICAgICAgICAgOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMTM6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDYyODo0OiBzPSBibG9ja19zdGF0ZW1lbnQKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9zdGF0ZW1lbnQxNTIxMik7CisgICAgICAgIAkgICAgICAgIHM9YmxvY2tfc3RhdGVtZW50KGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBhYz0gCisgICAgICAgIAkgICAgICAgICAgICBzCisgICAgICAgIAkgICAgICAgICAgICA7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAxNDoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NjMwOjQ6IHM9IHByZWZpeF9zdGF0ZW1lbnQKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3ByZWZpeF9zdGF0ZW1lbnRfaW5fc3RhdGVtZW50MTUyMzQpOworICAgICAgICAJICAgICAgICBzPXByZWZpeF9zdGF0ZW1lbnQoY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGFjPSAKKyAgICAgICAgCSAgICAgICAgICAgIHMKKyAgICAgICAgCSAgICAgICAgICAgIDsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDE1OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ2MzI6NDogcz0gc3RhdGVtZW50X3Byb21wdAorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfc3RhdGVtZW50X3Byb21wdF9pbl9zdGF0ZW1lbnQxNTI1NSk7CisgICAgICAgIAkgICAgICAgIHM9c3RhdGVtZW50X3Byb21wdChjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgYWM9IAorICAgICAgICAJICAgICAgICAgICAgcworICAgICAgICAJICAgICAgICAgICAgOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMTY6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDYzNDo0OiBzPSBtZXRhX3N0YXRlbWVudAorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfbWV0YV9zdGF0ZW1lbnRfaW5fc3RhdGVtZW50MTUyNzYpOworICAgICAgICAJICAgICAgICBzPW1ldGFfc3RhdGVtZW50KGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBhYz0gCisgICAgICAgIAkgICAgICAgICAgICBzCisgICAgICAgIAkgICAgICAgICAgICA7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVzdGF0ZW1lbnRFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDE2OCwgc3RhdGVtZW50X1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gYWM7Cit9CisvKiAkQU5UTFIgZW5kIHN0YXRlbWVudCAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBibG9ja19zdGF0ZW1lbnQKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ2NDA6MTogYmxvY2tfc3RhdGVtZW50IHJldHVybnMgWyBzZXA6OkJGQ29kZSBhYyBdIDogTENVUkxZIChvPSBvcF9ibG9jayApPyAocz0gc3RhdGVtZW50ICkqIFJDVVJMWSA7CisgKi8KK3N0YXRpYyBzZXA6OkJGQ29kZQorYmxvY2tfc3RhdGVtZW50KHBmbWxQYXJzZXIgY3R4KQoreworICAgIHNlcDo6QkZDb2RlIGFjOworCisgICAgQU5UTFIzX1VJTlQzMiBibG9ja19zdGF0ZW1lbnRfU3RhcnRJbmRleDsKKworICAgIHNlcDo6T3BlcmF0b3IgKiBvOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9vCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9vIHNlcDo6T3BlcmF0b3IgKgorCisgICAgc2VwOjpCRkNvZGUgczsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfcworICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfcyBzZXA6OkJGQ29kZQorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGJsb2NrX3N0YXRlbWVudF9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisKKyAgICAJc2VwOjpPcGVyYXRvciAqIG9wID0gT1AoU0VRVUVOQ0UpOworICAgIAlib29sIGltcGxpY2l0U2VxdWVuY2VPcCA9IHRydWU7CisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDE2OSkpICkKKyAgICB7CisgICAgICAgIHsKKworICAgICAgICAgICAgCWlmKCBpbXBsaWNpdFNlcXVlbmNlT3AgJiYgYWMKKyAgICAgICAgICAgIC52YWxpZCgpICYmIGFjCisgICAgICAgICAgICAtPnNpbmdsZXRvbigpICYmCisgICAgICAgICAgICAJCQlzZXA6Ok9wZXJhdG9yTWFuYWdlcjo6aXNTY2hlZHVsZShvcCkgKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJc2VwOjpCRkNvZGUgc2luZ2xlQ29kZSA9IGFjCisgICAgICAgICAgICAtPmZpcnN0KCkuYmZDb2RlKCk7CisgICAgICAgICAgICAJCWFjPSBzaW5nbGVDb2RlOworCisgICAgICAgICAgICAJfQorCisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiBhYzsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ2NTQ6MjogKCBMQ1VSTFkgKG89IG9wX2Jsb2NrICk/IChzPSBzdGF0ZW1lbnQgKSogUkNVUkxZICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDY1NDo0OiBMQ1VSTFkgKG89IG9wX2Jsb2NrICk/IChzPSBzdGF0ZW1lbnQgKSogUkNVUkxZCisgICAgICAgIHsKKyAgICAgICAgICAgICBNQVRDSFQoTENVUkxZLCAmRk9MTE9XX0xDVVJMWV9pbl9ibG9ja19zdGF0ZW1lbnQxNTMxNyk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWJsb2NrX3N0YXRlbWVudEV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NjU0OjEyOiAobz0gb3BfYmxvY2sgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0NDA4PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPUF9BVE9NSUNfU0VRVUVOQ0U6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BfQ09OQ1VSUkVOQ1lfQU5EOgorICAgICAgICAgICAgICAgICAgICBjYXNlIE9QX0NPTkNVUlJFTkNZX0FTWU5DOgorICAgICAgICAgICAgICAgICAgICBjYXNlIE9QX0NPTkNVUlJFTkNZX0lOVEVSTEVBVklORzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPUF9DT05DVVJSRU5DWV9PUjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPUF9DT05DVVJSRU5DWV9QQVJBTExFTDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPUF9DT05DVVJSRU5DWV9SRFZfQU5EOgorICAgICAgICAgICAgICAgICAgICBjYXNlIE9QX0NPTkNVUlJFTkNZX1JEVl9BU1lOQzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPUF9DT05DVVJSRU5DWV9SRFZfSU5URVJMRUFWSU5HOgorICAgICAgICAgICAgICAgICAgICBjYXNlIE9QX0NPTkNVUlJFTkNZX1JEVl9PUjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPUF9DT05DVVJSRU5DWV9SRFZfUEFSQUxMRUw6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BfRk9SSzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPUF9KT0lOOgorICAgICAgICAgICAgICAgICAgICBjYXNlIE9QX05PTl9ERVRFUk1JTklTTToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPUF9TQ0hFRFVMRV9BTkRfVEhFTjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPUF9TQ0hFRFVMRV9HVDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPUF9TQ0hFRFVMRV9MVDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPUF9TQ0hFRFVMRV9PUl9FTFNFOgorICAgICAgICAgICAgICAgICAgICBjYXNlIE9QX1NDSEVEVUxFX1hPUjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPUF9TRVFVRU5DRToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPUF9TRVFVRU5DRV9TSURFOgorICAgICAgICAgICAgICAgICAgICBjYXNlIE9QX1NFUVVFTkNFX1dFQUs6CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJYWx0NDA4PTE7CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDQwOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NjU0OjE0OiBvPSBvcF9ibG9jaworICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19vcF9ibG9ja19pbl9ibG9ja19zdGF0ZW1lbnQxNTMyNCk7CisgICAgICAgICAgICAJICAgICAgICBvPW9wX2Jsb2NrKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVibG9ja19zdGF0ZW1lbnRFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBvcCA9IG8KKyAgICAgICAgICAgIAkgICAgICAgICAgICA7IGltcGxpY2l0U2VxdWVuY2VPcCA9IGZhbHNlOyAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgYWM9IE5FV19TVE1UKG9wKTsKKyAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDY1Njo2OiAocz0gc3RhdGVtZW50ICkqCisKKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDQwOT0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBDT0xPTngyOgorICAgICAgICAgICAgICAgIGNhc2UgREVDUjoKKyAgICAgICAgICAgICAgICBjYXNlIERPTExBUl9MQ1VSTFk6CisgICAgICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgICAgICAgICBjYXNlIElOQ1I6CisgICAgICAgICAgICAgICAgY2FzZSBMQ1VSTFk6CisgICAgICAgICAgICAgICAgY2FzZSBMUEFSRU5fSU5WT0tFOgorICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVNRU5UX1BST01QVDoKKyAgICAgICAgICAgICAgICBjYXNlIDE1NDoKKyAgICAgICAgICAgICAgICBjYXNlIDE1NToKKyAgICAgICAgICAgICAgICBjYXNlIDE1NjoKKyAgICAgICAgICAgICAgICBjYXNlIDE1NzoKKyAgICAgICAgICAgICAgICBjYXNlIDIzNjoKKyAgICAgICAgICAgICAgICBjYXNlIDI0NzoKKyAgICAgICAgICAgICAgICBjYXNlIDI1MDoKKyAgICAgICAgICAgICAgICBjYXNlIDI1NjoKKyAgICAgICAgICAgICAgICBjYXNlIDI2MzoKKyAgICAgICAgICAgICAgICBjYXNlIDI2NzoKKyAgICAgICAgICAgICAgICBjYXNlIDI2ODoKKyAgICAgICAgICAgICAgICBjYXNlIDI2OToKKyAgICAgICAgICAgICAgICBjYXNlIDI3NToKKyAgICAgICAgICAgICAgICBjYXNlIDI3ODoKKyAgICAgICAgICAgICAgICBjYXNlIDI3OToKKyAgICAgICAgICAgICAgICBjYXNlIDI4MjoKKyAgICAgICAgICAgICAgICBjYXNlIDI4NToKKyAgICAgICAgICAgICAgICBjYXNlIDI4OToKKyAgICAgICAgICAgICAgICBjYXNlIDI5MDoKKyAgICAgICAgICAgICAgICBjYXNlIDI5MToKKyAgICAgICAgICAgICAgICBjYXNlIDI5MjoKKyAgICAgICAgICAgICAgICBjYXNlIDI5MzoKKyAgICAgICAgICAgICAgICBjYXNlIDI5NDoKKyAgICAgICAgICAgICAgICBjYXNlIDI5NjoKKyAgICAgICAgICAgICAgICBjYXNlIDI5OToKKyAgICAgICAgICAgICAgICBjYXNlIDMwMDoKKyAgICAgICAgICAgICAgICBjYXNlIDMwMToKKyAgICAgICAgICAgICAgICBjYXNlIDMwMjoKKyAgICAgICAgICAgICAgICBjYXNlIDMwMzoKKyAgICAgICAgICAgICAgICBjYXNlIDMwNDoKKyAgICAgICAgICAgICAgICBjYXNlIDMwNToKKyAgICAgICAgICAgICAgICBjYXNlIDMxMjoKKyAgICAgICAgICAgICAgICBjYXNlIDMzMDoKKyAgICAgICAgICAgICAgICBjYXNlIDMzNjoKKyAgICAgICAgICAgICAgICBjYXNlIDMzNzoKKyAgICAgICAgICAgICAgICBjYXNlIDMzODoKKyAgICAgICAgICAgICAgICBjYXNlIDMzOToKKyAgICAgICAgICAgICAgICBjYXNlIDM0MDoKKyAgICAgICAgICAgICAgICBjYXNlIDM0MToKKyAgICAgICAgICAgICAgICBjYXNlIDM2MjoKKyAgICAgICAgICAgICAgICBjYXNlIDM2MzoKKyAgICAgICAgICAgICAgICBjYXNlIDM2NDoKKyAgICAgICAgICAgICAgICBjYXNlIDM2ODoKKyAgICAgICAgICAgICAgICBjYXNlIDM2OToKKyAgICAgICAgICAgICAgICBjYXNlIDM3MToKKyAgICAgICAgICAgICAgICBjYXNlIDM3NzoKKyAgICAgICAgICAgICAgICBjYXNlIDM4NToKKyAgICAgICAgICAgICAgICBjYXNlIDM4NjoKKyAgICAgICAgICAgICAgICBjYXNlIDM4OToKKyAgICAgICAgICAgICAgICBjYXNlIDM5MToKKyAgICAgICAgICAgICAgICBjYXNlIDQxNToKKyAgICAgICAgICAgICAgICBjYXNlIDQxNjoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0NDA5PTE7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDQwOSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NjU2Ojk6IHM9IHN0YXRlbWVudAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19zdGF0ZW1lbnRfaW5fYmxvY2tfc3RhdGVtZW50MTUzNDgpOworICAgICAgICAgICAgCSAgICAgICAgcz1zdGF0ZW1lbnQoY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWJsb2NrX3N0YXRlbWVudEV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIGFjCisgICAgICAgICAgICAJICAgICAgICAgICAgLT5hcHBlbmQocworICAgICAgICAgICAgCSAgICAgICAgICAgICk7IAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQ6CisgICAgICAgICAgICAJICAgIGdvdG8gbG9vcDQwOTsJLyogYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvb3A0MDk6IDsgLyogSnVtcCBvdXQgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKworCisgICAgICAgICAgICAgTUFUQ0hUKFJDVVJMWSwgJkZPTExPV19SQ1VSTFlfaW5fYmxvY2tfc3RhdGVtZW50MTUzNjApOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVibG9ja19zdGF0ZW1lbnRFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICB9CisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVibG9ja19zdGF0ZW1lbnRFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVibG9ja19zdGF0ZW1lbnRFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgCWlmKCBpbXBsaWNpdFNlcXVlbmNlT3AgJiYgYWMKKyAgICAgICAgICAgICAgICAgICAgLnZhbGlkKCkgJiYgYWMKKyAgICAgICAgICAgICAgICAgICAgLT5zaW5nbGV0b24oKSAmJgorICAgICAgICAgICAgICAgICAgICAJCQlzZXA6Ok9wZXJhdG9yTWFuYWdlcjo6aXNTY2hlZHVsZShvcCkgKQorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCXNlcDo6QkZDb2RlIHNpbmdsZUNvZGUgPSBhYworICAgICAgICAgICAgICAgICAgICAtPmZpcnN0KCkuYmZDb2RlKCk7CisgICAgICAgICAgICAgICAgICAgIAkJYWM9IHNpbmdsZUNvZGU7CisKKyAgICAgICAgICAgICAgICAgICAgCX0KKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgxNjksIGJsb2NrX3N0YXRlbWVudF9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIGFjOworfQorLyogJEFOVExSIGVuZCBibG9ja19zdGF0ZW1lbnQgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgb3BfYmxvY2sKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ2NjA6MTogb3BfYmxvY2sgcmV0dXJucyBbIHNlcDo6T3BlcmF0b3IgKiBvcCBdIDogKG89IG9wX3NlcXVlbmNlIHxvPSBvcF9zY2hlZHVsaW5nIHxvPSBvcF9jb25jdXJyZW5jeSB8IE9QX0ZPUksgfCBPUF9KT0lOICk7CisgKi8KK3N0YXRpYyBzZXA6Ok9wZXJhdG9yICoKK29wX2Jsb2NrKHBmbWxQYXJzZXIgY3R4KQoreworICAgIHNlcDo6T3BlcmF0b3IgKiBvcDsKKworICAgIEFOVExSM19VSU5UMzIgb3BfYmxvY2tfU3RhcnRJbmRleDsKKworICAgIHNlcDo6T3BlcmF0b3IgKiBvOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9vCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9vIHNlcDo6T3BlcmF0b3IgKgorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIG9wX2Jsb2NrX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDE3MCkpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gb3A7CisgICAgfQorCisgICAgeworICAgICAgICB7CisgICAgICAgICAgICAvLyAgL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDY2MjoyOiAobz0gb3Bfc2VxdWVuY2UgfG89IG9wX3NjaGVkdWxpbmcgfG89IG9wX2NvbmN1cnJlbmN5IHwgT1BfRk9SSyB8IE9QX0pPSU4gKQorCisgICAgICAgICAgICBBTlRMUjNfVUlOVDMyIGFsdDQxMDsKKworICAgICAgICAgICAgYWx0NDEwPTU7CisKKyAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgT1BfQVRPTUlDX1NFUVVFTkNFOgorICAgICAgICAgICAgY2FzZSBPUF9TRVFVRU5DRToKKyAgICAgICAgICAgIGNhc2UgT1BfU0VRVUVOQ0VfU0lERToKKyAgICAgICAgICAgIGNhc2UgT1BfU0VRVUVOQ0VfV0VBSzoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQxMD0xOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BfTk9OX0RFVEVSTUlOSVNNOgorICAgICAgICAgICAgY2FzZSBPUF9TQ0hFRFVMRV9BTkRfVEhFTjoKKyAgICAgICAgICAgIGNhc2UgT1BfU0NIRURVTEVfR1Q6CisgICAgICAgICAgICBjYXNlIE9QX1NDSEVEVUxFX0xUOgorICAgICAgICAgICAgY2FzZSBPUF9TQ0hFRFVMRV9PUl9FTFNFOgorICAgICAgICAgICAgY2FzZSBPUF9TQ0hFRFVMRV9YT1I6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ0MTA9MjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9QX0NPTkNVUlJFTkNZX0FORDoKKyAgICAgICAgICAgIGNhc2UgT1BfQ09OQ1VSUkVOQ1lfQVNZTkM6CisgICAgICAgICAgICBjYXNlIE9QX0NPTkNVUlJFTkNZX0lOVEVSTEVBVklORzoKKyAgICAgICAgICAgIGNhc2UgT1BfQ09OQ1VSUkVOQ1lfT1I6CisgICAgICAgICAgICBjYXNlIE9QX0NPTkNVUlJFTkNZX1BBUkFMTEVMOgorICAgICAgICAgICAgY2FzZSBPUF9DT05DVVJSRU5DWV9SRFZfQU5EOgorICAgICAgICAgICAgY2FzZSBPUF9DT05DVVJSRU5DWV9SRFZfQVNZTkM6CisgICAgICAgICAgICBjYXNlIE9QX0NPTkNVUlJFTkNZX1JEVl9JTlRFUkxFQVZJTkc6CisgICAgICAgICAgICBjYXNlIE9QX0NPTkNVUlJFTkNZX1JEVl9PUjoKKyAgICAgICAgICAgIGNhc2UgT1BfQ09OQ1VSUkVOQ1lfUkRWX1BBUkFMTEVMOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDEwPTM7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUF9GT1JLOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDEwPTQ7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUF9KT0lOOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDEwPTU7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gNDEwOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgZ290byBydWxlb3BfYmxvY2tFeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDQxMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NjYyOjQ6IG89IG9wX3NlcXVlbmNlCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19vcF9zZXF1ZW5jZV9pbl9vcF9ibG9jazE1Mzc3KTsKKyAgICAgICAgCSAgICAgICAgbz1vcF9zZXF1ZW5jZShjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVvcF9ibG9ja0V4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG9wOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBvcD0gCisgICAgICAgIAkgICAgICAgICAgICBvCisgICAgICAgIAkgICAgICAgICAgICA7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAyOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ2NjM6NDogbz0gb3Bfc2NoZWR1bGluZworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfb3Bfc2NoZWR1bGluZ19pbl9vcF9ibG9jazE1Mzg5KTsKKyAgICAgICAgCSAgICAgICAgbz1vcF9zY2hlZHVsaW5nKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW9wX2Jsb2NrRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG9wPSAKKyAgICAgICAgCSAgICAgICAgICAgIG8KKyAgICAgICAgCSAgICAgICAgICAgIDsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDM6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDY2NDo0OiBvPSBvcF9jb25jdXJyZW5jeQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfb3BfY29uY3VycmVuY3lfaW5fb3BfYmxvY2sxNTM5OSk7CisgICAgICAgIAkgICAgICAgIG89b3BfY29uY3VycmVuY3koY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlb3BfYmxvY2tFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBvcDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgb3A9IAorICAgICAgICAJICAgICAgICAgICAgbworICAgICAgICAJICAgICAgICAgICAgOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgNDoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NjY2OjQ6IE9QX0ZPUksKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoT1BfRk9SSywgJkZPTExPV19PUF9GT1JLX2luX29wX2Jsb2NrMTU0MDcpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVvcF9ibG9ja0V4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG9wOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBvcD0gT1AoRk9SSyk7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA1OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ2Njc6NDogT1BfSk9JTgorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChPUF9KT0lOLCAmRk9MTE9XX09QX0pPSU5faW5fb3BfYmxvY2sxNTQyMyk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW9wX2Jsb2NrRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG9wPSBPUChKT0lOKTsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZW9wX2Jsb2NrRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlb3BfYmxvY2tFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDE3MCwgb3BfYmxvY2tfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiBvcDsKK30KKy8qICRBTlRMUiBlbmQgb3BfYmxvY2sgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgb3Bfc2VxdWVuY2UKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ2NzA6MTogb3Bfc2VxdWVuY2UgcmV0dXJucyBbIHNlcDo6T3BlcmF0b3IgKiBvcCBdIDogKCBPUF9TRVFVRU5DRSB8IE9QX1NFUVVFTkNFX1NJREUgfCBPUF9TRVFVRU5DRV9XRUFLIHwgT1BfQVRPTUlDX1NFUVVFTkNFICk7CisgKi8KK3N0YXRpYyBzZXA6Ok9wZXJhdG9yICoKK29wX3NlcXVlbmNlKHBmbWxQYXJzZXIgY3R4KQoreworICAgIHNlcDo6T3BlcmF0b3IgKiBvcDsKKworICAgIEFOVExSM19VSU5UMzIgb3Bfc2VxdWVuY2VfU3RhcnRJbmRleDsKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBvcF9zZXF1ZW5jZV9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgxNzEpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIG9wOworICAgIH0KKworICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ2NzI6MjogKCBPUF9TRVFVRU5DRSB8IE9QX1NFUVVFTkNFX1NJREUgfCBPUF9TRVFVRU5DRV9XRUFLIHwgT1BfQVRPTUlDX1NFUVVFTkNFICkKKworICAgICAgICAgICAgQU5UTFIzX1VJTlQzMiBhbHQ0MTE7CisKKyAgICAgICAgICAgIGFsdDQxMT00OworCisgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIE9QX1NFUVVFTkNFOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDExPTE7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUF9TRVFVRU5DRV9TSURFOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDExPTI7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUF9TRVFVRU5DRV9XRUFLOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDExPTM7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUF9BVE9NSUNfU0VRVUVOQ0U6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ0MTE9NDsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA0MTE7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVvcF9zZXF1ZW5jZUV4OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NDExKQorICAgICAgICAgICAgeworICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ2NzI6NDogT1BfU0VRVUVOQ0UKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoT1BfU0VRVUVOQ0UsICZGT0xMT1dfT1BfU0VRVUVOQ0VfaW5fb3Bfc2VxdWVuY2UxNTQ0OSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW9wX3NlcXVlbmNlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG9wPSBPUChTRVFVRU5DRSk7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAyOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ2NzM6NDogT1BfU0VRVUVOQ0VfU0lERQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChPUF9TRVFVRU5DRV9TSURFLCAmRk9MTE9XX09QX1NFUVVFTkNFX1NJREVfaW5fb3Bfc2VxdWVuY2UxNTQ2NCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW9wX3NlcXVlbmNlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG9wPSBPUChTRVFVRU5DRV9TSURFKTsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDM6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDY3NDo0OiBPUF9TRVFVRU5DRV9XRUFLCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKE9QX1NFUVVFTkNFX1dFQUssICZGT0xMT1dfT1BfU0VRVUVOQ0VfV0VBS19pbl9vcF9zZXF1ZW5jZTE1NDc0KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlb3Bfc2VxdWVuY2VFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBvcDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgb3A9IE9QKFNFUVVFTkNFX1dFQUspOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgNDoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0Njc2OjQ6IE9QX0FUT01JQ19TRVFVRU5DRQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChPUF9BVE9NSUNfU0VRVUVOQ0UsICZGT0xMT1dfT1BfQVRPTUlDX1NFUVVFTkNFX2luX29wX3NlcXVlbmNlMTU0ODUpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVvcF9zZXF1ZW5jZUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG9wOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBvcD0gT1AoQVRPTUlDX1NFUVVFTkNFKTsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZW9wX3NlcXVlbmNlRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlb3Bfc2VxdWVuY2VFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDE3MSwgb3Bfc2VxdWVuY2VfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiBvcDsKK30KKy8qICRBTlRMUiBlbmQgb3Bfc2VxdWVuY2UgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgb3Bfc2NoZWR1bGluZworICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDY3OToxOiBvcF9zY2hlZHVsaW5nIHJldHVybnMgWyBzZXA6Ok9wZXJhdG9yICogb3AgXSA6ICggT1BfU0NIRURVTEVfR1QgfCBPUF9TQ0hFRFVMRV9MVCB8IE9QX1NDSEVEVUxFX1hPUiB8IE9QX1NDSEVEVUxFX0FORF9USEVOIHwgT1BfU0NIRURVTEVfT1JfRUxTRSB8IE9QX05PTl9ERVRFUk1JTklTTSApOworICovCitzdGF0aWMgc2VwOjpPcGVyYXRvciAqCitvcF9zY2hlZHVsaW5nKHBmbWxQYXJzZXIgY3R4KQoreworICAgIHNlcDo6T3BlcmF0b3IgKiBvcDsKKworICAgIEFOVExSM19VSU5UMzIgb3Bfc2NoZWR1bGluZ19TdGFydEluZGV4OworCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIG9wX3NjaGVkdWxpbmdfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTcyKSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiBvcDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vICAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NjgxOjI6ICggT1BfU0NIRURVTEVfR1QgfCBPUF9TQ0hFRFVMRV9MVCB8IE9QX1NDSEVEVUxFX1hPUiB8IE9QX1NDSEVEVUxFX0FORF9USEVOIHwgT1BfU0NIRURVTEVfT1JfRUxTRSB8IE9QX05PTl9ERVRFUk1JTklTTSApCisKKyAgICAgICAgICAgIEFOVExSM19VSU5UMzIgYWx0NDEyOworCisgICAgICAgICAgICBhbHQ0MTI9NjsKKworICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBPUF9TQ0hFRFVMRV9HVDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQxMj0xOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BfU0NIRURVTEVfTFQ6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ0MTI9MjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9QX1NDSEVEVUxFX1hPUjoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQxMj0zOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BfU0NIRURVTEVfQU5EX1RIRU46CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ0MTI9NDsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9QX1NDSEVEVUxFX09SX0VMU0U6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ0MTI9NTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9QX05PTl9ERVRFUk1JTklTTToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQxMj02OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDQxMjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgIGdvdG8gcnVsZW9wX3NjaGVkdWxpbmdFeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDQxMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NjgxOjQ6IE9QX1NDSEVEVUxFX0dUCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKE9QX1NDSEVEVUxFX0dULCAmRk9MTE9XX09QX1NDSEVEVUxFX0dUX2luX29wX3NjaGVkdWxpbmcxNTUwMyk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW9wX3NjaGVkdWxpbmdFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBvcDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgb3A9IE9QKFBSSU9SX0dUKTsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDI6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDY4Mjo0OiBPUF9TQ0hFRFVMRV9MVAorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChPUF9TQ0hFRFVMRV9MVCwgJkZPTExPV19PUF9TQ0hFRFVMRV9MVF9pbl9vcF9zY2hlZHVsaW5nMTU1MTcpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVvcF9zY2hlZHVsaW5nRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG9wPSBPUChQUklPUl9MVCk7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAzOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ2ODM6NDogT1BfU0NIRURVTEVfWE9SCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKE9QX1NDSEVEVUxFX1hPUiwgJkZPTExPV19PUF9TQ0hFRFVMRV9YT1JfaW5fb3Bfc2NoZWR1bGluZzE1NTMxKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlb3Bfc2NoZWR1bGluZ0V4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG9wOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBvcD0gT1AoRVhDTFVTSVZFKTsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDQ6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDY4NTo0OiBPUF9TQ0hFRFVMRV9BTkRfVEhFTgorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChPUF9TQ0hFRFVMRV9BTkRfVEhFTiwgJkZPTExPV19PUF9TQ0hFRFVMRV9BTkRfVEhFTl9pbl9vcF9zY2hlZHVsaW5nMTU1NDUpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVvcF9zY2hlZHVsaW5nRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG9wPSBPUChTQ0hFRFVMRV9BTkRfVEhFTik7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA1OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ2ODY6NDogT1BfU0NIRURVTEVfT1JfRUxTRQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChPUF9TQ0hFRFVMRV9PUl9FTFNFLCAmRk9MTE9XX09QX1NDSEVEVUxFX09SX0VMU0VfaW5fb3Bfc2NoZWR1bGluZzE1NTUzKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlb3Bfc2NoZWR1bGluZ0V4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG9wOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBvcD0gT1AoU0NIRURVTEVfT1JfRUxTRSk7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA2OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ2ODg6NDogT1BfTk9OX0RFVEVSTUlOSVNNCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKE9QX05PTl9ERVRFUk1JTklTTSwgJkZPTExPV19PUF9OT05fREVURVJNSU5JU01faW5fb3Bfc2NoZWR1bGluZzE1NTYzKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlb3Bfc2NoZWR1bGluZ0V4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG9wOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBvcD0gT1AoTk9OREVURVJNSU5JU00pOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlb3Bfc2NoZWR1bGluZ0V4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZW9wX3NjaGVkdWxpbmdFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDE3Miwgb3Bfc2NoZWR1bGluZ19TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIG9wOworfQorLyogJEFOVExSIGVuZCBvcF9zY2hlZHVsaW5nICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IG9wX2NvbmN1cnJlbmN5CisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NjkxOjE6IG9wX2NvbmN1cnJlbmN5IHJldHVybnMgWyBzZXA6Ok9wZXJhdG9yICogb3AgXSA6ICggT1BfQ09OQ1VSUkVOQ1lfQVNZTkMgfCBPUF9DT05DVVJSRU5DWV9BTkQgfCBPUF9DT05DVVJSRU5DWV9PUiB8IE9QX0NPTkNVUlJFTkNZX0lOVEVSTEVBVklORyB8IE9QX0NPTkNVUlJFTkNZX1BBUkFMTEVMIHwgT1BfQ09OQ1VSUkVOQ1lfUkRWX0FTWU5DIHwgT1BfQ09OQ1VSUkVOQ1lfUkRWX0FORCB8IE9QX0NPTkNVUlJFTkNZX1JEVl9PUiB8IE9QX0NPTkNVUlJFTkNZX1JEVl9JTlRFUkxFQVZJTkcgfCBPUF9DT05DVVJSRU5DWV9SRFZfUEFSQUxMRUwgKTsKKyAqLworc3RhdGljIHNlcDo6T3BlcmF0b3IgKgorb3BfY29uY3VycmVuY3kocGZtbFBhcnNlciBjdHgpCit7CisgICAgc2VwOjpPcGVyYXRvciAqIG9wOworCisgICAgQU5UTFIzX1VJTlQzMiBvcF9jb25jdXJyZW5jeV9TdGFydEluZGV4OworCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIG9wX2NvbmN1cnJlbmN5X1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDE3MykpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gb3A7CisgICAgfQorCisgICAgeworICAgICAgICB7CisgICAgICAgICAgICAvLyAgL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDY5MzoyOiAoIE9QX0NPTkNVUlJFTkNZX0FTWU5DIHwgT1BfQ09OQ1VSUkVOQ1lfQU5EIHwgT1BfQ09OQ1VSUkVOQ1lfT1IgfCBPUF9DT05DVVJSRU5DWV9JTlRFUkxFQVZJTkcgfCBPUF9DT05DVVJSRU5DWV9QQVJBTExFTCB8IE9QX0NPTkNVUlJFTkNZX1JEVl9BU1lOQyB8IE9QX0NPTkNVUlJFTkNZX1JEVl9BTkQgfCBPUF9DT05DVVJSRU5DWV9SRFZfT1IgfCBPUF9DT05DVVJSRU5DWV9SRFZfSU5URVJMRUFWSU5HIHwgT1BfQ09OQ1VSUkVOQ1lfUkRWX1BBUkFMTEVMICkKKworICAgICAgICAgICAgQU5UTFIzX1VJTlQzMiBhbHQ0MTM7CisKKyAgICAgICAgICAgIGFsdDQxMz0xMDsKKworICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBPUF9DT05DVVJSRU5DWV9BU1lOQzoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQxMz0xOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BfQ09OQ1VSUkVOQ1lfQU5EOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDEzPTI7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUF9DT05DVVJSRU5DWV9PUjoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQxMz0zOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BfQ09OQ1VSUkVOQ1lfSU5URVJMRUFWSU5HOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDEzPTQ7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUF9DT05DVVJSRU5DWV9QQVJBTExFTDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQxMz01OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BfQ09OQ1VSUkVOQ1lfUkRWX0FTWU5DOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDEzPTY7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUF9DT05DVVJSRU5DWV9SRFZfQU5EOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDEzPTc7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUF9DT05DVVJSRU5DWV9SRFZfT1I6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ0MTM9ODsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9QX0NPTkNVUlJFTkNZX1JEVl9JTlRFUkxFQVZJTkc6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ0MTM9OTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9QX0NPTkNVUlJFTkNZX1JEVl9QQVJBTExFTDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQxMz0xMDsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA0MTM7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVvcF9jb25jdXJyZW5jeUV4OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NDEzKQorICAgICAgICAgICAgeworICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ2OTM6NDogT1BfQ09OQ1VSUkVOQ1lfQVNZTkMKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoT1BfQ09OQ1VSUkVOQ1lfQVNZTkMsICZGT0xMT1dfT1BfQ09OQ1VSUkVOQ1lfQVNZTkNfaW5fb3BfY29uY3VycmVuY3kxNTU4Myk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW9wX2NvbmN1cnJlbmN5RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG9wPSBPUChBU1lOQ0hST05PVVMpOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0Njk0OjQ6IE9QX0NPTkNVUlJFTkNZX0FORAorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChPUF9DT05DVVJSRU5DWV9BTkQsICZGT0xMT1dfT1BfQ09OQ1VSUkVOQ1lfQU5EX2luX29wX2NvbmN1cnJlbmN5MTU2MDEpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVvcF9jb25jdXJyZW5jeUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG9wOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBvcD0gT1AoU1RST05HX1NZTkNIUk9OT1VTKTsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDM6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDY5NTo0OiBPUF9DT05DVVJSRU5DWV9PUgorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChPUF9DT05DVVJSRU5DWV9PUiwgJkZPTExPV19PUF9DT05DVVJSRU5DWV9PUl9pbl9vcF9jb25jdXJyZW5jeTE1NjIxKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlb3BfY29uY3VycmVuY3lFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBvcDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgb3A9IE9QKFdFQUtfU1lOQ0hST05PVVMpOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgNDoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0Njk2OjQ6IE9QX0NPTkNVUlJFTkNZX0lOVEVSTEVBVklORworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChPUF9DT05DVVJSRU5DWV9JTlRFUkxFQVZJTkcsICZGT0xMT1dfT1BfQ09OQ1VSUkVOQ1lfSU5URVJMRUFWSU5HX2luX29wX2NvbmN1cnJlbmN5MTU2NDIpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVvcF9jb25jdXJyZW5jeUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG9wOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBvcD0gT1AoSU5URVJMRUFWSU5HKTsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDU6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDY5Nzo0OiBPUF9DT05DVVJSRU5DWV9QQVJBTExFTAorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChPUF9DT05DVVJSRU5DWV9QQVJBTExFTCwgJkZPTExPV19PUF9DT05DVVJSRU5DWV9QQVJBTExFTF9pbl9vcF9jb25jdXJyZW5jeTE1NjUzKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlb3BfY29uY3VycmVuY3lFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBvcDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgb3A9IE9QKFBBUkFMTEVMKTsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDY6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDY5OTo0OiBPUF9DT05DVVJSRU5DWV9SRFZfQVNZTkMKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoT1BfQ09OQ1VSUkVOQ1lfUkRWX0FTWU5DLCAmRk9MTE9XX09QX0NPTkNVUlJFTkNZX1JEVl9BU1lOQ19pbl9vcF9jb25jdXJyZW5jeTE1NjY5KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlb3BfY29uY3VycmVuY3lFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBvcDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgb3A9IE9QKFJEVl9BU1lOQ0hST05PVVMpOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgNzoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NzAwOjQ6IE9QX0NPTkNVUlJFTkNZX1JEVl9BTkQKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoT1BfQ09OQ1VSUkVOQ1lfUkRWX0FORCwgJkZPTExPV19PUF9DT05DVVJSRU5DWV9SRFZfQU5EX2luX29wX2NvbmN1cnJlbmN5MTU2ODMpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVvcF9jb25jdXJyZW5jeUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG9wOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBvcD0gT1AoUkRWX1NUUk9OR19TWU5DSFJPTk9VUyk7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA4OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ3MDE6NDogT1BfQ09OQ1VSUkVOQ1lfUkRWX09SCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKE9QX0NPTkNVUlJFTkNZX1JEVl9PUiwgJkZPTExPV19PUF9DT05DVVJSRU5DWV9SRFZfT1JfaW5fb3BfY29uY3VycmVuY3kxNTY5OSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW9wX2NvbmN1cnJlbmN5RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG9wPSBPUChSRFZfV0VBS19TWU5DSFJPTk9VUyk7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA5OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ3MDI6NDogT1BfQ09OQ1VSUkVOQ1lfUkRWX0lOVEVSTEVBVklORworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChPUF9DT05DVVJSRU5DWV9SRFZfSU5URVJMRUFWSU5HLCAmRk9MTE9XX09QX0NPTkNVUlJFTkNZX1JEVl9JTlRFUkxFQVZJTkdfaW5fb3BfY29uY3VycmVuY3kxNTcxNik7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW9wX2NvbmN1cnJlbmN5RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG9wPSBPUChSRFZfSU5URVJMRUFWSU5HKTsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDEwOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ3MDM6NDogT1BfQ09OQ1VSUkVOQ1lfUkRWX1BBUkFMTEVMCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKE9QX0NPTkNVUlJFTkNZX1JEVl9QQVJBTExFTCwgJkZPTExPV19PUF9DT05DVVJSRU5DWV9SRFZfUEFSQUxMRUxfaW5fb3BfY29uY3VycmVuY3kxNTcyMyk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW9wX2NvbmN1cnJlbmN5RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG9wPSBPUChSRFZfUEFSQUxMRUwpOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlb3BfY29uY3VycmVuY3lFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVvcF9jb25jdXJyZW5jeUV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTczLCBvcF9jb25jdXJyZW5jeV9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIG9wOworfQorLyogJEFOVExSIGVuZCBvcF9jb25jdXJyZW5jeSAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBvcF9pbnZva2FibGUKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ3MDg6MTogb3BfaW52b2thYmxlIHJldHVybnMgWyBzZXA6Ok9wZXJhdG9yICogb3AgXSA6ICggUExVUyB8IE1JTlVTIHwgU1RBUiB8IERJViB8IE1PRCB8IEVRVUFMIHwgTkVRVUFMIHwgU0VRVUFMIHwgTlNFUVVBTCB8IEdUIHwgR1RFIHwgTFRfIHwgTFRFIHwgTE5PVCB8IExBTkQgfCBMQU5EX1RIRU4gfCBMT1IgfCBMT1JfRUxTRSB8IEJOT1QgfCBCQU5EIHwgQk9SIHwgQlhPUiB8IExTSElGVCB8IFJTSElGVCB8IEFTU0lHTiB8IEFTU0lHTl9BRlRFUiB8IEFTU0lHTl9SRUYgfCBBU1NJR05fTUFDUk8gfCBPUF9QVVNIIHwgT1BfQVNTSUdOX1RPUCB8IE9QX1RPUCB8IE9QX1BPUCApOworICovCitzdGF0aWMgc2VwOjpPcGVyYXRvciAqCitvcF9pbnZva2FibGUocGZtbFBhcnNlciBjdHgpCit7CisgICAgc2VwOjpPcGVyYXRvciAqIG9wOworCisgICAgQU5UTFIzX1VJTlQzMiBvcF9pbnZva2FibGVfU3RhcnRJbmRleDsKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBvcF9pbnZva2FibGVfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTc0KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiBvcDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vICAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NzEwOjI6ICggUExVUyB8IE1JTlVTIHwgU1RBUiB8IERJViB8IE1PRCB8IEVRVUFMIHwgTkVRVUFMIHwgU0VRVUFMIHwgTlNFUVVBTCB8IEdUIHwgR1RFIHwgTFRfIHwgTFRFIHwgTE5PVCB8IExBTkQgfCBMQU5EX1RIRU4gfCBMT1IgfCBMT1JfRUxTRSB8IEJOT1QgfCBCQU5EIHwgQk9SIHwgQlhPUiB8IExTSElGVCB8IFJTSElGVCB8IEFTU0lHTiB8IEFTU0lHTl9BRlRFUiB8IEFTU0lHTl9SRUYgfCBBU1NJR05fTUFDUk8gfCBPUF9QVVNIIHwgT1BfQVNTSUdOX1RPUCB8IE9QX1RPUCB8IE9QX1BPUCApCisKKyAgICAgICAgICAgIEFOVExSM19VSU5UMzIgYWx0NDE0OworCisgICAgICAgICAgICBhbHQ0MTQ9MzI7CisKKyAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgUExVUzoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQxND0xOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTUlOVVM6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ0MTQ9MjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNUQVI6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ0MTQ9MzsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERJVjoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQxND00OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTU9EOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDE0PTU7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFUVVBTDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQxND02OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTkVRVUFMOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDE0PTc7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTRVFVQUw6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ0MTQ9ODsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE5TRVFVQUw6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ0MTQ9OTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEdUOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDE0PTEwOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgR1RFOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDE0PTExOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTFRfOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDE0PTEyOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTFRFOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDE0PTEzOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTE5PVDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQxND0xNDsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIExBTkQ6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ0MTQ9MTU7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBMQU5EX1RIRU46CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ0MTQ9MTY7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBMT1I6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ0MTQ9MTc7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBMT1JfRUxTRToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQxND0xODsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJOT1Q6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ0MTQ9MTk7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQU5EOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDE0PTIwOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQk9SOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDE0PTIxOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQlhPUjoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQxND0yMjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIExTSElGVDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQxND0yMzsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJTSElGVDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQxND0yNDsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTU0lHTjoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQxND0yNTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTU0lHTl9BRlRFUjoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQxND0yNjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTU0lHTl9SRUY6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ0MTQ9Mjc7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBU1NJR05fTUFDUk86CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ0MTQ9Mjg7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUF9QVVNIOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDE0PTI5OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BfQVNTSUdOX1RPUDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQxND0zMDsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9QX1RPUDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQxND0zMTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9QX1BPUDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQxND0zMjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA0MTQ7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVvcF9pbnZva2FibGVFeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDQxNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NzEwOjQ6IFBMVVMKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoUExVUywgJkZPTExPV19QTFVTX2luX29wX2ludm9rYWJsZTE1NzQ2KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlb3BfaW52b2thYmxlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG9wPSBPUChQTFVTKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NzEyOjQ6IE1JTlVTCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKE1JTlVTLCAmRk9MTE9XX01JTlVTX2luX29wX2ludm9rYWJsZTE1NzY2KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlb3BfaW52b2thYmxlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG9wPSBPUChNSU5VUyk7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMzoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NzE0OjQ6IFNUQVIKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoU1RBUiwgJkZPTExPV19TVEFSX2luX29wX2ludm9rYWJsZTE1Nzg1KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlb3BfaW52b2thYmxlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG9wPSBPUChNVUxUKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgNDoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NzE1OjQ6IERJVgorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChESVYsICZGT0xMT1dfRElWX2luX29wX2ludm9rYWJsZTE1ODA0KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlb3BfaW52b2thYmxlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG9wPSBPUChESVYpOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgNToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NzE2OjQ6IE1PRAorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChNT0QsICZGT0xMT1dfTU9EX2luX29wX2ludm9rYWJsZTE1ODI0KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlb3BfaW52b2thYmxlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG9wPSBPUChNT0QpOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgNjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NzIwOjQ6IEVRVUFMCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKEVRVUFMLCAmRk9MTE9XX0VRVUFMX2luX29wX2ludm9rYWJsZTE1ODQ3KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlb3BfaW52b2thYmxlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG9wPSBPUChFUSk7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgNzoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NzIxOjQ6IE5FUVVBTAorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChORVFVQUwsICZGT0xMT1dfTkVRVUFMX2luX29wX2ludm9rYWJsZTE1ODY1KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlb3BfaW52b2thYmxlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG9wPSBPUChORVEpOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgODoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NzIzOjQ6IFNFUVVBTAorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChTRVFVQUwsICZGT0xMT1dfU0VRVUFMX2luX29wX2ludm9rYWJsZTE1ODgzKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlb3BfaW52b2thYmxlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG9wPSBPUChTRVEpOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgOToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NzI0OjQ6IE5TRVFVQUwKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoTlNFUVVBTCwgJkZPTExPV19OU0VRVUFMX2luX29wX2ludm9rYWJsZTE1OTAwKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlb3BfaW52b2thYmxlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG9wPSBPUChOU0VRKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMTA6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDcyNjo0OiBHVAorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChHVCwgJkZPTExPV19HVF9pbl9vcF9pbnZva2FibGUxNTkxNyk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW9wX2ludm9rYWJsZUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG9wOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBvcD0gT1AoR1QpOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDExOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ3Mjc6NDogR1RFCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKEdURSwgJkZPTExPV19HVEVfaW5fb3BfaW52b2thYmxlMTU5MzgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVvcF9pbnZva2FibGVFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBvcDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgb3A9IE9QKEdURSk7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAxMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NzI4OjQ6IExUXworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChMVF8sICZGT0xMT1dfTFRfX2luX29wX2ludm9rYWJsZTE1OTU4KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlb3BfaW52b2thYmxlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG9wPSBPUChMVCk7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMTM6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDcyOTo0OiBMVEUKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoTFRFLCAmRk9MTE9XX0xURV9pbl9vcF9pbnZva2FibGUxNTk3OCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW9wX2ludm9rYWJsZUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG9wOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBvcD0gT1AoTFRFKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDE0OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ3MzE6NDogTE5PVAorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChMTk9ULCAmRk9MTE9XX0xOT1RfaW5fb3BfaW52b2thYmxlMTU5OTkpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVvcF9pbnZva2FibGVFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBvcDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgb3A9IE9QKE5PVCk7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAxNToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NzMyOjQ6IExBTkQKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoTEFORCwgJkZPTExPV19MQU5EX2luX29wX2ludm9rYWJsZTE2MDE4KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlb3BfaW52b2thYmxlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG9wPSBPUChBTkQpOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMTY6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDczMzo0OiBMQU5EX1RIRU4KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoTEFORF9USEVOLCAmRk9MTE9XX0xBTkRfVEhFTl9pbl9vcF9pbnZva2FibGUxNjAzNyk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW9wX2ludm9rYWJsZUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG9wOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBvcD0gT1AoQU5EX1RIRU4pOworICAgICAgICAJICAgICAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDE3OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ3MzQ6NDogTE9SCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKExPUiwgJkZPTExPV19MT1JfaW5fb3BfaW52b2thYmxlMTYwNTEpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVvcF9pbnZva2FibGVFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBvcDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgb3A9IE9QKE9SKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAxODoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NzM1OjQ6IExPUl9FTFNFCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKExPUl9FTFNFLCAmRk9MTE9XX0xPUl9FTFNFX2luX29wX2ludm9rYWJsZTE2MDcxKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlb3BfaW52b2thYmxlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG9wPSBPUChPUl9FTFNFKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMTk6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDczNzo0OiBCTk9UCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKEJOT1QsICZGT0xMT1dfQk5PVF9pbl9vcF9pbnZva2FibGUxNjA4Nyk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW9wX2ludm9rYWJsZUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG9wOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBvcD0gT1AoQk5PVCk7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDIwOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ3Mzg6NDogQkFORAorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChCQU5ELCAmRk9MTE9XX0JBTkRfaW5fb3BfaW52b2thYmxlMTYxMDYpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVvcF9pbnZva2FibGVFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBvcDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgb3A9IE9QKEJBTkQpOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAyMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NzM5OjQ6IEJPUgorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChCT1IsICZGT0xMT1dfQk9SX2luX29wX2ludm9rYWJsZTE2MTI1KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlb3BfaW52b2thYmxlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG9wPSBPUChCT1IpOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjI6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDc0MDo0OiBCWE9SCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKEJYT1IsICZGT0xMT1dfQlhPUl9pbl9vcF9pbnZva2FibGUxNjE0NSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW9wX2ludm9rYWJsZUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG9wOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBvcD0gT1AoQlhPUik7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDIzOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ3NDI6NDogTFNISUZUCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKExTSElGVCwgJkZPTExPV19MU0hJRlRfaW5fb3BfaW52b2thYmxlMTYxNjUpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVvcF9pbnZva2FibGVFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBvcDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgb3A9IE9QKExTSElGVCk7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAyNDoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NzQzOjQ6IFJTSElGVAorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChSU0hJRlQsICZGT0xMT1dfUlNISUZUX2luX29wX2ludm9rYWJsZTE2MTgyKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlb3BfaW52b2thYmxlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG9wPSBPUChSU0hJRlQpOworICAgICAgICAJICAgICAgICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjU6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDc0NTo0OiBBU1NJR04KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoQVNTSUdOLCAmRk9MTE9XX0FTU0lHTl9pbl9vcF9pbnZva2FibGUxNjIwMCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW9wX2ludm9rYWJsZUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG9wOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBvcD0gT1AoQVNTSUdOKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDI2OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ3NDY6NDogQVNTSUdOX0FGVEVSCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKEFTU0lHTl9BRlRFUiwgJkZPTExPV19BU1NJR05fQUZURVJfaW5fb3BfaW52b2thYmxlMTYyMTcpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVvcF9pbnZva2FibGVFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBvcDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgb3A9IE9QKEFTU0lHTl9BRlRFUik7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAyNzoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NzQ3OjQ6IEFTU0lHTl9SRUYKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoQVNTSUdOX1JFRiwgJkZPTExPV19BU1NJR05fUkVGX2luX29wX2ludm9rYWJsZTE2MjI4KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlb3BfaW52b2thYmxlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG9wPSBPUChBU1NJR05fUkVGKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjg6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDc0ODo0OiBBU1NJR05fTUFDUk8KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoQVNTSUdOX01BQ1JPLCAmRk9MTE9XX0FTU0lHTl9NQUNST19pbl9vcF9pbnZva2FibGUxNjI0MSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW9wX2ludm9rYWJsZUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG9wOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBvcD0gT1AoQVNTSUdOX01BQ1JPKTsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDI5OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ3NTA6NDogT1BfUFVTSAorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChPUF9QVVNILCAmRk9MTE9XX09QX1BVU0hfaW5fb3BfaW52b2thYmxlMTYyNTMpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVvcF9pbnZva2FibGVFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBvcDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgb3A9IE9QKFBVU0gpOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAzMDoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NzUxOjQ6IE9QX0FTU0lHTl9UT1AKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoT1BfQVNTSUdOX1RPUCwgJkZPTExPV19PUF9BU1NJR05fVE9QX2luX29wX2ludm9rYWJsZTE2MjY5KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlb3BfaW52b2thYmxlRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG9wPSBPUChBU1NJR05fVE9QKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMzE6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDc1Mjo0OiBPUF9UT1AKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoT1BfVE9QLCAmRk9MTE9XX09QX1RPUF9pbl9vcF9pbnZva2FibGUxNjI3OSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW9wX2ludm9rYWJsZUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG9wOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBvcD0gT1AoVE9QKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDMyOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ3NTM6NDogT1BfUE9QCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKE9QX1BPUCwgJkZPTExPV19PUF9QT1BfaW5fb3BfaW52b2thYmxlMTYyOTYpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVvcF9pbnZva2FibGVFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBvcDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgb3A9IE9QKFBPUCk7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVvcF9pbnZva2FibGVFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVvcF9pbnZva2FibGVFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDE3NCwgb3BfaW52b2thYmxlX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gb3A7Cit9CisvKiAkQU5UTFIgZW5kIG9wX2ludm9rYWJsZSAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBwcmVmaXhfc3RhdGVtZW50CisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NzYwOjE6IHByZWZpeF9zdGF0ZW1lbnQgcmV0dXJucyBbIHNlcDo6QkZDb2RlIGFjIF0gOiBET0xMQVJfTENVUkxZIG9wPSBhdm1fb3BlcmF0b3IgKHBzPSBwcmVmaXhfc3RhdGVtZW50IHxlPSB1bmFyeUV4cHJlc3Npb24gKSogUkNVUkxZIDsKKyAqLworc3RhdGljIHNlcDo6QkZDb2RlCitwcmVmaXhfc3RhdGVtZW50KHBmbWxQYXJzZXIgY3R4KQoreworICAgIHNlcDo6QkZDb2RlIGFjOworCisgICAgQU5UTFIzX1VJTlQzMiBwcmVmaXhfc3RhdGVtZW50X1N0YXJ0SW5kZXg7CisKKyAgICBzZXA6Ok9wZXJhdG9yICogb3A7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX29wCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9vcCBzZXA6Ok9wZXJhdG9yICoKKworICAgIHNlcDo6QkZDb2RlIHBzOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9wcworICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfcHMgc2VwOjpCRkNvZGUKKworICAgIHNlcDo6QkYgZTsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfZQorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfZSBzZXA6OkJGCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgcHJlZml4X3N0YXRlbWVudF9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgxNzUpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIGFjOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDc2MjoyOiAoIERPTExBUl9MQ1VSTFkgb3A9IGF2bV9vcGVyYXRvciAocHM9IHByZWZpeF9zdGF0ZW1lbnQgfGU9IHVuYXJ5RXhwcmVzc2lvbiApKiBSQ1VSTFkgKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NzYyOjQ6IERPTExBUl9MQ1VSTFkgb3A9IGF2bV9vcGVyYXRvciAocHM9IHByZWZpeF9zdGF0ZW1lbnQgfGU9IHVuYXJ5RXhwcmVzc2lvbiApKiBSQ1VSTFkKKyAgICAgICAgeworICAgICAgICAgICAgIE1BVENIVChET0xMQVJfTENVUkxZLCAmRk9MTE9XX0RPTExBUl9MQ1VSTFlfaW5fcHJlZml4X3N0YXRlbWVudDE2MzI3KTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlcHJlZml4X3N0YXRlbWVudEV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19hdm1fb3BlcmF0b3JfaW5fcHJlZml4X3N0YXRlbWVudDE2MzMyKTsKKyAgICAgICAgICAgIG9wPWF2bV9vcGVyYXRvcihjdHgpOworCisgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlcHJlZml4X3N0YXRlbWVudEV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIGFjPSBORVdfU1RNVChvcCk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NzYzOjY6IChwcz0gcHJlZml4X3N0YXRlbWVudCB8ZT0gdW5hcnlFeHByZXNzaW9uICkqCisKKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDQxNT0zOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBET0xMQVJfTENVUkxZOgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAgICAgCQkgICAvKiBkZmFMb29wYmFja1N0YXRlKGssZWRnZXMsZW90UHJlZGljdHNBbHQsZGVzY3JpcHRpb24sc3RhdGVOdW1iZXIsc2VtUHJlZFN0YXRlKQorICAgICAgICAgICAgICAgIAkJICAgICovCisgICAgICAgICAgICAgICAgCQkgICAgaW50IExBNDE1XzEgPSBMQSgyKTsKKyAgICAgICAgICAgICAgICAJCSAgICBpZiAoIChzeW5wcmVkNzc4X2ZtbChjdHgpKSkKKyAgICAgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAgICAgCQkgICAgICAgIGFsdDQxNT0xOworICAgICAgICAgICAgICAgIAkJICAgIH0KKyAgICAgICAgICAgICAgICAJCSAgICBlbHNlIGlmICggKHN5bnByZWQ3NzlfZm1sKGN0eCkpKQorICAgICAgICAgICAgICAgIAkJICAgIHsKKyAgICAgICAgICAgICAgICAJCSAgICAgICAgYWx0NDE1PTI7CisgICAgICAgICAgICAgICAgCQkgICAgfQorCisgICAgICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCTk9UOgorICAgICAgICAgICAgICAgIGNhc2UgQ09MT054MjoKKyAgICAgICAgICAgICAgICBjYXNlIENoYXJMaXRlcmFsOgorICAgICAgICAgICAgICAgIGNhc2UgREVDUjoKKyAgICAgICAgICAgICAgICBjYXNlIEZsb2F0TGl0ZXJhbDoKKyAgICAgICAgICAgICAgICBjYXNlIElEOgorICAgICAgICAgICAgICAgIGNhc2UgSU5DUjoKKyAgICAgICAgICAgICAgICBjYXNlIEludGVnZXJMaXRlcmFsOgorICAgICAgICAgICAgICAgIGNhc2UgTEJSQUNLRVQ6CisgICAgICAgICAgICAgICAgY2FzZSBMQlJBQ0tFVF9CQVI6CisgICAgICAgICAgICAgICAgY2FzZSBMQ1VSTFk6CisgICAgICAgICAgICAgICAgY2FzZSBMTk9UOgorICAgICAgICAgICAgICAgIGNhc2UgTFBBUkVOOgorICAgICAgICAgICAgICAgIGNhc2UgTFBBUkVOX0lOVk9LRToKKyAgICAgICAgICAgICAgICBjYXNlIE1JTlVTOgorICAgICAgICAgICAgICAgIGNhc2UgT1BfUE9QOgorICAgICAgICAgICAgICAgIGNhc2UgT1BfVE9QOgorICAgICAgICAgICAgICAgIGNhc2UgUEVSQ0VOVF9MQ1VSTFk6CisgICAgICAgICAgICAgICAgY2FzZSBQTFVTOgorICAgICAgICAgICAgICAgIGNhc2UgUmF0aW9uYWxMaXRlcmFsOgorICAgICAgICAgICAgICAgIGNhc2UgU3RyaW5nTGl0ZXJhbDoKKyAgICAgICAgICAgICAgICBjYXNlIDE1ODoKKyAgICAgICAgICAgICAgICBjYXNlIDE1OToKKyAgICAgICAgICAgICAgICBjYXNlIDE2MDoKKyAgICAgICAgICAgICAgICBjYXNlIDE2MToKKyAgICAgICAgICAgICAgICBjYXNlIDE2MjoKKyAgICAgICAgICAgICAgICBjYXNlIDIzNzoKKyAgICAgICAgICAgICAgICBjYXNlIDI1NjoKKyAgICAgICAgICAgICAgICBjYXNlIDI2NToKKyAgICAgICAgICAgICAgICBjYXNlIDI3NzoKKyAgICAgICAgICAgICAgICBjYXNlIDI4MDoKKyAgICAgICAgICAgICAgICBjYXNlIDI5NDoKKyAgICAgICAgICAgICAgICBjYXNlIDMxMzoKKyAgICAgICAgICAgICAgICBjYXNlIDMzMDoKKyAgICAgICAgICAgICAgICBjYXNlIDMzMToKKyAgICAgICAgICAgICAgICBjYXNlIDMzMjoKKyAgICAgICAgICAgICAgICBjYXNlIDM0MzoKKyAgICAgICAgICAgICAgICBjYXNlIDM0NzoKKyAgICAgICAgICAgICAgICBjYXNlIDM3MjoKKyAgICAgICAgICAgICAgICBjYXNlIDM5NzoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0NDE1PTI7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDQxNSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NzYzOjg6IHBzPSBwcmVmaXhfc3RhdGVtZW50CisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3ByZWZpeF9zdGF0ZW1lbnRfaW5fcHJlZml4X3N0YXRlbWVudDE2MzQ2KTsKKyAgICAgICAgICAgIAkgICAgICAgIHBzPXByZWZpeF9zdGF0ZW1lbnQoY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXByZWZpeF9zdGF0ZW1lbnRFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBhYworICAgICAgICAgICAgCSAgICAgICAgICAgIC0+YXBwZW5kKHBzCisgICAgICAgICAgICAJICAgICAgICAgICAgKTsgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDc2NDo4OiBlPSB1bmFyeUV4cHJlc3Npb24KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfdW5hcnlFeHByZXNzaW9uX2luX3ByZWZpeF9zdGF0ZW1lbnQxNjM2Nyk7CisgICAgICAgICAgICAJICAgICAgICBlPXVuYXJ5RXhwcmVzc2lvbihjdHgpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlcHJlZml4X3N0YXRlbWVudEV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIGFjCisgICAgICAgICAgICAJICAgICAgICAgICAgLT5hcHBlbmQoZQorICAgICAgICAgICAgCSAgICAgICAgICAgICk7ICAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAgICAgCSAgICBnb3RvIGxvb3A0MTU7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb29wNDE1OiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICAgICAgIE1BVENIVChSQ1VSTFksICZGT0xMT1dfUkNVUkxZX2luX3ByZWZpeF9zdGF0ZW1lbnQxNjM5Mik7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXByZWZpeF9zdGF0ZW1lbnRFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICB9CisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVwcmVmaXhfc3RhdGVtZW50RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlcHJlZml4X3N0YXRlbWVudEV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTc1LCBwcmVmaXhfc3RhdGVtZW50X1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gYWM7Cit9CisvKiAkQU5UTFIgZW5kIHByZWZpeF9zdGF0ZW1lbnQgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgcHJlZml4X2V4cHJlc3Npb24KKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ3Njk6MTogcHJlZml4X2V4cHJlc3Npb24gcmV0dXJucyBbIHNlcDo6QkZDb2RlIGFjIF0gOiBET0xMQVJfTENVUkxZIG9wPSBhdm1fb3BlcmF0b3IgKHBzPSBwcmVmaXhfZXhwcmVzc2lvbiB8ZT0gdW5hcnlFeHByZXNzaW9uICkqIFJDVVJMWSA7CisgKi8KK3N0YXRpYyBzZXA6OkJGQ29kZQorcHJlZml4X2V4cHJlc3Npb24ocGZtbFBhcnNlciBjdHgpCit7CisgICAgc2VwOjpCRkNvZGUgYWM7CisKKyAgICBBTlRMUjNfVUlOVDMyIHByZWZpeF9leHByZXNzaW9uX1N0YXJ0SW5kZXg7CisKKyAgICBzZXA6Ok9wZXJhdG9yICogb3A7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX29wCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9vcCBzZXA6Ok9wZXJhdG9yICoKKworICAgIHNlcDo6QkZDb2RlIHBzOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9wcworICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfcHMgc2VwOjpCRkNvZGUKKworICAgIHNlcDo6QkYgZTsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfZQorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfZSBzZXA6OkJGCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgcHJlZml4X2V4cHJlc3Npb25fU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTc2KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiBhYzsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ3NzE6MjogKCBET0xMQVJfTENVUkxZIG9wPSBhdm1fb3BlcmF0b3IgKHBzPSBwcmVmaXhfZXhwcmVzc2lvbiB8ZT0gdW5hcnlFeHByZXNzaW9uICkqIFJDVVJMWSApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ3NzE6NDogRE9MTEFSX0xDVVJMWSBvcD0gYXZtX29wZXJhdG9yIChwcz0gcHJlZml4X2V4cHJlc3Npb24gfGU9IHVuYXJ5RXhwcmVzc2lvbiApKiBSQ1VSTFkKKyAgICAgICAgeworICAgICAgICAgICAgIE1BVENIVChET0xMQVJfTENVUkxZLCAmRk9MTE9XX0RPTExBUl9MQ1VSTFlfaW5fcHJlZml4X2V4cHJlc3Npb24xNjQwNyk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXByZWZpeF9leHByZXNzaW9uRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2F2bV9vcGVyYXRvcl9pbl9wcmVmaXhfZXhwcmVzc2lvbjE2NDEyKTsKKyAgICAgICAgICAgIG9wPWF2bV9vcGVyYXRvcihjdHgpOworCisgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlcHJlZml4X2V4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBhYz0gTkVXX1NUTVQob3ApOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDc3Mjo2OiAocHM9IHByZWZpeF9leHByZXNzaW9uIHxlPSB1bmFyeUV4cHJlc3Npb24gKSoKKworICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0NDE2PTM7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIERPTExBUl9MQ1VSTFk6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgICAgICAJCSAgIC8qIGRmYUxvb3BiYWNrU3RhdGUoayxlZGdlcyxlb3RQcmVkaWN0c0FsdCxkZXNjcmlwdGlvbixzdGF0ZU51bWJlcixzZW1QcmVkU3RhdGUpCisgICAgICAgICAgICAgICAgCQkgICAgKi8KKyAgICAgICAgICAgICAgICAJCSAgICBpbnQgTEE0MTZfMSA9IExBKDIpOworICAgICAgICAgICAgICAgIAkJICAgIGlmICggKHN5bnByZWQ3ODBfZm1sKGN0eCkpKQorICAgICAgICAgICAgICAgIAkJICAgIHsKKyAgICAgICAgICAgICAgICAJCSAgICAgICAgYWx0NDE2PTE7CisgICAgICAgICAgICAgICAgCQkgICAgfQorICAgICAgICAgICAgICAgIAkJICAgIGVsc2UgaWYgKCAoc3lucHJlZDc4MV9mbWwoY3R4KSkpCisgICAgICAgICAgICAgICAgCQkgICAgeworICAgICAgICAgICAgICAgIAkJICAgICAgICBhbHQ0MTY9MjsKKyAgICAgICAgICAgICAgICAJCSAgICB9CisKKyAgICAgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJOT1Q6CisgICAgICAgICAgICAgICAgY2FzZSBDT0xPTngyOgorICAgICAgICAgICAgICAgIGNhc2UgQ2hhckxpdGVyYWw6CisgICAgICAgICAgICAgICAgY2FzZSBERUNSOgorICAgICAgICAgICAgICAgIGNhc2UgRmxvYXRMaXRlcmFsOgorICAgICAgICAgICAgICAgIGNhc2UgSUQ6CisgICAgICAgICAgICAgICAgY2FzZSBJTkNSOgorICAgICAgICAgICAgICAgIGNhc2UgSW50ZWdlckxpdGVyYWw6CisgICAgICAgICAgICAgICAgY2FzZSBMQlJBQ0tFVDoKKyAgICAgICAgICAgICAgICBjYXNlIExCUkFDS0VUX0JBUjoKKyAgICAgICAgICAgICAgICBjYXNlIExDVVJMWToKKyAgICAgICAgICAgICAgICBjYXNlIExOT1Q6CisgICAgICAgICAgICAgICAgY2FzZSBMUEFSRU46CisgICAgICAgICAgICAgICAgY2FzZSBMUEFSRU5fSU5WT0tFOgorICAgICAgICAgICAgICAgIGNhc2UgTUlOVVM6CisgICAgICAgICAgICAgICAgY2FzZSBPUF9QT1A6CisgICAgICAgICAgICAgICAgY2FzZSBPUF9UT1A6CisgICAgICAgICAgICAgICAgY2FzZSBQRVJDRU5UX0xDVVJMWToKKyAgICAgICAgICAgICAgICBjYXNlIFBMVVM6CisgICAgICAgICAgICAgICAgY2FzZSBSYXRpb25hbExpdGVyYWw6CisgICAgICAgICAgICAgICAgY2FzZSBTdHJpbmdMaXRlcmFsOgorICAgICAgICAgICAgICAgIGNhc2UgMTU4OgorICAgICAgICAgICAgICAgIGNhc2UgMTU5OgorICAgICAgICAgICAgICAgIGNhc2UgMTYwOgorICAgICAgICAgICAgICAgIGNhc2UgMTYxOgorICAgICAgICAgICAgICAgIGNhc2UgMTYyOgorICAgICAgICAgICAgICAgIGNhc2UgMjM3OgorICAgICAgICAgICAgICAgIGNhc2UgMjU2OgorICAgICAgICAgICAgICAgIGNhc2UgMjY1OgorICAgICAgICAgICAgICAgIGNhc2UgMjc3OgorICAgICAgICAgICAgICAgIGNhc2UgMjgwOgorICAgICAgICAgICAgICAgIGNhc2UgMjk0OgorICAgICAgICAgICAgICAgIGNhc2UgMzEzOgorICAgICAgICAgICAgICAgIGNhc2UgMzMwOgorICAgICAgICAgICAgICAgIGNhc2UgMzMxOgorICAgICAgICAgICAgICAgIGNhc2UgMzMyOgorICAgICAgICAgICAgICAgIGNhc2UgMzQzOgorICAgICAgICAgICAgICAgIGNhc2UgMzQ3OgorICAgICAgICAgICAgICAgIGNhc2UgMzcyOgorICAgICAgICAgICAgICAgIGNhc2UgMzk3OgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQ0MTY9MjsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NDE2KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ3NzI6ODogcHM9IHByZWZpeF9leHByZXNzaW9uCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3ByZWZpeF9leHByZXNzaW9uX2luX3ByZWZpeF9leHByZXNzaW9uMTY0MjYpOworICAgICAgICAgICAgCSAgICAgICAgcHM9cHJlZml4X2V4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXByZWZpeF9leHByZXNzaW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgYWMKKyAgICAgICAgICAgIAkgICAgICAgICAgICAtPmFwcGVuZChwcworICAgICAgICAgICAgCSAgICAgICAgICAgICk7IAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDI6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ3NzM6ODogZT0gdW5hcnlFeHByZXNzaW9uCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3VuYXJ5RXhwcmVzc2lvbl9pbl9wcmVmaXhfZXhwcmVzc2lvbjE2NDQ2KTsKKyAgICAgICAgICAgIAkgICAgICAgIGU9dW5hcnlFeHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVwcmVmaXhfZXhwcmVzc2lvbkV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIGFjCisgICAgICAgICAgICAJICAgICAgICAgICAgLT5hcHBlbmQoZQorICAgICAgICAgICAgCSAgICAgICAgICAgICk7ICAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAgICAgCSAgICBnb3RvIGxvb3A0MTY7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb29wNDE2OiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICAgICAgIE1BVENIVChSQ1VSTFksICZGT0xMT1dfUkNVUkxZX2luX3ByZWZpeF9leHByZXNzaW9uMTY0NzEpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVwcmVmaXhfZXhwcmVzc2lvbkV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZXByZWZpeF9leHByZXNzaW9uRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlcHJlZml4X2V4cHJlc3Npb25FeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDE3NiwgcHJlZml4X2V4cHJlc3Npb25fU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiBhYzsKK30KKy8qICRBTlRMUiBlbmQgcHJlZml4X2V4cHJlc3Npb24gKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgYXZtX29wZXJhdG9yCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0Nzc4OjE6IGF2bV9vcGVyYXRvciByZXR1cm5zIFsgc2VwOjpPcGVyYXRvciAqIG9wIF0gOiAobz0gb3BfaW52b2thYmxlIHxvPSBvcF9hY3Rpdml0eSB8ey4uLn0/IElEICk7CisgKi8KK3N0YXRpYyBzZXA6Ok9wZXJhdG9yICoKK2F2bV9vcGVyYXRvcihwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBzZXA6Ok9wZXJhdG9yICogb3A7CisKKyAgICBBTlRMUjNfVUlOVDMyIGF2bV9vcGVyYXRvcl9TdGFydEluZGV4OworCisgICAgc2VwOjpPcGVyYXRvciAqIG87CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX28KKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX28gc2VwOjpPcGVyYXRvciAqCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgYXZtX29wZXJhdG9yX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDE3NykpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gb3A7CisgICAgfQorCisgICAgeworICAgICAgICB7CisgICAgICAgICAgICAvLyAgL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDc4MDoyOiAobz0gb3BfaW52b2thYmxlIHxvPSBvcF9hY3Rpdml0eSB8ey4uLn0/IElEICkKKworICAgICAgICAgICAgQU5UTFIzX1VJTlQzMiBhbHQ0MTc7CisKKyAgICAgICAgICAgIGFsdDQxNz0zOworCisgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEFTU0lHTjoKKyAgICAgICAgICAgIGNhc2UgQVNTSUdOX0FGVEVSOgorICAgICAgICAgICAgY2FzZSBBU1NJR05fTUFDUk86CisgICAgICAgICAgICBjYXNlIEFTU0lHTl9SRUY6CisgICAgICAgICAgICBjYXNlIEJBTkQ6CisgICAgICAgICAgICBjYXNlIEJOT1Q6CisgICAgICAgICAgICBjYXNlIEJPUjoKKyAgICAgICAgICAgIGNhc2UgQlhPUjoKKyAgICAgICAgICAgIGNhc2UgRElWOgorICAgICAgICAgICAgY2FzZSBFUVVBTDoKKyAgICAgICAgICAgIGNhc2UgR1Q6CisgICAgICAgICAgICBjYXNlIEdURToKKyAgICAgICAgICAgIGNhc2UgTEFORDoKKyAgICAgICAgICAgIGNhc2UgTEFORF9USEVOOgorICAgICAgICAgICAgY2FzZSBMTk9UOgorICAgICAgICAgICAgY2FzZSBMT1I6CisgICAgICAgICAgICBjYXNlIExPUl9FTFNFOgorICAgICAgICAgICAgY2FzZSBMU0hJRlQ6CisgICAgICAgICAgICBjYXNlIExURToKKyAgICAgICAgICAgIGNhc2UgTFRfOgorICAgICAgICAgICAgY2FzZSBNSU5VUzoKKyAgICAgICAgICAgIGNhc2UgTU9EOgorICAgICAgICAgICAgY2FzZSBORVFVQUw6CisgICAgICAgICAgICBjYXNlIE5TRVFVQUw6CisgICAgICAgICAgICBjYXNlIE9QX0FTU0lHTl9UT1A6CisgICAgICAgICAgICBjYXNlIE9QX1BPUDoKKyAgICAgICAgICAgIGNhc2UgT1BfUFVTSDoKKyAgICAgICAgICAgIGNhc2UgT1BfVE9QOgorICAgICAgICAgICAgY2FzZSBQTFVTOgorICAgICAgICAgICAgY2FzZSBSU0hJRlQ6CisgICAgICAgICAgICBjYXNlIFNFUVVBTDoKKyAgICAgICAgICAgIGNhc2UgU1RBUjoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQxNz0xOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjM2OgorICAgICAgICAgICAgY2FzZSAyNjc6CisgICAgICAgICAgICBjYXNlIDI2ODoKKyAgICAgICAgICAgIGNhc2UgMjc1OgorICAgICAgICAgICAgY2FzZSAyODI6CisgICAgICAgICAgICBjYXNlIDI5MToKKyAgICAgICAgICAgIGNhc2UgMjkyOgorICAgICAgICAgICAgY2FzZSAyOTM6CisgICAgICAgICAgICBjYXNlIDI5NjoKKyAgICAgICAgICAgIGNhc2UgMzYyOgorICAgICAgICAgICAgY2FzZSAzNjM6CisgICAgICAgICAgICBjYXNlIDM2ODoKKyAgICAgICAgICAgIGNhc2UgMzY5OgorICAgICAgICAgICAgY2FzZSAzNzE6CisgICAgICAgICAgICBjYXNlIDM3NzoKKyAgICAgICAgICAgIGNhc2UgMzg2OgorICAgICAgICAgICAgY2FzZSAzODk6CisgICAgICAgICAgICBjYXNlIDQxNToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQxNz0yOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSUQ6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ0MTc9MzsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA0MTc7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVhdm1fb3BlcmF0b3JFeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDQxNykKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NzgwOjQ6IG89IG9wX2ludm9rYWJsZQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfb3BfaW52b2thYmxlX2luX2F2bV9vcGVyYXRvcjE2NDg4KTsKKyAgICAgICAgCSAgICAgICAgbz1vcF9pbnZva2FibGUoY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlYXZtX29wZXJhdG9yRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG9wPSAKKyAgICAgICAgCSAgICAgICAgICAgIG8KKyAgICAgICAgCSAgICAgICAgICAgIDsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDI6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDc4Mjo0OiBvPSBvcF9hY3Rpdml0eQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfb3BfYWN0aXZpdHlfaW5fYXZtX29wZXJhdG9yMTY1MDApOworICAgICAgICAJICAgICAgICBvPW9wX2FjdGl2aXR5KGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWF2bV9vcGVyYXRvckV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG9wOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBvcD0gCisgICAgICAgIAkgICAgICAgICAgICBvCisgICAgICAgIAkgICAgICAgICAgICA7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAzOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ3ODQ6NDogey4uLn0/IElECisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBpZiAoICEoKCAob3AgPSBzZXA6Ok9wZXJhdG9yTWFuYWdlcjo6Z2V0T3AoU1RSKExUKDEpLT5nZXRUZXh0KExUKDEpKS0+Y2hhcnMpKSkgIT0gTlVMTCApKSApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIG9wOworICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19GQUlMRURfUFJFRElDQVRFX0VYQ0VQVElPTjsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiAob3AgPSBzZXA6Ok9wZXJhdG9yTWFuYWdlcjo6Z2V0T3AoU1RSKExUKDEpLT5nZXRUZXh0KExUKDEpKS0+Y2hhcnMpKSkgIT0gTlVMTCAiOworICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+cnVsZU5hbWUJID0gKHZvaWQgKikiYXZtX29wZXJhdG9yIjsKKworCisgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgTUFUQ0hUKElELCAmRk9MTE9XX0lEX2luX2F2bV9vcGVyYXRvcjE2NTEyKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlYXZtX29wZXJhdG9yRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVhdm1fb3BlcmF0b3JFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVhdm1fb3BlcmF0b3JFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDE3NywgYXZtX29wZXJhdG9yX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gb3A7Cit9CisvKiAkQU5UTFIgZW5kIGF2bV9vcGVyYXRvciAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBzdGF0ZW1lbnRfaW52b2tlX21ldGhvZAorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDc5MjoxOiBzdGF0ZW1lbnRfaW52b2tlX21ldGhvZCByZXR1cm5zIFsgc2VwOjpCRkNvZGUgYWMgXSA6ICdjYWxsJyBpZD0gSUQgKCBkZWNsX2luc3RhbmNlX21hY2hpbmVfcGFyYW1zWyBjYWxsUHJvY2VkdXJlIF0gKT8gKCBkZWNsX2luc3RhbmNlX21hY2hpbmVfcmV0dXJuc1sgY2FsbFByb2NlZHVyZSBdICk/IFNFTUkgOworICovCitzdGF0aWMgc2VwOjpCRkNvZGUKK3N0YXRlbWVudF9pbnZva2VfbWV0aG9kKHBmbWxQYXJzZXIgY3R4KQoreworICAgIHNlcDo6QkZDb2RlIGFjOworCisgICAgQU5UTFIzX1VJTlQzMiBzdGF0ZW1lbnRfaW52b2tlX21ldGhvZF9TdGFydEluZGV4OworCisgICAgcEFOVExSM19DT01NT05fVE9LRU4gICAgaWQ7CisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgc3RhdGVtZW50X2ludm9rZV9tZXRob2RfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworCisgICAgCXNlcDo6QkYgbW9kZWxQcm9jZWR1cmU7CisgICAgCXNlcDo6TWFjaGluZSAqIGNhbGxQcm9jZWR1cmU7CisKKyAgICAJU0FWRV9SVUxFX0JFR0lOX0xPQ0FUSU9OOworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgxNzgpKSApCisgICAgeworICAgICAgICB7CisKKyAgICAgICAgICAgIAlTRVRfUlVMRV9MT0NBVElPTihjYWxsUHJvY2VkdXJlKTsKKworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gYWM7CisgICAgfQorCisgICAgaWQgICAgICAgPSBOVUxMOworCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0ODA0OjI6ICggJ2NhbGwnIGlkPSBJRCAoIGRlY2xfaW5zdGFuY2VfbWFjaGluZV9wYXJhbXNbIGNhbGxQcm9jZWR1cmUgXSApPyAoIGRlY2xfaW5zdGFuY2VfbWFjaGluZV9yZXR1cm5zWyBjYWxsUHJvY2VkdXJlIF0gKT8gU0VNSSApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ4MDQ6NDogJ2NhbGwnIGlkPSBJRCAoIGRlY2xfaW5zdGFuY2VfbWFjaGluZV9wYXJhbXNbIGNhbGxQcm9jZWR1cmUgXSApPyAoIGRlY2xfaW5zdGFuY2VfbWFjaGluZV9yZXR1cm5zWyBjYWxsUHJvY2VkdXJlIF0gKT8gU0VNSQorICAgICAgICB7CisgICAgICAgICAgICAgTUFUQ0hUKDI1MCwgJkZPTExPV18yNTBfaW5fc3RhdGVtZW50X2ludm9rZV9tZXRob2QxNjU0MSk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9pbnZva2VfbWV0aG9kRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlkID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoSUQsICZGT0xMT1dfSURfaW5fc3RhdGVtZW50X2ludm9rZV9tZXRob2QxNjU0NSk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9pbnZva2VfbWV0aG9kRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIAkgIAltb2RlbFByb2NlZHVyZSA9IHNlcDo6UGFyc2VyVXRpbDo6Z2V0dmFyUHJvY2VkdXJlKFNUUigoaWQtPmdldFRleHQoaWQpKS0+Y2hhcnMpKTsKKworICAgICAgICAgICAgICAgIAkgIAljYWxsUHJvY2VkdXJlID0gc2VwOjpNYWNoaW5lOjpuZXdQcm9jZWR1cmVJbnN0YW5jZShfQ1BNXywKKyAgICAgICAgICAgICAgICAJICAJCQlzZXA6Ok9TUygpIDw8ICJjYWxsXyIgPDwgKyttUHJvY2VkdXJlQ2FsbENvdW50CisgICAgICAgICAgICAgICAgCSAgCQkJCQk8PCAnIycgPDwgU1RSKChpZC0+Z2V0VGV4dChpZCkpLT5jaGFycyksIG1vZGVsUHJvY2VkdXJlKTsKKworICAgICAgICAgICAgICAgIAkJY2FsbFByb2NlZHVyZS0+Z2V0d1NwZWNpZmllcigpLnNldERlc2lnbkluc3RhbmNlU3RhdGljKCk7CisKKyAgICAgICAgICAgICAgICAJICAJCisgICAgICAgICAgICAgICAgYWM9IE5FV19TVE1UMShPUChJTlZPS0VfTUVUSE9EKSwgc2VwOjpCRihjYWxsUHJvY2VkdXJlKSk7CisKKyAgICAgICAgICAgICAgICAJICAKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0ODE3OjQ6ICggZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3BhcmFtc1sgY2FsbFByb2NlZHVyZSBdICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDQxOD0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTFBBUkVOOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDQxOD0xOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ0MTgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDgxNzo0OiBkZWNsX2luc3RhbmNlX21hY2hpbmVfcGFyYW1zWyBjYWxsUHJvY2VkdXJlIF0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3BhcmFtc19pbl9zdGF0ZW1lbnRfaW52b2tlX21ldGhvZDE2NTU2KTsKKyAgICAgICAgICAgIAkgICAgICAgIGRlY2xfaW5zdGFuY2VfbWFjaGluZV9wYXJhbXMoY3R4LCBjYWxsUHJvY2VkdXJlKTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9pbnZva2VfbWV0aG9kRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDgxODo0OiAoIGRlY2xfaW5zdGFuY2VfbWFjaGluZV9yZXR1cm5zWyBjYWxsUHJvY2VkdXJlIF0gKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0NDE5PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjM6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzY1OgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDQxOT0xOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ0MTkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDgxODo0OiBkZWNsX2luc3RhbmNlX21hY2hpbmVfcmV0dXJuc1sgY2FsbFByb2NlZHVyZSBdCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlY2xfaW5zdGFuY2VfbWFjaGluZV9yZXR1cm5zX2luX3N0YXRlbWVudF9pbnZva2VfbWV0aG9kMTY1NjUpOworICAgICAgICAgICAgCSAgICAgICAgZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3JldHVybnMoY3R4LCBjYWxsUHJvY2VkdXJlKTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9pbnZva2VfbWV0aG9kRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgIE1BVENIVChTRU1JLCAmRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2ludm9rZV9tZXRob2QxNjU3NCk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9pbnZva2VfbWV0aG9kRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlc3RhdGVtZW50X2ludm9rZV9tZXRob2RFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVzdGF0ZW1lbnRfaW52b2tlX21ldGhvZEV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICAJU0VUX1JVTEVfTE9DQVRJT04oY2FsbFByb2NlZHVyZSk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKworICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTc4LCBzdGF0ZW1lbnRfaW52b2tlX21ldGhvZF9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIGFjOworfQorLyogJEFOVExSIGVuZCBzdGF0ZW1lbnRfaW52b2tlX21ldGhvZCAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBzdGF0ZW1lbnRfaW52b2tlCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0ODI0OjE6IHN0YXRlbWVudF9pbnZva2UgcmV0dXJucyBbIHNlcDo6QkZDb2RlIGFjIF0gOiBMUEFSRU5fSU5WT0tFIHVlPSB1bmFyeUV4cHJlc3Npb24gKGlkPSBJRCB8ICdpbicgfG9wPSBvcF9pbnZva2FibGUgKSAoZT0gZXhwcmVzc2lvbiApKiAoICdwcm92aWRlZDonIGU9IGV4cHJlc3Npb24gfCAnZnJvbTonIHVlPSB1bmFyeUV4cHJlc3Npb24gfCAndG86JyB1ZT0gdW5hcnlFeHByZXNzaW9uIHwgJ2FjdGl2aXR5Oicgbz0gb3BfYWN0aXZpdHkgKT8gUlBBUkVOIFNFTUkgOworICovCitzdGF0aWMgc2VwOjpCRkNvZGUKK3N0YXRlbWVudF9pbnZva2UocGZtbFBhcnNlciBjdHgpCit7CisgICAgc2VwOjpCRkNvZGUgYWM7CisKKyAgICBBTlRMUjNfVUlOVDMyIHN0YXRlbWVudF9pbnZva2VfU3RhcnRJbmRleDsKKworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIGlkOworICAgIHNlcDo6QkYgdWU7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX3VlCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV91ZSBzZXA6OkJGCisKKyAgICBzZXA6Ok9wZXJhdG9yICogb3A7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX29wCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9vcCBzZXA6Ok9wZXJhdG9yICoKKworICAgIHNlcDo6QkYgZTsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfZQorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfZSBzZXA6OkJGCisKKyAgICBzZXA6Ok9wZXJhdG9yICogbzsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfbworICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfbyBzZXA6Ok9wZXJhdG9yICoKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBzdGF0ZW1lbnRfaW52b2tlX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDE3OSkpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gYWM7CisgICAgfQorCisgICAgaWQgICAgICAgPSBOVUxMOworCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0ODI2OjI6ICggTFBBUkVOX0lOVk9LRSB1ZT0gdW5hcnlFeHByZXNzaW9uIChpZD0gSUQgfCAnaW4nIHxvcD0gb3BfaW52b2thYmxlICkgKGU9IGV4cHJlc3Npb24gKSogKCAncHJvdmlkZWQ6JyBlPSBleHByZXNzaW9uIHwgJ2Zyb206JyB1ZT0gdW5hcnlFeHByZXNzaW9uIHwgJ3RvOicgdWU9IHVuYXJ5RXhwcmVzc2lvbiB8ICdhY3Rpdml0eTonIG89IG9wX2FjdGl2aXR5ICk/IFJQQVJFTiBTRU1JICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDgyNjo0OiBMUEFSRU5fSU5WT0tFIHVlPSB1bmFyeUV4cHJlc3Npb24gKGlkPSBJRCB8ICdpbicgfG9wPSBvcF9pbnZva2FibGUgKSAoZT0gZXhwcmVzc2lvbiApKiAoICdwcm92aWRlZDonIGU9IGV4cHJlc3Npb24gfCAnZnJvbTonIHVlPSB1bmFyeUV4cHJlc3Npb24gfCAndG86JyB1ZT0gdW5hcnlFeHByZXNzaW9uIHwgJ2FjdGl2aXR5Oicgbz0gb3BfYWN0aXZpdHkgKT8gUlBBUkVOIFNFTUkKKyAgICAgICAgeworICAgICAgICAgICAgIE1BVENIVChMUEFSRU5fSU5WT0tFLCAmRk9MTE9XX0xQQVJFTl9JTlZPS0VfaW5fc3RhdGVtZW50X2ludm9rZTE2NTkwKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2ludm9rZUV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fc3RhdGVtZW50X2ludm9rZTE2NTk5KTsKKyAgICAgICAgICAgIHVlPXVuYXJ5RXhwcmVzc2lvbihjdHgpOworCisgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2ludm9rZUV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIGFjPSBORVdfU1RNVDEoT1AoSU5WT0tFX01FVEhPRCksIAorICAgICAgICAgICAgICAgIHVlCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDgyODo2OiAoaWQ9IElEIHwgJ2luJyB8b3A9IG9wX2ludm9rYWJsZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDQyMD0zOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0NDIwPTE7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOTU6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDQyMD0yOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQVNTSUdOOgorICAgICAgICAgICAgICAgIGNhc2UgQVNTSUdOX0FGVEVSOgorICAgICAgICAgICAgICAgIGNhc2UgQVNTSUdOX01BQ1JPOgorICAgICAgICAgICAgICAgIGNhc2UgQVNTSUdOX1JFRjoKKyAgICAgICAgICAgICAgICBjYXNlIEJBTkQ6CisgICAgICAgICAgICAgICAgY2FzZSBCTk9UOgorICAgICAgICAgICAgICAgIGNhc2UgQk9SOgorICAgICAgICAgICAgICAgIGNhc2UgQlhPUjoKKyAgICAgICAgICAgICAgICBjYXNlIERJVjoKKyAgICAgICAgICAgICAgICBjYXNlIEVRVUFMOgorICAgICAgICAgICAgICAgIGNhc2UgR1Q6CisgICAgICAgICAgICAgICAgY2FzZSBHVEU6CisgICAgICAgICAgICAgICAgY2FzZSBMQU5EOgorICAgICAgICAgICAgICAgIGNhc2UgTEFORF9USEVOOgorICAgICAgICAgICAgICAgIGNhc2UgTE5PVDoKKyAgICAgICAgICAgICAgICBjYXNlIExPUjoKKyAgICAgICAgICAgICAgICBjYXNlIExPUl9FTFNFOgorICAgICAgICAgICAgICAgIGNhc2UgTFNISUZUOgorICAgICAgICAgICAgICAgIGNhc2UgTFRFOgorICAgICAgICAgICAgICAgIGNhc2UgTFRfOgorICAgICAgICAgICAgICAgIGNhc2UgTUlOVVM6CisgICAgICAgICAgICAgICAgY2FzZSBNT0Q6CisgICAgICAgICAgICAgICAgY2FzZSBORVFVQUw6CisgICAgICAgICAgICAgICAgY2FzZSBOU0VRVUFMOgorICAgICAgICAgICAgICAgIGNhc2UgT1BfQVNTSUdOX1RPUDoKKyAgICAgICAgICAgICAgICBjYXNlIE9QX1BPUDoKKyAgICAgICAgICAgICAgICBjYXNlIE9QX1BVU0g6CisgICAgICAgICAgICAgICAgY2FzZSBPUF9UT1A6CisgICAgICAgICAgICAgICAgY2FzZSBQTFVTOgorICAgICAgICAgICAgICAgIGNhc2UgUlNISUZUOgorICAgICAgICAgICAgICAgIGNhc2UgU0VRVUFMOgorICAgICAgICAgICAgICAgIGNhc2UgU1RBUjoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0NDIwPTM7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gNDIwOworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfaW52b2tlRXg7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDQyMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0ODI4Ojg6IGlkPSBJRAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBpZCA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTikgTUFUQ0hUKElELCAmRk9MTE9XX0lEX2luX3N0YXRlbWVudF9pbnZva2UxNjYxMik7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9pbnZva2VFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBhYworICAgICAgICAgICAgCSAgICAgICAgICAgIC0+YXBwZW5kKHNlcDo6UGFyc2VyVXRpbDo6Z2V0SW52b2thYmxlKHVlCisgICAgICAgICAgICAJICAgICAgICAgICAgLCBTVFIoKGlkLT5nZXRUZXh0KGlkKSktPmNoYXJzKSkpOyAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAyOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0ODI5Ojg6ICdpbicKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVCgyOTUsICZGT0xMT1dfMjk1X2luX3N0YXRlbWVudF9pbnZva2UxNjYzNCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9pbnZva2VFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBhYworICAgICAgICAgICAgCSAgICAgICAgICAgIC0+YXBwZW5kKCBJTkNSX0JGKE9QKElOKSkgKTsgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMzoKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDgzMDo4OiBvcD0gb3BfaW52b2thYmxlCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX29wX2ludm9rYWJsZV9pbl9zdGF0ZW1lbnRfaW52b2tlMTY2NTkpOworICAgICAgICAgICAgCSAgICAgICAgb3A9b3BfaW52b2thYmxlKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfaW52b2tlRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgYWMKKyAgICAgICAgICAgIAkgICAgICAgICAgICAtPmFwcGVuZCggSU5DUl9CRihvcAorICAgICAgICAgICAgCSAgICAgICAgICAgICkgKTsgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0ODMyOjY6IChlPSBleHByZXNzaW9uICkqCisKKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDQyMT0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCTk9UOgorICAgICAgICAgICAgICAgIGNhc2UgQ09MT054MjoKKyAgICAgICAgICAgICAgICBjYXNlIENoYXJMaXRlcmFsOgorICAgICAgICAgICAgICAgIGNhc2UgREVDUjoKKyAgICAgICAgICAgICAgICBjYXNlIERPTExBUl9MQ1VSTFk6CisgICAgICAgICAgICAgICAgY2FzZSBGbG9hdExpdGVyYWw6CisgICAgICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgICAgICAgICBjYXNlIElOQ1I6CisgICAgICAgICAgICAgICAgY2FzZSBJbnRlZ2VyTGl0ZXJhbDoKKyAgICAgICAgICAgICAgICBjYXNlIExCUkFDS0VUOgorICAgICAgICAgICAgICAgIGNhc2UgTEJSQUNLRVRfQkFSOgorICAgICAgICAgICAgICAgIGNhc2UgTENVUkxZOgorICAgICAgICAgICAgICAgIGNhc2UgTE5PVDoKKyAgICAgICAgICAgICAgICBjYXNlIExQQVJFTjoKKyAgICAgICAgICAgICAgICBjYXNlIExQQVJFTl9JTlZPS0U6CisgICAgICAgICAgICAgICAgY2FzZSBNSU5VUzoKKyAgICAgICAgICAgICAgICBjYXNlIE9QX1BPUDoKKyAgICAgICAgICAgICAgICBjYXNlIE9QX1RPUDoKKyAgICAgICAgICAgICAgICBjYXNlIFBFUkNFTlRfTENVUkxZOgorICAgICAgICAgICAgICAgIGNhc2UgUExVUzoKKyAgICAgICAgICAgICAgICBjYXNlIFJhdGlvbmFsTGl0ZXJhbDoKKyAgICAgICAgICAgICAgICBjYXNlIFN0cmluZ0xpdGVyYWw6CisgICAgICAgICAgICAgICAgY2FzZSAxNTg6CisgICAgICAgICAgICAgICAgY2FzZSAxNTk6CisgICAgICAgICAgICAgICAgY2FzZSAxNjA6CisgICAgICAgICAgICAgICAgY2FzZSAxNjE6CisgICAgICAgICAgICAgICAgY2FzZSAxNjI6CisgICAgICAgICAgICAgICAgY2FzZSAyMzc6CisgICAgICAgICAgICAgICAgY2FzZSAyNTY6CisgICAgICAgICAgICAgICAgY2FzZSAyNjU6CisgICAgICAgICAgICAgICAgY2FzZSAyNzc6CisgICAgICAgICAgICAgICAgY2FzZSAyODA6CisgICAgICAgICAgICAgICAgY2FzZSAyOTQ6CisgICAgICAgICAgICAgICAgY2FzZSAzMTM6CisgICAgICAgICAgICAgICAgY2FzZSAzMzA6CisgICAgICAgICAgICAgICAgY2FzZSAzMzE6CisgICAgICAgICAgICAgICAgY2FzZSAzMzI6CisgICAgICAgICAgICAgICAgY2FzZSAzNDM6CisgICAgICAgICAgICAgICAgY2FzZSAzNDc6CisgICAgICAgICAgICAgICAgY2FzZSAzNzI6CisgICAgICAgICAgICAgICAgY2FzZSAzOTc6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDQyMT0xOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ0MjEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDgzMjo4OiBlPSBleHByZXNzaW9uCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2ludm9rZTE2NjgwKTsKKyAgICAgICAgICAgIAkgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2ludm9rZUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIGFjCisgICAgICAgICAgICAJICAgICAgICAgICAgLT5hcHBlbmQoZQorICAgICAgICAgICAgCSAgICAgICAgICAgICk7IAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQ6CisgICAgICAgICAgICAJICAgIGdvdG8gbG9vcDQyMTsJLyogYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvb3A0MjE6IDsgLyogSnVtcCBvdXQgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0ODMzOjY6ICggJ3Byb3ZpZGVkOicgZT0gZXhwcmVzc2lvbiB8ICdmcm9tOicgdWU9IHVuYXJ5RXhwcmVzc2lvbiB8ICd0bzonIHVlPSB1bmFyeUV4cHJlc3Npb24gfCAnYWN0aXZpdHk6JyBvPSBvcF9hY3Rpdml0eSApPworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQ0MjI9NTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDM1NDoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQ0MjI9MTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDI4NzoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQ0MjI9MjsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDM5NDoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQ0MjI9MzsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDIzODoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQ0MjI9NDsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NDIyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ4MzM6ODogJ3Byb3ZpZGVkOicgZT0gZXhwcmVzc2lvbgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKDM1NCwgJkZPTExPV18zNTRfaW5fc3RhdGVtZW50X2ludm9rZTE2Njk4KTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2ludm9rZUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9pbnZva2UxNjcwNCk7CisgICAgICAgICAgICAJICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9pbnZva2VFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDgzNDo4OiAnZnJvbTonIHVlPSB1bmFyeUV4cHJlc3Npb24KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVCgyODcsICZGT0xMT1dfMjg3X2luX3N0YXRlbWVudF9pbnZva2UxNjcxMyk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9pbnZva2VFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfdW5hcnlFeHByZXNzaW9uX2luX3N0YXRlbWVudF9pbnZva2UxNjcyMyk7CisgICAgICAgICAgICAJICAgICAgICB1ZT11bmFyeUV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9pbnZva2VFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMzoKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDgzNTo4OiAndG86JyB1ZT0gdW5hcnlFeHByZXNzaW9uCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoMzk0LCAmRk9MTE9XXzM5NF9pbl9zdGF0ZW1lbnRfaW52b2tlMTY3MzIpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfaW52b2tlRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3VuYXJ5RXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfaW52b2tlMTY3NDQpOworICAgICAgICAgICAgCSAgICAgICAgdWU9dW5hcnlFeHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfaW52b2tlRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDQ6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ4MzY6ODogJ2FjdGl2aXR5Oicgbz0gb3BfYWN0aXZpdHkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVCgyMzgsICZGT0xMT1dfMjM4X2luX3N0YXRlbWVudF9pbnZva2UxNjc1Myk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9pbnZva2VFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfb3BfYWN0aXZpdHlfaW5fc3RhdGVtZW50X2ludm9rZTE2NzU5KTsKKyAgICAgICAgICAgIAkgICAgICAgIG89b3BfYWN0aXZpdHkoY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9pbnZva2VFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgTUFUQ0hUKFJQQVJFTiwgJkZPTExPV19SUEFSRU5faW5fc3RhdGVtZW50X2ludm9rZTE2NzcyKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2ludm9rZUV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgTUFUQ0hUKFNFTUksICZGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfaW52b2tlMTY3NzcpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfaW52b2tlRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlc3RhdGVtZW50X2ludm9rZUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZXN0YXRlbWVudF9pbnZva2VFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDE3OSwgc3RhdGVtZW50X2ludm9rZV9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIGFjOworfQorLyogJEFOVExSIGVuZCBzdGF0ZW1lbnRfaW52b2tlICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGV4cHJlc3Npb25faW52b2tlCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0ODQyOjE6IGV4cHJlc3Npb25faW52b2tlIHJldHVybnMgWyBzZXA6OkJGQ29kZSBhYyBdIDogTFBBUkVOX0lOVk9LRSBlPSB1bmFyeUV4cHJlc3Npb24gKGlkPSBJRCB8ICdpbicgfG9wPSBvcF9pbnZva2FibGUgKSAoZT0gZXhwcmVzc2lvbiApKiAoICdwcm92aWRlZDonIGU9IGV4cHJlc3Npb24gfCAnZnJvbTonIHVlPSB1bmFyeUV4cHJlc3Npb24gfCAndG86JyB1ZT0gdW5hcnlFeHByZXNzaW9uIHwgJ2FjdGl2aXR5Oicgbz0gb3BfYWN0aXZpdHkgKT8gUlBBUkVOIDsKKyAqLworc3RhdGljIHNlcDo6QkZDb2RlCitleHByZXNzaW9uX2ludm9rZShwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBzZXA6OkJGQ29kZSBhYzsKKworICAgIEFOVExSM19VSU5UMzIgZXhwcmVzc2lvbl9pbnZva2VfU3RhcnRJbmRleDsKKworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIGlkOworICAgIHNlcDo6QkYgZTsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfZQorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfZSBzZXA6OkJGCisKKyAgICBzZXA6Ok9wZXJhdG9yICogb3A7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX29wCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9vcCBzZXA6Ok9wZXJhdG9yICoKKworICAgIHNlcDo6QkYgdWU7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX3VlCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV91ZSBzZXA6OkJGCisKKyAgICBzZXA6Ok9wZXJhdG9yICogbzsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfbworICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfbyBzZXA6Ok9wZXJhdG9yICoKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBleHByZXNzaW9uX2ludm9rZV9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgxODApKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIGFjOworICAgIH0KKworICAgIGlkICAgICAgID0gTlVMTDsKKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDg0NDoyOiAoIExQQVJFTl9JTlZPS0UgZT0gdW5hcnlFeHByZXNzaW9uIChpZD0gSUQgfCAnaW4nIHxvcD0gb3BfaW52b2thYmxlICkgKGU9IGV4cHJlc3Npb24gKSogKCAncHJvdmlkZWQ6JyBlPSBleHByZXNzaW9uIHwgJ2Zyb206JyB1ZT0gdW5hcnlFeHByZXNzaW9uIHwgJ3RvOicgdWU9IHVuYXJ5RXhwcmVzc2lvbiB8ICdhY3Rpdml0eTonIG89IG9wX2FjdGl2aXR5ICk/IFJQQVJFTiApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ4NDQ6NDogTFBBUkVOX0lOVk9LRSBlPSB1bmFyeUV4cHJlc3Npb24gKGlkPSBJRCB8ICdpbicgfG9wPSBvcF9pbnZva2FibGUgKSAoZT0gZXhwcmVzc2lvbiApKiAoICdwcm92aWRlZDonIGU9IGV4cHJlc3Npb24gfCAnZnJvbTonIHVlPSB1bmFyeUV4cHJlc3Npb24gfCAndG86JyB1ZT0gdW5hcnlFeHByZXNzaW9uIHwgJ2FjdGl2aXR5Oicgbz0gb3BfYWN0aXZpdHkgKT8gUlBBUkVOCisgICAgICAgIHsKKyAgICAgICAgICAgICBNQVRDSFQoTFBBUkVOX0lOVk9LRSwgJkZPTExPV19MUEFSRU5fSU5WT0tFX2luX2V4cHJlc3Npb25faW52b2tlMTY3OTIpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVleHByZXNzaW9uX2ludm9rZUV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fZXhwcmVzc2lvbl9pbnZva2UxNjgwMSk7CisgICAgICAgICAgICBlPXVuYXJ5RXhwcmVzc2lvbihjdHgpOworCisgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbl9pbnZva2VFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBhYz0gTkVXX1NUTVQxKE9QKElOVk9LRV9NRVRIT0QpLCAKKyAgICAgICAgICAgICAgICBlCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDg0Njo2OiAoaWQ9IElEIHwgJ2luJyB8b3A9IG9wX2ludm9rYWJsZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDQyMz0zOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0NDIzPTE7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOTU6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDQyMz0yOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQVNTSUdOOgorICAgICAgICAgICAgICAgIGNhc2UgQVNTSUdOX0FGVEVSOgorICAgICAgICAgICAgICAgIGNhc2UgQVNTSUdOX01BQ1JPOgorICAgICAgICAgICAgICAgIGNhc2UgQVNTSUdOX1JFRjoKKyAgICAgICAgICAgICAgICBjYXNlIEJBTkQ6CisgICAgICAgICAgICAgICAgY2FzZSBCTk9UOgorICAgICAgICAgICAgICAgIGNhc2UgQk9SOgorICAgICAgICAgICAgICAgIGNhc2UgQlhPUjoKKyAgICAgICAgICAgICAgICBjYXNlIERJVjoKKyAgICAgICAgICAgICAgICBjYXNlIEVRVUFMOgorICAgICAgICAgICAgICAgIGNhc2UgR1Q6CisgICAgICAgICAgICAgICAgY2FzZSBHVEU6CisgICAgICAgICAgICAgICAgY2FzZSBMQU5EOgorICAgICAgICAgICAgICAgIGNhc2UgTEFORF9USEVOOgorICAgICAgICAgICAgICAgIGNhc2UgTE5PVDoKKyAgICAgICAgICAgICAgICBjYXNlIExPUjoKKyAgICAgICAgICAgICAgICBjYXNlIExPUl9FTFNFOgorICAgICAgICAgICAgICAgIGNhc2UgTFNISUZUOgorICAgICAgICAgICAgICAgIGNhc2UgTFRFOgorICAgICAgICAgICAgICAgIGNhc2UgTFRfOgorICAgICAgICAgICAgICAgIGNhc2UgTUlOVVM6CisgICAgICAgICAgICAgICAgY2FzZSBNT0Q6CisgICAgICAgICAgICAgICAgY2FzZSBORVFVQUw6CisgICAgICAgICAgICAgICAgY2FzZSBOU0VRVUFMOgorICAgICAgICAgICAgICAgIGNhc2UgT1BfQVNTSUdOX1RPUDoKKyAgICAgICAgICAgICAgICBjYXNlIE9QX1BPUDoKKyAgICAgICAgICAgICAgICBjYXNlIE9QX1BVU0g6CisgICAgICAgICAgICAgICAgY2FzZSBPUF9UT1A6CisgICAgICAgICAgICAgICAgY2FzZSBQTFVTOgorICAgICAgICAgICAgICAgIGNhc2UgUlNISUZUOgorICAgICAgICAgICAgICAgIGNhc2UgU0VRVUFMOgorICAgICAgICAgICAgICAgIGNhc2UgU1RBUjoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0NDIzPTM7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gNDIzOworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgICAgICBnb3RvIHJ1bGVleHByZXNzaW9uX2ludm9rZUV4OworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ0MjMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDg0Njo4OiBpZD0gSUQKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgaWQgPSAocEFOVExSM19DT01NT05fVE9LRU4pIE1BVENIVChJRCwgJkZPTExPV19JRF9pbl9leHByZXNzaW9uX2ludm9rZTE2ODE1KTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbl9pbnZva2VFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBhYworICAgICAgICAgICAgCSAgICAgICAgICAgIC0+YXBwZW5kKHNlcDo6UGFyc2VyVXRpbDo6Z2V0SW52b2thYmxlKGUKKyAgICAgICAgICAgIAkgICAgICAgICAgICAsIFNUUigoaWQtPmdldFRleHQoaWQpKS0+Y2hhcnMpKSk7IAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDI6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ4NDc6ODogJ2luJworICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKDI5NSwgJkZPTExPV18yOTVfaW5fZXhwcmVzc2lvbl9pbnZva2UxNjgzNyk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25faW52b2tlRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgYWMKKyAgICAgICAgICAgIAkgICAgICAgICAgICAtPmFwcGVuZCggSU5DUl9CRihPUChJTikpICk7IAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDM6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ4NDg6ODogb3A9IG9wX2ludm9rYWJsZQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19vcF9pbnZva2FibGVfaW5fZXhwcmVzc2lvbl9pbnZva2UxNjg2Mik7CisgICAgICAgICAgICAJICAgICAgICBvcD1vcF9pbnZva2FibGUoY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25faW52b2tlRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgYWMKKyAgICAgICAgICAgIAkgICAgICAgICAgICAtPmFwcGVuZCggSU5DUl9CRihvcAorICAgICAgICAgICAgCSAgICAgICAgICAgICkgKTsgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0ODUwOjY6IChlPSBleHByZXNzaW9uICkqCisKKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDQyND0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCTk9UOgorICAgICAgICAgICAgICAgIGNhc2UgQ09MT054MjoKKyAgICAgICAgICAgICAgICBjYXNlIENoYXJMaXRlcmFsOgorICAgICAgICAgICAgICAgIGNhc2UgREVDUjoKKyAgICAgICAgICAgICAgICBjYXNlIERPTExBUl9MQ1VSTFk6CisgICAgICAgICAgICAgICAgY2FzZSBGbG9hdExpdGVyYWw6CisgICAgICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgICAgICAgICBjYXNlIElOQ1I6CisgICAgICAgICAgICAgICAgY2FzZSBJbnRlZ2VyTGl0ZXJhbDoKKyAgICAgICAgICAgICAgICBjYXNlIExCUkFDS0VUOgorICAgICAgICAgICAgICAgIGNhc2UgTEJSQUNLRVRfQkFSOgorICAgICAgICAgICAgICAgIGNhc2UgTENVUkxZOgorICAgICAgICAgICAgICAgIGNhc2UgTE5PVDoKKyAgICAgICAgICAgICAgICBjYXNlIExQQVJFTjoKKyAgICAgICAgICAgICAgICBjYXNlIExQQVJFTl9JTlZPS0U6CisgICAgICAgICAgICAgICAgY2FzZSBNSU5VUzoKKyAgICAgICAgICAgICAgICBjYXNlIE9QX1BPUDoKKyAgICAgICAgICAgICAgICBjYXNlIE9QX1RPUDoKKyAgICAgICAgICAgICAgICBjYXNlIFBFUkNFTlRfTENVUkxZOgorICAgICAgICAgICAgICAgIGNhc2UgUExVUzoKKyAgICAgICAgICAgICAgICBjYXNlIFJhdGlvbmFsTGl0ZXJhbDoKKyAgICAgICAgICAgICAgICBjYXNlIFN0cmluZ0xpdGVyYWw6CisgICAgICAgICAgICAgICAgY2FzZSAxNTg6CisgICAgICAgICAgICAgICAgY2FzZSAxNTk6CisgICAgICAgICAgICAgICAgY2FzZSAxNjA6CisgICAgICAgICAgICAgICAgY2FzZSAxNjE6CisgICAgICAgICAgICAgICAgY2FzZSAxNjI6CisgICAgICAgICAgICAgICAgY2FzZSAyMzc6CisgICAgICAgICAgICAgICAgY2FzZSAyNTY6CisgICAgICAgICAgICAgICAgY2FzZSAyNjU6CisgICAgICAgICAgICAgICAgY2FzZSAyNzc6CisgICAgICAgICAgICAgICAgY2FzZSAyODA6CisgICAgICAgICAgICAgICAgY2FzZSAyOTQ6CisgICAgICAgICAgICAgICAgY2FzZSAzMTM6CisgICAgICAgICAgICAgICAgY2FzZSAzMzA6CisgICAgICAgICAgICAgICAgY2FzZSAzMzE6CisgICAgICAgICAgICAgICAgY2FzZSAzMzI6CisgICAgICAgICAgICAgICAgY2FzZSAzNDM6CisgICAgICAgICAgICAgICAgY2FzZSAzNDc6CisgICAgICAgICAgICAgICAgY2FzZSAzNzI6CisgICAgICAgICAgICAgICAgY2FzZSAzOTc6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDQyND0xOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ0MjQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDg1MDo4OiBlPSBleHByZXNzaW9uCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbl9pbnZva2UxNjg4Myk7CisgICAgICAgICAgICAJICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25faW52b2tlRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgYWMKKyAgICAgICAgICAgIAkgICAgICAgICAgICAtPmFwcGVuZChlCisgICAgICAgICAgICAJICAgICAgICAgICAgKTsgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdDoKKyAgICAgICAgICAgIAkgICAgZ290byBsb29wNDI0OwkvKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgKi8KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9vcDQyNDogOyAvKiBKdW1wIG91dCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ4NTE6NjogKCAncHJvdmlkZWQ6JyBlPSBleHByZXNzaW9uIHwgJ2Zyb206JyB1ZT0gdW5hcnlFeHByZXNzaW9uIHwgJ3RvOicgdWU9IHVuYXJ5RXhwcmVzc2lvbiB8ICdhY3Rpdml0eTonIG89IG9wX2FjdGl2aXR5ICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDQyNT01OworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzU0OgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDQyNT0xOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjg3OgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDQyNT0yOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzk0OgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDQyNT0zOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjM4OgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDQyNT00OworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ0MjUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDg1MTo4OiAncHJvdmlkZWQ6JyBlPSBleHByZXNzaW9uCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoMzU0LCAmRk9MTE9XXzM1NF9pbl9leHByZXNzaW9uX2ludm9rZTE2OTAxKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbl9pbnZva2VFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uX2ludm9rZTE2OTA3KTsKKyAgICAgICAgICAgIAkgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbl9pbnZva2VFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDg1Mjo4OiAnZnJvbTonIHVlPSB1bmFyeUV4cHJlc3Npb24KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVCgyODcsICZGT0xMT1dfMjg3X2luX2V4cHJlc3Npb25faW52b2tlMTY5MTYpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleHByZXNzaW9uX2ludm9rZUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fZXhwcmVzc2lvbl9pbnZva2UxNjkyNSk7CisgICAgICAgICAgICAJICAgICAgICB1ZT11bmFyeUV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25faW52b2tlRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDM6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ4NTM6ODogJ3RvOicgdWU9IHVuYXJ5RXhwcmVzc2lvbgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKDM5NCwgJkZPTExPV18zOTRfaW5fZXhwcmVzc2lvbl9pbnZva2UxNjkzNCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25faW52b2tlRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3VuYXJ5RXhwcmVzc2lvbl9pbl9leHByZXNzaW9uX2ludm9rZTE2OTQ1KTsKKyAgICAgICAgICAgIAkgICAgICAgIHVlPXVuYXJ5RXhwcmVzc2lvbihjdHgpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbl9pbnZva2VFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgNDoKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDg1NDo4OiAnYWN0aXZpdHk6JyBvPSBvcF9hY3Rpdml0eQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKDIzOCwgJkZPTExPV18yMzhfaW5fZXhwcmVzc2lvbl9pbnZva2UxNjk1NCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25faW52b2tlRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX29wX2FjdGl2aXR5X2luX2V4cHJlc3Npb25faW52b2tlMTY5NjApOworICAgICAgICAgICAgCSAgICAgICAgbz1vcF9hY3Rpdml0eShjdHgpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbl9pbnZva2VFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgTUFUQ0hUKFJQQVJFTiwgJkZPTExPV19SUEFSRU5faW5fZXhwcmVzc2lvbl9pbnZva2UxNjk3Myk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25faW52b2tlRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlZXhwcmVzc2lvbl9pbnZva2VFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVleHByZXNzaW9uX2ludm9rZUV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTgwLCBleHByZXNzaW9uX2ludm9rZV9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIGFjOworfQorLyogJEFOVExSIGVuZCBleHByZXNzaW9uX2ludm9rZSAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBzdGF0ZW1lbnRfYWN0aXZpdHlfbmV3CisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0ODY0OjE6IHN0YXRlbWVudF9hY3Rpdml0eV9uZXcgcmV0dXJucyBbIHNlcDo6QkZDb2RlIGFjIF0gOiAnbmV3JyBpZD0gcXVhbGlmaWVkTmFtZUlEIGRlY2xfaW5zdGFuY2VfZHluYW1pY19pbXBsWyBfQ1BNXyAsIHB0ckluc3RhbmNlIF0gKCAoICctLT4nIHwgJ3JldHVybnM6JyApIGU9IGV4cHJlc3Npb24gKT8gU0VNSSA7CisgKi8KK3N0YXRpYyBzZXA6OkJGQ29kZQorc3RhdGVtZW50X2FjdGl2aXR5X25ldyhwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBzZXA6OkJGQ29kZSBhYzsKKworICAgIEFOVExSM19VSU5UMzIgc3RhdGVtZW50X2FjdGl2aXR5X25ld19TdGFydEluZGV4OworCisgICAgZm1sUGFyc2VyX3F1YWxpZmllZE5hbWVJRF9yZXR1cm4gaWQ7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2lkCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9pZCBmbWxQYXJzZXJfcXVhbGlmaWVkTmFtZUlEX3JldHVybgorCisgICAgc2VwOjpCRiBlOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9lCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9lIHNlcDo6QkYKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBzdGF0ZW1lbnRfYWN0aXZpdHlfbmV3X1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKworICAgIAlzZXA6Ok1hY2hpbmUgKiBwdHJJbnN0YW5jZSA9IE5VTEw7CisgICAgCXNlcDo6QkYgYU1vZGVsOworICAgIAkKKyAgICAJc2VwOjpNYWNoaW5lICogY29udGFpbmVyID0gX0NQTV87CisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDE4MSkpICkKKyAgICB7CisgICAgICAgIHsKKworICAgICAgICAgICAgCWlmKCBhTW9kZWwuaXM8IHNlcDo6TWFjaGluZSA+KCkgKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJUE9QX0NUWDsKKyAgICAgICAgICAgIAl9CisKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIGFjOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDg3ODoyOiAoICduZXcnIGlkPSBxdWFsaWZpZWROYW1lSUQgZGVjbF9pbnN0YW5jZV9keW5hbWljX2ltcGxbIF9DUE1fICwgcHRySW5zdGFuY2UgXSAoICggJy0tPicgfCAncmV0dXJuczonICkgZT0gZXhwcmVzc2lvbiApPyBTRU1JICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDg3ODo0OiAnbmV3JyBpZD0gcXVhbGlmaWVkTmFtZUlEIGRlY2xfaW5zdGFuY2VfZHluYW1pY19pbXBsWyBfQ1BNXyAsIHB0ckluc3RhbmNlIF0gKCAoICctLT4nIHwgJ3JldHVybnM6JyApIGU9IGV4cHJlc3Npb24gKT8gU0VNSQorICAgICAgICB7CisgICAgICAgICAgICAgTUFUQ0hUKDMzMCwgJkZPTExPV18zMzBfaW5fc3RhdGVtZW50X2FjdGl2aXR5X25ldzE3MDAxKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2FjdGl2aXR5X25ld0V4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIGFjPSBORVdfU1RNVChPUChJTlZPS0VfTkVXKSk7CisgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9zdGF0ZW1lbnRfYWN0aXZpdHlfbmV3MTcwMTIpOworICAgICAgICAgICAgaWQ9cXVhbGlmaWVkTmFtZUlEKGN0eCk7CisKKyAgICAgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfYWN0aXZpdHlfbmV3RXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIAkgIAlhTW9kZWwgPSBzZXA6OlBhcnNlclV0aWw6OmdldHZhck1hY2hpbmUoaWQucworICAgICAgICAgICAgICAgICwgaWQubmIKKyAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAgICAgCSAgCWlmKCBhTW9kZWwuaXM8IHNlcDo6TWFjaGluZSA+KCkgKQorICAgICAgICAgICAgICAgIAkgIAl7CisgICAgICAgICAgICAgICAgCSAgCQlQVVNIX0NUWF9ORVcoIGFNb2RlbC50b19wdHI8IHNlcDo6TWFjaGluZSA+KCkgKTsKKyAgICAgICAgICAgICAgICAJICAJfQorCisgICAgICAgICAgICAgICAgCSAgCXB0ckluc3RhbmNlID0gc2VwOjpNYWNoaW5lOjpuZXdJbnN0YW5jZShjb250YWluZXIsCisgICAgICAgICAgICAgICAgCSAgCQkJbmV3SW52b2tlTmV3SW5zdGFuY2VOYW1lSUQoY29udGFpbmVyLCBpZC5zCisgICAgICAgICAgICAgICAgKSwgYU1vZGVsLCAxLCAxKTsKKworICAgICAgICAgICAgICAgIAkJcHRySW5zdGFuY2UtPmdldHdTcGVjaWZpZXIoKS5vdmVycmlkZV9pZmRlZigKKyAgICAgICAgICAgICAgICAJCQkJc2VwOjpTcGVjaWZpZXI6OkRFU0lHTl9JTlNUQU5DRV9EWU5BTUlDX1NQRUNJRklFUiApOworCisgICAgICAgICAgICAgICAgCSAgCSBhYworICAgICAgICAgICAgICAgIC0+YXBwZW5kKCBjb250YWluZXItPnNhdmVPd25lZEVsZW1lbnQoIHB0ckluc3RhbmNlICkgKTsKKyAgICAgICAgICAgICAgICAJICAKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWNsX2luc3RhbmNlX2R5bmFtaWNfaW1wbF9pbl9zdGF0ZW1lbnRfYWN0aXZpdHlfbmV3MTcwMjcpOworICAgICAgICAgICAgZGVjbF9pbnN0YW5jZV9keW5hbWljX2ltcGwoY3R4LCBfQ1BNXywgcHRySW5zdGFuY2UpOworCisgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2FjdGl2aXR5X25ld0V4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0OTAwOjQ6ICggKCAnLS0+JyB8ICdyZXR1cm5zOicgKSBlPSBleHByZXNzaW9uICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDQyNj0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTYzOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM2NToKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQ0MjY9MTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NDI2KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ5MDA6NjogKCAnLS0+JyB8ICdyZXR1cm5zOicgKSBlPSBleHByZXNzaW9uCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggTEEoMSkgPT0gMTYzIHx8IExBKDEpID09IDM2NSApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgQ09OU1VNRSgpOworICAgICAgICAgICAgCSAgICAgICAgICAgIFBFUlJPUlJFQ09WRVJZPUFOVExSM19GQUxTRTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBGQUlMRURGTEFHPUFOVExSM19GQUxTRTsKKworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgZWxzZQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfRVhDRVBUSU9OOworICAgICAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+bmFtZSAgICAgICAgID0gKHZvaWQgKilBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfTkFNRTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPmV4cGVjdGluZ1NldCA9IE5VTEw7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfYWN0aXZpdHlfbmV3RXg7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfYWN0aXZpdHlfbmV3MTcwNDgpOworICAgICAgICAgICAgCSAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfYWN0aXZpdHlfbmV3RXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgIE1BVENIVChTRU1JLCAmRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2FjdGl2aXR5X25ldzE3MDYwKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2FjdGl2aXR5X25ld0V4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZXN0YXRlbWVudF9hY3Rpdml0eV9uZXdFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVzdGF0ZW1lbnRfYWN0aXZpdHlfbmV3RXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIAlpZiggYU1vZGVsLmlzPCBzZXA6Ok1hY2hpbmUgPigpICkKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlQT1BfQ1RYOworICAgICAgICAgICAgICAgICAgICAJfQorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisKKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDE4MSwgc3RhdGVtZW50X2FjdGl2aXR5X25ld19TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIGFjOworfQorLyogJEFOVExSIGVuZCBzdGF0ZW1lbnRfYWN0aXZpdHlfbmV3ICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGRlY2xfaW5zdGFuY2VfZHluYW1pY19pbXBsCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0OTA2OjE6IGRlY2xfaW5zdGFuY2VfZHluYW1pY19pbXBsWyBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIgLCBzZXA6Ok1hY2hpbmUgKiBwdHJJbnN0YW5jZSBdIDogKCAoIExQQVJFTiApPT4gTFBBUkVOICggZGVmX2luc3RhbmNlX29uX25ld19hY3Rpdml0eVsgcHRySW5zdGFuY2UgXSApPyBSUEFSRU4gKT8gKCAoIExDVVJMWSApPT4gTENVUkxZIChzPSBzdGF0ZW1lbnQgKSogKCBkZWZfaW5zdGFuY2VfYWN0aXZpdHlbIHB0ckluc3RhbmNlIF0gKSogUkNVUkxZICk/IDsKKyAqLworc3RhdGljIHZvaWQKK2RlY2xfaW5zdGFuY2VfZHluYW1pY19pbXBsKHBmbWxQYXJzZXIgY3R4LCBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIsIHNlcDo6TWFjaGluZSAqIHB0ckluc3RhbmNlKQoreworICAgIEFOVExSM19VSU5UMzIgZGVjbF9pbnN0YW5jZV9keW5hbWljX2ltcGxfU3RhcnRJbmRleDsKKworICAgIHNlcDo6QkZDb2RlIHM7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX3MKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX3Mgc2VwOjpCRkNvZGUKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBkZWNsX2luc3RhbmNlX2R5bmFtaWNfaW1wbF9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisKKyAgICAJU0FWRV9SVUxFX0JFR0lOX0xPQ0FUSU9OOworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgxODIpKSApCisgICAgeworICAgICAgICB7CisKKyAgICAgICAgICAgIAlTRVRfUlVMRV9MT0NBVElPTihwdHJJbnN0YW5jZSk7CisKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ5MTQ6MjogKCAoICggTFBBUkVOICk9PiBMUEFSRU4gKCBkZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5WyBwdHJJbnN0YW5jZSBdICk/IFJQQVJFTiApPyAoICggTENVUkxZICk9PiBMQ1VSTFkgKHM9IHN0YXRlbWVudCApKiAoIGRlZl9pbnN0YW5jZV9hY3Rpdml0eVsgcHRySW5zdGFuY2UgXSApKiBSQ1VSTFkgKT8gKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0OTE0OjQ6ICggKCBMUEFSRU4gKT0+IExQQVJFTiAoIGRlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlbIHB0ckluc3RhbmNlIF0gKT8gUlBBUkVOICk/ICggKCBMQ1VSTFkgKT0+IExDVVJMWSAocz0gc3RhdGVtZW50ICkqICggZGVmX2luc3RhbmNlX2FjdGl2aXR5WyBwdHJJbnN0YW5jZSBdICkqIFJDVVJMWSApPworICAgICAgICB7CisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0OTE0OjQ6ICggKCBMUEFSRU4gKT0+IExQQVJFTiAoIGRlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlbIHB0ckluc3RhbmNlIF0gKT8gUlBBUkVOICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDQyOD0yOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBNDI4XzAgPSBMQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDgwMl9mbWwoY3R4KSkgJiYgKExBNDI4XzAgPT0gTFBBUkVOKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0NDI4PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ0MjgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDkxNDo2OiAoIExQQVJFTiApPT4gTFBBUkVOICggZGVmX2luc3RhbmNlX29uX25ld19hY3Rpdml0eVsgcHRySW5zdGFuY2UgXSApPyBSUEFSRU4KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChMUEFSRU4sICZGT0xMT1dfTFBBUkVOX2luX2RlY2xfaW5zdGFuY2VfZHluYW1pY19pbXBsMTcwOTMpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX2luc3RhbmNlX2R5bmFtaWNfaW1wbEV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDkxNTo2OiAoIGRlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlbIHB0ckluc3RhbmNlIF0gKT8KKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0NDI3PTI7CisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBCTk9UOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIENPTE9OeDI6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgQ2hhckxpdGVyYWw6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgREVDUjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBET0xMQVJfTENVUkxZOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIEZsb2F0TGl0ZXJhbDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBJTkNSOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIEludGVnZXJMaXRlcmFsOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIExCUkFDS0VUOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIExCUkFDS0VUX0JBUjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBMQ1VSTFk6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgTE5PVDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBMUEFSRU46CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgTFBBUkVOX0lOVk9LRToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBNSU5VUzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBPUF9QT1A6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgT1BfVE9QOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIFBFUkNFTlRfTENVUkxZOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIFBMVVM6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgUmF0aW9uYWxMaXRlcmFsOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIFN0cmluZ0xpdGVyYWw6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMTU4OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDE1OToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAxNjA6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMTYxOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDE2MjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAyMzc6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMjU2OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDI2NToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAyNzc6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMjgwOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDI5NDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzMTM6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzMwOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDMzMToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzMzI6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzQzOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDM0NzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzNzI6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzk3OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJCWFsdDQyNz0xOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQ0MjcpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDkxNTo4OiBkZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5WyBwdHJJbnN0YW5jZSBdCisgICAgICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlfaW5fZGVjbF9pbnN0YW5jZV9keW5hbWljX2ltcGwxNzEwMik7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBkZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5KGN0eCwgcHRySW5zdGFuY2UpOworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVjbF9pbnN0YW5jZV9keW5hbWljX2ltcGxFeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChSUEFSRU4sICZGT0xMT1dfUlBBUkVOX2luX2RlY2xfaW5zdGFuY2VfZHluYW1pY19pbXBsMTcxMTQpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX2luc3RhbmNlX2R5bmFtaWNfaW1wbEV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0OTE5OjQ6ICggKCBMQ1VSTFkgKT0+IExDVVJMWSAocz0gc3RhdGVtZW50ICkqICggZGVmX2luc3RhbmNlX2FjdGl2aXR5WyBwdHJJbnN0YW5jZSBdICkqIFJDVVJMWSApPworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQ0MzE9MjsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTQzMV8wID0gTEEoMSk7CisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQ4MDRfZm1sKGN0eCkpICYmIChMQTQzMV8wID09IExDVVJMWSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDQzMT0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NDMxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ5MTk6NjogKCBMQ1VSTFkgKT0+IExDVVJMWSAocz0gc3RhdGVtZW50ICkqICggZGVmX2luc3RhbmNlX2FjdGl2aXR5WyBwdHJJbnN0YW5jZSBdICkqIFJDVVJMWQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKExDVVJMWSwgJkZPTExPV19MQ1VSTFlfaW5fZGVjbF9pbnN0YW5jZV9keW5hbWljX2ltcGwxNzEzNik7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWRlY2xfaW5zdGFuY2VfZHluYW1pY19pbXBsRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0OTIwOjY6IChzPSBzdGF0ZW1lbnQgKSoKKworICAgICAgICAgICAgCSAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0NDI5PTI7CisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIENPTE9OeDI6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBERUNSOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgRE9MTEFSX0xDVVJMWToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIElEOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgSU5DUjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIExDVVJMWToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIExQQVJFTl9JTlZPS0U6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBTVEFURU1FTlRfUFJPTVBUOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMTU0OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMTU1OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMTU2OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMTU3OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjM2OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjQ3OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjUwOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjU2OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjYzOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjY3OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjY4OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjY5OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjc1OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjc4OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjc5OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjgyOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjg1OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjg5OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjkwOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjkxOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjkyOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjkzOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjk0OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjk2OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjk5OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzAwOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzAxOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzAyOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzAzOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzA0OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzA1OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzEyOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzMwOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzM2OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzM3OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzM4OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzM5OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzQwOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzQxOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzYyOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzYzOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzY0OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzY4OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzY5OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzcxOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzc3OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzg1OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzg2OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzg5OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzkxOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgNDE1OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgNDE2OgorICAgICAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQlhbHQ0Mjk9MTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0NDI5KQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ5MjA6ODogcz0gc3RhdGVtZW50CisgICAgICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3N0YXRlbWVudF9pbl9kZWNsX2luc3RhbmNlX2R5bmFtaWNfaW1wbDE3MTQ3KTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHM9c3RhdGVtZW50KGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX2luc3RhbmNlX2R5bmFtaWNfaW1wbEV4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+Z2V0VW5pcUJlaGF2aW9yUGFydCgpLT5zZXFPbkNyZWF0ZShzCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgKTsgCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAJZGVmYXVsdDoKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgZ290byBsb29wNDI5OwkvKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgKi8KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgbG9vcDQyOTogOyAvKiBKdW1wIG91dCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworCisKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ5MjI6NjogKCBkZWZfaW5zdGFuY2VfYWN0aXZpdHlbIHB0ckluc3RhbmNlIF0gKSoKKworICAgICAgICAgICAgCSAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0NDMwPTI7CisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDE3NzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDIyNjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJYWx0NDMwPTE7CisgICAgICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDQzMCkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0OTIyOjg6IGRlZl9pbnN0YW5jZV9hY3Rpdml0eVsgcHRySW5zdGFuY2UgXQorICAgICAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfaW5zdGFuY2VfYWN0aXZpdHlfaW5fZGVjbF9pbnN0YW5jZV9keW5hbWljX2ltcGwxNzE2Mik7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBkZWZfaW5zdGFuY2VfYWN0aXZpdHkoY3R4LCBwdHJJbnN0YW5jZSk7CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVkZWNsX2luc3RhbmNlX2R5bmFtaWNfaW1wbEV4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAJZGVmYXVsdDoKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgZ290byBsb29wNDMwOwkvKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgKi8KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgbG9vcDQzMDogOyAvKiBKdW1wIG91dCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworCisKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoUkNVUkxZLCAmRk9MTE9XX1JDVVJMWV9pbl9kZWNsX2luc3RhbmNlX2R5bmFtaWNfaW1wbDE3MTczKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZGVjbF9pbnN0YW5jZV9keW5hbWljX2ltcGxFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVkZWNsX2luc3RhbmNlX2R5bmFtaWNfaW1wbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZWRlY2xfaW5zdGFuY2VfZHluYW1pY19pbXBsRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIAlTRVRfUlVMRV9MT0NBVElPTihwdHJJbnN0YW5jZSk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKworICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTgyLCBkZWNsX2luc3RhbmNlX2R5bmFtaWNfaW1wbF9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgZGVjbF9pbnN0YW5jZV9keW5hbWljX2ltcGwgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgZXhwcmVzc2lvbl9hY3Rpdml0eV9uZXcKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ5Mjk6MTogZXhwcmVzc2lvbl9hY3Rpdml0eV9uZXcgcmV0dXJucyBbIHNlcDo6QkZDb2RlIGFjIF0gOiAnbmV3JyBpZD0gcXVhbGlmaWVkTmFtZUlEIGFjdGl2aXR5X21hY2hpbmVfcGFyYW1fcmV0dXJuWyBhTW9kZWwgLCBhYyBdIDsKKyAqLworc3RhdGljIHNlcDo6QkZDb2RlCitleHByZXNzaW9uX2FjdGl2aXR5X25ldyhwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBzZXA6OkJGQ29kZSBhYzsKKworICAgIEFOVExSM19VSU5UMzIgZXhwcmVzc2lvbl9hY3Rpdml0eV9uZXdfU3RhcnRJbmRleDsKKworICAgIGZtbFBhcnNlcl9xdWFsaWZpZWROYW1lSURfcmV0dXJuIGlkOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9pZAorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfaWQgZm1sUGFyc2VyX3F1YWxpZmllZE5hbWVJRF9yZXR1cm4KKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBleHByZXNzaW9uX2FjdGl2aXR5X25ld19TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisKKyAgICAJc2VwOjpNYWNoaW5lICogcHRySW5zdGFuY2UgPSBOVUxMOworICAgIAlzZXA6OkJGIGFNb2RlbDsKKyAgICAJCisgICAgCXNlcDo6TWFjaGluZSAqIGNvbnRhaW5lciA9IF9DUE1fOworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgxODMpKSApCisgICAgeworICAgICAgICB7CisKKyAgICAgICAgICAgIAlpZiggYU1vZGVsLmlzPCBzZXA6Ok1hY2hpbmUgPigpICkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCVBPUF9DVFg7CisgICAgICAgICAgICAJfQorCisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiBhYzsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ5NDM6MjogKCAnbmV3JyBpZD0gcXVhbGlmaWVkTmFtZUlEIGFjdGl2aXR5X21hY2hpbmVfcGFyYW1fcmV0dXJuWyBhTW9kZWwgLCBhYyBdICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDk0Mzo0OiAnbmV3JyBpZD0gcXVhbGlmaWVkTmFtZUlEIGFjdGl2aXR5X21hY2hpbmVfcGFyYW1fcmV0dXJuWyBhTW9kZWwgLCBhYyBdCisgICAgICAgIHsKKyAgICAgICAgICAgICBNQVRDSFQoMzMwLCAmRk9MTE9XXzMzMF9pbl9leHByZXNzaW9uX2FjdGl2aXR5X25ldzE3MjA0KTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbl9hY3Rpdml0eV9uZXdFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBhYz0gTkVXX1NUTVQoT1AoSU5WT0tFX05FVykpOworICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fZXhwcmVzc2lvbl9hY3Rpdml0eV9uZXcxNzIxNik7CisgICAgICAgICAgICBpZD1xdWFsaWZpZWROYW1lSUQoY3R4KTsKKworICAgICAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25fYWN0aXZpdHlfbmV3RXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIAkgIAlzZXA6OkJGIGFNb2RlbCA9IHNlcDo6UGFyc2VyVXRpbDo6Z2V0dmFyTWFjaGluZShpZC5zCisgICAgICAgICAgICAgICAgLCBpZC5uYgorICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICAJICAJaWYoIGFNb2RlbC5pczwgc2VwOjpNYWNoaW5lID4oKSApCisgICAgICAgICAgICAgICAgCSAgCXsKKyAgICAgICAgICAgICAgICAJICAJCVBVU0hfQ1RYX05FVyggYU1vZGVsLnRvX3B0cjwgc2VwOjpNYWNoaW5lID4oKSApOworICAgICAgICAgICAgICAgIAkgIAl9CisKKyAgICAgICAgICAgICAgICAJICAJcHRySW5zdGFuY2UgPSBzZXA6Ok1hY2hpbmU6Om5ld0luc3RhbmNlKGNvbnRhaW5lciwKKyAgICAgICAgICAgICAgICAJICAJCQluZXdJbnZva2VOZXdJbnN0YW5jZU5hbWVJRChjb250YWluZXIsIGlkLnMKKyAgICAgICAgICAgICAgICApLCBhTW9kZWwsIDEsIDEpOworCisgICAgICAgICAgICAgICAgCQlwdHJJbnN0YW5jZS0+Z2V0d1NwZWNpZmllcigpLm92ZXJyaWRlX2lmZGVmKAorICAgICAgICAgICAgICAgIAkJCQlzZXA6OlNwZWNpZmllcjo6REVTSUdOX0lOU1RBTkNFX0RZTkFNSUNfU1BFQ0lGSUVSICk7CisKKyAgICAgICAgICAgICAgICAJICAJIGFjCisgICAgICAgICAgICAgICAgLT5hcHBlbmQoIGNvbnRhaW5lci0+c2F2ZU93bmVkRWxlbWVudCggcHRySW5zdGFuY2UgKSApOworICAgICAgICAgICAgICAgIAkgIAorICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2FjdGl2aXR5X21hY2hpbmVfcGFyYW1fcmV0dXJuX2luX2V4cHJlc3Npb25fYWN0aXZpdHlfbmV3MTcyMjcpOworICAgICAgICAgICAgYWN0aXZpdHlfbWFjaGluZV9wYXJhbV9yZXR1cm4oY3R4LCBhTW9kZWwsIGFjKTsKKworICAgICAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25fYWN0aXZpdHlfbmV3RXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlZXhwcmVzc2lvbl9hY3Rpdml0eV9uZXdFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVleHByZXNzaW9uX2FjdGl2aXR5X25ld0V4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICAJaWYoIGFNb2RlbC5pczwgc2VwOjpNYWNoaW5lID4oKSApCisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJUE9QX0NUWDsKKyAgICAgICAgICAgICAgICAgICAgCX0KKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgxODMsIGV4cHJlc3Npb25fYWN0aXZpdHlfbmV3X1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gYWM7Cit9CisvKiAkQU5UTFIgZW5kIGV4cHJlc3Npb25fYWN0aXZpdHlfbmV3ICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IHN0YXRlbWVudF9wcm9tcHQKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ5NzM6MTogc3RhdGVtZW50X3Byb21wdCByZXR1cm5zIFsgc2VwOjpCRkNvZGUgYWMgXSA6IFNUQVRFTUVOVF9QUk9NUFQgc3BpPSBzdGF0ZW1lbnRfcHJvbXB0X2ltcGwgOworICovCitzdGF0aWMgc2VwOjpCRkNvZGUKK3N0YXRlbWVudF9wcm9tcHQocGZtbFBhcnNlciBjdHgpCit7CisgICAgc2VwOjpCRkNvZGUgYWM7CisKKyAgICBBTlRMUjNfVUlOVDMyIHN0YXRlbWVudF9wcm9tcHRfU3RhcnRJbmRleDsKKworICAgIHNlcDo6QkZDb2RlIHNwaTsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfc3BpCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9zcGkgc2VwOjpCRkNvZGUKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBzdGF0ZW1lbnRfcHJvbXB0X1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDE4NCkpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gYWM7CisgICAgfQorCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0OTc1OjI6ICggU1RBVEVNRU5UX1BST01QVCBzcGk9IHN0YXRlbWVudF9wcm9tcHRfaW1wbCApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ5NzU6NDogU1RBVEVNRU5UX1BST01QVCBzcGk9IHN0YXRlbWVudF9wcm9tcHRfaW1wbAorICAgICAgICB7CisgICAgICAgICAgICAgTUFUQ0hUKFNUQVRFTUVOVF9QUk9NUFQsICZGT0xMT1dfU1RBVEVNRU5UX1BST01QVF9pbl9zdGF0ZW1lbnRfcHJvbXB0MTcyNTEpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfcHJvbXB0RXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3N0YXRlbWVudF9wcm9tcHRfaW1wbF9pbl9zdGF0ZW1lbnRfcHJvbXB0MTcyNTYpOworICAgICAgICAgICAgc3BpPXN0YXRlbWVudF9wcm9tcHRfaW1wbChjdHgpOworCisgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X3Byb21wdEV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIGFjPSAgCisgICAgICAgICAgICAgICAgc3BpCisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZXN0YXRlbWVudF9wcm9tcHRFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVzdGF0ZW1lbnRfcHJvbXB0RXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgxODQsIHN0YXRlbWVudF9wcm9tcHRfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiBhYzsKK30KKy8qICRBTlRMUiBlbmQgc3RhdGVtZW50X3Byb21wdCAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBzdGF0ZW1lbnRfcHJvbXB0X2ltcGwKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ5Nzg6MTogc3RhdGVtZW50X3Byb21wdF9pbXBsIHJldHVybnMgWyBzZXA6OkJGQ29kZSBhYyBdIDogc3BvPSBzdGF0ZW1lbnRfcHJvbXB0X29icyA7CisgKi8KK3N0YXRpYyBzZXA6OkJGQ29kZQorc3RhdGVtZW50X3Byb21wdF9pbXBsKHBmbWxQYXJzZXIgY3R4KQoreworICAgIHNlcDo6QkZDb2RlIGFjOworCisgICAgQU5UTFIzX1VJTlQzMiBzdGF0ZW1lbnRfcHJvbXB0X2ltcGxfU3RhcnRJbmRleDsKKworICAgIHNlcDo6QkZDb2RlIHNwbzsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfc3BvCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9zcG8gc2VwOjpCRkNvZGUKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBzdGF0ZW1lbnRfcHJvbXB0X2ltcGxfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTg1KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiBhYzsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ5ODA6MjogKHNwbz0gc3RhdGVtZW50X3Byb21wdF9vYnMgKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0OTgwOjQ6IHNwbz0gc3RhdGVtZW50X3Byb21wdF9vYnMKKyAgICAgICAgeworICAgICAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfc3RhdGVtZW50X3Byb21wdF9vYnNfaW5fc3RhdGVtZW50X3Byb21wdF9pbXBsMTcyNzUpOworICAgICAgICAgICAgc3BvPXN0YXRlbWVudF9wcm9tcHRfb2JzKGN0eCk7CisKKyAgICAgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfcHJvbXB0X2ltcGxFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBhYz0gCisgICAgICAgICAgICAgICAgc3BvCisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZXN0YXRlbWVudF9wcm9tcHRfaW1wbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZXN0YXRlbWVudF9wcm9tcHRfaW1wbEV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTg1LCBzdGF0ZW1lbnRfcHJvbXB0X2ltcGxfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiBhYzsKK30KKy8qICRBTlRMUiBlbmQgc3RhdGVtZW50X3Byb21wdF9pbXBsICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IHN0YXRlbWVudF9wcm9tcHRfb2JzCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0OTg0OjE6IHN0YXRlbWVudF9wcm9tcHRfb2JzIHJldHVybnMgWyBzZXA6OkJGQ29kZSBhYyBdIDp7Li4ufT8gSUQgKCAnY3R4OicgaWQ9IHF1YWxpZmllZE5hbWVJRCApPyBMQ1VSTFkgYnM9IHN0YXRlbWVudF9wcm9tcHRfb2JzX2NvbVsgdmFyTWFjaGluZSBdIFJDVVJMWSAoICdwcm92aWRlZDonIGU9IGV4cHJlc3Npb24gfCBMQlJBQ0tFVCBlPSBleHByZXNzaW9uIFJCUkFDS0VUICkgU0VNSSA7CisgKi8KK3N0YXRpYyBzZXA6OkJGQ29kZQorc3RhdGVtZW50X3Byb21wdF9vYnMocGZtbFBhcnNlciBjdHgpCit7CisgICAgc2VwOjpCRkNvZGUgYWM7CisKKyAgICBBTlRMUjNfVUlOVDMyIHN0YXRlbWVudF9wcm9tcHRfb2JzX1N0YXJ0SW5kZXg7CisKKyAgICBmbWxQYXJzZXJfcXVhbGlmaWVkTmFtZUlEX3JldHVybiBpZDsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfaWQKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2lkIGZtbFBhcnNlcl9xdWFsaWZpZWROYW1lSURfcmV0dXJuCisKKyAgICBzZXA6OkJGQ29kZSBiczsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfYnMKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2JzIHNlcDo6QkZDb2RlCisKKyAgICBzZXA6OkJGIGU7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2UKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIHN0YXRlbWVudF9wcm9tcHRfb2JzX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKworICAgIAlzZXA6OkJGIHZhck1hY2hpbmUgPSBJTkNSX0JGKF9TWVNURU1fKTsKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTg2KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiBhYzsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ5ODk6MjogKHsuLi59PyBJRCAoICdjdHg6JyBpZD0gcXVhbGlmaWVkTmFtZUlEICk/IExDVVJMWSBicz0gc3RhdGVtZW50X3Byb21wdF9vYnNfY29tWyB2YXJNYWNoaW5lIF0gUkNVUkxZICggJ3Byb3ZpZGVkOicgZT0gZXhwcmVzc2lvbiB8IExCUkFDS0VUIGU9IGV4cHJlc3Npb24gUkJSQUNLRVQgKSBTRU1JICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDk4OTo0OiB7Li4ufT8gSUQgKCAnY3R4OicgaWQ9IHF1YWxpZmllZE5hbWVJRCApPyBMQ1VSTFkgYnM9IHN0YXRlbWVudF9wcm9tcHRfb2JzX2NvbVsgdmFyTWFjaGluZSBdIFJDVVJMWSAoICdwcm92aWRlZDonIGU9IGV4cHJlc3Npb24gfCBMQlJBQ0tFVCBlPSBleHByZXNzaW9uIFJCUkFDS0VUICkgU0VNSQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoICEoKCBJU19LRVlXT1JEKCAib2JzIiApICkpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfRkFJTEVEX1BSRURJQ0FURV9FWENFUFRJT047CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIElTX0tFWVdPUkQoIFwib2JzXCIgKSAiOworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPnJ1bGVOYW1lCSA9ICh2b2lkICopInN0YXRlbWVudF9wcm9tcHRfb2JzIjsKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICBNQVRDSFQoSUQsICZGT0xMT1dfSURfaW5fc3RhdGVtZW50X3Byb21wdF9vYnMxNzMwMCk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9wcm9tcHRfb2JzRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ5OTE6NDogKCAnY3R4OicgaWQ9IHF1YWxpZmllZE5hbWVJRCApPworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQ0MzI9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDI2NjoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQ0MzI9MTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NDMyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ5OTE6NjogJ2N0eDonIGlkPSBxdWFsaWZpZWROYW1lSUQKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVCgyNjYsICZGT0xMT1dfMjY2X2luX3N0YXRlbWVudF9wcm9tcHRfb2JzMTczMDgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfcHJvbXB0X29ic0V4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fc3RhdGVtZW50X3Byb21wdF9vYnMxNzMxMik7CisgICAgICAgICAgICAJICAgICAgICBpZD1xdWFsaWZpZWROYW1lSUQoY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9wcm9tcHRfb2JzRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgdmFyTWFjaGluZSA9IHNlcDo6UGFyc2VyVXRpbDo6Z2V0dmFyTWFjaGluZShpZC5zCisgICAgICAgICAgICAJICAgICAgICAgICAgLCBpZC5uYgorICAgICAgICAgICAgCSAgICAgICAgICAgICk7IAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgIE1BVENIVChMQ1VSTFksICZGT0xMT1dfTENVUkxZX2luX3N0YXRlbWVudF9wcm9tcHRfb2JzMTczMjkpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfcHJvbXB0X29ic0V4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19zdGF0ZW1lbnRfcHJvbXB0X29ic19jb21faW5fc3RhdGVtZW50X3Byb21wdF9vYnMxNzMzOCk7CisgICAgICAgICAgICBicz1zdGF0ZW1lbnRfcHJvbXB0X29ic19jb20oY3R4LCB2YXJNYWNoaW5lKTsKKworICAgICAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9wcm9tcHRfb2JzRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICBNQVRDSFQoUkNVUkxZLCAmRk9MTE9XX1JDVVJMWV9pbl9zdGF0ZW1lbnRfcHJvbXB0X29iczE3MzQ0KTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X3Byb21wdF9vYnNFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDk5OTo0OiAoICdwcm92aWRlZDonIGU9IGV4cHJlc3Npb24gfCBMQlJBQ0tFVCBlPSBleHByZXNzaW9uIFJCUkFDS0VUICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0NDMzPTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDM1NDoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0NDMzPTE7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBMQlJBQ0tFVDoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0NDMzPTI7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gNDMzOworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfcHJvbXB0X29ic0V4OworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ0MzMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDk5OTo2OiAncHJvdmlkZWQ6JyBlPSBleHByZXNzaW9uCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoMzU0LCAmRk9MTE9XXzM1NF9pbl9zdGF0ZW1lbnRfcHJvbXB0X29iczE3MzUyKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X3Byb21wdF9vYnNFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfcHJvbXB0X29iczE3MzU2KTsKKyAgICAgICAgICAgIAkgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X3Byb21wdF9vYnNFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTAwMDo2OiBMQlJBQ0tFVCBlPSBleHByZXNzaW9uIFJCUkFDS0VUCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoTEJSQUNLRVQsICZGT0xMT1dfTEJSQUNLRVRfaW5fc3RhdGVtZW50X3Byb21wdF9vYnMxNzM2Myk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9wcm9tcHRfb2JzRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X3Byb21wdF9vYnMxNzM2Nyk7CisgICAgICAgICAgICAJICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9wcm9tcHRfb2JzRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoUkJSQUNLRVQsICZGT0xMT1dfUkJSQUNLRVRfaW5fc3RhdGVtZW50X3Byb21wdF9vYnMxNzM2OSk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9wcm9tcHRfb2JzRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgIE1BVENIVChTRU1JLCAmRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X3Byb21wdF9vYnMxNzM3OSk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9wcm9tcHRfb2JzRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgYWM9IE5FV19TVE1UMyhPUChPQlMpLCB2YXJNYWNoaW5lLCAKKyAgICAgICAgICAgICAgICBicworICAgICAgICAgICAgICAgICwgZQorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlc3RhdGVtZW50X3Byb21wdF9vYnNFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVzdGF0ZW1lbnRfcHJvbXB0X29ic0V4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTg2LCBzdGF0ZW1lbnRfcHJvbXB0X29ic19TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIGFjOworfQorLyogJEFOVExSIGVuZCBzdGF0ZW1lbnRfcHJvbXB0X29icyAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBzdGF0ZW1lbnRfcHJvbXB0X29ic19jb20KKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjUwMDg6MTogc3RhdGVtZW50X3Byb21wdF9vYnNfY29tWyBjb25zdCBzZXA6OkJGICYgdmFyTWFjaGluZSBdIHJldHVybnMgWyBzZXA6OkJGQ29kZSBhYyBdIDogc2M9IHN0YXRlbWVudF9jb20gOworICovCitzdGF0aWMgc2VwOjpCRkNvZGUKK3N0YXRlbWVudF9wcm9tcHRfb2JzX2NvbShwZm1sUGFyc2VyIGN0eCwgY29uc3Qgc2VwOjpCRiAmIHZhck1hY2hpbmUpCit7CisgICAgc2VwOjpCRkNvZGUgYWM7CisKKyAgICBBTlRMUjNfVUlOVDMyIHN0YXRlbWVudF9wcm9tcHRfb2JzX2NvbV9TdGFydEluZGV4OworCisgICAgc2VwOjpCRkNvZGUgc2M7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX3NjCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9zYyBzZXA6OkJGQ29kZQorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIHN0YXRlbWVudF9wcm9tcHRfb2JzX2NvbV9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgxODcpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIGFjOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTAxMDoyOiAoc2M9IHN0YXRlbWVudF9jb20gKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1MDEwOjQ6IHNjPSBzdGF0ZW1lbnRfY29tCisgICAgICAgIHsKKyAgICAgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3N0YXRlbWVudF9jb21faW5fc3RhdGVtZW50X3Byb21wdF9vYnNfY29tMTc0MDQpOworICAgICAgICAgICAgc2M9c3RhdGVtZW50X2NvbShjdHgpOworCisgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X3Byb21wdF9vYnNfY29tRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgYWM9IAorICAgICAgICAgICAgICAgIHNjCisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZXN0YXRlbWVudF9wcm9tcHRfb2JzX2NvbUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZXN0YXRlbWVudF9wcm9tcHRfb2JzX2NvbUV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTg3LCBzdGF0ZW1lbnRfcHJvbXB0X29ic19jb21fU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiBhYzsKK30KKy8qICRBTlRMUiBlbmQgc3RhdGVtZW50X3Byb21wdF9vYnNfY29tICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IG1ldGFfc3RhdGVtZW50CisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1MDE4OjE6IG1ldGFfc3RhdGVtZW50IHJldHVybnMgWyBzZXA6OkJGQ29kZSBhYyBdIDogKCAnJDppbmZvcm1hbCcgYnM9IGJsb2NrX3N0YXRlbWVudCB8ICckOnRyYWNlJyBicz0gYmxvY2tfc3RhdGVtZW50IHwgJyQ6ZGVidWcnIGJzPSBibG9ja19zdGF0ZW1lbnQgfCAnJDpjb21tZW50JyBicz0gYmxvY2tfc3RhdGVtZW50ICk7CisgKi8KK3N0YXRpYyBzZXA6OkJGQ29kZQorbWV0YV9zdGF0ZW1lbnQocGZtbFBhcnNlciBjdHgpCit7CisgICAgc2VwOjpCRkNvZGUgYWM7CisKKyAgICBBTlRMUjNfVUlOVDMyIG1ldGFfc3RhdGVtZW50X1N0YXJ0SW5kZXg7CisKKyAgICBzZXA6OkJGQ29kZSBiczsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfYnMKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2JzIHNlcDo6QkZDb2RlCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgbWV0YV9zdGF0ZW1lbnRfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTg4KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiBhYzsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vICAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1MDIwOjI6ICggJyQ6aW5mb3JtYWwnIGJzPSBibG9ja19zdGF0ZW1lbnQgfCAnJDp0cmFjZScgYnM9IGJsb2NrX3N0YXRlbWVudCB8ICckOmRlYnVnJyBicz0gYmxvY2tfc3RhdGVtZW50IHwgJyQ6Y29tbWVudCcgYnM9IGJsb2NrX3N0YXRlbWVudCApCisKKyAgICAgICAgICAgIEFOVExSM19VSU5UMzIgYWx0NDM0OworCisgICAgICAgICAgICBhbHQ0MzQ9NDsKKworICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAxNTY6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ0MzQ9MTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE1NzoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQzND0yOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTU1OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDM0PTM7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNTQ6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ0MzQ9NDsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA0MzQ7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVtZXRhX3N0YXRlbWVudEV4OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NDM0KQorICAgICAgICAgICAgeworICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjUwMjA6NDogJyQ6aW5mb3JtYWwnIGJzPSBibG9ja19zdGF0ZW1lbnQKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMTU2LCAmRk9MTE9XXzE1Nl9pbl9tZXRhX3N0YXRlbWVudDE3NDI3KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlbWV0YV9zdGF0ZW1lbnRFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX21ldGFfc3RhdGVtZW50MTc0MzIpOworICAgICAgICAJICAgICAgICBicz1ibG9ja19zdGF0ZW1lbnQoY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlbWV0YV9zdGF0ZW1lbnRFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgYWM9IE5FV19TVE1UMShPUChJTkZPUk1BTCksIAorICAgICAgICAJICAgICAgICAgICAgYnMKKyAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAyOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjUwMjE6NDogJyQ6dHJhY2UnIGJzPSBibG9ja19zdGF0ZW1lbnQKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMTU3LCAmRk9MTE9XXzE1N19pbl9tZXRhX3N0YXRlbWVudDE3NDQwKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlbWV0YV9zdGF0ZW1lbnRFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX21ldGFfc3RhdGVtZW50MTc0NDgpOworICAgICAgICAJICAgICAgICBicz1ibG9ja19zdGF0ZW1lbnQoY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlbWV0YV9zdGF0ZW1lbnRFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgYWM9IE5FV19TVE1UMShPUChUUkFDRSkgICAsIAorICAgICAgICAJICAgICAgICAgICAgYnMKKyAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAzOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjUwMjI6NDogJyQ6ZGVidWcnIGJzPSBibG9ja19zdGF0ZW1lbnQKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMTU1LCAmRk9MTE9XXzE1NV9pbl9tZXRhX3N0YXRlbWVudDE3NDU2KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlbWV0YV9zdGF0ZW1lbnRFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX21ldGFfc3RhdGVtZW50MTc0NjQpOworICAgICAgICAJICAgICAgICBicz1ibG9ja19zdGF0ZW1lbnQoY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlbWV0YV9zdGF0ZW1lbnRFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgYWM9IE5FV19TVE1UMShPUChERUJVRykgICAsIAorICAgICAgICAJICAgICAgICAgICAgYnMKKyAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA0OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjUwMjM6NDogJyQ6Y29tbWVudCcgYnM9IGJsb2NrX3N0YXRlbWVudAorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgxNTQsICZGT0xMT1dfMTU0X2luX21ldGFfc3RhdGVtZW50MTc0NzIpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVtZXRhX3N0YXRlbWVudEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19ibG9ja19zdGF0ZW1lbnRfaW5fbWV0YV9zdGF0ZW1lbnQxNzQ3OCk7CisgICAgICAgIAkgICAgICAgIGJzPWJsb2NrX3N0YXRlbWVudChjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVtZXRhX3N0YXRlbWVudEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBhYz0gTkVXX1NUTVQxKE9QKENPTU1FTlQpICwgCisgICAgICAgIAkgICAgICAgICAgICBicworICAgICAgICAJICAgICAgICAgICAgKTsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZW1ldGFfc3RhdGVtZW50RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlbWV0YV9zdGF0ZW1lbnRFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDE4OCwgbWV0YV9zdGF0ZW1lbnRfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiBhYzsKK30KKy8qICRBTlRMUiBlbmQgbWV0YV9zdGF0ZW1lbnQgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgc3RhdGVtZW50X2Fzc2lnbgorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTA1NToxOiBzdGF0ZW1lbnRfYXNzaWduIHJldHVybnMgWyBzZXA6OkJGQ29kZSBhYyBdIDogKGx2PSBsdmFsdWUgKCAoIEFTU0lHTiB8IEFTU0lHTl9BRlRFUiApIGU9IGV4cHJlc3Npb24gU0VNSSB8IEFTU0lHTl9SRUYgZT0gbHZhbHVlIFNFTUkgfCBBU1NJR05fTUFDUk8gZT0gZXhwcmVzc2lvbiBTRU1JIHwgKCBQTFVTX0FTU0lHTiB8IFBMVVNfQVNTSUdOX0FGVEVSICkgZT0gZXhwcmVzc2lvbiBTRU1JIHwgKCBNSU5VU19BU1NJR04gfCBNSU5VU19BU1NJR05fQUZURVIgKSBlPSBleHByZXNzaW9uIFNFTUkgfCAoIFNUQVJfQVNTSUdOIHwgU1RBUl9BU1NJR05fQUZURVIgKSBlPSBleHByZXNzaW9uIFNFTUkgfCAoIERJVl9BU1NJR04gfCBESVZfQVNTSUdOX0FGVEVSICkgZT0gZXhwcmVzc2lvbiBTRU1JIHwgKCBNT0RfQVNTSUdOIHwgTU9EX0FTU0lHTl9BRlRFUiApIGU9IGV4cHJlc3Npb24gU0VNSSB8ICggTEFORF9BU1NJR04gfCBMQU5EX0FTU0lHTl9BRlRFUiApIGU9IGV4cHJlc3Npb24gU0VNSSB8ICggTE9SX0FTU0lHTiB8IExPUl9BU1NJR05fQUZURVIgKSBlPSBleHByZXNzaW9uIFNFTUkgfCAoIEJBTkRfQVNTSUdOIHwgQkFORF9BU1NJR05fQUZURVIgKSBlPSBleHByZXNzaW9uIFNFTUkgfCAoIEJPUl9BU1NJR04gfCBCT1JfQVNTSUdOX0FGVEVSICkgZT0gZXhwcmVzc2lvbiBTRU1JIHwgKCBCWE9SX0FTU0lHTiB8IEJYT1JfQVNTSUdOX0FGVEVSICkgZT0gZXhwcmVzc2lvbiBTRU1JIHwgKCBMU0hJRlRfQVNTSUdOIHwgTFNISUZUX0FTU0lHTl9BRlRFUiApIGU9IGV4cHJlc3Npb24gU0VNSSB8ICggUlNISUZUX0FTU0lHTiB8IFJTSElGVF9BU1NJR05fQUZURVIgKSBlPSBleHByZXNzaW9uIFNFTUkgfCBPUF9QVVNIIGU9IGV4cHJlc3Npb24gKCBPUF9QVVNIIGU9IGV4cHJlc3Npb24gKSogU0VNSSB8IE9QX0FTU0lHTl9UT1AgZT0gZXhwcmVzc2lvbiBTRU1JIHwgT1BfVE9QIHY9IGx2YWx1ZSBTRU1JIHwgT1BfUE9QICh2PSBsdmFsdWUgKSogU0VNSSB8IElOQ1IgU0VNSSB8IERFQ1IgU0VNSSApIHwgSU5DUiBsdj0gbHZhbHVlIFNFTUkgfCBERUNSIGx2PSBsdmFsdWUgU0VNSSApOworICovCitzdGF0aWMgc2VwOjpCRkNvZGUKK3N0YXRlbWVudF9hc3NpZ24ocGZtbFBhcnNlciBjdHgpCit7CisgICAgc2VwOjpCRkNvZGUgYWM7CisKKyAgICBBTlRMUjNfVUlOVDMyIHN0YXRlbWVudF9hc3NpZ25fU3RhcnRJbmRleDsKKworICAgIHNlcDo6QkYgbHY7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2x2CisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9sdiBzZXA6OkJGCisKKyAgICBzZXA6OkJGIGU7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2UKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisgICAgc2VwOjpCRiB2OworICAgICN1bmRlZglSRVRVUk5fVFlQRV92CisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV92IHNlcDo6QkYKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBzdGF0ZW1lbnRfYXNzaWduX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDE4OSkpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gYWM7CisgICAgfQorCisgICAgeworICAgICAgICB7CisgICAgICAgICAgICAvLyAgL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTA1ODoyOiAobHY9IGx2YWx1ZSAoICggQVNTSUdOIHwgQVNTSUdOX0FGVEVSICkgZT0gZXhwcmVzc2lvbiBTRU1JIHwgQVNTSUdOX1JFRiBlPSBsdmFsdWUgU0VNSSB8IEFTU0lHTl9NQUNSTyBlPSBleHByZXNzaW9uIFNFTUkgfCAoIFBMVVNfQVNTSUdOIHwgUExVU19BU1NJR05fQUZURVIgKSBlPSBleHByZXNzaW9uIFNFTUkgfCAoIE1JTlVTX0FTU0lHTiB8IE1JTlVTX0FTU0lHTl9BRlRFUiApIGU9IGV4cHJlc3Npb24gU0VNSSB8ICggU1RBUl9BU1NJR04gfCBTVEFSX0FTU0lHTl9BRlRFUiApIGU9IGV4cHJlc3Npb24gU0VNSSB8ICggRElWX0FTU0lHTiB8IERJVl9BU1NJR05fQUZURVIgKSBlPSBleHByZXNzaW9uIFNFTUkgfCAoIE1PRF9BU1NJR04gfCBNT0RfQVNTSUdOX0FGVEVSICkgZT0gZXhwcmVzc2lvbiBTRU1JIHwgKCBMQU5EX0FTU0lHTiB8IExBTkRfQVNTSUdOX0FGVEVSICkgZT0gZXhwcmVzc2lvbiBTRU1JIHwgKCBMT1JfQVNTSUdOIHwgTE9SX0FTU0lHTl9BRlRFUiApIGU9IGV4cHJlc3Npb24gU0VNSSB8ICggQkFORF9BU1NJR04gfCBCQU5EX0FTU0lHTl9BRlRFUiApIGU9IGV4cHJlc3Npb24gU0VNSSB8ICggQk9SX0FTU0lHTiB8IEJPUl9BU1NJR05fQUZURVIgKSBlPSBleHByZXNzaW9uIFNFTUkgfCAoIEJYT1JfQVNTSUdOIHwgQlhPUl9BU1NJR05fQUZURVIgKSBlPSBleHByZXNzaW9uIFNFTUkgfCAoIExTSElGVF9BU1NJR04gfCBMU0hJRlRfQVNTSUdOX0FGVEVSICkgZT0gZXhwcmVzc2lvbiBTRU1JIHwgKCBSU0hJRlRfQVNTSUdOIHwgUlNISUZUX0FTU0lHTl9BRlRFUiApIGU9IGV4cHJlc3Npb24gU0VNSSB8IE9QX1BVU0ggZT0gZXhwcmVzc2lvbiAoIE9QX1BVU0ggZT0gZXhwcmVzc2lvbiApKiBTRU1JIHwgT1BfQVNTSUdOX1RPUCBlPSBleHByZXNzaW9uIFNFTUkgfCBPUF9UT1Agdj0gbHZhbHVlIFNFTUkgfCBPUF9QT1AgKHY9IGx2YWx1ZSApKiBTRU1JIHwgSU5DUiBTRU1JIHwgREVDUiBTRU1JICkgfCBJTkNSIGx2PSBsdmFsdWUgU0VNSSB8IERFQ1IgbHY9IGx2YWx1ZSBTRU1JICkKKworICAgICAgICAgICAgQU5UTFIzX1VJTlQzMiBhbHQ0Mzg7CisKKyAgICAgICAgICAgIGFsdDQzOD0zOworCisgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIENPTE9OeDI6CisgICAgICAgICAgICBjYXNlIElEOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDM4PTE7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBJTkNSOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDM4PTI7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBERUNSOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDM4PTM7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gNDM4OworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2Fzc2lnbkV4OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NDM4KQorICAgICAgICAgICAgeworICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjUwNTg6NDogbHY9IGx2YWx1ZSAoICggQVNTSUdOIHwgQVNTSUdOX0FGVEVSICkgZT0gZXhwcmVzc2lvbiBTRU1JIHwgQVNTSUdOX1JFRiBlPSBsdmFsdWUgU0VNSSB8IEFTU0lHTl9NQUNSTyBlPSBleHByZXNzaW9uIFNFTUkgfCAoIFBMVVNfQVNTSUdOIHwgUExVU19BU1NJR05fQUZURVIgKSBlPSBleHByZXNzaW9uIFNFTUkgfCAoIE1JTlVTX0FTU0lHTiB8IE1JTlVTX0FTU0lHTl9BRlRFUiApIGU9IGV4cHJlc3Npb24gU0VNSSB8ICggU1RBUl9BU1NJR04gfCBTVEFSX0FTU0lHTl9BRlRFUiApIGU9IGV4cHJlc3Npb24gU0VNSSB8ICggRElWX0FTU0lHTiB8IERJVl9BU1NJR05fQUZURVIgKSBlPSBleHByZXNzaW9uIFNFTUkgfCAoIE1PRF9BU1NJR04gfCBNT0RfQVNTSUdOX0FGVEVSICkgZT0gZXhwcmVzc2lvbiBTRU1JIHwgKCBMQU5EX0FTU0lHTiB8IExBTkRfQVNTSUdOX0FGVEVSICkgZT0gZXhwcmVzc2lvbiBTRU1JIHwgKCBMT1JfQVNTSUdOIHwgTE9SX0FTU0lHTl9BRlRFUiApIGU9IGV4cHJlc3Npb24gU0VNSSB8ICggQkFORF9BU1NJR04gfCBCQU5EX0FTU0lHTl9BRlRFUiApIGU9IGV4cHJlc3Npb24gU0VNSSB8ICggQk9SX0FTU0lHTiB8IEJPUl9BU1NJR05fQUZURVIgKSBlPSBleHByZXNzaW9uIFNFTUkgfCAoIEJYT1JfQVNTSUdOIHwgQlhPUl9BU1NJR05fQUZURVIgKSBlPSBleHByZXNzaW9uIFNFTUkgfCAoIExTSElGVF9BU1NJR04gfCBMU0hJRlRfQVNTSUdOX0FGVEVSICkgZT0gZXhwcmVzc2lvbiBTRU1JIHwgKCBSU0hJRlRfQVNTSUdOIHwgUlNISUZUX0FTU0lHTl9BRlRFUiApIGU9IGV4cHJlc3Npb24gU0VNSSB8IE9QX1BVU0ggZT0gZXhwcmVzc2lvbiAoIE9QX1BVU0ggZT0gZXhwcmVzc2lvbiApKiBTRU1JIHwgT1BfQVNTSUdOX1RPUCBlPSBleHByZXNzaW9uIFNFTUkgfCBPUF9UT1Agdj0gbHZhbHVlIFNFTUkgfCBPUF9QT1AgKHY9IGx2YWx1ZSApKiBTRU1JIHwgSU5DUiBTRU1JIHwgREVDUiBTRU1JICkKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2x2YWx1ZV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc1MTApOworICAgICAgICAJICAgICAgICBsdj1sdmFsdWUoY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2Fzc2lnbkV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1MDU5OjI6ICggKCBBU1NJR04gfCBBU1NJR05fQUZURVIgKSBlPSBleHByZXNzaW9uIFNFTUkgfCBBU1NJR05fUkVGIGU9IGx2YWx1ZSBTRU1JIHwgQVNTSUdOX01BQ1JPIGU9IGV4cHJlc3Npb24gU0VNSSB8ICggUExVU19BU1NJR04gfCBQTFVTX0FTU0lHTl9BRlRFUiApIGU9IGV4cHJlc3Npb24gU0VNSSB8ICggTUlOVVNfQVNTSUdOIHwgTUlOVVNfQVNTSUdOX0FGVEVSICkgZT0gZXhwcmVzc2lvbiBTRU1JIHwgKCBTVEFSX0FTU0lHTiB8IFNUQVJfQVNTSUdOX0FGVEVSICkgZT0gZXhwcmVzc2lvbiBTRU1JIHwgKCBESVZfQVNTSUdOIHwgRElWX0FTU0lHTl9BRlRFUiApIGU9IGV4cHJlc3Npb24gU0VNSSB8ICggTU9EX0FTU0lHTiB8IE1PRF9BU1NJR05fQUZURVIgKSBlPSBleHByZXNzaW9uIFNFTUkgfCAoIExBTkRfQVNTSUdOIHwgTEFORF9BU1NJR05fQUZURVIgKSBlPSBleHByZXNzaW9uIFNFTUkgfCAoIExPUl9BU1NJR04gfCBMT1JfQVNTSUdOX0FGVEVSICkgZT0gZXhwcmVzc2lvbiBTRU1JIHwgKCBCQU5EX0FTU0lHTiB8IEJBTkRfQVNTSUdOX0FGVEVSICkgZT0gZXhwcmVzc2lvbiBTRU1JIHwgKCBCT1JfQVNTSUdOIHwgQk9SX0FTU0lHTl9BRlRFUiApIGU9IGV4cHJlc3Npb24gU0VNSSB8ICggQlhPUl9BU1NJR04gfCBCWE9SX0FTU0lHTl9BRlRFUiApIGU9IGV4cHJlc3Npb24gU0VNSSB8ICggTFNISUZUX0FTU0lHTiB8IExTSElGVF9BU1NJR05fQUZURVIgKSBlPSBleHByZXNzaW9uIFNFTUkgfCAoIFJTSElGVF9BU1NJR04gfCBSU0hJRlRfQVNTSUdOX0FGVEVSICkgZT0gZXhwcmVzc2lvbiBTRU1JIHwgT1BfUFVTSCBlPSBleHByZXNzaW9uICggT1BfUFVTSCBlPSBleHByZXNzaW9uICkqIFNFTUkgfCBPUF9BU1NJR05fVE9QIGU9IGV4cHJlc3Npb24gU0VNSSB8IE9QX1RPUCB2PSBsdmFsdWUgU0VNSSB8IE9QX1BPUCAodj0gbHZhbHVlICkqIFNFTUkgfCBJTkNSIFNFTUkgfCBERUNSIFNFTUkgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0NDM3PTIxOworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgY2FzZSBBU1NJR046CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIEFTU0lHTl9BRlRFUjoKKyAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAJCWFsdDQzNz0xOworICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgQVNTSUdOX1JFRjoKKyAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAJCWFsdDQzNz0yOworICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgQVNTSUdOX01BQ1JPOgorICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgIAkJYWx0NDM3PTM7CisgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgY2FzZSBQTFVTX0FTU0lHTjoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgUExVU19BU1NJR05fQUZURVI6CisgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgCQlhbHQ0Mzc9NDsKKyAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIE1JTlVTX0FTU0lHTjoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgTUlOVVNfQVNTSUdOX0FGVEVSOgorICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgIAkJYWx0NDM3PTU7CisgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgY2FzZSBTVEFSX0FTU0lHTjoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgU1RBUl9BU1NJR05fQUZURVI6CisgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgCQlhbHQ0Mzc9NjsKKyAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIERJVl9BU1NJR046CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIERJVl9BU1NJR05fQUZURVI6CisgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgCQlhbHQ0Mzc9NzsKKyAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIE1PRF9BU1NJR046CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIE1PRF9BU1NJR05fQUZURVI6CisgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgCQlhbHQ0Mzc9ODsKKyAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIExBTkRfQVNTSUdOOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSBMQU5EX0FTU0lHTl9BRlRFUjoKKyAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAJCWFsdDQzNz05OworICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgTE9SX0FTU0lHTjoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgTE9SX0FTU0lHTl9BRlRFUjoKKyAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAJCWFsdDQzNz0xMDsKKyAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIEJBTkRfQVNTSUdOOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSBCQU5EX0FTU0lHTl9BRlRFUjoKKyAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAJCWFsdDQzNz0xMTsKKyAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIEJPUl9BU1NJR046CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIEJPUl9BU1NJR05fQUZURVI6CisgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgCQlhbHQ0Mzc9MTI7CisgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgY2FzZSBCWE9SX0FTU0lHTjoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgQlhPUl9BU1NJR05fQUZURVI6CisgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgCQlhbHQ0Mzc9MTM7CisgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgY2FzZSBMU0hJRlRfQVNTSUdOOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSBMU0hJRlRfQVNTSUdOX0FGVEVSOgorICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgIAkJYWx0NDM3PTE0OworICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgUlNISUZUX0FTU0lHTjoKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgUlNISUZUX0FTU0lHTl9BRlRFUjoKKyAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAJCWFsdDQzNz0xNTsKKyAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIE9QX1BVU0g6CisgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgCQlhbHQ0Mzc9MTY7CisgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgY2FzZSBPUF9BU1NJR05fVE9QOgorICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgIAkJYWx0NDM3PTE3OworICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgT1BfVE9QOgorICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgIAkJYWx0NDM3PTE4OworICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgT1BfUE9QOgorICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgIAkJYWx0NDM3PTE5OworICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgSU5DUjoKKyAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAJCWFsdDQzNz0yMDsKKyAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIERFQ1I6CisgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgCQlhbHQ0Mzc9MjE7CisgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAJICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gNDM3OworICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2Fzc2lnbkV4OworCisgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0NDM3KQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjUwNTk6NDogKCBBU1NJR04gfCBBU1NJR05fQUZURVIgKSBlPSBleHByZXNzaW9uIFNFTUkKKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggKChMQSgxKSA+PSBBU1NJR04pICYmIChMQSgxKSA8PSBBU1NJR05fQUZURVIpKSApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIENPTlNVTUUoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIFBFUlJPUlJFQ09WRVJZPUFOVExSM19GQUxTRTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIEZBSUxFREZMQUc9QU5UTFIzX0ZBTFNFOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgZWxzZQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX01JU01BVENIRURfU0VUX0VYQ0VQVElPTjsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+bmFtZSAgICAgICAgID0gKHZvaWQgKilBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfTkFNRTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+ZXhwZWN0aW5nU2V0ID0gTlVMTDsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2Fzc2lnbkV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9hc3NpZ24xNzUyOCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfYXNzaWduRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoU0VNSSwgJkZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xNzUzMSk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9hc3NpZ25FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgYWM9IE5FV19TVE1UMihPUChBU1NJR04pLCAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGx2CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAsIGUKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAJY2FzZSAyOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjUwNjI6NDogQVNTSUdOX1JFRiBlPSBsdmFsdWUgU0VNSQorICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChBU1NJR05fUkVGLCAmRk9MTE9XX0FTU0lHTl9SRUZfaW5fc3RhdGVtZW50X2Fzc2lnbjE3NTQyKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2Fzc2lnbkV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19sdmFsdWVfaW5fc3RhdGVtZW50X2Fzc2lnbjE3NTQ3KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgZT1sdmFsdWUoY3R4KTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2Fzc2lnbkV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKFNFTUksICZGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc1NTApOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfYXNzaWduRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIGFjPSBORVdfU1RNVDIoT1AoQVNTSUdOX1JFRiksIAorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgbHYKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICwgZQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAljYXNlIDM6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTA2NTo0OiBBU1NJR05fTUFDUk8gZT0gZXhwcmVzc2lvbiBTRU1JCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKEFTU0lHTl9NQUNSTywgJkZPTExPV19BU1NJR05fTUFDUk9faW5fc3RhdGVtZW50X2Fzc2lnbjE3NTU5KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2Fzc2lnbkV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9hc3NpZ24xNzU2NCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfYXNzaWduRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoU0VNSSwgJkZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xNzU2Nyk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9hc3NpZ25FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgYWM9IE5FV19TVE1UMihPUChBU1NJR05fTUFDUk8pLCAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGx2CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAsIGUKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAJY2FzZSA0OgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjUwNjk6NDogKCBQTFVTX0FTU0lHTiB8IFBMVVNfQVNTSUdOX0FGVEVSICkgZT0gZXhwcmVzc2lvbiBTRU1JCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoICgoTEEoMSkgPj0gUExVU19BU1NJR04pICYmIChMQSgxKSA8PSBQTFVTX0FTU0lHTl9BRlRFUikpICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgQ09OU1VNRSgpOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgUEVSUk9SUkVDT1ZFUlk9QU5UTFIzX0ZBTFNFOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgRkFJTEVERkxBRz1BTlRMUjNfRkFMU0U7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBlbHNlCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfRVhDRVBUSU9OOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT5uYW1lICAgICAgICAgPSAodm9pZCAqKUFOVExSM19NSVNNQVRDSEVEX1NFVF9OQU1FOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT5leHBlY3RpbmdTZXQgPSBOVUxMOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfYXNzaWduRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2Fzc2lnbjE3NTkwKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9hc3NpZ25FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChTRU1JLCAmRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2Fzc2lnbjE3NTkzKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2Fzc2lnbkV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICBhYz0gTkVXX1NUTVRfQVNTSUdOX09QKE9QKFBMVVMpLCAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGx2CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAsIGUKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAJY2FzZSA1OgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjUwNzI6NDogKCBNSU5VU19BU1NJR04gfCBNSU5VU19BU1NJR05fQUZURVIgKSBlPSBleHByZXNzaW9uIFNFTUkKKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggKChMQSgxKSA+PSBNSU5VU19BU1NJR04pICYmIChMQSgxKSA8PSBNSU5VU19BU1NJR05fQUZURVIpKSApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIENPTlNVTUUoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIFBFUlJPUlJFQ09WRVJZPUFOVExSM19GQUxTRTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIEZBSUxFREZMQUc9QU5UTFIzX0ZBTFNFOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgZWxzZQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX01JU01BVENIRURfU0VUX0VYQ0VQVElPTjsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+bmFtZSAgICAgICAgID0gKHZvaWQgKilBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfTkFNRTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+ZXhwZWN0aW5nU2V0ID0gTlVMTDsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2Fzc2lnbkV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9hc3NpZ24xNzYxNSk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfYXNzaWduRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoU0VNSSwgJkZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xNzYxOCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9hc3NpZ25FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgYWM9IE5FV19TVE1UX0FTU0lHTl9PUChPUChNSU5VUyksIAorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgbHYKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICwgZQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAljYXNlIDY6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTA3NTo0OiAoIFNUQVJfQVNTSUdOIHwgU1RBUl9BU1NJR05fQUZURVIgKSBlPSBleHByZXNzaW9uIFNFTUkKKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggKChMQSgxKSA+PSBTVEFSX0FTU0lHTikgJiYgKExBKDEpIDw9IFNUQVJfQVNTSUdOX0FGVEVSKSkgKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBDT05TVU1FKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBQRVJST1JSRUNPVkVSWT1BTlRMUjNfRkFMU0U7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBGQUlMRURGTEFHPUFOVExSM19GQUxTRTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGVsc2UKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19NSVNNQVRDSEVEX1NFVF9FWENFUFRJT047CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPm5hbWUgICAgICAgICA9ICh2b2lkICopQU5UTFIzX01JU01BVENIRURfU0VUX05BTUU7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPmV4cGVjdGluZ1NldCA9IE5VTEw7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9hc3NpZ25FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfYXNzaWduMTc2NDApOworICAgICAgICAJICAgICAgICAJICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2Fzc2lnbkV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKFNFTUksICZGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc2NDMpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfYXNzaWduRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIGFjPSBORVdfU1RNVF9BU1NJR05fT1AoT1AoTVVMVCksIAorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgbHYKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICwgZQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAljYXNlIDc6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTA3ODo0OiAoIERJVl9BU1NJR04gfCBESVZfQVNTSUdOX0FGVEVSICkgZT0gZXhwcmVzc2lvbiBTRU1JCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoICgoTEEoMSkgPj0gRElWX0FTU0lHTikgJiYgKExBKDEpIDw9IERJVl9BU1NJR05fQUZURVIpKSApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIENPTlNVTUUoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIFBFUlJPUlJFQ09WRVJZPUFOVExSM19GQUxTRTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIEZBSUxFREZMQUc9QU5UTFIzX0ZBTFNFOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgZWxzZQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX01JU01BVENIRURfU0VUX0VYQ0VQVElPTjsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+bmFtZSAgICAgICAgID0gKHZvaWQgKilBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfTkFNRTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+ZXhwZWN0aW5nU2V0ID0gTlVMTDsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2Fzc2lnbkV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9hc3NpZ24xNzY2NSk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfYXNzaWduRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoU0VNSSwgJkZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xNzY2OCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9hc3NpZ25FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgYWM9IE5FV19TVE1UX0FTU0lHTl9PUChPUChESVYpLCAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGx2CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAsIGUKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAJY2FzZSA4OgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjUwODE6NDogKCBNT0RfQVNTSUdOIHwgTU9EX0FTU0lHTl9BRlRFUiApIGU9IGV4cHJlc3Npb24gU0VNSQorICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCAoKExBKDEpID49IE1PRF9BU1NJR04pICYmIChMQSgxKSA8PSBNT0RfQVNTSUdOX0FGVEVSKSkgKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBDT05TVU1FKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBQRVJST1JSRUNPVkVSWT1BTlRMUjNfRkFMU0U7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBGQUlMRURGTEFHPUFOVExSM19GQUxTRTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGVsc2UKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19NSVNNQVRDSEVEX1NFVF9FWENFUFRJT047CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPm5hbWUgICAgICAgICA9ICh2b2lkICopQU5UTFIzX01JU01BVENIRURfU0VUX05BTUU7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPmV4cGVjdGluZ1NldCA9IE5VTEw7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9hc3NpZ25FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfYXNzaWduMTc2OTApOworICAgICAgICAJICAgICAgICAJICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2Fzc2lnbkV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKFNFTUksICZGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc2OTMpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfYXNzaWduRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIGFjPSBORVdfU1RNVF9BU1NJR05fT1AoT1AoTU9EKSwgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBsdgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgLCBlCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICApOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgOToKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1MDg1OjQ6ICggTEFORF9BU1NJR04gfCBMQU5EX0FTU0lHTl9BRlRFUiApIGU9IGV4cHJlc3Npb24gU0VNSQorICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCAoKExBKDEpID49IExBTkRfQVNTSUdOKSAmJiAoTEEoMSkgPD0gTEFORF9BU1NJR05fQUZURVIpKSApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIENPTlNVTUUoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIFBFUlJPUlJFQ09WRVJZPUFOVExSM19GQUxTRTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIEZBSUxFREZMQUc9QU5UTFIzX0ZBTFNFOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgZWxzZQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX01JU01BVENIRURfU0VUX0VYQ0VQVElPTjsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+bmFtZSAgICAgICAgID0gKHZvaWQgKilBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfTkFNRTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+ZXhwZWN0aW5nU2V0ID0gTlVMTDsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2Fzc2lnbkV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9hc3NpZ24xNzcxNik7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfYXNzaWduRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoU0VNSSwgJkZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xNzcxOSk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9hc3NpZ25FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgYWM9IE5FV19TVE1UX0FTU0lHTl9PUChPUChBTkQpLCAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGx2CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAsIGUKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAJY2FzZSAxMDoKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1MDg4OjQ6ICggTE9SX0FTU0lHTiB8IExPUl9BU1NJR05fQUZURVIgKSBlPSBleHByZXNzaW9uIFNFTUkKKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggKChMQSgxKSA+PSBMT1JfQVNTSUdOKSAmJiAoTEEoMSkgPD0gTE9SX0FTU0lHTl9BRlRFUikpICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgQ09OU1VNRSgpOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgUEVSUk9SUkVDT1ZFUlk9QU5UTFIzX0ZBTFNFOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgRkFJTEVERkxBRz1BTlRMUjNfRkFMU0U7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBlbHNlCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfRVhDRVBUSU9OOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT5uYW1lICAgICAgICAgPSAodm9pZCAqKUFOVExSM19NSVNNQVRDSEVEX1NFVF9OQU1FOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT5leHBlY3RpbmdTZXQgPSBOVUxMOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfYXNzaWduRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2Fzc2lnbjE3NzQxKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9hc3NpZ25FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChTRU1JLCAmRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2Fzc2lnbjE3NzQ0KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2Fzc2lnbkV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICBhYz0gTkVXX1NUTVRfQVNTSUdOX09QKE9QKE9SKSwgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBsdgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgLCBlCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICApOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMTE6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTA5Mjo0OiAoIEJBTkRfQVNTSUdOIHwgQkFORF9BU1NJR05fQUZURVIgKSBlPSBleHByZXNzaW9uIFNFTUkKKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggKChMQSgxKSA+PSBCQU5EX0FTU0lHTikgJiYgKExBKDEpIDw9IEJBTkRfQVNTSUdOX0FGVEVSKSkgKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBDT05TVU1FKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBQRVJST1JSRUNPVkVSWT1BTlRMUjNfRkFMU0U7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBGQUlMRURGTEFHPUFOVExSM19GQUxTRTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGVsc2UKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19NSVNNQVRDSEVEX1NFVF9FWENFUFRJT047CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPm5hbWUgICAgICAgICA9ICh2b2lkICopQU5UTFIzX01JU01BVENIRURfU0VUX05BTUU7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPmV4cGVjdGluZ1NldCA9IE5VTEw7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9hc3NpZ25FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfYXNzaWduMTc3NjcpOworICAgICAgICAJICAgICAgICAJICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2Fzc2lnbkV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKFNFTUksICZGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc3NzApOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfYXNzaWduRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIGFjPSBORVdfU1RNVF9BU1NJR05fT1AoT1AoQkFORCksIAorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgbHYKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICwgZQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAljYXNlIDEyOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjUwOTU6NDogKCBCT1JfQVNTSUdOIHwgQk9SX0FTU0lHTl9BRlRFUiApIGU9IGV4cHJlc3Npb24gU0VNSQorICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCAoKExBKDEpID49IEJPUl9BU1NJR04pICYmIChMQSgxKSA8PSBCT1JfQVNTSUdOX0FGVEVSKSkgKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBDT05TVU1FKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBQRVJST1JSRUNPVkVSWT1BTlRMUjNfRkFMU0U7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBGQUlMRURGTEFHPUFOVExSM19GQUxTRTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGVsc2UKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19NSVNNQVRDSEVEX1NFVF9FWENFUFRJT047CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPm5hbWUgICAgICAgICA9ICh2b2lkICopQU5UTFIzX01JU01BVENIRURfU0VUX05BTUU7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPmV4cGVjdGluZ1NldCA9IE5VTEw7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9hc3NpZ25FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfYXNzaWduMTc3OTIpOworICAgICAgICAJICAgICAgICAJICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2Fzc2lnbkV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKFNFTUksICZGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc3OTUpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfYXNzaWduRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIGFjPSBORVdfU1RNVF9BU1NJR05fT1AoT1AoQk9SKSwgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBsdgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgLCBlCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICApOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMTM6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTA5ODo0OiAoIEJYT1JfQVNTSUdOIHwgQlhPUl9BU1NJR05fQUZURVIgKSBlPSBleHByZXNzaW9uIFNFTUkKKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggKChMQSgxKSA+PSBCWE9SX0FTU0lHTikgJiYgKExBKDEpIDw9IEJYT1JfQVNTSUdOX0FGVEVSKSkgKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBDT05TVU1FKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBQRVJST1JSRUNPVkVSWT1BTlRMUjNfRkFMU0U7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBGQUlMRURGTEFHPUFOVExSM19GQUxTRTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGVsc2UKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19NSVNNQVRDSEVEX1NFVF9FWENFUFRJT047CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPm5hbWUgICAgICAgICA9ICh2b2lkICopQU5UTFIzX01JU01BVENIRURfU0VUX05BTUU7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPmV4cGVjdGluZ1NldCA9IE5VTEw7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9hc3NpZ25FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfYXNzaWduMTc4MTcpOworICAgICAgICAJICAgICAgICAJICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2Fzc2lnbkV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKFNFTUksICZGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc4MjApOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfYXNzaWduRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIGFjPSBORVdfU1RNVF9BU1NJR05fT1AoT1AoQlhPUiksIAorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgbHYKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICwgZQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAljYXNlIDE0OgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjUxMDI6NDogKCBMU0hJRlRfQVNTSUdOIHwgTFNISUZUX0FTU0lHTl9BRlRFUiApIGU9IGV4cHJlc3Npb24gU0VNSQorICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCAoKExBKDEpID49IExTSElGVF9BU1NJR04pICYmIChMQSgxKSA8PSBMU0hJRlRfQVNTSUdOX0FGVEVSKSkgKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBDT05TVU1FKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBQRVJST1JSRUNPVkVSWT1BTlRMUjNfRkFMU0U7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBGQUlMRURGTEFHPUFOVExSM19GQUxTRTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGVsc2UKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19NSVNNQVRDSEVEX1NFVF9FWENFUFRJT047CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPm5hbWUgICAgICAgICA9ICh2b2lkICopQU5UTFIzX01JU01BVENIRURfU0VUX05BTUU7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPmV4cGVjdGluZ1NldCA9IE5VTEw7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9hc3NpZ25FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfYXNzaWduMTc4NDMpOworICAgICAgICAJICAgICAgICAJICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2Fzc2lnbkV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKFNFTUksICZGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc4NDYpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfYXNzaWduRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIGFjPSBORVdfU1RNVF9BU1NJR05fT1AoT1AoTFNISUZUKSwgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBsdgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgLCBlCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICApOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMTU6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTEwNTo0OiAoIFJTSElGVF9BU1NJR04gfCBSU0hJRlRfQVNTSUdOX0FGVEVSICkgZT0gZXhwcmVzc2lvbiBTRU1JCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoICgoTEEoMSkgPj0gUlNISUZUX0FTU0lHTikgJiYgKExBKDEpIDw9IFJTSElGVF9BU1NJR05fQUZURVIpKSApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIENPTlNVTUUoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIFBFUlJPUlJFQ09WRVJZPUFOVExSM19GQUxTRTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIEZBSUxFREZMQUc9QU5UTFIzX0ZBTFNFOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgZWxzZQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX01JU01BVENIRURfU0VUX0VYQ0VQVElPTjsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+bmFtZSAgICAgICAgID0gKHZvaWQgKilBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfTkFNRTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+ZXhwZWN0aW5nU2V0ID0gTlVMTDsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2Fzc2lnbkV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9hc3NpZ24xNzg2OCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfYXNzaWduRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoU0VNSSwgJkZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xNzg3MSk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9hc3NpZ25FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgYWM9IE5FV19TVE1UX0FTU0lHTl9PUChPUChSU0hJRlQpLCAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGx2CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAsIGUKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAJY2FzZSAxNjoKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1MTEyOjQ6IE9QX1BVU0ggZT0gZXhwcmVzc2lvbiAoIE9QX1BVU0ggZT0gZXhwcmVzc2lvbiApKiBTRU1JCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKE9QX1BVU0gsICZGT0xMT1dfT1BfUFVTSF9pbl9zdGF0ZW1lbnRfYXNzaWduMTc4ODcpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfYXNzaWduRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2Fzc2lnbjE3ODkyKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9hc3NpZ25FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgYWM9IE5FV19TVE1UMihPUChQVVNIKSwgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBsdgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgLCBlCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICApOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1MTE0OjQ6ICggT1BfUFVTSCBlPSBleHByZXNzaW9uICkqCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgZm9yICg7OykKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDQzNT0yOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgY2FzZSBPUF9QVVNIOgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkJYWx0NDM1PTE7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0NDM1KQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjUxMTQ6NjogT1BfUFVTSCBlPSBleHByZXNzaW9uCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKE9QX1BVU0gsICZGT0xMT1dfT1BfUFVTSF9pbl9zdGF0ZW1lbnRfYXNzaWduMTc5MDIpOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfYXNzaWduRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2Fzc2lnbjE3OTA3KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9hc3NpZ25FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgYWMKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIC0+YXBwZW5kKGUKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICk7IAorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJZGVmYXVsdDoKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICBnb3RvIGxvb3A0MzU7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGxvb3A0MzU6IDsgLyogSnVtcCBvdXQgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoU0VNSSwgJkZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xNzkxOCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9hc3NpZ25FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAljYXNlIDE3OgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjUxMjA6NDogT1BfQVNTSUdOX1RPUCBlPSBleHByZXNzaW9uIFNFTUkKKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoT1BfQVNTSUdOX1RPUCwgJkZPTExPV19PUF9BU1NJR05fVE9QX2luX3N0YXRlbWVudF9hc3NpZ24xNzkzMCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9hc3NpZ25FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfYXNzaWduMTc5MzUpOworICAgICAgICAJICAgICAgICAJICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2Fzc2lnbkV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKFNFTUksICZGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc5MzgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfYXNzaWduRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIGFjPSBORVdfU1RNVDIoT1AoQVNTSUdOX1RPUCksIAorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgbHYKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICwgZQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAljYXNlIDE4OgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjUxMjY6NDogT1BfVE9QIHY9IGx2YWx1ZSBTRU1JCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKE9QX1RPUCwgJkZPTExPV19PUF9UT1BfaW5fc3RhdGVtZW50X2Fzc2lnbjE3OTUzKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2Fzc2lnbkV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19sdmFsdWVfaW5fc3RhdGVtZW50X2Fzc2lnbjE3OTU4KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgdj1sdmFsdWUoY3R4KTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2Fzc2lnbkV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKFNFTUksICZGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc5NjEpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfYXNzaWduRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIGFjPSBORVdfU1RNVDIoT1AoVE9QKSwgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBsdgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgLCB2CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICApOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMTk6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTEzMjo0OiBPUF9QT1AgKHY9IGx2YWx1ZSApKiBTRU1JCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKE9QX1BPUCwgJkZPTExPV19PUF9QT1BfaW5fc3RhdGVtZW50X2Fzc2lnbjE3OTc2KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2Fzc2lnbkV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICBhYz0gTkVXX1NUTVQxKE9QKFBPUCksIAorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgbHYKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjUxMzM6NDogKHY9IGx2YWx1ZSApKgorCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGZvciAoOzspCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQ0MzY9MjsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGNhc2UgQ09MT054MjoKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGNhc2UgSUQ6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCQlhbHQ0MzY9MTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQ0MzYpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTEzMzo2OiB2PSBsdmFsdWUKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2x2YWx1ZV9pbl9zdGF0ZW1lbnRfYXNzaWduMTc5OTIpOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB2PWx2YWx1ZShjdHgpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfYXNzaWduRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIGFjCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAtPmFwcGVuZCh2CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICApOyAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCWRlZmF1bHQ6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgZ290byBsb29wNDM2OwkvKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgKi8KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBsb29wNDM2OiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKFNFTUksICZGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTgwMDMpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfYXNzaWduRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAJY2FzZSAyMDoKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1MTM3OjQ6IElOQ1IgU0VNSQorICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChJTkNSLCAmRk9MTE9XX0lOQ1JfaW5fc3RhdGVtZW50X2Fzc2lnbjE4MDExKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2Fzc2lnbkV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKFNFTUksICZGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYXNzaWduMTgwMTQpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfYXNzaWduRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIGFjPSBORVdfU1RNVF9BU1NJR05fT1AoT1AoUExVUyksIAorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgbHYKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICwKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkJc2VwOjpFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfT05FKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAljYXNlIDIxOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjUxNDI6NDogREVDUiBTRU1JCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKERFQ1IsICZGT0xMT1dfREVDUl9pbl9zdGF0ZW1lbnRfYXNzaWduMTgwMjUpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfYXNzaWduRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoU0VNSSwgJkZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xODAyOCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9hc3NpZ25FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgYWM9IE5FV19TVE1UX0FTU0lHTl9PUChPUChQTFVTKSwgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBsdgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgLAorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCQlzZXA6OkV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9NSU5VU19PTkUpOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDI6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTE1NDo0OiBJTkNSIGx2PSBsdmFsdWUgU0VNSQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChJTkNSLCAmRk9MTE9XX0lOQ1JfaW5fc3RhdGVtZW50X2Fzc2lnbjE4MDQ4KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2Fzc2lnbkV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19sdmFsdWVfaW5fc3RhdGVtZW50X2Fzc2lnbjE4MDUzKTsKKyAgICAgICAgCSAgICAgICAgbHY9bHZhbHVlKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9hc3NpZ25FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChTRU1JLCAmRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2Fzc2lnbjE4MDU2KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2Fzc2lnbkV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBhYz0gTkVXX1NUTVRfQVNTSUdOX09QKE9QKFBMVVMpLCAKKyAgICAgICAgCSAgICAgICAgICAgIGx2CisgICAgICAgIAkgICAgICAgICAgICAsCisgICAgICAgIAkgICAgICAgICAgICAJCXNlcDo6RXhwcmVzc2lvbkNvbnN0YW50OjpJTlRFR0VSX09ORSk7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAzOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjUxNTk6NDogREVDUiBsdj0gbHZhbHVlIFNFTUkKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoREVDUiwgJkZPTExPV19ERUNSX2luX3N0YXRlbWVudF9hc3NpZ24xODA2Nyk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9hc3NpZ25FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfbHZhbHVlX2luX3N0YXRlbWVudF9hc3NpZ24xODA3Mik7CisgICAgICAgIAkgICAgICAgIGx2PWx2YWx1ZShjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfYXNzaWduRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgICBNQVRDSFQoU0VNSSwgJkZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hc3NpZ24xODA3NSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9hc3NpZ25FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgYWM9IE5FV19TVE1UX0FTU0lHTl9PUChPUChQTFVTKSwgCisgICAgICAgIAkgICAgICAgICAgICBsdgorICAgICAgICAJICAgICAgICAgICAgLAorICAgICAgICAJICAgICAgICAgICAgCQlzZXA6OkV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9NSU5VU19PTkUpOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlc3RhdGVtZW50X2Fzc2lnbkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZXN0YXRlbWVudF9hc3NpZ25FeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDE4OSwgc3RhdGVtZW50X2Fzc2lnbl9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIGFjOworfQorLyogJEFOVExSIGVuZCBzdGF0ZW1lbnRfYXNzaWduICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGx2YWx1ZQorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTE2NToxOiBsdmFsdWUgcmV0dXJucyBbIHNlcDo6QkYgYmYgXSA6ICggQ09MT054MiApPyBpZD0gSUQgKCAoIERPVCBpZD0gSUQgKSB8ICggTEJSQUNLRVQgZT0gZXhwcmVzc2lvbiBSQlJBQ0tFVCApICkqIDsKKyAqLworc3RhdGljIHNlcDo6QkYKK2x2YWx1ZShwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBzZXA6OkJGIGJmOworCisgICAgQU5UTFIzX1VJTlQzMiBsdmFsdWVfU3RhcnRJbmRleDsKKworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIGlkOworICAgIHNlcDo6QkYgZTsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfZQorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfZSBzZXA6OkJGCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgbHZhbHVlX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKworICAgIAlzZXA6OlVuaUZvcm1JZGVudGlmaWVyICogdWZpOworICAgIAlzZXA6OkJGIGJmVWZpOyAvLyBmb3IgYXV0b21hdGljIGRlc3RydWN0aW9uIG9mIDw8IFVGSSA+PiBpZiBuZWVkCisKKyAgICAJc2VwOjphdm1fc2l6ZV90IGNvdW50SUQgPSAxOworICAgIAlib29sIGlzbm90RVhQUiA9IHRydWU7CisKKyAgICAJU0FWRV9SVUxFX0JFR0lOX0xPQ0FUSU9OOworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgxOTApKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIGJmOworICAgIH0KKworICAgIGlkICAgICAgID0gTlVMTDsKKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTE3NjoyOiAoICggQ09MT054MiApPyBpZD0gSUQgKCAoIERPVCBpZD0gSUQgKSB8ICggTEJSQUNLRVQgZT0gZXhwcmVzc2lvbiBSQlJBQ0tFVCApICkqICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTE3Njo0OiAoIENPTE9OeDIgKT8gaWQ9IElEICggKCBET1QgaWQ9IElEICkgfCAoIExCUkFDS0VUIGU9IGV4cHJlc3Npb24gUkJSQUNLRVQgKSApKgorICAgICAgICB7CisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1MTc2OjQ6ICggQ09MT054MiApPworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQ0Mzk9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9OeDI6CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJYWx0NDM5PTE7CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDQzOSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1MTc2OjY6IENPTE9OeDIKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChDT0xPTngyLCAmRk9MTE9XX0NPTE9OeDJfaW5fbHZhbHVlMTgxMDApOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVsdmFsdWVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICB1ZmktPnNldEFic29sdXRlKCk7IAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWQgPSAocEFOVExSM19DT01NT05fVE9LRU4pIE1BVENIVChJRCwgJkZPTExPV19JRF9pbl9sdmFsdWUxODExMik7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWx2YWx1ZUV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAJICAJdWZpID0gbmV3IHNlcDo6VW5pRm9ybUlkZW50aWZpZXIoZmFsc2UpOworICAgICAgICAgICAgICAgIAkgIAliZlVmaSA9IHVmaTsKKworICAgICAgICAgICAgICAgIAkJaWYoIChiZj0gc2VwOjpQYXJzZXJVdGlsOjpnZXR2YXIoU1RSKChpZC0+Z2V0VGV4dChpZCkpLT5jaGFycyksIDEpKS52YWxpZCgpICkKKyAgICAgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgICAgICAJCSAgCXVmaS0+YXBwZW5kRmllbGRWYXJpYWJsZSgKKyAgICAgICAgICAgICAgICBiZgorICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgICAgICAJCWVsc2UgaWYoIChiZj0gc2VwOjpQYXJzZXJVdGlsOjpnZXR2YXJNYWNoaW5lKAorICAgICAgICAgICAgICAgIAkJCQlTVFIoKGlkLT5nZXRUZXh0KGlkKSktPmNoYXJzKSwgMSkpLnZhbGlkKCkgKQorICAgICAgICAgICAgICAgIAkJeworICAgICAgICAgICAgICAgIAkJICAJdWZpLT5hcHBlbmRGaWVsZE1hY2hpbmUoCisgICAgICAgICAgICAgICAgYmYKKyAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAgICAgCQllbHNlCisgICAgICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAgICAgCQkgIAl1ZmktPmFwcGVuZEZpZWxkKFNUUigoaWQtPmdldFRleHQoaWQpKS0+Y2hhcnMpKTsKKyAgICAgICAgICAgICAgICAJCX0KKworICAgICAgICAgICAgICAgIAkJCisgICAgICAgICAgICAgICAgYmY9IGJmVWZpOworCisgICAgICAgICAgICAgICAgCSAgCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTE5OTo0OiAoICggRE9UIGlkPSBJRCApIHwgKCBMQlJBQ0tFVCBlPSBleHByZXNzaW9uIFJCUkFDS0VUICkgKSoKKworICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0NDQwPTM7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIERPVDoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0NDQwPTE7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBMQlJBQ0tFVDoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0NDQwPTI7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ0MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1MTk5OjY6ICggRE9UIGlkPSBJRCApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjUxOTk6NjogKCBET1QgaWQ9IElEICkKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjUxOTk6ODogRE9UIGlkPSBJRAorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBNQVRDSFQoRE9ULCAmRk9MTE9XX0RPVF9pbl9sdmFsdWUxODEyNyk7CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZWx2YWx1ZUV4OworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZCA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTikgTUFUQ0hUKElELCAmRk9MTE9XX0lEX2luX2x2YWx1ZTE4MTMxKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlbHZhbHVlRXg7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICB1ZmktPmFwcGVuZEZpZWxkKFNUUigoaWQtPmdldFRleHQoaWQpKS0+Y2hhcnMpKTsgICsrY291bnRJRDsgCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAyOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1MjAyOjY6ICggTEJSQUNLRVQgZT0gZXhwcmVzc2lvbiBSQlJBQ0tFVCApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjUyMDI6NjogKCBMQlJBQ0tFVCBlPSBleHByZXNzaW9uIFJCUkFDS0VUICkKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjUyMDI6ODogTEJSQUNLRVQgZT0gZXhwcmVzc2lvbiBSQlJBQ0tFVAorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBNQVRDSFQoTEJSQUNLRVQsICZGT0xMT1dfTEJSQUNLRVRfaW5fbHZhbHVlMTgxNTApOworICAgICAgICAgICAgCSAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVsdmFsdWVFeDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9sdmFsdWUxODE1NSk7CisgICAgICAgICAgICAJICAgICAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlbHZhbHVlRXg7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgICAgICBNQVRDSFQoUkJSQUNLRVQsICZGT0xMT1dfUkJSQUNLRVRfaW5fbHZhbHVlMTgxNTgpOworICAgICAgICAgICAgCSAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVsdmFsdWVFeDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgIHVmaS0+YXBwZW5kSW5kZXgoZQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICApOyBpc25vdEVYUFIgPSBmYWxzZTsgCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAgICAgCSAgICBnb3RvIGxvb3A0NDA7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb29wNDQwOiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgCQlpZiggaXNub3RFWFBSICkKKyAgICAgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgICAgICAJCQlpZiggY291bnRJRCA9PSAxICkKKyAgICAgICAgICAgICAgICAJCQl7CisgICAgICAgICAgICAgICAgCQkJCWJmPSB1ZmktPmZpcnN0KCk7CisKKyAgICAgICAgICAgICAgICAJCQl9CisgICAgICAgICAgICAgICAgCQkJZWxzZSBpZiggKGJmPSBzZXA6OlBhcnNlclV0aWw6OmdldHZhcigKKyAgICAgICAgICAgICAgICAJCQkJCXVmaS0+c3RyKCksIGNvdW50SUQpKS5pbnZhbGlkKCkgKQorICAgICAgICAgICAgICAgIAkJCXsKKyAgICAgICAgICAgICAgICAJCQkJCisgICAgICAgICAgICAgICAgYmYKKyAgICAgICAgICAgICAgICAgPSBiZlVmaTsKKworICAgICAgICAgICAgICAgIAkJCQlTRVRfUlVMRV9MT0NBVElPTih1ZmkpOworICAgICAgICAgICAgICAgIAkJCX0KKyAgICAgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgICAgICAJCisgICAgICAgICAgICB9CisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVsdmFsdWVFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVsdmFsdWVFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDE5MCwgbHZhbHVlX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gYmY7Cit9CisvKiAkQU5UTFIgZW5kIGx2YWx1ZSAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBwYXJhbWV0ZXJzCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1MjcyOjE6IHBhcmFtZXRlcnNbIGNvbnN0IHNlcDo6QkZDb2RlICYgYWMgXSA6IExQQVJFTiBlPSBleHByZXNzaW9uICggQ09NTUEgZT0gZXhwcmVzc2lvbiApKiBSUEFSRU4gOworICovCitzdGF0aWMgdm9pZAorcGFyYW1ldGVycyhwZm1sUGFyc2VyIGN0eCwgY29uc3Qgc2VwOjpCRkNvZGUgJiBhYykKK3sKKyAgICBBTlRMUjNfVUlOVDMyIHBhcmFtZXRlcnNfU3RhcnRJbmRleDsKKworICAgIHNlcDo6QkYgZTsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfZQorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfZSBzZXA6OkJGCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgcGFyYW1ldGVyc19TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgxOTEpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjUyNzM6MjogKCBMUEFSRU4gZT0gZXhwcmVzc2lvbiAoIENPTU1BIGU9IGV4cHJlc3Npb24gKSogUlBBUkVOICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTI3Mzo0OiBMUEFSRU4gZT0gZXhwcmVzc2lvbiAoIENPTU1BIGU9IGV4cHJlc3Npb24gKSogUlBBUkVOCisgICAgICAgIHsKKyAgICAgICAgICAgICBNQVRDSFQoTFBBUkVOLCAmRk9MTE9XX0xQQVJFTl9pbl9wYXJhbWV0ZXJzMTgyMzkpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVwYXJhbWV0ZXJzRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX3BhcmFtZXRlcnMxODI0NCk7CisgICAgICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXBhcmFtZXRlcnNFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgYWMtPmFwcGVuZCgKKyAgICAgICAgICAgICAgICBlCisgICAgICAgICAgICAgICAgKTsgCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTI3NDo0OiAoIENPTU1BIGU9IGV4cHJlc3Npb24gKSoKKworICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0NDQxPTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIENPTU1BOgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQ0NDE9MTsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NDQxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjUyNzQ6NjogQ09NTUEgZT0gZXhwcmVzc2lvbgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKENPTU1BLCAmRk9MTE9XX0NPTU1BX2luX3BhcmFtZXRlcnMxODI1NCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXBhcmFtZXRlcnNFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fcGFyYW1ldGVyczE4MjU4KTsKKyAgICAgICAgICAgIAkgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlcGFyYW1ldGVyc0V4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBhYy0+YXBwZW5kKAorICAgICAgICAgICAgCSAgICAgICAgICAgIGUKKyAgICAgICAgICAgIAkgICAgICAgICAgICApOyAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAgICAgCSAgICBnb3RvIGxvb3A0NDE7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb29wNDQxOiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICAgICAgIE1BVENIVChSUEFSRU4sICZGT0xMT1dfUlBBUkVOX2luX3BhcmFtZXRlcnMxODI3MCk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXBhcmFtZXRlcnNFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlcGFyYW1ldGVyc0V4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZXBhcmFtZXRlcnNFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDE5MSwgcGFyYW1ldGVyc19TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgcGFyYW1ldGVycyAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBzdGF0ZW1lbnRfY29tCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1MjgzOjE6IHN0YXRlbWVudF9jb20gcmV0dXJucyBbIHNlcDo6QkZDb2RlIGFjIF0gOiAocz0gc3RhdGVtZW50X2NvbV9pbnB1dCB8cz0gc3RhdGVtZW50X2NvbV9vdXRwdXQgKTsKKyAqLworc3RhdGljIHNlcDo6QkZDb2RlCitzdGF0ZW1lbnRfY29tKHBmbWxQYXJzZXIgY3R4KQoreworICAgIHNlcDo6QkZDb2RlIGFjOworCisgICAgQU5UTFIzX1VJTlQzMiBzdGF0ZW1lbnRfY29tX1N0YXJ0SW5kZXg7CisKKyAgICBzZXA6OkJGQ29kZSBzOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9zCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9zIHNlcDo6QkZDb2RlCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgc3RhdGVtZW50X2NvbV9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgxOTIpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIGFjOworICAgIH0KKworICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjUyODU6MjogKHM9IHN0YXRlbWVudF9jb21faW5wdXQgfHM9IHN0YXRlbWVudF9jb21fb3V0cHV0ICkKKworICAgICAgICAgICAgQU5UTFIzX1VJTlQzMiBhbHQ0NDI7CisKKyAgICAgICAgICAgIGFsdDQ0Mj0yOworCisgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDI5OToKKyAgICAgICAgICAgIGNhc2UgMzAwOgorICAgICAgICAgICAgY2FzZSAzMDE6CisgICAgICAgICAgICBjYXNlIDMwMjoKKyAgICAgICAgICAgIGNhc2UgMzAzOgorICAgICAgICAgICAgY2FzZSAzMDQ6CisgICAgICAgICAgICBjYXNlIDMwNToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQ0Mj0xOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzM2OgorICAgICAgICAgICAgY2FzZSAzMzc6CisgICAgICAgICAgICBjYXNlIDMzODoKKyAgICAgICAgICAgIGNhc2UgMzM5OgorICAgICAgICAgICAgY2FzZSAzNDA6CisgICAgICAgICAgICBjYXNlIDM0MToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQ0Mj0yOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDQ0MjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9jb21FeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ0MikKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1Mjg1OjQ6IHM9IHN0YXRlbWVudF9jb21faW5wdXQKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3N0YXRlbWVudF9jb21faW5wdXRfaW5fc3RhdGVtZW50X2NvbTE4MjkyKTsKKyAgICAgICAgCSAgICAgICAgcz1zdGF0ZW1lbnRfY29tX2lucHV0KGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9jb21FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgYWM9IAorICAgICAgICAJICAgICAgICAgICAgcworICAgICAgICAJICAgICAgICAgICAgOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1Mjg2OjQ6IHM9IHN0YXRlbWVudF9jb21fb3V0cHV0CisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19zdGF0ZW1lbnRfY29tX291dHB1dF9pbl9zdGF0ZW1lbnRfY29tMTgzMDMpOworICAgICAgICAJICAgICAgICBzPXN0YXRlbWVudF9jb21fb3V0cHV0KGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9jb21FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgYWM9IAorICAgICAgICAJICAgICAgICAgICAgcworICAgICAgICAJICAgICAgICAgICAgOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlc3RhdGVtZW50X2NvbUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZXN0YXRlbWVudF9jb21FeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDE5Miwgc3RhdGVtZW50X2NvbV9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIGFjOworfQorLyogJEFOVExSIGVuZCBzdGF0ZW1lbnRfY29tICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IHN0YXRlbWVudF9jb21faW5wdXQKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjUyODk6MTogc3RhdGVtZW50X2NvbV9pbnB1dCByZXR1cm5zIFsgc2VwOjpCRkNvZGUgYWMgXSA6ICh0b2s9ICdpbnB1dCcgfHRvaz0gJ2lucHV0I3NhdmUnIHx0b2s9ICdpbnB1dCN2YXInIHx0b2s9ICdpbnB1dCNmbG93JyB8dG9rPSAnaW5wdXQjZW52JyB8dG9rPSAnaW5wdXQjYnVmZmVyJyB8dG9rPSAnaW5wdXQjcmR2JyApIGlkPSBxdWFsaWZpZWROYW1lSUQgKCBwYXJhbWV0ZXJzX3BvcnRbIHBvcnQgLCBhYyBdICk/ICggJzwtLScgKCAnZW52JyB8bWU9IGV4cHJlc3Npb24gKSAoICc8LScgaWQ9IHF1YWxpZmllZE5hbWVJRCApPyApPyAoICggJzw9PScgfCAndmlhJyApIGlkPSBxdWFsaWZpZWROYW1lSUQgKT8gU0VNSSA7CisgKi8KK3N0YXRpYyBzZXA6OkJGQ29kZQorc3RhdGVtZW50X2NvbV9pbnB1dChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBzZXA6OkJGQ29kZSBhYzsKKworICAgIEFOVExSM19VSU5UMzIgc3RhdGVtZW50X2NvbV9pbnB1dF9TdGFydEluZGV4OworCisgICAgcEFOVExSM19DT01NT05fVE9LRU4gICAgdG9rOworICAgIGZtbFBhcnNlcl9xdWFsaWZpZWROYW1lSURfcmV0dXJuIGlkOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9pZAorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfaWQgZm1sUGFyc2VyX3F1YWxpZmllZE5hbWVJRF9yZXR1cm4KKworICAgIHNlcDo6QkYgbWU7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX21lCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9tZSBzZXA6OkJGCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgc3RhdGVtZW50X2NvbV9pbnB1dF9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisKKyAgICAJc2VwOjpCRiB2YXJQb3J0U2lnbmFsOworICAgIAlzZXA6OlBvcnQgKiBwb3J0ID0gTlVMTDsKKyAgICAJc2VwOjpPcGVyYXRvciAqIG9wID0gTlVMTDsKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTkzKSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiBhYzsKKyAgICB9CisKKyAgICB0b2sgICAgICAgPSBOVUxMOworCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1Mjk2OjI6ICggKHRvaz0gJ2lucHV0JyB8dG9rPSAnaW5wdXQjc2F2ZScgfHRvaz0gJ2lucHV0I3ZhcicgfHRvaz0gJ2lucHV0I2Zsb3cnIHx0b2s9ICdpbnB1dCNlbnYnIHx0b2s9ICdpbnB1dCNidWZmZXInIHx0b2s9ICdpbnB1dCNyZHYnICkgaWQ9IHF1YWxpZmllZE5hbWVJRCAoIHBhcmFtZXRlcnNfcG9ydFsgcG9ydCAsIGFjIF0gKT8gKCAnPC0tJyAoICdlbnYnIHxtZT0gZXhwcmVzc2lvbiApICggJzwtJyBpZD0gcXVhbGlmaWVkTmFtZUlEICk/ICk/ICggKCAnPD09JyB8ICd2aWEnICkgaWQ9IHF1YWxpZmllZE5hbWVJRCApPyBTRU1JICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTI5Njo0OiAodG9rPSAnaW5wdXQnIHx0b2s9ICdpbnB1dCNzYXZlJyB8dG9rPSAnaW5wdXQjdmFyJyB8dG9rPSAnaW5wdXQjZmxvdycgfHRvaz0gJ2lucHV0I2VudicgfHRvaz0gJ2lucHV0I2J1ZmZlcicgfHRvaz0gJ2lucHV0I3JkdicgKSBpZD0gcXVhbGlmaWVkTmFtZUlEICggcGFyYW1ldGVyc19wb3J0WyBwb3J0ICwgYWMgXSApPyAoICc8LS0nICggJ2VudicgfG1lPSBleHByZXNzaW9uICkgKCAnPC0nIGlkPSBxdWFsaWZpZWROYW1lSUQgKT8gKT8gKCAoICc8PT0nIHwgJ3ZpYScgKSBpZD0gcXVhbGlmaWVkTmFtZUlEICk/IFNFTUkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTI5Njo0OiAodG9rPSAnaW5wdXQnIHx0b2s9ICdpbnB1dCNzYXZlJyB8dG9rPSAnaW5wdXQjdmFyJyB8dG9rPSAnaW5wdXQjZmxvdycgfHRvaz0gJ2lucHV0I2VudicgfHRvaz0gJ2lucHV0I2J1ZmZlcicgfHRvaz0gJ2lucHV0I3JkdicgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQ0NDM9NzsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgMzA1OgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQ0NDM9MTsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDMwMzoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0NDQzPTI7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzMDQ6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDQ0Mz0zOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzAxOgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQ0NDM9NDsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDMwMDoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0NDQzPTU7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOTk6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDQ0Mz02OworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzAyOgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQ0NDM9NzsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA0NDM7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9jb21faW5wdXRFeDsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NDQzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjUyOTY6NjogdG9rPSAnaW5wdXQnCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIHRvayA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTikgTUFUQ0hUKDMwNSwgJkZPTExPV18zMDVfaW5fc3RhdGVtZW50X2NvbV9pbnB1dDE4MzI5KTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2NvbV9pbnB1dEV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIG9wID0gT1AoSU5QVVQpOyAgICAgICAgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTI5Nzo2OiB0b2s9ICdpbnB1dCNzYXZlJworICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICB0b2sgPSAocEFOVExSM19DT01NT05fVE9LRU4pIE1BVENIVCgzMDMsICZGT0xMT1dfMzAzX2luX3N0YXRlbWVudF9jb21faW5wdXQxODM0Nyk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9jb21faW5wdXRFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBvcCA9IE9QKElOUFVUX1NBVkUpOyAgIAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDM6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjUyOTg6NjogdG9rPSAnaW5wdXQjdmFyJworICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICB0b2sgPSAocEFOVExSM19DT01NT05fVE9LRU4pIE1BVENIVCgzMDQsICZGT0xMT1dfMzA0X2luX3N0YXRlbWVudF9jb21faW5wdXQxODM2MCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9jb21faW5wdXRFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBvcCA9IE9QKElOUFVUX1ZBUik7ICAgIAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDQ6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjUyOTk6NjogdG9rPSAnaW5wdXQjZmxvdycKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgdG9rID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoMzAxLCAmRk9MTE9XXzMwMV9pbl9zdGF0ZW1lbnRfY29tX2lucHV0MTgzNzQpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfY29tX2lucHV0RXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgb3AgPSBPUChJTlBVVF9GTE9XKTsgICAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSA1OgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1MzAwOjY6IHRvaz0gJ2lucHV0I2VudicKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgdG9rID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoMzAwLCAmRk9MTE9XXzMwMF9pbl9zdGF0ZW1lbnRfY29tX2lucHV0MTgzODcpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfY29tX2lucHV0RXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgb3AgPSBPUChJTlBVVF9FTlYpOyAgICAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSA2OgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1MzAxOjY6IHRvaz0gJ2lucHV0I2J1ZmZlcicKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgdG9rID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoMjk5LCAmRk9MTE9XXzI5OV9pbl9zdGF0ZW1lbnRfY29tX2lucHV0MTg0MDEpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfY29tX2lucHV0RXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgb3AgPSBPUChJTlBVVF9CVUZGRVIpOyAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSA3OgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1MzAyOjY6IHRvaz0gJ2lucHV0I3JkdicKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgdG9rID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoMzAyLCAmRk9MTE9XXzMwMl9pbl9zdGF0ZW1lbnRfY29tX2lucHV0MTg0MTIpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfY29tX2lucHV0RXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgb3AgPSBPUChJTlBVVF9SRFYpOyAgICAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9zdGF0ZW1lbnRfY29tX2lucHV0MTg0MjYpOworICAgICAgICAgICAgaWQ9cXVhbGlmaWVkTmFtZUlEKGN0eCk7CisKKyAgICAgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfY29tX2lucHV0RXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIAkgIAlhYz0gTkVXX1NUTVQxKCBvcCwKKyAgICAgICAgICAgICAgICAJICAJCXZhclBvcnRTaWduYWwgPSBzZXA6OlBhcnNlclV0aWw6OmdldHZhclBvcnRTaWduYWwoCisgICAgICAgICAgICAgICAgaWQucworICAgICAgICAgICAgICAgICwgaWQubmIKKyAgICAgICAgICAgICAgICApICk7CisKKyAgICAgICAgICAgICAgICAJICAJaWYoIHZhclBvcnRTaWduYWwuaXM8IHNlcDo6UG9ydCA+KCkgKQorICAgICAgICAgICAgICAgIAkgIAl7IHBvcnQgPSB2YXJQb3J0U2lnbmFsLnRvX3B0cjwgc2VwOjpQb3J0ID4oKTsgfQorICAgICAgICAgICAgICAgIAkgIAllbHNlIGlmKCB2YXJQb3J0U2lnbmFsLmludmFsaWQoKSApCisgICAgICAgICAgICAgICAgCSAgCXsKKyAgICAgICAgICAgICAgICAJICAJCXNlcDo6UGFyc2VyVXRpbDo6YXZtX3N5bnRheF9lcnJvcigKKyAgICAgICAgICAgICAgICAJICAJCQkic3RhdGVtZW50X2NvbV9pbnB1dDo+ICIsICh0b2stPmdldExpbmUodG9rKSkgKQorICAgICAgICAgICAgICAgIAkgIAkJCQk8PCAiVW5mb3VuZCBwb3J0L3NpZ25hbCBvciB2YXJpYWJsZSA8ICIgPDwgCisgICAgICAgICAgICAgICAgaWQucworCisgICAgICAgICAgICAgICAgCSAgCQkJCTw8ICIgPiBpbiBtYWNoaW5lIDwgIiA8PCBzdHJfaGVhZGVyKCBfQ1BNXyApIDw8ICIgPiIKKyAgICAgICAgICAgICAgICAJICAJCQkJPDwgc2VwOjpQYXJzZXJVdGlsOjpTWU5UQVhfRVJST1JfRU9MOworICAgICAgICAgICAgICAgIAkgIAl9CisgICAgICAgICAgICAgICAgCSAgCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTMxODo0OiAoIHBhcmFtZXRlcnNfcG9ydFsgcG9ydCAsIGFjIF0gKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0NDQ0PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMUEFSRU46CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJYWx0NDQ0PTE7CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ0NCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1MzE4OjQ6IHBhcmFtZXRlcnNfcG9ydFsgcG9ydCAsIGFjIF0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfcGFyYW1ldGVyc19wb3J0X2luX3N0YXRlbWVudF9jb21faW5wdXQxODQzNik7CisgICAgICAgICAgICAJICAgICAgICBwYXJhbWV0ZXJzX3BvcnQoY3R4LCBwb3J0LCBhYyk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfY29tX2lucHV0RXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTMxOTo0OiAoICc8LS0nICggJ2VudicgfG1lPSBleHByZXNzaW9uICkgKCAnPC0nIGlkPSBxdWFsaWZpZWROYW1lSUQgKT8gKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0NDQ3PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjU6CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJYWx0NDQ3PTE7CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ0NykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1MzE5OjY6ICc8LS0nICggJ2VudicgfG1lPSBleHByZXNzaW9uICkgKCAnPC0nIGlkPSBxdWFsaWZpZWROYW1lSUQgKT8KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVCgxNjUsICZGT0xMT1dfMTY1X2luX3N0YXRlbWVudF9jb21faW5wdXQxODQ0Nik7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9jb21faW5wdXRFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTMyMDo2OiAoICdlbnYnIHxtZT0gZXhwcmVzc2lvbiApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDQ0NT0yOworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSAyNzc6CisgICAgICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCSAgICBpbnQgTEE0NDVfMSA9IExBKDIpOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgIGlmICggKHN5bnByZWQ4NjFfZm1sKGN0eCkpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCSAgICAgICAgYWx0NDQ1PTE7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgIGVsc2UgaWYgKCAoQU5UTFIzX1RSVUUpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCSAgICAgICAgYWx0NDQ1PTI7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgIGVsc2UKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQkgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCSAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDQ0NTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCSAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAxOworCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCSAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2NvbV9pbnB1dEV4OworCisgICAgICAgICAgICAJICAgICAgICAgICAgCQkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgQk5PVDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIENPTE9OeDI6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBDaGFyTGl0ZXJhbDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIERFQ1I6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBET0xMQVJfTENVUkxZOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgRmxvYXRMaXRlcmFsOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgSUQ6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBJTkNSOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgSW50ZWdlckxpdGVyYWw6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBMQlJBQ0tFVDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIExCUkFDS0VUX0JBUjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIExDVVJMWToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIExOT1Q6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBMUEFSRU46CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBMUEFSRU5fSU5WT0tFOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgTUlOVVM6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBPUF9QT1A6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBPUF9UT1A6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBQRVJDRU5UX0xDVVJMWToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIFBMVVM6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBSYXRpb25hbExpdGVyYWw6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBTdHJpbmdMaXRlcmFsOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMTU4OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMTU5OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMTYwOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMTYxOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMTYyOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjM3OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjU2OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjY1OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjgwOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjk0OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzEzOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzMwOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzMxOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzMyOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzQzOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzQ3OgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzcyOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzk3OgorICAgICAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQlhbHQ0NDU9MjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA0NDU7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9jb21faW5wdXRFeDsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0NDQ1KQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjUzMjA6ODogJ2VudicKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVCgyNzcsICZGT0xMT1dfMjc3X2luX3N0YXRlbWVudF9jb21faW5wdXQxODQ1NSk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9jb21faW5wdXRFeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICBhYworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIC0+c2V0T3BlcmF0b3IoIE9QKElOUFVUX0VOVikgKTsgCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTMyMTo4OiBtZT0gZXhwcmVzc2lvbgorICAgICAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9jb21faW5wdXQxODQ2OSk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBtZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfY29tX2lucHV0RXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkJCXNlcDo6QkZDb2RlIGlucHV0RnJvbSA9IE5FV19TVE1UMihPUChJTlBVVF9GUk9NKSwgYWMKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAtPmZpcnN0KCksIG1lCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkJCWlucHV0RnJvbS0+aW5zZXJ0KGlucHV0RnJvbS0+ZW5kKCksICsrKGFjCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgLT5iZWdpbigpKSwgYWMKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAtPmVuZCgpKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJCQlhYz0gaW5wdXRGcm9tOworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCQkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjUzMjk6NjogKCAnPC0nIGlkPSBxdWFsaWZpZWROYW1lSUQgKT8KKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0NDQ2PTI7CisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBBU1NJR05fUkVGOgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJCWFsdDQ0Nj0xOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQ0NDYpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTMyOTo4OiAnPC0nIGlkPSBxdWFsaWZpZWROYW1lSUQKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChBU1NJR05fUkVGLCAmRk9MTE9XX0FTU0lHTl9SRUZfaW5fc3RhdGVtZW50X2NvbV9pbnB1dDE4NDg5KTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2NvbV9pbnB1dEV4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fc3RhdGVtZW50X2NvbV9pbnB1dDE4NDkzKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlkPXF1YWxpZmllZE5hbWVJRChjdHgpOworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2NvbV9pbnB1dEV4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIGFjCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgLT5hcHBlbmQoc2VwOjpQYXJzZXJVdGlsOjpnZXR2YXJQb3J0U2lnbmFsKGlkLnMKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAsIGlkLm5iCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgKSk7IAorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1MzMzOjQ6ICggKCAnPD09JyB8ICd2aWEnICkgaWQ9IHF1YWxpZmllZE5hbWVJRCApPworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQ0NDg9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDE2NzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0MTM6CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJYWx0NDQ4PTE7CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ0OCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1MzMzOjY6ICggJzw9PScgfCAndmlhJyApIGlkPSBxdWFsaWZpZWROYW1lSUQKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBMQSgxKSA9PSAxNjcgfHwgTEEoMSkgPT0gNDEzICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBDT05TVU1FKCk7CisgICAgICAgICAgICAJICAgICAgICAgICAgUEVSUk9SUkVDT1ZFUlk9QU5UTFIzX0ZBTFNFOworICAgICAgICAgICAgCSAgICAgICAgICAgIEZBSUxFREZMQUc9QU5UTFIzX0ZBTFNFOworCisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBlbHNlCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19NSVNNQVRDSEVEX1NFVF9FWENFUFRJT047CisgICAgICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT5uYW1lICAgICAgICAgPSAodm9pZCAqKUFOVExSM19NSVNNQVRDSEVEX1NFVF9OQU1FOworICAgICAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+ZXhwZWN0aW5nU2V0ID0gTlVMTDsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9jb21faW5wdXRFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fc3RhdGVtZW50X2NvbV9pbnB1dDE4NTMzKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlkPXF1YWxpZmllZE5hbWVJRChjdHgpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2NvbV9pbnB1dEV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIHNlcDo6UGFyc2VyVXRpbDo6dXBkYXRlU2lnbmFsUm91dGluZ0NoYW5uZWwoCisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgCQlzZXA6Ok1vZGlmaWVyOjpESVJFQ1RJT05fSU5QVVRfS0lORCwgYWMKKyAgICAgICAgICAgIAkgICAgICAgICAgICAsIGlkLnMKKyAgICAgICAgICAgIAkgICAgICAgICAgICAsIGlkLm5iCisgICAgICAgICAgICAJICAgICAgICAgICAgKTsgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgTUFUQ0hUKFNFTUksICZGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfY29tX2lucHV0MTg1NDkpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfY29tX2lucHV0RXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlc3RhdGVtZW50X2NvbV9pbnB1dEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZXN0YXRlbWVudF9jb21faW5wdXRFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDE5Mywgc3RhdGVtZW50X2NvbV9pbnB1dF9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIGFjOworfQorLyogJEFOVExSIGVuZCBzdGF0ZW1lbnRfY29tX2lucHV0ICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IHN0YXRlbWVudF9jb21fb3V0cHV0CisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1MzQwOjE6IHN0YXRlbWVudF9jb21fb3V0cHV0IHJldHVybnMgWyBzZXA6OkJGQ29kZSBhYyBdIDogKHRvaz0gJ291dHB1dCcgfHRvaz0gJ291dHB1dCN2YXInIHx0b2s9ICdvdXRwdXQjZmxvdycgfHRvaz0gJ291dHB1dCNlbnYnIHx0b2s9ICdvdXRwdXQjYnVmZmVyJyB8dG9rPSAnb3V0cHV0I3JkdicgKSBpZD0gcXVhbGlmaWVkTmFtZUlEICggcGFyYW1ldGVyc19wb3J0WyBwb3J0ICwgYWMgXSApPyAoICctLT4nICggJ2VudicgfG1lPSBleHByZXNzaW9uICkgKCAnLT4nIGlkPSBxdWFsaWZpZWROYW1lSUQgKT8gKT8gKCAoICc9PT4nIHwgJ3ZpYScgKSBpZD0gcXVhbGlmaWVkTmFtZUlEICk/IFNFTUkgOworICovCitzdGF0aWMgc2VwOjpCRkNvZGUKK3N0YXRlbWVudF9jb21fb3V0cHV0KHBmbWxQYXJzZXIgY3R4KQoreworICAgIHNlcDo6QkZDb2RlIGFjOworCisgICAgQU5UTFIzX1VJTlQzMiBzdGF0ZW1lbnRfY29tX291dHB1dF9TdGFydEluZGV4OworCisgICAgcEFOVExSM19DT01NT05fVE9LRU4gICAgdG9rOworICAgIGZtbFBhcnNlcl9xdWFsaWZpZWROYW1lSURfcmV0dXJuIGlkOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9pZAorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfaWQgZm1sUGFyc2VyX3F1YWxpZmllZE5hbWVJRF9yZXR1cm4KKworICAgIHNlcDo6QkYgbWU7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX21lCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9tZSBzZXA6OkJGCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgc3RhdGVtZW50X2NvbV9vdXRwdXRfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworCisgICAgCXNlcDo6QkYgdmFyUG9ydFNpZ25hbDsKKyAgICAJc2VwOjpQb3J0ICogcG9ydCA9IE5VTEw7CisgICAgCXNlcDo6T3BlcmF0b3IgKiBvcCA9IE5VTEw7CisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDE5NCkpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gYWM7CisgICAgfQorCisgICAgdG9rICAgICAgID0gTlVMTDsKKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTM0NzoyOiAoICh0b2s9ICdvdXRwdXQnIHx0b2s9ICdvdXRwdXQjdmFyJyB8dG9rPSAnb3V0cHV0I2Zsb3cnIHx0b2s9ICdvdXRwdXQjZW52JyB8dG9rPSAnb3V0cHV0I2J1ZmZlcicgfHRvaz0gJ291dHB1dCNyZHYnICkgaWQ9IHF1YWxpZmllZE5hbWVJRCAoIHBhcmFtZXRlcnNfcG9ydFsgcG9ydCAsIGFjIF0gKT8gKCAnLS0+JyAoICdlbnYnIHxtZT0gZXhwcmVzc2lvbiApICggJy0+JyBpZD0gcXVhbGlmaWVkTmFtZUlEICk/ICk/ICggKCAnPT0+JyB8ICd2aWEnICkgaWQ9IHF1YWxpZmllZE5hbWVJRCApPyBTRU1JICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTM0Nzo0OiAodG9rPSAnb3V0cHV0JyB8dG9rPSAnb3V0cHV0I3ZhcicgfHRvaz0gJ291dHB1dCNmbG93JyB8dG9rPSAnb3V0cHV0I2VudicgfHRvaz0gJ291dHB1dCNidWZmZXInIHx0b2s9ICdvdXRwdXQjcmR2JyApIGlkPSBxdWFsaWZpZWROYW1lSUQgKCBwYXJhbWV0ZXJzX3BvcnRbIHBvcnQgLCBhYyBdICk/ICggJy0tPicgKCAnZW52JyB8bWU9IGV4cHJlc3Npb24gKSAoICctPicgaWQ9IHF1YWxpZmllZE5hbWVJRCApPyApPyAoICggJz09PicgfCAndmlhJyApIGlkPSBxdWFsaWZpZWROYW1lSUQgKT8gU0VNSQorICAgICAgICB7CisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1MzQ3OjQ6ICh0b2s9ICdvdXRwdXQnIHx0b2s9ICdvdXRwdXQjdmFyJyB8dG9rPSAnb3V0cHV0I2Zsb3cnIHx0b2s9ICdvdXRwdXQjZW52JyB8dG9rPSAnb3V0cHV0I2J1ZmZlcicgfHRvaz0gJ291dHB1dCNyZHYnICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0NDQ5PTY7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDM0MToKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0NDQ5PTE7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzNDA6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDQ0OT0yOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzM4OgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQ0NDk9MzsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDMzNzoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0NDQ5PTQ7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzMzY6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDQ0OT01OworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzM5OgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQ0NDk9NjsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA0NDk7CisgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9jb21fb3V0cHV0RXg7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ0OSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1MzQ3OjY6IHRvaz0gJ291dHB1dCcKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgdG9rID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoMzQxLCAmRk9MTE9XXzM0MV9pbl9zdGF0ZW1lbnRfY29tX291dHB1dDE4NTcyKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2NvbV9vdXRwdXRFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBvcCA9IE9QKE9VVFBVVCk7ICAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAyOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1MzQ4OjY6IHRvaz0gJ291dHB1dCN2YXInCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIHRvayA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTikgTUFUQ0hUKDM0MCwgJkZPTExPV18zNDBfaW5fc3RhdGVtZW50X2NvbV9vdXRwdXQxODU5MCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9jb21fb3V0cHV0RXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgb3AgPSBPUChPVVRQVVRfVkFSKTsgICAgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMzoKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTM0OTo2OiB0b2s9ICdvdXRwdXQjZmxvdycKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgdG9rID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoMzM4LCAmRk9MTE9XXzMzOF9pbl9zdGF0ZW1lbnRfY29tX291dHB1dDE4NjA0KTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2NvbV9vdXRwdXRFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBvcCA9IE9QKE9VVFBVVF9GTE9XKTsgICAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSA0OgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1MzUwOjY6IHRvaz0gJ291dHB1dCNlbnYnCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIHRvayA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTikgTUFUQ0hUKDMzNywgJkZPTExPV18zMzdfaW5fc3RhdGVtZW50X2NvbV9vdXRwdXQxODYxNyk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9jb21fb3V0cHV0RXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgb3AgPSBPUChPVVRQVVRfRU5WKTsgICAgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgNToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTM1MTo2OiB0b2s9ICdvdXRwdXQjYnVmZmVyJworICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICB0b2sgPSAocEFOVExSM19DT01NT05fVE9LRU4pIE1BVENIVCgzMzYsICZGT0xMT1dfMzM2X2luX3N0YXRlbWVudF9jb21fb3V0cHV0MTg2MzEpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfY29tX291dHB1dEV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIG9wID0gT1AoT1VUUFVUX0JVRkZFUik7IAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDY6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjUzNTI6NjogdG9rPSAnb3V0cHV0I3JkdicKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgdG9rID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoMzM5LCAmRk9MTE9XXzMzOV9pbl9zdGF0ZW1lbnRfY29tX291dHB1dDE4NjQyKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2NvbV9vdXRwdXRFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBvcCA9IE9QKE9VVFBVVF9SRFYpOyAgICAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9zdGF0ZW1lbnRfY29tX291dHB1dDE4NjU2KTsKKyAgICAgICAgICAgIGlkPXF1YWxpZmllZE5hbWVJRChjdHgpOworCisgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2NvbV9vdXRwdXRFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgCSAgCWFjPSBORVdfU1RNVDEoIG9wLAorICAgICAgICAgICAgICAgIAkgIAkJdmFyUG9ydFNpZ25hbCA9IHNlcDo6UGFyc2VyVXRpbDo6Z2V0dmFyUG9ydFNpZ25hbCgKKyAgICAgICAgICAgICAgICBpZC5zCisgICAgICAgICAgICAgICAgLCBpZC5uYgorICAgICAgICAgICAgICAgICkgKTsKKworICAgICAgICAgICAgICAgIAkgIAlpZiggdmFyUG9ydFNpZ25hbC5pczwgc2VwOjpQb3J0ID4oKSApCisgICAgICAgICAgICAgICAgCSAgCXsgcG9ydCA9IHZhclBvcnRTaWduYWwudG9fcHRyPCBzZXA6OlBvcnQgPigpOyB9CisgICAgICAgICAgICAgICAgCSAgCWVsc2UgaWYoIHZhclBvcnRTaWduYWwuaW52YWxpZCgpICkKKyAgICAgICAgICAgICAgICAJICAJeworICAgICAgICAgICAgICAgIAkgIAkJc2VwOjpQYXJzZXJVdGlsOjphdm1fc3ludGF4X2Vycm9yKAorICAgICAgICAgICAgICAgIAkgIAkJCSJzdGF0ZW1lbnRfY29tX291dHB1dDo+IiwgKHRvay0+Z2V0TGluZSh0b2spKSApCisgICAgICAgICAgICAgICAgCSAgCQkJCTw8ICJVbmZvdW5kIHBvcnQvc2lnbmFsIG9yIHZhcmlhYmxlIDwgIiA8PCAKKyAgICAgICAgICAgICAgICBpZC5zCisKKyAgICAgICAgICAgICAgICAJICAJCQkJPDwgIiA+IGluIG1hY2hpbmUgPCAiIDw8IHN0cl9oZWFkZXIoIF9DUE1fICkgPDwgIiA+IgorICAgICAgICAgICAgICAgIAkgIAkJCQk8PCBzZXA6OlBhcnNlclV0aWw6OlNZTlRBWF9FUlJPUl9FT0w7CisgICAgICAgICAgICAgICAgCSAgCX0KKyAgICAgICAgICAgICAgICAJICAKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1MzY4OjQ6ICggcGFyYW1ldGVyc19wb3J0WyBwb3J0ICwgYWMgXSApPworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQ0NTA9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIExQQVJFTjoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQ0NTA9MTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NDUwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjUzNjg6NDogcGFyYW1ldGVyc19wb3J0WyBwb3J0ICwgYWMgXQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19wYXJhbWV0ZXJzX3BvcnRfaW5fc3RhdGVtZW50X2NvbV9vdXRwdXQxODY2Nik7CisgICAgICAgICAgICAJICAgICAgICBwYXJhbWV0ZXJzX3BvcnQoY3R4LCBwb3J0LCBhYyk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfY29tX291dHB1dEV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjUzNjk6NDogKCAnLS0+JyAoICdlbnYnIHxtZT0gZXhwcmVzc2lvbiApICggJy0+JyBpZD0gcXVhbGlmaWVkTmFtZUlEICk/ICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDQ1Mz0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTYzOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDQ1Mz0xOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ0NTMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTM2OTo2OiAnLS0+JyAoICdlbnYnIHxtZT0gZXhwcmVzc2lvbiApICggJy0+JyBpZD0gcXVhbGlmaWVkTmFtZUlEICk/CisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoMTYzLCAmRk9MTE9XXzE2M19pbl9zdGF0ZW1lbnRfY29tX291dHB1dDE4Njc2KTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2NvbV9vdXRwdXRFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTM3MDo2OiAoICdlbnYnIHxtZT0gZXhwcmVzc2lvbiApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDQ1MT0yOworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSAyNzc6CisgICAgICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCSAgICBpbnQgTEE0NTFfMSA9IExBKDIpOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgIGlmICggKHN5bnByZWQ4NzJfZm1sKGN0eCkpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCSAgICAgICAgYWx0NDUxPTE7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgIGVsc2UgaWYgKCAoQU5UTFIzX1RSVUUpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCSAgICAgICAgYWx0NDUxPTI7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgIGVsc2UKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQkgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCSAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDQ1MTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCSAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAxOworCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCSAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2NvbV9vdXRwdXRFeDsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIEJOT1Q6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBDT0xPTngyOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgQ2hhckxpdGVyYWw6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBERUNSOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgRE9MTEFSX0xDVVJMWToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIEZsb2F0TGl0ZXJhbDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIElEOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgSU5DUjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIEludGVnZXJMaXRlcmFsOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgTEJSQUNLRVQ6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBMQlJBQ0tFVF9CQVI6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBMQ1VSTFk6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBMTk9UOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgTFBBUkVOOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgTFBBUkVOX0lOVk9LRToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIE1JTlVTOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgT1BfUE9QOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgT1BfVE9QOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgUEVSQ0VOVF9MQ1VSTFk6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBQTFVTOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgUmF0aW9uYWxMaXRlcmFsOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgU3RyaW5nTGl0ZXJhbDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDE1ODoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDE1OToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDE2MDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDE2MToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDE2MjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDIzNzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI1NjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI2NToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI4MDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI5NDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMxMzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMzMDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMzMToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMzMjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM0MzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM0NzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM3MjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDM5NzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJYWx0NDUxPTI7CisgICAgICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gNDUxOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfY29tX291dHB1dEV4OworCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQ0NTEpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTM3MDo4OiAnZW52JworICAgICAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKDI3NywgJkZPTExPV18yNzdfaW5fc3RhdGVtZW50X2NvbV9vdXRwdXQxODY4NSk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9jb21fb3V0cHV0RXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgYWMKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAtPnNldE9wZXJhdG9yKCBPUChPVVRQVVRfRU5WKSApOyAKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgICAgICAJY2FzZSAyOgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1MzcxOjg6IG1lPSBleHByZXNzaW9uCisgICAgICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2NvbV9vdXRwdXQxODY5OSk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBtZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfY29tX291dHB1dEV4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJCSAgCXNlcDo6QkZDb2RlIG91dHB1dFRvID0gTkVXX1NUTVQyKE9QKE9VVFBVVF9UTyksIGFjCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgLT5maXJzdCgpLCBtZQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJCSAgCW91dHB1dFRvLT5pbnNlcnQob3V0cHV0VG8tPmVuZCgpLCArKyhhYworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIC0+YmVnaW4oKSksIGFjCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgLT5lbmQoKSk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCQkgIAlhYz0gb3V0cHV0VG87CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJCSAgCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1Mzc5OjY6ICggJy0+JyBpZD0gcXVhbGlmaWVkTmFtZUlEICk/CisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDQ1Mj0yOworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMTY0OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJCWFsdDQ1Mj0xOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQ0NTIpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTM3OTo4OiAnLT4nIGlkPSBxdWFsaWZpZWROYW1lSUQKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVCgxNjQsICZGT0xMT1dfMTY0X2luX3N0YXRlbWVudF9jb21fb3V0cHV0MTg3MjEpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfY29tX291dHB1dEV4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fc3RhdGVtZW50X2NvbV9vdXRwdXQxODcyNSk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZD1xdWFsaWZpZWROYW1lSUQoY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9jb21fb3V0cHV0RXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgYWMKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAtPmFwcGVuZChzZXA6OlBhcnNlclV0aWw6OmdldHZhclBvcnRTaWduYWwoaWQucworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICwgaWQubmIKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICApKTsgCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjUzODM6NDogKCAoICc9PT4nIHwgJ3ZpYScgKSBpZD0gcXVhbGlmaWVkTmFtZUlEICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDQ1ND0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY4OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDQxMzoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQ0NTQ9MTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NDU0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjUzODM6NjogKCAnPT0+JyB8ICd2aWEnICkgaWQ9IHF1YWxpZmllZE5hbWVJRAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBpZiAoIExBKDEpID09IDE2OCB8fCBMQSgxKSA9PSA0MTMgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIENPTlNVTUUoKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBQRVJST1JSRUNPVkVSWT1BTlRMUjNfRkFMU0U7CisgICAgICAgICAgICAJICAgICAgICAgICAgRkFJTEVERkxBRz1BTlRMUjNfRkFMU0U7CisKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGVsc2UKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgCSAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX01JU01BVENIRURfU0VUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBFWENFUFRJT04tPm5hbWUgICAgICAgICA9ICh2b2lkICopQU5UTFIzX01JU01BVENIRURfU0VUX05BTUU7CisgICAgICAgICAgICAJICAgICAgICAgICAgRVhDRVBUSU9OLT5leHBlY3RpbmdTZXQgPSBOVUxMOworCisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2NvbV9vdXRwdXRFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fc3RhdGVtZW50X2NvbV9vdXRwdXQxODc2NSk7CisgICAgICAgICAgICAJICAgICAgICBpZD1xdWFsaWZpZWROYW1lSUQoY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9jb21fb3V0cHV0RXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgc2VwOjpQYXJzZXJVdGlsOjp1cGRhdGVTaWduYWxSb3V0aW5nQ2hhbm5lbCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAJCXNlcDo6TW9kaWZpZXI6OkRJUkVDVElPTl9PVVRQVVRfS0lORCwgYWMKKyAgICAgICAgICAgIAkgICAgICAgICAgICAsIGlkLnMKKyAgICAgICAgICAgIAkgICAgICAgICAgICAsIGlkLm5iCisgICAgICAgICAgICAJICAgICAgICAgICAgKTsgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgTUFUQ0hUKFNFTUksICZGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfY29tX291dHB1dDE4NzgxKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2NvbV9vdXRwdXRFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICB9CisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfY29tX291dHB1dEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZXN0YXRlbWVudF9jb21fb3V0cHV0RXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgxOTQsIHN0YXRlbWVudF9jb21fb3V0cHV0X1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gYWM7Cit9CisvKiAkQU5UTFIgZW5kIHN0YXRlbWVudF9jb21fb3V0cHV0ICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IHBhcmFtZXRlcnNfcG9ydAorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTM5MToxOiBwYXJhbWV0ZXJzX3BvcnRbIHNlcDo6UG9ydCAqIHBvcnQgLCBjb25zdCBzZXA6OkJGQ29kZSAmIGFjIF0gOiBMUEFSRU4gbHA9IGxhYmVsbGVkX2FyZ3VtZW50ICggQ09NTUEgbHA9IGxhYmVsbGVkX2FyZ3VtZW50ICkqIFJQQVJFTiA7CisgKi8KK3N0YXRpYyB2b2lkCitwYXJhbWV0ZXJzX3BvcnQocGZtbFBhcnNlciBjdHgsIHNlcDo6UG9ydCAqIHBvcnQsIGNvbnN0IHNlcDo6QkZDb2RlICYgYWMpCit7CisgICAgQU5UTFIzX1VJTlQzMiBwYXJhbWV0ZXJzX3BvcnRfU3RhcnRJbmRleDsKKworICAgIGZtbFBhcnNlcl9sYWJlbGxlZF9hcmd1bWVudF9yZXR1cm4gbHA7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2xwCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9scCBmbWxQYXJzZXJfbGFiZWxsZWRfYXJndW1lbnRfcmV0dXJuCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgcGFyYW1ldGVyc19wb3J0X1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKworICAgIAlzZXA6OkJGVmVjdG9yIGxhYmVsbGVkUGFyYW1zKAorICAgIAkJCShwb3J0ICE9IE5VTEwpID8gcG9ydC0+Z2V0UGFyYW1ldGVyc0NvdW50KCkgOiAwICk7CisKKyAgICAJc2VwOjpCRkxpc3QgcG9zaXRpb25hbFBhcmFtczsKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTk1KSkgKQorICAgIHsKKyAgICAgICAgeworCisgICAgICAgICAgICAJc2VwOjpQYXJzZXJVdGlsOjpjb21wdXRlUG9ydFBhcmFtZXRlcigKKyAgICAgICAgICAgIAkJCXBvcnQsIGFjLCBsYWJlbGxlZFBhcmFtcywgcG9zaXRpb25hbFBhcmFtcyk7CisKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU0MDM6MjogKCBMUEFSRU4gbHA9IGxhYmVsbGVkX2FyZ3VtZW50ICggQ09NTUEgbHA9IGxhYmVsbGVkX2FyZ3VtZW50ICkqIFJQQVJFTiApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU0MDM6NDogTFBBUkVOIGxwPSBsYWJlbGxlZF9hcmd1bWVudCAoIENPTU1BIGxwPSBsYWJlbGxlZF9hcmd1bWVudCApKiBSUEFSRU4KKyAgICAgICAgeworICAgICAgICAgICAgIE1BVENIVChMUEFSRU4sICZGT0xMT1dfTFBBUkVOX2luX3BhcmFtZXRlcnNfcG9ydDE4ODA0KTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlcGFyYW1ldGVyc19wb3J0RXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9wYXJhbWV0ZXJzX3BvcnQxODgxMyk7CisgICAgICAgICAgICBscD1sYWJlbGxlZF9hcmd1bWVudChjdHgpOworCisgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlcGFyYW1ldGVyc19wb3J0RXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgCQlzZXA6OlBhcnNlclV0aWw6OmFwcGVuZFBvcnRQYXJhbWV0ZXIocG9ydCwgbHAubGFiZWwKKyAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgICAgIAkJCQlsYWJlbGxlZFBhcmFtcywgcG9zaXRpb25hbFBhcmFtcywgbHAuYXJnCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU0MDk6NDogKCBDT01NQSBscD0gbGFiZWxsZWRfYXJndW1lbnQgKSoKKworICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0NDU1PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIENPTU1BOgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQ0NTU9MTsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NDU1KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU0MDk6NjogQ09NTUEgbHA9IGxhYmVsbGVkX2FyZ3VtZW50CisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoQ09NTUEsICZGT0xMT1dfQ09NTUFfaW5fcGFyYW1ldGVyc19wb3J0MTg4MjcpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVwYXJhbWV0ZXJzX3BvcnRFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2xhYmVsbGVkX2FyZ3VtZW50X2luX3BhcmFtZXRlcnNfcG9ydDE4ODMyKTsKKyAgICAgICAgICAgIAkgICAgICAgIGxwPWxhYmVsbGVkX2FyZ3VtZW50KGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVwYXJhbWV0ZXJzX3BvcnRFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAJCXNlcDo6UGFyc2VyVXRpbDo6YXBwZW5kUG9ydFBhcmFtZXRlcihwb3J0LCBscC5sYWJlbAorICAgICAgICAgICAgCSAgICAgICAgICAgICwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCQkJCWxhYmVsbGVkUGFyYW1zLCBwb3NpdGlvbmFsUGFyYW1zLCBscC5hcmcKKyAgICAgICAgICAgIAkgICAgICAgICAgICApOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdDoKKyAgICAgICAgICAgIAkgICAgZ290byBsb29wNDU1OwkvKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgKi8KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9vcDQ1NTogOyAvKiBKdW1wIG91dCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworCisKKyAgICAgICAgICAgICBNQVRDSFQoUlBBUkVOLCAmRk9MTE9XX1JQQVJFTl9pbl9wYXJhbWV0ZXJzX3BvcnQxODg1Mik7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXBhcmFtZXRlcnNfcG9ydEV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVwYXJhbWV0ZXJzX3BvcnRFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVwYXJhbWV0ZXJzX3BvcnRFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgCXNlcDo6UGFyc2VyVXRpbDo6Y29tcHV0ZVBvcnRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgIAkJCXBvcnQsIGFjLCBsYWJlbGxlZFBhcmFtcywgcG9zaXRpb25hbFBhcmFtcyk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKworICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTk1LCBwYXJhbWV0ZXJzX3BvcnRfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIHBhcmFtZXRlcnNfcG9ydCAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBleHByZXNzaW9uX2NvbQorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTQyMDoxOiBleHByZXNzaW9uX2NvbSByZXR1cm5zIFsgc2VwOjpCRkNvZGUgYWMgXSA6ICggJ3ByZXNlbnQnIGlkPSBxdWFsaWZpZWROYW1lSUQgfCAnYWJzZW50JyBpZD0gcXVhbGlmaWVkTmFtZUlEICk7CisgKi8KK3N0YXRpYyBzZXA6OkJGQ29kZQorZXhwcmVzc2lvbl9jb20ocGZtbFBhcnNlciBjdHgpCit7CisgICAgc2VwOjpCRkNvZGUgYWM7CisKKyAgICBBTlRMUjNfVUlOVDMyIGV4cHJlc3Npb25fY29tX1N0YXJ0SW5kZXg7CisKKyAgICBmbWxQYXJzZXJfcXVhbGlmaWVkTmFtZUlEX3JldHVybiBpZDsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfaWQKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2lkIGZtbFBhcnNlcl9xdWFsaWZpZWROYW1lSURfcmV0dXJuCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgZXhwcmVzc2lvbl9jb21fU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTk2KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiBhYzsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vICAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NDIyOjI6ICggJ3ByZXNlbnQnIGlkPSBxdWFsaWZpZWROYW1lSUQgfCAnYWJzZW50JyBpZD0gcXVhbGlmaWVkTmFtZUlEICkKKworICAgICAgICAgICAgQU5UTFIzX1VJTlQzMiBhbHQ0NTY7CisKKyAgICAgICAgICAgIGFsdDQ1Nj0yOworCisgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDM0NzoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQ1Nj0xOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjM3OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDU2PTI7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gNDU2OworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbl9jb21FeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ1NikKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NDIyOjQ6ICdwcmVzZW50JyBpZD0gcXVhbGlmaWVkTmFtZUlECisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDM0NywgJkZPTExPV18zNDdfaW5fZXhwcmVzc2lvbl9jb20xODg2OSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25fY29tRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9leHByZXNzaW9uX2NvbTE4ODc0KTsKKyAgICAgICAgCSAgICAgICAgaWQ9cXVhbGlmaWVkTmFtZUlEKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25fY29tRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGFjPSBORVdfU1RNVDEoT1AoUFJFU0VOVCksCisgICAgICAgIAkgICAgICAgICAgICAJCXNlcDo6UGFyc2VyVXRpbDo6Z2V0dmFyUG9ydFNpZ25hbCgKKyAgICAgICAgCSAgICAgICAgICAgIGlkLnMKKyAgICAgICAgCSAgICAgICAgICAgICwgaWQubmIKKyAgICAgICAgCSAgICAgICAgICAgICkpOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NDI2OjQ6ICdhYnNlbnQnIGlkPSBxdWFsaWZpZWROYW1lSUQKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMjM3LCAmRk9MTE9XXzIzN19pbl9leHByZXNzaW9uX2NvbTE4ODgzKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbl9jb21FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX2V4cHJlc3Npb25fY29tMTg4ODgpOworICAgICAgICAJICAgICAgICBpZD1xdWFsaWZpZWROYW1lSUQoY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbl9jb21FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgYWM9IE5FV19TVE1UMShPUChBQlNFTlQpLAorICAgICAgICAJICAgICAgICAgICAgCQlzZXA6OlBhcnNlclV0aWw6OmdldHZhclBvcnRTaWduYWwoCisgICAgICAgIAkgICAgICAgICAgICBpZC5zCisgICAgICAgIAkgICAgICAgICAgICAsIGlkLm5iCisgICAgICAgIAkgICAgICAgICAgICApKTsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZWV4cHJlc3Npb25fY29tRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlZXhwcmVzc2lvbl9jb21FeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDE5NiwgZXhwcmVzc2lvbl9jb21fU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiBhYzsKK30KKy8qICRBTlRMUiBlbmQgZXhwcmVzc2lvbl9jb20gKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgc3RhdGVtZW50X2NvbnN0cmFpbnQKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU0MzU6MTogc3RhdGVtZW50X2NvbnN0cmFpbnQgcmV0dXJucyBbIHNlcDo6QkZDb2RlIGFjIF0gOiAocz0gc3RhdGVtZW50X2d1YXJkIHxzPSBzdGF0ZW1lbnRfdGltZWRfZ3VhcmQgfHM9IHN0YXRlbWVudF9jaGVja3NhdCApOworICovCitzdGF0aWMgc2VwOjpCRkNvZGUKK3N0YXRlbWVudF9jb25zdHJhaW50KHBmbWxQYXJzZXIgY3R4KQoreworICAgIHNlcDo6QkZDb2RlIGFjOworCisgICAgQU5UTFIzX1VJTlQzMiBzdGF0ZW1lbnRfY29uc3RyYWludF9TdGFydEluZGV4OworCisgICAgc2VwOjpCRkNvZGUgczsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfcworICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfcyBzZXA6OkJGQ29kZQorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIHN0YXRlbWVudF9jb25zdHJhaW50X1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDE5NykpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gYWM7CisgICAgfQorCisgICAgeworICAgICAgICB7CisgICAgICAgICAgICAvLyAgL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTQzNzoyOiAocz0gc3RhdGVtZW50X2d1YXJkIHxzPSBzdGF0ZW1lbnRfdGltZWRfZ3VhcmQgfHM9IHN0YXRlbWVudF9jaGVja3NhdCApCisKKyAgICAgICAgICAgIEFOVExSM19VSU5UMzIgYWx0NDU3OworCisgICAgICAgICAgICBhbHQ0NTc9MzsKKworICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAyNzg6CisgICAgICAgICAgICBjYXNlIDI5MDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQ1Nz0xOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzkxOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDU3PTI7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNTY6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ0NTc9MzsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA0NTc7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfY29uc3RyYWludEV4OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NDU3KQorICAgICAgICAgICAgeworICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU0Mzc6NDogcz0gc3RhdGVtZW50X2d1YXJkCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19zdGF0ZW1lbnRfZ3VhcmRfaW5fc3RhdGVtZW50X2NvbnN0cmFpbnQxODkxMik7CisgICAgICAgIAkgICAgICAgIHM9c3RhdGVtZW50X2d1YXJkKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9jb25zdHJhaW50RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGFjPSAKKyAgICAgICAgCSAgICAgICAgICAgIHMKKyAgICAgICAgCSAgICAgICAgICAgIDsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDI6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTQzODo0OiBzPSBzdGF0ZW1lbnRfdGltZWRfZ3VhcmQKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3N0YXRlbWVudF90aW1lZF9ndWFyZF9pbl9zdGF0ZW1lbnRfY29uc3RyYWludDE4OTI4KTsKKyAgICAgICAgCSAgICAgICAgcz1zdGF0ZW1lbnRfdGltZWRfZ3VhcmQoY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2NvbnN0cmFpbnRFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgYWM9IAorICAgICAgICAJICAgICAgICAgICAgcworICAgICAgICAJICAgICAgICAgICAgOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMzoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NDM5OjQ6IHM9IHN0YXRlbWVudF9jaGVja3NhdAorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfc3RhdGVtZW50X2NoZWNrc2F0X2luX3N0YXRlbWVudF9jb25zdHJhaW50MTg5MzgpOworICAgICAgICAJICAgICAgICBzPXN0YXRlbWVudF9jaGVja3NhdChjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfY29uc3RyYWludEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBhYz0gCisgICAgICAgIAkgICAgICAgICAgICBzCisgICAgICAgIAkgICAgICAgICAgICA7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfY29uc3RyYWludEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZXN0YXRlbWVudF9jb25zdHJhaW50RXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgxOTcsIHN0YXRlbWVudF9jb25zdHJhaW50X1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gYWM7Cit9CisvKiAkQU5UTFIgZW5kIHN0YXRlbWVudF9jb25zdHJhaW50ICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IHN0YXRlbWVudF9ndWFyZAorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTQ0MzoxOiBzdGF0ZW1lbnRfZ3VhcmQgcmV0dXJucyBbIHNlcDo6QkZDb2RlIGFjIF0gOiAoICdndWFyZCcgZT0gZXhwcmVzc2lvbiBTRU1JIHwgJ2V2ZW50JyBlPSBleHByZXNzaW9uIFNFTUkgKTsKKyAqLworc3RhdGljIHNlcDo6QkZDb2RlCitzdGF0ZW1lbnRfZ3VhcmQocGZtbFBhcnNlciBjdHgpCit7CisgICAgc2VwOjpCRkNvZGUgYWM7CisKKyAgICBBTlRMUjNfVUlOVDMyIHN0YXRlbWVudF9ndWFyZF9TdGFydEluZGV4OworCisgICAgc2VwOjpCRiBlOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9lCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9lIHNlcDo6QkYKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBzdGF0ZW1lbnRfZ3VhcmRfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMTk4KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiBhYzsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vICAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NDQ1OjI6ICggJ2d1YXJkJyBlPSBleHByZXNzaW9uIFNFTUkgfCAnZXZlbnQnIGU9IGV4cHJlc3Npb24gU0VNSSApCisKKyAgICAgICAgICAgIEFOVExSM19VSU5UMzIgYWx0NDU4OworCisgICAgICAgICAgICBhbHQ0NTg9MjsKKworICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAyOTA6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ0NTg9MTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI3ODoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQ1OD0yOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDQ1ODsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9ndWFyZEV4OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NDU4KQorICAgICAgICAgICAgeworICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU0NDU6NDogJ2d1YXJkJyBlPSBleHByZXNzaW9uIFNFTUkKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMjkwLCAmRk9MTE9XXzI5MF9pbl9zdGF0ZW1lbnRfZ3VhcmQxODk2MCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9ndWFyZEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9ndWFyZDE4OTY1KTsKKyAgICAgICAgCSAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9ndWFyZEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAgTUFUQ0hUKFNFTUksICZGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfZ3VhcmQxODk2OCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9ndWFyZEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBhYz0gTkVXX1NUTVQxKE9QKEdVQVJEKSwgCisgICAgICAgIAkgICAgICAgICAgICBlCisgICAgICAgIAkgICAgICAgICAgICApOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NDQ4OjQ6ICdldmVudCcgZT0gZXhwcmVzc2lvbiBTRU1JCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDI3OCwgJkZPTExPV18yNzhfaW5fc3RhdGVtZW50X2d1YXJkMTg5NzcpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfZ3VhcmRFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfZ3VhcmQxODk4Mik7CisgICAgICAgIAkgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfZ3VhcmRFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChTRU1JLCAmRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2d1YXJkMTg5ODUpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfZ3VhcmRFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgYWM9IE5FV19TVE1UMShPUChFVkVOVCksIAorICAgICAgICAJICAgICAgICAgICAgZQorICAgICAgICAJICAgICAgICAgICAgKTsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZXN0YXRlbWVudF9ndWFyZEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZXN0YXRlbWVudF9ndWFyZEV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTk4LCBzdGF0ZW1lbnRfZ3VhcmRfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiBhYzsKK30KKy8qICRBTlRMUiBlbmQgc3RhdGVtZW50X2d1YXJkICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IHN0YXRlbWVudF90aW1lZF9ndWFyZAorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTQ1MjoxOiBzdGF0ZW1lbnRfdGltZWRfZ3VhcmQgcmV0dXJucyBbIHNlcDo6QkZDb2RlIGFjIF0gOiAndGd1YXJkJyBlPSBleHByZXNzaW9uIFNFTUkgOworICovCitzdGF0aWMgc2VwOjpCRkNvZGUKK3N0YXRlbWVudF90aW1lZF9ndWFyZChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBzZXA6OkJGQ29kZSBhYzsKKworICAgIEFOVExSM19VSU5UMzIgc3RhdGVtZW50X3RpbWVkX2d1YXJkX1N0YXJ0SW5kZXg7CisKKyAgICBzZXA6OkJGIGU7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2UKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIHN0YXRlbWVudF90aW1lZF9ndWFyZF9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgxOTkpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIGFjOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTQ1NDoyOiAoICd0Z3VhcmQnIGU9IGV4cHJlc3Npb24gU0VNSSApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU0NTQ6NDogJ3RndWFyZCcgZT0gZXhwcmVzc2lvbiBTRU1JCisgICAgICAgIHsKKyAgICAgICAgICAgICBNQVRDSFQoMzkxLCAmRk9MTE9XXzM5MV9pbl9zdGF0ZW1lbnRfdGltZWRfZ3VhcmQxOTAwMyk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF90aW1lZF9ndWFyZEV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF90aW1lZF9ndWFyZDE5MDA4KTsKKyAgICAgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X3RpbWVkX2d1YXJkRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICBNQVRDSFQoU0VNSSwgJkZPTExPV19TRU1JX2luX3N0YXRlbWVudF90aW1lZF9ndWFyZDE5MDExKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X3RpbWVkX2d1YXJkRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgYWM9IE5FV19TVE1UMShPUChUSU1FRF9HVUFSRCksIAorICAgICAgICAgICAgICAgIGUKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZXN0YXRlbWVudF90aW1lZF9ndWFyZEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZXN0YXRlbWVudF90aW1lZF9ndWFyZEV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMTk5LCBzdGF0ZW1lbnRfdGltZWRfZ3VhcmRfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiBhYzsKK30KKy8qICRBTlRMUiBlbmQgc3RhdGVtZW50X3RpbWVkX2d1YXJkICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IHN0YXRlbWVudF9jaGVja3NhdAorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTQ1ODoxOiBzdGF0ZW1lbnRfY2hlY2tzYXQgcmV0dXJucyBbIHNlcDo6QkZDb2RlIGFjIF0gOiAnY2hlY2tzYXQnICggTFRfIChpZD0gU3RyaW5nTGl0ZXJhbCB8aWQ9IElEICkgR1QgfCAnc29sdmVyOicgKGlkPSBTdHJpbmdMaXRlcmFsIHxpZD0gSUQgKSApPyBlPSBleHByZXNzaW9uIFNFTUkgOworICovCitzdGF0aWMgc2VwOjpCRkNvZGUKK3N0YXRlbWVudF9jaGVja3NhdChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBzZXA6OkJGQ29kZSBhYzsKKworICAgIEFOVExSM19VSU5UMzIgc3RhdGVtZW50X2NoZWNrc2F0X1N0YXJ0SW5kZXg7CisKKyAgICBwQU5UTFIzX0NPTU1PTl9UT0tFTiAgICBpZDsKKyAgICBzZXA6OkJGIGU7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2UKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIHN0YXRlbWVudF9jaGVja3NhdF9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisKKyAgICAJc3RkOjpzdHJpbmcgc29sdmVySUQ7CisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDIwMCkpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gYWM7CisgICAgfQorCisgICAgaWQgICAgICAgPSBOVUxMOworCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NDYzOjI6ICggJ2NoZWNrc2F0JyAoIExUXyAoaWQ9IFN0cmluZ0xpdGVyYWwgfGlkPSBJRCApIEdUIHwgJ3NvbHZlcjonIChpZD0gU3RyaW5nTGl0ZXJhbCB8aWQ9IElEICkgKT8gZT0gZXhwcmVzc2lvbiBTRU1JICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTQ2Mzo0OiAnY2hlY2tzYXQnICggTFRfIChpZD0gU3RyaW5nTGl0ZXJhbCB8aWQ9IElEICkgR1QgfCAnc29sdmVyOicgKGlkPSBTdHJpbmdMaXRlcmFsIHxpZD0gSUQgKSApPyBlPSBleHByZXNzaW9uIFNFTUkKKyAgICAgICAgeworICAgICAgICAgICAgIE1BVENIVCgyNTYsICZGT0xMT1dfMjU2X2luX3N0YXRlbWVudF9jaGVja3NhdDE5MDMzKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2NoZWNrc2F0RXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU0NjQ6NDogKCBMVF8gKGlkPSBTdHJpbmdMaXRlcmFsIHxpZD0gSUQgKSBHVCB8ICdzb2x2ZXI6JyAoaWQ9IFN0cmluZ0xpdGVyYWwgfGlkPSBJRCApICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDQ2MT0zOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTFRfOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDQ2MT0xOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzc2OgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDQ2MT0yOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ0NjEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTQ2NDo2OiBMVF8gKGlkPSBTdHJpbmdMaXRlcmFsIHxpZD0gSUQgKSBHVAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKExUXywgJkZPTExPV19MVF9faW5fc3RhdGVtZW50X2NoZWNrc2F0MTkwNDApOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfY2hlY2tzYXRFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTQ2NDoxMTogKGlkPSBTdHJpbmdMaXRlcmFsIHxpZD0gSUQgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQ0NTk9MjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgU3RyaW5nTGl0ZXJhbDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJYWx0NDU5PTE7CisgICAgICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJYWx0NDU5PTI7CisgICAgICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gNDU5OworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfY2hlY2tzYXRFeDsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0NDU5KQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU0NjQ6MTM6IGlkPSBTdHJpbmdMaXRlcmFsCisgICAgICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlkID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoU3RyaW5nTGl0ZXJhbCwgJkZPTExPV19TdHJpbmdMaXRlcmFsX2luX3N0YXRlbWVudF9jaGVja3NhdDE5MDQ3KTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2NoZWNrc2F0RXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDI6CisgICAgICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU0NjQ6MzI6IGlkPSBJRAorICAgICAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZCA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTikgTUFUQ0hUKElELCAmRk9MTE9XX0lEX2luX3N0YXRlbWVudF9jaGVja3NhdDE5MDUzKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2NoZWNrc2F0RXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChHVCwgJkZPTExPV19HVF9pbl9zdGF0ZW1lbnRfY2hlY2tzYXQxOTA1OCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9jaGVja3NhdEV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIHNvbHZlcklEID0gU1RSKChpZC0+Z2V0VGV4dChpZCkpLT5jaGFycyk7IAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDI6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU0NjU6NjogJ3NvbHZlcjonIChpZD0gU3RyaW5nTGl0ZXJhbCB8aWQ9IElEICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVCgzNzYsICZGT0xMT1dfMzc2X2luX3N0YXRlbWVudF9jaGVja3NhdDE5MDcwKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2NoZWNrc2F0RXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU0NjU6MTc6IChpZD0gU3RyaW5nTGl0ZXJhbCB8aWQ9IElEICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0NDYwPTI7CisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIFN0cmluZ0xpdGVyYWw6CisgICAgICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCWFsdDQ2MD0xOworICAgICAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgSUQ6CisgICAgICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCWFsdDQ2MD0yOworICAgICAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDQ2MDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2NoZWNrc2F0RXg7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ2MCkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NDY1OjE5OiBpZD0gU3RyaW5nTGl0ZXJhbAorICAgICAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZCA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTikgTUFUQ0hUKFN0cmluZ0xpdGVyYWwsICZGT0xMT1dfU3RyaW5nTGl0ZXJhbF9pbl9zdGF0ZW1lbnRfY2hlY2tzYXQxOTA3Nyk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9jaGVja3NhdEV4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgICAgICAJY2FzZSAyOgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NDY1OjM4OiBpZD0gSUQKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWQgPSAocEFOVExSM19DT01NT05fVE9LRU4pIE1BVENIVChJRCwgJkZPTExPV19JRF9pbl9zdGF0ZW1lbnRfY2hlY2tzYXQxOTA4Myk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9jaGVja3NhdEV4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgc29sdmVySUQgPSBTVFIoKGlkLT5nZXRUZXh0KGlkKSktPmNoYXJzKTsgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9jaGVja3NhdDE5MTAxKTsKKyAgICAgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2NoZWNrc2F0RXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICBNQVRDSFQoU0VNSSwgJkZPTExPV19TRU1JX2luX3N0YXRlbWVudF9jaGVja3NhdDE5MTA0KTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2NoZWNrc2F0RXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIAkJaWYoIHNvbHZlcklELmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIAkJeworICAgICAgICAgICAgICAgIAkJCWFjPSBORVdfU1RNVDEoIE9QKENIRUNLX1NBVCksIAorICAgICAgICAgICAgICAgIGUKKyAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgICAgIAkJZWxzZQorICAgICAgICAgICAgICAgIAkJeworICAgICAgICAgICAgICAgIAkJCWFjPSBORVdfU1RNVDIoIE9QKENIRUNLX1NBVCksIE5FV19TVFJJTkcoc29sdmVySUQpLCAKKyAgICAgICAgICAgICAgICBlCisgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgICAgICAJCisgICAgICAgICAgICB9CisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfY2hlY2tzYXRFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVzdGF0ZW1lbnRfY2hlY2tzYXRFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDIwMCwgc3RhdGVtZW50X2NoZWNrc2F0X1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gYWM7Cit9CisvKiAkQU5UTFIgZW5kIHN0YXRlbWVudF9jaGVja3NhdCAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBleHByZXNzaW9uX2d1YXJkCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NDgxOjE6IGV4cHJlc3Npb25fZ3VhcmQgcmV0dXJucyBbIHNlcDo6QkZDb2RlIGFjIF0gOiAnY2hlY2tzYXQnICggTFRfIChpZD0gU3RyaW5nTGl0ZXJhbCB8aWQ9IElEICkgR1QgfCAnc29sdmVyOicgKGlkPSBTdHJpbmdMaXRlcmFsIHxpZD0gSUQgKSApPyBlPSBleHByZXNzaW9uIDsKKyAqLworc3RhdGljIHNlcDo6QkZDb2RlCitleHByZXNzaW9uX2d1YXJkKHBmbWxQYXJzZXIgY3R4KQoreworICAgIHNlcDo6QkZDb2RlIGFjOworCisgICAgQU5UTFIzX1VJTlQzMiBleHByZXNzaW9uX2d1YXJkX1N0YXJ0SW5kZXg7CisKKyAgICBwQU5UTFIzX0NPTU1PTl9UT0tFTiAgICBpZDsKKyAgICBzZXA6OkJGIGU7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2UKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGV4cHJlc3Npb25fZ3VhcmRfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworCisgICAgCXN0ZDo6c3RyaW5nIHNvbHZlcklEOworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgyMDEpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIGFjOworICAgIH0KKworICAgIGlkICAgICAgID0gTlVMTDsKKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTQ4NjoyOiAoICdjaGVja3NhdCcgKCBMVF8gKGlkPSBTdHJpbmdMaXRlcmFsIHxpZD0gSUQgKSBHVCB8ICdzb2x2ZXI6JyAoaWQ9IFN0cmluZ0xpdGVyYWwgfGlkPSBJRCApICk/IGU9IGV4cHJlc3Npb24gKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NDg2OjQ6ICdjaGVja3NhdCcgKCBMVF8gKGlkPSBTdHJpbmdMaXRlcmFsIHxpZD0gSUQgKSBHVCB8ICdzb2x2ZXI6JyAoaWQ9IFN0cmluZ0xpdGVyYWwgfGlkPSBJRCApICk/IGU9IGV4cHJlc3Npb24KKyAgICAgICAgeworICAgICAgICAgICAgIE1BVENIVCgyNTYsICZGT0xMT1dfMjU2X2luX2V4cHJlc3Npb25fZ3VhcmQxOTEyNyk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25fZ3VhcmRFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTQ4Nzo0OiAoIExUXyAoaWQ9IFN0cmluZ0xpdGVyYWwgfGlkPSBJRCApIEdUIHwgJ3NvbHZlcjonIChpZD0gU3RyaW5nTGl0ZXJhbCB8aWQ9IElEICkgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0NDY0PTM7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMVF86CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJYWx0NDY0PTE7CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzNzY6CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJYWx0NDY0PTI7CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ2NCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NDg3OjY6IExUXyAoaWQ9IFN0cmluZ0xpdGVyYWwgfGlkPSBJRCApIEdUCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoTFRfLCAmRk9MTE9XX0xUX19pbl9leHByZXNzaW9uX2d1YXJkMTkxMzQpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleHByZXNzaW9uX2d1YXJkRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU0ODc6MTE6IChpZD0gU3RyaW5nTGl0ZXJhbCB8aWQ9IElEICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0NDYyPTI7CisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIFN0cmluZ0xpdGVyYWw6CisgICAgICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCWFsdDQ2Mj0xOworICAgICAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgSUQ6CisgICAgICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCWFsdDQ2Mj0yOworICAgICAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDQ2MjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbl9ndWFyZEV4OworCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQ0NjIpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTQ4NzoxMzogaWQ9IFN0cmluZ0xpdGVyYWwKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWQgPSAocEFOVExSM19DT01NT05fVE9LRU4pIE1BVENIVChTdHJpbmdMaXRlcmFsLCAmRk9MTE9XX1N0cmluZ0xpdGVyYWxfaW5fZXhwcmVzc2lvbl9ndWFyZDE5MTQxKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbl9ndWFyZEV4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgICAgICAJY2FzZSAyOgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NDg3OjMyOiBpZD0gSUQKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWQgPSAocEFOVExSM19DT01NT05fVE9LRU4pIE1BVENIVChJRCwgJkZPTExPV19JRF9pbl9leHByZXNzaW9uX2d1YXJkMTkxNDcpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleHByZXNzaW9uX2d1YXJkRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChHVCwgJkZPTExPV19HVF9pbl9leHByZXNzaW9uX2d1YXJkMTkxNTIpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleHByZXNzaW9uX2d1YXJkRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgc29sdmVySUQgPSBTVFIoKGlkLT5nZXRUZXh0KGlkKSktPmNoYXJzKTsgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTQ4ODo2OiAnc29sdmVyOicgKGlkPSBTdHJpbmdMaXRlcmFsIHxpZD0gSUQgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKDM3NiwgJkZPTExPV18zNzZfaW5fZXhwcmVzc2lvbl9ndWFyZDE5MTY0KTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbl9ndWFyZEV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NDg4OjE3OiAoaWQ9IFN0cmluZ0xpdGVyYWwgfGlkPSBJRCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDQ2Mz0yOworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBTdHJpbmdMaXRlcmFsOgorICAgICAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQlhbHQ0NjM9MTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIElEOgorICAgICAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQlhbHQ0NjM9MjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA0NjM7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25fZ3VhcmRFeDsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0NDYzKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU0ODg6MTk6IGlkPSBTdHJpbmdMaXRlcmFsCisgICAgICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlkID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoU3RyaW5nTGl0ZXJhbCwgJkZPTExPV19TdHJpbmdMaXRlcmFsX2luX2V4cHJlc3Npb25fZ3VhcmQxOTE3MSk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25fZ3VhcmRFeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTQ4ODozODogaWQ9IElECisgICAgICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlkID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoSUQsICZGT0xMT1dfSURfaW5fZXhwcmVzc2lvbl9ndWFyZDE5MTc3KTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbl9ndWFyZEV4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgc29sdmVySUQgPSBTVFIoKGlkLT5nZXRUZXh0KGlkKSktPmNoYXJzKTsgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb25fZ3VhcmQxOTE5NSk7CisgICAgICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25fZ3VhcmRFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgCQlpZiggc29sdmVySUQuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAgICAgCQkJYWM9IE5FV19TVE1UMSggT1AoQ0hFQ0tfU0FUKSwgCisgICAgICAgICAgICAgICAgZQorICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgICAgICAJCWVsc2UKKyAgICAgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgICAgICAJCQlhYz0gTkVXX1NUTVQyKCBPUChDSEVDS19TQVQpLCBORVdfU1RSSU5HKHNvbHZlcklEKSwgCisgICAgICAgICAgICAgICAgZQorICAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAgICAgCQorICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlZXhwcmVzc2lvbl9ndWFyZEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZWV4cHJlc3Npb25fZ3VhcmRFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDIwMSwgZXhwcmVzc2lvbl9ndWFyZF9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIGFjOworfQorLyogJEFOVExSIGVuZCBleHByZXNzaW9uX2d1YXJkICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IHN0YXRlbWVudF9pdGUKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU1MDc6MTogc3RhdGVtZW50X2l0ZSByZXR1cm5zIFsgc2VwOjpCRkNvZGUgYWMgXSA6ICdpZicgZT0gZXhwcmVzc2lvbiBicz0gYmxvY2tfc3RhdGVtZW50ICggKCAnZWxzZWlmJyB8ICdlbHNlJyAnaWYnICkgZT0gZXhwcmVzc2lvbiBicz0gYmxvY2tfc3RhdGVtZW50ICkqICggJ2Vsc2UnIGJzPSBibG9ja19zdGF0ZW1lbnQgKT8gOworICovCitzdGF0aWMgc2VwOjpCRkNvZGUKK3N0YXRlbWVudF9pdGUocGZtbFBhcnNlciBjdHgpCit7CisgICAgc2VwOjpCRkNvZGUgYWM7CisKKyAgICBBTlRMUjNfVUlOVDMyIHN0YXRlbWVudF9pdGVfU3RhcnRJbmRleDsKKworICAgIHNlcDo6QkYgZTsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfZQorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfZSBzZXA6OkJGCisKKyAgICBzZXA6OkJGQ29kZSBiczsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfYnMKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2JzIHNlcDo6QkZDb2RlCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgc3RhdGVtZW50X2l0ZV9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisKKyAgICAJc2VwOjpCRkNvZGUgZWxzZWlmQ29kZTsKKyAgICAJc2VwOjpCRkNvZGUgY29kZTsKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMjAyKSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiBhYzsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU1MTM6MjogKCAnaWYnIGU9IGV4cHJlc3Npb24gYnM9IGJsb2NrX3N0YXRlbWVudCAoICggJ2Vsc2VpZicgfCAnZWxzZScgJ2lmJyApIGU9IGV4cHJlc3Npb24gYnM9IGJsb2NrX3N0YXRlbWVudCApKiAoICdlbHNlJyBicz0gYmxvY2tfc3RhdGVtZW50ICk/ICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTUxMzo0OiAnaWYnIGU9IGV4cHJlc3Npb24gYnM9IGJsb2NrX3N0YXRlbWVudCAoICggJ2Vsc2VpZicgfCAnZWxzZScgJ2lmJyApIGU9IGV4cHJlc3Npb24gYnM9IGJsb2NrX3N0YXRlbWVudCApKiAoICdlbHNlJyBicz0gYmxvY2tfc3RhdGVtZW50ICk/CisgICAgICAgIHsKKyAgICAgICAgICAgICBNQVRDSFQoMjk0LCAmRk9MTE9XXzI5NF9pbl9zdGF0ZW1lbnRfaXRlMTkyMjEpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfaXRlRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2l0ZTE5MjI2KTsKKyAgICAgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2l0ZUV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19ibG9ja19zdGF0ZW1lbnRfaW5fc3RhdGVtZW50X2l0ZTE5MjMxKTsKKyAgICAgICAgICAgIGJzPWJsb2NrX3N0YXRlbWVudChjdHgpOworCisgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2l0ZUV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIGNvZGUgPSBhYz0gTkVXX1NUTVQyKE9QKElGKSwgCisgICAgICAgICAgICAgICAgZQorICAgICAgICAgICAgICAgICwgYnMKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NTE1OjQ6ICggKCAnZWxzZWlmJyB8ICdlbHNlJyAnaWYnICkgZT0gZXhwcmVzc2lvbiBicz0gYmxvY2tfc3RhdGVtZW50ICkqCisKKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDQ2Nj0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAyNzM6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgICAgICAJCSAgIC8qIGRmYUxvb3BiYWNrU3RhdGUoayxlZGdlcyxlb3RQcmVkaWN0c0FsdCxkZXNjcmlwdGlvbixzdGF0ZU51bWJlcixzZW1QcmVkU3RhdGUpCisgICAgICAgICAgICAgICAgCQkgICAgKi8KKyAgICAgICAgICAgICAgICAJCSAgICBpbnQgTEE0NjZfMSA9IExBKDIpOworICAgICAgICAgICAgICAgIAkJICAgIGlmICggKHN5bnByZWQ4OTFfZm1sKGN0eCkpKQorICAgICAgICAgICAgICAgIAkJICAgIHsKKyAgICAgICAgICAgICAgICAJCSAgICAgICAgYWx0NDY2PTE7CisgICAgICAgICAgICAgICAgCQkgICAgfQorCisgICAgICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyNzQ6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDQ2Nj0xOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ0NjYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTUxNTo2OiAoICdlbHNlaWYnIHwgJ2Vsc2UnICdpZicgKSBlPSBleHByZXNzaW9uIGJzPSBibG9ja19zdGF0ZW1lbnQKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTUxNTo2OiAoICdlbHNlaWYnIHwgJ2Vsc2UnICdpZicgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQ0NjU9MjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjc0OgorICAgICAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQlhbHQ0NjU9MTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI3MzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJYWx0NDY1PTI7CisgICAgICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gNDY1OworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfaXRlRXg7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ2NSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NTE1Ojg6ICdlbHNlaWYnCisgICAgICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoMjc0LCAmRk9MTE9XXzI3NF9pbl9zdGF0ZW1lbnRfaXRlMTkyNDUpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfaXRlRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDI6CisgICAgICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU1MTU6MTk6ICdlbHNlJyAnaWYnCisgICAgICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoMjczLCAmRk9MTE9XXzI3M19pbl9zdGF0ZW1lbnRfaXRlMTkyNDkpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfaXRlRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoMjk0LCAmRk9MTE9XXzI5NF9pbl9zdGF0ZW1lbnRfaXRlMTkyNTEpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfaXRlRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfaXRlMTkyNTgpOworICAgICAgICAgICAgCSAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfaXRlRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9zdGF0ZW1lbnRfaXRlMTkyNjMpOworICAgICAgICAgICAgCSAgICAgICAgYnM9YmxvY2tfc3RhdGVtZW50KGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfaXRlRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgCWNvZGUtPnNldE9wZXJhdG9yKE9QKElGRSkpOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgCWNvZGUtPmFwcGVuZChlbHNlaWZDb2RlID0gTkVXX1NUTVQyKE9QKElGKSwgZQorICAgICAgICAgICAgCSAgICAgICAgICAgICwgYnMKKyAgICAgICAgICAgIAkgICAgICAgICAgICApKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIAljb2RlID0gZWxzZWlmQ29kZTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQ6CisgICAgICAgICAgICAJICAgIGdvdG8gbG9vcDQ2NjsJLyogYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvb3A0NjY6IDsgLyogSnVtcCBvdXQgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NTIyOjQ6ICggJ2Vsc2UnIGJzPSBibG9ja19zdGF0ZW1lbnQgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0NDY3PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNzM6CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJYWx0NDY3PTE7CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ2NykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NTIyOjY6ICdlbHNlJyBicz0gYmxvY2tfc3RhdGVtZW50CisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoMjczLCAmRk9MTE9XXzI3M19pbl9zdGF0ZW1lbnRfaXRlMTkyODMpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfaXRlRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2Jsb2NrX3N0YXRlbWVudF9pbl9zdGF0ZW1lbnRfaXRlMTkyODgpOworICAgICAgICAgICAgCSAgICAgICAgYnM9YmxvY2tfc3RhdGVtZW50KGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfaXRlRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgCWlmKCBicworICAgICAgICAgICAgCSAgICAgICAgICAgIC0+bm9uZW1wdHkoKSApCisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAJeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgCQljb2RlLT5zZXRPcGVyYXRvcihPUChJRkUpKTsgY29kZS0+YXBwZW5kKGJzCisgICAgICAgICAgICAJICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlc3RhdGVtZW50X2l0ZUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZXN0YXRlbWVudF9pdGVFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDIwMiwgc3RhdGVtZW50X2l0ZV9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIGFjOworfQorLyogJEFOVExSIGVuZCBzdGF0ZW1lbnRfaXRlICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGV4cHJlc3Npb25faXRlCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NTMyOjE6IGV4cHJlc3Npb25faXRlIHJldHVybnMgWyBzZXA6OkJGQ29kZSBhYyBdIDogJ2lmJyBjPSBleHByZXNzaW9uIExDVVJMWSBlPSBleHByZXNzaW9uIFJDVVJMWSAoICggJ2Vsc2VpZicgfCAnZWxzZScgJ2lmJyApIGM9IGV4cHJlc3Npb24gTENVUkxZIGU9IGV4cHJlc3Npb24gUkNVUkxZICkqICggJ2Vsc2UnIExDVVJMWSBlPSBleHByZXNzaW9uIFJDVVJMWSApPyA7CisgKi8KK3N0YXRpYyBzZXA6OkJGQ29kZQorZXhwcmVzc2lvbl9pdGUocGZtbFBhcnNlciBjdHgpCit7CisgICAgc2VwOjpCRkNvZGUgYWM7CisKKyAgICBBTlRMUjNfVUlOVDMyIGV4cHJlc3Npb25faXRlX1N0YXJ0SW5kZXg7CisKKyAgICBzZXA6OkJGIGM7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2MKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2Mgc2VwOjpCRgorCisgICAgc2VwOjpCRiBlOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9lCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9lIHNlcDo6QkYKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBleHByZXNzaW9uX2l0ZV9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisKKyAgICAJc2VwOjpCRkNvZGUgZWxzZWlmRXhwcjsKKyAgICAJc2VwOjpCRkNvZGUgZXhwcjsKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMjAzKSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiBhYzsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU1Mzg6MjogKCAnaWYnIGM9IGV4cHJlc3Npb24gTENVUkxZIGU9IGV4cHJlc3Npb24gUkNVUkxZICggKCAnZWxzZWlmJyB8ICdlbHNlJyAnaWYnICkgYz0gZXhwcmVzc2lvbiBMQ1VSTFkgZT0gZXhwcmVzc2lvbiBSQ1VSTFkgKSogKCAnZWxzZScgTENVUkxZIGU9IGV4cHJlc3Npb24gUkNVUkxZICk/ICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTUzODo0OiAnaWYnIGM9IGV4cHJlc3Npb24gTENVUkxZIGU9IGV4cHJlc3Npb24gUkNVUkxZICggKCAnZWxzZWlmJyB8ICdlbHNlJyAnaWYnICkgYz0gZXhwcmVzc2lvbiBMQ1VSTFkgZT0gZXhwcmVzc2lvbiBSQ1VSTFkgKSogKCAnZWxzZScgTENVUkxZIGU9IGV4cHJlc3Npb24gUkNVUkxZICk/CisgICAgICAgIHsKKyAgICAgICAgICAgICBNQVRDSFQoMjk0LCAmRk9MTE9XXzI5NF9pbl9leHByZXNzaW9uX2l0ZTE5MzIwKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbl9pdGVFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uX2l0ZTE5MzI1KTsKKyAgICAgICAgICAgIGM9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbl9pdGVFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgIE1BVENIVChMQ1VSTFksICZGT0xMT1dfTENVUkxZX2luX2V4cHJlc3Npb25faXRlMTkzMjgpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVleHByZXNzaW9uX2l0ZUV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb25faXRlMTkzMzMpOworICAgICAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVleHByZXNzaW9uX2l0ZUV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgTUFUQ0hUKFJDVVJMWSwgJkZPTExPV19SQ1VSTFlfaW5fZXhwcmVzc2lvbl9pdGUxOTMzNik7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25faXRlRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgZXhwciA9IGFjPSBORVdfU1RNVDIoT1AoSUYpLCAKKyAgICAgICAgICAgICAgICBjCisgICAgICAgICAgICAgICAgLCBlCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTU0MDo0OiAoICggJ2Vsc2VpZicgfCAnZWxzZScgJ2lmJyApIGM9IGV4cHJlc3Npb24gTENVUkxZIGU9IGV4cHJlc3Npb24gUkNVUkxZICkqCisKKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDQ2OT0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAyNzM6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgICAgICAJCSAgIC8qIGRmYUxvb3BiYWNrU3RhdGUoayxlZGdlcyxlb3RQcmVkaWN0c0FsdCxkZXNjcmlwdGlvbixzdGF0ZU51bWJlcixzZW1QcmVkU3RhdGUpCisgICAgICAgICAgICAgICAgCQkgICAgKi8KKyAgICAgICAgICAgICAgICAJCSAgICBpbnQgTEE0NjlfMSA9IExBKDIpOworICAgICAgICAgICAgICAgIAkJICAgIGlmICggKHN5bnByZWQ4OTRfZm1sKGN0eCkpKQorICAgICAgICAgICAgICAgIAkJICAgIHsKKyAgICAgICAgICAgICAgICAJCSAgICAgICAgYWx0NDY5PTE7CisgICAgICAgICAgICAgICAgCQkgICAgfQorCisgICAgICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyNzQ6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDQ2OT0xOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ0NjkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTU0MDo2OiAoICdlbHNlaWYnIHwgJ2Vsc2UnICdpZicgKSBjPSBleHByZXNzaW9uIExDVVJMWSBlPSBleHByZXNzaW9uIFJDVVJMWQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NTQwOjY6ICggJ2Vsc2VpZicgfCAnZWxzZScgJ2lmJyApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDQ2OD0yOworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSAyNzQ6CisgICAgICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCWFsdDQ2OD0xOworICAgICAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjczOgorICAgICAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQlhbHQ0Njg9MjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA0Njg7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25faXRlRXg7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ2OCkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NTQwOjg6ICdlbHNlaWYnCisgICAgICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoMjc0LCAmRk9MTE9XXzI3NF9pbl9leHByZXNzaW9uX2l0ZTE5MzUwKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbl9pdGVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTU0MDoxOTogJ2Vsc2UnICdpZicKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVCgyNzMsICZGT0xMT1dfMjczX2luX2V4cHJlc3Npb25faXRlMTkzNTQpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleHByZXNzaW9uX2l0ZUV4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKDI5NCwgJkZPTExPV18yOTRfaW5fZXhwcmVzc2lvbl9pdGUxOTM1Nik7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25faXRlRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uX2l0ZTE5MzYyKTsKKyAgICAgICAgICAgIAkgICAgICAgIGM9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbl9pdGVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChMQ1VSTFksICZGT0xMT1dfTENVUkxZX2luX2V4cHJlc3Npb25faXRlMTkzNjUpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleHByZXNzaW9uX2l0ZUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb25faXRlMTkzNzApOworICAgICAgICAgICAgCSAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleHByZXNzaW9uX2l0ZUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKFJDVVJMWSwgJkZPTExPV19SQ1VSTFlfaW5fZXhwcmVzc2lvbl9pdGUxOTM3Myk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25faXRlRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJCWV4cHItPnNldE9wZXJhdG9yKE9QKElGRSkpOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgCWV4cHItPmFwcGVuZChlbHNlaWZFeHByID0gTkVXX1NUTVQyKE9QKElGKSwgYworICAgICAgICAgICAgCSAgICAgICAgICAgICwgZQorICAgICAgICAgICAgCSAgICAgICAgICAgICkpOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgCWV4cHIgPSBlbHNlaWZFeHByOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdDoKKyAgICAgICAgICAgIAkgICAgZ290byBsb29wNDY5OwkvKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgKi8KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9vcDQ2OTogOyAvKiBKdW1wIG91dCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU1NDc6NDogKCAnZWxzZScgTENVUkxZIGU9IGV4cHJlc3Npb24gUkNVUkxZICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDQ3MD0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjczOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCWFsdDQ3MD0xOworICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ0NzApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTU0Nzo2OiAnZWxzZScgTENVUkxZIGU9IGV4cHJlc3Npb24gUkNVUkxZCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoMjczLCAmRk9MTE9XXzI3M19pbl9leHByZXNzaW9uX2l0ZTE5MzkzKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbl9pdGVFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChMQ1VSTFksICZGT0xMT1dfTENVUkxZX2luX2V4cHJlc3Npb25faXRlMTkzOTYpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleHByZXNzaW9uX2l0ZUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb25faXRlMTk0MDEpOworICAgICAgICAgICAgCSAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleHByZXNzaW9uX2l0ZUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKFJDVVJMWSwgJkZPTExPV19SQ1VSTFlfaW5fZXhwcmVzc2lvbl9pdGUxOTQwNCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25faXRlRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgZXhwci0+c2V0T3BlcmF0b3IoT1AoSUZFKSk7IGV4cHItPmFwcGVuZChlCisgICAgICAgICAgICAJICAgICAgICAgICAgKTsgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZWV4cHJlc3Npb25faXRlRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlZXhwcmVzc2lvbl9pdGVFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDIwMywgZXhwcmVzc2lvbl9pdGVfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiBhYzsKK30KKy8qICRBTlRMUiBlbmQgZXhwcmVzc2lvbl9pdGUgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgc3RhdGVtZW50X2l0ZXJhdGlvbgorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTU3MToxOiBzdGF0ZW1lbnRfaXRlcmF0aW9uIHJldHVybnMgWyBzZXA6OkJGQ29kZSBhYyBdIDogKCAnZm9yJyAoaXNhPSBmb3JfYXNzaWduX2hlYWRlciBTRU1JIGU9IGV4cHJlc3Npb24gU0VNSSBzYWk9IGZvcl9hc3NpZ25faGVhZGVyIHwgTFBBUkVOIGlzYT0gZm9yX2Fzc2lnbl9oZWFkZXIgU0VNSSBlPSBleHByZXNzaW9uIFNFTUkgc2FpPSBmb3JfYXNzaWduX2hlYWRlciBSUEFSRU4gfGx2PSBsdmFsdWUgQ09MT04gZT0gZXhwcmVzc2lvbiB8IExQQVJFTiBsdj0gbHZhbHVlIENPTE9OIGU9IGV4cHJlc3Npb24gUlBBUkVOICkgc2E9IGJsb2NrX3N0YXRlbWVudCB8ICd3aGlsZScgZT0gZXhwcmVzc2lvbiBicz0gYmxvY2tfc3RhdGVtZW50IHwgJ2RvJyBicz0gYmxvY2tfc3RhdGVtZW50ICd3aGlsZScgZT0gZXhwcmVzc2lvbiBTRU1JICk7CisgKi8KK3N0YXRpYyBzZXA6OkJGQ29kZQorc3RhdGVtZW50X2l0ZXJhdGlvbihwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBzZXA6OkJGQ29kZSBhYzsKKworICAgIEFOVExSM19VSU5UMzIgc3RhdGVtZW50X2l0ZXJhdGlvbl9TdGFydEluZGV4OworCisgICAgc2VwOjpCRkNvZGUgaXNhOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9pc2EKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2lzYSBzZXA6OkJGQ29kZQorCisgICAgc2VwOjpCRiBlOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9lCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9lIHNlcDo6QkYKKworICAgIHNlcDo6QkZDb2RlIHNhaTsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfc2FpCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9zYWkgc2VwOjpCRkNvZGUKKworICAgIHNlcDo6QkYgbHY7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2x2CisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9sdiBzZXA6OkJGCisKKyAgICBzZXA6OkJGQ29kZSBzYTsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfc2EKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX3NhIHNlcDo6QkZDb2RlCisKKyAgICBzZXA6OkJGQ29kZSBiczsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfYnMKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2JzIHNlcDo6QkZDb2RlCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgc3RhdGVtZW50X2l0ZXJhdGlvbl9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgyMDQpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIGFjOworICAgIH0KKworICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU1NzM6MjogKCAnZm9yJyAoaXNhPSBmb3JfYXNzaWduX2hlYWRlciBTRU1JIGU9IGV4cHJlc3Npb24gU0VNSSBzYWk9IGZvcl9hc3NpZ25faGVhZGVyIHwgTFBBUkVOIGlzYT0gZm9yX2Fzc2lnbl9oZWFkZXIgU0VNSSBlPSBleHByZXNzaW9uIFNFTUkgc2FpPSBmb3JfYXNzaWduX2hlYWRlciBSUEFSRU4gfGx2PSBsdmFsdWUgQ09MT04gZT0gZXhwcmVzc2lvbiB8IExQQVJFTiBsdj0gbHZhbHVlIENPTE9OIGU9IGV4cHJlc3Npb24gUlBBUkVOICkgc2E9IGJsb2NrX3N0YXRlbWVudCB8ICd3aGlsZScgZT0gZXhwcmVzc2lvbiBicz0gYmxvY2tfc3RhdGVtZW50IHwgJ2RvJyBicz0gYmxvY2tfc3RhdGVtZW50ICd3aGlsZScgZT0gZXhwcmVzc2lvbiBTRU1JICkKKworICAgICAgICAgICAgQU5UTFIzX1VJTlQzMiBhbHQ0NzI7CisKKyAgICAgICAgICAgIGFsdDQ3Mj0zOworCisgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDI4NToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQ3Mj0xOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDE2OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDcyPTI7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNjk6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ0NzI9MzsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA0NzI7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfaXRlcmF0aW9uRXg7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQ0NzIpCisgICAgICAgICAgICB7CisgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTU3Mzo0OiAnZm9yJyAoaXNhPSBmb3JfYXNzaWduX2hlYWRlciBTRU1JIGU9IGV4cHJlc3Npb24gU0VNSSBzYWk9IGZvcl9hc3NpZ25faGVhZGVyIHwgTFBBUkVOIGlzYT0gZm9yX2Fzc2lnbl9oZWFkZXIgU0VNSSBlPSBleHByZXNzaW9uIFNFTUkgc2FpPSBmb3JfYXNzaWduX2hlYWRlciBSUEFSRU4gfGx2PSBsdmFsdWUgQ09MT04gZT0gZXhwcmVzc2lvbiB8IExQQVJFTiBsdj0gbHZhbHVlIENPTE9OIGU9IGV4cHJlc3Npb24gUlBBUkVOICkgc2E9IGJsb2NrX3N0YXRlbWVudAorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgyODUsICZGT0xMT1dfMjg1X2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTQ1MSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9pdGVyYXRpb25FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTU3NDo0OiAoaXNhPSBmb3JfYXNzaWduX2hlYWRlciBTRU1JIGU9IGV4cHJlc3Npb24gU0VNSSBzYWk9IGZvcl9hc3NpZ25faGVhZGVyIHwgTFBBUkVOIGlzYT0gZm9yX2Fzc2lnbl9oZWFkZXIgU0VNSSBlPSBleHByZXNzaW9uIFNFTUkgc2FpPSBmb3JfYXNzaWduX2hlYWRlciBSUEFSRU4gfGx2PSBsdmFsdWUgQ09MT04gZT0gZXhwcmVzc2lvbiB8IExQQVJFTiBsdj0gbHZhbHVlIENPTE9OIGU9IGV4cHJlc3Npb24gUlBBUkVOICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDQ3MT00OworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgY2FzZSBDT0xPTngyOgorICAgICAgICAJICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAJCXsKKyAgICAgICAgCSAgICAgICAgICAgIAkJICAgIGludCBMQTQ3MV8xID0gTEEoMik7CisgICAgICAgIAkgICAgICAgICAgICAJCSAgICBpZiAoIChzeW5wcmVkODk2X2ZtbChjdHgpKSkKKyAgICAgICAgCSAgICAgICAgICAgIAkJICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIAkJICAgICAgICBhbHQ0NzE9MTsKKyAgICAgICAgCSAgICAgICAgICAgIAkJICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgIAkJICAgIGVsc2UgaWYgKCAoc3lucHJlZDg5OF9mbWwoY3R4KSkpCisgICAgICAgIAkgICAgICAgICAgICAJCSAgICB7CisgICAgICAgIAkgICAgICAgICAgICAJCSAgICAgICAgYWx0NDcxPTM7CisgICAgICAgIAkgICAgICAgICAgICAJCSAgICB9CisgICAgICAgIAkgICAgICAgICAgICAJCSAgICBlbHNlCisgICAgICAgIAkgICAgICAgICAgICAJCSAgICB7CisgICAgICAgIAkgICAgICAgICAgICAJCSAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJICAgICAgICAgICAgCQkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIAkJICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAJICAgICAgICAgICAgCQkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgICAgICAJCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgICAgIAkJICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAJICAgICAgICAgICAgCQkgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAJICAgICAgICAgICAgCQkgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgCSAgICAgICAgICAgIAkJICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDQ3MTsKKyAgICAgICAgCSAgICAgICAgICAgIAkJICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDE7CisKKworICAgICAgICAJICAgICAgICAgICAgCQkgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9pdGVyYXRpb25FeDsKKworICAgICAgICAJICAgICAgICAgICAgCQkgICAgfQorICAgICAgICAJICAgICAgICAgICAgCQl9CisgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgY2FzZSBMUEFSRU46CisgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgCQl7CisgICAgICAgIAkgICAgICAgICAgICAJCSAgICBpbnQgTEE0NzFfNCA9IExBKDIpOworICAgICAgICAJICAgICAgICAgICAgCQkgICAgaWYgKCAoc3lucHJlZDg5N19mbWwoY3R4KSkpCisgICAgICAgIAkgICAgICAgICAgICAJCSAgICB7CisgICAgICAgIAkgICAgICAgICAgICAJCSAgICAgICAgYWx0NDcxPTI7CisgICAgICAgIAkgICAgICAgICAgICAJCSAgICB9CisgICAgICAgIAkgICAgICAgICAgICAJCSAgICBlbHNlIGlmICggKEFOVExSM19UUlVFKSkKKyAgICAgICAgCSAgICAgICAgICAgIAkJICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIAkJICAgICAgICBhbHQ0NzE9NDsKKyAgICAgICAgCSAgICAgICAgICAgIAkJICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgIAkJICAgIGVsc2UKKyAgICAgICAgCSAgICAgICAgICAgIAkJICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIAkJICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgIAkgICAgICAgICAgICAJCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgCQkgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgIAkgICAgICAgICAgICAJCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgICAgIAkJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAgICAgCQkgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgIAkgICAgICAgICAgICAJCSAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgIAkgICAgICAgICAgICAJCSAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAJICAgICAgICAgICAgCQkgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gNDcxOworICAgICAgICAJICAgICAgICAgICAgCQkgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gNDsKKworCisgICAgICAgIAkgICAgICAgICAgICAJCSAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2l0ZXJhdGlvbkV4OworCisgICAgICAgIAkgICAgICAgICAgICAJCSAgICB9CisgICAgICAgIAkgICAgICAgICAgICAJCX0KKyAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIERFQ1I6CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIElOQ1I6CisgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgCQlhbHQ0NzE9MTsKKyAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIAkgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA0NzE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfaXRlcmF0aW9uRXg7CisKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQ0NzEpCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTU3NDo2OiBpc2E9IGZvcl9hc3NpZ25faGVhZGVyIFNFTUkgZT0gZXhwcmVzc2lvbiBTRU1JIHNhaT0gZm9yX2Fzc2lnbl9oZWFkZXIKKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2Zvcl9hc3NpZ25faGVhZGVyX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTQ2MCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlzYT1mb3JfYXNzaWduX2hlYWRlcihjdHgpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfaXRlcmF0aW9uRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoU0VNSSwgJkZPTExPV19TRU1JX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTQ2Myk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9pdGVyYXRpb25FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk0NjgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2l0ZXJhdGlvbkV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKFNFTUksICZGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk0NzEpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfaXRlcmF0aW9uRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2Zvcl9hc3NpZ25faGVhZGVyX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTQ3Nik7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHNhaT1mb3JfYXNzaWduX2hlYWRlcihjdHgpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfaXRlcmF0aW9uRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIGFjPSBORVdfU1RNVDMoT1AoRk9SKSwgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpc2EKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICwgZQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgLCBzYWkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAJY2FzZSAyOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU1Nzc6NjogTFBBUkVOIGlzYT0gZm9yX2Fzc2lnbl9oZWFkZXIgU0VNSSBlPSBleHByZXNzaW9uIFNFTUkgc2FpPSBmb3JfYXNzaWduX2hlYWRlciBSUEFSRU4KKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoTFBBUkVOLCAmRk9MTE9XX0xQQVJFTl9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk0OTUpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfaXRlcmF0aW9uRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2Zvcl9hc3NpZ25faGVhZGVyX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTUwNik7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlzYT1mb3JfYXNzaWduX2hlYWRlcihjdHgpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfaXRlcmF0aW9uRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoU0VNSSwgJkZPTExPV19TRU1JX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTUwOSk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9pdGVyYXRpb25FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk1MTQpOworICAgICAgICAJICAgICAgICAJICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2l0ZXJhdGlvbkV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKFNFTUksICZGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk1MTcpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfaXRlcmF0aW9uRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2Zvcl9hc3NpZ25faGVhZGVyX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTUyMik7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHNhaT1mb3JfYXNzaWduX2hlYWRlcihjdHgpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfaXRlcmF0aW9uRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoUlBBUkVOLCAmRk9MTE9XX1JQQVJFTl9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk1MjkpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfaXRlcmF0aW9uRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIGFjPSBORVdfU1RNVDMoT1AoRk9SKSwgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBpc2EKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICwgZQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgLCBzYWkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAJY2FzZSAzOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU1ODI6NjogbHY9IGx2YWx1ZSBDT0xPTiBlPSBleHByZXNzaW9uCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19sdmFsdWVfaW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NTUwKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgbHY9bHZhbHVlKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9pdGVyYXRpb25FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChDT0xPTiwgJkZPTExPV19DT0xPTl9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk1NTMpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfaXRlcmF0aW9uRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NTU4KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9pdGVyYXRpb25FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgYWM9IE5FV19TVE1UMihPUChGT1JFQUNIKSwgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBsdgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgLCBlCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICApOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgNDoKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NTg1OjY6IExQQVJFTiBsdj0gbHZhbHVlIENPTE9OIGU9IGV4cHJlc3Npb24gUlBBUkVOCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKExQQVJFTiwgJkZPTExPV19MUEFSRU5faW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NTc3KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2l0ZXJhdGlvbkV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19sdmFsdWVfaW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NTgyKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgbHY9bHZhbHVlKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9pdGVyYXRpb25FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChDT0xPTiwgJkZPTExPV19DT0xPTl9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk1ODUpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfaXRlcmF0aW9uRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NTkwKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9pdGVyYXRpb25FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChSUEFSRU4sICZGT0xMT1dfUlBBUkVOX2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTU5Myk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9pdGVyYXRpb25FeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgYWM9IE5FV19TVE1UMihPUChGT1JFQUNIKSwgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBsdgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgLCBlCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICApOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTYxMik7CisgICAgICAgIAkgICAgICAgIHNhPWJsb2NrX3N0YXRlbWVudChjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfaXRlcmF0aW9uRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGFjCisgICAgICAgIAkgICAgICAgICAgICAtPmFwcGVuZChzYQorICAgICAgICAJICAgICAgICAgICAgKTsgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAyOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU1OTA6NDogJ3doaWxlJyBlPSBleHByZXNzaW9uIGJzPSBibG9ja19zdGF0ZW1lbnQKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoNDE2LCAmRk9MTE9XXzQxNl9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk2MjEpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfaXRlcmF0aW9uRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NjI2KTsKKyAgICAgICAgCSAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9pdGVyYXRpb25FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTYzMSk7CisgICAgICAgIAkgICAgICAgIGJzPWJsb2NrX3N0YXRlbWVudChjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfaXRlcmF0aW9uRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGFjPSBORVdfU1RNVDIoT1AoV0hJTEVfRE8pLCAKKyAgICAgICAgCSAgICAgICAgICAgIGUKKyAgICAgICAgCSAgICAgICAgICAgICwgYnMKKyAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAzOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU1OTM6NDogJ2RvJyBicz0gYmxvY2tfc3RhdGVtZW50ICd3aGlsZScgZT0gZXhwcmVzc2lvbiBTRU1JCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDI2OSwgJkZPTExPV18yNjlfaW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NjQwKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2l0ZXJhdGlvbkV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19ibG9ja19zdGF0ZW1lbnRfaW5fc3RhdGVtZW50X2l0ZXJhdGlvbjE5NjQ1KTsKKyAgICAgICAgCSAgICAgICAgYnM9YmxvY2tfc3RhdGVtZW50KGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9pdGVyYXRpb25FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCg0MTYsICZGT0xMT1dfNDE2X2luX3N0YXRlbWVudF9pdGVyYXRpb24xOTY0OCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9pdGVyYXRpb25FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk2NTMpOworICAgICAgICAJICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2l0ZXJhdGlvbkV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAgTUFUQ0hUKFNFTUksICZGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfaXRlcmF0aW9uMTk2NTYpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfaXRlcmF0aW9uRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGFjPSBORVdfU1RNVDIoT1AoRE9fV0hJTEUpLCAKKyAgICAgICAgCSAgICAgICAgICAgIGJzCisgICAgICAgIAkgICAgICAgICAgICAsIGUKKyAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfaXRlcmF0aW9uRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlc3RhdGVtZW50X2l0ZXJhdGlvbkV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMjA0LCBzdGF0ZW1lbnRfaXRlcmF0aW9uX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gYWM7Cit9CisvKiAkQU5UTFIgZW5kIHN0YXRlbWVudF9pdGVyYXRpb24gKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgZm9yX2Fzc2lnbl9oZWFkZXIKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU1OTg6MTogZm9yX2Fzc2lnbl9oZWFkZXIgcmV0dXJucyBbIHNlcDo6QkZDb2RlIGFjIF0gOiAobHY9IGx2YWx1ZSAoIEFTU0lHTiBlPSBleHByZXNzaW9uIHwgSU5DUiB8IERFQ1IgKSB8IElOQ1IgbHY9IGx2YWx1ZSB8IERFQ1IgbHY9IGx2YWx1ZSApOworICovCitzdGF0aWMgc2VwOjpCRkNvZGUKK2Zvcl9hc3NpZ25faGVhZGVyKHBmbWxQYXJzZXIgY3R4KQoreworICAgIHNlcDo6QkZDb2RlIGFjOworCisgICAgQU5UTFIzX1VJTlQzMiBmb3JfYXNzaWduX2hlYWRlcl9TdGFydEluZGV4OworCisgICAgc2VwOjpCRiBsdjsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfbHYKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2x2IHNlcDo6QkYKKworICAgIHNlcDo6QkYgZTsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfZQorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfZSBzZXA6OkJGCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgZm9yX2Fzc2lnbl9oZWFkZXJfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMjA1KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiBhYzsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vICAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NjAxOjI6IChsdj0gbHZhbHVlICggQVNTSUdOIGU9IGV4cHJlc3Npb24gfCBJTkNSIHwgREVDUiApIHwgSU5DUiBsdj0gbHZhbHVlIHwgREVDUiBsdj0gbHZhbHVlICkKKworICAgICAgICAgICAgQU5UTFIzX1VJTlQzMiBhbHQ0NzQ7CisKKyAgICAgICAgICAgIGFsdDQ3ND0zOworCisgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIENPTE9OeDI6CisgICAgICAgICAgICBjYXNlIElEOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDc0PTE7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBJTkNSOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDc0PTI7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBERUNSOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDc0PTM7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gNDc0OworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgZ290byBydWxlZm9yX2Fzc2lnbl9oZWFkZXJFeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ3NCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NjAxOjQ6IGx2PSBsdmFsdWUgKCBBU1NJR04gZT0gZXhwcmVzc2lvbiB8IElOQ1IgfCBERUNSICkKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2x2YWx1ZV9pbl9mb3JfYXNzaWduX2hlYWRlcjE5Njc5KTsKKyAgICAgICAgCSAgICAgICAgbHY9bHZhbHVlKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWZvcl9hc3NpZ25faGVhZGVyRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU2MDI6MjogKCBBU1NJR04gZT0gZXhwcmVzc2lvbiB8IElOQ1IgfCBERUNSICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDQ3Mz0zOworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgY2FzZSBBU1NJR046CisgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgCQlhbHQ0NzM9MTsKKyAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIElOQ1I6CisgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgCQlhbHQ0NzM9MjsKKyAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIERFQ1I6CisgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgCQlhbHQ0NzM9MzsKKyAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIAkgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA0NzM7CisgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVmb3JfYXNzaWduX2hlYWRlckV4OworCisgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0NDczKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU2MDI6NDogQVNTSUdOIGU9IGV4cHJlc3Npb24KKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoQVNTSUdOLCAmRk9MTE9XX0FTU0lHTl9pbl9mb3JfYXNzaWduX2hlYWRlcjE5Njg0KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZm9yX2Fzc2lnbl9oZWFkZXJFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9mb3JfYXNzaWduX2hlYWRlcjE5Njg5KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWZvcl9hc3NpZ25faGVhZGVyRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIGFjPSBORVdfU1RNVDIoT1AoQVNTSUdOKSwgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBsdgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgLCBlCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICApOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NjA3OjQ6IElOQ1IKKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoSU5DUiwgJkZPTExPV19JTkNSX2luX2Zvcl9hc3NpZ25faGVhZGVyMTk3MDIpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVmb3JfYXNzaWduX2hlYWRlckV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICBhYz0gTkVXX1NUTVRfQVNTSUdOX09QKE9QKFBMVVMpLCAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGx2CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAsCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJCXNlcDo6RXhwcmVzc2lvbkNvbnN0YW50OjpJTlRFR0VSX09ORSk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAJY2FzZSAzOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU2MTI6NDogREVDUgorICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChERUNSLCAmRk9MTE9XX0RFQ1JfaW5fZm9yX2Fzc2lnbl9oZWFkZXIxOTcxMyk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWZvcl9hc3NpZ25faGVhZGVyRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIGFjPSBORVdfU1RNVF9BU1NJR05fT1AoT1AoUExVUyksIAorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgbHYKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICwKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkJc2VwOjpFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfTUlOVVNfT05FKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAyOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU2MTc6NDogSU5DUiBsdj0gbHZhbHVlCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKElOQ1IsICZGT0xMT1dfSU5DUl9pbl9mb3JfYXNzaWduX2hlYWRlcjE5NzI1KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZm9yX2Fzc2lnbl9oZWFkZXJFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfbHZhbHVlX2luX2Zvcl9hc3NpZ25faGVhZGVyMTk3MzApOworICAgICAgICAJICAgICAgICBsdj1sdmFsdWUoY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZm9yX2Fzc2lnbl9oZWFkZXJFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgYWM9IE5FV19TVE1UX0FTU0lHTl9PUChPUChQTFVTKSwgCisgICAgICAgIAkgICAgICAgICAgICBsdgorICAgICAgICAJICAgICAgICAgICAgLAorICAgICAgICAJICAgICAgICAgICAgCQkgc2VwOjpFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfT05FKTsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDM6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTYyMjo0OiBERUNSIGx2PSBsdmFsdWUKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoREVDUiwgJkZPTExPV19ERUNSX2luX2Zvcl9hc3NpZ25faGVhZGVyMTk3NDEpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVmb3JfYXNzaWduX2hlYWRlckV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19sdmFsdWVfaW5fZm9yX2Fzc2lnbl9oZWFkZXIxOTc0Nik7CisgICAgICAgIAkgICAgICAgIGx2PWx2YWx1ZShjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVmb3JfYXNzaWduX2hlYWRlckV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBhYz0gTkVXX1NUTVRfQVNTSUdOX09QKE9QKFBMVVMpLCAKKyAgICAgICAgCSAgICAgICAgICAgIGx2CisgICAgICAgIAkgICAgICAgICAgICAsCisgICAgICAgIAkgICAgICAgICAgICAJCXNlcDo6RXhwcmVzc2lvbkNvbnN0YW50OjpJTlRFR0VSX01JTlVTX09ORSk7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVmb3JfYXNzaWduX2hlYWRlckV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZWZvcl9hc3NpZ25faGVhZGVyRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgyMDUsIGZvcl9hc3NpZ25faGVhZGVyX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gYWM7Cit9CisvKiAkQU5UTFIgZW5kIGZvcl9hc3NpZ25faGVhZGVyICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IHN0YXRlbWVudF9qdW1wCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NjMyOjE6IHN0YXRlbWVudF9qdW1wIHJldHVybnMgWyBzZXA6OkJGQ29kZSBhYyBdIDogKCAnYnJlYWsnIChlPSBleHByZXNzaW9uICk/IFNFTUkgfCAnY29udGludWUnIChlPSBleHByZXNzaW9uICk/IFNFTUkgfCAncmV0dXJuJyAoZT0gZXhwcmVzc2lvbiAoIENPTU1BIGU9IGV4cHJlc3Npb24gKSogKT8gU0VNSSB8ICdleGl0JyAoZT0gZXhwcmVzc2lvbiApPyBTRU1JICk7CisgKi8KK3N0YXRpYyBzZXA6OkJGQ29kZQorc3RhdGVtZW50X2p1bXAocGZtbFBhcnNlciBjdHgpCit7CisgICAgc2VwOjpCRkNvZGUgYWM7CisKKyAgICBBTlRMUjNfVUlOVDMyIHN0YXRlbWVudF9qdW1wX1N0YXJ0SW5kZXg7CisKKyAgICBzZXA6OkJGIGU7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2UKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIHN0YXRlbWVudF9qdW1wX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDIwNikpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gYWM7CisgICAgfQorCisgICAgeworICAgICAgICB7CisgICAgICAgICAgICAvLyAgL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTYzNDoyOiAoICdicmVhaycgKGU9IGV4cHJlc3Npb24gKT8gU0VNSSB8ICdjb250aW51ZScgKGU9IGV4cHJlc3Npb24gKT8gU0VNSSB8ICdyZXR1cm4nIChlPSBleHByZXNzaW9uICggQ09NTUEgZT0gZXhwcmVzc2lvbiApKiApPyBTRU1JIHwgJ2V4aXQnIChlPSBleHByZXNzaW9uICk/IFNFTUkgKQorCisgICAgICAgICAgICBBTlRMUjNfVUlOVDMyIGFsdDQ4MDsKKworICAgICAgICAgICAgYWx0NDgwPTQ7CisKKyAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMjQ3OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDgwPTE7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNjM6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ0ODA9MjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM2NDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQ4MD0zOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjc5OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDgwPTQ7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gNDgwOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2p1bXBFeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ4MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NjM0OjQ6ICdicmVhaycgKGU9IGV4cHJlc3Npb24gKT8gU0VNSQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgyNDcsICZGT0xMT1dfMjQ3X2luX3N0YXRlbWVudF9qdW1wMTk3NjkpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfanVtcEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBhYz0gTkVXX1NUTVQoT1AoQlJFQUspKTsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTYzNTo0OiAoZT0gZXhwcmVzc2lvbiApPworICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0NDc1PTI7CisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBCTk9UOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgQ09MT054MjoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIENoYXJMaXRlcmFsOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgREVDUjoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIERPTExBUl9MQ1VSTFk6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBGbG9hdExpdGVyYWw6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIElOQ1I6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBJbnRlZ2VyTGl0ZXJhbDoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIExCUkFDS0VUOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgTEJSQUNLRVRfQkFSOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgTENVUkxZOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgTE5PVDoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIExQQVJFTjoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIExQQVJFTl9JTlZPS0U6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBNSU5VUzoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIE9QX1BPUDoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIE9QX1RPUDoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIFBFUkNFTlRfTENVUkxZOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgUExVUzoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIFJhdGlvbmFsTGl0ZXJhbDoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIFN0cmluZ0xpdGVyYWw6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAxNTg6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAxNTk6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAxNjA6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAxNjE6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAxNjI6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAyMzc6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAyNTY6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAyNjU6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAyNzc6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAyODA6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAyOTQ6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzMTM6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzMzA6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzMzE6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzMzI6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzNDM6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzNDc6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzNzI6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzOTc6CisgICAgICAgIAkgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJCWFsdDQ3NT0xOworICAgICAgICAJICAgICAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ3NSkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NjM1OjY6IGU9IGV4cHJlc3Npb24KKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2p1bXAxOTc4OCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfanVtcEV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICBhYworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgLT5hcHBlbmQoIGUKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICApOyAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICBNQVRDSFQoU0VNSSwgJkZPTExPV19TRU1JX2luX3N0YXRlbWVudF9qdW1wMTk3OTkpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfanVtcEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NjM4OjQ6ICdjb250aW51ZScgKGU9IGV4cHJlc3Npb24gKT8gU0VNSQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgyNjMsICZGT0xMT1dfMjYzX2luX3N0YXRlbWVudF9qdW1wMTk4MDUpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfanVtcEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBhYz0gTkVXX1NUTVQoT1AoQ09OVElOVUUpKTsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTYzOTo0OiAoZT0gZXhwcmVzc2lvbiApPworICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0NDc2PTI7CisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBCTk9UOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgQ09MT054MjoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIENoYXJMaXRlcmFsOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgREVDUjoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIERPTExBUl9MQ1VSTFk6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBGbG9hdExpdGVyYWw6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIElOQ1I6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBJbnRlZ2VyTGl0ZXJhbDoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIExCUkFDS0VUOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgTEJSQUNLRVRfQkFSOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgTENVUkxZOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgTE5PVDoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIExQQVJFTjoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIExQQVJFTl9JTlZPS0U6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBNSU5VUzoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIE9QX1BPUDoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIE9QX1RPUDoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIFBFUkNFTlRfTENVUkxZOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgUExVUzoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIFJhdGlvbmFsTGl0ZXJhbDoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIFN0cmluZ0xpdGVyYWw6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAxNTg6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAxNTk6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAxNjA6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAxNjE6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAxNjI6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAyMzc6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAyNTY6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAyNjU6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAyNzc6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAyODA6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAyOTQ6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzMTM6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzMzA6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzMzE6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzMzI6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzNDM6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzNDc6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzNzI6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSAzOTc6CisgICAgICAgIAkgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJCWFsdDQ3Nj0xOworICAgICAgICAJICAgICAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ3NikKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NjM5OjY6IGU9IGV4cHJlc3Npb24KKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2p1bXAxOTgyMSk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfanVtcEV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICBhYworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgLT5hcHBlbmQoIGUKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICApOyAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICBNQVRDSFQoU0VNSSwgJkZPTExPV19TRU1JX2luX3N0YXRlbWVudF9qdW1wMTk4MzIpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfanVtcEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMzoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NjQyOjQ6ICdyZXR1cm4nIChlPSBleHByZXNzaW9uICggQ09NTUEgZT0gZXhwcmVzc2lvbiApKiApPyBTRU1JCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDM2NCwgJkZPTExPV18zNjRfaW5fc3RhdGVtZW50X2p1bXAxOTgzOCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9qdW1wRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGFjPSBORVdfU1RNVChPUChSRVRVUk4pKTsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTY0Mzo0OiAoZT0gZXhwcmVzc2lvbiAoIENPTU1BIGU9IGV4cHJlc3Npb24gKSogKT8KKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDQ3OD0yOworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgQk5PVDoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIENPTE9OeDI6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBDaGFyTGl0ZXJhbDoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIERFQ1I6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBET0xMQVJfTENVUkxZOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgRmxvYXRMaXRlcmFsOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgSUQ6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBJTkNSOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgSW50ZWdlckxpdGVyYWw6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBMQlJBQ0tFVDoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIExCUkFDS0VUX0JBUjoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIExDVVJMWToKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIExOT1Q6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBMUEFSRU46CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBMUEFSRU5fSU5WT0tFOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgTUlOVVM6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBPUF9QT1A6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBPUF9UT1A6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBQRVJDRU5UX0xDVVJMWToKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIFBMVVM6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBSYXRpb25hbExpdGVyYWw6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBTdHJpbmdMaXRlcmFsOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMTU4OgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMTU5OgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMTYwOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMTYxOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMTYyOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMjM3OgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMjU2OgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMjY1OgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMjc3OgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMjgwOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMjk0OgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzEzOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzMwOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzMxOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzMyOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzQzOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzQ3OgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzcyOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzk3OgorICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQlhbHQ0Nzg9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQ0NzgpCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTY0Mzo2OiBlPSBleHByZXNzaW9uICggQ09NTUEgZT0gZXhwcmVzc2lvbiApKgorICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9zdGF0ZW1lbnRfanVtcDE5ODU2KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9qdW1wRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIGFjCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAtPmFwcGVuZCggZQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICk7IAorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NjQ0OjY6ICggQ09NTUEgZT0gZXhwcmVzc2lvbiApKgorCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGZvciAoOzspCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQ0Nzc9MjsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGNhc2UgQ09NTUE6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCQlhbHQ0Nzc9MTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQ0NzcpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTY0NDo4OiBDT01NQSBlPSBleHByZXNzaW9uCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKENPTU1BLCAmRk9MTE9XX0NPTU1BX2luX3N0YXRlbWVudF9qdW1wMTk4NjgpOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfanVtcEV4OworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9qdW1wMTk4NzIpOworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2p1bXBFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgYWMKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIC0+YXBwZW5kKCBlCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgKTsgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAJICAgICAgICAJICAgICAgICAJICAgIGdvdG8gbG9vcDQ3NzsJLyogYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgbG9vcDQ3NzogOyAvKiBKdW1wIG91dCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICBNQVRDSFQoU0VNSSwgJkZPTExPV19TRU1JX2luX3N0YXRlbWVudF9qdW1wMTk4ODkpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfanVtcEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgNDoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NjQ4OjQ6ICdleGl0JyAoZT0gZXhwcmVzc2lvbiApPyBTRU1JCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDI3OSwgJkZPTExPV18yNzlfaW5fc3RhdGVtZW50X2p1bXAxOTg5NSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9qdW1wRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGFjPSBORVdfU1RNVChPUChFWElUKSk7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU2NDk6NDogKGU9IGV4cHJlc3Npb24gKT8KKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDQ3OT0yOworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgQk5PVDoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIENPTE9OeDI6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBDaGFyTGl0ZXJhbDoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIERFQ1I6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBET0xMQVJfTENVUkxZOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgRmxvYXRMaXRlcmFsOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgSUQ6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBJTkNSOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgSW50ZWdlckxpdGVyYWw6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBMQlJBQ0tFVDoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIExCUkFDS0VUX0JBUjoKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIExDVVJMWToKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIExOT1Q6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBMUEFSRU46CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBMUEFSRU5fSU5WT0tFOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgTUlOVVM6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBPUF9QT1A6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBPUF9UT1A6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBQRVJDRU5UX0xDVVJMWToKKyAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIFBMVVM6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBSYXRpb25hbExpdGVyYWw6CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBTdHJpbmdMaXRlcmFsOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMTU4OgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMTU5OgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMTYwOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMTYxOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMTYyOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMjM3OgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMjU2OgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMjY1OgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMjc3OgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMjgwOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMjk0OgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzEzOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzMwOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzMxOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzMyOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzQzOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzQ3OgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzcyOgorICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgMzk3OgorICAgICAgICAJICAgICAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQlhbHQ0Nzk9MTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQ0NzkpCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTY0OTo2OiBlPSBleHByZXNzaW9uCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX3N0YXRlbWVudF9qdW1wMTk5MTUpOworICAgICAgICAJICAgICAgICAJICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2p1bXBFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgYWMKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIC0+YXBwZW5kKCBlCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgKTsgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgTUFUQ0hUKFNFTUksICZGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfanVtcDE5OTI2KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2p1bXBFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZXN0YXRlbWVudF9qdW1wRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlc3RhdGVtZW50X2p1bXBFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDIwNiwgc3RhdGVtZW50X2p1bXBfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiBhYzsKK30KKy8qICRBTlRMUiBlbmQgc3RhdGVtZW50X2p1bXAgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgZXhwcmVzc2lvbl9sYW1iZGEKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU2NTc6MTogZXhwcmVzc2lvbl9sYW1iZGEgcmV0dXJucyBbIHNlcDo6QkZDb2RlIGFjIF0gOiAnbGFtYmRhJyAoaWQ9IElEICkqICctPicgZT0gZXhwcmVzc2lvbiA7CisgKi8KK3N0YXRpYyBzZXA6OkJGQ29kZQorZXhwcmVzc2lvbl9sYW1iZGEocGZtbFBhcnNlciBjdHgpCit7CisgICAgc2VwOjpCRkNvZGUgYWM7CisKKyAgICBBTlRMUjNfVUlOVDMyIGV4cHJlc3Npb25fbGFtYmRhX1N0YXJ0SW5kZXg7CisKKyAgICBwQU5UTFIzX0NPTU1PTl9UT0tFTiAgICBpZDsKKyAgICBzZXA6OkJGIGU7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2UKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGV4cHJlc3Npb25fbGFtYmRhX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDIwNykpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gYWM7CisgICAgfQorCisgICAgaWQgICAgICAgPSBOVUxMOworCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NjU5OjI6ICggJ2xhbWJkYScgKGlkPSBJRCApKiAnLT4nIGU9IGV4cHJlc3Npb24gKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NjU5OjQ6ICdsYW1iZGEnIChpZD0gSUQgKSogJy0+JyBlPSBleHByZXNzaW9uCisgICAgICAgIHsKKyAgICAgICAgICAgICBNQVRDSFQoMzEzLCAmRk9MTE9XXzMxM19pbl9leHByZXNzaW9uX2xhbWJkYTE5OTQ1KTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbl9sYW1iZGFFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBhYz0gTkVXX0NPREUoIE9QKExBTUJEQSkgKTsKKyAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTY2MDo0OiAoaWQ9IElEICkqCisKKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDQ4MT0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0NDgxPTE7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ4MSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NjYwOjY6IGlkPSBJRAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBpZCA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTikgTUFUQ0hUKElELCAmRk9MTE9XX0lEX2luX2V4cHJlc3Npb25fbGFtYmRhMTk5NTcpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleHByZXNzaW9uX2xhbWJkYUV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIGFjCisgICAgICAgICAgICAJICAgICAgICAgICAgLT5hcHBlbmQoIE5FV19JRChTVFIoKGlkLT5nZXRUZXh0KGlkKSktPmNoYXJzKSkgKTsgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdDoKKyAgICAgICAgICAgIAkgICAgZ290byBsb29wNDgxOwkvKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgKi8KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9vcDQ4MTogOyAvKiBKdW1wIG91dCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworCisKKyAgICAgICAgICAgICBNQVRDSFQoMTY0LCAmRk9MTE9XXzE2NF9pbl9leHByZXNzaW9uX2xhbWJkYTE5OTY5KTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbl9sYW1iZGFFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uX2xhbWJkYTE5OTczKTsKKyAgICAgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbl9sYW1iZGFFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBhYworICAgICAgICAgICAgICAgIC0+YXBwZW5kKCBlCisgICAgICAgICAgICAgICAgICk7IAorICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlZXhwcmVzc2lvbl9sYW1iZGFFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVleHByZXNzaW9uX2xhbWJkYUV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMjA3LCBleHByZXNzaW9uX2xhbWJkYV9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIGFjOworfQorLyogJEFOVExSIGVuZCBleHByZXNzaW9uX2xhbWJkYSAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBleHByZXNzaW9uX3N0YXR1cworICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTY2OToxOiBleHByZXNzaW9uX3N0YXR1cyByZXR1cm5zIFsgc2VwOjpCRkNvZGUgYWMgXSA6ICggJ3N0YXR1cyN3YXMnIG89IG9wX2FjdGl2aXR5IGlkPSBxdWFsaWZpZWROYW1lSUQgfCAnc3RhdHVzI2lzJyBvPSBvcF9hY3Rpdml0eSBpZD0gcXVhbGlmaWVkTmFtZUlEIHwgJ3N0YXR1cyNiZWluZycgbz0gb3BfYWN0aXZpdHkgaWQ9IHF1YWxpZmllZE5hbWVJRCB8ICdzdGF0dXMjd2lsbCcgbz0gb3BfYWN0aXZpdHkgaWQ9IHF1YWxpZmllZE5hbWVJRCB8ICdjaGFuZ2VkJyBsdj0gbHZhbHVlIHwgJ2NoYW5nZWQjdG8nIGx2PSBsdmFsdWUgKTsKKyAqLworc3RhdGljIHNlcDo6QkZDb2RlCitleHByZXNzaW9uX3N0YXR1cyhwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBzZXA6OkJGQ29kZSBhYzsKKworICAgIEFOVExSM19VSU5UMzIgZXhwcmVzc2lvbl9zdGF0dXNfU3RhcnRJbmRleDsKKworICAgIHNlcDo6T3BlcmF0b3IgKiBvOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9vCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9vIHNlcDo6T3BlcmF0b3IgKgorCisgICAgZm1sUGFyc2VyX3F1YWxpZmllZE5hbWVJRF9yZXR1cm4gaWQ7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2lkCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9pZCBmbWxQYXJzZXJfcXVhbGlmaWVkTmFtZUlEX3JldHVybgorCisgICAgc2VwOjpCRiBsdjsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfbHYKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2x2IHNlcDo6QkYKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBleHByZXNzaW9uX3N0YXR1c19TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgyMDgpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIGFjOworICAgIH0KKworICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU2NzE6MjogKCAnc3RhdHVzI3dhcycgbz0gb3BfYWN0aXZpdHkgaWQ9IHF1YWxpZmllZE5hbWVJRCB8ICdzdGF0dXMjaXMnIG89IG9wX2FjdGl2aXR5IGlkPSBxdWFsaWZpZWROYW1lSUQgfCAnc3RhdHVzI2JlaW5nJyBvPSBvcF9hY3Rpdml0eSBpZD0gcXVhbGlmaWVkTmFtZUlEIHwgJ3N0YXR1cyN3aWxsJyBvPSBvcF9hY3Rpdml0eSBpZD0gcXVhbGlmaWVkTmFtZUlEIHwgJ2NoYW5nZWQnIGx2PSBsdmFsdWUgfCAnY2hhbmdlZCN0bycgbHY9IGx2YWx1ZSApCisKKyAgICAgICAgICAgIEFOVExSM19VSU5UMzIgYWx0NDgyOworCisgICAgICAgICAgICBhbHQ0ODI9NjsKKworICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAzODM6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ0ODI9MTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM4MjoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQ4Mj0yOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzgxOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDgyPTM7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzODQ6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ0ODI9NDsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI1MjoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQ4Mj01OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjUxOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDgyPTY7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gNDgyOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbl9zdGF0dXNFeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ4MikKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NjcxOjQ6ICdzdGF0dXMjd2FzJyBvPSBvcF9hY3Rpdml0eSBpZD0gcXVhbGlmaWVkTmFtZUlECisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDM4MywgJkZPTExPV18zODNfaW5fZXhwcmVzc2lvbl9zdGF0dXMxOTk5Nik7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25fc3RhdHVzRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX29wX2FjdGl2aXR5X2luX2V4cHJlc3Npb25fc3RhdHVzMjAwMDMpOworICAgICAgICAJICAgICAgICBvPW9wX2FjdGl2aXR5KGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25fc3RhdHVzRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9leHByZXNzaW9uX3N0YXR1czIwMDA4KTsKKyAgICAgICAgCSAgICAgICAgaWQ9cXVhbGlmaWVkTmFtZUlEKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25fc3RhdHVzRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGFjPSBORVdfU1RNVDIoT1AoU1RBVFVTX1dBUyksIElOQ1JfQkYoCisgICAgICAgIAkgICAgICAgICAgICBvCisgICAgICAgIAkgICAgICAgICAgICApLAorICAgICAgICAJICAgICAgICAgICAgCQkJc2VwOjpQYXJzZXJVdGlsOjpnZXR2YXJNYWNoaW5lKGlkLnMKKyAgICAgICAgCSAgICAgICAgICAgICwgaWQubmIKKyAgICAgICAgCSAgICAgICAgICAgICkpOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1Njc1OjQ6ICdzdGF0dXMjaXMnIG89IG9wX2FjdGl2aXR5IGlkPSBxdWFsaWZpZWROYW1lSUQKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMzgyLCAmRk9MTE9XXzM4Ml9pbl9leHByZXNzaW9uX3N0YXR1czIwMDE3KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbl9zdGF0dXNFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfb3BfYWN0aXZpdHlfaW5fZXhwcmVzc2lvbl9zdGF0dXMyMDAyNSk7CisgICAgICAgIAkgICAgICAgIG89b3BfYWN0aXZpdHkoY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbl9zdGF0dXNFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX2V4cHJlc3Npb25fc3RhdHVzMjAwMzApOworICAgICAgICAJICAgICAgICBpZD1xdWFsaWZpZWROYW1lSUQoY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbl9zdGF0dXNFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgYWM9IE5FV19TVE1UMihPUChTVEFUVVNfSVMpLCBJTkNSX0JGKAorICAgICAgICAJICAgICAgICAgICAgbworICAgICAgICAJICAgICAgICAgICAgKSwKKyAgICAgICAgCSAgICAgICAgICAgIAkJCXNlcDo6UGFyc2VyVXRpbDo6Z2V0dmFyTWFjaGluZShpZC5zCisgICAgICAgIAkgICAgICAgICAgICAsIGlkLm5iCisgICAgICAgIAkgICAgICAgICAgICApKTsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDM6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTY3OTo0OiAnc3RhdHVzI2JlaW5nJyBvPSBvcF9hY3Rpdml0eSBpZD0gcXVhbGlmaWVkTmFtZUlECisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDM4MSwgJkZPTExPV18zODFfaW5fZXhwcmVzc2lvbl9zdGF0dXMyMDAzOSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25fc3RhdHVzRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX29wX2FjdGl2aXR5X2luX2V4cHJlc3Npb25fc3RhdHVzMjAwNDQpOworICAgICAgICAJICAgICAgICBvPW9wX2FjdGl2aXR5KGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25fc3RhdHVzRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9leHByZXNzaW9uX3N0YXR1czIwMDQ5KTsKKyAgICAgICAgCSAgICAgICAgaWQ9cXVhbGlmaWVkTmFtZUlEKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25fc3RhdHVzRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGFjPSBORVdfU1RNVDIoT1AoU1RBVFVTX0JFSU5HKSwgSU5DUl9CRigKKyAgICAgICAgCSAgICAgICAgICAgIG8KKyAgICAgICAgCSAgICAgICAgICAgICksCisgICAgICAgIAkgICAgICAgICAgICAJCQlzZXA6OlBhcnNlclV0aWw6OmdldHZhck1hY2hpbmUoaWQucworICAgICAgICAJICAgICAgICAgICAgLCBpZC5uYgorICAgICAgICAJICAgICAgICAgICAgKSk7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA0OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU2ODM6NDogJ3N0YXR1cyN3aWxsJyBvPSBvcF9hY3Rpdml0eSBpZD0gcXVhbGlmaWVkTmFtZUlECisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDM4NCwgJkZPTExPV18zODRfaW5fZXhwcmVzc2lvbl9zdGF0dXMyMDA1OCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25fc3RhdHVzRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX29wX2FjdGl2aXR5X2luX2V4cHJlc3Npb25fc3RhdHVzMjAwNjQpOworICAgICAgICAJICAgICAgICBvPW9wX2FjdGl2aXR5KGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25fc3RhdHVzRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9leHByZXNzaW9uX3N0YXR1czIwMDY5KTsKKyAgICAgICAgCSAgICAgICAgaWQ9cXVhbGlmaWVkTmFtZUlEKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25fc3RhdHVzRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGFjPSBORVdfU1RNVDIoT1AoU1RBVFVTX1dJTEwpLCBJTkNSX0JGKAorICAgICAgICAJICAgICAgICAgICAgbworICAgICAgICAJICAgICAgICAgICAgKSwKKyAgICAgICAgCSAgICAgICAgICAgIAkJCXNlcDo6UGFyc2VyVXRpbDo6Z2V0dmFyTWFjaGluZShpZC5zCisgICAgICAgIAkgICAgICAgICAgICAsIGlkLm5iCisgICAgICAgIAkgICAgICAgICAgICApKTsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDU6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTY4Nzo0OiAnY2hhbmdlZCcgbHY9IGx2YWx1ZQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgyNTIsICZGT0xMT1dfMjUyX2luX2V4cHJlc3Npb25fc3RhdHVzMjAwNzgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleHByZXNzaW9uX3N0YXR1c0V4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19sdmFsdWVfaW5fZXhwcmVzc2lvbl9zdGF0dXMyMDA4Nik7CisgICAgICAgIAkgICAgICAgIGx2PWx2YWx1ZShjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleHByZXNzaW9uX3N0YXR1c0V4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBhYz0gTkVXX1NUTVQxKE9QKENIQU5HRUQpLCAKKyAgICAgICAgCSAgICAgICAgICAgIGx2CisgICAgICAgIAkgICAgICAgICAgICApOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgNjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NjkwOjQ6ICdjaGFuZ2VkI3RvJyBsdj0gbHZhbHVlCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDI1MSwgJkZPTExPV18yNTFfaW5fZXhwcmVzc2lvbl9zdGF0dXMyMDA5NSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25fc3RhdHVzRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2x2YWx1ZV9pbl9leHByZXNzaW9uX3N0YXR1czIwMTAwKTsKKyAgICAgICAgCSAgICAgICAgbHY9bHZhbHVlKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25fc3RhdHVzRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGFjPSBORVdfU1RNVDEoT1AoQ0hBTkdFRF9UTyksIAorICAgICAgICAJICAgICAgICAgICAgbHYKKyAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVleHByZXNzaW9uX3N0YXR1c0V4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZWV4cHJlc3Npb25fc3RhdHVzRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgyMDgsIGV4cHJlc3Npb25fc3RhdHVzX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gYWM7Cit9CisvKiAkQU5UTFIgZW5kIGV4cHJlc3Npb25fc3RhdHVzICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IG9wX2FjdGl2aXR5CisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1Njk0OjE6IG9wX2FjdGl2aXR5IHJldHVybnMgWyBzZXA6Ok9wZXJhdG9yICogb3AgXSA6ICggJ2luaXQnIHwgJ2ZpbmFsJyB8ICdkZXN0cm95JyB8ICdzdGFydCcgfCAncmVzdGFydCcgfCAnc3RvcCcgfCAnaWVuYWJsZScgfCAnZW5hYmxlJyB8ICdpZGlzYWJsZScgfCAnZGlzYWJsZScgfCAnaWFib3J0JyB8ICdhYm9ydCcgfCAncnVuJyB8ICdydGMnIHwgJ3NjaGVkdWxlJyB8ICdzdXNwZW5kJyB8ICdyZXN1bWUnIHwgJ3dhaXQnICk7CisgKi8KK3N0YXRpYyBzZXA6Ok9wZXJhdG9yICoKK29wX2FjdGl2aXR5KHBmbWxQYXJzZXIgY3R4KQoreworICAgIHNlcDo6T3BlcmF0b3IgKiBvcDsKKworICAgIEFOVExSM19VSU5UMzIgb3BfYWN0aXZpdHlfU3RhcnRJbmRleDsKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBvcF9hY3Rpdml0eV9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgyMDkpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIG9wOworICAgIH0KKworICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU2OTY6MjogKCAnaW5pdCcgfCAnZmluYWwnIHwgJ2Rlc3Ryb3knIHwgJ3N0YXJ0JyB8ICdyZXN0YXJ0JyB8ICdzdG9wJyB8ICdpZW5hYmxlJyB8ICdlbmFibGUnIHwgJ2lkaXNhYmxlJyB8ICdkaXNhYmxlJyB8ICdpYWJvcnQnIHwgJ2Fib3J0JyB8ICdydW4nIHwgJ3J0YycgfCAnc2NoZWR1bGUnIHwgJ3N1c3BlbmQnIHwgJ3Jlc3VtZScgfCAnd2FpdCcgKQorCisgICAgICAgICAgICBBTlRMUjNfVUlOVDMyIGFsdDQ4MzsKKworICAgICAgICAgICAgYWx0NDgzPTE4OworCisgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDI5NjoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQ4Mz0xOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjgyOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDgzPTI7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNjc6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ0ODM9MzsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM3NzoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQ4Mz00OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzYyOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDgzPTU7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzODY6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ0ODM9NjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI5MzoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQ4Mz03OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjc1OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDgzPTg7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOTI6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ0ODM9OTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI2ODoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQ4Mz0xMDsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI5MToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQ4Mz0xMTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIzNjoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQ4Mz0xMjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM2OToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQ4Mz0xMzsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM2ODoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQ4Mz0xNDsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM3MToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQ4Mz0xNTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM4OToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQ4Mz0xNjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM2MzoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQ4Mz0xNzsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQxNToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQ4Mz0xODsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA0ODM7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVvcF9hY3Rpdml0eUV4OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NDgzKQorICAgICAgICAgICAgeworICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU2OTY6NDogJ2luaXQnCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDI5NiwgJkZPTExPV18yOTZfaW5fb3BfYWN0aXZpdHkyMDExOCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW9wX2FjdGl2aXR5RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG9wPSBPUChJTklUKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1Njk3OjQ6ICdmaW5hbCcKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMjgyLCAmRk9MTE9XXzI4Ml9pbl9vcF9hY3Rpdml0eTIwMTI5KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlb3BfYWN0aXZpdHlFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBvcDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgb3A9IE9QKEZJTkFMKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAzOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU2OTg6NDogJ2Rlc3Ryb3knCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDI2NywgJkZPTExPV18yNjdfaW5fb3BfYWN0aXZpdHkyMDEzOSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW9wX2FjdGl2aXR5RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG9wPSBPUChERVNUUk9ZKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgNDoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1Njk5OjQ6ICdzdGFydCcKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMzc3LCAmRk9MTE9XXzM3N19pbl9vcF9hY3Rpdml0eTIwMTQ3KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlb3BfYWN0aXZpdHlFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBvcDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgb3A9IE9QKFNUQVJUKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA1OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU3MDA6NDogJ3Jlc3RhcnQnCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDM2MiwgJkZPTExPV18zNjJfaW5fb3BfYWN0aXZpdHkyMDE1Nyk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW9wX2FjdGl2aXR5RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG9wPSBPUChSRVNUQVJUKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgNjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NzAxOjQ6ICdzdG9wJworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgzODYsICZGT0xMT1dfMzg2X2luX29wX2FjdGl2aXR5MjAxNjUpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVvcF9hY3Rpdml0eUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG9wOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBvcD0gT1AoU1RPUCk7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDc6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTcwMjo0OiAnaWVuYWJsZScKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMjkzLCAmRk9MTE9XXzI5M19pbl9vcF9hY3Rpdml0eTIwMTc2KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlb3BfYWN0aXZpdHlFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBvcDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgb3A9IE9QKElFTkFCTEVfSU5WT0tFKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA4OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU3MDM6NDogJ2VuYWJsZScKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMjc1LCAmRk9MTE9XXzI3NV9pbl9vcF9hY3Rpdml0eTIwMTg0KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlb3BfYWN0aXZpdHlFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBvcDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgb3A9IE9QKEVOQUJMRV9JTlZPS0UpOworICAgICAgICAJICAgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA5OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU3MDQ6NDogJ2lkaXNhYmxlJworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgyOTIsICZGT0xMT1dfMjkyX2luX29wX2FjdGl2aXR5MjAxOTMpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVvcF9hY3Rpdml0eUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG9wOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBvcD0gT1AoSURJU0FCTEVfSU5WT0tFKTsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDEwOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU3MDU6NDogJ2Rpc2FibGUnCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDI2OCwgJkZPTExPV18yNjhfaW5fb3BfYWN0aXZpdHkyMDIwMCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW9wX2FjdGl2aXR5RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG9wPSBPUChESVNBQkxFX0lOVk9LRSk7CisgICAgICAgIAkgICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMTE6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTcwNjo0OiAnaWFib3J0JworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgyOTEsICZGT0xMT1dfMjkxX2luX29wX2FjdGl2aXR5MjAyMDgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVvcF9hY3Rpdml0eUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG9wOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBvcD0gT1AoSUFCT1JUX0lOVk9LRSk7CisgICAgICAgIAkgICAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDEyOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU3MDc6NDogJ2Fib3J0JworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgyMzYsICZGT0xMT1dfMjM2X2luX29wX2FjdGl2aXR5MjAyMTcpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVvcF9hY3Rpdml0eUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG9wOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBvcD0gT1AoQUJPUlRfSU5WT0tFKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDEzOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU3MDg6NDogJ3J1bicKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMzY5LCAmRk9MTE9XXzM2OV9pbl9vcF9hY3Rpdml0eTIwMjI3KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlb3BfYWN0aXZpdHlFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBvcDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgb3A9IE9QKFJVTik7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAxNDoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NzA5OjQ6ICdydGMnCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDM2OCwgJkZPTExPV18zNjhfaW5fb3BfYWN0aXZpdHkyMDIzOSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW9wX2FjdGl2aXR5RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG9wPSBPUChSVEMpOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMTU6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTcxMDo0OiAnc2NoZWR1bGUnCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDM3MSwgJkZPTExPV18zNzFfaW5fb3BfYWN0aXZpdHkyMDI1MSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW9wX2FjdGl2aXR5RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG9wPSBPUChTQ0hFRFVMRV9JTlZPS0UpOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMTY6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTcxMTo0OiAnc3VzcGVuZCcKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMzg5LCAmRk9MTE9XXzM4OV9pbl9vcF9hY3Rpdml0eTIwMjU4KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlb3BfYWN0aXZpdHlFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBvcDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgb3A9IE9QKFNVU1BFTkQpOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAxNzoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NzEyOjQ6ICdyZXN1bWUnCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDM2MywgJkZPTExPV18zNjNfaW5fb3BfYWN0aXZpdHkyMDI2Nik7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW9wX2FjdGl2aXR5RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG9wPSBPUChSRVNVTUUpOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMTg6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTcxMzo0OiAnd2FpdCcKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoNDE1LCAmRk9MTE9XXzQxNV9pbl9vcF9hY3Rpdml0eTIwMjc1KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlb3BfYWN0aXZpdHlFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBvcDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgb3A9IE9QKFdBSVQpOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVvcF9hY3Rpdml0eUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZW9wX2FjdGl2aXR5RXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgyMDksIG9wX2FjdGl2aXR5X1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gb3A7Cit9CisvKiAkQU5UTFIgZW5kIG9wX2FjdGl2aXR5ICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IHN0YXRlbWVudF9hY3Rpdml0eQorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTcyMToxOiBzdGF0ZW1lbnRfYWN0aXZpdHkgcmV0dXJucyBbIHNlcDo6QkZDb2RlIGFjIF0gOiAobz0gb3BfYWN0aXZpdHkgKGlkPSBxdWFsaWZpZWROYW1lSUQgKT8gKCBhY3Rpdml0eV9tYWNoaW5lX3BhcmFtX3JldHVyblsgbWFjaGluZSAsIGFjIF0gKT8gU0VNSSB8ICdnb3RvJyBpZD0gcXVhbGlmaWVkTmFtZUlEIChmcz0gc3RhdGVtZW50X2luaXRfZmxvd1tmbG93VGFyZ2V0XSB8IFNFTUkgKSB8ICdqb2luJyBlPSBleHByZXNzaW9uIFNFTUkgKTsKKyAqLworc3RhdGljIHNlcDo6QkZDb2RlCitzdGF0ZW1lbnRfYWN0aXZpdHkocGZtbFBhcnNlciBjdHgpCit7CisgICAgc2VwOjpCRkNvZGUgYWM7CisKKyAgICBBTlRMUjNfVUlOVDMyIHN0YXRlbWVudF9hY3Rpdml0eV9TdGFydEluZGV4OworCisgICAgc2VwOjpPcGVyYXRvciAqIG87CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX28KKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX28gc2VwOjpPcGVyYXRvciAqCisKKyAgICBmbWxQYXJzZXJfcXVhbGlmaWVkTmFtZUlEX3JldHVybiBpZDsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfaWQKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2lkIGZtbFBhcnNlcl9xdWFsaWZpZWROYW1lSURfcmV0dXJuCisKKyAgICBzZXA6OkJGQ29kZSBmczsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfZnMKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2ZzIHNlcDo6QkZDb2RlCisKKyAgICBzZXA6OkJGIGU7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2UKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIHN0YXRlbWVudF9hY3Rpdml0eV9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisKKyAgICAJc2VwOjpCRiBmbG93VGFyZ2V0OworICAgIAlzZXA6OkJGIG1hY2hpbmU7CisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDIxMCkpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gYWM7CisgICAgfQorCisgICAgeworICAgICAgICB7CisgICAgICAgICAgICAvLyAgL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTcyNzoyOiAobz0gb3BfYWN0aXZpdHkgKGlkPSBxdWFsaWZpZWROYW1lSUQgKT8gKCBhY3Rpdml0eV9tYWNoaW5lX3BhcmFtX3JldHVyblsgbWFjaGluZSAsIGFjIF0gKT8gU0VNSSB8ICdnb3RvJyBpZD0gcXVhbGlmaWVkTmFtZUlEIChmcz0gc3RhdGVtZW50X2luaXRfZmxvd1tmbG93VGFyZ2V0XSB8IFNFTUkgKSB8ICdqb2luJyBlPSBleHByZXNzaW9uIFNFTUkgKQorCisgICAgICAgICAgICBBTlRMUjNfVUlOVDMyIGFsdDQ4NzsKKworICAgICAgICAgICAgYWx0NDg3PTM7CisKKyAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMjM2OgorICAgICAgICAgICAgY2FzZSAyNjc6CisgICAgICAgICAgICBjYXNlIDI2ODoKKyAgICAgICAgICAgIGNhc2UgMjc1OgorICAgICAgICAgICAgY2FzZSAyODI6CisgICAgICAgICAgICBjYXNlIDI5MToKKyAgICAgICAgICAgIGNhc2UgMjkyOgorICAgICAgICAgICAgY2FzZSAyOTM6CisgICAgICAgICAgICBjYXNlIDI5NjoKKyAgICAgICAgICAgIGNhc2UgMzYyOgorICAgICAgICAgICAgY2FzZSAzNjM6CisgICAgICAgICAgICBjYXNlIDM2ODoKKyAgICAgICAgICAgIGNhc2UgMzY5OgorICAgICAgICAgICAgY2FzZSAzNzE6CisgICAgICAgICAgICBjYXNlIDM3NzoKKyAgICAgICAgICAgIGNhc2UgMzg2OgorICAgICAgICAgICAgY2FzZSAzODk6CisgICAgICAgICAgICBjYXNlIDQxNToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDQ4Nz0xOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjg5OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NDg3PTI7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzMTI6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ0ODc9MzsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA0ODc7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfYWN0aXZpdHlFeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ4NykKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NzI3OjQ6IG89IG9wX2FjdGl2aXR5IChpZD0gcXVhbGlmaWVkTmFtZUlEICk/ICggYWN0aXZpdHlfbWFjaGluZV9wYXJhbV9yZXR1cm5bIG1hY2hpbmUgLCBhYyBdICk/IFNFTUkKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX29wX2FjdGl2aXR5X2luX3N0YXRlbWVudF9hY3Rpdml0eTIwMzA3KTsKKyAgICAgICAgCSAgICAgICAgbz1vcF9hY3Rpdml0eShjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfYWN0aXZpdHlFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgYWM9IE5FV19TVE1UKAorICAgICAgICAJICAgICAgICAgICAgbworICAgICAgICAJICAgICAgICAgICAgKTsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTcyODo0OiAoaWQ9IHF1YWxpZmllZE5hbWVJRCApPworICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0NDg0PTI7CisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgICAgIAkJYWx0NDg0PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0NDg0KQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU3Mjg6NjogaWQ9IHF1YWxpZmllZE5hbWVJRAorICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfcXVhbGlmaWVkTmFtZUlEX2luX3N0YXRlbWVudF9hY3Rpdml0eTIwMzE5KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWQ9cXVhbGlmaWVkTmFtZUlEKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9hY3Rpdml0eUV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICBhYworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgLT5hcHBlbmQobWFjaGluZSA9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgIAlzZXA6OlBhcnNlclV0aWw6OmdldHZhck1hY2hpbmUoaWQucworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgLCBpZC5uYgorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgKSk7IAorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTczMzo0OiAoIGFjdGl2aXR5X21hY2hpbmVfcGFyYW1fcmV0dXJuWyBtYWNoaW5lICwgYWMgXSApPworICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0NDg1PTI7CisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgY2FzZSBMUEFSRU46CisgICAgICAgIAkgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJCWFsdDQ4NT0xOworICAgICAgICAJICAgICAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ4NSkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NzMzOjQ6IGFjdGl2aXR5X21hY2hpbmVfcGFyYW1fcmV0dXJuWyBtYWNoaW5lICwgYWMgXQorICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfYWN0aXZpdHlfbWFjaGluZV9wYXJhbV9yZXR1cm5faW5fc3RhdGVtZW50X2FjdGl2aXR5MjAzMzgpOworICAgICAgICAJICAgICAgICAJICAgICAgICBhY3Rpdml0eV9tYWNoaW5lX3BhcmFtX3JldHVybihjdHgsIG1hY2hpbmUsIGFjKTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2FjdGl2aXR5RXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgTUFUQ0hUKFNFTUksICZGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfYWN0aXZpdHkyMDM0Nik7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9hY3Rpdml0eUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NzQwOjQ6ICdnb3RvJyBpZD0gcXVhbGlmaWVkTmFtZUlEIChmcz0gc3RhdGVtZW50X2luaXRfZmxvd1tmbG93VGFyZ2V0XSB8IFNFTUkgKQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgyODksICZGT0xMT1dfMjg5X2luX3N0YXRlbWVudF9hY3Rpdml0eTIwMzU1KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2FjdGl2aXR5RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3F1YWxpZmllZE5hbWVJRF9pbl9zdGF0ZW1lbnRfYWN0aXZpdHkyMDM2MCk7CisgICAgICAgIAkgICAgICAgIGlkPXF1YWxpZmllZE5hbWVJRChjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfYWN0aXZpdHlFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgYWM9IE5FV19TVE1UMShPUChHT1RPKSwKKyAgICAgICAgCSAgICAgICAgICAgIAkgIAlmbG93VGFyZ2V0ID0gc2VwOjpQYXJzZXJVdGlsOjpnZXR2YXJNYWNoaW5lKAorICAgICAgICAJICAgICAgICAgICAgaWQucworICAgICAgICAJICAgICAgICAgICAgLCBpZC5uYgorICAgICAgICAJICAgICAgICAgICAgKSk7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU3NDM6NDogKGZzPSBzdGF0ZW1lbnRfaW5pdF9mbG93W2Zsb3dUYXJnZXRdIHwgU0VNSSApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQ0ODY9MjsKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjg0OgorICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgIAkJYWx0NDg2PTE7CisgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgY2FzZSBTRU1JOgorICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgIAkJYWx0NDg2PTI7CisgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAJICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gNDg2OworICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2FjdGl2aXR5RXg7CisKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQ0ODYpCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTc0Mzo2OiBmcz0gc3RhdGVtZW50X2luaXRfZmxvd1tmbG93VGFyZ2V0XQorICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfc3RhdGVtZW50X2luaXRfZmxvd19pbl9zdGF0ZW1lbnRfYWN0aXZpdHkyMDM3NCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGZzPXN0YXRlbWVudF9pbml0X2Zsb3coY3R4LCBmbG93VGFyZ2V0KTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2FjdGl2aXR5RXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIGFjCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAtPmFwcGVuZChmcworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgKTsgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAJY2FzZSAyOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU3NDQ6NjogU0VNSQorICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChTRU1JLCAmRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2FjdGl2aXR5MjAzODUpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfYWN0aXZpdHlFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAzOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU3NDc6NDogJ2pvaW4nIGU9IGV4cHJlc3Npb24gU0VNSQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgzMTIsICZGT0xMT1dfMzEyX2luX3N0YXRlbWVudF9hY3Rpdml0eTIwMzk2KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2FjdGl2aXR5RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fc3RhdGVtZW50X2FjdGl2aXR5MjA0MDEpOworICAgICAgICAJICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2FjdGl2aXR5RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgICBNQVRDSFQoU0VNSSwgJkZPTExPV19TRU1JX2luX3N0YXRlbWVudF9hY3Rpdml0eTIwNDA0KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2FjdGl2aXR5RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGFjPSBORVdfU1RNVDEoT1AoSk9JTiksIAorICAgICAgICAJICAgICAgICAgICAgZQorICAgICAgICAJICAgICAgICAgICAgKTsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZXN0YXRlbWVudF9hY3Rpdml0eUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZXN0YXRlbWVudF9hY3Rpdml0eUV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMjEwLCBzdGF0ZW1lbnRfYWN0aXZpdHlfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiBhYzsKK30KKy8qICRBTlRMUiBlbmQgc3RhdGVtZW50X2FjdGl2aXR5ICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IHN0YXRlbWVudF9pbml0X2Zsb3cKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU3NTM6MTogc3RhdGVtZW50X2luaXRfZmxvd1sgY29uc3Qgc2VwOjpCRiAmIGZsb3dUYXJnZXQgXSByZXR1cm5zIFsgc2VwOjpCRkNvZGUgYWMgXSA6ICdmbG93JyBicz0gYmxvY2tfc3RhdGVtZW50IDsKKyAqLworc3RhdGljIHNlcDo6QkZDb2RlCitzdGF0ZW1lbnRfaW5pdF9mbG93KHBmbWxQYXJzZXIgY3R4LCBjb25zdCBzZXA6OkJGICYgZmxvd1RhcmdldCkKK3sKKyAgICBzZXA6OkJGQ29kZSBhYzsKKworICAgIEFOVExSM19VSU5UMzIgc3RhdGVtZW50X2luaXRfZmxvd19TdGFydEluZGV4OworCisgICAgc2VwOjpCRkNvZGUgYnM7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2JzCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9icyBzZXA6OkJGQ29kZQorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIHN0YXRlbWVudF9pbml0X2Zsb3dfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworCisgICAgCWlmKCBmbG93VGFyZ2V0LmlzPCBzZXA6Ok1hY2hpbmUgPigpICkKKyAgICAJeworICAgIAkJUFVTSF9DVFhfQ1BNKCBmbG93VGFyZ2V0LnRvX3B0cjwgc2VwOjpNYWNoaW5lID4oKSApOworICAgIAl9CisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDIxMSkpICkKKyAgICB7CisgICAgICAgIHsKKworICAgICAgICAgICAgCWlmKCBmbG93VGFyZ2V0LmlzPCBzZXA6Ok1hY2hpbmUgPigpICkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCVBPUF9DVFg7CisgICAgICAgICAgICAJfQorCisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiBhYzsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU3Njc6MjogKCAnZmxvdycgYnM9IGJsb2NrX3N0YXRlbWVudCApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU3Njc6NDogJ2Zsb3cnIGJzPSBibG9ja19zdGF0ZW1lbnQKKyAgICAgICAgeworICAgICAgICAgICAgIE1BVENIVCgyODQsICZGT0xMT1dfMjg0X2luX3N0YXRlbWVudF9pbml0X2Zsb3cyMDQzNCk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9pbml0X2Zsb3dFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfYmxvY2tfc3RhdGVtZW50X2luX3N0YXRlbWVudF9pbml0X2Zsb3cyMDQzOCk7CisgICAgICAgICAgICBicz1ibG9ja19zdGF0ZW1lbnQoY3R4KTsKKworICAgICAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9pbml0X2Zsb3dFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBhYz0gCisgICAgICAgICAgICAgICAgYnMKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlc3RhdGVtZW50X2luaXRfZmxvd0V4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZXN0YXRlbWVudF9pbml0X2Zsb3dFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgCWlmKCBmbG93VGFyZ2V0LmlzPCBzZXA6Ok1hY2hpbmUgPigpICkKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlQT1BfQ1RYOworICAgICAgICAgICAgICAgICAgICAJfQorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisKKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDIxMSwgc3RhdGVtZW50X2luaXRfZmxvd19TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIGFjOworfQorLyogJEFOVExSIGVuZCBzdGF0ZW1lbnRfaW5pdF9mbG93ICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IHN0YXRlbWVudF9pbnZva2Vfcm91dGluZQorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTc3NToxOiBzdGF0ZW1lbnRfaW52b2tlX3JvdXRpbmUgcmV0dXJucyBbIHNlcDo6QkZDb2RlIGFjIF0gOiBpZD0gSUQgaW52b2tlX3JvdXRpbmVfcGFyYW1zWyBpbnZva2VSb3V0aW5lIF0gKCBpbnZva2Vfcm91dGluZV9yZXR1cm5zWyBpbnZva2VSb3V0aW5lIF0gKT8gU0VNSSA7CisgKi8KK3N0YXRpYyBzZXA6OkJGQ29kZQorc3RhdGVtZW50X2ludm9rZV9yb3V0aW5lKHBmbWxQYXJzZXIgY3R4KQoreworICAgIHNlcDo6QkZDb2RlIGFjOworCisgICAgQU5UTFIzX1VJTlQzMiBzdGF0ZW1lbnRfaW52b2tlX3JvdXRpbmVfU3RhcnRJbmRleDsKKworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIGlkOworCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIHN0YXRlbWVudF9pbnZva2Vfcm91dGluZV9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisKKyAgICAJc2VwOjpSb3V0aW5lICogaW52b2tlUm91dGluZSA9IE5VTEw7CisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDIxMikpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gYWM7CisgICAgfQorCisgICAgaWQgICAgICAgPSBOVUxMOworCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NzgwOjI6IChpZD0gSUQgaW52b2tlX3JvdXRpbmVfcGFyYW1zWyBpbnZva2VSb3V0aW5lIF0gKCBpbnZva2Vfcm91dGluZV9yZXR1cm5zWyBpbnZva2VSb3V0aW5lIF0gKT8gU0VNSSApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU3ODA6NDogaWQ9IElEIGludm9rZV9yb3V0aW5lX3BhcmFtc1sgaW52b2tlUm91dGluZSBdICggaW52b2tlX3JvdXRpbmVfcmV0dXJuc1sgaW52b2tlUm91dGluZSBdICk/IFNFTUkKKyAgICAgICAgeworICAgICAgICAgICAgaWQgPSAocEFOVExSM19DT01NT05fVE9LRU4pIE1BVENIVChJRCwgJkZPTExPV19JRF9pbl9zdGF0ZW1lbnRfaW52b2tlX3JvdXRpbmUyMDQ2OCk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9pbnZva2Vfcm91dGluZUV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAJICAJaW52b2tlUm91dGluZSA9IHNlcDo6Um91dGluZTo6bmV3SW52b2tlKCBfQ1BSTVNfLCBTVFIoKGlkLT5nZXRUZXh0KGlkKSktPmNoYXJzKSk7CisKKyAgICAgICAgICAgICAgICAJICAJaW52b2tlUm91dGluZS0+c2V0TW9kZWwoCisgICAgICAgICAgICAgICAgCSAgCQkJc2VwOjpQYXJzZXJVdGlsOjpnZXR2YXJSb3V0aW5lKFNUUigoaWQtPmdldFRleHQoaWQpKS0+Y2hhcnMpKSApOworICAgICAgICAgICAgICAgIAkgIAorICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2ludm9rZV9yb3V0aW5lX3BhcmFtc19pbl9zdGF0ZW1lbnRfaW52b2tlX3JvdXRpbmUyMDQ3OSk7CisgICAgICAgICAgICBpbnZva2Vfcm91dGluZV9wYXJhbXMoY3R4LCBpbnZva2VSb3V0aW5lKTsKKworICAgICAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXN0YXRlbWVudF9pbnZva2Vfcm91dGluZUV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1Nzg5Ojc6ICggaW52b2tlX3JvdXRpbmVfcmV0dXJuc1sgaW52b2tlUm91dGluZSBdICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDQ4OD0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTYzOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM2NToKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQ0ODg9MTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NDg4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU3ODk6OTogaW52b2tlX3JvdXRpbmVfcmV0dXJuc1sgaW52b2tlUm91dGluZSBdCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2ludm9rZV9yb3V0aW5lX3JldHVybnNfaW5fc3RhdGVtZW50X2ludm9rZV9yb3V0aW5lMjA0OTApOworICAgICAgICAgICAgCSAgICAgICAgaW52b2tlX3JvdXRpbmVfcmV0dXJucyhjdHgsIGludm9rZVJvdXRpbmUpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X2ludm9rZV9yb3V0aW5lRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgIE1BVENIVChTRU1JLCAmRk9MTE9XX1NFTUlfaW5fc3RhdGVtZW50X2ludm9rZV9yb3V0aW5lMjA1MDIpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfaW52b2tlX3JvdXRpbmVFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBhYz0gc2VwOjpQYXJzZXJVdGlsOjppbnZva2VSb3V0aW5lU3RhdGVtZW50KGludm9rZVJvdXRpbmUpOworICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZXN0YXRlbWVudF9pbnZva2Vfcm91dGluZUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZXN0YXRlbWVudF9pbnZva2Vfcm91dGluZUV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMjEyLCBzdGF0ZW1lbnRfaW52b2tlX3JvdXRpbmVfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiBhYzsKK30KKy8qICRBTlRMUiBlbmQgc3RhdGVtZW50X2ludm9rZV9yb3V0aW5lICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGludm9rZV9yb3V0aW5lX3BhcmFtcworICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTc5NjoxOiBpbnZva2Vfcm91dGluZV9wYXJhbXNbIHNlcDo6Um91dGluZSAqIGludm9rZVJvdXRpbmUgXSA6IExQQVJFTiAobHA9IGxhYmVsbGVkX2FyZ3VtZW50ICggQ09NTUEgbHA9IGxhYmVsbGVkX2FyZ3VtZW50ICkqICk/IFJQQVJFTiA7CisgKi8KK3N0YXRpYyB2b2lkCitpbnZva2Vfcm91dGluZV9wYXJhbXMocGZtbFBhcnNlciBjdHgsIHNlcDo6Um91dGluZSAqIGludm9rZVJvdXRpbmUpCit7CisgICAgQU5UTFIzX1VJTlQzMiBpbnZva2Vfcm91dGluZV9wYXJhbXNfU3RhcnRJbmRleDsKKworICAgIGZtbFBhcnNlcl9sYWJlbGxlZF9hcmd1bWVudF9yZXR1cm4gbHA7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2xwCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9scCBmbWxQYXJzZXJfbGFiZWxsZWRfYXJndW1lbnRfcmV0dXJuCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgaW52b2tlX3JvdXRpbmVfcGFyYW1zX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDIxMykpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTc5NzoyOiAoIExQQVJFTiAobHA9IGxhYmVsbGVkX2FyZ3VtZW50ICggQ09NTUEgbHA9IGxhYmVsbGVkX2FyZ3VtZW50ICkqICk/IFJQQVJFTiApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU3OTc6NDogTFBBUkVOIChscD0gbGFiZWxsZWRfYXJndW1lbnQgKCBDT01NQSBscD0gbGFiZWxsZWRfYXJndW1lbnQgKSogKT8gUlBBUkVOCisgICAgICAgIHsKKyAgICAgICAgICAgICBNQVRDSFQoTFBBUkVOLCAmRk9MTE9XX0xQQVJFTl9pbl9pbnZva2Vfcm91dGluZV9wYXJhbXMyMDUyNSk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWludm9rZV9yb3V0aW5lX3BhcmFtc0V4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTc5ODo0OiAobHA9IGxhYmVsbGVkX2FyZ3VtZW50ICggQ09NTUEgbHA9IGxhYmVsbGVkX2FyZ3VtZW50ICkqICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDQ5MD0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQk5PVDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPTngyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJMaXRlcmFsOgorICAgICAgICAgICAgICAgICAgICBjYXNlIERFQ1I6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRE9MTEFSX0xDVVJMWToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGbG9hdExpdGVyYWw6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSUQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSU5DUjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBJbnRlZ2VyTGl0ZXJhbDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMQlJBQ0tFVDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMQlJBQ0tFVF9CQVI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTENVUkxZOgorICAgICAgICAgICAgICAgICAgICBjYXNlIExOT1Q6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTFBBUkVOOgorICAgICAgICAgICAgICAgICAgICBjYXNlIExQQVJFTl9JTlZPS0U6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTUlOVVM6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BfUE9QOgorICAgICAgICAgICAgICAgICAgICBjYXNlIE9QX1RPUDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBQRVJDRU5UX0xDVVJMWToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBQTFVTOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFJhdGlvbmFsTGl0ZXJhbDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTdHJpbmdMaXRlcmFsOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDE1ODoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTk6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTYwOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDE2MToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjM3OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDI1NjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNjU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjc3OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDI4MDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOTQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzEzOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDMzMDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzMzE6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzMyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM0MzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzNDc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzcyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM5NzoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQ0OTA9MTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NDkwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU3OTg6NjogbHA9IGxhYmVsbGVkX2FyZ3VtZW50ICggQ09NTUEgbHA9IGxhYmVsbGVkX2FyZ3VtZW50ICkqCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2xhYmVsbGVkX2FyZ3VtZW50X2luX2ludm9rZV9yb3V0aW5lX3BhcmFtczIwNTM0KTsKKyAgICAgICAgICAgIAkgICAgICAgIGxwPWxhYmVsbGVkX2FyZ3VtZW50KGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVpbnZva2Vfcm91dGluZV9wYXJhbXNFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgCWludm9rZVJvdXRpbmUtPmFwcGVuZFBhcmFtZXRlcihscC5sYWJlbAorICAgICAgICAgICAgCSAgICAgICAgICAgICwgbHAuYXJnCisgICAgICAgICAgICAJICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU4MDI6NjogKCBDT01NQSBscD0gbGFiZWxsZWRfYXJndW1lbnQgKSoKKworICAgICAgICAgICAgCSAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0NDg5PTI7CisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIENPTU1BOgorICAgICAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQlhbHQ0ODk9MTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0NDg5KQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU4MDI6ODogQ09NTUEgbHA9IGxhYmVsbGVkX2FyZ3VtZW50CisgICAgICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoQ09NTUEsICZGT0xMT1dfQ09NTUFfaW5faW52b2tlX3JvdXRpbmVfcGFyYW1zMjA1NTApOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVpbnZva2Vfcm91dGluZV9wYXJhbXNFeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2xhYmVsbGVkX2FyZ3VtZW50X2luX2ludm9rZV9yb3V0aW5lX3BhcmFtczIwNTU5KTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGxwPWxhYmVsbGVkX2FyZ3VtZW50KGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVpbnZva2Vfcm91dGluZV9wYXJhbXNFeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgCWludm9rZVJvdXRpbmUtPmFwcGVuZFBhcmFtZXRlcihscC5sYWJlbAorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICwgbHAuYXJnCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICAgICAgCWRlZmF1bHQ6CisgICAgICAgICAgICAJICAgICAgICAJICAgIGdvdG8gbG9vcDQ4OTsJLyogYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGxvb3A0ODk6IDsgLyogSnVtcCBvdXQgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICBNQVRDSFQoUlBBUkVOLCAmRk9MTE9XX1JQQVJFTl9pbl9pbnZva2Vfcm91dGluZV9wYXJhbXMyMDU4NSk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWludm9rZV9yb3V0aW5lX3BhcmFtc0V4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVpbnZva2Vfcm91dGluZV9wYXJhbXNFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVpbnZva2Vfcm91dGluZV9wYXJhbXNFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDIxMywgaW52b2tlX3JvdXRpbmVfcGFyYW1zX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBpbnZva2Vfcm91dGluZV9wYXJhbXMgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgaW52b2tlX3JvdXRpbmVfcmV0dXJucworICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTgxMzoxOiBpbnZva2Vfcm91dGluZV9yZXR1cm5zWyBzZXA6OlJvdXRpbmUgKiBpbnZva2VSb3V0aW5lIF0gOiAoICctLT4nIHwgJ3JldHVybnM6JyApICggTFBBUkVOIGxwPSBsYWJlbGxlZF9hcmd1bWVudCAoIENPTU1BIGxwPSBsYWJlbGxlZF9hcmd1bWVudCApKiBSUEFSRU4gfGxwPSBsYWJlbGxlZF9hcmd1bWVudCApIDsKKyAqLworc3RhdGljIHZvaWQKK2ludm9rZV9yb3V0aW5lX3JldHVybnMocGZtbFBhcnNlciBjdHgsIHNlcDo6Um91dGluZSAqIGludm9rZVJvdXRpbmUpCit7CisgICAgQU5UTFIzX1VJTlQzMiBpbnZva2Vfcm91dGluZV9yZXR1cm5zX1N0YXJ0SW5kZXg7CisKKyAgICBmbWxQYXJzZXJfbGFiZWxsZWRfYXJndW1lbnRfcmV0dXJuIGxwOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9scAorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfbHAgZm1sUGFyc2VyX2xhYmVsbGVkX2FyZ3VtZW50X3JldHVybgorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGludm9rZV9yb3V0aW5lX3JldHVybnNfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMjE0KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1ODE0OjI6ICggKCAnLS0+JyB8ICdyZXR1cm5zOicgKSAoIExQQVJFTiBscD0gbGFiZWxsZWRfYXJndW1lbnQgKCBDT01NQSBscD0gbGFiZWxsZWRfYXJndW1lbnQgKSogUlBBUkVOIHxscD0gbGFiZWxsZWRfYXJndW1lbnQgKSApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU4MTQ6NDogKCAnLS0+JyB8ICdyZXR1cm5zOicgKSAoIExQQVJFTiBscD0gbGFiZWxsZWRfYXJndW1lbnQgKCBDT01NQSBscD0gbGFiZWxsZWRfYXJndW1lbnQgKSogUlBBUkVOIHxscD0gbGFiZWxsZWRfYXJndW1lbnQgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIExBKDEpID09IDE2MyB8fCBMQSgxKSA9PSAzNjUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENPTlNVTUUoKTsKKyAgICAgICAgICAgICAgICBQRVJST1JSRUNPVkVSWT1BTlRMUjNfRkFMU0U7CisgICAgICAgICAgICAgICAgRkFJTEVERkxBRz1BTlRMUjNfRkFMU0U7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19NSVNNQVRDSEVEX1NFVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5uYW1lICAgICAgICAgPSAodm9pZCAqKUFOVExSM19NSVNNQVRDSEVEX1NFVF9OQU1FOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZXhwZWN0aW5nU2V0ID0gTlVMTDsKKworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWludm9rZV9yb3V0aW5lX3JldHVybnNFeDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1ODE1OjQ6ICggTFBBUkVOIGxwPSBsYWJlbGxlZF9hcmd1bWVudCAoIENPTU1BIGxwPSBsYWJlbGxlZF9hcmd1bWVudCApKiBSUEFSRU4gfGxwPSBsYWJlbGxlZF9hcmd1bWVudCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDQ5Mj0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBMUEFSRU46CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgICAgICAJCSAgICBpbnQgTEE0OTJfMSA9IExBKDIpOworICAgICAgICAgICAgICAgIAkJICAgIGlmICggKHN5bnByZWQ5NDZfZm1sKGN0eCkpKQorICAgICAgICAgICAgICAgIAkJICAgIHsKKyAgICAgICAgICAgICAgICAJCSAgICAgICAgYWx0NDkyPTE7CisgICAgICAgICAgICAgICAgCQkgICAgfQorICAgICAgICAgICAgICAgIAkJICAgIGVsc2UgaWYgKCAoQU5UTFIzX1RSVUUpKQorICAgICAgICAgICAgICAgIAkJICAgIHsKKyAgICAgICAgICAgICAgICAJCSAgICAgICAgYWx0NDkyPTI7CisgICAgICAgICAgICAgICAgCQkgICAgfQorICAgICAgICAgICAgICAgIAkJICAgIGVsc2UKKyAgICAgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAgICAgCQkgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICAJCSAgICAgICAgeworICAgICAgICAgICAgICAgIAkJICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgIAkJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAJCSAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAJCSAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICAJCSAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgCQkgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICAJCSAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA0OTI7CisgICAgICAgICAgICAgICAgCQkgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMTsKKworCisgICAgICAgICAgICAgICAgCQkgICAgICAgIGdvdG8gcnVsZWludm9rZV9yb3V0aW5lX3JldHVybnNFeDsKKworICAgICAgICAgICAgICAgIAkJICAgIH0KKyAgICAgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJOT1Q6CisgICAgICAgICAgICAgICAgY2FzZSBDT0xPTngyOgorICAgICAgICAgICAgICAgIGNhc2UgQ2hhckxpdGVyYWw6CisgICAgICAgICAgICAgICAgY2FzZSBERUNSOgorICAgICAgICAgICAgICAgIGNhc2UgRE9MTEFSX0xDVVJMWToKKyAgICAgICAgICAgICAgICBjYXNlIEZsb2F0TGl0ZXJhbDoKKyAgICAgICAgICAgICAgICBjYXNlIElEOgorICAgICAgICAgICAgICAgIGNhc2UgSU5DUjoKKyAgICAgICAgICAgICAgICBjYXNlIEludGVnZXJMaXRlcmFsOgorICAgICAgICAgICAgICAgIGNhc2UgTEJSQUNLRVQ6CisgICAgICAgICAgICAgICAgY2FzZSBMQlJBQ0tFVF9CQVI6CisgICAgICAgICAgICAgICAgY2FzZSBMQ1VSTFk6CisgICAgICAgICAgICAgICAgY2FzZSBMTk9UOgorICAgICAgICAgICAgICAgIGNhc2UgTFBBUkVOX0lOVk9LRToKKyAgICAgICAgICAgICAgICBjYXNlIE1JTlVTOgorICAgICAgICAgICAgICAgIGNhc2UgT1BfUE9QOgorICAgICAgICAgICAgICAgIGNhc2UgT1BfVE9QOgorICAgICAgICAgICAgICAgIGNhc2UgUEVSQ0VOVF9MQ1VSTFk6CisgICAgICAgICAgICAgICAgY2FzZSBQTFVTOgorICAgICAgICAgICAgICAgIGNhc2UgUmF0aW9uYWxMaXRlcmFsOgorICAgICAgICAgICAgICAgIGNhc2UgU3RyaW5nTGl0ZXJhbDoKKyAgICAgICAgICAgICAgICBjYXNlIDE1ODoKKyAgICAgICAgICAgICAgICBjYXNlIDE1OToKKyAgICAgICAgICAgICAgICBjYXNlIDE2MDoKKyAgICAgICAgICAgICAgICBjYXNlIDE2MToKKyAgICAgICAgICAgICAgICBjYXNlIDE2MjoKKyAgICAgICAgICAgICAgICBjYXNlIDIzNzoKKyAgICAgICAgICAgICAgICBjYXNlIDI1NjoKKyAgICAgICAgICAgICAgICBjYXNlIDI2NToKKyAgICAgICAgICAgICAgICBjYXNlIDI3NzoKKyAgICAgICAgICAgICAgICBjYXNlIDI4MDoKKyAgICAgICAgICAgICAgICBjYXNlIDI5NDoKKyAgICAgICAgICAgICAgICBjYXNlIDMxMzoKKyAgICAgICAgICAgICAgICBjYXNlIDMzMDoKKyAgICAgICAgICAgICAgICBjYXNlIDMzMToKKyAgICAgICAgICAgICAgICBjYXNlIDMzMjoKKyAgICAgICAgICAgICAgICBjYXNlIDM0MzoKKyAgICAgICAgICAgICAgICBjYXNlIDM0NzoKKyAgICAgICAgICAgICAgICBjYXNlIDM3MjoKKyAgICAgICAgICAgICAgICBjYXNlIDM5NzoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0NDkyPTI7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDQ5MjsKKyAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgICAgICAgICAgZ290byBydWxlaW52b2tlX3JvdXRpbmVfcmV0dXJuc0V4OworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ0OTIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTgxNTo2OiBMUEFSRU4gbHA9IGxhYmVsbGVkX2FyZ3VtZW50ICggQ09NTUEgbHA9IGxhYmVsbGVkX2FyZ3VtZW50ICkqIFJQQVJFTgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKExQQVJFTiwgJkZPTExPV19MUEFSRU5faW5faW52b2tlX3JvdXRpbmVfcmV0dXJuczIwNjE0KTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlaW52b2tlX3JvdXRpbmVfcmV0dXJuc0V4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5faW52b2tlX3JvdXRpbmVfcmV0dXJuczIwNjIzKTsKKyAgICAgICAgICAgIAkgICAgICAgIGxwPWxhYmVsbGVkX2FyZ3VtZW50KGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVpbnZva2Vfcm91dGluZV9yZXR1cm5zRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIAlpbnZva2VSb3V0aW5lLT5hcHBlbmRSZXR1cm4obHAubGFiZWwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAsIGxwLmFyZworICAgICAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1ODIwOjY6ICggQ09NTUEgbHA9IGxhYmVsbGVkX2FyZ3VtZW50ICkqCisKKyAgICAgICAgICAgIAkgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDQ5MT0yOworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBDT01NQToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJYWx0NDkxPTE7CisgICAgICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ5MSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1ODIwOjg6IENPTU1BIGxwPSBsYWJlbGxlZF9hcmd1bWVudAorICAgICAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKENPTU1BLCAmRk9MTE9XX0NPTU1BX2luX2ludm9rZV9yb3V0aW5lX3JldHVybnMyMDYzOSk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWludm9rZV9yb3V0aW5lX3JldHVybnNFeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2xhYmVsbGVkX2FyZ3VtZW50X2luX2ludm9rZV9yb3V0aW5lX3JldHVybnMyMDY1MCk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBscD1sYWJlbGxlZF9hcmd1bWVudChjdHgpOworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlaW52b2tlX3JvdXRpbmVfcmV0dXJuc0V4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAJaW52b2tlUm91dGluZS0+YXBwZW5kUmV0dXJuKGxwLmxhYmVsCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgLCBscC5hcmcKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICApOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgICAKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAgICAgCSAgICAgICAgCSAgICBnb3RvIGxvb3A0OTE7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBsb29wNDkxOiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChSUEFSRU4sICZGT0xMT1dfUlBBUkVOX2luX2ludm9rZV9yb3V0aW5lX3JldHVybnMyMDY3NCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWludm9rZV9yb3V0aW5lX3JldHVybnNFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDI6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU4Mjg6NjogbHA9IGxhYmVsbGVkX2FyZ3VtZW50CisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2xhYmVsbGVkX2FyZ3VtZW50X2luX2ludm9rZV9yb3V0aW5lX3JldHVybnMyMDY4NCk7CisgICAgICAgICAgICAJICAgICAgICBscD1sYWJlbGxlZF9hcmd1bWVudChjdHgpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlaW52b2tlX3JvdXRpbmVfcmV0dXJuc0V4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworCisgICAgICAgICAgICAJICAgICAgICAgICAgCSAgICAJaW52b2tlUm91dGluZS0+YXBwZW5kUmV0dXJuKGxwLmxhYmVsCisgICAgICAgICAgICAJICAgICAgICAgICAgLCBscC5hcmcKKyAgICAgICAgICAgIAkgICAgICAgICAgICApOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZWludm9rZV9yb3V0aW5lX3JldHVybnNFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVpbnZva2Vfcm91dGluZV9yZXR1cm5zRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgyMTQsIGludm9rZV9yb3V0aW5lX3JldHVybnNfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGludm9rZV9yb3V0aW5lX3JldHVybnMgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgc3RhdGVtZW50X21vYworICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTg3NzoxOiBzdGF0ZW1lbnRfbW9jIHJldHVybnMgWyBzZXA6OkJGQ29kZSBhYyBdIDogJ3N0ZXBfbWFyaycgU3RyaW5nTGl0ZXJhbCBTRU1JIDsKKyAqLworc3RhdGljIHNlcDo6QkZDb2RlCitzdGF0ZW1lbnRfbW9jKHBmbWxQYXJzZXIgY3R4KQoreworICAgIHNlcDo6QkZDb2RlIGFjOworCisgICAgQU5UTFIzX1VJTlQzMiBzdGF0ZW1lbnRfbW9jX1N0YXJ0SW5kZXg7CisKKyAgICBwQU5UTFIzX0NPTU1PTl9UT0tFTiAgICBTdHJpbmdMaXRlcmFsMTI7CisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgc3RhdGVtZW50X21vY19TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgyMTUpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIGFjOworICAgIH0KKworICAgIFN0cmluZ0xpdGVyYWwxMiAgICAgICA9IE5VTEw7CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU4Nzk6MjogKCAnc3RlcF9tYXJrJyBTdHJpbmdMaXRlcmFsIFNFTUkgKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1ODc5OjQ6ICdzdGVwX21hcmsnIFN0cmluZ0xpdGVyYWwgU0VNSQorICAgICAgICB7CisgICAgICAgICAgICAgTUFUQ0hUKDM4NSwgJkZPTExPV18zODVfaW5fc3RhdGVtZW50X21vYzIwNzIyKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X21vY0V4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBTdHJpbmdMaXRlcmFsMTIgPSAocEFOVExSM19DT01NT05fVE9LRU4pIE1BVENIVChTdHJpbmdMaXRlcmFsLCAmRk9MTE9XX1N0cmluZ0xpdGVyYWxfaW5fc3RhdGVtZW50X21vYzIwNzI1KTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlc3RhdGVtZW50X21vY0V4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgTUFUQ0hUKFNFTUksICZGT0xMT1dfU0VNSV9pbl9zdGF0ZW1lbnRfbW9jMjA3MjgpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVzdGF0ZW1lbnRfbW9jRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIAkJYWM9IE5FV19TVE1UMShPUChTVEVQX01BUkspLAorICAgICAgICAgICAgICAgIAkJCU5FV19TVFJJTkcoU1RSKChTdHJpbmdMaXRlcmFsMTItPmdldFRleHQoU3RyaW5nTGl0ZXJhbDEyKSktPmNoYXJzKSkpOworCisgICAgICAgICAgICAgICAgCQorICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlc3RhdGVtZW50X21vY0V4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZXN0YXRlbWVudF9tb2NFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDIxNSwgc3RhdGVtZW50X21vY19TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIGFjOworfQorLyogJEFOVExSIGVuZCBzdGF0ZW1lbnRfbW9jICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGV4cHJlc3Npb24KKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU4OTU6MTogZXhwcmVzc2lvbiByZXR1cm5zIFsgc2VwOjpCRiBiZiBdIDogZT0gY29uZGl0aW9uYWxFeHByZXNzaW9uICggQVNTSUdOIGU9IGV4cHJlc3Npb24gfCBBU1NJR05fTUFDUk8gZT0gZXhwcmVzc2lvbiB8IEFTU0lHTl9BRlRFUiBlPSBleHByZXNzaW9uIHwgUExVU19BU1NJR04gZT0gZXhwcmVzc2lvbiB8IFBMVVNfQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24gfCBNSU5VU19BU1NJR04gZT0gZXhwcmVzc2lvbiB8IE1JTlVTX0FTU0lHTl9BRlRFUiBlPSBleHByZXNzaW9uIHwgU1RBUl9BU1NJR04gZT0gZXhwcmVzc2lvbiB8IFNUQVJfQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24gfCBESVZfQVNTSUdOIGU9IGV4cHJlc3Npb24gfCBESVZfQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24gfCBNT0RfQVNTSUdOIGU9IGV4cHJlc3Npb24gfCBNT0RfQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24gfCBMQU5EX0FTU0lHTiBlPSBleHByZXNzaW9uIHwgTEFORF9BU1NJR05fQUZURVIgZT0gZXhwcmVzc2lvbiB8IExPUl9BU1NJR04gZT0gZXhwcmVzc2lvbiB8IExPUl9BU1NJR05fQUZURVIgZT0gZXhwcmVzc2lvbiB8IEJBTkRfQVNTSUdOIGU9IGV4cHJlc3Npb24gfCBCQU5EX0FTU0lHTl9BRlRFUiBlPSBleHByZXNzaW9uIHwgQk9SX0FTU0lHTiBlPSBleHByZXNzaW9uIHwgQk9SX0FTU0lHTl9BRlRFUiBlPSBleHByZXNzaW9uIHwgQlhPUl9BU1NJR04gZT0gZXhwcmVzc2lvbiB8IEJYT1JfQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24gfCBMU0hJRlRfQVNTSUdOIGU9IGV4cHJlc3Npb24gfCBMU0hJRlRfQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24gfCBSU0hJRlRfQVNTSUdOIGU9IGV4cHJlc3Npb24gfCBSU0hJRlRfQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24gfCBPUF9QVVNIIGU9IGV4cHJlc3Npb24gfCBPUF9BU1NJR05fVE9QIGU9IGV4cHJlc3Npb24gfCBPUF9QT1AgZT0gZXhwcmVzc2lvbiApPyA7CisgKi8KK3N0YXRpYyBzZXA6OkJGCitleHByZXNzaW9uKHBmbWxQYXJzZXIgY3R4KQoreworICAgIHNlcDo6QkYgYmY7CisKKyAgICBBTlRMUjNfVUlOVDMyIGV4cHJlc3Npb25fU3RhcnRJbmRleDsKKworICAgIHNlcDo6QkYgZTsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfZQorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfZSBzZXA6OkJGCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgZXhwcmVzc2lvbl9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgyMTYpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIGJmOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTg5NzoyOiAoZT0gY29uZGl0aW9uYWxFeHByZXNzaW9uICggQVNTSUdOIGU9IGV4cHJlc3Npb24gfCBBU1NJR05fTUFDUk8gZT0gZXhwcmVzc2lvbiB8IEFTU0lHTl9BRlRFUiBlPSBleHByZXNzaW9uIHwgUExVU19BU1NJR04gZT0gZXhwcmVzc2lvbiB8IFBMVVNfQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24gfCBNSU5VU19BU1NJR04gZT0gZXhwcmVzc2lvbiB8IE1JTlVTX0FTU0lHTl9BRlRFUiBlPSBleHByZXNzaW9uIHwgU1RBUl9BU1NJR04gZT0gZXhwcmVzc2lvbiB8IFNUQVJfQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24gfCBESVZfQVNTSUdOIGU9IGV4cHJlc3Npb24gfCBESVZfQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24gfCBNT0RfQVNTSUdOIGU9IGV4cHJlc3Npb24gfCBNT0RfQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24gfCBMQU5EX0FTU0lHTiBlPSBleHByZXNzaW9uIHwgTEFORF9BU1NJR05fQUZURVIgZT0gZXhwcmVzc2lvbiB8IExPUl9BU1NJR04gZT0gZXhwcmVzc2lvbiB8IExPUl9BU1NJR05fQUZURVIgZT0gZXhwcmVzc2lvbiB8IEJBTkRfQVNTSUdOIGU9IGV4cHJlc3Npb24gfCBCQU5EX0FTU0lHTl9BRlRFUiBlPSBleHByZXNzaW9uIHwgQk9SX0FTU0lHTiBlPSBleHByZXNzaW9uIHwgQk9SX0FTU0lHTl9BRlRFUiBlPSBleHByZXNzaW9uIHwgQlhPUl9BU1NJR04gZT0gZXhwcmVzc2lvbiB8IEJYT1JfQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24gfCBMU0hJRlRfQVNTSUdOIGU9IGV4cHJlc3Npb24gfCBMU0hJRlRfQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24gfCBSU0hJRlRfQVNTSUdOIGU9IGV4cHJlc3Npb24gfCBSU0hJRlRfQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24gfCBPUF9QVVNIIGU9IGV4cHJlc3Npb24gfCBPUF9BU1NJR05fVE9QIGU9IGV4cHJlc3Npb24gfCBPUF9QT1AgZT0gZXhwcmVzc2lvbiApPyApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU4OTc6NDogZT0gY29uZGl0aW9uYWxFeHByZXNzaW9uICggQVNTSUdOIGU9IGV4cHJlc3Npb24gfCBBU1NJR05fTUFDUk8gZT0gZXhwcmVzc2lvbiB8IEFTU0lHTl9BRlRFUiBlPSBleHByZXNzaW9uIHwgUExVU19BU1NJR04gZT0gZXhwcmVzc2lvbiB8IFBMVVNfQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24gfCBNSU5VU19BU1NJR04gZT0gZXhwcmVzc2lvbiB8IE1JTlVTX0FTU0lHTl9BRlRFUiBlPSBleHByZXNzaW9uIHwgU1RBUl9BU1NJR04gZT0gZXhwcmVzc2lvbiB8IFNUQVJfQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24gfCBESVZfQVNTSUdOIGU9IGV4cHJlc3Npb24gfCBESVZfQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24gfCBNT0RfQVNTSUdOIGU9IGV4cHJlc3Npb24gfCBNT0RfQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24gfCBMQU5EX0FTU0lHTiBlPSBleHByZXNzaW9uIHwgTEFORF9BU1NJR05fQUZURVIgZT0gZXhwcmVzc2lvbiB8IExPUl9BU1NJR04gZT0gZXhwcmVzc2lvbiB8IExPUl9BU1NJR05fQUZURVIgZT0gZXhwcmVzc2lvbiB8IEJBTkRfQVNTSUdOIGU9IGV4cHJlc3Npb24gfCBCQU5EX0FTU0lHTl9BRlRFUiBlPSBleHByZXNzaW9uIHwgQk9SX0FTU0lHTiBlPSBleHByZXNzaW9uIHwgQk9SX0FTU0lHTl9BRlRFUiBlPSBleHByZXNzaW9uIHwgQlhPUl9BU1NJR04gZT0gZXhwcmVzc2lvbiB8IEJYT1JfQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24gfCBMU0hJRlRfQVNTSUdOIGU9IGV4cHJlc3Npb24gfCBMU0hJRlRfQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24gfCBSU0hJRlRfQVNTSUdOIGU9IGV4cHJlc3Npb24gfCBSU0hJRlRfQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24gfCBPUF9QVVNIIGU9IGV4cHJlc3Npb24gfCBPUF9BU1NJR05fVE9QIGU9IGV4cHJlc3Npb24gfCBPUF9QT1AgZT0gZXhwcmVzc2lvbiApPworICAgICAgICB7CisgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19jb25kaXRpb25hbEV4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIwNzU3KTsKKyAgICAgICAgICAgIGU9Y29uZGl0aW9uYWxFeHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVleHByZXNzaW9uRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgYmY9IAorICAgICAgICAgICAgICAgIGUKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU4OTk6MjogKCBBU1NJR04gZT0gZXhwcmVzc2lvbiB8IEFTU0lHTl9NQUNSTyBlPSBleHByZXNzaW9uIHwgQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24gfCBQTFVTX0FTU0lHTiBlPSBleHByZXNzaW9uIHwgUExVU19BU1NJR05fQUZURVIgZT0gZXhwcmVzc2lvbiB8IE1JTlVTX0FTU0lHTiBlPSBleHByZXNzaW9uIHwgTUlOVVNfQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24gfCBTVEFSX0FTU0lHTiBlPSBleHByZXNzaW9uIHwgU1RBUl9BU1NJR05fQUZURVIgZT0gZXhwcmVzc2lvbiB8IERJVl9BU1NJR04gZT0gZXhwcmVzc2lvbiB8IERJVl9BU1NJR05fQUZURVIgZT0gZXhwcmVzc2lvbiB8IE1PRF9BU1NJR04gZT0gZXhwcmVzc2lvbiB8IE1PRF9BU1NJR05fQUZURVIgZT0gZXhwcmVzc2lvbiB8IExBTkRfQVNTSUdOIGU9IGV4cHJlc3Npb24gfCBMQU5EX0FTU0lHTl9BRlRFUiBlPSBleHByZXNzaW9uIHwgTE9SX0FTU0lHTiBlPSBleHByZXNzaW9uIHwgTE9SX0FTU0lHTl9BRlRFUiBlPSBleHByZXNzaW9uIHwgQkFORF9BU1NJR04gZT0gZXhwcmVzc2lvbiB8IEJBTkRfQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24gfCBCT1JfQVNTSUdOIGU9IGV4cHJlc3Npb24gfCBCT1JfQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24gfCBCWE9SX0FTU0lHTiBlPSBleHByZXNzaW9uIHwgQlhPUl9BU1NJR05fQUZURVIgZT0gZXhwcmVzc2lvbiB8IExTSElGVF9BU1NJR04gZT0gZXhwcmVzc2lvbiB8IExTSElGVF9BU1NJR05fQUZURVIgZT0gZXhwcmVzc2lvbiB8IFJTSElGVF9BU1NJR04gZT0gZXhwcmVzc2lvbiB8IFJTSElGVF9BU1NJR05fQUZURVIgZT0gZXhwcmVzc2lvbiB8IE9QX1BVU0ggZT0gZXhwcmVzc2lvbiB8IE9QX0FTU0lHTl9UT1AgZT0gZXhwcmVzc2lvbiB8IE9QX1BPUCBlPSBleHByZXNzaW9uICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDQ5Mz0zMTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEFTU0lHTjoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIGludCBMQTQ5M18xID0gTEEoMik7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIGlmICggKHN5bnByZWQ5NDdfZm1sKGN0eCkpKQorICAgICAgICAgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkJICAgICAgICBhbHQ0OTM9MTsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgfQorICAgICAgICAgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEFTU0lHTl9NQUNSTzoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIGludCBMQTQ5M180ID0gTEEoMik7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIGlmICggKHN5bnByZWQ5NDhfZm1sKGN0eCkpKQorICAgICAgICAgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkJICAgICAgICBhbHQ0OTM9MjsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgfQorICAgICAgICAgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEFTU0lHTl9BRlRFUjoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIGludCBMQTQ5M182ID0gTEEoMik7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIGlmICggKHN5bnByZWQ5NDlfZm1sKGN0eCkpKQorICAgICAgICAgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkJICAgICAgICBhbHQ0OTM9MzsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgfQorICAgICAgICAgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFBMVVNfQVNTSUdOOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgaW50IExBNDkzXzggPSBMQSgyKTsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgaWYgKCAoc3lucHJlZDk1MF9mbWwoY3R4KSkpCisgICAgICAgICAgICAgICAgICAgIAkJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgICAgIGFsdDQ5Mz00OworICAgICAgICAgICAgICAgICAgICAJCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUExVU19BU1NJR05fQUZURVI6CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJeworICAgICAgICAgICAgICAgICAgICAJCSAgICBpbnQgTEE0OTNfMTAgPSBMQSgyKTsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgaWYgKCAoc3lucHJlZDk1MV9mbWwoY3R4KSkpCisgICAgICAgICAgICAgICAgICAgIAkJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgICAgIGFsdDQ5Mz01OworICAgICAgICAgICAgICAgICAgICAJCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTUlOVVNfQVNTSUdOOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgaW50IExBNDkzXzEyID0gTEEoMik7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIGlmICggKHN5bnByZWQ5NTJfZm1sKGN0eCkpKQorICAgICAgICAgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkJICAgICAgICBhbHQ0OTM9NjsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgfQorICAgICAgICAgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIE1JTlVTX0FTU0lHTl9BRlRFUjoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIGludCBMQTQ5M18xNCA9IExBKDIpOworICAgICAgICAgICAgICAgICAgICAJCSAgICBpZiAoIChzeW5wcmVkOTUzX2ZtbChjdHgpKSkKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgeworICAgICAgICAgICAgICAgICAgICAJCSAgICAgICAgYWx0NDkzPTc7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTVEFSX0FTU0lHTjoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIGludCBMQTQ5M18xNiA9IExBKDIpOworICAgICAgICAgICAgICAgICAgICAJCSAgICBpZiAoIChzeW5wcmVkOTU0X2ZtbChjdHgpKSkKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgeworICAgICAgICAgICAgICAgICAgICAJCSAgICAgICAgYWx0NDkzPTg7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTVEFSX0FTU0lHTl9BRlRFUjoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIGludCBMQTQ5M18xOCA9IExBKDIpOworICAgICAgICAgICAgICAgICAgICAJCSAgICBpZiAoIChzeW5wcmVkOTU1X2ZtbChjdHgpKSkKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgeworICAgICAgICAgICAgICAgICAgICAJCSAgICAgICAgYWx0NDkzPTk7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBESVZfQVNTSUdOOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgaW50IExBNDkzXzIwID0gTEEoMik7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIGlmICggKHN5bnByZWQ5NTZfZm1sKGN0eCkpKQorICAgICAgICAgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkJICAgICAgICBhbHQ0OTM9MTA7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBESVZfQVNTSUdOX0FGVEVSOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgaW50IExBNDkzXzIyID0gTEEoMik7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIGlmICggKHN5bnByZWQ5NTdfZm1sKGN0eCkpKQorICAgICAgICAgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkJICAgICAgICBhbHQ0OTM9MTE7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBNT0RfQVNTSUdOOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgaW50IExBNDkzXzI0ID0gTEEoMik7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIGlmICggKHN5bnByZWQ5NThfZm1sKGN0eCkpKQorICAgICAgICAgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkJICAgICAgICBhbHQ0OTM9MTI7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBNT0RfQVNTSUdOX0FGVEVSOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgaW50IExBNDkzXzI2ID0gTEEoMik7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIGlmICggKHN5bnByZWQ5NTlfZm1sKGN0eCkpKQorICAgICAgICAgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkJICAgICAgICBhbHQ0OTM9MTM7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMQU5EX0FTU0lHTjoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIGludCBMQTQ5M18yOCA9IExBKDIpOworICAgICAgICAgICAgICAgICAgICAJCSAgICBpZiAoIChzeW5wcmVkOTYwX2ZtbChjdHgpKSkKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgeworICAgICAgICAgICAgICAgICAgICAJCSAgICAgICAgYWx0NDkzPTE0OworICAgICAgICAgICAgICAgICAgICAJCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTEFORF9BU1NJR05fQUZURVI6CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJeworICAgICAgICAgICAgICAgICAgICAJCSAgICBpbnQgTEE0OTNfMzAgPSBMQSgyKTsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgaWYgKCAoc3lucHJlZDk2MV9mbWwoY3R4KSkpCisgICAgICAgICAgICAgICAgICAgIAkJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgICAgIGFsdDQ5Mz0xNTsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgfQorICAgICAgICAgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIExPUl9BU1NJR046CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJeworICAgICAgICAgICAgICAgICAgICAJCSAgICBpbnQgTEE0OTNfMzIgPSBMQSgyKTsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgaWYgKCAoc3lucHJlZDk2Ml9mbWwoY3R4KSkpCisgICAgICAgICAgICAgICAgICAgIAkJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgICAgIGFsdDQ5Mz0xNjsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgfQorICAgICAgICAgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIExPUl9BU1NJR05fQUZURVI6CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJeworICAgICAgICAgICAgICAgICAgICAJCSAgICBpbnQgTEE0OTNfMzQgPSBMQSgyKTsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgaWYgKCAoc3lucHJlZDk2M19mbWwoY3R4KSkpCisgICAgICAgICAgICAgICAgICAgIAkJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgICAgIGFsdDQ5Mz0xNzsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgfQorICAgICAgICAgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJBTkRfQVNTSUdOOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgaW50IExBNDkzXzM2ID0gTEEoMik7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIGlmICggKHN5bnByZWQ5NjRfZm1sKGN0eCkpKQorICAgICAgICAgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkJICAgICAgICBhbHQ0OTM9MTg7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCQU5EX0FTU0lHTl9BRlRFUjoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIGludCBMQTQ5M18zOCA9IExBKDIpOworICAgICAgICAgICAgICAgICAgICAJCSAgICBpZiAoIChzeW5wcmVkOTY1X2ZtbChjdHgpKSkKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgeworICAgICAgICAgICAgICAgICAgICAJCSAgICAgICAgYWx0NDkzPTE5OworICAgICAgICAgICAgICAgICAgICAJCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQk9SX0FTU0lHTjoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIGludCBMQTQ5M180MCA9IExBKDIpOworICAgICAgICAgICAgICAgICAgICAJCSAgICBpZiAoIChzeW5wcmVkOTY2X2ZtbChjdHgpKSkKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgeworICAgICAgICAgICAgICAgICAgICAJCSAgICAgICAgYWx0NDkzPTIwOworICAgICAgICAgICAgICAgICAgICAJCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQk9SX0FTU0lHTl9BRlRFUjoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIGludCBMQTQ5M180MiA9IExBKDIpOworICAgICAgICAgICAgICAgICAgICAJCSAgICBpZiAoIChzeW5wcmVkOTY3X2ZtbChjdHgpKSkKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgeworICAgICAgICAgICAgICAgICAgICAJCSAgICAgICAgYWx0NDkzPTIxOworICAgICAgICAgICAgICAgICAgICAJCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQlhPUl9BU1NJR046CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJeworICAgICAgICAgICAgICAgICAgICAJCSAgICBpbnQgTEE0OTNfNDQgPSBMQSgyKTsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgaWYgKCAoc3lucHJlZDk2OF9mbWwoY3R4KSkpCisgICAgICAgICAgICAgICAgICAgIAkJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgICAgIGFsdDQ5Mz0yMjsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgfQorICAgICAgICAgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJYT1JfQVNTSUdOX0FGVEVSOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgaW50IExBNDkzXzQ2ID0gTEEoMik7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIGlmICggKHN5bnByZWQ5NjlfZm1sKGN0eCkpKQorICAgICAgICAgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkJICAgICAgICBhbHQ0OTM9MjM7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMU0hJRlRfQVNTSUdOOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgaW50IExBNDkzXzQ4ID0gTEEoMik7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIGlmICggKHN5bnByZWQ5NzBfZm1sKGN0eCkpKQorICAgICAgICAgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkJICAgICAgICBhbHQ0OTM9MjQ7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMU0hJRlRfQVNTSUdOX0FGVEVSOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgaW50IExBNDkzXzUwID0gTEEoMik7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIGlmICggKHN5bnByZWQ5NzFfZm1sKGN0eCkpKQorICAgICAgICAgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkJICAgICAgICBhbHQ0OTM9MjU7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSU0hJRlRfQVNTSUdOOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgaW50IExBNDkzXzUyID0gTEEoMik7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIGlmICggKHN5bnByZWQ5NzJfZm1sKGN0eCkpKQorICAgICAgICAgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkJICAgICAgICBhbHQ0OTM9MjY7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSU0hJRlRfQVNTSUdOX0FGVEVSOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgaW50IExBNDkzXzU0ID0gTEEoMik7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIGlmICggKHN5bnByZWQ5NzNfZm1sKGN0eCkpKQorICAgICAgICAgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkJICAgICAgICBhbHQ0OTM9Mjc7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPUF9QVVNIOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgaW50IExBNDkzXzU2ID0gTEEoMik7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIGlmICggKHN5bnByZWQ5NzRfZm1sKGN0eCkpKQorICAgICAgICAgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkJICAgICAgICBhbHQ0OTM9Mjg7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPUF9BU1NJR05fVE9QOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgaW50IExBNDkzXzU4ID0gTEEoMik7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIGlmICggKHN5bnByZWQ5NzVfZm1sKGN0eCkpKQorICAgICAgICAgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkJICAgICAgICBhbHQ0OTM9Mjk7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPUF9QT1A6CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJeworICAgICAgICAgICAgICAgICAgICAJCSAgICBpbnQgTEE0OTNfNjAgPSBMQSgyKTsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgaWYgKCAoc3lucHJlZDk3Nl9mbWwoY3R4KSkpCisgICAgICAgICAgICAgICAgICAgIAkJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgICAgIGFsdDQ5Mz0zMDsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgfQorICAgICAgICAgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NDkzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU4OTk6NDogQVNTSUdOIGU9IGV4cHJlc3Npb24KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChBU1NJR04sICZGT0xMT1dfQVNTSUdOX2luX2V4cHJlc3Npb24yMDc2Nik7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjA3NzEpOworICAgICAgICAgICAgCSAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleHByZXNzaW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgYmY9IE5FV19DT0RFMihPUChBU1NJR04pLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICBiZgorICAgICAgICAgICAgCSAgICAgICAgICAgICwgZQorICAgICAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDI6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU5MDI6NDogQVNTSUdOX01BQ1JPIGU9IGV4cHJlc3Npb24KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChBU1NJR05fTUFDUk8sICZGT0xMT1dfQVNTSUdOX01BQ1JPX2luX2V4cHJlc3Npb24yMDc4MCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjA3ODUpOworICAgICAgICAgICAgCSAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleHByZXNzaW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgYmY9IE5FV19DT0RFMihPUChBU1NJR05fTUFDUk8pLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICBiZgorICAgICAgICAgICAgCSAgICAgICAgICAgICwgZQorICAgICAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDM6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU5MDU6NDogQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChBU1NJR05fQUZURVIsICZGT0xMT1dfQVNTSUdOX0FGVEVSX2luX2V4cHJlc3Npb24yMDc5NCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjA3OTkpOworICAgICAgICAgICAgCSAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleHByZXNzaW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgYmY9IE5FV19DT0RFMihPUChBU1NJR05fQUZURVIpLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICBiZgorICAgICAgICAgICAgCSAgICAgICAgICAgICwgZQorICAgICAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDQ6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU5MDg6NDogUExVU19BU1NJR04gZT0gZXhwcmVzc2lvbgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKFBMVVNfQVNTSUdOLCAmRk9MTE9XX1BMVVNfQVNTSUdOX2luX2V4cHJlc3Npb24yMDgwOCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjA4MTMpOworICAgICAgICAgICAgCSAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleHByZXNzaW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgYmY9IE5FV19TVE1UX0FTU0lHTl9PUChPUChQTFVTKSwgCisgICAgICAgICAgICAJICAgICAgICAgICAgYmYKKyAgICAgICAgICAgIAkgICAgICAgICAgICAsIGUKKyAgICAgICAgICAgIAkgICAgICAgICAgICApOworICAgICAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSA1OgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1OTExOjQ6IFBMVVNfQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChQTFVTX0FTU0lHTl9BRlRFUiwgJkZPTExPV19QTFVTX0FTU0lHTl9BRlRFUl9pbl9leHByZXNzaW9uMjA4MjIpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleHByZXNzaW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIwODI3KTsKKyAgICAgICAgICAgIAkgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbkV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIGJmPSBORVdfU1RNVF9BU1NJR05fT1BfQUZURVIoT1AoUExVUyksIAorICAgICAgICAgICAgCSAgICAgICAgICAgIGJmCisgICAgICAgICAgICAJICAgICAgICAgICAgLCBlCisgICAgICAgICAgICAJICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgNjoKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTkxNDo0OiBNSU5VU19BU1NJR04gZT0gZXhwcmVzc2lvbgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKE1JTlVTX0FTU0lHTiwgJkZPTExPV19NSU5VU19BU1NJR05faW5fZXhwcmVzc2lvbjIwODM2KTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbkV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb24yMDg0MSk7CisgICAgICAgICAgICAJICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBiZj0gTkVXX1NUTVRfQVNTSUdOX09QKE9QKE1JTlVTKSwgCisgICAgICAgICAgICAJICAgICAgICAgICAgYmYKKyAgICAgICAgICAgIAkgICAgICAgICAgICAsIGUKKyAgICAgICAgICAgIAkgICAgICAgICAgICApOworICAgICAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSA3OgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1OTE3OjQ6IE1JTlVTX0FTU0lHTl9BRlRFUiBlPSBleHByZXNzaW9uCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoTUlOVVNfQVNTSUdOX0FGVEVSLCAmRk9MTE9XX01JTlVTX0FTU0lHTl9BRlRFUl9pbl9leHByZXNzaW9uMjA4NTApOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleHByZXNzaW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIwODU1KTsKKyAgICAgICAgICAgIAkgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbkV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIGJmPSBORVdfU1RNVF9BU1NJR05fT1BfQUZURVIoT1AoTUlOVVMpLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICBiZgorICAgICAgICAgICAgCSAgICAgICAgICAgICwgZQorICAgICAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDg6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU5MjA6NDogU1RBUl9BU1NJR04gZT0gZXhwcmVzc2lvbgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKFNUQVJfQVNTSUdOLCAmRk9MTE9XX1NUQVJfQVNTSUdOX2luX2V4cHJlc3Npb24yMDg2NCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjA4NjkpOworICAgICAgICAgICAgCSAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleHByZXNzaW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgYmY9IE5FV19TVE1UX0FTU0lHTl9PUChPUChNVUxUKSwgCisgICAgICAgICAgICAJICAgICAgICAgICAgYmYKKyAgICAgICAgICAgIAkgICAgICAgICAgICAsIGUKKyAgICAgICAgICAgIAkgICAgICAgICAgICApOworICAgICAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSA5OgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1OTIzOjQ6IFNUQVJfQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChTVEFSX0FTU0lHTl9BRlRFUiwgJkZPTExPV19TVEFSX0FTU0lHTl9BRlRFUl9pbl9leHByZXNzaW9uMjA4NzgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleHByZXNzaW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIwODgzKTsKKyAgICAgICAgICAgIAkgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbkV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIGJmPSBORVdfU1RNVF9BU1NJR05fT1BfQUZURVIoT1AoTVVMVCksIAorICAgICAgICAgICAgCSAgICAgICAgICAgIGJmCisgICAgICAgICAgICAJICAgICAgICAgICAgLCBlCisgICAgICAgICAgICAJICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMTA6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU5MjY6NDogRElWX0FTU0lHTiBlPSBleHByZXNzaW9uCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoRElWX0FTU0lHTiwgJkZPTExPV19ESVZfQVNTSUdOX2luX2V4cHJlc3Npb24yMDg5Mik7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjA4OTcpOworICAgICAgICAgICAgCSAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleHByZXNzaW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgYmY9IE5FV19TVE1UX0FTU0lHTl9PUChPUChESVYpLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICBiZgorICAgICAgICAgICAgCSAgICAgICAgICAgICwgZQorICAgICAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDExOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1OTI5OjQ6IERJVl9BU1NJR05fQUZURVIgZT0gZXhwcmVzc2lvbgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKERJVl9BU1NJR05fQUZURVIsICZGT0xMT1dfRElWX0FTU0lHTl9BRlRFUl9pbl9leHByZXNzaW9uMjA5MDYpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleHByZXNzaW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIwOTExKTsKKyAgICAgICAgICAgIAkgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbkV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIGJmPSBORVdfU1RNVF9BU1NJR05fT1BfQUZURVIoT1AoRElWKSwgCisgICAgICAgICAgICAJICAgICAgICAgICAgYmYKKyAgICAgICAgICAgIAkgICAgICAgICAgICAsIGUKKyAgICAgICAgICAgIAkgICAgICAgICAgICApOworICAgICAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAxMjoKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTkzMjo0OiBNT0RfQVNTSUdOIGU9IGV4cHJlc3Npb24KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChNT0RfQVNTSUdOLCAmRk9MTE9XX01PRF9BU1NJR05faW5fZXhwcmVzc2lvbjIwOTIwKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbkV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb24yMDkyNSk7CisgICAgICAgICAgICAJICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBiZj0gTkVXX1NUTVRfQVNTSUdOX09QKE9QKE1PRCksIAorICAgICAgICAgICAgCSAgICAgICAgICAgIGJmCisgICAgICAgICAgICAJICAgICAgICAgICAgLCBlCisgICAgICAgICAgICAJICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMTM6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU5MzU6NDogTU9EX0FTU0lHTl9BRlRFUiBlPSBleHByZXNzaW9uCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoTU9EX0FTU0lHTl9BRlRFUiwgJkZPTExPV19NT0RfQVNTSUdOX0FGVEVSX2luX2V4cHJlc3Npb24yMDkzNCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjA5MzkpOworICAgICAgICAgICAgCSAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleHByZXNzaW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgYmY9IE5FV19TVE1UX0FTU0lHTl9PUF9BRlRFUihPUChNT0QpLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICBiZgorICAgICAgICAgICAgCSAgICAgICAgICAgICwgZQorICAgICAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDE0OgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1OTM4OjQ6IExBTkRfQVNTSUdOIGU9IGV4cHJlc3Npb24KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChMQU5EX0FTU0lHTiwgJkZPTExPV19MQU5EX0FTU0lHTl9pbl9leHByZXNzaW9uMjA5NDgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleHByZXNzaW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIwOTUzKTsKKyAgICAgICAgICAgIAkgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbkV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIGJmPSBORVdfU1RNVF9BU1NJR05fT1AoT1AoQU5EKSwgCisgICAgICAgICAgICAJICAgICAgICAgICAgYmYKKyAgICAgICAgICAgIAkgICAgICAgICAgICAsIGUKKyAgICAgICAgICAgIAkgICAgICAgICAgICApOworICAgICAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAxNToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTk0MTo0OiBMQU5EX0FTU0lHTl9BRlRFUiBlPSBleHByZXNzaW9uCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoTEFORF9BU1NJR05fQUZURVIsICZGT0xMT1dfTEFORF9BU1NJR05fQUZURVJfaW5fZXhwcmVzc2lvbjIwOTYyKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbkV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb24yMDk2Nyk7CisgICAgICAgICAgICAJICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBiZj0gTkVXX1NUTVRfQVNTSUdOX09QX0FGVEVSKE9QKEFORCksIAorICAgICAgICAgICAgCSAgICAgICAgICAgIGJmCisgICAgICAgICAgICAJICAgICAgICAgICAgLCBlCisgICAgICAgICAgICAJICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMTY6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU5NDQ6NDogTE9SX0FTU0lHTiBlPSBleHByZXNzaW9uCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoTE9SX0FTU0lHTiwgJkZPTExPV19MT1JfQVNTSUdOX2luX2V4cHJlc3Npb24yMDk3Nik7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjA5ODEpOworICAgICAgICAgICAgCSAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleHByZXNzaW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgYmY9IE5FV19TVE1UX0FTU0lHTl9PUChPUChPUiksIAorICAgICAgICAgICAgCSAgICAgICAgICAgIGJmCisgICAgICAgICAgICAJICAgICAgICAgICAgLCBlCisgICAgICAgICAgICAJICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMTc6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU5NDc6NDogTE9SX0FTU0lHTl9BRlRFUiBlPSBleHByZXNzaW9uCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoTE9SX0FTU0lHTl9BRlRFUiwgJkZPTExPV19MT1JfQVNTSUdOX0FGVEVSX2luX2V4cHJlc3Npb24yMDk5MCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjA5OTUpOworICAgICAgICAgICAgCSAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleHByZXNzaW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgYmY9IE5FV19TVE1UX0FTU0lHTl9PUF9BRlRFUihPUChPUiksIAorICAgICAgICAgICAgCSAgICAgICAgICAgIGJmCisgICAgICAgICAgICAJICAgICAgICAgICAgLCBlCisgICAgICAgICAgICAJICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMTg6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU5NTA6NDogQkFORF9BU1NJR04gZT0gZXhwcmVzc2lvbgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKEJBTkRfQVNTSUdOLCAmRk9MTE9XX0JBTkRfQVNTSUdOX2luX2V4cHJlc3Npb24yMTAwNCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjEwMDkpOworICAgICAgICAgICAgCSAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleHByZXNzaW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgYmY9IE5FV19TVE1UX0FTU0lHTl9PUChPUChCQU5EKSwgCisgICAgICAgICAgICAJICAgICAgICAgICAgYmYKKyAgICAgICAgICAgIAkgICAgICAgICAgICAsIGUKKyAgICAgICAgICAgIAkgICAgICAgICAgICApOworICAgICAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAxOToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTk1Mzo0OiBCQU5EX0FTU0lHTl9BRlRFUiBlPSBleHByZXNzaW9uCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoQkFORF9BU1NJR05fQUZURVIsICZGT0xMT1dfQkFORF9BU1NJR05fQUZURVJfaW5fZXhwcmVzc2lvbjIxMDE4KTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbkV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb24yMTAyMyk7CisgICAgICAgICAgICAJICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBiZj0gTkVXX1NUTVRfQVNTSUdOX09QX0FGVEVSKE9QKEJBTkQpLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICBiZgorICAgICAgICAgICAgCSAgICAgICAgICAgICwgZQorICAgICAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDIwOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1OTU2OjQ6IEJPUl9BU1NJR04gZT0gZXhwcmVzc2lvbgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKEJPUl9BU1NJR04sICZGT0xMT1dfQk9SX0FTU0lHTl9pbl9leHByZXNzaW9uMjEwMzIpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleHByZXNzaW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIxMDM3KTsKKyAgICAgICAgICAgIAkgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbkV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIGJmPSBORVdfU1RNVF9BU1NJR05fT1AoT1AoQk9SKSwgCisgICAgICAgICAgICAJICAgICAgICAgICAgYmYKKyAgICAgICAgICAgIAkgICAgICAgICAgICAsIGUKKyAgICAgICAgICAgIAkgICAgICAgICAgICApOworICAgICAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAyMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTk1OTo0OiBCT1JfQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChCT1JfQVNTSUdOX0FGVEVSLCAmRk9MTE9XX0JPUl9BU1NJR05fQUZURVJfaW5fZXhwcmVzc2lvbjIxMDQ2KTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbkV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb24yMTA1MSk7CisgICAgICAgICAgICAJICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBiZj0gTkVXX1NUTVRfQVNTSUdOX09QX0FGVEVSKE9QKEJPUiksIAorICAgICAgICAgICAgCSAgICAgICAgICAgIGJmCisgICAgICAgICAgICAJICAgICAgICAgICAgLCBlCisgICAgICAgICAgICAJICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMjI6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU5NjI6NDogQlhPUl9BU1NJR04gZT0gZXhwcmVzc2lvbgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKEJYT1JfQVNTSUdOLCAmRk9MTE9XX0JYT1JfQVNTSUdOX2luX2V4cHJlc3Npb24yMTA2MCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjEwNjUpOworICAgICAgICAgICAgCSAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleHByZXNzaW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgYmY9IE5FV19TVE1UX0FTU0lHTl9PUChPUChCWE9SKSwgCisgICAgICAgICAgICAJICAgICAgICAgICAgYmYKKyAgICAgICAgICAgIAkgICAgICAgICAgICAsIGUKKyAgICAgICAgICAgIAkgICAgICAgICAgICApOworICAgICAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAyMzoKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTk2NTo0OiBCWE9SX0FTU0lHTl9BRlRFUiBlPSBleHByZXNzaW9uCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoQlhPUl9BU1NJR05fQUZURVIsICZGT0xMT1dfQlhPUl9BU1NJR05fQUZURVJfaW5fZXhwcmVzc2lvbjIxMDc0KTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbkV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb24yMTA3OSk7CisgICAgICAgICAgICAJICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBiZj0gTkVXX1NUTVRfQVNTSUdOX09QX0FGVEVSKE9QKEJYT1IpLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICBiZgorICAgICAgICAgICAgCSAgICAgICAgICAgICwgZQorICAgICAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDI0OgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1OTY4OjQ6IExTSElGVF9BU1NJR04gZT0gZXhwcmVzc2lvbgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKExTSElGVF9BU1NJR04sICZGT0xMT1dfTFNISUZUX0FTU0lHTl9pbl9leHByZXNzaW9uMjEwODgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleHByZXNzaW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIxMDkzKTsKKyAgICAgICAgICAgIAkgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbkV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIGJmPSBORVdfU1RNVF9BU1NJR05fT1AoT1AoTFNISUZUKSwgCisgICAgICAgICAgICAJICAgICAgICAgICAgYmYKKyAgICAgICAgICAgIAkgICAgICAgICAgICAsIGUKKyAgICAgICAgICAgIAkgICAgICAgICAgICApOworICAgICAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAyNToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTk3MTo0OiBMU0hJRlRfQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChMU0hJRlRfQVNTSUdOX0FGVEVSLCAmRk9MTE9XX0xTSElGVF9BU1NJR05fQUZURVJfaW5fZXhwcmVzc2lvbjIxMTAyKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbkV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb24yMTEwNyk7CisgICAgICAgICAgICAJICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBiZj0gTkVXX1NUTVRfQVNTSUdOX09QX0FGVEVSKE9QKExTSElGVCksIAorICAgICAgICAgICAgCSAgICAgICAgICAgIGJmCisgICAgICAgICAgICAJICAgICAgICAgICAgLCBlCisgICAgICAgICAgICAJICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMjY6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU5NzQ6NDogUlNISUZUX0FTU0lHTiBlPSBleHByZXNzaW9uCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoUlNISUZUX0FTU0lHTiwgJkZPTExPV19SU0hJRlRfQVNTSUdOX2luX2V4cHJlc3Npb24yMTExNik7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjExMjEpOworICAgICAgICAgICAgCSAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleHByZXNzaW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgYmY9IE5FV19TVE1UX0FTU0lHTl9PUChPUChSU0hJRlQpLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICBiZgorICAgICAgICAgICAgCSAgICAgICAgICAgICwgZQorICAgICAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDI3OgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1OTc3OjQ6IFJTSElGVF9BU1NJR05fQUZURVIgZT0gZXhwcmVzc2lvbgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKFJTSElGVF9BU1NJR05fQUZURVIsICZGT0xMT1dfUlNISUZUX0FTU0lHTl9BRlRFUl9pbl9leHByZXNzaW9uMjExMzApOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleHByZXNzaW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIxMTM1KTsKKyAgICAgICAgICAgIAkgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbkV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIGJmPSBORVdfU1RNVF9BU1NJR05fT1BfQUZURVIoT1AoUlNISUZUKSwgCisgICAgICAgICAgICAJICAgICAgICAgICAgYmYKKyAgICAgICAgICAgIAkgICAgICAgICAgICAsIGUKKyAgICAgICAgICAgIAkgICAgICAgICAgICApOworICAgICAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAyODoKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTk4MDo0OiBPUF9QVVNIIGU9IGV4cHJlc3Npb24KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChPUF9QVVNILCAmRk9MTE9XX09QX1BVU0hfaW5fZXhwcmVzc2lvbjIxMTQ0KTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbkV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX2V4cHJlc3Npb24yMTE0OSk7CisgICAgICAgICAgICAJICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBiZj0gTkVXX0NPREUyKE9QKFBVU0gpLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICBiZgorICAgICAgICAgICAgCSAgICAgICAgICAgICwgZQorICAgICAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDI5OgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1OTgzOjQ6IE9QX0FTU0lHTl9UT1AgZT0gZXhwcmVzc2lvbgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKE9QX0FTU0lHTl9UT1AsICZGT0xMT1dfT1BfQVNTSUdOX1RPUF9pbl9leHByZXNzaW9uMjExNTgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleHByZXNzaW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fZXhwcmVzc2lvbjIxMTYzKTsKKyAgICAgICAgICAgIAkgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXhwcmVzc2lvbkV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIGJmPSBORVdfQ09ERTIoT1AoQVNTSUdOX1RPUCksIAorICAgICAgICAgICAgCSAgICAgICAgICAgIGJmCisgICAgICAgICAgICAJICAgICAgICAgICAgLCBlCisgICAgICAgICAgICAJICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMzA6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU5ODY6NDogT1BfUE9QIGU9IGV4cHJlc3Npb24KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChPUF9QT1AsICZGT0xMT1dfT1BfUE9QX2luX2V4cHJlc3Npb24yMTE3Mik7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9leHByZXNzaW9uMjExNzcpOworICAgICAgICAgICAgCSAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVleHByZXNzaW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgYmY9IE5FV19DT0RFMihPUChQT1ApLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICBiZgorICAgICAgICAgICAgCSAgICAgICAgICAgICwgZQorICAgICAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVleHByZXNzaW9uRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlZXhwcmVzc2lvbkV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMjE2LCBleHByZXNzaW9uX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gYmY7Cit9CisvKiAkQU5UTFIgZW5kIGV4cHJlc3Npb24gKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgY29uZGl0aW9uYWxFeHByZXNzaW9uCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1OTk1OjE6IGNvbmRpdGlvbmFsRXhwcmVzc2lvbiByZXR1cm5zIFsgc2VwOjpCRiBiZiBdIDogZT0gc2NoZWR1bGVFeHByZXNzaW9uICggUVVFU1RJT04gdGg9IGV4cHJlc3Npb24gQ09MT04gZWw9IGV4cHJlc3Npb24gKT8gOworICovCitzdGF0aWMgc2VwOjpCRgorY29uZGl0aW9uYWxFeHByZXNzaW9uKHBmbWxQYXJzZXIgY3R4KQoreworICAgIHNlcDo6QkYgYmY7CisKKyAgICBBTlRMUjNfVUlOVDMyIGNvbmRpdGlvbmFsRXhwcmVzc2lvbl9TdGFydEluZGV4OworCisgICAgc2VwOjpCRiBlOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9lCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9lIHNlcDo6QkYKKworICAgIHNlcDo6QkYgdGg7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX3RoCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV90aCBzZXA6OkJGCisKKyAgICBzZXA6OkJGIGVsOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9lbAorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfZWwgc2VwOjpCRgorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGNvbmRpdGlvbmFsRXhwcmVzc2lvbl9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgyMTcpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIGJmOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTk5NzoyOiAoZT0gc2NoZWR1bGVFeHByZXNzaW9uICggUVVFU1RJT04gdGg9IGV4cHJlc3Npb24gQ09MT04gZWw9IGV4cHJlc3Npb24gKT8gKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1OTk3OjQ6IGU9IHNjaGVkdWxlRXhwcmVzc2lvbiAoIFFVRVNUSU9OIHRoPSBleHByZXNzaW9uIENPTE9OIGVsPSBleHByZXNzaW9uICk/CisgICAgICAgIHsKKyAgICAgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3NjaGVkdWxlRXhwcmVzc2lvbl9pbl9jb25kaXRpb25hbEV4cHJlc3Npb24yMTIwNSk7CisgICAgICAgICAgICBlPXNjaGVkdWxlRXhwcmVzc2lvbihjdHgpOworCisgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlY29uZGl0aW9uYWxFeHByZXNzaW9uRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgYmY9IAorICAgICAgICAgICAgICAgIGUKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU5OTg6NDogKCBRVUVTVElPTiB0aD0gZXhwcmVzc2lvbiBDT0xPTiBlbD0gZXhwcmVzc2lvbiApPworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQ0OTQ9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFFVRVNUSU9OOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgaW50IExBNDk0XzEgPSBMQSgyKTsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgaWYgKCAoc3lucHJlZDk3N19mbWwoY3R4KSkpCisgICAgICAgICAgICAgICAgICAgIAkJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgICAgIGFsdDQ5ND0xOworICAgICAgICAgICAgICAgICAgICAJCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ0OTQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTk5ODo2OiBRVUVTVElPTiB0aD0gZXhwcmVzc2lvbiBDT0xPTiBlbD0gZXhwcmVzc2lvbgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKFFVRVNUSU9OLCAmRk9MTE9XX1FVRVNUSU9OX2luX2NvbmRpdGlvbmFsRXhwcmVzc2lvbjIxMjE1KTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlY29uZGl0aW9uYWxFeHByZXNzaW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fY29uZGl0aW9uYWxFeHByZXNzaW9uMjEyMjApOworICAgICAgICAgICAgCSAgICAgICAgdGg9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlY29uZGl0aW9uYWxFeHByZXNzaW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoQ09MT04sICZGT0xMT1dfQ09MT05faW5fY29uZGl0aW9uYWxFeHByZXNzaW9uMjEyMjMpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVjb25kaXRpb25hbEV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9jb25kaXRpb25hbEV4cHJlc3Npb24yMTIyOCk7CisgICAgICAgICAgICAJICAgICAgICBlbD1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVjb25kaXRpb25hbEV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBiZj0gTkVXX0NPREUzKE9QKElGRSksIAorICAgICAgICAgICAgCSAgICAgICAgICAgIGJmCisgICAgICAgICAgICAJICAgICAgICAgICAgLCB0aAorICAgICAgICAgICAgCSAgICAgICAgICAgICwgZWwKKyAgICAgICAgICAgIAkgICAgICAgICAgICApOworICAgICAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlY29uZGl0aW9uYWxFeHByZXNzaW9uRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlY29uZGl0aW9uYWxFeHByZXNzaW9uRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgyMTcsIGNvbmRpdGlvbmFsRXhwcmVzc2lvbl9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIGJmOworfQorLyogJEFOVExSIGVuZCBjb25kaXRpb25hbEV4cHJlc3Npb24gKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgc2NoZWR1bGVFeHByZXNzaW9uCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MDAzOjE6IHNjaGVkdWxlRXhwcmVzc2lvbiByZXR1cm5zIFsgc2VwOjpCRiBiZiBdIDogZT0gY29uZGl0aW9uYWxPckV4cHJlc3Npb24gKCAob3A9IG9wX3NlcXVlbmNlIHxvcD0gb3Bfc2NoZWR1bGluZyB8b3A9IG9wX2NvbmN1cnJlbmN5ICkgZT0gY29uZGl0aW9uYWxPckV4cHJlc3Npb24gKSogOworICovCitzdGF0aWMgc2VwOjpCRgorc2NoZWR1bGVFeHByZXNzaW9uKHBmbWxQYXJzZXIgY3R4KQoreworICAgIHNlcDo6QkYgYmY7CisKKyAgICBBTlRMUjNfVUlOVDMyIHNjaGVkdWxlRXhwcmVzc2lvbl9TdGFydEluZGV4OworCisgICAgc2VwOjpCRiBlOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9lCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9lIHNlcDo6QkYKKworICAgIHNlcDo6T3BlcmF0b3IgKiBvcDsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfb3AKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX29wIHNlcDo6T3BlcmF0b3IgKgorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIHNjaGVkdWxlRXhwcmVzc2lvbl9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgyMTgpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIGJmOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjAwNToyOiAoZT0gY29uZGl0aW9uYWxPckV4cHJlc3Npb24gKCAob3A9IG9wX3NlcXVlbmNlIHxvcD0gb3Bfc2NoZWR1bGluZyB8b3A9IG9wX2NvbmN1cnJlbmN5ICkgZT0gY29uZGl0aW9uYWxPckV4cHJlc3Npb24gKSogKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MDA1OjQ6IGU9IGNvbmRpdGlvbmFsT3JFeHByZXNzaW9uICggKG9wPSBvcF9zZXF1ZW5jZSB8b3A9IG9wX3NjaGVkdWxpbmcgfG9wPSBvcF9jb25jdXJyZW5jeSApIGU9IGNvbmRpdGlvbmFsT3JFeHByZXNzaW9uICkqCisgICAgICAgIHsKKyAgICAgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2NvbmRpdGlvbmFsT3JFeHByZXNzaW9uX2luX3NjaGVkdWxlRXhwcmVzc2lvbjIxMjU2KTsKKyAgICAgICAgICAgIGU9Y29uZGl0aW9uYWxPckV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXNjaGVkdWxlRXhwcmVzc2lvbkV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIGJmPSAKKyAgICAgICAgICAgICAgICBlCisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MDA2OjQ6ICggKG9wPSBvcF9zZXF1ZW5jZSB8b3A9IG9wX3NjaGVkdWxpbmcgfG9wPSBvcF9jb25jdXJyZW5jeSApIGU9IGNvbmRpdGlvbmFsT3JFeHByZXNzaW9uICkqCisKKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDQ5Nj0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBPUF9BVE9NSUNfU0VRVUVOQ0U6CisgICAgICAgICAgICAgICAgY2FzZSBPUF9DT05DVVJSRU5DWV9BTkQ6CisgICAgICAgICAgICAgICAgY2FzZSBPUF9DT05DVVJSRU5DWV9BU1lOQzoKKyAgICAgICAgICAgICAgICBjYXNlIE9QX0NPTkNVUlJFTkNZX0lOVEVSTEVBVklORzoKKyAgICAgICAgICAgICAgICBjYXNlIE9QX0NPTkNVUlJFTkNZX09SOgorICAgICAgICAgICAgICAgIGNhc2UgT1BfQ09OQ1VSUkVOQ1lfUEFSQUxMRUw6CisgICAgICAgICAgICAgICAgY2FzZSBPUF9DT05DVVJSRU5DWV9SRFZfQU5EOgorICAgICAgICAgICAgICAgIGNhc2UgT1BfQ09OQ1VSUkVOQ1lfUkRWX0FTWU5DOgorICAgICAgICAgICAgICAgIGNhc2UgT1BfQ09OQ1VSUkVOQ1lfUkRWX0lOVEVSTEVBVklORzoKKyAgICAgICAgICAgICAgICBjYXNlIE9QX0NPTkNVUlJFTkNZX1JEVl9PUjoKKyAgICAgICAgICAgICAgICBjYXNlIE9QX0NPTkNVUlJFTkNZX1JEVl9QQVJBTExFTDoKKyAgICAgICAgICAgICAgICBjYXNlIE9QX05PTl9ERVRFUk1JTklTTToKKyAgICAgICAgICAgICAgICBjYXNlIE9QX1NDSEVEVUxFX0FORF9USEVOOgorICAgICAgICAgICAgICAgIGNhc2UgT1BfU0NIRURVTEVfR1Q6CisgICAgICAgICAgICAgICAgY2FzZSBPUF9TQ0hFRFVMRV9MVDoKKyAgICAgICAgICAgICAgICBjYXNlIE9QX1NDSEVEVUxFX09SX0VMU0U6CisgICAgICAgICAgICAgICAgY2FzZSBPUF9TQ0hFRFVMRV9YT1I6CisgICAgICAgICAgICAgICAgY2FzZSBPUF9TRVFVRU5DRToKKyAgICAgICAgICAgICAgICBjYXNlIE9QX1NFUVVFTkNFX1NJREU6CisgICAgICAgICAgICAgICAgY2FzZSBPUF9TRVFVRU5DRV9XRUFLOgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAgICAgCQkgICAvKiBkZmFMb29wYmFja1N0YXRlKGssZWRnZXMsZW90UHJlZGljdHNBbHQsZGVzY3JpcHRpb24sc3RhdGVOdW1iZXIsc2VtUHJlZFN0YXRlKQorICAgICAgICAgICAgICAgIAkJICAgICovCisgICAgICAgICAgICAgICAgCQkgICAgaW50IExBNDk2XzEgPSBMQSgyKTsKKyAgICAgICAgICAgICAgICAJCSAgICBpZiAoIChzeW5wcmVkOTgwX2ZtbChjdHgpKSkKKyAgICAgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAgICAgCQkgICAgICAgIGFsdDQ5Nj0xOworICAgICAgICAgICAgICAgIAkJICAgIH0KKworICAgICAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ0OTYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjAwNjo2OiAob3A9IG9wX3NlcXVlbmNlIHxvcD0gb3Bfc2NoZWR1bGluZyB8b3A9IG9wX2NvbmN1cnJlbmN5ICkgZT0gY29uZGl0aW9uYWxPckV4cHJlc3Npb24KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjAwNjo2OiAob3A9IG9wX3NlcXVlbmNlIHxvcD0gb3Bfc2NoZWR1bGluZyB8b3A9IG9wX2NvbmN1cnJlbmN5ICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0NDk1PTM7CisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIE9QX0FUT01JQ19TRVFVRU5DRToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIE9QX1NFUVVFTkNFOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgT1BfU0VRVUVOQ0VfU0lERToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIE9QX1NFUVVFTkNFX1dFQUs6CisgICAgICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCWFsdDQ5NT0xOworICAgICAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgT1BfTk9OX0RFVEVSTUlOSVNNOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgT1BfU0NIRURVTEVfQU5EX1RIRU46CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBPUF9TQ0hFRFVMRV9HVDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIE9QX1NDSEVEVUxFX0xUOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgT1BfU0NIRURVTEVfT1JfRUxTRToKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIE9QX1NDSEVEVUxFX1hPUjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJYWx0NDk1PTI7CisgICAgICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBPUF9DT05DVVJSRU5DWV9BTkQ6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBPUF9DT05DVVJSRU5DWV9BU1lOQzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIE9QX0NPTkNVUlJFTkNZX0lOVEVSTEVBVklORzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIE9QX0NPTkNVUlJFTkNZX09SOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgT1BfQ09OQ1VSUkVOQ1lfUEFSQUxMRUw6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBPUF9DT05DVVJSRU5DWV9SRFZfQU5EOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgT1BfQ09OQ1VSUkVOQ1lfUkRWX0FTWU5DOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgT1BfQ09OQ1VSUkVOQ1lfUkRWX0lOVEVSTEVBVklORzoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIE9QX0NPTkNVUlJFTkNZX1JEVl9PUjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIE9QX0NPTkNVUlJFTkNZX1JEVl9QQVJBTExFTDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJYWx0NDk1PTM7CisgICAgICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gNDk1OworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVzY2hlZHVsZUV4cHJlc3Npb25FeDsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0NDk1KQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYwMDY6ODogb3A9IG9wX3NlcXVlbmNlCisgICAgICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX29wX3NlcXVlbmNlX2luX3NjaGVkdWxlRXhwcmVzc2lvbjIxMjcwKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIG9wPW9wX3NlcXVlbmNlKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzY2hlZHVsZUV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjAwNjoyNzogb3A9IG9wX3NjaGVkdWxpbmcKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfb3Bfc2NoZWR1bGluZ19pbl9zY2hlZHVsZUV4cHJlc3Npb24yMTI3OCk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBvcD1vcF9zY2hlZHVsaW5nKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzY2hlZHVsZUV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgCWNhc2UgMzoKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjAwNjo0ODogb3A9IG9wX2NvbmN1cnJlbmN5CisgICAgICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX29wX2NvbmN1cnJlbmN5X2luX3NjaGVkdWxlRXhwcmVzc2lvbjIxMjg2KTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIG9wPW9wX2NvbmN1cnJlbmN5KGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzY2hlZHVsZUV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19jb25kaXRpb25hbE9yRXhwcmVzc2lvbl9pbl9zY2hlZHVsZUV4cHJlc3Npb24yMTI5Nyk7CisgICAgICAgICAgICAJICAgICAgICBlPWNvbmRpdGlvbmFsT3JFeHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzY2hlZHVsZUV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBiZj0gTkVXX0NPREVfRkxBVChvcCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgYmYKKyAgICAgICAgICAgIAkgICAgICAgICAgICAsIGUKKyAgICAgICAgICAgIAkgICAgICAgICAgICApOworICAgICAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAgICAgCSAgICBnb3RvIGxvb3A0OTY7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb29wNDk2OiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVzY2hlZHVsZUV4cHJlc3Npb25FeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVzY2hlZHVsZUV4cHJlc3Npb25FeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDIxOCwgc2NoZWR1bGVFeHByZXNzaW9uX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gYmY7Cit9CisvKiAkQU5UTFIgZW5kIHNjaGVkdWxlRXhwcmVzc2lvbiAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBjb25kaXRpb25hbE9yRXhwcmVzc2lvbgorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjAxMToxOiBjb25kaXRpb25hbE9yRXhwcmVzc2lvbiByZXR1cm5zIFsgc2VwOjpCRiBiZiBdIDogZT0gY29uZGl0aW9uYWxBbmRFeHByZXNzaW9uICggTE9SIGU9IGNvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbiApKiA7CisgKi8KK3N0YXRpYyBzZXA6OkJGCitjb25kaXRpb25hbE9yRXhwcmVzc2lvbihwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBzZXA6OkJGIGJmOworCisgICAgQU5UTFIzX1VJTlQzMiBjb25kaXRpb25hbE9yRXhwcmVzc2lvbl9TdGFydEluZGV4OworCisgICAgc2VwOjpCRiBlOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9lCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9lIHNlcDo6QkYKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBjb25kaXRpb25hbE9yRXhwcmVzc2lvbl9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgyMTkpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIGJmOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjAxMzoyOiAoZT0gY29uZGl0aW9uYWxBbmRFeHByZXNzaW9uICggTE9SIGU9IGNvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbiApKiApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYwMTM6NDogZT0gY29uZGl0aW9uYWxBbmRFeHByZXNzaW9uICggTE9SIGU9IGNvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbiApKgorICAgICAgICB7CisgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19jb25kaXRpb25hbEFuZEV4cHJlc3Npb25faW5fY29uZGl0aW9uYWxPckV4cHJlc3Npb24yMTMyMyk7CisgICAgICAgICAgICBlPWNvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbihjdHgpOworCisgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlY29uZGl0aW9uYWxPckV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBiZj0gCisgICAgICAgICAgICAgICAgZQorICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjAxNDo0OiAoIExPUiBlPSBjb25kaXRpb25hbEFuZEV4cHJlc3Npb24gKSoKKworICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0NDk3PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIExPUjoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJeworICAgICAgICAgICAgICAgIAkJICAgLyogZGZhTG9vcGJhY2tTdGF0ZShrLGVkZ2VzLGVvdFByZWRpY3RzQWx0LGRlc2NyaXB0aW9uLHN0YXRlTnVtYmVyLHNlbVByZWRTdGF0ZSkKKyAgICAgICAgICAgICAgICAJCSAgICAqLworICAgICAgICAgICAgICAgIAkJICAgIGludCBMQTQ5N18xID0gTEEoMik7CisgICAgICAgICAgICAgICAgCQkgICAgaWYgKCAoc3lucHJlZDk4MV9mbWwoY3R4KSkpCisgICAgICAgICAgICAgICAgCQkgICAgeworICAgICAgICAgICAgICAgIAkJICAgICAgICBhbHQ0OTc9MTsKKyAgICAgICAgICAgICAgICAJCSAgICB9CisKKyAgICAgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NDk3KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYwMTQ6NjogTE9SIGU9IGNvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKExPUiwgJkZPTExPV19MT1JfaW5fY29uZGl0aW9uYWxPckV4cHJlc3Npb24yMTMzMyk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWNvbmRpdGlvbmFsT3JFeHByZXNzaW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2NvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbl9pbl9jb25kaXRpb25hbE9yRXhwcmVzc2lvbjIxMzM3KTsKKyAgICAgICAgICAgIAkgICAgICAgIGU9Y29uZGl0aW9uYWxBbmRFeHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVjb25kaXRpb25hbE9yRXhwcmVzc2lvbkV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIGJmPSBORVdfQ09ERV9GTEFUKE9QKE9SKSwgCisgICAgICAgICAgICAJICAgICAgICAgICAgYmYKKyAgICAgICAgICAgIAkgICAgICAgICAgICAsIGUKKyAgICAgICAgICAgIAkgICAgICAgICAgICApOworICAgICAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAgICAgCSAgICBnb3RvIGxvb3A0OTc7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb29wNDk3OiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVjb25kaXRpb25hbE9yRXhwcmVzc2lvbkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZWNvbmRpdGlvbmFsT3JFeHByZXNzaW9uRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgyMTksIGNvbmRpdGlvbmFsT3JFeHByZXNzaW9uX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gYmY7Cit9CisvKiAkQU5UTFIgZW5kIGNvbmRpdGlvbmFsT3JFeHByZXNzaW9uICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGNvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbgorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjAxOToxOiBjb25kaXRpb25hbEFuZEV4cHJlc3Npb24gcmV0dXJucyBbIHNlcDo6QkYgYmYgXSA6IGU9IGJpdHdpc2VPckV4cHJlc3Npb24gKCBMQU5EIGU9IGJpdHdpc2VPckV4cHJlc3Npb24gKSogOworICovCitzdGF0aWMgc2VwOjpCRgorY29uZGl0aW9uYWxBbmRFeHByZXNzaW9uKHBmbWxQYXJzZXIgY3R4KQoreworICAgIHNlcDo6QkYgYmY7CisKKyAgICBBTlRMUjNfVUlOVDMyIGNvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbl9TdGFydEluZGV4OworCisgICAgc2VwOjpCRiBlOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9lCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9lIHNlcDo6QkYKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBjb25kaXRpb25hbEFuZEV4cHJlc3Npb25fU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMjIwKSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiBiZjsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYwMjE6MjogKGU9IGJpdHdpc2VPckV4cHJlc3Npb24gKCBMQU5EIGU9IGJpdHdpc2VPckV4cHJlc3Npb24gKSogKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MDIxOjQ6IGU9IGJpdHdpc2VPckV4cHJlc3Npb24gKCBMQU5EIGU9IGJpdHdpc2VPckV4cHJlc3Npb24gKSoKKyAgICAgICAgeworICAgICAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfYml0d2lzZU9yRXhwcmVzc2lvbl9pbl9jb25kaXRpb25hbEFuZEV4cHJlc3Npb24yMTM2NSk7CisgICAgICAgICAgICBlPWJpdHdpc2VPckV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWNvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbkV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIGJmPSAKKyAgICAgICAgICAgICAgICBlCisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MDIyOjQ6ICggTEFORCBlPSBiaXR3aXNlT3JFeHByZXNzaW9uICkqCisKKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDQ5OD0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBMQU5EOgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAgICAgCQkgICAvKiBkZmFMb29wYmFja1N0YXRlKGssZWRnZXMsZW90UHJlZGljdHNBbHQsZGVzY3JpcHRpb24sc3RhdGVOdW1iZXIsc2VtUHJlZFN0YXRlKQorICAgICAgICAgICAgICAgIAkJICAgICovCisgICAgICAgICAgICAgICAgCQkgICAgaW50IExBNDk4XzEgPSBMQSgyKTsKKyAgICAgICAgICAgICAgICAJCSAgICBpZiAoIChzeW5wcmVkOTgyX2ZtbChjdHgpKSkKKyAgICAgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAgICAgCQkgICAgICAgIGFsdDQ5OD0xOworICAgICAgICAgICAgICAgIAkJICAgIH0KKworICAgICAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ0OTgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjAyMjo2OiBMQU5EIGU9IGJpdHdpc2VPckV4cHJlc3Npb24KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChMQU5ELCAmRk9MTE9XX0xBTkRfaW5fY29uZGl0aW9uYWxBbmRFeHByZXNzaW9uMjEzNzUpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVjb25kaXRpb25hbEFuZEV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfYml0d2lzZU9yRXhwcmVzc2lvbl9pbl9jb25kaXRpb25hbEFuZEV4cHJlc3Npb24yMTM3OSk7CisgICAgICAgICAgICAJICAgICAgICBlPWJpdHdpc2VPckV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWNvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbkV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIGJmPSBORVdfQ09ERV9GTEFUKE9QKEFORCksIAorICAgICAgICAgICAgCSAgICAgICAgICAgIGJmCisgICAgICAgICAgICAJICAgICAgICAgICAgLCBlCisgICAgICAgICAgICAJICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdDoKKyAgICAgICAgICAgIAkgICAgZ290byBsb29wNDk4OwkvKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgKi8KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9vcDQ5ODogOyAvKiBKdW1wIG91dCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworCisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlY29uZGl0aW9uYWxBbmRFeHByZXNzaW9uRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlY29uZGl0aW9uYWxBbmRFeHByZXNzaW9uRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgyMjAsIGNvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbl9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIGJmOworfQorLyogJEFOVExSIGVuZCBjb25kaXRpb25hbEFuZEV4cHJlc3Npb24gKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgYml0d2lzZU9yRXhwcmVzc2lvbgorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjAyNzoxOiBiaXR3aXNlT3JFeHByZXNzaW9uIHJldHVybnMgWyBzZXA6OkJGIGJmIF0gOiBlPSBiaXR3aXNlWG9yRXhwcmVzc2lvbiAoIEJPUiBlPSBiaXR3aXNlWG9yRXhwcmVzc2lvbiApKiA7CisgKi8KK3N0YXRpYyBzZXA6OkJGCitiaXR3aXNlT3JFeHByZXNzaW9uKHBmbWxQYXJzZXIgY3R4KQoreworICAgIHNlcDo6QkYgYmY7CisKKyAgICBBTlRMUjNfVUlOVDMyIGJpdHdpc2VPckV4cHJlc3Npb25fU3RhcnRJbmRleDsKKworICAgIHNlcDo6QkYgZTsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfZQorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfZSBzZXA6OkJGCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgYml0d2lzZU9yRXhwcmVzc2lvbl9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgyMjEpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIGJmOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjAyOToyOiAoZT0gYml0d2lzZVhvckV4cHJlc3Npb24gKCBCT1IgZT0gYml0d2lzZVhvckV4cHJlc3Npb24gKSogKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MDI5OjQ6IGU9IGJpdHdpc2VYb3JFeHByZXNzaW9uICggQk9SIGU9IGJpdHdpc2VYb3JFeHByZXNzaW9uICkqCisgICAgICAgIHsKKyAgICAgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2JpdHdpc2VYb3JFeHByZXNzaW9uX2luX2JpdHdpc2VPckV4cHJlc3Npb24yMTQwNyk7CisgICAgICAgICAgICBlPWJpdHdpc2VYb3JFeHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGViaXR3aXNlT3JFeHByZXNzaW9uRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgYmY9IAorICAgICAgICAgICAgICAgIGUKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYwMzA6NDogKCBCT1IgZT0gYml0d2lzZVhvckV4cHJlc3Npb24gKSoKKworICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0NDk5PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJPUjoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJeworICAgICAgICAgICAgICAgIAkJICAgLyogZGZhTG9vcGJhY2tTdGF0ZShrLGVkZ2VzLGVvdFByZWRpY3RzQWx0LGRlc2NyaXB0aW9uLHN0YXRlTnVtYmVyLHNlbVByZWRTdGF0ZSkKKyAgICAgICAgICAgICAgICAJCSAgICAqLworICAgICAgICAgICAgICAgIAkJICAgIGludCBMQTQ5OV8xID0gTEEoMik7CisgICAgICAgICAgICAgICAgCQkgICAgaWYgKCAoc3lucHJlZDk4M19mbWwoY3R4KSkpCisgICAgICAgICAgICAgICAgCQkgICAgeworICAgICAgICAgICAgICAgIAkJICAgICAgICBhbHQ0OTk9MTsKKyAgICAgICAgICAgICAgICAJCSAgICB9CisKKyAgICAgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NDk5KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYwMzA6NjogQk9SIGU9IGJpdHdpc2VYb3JFeHByZXNzaW9uCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICBNQVRDSFQoQk9SLCAmRk9MTE9XX0JPUl9pbl9iaXR3aXNlT3JFeHByZXNzaW9uMjE0MTcpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGViaXR3aXNlT3JFeHByZXNzaW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2JpdHdpc2VYb3JFeHByZXNzaW9uX2luX2JpdHdpc2VPckV4cHJlc3Npb24yMTQyMSk7CisgICAgICAgICAgICAJICAgICAgICBlPWJpdHdpc2VYb3JFeHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGViaXR3aXNlT3JFeHByZXNzaW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgYmY9IE5FV19DT0RFX0ZMQVQoT1AoQk9SKSwgCisgICAgICAgICAgICAJICAgICAgICAgICAgYmYKKyAgICAgICAgICAgIAkgICAgICAgICAgICAsIGUKKyAgICAgICAgICAgIAkgICAgICAgICAgICApOworICAgICAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAgICAgCSAgICBnb3RvIGxvb3A0OTk7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb29wNDk5OiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGViaXR3aXNlT3JFeHByZXNzaW9uRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlYml0d2lzZU9yRXhwcmVzc2lvbkV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMjIxLCBiaXR3aXNlT3JFeHByZXNzaW9uX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gYmY7Cit9CisvKiAkQU5UTFIgZW5kIGJpdHdpc2VPckV4cHJlc3Npb24gKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgYml0d2lzZVhvckV4cHJlc3Npb24KKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYwMzU6MTogYml0d2lzZVhvckV4cHJlc3Npb24gcmV0dXJucyBbIHNlcDo6QkYgYmYgXSA6IGU9IGJpdHdpc2VBbmRFeHByZXNzaW9uICggQlhPUiBlPSBiaXR3aXNlQW5kRXhwcmVzc2lvbiApKiA7CisgKi8KK3N0YXRpYyBzZXA6OkJGCitiaXR3aXNlWG9yRXhwcmVzc2lvbihwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBzZXA6OkJGIGJmOworCisgICAgQU5UTFIzX1VJTlQzMiBiaXR3aXNlWG9yRXhwcmVzc2lvbl9TdGFydEluZGV4OworCisgICAgc2VwOjpCRiBlOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9lCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9lIHNlcDo6QkYKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBiaXR3aXNlWG9yRXhwcmVzc2lvbl9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgyMjIpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIGJmOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjAzNzoyOiAoZT0gYml0d2lzZUFuZEV4cHJlc3Npb24gKCBCWE9SIGU9IGJpdHdpc2VBbmRFeHByZXNzaW9uICkqICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjAzNzo0OiBlPSBiaXR3aXNlQW5kRXhwcmVzc2lvbiAoIEJYT1IgZT0gYml0d2lzZUFuZEV4cHJlc3Npb24gKSoKKyAgICAgICAgeworICAgICAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfYml0d2lzZUFuZEV4cHJlc3Npb25faW5fYml0d2lzZVhvckV4cHJlc3Npb24yMTQ0OSk7CisgICAgICAgICAgICBlPWJpdHdpc2VBbmRFeHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGViaXR3aXNlWG9yRXhwcmVzc2lvbkV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIGJmPSAKKyAgICAgICAgICAgICAgICBlCisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MDM4OjQ6ICggQlhPUiBlPSBiaXR3aXNlQW5kRXhwcmVzc2lvbiApKgorCisgICAgICAgICAgICBmb3IgKDs7KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQ1MDA9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQlhPUjoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJeworICAgICAgICAgICAgICAgIAkJICAgLyogZGZhTG9vcGJhY2tTdGF0ZShrLGVkZ2VzLGVvdFByZWRpY3RzQWx0LGRlc2NyaXB0aW9uLHN0YXRlTnVtYmVyLHNlbVByZWRTdGF0ZSkKKyAgICAgICAgICAgICAgICAJCSAgICAqLworICAgICAgICAgICAgICAgIAkJICAgIGludCBMQTUwMF8xID0gTEEoMik7CisgICAgICAgICAgICAgICAgCQkgICAgaWYgKCAoc3lucHJlZDk4NF9mbWwoY3R4KSkpCisgICAgICAgICAgICAgICAgCQkgICAgeworICAgICAgICAgICAgICAgIAkJICAgICAgICBhbHQ1MDA9MTsKKyAgICAgICAgICAgICAgICAJCSAgICB9CisKKyAgICAgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NTAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYwMzg6NjogQlhPUiBlPSBiaXR3aXNlQW5kRXhwcmVzc2lvbgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgTUFUQ0hUKEJYT1IsICZGT0xMT1dfQlhPUl9pbl9iaXR3aXNlWG9yRXhwcmVzc2lvbjIxNDU5KTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlYml0d2lzZVhvckV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfYml0d2lzZUFuZEV4cHJlc3Npb25faW5fYml0d2lzZVhvckV4cHJlc3Npb24yMTQ2Myk7CisgICAgICAgICAgICAJICAgICAgICBlPWJpdHdpc2VBbmRFeHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGViaXR3aXNlWG9yRXhwcmVzc2lvbkV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIGJmPSBORVdfQ09ERV9GTEFUKE9QKEJYT1IpLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICBiZgorICAgICAgICAgICAgCSAgICAgICAgICAgICwgZQorICAgICAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQ6CisgICAgICAgICAgICAJICAgIGdvdG8gbG9vcDUwMDsJLyogYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvb3A1MDA6IDsgLyogSnVtcCBvdXQgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKworCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZWJpdHdpc2VYb3JFeHByZXNzaW9uRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlYml0d2lzZVhvckV4cHJlc3Npb25FeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDIyMiwgYml0d2lzZVhvckV4cHJlc3Npb25fU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiBiZjsKK30KKy8qICRBTlRMUiBlbmQgYml0d2lzZVhvckV4cHJlc3Npb24gKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgYml0d2lzZUFuZEV4cHJlc3Npb24KKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYwNDM6MTogYml0d2lzZUFuZEV4cHJlc3Npb24gcmV0dXJucyBbIHNlcDo6QkYgYmYgXSA6IGU9IGVxdWFsaXR5RXhwcmVzc2lvbiAoIEJBTkQgZT0gZXF1YWxpdHlFeHByZXNzaW9uICkqIDsKKyAqLworc3RhdGljIHNlcDo6QkYKK2JpdHdpc2VBbmRFeHByZXNzaW9uKHBmbWxQYXJzZXIgY3R4KQoreworICAgIHNlcDo6QkYgYmY7CisKKyAgICBBTlRMUjNfVUlOVDMyIGJpdHdpc2VBbmRFeHByZXNzaW9uX1N0YXJ0SW5kZXg7CisKKyAgICBzZXA6OkJGIGU7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2UKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGJpdHdpc2VBbmRFeHByZXNzaW9uX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDIyMykpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gYmY7CisgICAgfQorCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MDQ1OjI6IChlPSBlcXVhbGl0eUV4cHJlc3Npb24gKCBCQU5EIGU9IGVxdWFsaXR5RXhwcmVzc2lvbiApKiApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYwNDU6NDogZT0gZXF1YWxpdHlFeHByZXNzaW9uICggQkFORCBlPSBlcXVhbGl0eUV4cHJlc3Npb24gKSoKKyAgICAgICAgeworICAgICAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXF1YWxpdHlFeHByZXNzaW9uX2luX2JpdHdpc2VBbmRFeHByZXNzaW9uMjE0OTEpOworICAgICAgICAgICAgZT1lcXVhbGl0eUV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWJpdHdpc2VBbmRFeHByZXNzaW9uRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgYmY9IAorICAgICAgICAgICAgICAgIGUKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYwNDY6NDogKCBCQU5EIGU9IGVxdWFsaXR5RXhwcmVzc2lvbiApKgorCisgICAgICAgICAgICBmb3IgKDs7KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhbHQ1MDE9MjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkFORDoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJeworICAgICAgICAgICAgICAgIAkJICAgLyogZGZhTG9vcGJhY2tTdGF0ZShrLGVkZ2VzLGVvdFByZWRpY3RzQWx0LGRlc2NyaXB0aW9uLHN0YXRlTnVtYmVyLHNlbVByZWRTdGF0ZSkKKyAgICAgICAgICAgICAgICAJCSAgICAqLworICAgICAgICAgICAgICAgIAkJICAgIGludCBMQTUwMV8xID0gTEEoMik7CisgICAgICAgICAgICAgICAgCQkgICAgaWYgKCAoc3lucHJlZDk4NV9mbWwoY3R4KSkpCisgICAgICAgICAgICAgICAgCQkgICAgeworICAgICAgICAgICAgICAgIAkJICAgICAgICBhbHQ1MDE9MTsKKyAgICAgICAgICAgICAgICAJCSAgICB9CisKKyAgICAgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NTAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYwNDY6NjogQkFORCBlPSBlcXVhbGl0eUV4cHJlc3Npb24KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChCQU5ELCAmRk9MTE9XX0JBTkRfaW5fYml0d2lzZUFuZEV4cHJlc3Npb24yMTUwMSk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWJpdHdpc2VBbmRFeHByZXNzaW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2VxdWFsaXR5RXhwcmVzc2lvbl9pbl9iaXR3aXNlQW5kRXhwcmVzc2lvbjIxNTA1KTsKKyAgICAgICAgICAgIAkgICAgICAgIGU9ZXF1YWxpdHlFeHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGViaXR3aXNlQW5kRXhwcmVzc2lvbkV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIGJmPSBORVdfQ09ERV9GTEFUKE9QKEJBTkQpLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICBiZgorICAgICAgICAgICAgCSAgICAgICAgICAgICwgZQorICAgICAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQ6CisgICAgICAgICAgICAJICAgIGdvdG8gbG9vcDUwMTsJLyogYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvb3A1MDE6IDsgLyogSnVtcCBvdXQgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKworCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZWJpdHdpc2VBbmRFeHByZXNzaW9uRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlYml0d2lzZUFuZEV4cHJlc3Npb25FeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDIyMywgYml0d2lzZUFuZEV4cHJlc3Npb25fU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiBiZjsKK30KKy8qICRBTlRMUiBlbmQgYml0d2lzZUFuZEV4cHJlc3Npb24gKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgZXF1YWxpdHlFeHByZXNzaW9uCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MDUxOjE6IGVxdWFsaXR5RXhwcmVzc2lvbiByZXR1cm5zIFsgc2VwOjpCRiBiZiBdIDogZT0gcmVsYXRpb25hbEV4cHJlc3Npb24gKG9wPSBlcXVhbE9wIGU9IHJlbGF0aW9uYWxFeHByZXNzaW9uIChvcD0gZXF1YWxPcCBlPSByZWxhdGlvbmFsRXhwcmVzc2lvbiApKiApPyA7CisgKi8KK3N0YXRpYyBzZXA6OkJGCitlcXVhbGl0eUV4cHJlc3Npb24ocGZtbFBhcnNlciBjdHgpCit7CisgICAgc2VwOjpCRiBiZjsKKworICAgIEFOVExSM19VSU5UMzIgZXF1YWxpdHlFeHByZXNzaW9uX1N0YXJ0SW5kZXg7CisKKyAgICBzZXA6OkJGIGU7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2UKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisgICAgc2VwOjpPcGVyYXRvciAqIG9wOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9vcAorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfb3Agc2VwOjpPcGVyYXRvciAqCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgZXF1YWxpdHlFeHByZXNzaW9uX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKworICAgIAlzZXA6OkJGQ29kZSBlcUV4cHI7CisgICAgCXNlcDo6QkYgcmhzOworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgyMjQpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIGJmOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjA1NzoyOiAoZT0gcmVsYXRpb25hbEV4cHJlc3Npb24gKG9wPSBlcXVhbE9wIGU9IHJlbGF0aW9uYWxFeHByZXNzaW9uIChvcD0gZXF1YWxPcCBlPSByZWxhdGlvbmFsRXhwcmVzc2lvbiApKiApPyApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYwNTc6NDogZT0gcmVsYXRpb25hbEV4cHJlc3Npb24gKG9wPSBlcXVhbE9wIGU9IHJlbGF0aW9uYWxFeHByZXNzaW9uIChvcD0gZXF1YWxPcCBlPSByZWxhdGlvbmFsRXhwcmVzc2lvbiApKiApPworICAgICAgICB7CisgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19yZWxhdGlvbmFsRXhwcmVzc2lvbl9pbl9lcXVhbGl0eUV4cHJlc3Npb24yMTUzNyk7CisgICAgICAgICAgICBlPXJlbGF0aW9uYWxFeHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVlcXVhbGl0eUV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBiZj0gCisgICAgICAgICAgICAgICAgZQorICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjA1ODo0OiAob3A9IGVxdWFsT3AgZT0gcmVsYXRpb25hbEV4cHJlc3Npb24gKG9wPSBlcXVhbE9wIGU9IHJlbGF0aW9uYWxFeHByZXNzaW9uICkqICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDUwMz0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRVFVQUw6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTkVRVUFMOgorICAgICAgICAgICAgICAgICAgICBjYXNlIE5TRVFVQUw6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU0VRVUFMOgorICAgICAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgaW50IExBNTAzXzEgPSBMQSgyKTsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgaWYgKCAoc3lucHJlZDk4N19mbWwoY3R4KSkpCisgICAgICAgICAgICAgICAgICAgIAkJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgICAgIGFsdDUwMz0xOworICAgICAgICAgICAgICAgICAgICAJCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ1MDMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjA1ODo2OiBvcD0gZXF1YWxPcCBlPSByZWxhdGlvbmFsRXhwcmVzc2lvbiAob3A9IGVxdWFsT3AgZT0gcmVsYXRpb25hbEV4cHJlc3Npb24gKSoKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXF1YWxPcF9pbl9lcXVhbGl0eUV4cHJlc3Npb24yMTU0OSk7CisgICAgICAgICAgICAJICAgICAgICBvcD1lcXVhbE9wKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVlcXVhbGl0eUV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfcmVsYXRpb25hbEV4cHJlc3Npb25faW5fZXF1YWxpdHlFeHByZXNzaW9uMjE1NTMpOworICAgICAgICAgICAgCSAgICAgICAgZT1yZWxhdGlvbmFsRXhwcmVzc2lvbihjdHgpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXF1YWxpdHlFeHByZXNzaW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgZXFFeHByID0gTkVXX0NPREUyKG9wLCBiZgorICAgICAgICAgICAgCSAgICAgICAgICAgICwgZQorICAgICAgICAgICAgCSAgICAgICAgICAgICk7IAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYwNjA6NjogKG9wPSBlcXVhbE9wIGU9IHJlbGF0aW9uYWxFeHByZXNzaW9uICkqCisKKyAgICAgICAgICAgIAkgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDUwMj0yOworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBFUVVBTDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIE5FUVVBTDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIE5TRVFVQUw6CisgICAgICAgICAgICAJICAgICAgICAgICAgY2FzZSBTRVFVQUw6CisgICAgICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCSAgIC8qIGRmYUxvb3BiYWNrU3RhdGUoayxlZGdlcyxlb3RQcmVkaWN0c0FsdCxkZXNjcmlwdGlvbixzdGF0ZU51bWJlcixzZW1QcmVkU3RhdGUpCisgICAgICAgICAgICAJICAgICAgICAgICAgCQkgICAgKi8KKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCSAgICBpbnQgTEE1MDJfMSA9IExBKDIpOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgIGlmICggKHN5bnByZWQ5ODZfZm1sKGN0eCkpKQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCSAgICAgICAgYWx0NTAyPTE7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQkgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDUwMikKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MDYwOjg6IG9wPSBlcXVhbE9wIGU9IHJlbGF0aW9uYWxFeHByZXNzaW9uCisgICAgICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2VxdWFsT3BfaW5fZXF1YWxpdHlFeHByZXNzaW9uMjE1NjkpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgb3A9ZXF1YWxPcChjdHgpOworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXF1YWxpdHlFeHByZXNzaW9uRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3JlbGF0aW9uYWxFeHByZXNzaW9uX2luX2VxdWFsaXR5RXhwcmVzc2lvbjIxNTczKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGU9cmVsYXRpb25hbEV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWVxdWFsaXR5RXhwcmVzc2lvbkV4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgIAkvKmlmKCBlcUV4cHIuZ2V0T3BlcmF0b3IoKSA9PSBvcCApCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAJeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgCQllcUV4cHIuYXBwZW5kKCBlCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgCWVsc2UqLyBpZiggZXFFeHByLmdldE9wZXJhdG9yKCkgPT0gT1AoQU5EKSApCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAJeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgCQllcUV4cHIuYXBwZW5kKCBORVdfQ09ERTIob3AsIHJocywgZQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICkgKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAJZWxzZQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgIAkJZXFFeHByID0gTkVXX0NPREUyKE9QKEFORCksIGVxRXhwciwgTkVXX0NPREUyKG9wLCByaHMsIGUKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICApKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgIAl9CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgIAlyaHMgPSBlCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAJZGVmYXVsdDoKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgZ290byBsb29wNTAyOwkvKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgKi8KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgbG9vcDUwMjogOyAvKiBKdW1wIG91dCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgYmY9IGVxRXhwcjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZWVxdWFsaXR5RXhwcmVzc2lvbkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZWVxdWFsaXR5RXhwcmVzc2lvbkV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMjI0LCBlcXVhbGl0eUV4cHJlc3Npb25fU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiBiZjsKK30KKy8qICRBTlRMUiBlbmQgZXF1YWxpdHlFeHByZXNzaW9uICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGVxdWFsT3AKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYwODI6MTogZXF1YWxPcCByZXR1cm5zIFsgc2VwOjpPcGVyYXRvciAqIG9wIF0gOiAoIEVRVUFMIHwgTkVRVUFMIHwgU0VRVUFMIHwgTlNFUVVBTCApOworICovCitzdGF0aWMgc2VwOjpPcGVyYXRvciAqCitlcXVhbE9wKHBmbWxQYXJzZXIgY3R4KQoreworICAgIHNlcDo6T3BlcmF0b3IgKiBvcDsKKworICAgIEFOVExSM19VSU5UMzIgZXF1YWxPcF9TdGFydEluZGV4OworCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGVxdWFsT3BfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMjI1KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiBvcDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vICAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MDg0OjI6ICggRVFVQUwgfCBORVFVQUwgfCBTRVFVQUwgfCBOU0VRVUFMICkKKworICAgICAgICAgICAgQU5UTFIzX1VJTlQzMiBhbHQ1MDQ7CisKKyAgICAgICAgICAgIGFsdDUwND00OworCisgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEVRVUFMOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NTA0PTE7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBORVFVQUw6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ1MDQ9MjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNFUVVBTDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDUwND0zOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTlNFUVVBTDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDUwND00OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDUwNDsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWVxdWFsT3BFeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDUwNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MDg0OjQ6IEVRVUFMCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKEVRVUFMLCAmRk9MTE9XX0VRVUFMX2luX2VxdWFsT3AyMTYxNCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWVxdWFsT3BFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBvcDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgb3AgPSBPUChFUSk7ICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAyOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYwODU6NDogTkVRVUFMCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKE5FUVVBTCwgJkZPTExPV19ORVFVQUxfaW5fZXF1YWxPcDIxNjIzKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlZXF1YWxPcEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG9wOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBvcCA9IE9QKE5FUSk7ICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDM6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjA4Njo0OiBTRVFVQUwKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoU0VRVUFMLCAmRk9MTE9XX1NFUVVBTF9pbl9lcXVhbE9wMjE2MzEpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVlcXVhbE9wRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG9wID0gT1AoU0VRKTsgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgNDoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MDg3OjQ6IE5TRVFVQUwKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoTlNFUVVBTCwgJkZPTExPV19OU0VRVUFMX2luX2VxdWFsT3AyMTYzOSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWVxdWFsT3BFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBvcDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgb3AgPSBPUChOU0VRKTsgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVlcXVhbE9wRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlZXF1YWxPcEV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMjI1LCBlcXVhbE9wX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gb3A7Cit9CisvKiAkQU5UTFIgZW5kIGVxdWFsT3AgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgcmVsYXRpb25hbEV4cHJlc3Npb24KKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYwOTE6MTogcmVsYXRpb25hbEV4cHJlc3Npb24gcmV0dXJucyBbIHNlcDo6QkYgYmYgXSA6IGU9IHNoaWZ0RXhwcmVzc2lvbiAob3A9IHJlbGF0aW9uYWxPcCBlPSBzaGlmdEV4cHJlc3Npb24gKG9wPSByZWxhdGlvbmFsT3AgZT0gc2hpZnRFeHByZXNzaW9uICkqICk/IDsKKyAqLworc3RhdGljIHNlcDo6QkYKK3JlbGF0aW9uYWxFeHByZXNzaW9uKHBmbWxQYXJzZXIgY3R4KQoreworICAgIHNlcDo6QkYgYmY7CisKKyAgICBBTlRMUjNfVUlOVDMyIHJlbGF0aW9uYWxFeHByZXNzaW9uX1N0YXJ0SW5kZXg7CisKKyAgICBzZXA6OkJGIGU7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2UKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisgICAgc2VwOjpPcGVyYXRvciAqIG9wOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9vcAorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfb3Agc2VwOjpPcGVyYXRvciAqCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgcmVsYXRpb25hbEV4cHJlc3Npb25fU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworCisgICAgCXNlcDo6QkZDb2RlIHJlbEV4cHI7CisgICAgCXNlcDo6QkYgcmhzOworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgyMjYpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIGJmOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjA5NzoyOiAoZT0gc2hpZnRFeHByZXNzaW9uIChvcD0gcmVsYXRpb25hbE9wIGU9IHNoaWZ0RXhwcmVzc2lvbiAob3A9IHJlbGF0aW9uYWxPcCBlPSBzaGlmdEV4cHJlc3Npb24gKSogKT8gKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MDk3OjQ6IGU9IHNoaWZ0RXhwcmVzc2lvbiAob3A9IHJlbGF0aW9uYWxPcCBlPSBzaGlmdEV4cHJlc3Npb24gKG9wPSByZWxhdGlvbmFsT3AgZT0gc2hpZnRFeHByZXNzaW9uICkqICk/CisgICAgICAgIHsKKyAgICAgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3NoaWZ0RXhwcmVzc2lvbl9pbl9yZWxhdGlvbmFsRXhwcmVzc2lvbjIxNjYzKTsKKyAgICAgICAgICAgIGU9c2hpZnRFeHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVyZWxhdGlvbmFsRXhwcmVzc2lvbkV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIGJmPSAKKyAgICAgICAgICAgICAgICBlCisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MDk4OjQ6IChvcD0gcmVsYXRpb25hbE9wIGU9IHNoaWZ0RXhwcmVzc2lvbiAob3A9IHJlbGF0aW9uYWxPcCBlPSBzaGlmdEV4cHJlc3Npb24gKSogKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0NTA2PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBHVDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBHVEU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTFRFOgorICAgICAgICAgICAgICAgICAgICBjYXNlIExUXzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOTU6CisgICAgICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgICAgIAkJeworICAgICAgICAgICAgICAgICAgICAJCSAgICBpbnQgTEE1MDZfMSA9IExBKDIpOworICAgICAgICAgICAgICAgICAgICAJCSAgICBpZiAoIChzeW5wcmVkOTkyX2ZtbChjdHgpKSkKKyAgICAgICAgICAgICAgICAgICAgCQkgICAgeworICAgICAgICAgICAgICAgICAgICAJCSAgICAgICAgYWx0NTA2PTE7CisgICAgICAgICAgICAgICAgICAgIAkJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDUwNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MDk4OjY6IG9wPSByZWxhdGlvbmFsT3AgZT0gc2hpZnRFeHByZXNzaW9uIChvcD0gcmVsYXRpb25hbE9wIGU9IHNoaWZ0RXhwcmVzc2lvbiApKgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19yZWxhdGlvbmFsT3BfaW5fcmVsYXRpb25hbEV4cHJlc3Npb24yMTY3NSk7CisgICAgICAgICAgICAJICAgICAgICBvcD1yZWxhdGlvbmFsT3AoY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXJlbGF0aW9uYWxFeHByZXNzaW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3NoaWZ0RXhwcmVzc2lvbl9pbl9yZWxhdGlvbmFsRXhwcmVzc2lvbjIxNjc5KTsKKyAgICAgICAgICAgIAkgICAgICAgIGU9c2hpZnRFeHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVyZWxhdGlvbmFsRXhwcmVzc2lvbkV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIHJlbEV4cHIgPSBORVdfQ09ERTIob3AsIGJmCisgICAgICAgICAgICAJICAgICAgICAgICAgLCByaHMgPSBlCisgICAgICAgICAgICAJICAgICAgICAgICAgKTsgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjEwMDo2OiAob3A9IHJlbGF0aW9uYWxPcCBlPSBzaGlmdEV4cHJlc3Npb24gKSoKKworICAgICAgICAgICAgCSAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0NTA1PTI7CisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIEdUOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgR1RFOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgTFRFOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgTFRfOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjk1OgorICAgICAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQkgICAvKiBkZmFMb29wYmFja1N0YXRlKGssZWRnZXMsZW90UHJlZGljdHNBbHQsZGVzY3JpcHRpb24sc3RhdGVOdW1iZXIsc2VtUHJlZFN0YXRlKQorICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgICovCisgICAgICAgICAgICAJICAgICAgICAgICAgCQkgICAgaW50IExBNTA1XzEgPSBMQSgyKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCSAgICBpZiAoIChzeW5wcmVkOTkxX2ZtbChjdHgpKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQkgICAgICAgIGFsdDUwNT0xOworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQ1MDUpCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjEwMDo4OiBvcD0gcmVsYXRpb25hbE9wIGU9IHNoaWZ0RXhwcmVzc2lvbgorICAgICAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19yZWxhdGlvbmFsT3BfaW5fcmVsYXRpb25hbEV4cHJlc3Npb24yMTY5NSk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBvcD1yZWxhdGlvbmFsT3AoY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXJlbGF0aW9uYWxFeHByZXNzaW9uRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3NoaWZ0RXhwcmVzc2lvbl9pbl9yZWxhdGlvbmFsRXhwcmVzc2lvbjIxNjk5KTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGU9c2hpZnRFeHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVyZWxhdGlvbmFsRXhwcmVzc2lvbkV4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgIAkvKmlmKCByZWxFeHByLmdldE9wZXJhdG9yKCkgPT0gb3AgKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgIAkJcmVsRXhwci5hcHBlbmQoIGUKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAJZWxzZSovIGlmKCByZWxFeHByLmdldE9wZXJhdG9yKCkgPT0gT1AoQU5EKSApCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAJeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgCQlyZWxFeHByLmFwcGVuZCggTkVXX0NPREUyKG9wLCByaHMsIGUKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICApICk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgCWVsc2UKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAJCXJlbEV4cHIgPSBORVdfQ09ERTIoT1AoQU5EKSwgcmVsRXhwciwgTkVXX0NPREUyKG9wLCByaHMsIGUKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICApKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgIAl9CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgIAlyaHMgPSBlCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAJZGVmYXVsdDoKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgZ290byBsb29wNTA1OwkvKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgKi8KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgbG9vcDUwNTogOyAvKiBKdW1wIG91dCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgYmY9IHJlbEV4cHI7CisgICAgICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVyZWxhdGlvbmFsRXhwcmVzc2lvbkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZXJlbGF0aW9uYWxFeHByZXNzaW9uRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgyMjYsIHJlbGF0aW9uYWxFeHByZXNzaW9uX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gYmY7Cit9CisvKiAkQU5UTFIgZW5kIHJlbGF0aW9uYWxFeHByZXNzaW9uICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IHJlbGF0aW9uYWxPcAorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjEyMjoxOiByZWxhdGlvbmFsT3AgcmV0dXJucyBbIHNlcDo6T3BlcmF0b3IgKiBvcCBdIDogKCBMVEUgfCBHVEUgfCBMVF8gfCBHVCB8ICdpbicgKTsKKyAqLworc3RhdGljIHNlcDo6T3BlcmF0b3IgKgorcmVsYXRpb25hbE9wKHBmbWxQYXJzZXIgY3R4KQoreworICAgIHNlcDo6T3BlcmF0b3IgKiBvcDsKKworICAgIEFOVExSM19VSU5UMzIgcmVsYXRpb25hbE9wX1N0YXJ0SW5kZXg7CisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgcmVsYXRpb25hbE9wX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDIyNykpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gb3A7CisgICAgfQorCisgICAgeworICAgICAgICB7CisgICAgICAgICAgICAvLyAgL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjEyNDoyOiAoIExURSB8IEdURSB8IExUXyB8IEdUIHwgJ2luJyApCisKKyAgICAgICAgICAgIEFOVExSM19VSU5UMzIgYWx0NTA3OworCisgICAgICAgICAgICBhbHQ1MDc9NTsKKworICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBMVEU6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ1MDc9MTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEdURToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDUwNz0yOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTFRfOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NTA3PTM7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBHVDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDUwNz00OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjk1OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NTA3PTU7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gNTA3OworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgZ290byBydWxlcmVsYXRpb25hbE9wRXg7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQ1MDcpCisgICAgICAgICAgICB7CisgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjEyNDo0OiBMVEUKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoTFRFLCAmRk9MTE9XX0xURV9pbl9yZWxhdGlvbmFsT3AyMTc0MCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXJlbGF0aW9uYWxPcEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG9wOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBvcD0gT1AoTFRFKTsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDI6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjEyNTo0OiBHVEUKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoR1RFLCAmRk9MTE9XX0dURV9pbl9yZWxhdGlvbmFsT3AyMTc0OCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXJlbGF0aW9uYWxPcEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG9wOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBvcD0gT1AoR1RFKTsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDM6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjEyNjo0OiBMVF8KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoTFRfLCAmRk9MTE9XX0xUX19pbl9yZWxhdGlvbmFsT3AyMTc1Nik7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXJlbGF0aW9uYWxPcEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIG9wOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBvcD0gT1AoTFQpOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgNDoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MTI3OjQ6IEdUCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKEdULCAmRk9MTE9XX0dUX2luX3JlbGF0aW9uYWxPcDIxNzY0KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlcmVsYXRpb25hbE9wRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG9wPSBPUChHVCk7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA1OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYxMjk6NDogJ2luJworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgyOTUsICZGT0xMT1dfMjk1X2luX3JlbGF0aW9uYWxPcDIxNzc0KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlcmVsYXRpb25hbE9wRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG9wPSBPUChJTik7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVyZWxhdGlvbmFsT3BFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVyZWxhdGlvbmFsT3BFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDIyNywgcmVsYXRpb25hbE9wX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gb3A7Cit9CisvKiAkQU5UTFIgZW5kIHJlbGF0aW9uYWxPcCAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBzaGlmdEV4cHJlc3Npb24KKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYxMzk6MTogc2hpZnRFeHByZXNzaW9uIHJldHVybnMgWyBzZXA6OkJGIGJmIF0gOiBlPSBhZGRpdGl2ZUV4cHJlc3Npb24gKG9wPSBzaGlmdE9wIGU9IGFkZGl0aXZlRXhwcmVzc2lvbiApKiA7CisgKi8KK3N0YXRpYyBzZXA6OkJGCitzaGlmdEV4cHJlc3Npb24ocGZtbFBhcnNlciBjdHgpCit7CisgICAgc2VwOjpCRiBiZjsKKworICAgIEFOVExSM19VSU5UMzIgc2hpZnRFeHByZXNzaW9uX1N0YXJ0SW5kZXg7CisKKyAgICBzZXA6OkJGIGU7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2UKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisgICAgc2VwOjpPcGVyYXRvciAqIG9wOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9vcAorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfb3Agc2VwOjpPcGVyYXRvciAqCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgc2hpZnRFeHByZXNzaW9uX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDIyOCkpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gYmY7CisgICAgfQorCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MTQxOjI6IChlPSBhZGRpdGl2ZUV4cHJlc3Npb24gKG9wPSBzaGlmdE9wIGU9IGFkZGl0aXZlRXhwcmVzc2lvbiApKiApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYxNDE6NDogZT0gYWRkaXRpdmVFeHByZXNzaW9uIChvcD0gc2hpZnRPcCBlPSBhZGRpdGl2ZUV4cHJlc3Npb24gKSoKKyAgICAgICAgeworICAgICAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfYWRkaXRpdmVFeHByZXNzaW9uX2luX3NoaWZ0RXhwcmVzc2lvbjIxODA2KTsKKyAgICAgICAgICAgIGU9YWRkaXRpdmVFeHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVzaGlmdEV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBiZj0gCisgICAgICAgICAgICAgICAgZQorICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjE0Mjo0OiAob3A9IHNoaWZ0T3AgZT0gYWRkaXRpdmVFeHByZXNzaW9uICkqCisKKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDUwOD0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBMU0hJRlQ6CisgICAgICAgICAgICAgICAgY2FzZSBSU0hJRlQ6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgICAgICAJCSAgIC8qIGRmYUxvb3BiYWNrU3RhdGUoayxlZGdlcyxlb3RQcmVkaWN0c0FsdCxkZXNjcmlwdGlvbixzdGF0ZU51bWJlcixzZW1QcmVkU3RhdGUpCisgICAgICAgICAgICAgICAgCQkgICAgKi8KKyAgICAgICAgICAgICAgICAJCSAgICBpbnQgTEE1MDhfMSA9IExBKDIpOworICAgICAgICAgICAgICAgIAkJICAgIGlmICggKHN5bnByZWQ5OTdfZm1sKGN0eCkpKQorICAgICAgICAgICAgICAgIAkJICAgIHsKKyAgICAgICAgICAgICAgICAJCSAgICAgICAgYWx0NTA4PTE7CisgICAgICAgICAgICAgICAgCQkgICAgfQorCisgICAgICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDUwOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MTQyOjY6IG9wPSBzaGlmdE9wIGU9IGFkZGl0aXZlRXhwcmVzc2lvbgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19zaGlmdE9wX2luX3NoaWZ0RXhwcmVzc2lvbjIxODE4KTsKKyAgICAgICAgICAgIAkgICAgICAgIG9wPXNoaWZ0T3AoY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXNoaWZ0RXhwcmVzc2lvbkV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19hZGRpdGl2ZUV4cHJlc3Npb25faW5fc2hpZnRFeHByZXNzaW9uMjE4MjIpOworICAgICAgICAgICAgCSAgICAgICAgZT1hZGRpdGl2ZUV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXNoaWZ0RXhwcmVzc2lvbkV4OworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgIGJmPSBORVdfQ09ERTIob3AsIAorICAgICAgICAgICAgCSAgICAgICAgICAgIGJmCisgICAgICAgICAgICAJICAgICAgICAgICAgLCBlCisgICAgICAgICAgICAJICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdDoKKyAgICAgICAgICAgIAkgICAgZ290byBsb29wNTA4OwkvKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgKi8KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9vcDUwODogOyAvKiBKdW1wIG91dCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworCisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlc2hpZnRFeHByZXNzaW9uRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlc2hpZnRFeHByZXNzaW9uRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgyMjgsIHNoaWZ0RXhwcmVzc2lvbl9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIGJmOworfQorLyogJEFOVExSIGVuZCBzaGlmdEV4cHJlc3Npb24gKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgc2hpZnRPcAorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjE0ODoxOiBzaGlmdE9wIHJldHVybnMgWyBzZXA6Ok9wZXJhdG9yICogb3AgXSA6ICggTFNISUZUIHwgUlNISUZUICk7CisgKi8KK3N0YXRpYyBzZXA6Ok9wZXJhdG9yICoKK3NoaWZ0T3AocGZtbFBhcnNlciBjdHgpCit7CisgICAgc2VwOjpPcGVyYXRvciAqIG9wOworCisgICAgQU5UTFIzX1VJTlQzMiBzaGlmdE9wX1N0YXJ0SW5kZXg7CisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgc2hpZnRPcF9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgyMjkpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIG9wOworICAgIH0KKworICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYxNTA6MjogKCBMU0hJRlQgfCBSU0hJRlQgKQorCisgICAgICAgICAgICBBTlRMUjNfVUlOVDMyIGFsdDUwOTsKKworICAgICAgICAgICAgYWx0NTA5PTI7CisKKyAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgTFNISUZUOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NTA5PTE7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBSU0hJRlQ6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ1MDk9MjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA1MDk7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVzaGlmdE9wRXg7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQ1MDkpCisgICAgICAgICAgICB7CisgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjE1MDo0OiBMU0hJRlQKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoTFNISUZULCAmRk9MTE9XX0xTSElGVF9pbl9zaGlmdE9wMjE4NDkpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzaGlmdE9wRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIG9wPSBPUChMU0hJRlQpOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MTUxOjQ6IFJTSElGVAorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChSU0hJRlQsICZGT0xMT1dfUlNISUZUX2luX3NoaWZ0T3AyMTg1Nyk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXNoaWZ0T3BFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBvcDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgb3A9IE9QKFJTSElGVCk7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVzaGlmdE9wRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlc2hpZnRPcEV4OiA7CisKKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgfQorICAgIGlmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoMjI5LCBzaGlmdE9wX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gb3A7Cit9CisvKiAkQU5UTFIgZW5kIHNoaWZ0T3AgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgYWRkaXRpdmVFeHByZXNzaW9uCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MTU1OjE6IGFkZGl0aXZlRXhwcmVzc2lvbiByZXR1cm5zIFsgc2VwOjpCRiBiZiBdIDogZT0gbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICggKCBQTFVTIHwgTUlOVVMgKSBlPSBtdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKSogOworICovCitzdGF0aWMgc2VwOjpCRgorYWRkaXRpdmVFeHByZXNzaW9uKHBmbWxQYXJzZXIgY3R4KQoreworICAgIHNlcDo6QkYgYmY7CisKKyAgICBBTlRMUjNfVUlOVDMyIGFkZGl0aXZlRXhwcmVzc2lvbl9TdGFydEluZGV4OworCisgICAgc2VwOjpCRiBlOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9lCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9lIHNlcDo6QkYKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBhZGRpdGl2ZUV4cHJlc3Npb25fU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworCisgICAgCXNlcDo6T3BlcmF0b3IgKiBvcCA9IE5VTEw7CisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDIzMCkpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gYmY7CisgICAgfQorCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MTYwOjI6IChlPSBtdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKCAoIFBMVVMgfCBNSU5VUyApIGU9IG11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiApKiApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYxNjA6NDogZT0gbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICggKCBQTFVTIHwgTUlOVVMgKSBlPSBtdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKSoKKyAgICAgICAgeworICAgICAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX2luX2FkZGl0aXZlRXhwcmVzc2lvbjIxODgyKTsKKyAgICAgICAgICAgIGU9bXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVhZGRpdGl2ZUV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBiZj0gCisgICAgICAgICAgICAgICAgZQorICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjE2MTo0OiAoICggUExVUyB8IE1JTlVTICkgZT0gbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICkqCisKKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDUxMT0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBNSU5VUzoKKyAgICAgICAgICAgICAgICBjYXNlIFBMVVM6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgICAgICAJCSAgIC8qIGRmYUxvb3BiYWNrU3RhdGUoayxlZGdlcyxlb3RQcmVkaWN0c0FsdCxkZXNjcmlwdGlvbixzdGF0ZU51bWJlcixzZW1QcmVkU3RhdGUpCisgICAgICAgICAgICAgICAgCQkgICAgKi8KKyAgICAgICAgICAgICAgICAJCSAgICBpbnQgTEE1MTFfMSA9IExBKDIpOworICAgICAgICAgICAgICAgIAkJICAgIGlmICggKHN5bnByZWQxMDAwX2ZtbChjdHgpKSkKKyAgICAgICAgICAgICAgICAJCSAgICB7CisgICAgICAgICAgICAgICAgCQkgICAgICAgIGFsdDUxMT0xOworICAgICAgICAgICAgICAgIAkJICAgIH0KKworICAgICAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ1MTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCWNhc2UgMToKKyAgICAgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjE2MTo2OiAoIFBMVVMgfCBNSU5VUyApIGU9IG11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MTYxOjY6ICggUExVUyB8IE1JTlVTICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0NTEwPTI7CisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIFBMVVM6CisgICAgICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCWFsdDUxMD0xOworICAgICAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgTUlOVVM6CisgICAgICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCWFsdDUxMD0yOworICAgICAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDUxMDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlYWRkaXRpdmVFeHByZXNzaW9uRXg7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDUxMCkKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MTYxOjg6IFBMVVMKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChQTFVTLCAmRk9MTE9XX1BMVVNfaW5fYWRkaXRpdmVFeHByZXNzaW9uMjE4OTQpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVhZGRpdGl2ZUV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICBvcCA9IE9QKFBMVVMpOyAgCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjE2Mjo4OiBNSU5VUworICAgICAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKE1JTlVTLCAmRk9MTE9XX01JTlVTX2luX2FkZGl0aXZlRXhwcmVzc2lvbjIxOTA2KTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlYWRkaXRpdmVFeHByZXNzaW9uRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgb3AgPSBPUChNSU5VUyk7IAorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX2luX2FkZGl0aXZlRXhwcmVzc2lvbjIxOTI0KTsKKyAgICAgICAgICAgIAkgICAgICAgIGU9bXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVhZGRpdGl2ZUV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICBiZj0gTkVXX0NPREVfRkxBVChvcCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgYmYKKyAgICAgICAgICAgIAkgICAgICAgICAgICAsIGUKKyAgICAgICAgICAgIAkgICAgICAgICAgICApOworICAgICAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAgICAgCSAgICBnb3RvIGxvb3A1MTE7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb29wNTExOiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVhZGRpdGl2ZUV4cHJlc3Npb25FeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVhZGRpdGl2ZUV4cHJlc3Npb25FeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDIzMCwgYWRkaXRpdmVFeHByZXNzaW9uX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gYmY7Cit9CisvKiAkQU5UTFIgZW5kIGFkZGl0aXZlRXhwcmVzc2lvbiAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBtdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24KKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYxNjk6MTogbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIHJldHVybnMgWyBzZXA6OkJGIGJmIF0gOiBlPSB1bmFyeUV4cHJlc3Npb24gKCAoIFNUQVIgfCBESVYgfCBNT0QgKSBlPSB1bmFyeUV4cHJlc3Npb24gKSogOworICovCitzdGF0aWMgc2VwOjpCRgorbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKHBmbWxQYXJzZXIgY3R4KQoreworICAgIHNlcDo6QkYgYmY7CisKKyAgICBBTlRMUjNfVUlOVDMyIG11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9TdGFydEluZGV4OworCisgICAgc2VwOjpCRiBlOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9lCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9lIHNlcDo6QkYKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBtdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworCisgICAgCXNlcDo6T3BlcmF0b3IgKiBvcCA9IE5VTEw7CisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDIzMSkpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gYmY7CisgICAgfQorCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MTc0OjI6IChlPSB1bmFyeUV4cHJlc3Npb24gKCAoIFNUQVIgfCBESVYgfCBNT0QgKSBlPSB1bmFyeUV4cHJlc3Npb24gKSogKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MTc0OjQ6IGU9IHVuYXJ5RXhwcmVzc2lvbiAoICggU1RBUiB8IERJViB8IE1PRCApIGU9IHVuYXJ5RXhwcmVzc2lvbiApKgorICAgICAgICB7CisgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uMjE5NTgpOworICAgICAgICAgICAgZT11bmFyeUV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZW11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIGJmPSAKKyAgICAgICAgICAgICAgICBlCisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MTc1OjQ6ICggKCBTVEFSIHwgRElWIHwgTU9EICkgZT0gdW5hcnlFeHByZXNzaW9uICkqCisKKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDUxMz0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBESVY6CisgICAgICAgICAgICAgICAgY2FzZSBNT0Q6CisgICAgICAgICAgICAgICAgY2FzZSBTVEFSOgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAgICAgCQkgICAvKiBkZmFMb29wYmFja1N0YXRlKGssZWRnZXMsZW90UHJlZGljdHNBbHQsZGVzY3JpcHRpb24sc3RhdGVOdW1iZXIsc2VtUHJlZFN0YXRlKQorICAgICAgICAgICAgICAgIAkJICAgICovCisgICAgICAgICAgICAgICAgCQkgICAgaW50IExBNTEzXzEgPSBMQSgyKTsKKyAgICAgICAgICAgICAgICAJCSAgICBpZiAoIChzeW5wcmVkMTAwM19mbWwoY3R4KSkpCisgICAgICAgICAgICAgICAgCQkgICAgeworICAgICAgICAgICAgICAgIAkJICAgICAgICBhbHQ1MTM9MTsKKyAgICAgICAgICAgICAgICAJCSAgICB9CisKKyAgICAgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NTEzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYxNzU6NjogKCBTVEFSIHwgRElWIHwgTU9EICkgZT0gdW5hcnlFeHByZXNzaW9uCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYxNzU6NjogKCBTVEFSIHwgRElWIHwgTU9EICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0NTEyPTM7CisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIFNUQVI6CisgICAgICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCWFsdDUxMj0xOworICAgICAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgRElWOgorICAgICAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQlhbHQ1MTI9MjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIE1PRDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJYWx0NTEyPTM7CisgICAgICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gNTEyOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBnb3RvIHJ1bGVtdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25FeDsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0NTEyKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYxNzU6ODogU1RBUgorICAgICAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKFNUQVIsICZGT0xMT1dfU1RBUl9pbl9tdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24yMTk3MCk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkV4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIG9wID0gT1AoTVVMVCk7IAorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDI6CisgICAgICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYxNzY6ODogRElWCisgICAgICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoRElWLCAmRk9MTE9XX0RJVl9pbl9tdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24yMTk4MSk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZW11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkV4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIG9wID0gT1AoRElWKTsgCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgCWNhc2UgMzoKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjE3Nzo4OiBNT0QKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChNT0QsICZGT0xMT1dfTU9EX2luX211bHRpcGxpY2F0aXZlRXhwcmVzc2lvbjIxOTkzKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgb3AgPSBPUChNT0QpOyAKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3VuYXJ5RXhwcmVzc2lvbl9pbl9tdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24yMjAxMik7CisgICAgICAgICAgICAJICAgICAgICBlPXVuYXJ5RXhwcmVzc2lvbihjdHgpOworCisgICAgICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgYmY9IE5FV19DT0RFX0ZMQVQob3AsIAorICAgICAgICAgICAgCSAgICAgICAgICAgIGJmCisgICAgICAgICAgICAJICAgICAgICAgICAgLCBlCisgICAgICAgICAgICAJICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdDoKKyAgICAgICAgICAgIAkgICAgZ290byBsb29wNTEzOwkvKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgKi8KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9vcDUxMzogOyAvKiBKdW1wIG91dCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworCisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgyMzEsIG11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIGJmOworfQorLyogJEFOVExSIGVuZCBtdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgdW5hcnlFeHByZXNzaW9uCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MTg4OjE6IHVuYXJ5RXhwcmVzc2lvbiByZXR1cm5zIFsgc2VwOjpCRiBiZiBdIDogKCBQTFVTIGU9IHVuYXJ5RXhwcmVzc2lvbiB8IE1JTlVTIGU9IHVuYXJ5RXhwcmVzc2lvbiB8IElOQ1IgZT0gdW5hcnlFeHByZXNzaW9uIHwgREVDUiBlPSB1bmFyeUV4cHJlc3Npb24gfCBMTk9UIGU9IHVuYXJ5RXhwcmVzc2lvbiB8IEJOT1QgZT0gdW5hcnlFeHByZXNzaW9uIHwgT1BfUE9QIGU9IHVuYXJ5RXhwcmVzc2lvbiB8IE9QX1RPUCBlPSB1bmFyeUV4cHJlc3Npb24gfGM9IHByZWZpeF9leHByZXNzaW9uIHxjPSBleHByZXNzaW9uX2ludm9rZSB8Yz0gZXhwcmVzc2lvbl9hY3Rpdml0eV9uZXcgfGM9IGV4cHJlc3Npb25fY29tIHxjPSBleHByZXNzaW9uX2d1YXJkIHxjPSBleHByZXNzaW9uX2l0ZSB8Yz0gZXhwcmVzc2lvbl9sYW1iZGEgfGU9IGN0b3JFeHByZXNzaW9uIHxlPSBwcmltYXJ5ICggSU5DUiB8IERFQ1IgKT8gfGw9IGxpdGVyYWwgfHE9IHF1b3RlX2V4cHJlc3Npb24gfHE9IG1ldGFfZXZhbF9leHByZXNzaW9uIHwgTFBBUkVOIGU9IGV4cHJlc3Npb24gUlBBUkVOIHxlPSBjb2xsZWN0aW9uX29mX2V4cHJlc3Npb24gKTsKKyAqLworc3RhdGljIHNlcDo6QkYKK3VuYXJ5RXhwcmVzc2lvbihwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBzZXA6OkJGIGJmOworCisgICAgQU5UTFIzX1VJTlQzMiB1bmFyeUV4cHJlc3Npb25fU3RhcnRJbmRleDsKKworICAgIHNlcDo6QkYgZTsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfZQorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfZSBzZXA6OkJGCisKKyAgICBzZXA6OkJGQ29kZSBjOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9jCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9jIHNlcDo6QkZDb2RlCisKKyAgICBzZXA6OkJGIGw7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2wKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2wgc2VwOjpCRgorCisgICAgc2VwOjpCRkNvZGUgcTsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfcQorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfcSBzZXA6OkJGQ29kZQorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIHVuYXJ5RXhwcmVzc2lvbl9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisgICAgaWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSgyMzIpKSApCisgICAgeworICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIGJmOworICAgIH0KKworICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgLy8gIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYxOTA6MjogKCBQTFVTIGU9IHVuYXJ5RXhwcmVzc2lvbiB8IE1JTlVTIGU9IHVuYXJ5RXhwcmVzc2lvbiB8IElOQ1IgZT0gdW5hcnlFeHByZXNzaW9uIHwgREVDUiBlPSB1bmFyeUV4cHJlc3Npb24gfCBMTk9UIGU9IHVuYXJ5RXhwcmVzc2lvbiB8IEJOT1QgZT0gdW5hcnlFeHByZXNzaW9uIHwgT1BfUE9QIGU9IHVuYXJ5RXhwcmVzc2lvbiB8IE9QX1RPUCBlPSB1bmFyeUV4cHJlc3Npb24gfGM9IHByZWZpeF9leHByZXNzaW9uIHxjPSBleHByZXNzaW9uX2ludm9rZSB8Yz0gZXhwcmVzc2lvbl9hY3Rpdml0eV9uZXcgfGM9IGV4cHJlc3Npb25fY29tIHxjPSBleHByZXNzaW9uX2d1YXJkIHxjPSBleHByZXNzaW9uX2l0ZSB8Yz0gZXhwcmVzc2lvbl9sYW1iZGEgfGU9IGN0b3JFeHByZXNzaW9uIHxlPSBwcmltYXJ5ICggSU5DUiB8IERFQ1IgKT8gfGw9IGxpdGVyYWwgfHE9IHF1b3RlX2V4cHJlc3Npb24gfHE9IG1ldGFfZXZhbF9leHByZXNzaW9uIHwgTFBBUkVOIGU9IGV4cHJlc3Npb24gUlBBUkVOIHxlPSBjb2xsZWN0aW9uX29mX2V4cHJlc3Npb24gKQorCisgICAgICAgICAgICBBTlRMUjNfVUlOVDMyIGFsdDUxNTsKKworICAgICAgICAgICAgYWx0NTE1PTIyOworCisgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFBMVVM6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ1MTU9MTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1JTlVTOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NTE1PTI7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBJTkNSOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NTE1PTM7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBERUNSOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NTE1PTQ7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBMTk9UOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NTE1PTU7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCTk9UOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NTE1PTY7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUF9QT1A6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ1MTU9NzsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9QX1RPUDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDUxNT04OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRE9MTEFSX0xDVVJMWToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDUxNT05OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTFBBUkVOX0lOVk9LRToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDUxNT0xMDsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMzMDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDUxNT0xMTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIzNzoKKyAgICAgICAgICAgIGNhc2UgMzQ3OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NTE1PTEyOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjU2OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NTE1PTEzOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjk0OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NTE1PTE0OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzEzOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NTE1PTE1OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjY1OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NTE1PTE2OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ09MT054MjoKKyAgICAgICAgICAgIGNhc2UgSUQ6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ1MTU9MTc7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDaGFyTGl0ZXJhbDoKKyAgICAgICAgICAgIGNhc2UgRmxvYXRMaXRlcmFsOgorICAgICAgICAgICAgY2FzZSBJbnRlZ2VyTGl0ZXJhbDoKKyAgICAgICAgICAgIGNhc2UgUmF0aW9uYWxMaXRlcmFsOgorICAgICAgICAgICAgY2FzZSBTdHJpbmdMaXRlcmFsOgorICAgICAgICAgICAgY2FzZSAxNTg6CisgICAgICAgICAgICBjYXNlIDE1OToKKyAgICAgICAgICAgIGNhc2UgMTYwOgorICAgICAgICAgICAgY2FzZSAxNjE6CisgICAgICAgICAgICBjYXNlIDE2MjoKKyAgICAgICAgICAgIGNhc2UgMjc3OgorICAgICAgICAgICAgY2FzZSAyODA6CisgICAgICAgICAgICBjYXNlIDMzMToKKyAgICAgICAgICAgIGNhc2UgMzMyOgorICAgICAgICAgICAgY2FzZSAzNDM6CisgICAgICAgICAgICBjYXNlIDM3MjoKKyAgICAgICAgICAgIGNhc2UgMzk3OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NTE1PTE4OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUEVSQ0VOVF9MQ1VSTFk6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ1MTU9MTk7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBMQlJBQ0tFVF9CQVI6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ1MTU9MjA7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBMUEFSRU46CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ1MTU9MjE7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBMQlJBQ0tFVDoKKyAgICAgICAgICAgIGNhc2UgTENVUkxZOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NTE1PTIyOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDUxNTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXVuYXJ5RXhwcmVzc2lvbkV4OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NTE1KQorICAgICAgICAgICAgeworICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYxOTA6NDogUExVUyBlPSB1bmFyeUV4cHJlc3Npb24KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoUExVUywgJkZPTExPV19QTFVTX2luX3VuYXJ5RXhwcmVzc2lvbjIyMDQyKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxldW5hcnlFeHByZXNzaW9uRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3VuYXJ5RXhwcmVzc2lvbl9pbl91bmFyeUV4cHJlc3Npb24yMjA0Nyk7CisgICAgICAgIAkgICAgICAgIGU9dW5hcnlFeHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXVuYXJ5RXhwcmVzc2lvbkV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBiZj0gCisgICAgICAgIAkgICAgICAgICAgICBlCisgICAgICAgIAkgICAgICAgICAgICA7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAyOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYxOTM6NDogTUlOVVMgZT0gdW5hcnlFeHByZXNzaW9uCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKE1JTlVTLCAmRk9MTE9XX01JTlVTX2luX3VuYXJ5RXhwcmVzc2lvbjIyMDU2KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxldW5hcnlFeHByZXNzaW9uRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3VuYXJ5RXhwcmVzc2lvbl9pbl91bmFyeUV4cHJlc3Npb24yMjA2MCk7CisgICAgICAgIAkgICAgICAgIGU9dW5hcnlFeHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXVuYXJ5RXhwcmVzc2lvbkV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBiZj0gbmV3X3VtaW51c19leHByKAorICAgICAgICAJICAgICAgICAgICAgZQorICAgICAgICAJICAgICAgICAgICAgKTsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDM6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjE5Njo0OiBJTkNSIGU9IHVuYXJ5RXhwcmVzc2lvbgorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChJTkNSLCAmRk9MTE9XX0lOQ1JfaW5fdW5hcnlFeHByZXNzaW9uMjIwNjkpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV1bmFyeUV4cHJlc3Npb25FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfdW5hcnlFeHByZXNzaW9uX2luX3VuYXJ5RXhwcmVzc2lvbjIyMDc0KTsKKyAgICAgICAgCSAgICAgICAgZT11bmFyeUV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxldW5hcnlFeHByZXNzaW9uRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGJmPSBORVdfU1RNVF9BU1NJR05fT1AoT1AoUExVUyksCisgICAgICAgIAkgICAgICAgICAgICAJCQorICAgICAgICAJICAgICAgICAgICAgZQorICAgICAgICAJICAgICAgICAgICAgLCBzZXA6OkV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9PTkUpOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgNDoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MTk5OjQ6IERFQ1IgZT0gdW5hcnlFeHByZXNzaW9uCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKERFQ1IsICZGT0xMT1dfREVDUl9pbl91bmFyeUV4cHJlc3Npb24yMjA4Mik7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXVuYXJ5RXhwcmVzc2lvbkV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fdW5hcnlFeHByZXNzaW9uMjIwODcpOworICAgICAgICAJICAgICAgICBlPXVuYXJ5RXhwcmVzc2lvbihjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV1bmFyeUV4cHJlc3Npb25FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgYmY9IE5FV19TVE1UX0FTU0lHTl9PUChPUChQTFVTKSwgCisgICAgICAgIAkgICAgICAgICAgICBlCisgICAgICAgIAkgICAgICAgICAgICAsCisgICAgICAgIAkgICAgICAgICAgICAJCXNlcDo6RXhwcmVzc2lvbkNvbnN0YW50OjpJTlRFR0VSX01JTlVTX09ORSk7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA1OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYyMDM6NDogTE5PVCBlPSB1bmFyeUV4cHJlc3Npb24KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoTE5PVCwgJkZPTExPV19MTk9UX2luX3VuYXJ5RXhwcmVzc2lvbjIyMDk2KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxldW5hcnlFeHByZXNzaW9uRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3VuYXJ5RXhwcmVzc2lvbl9pbl91bmFyeUV4cHJlc3Npb24yMjEwMCk7CisgICAgICAgIAkgICAgICAgIGU9dW5hcnlFeHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXVuYXJ5RXhwcmVzc2lvbkV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBiZj0gbmV3X25vdF9leHByKAorICAgICAgICAJICAgICAgICAgICAgZQorICAgICAgICAJICAgICAgICAgICAgKTsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDY6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjIwNjo0OiBCTk9UIGU9IHVuYXJ5RXhwcmVzc2lvbgorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChCTk9ULCAmRk9MTE9XX0JOT1RfaW5fdW5hcnlFeHByZXNzaW9uMjIxMDkpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV1bmFyeUV4cHJlc3Npb25FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfdW5hcnlFeHByZXNzaW9uX2luX3VuYXJ5RXhwcmVzc2lvbjIyMTEzKTsKKyAgICAgICAgCSAgICAgICAgZT11bmFyeUV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxldW5hcnlFeHByZXNzaW9uRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGJmPSBORVdfQ09ERTEoT1AoQk5PVCksIAorICAgICAgICAJICAgICAgICAgICAgZQorICAgICAgICAJICAgICAgICAgICAgKTsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDc6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjIwOTo0OiBPUF9QT1AgZT0gdW5hcnlFeHByZXNzaW9uCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKE9QX1BPUCwgJkZPTExPV19PUF9QT1BfaW5fdW5hcnlFeHByZXNzaW9uMjIxMjIpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV1bmFyeUV4cHJlc3Npb25FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfdW5hcnlFeHByZXNzaW9uX2luX3VuYXJ5RXhwcmVzc2lvbjIyMTI4KTsKKyAgICAgICAgCSAgICAgICAgZT11bmFyeUV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxldW5hcnlFeHByZXNzaW9uRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGJmPSBORVdfQ09ERTEoT1AoUE9QKSwgCisgICAgICAgIAkgICAgICAgICAgICBlCisgICAgICAgIAkgICAgICAgICAgICApOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgODoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MjEyOjQ6IE9QX1RPUCBlPSB1bmFyeUV4cHJlc3Npb24KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoT1BfVE9QLCAmRk9MTE9XX09QX1RPUF9pbl91bmFyeUV4cHJlc3Npb24yMjEzNyk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXVuYXJ5RXhwcmVzc2lvbkV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV191bmFyeUV4cHJlc3Npb25faW5fdW5hcnlFeHByZXNzaW9uMjIxNDMpOworICAgICAgICAJICAgICAgICBlPXVuYXJ5RXhwcmVzc2lvbihjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV1bmFyeUV4cHJlc3Npb25FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgYmY9IE5FV19DT0RFMShPUChUT1ApLCAKKyAgICAgICAgCSAgICAgICAgICAgIGUKKyAgICAgICAgCSAgICAgICAgICAgICk7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA5OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYyMTk6NDogYz0gcHJlZml4X2V4cHJlc3Npb24KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3ByZWZpeF9leHByZXNzaW9uX2luX3VuYXJ5RXhwcmVzc2lvbjIyMTU4KTsKKyAgICAgICAgCSAgICAgICAgYz1wcmVmaXhfZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV1bmFyeUV4cHJlc3Npb25FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgYmY9IAorICAgICAgICAJICAgICAgICAgICAgYworICAgICAgICAJICAgICAgICAgICAgOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMTA6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjIyMTo0OiBjPSBleHByZXNzaW9uX2ludm9rZQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbnZva2VfaW5fdW5hcnlFeHByZXNzaW9uMjIxNzgpOworICAgICAgICAJICAgICAgICBjPWV4cHJlc3Npb25faW52b2tlKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXVuYXJ5RXhwcmVzc2lvbkV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBiZj0gCisgICAgICAgIAkgICAgICAgICAgICBjCisgICAgICAgIAkgICAgICAgICAgICA7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAxMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MjIzOjQ6IGM9IGV4cHJlc3Npb25fYWN0aXZpdHlfbmV3CisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2FjdGl2aXR5X25ld19pbl91bmFyeUV4cHJlc3Npb24yMjE5OCk7CisgICAgICAgIAkgICAgICAgIGM9ZXhwcmVzc2lvbl9hY3Rpdml0eV9uZXcoY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxldW5hcnlFeHByZXNzaW9uRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGJmPSAKKyAgICAgICAgCSAgICAgICAgICAgIGMKKyAgICAgICAgCSAgICAgICAgICAgIDsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDEyOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYyMjY6NDogYz0gZXhwcmVzc2lvbl9jb20KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25fY29tX2luX3VuYXJ5RXhwcmVzc2lvbjIyMjEzKTsKKyAgICAgICAgCSAgICAgICAgYz1leHByZXNzaW9uX2NvbShjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV1bmFyeUV4cHJlc3Npb25FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgYmY9IAorICAgICAgICAJICAgICAgICAgICAgYworICAgICAgICAJICAgICAgICAgICAgOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMTM6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjIyNzo0OiBjPSBleHByZXNzaW9uX2d1YXJkCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2d1YXJkX2luX3VuYXJ5RXhwcmVzc2lvbjIyMjM1KTsKKyAgICAgICAgCSAgICAgICAgYz1leHByZXNzaW9uX2d1YXJkKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXVuYXJ5RXhwcmVzc2lvbkV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBiZj0gCisgICAgICAgIAkgICAgICAgICAgICBjCisgICAgICAgIAkgICAgICAgICAgICA7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAxNDoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MjI4OjQ6IGM9IGV4cHJlc3Npb25faXRlCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2l0ZV9pbl91bmFyeUV4cHJlc3Npb24yMjI1NSk7CisgICAgICAgIAkgICAgICAgIGM9ZXhwcmVzc2lvbl9pdGUoY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxldW5hcnlFeHByZXNzaW9uRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGJmPSAKKyAgICAgICAgCSAgICAgICAgICAgIGMKKyAgICAgICAgCSAgICAgICAgICAgIDsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDE1OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYyMjk6NDogYz0gZXhwcmVzc2lvbl9sYW1iZGEKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25fbGFtYmRhX2luX3VuYXJ5RXhwcmVzc2lvbjIyMjc3KTsKKyAgICAgICAgCSAgICAgICAgYz1leHByZXNzaW9uX2xhbWJkYShjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV1bmFyeUV4cHJlc3Npb25FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgYmY9IAorICAgICAgICAJICAgICAgICAgICAgYworICAgICAgICAJICAgICAgICAgICAgOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMTY6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjIzNTo0OiBlPSBjdG9yRXhwcmVzc2lvbgorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfY3RvckV4cHJlc3Npb25faW5fdW5hcnlFeHByZXNzaW9uMjIzMDEpOworICAgICAgICAJICAgICAgICBlPWN0b3JFeHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXVuYXJ5RXhwcmVzc2lvbkV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBiZj0gCisgICAgICAgIAkgICAgICAgICAgICBlCisgICAgICAgIAkgICAgICAgICAgICA7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAxNzoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MjM3OjQ6IGU9IHByaW1hcnkgKCBJTkNSIHwgREVDUiApPworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfcHJpbWFyeV9pbl91bmFyeUV4cHJlc3Npb24yMjMyNCk7CisgICAgICAgIAkgICAgICAgIGU9cHJpbWFyeShjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV1bmFyeUV4cHJlc3Npb25FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgYmY9IAorICAgICAgICAJICAgICAgICAgICAgZQorICAgICAgICAJICAgICAgICAgICAgOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MjM4OjQ6ICggSU5DUiB8IERFQ1IgKT8KKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDUxND0zOworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgSU5DUjoKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgICAgIAkJeworICAgICAgICAJICAgICAgICAgICAgICAgIAkJICAgIGludCBMQTUxNF8xID0gTEEoMik7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQkgICAgaWYgKCAoc3lucHJlZDEwMjBfZm1sKGN0eCkpKQorICAgICAgICAJICAgICAgICAgICAgICAgIAkJICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJCSAgICAgICAgYWx0NTE0PTE7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQkgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIAkJfQorICAgICAgICAJICAgICAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgICAgIGNhc2UgREVDUjoKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgICAgIAkJeworICAgICAgICAJICAgICAgICAgICAgICAgIAkJICAgIGludCBMQTUxNF80ID0gTEEoMik7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQkgICAgaWYgKCAoc3lucHJlZDEwMjFfZm1sKGN0eCkpKQorICAgICAgICAJICAgICAgICAgICAgICAgIAkJICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAJCSAgICAgICAgYWx0NTE0PTI7CisgICAgICAgIAkgICAgICAgICAgICAgICAgCQkgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIAkJfQorICAgICAgICAJICAgICAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKGFsdDUxNCkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MjM4OjY6IElOQ1IKKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoSU5DUiwgJkZPTExPV19JTkNSX2luX3VuYXJ5RXhwcmVzc2lvbjIyMzUzKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxldW5hcnlFeHByZXNzaW9uRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIGJmPSBORVdfU1RNVF9BU1NJR05fT1BfQUZURVIoT1AoUExVUyksIAorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgLAorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCQkJc2VwOjpFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfT05FKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAljYXNlIDI6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjI0MTo2OiBERUNSCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKERFQ1IsICZGT0xMT1dfREVDUl9pbl91bmFyeUV4cHJlc3Npb24yMjM2NCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXVuYXJ5RXhwcmVzc2lvbkV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICBiZj0gTkVXX1NUTVRfQVNTSUdOX09QX0FGVEVSKE9QKFBMVVMpLCAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGUKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICwKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkJCXNlcDo6RXhwcmVzc2lvbkNvbnN0YW50OjpJTlRFR0VSX01JTlVTX09ORSk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMTg6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjI0Njo0OiBsPSBsaXRlcmFsCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19saXRlcmFsX2luX3VuYXJ5RXhwcmVzc2lvbjIyMzgyKTsKKyAgICAgICAgCSAgICAgICAgbD1saXRlcmFsKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXVuYXJ5RXhwcmVzc2lvbkV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBiZj0gCisgICAgICAgIAkgICAgICAgICAgICBsCisgICAgICAgIAkgICAgICAgICAgICA7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAxOToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MjQ4OjQ6IHE9IHF1b3RlX2V4cHJlc3Npb24KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3F1b3RlX2V4cHJlc3Npb25faW5fdW5hcnlFeHByZXNzaW9uMjI0MTIpOworICAgICAgICAJICAgICAgICBxPXF1b3RlX2V4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxldW5hcnlFeHByZXNzaW9uRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGJmPSAKKyAgICAgICAgCSAgICAgICAgICAgIHEKKyAgICAgICAgCSAgICAgICAgICAgIDsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDIwOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYyNTA6NDogcT0gbWV0YV9ldmFsX2V4cHJlc3Npb24KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX21ldGFfZXZhbF9leHByZXNzaW9uX2luX3VuYXJ5RXhwcmVzc2lvbjIyNDMzKTsKKyAgICAgICAgCSAgICAgICAgcT1tZXRhX2V2YWxfZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV1bmFyeUV4cHJlc3Npb25FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgYmY9IAorICAgICAgICAJICAgICAgICAgICAgcQorICAgICAgICAJICAgICAgICAgICAgOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjE6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjI1Mjo0OiBMUEFSRU4gZT0gZXhwcmVzc2lvbiBSUEFSRU4KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoTFBBUkVOLCAmRk9MTE9XX0xQQVJFTl9pbl91bmFyeUV4cHJlc3Npb24yMjQ0OCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXVuYXJ5RXhwcmVzc2lvbkV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX3VuYXJ5RXhwcmVzc2lvbjIyNDUzKTsKKyAgICAgICAgCSAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXVuYXJ5RXhwcmVzc2lvbkV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAgTUFUQ0hUKFJQQVJFTiwgJkZPTExPV19SUEFSRU5faW5fdW5hcnlFeHByZXNzaW9uMjI0NTYpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGV1bmFyeUV4cHJlc3Npb25FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgYmY9IAorICAgICAgICAJICAgICAgICAgICAgZQorICAgICAgICAJICAgICAgICAgICAgOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjI6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjI1NDo0OiBlPSBjb2xsZWN0aW9uX29mX2V4cHJlc3Npb24KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2NvbGxlY3Rpb25fb2ZfZXhwcmVzc2lvbl9pbl91bmFyeUV4cHJlc3Npb24yMjQ2Nyk7CisgICAgICAgIAkgICAgICAgIGU9Y29sbGVjdGlvbl9vZl9leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXVuYXJ5RXhwcmVzc2lvbkV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBiZj0gCisgICAgICAgIAkgICAgICAgICAgICBlCisgICAgICAgIAkgICAgICAgICAgICA7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGV1bmFyeUV4cHJlc3Npb25FeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGV1bmFyeUV4cHJlc3Npb25FeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDIzMiwgdW5hcnlFeHByZXNzaW9uX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gYmY7Cit9CisvKiAkQU5UTFIgZW5kIHVuYXJ5RXhwcmVzc2lvbiAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBjdG9yRXhwcmVzc2lvbgorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjI1ODoxOiBjdG9yRXhwcmVzc2lvbiByZXR1cm5zIFsgc2VwOjpCRkNvZGUgY3RvciBdIDogJ2N0b3InIExUXyB0dj0gdHlwZV92YXIgR1QgTFBBUkVOIGU9IGV4cHJlc3Npb24gUlBBUkVOIDsKKyAqLworc3RhdGljIHNlcDo6QkZDb2RlCitjdG9yRXhwcmVzc2lvbihwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBzZXA6OkJGQ29kZSBjdG9yOworCisgICAgQU5UTFIzX1VJTlQzMiBjdG9yRXhwcmVzc2lvbl9TdGFydEluZGV4OworCisgICAgc2VwOjpCRiB0djsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfdHYKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX3R2IHNlcDo6QkYKKworICAgIHNlcDo6QkYgZTsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfZQorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfZSBzZXA6OkJGCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgY3RvckV4cHJlc3Npb25fU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMjMzKSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiBjdG9yOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjI2MDoyOiAoICdjdG9yJyBMVF8gdHY9IHR5cGVfdmFyIEdUIExQQVJFTiBlPSBleHByZXNzaW9uIFJQQVJFTiApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYyNjA6NDogJ2N0b3InIExUXyB0dj0gdHlwZV92YXIgR1QgTFBBUkVOIGU9IGV4cHJlc3Npb24gUlBBUkVOCisgICAgICAgIHsKKyAgICAgICAgICAgICBNQVRDSFQoMjY1LCAmRk9MTE9XXzI2NV9pbl9jdG9yRXhwcmVzc2lvbjIyNDg4KTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlY3RvckV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3RvcjsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgTUFUQ0hUKExUXywgJkZPTExPV19MVF9faW5fY3RvckV4cHJlc3Npb24yMjQ5MCk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZWN0b3JFeHByZXNzaW9uRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGN0b3I7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfdHlwZV92YXJfaW5fY3RvckV4cHJlc3Npb24yMjQ5NSk7CisgICAgICAgICAgICB0dj10eXBlX3ZhcihjdHgpOworCisgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlY3RvckV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3RvcjsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgTUFUQ0hUKEdULCAmRk9MTE9XX0dUX2luX2N0b3JFeHByZXNzaW9uMjI0OTgpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVjdG9yRXhwcmVzc2lvbkV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBjdG9yOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICBNQVRDSFQoTFBBUkVOLCAmRk9MTE9XX0xQQVJFTl9pbl9jdG9yRXhwcmVzc2lvbjIyNTAxKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlY3RvckV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3RvcjsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX2N0b3JFeHByZXNzaW9uMjI1MDYpOworICAgICAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVjdG9yRXhwcmVzc2lvbkV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBjdG9yOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICBNQVRDSFQoUlBBUkVOLCAmRk9MTE9XX1JQQVJFTl9pbl9jdG9yRXhwcmVzc2lvbjIyNTA5KTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlY3RvckV4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3RvcjsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIGN0b3I9IE5FV19DT0RFMihPUChDVE9SKSwgCisgICAgICAgICAgICAgICAgdHYKKyAgICAgICAgICAgICAgICAsIGUKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZWN0b3JFeHByZXNzaW9uRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlY3RvckV4cHJlc3Npb25FeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDIzMywgY3RvckV4cHJlc3Npb25fU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiBjdG9yOworfQorLyogJEFOVExSIGVuZCBjdG9yRXhwcmVzc2lvbiAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBxdW90ZV9leHByZXNzaW9uCisgKiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MjgwOjE6IHF1b3RlX2V4cHJlc3Npb24gcmV0dXJucyBbIHNlcDo6QkZDb2RlIGFjIF0gOiBQRVJDRU5UX0xDVVJMWSBlPSBleHByZXNzaW9uIFJDVVJMWV9QRVJDRU5UIDsKKyAqLworc3RhdGljIHNlcDo6QkZDb2RlCitxdW90ZV9leHByZXNzaW9uKHBmbWxQYXJzZXIgY3R4KQoreworICAgIHNlcDo6QkZDb2RlIGFjOworCisgICAgQU5UTFIzX1VJTlQzMiBxdW90ZV9leHByZXNzaW9uX1N0YXJ0SW5kZXg7CisKKyAgICBzZXA6OkJGIGU7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2UKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIHF1b3RlX2V4cHJlc3Npb25fU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMjM0KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiBhYzsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYyODI6MjogKCBQRVJDRU5UX0xDVVJMWSBlPSBleHByZXNzaW9uIFJDVVJMWV9QRVJDRU5UICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjI4Mjo0OiBQRVJDRU5UX0xDVVJMWSBlPSBleHByZXNzaW9uIFJDVVJMWV9QRVJDRU5UCisgICAgICAgIHsKKyAgICAgICAgICAgICBNQVRDSFQoUEVSQ0VOVF9MQ1VSTFksICZGT0xMT1dfUEVSQ0VOVF9MQ1VSTFlfaW5fcXVvdGVfZXhwcmVzc2lvbjIyNTMyKTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlcXVvdGVfZXhwcmVzc2lvbkV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX3F1b3RlX2V4cHJlc3Npb24yMjUzNyk7CisgICAgICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXF1b3RlX2V4cHJlc3Npb25FeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWM7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgIE1BVENIVChSQ1VSTFlfUEVSQ0VOVCwgJkZPTExPV19SQ1VSTFlfUEVSQ0VOVF9pbl9xdW90ZV9leHByZXNzaW9uMjI1NDApOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVxdW90ZV9leHByZXNzaW9uRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgYWM9IE5FV19TVE1UMShPUChRVU9URSksIAorICAgICAgICAgICAgICAgIGUKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZXF1b3RlX2V4cHJlc3Npb25FeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVxdW90ZV9leHByZXNzaW9uRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgyMzQsIHF1b3RlX2V4cHJlc3Npb25fU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiBhYzsKK30KKy8qICRBTlRMUiBlbmQgcXVvdGVfZXhwcmVzc2lvbiAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBtZXRhX2V2YWxfZXhwcmVzc2lvbgorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjI4NjoxOiBtZXRhX2V2YWxfZXhwcmVzc2lvbiByZXR1cm5zIFsgc2VwOjpCRkNvZGUgYWMgXSA6IExCUkFDS0VUX0JBUiBlPSBleHByZXNzaW9uIEJBUl9SQlJBQ0tFVCA7CisgKi8KK3N0YXRpYyBzZXA6OkJGQ29kZQorbWV0YV9ldmFsX2V4cHJlc3Npb24ocGZtbFBhcnNlciBjdHgpCit7CisgICAgc2VwOjpCRkNvZGUgYWM7CisKKyAgICBBTlRMUjNfVUlOVDMyIG1ldGFfZXZhbF9leHByZXNzaW9uX1N0YXJ0SW5kZXg7CisKKyAgICBzZXA6OkJGIGU7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2UKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIG1ldGFfZXZhbF9leHByZXNzaW9uX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDIzNSkpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gYWM7CisgICAgfQorCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2Mjg4OjI6ICggTEJSQUNLRVRfQkFSIGU9IGV4cHJlc3Npb24gQkFSX1JCUkFDS0VUICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjI4ODo0OiBMQlJBQ0tFVF9CQVIgZT0gZXhwcmVzc2lvbiBCQVJfUkJSQUNLRVQKKyAgICAgICAgeworICAgICAgICAgICAgIE1BVENIVChMQlJBQ0tFVF9CQVIsICZGT0xMT1dfTEJSQUNLRVRfQkFSX2luX21ldGFfZXZhbF9leHByZXNzaW9uMjI1NTkpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVtZXRhX2V2YWxfZXhwcmVzc2lvbkV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX21ldGFfZXZhbF9leHByZXNzaW9uMjI1NjQpOworICAgICAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVtZXRhX2V2YWxfZXhwcmVzc2lvbkV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhYzsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgTUFUQ0hUKEJBUl9SQlJBQ0tFVCwgJkZPTExPV19CQVJfUkJSQUNLRVRfaW5fbWV0YV9ldmFsX2V4cHJlc3Npb24yMjU2Nyk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZW1ldGFfZXZhbF9leHByZXNzaW9uRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFjOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgYWM9IE5FV19TVE1UMShPUChNRVRBX0VWQUwpLCAKKyAgICAgICAgICAgICAgICBlCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVtZXRhX2V2YWxfZXhwcmVzc2lvbkV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZW1ldGFfZXZhbF9leHByZXNzaW9uRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgyMzUsIG1ldGFfZXZhbF9leHByZXNzaW9uX1N0YXJ0SW5kZXgpOyB9CisKKyAgICByZXR1cm4gYWM7Cit9CisvKiAkQU5UTFIgZW5kIG1ldGFfZXZhbF9leHByZXNzaW9uICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IHByaW1hcnkKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYzNjY6MTogcHJpbWFyeSByZXR1cm5zIFsgc2VwOjpCRiBiZiBdIDogKGlkPSBJRCAoICggTFBBUkVOICk9PnA9IHByaW1hcnlfaW52b2tlWyBTVFIoJGlkLnRleHQtPmNoYXJzKSBdIHwgKCBET1QgfCBMQlJBQ0tFVCApPT5wPSBwcmltYXJ5X3VmaWRbIFNUUigkaWQudGV4dC0+Y2hhcnMpIF0gfCAoIENPTE9OeDIgKT0+cD0gcHJpbWFyeV91ZmlbIFNUUigkaWQudGV4dC0+Y2hhcnMpIF0gKT8gfHA9IHByaW1hcnlfdWZpWyBcIlwiIF0gKTsKKyAqLworc3RhdGljIHNlcDo6QkYKK3ByaW1hcnkocGZtbFBhcnNlciBjdHgpCit7CisgICAgc2VwOjpCRiBiZjsKKworICAgIEFOVExSM19VSU5UMzIgcHJpbWFyeV9TdGFydEluZGV4OworCisgICAgcEFOVExSM19DT01NT05fVE9LRU4gICAgaWQ7CisgICAgc2VwOjpCRiBwOworICAgICN1bmRlZglSRVRVUk5fVFlQRV9wCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9wIHNlcDo6QkYKKworICAgIC8qIEluaXRpYWxpemUgcnVsZSB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBwcmltYXJ5X1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDIzNikpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gYmY7CisgICAgfQorCisgICAgaWQgICAgICAgPSBOVUxMOworCisgICAgeworICAgICAgICB7CisgICAgICAgICAgICAvLyAgL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjM2ODoyOiAoaWQ9IElEICggKCBMUEFSRU4gKT0+cD0gcHJpbWFyeV9pbnZva2VbIFNUUigkaWQudGV4dC0+Y2hhcnMpIF0gfCAoIERPVCB8IExCUkFDS0VUICk9PnA9IHByaW1hcnlfdWZpZFsgU1RSKCRpZC50ZXh0LT5jaGFycykgXSB8ICggQ09MT054MiApPT5wPSBwcmltYXJ5X3VmaVsgU1RSKCRpZC50ZXh0LT5jaGFycykgXSApPyB8cD0gcHJpbWFyeV91ZmlbIFwiXCIgXSApCisKKyAgICAgICAgICAgIEFOVExSM19VSU5UMzIgYWx0NTE3OworCisgICAgICAgICAgICBhbHQ1MTc9MjsKKworICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDUxNz0xOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ09MT054MjoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDUxNz0yOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDUxNzsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXByaW1hcnlFeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDUxNykKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MzY4OjQ6IGlkPSBJRCAoICggTFBBUkVOICk9PnA9IHByaW1hcnlfaW52b2tlWyBTVFIoJGlkLnRleHQtPmNoYXJzKSBdIHwgKCBET1QgfCBMQlJBQ0tFVCApPT5wPSBwcmltYXJ5X3VmaWRbIFNUUigkaWQudGV4dC0+Y2hhcnMpIF0gfCAoIENPTE9OeDIgKT0+cD0gcHJpbWFyeV91ZmlbIFNUUigkaWQudGV4dC0+Y2hhcnMpIF0gKT8KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIGlkID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoSUQsICZGT0xMT1dfSURfaW5fcHJpbWFyeTIyNTk0KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlcHJpbWFyeUV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MzY5OjQ6ICggKCBMUEFSRU4gKT0+cD0gcHJpbWFyeV9pbnZva2VbIFNUUigkaWQudGV4dC0+Y2hhcnMpIF0gfCAoIERPVCB8IExCUkFDS0VUICk9PnA9IHByaW1hcnlfdWZpZFsgU1RSKCRpZC50ZXh0LT5jaGFycykgXSB8ICggQ09MT054MiApPT5wPSBwcmltYXJ5X3VmaVsgU1RSKCRpZC50ZXh0LT5jaGFycykgXSApPworICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0NTE2PTQ7CisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgaW50IExBNTE2XzAgPSBMQSgxKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICBpZiAoIChMQTUxNl8wID09IExQQVJFTikpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE1MTZfMSA9IExBKDIpOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEwMjdfZm1sKGN0eCkpKQorICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDUxNj0xOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc3lucHJlZDEwMjlfZm1sKGN0eCkpICYmIChMQTUxNl8wID09IERPVCkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICBhbHQ1MTY9MjsKKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTUxNl8wID09IExCUkFDS0VUKSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTUxNl8zID0gTEEoMik7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTAyOV9mbWwoY3R4KSkpCisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0NTE2PTI7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTUxNl8wID09IENPTE9OeDIpKQorICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBNTE2XzQgPSBMQSgyKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMDMwX2ZtbChjdHgpKSkKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ1MTY9MzsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0NTE2KQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYzNjk6NjogKCBMUEFSRU4gKT0+cD0gcHJpbWFyeV9pbnZva2VbIFNUUigkaWQudGV4dC0+Y2hhcnMpIF0KKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3ByaW1hcnlfaW52b2tlX2luX3ByaW1hcnkyMjYxOSk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHA9cHJpbWFyeV9pbnZva2UoY3R4LCBTVFIoKGlkLT5nZXRUZXh0KGlkKSktPmNoYXJzKSk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXByaW1hcnlFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgYmY9IAorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcAorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MzcyOjY6ICggRE9UIHwgTEJSQUNLRVQgKT0+cD0gcHJpbWFyeV91ZmlkWyBTVFIoJGlkLnRleHQtPmNoYXJzKSBdCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19wcmltYXJ5X3VmaWRfaW5fcHJpbWFyeTIyNjQ5KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgcD1wcmltYXJ5X3VmaWQoY3R4LCBTVFIoKGlkLT5nZXRUZXh0KGlkKSktPmNoYXJzKSk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXByaW1hcnlFeDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgYmY9IAorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcAorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgMzoKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2Mzc0OjY6ICggQ09MT054MiApPT5wPSBwcmltYXJ5X3VmaVsgU1RSKCRpZC50ZXh0LT5jaGFycykgXQorICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfcHJpbWFyeV91ZmlfaW5fcHJpbWFyeTIyNjgxKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgcD1wcmltYXJ5X3VmaShjdHgsIFNUUigoaWQtPmdldFRleHQoaWQpKS0+Y2hhcnMpKTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlcHJpbWFyeUV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICBiZj0gCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBwCisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICA7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKworICAgICAgICAJICAgICAgICAgICAgCQlpZiggYmYKKyAgICAgICAgCSAgICAgICAgICAgIC5pbnZhbGlkKCkgKQorICAgICAgICAJICAgICAgICAgICAgCQl7CisgICAgICAgIAkgICAgICAgICAgICAJCQlpZiggKGJmPSBzZXA6OlBhcnNlclV0aWw6OmdldE9iamVjdEJ5TmFtZUlEKAorICAgICAgICAJICAgICAgICAgICAgCQkJCQlTVFIoKGlkLT5nZXRUZXh0KGlkKSktPmNoYXJzKSkpLmludmFsaWQoKSApCisgICAgICAgIAkgICAgICAgICAgICAJCQl7CisgICAgICAgIAkgICAgICAgICAgICAJCQkgIAkKKyAgICAgICAgCSAgICAgICAgICAgIGJmCisgICAgICAgIAkgICAgICAgICAgICAgPSBORVdfSUQoIFNUUigoaWQtPmdldFRleHQoaWQpKS0+Y2hhcnMpKTsKKworICAgICAgICAJICAgICAgICAgICAgCQkJfQorICAgICAgICAJICAgICAgICAgICAgCQl9CisgICAgICAgIAkgICAgICAgICAgICAJICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDI6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjM4ODo0OiBwPSBwcmltYXJ5X3VmaVsgXCJcIiBdCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19wcmltYXJ5X3VmaV9pbl9wcmltYXJ5MjI3MDgpOworICAgICAgICAJICAgICAgICBwPXByaW1hcnlfdWZpKGN0eCwgIiIpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVwcmltYXJ5RXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGJmPSAKKyAgICAgICAgCSAgICAgICAgICAgIHAKKyAgICAgICAgCSAgICAgICAgICAgIDsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZXByaW1hcnlFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHJ1bGVwcmltYXJ5RXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgyMzYsIHByaW1hcnlfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiBiZjsKK30KKy8qICRBTlRMUiBlbmQgcHJpbWFyeSAqLworCisvKioKKyAqICRBTlRMUiBzdGFydCBwcmltYXJ5X3VmaWQKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYzOTI6MTogcHJpbWFyeV91ZmlkWyBjb25zdCBzdGQ6OnN0cmluZyAmIG1haW5JZCBdIHJldHVybnMgWyBzZXA6OkJGIGJmIF0gOiAoICggRE9UIGlkPSBJRCApIHwgKCBMQlJBQ0tFVCBlPSBleHByZXNzaW9uIFJCUkFDS0VUICkgKSsgOworICovCitzdGF0aWMgc2VwOjpCRgorcHJpbWFyeV91ZmlkKHBmbWxQYXJzZXIgY3R4LCBjb25zdCBzdGQ6OnN0cmluZyAmIG1haW5JZCkKK3sKKyAgICBzZXA6OkJGIGJmOworCisgICAgQU5UTFIzX1VJTlQzMiBwcmltYXJ5X3VmaWRfU3RhcnRJbmRleDsKKworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIGlkOworICAgIHNlcDo6QkYgZTsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfZQorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfZSBzZXA6OkJGCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgcHJpbWFyeV91ZmlkX1N0YXJ0SW5kZXggPSBJTkRFWCgpOworCisKKworICAgIAlzZXA6OlVuaUZvcm1JZGVudGlmaWVyICogdWZpID0gbmV3IHNlcDo6VW5pRm9ybUlkZW50aWZpZXIoZmFsc2UpOworICAgIAlzZXA6OkJGIGJmVWZpKCB1ZmkgKTsvLyBmb3IgYXV0b21hdGljIGRlc3RydWN0aW9uIG9mIDw8IFVGSSA+PiBpZiBuZWVkCisKKyAgICAJaWYoIChiZj0gc2VwOjpQYXJzZXJVdGlsOjpnZXRPYmplY3RCeU5hbWVJRChtYWluSWQpKS52YWxpZCgpICkKKyAgICAJeworICAgIAkgIAl1ZmktPmFwcGVuZEZpZWxkKCAKKyAgICBiZgorICAgICApOworCisgICAgCX0KKyAgICAJZWxzZQorICAgIAl7CisgICAgCSAgCXVmaS0+YXBwZW5kRmllbGQoIG1haW5JZCApOworICAgIAl9CisKKyAgICAJYmY9IGJmVWZpOworCisKKyAgICAJc2VwOjphdm1fc2l6ZV90IGNvdW50SUQgPSAxOworICAgIAlib29sIGlzbm90RVhQUiAgPSB0cnVlOworCisgICAgCVNBVkVfUlVMRV9CRUdJTl9MT0NBVElPTjsKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMjM3KSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiBiZjsKKyAgICB9CisKKyAgICBpZCAgICAgICA9IE5VTEw7CisKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY0MTQ6MjogKCAoICggRE9UIGlkPSBJRCApIHwgKCBMQlJBQ0tFVCBlPSBleHByZXNzaW9uIFJCUkFDS0VUICkgKSsgKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NDE0OjQ6ICggKCBET1QgaWQ9IElEICkgfCAoIExCUkFDS0VUIGU9IGV4cHJlc3Npb24gUkJSQUNLRVQgKSApKworICAgICAgICB7CisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NDE0OjQ6ICggKCBET1QgaWQ9IElEICkgfCAoIExCUkFDS0VUIGU9IGV4cHJlc3Npb24gUkJSQUNLRVQgKSApKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBjbnQ1MTg9MDsKKworICAgICAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgYWx0NTE4PTM7CisgICAgICAgICAgICAJc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAljYXNlIERPVDoKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkJYWx0NTE4PTE7CisgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSBMQlJBQ0tFVDoKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkJeworICAgICAgICAgICAgCQkJICAgLyogZGZhTG9vcGJhY2tTdGF0ZShrLGVkZ2VzLGVvdFByZWRpY3RzQWx0LGRlc2NyaXB0aW9uLHN0YXRlTnVtYmVyLHNlbVByZWRTdGF0ZSkKKyAgICAgICAgICAgIAkJCSAgICAqLworICAgICAgICAgICAgCQkJICAgIGludCBMQTUxOF8yID0gTEEoMik7CisgICAgICAgICAgICAJCQkgICAgaWYgKCAoc3lucHJlZDEwMzNfZm1sKGN0eCkpKQorICAgICAgICAgICAgCQkJICAgIHsKKyAgICAgICAgICAgIAkJCSAgICAgICAgYWx0NTE4PTI7CisgICAgICAgICAgICAJCQkgICAgfQorCisgICAgICAgICAgICAJCQl9CisgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAl9CisKKyAgICAgICAgICAgIAlzd2l0Y2ggKGFsdDUxOCkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgIGNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY0MTQ6NjogKCBET1QgaWQ9IElEICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NDE0OjY6ICggRE9UIGlkPSBJRCApCisgICAgICAgICAgICAJICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjQxNDo4OiBET1QgaWQ9IElECisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgTUFUQ0hUKERPVCwgJkZPTExPV19ET1RfaW5fcHJpbWFyeV91ZmlkMjI3MzgpOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBnb3RvIHJ1bGVwcmltYXJ5X3VmaWRFeDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgaWQgPSAocEFOVExSM19DT01NT05fVE9LRU4pIE1BVENIVChJRCwgJkZPTExPV19JRF9pbl9wcmltYXJ5X3VmaWQyMjc0Mik7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGdvdG8gcnVsZXByaW1hcnlfdWZpZEV4OworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICB1ZmktPmFwcGVuZEZpZWxkKCBTVFIoKGlkLT5nZXRUZXh0KGlkKSktPmNoYXJzKSApOyAgKytjb3VudElEOyAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAJICAgIGNhc2UgMjoKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY0MTc6NjogKCBMQlJBQ0tFVCBlPSBleHByZXNzaW9uIFJCUkFDS0VUICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NDE3OjY6ICggTEJSQUNLRVQgZT0gZXhwcmVzc2lvbiBSQlJBQ0tFVCApCisgICAgICAgICAgICAJICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjQxNzo4OiBMQlJBQ0tFVCBlPSBleHByZXNzaW9uIFJCUkFDS0VUCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgTUFUQ0hUKExCUkFDS0VULCAmRk9MTE9XX0xCUkFDS0VUX2luX3ByaW1hcnlfdWZpZDIyNzYxKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgZ290byBydWxlcHJpbWFyeV91ZmlkRXg7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fcHJpbWFyeV91ZmlkMjI3NjYpOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgZ290byBydWxlcHJpbWFyeV91ZmlkRXg7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICBNQVRDSFQoUkJSQUNLRVQsICZGT0xMT1dfUkJSQUNLRVRfaW5fcHJpbWFyeV91ZmlkMjI3NjkpOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBnb3RvIHJ1bGVwcmltYXJ5X3VmaWRFeDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgdWZpLT5hcHBlbmRJbmRleCggZQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICk7ICBpc25vdEVYUFIgPSBmYWxzZTsgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgIGRlZmF1bHQ6CisKKyAgICAgICAgICAgIAkJaWYgKCBjbnQ1MTggPj0gMSApCisgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgIAkJICAgIGdvdG8gbG9vcDUxODsKKyAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgCQlpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgIAkJICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgIAkJICAgIHJldHVybiBiZjsKKyAgICAgICAgICAgIAkJfQorCisgICAgICAgICAgICAJCS8qIG1pc21hdGNoZWRTZXRFeCgpCisgICAgICAgICAgICAJCSAqLworICAgICAgICAgICAgCQlDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgCQlFWENFUFRJT04tPnR5cGUgPSBBTlRMUjNfRUFSTFlfRVhJVF9FWENFUFRJT047CisgICAgICAgICAgICAJCUVYQ0VQVElPTi0+bmFtZSA9ICh2b2lkICopQU5UTFIzX0VBUkxZX0VYSVRfTkFNRTsKKworCisgICAgICAgICAgICAJCWdvdG8gcnVsZXByaW1hcnlfdWZpZEV4OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAljbnQ1MTgrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9vcDUxODogOwkvKiBKdW1wIHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIAkJaWYoIGlzbm90RVhQUiApCisgICAgICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAgICAgCQkJaWYoIChiZj0gc2VwOjpQYXJzZXJVdGlsOjpnZXR2YXIodWZpLT5zdHIoKSwgY291bnRJRCkpLmludmFsaWQoKSApCisgICAgICAgICAgICAgICAgCQkJeworICAgICAgICAgICAgICAgIAkJCQkKKyAgICAgICAgICAgICAgICBiZgorICAgICAgICAgICAgICAgICA9IGJmVWZpOworCisgICAgICAgICAgICAgICAgCQkJCVNFVF9SVUxFX0xPQ0FUSU9OKCB1ZmkgKTsKKyAgICAgICAgICAgICAgICAJCQl9CisgICAgICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAgICAgCQorICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlcHJpbWFyeV91ZmlkRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlcHJpbWFyeV91ZmlkRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgyMzcsIHByaW1hcnlfdWZpZF9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIGJmOworfQorLyogJEFOVExSIGVuZCBwcmltYXJ5X3VmaWQgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgcHJpbWFyeV91ZmkKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY0MzU6MTogcHJpbWFyeV91ZmlbIGNvbnN0IHN0ZDo6c3RyaW5nICYgbG9jYXRvcklkIF0gcmV0dXJucyBbIHNlcDo6QkYgYmYgXSA6IENPTE9OeDIgaWQ9IElEICggKCBET1QgaWQ9IElEICkgfCAoIExCUkFDS0VUIGU9IGV4cHJlc3Npb24gUkJSQUNLRVQgKSApKyA7CisgKi8KK3N0YXRpYyBzZXA6OkJGCitwcmltYXJ5X3VmaShwZm1sUGFyc2VyIGN0eCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBsb2NhdG9ySWQpCit7CisgICAgc2VwOjpCRiBiZjsKKworICAgIEFOVExSM19VSU5UMzIgcHJpbWFyeV91ZmlfU3RhcnRJbmRleDsKKworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIGlkOworICAgIHNlcDo6QkYgZTsKKyAgICAjdW5kZWYJUkVUVVJOX1RZUEVfZQorICAgICNkZWZpbmUJUkVUVVJOX1RZUEVfZSBzZXA6OkJGCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgcHJpbWFyeV91ZmlfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworCisgICAgCXNlcDo6VW5pRm9ybUlkZW50aWZpZXIgKiB1ZmkgPQorICAgIAkJCW5ldyBzZXA6OlVuaUZvcm1JZGVudGlmaWVyKG5vdCBsb2NhdG9ySWQuZW1wdHkoKSk7CisgICAgCXNlcDo6QkYgYmZVZmkoIHVmaSApOy8vIGZvciBhdXRvbWF0aWMgZGVzdHJ1Y3Rpb24gb2YgPDwgVUZJID4+IGlmIG5lZWQKKworICAgIAlpZiggbm90IGxvY2F0b3JJZC5lbXB0eSgpICkKKyAgICAJeworICAgIAkJdWZpLT5zZXRMb2NhdG9yKCBsb2NhdG9ySWQgKTsKKyAgICAJfQorCisgICAgCWJmPSBiZlVmaTsKKworCisgICAgCXNlcDo6YXZtX3NpemVfdCBjb3VudElEID0gMTsKKyAgICAJYm9vbCBpc25vdEVYUFIgID0gdHJ1ZTsKKworICAgIAlTQVZFX1JVTEVfQkVHSU5fTE9DQVRJT047CisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDIzOCkpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gYmY7CisgICAgfQorCisgICAgaWQgICAgICAgPSBOVUxMOworCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NDU0OjI6ICggQ09MT054MiBpZD0gSUQgKCAoIERPVCBpZD0gSUQgKSB8ICggTEJSQUNLRVQgZT0gZXhwcmVzc2lvbiBSQlJBQ0tFVCApICkrICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjQ1NDo0OiBDT0xPTngyIGlkPSBJRCAoICggRE9UIGlkPSBJRCApIHwgKCBMQlJBQ0tFVCBlPSBleHByZXNzaW9uIFJCUkFDS0VUICkgKSsKKyAgICAgICAgeworICAgICAgICAgICAgIE1BVENIVChDT0xPTngyLCAmRk9MTE9XX0NPTE9OeDJfaW5fcHJpbWFyeV91ZmkyMjgxNSk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXByaW1hcnlfdWZpRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlkID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoSUQsICZGT0xMT1dfSURfaW5fcHJpbWFyeV91ZmkyMjgxOSk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXByaW1hcnlfdWZpRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIAkJaWYoIChiZj0gc2VwOjpQYXJzZXJVdGlsOjpnZXRPYmplY3RCeU5hbWVJRChTVFIoKGlkLT5nZXRUZXh0KGlkKSktPmNoYXJzKSkpLnZhbGlkKCkgKQorICAgICAgICAgICAgICAgIAkJeworICAgICAgICAgICAgICAgIAkJICAJdWZpLT5hcHBlbmRGaWVsZCggCisgICAgICAgICAgICAgICAgYmYKKyAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgICAgIAkJZWxzZQorICAgICAgICAgICAgICAgIAkJeworICAgICAgICAgICAgICAgIAkJICAJdWZpLT5hcHBlbmRGaWVsZCggU1RSKChpZC0+Z2V0VGV4dChpZCkpLT5jaGFycykgKTsKKyAgICAgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgICAgICAJICAKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NDY2OjQ6ICggKCBET1QgaWQ9IElEICkgfCAoIExCUkFDS0VUIGU9IGV4cHJlc3Npb24gUkJSQUNLRVQgKSApKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBjbnQ1MTk9MDsKKworICAgICAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgYWx0NTE5PTM7CisgICAgICAgICAgICAJc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAljYXNlIERPVDoKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkJYWx0NTE5PTE7CisgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSBMQlJBQ0tFVDoKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkJeworICAgICAgICAgICAgCQkJICAgLyogZGZhTG9vcGJhY2tTdGF0ZShrLGVkZ2VzLGVvdFByZWRpY3RzQWx0LGRlc2NyaXB0aW9uLHN0YXRlTnVtYmVyLHNlbVByZWRTdGF0ZSkKKyAgICAgICAgICAgIAkJCSAgICAqLworICAgICAgICAgICAgCQkJICAgIGludCBMQTUxOV8yID0gTEEoMik7CisgICAgICAgICAgICAJCQkgICAgaWYgKCAoc3lucHJlZDEwMzVfZm1sKGN0eCkpKQorICAgICAgICAgICAgCQkJICAgIHsKKyAgICAgICAgICAgIAkJCSAgICAgICAgYWx0NTE5PTI7CisgICAgICAgICAgICAJCQkgICAgfQorCisgICAgICAgICAgICAJCQl9CisgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAl9CisKKyAgICAgICAgICAgIAlzd2l0Y2ggKGFsdDUxOSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgIGNhc2UgMToKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY0NjY6NjogKCBET1QgaWQ9IElEICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NDY2OjY6ICggRE9UIGlkPSBJRCApCisgICAgICAgICAgICAJICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjQ2Njo4OiBET1QgaWQ9IElECisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgTUFUQ0hUKERPVCwgJkZPTExPV19ET1RfaW5fcHJpbWFyeV91ZmkyMjgzNCk7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGdvdG8gcnVsZXByaW1hcnlfdWZpRXg7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGlkID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoSUQsICZGT0xMT1dfSURfaW5fcHJpbWFyeV91ZmkyMjgzOCk7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGdvdG8gcnVsZXByaW1hcnlfdWZpRXg7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgIHVmaS0+YXBwZW5kRmllbGQoIFNUUigoaWQtPmdldFRleHQoaWQpKS0+Y2hhcnMpICk7ICArK2NvdW50SUQ7IAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAkgICAgY2FzZSAyOgorICAgICAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjQ2OTo2OiAoIExCUkFDS0VUIGU9IGV4cHJlc3Npb24gUkJSQUNLRVQgKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY0Njk6NjogKCBMQlJBQ0tFVCBlPSBleHByZXNzaW9uIFJCUkFDS0VUICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NDY5Ojg6IExCUkFDS0VUIGU9IGV4cHJlc3Npb24gUkJSQUNLRVQKKyAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICBNQVRDSFQoTEJSQUNLRVQsICZGT0xMT1dfTEJSQUNLRVRfaW5fcHJpbWFyeV91ZmkyMjg1Nyk7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGdvdG8gcnVsZXByaW1hcnlfdWZpRXg7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fcHJpbWFyeV91ZmkyMjg2Mik7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBnb3RvIHJ1bGVwcmltYXJ5X3VmaUV4OworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgTUFUQ0hUKFJCUkFDS0VULCAmRk9MTE9XX1JCUkFDS0VUX2luX3ByaW1hcnlfdWZpMjI4NjUpOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBnb3RvIHJ1bGVwcmltYXJ5X3VmaUV4OworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICB1ZmktPmFwcGVuZEluZGV4KCBlCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgKTsgIGlzbm90RVhQUiA9IGZhbHNlOyAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgZGVmYXVsdDoKKworICAgICAgICAgICAgCQlpZiAoIGNudDUxOSA+PSAxICkKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkgICAgZ290byBsb29wNTE5OworICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAJCWlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgIAkJeworICAgICAgICAgICAgCQkgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgCQkgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCQl9CisKKyAgICAgICAgICAgIAkJLyogbWlzbWF0Y2hlZFNldEV4KCkKKyAgICAgICAgICAgIAkJICovCisgICAgICAgICAgICAJCUNPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAJCUVYQ0VQVElPTi0+dHlwZSA9IEFOVExSM19FQVJMWV9FWElUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIAkJRVhDRVBUSU9OLT5uYW1lID0gKHZvaWQgKilBTlRMUjNfRUFSTFlfRVhJVF9OQU1FOworCisKKyAgICAgICAgICAgIAkJZ290byBydWxlcHJpbWFyeV91ZmlFeDsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJY250NTE5Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxvb3A1MTk6IDsJLyogSnVtcCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAJCWlmKCBpc25vdEVYUFIgKQorICAgICAgICAgICAgICAgIAkJeworICAgICAgICAgICAgICAgIAkJCWlmKCAoYmY9IHNlcDo6UGFyc2VyVXRpbDo6Z2V0dmFyKHVmaS0+c3RyKCksIGNvdW50SUQpKS5pbnZhbGlkKCkgKQorICAgICAgICAgICAgICAgIAkJCXsKKyAgICAgICAgICAgICAgICAJCQkJCisgICAgICAgICAgICAgICAgYmYKKyAgICAgICAgICAgICAgICAgPSBiZlVmaTsKKworICAgICAgICAgICAgICAgIAkJCQlTRVRfUlVMRV9MT0NBVElPTiggdWZpICk7CisgICAgICAgICAgICAgICAgCQkJfQorICAgICAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgICAgIAkKKyAgICAgICAgICAgIH0KKworCisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKyAgICAvLworICAgIGdvdG8gcnVsZXByaW1hcnlfdWZpRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlcHJpbWFyeV91ZmlFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDIzOCwgcHJpbWFyeV91ZmlfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiBiZjsKK30KKy8qICRBTlRMUiBlbmQgcHJpbWFyeV91ZmkgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgcHJpbWFyeV9pbnZva2UKKyAqIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY0ODY6MTogcHJpbWFyeV9pbnZva2VbIGNvbnN0IHN0ZDo6c3RyaW5nICYgbWFpbklkIF0gcmV0dXJucyBbIHNlcDo6QkYgYmYgXSA6IExQQVJFTiAobHA9IGxhYmVsbGVkX2FyZ3VtZW50ICggQ09NTUEgbHA9IGxhYmVsbGVkX2FyZ3VtZW50ICkqICk/IFJQQVJFTiA7CisgKi8KK3N0YXRpYyBzZXA6OkJGCitwcmltYXJ5X2ludm9rZShwZm1sUGFyc2VyIGN0eCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBtYWluSWQpCit7CisgICAgc2VwOjpCRiBiZjsKKworICAgIEFOVExSM19VSU5UMzIgcHJpbWFyeV9pbnZva2VfU3RhcnRJbmRleDsKKworICAgIGZtbFBhcnNlcl9sYWJlbGxlZF9hcmd1bWVudF9yZXR1cm4gbHA7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2xwCisgICAgI2RlZmluZQlSRVRVUk5fVFlQRV9scCBmbWxQYXJzZXJfbGFiZWxsZWRfYXJndW1lbnRfcmV0dXJuCisKKyAgICAvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgICAgICovCisgICAgcHJpbWFyeV9pbnZva2VfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworCisgICAgCXNlcDo6Um91dGluZSAqIGludm9rZVJvdXRpbmUgPSBzZXA6OlJvdXRpbmU6Om5ld0ludm9rZSggX0NQUk1TXywgbWFpbklkKTsKKworICAgIAlpbnZva2VSb3V0aW5lLT5zZXRNb2RlbCggc2VwOjpQYXJzZXJVdGlsOjpnZXR2YXJSb3V0aW5lKG1haW5JZCkgKTsKKworICAgIAlTQVZFX1JVTEVfQkVHSU5fTE9DQVRJT047CisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDIzOSkpICkKKyAgICB7CisgICAgICAgIHsKKworICAgICAgICAgICAgCVNFVF9SVUxFX0xPQ0FUSU9OKCBpbnZva2VSb3V0aW5lICk7CisKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIGJmOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjQ5OToyOiAoIExQQVJFTiAobHA9IGxhYmVsbGVkX2FyZ3VtZW50ICggQ09NTUEgbHA9IGxhYmVsbGVkX2FyZ3VtZW50ICkqICk/IFJQQVJFTiApCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY0OTk6NDogTFBBUkVOIChscD0gbGFiZWxsZWRfYXJndW1lbnQgKCBDT01NQSBscD0gbGFiZWxsZWRfYXJndW1lbnQgKSogKT8gUlBBUkVOCisgICAgICAgIHsKKyAgICAgICAgICAgICBNQVRDSFQoTFBBUkVOLCAmRk9MTE9XX0xQQVJFTl9pbl9wcmltYXJ5X2ludm9rZTIyOTE1KTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlcHJpbWFyeV9pbnZva2VFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjUwMDo0OiAobHA9IGxhYmVsbGVkX2FyZ3VtZW50ICggQ09NTUEgbHA9IGxhYmVsbGVkX2FyZ3VtZW50ICkqICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFsdDUyMT0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQk5PVDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPTngyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJMaXRlcmFsOgorICAgICAgICAgICAgICAgICAgICBjYXNlIERFQ1I6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRE9MTEFSX0xDVVJMWToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGbG9hdExpdGVyYWw6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSUQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSU5DUjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBJbnRlZ2VyTGl0ZXJhbDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMQlJBQ0tFVDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMQlJBQ0tFVF9CQVI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTENVUkxZOgorICAgICAgICAgICAgICAgICAgICBjYXNlIExOT1Q6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTFBBUkVOOgorICAgICAgICAgICAgICAgICAgICBjYXNlIExQQVJFTl9JTlZPS0U6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTUlOVVM6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BfUE9QOgorICAgICAgICAgICAgICAgICAgICBjYXNlIE9QX1RPUDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBQRVJDRU5UX0xDVVJMWToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBQTFVTOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFJhdGlvbmFsTGl0ZXJhbDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTdHJpbmdMaXRlcmFsOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDE1ODoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTk6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTYwOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDE2MToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjM3OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDI1NjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNjU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjc3OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDI4MDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOTQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzEzOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDMzMDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzMzE6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzMyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM0MzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzNDc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzcyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDM5NzoKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQ1MjE9MTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NTIxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY1MDA6NjogbHA9IGxhYmVsbGVkX2FyZ3VtZW50ICggQ09NTUEgbHA9IGxhYmVsbGVkX2FyZ3VtZW50ICkqCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2xhYmVsbGVkX2FyZ3VtZW50X2luX3ByaW1hcnlfaW52b2tlMjI5MjQpOworICAgICAgICAgICAgCSAgICAgICAgbHA9bGFiZWxsZWRfYXJndW1lbnQoY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXByaW1hcnlfaW52b2tlRXg7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIAkgICAgCWludm9rZVJvdXRpbmUtPmFwcGVuZFBhcmFtZXRlcihscC5sYWJlbAorICAgICAgICAgICAgCSAgICAgICAgICAgICwgbHAuYXJnCisgICAgICAgICAgICAJICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY1MDQ6NjogKCBDT01NQSBscD0gbGFiZWxsZWRfYXJndW1lbnQgKSoKKworICAgICAgICAgICAgCSAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0NTIwPTI7CisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIENPTU1BOgorICAgICAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgICAgICAgICAgCQlhbHQ1MjA9MTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0NTIwKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY1MDQ6ODogQ09NTUEgbHA9IGxhYmVsbGVkX2FyZ3VtZW50CisgICAgICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoQ09NTUEsICZGT0xMT1dfQ09NTUFfaW5fcHJpbWFyeV9pbnZva2UyMjk0MCk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXByaW1hcnlfaW52b2tlRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2xhYmVsbGVkX2FyZ3VtZW50X2luX3ByaW1hcnlfaW52b2tlMjI5NDkpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgbHA9bGFiZWxsZWRfYXJndW1lbnQoY3R4KTsKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXByaW1hcnlfaW52b2tlRXg7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIAkgICAgCWludm9rZVJvdXRpbmUtPmFwcGVuZFBhcmFtZXRlcihscC5sYWJlbAorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICwgbHAuYXJnCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICAgICAgCWRlZmF1bHQ6CisgICAgICAgICAgICAJICAgICAgICAJICAgIGdvdG8gbG9vcDUyMDsJLyogYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGxvb3A1MjA6IDsgLyogSnVtcCBvdXQgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICBNQVRDSFQoUlBBUkVOLCAmRk9MTE9XX1JQQVJFTl9pbl9wcmltYXJ5X2ludm9rZTIyOTc1KTsKKyAgICAgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBydWxlcHJpbWFyeV9pbnZva2VFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBiZj0gc2VwOjpQYXJzZXJVdGlsOjppbnZva2VSb3V0aW5lRXhwcmVzc2lvbihpbnZva2VSb3V0aW5lKTsKKyAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisgICAgLy8KKyAgICBnb3RvIHJ1bGVwcmltYXJ5X2ludm9rZUV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZXByaW1hcnlfaW52b2tlRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIAlTRVRfUlVMRV9MT0NBVElPTiggaW52b2tlUm91dGluZSApOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisKKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDIzOSwgcHJpbWFyeV9pbnZva2VfU3RhcnRJbmRleCk7IH0KKworICAgIHJldHVybiBiZjsKK30KKy8qICRBTlRMUiBlbmQgcHJpbWFyeV9pbnZva2UgKi8KKworLyoqCisgKiAkQU5UTFIgc3RhcnQgbGl0ZXJhbAorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjUxNzoxOiBsaXRlcmFsIHJldHVybnMgWyBzZXA6OkJGIGJmIF0gOiAoIEludGVnZXJMaXRlcmFsIHwgUmF0aW9uYWxMaXRlcmFsIHwgRmxvYXRMaXRlcmFsIHwgQ2hhckxpdGVyYWwgfCBTdHJpbmdMaXRlcmFsIHwgJ3RydWUnIHwgJ2ZhbHNlJyB8ICdzZWxmJyB8ICdwYXJlbnQnIHwgJ2VudicgfCAnJHRoaXMnIHwgJyRzZWxmJyB8ICckcGFyZW50JyB8ICckc3VwZXInIHwgJyRlbnYnIHwgJ251bGw8JyAoICdtYWNoaW5lJyB8ICdjaGFubmVsJyB8ICdwb3J0JyB8ICdzaWduYWwnIHwgJ21lc3NhZ2UnIHwgJ2J1ZmZlcicgKSBHVCB8ICdudWxsJyApOworICovCitzdGF0aWMgc2VwOjpCRgorbGl0ZXJhbChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBzZXA6OkJGIGJmOworCisgICAgQU5UTFIzX1VJTlQzMiBsaXRlcmFsX1N0YXJ0SW5kZXg7CisKKyAgICBwQU5UTFIzX0NPTU1PTl9UT0tFTiAgICBJbnRlZ2VyTGl0ZXJhbDEzOworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIFJhdGlvbmFsTGl0ZXJhbDE0OworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIEZsb2F0TGl0ZXJhbDE1OworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIENoYXJMaXRlcmFsMTY7CisgICAgcEFOVExSM19DT01NT05fVE9LRU4gICAgU3RyaW5nTGl0ZXJhbDE3OworCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGxpdGVyYWxfU3RhcnRJbmRleCA9IElOREVYKCk7CisKKworICAgIGlmICggKEJBQ0tUUkFDS0lORz4wKSAmJiAoSEFWRVBBUlNFRFJVTEUoMjQwKSkgKQorICAgIHsKKyAgICAgICAgeworICAgICAgICB9CisKKworCisgICAgICAgIHJldHVybiBiZjsKKyAgICB9CisKKyAgICBJbnRlZ2VyTGl0ZXJhbDEzICAgICAgID0gTlVMTDsKKyAgICBSYXRpb25hbExpdGVyYWwxNCAgICAgICA9IE5VTEw7CisgICAgRmxvYXRMaXRlcmFsMTUgICAgICAgPSBOVUxMOworICAgIENoYXJMaXRlcmFsMTYgICAgICAgPSBOVUxMOworICAgIFN0cmluZ0xpdGVyYWwxNyAgICAgICA9IE5VTEw7CisKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vICAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NTE5OjI6ICggSW50ZWdlckxpdGVyYWwgfCBSYXRpb25hbExpdGVyYWwgfCBGbG9hdExpdGVyYWwgfCBDaGFyTGl0ZXJhbCB8IFN0cmluZ0xpdGVyYWwgfCAndHJ1ZScgfCAnZmFsc2UnIHwgJ3NlbGYnIHwgJ3BhcmVudCcgfCAnZW52JyB8ICckdGhpcycgfCAnJHNlbGYnIHwgJyRwYXJlbnQnIHwgJyRzdXBlcicgfCAnJGVudicgfCAnbnVsbDwnICggJ21hY2hpbmUnIHwgJ2NoYW5uZWwnIHwgJ3BvcnQnIHwgJ3NpZ25hbCcgfCAnbWVzc2FnZScgfCAnYnVmZmVyJyApIEdUIHwgJ251bGwnICkKKworICAgICAgICAgICAgQU5UTFIzX1VJTlQzMiBhbHQ1MjM7CisKKyAgICAgICAgICAgIGFsdDUyMz0xNzsKKworICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBJbnRlZ2VyTGl0ZXJhbDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDUyMz0xOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUmF0aW9uYWxMaXRlcmFsOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NTIzPTI7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGbG9hdExpdGVyYWw6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ1MjM9MzsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENoYXJMaXRlcmFsOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NTIzPTQ7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTdHJpbmdMaXRlcmFsOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NTIzPTU7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOTc6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ1MjM9NjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI4MDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDUyMz03OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzcyOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NTIzPTg7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzNDM6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ1MjM9OTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI3NzoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDUyMz0xMDsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE2MjoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDUyMz0xMTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE2MDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDUyMz0xMjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE1OToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDUyMz0xMzsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE2MToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDUyMz0xNDsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE1ODoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDUyMz0xNTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMzMjoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDUyMz0xNjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMzMToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDUyMz0xNzsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA1MjM7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVsaXRlcmFsRXg7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQ1MjMpCisgICAgICAgICAgICB7CisgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjUxOTo0OiBJbnRlZ2VyTGl0ZXJhbAorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgSW50ZWdlckxpdGVyYWwxMyA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTikgTUFUQ0hUKEludGVnZXJMaXRlcmFsLCAmRk9MTE9XX0ludGVnZXJMaXRlcmFsX2luX2xpdGVyYWwyMjk5Nyk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWxpdGVyYWxFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgYmY9IE5FV19JTlRFR0VSKFNUUigoSW50ZWdlckxpdGVyYWwxMy0+Z2V0VGV4dChJbnRlZ2VyTGl0ZXJhbDEzKSktPmNoYXJzKSk7CisgICAgICAgIAkgICAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDI6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjUyMDo0OiBSYXRpb25hbExpdGVyYWwKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIFJhdGlvbmFsTGl0ZXJhbDE0ID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSBNQVRDSFQoUmF0aW9uYWxMaXRlcmFsLCAmRk9MTE9XX1JhdGlvbmFsTGl0ZXJhbF9pbl9saXRlcmFsMjMwMDUpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVsaXRlcmFsRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGJmPSBORVdfUkFUSU9OQUwoU1RSKChSYXRpb25hbExpdGVyYWwxNC0+Z2V0VGV4dChSYXRpb25hbExpdGVyYWwxNCkpLT5jaGFycykpOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMzoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NTIxOjQ6IEZsb2F0TGl0ZXJhbAorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgRmxvYXRMaXRlcmFsMTUgPSAocEFOVExSM19DT01NT05fVE9LRU4pIE1BVENIVChGbG9hdExpdGVyYWwsICZGT0xMT1dfRmxvYXRMaXRlcmFsX2luX2xpdGVyYWwyMzAxMik7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWxpdGVyYWxFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgYmY9IE5FV19GTE9BVChTVFIoKEZsb2F0TGl0ZXJhbDE1LT5nZXRUZXh0KEZsb2F0TGl0ZXJhbDE1KSktPmNoYXJzKSk7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA0OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY1MjM6NDogQ2hhckxpdGVyYWwKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIENoYXJMaXRlcmFsMTYgPSAocEFOVExSM19DT01NT05fVE9LRU4pIE1BVENIVChDaGFyTGl0ZXJhbCwgJkZPTExPV19DaGFyTGl0ZXJhbF9pbl9saXRlcmFsMjMwMjMpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVsaXRlcmFsRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGJmPSBORVdfQ0hBUihTVFIoKENoYXJMaXRlcmFsMTYtPmdldFRleHQoQ2hhckxpdGVyYWwxNikpLT5jaGFycykpOworICAgICAgICAJICAgICAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDU6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjUyNDo0OiBTdHJpbmdMaXRlcmFsCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBTdHJpbmdMaXRlcmFsMTcgPSAocEFOVExSM19DT01NT05fVE9LRU4pIE1BVENIVChTdHJpbmdMaXRlcmFsLCAmRk9MTE9XX1N0cmluZ0xpdGVyYWxfaW5fbGl0ZXJhbDIzMDM0KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlbGl0ZXJhbEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBiZj0gTkVXX1NUUklORyhTVFIoKFN0cmluZ0xpdGVyYWwxNy0+Z2V0VGV4dChTdHJpbmdMaXRlcmFsMTcpKS0+Y2hhcnMpKTsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDY6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjUyNjo0OiAndHJ1ZScKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMzk3LCAmRk9MTE9XXzM5N19pbl9saXRlcmFsMjMwNDQpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVsaXRlcmFsRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGJmPSBORVdfQk9PTCh0cnVlKTsKKyAgICAgICAgCSAgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA3OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY1Mjc6NDogJ2ZhbHNlJworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgyODAsICZGT0xMT1dfMjgwX2luX2xpdGVyYWwyMzA1Myk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWxpdGVyYWxFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgYmY9IE5FV19CT09MKGZhbHNlKTsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDg6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjUyOTo0OiAnc2VsZicKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMzcyLCAmRk9MTE9XXzM3Ml9pbl9saXRlcmFsMjMwNjIpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVsaXRlcmFsRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGJmPSBzZXA6OkV4ZWN1dGFibGVMaWI6Ok1BQ0hJTkVfU0VMRjsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSA5OgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY1MzA6NDogJ3BhcmVudCcKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMzQzLCAmRk9MTE9XXzM0M19pbl9saXRlcmFsMjMwNzEpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVsaXRlcmFsRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGJmPSBzZXA6OkV4ZWN1dGFibGVMaWI6Ok1BQ0hJTkVfUEFSRU5UOworICAgICAgICAJICAgICAgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAxMDoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NTMxOjQ6ICdlbnYnCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDI3NywgJkZPTExPV18yNzdfaW5fbGl0ZXJhbDIzMDc4KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlbGl0ZXJhbEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBiZj0gc2VwOjpFeGVjdXRhYmxlTGliOjpNQUNISU5FX0VOVklST05NRU5UOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMTE6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjUzMzo0OiAnJHRoaXMnCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDE2MiwgJkZPTExPV18xNjJfaW5fbGl0ZXJhbDIzMDg5KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlbGl0ZXJhbEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBiZj0gc2VwOjpFeGVjdXRhYmxlTGliOjpNQUNISU5FX1NFTEY7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMTI6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjUzNDo0OiAnJHNlbGYnCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDE2MCwgJkZPTExPV18xNjBfaW5fbGl0ZXJhbDIzMDk4KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlbGl0ZXJhbEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBiZj0gc2VwOjpFeGVjdXRhYmxlTGliOjpNQUNISU5FX1NFTEY7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMTM6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjUzNTo0OiAnJHBhcmVudCcKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMTU5LCAmRk9MTE9XXzE1OV9pbl9saXRlcmFsMjMxMDcpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVsaXRlcmFsRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGJmPSBzZXA6OkV4ZWN1dGFibGVMaWI6Ok1BQ0hJTkVfUEFSRU5UOworICAgICAgICAJICAgICAgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAxNDoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NTM2OjQ6ICckc3VwZXInCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDE2MSwgJkZPTExPV18xNjFfaW5fbGl0ZXJhbDIzMTE0KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlbGl0ZXJhbEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBiZj0gc2VwOjpFeGVjdXRhYmxlTGliOjpNQUNISU5FX1BBUkVOVDsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMTU6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjUzNzo0OiAnJGVudicKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMTU4LCAmRk9MTE9XXzE1OF9pbl9saXRlcmFsMjMxMjIpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVsaXRlcmFsRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgIGJmPSBzZXA6OkV4ZWN1dGFibGVMaWI6Ok1BQ0hJTkVfRU5WSVJPTk1FTlQ7CisgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAxNjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NTM5OjQ6ICdudWxsPCcgKCAnbWFjaGluZScgfCAnY2hhbm5lbCcgfCAncG9ydCcgfCAnc2lnbmFsJyB8ICdtZXNzYWdlJyB8ICdidWZmZXInICkgR1QKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMzMyLCAmRk9MTE9XXzMzMl9pbl9saXRlcmFsMjMxMzMpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVsaXRlcmFsRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY1NDA6NTogKCAnbWFjaGluZScgfCAnY2hhbm5lbCcgfCAncG9ydCcgfCAnc2lnbmFsJyB8ICdtZXNzYWdlJyB8ICdidWZmZXInICkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgaW50IGFsdDUyMj02OworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgY2FzZSAzMTc6CisgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgCQlhbHQ1MjI9MTsKKyAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDI1MzoKKyAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAJCWFsdDUyMj0yOworICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMzQ0OgorICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgIAkJYWx0NTIyPTM7CisgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgY2FzZSAzNzQ6CisgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgCQlhbHQ1MjI9NDsKKyAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIDMyMDoKKyAgICAgICAgCSAgICAgICAgICAgIAl7CisgICAgICAgIAkgICAgICAgICAgICAJCWFsdDUyMj01OworICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgCSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgMjQ5OgorICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgIAkJYWx0NTIyPTY7CisgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAJICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgCSAgICAgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAJICAgICAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gNTIyOworICAgICAgICAJICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlbGl0ZXJhbEV4OworCisgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0NTIyKQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY1NDA6NzogJ21hY2hpbmUnCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKDMxNywgJkZPTExPV18zMTdfaW5fbGl0ZXJhbDIzMTQxKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlbGl0ZXJhbEV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICBiZj0gc2VwOjpFeGVjdXRhYmxlTGliOjpNQUNISU5FX05VTEw7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAJY2FzZSAyOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY1NDE6NzogJ2NoYW5uZWwnCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKDI1MywgJkZPTExPV18yNTNfaW5fbGl0ZXJhbDIzMTUyKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlbGl0ZXJhbEV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICBiZj0gc2VwOjpFeGVjdXRhYmxlTGliOjpDSEFOTkVMX05JTDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAljYXNlIDM6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjU0Mjo3OiAncG9ydCcKKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoMzQ0LCAmRk9MTE9XXzM0NF9pbl9saXRlcmFsMjMxNjMpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVsaXRlcmFsRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIGJmPSBzZXA6OkV4ZWN1dGFibGVMaWI6OlBPUlRfTklMOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgNDoKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NTQzOjc6ICdzaWduYWwnCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKDM3NCwgJkZPTExPV18zNzRfaW5fbGl0ZXJhbDIzMTc3KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlbGl0ZXJhbEV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICBiZj0gc2VwOjpFeGVjdXRhYmxlTGliOjpQT1JUX05JTDsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgIAljYXNlIDU6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjU0NDo3OiAnbWVzc2FnZScKKyAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICBNQVRDSFQoMzIwLCAmRk9MTE9XXzMyMF9pbl9saXRlcmFsMjMxODkpOworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVsaXRlcmFsRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIGJmPSBzZXA6OkV4ZWN1dGFibGVMaWI6OlBPUlRfTklMOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCSAgICAgICAgCWNhc2UgNjoKKyAgICAgICAgCSAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NTQ1Ojc6ICdidWZmZXInCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKDI0OSwgJkZPTExPV18yNDlfaW5fbGl0ZXJhbDIzMjAwKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlbGl0ZXJhbEV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICBiZj0gc2VwOjpFeGVjdXRhYmxlTGliOjpCVUZGRVJfTklMOworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChHVCwgJkZPTExPV19HVF9pbl9saXRlcmFsMjMyMTIpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVsaXRlcmFsRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAxNzoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NTQ3OjQ6ICdudWxsJworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgzMzEsICZGT0xMT1dfMzMxX2luX2xpdGVyYWwyMzIxNyk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWxpdGVyYWxFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgYmY9IHNlcDo6QkY6OlJFRl9OVUxMOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlbGl0ZXJhbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgcnVsZWxpdGVyYWxFeDogOworCisgICAgICAgICAgICBpZiAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFJFUE9SVEVSUk9SKCk7CisgICAgICAgICAgICAgICAgUFJFQ09WRVIoKTsKKyAgICAgICAgICAgIH0KKyAgICBpZiAoIEJBQ0tUUkFDS0lORz4wICkgeyBNRU1PSVpFKDI0MCwgbGl0ZXJhbF9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIGJmOworfQorLyogJEFOVExSIGVuZCBsaXRlcmFsICovCisKKy8qKgorICogJEFOVExSIHN0YXJ0IGNvbGxlY3Rpb25fb2ZfZXhwcmVzc2lvbgorICogL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjU1MjoxOiBjb2xsZWN0aW9uX29mX2V4cHJlc3Npb24gcmV0dXJucyBbIHNlcDo6QkYgYmYgXSA6ICggTENVUkxZIGU9IGV4cHJlc3Npb24gKCBDT01NQSBlPSBleHByZXNzaW9uICkqIFJDVVJMWSB8IExCUkFDS0VUIGU9IGV4cHJlc3Npb24gKCBDT01NQSBlPSBleHByZXNzaW9uICkqIFJCUkFDS0VUICk7CisgKi8KK3N0YXRpYyBzZXA6OkJGCitjb2xsZWN0aW9uX29mX2V4cHJlc3Npb24ocGZtbFBhcnNlciBjdHgpCit7CisgICAgc2VwOjpCRiBiZjsKKworICAgIEFOVExSM19VSU5UMzIgY29sbGVjdGlvbl9vZl9leHByZXNzaW9uX1N0YXJ0SW5kZXg7CisKKyAgICBzZXA6OkJGIGU7CisgICAgI3VuZGVmCVJFVFVSTl9UWVBFX2UKKyAgICAjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisgICAgLyogSW5pdGlhbGl6ZSBydWxlIHZhcmlhYmxlcworICAgICAqLworICAgIGNvbGxlY3Rpb25fb2ZfZXhwcmVzc2lvbl9TdGFydEluZGV4ID0gSU5ERVgoKTsKKworCisKKyAgICAJc2VwOjpCRlZlY3RvciB2YWx1ZXM7CisKKyAgICBpZiAoIChCQUNLVFJBQ0tJTkc+MCkgJiYgKEhBVkVQQVJTRURSVUxFKDI0MSkpICkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgfQorCisKKworICAgICAgICByZXR1cm4gYmY7CisgICAgfQorCisgICAgeworICAgICAgICB7CisgICAgICAgICAgICAvLyAgL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjU1NzoyOiAoIExDVVJMWSBlPSBleHByZXNzaW9uICggQ09NTUEgZT0gZXhwcmVzc2lvbiApKiBSQ1VSTFkgfCBMQlJBQ0tFVCBlPSBleHByZXNzaW9uICggQ09NTUEgZT0gZXhwcmVzc2lvbiApKiBSQlJBQ0tFVCApCisKKyAgICAgICAgICAgIEFOVExSM19VSU5UMzIgYWx0NTI2OworCisgICAgICAgICAgICBhbHQ1MjY9MjsKKworICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBMQ1VSTFk6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ1MjY9MTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIExCUkFDS0VUOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NTI2PTI7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gNTI2OworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgZ290byBydWxlY29sbGVjdGlvbl9vZl9leHByZXNzaW9uRXg7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQ1MjYpCisgICAgICAgICAgICB7CisgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjU1Nzo0OiBMQ1VSTFkgZT0gZXhwcmVzc2lvbiAoIENPTU1BIGU9IGV4cHJlc3Npb24gKSogUkNVUkxZCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKExDVVJMWSwgJkZPTExPV19MQ1VSTFlfaW5fY29sbGVjdGlvbl9vZl9leHByZXNzaW9uMjMyNDYpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVjb2xsZWN0aW9uX29mX2V4cHJlc3Npb25FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9jb2xsZWN0aW9uX29mX2V4cHJlc3Npb24yMzI1NSk7CisgICAgICAgIAkgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVjb2xsZWN0aW9uX29mX2V4cHJlc3Npb25FeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiBiZjsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgaWYgKCBCQUNLVFJBQ0tJTkc9PTAgKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICAgdmFsdWVzLmFwcGVuZChlCisgICAgICAgIAkgICAgICAgICAgICApOyAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjU1OTo2OiAoIENPTU1BIGU9IGV4cHJlc3Npb24gKSoKKworICAgICAgICAJICAgICAgICBmb3IgKDs7KQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0NTI0PTI7CisgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBjYXNlIENPTU1BOgorICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgICAgIAkJYWx0NTI0PTE7CisgICAgICAgIAkgICAgICAgICAgICAJfQorICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0NTI0KQorICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAJICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY1NTk6ODogQ09NTUEgZT0gZXhwcmVzc2lvbgorICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVChDT01NQSwgJkZPTExPV19DT01NQV9pbl9jb2xsZWN0aW9uX29mX2V4cHJlc3Npb24yMzI3NSk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWNvbGxlY3Rpb25fb2ZfZXhwcmVzc2lvbkV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX2NvbGxlY3Rpb25fb2ZfZXhwcmVzc2lvbjIzMjc5KTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWNvbGxlY3Rpb25fb2ZfZXhwcmVzc2lvbkV4OworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICB2YWx1ZXMuYXBwZW5kKGUKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgICk7IAorICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJICAgICAgICAJZGVmYXVsdDoKKyAgICAgICAgCSAgICAgICAgCSAgICBnb3RvIGxvb3A1MjQ7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGxvb3A1MjQ6IDsgLyogSnVtcCBvdXQgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKworCisgICAgICAgIAkgICAgICAgICBNQVRDSFQoUkNVUkxZLCAmRk9MTE9XX1JDVVJMWV9pbl9jb2xsZWN0aW9uX29mX2V4cHJlc3Npb24yMzI5MCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWNvbGxlY3Rpb25fb2ZfZXhwcmVzc2lvbkV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgYmY9IHNlcDo6QnVpbHRpbkFycmF5OjpjcmVhdGUodmFsdWVzKTsKKyAgICAgICAgCSAgICAgICAgICAgICAKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDI6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjU2Mzo0OiBMQlJBQ0tFVCBlPSBleHByZXNzaW9uICggQ09NTUEgZT0gZXhwcmVzc2lvbiApKiBSQlJBQ0tFVAorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChMQlJBQ0tFVCwgJkZPTExPV19MQlJBQ0tFVF9pbl9jb2xsZWN0aW9uX29mX2V4cHJlc3Npb24yMzMwMSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWNvbGxlY3Rpb25fb2ZfZXhwcmVzc2lvbkV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX2NvbGxlY3Rpb25fb2ZfZXhwcmVzc2lvbjIzMzEwKTsKKyAgICAgICAgCSAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWNvbGxlY3Rpb25fb2ZfZXhwcmVzc2lvbkV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICB2YWx1ZXMuYXBwZW5kKGUKKyAgICAgICAgCSAgICAgICAgICAgICk7IAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NTY1OjY6ICggQ09NTUEgZT0gZXhwcmVzc2lvbiApKgorCisgICAgICAgIAkgICAgICAgIGZvciAoOzspCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQ1MjU9MjsKKyAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGNhc2UgQ09NTUE6CisgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAJICAgICAgICAgICAgCQlhbHQ1MjU9MTsKKyAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAJICAgICAgICAgICAgc3dpdGNoIChhbHQ1MjUpCisgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjU2NTo4OiBDT01NQSBlPSBleHByZXNzaW9uCisgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKENPTU1BLCAmRk9MTE9XX0NPTU1BX2luX2NvbGxlY3Rpb25fb2ZfZXhwcmVzc2lvbjIzMzMwKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlY29sbGVjdGlvbl9vZl9leHByZXNzaW9uRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fY29sbGVjdGlvbl9vZl9leHByZXNzaW9uMjMzMzQpOworICAgICAgICAJICAgICAgICAJICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAJICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlY29sbGVjdGlvbl9vZl9leHByZXNzaW9uRXg7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gYmY7CisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICggQkFDS1RSQUNLSU5HPT0wICkKKyAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgIHZhbHVlcy5hcHBlbmQoZQorICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgKTsgCisgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAkgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAJICAgICAgICAJICAgIGdvdG8gbG9vcDUyNTsJLyogYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgICAgIAkgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgbG9vcDUyNTogOyAvKiBKdW1wIG91dCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworCisKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChSQlJBQ0tFVCwgJkZPTExPV19SQlJBQ0tFVF9pbl9jb2xsZWN0aW9uX29mX2V4cHJlc3Npb24yMzM0NSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZWNvbGxlY3Rpb25fb2ZfZXhwcmVzc2lvbkV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIGJmOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBpZiAoIEJBQ0tUUkFDS0lORz09MCApCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgICBiZj0gc2VwOjpCdWlsdGluQXJyYXk6OmNyZWF0ZSh2YWx1ZXMpOworICAgICAgICAJICAgICAgICAgICAgIAorICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorICAgIC8vCisgICAgZ290byBydWxlY29sbGVjdGlvbl9vZl9leHByZXNzaW9uRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICBydWxlY29sbGVjdGlvbl9vZl9leHByZXNzaW9uRXg6IDsKKworICAgICAgICAgICAgaWYgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBSRVBPUlRFUlJPUigpOworICAgICAgICAgICAgICAgIFBSRUNPVkVSKCk7CisgICAgICAgICAgICB9CisgICAgaWYgKCBCQUNLVFJBQ0tJTkc+MCApIHsgTUVNT0laRSgyNDEsIGNvbGxlY3Rpb25fb2ZfZXhwcmVzc2lvbl9TdGFydEluZGV4KTsgfQorCisgICAgcmV0dXJuIGJmOworfQorLyogJEFOVExSIGVuZCBjb2xsZWN0aW9uX29mX2V4cHJlc3Npb24gKi8KKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQyMV9mbWwKK3N0YXRpYyB2b2lkIHN5bnByZWQyMV9mbWxfZnJhZ21lbnQocGZtbFBhcnNlciBjdHggKQoreworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjcyMDo2OiAoICd1bnNhZmUnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo3MjA6NjogJ3Vuc2FmZScKKyAgICB7CisgICAgICAgICBNQVRDSFQoNDA2LCAmRk9MTE9XXzQwNl9pbl9zeW5wcmVkMjFfZm1sNTMxKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDIxX2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKy8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKy8vCitnb3RvIHJ1bGVzeW5wcmVkMjFfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkMjFfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkMjFfZm1sCisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkNTZfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkNTZfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo4MjA6NjogKCAnbW9kZWwnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo4MjA6NjogJ21vZGVsJworICAgIHsKKyAgICAgICAgIE1BVENIVCgzMjIsICZGT0xMT1dfMzIyX2luX3N5bnByZWQ1Nl9mbWwxMTI3KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDU2X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKy8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKy8vCitnb3RvIHJ1bGVzeW5wcmVkNTZfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkNTZfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkNTZfZm1sCisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkNTdfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkNTdfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo4MjE6NjogKCAncHJvdG90eXBlJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6ODIxOjY6ICdwcm90b3R5cGUnCisgICAgeworICAgICAgICAgTUFUQ0hUKDM1MywgJkZPTExPV18zNTNfaW5fc3lucHJlZDU3X2ZtbDExNDQpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkNTdfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQ1N19mbWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworcnVsZXN5bnByZWQ1N19mbWxFeDogOworCit9CisvLyAkQU5UTFIgZW5kIHN5bnByZWQ1N19mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ1OF9mbWwKK3N0YXRpYyB2b2lkIHN5bnByZWQ1OF9mbWxfZnJhZ21lbnQocGZtbFBhcnNlciBjdHggKQoreworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjgyMzo2OiAoICdkeW5hbWljJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6ODIzOjY6ICdkeW5hbWljJworICAgIHsKKyAgICAgICAgIE1BVENIVCgyNzIsICZGT0xMT1dfMjcyX2luX3N5bnByZWQ1OF9mbWwxMTU4KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDU4X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKy8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKy8vCitnb3RvIHJ1bGVzeW5wcmVkNThfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkNThfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkNThfZm1sCisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkNTlfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkNTlfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo4MzI6NjogKCAndW5zYWZlJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6ODMyOjY6ICd1bnNhZmUnCisgICAgeworICAgICAgICAgTUFUQ0hUKDQwNiwgJkZPTExPV180MDZfaW5fc3lucHJlZDU5X2ZtbDExODEpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkNTlfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQ1OV9mbWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworcnVsZXN5bnByZWQ1OV9mbWxFeDogOworCit9CisvLyAkQU5UTFIgZW5kIHN5bnByZWQ1OV9mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ2MF9mbWwKK3N0YXRpYyB2b2lkIHN5bnByZWQ2MF9mbWxfZnJhZ21lbnQocGZtbFBhcnNlciBjdHggKQoreworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjgzNDo2OiAoICd0aW1lZCcgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjgzNDo2OiAndGltZWQnCisgICAgeworICAgICAgICAgTUFUQ0hUKDM5MywgJkZPTExPV18zOTNfaW5fc3lucHJlZDYwX2ZtbDExOTgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkNjBfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQ2MF9mbWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworcnVsZXN5bnByZWQ2MF9mbWxFeDogOworCit9CisvLyAkQU5UTFIgZW5kIHN5bnByZWQ2MF9mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ2MV9mbWwKK3N0YXRpYyB2b2lkIHN5bnByZWQ2MV9mbWxfZnJhZ21lbnQocGZtbFBhcnNlciBjdHggKQoreworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjgzNTo2OiAoICdpbnB1dF9lbmFibGVkJyApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6ODM1OjY6ICdpbnB1dF9lbmFibGVkJworICAgIHsKKyAgICAgICAgIE1BVENIVCgzMDYsICZGT0xMT1dfMzA2X2luX3N5bnByZWQ2MV9mbWwxMjE1KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDYxX2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKy8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKy8vCitnb3RvIHJ1bGVzeW5wcmVkNjFfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkNjFfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkNjFfZm1sCisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkNjJfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkNjJfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo4MzY6NjogKCAnbGlmZWxpbmUnICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo4MzY6NjogJ2xpZmVsaW5lJworICAgIHsKKyAgICAgICAgIE1BVENIVCgzMTQsICZGT0xMT1dfMzE0X2luX3N5bnByZWQ2Ml9mbWwxMjI0KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDYyX2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKy8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKy8vCitnb3RvIHJ1bGVzeW5wcmVkNjJfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkNjJfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkNjJfZm1sCisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkOTVfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkOTVfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKwlwQU5UTFIzX0NPTU1PTl9UT0tFTiAgICBpZDsKKworCWlkICAgICAgID0gTlVMTDsKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjk5NTo2OiAoICggRE9UIHwgQ09MT054MiApIGlkPSBJRCApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6OTk1OjY6ICggRE9UIHwgQ09MT054MiApIGlkPSBJRAorICAgIHsKKyAgICAgICAgaWYgKCBMQSgxKSA9PSBDT0xPTngyIHx8IExBKDEpID09IERPVCApCisgICAgICAgIHsKKyAgICAgICAgICAgIENPTlNVTUUoKTsKKyAgICAgICAgICAgIFBFUlJPUlJFQ09WRVJZPUFOVExSM19GQUxTRTsKKyAgICAgICAgICAgIEZBSUxFREZMQUc9QU5UTFIzX0ZBTFNFOworCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19NSVNNQVRDSEVEX1NFVF9FWENFUFRJT047CisgICAgICAgICAgICBFWENFUFRJT04tPm5hbWUgICAgICAgICA9ICh2b2lkICopQU5UTFIzX01JU01BVENIRURfU0VUX05BTUU7CisgICAgICAgICAgICBFWENFUFRJT04tPmV4cGVjdGluZ1NldCA9IE5VTEw7CisKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ5NV9mbWxFeDsKKyAgICAgICAgfQorCisKKyAgICAgICAgaWQgPSAocEFOVExSM19DT01NT05fVE9LRU4pIE1BVENIVChJRCwgJkZPTExPV19JRF9pbl9zeW5wcmVkOTVfZm1sMTg5Myk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ5NV9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisvLworZ290byBydWxlc3lucHJlZDk1X2ZtbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCitydWxlc3lucHJlZDk1X2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDk1X2ZtbAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDExNV9mbWwKK3N0YXRpYyB2b2lkIHN5bnByZWQxMTVfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMjA1OjY6ICggdHlwZV92YXIgQ09MT04gKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEyMDU6ODogdHlwZV92YXIgQ09MT04KKyAgICB7CisgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3R5cGVfdmFyX2luX3N5bnByZWQxMTVfZm1sMjM4Nyk7CisgICAgICAgIHR5cGVfdmFyKGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQxMTVfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgICAgICAgTUFUQ0hUKENPTE9OLCAmRk9MTE9XX0NPTE9OX2luX3N5bnByZWQxMTVfZm1sMjM4OSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQxMTVfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQxMTVfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkMTE1X2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDExNV9mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxMjZfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkMTI2X2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTI3Njo2OiAoIHR5cGVfdmFyIENPTE9OICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMjc2Ojg6IHR5cGVfdmFyIENPTE9OCisgICAgeworICAgICAgICBGT0xMT1dQVVNIKEZPTExPV190eXBlX3Zhcl9pbl9zeW5wcmVkMTI2X2ZtbDI2ODkpOworICAgICAgICB0eXBlX3ZhcihjdHgpOworCisgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkMTI2X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICAgICAgIE1BVENIVChDT0xPTiwgJkZPTExPV19DT0xPTl9pbl9zeW5wcmVkMTI2X2ZtbDI2OTEpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkMTI2X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKy8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKy8vCitnb3RvIHJ1bGVzeW5wcmVkMTI2X2ZtbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCitydWxlc3lucHJlZDEyNl9mbWxFeDogOworCit9CisvLyAkQU5UTFIgZW5kIHN5bnByZWQxMjZfZm1sCisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkMTI3X2ZtbAorc3RhdGljIHZvaWQgc3lucHJlZDEyN19mbWxfZnJhZ21lbnQocGZtbFBhcnNlciBjdHggKQoreworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEzMDE6NjogKCBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJlZGljYXQgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEzMDE6ODogZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0CisgICAgeworICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJlZGljYXRfaW5fc3lucHJlZDEyN19mbWwyNzY0KTsKKyAgICAgICAgZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0KGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQxMjdfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQxMjdfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkMTI3X2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDEyN19mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxMzhfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkMTM4X2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisJc2VwOjpNb2RpZmllciBtOworCSN1bmRlZglSRVRVUk5fVFlQRV9tCisJI2RlZmluZQlSRVRVUk5fVFlQRV9tIHNlcDo6TW9kaWZpZXIKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjEzMzg6NTogKG09IG1vZGlmaWVyX2RlY2xhcmF0aW9uICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoxMzM4OjU6IG09IG1vZGlmaWVyX2RlY2xhcmF0aW9uCisgICAgeworICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19tb2RpZmllcl9kZWNsYXJhdGlvbl9pbl9zeW5wcmVkMTM4X2ZtbDI5MzkpOworICAgICAgICBtPW1vZGlmaWVyX2RlY2xhcmF0aW9uKGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQxMzhfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQxMzhfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkMTM4X2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDEzOF9mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxNTNfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkMTUzX2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisJZm1sUGFyc2VyX2V4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyX3JldHVybiBtczsKKwkjdW5kZWYJUkVUVVJOX1RZUEVfbXMKKwkjZGVmaW5lCVJFVFVSTl9UWVBFX21zIGZtbFBhcnNlcl9leGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllcl9yZXR1cm4KKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE0MDQ6NjogKG1zPSBleGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllciApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTQwNDo2OiBtcz0gZXhlY3V0YWJsZV9tb2RpZmllcl9zcGVjaWZpZXIKKyAgICB7CisgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyX2luX3N5bnByZWQxNTNfZm1sMzE5OSk7CisgICAgICAgIG1zPWV4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyKGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQxNTNfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQxNTNfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkMTUzX2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDE1M19mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxNzBfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkMTcwX2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MTUzNDo0OiAoIGx2YWx1ZSBvcF9hc3NpZ25fcGFyYW0gKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjE1MzQ6NjogbHZhbHVlIG9wX2Fzc2lnbl9wYXJhbQorICAgIHsKKyAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfbHZhbHVlX2luX3N5bnByZWQxNzBfZm1sMzY0NSk7CisgICAgICAgIGx2YWx1ZShjdHgpOworCisgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkMTcwX2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfb3BfYXNzaWduX3BhcmFtX2luX3N5bnByZWQxNzBfZm1sMzY0OCk7CisgICAgICAgIG9wX2Fzc2lnbl9wYXJhbShjdHgpOworCisgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkMTcwX2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKy8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKy8vCitnb3RvIHJ1bGVzeW5wcmVkMTcwX2ZtbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCitydWxlc3lucHJlZDE3MF9mbWxFeDogOworCit9CisvLyAkQU5UTFIgZW5kIHN5bnByZWQxNzBfZm1sCisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkMjk2X2ZtbAorc3RhdGljIHZvaWQgc3lucHJlZDI5Nl9mbWxfZnJhZ21lbnQocGZtbFBhcnNlciBjdHggKQoreworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIyMjM6NjogKCBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJlZGljYXQgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIyMjM6ODogZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0CisgICAgeworICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19kZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJlZGljYXRfaW5fc3lucHJlZDI5Nl9mbWw1OTczKTsKKyAgICAgICAgZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0KGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQyOTZfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQyOTZfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkMjk2X2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDI5Nl9mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQzMDRfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkMzA0X2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisJc2VwOjpNb2RpZmllciBtOworCSN1bmRlZglSRVRVUk5fVFlQRV9tCisJI2RlZmluZQlSRVRVUk5fVFlQRV9tIHNlcDo6TW9kaWZpZXIKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIyNTQ6NTogKG09IG1vZGlmaWVyX2RlY2xhcmF0aW9uICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMjU0OjU6IG09IG1vZGlmaWVyX2RlY2xhcmF0aW9uCisgICAgeworICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19tb2RpZmllcl9kZWNsYXJhdGlvbl9pbl9zeW5wcmVkMzA0X2ZtbDYxMTIpOworICAgICAgICBtPW1vZGlmaWVyX2RlY2xhcmF0aW9uKGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQzMDRfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQzMDRfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkMzA0X2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDMwNF9mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQzMjRfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkMzI0X2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisJc2VwOjpUcmFuc2l0aW9uOjptb2Nfa2luZF90IGt0OworCSN1bmRlZglSRVRVUk5fVFlQRV9rdAorCSNkZWZpbmUJUkVUVVJOX1RZUEVfa3Qgc2VwOjpUcmFuc2l0aW9uOjptb2Nfa2luZF90CisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMzcwOjQ6ICggKCAnbW9jOicgKT8ga3Q9IG1vY190cmFuc2l0aW9uX2F0dHJpYnV0ZSApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjM3MDo0OiAoICdtb2M6JyApPyBrdD0gbW9jX3RyYW5zaXRpb25fYXR0cmlidXRlCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMzcwOjQ6ICggJ21vYzonICk/CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBhbHQ1Njg9MjsKKyAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDMyMToKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0NTY4PTE7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NTY4KQorICAgICAgICAgICAgeworICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIzNzA6NjogJ21vYzonCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDMyMSwgJkZPTExPV18zMjFfaW5fc3lucHJlZDMyNF9mbWw2NTIwKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDMyNF9mbWxFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19tb2NfdHJhbnNpdGlvbl9hdHRyaWJ1dGVfaW5fc3lucHJlZDMyNF9mbWw2NTI3KTsKKyAgICAgICAga3Q9bW9jX3RyYW5zaXRpb25fYXR0cmlidXRlKGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQzMjRfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQzMjRfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkMzI0X2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDMyNF9mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQzMjZfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkMzI2X2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisJc2VwOjphdm1fc2l6ZV90IG47CisJI3VuZGVmCVJFVFVSTl9UWVBFX24KKwkjZGVmaW5lCVJFVFVSTl9UWVBFX24gc2VwOjphdm1fc2l6ZV90CisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMzczOjQ6ICggKCAncHJpb3I6JyApPyBuPSBpbnRlZ2VyX2NvbnN0YW50ICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMzczOjQ6ICggJ3ByaW9yOicgKT8gbj0gaW50ZWdlcl9jb25zdGFudAorICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjM3Mzo0OiAoICdwcmlvcjonICk/CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBhbHQ1Njk9MjsKKyAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDM0ODoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0NTY5PTE7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NTY5KQorICAgICAgICAgICAgeworICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIzNzM6NjogJ3ByaW9yOicKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMzQ4LCAmRk9MTE9XXzM0OF9pbl9zeW5wcmVkMzI2X2ZtbDY1MzgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkMzI2X2ZtbEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fc3lucHJlZDMyNl9mbWw2NTQ1KTsKKyAgICAgICAgbj1pbnRlZ2VyX2NvbnN0YW50KGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQzMjZfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQzMjZfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkMzI2X2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDMyNl9mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQzMjlfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkMzI5X2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisJc2VwOjpCRiB0aWQ7CisJI3VuZGVmCVJFVFVSTl9UWVBFX3RpZAorCSNkZWZpbmUJUkVUVVJOX1RZUEVfdGlkIHNlcDo6QkYKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIzODM6NjogKCAoICctLT4nICk/IHRpZD0gdGFyZ2V0X3N0YXRlX2lkIFNFTUkgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjIzODM6NjogKCAnLS0+JyApPyB0aWQ9IHRhcmdldF9zdGF0ZV9pZCBTRU1JCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyMzgzOjY6ICggJy0tPicgKT8KKyAgICAgICAgeworICAgICAgICAgICAgaW50IGFsdDU3MD0yOworICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgMTYzOgorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlhbHQ1NzA9MTsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQ1NzApCisgICAgICAgICAgICB7CisgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjM4Mzo4OiAnLS0+JworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgxNjMsICZGT0xMT1dfMTYzX2luX3N5bnByZWQzMjlfZm1sNjYwMCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQzMjlfZm1sRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfdGFyZ2V0X3N0YXRlX2lkX2luX3N5bnByZWQzMjlfZm1sNjYxMik7CisgICAgICAgIHRpZD10YXJnZXRfc3RhdGVfaWQoY3R4KTsKKworICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDMyOV9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgICAgICBNQVRDSFQoU0VNSSwgJkZPTExPV19TRU1JX2luX3N5bnByZWQzMjlfZm1sNjYyOSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQzMjlfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQzMjlfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkMzI5X2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDMyOV9mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQzNDBfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkMzQwX2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisJc2VwOjpCRiBlOworCSN1bmRlZglSRVRVUk5fVFlQRV9lCisJI2RlZmluZQlSRVRVUk5fVFlQRV9lIHNlcDo6QkYKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI0Mjk6NTogKGU9IGV4cHJlc3Npb24gKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI0Mjk6NTogZT0gZXhwcmVzc2lvbgorICAgIHsKKyAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkMzQwX2ZtbDY4NDApOworICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDM0MF9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisvLworZ290byBydWxlc3lucHJlZDM0MF9mbWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworcnVsZXN5bnByZWQzNDBfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkMzQwX2ZtbAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDM0MV9mbWwKK3N0YXRpYyB2b2lkIHN5bnByZWQzNDFfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKwlzZXA6OkJGIGU7CisJI3VuZGVmCVJFVFVSTl9UWVBFX2UKKwkjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjQzMjo1OiAoIExCUkFDS0VUIGU9IGV4cHJlc3Npb24gUkJSQUNLRVQgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI0MzI6NTogTEJSQUNLRVQgZT0gZXhwcmVzc2lvbiBSQlJBQ0tFVAorICAgIHsKKyAgICAgICAgIE1BVENIVChMQlJBQ0tFVCwgJkZPTExPV19MQlJBQ0tFVF9pbl9zeW5wcmVkMzQxX2ZtbDY4NTEpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkMzQxX2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkMzQxX2ZtbDY4NTUpOworICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDM0MV9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgICAgICBNQVRDSFQoUkJSQUNLRVQsICZGT0xMT1dfUkJSQUNLRVRfaW5fc3lucHJlZDM0MV9mbWw2ODU3KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDM0MV9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisvLworZ290byBydWxlc3lucHJlZDM0MV9mbWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworcnVsZXN5bnByZWQzNDFfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkMzQxX2ZtbAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDM0M19mbWwKK3N0YXRpYyB2b2lkIHN5bnByZWQzNDNfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKwlzZXA6OkJGIGU7CisJI3VuZGVmCVJFVFVSTl9UWVBFX2UKKwkjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjQ0Mjo1OiAoZT0gZXhwcmVzc2lvbiApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjQ0Mjo1OiBlPSBleHByZXNzaW9uCisgICAgeworICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQzNDNfZm1sNjkwMCk7CisgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkMzQzX2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKy8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKy8vCitnb3RvIHJ1bGVzeW5wcmVkMzQzX2ZtbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCitydWxlc3lucHJlZDM0M19mbWxFeDogOworCit9CisvLyAkQU5UTFIgZW5kIHN5bnByZWQzNDNfZm1sCisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkMzQ0X2ZtbAorc3RhdGljIHZvaWQgc3lucHJlZDM0NF9mbWxfZnJhZ21lbnQocGZtbFBhcnNlciBjdHggKQoreworCXNlcDo6QkYgZTsKKwkjdW5kZWYJUkVUVVJOX1RZUEVfZQorCSNkZWZpbmUJUkVUVVJOX1RZUEVfZSBzZXA6OkJGCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNDQ1OjU6ICggTENVUkxZIGU9IGV4cHJlc3Npb24gUkNVUkxZICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNDQ1OjU6IExDVVJMWSBlPSBleHByZXNzaW9uIFJDVVJMWQorICAgIHsKKyAgICAgICAgIE1BVENIVChMQ1VSTFksICZGT0xMT1dfTENVUkxZX2luX3N5bnByZWQzNDRfZm1sNjkxMSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQzNDRfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQzNDRfZm1sNjkxNSk7CisgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkMzQ0X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICAgICAgIE1BVENIVChSQ1VSTFksICZGT0xMT1dfUkNVUkxZX2luX3N5bnByZWQzNDRfZm1sNjkxNyk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQzNDRfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQzNDRfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkMzQ0X2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDM0NF9mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQzNjZfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkMzY2X2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjUyODo0OiAoIGRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9oZWFkZXJfcHJlZGljYXQgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI1Mjg6NjogZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX2hlYWRlcl9wcmVkaWNhdAorICAgIHsKKyAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX2hlYWRlcl9wcmVkaWNhdF9pbl9zeW5wcmVkMzY2X2ZtbDczMTYpOworICAgICAgICBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25faGVhZGVyX3ByZWRpY2F0KGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQzNjZfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQzNjZfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkMzY2X2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDM2Nl9mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQzNzBfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkMzcwX2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjU0MDo0OiAoIGRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9pbXBvcnRfcHJlZGljYXQgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI1NDA6NjogZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX2ltcG9ydF9wcmVkaWNhdAorICAgIHsKKyAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX2ltcG9ydF9wcmVkaWNhdF9pbl9zeW5wcmVkMzcwX2ZtbDczODApOworICAgICAgICBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25faW1wb3J0X3ByZWRpY2F0KGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQzNzBfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQzNzBfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkMzcwX2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDM3MF9mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQzNzNfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkMzczX2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjU1MDo0OiAoIGRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wYXJhbWV0ZXJfcHJlZGljYXQgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI1NTA6NjogZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3BhcmFtZXRlcl9wcmVkaWNhdAorICAgIHsKKyAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3BhcmFtZXRlcl9wcmVkaWNhdF9pbl9zeW5wcmVkMzczX2ZtbDc0MzIpOworICAgICAgICBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcGFyYW1ldGVyX3ByZWRpY2F0KGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQzNzNfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQzNzNfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkMzczX2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDM3M19mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQzNzVfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkMzc1X2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjU1ODo0OiAoIGRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcm9wZXJ0eV9wcmVkaWNhdCApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjU1ODo2OiBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJvcGVydHlfcHJlZGljYXQKKyAgICB7CisgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2RlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcm9wZXJ0eV9wcmVkaWNhdF9pbl9zeW5wcmVkMzc1X2ZtbDc0NzIpOworICAgICAgICBkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25fcHJvcGVydHlfcHJlZGljYXQoY3R4KTsKKworICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDM3NV9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisvLworZ290byBydWxlc3lucHJlZDM3NV9mbWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworcnVsZXN5bnByZWQzNzVfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkMzc1X2ZtbAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDQwN19mbWwKK3N0YXRpYyB2b2lkIHN5bnByZWQ0MDdfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNjk1OjQ6ICggSUQgQ09MT04gKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI2OTU6NjogSUQgQ09MT04KKyAgICB7CisgICAgICAgICBNQVRDSFQoSUQsICZGT0xMT1dfSURfaW5fc3lucHJlZDQwN19mbWw3OTIyKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDQwN19mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgICAgICBNQVRDSFQoQ09MT04sICZGT0xMT1dfQ09MT05faW5fc3lucHJlZDQwN19mbWw3OTI0KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDQwN19mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisvLworZ290byBydWxlc3lucHJlZDQwN19mbWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworcnVsZXN5bnByZWQ0MDdfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkNDA3X2ZtbAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDQxMl9mbWwKK3N0YXRpYyB2b2lkIHN5bnByZWQ0MTJfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKwlmbWxQYXJzZXJfbGFiZWxsZWRfYXJndW1lbnRfcmV0dXJuIGxwOworCSN1bmRlZglSRVRVUk5fVFlQRV9scAorCSNkZWZpbmUJUkVUVVJOX1RZUEVfbHAgZm1sUGFyc2VyX2xhYmVsbGVkX2FyZ3VtZW50X3JldHVybgorCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mjc0OTo2OiAoIExQQVJFTiBscD0gbGFiZWxsZWRfYXJndW1lbnQgKCBDT01NQSBscD0gbGFiZWxsZWRfYXJndW1lbnQgKSogUlBBUkVOICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNzQ5OjY6IExQQVJFTiBscD0gbGFiZWxsZWRfYXJndW1lbnQgKCBDT01NQSBscD0gbGFiZWxsZWRfYXJndW1lbnQgKSogUlBBUkVOCisgICAgeworICAgICAgICAgTUFUQ0hUKExQQVJFTiwgJkZPTExPV19MUEFSRU5faW5fc3lucHJlZDQxMl9mbWw4MDc2KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDQxMl9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2xhYmVsbGVkX2FyZ3VtZW50X2luX3N5bnByZWQ0MTJfZm1sODA4NSk7CisgICAgICAgIGxwPWxhYmVsbGVkX2FyZ3VtZW50KGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ0MTJfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNzU1OjY6ICggQ09NTUEgbHA9IGxhYmVsbGVkX2FyZ3VtZW50ICkqCisKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGFsdDU4MT0yOworICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBDT01NQToKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDU4MT0xOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDU4MSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzoyNzU1Ojg6IENPTU1BIGxwPSBsYWJlbGxlZF9hcmd1bWVudAorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVChDT01NQSwgJkZPTExPV19DT01NQV9pbl9zeW5wcmVkNDEyX2ZtbDgxMDEpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkNDEyX2ZtbEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfbGFiZWxsZWRfYXJndW1lbnRfaW5fc3lucHJlZDQxMl9mbWw4MTEyKTsKKyAgICAgICAgCSAgICAgICAgbHA9bGFiZWxsZWRfYXJndW1lbnQoY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDQxMl9mbWxFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAJICAgIGdvdG8gbG9vcDU4MTsJLyogYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbG9vcDU4MTogOyAvKiBKdW1wIG91dCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworCisKKyAgICAgICAgIE1BVENIVChSUEFSRU4sICZGT0xMT1dfUlBBUkVOX2luX3N5bnByZWQ0MTJfZm1sODEzNik7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ0MTJfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQ0MTJfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkNDEyX2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDQxMl9mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ0MTdfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkNDE3X2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisJZm1sUGFyc2VyX2xhYmVsbGVkX2FyZ3VtZW50X3JldHVybiBscDsKKwkjdW5kZWYJUkVUVVJOX1RZUEVfbHAKKwkjZGVmaW5lCVJFVFVSTl9UWVBFX2xwIGZtbFBhcnNlcl9sYWJlbGxlZF9hcmd1bWVudF9yZXR1cm4KKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI4NDg6NjogKCBMUEFSRU4gbHA9IGxhYmVsbGVkX2FyZ3VtZW50ICggQ09NTUEgbHA9IGxhYmVsbGVkX2FyZ3VtZW50ICkqIFJQQVJFTiApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mjg0ODo2OiBMUEFSRU4gbHA9IGxhYmVsbGVkX2FyZ3VtZW50ICggQ09NTUEgbHA9IGxhYmVsbGVkX2FyZ3VtZW50ICkqIFJQQVJFTgorICAgIHsKKyAgICAgICAgIE1BVENIVChMUEFSRU4sICZGT0xMT1dfTFBBUkVOX2luX3N5bnByZWQ0MTdfZm1sODI2NSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ0MTdfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9zeW5wcmVkNDE3X2ZtbDgyNzQpOworICAgICAgICBscD1sYWJlbGxlZF9hcmd1bWVudChjdHgpOworCisgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkNDE3X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mjg1NDo2OiAoIENPTU1BIGxwPSBsYWJlbGxlZF9hcmd1bWVudCApKgorCisgICAgICAgIGZvciAoOzspCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBhbHQ1ODM9MjsKKyAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQ09NTUE6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ1ODM9MTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQ1ODMpCisgICAgICAgICAgICB7CisgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mjg1NDo4OiBDT01NQSBscD0gbGFiZWxsZWRfYXJndW1lbnQKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoQ09NTUEsICZGT0xMT1dfQ09NTUFfaW5fc3lucHJlZDQxN19mbWw4MjkwKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDQxN19mbWxFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2xhYmVsbGVkX2FyZ3VtZW50X2luX3N5bnByZWQ0MTdfZm1sODMwMSk7CisgICAgICAgIAkgICAgICAgIGxwPWxhYmVsbGVkX2FyZ3VtZW50KGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ0MTdfZm1sRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJZGVmYXVsdDoKKyAgICAgICAgCSAgICBnb3RvIGxvb3A1ODM7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxvb3A1ODM6IDsgLyogSnVtcCBvdXQgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKworCisgICAgICAgICBNQVRDSFQoUlBBUkVOLCAmRk9MTE9XX1JQQVJFTl9pbl9zeW5wcmVkNDE3X2ZtbDgzMjUpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkNDE3X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKy8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKy8vCitnb3RvIHJ1bGVzeW5wcmVkNDE3X2ZtbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCitydWxlc3lucHJlZDQxN19mbWxFeDogOworCit9CisvLyAkQU5UTFIgZW5kIHN5bnByZWQ0MTdfZm1sCisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkNDE5X2ZtbAorc3RhdGljIHZvaWQgc3lucHJlZDQxOV9mbWxfZnJhZ21lbnQocGZtbFBhcnNlciBjdHggKQoreworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI4OTc6NDogKCBJRCApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mjg5Nzo2OiBJRAorICAgIHsKKyAgICAgICAgIE1BVENIVChJRCwgJkZPTExPV19JRF9pbl9zeW5wcmVkNDE5X2ZtbDg0MDcpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkNDE5X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKy8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKy8vCitnb3RvIHJ1bGVzeW5wcmVkNDE5X2ZtbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCitydWxlc3lucHJlZDQxOV9mbWxFeDogOworCit9CisvLyAkQU5UTFIgZW5kIHN5bnByZWQ0MTlfZm1sCisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkNDI2X2ZtbAorc3RhdGljIHZvaWQgc3lucHJlZDQyNl9mbWxfZnJhZ21lbnQocGZtbFBhcnNlciBjdHggKQoreworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI5Mjc6NjogKCBJRCApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MjkyNzo4OiBJRAorICAgIHsKKyAgICAgICAgIE1BVENIVChJRCwgJkZPTExPV19JRF9pbl9zeW5wcmVkNDI2X2ZtbDg1NDIpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkNDI2X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKy8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKy8vCitnb3RvIHJ1bGVzeW5wcmVkNDI2X2ZtbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCitydWxlc3lucHJlZDQyNl9mbWxFeDogOworCit9CisvLyAkQU5UTFIgZW5kIHN5bnByZWQ0MjZfZm1sCisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkNDMxX2ZtbAorc3RhdGljIHZvaWQgc3lucHJlZDQzMV9mbWxfZnJhZ21lbnQocGZtbFBhcnNlciBjdHggKQoreworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjI5NzI6NDogKCBJRCApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mjk3Mjo2OiBJRAorICAgIHsKKyAgICAgICAgIE1BVENIVChJRCwgJkZPTExPV19JRF9pbl9zeW5wcmVkNDMxX2ZtbDg2ODkpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkNDMxX2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKy8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKy8vCitnb3RvIHJ1bGVzeW5wcmVkNDMxX2ZtbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCitydWxlc3lucHJlZDQzMV9mbWxFeDogOworCit9CisvLyAkQU5UTFIgZW5kIHN5bnByZWQ0MzFfZm1sCisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkNDM4X2ZtbAorc3RhdGljIHZvaWQgc3lucHJlZDQzOF9mbWxfZnJhZ21lbnQocGZtbFBhcnNlciBjdHggKQoreworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMwMDI6NjogKCBJRCApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzAwMjo4OiBJRAorICAgIHsKKyAgICAgICAgIE1BVENIVChJRCwgJkZPTExPV19JRF9pbl9zeW5wcmVkNDM4X2ZtbDg4MjQpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkNDM4X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKy8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKy8vCitnb3RvIHJ1bGVzeW5wcmVkNDM4X2ZtbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCitydWxlc3lucHJlZDQzOF9mbWxFeDogOworCit9CisvLyAkQU5UTFIgZW5kIHN5bnByZWQ0MzhfZm1sCisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkNDQ2X2ZtbAorc3RhdGljIHZvaWQgc3lucHJlZDQ0Nl9mbWxfZnJhZ21lbnQocGZtbFBhcnNlciBjdHggKQoreworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjMwNTc6NjogKCB0eXBlX3ZhciBDT0xPTiApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzA1Nzo4OiB0eXBlX3ZhciBDT0xPTgorICAgIHsKKyAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfdHlwZV92YXJfaW5fc3lucHJlZDQ0Nl9mbWw5MDMxKTsKKyAgICAgICAgdHlwZV92YXIoY3R4KTsKKworICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDQ0Nl9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgICAgICBNQVRDSFQoQ09MT04sICZGT0xMT1dfQ09MT05faW5fc3lucHJlZDQ0Nl9mbWw5MDMzKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDQ0Nl9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisvLworZ290byBydWxlc3lucHJlZDQ0Nl9mbWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworcnVsZXN5bnByZWQ0NDZfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkNDQ2X2ZtbAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDQ5M19mbWwKK3N0YXRpYyB2b2lkIHN5bnByZWQ0OTNfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKwlzZXA6OkJGIGJ0djsKKwkjdW5kZWYJUkVUVVJOX1RZUEVfYnR2CisJI2RlZmluZQlSRVRVUk5fVFlQRV9idHYgc2VwOjpCRgorCisJc2VwOjphdm1fc2l6ZV90IHN6OworCSN1bmRlZglSRVRVUk5fVFlQRV9zegorCSNkZWZpbmUJUkVUVVJOX1RZUEVfc3ogc2VwOjphdm1fc2l6ZV90CisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNDM1Ojg6ICggKGJ0dj0gYmFzZV90eXBlX3ZhciAoIENPTU1BICggJ3NpemU6JyApPyAoc3o9IGludGVnZXJfY29uc3RhbnQgfCBTVEFSICkgKT8gKSApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzQzNTo4OiAoYnR2PSBiYXNlX3R5cGVfdmFyICggQ09NTUEgKCAnc2l6ZTonICk/IChzej0gaW50ZWdlcl9jb25zdGFudCB8IFNUQVIgKSApPyApCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNDM1Ojg6IChidHY9IGJhc2VfdHlwZV92YXIgKCBDT01NQSAoICdzaXplOicgKT8gKHN6PSBpbnRlZ2VyX2NvbnN0YW50IHwgU1RBUiApICk/ICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzQzNToxMDogYnR2PSBiYXNlX3R5cGVfdmFyICggQ09NTUEgKCAnc2l6ZTonICk/IChzej0gaW50ZWdlcl9jb25zdGFudCB8IFNUQVIgKSApPworICAgICAgICB7CisgICAgICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19iYXNlX3R5cGVfdmFyX2luX3N5bnByZWQ0OTNfZm1sMTAyODcpOworICAgICAgICAgICAgYnR2PWJhc2VfdHlwZV92YXIoY3R4KTsKKworICAgICAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ0OTNfZm1sRXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNDM2OjEwOiAoIENPTU1BICggJ3NpemU6JyApPyAoc3o9IGludGVnZXJfY29uc3RhbnQgfCBTVEFSICkgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0NjIwPTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT01NQToKKyAgICAgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgCQlhbHQ2MjA9MTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NjIwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM0MzY6MTI6IENPTU1BICggJ3NpemU6JyApPyAoc3o9IGludGVnZXJfY29uc3RhbnQgfCBTVEFSICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgIE1BVENIVChDT01NQSwgJkZPTExPV19DT01NQV9pbl9zeW5wcmVkNDkzX2ZtbDEwMzAzKTsKKyAgICAgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDQ5M19mbWxFeDsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM0MzY6MTk6ICggJ3NpemU6JyApPworICAgICAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGludCBhbHQ2MTg9MjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBjYXNlIDM3NToKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCQlhbHQ2MTg9MTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0NjE4KQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM0MzY6MjE6ICdzaXplOicKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgIE1BVENIVCgzNzUsICZGT0xMT1dfMzc1X2luX3N5bnByZWQ0OTNfZm1sMTAzMDgpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkNDkzX2ZtbEV4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNDM3OjEyOiAoc3o9IGludGVnZXJfY29uc3RhbnQgfCBTVEFSICkKKyAgICAgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpbnQgYWx0NjE5PTI7CisgICAgICAgICAgICAJICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjYXNlIElEOgorICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgSW50ZWdlckxpdGVyYWw6CisgICAgICAgICAgICAJICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJCWFsdDYxOT0xOworICAgICAgICAgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgICAgIGNhc2UgU1RBUjoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICAgICAgICAgIAkJYWx0NjE5PTI7CisgICAgICAgICAgICAJICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDYxOTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDQ5M19mbWxFeDsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgICAgIHN3aXRjaCAoYWx0NjE5KQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAljYXNlIDE6CisgICAgICAgICAgICAJICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM0Mzc6MTQ6IHN6PSBpbnRlZ2VyX2NvbnN0YW50CisgICAgICAgICAgICAJICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2ludGVnZXJfY29uc3RhbnRfaW5fc3lucHJlZDQ5M19mbWwxMDMyOCk7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICBzej1pbnRlZ2VyX2NvbnN0YW50KGN0eCk7CisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkNDkzX2ZtbEV4OworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAgICAgCSAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCSAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzQzODoxNDogU1RBUgorICAgICAgICAgICAgCSAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgTUFUQ0hUKFNUQVIsICZGT0xMT1dfU1RBUl9pbl9zeW5wcmVkNDkzX2ZtbDEwMzQ1KTsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICB7CisgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDQ5M19mbWxFeDsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgCSAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworCisgICAgfQorCisvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisvLworZ290byBydWxlc3lucHJlZDQ5M19mbWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworcnVsZXN5bnByZWQ0OTNfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkNDkzX2ZtbAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDUxNF9mbWwKK3N0YXRpYyB2b2lkIHN5bnByZWQ1MTRfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKwlpbnQgYmZzOworCSN1bmRlZglSRVRVUk5fVFlQRV9iZnMKKwkjZGVmaW5lCVJFVFVSTl9UWVBFX2JmcyBpbnQKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM1MDY6NjogKGJmcz0gYml0X2ZpZWxkX3NpemUgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM1MDY6NjogYmZzPSBiaXRfZmllbGRfc2l6ZQorICAgIHsKKyAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfYml0X2ZpZWxkX3NpemVfaW5fc3lucHJlZDUxNF9mbWwxMDc1NSk7CisgICAgICAgIGJmcz1iaXRfZmllbGRfc2l6ZShjdHgpOworCisgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkNTE0X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKy8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKy8vCitnb3RvIHJ1bGVzeW5wcmVkNTE0X2ZtbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCitydWxlc3lucHJlZDUxNF9mbWxFeDogOworCit9CisvLyAkQU5UTFIgZW5kIHN5bnByZWQ1MTRfZm1sCisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkNTE3X2ZtbAorc3RhdGljIHZvaWQgc3lucHJlZDUxN19mbWxfZnJhZ21lbnQocGZtbFBhcnNlciBjdHggKQoreworCWludCBiZnM7CisJI3VuZGVmCVJFVFVSTl9UWVBFX2JmcworCSNkZWZpbmUJUkVUVVJOX1RZUEVfYmZzIGludAorCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzUxMTo2OiAoYmZzPSBiaXRfZmllbGRfc2l6ZSApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzUxMTo2OiBiZnM9IGJpdF9maWVsZF9zaXplCisgICAgeworICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19iaXRfZmllbGRfc2l6ZV9pbl9zeW5wcmVkNTE3X2ZtbDEwNzk0KTsKKyAgICAgICAgYmZzPWJpdF9maWVsZF9zaXplKGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ1MTdfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQ1MTdfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkNTE3X2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDUxN19mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ1MjBfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkNTIwX2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisJaW50IGJmczsKKwkjdW5kZWYJUkVUVVJOX1RZUEVfYmZzCisJI2RlZmluZQlSRVRVUk5fVFlQRV9iZnMgaW50CisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNTE2OjY6IChiZnM9IGJpdF9maWVsZF9zaXplICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNTE2OjY6IGJmcz0gYml0X2ZpZWxkX3NpemUKKyAgICB7CisgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2JpdF9maWVsZF9zaXplX2luX3N5bnByZWQ1MjBfZm1sMTA4MzEpOworICAgICAgICBiZnM9Yml0X2ZpZWxkX3NpemUoY3R4KTsKKworICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDUyMF9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisvLworZ290byBydWxlc3lucHJlZDUyMF9mbWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworcnVsZXN5bnByZWQ1MjBfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkNTIwX2ZtbAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDUzMV9mbWwKK3N0YXRpYyB2b2lkIHN5bnByZWQ1MzFfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKwlpbnQgYmZzOworCSN1bmRlZglSRVRVUk5fVFlQRV9iZnMKKwkjZGVmaW5lCVJFVFVSTl9UWVBFX2JmcyBpbnQKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM1MzM6NjogKGJmcz0gYml0X2ZpZWxkX3NpemUgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM1MzM6NjogYmZzPSBiaXRfZmllbGRfc2l6ZQorICAgIHsKKyAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfYml0X2ZpZWxkX3NpemVfaW5fc3lucHJlZDUzMV9mbWwxMDk2OCk7CisgICAgICAgIGJmcz1iaXRfZmllbGRfc2l6ZShjdHgpOworCisgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkNTMxX2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKy8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKy8vCitnb3RvIHJ1bGVzeW5wcmVkNTMxX2ZtbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCitydWxlc3lucHJlZDUzMV9mbWxFeDogOworCit9CisvLyAkQU5UTFIgZW5kIHN5bnByZWQ1MzFfZm1sCisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkNTM1X2ZtbAorc3RhdGljIHZvaWQgc3lucHJlZDUzNV9mbWxfZnJhZ21lbnQocGZtbFBhcnNlciBjdHggKQoreworCWludCBiZnM7CisJI3VuZGVmCVJFVFVSTl9UWVBFX2JmcworCSNkZWZpbmUJUkVUVVJOX1RZUEVfYmZzIGludAorCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzU0Njo2OiAoYmZzPSBiaXRfZmllbGRfc2l6ZSApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzU0Njo2OiBiZnM9IGJpdF9maWVsZF9zaXplCisgICAgeworICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19iaXRfZmllbGRfc2l6ZV9pbl9zeW5wcmVkNTM1X2ZtbDExMDIwKTsKKyAgICAgICAgYmZzPWJpdF9maWVsZF9zaXplKGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ1MzVfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQ1MzVfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkNTM1X2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDUzNV9mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ1MzdfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkNTM3X2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisJaW50IGJmczsKKwkjdW5kZWYJUkVUVVJOX1RZUEVfYmZzCisJI2RlZmluZQlSRVRVUk5fVFlQRV9iZnMgaW50CisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNTUxOjY6IChiZnM9IGJpdF9maWVsZF9zaXplICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNTUxOjY6IGJmcz0gYml0X2ZpZWxkX3NpemUKKyAgICB7CisgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2JpdF9maWVsZF9zaXplX2luX3N5bnByZWQ1MzdfZm1sMTEwNTEpOworICAgICAgICBiZnM9Yml0X2ZpZWxkX3NpemUoY3R4KTsKKworICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDUzN19mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisvLworZ290byBydWxlc3lucHJlZDUzN19mbWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworcnVsZXN5bnByZWQ1MzdfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkNTM3X2ZtbAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDUzOV9mbWwKK3N0YXRpYyB2b2lkIHN5bnByZWQ1MzlfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKwlmbWxQYXJzZXJfc3RyaW5nX2ZpZWxkX3NpemVfcmV0dXJuIHNmczsKKwkjdW5kZWYJUkVUVVJOX1RZUEVfc2ZzCisJI2RlZmluZQlSRVRVUk5fVFlQRV9zZnMgZm1sUGFyc2VyX3N0cmluZ19maWVsZF9zaXplX3JldHVybgorCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzU1Njo2OiAoc2ZzPSBzdHJpbmdfZmllbGRfc2l6ZSApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzU1Njo2OiBzZnM9IHN0cmluZ19maWVsZF9zaXplCisgICAgeworICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19zdHJpbmdfZmllbGRfc2l6ZV9pbl9zeW5wcmVkNTM5X2ZtbDExMDgwKTsKKyAgICAgICAgc2ZzPXN0cmluZ19maWVsZF9zaXplKGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ1MzlfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQ1MzlfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkNTM5X2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDUzOV9mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ1NTVfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkNTU1X2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisJc2VwOjphdm1fc2l6ZV90IG47CisJI3VuZGVmCVJFVFVSTl9UWVBFX24KKwkjZGVmaW5lCVJFVFVSTl9UWVBFX24gc2VwOjphdm1fc2l6ZV90CisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNjAxOjY6ICggKCBDT01NQSB8IERPVERPVCApIG49IGludGVnZXJfY29uc3RhbnQgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjM2MDE6NjogKCBDT01NQSB8IERPVERPVCApIG49IGludGVnZXJfY29uc3RhbnQKKyAgICB7CisgICAgICAgIGlmICggTEEoMSkgPT0gQ09NTUEgfHwgTEEoMSkgPT0gRE9URE9UICkKKyAgICAgICAgeworICAgICAgICAgICAgQ09OU1VNRSgpOworICAgICAgICAgICAgUEVSUk9SUkVDT1ZFUlk9QU5UTFIzX0ZBTFNFOworICAgICAgICAgICAgRkFJTEVERkxBRz1BTlRMUjNfRkFMU0U7CisKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX01JU01BVENIRURfU0VUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIEVYQ0VQVElPTi0+bmFtZSAgICAgICAgID0gKHZvaWQgKilBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfTkFNRTsKKyAgICAgICAgICAgIEVYQ0VQVElPTi0+ZXhwZWN0aW5nU2V0ID0gTlVMTDsKKworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDU1NV9mbWxFeDsKKyAgICAgICAgfQorCisKKyAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfaW50ZWdlcl9jb25zdGFudF9pbl9zeW5wcmVkNTU1X2ZtbDExMzc0KTsKKyAgICAgICAgbj1pbnRlZ2VyX2NvbnN0YW50KGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ1NTVfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQ1NTVfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkNTU1X2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDU1NV9mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ1NTlfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkNTU5X2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6MzY0NTo2OiAoIHR5cGVfdmFyIElEICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozNjQ1Ojg6IHR5cGVfdmFyIElECisgICAgeworICAgICAgICBGT0xMT1dQVVNIKEZPTExPV190eXBlX3Zhcl9pbl9zeW5wcmVkNTU5X2ZtbDExNTA3KTsKKyAgICAgICAgdHlwZV92YXIoY3R4KTsKKworICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDU1OV9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgICAgICBNQVRDSFQoSUQsICZGT0xMT1dfSURfaW5fc3lucHJlZDU1OV9mbWwxMTUwOSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ1NTlfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQ1NTlfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkNTU5X2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDU1OV9mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ1NzRfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkNTc0X2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mzc5MDo1MjogKCB0eXBlX3ZhciApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mzc5MDo1MjogdHlwZV92YXIKKyAgICB7CisgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3R5cGVfdmFyX2luX3N5bnByZWQ1NzRfZm1sMTIwNTcpOworICAgICAgICB0eXBlX3ZhcihjdHgpOworCisgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkNTc0X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKy8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKy8vCitnb3RvIHJ1bGVzeW5wcmVkNTc0X2ZtbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCitydWxlc3lucHJlZDU3NF9mbWxFeDogOworCit9CisvLyAkQU5UTFIgZW5kIHN5bnByZWQ1NzRfZm1sCisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkNjA5X2ZtbAorc3RhdGljIHZvaWQgc3lucHJlZDYwOV9mbWxfZnJhZ21lbnQocGZtbFBhcnNlciBjdHggKQoreworCXNlcDo6YXZtX3NpemVfdCBzejsKKwkjdW5kZWYJUkVUVVJOX1RZUEVfc3oKKwkjZGVmaW5lCVJFVFVSTl9UWVBFX3N6IHNlcDo6YXZtX3NpemVfdAorCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6Mzk1MTo1OiAoIENPTU1BIHN6PSBpbnRlZ2VyX2NvbnN0YW50ICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzozOTUxOjU6IENPTU1BIHN6PSBpbnRlZ2VyX2NvbnN0YW50CisgICAgeworICAgICAgICAgTUFUQ0hUKENPTU1BLCAmRk9MTE9XX0NPTU1BX2luX3N5bnByZWQ2MDlfZm1sMTI3NzUpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkNjA5X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfaW50ZWdlcl9jb25zdGFudF9pbl9zeW5wcmVkNjA5X2ZtbDEyNzgwKTsKKyAgICAgICAgc3o9aW50ZWdlcl9jb25zdGFudChjdHgpOworCisgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkNjA5X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKy8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKy8vCitnb3RvIHJ1bGVzeW5wcmVkNjA5X2ZtbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCitydWxlc3lucHJlZDYwOV9mbWxFeDogOworCit9CisvLyAkQU5UTFIgZW5kIHN5bnByZWQ2MDlfZm1sCisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkNjM2X2ZtbAorc3RhdGljIHZvaWQgc3lucHJlZDYzNl9mbWxfZnJhZ21lbnQocGZtbFBhcnNlciBjdHggKQoreworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQxMjQ6NjogKCAoIG1vZGlmaWVyX3BhcmFtICk/IHR5cGVfdmFyIElEICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0MTI0Ojg6ICggbW9kaWZpZXJfcGFyYW0gKT8gdHlwZV92YXIgSUQKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQxMjQ6ODogKCBtb2RpZmllcl9wYXJhbSApPworICAgICAgICB7CisgICAgICAgICAgICBpbnQgYWx0NjU1PTI7CisgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBBU1NJR05fUkVGOgorICAgICAgICAgICAgICAgIGNhc2UgQkFORDoKKyAgICAgICAgICAgICAgICBjYXNlIExURToKKyAgICAgICAgICAgICAgICBjYXNlIDE2NDoKKyAgICAgICAgICAgICAgICBjYXNlIDE2NjoKKyAgICAgICAgICAgICAgICBjYXNlIDI0MzoKKyAgICAgICAgICAgICAgICBjYXNlIDI2MjoKKyAgICAgICAgICAgICAgICBjYXNlIDI4MjoKKyAgICAgICAgICAgICAgICBjYXNlIDI5NToKKyAgICAgICAgICAgICAgICBjYXNlIDI5ODoKKyAgICAgICAgICAgICAgICBjYXNlIDMwNToKKyAgICAgICAgICAgICAgICBjYXNlIDMxODoKKyAgICAgICAgICAgICAgICBjYXNlIDMzNToKKyAgICAgICAgICAgICAgICBjYXNlIDM0MToKKyAgICAgICAgICAgICAgICBjYXNlIDM2MToKKyAgICAgICAgICAgICAgICBjYXNlIDM2NDoKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJYWx0NjU1PTE7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NjU1KQorICAgICAgICAgICAgeworICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQxMjQ6ODogbW9kaWZpZXJfcGFyYW0KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX21vZGlmaWVyX3BhcmFtX2luX3N5bnByZWQ2MzZfZm1sMTMyOTEpOworICAgICAgICAJICAgICAgICBtb2RpZmllcl9wYXJhbShjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkNjM2X2ZtbEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3R5cGVfdmFyX2luX3N5bnByZWQ2MzZfZm1sMTMyOTUpOworICAgICAgICB0eXBlX3ZhcihjdHgpOworCisgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkNjM2X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICAgICAgIE1BVENIVChJRCwgJkZPTExPV19JRF9pbl9zeW5wcmVkNjM2X2ZtbDEzMjk3KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDYzNl9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisvLworZ290byBydWxlc3lucHJlZDYzNl9mbWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworcnVsZXN5bnByZWQ2MzZfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkNjM2X2ZtbAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDY0M19mbWwKK3N0YXRpYyB2b2lkIHN5bnByZWQ2NDNfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0MjA1OjY6ICggKCBtb2RpZmllcl9wYXJhbSApPyB0eXBlX3ZhciBJRCApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDIwNTo4OiAoIG1vZGlmaWVyX3BhcmFtICk/IHR5cGVfdmFyIElECisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0MjA1Ojg6ICggbW9kaWZpZXJfcGFyYW0gKT8KKyAgICAgICAgeworICAgICAgICAgICAgaW50IGFsdDY1Nz0yOworICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQVNTSUdOX1JFRjoKKyAgICAgICAgICAgICAgICBjYXNlIEJBTkQ6CisgICAgICAgICAgICAgICAgY2FzZSBMVEU6CisgICAgICAgICAgICAgICAgY2FzZSAxNjQ6CisgICAgICAgICAgICAgICAgY2FzZSAxNjY6CisgICAgICAgICAgICAgICAgY2FzZSAyNDM6CisgICAgICAgICAgICAgICAgY2FzZSAyNjI6CisgICAgICAgICAgICAgICAgY2FzZSAyODI6CisgICAgICAgICAgICAgICAgY2FzZSAyOTU6CisgICAgICAgICAgICAgICAgY2FzZSAyOTg6CisgICAgICAgICAgICAgICAgY2FzZSAzMDU6CisgICAgICAgICAgICAgICAgY2FzZSAzMTg6CisgICAgICAgICAgICAgICAgY2FzZSAzMzU6CisgICAgICAgICAgICAgICAgY2FzZSAzNDE6CisgICAgICAgICAgICAgICAgY2FzZSAzNjE6CisgICAgICAgICAgICAgICAgY2FzZSAzNjQ6CisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCWFsdDY1Nz0xOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDY1NykKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0MjA1Ojg6IG1vZGlmaWVyX3BhcmFtCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19tb2RpZmllcl9wYXJhbV9pbl9zeW5wcmVkNjQzX2ZtbDEzNDcwKTsKKyAgICAgICAgCSAgICAgICAgbW9kaWZpZXJfcGFyYW0oY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDY0M19mbWxFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBGT0xMT1dQVVNIKEZPTExPV190eXBlX3Zhcl9pbl9zeW5wcmVkNjQzX2ZtbDEzNDc0KTsKKyAgICAgICAgdHlwZV92YXIoY3R4KTsKKworICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDY0M19mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgICAgICBNQVRDSFQoSUQsICZGT0xMT1dfSURfaW5fc3lucHJlZDY0M19mbWwxMzQ3Nik7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ2NDNfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQ2NDNfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkNjQzX2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDY0M19mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ3MDVfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkNzA1X2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDUzNTo0OiAoIHF1YWxpZmllZE5hbWVJRCAnLT4nICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NTM1OjY6IHF1YWxpZmllZE5hbWVJRCAnLT4nCisgICAgeworICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19xdWFsaWZpZWROYW1lSURfaW5fc3lucHJlZDcwNV9mbWwxNDc3Myk7CisgICAgICAgIHF1YWxpZmllZE5hbWVJRChjdHgpOworCisgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkNzA1X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICAgICAgIE1BVENIVCgxNjQsICZGT0xMT1dfMTY0X2luX3N5bnByZWQ3MDVfZm1sMTQ3NzUpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkNzA1X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKy8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKy8vCitnb3RvIHJ1bGVzeW5wcmVkNzA1X2ZtbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCitydWxlc3lucHJlZDcwNV9mbWxFeDogOworCit9CisvLyAkQU5UTFIgZW5kIHN5bnByZWQ3MDVfZm1sCisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkNzA5X2ZtbAorc3RhdGljIHZvaWQgc3lucHJlZDcwOV9mbWxfZnJhZ21lbnQocGZtbFBhcnNlciBjdHggKQoreworCXNlcDo6QkZDb2RlIHM7CisJI3VuZGVmCVJFVFVSTl9UWVBFX3MKKwkjZGVmaW5lCVJFVFVSTl9UWVBFX3Mgc2VwOjpCRkNvZGUKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ2MDY6NDogKHM9IHN0YXRlbWVudF9hc3NpZ24gKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ2MDY6NDogcz0gc3RhdGVtZW50X2Fzc2lnbgorICAgIHsKKyAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfc3RhdGVtZW50X2Fzc2lnbl9pbl9zeW5wcmVkNzA5X2ZtbDE0OTgxKTsKKyAgICAgICAgcz1zdGF0ZW1lbnRfYXNzaWduKGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ3MDlfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQ3MDlfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkNzA5X2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDcwOV9mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ3MTRfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkNzE0X2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisJc2VwOjpCRkNvZGUgczsKKwkjdW5kZWYJUkVUVVJOX1RZUEVfcworCSNkZWZpbmUJUkVUVVJOX1RZUEVfcyBzZXA6OkJGQ29kZQorCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDYxNDo0OiAocz0gc3RhdGVtZW50X2ludm9rZV9yb3V0aW5lICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NjE0OjQ6IHM9IHN0YXRlbWVudF9pbnZva2Vfcm91dGluZQorICAgIHsKKyAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfc3RhdGVtZW50X2ludm9rZV9yb3V0aW5lX2luX3N5bnByZWQ3MTRfZm1sMTUwODMpOworICAgICAgICBzPXN0YXRlbWVudF9pbnZva2Vfcm91dGluZShjdHgpOworCisgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkNzE0X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKy8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKy8vCitnb3RvIHJ1bGVzeW5wcmVkNzE0X2ZtbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCitydWxlc3lucHJlZDcxNF9mbWxFeDogOworCit9CisvLyAkQU5UTFIgZW5kIHN5bnByZWQ3MTRfZm1sCisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkNzc4X2ZtbAorc3RhdGljIHZvaWQgc3lucHJlZDc3OF9mbWxfZnJhZ21lbnQocGZtbFBhcnNlciBjdHggKQoreworCXNlcDo6QkZDb2RlIHBzOworCSN1bmRlZglSRVRVUk5fVFlQRV9wcworCSNkZWZpbmUJUkVUVVJOX1RZUEVfcHMgc2VwOjpCRkNvZGUKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ3NjM6ODogKHBzPSBwcmVmaXhfc3RhdGVtZW50ICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NzYzOjg6IHBzPSBwcmVmaXhfc3RhdGVtZW50CisgICAgeworICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19wcmVmaXhfc3RhdGVtZW50X2luX3N5bnByZWQ3NzhfZm1sMTYzNDYpOworICAgICAgICBwcz1wcmVmaXhfc3RhdGVtZW50KGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ3NzhfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQ3NzhfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkNzc4X2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDc3OF9mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ3NzlfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkNzc5X2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisJc2VwOjpCRiBlOworCSN1bmRlZglSRVRVUk5fVFlQRV9lCisJI2RlZmluZQlSRVRVUk5fVFlQRV9lIHNlcDo6QkYKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ3NjQ6ODogKGU9IHVuYXJ5RXhwcmVzc2lvbiApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDc2NDo4OiBlPSB1bmFyeUV4cHJlc3Npb24KKyAgICB7CisgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3VuYXJ5RXhwcmVzc2lvbl9pbl9zeW5wcmVkNzc5X2ZtbDE2MzY3KTsKKyAgICAgICAgZT11bmFyeUV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDc3OV9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisvLworZ290byBydWxlc3lucHJlZDc3OV9mbWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworcnVsZXN5bnByZWQ3NzlfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkNzc5X2ZtbAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDc4MF9mbWwKK3N0YXRpYyB2b2lkIHN5bnByZWQ3ODBfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKwlzZXA6OkJGQ29kZSBwczsKKwkjdW5kZWYJUkVUVVJOX1RZUEVfcHMKKwkjZGVmaW5lCVJFVFVSTl9UWVBFX3BzIHNlcDo6QkZDb2RlCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NzcyOjg6IChwcz0gcHJlZml4X2V4cHJlc3Npb24gKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ3NzI6ODogcHM9IHByZWZpeF9leHByZXNzaW9uCisgICAgeworICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19wcmVmaXhfZXhwcmVzc2lvbl9pbl9zeW5wcmVkNzgwX2ZtbDE2NDI2KTsKKyAgICAgICAgcHM9cHJlZml4X2V4cHJlc3Npb24oY3R4KTsKKworICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDc4MF9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisvLworZ290byBydWxlc3lucHJlZDc4MF9mbWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworcnVsZXN5bnByZWQ3ODBfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkNzgwX2ZtbAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDc4MV9mbWwKK3N0YXRpYyB2b2lkIHN5bnByZWQ3ODFfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKwlzZXA6OkJGIGU7CisJI3VuZGVmCVJFVFVSTl9UWVBFX2UKKwkjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDc3Mzo4OiAoZT0gdW5hcnlFeHByZXNzaW9uICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo0NzczOjg6IGU9IHVuYXJ5RXhwcmVzc2lvbgorICAgIHsKKyAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfdW5hcnlFeHByZXNzaW9uX2luX3N5bnByZWQ3ODFfZm1sMTY0NDYpOworICAgICAgICBlPXVuYXJ5RXhwcmVzc2lvbihjdHgpOworCisgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkNzgxX2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKy8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKy8vCitnb3RvIHJ1bGVzeW5wcmVkNzgxX2ZtbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCitydWxlc3lucHJlZDc4MV9mbWxFeDogOworCit9CisvLyAkQU5UTFIgZW5kIHN5bnByZWQ3ODFfZm1sCisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkODAyX2ZtbAorc3RhdGljIHZvaWQgc3lucHJlZDgwMl9mbWxfZnJhZ21lbnQocGZtbFBhcnNlciBjdHggKQoreworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ5MTQ6NjogKCBMUEFSRU4gKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjQ5MTQ6ODogTFBBUkVOCisgICAgeworICAgICAgICAgTUFUQ0hUKExQQVJFTiwgJkZPTExPV19MUEFSRU5faW5fc3lucHJlZDgwMl9mbWwxNzA4Nyk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ4MDJfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQ4MDJfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkODAyX2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDgwMl9mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ4MDRfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkODA0X2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDkxOTo2OiAoIExDVVJMWSApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NDkxOTo4OiBMQ1VSTFkKKyAgICB7CisgICAgICAgICBNQVRDSFQoTENVUkxZLCAmRk9MTE9XX0xDVVJMWV9pbl9zeW5wcmVkODA0X2ZtbDE3MTMwKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDgwNF9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisvLworZ290byBydWxlc3lucHJlZDgwNF9mbWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworcnVsZXN5bnByZWQ4MDRfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkODA0X2ZtbAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDg2MV9mbWwKK3N0YXRpYyB2b2lkIHN5bnByZWQ4NjFfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1MzIwOjg6ICggJ2VudicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjUzMjA6ODogJ2VudicKKyAgICB7CisgICAgICAgICBNQVRDSFQoMjc3LCAmRk9MTE9XXzI3N19pbl9zeW5wcmVkODYxX2ZtbDE4NDU1KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDg2MV9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisvLworZ290byBydWxlc3lucHJlZDg2MV9mbWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworcnVsZXN5bnByZWQ4NjFfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkODYxX2ZtbAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDg3Ml9mbWwKK3N0YXRpYyB2b2lkIHN5bnByZWQ4NzJfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1MzcwOjg6ICggJ2VudicgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjUzNzA6ODogJ2VudicKKyAgICB7CisgICAgICAgICBNQVRDSFQoMjc3LCAmRk9MTE9XXzI3N19pbl9zeW5wcmVkODcyX2ZtbDE4Njg1KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDg3Ml9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisvLworZ290byBydWxlc3lucHJlZDg3Ml9mbWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworcnVsZXN5bnByZWQ4NzJfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkODcyX2ZtbAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDg5MV9mbWwKK3N0YXRpYyB2b2lkIHN5bnByZWQ4OTFfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKwlzZXA6OkJGIGU7CisJI3VuZGVmCVJFVFVSTl9UWVBFX2UKKwkjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisJc2VwOjpCRkNvZGUgYnM7CisJI3VuZGVmCVJFVFVSTl9UWVBFX2JzCisJI2RlZmluZQlSRVRVUk5fVFlQRV9icyBzZXA6OkJGQ29kZQorCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTUxNTo2OiAoICggJ2Vsc2VpZicgfCAnZWxzZScgJ2lmJyApIGU9IGV4cHJlc3Npb24gYnM9IGJsb2NrX3N0YXRlbWVudCApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTUxNTo2OiAoICdlbHNlaWYnIHwgJ2Vsc2UnICdpZicgKSBlPSBleHByZXNzaW9uIGJzPSBibG9ja19zdGF0ZW1lbnQKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU1MTU6NjogKCAnZWxzZWlmJyB8ICdlbHNlJyAnaWYnICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGFsdDY5Mz0yOworICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAyNzQ6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ2OTM9MTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI3MzoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDY5Mz0yOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoQkFDS1RSQUNLSU5HPjApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIiI7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA2OTM7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5zdGF0ZSAgICAgICAgPSAwOworCisKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkODkxX2ZtbEV4OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NjkzKQorICAgICAgICAgICAgeworICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU1MTU6ODogJ2Vsc2VpZicKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoMjc0LCAmRk9MTE9XXzI3NF9pbl9zeW5wcmVkODkxX2ZtbDE5MjQ1KTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDg5MV9mbWxFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAyOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU1MTU6MTk6ICdlbHNlJyAnaWYnCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDI3MywgJkZPTExPV18yNzNfaW5fc3lucHJlZDg5MV9mbWwxOTI0OSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ4OTFfZm1sRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDI5NCwgJkZPTExPV18yOTRfaW5fc3lucHJlZDg5MV9mbWwxOTI1MSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ4OTFfZm1sRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkODkxX2ZtbDE5MjU4KTsKKyAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ4OTFfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19ibG9ja19zdGF0ZW1lbnRfaW5fc3lucHJlZDg5MV9mbWwxOTI2Myk7CisgICAgICAgIGJzPWJsb2NrX3N0YXRlbWVudChjdHgpOworCisgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkODkxX2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKy8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKy8vCitnb3RvIHJ1bGVzeW5wcmVkODkxX2ZtbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCitydWxlc3lucHJlZDg5MV9mbWxFeDogOworCit9CisvLyAkQU5UTFIgZW5kIHN5bnByZWQ4OTFfZm1sCisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkODk0X2ZtbAorc3RhdGljIHZvaWQgc3lucHJlZDg5NF9mbWxfZnJhZ21lbnQocGZtbFBhcnNlciBjdHggKQoreworCXNlcDo6QkYgYzsKKwkjdW5kZWYJUkVUVVJOX1RZUEVfYworCSNkZWZpbmUJUkVUVVJOX1RZUEVfYyBzZXA6OkJGCisKKwlzZXA6OkJGIGU7CisJI3VuZGVmCVJFVFVSTl9UWVBFX2UKKwkjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTU0MDo2OiAoICggJ2Vsc2VpZicgfCAnZWxzZScgJ2lmJyApIGM9IGV4cHJlc3Npb24gTENVUkxZIGU9IGV4cHJlc3Npb24gUkNVUkxZICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NTQwOjY6ICggJ2Vsc2VpZicgfCAnZWxzZScgJ2lmJyApIGM9IGV4cHJlc3Npb24gTENVUkxZIGU9IGV4cHJlc3Npb24gUkNVUkxZCisgICAgeworICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NTQwOjY6ICggJ2Vsc2VpZicgfCAnZWxzZScgJ2lmJyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBhbHQ2OTQ9MjsKKyAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMjc0OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0Njk0PTE7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNzM6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ2OTQ9MjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRkFJTEVERkxBRyA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENPTlNUUlVDVEVYKCk7CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgICAgICAgICAgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSIiOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gNjk0OworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gMDsKKworCisgICAgICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDg5NF9mbWxFeDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDY5NCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NTQwOjg6ICdlbHNlaWYnCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICAgTUFUQ0hUKDI3NCwgJkZPTExPV18yNzRfaW5fc3lucHJlZDg5NF9mbWwxOTM1MCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ4OTRfZm1sRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgMjoKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NTQwOjE5OiAnZWxzZScgJ2lmJworICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgyNzMsICZGT0xMT1dfMjczX2luX3N5bnByZWQ4OTRfZm1sMTkzNTQpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkODk0X2ZtbEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICAgICAgIE1BVENIVCgyOTQsICZGT0xMT1dfMjk0X2luX3N5bnByZWQ4OTRfZm1sMTkzNTYpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkODk0X2ZtbEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDg5NF9mbWwxOTM2Mik7CisgICAgICAgIGM9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkODk0X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICAgICAgIE1BVENIVChMQ1VSTFksICZGT0xMT1dfTENVUkxZX2luX3N5bnByZWQ4OTRfZm1sMTkzNjUpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkODk0X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkODk0X2ZtbDE5MzcwKTsKKyAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ4OTRfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgICAgICAgTUFUQ0hUKFJDVVJMWSwgJkZPTExPV19SQ1VSTFlfaW5fc3lucHJlZDg5NF9mbWwxOTM3Myk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ4OTRfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQ4OTRfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkODk0X2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDg5NF9mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ4OTZfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkODk2X2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisJc2VwOjpCRkNvZGUgaXNhOworCSN1bmRlZglSRVRVUk5fVFlQRV9pc2EKKwkjZGVmaW5lCVJFVFVSTl9UWVBFX2lzYSBzZXA6OkJGQ29kZQorCisJc2VwOjpCRiBlOworCSN1bmRlZglSRVRVUk5fVFlQRV9lCisJI2RlZmluZQlSRVRVUk5fVFlQRV9lIHNlcDo6QkYKKworCXNlcDo6QkZDb2RlIHNhaTsKKwkjdW5kZWYJUkVUVVJOX1RZUEVfc2FpCisJI2RlZmluZQlSRVRVUk5fVFlQRV9zYWkgc2VwOjpCRkNvZGUKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU1NzQ6NjogKGlzYT0gZm9yX2Fzc2lnbl9oZWFkZXIgU0VNSSBlPSBleHByZXNzaW9uIFNFTUkgc2FpPSBmb3JfYXNzaWduX2hlYWRlciApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTU3NDo2OiBpc2E9IGZvcl9hc3NpZ25faGVhZGVyIFNFTUkgZT0gZXhwcmVzc2lvbiBTRU1JIHNhaT0gZm9yX2Fzc2lnbl9oZWFkZXIKKyAgICB7CisgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2Zvcl9hc3NpZ25faGVhZGVyX2luX3N5bnByZWQ4OTZfZm1sMTk0NjApOworICAgICAgICBpc2E9Zm9yX2Fzc2lnbl9oZWFkZXIoY3R4KTsKKworICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDg5Nl9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgICAgICBNQVRDSFQoU0VNSSwgJkZPTExPV19TRU1JX2luX3N5bnByZWQ4OTZfZm1sMTk0NjMpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkODk2X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkODk2X2ZtbDE5NDY4KTsKKyAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ4OTZfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgICAgICAgTUFUQ0hUKFNFTUksICZGT0xMT1dfU0VNSV9pbl9zeW5wcmVkODk2X2ZtbDE5NDcxKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDg5Nl9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2Zvcl9hc3NpZ25faGVhZGVyX2luX3N5bnByZWQ4OTZfZm1sMTk0NzYpOworICAgICAgICBzYWk9Zm9yX2Fzc2lnbl9oZWFkZXIoY3R4KTsKKworICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDg5Nl9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisvLworZ290byBydWxlc3lucHJlZDg5Nl9mbWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworcnVsZXN5bnByZWQ4OTZfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkODk2X2ZtbAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDg5N19mbWwKK3N0YXRpYyB2b2lkIHN5bnByZWQ4OTdfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKwlzZXA6OkJGQ29kZSBpc2E7CisJI3VuZGVmCVJFVFVSTl9UWVBFX2lzYQorCSNkZWZpbmUJUkVUVVJOX1RZUEVfaXNhIHNlcDo6QkZDb2RlCisKKwlzZXA6OkJGIGU7CisJI3VuZGVmCVJFVFVSTl9UWVBFX2UKKwkjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisJc2VwOjpCRkNvZGUgc2FpOworCSN1bmRlZglSRVRVUk5fVFlQRV9zYWkKKwkjZGVmaW5lCVJFVFVSTl9UWVBFX3NhaSBzZXA6OkJGQ29kZQorCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTU3Nzo2OiAoIExQQVJFTiBpc2E9IGZvcl9hc3NpZ25faGVhZGVyIFNFTUkgZT0gZXhwcmVzc2lvbiBTRU1JIHNhaT0gZm9yX2Fzc2lnbl9oZWFkZXIgUlBBUkVOICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NTc3OjY6IExQQVJFTiBpc2E9IGZvcl9hc3NpZ25faGVhZGVyIFNFTUkgZT0gZXhwcmVzc2lvbiBTRU1JIHNhaT0gZm9yX2Fzc2lnbl9oZWFkZXIgUlBBUkVOCisgICAgeworICAgICAgICAgTUFUQ0hUKExQQVJFTiwgJkZPTExPV19MUEFSRU5faW5fc3lucHJlZDg5N19mbWwxOTQ5NSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ4OTdfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19mb3JfYXNzaWduX2hlYWRlcl9pbl9zeW5wcmVkODk3X2ZtbDE5NTA2KTsKKyAgICAgICAgaXNhPWZvcl9hc3NpZ25faGVhZGVyKGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ4OTdfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgICAgICAgTUFUQ0hUKFNFTUksICZGT0xMT1dfU0VNSV9pbl9zeW5wcmVkODk3X2ZtbDE5NTA5KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDg5N19mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDg5N19mbWwxOTUxNCk7CisgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkODk3X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICAgICAgIE1BVENIVChTRU1JLCAmRk9MTE9XX1NFTUlfaW5fc3lucHJlZDg5N19mbWwxOTUxNyk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ4OTdfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19mb3JfYXNzaWduX2hlYWRlcl9pbl9zeW5wcmVkODk3X2ZtbDE5NTIyKTsKKyAgICAgICAgc2FpPWZvcl9hc3NpZ25faGVhZGVyKGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ4OTdfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgICAgICAgTUFUQ0hUKFJQQVJFTiwgJkZPTExPV19SUEFSRU5faW5fc3lucHJlZDg5N19mbWwxOTUyOSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ4OTdfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQ4OTdfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkODk3X2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDg5N19mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ4OThfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkODk4X2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisJc2VwOjpCRiBsdjsKKwkjdW5kZWYJUkVUVVJOX1RZUEVfbHYKKwkjZGVmaW5lCVJFVFVSTl9UWVBFX2x2IHNlcDo6QkYKKworCXNlcDo6QkYgZTsKKwkjdW5kZWYJUkVUVVJOX1RZUEVfZQorCSNkZWZpbmUJUkVUVVJOX1RZUEVfZSBzZXA6OkJGCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1NTgyOjY6IChsdj0gbHZhbHVlIENPTE9OIGU9IGV4cHJlc3Npb24gKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU1ODI6NjogbHY9IGx2YWx1ZSBDT0xPTiBlPSBleHByZXNzaW9uCisgICAgeworICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19sdmFsdWVfaW5fc3lucHJlZDg5OF9mbWwxOTU1MCk7CisgICAgICAgIGx2PWx2YWx1ZShjdHgpOworCisgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkODk4X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICAgICAgIE1BVENIVChDT0xPTiwgJkZPTExPV19DT0xPTl9pbl9zeW5wcmVkODk4X2ZtbDE5NTUzKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDg5OF9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDg5OF9mbWwxOTU1OCk7CisgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkODk4X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKy8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKy8vCitnb3RvIHJ1bGVzeW5wcmVkODk4X2ZtbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCitydWxlc3lucHJlZDg5OF9mbWxFeDogOworCit9CisvLyAkQU5UTFIgZW5kIHN5bnByZWQ4OThfZm1sCisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkOTQ2X2ZtbAorc3RhdGljIHZvaWQgc3lucHJlZDk0Nl9mbWxfZnJhZ21lbnQocGZtbFBhcnNlciBjdHggKQoreworCWZtbFBhcnNlcl9sYWJlbGxlZF9hcmd1bWVudF9yZXR1cm4gbHA7CisJI3VuZGVmCVJFVFVSTl9UWVBFX2xwCisJI2RlZmluZQlSRVRVUk5fVFlQRV9scCBmbWxQYXJzZXJfbGFiZWxsZWRfYXJndW1lbnRfcmV0dXJuCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1ODE1OjY6ICggTFBBUkVOIGxwPSBsYWJlbGxlZF9hcmd1bWVudCAoIENPTU1BIGxwPSBsYWJlbGxlZF9hcmd1bWVudCApKiBSUEFSRU4gKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU4MTU6NjogTFBBUkVOIGxwPSBsYWJlbGxlZF9hcmd1bWVudCAoIENPTU1BIGxwPSBsYWJlbGxlZF9hcmd1bWVudCApKiBSUEFSRU4KKyAgICB7CisgICAgICAgICBNQVRDSFQoTFBBUkVOLCAmRk9MTE9XX0xQQVJFTl9pbl9zeW5wcmVkOTQ2X2ZtbDIwNjE0KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDk0Nl9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2xhYmVsbGVkX2FyZ3VtZW50X2luX3N5bnByZWQ5NDZfZm1sMjA2MjMpOworICAgICAgICBscD1sYWJlbGxlZF9hcmd1bWVudChjdHgpOworCisgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkOTQ2X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTgyMDo2OiAoIENPTU1BIGxwPSBsYWJlbGxlZF9hcmd1bWVudCApKgorCisgICAgICAgIGZvciAoOzspCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBhbHQ3MDY9MjsKKyAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQ09NTUE6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ3MDY9MTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQ3MDYpCisgICAgICAgICAgICB7CisgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTgyMDo4OiBDT01NQSBscD0gbGFiZWxsZWRfYXJndW1lbnQKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgICBNQVRDSFQoQ09NTUEsICZGT0xMT1dfQ09NTUFfaW5fc3lucHJlZDk0Nl9mbWwyMDYzOSk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ5NDZfZm1sRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19sYWJlbGxlZF9hcmd1bWVudF9pbl9zeW5wcmVkOTQ2X2ZtbDIwNjUwKTsKKyAgICAgICAgCSAgICAgICAgbHA9bGFiZWxsZWRfYXJndW1lbnQoY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDk0Nl9mbWxFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgIAlkZWZhdWx0OgorICAgICAgICAJICAgIGdvdG8gbG9vcDcwNjsJLyogYnJlYWsgb3V0IG9mIHRoZSBsb29wICovCisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbG9vcDcwNjogOyAvKiBKdW1wIG91dCB0byBoZXJlIGlmIHRoaXMgcnVsZSBkb2VzIG5vdCBtYXRjaCAqLworCisKKyAgICAgICAgIE1BVENIVChSUEFSRU4sICZGT0xMT1dfUlBBUkVOX2luX3N5bnByZWQ5NDZfZm1sMjA2NzQpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkOTQ2X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKy8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKy8vCitnb3RvIHJ1bGVzeW5wcmVkOTQ2X2ZtbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCitydWxlc3lucHJlZDk0Nl9mbWxFeDogOworCit9CisvLyAkQU5UTFIgZW5kIHN5bnByZWQ5NDZfZm1sCisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkOTQ3X2ZtbAorc3RhdGljIHZvaWQgc3lucHJlZDk0N19mbWxfZnJhZ21lbnQocGZtbFBhcnNlciBjdHggKQoreworCXNlcDo6QkYgZTsKKwkjdW5kZWYJUkVUVVJOX1RZUEVfZQorCSNkZWZpbmUJUkVUVVJOX1RZUEVfZSBzZXA6OkJGCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1ODk5OjQ6ICggQVNTSUdOIGU9IGV4cHJlc3Npb24gKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU4OTk6NDogQVNTSUdOIGU9IGV4cHJlc3Npb24KKyAgICB7CisgICAgICAgICBNQVRDSFQoQVNTSUdOLCAmRk9MTE9XX0FTU0lHTl9pbl9zeW5wcmVkOTQ3X2ZtbDIwNzY2KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDk0N19mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk0N19mbWwyMDc3MSk7CisgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkOTQ3X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKy8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKy8vCitnb3RvIHJ1bGVzeW5wcmVkOTQ3X2ZtbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCitydWxlc3lucHJlZDk0N19mbWxFeDogOworCit9CisvLyAkQU5UTFIgZW5kIHN5bnByZWQ5NDdfZm1sCisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkOTQ4X2ZtbAorc3RhdGljIHZvaWQgc3lucHJlZDk0OF9mbWxfZnJhZ21lbnQocGZtbFBhcnNlciBjdHggKQoreworCXNlcDo6QkYgZTsKKwkjdW5kZWYJUkVUVVJOX1RZUEVfZQorCSNkZWZpbmUJUkVUVVJOX1RZUEVfZSBzZXA6OkJGCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1OTAyOjQ6ICggQVNTSUdOX01BQ1JPIGU9IGV4cHJlc3Npb24gKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU5MDI6NDogQVNTSUdOX01BQ1JPIGU9IGV4cHJlc3Npb24KKyAgICB7CisgICAgICAgICBNQVRDSFQoQVNTSUdOX01BQ1JPLCAmRk9MTE9XX0FTU0lHTl9NQUNST19pbl9zeW5wcmVkOTQ4X2ZtbDIwNzgwKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDk0OF9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk0OF9mbWwyMDc4NSk7CisgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkOTQ4X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKy8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKy8vCitnb3RvIHJ1bGVzeW5wcmVkOTQ4X2ZtbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCitydWxlc3lucHJlZDk0OF9mbWxFeDogOworCit9CisvLyAkQU5UTFIgZW5kIHN5bnByZWQ5NDhfZm1sCisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkOTQ5X2ZtbAorc3RhdGljIHZvaWQgc3lucHJlZDk0OV9mbWxfZnJhZ21lbnQocGZtbFBhcnNlciBjdHggKQoreworCXNlcDo6QkYgZTsKKwkjdW5kZWYJUkVUVVJOX1RZUEVfZQorCSNkZWZpbmUJUkVUVVJOX1RZUEVfZSBzZXA6OkJGCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1OTA1OjQ6ICggQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24gKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU5MDU6NDogQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24KKyAgICB7CisgICAgICAgICBNQVRDSFQoQVNTSUdOX0FGVEVSLCAmRk9MTE9XX0FTU0lHTl9BRlRFUl9pbl9zeW5wcmVkOTQ5X2ZtbDIwNzk0KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDk0OV9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk0OV9mbWwyMDc5OSk7CisgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkOTQ5X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKy8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKy8vCitnb3RvIHJ1bGVzeW5wcmVkOTQ5X2ZtbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCitydWxlc3lucHJlZDk0OV9mbWxFeDogOworCit9CisvLyAkQU5UTFIgZW5kIHN5bnByZWQ5NDlfZm1sCisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkOTUwX2ZtbAorc3RhdGljIHZvaWQgc3lucHJlZDk1MF9mbWxfZnJhZ21lbnQocGZtbFBhcnNlciBjdHggKQoreworCXNlcDo6QkYgZTsKKwkjdW5kZWYJUkVUVVJOX1RZUEVfZQorCSNkZWZpbmUJUkVUVVJOX1RZUEVfZSBzZXA6OkJGCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1OTA4OjQ6ICggUExVU19BU1NJR04gZT0gZXhwcmVzc2lvbiApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTkwODo0OiBQTFVTX0FTU0lHTiBlPSBleHByZXNzaW9uCisgICAgeworICAgICAgICAgTUFUQ0hUKFBMVVNfQVNTSUdOLCAmRk9MTE9XX1BMVVNfQVNTSUdOX2luX3N5bnByZWQ5NTBfZm1sMjA4MDgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkOTUwX2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTUwX2ZtbDIwODEzKTsKKyAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ5NTBfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQ5NTBfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkOTUwX2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDk1MF9mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ5NTFfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkOTUxX2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisJc2VwOjpCRiBlOworCSN1bmRlZglSRVRVUk5fVFlQRV9lCisJI2RlZmluZQlSRVRVUk5fVFlQRV9lIHNlcDo6QkYKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU5MTE6NDogKCBQTFVTX0FTU0lHTl9BRlRFUiBlPSBleHByZXNzaW9uICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1OTExOjQ6IFBMVVNfQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24KKyAgICB7CisgICAgICAgICBNQVRDSFQoUExVU19BU1NJR05fQUZURVIsICZGT0xMT1dfUExVU19BU1NJR05fQUZURVJfaW5fc3lucHJlZDk1MV9mbWwyMDgyMik7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ5NTFfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NTFfZm1sMjA4MjcpOworICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDk1MV9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisvLworZ290byBydWxlc3lucHJlZDk1MV9mbWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworcnVsZXN5bnByZWQ5NTFfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkOTUxX2ZtbAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDk1Ml9mbWwKK3N0YXRpYyB2b2lkIHN5bnByZWQ5NTJfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKwlzZXA6OkJGIGU7CisJI3VuZGVmCVJFVFVSTl9UWVBFX2UKKwkjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTkxNDo0OiAoIE1JTlVTX0FTU0lHTiBlPSBleHByZXNzaW9uICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1OTE0OjQ6IE1JTlVTX0FTU0lHTiBlPSBleHByZXNzaW9uCisgICAgeworICAgICAgICAgTUFUQ0hUKE1JTlVTX0FTU0lHTiwgJkZPTExPV19NSU5VU19BU1NJR05faW5fc3lucHJlZDk1Ml9mbWwyMDgzNik7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ5NTJfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NTJfZm1sMjA4NDEpOworICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDk1Ml9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisvLworZ290byBydWxlc3lucHJlZDk1Ml9mbWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworcnVsZXN5bnByZWQ5NTJfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkOTUyX2ZtbAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDk1M19mbWwKK3N0YXRpYyB2b2lkIHN5bnByZWQ5NTNfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKwlzZXA6OkJGIGU7CisJI3VuZGVmCVJFVFVSTl9UWVBFX2UKKwkjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTkxNzo0OiAoIE1JTlVTX0FTU0lHTl9BRlRFUiBlPSBleHByZXNzaW9uICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1OTE3OjQ6IE1JTlVTX0FTU0lHTl9BRlRFUiBlPSBleHByZXNzaW9uCisgICAgeworICAgICAgICAgTUFUQ0hUKE1JTlVTX0FTU0lHTl9BRlRFUiwgJkZPTExPV19NSU5VU19BU1NJR05fQUZURVJfaW5fc3lucHJlZDk1M19mbWwyMDg1MCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ5NTNfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NTNfZm1sMjA4NTUpOworICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDk1M19mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisvLworZ290byBydWxlc3lucHJlZDk1M19mbWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworcnVsZXN5bnByZWQ5NTNfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkOTUzX2ZtbAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDk1NF9mbWwKK3N0YXRpYyB2b2lkIHN5bnByZWQ5NTRfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKwlzZXA6OkJGIGU7CisJI3VuZGVmCVJFVFVSTl9UWVBFX2UKKwkjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTkyMDo0OiAoIFNUQVJfQVNTSUdOIGU9IGV4cHJlc3Npb24gKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU5MjA6NDogU1RBUl9BU1NJR04gZT0gZXhwcmVzc2lvbgorICAgIHsKKyAgICAgICAgIE1BVENIVChTVEFSX0FTU0lHTiwgJkZPTExPV19TVEFSX0FTU0lHTl9pbl9zeW5wcmVkOTU0X2ZtbDIwODY0KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDk1NF9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk1NF9mbWwyMDg2OSk7CisgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkOTU0X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKy8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKy8vCitnb3RvIHJ1bGVzeW5wcmVkOTU0X2ZtbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCitydWxlc3lucHJlZDk1NF9mbWxFeDogOworCit9CisvLyAkQU5UTFIgZW5kIHN5bnByZWQ5NTRfZm1sCisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkOTU1X2ZtbAorc3RhdGljIHZvaWQgc3lucHJlZDk1NV9mbWxfZnJhZ21lbnQocGZtbFBhcnNlciBjdHggKQoreworCXNlcDo6QkYgZTsKKwkjdW5kZWYJUkVUVVJOX1RZUEVfZQorCSNkZWZpbmUJUkVUVVJOX1RZUEVfZSBzZXA6OkJGCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1OTIzOjQ6ICggU1RBUl9BU1NJR05fQUZURVIgZT0gZXhwcmVzc2lvbiApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTkyMzo0OiBTVEFSX0FTU0lHTl9BRlRFUiBlPSBleHByZXNzaW9uCisgICAgeworICAgICAgICAgTUFUQ0hUKFNUQVJfQVNTSUdOX0FGVEVSLCAmRk9MTE9XX1NUQVJfQVNTSUdOX0FGVEVSX2luX3N5bnByZWQ5NTVfZm1sMjA4NzgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkOTU1X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTU1X2ZtbDIwODgzKTsKKyAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ5NTVfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQ5NTVfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkOTU1X2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDk1NV9mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ5NTZfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkOTU2X2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisJc2VwOjpCRiBlOworCSN1bmRlZglSRVRVUk5fVFlQRV9lCisJI2RlZmluZQlSRVRVUk5fVFlQRV9lIHNlcDo6QkYKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU5MjY6NDogKCBESVZfQVNTSUdOIGU9IGV4cHJlc3Npb24gKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU5MjY6NDogRElWX0FTU0lHTiBlPSBleHByZXNzaW9uCisgICAgeworICAgICAgICAgTUFUQ0hUKERJVl9BU1NJR04sICZGT0xMT1dfRElWX0FTU0lHTl9pbl9zeW5wcmVkOTU2X2ZtbDIwODkyKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDk1Nl9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk1Nl9mbWwyMDg5Nyk7CisgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkOTU2X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKy8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKy8vCitnb3RvIHJ1bGVzeW5wcmVkOTU2X2ZtbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCitydWxlc3lucHJlZDk1Nl9mbWxFeDogOworCit9CisvLyAkQU5UTFIgZW5kIHN5bnByZWQ5NTZfZm1sCisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkOTU3X2ZtbAorc3RhdGljIHZvaWQgc3lucHJlZDk1N19mbWxfZnJhZ21lbnQocGZtbFBhcnNlciBjdHggKQoreworCXNlcDo6QkYgZTsKKwkjdW5kZWYJUkVUVVJOX1RZUEVfZQorCSNkZWZpbmUJUkVUVVJOX1RZUEVfZSBzZXA6OkJGCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1OTI5OjQ6ICggRElWX0FTU0lHTl9BRlRFUiBlPSBleHByZXNzaW9uICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1OTI5OjQ6IERJVl9BU1NJR05fQUZURVIgZT0gZXhwcmVzc2lvbgorICAgIHsKKyAgICAgICAgIE1BVENIVChESVZfQVNTSUdOX0FGVEVSLCAmRk9MTE9XX0RJVl9BU1NJR05fQUZURVJfaW5fc3lucHJlZDk1N19mbWwyMDkwNik7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ5NTdfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NTdfZm1sMjA5MTEpOworICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDk1N19mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisvLworZ290byBydWxlc3lucHJlZDk1N19mbWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworcnVsZXN5bnByZWQ5NTdfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkOTU3X2ZtbAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDk1OF9mbWwKK3N0YXRpYyB2b2lkIHN5bnByZWQ5NThfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKwlzZXA6OkJGIGU7CisJI3VuZGVmCVJFVFVSTl9UWVBFX2UKKwkjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTkzMjo0OiAoIE1PRF9BU1NJR04gZT0gZXhwcmVzc2lvbiApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTkzMjo0OiBNT0RfQVNTSUdOIGU9IGV4cHJlc3Npb24KKyAgICB7CisgICAgICAgICBNQVRDSFQoTU9EX0FTU0lHTiwgJkZPTExPV19NT0RfQVNTSUdOX2luX3N5bnByZWQ5NThfZm1sMjA5MjApOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkOTU4X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTU4X2ZtbDIwOTI1KTsKKyAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ5NThfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQ5NThfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkOTU4X2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDk1OF9mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ5NTlfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkOTU5X2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisJc2VwOjpCRiBlOworCSN1bmRlZglSRVRVUk5fVFlQRV9lCisJI2RlZmluZQlSRVRVUk5fVFlQRV9lIHNlcDo6QkYKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU5MzU6NDogKCBNT0RfQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24gKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU5MzU6NDogTU9EX0FTU0lHTl9BRlRFUiBlPSBleHByZXNzaW9uCisgICAgeworICAgICAgICAgTUFUQ0hUKE1PRF9BU1NJR05fQUZURVIsICZGT0xMT1dfTU9EX0FTU0lHTl9BRlRFUl9pbl9zeW5wcmVkOTU5X2ZtbDIwOTM0KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDk1OV9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk1OV9mbWwyMDkzOSk7CisgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkOTU5X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKy8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKy8vCitnb3RvIHJ1bGVzeW5wcmVkOTU5X2ZtbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCitydWxlc3lucHJlZDk1OV9mbWxFeDogOworCit9CisvLyAkQU5UTFIgZW5kIHN5bnByZWQ5NTlfZm1sCisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkOTYwX2ZtbAorc3RhdGljIHZvaWQgc3lucHJlZDk2MF9mbWxfZnJhZ21lbnQocGZtbFBhcnNlciBjdHggKQoreworCXNlcDo6QkYgZTsKKwkjdW5kZWYJUkVUVVJOX1RZUEVfZQorCSNkZWZpbmUJUkVUVVJOX1RZUEVfZSBzZXA6OkJGCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1OTM4OjQ6ICggTEFORF9BU1NJR04gZT0gZXhwcmVzc2lvbiApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTkzODo0OiBMQU5EX0FTU0lHTiBlPSBleHByZXNzaW9uCisgICAgeworICAgICAgICAgTUFUQ0hUKExBTkRfQVNTSUdOLCAmRk9MTE9XX0xBTkRfQVNTSUdOX2luX3N5bnByZWQ5NjBfZm1sMjA5NDgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkOTYwX2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTYwX2ZtbDIwOTUzKTsKKyAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ5NjBfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQ5NjBfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkOTYwX2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDk2MF9mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ5NjFfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkOTYxX2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisJc2VwOjpCRiBlOworCSN1bmRlZglSRVRVUk5fVFlQRV9lCisJI2RlZmluZQlSRVRVUk5fVFlQRV9lIHNlcDo6QkYKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU5NDE6NDogKCBMQU5EX0FTU0lHTl9BRlRFUiBlPSBleHByZXNzaW9uICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1OTQxOjQ6IExBTkRfQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24KKyAgICB7CisgICAgICAgICBNQVRDSFQoTEFORF9BU1NJR05fQUZURVIsICZGT0xMT1dfTEFORF9BU1NJR05fQUZURVJfaW5fc3lucHJlZDk2MV9mbWwyMDk2Mik7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ5NjFfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NjFfZm1sMjA5NjcpOworICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDk2MV9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisvLworZ290byBydWxlc3lucHJlZDk2MV9mbWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworcnVsZXN5bnByZWQ5NjFfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkOTYxX2ZtbAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDk2Ml9mbWwKK3N0YXRpYyB2b2lkIHN5bnByZWQ5NjJfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKwlzZXA6OkJGIGU7CisJI3VuZGVmCVJFVFVSTl9UWVBFX2UKKwkjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTk0NDo0OiAoIExPUl9BU1NJR04gZT0gZXhwcmVzc2lvbiApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTk0NDo0OiBMT1JfQVNTSUdOIGU9IGV4cHJlc3Npb24KKyAgICB7CisgICAgICAgICBNQVRDSFQoTE9SX0FTU0lHTiwgJkZPTExPV19MT1JfQVNTSUdOX2luX3N5bnByZWQ5NjJfZm1sMjA5NzYpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkOTYyX2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTYyX2ZtbDIwOTgxKTsKKyAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ5NjJfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQ5NjJfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkOTYyX2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDk2Ml9mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ5NjNfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkOTYzX2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisJc2VwOjpCRiBlOworCSN1bmRlZglSRVRVUk5fVFlQRV9lCisJI2RlZmluZQlSRVRVUk5fVFlQRV9lIHNlcDo6QkYKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU5NDc6NDogKCBMT1JfQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24gKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU5NDc6NDogTE9SX0FTU0lHTl9BRlRFUiBlPSBleHByZXNzaW9uCisgICAgeworICAgICAgICAgTUFUQ0hUKExPUl9BU1NJR05fQUZURVIsICZGT0xMT1dfTE9SX0FTU0lHTl9BRlRFUl9pbl9zeW5wcmVkOTYzX2ZtbDIwOTkwKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDk2M19mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk2M19mbWwyMDk5NSk7CisgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkOTYzX2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKy8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKy8vCitnb3RvIHJ1bGVzeW5wcmVkOTYzX2ZtbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCitydWxlc3lucHJlZDk2M19mbWxFeDogOworCit9CisvLyAkQU5UTFIgZW5kIHN5bnByZWQ5NjNfZm1sCisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkOTY0X2ZtbAorc3RhdGljIHZvaWQgc3lucHJlZDk2NF9mbWxfZnJhZ21lbnQocGZtbFBhcnNlciBjdHggKQoreworCXNlcDo6QkYgZTsKKwkjdW5kZWYJUkVUVVJOX1RZUEVfZQorCSNkZWZpbmUJUkVUVVJOX1RZUEVfZSBzZXA6OkJGCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1OTUwOjQ6ICggQkFORF9BU1NJR04gZT0gZXhwcmVzc2lvbiApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTk1MDo0OiBCQU5EX0FTU0lHTiBlPSBleHByZXNzaW9uCisgICAgeworICAgICAgICAgTUFUQ0hUKEJBTkRfQVNTSUdOLCAmRk9MTE9XX0JBTkRfQVNTSUdOX2luX3N5bnByZWQ5NjRfZm1sMjEwMDQpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkOTY0X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTY0X2ZtbDIxMDA5KTsKKyAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ5NjRfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQ5NjRfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkOTY0X2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDk2NF9mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ5NjVfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkOTY1X2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisJc2VwOjpCRiBlOworCSN1bmRlZglSRVRVUk5fVFlQRV9lCisJI2RlZmluZQlSRVRVUk5fVFlQRV9lIHNlcDo6QkYKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU5NTM6NDogKCBCQU5EX0FTU0lHTl9BRlRFUiBlPSBleHByZXNzaW9uICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1OTUzOjQ6IEJBTkRfQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24KKyAgICB7CisgICAgICAgICBNQVRDSFQoQkFORF9BU1NJR05fQUZURVIsICZGT0xMT1dfQkFORF9BU1NJR05fQUZURVJfaW5fc3lucHJlZDk2NV9mbWwyMTAxOCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ5NjVfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NjVfZm1sMjEwMjMpOworICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDk2NV9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisvLworZ290byBydWxlc3lucHJlZDk2NV9mbWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworcnVsZXN5bnByZWQ5NjVfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkOTY1X2ZtbAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDk2Nl9mbWwKK3N0YXRpYyB2b2lkIHN5bnByZWQ5NjZfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKwlzZXA6OkJGIGU7CisJI3VuZGVmCVJFVFVSTl9UWVBFX2UKKwkjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTk1Njo0OiAoIEJPUl9BU1NJR04gZT0gZXhwcmVzc2lvbiApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTk1Njo0OiBCT1JfQVNTSUdOIGU9IGV4cHJlc3Npb24KKyAgICB7CisgICAgICAgICBNQVRDSFQoQk9SX0FTU0lHTiwgJkZPTExPV19CT1JfQVNTSUdOX2luX3N5bnByZWQ5NjZfZm1sMjEwMzIpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkOTY2X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTY2X2ZtbDIxMDM3KTsKKyAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ5NjZfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQ5NjZfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkOTY2X2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDk2Nl9mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ5NjdfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkOTY3X2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisJc2VwOjpCRiBlOworCSN1bmRlZglSRVRVUk5fVFlQRV9lCisJI2RlZmluZQlSRVRVUk5fVFlQRV9lIHNlcDo6QkYKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU5NTk6NDogKCBCT1JfQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24gKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU5NTk6NDogQk9SX0FTU0lHTl9BRlRFUiBlPSBleHByZXNzaW9uCisgICAgeworICAgICAgICAgTUFUQ0hUKEJPUl9BU1NJR05fQUZURVIsICZGT0xMT1dfQk9SX0FTU0lHTl9BRlRFUl9pbl9zeW5wcmVkOTY3X2ZtbDIxMDQ2KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDk2N19mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk2N19mbWwyMTA1MSk7CisgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkOTY3X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKy8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKy8vCitnb3RvIHJ1bGVzeW5wcmVkOTY3X2ZtbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCitydWxlc3lucHJlZDk2N19mbWxFeDogOworCit9CisvLyAkQU5UTFIgZW5kIHN5bnByZWQ5NjdfZm1sCisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkOTY4X2ZtbAorc3RhdGljIHZvaWQgc3lucHJlZDk2OF9mbWxfZnJhZ21lbnQocGZtbFBhcnNlciBjdHggKQoreworCXNlcDo6QkYgZTsKKwkjdW5kZWYJUkVUVVJOX1RZUEVfZQorCSNkZWZpbmUJUkVUVVJOX1RZUEVfZSBzZXA6OkJGCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1OTYyOjQ6ICggQlhPUl9BU1NJR04gZT0gZXhwcmVzc2lvbiApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTk2Mjo0OiBCWE9SX0FTU0lHTiBlPSBleHByZXNzaW9uCisgICAgeworICAgICAgICAgTUFUQ0hUKEJYT1JfQVNTSUdOLCAmRk9MTE9XX0JYT1JfQVNTSUdOX2luX3N5bnByZWQ5NjhfZm1sMjEwNjApOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkOTY4X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTY4X2ZtbDIxMDY1KTsKKyAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ5NjhfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQ5NjhfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkOTY4X2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDk2OF9mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ5NjlfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkOTY5X2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisJc2VwOjpCRiBlOworCSN1bmRlZglSRVRVUk5fVFlQRV9lCisJI2RlZmluZQlSRVRVUk5fVFlQRV9lIHNlcDo6QkYKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU5NjU6NDogKCBCWE9SX0FTU0lHTl9BRlRFUiBlPSBleHByZXNzaW9uICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1OTY1OjQ6IEJYT1JfQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24KKyAgICB7CisgICAgICAgICBNQVRDSFQoQlhPUl9BU1NJR05fQUZURVIsICZGT0xMT1dfQlhPUl9BU1NJR05fQUZURVJfaW5fc3lucHJlZDk2OV9mbWwyMTA3NCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ5NjlfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NjlfZm1sMjEwNzkpOworICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDk2OV9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisvLworZ290byBydWxlc3lucHJlZDk2OV9mbWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworcnVsZXN5bnByZWQ5NjlfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkOTY5X2ZtbAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDk3MF9mbWwKK3N0YXRpYyB2b2lkIHN5bnByZWQ5NzBfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKwlzZXA6OkJGIGU7CisJI3VuZGVmCVJFVFVSTl9UWVBFX2UKKwkjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTk2ODo0OiAoIExTSElGVF9BU1NJR04gZT0gZXhwcmVzc2lvbiApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTk2ODo0OiBMU0hJRlRfQVNTSUdOIGU9IGV4cHJlc3Npb24KKyAgICB7CisgICAgICAgICBNQVRDSFQoTFNISUZUX0FTU0lHTiwgJkZPTExPV19MU0hJRlRfQVNTSUdOX2luX3N5bnByZWQ5NzBfZm1sMjEwODgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkOTcwX2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTcwX2ZtbDIxMDkzKTsKKyAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ5NzBfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQ5NzBfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkOTcwX2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDk3MF9mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ5NzFfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkOTcxX2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisJc2VwOjpCRiBlOworCSN1bmRlZglSRVRVUk5fVFlQRV9lCisJI2RlZmluZQlSRVRVUk5fVFlQRV9lIHNlcDo6QkYKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU5NzE6NDogKCBMU0hJRlRfQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24gKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU5NzE6NDogTFNISUZUX0FTU0lHTl9BRlRFUiBlPSBleHByZXNzaW9uCisgICAgeworICAgICAgICAgTUFUQ0hUKExTSElGVF9BU1NJR05fQUZURVIsICZGT0xMT1dfTFNISUZUX0FTU0lHTl9BRlRFUl9pbl9zeW5wcmVkOTcxX2ZtbDIxMTAyKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDk3MV9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk3MV9mbWwyMTEwNyk7CisgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkOTcxX2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKy8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKy8vCitnb3RvIHJ1bGVzeW5wcmVkOTcxX2ZtbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCitydWxlc3lucHJlZDk3MV9mbWxFeDogOworCit9CisvLyAkQU5UTFIgZW5kIHN5bnByZWQ5NzFfZm1sCisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkOTcyX2ZtbAorc3RhdGljIHZvaWQgc3lucHJlZDk3Ml9mbWxfZnJhZ21lbnQocGZtbFBhcnNlciBjdHggKQoreworCXNlcDo6QkYgZTsKKwkjdW5kZWYJUkVUVVJOX1RZUEVfZQorCSNkZWZpbmUJUkVUVVJOX1RZUEVfZSBzZXA6OkJGCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1OTc0OjQ6ICggUlNISUZUX0FTU0lHTiBlPSBleHByZXNzaW9uICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1OTc0OjQ6IFJTSElGVF9BU1NJR04gZT0gZXhwcmVzc2lvbgorICAgIHsKKyAgICAgICAgIE1BVENIVChSU0hJRlRfQVNTSUdOLCAmRk9MTE9XX1JTSElGVF9BU1NJR05faW5fc3lucHJlZDk3Ml9mbWwyMTExNik7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ5NzJfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NzJfZm1sMjExMjEpOworICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDk3Ml9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisvLworZ290byBydWxlc3lucHJlZDk3Ml9mbWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworcnVsZXN5bnByZWQ5NzJfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkOTcyX2ZtbAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDk3M19mbWwKK3N0YXRpYyB2b2lkIHN5bnByZWQ5NzNfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKwlzZXA6OkJGIGU7CisJI3VuZGVmCVJFVFVSTl9UWVBFX2UKKwkjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTk3Nzo0OiAoIFJTSElGVF9BU1NJR05fQUZURVIgZT0gZXhwcmVzc2lvbiApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTk3Nzo0OiBSU0hJRlRfQVNTSUdOX0FGVEVSIGU9IGV4cHJlc3Npb24KKyAgICB7CisgICAgICAgICBNQVRDSFQoUlNISUZUX0FTU0lHTl9BRlRFUiwgJkZPTExPV19SU0hJRlRfQVNTSUdOX0FGVEVSX2luX3N5bnByZWQ5NzNfZm1sMjExMzApOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkOTczX2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkOTczX2ZtbDIxMTM1KTsKKyAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ5NzNfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQ5NzNfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkOTczX2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDk3M19mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ5NzRfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkOTc0X2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisJc2VwOjpCRiBlOworCSN1bmRlZglSRVRVUk5fVFlQRV9lCisJI2RlZmluZQlSRVRVUk5fVFlQRV9lIHNlcDo6QkYKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU5ODA6NDogKCBPUF9QVVNIIGU9IGV4cHJlc3Npb24gKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU5ODA6NDogT1BfUFVTSCBlPSBleHByZXNzaW9uCisgICAgeworICAgICAgICAgTUFUQ0hUKE9QX1BVU0gsICZGT0xMT1dfT1BfUFVTSF9pbl9zeW5wcmVkOTc0X2ZtbDIxMTQ0KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDk3NF9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk3NF9mbWwyMTE0OSk7CisgICAgICAgIGU9ZXhwcmVzc2lvbihjdHgpOworCisgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkOTc0X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKy8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKy8vCitnb3RvIHJ1bGVzeW5wcmVkOTc0X2ZtbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCitydWxlc3lucHJlZDk3NF9mbWxFeDogOworCit9CisvLyAkQU5UTFIgZW5kIHN5bnByZWQ5NzRfZm1sCisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkOTc1X2ZtbAorc3RhdGljIHZvaWQgc3lucHJlZDk3NV9mbWxfZnJhZ21lbnQocGZtbFBhcnNlciBjdHggKQoreworCXNlcDo6QkYgZTsKKwkjdW5kZWYJUkVUVVJOX1RZUEVfZQorCSNkZWZpbmUJUkVUVVJOX1RZUEVfZSBzZXA6OkJGCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1OTgzOjQ6ICggT1BfQVNTSUdOX1RPUCBlPSBleHByZXNzaW9uICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1OTgzOjQ6IE9QX0FTU0lHTl9UT1AgZT0gZXhwcmVzc2lvbgorICAgIHsKKyAgICAgICAgIE1BVENIVChPUF9BU1NJR05fVE9QLCAmRk9MTE9XX09QX0FTU0lHTl9UT1BfaW5fc3lucHJlZDk3NV9mbWwyMTE1OCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ5NzVfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NzVfZm1sMjExNjMpOworICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDk3NV9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisvLworZ290byBydWxlc3lucHJlZDk3NV9mbWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworcnVsZXN5bnByZWQ5NzVfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkOTc1X2ZtbAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDk3Nl9mbWwKK3N0YXRpYyB2b2lkIHN5bnByZWQ5NzZfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKwlzZXA6OkJGIGU7CisJI3VuZGVmCVJFVFVSTl9UWVBFX2UKKwkjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTk4Njo0OiAoIE9QX1BPUCBlPSBleHByZXNzaW9uICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo1OTg2OjQ6IE9QX1BPUCBlPSBleHByZXNzaW9uCisgICAgeworICAgICAgICAgTUFUQ0hUKE9QX1BPUCwgJkZPTExPV19PUF9QT1BfaW5fc3lucHJlZDk3Nl9mbWwyMTE3Mik7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ5NzZfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NzZfZm1sMjExNzcpOworICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDk3Nl9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisvLworZ290byBydWxlc3lucHJlZDk3Nl9mbWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworcnVsZXN5bnByZWQ5NzZfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkOTc2X2ZtbAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDk3N19mbWwKK3N0YXRpYyB2b2lkIHN5bnByZWQ5NzdfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKwlzZXA6OkJGIHRoOworCSN1bmRlZglSRVRVUk5fVFlQRV90aAorCSNkZWZpbmUJUkVUVVJOX1RZUEVfdGggc2VwOjpCRgorCisJc2VwOjpCRiBlbDsKKwkjdW5kZWYJUkVUVVJOX1RZUEVfZWwKKwkjZGVmaW5lCVJFVFVSTl9UWVBFX2VsIHNlcDo6QkYKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjU5OTg6NjogKCBRVUVTVElPTiB0aD0gZXhwcmVzc2lvbiBDT0xPTiBlbD0gZXhwcmVzc2lvbiApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NTk5ODo2OiBRVUVTVElPTiB0aD0gZXhwcmVzc2lvbiBDT0xPTiBlbD0gZXhwcmVzc2lvbgorICAgIHsKKyAgICAgICAgIE1BVENIVChRVUVTVElPTiwgJkZPTExPV19RVUVTVElPTl9pbl9zeW5wcmVkOTc3X2ZtbDIxMjE1KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDk3N19mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDk3N19mbWwyMTIyMCk7CisgICAgICAgIHRoPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDk3N19mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgICAgICBNQVRDSFQoQ09MT04sICZGT0xMT1dfQ09MT05faW5fc3lucHJlZDk3N19mbWwyMTIyMyk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ5NzdfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19leHByZXNzaW9uX2luX3N5bnByZWQ5NzdfZm1sMjEyMjgpOworICAgICAgICBlbD1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ5NzdfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQ5NzdfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkOTc3X2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDk3N19mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ5ODBfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkOTgwX2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisJc2VwOjpPcGVyYXRvciAqIG9wOworCSN1bmRlZglSRVRVUk5fVFlQRV9vcAorCSNkZWZpbmUJUkVUVVJOX1RZUEVfb3Agc2VwOjpPcGVyYXRvciAqCisKKwlzZXA6OkJGIGU7CisJI3VuZGVmCVJFVFVSTl9UWVBFX2UKKwkjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjAwNjo2OiAoIChvcD0gb3Bfc2VxdWVuY2UgfG9wPSBvcF9zY2hlZHVsaW5nIHxvcD0gb3BfY29uY3VycmVuY3kgKSBlPSBjb25kaXRpb25hbE9yRXhwcmVzc2lvbiApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjAwNjo2OiAob3A9IG9wX3NlcXVlbmNlIHxvcD0gb3Bfc2NoZWR1bGluZyB8b3A9IG9wX2NvbmN1cnJlbmN5ICkgZT0gY29uZGl0aW9uYWxPckV4cHJlc3Npb24KKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYwMDY6NjogKG9wPSBvcF9zZXF1ZW5jZSB8b3A9IG9wX3NjaGVkdWxpbmcgfG9wPSBvcF9jb25jdXJyZW5jeSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBhbHQ3MDc9MzsKKyAgICAgICAgICAgIHN3aXRjaCAoIExBKDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgT1BfQVRPTUlDX1NFUVVFTkNFOgorICAgICAgICAgICAgY2FzZSBPUF9TRVFVRU5DRToKKyAgICAgICAgICAgIGNhc2UgT1BfU0VRVUVOQ0VfU0lERToKKyAgICAgICAgICAgIGNhc2UgT1BfU0VRVUVOQ0VfV0VBSzoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDcwNz0xOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BfTk9OX0RFVEVSTUlOSVNNOgorICAgICAgICAgICAgY2FzZSBPUF9TQ0hFRFVMRV9BTkRfVEhFTjoKKyAgICAgICAgICAgIGNhc2UgT1BfU0NIRURVTEVfR1Q6CisgICAgICAgICAgICBjYXNlIE9QX1NDSEVEVUxFX0xUOgorICAgICAgICAgICAgY2FzZSBPUF9TQ0hFRFVMRV9PUl9FTFNFOgorICAgICAgICAgICAgY2FzZSBPUF9TQ0hFRFVMRV9YT1I6CisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlhbHQ3MDc9MjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9QX0NPTkNVUlJFTkNZX0FORDoKKyAgICAgICAgICAgIGNhc2UgT1BfQ09OQ1VSUkVOQ1lfQVNZTkM6CisgICAgICAgICAgICBjYXNlIE9QX0NPTkNVUlJFTkNZX0lOVEVSTEVBVklORzoKKyAgICAgICAgICAgIGNhc2UgT1BfQ09OQ1VSUkVOQ1lfT1I6CisgICAgICAgICAgICBjYXNlIE9QX0NPTkNVUlJFTkNZX1BBUkFMTEVMOgorICAgICAgICAgICAgY2FzZSBPUF9DT05DVVJSRU5DWV9SRFZfQU5EOgorICAgICAgICAgICAgY2FzZSBPUF9DT05DVVJSRU5DWV9SRFZfQVNZTkM6CisgICAgICAgICAgICBjYXNlIE9QX0NPTkNVUlJFTkNZX1JEVl9JTlRFUkxFQVZJTkc6CisgICAgICAgICAgICBjYXNlIE9QX0NPTkNVUlJFTkNZX1JEVl9PUjoKKyAgICAgICAgICAgIGNhc2UgT1BfQ09OQ1VSUkVOQ1lfUkRWX1BBUkFMTEVMOgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NzA3PTM7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIEVYQ0VQVElPTi0+bWVzc2FnZSAgICAgID0gKHZvaWQgKikiIjsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPmRlY2lzaW9uTnVtICA9IDcwNzsKKyAgICAgICAgICAgICAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IDA7CisKKworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ5ODBfZm1sRXg7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQ3MDcpCisgICAgICAgICAgICB7CisgICAgICAgIAljYXNlIDE6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjAwNjo4OiBvcD0gb3Bfc2VxdWVuY2UKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX29wX3NlcXVlbmNlX2luX3N5bnByZWQ5ODBfZm1sMjEyNzApOworICAgICAgICAJICAgICAgICBvcD1vcF9zZXF1ZW5jZShjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkOTgwX2ZtbEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgIAljYXNlIDI6CisgICAgICAgIAkgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjAwNjoyNzogb3A9IG9wX3NjaGVkdWxpbmcKKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX29wX3NjaGVkdWxpbmdfaW5fc3lucHJlZDk4MF9mbWwyMTI3OCk7CisgICAgICAgIAkgICAgICAgIG9wPW9wX3NjaGVkdWxpbmcoY3R4KTsKKworICAgICAgICAJICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgCSAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDk4MF9mbWxFeDsKKyAgICAgICAgCSAgICAgICAgfQorICAgICAgICAJICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIAkgICAgICAgIH0KKworCisgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJY2FzZSAzOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYwMDY6NDg6IG9wPSBvcF9jb25jdXJyZW5jeQorICAgICAgICAJICAgIHsKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfb3BfY29uY3VycmVuY3lfaW5fc3lucHJlZDk4MF9mbWwyMTI4Nik7CisgICAgICAgIAkgICAgICAgIG9wPW9wX2NvbmN1cnJlbmN5KGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ5ODBfZm1sRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfY29uZGl0aW9uYWxPckV4cHJlc3Npb25faW5fc3lucHJlZDk4MF9mbWwyMTI5Nyk7CisgICAgICAgIGU9Y29uZGl0aW9uYWxPckV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDk4MF9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisvLworZ290byBydWxlc3lucHJlZDk4MF9mbWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworcnVsZXN5bnByZWQ5ODBfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkOTgwX2ZtbAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDk4MV9mbWwKK3N0YXRpYyB2b2lkIHN5bnByZWQ5ODFfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKwlzZXA6OkJGIGU7CisJI3VuZGVmCVJFVFVSTl9UWVBFX2UKKwkjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjAxNDo2OiAoIExPUiBlPSBjb25kaXRpb25hbEFuZEV4cHJlc3Npb24gKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYwMTQ6NjogTE9SIGU9IGNvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbgorICAgIHsKKyAgICAgICAgIE1BVENIVChMT1IsICZGT0xMT1dfTE9SX2luX3N5bnByZWQ5ODFfZm1sMjEzMzMpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkOTgxX2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfY29uZGl0aW9uYWxBbmRFeHByZXNzaW9uX2luX3N5bnByZWQ5ODFfZm1sMjEzMzcpOworICAgICAgICBlPWNvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbihjdHgpOworCisgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkOTgxX2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKy8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKy8vCitnb3RvIHJ1bGVzeW5wcmVkOTgxX2ZtbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCitydWxlc3lucHJlZDk4MV9mbWxFeDogOworCit9CisvLyAkQU5UTFIgZW5kIHN5bnByZWQ5ODFfZm1sCisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkOTgyX2ZtbAorc3RhdGljIHZvaWQgc3lucHJlZDk4Ml9mbWxfZnJhZ21lbnQocGZtbFBhcnNlciBjdHggKQoreworCXNlcDo6QkYgZTsKKwkjdW5kZWYJUkVUVVJOX1RZUEVfZQorCSNkZWZpbmUJUkVUVVJOX1RZUEVfZSBzZXA6OkJGCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MDIyOjY6ICggTEFORCBlPSBiaXR3aXNlT3JFeHByZXNzaW9uICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MDIyOjY6IExBTkQgZT0gYml0d2lzZU9yRXhwcmVzc2lvbgorICAgIHsKKyAgICAgICAgIE1BVENIVChMQU5ELCAmRk9MTE9XX0xBTkRfaW5fc3lucHJlZDk4Ml9mbWwyMTM3NSk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ5ODJfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19iaXR3aXNlT3JFeHByZXNzaW9uX2luX3N5bnByZWQ5ODJfZm1sMjEzNzkpOworICAgICAgICBlPWJpdHdpc2VPckV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDk4Ml9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisvLworZ290byBydWxlc3lucHJlZDk4Ml9mbWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworcnVsZXN5bnByZWQ5ODJfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkOTgyX2ZtbAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDk4M19mbWwKK3N0YXRpYyB2b2lkIHN5bnByZWQ5ODNfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKwlzZXA6OkJGIGU7CisJI3VuZGVmCVJFVFVSTl9UWVBFX2UKKwkjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjAzMDo2OiAoIEJPUiBlPSBiaXR3aXNlWG9yRXhwcmVzc2lvbiApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjAzMDo2OiBCT1IgZT0gYml0d2lzZVhvckV4cHJlc3Npb24KKyAgICB7CisgICAgICAgICBNQVRDSFQoQk9SLCAmRk9MTE9XX0JPUl9pbl9zeW5wcmVkOTgzX2ZtbDIxNDE3KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDk4M19mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2JpdHdpc2VYb3JFeHByZXNzaW9uX2luX3N5bnByZWQ5ODNfZm1sMjE0MjEpOworICAgICAgICBlPWJpdHdpc2VYb3JFeHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ5ODNfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQ5ODNfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkOTgzX2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDk4M19mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ5ODRfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkOTg0X2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisJc2VwOjpCRiBlOworCSN1bmRlZglSRVRVUk5fVFlQRV9lCisJI2RlZmluZQlSRVRVUk5fVFlQRV9lIHNlcDo6QkYKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYwMzg6NjogKCBCWE9SIGU9IGJpdHdpc2VBbmRFeHByZXNzaW9uICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MDM4OjY6IEJYT1IgZT0gYml0d2lzZUFuZEV4cHJlc3Npb24KKyAgICB7CisgICAgICAgICBNQVRDSFQoQlhPUiwgJkZPTExPV19CWE9SX2luX3N5bnByZWQ5ODRfZm1sMjE0NTkpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkOTg0X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfYml0d2lzZUFuZEV4cHJlc3Npb25faW5fc3lucHJlZDk4NF9mbWwyMTQ2Myk7CisgICAgICAgIGU9Yml0d2lzZUFuZEV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDk4NF9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisvLworZ290byBydWxlc3lucHJlZDk4NF9mbWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworcnVsZXN5bnByZWQ5ODRfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkOTg0X2ZtbAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDk4NV9mbWwKK3N0YXRpYyB2b2lkIHN5bnByZWQ5ODVfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKwlzZXA6OkJGIGU7CisJI3VuZGVmCVJFVFVSTl9UWVBFX2UKKwkjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjA0Njo2OiAoIEJBTkQgZT0gZXF1YWxpdHlFeHByZXNzaW9uICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MDQ2OjY6IEJBTkQgZT0gZXF1YWxpdHlFeHByZXNzaW9uCisgICAgeworICAgICAgICAgTUFUQ0hUKEJBTkQsICZGT0xMT1dfQkFORF9pbl9zeW5wcmVkOTg1X2ZtbDIxNTAxKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDk4NV9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2VxdWFsaXR5RXhwcmVzc2lvbl9pbl9zeW5wcmVkOTg1X2ZtbDIxNTA1KTsKKyAgICAgICAgZT1lcXVhbGl0eUV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDk4NV9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisvLworZ290byBydWxlc3lucHJlZDk4NV9mbWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworcnVsZXN5bnByZWQ5ODVfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkOTg1X2ZtbAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDk4Nl9mbWwKK3N0YXRpYyB2b2lkIHN5bnByZWQ5ODZfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKwlzZXA6Ok9wZXJhdG9yICogb3A7CisJI3VuZGVmCVJFVFVSTl9UWVBFX29wCisJI2RlZmluZQlSRVRVUk5fVFlQRV9vcCBzZXA6Ok9wZXJhdG9yICoKKworCXNlcDo6QkYgZTsKKwkjdW5kZWYJUkVUVVJOX1RZUEVfZQorCSNkZWZpbmUJUkVUVVJOX1RZUEVfZSBzZXA6OkJGCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MDYwOjg6IChvcD0gZXF1YWxPcCBlPSByZWxhdGlvbmFsRXhwcmVzc2lvbiApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjA2MDo4OiBvcD0gZXF1YWxPcCBlPSByZWxhdGlvbmFsRXhwcmVzc2lvbgorICAgIHsKKyAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXF1YWxPcF9pbl9zeW5wcmVkOTg2X2ZtbDIxNTY5KTsKKyAgICAgICAgb3A9ZXF1YWxPcChjdHgpOworCisgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkOTg2X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfcmVsYXRpb25hbEV4cHJlc3Npb25faW5fc3lucHJlZDk4Nl9mbWwyMTU3Myk7CisgICAgICAgIGU9cmVsYXRpb25hbEV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDk4Nl9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisvLworZ290byBydWxlc3lucHJlZDk4Nl9mbWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworcnVsZXN5bnByZWQ5ODZfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkOTg2X2ZtbAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDk4N19mbWwKK3N0YXRpYyB2b2lkIHN5bnByZWQ5ODdfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKwlzZXA6Ok9wZXJhdG9yICogb3A7CisJI3VuZGVmCVJFVFVSTl9UWVBFX29wCisJI2RlZmluZQlSRVRVUk5fVFlQRV9vcCBzZXA6Ok9wZXJhdG9yICoKKworCXNlcDo6QkYgZTsKKwkjdW5kZWYJUkVUVVJOX1RZUEVfZQorCSNkZWZpbmUJUkVUVVJOX1RZUEVfZSBzZXA6OkJGCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MDU4OjY6IChvcD0gZXF1YWxPcCBlPSByZWxhdGlvbmFsRXhwcmVzc2lvbiAob3A9IGVxdWFsT3AgZT0gcmVsYXRpb25hbEV4cHJlc3Npb24gKSogKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYwNTg6Njogb3A9IGVxdWFsT3AgZT0gcmVsYXRpb25hbEV4cHJlc3Npb24gKG9wPSBlcXVhbE9wIGU9IHJlbGF0aW9uYWxFeHByZXNzaW9uICkqCisgICAgeworICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19lcXVhbE9wX2luX3N5bnByZWQ5ODdfZm1sMjE1NDkpOworICAgICAgICBvcD1lcXVhbE9wKGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ5ODdfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19yZWxhdGlvbmFsRXhwcmVzc2lvbl9pbl9zeW5wcmVkOTg3X2ZtbDIxNTUzKTsKKyAgICAgICAgZT1yZWxhdGlvbmFsRXhwcmVzc2lvbihjdHgpOworCisgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkOTg3X2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjA2MDo2OiAob3A9IGVxdWFsT3AgZT0gcmVsYXRpb25hbEV4cHJlc3Npb24gKSoKKworICAgICAgICBmb3IgKDs7KQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgYWx0NzA4PTI7CisgICAgICAgICAgICBzd2l0Y2ggKCBMQSgxKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEVRVUFMOgorICAgICAgICAgICAgY2FzZSBORVFVQUw6CisgICAgICAgICAgICBjYXNlIE5TRVFVQUw6CisgICAgICAgICAgICBjYXNlIFNFUVVBTDoKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCWFsdDcwOD0xOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDcwOCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgCWNhc2UgMToKKyAgICAgICAgCSAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MDYwOjg6IG9wPSBlcXVhbE9wIGU9IHJlbGF0aW9uYWxFeHByZXNzaW9uCisgICAgICAgIAkgICAgeworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19lcXVhbE9wX2luX3N5bnByZWQ5ODdfZm1sMjE1NjkpOworICAgICAgICAJICAgICAgICBvcD1lcXVhbE9wKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ5ODdfZm1sRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19yZWxhdGlvbmFsRXhwcmVzc2lvbl9pbl9zeW5wcmVkOTg3X2ZtbDIxNTczKTsKKyAgICAgICAgCSAgICAgICAgZT1yZWxhdGlvbmFsRXhwcmVzc2lvbihjdHgpOworCisgICAgICAgIAkgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAJICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkOTg3X2ZtbEV4OworICAgICAgICAJICAgICAgICB9CisgICAgICAgIAkgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgCSAgICAgICAgeworICAgICAgICAJICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCWRlZmF1bHQ6CisgICAgICAgIAkgICAgZ290byBsb29wNzA4OwkvKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgKi8KKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBsb29wNzA4OiA7IC8qIEp1bXAgb3V0IHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQ5ODdfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkOTg3X2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDk4N19mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ5OTFfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkOTkxX2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisJc2VwOjpPcGVyYXRvciAqIG9wOworCSN1bmRlZglSRVRVUk5fVFlQRV9vcAorCSNkZWZpbmUJUkVUVVJOX1RZUEVfb3Agc2VwOjpPcGVyYXRvciAqCisKKwlzZXA6OkJGIGU7CisJI3VuZGVmCVJFVFVSTl9UWVBFX2UKKwkjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjEwMDo4OiAob3A9IHJlbGF0aW9uYWxPcCBlPSBzaGlmdEV4cHJlc3Npb24gKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYxMDA6ODogb3A9IHJlbGF0aW9uYWxPcCBlPSBzaGlmdEV4cHJlc3Npb24KKyAgICB7CisgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3JlbGF0aW9uYWxPcF9pbl9zeW5wcmVkOTkxX2ZtbDIxNjk1KTsKKyAgICAgICAgb3A9cmVsYXRpb25hbE9wKGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ5OTFfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19zaGlmdEV4cHJlc3Npb25faW5fc3lucHJlZDk5MV9mbWwyMTY5OSk7CisgICAgICAgIGU9c2hpZnRFeHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ5OTFfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQ5OTFfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkOTkxX2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDk5MV9mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ5OTJfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkOTkyX2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisJc2VwOjpPcGVyYXRvciAqIG9wOworCSN1bmRlZglSRVRVUk5fVFlQRV9vcAorCSNkZWZpbmUJUkVUVVJOX1RZUEVfb3Agc2VwOjpPcGVyYXRvciAqCisKKwlzZXA6OkJGIGU7CisJI3VuZGVmCVJFVFVSTl9UWVBFX2UKKwkjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjA5ODo2OiAob3A9IHJlbGF0aW9uYWxPcCBlPSBzaGlmdEV4cHJlc3Npb24gKG9wPSByZWxhdGlvbmFsT3AgZT0gc2hpZnRFeHByZXNzaW9uICkqICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MDk4OjY6IG9wPSByZWxhdGlvbmFsT3AgZT0gc2hpZnRFeHByZXNzaW9uIChvcD0gcmVsYXRpb25hbE9wIGU9IHNoaWZ0RXhwcmVzc2lvbiApKgorICAgIHsKKyAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfcmVsYXRpb25hbE9wX2luX3N5bnByZWQ5OTJfZm1sMjE2NzUpOworICAgICAgICBvcD1yZWxhdGlvbmFsT3AoY3R4KTsKKworICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDk5Ml9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3NoaWZ0RXhwcmVzc2lvbl9pbl9zeW5wcmVkOTkyX2ZtbDIxNjc5KTsKKyAgICAgICAgZT1zaGlmdEV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDk5Ml9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYxMDA6NjogKG9wPSByZWxhdGlvbmFsT3AgZT0gc2hpZnRFeHByZXNzaW9uICkqCisKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGFsdDcwOT0yOworICAgICAgICAgICAgc3dpdGNoICggTEEoMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBHVDoKKyAgICAgICAgICAgIGNhc2UgR1RFOgorICAgICAgICAgICAgY2FzZSBMVEU6CisgICAgICAgICAgICBjYXNlIExUXzoKKyAgICAgICAgICAgIGNhc2UgMjk1OgorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJYWx0NzA5PTE7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NzA5KQorICAgICAgICAgICAgeworICAgICAgICAJY2FzZSAxOgorICAgICAgICAJICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYxMDA6ODogb3A9IHJlbGF0aW9uYWxPcCBlPSBzaGlmdEV4cHJlc3Npb24KKyAgICAgICAgCSAgICB7CisgICAgICAgIAkgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3JlbGF0aW9uYWxPcF9pbl9zeW5wcmVkOTkyX2ZtbDIxNjk1KTsKKyAgICAgICAgCSAgICAgICAgb3A9cmVsYXRpb25hbE9wKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ5OTJfZm1sRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19zaGlmdEV4cHJlc3Npb25faW5fc3lucHJlZDk5Ml9mbWwyMTY5OSk7CisgICAgICAgIAkgICAgICAgIGU9c2hpZnRFeHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgCSAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIAkgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIAkgICAgICAgIHsKKyAgICAgICAgCSAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ5OTJfZm1sRXg7CisgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAJICAgICAgICB7CisgICAgICAgIAkgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAJICAgICAgICB9CisKKworICAgICAgICAJICAgIH0KKyAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAJZGVmYXVsdDoKKyAgICAgICAgCSAgICBnb3RvIGxvb3A3MDk7CS8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCAqLworICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxvb3A3MDk6IDsgLyogSnVtcCBvdXQgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKworCisgICAgfQorCisvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisvLworZ290byBydWxlc3lucHJlZDk5Ml9mbWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworcnVsZXN5bnByZWQ5OTJfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkOTkyX2ZtbAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDk5N19mbWwKK3N0YXRpYyB2b2lkIHN5bnByZWQ5OTdfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKwlzZXA6Ok9wZXJhdG9yICogb3A7CisJI3VuZGVmCVJFVFVSTl9UWVBFX29wCisJI2RlZmluZQlSRVRVUk5fVFlQRV9vcCBzZXA6Ok9wZXJhdG9yICoKKworCXNlcDo6QkYgZTsKKwkjdW5kZWYJUkVUVVJOX1RZUEVfZQorCSNkZWZpbmUJUkVUVVJOX1RZUEVfZSBzZXA6OkJGCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MTQyOjY6IChvcD0gc2hpZnRPcCBlPSBhZGRpdGl2ZUV4cHJlc3Npb24gKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYxNDI6Njogb3A9IHNoaWZ0T3AgZT0gYWRkaXRpdmVFeHByZXNzaW9uCisgICAgeworICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19zaGlmdE9wX2luX3N5bnByZWQ5OTdfZm1sMjE4MTgpOworICAgICAgICBvcD1zaGlmdE9wKGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ5OTdfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgICAgICBGT0xMT1dQVVNIKEZPTExPV19hZGRpdGl2ZUV4cHJlc3Npb25faW5fc3lucHJlZDk5N19mbWwyMTgyMik7CisgICAgICAgIGU9YWRkaXRpdmVFeHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQ5OTdfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQ5OTdfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkOTk3X2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDk5N19mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxMDAwX2ZtbAorc3RhdGljIHZvaWQgc3lucHJlZDEwMDBfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKwlzZXA6OkJGIGU7CisJI3VuZGVmCVJFVFVSTl9UWVBFX2UKKwkjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjE2MTo2OiAoICggUExVUyB8IE1JTlVTICkgZT0gbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MTYxOjY6ICggUExVUyB8IE1JTlVTICkgZT0gbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uCisgICAgeworICAgICAgICBpZiAoIExBKDEpID09IE1JTlVTIHx8IExBKDEpID09IFBMVVMgKQorICAgICAgICB7CisgICAgICAgICAgICBDT05TVU1FKCk7CisgICAgICAgICAgICBQRVJST1JSRUNPVkVSWT1BTlRMUjNfRkFMU0U7CisgICAgICAgICAgICBGQUlMRURGTEFHPUFOVExSM19GQUxTRTsKKworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfRVhDRVBUSU9OOworICAgICAgICAgICAgRVhDRVBUSU9OLT5uYW1lICAgICAgICAgPSAodm9pZCAqKUFOVExSM19NSVNNQVRDSEVEX1NFVF9OQU1FOworICAgICAgICAgICAgRVhDRVBUSU9OLT5leHBlY3RpbmdTZXQgPSBOVUxMOworCisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkMTAwMF9mbWxFeDsKKyAgICAgICAgfQorCisKKyAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX2luX3N5bnByZWQxMDAwX2ZtbDIxOTI0KTsKKyAgICAgICAgZT1tdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICBGT0xMT1dQT1AoKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDEwMDBfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQxMDAwX2ZtbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCitydWxlc3lucHJlZDEwMDBfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkMTAwMF9mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxMDAzX2ZtbAorc3RhdGljIHZvaWQgc3lucHJlZDEwMDNfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKwlzZXA6OkJGIGU7CisJI3VuZGVmCVJFVFVSTl9UWVBFX2UKKwkjZGVmaW5lCVJFVFVSTl9UWVBFX2Ugc2VwOjpCRgorCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjE3NTo2OiAoICggU1RBUiB8IERJViB8IE1PRCApIGU9IHVuYXJ5RXhwcmVzc2lvbiApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjE3NTo2OiAoIFNUQVIgfCBESVYgfCBNT0QgKSBlPSB1bmFyeUV4cHJlc3Npb24KKyAgICB7CisgICAgICAgIGlmICggTEEoMSkgPT0gRElWIHx8IExBKDEpID09IE1PRCB8fCBMQSgxKSA9PSBTVEFSICkKKyAgICAgICAgeworICAgICAgICAgICAgQ09OU1VNRSgpOworICAgICAgICAgICAgUEVSUk9SUkVDT1ZFUlk9QU5UTFIzX0ZBTFNFOworICAgICAgICAgICAgRkFJTEVERkxBRz1BTlRMUjNfRkFMU0U7CisKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChCQUNLVFJBQ0tJTkc+MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ09OU1RSVUNURVgoKTsKKyAgICAgICAgICAgIEVYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX01JU01BVENIRURfU0VUX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIEVYQ0VQVElPTi0+bmFtZSAgICAgICAgID0gKHZvaWQgKilBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfTkFNRTsKKyAgICAgICAgICAgIEVYQ0VQVElPTi0+ZXhwZWN0aW5nU2V0ID0gTlVMTDsKKworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDEwMDNfZm1sRXg7CisgICAgICAgIH0KKworCisgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX3VuYXJ5RXhwcmVzc2lvbl9pbl9zeW5wcmVkMTAwM19mbWwyMjAxMik7CisgICAgICAgIGU9dW5hcnlFeHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgIGlmICAoSEFTRVhDRVBUSU9OKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQxMDAzX2ZtbEV4OworICAgICAgICB9CisgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKy8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKy8vCitnb3RvIHJ1bGVzeW5wcmVkMTAwM19mbWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworcnVsZXN5bnByZWQxMDAzX2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDEwMDNfZm1sCisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkMTAyMF9mbWwKK3N0YXRpYyB2b2lkIHN5bnByZWQxMDIwX2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjIzODo2OiAoIElOQ1IgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYyMzg6NjogSU5DUgorICAgIHsKKyAgICAgICAgIE1BVENIVChJTkNSLCAmRk9MTE9XX0lOQ1JfaW5fc3lucHJlZDEwMjBfZm1sMjIzNTMpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkMTAyMF9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisvLworZ290byBydWxlc3lucHJlZDEwMjBfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkMTAyMF9mbWxFeDogOworCit9CisvLyAkQU5UTFIgZW5kIHN5bnByZWQxMDIwX2ZtbAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDEwMjFfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkMTAyMV9mbWxfZnJhZ21lbnQocGZtbFBhcnNlciBjdHggKQoreworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYyNDE6NjogKCBERUNSICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MjQxOjY6IERFQ1IKKyAgICB7CisgICAgICAgICBNQVRDSFQoREVDUiwgJkZPTExPV19ERUNSX2luX3N5bnByZWQxMDIxX2ZtbDIyMzY0KTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDEwMjFfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQxMDIxX2ZtbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCitydWxlc3lucHJlZDEwMjFfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkMTAyMV9mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxMDI3X2ZtbAorc3RhdGljIHZvaWQgc3lucHJlZDEwMjdfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MzY5OjY6ICggTFBBUkVOICkKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MzY5Ojg6IExQQVJFTgorICAgIHsKKyAgICAgICAgIE1BVENIVChMUEFSRU4sICZGT0xMT1dfTFBBUkVOX2luX3N5bnByZWQxMDI3X2ZtbDIyNjAzKTsKKyAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBydWxlc3lucHJlZDEwMjdfZm1sRXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQxMDI3X2ZtbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCitydWxlc3lucHJlZDEwMjdfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkMTAyN19mbWwKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQxMDI5X2ZtbAorc3RhdGljIHZvaWQgc3lucHJlZDEwMjlfZm1sX2ZyYWdtZW50KHBmbWxQYXJzZXIgY3R4ICkKK3sKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2MzcyOjY6ICggRE9UIHwgTEJSQUNLRVQgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOgorICAgIHsKKyAgICAgICAgaWYgKCBMQSgxKSA9PSBET1QgfHwgTEEoMSkgPT0gTEJSQUNLRVQgKQorICAgICAgICB7CisgICAgICAgICAgICBDT05TVU1FKCk7CisgICAgICAgICAgICBQRVJST1JSRUNPVkVSWT1BTlRMUjNfRkFMU0U7CisgICAgICAgICAgICBGQUlMRURGTEFHPUFOVExSM19GQUxTRTsKKworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKEJBQ0tUUkFDS0lORz4wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZBSUxFREZMQUcgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDT05TVFJVQ1RFWCgpOworICAgICAgICAgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfRVhDRVBUSU9OOworICAgICAgICAgICAgRVhDRVBUSU9OLT5uYW1lICAgICAgICAgPSAodm9pZCAqKUFOVExSM19NSVNNQVRDSEVEX1NFVF9OQU1FOworICAgICAgICAgICAgRVhDRVBUSU9OLT5leHBlY3RpbmdTZXQgPSBOVUxMOworCisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkMTAyOV9mbWxFeDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKy8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKy8vCitnb3RvIHJ1bGVzeW5wcmVkMTAyOV9mbWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworcnVsZXN5bnByZWQxMDI5X2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDEwMjlfZm1sCisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkMTAzMF9mbWwKK3N0YXRpYyB2b2lkIHN5bnByZWQxMDMwX2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjM3NDo2OiAoIENPTE9OeDIgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjYzNzQ6ODogQ09MT054MgorICAgIHsKKyAgICAgICAgIE1BVENIVChDT0xPTngyLCAmRk9MTE9XX0NPTE9OeDJfaW5fc3lucHJlZDEwMzBfZm1sMjI2NjYpOworICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkMTAzMF9mbWxFeDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSEFTRkFJTEVEKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKworCisgICAgfQorCisvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisvLworZ290byBydWxlc3lucHJlZDEwMzBfZm1sRXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGVzeW5wcmVkMTAzMF9mbWxFeDogOworCit9CisvLyAkQU5UTFIgZW5kIHN5bnByZWQxMDMwX2ZtbAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDEwMzNfZm1sCitzdGF0aWMgdm9pZCBzeW5wcmVkMTAzM19mbWxfZnJhZ21lbnQocGZtbFBhcnNlciBjdHggKQoreworCXNlcDo6QkYgZTsKKwkjdW5kZWYJUkVUVVJOX1RZUEVfZQorCSNkZWZpbmUJUkVUVVJOX1RZUEVfZSBzZXA6OkJGCisKKyAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NDE3OjY6ICggKCBMQlJBQ0tFVCBlPSBleHByZXNzaW9uIFJCUkFDS0VUICkgKQorICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY0MTc6NjogKCBMQlJBQ0tFVCBlPSBleHByZXNzaW9uIFJCUkFDS0VUICkKKyAgICB7CisgICAgICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY0MTc6NjogKCBMQlJBQ0tFVCBlPSBleHByZXNzaW9uIFJCUkFDS0VUICkKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjQxNzo4OiBMQlJBQ0tFVCBlPSBleHByZXNzaW9uIFJCUkFDS0VUCisgICAgICAgIHsKKyAgICAgICAgICAgICBNQVRDSFQoTEJSQUNLRVQsICZGT0xMT1dfTEJSQUNLRVRfaW5fc3lucHJlZDEwMzNfZm1sMjI3NjEpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkMTAzM19mbWxFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIEZPTExPV1BVU0goRk9MTE9XX2V4cHJlc3Npb25faW5fc3lucHJlZDEwMzNfZm1sMjI3NjYpOworICAgICAgICAgICAgZT1leHByZXNzaW9uKGN0eCk7CisKKyAgICAgICAgICAgIEZPTExPV1BPUCgpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkMTAzM19mbWxFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICBNQVRDSFQoUkJSQUNLRVQsICZGT0xMT1dfUkJSQUNLRVRfaW5fc3lucHJlZDEwMzNfZm1sMjI3NjkpOworICAgICAgICAgICAgaWYgIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIHJ1bGVzeW5wcmVkMTAzM19mbWxFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChIQVNGQUlMRUQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorCisKKyAgICB9CisKKy8vIFRoaXMgaXMgd2hlcmUgcnVsZXMgY2xlYW4gdXAgYW5kIGV4aXQKKy8vCitnb3RvIHJ1bGVzeW5wcmVkMTAzM19mbWxFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworcnVsZXN5bnByZWQxMDMzX2ZtbEV4OiA7CisKK30KKy8vICRBTlRMUiBlbmQgc3lucHJlZDEwMzNfZm1sCisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkMTAzNV9mbWwKK3N0YXRpYyB2b2lkIHN5bnByZWQxMDM1X2ZtbF9mcmFnbWVudChwZm1sUGFyc2VyIGN0eCApCit7CisJc2VwOjpCRiBlOworCSN1bmRlZglSRVRVUk5fVFlQRV9lCisJI2RlZmluZQlSRVRVUk5fVFlQRV9lIHNlcDo6QkYKKworICAgIC8vIC9ob21lL2xhcGl0cmVfaXMxNDgyNDUvZ2l0L29yZy5lY2xpcHNlLmVmbS1zeW1iZXgvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbC5nOjY0Njk6NjogKCAoIExCUkFDS0VUIGU9IGV4cHJlc3Npb24gUkJSQUNLRVQgKSApCisgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjQ2OTo2OiAoIExCUkFDS0VUIGU9IGV4cHJlc3Npb24gUkJSQUNLRVQgKQorICAgIHsKKyAgICAgICAgLy8gL2hvbWUvbGFwaXRyZV9pczE0ODI0NS9naXQvb3JnLmVjbGlwc2UuZWZtLXN5bWJleC9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvbW9kZWwvZm1sLmc6NjQ2OTo2OiAoIExCUkFDS0VUIGU9IGV4cHJlc3Npb24gUkJSQUNLRVQgKQorICAgICAgICAvLyAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZzo2NDY5Ojg6IExCUkFDS0VUIGU9IGV4cHJlc3Npb24gUkJSQUNLRVQKKyAgICAgICAgeworICAgICAgICAgICAgIE1BVENIVChMQlJBQ0tFVCwgJkZPTExPV19MQlJBQ0tFVF9pbl9zeW5wcmVkMTAzNV9mbWwyMjg1Nyk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQxMDM1X2ZtbEV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgRk9MTE9XUFVTSChGT0xMT1dfZXhwcmVzc2lvbl9pbl9zeW5wcmVkMTAzNV9mbWwyMjg2Mik7CisgICAgICAgICAgICBlPWV4cHJlc3Npb24oY3R4KTsKKworICAgICAgICAgICAgRk9MTE9XUE9QKCk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQxMDM1X2ZtbEV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgIE1BVENIVChSQlJBQ0tFVCwgJkZPTExPV19SQlJBQ0tFVF9pbl9zeW5wcmVkMTAzNV9mbWwyMjg2NSk7CisgICAgICAgICAgICBpZiAgKEhBU0VYQ0VQVElPTigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gcnVsZXN5bnByZWQxMDM1X2ZtbEV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEhBU0ZBSUxFRCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKworICAgICAgICB9CisKKworICAgIH0KKworLy8gVGhpcyBpcyB3aGVyZSBydWxlcyBjbGVhbiB1cCBhbmQgZXhpdAorLy8KK2dvdG8gcnVsZXN5bnByZWQxMDM1X2ZtbEV4OyAvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCitydWxlc3lucHJlZDEwMzVfZm1sRXg6IDsKKworfQorLy8gJEFOVExSIGVuZCBzeW5wcmVkMTAzNV9mbWwKKy8qIEVuZCBvZiBwYXJzaW5nIHJ1bGVzCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU3ludGFjdGljIHByZWRpY2F0ZXMKKyAqLworc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQ5NjJfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQ5NjJfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQ5OTdfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQ5OTdfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQyMV9mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDIxX2ZtbF9mcmFnbWVudChjdHgpOwkgICAgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgIHN1Y2Nlc3MJPSAhKEZBSUxFREZMQUcpOworICAgIFJFV0lORChzdGFydCk7CisgICAgQkFDS1RSQUNLSU5HLS07CisgICAgRkFJTEVERkxBRwk9IEFOVExSM19GQUxTRTsKKyAgICByZXR1cm4gc3VjY2VzczsKK30KK3N0YXRpYyBBTlRMUjNfQk9PTEVBTiBzeW5wcmVkOTcwX2ZtbChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBBTlRMUjNfTUFSS0VSICAgc3RhcnQ7CisgICAgQU5UTFIzX0JPT0xFQU4gIHN1Y2Nlc3M7CisKKyAgICBCQUNLVFJBQ0tJTkcrKzsKKyAgICBzdGFydAk9IE1BUksoKTsKKyAgICBzeW5wcmVkOTcwX2ZtbF9mcmFnbWVudChjdHgpOwkgICAgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgIHN1Y2Nlc3MJPSAhKEZBSUxFREZMQUcpOworICAgIFJFV0lORChzdGFydCk7CisgICAgQkFDS1RSQUNLSU5HLS07CisgICAgRkFJTEVERkxBRwk9IEFOVExSM19GQUxTRTsKKyAgICByZXR1cm4gc3VjY2VzczsKK30KK3N0YXRpYyBBTlRMUjNfQk9PTEVBTiBzeW5wcmVkNDA3X2ZtbChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBBTlRMUjNfTUFSS0VSICAgc3RhcnQ7CisgICAgQU5UTFIzX0JPT0xFQU4gIHN1Y2Nlc3M7CisKKyAgICBCQUNLVFJBQ0tJTkcrKzsKKyAgICBzdGFydAk9IE1BUksoKTsKKyAgICBzeW5wcmVkNDA3X2ZtbF9mcmFnbWVudChjdHgpOwkgICAgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgIHN1Y2Nlc3MJPSAhKEZBSUxFREZMQUcpOworICAgIFJFV0lORChzdGFydCk7CisgICAgQkFDS1RSQUNLSU5HLS07CisgICAgRkFJTEVERkxBRwk9IEFOVExSM19GQUxTRTsKKyAgICByZXR1cm4gc3VjY2VzczsKK30KK3N0YXRpYyBBTlRMUjNfQk9PTEVBTiBzeW5wcmVkNTM5X2ZtbChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBBTlRMUjNfTUFSS0VSICAgc3RhcnQ7CisgICAgQU5UTFIzX0JPT0xFQU4gIHN1Y2Nlc3M7CisKKyAgICBCQUNLVFJBQ0tJTkcrKzsKKyAgICBzdGFydAk9IE1BUksoKTsKKyAgICBzeW5wcmVkNTM5X2ZtbF9mcmFnbWVudChjdHgpOwkgICAgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgIHN1Y2Nlc3MJPSAhKEZBSUxFREZMQUcpOworICAgIFJFV0lORChzdGFydCk7CisgICAgQkFDS1RSQUNLSU5HLS07CisgICAgRkFJTEVERkxBRwk9IEFOVExSM19GQUxTRTsKKyAgICByZXR1cm4gc3VjY2VzczsKK30KK3N0YXRpYyBBTlRMUjNfQk9PTEVBTiBzeW5wcmVkMzI2X2ZtbChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBBTlRMUjNfTUFSS0VSICAgc3RhcnQ7CisgICAgQU5UTFIzX0JPT0xFQU4gIHN1Y2Nlc3M7CisKKyAgICBCQUNLVFJBQ0tJTkcrKzsKKyAgICBzdGFydAk9IE1BUksoKTsKKyAgICBzeW5wcmVkMzI2X2ZtbF9mcmFnbWVudChjdHgpOwkgICAgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgIHN1Y2Nlc3MJPSAhKEZBSUxFREZMQUcpOworICAgIFJFV0lORChzdGFydCk7CisgICAgQkFDS1RSQUNLSU5HLS07CisgICAgRkFJTEVERkxBRwk9IEFOVExSM19GQUxTRTsKKyAgICByZXR1cm4gc3VjY2VzczsKK30KK3N0YXRpYyBBTlRMUjNfQk9PTEVBTiBzeW5wcmVkNDMxX2ZtbChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBBTlRMUjNfTUFSS0VSICAgc3RhcnQ7CisgICAgQU5UTFIzX0JPT0xFQU4gIHN1Y2Nlc3M7CisKKyAgICBCQUNLVFJBQ0tJTkcrKzsKKyAgICBzdGFydAk9IE1BUksoKTsKKyAgICBzeW5wcmVkNDMxX2ZtbF9mcmFnbWVudChjdHgpOwkgICAgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgIHN1Y2Nlc3MJPSAhKEZBSUxFREZMQUcpOworICAgIFJFV0lORChzdGFydCk7CisgICAgQkFDS1RSQUNLSU5HLS07CisgICAgRkFJTEVERkxBRwk9IEFOVExSM19GQUxTRTsKKyAgICByZXR1cm4gc3VjY2VzczsKK30KK3N0YXRpYyBBTlRMUjNfQk9PTEVBTiBzeW5wcmVkMTAwM19mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDEwMDNfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQzNDRfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQzNDRfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQ2MzZfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQ2MzZfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQ5NTRfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQ5NTRfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQ4OTFfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQ4OTFfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQ4MDRfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQ4MDRfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQ1MzdfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQ1MzdfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQ5ODdfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQ5ODdfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQ1MjBfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQ1MjBfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQ1NTVfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQ1NTVfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQ1Nl9mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDU2X2ZtbF9mcmFnbWVudChjdHgpOwkgICAgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgIHN1Y2Nlc3MJPSAhKEZBSUxFREZMQUcpOworICAgIFJFV0lORChzdGFydCk7CisgICAgQkFDS1RSQUNLSU5HLS07CisgICAgRkFJTEVERkxBRwk9IEFOVExSM19GQUxTRTsKKyAgICByZXR1cm4gc3VjY2VzczsKK30KK3N0YXRpYyBBTlRMUjNfQk9PTEVBTiBzeW5wcmVkNjJfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQ2Ml9mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDEwMjFfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQxMDIxX2ZtbF9mcmFnbWVudChjdHgpOwkgICAgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgIHN1Y2Nlc3MJPSAhKEZBSUxFREZMQUcpOworICAgIFJFV0lORChzdGFydCk7CisgICAgQkFDS1RSQUNLSU5HLS07CisgICAgRkFJTEVERkxBRwk9IEFOVExSM19GQUxTRTsKKyAgICByZXR1cm4gc3VjY2VzczsKK30KK3N0YXRpYyBBTlRMUjNfQk9PTEVBTiBzeW5wcmVkOTU2X2ZtbChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBBTlRMUjNfTUFSS0VSICAgc3RhcnQ7CisgICAgQU5UTFIzX0JPT0xFQU4gIHN1Y2Nlc3M7CisKKyAgICBCQUNLVFJBQ0tJTkcrKzsKKyAgICBzdGFydAk9IE1BUksoKTsKKyAgICBzeW5wcmVkOTU2X2ZtbF9mcmFnbWVudChjdHgpOwkgICAgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgIHN1Y2Nlc3MJPSAhKEZBSUxFREZMQUcpOworICAgIFJFV0lORChzdGFydCk7CisgICAgQkFDS1RSQUNLSU5HLS07CisgICAgRkFJTEVERkxBRwk9IEFOVExSM19GQUxTRTsKKyAgICByZXR1cm4gc3VjY2VzczsKK30KK3N0YXRpYyBBTlRMUjNfQk9PTEVBTiBzeW5wcmVkMzI0X2ZtbChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBBTlRMUjNfTUFSS0VSICAgc3RhcnQ7CisgICAgQU5UTFIzX0JPT0xFQU4gIHN1Y2Nlc3M7CisKKyAgICBCQUNLVFJBQ0tJTkcrKzsKKyAgICBzdGFydAk9IE1BUksoKTsKKyAgICBzeW5wcmVkMzI0X2ZtbF9mcmFnbWVudChjdHgpOwkgICAgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgIHN1Y2Nlc3MJPSAhKEZBSUxFREZMQUcpOworICAgIFJFV0lORChzdGFydCk7CisgICAgQkFDS1RSQUNLSU5HLS07CisgICAgRkFJTEVERkxBRwk9IEFOVExSM19GQUxTRTsKKyAgICByZXR1cm4gc3VjY2VzczsKK30KK3N0YXRpYyBBTlRMUjNfQk9PTEVBTiBzeW5wcmVkNDE3X2ZtbChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBBTlRMUjNfTUFSS0VSICAgc3RhcnQ7CisgICAgQU5UTFIzX0JPT0xFQU4gIHN1Y2Nlc3M7CisKKyAgICBCQUNLVFJBQ0tJTkcrKzsKKyAgICBzdGFydAk9IE1BUksoKTsKKyAgICBzeW5wcmVkNDE3X2ZtbF9mcmFnbWVudChjdHgpOwkgICAgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgIHN1Y2Nlc3MJPSAhKEZBSUxFREZMQUcpOworICAgIFJFV0lORChzdGFydCk7CisgICAgQkFDS1RSQUNLSU5HLS07CisgICAgRkFJTEVERkxBRwk9IEFOVExSM19GQUxTRTsKKyAgICByZXR1cm4gc3VjY2VzczsKK30KK3N0YXRpYyBBTlRMUjNfQk9PTEVBTiBzeW5wcmVkOTYwX2ZtbChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBBTlRMUjNfTUFSS0VSICAgc3RhcnQ7CisgICAgQU5UTFIzX0JPT0xFQU4gIHN1Y2Nlc3M7CisKKyAgICBCQUNLVFJBQ0tJTkcrKzsKKyAgICBzdGFydAk9IE1BUksoKTsKKyAgICBzeW5wcmVkOTYwX2ZtbF9mcmFnbWVudChjdHgpOwkgICAgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgIHN1Y2Nlc3MJPSAhKEZBSUxFREZMQUcpOworICAgIFJFV0lORChzdGFydCk7CisgICAgQkFDS1RSQUNLSU5HLS07CisgICAgRkFJTEVERkxBRwk9IEFOVExSM19GQUxTRTsKKyAgICByZXR1cm4gc3VjY2VzczsKK30KK3N0YXRpYyBBTlRMUjNfQk9PTEVBTiBzeW5wcmVkNzA1X2ZtbChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBBTlRMUjNfTUFSS0VSICAgc3RhcnQ7CisgICAgQU5UTFIzX0JPT0xFQU4gIHN1Y2Nlc3M7CisKKyAgICBCQUNLVFJBQ0tJTkcrKzsKKyAgICBzdGFydAk9IE1BUksoKTsKKyAgICBzeW5wcmVkNzA1X2ZtbF9mcmFnbWVudChjdHgpOwkgICAgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgIHN1Y2Nlc3MJPSAhKEZBSUxFREZMQUcpOworICAgIFJFV0lORChzdGFydCk7CisgICAgQkFDS1RSQUNLSU5HLS07CisgICAgRkFJTEVERkxBRwk9IEFOVExSM19GQUxTRTsKKyAgICByZXR1cm4gc3VjY2VzczsKK30KK3N0YXRpYyBBTlRMUjNfQk9PTEVBTiBzeW5wcmVkMzQwX2ZtbChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBBTlRMUjNfTUFSS0VSICAgc3RhcnQ7CisgICAgQU5UTFIzX0JPT0xFQU4gIHN1Y2Nlc3M7CisKKyAgICBCQUNLVFJBQ0tJTkcrKzsKKyAgICBzdGFydAk9IE1BUksoKTsKKyAgICBzeW5wcmVkMzQwX2ZtbF9mcmFnbWVudChjdHgpOwkgICAgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgIHN1Y2Nlc3MJPSAhKEZBSUxFREZMQUcpOworICAgIFJFV0lORChzdGFydCk7CisgICAgQkFDS1RSQUNLSU5HLS07CisgICAgRkFJTEVERkxBRwk9IEFOVExSM19GQUxTRTsKKyAgICByZXR1cm4gc3VjY2VzczsKK30KK3N0YXRpYyBBTlRMUjNfQk9PTEVBTiBzeW5wcmVkOTY5X2ZtbChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBBTlRMUjNfTUFSS0VSICAgc3RhcnQ7CisgICAgQU5UTFIzX0JPT0xFQU4gIHN1Y2Nlc3M7CisKKyAgICBCQUNLVFJBQ0tJTkcrKzsKKyAgICBzdGFydAk9IE1BUksoKTsKKyAgICBzeW5wcmVkOTY5X2ZtbF9mcmFnbWVudChjdHgpOwkgICAgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgIHN1Y2Nlc3MJPSAhKEZBSUxFREZMQUcpOworICAgIFJFV0lORChzdGFydCk7CisgICAgQkFDS1RSQUNLSU5HLS07CisgICAgRkFJTEVERkxBRwk9IEFOVExSM19GQUxTRTsKKyAgICByZXR1cm4gc3VjY2VzczsKK30KK3N0YXRpYyBBTlRMUjNfQk9PTEVBTiBzeW5wcmVkMzcwX2ZtbChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBBTlRMUjNfTUFSS0VSICAgc3RhcnQ7CisgICAgQU5UTFIzX0JPT0xFQU4gIHN1Y2Nlc3M7CisKKyAgICBCQUNLVFJBQ0tJTkcrKzsKKyAgICBzdGFydAk9IE1BUksoKTsKKyAgICBzeW5wcmVkMzcwX2ZtbF9mcmFnbWVudChjdHgpOwkgICAgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgIHN1Y2Nlc3MJPSAhKEZBSUxFREZMQUcpOworICAgIFJFV0lORChzdGFydCk7CisgICAgQkFDS1RSQUNLSU5HLS07CisgICAgRkFJTEVERkxBRwk9IEFOVExSM19GQUxTRTsKKyAgICByZXR1cm4gc3VjY2VzczsKK30KK3N0YXRpYyBBTlRMUjNfQk9PTEVBTiBzeW5wcmVkMTE1X2ZtbChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBBTlRMUjNfTUFSS0VSICAgc3RhcnQ7CisgICAgQU5UTFIzX0JPT0xFQU4gIHN1Y2Nlc3M7CisKKyAgICBCQUNLVFJBQ0tJTkcrKzsKKyAgICBzdGFydAk9IE1BUksoKTsKKyAgICBzeW5wcmVkMTE1X2ZtbF9mcmFnbWVudChjdHgpOwkgICAgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgIHN1Y2Nlc3MJPSAhKEZBSUxFREZMQUcpOworICAgIFJFV0lORChzdGFydCk7CisgICAgQkFDS1RSQUNLSU5HLS07CisgICAgRkFJTEVERkxBRwk9IEFOVExSM19GQUxTRTsKKyAgICByZXR1cm4gc3VjY2VzczsKK30KK3N0YXRpYyBBTlRMUjNfQk9PTEVBTiBzeW5wcmVkNDQ2X2ZtbChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBBTlRMUjNfTUFSS0VSICAgc3RhcnQ7CisgICAgQU5UTFIzX0JPT0xFQU4gIHN1Y2Nlc3M7CisKKyAgICBCQUNLVFJBQ0tJTkcrKzsKKyAgICBzdGFydAk9IE1BUksoKTsKKyAgICBzeW5wcmVkNDQ2X2ZtbF9mcmFnbWVudChjdHgpOwkgICAgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgIHN1Y2Nlc3MJPSAhKEZBSUxFREZMQUcpOworICAgIFJFV0lORChzdGFydCk7CisgICAgQkFDS1RSQUNLSU5HLS07CisgICAgRkFJTEVERkxBRwk9IEFOVExSM19GQUxTRTsKKyAgICByZXR1cm4gc3VjY2VzczsKK30KK3N0YXRpYyBBTlRMUjNfQk9PTEVBTiBzeW5wcmVkOTg1X2ZtbChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBBTlRMUjNfTUFSS0VSICAgc3RhcnQ7CisgICAgQU5UTFIzX0JPT0xFQU4gIHN1Y2Nlc3M7CisKKyAgICBCQUNLVFJBQ0tJTkcrKzsKKyAgICBzdGFydAk9IE1BUksoKTsKKyAgICBzeW5wcmVkOTg1X2ZtbF9mcmFnbWVudChjdHgpOwkgICAgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgIHN1Y2Nlc3MJPSAhKEZBSUxFREZMQUcpOworICAgIFJFV0lORChzdGFydCk7CisgICAgQkFDS1RSQUNLSU5HLS07CisgICAgRkFJTEVERkxBRwk9IEFOVExSM19GQUxTRTsKKyAgICByZXR1cm4gc3VjY2VzczsKK30KK3N0YXRpYyBBTlRMUjNfQk9PTEVBTiBzeW5wcmVkOTcyX2ZtbChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBBTlRMUjNfTUFSS0VSICAgc3RhcnQ7CisgICAgQU5UTFIzX0JPT0xFQU4gIHN1Y2Nlc3M7CisKKyAgICBCQUNLVFJBQ0tJTkcrKzsKKyAgICBzdGFydAk9IE1BUksoKTsKKyAgICBzeW5wcmVkOTcyX2ZtbF9mcmFnbWVudChjdHgpOwkgICAgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgIHN1Y2Nlc3MJPSAhKEZBSUxFREZMQUcpOworICAgIFJFV0lORChzdGFydCk7CisgICAgQkFDS1RSQUNLSU5HLS07CisgICAgRkFJTEVERkxBRwk9IEFOVExSM19GQUxTRTsKKyAgICByZXR1cm4gc3VjY2VzczsKK30KK3N0YXRpYyBBTlRMUjNfQk9PTEVBTiBzeW5wcmVkNTE0X2ZtbChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBBTlRMUjNfTUFSS0VSICAgc3RhcnQ7CisgICAgQU5UTFIzX0JPT0xFQU4gIHN1Y2Nlc3M7CisKKyAgICBCQUNLVFJBQ0tJTkcrKzsKKyAgICBzdGFydAk9IE1BUksoKTsKKyAgICBzeW5wcmVkNTE0X2ZtbF9mcmFnbWVudChjdHgpOwkgICAgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgIHN1Y2Nlc3MJPSAhKEZBSUxFREZMQUcpOworICAgIFJFV0lORChzdGFydCk7CisgICAgQkFDS1RSQUNLSU5HLS07CisgICAgRkFJTEVERkxBRwk9IEFOVExSM19GQUxTRTsKKyAgICByZXR1cm4gc3VjY2VzczsKK30KK3N0YXRpYyBBTlRMUjNfQk9PTEVBTiBzeW5wcmVkODAyX2ZtbChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBBTlRMUjNfTUFSS0VSICAgc3RhcnQ7CisgICAgQU5UTFIzX0JPT0xFQU4gIHN1Y2Nlc3M7CisKKyAgICBCQUNLVFJBQ0tJTkcrKzsKKyAgICBzdGFydAk9IE1BUksoKTsKKyAgICBzeW5wcmVkODAyX2ZtbF9mcmFnbWVudChjdHgpOwkgICAgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgIHN1Y2Nlc3MJPSAhKEZBSUxFREZMQUcpOworICAgIFJFV0lORChzdGFydCk7CisgICAgQkFDS1RSQUNLSU5HLS07CisgICAgRkFJTEVERkxBRwk9IEFOVExSM19GQUxTRTsKKyAgICByZXR1cm4gc3VjY2VzczsKK30KK3N0YXRpYyBBTlRMUjNfQk9PTEVBTiBzeW5wcmVkNThfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQ1OF9mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDc3OF9mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDc3OF9mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDUxN19mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDUxN19mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDk4NF9mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDk4NF9mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDk5MV9mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDk5MV9mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDk2N19mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDk2N19mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDk3NF9mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDk3NF9mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDYxX2ZtbChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBBTlRMUjNfTUFSS0VSICAgc3RhcnQ7CisgICAgQU5UTFIzX0JPT0xFQU4gIHN1Y2Nlc3M7CisKKyAgICBCQUNLVFJBQ0tJTkcrKzsKKyAgICBzdGFydAk9IE1BUksoKTsKKyAgICBzeW5wcmVkNjFfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQxMjZfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQxMjZfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQ0MTlfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQ0MTlfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQ5NTdfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQ5NTdfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQ4OTdfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQ4OTdfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQ5NDhfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQ5NDhfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQ5NjVfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQ5NjVfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQzMjlfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQzMjlfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQ5ODJfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQ5ODJfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQ5NTJfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQ5NTJfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQ5ODBfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQ5ODBfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQ5NTBfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQ5NTBfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQ5NjNfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQ5NjNfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQ5NzZfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQ5NzZfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQ3MDlfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQ3MDlfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQxMDMwX2ZtbChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBBTlRMUjNfTUFSS0VSICAgc3RhcnQ7CisgICAgQU5UTFIzX0JPT0xFQU4gIHN1Y2Nlc3M7CisKKyAgICBCQUNLVFJBQ0tJTkcrKzsKKyAgICBzdGFydAk9IE1BUksoKTsKKyAgICBzeW5wcmVkMTAzMF9mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDQxMl9mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDQxMl9mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDk0Nl9mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDk0Nl9mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDk1OV9mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDk1OV9mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDEwMDBfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQxMDAwX2ZtbF9mcmFnbWVudChjdHgpOwkgICAgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgIHN1Y2Nlc3MJPSAhKEZBSUxFREZMQUcpOworICAgIFJFV0lORChzdGFydCk7CisgICAgQkFDS1RSQUNLSU5HLS07CisgICAgRkFJTEVERkxBRwk9IEFOVExSM19GQUxTRTsKKyAgICByZXR1cm4gc3VjY2VzczsKK30KK3N0YXRpYyBBTlRMUjNfQk9PTEVBTiBzeW5wcmVkNDM4X2ZtbChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBBTlRMUjNfTUFSS0VSICAgc3RhcnQ7CisgICAgQU5UTFIzX0JPT0xFQU4gIHN1Y2Nlc3M7CisKKyAgICBCQUNLVFJBQ0tJTkcrKzsKKyAgICBzdGFydAk9IE1BUksoKTsKKyAgICBzeW5wcmVkNDM4X2ZtbF9mcmFnbWVudChjdHgpOwkgICAgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgIHN1Y2Nlc3MJPSAhKEZBSUxFREZMQUcpOworICAgIFJFV0lORChzdGFydCk7CisgICAgQkFDS1RSQUNLSU5HLS07CisgICAgRkFJTEVERkxBRwk9IEFOVExSM19GQUxTRTsKKyAgICByZXR1cm4gc3VjY2VzczsKK30KK3N0YXRpYyBBTlRMUjNfQk9PTEVBTiBzeW5wcmVkMTAyOV9mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDEwMjlfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQ5NzFfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQ5NzFfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQ1N19mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDU3X2ZtbF9mcmFnbWVudChjdHgpOwkgICAgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgIHN1Y2Nlc3MJPSAhKEZBSUxFREZMQUcpOworICAgIFJFV0lORChzdGFydCk7CisgICAgQkFDS1RSQUNLSU5HLS07CisgICAgRkFJTEVERkxBRwk9IEFOVExSM19GQUxTRTsKKyAgICByZXR1cm4gc3VjY2VzczsKK30KK3N0YXRpYyBBTlRMUjNfQk9PTEVBTiBzeW5wcmVkODcyX2ZtbChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBBTlRMUjNfTUFSS0VSICAgc3RhcnQ7CisgICAgQU5UTFIzX0JPT0xFQU4gIHN1Y2Nlc3M7CisKKyAgICBCQUNLVFJBQ0tJTkcrKzsKKyAgICBzdGFydAk9IE1BUksoKTsKKyAgICBzeW5wcmVkODcyX2ZtbF9mcmFnbWVudChjdHgpOwkgICAgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgIHN1Y2Nlc3MJPSAhKEZBSUxFREZMQUcpOworICAgIFJFV0lORChzdGFydCk7CisgICAgQkFDS1RSQUNLSU5HLS07CisgICAgRkFJTEVERkxBRwk9IEFOVExSM19GQUxTRTsKKyAgICByZXR1cm4gc3VjY2VzczsKK30KK3N0YXRpYyBBTlRMUjNfQk9PTEVBTiBzeW5wcmVkMTAyMF9mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDEwMjBfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQxMDI3X2ZtbChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBBTlRMUjNfTUFSS0VSICAgc3RhcnQ7CisgICAgQU5UTFIzX0JPT0xFQU4gIHN1Y2Nlc3M7CisKKyAgICBCQUNLVFJBQ0tJTkcrKzsKKyAgICBzdGFydAk9IE1BUksoKTsKKyAgICBzeW5wcmVkMTAyN19mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDk2MV9mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDk2MV9mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDY0M19mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDY0M19mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDk1M19mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDk1M19mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDYwOV9mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDYwOV9mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDM0M19mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDM0M19mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDk4Nl9mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDk4Nl9mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDU3NF9mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDU3NF9mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDk3M19mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDk3M19mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDU5X2ZtbChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBBTlRMUjNfTUFSS0VSICAgc3RhcnQ7CisgICAgQU5UTFIzX0JPT0xFQU4gIHN1Y2Nlc3M7CisKKyAgICBCQUNLVFJBQ0tJTkcrKzsKKyAgICBzdGFydAk9IE1BUksoKTsKKyAgICBzeW5wcmVkNTlfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQxMDM1X2ZtbChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBBTlRMUjNfTUFSS0VSICAgc3RhcnQ7CisgICAgQU5UTFIzX0JPT0xFQU4gIHN1Y2Nlc3M7CisKKyAgICBCQUNLVFJBQ0tJTkcrKzsKKyAgICBzdGFydAk9IE1BUksoKTsKKyAgICBzeW5wcmVkMTAzNV9mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDQ5M19mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDQ5M19mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDc3OV9mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDc3OV9mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDc4MV9mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDc4MV9mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDM2Nl9mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDM2Nl9mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDM0MV9mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDM0MV9mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDUzMV9mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDUzMV9mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDk1NV9mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDk1NV9mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDk2OF9mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDk2OF9mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDk3NV9mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDk3NV9mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDYwX2ZtbChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBBTlRMUjNfTUFSS0VSICAgc3RhcnQ7CisgICAgQU5UTFIzX0JPT0xFQU4gIHN1Y2Nlc3M7CisKKyAgICBCQUNLVFJBQ0tJTkcrKzsKKyAgICBzdGFydAk9IE1BUksoKTsKKyAgICBzeW5wcmVkNjBfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQxMjdfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQxMjdfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQ5NThfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQ5NThfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQ4NjFfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQ4NjFfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQ5NDlfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQ5NDlfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQxMDMzX2ZtbChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBBTlRMUjNfTUFSS0VSICAgc3RhcnQ7CisgICAgQU5UTFIzX0JPT0xFQU4gIHN1Y2Nlc3M7CisKKyAgICBCQUNLVFJBQ0tJTkcrKzsKKyAgICBzdGFydAk9IE1BUksoKTsKKyAgICBzeW5wcmVkMTAzM19mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDU1OV9mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDU1OV9mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDE1M19mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDE1M19mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDg5NF9mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDg5NF9mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDMwNF9mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDMwNF9mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDk4M19mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDk4M19mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDM3M19mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDM3M19mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDk2Nl9mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDk2Nl9mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDE3MF9mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDE3MF9mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDk5Ml9mbWwocGZtbFBhcnNlciBjdHgpCit7CisgICAgQU5UTFIzX01BUktFUiAgIHN0YXJ0OworICAgIEFOVExSM19CT09MRUFOICBzdWNjZXNzOworCisgICAgQkFDS1RSQUNLSU5HKys7CisgICAgc3RhcnQJPSBNQVJLKCk7CisgICAgc3lucHJlZDk5Ml9mbWxfZnJhZ21lbnQoY3R4KTsJICAgIC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICBzdWNjZXNzCT0gIShGQUlMRURGTEFHKTsKKyAgICBSRVdJTkQoc3RhcnQpOworICAgIEJBQ0tUUkFDS0lORy0tOworICAgIEZBSUxFREZMQUcJPSBBTlRMUjNfRkFMU0U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gc3lucHJlZDk1X2ZtbChwZm1sUGFyc2VyIGN0eCkKK3sKKyAgICBBTlRMUjNfTUFSS0VSICAgc3RhcnQ7CisgICAgQU5UTFIzX0JPT0xFQU4gIHN1Y2Nlc3M7CisKKyAgICBCQUNLVFJBQ0tJTkcrKzsKKyAgICBzdGFydAk9IE1BUksoKTsKKyAgICBzeW5wcmVkOTVfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQ3ODBfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQ3ODBfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQ5ODFfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQ5ODFfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQzNzVfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQzNzVfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQxMzhfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQxMzhfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQ4OThfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQ4OThfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQ0MjZfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQ0MjZfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQ3MTRfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQ3MTRfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQ1MzVfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQ1MzVfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQ4OTZfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQ4OTZfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQyOTZfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQyOTZfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQ5NDdfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQ5NDdfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQ5NzdfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQ5NzdfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQ5NjRfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQ5NjRfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorc3RhdGljIEFOVExSM19CT09MRUFOIHN5bnByZWQ5NTFfZm1sKHBmbWxQYXJzZXIgY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIHN0YXJ0CT0gTUFSSygpOworICAgIHN5bnByZWQ5NTFfZm1sX2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfQorCisvKiBFbmQgb2Ygc3ludGFjdGljIHByZWRpY2F0ZXMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisKKworCisKKworLyogRW5kIG9mIGNvZGUKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWxQYXJzZXIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWxQYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mjg1YTZlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL21vZGVsL2ZtbFBhcnNlci5oCkBAIC0wLDAgKzEsMjY5NyBAQAorLyoqIFxmaWxlCisgKiAgVGhpcyBDIGhlYWRlciBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgJEFOVExSIHZlcnNpb24gMy40CisgKgorICogICAgIC0gIEZyb20gdGhlIGdyYW1tYXIgc291cmNlIGZpbGUgOiAvaG9tZS9sYXBpdHJlX2lzMTQ4MjQ1L2dpdC9vcmcuZWNsaXBzZS5lZm0tc3ltYmV4L29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci9tb2RlbC9mbWwuZworICogICAgIC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT24gOiAyMDE3LTA1LTMwIDA5OjIxOjUyCisgKiAgICAgLSAgICAgICAgICAgICAgICBmb3IgdGhlIHBhcnNlciA6IGZtbFBhcnNlclBhcnNlcgorICoKKyAqIEVkaXRpbmcgaXQsIGF0IGxlYXN0IG1hbnVhbGx5LCBpcyBub3Qgd2lzZS4KKyAqCisgKiBDIGxhbmd1YWdlIGdlbmVyYXRvciBhbmQgcnVudGltZSBieSBKaW0gSWRsZSwgamltaXxoZXJlaXNhbmF0fGlkbGV8ZG90Z29lc2hlcmV8d3MuCisgKgorICoKKyAqIFRoZSBwYXJzZXIgCitmbWxQYXJzZXIKKworaGFzIHRoZSBjYWxsYWJsZSBmdW5jdGlvbnMgKHJ1bGVzKSBzaG93biBiZWxvdywKKyAqIHdoaWNoIHdpbGwgaW52b2tlIHRoZSBjb2RlIGZvciB0aGUgYXNzb2NpYXRlZCBydWxlIGluIHRoZSBzb3VyY2UgZ3JhbW1hcgorICogYXNzdW1pbmcgdGhhdCB0aGUgaW5wdXQgc3RyZWFtIGlzIHBvaW50aW5nIHRvIGEgdG9rZW4vdGV4dCBzdHJlYW0gdGhhdCBjb3VsZCBiZWdpbgorICogdGhpcyBydWxlLgorICoKKyAqIEZvciBpbnN0YW5jZSBpZiB5b3UgY2FsbCB0aGUgZmlyc3QgKHRvcG1vc3QpIHJ1bGUgaW4gYSBwYXJzZXIgZ3JhbW1hciwgeW91IHdpbGwKKyAqIGdldCB0aGUgcmVzdWx0cyBvZiBhIGZ1bGwgcGFyc2UsIGJ1dCBjYWxsaW5nIGEgcnVsZSBoYWxmIHdheSB0aHJvdWdoIHRoZSBncmFtbWFyIHdpbGwKKyAqIGFsbG93IHlvdSB0byBwYXNzIHBhcnQgb2YgYSBmdWxsIHRva2VuIHN0cmVhbSB0byB0aGUgcGFyc2VyLCBzdWNoIGFzIGZvciBzeW50YXggY2hlY2tpbmcKKyAqIGluIGVkaXRvcnMgYW5kIHNvIG9uLgorICoKKyAqIFRoZSBwYXJzZXIgZW50cnkgcG9pbnRzIGFyZSBjYWxsZWQgaW5kaXJlY3RseSAoYnkgZnVuY3Rpb24gcG9pbnRlciB0byBmdW5jdGlvbikgdmlhCisgKiBhIHBhcnNlciBjb250ZXh0IHR5cGVkZWYgcGZtbFBhcnNlciwgd2hpY2ggaXMgcmV0dXJuZWQgZnJvbSBhIGNhbGwgdG8gZm1sUGFyc2VyTmV3KCkuCisgKgorICogVGhlIG1ldGhvZHMgaW4gcGZtbFBhcnNlciBhcmUgIGFzIGZvbGxvd3M6CisgKgorICogIC0gCisgc2VwOjpTeXN0ZW0gKgorICAgICAgcGZtbFBhcnNlci0+Zm9ybWFsTUwocGZtbFBhcnNlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxQYXJzZXItPnByb2xvZ3VlX2ZtbChwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+cHJvbG9ndWVfYXR0cmlidXRlKHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT5wcm9sb2d1ZV9vcHRpb25zKHBmbWxQYXJzZXIpCisgKiAgLSAKKyBzZXA6Ok1vZGlmaWVyCisgICAgICBwZm1sUGFyc2VyLT5tb2RpZmllcl9kZWNsYXJhdGlvbihwZm1sUGFyc2VyKQorICogIC0gCisgc2VwOjpNb2RpZmllcgorICAgICAgcGZtbFBhcnNlci0+bW9kaWZpZXJfZGlyZWN0aW9uKHBmbWxQYXJzZXIpCisgKiAgLSAKKyBzZXA6Ok1vZGlmaWVyCisgICAgICBwZm1sUGFyc2VyLT5tb2RpZmllcl9kaXJlY3Rpb25fdGV4dChwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+bW9kaWZpZXJfc2V0X2RpcmVjdGlvbl9zdHJpY3RfdGV4dChwZm1sUGFyc2VyKQorICogIC0gCisgc2VwOjpNb2RpZmllcgorICAgICAgcGZtbFBhcnNlci0+bW9kaWZpZXJfZGlyZWN0aW9uX3N5bWJvbChwZm1sUGFyc2VyKQorICogIC0gCisgc2VwOjpNb2RpZmllcgorICAgICAgcGZtbFBhcnNlci0+bW9kaWZpZXJfcGFyYW0ocGZtbFBhcnNlcikKKyAqICAtIAorIGZtbFBhcnNlcl9wcm9jZWR1cmVfbW9kaWZpZXJfc3BlY2lmaWVyX3JldHVybgorICAgICAgcGZtbFBhcnNlci0+cHJvY2VkdXJlX21vZGlmaWVyX3NwZWNpZmllcihwZm1sUGFyc2VyKQorICogIC0gCisgZm1sUGFyc2VyX2V4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyX3JldHVybgorICAgICAgcGZtbFBhcnNlci0+ZXhlY3V0YWJsZV9tb2RpZmllcl9zcGVjaWZpZXIocGZtbFBhcnNlcikKKyAqICAtIAorIGZtbFBhcnNlcl9pbnN0YW5jZV9tb2RpZmllcl9zcGVjaWZpZXJfcmV0dXJuCisgICAgICBwZm1sUGFyc2VyLT5pbnN0YW5jZV9tb2RpZmllcl9zcGVjaWZpZXIocGZtbFBhcnNlcikKKyAqICAtIAorIGZtbFBhcnNlcl9tb2RpZmllcl90cmFuc2l0aW9uX3JldHVybgorICAgICAgcGZtbFBhcnNlci0+bW9kaWZpZXJfdHJhbnNpdGlvbihwZm1sUGFyc2VyKQorICogIC0gCisgc2VwOjpQYWNrYWdlICoKKyAgICAgIHBmbWxQYXJzZXItPmRlZl9wYWNrYWdlKHBmbWxQYXJzZXIpCisgKiAgLSAKKyBzZXA6OlN5c3RlbSAqCisgICAgICBwZm1sUGFyc2VyLT5kZWZfc3lzdGVtKHBmbWxQYXJzZXIpCisgKiAgLSAKKyBmbWxQYXJzZXJfcXVhbGlmaWVkTmFtZUlEX3JldHVybgorICAgICAgcGZtbFBhcnNlci0+cXVhbGlmaWVkTmFtZUlEKHBmbWxQYXJzZXIpCisgKiAgLSAKKyBzZXA6OmF2bV9zaXplX3QKKyAgICAgIHBmbWxQYXJzZXItPmludGVnZXJfY29uc3RhbnQocGZtbFBhcnNlcikKKyAqICAtIAorIHNlcDo6YXZtX2Zsb2F0X3QKKyAgICAgIHBmbWxQYXJzZXItPmZsb2F0X2NvbnN0YW50KHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT5zZWN0aW9uX2hlYWRlcihwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+c2VjdGlvbl9pbXBvcnQocGZtbFBhcnNlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxQYXJzZXItPmluY2x1ZGVfcGFja2FnZShwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+c2VjdGlvbl9wcm9jZWR1cmUocGZtbFBhcnNlcikKKyAqICAtIAorIHNlcDo6TWFjaGluZSAqCisgICAgICBwZm1sUGFyc2VyLT5kZWZfcHJvY2VkdXJlKHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT5kZWZfbWFjaGluZV9wYXJhbWV0ZXJzKHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT5kZWZfbWFjaGluZV92YXJpYWJsZV9wYXJhbWV0ZXJfYXRvbShwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+ZGVmX21hY2hpbmVfcmV0dXJucyhwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+ZGVmX21hY2hpbmVfdmFyaWFibGVfcmV0dXJuX2F0b20ocGZtbFBhcnNlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxQYXJzZXItPmRlZl9ib2R5X3Byb2NlZHVyZShwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+ZGVmX2JvZHlfcHJvY2VkdXJlX3NlY3Rpb24ocGZtbFBhcnNlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxQYXJzZXItPmRlZl9ib2R5X3Byb2NlZHVyZV9zaW1wbGlmKHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT5zZWN0aW9uX2NvbXBvc2l0ZV9zdHJ1Y3R1cmUocGZtbFBhcnNlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxQYXJzZXItPnNlY3Rpb25fY29tcG9zaXRlX2dlbmVyaWMocGZtbFBhcnNlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxQYXJzZXItPnNlY3Rpb25fbWFjaGluZV9tb2RlbChwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+c2VjdGlvbl9tYWNoaW5lX3Byb3RvdHlwZShwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+c2VjdGlvbl9tYWNoaW5lX2luc3RhbmNlKHBmbWxQYXJzZXIpCisgKiAgLSAKKyBzZXA6Ok1hY2hpbmUgKgorICAgICAgcGZtbFBhcnNlci0+ZXhlY3V0YWJsZV9tYWNoaW5lKHBmbWxQYXJzZXIpCisgKiAgLSAKKyBzZXA6Ok1hY2hpbmUgKgorICAgICAgcGZtbFBhcnNlci0+ZXhlY3V0YWJsZV9tb2RlbF9kZWZpbml0b24ocGZtbFBhcnNlcikKKyAqICAtIAorIHNlcDo6TWFjaGluZSAqCisgICAgICBwZm1sUGFyc2VyLT5leGVjdXRhYmxlX2luc3RhbmNlX2RlZmluaXRvbihwZm1sUGFyc2VyKQorICogIC0gCisgc2VwOjpNYWNoaW5lICoKKyAgICAgIHBmbWxQYXJzZXItPmRlY2xfaW5zdGFuY2UocGZtbFBhcnNlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxQYXJzZXItPmRlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHkocGZtbFBhcnNlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxQYXJzZXItPmRlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlfcGFyYW1ldGVyKHBmbWxQYXJzZXIpCisgKiAgLSAKKyBzZXA6Ok9wZXJhdG9yICoKKyAgICAgIHBmbWxQYXJzZXItPm9wX2Fzc2lnbl9wYXJhbShwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+ZGVmX2luc3RhbmNlX2FjdGl2aXR5KHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT5zZWN0aW9uX2JlaGF2aW9yKHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT5kZWZfaW5zdGFuY2VfY291bnQocGZtbFBhcnNlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxQYXJzZXItPmRlZl9pbnN0YW5jZV9jb3VudF9hdG9tKHBmbWxQYXJzZXIpCisgKiAgLSAKKyBzZXA6Ok1hY2hpbmUgKgorICAgICAgcGZtbFBhcnNlci0+ZGVmX21hY2hpbmUocGZtbFBhcnNlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxQYXJzZXItPmRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9oZWFkZXJfcHJlZGljYXQocGZtbFBhcnNlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxQYXJzZXItPmRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9pbXBvcnRfcHJlZGljYXQocGZtbFBhcnNlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxQYXJzZXItPmRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wYXJhbWV0ZXJfcHJlZGljYXQocGZtbFBhcnNlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxQYXJzZXItPmRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcm9wZXJ0eV9wcmVkaWNhdChwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+ZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3ByZWRpY2F0KHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT5kZWZfYm9keV9tYWNoaW5lKHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT5kZWZfYm9keV9tYWNoaW5lX3NlY3Rpb24ocGZtbFBhcnNlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxQYXJzZXItPmRlZl9ib2R5X21hY2hpbmVfc2ltcGxpZihwZm1sUGFyc2VyKQorICogIC0gCisgc2VwOjpNYWNoaW5lICoKKyAgICAgIHBmbWxQYXJzZXItPmFueV9kZWZfc3RhdGVtYWNoaW5lKHBmbWxQYXJzZXIpCisgKiAgLSAKKyBzZXA6Ok1hY2hpbmUgKgorICAgICAgcGZtbFBhcnNlci0+ZGVmX3N0YXRlbWFjaGluZShwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+ZGVmX2JvZHlfc3RhdGVtYWNoaW5lKHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT5zZWN0aW9uX3JlZ2lvbihwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+c2VjdGlvbl9zdGF0ZW1hY2hpbmUocGZtbFBhcnNlcikKKyAqICAtIAorIHNlcDo6TWFjaGluZSAqCisgICAgICBwZm1sUGFyc2VyLT5kZWZfc3RhdGUocGZtbFBhcnNlcikKKyAqICAtIAorIHN0ZDo6c3RyaW5nCisgICAgICBwZm1sUGFyc2VyLT5zdGF0ZV9rd19pZChwZm1sUGFyc2VyKQorICogIC0gCisgc3RkOjpzdHJpbmcKKyAgICAgIHBmbWxQYXJzZXItPnN0YXRlX2lkKHBmbWxQYXJzZXIpCisgKiAgLSAKKyBzZXA6Ok1hY2hpbmUgKgorICAgICAgcGZtbFBhcnNlci0+ZGVmX3N0YXRlX3NpbmdsZXRvbihwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+ZXhlY3V0YWJsZV9zcGVjaWZpZXIocGZtbFBhcnNlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxQYXJzZXItPmV4ZWN1dGFibGVfc3BlY2lmaWVyX2F0b20ocGZtbFBhcnNlcikKKyAqICAtIAorIHNlcDo6QkYKKyAgICAgIHBmbWxQYXJzZXItPmluc3RhbmNlX21hY2hpbmVfbW9kZWwocGZtbFBhcnNlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxQYXJzZXItPmRlZl9ib2R5X3N0YXRlKHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT5kZWZfYm9keV9zdGF0ZV9zZWN0aW9uKHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT5kZWZfYm9keV9zdGF0ZV9zaW1wbGlmKHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT5zZWN0aW9uX3RyYW5zaXRpb24ocGZtbFBhcnNlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxQYXJzZXItPmRlZl90cmFuc2l0aW9uKHBmbWxQYXJzZXIpCisgKiAgLSAKKyBzZXA6OlRyYW5zaXRpb246Ok1PQ19LSU5ECisgICAgICBwZm1sUGFyc2VyLT5raW5kX3RyYW5zaXRpb24ocGZtbFBhcnNlcikKKyAqICAtIAorIHNlcDo6VHJhbnNpdGlvbjo6bW9jX2tpbmRfdAorICAgICAgcGZtbFBhcnNlci0+bW9jX3RyYW5zaXRpb25fYXR0cmlidXRlKHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT5tb2NfdHJhbnNpdGlvbihwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+bW9jX3RyYW5zaXRpb25fYXRvbShwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+bW9lX3RyYW5zaXRpb24ocGZtbFBhcnNlcikKKyAqICAtIAorIHNlcDo6QkZDb2RlCisgICAgICBwZm1sUGFyc2VyLT50cmFuc2l0aW9uX3N0YXRlbWVudChwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+dHJhbnNpdGlvbl90cmlnZ2VyKHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT50cmFuc2l0aW9uX2d1YXJkKHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT50cmFuc2l0aW9uX3RpbWVkX2d1YXJkKHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT50cmFuc2l0aW9uX2VmZmVjdChwZm1sUGFyc2VyKQorICogIC0gCisgc2VwOjpCRgorICAgICAgcGZtbFBhcnNlci0+dGFyZ2V0X3N0YXRlX2lkKHBmbWxQYXJzZXIpCisgKiAgLSAKKyBzdGQ6OnN0cmluZworICAgICAgcGZtbFBhcnNlci0+dGFyZ2V0X3N0YXRlX2t3X2lkKHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT5kZWZfc3RhdGVfYWN0aXZpdHkocGZtbFBhcnNlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxQYXJzZXItPnNlY3Rpb25faGVhZGVyX2ltcG9ydF9wYXJhbWV0ZXJfcHJvcGVydHkocGZtbFBhcnNlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxQYXJzZXItPnNlY3Rpb25fcGFyYW1ldGVyKHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT5zZWN0aW9uX3Byb3BlcnR5KHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT5zZWN0aW9uX3Byb3BlcnR5X2ZyZWVfZGVjbGFyYXRpb24ocGZtbFBhcnNlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxQYXJzZXItPnByb3BlcnR5X2RlY2xhcmF0aW9uKHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT5kZWNsX3Byb3BlcnR5X2VsZW1lbnQocGZtbFBhcnNlcikKKyAqICAtIAorIGZtbFBhcnNlcl9sYWJlbGxlZF9hcmd1bWVudF9yZXR1cm4KKyAgICAgIHBmbWxQYXJzZXItPmxhYmVsbGVkX2FyZ3VtZW50KHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT5kZWNsX2luc3RhbmNlX21hY2hpbmVfcGFyYW1zKHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT5kZWNsX2luc3RhbmNlX21hY2hpbmVfcmV0dXJucyhwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+YWN0aXZpdHlfbWFjaGluZV9wYXJhbV9yZXR1cm4ocGZtbFBhcnNlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxQYXJzZXItPmRlY2xfcG9ydChwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+ZGVjbF9wb3J0X2ltcGwocGZtbFBhcnNlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxQYXJzZXItPmRlY2xfc2lnbmFsKHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT5kZWNsX3NpZ25hbF9pbXBsKHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT50eXBlX3BhcmFtX2NvbShwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+cGFyYW1fY29tX2F0b20ocGZtbFBhcnNlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxQYXJzZXItPmRlY2xfYnVmZmVyKHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT5kZWNsX2J1ZmZlcl9pbXBsKHBmbWxQYXJzZXIpCisgKiAgLSAKKyBmbWxQYXJzZXJfZGVmX2J1ZmZlcl9yZXR1cm4KKyAgICAgIHBmbWxQYXJzZXItPmRlZl9idWZmZXIocGZtbFBhcnNlcikKKyAqICAtIAorIHNlcDo6YXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdAorICAgICAgcGZtbFBhcnNlci0+cG9saWN5X2J1ZmZlcihwZm1sUGFyc2VyKQorICogIC0gCisgc2VwOjpCRgorICAgICAgcGZtbFBhcnNlci0+cmVmX2J1ZmZlcihwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+aW5pdGlhbF9idWZmZXJfY29udGVudHMocGZtbFBhcnNlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxQYXJzZXItPmRlY2xfY2hhbm5lbChwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+ZGVjbF9jaGFubmVsX3BvcnQocGZtbFBhcnNlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxQYXJzZXItPmRlY2xfY2hhbm5lbF92YXIocGZtbFBhcnNlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxQYXJzZXItPmRlY2xfdmFyaWFibGUocGZtbFBhcnNlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxQYXJzZXItPmRlY2xfdmFyaWFibGVfdGltZV9jbG9ja19pbXBsKHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT5kZWNsX3ZhcmlhYmxlX2ltcGwocGZtbFBhcnNlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxQYXJzZXItPmRlY2xfdmFyaWFibGVfYXRvbV9pbXBsKHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT5kZWNsX3R5cGVkX3ZhcmlhYmxlX2F0b21faW1wbChwZm1sUGFyc2VyKQorICogIC0gCisgc2VwOjpCRgorICAgICAgcGZtbFBhcnNlci0+aW5pdGlhbF92YWx1ZShwZm1sUGFyc2VyKQorICogIC0gCisgc2VwOjpCRgorICAgICAgcGZtbFBhcnNlci0+dHlwZV92YXIocGZtbFBhcnNlcikKKyAqICAtIAorIHNlcDo6QkYKKyAgICAgIHBmbWxQYXJzZXItPmRlZl90eXBlX2FycmF5KHBmbWxQYXJzZXIpCisgKiAgLSAKKyBpbnQKKyAgICAgIHBmbWxQYXJzZXItPmRlZl90eXBlX2FycmF5X3NpemUocGZtbFBhcnNlcikKKyAqICAtIAorIHNlcDo6QkYKKyAgICAgIHBmbWxQYXJzZXItPmRlZl90eXBlX2NvbnRhaW5lcihwZm1sUGFyc2VyKQorICogIC0gCisgc2VwOjphdm1fdHlwZV9zcGVjaWZpZXJfa2luZF90CisgICAgICBwZm1sUGFyc2VyLT5zcGVjaWZpZXJfYnVmZmVyKHBmbWxQYXJzZXIpCisgKiAgLSAKKyBzZXA6OkJGCisgICAgICBwZm1sUGFyc2VyLT5kZWZfdHlwZV9pbnRlcnZhbChwZm1sUGFyc2VyKQorICogIC0gCisgc2VwOjpCRgorICAgICAgcGZtbFBhcnNlci0+YmFzZV90eXBlX3ZhcihwZm1sUGFyc2VyKQorICogIC0gCisgc2VwOjpUeXBlU3BlY2lmaWVyCisgICAgICBwZm1sUGFyc2VyLT5wcmltaXRpdmVfdHlwZShwZm1sUGFyc2VyKQorICogIC0gCisgaW50CisgICAgICBwZm1sUGFyc2VyLT5iaXRfZmllbGRfc2l6ZShwZm1sUGFyc2VyKQorICogIC0gCisgZm1sUGFyc2VyX3N0cmluZ19maWVsZF9zaXplX3JldHVybgorICAgICAgcGZtbFBhcnNlci0+c3RyaW5nX2ZpZWxkX3NpemUocGZtbFBhcnNlcikKKyAqICAtIAorIGZtbFBhcnNlcl9yYW5nZV9jb25zdGFudF9yZXR1cm4KKyAgICAgIHBmbWxQYXJzZXItPnJhbmdlX2NvbnN0YW50KHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT5vbl93cml0ZV92YXJfcm91dGluZV9kZWYocGZtbFBhcnNlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxQYXJzZXItPnZhcl9yb3V0aW5lX2RlZihwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+cm91dGluZV9zaW5nbGVfcGFyYW0ocGZtbFBhcnNlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxQYXJzZXItPmRlZl9lbnVtKHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT5kZWZfZW51bV9pbXBsKHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT5kZWZfc3RydWN0KHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT5kZWZfY2xhc3Nfc3RydWN0dXJlX2ltcGwocGZtbFBhcnNlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxQYXJzZXItPmRlZl9jaG9pY2UocGZtbFBhcnNlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxQYXJzZXItPmRlZl9jaG9pY2VfaW1wbChwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+ZGVmX3VuaW9uKHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT5kZWZfdW5pb25faW1wbChwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+ZGVmX21ldGhvZChwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+ZGVjbF9wYXJhbWV0ZXJzKHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT5kZWZfdHlwZShwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+ZGVmX3R5cGVfaW1wbChwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+ZGVmX3R5cGVfYXRvbV9pbXBsKHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT5kZWZfdHlwZWRlZl9jb25zdHJhaW50KHBmbWxQYXJzZXIpCisgKiAgLSAKKyBzZXA6OlR5cGVTcGVjaWZpZXIKKyAgICAgIHBmbWxQYXJzZXItPnRpbWVfdHlwZShwZm1sUGFyc2VyKQorICogIC0gCisgc2VwOjpUeXBlU3BlY2lmaWVyCisgICAgICBwZm1sUGFyc2VyLT50aW1lX2Nsb2NrX3R5cGUocGZtbFBhcnNlcikKKyAqICAtIAorIHNlcDo6VHlwZVNwZWNpZmllcgorICAgICAgcGZtbFBhcnNlci0+dGltZV90eXBlX2RvbWFpbihwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+c2VjdGlvbl9tb2RlbF9vZl9jb21wdXRhdGlvbihwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+c2VjdGlvbl9yb3V0aW5lKHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT5kZWZfcm91dGluZV9tb2RlbChwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+ZGVmX3JvdXRpbmVfbW9kZWxfaW1wbChwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+ZGVmX3JvdXRpbmVfcGFyYW1ldGVycyhwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+ZGVmX3JvdXRpbmVfcGFyYW1fYXRvbShwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+ZGVmX3JvdXRpbmVfcmV0dXJucyhwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+ZGVmX3JvdXRpbmVfcmV0dXJuc19hdG9tKHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT5zZWN0aW9uX21vZGVsX29mX2V4ZWN1dGlvbihwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+ZGVmX21vZV9wcmltaXRpdmUocGZtbFBhcnNlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxQYXJzZXItPmRlZl9yb3V0aW5lX3NlcShwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+c2VjdGlvbl9tb2RlbF9vZl9pbnRlcmFjdGlvbihwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+Y29tX3Byb3RvY29sKHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT5jb21fY2FzdChwZm1sUGFyc2VyKQorICogIC0gCisgc2VwOjpCRgorICAgICAgcGZtbFBhcnNlci0+YnVmZmVyX2NvbShwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+Y29tX2Nvbm5lY3QocGZtbFBhcnNlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxQYXJzZXItPmNvbV9yb3V0ZShwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+Y29tX3BvcnQocGZtbFBhcnNlcikKKyAqICAtIAorIHNlcDo6QkYKKyAgICAgIHBmbWxQYXJzZXItPmNvbV9wb3J0X2lkKHBmbWxQYXJzZXIpCisgKiAgLSAKKyBzZXA6OkJGQ29kZQorICAgICAgcGZtbFBhcnNlci0+c3RhdGVtZW50KHBmbWxQYXJzZXIpCisgKiAgLSAKKyBzZXA6OkJGQ29kZQorICAgICAgcGZtbFBhcnNlci0+YmxvY2tfc3RhdGVtZW50KHBmbWxQYXJzZXIpCisgKiAgLSAKKyBzZXA6Ok9wZXJhdG9yICoKKyAgICAgIHBmbWxQYXJzZXItPm9wX2Jsb2NrKHBmbWxQYXJzZXIpCisgKiAgLSAKKyBzZXA6Ok9wZXJhdG9yICoKKyAgICAgIHBmbWxQYXJzZXItPm9wX3NlcXVlbmNlKHBmbWxQYXJzZXIpCisgKiAgLSAKKyBzZXA6Ok9wZXJhdG9yICoKKyAgICAgIHBmbWxQYXJzZXItPm9wX3NjaGVkdWxpbmcocGZtbFBhcnNlcikKKyAqICAtIAorIHNlcDo6T3BlcmF0b3IgKgorICAgICAgcGZtbFBhcnNlci0+b3BfY29uY3VycmVuY3kocGZtbFBhcnNlcikKKyAqICAtIAorIHNlcDo6T3BlcmF0b3IgKgorICAgICAgcGZtbFBhcnNlci0+b3BfaW52b2thYmxlKHBmbWxQYXJzZXIpCisgKiAgLSAKKyBzZXA6OkJGQ29kZQorICAgICAgcGZtbFBhcnNlci0+cHJlZml4X3N0YXRlbWVudChwZm1sUGFyc2VyKQorICogIC0gCisgc2VwOjpCRkNvZGUKKyAgICAgIHBmbWxQYXJzZXItPnByZWZpeF9leHByZXNzaW9uKHBmbWxQYXJzZXIpCisgKiAgLSAKKyBzZXA6Ok9wZXJhdG9yICoKKyAgICAgIHBmbWxQYXJzZXItPmF2bV9vcGVyYXRvcihwZm1sUGFyc2VyKQorICogIC0gCisgc2VwOjpCRkNvZGUKKyAgICAgIHBmbWxQYXJzZXItPnN0YXRlbWVudF9pbnZva2VfbWV0aG9kKHBmbWxQYXJzZXIpCisgKiAgLSAKKyBzZXA6OkJGQ29kZQorICAgICAgcGZtbFBhcnNlci0+c3RhdGVtZW50X2ludm9rZShwZm1sUGFyc2VyKQorICogIC0gCisgc2VwOjpCRkNvZGUKKyAgICAgIHBmbWxQYXJzZXItPmV4cHJlc3Npb25faW52b2tlKHBmbWxQYXJzZXIpCisgKiAgLSAKKyBzZXA6OkJGQ29kZQorICAgICAgcGZtbFBhcnNlci0+c3RhdGVtZW50X2FjdGl2aXR5X25ldyhwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+ZGVjbF9pbnN0YW5jZV9keW5hbWljX2ltcGwocGZtbFBhcnNlcikKKyAqICAtIAorIHNlcDo6QkZDb2RlCisgICAgICBwZm1sUGFyc2VyLT5leHByZXNzaW9uX2FjdGl2aXR5X25ldyhwZm1sUGFyc2VyKQorICogIC0gCisgc2VwOjpCRkNvZGUKKyAgICAgIHBmbWxQYXJzZXItPnN0YXRlbWVudF9wcm9tcHQocGZtbFBhcnNlcikKKyAqICAtIAorIHNlcDo6QkZDb2RlCisgICAgICBwZm1sUGFyc2VyLT5zdGF0ZW1lbnRfcHJvbXB0X2ltcGwocGZtbFBhcnNlcikKKyAqICAtIAorIHNlcDo6QkZDb2RlCisgICAgICBwZm1sUGFyc2VyLT5zdGF0ZW1lbnRfcHJvbXB0X29icyhwZm1sUGFyc2VyKQorICogIC0gCisgc2VwOjpCRkNvZGUKKyAgICAgIHBmbWxQYXJzZXItPnN0YXRlbWVudF9wcm9tcHRfb2JzX2NvbShwZm1sUGFyc2VyKQorICogIC0gCisgc2VwOjpCRkNvZGUKKyAgICAgIHBmbWxQYXJzZXItPm1ldGFfc3RhdGVtZW50KHBmbWxQYXJzZXIpCisgKiAgLSAKKyBzZXA6OkJGQ29kZQorICAgICAgcGZtbFBhcnNlci0+c3RhdGVtZW50X2Fzc2lnbihwZm1sUGFyc2VyKQorICogIC0gCisgc2VwOjpCRgorICAgICAgcGZtbFBhcnNlci0+bHZhbHVlKHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT5wYXJhbWV0ZXJzKHBmbWxQYXJzZXIpCisgKiAgLSAKKyBzZXA6OkJGQ29kZQorICAgICAgcGZtbFBhcnNlci0+c3RhdGVtZW50X2NvbShwZm1sUGFyc2VyKQorICogIC0gCisgc2VwOjpCRkNvZGUKKyAgICAgIHBmbWxQYXJzZXItPnN0YXRlbWVudF9jb21faW5wdXQocGZtbFBhcnNlcikKKyAqICAtIAorIHNlcDo6QkZDb2RlCisgICAgICBwZm1sUGFyc2VyLT5zdGF0ZW1lbnRfY29tX291dHB1dChwZm1sUGFyc2VyKQorICogIC0gCisgdm9pZAorICAgICAgcGZtbFBhcnNlci0+cGFyYW1ldGVyc19wb3J0KHBmbWxQYXJzZXIpCisgKiAgLSAKKyBzZXA6OkJGQ29kZQorICAgICAgcGZtbFBhcnNlci0+ZXhwcmVzc2lvbl9jb20ocGZtbFBhcnNlcikKKyAqICAtIAorIHNlcDo6QkZDb2RlCisgICAgICBwZm1sUGFyc2VyLT5zdGF0ZW1lbnRfY29uc3RyYWludChwZm1sUGFyc2VyKQorICogIC0gCisgc2VwOjpCRkNvZGUKKyAgICAgIHBmbWxQYXJzZXItPnN0YXRlbWVudF9ndWFyZChwZm1sUGFyc2VyKQorICogIC0gCisgc2VwOjpCRkNvZGUKKyAgICAgIHBmbWxQYXJzZXItPnN0YXRlbWVudF90aW1lZF9ndWFyZChwZm1sUGFyc2VyKQorICogIC0gCisgc2VwOjpCRkNvZGUKKyAgICAgIHBmbWxQYXJzZXItPnN0YXRlbWVudF9jaGVja3NhdChwZm1sUGFyc2VyKQorICogIC0gCisgc2VwOjpCRkNvZGUKKyAgICAgIHBmbWxQYXJzZXItPmV4cHJlc3Npb25fZ3VhcmQocGZtbFBhcnNlcikKKyAqICAtIAorIHNlcDo6QkZDb2RlCisgICAgICBwZm1sUGFyc2VyLT5zdGF0ZW1lbnRfaXRlKHBmbWxQYXJzZXIpCisgKiAgLSAKKyBzZXA6OkJGQ29kZQorICAgICAgcGZtbFBhcnNlci0+ZXhwcmVzc2lvbl9pdGUocGZtbFBhcnNlcikKKyAqICAtIAorIHNlcDo6QkZDb2RlCisgICAgICBwZm1sUGFyc2VyLT5zdGF0ZW1lbnRfaXRlcmF0aW9uKHBmbWxQYXJzZXIpCisgKiAgLSAKKyBzZXA6OkJGQ29kZQorICAgICAgcGZtbFBhcnNlci0+Zm9yX2Fzc2lnbl9oZWFkZXIocGZtbFBhcnNlcikKKyAqICAtIAorIHNlcDo6QkZDb2RlCisgICAgICBwZm1sUGFyc2VyLT5zdGF0ZW1lbnRfanVtcChwZm1sUGFyc2VyKQorICogIC0gCisgc2VwOjpCRkNvZGUKKyAgICAgIHBmbWxQYXJzZXItPmV4cHJlc3Npb25fbGFtYmRhKHBmbWxQYXJzZXIpCisgKiAgLSAKKyBzZXA6OkJGQ29kZQorICAgICAgcGZtbFBhcnNlci0+ZXhwcmVzc2lvbl9zdGF0dXMocGZtbFBhcnNlcikKKyAqICAtIAorIHNlcDo6T3BlcmF0b3IgKgorICAgICAgcGZtbFBhcnNlci0+b3BfYWN0aXZpdHkocGZtbFBhcnNlcikKKyAqICAtIAorIHNlcDo6QkZDb2RlCisgICAgICBwZm1sUGFyc2VyLT5zdGF0ZW1lbnRfYWN0aXZpdHkocGZtbFBhcnNlcikKKyAqICAtIAorIHNlcDo6QkZDb2RlCisgICAgICBwZm1sUGFyc2VyLT5zdGF0ZW1lbnRfaW5pdF9mbG93KHBmbWxQYXJzZXIpCisgKiAgLSAKKyBzZXA6OkJGQ29kZQorICAgICAgcGZtbFBhcnNlci0+c3RhdGVtZW50X2ludm9rZV9yb3V0aW5lKHBmbWxQYXJzZXIpCisgKiAgLSAKKyB2b2lkCisgICAgICBwZm1sUGFyc2VyLT5pbnZva2Vfcm91dGluZV9wYXJhbXMocGZtbFBhcnNlcikKKyAqICAtIAorIHZvaWQKKyAgICAgIHBmbWxQYXJzZXItPmludm9rZV9yb3V0aW5lX3JldHVybnMocGZtbFBhcnNlcikKKyAqICAtIAorIHNlcDo6QkZDb2RlCisgICAgICBwZm1sUGFyc2VyLT5zdGF0ZW1lbnRfbW9jKHBmbWxQYXJzZXIpCisgKiAgLSAKKyBzZXA6OkJGCisgICAgICBwZm1sUGFyc2VyLT5leHByZXNzaW9uKHBmbWxQYXJzZXIpCisgKiAgLSAKKyBzZXA6OkJGCisgICAgICBwZm1sUGFyc2VyLT5jb25kaXRpb25hbEV4cHJlc3Npb24ocGZtbFBhcnNlcikKKyAqICAtIAorIHNlcDo6QkYKKyAgICAgIHBmbWxQYXJzZXItPnNjaGVkdWxlRXhwcmVzc2lvbihwZm1sUGFyc2VyKQorICogIC0gCisgc2VwOjpCRgorICAgICAgcGZtbFBhcnNlci0+Y29uZGl0aW9uYWxPckV4cHJlc3Npb24ocGZtbFBhcnNlcikKKyAqICAtIAorIHNlcDo6QkYKKyAgICAgIHBmbWxQYXJzZXItPmNvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbihwZm1sUGFyc2VyKQorICogIC0gCisgc2VwOjpCRgorICAgICAgcGZtbFBhcnNlci0+Yml0d2lzZU9yRXhwcmVzc2lvbihwZm1sUGFyc2VyKQorICogIC0gCisgc2VwOjpCRgorICAgICAgcGZtbFBhcnNlci0+Yml0d2lzZVhvckV4cHJlc3Npb24ocGZtbFBhcnNlcikKKyAqICAtIAorIHNlcDo6QkYKKyAgICAgIHBmbWxQYXJzZXItPmJpdHdpc2VBbmRFeHByZXNzaW9uKHBmbWxQYXJzZXIpCisgKiAgLSAKKyBzZXA6OkJGCisgICAgICBwZm1sUGFyc2VyLT5lcXVhbGl0eUV4cHJlc3Npb24ocGZtbFBhcnNlcikKKyAqICAtIAorIHNlcDo6T3BlcmF0b3IgKgorICAgICAgcGZtbFBhcnNlci0+ZXF1YWxPcChwZm1sUGFyc2VyKQorICogIC0gCisgc2VwOjpCRgorICAgICAgcGZtbFBhcnNlci0+cmVsYXRpb25hbEV4cHJlc3Npb24ocGZtbFBhcnNlcikKKyAqICAtIAorIHNlcDo6T3BlcmF0b3IgKgorICAgICAgcGZtbFBhcnNlci0+cmVsYXRpb25hbE9wKHBmbWxQYXJzZXIpCisgKiAgLSAKKyBzZXA6OkJGCisgICAgICBwZm1sUGFyc2VyLT5zaGlmdEV4cHJlc3Npb24ocGZtbFBhcnNlcikKKyAqICAtIAorIHNlcDo6T3BlcmF0b3IgKgorICAgICAgcGZtbFBhcnNlci0+c2hpZnRPcChwZm1sUGFyc2VyKQorICogIC0gCisgc2VwOjpCRgorICAgICAgcGZtbFBhcnNlci0+YWRkaXRpdmVFeHByZXNzaW9uKHBmbWxQYXJzZXIpCisgKiAgLSAKKyBzZXA6OkJGCisgICAgICBwZm1sUGFyc2VyLT5tdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24ocGZtbFBhcnNlcikKKyAqICAtIAorIHNlcDo6QkYKKyAgICAgIHBmbWxQYXJzZXItPnVuYXJ5RXhwcmVzc2lvbihwZm1sUGFyc2VyKQorICogIC0gCisgc2VwOjpCRkNvZGUKKyAgICAgIHBmbWxQYXJzZXItPmN0b3JFeHByZXNzaW9uKHBmbWxQYXJzZXIpCisgKiAgLSAKKyBzZXA6OkJGQ29kZQorICAgICAgcGZtbFBhcnNlci0+cXVvdGVfZXhwcmVzc2lvbihwZm1sUGFyc2VyKQorICogIC0gCisgc2VwOjpCRkNvZGUKKyAgICAgIHBmbWxQYXJzZXItPm1ldGFfZXZhbF9leHByZXNzaW9uKHBmbWxQYXJzZXIpCisgKiAgLSAKKyBzZXA6OkJGCisgICAgICBwZm1sUGFyc2VyLT5wcmltYXJ5KHBmbWxQYXJzZXIpCisgKiAgLSAKKyBzZXA6OkJGCisgICAgICBwZm1sUGFyc2VyLT5wcmltYXJ5X3VmaWQocGZtbFBhcnNlcikKKyAqICAtIAorIHNlcDo6QkYKKyAgICAgIHBmbWxQYXJzZXItPnByaW1hcnlfdWZpKHBmbWxQYXJzZXIpCisgKiAgLSAKKyBzZXA6OkJGCisgICAgICBwZm1sUGFyc2VyLT5wcmltYXJ5X2ludm9rZShwZm1sUGFyc2VyKQorICogIC0gCisgc2VwOjpCRgorICAgICAgcGZtbFBhcnNlci0+bGl0ZXJhbChwZm1sUGFyc2VyKQorICogIC0gCisgc2VwOjpCRgorICAgICAgcGZtbFBhcnNlci0+Y29sbGVjdGlvbl9vZl9leHByZXNzaW9uKHBmbWxQYXJzZXIpCisgKiAKKyAqIAorICogCisgKiAKKyAqIAorICogCisgKiAKKyAqIAorICogCisgKiAKKyAqIAorICogCisgKiAKKyAqIAorICogCisgKiAKKyAqIAorICogCisgKiAKKyAqIAorICogCisgKiAKKyAqIAorICogCisgKiAKKyAqIAorICogCisgKiAKKyAqIAorICogCisgKiAKKyAqIAorICogCisgKiAKKyAqIAorICogCisgKiAKKyAqIAorICogCisgKiAKKyAqIAorICogCisgKiAKKyAqIAorICogCisgKiAKKyAqIAorICogCisgKiAKKyAqIAorICogCisgKiAKKyAqIAorICogCisgKiAKKyAqIAorICogCisgKiAKKyAqIAorICogCisgKiAKKyAqIAorICogCisgKiAKKyAqIAorICogCisgKiAKKyAqIAorICogCisgKiAKKyAqIAorICogCisgKiAKKyAqIAorICogCisgKiAKKyAqIAorICogCisgKiAKKyAqIAorICogCisgKiAKKyAqIAorICogCisgKiAKKyAqIAorICogCisgKiAKKyAqIAorICogCisgKiAKKyAqIAorICogCisgKiAKKyAqIAorICogCisgKiAKKyAqIAorICogCisgKiAKKyAqIAorICogCisgKiAKKyAqIAorICogCisgKiAKKyAqIAorICogCisgKiAKKyAqIAorICogCisgKiAKKyAqIAorICogCisgKiAKKyAqIAorICogCisgKiAKKyAqCisgKiBUaGUgcmV0dXJuIHR5cGUgZm9yIGFueSBwYXJ0aWN1bGFyIHJ1bGUgaXMgb2YgY291cnNlIGRldGVybWluZWQgYnkgdGhlIHNvdXJjZQorICogZ3JhbW1hciBmaWxlLgorICovCisvLyBbVGhlICJCU0QgbGljZW5zZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBKaW0gSWRsZSwgVGVtcG9yYWwgV2F2ZSBMTEMKKy8vIGh0dHA6Ly93d3cudGVtcG9yYWwtd2F2ZS5jb20KKy8vIGh0dHA6Ly93d3cubGlua2VkaW4uY29tL2luL2ppbWlkbGUKKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYJX2ZtbFBhcnNlcl9ICisjZGVmaW5lIF9mbWxQYXJzZXJfSAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFN0YW5kYXJkIGFudGxyMyBDIHJ1bnRpbWUgZGVmaW5pdGlvbnMKKyAqLworI2luY2x1ZGUgICAgPGFudGxyMy5oPgorCisvKiBFbmQgb2Ygc3RhbmRhcmQgYW50bHIgMyBydW50aW1lIGRlZmluaXRpb25zCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8gRm9yd2FyZCBkZWNsYXJlIHRoZSBjb250ZXh0IHR5cGVkZWYgc28gdGhhdCB3ZSBjYW4gdXNlIGl0IGJlZm9yZSBpdCBpcworLy8gcHJvcGVybHkgZGVmaW5lZC4gRGVsZWdhdG9ycyBhbmQgZGVsZWdhdGVzIChmcm9tIGltcG9ydCBzdGF0ZW1lbnRzKSBhcmUKKy8vIGludGVyZGVwZW5kZW50IGFuZCB0aGVpciBjb250ZXh0IHN0cnVjdHVyZXMgY29udGFpbiBwb2ludGVycyB0byBlYWNoIG90aGVyCisvLyBDIG9ubHkgYWxsb3dzIHN1Y2ggdGhpbmdzIHRvIGJlIGRlY2xhcmVkIGlmIHlvdSBwcmUtZGVjbGFyZSB0aGUgdHlwZWRlZi4KKy8vCit0eXBlZGVmIHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCBmbWxQYXJzZXIsICogcGZtbFBhcnNlcjsKKworCisKKworI2luY2x1ZGUgPHBhcnNlci9tb2RlbC9QYXJzZXJVdGlsLmg+CisKKyNpbmNsdWRlIDxjb21tb24vQkYuaD4KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vQkZDb250YWluZXIuaD4KKworI2luY2x1ZGUgPGZtbC9jb21tb24vQmVoYXZpb3JhbEVsZW1lbnQuaD4KKyNpbmNsdWRlIDxmbWwvY29tbW9uL01vZGlmaWVyRWxlbWVudC5oPgorI2luY2x1ZGUgPGZtbC9jb21tb24vU3BlY2lmaWVyRWxlbWVudC5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZUxpYi5oPgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQXZtQ29kZS5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0J1aWx0aW5BcnJheS5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25Db25zdGFudC5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0V4cHJlc3Npb25Db25zdHJ1Y3Rvci5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL1N0YXRlbWVudENvbnN0cnVjdG9yLmg+CisKKyNpbmNsdWRlIDxmbWwvbGliL0lDb21Qb2ludC5oPgorCisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yLmg+CisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yTWFuYWdlci5oPgorCisjaW5jbHVkZSA8Zm1sL3RlbXBsYXRlL1RlbXBsYXRlRmFjdG9yeS5oPgorCisjaW5jbHVkZSA8Zm1sL3R5cGUvVHlwZVNwZWNpZmllci5oPgorCisjaW5jbHVkZSA8Zm1sL3R5cGUvVHlwZU1hbmFnZXIuaD4KKworI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9CdWZmZXIuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvQ2hhbm5lbC5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Db21Qb2ludC5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Db21Qcm90b2NvbC5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Db21Sb3V0ZS5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Db25uZWN0b3IuaD4KKworLy8gZXh0ZXJuICJDIiBhbmQgQysrIHRlbXBsYXRlIGluY29tcGF0aWJpbGl0eSAhISEKKy8vI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Qcm9wZXJ0eVBhcnQuaD4KKworI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9EYXRhVHlwZS5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9NYWNoaW5lLmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1BhY2thZ2UuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvUG9ydC5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Sb3V0aW5lLmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1N5c3RlbS5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9UcmFuc2l0aW9uLmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1ZhcmlhYmxlLmg+CisKKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvQmVoYXZpb3JhbFBhcnQuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvQ29tcG9zaXRlUGFydC5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9JbnN0YW5jZVNwZWNpZmllclBhcnQuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvSW50ZXJhY3Rpb25QYXJ0Lmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL01vZGVsT2ZDb21wdXRhdGlvblBhcnQuaD4KKworLy8gZXh0ZXJuICJDIiBhbmQgQysrIHRlbXBsYXRlIGluY29tcGF0aWJpbGl0eSAhISEKKy8vI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Qcm9wZXJ0eVBhcnQuaD4KKworI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9RdWVyeS5oPgorI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9VbmlGb3JtSWRlbnRpZmllci5oPgorI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9XT2JqZWN0Lmg+CisKKworLy92b2lkIGZtbERpc3BsYXlSZWNvZ25pdGlvbkVycm9yKAorLy8JCXBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlY29nbml6ZXIsIHBBTlRMUjNfVUlOVDggKiB0b2tlbk5hbWVzKTsKKworCisKKyNpZmRlZglBTlRMUjNfV0lORE9XUworLy8gRGlzYWJsZTogVW5yZWZlcmVuY2VkIHBhcmFtZXRlciwJCQkJCQkJLSBSdWxlcyB3aXRoIHBhcmFtZXRlcnMgdGhhdCBhcmUgbm90IHVzZWQKKy8vICAgICAgICAgIGNvbnN0YW50IGNvbmRpdGlvbmFsLAkJCQkJCQktIEFOVExSIHJlYWxpemVzIHRoYXQgYSBwcmVkaWN0aW9uIGlzIGFsd2F5cyB0cnVlIChzeW5wcmVkIHVzdWFsbHkpCisvLyAgICAgICAgICBpbml0aWFsaXplZCBidXQgdW51c2VkIHZhcmlhYmxlCQkJCQktIHRyZWUgcmV3cml0ZSB2YXJpYWJsZXMgZGVjbGFyZWQgYnV0IG5vdCBuZWVkZWQKKy8vICAgICAgICAgIFVucmVmZXJlbmNlZCBsb2NhbCB2YXJpYWJsZQkJCQkJCS0gbGV4ZXIgcnVsZSBkZWNsYXJlcyBidXQgZG9lcyBub3QgYWx3YXlzIHVzZSBfdHlwZQorLy8gICAgICAgICAgcG90ZW50aWFsbHkgdW5pdGlhbGl6ZWQgdmFyaWFibGUgdXNlZAkJCS0gcmV0dmFsIGFsd2F5cyByZXR1cm5lZCBmcm9tIGEgcnVsZQorLy8JCQl1bnJlZmVyZW5jZWQgbG9jYWwgZnVuY3Rpb24gaGFzIGJlZW4gcmVtb3ZlZAktIHN1c3VhbGx5IGdldFRva2VuTmFtZXMgb3IgZnJlZVNjb3BlLCB0aGV5IGNhbiBnbyB3aXRob3V0IHdhcm5pZ25zCisvLworLy8gVGhlc2UgYXJlIG9ubHkgcmVhbGx5IGRpc3BsYXllZCBhdCB3YXJuaW5nIGxldmVsIC9XNCBidXQgdGhhdCBpcyB0aGUgY29kZSBpZGVhbCBJIGFtIGFpbWluZyBhdAorLy8gYW5kIHRoZSBjb2RlZ2VuIG11c3QgZ2VuZXJhdGUgc29tZSBvZiB0aGVzZSB3YXJuaW5ncyBieSBuZWNlc3NpdHksIGFwYXJ0IGZyb20gNDEwMCwgd2hpY2ggaXMKKy8vIHVzdWFsbHkgZ2VuZXJhdGVkIHdoZW4gYSBwYXJzZXIgcnVsZSBpcyBnaXZlbiBhIHBhcmFtZXRlciB0aGF0IGl0IGRvZXMgbm90IHVzZS4gTW9zdGx5IHRob3VnaAorLy8gdGhpcyBpcyBhIG1hdHRlciBvZiBvcnRob2dvbmFsaXR5IGhlbmNlIEkgZGlzYWJsZSB0aGF0IG9uZS4KKy8vCisjcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0MTAwICkKKyNwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQxMDEgKQorI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDEyNyApCisjcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0MTg5ICkKKyNwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQ1MDUgKQorI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDcwMSApCisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09CisgKiBCQUNLVFJBQ0tJTkcgSVMgRU5BQkxFRAorICogPT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZm1sUGFyc2VyX3Byb2NlZHVyZV9tb2RpZmllcl9zcGVjaWZpZXJfcmV0dXJuX3N0cnVjdAoreworICAgIC8qKiBHZW5lcmljIHJldHVybiBlbGVtZW50cyBmb3IgQU5UTFIzIHJ1bGVzIHRoYXQgYXJlIG5vdCBpbiB0cmVlIHBhcnNlcnMgb3IgcmV0dXJuaW5nIHRyZWVzCisgICAgICovCisgICAgcEFOVExSM19DT01NT05fVE9LRU4gICAgc3RhcnQ7CisgICAgcEFOVExSM19DT01NT05fVE9LRU4gICAgc3RvcDsKKyAgICBzZXA6Ok1vZGlmaWVyIG1kZnI7CisgICAgc2VwOjpTcGVjaWZpZXIgc3BjZnI7Cit9CisgICAgZm1sUGFyc2VyX3Byb2NlZHVyZV9tb2RpZmllcl9zcGVjaWZpZXJfcmV0dXJuOworCisKKwordHlwZWRlZiBzdHJ1Y3QgZm1sUGFyc2VyX2V4ZWN1dGFibGVfbW9kaWZpZXJfc3BlY2lmaWVyX3JldHVybl9zdHJ1Y3QKK3sKKyAgICAvKiogR2VuZXJpYyByZXR1cm4gZWxlbWVudHMgZm9yIEFOVExSMyBydWxlcyB0aGF0IGFyZSBub3QgaW4gdHJlZSBwYXJzZXJzIG9yIHJldHVybmluZyB0cmVlcworICAgICAqLworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIHN0YXJ0OworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIHN0b3A7CisgICAgc2VwOjpNb2RpZmllciBtZGZyOworICAgIHNlcDo6U3BlY2lmaWVyIHNwY2ZyOworfQorICAgIGZtbFBhcnNlcl9leGVjdXRhYmxlX21vZGlmaWVyX3NwZWNpZmllcl9yZXR1cm47CisKKworCit0eXBlZGVmIHN0cnVjdCBmbWxQYXJzZXJfaW5zdGFuY2VfbW9kaWZpZXJfc3BlY2lmaWVyX3JldHVybl9zdHJ1Y3QKK3sKKyAgICAvKiogR2VuZXJpYyByZXR1cm4gZWxlbWVudHMgZm9yIEFOVExSMyBydWxlcyB0aGF0IGFyZSBub3QgaW4gdHJlZSBwYXJzZXJzIG9yIHJldHVybmluZyB0cmVlcworICAgICAqLworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIHN0YXJ0OworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIHN0b3A7CisgICAgc2VwOjpNb2RpZmllciBtZGZyOworICAgIHNlcDo6U3BlY2lmaWVyIHNwY2ZyOworfQorICAgIGZtbFBhcnNlcl9pbnN0YW5jZV9tb2RpZmllcl9zcGVjaWZpZXJfcmV0dXJuOworCisKKwordHlwZWRlZiBzdHJ1Y3QgZm1sUGFyc2VyX21vZGlmaWVyX3RyYW5zaXRpb25fcmV0dXJuX3N0cnVjdAoreworICAgIC8qKiBHZW5lcmljIHJldHVybiBlbGVtZW50cyBmb3IgQU5UTFIzIHJ1bGVzIHRoYXQgYXJlIG5vdCBpbiB0cmVlIHBhcnNlcnMgb3IgcmV0dXJuaW5nIHRyZWVzCisgICAgICovCisgICAgcEFOVExSM19DT01NT05fVE9LRU4gICAgc3RhcnQ7CisgICAgcEFOVExSM19DT01NT05fVE9LRU4gICAgc3RvcDsKKyAgICBzZXA6Ok1vZGlmaWVyIG1kZnI7CisgICAgc2VwOjpTcGVjaWZpZXIgc3BjZnI7Cit9CisgICAgZm1sUGFyc2VyX21vZGlmaWVyX3RyYW5zaXRpb25fcmV0dXJuOworCisKKwordHlwZWRlZiBzdHJ1Y3QgZm1sUGFyc2VyX3F1YWxpZmllZE5hbWVJRF9yZXR1cm5fc3RydWN0Cit7CisgICAgLyoqIEdlbmVyaWMgcmV0dXJuIGVsZW1lbnRzIGZvciBBTlRMUjMgcnVsZXMgdGhhdCBhcmUgbm90IGluIHRyZWUgcGFyc2VycyBvciByZXR1cm5pbmcgdHJlZXMKKyAgICAgKi8KKyAgICBwQU5UTFIzX0NPTU1PTl9UT0tFTiAgICBzdGFydDsKKyAgICBwQU5UTFIzX0NPTU1PTl9UT0tFTiAgICBzdG9wOworICAgIHN0ZDo6c3RyaW5nIHM7CisgICAgc2VwOjphdm1fc2l6ZV90IG5iOworfQorICAgIGZtbFBhcnNlcl9xdWFsaWZpZWROYW1lSURfcmV0dXJuOworCisKKwordHlwZWRlZiBzdHJ1Y3QgZm1sUGFyc2VyX2xhYmVsbGVkX2FyZ3VtZW50X3JldHVybl9zdHJ1Y3QKK3sKKyAgICAvKiogR2VuZXJpYyByZXR1cm4gZWxlbWVudHMgZm9yIEFOVExSMyBydWxlcyB0aGF0IGFyZSBub3QgaW4gdHJlZSBwYXJzZXJzIG9yIHJldHVybmluZyB0cmVlcworICAgICAqLworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIHN0YXJ0OworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIHN0b3A7CisgICAgc3RkOjpzdHJpbmcgbGFiZWw7CisgICAgc2VwOjpCRiBhcmc7Cit9CisgICAgZm1sUGFyc2VyX2xhYmVsbGVkX2FyZ3VtZW50X3JldHVybjsKKworCisKK3R5cGVkZWYgc3RydWN0IGZtbFBhcnNlcl9kZWZfYnVmZmVyX3JldHVybl9zdHJ1Y3QKK3sKKyAgICAvKiogR2VuZXJpYyByZXR1cm4gZWxlbWVudHMgZm9yIEFOVExSMyBydWxlcyB0aGF0IGFyZSBub3QgaW4gdHJlZSBwYXJzZXJzIG9yIHJldHVybmluZyB0cmVlcworICAgICAqLworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIHN0YXJ0OworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIHN0b3A7CisgICAgc2VwOjphdm1fdHlwZV9zcGVjaWZpZXJfa2luZF90IGtpbmQ7CisgICAgaW50IHNpemU7Cit9CisgICAgZm1sUGFyc2VyX2RlZl9idWZmZXJfcmV0dXJuOworCisKKwordHlwZWRlZiBzdHJ1Y3QgZm1sUGFyc2VyX3N0cmluZ19maWVsZF9zaXplX3JldHVybl9zdHJ1Y3QKK3sKKyAgICAvKiogR2VuZXJpYyByZXR1cm4gZWxlbWVudHMgZm9yIEFOVExSMyBydWxlcyB0aGF0IGFyZSBub3QgaW4gdHJlZSBwYXJzZXJzIG9yIHJldHVybmluZyB0cmVlcworICAgICAqLworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIHN0YXJ0OworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIHN0b3A7CisgICAgaW50IG1pbjsKKyAgICBpbnQgbWF4OworfQorICAgIGZtbFBhcnNlcl9zdHJpbmdfZmllbGRfc2l6ZV9yZXR1cm47CisKKworCit0eXBlZGVmIHN0cnVjdCBmbWxQYXJzZXJfcmFuZ2VfY29uc3RhbnRfcmV0dXJuX3N0cnVjdAoreworICAgIC8qKiBHZW5lcmljIHJldHVybiBlbGVtZW50cyBmb3IgQU5UTFIzIHJ1bGVzIHRoYXQgYXJlIG5vdCBpbiB0cmVlIHBhcnNlcnMgb3IgcmV0dXJuaW5nIHRyZWVzCisgICAgICovCisgICAgcEFOVExSM19DT01NT05fVE9LRU4gICAgc3RhcnQ7CisgICAgcEFOVExSM19DT01NT05fVE9LRU4gICAgc3RvcDsKKyAgICBpbnQgbWluOworICAgIGludCBtYXg7Cit9CisgICAgZm1sUGFyc2VyX3JhbmdlX2NvbnN0YW50X3JldHVybjsKKworCisKKworCisvKiogQ29udGV4dCB0cmFja2luZyBzdHJ1Y3R1cmUgZm9yIAorZm1sUGFyc2VyCisKKyAqLworc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0Cit7CisgICAgLyoqIEJ1aWx0IGluIEFOVExSMyBjb250ZXh0IHRyYWNrZXIgY29udGFpbnMgYWxsIHRoZSBnZW5lcmljIGVsZW1lbnRzCisgICAgICogIHJlcXVpcmVkIGZvciBjb250ZXh0IHRyYWNraW5nLgorICAgICAqLworICAgIHBBTlRMUjNfUEFSU0VSICAgcFBhcnNlcjsKKworICAgICBzZXA6OlN5c3RlbSAqCisgICAgICgqZm9ybWFsTUwpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6V09iamVjdE1hbmFnZXIgJiBhV09iamVjdE1hbmFnZXIpOworCisgICAgIHZvaWQKKyAgICAgKCpwcm9sb2d1ZV9mbWwpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCpwcm9sb2d1ZV9hdHRyaWJ1dGUpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCpwcm9sb2d1ZV9vcHRpb25zKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBzZXA6Ok1vZGlmaWVyCisgICAgICgqbW9kaWZpZXJfZGVjbGFyYXRpb24pCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHNlcDo6TW9kaWZpZXIKKyAgICAgKCptb2RpZmllcl9kaXJlY3Rpb24pCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHNlcDo6TW9kaWZpZXIKKyAgICAgKCptb2RpZmllcl9kaXJlY3Rpb25fdGV4dCkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm1vZGlmaWVyX3NldF9kaXJlY3Rpb25fc3RyaWN0X3RleHQpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6TW9kaWZpZXIgJiBtZGZyKTsKKworICAgICBzZXA6Ok1vZGlmaWVyCisgICAgICgqbW9kaWZpZXJfZGlyZWN0aW9uX3N5bWJvbCkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgc2VwOjpNb2RpZmllcgorICAgICAoKm1vZGlmaWVyX3BhcmFtKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBmbWxQYXJzZXJfcHJvY2VkdXJlX21vZGlmaWVyX3NwZWNpZmllcl9yZXR1cm4KKyAgICAgKCpwcm9jZWR1cmVfbW9kaWZpZXJfc3BlY2lmaWVyKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBmbWxQYXJzZXJfZXhlY3V0YWJsZV9tb2RpZmllcl9zcGVjaWZpZXJfcmV0dXJuCisgICAgICgqZXhlY3V0YWJsZV9tb2RpZmllcl9zcGVjaWZpZXIpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIGZtbFBhcnNlcl9pbnN0YW5jZV9tb2RpZmllcl9zcGVjaWZpZXJfcmV0dXJuCisgICAgICgqaW5zdGFuY2VfbW9kaWZpZXJfc3BlY2lmaWVyKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBmbWxQYXJzZXJfbW9kaWZpZXJfdHJhbnNpdGlvbl9yZXR1cm4KKyAgICAgKCptb2RpZmllcl90cmFuc2l0aW9uKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBzZXA6OlBhY2thZ2UgKgorICAgICAoKmRlZl9wYWNrYWdlKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBzZXA6OlN5c3RlbSAqCisgICAgICgqZGVmX3N5c3RlbSkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgZm1sUGFyc2VyX3F1YWxpZmllZE5hbWVJRF9yZXR1cm4KKyAgICAgKCpxdWFsaWZpZWROYW1lSUQpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHNlcDo6YXZtX3NpemVfdAorICAgICAoKmludGVnZXJfY29uc3RhbnQpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHNlcDo6YXZtX2Zsb2F0X3QKKyAgICAgKCpmbG9hdF9jb25zdGFudCkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKnNlY3Rpb25faGVhZGVyKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4LCBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIpOworCisgICAgIHZvaWQKKyAgICAgKCpzZWN0aW9uX2ltcG9ydCkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgc2VwOjpNYWNoaW5lICogY29udGFpbmVyKTsKKworICAgICB2b2lkCisgICAgICgqaW5jbHVkZV9wYWNrYWdlKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqc2VjdGlvbl9wcm9jZWR1cmUpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lcik7CisKKyAgICAgc2VwOjpNYWNoaW5lICoKKyAgICAgKCpkZWZfcHJvY2VkdXJlKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4LCBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIpOworCisgICAgIHZvaWQKKyAgICAgKCpkZWZfbWFjaGluZV9wYXJhbWV0ZXJzKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4LCBzZXA6Ok1hY2hpbmUgKiBtYWNoaW5lKTsKKworICAgICB2b2lkCisgICAgICgqZGVmX21hY2hpbmVfdmFyaWFibGVfcGFyYW1ldGVyX2F0b20pCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6UHJvcGVydHlQYXJ0ICYgcGFyYW1EZWNsLCBzZXA6Ok1vZGlmaWVyIG1kZnIsIHNlcDo6YXZtX29mZnNldF90IG9mZnNldCk7CisKKyAgICAgdm9pZAorICAgICAoKmRlZl9tYWNoaW5lX3JldHVybnMpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6TWFjaGluZSAqIG1hY2hpbmUsIHNlcDo6TW9kaWZpZXIgbWRmcik7CisKKyAgICAgdm9pZAorICAgICAoKmRlZl9tYWNoaW5lX3ZhcmlhYmxlX3JldHVybl9hdG9tKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4LCBzZXA6OlByb3BlcnR5UGFydCAmIHBhcmFtRGVjbCwgc2VwOjpNb2RpZmllciBtZGZyLCBzZXA6OmF2bV9vZmZzZXRfdCBvZmZzZXQpOworCisgICAgIHZvaWQKKyAgICAgKCpkZWZfYm9keV9wcm9jZWR1cmUpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6TWFjaGluZSAqIHByb2NlZHVyZSk7CisKKyAgICAgdm9pZAorICAgICAoKmRlZl9ib2R5X3Byb2NlZHVyZV9zZWN0aW9uKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4LCBzZXA6Ok1hY2hpbmUgKiBwcm9jZWR1cmUpOworCisgICAgIHZvaWQKKyAgICAgKCpkZWZfYm9keV9wcm9jZWR1cmVfc2ltcGxpZikJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgc2VwOjpNYWNoaW5lICogcHJvY2VkdXJlKTsKKworICAgICB2b2lkCisgICAgICgqc2VjdGlvbl9jb21wb3NpdGVfc3RydWN0dXJlKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4LCBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIpOworCisgICAgIHZvaWQKKyAgICAgKCpzZWN0aW9uX2NvbXBvc2l0ZV9nZW5lcmljKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4LCBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIpOworCisgICAgIHZvaWQKKyAgICAgKCpzZWN0aW9uX21hY2hpbmVfbW9kZWwpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lcik7CisKKyAgICAgdm9pZAorICAgICAoKnNlY3Rpb25fbWFjaGluZV9wcm90b3R5cGUpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lcik7CisKKyAgICAgdm9pZAorICAgICAoKnNlY3Rpb25fbWFjaGluZV9pbnN0YW5jZSkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgc2VwOjpNYWNoaW5lICogY29udGFpbmVyKTsKKworICAgICBzZXA6Ok1hY2hpbmUgKgorICAgICAoKmV4ZWN1dGFibGVfbWFjaGluZSkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgc2VwOjpNYWNoaW5lICogY29udGFpbmVyKTsKKworICAgICBzZXA6Ok1hY2hpbmUgKgorICAgICAoKmV4ZWN1dGFibGVfbW9kZWxfZGVmaW5pdG9uKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4LCBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIsIHNlcDo6TW9kaWZpZXIgbWRmciwgc2VwOjpTcGVjaWZpZXIgc3BjZnIpOworCisgICAgIHNlcDo6TWFjaGluZSAqCisgICAgICgqZXhlY3V0YWJsZV9pbnN0YW5jZV9kZWZpbml0b24pCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lcik7CisKKyAgICAgc2VwOjpNYWNoaW5lICoKKyAgICAgKCpkZWNsX2luc3RhbmNlKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4LCBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIsIHNlcDo6TW9kaWZpZXIgbWRmciwgc2VwOjpTcGVjaWZpZXIgc3BjZnIpOworCisgICAgIHZvaWQKKyAgICAgKCpkZWZfaW5zdGFuY2Vfb25fbmV3X2FjdGl2aXR5KQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4LCBzZXA6Ok1hY2hpbmUgKiBpbnN0YW5jZSk7CisKKyAgICAgdm9pZAorICAgICAoKmRlZl9pbnN0YW5jZV9vbl9uZXdfYWN0aXZpdHlfcGFyYW1ldGVyKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4LCBzZXA6Ok1hY2hpbmUgKiBpbnN0YW5jZSwgc2VwOjphdm1fc2l6ZV90IHBvc2l0aW9uKTsKKworICAgICBzZXA6Ok9wZXJhdG9yICoKKyAgICAgKCpvcF9hc3NpZ25fcGFyYW0pCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCpkZWZfaW5zdGFuY2VfYWN0aXZpdHkpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6TWFjaGluZSAqIGluc3RhbmNlKTsKKworICAgICB2b2lkCisgICAgICgqc2VjdGlvbl9iZWhhdmlvcikJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgc2VwOjpNYWNoaW5lICogY29udGFpbmVyKTsKKworICAgICB2b2lkCisgICAgICgqZGVmX2luc3RhbmNlX2NvdW50KQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4LCBzZXA6OmF2bV9zaXplX3QgJiBpbml0aWFsLCBzZXA6OmF2bV9zaXplX3QgJiBtYXhpbWFsKTsKKworICAgICB2b2lkCisgICAgICgqZGVmX2luc3RhbmNlX2NvdW50X2F0b20pCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6YXZtX3NpemVfdCAmIGluaXRpYWwsIHNlcDo6YXZtX3NpemVfdCAmIG1heGltYWwpOworCisgICAgIHNlcDo6TWFjaGluZSAqCisgICAgICgqZGVmX21hY2hpbmUpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lciwgc2VwOjpNb2RpZmllciBtZGZyLCBzZXA6OlNwZWNpZmllciBzcGNmcik7CisKKyAgICAgdm9pZAorICAgICAoKmRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9oZWFkZXJfcHJlZGljYXQpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCpkZWZfYm9keV9tYWNoaW5lX3VzaW5nX3NlY3Rpb25faW1wb3J0X3ByZWRpY2F0KQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqZGVmX2JvZHlfbWFjaGluZV91c2luZ19zZWN0aW9uX3BhcmFtZXRlcl9wcmVkaWNhdCkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKmRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcm9wZXJ0eV9wcmVkaWNhdCkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKmRlZl9ib2R5X21hY2hpbmVfdXNpbmdfc2VjdGlvbl9wcmVkaWNhdCkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKmRlZl9ib2R5X21hY2hpbmUpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6TWFjaGluZSAqIG1hY2hpbmUpOworCisgICAgIHZvaWQKKyAgICAgKCpkZWZfYm9keV9tYWNoaW5lX3NlY3Rpb24pCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6TWFjaGluZSAqIG1hY2hpbmUpOworCisgICAgIHZvaWQKKyAgICAgKCpkZWZfYm9keV9tYWNoaW5lX3NpbXBsaWYpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6TWFjaGluZSAqIG1hY2hpbmUpOworCisgICAgIHNlcDo6TWFjaGluZSAqCisgICAgICgqYW55X2RlZl9zdGF0ZW1hY2hpbmUpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lciwgc2VwOjpNb2RpZmllciBtZGZyLCBzZXA6OlNwZWNpZmllciBzcGNmcik7CisKKyAgICAgc2VwOjpNYWNoaW5lICoKKyAgICAgKCpkZWZfc3RhdGVtYWNoaW5lKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4LCBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIsIHNlcDo6TW9kaWZpZXIgbWRmciwgc2VwOjpTcGVjaWZpZXIgc3BjZnIpOworCisgICAgIHZvaWQKKyAgICAgKCpkZWZfYm9keV9zdGF0ZW1hY2hpbmUpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6TWFjaGluZSAqIG1hY2hpbmUpOworCisgICAgIHZvaWQKKyAgICAgKCpzZWN0aW9uX3JlZ2lvbikJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgc2VwOjpNYWNoaW5lICogY29udGFpbmVyKTsKKworICAgICB2b2lkCisgICAgICgqc2VjdGlvbl9zdGF0ZW1hY2hpbmUpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lcik7CisKKyAgICAgc2VwOjpNYWNoaW5lICoKKyAgICAgKCpkZWZfc3RhdGUpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lciwgc2VwOjpNb2RpZmllciBtZGZyLCBzZXA6OlNwZWNpZmllciBzcGNmcik7CisKKyAgICAgc3RkOjpzdHJpbmcKKyAgICAgKCpzdGF0ZV9rd19pZCkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgc3RkOjpzdHJpbmcKKyAgICAgKCpzdGF0ZV9pZCkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgc2VwOjpNYWNoaW5lICoKKyAgICAgKCpkZWZfc3RhdGVfc2luZ2xldG9uKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4LCBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIsIHNlcDo6TW9kaWZpZXIgbWRmciwgc2VwOjpTcGVjaWZpZXIgc3BjZnIpOworCisgICAgIHZvaWQKKyAgICAgKCpleGVjdXRhYmxlX3NwZWNpZmllcikJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgc2VwOjpTcGVjaWZpZXIgJiBzcGNmcik7CisKKyAgICAgdm9pZAorICAgICAoKmV4ZWN1dGFibGVfc3BlY2lmaWVyX2F0b20pCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6U3BlY2lmaWVyICYgc3BjZnIpOworCisgICAgIHNlcDo6QkYKKyAgICAgKCppbnN0YW5jZV9tYWNoaW5lX21vZGVsKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqZGVmX2JvZHlfc3RhdGUpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6TWFjaGluZSAqIHN0YXRlKTsKKworICAgICB2b2lkCisgICAgICgqZGVmX2JvZHlfc3RhdGVfc2VjdGlvbikJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgc2VwOjpNYWNoaW5lICogbWFjaGluZSk7CisKKyAgICAgdm9pZAorICAgICAoKmRlZl9ib2R5X3N0YXRlX3NpbXBsaWYpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6TWFjaGluZSAqIHN0YXRlKTsKKworICAgICB2b2lkCisgICAgICgqc2VjdGlvbl90cmFuc2l0aW9uKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4LCBzZXA6Ok1hY2hpbmUgKiBzdGF0ZSk7CisKKyAgICAgdm9pZAorICAgICAoKmRlZl90cmFuc2l0aW9uKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4LCBzZXA6Ok1hY2hpbmUgKiBzdGF0ZSwgc2VwOjpNb2RpZmllciBtZGZyLCBzZXA6OlNwZWNpZmllciBzcGNmcik7CisKKyAgICAgc2VwOjpUcmFuc2l0aW9uOjpNT0NfS0lORAorICAgICAoKmtpbmRfdHJhbnNpdGlvbikJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgc2VwOjpUcmFuc2l0aW9uOjptb2Nfa2luZF90CisgICAgICgqbW9jX3RyYW5zaXRpb25fYXR0cmlidXRlKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqbW9jX3RyYW5zaXRpb24pCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6VHJhbnNpdGlvbiAqIHRyYW5zKTsKKworICAgICB2b2lkCisgICAgICgqbW9jX3RyYW5zaXRpb25fYXRvbSkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgc2VwOjpUcmFuc2l0aW9uICogdHJhbnMpOworCisgICAgIHZvaWQKKyAgICAgKCptb2VfdHJhbnNpdGlvbikJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgc2VwOjpUcmFuc2l0aW9uICogdHJhbnMpOworCisgICAgIHNlcDo6QkZDb2RlCisgICAgICgqdHJhbnNpdGlvbl9zdGF0ZW1lbnQpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCp0cmFuc2l0aW9uX3RyaWdnZXIpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6QkZDb2RlICYgYWMpOworCisgICAgIHZvaWQKKyAgICAgKCp0cmFuc2l0aW9uX2d1YXJkKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4LCBzZXA6OkJGQ29kZSAmIGFjKTsKKworICAgICB2b2lkCisgICAgICgqdHJhbnNpdGlvbl90aW1lZF9ndWFyZCkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgc2VwOjpCRkNvZGUgJiBhYyk7CisKKyAgICAgdm9pZAorICAgICAoKnRyYW5zaXRpb25fZWZmZWN0KQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4LCBzZXA6OkJGQ29kZSAmIGFjKTsKKworICAgICBzZXA6OkJGCisgICAgICgqdGFyZ2V0X3N0YXRlX2lkKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBzdGQ6OnN0cmluZworICAgICAoKnRhcmdldF9zdGF0ZV9rd19pZCkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKmRlZl9zdGF0ZV9hY3Rpdml0eSkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgc2VwOjpNYWNoaW5lICogc3RhdGUpOworCisgICAgIHZvaWQKKyAgICAgKCpzZWN0aW9uX2hlYWRlcl9pbXBvcnRfcGFyYW1ldGVyX3Byb3BlcnR5KQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4LCBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIpOworCisgICAgIHZvaWQKKyAgICAgKCpzZWN0aW9uX3BhcmFtZXRlcikJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgc2VwOjpNYWNoaW5lICogY29udGFpbmVyKTsKKworICAgICB2b2lkCisgICAgICgqc2VjdGlvbl9wcm9wZXJ0eSkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgc2VwOjpNYWNoaW5lICogY29udGFpbmVyKTsKKworICAgICB2b2lkCisgICAgICgqc2VjdGlvbl9wcm9wZXJ0eV9mcmVlX2RlY2xhcmF0aW9uKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4LCBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIpOworCisgICAgIHZvaWQKKyAgICAgKCpwcm9wZXJ0eV9kZWNsYXJhdGlvbikJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHksIHNlcDo6TW9kaWZpZXIgbWRmcik7CisKKyAgICAgdm9pZAorICAgICAoKmRlY2xfcHJvcGVydHlfZWxlbWVudCkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHksIHNlcDo6TW9kaWZpZXIgbWRmcik7CisKKyAgICAgZm1sUGFyc2VyX2xhYmVsbGVkX2FyZ3VtZW50X3JldHVybgorICAgICAoKmxhYmVsbGVkX2FyZ3VtZW50KQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICB2b2lkCisgICAgICgqZGVjbF9pbnN0YW5jZV9tYWNoaW5lX3BhcmFtcykJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgc2VwOjpNYWNoaW5lICogbWFjaGluZSk7CisKKyAgICAgdm9pZAorICAgICAoKmRlY2xfaW5zdGFuY2VfbWFjaGluZV9yZXR1cm5zKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4LCBzZXA6Ok1hY2hpbmUgKiBtYWNoaW5lKTsKKworICAgICB2b2lkCisgICAgICgqYWN0aXZpdHlfbWFjaGluZV9wYXJhbV9yZXR1cm4pCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIGNvbnN0IHNlcDo6QkYgJiBhcmdNYWNoaW5lLCBzZXA6OkJGQ29kZSAmIGFjKTsKKworICAgICB2b2lkCisgICAgICgqZGVjbF9wb3J0KQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4LCBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSwgc2VwOjpNb2RpZmllciBtZGZyKTsKKworICAgICB2b2lkCisgICAgICgqZGVjbF9wb3J0X2ltcGwpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5LCBzZXA6Ok1vZGlmaWVyIG1kZnIsIHNlcDo6SUNvbVBvaW50OjpFTlVNX0lPX05BVFVSRSBuYXR1cmUpOworCisgICAgIHZvaWQKKyAgICAgKCpkZWNsX3NpZ25hbCkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHksIHNlcDo6TW9kaWZpZXIgbWRmcik7CisKKyAgICAgdm9pZAorICAgICAoKmRlY2xfc2lnbmFsX2ltcGwpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5LCBzZXA6Ok1vZGlmaWVyIG1kZnIsIHNlcDo6SUNvbVBvaW50OjpFTlVNX0lPX05BVFVSRSBuYXR1cmUpOworCisgICAgIHZvaWQKKyAgICAgKCp0eXBlX3BhcmFtX2NvbSkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgc2VwOjpQb3J0ICogcG9ydCk7CisKKyAgICAgdm9pZAorICAgICAoKnBhcmFtX2NvbV9hdG9tKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4LCBzZXA6OlBvcnQgKiBwb3J0LCBzZXA6OmF2bV9vZmZzZXRfdCBvZmZzZXQpOworCisgICAgIHZvaWQKKyAgICAgKCpkZWNsX2J1ZmZlcikJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHksIHNlcDo6TW9kaWZpZXIgbWRmcik7CisKKyAgICAgdm9pZAorICAgICAoKmRlY2xfYnVmZmVyX2ltcGwpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5LCBzZXA6Ok1vZGlmaWVyIG1kZnIpOworCisgICAgIGZtbFBhcnNlcl9kZWZfYnVmZmVyX3JldHVybgorICAgICAoKmRlZl9idWZmZXIpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHNlcDo6YXZtX3R5cGVfc3BlY2lmaWVyX2tpbmRfdAorICAgICAoKnBvbGljeV9idWZmZXIpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHNlcDo6QkYKKyAgICAgKCpyZWZfYnVmZmVyKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4LCBzZXA6Ok1hY2hpbmUgKiBtYWNoaW5lKTsKKworICAgICB2b2lkCisgICAgICgqaW5pdGlhbF9idWZmZXJfY29udGVudHMpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIGNvbnN0IHNlcDo6QnVmZmVyICogYnVmZmVyKTsKKworICAgICB2b2lkCisgICAgICgqZGVjbF9jaGFubmVsKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4LCBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSwgc2VwOjpNb2RpZmllciBtZGZyKTsKKworICAgICB2b2lkCisgICAgICgqZGVjbF9jaGFubmVsX3BvcnQpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5LCBzZXA6Ok1vZGlmaWVyIG1kZnIpOworCisgICAgIHZvaWQKKyAgICAgKCpkZWNsX2NoYW5uZWxfdmFyKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4LCBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSwgc2VwOjpNb2RpZmllciBtZGZyKTsKKworICAgICB2b2lkCisgICAgICgqZGVjbF92YXJpYWJsZSkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHksIHNlcDo6TW9kaWZpZXIgbWRmcik7CisKKyAgICAgdm9pZAorICAgICAoKmRlY2xfdmFyaWFibGVfdGltZV9jbG9ja19pbXBsKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4LCBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSwgc2VwOjpNb2RpZmllciBtZGZyKTsKKworICAgICB2b2lkCisgICAgICgqZGVjbF92YXJpYWJsZV9pbXBsKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4LCBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSwgc2VwOjpNb2RpZmllciBtZGZyKTsKKworICAgICB2b2lkCisgICAgICgqZGVjbF92YXJpYWJsZV9hdG9tX2ltcGwpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5LCBzZXA6Ok1vZGlmaWVyIG1kZnIpOworCisgICAgIHZvaWQKKyAgICAgKCpkZWNsX3R5cGVkX3ZhcmlhYmxlX2F0b21faW1wbCkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHksIHNlcDo6TW9kaWZpZXIgbWRmciwgY29uc3Qgc2VwOjpCRiAmIHR5cGUpOworCisgICAgIHNlcDo6QkYKKyAgICAgKCppbml0aWFsX3ZhbHVlKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBzZXA6OkJGCisgICAgICgqdHlwZV92YXIpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHNlcDo6QkYKKyAgICAgKCpkZWZfdHlwZV9hcnJheSkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgc2VwOjpCRiBiYXNlVCwgY29uc3Qgc3RkOjpzdHJpbmcgJiB0aWQpOworCisgICAgIGludAorICAgICAoKmRlZl90eXBlX2FycmF5X3NpemUpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHNlcDo6QkYKKyAgICAgKCpkZWZfdHlwZV9jb250YWluZXIpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIGNvbnN0IHN0ZDo6c3RyaW5nICYgdGlkKTsKKworICAgICBzZXA6OmF2bV90eXBlX3NwZWNpZmllcl9raW5kX3QKKyAgICAgKCpzcGVjaWZpZXJfYnVmZmVyKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBzZXA6OkJGCisgICAgICgqZGVmX3R5cGVfaW50ZXJ2YWwpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIGNvbnN0IHN0ZDo6c3RyaW5nICYgdGlkKTsKKworICAgICBzZXA6OkJGCisgICAgICgqYmFzZV90eXBlX3ZhcikJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgc2VwOjpUeXBlU3BlY2lmaWVyCisgICAgICgqcHJpbWl0aXZlX3R5cGUpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIGludAorICAgICAoKmJpdF9maWVsZF9zaXplKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBmbWxQYXJzZXJfc3RyaW5nX2ZpZWxkX3NpemVfcmV0dXJuCisgICAgICgqc3RyaW5nX2ZpZWxkX3NpemUpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIGZtbFBhcnNlcl9yYW5nZV9jb25zdGFudF9yZXR1cm4KKyAgICAgKCpyYW5nZV9jb25zdGFudCkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKm9uX3dyaXRlX3Zhcl9yb3V0aW5lX2RlZikJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgc2VwOjpWYXJpYWJsZSAqIHZhcik7CisKKyAgICAgdm9pZAorICAgICAoKnZhcl9yb3V0aW5lX2RlZikJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgc2VwOjpWYXJpYWJsZSAqIHZhcik7CisKKyAgICAgdm9pZAorICAgICAoKnJvdXRpbmVfc2luZ2xlX3BhcmFtKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4LCBzZXA6OlJvdXRpbmUgJiByb3V0aW5lLCBjb25zdCBzZXA6OkJGICYgZGZ0VHlwZSk7CisKKyAgICAgdm9pZAorICAgICAoKmRlZl9lbnVtKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4LCBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSwgc2VwOjpNb2RpZmllciBtZGZyKTsKKworICAgICB2b2lkCisgICAgICgqZGVmX2VudW1faW1wbCkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHksIHNlcDo6TW9kaWZpZXIgbWRmciwgY29uc3Qgc3RkOjpzdHJpbmcgJiB0aWQpOworCisgICAgIHZvaWQKKyAgICAgKCpkZWZfc3RydWN0KQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4LCBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSwgc2VwOjpNb2RpZmllciBtZGZyKTsKKworICAgICB2b2lkCisgICAgICgqZGVmX2NsYXNzX3N0cnVjdHVyZV9pbXBsKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4LCBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSwgc2VwOjpNb2RpZmllciBtZGZyLCBjb25zdCBzdGQ6OnN0cmluZyAmIHRpZCk7CisKKyAgICAgdm9pZAorICAgICAoKmRlZl9jaG9pY2UpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5LCBzZXA6Ok1vZGlmaWVyIG1kZnIpOworCisgICAgIHZvaWQKKyAgICAgKCpkZWZfY2hvaWNlX2ltcGwpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5LCBzZXA6Ok1vZGlmaWVyIG1kZnIsIGNvbnN0IHN0ZDo6c3RyaW5nICYgdGlkKTsKKworICAgICB2b2lkCisgICAgICgqZGVmX3VuaW9uKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4LCBzZXA6OlByb3BlcnR5UGFydCAmIGRlY2xQcm9wZXJ0eSwgc2VwOjpNb2RpZmllciBtZGZyKTsKKworICAgICB2b2lkCisgICAgICgqZGVmX3VuaW9uX2ltcGwpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5LCBzZXA6Ok1vZGlmaWVyIG1kZnIsIGNvbnN0IHN0ZDo6c3RyaW5nICYgdGlkKTsKKworICAgICB2b2lkCisgICAgICgqZGVmX21ldGhvZCkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHkpOworCisgICAgIHZvaWQKKyAgICAgKCpkZWNsX3BhcmFtZXRlcnMpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCpkZWZfdHlwZSkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgc2VwOjpQcm9wZXJ0eVBhcnQgJiBkZWNsUHJvcGVydHksIHNlcDo6TW9kaWZpZXIgbWRmcik7CisKKyAgICAgdm9pZAorICAgICAoKmRlZl90eXBlX2ltcGwpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5LCBzZXA6Ok1vZGlmaWVyIG1kZnIpOworCisgICAgIHZvaWQKKyAgICAgKCpkZWZfdHlwZV9hdG9tX2ltcGwpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6UHJvcGVydHlQYXJ0ICYgZGVjbFByb3BlcnR5LCBzZXA6Ok1vZGlmaWVyIG1kZnIpOworCisgICAgIHZvaWQKKyAgICAgKCpkZWZfdHlwZWRlZl9jb25zdHJhaW50KQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4LCBzZXA6OkRhdGFUeXBlICogYWxpYXNUKTsKKworICAgICBzZXA6OlR5cGVTcGVjaWZpZXIKKyAgICAgKCp0aW1lX3R5cGUpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHNlcDo6VHlwZVNwZWNpZmllcgorICAgICAoKnRpbWVfY2xvY2tfdHlwZSkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgc2VwOjpUeXBlU3BlY2lmaWVyCisgICAgICgqdGltZV90eXBlX2RvbWFpbikJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKnNlY3Rpb25fbW9kZWxfb2ZfY29tcHV0YXRpb24pCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lcik7CisKKyAgICAgdm9pZAorICAgICAoKnNlY3Rpb25fcm91dGluZSkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgc2VwOjpNYWNoaW5lICogY29udGFpbmVyKTsKKworICAgICB2b2lkCisgICAgICgqZGVmX3JvdXRpbmVfbW9kZWwpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lciwgc2VwOjpNb2RpZmllciBtZGZyLCBzZXA6OlNwZWNpZmllciBzcGNmcik7CisKKyAgICAgdm9pZAorICAgICAoKmRlZl9yb3V0aW5lX21vZGVsX2ltcGwpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6TWFjaGluZSAqIGNvbnRhaW5lciwgc2VwOjpNb2RpZmllciBtZGZyLCBzZXA6OlNwZWNpZmllciBzcGNmcik7CisKKyAgICAgdm9pZAorICAgICAoKmRlZl9yb3V0aW5lX3BhcmFtZXRlcnMpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6Um91dGluZSAmIHJvdXRpbmUpOworCisgICAgIHZvaWQKKyAgICAgKCpkZWZfcm91dGluZV9wYXJhbV9hdG9tKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4LCBzZXA6OlJvdXRpbmUgJiByb3V0aW5lLCBzZXA6OmF2bV9zaXplX3Qgb2Zmc2V0KTsKKworICAgICB2b2lkCisgICAgICgqZGVmX3JvdXRpbmVfcmV0dXJucykJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgc2VwOjpSb3V0aW5lICYgcm91dGluZSk7CisKKyAgICAgdm9pZAorICAgICAoKmRlZl9yb3V0aW5lX3JldHVybnNfYXRvbSkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgc2VwOjpSb3V0aW5lICYgcm91dGluZSwgc2VwOjphdm1fc2l6ZV90IG9mZnNldCk7CisKKyAgICAgdm9pZAorICAgICAoKnNlY3Rpb25fbW9kZWxfb2ZfZXhlY3V0aW9uKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4LCBzZXA6Ok1hY2hpbmUgKiBjb250YWluZXIpOworCisgICAgIHZvaWQKKyAgICAgKCpkZWZfbW9lX3ByaW1pdGl2ZSkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgc2VwOjpNYWNoaW5lICogY29udGFpbmVyKTsKKworICAgICB2b2lkCisgICAgICgqZGVmX3JvdXRpbmVfc2VxKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4LCBzZXA6OlJvdXRpbmUgJiByb3V0aW5lKTsKKworICAgICB2b2lkCisgICAgICgqc2VjdGlvbl9tb2RlbF9vZl9pbnRlcmFjdGlvbikJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgc2VwOjpNYWNoaW5lICogbWFjaGluZSk7CisKKyAgICAgdm9pZAorICAgICAoKmNvbV9wcm90b2NvbCkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgc2VwOjpNYWNoaW5lICogbWFjaGluZSwgc2VwOjpDb21Qcm90b2NvbCAqIGNwKTsKKworICAgICB2b2lkCisgICAgICgqY29tX2Nhc3QpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6Q29tUHJvdG9jb2wgKiBjcCk7CisKKyAgICAgc2VwOjpCRgorICAgICAoKmJ1ZmZlcl9jb20pCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6TWFjaGluZSAqIG1hY2hpbmUpOworCisgICAgIHZvaWQKKyAgICAgKCpjb21fY29ubmVjdCkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgc2VwOjpNYWNoaW5lICogbWFjaGluZSwgc2VwOjpJbnRlcmFjdGlvblBhcnQgKiBhbkludGVyYWN0aW9uKTsKKworICAgICB2b2lkCisgICAgICgqY29tX3JvdXRlKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4LCBzZXA6Ok1hY2hpbmUgKiBtYWNoaW5lLCBzZXA6OkNvbm5lY3RvciAqIGFDb25uZWN0b3IpOworCisgICAgIHZvaWQKKyAgICAgKCpjb21fcG9ydCkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgc2VwOjpNYWNoaW5lICogbWFjaGluZSwgc2VwOjpDb21Sb3V0ZSAqIGNvbVJvdXRlKTsKKworICAgICBzZXA6OkJGCisgICAgICgqY29tX3BvcnRfaWQpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6TWFjaGluZSAqIG1hY2hpbmUsIHNlcDo6TWFjaGluZSAqIGNvbU1hY2hpbmUpOworCisgICAgIHNlcDo6QkZDb2RlCisgICAgICgqc3RhdGVtZW50KQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBzZXA6OkJGQ29kZQorICAgICAoKmJsb2NrX3N0YXRlbWVudCkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgc2VwOjpPcGVyYXRvciAqCisgICAgICgqb3BfYmxvY2spCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHNlcDo6T3BlcmF0b3IgKgorICAgICAoKm9wX3NlcXVlbmNlKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBzZXA6Ok9wZXJhdG9yICoKKyAgICAgKCpvcF9zY2hlZHVsaW5nKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBzZXA6Ok9wZXJhdG9yICoKKyAgICAgKCpvcF9jb25jdXJyZW5jeSkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgc2VwOjpPcGVyYXRvciAqCisgICAgICgqb3BfaW52b2thYmxlKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBzZXA6OkJGQ29kZQorICAgICAoKnByZWZpeF9zdGF0ZW1lbnQpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHNlcDo6QkZDb2RlCisgICAgICgqcHJlZml4X2V4cHJlc3Npb24pCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHNlcDo6T3BlcmF0b3IgKgorICAgICAoKmF2bV9vcGVyYXRvcikJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgc2VwOjpCRkNvZGUKKyAgICAgKCpzdGF0ZW1lbnRfaW52b2tlX21ldGhvZCkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgc2VwOjpCRkNvZGUKKyAgICAgKCpzdGF0ZW1lbnRfaW52b2tlKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBzZXA6OkJGQ29kZQorICAgICAoKmV4cHJlc3Npb25faW52b2tlKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBzZXA6OkJGQ29kZQorICAgICAoKnN0YXRlbWVudF9hY3Rpdml0eV9uZXcpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCpkZWNsX2luc3RhbmNlX2R5bmFtaWNfaW1wbCkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgc2VwOjpNYWNoaW5lICogY29udGFpbmVyLCBzZXA6Ok1hY2hpbmUgKiBwdHJJbnN0YW5jZSk7CisKKyAgICAgc2VwOjpCRkNvZGUKKyAgICAgKCpleHByZXNzaW9uX2FjdGl2aXR5X25ldykJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgc2VwOjpCRkNvZGUKKyAgICAgKCpzdGF0ZW1lbnRfcHJvbXB0KQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBzZXA6OkJGQ29kZQorICAgICAoKnN0YXRlbWVudF9wcm9tcHRfaW1wbCkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgc2VwOjpCRkNvZGUKKyAgICAgKCpzdGF0ZW1lbnRfcHJvbXB0X29icykJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgc2VwOjpCRkNvZGUKKyAgICAgKCpzdGF0ZW1lbnRfcHJvbXB0X29ic19jb20pCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIGNvbnN0IHNlcDo6QkYgJiB2YXJNYWNoaW5lKTsKKworICAgICBzZXA6OkJGQ29kZQorICAgICAoKm1ldGFfc3RhdGVtZW50KQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBzZXA6OkJGQ29kZQorICAgICAoKnN0YXRlbWVudF9hc3NpZ24pCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHNlcDo6QkYKKyAgICAgKCpsdmFsdWUpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHZvaWQKKyAgICAgKCpwYXJhbWV0ZXJzKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4LCBjb25zdCBzZXA6OkJGQ29kZSAmIGFjKTsKKworICAgICBzZXA6OkJGQ29kZQorICAgICAoKnN0YXRlbWVudF9jb20pCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHNlcDo6QkZDb2RlCisgICAgICgqc3RhdGVtZW50X2NvbV9pbnB1dCkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgc2VwOjpCRkNvZGUKKyAgICAgKCpzdGF0ZW1lbnRfY29tX291dHB1dCkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKnBhcmFtZXRlcnNfcG9ydCkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgc2VwOjpQb3J0ICogcG9ydCwgY29uc3Qgc2VwOjpCRkNvZGUgJiBhYyk7CisKKyAgICAgc2VwOjpCRkNvZGUKKyAgICAgKCpleHByZXNzaW9uX2NvbSkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgc2VwOjpCRkNvZGUKKyAgICAgKCpzdGF0ZW1lbnRfY29uc3RyYWludCkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgc2VwOjpCRkNvZGUKKyAgICAgKCpzdGF0ZW1lbnRfZ3VhcmQpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHNlcDo6QkZDb2RlCisgICAgICgqc3RhdGVtZW50X3RpbWVkX2d1YXJkKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBzZXA6OkJGQ29kZQorICAgICAoKnN0YXRlbWVudF9jaGVja3NhdCkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgc2VwOjpCRkNvZGUKKyAgICAgKCpleHByZXNzaW9uX2d1YXJkKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBzZXA6OkJGQ29kZQorICAgICAoKnN0YXRlbWVudF9pdGUpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHNlcDo6QkZDb2RlCisgICAgICgqZXhwcmVzc2lvbl9pdGUpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHNlcDo6QkZDb2RlCisgICAgICgqc3RhdGVtZW50X2l0ZXJhdGlvbikJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgc2VwOjpCRkNvZGUKKyAgICAgKCpmb3JfYXNzaWduX2hlYWRlcikJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgc2VwOjpCRkNvZGUKKyAgICAgKCpzdGF0ZW1lbnRfanVtcCkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgc2VwOjpCRkNvZGUKKyAgICAgKCpleHByZXNzaW9uX2xhbWJkYSkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgc2VwOjpCRkNvZGUKKyAgICAgKCpleHByZXNzaW9uX3N0YXR1cykJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgc2VwOjpPcGVyYXRvciAqCisgICAgICgqb3BfYWN0aXZpdHkpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHNlcDo6QkZDb2RlCisgICAgICgqc3RhdGVtZW50X2FjdGl2aXR5KQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBzZXA6OkJGQ29kZQorICAgICAoKnN0YXRlbWVudF9pbml0X2Zsb3cpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIGNvbnN0IHNlcDo6QkYgJiBmbG93VGFyZ2V0KTsKKworICAgICBzZXA6OkJGQ29kZQorICAgICAoKnN0YXRlbWVudF9pbnZva2Vfcm91dGluZSkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgdm9pZAorICAgICAoKmludm9rZV9yb3V0aW5lX3BhcmFtcykJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgc2VwOjpSb3V0aW5lICogaW52b2tlUm91dGluZSk7CisKKyAgICAgdm9pZAorICAgICAoKmludm9rZV9yb3V0aW5lX3JldHVybnMpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgsIHNlcDo6Um91dGluZSAqIGludm9rZVJvdXRpbmUpOworCisgICAgIHNlcDo6QkZDb2RlCisgICAgICgqc3RhdGVtZW50X21vYykJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgc2VwOjpCRgorICAgICAoKmV4cHJlc3Npb24pCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHNlcDo6QkYKKyAgICAgKCpjb25kaXRpb25hbEV4cHJlc3Npb24pCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHNlcDo6QkYKKyAgICAgKCpzY2hlZHVsZUV4cHJlc3Npb24pCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHNlcDo6QkYKKyAgICAgKCpjb25kaXRpb25hbE9yRXhwcmVzc2lvbikJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgc2VwOjpCRgorICAgICAoKmNvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbikJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgc2VwOjpCRgorICAgICAoKmJpdHdpc2VPckV4cHJlc3Npb24pCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHNlcDo6QkYKKyAgICAgKCpiaXR3aXNlWG9yRXhwcmVzc2lvbikJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgc2VwOjpCRgorICAgICAoKmJpdHdpc2VBbmRFeHByZXNzaW9uKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBzZXA6OkJGCisgICAgICgqZXF1YWxpdHlFeHByZXNzaW9uKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBzZXA6Ok9wZXJhdG9yICoKKyAgICAgKCplcXVhbE9wKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBzZXA6OkJGCisgICAgICgqcmVsYXRpb25hbEV4cHJlc3Npb24pCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIHNlcDo6T3BlcmF0b3IgKgorICAgICAoKnJlbGF0aW9uYWxPcCkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgc2VwOjpCRgorICAgICAoKnNoaWZ0RXhwcmVzc2lvbikJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgc2VwOjpPcGVyYXRvciAqCisgICAgICgqc2hpZnRPcCkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgc2VwOjpCRgorICAgICAoKmFkZGl0aXZlRXhwcmVzc2lvbikJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgc2VwOjpCRgorICAgICAoKm11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbikJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgc2VwOjpCRgorICAgICAoKnVuYXJ5RXhwcmVzc2lvbikJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgc2VwOjpCRkNvZGUKKyAgICAgKCpjdG9yRXhwcmVzc2lvbikJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgc2VwOjpCRkNvZGUKKyAgICAgKCpxdW90ZV9leHByZXNzaW9uKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBzZXA6OkJGQ29kZQorICAgICAoKm1ldGFfZXZhbF9leHByZXNzaW9uKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBzZXA6OkJGCisgICAgICgqcHJpbWFyeSkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgc2VwOjpCRgorICAgICAoKnByaW1hcnlfdWZpZCkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBtYWluSWQpOworCisgICAgIHNlcDo6QkYKKyAgICAgKCpwcmltYXJ5X3VmaSkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBsb2NhdG9ySWQpOworCisgICAgIHNlcDo6QkYKKyAgICAgKCpwcmltYXJ5X2ludm9rZSkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBtYWluSWQpOworCisgICAgIHNlcDo6QkYKKyAgICAgKCpsaXRlcmFsKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBzZXA6OkJGCisgICAgICgqY29sbGVjdGlvbl9vZl9leHByZXNzaW9uKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQyMV9mbWwpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIEFOVExSM19CT09MRUFOCisgICAgICgqc3lucHJlZDU2X2ZtbCkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgQU5UTFIzX0JPT0xFQU4KKyAgICAgKCpzeW5wcmVkNTdfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ1OF9mbWwpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIEFOVExSM19CT09MRUFOCisgICAgICgqc3lucHJlZDU5X2ZtbCkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgQU5UTFIzX0JPT0xFQU4KKyAgICAgKCpzeW5wcmVkNjBfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ2MV9mbWwpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIEFOVExSM19CT09MRUFOCisgICAgICgqc3lucHJlZDYyX2ZtbCkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgQU5UTFIzX0JPT0xFQU4KKyAgICAgKCpzeW5wcmVkOTVfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQxMTVfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQxMjZfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQxMjdfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQxMzhfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQxNTNfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQxNzBfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQyOTZfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQzMDRfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQzMjRfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQzMjZfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQzMjlfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQzNDBfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQzNDFfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQzNDNfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQzNDRfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQzNjZfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQzNzBfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQzNzNfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQzNzVfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ0MDdfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ0MTJfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ0MTdfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ0MTlfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ0MjZfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ0MzFfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ0MzhfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ0NDZfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ0OTNfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ1MTRfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ1MTdfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ1MjBfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ1MzFfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ1MzVfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ1MzdfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ1MzlfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ1NTVfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ1NTlfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ1NzRfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ2MDlfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ2MzZfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ2NDNfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ3MDVfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ3MDlfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ3MTRfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ3NzhfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ3NzlfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ3ODBfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ3ODFfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ4MDJfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ4MDRfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ4NjFfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ4NzJfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ4OTFfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ4OTRfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ4OTZfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ4OTdfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ4OThfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5NDZfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5NDdfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5NDhfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5NDlfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5NTBfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5NTFfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5NTJfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5NTNfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5NTRfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5NTVfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5NTZfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5NTdfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5NThfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5NTlfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5NjBfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5NjFfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5NjJfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5NjNfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5NjRfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5NjVfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5NjZfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5NjdfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5NjhfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5NjlfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5NzBfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5NzFfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5NzJfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5NzNfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5NzRfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5NzVfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5NzZfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5NzdfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5ODBfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5ODFfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5ODJfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5ODNfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5ODRfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5ODVfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5ODZfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5ODdfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5OTFfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5OTJfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQ5OTdfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQxMDAwX2ZtbCkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgQU5UTFIzX0JPT0xFQU4KKyAgICAgKCpzeW5wcmVkMTAwM19mbWwpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIEFOVExSM19CT09MRUFOCisgICAgICgqc3lucHJlZDEwMjBfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQxMDIxX2ZtbCkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgQU5UTFIzX0JPT0xFQU4KKyAgICAgKCpzeW5wcmVkMTAyN19mbWwpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIEFOVExSM19CT09MRUFOCisgICAgICgqc3lucHJlZDEwMjlfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKworICAgICBBTlRMUjNfQk9PTEVBTgorICAgICAoKnN5bnByZWQxMDMwX2ZtbCkJKHN0cnVjdCBmbWxQYXJzZXJfQ3R4X3N0cnVjdCAqIGN0eCk7CisKKyAgICAgQU5UTFIzX0JPT0xFQU4KKyAgICAgKCpzeW5wcmVkMTAzM19mbWwpCShzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworCisgICAgIEFOVExSM19CT09MRUFOCisgICAgICgqc3lucHJlZDEwMzVfZm1sKQkoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKKyAgICAvLyBEZWxlZ2F0ZWQgcnVsZXMKKworICAgIGNvbnN0IGNoYXIgKiAoKmdldEdyYW1tYXJGaWxlTmFtZSkoKTsKKyAgICB2b2lkICAgICAgICAgICAgKCpyZXNldCkgIChzdHJ1Y3QgZm1sUGFyc2VyX0N0eF9zdHJ1Y3QgKiBjdHgpOworICAgIHZvaWQJICAgICgqZnJlZSkgICAoc3RydWN0IGZtbFBhcnNlcl9DdHhfc3RydWN0ICogY3R4KTsKK307CisKKy8vIEZ1bmN0aW9uIHByb3RveXBlcyBmb3IgdGhlIGNvbnN0cnVjdG9yIGZ1bmN0aW9ucyB0aGF0IGV4dGVybmFsIHRyYW5zbGF0aW9uIHVuaXRzCisvLyBzdWNoIGFzIGRlbGVnYXRvcnMgYW5kIGRlbGVnYXRlcyBtYXkgd2lzaCB0byBjYWxsLgorLy8KK0FOVExSM19BUEkgcGZtbFBhcnNlciBmbWxQYXJzZXJOZXcgICAgICAgICAoCitwQU5UTFIzX0NPTU1PTl9UT0tFTl9TVFJFQU0KKyBpbnN0cmVhbSk7CitBTlRMUjNfQVBJIHBmbWxQYXJzZXIgZm1sUGFyc2VyTmV3U1NEICAgICAgKAorcEFOVExSM19DT01NT05fVE9LRU5fU1RSRUFNCisgaW5zdHJlYW0sIHBBTlRMUjNfUkVDT0dOSVpFUl9TSEFSRURfU1RBVEUgc3RhdGUpOworCisvKiogU3ltYm9saWMgZGVmaW5pdGlvbnMgb2YgYWxsIHRoZSB0b2tlbnMgdGhhdCB0aGUgCitwYXJzZXIKKyB3aWxsIHdvcmsgd2l0aC4KKyAqIFx7CisgKgorICogQW50bHIgd2lsbCBkZWZpbmUgRU9GLCBidXQgd2UgY2FuJ3QgdXNlIHRoYXQgYXMgaXQgaXQgaXMgdG9vIGNvbW1vbiBpbgorICogaW4gQyBoZWFkZXIgZmlsZXMgYW5kIHRoYXQgd291bGQgYmUgY29uZnVzaW5nLiBUaGVyZSBpcyBubyB3YXkgdG8gZmlsdGVyIHRoaXMgb3V0IGF0IHRoZSBtb21lbnQKKyAqIHNvIHdlIGp1c3QgdW5kZWYgaXQgaGVyZSBmb3Igbm93LiBUaGF0IGlzbid0IHRoZSB2YWx1ZSB3ZSBnZXQgYmFjayBmcm9tIEMgcmVjb2duaXplcnMKKyAqIGFueXdheS4gV2UgYXJlIGxvb2tpbmcgZm9yIEFOVExSM19UT0tFTl9FT0YuCisgKi8KKyNpZmRlZglFT0YKKyN1bmRlZglFT0YKKyNlbmRpZgorI2lmZGVmCVRva2VucworI3VuZGVmCVRva2VucworI2VuZGlmCisjZGVmaW5lIEVPRiAgICAgIC0xCisjZGVmaW5lIFRfXzE0NCAgICAgIDE0NAorI2RlZmluZSBUX18xNDUgICAgICAxNDUKKyNkZWZpbmUgVF9fMTQ2ICAgICAgMTQ2CisjZGVmaW5lIFRfXzE0NyAgICAgIDE0NworI2RlZmluZSBUX18xNDggICAgICAxNDgKKyNkZWZpbmUgVF9fMTQ5ICAgICAgMTQ5CisjZGVmaW5lIFRfXzE1MCAgICAgIDE1MAorI2RlZmluZSBUX18xNTEgICAgICAxNTEKKyNkZWZpbmUgVF9fMTUyICAgICAgMTUyCisjZGVmaW5lIFRfXzE1MyAgICAgIDE1MworI2RlZmluZSBUX18xNTQgICAgICAxNTQKKyNkZWZpbmUgVF9fMTU1ICAgICAgMTU1CisjZGVmaW5lIFRfXzE1NiAgICAgIDE1NgorI2RlZmluZSBUX18xNTcgICAgICAxNTcKKyNkZWZpbmUgVF9fMTU4ICAgICAgMTU4CisjZGVmaW5lIFRfXzE1OSAgICAgIDE1OQorI2RlZmluZSBUX18xNjAgICAgICAxNjAKKyNkZWZpbmUgVF9fMTYxICAgICAgMTYxCisjZGVmaW5lIFRfXzE2MiAgICAgIDE2MgorI2RlZmluZSBUX18xNjMgICAgICAxNjMKKyNkZWZpbmUgVF9fMTY0ICAgICAgMTY0CisjZGVmaW5lIFRfXzE2NSAgICAgIDE2NQorI2RlZmluZSBUX18xNjYgICAgICAxNjYKKyNkZWZpbmUgVF9fMTY3ICAgICAgMTY3CisjZGVmaW5lIFRfXzE2OCAgICAgIDE2OAorI2RlZmluZSBUX18xNjkgICAgICAxNjkKKyNkZWZpbmUgVF9fMTcwICAgICAgMTcwCisjZGVmaW5lIFRfXzE3MSAgICAgIDE3MQorI2RlZmluZSBUX18xNzIgICAgICAxNzIKKyNkZWZpbmUgVF9fMTczICAgICAgMTczCisjZGVmaW5lIFRfXzE3NCAgICAgIDE3NAorI2RlZmluZSBUX18xNzUgICAgICAxNzUKKyNkZWZpbmUgVF9fMTc2ICAgICAgMTc2CisjZGVmaW5lIFRfXzE3NyAgICAgIDE3NworI2RlZmluZSBUX18xNzggICAgICAxNzgKKyNkZWZpbmUgVF9fMTc5ICAgICAgMTc5CisjZGVmaW5lIFRfXzE4MCAgICAgIDE4MAorI2RlZmluZSBUX18xODEgICAgICAxODEKKyNkZWZpbmUgVF9fMTgyICAgICAgMTgyCisjZGVmaW5lIFRfXzE4MyAgICAgIDE4MworI2RlZmluZSBUX18xODQgICAgICAxODQKKyNkZWZpbmUgVF9fMTg1ICAgICAgMTg1CisjZGVmaW5lIFRfXzE4NiAgICAgIDE4NgorI2RlZmluZSBUX18xODcgICAgICAxODcKKyNkZWZpbmUgVF9fMTg4ICAgICAgMTg4CisjZGVmaW5lIFRfXzE4OSAgICAgIDE4OQorI2RlZmluZSBUX18xOTAgICAgICAxOTAKKyNkZWZpbmUgVF9fMTkxICAgICAgMTkxCisjZGVmaW5lIFRfXzE5MiAgICAgIDE5MgorI2RlZmluZSBUX18xOTMgICAgICAxOTMKKyNkZWZpbmUgVF9fMTk0ICAgICAgMTk0CisjZGVmaW5lIFRfXzE5NSAgICAgIDE5NQorI2RlZmluZSBUX18xOTYgICAgICAxOTYKKyNkZWZpbmUgVF9fMTk3ICAgICAgMTk3CisjZGVmaW5lIFRfXzE5OCAgICAgIDE5OAorI2RlZmluZSBUX18xOTkgICAgICAxOTkKKyNkZWZpbmUgVF9fMjAwICAgICAgMjAwCisjZGVmaW5lIFRfXzIwMSAgICAgIDIwMQorI2RlZmluZSBUX18yMDIgICAgICAyMDIKKyNkZWZpbmUgVF9fMjAzICAgICAgMjAzCisjZGVmaW5lIFRfXzIwNCAgICAgIDIwNAorI2RlZmluZSBUX18yMDUgICAgICAyMDUKKyNkZWZpbmUgVF9fMjA2ICAgICAgMjA2CisjZGVmaW5lIFRfXzIwNyAgICAgIDIwNworI2RlZmluZSBUX18yMDggICAgICAyMDgKKyNkZWZpbmUgVF9fMjA5ICAgICAgMjA5CisjZGVmaW5lIFRfXzIxMCAgICAgIDIxMAorI2RlZmluZSBUX18yMTEgICAgICAyMTEKKyNkZWZpbmUgVF9fMjEyICAgICAgMjEyCisjZGVmaW5lIFRfXzIxMyAgICAgIDIxMworI2RlZmluZSBUX18yMTQgICAgICAyMTQKKyNkZWZpbmUgVF9fMjE1ICAgICAgMjE1CisjZGVmaW5lIFRfXzIxNiAgICAgIDIxNgorI2RlZmluZSBUX18yMTcgICAgICAyMTcKKyNkZWZpbmUgVF9fMjE4ICAgICAgMjE4CisjZGVmaW5lIFRfXzIxOSAgICAgIDIxOQorI2RlZmluZSBUX18yMjAgICAgICAyMjAKKyNkZWZpbmUgVF9fMjIxICAgICAgMjIxCisjZGVmaW5lIFRfXzIyMiAgICAgIDIyMgorI2RlZmluZSBUX18yMjMgICAgICAyMjMKKyNkZWZpbmUgVF9fMjI0ICAgICAgMjI0CisjZGVmaW5lIFRfXzIyNSAgICAgIDIyNQorI2RlZmluZSBUX18yMjYgICAgICAyMjYKKyNkZWZpbmUgVF9fMjI3ICAgICAgMjI3CisjZGVmaW5lIFRfXzIyOCAgICAgIDIyOAorI2RlZmluZSBUX18yMjkgICAgICAyMjkKKyNkZWZpbmUgVF9fMjMwICAgICAgMjMwCisjZGVmaW5lIFRfXzIzMSAgICAgIDIzMQorI2RlZmluZSBUX18yMzIgICAgICAyMzIKKyNkZWZpbmUgVF9fMjMzICAgICAgMjMzCisjZGVmaW5lIFRfXzIzNCAgICAgIDIzNAorI2RlZmluZSBUX18yMzUgICAgICAyMzUKKyNkZWZpbmUgVF9fMjM2ICAgICAgMjM2CisjZGVmaW5lIFRfXzIzNyAgICAgIDIzNworI2RlZmluZSBUX18yMzggICAgICAyMzgKKyNkZWZpbmUgVF9fMjM5ICAgICAgMjM5CisjZGVmaW5lIFRfXzI0MCAgICAgIDI0MAorI2RlZmluZSBUX18yNDEgICAgICAyNDEKKyNkZWZpbmUgVF9fMjQyICAgICAgMjQyCisjZGVmaW5lIFRfXzI0MyAgICAgIDI0MworI2RlZmluZSBUX18yNDQgICAgICAyNDQKKyNkZWZpbmUgVF9fMjQ1ICAgICAgMjQ1CisjZGVmaW5lIFRfXzI0NiAgICAgIDI0NgorI2RlZmluZSBUX18yNDcgICAgICAyNDcKKyNkZWZpbmUgVF9fMjQ4ICAgICAgMjQ4CisjZGVmaW5lIFRfXzI0OSAgICAgIDI0OQorI2RlZmluZSBUX18yNTAgICAgICAyNTAKKyNkZWZpbmUgVF9fMjUxICAgICAgMjUxCisjZGVmaW5lIFRfXzI1MiAgICAgIDI1MgorI2RlZmluZSBUX18yNTMgICAgICAyNTMKKyNkZWZpbmUgVF9fMjU0ICAgICAgMjU0CisjZGVmaW5lIFRfXzI1NSAgICAgIDI1NQorI2RlZmluZSBUX18yNTYgICAgICAyNTYKKyNkZWZpbmUgVF9fMjU3ICAgICAgMjU3CisjZGVmaW5lIFRfXzI1OCAgICAgIDI1OAorI2RlZmluZSBUX18yNTkgICAgICAyNTkKKyNkZWZpbmUgVF9fMjYwICAgICAgMjYwCisjZGVmaW5lIFRfXzI2MSAgICAgIDI2MQorI2RlZmluZSBUX18yNjIgICAgICAyNjIKKyNkZWZpbmUgVF9fMjYzICAgICAgMjYzCisjZGVmaW5lIFRfXzI2NCAgICAgIDI2NAorI2RlZmluZSBUX18yNjUgICAgICAyNjUKKyNkZWZpbmUgVF9fMjY2ICAgICAgMjY2CisjZGVmaW5lIFRfXzI2NyAgICAgIDI2NworI2RlZmluZSBUX18yNjggICAgICAyNjgKKyNkZWZpbmUgVF9fMjY5ICAgICAgMjY5CisjZGVmaW5lIFRfXzI3MCAgICAgIDI3MAorI2RlZmluZSBUX18yNzEgICAgICAyNzEKKyNkZWZpbmUgVF9fMjcyICAgICAgMjcyCisjZGVmaW5lIFRfXzI3MyAgICAgIDI3MworI2RlZmluZSBUX18yNzQgICAgICAyNzQKKyNkZWZpbmUgVF9fMjc1ICAgICAgMjc1CisjZGVmaW5lIFRfXzI3NiAgICAgIDI3NgorI2RlZmluZSBUX18yNzcgICAgICAyNzcKKyNkZWZpbmUgVF9fMjc4ICAgICAgMjc4CisjZGVmaW5lIFRfXzI3OSAgICAgIDI3OQorI2RlZmluZSBUX18yODAgICAgICAyODAKKyNkZWZpbmUgVF9fMjgxICAgICAgMjgxCisjZGVmaW5lIFRfXzI4MiAgICAgIDI4MgorI2RlZmluZSBUX18yODMgICAgICAyODMKKyNkZWZpbmUgVF9fMjg0ICAgICAgMjg0CisjZGVmaW5lIFRfXzI4NSAgICAgIDI4NQorI2RlZmluZSBUX18yODYgICAgICAyODYKKyNkZWZpbmUgVF9fMjg3ICAgICAgMjg3CisjZGVmaW5lIFRfXzI4OCAgICAgIDI4OAorI2RlZmluZSBUX18yODkgICAgICAyODkKKyNkZWZpbmUgVF9fMjkwICAgICAgMjkwCisjZGVmaW5lIFRfXzI5MSAgICAgIDI5MQorI2RlZmluZSBUX18yOTIgICAgICAyOTIKKyNkZWZpbmUgVF9fMjkzICAgICAgMjkzCisjZGVmaW5lIFRfXzI5NCAgICAgIDI5NAorI2RlZmluZSBUX18yOTUgICAgICAyOTUKKyNkZWZpbmUgVF9fMjk2ICAgICAgMjk2CisjZGVmaW5lIFRfXzI5NyAgICAgIDI5NworI2RlZmluZSBUX18yOTggICAgICAyOTgKKyNkZWZpbmUgVF9fMjk5ICAgICAgMjk5CisjZGVmaW5lIFRfXzMwMCAgICAgIDMwMAorI2RlZmluZSBUX18zMDEgICAgICAzMDEKKyNkZWZpbmUgVF9fMzAyICAgICAgMzAyCisjZGVmaW5lIFRfXzMwMyAgICAgIDMwMworI2RlZmluZSBUX18zMDQgICAgICAzMDQKKyNkZWZpbmUgVF9fMzA1ICAgICAgMzA1CisjZGVmaW5lIFRfXzMwNiAgICAgIDMwNgorI2RlZmluZSBUX18zMDcgICAgICAzMDcKKyNkZWZpbmUgVF9fMzA4ICAgICAgMzA4CisjZGVmaW5lIFRfXzMwOSAgICAgIDMwOQorI2RlZmluZSBUX18zMTAgICAgICAzMTAKKyNkZWZpbmUgVF9fMzExICAgICAgMzExCisjZGVmaW5lIFRfXzMxMiAgICAgIDMxMgorI2RlZmluZSBUX18zMTMgICAgICAzMTMKKyNkZWZpbmUgVF9fMzE0ICAgICAgMzE0CisjZGVmaW5lIFRfXzMxNSAgICAgIDMxNQorI2RlZmluZSBUX18zMTYgICAgICAzMTYKKyNkZWZpbmUgVF9fMzE3ICAgICAgMzE3CisjZGVmaW5lIFRfXzMxOCAgICAgIDMxOAorI2RlZmluZSBUX18zMTkgICAgICAzMTkKKyNkZWZpbmUgVF9fMzIwICAgICAgMzIwCisjZGVmaW5lIFRfXzMyMSAgICAgIDMyMQorI2RlZmluZSBUX18zMjIgICAgICAzMjIKKyNkZWZpbmUgVF9fMzIzICAgICAgMzIzCisjZGVmaW5lIFRfXzMyNCAgICAgIDMyNAorI2RlZmluZSBUX18zMjUgICAgICAzMjUKKyNkZWZpbmUgVF9fMzI2ICAgICAgMzI2CisjZGVmaW5lIFRfXzMyNyAgICAgIDMyNworI2RlZmluZSBUX18zMjggICAgICAzMjgKKyNkZWZpbmUgVF9fMzI5ICAgICAgMzI5CisjZGVmaW5lIFRfXzMzMCAgICAgIDMzMAorI2RlZmluZSBUX18zMzEgICAgICAzMzEKKyNkZWZpbmUgVF9fMzMyICAgICAgMzMyCisjZGVmaW5lIFRfXzMzMyAgICAgIDMzMworI2RlZmluZSBUX18zMzQgICAgICAzMzQKKyNkZWZpbmUgVF9fMzM1ICAgICAgMzM1CisjZGVmaW5lIFRfXzMzNiAgICAgIDMzNgorI2RlZmluZSBUX18zMzcgICAgICAzMzcKKyNkZWZpbmUgVF9fMzM4ICAgICAgMzM4CisjZGVmaW5lIFRfXzMzOSAgICAgIDMzOQorI2RlZmluZSBUX18zNDAgICAgICAzNDAKKyNkZWZpbmUgVF9fMzQxICAgICAgMzQxCisjZGVmaW5lIFRfXzM0MiAgICAgIDM0MgorI2RlZmluZSBUX18zNDMgICAgICAzNDMKKyNkZWZpbmUgVF9fMzQ0ICAgICAgMzQ0CisjZGVmaW5lIFRfXzM0NSAgICAgIDM0NQorI2RlZmluZSBUX18zNDYgICAgICAzNDYKKyNkZWZpbmUgVF9fMzQ3ICAgICAgMzQ3CisjZGVmaW5lIFRfXzM0OCAgICAgIDM0OAorI2RlZmluZSBUX18zNDkgICAgICAzNDkKKyNkZWZpbmUgVF9fMzUwICAgICAgMzUwCisjZGVmaW5lIFRfXzM1MSAgICAgIDM1MQorI2RlZmluZSBUX18zNTIgICAgICAzNTIKKyNkZWZpbmUgVF9fMzUzICAgICAgMzUzCisjZGVmaW5lIFRfXzM1NCAgICAgIDM1NAorI2RlZmluZSBUX18zNTUgICAgICAzNTUKKyNkZWZpbmUgVF9fMzU2ICAgICAgMzU2CisjZGVmaW5lIFRfXzM1NyAgICAgIDM1NworI2RlZmluZSBUX18zNTggICAgICAzNTgKKyNkZWZpbmUgVF9fMzU5ICAgICAgMzU5CisjZGVmaW5lIFRfXzM2MCAgICAgIDM2MAorI2RlZmluZSBUX18zNjEgICAgICAzNjEKKyNkZWZpbmUgVF9fMzYyICAgICAgMzYyCisjZGVmaW5lIFRfXzM2MyAgICAgIDM2MworI2RlZmluZSBUX18zNjQgICAgICAzNjQKKyNkZWZpbmUgVF9fMzY1ICAgICAgMzY1CisjZGVmaW5lIFRfXzM2NiAgICAgIDM2NgorI2RlZmluZSBUX18zNjcgICAgICAzNjcKKyNkZWZpbmUgVF9fMzY4ICAgICAgMzY4CisjZGVmaW5lIFRfXzM2OSAgICAgIDM2OQorI2RlZmluZSBUX18zNzAgICAgICAzNzAKKyNkZWZpbmUgVF9fMzcxICAgICAgMzcxCisjZGVmaW5lIFRfXzM3MiAgICAgIDM3MgorI2RlZmluZSBUX18zNzMgICAgICAzNzMKKyNkZWZpbmUgVF9fMzc0ICAgICAgMzc0CisjZGVmaW5lIFRfXzM3NSAgICAgIDM3NQorI2RlZmluZSBUX18zNzYgICAgICAzNzYKKyNkZWZpbmUgVF9fMzc3ICAgICAgMzc3CisjZGVmaW5lIFRfXzM3OCAgICAgIDM3OAorI2RlZmluZSBUX18zNzkgICAgICAzNzkKKyNkZWZpbmUgVF9fMzgwICAgICAgMzgwCisjZGVmaW5lIFRfXzM4MSAgICAgIDM4MQorI2RlZmluZSBUX18zODIgICAgICAzODIKKyNkZWZpbmUgVF9fMzgzICAgICAgMzgzCisjZGVmaW5lIFRfXzM4NCAgICAgIDM4NAorI2RlZmluZSBUX18zODUgICAgICAzODUKKyNkZWZpbmUgVF9fMzg2ICAgICAgMzg2CisjZGVmaW5lIFRfXzM4NyAgICAgIDM4NworI2RlZmluZSBUX18zODggICAgICAzODgKKyNkZWZpbmUgVF9fMzg5ICAgICAgMzg5CisjZGVmaW5lIFRfXzM5MCAgICAgIDM5MAorI2RlZmluZSBUX18zOTEgICAgICAzOTEKKyNkZWZpbmUgVF9fMzkyICAgICAgMzkyCisjZGVmaW5lIFRfXzM5MyAgICAgIDM5MworI2RlZmluZSBUX18zOTQgICAgICAzOTQKKyNkZWZpbmUgVF9fMzk1ICAgICAgMzk1CisjZGVmaW5lIFRfXzM5NiAgICAgIDM5NgorI2RlZmluZSBUX18zOTcgICAgICAzOTcKKyNkZWZpbmUgVF9fMzk4ICAgICAgMzk4CisjZGVmaW5lIFRfXzM5OSAgICAgIDM5OQorI2RlZmluZSBUX180MDAgICAgICA0MDAKKyNkZWZpbmUgVF9fNDAxICAgICAgNDAxCisjZGVmaW5lIFRfXzQwMiAgICAgIDQwMgorI2RlZmluZSBUX180MDMgICAgICA0MDMKKyNkZWZpbmUgVF9fNDA0ICAgICAgNDA0CisjZGVmaW5lIFRfXzQwNSAgICAgIDQwNQorI2RlZmluZSBUX180MDYgICAgICA0MDYKKyNkZWZpbmUgVF9fNDA3ICAgICAgNDA3CisjZGVmaW5lIFRfXzQwOCAgICAgIDQwOAorI2RlZmluZSBUX180MDkgICAgICA0MDkKKyNkZWZpbmUgVF9fNDEwICAgICAgNDEwCisjZGVmaW5lIFRfXzQxMSAgICAgIDQxMQorI2RlZmluZSBUX180MTIgICAgICA0MTIKKyNkZWZpbmUgVF9fNDEzICAgICAgNDEzCisjZGVmaW5lIFRfXzQxNCAgICAgIDQxNAorI2RlZmluZSBUX180MTUgICAgICA0MTUKKyNkZWZpbmUgVF9fNDE2ICAgICAgNDE2CisjZGVmaW5lIFRfXzQxNyAgICAgIDQxNworI2RlZmluZSBBU1NJR04gICAgICA0CisjZGVmaW5lIEFTU0lHTl9BRlRFUiAgICAgIDUKKyNkZWZpbmUgQVNTSUdOX01BQ1JPICAgICAgNgorI2RlZmluZSBBU1NJR05fUkVGICAgICAgNworI2RlZmluZSBBVF9JRCAgICAgIDgKKyNkZWZpbmUgQkFORCAgICAgIDkKKyNkZWZpbmUgQkFORF9BU1NJR04gICAgICAxMAorI2RlZmluZSBCQU5EX0FTU0lHTl9BRlRFUiAgICAgIDExCisjZGVmaW5lIEJBUl9SQlJBQ0tFVCAgICAgIDEyCisjZGVmaW5lIEJOT1QgICAgICAxMworI2RlZmluZSBCT1IgICAgICAxNAorI2RlZmluZSBCT1JfQVNTSUdOICAgICAgMTUKKyNkZWZpbmUgQk9SX0FTU0lHTl9BRlRFUiAgICAgIDE2CisjZGVmaW5lIEJYT1IgICAgICAxNworI2RlZmluZSBCWE9SX0FTU0lHTiAgICAgIDE4CisjZGVmaW5lIEJYT1JfQVNTSUdOX0FGVEVSICAgICAgMTkKKyNkZWZpbmUgQmluYXJ5ICAgICAgMjAKKyNkZWZpbmUgQ09MT04gICAgICAyMQorI2RlZmluZSBDT0xPTngyICAgICAgMjIKKyNkZWZpbmUgQ09NTUEgICAgICAyMworI2RlZmluZSBDT01NRU5UICAgICAgMjQKKyNkZWZpbmUgQ2hhckxpdGVyYWwgICAgICAyNQorI2RlZmluZSBERUNSICAgICAgMjYKKyNkZWZpbmUgRElFU0UgICAgICAyNworI2RlZmluZSBESVYgICAgICAyOAorI2RlZmluZSBESVZfQVNTSUdOICAgICAgMjkKKyNkZWZpbmUgRElWX0FTU0lHTl9BRlRFUiAgICAgIDMwCisjZGVmaW5lIERPTExBUiAgICAgIDMxCisjZGVmaW5lIERPTExBUl9MQ1VSTFkgICAgICAzMgorI2RlZmluZSBET1QgICAgICAzMworI2RlZmluZSBET1RET1QgICAgICAzNAorI2RlZmluZSBEZWNpbWFsICAgICAgMzUKKyNkZWZpbmUgRGVjaW1hbERpZ2l0ICAgICAgMzYKKyNkZWZpbmUgRGVjaW1hbERpZ2l0cyAgICAgIDM3CisjZGVmaW5lIERlY2ltYWxFeHBvbmVudCAgICAgIDM4CisjZGVmaW5lIEVRVUFMICAgICAgMzkKKyNkZWZpbmUgRVNDX1NFUSAgICAgIDQwCisjZGVmaW5lIEVYUE9ORU5UICAgICAgNDEKKyNkZWZpbmUgRmxvYXQgICAgICA0MgorI2RlZmluZSBGbG9hdExpdGVyYWwgICAgICA0MworI2RlZmluZSBGbG9hdFR5cGVTdWZmaXggICAgICA0NAorI2RlZmluZSBHVCAgICAgIDQ1CisjZGVmaW5lIEdURSAgICAgIDQ2CisjZGVmaW5lIEhFWF9ESUdJVCAgICAgIDQ3CisjZGVmaW5lIEhleERpZ2l0ICAgICAgNDgKKyNkZWZpbmUgSGV4YWRlY2ltYWwgICAgICA0OQorI2RlZmluZSBJRCAgICAgIDUwCisjZGVmaW5lIElOQ1IgICAgICA1MQorI2RlZmluZSBJbWFnaW5hcnlTdWZmaXggICAgICA1MgorI2RlZmluZSBJbnRTdWZmaXggICAgICA1MworI2RlZmluZSBJbnRlZ2VyICAgICAgNTQKKyNkZWZpbmUgSW50ZWdlckxpdGVyYWwgICAgICA1NQorI2RlZmluZSBMQU5EICAgICAgNTYKKyNkZWZpbmUgTEFORF9BU1NJR04gICAgICA1NworI2RlZmluZSBMQU5EX0FTU0lHTl9BRlRFUiAgICAgIDU4CisjZGVmaW5lIExBTkRfVEhFTiAgICAgIDU5CisjZGVmaW5lIExCUkFDS0VUICAgICAgNjAKKyNkZWZpbmUgTEJSQUNLRVRfQkFSICAgICAgNjEKKyNkZWZpbmUgTEJSQUNLRVRfRVhDRVBUICAgICAgNjIKKyNkZWZpbmUgTEJSQUNLRVRfTENVUkxZICAgICAgNjMKKyNkZWZpbmUgTENVUkxZICAgICAgNjQKKyNkZWZpbmUgTENVUkxZX0lOVk9LRSAgICAgIDY1CisjZGVmaW5lIExOT1QgICAgICA2NgorI2RlZmluZSBMT1IgICAgICA2NworI2RlZmluZSBMT1JfQVNTSUdOICAgICAgNjgKKyNkZWZpbmUgTE9SX0FTU0lHTl9BRlRFUiAgICAgIDY5CisjZGVmaW5lIExPUl9FTFNFICAgICAgNzAKKyNkZWZpbmUgTFBBUkVOICAgICAgNzEKKyNkZWZpbmUgTFBBUkVOX0lOVk9LRSAgICAgIDcyCisjZGVmaW5lIExTSElGVCAgICAgIDczCisjZGVmaW5lIExTSElGVF9BU1NJR04gICAgICA3NAorI2RlZmluZSBMU0hJRlRfQVNTSUdOX0FGVEVSICAgICAgNzUKKyNkZWZpbmUgTFRFICAgICAgNzYKKyNkZWZpbmUgTFRfICAgICAgNzcKKyNkZWZpbmUgTFhPUiAgICAgIDc4CisjZGVmaW5lIE1JTlVTICAgICAgNzkKKyNkZWZpbmUgTUlOVVNfQVNTSUdOICAgICAgODAKKyNkZWZpbmUgTUlOVVNfQVNTSUdOX0FGVEVSICAgICAgODEKKyNkZWZpbmUgTU9EICAgICAgODIKKyNkZWZpbmUgTU9EX0FTU0lHTiAgICAgIDgzCisjZGVmaW5lIE1PRF9BU1NJR05fQUZURVIgICAgICA4NAorI2RlZmluZSBORVFVQUwgICAgICA4NQorI2RlZmluZSBOU0VRVUFMICAgICAgODYKKyNkZWZpbmUgTnVtYmVyTGl0ZXJhbCAgICAgIDg3CisjZGVmaW5lIE9DVEFMX0VTQyAgICAgIDg4CisjZGVmaW5lIE9QX0FTU0lHTl9UT1AgICAgICA4OQorI2RlZmluZSBPUF9BVE9NSUNfU0VRVUVOQ0UgICAgICA5MAorI2RlZmluZSBPUF9DT05DVVJSRU5DWV9BTkQgICAgICA5MQorI2RlZmluZSBPUF9DT05DVVJSRU5DWV9BU1lOQyAgICAgIDkyCisjZGVmaW5lIE9QX0NPTkNVUlJFTkNZX0lOVEVSTEVBVklORyAgICAgIDkzCisjZGVmaW5lIE9QX0NPTkNVUlJFTkNZX09SICAgICAgOTQKKyNkZWZpbmUgT1BfQ09OQ1VSUkVOQ1lfUEFSQUxMRUwgICAgICA5NQorI2RlZmluZSBPUF9DT05DVVJSRU5DWV9SRFZfQU5EICAgICAgOTYKKyNkZWZpbmUgT1BfQ09OQ1VSUkVOQ1lfUkRWX0FTWU5DICAgICAgOTcKKyNkZWZpbmUgT1BfQ09OQ1VSUkVOQ1lfUkRWX0lOVEVSTEVBVklORyAgICAgIDk4CisjZGVmaW5lIE9QX0NPTkNVUlJFTkNZX1JEVl9PUiAgICAgIDk5CisjZGVmaW5lIE9QX0NPTkNVUlJFTkNZX1JEVl9QQVJBTExFTCAgICAgIDEwMAorI2RlZmluZSBPUF9GT1JLICAgICAgMTAxCisjZGVmaW5lIE9QX0pPSU4gICAgICAxMDIKKyNkZWZpbmUgT1BfTk9OX0RFVEVSTUlOSVNNICAgICAgMTAzCisjZGVmaW5lIE9QX1BPUCAgICAgIDEwNAorI2RlZmluZSBPUF9QVVNIICAgICAgMTA1CisjZGVmaW5lIE9QX1NDSEVEVUxFX0FORF9USEVOICAgICAgMTA2CisjZGVmaW5lIE9QX1NDSEVEVUxFX0dUICAgICAgMTA3CisjZGVmaW5lIE9QX1NDSEVEVUxFX0xUICAgICAgMTA4CisjZGVmaW5lIE9QX1NDSEVEVUxFX09SX0VMU0UgICAgICAxMDkKKyNkZWZpbmUgT1BfU0NIRURVTEVfWE9SICAgICAgMTEwCisjZGVmaW5lIE9QX1NFUVVFTkNFICAgICAgMTExCisjZGVmaW5lIE9QX1NFUVVFTkNFX1NJREUgICAgICAxMTIKKyNkZWZpbmUgT1BfU0VRVUVOQ0VfV0VBSyAgICAgIDExMworI2RlZmluZSBPUF9UT1AgICAgICAxMTQKKyNkZWZpbmUgT2N0YWwgICAgICAxMTUKKyNkZWZpbmUgT2N0YWxEaWdpdCAgICAgIDExNgorI2RlZmluZSBQRVJDRU5UX0xDVVJMWSAgICAgIDExNworI2RlZmluZSBQRVJDRU5UX0xQQVJFTiAgICAgIDExOAorI2RlZmluZSBQRVJDRU5UX0xQQVJFTl9JTlZPS0UgICAgICAxMTkKKyNkZWZpbmUgUExVUyAgICAgIDEyMAorI2RlZmluZSBQTFVTX0FTU0lHTiAgICAgIDEyMQorI2RlZmluZSBQTFVTX0FTU0lHTl9BRlRFUiAgICAgIDEyMgorI2RlZmluZSBRVUVTVElPTiAgICAgIDEyMworI2RlZmluZSBSQlJBQ0tFVCAgICAgIDEyNAorI2RlZmluZSBSQ1VSTFkgICAgICAxMjUKKyNkZWZpbmUgUkNVUkxZX0RPTExBUiAgICAgIDEyNgorI2RlZmluZSBSQ1VSTFlfUEVSQ0VOVCAgICAgIDEyNworI2RlZmluZSBSQ1VSTFlfUkJSQUNLRVQgICAgICAxMjgKKyNkZWZpbmUgUlBBUkVOICAgICAgMTI5CisjZGVmaW5lIFJQQVJFTl9QRVJDRU5UICAgICAgMTMwCisjZGVmaW5lIFJTSElGVCAgICAgIDEzMQorI2RlZmluZSBSU0hJRlRfQVNTSUdOICAgICAgMTMyCisjZGVmaW5lIFJTSElGVF9BU1NJR05fQUZURVIgICAgICAxMzMKKyNkZWZpbmUgUmF0aW9uYWxMaXRlcmFsICAgICAgMTM0CisjZGVmaW5lIFNFTUkgICAgICAxMzUKKyNkZWZpbmUgU0VRVUFMICAgICAgMTM2CisjZGVmaW5lIFNUQVIgICAgICAxMzcKKyNkZWZpbmUgU1RBUl9BU1NJR04gICAgICAxMzgKKyNkZWZpbmUgU1RBUl9BU1NJR05fQUZURVIgICAgICAxMzkKKyNkZWZpbmUgU1RBVEVNRU5UX1BST01QVCAgICAgIDE0MAorI2RlZmluZSBTdHJpbmdMaXRlcmFsICAgICAgMTQxCisjZGVmaW5lIFVOSUNPREVfRVNDICAgICAgMTQyCisjZGVmaW5lIFdTICAgICAgMTQzCisjaWZkZWYJRU9GCisjdW5kZWYJRU9GCisjZGVmaW5lCUVPRglBTlRMUjNfVE9LRU5fRU9GCisjZW5kaWYKKworI2lmbmRlZiBUT0tFTlNPVVJDRQorI2RlZmluZSBUT0tFTlNPVVJDRShseHIpIGx4ci0+cExleGVyLT5yZWMtPnN0YXRlLT50b2tTb3VyY2UKKyNlbmRpZgorCisvKiBFbmQgb2YgdG9rZW4gZGVmaW5pdGlvbnMgZm9yIGZtbFBhcnNlcgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLyoqIH0gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCisKKy8qIEVORCAtIE5vdGU6S2VlcCBleHRyYSBsaW5lIGZlZWQgdG8gc2F0aXNmeSBVTklYIHN5c3RlbXMgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci93b3JrZmxvdy8uZ2l0aWdub3JlIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL3dvcmtmbG93Ly5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIxOThlNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3BhcnNlci93b3JrZmxvdy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNiBAQAorL1dvcmtmbG93TGV4ZXIuY3BwCisvV29ya2Zsb3dMZXhlci5ocHAKKy9Xb3JrZmxvd1BhcnNlci5jcHAKKy9Xb3JrZmxvd1BhcnNlci5ocHAKKy9Xb3JrZmxvd1BhcnNlclRva2VuVHlwZXMuaHBwCisvV29ya2Zsb3dQYXJzZXJUb2tlblR5cGVzLnR4dApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL3dvcmtmbG93L1dvcmtmbG93LmcgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wYXJzZXIvd29ya2Zsb3cvV29ya2Zsb3cuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTVkNDUxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcGFyc2VyL3dvcmtmbG93L1dvcmtmbG93LmcKQEAgLTAsMCArMSwxNzk3IEBACisKKy8qIENQUCAqLworaGVhZGVyICJwcmVfaW5jbHVkZV9ocHAiCit7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgSW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Y29tbW9uL0VsZW1lbnQuaD4KKyNpbmNsdWRlIDxjb21tb24vTmFtZWRFbGVtZW50Lmg+CisjaW5jbHVkZSA8Y29tbW9uL0JGLmg+CisKKyNpbmNsdWRlIDxwYXJzZXIvbW9kZWwvUGFyc2VyVXRpbC5oPgorCisjaW5jbHVkZSA8Zm1sL2NvbW1vbi9Mb2NhdGlvbkVsZW1lbnQuaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0F2bUNvZGUuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9CdWlsdGluQXJyYXkuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29uc3RydWN0b3IuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9TdGF0ZW1lbnRDb25zdHJ1Y3Rvci5oPgorCisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yLmg+CisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yTWFuYWdlci5oPgorCisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1F1ZXJ5Lmg+CisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1VuaUZvcm1JZGVudGlmaWVyLmg+CisKKyNpbmNsdWRlIDxmbWwvd29ya2Zsb3cvV09iamVjdC5oPgorCit9CisKKworb3B0aW9ucworeworCWxhbmd1YWdlICA9ICJDcHAiOworCW5hbWVzcGFjZSA9ICJzZXAiOworCW5hbWVzcGFjZVN0ZCA9ICJzdGQiOworCW5hbWVzcGFjZUFudGxyID0gImFudGxyIjsKKwlnZW5IYXNoTGluZXMgPSBmYWxzZTsgICAgICAgICAvLyB0b28gbWFueSBjb21waWxlciB3YXJuaW5ncyB3aGVuIGdlbmVyYXRpbmcgI2xpbmUgc3RhdGVtZW50cworfQorLyogZW5kIENQUCAqLworCisKK2NsYXNzIFdvcmtmbG93UGFyc2VyIGV4dGVuZHMgUGFyc2VyOworCitvcHRpb25zCit7CisJZGVmYXVsdEVycm9ySGFuZGxlciA9IHRydWU7CisJY29kZUdlbk1ha2VTd2l0Y2hUaHJlc2hvbGQgPSAxMDsKKworLy8JYmFja3RyYWNrID0gdHJ1ZTsKKwlrID0gNDsKK30KKworCit7CisKKworcHJpdmF0ZToKKwlhdm1fc2l6ZV90ICAgbm9PZkVycm9yczsKKworCVdPYmplY3RNYW5hZ2VyICogbVdPYmplY3RNYW5hZ2VyOworCisKK3B1YmxpYzoKKworYXZtX3NpemVfdCBoYXNFcnJvcigpIGNvbnN0Cit7CisJcmV0dXJuKCBub09mRXJyb3JzID4gMCApOworfQorCithdm1fc2l6ZV90IG51bWJlck9mRXJyb3JzKCkgY29uc3QKK3sKKwlyZXR1cm4gbm9PZkVycm9yczsKK30KKwordm9pZCByZXNldEVycm9ycygpCit7CisJbm9PZkVycm9ycyA9IDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyB2ZXJzaW9uSW5mbygpCit7CisJc3RhdGljIHN0ZDo6c3RyaW5nICAgaW5mbyA9ICIkSWQ6IExpYVBhcnNlci5nLCB2IDAuMSAyMDA1LzA4LzIzIExhcGl0cmUgJCI7CisKKwlyZXR1cm4gaW5mbzsKK30KKworCitwcm90ZWN0ZWQ6CisKK3ZvaWQgcmVwb3J0RXJyb3IoIGNvbnN0IHN0ZDo6c3RyaW5nICYgZXJyb3JNZXNzYWdlICkKK3sKKwlyZXBvcnRNZXNzYWdlKCBlcnJvck1lc3NhZ2UgKTsKKwkrK25vT2ZFcnJvcnM7Cit9CisKK3ZvaWQgcmVwb3J0RXJyb3IoIGNvbnN0IGFudGxyOjpSZWNvZ25pdGlvbkV4Y2VwdGlvbiAmIGV4ICkKK3sKKwlBVk1fT1NfQ0VSUiA8PCBzdGQ6OmVuZGwgPDwgZXgudG9TdHJpbmcoKS5jX3N0cigpOworCSsrbm9PZkVycm9yczsKK30KKwordm9pZCByZXBvcnRNZXNzYWdlKCBjb25zdCBzdGQ6OnN0cmluZyAmIG1lc3NhZ2UgKQoreworCWlmKCBnZXRGaWxlbmFtZSgpLmxlbmd0aCgpID4gMCApCisJeworCQlBVk1fT1NfQ0VSUiA8PCBnZXRGaWxlbmFtZSgpIDw8ICI6IjsKKwl9CisKKwlBVk1fT1NfQ0VSUiA8PCBMVCggMSApIC0+IGdldExpbmUoKSA8PCAiOiIgPDwgTFQoIDEgKS0+Z2V0Q29sdW1uKCkKKwkJCTw8ICIgW2Vycm9yXSAiIDw8IG1lc3NhZ2UgPDwgc3RkOjplbmRsOworfQorCisKKwordm9pZCBzZXRMb2NhdGlvbihXT2JqZWN0ICogd2ZPYmplY3QsIGludCBiTGluZSwgaW50IGVMaW5lLAorCQlpbnQgYk9mZnNldCwgaW50IGVPZmZzZXQpCit7CisJd2ZPYmplY3QtPnNldExvY2F0aW9uKGdldEZpbGVuYW1lKCksIGJMaW5lLCBlTGluZSk7Cit9CisKK3ZvaWQgc2V0TG9jYXRpb24oVHJhY2VhYmxlRWxlbWVudCAmIGFUcmFjZWFibGVFbGVtZW50LCBpbnQgYkxpbmUsIGludCBlTGluZSwKKwkJaW50IGJPZmZzZXQsIGludCBlT2Zmc2V0KQoreworCWFUcmFjZWFibGVFbGVtZW50LnNldExvY2F0aW9uKGdldEZpbGVuYW1lKCksIGJMaW5lLCBlTGluZSk7Cit9CisKK3ZvaWQgc2V0TG9jYXRpb24oVHJhY2VhYmxlRWxlbWVudCAqIGFUcmFjZWFibGVFbGVtZW50LCBpbnQgYkxpbmUsIGludCBlTGluZSwKKwkJaW50IGJPZmZzZXQsIGludCBlT2Zmc2V0KQoreworCWFUcmFjZWFibGVFbGVtZW50LT5zZXRMb2NhdGlvbihnZXRGaWxlbmFtZSgpLCBiTGluZSwgZUxpbmUpOworfQorCisKK3ZvaWQgc2V0TG9jYXRpb24oVHJhY2VhYmxlRWxlbWVudCAqIGFUcmFjZWFibGVFbGVtZW50LCBpbnQgYkxpbmUsIGludCBlTGluZSkKK3sKKwlhVHJhY2VhYmxlRWxlbWVudC0+c2V0TG9jYXRpb24oZ2V0RmlsZW5hbWUoKSwgYkxpbmUsIGVMaW5lKTsKK30KKworCitpbnQgZ2V0TmV4dFRva2VuTGluZSgpCit7CisJcmV0dXJuKCBMVCgxKS0+Z2V0TGluZSgpICk7Cit9CisKK2ludCBnZXROZXh0VG9rZW5TdGFydEluZGV4KCkKK3sKKwlyZXR1cm4gMTsvLyggTFQoMSkuZ2V0TGluZSgpICk7Cit9CisKK2ludCBnZXROZXh0VG9rZW5TdG9wSW5kZXgoKQoreworCXJldHVybiAxOy8vKCBMVCgxKS5nZXRMaW5lKCkgKTsKK30KKworCit2b2lkIGFkZEVsZW1lbnQoV09iamVjdCAqIHdmQ29udGFpbmVyLCBXT2JqZWN0ICogd2ZPYmplY3QpCit7CisJaWYoICh3ZkNvbnRhaW5lciAhPSBXT2JqZWN0OjpfTlVMTF8pICYmICh3Zk9iamVjdCAhPSBXT2JqZWN0OjpfTlVMTF8pICkKKwl7CisJCXdmQ29udGFpbmVyLT5hcHBlbmQoIHdmT2JqZWN0ICk7CisJfQorfQorCisKK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLyBVTklRIEZPUk0gSURFTlRJRklFUgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworcXVhbGlmaWVkTmFtZUlEIHJldHVybnMgWyBzdGQ6OnN0cmluZyBxTmFtZUlEIF0KKwk6ICggImZvcm0iCisJCSggQ09MT05fU0xBU0ggIHsgcU5hbWVJRCA9IHN0ZDo6c3RyaW5nKCJmb3JtIikgKyBGUU5fSURfU0NIRU1FX1BBVEhfU0VQQVJBVE9SOyB9CisJCXwgQ09MT04yICAgICAgIHsgcU5hbWVJRCA9IHN0ZDo6c3RyaW5nKCJmb3JtIikgKyBGUU5fSURfUk9PVF9TRVBBUkFUT1I7ICAgICAgICB9CisJCSkKKwkgIHwgIm1ldGEiCisJCSggQ09MT05fU0xBU0ggIHsgcU5hbWVJRCA9IHN0ZDo6c3RyaW5nKCJtZXRhIikgKyBGUU5fSURfU0NIRU1FX1BBVEhfU0VQQVJBVE9SOyB9CisJCXwgQ09MT04yICAgICAgIHsgcU5hbWVJRCA9IHN0ZDo6c3RyaW5nKCJtZXRhIikgKyBGUU5fSURfUk9PVF9TRVBBUkFUT1I7ICAgICAgICB9CisJCSkKKworCSAgfCBpZDpJZGVudGlmaWVyCisJCSggQ09MT05fU0xBU0ggIHsgcU5hbWVJRCA9IGlkLT5nZXRUZXh0KCkgKyBGUU5fSURfU0NIRU1FX1BBVEhfU0VQQVJBVE9SOyB9CisJCXwgQ09MT04yICAgICAgIHsgcU5hbWVJRCA9IGlkLT5nZXRUZXh0KCkgKyBGUU5fSURfUk9PVF9TRVBBUkFUT1I7ICAgICAgICB9CisJCSkKKworCSAgfCBDT0xPTl9TTEFTSCAgeyBxTmFtZUlEID0gRlFOX0lEX1NDSEVNRV9QQVRIX1NFUEFSQVRPUjsgfQorCSAgfCBDT0xPTjIgICAgICAgeyBxTmFtZUlEID0gRlFOX0lEX1JPT1RfU0VQQVJBVE9SOyAgICAgICAgfQorCSAgKT8KKworCSAgaWQyOklkZW50aWZpZXIgIHsgcU5hbWVJRCA9IHFOYW1lSUQgKyBpZDItPmdldFRleHQoKTsgfQorCisJICAoICBET1QKKwkgIAkoIGlkMzpJZGVudGlmaWVyCisJICAJfCAga3dfcHVibGljICAgIHwgIGt3X3N0YXRpYworCSAgCXwgIGt3X2ZpbmFsICAgICB8ICBrd192b2xhdGlsZQorCSAgCXwgIGt3X3JlZmVyZW5jZSB8ICBrd19idWZmZXJlZAorCSAgCSkKKwkJeyBxTmFtZUlEID0gcU5hbWVJRCArICIuIiArIGlkMy0+Z2V0VGV4dCgpOyB9CisJICApKgorCTsKKworCit1ZmlTdHJpbmcgcmV0dXJucyBbIEJGIGJmVUZJIF0KK3sKKwlzdGQ6OnN0cmluZyBzOworCisJVW5pRm9ybUlkZW50aWZpZXIgKiBVRkkgPSBuZXcgVW5pRm9ybUlkZW50aWZpZXIoZmFsc2UpOworCWJmVUZJID0gVUZJOyAvLyBmb3IgYXV0b21hdGljIGRlc3RydWN0aW9uIG9mIDw8IFVGSSA+PiBpZiBuZWVkCisKKwlCRiBhcDsKKworCWludCBiTGluZSA9IGdldE5leHRUb2tlbkxpbmUoKTsKKwlpbnQgYk9mZnNldCA9IGdldE5leHRUb2tlblN0YXJ0SW5kZXgoKTsKK30KKwk6ICggKCAiZm9ybSIgQ09MT04yIHsgVUZJLT5zZXRMb2NhdG9yKCAiZm9ybSIgKTsgVUZJLT5zZXRBYnNvbHV0ZSgpOyB9ICkKKwkgIHwgKCAibWV0YSIgQ09MT04yIHsgVUZJLT5zZXRMb2NhdG9yKCAibWV0YSIgKTsgVUZJLT5zZXRBYnNvbHV0ZSgpOyB9ICkKKworCSAgfCAoIGlkOklkZW50aWZpZXIgQ09MT04yCisJICAgIHsgVUZJLT5zZXRMb2NhdG9yKCBpZC0+Z2V0VGV4dCgpICk7IFVGSS0+c2V0QWJzb2x1dGUoKTsgfSApCisKKwkgIHwgQ09MT04yICB7IFVGSS0+c2V0QWJzb2x1dGUoKTsgfQorCSAgKT8KKworCSAgaWQyOklkZW50aWZpZXIgIHsgVUZJLT5hcHBlbmRGaWVsZCggaWQyLT5nZXRUZXh0KCkgKTsgfQorCisJICAoICBET1QKKwkgIAkoIGlkMzpJZGVudGlmaWVyICAgeyBVRkktPmFwcGVuZEZpZWxkKCBpZDMtPmdldFRleHQoKSApOyB9CisJICAJfCAga3dfcHVibGljICAgICAgIHsgVUZJLT5hcHBlbmRGaWVsZCggInB1YmxpYyIgKTsgfQorCSAgCXwgIGt3X3N0YXRpYyAgICAgICB7IFVGSS0+YXBwZW5kRmllbGQoICJzdGF0aWMiICk7IH0KKwkgIAl8ICBrd19maW5hbCAgICAgICAgeyBVRkktPmFwcGVuZEZpZWxkKCAiZmluYWwiICk7IH0KKwkgIAl8ICBrd192b2xhdGlsZSAgICAgeyBVRkktPmFwcGVuZEZpZWxkKCAidm9sYXRpbGUiICk7IH0KKwkgIAl8ICBrd19yZWZlcmVuY2UgICAgeyBVRkktPmFwcGVuZEZpZWxkKCAicmVmZXJlbmNlIiApOyB9CisJICAJfCAga3dfYnVmZmVyZWQgICAgIHsgVUZJLT5hcHBlbmRGaWVsZCggImJ1ZmZlcmVkIiApOyB9CisJICAJKQorCisJICB8CSggTEJSQUNLIGF2bVByb2dyYW1bV09iamVjdDo6X05VTExfXSBSQlJBQ0sgKQorCSAgICA9PiBMQlJBQ0sgYXA9YXZtUHJvZ3JhbVtXT2JqZWN0OjpfTlVMTF9dIFJCUkFDSyAgeyBVRkktPmFwcGVuZEluZGV4KCBhcCApOyB9CisJICApKgorCisJeworCQlpZiggVUZJLT5pc1B1cmVJZGVudGlmaWVyKCkgKQorCQl7CisJCQliZlVGSSA9IFVGSS0+cG9wSWRlbnRpZmllcigpOworCQl9CisJCWVsc2UKKwkJeworCQkJc2V0TG9jYXRpb24oVUZJLCBiTGluZSwgYkxpbmUsIGJPZmZzZXQsIGdldE5leHRUb2tlblN0b3BJbmRleCgpKTsKKwkJfQorCX0KKwk7CisKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLyBLRVlXT1JEIFhMSUEKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwora3dfcHVibGljCisvLwk6IHsgTFQoMSktPmdldFRleHQoKSA9PSAicHVibGljIiB9PyBJZGVudGlmaWVyCisJOiAicHVibGljIgorCTsKKwora3dfc3RhdGljCisvLwk6IHsgTFQoMSktPmdldFRleHQoKSA9PSAic3RhdGljIiB9PyBJZGVudGlmaWVyCisJOiAic3RhdGljIgorCTsKKwora3dfZmluYWwKKy8vCTogeyBMVCgxKS0+Z2V0VGV4dCgpID09ICJmaW5hbCIgfT8gSWRlbnRpZmllcgorCTogImZpbmFsIgorCTsKKwora3dfcmVmZXJlbmNlCisvLwk6IHsgTFQoMSktPmdldFRleHQoKSA9PSAicmVmZXJlbmNlIiB9PyBJZGVudGlmaWVyCisJOiAicmVmZXJlbmNlIgorCTsKKwora3dfYnVmZmVyZWQKKy8vCTogeyBMVCgxKS0+Z2V0VGV4dCgpID09ICJidWZmZXJlZCIgfT8gSWRlbnRpZmllcgorCTogImJ1ZmZlcmVkIgorCTsKKwora3dfdm9sYXRpbGUKKy8vCTogeyBMVCgxKS0+Z2V0VGV4dCgpID09ICJ2b2xhdGlsZSIgfT8gSWRlbnRpZmllcgorCTogInZvbGF0aWxlIgorCTsKKworCitrd19mb3JtCisvLwk6IHsgTFQoMSktPmdldFRleHQoKSA9PSAiZm9ybSIgfT8gSWRlbnRpZmllcgorCTogImZvcm0iCisJOworCitrd19lbmRmb3JtCisvLwk6IHsgTFQoMSktPmdldFRleHQoKSA9PSAiZW5kZm9ybSIgfT8gSWRlbnRpZmllcgorCTogImVuZGZvcm0iCisJOworCitrd19wcm90b3R5cGUKKy8vCTogeyBMVCgxKS0+Z2V0VGV4dCgpID09ICJwcm90b3R5cGUiIH0/IElkZW50aWZpZXIKKwk6ICJwcm90b3R5cGUiCisJOworCitrd19lbmRwcm90b3R5cGUKKy8vCTogeyBMVCgxKS0+Z2V0VGV4dCgpID09ICJlbmRwcm90b3R5cGUiIH0/IElkZW50aWZpZXIKKwk6ICJlbmRwcm90b3R5cGUiCisJOworCisKK2t3X2FzCisvLwk6IHsgTFQoMSktPmdldFRleHQoKSA9PSAiYXMiIH0/IElkZW50aWZpZXIKKwk6ICJhcyIKKwk7CisKK2t3X2lzCisvLwk6IHsgTFQoMSktPmdldFRleHQoKSA9PSAiaXMiIH0/IElkZW50aWZpZXIKKwk6ICJpcyIKKwk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLyBHUkFNTUFSIEZJTEUgREVGSU5JVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworZmF2bVByb2xvZworCTogKCBBdHRyX0RJVkVSU0lUWSB8IEF0dHJfU0VXIHwgQXR0cl9GQVZNICkKKwkgIExUXworCQlJZGVudGlmaWVyIC8vKCAid29ya2Zsb3ciIHwgImNvbmZpZ3VyYXRpb24iICkKKwkJKCBDT01NQSAoIEZsb2F0aW5nUG9pbnROdW1iZXIgfCBVRkkgfCBFU3RyaW5nICkgKSoKKwkgIEdUX0NPTE9OCisJOworCisKK2Zvcm1fZ3JhbW1hclsgV09iamVjdE1hbmFnZXIgJiBhV09iamVjdE1hbmFnZXIgXQorcmV0dXJucyBbIFdPYmplY3QgKiB3Zk9iamVjdCA9IFdPYmplY3Q6Ol9OVUxMXyBdCit7CisJbVdPYmplY3RNYW5hZ2VyID0gJiggYVdPYmplY3RNYW5hZ2VyICk7Cit9CisJOiAoIGZhdm1Qcm9sb2cgKT8KKwkgICggd2ZPYmplY3Q9YU5vcm1hbEZvcm1bICYoIG1XT2JqZWN0TWFuYWdlci0+Uk9PVF9XT0JKRUNUICkgXQorCSAgfCAgd2ZPYmplY3Q9YVdvcmtmbG93IFsgJiggbVdPYmplY3RNYW5hZ2VyLT5ST09UX1dPQkpFQ1QgKSBdCisJICApCisJeworCQl3Zk9iamVjdC0+c2V0Q29udGFpbmVyKFdPYmplY3Q6Ol9OVUxMXyk7CisKKwkJaWYoIGhhc0Vycm9yKCkgKQorCQl7CisJCQlBVk1fT1NfQ0VSUiA8PCBzdGQ6OmVuZGw7CisJCX0KKwl9CisJOworCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vIFdPUktGTE9XIENPTkZJR1VSQVRJT04gREVGSU5JVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYVdvcmtmbG93IFsgV09iamVjdCAqIHdmQ29udGFpbmVyIF0KK3JldHVybnMgWyBXT2JqZWN0ICogd2ZPYmplY3QgPSBXT2JqZWN0OjpfTlVMTF8gXQoreworCXdmT2JqZWN0ID0gbVdPYmplY3RNYW5hZ2VyLT5uZXdXT2JqZWN0KHdmQ29udGFpbmVyLCAiIiwgIiIpOworCisJaW50IGJMaW5lID0gZ2V0TmV4dFRva2VuTGluZSgpOworCWludCBiT2Zmc2V0ID0gZ2V0TmV4dFRva2VuU3RhcnRJbmRleCgpOworfQorCTogYVdvcmtmbG93T2JqZWN0W3dmQ29udGFpbmVyLCB3Zk9iamVjdCwgYkxpbmUsIGJPZmZzZXRdCisJOworCisKK2FXb3JrZmxvd09iamVjdFsgV09iamVjdCAqIHdmQ29udGFpbmVyICwgV09iamVjdCAqIHdmT2JqZWN0ICwgaW50IGJMaW5lICwgaW50IGJPZmZzZXQgXQoreworCVdPYmplY3QgKiB3b2JqZWN0ID0gV09iamVjdDo6X05VTExfOworCisJc3RkOjpzdHJpbmcgcW5pZCA9ICJ3b3JrZmxvdyI7Cit9CisJOiBxbmlkPXF1YWxpZmllZE5hbWVJRCAgeyB3Zk9iamVjdC0+c2V0UXVhbGlmaWVkVHlwZU5hbWVJRCggcW5pZCApOyB9CisKKwkgICggcW5pZD1xdWFsaWZpZWROYW1lSUQgKT8KKwkgIHsKKwkJaWYoIE5hbWVkRWxlbWVudDo6aXNSZWxhdGl2ZShxbmlkKSApCisJCXsKKwkJCW1XT2JqZWN0TWFuYWdlci0+cmVnaXN0ZXJXT2JqZWN0KHdmT2JqZWN0LCBxbmlkKTsKKworCQkJcW5pZCA9IG1XT2JqZWN0TWFuYWdlci0+bWFrZUZRTiggd2ZDb250YWluZXIsIHFuaWQgKTsKKwkJfQorCQl3Zk9iamVjdC0+c2V0RnVsbHlRdWFsaWZpZWROYW1lSUQocW5pZCk7CisKKwkJbVdPYmplY3RNYW5hZ2VyLT5yZWdpc3RlcldPYmplY3QoIHdmT2JqZWN0ICk7CisJICB9CisKKwkgICggZHFzOkRvdWJsZVF1b3RlZFN0cmluZyAgeyB3Zk9iamVjdC0+c2V0VW5yZXN0cmljdGVkTmFtZSggZHFzLT5nZXRUZXh0KCkgKTsgfQorCSAgfCBzcXM6U2luZ2xlUXVvdGVkU3RyaW5nICB7IHdmT2JqZWN0LT5zZXRVbnJlc3RyaWN0ZWROYW1lKCBzcXMtPmdldFRleHQoKSApOyB9CisJICApPworCisJICBMQ1VSTFkKKworCSAgICAoIHdvYmplY3Q9YUNvbXBvbmVudFt3Zk9iamVjdF0gIHsgYWRkRWxlbWVudCh3Zk9iamVjdCwgd29iamVjdCk7IH0gKSoKKworCSAgeyBzZXRMb2NhdGlvbih3Zk9iamVjdCwgYkxpbmUsIGdldE5leHRUb2tlbkxpbmUoKSwgYk9mZnNldCwgZ2V0TmV4dFRva2VuU3RvcEluZGV4KCkpOyB9CisJICBSQ1VSTFkKKwk7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vIE5PUk1BTCBGT1JNIERFRklOSVRJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Zvcm1IRUFERVIgWyBXT2JqZWN0ICogd2ZDb250YWluZXIsIFdPYmplY3QgKiB3Zk9iamVjdCBdCit7CisJc3RkOjpzdHJpbmcgcW5pZCA9ICIiOworfQorCTogcW5pZD1xdWFsaWZpZWROYW1lSUQKKwkgIHsKKwkJaWYoIE5hbWVkRWxlbWVudDo6aXNSZWxhdGl2ZShxbmlkKSApIHsKKwkJCW1XT2JqZWN0TWFuYWdlci0+cmVnaXN0ZXJXT2JqZWN0KHdmT2JqZWN0LCBxbmlkKTsKKworCQkJcW5pZCA9IG1XT2JqZWN0TWFuYWdlci0+bWFrZUZRTiggd2ZDb250YWluZXIsIHFuaWQgKTsKKwkJfQorCQl3Zk9iamVjdC0+c2V0RnVsbHlRdWFsaWZpZWROYW1lSUQocW5pZCk7CisKKwkJbVdPYmplY3RNYW5hZ2VyLT5yZWdpc3RlcldPYmplY3QoIHdmT2JqZWN0ICk7CisJICB9CisKKwkgICggZHFzOkRvdWJsZVF1b3RlZFN0cmluZyAgeyB3Zk9iamVjdC0+c2V0VW5yZXN0cmljdGVkTmFtZSggZHFzLT5nZXRUZXh0KCkgKTsgfQorCSAgfCBzcXM6U2luZ2xlUXVvdGVkU3RyaW5nICB7IHdmT2JqZWN0LT5zZXRVbnJlc3RyaWN0ZWROYW1lKCBzcXMtPmdldFRleHQoKSApOyB9CisJICApPworCisJICBrd19hcyAoIEJBTkQgKT8gcW5pZD1xdWFsaWZpZWROYW1lSUQKKwkgIHsgd2ZPYmplY3QtPnNldFF1YWxpZmllZFR5cGVOYW1lSUQoIHFuaWQgKTsgfQorCTsKKworCitmb3JtQk9EWVsgV09iamVjdCAqIHdmQ29udGFpbmVyICwgV09iamVjdCAqIHdmT2JqZWN0XQoreworCVdPYmplY3QgKiB3b2JqZWN0ID0gV09iamVjdDo6X05VTExfOworfQorCToga3dfaXMgICggd29iamVjdD1hQ29tcG9uZW50W3dmT2JqZWN0XSAgeyBhZGRFbGVtZW50KHdmT2JqZWN0LCB3b2JqZWN0KTsgfSApKgorCTsKKworCisKK2Zvcm1ERUNMIFsgV09iamVjdCAqIHdmQ29udGFpbmVyICwgV09iamVjdCAqIHdmT2JqZWN0XQorCTogZm9ybUhFQURFUlt3ZkNvbnRhaW5lciwgd2ZPYmplY3RdCisKKwkgIHsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgUEFSU0lORyApCisJQVZNX09TX1RSQUNFIDw8IElOQ1JfSU5ERU5UX1RBQiA8PCAicGFyc2luZyB3Zk9iamVjdCA6PiAiCisJCQk8PCBzdHJfaGVhZGVyKCB3Zk9iamVjdCApIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgUEFSU0lORyApCisJICB9CisKKwkgICggZm9ybUJPRFlbd2ZDb250YWluZXIsIHdmT2JqZWN0XSApPworCisJICB7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFBBUlNJTkcgKQorCUFWTV9PU19UUkFDRSA8PCBUQUJfREVDUl9JTkRFTlQgPDwgImVuZCIgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQQVJTSU5HICkKKwkgIH0KKwk7CisKKworYU5vcm1hbEZvcm1bIFdPYmplY3QgKiB3ZkNvbnRhaW5lciBdCityZXR1cm5zIFsgV09iamVjdCAqIHdmT2JqZWN0ID0gV09iamVjdDo6X05VTExfIF0KK3sKKwl3Zk9iamVjdCA9IG1XT2JqZWN0TWFuYWdlci0+bmV3V09iamVjdCh3ZkNvbnRhaW5lciwgIiIsICIiKTsKKworCWludCBiTGluZSA9IGdldE5leHRUb2tlbkxpbmUoKTsKKwlpbnQgYk9mZnNldCA9IGdldE5leHRUb2tlblN0YXJ0SW5kZXgoKTsKK30KKwk6IGFGb3JtW3dmQ29udGFpbmVyLCB3Zk9iamVjdCwgYkxpbmUsIGJPZmZzZXRdCisKKwl8IGFQcm90b3R5cGVbd2ZDb250YWluZXIsIHdmT2JqZWN0LCBiTGluZSwgYk9mZnNldF0KKworCXwgYVdPYmplY3Rbd2ZDb250YWluZXIsIHdmT2JqZWN0LCBiTGluZSwgYk9mZnNldF0KKwk7CisKKworYVdPYmplY3RbIFdPYmplY3QgKiB3ZkNvbnRhaW5lciAsIFdPYmplY3QgKiB3Zk9iamVjdCAsIGludCBiTGluZSAsIGludCBiT2Zmc2V0IF0KK3sKKwlXT2JqZWN0ICogd29iamVjdCA9IFdPYmplY3Q6Ol9OVUxMXzsKKworCXN0ZDo6c3RyaW5nIHFuaWQgPSAiIjsKK30KKwk6IHFuaWQ9cXVhbGlmaWVkTmFtZUlEICB7IHdmT2JqZWN0LT5zZXRRdWFsaWZpZWRUeXBlTmFtZUlEKCBxbmlkICk7IH0KKworCSAgKCBxbmlkPXF1YWxpZmllZE5hbWVJRCApPworCSAgeworCQlpZiggTmFtZWRFbGVtZW50Ojppc1JlbGF0aXZlKHFuaWQpICkgeworCQkJbVdPYmplY3RNYW5hZ2VyLT5yZWdpc3RlcldPYmplY3Qod2ZPYmplY3QsIHFuaWQpOworCisJCQlxbmlkID0gbVdPYmplY3RNYW5hZ2VyLT5tYWtlRlFOKCB3ZkNvbnRhaW5lciwgcW5pZCApOworCQl9CisJCXdmT2JqZWN0LT5zZXRGdWxseVF1YWxpZmllZE5hbWVJRChxbmlkKTsKKworCQltV09iamVjdE1hbmFnZXItPnJlZ2lzdGVyV09iamVjdCggd2ZPYmplY3QgKTsKKwkgIH0KKworCSAgKCBkcXM6RG91YmxlUXVvdGVkU3RyaW5nICB7IHdmT2JqZWN0LT5zZXRVbnJlc3RyaWN0ZWROYW1lKCBkcXMtPmdldFRleHQoKSApOyB9CisJICB8IHNxczpTaW5nbGVRdW90ZWRTdHJpbmcgIHsgd2ZPYmplY3QtPnNldFVucmVzdHJpY3RlZE5hbWUoIHNxcy0+Z2V0VGV4dCgpICk7IH0KKwkgICk/CisKKwkgIExDVVJMWQorCisJICAgICggd29iamVjdD1hQ29tcG9uZW50W3dmT2JqZWN0XSAgeyBhZGRFbGVtZW50KHdmT2JqZWN0LCB3b2JqZWN0KTsgfSApKgorCisJICB7IHNldExvY2F0aW9uKHdmT2JqZWN0LCBiTGluZSwgZ2V0TmV4dFRva2VuTGluZSgpLCBiT2Zmc2V0LCBnZXROZXh0VG9rZW5TdG9wSW5kZXgoKSk7IH0KKwkgIFJDVVJMWQorCTsKKworCithRm9ybVsgV09iamVjdCAqIHdmQ29udGFpbmVyICwgV09iamVjdCAqIHdmT2JqZWN0ICwgaW50IGJMaW5lICwgaW50IGJPZmZzZXQgXQorCToga3dfZm9ybQorCisJICBmb3JtREVDTFt3ZkNvbnRhaW5lciwgd2ZPYmplY3RdCisKKwkgIHsgc2V0TG9jYXRpb24od2ZPYmplY3QsIGJMaW5lLCBnZXROZXh0VG9rZW5MaW5lKCksIGJPZmZzZXQsIGdldE5leHRUb2tlblN0b3BJbmRleCgpKTsgfQorCSAga3dfZW5kZm9ybQorCTsKKworCithUHJvdG90eXBlWyBXT2JqZWN0ICogd2ZDb250YWluZXIgLCBXT2JqZWN0ICogd2ZPYmplY3QgLCBpbnQgYkxpbmUgLCBpbnQgYk9mZnNldCBdCisJOiBrd19wcm90b3R5cGUKKworCSAgZm9ybURFQ0xbd2ZDb250YWluZXIsIHdmT2JqZWN0XQorCisJICB7IHNldExvY2F0aW9uKHdmT2JqZWN0LCBiTGluZSwgZ2V0TmV4dFRva2VuTGluZSgpLCBiT2Zmc2V0LCBnZXROZXh0VG9rZW5TdG9wSW5kZXgoKSk7IH0KKwkgIGt3X2VuZHByb3RvdHlwZQorCTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gQ09NUE9ORU5UIERFRklOSVRJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2FDb21wb25lbnQgWyBXT2JqZWN0ICogd2ZDb250YWluZXIgXQorcmV0dXJucyBbIFdPYmplY3QgKiB3Zk9iamVjdCA9IFdPYmplY3Q6Ol9OVUxMXyBdCisJOiB3Zk9iamVjdD1hV1Byb3BlcnR5W3dmQ29udGFpbmVyXQorCisJfCB3Zk9iamVjdD1hV1NlcXVlbmNlW3dmQ29udGFpbmVyXQorCisJfCB3Zk9iamVjdD1hTm9ybWFsRm9ybVt3ZkNvbnRhaW5lcl0KKworCXwgd2ZPYmplY3Q9dGFnUHJvZ3JhbVt3ZkNvbnRhaW5lcl0KKwk7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLyBzZWN0aW9uIDwlIElEICU+CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCithU2VxdWVuY2VDb21wb25lbnQgWyBXT2JqZWN0ICogd2ZDb250YWluZXIgXQorcmV0dXJucyBbIFdPYmplY3QgKiB3Zk9iamVjdCA9IFdPYmplY3Q6Ol9OVUxMXyBdCisJOiB3Zk9iamVjdD1hV1Byb3BlcnR5W3dmQ29udGFpbmVyXQorCisJfCB3Zk9iamVjdD1hTm9ybWFsRm9ybVt3ZkNvbnRhaW5lcl0KKworCXwgd2ZPYmplY3Q9dGFnUHJvZ3JhbVt3ZkNvbnRhaW5lcl0KKwk7CisKKworYVdTZXF1ZW5jZSBbIFdPYmplY3QgKiB3ZkNvbnRhaW5lciBdIHJldHVybnMgWyBXT2JqZWN0ICogc2VjdGlvbiA9IFdPYmplY3Q6Ol9OVUxMXyBdCit7CisJV09iamVjdCAqIHdvYmplY3QgPSBXT2JqZWN0OjpfTlVMTF87CisKKwlpbnQgYkxpbmUgPSBnZXROZXh0VG9rZW5MaW5lKCk7CisJaW50IGJPZmZzZXQgPSBnZXROZXh0VG9rZW5TdGFydEluZGV4KCk7Cit9CisJOiAvLyBsdmk6TGVmdFZhbHVlSWRlbnRpZmllcgorCSAgbHZpOklkZW50aWZpZXIKKwkgIHsKKwkgIAlzZWN0aW9uID0gbVdPYmplY3RNYW5hZ2VyLT5uZXdXU2VxdWVuY2Uod2ZDb250YWluZXIsIGx2aS0+Z2V0VGV4dCgpKTsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgUEFSU0lORyApCisJQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiPT5Ac2VjdGlvbiA6PiAiIDw8IHNlY3Rpb24tPmdldE5hbWVJRCgpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgUEFSU0lORyApCisJICB9CisKKwkgICggZHFzOkRvdWJsZVF1b3RlZFN0cmluZyAgeyBzZWN0aW9uLT5zZXRVbnJlc3RyaWN0ZWROYW1lKCBkcXMtPmdldFRleHQoKSApOyB9CisJICB8IHNxczpTaW5nbGVRdW90ZWRTdHJpbmcgIHsgc2VjdGlvbi0+c2V0VW5yZXN0cmljdGVkTmFtZSggc3FzLT5nZXRUZXh0KCkgKTsgfQorCSAgKT8KKwkgIExCUkFDSworCisJICAoIHdvYmplY3Q9YVNlcXVlbmNlQ29tcG9uZW50W3NlY3Rpb25dIHsgYWRkRWxlbWVudChzZWN0aW9uLCB3b2JqZWN0KTsgfSApKgorCisJICB7IHNldExvY2F0aW9uKHNlY3Rpb24sIGJMaW5lLCBnZXROZXh0VG9rZW5MaW5lKCksIGJPZmZzZXQsIGdldE5leHRUb2tlblN0b3BJbmRleCgpKTsgfQorCSAgUkJSQUNLCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gREVQUkVDQVRFRCBTWU5UQVgKKworCXwgbHZpYzpJZGVudGlmaWVyICBDT0xPTgorCSAgeworCSAgCXNlY3Rpb24gPSBtV09iamVjdE1hbmFnZXItPm5ld1dTZXF1ZW5jZSh3ZkNvbnRhaW5lciwgbHZpYy0+Z2V0VGV4dCgpKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQQVJTSU5HICkKKwlBVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICI9PkBzZWN0aW9uIDo+ICIgPDwgc2VjdGlvbi0+Z2V0TmFtZUlEKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQQVJTSU5HICkKKwkgIH0KKworCSAgKCB3b2JqZWN0PWFTZXF1ZW5jZUNvbXBvbmVudFtzZWN0aW9uXSB7IGFkZEVsZW1lbnQoc2VjdGlvbiwgd29iamVjdCk7IH0gKSoKKworCSAgeyBzZXRMb2NhdGlvbihzZWN0aW9uLCBiTGluZSwgZ2V0TmV4dFRva2VuTGluZSgpLCBiT2Zmc2V0LCBnZXROZXh0VG9rZW5TdG9wSW5kZXgoKSk7IH0KKworCXwgYXRfbHY6QXRMZWZ0VmFsdWVJZGVudGlmaWVyICAgQ09MT04KKwkgIHsKKwkgIAlzZWN0aW9uID0gbVdPYmplY3RNYW5hZ2VyLT5uZXdXU2VxdWVuY2Uod2ZDb250YWluZXIsIGF0X2x2LT5nZXRUZXh0KCkpOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFBBUlNJTkcgKQorCUFWTV9PU19UUkFDRSA8PCBUQUIgPDwgIj0+QHNlY3Rpb24gOj4gIiA8PCBzZWN0aW9uLT5nZXROYW1lSUQoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFBBUlNJTkcgKQorCSAgfQorCisJICAoIHdvYmplY3Q9YVNlcXVlbmNlQ29tcG9uZW50W3NlY3Rpb25dIHsgYWRkRWxlbWVudChzZWN0aW9uLCB3b2JqZWN0KTsgfSApKgorCisJICB7IHNldExvY2F0aW9uKHNlY3Rpb24sIGJMaW5lLCBnZXROZXh0VG9rZW5MaW5lKCksIGJPZmZzZXQsIGdldE5leHRUb2tlblN0b3BJbmRleCgpKTsgfQorCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIERFUFJFQ0FURUQgU1lOVEFYCisKKwl8ICJzZWN0aW9uIiBpZDpJZGVudGlmaWVyCisJICB7CisJICAJc2VjdGlvbiA9IG1XT2JqZWN0TWFuYWdlci0+bmV3V1NlcXVlbmNlKHdmQ29udGFpbmVyLCBpZC0+Z2V0VGV4dCgpKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBQQVJTSU5HICkKKwlBVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICI9PnNlY3Rpb24gOj4gIiA8PCBzZWN0aW9uLT5nZXROYW1lSUQoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFBBUlNJTkcgKQorCSAgfQorCisJICAoIHdvYmplY3Q9YUNvbXBvbmVudFtzZWN0aW9uXSB7IGFkZEVsZW1lbnQoc2VjdGlvbiwgd29iamVjdCk7IH0gKSoKKworCSAgeyBzZXRMb2NhdGlvbihzZWN0aW9uLCBiTGluZSwgZ2V0TmV4dFRva2VuTGluZSgpLCBiT2Zmc2V0LCBnZXROZXh0VG9rZW5TdG9wSW5kZXgoKSk7IH0KKwkgICJlbmRzZWN0aW9uIiAgeyBMVCgxKS0+Z2V0VGV4dCgpID09IGlkLT5nZXRUZXh0KCkgfT8gIGVJZDpJZGVudGlmaWVyCisJICAvL3sgc2V0TG9jYXRpb24oc2VjdGlvbiwgYkxpbmUsIGVJZC5nZXRMaW5lKCksIGJPZmZzZXQsICgoVG9rZW4pIChlSWQpKS5nZXRTdG9wSW5kZXgoKSk7IH0KKwk7CisKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gQVRUUklCVVQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2FXUHJvcGVydHkgWyBXT2JqZWN0ICogd2ZDb250YWluZXIgXQorcmV0dXJucyBbIFdPYmplY3QgKiB3ZlByb3BlcnR5ID0gV09iamVjdDo6X05VTExfIF0KK3sKKwlBVk1fT1BDT0RFIG9wOworCisJaW50IGJMaW5lID0gZ2V0TmV4dFRva2VuTGluZSgpOworCWludCBiT2Zmc2V0ID0gZ2V0TmV4dFRva2VuU3RhcnRJbmRleCgpOworfQorLy8vLy8gUFJFREVGSU5FRCBBVFRSSUJVVAorCTogKCBBdHRyX1VGSSAgICBFUSAgd2ZQcm9wZXJ0eT1hV1Byb3BlcnR5VmFsdWVbd2ZDb250YWluZXIsICJ1ZmkiXQorCisJfCBBdHRyX05BTUUgICBFUSAgd2ZQcm9wZXJ0eT1hV1Byb3BlcnR5VmFsdWVbd2ZDb250YWluZXIsICJuYW1lIl0KKworCXwgQXR0cl9UWVBFICAgRVEgIHdmUHJvcGVydHk9YVdQcm9wZXJ0eVZhbHVlW3dmQ29udGFpbmVyLCAidHlwZSJdCisKKwl8IEF0dHJfREVTSUdOIEVRICB3ZlByb3BlcnR5PWFXUHJvcGVydHlWYWx1ZVt3ZkNvbnRhaW5lciwgImRlc2lnbiJdCisKKworCXwgQXR0cl9QVUJMSUMgRVEgIHdmUHJvcGVydHk9YVdQcm9wZXJ0eVZhbHVlW3dmQ29udGFpbmVyLCAicHVibGljIl0KKworCXwgQXR0cl9TVEFUSUMgRVEgIHdmUHJvcGVydHk9YVdQcm9wZXJ0eVZhbHVlW3dmQ29udGFpbmVyLCAic3RhdGljIl0KKworCXwgQXR0cl9GSU5BTCAgRVEgIHdmUHJvcGVydHk9YVdQcm9wZXJ0eVZhbHVlW3dmQ29udGFpbmVyLCAiZmluYWwiXQorCisKKwl8IEF0dHJfVk9MQVRJTEUgIEVRICB3ZlByb3BlcnR5PWFXUHJvcGVydHlWYWx1ZVt3ZkNvbnRhaW5lciwgInZvbGF0aWxlIl0KKworCXwgQXR0cl9SRUZFUkVOQ0UgRVEgIHdmUHJvcGVydHk9YVdQcm9wZXJ0eVZhbHVlW3dmQ29udGFpbmVyLCAicmVmZXJlbmNlIl0KKworCisJfCAiZm9ybSIgb3A9YW5Bc3NpZ25PcCAgd2ZQcm9wZXJ0eT1hV1Byb3BlcnR5VmFsdWVbd2ZDb250YWluZXIsICJmb3JtIl0KKwkgIHsgd2ZQcm9wZXJ0eS0+c2V0U3BlY2lmaWVyT3AoIG9wICk7IH0KKworCXwgIm1ldGEiIG9wPWFuQXNzaWduT3AgIHdmUHJvcGVydHk9YVdQcm9wZXJ0eVZhbHVlW3dmQ29udGFpbmVyLCAibWV0YSJdCisJICB7IHdmUHJvcGVydHktPnNldFNwZWNpZmllck9wKCBvcCApOyB9CisKKworCXwgYXRfbHY6QXRMZWZ0VmFsdWVJZGVudGlmaWVyIG9wPWFuQXNzaWduT3AKKwkgIHdmUHJvcGVydHk9YVdQcm9wZXJ0eVZhbHVlW3dmQ29udGFpbmVyLCBhdF9sdi0+Z2V0VGV4dCgpXQorCSAgeyB3ZlByb3BlcnR5LT5zZXRTcGVjaWZpZXJPcCggb3AgKTsgfQorCisKKwl8IGx2OklkZW50aWZpZXIgb3A9YW5Bc3NpZ25PcAorCSAgd2ZQcm9wZXJ0eT1hV1Byb3BlcnR5VmFsdWVbd2ZDb250YWluZXIsIGx2LT5nZXRUZXh0KCldCisJICB7IHdmUHJvcGVydHktPnNldFNwZWNpZmllck9wKCBvcCApOyB9CisJKQorCisJeyBzZXRMb2NhdGlvbih3ZlByb3BlcnR5LCBiTGluZSwgZ2V0TmV4dFRva2VuTGluZSgpLCBiT2Zmc2V0LCBnZXROZXh0VG9rZW5TdG9wSW5kZXgoKSk7IH0KKwkoIFNFTUkgKT8KKwk7CisKKworYW5Bc3NpZ25PcCByZXR1cm5zIFsgQVZNX09QQ09ERSBvcCBdCisJOiBBU1NJR04gIHsgb3AgPSBBVk1fT1BDT0RFX0FTU0lHTjsgfQorCisJfCBFUSAgICAgIHsgb3AgPSBBVk1fT1BDT0RFX0VROyAgICAgfQorCXwgRVFFUSAgICB7IG9wID0gQVZNX09QQ09ERV9FUTsgICAgIH0KKwl8IE5FUSAgICAgeyBvcCA9IEFWTV9PUENPREVfTkVROyAgICB9CisKKwl8IFNFUSAgICAgeyBvcCA9IEFWTV9PUENPREVfU0VROyAgICB9CisJfCBOU0VRICAgIHsgb3AgPSBBVk1fT1BDT0RFX05TRVE7ICAgfQorCisJfCBCQU5ERVEgIHsgb3AgPSBBVk1fT1BDT0RFX0JBTkQ7ICAgfQorCXwgQk9SRVEgICB7IG9wID0gQVZNX09QQ09ERV9CT1I7ICAgIH0KKwl8IEJYT1JFUSAgeyBvcCA9IEFWTV9PUENPREVfQlhPUjsgICB9CisJfCBCTk9URVEgIHsgb3AgPSBBVk1fT1BDT0RFX0JOT1Q7ICAgfQorCisJfCBQTFVTRVEgIHsgb3AgPSBBVk1fT1BDT0RFX1BMVVM7ICAgfQorCXwgTUlOVVNFUSB7IG9wID0gQVZNX09QQ09ERV9NSU5VUzsgIH0KKwl8IE1VTFRFUSAgeyBvcCA9IEFWTV9PUENPREVfTVVMVDsgICB9CisJfCBESVZFUSAgIHsgb3AgPSBBVk1fT1BDT0RFX0RJVjsgICAgfQorCXwgTU9ERVEgICB7IG9wID0gQVZNX09QQ09ERV9NT0Q7ICAgIH0KKworCXwgR1QgICAgICB7IG9wID0gQVZNX09QQ09ERV9HVDsgICAgIH0KKwl8IEdURSAgICAgeyBvcCA9IEFWTV9PUENPREVfR1RFOyAgICB9CisJfCBMVF8gICAgIHsgb3AgPSBBVk1fT1BDT0RFX0xUOyAgICAgfQorCXwgTFRFICAgICB7IG9wID0gQVZNX09QQ09ERV9MVEU7ICAgIH0KKwk7CisKKworYVdQcm9wZXJ0eVZhbHVlIFsgV09iamVjdCAqIHdmQ29udGFpbmVyICwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhTmFtZUlEIF0KK3JldHVybnMgWyBXT2JqZWN0ICogd2ZQcm9wZXJ0eSA9IFdPYmplY3Q6Ol9OVUxMXyBdCit7CisJQkYgdmFsdWU7CisKKwlCRkNvZGUgcHJvZzsKKwlPcGVyYXRvciAqIG9wID0gTlVMTDsKKwlCRiBhcDsKK30KKy8vCTogdmFsdWU9YXZtUHJvZ3JhbVt3ZkNvbnRhaW5lcl0KKy8vCSAgeyB3ZlByb3BlcnR5ID0gbVdPYmplY3RNYW5hZ2VyLT5uZXdXUHJvcGVydHkod2ZDb250YWluZXIsIGFOYW1lSUQsIHZhbHVlKTsgfQorLy8JOworCisJOiBMUFJPRyAgb3A9YW5PcGVyYXRvciAgeyB2YWx1ZSA9IHByb2cgPSBTdGF0ZW1lbnRDb25zdHJ1Y3Rvcjo6bmV3Q29kZShvcCk7IH0KKworCQkoIGFwPWF2bVByb2dyYW1bd2ZDb250YWluZXJdICB7IHByb2ctPmFwcGVuZChhcCk7IH0gICkqCisKKwkgIC8veyBzZXRMb2NhdGlvbihwcm9nLCBiTGluZSwgZ2V0TmV4dFRva2VuTGluZSgpLCBiT2Zmc2V0LCBnZXROZXh0VG9rZW5TdG9wSW5kZXgoKSk7IH0KKwkgIFJDVVJMWQorCXsKKwkJaWYoIHByb2cuaW52YWxpZCgpIHx8IChvcCA9PSBOVUxMKSApCisJCXsKKwkJCS8vISEgUEFSU0UgRVJST1IgISEKKwkJfQorCQllbHNlIGlmKCBvcC0+aXNPcENvZGUoIEFWTV9PUENPREVfTUlOVVMgKSAmJiAocHJvZy0+c2l6ZSgpID09IDEpICkKKwkJeworCQkJcHJvZy0+c2V0T3BlcmF0b3IoIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfVU1JTlVTICk7CisJCX0KKwkJZWxzZSBpZiggb3AtPmlzT3BDb2RlKCBBVk1fT1BDT0RFX0lGICkgJiYgKHByb2ctPnNpemUoKSA9PSAzKSApCisJCXsKKwkJCXByb2ctPnNldE9wZXJhdG9yKCBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0lGRSApOworCQl9CisJCWVsc2UgaWYoIG9wLT5pc09wQ29kZSggQVZNX09QQ09ERV9JRkUgKSAmJiAocHJvZy0+c2l6ZSgpID09IDIpICkKKwkJeworCQkJcHJvZy0+c2V0T3BlcmF0b3IoIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfSUYgKTsKKwkJfQorCisJCXdmUHJvcGVydHkgPSBtV09iamVjdE1hbmFnZXIKKwkJCQktPm5ld1dQcm9wZXJ0eUV4cHJlc3Npb24od2ZDb250YWluZXIsIGFOYW1lSUQsIHZhbHVlKTsKKwl9CisKKwl8IExQQVJFTiB2YWx1ZT1leHByZXNzaW9uIFJQQVJFTgorCXsgd2ZQcm9wZXJ0eSA9IG1XT2JqZWN0TWFuYWdlcgorCQkJCS0+bmV3V1Byb3BlcnR5RXhwcmVzc2lvbih3ZkNvbnRhaW5lciwgYU5hbWVJRCwgdmFsdWUpOyB9CisKKwl8IHZhbHVlPWV4cHJlc3Npb25faW52b2tlCisJeyB3ZlByb3BlcnR5ID0gbVdPYmplY3RNYW5hZ2VyCisJCQkJLT5uZXdXUHJvcGVydHlFeHByZXNzaW9uKHdmQ29udGFpbmVyLCBhTmFtZUlELCB2YWx1ZSk7IH0KKworCXwgInRydWUiCisJeyB3ZlByb3BlcnR5ID0gbVdPYmplY3RNYW5hZ2VyCisJCQktPm5ld1dQcm9wZXJ0eUJvb2xlYW4od2ZDb250YWluZXIsIGFOYW1lSUQsIHRydWUpOyB9CisKKwl8ICJmYWxzZSIKKwl7IHdmUHJvcGVydHkgPSBtV09iamVjdE1hbmFnZXItPm5ld1dQcm9wZXJ0eUJvb2xlYW4oCisJCQkJCQkJd2ZDb250YWluZXIsIGFOYW1lSUQsIGZhbHNlKTsgfQorCisJfCBNSU5VUyBtbjpJbnRlZ2VyTnVtYmVyCisJeyB3ZlByb3BlcnR5ID0gbVdPYmplY3RNYW5hZ2VyCisJCQktPm5ld1dQcm9wZXJ0eUludGVnZXIod2ZDb250YWluZXIsIGFOYW1lSUQsICItIiArIG1uLT5nZXRUZXh0KCkpOyB9CisKKwl8IFBMVVMgIHBuOkludGVnZXJOdW1iZXIKKwl7IHdmUHJvcGVydHkgPSBtV09iamVjdE1hbmFnZXIKKwkJCS0+bmV3V1Byb3BlcnR5SW50ZWdlcih3ZkNvbnRhaW5lciwgYU5hbWVJRCwgcG4tPmdldFRleHQoKSk7IH0KKworCXwgbjpJbnRlZ2VyTnVtYmVyCisJeyB3ZlByb3BlcnR5ID0gbVdPYmplY3RNYW5hZ2VyCisJCQktPm5ld1dQcm9wZXJ0eUludGVnZXIod2ZDb250YWluZXIsIGFOYW1lSUQsIG4tPmdldFRleHQoKSk7IH0KKworCXwgTUlOVVMgbWY6RmxvYXRpbmdQb2ludE51bWJlcgorCXsgd2ZQcm9wZXJ0eSA9IG1XT2JqZWN0TWFuYWdlcgorCQkJLT5uZXdXUHJvcGVydHlGbG9hdCh3ZkNvbnRhaW5lciwgYU5hbWVJRCwgIi0iICsgbWYtPmdldFRleHQoKSk7IH0KKworCXwgUExVUyAgcGY6RmxvYXRpbmdQb2ludE51bWJlcgorCXsgd2ZQcm9wZXJ0eSA9IG1XT2JqZWN0TWFuYWdlcgorCQkJLT5uZXdXUHJvcGVydHlGbG9hdCh3ZkNvbnRhaW5lciwgYU5hbWVJRCwgcGYtPmdldFRleHQoKSk7IH0KKworCXwgZjpGbG9hdGluZ1BvaW50TnVtYmVyCisJeyB3ZlByb3BlcnR5ID0gbVdPYmplY3RNYW5hZ2VyCisJCQktPm5ld1dQcm9wZXJ0eUZsb2F0KHdmQ29udGFpbmVyLCBhTmFtZUlELCBmLT5nZXRUZXh0KCkpOyB9CisKKwl8IGNsOkNoYXJhY3RlckxpdGVyYWwKKwl7IHdmUHJvcGVydHkgPSBtV09iamVjdE1hbmFnZXItPm5ld1dQcm9wZXJ0eUNoYXJhY3RlcigKKwkJCQkJCXdmQ29udGFpbmVyLCBhTmFtZUlELCBjbC0+Z2V0VGV4dCgpLmNfc3RyKClbMF0pOyB9CisKKwl8IGRxczpEb3VibGVRdW90ZWRTdHJpbmcKKwl7IHdmUHJvcGVydHkgPSBtV09iamVjdE1hbmFnZXItPm5ld1dQcm9wZXJ0eURvdWJsZVF1b3RlU3RyaW5nKAorCQkJCQkJd2ZDb250YWluZXIsIGFOYW1lSUQsIGRxcy0+Z2V0VGV4dCgpKTsgfQorCisJfCBzcXM6U2luZ2xlUXVvdGVkU3RyaW5nCisJeyB3ZlByb3BlcnR5ID0gbVdPYmplY3RNYW5hZ2VyLT5uZXdXUHJvcGVydHlTaW5nbGVRdW90ZVN0cmluZygKKwkJCQkJCXdmQ29udGFpbmVyLCBhTmFtZUlELCBzcXMtPmdldFRleHQoKSk7IH0KKworCXwgdmFsdWU9dWZpU3RyaW5nCisJeyB3ZlByb3BlcnR5ID0gbVdPYmplY3RNYW5hZ2VyCisJCQktPm5ld1dQcm9wZXJ0eVBhcnNlZElkZW50aWZpZXIod2ZDb250YWluZXIsIGFOYW1lSUQsIHZhbHVlKTsgfQorCisJfCBCQU5EIHZhbHVlPXVmaVN0cmluZworCXsgd2ZQcm9wZXJ0eSA9IG1XT2JqZWN0TWFuYWdlcgorCQkJLT5uZXdXUHJvcGVydHlQYXJzZWRJZGVudGlmaWVyKHdmQ29udGFpbmVyLCBhTmFtZUlELCB2YWx1ZSk7IH0KKworCXwgb3A9YVN5bWJvbE9wZXJhdG9yCisJeyB3ZlByb3BlcnR5ID0gbVdPYmplY3RNYW5hZ2VyCisJCQktPm5ld1dQcm9wZXJ0eU9wZXJhdG9yKHdmQ29udGFpbmVyLCBhTmFtZUlELCBvcCk7IH0KKworCXwgdmFsdWU9YW5BcnJheUZvcm1bV09iamVjdDo6X05VTExfXQorCXsgd2ZQcm9wZXJ0eSA9IG1XT2JqZWN0TWFuYWdlcgorCQkJLT5uZXdXUHJvcGVydHlBcnJheSh3ZkNvbnRhaW5lciwgYU5hbWVJRCwgdmFsdWUpOyB9CisJOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gR0VORVJJQyBERUZJTklUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCithUmVmZXJlbmNlIHJldHVybnMgWyBCRiBmb3JtIF0KK3sKKwlCRiBiZlVGSTsKK30KKwk6IEJBTkQgYmZVRkk9dWZpU3RyaW5nCisJeworCQlmb3JtID0gbVdPYmplY3RNYW5hZ2VyLT5iZlJlZ2lzdGVyZWRXT2JqZWN0KCBiZlVGSS5zdHIoKSApOworCQlpZiggZm9ybS5pbnZhbGlkKCkgKQorCQl7CisJCQlmb3JtID0gYmZVRkk7CisJCX0KKwl9CisJOworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLyBUQUcgUFJPR1JBTSBERUZJTklUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit0YWdQcm9ncmFtIFsgV09iamVjdCAqIHdmQ29udGFpbmVyIF0gcmV0dXJucyBbIFdPYmplY3QgKiBhdHRyID0gV09iamVjdDo6X05VTExfIF0KK3sKKwlCRiBhcDsKKworCWludCBiTGluZSA9IGdldE5leHRUb2tlbkxpbmUoKTsKKwlpbnQgYk9mZnNldCA9IGdldE5leHRUb2tlblN0YXJ0SW5kZXgoKTsKK30KKwk6IGF0X2x2OkF0TGVmdFZhbHVlSWRlbnRpZmllciBMQ1VSTFkgIGFwPWF2bVByb2dyYW1bd2ZDb250YWluZXJdCisJeyBhdHRyID0gbVdPYmplY3RNYW5hZ2VyLT5uZXdXUHJvcGVydHkod2ZDb250YWluZXIsIGF0X2x2LT5nZXRUZXh0KCksIGFwKTsgfQorCisJeyBzZXRMb2NhdGlvbihhdHRyLCBiTGluZSwgZ2V0TmV4dFRva2VuTGluZSgpLCBiT2Zmc2V0LCBnZXROZXh0VG9rZW5TdG9wSW5kZXgoKSk7IH0KKwlSQ1VSTFkKKwk7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vIFBST0dSQU0gREVGSU5JVElPTgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYXZtUHJvZ3JhbSBbIFdPYmplY3QgKiB3ZkNvbnRhaW5lciBdcmV0dXJucyBbIEJGIGZvcm0gXQoreworCUJGQ29kZSBwcm9nOworCU9wZXJhdG9yICogb3AgPSBOVUxMOworCUJGIGFwOworCisvLwlpbnQgYkxpbmUgPSBnZXROZXh0VG9rZW5MaW5lKCk7CisvLwlpbnQgYk9mZnNldCA9IGdldE5leHRUb2tlblN0YXJ0SW5kZXgoKTsKK30KKwk6IExQUk9HICBvcD1hbk9wZXJhdG9yICB7IGZvcm0gPSBwcm9nID0gU3RhdGVtZW50Q29uc3RydWN0b3I6Om5ld0NvZGUob3ApOyB9CisKKwkoIGFwPWF2bVByb2dyYW1bd2ZDb250YWluZXJdICB7IHByb2ctPmFwcGVuZChhcCk7IH0gICkqCisKKwkvL3sgc2V0TG9jYXRpb24ocHJvZywgYkxpbmUsIGdldE5leHRUb2tlbkxpbmUoKSwgYk9mZnNldCwgZ2V0TmV4dFRva2VuU3RvcEluZGV4KCkpOyB9CisJUkNVUkxZCisJeworCQlpZiggcHJvZy5pbnZhbGlkKCkgfHwgKG9wID09IE5VTEwpICkKKwkJeworCQkJLy8hISBQQVJTRSBFUlJPUiAhIQorCQl9CisJCWVsc2UgaWYoIG9wLT5pc09wQ29kZSggQVZNX09QQ09ERV9NSU5VUyApICYmIChwcm9nLT5zaXplKCkgPT0gMSkgKQorCQl7CisJCQlwcm9nLT5zZXRPcGVyYXRvciggT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9VTUlOVVMgKTsKKwkJfQorCQllbHNlIGlmKCBvcC0+aXNPcENvZGUoIEFWTV9PUENPREVfSUYgKSAmJiAocHJvZy0+c2l6ZSgpID09IDMpICkKKwkJeworCQkJcHJvZy0+c2V0T3BlcmF0b3IoIE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfSUZFICk7CisJCX0KKwkJZWxzZSBpZiggb3AtPmlzT3BDb2RlKCBBVk1fT1BDT0RFX0lGRSApICYmIChwcm9nLT5zaXplKCkgPT0gMikgKQorCQl7CisJCQlwcm9nLT5zZXRPcGVyYXRvciggT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9JRiApOworCQl9CisJfQorCisJfCBMUEFSRU4gZm9ybT1leHByZXNzaW9uIFJQQVJFTgorCisJfCBmb3JtPWV4cHJlc3Npb25faW52b2tlCisKKwl8IGZvcm09YW5BdG9tCisJOworCisKK2FuT3BlcmF0b3IgcmV0dXJucyBbIE9wZXJhdG9yICogb3AgXQorCTogb3A9YVN5bWJvbE9wZXJhdG9yCisKKwl8IHsgKG9wID0gT3BlcmF0b3JNYW5hZ2VyOjpnZXRPcChMVCgxKS0+Z2V0VGV4dCgpKSkgIT0gTlVMTCB9PyBJZGVudGlmaWVyCisJOworCisKK2FTeW1ib2xPcGVyYXRvciByZXR1cm5zIFsgT3BlcmF0b3IgKiBvcCBdCisJOiBQTFVTICAgeyBvcCA9IE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfUExVUzsgICB9CisJfCBNSU5VUyAgeyBvcCA9IE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfTUlOVVM7ICB9CisJfCBNVUxUICAgeyBvcCA9IE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfTVVMVDsgICB9CisJfCBESVYgICAgeyBvcCA9IE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfRElWOyAgICB9CisJfCBNT0QgICAgeyBvcCA9IE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfTU9EOyAgICB9CisKKwl8IFBPVyAgICB7IG9wID0gT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9QT1c7ICAgIH0KKworCXwgRVEgICAgIHsgb3AgPSBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0VROyAgICAgfQorCXwgRVFFUSAgIHsgb3AgPSBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0VROyAgICAgfQorCXwgTkVRICAgIHsgb3AgPSBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX05FUTsgICAgfQorCisJfCBTRVEgICAgeyBvcCA9IE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU0VROyAgICB9CisJfCBOU0VRICAgeyBvcCA9IE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfTlNFUTsgICB9CisKKwl8IEdUICAgICB7IG9wID0gT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9HVDsgICAgIH0KKwl8IEdURSAgICB7IG9wID0gT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9HVEU7ICAgIH0KKwl8IExUXyAgICB7IG9wID0gT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9MVDsgICAgIH0KKwl8IExURSAgICB7IG9wID0gT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9MVEU7ICAgIH0KKworCXwgQk5PVCAgIHsgb3AgPSBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0JOT1Q7ICAgfQorCXwgQkFORCAgIHsgb3AgPSBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0JBTkQ7ICAgfQorCXwgQk9SICAgIHsgb3AgPSBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0JPUjsgICAgfQorCXwgQlhPUiAgIHsgb3AgPSBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0JYT1I7ICAgfQorCisJfCBMU0hJRlQgeyBvcCA9IE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfTFNISUZUOyB9CisJfCBSU0hJRlQgeyBvcCA9IE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfUlNISUZUOyB9CisKKwl8IExOT1QgICB7IG9wID0gT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9OT1Q7ICAgIH0KKwl8IExBTkQgICB7IG9wID0gT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BTkQ7ICAgIH0KKwl8IExPUiAgICB7IG9wID0gT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9PUjsgICAgIH0KKworCXwgQVNTSUdOICAgICAgICAgeyBvcCA9IE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQVNTSUdOOyB9CisKKwl8IFBVU0ggICAgICAgICAgIHsgb3AgPSBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1BVU0g7ICAgfQorCXwgUE9QICAgICAgICAgICAgeyBvcCA9IE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfUE9QOyAgICB9CisJfCBUT1AgICAgICAgICAgICB7IG9wID0gT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9UT1A7ICAgIH0KKwl8IEFTU0lHTl9UT1AgICAgIHsgb3AgPSBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0FTU0lHTl9UT1A7ICAgICB9CisKKwl8IFNFUVVFTkNFICAgICAgIHsgb3AgPSBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NFUVVFTkNFOyAgICAgICB9CisJfCBTRVFVRU5DRV9TSURFICB7IG9wID0gT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TRVFVRU5DRV9TSURFOyAgfQorCXwgU0VRVUVOQ0VfV0VBSyAgeyBvcCA9IE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfU0VRVUVOQ0VfV0VBSzsgIH0KKworCXwJSU5URVJMRUFWSU5HICAgeyBvcCA9IE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfSU5URVJMRUFWSU5HOyAgIH0KKworCXwJRVhDTFVTSVZFICAgICAgeyBvcCA9IE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfRVhDTFVTSVZFOyAgICAgIH0KKwl8IE5PTkRFVEVSTUlOSVNNIHsgb3AgPSBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX05PTkRFVEVSTUlOSVNNOyB9CisKKwl8IFBSSU9SX0dUICAgICAgIHsgb3AgPSBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1BSSU9SX0dUOyB9CisJfCBQUklPUl9MVCAgICAgICB7IG9wID0gT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9QUklPUl9MVDsgfQorCisJfCBQQVJBTExFTCAgICAgICB7IG9wID0gT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9QQVJBTExFTDsgfQorCXwgUFJPRFVDVCAgICAgICAgeyBvcCA9IE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfUFJPRFVDVDsgIH0KKworCXwgQVNZTkMgICAgICAgICAgeyBvcCA9IE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQVNZTkNIUk9OT1VTOyAgICAgICB9CisJfCBTVFJPTkdfU1lOQyAgICB7IG9wID0gT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9TVFJPTkdfU1lOQ0hST05PVVM7IH0KKwl8IFdFQUtfU1lOQyAgICAgIHsgb3AgPSBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1dFQUtfU1lOQ0hST05PVVM7ICAgfQorCTsKKworCithbkF0b20gcmV0dXJucyBbIEJGIGZvcm0gXQoreworCU9wZXJhdG9yICogb3AgPSBOVUxMOworfQorCTogInRydWUiICAgeyBmb3JtID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKHRydWUpOyB9CisJfCAiZmFsc2UiICB7IGZvcm0gPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oZmFsc2UpOyB9CisKKwl8IE1JTlVTIG1uOkludGVnZXJOdW1iZXIgIHsgZm9ybSA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3SW50ZWdlciggIi0iICsgbW4tPmdldFRleHQoKSApOyB9CisJfCBQTFVTICBwbjpJbnRlZ2VyTnVtYmVyICB7IGZvcm0gPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0ludGVnZXIoIHBuLT5nZXRUZXh0KCkgKTsgfQorCXwgbjpJbnRlZ2VyTnVtYmVyICAgICAgICAgeyBmb3JtID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdJbnRlZ2VyKCBuLT5nZXRUZXh0KCkgKTsgfQorCisJfCBNSU5VUyBtZjpGbG9hdGluZ1BvaW50TnVtYmVyICB7IGZvcm0gPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Zsb2F0KCAiLSIgKyBtZi0+Z2V0VGV4dCgpICk7IH0KKwl8IFBMVVMgIHBmOkZsb2F0aW5nUG9pbnROdW1iZXIgIHsgZm9ybSA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3RmxvYXQoIHBmLT5nZXRUZXh0KCkgKTsgfQorCXwgZjpGbG9hdGluZ1BvaW50TnVtYmVyICAgICAgICAgeyBmb3JtID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdGbG9hdCggZi0+Z2V0VGV4dCgpICk7IH0KKworCXwgY2w6Q2hhcmFjdGVyTGl0ZXJhbCAgICAgeyBmb3JtID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDaGFyKCBjbC0+Z2V0VGV4dCgpLmNfc3RyKClbMF0gKTsgfQorCisJfCBkcXM6RG91YmxlUXVvdGVkU3RyaW5nICB7IGZvcm0gPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld1N0cmluZygKKwkJCQkJCQkJCSBkcXMtPmdldFRleHQoKSAsIFN0cmluZzo6RE9VQkxFX1FVT1RFX0RFTElNSVRFUiApOyB9CisKKwl8IHNxczpTaW5nbGVRdW90ZWRTdHJpbmcgIHsgZm9ybSA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3U3RyaW5nKAorCQkJCQkJCQkJIHNxcy0+Z2V0VGV4dCgpICwgU3RyaW5nOjpTSU5HTEVfUVVPVEVfREVMSU1JVEVSICk7IH0KKworCXwgZm9ybT11ZmlTdHJpbmcKKworCXwgZm9ybT1hUmVmZXJlbmNlCisKKwl8IG9wPWFTeW1ib2xPcGVyYXRvciAgICAgIHsgZm9ybSA9IENPTlNUX0JGX09QKCBvcCApOyB9CisKKwl8IGZvcm09YW5BcnJheUZvcm1bV09iamVjdDo6X05VTExfXQorCTsKKworCithbkFycmF5Rm9ybSBbV09iamVjdCAqIHdmQ29udGFpbmVyXSAgcmV0dXJucyBbIEJGIGZvcm0gXQoreworCUJGVmVjdG9yIGFycmF5OworCisJQkYgYXA7Cit9CisJOiBMQlJBQ0sKKwkgICggYXA9YXZtUHJvZ3JhbVt3ZkNvbnRhaW5lcl0gIHsgYXJyYXkuYXBwZW5kKGFwKTsgfQorCSAgICAoIENPTU1BCisJICAgIGFwPWF2bVByb2dyYW1bd2ZDb250YWluZXJdICB7IGFycmF5LmFwcGVuZChhcCk7IH0KKwkgICAgKSoKKwkgICk/CisJIFJCUkFDSworCXsKKwlmb3JtID0gQnVpbHRpbkFycmF5OjpjcmVhdGUoYXJyYXkpOworCX0KKwk7CisKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLyBFWFBSRVNTSU9OIERFRklOSVRJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2V4cHJlc3Npb25faW52b2tlICByZXR1cm5zIFsgQkZDb2RlIGFjIF0KK3sKKwlCRiBlOworCU9wZXJhdG9yICogb3AgPSBOVUxMOworfQorCTogTFBBUkVOX0lOVk9LRQorCSAgICBlPXVuYXJ5RXhwcmVzc2lvbgorCSAgICB7IGFjID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlKE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfSU5WT0tFX01FVEhPRCwgZSk7IH0KKwkgICAgKCBpZDpJZGVudGlmaWVyICAgICAgIHsgYWMtPmFwcGVuZChQYXJzZXJVdGlsOjpnZXRJbnZva2FibGUoZSwgaWQtPmdldFRleHQoKSkpOyB9CisJICAgIHwgb3A9YVN5bWJvbE9wZXJhdG9yICB7IGFjLT5hcHBlbmQoIElOQ1JfQkYob3ApICk7IH0KKwkgICAgKQorCSAgICAoIGU9ZXhwcmVzc2lvbiAgICAgICAgICAgICAgICAgICAgIHsgYWMtPmFwcGVuZChlKTsgfSApKgorCSAgICAoICJwcm92aWRlZDoiICBlPWV4cHJlc3Npb24gICAgICAgIHsgYWMtPmFwcGVuZChlKTsgfQorCSAgICB8ICJmcm9tOiIgICAgICBlPXVuYXJ5RXhwcmVzc2lvbiAgIHsgYWMtPmFwcGVuZChlKTsgfQorCSAgICB8ICJ0bzoiICAgICAgICBlPXVuYXJ5RXhwcmVzc2lvbiAgIHsgYWMtPmFwcGVuZChlKTsgfQorCSAgICB8ICJhY3Rpdml0eToiICBvcD1hbk9wZXJhdG9yICAgICAgIHsgYWMtPmFwcGVuZCggSU5DUl9CRihvcCkgKTsgfQorCSAgICApPworCSAgUlBBUkVOCisJOworCisKK2V4cHJlc3Npb24gIHJldHVybnMgWyBCRiBleHByIF0KKwk6IGV4cHI9Y29uZGl0aW9uYWxFeHByZXNzaW9uCisJOworCitjb25kaXRpb25hbEV4cHJlc3Npb24gIHJldHVybnMgWyBCRiBleHByIF0KK3sKKwlCRiBhcmcxOworCUJGIGFyZzI7Cit9CisJOiBleHByPWNvbmRpdGlvbmFsT3JFeHByZXNzaW9uCisJKCBRVUVTVElPTiAgYXJnMT1leHByZXNzaW9uICBDT0xPTiAgYXJnMj1leHByZXNzaW9uCisJeyBleHByID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlKAorCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0lGRSwgZXhwciwgYXJnMSwgYXJnMik7IH0KKwkpPworCTsKKworY29uZGl0aW9uYWxPckV4cHJlc3Npb24gIHJldHVybnMgWyBCRiBleHByIF0KK3sKKwlCRiBhcmc7Cit9CisJOiBleHByPWNvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbgorCSggTE9SICBhcmc9Y29uZGl0aW9uYWxBbmRFeHByZXNzaW9uCisJeyBleHByID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlRmxhdCgKKwkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9PUiwgZXhwciwgYXJnKTsgfQorCSkqCisJOworCitjb25kaXRpb25hbEFuZEV4cHJlc3Npb24gIHJldHVybnMgWyBCRiBleHByIF0KK3sKKwlCRiBhcmc7Cit9CisJOiBleHByPWJpdHdpc2VPckV4cHJlc3Npb24KKwkoIExBTkQgIGFyZz1iaXR3aXNlT3JFeHByZXNzaW9uCisJeyBleHByID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlRmxhdCgKKwkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9BTkQsIGV4cHIsIGFyZyk7IH0KKwkpKgorCTsKKworYml0d2lzZU9yRXhwcmVzc2lvbiAgcmV0dXJucyBbIEJGIGV4cHIgXQoreworCUJGIGFyZzsKK30KKwk6IGV4cHI9Yml0d2lzZVhvckV4cHJlc3Npb24KKwkoIEJPUiAgYXJnPWJpdHdpc2VYb3JFeHByZXNzaW9uCisJeyBleHByID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlRmxhdCgKKwkJT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9CT1IsIGV4cHIsIGFyZyk7IH0KKwkpKgorCTsKKworYml0d2lzZVhvckV4cHJlc3Npb24gIHJldHVybnMgWyBCRiBleHByIF0KK3sKKwlCRiBhcmc7Cit9CisJOiBleHByPWJpdHdpc2VBbmRFeHByZXNzaW9uCisJKCBCWE9SICBhcmc9Yml0d2lzZUFuZEV4cHJlc3Npb24KKwl7IGV4cHIgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NvZGVGbGF0KAorCQlPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0JYT1IsIGV4cHIsIGFyZyk7IH0KKwkpKgorCTsKKworYml0d2lzZUFuZEV4cHJlc3Npb24gIHJldHVybnMgWyBCRiBleHByIF0KK3sKKwlCRiBhcmc7Cit9CisJOiBleHByPWVxdWFsaXR5RXhwcmVzc2lvbgorCSggQkFORCAgYXJnPWVxdWFsaXR5RXhwcmVzc2lvbgorCXsgZXhwciA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q29kZUZsYXQoCisJCU9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQkFORCwgZXhwciwgYXJnKTsgfQorCSkqCisJOworCisKK2VxdWFsaXR5RXhwcmVzc2lvbiAgcmV0dXJucyBbIEJGIGV4cHIgXQoreworCU9wZXJhdG9yICogb3AgPSBOVUxMOworCUJGIGFyZzsKK30KKwk6IGV4cHI9cmVsYXRpb25hbEV4cHJlc3Npb24KKwkoIG9wPWVxdWFsT3AgYXJnPXJlbGF0aW9uYWxFeHByZXNzaW9uCisJeyBleHByID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlKG9wLCBleHByLCBhcmcpOyB9CisJKT8KKwk7CisKK2VxdWFsT3AgIHJldHVybnMgWyBPcGVyYXRvciAqIG9wIF0KKwk6IEVRICAgIHsgb3AgPSBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0VROyAgIH0KKwl8IEVRRVEgIHsgb3AgPSBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0VROyAgIH0KKwl8IE5FUSAgIHsgb3AgPSBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX05FUTsgIH0KKwl8IFNFUSAgIHsgb3AgPSBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1NFUTsgIH0KKwl8IE5TRVEgIHsgb3AgPSBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX05TRVE7IH0KKwk7CisKKworcmVsYXRpb25hbEV4cHJlc3Npb24gIHJldHVybnMgWyBCRiBleHByIF0KK3sKKwlPcGVyYXRvciAqIG9wID0gTlVMTDsKKwlCRiBhcmc7Cit9CisJOiBleHByPXNoaWZ0RXhwcmVzc2lvbgorCSggb3A9cmVsYXRpb25hbE9wICBhcmc9c2hpZnRFeHByZXNzaW9uCisJeyBleHByID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlKG9wLCBleHByLCBhcmcpOyB9CisJKT8KKwk7CisKK3JlbGF0aW9uYWxPcCAgcmV0dXJucyBbIE9wZXJhdG9yICogb3AgXQorCTogTFRFICB7IG9wID0gT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9MVEU7IH0KKwl8IEdURSAgeyBvcCA9IE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfR1RFOyB9CisJfCBMVF8gIHsgb3AgPSBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0xUOyAgfQorCXwgR1QgICB7IG9wID0gT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9HVDsgIH0KKwk7CisKKworc2hpZnRFeHByZXNzaW9uICByZXR1cm5zIFsgQkYgZXhwciBdCit7CisJT3BlcmF0b3IgKiBvcCA9IE5VTEw7CisJQkYgYXJnOworfQorCTogZXhwcj1hZGRpdGl2ZUV4cHJlc3Npb24KKwkoIG9wPXNoaWZ0T3AgIGFyZz1hZGRpdGl2ZUV4cHJlc3Npb24KKwl7IGV4cHIgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NvZGUob3AsIGV4cHIsIGFyZyk7IH0KKwkpKgorCTsKKworc2hpZnRPcCAgcmV0dXJucyBbIE9wZXJhdG9yICogb3AgXQorCTogTFNISUZUICB7IG9wID0gT3BlcmF0b3JNYW5hZ2VyOjpPUEVSQVRPUl9MU0hJRlQ7ICB9CisJfCBSU0hJRlQgIHsgb3AgPSBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1JTSElGVDsgIH0KKwk7CisKKworYWRkaXRpdmVFeHByZXNzaW9uICByZXR1cm5zIFsgQkYgZXhwciBdCit7CisJT3BlcmF0b3IgKiBvcCA9IE5VTEw7CisJQkYgYXJnOworfQorCTogZXhwcj1tdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24KKwkoIG9wPWFkZGl0aXZlT3AgIGFyZz1tdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24KKwl7IGV4cHIgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0NvZGUob3AsIGV4cHIsIGFyZyk7IH0KKwkpKgorCTsKKworYWRkaXRpdmVPcCAgcmV0dXJucyBbIE9wZXJhdG9yICogb3AgXQorCTogUExVUyAgIHsgb3AgPSBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1BMVVM7ICB9CisJfCBNSU5VUyAgeyBvcCA9IE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfTUlOVVM7ICB9CisJOworCisKK211bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiAgcmV0dXJucyBbIEJGIGV4cHIgXQoreworCU9wZXJhdG9yICogb3AgPSBOVUxMOworCUJGIGFyZzsKK30KKwk6IGV4cHI9dW5hcnlFeHByZXNzaW9uCisJKCBvcD1tdWx0aXBsaWNhdGl2ZU9wICBhcmc9dW5hcnlFeHByZXNzaW9uCisJeyBleHByID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlKG9wLCBleHByLCBhcmcpOyB9CisJKSoKKwk7CisKK211bHRpcGxpY2F0aXZlT3AgIHJldHVybnMgWyBPcGVyYXRvciAqIG9wIF0KKwk6IE1VTFQgIHsgb3AgPSBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX01VTFQ7IH0KKwl8IERJViAgIHsgb3AgPSBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX0RJVjsgIH0KKwl8IE1PRCAgIHsgb3AgPSBPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX01PRDsgIH0KKwk7CisKKwordW5hcnlFeHByZXNzaW9uICByZXR1cm5zIFsgQkYgZXhwciBdCisJOiBleHByPWxpdGVyYWwKKworLyoKKwl8IFBMVVMgICBleHByPXVuYXJ5RXhwcmVzc2lvbgorCXsgZXhwciA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q29kZShPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1BMVVMsIGV4cHIpOyB9CisKKwl8IE1JTlVTICBleHByPXVuYXJ5RXhwcmVzc2lvbgorCXsgZXhwciA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q29kZShPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX1VNSU5VUywgZXhwcik7IH0KKworCXwgSU5DUiAgIGV4cHI9dW5hcnlFeHByZXNzaW9uCisJeyBleHByID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlKE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfSU5DUiwgZXhwcik7IH0KKworCXwgREVDUiAgIGV4cHI9dW5hcnlFeHByZXNzaW9uCisJeyBleHByID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlKE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfREVDUiwgZXhwcik7IH0KKyovCisKKwl8IExOT1QgICBleHByPXVuYXJ5RXhwcmVzc2lvbgorCXsgZXhwciA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Q29kZShPcGVyYXRvck1hbmFnZXI6Ok9QRVJBVE9SX05PVCwgZXhwcik7IH0KKworCXwgQk5PVCAgIGV4cHI9dW5hcnlFeHByZXNzaW9uCisJeyBleHByID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDb2RlKE9wZXJhdG9yTWFuYWdlcjo6T1BFUkFUT1JfQk5PVCwgZXhwcik7IH0KKworCisvLwl8IHByaW1hcnkgKCBJTkNSIHwgREVDUiApPworCisKKwl8IGV4cHI9ZXhwcmVzc2lvbl9pbnZva2UKKworCXwgTFBBUkVOIGV4cHI9ZXhwcmVzc2lvbiBSUEFSRU4KKwk7CisvKgorcHJpbWFyeSAgcmV0dXJucyBbIEJGIGV4cHIgXQorCTogSUQKKwkoICggRE9UIElEICkKKwl8ICggTEJSQUNLRVQgZXhwcmVzc2lvbiBSQlJBQ0tFVCApCisJfCBMUEFSRU4gKCBleHByZXNzaW9uICggQ09NTUEgZXhwcmVzc2lvbiApKiApPyBSUEFSRU4KKwkpKgorCTsKKyovCisKK2xpdGVyYWwgIHJldHVybnMgWyBCRiBleHByIF0KK3sKKy8vCU9wZXJhdG9yICogb3AgPSBOVUxMOworfQorCTogInRydWUiICAgeyBleHByID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKHRydWUpOyB9CisJfCAiZmFsc2UiICB7IGV4cHIgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oZmFsc2UpOyB9CisKKwl8IE1JTlVTIG1uOkludGVnZXJOdW1iZXIgIHsgZXhwciA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3SW50ZWdlciggIi0iICsgbW4tPmdldFRleHQoKSApOyB9CisJfCBQTFVTICBwbjpJbnRlZ2VyTnVtYmVyICB7IGV4cHIgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0ludGVnZXIoIHBuLT5nZXRUZXh0KCkgKTsgfQorCXwgbjpJbnRlZ2VyTnVtYmVyICAgICAgICAgeyBleHByID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdJbnRlZ2VyKCBuLT5nZXRUZXh0KCkgKTsgfQorCisJfCBNSU5VUyBtZjpGbG9hdGluZ1BvaW50TnVtYmVyICB7IGV4cHIgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Zsb2F0KCAiLSIgKyBtZi0+Z2V0VGV4dCgpICk7IH0KKwl8IFBMVVMgIHBmOkZsb2F0aW5nUG9pbnROdW1iZXIgIHsgZXhwciA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3RmxvYXQoIHBmLT5nZXRUZXh0KCkgKTsgfQorCXwgZjpGbG9hdGluZ1BvaW50TnVtYmVyICAgICAgICAgeyBleHByID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdGbG9hdCggZi0+Z2V0VGV4dCgpICk7IH0KKworCXwgY2w6Q2hhcmFjdGVyTGl0ZXJhbCAgICAgeyBleHByID0gRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDaGFyKCBjbC0+Z2V0VGV4dCgpLmNfc3RyKClbMF0gKTsgfQorCisJfCBkcXM6RG91YmxlUXVvdGVkU3RyaW5nICB7IGV4cHIgPSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld1N0cmluZygKKwkJCQkJCQkJCSBkcXMtPmdldFRleHQoKSAsIFN0cmluZzo6RE9VQkxFX1FVT1RFX0RFTElNSVRFUiApOyB9CisKKwl8IHNxczpTaW5nbGVRdW90ZWRTdHJpbmcgIHsgZXhwciA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3U3RyaW5nKAorCQkJCQkJCQkJIHNxcy0+Z2V0VGV4dCgpICwgU3RyaW5nOjpTSU5HTEVfUVVPVEVfREVMSU1JVEVSICk7IH0KKworCXwgZXhwcj11ZmlTdHJpbmcKKworCXwgZXhwcj1hUmVmZXJlbmNlCisKKy8vfCBvcD1hU3ltYm9sT3BlcmF0b3IgICAgICB7IGV4cHIgPSBDT05TVF9CRl9PUCggb3AgKTsgfQorCisJfCBleHByPWFuQXJyYXlGb3JtW1dPYmplY3Q6Ol9OVUxMX10KKwk7CisKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKworY2xhc3MgV29ya2Zsb3dMZXhlciBleHRlbmRzIExleGVyOworCitvcHRpb25zCit7CisJY2hhclZvY2FidWxhcnkgPSAnXDAnLi4nXDM3Nyc7CisJayA9IDY7CQkJCQkJLy8gZm91ciBjaGFyYWN0ZXJzIG9mIGxvb2thaGVhZAorCisJdGVzdExpdGVyYWxzID0gZmFsc2U7CQkvLyBkb24ndCBhdXRvbWF0aWNhbGx5IHRlc3QgZm9yIGxpdGVyYWxzCisKKwljYXNlU2Vuc2l0aXZlID0gdHJ1ZTsKKwljYXNlU2Vuc2l0aXZlTGl0ZXJhbHMgPSB0cnVlOworfQorCisvKiBDUFAgKi8KK3sKKworcHJpdmF0ZToKKworCWF2bV9zaXplX3QgICBub09mRXJyb3JzOworCisKK3B1YmxpYzoKKworYXZtX3NpemVfdCBoYXNFcnJvcigpIGNvbnN0Cit7CisJcmV0dXJuKCBub09mRXJyb3JzID4gMCApOworfQorCithdm1fc2l6ZV90IG51bWJlck9mRXJyb3JzKCkgY29uc3QKK3sKKwlyZXR1cm4gbm9PZkVycm9yczsKK30KKwordm9pZCByZXNldEVycm9ycygpCit7CisJbm9PZkVycm9ycyA9IDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyB2ZXJzaW9uSW5mbygpCit7CisJc3RhdGljIHN0ZDo6c3RyaW5nICAgaW5mbyA9ICIkSWQ6IExpYUxleGVyLmcsIHYgMC4xIDIwMDUvMTAvMjAgTGFwaXRyZSAkIjsKKworCXJldHVybiBpbmZvOworfQorCisKK3Byb3RlY3RlZDoKKwordm9pZCByZXBvcnRFcnJvciggY29uc3Qgc3RkOjpzdHJpbmcgJiBlcnJvck1lc3NhZ2UgKQoreworCXJlcG9ydE1lc3NhZ2UoIGVycm9yTWVzc2FnZSApOworCSsrbm9PZkVycm9yczsKK30KKwordm9pZCByZXBvcnRNZXNzYWdlKCBjb25zdCBzdGQ6OnN0cmluZyAmIG1lc3NhZ2UgKSBjb25zdAoreworCWlmICggZ2V0RmlsZW5hbWUoKS5sZW5ndGgoKSA+IDAgKQorCXsKKwkJQVZNX09TX0NFUlIgPDwgZ2V0RmlsZW5hbWUoKSA8PCAiOiI7CisJfQorCisJQVZNX09TX0NFUlIgPDwgZ2V0TGluZSgpIDw8ICI6IiA8PCBnZXRDb2x1bW4oKQorCQkJCTw8ICIgW2Vycm9yXSAiIDw8IG1lc3NhZ2UgPDwgc3RkOjplbmRsOworfQorCit9CisvKiBlbmQgQ1BQICovCisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gT1BFUkFUT1JTIFNZTUJPTFMgTElURVJBTAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQVQgICAgICAgICAgICAgICAgOiAnQCcgICA7CisKK1BMVVMgICAgICAgICAgICAgIDogJysnICAgOworTUlOVVMgICAgICAgICAgICAgOiAnLScgICA7CitNT0QJCQkJICA6ICclJwkgIDsKK01VTFQgICAgICAgICAgICAgIDogJyonICAgOworRElWCSAgICAgICAgICAgICAgOiAnLycgICA7CisKK1BPVwkgICAgICAgICAgICAgIDogJ14nIHwgIioqIiA7CisKK0FTU0lHTiAgICAgICAgICAgIDogIjo9IiAgOworCitQVVNIICAgICAgICAgICAgICA6ICI8PTwiIDsKK0FTU0lHTl9UT1AgICAgICAgIDogIl49PCIgOworVE9QICAgICAgICAgICAgICAgOiAiXj0+IiA7CitQT1AgICAgICAgICAgICAgICA6ICI+PT4iIDsKKworRVEgICAgICAgICAgICAgICAgOiAnPScgICA7CisKK0JBTkRFUSAgICAgICAgICAgIDogIiY9IiAgOworQk9SRVEgICAgICAgICAgICAgOiAifD0iICA7CitCWE9SRVEgICAgICAgICAgICA6ICJePSIgIDsKK0JOT1RFUSAgICAgICAgICAgIDogIn49IiAgOworCitQTFVTRVEgICAgICAgICAgICA6ICIrPSIgIDsKK01JTlVTRVEgICAgICAgICAgIDogIi09IiAgOworTVVMVEVRICAgICAgICAgICAgOiAiKj0iICA7CitESVZFUSAgICAgICAgICAgICA6ICIvPSIgIDsKK01PREVRICAgICAgICAgICAgIDogIiU9IiAgOworCitFUUVRICAgICAgICAgICAgICA6ICI9PSIgIDsKK05FUSAgICAgICAgICAgICAgIDogIiE9IiAgOworU0VRICAgICAgICAgICAgICAgOiAiPT09IiA7CitOU0VRICAgICAgICAgICAgICA6ICI9Lz0iIDsKKworR1QgICAgICAgICAgICAgICAgOiAnPicgICA7CitHVEUgICAgICAgICAgICAgICA6ICI+PSIgIDsKK0xUXyAgICAgICAgICAgICAgIDogJzwnICAgOworTFRFICAgICAgICAgICAgICAgOiAiPD0iICA7CisKK0JBTkQgICAgICAgICAgICAgIDogJyYnICAgOworQk9SICAgICAgICAgICAgICAgOiAnfCcgICA7CitCWE9SICAgICAgICAgICAgICA6ICdeJyAgIDsKK0JOT1QgICAgICAgICAgICAgIDogJ34nICAgOworCitMU0hJRlQgICAgICAgICAgICA6ICI8PCIgIDsKK1JTSElGVCAgICAgICAgICAgIDogIj4+IiAgOworCisKK0xBTkQgICAgICAgICAgICAgIDogIiYmIiAgOworTE9SICAgICAgICAgICAgICAgOiAifHwiICA7CitMTk9UICAgICAgICAgICAgICA6ICchJyAgIDsKKworTFBBUkVOICAgICAgICAgICAgOiAnKCcgICA7CitSUEFSRU4gICAgICAgICAgICA6ICcpJyAgIDsKKworTFBBUkVOX0lOVk9LRSAgICAgOiAiKDoiICA7CisKK0xCUkFDSyAgICAgICAgICAgIDogJ1snICAgOworUkJSQUNLICAgICAgICAgICAgOiAnXScgICA7CisKKworTENVUkxZICAgICAgICAgICAgOiAneycgICA7CitSQ1VSTFkgICAgICAgICAgICA6ICd9JyAgIDsKKworTFBST0cgICAgICAgICAgICAgOiAiJHsiICA7CisKK0xHRU5FUklDICAgICAgICAgIDogIjwlIiAgOworUkdFTkVSSUMgICAgICAgICAgOiAiJT4iICA7CisKK0NPTU1BICAgICAgICAgICAgIDogJywnICAgOworU0VNSSAgICAgICAgICAgICAgOiAnOycgICA7CitDT0xPTiAgICAgICAgICAgICA6ICc6JyAgIDsKK0NPTE9OMiAgICAgICAgICAgIDogIjo6IiAgOworQ09MT05fU0xBU0ggICAgICAgOiAiOi8iICA7CitET1QgICAgICAgICAgICAgICA6ICcuJyAgIDsKK1FVRVNUSU9OICAgICAgICAgIDogJz8nICAgOworCitHVF9DT0xPTiAgICAgICAgICA6ICI+OiIgIDsKKworQVJST1cgICAgICAgICAgICAgOiAiLT4iICA7CisKKworSU5URVJMRUFWSU5HICAgICAgOiAifGl8IiAgIDsKKworQVNZTkMgICAgICAgICAgICAgOiAifGF8IiAgIDsKK1NUUk9OR19TWU5DICAgICAgIDogInxhbmR8IiA7CitXRUFLX1NZTkMgICAgICAgICA6ICJ8b3J8IiAgOworUEFSQUxMRUwgICAgICAgICAgOiAifCx8IiAgIDsKK1BST0RVQ1QgICAgICAgICAgIDogInx4fCIgICA7CisKK0VYQ0xVU0lWRSAgICAgICAgIDogInx4b3J8IiA7CitOT05ERVRFUk1JTklTTSAgICA6ICJ8L1xcfCIgOworCitQUklPUl9HVCAgICAgICAgICA6ICJ8PnwiICAgOworUFJJT1JfTFQgICAgICAgICAgOiAifDx8IiAgIDsKKworU0VRVUVOQ0UgICAgICAgICAgOiAifDt8IiAgIDsKK1NFUVVFTkNFX1NJREUgICAgIDogInwvO3wiICA7CitTRVFVRU5DRV9XRUFLICAgICA6ICJ8Ozt8IiAgOworCisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gQVRUUklCVVRFIExWQUxVRQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQXR0cl9QVUJMSUMKKwk6ICJAcHVibGljIgorCTsKKworQXR0cl9TVEFUSUMKKwk6ICJAc3RhdGljIgorCTsKKworQXR0cl9GSU5BTAorCTogIkBmaW5hbCIKKwk7CisKK0F0dHJfVk9MQVRJTEUKKwk6ICJAdm9sYXRpbGUiCisJOworCitBdHRyX1JFRkVSRU5DRQorCTogIkByZWZlcmVuY2UiCisJOworCitBdHRyX1VGSQorCTogIkB1ZmkiCisJOworCitBdHRyX05BTUUKKwk6ICJAbmFtZSIKKwk7CisKK0F0dHJfVFlQRQorCTogIkB0eXBlIgorCTsKKworQXR0cl9ERVNJR04KKwk6ICJAZGVzaWduIgorCTsKKworQXR0cl9ESVZFUlNJVFkKKwk6ICJAZGl2ZXJzaXR5IgorCTsKKworQXR0cl9GQVZNCisJOiAiQGZhdm0iCisJOworCitBdHRyX1NFVworCTogIkBzZXciCisJOworCisKKworCitBdExlZnRWYWx1ZUlkZW50aWZpZXIKKwk6CUFUICEgIExlZnRWYWx1ZUlkZW50aWZpZXIKKwk7CisKK3Byb3RlY3RlZAorTGVmdFZhbHVlSWRlbnRpZmllcgorCTogKCB+KCAnOicgfCAnPScgfCAneycgfCAnWycgfCAnICcgfCAnXHQnIHwgJ1xmJyB8ICdcbicgfCdccicgKSApKworCTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gTlVNRVJJQyBMSVRFUkFMCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisKKy8vIE51bWVyaWMgQ29uc3RhbnRzOgorCitwcm90ZWN0ZWQKK0xvbmdTdWZmaXgKKwk6CSdsJworCXwJJ0wnCisJOworCitwcm90ZWN0ZWQKK1Vuc2lnbmVkU3VmZml4CisJOgkndScKKwl8CSdVJworCTsKKworcHJvdGVjdGVkCitGbG9hdFN1ZmZpeAorCToJJ2YnCisJfAknRicKKwl8CSdkJworCXwJJ0QnCisJOworCitwcm90ZWN0ZWQKK0V4cG9uZW50CisJOgorCQkoJ2UnfCdFJykgKCcrJ3wnLScpPyAoRGlnaXQpKworCTsKKworTnVtYmVyCisJOiAoIChEaWdpdCkrICgnLicgfCAnZScgfCAnRScpICk9PgorCQkoRGlnaXQpKworCQkoICcuJyAoRGlnaXQpKiAoRXhwb25lbnQpPworCQl8IEV4cG9uZW50CisJCSkKKwkJKEZsb2F0U3VmZml4CisJCXxMb25nU3VmZml4CisJCSk/ICAgICAgICAgICAgICAgICAgICAgICAgIHtfdHR5cGUgPSBGbG9hdGluZ1BvaW50TnVtYmVyO30KKworCXwgJy4nCisJCSgJKERpZ2l0KSsgKEV4cG9uZW50KT8KKwkJCShGbG9hdFN1ZmZpeAorCQkJfExvbmdTdWZmaXgKKwkJCSk/CisJCSkgICAgICAgICAgICAgICAgICAgICAgICAgIHtfdHR5cGUgPSBGbG9hdGluZ1BvaW50TnVtYmVyO30KKworCXwgKERpZ2l0KSsKKwkJKExvbmdTdWZmaXgKKwkJfFVuc2lnbmVkU3VmZml4CisJCSkqICAgICAgICAgICAgICAgICAgICAgICAgIHtfdHR5cGUgPSBJbnRlZ2VyTnVtYmVyO30KKwk7CisKKworCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vIENIQVIgU1RSSU5HIExJVEVSQUwKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKworQ2hhcmFjdGVyTGl0ZXJhbAorCTogJ1wnJyEgQ0hBUiAnXCcnIQorCTsKKworcHJvdGVjdGVkCitDSEFSCisJOiAoIEVzY2FwZVNlcXVlbmNlIHwgfignXCcnfCdcXCcpICkKKwk7CisKKworRG91YmxlUXVvdGVkU3RyaW5nCisJOiAnIichICBEUVMgICciJyEKKwk7CisKK3Byb3RlY3RlZAorRFFTCisJOiAoIEVzY2FwZVNlcXVlbmNlIHwgfiggJ1xcJyB8ICciJyApICkqCisJOworCisKK1NpbmdsZVF1b3RlZFN0cmluZworCTogJ1wnJyEgIFNRUyAgJ1wnJyEKKwk7CisKK3Byb3RlY3RlZAorU1FTCisJOiAoIEVzY2FwZVNlcXVlbmNlIHwgfiggJ1xcJyB8ICdcJycgKSApICggRXNjYXBlU2VxdWVuY2UgfCB+KCAnXFwnIHwgJ1wnJyApICkrCisJOworCisKK3Byb3RlY3RlZAorRXNjYXBlU2VxdWVuY2UKKwk6ICdcXCcgKCdiJ3wndCd8J24nfCdmJ3wncid8J1wiJ3wnXCcnfCdcXCcpCisJfCBVbmljb2RlRXNjYXBlCisJfCBPY3RhbEVzY2FwZQorCTsKKworcHJvdGVjdGVkCitPY3RhbEVzY2FwZQorCTogJ1xcJyAoJzAnLi4nMycpICgnMCcuLic3JykgKCcwJy4uJzcnKQorCXwgJ1xcJyAoJzAnLi4nNycpICgnMCcuLic3JykKKwl8ICdcXCcgKCcwJy4uJzcnKQorCTsKKworcHJvdGVjdGVkCitVbmljb2RlRXNjYXBlCisJOiAgICdcXCcgJ3UnIEhleERpZ2l0IEhleERpZ2l0IEhleERpZ2l0IEhleERpZ2l0CisJOworCitwcm90ZWN0ZWQKK0hleERpZ2l0CisJOiAoIERpZ2l0IHwgJ2EnLi4nZicgfCAnQScuLidGJyApCisJOworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLyBJREVOVElGSUVSCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKgorVUZJCisJOiBJZGVudGlmaWVyICggJy4nIElkZW50aWZpZXIgKSsKKwk7CitVZmlMb2NhdG9yCisJOiBMZXR0ZXIgKCBMZXR0ZXIgfCBEaWdpdCApKiAoICcjJyAoIERpZ2l0ICkrICk/ICAoQ09MT05fU0xBU0h8Q09MT04yKSEKKwk7CisKKyovCisKKworSWRlbnRpZmllcgorb3B0aW9ucyB7IHRlc3RMaXRlcmFscz10cnVlOyB9CisJOiAgIExldHRlciAoIExldHRlciB8IERpZ2l0IHwgJyMnIHwgJy8nICkqCisJOworCisvKipJIGZvdW5kIHRoaXMgY2hhciByYW5nZSBpbiBKYXZhQ0MncyBncmFtbWFyLCBidXQgTGV0dGVyIGFuZCBEaWdpdCBvdmVybGFwLgorICAgU3RpbGwgd29ya3MsIGJ1dC4uLgorKi8KK3Byb3RlY3RlZAorTGV0dGVyCisJOgknQScuLidaJworCXwJJ2EnLi4neicKKworCXwJJyQnCisJfAknXycKKwk7CisKK3Byb3RlY3RlZAorRGlnaXQKKwk6ICcwJy4uJzknCisJOworCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vIENPTU1FTlQgUlVMRQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gU2luZ2xlLWxpbmUgY29tbWVudHMKK1NMX0NPTU1FTlQKKwk6CSIvLyIgICh+KCdcbid8J1xyJykpKiAoJ1xuJ3wnXHInKCdcbicpPyk/CisJeworCSRzZXRUeXBlKGFudGxyOjpUb2tlbjo6U0tJUCk7CisJbmV3bGluZSgpOworCX0KKwk7CisKKy8vIE11bHRpLWxpbmUgY29tbWVudHMKK0NPTU1FTlRfTVVMVElfTElORQorCTogIi8qIgorCSggb3B0aW9ucyB7IGdlbmVyYXRlQW1iaWdXYXJuaW5ncz1mYWxzZTsgfQorCToJeyBMQSgyKSAhPSAnLycgfT8gJyonCisJfAknXHInICdcbicJeyBuZXdsaW5lKCk7IH0KKwl8CSdccicJCXsgbmV3bGluZSgpOyB9CisJfAknXG4nCQl7IG5ld2xpbmUoKTsgfQorCXwgICB+KCcqJyB8ICdcbicgfCAnXHInKQorCSkqCisJIiovIgorCXsKKwkkc2V0VHlwZShhbnRscjo6VG9rZW46OlNLSVApOworCX0KKwk7CisKK0NPTU1FTlRfTVVMVElfTElORV8yCisJOiAiKCoiCisJKCBvcHRpb25zIHsgZ2VuZXJhdGVBbWJpZ1dhcm5pbmdzPWZhbHNlOyB9CisJOgl7IExBKDIpICE9ICcpJyB9PyAnKicKKwl8CSdccicgJ1xuJwl7IG5ld2xpbmUoKTsgfQorCXwJJ1xyJwkJeyBuZXdsaW5lKCk7IH0KKwl8CSdcbicJCXsgbmV3bGluZSgpOyB9CisJfCAgIH4oJyonIHwgJ1xuJyB8ICdccicpCisJKSoKKwkiKikiCisJeworCSRzZXRUeXBlKGFudGxyOjpUb2tlbjo6U0tJUCk7CisJfQorCTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8gV0hJVEVTUEFDRSBJR05PUkVECisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitXSElURVNQQUNFCisJOiAoICcgJyB8CSdcdCcgfCAnXGYnIHwKKwkvLyBoYW5kbGUgbmV3bGluZXMKKwkgICgKKwkgICAgIlxyXG4iICAvLyBFdmlsIERPUworCSAgfAknXHInICAgIC8vIE1hY2ludG9zaAorCSAgfAknXG4nICAgIC8vIFVuaXggKHRoZSByaWdodCB3YXkpCisJICApCisJICB7IG5ld2xpbmUoKTsgfQorCSkKKwl7CisJCSRzZXRUeXBlKGFudGxyOjpUb2tlbjo6U0tJUCk7CisJfQorCTsKKworCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wcmludGVyL0NNYWtlTGlzdHMudHh0IGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcHJpbnRlci9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGEyN2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcHJpbnRlci9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDE1IEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorIyAgICAgICAgICAgICAgICAgICAgQ01ha2UgZmlsZSBmb3IgdGhlIFBSSU5URVIgbGlicmFyeQ0KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisNCisjIEMrKyBzb3VyY2UgZmlsZXMgdG8gdGFrZSBpbnRvIGFjY291bnQgKGFsbCBmaWxlcyBtYXRjaGluZyBwYXR0ZXJucykNCitmaWxlIChHTE9CIFBSSU5URVJfQ1hYX1NSQ19GSUxFUyAqLmNwcCAqLmgpDQorDQorIyBUYXJnZXQgdG8gYnVpbGQNCithZGRfbGlicmFyeSAocHJpbnRlciBTVEFUSUMgJHtQUklOVEVSX0NYWF9TUkNfRklMRVN9KQ0KKw0KKyMgSW5jbHVkZSBkaXJlY3RvcmllcyAoaW50ZXJuYWwpDQordGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMgKHByaW50ZXIgUFVCTElDIC4uKSAjwqBGSVhNRSA6IGV4cGxpY2l0IHRoZSBkZXBlbmRlbmNpZXMgbGliIGJ5IGxpYg0KKw0KKyMgVGFyZ2V0IGluY2x1ZGUgZGlyZWN0b3JpZXMgKGV4dGVybmFsKQ0KK3RhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzIChwcmludGVyIFBVQkxJQyAke0Jvb3N0X0lOQ0xVREVfRElSU30pDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcHJpbnRlci9NYW5pcHVsYXRvcnMuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcHJpbnRlci9NYW5pcHVsYXRvcnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYWI1OGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wcmludGVyL01hbmlwdWxhdG9ycy5jcHAKQEAgLTAsMCArMSw1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDIganVpbiAyMDE2CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgSW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJNYW5pcHVsYXRvcnMuaCIKKworbmFtZXNwYWNlIHNlcCB7CisKKworLyoqCisgKiBERUZBVUxUIFZBTFVFIENTUworICovCitTeW1iZXhWYWx1ZUNTUyBERUZBVUxUX1NZTUJFWF9WQUxVRV9BUlJBWV9DU1MgKCAiWyAiLCAiICwgIiwgIiBdIiApOworCitTeW1iZXhWYWx1ZUNTUyBERUZBVUxUX1NZTUJFWF9WQUxVRV9QQVJBTVNfQ1NTICggIiggIiwgIiAsICIsICIgKSIgKTsKKworU3ltYmV4VmFsdWVDU1MgREVGQVVMVF9TWU1CRVhfVkFMVUVfU1RSVUNUX0NTUyggInsgIiwgIiAsICIsICIgfSIgKTsKKworCisvKioKKyAqIERFRkFVTFQgQVZNIElOREVOVAorICovCitBdm1JbmRlbnQgQVZNX1RBQl9JTkRFTlQgKCAiIiAgICwgIlx0IiAsICJcbiIgKTsKKworQXZtSW5kZW50IEFWTV9UQUIxX0lOREVOVCggIlx0IiAsICJcdCIgLCAiXG4iICk7CisKKworQXZtSW5kZW50IEFWTV9TUENfSU5ERU5UICggIiIgICAsICIgIiAgLCAiXG4iICk7CisKK0F2bUluZGVudCBBVk1fU1BDMV9JTkRFTlQoICIgIiAgLCAiICIgICwgIlxuIiApOworCisKK0F2bUluZGVudCBBVk1fU1RSX0lOREVOVCggIiAiICAgLCAiIiAgICwgIiIgICApOworCitBdm1JbmRlbnQgQVZNX1JUU19JTkRFTlQoICIiICAgICwgIiIgICAsICIgIiAgKTsKKworQXZtSW5kZW50IEFWTV9OT19JTkRFTlQgKCAiIiAgICAsICIiICAgLCAiIiAgICk7CisKKy8vIERlZmF1bHQgb3V0cHV0IC8gZnNjbiBmaWxlIGluZGVudAorQXZtSW5kZW50IEFWTV9PVVRQVVRfSU5ERU5UKCAiIiAsICJcdCIgLCAiXG4iICk7CisKK0F2bUluZGVudCBBVk1fRlNDTl9JTkRFTlQgICggIiIgLCAiXHQiICwgIlxuIiApOworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcHJpbnRlci9NYW5pcHVsYXRvcnMuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3ByaW50ZXIvTWFuaXB1bGF0b3JzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhhNDcwYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3ByaW50ZXIvTWFuaXB1bGF0b3JzLmgKQEAgLTAsMCArMSw4NjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyIGp1aW4gMjAxNgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIEltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFBSSU5URVJfTUFOSVBVTEFUT1JTX0hfCisjZGVmaW5lIFBSSU5URVJfTUFOSVBVTEFUT1JTX0hfCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKworbmFtZXNwYWNlIHNlcCB7CisKKworLy9jbGFzcyBNYW5pcHVsYXRvcnMgeworLy9wdWJsaWM6CisvLwlNYW5pcHVsYXRvcnMoKSB7CisvLwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCisvLworLy8JfQorLy8JdmlydHVhbCB+TWFuaXB1bGF0b3JzKCkgeworLy8JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgZGVzdHJ1Y3RvciBzdHViCisvLwl9CisvL307CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIE1BTklQVUxBVE9SUworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKworCisvKioKKyAqIEF2bVRBQgorICovCitzdHJ1Y3QgQXZtVEFCCit7CisJc3RkOjpzaXplX3QgY291bnQ7CisKKwlBdm1UQUIoc3RkOjpzaXplX3QgbikKKwk6IGNvdW50KCBuICkKKwl7CisJCS8vISEgTk9USElORworCX0KK307CisKK2lubGluZSBBdm1UQUIgdGFiKHN0ZDo6c2l6ZV90IG4pCit7CisJcmV0dXJuKCBuICk7Cit9CisKKworLyoqCisgKiBBdm1FT0wKKyAqLworc3RydWN0IEF2bUVPTAoreworCXN0ZDo6c2l6ZV90IGNvdW50OworCisJQXZtRU9MKHN0ZDo6c2l6ZV90IG4pCisJOiBjb3VudCggbiApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9Cit9OworCitpbmxpbmUgQXZtRU9MIGVvbChzdGQ6OnNpemVfdCBuKQoreworCXJldHVybiggbiApOworfQorCisKKy8qKgorICogQXZtSU5DUgorICovCitzdHJ1Y3QgQXZtSU5DUgoreworCXN0ZDo6c2l6ZV90IGNvdW50OworCisJQXZtSU5DUihzdGQ6OnNpemVfdCBuKQorCTogY291bnQoIG4gKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorfTsKKworaW5saW5lIEF2bUlOQ1IgaW5jcihzdGQ6OnNpemVfdCBuKQoreworCXJldHVybiggbiApOworfQorCisKKy8qKgorICogQXZtREVDUgorICovCitzdHJ1Y3QgQXZtREVDUgoreworCXN0ZDo6c2l6ZV90IGNvdW50OworCisJQXZtREVDUihzdGQ6OnNpemVfdCBuKQorCTogY291bnQoIG4gKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorfTsKKworaW5saW5lIEF2bURFQ1IgZGVjcihzdGQ6OnNpemVfdCBuKQoreworCXJldHVybiggbiApOworfQorCisKKworLyoqCisgKiBBdXRvbWF0aWMgbWVjaGFuaXNtIGZvcgorICogPHJlZmVyZW5jZT4udG9TdHJlYW0oIG9zICkKKyAqLwordGVtcGxhdGU8IGNsYXNzIFQgPgorc3RydWN0IF9yZWZTdHJlYW1fCit7CisJY29uc3QgVCAmIHJlZjsKKworCS8vIENPTlNUUlVDVE9SCisJX3JlZlN0cmVhbV8oY29uc3QgVCAmIGFSZWYpCisJOiByZWYoIGFSZWYgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorfTsKKworLyoqCisgKiBBdXRvbWF0aWMgbWVjaGFuaXNtIGZvcgorICogPHBvaW50ZXI+LT50b1N0cmVhbSggb3MgKQorICovCit0ZW1wbGF0ZTwgY2xhc3MgVCA+CitzdHJ1Y3QgX3B0clN0cmVhbV8KK3sKKwlUICogcHRyOworCisJLy8gQ09OU1RSVUNUT1IKKwlfcHRyU3RyZWFtXyhUICogYVB0cikKKwk6IHB0ciggYVB0ciApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9Cit9OworCisKKy8qKgorICogdG9TdHJlYW0gRlVOQ1RPUlMKKyAqLwordGVtcGxhdGU8IGNsYXNzIFQgPgoraW5saW5lIF9yZWZTdHJlYW1fPCBUID4gdG9fc3RyZWFtKCBjb25zdCBUICYgcmVmICkKK3sKKwlyZXR1cm4oIHJlZiApOworfQorCit0ZW1wbGF0ZTwgY2xhc3MgVCA+CitpbmxpbmUgX3B0clN0cmVhbV88IFQgPiB0b19zdHJlYW0oIFQgKiBwdHIgKQoreworCXJldHVybiggcHRyICk7Cit9CisKKworLyoqCisgKiBBdXRvbWF0aWMgbWVjaGFuaXNtIGZvcgorICogPG5hbWVkX2VsZW1lbnQ+LnRvRlFOKCBvcyApCisgKi8KK3RlbXBsYXRlPCBjbGFzcyBUID4KK3N0cnVjdCBfcmVmRlFOXworeworCWNvbnN0IFQgJiByZWY7CisKKwkvLyBDT05TVFJVQ1RPUgorCV9yZWZGUU5fKGNvbnN0IFQgJiBhUmVmKQorCTogcmVmKCBhUmVmICkKKwl7CisJCS8vISEgTk9USElORworCX0KK307CisKKy8qKgorICogQXV0b21hdGljIG1lY2hhbmlzbSBmb3IKKyAqIDxuYW1lZF9lbGVtZW50Pi0+dG9GUU4oIG9zICkKKyAqLwordGVtcGxhdGU8IGNsYXNzIFQgPgorc3RydWN0IF9wdHJGUU5fCit7CisJVCAqIHB0cjsKKworCS8vIENPTlNUUlVDVE9SCisJX3B0ckZRTl8oVCAqIGFQdHIpCisJOiBwdHIoIGFQdHIgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorfTsKKworLyoqCisgKiB0b1N0cmVhbSBGVU5DVE9SUworICovCit0ZW1wbGF0ZTwgY2xhc3MgVCA+CitpbmxpbmUgX3JlZkZRTl88IFQgPiBzdHJfZnFuKCBjb25zdCBUICYgcmVmICkKK3sKKwlyZXR1cm4oIHJlZiApOworfQorCit0ZW1wbGF0ZTwgY2xhc3MgVCA+CitpbmxpbmUgX3B0ckZRTl88IFQgPiBzdHJfZnFuKCBUICogcHRyICkKK3sKKwlyZXR1cm4oIHB0ciApOworfQorCisKKy8qKgorICogQXV0b21hdGljIG1lY2hhbmlzbSBmb3IKKyAqIDxyZWZlcmVuY2U+LnN0ckhlYWRlciggb3MgKQorICovCit0ZW1wbGF0ZTwgY2xhc3MgVCA+CitzdHJ1Y3QgX3JlZkhlYWRlcl8KK3sKKwljb25zdCBUICYgcmVmOworCisJLy8gQ09OU1RSVUNUT1IKKwlfcmVmSGVhZGVyXyhjb25zdCBUICYgYVJlZikKKwk6IHJlZiggYVJlZiApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9Cit9OworCisvKioKKyAqIEF1dG9tYXRpYyBtZWNoYW5pc20gZm9yCisgKiA8cG9pbnRlcj4tPnRvSGVhZGVyKCBvcyApCisgKi8KK3RlbXBsYXRlPCBjbGFzcyBUID4KK3N0cnVjdCBfcHRySGVhZGVyXworeworCVQgKiBwdHI7CisKKwkvLyBDT05TVFJVQ1RPUgorCV9wdHJIZWFkZXJfKFQgKiBhUHRyKQorCTogcHRyKCBhUHRyICkKKwl7CisJCS8vISEgTk9USElORworCX0KK307CisKKworLyoqCisgKiB0b0hlYWRlciBGVU5DVE9SUworICovCit0ZW1wbGF0ZTwgY2xhc3MgVCA+CitpbmxpbmUgX3JlZkhlYWRlcl88IFQgPiBzdHJfaGVhZGVyKCBjb25zdCBUICYgcmVmICkKK3sKKwlyZXR1cm4oIHJlZiApOworfQorCit0ZW1wbGF0ZTwgY2xhc3MgVCA+CitpbmxpbmUgX3B0ckhlYWRlcl88IFQgPiBzdHJfaGVhZGVyKCBUICogcHRyICkKK3sKKwlyZXR1cm4oIHB0ciApOworfQorCisKKy8qKgorICogQXV0b21hdGljIG1lY2hhbmlzbSBmb3IKKyAqIElOQ1IKKyAqIDxyZWZlcmVuY2U+LnRvSGVhZGVyKCBvcyApCisgKiBERUNSCisgKi8KK3RlbXBsYXRlPCBjbGFzcyBUID4KK3N0cnVjdCBfcmVmSW5jckluZGVudF8KK3sKKwljb25zdCBUICYgcmVmOworCisJLy8gQ09OU1RSVUNUT1IKKwlfcmVmSW5jckluZGVudF8oY29uc3QgVCAmIGFSZWYpCisJOiByZWYoIGFSZWYgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorfTsKKworLyoqCisgKiBBdXRvbWF0aWMgbWVjaGFuaXNtIGZvcgorICogSU5DUgorICogPHBvaW50ZXI+LnRvU3RyZWFtKCBvcyApCisgKiBERUNSCisgKi8KK3RlbXBsYXRlPCBjbGFzcyBUID4KK3N0cnVjdCBfcHRySW5jckluZGVudF8KK3sKKwlUICogcHRyOworCisJLy8gQ09OU1RSVUNUT1IKKwlfcHRySW5jckluZGVudF8oVCAqIGFQdHIpCisJOiBwdHIoIGFQdHIgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorfTsKKworCisvKioKKyAqIEluY3JlbWVudCgxKSBBdm1JbmRlbnQgRlVOQ1RPUlMKKyAqLwordGVtcGxhdGU8IGNsYXNzIFQgPgoraW5saW5lIF9yZWZJbmNySW5kZW50XzwgVCA+IGluY3Jfc3RyZWFtKCBjb25zdCBUICYgcmVmICkKK3sKKwlyZXR1cm4oIHJlZiApOworfQorCit0ZW1wbGF0ZTwgY2xhc3MgVCA+CitpbmxpbmUgX3B0ckluY3JJbmRlbnRfPCBUID4gaW5jcl9zdHJlYW0oIFQgKiBwdHIgKQoreworCXJldHVybiggcHRyICk7Cit9CisKKworLyoqCisgKiBBdXRvbWF0aWMgbWVjaGFuaXNtIGZvcgorICogSU5DUjwgY291bnQgPgorICogPHJlZmVyZW5jZT4udG9TdHJlYW0oIG9zICkKKyAqIERFQ1I8IGNvdW50ID4KKyAqLwordGVtcGxhdGU8IGNsYXNzIFQgPgorc3RydWN0IF9yZWZJbmNySW5kZW50Q291bnRfCit7CisJY29uc3QgVCAmIHJlZjsKKworCXN0ZDo6c2l6ZV90IGNvdW50OworCisJLy8gQ09OU1RSVUNUT1IKKwlfcmVmSW5jckluZGVudENvdW50Xyhjb25zdCBUICYgYVJlZiwgc3RkOjpzaXplX3QgYUNvdW50KQorCTogcmVmKCBhUmVmICksIGNvdW50KCBhQ291bnQgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorfTsKKworLyoqCisgKiBBdXRvbWF0aWMgbWVjaGFuaXNtIGZvcgorICogSU5DUjwgY291bnQgPgorICogPHBvaW50ZXI+LnRvU3RyZWFtKCBvcyApCisgKiBERUNSPCBjb3VudCA+CisgKi8KK3RlbXBsYXRlPCBjbGFzcyBUID4KK3N0cnVjdCBfcHRySW5jckluZGVudENvdW50XworeworCVQgKiBwdHI7CisKKwlzdGQ6OnNpemVfdCBjb3VudDsKKworCS8vIENPTlNUUlVDVE9SCisJX3B0ckluY3JJbmRlbnRDb3VudF8oVCAqIGFQdHIsIHN0ZDo6c2l6ZV90IGFDb3VudCkKKwk6IHB0ciggYVB0ciApLCBjb3VudCggYUNvdW50ICkKKwl7CisJCS8vISEgTk9USElORworCX0KK307CisKKworLyoqCisgKiBJbmNyZW1lbnQoPGNvdW50PikgQXZtSW5kZW50IEZVTkNUT1JTCisgKi8KK3RlbXBsYXRlPCBjbGFzcyBUID4KK2lubGluZSBfcmVmSW5jckluZGVudENvdW50XzwgVCA+IGluY3Jfc3RyZWFtKCBjb25zdCBUICYgcmVmICwgc3RkOjpzaXplX3QgY291bnQgKQoreworCXJldHVybiggX3JlZkluY3JJbmRlbnRDb3VudF88IFQgPihyZWYsIGNvdW50KSApOworfQorCit0ZW1wbGF0ZTwgY2xhc3MgVCA+CitpbmxpbmUgX3B0ckluY3JJbmRlbnRDb3VudF88IFQgPiBpbmNyX3N0cmVhbSggVCAqIHB0ciAsIHN0ZDo6c2l6ZV90IGNvdW50ICkKK3sKKwlyZXR1cm4oIF9wdHJJbmNySW5kZW50Q291bnRfPCBUID4ocHRyLCBjb3VudCkgKTsKK30KKworCisKKy8qKgorICogQXZtUkVQRUFUCisgKi8KK3RlbXBsYXRlPCBjbGFzcyBUID4KK3N0cnVjdCBBdm1SRVBFQVQKK3sKKwljb25zdCBUICYgcGF0dGVybjsKKwlzdGQ6OnNpemVfdCBjb3VudDsKKworCUF2bVJFUEVBVChjb25zdCBUICYgYVBhdHRlcm4sIHN0ZDo6c2l6ZV90IGFDb3VudCkKKwk6IHBhdHRlcm4oIGFQYXR0ZXJuICksCisJY291bnQoIGFDb3VudCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKK307CisKK3RlbXBsYXRlPCBjbGFzcyBUID4KK2lubGluZSBBdm1SRVBFQVQ8IFQgPiBSRVBFQVQoY29uc3QgVCAmIGFQYXR0ZXJuLCBzdGQ6OnNpemVfdCBhQ291bnQpCit7CisJcmV0dXJuKCBBdm1SRVBFQVQ8IFQgPihhUGF0dGVybiwgYUNvdW50KSApOworfQorCisKKy8qKgorICogQXZtRU1QSEFTSVMKKyAqLworc3RydWN0IEF2bUVNUEhBU0lTCit7CisJc3RkOjpzdHJpbmcgaGVhZGVyOworCXN0ZDo6c3RyaW5nIGJvZHk7CisJY2hhciAgICAgICAgZW1waDsKKwlzdGQ6OnNpemVfdCAgY291bnQ7CisKKwlib29sIGVuYWJsZVRhYjsKKworCUF2bUVNUEhBU0lTKGNvbnN0IHN0ZDo6c3RyaW5nICYgYUhlYWRlciwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhQm9keSwKKwkJCWNoYXIgYW5FbXBoLCBzdGQ6OnNpemVfdCBhQ291bnQgPSA4MCwgYm9vbCBlbmFibGVUYWIgPSB0cnVlKQorCTogaGVhZGVyKCBhSGVhZGVyICksCisJYm9keSggYUJvZHkgKSwKKwllbXBoKCBhbkVtcGggKSwKKwljb3VudCggYUNvdW50ICksCisJZW5hYmxlVGFiKCB0cnVlICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCUF2bUVNUEhBU0lTKGNvbnN0IHN0ZDo6c3RyaW5nICYgYVRleHQsIGNoYXIgYW5FbXBoLAorCQkJc3RkOjpzaXplX3QgYUNvdW50ID0gODAsIGJvb2wgZW5hYmxlVGFiID0gdHJ1ZSkKKwk6IGhlYWRlciggIiIgKSwKKwlib2R5KCBhVGV4dCApLAorCWVtcGgoIGFuRW1waCApLAorCWNvdW50KCBhQ291bnQgKSwKKwllbmFibGVUYWIoIHRydWUgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCit9OworCitpbmxpbmUgQXZtRU1QSEFTSVMgRU1QSEFTSVMoY29uc3Qgc3RkOjpzdHJpbmcgJiBhVGV4dCwKKwkJY2hhciBhbkVtcGggPSAnKicsIHN0ZDo6c2l6ZV90IGFDb3VudCA9IDgwLCBib29sIGVuYWJsZVRhYiA9IHRydWUpCit7CisJcmV0dXJuKCBBdm1FTVBIQVNJUyhhVGV4dCwgYW5FbXBoLCBhQ291bnQsIGVuYWJsZVRhYikgKTsKK30KKworaW5saW5lIEF2bUVNUEhBU0lTIEVNUEhBU0lTKAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFIZWFkZXIsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYUJvZHksCisJCWNoYXIgYW5FbXBoID0gJyonLCBzdGQ6OnNpemVfdCBhQ291bnQgPSA4MCwgYm9vbCBlbmFibGVUYWIgPSB0cnVlKQoreworCXJldHVybiggQXZtRU1QSEFTSVMoYUhlYWRlciwgYUJvZHksIGFuRW1waCwgYUNvdW50LCBlbmFibGVUYWIpICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTWU1CRVggVkFMVUUgQ1NTCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RydWN0IFN5bWJleFZhbHVlQ1NTCit7CisKKwlzdGQ6OnN0cmluZyBCRUdJTjsKKworCXN0ZDo6c3RyaW5nIFNFUEFSQVRPUjsKKworCXN0ZDo6c3RyaW5nIEVORDsKKworCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCVN5bWJleFZhbHVlQ1NTKAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBiZWdpbiAgICAgPSAieyAiICwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgc2VwYXJhdG9yID0gIiAsICIsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGVuZCAgICAgICA9ICIgfSIgKQorCTogQkVHSU4oICBiZWdpbiApLAorCVNFUEFSQVRPUiggc2VwYXJhdG9yICksCisJRU5EKCBlbmQgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCit9OworCisKKy8qKgorICogREVGQVVMVCBBVk0gTXVsdGktVmFsdWUgRm9ybWF0dGVyCisgKi8KK2V4dGVybiBTeW1iZXhWYWx1ZUNTUyBERUZBVUxUX1NZTUJFWF9WQUxVRV9BUlJBWV9DU1M7CisKK2V4dGVybiBTeW1iZXhWYWx1ZUNTUyBERUZBVUxUX1NZTUJFWF9WQUxVRV9QQVJBTVNfQ1NTOworCitleHRlcm4gU3ltYmV4VmFsdWVDU1MgREVGQVVMVF9TWU1CRVhfVkFMVUVfU1RSVUNUX0NTUzsKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQXZtSW5kZW50CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RydWN0IEF2bUluZGVudAoreworCisJc3RkOjpzaXplX3QgIENPVU5UOworCisJc3RkOjpzdHJpbmcgVEFCUzsKKworCXN0ZDo6c3RyaW5nIENIQVI7CisKKwlzdGQ6OnN0cmluZyBFT0w7CisKKwlzdGQ6OnN0cmluZyBFT0xfV1JBUDsKKworCXN0ZDo6c2l6ZV90IFJFRl9DT1VOVDsKKworCWJvb2wgSUdOT1JFX0ZJUlNUX1RBQjsKKworCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQXZtSW5kZW50KGNvbnN0IHN0ZDo6c3RyaW5nICYgdGFicyAgID0gIiIsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIF9jaGFyXyAgID0gIlx0IiwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgZW9sICAgICAgPSAiXG4iLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBlb2xfd3JhcCA9ICJcbiIpCisJOiBDT1VOVCggMCApLAorCVRBQlMoICB0YWJzICksCisJQ0hBUiggX2NoYXJfICksCisJRU9MKCBlb2wgKSwKKwlFT0xfV1JBUCggZW9sX3dyYXAgKSwKKwlSRUZfQ09VTlQoIDEgKSwKKwlJR05PUkVfRklSU1RfVEFCKCBmYWxzZSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqLworCWlubGluZSBzdGQ6OnN0cmluZyB3cmFwU2VwYXJhdG9yKCkgY29uc3QKKwl7CisJCXJldHVybiggRU9MX1dSQVAgKyBDSEFSICk7CisJfQorCisJaW5saW5lIHN0ZDo6c2l6ZV90IHRhYlNpemUoc3RkOjpzaXplX3Qgb2Zmc2V0ID0gMCkKKwl7CisJCXJldHVybiggVEFCUy5zaXplKCkgKyBvZmZzZXQgKTsKKwl9CisKKwlpbmxpbmUgc3RkOjpzaXplX3QgdGFiMlNpemUoc3RkOjpzaXplX3Qgb2Zmc2V0ID0gMCkKKwl7CisJCXJldHVybiggVEFCUy5zaXplKCkgKyBDSEFSLnNpemUoKSArIG9mZnNldCApOworCX0KKworCisJLyoqCisJICogVEVTVAorCSAqIElmIGlzIHByZWZlcmEKKwkgKi8KKwlpbmxpbmUgYm9vbCBwcmVmZXJhYmx5U1RSKCkKKwl7CisJCXJldHVybiggLypUQUIuZW1wdHkoKSAmJiovIENIQVIuZW1wdHkoKSAvKiYmIEVPTC5lbXB0eSgpKi8gKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBwcmVmZXJhYmx5RlFOKCkKKwl7CisJCXJldHVybiggLypUQUIuZW1wdHkoKSAmJiovIENIQVIuZW1wdHkoKSAmJiBFT0wuZW1wdHkoKSApOworCX0KKworCisJLyoqCisJICogQ09NUEFSSVNPTgorCSAqIE9QRVJBVE9SCisJICovCisJaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBBdm1JbmRlbnQgJiBvdGhlcikgY29uc3QKKwl7CisJCXJldHVybiggKFRBQlMgPT0gb3RoZXIuVEFCUykgICAmJgorCQkJCShDSEFSID09IG90aGVyLkNIQVIpICAgJiYKKy8vCQkJCShDT1VOVCA9PSBvdGhlci5DT1VOVCkgJiYKKwkJCQkoRU9MID09IG90aGVyLkVPTCkgICAgICk7CisJfQorCisJaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBBdm1JbmRlbnQgJiBvdGhlcikgY29uc3QKKwl7CisJCXJldHVybiggKFRBQlMgIT0gb3RoZXIuVEFCUykgICB8fAorCQkJCShDSEFSICE9IG90aGVyLkNIQVIpICAgfHwKKy8vCQkJCShDT1VOVCAhPSBvdGhlci5DT1VOVCkgfHwKKwkJCQkoRU9MICE9IG90aGVyLkVPTCkgICAgICk7CisJfQorCisKKwkvKioKKwkgKiBJTkNSCisJICogVEFCIExFVkVMCisJICovCisJaW5saW5lIHZvaWQgaW5jcihzdGQ6OnNpemVfdCBjb3VudCkKKwl7CisJCUNPVU5UICs9IGNvdW50OworCisJCWZvciggOyBjb3VudCA+IDAgOyAtLWNvdW50ICkKKwkJeworCQkJVEFCUyA9IENIQVIgKyBUQUJTOworCQl9CisJfQorCisJaW5saW5lIHZvaWQgaW5jcigpCisJeworCQlDT1VOVCArPSAxOworCisJCVRBQlMgPSBDSEFSICsgVEFCUzsKKwl9CisKKworCWlubGluZSB2b2lkIG9wZXJhdG9yKysoKQorCXsKKwkJQ09VTlQgKz0gMTsKKworCQlUQUJTID0gQ0hBUiArIFRBQlM7CisJfQorCisKKwkvKioKKwkgKiBERUNSCisJICogVEFCIExFVkVMCisJICovCisJaW5saW5lIHZvaWQgZGVjcihzdGQ6OnNpemVfdCBjb3VudCkKKwl7CisJCUNPVU5UID0gKCBDT1VOVCA+PSBjb3VudCApID8gKENPVU5UIC0gY291bnQpIDogMDsKKworCQlmb3IoIDsgY291bnQgPiAwIDsgLS1jb3VudCApCisJCXsKKy8vCQkJVEFCUyA9IFRBQlMuc3Vic3RyKCBUQUJTLmZpbmRfZmlyc3Rfb2YoQ0hBUikgKTsKKwkJCVRBQlMgPSBUQUJTLnN1YnN0ciggQ0hBUi5zaXplKCkgKTsKKwkJfQorCX0KKworCWlubGluZSB2b2lkIGRlY3IoKQorCXsKKwkJaWYoIENPVU5UID49IDEgKQorCQl7CisJCQlDT1VOVCA9IChDT1VOVCAtIDEpOworCisvLwkJCVRBQlMgPSBUQUJTLnN1YnN0ciggVEFCUy5maW5kX2ZpcnN0X29mKENIQVIpICk7CisJCQlUQUJTID0gVEFCUy5zdWJzdHIoIENIQVIuc2l6ZSgpICk7CisJCX0KKwl9CisKKworCWlubGluZSB2b2lkIG9wZXJhdG9yLS0oKQorCXsKKwkJaWYoIENPVU5UID49IDEgKQorCQl7CisJCQlDT1VOVCArPSAtMTsKKworLy8JCQlUQUJTID0gVEFCUy5zdWJzdHIoIFRBQlMuZmluZF9maXJzdF9vZihDSEFSKSApOworCQkJVEFCUyA9IFRBQlMuc3Vic3RyKCBDSEFSLnNpemUoKSApOworCQl9CisJfQorCit9OworCisKKy8qKgorICogREVGQVVMVCBBVk0gSU5ERU5UCisgKi8KK2V4dGVybiBBdm1JbmRlbnQgQVZNX1RBQl9JTkRFTlQ7CisKK2V4dGVybiBBdm1JbmRlbnQgQVZNX1RBQjFfSU5ERU5UOworCitleHRlcm4gQXZtSW5kZW50IEFWTV9TUENfSU5ERU5UOworCitleHRlcm4gQXZtSW5kZW50IEFWTV9TUEMxX0lOREVOVDsKKworZXh0ZXJuIEF2bUluZGVudCBBVk1fU1RSX0lOREVOVDsKKworZXh0ZXJuIEF2bUluZGVudCBBVk1fUlRTX0lOREVOVDsKKworZXh0ZXJuIEF2bUluZGVudCBBVk1fTk9fSU5ERU5UOworCisvLyBEZWZhdWx0IG91dHB1dCAvIGZzY24gZmlsZSBpbmRlbnQKK2V4dGVybiBBdm1JbmRlbnQgQVZNX09VVFBVVF9JTkRFTlQ7CisKK2V4dGVybiBBdm1JbmRlbnQgQVZNX0ZTQ05fSU5ERU5UOworCisKKy8qKgorICogQXV0b21hdGljIG1lY2hhbmlzbSBmb3IKKyAqIFBVU0g8IEF2bUluZGVudCA+CisgKiA8cmVmZXJlbmNlPi50b1N0cmVhbSggb3MgKQorICogUE9QPCBBdm1JbmRlbnQgPgorICovCit0ZW1wbGF0ZTwgY2xhc3MgVCA+CitzdHJ1Y3QgX3JlZkluZGVudF8KK3sKKwljb25zdCBUICYgcmVmOworCisJY29uc3QgQXZtSW5kZW50ICYgaW5kZW50OworCisJLy8gQ09OU1RSVUNUT1IKKwlfcmVmSW5kZW50Xyhjb25zdCBUICYgYVJlZiwgY29uc3QgQXZtSW5kZW50ICYgYW5JbmRlbnQpCisJOiByZWYoIGFSZWYgKSwgaW5kZW50KCBhbkluZGVudCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9Cit9OworCisvKioKKyAqIEF1dG9tYXRpYyBtZWNoYW5pc20gZm9yCisgKiBQVVNIPCBBdm1JbmRlbnQgPgorICogPHBvaW50ZXI+LnRvU3RyZWFtKCBvcyApCisgKiBQT1A8IEF2bUluZGVudCA+CisgKi8KK3RlbXBsYXRlPCBjbGFzcyBUID4KK3N0cnVjdCBfcHRySW5kZW50XworeworCVQgKiBwdHI7CisKKwljb25zdCBBdm1JbmRlbnQgJiBpbmRlbnQ7CisKKwkvLyBDT05TVFJVQ1RPUgorCV9wdHJJbmRlbnRfKFQgKiBhUHRyLCBjb25zdCBBdm1JbmRlbnQgJiBhbkluZGVudCkKKwk6IHB0ciggYVB0ciApLCBpbmRlbnQoIGFuSW5kZW50ICkKKwl7CisJCS8vISEgTk9USElORworCX0KK307CisKKworLyoqCisgKiB0b1N0cmVhbSBGVU5DVE9SUworICovCit0ZW1wbGF0ZTwgY2xhc3MgVCA+CitpbmxpbmUgX3JlZkluZGVudF88IFQgPiB0b19zdHJlYW0oIGNvbnN0IFQgJiByZWYgLCBjb25zdCBBdm1JbmRlbnQgJiBhbkluZGVudCApCit7CisJcmV0dXJuKCBfcmVmSW5kZW50XzwgVCA+KHJlZiwgYW5JbmRlbnQpICk7Cit9CisKK3RlbXBsYXRlPCBjbGFzcyBUID4KK2lubGluZSBfcHRySW5kZW50XzwgVCA+IHRvX3N0cmVhbSggVCAqIHB0ciAsIGNvbnN0IEF2bUluZGVudCAmIGFuSW5kZW50ICkKK3sKKwlyZXR1cm4oIF9wdHJJbmRlbnRfPCBUID4ocHRyLCBhbkluZGVudCkgKTsKK30KKworCisvLyBBVk1fU1BDX0lOREVOVCgiIiAsICIgIiwgIlxuIikKK3RlbXBsYXRlPCBjbGFzcyBUID4KK2lubGluZSBfcmVmSW5kZW50XzwgVCA+IHNwY19pbmRlbnQoIGNvbnN0IFQgJiByZWYgKQoreworCXJldHVybiggX3JlZkluZGVudF88IFQgPihyZWYsIEFWTV9TUENfSU5ERU5UKSApOworfQorCit0ZW1wbGF0ZTwgY2xhc3MgVCA+CitpbmxpbmUgX3B0ckluZGVudF88IFQgPiBzcGNfaW5kZW50KCBUICogcHRyICkKK3sKKwlyZXR1cm4oIF9wdHJJbmRlbnRfPCBUID4ocHRyLCBBVk1fU1BDX0lOREVOVCkgKTsKK30KKworLy8gQVZNX1NQQzFfSU5ERU5UKCIgIiAsICIgIiwgIlxuIikKK3RlbXBsYXRlPCBjbGFzcyBUID4KK2lubGluZSBfcmVmSW5kZW50XzwgVCA+IHNwYzFfaW5kZW50KCBjb25zdCBUICYgcmVmICkKK3sKKwlyZXR1cm4oIF9yZWZJbmRlbnRfPCBUID4ocmVmLCBBVk1fU1BDMV9JTkRFTlQpICk7Cit9CisKK3RlbXBsYXRlPCBjbGFzcyBUID4KK2lubGluZSBfcHRySW5kZW50XzwgVCA+IHNwYzFfaW5kZW50KCBUICogcHRyICkKK3sKKwlyZXR1cm4oIF9wdHJJbmRlbnRfPCBUID4ocHRyLCBBVk1fU1BDMV9JTkRFTlQpICk7Cit9CisKKworLy8gQVZNX1RBQl9JTkRFTlQoIiIgICwgIlx0IiwgIlxuIikKK3RlbXBsYXRlPCBjbGFzcyBUID4KK2lubGluZSBfcmVmSW5kZW50XzwgVCA+IHRhYl9pbmRlbnQoIGNvbnN0IFQgJiByZWYgKQoreworCXJldHVybiggX3JlZkluZGVudF88IFQgPihyZWYsIEFWTV9UQUJfSU5ERU5UKSApOworfQorCit0ZW1wbGF0ZTwgY2xhc3MgVCA+CitpbmxpbmUgX3B0ckluZGVudF88IFQgPiB0YWJfaW5kZW50KCBUICogcHRyICkKK3sKKwlyZXR1cm4oIF9wdHJJbmRlbnRfPCBUID4ocHRyLCBBVk1fVEFCX0lOREVOVCkgKTsKK30KKworLy8gQVZNX1RBQjFfSU5ERU5UKCJcdCIgICwgIlx0IiwgIlxuIikKK3RlbXBsYXRlPCBjbGFzcyBUID4KK2lubGluZSBfcmVmSW5kZW50XzwgVCA+IHRhYjFfaW5kZW50KCBjb25zdCBUICYgcmVmICkKK3sKKwlyZXR1cm4oIF9yZWZJbmRlbnRfPCBUID4ocmVmLCBBVk1fVEFCMV9JTkRFTlQpICk7Cit9CisKK3RlbXBsYXRlPCBjbGFzcyBUID4KK2lubGluZSBfcHRySW5kZW50XzwgVCA+IHRhYjFfaW5kZW50KCBUICogcHRyICkKK3sKKwlyZXR1cm4oIF9wdHJJbmRlbnRfPCBUID4ocHRyLCBBVk1fVEFCMV9JTkRFTlQpICk7Cit9CisKKworLy8gQVZNX1NUUl9JTkRFTlQoIiAiLCAiIiwgIiIpCit0ZW1wbGF0ZTwgY2xhc3MgVCA+CitpbmxpbmUgX3JlZkluZGVudF88IFQgPiBzdHJfaW5kZW50KCBjb25zdCBUICYgcmVmICkKK3sKKwlyZXR1cm4oIF9yZWZJbmRlbnRfPCBUID4ocmVmLCBBVk1fU1RSX0lOREVOVCkgKTsKK30KKwordGVtcGxhdGU8IGNsYXNzIFQgPgoraW5saW5lIF9wdHJJbmRlbnRfPCBUID4gc3RyX2luZGVudCggVCAqIHB0ciApCit7CisJcmV0dXJuKCBfcHRySW5kZW50XzwgVCA+KHB0ciwgQVZNX1NUUl9JTkRFTlQpICk7Cit9CisKKy8vIEFWTV9SVFNfSU5ERU5UKCIiLCAiIiwgIiAiKQordGVtcGxhdGU8IGNsYXNzIFQgPgoraW5saW5lIF9yZWZJbmRlbnRfPCBUID4gcnRzX2luZGVudCggY29uc3QgVCAmIHJlZiApCit7CisJcmV0dXJuKCBfcmVmSW5kZW50XzwgVCA+KHJlZiwgQVZNX1JUU19JTkRFTlQpICk7Cit9CisKK3RlbXBsYXRlPCBjbGFzcyBUID4KK2lubGluZSBfcHRySW5kZW50XzwgVCA+IHJ0c19pbmRlbnQoIFQgKiBwdHIgKQoreworCXJldHVybiggX3B0ckluZGVudF88IFQgPihwdHIsIEFWTV9SVFNfSU5ERU5UKSApOworfQorCisKKy8vIEFWTV9OT19JTkRFTlQoIiIgLCAiIiwgIiIpCit0ZW1wbGF0ZTwgY2xhc3MgVCA+CitpbmxpbmUgX3JlZkluZGVudF88IFQgPiBub19pbmRlbnQoIGNvbnN0IFQgJiByZWYgKQoreworCXJldHVybiggX3JlZkluZGVudF88IFQgPihyZWYsIEFWTV9OT19JTkRFTlQpICk7Cit9CisKK3RlbXBsYXRlPCBjbGFzcyBUID4KK2lubGluZSBfcHRySW5kZW50XzwgVCA+IG5vX2luZGVudCggVCAqIHB0ciApCit7CisJcmV0dXJuKCBfcHRySW5kZW50XzwgVCA+KHB0ciwgQVZNX05PX0lOREVOVCkgKTsKK30KKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qIFBSSU5URVJfTUFOSVBVTEFUT1JTX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wcmludGVyL091dFN0cmVhbS5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wcmludGVyL091dFN0cmVhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBkMmNlNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3ByaW50ZXIvT3V0U3RyZWFtLmNwcApAQCAtMCwwICsxLDQxMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDE3IGTDqWMuIDIwMTIKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIk91dFN0cmVhbS5oIgorCisjaW5jbHVkZSA8dXRpbC9hdm1fYXNzZXJ0Lmg+CisjaW5jbHVkZSA8dXRpbC9hdm1fdmZzLmg+CisKKyNpbmNsdWRlIDxzZXcvV29ya2Zsb3cuaD4KKworI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9XT2JqZWN0Lmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorICogQ09OU09MRSBQUk9NUFQKKyAqLworY29uc3Qgc3RkOjpzdHJpbmcgJiBDT05TT0xFX0RFQlVHX1BST01QVCAgPSAiW0RCR10gIjsKKworY29uc3Qgc3RkOjpzdHJpbmcgJiBDT05TT0xFX1NFV19QUk9NUFQgICAgPSAiW1NFV10gIjsKKworY29uc3Qgc3RkOjpzdHJpbmcgJiBDT05TT0xFX0NPTkZJR19QUk9NUFQgPSAiW0NGR10gIjsKKworY29uc3Qgc3RkOjpzdHJpbmcgJiBDT05TT0xFX1NZTUJFWF9QUk9NUFQgPSAiW1NCWF0gIjsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIE91dFN0cmVhbQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICogTE9BRAorICogRElTUE9TRQorICovCit2b2lkIE91dFN0cmVhbTo6bG9hZCgpCit7CisJX2F2bV9vc19sb2dfID0gQVZNX09TX0NPVVQuT1M7CisKKwlfYXZtX29zX3RyYWNlXyA9IEFWTV9PU19DT1VULk9TOworCisJX2F2bV9vc190ZGRfID0gQVZNX09TX0NPVVQuT1M7Cit9CisKK3ZvaWQgT3V0U3RyZWFtOjpkaXNwb3NlKCkKK3sKKwkvLyBBVk0gVFJBQ0UgTE9HIDw8IG9mc3RyZWFtID4+CisJaWYoIF9hdm1fb3NfbG9nXyAhPSBOVUxMICkKKwl7CisJCV9hdm1fb3NfbG9nXy0+Zmx1c2goKTsKKworCQlpZiggKF9hdm1fb3NfbG9nXyAhPSBBVk1fT1NfQ09VVC5PUykgJiYKKwkJCQkoX2F2bV9vc19sb2dfICE9IF9hdm1fb3NfbnVsbF8pICkKKwkJeworLy8JCQlfYXZtX29zX2xvZy0+Y2xvc2UoKTsKKwkJCWRlbGV0ZSBfYXZtX29zX2xvZ187CisJCX0KKwl9CisJX2F2bV9vc19sb2dfID0gTlVMTDsKKworCisJLy8gQVZNIFRSQUNFIERFQlVHIDw8IG9mc3RyZWFtID4+CisJaWYoIF9hdm1fb3NfdHJhY2VfICE9IE5VTEwgKQorCXsKKwkJX2F2bV9vc190cmFjZV8tPmZsdXNoKCk7CisKKwkJaWYoIChfYXZtX29zX3RyYWNlXyAhPSBBVk1fT1NfQ09VVC5PUykgJiYKKwkJCQkoX2F2bV9vc190cmFjZV8gIT0gX2F2bV9vc19udWxsXykgKQorCQl7CisvLwkJCV9hdm1fb3NfdHJhY2UtPmNsb3NlKCk7CisJCQlkZWxldGUgX2F2bV9vc190cmFjZV87CisJCX0KKwl9CisJX2F2bV9vc190cmFjZV8gPSBOVUxMOworCisKKwkvLyBBVk0gVEVTVCBEUklWRU4gREVWRUxPUE1FTlQgPDwgb2ZzdHJlYW0gPj4KKwlpZiggX2F2bV9vc190ZGRfICE9IE5VTEwgKQorCXsKKwkJX2F2bV9vc190ZGRfLT5mbHVzaCgpOworCisJCWlmKCAoX2F2bV9vc190ZGRfICE9IEFWTV9PU19DT1VULk9TKSAmJgorCQkJCShfYXZtX29zX3RkZF8gIT0gX2F2bV9vc19udWxsXykgKQorCQl7CisvLwkJCV9hdm1fb3NfdGRkXy0+Y2xvc2UoKTsKKwkJCWRlbGV0ZSBfYXZtX29zX3RkZF87CisJCX0KKwl9CisJX2F2bV9vc190ZGRfID0gTlVMTDsKKworCisJLy8gQVZNIE5VTEwgPDwgb2ZzdHJlYW0gPj4KKwlpZiggX2F2bV9vc19udWxsXyAhPSBOVUxMICkKKwl7CisJCWRlbGV0ZSBfYXZtX29zX251bGxfOworCX0KK30KKworCisvKioKKyAqIENPTkZJR1VSRQorICovCisvKgorLy8gR0xPQkFMIFBST1BFUlRZCitzZWN0aW9uIFBST1BFUlRZCisJb3V0cHV0I3RhYiA9ICIgIjsKKworCWZzY24jdGFiID0gIiAiOworCisJbGluZSN3cmFwI3dpZHRoID0gODA7CisJbGluZSN3cmFwI3NlcGFyYXRvciA9ICJcblx0IjsKK2VuZHNlY3Rpb24KKyovCitib29sIE91dFN0cmVhbTo6Y29uZmlndXJlKFdvcmtmbG93ICogYVdvcmtmbG93KQoreworCVdPYmplY3QgKiBzZXFGT1JNQVQgPSBRdWVyeTo6Z2V0V1NlcXVlbmNlT3JFbHNlKAorCQkJYVdvcmtmbG93LT5nZXRQYXJhbWV0ZXJXT2JqZWN0KCksICJmb3JtYXQiLCAiUFJPUEVSVFkiKTsKKworCS8vIEdMT0JBTCBJTkRFTlQgQ0hBUgorCXN0ZDo6c3RyaW5nIHN0clRhYiA9IFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eVN0cmluZyhzZXFGT1JNQVQsCisJCQlDT05TX1dJRDIoIm91dHB1dCIsICJ0YWIiKSwgQVZNX09VVFBVVF9JTkRFTlQuQ0hBUik7CisKKwlBVk1fRlNDTl9JTkRFTlQuQ0hBUiA9CisJCQlRdWVyeTo6Z2V0UmVnZXhXUHJvcGVydHlTdHJpbmcoCisJCQkJCXNlcUZPUk1BVCwgQ09OU19XSUQyKCJmc2NuIiwgInRhYiIpLAorCQkJCQkoc3RyVGFiICE9IEFWTV9PVVRQVVRfSU5ERU5ULkNIQVIpID8KKwkJCQkJCQlzdHJUYWIgOiBBVk1fRlNDTl9JTkRFTlQuQ0hBUik7CisKKwlBVk1fT1VUUFVUX0lOREVOVC5DSEFSID0gc3RyVGFiOworCisJLyoKKwkgKiBERUZBVUxUX1dSQVBfREFUQQorCSAqLworCWlmKCBERUZBVUxUX1dSQVBfREFUQS5jb25maWd1cmUoIHNlcUZPUk1BVCApICkKKwl7CisJCS8vISFOT1RISU5HCisJfQorCisJLy8gQVZNIFRSQUNFIExPRyA8PCBvZnN0cmVhbSA+PgorCWlmKCBhV29ya2Zsb3ctPmhhc0RldmVsb3BlckRlYnVnTG9nRmlsZSgpICkKKwl7CisJCV9hdm1fb3NfbG9nXyA9IG5ldyBzdGQ6Om9mc3RyZWFtKAorCQkJCWFXb3JrZmxvdy0+Z2V0RGV2ZWxvcGVyRGVidWdMb2dGaWxlTG9jYXRpb24oKS5jX3N0cigpICk7CisJCWlmKCAoX2F2bV9vc19sb2dfID09IE5VTEwpIHx8IF9hdm1fb3NfbG9nXy0+ZmFpbCgpICkKKwkJeworCQkJX2F2bV9vc19sb2dfID0gX2F2bV9vc19udWxsXzsKKworCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJPDwgIkZhaWxlZCB0byBvcGVuIEFWTV9PU19MT0cgPDwgIgorCQkJCQk8PCBhV29ya2Zsb3ctPmdldERldmVsb3BlckRlYnVnTG9nRmlsZUxvY2F0aW9uKCkKKwkJCQkJPDwgIiA+PiBmaWxlIGluIHdyaXRlIG1vZGUgISEhIgorCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlfYXZtX29zX2xvZ18gPSBfYXZtX29zX251bGxfOworCX0KKworCUFWTV9PU19MT0cuT1MgPSBfYXZtX29zX2xvZ187CisKKworCS8vIEFWTSBUUkFDRSBERUJVRyA8PCBvZnN0cmVhbSA+PgorCWlmKCBhV29ya2Zsb3ctPmhhc0RldmVsb3BlckRlYnVnVHJhY2VGaWxlKCkgKQorCXsKKwkJX2F2bV9vc190cmFjZV8gPSBuZXcgc3RkOjpvZnN0cmVhbSgKKwkJCQlhV29ya2Zsb3ctPmdldERldmVsb3BlckRlYnVnVHJhY2VGaWxlTG9jYXRpb24oKS5jX3N0cigpICk7CisJCWlmKCAoX2F2bV9vc190cmFjZV8gPT0gTlVMTCkgfHwgX2F2bV9vc190cmFjZV8tPmZhaWwoKSApCisJCXsKKwkJCV9hdm1fb3NfdHJhY2VfID0gX2F2bV9vc19udWxsXzsKKworCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJPDwgIkZhaWxlZCB0byBvcGVuIEFWTV9PU19UUkFDRSA8PCAiCisJCQkJCTw8IGFXb3JrZmxvdy0+Z2V0RGV2ZWxvcGVyRGVidWdUcmFjZUZpbGVMb2NhdGlvbigpCisJCQkJCTw8ICIgPj4gZmlsZSBpbiB3cml0ZSBtb2RlICEhISIKKwkJCQkJPDwgU0VORF9FWElUOworCisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJX2F2bV9vc190cmFjZV8gPSBfYXZtX29zX251bGxfOworCX0KKworCUFWTV9PU19UUkFDRS5PUyA9IF9hdm1fb3NfdHJhY2VfOworCisKKwkvLyBBVk0gVEVTVCBEUklWRU4gREVWRUxPUE1FTlQgPDwgb2ZzdHJlYW0gPj4KKwlpZiggYVdvcmtmbG93LT5oYXNUZGRSZXBvcnQoKSApCisJeworCQlfYXZtX29zX3RkZF8gPSBuZXcgc3RkOjpvZnN0cmVhbSgKKwkJCQlhV29ya2Zsb3ctPmdldFRkZFJlcG9ydExvY2F0aW9uKCkuY19zdHIoKSApOworCQlpZiggKF9hdm1fb3NfdGRkXyA9PSBOVUxMKSB8fCBfYXZtX29zX3RkZF8tPmZhaWwoKSApCisJCXsKKwkJCV9hdm1fb3NfdGRkXyA9IF9hdm1fb3NfbnVsbF87CisKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCTw8ICJGYWlsZWQgdG8gb3BlbiBBVk1fT1NfVEREIDw8ICIKKwkJCQkJPDwgYVdvcmtmbG93LT5nZXRUZGRSZXBvcnRMb2NhdGlvbigpCisJCQkJCTw8ICIgPj4gZmlsZSBpbiB3cml0ZSBtb2RlICEhISIKKwkJCQkJPDwgU0VORF9FWElUOworCisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJX2F2bV9vc190ZGRfID0gX2F2bV9vc19udWxsXzsKKwl9CisKKwlBVk1fT1NfVERELk9TID0gX2F2bV9vc190ZGRfOworCisJLy8gRm9yIEFTU0VSVAorCUFWTV9PU19USFJPV19FWENFUFRJT04uT1MuSU5ERU5UID0gQVZNX09VVFBVVF9JTkRFTlQ7CisKKwlBVk1fT1NfVEhST1dfQUxFUlQuT1MuSU5ERU5UID0gQVZNX09VVFBVVF9JTkRFTlQ7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvKioKKyAqIFJFUEVBVAorICogQ09MVU1OCisgKiBFTVBIQVNJUworICovCitPdXRTdHJlYW0gJiBPdXRTdHJlYW06Om9wZXJhdG9yPDwoY29uc3QgQXZtRU1QSEFTSVMgJiBlbXBoYXNpcykKK3sKKwlpZiggZW1waGFzaXMuZW5hYmxlVGFiICkgeyAoICpPUyApIDw8IElOREVOVC5UQUJTOyB9CisJcmVwZWF0KGVtcGhhc2lzLmVtcGgsIGVtcGhhc2lzLmNvdW50KSA8PCBJTkRFTlQuRU9MOworCisJc3RkOjpzaXplX3QgY291bnQgPSBlbXBoYXNpcy5jb3VudCArICggKGVtcGhhc2lzLmNvdW50ID4gMikgPyAtMiA6IDAgKTsKKwkvLyBmb3IgMiBzcGFjZXMgY2hhciAtLT4gJyAnIGVtcGhhc2lzLnRleHQgJyAnCisKKwlzdGQ6OnNpemVfdCBhZnRlciA9IDA7CisJc3RkOjpzaXplX3QgYmVmb3JlID0gMDsKKworCS8vIGVtcGhhc2lzLmhlYWRlcgorCWlmKCBub3QgZW1waGFzaXMuaGVhZGVyLmVtcHR5KCkgKQorCXsKKwkJaWYoIGNvdW50ID4gZW1waGFzaXMuaGVhZGVyLnNpemUoKSApCisJCXsKKwkJCWFmdGVyID0gKGNvdW50IC0gZW1waGFzaXMuaGVhZGVyLnNpemUoKSkgLyAyOworCQkJYmVmb3JlID0gY291bnQgLSBhZnRlciAtIGVtcGhhc2lzLmhlYWRlci5zaXplKCk7CisKKwkJCWlmKCBlbXBoYXNpcy5lbmFibGVUYWIgKSB7ICggKk9TICkgPDwgSU5ERU5ULlRBQlM7IH0KKwkJCXJlcGVhdChlbXBoYXNpcy5lbXBoLCBiZWZvcmUpIDw8ICcgJyA8PCBlbXBoYXNpcy5oZWFkZXIgPDwgJyAnOworCQkJcmVwZWF0KGVtcGhhc2lzLmVtcGgsIGFmdGVyKSAgPDwgSU5ERU5ULkVPTDsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmKCBlbXBoYXNpcy5lbmFibGVUYWIgKSB7ICggKk9TICkgPDwgSU5ERU5ULlRBQlM7IH0KKwkJCSggKk9TICkgPDwgZW1waGFzaXMuZW1waCA8PCBlbXBoYXNpcy5lbXBoCisJCQkJCTw8ICcgJyA8PCBlbXBoYXNpcy5oZWFkZXIgPDwgSU5ERU5ULkVPTDsKKwkJfQorCX0KKworCS8vIGVtcGhhc2lzLmJvZHkKKwlpZiggbm90IGVtcGhhc2lzLmJvZHkuZW1wdHkoKSApCisJeworCQlpZiggY291bnQgPiBlbXBoYXNpcy5ib2R5LnNpemUoKSApCisJCXsKKwkJCXN0ZDo6c2l6ZV90IGJvZHlfYWZ0ZXIgPSAoY291bnQgLSBlbXBoYXNpcy5ib2R5LnNpemUoKSkgLyAyOworCisJCQlzdGQ6OnNpemVfdCBzcGFjZSA9IDE7CisJCQlib29sIHJpZ2h0U3BhY2UgPSBmYWxzZTsKKwkJCWlmKCAoYWZ0ZXIgPiAwKSAmJiAoYWZ0ZXIgPCBib2R5X2FmdGVyKSApCisJCQl7CisJCQkJc3BhY2UgKz0gYm9keV9hZnRlciAtIGFmdGVyOworCisJCQkJcmlnaHRTcGFjZSA9ICggKChlbXBoYXNpcy5ib2R5LnNpemUoKSArIGJlZm9yZSArIGFmdGVyKSAlIDIpCisJCQkJCQkhPSAoY291bnQgJSAyKSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWFmdGVyID0gYm9keV9hZnRlcjsKKworCQkJCWJlZm9yZSA9IGNvdW50IC0gYm9keV9hZnRlciAtIGVtcGhhc2lzLmJvZHkuc2l6ZSgpOworCQkJfQorCisJCQlBdm1SRVBFQVQ8IGNoYXIgPiBjZW50ZXIgPSBSRVBFQVQoJyAnLCBzcGFjZSk7CisKKwkJCWlmKCBlbXBoYXNpcy5lbmFibGVUYWIgKSB7ICggKk9TICkgPDwgSU5ERU5ULlRBQlM7IH0KKwkJCXJlcGVhdChlbXBoYXNpcy5lbXBoLCBiZWZvcmUpIDw8IGNlbnRlcgorCQkJCQk8PCBlbXBoYXNpcy5ib2R5IDw8IGNlbnRlcjsKKwkJCWlmKCByaWdodFNwYWNlICkgeyAoICpPUyApIDw8ICcgJzsgfQorCQkJcmVwZWF0KGVtcGhhc2lzLmVtcGgsIGFmdGVyKSA8PCBJTkRFTlQuRU9MOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYoIGVtcGhhc2lzLmVuYWJsZVRhYiApIHsgKCAqT1MgKSA8PCBJTkRFTlQuVEFCUzsgfQorCQkJKCAqT1MgKSA8PCBlbXBoYXNpcy5lbXBoIDw8IGVtcGhhc2lzLmVtcGgKKwkJCQkJPDwgJyAnIDw8IGVtcGhhc2lzLmJvZHkgPDwgSU5ERU5ULkVPTDsKKwkJfQorCX0KKworCWlmKCBlbXBoYXNpcy5lbmFibGVUYWIgKSB7ICggKk9TICkgPDwgSU5ERU5ULlRBQlM7IH0KKwlyZXBlYXQoZW1waGFzaXMuZW1waCwgZW1waGFzaXMuY291bnQpIDw8IElOREVOVC5FT0wgPDwgc3RkOjpmbHVzaDsKKworCXJldHVybiggKnRoaXMgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEdMT0JBTCBQUkUtREVGSU5FRCBTVFJFQU0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKKyAqIFVUSUwgVkFSSUFCTEUKKyAqIEFWTV9PU19OVUxMCisgKi8KK3N0ZDo6b3N0cmVhbSAqIF9hdm1fb3NfbnVsbF8gPSBuZXcgc3RkOjpvc3RyZWFtKE5VTEwpOworCitOdWxsT3V0U3RyZWFtIEFWTV9PU19OVUxMOworCisKKy8qKgorICogQVZNIENPVVQgJiBDRVJSICYgREVCVUcKKyAqLworLy8gISEhIER1ZSB0byBJbml0aWFsaXphdGlvbiBvcmRlciAhISEKKy8vT3V0U3RyZWFtIEFWTV9PU19DT1VUKCBzdGQ6OmNvdXQgLCBBVk1fU1BDX0lOREVOVCApOworT3V0U3RyZWFtIEFWTV9PU19DT1VUKCBzdGQ6OmNvdXQgLCAiIiAgICwgIiAiICAsICJcbiIgKTsKKworT3V0U3RyZWFtIEFWTV9PU19DRVJSKAorCQkoKF9BVk1fRVhFQ19NT0RFXyA9PSBBVk1fRVhFQ19TRVJWRVJfTU9ERSkgPyBzdGQ6OmNvdXQgOiBzdGQ6OmNlcnIpLAorLy8JCUFWTV9TUENfSU5ERU5UICk7CisJCSIiICAgLCAiICIgICwgIlxuIiApOworCitPdXRTdHJlYW0gQVZNX09TX0RFQlVHKCBzdGQ6OmNvdXQgLCAiIiAgICwgIlx0IiAgLCAiXG4iICk7CisKKy8qKgorICogQVZNIExPRyAmIFRSQUNFIEZJTEUgTE9DQVRJT04KKyAqLworc3RkOjpzdHJpbmcgQVZNX0xPR19GSUxFX0xPQ0FUSU9OOworCitzdGQ6OnN0cmluZyBBVk1fVFJBQ0VfRklMRV9MT0NBVElPTjsKKworCisvKioKKyAqIFVUSUwgVkFSSUFCTEUKKyAqIEFWTV9PU19MT0cKKyAqLworc3RkOjpvc3RyZWFtICogX2F2bV9vc19sb2dfID0gTlVMTDsKKworLy9PdXRTdHJlYW0gQVZNX09TX0xPRyggc3RkOjpjb3V0ICwgQVZNX1NQQ19JTkRFTlQgKTsKK091dFN0cmVhbSBBVk1fT1NfTE9HKCBzdGQ6OmNvdXQgLCAiIiAgICwgIiAiICAsICJcbiIgKTsKKworCisvKioKKyAqIFVUSUwgVkFSSUFCTEUKKyAqIEFWTV9PU19UUkFDRQorICovCitzdGQ6Om9zdHJlYW0gKiBfYXZtX29zX3RyYWNlXyA9IE5VTEw7CisKKy8vT3V0U3RyZWFtIEFWTV9PU19UUkFDRSggc3RkOjpjb3V0ICwgQVZNX1NQQ19JTkRFTlQgKTsKK091dFN0cmVhbSBBVk1fT1NfVFJBQ0UoIHN0ZDo6Y291dCAsICIiICAgLCAiICIgICwgIlxuIiApOworCisKKy8qKgorICogVVRJTCBWQVJJQUJMRQorICogQVZNX09TX1dBUk4KKyAqLworV2Fybk91dHN0cmVhbVQgQVZNX09TX1dBUk4oQVZNX09TX0NFUlIsIEFWTV9PU19UUkFDRSk7CisKKy8qKgorICogVVRJTCBWQVJJQUJMRQorICogQVZNX09TX0lORk8KKyAqLworSW5mb091dHN0cmVhbVQgQVZNX09TX0lORk8oQVZNX09TX0NPVVQsIEFWTV9PU19UUkFDRSk7CisKKy8qKgorICogVVRJTCBWQVJJQUJMRQorICogQVZNX09TX0NMT0cKKyAqLworSW5mb091dHN0cmVhbVQgQVZNX09TX0NMT0coQVZNX09TX0NPVVQsIEFWTV9PU19MT0cpOworCisKKy8qKgorICogVVRJTCBWQVJJQUJMRQorICogQVZNX09TX1RERAorICogZm9yIFRlc3QgRHJpdmVuIERldmVsb3BtZW50CisgKi8KK3N0ZDo6b3N0cmVhbSAqIF9hdm1fb3NfdGRkXyA9IE5VTEw7CisKKy8vT3V0U3RyZWFtIEFWTV9PU19UREQoIHN0ZDo6Y291dCAsIEFWTV9UQUJfSU5ERU5UICk7CitPdXRTdHJlYW0gQVZNX09TX1RERCggc3RkOjpjb3V0ICwgIiIgICAsICJcdCIgLCAiXG4iICk7CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wcmludGVyL091dFN0cmVhbS5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcHJpbnRlci9PdXRTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWE0ZmIxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcHJpbnRlci9PdXRTdHJlYW0uaApAQCAtMCwwICsxLDE4MTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxNyBkw6ljLiAyMDEyCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgUFJJTlRFUl9PVVRTVFJFQU1fSF8KKyNkZWZpbmUgUFJJTlRFUl9PVVRTVFJFQU1fSF8KKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0YWNrPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPHV0aWwvYXZtX2RlYnVnLmg+CisjaW5jbHVkZSA8dXRpbC9hdm1fdXRpbC5oPgorCisjaW5jbHVkZSA8cHJpbnRlci9NYW5pcHVsYXRvcnMuaD4KKyNpbmNsdWRlIDxwcmludGVyL1dyYXBTdHJlYW0uaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworI2RlZmluZSBBVk1fQ0hBUl9TUEMgICAgICAgICAgICIgIgorCisjZGVmaW5lIEFWTV9DSEFSX1RBQiAgICAgICAgICAgIiAiCisvLyNkZWZpbmUgQVZNX0NIQVJfVEFCICAgICAgICAgIlx0IgorCisKK2NsYXNzIFBhcmFtZXRlck1hbmFnZXI7CitjbGFzcyBXb3JrZmxvdzsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIE91dFN0cmVhbQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2V4dGVybiBzdGQ6Om9zdHJlYW0gKiBfYXZtX29zX251bGxfOworCisKK2NsYXNzIE91dFN0cmVhbQoreworCitwdWJsaWM6CisKKwkvKioKKwkgKiBBVFRSSUJVVEUKKwkgKi8KKwlzdGQ6Om9zdHJlYW0gKiBPUzsKKworCVdyYXBPc3RyZWFtICogV1JBUF9PUzsKKworCUF2bUluZGVudCBJTkRFTlQ7CisKKwlzdGQ6OnNpemVfdCBERVBUSDsKKworCXN0ZDo6c3RhY2s8IEF2bUluZGVudCA+IFNUQUNLOworCisJU3ltYmV4VmFsdWVDU1MgVkFMVUVfQVJSQVlfQ1NTOworCVN5bWJleFZhbHVlQ1NTIFZBTFVFX1BBUkFNU19DU1M7CisJU3ltYmV4VmFsdWVDU1MgVkFMVUVfU1RSVUNUX0NTUzsKKworCisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJT3V0U3RyZWFtKHN0ZDo6b3N0cmVhbSAqIG9zID0gTlVMTCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgdGFicyAgID0gIiIsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIF9jaGFyXyA9ICJcdCIsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGVvbCAgICA9ICJcbiIpCisJOiBPUyggb3MgKSwKKwlXUkFQX09TKCBOVUxMICksCisJSU5ERU5UKCB0YWJzLCBfY2hhcl8gLCBlb2wgKSwKKwlERVBUSCggMCApLAorCVNUQUNLKCApLAorCVZBTFVFX0FSUkFZX0NTUyAoICJbICIsICIgLCAiLCAiIF0iICksCisJVkFMVUVfUEFSQU1TX0NTUyggIiggIiwgIiAsICIsICIgKSIgKSwKKwlWQUxVRV9TVFJVQ1RfQ1NTKCAieyAiLCAiICwgIiwgIiB9IiApCisJeworCQlTVEFDSy5wdXNoKCBJTkRFTlQgKTsKKwl9CisKKwlPdXRTdHJlYW0oc3RkOjpvc3RyZWFtICogb3MsIGNvbnN0IEF2bUluZGVudCAmIGluZGVudCkKKwk6IE9TKCBvcyApLAorCVdSQVBfT1MoIE5VTEwgKSwKKwlJTkRFTlQoIGluZGVudCApLAorCURFUFRIKCAwICksCisJU1RBQ0soICksCisJVkFMVUVfQVJSQVlfQ1NTICggIlsgIiwgIiAsICIsICIgXSIgKSwKKwlWQUxVRV9QQVJBTVNfQ1NTKCAiKCAiLCAiICwgIiwgIiApIiApLAorCVZBTFVFX1NUUlVDVF9DU1MoICJ7ICIsICIgLCAiLCAiIH0iICkKKwl7CisJCVNUQUNLLnB1c2goIElOREVOVCApOworCX0KKworCU91dFN0cmVhbShzdGQ6Om9zdHJlYW0gKiBvcywgY29uc3QgT3V0U3RyZWFtICYgYW9zKQorCTogT1MoIG9zICksCisJV1JBUF9PUyggTlVMTCApLAorCUlOREVOVCggYW9zLklOREVOVCApLAorCURFUFRIKCAwICksCisJU1RBQ0soICksCisJVkFMVUVfQVJSQVlfQ1NTICggIlsgIiwgIiAsICIsICIgXSIgKSwKKwlWQUxVRV9QQVJBTVNfQ1NTKCAiKCAiLCAiICwgIiwgIiApIiApLAorCVZBTFVFX1NUUlVDVF9DU1MoICJ7ICIsICIgLCAiLCAiIH0iICkKKwl7CisJCVNUQUNLLnB1c2goIElOREVOVCApOworCX0KKworCisJT3V0U3RyZWFtKHN0ZDo6b3N0cmVhbSAmIG9zLCBjb25zdCBBdm1JbmRlbnQgJiBpbmRlbnQpCisJOiBPUyggJiBvcyApLAorCVdSQVBfT1MoIE5VTEwgKSwKKwlJTkRFTlQoIGluZGVudCApLAorCURFUFRIKCAwICksCisJU1RBQ0soICksCisJVkFMVUVfQVJSQVlfQ1NTICggIlsgIiwgIiAsICIsICIgXSIgKSwKKwlWQUxVRV9QQVJBTVNfQ1NTKCAiKCAiLCAiICwgIiwgIiApIiApLAorCVZBTFVFX1NUUlVDVF9DU1MoICJ7ICIsICIgLCAiLCAiIH0iICkKKwl7CisJCVNUQUNLLnB1c2goIElOREVOVCApOworCX0KKworLy8JT3V0U3RyZWFtKHN0ZDo6b3N0cmVhbSAmIG9zLAorLy8JCQljb25zdCBXcmFwRGF0YSAmIHdyYXBEYXRhLCBjb25zdCBBdm1JbmRlbnQgJiBpbmRlbnQpCisvLwk6IE9TKCAmIG9zICksCisvLwlXUkFQX09TKCBuZXcgV3JhcE9zdHJlYW0ob3MsIHdyYXBEYXRhKSApLAorLy8JSU5ERU5UKCBpbmRlbnQgKSwKKy8vCURFUFRIKCAwICksCisvLwlTVEFDSyggKSwKKy8vCVZBTFVFX0FSUkFZX0NTUyAoICJbICIsICIgLCAiLCAiIF0iICksCisvLwlWQUxVRV9QQVJBTVNfQ1NTKCAiKCAiLCAiICwgIiwgIiApIiApLAorLy8JVkFMVUVfU1RSVUNUX0NTUyggInsgIiwgIiAsICIsICIgfSIgKQorLy8JeworLy8JCVNUQUNLLnB1c2goIElOREVOVCApOworLy8KKy8vCQlPUyA9IFdSQVBfT1M7CisvLwl9CisKKwlPdXRTdHJlYW0oc3RkOjpvc3RyZWFtICYgb3MsIGNvbnN0IE91dFN0cmVhbSAmIGFvcykKKwk6IE9TKCAmIG9zICksCisJV1JBUF9PUyggTlVMTCApLAorCUlOREVOVCggYW9zLklOREVOVCApLAorCURFUFRIKCAwICksCisJU1RBQ0soICksCisJVkFMVUVfQVJSQVlfQ1NTICggIlsgIiwgIiAsICIsICIgXSIgKSwKKwlWQUxVRV9QQVJBTVNfQ1NTKCAiKCAiLCAiICwgIiwgIiApIiApLAorCVZBTFVFX1NUUlVDVF9DU1MoICJ7ICIsICIgLCAiLCAiIH0iICkKKwl7CisJCVNUQUNLLnB1c2goIElOREVOVCApOworCX0KKworCU91dFN0cmVhbShzdGQ6Om9zdHJlYW0gJiBvcywKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgdGFicyAgID0gIiIsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIF9jaGFyXyA9ICJcdCIsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGVvbCAgICA9ICJcbiIpCisJOiBPUyggJiBvcyApLAorCVdSQVBfT1MoIE5VTEwgKSwKKwlJTkRFTlQodGFicywgX2NoYXJfICwgZW9sICksCisJREVQVEgoIDAgKSwKKwlTVEFDSyggKSwKKwlWQUxVRV9BUlJBWV9DU1MgKCAiWyAiLCAiICwgIiwgIiBdIiApLAorCVZBTFVFX1BBUkFNU19DU1MoICIoICIsICIgLCAiLCAiICkiICksCisJVkFMVUVfU1RSVUNUX0NTUyggInsgIiwgIiAsICIsICIgfSIgKQorCXsKKwkJU1RBQ0sucHVzaCggSU5ERU5UICk7CisJfQorCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfk91dFN0cmVhbSgpCisJeworCQlkZWxldGUoIFdSQVBfT1MgKTsKKwl9CisKKworCS8qKgorCSAqIE9TCisJICogZGVsZXRlIC8gZGVzdHJveQorCSAqLworCWlubGluZSB2aXJ0dWFsIHZvaWQgZGVsZXRlT1MoKQorCXsKKwkJZGVsZXRlKCBPUyApOworCisJCU9TID0gTlVMTDsKKwl9CisKKwlpbmxpbmUgdm9pZCBkZXN0cm95KCkKKwl7CisJCWlmKCAoT1MgIT0gTlVMTCkgJiYgKE9TICE9IF9hdm1fb3NfbnVsbF8pICYmCisJCQkoT1MgIT0gJihzdGQ6OmNvdXQpKSAmJiAoT1MgIT0gJihzdGQ6OmNlcnIpKSApCisJCXsKKwkJCWlmKCBPUy0+Z29vZCgpICkKKwkJCXsKKwkJCQkoKk9TKSA8PCBzdGQ6OmZsdXNoOworCQkJfQorCisJCQlkZWxldGVPUygpOworCQl9CisJfQorCisKKwkvKioKKwkgKiBPUworCSAqIGZhaWwgLyBnb29kCisJICovCisJaW5saW5lIHZpcnR1YWwgYm9vbCBmYWlsKCkKKwl7CisJCXJldHVybiggKE9TID09IE5VTEwpIHx8IE9TLT5mYWlsKCkgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCBib29sIGdvb2QoKQorCXsKKwkJcmV0dXJuKCAoT1MgIT0gTlVMTCkgJiYgT1MtPmdvb2QoKSApOworCX0KKworCisJLyoqCisJICogT1MKKwkgKiBpc09wZW4gLyBvcGVuIC8gcmVvcGVuCisJICovCisJaW5saW5lIGJvb2wgaXNPcGVuKCkKKwl7CisJCXJldHVybiggKE9TICE9IE5VTEwpICYmCisJCQkJKGR5bmFtaWNfY2FzdDwgc3RkOjpvZnN0cmVhbSAqID4oT1MpICE9IE5VTEwpICYmCisJCQkJZHluYW1pY19jYXN0PCBzdGQ6Om9mc3RyZWFtICogPihPUyktPmlzX29wZW4oKSApOworCX0KKworCWlubGluZSBib29sIG9wZW4oY29uc3Qgc3RkOjpzdHJpbmcgJiBhRmlsZUxvY2F0aW9uLAorCQkJc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgYU1vZGUpCisJeworCQlPUyA9IG5ldyBzdGQ6Om9mc3RyZWFtKGFGaWxlTG9jYXRpb24uY19zdHIoKSwgYU1vZGUpOworCisJCXJldHVybiggKE9TICE9IE5VTEwpICYmIE9TLT5nb29kKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCByZW9wZW4oY29uc3Qgc3RkOjpzdHJpbmcgJiBhRmlsZUxvY2F0aW9uLAorCQkJc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgYU1vZGUpCisJeworCQlpZiggaXNPcGVuKCkgKQorCQl7CisJCQlkZXN0cm95KCk7CisJCX0KKworCQlyZXR1cm4oIG9wZW4oYUZpbGVMb2NhdGlvbi5jX3N0cigpLCBhTW9kZSkgKTsKKwl9CisKKworCS8qKgorCSAqIFRFU1QKKwkgKiBJZiBpcyBwcmVmZXJhYmxlLi4uCisJICovCisJaW5saW5lIGJvb2wgcHJlZmVyYWJseVNUUigpCisJeworCQlyZXR1cm4oIElOREVOVC5wcmVmZXJhYmx5U1RSKCkgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBwcmVmZXJhYmx5RlFOKCkKKwl7CisJCXJldHVybiggSU5ERU5ULnByZWZlcmFibHlGUU4oKSApOworCX0KKworCisJLyoqCisJICogcmVzdG9yZSBkZWZhdWx0IFN5bWJleCBWYWx1ZSBDU1MKKwkgKi8KKwlpbmxpbmUgdm9pZCByZXN0b3JlU3ltYmV4VmFsdWVDU1MoKQorCXsKKwkJVkFMVUVfQVJSQVlfQ1NTICA9IERFRkFVTFRfU1lNQkVYX1ZBTFVFX0FSUkFZX0NTUzsKKwkJVkFMVUVfUEFSQU1TX0NTUyA9IERFRkFVTFRfU1lNQkVYX1ZBTFVFX1BBUkFNU19DU1M7CisJCVZBTFVFX1NUUlVDVF9DU1MgPSBERUZBVUxUX1NZTUJFWF9WQUxVRV9TVFJVQ1RfQ1NTOworCX0KKworCWlubGluZSB2b2lkIHNldFN5bWJleFZhbHVlQ1NTKGNvbnN0IFN5bWJleFZhbHVlQ1NTICYgdmFjLAorCQkJY29uc3QgU3ltYmV4VmFsdWVDU1MgJiB2cGMsIGNvbnN0IFN5bWJleFZhbHVlQ1NTICYgdnNjKQorCXsKKwkJVkFMVUVfQVJSQVlfQ1NTICA9IHZhYzsKKwkJVkFMVUVfUEFSQU1TX0NTUyA9IHZwYzsKKwkJVkFMVUVfU1RSVUNUX0NTUyA9IHZzYzsKKwl9CisKKwkvKioKKwkgKiBmbHVzaCgpCisJICovCisJaW5saW5lIHZpcnR1YWwgdm9pZCBmbHVzaCgpIGNvbnN0CisJeworCQlpZiggV1JBUF9PUyAhPSBOVUxMICkKKwkJeworCQkJV1JBUF9PUy0+Zmx1c2goKTsKKwkJfQorCisJCWlmKCBPUyAhPSBOVUxMICkKKwkJeworCQkJT1MtPmZsdXNoKCk7CisJCX0KKwl9CisKKworCS8qKgorCSAqIG9wZXJhdG9yPDwKKwkgKi8KKwkvLyBOZWVkIGZvciBwb2x5bW9ycGhpc20gaW4gZnVuY3RvciBsaWtlIFRBQiBvciBFT0wgZmFtaWx5CisJaW5saW5lIHZpcnR1YWwgT3V0U3RyZWFtICYgb3BlcmF0b3I8PCggY29uc3Qgc3RkOjpzdHJpbmcgJiB4ICkKKwl7CisJCSggKk9TICkgPDwgeDsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJdGVtcGxhdGU8IGNsYXNzIFQgPgorCWlubGluZSBPdXRTdHJlYW0gJiBvcGVyYXRvcjw8KCBjb25zdCBUICYgeCApCisJeworCQkoICpPUyApIDw8IHg7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCisJaW5saW5lIE91dFN0cmVhbSAmIG9wZXJhdG9yPDwoIHZvaWQgKCpvcCkgKCBPdXRTdHJlYW0gJiApICkKKwl7CisJCW9wKCAqdGhpcyApOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwlpbmxpbmUgT3V0U3RyZWFtICYgb3BlcmF0b3I8PCgKKwkJCXN0ZDo6b3N0cmVhbSAmICgqb3ApICggc3RkOjpvc3RyZWFtICYgKSApCisJeworCQlvcCggKk9TICk7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCisJaW5saW5lIHN0YXRpYyB2b2lkIGJhY2tzcGFjZShzdGQ6Om9zdHJlYW0gKiBvcykKKwl7CisJCWlmKCBvcyA9PSAmKHN0ZDo6Y291dCkgKQorCQl7CisJCQkoICpvcyApIDw8ICdcYic7CisJCX0KKwkJZWxzZSBpZiggb3MgIT0gTlVMTCApCisJCXsKKwkJCW9zLT5zZWVrcCgtMSwgc3RkOjppb3M6OmVuZCk7CisJCX0KKwl9CisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIGJhY2tzcGFjZSgpCisJeworCQlPdXRTdHJlYW06OmJhY2tzcGFjZSggT1MgICk7CisJfQorCisKKwlpbmxpbmUgdm9pZCBwdXNoKCkKKwl7CisJCWlmKCAvKlNUQUNLLmVtcHR5KCkgfHwqLyAoU1RBQ0sudG9wKCkgIT0gSU5ERU5UKSApCisJCXsKKwkJCVNUQUNLLnB1c2goIElOREVOVCApOworCQl9CisJCWVsc2UKKwkJeworCQkJKysoU1RBQ0sudG9wKCkuUkVGX0NPVU5UKTsKKwkJfQorCX0KKworCWlubGluZSB2b2lkIHBvcCgpCisJeworCQlJTkRFTlQgPSBTVEFDSy50b3AoKTsKKworCQlpZiggU1RBQ0sudG9wKCkuUkVGX0NPVU5UID09IDEgKQorCQl7CisJCQlTVEFDSy5wb3AoKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS0tKFNUQUNLLnRvcCgpLlJFRl9DT1VOVCk7CisJCX0KKwl9CisKKworCS8qKgorCSAqIE1BTklQVUxBVE9SUworCSAqLworCWlubGluZSBPdXRTdHJlYW0gJiBvcGVyYXRvcjw8KGNvbnN0IFdyYXBEYXRhICYgbmV3V3JhcCkKKwl7CisJCWlmKCBnb29kKCkgKQorCQl7CisJCQlpZiggV1JBUF9PUyAhPSBOVUxMICkKKwkJCXsKKwkJCQlkZWxldGUoIFdSQVBfT1MgKTsKKwkJCX0KKworCQkJT1MtPmZsdXNoKCk7CisKKwkJCVdSQVBfT1MgPSBuZXcgV3JhcE9zdHJlYW0oKk9TLCBuZXdXcmFwKTsKKworCQkJT1MgPSBXUkFQX09TOworCQl9CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCWlubGluZSB2b2lkIGVuZF93cmFwKCkKKwl7CisJCWlmKCBnb29kKCkgJiYgKFdSQVBfT1MgIT0gTlVMTCkgKQorCQl7CisJCQlPUyA9IFdSQVBfT1MtPm1PUzsKKworCQkJT1MtPmZsdXNoKCk7CisKKwkJCWRlbGV0ZSggV1JBUF9PUyApOworCisJCQlXUkFQX09TID0gTlVMTDsKKwkJfQorCX0KKworCisJaW5saW5lIE91dFN0cmVhbSAmIG9wZXJhdG9yPDwoY29uc3QgQXZtSW5kZW50ICYgbmV3SW5kZW50KQorCXsKKwkJcHVzaCgpOworCisJCUlOREVOVCA9IG5ld0luZGVudDsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisKKy8vCWlubGluZSBPdXRTdHJlYW0gJiBvcGVyYXRvcjw8KGNvbnN0IEF2bVRBQiAmIHRhYikKKy8vCXsKKy8vCQkoICpPUyApIDw8IElOREVOVC5UQUJTOworLy8KKy8vCQlmb3IoIDsgdGFiLmNvdW50ID4gMSAgOyAtLXRhYi5jb3VudCApCisvLwkJeworLy8JCQkoICpPUyApIDw8IElOREVOVC5DSEFSOworLy8JCX0KKy8vCisvLwkJcmV0dXJuKCAqdGhpcyApOworLy8JfQorLy8KKy8vCWlubGluZSBPdXRTdHJlYW0gJiBvcGVyYXRvcjw8KGNvbnN0IEF2bUVPTCAmIGVvbCkKKy8vCXsKKy8vCQlmb3IoIDsgZW9sLmNvdW50ID4gMCAgOyAtLWVvbC5jb3VudCApCisvLwkJeworLy8JCQkoICpPUyApIDw8IElOREVOVC5FT0w7CisvLwkJfQorLy8KKy8vCQlyZXR1cm4oICp0aGlzICk7CisvLwl9CisKKworCWlubGluZSBPdXRTdHJlYW0gJiBvcGVyYXRvcjw8KGNvbnN0IEF2bUlOQ1IgJiBpbmNyKQorCXsKKwkJT3V0U3RyZWFtOjppbmNyKCBpbmNyLmNvdW50ICk7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCWlubGluZSBPdXRTdHJlYW0gJiBvcGVyYXRvcjw8KGNvbnN0IEF2bURFQ1IgJiBkZWNyKQorCXsKKwkJT3V0U3RyZWFtOjpkZWNyKCBkZWNyLmNvdW50ICk7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCisJLyoqCisJICogPHJlZmVyZW5jZXxwb2ludGVyPi50b1N0cmVhbSggb3MgKQorCSAqLworCXRlbXBsYXRlPCBjbGFzcyBUID4KKwlpbmxpbmUgT3V0U3RyZWFtICYgb3BlcmF0b3I8PChjb25zdCBfcmVmU3RyZWFtXzwgVCA+ICYgb2JqKQorCXsKKwkJb2JqLnJlZi50b1N0cmVhbSggKnRoaXMgKTsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJdGVtcGxhdGU8IGNsYXNzIFQgPgorCWlubGluZSBPdXRTdHJlYW0gJiBvcGVyYXRvcjw8KGNvbnN0IF9wdHJTdHJlYW1fPCBUID4gJiBvYmopCisJeworCQlpZiggb2JqLnB0ciAhPSBOVUxMICkKKwkJeworCQkJb2JqLnB0ci0+dG9TdHJlYW0oICp0aGlzICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkoICpPUyApIDw8IElOREVOVC5UQUJTIDw8ICJ0b19zdHJlYW0oPG51bGw+KSIgPDwgSU5ERU5ULkVPTDsKKwkJfQorCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKworCS8qKgorCSAqIDxyZWZlcmVuY2V8cG9pbnRlcj4uc3RySGVhZGVyKCBvcyApCisJICovCisJdGVtcGxhdGU8IGNsYXNzIFQgPgorCWlubGluZSBPdXRTdHJlYW0gJiBvcGVyYXRvcjw8KGNvbnN0IF9yZWZIZWFkZXJfPCBUID4gJiBvYmopCisJeworCQlvYmoucmVmLnN0ckhlYWRlciggKnRoaXMgKTsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJdGVtcGxhdGU8IGNsYXNzIFQgPgorCWlubGluZSBPdXRTdHJlYW0gJiBvcGVyYXRvcjw8KGNvbnN0IF9wdHJIZWFkZXJfPCBUID4gJiBvYmopCisJeworCQlpZiggb2JqLnB0ciAhPSBOVUxMICkKKwkJeworCQkJb2JqLnB0ci0+c3RySGVhZGVyKCAqdGhpcyApOworCQl9CisJCWVsc2UKKwkJeworCQkJKCAqT1MgKSA8PCAic3RyX2hlYWRlcig8bnVsbD4pIjsKKwkJfQorCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKworCS8qKgorCSAqIDxyZWZlcmVuY2V8cG9pbnRlcj4uc3RyRlFOKCBvcyApCisJICovCisJdGVtcGxhdGU8IGNsYXNzIFQgPgorCWlubGluZSBPdXRTdHJlYW0gJiBvcGVyYXRvcjw8KGNvbnN0IF9yZWZGUU5fPCBUID4gJiBvYmopCisJeworCQlvYmoucmVmLnN0ckZRTiggKnRoaXMgKTsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJdGVtcGxhdGU8IGNsYXNzIFQgPgorCWlubGluZSBPdXRTdHJlYW0gJiBvcGVyYXRvcjw8KGNvbnN0IF9wdHJGUU5fPCBUID4gJiBvYmopCisJeworCQlpZiggb2JqLnB0ciAhPSBOVUxMICkKKwkJeworCQkJb2JqLnB0ci0+c3RyRlFOKCAqdGhpcyApOworCQl9CisJCWVsc2UKKwkJeworCQkJKCAqT1MgKSA8PCBJTkRFTlQuVEFCUyA8PCAic3RyX2Zxbig8bnVsbD4pIiA8PCBJTkRFTlQuRU9MOworCQl9CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCisKKworCS8qKgorCSAqIElOQ1IgIDxyZWZlcmVuY2V8cG9pbnRlcj4udG9TdHJlYW0oIG9zICkgIERFQ1IKKwkgKi8KKwl0ZW1wbGF0ZTwgY2xhc3MgVCA+CisJaW5saW5lIE91dFN0cmVhbSAmIG9wZXJhdG9yPDwoY29uc3QgX3JlZkluY3JJbmRlbnRfPCBUID4gJiBvYmopCisJeworCQlpbmNyKCk7CisKKwkJb2JqLnJlZi50b1N0cmVhbSggKnRoaXMgKTsKKworCQlkZWNyKCk7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCXRlbXBsYXRlPCBjbGFzcyBUID4KKwlpbmxpbmUgT3V0U3RyZWFtICYgb3BlcmF0b3I8PChjb25zdCBfcHRySW5jckluZGVudF88IFQgPiAmIG9iaikKKwl7CisJCWlmKCBvYmoucHRyICE9IE5VTEwgKQorCQl7CisJCQlpbmNyKCk7CisKKwkJCW9iai5wdHItPnRvU3RyZWFtKCAqdGhpcyApOworCisJCQlkZWNyKCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkoICpPUyApIDw8IElOREVOVC5UQUJTIDw8IElOREVOVC5DSEFSCisJCQkJCTw8ICJpbmNyX3N0cmVhbSg8bnVsbD4pIiA8PCBJTkRFTlQuRU9MOworCQl9CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCisJLyoqCisJICogSU5DUjwgY291bnQgPiAgPHJlZmVyZW5jZXxwb2ludGVyPi50b1N0cmVhbSggb3MgKSAgREVDUjwgY291bnQgPgorCSAqLworCXRlbXBsYXRlPCBjbGFzcyBUID4KKwlpbmxpbmUgT3V0U3RyZWFtICYgb3BlcmF0b3I8PChjb25zdCBfcmVmSW5jckluZGVudENvdW50XzwgVCA+ICYgb2JqKQorCXsKKwkJaW5jciggb2JqLmNvdW50ICk7CisKKwkJb2JqLnJlZi50b1N0cmVhbSggKnRoaXMgKTsKKworCQlkZWNyKCBvYmouY291bnQgKTsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJdGVtcGxhdGU8IGNsYXNzIFQgPgorCWlubGluZSBPdXRTdHJlYW0gJiBvcGVyYXRvcjw8KGNvbnN0IF9wdHJJbmNySW5kZW50Q291bnRfPCBUID4gJiBvYmopCisJeworCQlpZiggb2JqLnB0ciAhPSBOVUxMICkKKwkJeworCQkJaW5jciggb2JqLmNvdW50ICk7CisKKwkJCW9iai5wdHItPnRvU3RyZWFtKCAqdGhpcyApOworCisJCQlkZWNyKCBvYmouY291bnQgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCU91dFN0cmVhbTo6b3BlcmF0b3I8PCggdGFiKG9iai5jb3VudCkgKTsKKwkJCSggKk9TICkgPDwgImluY3JfY291bnRfc3RyZWFtKDxudWxsPikiIDw8IElOREVOVC5FT0w7CisJCX0KKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisKKwkvKioKKwkgKiBQVVNIPCBBdm1JbmRlbnQgPiAgPHJlZmVyZW5jZXxwb2ludGVyPi50b1N0cmVhbSggb3MgKSAgUE9QPCBBdm1JbmRlbnQgPgorCSAqLworCXRlbXBsYXRlPCBjbGFzcyBUID4KKwlpbmxpbmUgT3V0U3RyZWFtICYgb3BlcmF0b3I8PChjb25zdCBfcmVmSW5kZW50XzwgVCA+ICYgb2JqKQorCXsKKwkJb2JqLnJlZi50b1N0cmVhbSggT3V0U3RyZWFtOjpvcGVyYXRvcjw8KCBvYmouaW5kZW50ICkgKTsKKworCQlwb3AoKTsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJdGVtcGxhdGU8IGNsYXNzIFQgPgorCWlubGluZSBPdXRTdHJlYW0gJiBvcGVyYXRvcjw8KGNvbnN0IF9wdHJJbmRlbnRfPCBUID4gJiBvYmopCisJeworCQlpZiggb2JqLnB0ciAhPSBOVUxMICkKKwkJeworCQkJb2JqLnB0ci0+dG9TdHJlYW0oIE91dFN0cmVhbTo6b3BlcmF0b3I8PCggb2JqLmluZGVudCApICk7CisKKwkJCXBvcCgpOworCQl9CisJCWVsc2UKKwkJeworCQkJKCAqT1MgKSA8PCBvYmouaW5kZW50LlRBQlMgPDwgInB1c2hfc3RyZWFtX3BvcCg8bnVsbD4pIiA8PCBvYmouaW5kZW50LkVPTDsKKwkJfQorCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKworCS8qKgorCSAqIFJFUEVBVAorCSAqIENPTFVNTgorCSAqIEVNUEhBU0lTCisJICovCisJdGVtcGxhdGU8IGNsYXNzIFQgPgorCWlubGluZSBPdXRTdHJlYW0gJiByZXBlYXQoIGNvbnN0IFQgJiB4ICwgc3RkOjpzaXplX3QgY291bnQpCisJeworCQlmb3IoIDsgY291bnQgPiAwICA7IC0tY291bnQgKQorCQl7CisJCQkoICpPUyApIDw8IHg7CisJCX0KKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJdGVtcGxhdGU8IGNsYXNzIFQgPgorCWlubGluZSBPdXRTdHJlYW0gJiBvcGVyYXRvcjw8KGNvbnN0IEF2bVJFUEVBVDwgVCA+ICYgYVJlcGVhdCkKKwl7CisJCXJldHVybiggcmVwZWF0PCBUID4oYVJlcGVhdC5wYXR0ZXJuLCBhUmVwZWF0LmNvdW50KSApOworCX0KKworCU91dFN0cmVhbSAmIG9wZXJhdG9yPDwoY29uc3QgQXZtRU1QSEFTSVMgJiBlbXBoYXNpcyk7CisKKworCS8qKgorCSAqIElOQ1IKKwkgKiBUQUIgREVQVEgKKwkgKi8KKwlpbmxpbmUgdm9pZCBpbmNyKHN0ZDo6c2l6ZV90IGNvdW50KQorCXsKKwkJSU5ERU5ULmluY3IoY291bnQpOworCisJCURFUFRIICs9IGNvdW50OworCX0KKworCWlubGluZSB2b2lkIGluY3IoKQorCXsKKwkJSU5ERU5ULmluY3IoKTsKKworCQlERVBUSCArPSAxOworCX0KKworCisJaW5saW5lIE91dFN0cmVhbSAmIG9wZXJhdG9yKysoKQorCXsKKwkJaW5jcigpOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKworCS8qKgorCSAqIERFQ1IKKwkgKiBUQUIgREVQVEgKKwkgKi8KKwlpbmxpbmUgdm9pZCBkZWNyKHN0ZDo6c2l6ZV90IGNvdW50KQorCXsKKwkJSU5ERU5ULmRlY3IoY291bnQpOworCisJCURFUFRIID0gKCBERVBUSCA+IGNvdW50ICkgPyAoREVQVEggLSBjb3VudCkgOiAwOworCX0KKworCWlubGluZSB2b2lkIGRlY3IoKQorCXsKKwkJSU5ERU5ULmRlY3IoKTsKKworCQlERVBUSCA9ICggREVQVEggPiAxICkgPyAoREVQVEggLSAxKSA6IDA7CisJfQorCisKKwlpbmxpbmUgT3V0U3RyZWFtICYgb3BlcmF0b3ItLSgpCisJeworCQlkZWNyKCk7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCisJLyoqCisJICogc2F2ZSBjdXJyZW50IElOREVOVAorCSAqIHNldCBuZXdJbmRlbnQKKwkgKiB4LnRvU3RyZWFtKCBvcyAsIGFyZyApCisJICogcmVzdG9yZSBvbGQgSU5ERU5UCisJICovCisJdGVtcGxhdGU8IGNsYXNzIFQgLCBjbGFzcyBQID4KKwlpbmxpbmUgT3V0U3RyZWFtICYgdG9TdHJlYW0oY29uc3QgVCAmIHgsCisJCQljb25zdCBQICYgYXJnLCBjb25zdCBBdm1JbmRlbnQgJiBuZXdJbmRlbnQpCisJeworCQlwdXNoKCk7CisKKwkJSU5ERU5UID0gbmV3SW5kZW50OworCisJCXgudG9TdHJlYW0oICp0aGlzICwgYXJnICk7CisKKwkJcG9wKCk7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCisJLyoqCisJICogQ0FTVAorCSAqIHN0ZDo6b3N0cmVhbSAmCisJICovCisJaW5saW5lIG9wZXJhdG9yIHN0ZDo6b3N0cmVhbSAmICgpIGNvbnN0CisJeworCQlyZXR1cm4oICpPUyApOworCX0KKworCisJLyoqCisJICogTE9BRAorCSAqIERJU1BPU0UKKwkgKi8KKwlzdGF0aWMgdm9pZCBsb2FkKCk7CisJc3RhdGljIHZvaWQgZGlzcG9zZSgpOworCisJLyoqCisJICogQ09ORklHVVJFCisJICovCisJc3RhdGljIGJvb2wgY29uZmlndXJlKFdvcmtmbG93ICogYVdvcmtmbG93KTsKKworfTsKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ09OU09MRSBQUk9NUFQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitleHRlcm4gY29uc3Qgc3RkOjpzdHJpbmcgJiBDT05TT0xFX0RFQlVHX1BST01QVDsKK2V4dGVybiBjb25zdCBzdGQ6OnN0cmluZyAmIENPTlNPTEVfU0VXX1BST01QVDsKK2V4dGVybiBjb25zdCBzdGQ6OnN0cmluZyAmIENPTlNPTEVfQ09ORklHX1BST01QVDsKK2V4dGVybiBjb25zdCBzdGQ6OnN0cmluZyAmIENPTlNPTEVfU1lNQkVYX1BST01QVDsKKworCitpbmxpbmUgdm9pZCBfREJHXyhPdXRTdHJlYW0gJiBvcykKK3sKKwlvcyA8PCBDT05TT0xFX0RFQlVHX1BST01QVDsKK30KKworaW5saW5lIHZvaWQgX1NFV18oT3V0U3RyZWFtICYgb3MpCit7CisJb3MgPDwgQ09OU09MRV9TRVdfUFJPTVBUOworfQorCitpbmxpbmUgdm9pZCBfQ0ZHXyhPdXRTdHJlYW0gJiBvcykKK3sKKwlvcyA8PCBDT05TT0xFX0NPTkZJR19QUk9NUFQ7Cit9CisKK2lubGluZSB2b2lkIF9TQlhfKE91dFN0cmVhbSAmIG9zKQoreworCW9zIDw8IENPTlNPTEVfU1lNQkVYX1BST01QVDsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNDT1BFIDogZm9yIGF1dG9tYXRpYyBQVVNIIC8gUE9QICBBdm1JbmRlbnQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdHJ1Y3QgU2NvcGVOZXdJbmRlbnQKK3sKKwlPdXRTdHJlYW0gJiBPUzsKKworCUF2bUluZGVudCBJTkRFTlQ7CisKKwlTY29wZU5ld0luZGVudChPdXRTdHJlYW0gJiBvcywgY29uc3QgQXZtSW5kZW50ICYgaW5kZW50KQorCTogT1MoIG9zICksCisJLy8gc2F2ZSBjdXJyZW50IGluZGVudAorCUlOREVOVCggb3MuSU5ERU5UICkKKwl7CisJCS8vIHNldCBuZXcgaW5kZW50CisJCW9zLklOREVOVCA9IGluZGVudDsKKwl9CisKKwlTY29wZU5ld0luZGVudChPdXRTdHJlYW0gJiBvcywKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgdGFicyAgID0gIiIsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIF9jaGFyXyA9ICJcdCIsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGVvbCAgICA9ICJcbiIpCisJOiBPUyggb3MgKSwKKwkvLyBzYXZlIGN1cnJlbnQgaW5kZW50CisJSU5ERU5UKCBvcy5JTkRFTlQgKQorCXsKKwkJLy8gc2V0IG5ldyBpbmRlbnQKKwkJb3MuSU5ERU5UID0gQXZtSW5kZW50KHRhYnMsIF9jaGFyXyxlb2wpOworCX0KKworCX5TY29wZU5ld0luZGVudCgpCisJeworCQkvLyByZXN0b3JlIG9sZCBpbmRlbnQKKwkJT1MuSU5ERU5UID0gSU5ERU5UOworCX0KK307CisKKworLyoqCisgKiBTQ09QRQorICogZm9yIGF1dG9tYXRpYyBJTkNSRU1FTlQgLyBERUNSRU1FTlQKKyAqLworc3RydWN0IFNjb3BlSW5jckluZGVudAoreworCU91dFN0cmVhbSAmIE9TOworCisJU2NvcGVJbmNySW5kZW50KE91dFN0cmVhbSAmIG9zKQorCTogT1MoIG9zICkKKwl7CisJCS8vIGluY3JlbWVudCBpbmRlbnQKKwkJb3MuaW5jcigpOworCX0KKworCX5TY29wZUluY3JJbmRlbnQoKQorCXsKKwkJLy8gZGVjcmVtZW50IGluZGVudAorCQlPUy5kZWNyKCk7CisJfQorfTsKKworCisvKioKKyAqIFdyYXBEYXRhIE1hbmlwdWxhdG9ycworICovCitpbmxpbmUgdm9pZCBFTkRfV1JBUChPdXRTdHJlYW0gJiBvcykKK3sKKwlvcy5lbmRfd3JhcCgpOworfQorCitpbmxpbmUgdm9pZCBFTkRfV1JBUF9FT0woT3V0U3RyZWFtICYgb3MpCit7CisJb3MuZW5kX3dyYXAoKTsKKworCW9zIDw8IG9zLklOREVOVC5FT0w7Cit9CisKKy8qKgorICogQXZtVEFCCisgKi8KK2lubGluZSB2b2lkIElHTk9SRV9GSVJTVF9UQUIoT3V0U3RyZWFtICYgb3MpCit7CisJb3MuSU5ERU5ULklHTk9SRV9GSVJTVF9UQUIgPSB0cnVlOworfQorCisKK2lubGluZSB2b2lkIFRBQihPdXRTdHJlYW0gJiBvcykKK3sKKwlpZiggb3MuSU5ERU5ULklHTk9SRV9GSVJTVF9UQUIgKQorCXsKKwkJb3MuSU5ERU5ULklHTk9SRV9GSVJTVF9UQUIgPSBmYWxzZTsKKwl9CisJZWxzZQorCXsKKwkJb3MgPDwgb3MuSU5ERU5ULlRBQlM7CisJfQorfQorCitpbmxpbmUgdm9pZCBUQUIxKE91dFN0cmVhbSAmIG9zKQoreworCWlmKCBvcy5JTkRFTlQuSUdOT1JFX0ZJUlNUX1RBQiApCisJeworCQlvcy5JTkRFTlQuSUdOT1JFX0ZJUlNUX1RBQiA9IGZhbHNlOworCX0KKwllbHNlCisJeworCQlvcyA8PCBvcy5JTkRFTlQuVEFCUzsKKwl9Cit9CisKKworaW5saW5lIHZvaWQgVEFCMihPdXRTdHJlYW0gJiBvcykKK3sKKwlvcyA8PCBvcy5JTkRFTlQuVEFCUyA8PCBvcy5JTkRFTlQuQ0hBUjsKK30KKworaW5saW5lIHZvaWQgVEFCMyhPdXRTdHJlYW0gJiBvcykKK3sKKwlvcyA8PCBvcy5JTkRFTlQuVEFCUyA8PCBvcy5JTkRFTlQuQ0hBUiA8PCBvcy5JTkRFTlQuQ0hBUjsKK30KKworaW5saW5lIHZvaWQgVEFCNChPdXRTdHJlYW0gJiBvcykKK3sKKwlvcyA8PCBvcy5JTkRFTlQuVEFCUyA8PCBvcy5JTkRFTlQuQ0hBUiA8PCBvcy5JTkRFTlQuQ0hBUgorCQkJPDwgb3MuSU5ERU5ULkNIQVI7Cit9CisKK2lubGluZSB2b2lkIFRBQjUoT3V0U3RyZWFtICYgb3MpCit7CisJb3MgPDwgb3MuSU5ERU5ULlRBQlMgPDwgb3MuSU5ERU5ULkNIQVIgPDwgb3MuSU5ERU5ULkNIQVIKKwkJCTw8IG9zLklOREVOVC5DSEFSIDw8IG9zLklOREVOVC5DSEFSOworfQorCisKKy8qKgorICogKytUQUIKKyAqIC0tVEFCCisgKi8KK2lubGluZSB2b2lkIElOQ1JfSU5ERU5UX1RBQihPdXRTdHJlYW0gJiBvcykKK3sKKwlvcy5pbmNyKCk7CisKKwlvcyA8PCBvcy5JTkRFTlQuVEFCUzsKK30KKworaW5saW5lIHZvaWQgREVDUl9JTkRFTlRfVEFCKE91dFN0cmVhbSAmIG9zKQoreworCW9zLmRlY3IoKTsKKworCW9zIDw8IG9zLklOREVOVC5UQUJTOworfQorCitpbmxpbmUgdm9pZCBERUNSX0lOREVOVF9UQUIyKE91dFN0cmVhbSAmIG9zKQoreworCW9zLmRlY3IoKTsKKworCW9zIDw8IG9zLklOREVOVC5UQUJTIDw8IG9zLklOREVOVC5DSEFSOworfQorCisKK2lubGluZSB2b2lkIElOQ1IyX0lOREVOVF9UQUIoT3V0U3RyZWFtICYgb3MpCit7CisJb3MuaW5jcigyKTsKKworCW9zIDw8IG9zLklOREVOVC5UQUJTOworfQorCitpbmxpbmUgdm9pZCBERUNSMl9JTkRFTlRfVEFCKE91dFN0cmVhbSAmIG9zKQoreworCW9zLmRlY3IoMik7CisKKwlvcyA8PCBvcy5JTkRFTlQuVEFCUzsKK30KKworaW5saW5lIHZvaWQgREVDUjJfSU5ERU5UX1RBQjIoT3V0U3RyZWFtICYgb3MpCit7CisJb3MuZGVjcigyKTsKKworCW9zIDw8IG9zLklOREVOVC5UQUJTIDw8IG9zLklOREVOVC5DSEFSOworfQorCisKKy8qKgorICogVEFCKysKKyAqIFRBQi0tCisgKi8KK2lubGluZSB2b2lkIFRBQl9JTkNSX0lOREVOVChPdXRTdHJlYW0gJiBvcykKK3sKKwlvcyA8PCBvcy5JTkRFTlQuVEFCUzsKKworCW9zLmluY3IoKTsKK30KKworaW5saW5lIHZvaWQgVEFCX0RFQ1JfSU5ERU5UKE91dFN0cmVhbSAmIG9zKQoreworCW9zIDw8IG9zLklOREVOVC5UQUJTOworCisJb3MuZGVjcigpOworfQorCisKK2lubGluZSB2b2lkIFRBQl9JTkNSMl9JTkRFTlQoT3V0U3RyZWFtICYgb3MpCit7CisJb3MgPDwgb3MuSU5ERU5ULlRBQlM7CisKKwlvcy5pbmNyKDIpOworfQorCitpbmxpbmUgdm9pZCBUQUJfREVDUjJfSU5ERU5UKE91dFN0cmVhbSAmIG9zKQoreworCW9zIDw8IG9zLklOREVOVC5UQUJTOworCisJb3MuZGVjcigyKTsKK30KKworCisvKioKKyAqIElOQ1IKKyAqIERFQ1IKKyAqIElOREVOVEFUSU9OCisgKi8KK2lubGluZSB2b2lkIElOQ1JfSU5ERU5UKE91dFN0cmVhbSAmIG9zKQoreworCW9zLmluY3IoKTsKK30KKworaW5saW5lIHZvaWQgREVDUl9JTkRFTlQoT3V0U3RyZWFtICYgb3MpCit7CisJb3MuZGVjcigpOworfQorCisKK2lubGluZSB2b2lkIElOQ1IyX0lOREVOVChPdXRTdHJlYW0gJiBvcykKK3sKKwlvcy5pbmNyKDIpOworfQorCitpbmxpbmUgdm9pZCBERUNSMl9JTkRFTlQoT3V0U3RyZWFtICYgb3MpCit7CisJb3MuZGVjcigyKTsKK30KKworCitpbmxpbmUgdm9pZCBJTkNSM19JTkRFTlQoT3V0U3RyZWFtICYgb3MpCit7CisJb3MuaW5jcigzKTsKK30KKworaW5saW5lIHZvaWQgREVDUjNfSU5ERU5UKE91dFN0cmVhbSAmIG9zKQoreworCW9zLmRlY3IoMyk7Cit9CisKKy8qKgorICogTkVXCisgKiBFTkQKKyAqIElOREVOVEFUSU9OCisgKi8KK2lubGluZSBBdm1JbmRlbnQgTkVXX0lOREVOVCgKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiB0YWJzICAgPSAiIiwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBfY2hhcl8gPSAiXHQiLAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGVvbCAgICA9ICJcbiIpCit7CisJcmV0dXJuKCBBdm1JbmRlbnQodGFicywgX2NoYXJfLCBlb2wpICk7Cit9CisKK2lubGluZSBBdm1JbmRlbnQgJiBORVdfSU5ERU5UKEF2bUluZGVudCAmIGluZGVudCkKK3sKKwlyZXR1cm4oIGluZGVudCApOworfQorCisKK2lubGluZSBBdm1JbmRlbnQgTkVXX0xUUklNX0lOREVOVChjb25zdCBBdm1JbmRlbnQgJiBpbmRlbnQpCit7CisJcmV0dXJuKCBBdm1JbmRlbnQoIiIsIGluZGVudC5DSEFSLCBpbmRlbnQuRU9MKSApOworfQorCitpbmxpbmUgQXZtSW5kZW50IE5FV19MVFJJTV9JTkRFTlQoT3V0U3RyZWFtICYgb3MpCit7CisJcmV0dXJuKCBBdm1JbmRlbnQoIiIsIG9zLklOREVOVC5DSEFSLCBvcy5JTkRFTlQuRU9MKSApOworfQorCisKK2lubGluZSB2b2lkIEVORF9JTkRFTlQoT3V0U3RyZWFtICYgb3MpCit7CisJb3MucG9wKCk7Cit9CisKK2lubGluZSB2b2lkIEVORF9JTkRFTlRfRU9MKE91dFN0cmVhbSAmIG9zKQoreworCW9zLnBvcCgpOworCisJb3MgPDwgb3MuSU5ERU5ULkVPTDsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0dURV9NRURJVU0KKwlvcyA8PCBzdGQ6OmZsdXNoOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0dURV9NRURJVU0KK30KKworCisvKioKKyAqIEJhY2tTcGFjZQorICovCitpbmxpbmUgdm9pZCBCQUNLU1BBQ0UoT3V0U3RyZWFtICYgb3MpCit7CisJb3MuYmFja3NwYWNlKCk7Cit9CisKK2lubGluZSB2b2lkIEJBQ0tTUEFDRV9UQUIoT3V0U3RyZWFtICYgb3MpCit7CisJb3MuYmFja3NwYWNlKCk7CisKKwlvcyA8PCBvcy5JTkRFTlQuVEFCUzsKK30KKworCisvKioKKyAqIEF2bUVPTAorICovCitpbmxpbmUgdm9pZCBFT0woT3V0U3RyZWFtICYgb3MpCit7CisJb3MgPDwgb3MuSU5ERU5ULkVPTDsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0dURV9NRURJVU0KKwlvcyA8PCBzdGQ6OmZsdXNoOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0dURV9NRURJVU0KK30KKworaW5saW5lIHZvaWQgRU9MX1RBQihPdXRTdHJlYW0gJiBvcykKK3sKKwlvcyA8PCBvcy5JTkRFTlQuRU9MIDw8IG9zLklOREVOVC5UQUJTOworCitBVk1fSUZfREVCVUdfTEVWRUxfR1RFX01FRElVTQorCW9zIDw8IHN0ZDo6Zmx1c2g7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfR1RFX01FRElVTQorfQorCitpbmxpbmUgdm9pZCBFT0xfVEFCMihPdXRTdHJlYW0gJiBvcykKK3sKKwlvcyA8PCBvcy5JTkRFTlQuRU9MIDw8IG9zLklOREVOVC5UQUJTIDw8IG9zLklOREVOVC5DSEFSOworCitBVk1fSUZfREVCVUdfTEVWRUxfR1RFX01FRElVTQorCW9zIDw8IHN0ZDo6Zmx1c2g7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfR1RFX01FRElVTQorfQorCitpbmxpbmUgdm9pZCBFT0xfVEFCMyhPdXRTdHJlYW0gJiBvcykKK3sKKwlvcyA8PCBvcy5JTkRFTlQuRU9MIDw8IG9zLklOREVOVC5UQUJTCisJCQk8PCBvcy5JTkRFTlQuQ0hBUiA8PCBvcy5JTkRFTlQuQ0hBUjsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0dURV9NRURJVU0KKwlvcyA8PCBzdGQ6OmZsdXNoOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0dURV9NRURJVU0KK30KKworaW5saW5lIHZvaWQgRU9MX0ZMVVNIKE91dFN0cmVhbSAmIG9zKQoreworCW9zIDw8IG9zLklOREVOVC5FT0wgPDwgc3RkOjpmbHVzaDsKK30KKworCitpbmxpbmUgdm9pZCBFT0wyKE91dFN0cmVhbSAmIG9zKQoreworCW9zIDw8IG9zLklOREVOVC5FT0wgPDwgb3MuSU5ERU5ULkVPTDsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0dURV9NRURJVU0KKwlvcyA8PCBzdGQ6OmZsdXNoOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0dURV9NRURJVU0KK30KKworaW5saW5lIHZvaWQgRU9MMl9UQUIoT3V0U3RyZWFtICYgb3MpCit7CisJb3MgPDwgb3MuSU5ERU5ULkVPTCA8PCBvcy5JTkRFTlQuRU9MIDw8IG9zLklOREVOVC5UQUJTOworCitBVk1fSUZfREVCVUdfTEVWRUxfR1RFX01FRElVTQorCW9zIDw8IHN0ZDo6Zmx1c2g7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfR1RFX01FRElVTQorfQorCitpbmxpbmUgdm9pZCBFT0wyX0ZMVVNIKE91dFN0cmVhbSAmIG9zKQoreworCW9zIDw8IG9zLklOREVOVC5FT0wgPDwgb3MuSU5ERU5ULkVPTCA8PCBzdGQ6OmZsdXNoOworfQorCisKKy8qKgorICogKytUQUIKKyAqIC0tVEFCCisgKi8KK2lubGluZSB2b2lkIElOQ1JfRU9MKE91dFN0cmVhbSAmIG9zKQoreworCW9zLmluY3IoKTsKKworCW9zIDw8IG9zLklOREVOVC5FT0w7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9HVEVfTUVESVVNCisJb3MgPDwgc3RkOjpmbHVzaDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9HVEVfTUVESVVNCit9CisKK2lubGluZSB2b2lkIERFQ1JfRU9MKE91dFN0cmVhbSAmIG9zKQoreworCW9zLmRlY3IoKTsKKworCW9zIDw8IG9zLklOREVOVC5FT0w7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9HVEVfTUVESVVNCisJb3MgPDwgc3RkOjpmbHVzaDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9HVEVfTUVESVVNCit9CisKKworaW5saW5lIHZvaWQgRU9MX0lOQ1JfSU5ERU5UKE91dFN0cmVhbSAmIG9zKQoreworCW9zIDw8IG9zLklOREVOVC5FT0w7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9HVEVfTUVESVVNCisJb3MgPDwgc3RkOjpmbHVzaDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9HVEVfTUVESVVNCisKKwlvcy5pbmNyKCk7Cit9CisKK2lubGluZSB2b2lkIEVPTF9ERUNSX0lOREVOVChPdXRTdHJlYW0gJiBvcykKK3sKKwlvcyA8PCBvcy5JTkRFTlQuRU9MOworCitBVk1fSUZfREVCVUdfTEVWRUxfR1RFX01FRElVTQorCW9zIDw8IHN0ZDo6Zmx1c2g7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfR1RFX01FRElVTQorCisJb3MuZGVjcigpOworfQorCisKK2lubGluZSB2b2lkIEVPTF9JTkNSMl9JTkRFTlQoT3V0U3RyZWFtICYgb3MpCit7CisJb3MgPDwgb3MuSU5ERU5ULkVPTDsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0dURV9NRURJVU0KKwlvcyA8PCBzdGQ6OmZsdXNoOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0dURV9NRURJVU0KKworCW9zLmluY3IoMik7Cit9CisKK2lubGluZSB2b2lkIEVPTF9ERUNSMl9JTkRFTlQoT3V0U3RyZWFtICYgb3MpCit7CisJb3MgPDwgb3MuSU5ERU5ULkVPTDsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0dURV9NRURJVU0KKwlvcyA8PCBzdGQ6OmZsdXNoOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0dURV9NRURJVU0KKworCW9zLmRlY3IoMik7Cit9CisKK2lubGluZSB2b2lkIEVPTF9GTFVTSF9ERUNSX0lOREVOVChPdXRTdHJlYW0gJiBvcykKK3sKKwlvcyA8PCBvcy5JTkRFTlQuRU9MIDw8IHN0ZDo6Zmx1c2g7CisKKwlvcy5kZWNyKCk7Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFN0cmluZ091dFN0cmVhbQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NsYXNzIFN0cmluZ091dFN0cmVhbSAgOiAgcHVibGljIE91dFN0cmVhbQoreworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQVRUUklCVVRFCisJICovCisJc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJU3RyaW5nT3V0U3RyZWFtKGNvbnN0IEF2bUluZGVudCAmIGluZGVudCA9IEFWTV9UQUJfSU5ERU5UKQorCTogT3V0U3RyZWFtKCBvc3MgLCBpbmRlbnQgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJU3RyaW5nT3V0U3RyZWFtKAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiB0YWJzLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBfY2hhcl8gPSAiXHQiLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBlb2wgICAgPSAiXG4iKQorCTogT3V0U3RyZWFtKCBvc3MgLCB0YWJzICwgX2NoYXJfICwgZW9sICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCVN0cmluZ091dFN0cmVhbShjb25zdCBXcmFwRGF0YSAmIHdyYXBEYXRhLAorCQkJY29uc3QgQXZtSW5kZW50ICYgaW5kZW50ID0gQVZNX1RBQl9JTkRFTlQpCisJOiBPdXRTdHJlYW0oIG9zcyAsIGluZGVudCApCisJeworCQlPdXRTdHJlYW06Om9wZXJhdG9yPDwoIHdyYXBEYXRhICk7CisJfQorCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+U3RyaW5nT3V0U3RyZWFtKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogc3RyKCkKKwkgKi8KKwlpbmxpbmUgc3RkOjpzdHJpbmcgc3RyKCkgY29uc3QKKwl7CisJCU91dFN0cmVhbTo6Zmx1c2goKTsKKworCQlyZXR1cm4oIG9zcy5zdHIoKSApOworCX0KKworCWlubGluZSB2b2lkIHN0cihjb25zdCBzdGQ6OnN0cmluZyAmIGJ1ZikKKwl7CisJCU91dFN0cmVhbTo6Zmx1c2goKTsKKworCQlvc3Muc3RyKCBidWYgKTsKKwl9CisKKwkvKioKKwkgKiBjX3N0cigpCisJICovCisJaW5saW5lIGNvbnN0IGNoYXIgKiBjX3N0cigpIGNvbnN0CisJeworCQlPdXRTdHJlYW06OmZsdXNoKCk7CisKKwkJcmV0dXJuKCBvc3Muc3RyKCkuY19zdHIoKSApOworCX0KKworCisJLyoqCisJICogQ0FTVAorCSAqIHN0ZDo6c3RyaW5nCisJICogY29uc3QgY2hhciAqCisJICovCisJaW5saW5lIG9wZXJhdG9yIHN0ZDo6c3RyaW5nICgpIGNvbnN0CisJeworCQlPdXRTdHJlYW06OmZsdXNoKCk7CisKKwkJcmV0dXJuKCBvc3Muc3RyKCkgKTsKKwl9CisKKy8vCWlubGluZSBvcGVyYXRvciBjb25zdCBjaGFyICogKCkgY29uc3QKKy8vCXsKKy8vCQlPdXRTdHJlYW06OmZsdXNoKCk7CisvLworLy8JCXJldHVybiggb3NzLnN0cigpLmNfc3RyKCkgKTsKKy8vCX0KKworCisJLyoqCisJICogb3BlcmF0b3I8PAorCSAqLworCXRlbXBsYXRlPCBjbGFzcyBUID4KKwlpbmxpbmUgU3RyaW5nT3V0U3RyZWFtICYgb3BlcmF0b3I8PCggY29uc3QgVCAmIHggKQorCXsKKwkJT3V0U3RyZWFtOjpvcGVyYXRvcjw8KCB4ICk7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCisJaW5saW5lIFN0cmluZ091dFN0cmVhbSAmIG9wZXJhdG9yPDwoCisJCQl2b2lkICgqb3ApICggU3RyaW5nT3V0U3RyZWFtICYgKSApCisJeworCQlvcCggKnRoaXMgKTsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJaW5saW5lIFN0cmluZ091dFN0cmVhbSAmIG9wZXJhdG9yPDwoIHZvaWQgKCpvcCkgKCBPdXRTdHJlYW0gJiApICkKKwl7CisJCW9wKCAqdGhpcyApOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwlpbmxpbmUgU3RyaW5nT3V0U3RyZWFtICYgb3BlcmF0b3I8PCgKKwkJCXN0ZDo6b3N0cmVhbSAmICgqb3ApICggc3RkOjpvc3RyZWFtICYgKSApCisJeworCQlvcCggKnRoaXMgKTsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCit9OworCisvKioKKyAqIFRZUEVERUYKKyAqIHRvX3N0cmluZygpIHRlbXBsYXRlIHJlcGxhY2VtZW50IGJ5IE9TUygpCisgKi8KK3R5cGVkZWYgU3RyaW5nT3V0U3RyZWFtICBPU1M7CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY2xhc3MgTnVsbE91dFN0cmVhbSAgOiAgcHVibGljIE91dFN0cmVhbQoreworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJTnVsbE91dFN0cmVhbSgpCisJOiBPdXRTdHJlYW0oICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5OdWxsT3V0U3RyZWFtKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogb3BlcmF0b3I8PAorCSAqLworCXRlbXBsYXRlPCBjbGFzcyBUID4KKwlpbmxpbmUgTnVsbE91dFN0cmVhbSAmIG9wZXJhdG9yPDwoY29uc3QgVCAmIHgpCisJeworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCit9OworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUGFpck91dFN0cmVhbQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NsYXNzIFBhaXJPdXRTdHJlYW0KK3sKKworcHVibGljOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlPdXRTdHJlYW0gJiBPUzE7CisJT3V0U3RyZWFtICYgT1MyOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlQYWlyT3V0U3RyZWFtKE91dFN0cmVhbSAmIG9zMSwgT3V0U3RyZWFtICYgb3MyKQorCTogT1MxKCBvczEgKSAsIE9TMiggb3MyICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgflBhaXJPdXRTdHJlYW0oKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBvcGVyYXRvcjw8CisJICovCisJdGVtcGxhdGU8IGNsYXNzIFQgPgorCWlubGluZSBQYWlyT3V0U3RyZWFtICYgb3BlcmF0b3I8PCggY29uc3QgVCAmIHggKQorCXsKKwkJT1MxIDw8IHg7CisJCU9TMiA8PCB4OworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKworCWlubGluZSBQYWlyT3V0U3RyZWFtICYgb3BlcmF0b3I8PCggdm9pZCAoKm9wKSAoIE91dFN0cmVhbSAmICkgKQorCXsKKwkJb3AoIE9TMSApOworCQlvcCggT1MyICk7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCWlubGluZSBQYWlyT3V0U3RyZWFtICYgb3BlcmF0b3I8PCgKKwkJCXN0ZDo6b3N0cmVhbSAmICgqb3ApICggc3RkOjpvc3RyZWFtICYgKSApCisJeworCQlvcCggT1MxICk7CisJCW9wKCBPUzIgKTsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIGJhY2tzcGFjZSgpCisJeworCQlPUzEuYmFja3NwYWNlKCk7CisJCU9TMi5iYWNrc3BhY2UoKTsKKwl9CisKK307CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFRyaXBsZU91dFN0cmVhbQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NsYXNzIFRyaXBsZU91dFN0cmVhbQoreworCitwdWJsaWM6CisJLyoqCisJICogQVRSSUJVVEVTCisJICovCisJT3V0U3RyZWFtICYgT1MxOworCU91dFN0cmVhbSAmIE9TMjsKKwlPdXRTdHJlYW0gJiBPUzM7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCVRyaXBsZU91dFN0cmVhbShPdXRTdHJlYW0gJiBvczEsIE91dFN0cmVhbSAmIG9zMiwgT3V0U3RyZWFtICYgb3MzKQorCTogT1MxKCBvczEgKSAsIE9TMiggb3MyICkgLCBPUzMoIG9zMyApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5UcmlwbGVPdXRTdHJlYW0oKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBvcGVyYXRvcjw8CisJICovCisJdGVtcGxhdGU8IGNsYXNzIFQgPgorCWlubGluZSBUcmlwbGVPdXRTdHJlYW0gJiBvcGVyYXRvcjw8KCBjb25zdCBUICYgeCApCisJeworCQlPUzEgPDwgeDsKKwkJT1MyIDw8IHg7CisJCU9TMyA8PCB4OworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKworCWlubGluZSBUcmlwbGVPdXRTdHJlYW0gJiBvcGVyYXRvcjw8KCB2b2lkICgqb3ApICggT3V0U3RyZWFtICYgKSApCisJeworCQlvcCggT1MxICk7CisJCW9wKCBPUzIgKTsKKwkJb3AoIE9TMyApOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwlpbmxpbmUgVHJpcGxlT3V0U3RyZWFtICYgb3BlcmF0b3I8PCgKKwkJCXN0ZDo6b3N0cmVhbSAmICgqb3ApICggc3RkOjpvc3RyZWFtICYgKSApCisJeworCQlvcCggT1MxICk7CisJCW9wKCBPUzIgKTsKKwkJb3AoIE9TMyApOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKworCWlubGluZSB2aXJ0dWFsIHZvaWQgYmFja3NwYWNlKCkKKwl7CisJCU9TMS5iYWNrc3BhY2UoKTsKKwkJT1MyLmJhY2tzcGFjZSgpOworCQlPUzMuYmFja3NwYWNlKCk7CisJfQorCit9OworCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBvcGVyYXRvcjw8CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBBVk1fT1NfU1RSRUFNKCBUICkgIFwKK2lubGluZSBPdXRTdHJlYW0gJiBvcGVyYXRvcjw8KE91dFN0cmVhbSAmIG9zLCBjb25zdCBUICYgYW5FbGVtZW50KSBcCit7IFwKKwlhbkVsZW1lbnQudG9TdHJlYW0oIG9zICk7IFwKKwlyZXR1cm4oIG9zICk7IFwKK30gXAoraW5saW5lIFN0cmluZ091dFN0cmVhbSAmIG9wZXJhdG9yPDwoU3RyaW5nT3V0U3RyZWFtICYgb3MsIGNvbnN0IFQgJiBhbkVsZW1lbnQpIFwKK3sgXAorCWFuRWxlbWVudC50b1N0cmVhbSggb3MgKTsgXAorCXJldHVybiggb3MgKTsgXAorfSBcCitpbmxpbmUgUGFpck91dFN0cmVhbSAmIG9wZXJhdG9yPDwoUGFpck91dFN0cmVhbSAmIG9zLCBjb25zdCBUICYgYW5FbGVtZW50KSBcCit7IFwKKwlhbkVsZW1lbnQudG9TdHJlYW0oIG9zLk9TMSApOyBcCisJYW5FbGVtZW50LnRvU3RyZWFtKCBvcy5PUzIgKTsgXAorCXJldHVybiggb3MgKTsgXAorfSBcCitpbmxpbmUgVHJpcGxlT3V0U3RyZWFtICYgb3BlcmF0b3I8PChUcmlwbGVPdXRTdHJlYW0gJiBvcywgY29uc3QgVCAmIGFuRWxlbWVudCkgXAoreyBcCisJYW5FbGVtZW50LnRvU3RyZWFtKCBvcy5PUzEgKTsgXAorCWFuRWxlbWVudC50b1N0cmVhbSggb3MuT1MyICk7IFwKKwlhbkVsZW1lbnQudG9TdHJlYW0oIG9zLk9TMyApOyBcCisJcmV0dXJuKCBvcyApOyBcCit9CisKKworI2RlZmluZSBBVk1fT1NfU1RSRUFNX0NPTExFQ1RJT04oIFQgKSAgXAoraW5saW5lIE91dFN0cmVhbSAmIG9wZXJhdG9yPDwoT3V0U3RyZWFtICYgb3MsIGNvbnN0IFQgJiBhbkVsZW1lbnQpIFwKK3sgXAorCVQ6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gYW5FbGVtZW50LmVuZCgpOyBcCisJZm9yKCBUOjpjb25zdF9pdGVyYXRvciBpdCA9IGFuRWxlbWVudC5iZWdpbigpIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkgXAorCXsgXAorCQlvcyA8PCAoKml0KTsgXAorCX0gXAorCXJldHVybiggb3MgKTsgXAorfSBcCitpbmxpbmUgUGFpck91dFN0cmVhbSAmIG9wZXJhdG9yPDwoUGFpck91dFN0cmVhbSAmIG9zLCBjb25zdCBUICYgYW5FbGVtZW50KSBcCit7IFwKKwlUOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IGFuRWxlbWVudC5lbmQoKTsgXAorCWZvciggVDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBhbkVsZW1lbnQuYmVnaW4oKSA7IGl0ICE9IGVuZEl0IDsgKytpdCApIFwKKwl7IFwKKwkJb3MgPDwgKCppdCk7IFwKKwl9IFwKKwlyZXR1cm4oIG9zICk7IFwKK30gXAoraW5saW5lIFRyaXBsZU91dFN0cmVhbSAmIG9wZXJhdG9yPDwoVHJpcGxlT3V0U3RyZWFtICYgb3MsIGNvbnN0IFQgJiBhbkVsZW1lbnQpIFwKK3sgXAorCVQ6OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gYW5FbGVtZW50LmVuZCgpOyBcCisJZm9yKCBUOjpjb25zdF9pdGVyYXRvciBpdCA9IGFuRWxlbWVudC5iZWdpbigpIDsgaXQgIT0gZW5kSXQgOyArK2l0ICkgXAorCXsgXAorCQlvcyA8PCAoKml0KTsgXAorCX0gXAorCXJldHVybiggb3MgKTsgXAorfSBcCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTQVZFICYgUkVESVJFQ1QgJiBSRVNUT1JFIFNUUkVBTUJVRgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIHNhdmUgb3JpZ2luYWwgc3RyZWFtOjpzYnVmCisvLyByZWRpcmVjdCBzdHJlYW06OnNidWYKKyNkZWZpbmUgU1RSRUFNQlVGX1NBVkVfUkVESVJFQ1QoIG9yaWdpbmFsU3RyZWFtICwgdGFyZ2V0U3RyZWFtICkgXAorCQlzdGQ6OnN0cmVhbWJ1ZiAqIHNhdmVTQlVGID0gb3JpZ2luYWxTdHJlYW0ucmRidWYoKTsgXAorCQlvcmlnaW5hbFN0cmVhbS5yZGJ1ZiggdGFyZ2V0U3RyZWFtLnJkYnVmKCkgKTsKKworCisvLyByZXN0b3JlIHRoZSBvcmlnaW5hbCBzdHJlYW06OnNidWYKKyNkZWZpbmUgU1RSRUFNQlVGX1JFU1RPUkUoIG9yaWdpbmFsU3RyZWFtICkgXAorCQlvcmlnaW5hbFN0cmVhbS5yZGJ1Ziggc2F2ZVNCVUYgKTsKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gR0xPQkFMIFBSRS1ERUZJTkVEIFNUUkVBTQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICogVVRJTCBWQVJJQUJMRQorICogQVZNX09TX05VTEwKKyAqLworZXh0ZXJuIHN0ZDo6b3N0cmVhbSAqIF9hdm1fb3NfbnVsbF87CisKK2V4dGVybiBOdWxsT3V0U3RyZWFtIEFWTV9PU19OVUxMOworCisKKy8qKgorICogQVZNIENPVVQgJiBDRVJSICYgREVCVUcKKyAqLworZXh0ZXJuIE91dFN0cmVhbSBBVk1fT1NfQ09VVDsKKworZXh0ZXJuIE91dFN0cmVhbSBBVk1fT1NfQ0VSUjsKKworZXh0ZXJuIE91dFN0cmVhbSBBVk1fT1NfREVCVUc7CisKKworLyoqCisgKiBBVk0gTE9HICYgVFJBQ0UgRklMRSBMT0NBVElPTgorICovCitleHRlcm4gc3RkOjpzdHJpbmcgQVZNX0xPR19GSUxFX0xPQ0FUSU9OOworCitleHRlcm4gc3RkOjpzdHJpbmcgQVZNX1RSQUNFX0ZJTEVfTE9DQVRJT047CisKKworLyoqCisgKiBVVElMIFZBUklBQkxFCisgKiBBVk1fT1NfTE9HCisgKi8KK2V4dGVybiBzdGQ6Om9zdHJlYW0gKiBfYXZtX29zX2xvZ187CisKK2V4dGVybiBPdXRTdHJlYW0gQVZNX09TX0xPRzsKKworCisvKioKKyAqIFVUSUwgVkFSSUFCTEUKKyAqIEFWTV9PU19UUkFDRQorICovCitleHRlcm4gc3RkOjpvc3RyZWFtICogX2F2bV9vc190cmFjZV87CisKK2V4dGVybiBPdXRTdHJlYW0gQVZNX09TX1RSQUNFOworCisKKy8qKgorICogVVRJTCBWQVJJQUJMRQorICogQVZNX09TX1dBUk4gYXMgQVZNX09TX0NFUlIgJiBBVk1fT1NfVFJBQ0UKKyAqLwordHlwZWRlZiBQYWlyT3V0U3RyZWFtIFdhcm5PdXRzdHJlYW1UOworCitleHRlcm4gV2Fybk91dHN0cmVhbVQgIEFWTV9PU19XQVJOOworCisvKioKKyAqIFVUSUwgVkFSSUFCTEUKKyAqIEFWTV9PU19JTkZPIGFzIEFWTV9PU19DT1VUICYgQVZNX09TX1RSQUNFCisgKi8KK3R5cGVkZWYgUGFpck91dFN0cmVhbSAgSW5mb091dHN0cmVhbVQ7CisKK2V4dGVybiBJbmZvT3V0c3RyZWFtVCBBVk1fT1NfSU5GTzsKKworLyoqCisgKiBVVElMIFZBUklBQkxFCisgKiBBVk1fT1NfQ0xPRyBhcyBBVk1fT1NfQ09VVCAmIEFWTV9PU19MT0cKKyAqLwordHlwZWRlZiBQYWlyT3V0U3RyZWFtICBDTG9nT3V0c3RyZWFtVDsKKworZXh0ZXJuIEluZm9PdXRzdHJlYW1UIEFWTV9PU19DTE9HOworCisvKioKKyAqIFVUSUwgVkFSSUFCTEUKKyAqIEFWTV9PU19UREQKKyAqIGZvciBUZXN0IERyaXZlbiBEZXZlbG9wbWVudAorICovCitleHRlcm4gc3RkOjpvc3RyZWFtICogX2F2bV9vc190ZGRfOworCitleHRlcm4gT3V0U3RyZWFtIEFWTV9PU19UREQ7CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisjZW5kaWYgLyogUFJJTlRFUl9PVVRTVFJFQU1fSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3ByaW50ZXIvV3JhcFN0cmVhbS5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wcmludGVyL1dyYXBTdHJlYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MzQ1NDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wcmludGVyL1dyYXBTdHJlYW0uY3BwCkBAIC0wLDAgKzEsMTg2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMiBqdWluIDIwMTYKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBJbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIldyYXBTdHJlYW0uaCIKKworI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9RdWVyeS5oPgorI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9XT2JqZWN0Lmg+CisKKworbmFtZXNwYWNlIHNlcCB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gV3JhcE9zdHJlYW0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitXcmFwRGF0YSBERUZBVUxUX1dSQVBfREFUQSggODAsIDAsIDQsICJcblx0IiApOworCisKK2Jvb2wgV3JhcERhdGE6OmNvbmZpZ3VyZShXT2JqZWN0ICogd2ZQYXJhbWV0ZXJPYmplY3QpCit7CisJaWYoIHdmUGFyYW1ldGVyT2JqZWN0ICE9IFdPYmplY3Q6Ol9OVUxMXyApCisJeworCQlERUZBVUxUX1dSQVBfREFUQS5UQUJfV0lEVEggPQorCQkJCVF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eVBvc1NpemVUKHdmUGFyYW1ldGVyT2JqZWN0LAorCQkJCQlDT05TX1dJRDMoImNoYXIiLCAidGFiIiwgIndpZHRoIiksCisJCQkJCURFRkFVTFRfV1JBUF9EQVRBLlRBQl9XSURUSCk7CisKKwkJREVGQVVMVF9XUkFQX0RBVEEuTElORV9XSURUSCA9CisJCQkJUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5UG9zU2l6ZVQod2ZQYXJhbWV0ZXJPYmplY3QsCisJCQkJCUNPTlNfV0lEMygibGluZSIsICJ3cmFwIiwgIndpZHRoIiksCisJCQkJCURFRkFVTFRfV1JBUF9EQVRBLkxJTkVfV0lEVEgpOworCisJCURFRkFVTFRfV1JBUF9EQVRBLlNFUEFSQVRPUiA9CisJCQkJUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5U3RyaW5nKHdmUGFyYW1ldGVyT2JqZWN0LAorCQkJCQlDT05TX1dJRDMoImxpbmUiLCAid3JhcCIsICJzZXBhcmF0b3IiKSwKKwkJCQkJREVGQVVMVF9XUkFQX0RBVEEuU0VQQVJBVE9SKTsKKworCQlTdHJpbmdUb29sczo6cmVwbGFjZUFsbChERUZBVUxUX1dSQVBfREFUQS5TRVBBUkFUT1IsICJcXHQiICwgIlx0Iik7CisJCVN0cmluZ1Rvb2xzOjpyZXBsYWNlQWxsKERFRkFVTFRfV1JBUF9EQVRBLlNFUEFSQVRPUiwgIlxcbiIgLCAiXG4iKTsKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvLyBUaGlzIGlzIGJhc2ljYWxseSBhIGxpbmUtYnVmZmVyaW5nIHN0cmVhbSBtQnVmZmVyLgorLy8gVGhlIGFsZ29yaXRobSBpczoKKy8vIC0gRXhwbGljaXQgZW5kIG9mIGxpbmUgKCJcciIgb3IgIlxuIik6IHdlIGZsdXNoIG91ciBtQnVmZmVyCisvLyAgIHRvIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSdzIG1CdWZmZXIsIGFuZCBzZXQgb3VyIHJlY29yZCBvZgorLy8gICB0aGUgbGluZSBsZW5ndGggdG8gMC4KKy8vIC0gQW4gImFsZXJ0IiBjaGFyYWN0ZXI6IHNlbnQgdG8gdGhlIHVuZGVybHlpbmcgc3RyZWFtCisvLyAgIHdpdGhvdXQgcmVjb3JkaW5nIGl0cyBsZW5ndGgsIHNpbmNlIGl0IGRvZXNuJ3Qgbm9ybWFsbHkKKy8vICAgYWZmZWN0IHRoZSBhIGFwcGVhcmFuY2Ugb2YgdGhlIG91dHB1dC4KKy8vIC0gdGFiOiB0cmVhdGVkIGFzIG9jY3VweWluZyBgdGFiX3dpZHRoYCBjaGFyYWN0ZXJzLCBidXQgaXMKKy8vICAgcGFzc2VkIHRocm91Z2ggdW5kaXN0dXJiZWQgKGJ1dCBpZiB3ZSB3YW50ZWQgdG8gZXhwYW5kIGl0CisvLyAgIHRvIGB0YWJfd2lkdGhgIHNwYWNlcywgdGhhdCB3b3VsZCBiZSBwcmV0dHkgZWFzeSB0byBkbyBzbworLy8gICB5b3UgY291bGQgYWRqdXN0IHRoZSB0YWItd2lkdGggaWYgeW91IHdhbnRlZC4KKy8vIC0gRXZlcnl0aGluZyBlbHNlOiByZWFsbHkgYmFzaWMgYnVmZmVyaW5nIHdpdGggd29yZCB3cmFwcGluZy4KKy8vICAgV2UgdHJ5IHRvIGFkZCB0aGUgY2hhcmFjdGVyIHRvIHRoZSBtQnVmZmVyLCBhbmQgaWYgaXQgZXhjZWVkcworLy8gICBvdXIgbGluZSB3aWR0aCwgd2Ugc2VhcmNoIGZvciB0aGUgbGFzdCBzcGFjZS90YWIgaW4gdGhlCisvLyAgIG1CdWZmZXIgYW5kIGJyZWFrIHRoZSBsaW5lIHRoZXJlLiBJZiB0aGVyZSBpcyBubyBzcGFjZS90YWIsCisvLyAgIHdlIGJyZWFrIHRoZSBsaW5lIGF0IHRoZSBsaW1pdC4KK1dyYXBTdHJlYW1idWY6OmludF90eXBlIFdyYXBTdHJlYW1idWY6Om92ZXJmbG93KGludF90eXBlIGMpCit7CisJaWYgKHRyYWl0c190eXBlOjplcV9pbnRfdHlwZSh0cmFpdHNfdHlwZTo6ZW9mKCksIGMpKQorCXsKKwkJcmV0dXJuIHRyYWl0c190eXBlOjpub3RfZW9mKGMpOworCX0KKwlzd2l0Y2ggKGMpCisJeworCQljYXNlICdcbic6CisJCWNhc2UgJ1xyJzoKKwkJeworCQkJbUJ1ZmZlciArPSBjOworCQkJbUNoYXJDb3VudCA9IDA7CisKKwkJCWludF90eXBlIHJjID0gbVN0cmVhbWJ1Zi0+c3B1dG4obUJ1ZmZlci5jX3N0cigpLCBtQnVmZmVyLnNpemUoKSk7CisKKwkJCW1CdWZmZXIuY2xlYXIoKTsKKworCQkJcmV0dXJuIHJjOworCQl9CisKKwkJY2FzZSAnXGEnOgorCQl7CisJCQlyZXR1cm4gbVN0cmVhbWJ1Zi0+c3B1dGMoYyk7CisJCX0KKworCQljYXNlICdcdCc6CisJCXsKKwkJCWlmKCBtQ2hhckNvdW50ID4gbVdyYXBEYXRhLkxJTkVfV0lEVEggKQorCQkJeworCQkJCW1TdHJlYW1idWYtPnNwdXRuKG1XcmFwRGF0YS5TRVBBUkFUT1IuY19zdHIoKSwKKwkJCQkJCW1XcmFwRGF0YS5TRVBBUkFUT1Iuc2l6ZSgpKTsKKworCQkJCW1DaGFyQ291bnQgPSBtQnVmZmVyLnNpemUoKTsKKwkJCX0KKworCQkJbUJ1ZmZlciArPSBjOworCQkJbUNoYXJDb3VudCArPSAobVdyYXBEYXRhLlRBQl9XSURUSCAtCisJCQkJCW1DaGFyQ291bnQgJSBtV3JhcERhdGEuVEFCX1dJRFRIKTsKKworCQkJbVN0cmVhbWJ1Zi0+c3B1dG4obUJ1ZmZlci5jX3N0cigpLCBtQnVmZmVyLnNpemUoKSk7CisJCQltQnVmZmVyLmNsZWFyKCk7CisKKwkJCXJldHVybiBjOworCQl9CisJCWNhc2UgJyAnOgorCQljYXNlICcpJzoKKwkJY2FzZSAnfSc6CisJCWNhc2UgJ10nOgorCQljYXNlICcvJzoKKy8vCQljYXNlICcuJzoKKwkJeworCQkJaWYoIG1DaGFyQ291bnQgPiBtV3JhcERhdGEuTElORV9XSURUSCApCisJCQl7CisJCQkJbVN0cmVhbWJ1Zi0+c3B1dG4obVdyYXBEYXRhLlNFUEFSQVRPUi5jX3N0cigpLAorCQkJCQkJbVdyYXBEYXRhLlNFUEFSQVRPUi5zaXplKCkpOworCQkJCW1DaGFyQ291bnQgPSBtQnVmZmVyLnNpemUoKTsKKwkJCX0KKworCQkJbUJ1ZmZlciArPSBjOworCQkJKyttQ2hhckNvdW50OworCisJCQltU3RyZWFtYnVmLT5zcHV0bihtQnVmZmVyLmNfc3RyKCksIG1CdWZmZXIuc2l6ZSgpKTsKKwkJCW1CdWZmZXIuY2xlYXIoKTsKKworCQkJcmV0dXJuIGM7CisJCX0KKworCisJCWRlZmF1bHQ6CisJCXsKKwkJCWlmKCBtQnVmZmVyLnNpemUoKSA+PSBtV3JhcERhdGEuTElORV9XSURUSCApCisJCQl7CisJCQkJbVN0cmVhbWJ1Zi0+c3B1dG4obUJ1ZmZlci5jX3N0cigpLCBtQnVmZmVyLnNpemUoKSk7CisJCQkJbUJ1ZmZlci5jbGVhcigpOworCisJCQkJbVN0cmVhbWJ1Zi0+c3B1dG4obVdyYXBEYXRhLlNFUEFSQVRPUi5jX3N0cigpLAorCQkJCQkJbVdyYXBEYXRhLlNFUEFSQVRPUi5zaXplKCkpOworCisJCQkJbUNoYXJDb3VudCA9IDA7CisJCQl9CisKKy8vCQkJaWYgKG1DaGFyQ291bnQgPj0gbVdyYXBEYXRhLkxJTkVfV0lEVEgpCisvLwkJCXsKKy8vCQkJCXN0cmluZ190eXBlOjpzaXplX3R5cGUgd3BvcyA9IG1CdWZmZXIuZmluZF9sYXN0X29mKCIgXHQiKTsKKy8vCQkJCWlmICh3cG9zICE9IHN0cmluZ190eXBlOjpucG9zKQorLy8JCQkJeworLy8JCQkJCW1TdHJlYW1idWYtPnNwdXRuKG1CdWZmZXIuY19zdHIoKSwgd3Bvcyk7CisvLwkJCQkJbUNoYXJDb3VudCA9IG1CdWZmZXIuc2l6ZSgpLXdwb3MtMTsKKy8vCQkJCQltQnVmZmVyID0gc3RyaW5nX3R5cGUobUJ1ZmZlciwgd3BvcysxKTsKKy8vCQkJCX0KKy8vCQkJCWVsc2UKKy8vCQkJCXsKKy8vCQkJCQltU3RyZWFtYnVmLT5zcHV0bihtQnVmZmVyLmNfc3RyKCksIG1CdWZmZXIuc2l6ZSgpKTsKKy8vCQkJCQltQnVmZmVyLmNsZWFyKCk7CisvLwkJCQkJbUNoYXJDb3VudCA9IDA7CisvLwkJCQl9CisvLwkJCQltU3RyZWFtYnVmLT5zcHV0YygnXG4nKTsKKy8vCQkJfQorCisJCQltQnVmZmVyICs9IGM7CisJCQkrK21DaGFyQ291bnQ7CisKKwkJCXJldHVybiBjOworCQl9CisJfQorfQorCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcHJpbnRlci9XcmFwU3RyZWFtLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9wcmludGVyL1dyYXBTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTUxNzJkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvcHJpbnRlci9XcmFwU3RyZWFtLmgKQEAgLTAsMCArMSwyMzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyIGp1aW4gMjAxNgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIEltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFBSSU5URVJfV1JBUFNUUkVBTV9IXworI2RlZmluZSBQUklOVEVSX1dSQVBTVFJFQU1fSF8KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIFdPYmplY3Q7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFdyYXBEYXRhCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdHJ1Y3QgV3JhcERhdGEKK3sKKwkvKioKKwkgKiBBVFRSSUJVVEVTCisJICovCisJc3RkOjpzaXplX3QgIExJTkVfV0lEVEg7CisKKwlzdGQ6OnNpemVfdCAgSU5JVF9XSURUSDsKKworCXN0ZDo6c2l6ZV90ICBUQUJfV0lEVEg7CisKKwlzdGQ6OnN0cmluZyBTRVBBUkFUT1I7CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlXcmFwRGF0YShzdGQ6OnNpemVfdCBsaW5lV2lkdGgsCisJCQlzdGQ6OnNpemVfdCBpbml0V2lkdGggPSAwLCBzdGQ6OnNpemVfdCB0YWJXaWR0aCA9IDQsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIHdyYXBTZXBhcmF0b3IgPSAiXG5cdCIpCisJOiBMSU5FX1dJRFRIKCBsaW5lV2lkdGggKSwKKwlJTklUX1dJRFRIKCBpbml0V2lkdGggKSwKKwlUQUJfV0lEVEgoIHRhYldpZHRoICksCisJU0VQQVJBVE9SKCB3cmFwU2VwYXJhdG9yICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCVdyYXBEYXRhKHN0ZDo6c2l6ZV90IGluaXRXaWR0aCwgY29uc3QgV3JhcERhdGEgJiBhV3JhcERhdGEpCisJOiBMSU5FX1dJRFRIKCBhV3JhcERhdGEuTElORV9XSURUSCApLAorCUlOSVRfV0lEVEgoIGluaXRXaWR0aCApLAorCVRBQl9XSURUSCggYVdyYXBEYXRhLlRBQl9XSURUSCApLAorCVNFUEFSQVRPUiggYVdyYXBEYXRhLlNFUEFSQVRPUiApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlXcmFwRGF0YShjb25zdCBXcmFwRGF0YSAmIGFXcmFwRGF0YSkKKwk6IExJTkVfV0lEVEgoIGFXcmFwRGF0YS5MSU5FX1dJRFRIICksCisJSU5JVF9XSURUSCggYVdyYXBEYXRhLklOSVRfV0lEVEggKSwKKwlUQUJfV0lEVEgoIGFXcmFwRGF0YS5UQUJfV0lEVEggKSwKKwlTRVBBUkFUT1IoIGFXcmFwRGF0YS5TRVBBUkFUT1IgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwlib29sIGNvbmZpZ3VyZShXT2JqZWN0ICogd2ZQYXJhbWV0ZXJPYmplY3QpOworCit9OworCisKK2V4dGVybiBXcmFwRGF0YSBERUZBVUxUX1dSQVBfREFUQTsKKworCisvKioKKyAqIE1hbmlwdWxhdG9ycworICovCitpbmxpbmUgV3JhcERhdGEgV1JBUChzdGQ6OnNpemVfdCBsaW5lV2lkdGgsCisJCXN0ZDo6c2l6ZV90IGluaXRXaWR0aCA9IDAsIHN0ZDo6c2l6ZV90IHRhYldpZHRoID0gNCwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiB3cmFwU2VwYXJhdG9yID0gIlxuXHQiKQoreworCXJldHVybiggV3JhcERhdGEobGluZVdpZHRoLCBpbml0V2lkdGgsIHRhYldpZHRoLCB3cmFwU2VwYXJhdG9yKSApOworfQorCitpbmxpbmUgV3JhcERhdGEgV1JBUChzdGQ6OnNpemVfdCBsaW5lV2lkdGgsCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgd3JhcFNlcGFyYXRvcikKK3sKKwlyZXR1cm4oIFdyYXBEYXRhKGxpbmVXaWR0aCwgMCwgNCwgd3JhcFNlcGFyYXRvcikgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gV3JhcFN0cmVhbWJ1ZgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY2xhc3MgV3JhcFN0cmVhbWJ1ZiAgOiAgcHVibGljIHN0ZDo6c3RyZWFtYnVmCit7CisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBUWVBFREVGCisJICovCisJdHlwZWRlZiBzdGQ6OmJhc2ljX3N0cmluZzxjaGFyX3R5cGU+ICBzdHJpbmdfdHlwZTsKKworCS8qKgorCSAqIEFUVFJJQlVURQorCSAqLworCXN0ZDo6c3RyZWFtYnVmICogbVN0cmVhbWJ1ZjsKKworCVdyYXBEYXRhIG1XcmFwRGF0YTsKKworCXN0ZDo6c2l6ZV90IG1DaGFyQ291bnQ7CisKKwlzdHJpbmdfdHlwZSBtQnVmZmVyOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUlMKKwkgKi8KKwlXcmFwU3RyZWFtYnVmKHN0ZDo6c3RyZWFtYnVmICogYnVmLCBjb25zdCBXcmFwRGF0YSAmIHdyYXBEYXRhKQorCTogbVN0cmVhbWJ1ZiggYnVmICksCisJbVdyYXBEYXRhKCB3cmFwRGF0YSApLAorCW1DaGFyQ291bnQoIHdyYXBEYXRhLklOSVRfV0lEVEggKSwKKwltQnVmZmVyKCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwlXcmFwU3RyZWFtYnVmKHN0ZDo6c3RyZWFtYnVmICogYnVmLCBzdGQ6OnNpemVfdCBsaW5lV2lkdGgsCisJCQlzdGQ6OnNpemVfdCBpbml0V2lkdGggPSAwLCBzdGQ6OnNpemVfdCB0YWJXaWR0aCA9IDQsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIHdyYXBTZXBhcmF0b3IgPSAiXG5cdCIpCisJOiBtU3RyZWFtYnVmKCBidWYgKSwKKwltV3JhcERhdGEoIGxpbmVXaWR0aCwgaW5pdFdpZHRoLCB0YWJXaWR0aCwgd3JhcFNlcGFyYXRvciApLAorCW1DaGFyQ291bnQoIGluaXRXaWR0aCApLAorCW1CdWZmZXIoICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl+V3JhcFN0cmVhbWJ1ZigpCisJeworCQlmbHVzaCgpOworCX0KKworCS8qKgorCSAqIGZsdXNoKCkKKwkgKi8KKwlpbmxpbmUgaW50X3R5cGUgZmx1c2goKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtU3RyZWFtYnVmLT5zcHV0bihtQnVmZmVyLmNfc3RyKCksIG1CdWZmZXIuc2l6ZSgpKSApOworCisJfQorCitwcml2YXRlOgorCS8qKgorCSAqIG92ZXJmbG93KC4uLikKKwkgKi8KKwlpbnRfdHlwZSBvdmVyZmxvdyhpbnRfdHlwZSBjKTsKKworfTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gV3JhcE9zdHJlYW0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NsYXNzIFdyYXBPc3RyZWFtICA6ICBwdWJsaWMgc3RkOjpvc3RyZWFtCit7CisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBBVFRSSUJVVEUKKwkgKi8KKwlXcmFwU3RyZWFtYnVmIG1XcmFwU3RyZWFtYnVmOworCitwdWJsaWM6CisJc3RkOjpvc3RyZWFtICogbU9TOworCisJLyoqCisJICogQ09OU1RSVUNUT1JTCisJICovCisJV3JhcE9zdHJlYW0oc3RkOjpvc3RyZWFtICYgb3MsIGNvbnN0IFdyYXBEYXRhICYgd3JhcERhdGEpCisJOiBzdGQ6Om9zdHJlYW0oICYgbVdyYXBTdHJlYW1idWYgKSwKKwltV3JhcFN0cmVhbWJ1Ziggb3MucmRidWYoKSwgd3JhcERhdGEgKSwKKwltT1MoICYgb3MgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJV3JhcE9zdHJlYW0oc3RkOjpvc3RyZWFtICYgb3MsIHN0ZDo6c2l6ZV90IHdyYXBXaWR0aCwKKwkJCXN0ZDo6c2l6ZV90IGluaXRpYWxDaGFyQ291bnQgPSAwLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiB3cmFwU2VwYXJhdG9yID0gIlxuXHQiKQorCTogc3RkOjpvc3RyZWFtKCAmIG1XcmFwU3RyZWFtYnVmICksCisJbVdyYXBTdHJlYW1idWYoIG9zLnJkYnVmKCksIHdyYXBXaWR0aCwKKwkJCWluaXRpYWxDaGFyQ291bnQsIDQsIHdyYXBTZXBhcmF0b3IgKSwKKwltT1MoICYgb3MgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBmbHVzaCgpCisJICovCisJaW5saW5lIHZvaWQgZmx1c2goKSBjb25zdAorCXsKKwkJbVdyYXBTdHJlYW1idWYuZmx1c2goKTsKKwl9CisKK307CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKiBQUklOVEVSX1dSQVBTVFJFQU1fSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3Nldy9DTWFrZUxpc3RzLnR4dCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3Nldy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjFmN2FkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc2V3L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTggQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisjICAgICAgICAgICAgICAgICAgICAgICBDTWFrZSBmaWxlIGZvciB0aGUgU0VXIGxpYnJhcnkNCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorDQorIyBDKysgc291cmNlIGZpbGVzIHRvIHRha2UgaW50byBhY2NvdW50IChhbGwgZmlsZXMgbWF0Y2hpbmcgcGF0dGVybnMpDQorZmlsZSAoR0xPQl9SRUNVUlNFIFNFV19DWFhfU1JDX0ZJTEVTICouY3BwICouaCkNCisNCisjIFRhcmdldCB0byBidWlsZA0KK2FkZF9saWJyYXJ5IChzZXcgU1RBVElDICR7U0VXX0NYWF9TUkNfRklMRVN9KQ0KKw0KKyMgSW5jbHVkZSBkaXJlY3RvcmllcyAoaW50ZXJuYWwpDQordGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMgKHNldyBQVUJMSUMgLi4pICPCoEZJWE1FIDogZXhwbGljaXQgdGhlIGRlcGVuZGVuY2llcyBsaWIgYnkgbGliDQorDQorIyBUYXJnZXQgaW5jbHVkZSBkaXJlY3RvcmllcyAoZXh0ZXJuYWwpDQordGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMgKHNldyBQVUJMSUMgJHtHTVBfSU5DTFVERV9ESVJ9ICR7R01QWFhfSU5DTFVERV9ESVJ9KQ0KK3RhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzIChzZXcgUFVCTElDICR7Qk9PU1RfUk9PVH0pDQorDQorDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc2V3L0NvbmZpZ3VyYXRpb24uY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc2V3L0NvbmZpZ3VyYXRpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNzdlNmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9zZXcvQ29uZmlndXJhdGlvbi5jcHAKQEAgLTAsMCArMSw5NTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULg0KKyAqDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENyZWF0ZWQgb246IDE0IGTDqWMuIDIwMTYNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcg0KKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgSW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiDQorDQorI2luY2x1ZGUgPGZhbS9zZXJpYWxpemVyL0dyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyLmg+DQorI2luY2x1ZGUgPGZhbS9zZXJpYWxpemVyL0dyYXBoVml6U3RhdGVtYWNoaW5lU2VyaWFsaXplci5oPg0KKw0KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlU3lzdGVtLmg+DQorDQorI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9RdWVyeS5oPg0KKw0KKyNpbmNsdWRlIDxzZXcvU3ltYmV4RW5naW5lLmg+DQorI2luY2x1ZGUgPHNldy9Xb3JrZmxvdy5oPg0KKw0KKyNpbmNsdWRlIDx1dGlsL2F2bV92ZnMuaD4NCisNCisjaW5jbHVkZSA8Ym9vc3QvZm9ybWF0LmhwcD4NCisNCisNCituYW1lc3BhY2Ugc2VwDQorew0KKw0KKw0KKy8qKg0KKyAqIEFUVFJJQlVURVMNCisgKiBHTE9CQUwNCisgKi8NCitjb25zdCBzdGQ6OnN0cmluZyBDb25maWd1cmF0aW9uOjpTUEVDSUZJQ0FUSU9OX0ZJTEVfRVhURU5TSU9OICAgPSAiLnhsaWEiOw0KKw0KK2NvbnN0IHN0ZDo6c3RyaW5nIENvbmZpZ3VyYXRpb246OkVYRUNVVEFCTEVfRklMRV9FWFRFTlNJT04gICAgICA9ICIuZmV4ZSI7DQorDQorY29uc3Qgc3RkOjpzdHJpbmcgQ29uZmlndXJhdGlvbjo6U1lNQkVYX0dSQVBIX0ZJTEVfRVhURU5TSU9OICAgID0gIi5mZXQiOw0KKw0KK2NvbnN0IHN0ZDo6c3RyaW5nIENvbmZpZ3VyYXRpb246OlNZTUJFWF9TQ0VOQVJJSV9GSUxFX0VYVEVOU0lPTiA9ICIuZnNjbiI7DQorDQorY29uc3Qgc3RkOjpzdHJpbmcgQ29uZmlndXJhdGlvbjo6R1JBUEhWSVpfRklMRV9FWFRFTlNJT04gICAgICAgID0gIi5ndiI7DQorDQorDQorLyoqDQorICogQ09OU1RSVUNUT1INCisgKiBEZWZhdWx0DQorICovDQorQ29uZmlndXJhdGlvbjo6Q29uZmlndXJhdGlvbihTeW1iZXhFbmdpbmUgJiBhU3ltYmV4RW5naW5lLCBXb3JrZmxvdyAmIGFXb3JrZmxvdykNCis6IE5hbWVkRWxlbWVudCggQ0xBU1NfS0lORF9UKCBDb25maWd1cmF0aW9uICkgLCBhU3ltYmV4RW5naW5lICksDQorbVN5bWJleEVuZ2luZSggYVN5bWJleEVuZ2luZSApLA0KK21Xb3JrZmxvdyggYVdvcmtmbG93ICksDQorDQorbVdPYmplY3RNYW5hZ2VyKCBXT2JqZWN0OjpGTUxfRlFOX1JPT1QgKSwNCittUHJvamVjdFNvdXJjZUxvY2F0aW9uKCApLA0KK21TcGVjaWZpY2F0aW9uRmlsZUxvY2F0aW9uKCApLA0KKw0KK21Pd25lZFNwZWNpZmljYXRpb25GbGFnKCBmYWxzZSApLA0KKw0KK21PdXRwdXRGaWxlbmFtZVBhdHRlcm4oICJvdXRwdXRfJTElIiApLA0KK21EZWJ1Z0ZpbGVuYW1lUGF0dGVybiAoICJkZWJ1Z18lMSUiICApLA0KKw0KK21PdXRwdXRFeGVjdXRhYmxlRW5hYmxlZEdlbmVyYXRpb25GbGFnKCBmYWxzZSApLA0KK21PdXRwdXRFeGVjdXRhYmxlRmlsZUxvY2F0aW9uKCApLA0KKw0KK21PdXRwdXRTeW1iZXhHcmFwaEVuYWJsZWRHZW5lcmF0aW9uRmxhZyggZmFsc2UgKSwNCittT3V0cHV0U3ltYmV4R3JhcGhGaWxlTG9jYXRpb24oICksDQorDQorbU91dHB1dFN5bWJleFNjZW5hcmlpRW5hYmxlZEdlbmVyYXRpb25GbGFnKCBmYWxzZSApLA0KK21PdXRwdXRTeW1iZXhTY2VuYXJpaUZpbGVMb2NhdGlvbiggKSwNCisNCittRGVidWdTdGFnZUVuYWJsZWRGbGFnKCBmYWxzZSApLA0KK21EZWJ1Z1BhcnNpbmdTdGFnZUVuYWJsZWRGbGFnKCBmYWxzZSApLA0KK21EZWJ1Z0NvbXBpbGluZ1N0YWdlRW5hYmxlZEZsYWcoIGZhbHNlICksDQorbURlYnVnTG9hZGluZ1N0YWdlRW5hYmxlZEZsYWcoIGZhbHNlICksDQorbURlYnVnQ29tcHV0aW5nRW5hYmxlZEZsYWcoIGZhbHNlICksDQorDQorLy8gU3ltYmV4IFRocmVhZGluZyBjb25maWcNCittTXVsdGl0YXNraW5nRmxhZyggZmFsc2UgKSwNCittVGhyZWFkQ291bnQoIDEgKSwNCisNCisvLyBTaGVsbCBjb25maWcNCittSW5jb25kaXRpb25hbFN0b3BNYXJrZXJMb2NhdGlvbiggKSwNCisNCittU3BlY2lmaWNhdGlvbiggTlVMTCApLA0KK21FeGVjdXRhYmxlU3lzdGVtKCBOVUxMICksDQorDQorbVRhYmxlT2ZSSUQoICksDQorbU1haW5FeGVjdXRpb25Db250ZXh0KCApLA0KK21JbnB1dENvbnRleHQoICksDQorbVRyYWNlKCApDQorew0KKwkvLyEhIE5PVEhJTkcNCit9DQorDQorLyoqDQorICogREVTVFJVQ1RPUg0KKyAqLw0KK0NvbmZpZ3VyYXRpb246On5Db25maWd1cmF0aW9uKCkNCit7DQorCWRlc3Ryb3koKTsNCit9DQorDQordm9pZCBDb25maWd1cmF0aW9uOjpkZXN0cm95KCkNCit7DQorCWlmKCBtT3duZWRTcGVjaWZpY2F0aW9uRmxhZyApDQorCXsNCisJCWF2bV9yZXBvcnQoQVZNX09TX0xPRywgIkNvbmZpZ3VyYXRpb246OmRlc3Ryb3kiKTsNCisNCisJCWlmKCBtVHJhY2UucG9wdWxhdGVkKCkgKQ0KKwkJew0KKwkJCUV4ZWN1dGlvbkNvbnRleHQgKiBpdEVDOw0KKwkJCXdoaWxlKCBtVHJhY2Uubm9uZW1wdHkoKSApDQorCQkJew0KKwkJCQltVHJhY2UucG9wX2xhc3RfdG8oIGl0RUMgKTsNCisJCQkJbVRyYWNlLnJlbW92ZSggaXRFQyApOw0KKwkJCQlzZXA6OmRlc3Ryb3lFbGVtZW50KCBpdEVDICk7DQorCQkJfQ0KKwkJfQ0KKwkJZWxzZSBpZiggbVRyYWNlLm5vbmVtcHR5KCkgKQ0KKwkJew0KKwkJCXNlcDo6ZGVzdHJveUVsZW1lbnQoIG1UcmFjZS5wb3BfbGFzdCgpICk7DQorCQl9DQorDQorCQltTWFpbkV4ZWN1dGlvbkNvbnRleHQuZGVzdHJveSgpOw0KKw0KKwkJLy8gQXR0ZW50aW9uOj4gTmVjZXNzYWlyZSBwb3VyIGJyaXNlciBkZXMgcmVmZXJlbmNlcyBjaXJjdWxhaXJlcyAhISEhDQorCQlkZXN0cm95UklEUnVubmluZ0NvZGUoKTsNCisNCisJCW1FeGVjdXRhYmxlU3lzdGVtLmRlc3Ryb3koKTsNCisNCisJCWF2bV9yZXBvcnQoQVZNX09TX0xPRywgIn5Db25maWd1cmF0aW9uOjpkZXN0cm95Oj4gIg0KKwkJCQkiYWZ0ZXIgZGVzdHJ1Y3Rpb24gb2YgZXhlY3V0YWJsZSAmIGV4ZWN1dGlvbiBjb250ZXh0Iik7DQorDQorCQltU3BlY2lmaWNhdGlvbi5kZXN0cm95KCk7DQorDQorCQlhdm1fcmVwb3J0KEFWTV9PU19MT0csICJ+Q29uZmlndXJhdGlvbjo6ZGVzdHJveTo+ICINCisJCQkJImFmdGVyIGRlc3RydWN0aW9uIG9mIHNwZWNpZmljYXRpb24iKTsNCisJfQ0KK30NCisNCisvLyBBdHRlbnRpb246PiBOZWNlc3NhaXJlIHBvdXIgYnJpc2VyIGRlcyByZWZlcmVuY2VzIGNpcmN1bGFpcmVzICEhISENCit2b2lkIENvbmZpZ3VyYXRpb246OmRlc3Ryb3lSSURSdW5uaW5nQ29kZSgpDQorew0KKwlUYWJsZU9mUnVudGltZUlEX1Q6Oml0ZXJhdG9yIGl0ID0gbVRhYmxlT2ZSSUQuYmVnaW4oKTsNCisJVGFibGVPZlJ1bnRpbWVJRF9UOjppdGVyYXRvciBpdEVuZCA9IG1UYWJsZU9mUklELmVuZCgpOw0KKwlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkNCisJew0KKwkJKCppdCkuZmluYWxpemUoKTsNCisJfQ0KKw0KKy8vCW1UYWJsZU9mUklELmNsZWFyKCk7DQorfQ0KKw0KKw0KKw0KKy8qKg0KKyAqIENPTkZJR1VSRQ0KKyAqLw0KKy8qDQorc2VjdGlvbiBwcm9qZWN0IC8gU1BFQ0lGSUNBVElPTg0KKwlzcmMgPSA8c291cmNlLWZvbGRlci1wYXRoPg0KKw0KKwlmaWxlID0gImFkZGl0aW9uYWxfZmlsZS54bGlhIjsNCisNCisJbWFpbiA9ICJhc2NlbnNldXIueGxpYSI7DQorZW5kc2VjdGlvbg0KKyovDQorYm9vbCBDb25maWd1cmF0aW9uOjpjb25maWd1cmUoDQorCQlXT2JqZWN0ICogd2ZDb25maWd1cmF0aW9uLCBDb25maWd1cmF0aW9uICogcHJldkNvbmZpZ3VyYXRpb24pDQorew0KKwlXT2JqZWN0ICogYVNFQ1RJT04gPSBRdWVyeTo6Z2V0V1NlcXVlbmNlT3JFbHNlKA0KKwkJCXdmQ29uZmlndXJhdGlvbiwgInByb2plY3QiLCAiU1BFQ0lGSUNBVElPTiIpOw0KKwlpZiggYVNFQ1RJT04gIT0gV09iamVjdDo6X05VTExfICkNCisJew0KKwkJbVByb2plY3RTb3VyY2VMb2NhdGlvbiA9DQorCQkJCVF1ZXJ5OjpnZXRXUHJvcGVydHlTdHJpbmdPckVsc2UoYVNFQ1RJT04sDQorCQkJCQkJInNvdXJjZSIsICJzcmMiLCBWRlM6OldvcmtzcGFjZVNvdXJjZVBhdGgpOw0KKw0KKwkJbVByb2plY3RTb3VyY2VMb2NhdGlvbiA9IFZGUzo6bmF0aXZlX3BhdGgoDQorCQkJCW1Qcm9qZWN0U291cmNlTG9jYXRpb24sIFZGUzo6V29ya3NwYWNlUm9vdFBhdGgpOw0KKw0KKwkJbVNwZWNpZmljYXRpb25GaWxlTG9jYXRpb24gPQ0KKwkJCQlRdWVyeTo6Z2V0V1Byb3BlcnR5U3RyaW5nT3JFbHNlKA0KKwkJCQkJCWFTRUNUSU9OLCAibW9kZWwiLCAibWFpbiIsICIiKTsNCisNCisJCW1Pd25lZFNwZWNpZmljYXRpb25GbGFnID0gKG1TcGVjaWZpY2F0aW9uRmlsZUxvY2F0aW9uLnNpemUoKSA+IDApOw0KKw0KKwkJaWYoIG1Pd25lZFNwZWNpZmljYXRpb25GbGFnICkNCisJCXsNCisJCQltT3V0cHV0RmlsZW5hbWVQYXR0ZXJuID0gbURlYnVnRmlsZW5hbWVQYXR0ZXJuID0NCisJCQkJCShWRlM6OmJhc2VuYW1lKG1TcGVjaWZpY2F0aW9uRmlsZUxvY2F0aW9uKSArICJfJTElIik7DQorDQorCQkJbVNwZWNpZmljYXRpb25GaWxlTG9jYXRpb24gPSBWRlM6Om5hdGl2ZV9wYXRoKA0KKwkJCQkJbVNwZWNpZmljYXRpb25GaWxlTG9jYXRpb24sIG1Qcm9qZWN0U291cmNlTG9jYXRpb24pOw0KKw0KKwkJCU9TX1ZFUkJPU0lUWV9NSU5JTVVNX09SX0RFQlVHKCBBVk1fT1NfQ09VVCApDQorCQkJCQk8PCBfU0VXXyA8PCAiQ2hlY2tpbmcgdGhlIHNwZWNpZmljYXRpb24gZmlsZTogXCIiDQorCQkJCQk8PCBWRlM6OnJlbGF0aXZlV29ya3NwYWNlUGF0aCggbVNwZWNpZmljYXRpb25GaWxlTG9jYXRpb24gKQ0KKwkJCQkJPDwgIlwiIC4uLiI7DQorDQorCQkJQVZNX09TX0xPRyA8PCBfU0VXXyA8PCAiQ2hlY2tpbmcgdGhlIHNwZWNpZmljYXRpb24gLi4uIg0KKwkJCQkJPDwgc3RkOjplbmRsDQorCQkJCQk8PCBfU0VXXyA8PCAiRmlsZSBsb2NhdGlvbjo+ICINCisJCQkJCTw8IFZGUzo6cmVsYXRpdmVXb3Jrc3BhY2VQYXRoKCBtU3BlY2lmaWNhdGlvbkZpbGVMb2NhdGlvbiApOw0KKw0KKwkJCWlmKCBWRlM6OmNoZWNrUmVhZGluZ0ZpbGUobVNwZWNpZmljYXRpb25GaWxlTG9jYXRpb24pICkNCisJCQl7DQorCQkJCU9TX1ZFUkJPU0lUWV9NSU5JTVVNX09SX0RFQlVHKCBBVk1fT1NfQ09VVCApDQorCQkJCQkJPDwgIiA9PT4gRE9ORSIgIDw8IHN0ZDo6ZW5kbDsNCisNCisJCQkJQVZNX09TX0xPRyA8PCAiID09PiBET05FIiAgPDwgc3RkOjplbmRsOw0KKwkJCX0NCisJCQllbHNlDQorCQkJew0KKwkJCQltT3duZWRTcGVjaWZpY2F0aW9uRmxhZyA9IGZhbHNlOw0KKw0KKwkJCQlBVk1fT1NfQ09VVCA8PCBFT0xfVEFCIDw8ICIgPT0+IEZBSUxFRCA6PiAiDQorCQkJCQkJPDwgIlRoaXMgZmlsZSBkb2Vzbid0IGV4aXN0IG9yIGlzIG5vdCByZWFkYWJsZSAhISEiDQorCQkJCQkJPDwgc3RkOjplbmRsOw0KKw0KKwkJCQlyZXR1cm4oIGZhbHNlICk7DQorCQkJfQ0KKwkJfQ0KKwl9DQorCWVsc2UgaWYoIHByZXZDb25maWd1cmF0aW9uICE9IE5VTEwgKQ0KKwl7DQorCQltUHJvamVjdFNvdXJjZUxvY2F0aW9uICAgICA9IHByZXZDb25maWd1cmF0aW9uLT5tUHJvamVjdFNvdXJjZUxvY2F0aW9uOw0KKwkJbVNwZWNpZmljYXRpb25GaWxlTG9jYXRpb24gPSBwcmV2Q29uZmlndXJhdGlvbi0+bVNwZWNpZmljYXRpb25GaWxlTG9jYXRpb247DQorDQorCQltT3V0cHV0RmlsZW5hbWVQYXR0ZXJuICAgICA9IHByZXZDb25maWd1cmF0aW9uLT5tT3V0cHV0RmlsZW5hbWVQYXR0ZXJuOw0KKwkJbURlYnVnRmlsZW5hbWVQYXR0ZXJuICAgICAgPSBwcmV2Q29uZmlndXJhdGlvbi0+bURlYnVnRmlsZW5hbWVQYXR0ZXJuOw0KKwl9DQorDQorCWFTRUNUSU9OID0gUXVlcnk6OmdldFJlZ2V4V1NlcXVlbmNlKA0KKwkJCXdmQ29uZmlndXJhdGlvbiwgT1JfV0lEMigib3V0cHV0IiwgIk9VVFBVVCIpKTsNCisJaWYoIGFTRUNUSU9OICE9IFdPYmplY3Q6Ol9OVUxMXyApDQorCXsNCisJCWlmKCBjb25maWd1cmVGb3JtYXR0ZXIoYVNFQ1RJT04sIG1PdXRwdXRGaWxlbmFtZVBhdHRlcm4sICJmaWxlbmFtZSIgKSApDQorCQl7DQorCQkJbU91dHB1dEZpbGVuYW1lUGF0dGVybiA9IFZGUzo6bmF0aXZlX3BhdGgoDQorCQkJCQltT3V0cHV0RmlsZW5hbWVQYXR0ZXJuLCBWRlM6OldvcmtzcGFjZU91dHB1dFBhdGgpOw0KKw0KKwkJCS8vIE91dHB1dCBFeGVjdXRhYmxlDQorCQkJbU91dHB1dEV4ZWN1dGFibGVGaWxlTG9jYXRpb24gPQ0KKwkJCQkJUXVlcnk6OmdldFdQcm9wZXJ0eVN0cmluZyhhU0VDVElPTiwgImV4ZWN1dGFibGUiLCAiIik7DQorDQorCQkJbU91dHB1dEV4ZWN1dGFibGVFbmFibGVkR2VuZXJhdGlvbkZsYWcgPQ0KKwkJCQkJKG1PdXRwdXRFeGVjdXRhYmxlRmlsZUxvY2F0aW9uLnNpemUoKSA+IDApOw0KKwkJCWlmKCBtT3V0cHV0RXhlY3V0YWJsZUVuYWJsZWRHZW5lcmF0aW9uRmxhZyApDQorCQkJew0KKwkJCQltT3V0cHV0RXhlY3V0YWJsZUZpbGVMb2NhdGlvbiA9IFZGUzo6bmF0aXZlX3BhdGgoDQorCQkJCQltT3V0cHV0RXhlY3V0YWJsZUZpbGVMb2NhdGlvbiwgVkZTOjpXb3Jrc3BhY2VPdXRwdXRQYXRoKTsNCisJCQl9DQorCQkJZWxzZQ0KKwkJCXsNCisJCQkJbU91dHB1dEV4ZWN1dGFibGVGaWxlTG9jYXRpb24gPQ0KKwkJCQkJCW1PdXRwdXRGaWxlbmFtZVBhdHRlcm4gKyBFWEVDVVRBQkxFX0ZJTEVfRVhURU5TSU9OOw0KKwkJCX0NCisNCisJCQkvLyBPdXRwdXQgU3ltYmV4R3JhcGgNCisJCQltT3V0cHV0U3ltYmV4R3JhcGhGaWxlTG9jYXRpb24gPQ0KKwkJCQkJUXVlcnk6OmdldFJlZ2V4V1Byb3BlcnR5U3RyaW5nKGFTRUNUSU9OLCAiZ3JhcGgodml6KT8iLCAiIik7DQorDQorCQkJbU91dHB1dFN5bWJleEdyYXBoRW5hYmxlZEdlbmVyYXRpb25GbGFnID0NCisJCQkJCShtT3V0cHV0U3ltYmV4R3JhcGhGaWxlTG9jYXRpb24uc2l6ZSgpID4gMCk7DQorCQkJaWYoIG1PdXRwdXRTeW1iZXhHcmFwaEVuYWJsZWRHZW5lcmF0aW9uRmxhZyApDQorCQkJew0KKwkJCQltT3V0cHV0U3ltYmV4R3JhcGhGaWxlTG9jYXRpb24gPSBWRlM6Om5hdGl2ZV9wYXRoKA0KKwkJCQkJbU91dHB1dFN5bWJleEdyYXBoRmlsZUxvY2F0aW9uLCBWRlM6OldvcmtzcGFjZU91dHB1dFBhdGgpOw0KKwkJCX0NCisJCQllbHNlDQorCQkJew0KKwkJCQltT3V0cHV0U3ltYmV4R3JhcGhGaWxlTG9jYXRpb24gPQ0KKwkJCQkJCW1PdXRwdXRGaWxlbmFtZVBhdHRlcm4gKyBTWU1CRVhfR1JBUEhfRklMRV9FWFRFTlNJT047DQorCQkJfQ0KKw0KKwkJCS8vIE91dHB1dCBTeW1iZXggU2NlbmFpaQ0KKwkJCW1PdXRwdXRTeW1iZXhTY2VuYXJpaUZpbGVMb2NhdGlvbiA9DQorCQkJCQlRdWVyeTo6Z2V0V1Byb3BlcnR5U3RyaW5nKGFTRUNUSU9OLCAic2NlbmFyaWkiLCAiIik7DQorDQorCQkJbU91dHB1dFN5bWJleFNjZW5hcmlpRW5hYmxlZEdlbmVyYXRpb25GbGFnID0NCisJCQkJCShtT3V0cHV0U3ltYmV4U2NlbmFyaWlGaWxlTG9jYXRpb24uc2l6ZSgpID4gMCk7DQorCQkJaWYoIG1PdXRwdXRTeW1iZXhTY2VuYXJpaUVuYWJsZWRHZW5lcmF0aW9uRmxhZyApDQorCQkJew0KKwkJCQltT3V0cHV0U3ltYmV4U2NlbmFyaWlGaWxlTG9jYXRpb24gPSBWRlM6Om5hdGl2ZV9wYXRoKA0KKwkJCQltT3V0cHV0U3ltYmV4U2NlbmFyaWlGaWxlTG9jYXRpb24sIFZGUzo6V29ya3NwYWNlT3V0cHV0UGF0aCk7DQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCW1PdXRwdXRTeW1iZXhTY2VuYXJpaUZpbGVMb2NhdGlvbiA9DQorCQkJCQkJbU91dHB1dEZpbGVuYW1lUGF0dGVybiArICBTWU1CRVhfU0NFTkFSSUlfRklMRV9FWFRFTlNJT047DQorCQkJfQ0KKwkJfQ0KKwkJZWxzZQ0KKwkJew0KKwkJCUFWTV9PU19XQVJOIDw8ICJDb25maWd1cmF0aW9uOjpjb25maWd1cmVXT2JqZWN0Oj4gIg0KKwkJCQkJIkZhaWxlZCB0byBjb25maWd1cmUgT3V0cHV0IEZpbGVuYW1lIFBhdHRlcm4gPCAiDQorCQkJCQk8PCBtT3V0cHV0RmlsZW5hbWVQYXR0ZXJuIDw8ICIgPiAhIiA8PCBzdGQ6OmVuZGw7DQorDQorCQkJcmV0dXJuKCBmYWxzZSApOw0KKwkJfQ0KKwl9DQorDQorCWFTRUNUSU9OID0gUXVlcnk6OmdldFJlZ2V4V1NlcXVlbmNlKHdmQ29uZmlndXJhdGlvbiwNCisJCQlPUl9XSUQyKCJkZWJ1ZyIsICJERUJVRyIpLCBhU0VDVElPTik7DQorCWlmKCBhU0VDVElPTiAhPSBXT2JqZWN0OjpfTlVMTF8gKQ0KKwl7DQorCQltRGVidWdTdGFnZUVuYWJsZWRGbGFnID0gdHJ1ZTsNCisNCisJCWlmKCBjb25maWd1cmVGb3JtYXR0ZXIoYVNFQ1RJT04sIG1EZWJ1Z0ZpbGVuYW1lUGF0dGVybiwgImZpbGVuYW1lIiApICkNCisJCXsNCisJCQltRGVidWdGaWxlbmFtZVBhdHRlcm4gPSBWRlM6Om5hdGl2ZV9wYXRoKA0KKwkJCQkJbURlYnVnRmlsZW5hbWVQYXR0ZXJuLCBWRlM6OldvcmtzcGFjZURlYnVnUGF0aCk7DQorCQl9DQorCQllbHNlDQorCQl7DQorCQkJQVZNX09TX1dBUk4gPDwgIkNvbmZpZ3VyYXRpb246OmNvbmZpZ3VyZVdPYmplY3Q6PiAiDQorCQkJCQkiRmFpbGVkIHRvIGNvbmZpZ3VyZSBEZWJ1ZyBGaWxlbmFtZSBQYXR0ZXJuIDwgIg0KKwkJCQkJPDwgbURlYnVnRmlsZW5hbWVQYXR0ZXJuIDw8ICIgPiAhIiA8PCBzdGQ6OmVuZGw7DQorDQorCQkJcmV0dXJuKCBmYWxzZSApOw0KKwkJfQ0KKw0KKwkJbURlYnVnUGFyc2luZ1N0YWdlRW5hYmxlZEZsYWcgPSBtRGVidWdTdGFnZUVuYWJsZWRGbGFnDQorCQkJCSYmIFF1ZXJ5OjpoYXNXUHJvcGVydHlTdHJpbmcoYVNFQ1RJT04sICJwYXJzaW5nIik7DQorDQorCQltRGVidWdDb21waWxpbmdTdGFnZUVuYWJsZWRGbGFnID0gbURlYnVnU3RhZ2VFbmFibGVkRmxhZw0KKwkJCQkmJiBRdWVyeTo6aGFzV1Byb3BlcnR5U3RyaW5nKGFTRUNUSU9OLCAiZXhlY3V0YWJsZSIpOw0KKw0KKwkJbURlYnVnTG9hZGluZ1N0YWdlRW5hYmxlZEZsYWcgPSBtRGVidWdTdGFnZUVuYWJsZWRGbGFnDQorCQkJCSYmIFF1ZXJ5OjpoYXNXUHJvcGVydHlTdHJpbmcoYVNFQ1RJT04sICJsb2FkaW5nIik7DQorDQorCQltRGVidWdDb21wdXRpbmdFbmFibGVkRmxhZyA9IG1EZWJ1Z1N0YWdlRW5hYmxlZEZsYWcNCisJCQkJJiYgUXVlcnk6Omhhc1dQcm9wZXJ0eVN0cmluZyhhU0VDVElPTiwgImV4ZWN1dGlvbiIpOw0KKwl9DQorDQorCWJvb2wgaXNPSyA9IGNvbmZpZ3VyZV9zaGVsbF9zeW1iZXgod2ZDb25maWd1cmF0aW9uKTsNCisNCisJcmV0dXJuKCBpc09LICk7DQorfQ0KKw0KKw0KK2Jvb2wgQ29uZmlndXJhdGlvbjo6Y29uZmlndXJlX3NoZWxsX3N5bWJleChXT2JqZWN0ICogd2ZDb25maWd1cmF0aW9uKQ0KK3sNCisJLy8gU3ltYmV4IGNvbmZpZw0KKwlXT2JqZWN0ICogY29uZmlnU1lNQkVYID0gUXVlcnk6OmdldFJlZ2V4V1NlcXVlbmNlKA0KKwkJCXdmQ29uZmlndXJhdGlvbiwgV29ya2Zsb3c6OlNFQ1RJT05fU1lNQkVYX1JFR0VYX0lEKTsNCisNCisJbU11bHRpdGFza2luZ0ZsYWcgPSBRdWVyeTo6Z2V0V1Byb3BlcnR5Qm9vbGVhbigNCisJCQljb25maWdTWU1CRVgsICJtdWx0aXRhc2tpbmciLCBtV29ya2Zsb3cuaXNNdWx0aXRhc2tpbmcoKSk7DQorDQorCW1UaHJlYWRDb3VudCA9IFF1ZXJ5OjpnZXRXUHJvcGVydHlJbnQoDQorCQkJY29uZmlnU1lNQkVYLCAidGhyZWFkIiwgbVdvcmtmbG93LmdldFRocmVhZENvdW50KCkpOw0KKw0KKw0KKwkvLyBTaGVsbCBjb25maWcNCisJV09iamVjdCAqIGNvbmZpZ1NIRUxMID0gUXVlcnk6OmdldFJlZ2V4V1NlcXVlbmNlKA0KKwkJCXdmQ29uZmlndXJhdGlvbiwgV29ya2Zsb3c6OlNFQ1RJT05fU0hFTExfUkVHRVhfSUQpOw0KKw0KKwltSW5jb25kaXRpb25hbFN0b3BNYXJrZXJMb2NhdGlvbiA9DQorCQkJUXVlcnk6OmdldFdQcm9wZXJ0eVN0cmluZyhjb25maWdTSEVMTCwgInN0b3AiLCAiIik7DQorCWlmKCBtSW5jb25kaXRpb25hbFN0b3BNYXJrZXJMb2NhdGlvbi5lbXB0eSgpICkNCisJew0KKwkJbUluY29uZGl0aW9uYWxTdG9wTWFya2VyTG9jYXRpb24gPQ0KKwkJCQltV29ya2Zsb3cuZ2V0SW5jb25kaXRpb25hbFN0b3BNYXJrZXJMb2NhdGlvbigpOw0KKwl9DQorCWVsc2UNCisJew0KKwkJbUluY29uZGl0aW9uYWxTdG9wTWFya2VyTG9jYXRpb24gPQ0KKwkJCQlWRlM6Om5hdGl2ZV9wYXRoKG1JbmNvbmRpdGlvbmFsU3RvcE1hcmtlckxvY2F0aW9uKTsNCisNCisJCW1JbmNvbmRpdGlvbmFsU3RvcE1hcmtlckxvY2F0aW9uID0gVkZTOjpuYXRpdmVfcGF0aCgNCisJCQkJbUluY29uZGl0aW9uYWxTdG9wTWFya2VyTG9jYXRpb24sIFZGUzo6V29ya3NwYWNlTG9nUGF0aCk7DQorCX0NCisNCisJcmV0dXJuKCB0cnVlICk7DQorfQ0KKw0KKw0KKw0KK2Jvb2wgQ29uZmlndXJhdGlvbjo6Y29uZmlndXJlRm9ybWF0dGVyKFdPYmplY3QgKiBGT1JNQVQsDQorCQlzdGQ6OnN0cmluZyAmIGZvcm1hdFBhdHRlcm4sIGNvbnN0IHN0ZDo6c3RyaW5nICYgaWQpDQorew0KKwlmb3JtYXRQYXR0ZXJuID0gUXVlcnk6OmdldFdQcm9wZXJ0eVN0cmluZyhGT1JNQVQsIGlkLCBmb3JtYXRQYXR0ZXJuKTsNCisNCisJdHJ5DQorCXsNCisJCWJvb3N0Ojpmb3JtYXQgZm9ybWF0dGVyKGZvcm1hdFBhdHRlcm4pOw0KKwl9DQorCWNhdGNoKGNvbnN0IGJvb3N0Ojppbzo6YmFkX2Zvcm1hdF9zdHJpbmcgJiBiZnMpDQorCXsNCisJCVF1ZXJ5OjpyZXBvcnRFcnJvckF0dHJpYnV0ZShGT1JNQVQsIGlkLCBiZnMud2hhdCgpKTsNCisNCisJCXJldHVybiggZmFsc2UgKTsNCisJfQ0KKw0KKwlyZXR1cm4oIHRydWUgKTsNCit9DQorDQorDQorLyoqDQorICogR0VUVEVSDQorICogT1VUUFVUIC8gREVCVUcgRklMRSBMT0NBVElPTg0KKyAqLw0KK3N0ZDo6c3RyaW5nIENvbmZpZ3VyYXRpb246OmZvcm1hdEZpbGVMb2NhdGlvbigNCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZpbGVuYW1lUGF0dGVybiwNCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgc3RySUQsIGNvbnN0IHN0ZDo6c3RyaW5nICYgc3RyRXh0ZW5zaW9uKSBjb25zdA0KK3sNCisJYm9vc3Q6OmZvcm1hdCBsb2NhdGlvbkZvcm1hdHRlcihhRmlsZW5hbWVQYXR0ZXJuKTsNCisNCisJbG9jYXRpb25Gb3JtYXR0ZXIuZXhjZXB0aW9ucyggYm9vc3Q6OmlvOjpub19lcnJvcl9iaXRzICk7DQorDQorCWlmKCBzdHJFeHRlbnNpb24uZW1wdHkoKSApDQorCXsNCisJCXJldHVybiggKCBsb2NhdGlvbkZvcm1hdHRlciAlIHN0cklEICkuc3RyKCkgKTsNCisJfQ0KKwllbHNlDQorCXsNCisJCXJldHVybiggKE9TUygpIDw8IChsb2NhdGlvbkZvcm1hdHRlciAlIHN0cklEKSA8PCBzdHJFeHRlbnNpb24pLnN0cigpICk7DQorCX0NCit9DQorDQorDQorLyoqDQorICogU0FWSU5HDQorICovDQordm9pZCBDb25maWd1cmF0aW9uOjpzYXZlU3BlY2lmaWNhdGlvbihib29sIGlzRGVidWcsIGNvbnN0IHN0ZDo6c3RyaW5nICYgc3RySUQpDQorew0KKwlzdGQ6OnN0cmluZyBzYXZlRmlsZUxvY2F0aW9uID0gZm9ybWF0RmlsZUxvY2F0aW9uKA0KKwkJCWlzRGVidWcsIHN0cklELCBTUEVDSUZJQ0FUSU9OX0ZJTEVfRVhURU5TSU9OKTsNCisNCisJaWYoIGlzRGVidWcgKQ0KKwl7DQorCQlBVk1fT1NfQ0xPRyA8PCBfREJHXw0KKwkJCTw8ICJTYXZpbmcgb2YgdGhlIFNwZWNpZmljYXRpb24gaW4gdGV4dCBmb3JtYXQgLS0+ICINCisJCQk8PCBzdHJJRCA8PCBzdGQ6OmVuZGw7DQorCX0NCisJZWxzZQ0KKwl7DQorCQlBVk1fT1NfTE9HIDw8IF9TRVdfDQorCQkJPDwgIlNhdmluZyBvZiB0aGUgU3BlY2lmaWNhdGlvbiBpbiB0ZXh0IGZvcm1hdCAtLT4gIg0KKwkJCTw8IHN0cklEIDw8IHN0ZDo6ZW5kbDsNCisJfQ0KKw0KKwlDb25maWd1cmF0aW9uOjpzYXZlRWxlbWVudFRleHR1YWxWaWV3KEFWTV9PU19MT0csDQorCQkJZ2V0U3BlY2lmaWNhdGlvbigpLCBzYXZlRmlsZUxvY2F0aW9uKTsNCit9DQorDQordm9pZCBDb25maWd1cmF0aW9uOjpzYXZlU3ltYmV4R3JhcGgoYm9vbCBpc0RlYnVnLCBjb25zdCBzdGQ6OnN0cmluZyAmIHN0cklEKQ0KK3sNCisJc3RkOjpzdHJpbmcgc2F2ZUZpbGVMb2NhdGlvbiA9IGZvcm1hdEZpbGVMb2NhdGlvbigNCisJCQlpc0RlYnVnLCBzdHJJRCwgU1lNQkVYX0dSQVBIX0ZJTEVfRVhURU5TSU9OKTsNCit9DQorDQordm9pZCBDb25maWd1cmF0aW9uOjpzYXZlU3ltYmV4U2NlbmFyaWkoYm9vbCBpc0RlYnVnLCBjb25zdCBzdGQ6OnN0cmluZyAmIHN0cklEKQ0KK3sNCisJc3RkOjpzdHJpbmcgc2F2ZUZpbGVMb2NhdGlvbiA9IGZvcm1hdEZpbGVMb2NhdGlvbigNCisJCQlpc0RlYnVnLCBzdHJJRCwgU1lNQkVYX0dSQVBIX0ZJTEVfRVhURU5TSU9OKTsNCit9DQorDQorDQorDQorLyoqDQorICogSm9zZSBQcm9qZWN0aW9uDQorICovDQorLy92b2lkIENvbmZpZ3VyYXRpb246OnNhdmVQcm9qZWN0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nICYgc3RyUHJlZml4TmFtZSkNCisvL3sNCisvLwlpZiggbU91dHB1dFN5bWJleFByb2plY3Rpb25HcmFwaEVuYWJsZWRHZW5lcmF0aW9uRmxhZyApDQorLy8Jew0KKy8vCQlTY29wZU5ld0luZGVudCBzY29wZSggQVZNX09TX0xPRyAsIEFWTV9UQUIxX0lOREVOVCApOw0KKy8vDQorLy8JCUFWTV9PU19MT0cgPDwgX1NFV18gPDwgIlNhdmluZyBvZiBwcm9qZWN0aW9uICgyKSIgPDwgc3RkOjplbmRsDQorLy8JCQkJPDwgVEFCIDw8ICJwYXRoOiAiIDw8IFZGUzo6cmVsYXRpdmVXb3Jrc3BhY2VQYXRoKA0KKy8vCQkJCW1PdXRwdXRTeW1iZXhQcm9qZWN0aW9uR3JhcGhGaWxlTG9jYXRpb24gKQ0KKy8vCQkJCTw8ICIuLi4gIiA8PCBzdGQ6OmZsdXNoOw0KKy8vDQorLy8JCXN0ZDo6b2ZzdHJlYW0gcmVzdWx0U3RyZWFtOw0KKy8vCQlyZXN1bHRTdHJlYW0ub3BlbihtT3V0cHV0U3ltYmV4UHJvamVjdGlvbkdyYXBoRmlsZUxvY2F0aW9uLmNfc3RyKCksDQorLy8JCQkJc3RkOjppb3NfYmFzZTo6b3V0KTsNCisvLwkJaWYoIHJlc3VsdFN0cmVhbS5nb29kKCkgKQ0KKy8vCQl7DQorLy8JCQlPdXRTdHJlYW0gb3MocmVzdWx0U3RyZWFtLCBBVk1fT1VUUFVUX0lOREVOVCk7DQorLy8NCisvLwkJCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQ6Oml0ZXJhdG9yIGl0ID0gZ2V0VHJhY2UoKS5iZWdpbigpOw0KKy8vCQkJTGlzdE9mRXhlY3V0aW9uQ29udGV4dDo6aXRlcmF0b3IgaXRFbmQgPSBnZXRUcmFjZSgpLmVuZCgpOw0KKy8vCQkJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApDQorLy8JCQl7DQorLy8JCQkJLy8gU3VwcHJlc3Npb24gZGUgbCdpbmRlbnRhdGlvbiBkYW5zIGxlIGZpY2hpZXIgZGUgc29ydGllDQorLy8JCQkJKCppdCktPnRvRnNjbihvcywgTlVMTCk7DQorLy8JCQl9DQorLy8NCisvLwkJCXJlc3VsdFN0cmVhbS5jbG9zZSgpOw0KKy8vDQorLy8JCQlBVk1fT1NfTE9HIDw8ICJPSyIgPDwgc3RkOjplbmRsIDsNCisvLwkJfQ0KKy8vCQllbHNlDQorLy8JCXsNCisvLwkJCUFWTV9PU19MT0cgPDwgc3RkOjplbmRsIDw8IFRBQg0KKy8vCQkJCQk8PCAiICAgIEtPIDogRmFpbGVkIHRvIG9wZW4gdGhpcyBmaWxlIGluIHdyaXRlIG1vZGUiDQorLy8JCQkJCTw8IHN0ZDo6ZW5kbDsNCisvLwkJfQ0KKy8vCX0NCisvL30NCisvLw0KKy8vDQorLy92b2lkIENvbmZpZ3VyYXRpb246OnNhdmVQcm9qZWN0aW9uU2NlbmFyaWkoY29uc3Qgc3RkOjpzdHJpbmcgJiBzdHJQcmVmaXhOYW1lKQ0KKy8vew0KKy8vCWlmKCBtT3V0cHV0U3ltYmV4UHJvamVjdGlvblNjZW5hcmlpRW5hYmxlZEdlbmVyYXRpb25GbGFnICkNCisvLwl7DQorLy8JCVNjb3BlTmV3SW5kZW50IHNjb3BlKCBBVk1fT1NfTE9HICwgQVZNX1RBQjFfSU5ERU5UICk7DQorLy8NCisvLwkJQVZNX09TX0xPRyA8PCBfU0VXXyA8PCAiU2F2aW5nIG9mIHByb2plY3Rpb24gRlNDTiAiIDw8IHN0ZDo6ZW5kbA0KKy8vCQkJCTw8IFRBQiA8PCAicGF0aDogIiA8PCBWRlM6OnJlbGF0aXZlV29ya3NwYWNlUGF0aCgNCisvLwkJCQltT3V0cHV0U3ltYmV4UHJvamVjdGlvblNjZW5hcmlpRmlsZUxvY2F0aW9uICkNCisvLwkJCQk8PCAiLi4uICIgPDwgc3RkOjpmbHVzaDsNCisvLw0KKy8vCQlzdGQ6Om9mc3RyZWFtIHJlc3VsdFN0cmVhbTsNCisvLwkJcmVzdWx0U3RyZWFtLm9wZW4obU91dHB1dFN5bWJleFByb2plY3Rpb25TY2VuYXJpaUZpbGVMb2NhdGlvbi5jX3N0cigpLA0KKy8vCQkJCXN0ZDo6aW9zX2Jhc2U6Om91dCk7DQorLy8JCWlmKCByZXN1bHRTdHJlYW0uZ29vZCgpICkNCisvLwkJew0KKy8vCQkJT3V0U3RyZWFtIG9zKHJlc3VsdFN0cmVhbSwgQVZNX09VVFBVVF9JTkRFTlQpOw0KKy8vDQorLy8JCQlMaXN0T2ZFeGVjdXRpb25Db250ZXh0OjppdGVyYXRvciBpdCA9IGdldFRyYWNlKCkuYmVnaW4oKTsNCisvLwkJCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQ6Oml0ZXJhdG9yIGl0RW5kID0gZ2V0VHJhY2UoKS5lbmQoKTsNCisvLwkJCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQ0KKy8vCQkJew0KKy8vCQkJCS8vIFN1cHByZXNzaW9uIGRlIGwnaW5kZW50YXRpb24gZGFucyBsZSBmaWNoaWVyIGRlIHNvcnRpZQ0KKy8vCQkJCSgqaXQpLT50b0ZzY24ob3MsIE5VTEwpOw0KKy8vCQkJfQ0KKy8vDQorLy8JCQlyZXN1bHRTdHJlYW0uY2xvc2UoKTsNCisvLw0KKy8vCQkJQVZNX09TX0xPRyA8PCAiT0siIDw8IHN0ZDo6ZW5kbCA7DQorLy8JCX0NCisvLwkJZWxzZQ0KKy8vCQl7DQorLy8JCQlBVk1fT1NfTE9HIDw8IHN0ZDo6ZW5kbCA8PCBUQUINCisvLwkJCQkJPDwgIiAgICBLTyA6IEZhaWxlZCB0byBvcGVuIHRoaXMgZmlsZSBpbiB3cml0ZSBtb2RlIg0KKy8vCQkJCQk8PCBzdGQ6OmVuZGw7DQorLy8JCX0NCisvLwl9DQorLy99DQorLy8gZW5kIEpvc2UgUHJvamVjdGlvbg0KKw0KKw0KKw0KKy8vLyoqDQorLy8gKiBDb25maWd1cmF0aW9uOjpzYXZlU3BlY2lmaWNhdGlvbg0KKy8vICoNCisvLyAqLw0KKy8vdm9pZCBDb25maWd1cmF0aW9uOjpzYXZlU3BlY2lmaWNhdGlvbkFmdGVyQ29tcGlsYXRpb25TdGVwKA0KKy8vCQljb25zdCBzdGQ6OnN0cmluZyAmIHN0clByZWZpeE5hbWUpDQorLy97DQorLy8JTWFpbkRhdGFDb25maWd1cmF0aW9uICogYU1EQyA9IGFNREMtPmdldEluc3RhbmNlKCk7DQorLy8JUGFyYW1ldGVyTWFuYWdlciAqIGFQTSA9IGFNREMtPmdldFBhcmFtZXRlck1hbmFnZXIoKTsNCisvLw0KKy8vCXN0ZDo6c3RyaW5nIHNhdmVGaWxlTG9jYXRpb24gPQ0KKy8vCQkJYVBNLT5nZXRFbmdpbmVEZWJ1Z1BhcnNpbmdMb2NhdGlvbihzdHJQcmVmaXhOYW1lKTsNCisvLw0KKy8vCWlmKCBhTURDLT5oYXNTcGVjaWZpY2F0aW9uKCkgJiYgKG5vdCBzYXZlRmlsZUxvY2F0aW9uLmVtcHR5KCkpICkNCisvLwl7DQorLy8JCUFWTV9PU19MT0cgPDwgX1NFV18NCisvLwkJCQk8PCAiU2F2aW5nIG9mIHRoZSBpbnRlcm5hbCBzcGVjaWZpY2F0aW9uICINCisvLwkJCQkJInJlcHJlc2VudGF0aW9uIGluIHRleHR1YWwgZm9ybWF0ICINCisvLwkJCQk8PCBzdGQ6OmVuZGw7DQorLy8NCisvLwkJc2F2ZUVsZW1lbnRUZXh0dWFsVmlldyhhTURDLT5nZXRTcGVjaWZpY2F0aW9uKCksIHNhdmVGaWxlTG9jYXRpb24pOw0KKy8vCX0NCisvL30NCisvLw0KKy8vDQorLy8vKioNCisvLyAqIENvbmZpZ3VyYXRpb246OnNhdmVFeGVjdXRhYmxlU3BlY2lmaWNhdGlvbg0KKy8vICoNCisvLyAqLw0KKy8vdm9pZCBDb25maWd1cmF0aW9uOjpzYXZlRXhlY3V0YWJsZVNwZWNpZmljYXRpb24oDQorLy8JCWNvbnN0IHN0ZDo6c3RyaW5nICYgc3RyUHJlZml4TmFtZSkNCisvL3sNCisvLwlNYWluRGF0YUNvbmZpZ3VyYXRpb24gKiBhTURDID0gTWFpbkRhdGFDb25maWd1cmF0aW9uOjpnZXRJbnN0YW5jZSgpOw0KKy8vCVBhcmFtZXRlck1hbmFnZXIgKiBhUE0gPSBhTURDLT5nZXRQYXJhbWV0ZXJNYW5hZ2VyKCk7DQorLy8NCisvLwlzdGQ6OnN0cmluZyBzYXZlRmlsZUxvY2F0aW9uID0NCisvLwkJCWFQTS0+Z2V0RW5naW5lT3V0cHV0RXhlY3V0YWJsZUxvY2F0aW9uKHN0clByZWZpeE5hbWUpOw0KKy8vDQorLy8JaWYoIG5vdCBzYXZlRmlsZUxvY2F0aW9uLmVtcHR5KCkgKQ0KKy8vCXsNCisvLwkJQVZNX09TX0xPRyA8PCBfU0VXXyA8PCAiU2F2aW5nIG9mIHRoZSBjb21waWxlZCAiDQorLy8JCQkJInNwZWNpZmljYXRpb24gcmVwcmVzZW50YXRpb24gaW4gdGV4dHVhbCBmb3JtYXQgIg0KKy8vCQkJCTw8IHN0ZDo6ZW5kbDsNCisvLw0KKy8vCQlzYXZlRm9ybVRleHR1YWxWaWV3cyhhTURDLT5nZXRFeGVjdXRhYmxlU3lzdGVtKCksIHNhdmVGaWxlTG9jYXRpb24pOw0KKy8vDQorLy8JCXNhdmVGaWxlTG9jYXRpb24gPSBhUE0tPmdldEVuZ2luZU91dHB1dEdyYXBoTG9jYXRpb24oImZlY18iKTsNCisvLwkJaWYoIGFNREMtPmhhc01haW5FeGVjdXRpb25Db250ZXh0KCkgJiYgKCEgc2F2ZUZpbGVMb2NhdGlvbi5lbXB0eSgpKSApDQorLy8JCXsNCisvLwkJCXNhdmVFbGVtZW50VGV4dHVhbFZpZXcoDQorLy8JCQkJCWFNREMtPmdldE1haW5FeGVjdXRpb25Db250ZXh0KCksIHNhdmVGaWxlTG9jYXRpb24pOw0KKy8vCQl9DQorLy8JfQ0KKy8vfQ0KKw0KKw0KKy8qKg0KKyAqIHNhdmUgRWxlbWVudCBhcyB0ZXh0dWFsIHZpZXcNCisgKg0KKyAqLw0KK3ZvaWQgQ29uZmlndXJhdGlvbjo6c2F2ZUVsZW1lbnRUZXh0dWFsVmlldyhPdXRTdHJlYW0gJiBsb2dnZXIsDQorCQljb25zdCBFbGVtZW50ICYgYW5FbGVtZW50LCBjb25zdCBzdGQ6OnN0cmluZyAmIHNhdmVGaWxlTG9jYXRpb24pDQorew0KKwlTY29wZU5ld0luZGVudCBzY29wZSggbG9nZ2VyICwgQVZNX1RBQjFfSU5ERU5UICk7DQorDQorCWxvZ2dlciA8PCBUQUIgPDwgInBhdGg6ICINCisJCQk8PCBWRlM6OnJlbGF0aXZlV29ya3NwYWNlUGF0aCggc2F2ZUZpbGVMb2NhdGlvbiApDQorCQkJPDwgIi4uLiAiIDw8IHN0ZDo6Zmx1c2g7DQorDQorCXN0ZDo6b2ZzdHJlYW0gcmVzdWx0U3RyZWFtOw0KKwlyZXN1bHRTdHJlYW0ub3BlbihzYXZlRmlsZUxvY2F0aW9uLmNfc3RyKCksIHN0ZDo6aW9zX2Jhc2U6Om91dCk7DQorCWlmKCByZXN1bHRTdHJlYW0uZ29vZCgpICkNCisJew0KKwkJT3V0U3RyZWFtIG9zKHJlc3VsdFN0cmVhbSk7DQorCQlhbkVsZW1lbnQuc2VyaWFsaXplKG9zKTsNCisNCisJCXJlc3VsdFN0cmVhbS5jbG9zZSgpOw0KKw0KKwkJbG9nZ2VyIDw8ICJPSyIgPDwgc3RkOjplbmRsIDsNCisJfQ0KKwllbHNlDQorCXsNCisJCWxvZ2dlciA8PCBzdGQ6OmVuZGwgPDwgVEFCDQorCQkJCTw8ICIgICAgS08gOiBGYWlsZWQgdG8gb3BlbiB0aGlzIGZpbGUgaW4gd3JpdGUgbW9kZSINCisJCQkJPDwgc3RkOjplbmRsOw0KKwl9DQorfQ0KKw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBTRVJJQUxJWkFUSU9OIEFQSQ0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisNCit2b2lkIENvbmZpZ3VyYXRpb246OnNlcmlhbGl6ZURlYnVnRXhlY3V0YWJsZShjb25zdCBzdGQ6OnN0cmluZyAmIHN0cklEKQ0KK3sNCisJc3RkOjpzdHJpbmcgc2F2ZUZpbGVMb2NhdGlvbiA9IGZvcm1hdEZpbGVMb2NhdGlvbigNCisJCQl0cnVlLCBzdHJJRCwgRVhFQ1VUQUJMRV9GSUxFX0VYVEVOU0lPTik7DQorDQorCUFWTV9PU19DTE9HIDw8IF9EQkdfDQorCQk8PCAiU2F2aW5nIG9mIHRoZSBFeGVjdXRhYmxlIGluIHRleHQgZm9ybWF0IC0tPiAiDQorCQk8PCBzdHJJRCA8PCBzdGQ6OmVuZGw7DQorDQorCUNvbmZpZ3VyYXRpb246OnNhdmVFbGVtZW50VGV4dHVhbFZpZXcoQVZNX09TX0xPRywNCisJCQltRXhlY3V0YWJsZVN5c3RlbSwgc2F2ZUZpbGVMb2NhdGlvbik7DQorfQ0KKw0KK3ZvaWQgQ29uZmlndXJhdGlvbjo6c2VyaWFsaXplVGV4dHVhbEV4ZWN1dGFibGUoKQ0KK3sNCisJQVZNX09TX0xPRyA8PCBfU0VXXw0KKwkJCTw8ICJTYXZpbmcgb2YgdGhlIEV4ZWN1dGFibGUgaW4gdGV4dCBmb3JtYXQiIDw8IHN0ZDo6ZW5kbDsNCisNCisJQ29uZmlndXJhdGlvbjo6c2F2ZUVsZW1lbnRUZXh0dWFsVmlldyhBVk1fT1NfTE9HLA0KKwkJCW1FeGVjdXRhYmxlU3lzdGVtLCBtT3V0cHV0RXhlY3V0YWJsZUZpbGVMb2NhdGlvbik7DQorfQ0KKw0KKw0KK3ZvaWQgQ29uZmlndXJhdGlvbjo6c2VyaWFsaXplR3JhcGhpekV4ZWN1dGFibGUoKQ0KK3sNCisJU2NvcGVOZXdJbmRlbnQgc2NvcGUoIEFWTV9PU19MT0cgLCBBVk1fVEFCMV9JTkRFTlQgKTsNCisNCisJc3RkOjpzdHJpbmcgc2F2ZUZpbGVMb2NhdGlvbiA9IFZGUzo6cmVwbGFjZV9leHRlbnNpb24oDQorCQkJbU91dHB1dEV4ZWN1dGFibGVGaWxlTG9jYXRpb24sIEdSQVBIVklaX0ZJTEVfRVhURU5TSU9OKTsNCisNCisJQVZNX09TX0xPRyA8PCBfU0VXXw0KKwkJCTw8ICJTYXZpbmcgb2YgdGhlIHNwZWNpZmljYXRpb24gcmVwcmVzZW50YXRpb24gIg0KKwkJCSJpbiBHcmFwaFZpeiBmb3JtYXQgIiA8PCBzdGQ6OmVuZGw7DQorDQorCUFWTV9PU19MT0cgPDwgVEFCIDw8ICJwYXRoOiAiDQorCQkJPDwgVkZTOjpyZWxhdGl2ZVdvcmtzcGFjZVBhdGgoIHNhdmVGaWxlTG9jYXRpb24gKQ0KKwkJCTw8ICIuLi4gIiA8PCBzdGQ6OmZsdXNoOw0KKw0KKwlzdGQ6Om9mc3RyZWFtIHJlc3VsdFN0cmVhbTsNCisJcmVzdWx0U3RyZWFtLm9wZW4oc2F2ZUZpbGVMb2NhdGlvbi5jX3N0cigpLCBzdGQ6Omlvc19iYXNlOjpvdXQpOw0KKwlpZiggcmVzdWx0U3RyZWFtLmdvb2QoKSApDQorCXsNCisJCU91dFN0cmVhbSBvcyhyZXN1bHRTdHJlYW0sIEFWTV9TUENfSU5ERU5UKTsNCisNCisJCUdyYXBoVml6U3RhdGVtYWNoaW5lU2VyaWFsaXplcjo6Zm9ybWF0KA0KKwkJCW1TeW1iZXhFbmdpbmUuZ2V0Q29udHJvbGxlclVuaXRNYW5hZ2VyKCksIG9zLCBnZXRTcGVjaWZpY2F0aW9uKCkpOw0KKw0KKwkJcmVzdWx0U3RyZWFtLmNsb3NlKCk7DQorDQorCQlBVk1fT1NfTE9HIDw8ICJPSyIgPDwgc3RkOjplbmRsIDsNCisJfQ0KKwllbHNlDQorCXsNCisJCUFWTV9PU19MT0cgPDwgc3RkOjplbmRsIDw8IFRBQg0KKwkJCQk8PCAiICAgIEtPIDogRmFpbGVkIHRvIG9wZW4gdGhpcyBmaWxlIGluIHdyaXRlIG1vZGUiDQorCQkJCTw8IHN0ZDo6ZW5kbDsNCisJfQ0KK30NCisNCisvKioNCisgKiBzZXJpYWxpemUgVGV4dHVhbCBTeW1iZXhHcmFwaA0KKyAqLw0KK3ZvaWQgQ29uZmlndXJhdGlvbjo6c2VyaWFsaXplVGV4dHVhbFN5bWJleEdyYXBoKCkNCit7DQorCVNjb3BlTmV3SW5kZW50IHNjb3BlKCBBVk1fT1NfTE9HICwgQVZNX1RBQjFfSU5ERU5UICk7DQorDQorCUFWTV9PU19MT0cgPDwgX1NFV18NCisJCQk8PCAiU2F2aW5nIG9mIHRoZSB0cmFjZSBvZiB0aGUgZXhlY3V0aW9uIHNwZWNpZmljYXRpb24gIg0KKwkJCSJyZXByZXNlbnRhdGlvbiBpbiB0ZXh0dWFsIGZvcm1hdCAiIDw8IHN0ZDo6ZW5kbDsNCisNCisJQVZNX09TX0xPRyA8PCBUQUIgPDwgInBhdGg6ICINCisJCQk8PCBWRlM6OnJlbGF0aXZlV29ya3NwYWNlUGF0aCggbU91dHB1dFN5bWJleEdyYXBoRmlsZUxvY2F0aW9uICkNCisJCQk8PCAiLi4uICIgPDwgc3RkOjpmbHVzaDsNCisNCisJc3RkOjpvZnN0cmVhbSByZXN1bHRTdHJlYW07DQorCXJlc3VsdFN0cmVhbS5vcGVuKG1PdXRwdXRTeW1iZXhHcmFwaEZpbGVMb2NhdGlvbi5jX3N0cigpLA0KKwkJCXN0ZDo6aW9zX2Jhc2U6Om91dCk7DQorCWlmKCByZXN1bHRTdHJlYW0uZ29vZCgpICkNCisJew0KKwkJT3V0U3RyZWFtIG9zKHJlc3VsdFN0cmVhbSwgQVZNX1NQQ19JTkRFTlQpOw0KKw0KKwkJTGlzdE9mRXhlY3V0aW9uQ29udGV4dDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBnZXRUcmFjZSgpLmJlZ2luKCk7DQorCQlMaXN0T2ZFeGVjdXRpb25Db250ZXh0Ojpjb25zdF9pdGVyYXRvciBpdEVuZCA9IGdldFRyYWNlKCkuZW5kKCk7DQorCQlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkNCisJCXsNCisJCQkoKml0KS0+c2VyaWFsaXplKG9zKTsNCisJCX0NCisNCisJCXJlc3VsdFN0cmVhbS5jbG9zZSgpOw0KKw0KKwkJQVZNX09TX0xPRyA8PCAiT0siIDw8IHN0ZDo6ZW5kbDsNCisJfQ0KKwllbHNlDQorCXsNCisJCUFWTV9PU19MT0cgPDwgc3RkOjplbmRsIDw8IFRBQg0KKwkJCQk8PCAiICAgIEtPIDogRmFpbGVkIHRvIG9wZW4gdGhpcyBmaWxlIGluIHdyaXRlIG1vZGUiDQorCQkJCTw8IHN0ZDo6ZW5kbDsNCisJfQ0KKw0KKwlpZiggaGFzTWFpbkV4ZWN1dGlvbkNvbnRleHQoKSApDQorCXsNCisJCXN0ZDo6c3RyaW5nIHNhdmVGaWxlTG9jYXRpb24gPSBmb3JtYXRGaWxlTG9jYXRpb24oDQorCQkJCXRydWUsICJ0ZWMiLCBTWU1CRVhfR1JBUEhfRklMRV9FWFRFTlNJT04pOw0KKw0KKwkJc2F2ZUVsZW1lbnRUZXh0dWFsVmlldyhBVk1fT1NfTE9HLA0KKwkJCQlnZXRNYWluRXhlY3V0aW9uQ29udGV4dCgpLCBzYXZlRmlsZUxvY2F0aW9uKTsNCisJfQ0KK30NCisNCisvKioNCisgKiBzZXJpYWxpemUgR3JhcGhpeiBTeW1iZXhHcmFwaA0KKyAqLw0KK3ZvaWQgQ29uZmlndXJhdGlvbjo6c2VyaWFsaXplR3JhcGhpelN5bWJleEdyYXBoKCkNCit7DQorCXN0ZDo6c3RyaW5nIHNhdmVGaWxlTG9jYXRpb24gPSBWRlM6OnJlcGxhY2VfZXh0ZW5zaW9uKA0KKwkJCW1PdXRwdXRTeW1iZXhHcmFwaEZpbGVMb2NhdGlvbiwgR1JBUEhWSVpfRklMRV9FWFRFTlNJT04pOw0KKw0KKwlTY29wZU5ld0luZGVudCBzY29wZSggQVZNX09TX0xPRyAsIEFWTV9UQUIxX0lOREVOVCApOw0KKw0KKwlBVk1fT1NfTE9HIDw8IF9TRVdfDQorCQkJPDwgIlNhdmluZyBvZiB0aGUgc3ltYmV4IHRyYWNlIG9mIHRoZSBleGVjdXRpb24gc3BlY2lmaWNhdGlvbiAiDQorCQkJInJlcHJlc2VudGF0aW9uIGluIEdyYXBoVml6IGZvcm1hdCAiIDw8IHN0ZDo6ZW5kbDsNCisNCisJQVZNX09TX0xPRyA8PCBUQUIgPDwgInBhdGg6ICINCisJCQk8PCBWRlM6OnJlbGF0aXZlV29ya3NwYWNlUGF0aCggc2F2ZUZpbGVMb2NhdGlvbiApDQorCQkJPDwgIi4uLiAiIDw8IHN0ZDo6Zmx1c2g7DQorDQorCXN0ZDo6b2ZzdHJlYW0gcmVzdWx0U3RyZWFtOw0KKwlyZXN1bHRTdHJlYW0ub3BlbihzYXZlRmlsZUxvY2F0aW9uLmNfc3RyKCksIHN0ZDo6aW9zX2Jhc2U6Om91dCk7DQorCWlmKCByZXN1bHRTdHJlYW0uZ29vZCgpICkNCisJew0KKwkJT3V0U3RyZWFtIG9zKHJlc3VsdFN0cmVhbSwgQVZNX1NQQ19JTkRFTlQpOw0KKw0KKwkJTGlzdE9mRXhlY3V0aW9uQ29udGV4dDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBnZXRUcmFjZSgpLmJlZ2luKCk7DQorCQlMaXN0T2ZFeGVjdXRpb25Db250ZXh0Ojpjb25zdF9pdGVyYXRvciBpdEVuZCA9IGdldFRyYWNlKCkuZW5kKCk7DQorCQlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkNCisJCXsNCisJCQlHcmFwaFZpekV4ZWN1dGlvbkdyYXBoU2VyaWFsaXplcjo6Zm9ybWF0KA0KKwkJCQltU3ltYmV4RW5naW5lLmdldENvbnRyb2xsZXJVbml0TWFuYWdlcigpLCBvcywgKigqaXQpKTsNCisJCX0NCisNCisJCXJlc3VsdFN0cmVhbS5jbG9zZSgpOw0KKw0KKwkJQVZNX09TX0xPRyA8PCAiT0siIDw8IHN0ZDo6ZW5kbCA7DQorCX0NCisJZWxzZQ0KKwl7DQorCQlBVk1fT1NfTE9HIDw8IHN0ZDo6ZW5kbCA8PCBUQUINCisJCQkJPDwgIiAgICBLTyA6IEZhaWxlZCB0byBvcGVuIHRoaXMgZmlsZSBpbiB3cml0ZSBtb2RlIg0KKwkJCQk8PCBzdGQ6OmVuZGw7DQorCX0NCit9DQorDQorDQordm9pZCBDb25maWd1cmF0aW9uOjpzZXJpYWxpemVTY2VuYXJpaSgpDQorew0KKwlTY29wZU5ld0luZGVudCBzY29wZSggQVZNX09TX0xPRyAsIEFWTV9UQUIxX0lOREVOVCApOw0KKw0KKwlBVk1fT1NfTE9HIDw8IF9TRVdfDQorCQkJPDwgIlNhdmluZyBvZiB0aGUgdHJhY2Ugb2YgdGhlIGV4ZWN1dGlvbiBzcGVjaWZpY2F0aW9uICINCisJCQkicmVwcmVzZW50YXRpb24gaW4gdGV4dHVhbCBmb3JtYXQgIiA8PCBzdGQ6OmVuZGw7DQorDQorCUFWTV9PU19MT0cgPDwgVEFCIDw8ICJwYXRoOiAiDQorCQkJPDwgVkZTOjpyZWxhdGl2ZVdvcmtzcGFjZVBhdGgobU91dHB1dFN5bWJleFNjZW5hcmlpRmlsZUxvY2F0aW9uKQ0KKwkJCTw8ICIuLi4gIiA8PCBzdGQ6OmZsdXNoOw0KKw0KKwlzdGQ6Om9mc3RyZWFtIHJlc3VsdFN0cmVhbTsNCisJcmVzdWx0U3RyZWFtLm9wZW4obU91dHB1dFN5bWJleFNjZW5hcmlpRmlsZUxvY2F0aW9uLmNfc3RyKCksDQorCQkJc3RkOjppb3NfYmFzZTo6b3V0KTsNCisJaWYoIHJlc3VsdFN0cmVhbS5nb29kKCkgKQ0KKwl7DQorCQlPdXRTdHJlYW0gb3MocmVzdWx0U3RyZWFtLCBBVk1fRlNDTl9JTkRFTlQpOw0KKw0KKwkJTGlzdE9mRXhlY3V0aW9uQ29udGV4dDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBnZXRUcmFjZSgpLmJlZ2luKCk7DQorCQlMaXN0T2ZFeGVjdXRpb25Db250ZXh0Ojpjb25zdF9pdGVyYXRvciBpdEVuZCA9IGdldFRyYWNlKCkuZW5kKCk7DQorCQlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkNCisJCXsNCisJCQkoKml0KS0+dG9Gc2NuKG9zLCBOVUxMKTsNCisJCX0NCisNCisJCXJlc3VsdFN0cmVhbS5jbG9zZSgpOw0KKw0KKwkJQVZNX09TX0xPRyA8PCAiT0siIDw8IHN0ZDo6ZW5kbCA7DQorCX0NCisJZWxzZQ0KKwl7DQorCQlBVk1fT1NfTE9HIDw8IHN0ZDo6ZW5kbCA8PCBUQUINCisJCQkJPDwgIiAgICBLTyA6IEZhaWxlZCB0byBvcGVuIHRoaXMgZmlsZSBpbiB3cml0ZSBtb2RlIg0KKwkJCQk8PCBzdGQ6OmVuZGw7DQorCX0NCit9DQorDQorLyoqDQorICogU2VyaWFsaXphdGlvbiBidWlsZGluZyBzdGFnZQ0KKyAqLw0KK3ZvaWQgQ29uZmlndXJhdGlvbjo6c2VyaWFsaXplQnVpbGRpbmdSZXN1bHQoKQ0KK3sNCisJaWYoIG1PdXRwdXRFeGVjdXRhYmxlRW5hYmxlZEdlbmVyYXRpb25GbGFnICkNCisJew0KKwkJc2VyaWFsaXplVGV4dHVhbEV4ZWN1dGFibGUoKTsNCisNCisJCXNlcmlhbGl6ZUdyYXBoaXpFeGVjdXRhYmxlKCk7DQorCX0NCit9DQorDQorLyoqDQorICogU2VyaWFsaXphdGlvbiBjb21wdXRpbmcgc3RhZ2UNCisgKi8NCit2b2lkIENvbmZpZ3VyYXRpb246OnNlcmlhbGl6ZUNvbXB1dGluZ1Jlc3VsdCgpDQorew0KK0FWTV9JRl9ERUJVR19GTEFHX0FORCggQ09NUFVUSU5HICwgaXNEZWJ1Z0xvYWRpbmdTdGFnZUVuYWJsZWQoKSApDQorCQlzZXJpYWxpemVEZWJ1Z0V4ZWN1dGFibGUoICJqaXQiICk7DQorQVZNX0VORElGX0RFQlVHX0ZMQUdfQU5EKCBDT01QVVRJTkcgKQ0KKw0KKwlpZiggbU91dHB1dFN5bWJleFNjZW5hcmlpRW5hYmxlZEdlbmVyYXRpb25GbGFnICkNCisJew0KKwkJc2VyaWFsaXplU2NlbmFyaWkoKTsNCisJfQ0KKw0KKwlpZiggbU91dHB1dFN5bWJleEdyYXBoRW5hYmxlZEdlbmVyYXRpb25GbGFnICkNCisJew0KK0FWTV9JRl9ERUJVR19FTkFCTEVEDQorDQorCQlzZXJpYWxpemVUZXh0dWFsU3ltYmV4R3JhcGgoKTsNCisNCitBVk1fRU5ESUZfREVCVUdfRU5BQkxFRA0KKw0KKwkJc2VyaWFsaXplR3JhcGhpelN5bWJleEdyYXBoKCk7DQorCX0NCisNCisvLwlzYXZlUHJvamVjdGlvbigpOw0KKy8vCXNhdmVQcm9qZWN0aW9uU2NlbmFyaWkobVBhcmFtZXRlcldPYmplY3QpOw0KK30NCisNCisNCisvKioNCisgKiBTZXJpYWxpemF0aW9uDQorICovDQordm9pZCBDb25maWd1cmF0aW9uOjp0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QNCit7DQorCW9zIDw8IFRBQiA8PCAiY29uZmlndXJhdGlvbiAiIDw8IGdldE5hbWVJRCgpIDw8ICIgeyIgPDwgRU9MOw0KKw0KKwlvcyA8PCBUQUIyIDw8ICJXb3Jrc3BhY2VSb290UGF0aCA9ICIgPDwgVkZTOjpXb3Jrc3BhY2VSb290UGF0aCA8PCBFT0w7DQorDQorCW9zIDw8IFRBQjIgPDwgIm1Qcm9qZWN0U291cmNlTG9jYXRpb24gPSAiDQorCQkJPDwgVkZTOjpyZWxhdGl2ZVdvcmtzcGFjZVBhdGgoIG1Qcm9qZWN0U291cmNlTG9jYXRpb24gKQ0KKwkJCTw8IEVPTDsNCisJb3MgPDwgVEFCMiA8PCAibVNwZWNpZmljYXRpb25GaWxlTG9jYXRpb24gPSAiDQorCQkJPDwgVkZTOjpyZWxhdGl2ZVdvcmtzcGFjZVBhdGgoIG1TcGVjaWZpY2F0aW9uRmlsZUxvY2F0aW9uICkNCisJCQk8PCBFT0w7DQorDQorCW9zIDw8IFRBQjIgPDwgIm1Pd25lZFNwZWNpZmljYXRpb25GbGFnID0gIg0KKwkJCTw8ICggbU93bmVkU3BlY2lmaWNhdGlvbkZsYWcgPyAidHJ1ZSIgOiAiZmFsc2UiICkNCisJCQk8PCBFT0w7DQorCW9zIDw8IFRBQjIgPDwgIm1PdXRwdXRGaWxlbmFtZVBhdHRlcm4gPSAiDQorCQkJPDwgVkZTOjpyZWxhdGl2ZVdvcmtzcGFjZVBhdGgoIG1PdXRwdXRGaWxlbmFtZVBhdHRlcm4gKQ0KKwkJCTw8IEVPTDsNCisJb3MgPDwgVEFCMiA8PCAibURlYnVnRmlsZW5hbWVQYXR0ZXJuICA9ICINCisJCQk8PCBWRlM6OnJlbGF0aXZlV29ya3NwYWNlUGF0aCggbURlYnVnRmlsZW5hbWVQYXR0ZXJuICkNCisJCQk8PCBFT0w7DQorDQorCW9zIDw8IFRBQjIgPDwgIm1PdXRwdXRFeGVjdXRhYmxlRW5hYmxlZEdlbmVyYXRpb25GbGFnID0gIg0KKwkJCTw8ICggbU91dHB1dEV4ZWN1dGFibGVFbmFibGVkR2VuZXJhdGlvbkZsYWcgPyAidHJ1ZSIgOiAiZmFsc2UiICkNCisJCQk8PCBFT0w7DQorCW9zIDw8IFRBQjIgPDwgIm1PdXRwdXRFeGVjdXRhYmxlRmlsZUxvY2F0aW9uID0gIg0KKwkJCTw8IFZGUzo6cmVsYXRpdmVXb3Jrc3BhY2VQYXRoKCBtT3V0cHV0RXhlY3V0YWJsZUZpbGVMb2NhdGlvbiApDQorCQkJPDwgRU9MOw0KKw0KKwlvcyA8PCBUQUIyIDw8ICJtT3V0cHV0U3ltYmV4R3JhcGhFbmFibGVkR2VuZXJhdGlvbkZsYWcgPSAiDQorCQkJPDwgKCBtT3V0cHV0U3ltYmV4R3JhcGhFbmFibGVkR2VuZXJhdGlvbkZsYWcgPyAidHJ1ZSIgOiAiZmFsc2UiICkNCisJCQk8PCBFT0w7DQorCW9zIDw8IFRBQjIgPDwgIm1PdXRwdXRTeW1iZXhHcmFwaEZpbGVMb2NhdGlvbiA9ICINCisJCQk8PCBWRlM6OnJlbGF0aXZlV29ya3NwYWNlUGF0aCggbU91dHB1dFN5bWJleEdyYXBoRmlsZUxvY2F0aW9uICkNCisJCQk8PCBFT0w7DQorDQorCW9zIDw8IFRBQjIgPDwgIm1PdXRwdXRTeW1iZXhTY2VuYXJpaUVuYWJsZWRHZW5lcmF0aW9uRmxhZyA9ICINCisJCQk8PCAoIG1PdXRwdXRTeW1iZXhTY2VuYXJpaUVuYWJsZWRHZW5lcmF0aW9uRmxhZyA/ICJ0cnVlIiA6ICJmYWxzZSIgKQ0KKwkJCTw8IEVPTDsNCisJb3MgPDwgVEFCMiA8PCAibU91dHB1dFN5bWJleFNjZW5hcmlpRmlsZUxvY2F0aW9uID0gIg0KKwkJCTw8IFZGUzo6cmVsYXRpdmVXb3Jrc3BhY2VQYXRoKCBtT3V0cHV0U3ltYmV4U2NlbmFyaWlGaWxlTG9jYXRpb24gKQ0KKwkJCTw8IEVPTDsNCisNCisJb3MgPDwgVEFCMiA8PCAibURlYnVnU3RhZ2VFbmFibGVkRmxhZyAgICAgICAgICA9ICINCisJCQk8PCAoIG1EZWJ1Z1N0YWdlRW5hYmxlZEZsYWcgPyAidHJ1ZSIgOiAiZmFsc2UiICkgPDwgRU9MOw0KKw0KKwlvcyA8PCBUQUIyIDw8ICJtRGVidWdQYXJzaW5nU3RhZ2VFbmFibGVkRmxhZyAgID0gIg0KKwkJCTw8ICggbURlYnVnUGFyc2luZ1N0YWdlRW5hYmxlZEZsYWcgPyAidHJ1ZSIgOiAiZmFsc2UiICkgPDwgRU9MOw0KKw0KKwlvcyA8PCBUQUIyIDw8ICJtRGVidWdDb21waWxpbmdTdGFnZUVuYWJsZWRGbGFnID0gIg0KKwkJCTw8ICggbURlYnVnQ29tcGlsaW5nU3RhZ2VFbmFibGVkRmxhZyA/ICJ0cnVlIiA6ICJmYWxzZSIgKSA8PCBFT0w7DQorDQorCW9zIDw8IFRBQjIgPDwgIm1EZWJ1Z0xvYWRpbmdTdGFnZUVuYWJsZWRGbGFnICAgPSAiDQorCQkJPDwgKCBtRGVidWdMb2FkaW5nU3RhZ2VFbmFibGVkRmxhZyA/ICJ0cnVlIiA6ICJmYWxzZSIgKSA8PCBFT0w7DQorDQorCW9zIDw8IFRBQjIgPDwgIm1EZWJ1Z0NvbXB1dGluZ0VuYWJsZWRGbGFnICAgICAgPSAiDQorCQkJPDwgKCBtRGVidWdDb21wdXRpbmdFbmFibGVkRmxhZyA/ICJ0cnVlIiA6ICJmYWxzZSIgKSA8PCBFT0w7DQorDQorDQorCW9zIDw8IFRBQjIgPDwgIm1JbmNvbmRpdGlvbmFsU3RvcE1hcmtlckxvY2F0aW9uID0gIg0KKwkJCTw8IFZGUzo6cmVsYXRpdmVXb3Jrc3BhY2VQYXRoKCBtSW5jb25kaXRpb25hbFN0b3BNYXJrZXJMb2NhdGlvbiApDQorCQkJPDwgRU9MOw0KKw0KKwlvcyA8PCBUQUIgPDwgIn0iIDw8IEVPTF9GTFVTSDsNCit9DQorDQorDQorfSAvKiBuYW1lc3BhY2Ugc2VwICovDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc2V3L0NvbmZpZ3VyYXRpb24uaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3Nldy9Db25maWd1cmF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ2MDNiZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3Nldy9Db25maWd1cmF0aW9uLmgKQEAgLTAsMCArMSw1NTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULg0KKyAqDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENyZWF0ZWQgb246IDE0IGTDqWMuIDIwMTYNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcg0KKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgSW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpZm5kZWYgRk1MX1dPUktGTE9XX0NPTkZJR1VSQVRJT05fSF8NCisjZGVmaW5lIEZNTF9XT1JLRkxPV19DT05GSUdVUkFUSU9OX0hfDQorDQorI2luY2x1ZGUgPGNvbW1vbi9OYW1lZEVsZW1lbnQuaD4NCisNCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1N5c3RlbS5oPg0KKw0KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlU3lzdGVtLmg+DQorDQorI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkNvbnRleHQuaD4NCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvUnVudGltZUlELmg+DQorDQorI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9XT2JqZWN0Lmg+DQorDQorI2luY2x1ZGUgPHByaW50ZXIvT3V0U3RyZWFtLmg+DQorDQorDQorDQorbmFtZXNwYWNlIHNlcA0KK3sNCisNCitjbGFzcyBBUEV4ZWN1dGlvbkRhdGE7DQorDQorY2xhc3MgRXhlY3V0YWJsZVN5c3RlbTsNCisNCitjbGFzcyBTeW1iZXhFbmdpbmU7DQorDQorY2xhc3MgV29ya2Zsb3c7DQorDQorDQorLyoqDQorICogVFlQRURFRg0KKyAqLw0KK3R5cGVkZWYgVmVjdG9yPCBSdW50aW1lSUQgPiAgVGFibGVPZlJ1bnRpbWVJRF9UOw0KKw0KKw0KKw0KK2NsYXNzIENvbmZpZ3VyYXRpb24gIDogIHB1YmxpYyBOYW1lZEVsZW1lbnQNCit7DQorDQorCUFWTV9ERUNMQVJFX1VOQ0xPTkFCTEVfQ0xBU1MoQ29uZmlndXJhdGlvbikNCisNCitwdWJsaWM6DQorCS8qKg0KKwkgKiBBVFRSSUJVVEVTDQorCSAqIEdMT0JBTA0KKwkgKi8NCisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIFNQRUNJRklDQVRJT05fRklMRV9FWFRFTlNJT047DQorDQorCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBFWEVDVVRBQkxFX0ZJTEVfRVhURU5TSU9OOw0KKw0KKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgU1lNQkVYX0dSQVBIX0ZJTEVfRVhURU5TSU9OOw0KKw0KKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgU1lNQkVYX1NDRU5BUklJX0ZJTEVfRVhURU5TSU9OOw0KKw0KKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgR1JBUEhWSVpfRklMRV9FWFRFTlNJT047DQorDQorDQorcHJvdGVjdGVkIDoNCisJLyoqDQorCSAqIEFUVFJJQlVURVMNCisJICovDQorCVN5bWJleEVuZ2luZSAmIG1TeW1iZXhFbmdpbmU7DQorCVdvcmtmbG93ICYgbVdvcmtmbG93Ow0KKw0KKwlXT2JqZWN0TWFuYWdlciBtV09iamVjdE1hbmFnZXI7DQorDQorCXN0ZDo6c3RyaW5nIG1Qcm9qZWN0U291cmNlTG9jYXRpb247DQorCXN0ZDo6c3RyaW5nIG1TcGVjaWZpY2F0aW9uRmlsZUxvY2F0aW9uOw0KKw0KKwlib29sIG1Pd25lZFNwZWNpZmljYXRpb25GbGFnOw0KKw0KKwlzdGQ6OnN0cmluZyBtT3V0cHV0RmlsZW5hbWVQYXR0ZXJuOw0KKwlzdGQ6OnN0cmluZyBtRGVidWdGaWxlbmFtZVBhdHRlcm47DQorDQorCWJvb2wgbU91dHB1dEV4ZWN1dGFibGVFbmFibGVkR2VuZXJhdGlvbkZsYWc7DQorCXN0ZDo6c3RyaW5nIG1PdXRwdXRFeGVjdXRhYmxlRmlsZUxvY2F0aW9uOw0KKw0KKwlib29sIG1PdXRwdXRTeW1iZXhHcmFwaEVuYWJsZWRHZW5lcmF0aW9uRmxhZzsNCisJc3RkOjpzdHJpbmcgbU91dHB1dFN5bWJleEdyYXBoRmlsZUxvY2F0aW9uOw0KKw0KKwlib29sIG1PdXRwdXRTeW1iZXhTY2VuYXJpaUVuYWJsZWRHZW5lcmF0aW9uRmxhZzsNCisJc3RkOjpzdHJpbmcgbU91dHB1dFN5bWJleFNjZW5hcmlpRmlsZUxvY2F0aW9uOw0KKw0KKwlib29sIG1EZWJ1Z1N0YWdlRW5hYmxlZEZsYWc7DQorCWJvb2wgbURlYnVnUGFyc2luZ1N0YWdlRW5hYmxlZEZsYWc7DQorCWJvb2wgbURlYnVnQ29tcGlsaW5nU3RhZ2VFbmFibGVkRmxhZzsNCisJYm9vbCBtRGVidWdMb2FkaW5nU3RhZ2VFbmFibGVkRmxhZzsNCisJYm9vbCBtRGVidWdDb21wdXRpbmdFbmFibGVkRmxhZzsNCisNCisJLy8gU3ltYmV4IFRocmVhZGluZyBjb25maWcNCisJYm9vbCBtTXVsdGl0YXNraW5nRmxhZzsNCisJYXZtX3VpbnQ4X3QgbVRocmVhZENvdW50Ow0KKw0KKwkvLyBTaGVsbCBjb25maWcNCisJc3RkOjpzdHJpbmcgbUluY29uZGl0aW9uYWxTdG9wTWFya2VyTG9jYXRpb247DQorDQorDQorCUF2bVBvaW50ZXI8IFN5c3RlbSAgICAgICAgICAgLCBEZXN0cm95RWxlbWVudFBvbGljeSA+IG1TcGVjaWZpY2F0aW9uOw0KKw0KKwlBdm1Qb2ludGVyPCBFeGVjdXRhYmxlU3lzdGVtICwgRGVzdHJveUVsZW1lbnRQb2xpY3kgPiBtRXhlY3V0YWJsZVN5c3RlbTsNCisNCisJVGFibGVPZlJ1bnRpbWVJRF9UICBtVGFibGVPZlJJRDsNCisNCisJRXhlY3V0aW9uQ29udGV4dCBtTWFpbkV4ZWN1dGlvbkNvbnRleHQ7DQorDQorCUxpc3RPZkV4ZWN1dGlvbkNvbnRleHQgbUlucHV0Q29udGV4dDsNCisNCisJTGlzdE9mRXhlY3V0aW9uQ29udGV4dCBtVHJhY2U7DQorDQorDQorcHVibGljIDoNCisJLyoqDQorCSAqIENPTlNUUlVDVE9SDQorCSAqIERlZmF1bHQNCisJICovDQorCUNvbmZpZ3VyYXRpb24oU3ltYmV4RW5naW5lICYgYVN5bWJleEVuZ2luZSwgV29ya2Zsb3cgJiBhV29ya2Zsb3cpOw0KKw0KKwkvKioNCisJICogREVTVFJVQ1RPUg0KKwkgKi8NCisJdmlydHVhbCB+Q29uZmlndXJhdGlvbigpOw0KKw0KKwl2b2lkIGRlc3Ryb3koKTsNCisNCisNCisJLyoqDQorCSAqIEdFVFRFUg0KKwkgKiBtU3ltYmV4RW5naW5lDQorCSAqLw0KKwlpbmxpbmUgU3ltYmV4RW5naW5lICYgZ2V0U3ltYmV4RW5naW5lKCkgY29uc3QNCisJew0KKwkJcmV0dXJuKCBtU3ltYmV4RW5naW5lICk7DQorCX0NCisNCisJLyoqDQorCSAqIEdFVFRFUg0KKwkgKiBtV09iamVjdE1hbmFnZXINCisJICovDQorCWlubGluZSAgV09iamVjdE1hbmFnZXIgJiBnZXRXT2JqZWN0TWFuYWdlcigpDQorCXsNCisJCXJldHVybiggbVdPYmplY3RNYW5hZ2VyICk7DQorCX0NCisNCisNCisJLyoqDQorCSAqIENPTkZJR1VSRQ0KKwkgKi8NCisJYm9vbCBjb25maWd1cmUoV09iamVjdCAqIHdmQ29uZmlndXJhdGlvbiwgQ29uZmlndXJhdGlvbiAqIHByZXZDb25maWd1cmF0aW9uKTsNCisNCisJYm9vbCBjb25maWd1cmVfc2hlbGxfc3ltYmV4KFdPYmplY3QgKiB3ZkNvbmZpZ3VyYXRpb24pOw0KKw0KKwlib29sIGNvbmZpZ3VyZUZvcm1hdHRlcihXT2JqZWN0ICogRk9STUFULA0KKwkJCXN0ZDo6c3RyaW5nICYgZm9ybWF0UGF0dGVybiwgY29uc3Qgc3RkOjpzdHJpbmcgJiBpZCk7DQorDQorDQorCS8qDQorCSAqIEdFVFRFUg0KKwkgKiBtV29ya2Zsb3cNCisJICovDQorCVdvcmtmbG93ICYgZ2V0V29ya2Zsb3coKQ0KKwl7DQorCQlyZXR1cm4oIG1Xb3JrZmxvdyApOw0KKwl9DQorDQorDQorCS8qKg0KKwkgKiBTeW1iZXggVGhyZWFkaW5nIGNvbmZpZw0KKwkgKi8NCisJaW5saW5lIGJvb2wgaXNNdWx0aXRhc2tpbmcoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIG1NdWx0aXRhc2tpbmdGbGFnICk7DQorCX0NCisNCisJaW5saW5lIGF2bV91aW50OF90IGdldFRocmVhZENvdW50KCkgY29uc3QNCisJew0KKwkJcmV0dXJuKCBtVGhyZWFkQ291bnQgKTsNCisJfQ0KKw0KKwkvKioNCisJICogR0VUVEVSDQorCSAqIG1JbmNvbmRpdGlvbmFsU3RvcE1hcmtlckxvY2F0aW9uDQorCSAqLw0KKwljb25zdCBzdGQ6OnN0cmluZyAmIGdldEluY29uZGl0aW9uYWxTdG9wTWFya2VyTG9jYXRpb24oKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIG1JbmNvbmRpdGlvbmFsU3RvcE1hcmtlckxvY2F0aW9uICk7DQorCX0NCisNCisNCisJLyoqDQorCSAqIG1TcGVjaWZpY2F0aW9uRmlsZUxvY2F0aW9uDQorCSAqLw0KKwlpbmxpbmUgYm9vbCBoYXNPd25lZFNwZWNpZmljYXRpb24oKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIG1Pd25lZFNwZWNpZmljYXRpb25GbGFnICk7DQorCX0NCisNCisJLyoqDQorCSAqIG1TcGVjaWZpY2F0aW9uRmlsZUxvY2F0aW9uDQorCSAqLw0KKwlpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcgJiBnZXRTcGVjaWZpY2F0aW9uRmlsZUxvY2F0aW9uKCkgY29uc3QNCisJew0KKwkJcmV0dXJuKCBtU3BlY2lmaWNhdGlvbkZpbGVMb2NhdGlvbiApOw0KKwl9DQorDQorCS8qKg0KKwkgKiBHRVRURVINCisJICogT1VUUFVUIC8gREVCSUcgRklMRSBMT0NBVElPTg0KKwkgKi8NCisJc3RkOjpzdHJpbmcgZm9ybWF0RmlsZUxvY2F0aW9uKA0KKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUZpbGVuYW1lUGF0dGVybiwgY29uc3Qgc3RkOjpzdHJpbmcgJiBzdHJJRCwNCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIHN0ckV4dGVuc2lvbiA9ICIiKSBjb25zdDsNCisNCisJaW5saW5lIHN0ZDo6c3RyaW5nIGZvcm1hdEZpbGVMb2NhdGlvbihib29sIGlzRGVidWcsDQorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBzdHJJRCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBzdHJFeHRlbnNpb24pIGNvbnN0DQorCXsNCisJCXJldHVybiggZm9ybWF0RmlsZUxvY2F0aW9uKA0KKwkJCQkoaXNEZWJ1ZyA/IG1EZWJ1Z0ZpbGVuYW1lUGF0dGVybiA6IG1PdXRwdXRGaWxlbmFtZVBhdHRlcm4pLA0KKwkJCQlzdHJJRCwgc3RyRXh0ZW5zaW9uKSApOw0KKwl9DQorDQorCWlubGluZSBzdGQ6OnN0cmluZyBmb3JtYXRPdXRwdXRGaWxlTG9jYXRpb24oDQorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBzdHJJRCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBzdHJFeHRlbnNpb24pIGNvbnN0DQorCXsNCisJCXJldHVybiggZm9ybWF0RmlsZUxvY2F0aW9uKA0KKwkJCQltT3V0cHV0RmlsZW5hbWVQYXR0ZXJuLCBzdHJJRCwgc3RyRXh0ZW5zaW9uKSApOw0KKwl9DQorDQorCWlubGluZSBzdGQ6OnN0cmluZyBmb3JtYXREZWJ1Z0ZpbGVMb2NhdGlvbigNCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIHN0cklELCBjb25zdCBzdGQ6OnN0cmluZyAmIHN0ckV4dGVuc2lvbikgY29uc3QNCisJew0KKwkJcmV0dXJuKCBmb3JtYXRGaWxlTG9jYXRpb24oDQorCQkJCW1EZWJ1Z0ZpbGVuYW1lUGF0dGVybiwgc3RySUQsIHN0ckV4dGVuc2lvbikgKTsNCisJfQ0KKw0KKw0KKwkvKioNCisJICogR0VUVEVSDQorCSAqIG1EZWJ1Z1N0YWdlRW5hYmxlZEZsYWcNCisJICogbURlYnVnUGFyc2luZ1N0YWdlRW5hYmxlZEZsYWcNCisJICogbURlYnVnQ29tcGlsaW5nU3RhZ2VFbmFibGVkRmxhZw0KKwkgKiBtRGVidWdMb2FkaW5nRW5hYmxlZEZsYWcNCisJICogbURlYnVnQ29tcHV0aW5nRW5hYmxlZEZsYWcNCisJICovDQorCWlubGluZSBib29sIGlzRGVidWdTdGFnZUVuYWJsZWQoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIG1EZWJ1Z1N0YWdlRW5hYmxlZEZsYWcgKTsNCisJfQ0KKw0KKwlpbmxpbmUgYm9vbCBpc0RlYnVnUGFyc2luZ1N0YWdlRW5hYmxlZCgpIGNvbnN0DQorCXsNCisJCXJldHVybiggbURlYnVnUGFyc2luZ1N0YWdlRW5hYmxlZEZsYWcgKTsNCisJfQ0KKw0KKwlpbmxpbmUgYm9vbCBpc0RlYnVnQ29tcGlsaW5nU3RhZ2VFbmFibGVkKCkgY29uc3QNCisJew0KKwkJcmV0dXJuKCBtRGVidWdDb21waWxpbmdTdGFnZUVuYWJsZWRGbGFnICk7DQorCX0NCisNCisJaW5saW5lIGJvb2wgaXNEZWJ1Z0xvYWRpbmdTdGFnZUVuYWJsZWQoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIG1EZWJ1Z0xvYWRpbmdTdGFnZUVuYWJsZWRGbGFnICk7DQorCX0NCisNCisJaW5saW5lIGJvb2wgaXNEZWJ1Z0NvbXB1dGluZ1N0YWdlRW5hYmxlZCgpIGNvbnN0DQorCXsNCisJCXJldHVybiggbURlYnVnQ29tcHV0aW5nRW5hYmxlZEZsYWcgKTsNCisJfQ0KKw0KKw0KKwkvKg0KKwkgKiBHRVRURVIgLSBTRVRURVINCisJICogbVNwZWNpZmljYXRpb24NCisJICovDQorCWlubGluZSBTeXN0ZW0gJiBnZXRTcGVjaWZpY2F0aW9uKCkNCisJew0KKwkJcmV0dXJuKCAqbVNwZWNpZmljYXRpb24gKTsNCisJfQ0KKw0KKwlpbmxpbmUgY29uc3QgU3lzdGVtICYgZ2V0U3BlY2lmaWNhdGlvbigpIGNvbnN0DQorCXsNCisJCXJldHVybiggKm1TcGVjaWZpY2F0aW9uICk7DQorCX0NCisNCisJaW5saW5lIGJvb2wgaGFzU3BlY2lmaWNhdGlvbigpIGNvbnN0DQorCXsNCisJCXJldHVybiggbVNwZWNpZmljYXRpb24udmFsaWQoKSApOw0KKwl9DQorDQorCWlubGluZSB2b2lkIHNldFNwZWNpZmljYXRpb24oU3lzdGVtICogYVNwZWNpZmljYXRpb24pDQorCXsNCisJCW1TcGVjaWZpY2F0aW9uID0gYVNwZWNpZmljYXRpb247DQorCX0NCisNCisNCisJLyoNCisJICogR0VUVEVSIC0gU0VUVEVSDQorCSAqIG1FeGVjdXRhYmxlU3lzdGVtDQorCSAqLw0KKwlpbmxpbmUgRXhlY3V0YWJsZVN5c3RlbSAmIGdldEV4ZWN1dGFibGVTeXN0ZW0oKQ0KKwl7DQorCQlyZXR1cm4oICptRXhlY3V0YWJsZVN5c3RlbSApOw0KKwl9DQorDQorCWlubGluZSBjb25zdCBFeGVjdXRhYmxlU3lzdGVtICYgZ2V0RXhlY3V0YWJsZVN5c3RlbSgpIGNvbnN0DQorCXsNCisJCXJldHVybiggKm1FeGVjdXRhYmxlU3lzdGVtICk7DQorCX0NCisNCisvLwlpbmxpbmUgYm9vbCBoYXNFeGVjdXRhYmxlU3lzdGVtKCkgY29uc3QNCisvLwl7DQorLy8JCXJldHVybiggbUV4ZWN1dGFibGVTeXN0ZW0udmFsaWQoKSApOw0KKy8vCX0NCisNCisJaW5saW5lIHZvaWQgc2V0RXhlY3V0YWJsZVN5c3RlbShFeGVjdXRhYmxlU3lzdGVtICogYW5FeGVjdXRhYmxlU3lzdGVtKQ0KKwl7DQorCQltRXhlY3V0YWJsZVN5c3RlbSA9IGFuRXhlY3V0YWJsZVN5c3RlbTsNCisJfQ0KKw0KKw0KKwkvKioNCisJICogR0VUVEVSIC0gU0VUVEVSDQorCSAqIG1UYWJsZU9mUklEDQorCSAqLw0KKwlpbmxpbmUgdm9pZCBhcHBlbmRSSUQoY29uc3QgUnVudGltZUlEICYgYVJJRCkNCisJew0KKwkJbVRhYmxlT2ZSSUQuYXBwZW5kKGFSSUQpOw0KKwl9DQorDQorCXZvaWQgZGVzdHJveVJJRFJ1bm5pbmdDb2RlKCk7DQorDQorCWlubGluZSBjb25zdCBUYWJsZU9mUnVudGltZUlEX1QgJiBnZXRUYWJsZU9mUklEKCkgY29uc3QNCisJew0KKwkJcmV0dXJuKCBtVGFibGVPZlJJRCApOw0KKwl9DQorDQorDQorCS8qDQorCSAqIEdFVFRFUiAtIFNFVFRFUg0KKwkgKiBtTWFpbkV4ZWN1dGlvbkNvbnRleHQNCisJICovDQorCWlubGluZSBFeGVjdXRpb25Db250ZXh0ICYgZ2V0TWFpbkV4ZWN1dGlvbkNvbnRleHQoKQ0KKwl7DQorCQlyZXR1cm4oIG1NYWluRXhlY3V0aW9uQ29udGV4dCApOw0KKwl9DQorDQorCWlubGluZSBjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgZ2V0TWFpbkV4ZWN1dGlvbkNvbnRleHQoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIG1NYWluRXhlY3V0aW9uQ29udGV4dCApOw0KKwl9DQorDQorCWlubGluZSBjb25zdCBFeGVjdXRpb25EYXRhICYgZ2V0TWFpbkV4ZWN1dGlvbkRhdGEoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIG1NYWluRXhlY3V0aW9uQ29udGV4dC5yZWZFeGVjdXRpb25EYXRhKCkgKTsNCisJfQ0KKw0KKw0KKwlpbmxpbmUgYm9vbCBoYXNNYWluRXhlY3V0aW9uQ29udGV4dCgpIGNvbnN0DQorCXsNCisJCXJldHVybiggbU1haW5FeGVjdXRpb25Db250ZXh0Lmhhc0V4ZWN1dGlvbkRhdGEoKSApOw0KKwl9DQorDQorDQorCWlubGluZSB2b2lkIHNldE1haW5FeGVjdXRpb25Db250ZXh0KA0KKwkJCWNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkV4ZWN1dGlvbkNvbnRleHQpDQorCXsNCisJCW1NYWluRXhlY3V0aW9uQ29udGV4dC5pbml0aWFsaXplKCBhbkV4ZWN1dGlvbkNvbnRleHQgKTsNCisJfQ0KKw0KKwlpbmxpbmUgdm9pZCBzZXRNYWluRXhlY3V0aW9uRGF0YShjb25zdCBBUEV4ZWN1dGlvbkRhdGEgJiBhbkV4ZWN1dGlvbkRhdGEpDQorCXsNCisJCW1NYWluRXhlY3V0aW9uQ29udGV4dC5pbml0aWFsaXplKCBhbkV4ZWN1dGlvbkRhdGEgLCAwICwgMSApOw0KKwl9DQorDQorDQorCS8qDQorCSAqIEdFVFRFUiAtIFNFVFRFUg0KKwkgKiBtSW5wdXRDb250ZXh0DQorCSAqLw0KKwlpbmxpbmUgY29uc3QgTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGdldElucHV0Q29udGV4dCgpIGNvbnN0DQorCXsNCisJCXJldHVybiggbUlucHV0Q29udGV4dCApOw0KKwl9DQorDQorCWlubGluZSBMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgZ2V0SW5wdXRDb250ZXh0KCkNCisJew0KKwkJcmV0dXJuKCBtSW5wdXRDb250ZXh0ICk7DQorCX0NCisNCisJaW5saW5lIGJvb2wgaGFzSW5wdXRDb250ZXh0KCkgY29uc3QNCisJew0KKwkJcmV0dXJuKCBtSW5wdXRDb250ZXh0Lm5vbmVtcHR5KCkgKTsNCisJfQ0KKw0KKwlpbmxpbmUgdm9pZCBhcHBlbmRJbnB1dENvbnRleHQoRXhlY3V0aW9uQ29udGV4dCAqIGFuSW5wdXRDb250ZXh0KQ0KKwl7DQorCQltSW5wdXRDb250ZXh0LmFwcGVuZCggYW5JbnB1dENvbnRleHQgKTsNCisJfQ0KKw0KKwkvKg0KKwkgKiBHRVRURVIgLSBTRVRURVINCisJICogbVRyYWNlDQorCSAqLw0KKwlpbmxpbmUgY29uc3QgTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGdldFRyYWNlKCkgY29uc3QNCisJew0KKwkJcmV0dXJuKCBtVHJhY2UgKTsNCisJfQ0KKw0KKwlpbmxpbmUgRXhlY3V0aW9uQ29udGV4dCAqIGdldEZpcnN0VHJhY2UoKSBjb25zdA0KKwl7DQorCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoIG1UcmFjZS5ub25lbXB0eSgpICkNCisJCQkJPDwgIkV4cGVjdGVkIGEgbm9uLWVtcHR5IFN5bWJleCBSb290IEV4ZWN1dGlvbiBDb250ZXh0IExpc3QgISEhIg0KKwkJCQk8PCBTRU5EX0VYSVQ7DQorDQorCQlyZXR1cm4oIG1UcmFjZS5maXJzdCgpICk7DQorCX0NCisNCisJaW5saW5lIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiByZWZGaXJzdFRyYWNlKCkgY29uc3QNCisJew0KKwkJQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKCBtVHJhY2Uubm9uZW1wdHkoKSApDQorCQkJCTw8ICJFeHBlY3RlZCBhIG5vbi1lbXB0eSBTeW1iZXggUm9vdCBFeGVjdXRpb24gQ29udGV4dCBMaXN0ICEhISINCisJCQkJPDwgU0VORF9FWElUOw0KKw0KKwkJcmV0dXJuKCAqKCBtVHJhY2UuZmlyc3QoKSApICk7DQorCX0NCisNCisJaW5saW5lIGJvb2wgaGFzVHJhY2UoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIG1UcmFjZS5ub25lbXB0eSgpICk7DQorCX0NCisNCisJaW5saW5lIGJvb2wgbm9UcmFjZSgpIGNvbnN0DQorCXsNCisJCXJldHVybiggbVRyYWNlLmVtcHR5KCkgKTsNCisJfQ0KKw0KKwlpbmxpbmUgdm9pZCBhcHBlbmRUcmFjZShFeGVjdXRpb25Db250ZXh0ICogYVRyYWNlKQ0KKwl7DQorCQltVHJhY2UuYXBwZW5kKCBhVHJhY2UgKTsNCisJfQ0KKw0KKwlpbmxpbmUgdm9pZCBhcHBlbmRUcmFjZShjb25zdCBMaXN0T2ZFeGVjdXRpb25Db250ZXh0ICYgYVRyYWNlKQ0KKwl7DQorCQltVHJhY2UuYXBwZW5kKCBhVHJhY2UgKTsNCisJfQ0KKw0KKw0KKwkvKg0KKwkgKiBTRVRURVINCisJICogbVNwZWNpZmljYXRpb24NCisJICogbUV4ZWN1dGFibGVTeXN0ZW0NCisJICogbU1haW5FeGVjdXRpb25Db250ZXh0DQorCSAqIG1UcmFjZQ0KKwkgKi8NCisJdm9pZCBzZXQoQ29uZmlndXJhdGlvbiAmIGFDb25maWd1cmF0aW9uKQ0KKwl7DQorCQltU3BlY2lmaWNhdGlvbiA9IGFDb25maWd1cmF0aW9uLm1TcGVjaWZpY2F0aW9uOw0KKw0KKwkJbUV4ZWN1dGFibGVTeXN0ZW0gPSBhQ29uZmlndXJhdGlvbi5tRXhlY3V0YWJsZVN5c3RlbTsNCisNCisJCXNldE1haW5FeGVjdXRpb25Db250ZXh0KCBhQ29uZmlndXJhdGlvbi5tTWFpbkV4ZWN1dGlvbkNvbnRleHQgKTsNCisNCisJCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggYUNvbmZpZ3VyYXRpb24ubUlucHV0Q29udGV4dC5ub25lbXB0eSgpICkNCisJCQkJPDwgIkV4cGVjdGVkIGEgbm9uLWVtcHR5IFN5bWJleCBJbnB1dCBFeGVjdXRpb24gQ29udGV4dCBMaXN0ICEhISINCisJCQkJPDwgU0VORF9FWElUOw0KKw0KKwkJbUlucHV0Q29udGV4dCA9IGFDb25maWd1cmF0aW9uLm1JbnB1dENvbnRleHQ7DQorDQorCQltVHJhY2UgPSBhQ29uZmlndXJhdGlvbi5tVHJhY2U7DQorCX0NCisNCisNCisJLyoqDQorCSAqIFNBVklORw0KKwkgKi8NCisJdm9pZCBzYXZlU3BlY2lmaWNhdGlvbihib29sIGlzRGVidWcsIGNvbnN0IHN0ZDo6c3RyaW5nICYgc3RySUQgPSAiIik7DQorCXZvaWQgc2F2ZVN5bWJleEdyYXBoKGJvb2wgaXNEZWJ1ZywgY29uc3Qgc3RkOjpzdHJpbmcgJiBzdHJJRCA9ICIiKTsNCisJdm9pZCBzYXZlU3ltYmV4U2NlbmFyaWkoYm9vbCBpc0RlYnVnLCBjb25zdCBzdGQ6OnN0cmluZyAmIHN0cklEID0gIiIpOw0KKw0KKw0KKy8vCXN0YXRpYyB2b2lkIHNhdmVTcGVjaWZpY2F0aW9uQWZ0ZXJDb21waWxhdGlvblN0ZXAoDQorLy8JCQljb25zdCBzdGQ6OnN0cmluZyAmIHN0clByZWZpeE5hbWUgPSAiIik7DQorLy8NCisvLw0KKy8vCXN0YXRpYyB2b2lkIHNhdmVFeGVjdXRhYmxlU3BlY2lmaWNhdGlvbigNCisvLwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgc3RyUHJlZml4TmFtZSA9ICIiKTsNCisNCisJc3RhdGljIHZvaWQgc2F2ZUVsZW1lbnRUZXh0dWFsVmlldyhPdXRTdHJlYW0gJiBsb2dnZXIsDQorCQkJY29uc3QgRWxlbWVudCAmIGFuRWxlbWVudCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBzYXZlRmlsZVVSTCk7DQorDQorCWlubGluZSBzdGF0aWMgdm9pZCBzYXZlRWxlbWVudFRleHR1YWxWaWV3KE91dFN0cmVhbSAmIGxvZ2dlciwNCisJCQljb25zdCBFbGVtZW50ICogYW5FbGVtZW50LCBjb25zdCBzdGQ6OnN0cmluZyAmIHNhdmVGaWxlVVJMKQ0KKwl7DQorCQlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBhbkVsZW1lbnQgKQ0KKwkJCQk8PCAiRWxlbWVudCAhISEiDQorCQkJCTw8IFNFTkRfRVhJVDsNCisNCisJCWlmKCBhbkVsZW1lbnQgIT0gTlVMTCApDQorCQl7DQorCQkJc2F2ZUVsZW1lbnRUZXh0dWFsVmlldyhsb2dnZXIsICgqIGFuRWxlbWVudCksIHNhdmVGaWxlVVJMKTsNCisJCX0NCisJfQ0KKw0KKwkvLyBKb3NlIFByb2plY3Rpb246DQorLy8Jdm9pZCBzYXZlUHJvamVjdGlvbihjb25zdCBzdGQ6OnN0cmluZyAmIHN0clByZWZpeE5hbWUgPSAiIik7DQorLy8Jdm9pZCBzYXZlUHJvamVjdGlvblNjZW5hcmlpKGNvbnN0IHN0ZDo6c3RyaW5nICYgc3RyUHJlZml4TmFtZSA9ICIiKTsNCisNCisNCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwkvLyBTRVJJQUxJWkFUSU9OIEFQSQ0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorCXZvaWQgc2VyaWFsaXplRGVidWdFeGVjdXRhYmxlKGNvbnN0IHN0ZDo6c3RyaW5nICYgc3RySUQpOw0KKw0KKwl2b2lkIHNlcmlhbGl6ZVRleHR1YWxFeGVjdXRhYmxlKCk7DQorDQorCXZvaWQgc2VyaWFsaXplR3JhcGhpekV4ZWN1dGFibGUoKTsNCisNCisNCisJdm9pZCBzZXJpYWxpemVUZXh0dWFsU3ltYmV4R3JhcGgoKTsNCisNCisJdm9pZCBzZXJpYWxpemVHcmFwaGl6U3ltYmV4R3JhcGgoKTsNCisNCisNCisJdm9pZCBzZXJpYWxpemVTY2VuYXJpaSgpOw0KKw0KKw0KKwl2b2lkIHNlcmlhbGl6ZUJ1aWxkaW5nUmVzdWx0KCk7DQorDQorCXZvaWQgc2VyaWFsaXplQ29tcHV0aW5nUmVzdWx0KCk7DQorDQorDQorCXZpcnR1YWwgdm9pZCB0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3Q7DQorDQorfTsNCisNCisNCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8NCisNCisjZW5kaWYgLyogRk1MX1dPUktGTE9XX0NPTkZJR1VSQVRJT05fSF8gKi8NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9zZXcvUkVBRE1FLm1kIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc2V3L1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDE3OTNkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc2V3L1JFQURNRS5tZApAQCAtMCwwICsxLDI1IEBACisjIEVGTS1TWU1CRVg6OlNFVyA6IFN5bWJvbGljIEV4ZWN1dGlvbiBXb3JrZmxvdworCisjIyBTb3VyY2UgY29kZSBzdHJ1Y3R1cmUKKworIyMjIEludGVyZmFjZXMKKworIyBTeW1iZXggSm9iCitEZWZpbmUgY29tbW9uIHByb3BlcnRpZXMgYW4gYmVoYXZpb3JzIG9mIFN5bWJleCBDb250cm9sbGVyIGFuZCBQcm9jZXNzb3IKKworIyMjIENsYXNzZXMKKworIyBTeW1iZXggRGlzcGF0Y2hlcgorVGhlIFN5bWJleCB3b3JrZmxvdyBzY2hlZHVsZXIKKworIyBTeW1iZXggQ29udHJvbGxlcgorQ29udHJvbCBbZXhlY3V0aW9uXSBjb250ZXh0IHN0cmVhbXMgYmVmb3JlIGFuZCBhZnRlciBzeW1ib2xpYyBleGVjdXRpb24KKyogYmVmb3JlIGEuay5hLiBwcmUtZmlsdGVyaW5nIHN0ZXAKKyogYWZ0ZXIgIGEuay5hLiBwb3N0LWZpbHRlcmluZyBzdGVwCisKKyMgU3ltYmV4IFByb2Nlc3NvcgorUGVyZm9ybSBzeW1ib2xpYyBleGVjdXRpb24gb2YgYSBnaXZlbiBbZXhlY3V0aW9uXSBjb250ZXh0cworCisKKyMjIyBGYWN0b3JpZXMKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc2V3L1NFVy5tZCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3Nldy9TRVcubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhmMDUwMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3Nldy9TRVcubWQKQEAgLTAsMCArMSw1MjQgQEAKKyMgU0VXLCBTeW1ib2xpYyBFeGVjdXRpb24gV29ya2Zsb3cgU3BlY2lmaWNhdGlvbgorCisjIyAgQ2xhc3MgV29ya2Zsb3cKKyogKip3b3Jrc3BhY2UqKiBhcyBWaXJ0dWFsIEZpbGUgU3lzdGVtIGZvciB0aGUgV29ya2Zsb3cKKyogKipwcm9qZXQqKiBhcyB0aGUgc3BlY2lmaWNhdGlvbgorKiAqKmpvYioqIGFzIGFuYWx5c2lzIGpvYnMKKworYGBgc2V3CisKK1dvcmtmbG93IDxzZXctaWQ+ICI8ZGVzY3JpcHRpb24+IG9mIHRoZSBTeW1ib2xpYyBFeGVjdXRpb24gV29ya2Zsb3ciIHsKKwl3b3Jrc3BhY2U6IFsKKwkJLy8uLi4KKwldCisKKwlwcm9qZWN0OiBbCisJCS8vLi4uCisJXQorCisJc2VwIDxpZD4gIjxkZXNjcmlwdGlvbj4gb2YgR2xvYmFsIFN5bWJvbGljIEV4ZWN1dGlvbiBQbGF0Zm9ybSBDb25maWd1cmF0aW9uIiB7CisJCS8vLi4uCisJfQorCisJLy8gRGVmYXVsdCBKb2IgLyBEaXJlY3RvciAvIERyaXZlcgorCWpvYiA9IEpvYiA8aWQ+ICI8ZGVzY3JpcHRpb24+IiB7CisJCS8vIC4uLgorCX0KKworCS8vIEFkZGl0aW9uYWwgSm9iCisJam9iICs9IEpvYiA8aWQ+ICI8ZGVzY3JpcHRpb24+IiB7CisJCS8vIC4uLgorCX0KKworCS8qCisJc29wIDogU2VxdWVuY2UKKwkgICAgfCBQYXJhbGxlbAorCSovCisJc2NoZWR1bGVyID0gPHNvcD4geworCQlzdGFydCA8am9kLWlkLTE+CisJCXN0YXJ0IDxqb2QtaWQtMT4KKwl9Cit9CisKK2BgYAorCisKKyMjIyBTZXF1ZW5jZSBXb3Jrc3BhY2UKKyogKipyb290KiogYXMgd29ya3NwYWNlIG5hdGl2ZSBmaWxlIHN5c3RlbSBwYXRoIC8vIENoZW1pbiBhYnNvbHUgb3UgcmVsYXRpZiAoYXUgZG9zc2llciBkZSBsYW5jZW1lbnQhKSBkdSBwcm9qZXQgU0VXCisqICoqc291cmNlKiogYXMgd29ya3NwYWNlIHJlbGF0aXZlIHNvdXJjZSBmb2xkZXIKKyogKipvdXRwdXQqKiBhcyB3b3Jrc3BhY2UgcmVsYXRpdmUgb3V0cHV0IGZvbGRlcgorKiAqKmxvZyoqIGFzIHdvcmtzcGFjZSBvdXRwdXQgcmVsYXRpdmUgbG9nIGZvbGRlcgorCitgYGBzZXcKKword29ya3NwYWNlOiBbCisJcm9vdCAgID0gIjxwYXRoPiIKKwlzb3VyY2UgPSAiPHBhdGg+IgorCW91dHB1dCA9ICI8cGF0aD4iCisJbG9nICAgID0gIjxwYXRoPiIKK10KKworYGBgCisKKworIyMjIFNlcXVlbmNlIFByb2plY3QKKworYGBgc2V3CisKK3Byb2plY3Q6IFsKKwkvLyAuLi4KK10KKworYGBgCisKKworIyMjIENsYXNzIFNFUAorCitgYGBzZXcKKworc2VwIDxpZD4gIjxkZXNjcmlwdGlvbj4gb2YgU3ltYm9saWMgRXhlY3V0aW9uIFBsYXRmb3JtIENvbmZpZ3VyYXRpb24iIHsKKwljb3JlOiBbCisJCS8vLi4uCisJXQorCisJbG9nOiBbCisJCS8vLi4uCisJXQorCisJZGVidWc6IFsKKwkJLy8uLi4KKwldCisKKwkvLyAuLi4KK30KKworYGBgCisKKworIyMjIENsYXNzIFNBSiwgU3ltYm9saWMgQW5hbHlzaXMgSm9iIChvciBEaXJlY3RvciAvIERyaXZlcikKKyogKipzdHJlYW0qKiBhcyBkZWZhdWx0IGludGVyYWN0aW9uIHN0cmVhbXMKKyogKipwcm9qZWN0KiogYXMgYW5hbHl6ZWQgc3BlY2lmaWNhdGlvbgorKiAqKnNlcmlhbGl6ZXIqKiBhcyBkZWZhdWx0IHNlcmlhbGl6ZXJzCisqICoqZmFtKiogYXMgRm9ybWFsIEFuYWx5c2lzIE1vZHVsZQorCisKK2BgYHNldworCitqb2IgPSBKb2IgPGlkPiAiPGRlc2NyaXB0aW9uPiIgeworCXNlcCA8aWQ+ICI8ZGVzY3JpcHRpb24+IG9mIExvY2FsIFN5bWJvbGljIEV4ZWN1dGlvbiBQbGF0Zm9ybSBDb25maWd1cmF0aW9uIiB7CisJCS8vLi4uCisJfQorCisJc3RyZWFtOiBbCisJCS8vIC4uLgorCV0KKworCXByb2plY3Q6IFsKKwkJLy8uLi4KKwldCisKKwltYWluID0gTWFpbkFuYWx5c2lzTW9kdWxlIDxpZD4gIjxkZXNjcmlwdGlvbj4gb2YgdGhlIE1haW4gQW5hbHlzaXMgTW9kdWxlIiB7CisJCS8vIC4uLgorCX0KKworCXNlcmlhbGl6ZXIgPSBHcmFwaFZpelN0YXRlbWFjaGluZVNlcmlhbGl6ZXIgPGlkPiAiPGRlc2NyaXB0aW9uPiIgeworCQkvLyAuLi4KKwl9CisKKwlzZXJpYWxpemVyID0gR3JhcGhWaXpFeGVjdXRpb25HcmFwaFNlcmlhbGl6ZXIgPGlkPiAiPGRlc2NyaXB0aW9uPiIgeworCQkvLyAuLi4KKwl9CisKKworCWZhbSArPSBTdGF0ZVRyYW5zaXRpb25Db3ZlcmFnZU1vZHVsZSAiU3RhdGUvVHJhbnNpdGlvbiBDb3ZlcmFnZSBBbmFseXNpcyBNb2R1bGUiIHsKKwkJLy8gLi4uCisJfQorCisJZmFtICs9IEhpdE9ySnVtcE1vZHVsZSAiSGl0IG9yIEp1bXAgQW5hbHlzaXMgTW9kdWxlIiB7CisJCS8vIC4uLgorCX0KKworCisJZmFtICJGb3JtYWwgQW5hbHlzaXMgTW9kdWxlIiA9IGhpdG9yanVtcCB7CisJCS8vICJQcm9jZXNzb3IiIGRlIGdlc3Rpb24gZGVzIGNyaXTDqHJlcyBkJ2FycsOqdCBhYnNvbHVzIChwYXJhbcOodHJlcyB1dGlsaXNhdGV1cikKKwkJbWFpbiB7IC8vIG9yIGRpcmVjdG9yIC8gZHJpdmVyCisJCQlwcm9wZXJ0eTogWworCQkJCisJCQldCisKKwkJCWxvZzogWworCQkJCisJCQldCisKKwkJCWRlYnVnOiBbCisKKwkJCV0KKworCQkJcXVldWU6IFsKKworCQkJXQorCQl9CisJfQorfQorCitgYGAKKworIyMjIyBTZXF1ZW5jZSBTdHJlYW0KKyogKipzdGRpbioqIGFzIFN0YW5kYXJkIElucHV0IFN0cmVhbQorKiAqKnN0ZG91dCoqIGFzIFN0YW5kYXJkIE91dHB1dCBTdHJlYW0KKyogKipzdGRlcnIqKiBhcyBTdGFuZGFyZCBFcnJvciBTdHJlYW0KKworKiAqKnByb2plY3QqKiBhcyBtb2RlbCBzcGVjaWZpY2F0aW9uCisKKworYGBgc2V3CisKK3N0cmVhbTogWworCS8qCisJdXJpIDogc3RkICAgICAgIjo6IiAoICdjb3V0JyB8ICdjZXJyJyB8ICdjaW4nICApCisJICAgIHwgc2V3ICAgICAgIjo6IiAoICdsb2cnICB8ICd0cmFjZScgKQorCSAgICB8IGZvbGRlciAgICI6OiIgIjxwYXRoPiIKKwkgICAgfCBmaWxlICAgICAiOjoiICI8cGF0aD4iCisJICAgIHwgZmlsZW5hbWUgIjo6IiAiPHBhdGg+IgorCSAgICB8IHNvY2tldCAgICI6OiIgPGhvc3QtaWQ+ICI6IiA8cG9ydC1udW1iZXI+CisJKi8KKwlzdGRpbiAgPSA8dXJpPgorCXN0ZG91dCA9IDx1cmk+CisJc3RkZXJyID0gPHVyaT4KKworCS8vIC4uLgorXQorCitgYGAKKworCisjIyMjIFNlcXVlbmNlIFByb2plY3QKKyogKiptb2RlbCoqIGFzIEZvcm1hbE1MIENvbmNyZXRlIFN5bnRheCBtb2RlbAorCitgYGBzZXcKKworcHJvamVjdDogWworCS8vIENoZW1pbiByZWxhdGlmIMOgIHdvcmtzcGFjZTo6c291cmNlIChvdSBhYnNvbHUhKQorCW1vZGVsID0gIjxGb3JtYWxNTC1Db25jcmV0ZS1TeW50YXguZm1sPiIKKworCS8vIC4uLgorXQorCitgYGAKKworIyMjIyBDbGFzcyAoLyBTZXF1ZW5jZSA/KSBGQU0sIEZvcm1hbCBBbmFseXNpcyBNb2R1bGUvUGx1Z2luCisqICoqcHJpb3JpdHkqKiBhcyAqc2NoZWR1bGVyIHByaW9yaXR5KiBpbiB0aGUgd29ya2Zsb3cKKworYGBgc2V3CisKK2ZhbSArPSBGQU0gIlRyYW5zaXRpb24gQ292ZXJhZ2UgQW5hbHlzaXMgTW9kdWxlIiB7CisJcHJpb3JpdHk6IFsKKwkJLy8gLi4uCisJXQorCisJc2NoZWR1bGluZzogWworCQkvLyAuLi4KKwldCisKKwlsb2c6IFsKKwkJLy8gLi4uCisJXQorCisJZGVidWc6IFsKKwkJLy8gLi4uCisJXQorCit9CisKK2BgYAorCisKKyMjIyMjIFNlcXVlbmNlIFByaW9yaXR5CisqICoqcHJlcHJvY2VzcyoqIGFzIHByZXByb2Nlc3Npbmcgc3RhZ2UgcHJpb3JpdHkKKyogKipwcmVmaWx0ZXIqKiBhcyBwcmVmaWx0ZXJpbmcgc3RhZ2UgcHJpb3JpdHkKKyogKipwb3N0ZmlsdGVyKiogYXMgcG9zdGZpbHRlcmluZyBzdGFnZSBwcmlvcml0eQorKiAqKnBvc3Rwcm9jZXNzKiogYXMgcG9zdHByb2Nlc3Npbmcgc3RhZ2UgcHJpb3JpdHkKKworYGBgc2V3CisKK3ByaW9yaXR5OiBbCisJcHJlcHJvY2VzcyAgPSA8aW50ZWdlcj4KKwlwcmVmaWx0ZXIgICA9IDxpbnRlZ2VyPgorCXBvc3RmaWx0ZXIgID0gPGludGVnZXI+CisJcG9zdHByb2Nlc3MgPSA8aW50ZWdlcj4KKworCS8vIC4uLgorXQorCitgYGAKKworCisjIyMjIyBTZXF1ZW5jZSBTY2hlZHVsaW5nCisqICoqcHJlcHJvY2VzcyoqIGFzIHByZXByb2Nlc3Npbmcgc3RhZ2UgZW5hYmxlZCBmbGFnCisqICoqcHJlZmlsdGVyKiogYXMgcHJlZmlsdGVyaW5nIHN0YWdlIGVuYWJsZWQgZmxhZworKiAqKnBvc3RmaWx0ZXIqKiBhcyBwb3N0ZmlsdGVyaW5nIHN0YWdlIGVuYWJsZWQgZmxhZworKiAqKnBvc3Rwcm9jZXNzKiogYXMgcG9zdHByb2Nlc3Npbmcgc3RhZ2UgZW5hYmxlZCBmbGFnCisKK2BgYHNldworCitzY2hlZHVsaW5nOiBbCisJcHJlcHJvY2VzcyAgPSA8Ym9vbGVhbj4KKwlwcmVmaWx0ZXIgICA9IDxib29sZWFuPgorCXBvc3RmaWx0ZXIgID0gPGJvb2xlYW4+CisJcG9zdHByb2Nlc3MgPSA8Ym9vbGVhbj4KKworCS8vIC4uLgorXQorCitgYGAKKworCisjIyMjIyBTZXF1ZW5jZSBMb2cKKworYGBgc2V3CisKK2xvZzogWworCS8vIC4uLgorXQorCitgYGAKKworCisjIyMjIyBTZXF1ZW5jZSBEZWJ1ZworCitgYGBzZXcKKworZGVidWc6IFsKKwkvLyAuLi4KK10KKworYGBgCisKKworIyMjIyBDbGFzcyBNYWluQW5hbHlzaXNNb2R1bGUgYXMgRGlyZWN0b3Igb3IgRHJpdmVyCisqICoqcXVldWUqKiBhcyBTeW1ib2xpYyBFeGVjdXRpb24gUXVldWUKKyogKipsaW1pdCoqIGFzIFN5bWJvbGljIEV4ZWN1dGlvbiBQcm9jZXNzaW5nIExpbWl0CisqICoqaXJxKiogYXMgKmludGVycnVwdCByZXF1ZXN0KiBsaXN0ZW5lciBjb25maWd1cmF0aW9uCisqICoqZGV0ZWN0b3IqKiBhcyBsaXN0IG9mICpwYXNzaXZlIGRldGVjdG9yKiBlbmFibGVkIGZsYWcKKworYGBgc2V3CisKK21haW4gPSBNYWluQW5hbHlzaXNNb2R1bGUgPGlkPiAiPGRlc2NyaXB0aW9uPiBvZiB0aGUgTUFNIiAgeworCXF1ZXVlICI8ZGVzY3JpcHRpb24+IG9mIFN5bWJvbGljIEV4ZWN1dGlvbiBRdWV1ZSIgOiBbCisJCS8vIC4uLgorCV0KKworCWxpbWl0ICJTeW1ib2xpYyBFeGVjdXRpb24gUHJvY2Vzc2luZyBMaW1pdCIgOiBbCisJCS8vIC4uLgorCV0KKworCWlycSAiSVJRLCBJbnRlcnJ1cHQgUmVRdWVzdCBmb3IgdGhlIFdvcmtmbG93IiA6IFsKKwkJLy8gLi4uCisJXQorCisJZGV0ZWN0b3IgPGlkPiAiRW5hYmxlIHNvbWUgcGFzc2l2ZSBkZXRlY3RvcnMiIDogWworCQkvLyAuLi4KKwldCisKKwkvLyAuLi4KK30KKworYGBgCisKKyMjIyMjIENsYXNzIC8gU2VxdWVuY2UgUXVldWUKKyogKipwb2xpY3kqKiBhcyAqZW5xdWV1ZS9kZXF1ZXVlIHBvbGljeSogb2YgdGhlIHF1ZXVlCisKK2BgYHNldworLy8gRGVmYXVsdCBRdWV1ZSBTZXF1ZW5jZQorcXVldWUgIjxkZXNjcmlwdGlvbj4gb2YgdGhlIFN5bWJvbGljIEV4ZWN1dGlvbiBRdWV1ZSIgOiBbCisJLyoKKwknQkZTJyB8ICdCUkVBRFRIX0ZJUlNUX1NFQVJDSCcKKwknREZTJyB8ICdERVBUSF9GSVJTVF9TRUFSQ0gnCisJJ1JGUycgfCAnUkFORE9NX0ZJUlNUX1NFQVJDSCcKKwknV0VJR0hUOjp7IERGUyB8IEJGUyB8IFJGUyB8IFhGUyB9JworCSovCisJcG9saWN5ID0gPHBvbGljeT4KKworCS8vIC4uLgorXQorCisvLyBTcGVjaWZpYyBDbGFzcyBRdWV1ZQorcXVldWUgPSA8cXVldWVfdHlwZV9pZD4gIjxkZXNjcmlwdGlvbj4gb2YgdGhlIFN5bWJvbGljIEV4ZWN1dGlvbiBRdWV1ZSIgeworCS8qCisJJ0JGUycgfCAnQlJFQURUSF9GSVJTVF9TRUFSQ0gnCisJJ0RGUycgfCAnREVQVEhfRklSU1RfU0VBUkNIJworCSdSRlMnIHwgJ1JBTkRPTV9GSVJTVF9TRUFSQ0gnCisJJ1dFSUdIVDo6eyBERlMgfCBCRlMgfCBSRlMgfCBYRlMgfScKKwkqLworCXBvbGljeSA9IDxwb2xpY3k+CisKKwkvLyAuLi4KK30KKworCisKK2BgYAorCisjIyMjIyBTZXF1ZW5jZSBMaW1pdAorKiAqKm5vZGUqKiBhcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgKm5vZGVzKiBidWlsdCBmb3IgdGhlIHN5bWJvbGljIGV4ZWN1dGlvbiBncmFwaAorKiAqKmhlaWdodCoqIGFzIHRoZSBtYXhpbXVtICpoZWlnaHQqIG9mIHRoZSBzeW1ib2xpYyBleGVjdXRpb24gZ3JhcGgKKyogKip3aWR0aCoqIGFzIHRoZSBtYXhpbXVtICp3aWR0aCogb2YgdGhlIHN5bWJvbGljIGV4ZWN1dGlvbiBncmFwaAorKiAqKmV2YWwqKiBhcyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc3ltYm9saWMgKmV2YWx1YXRpb24qIHN0ZXBzCisqICoqc3RlcCoqIGFzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzeW1ib2xpYyBldmFsdWF0aW9uICpzdGVwcyoKKyogKipzYXZlKiogYXMgYSAqcG9pbnQgb2Ygc2VyaWFsaXphdGlvbiogYmFzZWQgb24gdGhlIG51bWJlciBvZiBldmFsdWF0aW9uIHN0ZXBzCisKK2BgYHNldworbGltaXQgIlN5bWJvbGljIEV4ZWN1dGlvbiBQcm9jZXNzaW5nIExpbWl0IiA6IFsKKwlub2RlICAgPSA8aW50ZWdlcj4KKwloZWlnaHQgPSA8aW50ZWdlcj4KKwl3aWR0aCAgPSA8aW50ZWdlcj4KKworCWV2YWwgPSA8aW50ZWdlcj4KKwlzdGVwID0gPGludGVnZXI+CisKKwlzYXZlID0gPGludGVnZXI+CisJLy8gLi4uCitdCisKK2BgYAorCisKKyMjIyMjIFNlcXVlbmNlIElSUSwgSW50ZXJydXB0IFJlUXVlc3QKKyogKipmcmVxdWVuY3kqKiBhcyBhICpmcmVxdWVuY3kgb2YgbGlzdGVuaW5nKiBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGV2YWx1YXRpb24gc3RlcHMKKworYGBgc2V3CitpcnEgIklSUSwgSW50ZXJydXB0IFJlUXVlc3QgZm9yIHRoZSBXb3JrZmxvdyIgOiBbCisJZnJlcXVlbmN5ID0gPGludGVnZXI+CisKKwlmaWxlID0gIjxzdG9wLWlmLXRoaXMtZmlsZS1wYXRoLWV4aXN0PiIKKwkvLyAuLi4KK10KKworYGBgCisKKworIyMjIyMgU2VxdWVuY2UgRGV0ZWN0b3IKKyogKipkZWFkbG9jayoqIGFzIHRoZSBtYXhpbXVtICpoZWlnaHQqIG9mIHRoZSBzeW1ib2xpYyBleGVjdXRpb24gZ3JhcGgKKyogKipsb29wI3RyaXZpYWwqKiBhcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgKm5vZGVzKiBidWlsdCBmb3IgdGhlIHN5bWJvbGljIGV4ZWN1dGlvbiBncmFwaAorCitgYGBzZXcKK2RldGVjdG9yICJFbmFibGUgc29tZSBwYXNzaXZlIGRldGVjdG9ycyIgOiBbCisJZGVhZGxvY2sgICAgICA9IDxib29sZWFuPgorCWxvb3AjdHJpdmlhbCA9IDxib29sZWFuPgorCS8vIC4uLgorXQorCitgYGAKKworCisjIyMjIENsYXNzIFNlcmlhbGl6ZXIKKworIyMjIyMgQ2xhc3MgR3JhcGhWaXpTdGF0ZW1hY2hpbmVTZXJpYWxpemVyCisKK2BgYHNldworCitzZXJpYWxpemVyICs9IEdyYXBoVml6U3RhdGVtYWNoaW5lU2VyaWFsaXplciA8aWQ+ICI8ZGVzY3JpcHRpb24+IiB7CisJLy8gLi4uCisKK3Byb3BlcnR5OiBbCisKK10KKwkKK3RyYWNlOiBbCisKK10KKwkKK2Zvcm1hdDogWworCitdCisKK3ZmczogWworICAgIGZpbGUgPSAiPHNhdmUtZmlsZS1wYXRoPiIKK10KKworYGBgCisKKyMjIyMjIENsYXNzIEdyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyCisKK2BgYHNldworCitzZXJpYWxpemVyICs9IEdyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyIDxpZD4gIjxkZXNjcmlwdGlvbj4iIHsJCisJLy8gLi4uCisKK3Byb3BlcnR5OiBbCisKK10KKwkKK3RyYWNlOiBbCisKK10KKwkKK2Zvcm1hdDogWworCitdCisKK3ZmczogWworICAgIGZpbGUgPSAiPHNhdmUtZmlsZS1wYXRoPiIKK10KKworYGBgCisKKworIyMjIyBDbGFzcyBTdGF0ZVRyYW5zaXRpb25Db3ZlcmFnZU1vZHVsZQorCitgYGBzZXcKKworZmFtICs9IFN0YXRlVHJhbnNpdGlvbkNvdmVyYWdlTW9kdWxlICJTdGF0ZS9UcmFuc2l0aW9uIENvdmVyYWdlIEFuYWx5c2lzIE1vZHVsZSIgeworCS8vIC4uLgorfQorCitgYGBzCisKKyMjIyMgQ2xhc3MgSGl0T3JKdW1wTW9kdWxlCisKK2BgYHNldworCitmYW0gKz0gSGl0T3JKdW1wTW9kdWxlIDxpZD4gIjxkZXNjcmlwdGlvbj4iIHsKKwkvLyAuLi4KK30KKworYGBgCisKKworIyMgU2ltcGxlIFdvcmtmbG93OiBCRlMgZXhwbG9yYXRpb24gOgorCitgYGBzZXcKKworV29ya2Zsb3cgZXhwbG9yYXRpb25CRlMgIlNpbXBsZSBtb2RlbCBCRlMgZXhwbG9yYXRpb24gV29ya2Zsb3ciIHsKKwl3b3Jrc3BhY2U6IFsKKwkJcm9vdCA9ICI8d29ya3NwYWNlLXJvb3QtZm9sZGVyLWZyb20tZmlsc2Utc3lzdGVtLXBhdGg+IgorCQlvdXRwdXQgPSAib3V0IgorCV0KKworCWpvYiB7CisJCXByb2plY3Q6IFsKKwkJCW1vZGVsID0gIjxGb3JtYWxNTC1Db25jcmV0ZS1TeW50YXguZm1sPiIKKwkJXQorCisJCW1haW4geworCQkJcXVldWUgIlN5bWJvbGljIEV4ZWN1dGlvbiBRdWV1ZSIgOiBbCisJCQkJcG9saWN5ID0gJ0JGUycKKwkJCV0KKworCQkJbGltaXQgIlN5bWJvbGljIEV4ZWN1dGlvbiBQcm9jZXNzaW5nIExpbWl0IiA6IFsKKwkJCQlzdGVwID0gMTAKKwkJCV0KKwkJfQorCisJCXNlcmlhbGl6ZXIgPSBHcmFwaFZpelN0YXRlbWFjaGluZVNlcmlhbGl6ZXIgeyB9CisKKwkJc2VyaWFsaXplciA9IEdyYXBoVml6RXhlY3V0aW9uR3JhcGhTZXJpYWxpemVyIHsgfQorCX0KK30KKworYGBgCisKKworCisKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc2V3L1N5bWJleENvbnRyb2xsZXIuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc2V3L1N5bWJleENvbnRyb2xsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNjE0NzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9zZXcvU3ltYmV4Q29udHJvbGxlci5jcHAKQEAgLTAsMCArMSwyNjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlN5bWJleENvbnRyb2xsZXIuaCIKKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkNvbnRleHQuaD4KKworI2luY2x1ZGUgPGZhbS9xdWV1ZS9FeGVjdXRpb25RdWV1ZS5oPgorCisjaW5jbHVkZSA8bWFpbi9TaWduYWxIYW5kbGVyLmg+CisKKyNpbmNsdWRlIDxzZXcvU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8c2V3L1N5bWJleERpc3BhdGNoZXIuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKy8qKgorICogQ09OU1RSVUNUT1IKKyAqIERlZmF1bHQKKyAqLworU3ltYmV4Q29udHJvbGxlcjo6U3ltYmV4Q29udHJvbGxlcigKKwkJU3ltYmV4RGlzcGF0Y2hlciAmIGFTeW1iZXhEaXNwYXRjaGVyLCBXT2JqZWN0ICogd2ZQYXJhbWV0ZXJPYmplY3QsCisJU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyICYgYUNvbnRyb2xsZXJVbml0TWFuYWdlcikKKzogU3ltYmV4Sm9iKGFTeW1iZXhEaXNwYXRjaGVyLCB3ZlBhcmFtZXRlck9iamVjdCwgYUNvbnRyb2xsZXJVbml0TWFuYWdlciksCittU3ltYmV4UmVxdWVzdE1hbmFnZXIoIGFTeW1iZXhEaXNwYXRjaGVyLmdldFN5bWJleENvbnRyb2xsZXJSZXF1ZXN0TWFuYWdlcigpICkKK3sKKwkvLyEhIE5PVEhJTkcKK30KKworLyoqCisgKiBUaHJlYWQgbWFpbiBSdW4gTWV0aG9kCisgKi8KK3ZvaWQgU3ltYmV4Q29udHJvbGxlcjo6b3BlcmF0b3IoKSgpCit7CisJQVZNX09TX1RSQUNFIDw8ICJCZWdpbiBTeW1iZXhDb250cm9sbGVyIFRocmVhZCIgPDwgc3RkOjplbmRsOworCisJd2hpbGUoIGlzTGlmZWN5Y2xlUnVubmFibGUoKSApCisJeworCQlhbmFseXNlUmVhZHkoKTsKKworCQlhbmFseXNlUmVzdWx0KCk7CisJfQorCisJQVZNX09TX1RSQUNFIDw8ICJFbmQgU3ltYmV4Q29udHJvbGxlciBUaHJlYWQiIDw8IHN0ZDo6ZW5kbDsKK30KKworCit2b2lkIFN5bWJleENvbnRyb2xsZXI6OmFuYWx5c2VSZWFkeSgpCit7CisJUnVubmFibGVFbGVtZW50OjpzZXRMaWZlY3ljbGVSdW5uaW5nKCk7CisKKwlpZiggbVN5bWJleERpc3BhdGNoZXIuaGFzV29yaygpICkKKwl7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHMiggTUVESVVNICwgUkVQT1JUSU5HICwgQ09NUFVUSU5HICkKKworQVZNX0lGX0RFQlVHX0xFVkVMX0dURV9ISUdICisKKwltQ29udHJvbGxlclVuaXRNYW5hZ2VyLmdldEV4ZWN1dGlvblF1ZXVlKCkudG9TdHJlYW0oQVZNX09TX1RSQUNFKTsKKworQVZNX0VMU0VJRl9ERUJVR19MRVZFTF9HVEVfTUVESVVNCisKKwltQ29udHJvbGxlclVuaXRNYW5hZ2VyLmdldEV4ZWN1dGlvblF1ZXVlKCkudG9TdHJlYW1XYWl0aW5nKEFWTV9PU19UUkFDRSk7CisKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9HVEVfTUVESVVNCisKKwlBVk1fT1NfVFJBQ0UgPDwgc3RkOjplbmRsOworCitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIE1FRElVTSAsIFJFUE9SVElORyAsIENPTVBVVElORyApCisKKworCQl3aGlsZSggdHJ1ZSApCisJCXsKKworI2lmZGVmIF9fQVZNX1VOSVhfXworCisJCQlpZiggU2lnbmFsSGFuZGxlcjo6aXNTSUdJTlQoKSApCisJCQl7CisJCQkJbVN5bWJleFJlcXVlc3RNYW5hZ2VyLmZpcmVSZXF1ZXN0U3RvcCgpOworCisJCQkJdGhpcy0+aGFuZGxlUmVxdWVzdFN0b3AoKTsKKwkJCX0KKworI2VuZGlmIC8qIF9fQVZNX1VOSVhfXyAqLworCisJCQkvKioKKwkJCSAqIFBST0NFU1NPUiBSRVFVRVNUIEFQSSA6PiBiZWZvcmUgPDwgcHJlZmlsdGVyaW5nID4+IHN0ZXAKKwkJCSAqIFNUT1AgfCBSRUxFQVNFIHwgUkVTRVQgfCBSRVFVRVVFX1dBSVRJTkcKKwkJCSAqLworCQkJaWYoIG1TeW1iZXhSZXF1ZXN0TWFuYWdlci5oYXNSZXF1ZXN0U3RvcCgpICkKKwkJCXsKKworQVZNX0lGX0RFQlVHX0xFVkVMX09SX0ZMQUcoIE1FRElVTSAsIENPTVBVVElORyApCisJT1NTIG9zcyggQVZNX05PX0lOREVOVCApOworCW1TeW1iZXhSZXF1ZXN0TWFuYWdlci5zdHJTdG9wUmVxdWVzdG9yKG9zcywgIiIpOworCisJQVZNX09TX0lORk8gPDwgc3RkOjplbmRsIDw8IEVNUEhBU0lTKAorCQkJIlNUT1AgUkVRVUlSRUQgQlkgRklMVEVSSU5HIFBST0NFU1NPUiAhISEiLCBvc3Muc3RyKCksICcqJywgODApOworQVZNX0VORElGX0RFQlVHX0xFVkVMX09SX0ZMQUcoIE1FRElVTSAsIENPTVBVVElORyApCisKKworCQkJCW1TeW1iZXhSZXF1ZXN0TWFuYWdlci5maXJlUmVxdWVzdFN0b3AoKTsKKworCQkJCXRoaXMtPmhhbmRsZVJlcXVlc3RTdG9wKCk7CisKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYoIG1TeW1iZXhSZXF1ZXN0TWFuYWdlci5oYXNSZXF1ZXN0UmVsZWFzZSgpICkKKwkJCXsKKwkJCQltU3ltYmV4UmVxdWVzdE1hbmFnZXIuZmlyZVJlcXVlc3RSZWxlYXNlKCk7CisKKwkJCQl0aGlzLT5oYW5kbGVSZXF1ZXN0UmVsZWFzZSgpOworCQkJfQorCisJCQlpZiggbVN5bWJleFJlcXVlc3RNYW5hZ2VyLmhhc1JlcXVlc3RSZXNldCgpICkKKwkJCXsKKwkJCQltU3ltYmV4UmVxdWVzdE1hbmFnZXIuZmlyZVJlcXVlc3RSZXNldCgpOworCisJCQkJdGhpcy0+aGFuZGxlUmVxdWVzdFJlc2V0KCk7CisJCQl9CisKKwkJCWlmKCBtU3ltYmV4UmVxdWVzdE1hbmFnZXIuaGFzUmVxdWVzdFJlcXVldWVXYWl0aW5nKCkgKQorCQkJeworCQkJCW1TeW1iZXhSZXF1ZXN0TWFuYWdlci5maXJlUmVxdWVzdFJlcXVldWVXYWl0aW5nKCk7CisJCQl9CisKKworCQkJLyoqCisJCQkgKiBQUkVGSUxURVJJTkcgc3RlcAorCQkJICovCisJCQkvLyBTaSB0b3V0IHNlIHBhc3NlIGJpZW4gb24gcGFzc2VyYSDDoCBsYSBwaGFzZSBkJ2V4w6ljdXRpb24gc3ltYm9saXF1ZQorCQkJaWYoIG1Db250cm9sbGVyVW5pdE1hbmFnZXIucHJlZmlsdGVyKCkgKQorCQkJeworCQkJCWlmKCBtQ29udHJvbGxlclVuaXRNYW5hZ2VyLmZpbmFsaXplUHJlZmlsdGVyaW5nKCkgKQorCQkJCXsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisKKwkJCS8qKgorCQkJICogUFJPQ0VTU09SIFJFUVVFU1QgQVBJIDo+IGNoZWNrIGlmIGhhcyBnb2FsIGFjaGlldmVkCisJCQkgKiBHT0FMX0FDSElFVkVECisJCQkgKi8KKwkJCWlmKCBtU3ltYmV4UmVxdWVzdE1hbmFnZXIuaGFzUmVxdWVzdEdvYWxBY2hpZXZlZCgpICkKKwkJCXsKKwkJCQltU3ltYmV4UmVxdWVzdE1hbmFnZXIuZmlyZVJlcXVlc3RHb2FsQWNoaWV2ZWQoKTsKKworCQkJCXRoaXMtPmhhbmRsZVJlcXVlc3RHb2FsQWNoaWV2ZWQoKTsKKwkJCX0KKworCQkJLy8gU2lub24gb24gcmVwYXNzZSBwYXIgbGEgZmlsZSBkJ2F0dGVudGUgcG91ciByw6ljdXDDqXJlciBkZSBub3V2ZWF1eAorCQkJLy8gRXhlY3V0aW9uIENvbnRleHRlcyBhdHRlbmRhbnQgcG91ciBwYXNzZXIgbCdhdWRpdGlvbiBkZXMgcHLDqS1maWx0cmVzCisJCQlpZiggbUNvbnRyb2xsZXJVbml0TWFuYWdlci5nZXRFeGVjdXRpb25RdWV1ZSgpLmhhc1dhaXRpbmcoKSApCisJCQl7CisJCQkJbUNvbnRyb2xsZXJVbml0TWFuYWdlci5nZXRFeGVjdXRpb25RdWV1ZSgpLnBvcFdhaXRpbmcyUmVhZHkoKTsKKwkJCX0KKworCQkJLyoqCisJCQkgKiBQUk9DRVNTT1IgUkVRVUVTVCBBUEkgOj4gdG8gY29udGludWUgaWYgZW1wdHkgd2FpdGluZyBxdWV1ZQorCQkJICogQ09OVElOVUUgfCBSRVFVRVVFX1JFU0VSVkUgfCBSRVNUQVJUCisJCQkgKi8KKwkJCS8vIFNpIGF1Y3VuIGNhbmRpZGF0IG4nZXN0IGRpc3BvbmlibGUsIGFsb3JzIG9uIHBhc3NlIGxhIG1haW4KKwkJCS8vIGF1eCBmaWx0cmVzIHMnw6l0YW50IGluc2NyaXRzIHBvdXIgbGV1ciBoZXVyaXN0aXF1ZSBkZQorCQkJLy8gZW4gcGhhc2UgZGUgPDwgZmluYWxpemUgcHJlZmlsdGVyaW5nID4+ICEhIQorCQkJZWxzZSBpZiggbVN5bWJleFJlcXVlc3RNYW5hZ2VyLmhhc1JlcXVlc3RzVG9Db250aW51ZSgpICkKKwkJCXsKKwkJCQlpZiggbVN5bWJleFJlcXVlc3RNYW5hZ2VyLmhhc1JlcXVlc3RDb250aW51ZSgpICkKKwkJCQl7CisJCQkJCW1TeW1iZXhSZXF1ZXN0TWFuYWdlci5maXJlUmVxdWVzdENvbnRpbnVlKCk7CisJCQkJfQorCisJCQkJaWYoIG1TeW1iZXhSZXF1ZXN0TWFuYWdlci5oYXNSZXF1ZXN0UmVxdWV1ZVJlc2VydmUoKSApCisJCQkJeworCQkJCQltU3ltYmV4UmVxdWVzdE1hbmFnZXIuZmlyZVJlcXVlc3RSZXF1ZXVlUmVzZXJ2ZSgpOworCQkJCX0KKworCQkJCWlmKCBtU3ltYmV4UmVxdWVzdE1hbmFnZXIuaGFzUmVxdWVzdFJlc3RhcnQoKSApCisJCQkJeworCQkJCQltU3ltYmV4UmVxdWVzdE1hbmFnZXIuZmlyZVJlcXVlc3RSZXN0YXJ0KCk7CisJCQkJfQorCQkJfQorCisJCQkvLyBBdXRyZW1lbnQsIGlsIG4neSBhIHJpZW4gw6AgZmFpcmUgISEhCisJCQllbHNlCisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvLyBUb3VzIGNldXggcXVpIG9udCBwYXNzw6kgbCdhdWRpdGlvbiBkZXMgcHLDqS1maWx0cmVzIGF2ZWMgc3VjY8OocyBzb250CisJCS8vIG1pcyBlbiBjYWNoZSBwb3VyIGwnZXjDqWN1dGlvbiBzeW1ib2xpcXVlCisJCWlmKCBtU3ltYmV4RGlzcGF0Y2hlci5oYXNSZWFkeVdvcmsoKSApCisJCXsKKwkJCW1TeW1iZXhEaXNwYXRjaGVyLmdldEV4ZWN1dGlvbldvcmtpbmdRdWV1ZSgpLnNwbGljZSgKKwkJCQltQ29udHJvbGxlclVuaXRNYW5hZ2VyLmdldEV4ZWN1dGlvblF1ZXVlKCkuZ2V0UmVhZHlRdWV1ZSgpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXRoaXMtPmhhbmRsZVJlcXVlc3ROb1dvcmsoKTsKKwkJfQorCX0KKwllbHNlCisJeworCQloYW5kbGVSZXF1ZXN0Tm9Xb3JrKCk7CisJfQorfQorCisKK3ZvaWQgU3ltYmV4Q29udHJvbGxlcjo6YW5hbHlzZVJlc3VsdCgpCit7CisJUnVubmFibGVFbGVtZW50OjpzZXRMaWZlY3ljbGVSdW5uaW5nKCk7CisKKwlpZiggdGhpcy0+aGFzU3ltYmV4Q29udGV4dCgpICkKKwl7CisJCW1Db250cm9sbGVyVW5pdE1hbmFnZXIuZ2V0RXhlY3V0aW9uUXVldWUoKS4KKwkJCQlzcGxpY2VSZXN1bHQoIHRoaXMtPmdldFN5bWJleENvbnRleHRzKCkgKTsKKworCQlpZiggbUNvbnRyb2xsZXJVbml0TWFuYWdlci5wb3N0ZmlsdGVyKCkgKQorCQl7CisJCQltQ29udHJvbGxlclVuaXRNYW5hZ2VyLmZpbmFsaXplUG9zdGZpbHRlcmluZygpOworCQl9CisKKwkJLyoqCisJCSAqIFBST0NFU1NPUiBSRVFVRVNUIEFQSSA6PiBjaGVjayBpZiBoYXMgZ29hbCBhY2hpZXZlZAorCQkgKiBHT0FMX0FDSElFVkVECisJCSAqLworCQlpZiggbVN5bWJleFJlcXVlc3RNYW5hZ2VyLmhhc1JlcXVlc3RHb2FsQWNoaWV2ZWQoKSApCisJCXsKKwkJCW1TeW1iZXhSZXF1ZXN0TWFuYWdlci5maXJlUmVxdWVzdEdvYWxBY2hpZXZlZCgpOworCQl9CisJfQorCWVsc2UKKwl7CisvLwkJUnVubmFibGVFbGVtZW50OjpzZXRMaWZlY3ljbGVJZGxlKCk7CisJCVJ1bm5hYmxlRWxlbWVudDo6c2V0TGlmZWN5Y2xlU3VzcGVuZGVkKCk7CisJfQorfQorCisKKy8qKgorICogcmVwb3J0IEV2YWwKKyAqLwordm9pZCBTeW1iZXhDb250cm9sbGVyOjpyZXBvcnRFdmFsKCkgY29uc3QKK3sKKwltQ29udHJvbGxlclVuaXRNYW5hZ2VyLnJlcG9ydEV2YWwoQVZNX09TX1RSQUNFKTsKKworCW1Db250cm9sbGVyVW5pdE1hbmFnZXIucmVwb3J0RXZhbChBVk1fT1NfQ09VVCk7Cit9CisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc2V3L1N5bWJleENvbnRyb2xsZXIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3Nldy9TeW1iZXhDb250cm9sbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUwZjE5ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3Nldy9TeW1iZXhDb250cm9sbGVyLmgKQEAgLTAsMCArMSw3OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBTRVdfU1lNQkVYX0NPTlRST0xMRVJfSF8KKyNkZWZpbmUgU0VXX1NZTUJFWF9DT05UUk9MTEVSX0hfCisKKyNpbmNsdWRlIDxzZXcvU3ltYmV4Sm9iLmg+CisKKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25Db250ZXh0Lmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBFeGVjdXRpb25Db250ZXh0OworY2xhc3MgU3ltYmV4Q29udHJvbGxlclJlcXVlc3RNYW5hZ2VyOworY2xhc3MgU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyOworY2xhc3MgU3ltYmV4RGlzcGF0Y2hlcjsKKworY2xhc3MgU3ltYmV4Q29udHJvbGxlciA6IHB1YmxpYyBTeW1iZXhKb2IKK3sKKworCUFWTV9ERUNMQVJFX1VOQ0xPTkFCTEVfQ0xBU1MoU3ltYmV4Q29udHJvbGxlcikKKworCisJLyoqCisJICogQVRUUklCVVRFUworCSAqLworCVN5bWJleENvbnRyb2xsZXJSZXF1ZXN0TWFuYWdlciAmIG1TeW1iZXhSZXF1ZXN0TWFuYWdlcjsKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCVN5bWJleENvbnRyb2xsZXIoU3ltYmV4RGlzcGF0Y2hlciAmIGFTeW1iZXhEaXNwYXRjaGVyLAorCQkJV09iamVjdCAqIHdmUGFyYW1ldGVyT2JqZWN0LAorCQkJU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyICYgYUNvbnRyb2xsZXJVbml0TWFuYWdlcik7CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5TeW1iZXhDb250cm9sbGVyKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogVGhyZWFkIG1haW4gUnVuIE1ldGhvZAorCSAqLworCXZpcnR1YWwgdm9pZCBvcGVyYXRvcigpKCk7CisKKworCXZvaWQgYW5hbHlzZVJlYWR5KCk7CisKKwl2b2lkIGFuYWx5c2VSZXN1bHQoKTsKKworCS8qKgorCSAqIHJlcG9ydCBFdmFsCisJICovCisJdm9pZCByZXBvcnRFdmFsKCkgY29uc3Q7CisKK307CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKlNFV19TWU1CRVhfQ09OVFJPTExFUl9IXyovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9zZXcvU3ltYmV4Q29udHJvbGxlclJlcXVlc3RNYW5hZ2VyLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3Nldy9TeW1iZXhDb250cm9sbGVyUmVxdWVzdE1hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YjUyMDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9zZXcvU3ltYmV4Q29udHJvbGxlclJlcXVlc3RNYW5hZ2VyLmNwcApAQCAtMCwwICsxLDQ4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMyBtYXJzIDIwMTUKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlN5bWJleENvbnRyb2xsZXJSZXF1ZXN0TWFuYWdlci5oIgorCisKK25hbWVzcGFjZSBzZXAKK3sKKwordm9pZCBTeW1iZXhDb250cm9sbGVyUmVxdWVzdE1hbmFnZXI6Om9zUmVxdWVzdG9yKAorCQlPdXRTdHJlYW0gJiBvcywgY29uc3Qgc3RkOjpzdHJpbmcgJiBsYWJlbCwKKwkJY29uc3QgTGlzdE9mUHJvY2Vzc29yVW5pdCAmIGxpc3RvZlJlcXVlc3RvcikKK3sKKwlvcyA8PCBUQUIgPDwgbGFiZWw7CisKKwlpZiggbGlzdG9mUmVxdWVzdG9yLnNpbmdsZXRvbigpICkKKwl7CisJCW9zIDw8IGxpc3RvZlJlcXVlc3Rvci5maXJzdCgpLT5zdHJVbmlxSWQoKTsKKwl9CisJZWxzZSBpZiggbGlzdG9mUmVxdWVzdG9yLnBvcHVsYXRlZCgpICkKKwl7CisJCUxpc3RPZlByb2Nlc3NvclVuaXQ6OmNvbnN0X2l0ZXJhdG9yIGl0UmVxdWVzdG9yID0gbGlzdG9mUmVxdWVzdG9yLmJlZ2luKCk7CisJCUxpc3RPZlByb2Nlc3NvclVuaXQ6OmNvbnN0X2l0ZXJhdG9yIGVuZFJlcXVlc3RvciA9IGxpc3RvZlJlcXVlc3Rvci5lbmQoKTsKKworCQlvcyA8PCAoKml0UmVxdWVzdG9yKS0+c3RyVW5pcUlkKCk7CisJCWZvciggKytpdFJlcXVlc3RvciA7IGl0UmVxdWVzdG9yICE9IGVuZFJlcXVlc3RvciA7ICsraXRSZXF1ZXN0b3IgKQorCQl7CisJCQlvcyA8PCAiIDs7ICIgPDwgKCppdFJlcXVlc3RvciktPnN0clVuaXFJZCgpOworCQl9CisJfQorCisJb3MgPDwgRU9MX0ZMVVNIOworfQorCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc2V3L1N5bWJleENvbnRyb2xsZXJSZXF1ZXN0TWFuYWdlci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc2V3L1N5bWJleENvbnRyb2xsZXJSZXF1ZXN0TWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5OTIxZjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9zZXcvU3ltYmV4Q29udHJvbGxlclJlcXVlc3RNYW5hZ2VyLmgKQEAgLTAsMCArMSw0ODcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAzIG1hcnMgMjAxNQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFNFV19TWU1CRVhfQ09OVFJPTExFUl9SRVFVRVNUX01BTkFHRVJfSF8KKyNkZWZpbmUgU0VXX1NZTUJFWF9DT05UUk9MTEVSX1JFUVVFU1RfTUFOQUdFUl9IXworCisjaW5jbHVkZSAiU3ltYmV4Sm9iLmgiCisjaW5jbHVkZSAiU3ltYmV4Q29udHJvbGxlclJlcXVlc3RTdGF0dXMuaCIKKworI2luY2x1ZGUgPHV0aWwvYXZtX251bWVyaWMuaD4KKyNpbmNsdWRlIDxjb2xsZWN0aW9uL0xpc3QuaD4KKworI2luY2x1ZGUgPGZhbS9hcGkvQWJzdHJhY3RQcm9jZXNzb3JVbml0Lmg+CisKKyNpbmNsdWRlIDxzZXcvU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBPdXRTdHJlYW07CisKKworY2xhc3MgU3ltYmV4Q29udHJvbGxlclJlcXVlc3RNYW5hZ2VyICA6CisJCXB1YmxpYyBTeW1iZXhKb2IsCisJCXB1YmxpYyBTeW1iZXhDb250cm9sbGVyUmVxdWVzdFN0YXR1cworeworCisJQVZNX0RFQ0xBUkVfVU5DTE9OQUJMRV9DTEFTUyhTeW1iZXhDb250cm9sbGVyUmVxdWVzdE1hbmFnZXIpCisKK3B1YmxpYzoKKwkvKioKKwkgKiBUWVBFREVGCisJICovCisJdHlwZWRlZiBMaXN0PCBBYnN0cmFjdFByb2Nlc3NvclVuaXQgKiA+ICBMaXN0T2ZQcm9jZXNzb3JVbml0OworCisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBBVFRSSUJVVEUKKwkgKi8KKwlMaXN0T2ZQcm9jZXNzb3JVbml0IG1SZXF1ZXN0U3RvcExpc3RlbmVyOworCUxpc3RPZlByb2Nlc3NvclVuaXQgbVJlcXVlc3RSZWxlYXNlTGlzdGVuZXI7CisKKwlMaXN0T2ZQcm9jZXNzb3JVbml0IG1SZXF1ZXN0UmVzZXRMaXN0ZW5lcjsKKworCUxpc3RPZlByb2Nlc3NvclVuaXQgbVJlcXVlc3RSZXN0YXJ0TGlzdGVuZXI7CisJTGlzdE9mUHJvY2Vzc29yVW5pdCBtUmVxdWVzdENvbnRpbnVlTGlzdGVuZXI7CisKKwlMaXN0T2ZQcm9jZXNzb3JVbml0IG1SZXF1ZXN0UmVxdWV1ZVdhaXRpbmdMaXN0ZW5lcjsKKwlMaXN0T2ZQcm9jZXNzb3JVbml0IG1SZXF1ZXN0UmVxdWV1ZVJlc2VydmVMaXN0ZW5lcjsKKworCUxpc3RPZlByb2Nlc3NvclVuaXQgbVJlcXVlc3RIZXVyaXN0aWNMaXN0ZW5lcjsKKworCUxpc3RPZlByb2Nlc3NvclVuaXQgbVJlcXVlc3RHb2FsQWNoaWV2ZWRMaXN0ZW5lcjsKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBDb21wdXRpbmcgVmFyaWFibGVzCisJTGlzdE9mUHJvY2Vzc29yVW5pdCBtRmlyZVJlcXVlc3RMaXN0ZW5lcjsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJU3ltYmV4Q29udHJvbGxlclJlcXVlc3RNYW5hZ2VyKFN5bWJleERpc3BhdGNoZXIgJiBhU3ltYmV4RGlzcGF0Y2hlciwKKwkJCVdPYmplY3QgKiB3ZlBhcmFtZXRlck9iamVjdCwKKwkJCVN5bWJleENvbnRyb2xsZXJVbml0TWFuYWdlciAmIGFDZW50cmFsQ29udHJvbGxlclVuaXQpCisJOiBTeW1iZXhKb2IoYVN5bWJleERpc3BhdGNoZXIsIHdmUGFyYW1ldGVyT2JqZWN0LCBhQ2VudHJhbENvbnRyb2xsZXJVbml0KSwKKwlTeW1iZXhDb250cm9sbGVyUmVxdWVzdFN0YXR1cyggUkVRVUVTVF9VTkRFRklORURfU1RBVFVTICksCisKKwltUmVxdWVzdFN0b3BMaXN0ZW5lciggKSwKKwltUmVxdWVzdFJlbGVhc2VMaXN0ZW5lciggKSwKKworCW1SZXF1ZXN0UmVzZXRMaXN0ZW5lciggKSwKKworCW1SZXF1ZXN0UmVzdGFydExpc3RlbmVyKCApLAorCW1SZXF1ZXN0Q29udGludWVMaXN0ZW5lciggKSwKKworCW1SZXF1ZXN0UmVxdWV1ZVdhaXRpbmdMaXN0ZW5lciggKSwKKwltUmVxdWVzdFJlcXVldWVSZXNlcnZlTGlzdGVuZXIoICksCisKKwltUmVxdWVzdEhldXJpc3RpY0xpc3RlbmVyKCApLAorCisJbVJlcXVlc3RHb2FsQWNoaWV2ZWRMaXN0ZW5lciggKSwKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBDb21wdXRpbmcgVmFyaWFibGVzCisJbUZpcmVSZXF1ZXN0TGlzdGVuZXIoICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5TeW1iZXhDb250cm9sbGVyUmVxdWVzdE1hbmFnZXIoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogVGhyZWFkIG1haW4gUnVuIE1ldGhvZAorCSAqLworCXZpcnR1YWwgdm9pZCBvcGVyYXRvcigpKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFBST0NFU1NPUiBSRVFVRVNUIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXZvaWQgb3NSZXF1ZXN0b3IoT3V0U3RyZWFtICYgb3MsIGNvbnN0IHN0ZDo6c3RyaW5nICYgbGFiZWwsCisJCQljb25zdCBMaXN0T2ZQcm9jZXNzb3JVbml0ICYgbGlzdG9mUmVxdWVzdG9yKTsKKworCisJLyoqCisJICogUkVRVUVTVF9TVE9QX1NUQVRVUworCSAqIG1SZXF1ZXN0U3RvcExpc3RlbmVyCisJICovCisJaW5saW5lIHZvaWQgZmlyZVJlcXVlc3RTdG9wKCkKKwl7CisJCWZpcmVSZXF1ZXN0U3RvcEluaXRpYWxpemUoKTsKKworCQl3aGlsZSggbUZpcmVSZXF1ZXN0TGlzdGVuZXIubm9uZW1wdHkoKSApCisJCXsKKwkJCW1GaXJlUmVxdWVzdExpc3RlbmVyLnBvcF9maXJzdCgpLT5oYW5kbGVSZXF1ZXN0U3RvcCgpOworCQl9CisKKwkJbUNvbnRyb2xsZXJVbml0TWFuYWdlci5oYW5kbGVSZXF1ZXN0U3RvcCgpOworCX0KKworCWlubGluZSB2b2lkIGZpcmVSZXF1ZXN0U3RvcEluaXRpYWxpemUoKQorCXsKKwkJZGlzYWJsZVJlcXVlc3QoIFJFUVVFU1RfU1RPUF9TVEFUVVMgKTsKKworCQltRmlyZVJlcXVlc3RMaXN0ZW5lci5jbGVhcigpOworCQltRmlyZVJlcXVlc3RMaXN0ZW5lci5zcGxpY2UoIG1SZXF1ZXN0U3RvcExpc3RlbmVyICk7CisJfQorCisKKwlpbmxpbmUgdm9pZCBwb3N0UmVxdWVzdFN0b3AoQWJzdHJhY3RQcm9jZXNzb3JVbml0ICogYVJlcXVlc3RvcikKKwl7CisJCWVuYWJsZVJlcXVlc3QoIFJFUVVFU1RfU1RPUF9TVEFUVVMgKTsKKworCQltUmVxdWVzdFN0b3BMaXN0ZW5lci5hZGRfdW5pb24oIGFSZXF1ZXN0b3IgKTsKKwl9CisKKworCWlubGluZSB2b2lkIHN0clN0b3BSZXF1ZXN0b3IoT3V0U3RyZWFtICYgb3MsIGNvbnN0IHN0ZDo6c3RyaW5nICYgbGFiZWwpCisJeworCQlvc1JlcXVlc3RvcihvcywgbGFiZWwsIG1SZXF1ZXN0U3RvcExpc3RlbmVyKTsKKwl9CisKKworCS8qKgorCSAqIFJFUVVFU1RfUkVMRUFTRV9TVEFUVVMKKwkgKiBtUmVxdWVzdFJlbGVhc2VMaXN0ZW5lcgorCSAqLworCWlubGluZSB2b2lkIGZpcmVSZXF1ZXN0UmVsZWFzZSgpCisJeworCQlmaXJlUmVxdWVzdFJlbGVhc2VJbml0aWFsaXplKCk7CisKKwkJQWJzdHJhY3RQcm9jZXNzb3JVbml0ICogYVByb2Nlc3NvcjsKKwkJd2hpbGUoIG1GaXJlUmVxdWVzdExpc3RlbmVyLm5vbmVtcHR5KCkgKQorCQl7CisJCQltRmlyZVJlcXVlc3RMaXN0ZW5lci5wb3BfZmlyc3RfdG8oIGFQcm9jZXNzb3IgKTsKKworCQkJbUNvbnRyb2xsZXJVbml0TWFuYWdlci5oYW5kbGVSZXF1ZXN0UmVsZWFzZShhUHJvY2Vzc29yKTsKKwkJfQorCisJCW1Db250cm9sbGVyVW5pdE1hbmFnZXIuaGFuZGxlUmVxdWVzdFJlbGVhc2UoKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBmaXJlUmVxdWVzdFJlbGVhc2VJbml0aWFsaXplKCkKKwl7CisJCWRpc2FibGVSZXF1ZXN0KCBSRVFVRVNUX1JFTEVBU0VfU1RBVFVTICk7CisKKwkJbUZpcmVSZXF1ZXN0TGlzdGVuZXIuY2xlYXIoKTsKKwkJbUZpcmVSZXF1ZXN0TGlzdGVuZXIuc3BsaWNlKCBtUmVxdWVzdFJlbGVhc2VMaXN0ZW5lciApOworCX0KKworCisJaW5saW5lIHZvaWQgcG9zdFJlcXVlc3RSZWxlYXNlKEFic3RyYWN0UHJvY2Vzc29yVW5pdCAqIGFSZXF1ZXN0b3IpCisJeworCQllbmFibGVSZXF1ZXN0KCBSRVFVRVNUX1JFTEVBU0VfU1RBVFVTICk7CisKKwkJbVJlcXVlc3RSZWxlYXNlTGlzdGVuZXIuYWRkX3VuaW9uKCBhUmVxdWVzdG9yICk7CisJfQorCisKKwlpbmxpbmUgdm9pZCBzdHJSZWxlYXNlUmVxdWVzdG9yKE91dFN0cmVhbSAmIG9zLCBjb25zdCBzdGQ6OnN0cmluZyAmIGxhYmVsKQorCXsKKwkJb3NSZXF1ZXN0b3Iob3MsIGxhYmVsLCBtUmVxdWVzdFJlbGVhc2VMaXN0ZW5lcik7CisJfQorCisKKwkvKioKKwkgKiBSRVFVRVNUX1JFU0VUX1NUQVRVUworCSAqIG1SZXF1ZXN0UmVzZXRMaXN0ZW5lcgorCSAqLworCWlubGluZSB2b2lkIGZpcmVSZXF1ZXN0UmVzZXQoKQorCXsKKwkJZmlyZVJlcXVlc3RSZXNldEluaXRpYWxpemUoKTsKKworCQl3aGlsZSggbUZpcmVSZXF1ZXN0TGlzdGVuZXIubm9uZW1wdHkoKSApCisJCXsKKwkJCW1GaXJlUmVxdWVzdExpc3RlbmVyLnBvcF9maXJzdCgpLT5oYW5kbGVSZXF1ZXN0UmVzZXQoKTsKKwkJfQorCisJCW1Db250cm9sbGVyVW5pdE1hbmFnZXIuaGFuZGxlUmVxdWVzdFJlc2V0KCk7CisJfQorCisJaW5saW5lIHZvaWQgZmlyZVJlcXVlc3RSZXNldEluaXRpYWxpemUoKQorCXsKKwkJZGlzYWJsZVJlcXVlc3QoIFJFUVVFU1RfUkVTRVRfU1RBVFVTICk7CisKKwkJbUZpcmVSZXF1ZXN0TGlzdGVuZXIuY2xlYXIoKTsKKwkJbUZpcmVSZXF1ZXN0TGlzdGVuZXIuc3BsaWNlKCBtUmVxdWVzdFJlc2V0TGlzdGVuZXIgKTsKKwl9CisKKworCWlubGluZSB2b2lkIHBvc3RSZXF1ZXN0UmVzZXQoQWJzdHJhY3RQcm9jZXNzb3JVbml0ICogYVJlcXVlc3RvcikKKwl7CisJCWVuYWJsZVJlcXVlc3QoIFJFUVVFU1RfUkVTRVRfU1RBVFVTICk7CisKKwkJbVJlcXVlc3RSZXNldExpc3RlbmVyLmFkZF91bmlvbiggYVJlcXVlc3RvciApOworCX0KKworCisJaW5saW5lIHZvaWQgc3RyUmVwb3N0UmVxdWVzdG9yKE91dFN0cmVhbSAmIG9zLCBjb25zdCBzdGQ6OnN0cmluZyAmIGxhYmVsKQorCXsKKwkJb3NSZXF1ZXN0b3Iob3MsIGxhYmVsLCBtUmVxdWVzdFJlc2V0TGlzdGVuZXIpOworCX0KKworCisJLyoqCisJICogUkVRVUVTVF9SRVNUQVJUX1NUQVRVUworCSAqIG1SZXF1ZXN0UmVzdGFydExpc3RlbmVyCisJICovCisJaW5saW5lIHZvaWQgZmlyZVJlcXVlc3RSZXN0YXJ0KCkKKwl7CisJCWZpcmVSZXF1ZXN0UmVzdGFydEluaXRpYWxpemUoKTsKKworCQl3aGlsZSggbUZpcmVSZXF1ZXN0TGlzdGVuZXIubm9uZW1wdHkoKSApCisJCXsKKwkJCW1GaXJlUmVxdWVzdExpc3RlbmVyLnBvcF9maXJzdCgpLT5oYW5kbGVSZXF1ZXN0UmVzdGFydCgpOworCQl9CisKKwkJbUNvbnRyb2xsZXJVbml0TWFuYWdlci5oYW5kbGVSZXF1ZXN0UmVzdGFydCgpOworCX0KKworCWlubGluZSB2b2lkIGZpcmVSZXF1ZXN0UmVzdGFydEluaXRpYWxpemUoKQorCXsKKwkJZGlzYWJsZVJlcXVlc3QoIFJFUVVFU1RfUkVTVEFSVF9TVEFUVVMgKTsKKworCQltRmlyZVJlcXVlc3RMaXN0ZW5lci5jbGVhcigpOworCQltRmlyZVJlcXVlc3RMaXN0ZW5lci5zcGxpY2UoIG1SZXF1ZXN0UmVzdGFydExpc3RlbmVyICk7CisJfQorCisKKwlpbmxpbmUgdm9pZCBwb3N0UmVxdWVzdFJlc3RhcnQoQWJzdHJhY3RQcm9jZXNzb3JVbml0ICogYVJlcXVlc3RvcikKKwl7CisJCWVuYWJsZVJlcXVlc3QoIFJFUVVFU1RfUkVTVEFSVF9TVEFUVVMgKTsKKworCQltUmVxdWVzdFJlc3RhcnRMaXN0ZW5lci5hZGRfdW5pb24oIGFSZXF1ZXN0b3IgKTsKKwl9CisKKworCWlubGluZSB2b2lkIHN0clJlc3RhcnRSZXF1ZXN0b3IoT3V0U3RyZWFtICYgb3MsIGNvbnN0IHN0ZDo6c3RyaW5nICYgbGFiZWwpCisJeworCQlvc1JlcXVlc3RvcihvcywgbGFiZWwsIG1SZXF1ZXN0UmVzdGFydExpc3RlbmVyKTsKKwl9CisKKworCS8qKgorCSAqIFJFUVVFU1RfQ09OVElOVUVfU1RBVFVTCisJICogbVJlcXVlc3RDb250aW51ZUxpc3RlbmVyCisJICovCisJaW5saW5lIHZvaWQgZmlyZVJlcXVlc3RDb250aW51ZSgpCisJeworCQlmaXJlUmVxdWVzdENvbnRpbnVlSW5pdGlhbGl6ZSgpOworCisJCXdoaWxlKCBtRmlyZVJlcXVlc3RMaXN0ZW5lci5ub25lbXB0eSgpICkKKwkJeworCQkJbUZpcmVSZXF1ZXN0TGlzdGVuZXIucG9wX2ZpcnN0KCktPmhhbmRsZVJlcXVlc3RDb250aW51ZSgpOworCQl9CisKKwkJbUNvbnRyb2xsZXJVbml0TWFuYWdlci5oYW5kbGVSZXF1ZXN0Q29udGludWUoKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBmaXJlUmVxdWVzdENvbnRpbnVlSW5pdGlhbGl6ZSgpCisJeworCQlkaXNhYmxlUmVxdWVzdCggUkVRVUVTVF9DT05USU5VRV9TVEFUVVMgKTsKKworCQltRmlyZVJlcXVlc3RMaXN0ZW5lci5jbGVhcigpOworCQltRmlyZVJlcXVlc3RMaXN0ZW5lci5zcGxpY2UoIG1SZXF1ZXN0Q29udGludWVMaXN0ZW5lciApOworCX0KKworCisJaW5saW5lIHZvaWQgcG9zdFJlcXVlc3RDb250aW51ZShBYnN0cmFjdFByb2Nlc3NvclVuaXQgKiBhUmVxdWVzdG9yKQorCXsKKwkJZW5hYmxlUmVxdWVzdCggUkVRVUVTVF9DT05USU5VRV9TVEFUVVMgKTsKKworCQltUmVxdWVzdENvbnRpbnVlTGlzdGVuZXIuYWRkX3VuaW9uKCBhUmVxdWVzdG9yICk7CisJfQorCisKKwlpbmxpbmUgdm9pZCBzdHJDb250aW51ZVJlcXVlc3RvcihPdXRTdHJlYW0gJiBvcywgY29uc3Qgc3RkOjpzdHJpbmcgJiBsYWJlbCkKKwl7CisJCW9zUmVxdWVzdG9yKG9zLCBsYWJlbCwgbVJlcXVlc3RDb250aW51ZUxpc3RlbmVyKTsKKwl9CisKKworCS8qKgorCSAqIFJFUVVFU1RfUkVRVUVVRV9XQUlUSU5HX1NUQVRVUworCSAqIG1SZXF1ZXN0UmVxdWV1ZVdhaXRpbmdMaXN0ZW5lcgorCSAqLworCWlubGluZSB2b2lkIGZpcmVSZXF1ZXN0UmVxdWV1ZVdhaXRpbmcoKQorCXsKKwkJZmlyZVJlcXVlc3RSZXF1ZXVlV2FpdGluZ0luaXRpYWxpemUoKTsKKworCQl3aGlsZSggbUZpcmVSZXF1ZXN0TGlzdGVuZXIubm9uZW1wdHkoKSApCisJCXsKKwkJCW1Db250cm9sbGVyVW5pdE1hbmFnZXIuaGFuZGxlUmVxdWVzdFJlcXVldWVXYWl0aW5nKAorCQkJCQltRmlyZVJlcXVlc3RMaXN0ZW5lci5wb3BfZmlyc3QoKSApOworCQl9CisJfQorCisJaW5saW5lIHZvaWQgZmlyZVJlcXVlc3RSZXF1ZXVlV2FpdGluZ0luaXRpYWxpemUoKQorCXsKKwkJZGlzYWJsZVJlcXVlc3QoIFJFUVVFU1RfUkVRVUVVRV9XQUlUSU5HX1NUQVRVUyApOworCisJCW1GaXJlUmVxdWVzdExpc3RlbmVyLmNsZWFyKCk7CisJCW1GaXJlUmVxdWVzdExpc3RlbmVyLnNwbGljZSggbVJlcXVlc3RSZXF1ZXVlV2FpdGluZ0xpc3RlbmVyICk7CisJfQorCisKKwlpbmxpbmUgdm9pZCBwb3N0UmVxdWVzdFJlcXVldWVXYWl0aW5nKEFic3RyYWN0UHJvY2Vzc29yVW5pdCAqIGFSZXF1ZXN0b3IpCisJeworCQllbmFibGVSZXF1ZXN0KCBSRVFVRVNUX1JFUVVFVUVfV0FJVElOR19TVEFUVVMgKTsKKworCQltUmVxdWVzdFJlcXVldWVXYWl0aW5nTGlzdGVuZXIuYWRkX3VuaW9uKCBhUmVxdWVzdG9yICk7CisJfQorCisKKwlpbmxpbmUgdm9pZCBzdHJSZXF1ZXVlV2FpdGluZ1JlcXVlc3RvcigKKwkJCU91dFN0cmVhbSAmIG9zLCBjb25zdCBzdGQ6OnN0cmluZyAmIGxhYmVsKQorCXsKKwkJb3NSZXF1ZXN0b3Iob3MsIGxhYmVsLCBtUmVxdWVzdFJlcXVldWVXYWl0aW5nTGlzdGVuZXIpOworCX0KKworCisJLyoqCisJICogUkVRVUVTVF9SRVFVRVVFX1JFU0VSVkVfU1RBVFVTCisJICogbVJlcXVlc3RSZXF1ZXVlUmVzZXJ2ZUxpc3RlbmVyCisJICovCisJaW5saW5lIHZvaWQgZmlyZVJlcXVlc3RSZXF1ZXVlUmVzZXJ2ZSgpCisJeworCQlmaXJlUmVxdWVzdFJlcXVldWVSZXNlcnZlSW5pdGlhbGl6ZSgpOworCisJCXdoaWxlKCBtRmlyZVJlcXVlc3RMaXN0ZW5lci5ub25lbXB0eSgpICkKKwkJeworCQkJbUNvbnRyb2xsZXJVbml0TWFuYWdlci5oYW5kbGVSZXF1ZXN0UmVxdWV1ZVJlc2VydmUoCisJCQkJCW1GaXJlUmVxdWVzdExpc3RlbmVyLnBvcF9maXJzdCgpICk7CisJCX0KKwl9CisKKwlpbmxpbmUgdm9pZCBmaXJlUmVxdWVzdFJlcXVldWVSZXNlcnZlSW5pdGlhbGl6ZSgpCisJeworCQlkaXNhYmxlUmVxdWVzdCggUkVRVUVTVF9SRVFVRVVFX1JFU0VSVkVfU1RBVFVTICk7CisKKwkJbUZpcmVSZXF1ZXN0TGlzdGVuZXIuY2xlYXIoKTsKKwkJbUZpcmVSZXF1ZXN0TGlzdGVuZXIuc3BsaWNlKCBtUmVxdWVzdFJlcXVldWVSZXNlcnZlTGlzdGVuZXIgKTsKKwl9CisKKworCWlubGluZSB2b2lkIHBvc3RSZXF1ZXN0UmVxdWV1ZVJlc2VydmUoQWJzdHJhY3RQcm9jZXNzb3JVbml0ICogYVJlcXVlc3RvcikKKwl7CisJCWVuYWJsZVJlcXVlc3QoIFJFUVVFU1RfUkVRVUVVRV9SRVNFUlZFX1NUQVRVUyApOworCisJCW1SZXF1ZXN0UmVxdWV1ZVJlc2VydmVMaXN0ZW5lci5hZGRfdW5pb24oIGFSZXF1ZXN0b3IgKTsKKwl9CisKKworCWlubGluZSB2b2lkIHN0clJlcXVldWVSZXNlcnZlUmVxdWVzdG9yKAorCQkJT3V0U3RyZWFtICYgb3MsIGNvbnN0IHN0ZDo6c3RyaW5nICYgbGFiZWwpCisJeworCQlvc1JlcXVlc3RvcihvcywgbGFiZWwsIG1SZXF1ZXN0UmVxdWV1ZVJlc2VydmVMaXN0ZW5lcik7CisJfQorCisKKwkvKioKKwkgKiBSRVFVRVNUX0hFVVJJU1RJQ19TVEFUVVMKKwkgKiBtUmVxdWVzdEhldXJpc3RpY0xpc3RlbmVyCisJICovCisJaW5saW5lIHZvaWQgZmlyZVJlcXVlc3RIZXVyaXN0aWMoKQorCXsKKwkJZmlyZVJlcXVlc3RIZXVyaXN0aWNJbml0aWFsaXplKCk7CisKKwkJd2hpbGUoIG1GaXJlUmVxdWVzdExpc3RlbmVyLm5vbmVtcHR5KCkgKQorCQl7CisJCQltRmlyZVJlcXVlc3RMaXN0ZW5lci5wb3BfZmlyc3QoKS0+aGFuZGxlUmVxdWVzdEhldXJpc3RpYygpOworCQl9CisJfQorCisJaW5saW5lIHZvaWQgZmlyZVJlcXVlc3RIZXVyaXN0aWNJbml0aWFsaXplKCkKKwl7CisJCWRpc2FibGVSZXF1ZXN0KCBSRVFVRVNUX0hFVVJJU1RJQ19TVEFUVVMgKTsKKworCQltRmlyZVJlcXVlc3RMaXN0ZW5lci5jbGVhcigpOworCQltRmlyZVJlcXVlc3RMaXN0ZW5lci5zcGxpY2UoIG1SZXF1ZXN0SGV1cmlzdGljTGlzdGVuZXIgKTsKKwl9CisKKworCWlubGluZSB2b2lkIHBvc3RSZXF1ZXN0SGV1cmlzdGljKEFic3RyYWN0UHJvY2Vzc29yVW5pdCAqIGFSZXF1ZXN0b3IpCisJeworCQllbmFibGVSZXF1ZXN0KCBSRVFVRVNUX0hFVVJJU1RJQ19TVEFUVVMgKTsKKworCQltUmVxdWVzdEhldXJpc3RpY0xpc3RlbmVyLmFkZF91bmlvbiggYVJlcXVlc3RvciApOworCX0KKworCisJaW5saW5lIHZvaWQgc3RySGV1cmlzdGljUmVxdWVzdG9yKE91dFN0cmVhbSAmIG9zLCBjb25zdCBzdGQ6OnN0cmluZyAmIGxhYmVsKQorCXsKKwkJb3NSZXF1ZXN0b3Iob3MsIGxhYmVsLCBtUmVxdWVzdEhldXJpc3RpY0xpc3RlbmVyKTsKKwl9CisKKworCS8qKgorCSAqIFJFUVVFU1RfR09BTF9BQ0hJRVZFRF9TVEFUVVMKKwkgKiBtUmVxdWVzdEdvYWxBY2hpZXZlZExpc3RlbmVyCisJICovCisJaW5saW5lIHZvaWQgZmlyZVJlcXVlc3RHb2FsQWNoaWV2ZWQoKQorCXsKKwkJU3ltYmV4Q29udHJvbGxlclJlcXVlc3RNYW5hZ2VyOjpmaXJlUmVxdWVzdEdvYWxBY2hpZXZlZEluaXRpYWxpemUoKTsKKworCQl3aGlsZSggbUZpcmVSZXF1ZXN0TGlzdGVuZXIubm9uZW1wdHkoKSApCisJCXsKKwkJCW1GaXJlUmVxdWVzdExpc3RlbmVyLnBvcF9maXJzdCgpLT5oYW5kbGVSZXF1ZXN0R29hbEFjaGlldmVkKCk7CisJCX0KKwl9CisKKwlpbmxpbmUgdm9pZCBmaXJlUmVxdWVzdEdvYWxBY2hpZXZlZEluaXRpYWxpemUoKQorCXsKKwkJZGlzYWJsZVJlcXVlc3QoIFJFUVVFU1RfR09BTF9BQ0hJRVZFRF9TVEFUVVMgKTsKKworCQltRmlyZVJlcXVlc3RMaXN0ZW5lci5jbGVhcigpOworCQltRmlyZVJlcXVlc3RMaXN0ZW5lci5zcGxpY2UoIG1SZXF1ZXN0R29hbEFjaGlldmVkTGlzdGVuZXIgKTsKKwl9CisKKworCWlubGluZSB2b2lkIHBvc3RSZXF1ZXN0R29hbEFjaGlldmVkKEFic3RyYWN0UHJvY2Vzc29yVW5pdCAqIGFSZXF1ZXN0b3IpCisJeworCQllbmFibGVSZXF1ZXN0KCBSRVFVRVNUX0dPQUxfQUNISUVWRURfU1RBVFVTICk7CisKKwkJbVJlcXVlc3RHb2FsQWNoaWV2ZWRMaXN0ZW5lci5hZGRfdW5pb24oIGFSZXF1ZXN0b3IgKTsKKwl9CisKKworCWlubGluZSB2b2lkIHN0ckdvYWxBY2hpZXZlZFJlcXVlc3RvcigKKwkJCU91dFN0cmVhbSAmIG9zLCBjb25zdCBzdGQ6OnN0cmluZyAmIGxhYmVsKQorCXsKKwkJb3NSZXF1ZXN0b3Iob3MsIGxhYmVsLCBtUmVxdWVzdEdvYWxBY2hpZXZlZExpc3RlbmVyKTsKKwl9CisKK307CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKiBTRVdfU1lNQkVYX0NPTlRST0xMRVJfUkVRVUVTVF9NQU5BR0VSX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9zZXcvU3ltYmV4Q29udHJvbGxlclJlcXVlc3RTdGF0dXMuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3Nldy9TeW1iZXhDb250cm9sbGVyUmVxdWVzdFN0YXR1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYzg4ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9zZXcvU3ltYmV4Q29udHJvbGxlclJlcXVlc3RTdGF0dXMuaApAQCAtMCwwICsxLDMwNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDMgbWFycyAyMDE1CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgU0VXX1NZTUJFWF9DT05UUk9MTEVSX1JFUVVFU1RfU1RBVFVTX0hfCisjZGVmaW5lIFNFV19TWU1CRVhfQ09OVFJPTExFUl9SRVFVRVNUX1NUQVRVU19IXworCisjaW5jbHVkZSA8dXRpbC9hdm1fbnVtZXJpYy5oPgorI2luY2x1ZGUgPGNvbGxlY3Rpb24vTGlzdC5oPgorCisjaW5jbHVkZSA8ZmFtL2FwaS9BYnN0cmFjdFByb2Nlc3NvclVuaXQuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKK2NsYXNzIE91dFN0cmVhbTsKKworCitjbGFzcyBTeW1iZXhDb250cm9sbGVyUmVxdWVzdFN0YXR1cworeworCitwdWJsaWM6CisJLyoqCisJICogVFlQRURFRgorCSAqLworCXR5cGVkZWYgYXZtX3VpbnQxNl90ICByZXF1ZXN0X3N0YXR1c190OworCisJZW51bQorCXsKKwkJUkVRVUVTVF9VTkRFRklORURfU1RBVFVTICAgICAgID0gMHgwMDAwLAorCisKKwkJUkVRVUVTVF9TVE9QX1NUQVRVUyAgICAgICAgICAgID0gMHgwMDAxLAorCisJCVJFUVVFU1RfUkVMRUFTRV9TVEFUVVMgICAgICAgICA9IDB4MDAwMiwKKworCisJCVJFUVVFU1RfUkVTRVRfU1RBVFVTICAgICAgICAgICA9IDB4MDAxMCwKKworCQlSRVFVRVNUX1JFU1RBUlRfU1RBVFVTICAgICAgICAgPSAweDAwMjAsCisKKwkJUkVRVUVTVF9DT05USU5VRV9TVEFUVVMgICAgICAgID0gMHgwMDQwLAorCisKKwkJUkVRVUVTVF9SRVFVRVVFX1dBSVRJTkdfU1RBVFVTID0gMHgwMTAwLAorCisJCVJFUVVFU1RfUkVRVUVVRV9SRVNFUlZFX1NUQVRVUyA9IDB4MDIwMCwKKworCQlSRVFVRVNUX0hFVVJJU1RJQ19TVEFUVVMgICAgICAgPSAweDA0MDAsCisKKworCQlSRVFVRVNUX0dPQUxfQUNISUVWRURfU1RBVFVTICAgPSAweDA4MDAsCisKKwkJLy8gQUxJQVMKKwkJUkVRVUVTVF9BTElBU19DT05USU5VRV9TVEFUVVMgID0gUkVRVUVTVF9DT05USU5VRV9TVEFUVVMKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUkVRVUVTVF9SRVFVRVVFX1JFU0VSVkVfU1RBVFVTCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJFUVVFU1RfUkVTVEFSVF9TVEFUVVMsCisJfTsKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURQorCSAqLworCisJLyoqCisJICogUnVudGltZSBQcm9jZXNzb3IgUmVxdWVzdAorCSAqIE5PVEhJTkcgfCBTVE9QIHwgUkVTRVQgfCBSRVNUQVJUIHwgUkVMRUFTRSB8IFJFUVVFVUUgfCBIRVVSSVNUSUMKKwkgKi8KKwlyZXF1ZXN0X3N0YXR1c190IG1SZXF1ZXN0U3RhdHVzOworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJU3ltYmV4Q29udHJvbGxlclJlcXVlc3RTdGF0dXMocmVxdWVzdF9zdGF0dXNfdCBhUmVxdWVzdFN0YXR1cykKKwk6IG1SZXF1ZXN0U3RhdHVzKCBhUmVxdWVzdFN0YXR1cyApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+U3ltYmV4Q29udHJvbGxlclJlcXVlc3RTdGF0dXMoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtUmVxdWVzdFN0YXR1cworCSAqLworCWlubGluZSByZXF1ZXN0X3N0YXR1c190IGdldFJlcXVlc3RTdGF0dXMoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUmVxdWVzdFN0YXR1cyApOworCX0KKworCWlubGluZSBib29sIGhhc1JlcXVlc3RTdGF0dXMoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUmVxdWVzdFN0YXR1cyAhPSBSRVFVRVNUX1VOREVGSU5FRF9TVEFUVVMgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBub1JlcXVlc3RTdGF0dXMoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUmVxdWVzdFN0YXR1cyA9PSBSRVFVRVNUX1VOREVGSU5FRF9TVEFUVVMgKTsKKwl9CisKKworCWlubGluZSBib29sIGhhc1JlcXVlc3RTdGF0dXMocmVxdWVzdF9zdGF0dXNfdCBhUmVxdWVzdFN0YXR1cykgY29uc3QKKwl7CisJCXJldHVybiggKG1SZXF1ZXN0U3RhdHVzICYgUkVRVUVTVF9VTkRFRklORURfU1RBVFVTKSAhPSAwICk7CisJfQorCisJaW5saW5lIGJvb2wgaXNSZXF1ZXN0U3RhdHVzKHJlcXVlc3Rfc3RhdHVzX3QgYVJlcXVlc3RTdGF0dXMpIGNvbnN0CisJeworCQlyZXR1cm4oIG1SZXF1ZXN0U3RhdHVzID09IFJFUVVFU1RfVU5ERUZJTkVEX1NUQVRVUyApOworCX0KKworCWlubGluZSB2b2lkIHNldFJlcXVlc3RTdGF0dXMocmVxdWVzdF9zdGF0dXNfdCBhUmVxdWVzdCkKKwl7CisJCW1SZXF1ZXN0U3RhdHVzID0gYVJlcXVlc3Q7CisJfQorCisKKwkvKioKKwkgKiBFTkFCTEUgLSBESVNBQkxFCisJICogbVJlcXVlc3RTdGF0dXMKKwkgKi8KKwlpbmxpbmUgdm9pZCBlbmFibGVSZXF1ZXN0KHJlcXVlc3Rfc3RhdHVzX3QgYVJlcXVlc3RTdGF0dXMpCisJeworCQltUmVxdWVzdFN0YXR1cyA9IG1SZXF1ZXN0U3RhdHVzIHwgYVJlcXVlc3RTdGF0dXM7CisJfQorCisJaW5saW5lIHZvaWQgZGlzYWJsZVJlcXVlc3QocmVxdWVzdF9zdGF0dXNfdCBhUmVxdWVzdFN0YXR1cykKKwl7CisJCW1SZXF1ZXN0U3RhdHVzID0gbVJlcXVlc3RTdGF0dXMgJiAofiBhUmVxdWVzdFN0YXR1cyk7CisJfQorCisJaW5saW5lIHZvaWQgZGlzYWJsZVJlcXVlc3RTdGF0dXMoKQorCXsKKwkJbVJlcXVlc3RTdGF0dXMgPSBSRVFVRVNUX1VOREVGSU5FRF9TVEFUVVM7CisJfQorCisJaW5saW5lIGJvb2wgaGFzUmVxdWVzdEVuYWJsZWQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUmVxdWVzdFN0YXR1cyAhPSBSRVFVRVNUX1VOREVGSU5FRF9TVEFUVVMgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc1JlcXVlc3REaXNhYmxlZCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1SZXF1ZXN0U3RhdHVzID09IFJFUVVFU1RfVU5ERUZJTkVEX1NUQVRVUyApOworCX0KKworCisJLyoqCisJICogVEVTVEVSCisJICogUkVRVUVTVF9BTElBU19DT05USU5VRV9TVEFUVVMKKwkgKi8KKwlpbmxpbmUgYm9vbCBoYXNSZXF1ZXN0c1RvQ29udGludWUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobVJlcXVlc3RTdGF0dXMgJiBSRVFVRVNUX0FMSUFTX0NPTlRJTlVFX1NUQVRVUykgIT0gMCApOworCX0KKworCWlubGluZSBib29sIGhhc250UmVxdWVzdHNUb0NvbnRpbnVlKCkgY29uc3QKKwl7CisJCXJldHVybiggKG1SZXF1ZXN0U3RhdHVzICYgUkVRVUVTVF9BTElBU19DT05USU5VRV9TVEFUVVMpID09IDAgKTsKKwl9CisKKwkvKioKKwkgKiBSRVFVRVNUX1NUT1BfU1RBVFVTCisJICogbVJlcXVlc3RTdGF0dXMKKwkgKi8KKwlpbmxpbmUgYm9vbCBoYXNSZXF1ZXN0U3RvcCgpIGNvbnN0CisJeworCQlyZXR1cm4oIChtUmVxdWVzdFN0YXR1cyAmIFJFUVVFU1RfU1RPUF9TVEFUVVMpICE9IDAgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBoYXNudFJlcXVlc3RTdG9wKCkgY29uc3QKKwl7CisJCXJldHVybiggKG1SZXF1ZXN0U3RhdHVzICYgUkVRVUVTVF9TVE9QX1NUQVRVUykgPT0gMCApOworCX0KKworCS8qKgorCSAqIFJFUVVFU1RfUkVMRUFTRV9TVEFUVVMKKwkgKiBtUmVxdWVzdFN0YXR1cworCSAqLworCWlubGluZSBib29sIGhhc1JlcXVlc3RSZWxlYXNlKCkgY29uc3QKKwl7CisJCXJldHVybiggKG1SZXF1ZXN0U3RhdHVzICYgUkVRVUVTVF9SRUxFQVNFX1NUQVRVUykgIT0gMCApOworCX0KKworCWlubGluZSBib29sIGhhc250UmVxdWVzdFJlbGVhc2UoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobVJlcXVlc3RTdGF0dXMgJiBSRVFVRVNUX1JFTEVBU0VfU1RBVFVTKSA9PSAwICk7CisJfQorCisJLyoqCisJICogUkVRVUVTVF9SRVNFVF9TVEFUVVMKKwkgKiBtUmVxdWVzdFN0YXR1cworCSAqLworCWlubGluZSBib29sIGhhc1JlcXVlc3RSZXNldCgpIGNvbnN0CisJeworCQlyZXR1cm4oIChtUmVxdWVzdFN0YXR1cyAmIFJFUVVFU1RfUkVTRVRfU1RBVFVTKSAhPSAwICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzbnRSZXF1ZXN0UmVzZXQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobVJlcXVlc3RTdGF0dXMgJiBSRVFVRVNUX1JFU0VUX1NUQVRVUykgPT0gMCApOworCX0KKworCS8qKgorCSAqIFJFUVVFU1RfUkVTVEFSVF9TVEFUVVMKKwkgKiBtUmVxdWVzdFN0YXR1cworCSAqLworCWlubGluZSBib29sIGhhc1JlcXVlc3RSZXN0YXJ0KCkgY29uc3QKKwl7CisJCXJldHVybiggKG1SZXF1ZXN0U3RhdHVzICYgUkVRVUVTVF9SRVNUQVJUX1NUQVRVUykgIT0gMCApOworCX0KKworCWlubGluZSBib29sIGhhc250UmVxdWVzdFJlc3RhcnQoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobVJlcXVlc3RTdGF0dXMgJiBSRVFVRVNUX1JFU1RBUlRfU1RBVFVTKSA9PSAwICk7CisJfQorCisJLyoqCisJICogUkVRVUVTVF9DT05USU5VRV9TVEFUVVMKKwkgKiBtUmVxdWVzdFN0YXR1cworCSAqLworCWlubGluZSBib29sIGhhc1JlcXVlc3RDb250aW51ZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIChtUmVxdWVzdFN0YXR1cyAmIFJFUVVFU1RfQ09OVElOVUVfU1RBVFVTKSAhPSAwICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzbnRSZXF1ZXN0Q29udGludWUoKSBjb25zdAorCXsKKwkJcmV0dXJuKCAobVJlcXVlc3RTdGF0dXMgJiBSRVFVRVNUX0NPTlRJTlVFX1NUQVRVUykgPT0gMCApOworCX0KKworCS8qKgorCSAqIFJFUVVFU1RfUkVRVUVVRV9XQUlUSU5HX1NUQVRVUworCSAqIG1SZXF1ZXN0U3RhdHVzCisJICovCisJaW5saW5lIGJvb2wgaGFzUmVxdWVzdFJlcXVldWVXYWl0aW5nKCkgY29uc3QKKwl7CisJCXJldHVybiggKG1SZXF1ZXN0U3RhdHVzICYgUkVRVUVTVF9SRVFVRVVFX1dBSVRJTkdfU1RBVFVTKSAhPSAwICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0UmVxdWVzdFJlcXVldWVXYWl0aW5nKCkKKwl7CisJCW1SZXF1ZXN0U3RhdHVzID0gUkVRVUVTVF9SRVFVRVVFX1dBSVRJTkdfU1RBVFVTOworCX0KKworCS8qKgorCSAqIFJFUVVFU1RfUkVRVUVVRV9SRVNFUlZFX1NUQVRVUworCSAqIG1SZXF1ZXN0U3RhdHVzCisJICovCisJaW5saW5lIGJvb2wgaGFzUmVxdWVzdFJlcXVldWVSZXNlcnZlKCkgY29uc3QKKwl7CisJCXJldHVybiggKG1SZXF1ZXN0U3RhdHVzICYgUkVRVUVTVF9SRVFVRVVFX1JFU0VSVkVfU1RBVFVTKSAhPSAwICk7CisJfQorCisJLyoqCisJICogUkVRVUVTVF9IRVVSSVNUSUNfU1RBVFVTCisJICogbVJlcXVlc3RTdGF0dXMKKwkgKi8KKwlpbmxpbmUgYm9vbCBoYXNSZXF1ZXN0SGV1cmlzdGljKCkgY29uc3QKKwl7CisJCXJldHVybiggKG1SZXF1ZXN0U3RhdHVzICYgUkVRVUVTVF9IRVVSSVNUSUNfU1RBVFVTKSAhPSAwICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0UmVxdWVzdEhldXJpc3RpYygpCisJeworCQltUmVxdWVzdFN0YXR1cyA9IFJFUVVFU1RfSEVVUklTVElDX1NUQVRVUzsKKwl9CisKKwkvKioKKwkgKiBSRVFVRVNUX0dPQUxfQUNISUVWRURfU1RBVFVTCisJICogbVJlcXVlc3RTdGF0dXMKKwkgKi8KKwlpbmxpbmUgYm9vbCBoYXNSZXF1ZXN0R29hbEFjaGlldmVkKCkgY29uc3QKKwl7CisJCXJldHVybiggKG1SZXF1ZXN0U3RhdHVzICYgUkVRVUVTVF9HT0FMX0FDSElFVkVEX1NUQVRVUykgIT0gMCApOworCX0KKworfTsKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qIFNFV19TWU1CRVhfQ09OVFJPTExFUl9SRVFVRVNUX1NUQVRVU19IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc2V3L1N5bWJleENvbnRyb2xsZXJVbml0TWFuYWdlci5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9zZXcvU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODI5N2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc2V3L1N5bWJleENvbnRyb2xsZXJVbml0TWFuYWdlci5jcHAKQEAgLTAsMCArMSw1NzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyOCBub3YuIDIwMTEKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlN5bWJleENvbnRyb2xsZXJVbml0TWFuYWdlci5oIgorCisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1F1ZXJ5Lmg+CisjaW5jbHVkZSA8Zm1sL3dvcmtmbG93L1dPYmplY3QuaD4KKworI2luY2x1ZGUgPGZhbS9hcGkvUHJvY2Vzc29yVW5pdEZhY3RvcnkuaD4KKyNpbmNsdWRlIDxmYW0vYXBpL1Byb2Nlc3NvclVuaXRSZXBvc2l0b3J5Lmg+CisKKyNpbmNsdWRlIDxmYW0vcXVldWUvRXhlY3V0aW9uUXVldWUuaD4KKworI2luY2x1ZGUgPHNldy9TeW1iZXhFbmdpbmUuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLyoqCisgKiBHRVRURVIKKyAqIENvbmZpZ3VyYXRpb24KKyAqLworQ29uZmlndXJhdGlvbiAmIFN5bWJleENvbnRyb2xsZXJVbml0TWFuYWdlcjo6Z2V0Q29uZmlndXJhdGlvbigpIGNvbnN0Cit7CisJcmV0dXJuKCBtU3ltYmV4RW5naW5lLmdldENvbmZpZ3VyYXRpb24oKSApOworfQorCisvKioKKyAqIEdFVFRFUgorICogQnVpbGRlcgorICovCitCdWlsZGVyICYgU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyOjpnZXRCdWlsZGVyKCkKK3sKKwlyZXR1cm4oIG1TeW1iZXhFbmdpbmUuZ2V0QnVpbGRlcigpICk7Cit9CisKKy8qKgorICogR0VUVEVSCisgKiBBdm1QcmltaXRpdmVQcm9jZXNzb3IKKyAqLworQXZtUHJpbWl0aXZlUHJvY2Vzc29yICYgU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyOjpnZXRQcmltaXRpdmVQcm9jZXNzb3IoKQoreworCXJldHVybiggbVN5bWJleEVuZ2luZS5nZXRQcmltaXRpdmVQcm9jZXNzb3IoKSApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDT05GSUdVUkUgIEFQSQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXI6OnByZUNvbmZpZ3VyZSgpCit7CisJV09iamVjdCAqIHRoZUNPTkZJRyA9IGdldFBhcmFtZXRlcldPYmplY3QoKTsKKworCXRoZUNPTkZJRyA9IFF1ZXJ5OjpnZXRSZWdleFdTZXF1ZW5jZSh0aGVDT05GSUcsCisJCQkJT1JfV0lEMigibWFuaWZlc3QiLCAiTUFOSUZFU1QiKSwgdGhlQ09ORklHKTsKKworCWlmKCB0aGVDT05GSUcgIT0gV09iamVjdDo6X05VTExfICkKKwl7CisJCW1BdXRvU3RhcnQgPSBRdWVyeTo6Z2V0UmVnZXhXUHJvcGVydHlCb29sZWFuKAorCQkJCXRoZUNPTkZJRywgQ09OU19XSUQyKCJhdXRvIiwgInN0YXJ0IiksIGZhbHNlKTsKKworCQltQXV0b0NvbmZpZ3VyZSA9IFF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eUJvb2xlYW4oCisJCQkJdGhlQ09ORklHLCBDT05TX1dJRDIoImF1dG8iLCAiY29uZihpZ3VyZSk/IiksIGZhbHNlKTsKKwl9CisKKwlyZXR1cm4oIG1BdXRvQ29uZmlndXJlIHx8IG1BdXRvU3RhcnQgKTsKK30KKworYm9vbCBTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXI6OmNvbmZpZ3VyZSgpCit7CisJQVZNX09TX0xPRyA8PCBfU0VXXworCQkJPDwgIjwgc3RhcnQgPiBTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXI6OmNvbmZpZ3VyZSAuLi4iCisJCQk8PCBzdGQ6OmVuZGw7CisKKwltQ29uZmlnRmxhZyA9IHRydWU7CisKKwlpZiggcHJlQ29uZmlndXJlKCkgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLy8gU2VsZWN0IE1PRSBwcm9maWxlCisJV09iamVjdCAqIG1vZVByb2ZpbGUgPSBRdWVyeTo6Z2V0UmVnZXhXU2VxdWVuY2UoCisJCQlnZXRQYXJhbWV0ZXJXT2JqZWN0KCksIE9SX1dJRDIoIm1vZSIsICJNT0UiKSk7CisJaWYoIG1vZVByb2ZpbGUgPT0gV09iamVjdDo6X05VTExfICkKKwl7CisJCW1vZVByb2ZpbGUgPSBRdWVyeTo6Z2V0UmVnZXhXU2VxdWVuY2UoCisJCQkJZ2V0UGFyYW1ldGVyV09iamVjdCgpLCBPUl9XSUQyKCJtb2MiLCAiTU9DIikpOworCX0KKworCS8vIEEgUG9zc2libGUgU3BlY2lmaWMgUHJvZmlsZQorCVdPYmplY3QgKiBhUHJvZmlsZSA9IFF1ZXJ5OjpnZXRXUHJvcGVydHlXUmVmZXJlbmNlT3JFbHNlKAorCQkJbW9lUHJvZmlsZSwgIm1vZSIsICJwcm9maWxlIiwgV09iamVjdDo6X05VTExfKTsKKwlpZiggYVByb2ZpbGUgIT0gV09iamVjdDo6X05VTExfICkKKwl7CisJCVdPYmplY3QgKiB0aGVQUk9QRVJUWSA9IFF1ZXJ5OjpnZXRSZWdleFdTZXF1ZW5jZSgKKwkJCQlhUHJvZmlsZSwgT1JfV0lEMigicHJvcGVydHkiLCAiUFJPUEVSVFkiKSk7CisJCWlmKCB0aGVQUk9QRVJUWSAhPSBXT2JqZWN0OjpfTlVMTF8gKQorCQl7CisJCQltb2VQcm9maWxlID0gdGhlUFJPUEVSVFk7CisJCX0KKwkJZWxzZQorCQl7CisJCQltb2VQcm9maWxlID0gYVByb2ZpbGU7CisJCX0KKwl9CisKKwltQ29uZmlnRmxhZyA9IFByb2Nlc3NvclVuaXRGYWN0b3J5Ojpjb25maWd1cmUoKnRoaXMsCisJCQlnZXRQYXJhbWV0ZXJXT2JqZWN0KCksIG1vZVByb2ZpbGUpCisJCQkmJiBtQ29uZmlnRmxhZzsKKworCitBVk1fSUZfREVCVUdfRkxBRyggQ09ORklHVVJJTkcgKQorCUFWTV9PU19MT0cgPDwgIlRoZSBwcm9jZXNzIGNvbmZpZ3VyYXRpb246PiAiIDw8IHN0ZDo6ZW5kbDsKKwl0b1N0cmVhbShBVk1fT1NfTE9HKTsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBDT05GSUdVUklORyApCisKKwlBVk1fT1NfTE9HIDw8IF9TRVdfCisJCQk8PCAiPCBlbmQgPiBTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXI6OmNvbmZpZ3VyZSAuLi4gZG9uZS4iCisJCQk8PCBzdGQ6OmVuZGw7CisKKwlyZXR1cm4gbUNvbmZpZ0ZsYWc7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIElOSVQgLyBFWElUICBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyOjppbml0SW1wbCgpCit7CisJcHJvY2Vzc29ySXQgPSBtQ29udHJvbGxlclVuaXRzLmJlZ2luKCk7CisJcHJvY2Vzc29ySXRFbmQgPSBtQ29udHJvbGxlclVuaXRzLmVuZCgpOworCWZvciggOyBwcm9jZXNzb3JJdCAhPSBwcm9jZXNzb3JJdEVuZCA7ICsrcHJvY2Vzc29ySXQgKQorCXsKKwkJaWYoICgqcHJvY2Vzc29ySXQpLT5pc0VuYWJsZVBsdWdpbigpICkKKwkJeworCQkJaWYoIG5vdCAoKnByb2Nlc3Nvckl0KS0+aW5pdCgpICkKKwkJCXsKKwkJCQlBVk1fT1NfQ0xPRyAgPDwgIkZhaWxlZCB0byBpbml0IHRoZSBQTFVHSU4gUFJPQ0VTU09SIDw8ICIKKwkJCQkJCTw8ICggKnByb2Nlc3Nvckl0KS0+Z2V0UGFyYW1ldGVyV09iamVjdCgpCisJCQkJCQkJCS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJCQkJPDwgIiA+PiAiIDw8IHN0ZDo6ZW5kbDsKKworCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiB0cnVlOworfQorCitib29sIFN5bWJleENvbnRyb2xsZXJVbml0TWFuYWdlcjo6ZXhpdEltcGwoKQoreworCXByb2Nlc3Nvckl0ID0gbUNvbnRyb2xsZXJVbml0cy5iZWdpbigpOworCXByb2Nlc3Nvckl0RW5kID0gbUNvbnRyb2xsZXJVbml0cy5lbmQoKTsKKwlmb3IoIDsgcHJvY2Vzc29ySXQgIT0gcHJvY2Vzc29ySXRFbmQgOyArK3Byb2Nlc3Nvckl0ICkKKwl7CisJCWlmKCAoKnByb2Nlc3Nvckl0KS0+aXNFbmFibGVQbHVnaW4oKSApCisJCXsKKwkJCWlmKCBub3QgKCpwcm9jZXNzb3JJdCktPmV4aXQoKSApCisJCQl7CisJCQkJQVZNX09TX0NMT0cgIDw8ICJGYWlsZWQgdG8gZXhpdCB0aGUgUExVR0lOIFBST0NFU1NPUiA8PCAiCisJCQkJCQk8PCAoICpwcm9jZXNzb3JJdCktPmdldFBhcmFtZXRlcldPYmplY3QoKQorCQkJCQkJCQktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKwkJCQkJCTw8ICIgPj4gIiA8PCBzdGQ6OmVuZGw7CisKKwkJCQlyZXR1cm4oIGZhbHNlICk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICggUFJFIC8gUE9TVCApIFBST0NFU1MgIEFQSQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXI6OnByZXByb2Nlc3MoKQoreworCWJvb2wgaXNPSyA9IG1NYWluUHJvY2Vzc29yLnByZXByb2Nlc3MoKTsKKworCWlmKCBpc09LICkKKwl7CisJCWlzT0sgPSBtUHJlcHJvY2Vzc29yQ29udHJvbGxlclVuaXRzLnByZXByb2Nlc3MoKTsKKwl9CisKK0FWTV9JRl9ERUJVR19FTkFCTEVEX0FORCggbU1haW5Qcm9jZXNzb3IuaXNEZWJ1Z1ByZXByb2Nlc3NpbmcoKSApCisJbU1haW5Qcm9jZXNzb3IuZGVidWdQcmVwcm9jZXNzaW5nKCk7CitBVk1fRU5ESUZfREVCVUdfRU5BQkxFRF9BTkQKKworCXJldHVybiggaXNPSyApOworfQorCisKK2Jvb2wgU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyOjpwb3N0cHJvY2VzcygpCit7CisJYm9vbCBpc09LID0gbU1haW5Qcm9jZXNzb3IucG9zdHByb2Nlc3MoKTsKKworCWlmKCBpc09LICkKKwl7CisJCWlzT0sgPSBtUG9zdHByb2Nlc3NvckNvbnRyb2xsZXJVbml0cy5wb3N0cHJvY2VzcygpOworCX0KKworQVZNX0lGX0RFQlVHX0VOQUJMRURfQU5EKCBtTWFpblByb2Nlc3Nvci5pc0RlYnVnUG9zdHByb2Nlc3NpbmcoKSApCisJbU1haW5Qcm9jZXNzb3IuZGVidWdQb3N0cHJvY2Vzc2luZygpOworQVZNX0VORElGX0RFQlVHX0VOQUJMRURfQU5ECisKKwlyZXR1cm4oIGlzT0sgKTsKK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBGSUxURVJJTkcgIEFQSQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXI6OmZpbHRlcmluZ0luaXRpYWxpemUoKQoreworCWJvb2wgaXNPSyA9IHRydWU7CisKKwlwcm9jZXNzb3JJdCA9IG1Db250cm9sbGVyVW5pdHMuYmVnaW4oKTsKKwlwcm9jZXNzb3JJdEVuZCA9IG1Db250cm9sbGVyVW5pdHMuZW5kKCk7CisJZm9yKCAgOyBwcm9jZXNzb3JJdCAhPSBwcm9jZXNzb3JJdEVuZCA7ICsrcHJvY2Vzc29ySXQgKQorCXsKKwkJaWYoICgqcHJvY2Vzc29ySXQpLT5pc1dlYWtFbmFibGVGaWx0ZXIoKSApCisJCXsKKwkJCWlmKCBub3QgKCpwcm9jZXNzb3JJdCktPmZpbHRlcmluZ0luaXRpYWxpemUoKSApCisJCQl7CisJCQkJaXNPSyA9IGZhbHNlOworCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKy8vCWlmKCBtTWFpblByb2Nlc3Nvci5maWx0ZXJpbmdJbml0aWFsaXplKCkgKQorLy8JeworLy8JCXJldHVybiggbVByZWZpbHRlckNvbnRyb2xsZXJVbml0cy5maWx0ZXJpbmdJbml0aWFsaXplKCkgKTsKKy8vCX0KKy8vCisvLwlyZXR1cm4oIGZhbHNlICk7CisKKwlBVk1fSUZfREVCVUdfRU5BQkxFRF9BTkQoIG1NYWluUHJvY2Vzc29yLmlzRGVidWdGaWx0ZXJpbmdJbml0aWFsaXplKCkgKQorCQltTWFpblByb2Nlc3Nvci5kZWJ1Z0ZpbHRlcmluZ0luaXRpYWxpemUoKTsKKwlBVk1fRU5ESUZfREVCVUdfRU5BQkxFRF9BTkQKKworCXJldHVybiggaXNPSyApOworfQorCisKK2Jvb2wgU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyOjpmaWx0ZXJpbmdGaW5hbGl6ZSgpCit7CisJYm9vbCBpc09LID0gdHJ1ZTsKKworCXByb2Nlc3Nvckl0ID0gbUNvbnRyb2xsZXJVbml0cy5iZWdpbigpOworCXByb2Nlc3Nvckl0RW5kID0gbUNvbnRyb2xsZXJVbml0cy5lbmQoKTsKKwlmb3IoIDsgcHJvY2Vzc29ySXQgIT0gcHJvY2Vzc29ySXRFbmQgOyArK3Byb2Nlc3Nvckl0ICkKKwl7CisJCWlmKCAoKnByb2Nlc3Nvckl0KS0+aXNXZWFrRW5hYmxlRmlsdGVyKCkgKQorCQl7CisJCQlpZiggbm90ICgqcHJvY2Vzc29ySXQpLT5maWx0ZXJpbmdGaW5hbGl6ZSgpICkKKwkJCXsKKwkJCQlpc09LID0gZmFsc2U7CisKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworLy8JaWYoIG1NYWluUHJvY2Vzc29yLmZpbHRlcmluZ0ZpbmFsaXplKCkgKQorLy8JeworLy8JCXJldHVybiggbVByZWZpbHRlckNvbnRyb2xsZXJVbml0cy5maWx0ZXJpbmdGaW5hbGl6ZSgpICk7CisvLwl9CisvLworLy8JcmV0dXJuKCBmYWxzZSApOworCisJQVZNX0lGX0RFQlVHX0VOQUJMRURfQU5EKCBtTWFpblByb2Nlc3Nvci5pc0RlYnVnRmlsdGVyaW5nRmluYWxpemUoKSApCisJCW1NYWluUHJvY2Vzc29yLmRlYnVnRmlsdGVyaW5nRmluYWxpemUoKTsKKwlBVk1fRU5ESUZfREVCVUdfRU5BQkxFRF9BTkQKKworCXJldHVybiggaXNPSyApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAoIFBSRSAvIFBPU1QgKSBGSUxURVIgIEFQSQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXI6OnByZWZpbHRlcigpCit7CitBVk1fSUZfREVCVUdfRU5BQkxFRF9BTkQoIG1NYWluUHJvY2Vzc29yLmlzRGVidWdQcmVmaWx0ZXJpbmcoKSApCisJbU1haW5Qcm9jZXNzb3IuZGVidWdQcmVmaWx0ZXJpbmcoKTsKK0FWTV9FTkRJRl9ERUJVR19FTkFCTEVEX0FORAorCisKKwlpZiggbU1haW5Qcm9jZXNzb3IucHJlZmlsdGVyKCkgKQorCXsKKwkJaWYoIG1SZWR1bmRhbmN5UHJvY2Vzc29yLnByZWZpbHRlcigpICkKKwkJeworCQkJcmV0dXJuKCBtUHJlZmlsdGVyQ29udHJvbGxlclVuaXRzLnByZWZpbHRlcigpICk7CisJCX0KKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKworYm9vbCBTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXI6OmZpbmFsaXplUHJlZmlsdGVyaW5nKCkKK3sKKwlib29sIGlzT0sgPSBtTWFpblByb2Nlc3Nvci5maW5hbGl6ZVByZWZpbHRlcmluZygpOworCitBVk1fSUZfREVCVUdfRU5BQkxFRF9BTkQoIG1NYWluUHJvY2Vzc29yLmlzRGVidWdQcmVmaWx0ZXJpbmdGaW5hbGl6ZSgpICkKKwltTWFpblByb2Nlc3Nvci5kZWJ1Z1ByZWZpbHRlcmluZ0ZpbmFsaXplKCk7CitBVk1fRU5ESUZfREVCVUdfRU5BQkxFRF9BTkQKKworCXJldHVybiggaXNPSyApOworfQorCisKK2Jvb2wgU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyOjpwb3N0ZmlsdGVyKCkKK3sKK0FWTV9JRl9ERUJVR19FTkFCTEVEX0FORCggbU1haW5Qcm9jZXNzb3IuaXNEZWJ1Z1Bvc3RmaWx0ZXJpbmcoKSApCisJbU1haW5Qcm9jZXNzb3IuZGVidWdQb3N0ZmlsdGVyaW5nKCk7CitBVk1fRU5ESUZfREVCVUdfRU5BQkxFRF9BTkQKKworCWlmKCBtTWFpblByb2Nlc3Nvci5wb3N0ZmlsdGVyKCkgKQorCXsKKwkJcmV0dXJuKCBtUG9zdGZpbHRlckNvbnRyb2xsZXJVbml0cy5wb3N0ZmlsdGVyKCkgKTsKKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKworYm9vbCBTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXI6OmZpbmFsaXplUG9zdGZpbHRlcmluZygpCit7CisJYm9vbCBpc09LID0gbU1haW5Qcm9jZXNzb3IuZmluYWxpemVQb3N0ZmlsdGVyaW5nKCk7CisKKy8vCWlmKCBtTWFpblByb2Nlc3Nvci5maW5hbGl6ZVBvc3RmaWx0ZXJpbmcoKSApCisvLwl7CisvLwkJcmV0dXJuKCBtUG9zdGZpbHRlckNvbnRyb2xsZXJVbml0cy5maW5hbGl6ZVBvc3RmaWx0ZXJpbmcoKSApOworLy8JfQorLy8KKy8vCXJldHVybiggZmFsc2UgKTsKKworQVZNX0lGX0RFQlVHX0VOQUJMRURfQU5EKCBtTWFpblByb2Nlc3Nvci5pc0RlYnVnUG9zdGZpbHRlcmluZ0ZpbmFsaXplKCkgKQorCW1NYWluUHJvY2Vzc29yLmRlYnVnUG9zdGZpbHRlcmluZ0ZpbmFsaXplKCk7CitBVk1fRU5ESUZfREVCVUdfRU5BQkxFRF9BTkQKKworCXJldHVybiggaXNPSyApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBSRVBPUlQgIEFQSQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXI6OnJlcG9ydChPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlpZiggbUNvbnRyb2xsZXJVbml0cy5ub25lbXB0eSgpICkKKwl7CisJCW9zIDw8IFRBQiA8PCAiUkVQT1JUIiA8PCBFT0xfSU5DUl9JTkRFTlQ7CisKKwkJbVF1ZXVlUHJvY2Vzc29yLnJlcG9ydChvcyk7CisJCW9zIDw8IHN0ZDo6Zmx1c2g7CisKKwkJbU1haW5Qcm9jZXNzb3IucmVwb3J0KG9zKTsKKwkJb3MgPDwgc3RkOjpmbHVzaDsKKworCQltUmVkdW5kYW5jeVByb2Nlc3Nvci5yZXBvcnQob3MpOworCQlvcyA8PCBzdGQ6OmZsdXNoOworCisJCWNvbnRyb2xsZXJfaXRlcmF0b3IgcHJvY2Vzc29ySXQgPSBtQ29udHJvbGxlclVuaXRzLmJlZ2luKCk7CisJCWNvbnRyb2xsZXJfaXRlcmF0b3IgcHJvY2Vzc29ySXRFbmQgPSBtQ29udHJvbGxlclVuaXRzLmVuZCgpOworCQlmb3IoIDsgcHJvY2Vzc29ySXQgIT0gcHJvY2Vzc29ySXRFbmQgOyArK3Byb2Nlc3Nvckl0ICkKKwkJeworCQkJaWYoICgqcHJvY2Vzc29ySXQpLT5pc0VuYWJsZVBsdWdpbigpICkKKwkJCXsKKwkJCQkoKnByb2Nlc3Nvckl0KS0+cmVwb3J0KG9zKTsKKwkJCQlvcyA8PCBzdGQ6OmZsdXNoOworCQkJfQorCQl9CisKKwkJb3MgPDwgREVDUl9JTkRFTlQgPDwgc3RkOjpmbHVzaDsKKwl9Cit9CisKKworLyoqCisgKiBFVkFMIFRSQUNFCisgKi8KK3ZvaWQgU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyOjp0cmFjZUJvdW5kRXZhbChPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKy8vCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCgKKy8vCQlDb21wb3NpdGVDb250cm9sbGVyVW5pdDo6Zmlyc3QoKSA9PSAoJiBtTWFpblByb2Nlc3NvcikgKQorLy8JCQk8PCAiWW91IGZvdW5kIGEgQlVHICEhISIKKy8vCQkJPDwgU0VORF9FWElUOworCisJbU1haW5Qcm9jZXNzb3IudHJhY2VCb3VuZEV2YWwob3MpOworCW9zIDw8IHN0ZDo6Zmx1c2g7CisKKwljb250cm9sbGVyX2l0ZXJhdG9yIHByb2Nlc3Nvckl0ID0gbUNvbnRyb2xsZXJVbml0cy5iZWdpbigpOworCWNvbnRyb2xsZXJfaXRlcmF0b3IgcHJvY2Vzc29ySXRFbmQgPSBtQ29udHJvbGxlclVuaXRzLmVuZCgpOworCWZvciggOyBwcm9jZXNzb3JJdCAhPSBwcm9jZXNzb3JJdEVuZCA7ICsrcHJvY2Vzc29ySXQgKQorCXsKKwkJaWYoICgqcHJvY2Vzc29ySXQpLT5pc0VuYWJsZVBsdWdpbigpICkKKwkJeworCQkJKCpwcm9jZXNzb3JJdCktPnRyYWNlQm91bmRFdmFsKG9zKTsKKwkJfQorCX0KK30KKworCit2b2lkIFN5bWJleENvbnRyb2xsZXJVbml0TWFuYWdlcjo6dHJhY2VQcmVFdmFsKAorCQlPdXRTdHJlYW0gJiBvcywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpIGNvbnN0Cit7CisvLwlBVk1fT1NfQVNTRVJUX0ZBVEFMX0VSUk9SX0VYSVQoCisvLwkJQ29tcG9zaXRlQ29udHJvbGxlclVuaXQ6OmZpcnN0KCkgPT0gKCYgbU1haW5Qcm9jZXNzb3IpICkKKy8vCQkJPDwgIllvdSBmb3VuZCBhIEJVRyAhISEiCisvLwkJCTw8IFNFTkRfRVhJVDsKKworCW1NYWluUHJvY2Vzc29yLnRyYWNlUHJlRXZhbChvcywgYW5FQyk7CisJb3MgPDwgc3RkOjpmbHVzaDsKKworCWNvbnRyb2xsZXJfaXRlcmF0b3IgcHJvY2Vzc29ySXQgPSBtQ29udHJvbGxlclVuaXRzLmJlZ2luKCk7CisJY29udHJvbGxlcl9pdGVyYXRvciBwcm9jZXNzb3JJdEVuZCA9IG1Db250cm9sbGVyVW5pdHMuZW5kKCk7CisJZm9yKCA7IHByb2Nlc3Nvckl0ICE9IHByb2Nlc3Nvckl0RW5kIDsgKytwcm9jZXNzb3JJdCApCisJeworCQlpZiggKCpwcm9jZXNzb3JJdCktPmlzRW5hYmxlUGx1Z2luKCkgJiYKKwkJCSgqcHJvY2Vzc29ySXQpLT5pc0xpZmVjeWNsZVJ1bm5hYmxlKCkgKQorCQl7CisJCQkoKnByb2Nlc3Nvckl0KS0+dHJhY2VQcmVFdmFsKG9zLCBhbkVDKTsKKwkJfQorCX0KK30KKworCit2b2lkIFN5bWJleENvbnRyb2xsZXJVbml0TWFuYWdlcjo6dHJhY2VQb3N0RXZhbCgKKwkJT3V0U3RyZWFtICYgb3MsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKSBjb25zdAoreworLy8JQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKAorLy8JCUNvbXBvc2l0ZUNvbnRyb2xsZXJVbml0OjpmaXJzdCgpID09ICgmIG1NYWluUHJvY2Vzc29yKSApCisvLwkJCTw8ICJZb3UgZm91bmQgYSBCVUcgISEhIgorLy8JCQk8PCBTRU5EX0VYSVQ7CisKKwltTWFpblByb2Nlc3Nvci50cmFjZVBvc3RFdmFsKG9zLCBhbkVDKTsKKwlvcyA8PCBzdGQ6OmZsdXNoOworCisJY29udHJvbGxlcl9pdGVyYXRvciBwcm9jZXNzb3JJdCA9IG1Db250cm9sbGVyVW5pdHMuYmVnaW4oKTsKKwljb250cm9sbGVyX2l0ZXJhdG9yIHByb2Nlc3Nvckl0RW5kID0gbUNvbnRyb2xsZXJVbml0cy5lbmQoKTsKKwlmb3IoIDsgcHJvY2Vzc29ySXQgIT0gcHJvY2Vzc29ySXRFbmQgOyArK3Byb2Nlc3Nvckl0ICkKKwl7CisJCWlmKCAoKnByb2Nlc3Nvckl0KS0+aXNFbmFibGVQbHVnaW4oKSAmJgorCQkJKCpwcm9jZXNzb3JJdCktPmlzTGlmZWN5Y2xlUnVubmFibGUoKSApCisJCXsKKwkJCSgqcHJvY2Vzc29ySXQpLT50cmFjZVBvc3RFdmFsKG9zLCBhbkVDKTsKKwkJfQorCX0KK30KKworCit2b2lkIFN5bWJleENvbnRyb2xsZXJVbml0TWFuYWdlcjo6cmVwb3J0RXZhbChPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKy8vCUFWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCgKKy8vCQlDb21wb3NpdGVDb250cm9sbGVyVW5pdDo6Zmlyc3QoKSA9PSAoJiBtTWFpblByb2Nlc3NvcikgKQorLy8JCQk8PCAiWW91IGZvdW5kIGEgQlVHICEhISIKKy8vCQkJPDwgU0VORF9FWElUOworCisJbU1haW5Qcm9jZXNzb3IucmVwb3J0RXZhbChvcyk7CisJb3MgPDwgc3RkOjpmbHVzaDsKKworCWNvbnRyb2xsZXJfaXRlcmF0b3IgcHJvY2Vzc29ySXQgPSBtQ29udHJvbGxlclVuaXRzLmJlZ2luKCk7CisJY29udHJvbGxlcl9pdGVyYXRvciBwcm9jZXNzb3JJdEVuZCA9IG1Db250cm9sbGVyVW5pdHMuZW5kKCk7CisJZm9yKCA7IHByb2Nlc3Nvckl0ICE9IHByb2Nlc3Nvckl0RW5kIDsgKytwcm9jZXNzb3JJdCApCisJeworCQlpZiggKCpwcm9jZXNzb3JJdCktPmlzRW5hYmxlUGx1Z2luKCkgKQorCQl7CisJCQkoKnByb2Nlc3Nvckl0KS0+cmVwb3J0RXZhbChvcyk7CisJCX0KKwl9Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVOSVQgVEVTVCBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyOjp0ZGRVbml0UmVwb3J0KE91dFN0cmVhbSAmIG9zKSBjb25zdAoreworCW1NYWluUHJvY2Vzc29yLnRkZFVuaXRSZXBvcnQob3MpOworCisJY29udHJvbGxlcl9pdGVyYXRvciBwcm9jZXNzb3JJdCA9IG1Db250cm9sbGVyVW5pdHMuYmVnaW4oKTsKKwljb250cm9sbGVyX2l0ZXJhdG9yIHByb2Nlc3Nvckl0RW5kID0gbUNvbnRyb2xsZXJVbml0cy5lbmQoKTsKKwlmb3IoIDsgcHJvY2Vzc29ySXQgIT0gcHJvY2Vzc29ySXRFbmQgOyArK3Byb2Nlc3Nvckl0ICkKKwl7CisJCWlmKCAoKnByb2Nlc3Nvckl0KS0+aXNFbmFibGVQbHVnaW4oKSApCisJCXsKKwkJCSgqcHJvY2Vzc29ySXQpLT50ZGRVbml0UmVwb3J0KG9zKTsKKwkJfQorCX0KK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTk9OLVJFR1JFU1NJT04gVEVTVCBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyOjp0ZGRSZWdyZXNzaW9uUmVwb3J0KE91dFN0cmVhbSAmIG9zKSBjb25zdAoreworCW1NYWluUHJvY2Vzc29yLnRkZFJlZ3Jlc3Npb25SZXBvcnQob3MpOworCisJY29udHJvbGxlcl9pdGVyYXRvciBwcm9jZXNzb3JJdCA9IG1Db250cm9sbGVyVW5pdHMuYmVnaW4oKTsKKwljb250cm9sbGVyX2l0ZXJhdG9yIHByb2Nlc3Nvckl0RW5kID0gbUNvbnRyb2xsZXJVbml0cy5lbmQoKTsKKwlmb3IoIDsgcHJvY2Vzc29ySXQgIT0gcHJvY2Vzc29ySXRFbmQgOyArK3Byb2Nlc3Nvckl0ICkKKwl7CisJCWlmKCAoKnByb2Nlc3Nvckl0KS0+aXNFbmFibGVQbHVnaW4oKSApCisJCXsKKwkJCSgqcHJvY2Vzc29ySXQpLT50ZGRSZWdyZXNzaW9uUmVwb3J0KG9zKTsKKwkJfQorCX0KK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU0VSSUFMSVpBVElPTiBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyOjp0b1N0cmVhbShPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKy8vCWlmKCBtUGFyYW1ldGVyV09iamVjdCAhPSBOVUxMICkKKy8vCXsKKy8vCQltUGFyYW1ldGVyV09iamVjdC0+dG9TdHJlYW0ob3MpOworLy8JfQorCisJb3MgPDwgVEFCIDw8ICJtb2U6IiA8PCBFT0xfSU5DUl9JTkRFTlQ7CisKKwlvcyA8PCBUQUIgPDwgInN1cGVydmlzb3IgPSAiIDw8IG1NYWluUHJvY2Vzc29yLnN0clVuaXFJZCgpICA8PCAiOyIgPDwgRU9MOworCisJb3MgPDwgVEFCIDw8ICJxdWV1ZSA9ICIgPDwgbVF1ZXVlUHJvY2Vzc29yLnN0clVuaXFJZCgpIDw8ICI7IiA8PCBFT0w7CisKKwlvcyA8PCBUQUIgPDwgInJlZHVuZGFuY3kgPSAiIDw8IG1SZWR1bmRhbmN5UHJvY2Vzc29yLnN0clVuaXFJZCgpIDw8ICI7IgorCQkJPDwgRU9MMjsKKworCW1QcmVwcm9jZXNzb3JDb250cm9sbGVyVW5pdHMudG9TdHJlYW0ob3MsICJwcmVfcHJvY2Vzc29yID0gIiApOworCisJb3MgPDwgRU9MOworCisJbVByZWZpbHRlckNvbnRyb2xsZXJVbml0cy50b1N0cmVhbShvcywgInByZV9maWx0ZXIgPSAiICk7CisKKwltUG9zdGZpbHRlckNvbnRyb2xsZXJVbml0cy50b1N0cmVhbShvcywgInBvc3RfZmlsdGVyID0gIiApOworCisJb3MgPDwgRU9MOworCisJbVBvc3Rwcm9jZXNzb3JDb250cm9sbGVyVW5pdHMudG9TdHJlYW0ob3MsICJwb3N0X3Byb2Nlc3NvciA9ICIgKTsKKworCW9zIDw8IERFQ1JfSU5ERU5UOworCit9CisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc2V3L1N5bWJleENvbnRyb2xsZXJVbml0TWFuYWdlci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc2V3L1N5bWJleENvbnRyb2xsZXJVbml0TWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZThjZWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9zZXcvU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyLmgKQEAgLTAsMCArMSw2MjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyOCBub3YuIDIwMTEKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBTRVdfU1lNQkVYX0NPTlRST0xMRVJfVU5JVF9NQU5BR0VSX0hfCisjZGVmaW5lIFNFV19TWU1CRVhfQ09OVFJPTExFUl9VTklUX01BTkFHRVJfSF8KKworI2luY2x1ZGUgPGZhbS9hcGkvQWJzdHJhY3RQcm9jZXNzb3JVbml0Lmg+CisKKyNpbmNsdWRlIDxjb2xsZWN0aW9uL1R5cGVkZWYuaD4KKworI2luY2x1ZGUgPGZhbS9hcGkvQ29tcG9zaXRlQ29udHJvbGxlclVuaXQuaD4KKyNpbmNsdWRlIDxmYW0vYXBpL01haW5Qcm9jZXNzb3JVbml0Lmg+CisjaW5jbHVkZSA8ZmFtL2FwaS9Qcm9jZXNzb3JVbml0QXV0b1JlZ2lzdHJhdGlvbi5oPgorCisjaW5jbHVkZSA8ZmFtL3F1ZXVlL0V4ZWN1dGlvblF1ZXVlLmg+CisKKyNpbmNsdWRlIDxmYW0vcmVkdW5kYW5jeS9SZWR1bmRhbmN5RmlsdGVyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK2NsYXNzIEF2bVByaW1pdGl2ZVByb2Nlc3NvcjsKK2NsYXNzIEJ1aWxkZXI7CitjbGFzcyBDb25maWd1cmF0aW9uOworY2xhc3MgU3ltYmV4RW5naW5lOworY2xhc3MgV09iamVjdDsKKworCitjbGFzcyBTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXIgIDogIHB1YmxpYyBSdW5uYWJsZUVsZW1lbnQKK3sKKworCUFWTV9ERUNMQVJFX0NMT05BQkxFX0NMQVNTKCBTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXIgKQorCitwcm90ZWN0ZWQ6CisJLyoqCisJICogVFlQRURFRgorCSAqLworCXR5cGVkZWYgTGlzdDwgQWJzdHJhY3RQcm9jZXNzb3JVbml0ICogPiBMaXN0T2ZDb250cm9sbGVyVW5pdHM7CisKK3B1YmxpYzoKKwl0eXBlZGVmIExpc3RPZkNvbnRyb2xsZXJVbml0czo6aXRlcmF0b3IgICAgICAgIHJ3X2NvbnRyb2xsZXJfaXRlcmF0b3I7CisJdHlwZWRlZiBMaXN0T2ZDb250cm9sbGVyVW5pdHM6OmNvbnN0X2l0ZXJhdG9yICBjb250cm9sbGVyX2l0ZXJhdG9yOworCisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBBVFRSSUJVVEUKKwkgKi8KKwlTeW1iZXhFbmdpbmUgJiBtU3ltYmV4RW5naW5lOworCisJYm9vbCBtQXV0b0NvbmZpZ3VyZTsKKwlib29sIG1BdXRvU3RhcnQ7CisKKwlFeGVjdXRpb25RdWV1ZSBtUXVldWVQcm9jZXNzb3I7CisKKwlNYWluUHJvY2Vzc29yVW5pdCBtTWFpblByb2Nlc3NvcjsKKworCVJlZHVuZGFuY3lGaWx0ZXIgbVJlZHVuZGFuY3lQcm9jZXNzb3I7CisKKwlDb21wb3NpdGVDb250cm9sbGVyVW5pdCBtQ29udHJvbGxlclVuaXRzOworCisJQ29tcG9zaXRlQ29udHJvbGxlclVuaXQgbVByZXByb2Nlc3NvckNvbnRyb2xsZXJVbml0czsKKwlDb21wb3NpdGVDb250cm9sbGVyVW5pdCBtUG9zdHByb2Nlc3NvckNvbnRyb2xsZXJVbml0czsKKworCUNvbXBvc2l0ZUNvbnRyb2xsZXJVbml0IG1QcmVmaWx0ZXJDb250cm9sbGVyVW5pdHM7CisJQ29tcG9zaXRlQ29udHJvbGxlclVuaXQgbVBvc3RmaWx0ZXJDb250cm9sbGVyVW5pdHM7CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQ29tcHV0aW5nIFZhcmlhYmxlcworCXJ3X2NvbnRyb2xsZXJfaXRlcmF0b3IgcHJvY2Vzc29ySXQ7CisJcndfY29udHJvbGxlcl9pdGVyYXRvciBwcm9jZXNzb3JJdEVuZDsKKworCitwdWJsaWM6CisKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXIoCisJCQlTeW1iZXhFbmdpbmUgJiBhbkVuZ2luZSwgV09iamVjdCAqIHdmUGFyYW1ldGVyT2JqZWN0KQorCTogUnVubmFibGVFbGVtZW50KAorCQkJQ0xBU1NfS0lORF9UKCBTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXIgKSwgd2ZQYXJhbWV0ZXJPYmplY3QpLAorCisJbVN5bWJleEVuZ2luZSggYW5FbmdpbmUgKSwKKworCW1BdXRvQ29uZmlndXJlKCBmYWxzZSApLAorCW1BdXRvU3RhcnQoIGZhbHNlICksCisKKwltUXVldWVQcm9jZXNzb3IoICp0aGlzICksCisJbU1haW5Qcm9jZXNzb3IoICp0aGlzICksCisJbVJlZHVuZGFuY3lQcm9jZXNzb3IoICp0aGlzICksCisKKwltQ29udHJvbGxlclVuaXRzKCAqdGhpcyApLAorCisJbVByZXByb2Nlc3NvckNvbnRyb2xsZXJVbml0cyggKnRoaXMgKSwKKwltUG9zdHByb2Nlc3NvckNvbnRyb2xsZXJVbml0cyggKnRoaXMgKSwKKworCW1QcmVmaWx0ZXJDb250cm9sbGVyVW5pdHMoICp0aGlzICksCisJbVBvc3RmaWx0ZXJDb250cm9sbGVyVW5pdHMoICp0aGlzICksCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQ29tcHV0aW5nIFZhcmlhYmxlcworCXByb2Nlc3Nvckl0KCApLAorCXByb2Nlc3Nvckl0RW5kKCApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5TeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXIoKQorCXsKKwkJQWJzdHJhY3RQcm9jZXNzb3JVbml0ICogaXRQcm9jZXNzb3IgPSBOVUxMOworCisJCXdoaWxlKCBtQ29udHJvbGxlclVuaXRzLm5vbmVtcHR5KCkgKQorCQl7CisJCQlpdFByb2Nlc3NvciA9IG1Db250cm9sbGVyVW5pdHMucG9wX2xhc3QoKTsKKworCQkJLy8gRG9uJ3QgZGVsZXRlIDw8IG1NYWluUHJvY2Vzc29yIHwgbVF1ZXVlUHJvY2Vzc29yID4+CisJCQlpZiggKGl0UHJvY2Vzc29yICE9ICgmIG1NYWluUHJvY2Vzc29yICkpCisJCQkJJiYgKGl0UHJvY2Vzc29yICE9ICgmIG1RdWV1ZVByb2Nlc3NvcikpCisJCQkJJiYgKGl0UHJvY2Vzc29yICE9ICgmIG1SZWR1bmRhbmN5UHJvY2Vzc29yKSkgKQorCQkJeworCQkJCWRlbGV0ZSggaXRQcm9jZXNzb3IgKTsKKwkJCX0KKwkJfQorCX0KKworCisJaW5saW5lIHZpcnR1YWwgdm9pZCBhcHBlbmQoQWJzdHJhY3RQcm9jZXNzb3JVbml0ICogYVByb2Nlc3NvcikKKwl7CisJCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9QT0lOVEVSX0VYSVQoIGFQcm9jZXNzb3IgKQorCQkJCTw8ICJQcm9jZXNzb3IgVW5pdCAhISEiCisJCQkJPDwgU0VORF9FWElUOworCisvLyEhW01JR1JBVElPTl0KKy8vCQlBVk1fT1NfQVNTRVJUX1dBUk5JTkdfQUxFUlQoIGFQcm9jZXNzb3IgIT0gKCYgbU1haW5Qcm9jZXNzb3IpICkKKy8vCQkJCTw8ICJVbmV4cGVjdGVkIE1haW5Qcm9jZXNzb3IgISEhIgorLy8JCQkJPDwgU0VORF9BTEVSVDsKKy8vCQlBVk1fT1NfQVNTRVJUX1dBUk5JTkdfQUxFUlQoIGFQcm9jZXNzb3IgIT0gKCYgbVF1ZXVlUHJvY2Vzc29yKSApCisvLwkJCQk8PCAiVW5leHBlY3RlZCBRdWV1ZVByb2Nlc3NvciAhISEiCisvLwkJCQk8PCBTRU5EX0FMRVJUOworLy8JCUFWTV9PU19BU1NFUlRfV0FSTklOR19BTEVSVCggYVByb2Nlc3NvciAhPSAoJiBtUmVkdW5kYW5jeVByb2Nlc3NvcikgKQorLy8JCQkJPDwgIlVuZXhwZWN0ZWQgUXVldWVQcm9jZXNzb3IgISEhIgorLy8JCQkJPDwgU0VORF9BTEVSVDsKKworCQkvLyBEb24ndCBhcHBlbmQgPDwgbU1haW5Qcm9jZXNzb3IgfCBtUXVldWVQcm9jZXNzb3IgPj4KKwkJaWYoIChhUHJvY2Vzc29yICE9ICgmIG1NYWluUHJvY2Vzc29yKSkKKwkJCSYmIChhUHJvY2Vzc29yICE9ICgmIG1RdWV1ZVByb2Nlc3NvcikpCisJCQkmJiAoYVByb2Nlc3NvciAhPSAoJiBtUmVkdW5kYW5jeVByb2Nlc3NvcikpICkKKwkJeworCQkJbUNvbnRyb2xsZXJVbml0cy5hcHBlbmQoIGFQcm9jZXNzb3IgKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEdFVFRFUgorCSAqIG1TeW1iZXhFbmdpbmUKKwkgKiBDb25maWd1cmF0aW9uCisJICovCisJaW5saW5lIFN5bWJleEVuZ2luZSAmIGdldFN5bWJleEVuZ2luZSgpCisJeworCQlyZXR1cm4oIG1TeW1iZXhFbmdpbmUgKTsKKwl9CisKKwlpbmxpbmUgY29uc3QgU3ltYmV4RW5naW5lICYgZ2V0U3ltYmV4RW5naW5lKCkgY29uc3QKKwl7CisJCXJldHVybiggbVN5bWJleEVuZ2luZSApOworCX0KKworCS8qKgorCSAqIEdFVFRFUgorCSAqIENvbmZpZ3VyYXRpb24KKwkgKi8KKwlDb25maWd1cmF0aW9uICYgZ2V0Q29uZmlndXJhdGlvbigpIGNvbnN0OworCisJLyoqCisJICogR0VUVEVSCisJICogQnVpbGRlcgorCSAqLworCUJ1aWxkZXIgJiBnZXRCdWlsZGVyKCk7CisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBBdm1QcmltaXRpdmVQcm9jZXNzb3IKKwkgKi8KKwlBdm1QcmltaXRpdmVQcm9jZXNzb3IgJiBnZXRQcmltaXRpdmVQcm9jZXNzb3IoKTsKKworCisJLyoqCisJICogR0VUVEVSCisJICogbUF1dG9Db25maWd1cmUKKwkgKiBtQXV0b1N0YXJ0CisJICovCisJaW5saW5lIGJvb2wgaXNBdXRvQ29uZmlndXJlKCkgY29uc3QKKwl7CisJCXJldHVybiggbUF1dG9Db25maWd1cmUgKTsKKwl9CisKKwlpbmxpbmUgYm9vbCBpc0F1dG9TdGFydCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1BdXRvU3RhcnQgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIG1FeGVjdXRpb25RdWV1ZQorCSAqLworCWlubGluZSBFeGVjdXRpb25RdWV1ZSAmIGdldEV4ZWN1dGlvblF1ZXVlKCkKKwl7CisJCXJldHVybiggbVF1ZXVlUHJvY2Vzc29yICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBtTWFpblByb2Nlc3NvcgorCSAqLworCWlubGluZSBNYWluUHJvY2Vzc29yVW5pdCAmIGdldE1haW5Qcm9jZXNzb3IoKQorCXsKKwkJcmV0dXJuKCBtTWFpblByb2Nlc3NvciApOworCX0KKworCWlubGluZSBjb25zdCBNYWluUHJvY2Vzc29yVW5pdCAmIGdldE1haW5Qcm9jZXNzb3IoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtTWFpblByb2Nlc3NvciApOworCX0KKworCS8qKgorCSAqIEdFVFRFUgorCSAqIG1SZWR1bmRhbmN5UHJvY2Vzc29yCisJICovCisJaW5saW5lIFJlZHVuZGFuY3lGaWx0ZXIgJiBnZXRSZWR1bmRhbmN5UHJvY2Vzc29yKCkKKwl7CisJCXJldHVybiggbVJlZHVuZGFuY3lQcm9jZXNzb3IgKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUgorCSAqIG1Db250cm9sbGVyVW5pdHMKKwkgKi8KKwlpbmxpbmUgQ29tcG9zaXRlQ29udHJvbGxlclVuaXQgJiBnZXRDb250cm9sbGVyVW5pdHMoKQorCXsKKwkJcmV0dXJuKCBtQ29udHJvbGxlclVuaXRzICk7CisJfQorCisJLyoqCisJICogR0VUVEVSCisJICogbUNvbnRyb2xsZXJVbml0cworCSAqIGJ5IHBhcmFtZXRlciBXT2JqZWN0IC8gRnVsbHlRdWFsaWZpZWROYW1lSUQKKwkgKi8KKwlpbmxpbmUgQWJzdHJhY3RQcm9jZXNzb3JVbml0ICogZ2V0Q29udHJvbGxlclVuaXQoCisJCQljb25zdCBJUHJvY2Vzc29yVW5pdFJlZ2lzdHJhdGlvbiAmIGFSZWdpc3RlclRvb2wpCisJeworCQlpZiggbU1haW5Qcm9jZXNzb3IuaXNSZWdpc3RlclRvb2woIGFSZWdpc3RlclRvb2wgKSApCisJCXsKKwkJCXJldHVybiggJiBtTWFpblByb2Nlc3NvciApOworCQl9CisJCWVsc2UgaWYoIG1RdWV1ZVByb2Nlc3Nvci5pc1JlZ2lzdGVyVG9vbCggYVJlZ2lzdGVyVG9vbCApICkKKwkJeworCQkJcmV0dXJuKCAmIG1RdWV1ZVByb2Nlc3NvciApOworCQl9CisJCWVsc2UgaWYoIG1SZWR1bmRhbmN5UHJvY2Vzc29yLmlzUmVnaXN0ZXJUb29sKCBhUmVnaXN0ZXJUb29sICkgKQorCQl7CisJCQlyZXR1cm4oICYgbVJlZHVuZGFuY3lQcm9jZXNzb3IgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybiggbUNvbnRyb2xsZXJVbml0cy5nZXRDb250cm9sbGVyVW5pdCggYVJlZ2lzdGVyVG9vbCApICk7CisJCX0KKwl9CisKKwlpbmxpbmUgQWJzdHJhY3RQcm9jZXNzb3JVbml0ICogZ2V0Q29udHJvbGxlclVuaXQoCisJCQlXT2JqZWN0ICogd2ZQcm9jZXNzb3JPYmplY3QpCisJeworCQlpZiggbU1haW5Qcm9jZXNzb3IuZ2V0UGFyYW1ldGVyV09iamVjdCgpID09IHdmUHJvY2Vzc29yT2JqZWN0ICkKKwkJeworCQkJcmV0dXJuKCAmIG1NYWluUHJvY2Vzc29yICk7CisJCX0KKwkJZWxzZSBpZiggbVF1ZXVlUHJvY2Vzc29yLmdldFBhcmFtZXRlcldPYmplY3QoKSA9PSB3ZlByb2Nlc3Nvck9iamVjdCApCisJCXsKKwkJCXJldHVybiggJiBtUXVldWVQcm9jZXNzb3IgKTsKKwkJfQorCQllbHNlIGlmKCBtUmVkdW5kYW5jeVByb2Nlc3Nvci5nZXRQYXJhbWV0ZXJXT2JqZWN0KCkgPT0gd2ZQcm9jZXNzb3JPYmplY3QgKQorCQl7CisJCQlyZXR1cm4oICYgbVJlZHVuZGFuY3lQcm9jZXNzb3IgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybiggbUNvbnRyb2xsZXJVbml0cy5nZXRDb250cm9sbGVyVW5pdCggd2ZQcm9jZXNzb3JPYmplY3QgKSApOworCQl9CisJfQorCisJaW5saW5lIEFic3RyYWN0UHJvY2Vzc29yVW5pdCAqIGdldENvbnRyb2xsZXJVbml0KAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRnVsbHlRdWFsaWZpZWROYW1lSUQpCisJeworCQlpZiggbU1haW5Qcm9jZXNzb3IuZ2V0UGFyYW1ldGVyV09iamVjdCgpCisJCQkJLT5mcW5FcXVhbHMoIGFGdWxseVF1YWxpZmllZE5hbWVJRCApICkKKwkJeworCQkJcmV0dXJuKCAmIG1NYWluUHJvY2Vzc29yICk7CisJCX0KKwkJZWxzZSBpZiggbVF1ZXVlUHJvY2Vzc29yLmdldFBhcmFtZXRlcldPYmplY3QoKQorCQkJCS0+ZnFuRXF1YWxzKCBhRnVsbHlRdWFsaWZpZWROYW1lSUQgKSApCisJCXsKKwkJCXJldHVybiggJiBtUXVldWVQcm9jZXNzb3IgKTsKKwkJfQorCQllbHNlIGlmKCBtUmVkdW5kYW5jeVByb2Nlc3Nvci5nZXRQYXJhbWV0ZXJXT2JqZWN0KCkKKwkJCQktPmZxbkVxdWFscyggYUZ1bGx5UXVhbGlmaWVkTmFtZUlEICkgKQorCQl7CisJCQlyZXR1cm4oICYgbVJlZHVuZGFuY3lQcm9jZXNzb3IgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybiggbUNvbnRyb2xsZXJVbml0cy5nZXRDb250cm9sbGVyVW5pdCggYUZ1bGx5UXVhbGlmaWVkTmFtZUlEICkgKTsKKwkJfQorCX0KKworCisJLyoqCisJICogR0VUVEVSCisJICogbVByZXByb2Nlc3NvcgorCSAqIG1QcmVwcm9jZXNzb3JDb250cm9sbGVyVW5pdHMKKwkgKi8KKwlpbmxpbmUgQ29tcG9zaXRlQ29udHJvbGxlclVuaXQgJiBnZXRQcmVwcm9jZXNzb3IoKQorCXsKKwkJcmV0dXJuKCBtUHJlcHJvY2Vzc29yQ29udHJvbGxlclVuaXRzICk7CisJfQorCisJaW5saW5lIHZvaWQgYWRkUHJlcHJvY2Vzc29yKEFic3RyYWN0UHJvY2Vzc29yVW5pdCAqIGFGQU0pCisJeworCQltUHJlcHJvY2Vzc29yQ29udHJvbGxlclVuaXRzLmFkZENvbnRyb2xsZXJVbml0KCBhRkFNICk7CisJfQorCisJaW5saW5lIHZvaWQgYXBwZW5kUHJlcHJvY2Vzc29yKEFic3RyYWN0UHJvY2Vzc29yVW5pdCAqIGFGQU0pCisJeworCQltUHJlcHJvY2Vzc29yQ29udHJvbGxlclVuaXRzLmFwcGVuZENvbnRyb2xsZXJVbml0KCBhRkFNICk7CisJfQorCisJaW5saW5lIGJvb2wgcmVnaXN0ZXJQcmVwcm9jZXNzb3IoQWJzdHJhY3RQcm9jZXNzb3JVbml0ICogYUZBTSkKKwl7CisJCXJldHVybiggbVByZXByb2Nlc3NvckNvbnRyb2xsZXJVbml0cy5yZWdpc3RlclByZXByb2Nlc3NvciggYUZBTSApICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBtUG9zdHByb2Nlc3NvcgorCSAqIG1Qb3N0cHJvY2Vzc29yQ29udHJvbGxlclVuaXRzCisJICovCisJaW5saW5lIENvbXBvc2l0ZUNvbnRyb2xsZXJVbml0ICYgZ2V0UG9zdHByb2Nlc3NvcigpCisJeworCQlyZXR1cm4oIG1Qb3N0cHJvY2Vzc29yQ29udHJvbGxlclVuaXRzICk7CisJfQorCisJaW5saW5lIHZvaWQgYWRkUG9zdHByb2Nlc3NvcihBYnN0cmFjdFByb2Nlc3NvclVuaXQgKiBhRkFNKQorCXsKKwkJbVBvc3Rwcm9jZXNzb3JDb250cm9sbGVyVW5pdHMuYWRkQ29udHJvbGxlclVuaXQoIGFGQU0gKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBhcHBlbmRQb3N0cHJvY2Vzc29yKEFic3RyYWN0UHJvY2Vzc29yVW5pdCAqIGFGQU0pCisJeworCQltUG9zdHByb2Nlc3NvckNvbnRyb2xsZXJVbml0cy5hcHBlbmRDb250cm9sbGVyVW5pdCggYUZBTSApOworCX0KKworCWlubGluZSBib29sIHJlZ2lzdGVyUG9zdHByb2Nlc3NvcihBYnN0cmFjdFByb2Nlc3NvclVuaXQgKiBhRkFNKQorCXsKKwkJcmV0dXJuKCBtUG9zdHByb2Nlc3NvckNvbnRyb2xsZXJVbml0cy5yZWdpc3RlclBvc3Rwcm9jZXNzb3IoIGFGQU0gKSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSCisJICogbVByZWZpbHRlcgorCSAqIG1QcmVmaWx0ZXJDb250cm9sbGVyVW5pdHMKKwkgKi8KKwlpbmxpbmUgQ29tcG9zaXRlQ29udHJvbGxlclVuaXQgJiBnZXRQcmVmaWx0ZXIoKQorCXsKKwkJcmV0dXJuKCBtUHJlZmlsdGVyQ29udHJvbGxlclVuaXRzICk7CisJfQorCisJaW5saW5lIHZvaWQgYWRkUHJlZmlsdGVyKEFic3RyYWN0UHJvY2Vzc29yVW5pdCAqIGFGQU0pCisJeworCQltUHJlZmlsdGVyQ29udHJvbGxlclVuaXRzLmFkZENvbnRyb2xsZXJVbml0KCBhRkFNICk7CisJfQorCisJaW5saW5lIHZvaWQgYXBwZW5kUHJlZmlsdGVyKEFic3RyYWN0UHJvY2Vzc29yVW5pdCAqIGFGQU0pCisJeworCQltUHJlZmlsdGVyQ29udHJvbGxlclVuaXRzLmFwcGVuZENvbnRyb2xsZXJVbml0KCBhRkFNICk7CisJfQorCisJaW5saW5lIGJvb2wgcmVnaXN0ZXJQcmVmaWx0ZXIoQWJzdHJhY3RQcm9jZXNzb3JVbml0ICogYUZBTSkKKwl7CisJCXJldHVybiggbVByZWZpbHRlckNvbnRyb2xsZXJVbml0cy5yZWdpc3RlclByZWZpbHRlciggYUZBTSApICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBtUG9zdGZpbHRlcgorCSAqIG1Qb3N0ZmlsdGVyQ29udHJvbGxlclVuaXRzCisJICovCisJaW5saW5lIENvbXBvc2l0ZUNvbnRyb2xsZXJVbml0ICYgZ2V0UG9zdGZpbHRlcigpCisJeworCQlyZXR1cm4oIG1Qb3N0ZmlsdGVyQ29udHJvbGxlclVuaXRzICk7CisJfQorCisJaW5saW5lIHZvaWQgYWRkUG9zdGZpbHRlcihBYnN0cmFjdFByb2Nlc3NvclVuaXQgKiBhRkFNKQorCXsKKwkJbVBvc3RmaWx0ZXJDb250cm9sbGVyVW5pdHMuYWRkQ29udHJvbGxlclVuaXQoIGFGQU0gKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBhcHBlbmRQb3N0ZmlsdGVyKEFic3RyYWN0UHJvY2Vzc29yVW5pdCAqIGFGQU0pCisJeworCQltUG9zdGZpbHRlckNvbnRyb2xsZXJVbml0cy5hcHBlbmRDb250cm9sbGVyVW5pdCggYUZBTSApOworCX0KKworCWlubGluZSBib29sIHJlZ2lzdGVyUG9zdGZpbHRlcihBYnN0cmFjdFByb2Nlc3NvclVuaXQgKiBhRkFNKQorCXsKKwkJcmV0dXJuKCBtUG9zdGZpbHRlckNvbnRyb2xsZXJVbml0cy5yZWdpc3RlclBvc3RmaWx0ZXIoIGFGQU0gKSApOworCX0KKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIENPTkZJR1VSRSAgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJdmlydHVhbCBib29sIHByZUNvbmZpZ3VyZSgpOworCisJdmlydHVhbCBib29sIGNvbmZpZ3VyZSgpOworCisJdmlydHVhbCBib29sIGNvbmZpZ3VyZUltcGwoKQorCXsKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisJaW5saW5lIGJvb2wgY29uZmlndXJlQ29udHJvbGxlclVuaXRzKCkKKwl7CisJCXJldHVybiggbUNvbnRyb2xsZXJVbml0cy5jb25maWd1cmVDb250cm9sbGVyVW5pdHMoKSApOworCX0KKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBJTklUIC8gRVhJVCAgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCXZpcnR1YWwgYm9vbCBpbml0SW1wbCgpOworCisJdmlydHVhbCBib29sIGV4aXRJbXBsKCk7CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gKCBQUkUgLyBQT1NUICkgUFJPQ0VTUyAgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJdmlydHVhbCBib29sIHByZXByb2Nlc3MoKTsKKworCXZpcnR1YWwgYm9vbCBwb3N0cHJvY2VzcygpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gRklMVEVSSU5HICBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwl2aXJ0dWFsIGJvb2wgZmlsdGVyaW5nSW5pdGlhbGl6ZSgpOworCisJdmlydHVhbCBib29sIGZpbHRlcmluZ0ZpbmFsaXplKCk7CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gKCBQUkUgLyBQT1NUICkgRklMVEVSICBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwl2aXJ0dWFsIGJvb2wgcHJlZmlsdGVyKCk7CisKKwlib29sIGZpbmFsaXplUHJlZmlsdGVyaW5nKCk7CisKKworCXZpcnR1YWwgYm9vbCBwb3N0ZmlsdGVyKCk7CisKKwlib29sIGZpbmFsaXplUG9zdGZpbHRlcmluZygpOworCisKKwkvKioKKwkgKiBIYXMgV29yaworCSAqLworCWlubGluZSBib29sIGhhc1dvcmsoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtUXVldWVQcm9jZXNzb3IuaGFzV29yaygpICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzUmVhZHlXb3JrKCkgY29uc3QKKwl7CisJCXJldHVybiggbVF1ZXVlUHJvY2Vzc29yLmhhc1JlYWR5V29yaygpICk7CisJfQorCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gUFJPQ0VTU09SIFJFUVVFU1QgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8qKgorCSAqIFJFUVVFU1RfU1RPUF9TVEFUVVMKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCB2b2lkIGhhbmRsZVJlcXVlc3RTdG9wKCkKKwl7CisJCW1RdWV1ZVByb2Nlc3Nvci5oYW5kbGVSZXF1ZXN0U3RvcCgpOworCX0KKworCS8qKgorCSAqIFJFUVVFU1RfUkVMRUFTRV9TVEFUVVMKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCB2b2lkIGhhbmRsZVJlcXVlc3RSZWxlYXNlKCkKKwl7CisJCW1RdWV1ZVByb2Nlc3Nvci5oYW5kbGVSZXF1ZXN0UmVsZWFzZSgpOworCX0KKworCWlubGluZSB2b2lkIGhhbmRsZVJlcXVlc3RSZWxlYXNlKEFic3RyYWN0UHJvY2Vzc29yVW5pdCAqIGFSZXF1ZXN0b3IpCisJeworCQltUHJlZmlsdGVyQ29udHJvbGxlclVuaXRzLmhhbmRsZVJlcXVlc3RSZWxlYXNlKGFSZXF1ZXN0b3IpOworCisJCW1Qb3N0ZmlsdGVyQ29udHJvbGxlclVuaXRzLmhhbmRsZVJlcXVlc3RSZWxlYXNlKGFSZXF1ZXN0b3IpOworCisJCWFSZXF1ZXN0b3ItPmhhbmRsZVJlcXVlc3RSZWxlYXNlKCk7CisJfQorCisJLyoqCisJICogUkVRVUVTVF9SRVNFVF9TVEFUVVMKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCB2b2lkIGhhbmRsZVJlcXVlc3RSZXNldCgpCisJeworCQltUXVldWVQcm9jZXNzb3IuaGFuZGxlUmVxdWVzdFJlc2V0KCk7CisJfQorCisJLyoqCisJICogUkVRVUVTVF9SRVNUQVJUX1NUQVRVUworCSAqLworCWlubGluZSB2aXJ0dWFsIHZvaWQgaGFuZGxlUmVxdWVzdFJlc3RhcnQoKQorCXsKKwkJbVF1ZXVlUHJvY2Vzc29yLmhhbmRsZVJlcXVlc3RSZXN0YXJ0KCk7CisJfQorCisJLyoqCisJICogUkVRVUVTVF9DT05USU5VRV9TVEFUVVMKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCB2b2lkIGhhbmRsZVJlcXVlc3RDb250aW51ZSgpCisJeworCQltUXVldWVQcm9jZXNzb3IuaGFuZGxlUmVxdWVzdENvbnRpbnVlKCk7CisJfQorCisJLyoqCisJICogUkVRVUVTVF9SRVFVRVVFX1dBSVRJTkdfU1RBVFVTCisJICovCisJaW5saW5lIHZpcnR1YWwgdm9pZCBoYW5kbGVSZXF1ZXN0UmVxdWV1ZVdhaXRpbmcoCisJCQlBYnN0cmFjdFByb2Nlc3NvclVuaXQgKiBhUmVxdWVzdG9yKQorCXsKKwkJbVF1ZXVlUHJvY2Vzc29yLmhhbmRsZVJlcXVlc3RSZXF1ZXVlV2FpdGluZyggYVJlcXVlc3RvciApOworCX0KKworCS8qKgorCSAqIFJFUVVFU1RfUkVRVUVVRV9SRVNFUlZFX1NUQVRVUworCSAqLworCWlubGluZSB2aXJ0dWFsIHZvaWQgaGFuZGxlUmVxdWVzdFJlcXVldWVSZXNlcnZlKAorCQkJQWJzdHJhY3RQcm9jZXNzb3JVbml0ICogYVJlcXVlc3RvcikKKwl7CisJCW1RdWV1ZVByb2Nlc3Nvci5oYW5kbGVSZXF1ZXN0UmVxdWV1ZVJlc2VydmUoIGFSZXF1ZXN0b3IgKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBSRVBPUlQgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJdmlydHVhbCB2b2lkIHJlcG9ydChPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKKworCS8qKgorCSAqIEVWQUwgVFJBQ0UKKwkgKi8KKwl2aXJ0dWFsIHZvaWQgdHJhY2VCb3VuZEV2YWwoT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCisJdmlydHVhbCB2b2lkIHRyYWNlUHJlRXZhbChPdXRTdHJlYW0gJiBvcywKKwkJCWNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKSBjb25zdDsKKworCXZpcnR1YWwgdm9pZCB0cmFjZVBvc3RFdmFsKE91dFN0cmVhbSAmIG9zLAorCQkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpIGNvbnN0OworCisJdmlydHVhbCB2b2lkIHJlcG9ydEV2YWwoT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gVU5JVCBURVNUIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXZpcnR1YWwgdm9pZCB0ZGRVbml0UmVwb3J0KE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIE5PTi1SRUdSRVNTSU9OIFRFU1QgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJdmlydHVhbCB2b2lkIHRkZFJlZ3Jlc3Npb25SZXBvcnQoT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gU0VSSUFMSVpBVElPTiBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwl2aXJ0dWFsIHZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCit9OworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworCisjZW5kaWYgLyogU0VXX1NZTUJFWF9DT05UUk9MTEVSX1VOSVRfTUFOQUdFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc2V3L1N5bWJleERpc3BhdGNoZXIuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc2V3L1N5bWJleERpc3BhdGNoZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5OTA1MzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9zZXcvU3ltYmV4RGlzcGF0Y2hlci5jcHAKQEAgLTAsMCArMSwxNDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlN5bWJleERpc3BhdGNoZXIuaCIKKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkNvbnRleHQuaD4KKworI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9XT2JqZWN0Lmg+CisKKyNpbmNsdWRlIDxzZXcvU3ltYmV4RW5naW5lLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorICogR0VUVEVSCisgKiBBdm1QcmltaXRpdmVQcm9jZXNzb3IKKyAqLworQXZtUHJpbWl0aXZlUHJvY2Vzc29yICYgU3ltYmV4RGlzcGF0Y2hlcjo6Z2V0UHJpbWl0aXZlUHJvY2Vzc29yKCkgY29uc3QKK3sKKwlyZXR1cm4oIG1TeW1iZXhFbmdpbmUuZ2V0UHJpbWl0aXZlUHJvY2Vzc29yKCkgKTsKK30KKworCisvKioKKyAqIENPTkZJR1VSRQorICovCitib29sIFN5bWJleERpc3BhdGNoZXI6OmNvbmZpZ3VyZSgpCit7CisJaWYoIG5vdCBtU3ltYmV4UHJvY2Vzc29yLmNvbmZpZ3VyZSgpICkKKwl7CisJCUFWTV9PU19FUlJPUl9BTEVSVCA8PCAiU3ltYmV4RGlzcGF0Y2hlcjo6U3ltYmV4UHJvY2Vzc29yOiBjb25maWd1cmUgZmFpbGVkICEhISIKKwkJCQk8PCBTRU5EX0FMRVJUOworCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwlpZiggbm90IG1TeW1iZXhDb250cm9sbGVyLmNvbmZpZ3VyZSgpICkKKwl7CisJCUFWTV9PU19FUlJPUl9BTEVSVCA8PCAiU3ltYmV4RGlzcGF0Y2hlcjo6U3ltYmV4Q29udHJvbGxlcjogY29uZmlndXJlIGZhaWxlZCAhISEiCisJCQkJPDwgU0VORF9BTEVSVDsKKworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJLy8gUmVnaXN0cmF0aW9uIHRvIGhhbmRsZXIgRGVzdHJveUN0eCBldmVudAorCW1TeW1iZXhFdmVudE1hbmFnZXIucmVnaXN0ZXJIYW5kbGVyRXZlbnREZXN0cm95Q3R4KHRoaXMpOworCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworLyoqCisgKiBJTklUCisgKi8KK2Jvb2wgU3ltYmV4RGlzcGF0Y2hlcjo6aW5pdEltcGwoKQoreworCWJvb2wgaXNFQ19PSyA9IG1TeW1iZXhQcm9jZXNzb3IuaW5pdCgpOworCisJYm9vbCBpc0FDX09LID0gbVN5bWJleENvbnRyb2xsZXIuaW5pdCgpOworCisJcmV0dXJuKCBpc0VDX09LICYmIGlzQUNfT0sgKTsKK30KKworLyoqCisgKiBFWElUCisgKi8KK2Jvb2wgIFN5bWJleERpc3BhdGNoZXI6OmV4aXRJbXBsKCkKK3sKKwlib29sIGlzRUNfT0sgPSBtU3ltYmV4UHJvY2Vzc29yLmV4aXQoKTsKKworCWJvb2wgaXNBQ19PSyA9IG1TeW1iZXhDb250cm9sbGVyLmV4aXQoKTsKKworCXJldHVybiggaXNFQ19PSyAmJiBpc0FDX09LICk7Cit9CisKKworLyoqCisgKiBQUkUgUFJPQ0VTUworICovCitib29sICBTeW1iZXhEaXNwYXRjaGVyOjpwcmVwcm9jZXNzKCkKK3sKKwlib29sIGlzRUNfT0sgPSBtU3ltYmV4UHJvY2Vzc29yLnByZXByb2Nlc3MoKTsKKworCWJvb2wgaXNBQ19PSyA9IG1TeW1iZXhDb250cm9sbGVyLnByZXByb2Nlc3MoKTsKKworCXJldHVybiggaXNFQ19PSyAmJiBpc0FDX09LICk7Cit9CisKKworLyoqCisgKiBQT1NUIFBST0NFU1MKKyAqLworYm9vbCAgU3ltYmV4RGlzcGF0Y2hlcjo6cG9zdHByb2Nlc3MoKQoreworCWJvb2wgaXNFQ19PSyA9IG1TeW1iZXhQcm9jZXNzb3IucG9zdHByb2Nlc3MoKTsKKworCWJvb2wgaXNBQ19PSyA9IG1TeW1iZXhDb250cm9sbGVyLnBvc3Rwcm9jZXNzKCk7CisKKwlyZXR1cm4oIGlzRUNfT0sgJiYgaXNBQ19PSyApOworfQorCisKKy8qKgorICogc3RhcnQKKyAqLwordm9pZCBTeW1iZXhEaXNwYXRjaGVyOjpzdGFydCgpCit7CisJbVN5bWJleFByb2Nlc3Nvci5zZXRMaWZlY3ljbGVTdGFydGVkKCk7CisJbVN5bWJleENvbnRyb2xsZXIuc2V0TGlmZWN5Y2xlU3RhcnRlZCgpOworCisJbVN5bWJleENvbnRyb2xsZXIuYW5hbHlzZVJlYWR5KCk7CisKKwltU3ltYmV4UHJvY2Vzc29yLmluaXRTdGVwKCk7CisKKwltU3ltYmV4Q29udHJvbGxlci5hbmFseXNlUmVzdWx0KCk7CisKKwl3aGlsZSggbVN5bWJleENvbnRyb2xsZXIuaXNMaWZlY3ljbGVSdW5uYWJsZSgpICkKKwl7CisJCW1TeW1iZXhDb250cm9sbGVyLmFuYWx5c2VSZWFkeSgpOworCisJCW1TeW1iZXhQcm9jZXNzb3IucnVuU3RlcCgpOworCisJCW1TeW1iZXhDb250cm9sbGVyLmFuYWx5c2VSZXN1bHQoKTsKKwl9CisKKwkvLyBMYXN0IHN0ZXAtZXZhbCB0cmFjZQorCXJlcG9ydEV2YWwoKTsKK30KKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9zZXcvU3ltYmV4RGlzcGF0Y2hlci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc2V3L1N5bWJleERpc3BhdGNoZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmU5NzU2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc2V3L1N5bWJleERpc3BhdGNoZXIuaApAQCAtMCwwICsxLDI5MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBTRVdfU1lNQkVYX0RJU1BBVENIRVJfSF8KKyNkZWZpbmUgU0VXX1NZTUJFWF9ESVNQQVRDSEVSX0hfCisKKyNpbmNsdWRlIDxjb21tb24vQXZtUG9pbnRlci5oPgorI2luY2x1ZGUgPGNvbW1vbi9SdW5uYWJsZUVsZW1lbnQuaD4KKworI2luY2x1ZGUgPHNldy9TeW1iZXhDb250cm9sbGVyLmg+CisjaW5jbHVkZSA8c2V3L1N5bWJleEV2ZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPHNldy9TeW1iZXhQcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxzZXcvU3ltYmV4Q29udHJvbGxlclJlcXVlc3RNYW5hZ2VyLmg+CisKKworCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjbGFzcyBBdm1QcmltaXRpdmVQcm9jZXNzb3I7CisKK2NsYXNzIEV4ZWN1dGlvbkNvbnRleHQ7CisKK2NsYXNzIFN5bWJleENvbnRyb2xsZXJVbml0TWFuYWdlcjsKK2NsYXNzIFN5bWJleEVuZ2luZTsKKworCitjbGFzcyBTeW1iZXhEaXNwYXRjaGVyIDoKKwkJcHVibGljIFJ1bm5hYmxlRWxlbWVudCwKKwkJcHVibGljIElIYW5kbGVyRXZlbnREZXN0cm95Q3R4Cit7CisKKwlBVk1fREVDTEFSRV9VTkNMT05BQkxFX0NMQVNTKFN5bWJleERpc3BhdGNoZXIpCisKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlTeW1iZXhFbmdpbmUgJiBtU3ltYmV4RW5naW5lOworCisJU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyICYgbUNvbnRyb2xsZXJVbml0TWFuYWdlcjsKKworCVN5bWJleEV2ZW50TWFuYWdlciBtU3ltYmV4RXZlbnRNYW5hZ2VyOworCisJU3ltYmV4Q29udHJvbGxlclJlcXVlc3RNYW5hZ2VyIG1TeW1iZXhDb250cm9sbGVyUmVxdWVzdE1hbmFnZXI7CisKKwlTeW1iZXhQcm9jZXNzb3IgbVN5bWJleFByb2Nlc3NvcjsKKworCVN5bWJleENvbnRyb2xsZXIgbVN5bWJleENvbnRyb2xsZXI7CisKKwlhdm1fdWludDMyX3QgbU5leHRFdmFsTnVtYmVyOworCisJYXZtX3VpbnQzMl90IG1HbG9iYWxHcmFwaFdpZHRoOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlTeW1iZXhEaXNwYXRjaGVyKFN5bWJleEVuZ2luZSAmIGFuRW5naW5lLCBXT2JqZWN0ICogd2ZQYXJhbWV0ZXJPYmplY3QsCisJCQlTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXIgJiBhQ29udHJvbGxlclVuaXRNYW5hZ2VyKQorCTogUnVubmFibGVFbGVtZW50KCB3ZlBhcmFtZXRlck9iamVjdCApLAorCW1TeW1iZXhFbmdpbmUoIGFuRW5naW5lICksCisJbUNvbnRyb2xsZXJVbml0TWFuYWdlciggYUNvbnRyb2xsZXJVbml0TWFuYWdlciApLAorCisJbVN5bWJleEV2ZW50TWFuYWdlciggKSwKKworCW1TeW1iZXhDb250cm9sbGVyUmVxdWVzdE1hbmFnZXIoICgqdGhpcykgLAorCQkJd2ZQYXJhbWV0ZXJPYmplY3QgLCBhQ29udHJvbGxlclVuaXRNYW5hZ2VyICksCisKKwltU3ltYmV4UHJvY2Vzc29yKCAoKnRoaXMpICwKKwkJCXdmUGFyYW1ldGVyT2JqZWN0ICwgYUNvbnRyb2xsZXJVbml0TWFuYWdlciApLAorCisJbVN5bWJleENvbnRyb2xsZXIgKCAoKnRoaXMpICwKKwkJCXdmUGFyYW1ldGVyT2JqZWN0ICwgYUNvbnRyb2xsZXJVbml0TWFuYWdlciApLAorCisJbU5leHRFdmFsTnVtYmVyKCAwICksCisJbUdsb2JhbEdyYXBoV2lkdGgoIDEgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgflN5bWJleERpc3BhdGNoZXIoKQorCXsKKwkJLy8gVW5yZWdpc3RyYXRpb24KKwkJbVN5bWJleEV2ZW50TWFuYWdlci51bnJlZ2lzdGVySGFuZGxlckV2ZW50RGVzdHJveUN0eCh0aGlzKTsKKwl9CisKKworCS8qKgorCSAqIENPTkZJR1VSRQorCSAqLworCWJvb2wgY29uZmlndXJlKCk7CisKKworCS8qKgorCSAqIFJFUE9SVCBUUkFDRQorCSAqLworCWlubGluZSB2aXJ0dWFsIHZvaWQgcmVwb3J0KE91dFN0cmVhbSAmIG9zKSBjb25zdAorCXsKKwkJbVN5bWJleFByb2Nlc3Nvci5yZXBvcnQob3MpOworCisJCW1TeW1iZXhDb250cm9sbGVyLnJlcG9ydChvcyk7CisJfQorCisKKwkvKioKKwkgKiBJTklUIC0gRVhJVAorCSAqLworCXZpcnR1YWwgYm9vbCBpbml0SW1wbCgpOworCisJdmlydHVhbCBib29sIGV4aXRJbXBsKCk7CisKKworCS8qKgorCSAqIFBSRSAtIFBPU1QgUFJPQ0VTUworCSAqLworCWJvb2wgcHJlcHJvY2VzcygpOworCisJYm9vbCBwb3N0cHJvY2VzcygpOworCisJLyoqCisJICogc3RhcnQKKwkgKi8KKwl2b2lkIHN0YXJ0KCk7CisKKwkvKioKKwkgKiBIYXMgV29yaworCSAqLworCWlubGluZSBib29sIGhhc1dvcmsoKSBjb25zdAorCXsKKwkJcmV0dXJuKCBtU3ltYmV4Q29udHJvbGxlclJlcXVlc3RNYW5hZ2VyLmhhc1JlcXVlc3RFbmFibGVkKCkKKwkJCQl8fCBtQ29udHJvbGxlclVuaXRNYW5hZ2VyLmhhc1dvcmsoKSApOworCX0KKworCWlubGluZSBib29sIGhhc1JlYWR5V29yaygpIGNvbnN0CisJeworCQlyZXR1cm4oIG1TeW1iZXhDb250cm9sbGVyUmVxdWVzdE1hbmFnZXIuaGFzbnRSZXF1ZXN0U3RvcCgpCisJCQkJJiYgbUNvbnRyb2xsZXJVbml0TWFuYWdlci5oYXNSZWFkeVdvcmsoKSApOworCX0KKworCisJLyoqCisJICogU2VuZCBhbiAgRXhlY3V0aW9uQ29udGV4dCB0bworCSAqIEV4ZWN1dGlvbiBvciBBbmFseXNlciB3b3JraW5nIFF1ZXVlCisJICovCisJaW5saW5lIHZvaWQgc2VuZFRvRXhlY3V0aW9uV29ya2luZ1F1ZXVlKEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDKQorCXsKKwkJbVN5bWJleFByb2Nlc3Nvci5hcHBlbmRTeW1iZXhDb250ZXh0KCBhbkVDICk7CisJfQorCisJaW5saW5lIHZvaWQgc2VuZFRvQW5hbHlzZXJXb3JraW5nUXVldWUoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpCisJeworCQltU3ltYmV4Q29udHJvbGxlci5hcHBlbmRTeW1iZXhDb250ZXh0KCBhbkVDICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtU3ltYmV4RW5naW5lCisJICovCisJaW5saW5lIFN5bWJleEVuZ2luZSAmIGdldFN5bWJleEVuZ2luZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1TeW1iZXhFbmdpbmUgKTsKKwl9CisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBBdm1QcmltaXRpdmVQcm9jZXNzb3IKKwkgKi8KKwlBdm1QcmltaXRpdmVQcm9jZXNzb3IgJiBnZXRQcmltaXRpdmVQcm9jZXNzb3IoKSBjb25zdDsKKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVN5bWJleEV2ZW50TWFuYWdlcgorCSAqLworCWlubGluZSBTeW1iZXhFdmVudE1hbmFnZXIgJiBnZXRTeW1iZXhFdmVudE1hbmFnZXIoKQorCXsKKwkJcmV0dXJuKCBtU3ltYmV4RXZlbnRNYW5hZ2VyICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtU3ltYmV4Q29udHJvbGxlclJlcXVlc3RNYW5hZ2VyCisJICovCisJaW5saW5lIAlTeW1iZXhDb250cm9sbGVyUmVxdWVzdE1hbmFnZXIgJiBnZXRTeW1iZXhDb250cm9sbGVyUmVxdWVzdE1hbmFnZXIoKQorCXsKKwkJcmV0dXJuKCBtU3ltYmV4Q29udHJvbGxlclJlcXVlc3RNYW5hZ2VyICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtU3ltYmV4UHJvY2Vzc29yCisJICovCisJaW5saW5lIFN5bWJleFByb2Nlc3NvciAmIGdldFN5bWJleFByb2Nlc3NvcigpCisJeworCQlyZXR1cm4oIG1TeW1iZXhQcm9jZXNzb3IgKTsKKwl9CisKKwlpbmxpbmUgTGlzdE9mRXhlY3V0aW9uQ29udGV4dCAmIGdldEV4ZWN1dGlvbldvcmtpbmdRdWV1ZSgpCisJeworCQlyZXR1cm4oIG1TeW1iZXhQcm9jZXNzb3IuZ2V0U3ltYmV4Q29udGV4dHMoKSApOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbVN5bWJleENvbnRyb2xsZXIKKwkgKi8KKwlpbmxpbmUgU3ltYmV4Q29udHJvbGxlciAmIGdldFN5bWJleENvbnRyb2xsZXIoKQorCXsKKwkJcmV0dXJuKCBtU3ltYmV4Q29udHJvbGxlciApOworCX0KKworCS8qKgorCSAqIEhBTkRMRVIgZm9yIEV2ZW50IE5vdGlmaWNhdGlvbgorCSAqIERlc3Ryb3kgRXhlY3V0aW9uIENvbnRleHQKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCB2b2lkIGhhbmRsZUV2ZW50RGVzdHJveUN0eChFeGVjdXRpb25Db250ZXh0ICogYW5FQykKKwl7CisJCW1TeW1iZXhDb250cm9sbGVyLnJlbW92ZVN5bWJleENvbnRleHQoYW5FQyk7CisKKwkJbVN5bWJleFByb2Nlc3Nvci5yZW1vdmVTeW1iZXhDb250ZXh0KGFuRUMpOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbU5leHRFdmFsTnVtYmVyCisJICovCisJaW5saW5lIGF2bV91aW50MzJfdCBnZXRFdmFsTnVtYmVyKCkgY29uc3QKKwl7CisJCXJldHVybiggbU5leHRFdmFsTnVtYmVyICk7CisJfQorCisJaW5saW5lIGF2bV91aW50MzJfdCBuZXh0RXZhbE51bWJlcigpCisJeworCQlyZXR1cm4oICsrbU5leHRFdmFsTnVtYmVyICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtR2xvYmFsR3JhcGhXaWR0aAorCSAqLworCWlubGluZSBhdm1fdWludDMyX3QgZ2V0R2xvYmFsR3JhcGhXaWR0aCgpIGNvbnN0CisJeworCQlyZXR1cm4oIG1HbG9iYWxHcmFwaFdpZHRoICk7CisJfQorCisJaW5saW5lIGF2bV91aW50MzJfdCBuZXh0R2xvYmFsR3JhcGhXaWR0aCgpCisJeworCQlyZXR1cm4oICsrbUdsb2JhbEdyYXBoV2lkdGggKTsKKwl9CisKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIHJlcG9ydCBFdmFsCisJICovCisJaW5saW5lIHZvaWQgcmVwb3J0RXZhbCgpIGNvbnN0CisJeworCQltU3ltYmV4Q29udHJvbGxlci5yZXBvcnRFdmFsKCk7CisJfQorCit9OworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworCisjZW5kaWYgLypTRVdfU1lNQkVYX0RJU1BBVENIRVJfSF8qLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc2V3L1N5bWJleEVuZ2luZS5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9zZXcvU3ltYmV4RW5naW5lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTY1OTAwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc2V3L1N5bWJleEVuZ2luZS5jcHAKQEAgLTAsMCArMSw3MDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiA5IG1hcnMgMjAwOQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiU3ltYmV4RW5naW5lLmgiCisKKyNpbmNsdWRlIDxidWlsZGVyL0J1aWxkZXIuaD4KKyNpbmNsdWRlIDxwYXJzZXIvUGFyc2VyTWFuYWdlci5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZVN5c3RlbS5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uQ29udGV4dC5oPgorCisjaW5jbHVkZSA8c2V3L1N5bWJleERpc3BhdGNoZXIuaD4KKyNpbmNsdWRlIDxzZXcvV29ya2Zsb3cuaD4KKworI2luY2x1ZGUgPHV0aWwvRXhlY3V0aW9uVGltZS5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworLyoqCisgKiBDT05TVFJVQ1RPUgorICogRGVmYXVsdAorICovCitTeW1iZXhFbmdpbmU6OlN5bWJleEVuZ2luZShXb3JrZmxvdyAmIGFXb3JrZmxvdywKKwkJV09iamVjdCAqIHdmUGFyYW1ldGVyT2JqZWN0LCBhdm1fb2Zmc2V0X3QgYW5PZmZzZXQpCis6IFJ1bm5hYmxlRWxlbWVudCggd2ZQYXJhbWV0ZXJPYmplY3QgKSwKK21Xb3JrZmxvdyggYVdvcmtmbG93ICksCisKK21Db25maWd1cmF0aW9uKCAqdGhpcyAsIG1Xb3JrZmxvdyApLAorbVByaW1pdGl2ZVByb2Nlc3NvciggKnRoaXMgLCBtQ29uZmlndXJhdGlvbiApLAorCittQnVpbGRlciggKnRoaXMgLCBtQ29uZmlndXJhdGlvbiAgLCBtUHJpbWl0aXZlUHJvY2Vzc29yICksCittTG9hZGVyKCBtQ29uZmlndXJhdGlvbiwgbUJ1aWxkZXIgLCBtUHJpbWl0aXZlUHJvY2Vzc29yICksCisKK21Db250cm9sbGVyVW5pdE1hbmFnZXIoICp0aGlzICwgd2ZQYXJhbWV0ZXJPYmplY3QgKSwKK21TeW1iZXhEaXNwYXRjaGVyKCAqdGhpcyAsIHdmUGFyYW1ldGVyT2JqZWN0ICwgbUNvbnRyb2xsZXJVbml0TWFuYWdlciksCittRXhlY3V0aW9uVGltZU1hbmFnZXIoIGZhbHNlICksCisKK21PZmZzZXQoIGFuT2Zmc2V0ICksCisKK21QcmV2aW91c0VuZ2luZSggTlVMTCApLAorbU5leHRFbmdpbmUoIE5VTEwgKQoreworCS8vISEgTk9USElORworfQorCisKKy8qKgorICogQ09ORklHVVJFCisgKi8KK2Jvb2wgU3ltYmV4RW5naW5lOjpjb25maWd1cmUoKQoreworCU9TX1ZFUkJPU0lUWV9NSU5JTVVNX09SX0RFQlVHKCBBVk1fT1NfQ09VVCApIDw8IF9TRVdfCisJCQk8PCAiQ29uZmlndXJlIEVuZ2luZSBkaXJlY3RvcjogIiA8PCBzdHJVbmlxSWQoKSA8PCAiIC4uLiBTVEFSVCIKKwkJCTw8IHN0ZDo6ZW5kbDsKKworCUFWTV9PU19MT0cgPDwgX1NFV18KKwkJCTw8ICJDb25maWd1cmUgRW5naW5lIGRpcmVjdG9yOiAiIDw8IHN0clVuaXFJZCgpCisJCQk8PCBzdGQ6OmVuZGw7CisKKwlpZiggbm90IG1Db25maWd1cmF0aW9uLmNvbmZpZ3VyZShnZXRQYXJhbWV0ZXJXT2JqZWN0KCksCisJCSgobVByZXZpb3VzRW5naW5lICE9IE5VTEwpID8gJihtUHJldmlvdXNFbmdpbmUtPm1Db25maWd1cmF0aW9uKSA6IE5VTEwpKSApCisJeworCQlhdm1fc2V0X2V4aXRfY29kZSggQVZNX0VYSVRfQ09ORklHVVJFX0VSUk9SX0NPREUgKTsKKworQVZNX0lGX0RFQlVHX0ZMQUcoIENPTkZJR1VSSU5HICkKKwltQ29uZmlndXJhdGlvbi50b1N0cmVhbSggQVZNX09TX0xPRyApOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIENPTkZJR1VSSU5HICkKKworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCitBVk1fSUZfREVCVUdfRkxBRyggQ09ORklHVVJJTkcgKQorCW1Db25maWd1cmF0aW9uLnRvU3RyZWFtKCBBVk1fT1NfTE9HICk7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggQ09ORklHVVJJTkcgKQorCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vLy8vIFBSSU1JVElWRSBQUk9DRVNTT1IKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlpZiggbm90IG1QcmltaXRpdmVQcm9jZXNzb3IuY29uZmlndXJlKCkgKQorCXsKKwkJQVZNX09TX0VSUk9SX0FMRVJUIDw8ICJTeW1iZXhFbmdpbmU6OmNvbmZpZ3VyZTo+ICIKKwkJCQkJInRoZSBQcmltaXRpdmVQcm9jZXNzb3IgY29uZmlndXJhdGlvbiBmYWlsZWQgISEhIgorCQkJCTw8IFNFTkRfQUxFUlQ7CisKKwkJYXZtX3NldF9leGl0X2NvZGUoIEFWTV9FWElUX0NPTkZJR1VSRV9FUlJPUl9DT0RFICk7CisKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLyBCVUlMREVSIFBST0NFU1NPUgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlmKCBub3QgbUJ1aWxkZXIuY29uZmlndXJlKCkgKQorCXsKKwkJQVZNX09TX0VSUk9SX0FMRVJUIDw8ICJTeW1iZXhFbmdpbmU6OmNvbmZpZ3VyZTo+ICIKKwkJCQkJInRoZSBCdWlsZGVyIGNvbmZpZ3VyYXRpb24gZmFpbGVkICEhISIKKwkJCQk8PCBTRU5EX0FMRVJUOworCisJCWF2bV9zZXRfZXhpdF9jb2RlKCBBVk1fRVhJVF9DT05GSUdVUkVfRVJST1JfQ09ERSApOworCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8vLy8gTE9BREVSIFBST0NFU1NPUgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlmKCBub3QgbUxvYWRlci5jb25maWd1cmUoKSApCisJeworCQlBVk1fT1NfRVJST1JfQUxFUlQgPDwgIlN5bWJleEVuZ2luZTo6Y29uZmlndXJlOj4gIgorCQkJCQkidGhlIExvYWRlciBjb25maWd1cmF0aW9uIGZhaWxlZCAhISEiCisJCQkJPDwgU0VORF9BTEVSVDsKKworCQlhdm1fc2V0X2V4aXRfY29kZSggQVZNX0VYSVRfQ09ORklHVVJFX0VSUk9SX0NPREUgKTsKKworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vLy8vIFBBUlNJTkcKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlpZiggbUNvbmZpZ3VyYXRpb24uaGFzT3duZWRTcGVjaWZpY2F0aW9uKCkgKQorCXsKKwkJaWYoIG5vdCBzdGFydFBhcnNpbmcoKSApCisJCXsKK0FWTV9JRl9ERUJVR19FTkFCTEVEX09SKCBtQ29uZmlndXJhdGlvbi5pc0RlYnVnU3RhZ2VFbmFibGVkKCkgKQorCWlmKCBtQ29uZmlndXJhdGlvbi5oYXNTcGVjaWZpY2F0aW9uKCkgKQorCXsKKwkJbUNvbmZpZ3VyYXRpb24uc2F2ZVNwZWNpZmljYXRpb24oIHRydWUgLCAicGFyc2luZ19mYWlsZWQiICk7CisJfQorQVZNX0VORElGX0RFQlVHX0VOQUJMRURfT1IKKworCQkJYXZtX3NldF9leGl0X2NvZGUoIEFWTV9FWElUX1BBUlNJTkdfRVJST1JfQ09ERSApOworCisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKworQVZNX0lGX0RFQlVHX0VOQUJMRURfT1IoIG1Db25maWd1cmF0aW9uLmlzRGVidWdQYXJzaW5nU3RhZ2VFbmFibGVkKCkgKQorCW1Db25maWd1cmF0aW9uLnNhdmVTcGVjaWZpY2F0aW9uKCB0cnVlICwgInBhcnNlZCIgKTsKK0FWTV9FTkRJRl9ERUJVR19FTkFCTEVEX09SCisKKwkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCS8vLy8vIEJVSUxESU5HIDogQ09NUElMSU5HIDsgTE9BRElORworCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCQlpZiggbm90IHN0YXJ0QnVpbGRpbmcoKSApCisJCXsKKwkJCW1Db25maWd1cmF0aW9uLnNhdmVTcGVjaWZpY2F0aW9uKHRydWUsICJidWlsZGluZyIpOworCisJCQltQ29uZmlndXJhdGlvbi5zZXJpYWxpemVEZWJ1Z0V4ZWN1dGFibGUoICJidWlsZGluZyIgKTsKKworCQkJYXZtX3NldF9leGl0X2NvZGUoIEFWTV9FWElUX0NPTVBJTElOR19FUlJPUl9DT0RFICk7CisKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCitBVk1fSUZfREVCVUdfRkxBR19BTkQoIENPTVBJTElORyAsIG1Db25maWd1cmF0aW9uLmlzRGVidWdDb21waWxpbmdTdGFnZUVuYWJsZWQoKSApCisJbUNvbmZpZ3VyYXRpb24uc2VyaWFsaXplRGVidWdFeGVjdXRhYmxlKCAiYnVpbHQiICk7CisKKwltQ29uZmlndXJhdGlvbi5zYXZlU3BlY2lmaWNhdGlvbiggdHJ1ZSAsICJidWlsdCIgKTsKK0FWTV9FTkRJRl9ERUJVR19GTEFHX0FORCggQ09NUElMSU5HICkKKwl9CisKKwkvLyBNYW5kYXRvcnkgZm9yIGV4cHJlc3Npb24gY29tcGlsaW5nIGluIGFueSBQbHVnaW5Qcm9jZXNzb3IKKwllbHNlIGlmKCBtUHJldmlvdXNFbmdpbmUgIT0gTlVMTCAgKQorCXsKKwkJbUJ1aWxkZXIuZ2V0QXZtY29kZUNvbXBpbGVyKCkuZ2V0U3ltYm9sVGFibGUoKS5zZXRTeW1ib2xUYWJsZSgKKwkJCW1QcmV2aW91c0VuZ2luZS0+Z2V0QnVpbGRlcigpLmdldEF2bWNvZGVDb21waWxlcigpLmdldFN5bWJvbFRhYmxlKCkgKTsKKworCQltQ29uZmlndXJhdGlvbi5zZXQoIG1QcmV2aW91c0VuZ2luZS0+bUNvbmZpZ3VyYXRpb24gKTsKKwl9CisJZWxzZQorCXsKKwkJQVZNX09TX0VSUk9SX0FMRVJUIDw8ICJTeW1iZXhFbmdpbmU6PiAiCisJCQkJIk5vIFNwZWNpZmljYXRpb24gaW4gdGhlIGZpcnN0IEVuZ2luZSBDb3JlICEhISIKKwkJCQk8PCBTRU5EX0FMRVJUOworCisJCWF2bV9zZXRfZXhpdF9jb2RlKCBBVk1fRVhJVF9DT05GSUdVUkVfRVJST1JfQ09ERSApOworCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8vLy8gQ09OVFJPTExFUiBVTklUIENPTkZJR1VSQVRJT04KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlpZiggbm90IG1Db250cm9sbGVyVW5pdE1hbmFnZXIuY29uZmlndXJlKCkgKQorCXsKKwkJQVZNX09TX0VSUk9SX0FMRVJUIDw8ICJTeW1iZXhFbmdpbmU6PiAiCisJCQkJIkZhaWxlZCB0byBjb25maWd1cmUgdGhlIENvbnRyb2xsZXIgVW5pdCBNYW5hZ2VyICEhISIKKwkJCQk8PCBTRU5EX0FMRVJUOworCisJCWF2bV9zZXRfZXhpdF9jb2RlKCBBVk1fRVhJVF9DT05GSUdVUkVfRVJST1JfQ09ERSApOworCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwlpZiggbm90IG1TeW1iZXhEaXNwYXRjaGVyLmNvbmZpZ3VyZSgpICkKKwl7CisJCUFWTV9PU19FUlJPUl9BTEVSVCA8PCAiU3ltYmV4RW5naW5lOj4gIgorCQkJCSJGYWlsZWQgdG8gY29uZmlndXJlIHRoZSBEaXNwYXRjaGVyICEhISIKKwkJCQk8PCBTRU5EX0FMRVJUOworCisJCWF2bV9zZXRfZXhpdF9jb2RlKCBBVk1fRVhJVF9DT05GSUdVUkVfRVJST1JfQ09ERSApOworCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwlPU19WRVJCT1NJVFlfTUlOSU1VTV9PUl9ERUJVRyggQVZNX09TX0NPVVQgKSA8PCBfU0VXXworCQkJPDwgIkNvbmZpZ3VyZSBFbmdpbmUgZGlyZWN0b3I6ICIgPDwgc3RyVW5pcUlkKCkgPDwgIi4uLiBET05FIgorCQkJPDwgc3RkOjplbmRsOworCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworLyoqCisgKiBJTklUICogUFJFLVBST0NFU1MKKyAqLworYm9vbCBTeW1iZXhFbmdpbmU6OmluaXRJbXBsKCkKK3sKKwlpZiggbm90IG1Db250cm9sbGVyVW5pdE1hbmFnZXIuaW5pdCgpICkKKwl7CisJCUFWTV9PU19FUlJPUl9BTEVSVCA8PCAiU3ltYmV4RW5naW5lOj4gIgorCQkJCQkidGhlIFBsdWdpbiBQcm9jZXNzb3IgTWFuYWdlciBpbml0aWFsaXNhdGlvbiBmYWlsZWQgISEhIgorCQkJCTw8IFNFTkRfQUxFUlQ7CisKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCisJaWYoIG5vdCBtU3ltYmV4RGlzcGF0Y2hlci5pbml0KCkgKQorCXsKKwkJQVZNX09TX0VSUk9SX0FMRVJUIDw8ICJTeW1iZXhFbmdpbmU6PiB0aGUgRW5naW5lIGluaXRpYWxpc2F0aW9uIGZhaWxlZCAhISEiCisJCQkJPDwgU0VORF9BTEVSVDsKKworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworYm9vbCBTeW1iZXhFbmdpbmU6OnByZXByb2Nlc3MoKQoreworCWJvb2wgaXNQcmVQcm9jZXNzb3JfT0sgPSBtQ29udHJvbGxlclVuaXRNYW5hZ2VyLnByZXByb2Nlc3MoKTsKKworCXdoaWxlKCBtQ29uZmlndXJhdGlvbi5oYXNJbnB1dENvbnRleHQoKSApCisJeworCQlpZiggbUNvbmZpZ3VyYXRpb24uZ2V0SW5wdXRDb250ZXh0KCkubGFzdCgpLT5pc1Jvb3QoKSApCisJCXsKKwkJCW1Db25maWd1cmF0aW9uLmFwcGVuZFRyYWNlKAorCQkJCQltQ29uZmlndXJhdGlvbi5nZXRJbnB1dENvbnRleHQoKS5sYXN0KCkgKTsKKwkJfQorCisJCW1Db250cm9sbGVyVW5pdE1hbmFnZXIuZ2V0RXhlY3V0aW9uUXVldWUoKS5hcHBlbmRJbml0KAorCQkJCW1Db25maWd1cmF0aW9uLmdldElucHV0Q29udGV4dCgpLnBvcF9sYXN0KCkgKTsKKwl9CisKKwlpZiggbUNvbmZpZ3VyYXRpb24ubm9UcmFjZSgpICYmIChtUHJldmlvdXNFbmdpbmUgIT0gTlVMTCkgKQorCXsKKwkJbUNvbmZpZ3VyYXRpb24uYXBwZW5kVHJhY2UoCisJCQkJbVByZXZpb3VzRW5naW5lLT5tQ29uZmlndXJhdGlvbi5nZXRUcmFjZSgpICk7CisJfQorCisJYm9vbCBpc1N5bWJleERpc3BhdGNoZXJfT0sgPSBtU3ltYmV4RGlzcGF0Y2hlci5wcmVwcm9jZXNzKCk7CisKKwlib29sIGlzZmlsdGVyaW5nSW5pdGlhbGl6ZV9PSyA9IG1Db250cm9sbGVyVW5pdE1hbmFnZXIuZmlsdGVyaW5nSW5pdGlhbGl6ZSgpOworCisJaWYoIGlzUHJlUHJvY2Vzc29yX09LICYmIGlzU3ltYmV4RGlzcGF0Y2hlcl9PSyAmJiBpc2ZpbHRlcmluZ0luaXRpYWxpemVfT0sgKQorCXsKKwkJbUNvbnRyb2xsZXJVbml0TWFuYWdlci5nZXRFeGVjdXRpb25RdWV1ZSgpLnB1c2hJbml0MldhaXRpbmcoKTsKKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKKworLyoqCisgKiBTVEFSVAorICovCitib29sIFN5bWJleEVuZ2luZTo6c3RhcnQoKQoreworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLyBDT01QVVRJTkcKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlhdm1fcmVwb3J0KEFWTV9PU19MT0csICJTeW1iZXhFbmdpbmU6OnN0YXJ0Q29tcHV0aW5nIik7CisKKwltRXhlY3V0aW9uVGltZU1hbmFnZXIuc3RhcnRfdGltZSgpOworCisJbVN5bWJleERpc3BhdGNoZXIuc3RhcnQoKTsKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLyBFWEVDVVRJT04gVElNRSBSRVBPUlQKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwltRXhlY3V0aW9uVGltZU1hbmFnZXIuZmluaXNoX3RpbWUoKTsKKworCUFWTV9PU19MT0cgPDwgc3RkOjplbmRsIDw8IG1FeGVjdXRpb25UaW1lTWFuYWdlci50aW1lX3N0YXQoKSA8PCBzdGQ6OmVuZGw7CisJQVZNX09TX0NPVVQgPDwgc3RkOjplbmRsIDw8IG1FeGVjdXRpb25UaW1lTWFuYWdlci50aW1lX3N0YXQoKSA8PCBzdGQ6OmVuZGw7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvKioKKyAqIFBPU1QtUFJPQ0VTUworICovCitib29sIFN5bWJleEVuZ2luZTo6cG9zdHByb2Nlc3MoKQoreworCWJvb2wgaXNmaWx0ZXJpbmdGaW5hbGl6ZV9PSyA9IG1Db250cm9sbGVyVW5pdE1hbmFnZXIuZmlsdGVyaW5nRmluYWxpemUoKTsKKworCWJvb2wgaXNFbmdpbmVfT0sgPSBtU3ltYmV4RGlzcGF0Y2hlci5wb3N0cHJvY2VzcygpOworCisJYm9vbCBpc1Bvc3RQcm9jZXNzb3JfT0sgPSBtQ29udHJvbGxlclVuaXRNYW5hZ2VyLnBvc3Rwcm9jZXNzKCk7CisKKwlyZXR1cm4oIGlzZmlsdGVyaW5nRmluYWxpemVfT0sgJiYgaXNFbmdpbmVfT0sgJiYgaXNQb3N0UHJvY2Vzc29yX09LICk7Cit9CisKKworLyoqCisgKiBFWElUCisgKi8KK2Jvb2wgU3ltYmV4RW5naW5lOjpleGl0SW1wbCgpCit7CisJaWYoIG5vdCBtQ29udHJvbGxlclVuaXRNYW5hZ2VyLmV4aXQoKSApCisJeworCQlBVk1fT1NfRVJST1JfQUxFUlQgPDwgIlN5bWJleEVuZ2luZTo+ICIKKwkJCQkJInRoZSBQbHVnaW4gUHJvY2Vzc29yIE1hbmFnZXIgZXhpdCBmYWlsZWQgISEhIgorCQkJCTw8IFNFTkRfQUxFUlQ7CisKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCWlmKCBub3QgbVN5bWJleERpc3BhdGNoZXIuZXhpdCgpICkKKwl7CisJCUFWTV9PU19FUlJPUl9BTEVSVCA8PCAiU3ltYmV4RW5naW5lOj4gdGhlIEVuZ2luZSBleGl0IGZhaWxlZCAhISEiCisJCQkJPDwgU0VORF9BTEVSVDsKKworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworLyoqCisgKiBSRVBPUlQgVFJBQ0UKKyAqLwordm9pZCBTeW1iZXhFbmdpbmU6OnByZVJlcG9ydChPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwkvLyEhIE5PVEhJTkcKK30KKwordm9pZCBTeW1iZXhFbmdpbmU6OmR5blJlcG9ydChPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwkvLyEhIE5PVEhJTkcKK30KKwordm9pZCBTeW1iZXhFbmdpbmU6OnBvc3RSZXBvcnQoT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJbVN5bWJleERpc3BhdGNoZXIucmVwb3J0KEFWTV9PU19MT0cpOworCW1TeW1iZXhEaXNwYXRjaGVyLnJlcG9ydChBVk1fT1NfQ09VVCk7CisKKwltQ29udHJvbGxlclVuaXRNYW5hZ2VyLnJlcG9ydChBVk1fT1NfTE9HKTsKKwltQ29udHJvbGxlclVuaXRNYW5hZ2VyLnJlcG9ydChBVk1fT1NfQ09VVCk7Cit9CisKKwordm9pZCBTeW1iZXhFbmdpbmU6OnJlcG9ydChPdXRTdHJlYW0gJiBvcykgY29uc3QKK3sKKwlwcmVSZXBvcnQob3MpOworCisJZHluUmVwb3J0KG9zKTsKKworCXBvc3RSZXBvcnQob3MpOworfQorCisKKy8qKgorICogUEFSU0lORworICoKKyAqLworYm9vbCBTeW1iZXhFbmdpbmU6OnN0YXJ0UGFyc2luZygpCit7CisJQVZNX09TX0xPRyA8PCBzdGQ6OmVuZGwgPDwgX1NFV18gPDwgIjwgc3RhcnQgPiBQYXJzaW5nIC4uLiIgPDwgc3RkOjplbmRsOworCisJUGFyc2VyTWFuYWdlciBhUGFyc2VyKCBtQ29uZmlndXJhdGlvbi5nZXRTcGVjaWZpY2F0aW9uRmlsZUxvY2F0aW9uKCkgKTsKKworCW1Db25maWd1cmF0aW9uLnNldFNwZWNpZmljYXRpb24oIGFQYXJzZXIucGFyc2VGTUwoCisJCQltQ29uZmlndXJhdGlvbi5nZXRXT2JqZWN0TWFuYWdlcigpICkgKTsKKworCWJvb2wgaXNPSyA9IG1Db25maWd1cmF0aW9uLmhhc1NwZWNpZmljYXRpb24oKSAmJiBhUGFyc2VyLmhhc05vU3ludGF4RXJyb3IoKTsKKworCUFWTV9PU19MT0cgPDwgX1NFV18KKwkJCTw8ICI8IGVuZCA+IFBhcnNpbmcgLi4uICIgPDwgKCBpc09LID8gImRvbmUuIiA6ICJmYWlsZWQuIiApCisJCQk8PCBzdGQ6OmVuZGw7CisKKwlyZXR1cm4oIGlzT0sgKTsKK30KKworCisvKioKKyAqIEJVSUxESU5HCisgKgorICovCitib29sIFN5bWJleEVuZ2luZTo6c3RhcnRCdWlsZGluZygpCit7CisJQVZNX09TX0xPRyA8PCBzdGQ6OmVuZGwgPDwgX1NFV18gPDwgIjwgc3RhcnQgPiBCdWlsZGluZyAuLi4iIDw8IHN0ZDo6ZW5kbDsKKworCWJvb2wgaXNPSyA9IG1CdWlsZGVyLnN0YXJ0KCk7CisKKwlzZXJpYWxpemVCdWlsZGluZ1Jlc3VsdCgpOworCisJQVZNX09TX0xPRyA8PCBfU0VXXworCQkJPDwgIjwgZW5kID4gQnVpbGRpbmcgLi4uICIgPDwgKCBpc09LID8gImRvbmUuIiA6ICJmYWlsZWQuIiApCisJCQk8PCBzdGQ6OmVuZGw7CisKKwlyZXR1cm4oIGlzT0sgKTsKK30KKworCisvKioKKyAqIENPTVBVVElORworICovCitib29sIFN5bWJleEVuZ2luZTo6c3RhcnRDb21wdXRpbmcoKQoreworCUFWTV9PU19MT0cgPDwgc3RkOjplbmRsIDw8IF9TQlhfIDw8ICI8IHN0YXJ0ID4gQ29tcHV0aW5nIC4uLiIgPDwgc3RkOjplbmRsOworCXRyeQorCXsKKwkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJCS8vLy8vIElOSVRJQUxJWkFUSU9OCisJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJCWlmKCBub3QgaW5pdCgpICkKKwkJeworCQkJYXZtX3NldF9leGl0X2NvZGUoIEFWTV9FWElUX0lOSVRJQUxJWklOR19FUlJPUl9DT0RFICk7CisKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCisJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQkvLy8vLyBQUkUgUFJPQ0VTU0lORworCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCQlpZiggbm90IHByZXByb2Nlc3MoKSApCisJCXsKKwkJCWF2bV9zZXRfZXhpdF9jb2RlKCBBVk1fRVhJVF9QUkVfUFJPQ0VTU0lOR19FUlJPUl9DT0RFICk7CisKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCisJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQkvLy8vLyBSRVBPUlRJTkcKKwkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkJQVZNX09TX0xPRyA8PCBzdGQ6OmVuZGw7CisKKwkJcHJlUmVwb3J0KEFWTV9PU19MT0cpOworCisJCUFWTV9PU19MT0cgPDwgc3RkOjplbmRsOworCisJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQkvLy8vLyBTVEFSVAorCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCQlpZiggbm90IHN0YXJ0KCkgKQorCQl7CisJCQlhdm1fc2V0X2V4aXRfY29kZSggQVZNX0VYSVRfUFJPQ0VTU0lOR19FUlJPUl9DT0RFICk7CisKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCisJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQkvLy8vLyBSRVBPUlRJTkcKKwkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkJQVZNX09TX0xPRyA8PCBzdGQ6OmVuZGw7CisKKwkJZHluUmVwb3J0KEFWTV9PU19MT0cpOworCisJCUFWTV9PU19MT0cgPDwgc3RkOjplbmRsOworCisJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQkvLy8vLyBQT1NUIFBST0NFU1NJTkcKKwkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkJaWYoIG5vdCBwb3N0cHJvY2VzcygpICkKKwkJeworCQkJc2VyaWFsaXplQ29tcHV0aW5nUmVzdWx0KCk7CisKKwkJCWF2bV9zZXRfZXhpdF9jb2RlKCBBVk1fRVhJVF9QT1NUX1BST0NFU1NJTkdfRVJST1JfQ09ERSApOworCisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKworCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkJLy8vLy8gUkVQT1JUSU5HCisJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJCUFWTV9PU19MT0cgPDwgc3RkOjplbmRsOworCisJCXBvc3RSZXBvcnQoQVZNX09TX0xPRyk7CisKKwkJQVZNX09TX0xPRyA8PCBzdGQ6OmVuZGw7CisKKworCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkJLy8vLy8gRVhJVElORworCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCQlpZiggbm90IGV4aXQoKSApCisJCXsKKwkJCXNlcmlhbGl6ZUNvbXB1dGluZ1Jlc3VsdCgpOworCisJCQlhdm1fc2V0X2V4aXRfY29kZSggQVZNX0VYSVRfRklOQUxJWklOR19FUlJPUl9DT0RFICk7CisKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCisJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQkvLy8vLyBSRVBPUlRJTkcKKwkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vCQlBVk1fT1NfTE9HIDw8IHN0ZDo6ZW5kbDsKKy8vCisvLwkJcmVwb3J0KEFWTV9PU19MT0cpOworLy8KKy8vCQlBVk1fT1NfTE9HIDw8IHN0ZDo6ZW5kbDsKKworCisJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQkvLy8vLyBURVNUIERSSVZFTiBERVZFTE9QTUVOVAorCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCQl0ZGRTdGFydCgpOworCisJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQkvLy8vLyBTRVJJQUxJWkFUSU9OCisJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJCXNlcmlhbGl6ZUNvbXB1dGluZ1Jlc3VsdCgpOworCX0KKwljYXRjaCAoIGNvbnN0IHN0ZDo6ZXhjZXB0aW9uICYgZSApCisJeworCQlBVk1fT1NfV0FSTiA8PCBzdGQ6OmVuZGwgPDwgRU1QSEFTSVMoCisJCQkJIlN5bWJleEVuZ2luZTo6c3RhcnRDb21wdXRpbmc8IHN0ZDo6ZXhjZXB0aW9uID4iLAorCQkJCWUud2hhdCgpLCAnKicsIDgwKTsKKworCQlBVk1fT1NfV0FSTiA8PCBFTVBIQVNJUygiU2F2ZSBQb2ludCAuLi4iLCAnKicsIDgwKTsKKworCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkJLy8vLy8gRkFJTEVEIFJFUE9SVElORworCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCQlmYWlsZWRSZXBvcnQoKTsKKwl9CisJY2F0Y2ggKCAuLi4gKQorCXsKKwkJQVZNX09TX1dBUk4gPDwgc3RkOjplbmRsIDw8IEVNUEhBU0lTKAorCQkJCSJTeW1iZXhFbmdpbmU6OnN0YXJ0Q29tcHV0aW5nPCB1bmtub3duOjpleGNlcHRpb24gPiAhISEiLAorCQkJCScqJywgODApOworCisJCUFWTV9PU19XQVJOIDw8IEVNUEhBU0lTKCJTYXZlIFBvaW50IC4uLiIsICcqJywgODApOworCisJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQkvLy8vLyBGQUlMRUQgUkVQT1JUSU5HCisJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJCWZhaWxlZFJlcG9ydCgpOworCX0KKworCUFWTV9PU19MT0cgPDwgc3RkOjplbmRsIDw8IF9TQlhfIDw8ICI8IGVuZCA+IENvbXB1dGluZyAuLi4gZG9uZS4iIDw8IHN0ZDo6ZW5kbDsKKworCXJldHVybiggdHJ1ZSApOworfQorCisKKy8qKgorICogU2VyaWFsaXphdGlvbgorICovCit2b2lkIFN5bWJleEVuZ2luZTo6c2VyaWFsaXplQnVpbGRpbmdSZXN1bHQoKQoreworCW1Db25maWd1cmF0aW9uLnNlcmlhbGl6ZUJ1aWxkaW5nUmVzdWx0KCk7Cit9CisKK3ZvaWQgU3ltYmV4RW5naW5lOjpzZXJpYWxpemVDb21wdXRpbmdSZXN1bHQoKQoreworCW1Db25maWd1cmF0aW9uLnNlcmlhbGl6ZUNvbXB1dGluZ1Jlc3VsdCgpOworfQorCisKKwordm9pZCBTeW1iZXhFbmdpbmU6OmZhaWxlZFJlcG9ydCgpCit7CisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vLy8vIEVYRUNVVElPTiBUSU1FIFJFUE9SVAorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCW1FeGVjdXRpb25UaW1lTWFuYWdlci5maW5pc2hfdGltZSgpOworCisJQVZNX09TX0xPRyA8PCBzdGQ6OmVuZGwgPDwgbUV4ZWN1dGlvblRpbWVNYW5hZ2VyLnRpbWVfc3RhdCgpIDw8IHN0ZDo6ZW5kbDsKKwlBVk1fT1NfQ09VVCA8PCBzdGQ6OmVuZGwgPDwgbUV4ZWN1dGlvblRpbWVNYW5hZ2VyLnRpbWVfc3RhdCgpIDw8IHN0ZDo6ZW5kbDsKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLy8vLyBSRVBPUlRJTkcKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlBVk1fT1NfTE9HIDw8IHN0ZDo6ZW5kbDsKKworCXJlcG9ydChBVk1fT1NfTE9HKTsKKworCUFWTV9PU19MT0cgPDwgc3RkOjplbmRsOworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vLy8vIFNFUklBTElaQVRJT04KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlzZXJpYWxpemVDb21wdXRpbmdSZXN1bHQoKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVEVTVCBEUklWRU4gREVWRUxPUE1FTlQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIFRFU1QgRFJJVkVOIERFVkVMT1BNRU5UCisvL3NlY3Rpb24gVERECisvLwlAcmVwb3J0ID0gImF2bS50ZGQiOworLy8KKy8vCUByZWdyZXNzaW9uID0gdHJ1ZTsKKy8vCUB1bml0ID0gdHJ1ZTsKKy8vZW5kc2VjdGlvbiBUREQKKwordm9pZCBTeW1iZXhFbmdpbmU6OnRkZFN0YXJ0KCkKK3sKKwlBVk1fT1NfVEREIDw8ICJAdGRkPCB2ZXJzaW9uICwgMS4wID46IC8vICIKKwkJCTw8IEV4ZWN1dGlvblRpbWU6OmN1cnJlbnRfdGltZSgpIDw8IHN0ZDo6ZW5kbDsKKworCUFWTV9PU19UREQgPDwgImVuZ2luZSAiIDw8IGdldFBhcmFtZXRlcldPYmplY3QoKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCBzdGQ6OmVuZGw7CisKKwlBVk1fT1NfVEREIDw8IElOQ1JfSU5ERU5UOworCisJQVZNX09TX1RERCA8PCAidGltZSNzdGF0ID0gIiA8PCBtRXhlY3V0aW9uVGltZU1hbmFnZXIudGltZV9zdGF0KCkKKwkJCTw8IHN0ZDo6ZW5kbDsKKworCWlmKCBtV29ya2Zsb3cuaXNUZGRVbml0VGVzdGluZygpICkKKwl7CisJCXRkZFVuaXRSZXBvcnQoQVZNX09TX1RERCk7CisJfQorCisJaWYoIG1Xb3JrZmxvdy5pc1RkZFJlZ3Jlc3Npb25UZXN0aW5nKCkgKQorCXsKKwkJdGRkUmVncmVzc2lvblJlcG9ydChBVk1fT1NfVEREKTsKKwl9CisKKwlBVk1fT1NfVEREIDw8IERFQ1JfSU5ERU5UOworCUFWTV9PU19UREQgPDwgIi8vIGVuZCBlbmdpbmUgIgorCQkJPDwgZ2V0UGFyYW1ldGVyV09iamVjdCgpLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVU5JVCBURVNUIEFQSQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBTeW1iZXhFbmdpbmU6OnRkZFVuaXRSZXBvcnQoT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJQVZNX09TX1RERCA8PCAiQHRkZDwgdW5pdCAsIDEuMCA+OiIgPDwgc3RkOjplbmRsOworCisJbUNvbnRyb2xsZXJVbml0TWFuYWdlci50ZGRVbml0UmVwb3J0KG9zKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTk9OLVJFR1JFU1NJT04gVEVTVCBBUEkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgU3ltYmV4RW5naW5lOjp0ZGRSZWdyZXNzaW9uUmVwb3J0KE91dFN0cmVhbSAmIG9zKSBjb25zdAoreworCUFWTV9PU19UREQgPDwgIkB0ZGQ8IHJlZ3Jlc3Npb24gLCAxLjAgPjoiIDw8IHN0ZDo6ZW5kbDsKKworCW1Db250cm9sbGVyVW5pdE1hbmFnZXIudGRkUmVncmVzc2lvblJlcG9ydChvcyk7Cit9CisKKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9zZXcvU3ltYmV4RW5naW5lLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9zZXcvU3ltYmV4RW5naW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYxNjU5OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3Nldy9TeW1iZXhFbmdpbmUuaApAQCAtMCwwICsxLDI3NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDkgbWFycyAyMDA5CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgU0VXX1NZTUJFWF9FTkdJTkVfSF8KKyNkZWZpbmUgU0VXX1NZTUJFWF9FTkdJTkVfSF8KKworI2luY2x1ZGUgPGNvbW1vbi9SdW5uYWJsZUVsZW1lbnQuaD4KKworI2luY2x1ZGUgPGJ1aWxkZXIvQnVpbGRlci5oPgorI2luY2x1ZGUgPGJ1aWxkZXIvTG9hZGVyLmg+CisKKyNpbmNsdWRlIDxjb21wdXRlci9wcmltaXRpdmUvQXZtUHJpbWl0aXZlUHJvY2Vzc29yLmg+CisKKyNpbmNsdWRlIDxzZXcvU3ltYmV4RGlzcGF0Y2hlci5oPgorCisKKyNpbmNsdWRlIDxzZXcvQ29uZmlndXJhdGlvbi5oPgorI2luY2x1ZGUgPHNldy9TeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXIuaD4KKworI2luY2x1ZGUgPHV0aWwvRXhlY3V0aW9uVGltZS5oPgorCisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBFeGVjdXRpb25UaW1lOworY2xhc3MgV09iamVjdDsKKworY2xhc3MgV29ya2Zsb3c7CisKKworY2xhc3MgU3ltYmV4RW5naW5lICA6ICBwdWJsaWMgUnVubmFibGVFbGVtZW50Cit7CisKKwlBVk1fREVDTEFSRV9VTkNMT05BQkxFX0NMQVNTKFN5bWJleEVuZ2luZSkKKworCitwcm90ZWN0ZWQgOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlXb3JrZmxvdyAmIG1Xb3JrZmxvdzsKKworCUNvbmZpZ3VyYXRpb24gbUNvbmZpZ3VyYXRpb247CisKKwlBdm1QcmltaXRpdmVQcm9jZXNzb3IgbVByaW1pdGl2ZVByb2Nlc3NvcjsKKworCUJ1aWxkZXIgbUJ1aWxkZXI7CisJTG9hZGVyICBtTG9hZGVyOworCisJU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyIG1Db250cm9sbGVyVW5pdE1hbmFnZXI7CisKKwlTeW1iZXhEaXNwYXRjaGVyIG1TeW1iZXhEaXNwYXRjaGVyOworCisJRXhlY3V0aW9uVGltZSBtRXhlY3V0aW9uVGltZU1hbmFnZXI7CisKKwlhdm1fb2Zmc2V0X3QgbU9mZnNldDsKKworCVN5bWJleEVuZ2luZSAqIG1QcmV2aW91c0VuZ2luZTsKKwlTeW1iZXhFbmdpbmUgKiBtTmV4dEVuZ2luZTsKKworCitwdWJsaWMgOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCVN5bWJleEVuZ2luZShXb3JrZmxvdyAmIGFXb3JrZmxvdywKKwkJCVdPYmplY3QgKiB3ZlBhcmFtZXRlck9iamVjdCwgYXZtX29mZnNldF90IGFuT2Zmc2V0KTsKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5TeW1iZXhFbmdpbmUoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKgorCSogR0VUVEVSCisJKiBtV29ya2Zsb3cKKwkqLworCVdvcmtmbG93ICYgZ2V0V29ya2Zsb3coKQorCXsKKwkJcmV0dXJuKCBtV29ya2Zsb3cgKTsKKwl9CisKKworCS8qKgorCSAqIENPTkZJR1VSRQorCSAqLworCWJvb2wgY29uZmlndXJlKCk7CisKKwkvKioKKwkgKiBSRVBPUlQgVFJBQ0UKKwkgKi8KKwl2b2lkIHByZVJlcG9ydCAoT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCXZvaWQgZHluUmVwb3J0IChPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisJdm9pZCBwb3N0UmVwb3J0KE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworCXZvaWQgcmVwb3J0KE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworCXZvaWQgZmFpbGVkUmVwb3J0KCk7CisKKworCS8qKgorCSAqIElOSVQgKiBQUkUtUFJPQ0VTUworCSAqLworCXZpcnR1YWwgYm9vbCBpbml0SW1wbCgpOworCisJYm9vbCBwcmVwcm9jZXNzKCk7CisKKwkvKioKKwkgKiBTVEFSVAorCSAqLworCWJvb2wgc3RhcnQoKTsKKworCS8qKgorCSAqIFBPU1QtUFJPQ0VTUworCSAqIElOSVQKKwkgKi8KKwlib29sIHBvc3Rwcm9jZXNzKCk7CisKKwl2aXJ0dWFsIGJvb2wgZXhpdEltcGwoKTsKKworCisJLyoKKwkgKiBQUk9DRVNTSU5HCisJICovCisJYm9vbCBzdGFydFBhcnNpbmcoKTsKKwlib29sIHN0YXJ0QnVpbGRpbmcoKTsKKwlib29sIHN0YXJ0Q29tcHV0aW5nKCk7CisKKwl2b2lkIHNlcmlhbGl6ZUJ1aWxkaW5nUmVzdWx0KCk7CisKKwl2b2lkIHNlcmlhbGl6ZUNvbXB1dGluZ1Jlc3VsdCgpOworCisJLyoqCisJICogR0VUVEVSCisJICogbVByaW1pdGl2ZVByb2Nlc3NvcgorCSAqLworCWlubGluZSBBdm1QcmltaXRpdmVQcm9jZXNzb3IgJiBnZXRQcmltaXRpdmVQcm9jZXNzb3IoKQorCXsKKwkJcmV0dXJuKCBtUHJpbWl0aXZlUHJvY2Vzc29yICk7CisJfQorCisJLyoqCisJICogR0VUVEVSCisJICogbUJ1aWxkZXIKKwkgKi8KKwlpbmxpbmUgQnVpbGRlciAmIGdldEJ1aWxkZXIoKQorCXsKKwkJcmV0dXJuKCBtQnVpbGRlciApOworCX0KKworCS8qKgorCSAqIEdFVFRFUgorCSAqIG1Mb2FkZXIKKwkgKi8KKwlpbmxpbmUgTG9hZGVyICYgZ2V0TG9hZGVyKCkKKwl7CisJCXJldHVybiggbUxvYWRlciApOworCX0KKworCS8qKgorCSAqIEdFVFRFUgorCSAqIG1Db250cm9sbGVyVW5pdE1hbmFnZXIKKwkgKi8KKwlpbmxpbmUgU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyICYgZ2V0Q29udHJvbGxlclVuaXRNYW5hZ2VyKCkKKwl7CisJCXJldHVybiggbUNvbnRyb2xsZXJVbml0TWFuYWdlciApOworCX0KKworCisJLyoqCisJICogR0VUVEVSCisJICogbVN5bWJleERpc3BhdGNoZXIKKwkgKi8KKwlpbmxpbmUgU3ltYmV4RGlzcGF0Y2hlciAmIGdldFN5bWJleERpc3BhdGNoZXIoKQorCXsKKwkJcmV0dXJuKCBtU3ltYmV4RGlzcGF0Y2hlciApOworCX0KKworCWlubGluZSBjb25zdCBTeW1iZXhEaXNwYXRjaGVyICYgZ2V0U3ltYmV4RGlzcGF0Y2hlcigpIGNvbnN0CisJeworCQlyZXR1cm4oIG1TeW1iZXhEaXNwYXRjaGVyICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIKKwkgKiBtT2Zmc2V0CisJICovCisJaW5saW5lIGF2bV9vZmZzZXRfdCBnZXRPZmZzZXQoKQorCXsKKwkJcmV0dXJuKCBtT2Zmc2V0ICk7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtUHJldmlvdXNFbmdpbmUKKwkgKiBtTmV4dEVuZ2luZQorCSAqIFN5bWJleEVuZ2luZQorCSAqLworCWlubGluZSBTeW1iZXhFbmdpbmUgKiBnZXRQcmV2aW91c0NvcmUoKQorCXsKKwkJcmV0dXJuKCBtUHJldmlvdXNFbmdpbmUgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRQcmV2aW91c0NvcmUoU3ltYmV4RW5naW5lICogYVByZXZpb3VzQ29yZSkKKwl7CisJCW1QcmV2aW91c0VuZ2luZSA9IGFQcmV2aW91c0NvcmU7CisJfQorCisKKwlpbmxpbmUgU3ltYmV4RW5naW5lICogZ2V0TmV4dENvcmUoKQorCXsKKwkJcmV0dXJuKCBtTmV4dEVuZ2luZSApOworCX0KKworCWlubGluZSB2b2lkIHNldE5leHRDb3JlKFN5bWJleEVuZ2luZSAqIGFOZXh0Q29yZSkKKwl7CisJCW1OZXh0RW5naW5lID0gYU5leHRDb3JlOworCX0KKworCisJLyoqCisJICogR0VUVEVSCisJICogbUNvbmZpZ3VyYXRpb24KKwkgKi8KKwlpbmxpbmUgQ29uZmlndXJhdGlvbiAmIGdldENvbmZpZ3VyYXRpb24oKQorCXsKKwkJcmV0dXJuKCBtQ29uZmlndXJhdGlvbiApOworCX0KKworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gVEVTVCBEUklWRU4gREVWRUxPUE1FTlQKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwl2b2lkIHRkZFN0YXJ0KCk7CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gVU5JVCBURVNUIEFQSQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCXZvaWQgdGRkVW5pdFJlcG9ydChPdXRTdHJlYW0gJiBvcykgY29uc3Q7CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gTk9OLVJFR1JFU1NJT04gVEVTVCBBUEkKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwl2b2lkIHRkZFJlZ3Jlc3Npb25SZXBvcnQoT3V0U3RyZWFtICYgb3MpIGNvbnN0OworCit9OworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworCisjZW5kaWYgLyogU0VXX1NZTUJFWF9FTkdJTkVfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3Nldy9TeW1iZXhFdmVudE1hbmFnZXIuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc2V3L1N5bWJleEV2ZW50TWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA5ZjExNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3Nldy9TeW1iZXhFdmVudE1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsMjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxNiBtYXJzIDIwMTUKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlN5bWJleEV2ZW50TWFuYWdlci5oIgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9zZXcvU3ltYmV4RXZlbnRNYW5hZ2VyLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9zZXcvU3ltYmV4RXZlbnRNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjViZTgzMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3Nldy9TeW1iZXhFdmVudE1hbmFnZXIuaApAQCAtMCwwICsxLDEzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDE2IG1hcnMgMjAxNQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFNFV19TWU1CRVhfRVZFTlRfTUFOQUdFUl9IXworI2RlZmluZSBTRVdfU1lNQkVYX0VWRU5UX01BTkFHRVJfSF8KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vTGlzdC5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworY2xhc3MgRXhlY3V0aW9uQ29udGV4dDsKKworCitjbGFzcyBJSGFuZGxlckV2ZW50RGVzdHJveUN0eAoreworCitwdWJsaWM6CisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfklIYW5kbGVyRXZlbnREZXN0cm95Q3R4KCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCXZpcnR1YWwgdm9pZCBoYW5kbGVFdmVudERlc3Ryb3lDdHgoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpID0gMDsKKworfTsKKworCisKK2NsYXNzIFN5bWJleEV2ZW50TWFuYWdlcgoreworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogVFlQRURFRlMKKwkgKi8KKwl0eXBlZGVmIExpc3Q8IElIYW5kbGVyRXZlbnREZXN0cm95Q3R4ICogPiBMaXN0T2ZIYW5kbGVyRXZlbnREZXN0cm95Q3R4OworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQVRUUklCVVRFCisJICovCisJTGlzdE9mSGFuZGxlckV2ZW50RGVzdHJveUN0eCBtRXZlbnREZXN0cm95Q3R4TGlzdGVuZXI7CisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQ29tcHV0aW5nIFZhcmlhYmxlCisJTGlzdE9mSGFuZGxlckV2ZW50RGVzdHJveUN0eDo6aXRlcmF0b3IgaXRFdmVudExpc3RlbmVyOworCUxpc3RPZkhhbmRsZXJFdmVudERlc3Ryb3lDdHg6Oml0ZXJhdG9yIGVuZEV2ZW50TGlzdGVuZXI7CisKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJU3ltYmV4RXZlbnRNYW5hZ2VyKCkKKwk6IG1FdmVudERlc3Ryb3lDdHhMaXN0ZW5lciggKSwKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBDb21wdXRpbmcgVmFyaWFibGUKKwlpdEV2ZW50TGlzdGVuZXIoICksCisJZW5kRXZlbnRMaXN0ZW5lciggKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgflN5bWJleEV2ZW50TWFuYWdlcigpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIE5PVElGSUNBVElPTgorCSAqIERlc3Ryb3kgRXhlY3V0aW9uIENvbnRleHQgRVZFTlQKKwkgKi8KKwlpbmxpbmUgdm9pZCBub3RpZnlFdmVudERlc3Ryb3lDdHgoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpCisJeworCQlpZiggbUV2ZW50RGVzdHJveUN0eExpc3RlbmVyLm5vbmVtcHR5KCkgKQorCQl7CisJCQlwb3N0RXZlbnREZXN0cm95Q3R4KCBhbkVDICk7CisJCX0KKwl9CisKKwl2b2lkIGlubGluZSBwb3N0RXZlbnREZXN0cm95Q3R4KEV4ZWN1dGlvbkNvbnRleHQgKiBhbkVDKQorCXsKKwkJaXRFdmVudExpc3RlbmVyICA9IG1FdmVudERlc3Ryb3lDdHhMaXN0ZW5lci5iZWdpbigpOworCQllbmRFdmVudExpc3RlbmVyID0gbUV2ZW50RGVzdHJveUN0eExpc3RlbmVyLmVuZCgpOworCQlmb3IoIDsgaXRFdmVudExpc3RlbmVyICE9IGVuZEV2ZW50TGlzdGVuZXIgOyArK2l0RXZlbnRMaXN0ZW5lciApCisJCXsKKwkJCSgqaXRFdmVudExpc3RlbmVyKS0+aGFuZGxlRXZlbnREZXN0cm95Q3R4KCBhbkVDICk7CisJCX0KKwl9CisKKworCWlubGluZSB2b2lkIHJlZ2lzdGVySGFuZGxlckV2ZW50RGVzdHJveUN0eCgKKwkJCUlIYW5kbGVyRXZlbnREZXN0cm95Q3R4ICogYUxpc3RlbmVyKQorCXsKKwkJbUV2ZW50RGVzdHJveUN0eExpc3RlbmVyLmFkZF91bmlvbiggYUxpc3RlbmVyICk7CisJfQorCisJaW5saW5lIHZvaWQgdW5yZWdpc3RlckhhbmRsZXJFdmVudERlc3Ryb3lDdHgoCisJCQlJSGFuZGxlckV2ZW50RGVzdHJveUN0eCAqIGFMaXN0ZW5lcikKKwl7CisJCW1FdmVudERlc3Ryb3lDdHhMaXN0ZW5lci5yZW1vdmUoIGFMaXN0ZW5lciApOworCX0KKworfTsKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qIFNFV19TWU1CRVhfRVZFTlRfTUFOQUdFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc2V3L1N5bWJleEpvYi5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc2V3L1N5bWJleEpvYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMTdmNWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9zZXcvU3ltYmV4Sm9iLmgKQEAgLTAsMCArMSwxOTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgU0VXX1NZTUJFWEpPQl9IXworI2RlZmluZSBTRVdfU1lNQkVYSk9CX0hfCisKKyNpbmNsdWRlIDxjb21tb24vUnVubmFibGVFbGVtZW50Lmg+CisjaW5jbHVkZSA8Y29sbGVjdGlvbi9UeXBlZGVmLmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uQ29udGV4dC5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjbGFzcyBFeGVjdXRpb25Db250ZXh0OworY2xhc3MgU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyOworY2xhc3MgU3ltYmV4RGlzcGF0Y2hlcjsKKworCitjbGFzcyBTeW1iZXhKb2IgOgorCQlwdWJsaWMgUnVubmFibGVFbGVtZW50Cit7CisKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIFRZUEVERUYKKwkgKi8KKwl0eXBlZGVmIExpc3QgPCBFeGVjdXRpb25Db250ZXh0ICogPiAgTGlzdE9mRXhlY3V0aW9uQ29udGV4dDsKKworCitwcm90ZWN0ZWQ6CisJLyoqCisJKiBBVFRSSUJVVEVTCisJKi8KKwlTeW1iZXhEaXNwYXRjaGVyICYgbVN5bWJleERpc3BhdGNoZXI7CisKKwlTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXIgJiBtQ29udHJvbGxlclVuaXRNYW5hZ2VyOworCisJTGlzdE9mRXhlY3V0aW9uQ29udGV4dCBtU3ltYmV4Q29udGV4dHM7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCVN5bWJleEpvYihTeW1iZXhEaXNwYXRjaGVyICYgYVN5bWJleERpc3BhdGNoZXIsCisJCQlXT2JqZWN0ICogd2ZQYXJhbWV0ZXJPYmplY3QsCisJCQlTeW1iZXhDb250cm9sbGVyVW5pdE1hbmFnZXIgJiBhQ2VudHJhbENvbnRyb2xsZXJVbml0KQorCTogUnVubmFibGVFbGVtZW50KCB3ZlBhcmFtZXRlck9iamVjdCApLAorCW1TeW1iZXhEaXNwYXRjaGVyKCBhU3ltYmV4RGlzcGF0Y2hlciApLAorCW1Db250cm9sbGVyVW5pdE1hbmFnZXIoIGFDZW50cmFsQ29udHJvbGxlclVuaXQgKSwKKwltU3ltYmV4Q29udGV4dHMoICkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgflN5bWJleEpvYigpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBJTklUIC8gRVhJVCAgQVBJCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJdmlydHVhbCBib29sIGluaXRJbXBsKCkKKwl7CisJCS8vISEgTk9USElORworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwl2aXJ0dWFsIGJvb2wgZXhpdEltcGwoKQorCXsKKwkJLy8hISBOT1RISU5HCisJCXJldHVybiB0cnVlOworCX0KKworCisJLyoqCisJICogVGhyZWFkIG1haW4gUnVuIE1ldGhvZAorCSAqLworCXZpcnR1YWwgdm9pZCBvcGVyYXRvcigpKCkgPSAwOworCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtU3ltYmV4Q29udGV4dHMKKwkgKi8KKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtU3ltYmV4Q29udGV4dHMKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCB2b2lkIGFwcGVuZFN5bWJleENvbnRleHQoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpCisJeworCQltU3ltYmV4Q29udGV4dHMuYXBwZW5kKGFuRUMpOworCX0KKworCisJaW5saW5lIExpc3RPZkV4ZWN1dGlvbkNvbnRleHQgJiBnZXRTeW1iZXhDb250ZXh0cygpCisJeworCQlyZXR1cm4oIG1TeW1iZXhDb250ZXh0cyApOworCX0KKworCWlubGluZSBib29sIGhhc1N5bWJleENvbnRleHQoKSBjb25zdAorCXsKKworCQlyZXR1cm4oIG1TeW1iZXhDb250ZXh0cy5ub25lbXB0eSgpICk7CisJfQorCisKKwlpbmxpbmUgRXhlY3V0aW9uQ29udGV4dCAqIHBvcEZpcnN0U3ltYmV4Q29udGV4dCgpCisJeworCQlyZXR1cm4oIG1TeW1iZXhDb250ZXh0cy5wb3BfZmlyc3QoKSApOworCX0KKworCWlubGluZSB2b2lkIHJlbW92ZVN5bWJleENvbnRleHQoRXhlY3V0aW9uQ29udGV4dCAqIGFuRUMpCisJeworCQltU3ltYmV4Q29udGV4dHMucmVtb3ZlKCBhbkVDICk7CisJfQorCisKKwkvKioKKwkgKiBIYW5kbGUgUmVxdWVzdAorCSAqIFJlbGVhc2UKKwkgKiBTdG9wCisJICovCisJaW5saW5lIHZvaWQgaGFuZGxlUmVxdWVzdEdvYWxBY2hpZXZlZCgpCisJeworCQlSdW5uYWJsZUVsZW1lbnQ6OnNldExpZmVjeWNsZUlkbGUoKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBoYW5kbGVSZXF1ZXN0Tm9Xb3JrKCkKKwl7CisvLwkJUnVubmFibGVFbGVtZW50OjpzZXRMaWZlY3ljbGVJZGxlKCk7CisJCVJ1bm5hYmxlRWxlbWVudDo6c2V0TGlmZWN5Y2xlU3VzcGVuZGVkKCk7CisKKy8vCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorLy8JCQkJPDwgIltCVUddIFVuZXhwZWN0ZWQgPE5vV29yaz4gcmVxdWVzdCAhISEiCisvLwkJCQk8PCBTRU5EX0VYSVQ7CisJfQorCisJaW5saW5lIHZvaWQgaGFuZGxlUmVxdWVzdFJlbGVhc2UoKQorCXsKKwkJUnVubmFibGVFbGVtZW50OjpzZXRMaWZlY3ljbGVSZWxlYXNlZCgpOworCX0KKworCWlubGluZSB2b2lkIGhhbmRsZVJlcXVlc3RSZXNldCgpCisJeworCQkvLyBUT0RPIGhhbmRsZVJlcXVlc3RSZXNldAorLy8JCW1TeW1iZXhDb250ZXh0cy5jbGVhcigpOworCQlSdW5uYWJsZUVsZW1lbnQ6OnNldExpZmVjeWNsZUlkbGUoKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBoYW5kbGVSZXF1ZXN0U3RvcCgpCisJeworCQlSdW5uYWJsZUVsZW1lbnQ6OnNldExpZmVjeWNsZVN0b3BwZWQoKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBoYW5kbGVSZXF1ZXN0V2FpdGluZygpCisJeworCQlSdW5uYWJsZUVsZW1lbnQ6OnNldExpZmVjeWNsZVdhaXRpbmcoKTsKKwl9CisKKworCS8qKgorCSAqIEdFVFRFUiAtIFNFVFRFUgorCSAqIG1TeW1iZXhEaXNwYXRjaGVyCisJICovCisJaW5saW5lIFN5bWJleERpc3BhdGNoZXIgJiBnZXRTeW1iZXhEaXNwYXRjaGVyKCkgY29uc3QKKwl7CisJCXJldHVybiggbVN5bWJleERpc3BhdGNoZXIgKTsKKwl9CisKK307CisKK30KKworI2VuZGlmIC8qU0VXX1NZTUJFWEpPQl9IXyovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9zZXcvU3ltYmV4UHJvY2Vzc29yLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3Nldy9TeW1iZXhQcm9jZXNzb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MmEyMTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9zZXcvU3ltYmV4UHJvY2Vzc29yLmNwcApAQCAtMCwwICsxLDE3OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiU3ltYmV4UHJvY2Vzc29yLmgiCisKKworI2luY2x1ZGUgPGNvbXB1dGVyL3ByaW1pdGl2ZS9Bdm1QcmltaXRpdmVQcm9jZXNzb3IuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkNvbnRleHQuaD4KKworI2luY2x1ZGUgPHNldy9TeW1iZXhFbmdpbmUuaD4KKyNpbmNsdWRlIDxzZXcvU3ltYmV4RGlzcGF0Y2hlci5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvKioKKyAqIENPTlNUUlVDVE9SCisgKiBEZWZhdWx0CisgKi8KK1N5bWJleFByb2Nlc3Nvcjo6U3ltYmV4UHJvY2Vzc29yKAorCQlTeW1iZXhEaXNwYXRjaGVyICYgYVN5bWJleERpc3BhdGNoZXIsIFdPYmplY3QgKiB3ZlBhcmFtZXRlck9iamVjdCwKKwkJU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyICYgYUNvbnRyb2xsZXJVbml0TWFuYWdlcikKKzogU3ltYmV4Sm9iKGFTeW1iZXhEaXNwYXRjaGVyLCB3ZlBhcmFtZXRlck9iamVjdCwgYUNvbnRyb2xsZXJVbml0TWFuYWdlciksCittUHJpbWl0aXZlUHJvY2Vzc29yKCBhU3ltYmV4RGlzcGF0Y2hlci5nZXRQcmltaXRpdmVQcm9jZXNzb3IoKSApCit7CisJLy8hISBOT1RISU5HCit9CisKKworLyoqCisgKiBUaHJlYWQgbWFpbiBSdW4gTWV0aG9kCisgKi8KK3ZvaWQgU3ltYmV4UHJvY2Vzc29yOjpvcGVyYXRvcigpKCkKK3sKKwlBVk1fT1NfVFJBQ0UgPDwgIkJlZ2luIFN5bWJleFByb2Nlc3NvciBUaHJlYWQiIDw8IHN0ZDo6ZW5kbDsKKworCXdoaWxlKCBpc0xpZmVjeWNsZVJ1bm5hYmxlKCkgKQorCXsKKwkJcnVuU3RlcCgpOworCX0KKworCUFWTV9PU19UUkFDRSA8PCAiRW5kIFN5bWJleFByb2Nlc3NvciBUaHJlYWQiIDw8IHN0ZDo6ZW5kbDsKK30KKworCisvKioKKyAqIEV4ZWN1dGlvbiA8aW5pdD4gc3RlcAorICovCisKK3ZvaWQgU3ltYmV4UHJvY2Vzc29yOjppbml0U3RlcCgpCit7CisJUnVubmFibGVFbGVtZW50OjpBdXRvUnVubmluZ0lkbGVTd2l0Y2hlciBhdXRvQWN0aXZhdG9yKCAqdGhpcyApOworCisJdHJhY2VCb3VuZEV2YWwoKTsKKworLy8JQVZNX1ZFUkJPU0lUWV9JRl9IQVNfTUlOSU1VTQorLy8JCXRyYWNlQm91bmRFdmFsKCk7CisvLwlBVk1fVkVSQk9TSVRZX0VMU0UKKy8vCQlBVk1fSUZfREVCVUdfRU5BQkxFRAorLy8JCQl0cmFjZUJvdW5kRXZhbCgpOworLy8JCUFWTV9FTkRJRl9ERUJVR19FTkFCTEVECisvLwlBVk1fVkVSQk9TSVRZX0VORElGCisKKwl3aGlsZSggaGFzU3ltYmV4Q29udGV4dCgpICkKKwl7CisJCWluaXRTdGVwKCAqKCBwb3BGaXJzdFN5bWJleENvbnRleHQoKSApICk7CisJfQorfQorCit2b2lkIFN5bWJleFByb2Nlc3Nvcjo6aW5pdFN0ZXAoRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpCit7CisJLy8gU1RBVCBiZWZvcmUgUFJJTlRJTkcgTkVYVCBFVkFMIENPTlRFWFQgSUQKKwlpZiggYW5FQy5oYXNDb250YWluZXIoKQorCQkmJiBhbkVDLmdldENvbnRhaW5lcigpLT5oYXNDaGlsZENvbnRleHQoKSApCisJeworCQkvLyBJTlZBUklBTlQ6IHRoZSBmaXJzdCBjaGlsZCBpbmhlcml0IHRoZWlyIHBhcmVudCdzIHdpZHRoCisJCWlmKCAoYW5FQy5nZXRDb250YWluZXIoKS0+Zmlyc3RDaGlsZENvbnRleHQoKSA9PSAoJiBhbkVDKSkgKQorCQl7CisJCQlhbkVDLnNldFdpZHRoKCBhbkVDLmdldENvbnRhaW5lcigpLT5nZXRXaWR0aCgpICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlhbkVDLnNldFdpZHRoKCBtU3ltYmV4RGlzcGF0Y2hlci5uZXh0R2xvYmFsR3JhcGhXaWR0aCgpICk7CisJCX0KKwl9CisKKwlhbkVDLnNldEV2YWxOdW1iZXIoIG1TeW1iZXhEaXNwYXRjaGVyLm5leHRFdmFsTnVtYmVyKCkgKTsKKworCS8vIE5FVyBFWEVDVVRJT04gUFJPQ0VTU09SCisJLy8gVGVzdCBuZWNlc3NhaXJlIGVuIGNhcyBkJ2VuY2hhaW5lbWVudCBkJ2V4w6ljdXRpb25zIHN1Y2Nlc3NpdmVzCisKKwl0cmFjZVByZUV2YWwoYW5FQyk7CisKKwlpZiggYW5FQy5oYXNDb250YWluZXIoKSApCisJeworCQltUHJpbWl0aXZlUHJvY2Vzc29yLnJ1bihhbkVDKTsKKwl9CisJZWxzZQorCXsKKwkJbVByaW1pdGl2ZVByb2Nlc3Nvci5pbml0KGFuRUMpOworCX0KKworCXRyYWNlUG9zdEV2YWwoYW5FQyk7CisKKwltU3ltYmV4RGlzcGF0Y2hlci5zZW5kVG9BbmFseXNlcldvcmtpbmdRdWV1ZSgmIGFuRUMpOworfQorCisKKy8qKgorICogRXhlY3V0aW9uIDxydW4+IHN0ZXAKKyAqLwordm9pZCBTeW1iZXhQcm9jZXNzb3I6OnJ1blN0ZXAoKQoreworCVJ1bm5hYmxlRWxlbWVudDo6QXV0b1J1bm5pbmdJZGxlU3dpdGNoZXIgYXV0b0FjdGl2YXRvciggKnRoaXMgKTsKKworCXdoaWxlKCBoYXNTeW1iZXhDb250ZXh0KCkgKQorCXsKKwkJcnVuU3RlcCggKiggcG9wRmlyc3RTeW1iZXhDb250ZXh0KCkgKSApOworCX0KK30KKworCisKK3ZvaWQgU3ltYmV4UHJvY2Vzc29yOjpydW5TdGVwKEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKQoreworCS8vIFNUQVQgYmVmb3JlIFBSSU5USU5HIE5FWFQgRVZBTCBDT05URVhUIElECisJYW5FQy5zZXRFdmFsTnVtYmVyKCBtU3ltYmV4RGlzcGF0Y2hlci5uZXh0RXZhbE51bWJlcigpICk7CisKKwl0cmFjZVByZUV2YWwoYW5FQyk7CisKKwltUHJpbWl0aXZlUHJvY2Vzc29yLnJ1bihhbkVDKTsKKworCXRyYWNlUG9zdEV2YWwoYW5FQyk7CisKKwltU3ltYmV4RGlzcGF0Y2hlci5zZW5kVG9BbmFseXNlcldvcmtpbmdRdWV1ZSgmIGFuRUMpOworfQorCisKKworLyoqCisgKiBFVkFMIFRSQUNFCisgKi8KK3ZvaWQgU3ltYmV4UHJvY2Vzc29yOjp0cmFjZUJvdW5kRXZhbCgpCit7CisJbUNvbnRyb2xsZXJVbml0TWFuYWdlci50cmFjZUJvdW5kRXZhbChBVk1fT1NfVFJBQ0UpOworCisJbUNvbnRyb2xsZXJVbml0TWFuYWdlci50cmFjZUJvdW5kRXZhbChBVk1fT1NfQ09VVCk7Cit9CisKK3ZvaWQgU3ltYmV4UHJvY2Vzc29yOjp0cmFjZVByZUV2YWwoY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpCit7CisJbUNvbnRyb2xsZXJVbml0TWFuYWdlci50cmFjZVByZUV2YWwoQVZNX09TX1RSQUNFLCBhbkVDKTsKKworCW1Db250cm9sbGVyVW5pdE1hbmFnZXIudHJhY2VQcmVFdmFsKEFWTV9PU19DT1VULCBhbkVDKTsKK30KKwordm9pZCBTeW1iZXhQcm9jZXNzb3I6OnRyYWNlUG9zdEV2YWwoY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpCit7CisJbUNvbnRyb2xsZXJVbml0TWFuYWdlci50cmFjZVBvc3RFdmFsKEFWTV9PU19UUkFDRSwgYW5FQyk7CisKKwltQ29udHJvbGxlclVuaXRNYW5hZ2VyLnRyYWNlUG9zdEV2YWwoQVZNX09TX0NPVVQsIGFuRUMpOworfQorCisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc2V3L1N5bWJleFByb2Nlc3Nvci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc2V3L1N5bWJleFByb2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NTk5YWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9zZXcvU3ltYmV4UHJvY2Vzc29yLmgKQEAgLTAsMCArMSw5NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBTRVdfU1lNQkVYX1BST0NFU1NPUl9IXworI2RlZmluZSBTRVdfU1lNQkVYX1BST0NFU1NPUl9IXworCisKKworI2luY2x1ZGUgPHNldy9TeW1iZXhKb2IuaD4KKworCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjbGFzcyBBdm1QcmltaXRpdmVQcm9jZXNzb3I7CitjbGFzcyBFeGVjdXRpb25Db250ZXh0OworY2xhc3MgU3ltYmV4Q29udHJvbGxlclVuaXRNYW5hZ2VyOworY2xhc3MgU3ltYmV4RGlzcGF0Y2hlcjsKKworCitjbGFzcyBTeW1iZXhQcm9jZXNzb3IgIDogIHB1YmxpYyBTeW1iZXhKb2IKK3sKKworCUFWTV9ERUNMQVJFX1VOQ0xPTkFCTEVfQ0xBU1MoU3ltYmV4UHJvY2Vzc29yKQorCisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBBVFRSSUJVVEVTCisJICovCisJQXZtUHJpbWl0aXZlUHJvY2Vzc29yICYgbVByaW1pdGl2ZVByb2Nlc3NvcjsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJU3ltYmV4UHJvY2Vzc29yKFN5bWJleERpc3BhdGNoZXIgJiBhU3ltYmV4RGlzcGF0Y2hlciwKKwkJCVdPYmplY3QgKiB3ZlBhcmFtZXRlck9iamVjdCwKKwkJCVN5bWJleENvbnRyb2xsZXJVbml0TWFuYWdlciAmIGFDb250cm9sbGVyVW5pdE1hbmFnZXIpOworCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+U3ltYmV4UHJvY2Vzc29yKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogVGhyZWFkIG1haW4gUnVuIE1ldGhvZAorCSAqLworCXZpcnR1YWwgdm9pZCBvcGVyYXRvcigpKCk7CisKKworCS8qKgorCSAqIEV4ZWN1dGlvbiBzdGVwCisJICovCisJdm9pZCBpbml0U3RlcCgpOworCXZvaWQgaW5pdFN0ZXAoRXhlY3V0aW9uQ29udGV4dCAmIGFuRUMpOworCisJdm9pZCBydW5TdGVwKCk7CisJdm9pZCBydW5TdGVwKEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKTsKKworCisJLyoqCisJICogRVZBTCBUUkFDRQorCSAqLworCXZvaWQgdHJhY2VCb3VuZEV2YWwoKTsKKworCXZvaWQgdHJhY2VQcmVFdmFsKGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKTsKKworCXZvaWQgdHJhY2VQb3N0RXZhbChjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQyk7CisKK307CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKlNFV19TWU1CRVhfUFJPQ0VTU09SX0hfKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3Nldy9Xb3JrZmxvdy5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9zZXcvV29ya2Zsb3cuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NzZkN2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9zZXcvV29ya2Zsb3cuY3BwCkBAIC0wLDAgKzEsOTYzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4NCisgKg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnINCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSAiV29ya2Zsb3cuaCINCisNCisjaW5jbHVkZSA8YnVpbGRlci9wcmltaXRpdmUvQ29tcGlsYXRpb25FbnZpcm9ubWVudC5oPg0KKw0KKyNpbmNsdWRlIDxjb2xsZWN0aW9uL0xpc3QuaD4NCisjaW5jbHVkZSA8Y29sbGVjdGlvbi9UeXBlZGVmLmg+DQorDQorI2luY2x1ZGUgPGNvbXB1dGVyL1BhdGhDb25kaXRpb25Qcm9jZXNzb3IuaD4NCisNCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uQ29udGV4dC5oPg0KKw0KKyNpbmNsdWRlIDxwYXJzZXIvUGFyc2VyTWFuYWdlci5oPg0KKw0KKyNpbmNsdWRlIDxwcmludGVyL01hbmlwdWxhdG9ycy5oPg0KKyNpbmNsdWRlIDxwcmludGVyL091dFN0cmVhbS5oPg0KKw0KKyNpbmNsdWRlIDxzZXcvQ29uZmlndXJhdGlvbi5oPg0KKyNpbmNsdWRlIDxzZXcvU3ltYmV4RW5naW5lLmg+DQorDQorI2luY2x1ZGUgPHNvbHZlci9hcGkvU29sdmVyRGVmLmg+DQorDQorI2luY2x1ZGUgPHV0aWwvYXZtX2RlYnVnLmg+DQorI2luY2x1ZGUgPHV0aWwvYXZtX3V0aWwuaD4NCisNCisjaW5jbHVkZSA8aW9zdHJlYW0+DQorI2luY2x1ZGUgPGxpc3Q+DQorI2luY2x1ZGUgPHN0cmluZz4NCisNCisNCisNCituYW1lc3BhY2Ugc2VwDQorew0KKw0KKw0KKy8qKg0KKyAqIEdMT0JBTFMNCisgKi8NCitjb25zdCBzdGQ6OnN0cmluZyAmIFdvcmtmbG93OjpTRUNUSU9OX1dPUktTUEFDRV9SRUdFWF9JRCA9DQorCQlPUl9XSUQzKCAid29ya3NwYWNlIiAsICJXT1JLU1BBQ0UiICwgIkxPQ0FUSU9OIiApOw0KKw0KK2NvbnN0IHN0ZDo6c3RyaW5nICYgV29ya2Zsb3c6OlNFQ1RJT05fQ09OU09MRV9SRUdFWF9JRCA9DQorCQlPUl9XSUQzKCAiY29uc29sZSIgLCAiQ09OU09MRSIgLCAiQVZNIiApOw0KKw0KK2NvbnN0IHN0ZDo6c3RyaW5nICYgV29ya2Zsb3c6OlNFQ1RJT05fREVWRUxPUEVSX1JFR0VYX0lEID0NCisJCU9SX1dJRDMoICJkZXZlbG9wZXIiICwgIkRFVkVMT1BFUiIgLCAiVFJBQ0UiKTsNCisNCitjb25zdCBzdGQ6OnN0cmluZyAmIFdvcmtmbG93OjpTRUNUSU9OX0RJUkVDVE9SX1JFR0VYX0lEID0NCisJCU9SX1dJRDQoICJkaXJlY3RvciIgLCAiRElSRUNUT1IiICwgIk1PQyIgLCAiUlVOVElNRSIpOw0KKw0KK2NvbnN0IHN0ZDo6c3RyaW5nICYgV29ya2Zsb3c6OlNFQ1RJT05fU0hFTExfUkVHRVhfSUQgPQ0KKwkJT1JfV0lEMyggInNoZWxsIiAsICJTSEVMTCIgLCAiQVZNIik7DQorDQorY29uc3Qgc3RkOjpzdHJpbmcgJiBXb3JrZmxvdzo6U0VDVElPTl9TWU1CRVhfUkVHRVhfSUQgPQ0KKwkJT1JfV0lEMyggInN5bWJleCIgLCAiU1lNQkVYIiAsICJBVk0iKTsNCisNCitjb25zdCBzdGQ6OnN0cmluZyAmIFdvcmtmbG93OjpTRUNUSU9OX1RERF9SRUdFWF9JRCA9DQorCQlPUl9XSUQyKCAidGRkIiAsICJUREQiKTsNCisNCisNCitjb25zdCBzdGQ6OnN0cmluZyAmIFdvcmtmbG93OjpTRUNUSU9OX0ZBTV9SRUdFWF9JRCA9DQorCQlPUl9XSUQyKE9SX1dJRDQoICJjb250cm9sbGVyIiAsICJ3b3JrZXIiICwgInByb2Nlc3NvciIgLCAiZmlsdGVyIiApLA0KKwkJCQlPUl9XSUQ0KCAiQ09OVFJPTExFUiIgLCAiV09SS0VSIiAsICJQUk9DRVNTT1IiICwgIkZJTFRFUiIgKSk7DQorDQorDQorY29uc3Qgc3RkOjpzdHJpbmcgJiBXb3JrZmxvdzo6U0VDVElPTl9GQU1fQ09OVEFJTkVSU19SRUdFWF9JRCA9DQorCQlPUl9XSUQ0KE9SX1dJRDQoICJjb250cm9sbGVyIiAsICJ3b3JrZXIiICwgInByb2Nlc3NvciIgLCAiZmlsdGVyIiApLA0KKwkJCQlPUl9XSUQ0KCAiQ09OVFJPTExFUiIgLCAiV09SS0VSIiAsICJQUk9DRVNTT1IiICwgIkZJTFRFUiIgKSwNCisJCQkJT1JfV0lEMyggInF1ZXVlIiAsICJwcmVfcHJvY2VzcyIgLCAicG9zdF9wcm9jZXNzIiApLA0KKwkJCQlPUl9XSUQzKCAiUVVFVUUiICwgIlBSRV9QUk9DRVNTIiAsICJQT1NUX1BST0NFU1MiICkpOw0KKw0KKy8vIERlcHJlY2F0ZWQNCitjb25zdCBzdGQ6OnN0cmluZyAmIFdvcmtmbG93OjpTRUNUSU9OX0ZBTV9RVUVVRV9SRUdFWF9JRCA9DQorCQlPUl9XSUQyKCAicXVldWUiICwgIlFVRVVFIiApOw0KKw0KK2NvbnN0IHN0ZDo6c3RyaW5nICYgV29ya2Zsb3c6OlNFQ1RJT05fRkFNX1JFRFVOREFOQ1lfUkVHRVhfSUQgPQ0KKwkJT1JfV0lEMiggInJlZHVuZGFuY3kiICwgIlJFRFVOREFOQ1kiICk7DQorDQorY29uc3Qgc3RkOjpzdHJpbmcgJiBXb3JrZmxvdzo6U0VDVElPTl9GQU1fUFJPQ0VTU09SX1JFR0VYX0lEID0NCisJCU9SX1dJRDIoT1JfV0lEMyggImNvbnRyb2xsZXIiICwgIndvcmtlciIgLCAicHJvY2Vzc29yIiApLA0KKwkJCQlPUl9XSUQzKCAiQ09OVFJPTExFUiIgLCAiV09SS0VSIiAsICJQUk9DRVNTT1IiICkpOw0KKw0KK2NvbnN0IHN0ZDo6c3RyaW5nICYgV29ya2Zsb3c6OlNFQ1RJT05fRkFNX0ZJTFRFUl9SRUdFWF9JRCA9DQorCQlPUl9XSUQyKCAiZmlsdGVyIiAsICJGSUxURVIiICk7DQorDQorY29uc3Qgc3RkOjpzdHJpbmcgJiBXb3JrZmxvdzo6U0VDVElPTl9GQU1fUFJFUFJPQ0VTU19SRUdFWF9JRCA9DQorCQlPUl9XSUQyKCAicHJlX3Byb2Nlc3MiICwgIlBSRV9QUk9DRVNTIiApOw0KKw0KK2NvbnN0IHN0ZDo6c3RyaW5nICYgV29ya2Zsb3c6OlNFQ1RJT05fRkFNX1BPU1RQUk9DRVNTX1JFR0VYX0lEID0NCisJCU9SX1dJRDIoICJwb3N0X3Byb2Nlc3MiICwgIlBPU1RfUFJPQ0VTUyIgKTsNCisNCisNCisvKioNCisgKiBTSU5HTEVUT04NCisgKi8NCitXb3JrZmxvdyAqIFdvcmtmbG93OjpJTlNUQU5DRSA9IE5VTEw7DQorDQorDQorLyoqDQorICogTE9BREVSDQorICovDQorYm9vbCBXb3JrZmxvdzo6bG9hZCgpDQorew0KKwlyZXR1cm4oIHRydWUgKTsNCit9DQorDQorDQorLyoqDQorICogRElTUE9TRVINCisgKi8NCit2b2lkIFdvcmtmbG93OjpkaXNwb3NlKCkNCit7DQorCW1DdXJyZW50U3ltYmV4RW5naW5lID0gbU1haW5TeW1iZXhFbmdpbmU7DQorCWZvciggOyBtQ3VycmVudFN5bWJleEVuZ2luZSAhPSBOVUxMIDsgbUN1cnJlbnRTeW1iZXhFbmdpbmUgPSBtTWFpblN5bWJleEVuZ2luZSApDQorCXsNCisJCW1NYWluU3ltYmV4RW5naW5lID0gbU1haW5TeW1iZXhFbmdpbmUtPmdldE5leHRDb3JlKCk7DQorDQorCQlzZXA6OmRlc3Ryb3koIG1DdXJyZW50U3ltYmV4RW5naW5lICk7DQorDQorCQltQ3VycmVudFN5bWJleEVuZ2luZSA9IE5VTEw7DQorCX0NCit9DQorDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLy8vLyBBVk0gQ09ORklHVVJBVElPTiBQQVJBTUVURVIgQ0hFQ0tFUg0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorYm9vbCBXb3JrZmxvdzo6bG9hZENvbmZpZ3VyYXRpb24oY29uc3Qgc3RkOjpzdHJpbmcgJiBhV29ya2Zsb3dMb2NhdGlvbikNCit7DQorCW1TRVdGaWxlTG9jYXRpb24gPSBhV29ya2Zsb3dMb2NhdGlvbjsNCisNCisJLy8gQ2hlY2tpbmcgV09SS0ZMT1cNCisJQVZNX09TX0NPVVQgPDwgX1NFV18NCisJCQk8PCAiU3ltYm9saWMgRXhlY3V0aW9uIGJhc2VkIFdvcmtmbG93IGFuYWx5c2lzIC4uLiBTVEFSVCINCisJCQk8PCBzdGQ6OmVuZGwNCisJCQk8PCBfU0VXXyA8PCAiTG9jYXRpb246ICIgPDwgbVNFV0ZpbGVMb2NhdGlvbiA8PCBzdGQ6OmVuZGw7DQorDQorCS8vIExvYWQgd29ya2Zsb3cgZGVmaW5pdGlvbiBmaWxlDQorCWlmKCBwYXJzZUNvbmZpZ3VyYXRpb24oKSApDQorCXsNCisJCUFWTV9PU19DT1VUIDw8IF9TRVdfIDw8ICJMb2FkaW5nIGZpbGVuYW1lOiBcIiINCisJCQkJPDwgVkZTOjpmaWxlbmFtZSggbVNFV0ZpbGVMb2NhdGlvbiApDQorCQkJCTw8ICJcIiAuLi4gZG9uZSAhIiA8PCBzdGQ6OmVuZGw7DQorCX0NCisJZWxzZQ0KKwl7DQorCQlyZXR1cm4oIGZhbHNlICk7DQorCX0NCisNCisJYm9vbCBpc09LID0gdHJ1ZTsNCisNCisJU3RyaW5nT3V0U3RyZWFtIE9TX0lOSVRfTE9HOw0KKw0KKwkvLyBDb25maWd1cmUgY29yZSBlbGVtZW50cw0KKwlpc09LID0gbG9hZENvcmVFbGVtZW50c0NvbmZpZyhPU19JTklUX0xPRyk7DQorDQorCS8vIFNldCBkZXZlbG9wZXIgZGVidWcgb3B0aW9ucw0KKwlpc09LID0gbG9hZFdvcmtzcGFjZUxvY2F0aW9uc0NvbmZpZyhPU19JTklUX0xPRykgJiYgaXNPSzsNCisNCisJLy8gSW5pdGlhbGl6ZSBsb2cgJiBkZWJ1ZyB0cmFjZSBwcmludGVycw0KKwlpc09LID0gaXNPSyAmJiBPdXRTdHJlYW06OmNvbmZpZ3VyZSh0aGlzKTsNCisNCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzJfQU5EKEhJR0ggLCBQQVJTSU5HICwgQ09ORklHVVJJTkcgLA0KKwkJKG1QYXJhbWV0ZXJXT2JqZWN0ICE9IFdPYmplY3Q6Ol9OVUxMXykgKQ0KKw0KKwlzdGQ6OnN0cmluZyBwYXJzZVJlc3VsdEZpbGUgPSBWRlM6OnN1ZmZpeEZpbGVuYW1lKA0KKwkJCVZGUzo6ZmlsZW5hbWUoIG1TRVdGaWxlTG9jYXRpb24gKSwgIl9wYXJzZWQiLCAiLnNldyIpOw0KKw0KKwlwYXJzZVJlc3VsdEZpbGUgPSBWRlM6Om5hdGl2ZV9wYXRoKHBhcnNlUmVzdWx0RmlsZSwNCisJCQlWRlM6OldvcmtzcGFjZURlYnVnUGF0aC5lbXB0eSgpDQorCQkJCQk/IFZGUzo6cGFyZW50KCBtU0VXRmlsZUxvY2F0aW9uICkNCisJCQkJCTogVkZTOjpXb3Jrc3BhY2VEZWJ1Z1BhdGggKTsNCisNCisJT1NfSU5JVF9MT0cgPDwgX0RCR18gPDwgIlNhdmluZyBvZiB0aGUgcGFyc2VkIFdvcmtmbG93IGluIHRleHQgZm9ybWF0IC4uLiINCisJCQk8PCBzdGQ6OmVuZGw7DQorDQorCUNvbmZpZ3VyYXRpb246OnNhdmVFbGVtZW50VGV4dHVhbFZpZXcoDQorCQkJT1NfSU5JVF9MT0csIG1QYXJhbWV0ZXJXT2JqZWN0LCBwYXJzZVJlc3VsdEZpbGUpOw0KKw0KK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHX0FORChVTFRSQSAsIFBBUlNJTkcgKQ0KKw0KKwlpZiggaXNPSyApDQorCXsNCisJCUFWTV9PU19MT0cgPDwgX1NFV18gPDwgIlN5bWJvbGljIEV4ZWN1dGlvbiAiDQorCQkJCSJiYXNlZCBXb3JrZmxvdyBhbmFseXNpcyAuLi4gU1RBUlQiDQorCQkJCTw8IHN0ZDo6ZW5kbA0KKwkJCQk8PCBfU0VXXyA8PCAiTG9jYXRpb246ICIgPDwgbVNFV0ZpbGVMb2NhdGlvbg0KKwkJCQk8PCBzdGQ6OmVuZGw7DQorDQorCQlPU19WRVJCT1NJVFlfTUlOSU1VTV9PUl9ERUJVRyggQVZNX09TX0NPVVQgKQ0KKwkJCQk8PCBPU19JTklUX0xPRy5zdHIoKSA8PCBzdGQ6OmZsdXNoOw0KKw0KKwkJQVZNX09TX0xPRyA8PCBPU19JTklUX0xPRy5zdHIoKSA8PCBzdGQ6OmZsdXNoOw0KKwl9DQorCWVsc2UNCisJew0KKwkJQVZNX09TX0NPVVQgPDwgT1NfSU5JVF9MT0cuc3RyKCkgPDwgc3RkOjpmbHVzaDsNCisNCisJCXJldHVybiggZmFsc2UgKTsNCisJfQ0KKw0KKwkvLyBTZXQgZGV2ZWxvcGVyIGRlYnVnIG9wdGlvbnMNCisJaXNPSyA9IGxvYWRTeW1iZXhDb25maWcoKSAmJiBpc09LOw0KKw0KKwlpc09LID0gbG9hZFNoZWxsQ29uZmlnKCkgJiYgaXNPSzsNCisNCisJaXNPSyA9IGxvYWRUZGRDb25maWcoKSAmJiBpc09LOw0KKw0KKwlpc09LID0gbG9hZE90aGVyc0NvbmZpZygpICYmIGlzT0s7DQorDQorCWlmKCBpc09LICkNCisJew0KKwkJYXZtX3JlcG9ydChBVk1fT1NfTE9HLCAiV29ya2Zsb3c6OmxvYWRDb25maWd1cmF0aW9uOj4gIg0KKwkJCQkiZW5kIG9mIGF2bSBjb25maWd1cmF0aW9uIGNoZWNraW5nICEhISIpOw0KKwl9DQorCWVsc2UNCisJew0KKwkJYXZtX3NldF9leGl0X2NvZGUoIEFWTV9FWElUX0NPTkZJR1VSRV9FUlJPUl9DT0RFICk7DQorCX0NCisNCisJQVZNX09TX0NPVVQgPDwgX1NFV18NCisJCQk8PCAiU3ltYm9saWMgRXhlY3V0aW9uIGJhc2VkIFdvcmtmbG93IGFuYWx5c2lzIC4uLiAiDQorCQkJPDwgKCBpc09LID8gIkRPTkUiIDogIkZBSUxFRCAhIiApDQorCQkJPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsNCisNCisJQVZNX09TX0xPRyA8PCBfU0VXXw0KKwkJCTw8ICJTeW1ib2xpYyBFeGVjdXRpb24gV29ya2Zsb3cgYW5hbHlzaXMgLi4uICINCisJCQk8PCAoIGlzT0sgPyAiRE9ORSIgOiAiRkFJTEVEICEiICkNCisJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOw0KKw0KKwlyZXR1cm4oIGlzT0sgKTsNCit9DQorDQorDQorLyoqDQorICogTG9hZCB3b3JrZmxvdyBkZWZpbml0aW9uIGZpbGUNCisgKi8NCitib29sIFdvcmtmbG93OjpwYXJzZUNvbmZpZ3VyYXRpb24oKQ0KK3sNCisJc3RkOjppZnN0cmVhbSBhbklucHV0U3RyZWFtKCBtU0VXRmlsZUxvY2F0aW9uLmNfc3RyKCkgKTsNCisNCisJaWYoIGFuSW5wdXRTdHJlYW0uZ29vZCgpICkNCisJew0KKwkJc3RkOjpzdHJpbmcgYW50bHJFeGNlcHRpb25Nc2c7DQorDQorCQlQYXJzZXJNYW5hZ2VyIGFQYXJzZXIoIG1TRVdGaWxlTG9jYXRpb24gKTsNCisNCisJCW1QYXJhbWV0ZXJXT2JqZWN0ID0gYVBhcnNlci5wYXJzZVNFVyhtV09iamVjdE1hbmFnZXIsIGFuSW5wdXRTdHJlYW0gKTsNCisNCisJCWlmKCBhUGFyc2VyLmhhc1N5bnRheEVycm9yKCkgKQ0KKwkJew0KKwkJCUFWTV9PU19DRVJSIDw8IHN0ZDo6ZW5kbDsNCisNCisJCQlpZiggYVBhcnNlci5oYXNFeGNlcHRpb25NZXNzYWdlKCkgKQ0KKwkJCXsNCisJCQkJQVZNX09TX0NFUlIgPDwgX1NFV18gPDwgIjwgZXhjZXB0aW9uID4gIg0KKwkJCQkJCTw8IGFQYXJzZXIuZ2V0RXhjZXB0aW9uTWVzc2FnZSgpIDw8IHN0ZDo6ZW5kbDsNCisJCQl9DQorDQorCQkJQVZNX09TX0NFUlIgPDwgc3RkOjplbmRsIDw8IF9TRVdfIDw8ICI8IGVycm9yID4gIg0KKwkJCQkJPDwgYVBhcnNlci5nZXRFcnJvckNvdW50KCkgPDwgIiBzeW50YXggZXJyb3IiDQorCQkJCQk8PCAoKGFQYXJzZXIuZ2V0RXJyb3JDb3VudCgpID4gMSk/ICJzIiA6ICIiKQ0KKwkJCQkJPDwgIiBmb3VuZC4iIDw8IHN0ZDo6ZW5kbDsNCisNCisJCQlhdm1fc2V0X2V4aXRfY29kZSggQVZNX0VYSVRfUEFSU0lOR19FUlJPUl9DT0RFICk7DQorDQorCQkJcmV0dXJuKCBmYWxzZSApOw0KKwkJfQ0KKwkJZWxzZSBpZiggbVBhcmFtZXRlcldPYmplY3QgPT0gV09iamVjdDo6X05VTExfICkNCisJCXsNCisJCQlBVk1fT1NfQ0VSUiA8PCBfU0VXXyA8PCAiPCBlcnJvciA+IE5vIHBhcnNpbmcgcmVzdWx0ICEiDQorCQkJCQk8PCBzdGQ6OmVuZGw7DQorDQorCQkJYXZtX3NldF9leGl0X2NvZGUoIEFWTV9FWElUX1BBUlNJTkdfRVJST1JfQ09ERSApOw0KKw0KKwkJCXJldHVybiggZmFsc2UgKTsNCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQlyZXR1cm4oIHRydWUgKTsNCisJCX0NCisJfQ0KKwllbHNlDQorCXsNCisJCUFWTV9PU19DRVJSIDw8IF9TRVdfIDw8ICI8IGVycm9yID4gQ2Fubm90IG9wZW4gdGhlIGZpbGUgXCIiDQorCQkJCTw8IFZGUzo6ZmlsZW5hbWUobVNFV0ZpbGVMb2NhdGlvbikgPDwgIlwiICEiDQorCQkJCTw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7DQorDQorCQlhdm1fc2V0X2V4aXRfY29kZSggQVZNX0VYSVRfQ09ORklHVVJFX0VSUk9SX0NPREUgKTsNCisNCisJCXJldHVybiggZmFsc2UgKTsNCisJfQ0KK30NCisNCisNCisvKioNCisgKiBDb25maWd1cmUgY29yZSBlbGVtZW50cw0KKyAqIFNldCBjb25zb2xlIHZlcmJvc2l0eSBsZXZlbA0KKyAqIFNldCBkZXZlbG9wZXIgZGVidWcgbGV2ZWwNCisgKiBTZXQgZGV2ZWxvcGVyIGRlYnVnIGZsYWdzDQorICovDQorLyoNCitzZWN0aW9uIENPTlNPTEUgLy8gQGRlcHJlY2F0ZWQgQVZNDQorCXZlcmJvc2l0eSA9ICdNSU5JTVVNJzsgLy8gU0lMRU5UID09IE1JTklNVU0gPCBNRURJVU0gPCBNQVhJTVVNDQorZW5kc2VjdGlvbiBDT05TT0xFDQorDQorc2VjdGlvbiBERVZFTE9QRVIgLy8gQGRlcHJlY2F0ZWQgVFJBQ0UNCisJbGV2ZWwgPSAnWkVSTyc7IC8vIFpFUk8gPCBMT1cgPCBNRURJVU0gPCBISUdIIDwgVUxUUkENCisNCisJZmxhZyA9ICdQQVJTSU5HJzsgLS0+IEBkZXByZWNhdGVkIGtpbmQgPSAnUEFSU0lORyc7DQorCWZsYWcgPSAnQ09NUElMSU5HJzsNCisJZmxhZyA9ICdTVEFURU1FTlQnOw0KKwlmbGFnID0gJ0JZVEVDT0RFJzsNCitlbmRzZWN0aW9uIERFVkVMT1BFUg0KKyovDQorYm9vbCBXb3JrZmxvdzo6bG9hZENvcmVFbGVtZW50c0NvbmZpZyhPdXRTdHJlYW0gJiBMT0dHRVIpDQorew0KKwkvLyBTZXQgY29uc29sZSB2ZXJib3NpdHkgbGV2ZWwNCisJYXZtX3NldEV4ZWNWZXJib3NpdHlMZXZlbCgNCisJCQlRdWVyeTo6Z2V0UmVnZXhXUHJvcGVydHlTdHJpbmcoDQorCQkJCQlnZXRDT05TT0xFKCksICJ2ZXJib3MoaXR5fGUpIiwgIk1BWElNVU0iKSApOw0KKw0KKwkvLyBERVZFTE9QRVINCisJV09iamVjdCAqIGNvbmZpZ0RFVkVMT1BFUiA9IGdldERFVkVMT1BFUigpOw0KKw0KKwkvLyBTZXQgZGV2ZWxvcGVyIGRlYnVnIGxldmVsDQorCWF2bV9zZXREZWJ1Z0xldmVsKA0KKwkJCVF1ZXJ5OjpnZXRXUHJvcGVydHlTdHJpbmcoY29uZmlnREVWRUxPUEVSLCAibGV2ZWwiLCAiWkVSTyIpICk7DQorDQorCS8vIFNldCBkZXZlbG9wZXIgZGVidWcgZmxhZ3MNCisJTGlzdE9mU3RyaW5nIGxpc3RPZkZsYWdzOw0KKwlRdWVyeTo6Z2V0V1Byb3BlcnR5U3RyaW5nKGNvbmZpZ0RFVkVMT1BFUiwgImZsYWciLCAia2luZCIsbGlzdE9mRmxhZ3MpOw0KKw0KKwlpZiggbGlzdE9mRmxhZ3Mubm9uZW1wdHkoKSApDQorCXsNCisJCUxpc3RPZlN0cmluZzo6aXRlcmF0b3IgaXQgPSBsaXN0T2ZGbGFncy5iZWdpbigpOw0KKw0KKwkJYXZtX3NldERlYnVnRmxhZygqaXQpOw0KKw0KKwkJZm9yKCArK2l0IDsgaXQgIT0gbGlzdE9mRmxhZ3MuZW5kKCkgOyArK2l0ICkNCisJCXsNCisJCQlhdm1fc2V0RGVidWdGbGFnKCppdCk7DQorCQl9DQorCX0NCisNCisJT1NfVkVSQk9TSVRZX01JTklNVU1fT1JfREVCVUcoIExPR0dFUiApDQorCQkJPDwgX1NFV18gPDwgIkNvbnNvbGUgdmVyYm9zaXR5IGxldmVsOiBcJyINCisJCQk8PCBhdm1fc3RyRXhlY1ZlcmJvc2l0eUxldmVsKCkgPDwgIlwnIg0KKwkJCTw8IHN0ZDo6ZW5kbDsNCisNCitBVk1fSUZfREVCVUdfRU5BQkxFRA0KKw0KKwlMT0dHRVIgPDwgX1NFV18gPDwgIkRldmVsb3BlciBkZWJ1ZyBsZXZlbDogXCciDQorCQkJPDwgYXZtX3N0ckRlYnVnTGV2ZWwoKSA8PCAiXCciDQorCQkJPDwgc3RkOjplbmRsOw0KKw0KKwlMT0dHRVIgPDwgX1NFV18gPDwgIkRldmVsb3BlciBkZWJ1ZyBmbGFnczogXCciDQorCQkJPDwgYXZtX3N0ckRlYnVnRmxhZygiIHwgIikgPDwgIlwnIg0KKwkJCTw8IHN0ZDo6ZW5kbDsNCisNCitBVk1fRU5ESUZfREVCVUdfRU5BQkxFRA0KKw0KKwlyZXR1cm4oIHRydWUgKTsNCit9DQorDQorLyoqDQorICogY29uZmlndXJlIHdvcmtzcGFjZSBsb2NhdGlvbiAmIGZvbGRlcnMNCisgKiByb290IGxvY2F0aW9uDQorICogc291cmNlIGZvbGRlcg0KKyAqIG91dHB1dCBmb2xkZXINCisgKiBsb2cgZm9sZGVyDQorICogZGVidWcgZm9sZGVyDQorICogdGRkIGZvbGRlcg0KKyAqLw0KKy8qDQorc2VjdGlvbiBXT1JLU1BBQ0UgLy8gQGRlcHJlY2F0ZWQgTE9DQVRJT04NCisJcm9vdCA9ICI8d29ya3NwYWNlLXJvb3QtcGF0aD4iOw0KKwlwcm9qZWN0ID0gIjxwcm9qZWN0LXJvb3QtcGF0aD4iOyAvLyMgREVQUkVDQVRFRA0KKw0KKwlzb3VyY2UgPSAiLiI7DQorDQorCW91dHB1dCA9ICJvdXRwdXQiOw0KKwlsb2cgPSAibG9nIjsNCisJZGVidWcgPSAiZGVidWciOw0KKw0KKwl0ZGQgPSAidGRkIjsNCitlbmRzZWN0aW9uIFdPUktTUEFDRQ0KKyAqLw0KK2Jvb2wgV29ya2Zsb3c6OmxvYWRXb3Jrc3BhY2VMb2NhdGlvbnNDb25maWcoT3V0U3RyZWFtICYgTE9HR0VSKQ0KK3sNCisJYm9vbCBpc09LID0gdHJ1ZTsNCisNCisJLyoNCisJICogQ0hFQ0tJTkcgRklMRSBBTkQgRk9MREVSDQorCSAqLw0KKwlMT0dHRVIgPDwgX1NFV18gPDwgIlRoZSBsYXVuY2ggZm9sZGVyOiAiDQorCQkJPDwgVkZTOjpMYXVuY2hQYXRoIDw8IHN0ZDo6ZW5kbDsNCisNCisJV09iamVjdCAqIGNvbmZpZ1dPUktTUEFDRSA9IGdldFdPUktTUEFDRSgpOw0KKw0KKwlWRlM6OlByb2plY3RQYXRoID0gVkZTOjpXb3Jrc3BhY2VSb290UGF0aCA9DQorCQkJVkZTOjpuYXRpdmVfcGF0aCgNCisJCQkJCVF1ZXJ5OjpnZXRXUHJvcGVydHlTdHJpbmdPckVsc2UoDQorCQkJCQkJCWNvbmZpZ1dPUktTUEFDRSwgInJvb3QiLCAicHJvamVjdCIsICIuIiksDQorCQkJCQlWRlM6OkxhdW5jaFBhdGgpOw0KKw0KKwlMT0dHRVIgPDwgX1NFV18gPDwgIlRoZSA8d3Jvb3Q+IGZvbGRlcjogIg0KKwkJCTw8IFZGUzo6V29ya3NwYWNlUm9vdFBhdGggPDwgc3RkOjplbmRsOw0KKw0KKwlpZiggVkZTOjpjaGVja1JlYWRpbmdGb2xkZXIoVkZTOjpXb3Jrc3BhY2VSb290UGF0aCkgKQ0KKwl7DQorCQlWRlM6OlByb2plY3RTb3VyY2VQYXRoID0gVkZTOjpXb3Jrc3BhY2VTb3VyY2VQYXRoID0NCisJCQkJVkZTOjpuYXRpdmVfcGF0aCgNCisJCQkJCQlRdWVyeTo6Z2V0V1Byb3BlcnR5U3RyaW5nT3JFbHNlKA0KKwkJCQkJCQkJY29uZmlnV09SS1NQQUNFLCAic291cmNlIiwgInNyYyIsICIuIiksDQorCQkJCQkJVkZTOjpXb3Jrc3BhY2VSb290UGF0aCk7DQorDQorCQlMT0dHRVIgPDwgX1NFV18gPDwgIlRoZSBzb3VyY2UhIGZvbGRlcjogIg0KKwkJCQk8PCBWRlM6OnJlbGF0aXZlV29ya3NwYWNlUGF0aCggVkZTOjpXb3Jrc3BhY2VTb3VyY2VQYXRoICkNCisJCQkJPDwgc3RkOjplbmRsOw0KKwkJaWYoIG5vdCBWRlM6OmNoZWNrV3JpdGluZ0ZvbGRlcihWRlM6OldvcmtzcGFjZVNvdXJjZVBhdGgpICkNCisJCXsNCisJCQlMT0dHRVIgPDwgX1NFV18gPDwgIjwgZXJyb3IgPiBUaGUgc291cmNlIGZvbGRlciBgIg0KKwkJCQkJPDwgVkZTOjpmaWxlbmFtZSggVkZTOjpXb3Jrc3BhY2VTb3VyY2VQYXRoICkNCisJCQkJCTw8ICInID09PiBkb2Vzbid0IGV4aXN0IG9yIGlzIG5vdCB3cml0YWJsZSAhISEiDQorCQkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOw0KKw0KKwkJCWlzT0sgPSBmYWxzZTsNCisJCX0NCisNCisJCVZGUzo6UHJvamVjdE91dHB1dFBhdGggPSBWRlM6OldvcmtzcGFjZU91dHB1dFBhdGggPQ0KKwkJCQlWRlM6Om5hdGl2ZV9wYXRoKA0KKwkJCQkJCVF1ZXJ5OjpnZXRXUHJvcGVydHlTdHJpbmdPckVsc2UoDQorCQkJCQkJCQljb25maWdXT1JLU1BBQ0UsICJvdXRwdXQiLCAib3V0IiwgIm91dCIpLA0KKwkJCQkJCVZGUzo6V29ya3NwYWNlUm9vdFBhdGgpOw0KKw0KKwkJTE9HR0VSIDw8IF9TRVdfIDw8ICJUaGUgb3V0cHV0ISBmb2xkZXI6ICINCisJCQkJPDwgVkZTOjpyZWxhdGl2ZVdvcmtzcGFjZVBhdGgoIFZGUzo6V29ya3NwYWNlT3V0cHV0UGF0aCApDQorCQkJCTw8IHN0ZDo6ZW5kbDsNCisJCWlmKCBub3QgVkZTOjpjaGVja1dyaXRpbmdGb2xkZXIoVkZTOjpXb3Jrc3BhY2VPdXRwdXRQYXRoKSApDQorCQl7DQorCQkJTE9HR0VSIDw8IF9TRVdfIDw8ICI8IGVycm9yID4gVGhlIGZvbGRlciBgIg0KKwkJCQkJPDwgVkZTOjpmaWxlbmFtZSggVkZTOjpXb3Jrc3BhY2VPdXRwdXRQYXRoICkNCisJCQkJCTw8ICInID09PiBkb2Vzbid0IGV4aXN0IG9yIGlzIG5vdCB3cml0YWJsZSAhISEiDQorCQkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOw0KKw0KKwkJCWlzT0sgPSBmYWxzZTsNCisJCX0NCisNCisJCWlmKCBuZWVkRGV2ZWxvcGVyRGVidWdMb2dUcmFjZUZvbGRlcigpICkNCisJCXsNCisJCQlWRlM6OlByb2plY3RMb2dQYXRoID0gVkZTOjpXb3Jrc3BhY2VMb2dQYXRoID0NCisJCQkJCVZGUzo6bmF0aXZlX3BhdGgoDQorCQkJCQkJCVF1ZXJ5OjpnZXRXUHJvcGVydHlTdHJpbmcoDQorCQkJCQkJCQkJY29uZmlnV09SS1NQQUNFLCAibG9nIiwgImxvZyIpLA0KKwkJCQkJCQlWRlM6OldvcmtzcGFjZU91dHB1dFBhdGgpOw0KKw0KKwkJCUxPR0dFUiA8PCBfU0VXXyA8PCAiVGhlIGxvZ2dlciEgZm9sZGVyOiAiDQorCQkJCQk8PCBWRlM6OnJlbGF0aXZlV29ya3NwYWNlUGF0aCggVkZTOjpXb3Jrc3BhY2VMb2dQYXRoICkNCisJCQkJCTw8IHN0ZDo6ZW5kbDsNCisJCQlpZiggbm90IFZGUzo6Y2hlY2tXcml0aW5nRm9sZGVyKFZGUzo6V29ya3NwYWNlTG9nUGF0aCkgKQ0KKwkJCXsNCisJCQkJTE9HR0VSIDw8IF9TRVdfIDw8ICI8IGVycm9yID4gVGhlIGZvbGRlciBgIg0KKwkJCQkJCTw8IFZGUzo6ZmlsZW5hbWUoIFZGUzo6V29ya3NwYWNlTG9nUGF0aCApDQorCQkJCQkJPDwgIicgPT0+IGRvZXNuJ3QgZXhpc3Qgb3IgaXMgbm90IHdyaXRhYmxlICEhISINCisJCQkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOw0KKw0KKwkJCQlpc09LID0gZmFsc2U7DQorCQkJfQ0KKwkJfQ0KKwkJZWxzZSBpZiggaXNPSyApDQorCQl7DQorCQkJVkZTOjpQcm9qZWN0TG9nUGF0aCA9DQorCQkJCQlWRlM6OldvcmtzcGFjZUxvZ1BhdGggPQ0KKwkJCQkJCQlWRlM6OldvcmtzcGFjZU91dHB1dFBhdGg7DQorCQl9DQorDQorCQlWRlM6OlByb2plY3REZWJ1Z1BhdGggPQ0KKwkJCQlWRlM6OldvcmtzcGFjZURlYnVnUGF0aCA9DQorCQkJCQkJVkZTOjpXb3Jrc3BhY2VMb2dQYXRoOw0KKw0KK0FWTV9JRl9ERUJVR19FTkFCTEVEDQorCVZGUzo6UHJvamVjdERlYnVnUGF0aCA9IFZGUzo6V29ya3NwYWNlRGVidWdQYXRoID0NCisJCQlWRlM6Om5hdGl2ZV9wYXRoKA0KKwkJCQkJUXVlcnk6OmdldFdQcm9wZXJ0eVN0cmluZ09yRWxzZSgNCisJCQkJCQkJY29uZmlnV09SS1NQQUNFLCAiZGVidWciLCAiZGJnIiwgImRlYnVnIiksDQorCQkJCQlWRlM6OldvcmtzcGFjZU91dHB1dFBhdGgpOw0KKw0KKwlMT0dHRVIgPDwgX1NFV18gPDwgIlRoZSAhZGVidWchIGZvbGRlcjogIg0KKwkJCTw8IFZGUzo6cmVsYXRpdmVXb3Jrc3BhY2VQYXRoKCBWRlM6OldvcmtzcGFjZURlYnVnUGF0aCApDQorCQkJPDwgc3RkOjplbmRsOw0KKwlpZiggbm90IFZGUzo6Y2hlY2tXcml0aW5nRm9sZGVyKFZGUzo6V29ya3NwYWNlRGVidWdQYXRoKSApDQorCXsNCisJCUxPR0dFUiA8PCBfU0VXXyA8PCAiPCBlcnJvciA+IFRoZSBmb2xkZXIgYCINCisJCQkJPDwgVkZTOjpmaWxlbmFtZSggVkZTOjpXb3Jrc3BhY2VEZWJ1Z1BhdGggKQ0KKwkJCQk8PCAiJyA9PT4gZG9lc24ndCBleGlzdCBvciBpcyBub3Qgd3JpdGFibGUgISEhIg0KKwkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOw0KKw0KKwkJaXNPSyA9IGZhbHNlOw0KKwl9DQorQVZNX0VORElGX0RFQlVHX0VOQUJMRUQNCisNCisJCWlmKCBoYXNUZGRSZXBvcnQoKSApDQorCQl7DQorCQkJVkZTOjpQcm9qZWN0VGRkUGF0aCA9IFZGUzo6V29ya3NwYWNlVGRkUGF0aCA9DQorCQkJCQlWRlM6Om5hdGl2ZV9wYXRoKA0KKwkJCQkJCQlRdWVyeTo6Z2V0V1Byb3BlcnR5U3RyaW5nKA0KKwkJCQkJCQkJCWNvbmZpZ1dPUktTUEFDRSwgInRkZCIsICJ0ZGQiKSwNCisJCQkJCQkJVkZTOjpXb3Jrc3BhY2VSb290UGF0aCk7DQorDQorCQkJTE9HR0VSIDw8IF9TRVdfIDw8ICJUaGUgdGRkIGZvbGRlciAgIDogIg0KKwkJCQkJPDwgVkZTOjpyZWxhdGl2ZVdvcmtzcGFjZVBhdGgoIFZGUzo6V29ya3NwYWNlVGRkUGF0aCApDQorCQkJCQk8PCBzdGQ6OmVuZGw7DQorCQkJaWYoIG5vdCBWRlM6OmNoZWNrV3JpdGluZ0ZvbGRlcihWRlM6OldvcmtzcGFjZVRkZFBhdGgpICkNCisJCQl7DQorCQkJCUxPR0dFUiA8PCBfU0VXXyA8PCAiPCBlcnJvciA+IFRoZSBmb2xkZXIgYCINCisJCQkJCQk8PCBWRlM6OmZpbGVuYW1lKCBWRlM6OldvcmtzcGFjZVRkZFBhdGggKQ0KKwkJCQkJCTw8ICInID09PiBkb2Vzbid0IGV4aXN0IG9yIGlzIG5vdCB3cml0YWJsZSAhISEiDQorCQkJCQkJPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsNCisNCisJCQkJaXNPSyA9IGZhbHNlOw0KKwkJCX0NCisJCX0NCisJfQ0KKwllbHNlDQorCXsNCisJCUxPR0dFUiA8PCBfU0VXXw0KKwkJCQk8PCAiPCBlcnJvciA+IFRoZSA8d3Jvb3Q+IGZvbGRlciBsb2NhdGlvbiAiDQorCQkJCSI9PT4gZG9lc24ndCBleGlzdCBvciBpcyBub3QgUmVhZGFibGUgISEhIg0KKwkJCQk8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOw0KKw0KKwkJaXNPSyA9IGZhbHNlOw0KKwl9DQorDQorCXJldHVybiggaXNPSyApOw0KK30NCisNCisvKg0KK3NlY3Rpb24gU1lNQkVYIC8vIEBkZXByZWNhdGVkIEFWTQ0KKwltb2RlID0gJ3N0YW5kYWxvbmUnOyAvLyBzdGFuZGFsb25lIHwgc2VydmVyIHwgaW50ZXJhY3RpdmUgfCBkZWJ1Zw0KKw0KKwltdWx0aXRocmVhZCA9IGZhbHNlOw0KKwl0aHJlYWQgPSAyOw0KK2VuZHNlY3Rpb24gU1lNQkVYDQorKi8NCitib29sIFdvcmtmbG93Ojpsb2FkU3ltYmV4Q29uZmlnKCkNCit7DQorCVdPYmplY3QgKiBjb25maWdTWU1CRVggPSBnZXRTWU1CRVgoKTsNCisNCisJUGF0aENvbmRpdGlvblByb2Nlc3Nvcjo6Y2hlY2tQYXRoY29uZFNhdCA9DQorCQlTb2x2ZXJEZWY6OkRFRkFVTFRfU09MVkVSX1VTQUdFX0ZMQUcgPQ0KKwkJCVF1ZXJ5OjpnZXRSZWdleFdQcm9wZXJ0eUJvb2xlYW4oY29uZmlnU1lNQkVYLA0KKwkJCQlDT05TX1dJRDQoImNoZWNrIiwgInBhdGgiLCAiY29uZGl0aW9uIiwgInNhdGlzZmlhYmlsaXR5IiksDQorCQkJCWZhbHNlKTsNCisNCisJUGF0aENvbmRpdGlvblByb2Nlc3Nvcjo6c2VwYXJhdGlvbk9mUGNEaXNqdW5jdGlvbiA9DQorCQkJUXVlcnk6OmdldFdQcm9wZXJ0eUJvb2xlYW4oY29uZmlnU1lNQkVYLA0KKwkJCQkJInNlcGFyYXRpb25fb2ZfcGNfZGlzanVuY3Rpb24iLCBmYWxzZSk7DQorDQorDQorCXN0ZDo6c3RyaW5nIHNvbHZlcktpbmQgPSBRdWVyeTo6Z2V0UmVnZXhXUHJvcGVydHlTdHJpbmcoDQorCQkJY29uZmlnU1lNQkVYLCBDT05TX1dJRDIoImNvbnN0cmFpbnQiLCAic29sdmVyIiksICJDVkMiKTsNCisNCisJU29sdmVyRGVmOjpERUZBVUxUX1NPTFZFUl9LSU5EID0gU29sdmVyRGVmOjp0b1NvbHZlcihzb2x2ZXJLaW5kLA0KKwkJCVNvbHZlckRlZjo6U09MVkVSX0NWQ19LSU5EKTsNCisNCitBVk1fSUZfREVCVUdfRU5BQkxFRA0KKwlBVk1fT1NfTE9HIDw8IF9TRVdfIDw8ICJUaGUgZGVmYXVsdCBzb2x2ZXI6IDwgY2hlY2tzYXQ9Ig0KKwkJCTw8ICggU29sdmVyRGVmOjpERUZBVUxUX1NPTFZFUl9VU0FHRV9GTEFHID8gInRydWUiIDogImZhbHNlIiApDQorCQkJPDwgIiAsICIgPDwgc29sdmVyS2luZCA8PCAiID4gfD0+ICINCisJCQk8PCBTb2x2ZXJEZWY6OnN0clNvbHZlcihTb2x2ZXJEZWY6OkRFRkFVTFRfU09MVkVSX0tJTkQpDQorCQkJPDwgc3RkOjplbmRsOw0KK0FWTV9FTkRJRl9ERUJVR19FTkFCTEVEDQorDQorCW1NdWx0aXRhc2tpbmdGbGFnID0NCisJCQlRdWVyeTo6Z2V0V1Byb3BlcnR5Qm9vbGVhbihjb25maWdTWU1CRVgsICJtdWx0aXRhc2tpbmciLCBmYWxzZSk7DQorDQorCW1UaHJlYWRDb3VudCA9IFF1ZXJ5OjpnZXRXUHJvcGVydHlJbnQoY29uZmlnU1lNQkVYLCAidGhyZWFkIiwgMik7DQorDQorCXN0ZDo6c3RyaW5nIGV2YWxNb2RlID0gUXVlcnk6OmdldFdQcm9wZXJ0eVN0cmluZyhjb25maWdTWU1CRVgsICJtb2RlIiwgIiIpOw0KKw0KK0FWTV9JRl9ERUJVR19FTkFCTEVEDQorCUFWTV9PU19MT0cgPDwgX1NFV18gPDwgIkNvbXB1dGluZyByZXNvdXJjZTogPCBtdWx0aXRhc2tpbmc9Ig0KKwkJCTw8ICggKCBtTXVsdGl0YXNraW5nRmxhZyApID8gInRydWUiIDogImZhbHNlIiApDQorCQkJPDwgIiAsIHRocmVhZD0iIDw8IHN0YXRpY19jYXN0PCB1bnNpZ25lZCBpbnQgPiggbVRocmVhZENvdW50ICkNCisJCQk8PCAiID4iIDw8IHN0ZDo6ZW5kbDsNCitBVk1fRU5ESUZfREVCVUdfRU5BQkxFRA0KKw0KKwlyZXR1cm4oIHRydWUgKTsNCit9DQorDQorDQorLyoNCitzZWN0aW9uIFNIRUxMIC8vIERlcHJlY2F0ZWQgQVZNDQorCXN0b3AgPSAic3RvcC5hdm0iOw0KK2VuZHNlY3Rpb24gU0hFTEwNCisqLw0KK2Jvb2wgV29ya2Zsb3c6OmxvYWRTaGVsbENvbmZpZygpDQorew0KKwlXT2JqZWN0ICogY29uZmlnU0hFTEwgPSBnZXRTSEVMTCgpOw0KKw0KKwltSW5jb25kaXRpb25hbFN0b3BNYXJrZXJMb2NhdGlvbiA9IFZGUzo6bmF0aXZlX3BhdGgoDQorCQkJUXVlcnk6OmdldFdQcm9wZXJ0eVN0cmluZyhjb25maWdTSEVMTCwgInN0b3AiLCAic3RvcC5zZXciKSk7DQorDQorCW1JbmNvbmRpdGlvbmFsU3RvcE1hcmtlckxvY2F0aW9uID0gVkZTOjpuYXRpdmVfcGF0aCgNCisJCQltSW5jb25kaXRpb25hbFN0b3BNYXJrZXJMb2NhdGlvbiwgVkZTOjpXb3Jrc3BhY2VMb2dQYXRoKTsNCisNCisJcmV0dXJuKCB0cnVlICk7DQorfQ0KKw0KKw0KKy8qKg0KKyAqIE90aGVyIEVsZW1lbnRzIENvbmZpZ3VyYXRpb24NCisgKi8NCitib29sIFdvcmtmbG93Ojpsb2FkVGRkQ29uZmlnKCkNCit7DQorCW1UZGRSZWdyZXNzaW9uVGVzdGluZ0ZsYWcgPQ0KKwkJCVF1ZXJ5OjpnZXRXUHJvcGVydHlCb29sZWFuKGdldFRERCgpLCAicmVncmVzc2lvbiIsIGZhbHNlKTsNCisNCisJbVRkZFVuaXRUZXN0aW5nRmxhZyA9IFF1ZXJ5OjpnZXRXUHJvcGVydHlCb29sZWFuKGdldFRERCgpLCAidW5pdCIsIGZhbHNlKTsNCisNCisJcmV0dXJuKCB0cnVlICk7DQorfQ0KKw0KKw0KKy8qKg0KKyAqIE90aGVyIEVsZW1lbnRzIENvbmZpZ3VyYXRpb24NCisgKi8NCitib29sIFdvcmtmbG93Ojpsb2FkT3RoZXJzQ29uZmlnKCkNCit7DQorCUV4ZWN1dGlvbkNvbnRleHQ6OkVYRUNVVElPTl9DT05URVhUX0NISUxEX1RSQUNFX01BWCA9DQorCQkJUXVlcnk6OmdldFdQcm9wZXJ0eUxvbmcoZ2V0Q09OU09MRSgpLCAiZWNfc2l6ZSIsDQorCQkJCQlFeGVjdXRpb25Db250ZXh0OjpFWEVDVVRJT05fQ09OVEVYVF9DSElMRF9UUkFDRV9NQVgpOw0KKw0KKwlyZXR1cm4oIHRydWUgKTsNCit9DQorDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBDT05GSUdVUkUgQVBJDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisNCitib29sIFdvcmtmbG93Ojpjb25maWd1cmUoKQ0KK3sNCisJbU1haW5TeW1iZXhFbmdpbmUgPSBOVUxMOw0KKw0KKwlXT2JqZWN0ICogc2VxdWVuY2VESVJFQ1RPUiA9IGdldERJUkVDVE9SKCk7DQorDQorCWNvbnN0IEJGICYgbW9jUnVudGltZSA9DQorCQkJUXVlcnk6OmdldFdQcm9wZXJ0eVZhbHVlT3JFbHNlKHNlcXVlbmNlRElSRUNUT1IsICJtb2UiLCAibW9jIik7DQorDQorCWF2bV9vZmZzZXRfdCBhbkVuZ2luZU9mZnNldCA9IDA7DQorDQorCWlmKCBXT2JqZWN0TWFuYWdlcjo6aXMoIG1vY1J1bnRpbWUgKSApDQorCXsNCisJCW1NYWluU3ltYmV4RW5naW5lID0gbmV3IFN5bWJleEVuZ2luZSgqdGhpcywNCisJCQkJV09iamVjdE1hbmFnZXI6OmZyb20oIG1vY1J1bnRpbWUgKSwgYW5FbmdpbmVPZmZzZXQrKyk7DQorDQorCQlpZihub3QgIG1NYWluU3ltYmV4RW5naW5lLT5jb25maWd1cmUoKSApDQorCQl7DQorCQkJZGVsZXRlKCBtTWFpblN5bWJleEVuZ2luZSApOw0KKw0KKwkJCW1NYWluU3ltYmV4RW5naW5lID0gTlVMTDsNCisNCisJCQlyZXR1cm4oIGZhbHNlICk7DQorCQl9DQorCX0NCisJZWxzZSBpZiggbW9jUnVudGltZS5pczwgQXZtQ29kZSA+KCkgKQ0KKwl7DQorCQlTeW1iZXhFbmdpbmUgKiBuZXh0RW5naW5lID0gTlVMTDsNCisJCVN5bWJleEVuZ2luZSAqIHByZXZFbmdpbmUgPSBOVUxMOw0KKw0KKwkJQXZtQ29kZTo6aXRlcmF0b3IgaXRFbmdpbmUgPSBtb2NSdW50aW1lLnRvX3B0cjwgQXZtQ29kZSA+KCktPmJlZ2luKCk7DQorCQlBdm1Db2RlOjppdGVyYXRvciBpdEVuZCA9IG1vY1J1bnRpbWUudG9fcHRyPCBBdm1Db2RlID4oKS0+ZW5kKCk7DQorCQlmb3IoIDsgaXRFbmdpbmUgIT0gaXRFbmQgOyArK2l0RW5naW5lICkNCisJCXsNCisJCQlpZiggV09iamVjdE1hbmFnZXI6OmlzKCAqaXRFbmdpbmUgKSApDQorCQkJew0KKwkJCQluZXh0RW5naW5lID0gbmV3IFN5bWJleEVuZ2luZSgqdGhpcywNCisJCQkJCQlXT2JqZWN0TWFuYWdlcjo6ZnJvbSggKml0RW5naW5lICksIGFuRW5naW5lT2Zmc2V0KyspOw0KKw0KKwkJCQluZXh0RW5naW5lLT5zZXRQcmV2aW91c0NvcmUoIHByZXZFbmdpbmUgKTsNCisNCisJCQkJaWYoIG5leHRFbmdpbmUtPmNvbmZpZ3VyZSgpICkNCisJCQkJew0KKwkJCQkJaWYoIG1NYWluU3ltYmV4RW5naW5lID09IE5VTEwgKQ0KKwkJCQkJew0KKwkJCQkJCW1NYWluU3ltYmV4RW5naW5lID0gbmV4dEVuZ2luZTsNCisJCQkJCX0NCisNCisJCQkJCWlmKCBwcmV2RW5naW5lICE9IE5VTEwgKQ0KKwkJCQkJew0KKwkJCQkJCXByZXZFbmdpbmUtPnNldE5leHRDb3JlKCBuZXh0RW5naW5lICk7DQorCQkJCQl9DQorCQkJCQlwcmV2RW5naW5lID0gbmV4dEVuZ2luZTsNCisJCQkJfQ0KKwkJCQllbHNlDQorCQkJCXsNCisJCQkJCWRlbGV0ZSggbmV4dEVuZ2luZSApOw0KKw0KKwkJCQkJcmV0dXJuKCBmYWxzZSApOw0KKwkJCQl9DQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCXJldHVybiggZmFsc2UgKTsNCisJCQl9DQorCQl9DQorCX0NCisJZWxzZQ0KKwl7DQorCQlTeW1iZXhFbmdpbmUgKiBuZXh0RW5naW5lID0gTlVMTDsNCisJCVN5bWJleEVuZ2luZSAqIHByZXZFbmdpbmUgPSBOVUxMOw0KKw0KKwkJTGlzdDwgV09iamVjdCAqID4gZW5naW5lTGlzdDsNCisJCVF1ZXJ5OjpnZXRMaXN0V09iamVjdChzZXF1ZW5jZURJUkVDVE9SLCBlbmdpbmVMaXN0KTsNCisNCisJCUxpc3Q8IFdPYmplY3QgKiA+OjppdGVyYXRvciBpdEZvcm0gPSBlbmdpbmVMaXN0LmJlZ2luKCk7DQorCQlmb3IoIDsgaXRGb3JtICE9IGVuZ2luZUxpc3QuZW5kKCkgOyArK2l0Rm9ybSApDQorCQl7DQorCQkJbmV4dEVuZ2luZSA9IG5ldyBTeW1iZXhFbmdpbmUoKnRoaXMsICppdEZvcm0sIGFuRW5naW5lT2Zmc2V0KysgKTsNCisNCisJCQluZXh0RW5naW5lLT5zZXRQcmV2aW91c0NvcmUoIHByZXZFbmdpbmUgKTsNCisNCisJCQlpZiggbmV4dEVuZ2luZS0+Y29uZmlndXJlKCkgKQ0KKwkJCXsNCisJCQkJaWYoIG1NYWluU3ltYmV4RW5naW5lID09IE5VTEwgKQ0KKwkJCQl7DQorCQkJCQltTWFpblN5bWJleEVuZ2luZSA9IG5leHRFbmdpbmU7DQorCQkJCX0NCisNCisJCQkJaWYoIHByZXZFbmdpbmUgIT0gTlVMTCApDQorCQkJCXsNCisJCQkJCXByZXZFbmdpbmUtPnNldE5leHRDb3JlKCBuZXh0RW5naW5lICk7DQorCQkJCX0NCisJCQkJcHJldkVuZ2luZSA9IG5leHRFbmdpbmU7DQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCWRlbGV0ZSggbmV4dEVuZ2luZSApOw0KKw0KKwkJCQlyZXR1cm4oIGZhbHNlICk7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCXJldHVybiggdHJ1ZSApOw0KK30NCisNCisNCisvKioNCisgKiBQcm9sb2d1ZSBvcHRpb25zDQorICovDQordm9pZCBXb3JrZmxvdzo6c2V0UHJvbG9ndWVPcHRpb24oDQorCQljb25zdCBzdGQ6OnN0cmluZyAmIGlkLCBCRiB2YWx1ZSkNCit7DQorCWlmKCBSRUdFWF9NQVRDSChpZCwgQ09OU19XSUQyKCJjaGVjayIsICJ0eXBlIikpICkNCisJew0KKwkJQ09NUElMRV9DT05URVhUOjpERUZBVUxfVFlQRV9DSEVDS0lOR19NQVNLID0gdmFsdWUuaXNOb3RFcXVhbEZhbHNlKCk7DQorCX0NCisNCisJZWxzZSBpZiggUkVHRVhfTUFUQ0goaWQsIENPTlNfV0lEMigiaW5saW5lIiwgImRpc2FibGUiKSkgKQ0KKwl7DQorCQlDT01QSUxFX0NPTlRFWFQ6OklOTElORV9ESVNBQkxFX01BU0sgPSB2YWx1ZS5pc05vdEVxdWFsRmFsc2UoKTsNCisJfQ0KKwllbHNlIGlmKCBSRUdFWF9NQVRDSChpZCwgQ09OU19XSUQyKCJpbmxpbmUiLCAiZW5hYmxlIikpICkNCisJew0KKwkJQ09NUElMRV9DT05URVhUOjpJTkxJTkVfRU5BQkxFX01BU0sgPSB2YWx1ZS5pc05vdEVxdWFsRmFsc2UoKTsNCisJfQ0KKw0KKwllbHNlIGlmKCBSRUdFWF9NQVRDSChpZCwgQ09OU19XSUQyKCJpbmxpbmUiLCAicHJvY2VkdXJlIikpICkNCisJew0KKwkJQ09NUElMRV9DT05URVhUOjpJTkxJTkVfUFJPQ0VEVVJFX01BU0sgPSB2YWx1ZS5pc05vdEVxdWFsRmFsc2UoKTsNCisJfQ0KKw0KKwllbHNlIGlmKCBSRUdFWF9NQVRDSChpZCwgQ09OU19XSUQyKCJzdHJpbmciLCAiZGVsaW1pdGVyIikpICkNCisJew0KKwkJaWYoIHZhbHVlLmlzQ2hhcmFjdGVyKCkgKQ0KKwkJew0KKwkJCVN0cmluZzo6X0VNUFRZXy50b19wdHI8IFN0cmluZyA+KCktPnNldFF1b3RlQ2hhcigNCisJCQkJCVN0cmluZzo6REVGQVVMVF9ERUxJTUlURVIgPSB2YWx1ZS50b0NoYXJhY3RlcigpICk7DQorCQl9DQorCQllbHNlIGlmKCB2YWx1ZS5pc0J1aWx0aW5TdHJpbmcoKSApDQorCQl7DQorCQkJc3RkOjpzdHJpbmcgZGVsaW0gPSB2YWx1ZS50b0J1aWx0aW5TdHJpbmcoKTsNCisNCisJCQlTdHJpbmc6Ol9FTVBUWV8udG9fcHRyPCBTdHJpbmcgPigpLT5zZXRRdW90ZUNoYXIoDQorCQkJCQlTdHJpbmc6OkRFRkFVTFRfREVMSU1JVEVSID0NCisJCQkJCQkJKCBkZWxpbS5lbXB0eSgpID8gJ1wwJyA6IGRlbGltWzBdICkgKTsNCisJCX0NCisJfQ0KK30NCisNCisNCisvKioNCisgKiBTVEFSVA0KKyAqLw0KK2Jvb2wgV29ya2Zsb3c6OnN0YXJ0KCkNCit7DQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisJLy8vLy8gU1RBUlQgU0VRVUVOVElBTExZIEVOR0lORSBDT1JFDQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisNCisJZm9yKCBtQ3VycmVudFN5bWJleEVuZ2luZSA9IG1NYWluU3ltYmV4RW5naW5lIDsgbUN1cnJlbnRTeW1iZXhFbmdpbmUgIT0gTlVMTCA7DQorCQkJbUN1cnJlbnRTeW1iZXhFbmdpbmUgPSBtQ3VycmVudFN5bWJleEVuZ2luZS0+Z2V0TmV4dENvcmUoKSApDQorCXsNCisJCWlmKCBub3QgbUN1cnJlbnRTeW1iZXhFbmdpbmUtPnN0YXJ0Q29tcHV0aW5nKCkgKQ0KKwkJew0KKwkJCXJldHVybiggZmFsc2UgKTsNCisJCX0NCisJfQ0KKw0KKwlyZXR1cm4oIHRydWUgKTsNCit9DQorDQorDQorLyoqDQorICogRVhJVA0KKyAqLw0KK2Jvb2wgV29ya2Zsb3c6OmV4aXRJbXBsKCkNCit7DQorLy8JYm9vbCBpc0Nhc01hbmFnZXJfT0sgPSAgbUF2bUNvbmZpZ3VyYXRpb24uZ2V0Q2FzTWFuYWdlcigpLmV4aXQoKTsNCisvLw0KKy8vCXJldHVybiggUnVubmFibGVFbGVtZW50OjpleGl0KCkgJiYgaXNDYXNNYW5hZ2VyX09LICk7DQorDQorCXJldHVybiggdHJ1ZSApOw0KK30NCisNCisNCisvKioNCisgKiBSRVBPUlQgVFJBQ0UNCisgKi8NCit2b2lkIFdvcmtmbG93OjpyZXBvcnQoT3V0U3RyZWFtICYgb3MpIGNvbnN0DQorew0KKy8vCW1Bdm1Db25maWd1cmF0aW9uLmdldENhc01hbmFnZXIoKS5yZXBvcnQob3MpOw0KKy8vDQorLy8JbUF2bUNvbmZpZ3VyYXRpb24uZ2V0Q2FzTWFuYWdlcigpLnJlcG9ydChBVk1fT1NfQ09VVCk7DQorfQ0KKw0KKw0KKy8qKg0KKyAqIENPTVBVVElORw0KKyAqDQorICovDQorYm9vbCBXb3JrZmxvdzo6c3RhcnRDb21wdXRpbmcoKQ0KK3sNCisJQVZNX09TX0xPRyA8PCBzdGQ6OmVuZGwgPDwgX1NFV18gPDwgIjwgc3RhcnQgPiBDb21wdXRpbmcgLi4uIiA8PCBzdGQ6OmVuZGw7DQorDQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisJLy8vLy8gSU5JVElBTElaQVRJT04NCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKw0KKwlpZiggbm90IGluaXQoKSApDQorCXsNCisJCWF2bV9zZXRfZXhpdF9jb2RlKCBBVk1fRVhJVF9JTklUSUFMSVpJTkdfRVJST1JfQ09ERSApOw0KKw0KKwkJcmV0dXJuKCBmYWxzZSApOw0KKwl9DQorDQorDQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisJLy8vLy8gUFJFIFBST0NFU1NJTkcNCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKw0KKwlpZiggbm90IHByZXByb2Nlc3MoKSApDQorCXsNCisJCWF2bV9zZXRfZXhpdF9jb2RlKCBBVk1fRVhJVF9QUkVfUFJPQ0VTU0lOR19FUlJPUl9DT0RFICk7DQorDQorCQlyZXR1cm4oIGZhbHNlICk7DQorCX0NCisNCisNCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKwkvLy8vLyBTVEFSVA0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorCWlmKCBub3Qgc3RhcnQoKSApDQorCXsNCisJCWF2bV9zZXRfZXhpdF9jb2RlKCBBVk1fRVhJVF9QUk9DRVNTSU5HX0VSUk9SX0NPREUgKTsNCisNCisJCXJldHVybiggZmFsc2UgKTsNCisJfQ0KKw0KKw0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorCS8vLy8vIFBPU1QgUFJPQ0VTU0lORw0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorCWlmKCBub3QgcG9zdHByb2Nlc3MoKSApDQorCXsNCisJCWF2bV9zZXRfZXhpdF9jb2RlKCBBVk1fRVhJVF9QT1NUX1BST0NFU1NJTkdfRVJST1JfQ09ERSApOw0KKw0KKwkJcmV0dXJuKCBmYWxzZSApOw0KKwl9DQorDQorDQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisJLy8vLy8gRVhJVElORw0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorCWlmKCBub3QgZXhpdCgpICkNCisJew0KKwkJYXZtX3NldF9leGl0X2NvZGUoIEFWTV9FWElUX0ZJTkFMSVpJTkdfRVJST1JfQ09ERSApOw0KKw0KKwkJcmV0dXJuKCBmYWxzZSApOw0KKwl9DQorDQorDQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisJLy8vLy8gUkVQT1JUSU5HDQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisNCisJQVZNX09TX0xPRyA8PCBzdGQ6OmVuZGw7DQorDQorCXJlcG9ydChBVk1fT1NfTE9HKTsNCisNCisJQVZNX09TX0xPRyA8PCBzdGQ6OmVuZGw7DQorDQorDQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisJLy8vLy8gU0VSSUFMSVpBVElPTg0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorCS8vc2VyaWFsaXplUmVzdWx0KCk7DQorDQorCUFWTV9PU19MT0cgPDwgX1NFV18gPDwgIjwgZW5kID5Db21wdXRpbmcgLi4uIGRvbmUuIiA8PCBzdGQ6OmVuZGw7DQorDQorCXJldHVybiggdHJ1ZSApOw0KK30NCisNCisNCisvKioNCisgKiBTRVJJQUxJWkFUSU9ODQorICovDQordm9pZCBXb3JrZmxvdzo6dG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0DQorew0KKwlvcyA8PCBUQUIgPDwgInBhcmFtZXRlciB7IiA8PCBFT0w7DQorDQorCW9zIDw8IFRBQjIgPDwgImxvY2F0aW9uID0gIiA8PCBtU0VXRmlsZUxvY2F0aW9uIDw8ICI7Ig0KKwkJCTw8IEVPTF9JTkNSX0lOREVOVDsNCisNCisJaWYoIG1QYXJhbWV0ZXJXT2JqZWN0ICE9IFdPYmplY3Q6Ol9OVUxMXyApDQorCXsNCisJCW1QYXJhbWV0ZXJXT2JqZWN0LT50b1N0cmVhbShvcyk7DQorCX0NCisNCisJb3MgPDwgREVDUl9JTkRFTlRfVEFCIDw8ICJ9IiA8PCBFT0xfRkxVU0g7DQorfQ0KKw0KK30gLyogbmFtZXNwYWNlIHNlcCAqLw0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3Nldy9Xb3JrZmxvdy5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc2V3L1dvcmtmbG93LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI5MTk4YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3Nldy9Xb3JrZmxvdy5oCkBAIC0wLDAgKzEsNDMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4NCisgKg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnINCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaWZuZGVmIFdPUktGTE9XX1dPUktGTE9XX0hfDQorI2RlZmluZSBXT1JLRkxPV19XT1JLRkxPV19IXw0KKw0KKyNpbmNsdWRlIDxjb21tb24vQXZtUG9pbnRlci5oPg0KKyNpbmNsdWRlIDxjb21tb24vUnVubmFibGVFbGVtZW50Lmg+DQorDQorI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9RdWVyeS5oPg0KKyNpbmNsdWRlIDxmbWwvd29ya2Zsb3cvV09iamVjdC5oPg0KKw0KKyNpbmNsdWRlIDx1dGlsL2F2bV92ZnMuaD4NCisNCisNCituYW1lc3BhY2Ugc2VwDQorew0KKw0KK2NsYXNzIFN5bWJleEVuZ2luZTsNCisNCisNCitjbGFzcyBXb3JrZmxvdyAgOiAgcHVibGljIFJ1bm5hYmxlRWxlbWVudA0KK3sNCisNCisJQVZNX0RFQ0xBUkVfVU5DTE9OQUJMRV9DTEFTUyhXb3JrZmxvdykNCisNCitwdWJsaWM6DQorCS8qKg0KKwkqIEdMT0JBTFMNCisJKi8NCisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgU0VDVElPTl9XT1JLU1BBQ0VfUkVHRVhfSUQ7DQorDQorCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIFNFQ1RJT05fQ09OU09MRV9SRUdFWF9JRDsNCisNCisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgU0VDVElPTl9ERVZFTE9QRVJfUkVHRVhfSUQ7DQorDQorCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIFNFQ1RJT05fRElSRUNUT1JfUkVHRVhfSUQ7DQorDQorCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIFNFQ1RJT05fU0hFTExfUkVHRVhfSUQ7DQorDQorCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIFNFQ1RJT05fU1lNQkVYX1JFR0VYX0lEOw0KKw0KKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBTRUNUSU9OX1RERF9SRUdFWF9JRDsNCisNCisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgU0VDVElPTl9GQU1fUkVHRVhfSUQ7DQorDQorCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIFNFQ1RJT05fRkFNX0NPTlRBSU5FUlNfUkVHRVhfSUQ7DQorDQorCS8vIERlcHJlY2F0ZWQNCisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgU0VDVElPTl9GQU1fUVVFVUVfUkVHRVhfSUQ7DQorDQorCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIFNFQ1RJT05fRkFNX1JFRFVOREFOQ1lfUkVHRVhfSUQ7DQorDQorCXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmIFNFQ1RJT05fRkFNX1BST0NFU1NPUl9SRUdFWF9JRDsNCisNCisJc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICYgU0VDVElPTl9GQU1fRklMVEVSX1JFR0VYX0lEOw0KKw0KKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBTRUNUSU9OX0ZBTV9QUkVQUk9DRVNTX1JFR0VYX0lEOw0KKw0KKwlzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJiBTRUNUSU9OX0ZBTV9QT1NUUFJPQ0VTU19SRUdFWF9JRDsNCisNCisNCitwcm90ZWN0ZWQ6DQorCS8qKg0KKwkqIEFUVFJJQlVURVMNCisJKi8NCisJY29uc3Qgc3RkOjpzdHJpbmcgbVNFV0J1aWxkSUQ7DQorDQorCXN0ZDo6c3RyaW5nIG1TRVdGaWxlTG9jYXRpb247DQorDQorCVdPYmplY3RNYW5hZ2VyIG1XT2JqZWN0TWFuYWdlcjsNCisNCisJLy8gU3ltYmV4IFRocmVhZGluZyBjb25maWcNCisJYm9vbCBtTXVsdGl0YXNraW5nRmxhZzsNCisJYXZtX3VpbnQ4X3QgbVRocmVhZENvdW50Ow0KKw0KKwkvLyBTaGVsbCBjb25maWcNCisJc3RkOjpzdHJpbmcgbUluY29uZGl0aW9uYWxTdG9wTWFya2VyTG9jYXRpb247DQorDQorCS8vIFRERCBjb25maWcNCisJYm9vbCBtVGRkUmVncmVzc2lvblRlc3RpbmdGbGFnOw0KKwlib29sIG1UZGRVbml0VGVzdGluZ0ZsYWc7DQorDQorCVN5bWJleEVuZ2luZSAqIG1NYWluU3ltYmV4RW5naW5lOw0KKwlTeW1iZXhFbmdpbmUgKiBtQ3VycmVudFN5bWJleEVuZ2luZTsNCisNCisNCitwdWJsaWM6DQorCS8qKg0KKwkgKiBTSU5HTEVUT04NCisJICovDQorCXN0YXRpYyBXb3JrZmxvdyAqIElOU1RBTkNFOw0KKw0KKw0KKwkvKioNCisJICogQ09OU1RSVUNUT1INCisJICogRGVmYXVsdA0KKwkgKi8NCisJV29ya2Zsb3coY29uc3Qgc3RkOjpzdHJpbmcgJiBzZXdCdWlsZElEKQ0KKwk6IFJ1bm5hYmxlRWxlbWVudCggTlVMTCApLA0KKwltU0VXQnVpbGRJRCggc2V3QnVpbGRJRCApLA0KKwltU0VXRmlsZUxvY2F0aW9uKCApLA0KKwltV09iamVjdE1hbmFnZXIoIFdPYmplY3Q6OlNFV19GUU5fUk9PVCApLA0KKw0KKwkvLyBTeW1iZXggVGhyZWFkaW5nIGNvbmZpZw0KKwltTXVsdGl0YXNraW5nRmxhZyggZmFsc2UgKSwNCisJbVRocmVhZENvdW50KCAxICksDQorDQorCS8vIFNoZWxsIGNvbmZpZw0KKwltSW5jb25kaXRpb25hbFN0b3BNYXJrZXJMb2NhdGlvbiggKSwNCisNCisJbVRkZFJlZ3Jlc3Npb25UZXN0aW5nRmxhZyggZmFsc2UgKSwNCisJbVRkZFVuaXRUZXN0aW5nRmxhZyggZmFsc2UgKSwNCisNCisJbU1haW5TeW1iZXhFbmdpbmUoIE5VTEwgKSwNCisJbUN1cnJlbnRTeW1iZXhFbmdpbmUoIE5VTEwgKQ0KKwl7DQorCQlJTlNUQU5DRSA9IHRoaXM7DQorCX0NCisNCisJLyoqDQorCSAqIERFU1RSVUNUT1INCisJICovDQorCXZpcnR1YWwgfldvcmtmbG93KCkNCisJew0KKwkJLy8hISBOT1RISU5HDQorCX0NCisNCisNCisJLyoqDQorCSAqIExPQURFUiAtIERJU1BPU0VSDQorCSAqLw0KKwlib29sIGxvYWQoKTsNCisNCisJdm9pZCBkaXNwb3NlKCk7DQorDQorCS8qKg0KKwkgKiBHRVRURVINCisJICogbVdPYmplY3RNYW5hZ2VyDQorCSAqLw0KKwlpbmxpbmUgIFdPYmplY3RNYW5hZ2VyICYgZ2V0V09iamVjdE1hbmFnZXIoKQ0KKwl7DQorCQlyZXR1cm4oIG1XT2JqZWN0TWFuYWdlciApOw0KKwl9DQorDQorDQorCS8qKg0KKwkgKiBTeW1iZXggVGhyZWFkaW5nIGNvbmZpZw0KKwkgKi8NCisJaW5saW5lIGJvb2wgaXNNdWx0aXRhc2tpbmcoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIG1NdWx0aXRhc2tpbmdGbGFnICk7DQorCX0NCisNCisJaW5saW5lIGF2bV91aW50OF90IGdldFRocmVhZENvdW50KCkgY29uc3QNCisJew0KKwkJcmV0dXJuKCBtVGhyZWFkQ291bnQgKTsNCisJfQ0KKw0KKwkvKioNCisJICogR0VUVEVSDQorCSAqIG1JbmNvbmRpdGlvbmFsU3RvcE1hcmtlckxvY2F0aW9uDQorCSAqLw0KKwlpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcgJiBnZXRJbmNvbmRpdGlvbmFsU3RvcE1hcmtlckxvY2F0aW9uKCkgY29uc3QNCisJew0KKwkJcmV0dXJuKCBtSW5jb25kaXRpb25hbFN0b3BNYXJrZXJMb2NhdGlvbiApOw0KKwl9DQorDQorDQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisJLy8gQ09ORklHVVJFIEFQSQ0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorCWJvb2wgbG9hZENvbmZpZ3VyYXRpb24oY29uc3Qgc3RkOjpzdHJpbmcgJiBhV29ya2Zsb3dMb2NhdGlvbik7DQorDQorCWJvb2wgcGFyc2VDb25maWd1cmF0aW9uKCk7DQorDQorCWJvb2wgbG9hZENvcmVFbGVtZW50c0NvbmZpZyhPdXRTdHJlYW0gJiBMT0dHRVIpOw0KKw0KKwlib29sIGxvYWRXb3Jrc3BhY2VMb2NhdGlvbnNDb25maWcoT3V0U3RyZWFtICYgTE9HR0VSKTsNCisNCisJYm9vbCBsb2FkU3ltYmV4Q29uZmlnKCk7DQorDQorCWJvb2wgbG9hZFNoZWxsQ29uZmlnKCk7DQorDQorCWJvb2wgbG9hZFRkZENvbmZpZygpOw0KKw0KKwlib29sIGxvYWRPdGhlcnNDb25maWcoKTsNCisNCisJdmlydHVhbCBib29sIGNvbmZpZ3VyZSgpOw0KKw0KKw0KKwkvKioNCisJICogUHJvbG9ndWUgb3B0aW9ucw0KKwkgKi8NCisJdm9pZCBzZXRQcm9sb2d1ZU9wdGlvbihjb25zdCBzdGQ6OnN0cmluZyAmIGlkLCBCRiB2YWx1ZSk7DQorDQorDQorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisJLy8gU1RBUlQgLyBTVE9QIC8gS0lMTCAvIFNVU1BFTkQgLyBSRVNVTUUgIEFQSQ0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorCXZpcnR1YWwgYm9vbCBzdGFydCgpOw0KKw0KKw0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorCS8vIElOSVQgLyBFWElUIEFQSQ0KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorCWlubGluZSB2aXJ0dWFsIGJvb2wgaW5pdEltcGwoKQ0KKwl7DQorCQlyZXR1cm4oIHRydWUgKTsNCisJfQ0KKw0KKwl2aXJ0dWFsIGJvb2wgZXhpdEltcGwoKTsNCisNCisNCisNCisJLyoqDQorCSAqIFJFUE9SVCBUUkFDRQ0KKwkgKi8NCisJdmlydHVhbCB2b2lkIHJlcG9ydChPdXRTdHJlYW0gJiBvcykgY29uc3Q7DQorDQorDQorCS8qDQorCSAqIFBST0NFU1NJTkcNCisJICovDQorCWJvb2wgc3RhcnRDb21wdXRpbmcoKTsNCisNCisNCisJLyoqDQorCSAqIFNUQU5EQVJEIFNFUVVFTkNFDQorCSAqLw0KKwlpbmxpbmUgV09iamVjdCAqIGdldENPTlNPTEUoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIFF1ZXJ5OjpnZXRSZWdleFdTZXF1ZW5jZShtUGFyYW1ldGVyV09iamVjdCwNCisJCQkJV29ya2Zsb3c6OlNFQ1RJT05fQ09OU09MRV9SRUdFWF9JRCkgKTsNCisJfQ0KKw0KKwlpbmxpbmUgV09iamVjdCAqIGdldERFVkVMT1BFUigpIGNvbnN0DQorCXsNCisJCXJldHVybiggUXVlcnk6OmdldFJlZ2V4V1NlcXVlbmNlKG1QYXJhbWV0ZXJXT2JqZWN0LA0KKwkJCQlXb3JrZmxvdzo6U0VDVElPTl9ERVZFTE9QRVJfUkVHRVhfSUQpICk7DQorCX0NCisNCisJaW5saW5lIFdPYmplY3QgKiBnZXRESVJFQ1RPUigpIGNvbnN0DQorCXsNCisJCXJldHVybiggUXVlcnk6OmdldFJlZ2V4V1NlcXVlbmNlKG1QYXJhbWV0ZXJXT2JqZWN0LA0KKwkJCQlXb3JrZmxvdzo6U0VDVElPTl9ESVJFQ1RPUl9SRUdFWF9JRCwgbVBhcmFtZXRlcldPYmplY3QpICk7DQorCX0NCisNCisJaW5saW5lIFdPYmplY3QgKiBnZXRTSEVMTCgpIGNvbnN0DQorCXsNCisJCXJldHVybiggUXVlcnk6OmdldFJlZ2V4V1NlcXVlbmNlKG1QYXJhbWV0ZXJXT2JqZWN0LA0KKwkJCQlXb3JrZmxvdzo6U0VDVElPTl9TSEVMTF9SRUdFWF9JRCkgKTsNCisJfQ0KKw0KKwlpbmxpbmUgV09iamVjdCAqIGdldFNZTUJFWCgpIGNvbnN0DQorCXsNCisJCXJldHVybiggUXVlcnk6OmdldFJlZ2V4V1NlcXVlbmNlKG1QYXJhbWV0ZXJXT2JqZWN0LA0KKwkJCQlXb3JrZmxvdzo6U0VDVElPTl9TWU1CRVhfUkVHRVhfSUQpICk7DQorCX0NCisNCisJaW5saW5lIFdPYmplY3QgKiBnZXRUREQoKSBjb25zdA0KKwl7DQorCQlyZXR1cm4oIFF1ZXJ5OjpnZXRSZWdleFdTZXF1ZW5jZShtUGFyYW1ldGVyV09iamVjdCwNCisJCQkJV29ya2Zsb3c6OlNFQ1RJT05fVEREX1JFR0VYX0lEKSApOw0KKwl9DQorDQorCWlubGluZSBXT2JqZWN0ICogZ2V0V09SS1NQQUNFKCkgY29uc3QNCisJew0KKwkJcmV0dXJuKCBRdWVyeTo6Z2V0UmVnZXhXU2VxdWVuY2UobVBhcmFtZXRlcldPYmplY3QsDQorCQkJCVdvcmtmbG93OjpTRUNUSU9OX1dPUktTUEFDRV9SRUdFWF9JRCkgKTsNCisJfQ0KKw0KKw0KKwkvKioNCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkvLyBURVNUIERSSVZFTiBERVZFTE9QTUVOVA0KKwlzZWN0aW9uIFRERA0KKwkJcmVwb3J0ID0gInJlcG9ydE5hbWUiOw0KKw0KKwkJcmVncmVzc2lvbiA9IHRydWU7DQorCQl1bml0ID0gdHJ1ZTsNCisJZW5kc2VjdGlvbiBUREQNCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKi8NCisJaW5saW5lIGJvb2wgaGFzVGRkUmVwb3J0KCkNCisJew0KKwkJcmV0dXJuKCBRdWVyeTo6aGFzV1Byb3BlcnR5U3RyaW5nKGdldFRERCgpLCAicmVwb3J0IikgKTsNCisJfQ0KKw0KKwlpbmxpbmUgc3RkOjpzdHJpbmcgZ2V0VGRkUmVwb3J0KGNvbnN0IHN0ZDo6c3RyaW5nICYgYURlZmF1bHRWYWx1ZSA9ICJyZXBvcnQudGRkIikNCisJew0KKwkJc3RkOjpzdHJpbmcgYUxvY2F0aW9uID0NCisJCQkJUXVlcnk6OmdldFdQcm9wZXJ0eVN0cmluZyhnZXRUREQoKSwgInJlcG9ydCIsIGFEZWZhdWx0VmFsdWUpOw0KKw0KKwkJc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSBhTG9jYXRpb24uZmluZF9sYXN0X29mKCcuJyk7DQorCQlpZiggcG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zICkNCisJCXsNCisJCQlhTG9jYXRpb24uaW5zZXJ0KHBvcywgIl9hdm1fIiArIG1TRVdCdWlsZElEKTsNCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQlhTG9jYXRpb24gPSBhTG9jYXRpb24gKyAiX2F2bV8iICsgbVNFV0J1aWxkSUQgKyAiLnRkZCI7DQorCQl9DQorDQorCQlyZXR1cm4oIFZGUzo6bmF0aXZlX3BhdGgoYUxvY2F0aW9uKSApOw0KKwl9DQorDQorCWlubGluZSBzdGQ6OnN0cmluZyBnZXRUZGRSZXBvcnRMb2NhdGlvbigNCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFEZWZhdWx0VmFsdWUgPSAicmVwb3J0LnRkZCIpDQorCXsNCisJCXJldHVybiggVkZTOjpuYXRpdmVfcGF0aCgNCisJCQkJZ2V0VGRkUmVwb3J0KGFEZWZhdWx0VmFsdWUpLCBWRlM6OldvcmtzcGFjZVRkZFBhdGgpICk7DQorCX0NCisNCisJaW5saW5lIGJvb2wgaXNUZGRSZWdyZXNzaW9uVGVzdGluZyhib29sIGFEZWZhdWx0VmFsdWUgPSBmYWxzZSkNCisJew0KKwkJcmV0dXJuKCBtVGRkUmVncmVzc2lvblRlc3RpbmdGbGFnICk7DQorCX0NCisNCisJaW5saW5lIGJvb2wgaXNUZGRVbml0VGVzdGluZyhib29sIGFEZWZhdWx0VmFsdWUgPSBmYWxzZSkNCisJew0KKwkJcmV0dXJuKCBtVGRkVW5pdFRlc3RpbmdGbGFnICk7DQorCX0NCisNCisNCisJLyoqDQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJc2VjdGlvbiBUUkFDRSAtLT4gZGV2ZWxvcGVyDQorCQlsb2cgPSAiYXZtLmxvZyI7DQorDQorCQlkZWJ1ZyA9ICJhdm0udHJhY2UiOw0KKwkJbGV2ZWwgPSAnTUVESVVNJzsgLy8gWkVSTyA8IExPVyA8IE1FRElVTSA8IEhJR0ggPCBVTFRSQQ0KKw0KKwkJa2luZCA9ICdQQVJTSU5HJzsgLS0+IGZsYWcgPSAnUEFSU0lORyc7DQorCQlraW5kID0gJ0NPTVBJTElORyc7DQorCQlraW5kID0gJ0NPTVBVVElORyc7DQorDQorCQlraW5kID0gJ1RSQUNFJzsNCisNCisJCWtpbmQgPSAnUFJPQ0VTU09SJzsNCisNCisJCWtpbmQgPSAnUFJPR1JBTSc7DQorCQlraW5kID0gJ1NUQVRFTUVOVCc7DQorCQlraW5kID0gJ0JZVEVDT0RFJzsNCisNCisJCWtpbmQgPSAnU1RNTlRfQVNTSUdOJzsNCisNCisJZW5kc2VjdGlvbiBUUkFDRSAtLT4gZGV2ZWxvcGVyDQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICovDQorCWlubGluZSBib29sIG5lZWREZXZlbG9wZXJEZWJ1Z0xvZ1RyYWNlRm9sZGVyKCkNCisJew0KKwkJcmV0dXJuKCBoYXNEZXZlbG9wZXJEZWJ1Z0xvZ0ZpbGUoKQ0KKwkJCQl8fCBoYXNEZXZlbG9wZXJEZWJ1Z1RyYWNlRmlsZSgpICk7DQorCX0NCisNCisJaW5saW5lIGJvb2wgaGFzRGV2ZWxvcGVyRGVidWdMb2dGaWxlKCkNCisJew0KKwkJcmV0dXJuKCBRdWVyeTo6aGFzV1Byb3BlcnR5U3RyaW5nKGdldERFVkVMT1BFUigpLCAibG9nIikgKTsNCisJfQ0KKw0KKwlpbmxpbmUgc3RkOjpzdHJpbmcgZ2V0RGV2ZWxvcGVyRGVidWdMb2dGaWxlKA0KKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYURlZmF1bHRWYWx1ZSA9ICJhdm0ubG9nIikNCisJew0KKwkJcmV0dXJuKCBWRlM6Om5hdGl2ZV9wYXRoKCBRdWVyeTo6Z2V0V1Byb3BlcnR5U3RyaW5nKA0KKwkJCQlnZXRERVZFTE9QRVIoKSwgImxvZyIsIGFEZWZhdWx0VmFsdWUpICkgKTsNCisJfQ0KKw0KKwlpbmxpbmUgc3RkOjpzdHJpbmcgZ2V0RGV2ZWxvcGVyRGVidWdMb2dGaWxlTG9jYXRpb24oDQorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRGVmYXVsdFZhbHVlID0gImF2bS5sb2ciKQ0KKwl7DQorCQlyZXR1cm4oIFZGUzo6bmF0aXZlX3BhdGgoDQorCQkJCWdldERldmVsb3BlckRlYnVnTG9nRmlsZShhRGVmYXVsdFZhbHVlKSwNCisJCQkJVkZTOjpXb3Jrc3BhY2VMb2dQYXRoKSApOw0KKwl9DQorDQorCS8qKg0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqIEdMT0JBTCBERUJVRyBMRVZFTA0KKwkgKg0KKwkgKiBkZWJ1ZyA9ICJhdm0udHJhY2UiOw0KKwkgKiBsZXZlbCA9ICdaRVJPJzsgLy8gWkVSTyA8IExPVyA8IE1FRElVTSA8IEhJR0ggPCBVTFRSQQ0KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCSAqLw0KKw0KKwlpbmxpbmUgYm9vbCBoYXNEZXZlbG9wZXJEZWJ1Z1RyYWNlRmlsZSgpDQorCXsNCisJCXJldHVybiggUXVlcnk6Omhhc1dQcm9wZXJ0eVN0cmluZyhnZXRERVZFTE9QRVIoKSwgImRlYnVnIikgKTsNCisJfQ0KKw0KKwlpbmxpbmUgc3RkOjpzdHJpbmcgZ2V0RGV2ZWxvcGVyRGVidWdUcmFjZUZpbGUoDQorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRGVmYXVsdFZhbHVlID0gImF2bS5kYmciKQ0KKwl7DQorCQlyZXR1cm4oIFZGUzo6bmF0aXZlX3BhdGgoIFF1ZXJ5OjpnZXRXUHJvcGVydHlTdHJpbmcoDQorCQkJCWdldERFVkVMT1BFUigpLCAiZGVidWciLCBhRGVmYXVsdFZhbHVlKSkgKTsNCisJfQ0KKw0KKwlpbmxpbmUgc3RkOjpzdHJpbmcgZ2V0RGV2ZWxvcGVyRGVidWdUcmFjZUZpbGVMb2NhdGlvbigNCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFEZWZhdWx0VmFsdWUgPSAiYXZtLmRiZyIpDQorCXsNCisJCXJldHVybiggVkZTOjpuYXRpdmVfcGF0aCgNCisJCQkJZ2V0RGV2ZWxvcGVyRGVidWdUcmFjZUZpbGUoYURlZmF1bHRWYWx1ZSksDQorCQkJCVZGUzo6V29ya3NwYWNlTG9nUGF0aCkgKTsNCisJfQ0KKw0KKw0KKwkvKioNCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwkgKiBTRVJJQUxJWkFUSU9ODQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJICovDQorCXZvaWQgdG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0Ow0KKw0KK307DQorDQorfSAvKiBuYW1lc3BhY2Ugc2VwICovDQorDQorI2VuZGlmIC8qIFdPUktGTE9XX1dPUktGTE9XX0hfICovDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc29sdmVyL0NNYWtlTGlzdHMudHh0IGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc29sdmVyL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YTcwMjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9zb2x2ZXIvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwyMCBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKyMgICAgICAgICAgICAgICAgICBDTWFrZSBmaWxlIGZvciB0aGUgU09MVkVSIGxpYnJhcnkgDQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKw0KKyMgQysrIHNvdXJjZSBmaWxlcyB0byB0YWtlIGludG8gYWNjb3VudCAoYWxsIGZpbGVzIG1hdGNoaW5nIHBhdHRlcm5zIHJlY3Vyc2l2ZWx5KQ0KK2ZpbGUgKEdMT0JfUkVDVVJTRSBTT0xWRVJfQ1hYX1NSQ19GSUxFUyAqLmNwcCAqLmgpDQorDQorIyBUYXJnZXQgdG8gYnVpbGQNCithZGRfbGlicmFyeSAoc29sdmVyIFNUQVRJQyAke1NPTFZFUl9DWFhfU1JDX0ZJTEVTfSkNCisNCisjIEluY2x1ZGUgZGlyZWN0b3JpZXMgKGludGVybmFsKQ0KK3RhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzIChzb2x2ZXIgUFVCTElDIC4uKSAjwqBGSVhNRSA6IGV4cGxpY2l0IHRoZSBkZXBlbmRlbmNpZXMgbGliIGJ5IGxpYg0KKw0KKyMgVGFyZ2V0IGluY2x1ZGUgZGlyZWN0b3JpZXMgKGV4dGVybmFsKQ0KK3RhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzIChzb2x2ZXIgUFVCTElDICR7R01QX0lOQ0xVREVfRElSfSAke0dNUFhYX0lOQ0xVREVfRElSfSkNCit0YXJnZXRfaW5jbHVkZV9kaXJlY3RvcmllcyAoc29sdmVyIFBVQkxJQyAke0Jvb3N0X0lOQ0xVREVfRElSU30pDQordGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMgKHNvbHZlciBQVUJMSUMgJHtDVkM0X0lOQ0xVREVfRElSfSAke0NWQzRfSU5DTFVERV9ESVJ9L2N2YzQpICMgRklYTUUgKGNvbmZ1c2lvbiBiZXR3ZWVuIGluY2x1ZGUvY3ZjNCBvciBpbmNsdWRlL2N2YzQvY3ZjNCkNCisNCisNCithZGRfZGVwZW5kZW5jaWVzKHNvbHZlciByZXNjYW5fY3ZjNCkNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9zb2x2ZXIvQ1ZDNFNvbHZlci5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9zb2x2ZXIvQ1ZDNFNvbHZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE5Yzc3NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3NvbHZlci9DVkM0U29sdmVyLmNwcApAQCAtMCwwICsxLDI0MjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxNSBub3YuIDIwMTIKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkNWQzRTb2x2ZXIuaCIKKworLyoKKyAqIEhlcmUgYmVjYXVzZSAiU29sdmVyRGVmLmgiIGNvdWxkIGRlZmluZSB0aGlzIG1hY3JvCisgKi8KKyNpZiBkZWZpbmVkKCBfQVZNX1NPTFZFUl9DVkM0XyApCisKKworI2luY2x1ZGUgPHV0aWwvYXZtX3Zmcy5oPgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQXZtQ29kZS5oPgorI2luY2x1ZGUgPGZtbC9idWlsdGluL0Jvb2xlYW4uaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9CdWlsdGluQ29udGFpbmVyLmg+CisjaW5jbHVkZSA8Zm1sL2J1aWx0aW4vQ2hhcmFjdGVyLmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkNvbXBhcmVyLmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkNvbnN0YW50Lmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkNvbnN0cnVjdG9yLmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvblR5cGVDaGVja2VyLmg+CisjaW5jbHVkZSA8Zm1sL251bWVyaWMvRmxvYXQuaD4KKyNpbmNsdWRlIDxmbWwvYnVpbHRpbi9JZGVudGlmaWVyLmg+CisjaW5jbHVkZSA8Zm1sL251bWVyaWMvSW50ZWdlci5oPgorI2luY2x1ZGUgPGZtbC9udW1lcmljL1JhdGlvbmFsLmg+CisjaW5jbHVkZSA8Zm1sL2J1aWx0aW4vU3RyaW5nLmg+CisKKyNpbmNsdWRlIDxmbWwvb3BlcmF0b3IvT3BlcmF0b3IuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkNvbnRleHQuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25EYXRhLmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvUnVudGltZUZvcm0uaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9SdW50aW1lSUQuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9UYWJsZU9mRGF0YS5oPgorCisjaW5jbHVkZSA8Zm1sL3R5cGUvVHlwZU1hbmFnZXIuaD4KKworI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9XT2JqZWN0Lmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSUQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3N0ZDo6c3RyaW5nIENWQzRTb2x2ZXI6OklEID0gIkNWQzQiOworCitzdGQ6OnN0cmluZyBDVkM0U29sdmVyOjpERVNDUklQVElPTiA9ICJDVkM0ICIKKwkJIidDb29wZXJhdGluZyBWYWxpZGl0eSBDaGVja2VyIDQsIEVmZmljaWVudCBBdXRvbWF0aWMgVGhlb3JlbSBQcm92ZXIgIgorCQkiZm9yIFNhdGlzZmlhYmlsaXR5IE1vZHVsbyBUaGVvcmllcyBwcm9ibGVtcywgQlNEIExpY2Vuc2UnIjsKKworYXZtX3VpbnQ2NF90IENWQzRTb2x2ZXI6OlNPTFZFUl9TRVNTSU9OX0lEID0gMDsKKworCisvL0ZvciBhdXRvbWF0aWMgZGVzdHJveSBvZiB0aGVzZSBDVkM0IG9iamVjdCB1c2luZyBhc3NpZ25tZW50CitDVkM0OjpFeHByIENWQzRTb2x2ZXI6OkNWQzRfRVhQUl9OVUxMOworQ1ZDNDo6VHlwZSBDVkM0U29sdmVyOjpDVkM0X1RZUEVfTlVMTDsKKworCisvKioKKyAqIENPTlNUUlVDVE9SCisgKiBEZWZhdWx0CisgKi8KK0NWQzRTb2x2ZXI6OkNWQzRTb2x2ZXIoYm9vbCBwcm9kdWNlX21vZGVsc19mbGFnKQorOiBiYXNlX3RoaXNfdHlwZShDVkM0X1RZUEVfTlVMTCwgQ1ZDNF9FWFBSX05VTEwpLAorbVBhcmFtUHJlZml4KCAiUF8iICksCittRXhwck1hbmFnZXIoICksCittU210RW5naW5lKCAmIG1FeHByTWFuYWdlciApCit7CisJU01UX1RZUEVfQk9PTCA9IG1FeHByTWFuYWdlci5ib29sZWFuVHlwZSgpOworCVNNVF9UWVBFX0lOVCAgPSBtRXhwck1hbmFnZXIuaW50ZWdlclR5cGUoKTsKKwlTTVRfVFlQRV9CVjMyID0gbUV4cHJNYW5hZ2VyLm1rQml0VmVjdG9yVHlwZSgzMik7CisJU01UX1RZUEVfQlY2NCA9IG1FeHByTWFuYWdlci5ta0JpdFZlY3RvclR5cGUoNjQpOworCVNNVF9UWVBFX1JFQUwgPSBtRXhwck1hbmFnZXIucmVhbFR5cGUoKTsKKworCVNNVF9UWVBFX05VTUJFUiA9IG1FeHByTWFuYWdlci5yZWFsVHlwZSgpOworCisJU01UX1RZUEVfU1RSSU5HID0gbUV4cHJNYW5hZ2VyLnN0cmluZ1R5cGUoKTsKKworCVNNVF9DU1RfQk9PTF9UUlVFICA9IG1FeHByTWFuYWdlci5ta0NvbnN0KHRydWUpOworCVNNVF9DU1RfQk9PTF9GQUxTRSA9IG1FeHByTWFuYWdlci5ta0NvbnN0KGZhbHNlKTsKKworCVNNVF9DU1RfSU5UX1pFUk8gPSBtRXhwck1hbmFnZXIubWtDb25zdChDVkM0OjpSYXRpb25hbCgwKSk7CisJU01UX0NTVF9JTlRfT05FICA9IG1FeHByTWFuYWdlci5ta0NvbnN0KENWQzQ6OlJhdGlvbmFsKDEpKTsKKworCisvLwkvLyBTZXQgdGhlIGxvZ2ljIDogTElORUFSIEFSSVRITUVUSUMKKy8vCW1TbXRFbmdpbmUuc2V0TG9naWMoIlFGX0xJUkEiKTsKKy8vCS8vIFNldCB0aGUgbG9naWMgOiBCSVQgVkVDVE9SCisvLwltU210RW5naW5lLnNldExvZ2ljKCJRRl9CViIpOworCisJLy8gUHJvZHVjZSBNb2RlbHMKKwltU210RW5naW5lLnNldE9wdGlvbigicHJvZHVjZS1tb2RlbHMiLCBwcm9kdWNlX21vZGVsc19mbGFnKTsKKworCS8vIEVuYWJsZSBNdWx0aXBsZSBRdWVyaWVzCisJbVNtdEVuZ2luZS5zZXRPcHRpb24oImluY3JlbWVudGFsIiwgdHJ1ZSk7CisJLy9EaXNhYmxlIGRhZ2lmeWluZyB0aGUgb3V0cHV0CisJbVNtdEVuZ2luZS5zZXRPcHRpb24oImRlZmF1bHQtZGFnLXRocmVzaCIsIDApOworCS8vIFNldCB0aGUgb3V0cHV0LWxhbmd1YWdlIHRvIENWQydzCisJbVNtdEVuZ2luZS5zZXRPcHRpb24oIm91dHB1dC1sYW5ndWFnZSIsICJjdmM0Iik7CisKK30KKworCisvKioKKyAqIERFU1RSVUNUT1IKKyAqLworQ1ZDNFNvbHZlcjo6fkNWQzRTb2x2ZXIoKQoreworCVNNVF9UWVBFX0JPT0wgPSBDVkM0X1RZUEVfTlVMTDsKKwlTTVRfVFlQRV9JTlQgID0gQ1ZDNF9UWVBFX05VTEw7CisJU01UX1RZUEVfQlYzMiA9IENWQzRfVFlQRV9OVUxMOworCVNNVF9UWVBFX0JWNjQgPSBDVkM0X1RZUEVfTlVMTDsKKwlTTVRfVFlQRV9SRUFMID0gQ1ZDNF9UWVBFX05VTEw7CisKKwlTTVRfVFlQRV9OVU1CRVIgPSBDVkM0X1RZUEVfTlVMTDsKKworCVNNVF9UWVBFX1NUUklORyA9IENWQzRfVFlQRV9OVUxMOworCisJU01UX0NTVF9CT09MX1RSVUUgID0gQ1ZDNF9FWFBSX05VTEw7CisJU01UX0NTVF9CT09MX0ZBTFNFID0gQ1ZDNF9FWFBSX05VTEw7CisKKwlTTVRfQ1NUX0lOVF9aRVJPID0gQ1ZDNF9FWFBSX05VTEw7CisJU01UX0NTVF9JTlRfT05FICA9IENWQzRfRVhQUl9OVUxMOworfQorCisKKy8qKgorICogQ09ORklHVVJFCisgKi8KK2Jvb2wgQ1ZDNFNvbHZlcjo6Y29uZmlndXJlKAorCQlDb25maWd1cmF0aW9uICYgYUNvbmZpZ3VyYXRpb24sIFdPYmplY3QgKiB3ZkZpbHRlck9iamVjdCwKKwkJTGlzdE9mUGFpck1hY2hpbmVEYXRhICYgbGlzdE9mU2VsZWN0ZWRWYXJpYWJsZSkKK3sKKwlpZiggbm90IFNhdFNvbHZlcjo6Y29uZmlndXJlKAorCQlhQ29uZmlndXJhdGlvbiwgd2ZGaWx0ZXJPYmplY3QsIGxpc3RPZlNlbGVjdGVkVmFyaWFibGUpICkKKwl7CisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisKKy8qKgorICogQ1JFQVRFIC0gREVTVFJPWQorICogVmFsaWRpdHlDaGVja2VyCisgKi8KKworYm9vbCBDVkM0U29sdmVyOjpjcmVhdGVDaGVja2VyKCkKK3sKKy8vCS8vIFNldCB0aGUgbG9naWMgOiBMSU5FQVIgQVJJVEhNRVRJQworLy8JbVNtdEVuZ2luZS5zZXRMb2dpYygiUUZfTElSQSIpOworLy8JLy8gU2V0IHRoZSBsb2dpYyA6IEJJVCBWRUNUT1IKKy8vCW1TbXRFbmdpbmUuc2V0TG9naWMoIlFGX0JWIik7CisKKy8vCS8vIFByb2R1Y2UgTW9kZWxzCisvLwltU210RW5naW5lLnNldE9wdGlvbigicHJvZHVjZS1tb2RlbHMiLCBmYWxzZSk7CisvLworLy8JLy8gRW5hYmxlIE11bHRpcGxlIFF1ZXJpZXMKKy8vCW1TbXRFbmdpbmUuc2V0T3B0aW9uKCJpbmNyZW1lbnRhbCIsIHRydWUpOworLy8JLy9EaXNhYmxlIGRhZ2lmeWluZyB0aGUgb3V0cHV0CisvLwltU210RW5naW5lLnNldE9wdGlvbigiZGVmYXVsdC1kYWctdGhyZXNoIiwgMCk7CisvLwkvLyBTZXQgdGhlIG91dHB1dC1sYW5ndWFnZSB0byBDVkMncworLy8JbVNtdEVuZ2luZS5zZXRPcHRpb24oIm91dHB1dC1sYW5ndWFnZSIsICJjdmM0Iik7CisKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNNVF9TT0xWSU5HICkKKwkrK1NPTFZFUl9TRVNTSU9OX0lEOworQVZNX0lGX0RFQlVHX0xFVkVMX0dURV9ISUdICisJCW1Mb2dGb2xkZXJMb2NhdGlvbiA9IE9TUygpIDw8IFZGUzo6UHJvamVjdExvZ1BhdGggPDwgIi9jdmM0LyI7CisKKwkJaWYgKCBub3QgVkZTOjpjaGVja1dyaXRpbmdGb2xkZXIobUxvZ0ZvbGRlckxvY2F0aW9uKSApCisJCXsKKwkJCUFWTV9PU19MT0cgPDwgIiBDVkM0U29sdmVyOjpjcmVhdGVDaGVja2VyIDo+IEVycm9yOiBUaGUgZm9sZGVyICIKKwkJCQkJPDwgImAiIDw8IG1Mb2dGb2xkZXJMb2NhdGlvbgk8PCAiJyAiCisJCQkJCTw8ICItLS0+IGRvZXNuJ3QgZXhpc3Qgb3IgaXMgbm90IHdyaXRhYmxlICEhISIKKwkJCQkJPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKwkJCXJldHVybiggZmFsc2UgKTsKKwkJfQorCisJCXN0ZDo6c3RyaW5nIGxvZ0ZpbGVMb2NhdGlvbiA9ICggT1NTKCkgPDwgbUxvZ0ZvbGRlckxvY2F0aW9uCisJCQkJPDwgImxvZ18iIDw8IFNPTFZFUl9TRVNTSU9OX0lEIDw8ICIuY3ZjNCIgKTsKKworLy9DVkMzCW1TbXRFbmdpbmUuc2V0T3B0aW9uKCJkdW1wLWxvZyIsIGxvZ0ZpbGVMb2NhdGlvbik7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfR1RFX0hJR0gKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTTVRfU09MVklORyApCisKKy8vCVNNVF9UWVBFX0JPT0wgPSBtRXhwck1hbmFnZXIuYm9vbFR5cGUoKTsKKy8vCVNNVF9UWVBFX0lOVCAgPSBtRXhwck1hbmFnZXIuaW50ZWdlclR5cGUoKTsKKy8vCVNNVF9UWVBFX0JWMzIgPSBtRXhwck1hbmFnZXIubWtCaXRWZWN0b3JUeXBlKDMyKTsKKy8vCVNNVF9UWVBFX0JWNjQgPSBtRXhwck1hbmFnZXIubWtCaXRWZWN0b3JUeXBlKDY0KTsKKy8vCVNNVF9UWVBFX1JFQUwgPSBtRXhwck1hbmFnZXIucmVhbFR5cGUoKTsKKworLy8JU01UX1RZUEVfTlVNQkVSID0gbUV4cHJNYW5hZ2VyLnJlYWxUeXBlKCk7CisKKy8vCVNNVF9UWVBFX1NUUklORyA9IG1FeHByTWFuYWdlci5zdHJpbmdUeXBlKCk7CisKKy8vCVNNVF9DU1RfQk9PTF9UUlVFICA9IG1FeHByTWFuYWdlci5ta0NvbnN0KHRydWUpOworLy8JU01UX0NTVF9CT09MX0ZBTFNFID0gbUV4cHJNYW5hZ2VyLm1rQ29uc3QoZmFsc2UpOworLy8KKy8vCVNNVF9DU1RfSU5UX1pFUk8gID0gbUV4cHJNYW5hZ2VyLm1rQ29uc3QoMCk7CisvLwlTTVRfQ1NUX0lOVF9PTkUgICA9IG1FeHByTWFuYWdlci5ta0NvbnN0KDEpOworCisJcmVzZXRUYWJsZSgpOworCisJcmV0dXJuKCB0cnVlICk7Cit9CisKK2Jvb2wgQ1ZDNFNvbHZlcjo6ZGVzdHJveUNoZWNrZXIoKQoreworCXJlc2V0VGFibGUoKTsKKworLy8JU01UX1RZUEVfQk9PTCA9IENWQzRfVFlQRV9OVUxMOworLy8JU01UX1RZUEVfSU5UICA9IENWQzRfVFlQRV9OVUxMOworLy8JU01UX1RZUEVfQlYzMiA9IENWQzRfVFlQRV9OVUxMOworLy8JU01UX1RZUEVfQlY2NCA9IENWQzRfVFlQRV9OVUxMOworLy8JU01UX1RZUEVfUkVBTCA9IENWQzRfVFlQRV9OVUxMOworCisvLwlTTVRfVFlQRV9OVU1CRVIgPSBDVkM0X1RZUEVfTlVMTDsKKworLy8JU01UX1RZUEVfU1RSSU5HID0gQ1ZDNF9UWVBFX05VTEw7CisKKy8vCVNNVF9DU1RfQk9PTF9UUlVFICA9IENWQzRfRVhQUl9OVUxMOworLy8JU01UX0NTVF9CT09MX0ZBTFNFID0gQ1ZDNF9FWFBSX05VTEw7CisvLworLy8JU01UX0NTVF9JTlRfWkVSTyAgPSBDVkM0X0VYUFJfTlVMTDsKKy8vCVNNVF9DU1RfSU5UX09ORSAgID0gQ1ZDNF9FWFBSX05VTEw7CisKKy8vCWRlbGV0ZSggbUV4cHJNYW5hZ2VyICk7CisvLwltRXhwck1hbmFnZXIgPSBOVUxMOworCisJcmV0dXJuKCB0cnVlICk7Cit9CisKK2Jvb2wgQ1ZDNFNvbHZlcjo6cmVzZXRUYWJsZSgpCit7CisJYmFzZV90aGlzX3R5cGU6OnJlc2V0VGFibGUoKTsKKworCW1UYWJsZU9mUGFyYW1ldGVyRXhwci5hcHBlbmQoIENWQzRfRVhQUl9OVUxMICk7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisKKy8qKgorICogUFJPVkVSCisgKi8KKy8vYm9vbCBDVkM0U29sdmVyOjppc1N1YlNldCgKKy8vCQljb25zdCBFeGVjdXRpb25Db250ZXh0ICYgbmV3RUMsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBvbGRFQykKKy8veworLy8JdHJ5CisvLwl7CisvLwkJY3JlYXRlQ2hlY2tlcigpOworLy8KKy8vCQlDVkM0OjpFeHByIG5ld0Zvcm11bGE7CisvLwkJQ1ZDNDo6RXhwciBvbGRGb3JtdWxhOworLy8KKy8vCQkvLyBPbiBjb25zdHJ1aXQgbGEgZm9ybXVsZSBuZXdGb3JtdWxhID0KKy8vCQkvLyBnYXJkZV9uZXdFQyBBTkQKKy8vCQkvLyB4MSA9IGUxIEFORCAtLS0tIEFORCB4biA9IGVuCisvLwkJLy8KKy8vCQkvLyBldCBsYSBmb3JtdWxlIG9sZEZvcm11bGEgPQorLy8JCS8vIGdhcmRlX29sZEVDIEFORAorLy8JCS8vIHgxID0gZScxIEFORCAtLS0tIEFORCB4biA9IGUnbiBBTkQKKy8vCQkvLyBlMSA9IGUnMSBBTkQgLS0tLSBBTkQgZW4gPSBlJ24KKy8vCQkvLworLy8JCWVkVG9FeHByV2l0aFZhckVxdWFsaXR5KG5ld0VDLnJlZkV4ZWN1dGlvbkRhdGEoKSwgbmV3Rm9ybXVsYSwKKy8vCQkJCW9sZEVDLnJlZkV4ZWN1dGlvbkRhdGEoKSwgb2xkRm9ybXVsYSk7CisvLworLy9BVk1fSUZfREVCVUdfRkxBRyggU01UX1NPTFZJTkcgKQorLy8Jb2xkRUMud3JpdGVUcmFjZUJlZm9yZUV4ZWMoQVZNX09TX1RSQUNFIDw8IFRBQik7CisvLwlBVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICJFeHByOiAiIDw8IG9sZEZvcm11bGEgPDwgc3RkOjplbmRsOworLy8KKy8vCW5ld0VDLndyaXRlVHJhY2VCZWZvcmVFeGVjKEFWTV9PU19UUkFDRSA8PCBUQUIpOworLy8JQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiRXhwcjogIiA8PCBuZXdGb3JtdWxhIDw8IHN0ZDo6ZW5kbDsKKy8vQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNNVF9TT0xWSU5HICkKKy8vCisvLwkJLy8gQVNTRVJUIGRlIG5ld0Zvcm11bGEKKy8vCQkvLworLy8JCW1TbXRFbmdpbmUuYXNzZXJ0Rm9ybXVsYShuZXdGb3JtdWxhKTsKKy8vCisvLwkJLy8gQ0hFQ0tTQVQgZGUgb2xkRm9ybXVsYQorLy8JCS8vCisvLwkJLy8gQSBsYSBwbGFjZSBkZSBDSEVDS1NBVCBvbiB1dGlsaXNlIE5PVCBRVUVSWShOT1Qgb2xkRm9ybXVsYSkKKy8vCQkvLworLy8JCUNWQzQ6OlJlc3VsdCByZXN1bHQgPSBtU210RW5naW5lLnF1ZXJ5KCBvbGRGb3JtdWxhLm5vdEV4cHIoKSApOworLy8KKy8vCQluZXdGb3JtdWxhID0gQ1ZDNF9FWFBSX05VTEw7CisvLwkJb2xkRm9ybXVsYSA9IENWQzRfRVhQUl9OVUxMOworLy8JCWRlc3Ryb3lDaGVja2VyKCk7CisvLworLy8JCS8vIFNpIG5vdCByZXN1bHQgYWxvcnMgbGEgZm9ybXVsZSBvbGRGb3JtdWxhIGVzdCBzYXRpc2ZpYWJsZQorLy8JCXJldHVybiggcmVzdWx0ICE9IENWQzQ6OlJlc3VsdDo6VkFMSUQgKTsKKy8vCX0KKy8vCWNhdGNoKCBjb25zdCBDVkM0OjpFeGNlcHRpb24gJiBleCApCisvLwl7CisvLwkJQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiKioqIEV4Y2VwdGlvbiBjYXVnaHQgaW4gQ1ZDNFNvbHZlcjo6aXNTdWJTZXQ6IFxuIgorLy8JCQkJPDwgZXggPDwgc3RkOjplbmRsOworLy8JfQorLy8KKy8vCXJldHVybiggZmFsc2UgKTsKKy8vfQorCisKKy8vYm9vbCBDVkM0U29sdmVyOjppc1N1YlNldCgKKy8vCQljb25zdCBFeGVjdXRpb25Db250ZXh0ICYgbmV3RUMsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBvbGRFQykKKy8veworLy8JdHJ5CisvLwl7CisvLwkJY3JlYXRlQ2hlY2tlcigpOworLy8KKy8vQVZNX0lGX0RFQlVHX0ZMQUcoIFNNVF9TT0xWSU5HICkKKy8vCUFWTV9PU19UUkFDRSA8PCBzdGQ6OmVuZGwgPDwgIm5ldyBFQzogIiA8PCBuZXdFQy5nZXRJZE51bWJlcigpIDw8IHN0ZDo6ZW5kbAorLy8JCQk8PCBzdGQ6OmVuZGwgPDwgIm9sZCBFQzogIiA8PCBvbGRFQy5nZXRJZE51bWJlcigpIDw8IHN0ZDo6ZW5kbDsKKy8vQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNNVF9TT0xWSU5HICkKKy8vCisvLwkJLy8gT24gY29uc3RydWl0IGxhIGZvcm11bGUgbmV3Rm9ybXVsYSA6CisvLwkJLy8gZ2FyZGVfbmV3RUMgQU5ECisvLwkJLy8geDEgPSBlMSBBTkQgLS0tLSBBTkQgeG4gPSBlbgorLy8JCS8vCisvLwkJLy8gZXQgbGEgZm9ybXVsZSBvbGRGb3JtdWxhIDoKKy8vCQkvLyBnYXJkZV9vbGRFQyBBTkQKKy8vCQkvLyB4MSA9IGUnMSBBTkQgLS0tLSBBTkQgeG4gPSBlJ24gQU5ECisvLwkJLy8gZTEgPSBlJzEgQU5EIC0tLS0gQU5EIGVuID0gZSduCisvLwkJLy8KKy8vCQlDVkM0OjpFeHByIG5ld0Zvcm11bGE7CisvLwkJQ1ZDNDo6RXhwciBvbGRGb3JtdWxhOworLy8JCWVkVG9FeHByV2l0aFZhckVxdWFsaXR5KG5ld0VDLnJlZkV4ZWN1dGlvbkRhdGEoKSwKKy8vCQkJCW5ld0Zvcm11bGEsIG9sZEVDLnJlZkV4ZWN1dGlvbkRhdGEoKSwgb2xkRm9ybXVsYSk7CisvLworLy8JCWlmKCBvbGRGb3JtdWxhICE9IFNNVF9DU1RfQk9PTF9GQUxTRSApCisvLwkJeworLy9BVk1fSUZfREVCVUdfRkxBRyggU01UX1NPTFZJTkcgKQorLy8Jb2xkRUMud3JpdGVUcmFjZUJlZm9yZUV4ZWMoQVZNX09TX1RSQUNFIDw8IFRBQik7CisvLwlBVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICIhISEhISEhISEhISEhISEgb2xkIEV4cHI6ICIgPDwgb2xkRm9ybXVsYSA8PCBzdGQ6OmVuZGw7CisvLworLy8JbmV3RUMud3JpdGVUcmFjZUJlZm9yZUV4ZWMoQVZNX09TX1RSQUNFIDw8IFRBQik7CisvLwlBVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICIhISEhISEhISEhISEhISEgbmV3IEV4cHI6ICIgPDwgbmV3Rm9ybXVsYSA8PCBzdGQ6OmVuZGw7CisvL0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTTVRfU09MVklORyApCisvLworLy8JCQlDVkM0OjpFeHByIGltcGx5Rm9ybXVsYTsKKy8vCQkJaWYoIG5vdCBtVGFibGVPZlBhcmFtZXRlckV4cHJGb3JPbGRGb3JtdWxhLmVtcHR5KCkgKQorLy8JCQl7CisvLwkJCQkvLyBPbiBjb25zdHJ1aXQgbGEgZm9ybXVsZSBpdGV4aXN0cworLy8JCQkJLy8gbVRhYmxlT2ZQYXJhbWV0ZXJFeHByRm9yT2xkRm9ybXVsYSBvbGRGb3JtdWxhCisvLwkJCQlDVkM0OjpFeHByIGl0RXhpc3RzRm9ybXVsYSA9IG1FeHByTWFuYWdlci5ta0V4cHIoCisvLwkJCQkJCUNWQzQ6OmtpbmQ6OkVYSVNUUywKKy8vCQkJCQkJbUV4cHJNYW5hZ2VyLm1rRXhwcihDVkM0OjpraW5kOjpCT1VORF9WQVJfTElTVCwKKy8vCQkJCQkJCQltVGFibGVPZlBhcmFtZXRlckV4cHJGb3JPbGRGb3JtdWxhKSwKKy8vCQkJCQkJb2xkRm9ybXVsYSk7CisvLworLy8JCQkJLy8gT24gY29uc3RydWl0IGxhIGZvcm11bGUgbmV3Rm9ybXVsYSA9PiBpdEV4aXN0c0Zvcm11bGEKKy8vCQkJCS8vCisvLwkJCQlpbXBseUZvcm11bGEgPSBtRXhwck1hbmFnZXIubWtFeHByKAorLy8JCQkJCQlDVkM0OjpraW5kOjpJTVBMSUVTLCBuZXdGb3JtdWxhLCBpdEV4aXN0c0Zvcm11bGEpOworLy8JCQl9CisvLwkJCWVsc2UKKy8vCQkJeworLy8JCQkJLy8gT24gY29uc3RydWl0IGxhIGZvcm11bGUgbmV3Rm9ybXVsYSA9PiBvbGRGb3JtdWxhCisvLwkJCQkvLworLy8JCQkJaW1wbHlGb3JtdWxhID0gbUV4cHJNYW5hZ2VyLm1rRXhwcigKKy8vCQkJCQkJQ1ZDNDo6a2luZDo6SU1QTElFUywgbmV3Rm9ybXVsYSwgb2xkRm9ybXVsYSk7CisvLwkJCX0KKworLy9BVk1fSUZfREVCVUdfRkxBRyggU01UX1NPTFZJTkcgKQorLy8JQVZNX09TX1RSQUNFIDw8IGltcGx5Rm9ybXVsYTsKKy8vQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNNVF9TT0xWSU5HICkKKy8vCisvLwkJCS8vIE9uIGNvbnN0cnVpdCBsYSBmb3JtdWxlIGZvcmFsbAorLy8JCQkvLyBtVGFibGVPZlBhcmFtZXRlckV4cHJGb3JOZXdGb3JtdWxhIGltcGx5Rm9ybXVsYQorLy8JCQlWZWN0b3I8IENWQzQ6OkV4cHIgPiBmb3JBbGxQYXJhbWV0ZXJBbmRWYXJpYWJsZUxpc3Q7CisvLwkJCWZvckFsbFBhcmFtZXRlckFuZFZhcmlhYmxlTGlzdC5hcHBlbmQobVRhYmxlT2ZWYXJpYWJsZUV4cHIpOworLy8JCQlmb3JBbGxQYXJhbWV0ZXJBbmRWYXJpYWJsZUxpc3QuYXBwZW5kKAorLy8JCQkJCW1UYWJsZU9mUGFyYW1ldGVyRXhwckZvck5ld0Zvcm11bGEpOworLy8JCQlDVkM0OjpFeHByIGZvckFsbEZvcm11bGEgPSBtRXhwck1hbmFnZXIubWtFeHByKENWQzQ6OmtpbmQ6OkZPUkFMTCwKKy8vCQkJCQltRXhwck1hbmFnZXIubWtFeHByKENWQzQ6OmtpbmQ6OkJPVU5EX1ZBUl9MSVNULAorLy8JCQkJCQkJZm9yQWxsUGFyYW1ldGVyQW5kVmFyaWFibGVMaXN0KSwKKy8vCQkJCQlpbXBseUZvcm11bGEpOworLy8JCQlBVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICItLT4gZm9yQWxsRm9ybXVsYSA6ICI7CisvLwkJCUFWTV9PU19UUkFDRSA8PCBmb3JBbGxGb3JtdWxhOworLy8KKy8vCQkJLy8gUVVFUlkgZGUgZm9yQWxsRm9ybXVsYQorLy8JCQkvLworLy8JCQlDVkM0OjpSZXN1bHQgcmVzdWx0ID0gbVNtdEVuZ2luZS5xdWVyeSggZm9yQWxsRm9ybXVsYSApOworLy8KKy8vCQkJbmV3Rm9ybXVsYSA9IENWQzRfRVhQUl9OVUxMOworLy8JCQlvbGRGb3JtdWxhID0gQ1ZDNF9FWFBSX05VTEw7CisvLwkJCWRlc3Ryb3lDaGVja2VyKCk7CisvLworLy8JCQlyZXR1cm4oIHJlc3VsdCA9PSBDVkM0OjpSZXN1bHQ6OlZBTElEICk7CisvLwkJfQorLy8JCWVsc2UKKy8vCQl7CisvLwkJCUFWTV9PU19UUkFDRSA8PCBUQUIgPDwgIi0tPiBjYXMgIG9sZEZvcm11bGEgw6AgZmFsc2UgIiA8PCBzdGQ6OmVuZGw7CisvLwkJCXJldHVybiggZmFsc2UgKTsKKy8vCQl9CisvLwl9CisvLwljYXRjaCggY29uc3QgQ1ZDNDo6RXhjZXB0aW9uICYgZXggKQorLy8JeworLy8JCUFWTV9PU19UUkFDRSA8PCBUQUIgPDwgIioqKiBFeGNlcHRpb24gY2F1Z2h0IGluIENWQzRTb2x2ZXI6OmlzU3ViU2V0OiBcbiIKKy8vCQkJCTw8IGV4IDw8IHN0ZDo6ZW5kbDsKKy8vCX0KKy8vCisvLwlyZXR1cm4oIGZhbHNlICk7CisvL30KKworCisKK2Jvb2wgQ1ZDNFNvbHZlcjo6aXNTdWJTZXQoCisJCWNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBuZXdFQywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIG9sZEVDKQoreworCXRyeQorCXsKKwkJY3JlYXRlQ2hlY2tlcigpOworCitBVk1fSUZfREVCVUdfRkxBRyggU01UX1NPTFZJTkcgKQorCUFWTV9PU19UUkFDRSA8PCBzdGQ6OmVuZGwgPDwgIm5ldyBFQzogIiA8PCBuZXdFQy5nZXRJZE51bWJlcigpIDw8IHN0ZDo6ZW5kbAorCQkJPDwgc3RkOjplbmRsIDw8ICJvbGQgRUM6ICIgPDwgb2xkRUMuZ2V0SWROdW1iZXIoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggU01UX1NPTFZJTkcgKQorCisJCS8vIE9uIGNvbnN0cnVpdCBsYSBmb3JtdWxlIG5ld0Zvcm11bGEgOgorCQkvLyBnYXJkZV9uZXdFQyBBTkQKKwkJLy8geDEgPSBlMSBBTkQgLS0tLSBBTkQgeG4gPSBlbgorCQkvLworCQkvLyBsYSBmb3JtdWxlIG9sZEZvcm11bGEgOgorCQkvLyBnYXJkZV9vbGRFQyBBTkQKKwkJLy8geDEgPSBlJzEgQU5EIC0tLS0gQU5EIHhuID0gZSduCisJCS8vCisJCS8vIGV0IGxhIGZvcm11bGUgZXF1Rm9ybXVsYSBxdWkgw6l0YWJsaWUgbCfDqWdhbGl0w6kgZGVzIG3DqW1vaXJlcyBzeW1ib2xpcXVlcworCQkvLyBlMSA9IGUnMSBBTkQgLS0tLSBBTkQgZW4gPSBlJ24KKwkJLy8KKwkJQ1ZDNDo6RXhwciBuZXdGb3JtdWxhOworCQlDVkM0OjpFeHByIG9sZEZvcm11bGE7CisJCUNWQzQ6OkV4cHIgZXF1Rm9ybXVsYTsKKwkJZWRUb0V4cHJXaXRoVmFyRXF1YWxpdHkobmV3RUMucmVmRXhlY3V0aW9uRGF0YSgpLCBuZXdGb3JtdWxhLAorCQkJCQkJCQlvbGRFQy5yZWZFeGVjdXRpb25EYXRhKCksIG9sZEZvcm11bGEsCisJCQkJCQkJCWVxdUZvcm11bGEpOworCisJCWJvb2wgYlJlc3VsdCA9IGZhbHNlOworCisJCWlmKCBvbGRGb3JtdWxhICE9IFNNVF9DU1RfQk9PTF9GQUxTRSApCisJCXsKK0FWTV9JRl9ERUJVR19GTEFHKCBTTVRfU09MVklORyApCisJb2xkRUMudHJhY2VEZWZhdWx0KEFWTV9PU19UUkFDRSA8PCBUQUIpOworCUFWTV9PU19UUkFDRSA8PCBUQUIgPDwgIiEhISEhISEhISEhISEhISBvbGQgRXhwcjogIiA8PCBvbGRGb3JtdWxhIDw8IHN0ZDo6ZW5kbDsKKworCW5ld0VDLnRyYWNlRGVmYXVsdChBVk1fT1NfVFJBQ0UgPDwgVEFCKTsKKwlBVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICIhISEhISEhISEhISEhISEgbmV3IEV4cHI6ICIgPDwgbmV3Rm9ybXVsYSA8PCBzdGQ6OmVuZGw7CisKKy8vCW5ld0VDLndyaXRlVHJhY2VCZWZvcmVFeGVjKEFWTV9PU19UUkFDRSA8PCBUQUIpOworLy8JQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiISEhISEhISEhISEhISEhIGVxdSBFeHByOiAiIDw8IGVxdUZvcm11bGEgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNNVF9TT0xWSU5HICkKKworCQkJLy8gRMOpY2xhcmF0aW9uIGRlcyB2YXJpYWJsZXMgZGUgbVRhYmxlT2ZWYXJpYWJsZUV4cHIgZXQKKwkJCS8vIGV0IGRlcyBwYXJhbcOodHJlcyBkZSBtVGFibGVPZlBhcmFtZXRlckV4cHIKKwkJCS8vCisKKwkJCS8vIEFTU0VSVCBkZSBuZXdGb3JtdWxhCisJCQkvLworCQkJbVNtdEVuZ2luZS5hc3NlcnRGb3JtdWxhKG5ld0Zvcm11bGEpOworCisJCQkvLyBBU1NFUlQgZGUgZXF1Rm9ybXVsYQorCQkJLy8KKy8vCQkJbVNtdEVuZ2luZS5hc3NlcnRGb3JtdWxhKGVxdUZvcm11bGEpOworCisJCQkvLyBDSEVDS1NBVCBkZSBOT1Qgb2xkRm9ybXVsYQorCQkJLy8KKwkJCS8vIEEgbGEgcGxhY2Ugb24gdXRpbGlzZSBOT1QgUVVFUlkob2xkRm9ybXVsYSkKKwkJCS8vCisKKworCisJCQlDVkM0OjpSZXN1bHQgdG90byA9IG1TbXRFbmdpbmUucXVlcnkoIG9sZEZvcm11bGEgKTsKKy8vICEhISEhISEhISEhISEhISAyNzEwMDkgOiBFU1NBSSBBRkEgdGVtcG9yYWlyZSAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKy8vCQkJQ1ZDNDo6UmVzdWx0IHRvdG8gPSBtU210RW5naW5lLnF1ZXJ5KAorLy8JCQkJCW1FeHByTWFuYWdlci5ta0V4cHIoQ1ZDNDo6a2luZDo6Tk9ULCBvbGRGb3JtdWxhKSApOworLy8JCQlpZih0b3RvID09IENWQzQ6OlNBVElTRklBQkxFKQorLy8JCQl7CisvLwkJCQlpbnQgaSA9IDE7CisvLwkJCX0KKy8vCQkJaWYodG90byA9PSBDVkM0OjpJTlZBTElEKQorLy8JCQl7CisvLwkJCQlpbnQgaSA9IDI7CisvLwkJCX0KKworCQkJYm9vbCByZXN1bHQgPSAoIHRvdG8gPT0gQ1ZDNDo6UmVzdWx0OjpWQUxJRCApOworCisJCQliUmVzdWx0ID0gKCBub3QgcmVzdWx0ICk7CisJCX0KKwkJZWxzZQorCQl7CitBVk1fSUZfREVCVUdfRkxBRyggU01UX1NPTFZJTkcgKQorCUFWTV9PU19UUkFDRSA8PCBUQUIgPDwgIi0tPiBjYXMgIG9sZEZvcm11bGEgw6AgZmFsc2UgIiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggU01UX1NPTFZJTkcgKQorCQl9CisKKwkJbmV3Rm9ybXVsYSA9IENWQzRfRVhQUl9OVUxMOworCQlvbGRGb3JtdWxhID0gQ1ZDNF9FWFBSX05VTEw7CisJCWVxdUZvcm11bGEgPSBDVkM0X0VYUFJfTlVMTDsKKwkJZGVzdHJveUNoZWNrZXIoKTsKKworCQlyZXR1cm4oIGJSZXN1bHQgKTsKKwl9CisJY2F0Y2goIGNvbnN0IENWQzQ6OkV4Y2VwdGlvbiAmIGV4ICkKKwl7CisJCUFWTV9PU19UUkFDRSA8PCBUQUIgPDwgIioqKiBFeGNlcHRpb24gY2F1Z2h0IGluIENWQzRTb2x2ZXI6OmlzU3ViU2V0OiBcbiIKKwkJCQk8PCBleCA8PCBzdGQ6OmVuZGw7CisKKwkJZGVzdHJveUNoZWNrZXIoKTsKKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKwordm9pZCBDVkM0U29sdmVyOjplZFRvRXhwcldpdGhWYXJFcXVhbGl0eShjb25zdCBFeGVjdXRpb25EYXRhICYgbmV3RUQsCisJCUNWQzQ6OkV4cHIgJiBuZXdGb3JtdWxhLCBjb25zdCBFeGVjdXRpb25EYXRhICYgb2xkRUQsCisJCUNWQzQ6OkV4cHIgJiBvbGRGb3JtdWxhLCBDVkM0OjpFeHByICYgZXF1Rm9ybXVsYSkKK3sKKy8vCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9QT0lOVEVSX0VYSVQoIG1TbXRFbmdpbmUgKSA8PCAiVmFsaWRpdHlDaGVja2VyICEhISIKKy8vCQkJPDwgU0VORF9FWElUOworCisJc3RkOjp2ZWN0b3I8IENWQzQ6OkV4cHIgPiBuZXdGb3JtdWxhTGlzdDsKKwlzdGQ6OnZlY3RvcjwgQ1ZDNDo6RXhwciA+IG9sZEZvcm11bGFMaXN0OworCXN0ZDo6dmVjdG9yPCBDVkM0OjpFeHByID4gZXF1Rm9ybXVsYUxpc3Q7CisKKwlyZXNldFRhYmxlKCk7CisKKwkvLyBjb21waWxlIFBDcworCUNWQzQ6OkV4cHIgYVBDOworCisvLwltX3BUYWJsZU9mUGFyYW1ldGVyRXhwciA9ICZtVGFibGVPZlBhcmFtZXRlckV4cHJGb3JOZXdGb3JtdWxhOworCW5ld0Zvcm11bGFMaXN0LnB1c2hfYmFjayggYVBDID0KKwkJCXNhZmVfZnJvbV9iYXNlZm9ybShuZXdFRC5nZXRQYXRoQ29uZGl0aW9uKCkpICk7CisKK0FWTV9JRl9ERUJVR19GTEFHKCBTTVRfU09MVklORyApCisJQVZNX09TX1RSQUNFIDw8IHN0ZDo6ZW5kbCA8PCAibmV3IFBDOiAiIDw8IGFQQyA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggU01UX1NPTFZJTkcgKQorCisvLwltX3BUYWJsZU9mUGFyYW1ldGVyRXhwciA9IE5VTEw7CisJb2xkRm9ybXVsYUxpc3QucHVzaF9iYWNrKCBhUEMgPQorCQkJc2FmZV9mcm9tX2Jhc2Vmb3JtKG9sZEVELmdldFBhdGhDb25kaXRpb24oKSkgKTsKKworQVZNX0lGX0RFQlVHX0ZMQUcoIFNNVF9TT0xWSU5HICkKKwlBVk1fT1NfVFJBQ0UgPDwgIm9sZCBQQzogIiA8PCBhUEMgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNNVF9TT0xWSU5HICkKKworCUluc3RhbmNlT2ZEYXRhICogYVZhciA9IE5VTEw7CisJQmFzZVR5cGVTcGVjaWZpZXIgKiB2YXJUeXBlU3BlY2lmaWVyID0gTlVMTDsKKworCS8vIGNvbXBpbGUgREFUQXMKKwlzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworCUxpc3RPZkluc3RhbmNlT2ZEYXRhOjppdGVyYXRvciBpdFZhcjsKKwlMaXN0T2ZJbnN0YW5jZU9mRGF0YTo6aXRlcmF0b3IgZW5kVmFyOworCisJTGlzdE9mUGFpck1hY2hpbmVEYXRhOjppdGVyYXRvciBpdFBhaXJNYWNoaW5lRGF0YSA9IGdldFNlbGVjdGVkVmFyaWFibGUoKS5iZWdpbigpOworCUxpc3RPZlBhaXJNYWNoaW5lRGF0YTo6aXRlcmF0b3IgZW5kUGFpck1hY2hpbmVEYXRhID0gZ2V0U2VsZWN0ZWRWYXJpYWJsZSgpLmVuZCgpOworCWF2bV9vZmZzZXRfdCB2YXJJRCA9IDE7CisJZm9yKCA7IGl0UGFpck1hY2hpbmVEYXRhICE9IGVuZFBhaXJNYWNoaW5lRGF0YSA7ICsraXRQYWlyTWFjaGluZURhdGEgKQorCXsKKwkJaWYoICgqaXRQYWlyTWFjaGluZURhdGEpLnNlY29uZCgpLm5vbmVtcHR5KCkgKQorCQl7CisJCQljb25zdCBSdW50aW1lRm9ybSAmIG5ld1JGID0gbmV3RUQuZ2V0UnVudGltZSgKKwkJCQkJKCppdFBhaXJNYWNoaW5lRGF0YSkuZmlyc3QoKSApOworCQkJY29uc3QgUnVudGltZUZvcm0gJiBvbGRSRiA9IG9sZEVELmdldFJ1bnRpbWUoCisJCQkJCSgqaXRQYWlyTWFjaGluZURhdGEpLmZpcnN0KCkgKTsKKworCQkJaXRWYXIgPSAoKml0UGFpck1hY2hpbmVEYXRhKS5zZWNvbmQoKS5iZWdpbigpOworCQkJZW5kVmFyID0gKCppdFBhaXJNYWNoaW5lRGF0YSkuc2Vjb25kKCkuZW5kKCk7CisJCQlmb3IoIDsgaXRWYXIgIT0gZW5kVmFyIDsgKytpdFZhciAsICsrdmFySUQgKQorCQkJeworCQkJCS8vPz8/IFRBQkxFQVVYCisJCQkJYVZhciA9IG5ld1JGLnJhd1ZhcmlhYmxlKCgqaXRWYXIpLT5nZXRPZmZzZXQoKSk7CisJCQkJdmFyVHlwZVNwZWNpZmllciA9IGFWYXItPmdldFR5cGVTcGVjaWZpZXIoKTsKKworCQkJCW9zcy5zdHIoIiIpOworCQkJCW9zcyA8PCAiVl8iIDw8IHZhcklEOworCisvLwkJCQltX3BUYWJsZU9mUGFyYW1ldGVyRXhwciA9ICZtVGFibGVPZlBhcmFtZXRlckV4cHJGb3JOZXdGb3JtdWxhOworCQkJCUNWQzQ6OkV4cHIgbmV3VmFsdWUgPSBzYWZlX2Zyb21fYmFzZWZvcm0oCisJCQkJCQluZXdSRi5nZXREYXRhKCppdFZhciksIHZhclR5cGVTcGVjaWZpZXIpOworLy8JCQkJbV9wVGFibGVPZlBhcmFtZXRlckV4cHIgPSBOVUxMOworCQkJCUNWQzQ6OkV4cHIgb2xkVmFsdWUgPSBzYWZlX2Zyb21fYmFzZWZvcm0oCisJCQkJCQlvbGRSRi5nZXREYXRhKCppdFZhciksIHZhclR5cGVTcGVjaWZpZXIpOworCitBVk1fSUZfREVCVUdfRkxBRyggU01UX1NPTFZJTkcgKQorCUFWTV9PU19UUkFDRSA8PCB2YXJUeXBlU3BlY2lmaWVyLT5zdHJUKCkgPDwgIiAgIgorCQkJPDwgKCppdFZhciktPmdldE5hbWVJRCgpIDw8ICIgLS0+ICIgPDwgb3NzLnN0cigpCisJCQk8PCBzdGQ6OmVuZGwgPDwgIlx0b2xkOiAiIDw8IG9sZFZhbHVlIDw8ICJcdG5ldzogIiA8PCBuZXdWYWx1ZTsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTTVRfU09MVklORyApCisKKworCQkJCWlmKCB2YXJUeXBlU3BlY2lmaWVyLT5pc1R5cGVkQm9vbGVhbigpICkKKwkJCQl7CisJCQkJCWNvbnN0IEJGICYgbmV3RWxlbWVudCA9IG5ld1JGLmdldERhdGEoKml0VmFyKTsKKwkJCQkJY29uc3QgQkYgJiBvbGRFbGVtZW50ID0gb2xkUkYuZ2V0RGF0YSgqaXRWYXIpOworCQkJCQlpZiggbmV3RWxlbWVudC5pc0Jvb2xlYW4oKSAmJiBvbGRFbGVtZW50LmlzQm9vbGVhbigpICkKKwkJCQkJeworCQkJCQkJLy8gT24gcmFqb3V0ZSBsJ8OpcXVpdmFsZW5jZSBlbnRyZSBsYSBub3V2ZWxsZSB2YWxldXIKKwkJCQkJCS8vIHN5bWJvbGlxdWUgZXQgbCdhbmNpZW5uZQorLy8JCQkJCQllcXVGb3JtdWxhTGlzdC5wdXNoX2JhY2soIG1FeHByTWFuYWdlcm1rRXhwcigKKy8vCQkJCQkJCQlDVkM0OjpraW5kOjpFUVVBTCwgbmV3VmFsdWUsIG9sZFZhbHVlKSApOworCQkJCQkJb2xkRm9ybXVsYUxpc3QucHVzaF9iYWNrKAorCQkJCQkJCQkobmV3RWxlbWVudC50b0Jvb2xlYW4oKSA9PSBvbGRFbGVtZW50LnRvQm9vbGVhbigpKSA/CisJCQkJCQkJCQkJU01UX0NTVF9CT09MX1RSVUUgOiBTTVRfQ1NUX0JPT0xfRkFMU0UgKTsKKworCQkJCQkJaWYoIG5ld0VsZW1lbnQudG9Cb29sZWFuKCkgIT0gb2xkRWxlbWVudC50b0Jvb2xlYW4oKSApCisJCQkJCQl7CisJCQkJCQkJb2xkRm9ybXVsYSA9IFNNVF9DU1RfQk9PTF9GQUxTRTsKKwkJCQkJCQlyZXNldFRhYmxlKCk7CisJCQkJCQkJcmV0dXJuOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJQ1ZDNDo6RXhwciB2YXJFeHByID0KKwkJCQkJCQkJbUV4cHJNYW5hZ2VyLm1rVmFyKG9zcy5zdHIoKSwgU01UX1RZUEVfQk9PTCk7CisJCQkJCQltVGFibGVPZlZhcmlhYmxlRXhwci5wdXNoX2JhY2soIHZhckV4cHIgKTsKKworCQkJCQkJbmV3Rm9ybXVsYUxpc3QucHVzaF9iYWNrKCBtRXhwck1hbmFnZXIubWtFeHByKAorCQkJCQkJCQlDVkM0OjpraW5kOjpFUVVBTCwgdmFyRXhwciwgbmV3VmFsdWUpICk7CisJCQkJCQlvbGRGb3JtdWxhTGlzdC5wdXNoX2JhY2soIG1FeHByTWFuYWdlci5ta0V4cHIoCisJCQkJCQkJCUNWQzQ6OmtpbmQ6OkVRVUFMLCB2YXJFeHByLCBvbGRWYWx1ZSkgKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmKCB2YXJUeXBlU3BlY2lmaWVyLT53ZWFrbHlUeXBlZEludGVnZXIoKSB8fAorCQkJCQkJdmFyVHlwZVNwZWNpZmllci0+aXNUeXBlZEVudW0oKSB8fAorCQkJCQkJdmFyVHlwZVNwZWNpZmllci0+aXNUeXBlZE1hY2hpbmUoKSApCisJCQkJeworCQkJCQljb25zdCBCRiAmIG5ld0VsZW1lbnQgPSBuZXdSRi5nZXREYXRhKCppdFZhcik7CisJCQkJCWNvbnN0IEJGICYgb2xkRWxlbWVudCA9IG9sZFJGLmdldERhdGEoKml0VmFyKTsKKwkJCQkJaWYgKCBuZXdFbGVtZW50LmlzTnVtZXJpYygpICYmIG9sZEVsZW1lbnQuaXNOdW1lcmljKCkgKQorCQkJCQl7CisJCQkJCQkvLyBPbiByYWpvdXRlIGwnw6lnYWxpdMOpIGVudHJlIGxhIG5vdXZlbGxlIHZhbGV1cgorCQkJCQkJLy8gc3ltYm9saXF1ZSBldCBsJ2FuY2llbm5lCisvLwkJCQkJCWVxdUZvcm11bGFMaXN0LnB1c2hfYmFjayggbUV4cHJNYW5hZ2VyLm1rRXhwcigKKy8vCQkJCQkJCQlDVkM0OjpraW5kOjpFUVVBTCwgbmV3VmFsdWUsIG9sZFZhbHVlKSApOworCisJCQkJCQlvbGRGb3JtdWxhTGlzdC5wdXNoX2JhY2soCisJCQkJCQkJCShFeHByZXNzaW9uQ29tcGFyZXI6OmlzRVEobmV3RWxlbWVudCwgb2xkRWxlbWVudCkpID8KKwkJCQkJCQkJU01UX0NTVF9CT09MX1RSVUUgOiBTTVRfQ1NUX0JPT0xfRkFMU0UgICk7CisKKwkJCQkJCWlmKCBFeHByZXNzaW9uQ29tcGFyZXI6OmlzTkVRKG5ld0VsZW1lbnQsIG9sZEVsZW1lbnQpICkKKwkJCQkJCXsKKwkJCQkJCQlvbGRGb3JtdWxhID0gU01UX0NTVF9CT09MX0ZBTFNFOworCQkJCQkJCXJlc2V0VGFibGUoKTsKKwkJCQkJCQlyZXR1cm47CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlDVkM0OjpFeHByIHZhckV4cHIgPQorCQkJCQkJCQltRXhwck1hbmFnZXIubWtWYXIob3NzLnN0cigpLCBTTVRfVFlQRV9JTlQpOworCQkJCQkJbVRhYmxlT2ZWYXJpYWJsZUV4cHIucHVzaF9iYWNrKCB2YXJFeHByICk7CisKKwkJCQkJCW5ld0Zvcm11bGFMaXN0LnB1c2hfYmFjayggbUV4cHJNYW5hZ2VyLm1rRXhwcigKKwkJCQkJCQkJQ1ZDNDo6a2luZDo6RVFVQUwsIHZhckV4cHIsIG5ld1ZhbHVlKSApOworCisJCQkJCQlvbGRGb3JtdWxhTGlzdC5wdXNoX2JhY2soIG1FeHByTWFuYWdlci5ta0V4cHIoCisJCQkJCQkJCUNWQzQ6OmtpbmQ6OkVRVUFMLCB2YXJFeHByLCBvbGRWYWx1ZSkgKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmKCB2YXJUeXBlU3BlY2lmaWVyLT53ZWFrbHlUeXBlZFJlYWwoKSApCisJCQkJeworCQkJCQljb25zdCBCRiAmIG5ld0VsZW1lbnQgPSBuZXdSRi5nZXREYXRhKCppdFZhcik7CisJCQkJCWNvbnN0IEJGICYgb2xkRWxlbWVudCA9IG9sZFJGLmdldERhdGEoKml0VmFyKTsKKwkJCQkJaWYgKCBuZXdFbGVtZW50LmlzTnVtZXJpYygpICYmIG9sZEVsZW1lbnQuaXNOdW1lcmljKCkgKQorCQkJCQl7CisJCQkJCQkvLyBPbiByYWpvdXRlIGwnw6lnYWxpdMOpIGVudHJlIGxhIG5vdXZlbGxlIHZhbGV1cgorCQkJCQkJLy8gc3ltYm9saXF1ZSBldCBsJ2FuY2llbm5lCisvLwkJCQkJCWVxdUZvcm11bGFMaXN0LnB1c2hfYmFjayggbUV4cHJNYW5hZ2VyLm1rRXhwcigKKy8vCQkJCQkJCQlDVkM0OjpraW5kOjpFUVVBTCwgbmV3VmFsdWUsIG9sZFZhbHVlKSApOworCisJCQkJCQlvbGRGb3JtdWxhTGlzdC5wdXNoX2JhY2soCisJCQkJCQkJCShFeHByZXNzaW9uQ29tcGFyZXI6OmlzRVEobmV3RWxlbWVudCwgb2xkRWxlbWVudCkpID8KKwkJCQkJCQkJU01UX0NTVF9CT09MX1RSVUUgOiBTTVRfQ1NUX0JPT0xfRkFMU0UgICk7CisKKwkJCQkJCWlmKCBFeHByZXNzaW9uQ29tcGFyZXI6OmlzTkVRKG5ld0VsZW1lbnQsIG9sZEVsZW1lbnQpICkKKwkJCQkJCXsKKwkJCQkJCQlvbGRGb3JtdWxhID0gU01UX0NTVF9CT09MX0ZBTFNFOworCQkJCQkJCXJlc2V0VGFibGUoKTsKKwkJCQkJCQlyZXR1cm47CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlDVkM0OjpFeHByIHZhckV4cHIgPQorCQkJCQkJCQltRXhwck1hbmFnZXIubWtWYXIob3NzLnN0cigpLCBTTVRfVFlQRV9SRUFMKTsKKwkJCQkJCW1UYWJsZU9mVmFyaWFibGVFeHByLnB1c2hfYmFjayggdmFyRXhwciApOworCisJCQkJCQluZXdGb3JtdWxhTGlzdC5wdXNoX2JhY2soIG1FeHByTWFuYWdlci5ta0V4cHIoCisJCQkJCQkJCUNWQzQ6OmtpbmQ6OkVRVUFMLCB2YXJFeHByLCBuZXdWYWx1ZSkgKTsKKworCQkJCQkJb2xkRm9ybXVsYUxpc3QucHVzaF9iYWNrKCBtRXhwck1hbmFnZXIubWtFeHByKAorCQkJCQkJCQlDVkM0OjpraW5kOjpFUVVBTCwgdmFyRXhwciwgb2xkVmFsdWUpICk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJQVZNX09TX0VSUk9SX0FMRVJUIDw8ICJVbmV4cGVjdGVkIGFuIGluc3RhbmNlIHR5cGUgPDwgIgorCQkJCQkJCTw8IGFWYXItPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIiBhcyA6ICIgPDwgb3NzLnN0cigpIDw8ICIgOiAiCisJCQkJCQkJPDwgdmFyVHlwZVNwZWNpZmllci0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiPj4gISEhIgorCQkJCQkJCTw8IFNFTkRfQUxFUlQ7CisKKwkJCQkJQ1ZDNDo6RXhwciB2YXJFeHByID0KKwkJCQkJCQltRXhwck1hbmFnZXIubWtWYXIob3NzLnN0cigpLCBTTVRfVFlQRV9SRUFMKTsKKwkJCQkJbVRhYmxlT2ZWYXJpYWJsZUV4cHIucHVzaF9iYWNrKCB2YXJFeHByICk7CisKKwkJCQkJbmV3Rm9ybXVsYUxpc3QucHVzaF9iYWNrKCBtRXhwck1hbmFnZXIubWtFeHByKAorCQkJCQkJCUNWQzQ6OmtpbmQ6OkVRVUFMLCB2YXJFeHByLCBuZXdWYWx1ZSkgKTsKKworCQkJCQlvbGRGb3JtdWxhTGlzdC5wdXNoX2JhY2soIG1FeHByTWFuYWdlci5ta0V4cHIoCisJCQkJCQkJQ1ZDNDo6a2luZDo6RVFVQUwsIHZhckV4cHIsIG9sZFZhbHVlKSApOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCVZlY3RvcjwgQ1ZDNDo6RXhwciA+OjppdGVyYXRvciBpdCA9IG1UYWJsZU9mUGFyYW1ldGVyRXhwci5iZWdpbigpOworCWZvciggOyBpdCAhPSBtVGFibGVPZlBhcmFtZXRlckV4cHIuZW5kKCkgOyArK2l0ICkKKwl7CisJCWlmKCBub3QgbVRhYmxlT2ZQYXJhbWV0ZXJFeHByRm9yTmV3Rm9ybXVsYS5jb250YWlucyggKml0ICkgKQorCQl7CisJCQltVGFibGVPZlBhcmFtZXRlckV4cHJGb3JPbGRGb3JtdWxhLmFwcGVuZCggKml0ICk7CisJCX0KKwl9CisKKy8vCW9sZEZvcm11bGEgPSBtU210RW5naW5lLnNpbXBsaWZ5KAorLy8JCQltRXhwck1hbmFnZXIubWtFeHByKENWQzQ6OmtpbmQ6OkFORCwgb2xkRm9ybXVsYUxpc3QpICk7CisvLworLy8JbmV3Rm9ybXVsYSA9IG1TbXRFbmdpbmUuc2ltcGxpZnkoCisvLwkJCW1FeHByTWFuYWdlci5ta0V4cHIoQ1ZDNDo6a2luZDo6QU5ELCBuZXdGb3JtdWxhTGlzdCkgKTsKKworLy8gVGVtcG9yYWlyZSBwb3VyIHRyYWNlIDogcmVtcGxhY2VyIGVuc3VpdGUgcGFyIGxlcyAyIMOpZ2FsaXTDqXMgcHLDqWPDqWRlbnRlcworCUNWQzQ6OkV4cHIgb2xkRm9ybXVsQXZhbnRTaW1wbGZ5ID0KKwkJCW1FeHByTWFuYWdlci5ta0V4cHIoQ1ZDNDo6a2luZDo6QU5ELCBvbGRGb3JtdWxhTGlzdCk7CisKK0FWTV9JRl9ERUJVR19GTEFHKCBTTVRfU09MVklORyApCisJQVZNX09TX1RSQUNFIDw8IHN0ZDo6ZW5kbCA8PCAib2xkRm9ybXVsYSBhdmFudCBzaW1wbGlmeSA6ICIKKwkJCTw8IG9sZEZvcm11bEF2YW50U2ltcGxmeSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggU01UX1NPTFZJTkcgKQorCisJb2xkRm9ybXVsYSA9IG1TbXRFbmdpbmUuc2ltcGxpZnkoIG9sZEZvcm11bEF2YW50U2ltcGxmeSApOworCitBVk1fSUZfREVCVUdfRkxBRyggU01UX1NPTFZJTkcgKQorCUFWTV9PU19UUkFDRSA8PCAib2xkRm9ybXVsYSBhcHLDqHMgc2ltcGxpZnkgOiAiCisJCQk8PCBvbGRGb3JtdWxhIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTTVRfU09MVklORyApCisKKworCUNWQzQ6OkV4cHIgbmV3Rm9ybXVsQXZhbnRTaW1wbGZ5ID0KKwkJCW1FeHByTWFuYWdlci5ta0V4cHIoQ1ZDNDo6a2luZDo6QU5ELCBuZXdGb3JtdWxhTGlzdCk7CisKK0FWTV9JRl9ERUJVR19GTEFHKCBTTVRfU09MVklORyApCisJQVZNX09TX1RSQUNFIDw8IHN0ZDo6ZW5kbCA8PCAibmV3Rm9ybXVsYSBhdmFudCBzaW1wbGlmeSA6ICIKKwkJCTw8IG5ld0Zvcm11bEF2YW50U2ltcGxmeSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggU01UX1NPTFZJTkcgKQorCisJbmV3Rm9ybXVsYSA9IG1TbXRFbmdpbmUuc2ltcGxpZnkoIG5ld0Zvcm11bEF2YW50U2ltcGxmeSApOworCitBVk1fSUZfREVCVUdfRkxBRyggU01UX1NPTFZJTkcgKQorCUFWTV9PU19UUkFDRSA8PCAibmV3Rm9ybXVsYSBhcHLDqHMgc2ltcGxpZnkgOiAiCisJCQk8PCBuZXdGb3JtdWxhIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTTVRfU09MVklORyApCisKKy8vCUNWQzQ6OkV4cHIgZXF1Rm9ybXVsQXZhbnRTaW1wbGZ5ID0gbUV4cHJNYW5hZ2VyLm1rRXhwcihDVkM0OjpraW5kOjpBTkQsIGVxdUZvcm11bGFMaXN0KTsKKy8vQVZNX0lGX0RFQlVHX0ZMQUcoIFNNVF9TT0xWSU5HICkKKy8vCUFWTV9PU19UUkFDRSA8PCBzdGQ6OmVuZGwgPDwgImVxdUZvcm11bGEgYXZhbnQgc2ltcGxpZnkgOiAiOworLy8JCQk8PCBlcXVGb3JtdWxBdmFudFNpbXBsZnkgPDwgc3RkOjplbmRsOworLy9BVk1fRU5ESUZfREVCVUdfRkxBRyggU01UX1NPTFZJTkcgKQorLy8JZXF1Rm9ybXVsYSA9IG1TbXRFbmdpbmUuc2ltcGxpZnkoIGVxdUZvcm11bEF2YW50U2ltcGxmeSApOworCisJcmVzZXRUYWJsZSgpOworfQorCisKKworYm9vbCBDVkM0U29sdmVyOjppc0VxdWFsU2V0KAorCQljb25zdCBFeGVjdXRpb25Db250ZXh0ICYgbmV3RUMsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBvbGRFQykKK3sKKwl0cnkKKwl7CisJCWNyZWF0ZUNoZWNrZXIoKTsKKworCQlDVkM0OjpFeHByIG5ld0Zvcm11bGE7CisJCUNWQzQ6OkV4cHIgb2xkRm9ybXVsYTsKKworCQllZFRvRXhwcihuZXdFQy5yZWZFeGVjdXRpb25EYXRhKCksIG5ld0Zvcm11bGEsCisJCQkJb2xkRUMucmVmRXhlY3V0aW9uRGF0YSgpLCBvbGRGb3JtdWxhKTsKKworQVZNX0lGX0RFQlVHX0ZMQUcoIFNNVF9TT0xWSU5HICkKKwlvbGRFQy50cmFjZURlZmF1bHQoQVZNX09TX1RSQUNFIDw8IFRBQik7CisJQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiRXhwcjogIiA8PCBvbGRGb3JtdWxhIDw8IHN0ZDo6ZW5kbDsKKworCW5ld0VDLnRyYWNlRGVmYXVsdChBVk1fT1NfVFJBQ0UgPDwgVEFCKTsKKwlBVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICJFeHByOiAiIDw8IG5ld0Zvcm11bGEgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNNVF9TT0xWSU5HICkKKworLy8JCUNWQzQ6OkV4cHIgZXF1YWxUZXN0ID0gbUV4cHJNYW5hZ2VyLm1rRXhwcihDVkM0OjpraW5kOjpGT1JBTEwsCisvLwkJCW1FeHByTWFuYWdlci5ta0V4cHIoQ1ZDNDo6a2luZDo6Qk9VTkRfVkFSX0xJU1QsIG1UYWJsZU9mVmFyaWFibGVFeHByKSwKKy8vCQkJbUV4cHJNYW5hZ2VyLm1rRXhwcihDVkM0OjpraW5kOjpFWElTVFMsCisvLwkJCQltRXhwck1hbmFnZXIubWtFeHByKENWQzQ6OmtpbmQ6OkJPVU5EX1ZBUl9MSVNULCBtVGFibGVPZlBhcmFtZXRlckV4cHIpLAorLy8JCQkJbUV4cHJNYW5hZ2VyLm1rRXhwcihDVkM0OjpraW5kOjpFUVVBTCwgb2xkRm9ybXVsYSwgbmV3Rm9ybXVsYSkpKTsKKy8vCisvLwkJQ1ZDNDo6RXhwciBlcXVhbFRlc3QgPSBtRXhwck1hbmFnZXIubWtFeHByKENWQzQ6OmtpbmQ6OkVYSVNUUywKKy8vCQkJCW1UYWJsZU9mUGFyYW1ldGVyRXhwciwKKy8vCQkJCW1FeHByTWFuYWdlci5ta0V4cHIoQ1ZDNDo6a2luZDo6RVFVQUwsCisvLwkJCQkJCW9sZEZvcm11bGEsIG5ld0Zvcm11bGEpKTsKKworCQlDVkM0OjpFeHByIGVxdWFsVGVzdCA9IG1FeHByTWFuYWdlci5ta0V4cHIoQ1ZDNDo6a2luZDo6RVFVQUwsCisJCQkJb2xkRm9ybXVsYSwgbmV3Rm9ybXVsYSk7CisKK0FWTV9JRl9ERUJVR19GTEFHKCBTTVRfU09MVklORyApCisJQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiaXNTdWJTZXQgRXhwcjogIiA8PCBlcXVhbFRlc3QgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNNVF9TT0xWSU5HICkKKworCQlDVkM0OjpSZXN1bHQgcmVzdWx0ID0gbVNtdEVuZ2luZS5xdWVyeShlcXVhbFRlc3QpOworCitBVk1fSUZfREVCVUdfRkxBRyggU01UX1NPTFZJTkcgKQorCUFWTV9PU19UUkFDRSA8PCBUQUIgPDwgIlxuaXNFcXVhbCByZXN1bHQgOiAiCisJCQk8PCBUQUIgPDwgKCAocmVzdWx0LmlzVmFsaWQoKSA9PSBDVkM0OjpSZXN1bHQ6OlZBTElEKSA/CisJCQkJCSJ0cnVlIiA6ICJmYWxzZSIgKSA8PCBzdGQ6OmVuZGwJPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNNVF9TT0xWSU5HICkKKworCQluZXdGb3JtdWxhID0gQ1ZDNF9FWFBSX05VTEw7CisJCW9sZEZvcm11bGEgPSBDVkM0X0VYUFJfTlVMTDsKKwkJZGVzdHJveUNoZWNrZXIoKTsKKworCQlyZXR1cm4oIHJlc3VsdCA9PSBDVkM0OjpSZXN1bHQ6OlZBTElEICk7CisJfQorCWNhdGNoKCBjb25zdCBDVkM0OjpFeGNlcHRpb24gJiBleCApCisJeworCQlBVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICIqKiogRXhjZXB0aW9uIGNhdWdodCBpbiBDVkM0U29sdmVyOjppc0VxdWFsU2V0OiBcbiIKKwkJCQk8PCBleCA8PCBzdGQ6OmVuZGw7CisKKwkJZGVzdHJveUNoZWNrZXIoKTsKKwl9CisKKwlyZXR1cm4oIGZhbHNlICk7Cit9CisKKworU29sdmVyRGVmOjpTQVRJU0ZJQUJJTElUWV9SSU5HIENWQzRTb2x2ZXI6OmlzU2F0aXNmaWFibGUoY29uc3QgQkYgJiBhQ29uZGl0aW9uKQoreworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNNVF9TT0xWSU5HICkKKwlBVk1fT1NfVFJBQ0UgPDwgIkNWQzRTb2x2ZXI6OmlzU2F0aXNmaWFibGUoLi4uKSAiCisJCQkiOiIgPDwgU09MVkVSX1NFU1NJT05fSUQgPDwgIj4iIDw8IHN0ZDo6ZW5kbAorCQkJPDwgIlx0IiA8PCBhQ29uZGl0aW9uLnN0cigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTTVRfU09MVklORyApCisKKwlpZiggYUNvbmRpdGlvbi5pc0Jvb2xlYW4oKSApCisJeworQVZNX0lGX0RFQlVHX0ZMQUcoIFNNVF9TT0xWSU5HICkKKwlBVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICJpcyBzYXRpc2ZpYWJsZSA6ICIgPDwgYUNvbmRpdGlvbi5zdHIoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggU01UX1NPTFZJTkcgKQorCisJCXJldHVybiggYUNvbmRpdGlvbi50b0Jvb2xlYW4oKSA/CisJCQkJU29sdmVyRGVmOjpTQVRJU0ZJQUJMRSA6IFNvbHZlckRlZjo6VU5TQVRJU0ZJQUJMRSApOworCX0KKworCWlmKCBhQ29uZGl0aW9uLmlzRmxvYXQoKSApCisJeworQVZNX0lGX0RFQlVHX0ZMQUcoIFNNVF9TT0xWSU5HICkKKwlBVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICJpcyBzYXRpc2ZpYWJsZSA6ICIgPDwgYUNvbmRpdGlvbi5zdHIoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggU01UX1NPTFZJTkcgKQorCisJCXJldHVybiggKCBhQ29uZGl0aW9uLnRvRmxvYXQoKSAhPSAwICkgPworCQkJCVNvbHZlckRlZjo6U0FUSVNGSUFCTEUgOiBTb2x2ZXJEZWY6OlVOU0FUSVNGSUFCTEUgKTsKKwl9CisKKworCXRyeQorCXsKKwkJY3JlYXRlQ2hlY2tlcigpOworCisJCS8vIGNvbXBpbGUgRm9ybXVsYQorCQlDVkM0OjpFeHByIGFGb3JtdWxhPSBzYWZlX2Zyb21fYmFzZWZvcm0oIGFDb25kaXRpb24gKTsKKworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU01UX1NPTFZJTkcgKQorCUFWTV9PU19UUkFDRSA8PCAiQ1ZDNENvbmRpdGlvbiA6IiA8PCBTT0xWRVJfU0VTU0lPTl9JRCA8PCAiPiIgPDwgc3RkOjplbmRsOworCUFWTV9JRl9ERUJVR19MRVZFTF9HVEVfSElHSAorCQlBVk1fT1NfVFJBQ0UgPDwgIlx0IjsKKwkJYUZvcm11bGEucHJpbnRBc3QoQVZNX09TX1RSQUNFKTsKKwkJQVZNX09TX1RSQUNFIDw8IHN0ZDo6ZW5kbDsKKwlBVk1fRU5ESUZfREVCVUdfTEVWRUxfR1RFX0hJR0gKKwlBVk1fT1NfVFJBQ0UgPDwgIlx0IiA8PCBhRm9ybXVsYSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU01UX1NPTFZJTkcgKQorCisJCUNWQzQ6OlJlc3VsdCByZXN1bHQgPSBtU210RW5naW5lLmNoZWNrU2F0KCBhRm9ybXVsYSApOworCisJCS8vIEFUVEVOVElPTiA6IGxvcnNxdWUgQ1ZDNCByw6lwb25kIFVOS05PV04sCisJCS8vIG9uIGNvbnNpZMOocmUgcXVlIGxhIGdhcmRlIGVzdCBTQVRJU0ZJQUJMRQorCQlTb2x2ZXJEZWY6OlNBVElTRklBQklMSVRZX1JJTkcgc2F0aXNmaWFiaWxpdHkgPSBTb2x2ZXJEZWY6OlNBVElTRklBQkxFOworCisJCXN3aXRjaCggcmVzdWx0LmlzU2F0KCkgKQorCQl7CisJCQljYXNlIENWQzQ6OlJlc3VsdDo6U0FUOgorCQkJLy9jYXNlIENWQzQ6OlZBTElEOgorCQkJeworCQkJCXNhdGlzZmlhYmlsaXR5ID0gU29sdmVyRGVmOjpTQVRJU0ZJQUJMRTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJY2FzZSBDVkM0OjpSZXN1bHQ6OlVOU0FUOgorCQkJLy9jYXNlIENWQzQ6OklOVkFMSUQ6CisJCQl7CisJCQkJc2F0aXNmaWFiaWxpdHkgPSBTb2x2ZXJEZWY6OlVOU0FUSVNGSUFCTEU7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNhc2UgQ1ZDNDo6UmVzdWx0OjpTQVRfVU5LTk9XTjoKKwkJCXsKKwkJCQlzYXRpc2ZpYWJpbGl0eSA9IFNvbHZlckRlZjo6VU5LTk9XTl9TQVQ7CisJCQkJYnJlYWs7CisJCQl9CisKKy8vCQkJY2FzZSBDVkM0OjpSZXN1bHQ6OkFCT1JUOgorCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQlzYXRpc2ZpYWJpbGl0eSA9IFNvbHZlckRlZjo6QUJPUlRfU0FUOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTTVRfU09MVklORyApCisJQVZNX09TX1RSQUNFIDw8ICJyZXN1bHQgOiIgPDwgU09MVkVSX1NFU1NJT05fSUQgPDwgIj4gIgorCQkJPDwgU29sdmVyRGVmOjpzdHJTYXRpc2ZpYWJpbGl0eShzYXRpc2ZpYWJpbGl0eSkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNNVF9TT0xWSU5HICkKKworCQlhRm9ybXVsYSA9IENWQzRfRVhQUl9OVUxMOworCQlkZXN0cm95Q2hlY2tlcigpOworCisJCXJldHVybiggc2F0aXNmaWFiaWxpdHkgKTsKKwl9CisJY2F0Y2ggKCBjb25zdCBDVkM0OjpFeGNlcHRpb24gJiBleCApCisJeworCQlBVk1fT1NfV0FSTiA8PCBzdGQ6OmVuZGwgPDwgUkVQRUFUKCIqKioqKioqKiIsIDEwKSA8PCBzdGQ6OmVuZGwKKwkJCQk8PCAiXHRDVkM0U29sdmVyOjppc1NhdGlzZmlhYmxlPCBDVkM0OjpFeGNlcHRpb24gOiIKKwkJCQk8PCBTT0xWRVJfU0VTU0lPTl9JRCA8PCAiPlxuXHQiIDw8IGV4IDw8IHN0ZDo6ZW5kbAorCQkJCTw8IFJFUEVBVCgiLS0tLS0tLS0iLCAxMCkgPDwgc3RkOjplbmRsCisJCQkJPDwgIlx0ICAiIDw8IGFDb25kaXRpb24uc3RyKCkgPDwgc3RkOjplbmRsCisJCQkJPDwgUkVQRUFUKCIqKioqKioqKiIsIDEwKSA8PCBzdGQ6OmVuZGw7CisKKwkJZGVzdHJveUNoZWNrZXIoKTsKKworCQlyZXR1cm4oIFNvbHZlckRlZjo6VU5LTk9XTl9TQVQgKTsKKwl9CisJY2F0Y2ggKCBjb25zdCBzdGQ6OmV4Y2VwdGlvbiAmIGV4ICkKKwl7CisJCUFWTV9PU19XQVJOIDw8IHN0ZDo6ZW5kbCA8PCBSRVBFQVQoIioqKioqKioqIiwgMTApIDw8IHN0ZDo6ZW5kbAorCQkJCTw8ICJcdENWQzRTb2x2ZXI6OmlzU2F0aXNmaWFibGU8IHN0ZDo6ZXhjZXB0aW9uIDoiCisJCQkJPDwgU09MVkVSX1NFU1NJT05fSUQgPDwgIj5cblx0IiA8PCBleC53aGF0KCkgPDwgc3RkOjplbmRsCisJCQkJPDwgUkVQRUFUKCItLS0tLS0tLSIsIDEwKSA8PCBzdGQ6OmVuZGwKKwkJCQk8PCAiXHQgICIgPDwgYUNvbmRpdGlvbi5zdHIoKSA8PCBzdGQ6OmVuZGwKKwkJCQk8PCBSRVBFQVQoIioqKioqKioqIiwgMTApIDw8IHN0ZDo6ZW5kbDsKKworCQlkZXN0cm95Q2hlY2tlcigpOworCisJCXJldHVybiggU29sdmVyRGVmOjpVTktOT1dOX1NBVCApOworCX0KKwljYXRjaCAoIC4uLiApCisJeworCQlBVk1fT1NfV0FSTiA8PCBzdGQ6OmVuZGwgPDwgUkVQRUFUKCIqKioqKioqKiIsIDEwKSA8PCBzdGQ6OmVuZGwKKwkJCQk8PCAiXHRDVkM0U29sdmVyOjppc1NhdGlzZmlhYmxlPCB1bmtub3duOjpleGNlcHRpb24gOiIKKwkJCQk8PCBTT0xWRVJfU0VTU0lPTl9JRCA8PCAiPiIgPDwgc3RkOjplbmRsCisJCQkJPDwgUkVQRUFUKCItLS0tLS0tLSIsIDEwKSA8PCBzdGQ6OmVuZGwKKwkJCQk8PCAiXHQgICIgPDwgYUNvbmRpdGlvbi5zdHIoKSA8PCBzdGQ6OmVuZGwKKwkJCQk8PCBSRVBFQVQoIioqKioqKioqIiwgMTApIDw8IHN0ZDo6ZW5kbDsKKworCQlkZXN0cm95Q2hlY2tlcigpOworCisJCXJldHVybiggU29sdmVyRGVmOjpVTktOT1dOX1NBVCApOworCX0KKworCXJldHVybiggU29sdmVyRGVmOjpVTktOT1dOX1NBVCApOworfQorCisKKworLyoqCisgKiBTT0xWRVIKKyAqLworYm9vbCBDVkM0U29sdmVyOjpzb2x2ZUltcGwoY29uc3QgQkYgJiBhQ29uZGl0aW9uLAorCQlCRlZlY3RvciAmIGRhdGFWZWN0b3IsIEJGVmVjdG9yICYgdmFsdWVzVmVjdG9yKQoreworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNNVF9TT0xWSU5HICkKKwlBVk1fT1NfVFJBQ0UgPDwgIkNWQzRTb2x2ZXI6OnNvbHZlKC4uLikgIgorCQkJIjoiIDw8IFNPTFZFUl9TRVNTSU9OX0lEIDw8ICI+IiA8PCBzdGQ6OmVuZGwKKwkJCTw8ICJcdCIgPDwgYUNvbmRpdGlvbi5zdHIoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU01UX1NPTFZJTkcgKQorCisJdHJ5CisJeworCQkvLyBQcm9kdWNlIE1vZGVscyBvcHRpb24gLS0+IHRydWUKKwkJY3JlYXRlQ2hlY2tlciggKTsKKworCQlyZXNldFRhYmxlKCk7CisKKwkJLy8gY29tcGlsZSBGb3JtdWxhCisJCUNWQzQ6OkV4cHIgYUZvcm11bGEgPSBzYWZlX2Zyb21fYmFzZWZvcm0oIGFDb25kaXRpb24gKTsKKworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU01UX1NPTFZJTkcgKQorCUFWTV9PU19UUkFDRSA8PCAiQ1ZDNENvbmRpdGlvbiA6IiA8PCBTT0xWRVJfU0VTU0lPTl9JRCA8PCAiPiIgPDwgc3RkOjplbmRsOworCUFWTV9JRl9ERUJVR19MRVZFTF9HVEVfSElHSAorCQlBVk1fT1NfVFJBQ0UgPDwgIlx0IjsKKwkJYUZvcm11bGEucHJpbnRBc3QoQVZNX09TX1RSQUNFKTsKKwkJQVZNX09TX1RSQUNFIDw8IHN0ZDo6ZW5kbDsKKwlBVk1fRU5ESUZfREVCVUdfTEVWRUxfR1RFX0hJR0gKKwkJQVZNX09TX1RSQUNFIDw8ICJcdCIgPDwgYUZvcm11bGEgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNNVF9TT0xWSU5HICkKKworCisJCUNWQzQ6OlJlc3VsdCByZXN1bHQgPSBtU210RW5naW5lLmNoZWNrU2F0KCBhRm9ybXVsYSApOworCisJCWlmKCByZXN1bHQuaXNTYXQoKSA9PSBDVkM0OjpSZXN1bHQ6OlNBVCApCisJCXsKKy8vCQkJQ1ZDNDo6TW9kZWwgKiBjb25jcmV0ZU1vZGVsID0gbVNtdEVuZ2luZS5nZXRNb2RlbCgpOworCisJCQlmb3IoIHN0ZDo6c2l6ZV90IGkgPSAxIDsgaSA8IG1UYWJsZU9mUGFyYW1ldGVySW5zdGFuY2Uuc2l6ZSgpIDsgKytpICkKKwkJCXsKKwkJCQlkYXRhVmVjdG9yLmFwcGVuZCggbVRhYmxlT2ZQYXJhbWV0ZXJJbnN0YW5jZVtpXSApOworCisJCQkJY29uc3QgQ1ZDNDo6RXhwciAmIHZhciA9IG1UYWJsZU9mUGFyYW1ldGVyRXhwcltpXTsKKwkJCQlDVkM0OjpFeHByIHZhbCA9IG1TbXRFbmdpbmUuZ2V0VmFsdWUodmFyKTsKKworCQkJCWlmKCB2YWwgPT0gU01UX0NTVF9CT09MX1RSVUUgKQorCQkJCXsKKwkJCQkJdmFsdWVzVmVjdG9yLmFwcGVuZCggRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX1RSVUUgKTsKKwkJCQl9CisJCQkJZWxzZSBpZiggdmFsID09IFNNVF9DU1RfQk9PTF9GQUxTRSApCisJCQkJeworCQkJCQl2YWx1ZXNWZWN0b3IuYXBwZW5kKCBFeHByZXNzaW9uQ29uc3RhbnQ6OkJPT0xFQU5fRkFMU0UgKTsKKwkJCQl9CisJCQkJZWxzZSBpZiggdmFsLmdldEtpbmQoKSA9PSBDVkM0OjpraW5kOjpDT05TVF9SQVRJT05BTCApCisJCQkJeworCQkJCQlDVkM0OjpSYXRpb25hbCByYXQgPSB2YWwuZ2V0Q29uc3Q8IENWQzQ6OlJhdGlvbmFsID4oKTsKKworI2lmIGRlZmluZWQoIF9BVk1fQlVJTFRJTl9OVU1FUklDX0dNUF8gKQorCisJCQkJCWlmKCByYXQuaXNJbnRlZ3JhbCgpICkKKwkJCQkJeworCQkJCQkJdmFsdWVzVmVjdG9yLmFwcGVuZCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdJbnRlZ2VyKAorCQkJCQkJCQlyYXQuZ2V0TnVtZXJhdG9yKCkuZ2V0X21weigpICkgKTsKKwkJCQkJfQorCQkJCQllbHNlIC8vIEMnZXN0IHVuIHJhdGlvbmVsIChudW0vZGVuKQorCQkJCQl7CisJCQkJCQl2YWx1ZXNWZWN0b3IuYXBwZW5kKAorCQkJCQkJCQlFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld1JhdGlvbmFsKAorCQkJCQkJCQkJCXJhdC5nZXRfbXBxKCkgKSApOworCQkJCQl9CisKKyNlbHNlCisKKwkJCQkJaWYoIHJhdC5pc0ludGVncmFsKCkgKQorCQkJCQl7CisJCQkJCQlpZiggcmF0LnNnbigpID4gMCApCisJCQkJCQl7CisJCQkJCQkJdmFsdWVzVmVjdG9yLmFwcGVuZCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdVSW50ZWdlcigKKwkJCQkJCQkJCXJhdC5nZXROdW1lcmF0b3IoKS5nZXRVbnNpZ25lZExvbmcoKSkgKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQl2YWx1ZXNWZWN0b3IuYXBwZW5kKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0ludGVnZXIoCisJCQkJCQkJCQlyYXQuZ2V0TnVtZXJhdG9yKCkuZ2V0TG9uZygpKSApOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UgLy8gQydlc3QgdW4gcmF0aW9uZWwgKG51bS9kZW4pCisJCQkJCXsKKwkJCQkJCXZhbHVlc1ZlY3Rvci5hcHBlbmQoCisJCQkJCQkJCUV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3UmF0aW9uYWwoCisJCQkJCQkJCQlzdGF0aWNfY2FzdDwgYXZtX2ludGVnZXJfdCA+KAorCQkJCQkJCQkJCXJhdC5nZXROdW1lcmF0b3IoKS5nZXRMb25nKCkgKSwKKwkJCQkJCQkJCXN0YXRpY19jYXN0PCBhdm1faW50ZWdlcl90ID4oCisJCQkJCQkJCQkJcmF0LmdldERlbm9taW5hdG9yKCkuZ2V0TG9uZygpICkgKSApOworCQkJCQl9CisKKyNlbmRpZiAvKiBfQVZNX0JVSUxUSU5fTlVNRVJJQ19HTVBfICovCisKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJdmFsdWVzVmVjdG9yLmFwcGVuZCggZGF0YVZlY3Rvci5iYWNrKCkgKTsKKworCQkJCX0KKworQVZNX0lGX0RFQlVHX0ZMQUcoIFNNVF9TT0xWSU5HICkKKwlBVk1fT1NfVFJBQ0UgPDwgbVRhYmxlT2ZQYXJhbWV0ZXJJbnN0YW5jZS5yYXdBdCggaSApLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQk8PCAiIC0tPiAiIDw8IHZhciA8PCAiID0gIiA8PCB2YWwgPDwgc3RkOjplbmRsOworLy8JQVZNX09TX0NPVVQ8PCBtVGFibGVPZlBhcmFtZXRlckluc3RhbmNlLnJhd0F0KCBpICktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKy8vCQkJPDwgIiAtLT4gIiA8PCB2YXIgPDwgIiA9ICIgPDwgdmFsIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTTVRfU09MVklORyApCisJCQl9CisJCX0KKworCQlhRm9ybXVsYSA9IENWQzRfRVhQUl9OVUxMOworCQlkZXN0cm95Q2hlY2tlcigpOworCisJCXJldHVybiggcmVzdWx0LmlzU2F0KCkgPT0gQ1ZDNDo6UmVzdWx0OjpTQVQgKTsKKwl9CisJY2F0Y2ggKCBjb25zdCBDVkM0OjpFeGNlcHRpb24gJiBleCApCisJeworCQlBVk1fT1NfV0FSTiA8PCBzdGQ6OmVuZGwgPDwgUkVQRUFUKCIqKioqKioqKiIsIDEwKSA8PCBzdGQ6OmVuZGwKKwkJCQk8PCAiXHRDVkM0U29sdmVyOjpzb2x2ZTwgQ1ZDNDo6RXhjZXB0aW9uIDoiCisJCQkJPDwgU09MVkVSX1NFU1NJT05fSUQgPDwgIj5cblx0IiA8PCBleCA8PCBzdGQ6OmVuZGwKKwkJCQk8PCBSRVBFQVQoIi0tLS0tLS0tIiwgMTApIDw8IHN0ZDo6ZW5kbAorCQkJCTw8ICJcdCAgIiA8PCBhQ29uZGl0aW9uLnN0cigpIDw8IHN0ZDo6ZW5kbAorCQkJCTw8IFJFUEVBVCgiKioqKioqKioiLCAxMCkgPDwgc3RkOjplbmRsOworCisJCWRlc3Ryb3lDaGVja2VyKCk7CisKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKwljYXRjaCAoIGNvbnN0IHN0ZDo6ZXhjZXB0aW9uICYgZXggKQorCXsKKwkJQVZNX09TX1dBUk4gPDwgc3RkOjplbmRsIDw8IFJFUEVBVCgiKioqKioqKioiLCAxMCkgPDwgc3RkOjplbmRsCisJCQkJPDwgIlx0Q1ZDNFNvbHZlcjo6c29sdmU8IHN0ZDo6ZXhjZXB0aW9uIDoiCisJCQkJPDwgU09MVkVSX1NFU1NJT05fSUQgPDwgIj5cblx0IiA8PCBleC53aGF0KCkgPDwgc3RkOjplbmRsCisJCQkJPDwgUkVQRUFUKCItLS0tLS0tLSIsIDEwKSA8PCBzdGQ6OmVuZGwKKwkJCQk8PCAiXHQgICIgPDwgYUNvbmRpdGlvbi5zdHIoKSA8PCBzdGQ6OmVuZGwKKwkJCQk8PCBSRVBFQVQoIioqKioqKioqIiwgMTApIDw8IHN0ZDo6ZW5kbDsKKworCQlkZXN0cm95Q2hlY2tlcigpOworCisJCXJldHVybiggZmFsc2UgKTsKKwl9CisJY2F0Y2ggKCAuLi4gKQorCXsKKwkJQVZNX09TX1dBUk4gPDwgc3RkOjplbmRsIDw8IFJFUEVBVCgiKioqKioqKioiLCAxMCkgPDwgc3RkOjplbmRsCisJCQkJPDwgIlx0Q1ZDNFNvbHZlcjo6c29sdmU8IHVua25vd246OmV4Y2VwdGlvbiA6IgorCQkJCTw8IFNPTFZFUl9TRVNTSU9OX0lEIDw8ICI+IiA8PCBzdGQ6OmVuZGwKKwkJCQk8PCBSRVBFQVQoIi0tLS0tLS0tIiwgMTApIDw8IHN0ZDo6ZW5kbAorCQkJCTw8ICJcdCAgIiA8PCBhQ29uZGl0aW9uLnN0cigpIDw8IHN0ZDo6ZW5kbAorCQkJCTw8IFJFUEVBVCgiKioqKioqKioiLCAxMCkgPDwgc3RkOjplbmRsOworCisJCWRlc3Ryb3lDaGVja2VyKCk7CisKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKworCisvKioKKyAqIFRPT0xTCisgKi8KKwordm9pZCBDVkM0U29sdmVyOjplZFRvRXhwcigKKwkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIG5ld0VELCBDVkM0OjpFeHByICYgbmV3Rm9ybXVsYSwKKwkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIG9sZEVELCBDVkM0OjpFeHByICYgb2xkRm9ybXVsYSkKK3sKKy8vCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9QT0lOVEVSX0VYSVQoIG1TbXRFbmdpbmUgKSA8PCAiVmFsaWRpdHlDaGVja2VyICEhISIKKy8vCQkJPDwgU0VORF9FWElUOworCisJcmVzZXRUYWJsZSgpOworCisJLy8gY29tcGlsZSBQQ3MKKwlDVkM0OjpFeHByIGFQQzsKKwlzdGQ6OnZlY3RvcjwgQ1ZDNDo6RXhwciA+IG5ld0Zvcm11bGFMaXN0OworCW5ld0Zvcm11bGFMaXN0LnB1c2hfYmFjayggYVBDID0gc2FmZV9mcm9tX2Jhc2Vmb3JtKG5ld0VELmdldFBhdGhDb25kaXRpb24oKSkgKTsKKworQVZNX0lGX0RFQlVHX0ZMQUcoIFNNVF9TT0xWSU5HICkKKwlBVk1fT1NfVFJBQ0UgPDwgc3RkOjplbmRsIDw8ICJuZXcgUEM6ICIgPDwgYVBDIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTTVRfU09MVklORyApCisKKwlzdGQ6OnZlY3RvcjwgQ1ZDNDo6RXhwciA+IG9sZEZvcm11bGFMaXN0OworCW9sZEZvcm11bGFMaXN0LnB1c2hfYmFjayggYVBDID0gc2FmZV9mcm9tX2Jhc2Vmb3JtKG9sZEVELmdldFBhdGhDb25kaXRpb24oKSkgKTsKKworQVZNX0lGX0RFQlVHX0ZMQUcoIFNNVF9TT0xWSU5HICkKKwlBVk1fT1NfVFJBQ0UgPDwgIm9sZCBQQzogIiA8PCBhUEMgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNNVF9TT0xWSU5HICkKKworCUluc3RhbmNlT2ZEYXRhICogYVZhciA9IE5VTEw7CisJQmFzZVR5cGVTcGVjaWZpZXIgKiB2YXJUeXBlU3BlY2lmaWVyID0gTlVMTDsKKworCS8vIGNvbXBpbGUgREFUQXMKKwlzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworCUxpc3RPZkluc3RhbmNlT2ZEYXRhOjppdGVyYXRvciBpdFZhcjsKKwlMaXN0T2ZJbnN0YW5jZU9mRGF0YTo6aXRlcmF0b3IgZW5kVmFyOworCisJTGlzdE9mUGFpck1hY2hpbmVEYXRhOjppdGVyYXRvciBpdFBhaXJNYWNoaW5lRGF0YSA9IGdldFNlbGVjdGVkVmFyaWFibGUoKS5iZWdpbigpOworCUxpc3RPZlBhaXJNYWNoaW5lRGF0YTo6aXRlcmF0b3IgZW5kUGFpck1hY2hpbmVEYXRhID0gZ2V0U2VsZWN0ZWRWYXJpYWJsZSgpLmVuZCgpOworCWF2bV9vZmZzZXRfdCB2YXJJRCA9IDE7CisJZm9yKCA7IGl0UGFpck1hY2hpbmVEYXRhICE9IGVuZFBhaXJNYWNoaW5lRGF0YSA7ICsraXRQYWlyTWFjaGluZURhdGEgKQorCXsKKwkJaWYoICgqaXRQYWlyTWFjaGluZURhdGEpLnNlY29uZCgpLm5vbmVtcHR5KCkgKQorCQl7CisJCQljb25zdCBSdW50aW1lRm9ybSAmIG5ld1JGID0gbmV3RUQuZ2V0UnVudGltZSgKKwkJCQkJKCppdFBhaXJNYWNoaW5lRGF0YSkuZmlyc3QoKSApOworCQkJY29uc3QgUnVudGltZUZvcm0gJiBvbGRSRiA9IG9sZEVELmdldFJ1bnRpbWUoCisJCQkJCSgqaXRQYWlyTWFjaGluZURhdGEpLmZpcnN0KCkgKTsKKworCQkJaXRWYXIgPSAoKml0UGFpck1hY2hpbmVEYXRhKS5zZWNvbmQoKS5iZWdpbigpOworCQkJZW5kVmFyID0gKCppdFBhaXJNYWNoaW5lRGF0YSkuc2Vjb25kKCkuZW5kKCk7CisJCQlmb3IoIDsgaXRWYXIgIT0gZW5kVmFyIDsgKytpdFZhciAsICsrdmFySUQgKQorCQkJeworCQkJCS8vPz8/IFRBQkxFQVVYCisJCQkJYVZhciA9IG5ld1JGLnJhd1ZhcmlhYmxlKCgqaXRWYXIpLT5nZXRPZmZzZXQoKSk7CisJCQkJdmFyVHlwZVNwZWNpZmllciA9IGFWYXItPmdldFR5cGVTcGVjaWZpZXIoKTsKKworCQkJCW9zcy5zdHIoIiIpOworCQkJCW9zcyA8PCAiVl8iIDw8IHZhcklEOworCisJCQkJQ1ZDNDo6RXhwciBuZXdWYWx1ZSA9IHNhZmVfZnJvbV9iYXNlZm9ybSgKKwkJCQkJCW5ld1JGLmdldERhdGEoKml0VmFyKSwgdmFyVHlwZVNwZWNpZmllcik7CisJCQkJQ1ZDNDo6RXhwciBvbGRWYWx1ZSA9IHNhZmVfZnJvbV9iYXNlZm9ybSgKKwkJCQkJCW9sZFJGLmdldERhdGEoKml0VmFyKSwgdmFyVHlwZVNwZWNpZmllcik7CisKKwkJCQlpZiggdmFyVHlwZVNwZWNpZmllci0+aXNUeXBlZEJvb2xlYW4oKSApCisJCQkJeworCQkJCQlDVkM0OjpFeHByIHZhckV4cHIgPQorCQkJCQkJCW1FeHByTWFuYWdlci5ta1Zhcihvc3Muc3RyKCksIFNNVF9UWVBFX0JPT0wpOworCQkJCQltVGFibGVPZlZhcmlhYmxlRXhwci5wdXNoX2JhY2soIHZhckV4cHIgKTsKKwkJCQkJbmV3Rm9ybXVsYUxpc3QucHVzaF9iYWNrKCBtRXhwck1hbmFnZXIubWtFeHByKAorCQkJCQkJCUNWQzQ6OmtpbmQ6OkVRVUFMLCB2YXJFeHByLCBuZXdWYWx1ZSkgKTsKKwkJCQkJb2xkRm9ybXVsYUxpc3QucHVzaF9iYWNrKCBtRXhwck1hbmFnZXIubWtFeHByKAorCQkJCQkJCUNWQzQ6OmtpbmQ6OkVRVUFMLHZhckV4cHIsIG9sZFZhbHVlKSApOworCQkJCX0KKwkJCQllbHNlIGlmKCB2YXJUeXBlU3BlY2lmaWVyLT53ZWFrbHlUeXBlZEludGVnZXIoKSB8fAorCQkJCQkJdmFyVHlwZVNwZWNpZmllci0+aXNUeXBlZEVudW0oKSApCisJCQkJeworCQkJCQlDVkM0OjpFeHByIHZhckV4cHIgPQorCQkJCQkJCW1FeHByTWFuYWdlci5ta1Zhcihvc3Muc3RyKCksIFNNVF9UWVBFX0lOVCk7CisJCQkJCW1UYWJsZU9mVmFyaWFibGVFeHByLnB1c2hfYmFjayggdmFyRXhwciApOworCQkJCQluZXdGb3JtdWxhTGlzdC5wdXNoX2JhY2soIG1FeHByTWFuYWdlci5ta0V4cHIoCisJCQkJCQkJQ1ZDNDo6a2luZDo6RVFVQUwsIHZhckV4cHIsIG5ld1ZhbHVlKSApOworCQkJCQlvbGRGb3JtdWxhTGlzdC5wdXNoX2JhY2soIG1FeHByTWFuYWdlci5ta0V4cHIoCisJCQkJCQkJQ1ZDNDo6a2luZDo6RVFVQUwsIHZhckV4cHIsIG9sZFZhbHVlKSApOworCQkJCX0KKwkJCQllbHNlIGlmKCB2YXJUeXBlU3BlY2lmaWVyLT53ZWFrbHlUeXBlZFJlYWwoKSApCisJCQkJeworCQkJCQlDVkM0OjpFeHByIHZhckV4cHIgPQorCQkJCQkJCW1FeHByTWFuYWdlci5ta1Zhcihvc3Muc3RyKCksIFNNVF9UWVBFX1JFQUwpOworCQkJCQltVGFibGVPZlZhcmlhYmxlRXhwci5wdXNoX2JhY2soIHZhckV4cHIgKTsKKwkJCQkJbmV3Rm9ybXVsYUxpc3QucHVzaF9iYWNrKCBtRXhwck1hbmFnZXIubWtFeHByKAorCQkJCQkJCUNWQzQ6OmtpbmQ6OkVRVUFMLCB2YXJFeHByLCBuZXdWYWx1ZSkgKTsKKwkJCQkJb2xkRm9ybXVsYUxpc3QucHVzaF9iYWNrKCBtRXhwck1hbmFnZXIubWtFeHByKAorCQkJCQkJCUNWQzQ6OmtpbmQ6OkVRVUFMLCB2YXJFeHByLCBvbGRWYWx1ZSkgKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJQVZNX09TX0VSUk9SX0FMRVJUIDw8ICJVbmV4cGVjdGVkIGFuIGluc3RhbmNlIHR5cGUgPDwgIgorCQkJCQkJCTw8IGFWYXItPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIiBhcyA6ICIgPDwgb3NzLnN0cigpIDw8ICIgOiAiCisJCQkJCQkJPDwgdmFyVHlwZVNwZWNpZmllci0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiPj4gISEhIgorCQkJCQkJCTw8IFNFTkRfQUxFUlQ7CisKKwkJCQkJQ1ZDNDo6RXhwciB2YXJFeHByID0gbUV4cHJNYW5hZ2VyLm1rVmFyKG9zcy5zdHIoKSwgU01UX1RZUEVfUkVBTCk7CisJCQkJCW1UYWJsZU9mVmFyaWFibGVFeHByLnB1c2hfYmFjayggdmFyRXhwciApOworCQkJCQluZXdGb3JtdWxhTGlzdC5wdXNoX2JhY2soIG1FeHByTWFuYWdlci5ta0V4cHIoCisJCQkJCQkJQ1ZDNDo6a2luZDo6RVFVQUwsIHZhckV4cHIsIG5ld1ZhbHVlKSApOworCQkJCQlvbGRGb3JtdWxhTGlzdC5wdXNoX2JhY2soIG1FeHByTWFuYWdlci5ta0V4cHIoCisJCQkJCQkJQ1ZDNDo6a2luZDo6RVFVQUwsIHZhckV4cHIsIG9sZFZhbHVlKSApOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCW9sZEZvcm11bGEgPSBtU210RW5naW5lLnNpbXBsaWZ5KAorCQkJbUV4cHJNYW5hZ2VyLm1rRXhwcihDVkM0OjpraW5kOjpBTkQsIG9sZEZvcm11bGFMaXN0KSApOworCisJbmV3Rm9ybXVsYSA9IG1TbXRFbmdpbmUuc2ltcGxpZnkoCisJCQltRXhwck1hbmFnZXIubWtFeHByKENWQzQ6OmtpbmQ6OkFORCwgbmV3Rm9ybXVsYUxpc3QpICk7CisKKworCXJlc2V0VGFibGUoKTsKK30KKworCisvKgorQ1ZDNDo6RXhwciBDVkM0U29sdmVyOjplZFRvRXhwcihjb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCkKK3sKKwlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBtU210RW5naW5lICkgPDwgIlZhbGlkaXR5Q2hlY2tlciAhISEiCisJCQk8PCBTRU5EX0VYSVQ7CisKKy8vQVZNX0lGX0RFQlVHX0ZMQUcoIFNNVF9TT0xWSU5HICkKKy8vCUFWTV9PU19UUkFDRSA8PCBUQUIgPDwgImVkVG9FeHByIEVEOiBcbiI7CisvLwlhbkVELnRvU3RyZWFtRGF0YShBVk1fT1NfVFJBQ0UsICJcdCIpOworLy8JQVZNX09TX1RSQUNFIDw8IHN0ZDo6Zmx1c2g7CisvL0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTTVRfU09MVklORyApCisKKwlyZXNldFRhYmxlKCk7CisKKwkvLyBjb21waWxlIFBDCisJQ1ZDNDo6RXhwciBwY0V4cHIgPSBtU210RW5naW5lLnNpbXBsaWZ5KHNhZmVfZnJvbV9iYXNlZm9ybShhbkVELmdldFBhdGhDb25kaXRpb24oKSkpOworQVZNX0lGX0RFQlVHX0ZMQUcoIFNNVF9TT0xWSU5HICkKKwlBVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICJcblBDOiAiIDw8IHBjRXhwciA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggU01UX1NPTFZJTkcgKQorCW1TbXRFbmdpbmUuYXNzZXJ0Rm9ybXVsYSggcGNFeHByICk7CisKKwlzdGQ6OnZlY3RvcjwgQ1ZDNDo6RXhwciA+IGFGb3JtdWxhTGlzdDsKKwlJbnN0YW5jZU9mRGF0YSAqIGFWYXIgPSBOVUxMOworCUJhc2VUeXBlU3BlY2lmaWVyICogdmFyVHlwZVNwZWNpZmllciA9IE5VTEw7CisJTGlzdE9mSW5zdGFuY2VPZkRhdGE6Oml0ZXJhdG9yIGl0VmFyOworCisJLy8gY29tcGlsZSBEQVRBCisJTGlzdE9mTGlzdE9mSW5zdGFuY2VPZkRhdGE6Oml0ZXJhdG9yIGl0UGFpck1hY2hpbmVEYXRhID0KKwkJCWdldFNlbGVjdGVkVmFyaWFibGUoKS0+YmVnaW4oKTsKKwlmb3IoIDsgaXRQYWlyTWFjaGluZURhdGEgIT0gZ2V0U2VsZWN0ZWRWYXJpYWJsZSgpLT5lbmQoKSA7ICsraXRQYWlyTWFjaGluZURhdGEgKQorCXsKKwkJaWYoICgqaXRQYWlyTWFjaGluZURhdGEpLnNlY29uZCgpLm5vbmVtcHR5KCkgKQorCQl7CisJCQlpdFZhciA9ICgqaXRQYWlyTWFjaGluZURhdGEpLmJlZ2luKCk7CisJCQlSdW50aW1lRm9ybSAqIGFSRiA9IGFuRUQuZ2V0KCppdFZhcik7CisKKwkJCWZvciggOyBpdFZhciAhPSAoKml0UGFpck1hY2hpbmVEYXRhKS5lbmQoKSA7ICsraXRWYXIgKQorCQkJeworCQkJCWFWYXIgPSBhUkYuZ2V0RXhlY3V0YWJsZSgpLT5nZXRCYXNpY0RhdGEoKCppdFZhciktPmdldE9mZnNldCgpKTsKKwkJCQl2YXJUeXBlU3BlY2lmaWVyID0gYVZhci0+Z2V0VHlwZVNwZWNpZmllcigpOworCisJCQkJaWYoIHZhclR5cGVTcGVjaWZpZXItPmlzVHlwZWRCb29sZWFuKCkgKQorCQkJCXsKKwkJCQkJYUZvcm11bGFMaXN0LnB1c2hfYmFjayggc2FmZV9mcm9tX2Jhc2Vmb3JtKAorCQkJCQkJCWFSRi5nZXREYXRhKCppdFZhciksIHZhclR5cGVTcGVjaWZpZXIpICk7CisJCQkJfQorCQkJCWVsc2UgaWYoIHZhclR5cGVTcGVjaWZpZXItPndlYWtseVR5cGVkSW50ZWdlcigpIHx8CisJCQkJCQl2YXJUeXBlU3BlY2lmaWVyLT5pc1R5cGVkRW51bSgpICkKKwkJCQl7CisJCQkJCWFGb3JtdWxhTGlzdC5wdXNoX2JhY2soIHNhZmVfZnJvbV9iYXNlZm9ybSgKKwkJCQkJCQlhUkYuZ2V0RGF0YSgqaXRWYXIpLCB2YXJUeXBlU3BlY2lmaWVyKSApOworCQkJCX0KKwkJCQllbHNlIGlmKCB2YXJUeXBlU3BlY2lmaWVyLT53ZWFrbHlUeXBlZFJlYWwoKSApCisJCQkJeworCQkJCQlhRm9ybXVsYUxpc3QucHVzaF9iYWNrKCBzYWZlX2Zyb21fYmFzZWZvcm0oCisJCQkJCQkJYVJGLmdldERhdGEoKml0VmFyKSwgdmFyVHlwZVNwZWNpZmllcikgKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJQVZNX09TX0VSUk9SX0FMRVJUIDw8ICJVbmV4cGVjdGVkIGFuIGluc3RhbmNlIHR5cGUgPDwgIgorCQkJCQkJCTw8IGFWYXItPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgIiA6ICIKKwkJCQkJCQk8PCB2YXJUeXBlU3BlY2lmaWVyLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8ICI+PiAhISEiCisJCQkJCQkJPDwgU0VORF9BTEVSVDsKKworCQkJCQlhRm9ybXVsYUxpc3QucHVzaF9iYWNrKCBzYWZlX2Zyb21fYmFzZWZvcm0oCisJCQkJCQkJYVJGLmdldERhdGEoKml0VmFyKSwgdmFyVHlwZVNwZWNpZmllcikgKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlDVkM0OjpFeHByIGVkRXhwciA9ICBtRXhwck1hbmFnZXIubWtFeHByKENWQzQ6OmtpbmQ6OlRVUExFLCBhRm9ybXVsYUxpc3QpOworCitBVk1fSUZfREVCVUdfRkxBRyggU01UX1NPTFZJTkcgKQorCUFWTV9PU19UUkFDRSA8PCBUQUIgPDwgIkV4cHI6ICI7CisJQVZNX09TX1RSQUNFIDw8IGVkRXhwciA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggU01UX1NPTFZJTkcgKQorCisJcmVzZXRUYWJsZSgpOworCisJcmV0dXJuKCBlZEV4cHIgKTsKK30KKworKi8KKworCitDVkM0OjpFeHByIENWQzRTb2x2ZXI6OmVkVG9FeHByKGNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVEKQoreworLy8JQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1BPSU5URVJfRVhJVCggbVNtdEVuZ2luZSApIDw8ICJWYWxpZGl0eUNoZWNrZXIgISEhIgorLy8JCQk8PCBTRU5EX0VYSVQ7CisKKy8vQVZNX0lGX0RFQlVHX0ZMQUcoIFNNVF9TT0xWSU5HICkKKy8vCUFWTV9PU19UUkFDRSA8PCBUQUIgPDwgImVkVG9FeHByIEVEOiBcbiI7CisvLwlhbkVELnRvU3RyZWFtRGF0YShBVk1fT1NfVFJBQ0UsICJcdCIpOworLy8JQVZNX09TX1RSQUNFIDw8IHN0ZDo6Zmx1c2g7CisvL0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTTVRfU09MVklORyApCisKKwlyZXNldFRhYmxlKCk7CisKKwlzdGQ6OnZlY3RvcjwgQ1ZDNDo6RXhwciA+IGFGb3JtdWxhTGlzdDsKKworCS8vIGNvbXBpbGUgUEMKKwlhRm9ybXVsYUxpc3QucHVzaF9iYWNrKCBzYWZlX2Zyb21fYmFzZWZvcm0oYW5FRC5nZXRQYXRoQ29uZGl0aW9uKCkpICk7CisKKwlCYXNlVHlwZVNwZWNpZmllciAqIHZhclR5cGVTcGVjaWZpZXIgPSBOVUxMOworCUxpc3RPZkluc3RhbmNlT2ZEYXRhOjppdGVyYXRvciBpdFZhcjsKKwlMaXN0T2ZJbnN0YW5jZU9mRGF0YTo6aXRlcmF0b3IgZW5kVmFyOworCisJLy8gY29tcGlsZSBEQVRBCisJTGlzdE9mUGFpck1hY2hpbmVEYXRhOjppdGVyYXRvciBpdFBhaXJNYWNoaW5lRGF0YSA9IGdldFNlbGVjdGVkVmFyaWFibGUoKS5iZWdpbigpOworCUxpc3RPZlBhaXJNYWNoaW5lRGF0YTo6aXRlcmF0b3IgZW5kUGFpck1hY2hpbmVEYXRhID0gZ2V0U2VsZWN0ZWRWYXJpYWJsZSgpLmVuZCgpOworCWF2bV9vZmZzZXRfdCB2YXJJRCA9IDA7CisJZm9yKCA7IGl0UGFpck1hY2hpbmVEYXRhICE9IGVuZFBhaXJNYWNoaW5lRGF0YSA7ICsraXRQYWlyTWFjaGluZURhdGEgKQorCXsKKwkJaWYoICgqaXRQYWlyTWFjaGluZURhdGEpLnNlY29uZCgpLm5vbmVtcHR5KCkgKQorCQl7CisJCQljb25zdCBSdW50aW1lRm9ybSAmIGFSRiA9IGFuRUQuZ2V0UnVudGltZSgKKwkJCQkJKCppdFBhaXJNYWNoaW5lRGF0YSkuZmlyc3QoKSApOworCisJCQlpdFZhciA9ICgqaXRQYWlyTWFjaGluZURhdGEpLnNlY29uZCgpLmJlZ2luKCk7CisJCQllbmRWYXIgPSAoKml0UGFpck1hY2hpbmVEYXRhKS5zZWNvbmQoKS5lbmQoKTsKKwkJCWZvciggOyBpdFZhciAhPSBlbmRWYXIgOyArK2l0VmFyICwgKyt2YXJJRCApCisJCQl7CisJCQkJLy8/Pz8gVEFCTEVBVVgKKwkJCQlJbnN0YW5jZU9mRGF0YSAqIGFWYXIgPSBhUkYucmF3VmFyaWFibGUoKCppdFZhciktPmdldE9mZnNldCgpKTsKKworCQkJCXZhclR5cGVTcGVjaWZpZXIgPSBhVmFyLT5nZXRUeXBlU3BlY2lmaWVyKCk7CisKKwkJCQlpZiggdmFyVHlwZVNwZWNpZmllci0+aXNUeXBlZEJvb2xlYW4oKSApCisJCQkJeworCQkJCQlhRm9ybXVsYUxpc3QucHVzaF9iYWNrKCBtRXhwck1hbmFnZXIubWtFeHByKENWQzQ6OmtpbmQ6OkVRVUFMLAorCQkJCQkJCWdldFZhcmlhYmxlRXhwcihhVmFyLCBTTVRfVFlQRV9CT09MLCB2YXJJRCksCisJCQkJCQkJc2FmZV9mcm9tX2Jhc2Vmb3JtKGFSRi5nZXREYXRhKCppdFZhciksCisJCQkJCQkJCQl2YXJUeXBlU3BlY2lmaWVyKSkgKTsKKwkJCQl9CisJCQkJZWxzZSBpZiggdmFyVHlwZVNwZWNpZmllci0+d2Vha2x5VHlwZWRJbnRlZ2VyKCkgfHwKKwkJCQkJCXZhclR5cGVTcGVjaWZpZXItPmlzVHlwZWRFbnVtKCkgKQorCQkJCXsKKwkJCQkJYUZvcm11bGFMaXN0LnB1c2hfYmFjayggbUV4cHJNYW5hZ2VyLm1rRXhwcihDVkM0OjpraW5kOjpFUVVBTCwKKwkJCQkJCQlnZXRWYXJpYWJsZUV4cHIoYVZhciwgU01UX1RZUEVfSU5ULCB2YXJJRCksCisJCQkJCQkJc2FmZV9mcm9tX2Jhc2Vmb3JtKGFSRi5nZXREYXRhKCppdFZhciksCisJCQkJCQkJCQl2YXJUeXBlU3BlY2lmaWVyKSkgKTsKKwkJCQl9CisJCQkJZWxzZSBpZiggdmFyVHlwZVNwZWNpZmllci0+d2Vha2x5VHlwZWRSZWFsKCkgKQorCQkJCXsKKwkJCQkJYUZvcm11bGFMaXN0LnB1c2hfYmFjayggbUV4cHJNYW5hZ2VyLm1rRXhwcihDVkM0OjpraW5kOjpFUVVBTCwKKwkJCQkJCQlnZXRWYXJpYWJsZUV4cHIoYVZhciwgU01UX1RZUEVfUkVBTCwgdmFySUQpLAorCQkJCQkJCXNhZmVfZnJvbV9iYXNlZm9ybShhUkYuZ2V0RGF0YSgqaXRWYXIpLAorCQkJCQkJCQkJdmFyVHlwZVNwZWNpZmllcikpICk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUFWTV9PU19FUlJPUl9BTEVSVCA8PCAiVW5leHBlY3RlZCBhbiBpbnN0YW5jZSB0eXBlIDw8ICIKKwkJCQkJCQk8PCBhVmFyLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8ICIgOiAiCisJCQkJCQkJPDwgdmFyVHlwZVNwZWNpZmllci0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiPj4gISEhIgorCQkJCQkJCTw8IFNFTkRfQUxFUlQ7CisKKwkJCQkJYUZvcm11bGFMaXN0LnB1c2hfYmFjayggbUV4cHJNYW5hZ2VyLm1rRXhwcihDVkM0OjpraW5kOjpFUVVBTCwKKwkJCQkJCQlnZXRWYXJpYWJsZUV4cHIoYVZhciwgU01UX1RZUEVfUkVBTCwgdmFySUQpLAorCQkJCQkJCXNhZmVfZnJvbV9iYXNlZm9ybShhUkYuZ2V0RGF0YSgqaXRWYXIpLAorCQkJCQkJCQkJdmFyVHlwZVNwZWNpZmllcikpICk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJQ1ZDNDo6RXhwciBlZEV4cHIgPSBtRXhwck1hbmFnZXIubWtFeHByKENWQzQ6OmtpbmQ6OkVYSVNUUywKKwkJCW1FeHByTWFuYWdlci5ta0V4cHIoCisJCQkJCUNWQzQ6OmtpbmQ6OkJPVU5EX1ZBUl9MSVNULCBtVGFibGVPZlBhcmFtZXRlckV4cHIpLAorCQkJbVNtdEVuZ2luZS5zaW1wbGlmeSgKKwkJCQkJbUV4cHJNYW5hZ2VyLm1rRXhwcihDVkM0OjpraW5kOjpBTkQsIGFGb3JtdWxhTGlzdCkpICk7CisKK0FWTV9JRl9ERUJVR19GTEFHKCBTTVRfU09MVklORyApCisJQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiRXhwcjogIjsKKwlBVk1fT1NfVFJBQ0UgPDwgZWRFeHByIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHKCBTTVRfU09MVklORyApCisKKwlyZXNldFRhYmxlKCk7CisKKwlyZXR1cm4oIGVkRXhwciApOworfQorCisKK0NWQzQ6OkV4cHIgJiBDVkM0U29sdmVyOjpnZXRQYXJhbWV0ZXJFeHByKGNvbnN0IEJGICYgYmZQYXJhbWV0ZXIpCit7CisJSW5zdGFuY2VPZkRhdGEgKiBhUGFyYW1ldGVyID0gYmZQYXJhbWV0ZXIudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCk7CisKKwlpZiggYVBhcmFtZXRlci0+Z2V0TWFyaygpID09IDAgKQorCXsKKwkJQmFzZVR5cGVTcGVjaWZpZXIgKiBwYXJhbVR5cGVTcGVjaWZpZXIgPQorCQkJCWFQYXJhbWV0ZXItPnJlZmVyZWRUeXBlU3BlY2lmaWVyKCk7CisKKwkJQ1ZDNDo6VHlwZSBwYXJhbVR5cGU7CisKKwkJaWYoIHBhcmFtVHlwZVNwZWNpZmllci0+aXNUeXBlZEJvb2xlYW4oKSApCisJCXsKKwkJCXBhcmFtVHlwZSA9IFNNVF9UWVBFX0JPT0w7CisJCX0KKwkJZWxzZSBpZiggcGFyYW1UeXBlU3BlY2lmaWVyLT53ZWFrbHlUeXBlZEludGVnZXIoKSApCisJCXsKKwkJCWlmKCBTb2x2ZXJEZWY6OkRFRkFVTFRfU09MVkVSX0tJTkQgPT0KKwkJCQkJU29sdmVyRGVmOjpTT0xWRVJfQ1ZDNF9CVjMyX0tJTkQgKQorCQkJeworCQkJCXBhcmFtVHlwZSA9IFNNVF9UWVBFX0JWMzI7CisJCQl9CisJCQllbHNlCisvLwkJCQlpZiggU29sdmVyRGVmOjpERUZBVUxUX1NPTFZFUl9LSU5EID09CisvLwkJCQkJCVNvbHZlckRlZjo6U09MVkVSX0NWQzRfS0lORCApCisJCQl7CisJCQkJcGFyYW1UeXBlID0gU01UX1RZUEVfSU5UOworCQkJfQorLy8JCQllbHNlCisvLwkJCXsKKy8vCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKy8vCQkJCQk8PCAiU29sdmVyRGVmOjpERUZBVUxUX1NPTFZFUl9LSU5EIDw+ICIKKy8vCQkJCQkJIkNWQzRfSU5UIGFuZCA8PiBDVkM0X0JWMzIgISEhXG4iCisvLwkJCQkJPDwgU0VORF9FWElUOworLy8KKy8vCQkJCXBhcmFtVHlwZSA9IFNNVF9UWVBFX0lOVDsKKy8vCQkJfQorCQl9CisJCWVsc2UgaWYoIHBhcmFtVHlwZVNwZWNpZmllci0+d2Vha2x5VHlwZWRSZWFsKCkgKQorCQl7CisJCQlwYXJhbVR5cGUgPSBTTVRfVFlQRV9SRUFMOworCQl9CisJCWVsc2UgaWYoIHBhcmFtVHlwZVNwZWNpZmllci0+aXNUeXBlZFN0cmluZygpICkKKwkJeworCQkJcGFyYW1UeXBlID0gU01UX1RZUEVfU1RSSU5HOworCQl9CisJCWVsc2UgaWYoIHBhcmFtVHlwZVNwZWNpZmllci0+aXNUeXBlZEVudW0oKSApCisJCXsKKwkJCXBhcmFtVHlwZSA9IFNNVF9UWVBFX0lOVDsKKwkJCS8vIFRPRE8gQXR0ZW50aW9uIDogaWwgZmF1ZHJhaXQgcmFqb3V0ZXIgbGVzIGNvbnRyYWludGVzCisJCQkvLyBkJ2ludGVydmFsbGUgcG91ciBsZSB0eXBlIMOpbnVtw6lyw6kKKwkJfQorCQllbHNlIGlmKCBwYXJhbVR5cGVTcGVjaWZpZXItPmlzVHlwZWRNYWNoaW5lKCkgKQorCQl7CisJCQkvLyBUT0RPOj4gQ29uc29saWRhdGlvbiBhcHLDqHMgVEVTVAorCQkJcGFyYW1UeXBlID0gU01UX1RZUEVfSU5UOworCQl9CisJCWVsc2UKKwkJeworCQkJQVZNX09TX0VSUk9SX0FMRVJUIDw8ICJVbmV4cGVjdGVkIGFuIGluc3RhbmNlIHR5cGUgPDwgIgorCQkJCQk8PCBhUGFyYW1ldGVyLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpIDw8ICIgOiAiCisJCQkJCTw8IHBhcmFtVHlwZVNwZWNpZmllci0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCAiPj4gISEhIgorCQkJCQk8PCBTRU5EX0FMRVJUOworCisJCQlwYXJhbVR5cGUgPSBTTVRfVFlQRV9SRUFMOworCQl9CisKKworCQlDVkM0OjpFeHByIHBhcmFtRXhwciA9IG1FeHByTWFuYWdlci5ta1ZhciggT1NTKCkgPDwgIlBfIgorCQkJCTw8IG1UYWJsZU9mUGFyYW1ldGVySW5zdGFuY2Uuc2l6ZSgpLCBwYXJhbVR5cGUgKTsKKworLy9BVk1fSUZfREVCVUdfRkxBRyggU01UX1NPTFZJTkcgKQorLy8JQVZNX09TX1RSQUNFIDw8IFRBQiAgPDwgIlBfIiA8PCBtVGFibGVPZlBhcmFtZXRlckluc3RhbmNlLnNpemUoKQorLy8JCQk8PCAiIDwtICIgPDwgYVBhcmFtZXRlci0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCBzdGQ6OmVuZGw7CisvLwlBVk1fT1NfVFJBQ0UgPDwgc3RkOjpmbHVzaDsKKy8vQVZNX0VORElGX0RFQlVHX0ZMQUcoIFNNVF9TT0xWSU5HICkKKworCQlhUGFyYW1ldGVyLT5zZXRNYXJrKCBtVGFibGVPZlBhcmFtZXRlckluc3RhbmNlLnNpemUoKSApOworCQltVGFibGVPZlBhcmFtZXRlckluc3RhbmNlLmFwcGVuZCggYmZQYXJhbWV0ZXIgKTsKKworCQltVGFibGVPZlBhcmFtZXRlckV4cHIuYXBwZW5kKHBhcmFtRXhwcik7CisvLwkJaWYoIG1fcFRhYmxlT2ZQYXJhbWV0ZXJFeHByICE9IE5VTEwgKQorLy8JCXsKKy8vCQkJbV9wVGFibGVPZlBhcmFtZXRlckV4cHItPmFwcGVuZChwYXJhbUV4cHIpOworLy8JCX0KKwl9CisKKwlyZXR1cm4oIG1UYWJsZU9mUGFyYW1ldGVyRXhwclsgYVBhcmFtZXRlci0+Z2V0TWFyaygpIF0gKTsKKworfQorCisKK0NWQzQ6OkV4cHIgJiBDVkM0U29sdmVyOjpnZXRWYXJpYWJsZUV4cHIoSW5zdGFuY2VPZkRhdGEgKiBhVmFyLAorCQlDVkM0OjpUeXBlIHZhclR5cGUsIGF2bV9vZmZzZXRfdCB2YXJJRCkKK3sKKwlpZiggbVRhYmxlT2ZWYXJpYWJsZUV4cHIuc2l6ZSgpIDw9IHZhcklEICkKKwl7CisJCW1UYWJsZU9mVmFyaWFibGVFeHByLnB1c2hfYmFjaygKKwkJCQltRXhwck1hbmFnZXIubWtWYXIoIE9TUygpIDw8ICJWXyIgPDwgdmFySUQsIHZhclR5cGUgKSApOworCX0KKworCXJldHVybiggbVRhYmxlT2ZWYXJpYWJsZUV4cHIuYXQodmFySUQpICk7Cit9CisKKworCitDVkM0OjpFeHByIENWQzRTb2x2ZXI6OnNhZmVfZnJvbV9iYXNlZm9ybShjb25zdCBCRiAmIGV4cHJGb3JtLAorCQlCYXNlVHlwZVNwZWNpZmllciAqIHR5cGVTcGVjaWZpZXIpCit7CisJdHJ5CisJeworCQlyZXR1cm4oIGZyb21fYmFzZWZvcm0oZXhwckZvcm0sIHR5cGVTcGVjaWZpZXIpICk7CisJfQorCWNhdGNoICggY29uc3QgQ1ZDNDo6RXhjZXB0aW9uICYgZXggKQorCXsKKwkJQVZNX09TX1dBUk4gPDwgc3RkOjplbmRsIDw8IFJFUEVBVCgiKioqKioqKioiLCAxMCkgPDwgc3RkOjplbmRsCisJCQkJPDwgIlx0Q1ZDNFNvbHZlcjo6c2FmZV9mcm9tX2Jhc2Vmb3JtPCBDVkM0OjpFeGNlcHRpb24gOiIKKwkJCQk8PCBTT0xWRVJfU0VTU0lPTl9JRCA8PCAiPlxuXHQiIDw8IGV4IDw8IHN0ZDo6ZW5kbAorCQkJCTw8IFJFUEVBVCgiLS0tLS0tLS0iLCAxMCkgPDwgc3RkOjplbmRsCisJCQkJPDwgIlx0RmFpbGVkIHRvIENPTlZFUlQgc2VwOjpmbWw6OmV4cHJlc3Npb24gdG8gQ1ZDNDo6RXhwcjo+IiA8PCBzdGQ6OmVuZGwKKwkJCQk8PCAiXHQgICIgPDwgZXhwckZvcm0uc3RyKCkgPDwgc3RkOjplbmRsCisJCQkJPDwgUkVQRUFUKCIqKioqKioqKiIsIDEwKSA8PCBzdGQ6OmVuZGw7CisKKwkJZGVzdHJveUNoZWNrZXIoKTsKKworCQlyZXR1cm4oIFNNVF9DU1RfSU5UX1pFUk8gKTsKKwl9CisJY2F0Y2ggKCBjb25zdCBzdGQ6OmV4Y2VwdGlvbiAmIGV4ICkKKwl7CisJCUFWTV9PU19XQVJOIDw8IHN0ZDo6ZW5kbCA8PCBSRVBFQVQoIioqKioqKioqIiwgMTApIDw8IHN0ZDo6ZW5kbAorCQkJCTw8ICJcdENWQzRTb2x2ZXI6OnNhZmVfZnJvbV9iYXNlZm9ybTwgc3RkOjpleGNlcHRpb24gOiIKKwkJCQk8PCBTT0xWRVJfU0VTU0lPTl9JRCA8PCAiPlxuXHQiIDw8IGV4LndoYXQoKSA8PCBzdGQ6OmVuZGwKKwkJCQk8PCBSRVBFQVQoIi0tLS0tLS0tIiwgMTApIDw8IHN0ZDo6ZW5kbAorCQkJCTw8ICJcdEZhaWxlZCB0byBDT05WRVJUIHNlcDo6Zm1sOjpleHByZXNzaW9uIHRvIENWQzQ6OkV4cHI6PiIgPDwgc3RkOjplbmRsCisJCQkJPDwgIlx0ICAiIDw8IGV4cHJGb3JtLnN0cigpIDw8IHN0ZDo6ZW5kbAorCQkJCTw8IFJFUEVBVCgiKioqKioqKioiLCAxMCkgPDwgc3RkOjplbmRsOworCisJCWRlc3Ryb3lDaGVja2VyKCk7CisKKwkJcmV0dXJuKCBTTVRfQ1NUX0lOVF9aRVJPICk7CisJfQorCWNhdGNoICggLi4uICkKKwl7CisJCUFWTV9PU19XQVJOIDw8IHN0ZDo6ZW5kbCA8PCBSRVBFQVQoIioqKioqKioqIiwgMTApIDw8IHN0ZDo6ZW5kbAorCQkJCTw8ICJcdENWQzRTb2x2ZXI6OnNhZmVfZnJvbV9iYXNlZm9ybTwgdW5rbm93bjo6ZXhjZXB0aW9uIDoiCisJCQkJPDwgU09MVkVSX1NFU1NJT05fSUQgPDwgIj4iIDw8IHN0ZDo6ZW5kbAorCQkJCTw8IFJFUEVBVCgiLS0tLS0tLS0iLCAxMCkgPDwgc3RkOjplbmRsCisJCQkJPDwgIlx0RmFpbGVkIHRvIENPTlZFUlQgc2VwOjpmbWw6OmV4cHJlc3Npb24gdG8gQ1ZDNDo6RXhwcjo+IiA8PCBzdGQ6OmVuZGwKKwkJCQk8PCAiXHQgICIgPDwgZXhwckZvcm0uc3RyKCkgPDwgc3RkOjplbmRsCisJCQkJPDwgUkVQRUFUKCIqKioqKioqKiIsIDEwKSA8PCBzdGQ6OmVuZGw7CisKKwkJZGVzdHJveUNoZWNrZXIoKTsKKworCQlyZXR1cm4oIFNNVF9DU1RfSU5UX1pFUk8gKTsKKwl9CisKKwlyZXR1cm4oIFNNVF9DU1RfSU5UX1pFUk8gKTsKK30KKworQ1ZDNDo6RXhwciBDVkM0U29sdmVyOjpmcm9tX2Jhc2Vmb3JtKAorCQljb25zdCBCRiAmIGV4cHJGb3JtLCBCYXNlVHlwZVNwZWNpZmllciAqIHR5cGVTcGVjaWZpZXIpCit7CisJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1NNQVJUX1BPSU5URVJfRVhJVCggZXhwckZvcm0gKSA8PCAiZXhwcmVzc2lvbiAhISEiCisJCQk8PCBTRU5EX0VYSVQ7CisKKwlzd2l0Y2goIGV4cHJGb3JtLmNsYXNzS2luZCgpICkKKwl7CisJCWNhc2UgRk9STV9BVk1DT0RFX0tJTkQ6CisJCXsKKwkJCUF2bUNvZGUgKiBhQ29kZSA9IGV4cHJGb3JtLnRvX3B0cjwgQXZtQ29kZSA+KCk7CisKKwkJCXR5cGVTcGVjaWZpZXIgPSBUeXBlTWFuYWdlcjo6VU5JVkVSU0FMOworCisJCQlzd2l0Y2goIGFDb2RlLT5nZXRBdm1PcENvZGUoKSApCisJCQl7CisJCQkJLy8gQ09NUEFSSVNPTiBPUEVSQVRJT04KKwkJCQljYXNlIEFWTV9PUENPREVfRVE6CisJCQkJeworCQkJCQljb25zdCBCRiAmIGFyZzAgPSBhQ29kZS0+Zmlyc3QoKTsKKwkJCQkJY29uc3QgQkYgJiBhcmcxID0gYUNvZGUtPnNlY29uZCgpOworCisJCQkJCWlmKCBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzQm9vbGVhbihhcmcwKSAmJgorCQkJCQkJCUV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNCb29sZWFuKGFyZzEpICkKKwkJCQkJeworCQkJCQkJcmV0dXJuKCBtRXhwck1hbmFnZXIubWtFeHByKENWQzQ6OmtpbmQ6OkVRVUFMLAorCQkJCQkJCQlmcm9tX2Jhc2Vmb3JtKGFyZzAsIFR5cGVNYW5hZ2VyOjpCT09MRUFOKSwKKwkJCQkJCQkJZnJvbV9iYXNlZm9ybShhcmcxLCBUeXBlTWFuYWdlcjo6Qk9PTEVBTikpICk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlyZXR1cm4oIG1FeHByTWFuYWdlci5ta0V4cHIoQ1ZDNDo6a2luZDo6RVFVQUwsCisJCQkJCQkJCWZyb21fYmFzZWZvcm0oYXJnMCwgdHlwZVNwZWNpZmllciksCisJCQkJCQkJCWZyb21fYmFzZWZvcm0oYXJnMSwgdHlwZVNwZWNpZmllcikpICk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQljYXNlIEFWTV9PUENPREVfTkVROgorCQkJCXsKKwkJCQkJY29uc3QgQkYgJiBhcmcwID0gYUNvZGUtPmZpcnN0KCk7CisJCQkJCWNvbnN0IEJGICYgYXJnMSA9IGFDb2RlLT5zZWNvbmQoKTsKKworCQkJCQlpZiggRXhwcmVzc2lvblR5cGVDaGVja2VyOjppc0Jvb2xlYW4oYXJnMCkgJiYKKwkJCQkJCQlFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzQm9vbGVhbihhcmcxKSApCisJCQkJCXsKKwkJCQkJCXJldHVybiggbUV4cHJNYW5hZ2VyLm1rRXhwcihDVkM0OjpraW5kOjpOT1QsCisJCQkJCQkJCW1FeHByTWFuYWdlci5ta0V4cHIoQ1ZDNDo6a2luZDo6RVFVQUwsCisJCQkJCQkJCQlmcm9tX2Jhc2Vmb3JtKGFyZzAsIFR5cGVNYW5hZ2VyOjpCT09MRUFOKSwKKwkJCQkJCQkJCWZyb21fYmFzZWZvcm0oYXJnMSwgVHlwZU1hbmFnZXI6OkJPT0xFQU4pKSkgKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXJldHVybiggbUV4cHJNYW5hZ2VyLm1rRXhwcihDVkM0OjpraW5kOjpESVNUSU5DVCwKKwkJCQkJCQkJZnJvbV9iYXNlZm9ybShhcmcwLCB0eXBlU3BlY2lmaWVyKSwKKwkJCQkJCQkJZnJvbV9iYXNlZm9ybShhcmcxLCB0eXBlU3BlY2lmaWVyKSkgKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWNhc2UgQVZNX09QQ09ERV9MVDoKKwkJCQl7CisJCQkJCWlmKCBTb2x2ZXJEZWY6OkRFRkFVTFRfU09MVkVSX0tJTkQgPT0KKwkJCQkJCQlTb2x2ZXJEZWY6OlNPTFZFUl9DVkM0X0JWMzJfS0lORCApCisJCQkJCXsKKwkJCQkJCXJldHVybiggbUV4cHJNYW5hZ2VyLm1rRXhwcihDVkM0OjpraW5kOjpCSVRWRUNUT1JfU0xULAorCQkJCQkJCQlmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5maXJzdCgpLCB0eXBlU3BlY2lmaWVyKSwKKwkJCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+c2Vjb25kKCksIHR5cGVTcGVjaWZpZXIpKSApOworCQkJCQl9CisJCQkJCWVsc2UKKy8vCQkJCQkJaWYoIFNvbHZlckRlZjo6REVGQVVMVF9TT0xWRVJfS0lORCA9PQorLy8JCQkJCQkJCVNvbHZlckRlZjo6U09MVkVSX0NWQzRfS0lORCApCisJCQkJCXsKKwkJCQkJCXJldHVybiggbUV4cHJNYW5hZ2VyLm1rRXhwcihDVkM0OjpraW5kOjpMVCwKKwkJCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+Zmlyc3QoKSwgdHlwZVNwZWNpZmllciksCisJCQkJCQkJCWZyb21fYmFzZWZvcm0oYUNvZGUtPnNlY29uZCgpLCB0eXBlU3BlY2lmaWVyKSkgKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWNhc2UgQVZNX09QQ09ERV9MVEU6CisJCQkJeworCQkJCQlpZiggU29sdmVyRGVmOjpERUZBVUxUX1NPTFZFUl9LSU5EID09CisJCQkJCQkJU29sdmVyRGVmOjpTT0xWRVJfQ1ZDNF9CVjMyX0tJTkQgKQorCQkJCQl7CisJCQkJCQlDVkM0OjpFeHByIGxlZnRNZW1iZXI7CisJCQkJCQlDVkM0OjpFeHByIHJpZ2h0TWVtYmVyOworCQkJCQkJQkZWZWN0b3IgcmlnaHRMaXN0OworCQkJCQkJQkZWZWN0b3IgbGVmdExpc3Q7CisKKwkJCQkJCWlmKCBhQ29kZS0+Zmlyc3QoKS5pczwgQXZtQ29kZSA+KCkgJiYKKwkJCQkJCQkoIGFDb2RlLT5maXJzdCgpLnRvX3B0cjwgQXZtQ29kZSA+KCktPgorCQkJCQkJCQkJaXNPcENvZGUoIEFWTV9PUENPREVfUExVUyApICkgKQorCQkJCQkJeworCQkJCQkJCUF2bUNvZGU6Oml0ZXJhdG9yIGl0ID0KKwkJCQkJCQkJCWFDb2RlLT5maXJzdCgpLnRvX3B0cjwgQXZtQ29kZSA+KCktPmJlZ2luKCk7CisJCQkJCQkJQXZtQ29kZTo6aXRlcmF0b3IgZW5kSXQgPQorCQkJCQkJCQkJYUNvZGUtPmZpcnN0KCkudG9fcHRyPCBBdm1Db2RlID4oKS0+ZW5kKCk7CisJCQkJCQkJZm9yKCA7IGl0ICE9IGVuZEl0IDsgKytpdCApCisJCQkJCQkJeworCQkJCQkJCQlpZiggKCppdCkuaXM8IEF2bUNvZGUgPigpICYmCisJCQkJCQkJCQkoICgqaXQpLnRvX3B0cjwgQXZtQ29kZSA+KCktPgorCQkJCQkJCQkJCQlpc09wQ29kZSggQVZNX09QQ09ERV9VTUlOVVMgKSApICkKKwkJCQkJCQkJeworCQkJCQkJCQkJcmlnaHRMaXN0LmFwcGVuZCgKKwkJCQkJCQkJCQkJKCppdCkudG9fcHRyPCBBdm1Db2RlID4oKS0+Z2V0QXJnMSgpICk7CisJCQkJCQkJCX0KKwkJCQkJCQkJZWxzZSBpZiggKCppdCkuaXNJbnRlZ2VyKCkgJiYKKwkJCQkJCQkJCQkoICgqaXQpLnRvSW50ZWdlcigpIDwgMCApICkKKwkJCQkJCQkJeworCQkJCQkJCQkJcmlnaHRMaXN0LmFwcGVuZCggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjoKKwkJCQkJCQkJCQkJbmV3SW50ZWdlcigtICgqaXQpLnRvSW50ZWdlcigpKSApOworCQkJCQkJCQl9CisJCQkJCQkJCWVsc2UKKwkJCQkJCQkJeworCQkJCQkJCQkJbGVmdExpc3QuYXBwZW5kKCAoKml0KSApOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJZWxzZSBpZiggbm90ICggYUNvZGUtPmZpcnN0KCkuaXNJbnRlZ2VyKCkgJiYKKwkJCQkJCQkJCSAoIGFDb2RlLT5maXJzdCgpLnRvSW50ZWdlcigpID09IDAgKSApICkKKwkJCQkJCXsKKwkJCQkJCQlsZWZ0TGlzdC5hcHBlbmQoIGFDb2RlLT5maXJzdCgpICk7CisJCQkJCQl9CisKKwkJCQkJCWlmKCBhQ29kZS0+c2Vjb25kKCkuaXM8IEF2bUNvZGUgPigpICYmCisJCQkJCQkJKCBhQ29kZS0+c2Vjb25kKCkudG9fcHRyPCBBdm1Db2RlID4oKS0+CisJCQkJCQkJCQlpc09wQ29kZSggQVZNX09QQ09ERV9QTFVTICkgKSApCisJCQkJCQl7CisJCQkJCQkJQXZtQ29kZTo6aXRlcmF0b3IgaXQgPQorCQkJCQkJCQkJYUNvZGUtPnNlY29uZCgpLnRvX3B0cjwgQXZtQ29kZSA+KCktPmJlZ2luKCk7CisJCQkJCQkJQXZtQ29kZTo6aXRlcmF0b3IgZW5kSXQgPQorCQkJCQkJCQkJYUNvZGUtPnNlY29uZCgpLnRvX3B0cjwgQXZtQ29kZSA+KCktPmVuZCgpOworCQkJCQkJCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCQkJCQkJCXsKKwkJCQkJCQkJaWYoICgqaXQpLmlzPCBBdm1Db2RlID4oKSAmJgorCQkJCQkJCQkJKCAoKml0KS50b19wdHI8IEF2bUNvZGUgPigpLT4KKwkJCQkJCQkJCQkJaXNPcENvZGUoIEFWTV9PUENPREVfVU1JTlVTICkgKSApCisJCQkJCQkJCXsKKwkJCQkJCQkJCWxlZnRMaXN0LmFwcGVuZCgKKwkJCQkJCQkJCQkJKCppdCkudG9fcHRyPCBBdm1Db2RlID4oKS0+Z2V0QXJnMSgpICk7CisJCQkJCQkJCX0KKwkJCQkJCQkJZWxzZSBpZiggKCppdCkuaXNJbnRlZ2VyKCkgJiYKKwkJCQkJCQkJCQkoICgqaXQpLnRvSW50ZWdlcigpIDwgMCApICkKKwkJCQkJCQkJeworCQkJCQkJCQkJbGVmdExpc3QuYXBwZW5kKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6OgorCQkJCQkJCQkJCQluZXdJbnRlZ2VyKC0gKCppdCkudG9JbnRlZ2VyKCkpICk7CisJCQkJCQkJCX0KKwkJCQkJCQkJZWxzZQorCQkJCQkJCQl7CisJCQkJCQkJCQlyaWdodExpc3QuYXBwZW5kKCAoKml0KSApOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJZWxzZSBpZiggbm90ICggYUNvZGUtPnNlY29uZCgpLmlzSW50ZWdlcigpICYmCisJCQkJCQkJCQkgKCBhQ29kZS0+c2Vjb25kKCkudG9JbnRlZ2VyKCkgPT0gMCApICkgKQorCQkJCQkJeworCQkJCQkJCXJpZ2h0TGlzdC5hcHBlbmQoIGFDb2RlLT5zZWNvbmQoKSApOworCQkJCQkJfQorCisJCQkJCQlpZiggbGVmdExpc3QuZW1wdHkoKSApCisJCQkJCQl7CisJCQkJCQkJbGVmdE1lbWJlciA9IGZyb21fYmFzZWZvcm0oCisJCQkJCQkJCQlFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfWkVSTywKKwkJCQkJCQkJCXR5cGVTcGVjaWZpZXIpOworCQkJCQkJfQorCQkJCQkJZWxzZSBpZiggbGVmdExpc3Quc2luZ2xldG9uKCkgKQorCQkJCQkJeworCQkJCQkJCWxlZnRNZW1iZXIgPSBmcm9tX2Jhc2Vmb3JtKGxlZnRMaXN0WzBdLCB0eXBlU3BlY2lmaWVyKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQkvLyBsZWZ0TWVtYmVyID0gQlZQTFVTIGRlcyBlbGVtZW50cyBkZSBsZWZ0TGlzdAorCQkJCQkJCWxlZnRNZW1iZXIgPSBmcm9tX2Jhc2Vmb3JtKCBsZWZ0TGlzdFswXSwgdHlwZVNwZWNpZmllciApOworCQkJCQkJCWZvciAoc3RkOjpzaXplX3QgaSA9IDEgOyBpIDwgbGVmdExpc3Quc2l6ZSgpIDsgaSArKykKKwkJCQkJCQl7CisJCQkJCQkJCWxlZnRNZW1iZXIgPSAgbUV4cHJNYW5hZ2VyLm1rRXhwcigKKwkJCQkJCQkJCQlDVkM0OjpraW5kOjpCSVRWRUNUT1JfUExVUywgbGVmdE1lbWJlciwKKwkJCQkJCQkJCQlmcm9tX2Jhc2Vmb3JtKGxlZnRMaXN0W2ldLCB0eXBlU3BlY2lmaWVyKSk7CisJCQkJCQkJfQorCQkJCQkJfQorCisJCQkJCQlpZiggcmlnaHRMaXN0LmVtcHR5KCkgKQorCQkJCQkJeworCQkJCQkJCXJpZ2h0TWVtYmVyID0gZnJvbV9iYXNlZm9ybSgKKwkJCQkJCQkJCUV4cHJlc3Npb25Db25zdGFudDo6SU5URUdFUl9aRVJPLAorCQkJCQkJCQkJdHlwZVNwZWNpZmllcik7CisJCQkJCQl9CisJCQkJCQllbHNlIGlmKCByaWdodExpc3Quc2luZ2xldG9uKCkgKQorCQkJCQkJeworCQkJCQkJCXJpZ2h0TWVtYmVyID0gZnJvbV9iYXNlZm9ybShyaWdodExpc3RbMF0sIHR5cGVTcGVjaWZpZXIpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCS8vIHJpZ2h0TWVtYmVyID0gQlZQTFVTIGRlcyBlbGVtZW50cyBkZSByaWdodExpc3QKKwkJCQkJCQlyaWdodE1lbWJlciA9IGZyb21fYmFzZWZvcm0oIHJpZ2h0TGlzdFswXSwgdHlwZVNwZWNpZmllciApOworCQkJCQkJCWZvciAoc3RkOjpzaXplX3QgaSA9IDEgOyBpIDwgcmlnaHRMaXN0LnNpemUoKSA7IGkgKyspCisJCQkJCQkJeworCQkJCQkJCQlyaWdodE1lbWJlciA9ICBtRXhwck1hbmFnZXIubWtFeHByKAorCQkJCQkJCQkJCUNWQzQ6OmtpbmQ6OkJJVFZFQ1RPUl9QTFVTLCByaWdodE1lbWJlciwKKwkJCQkJCQkJCQlmcm9tX2Jhc2Vmb3JtKHJpZ2h0TGlzdFtpXSwgdHlwZVNwZWNpZmllcikpOworCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQkJcmV0dXJuKCBtRXhwck1hbmFnZXIubWtFeHByKENWQzQ6OmtpbmQ6OkJJVFZFQ1RPUl9TTEUsCisJCQkJCQkJCWxlZnRNZW1iZXIsIHJpZ2h0TWVtYmVyKSApOworCQkJCQl9CisJCQkJCWVsc2UKKy8vCQkJCQkJaWYoIFNvbHZlckRlZjo6REVGQVVMVF9TT0xWRVJfS0lORCA9PQorLy8JCQkJCQkJCVNvbHZlckRlZjo6U09MVkVSX0NWQzRfS0lORCApCisJCQkJCXsKKwkJCQkJCXJldHVybiggbUV4cHJNYW5hZ2VyLm1rRXhwcihDVkM0OjpraW5kOjpMRVEsCisJCQkJCQkJCWZyb21fYmFzZWZvcm0oYUNvZGUtPmZpcnN0KCksIHR5cGVTcGVjaWZpZXIpLAorCQkJCQkJCQlmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5zZWNvbmQoKSwgdHlwZVNwZWNpZmllcikpICk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQljYXNlIEFWTV9PUENPREVfR1Q6CisJCQkJeworCQkJCQlpZiggU29sdmVyRGVmOjpERUZBVUxUX1NPTFZFUl9LSU5EID09CisJCQkJCQkJU29sdmVyRGVmOjpTT0xWRVJfQ1ZDNF9CVjMyX0tJTkQgKQorCQkJCQl7CisJCQkJCQlyZXR1cm4oIG1FeHByTWFuYWdlci5ta0V4cHIoQ1ZDNDo6a2luZDo6QklUVkVDVE9SX1NHVCwKKwkJCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+Zmlyc3QoKSwgdHlwZVNwZWNpZmllciksCisJCQkJCQkJCWZyb21fYmFzZWZvcm0oYUNvZGUtPnNlY29uZCgpLCB0eXBlU3BlY2lmaWVyKSkgKTsKKwkJCQkJfQorCQkJCQllbHNlCisvLwkJCQkJCWlmKCBTb2x2ZXJEZWY6OkRFRkFVTFRfU09MVkVSX0tJTkQgPT0KKy8vCQkJCQkJCQlTb2x2ZXJEZWY6OlNPTFZFUl9DVkM0X0tJTkQgKQorCQkJCQl7CisJCQkJCQlyZXR1cm4oIG1FeHByTWFuYWdlci5ta0V4cHIoQ1ZDNDo6a2luZDo6R1QsCisJCQkJCQkJCWZyb21fYmFzZWZvcm0oYUNvZGUtPmZpcnN0KCksIHR5cGVTcGVjaWZpZXIpLAorCQkJCQkJCQlmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5zZWNvbmQoKSwgdHlwZVNwZWNpZmllcikpICk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQljYXNlIEFWTV9PUENPREVfR1RFOgorCQkJCXsKKwkJCQkJaWYoIFNvbHZlckRlZjo6REVGQVVMVF9TT0xWRVJfS0lORCA9PQorCQkJCQkJCVNvbHZlckRlZjo6U09MVkVSX0NWQzRfQlYzMl9LSU5EICkKKwkJCQkJeworCQkJCQkJcmV0dXJuKCBtRXhwck1hbmFnZXIubWtFeHByKENWQzQ6OmtpbmQ6OkJJVFZFQ1RPUl9TR0UsCisJCQkJCQkJCWZyb21fYmFzZWZvcm0oYUNvZGUtPmZpcnN0KCksIHR5cGVTcGVjaWZpZXIpLAorCQkJCQkJCQlmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5zZWNvbmQoKSwgdHlwZVNwZWNpZmllcikpICk7CisJCQkJCX0KKwkJCQkJZWxzZQorLy8JCQkJCQlpZiggU29sdmVyRGVmOjpERUZBVUxUX1NPTFZFUl9LSU5EID09CisvLwkJCQkJCQkJU29sdmVyRGVmOjpTT0xWRVJfQ1ZDNF9LSU5EICkKKwkJCQkJeworCQkJCQkJcmV0dXJuKCBtRXhwck1hbmFnZXIubWtFeHByKENWQzQ6OmtpbmQ6OkdFUSwKKwkJCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+Zmlyc3QoKSwgdHlwZVNwZWNpZmllciksCisJCQkJCQkJCWZyb21fYmFzZWZvcm0oYUNvZGUtPnNlY29uZCgpLCB0eXBlU3BlY2lmaWVyKSkgKTsKKwkJCQkJfQorCQkJCX0KKworCisJCQkJY2FzZSBBVk1fT1BDT0RFX0NPTlRBSU5TOgorCQkJCXsKKwkJCQkJQnVpbHRpbkNvbGxlY3Rpb24gKiBhQ29sbGVjdGlvbiA9CisJCQkJCQkJYUNvZGUtPmZpcnN0KCkudG9fcHRyPCBCdWlsdGluQ29sbGVjdGlvbiA+KCk7CisKKwkJCQkJaWYoIGFDb2xsZWN0aW9uLT5zaW5nbGV0b24oKSApCisJCQkJCXsKKwkJCQkJCWNvbnN0IEJGICYgY29sID0gYUNvbGxlY3Rpb24tPmF0KDApOworCQkJCQkJY29uc3QgQkYgJiBlbHQgPSBhQ29kZS0+c2Vjb25kKCk7CisKKwkJCQkJCWlmKCBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzQm9vbGVhbihjb2wpICYmCisJCQkJCQkJCUV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNCb29sZWFuKGVsdCkgKQorCQkJCQkJeworCQkJCQkJCXJldHVybiggbUV4cHJNYW5hZ2VyLm1rRXhwcihDVkM0OjpraW5kOjpFUVVBTCwKKwkJCQkJCQkJCWZyb21fYmFzZWZvcm0oY29sLCBUeXBlTWFuYWdlcjo6Qk9PTEVBTiksCisJCQkJCQkJCQlmcm9tX2Jhc2Vmb3JtKGVsdCwgVHlwZU1hbmFnZXI6OkJPT0xFQU4pKSApOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCXJldHVybiggbUV4cHJNYW5hZ2VyLm1rRXhwcihDVkM0OjpraW5kOjpFUVVBTCwKKwkJCQkJCQkJCWZyb21fYmFzZWZvcm0oY29sLCB0eXBlU3BlY2lmaWVyKSwKKwkJCQkJCQkJCWZyb21fYmFzZWZvcm0oZWx0LCB0eXBlU3BlY2lmaWVyKSkgKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlIGlmKCBhQ29sbGVjdGlvbi0+cG9wdWxhdGVkKCkgKQorCQkJCQl7CisJCQkJCQlBUkdTIGFyZyggYUNvbGxlY3Rpb24tPnNpemUoKSApOworCQkJCQkJY29uc3QgQkYgJiBlbHQgPSBhQ29kZS0+c2Vjb25kKCk7CisJCQkJCQlib29sIGlzQm9vbEVsdCA9IEV4cHJlc3Npb25UeXBlQ2hlY2tlcjo6aXNCb29sZWFuKGVsdCk7CisKKwkJCQkJCWZvciggc3RkOjpzaXplX3Qgb2Zmc2V0ID0gMCA7IGFyZy5oYXNOZXh0KCkgOyArK29mZnNldCApCisJCQkJCQl7CisJCQkJCQkJY29uc3QgQkYgJiBjb2wgPSBhQ29sbGVjdGlvbi0+YXQoIG9mZnNldCApOworCisJCQkJCQkJaWYoIGlzQm9vbEVsdCAmJiBFeHByZXNzaW9uVHlwZUNoZWNrZXI6OmlzQm9vbGVhbihjb2wpICkKKwkJCQkJCQl7CisJCQkJCQkJCWFyZy5uZXh0KCBtRXhwck1hbmFnZXIubWtFeHByKENWQzQ6OmtpbmQ6OkVRVUFMLAorCQkJCQkJCQkJCWZyb21fYmFzZWZvcm0oY29sLCBUeXBlTWFuYWdlcjo6Qk9PTEVBTiksCisJCQkJCQkJCQkJZnJvbV9iYXNlZm9ybShlbHQsIFR5cGVNYW5hZ2VyOjpCT09MRUFOKSApKTsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZQorCQkJCQkJCXsKKwkJCQkJCQkJYXJnLm5leHQoIG1FeHByTWFuYWdlci5ta0V4cHIoQ1ZDNDo6a2luZDo6RVFVQUwsCisJCQkJCQkJCQkJZnJvbV9iYXNlZm9ybShjb2wsIHR5cGVTcGVjaWZpZXIpLAorCQkJCQkJCQkJCWZyb21fYmFzZWZvcm0oZWx0LCB0eXBlU3BlY2lmaWVyKSApKTsKKwkJCQkJCQl9CisJCQkJCQl9CisKKwkJCQkJCXJldHVybiggbUV4cHJNYW5hZ2VyLm1rRXhwcihDVkM0OjpraW5kOjpPUiwgYXJnLT50YWJsZSkgKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXJldHVybiggKCh0eXBlU3BlY2lmaWVyICE9IE5VTEwpICYmCisJCQkJCQkJCXR5cGVTcGVjaWZpZXItPmlzVHlwZWRCb29sZWFuKCkpID8KKwkJCQkJCQkJCQlTTVRfQ1NUX0JPT0xfRkFMU0UgOiBTTVRfQ1NUX0lOVF9aRVJPICk7CisJCQkJCX0KKwkJCQl9CisKKworCQkJCS8vIExPR0lDQUwgT1BFUkFUSU9OCisJCQkJY2FzZSBBVk1fT1BDT0RFX05PVDoKKwkJCQl7CisJCQkJCXJldHVybiggbUV4cHJNYW5hZ2VyLm1rRXhwcihDVkM0OjpraW5kOjpOT1QsCisJCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+Zmlyc3QoKSwgVHlwZU1hbmFnZXI6OkJPT0xFQU4pKSApOworCQkJCX0KKworCQkJCWNhc2UgQVZNX09QQ09ERV9BTkQ6CisJCQkJeworCQkJCQlBUkdTIGFyZyggYUNvZGUtPnNpemUoKSApOworCisJCQkJCUF2bUNvZGU6Oml0ZXJhdG9yIGl0ID0gYUNvZGUtPmJlZ2luKCk7CisJCQkJCWZvciggOyBhcmcuaGFzTmV4dCgpIDsgKytpdCApCisJCQkJCXsKKwkJCQkJCWFyZy5uZXh0KCBmcm9tX2Jhc2Vmb3JtKCppdCwgVHlwZU1hbmFnZXI6OkJPT0xFQU4pICk7CisJCQkJCX0KKworCQkJCQlyZXR1cm4oIG1FeHByTWFuYWdlci5ta0V4cHIoQ1ZDNDo6a2luZDo6QU5ELCBhcmctPnRhYmxlKSApOworCQkJCX0KKworCQkJCWNhc2UgQVZNX09QQ09ERV9OQU5EOgorCQkJCXsKKwkJCQkJcmV0dXJuKCBtRXhwck1hbmFnZXIubWtFeHByKENWQzQ6OmtpbmQ6Ok5PVCwKKwkJCQkJCQltRXhwck1hbmFnZXIubWtFeHByKENWQzQ6OmtpbmQ6OkFORCwKKwkJCQkJCQkJCWZyb21fYmFzZWZvcm0oYUNvZGUtPmZpcnN0KCksCisJCQkJCQkJCQkJCVR5cGVNYW5hZ2VyOjpCT09MRUFOKSwKKwkJCQkJCQkJCWZyb21fYmFzZWZvcm0oYUNvZGUtPnNlY29uZCgpLAorCQkJCQkJCQkJCQlUeXBlTWFuYWdlcjo6Qk9PTEVBTikpKSApOworCQkJCX0KKworCQkJCWNhc2UgQVZNX09QQ09ERV9YQU5EOgorCQkJCXsKKwkJCQkJcmV0dXJuKCBtRXhwck1hbmFnZXIubWtFeHByKENWQzQ6OmtpbmQ6Ok9SLAorCQkJCQkJCW1FeHByTWFuYWdlci5ta0V4cHIoQ1ZDNDo6a2luZDo6QU5ELAorCQkJCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+Zmlyc3QoKSwKKwkJCQkJCQkJCQkJVHlwZU1hbmFnZXI6OkJPT0xFQU4pLAorCQkJCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+c2Vjb25kKCksCisJCQkJCQkJCQkJCVR5cGVNYW5hZ2VyOjpCT09MRUFOKSksCisJCQkJCQkJbUV4cHJNYW5hZ2VyLm1rRXhwcihDVkM0OjpraW5kOjpBTkQsCisJCQkJCQkJCQltRXhwck1hbmFnZXIubWtFeHByKENWQzQ6OmtpbmQ6Ok5PVCwKKwkJCQkJCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+Zmlyc3QoKSwKKwkJCQkJCQkJCQkJCQlUeXBlTWFuYWdlcjo6Qk9PTEVBTikpLAorCQkJCQkJCQkJbUV4cHJNYW5hZ2VyLm1rRXhwcihDVkM0OjpraW5kOjpOT1QsCisJCQkJCQkJCQkJCWZyb21fYmFzZWZvcm0oYUNvZGUtPnNlY29uZCgpLAorCQkJCQkJCQkJCQkJCVR5cGVNYW5hZ2VyOjpCT09MRUFOKSkpICkgKTsKKwkJCQl9CisKKworCQkJCWNhc2UgQVZNX09QQ09ERV9PUjoKKwkJCQl7CisJCQkJCUFSR1MgYXJnKCBhQ29kZS0+c2l6ZSgpICk7CisKKwkJCQkJQXZtQ29kZTo6aXRlcmF0b3IgaXQgPSBhQ29kZS0+YmVnaW4oKTsKKwkJCQkJZm9yKCA7IGFyZy5oYXNOZXh0KCkgOyArK2l0ICkKKwkJCQkJeworCQkJCQkJYXJnLm5leHQoIGZyb21fYmFzZWZvcm0oKml0LCBUeXBlTWFuYWdlcjo6Qk9PTEVBTikgKTsKKwkJCQkJfQorCisJCQkJCXJldHVybiggbUV4cHJNYW5hZ2VyLm1rRXhwcihDVkM0OjpraW5kOjpPUiwgYXJnLT50YWJsZSkgKTsKKwkJCQl9CisKKwkJCQljYXNlIEFWTV9PUENPREVfTk9SOgorCQkJCXsKKwkJCQkJcmV0dXJuKCBtRXhwck1hbmFnZXIubWtFeHByKENWQzQ6OmtpbmQ6Ok5PVCwKKwkJCQkJCQltRXhwck1hbmFnZXIubWtFeHByKENWQzQ6OmtpbmQ6Ok9SLAorCQkJCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+Zmlyc3QoKSwKKwkJCQkJCQkJCQkJVHlwZU1hbmFnZXI6OkJPT0xFQU4pLAorCQkJCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+c2Vjb25kKCksCisJCQkJCQkJCQkJCVR5cGVNYW5hZ2VyOjpCT09MRUFOKSkpICk7CisJCQkJfQorCisKKwkJCQkvLyBCSVRXSVNFIE9QRVJBVElPTgorCQkJCWNhc2UgQVZNX09QQ09ERV9CQU5EOgorCQkJCXsKKwkJCQkJcmV0dXJuKCBtRXhwck1hbmFnZXIubWtFeHByKENWQzQ6OmtpbmQ6OkJJVFZFQ1RPUl9BTkQsCisJCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+Zmlyc3QoKSwgdHlwZVNwZWNpZmllciksCisJCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+c2Vjb25kKCksIHR5cGVTcGVjaWZpZXIpKSApOworCQkJCX0KKworCQkJCWNhc2UgQVZNX09QQ09ERV9CT1I6CisJCQkJeworCQkJCQlyZXR1cm4oIG1FeHByTWFuYWdlci5ta0V4cHIoQ1ZDNDo6a2luZDo6QklUVkVDVE9SX09SLAorCQkJCQkJCWZyb21fYmFzZWZvcm0oYUNvZGUtPmZpcnN0KCksIHR5cGVTcGVjaWZpZXIpLAorCQkJCQkJCWZyb21fYmFzZWZvcm0oYUNvZGUtPnNlY29uZCgpLCB0eXBlU3BlY2lmaWVyKSkgKTsKKwkJCQl9CisKKwkJCQljYXNlIEFWTV9PUENPREVfTFNISUZUOgorCQkJCXsKKwkJCQkJaWYoIGFDb2RlLT5zZWNvbmQoKS5pc0ludGVnZXIoKSApCisJCQkJCXsKKwkJCQkJCXJldHVybiggbUV4cHJNYW5hZ2VyLm1rRXhwcihDVkM0OjpraW5kOjpCSVRWRUNUT1JfU0hMLAorCQkJCQkJCQlmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5maXJzdCgpLCB0eXBlU3BlY2lmaWVyKSwKKwkJCQkJCQkJbUV4cHJNYW5hZ2VyLm1rQ29uc3QoIENWQzQ6OlJhdGlvbmFsKAorCQkJCQkJCQkJCXN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgaW50PigKKwkJCQkJCQkJCQkJYUNvZGUtPnNlY29uZCgpLnRvSW50ZWdlcigpKSkgKSApICk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJCQk8PCAiVW5leHBlY3RlZCBzZWNvbmQgYXJndW1lbnQgZm9yICIKKwkJCQkJCQkJCSJuZXdGaXhlZExlZnRTaGlmdEV4cHIgISEhXG4iCisJCQkJCQkJCTw8IGFDb2RlLT50b1N0cmluZyggQVZNX1RBQjFfSU5ERU5UICkKKwkJCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKworCQkJCWNhc2UgQVZNX09QQ09ERV9SU0hJRlQ6CisJCQkJeworCQkJCQlpZiggYUNvZGUtPnNlY29uZCgpLmlzSW50ZWdlcigpICkKKwkJCQkJeworCQkJCQkJcmV0dXJuKCBtRXhwck1hbmFnZXIubWtFeHByKENWQzQ6OmtpbmQ6OkJJVFZFQ1RPUl9BU0hSLAorCQkJCQkJCQlmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5maXJzdCgpLCB0eXBlU3BlY2lmaWVyKSwKKwkJCQkJCQkJbUV4cHJNYW5hZ2VyLm1rQ29uc3QoIENWQzQ6OlJhdGlvbmFsKAorCQkJCQkJCQkJCXN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgaW50PigKKwkJCQkJCQkJCQkJYUNvZGUtPnNlY29uZCgpLnRvSW50ZWdlcigpKSkgKSApICk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJCQk8PCAiVW5leHBlY3RlZCBzZWNvbmQgYXJndW1lbnQgZm9yICIKKwkJCQkJCQkJCSJuZXdGaXhlZFJpZ2h0U2hpZnRFeHByICEhIVxuIgorCQkJCQkJCQk8PCBhQ29kZS0+dG9TdHJpbmcoIEFWTV9UQUIxX0lOREVOVCApCisJCQkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisKKwkJCQljYXNlIEFWTV9PUENPREVfWE9SOgorCQkJCXsKKwkJCQkJcmV0dXJuKCBtRXhwck1hbmFnZXIubWtFeHByKENWQzQ6OmtpbmQ6Ok9SLAorCQkJCQkJCW1FeHByTWFuYWdlci5ta0V4cHIoQ1ZDNDo6a2luZDo6QU5ELAorCQkJCQkJCQlmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5maXJzdCgpLCB0eXBlU3BlY2lmaWVyKSwKKwkJCQkJCQkJbUV4cHJNYW5hZ2VyLm1rRXhwcihDVkM0OjpraW5kOjpOT1QsCisJCQkJCQkJCQlmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5zZWNvbmQoKSwgdHlwZVNwZWNpZmllcikpKSwKKwkJCQkJCQltRXhwck1hbmFnZXIubWtFeHByKENWQzQ6OmtpbmQ6OkFORCwKKwkJCQkJCQkJbUV4cHJNYW5hZ2VyLm1rRXhwcihDVkM0OjpraW5kOjpOT1QsCisJCQkJCQkJCQlmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5maXJzdCgpLCB0eXBlU3BlY2lmaWVyKSksCisJCQkJCQkJCWZyb21fYmFzZWZvcm0oYUNvZGUtPnNlY29uZCgpLCB0eXBlU3BlY2lmaWVyKSkgKSApOworCQkJCX0KKworCQkJCWNhc2UgQVZNX09QQ09ERV9YTk9SOgorCQkJCXsKKwkJCQkJcmV0dXJuKCBtRXhwck1hbmFnZXIubWtFeHByKENWQzQ6OmtpbmQ6Ok9SLAorCQkJCQkJCW1FeHByTWFuYWdlci5ta0V4cHIoQ1ZDNDo6a2luZDo6QU5ELAorCQkJCQkJCQlmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5maXJzdCgpLCB0eXBlU3BlY2lmaWVyKSwKKwkJCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+c2Vjb25kKCksIHR5cGVTcGVjaWZpZXIpKSwKKwkJCQkJCQltRXhwck1hbmFnZXIubWtFeHByKENWQzQ6OmtpbmQ6OkFORCwKKwkJCQkJCQkJbUV4cHJNYW5hZ2VyLm1rRXhwcihDVkM0OjpraW5kOjpOT1QsCisJCQkJCQkJCQlmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5maXJzdCgpLCB0eXBlU3BlY2lmaWVyKSksCisJCQkJCQkJCW1FeHByTWFuYWdlci5ta0V4cHIoQ1ZDNDo6a2luZDo6Tk9ULAorCQkJCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+c2Vjb25kKCksIHR5cGVTcGVjaWZpZXIpKSkgKSApOworCQkJCX0KKworCisJCQkJLy8gQVJJVEhNRVRJQyBPUEVSQVRJT04KKwkJCQljYXNlIEFWTV9PUENPREVfUExVUzoKKwkJCQl7CisJCQkJCUFSR1MgYXJnKCBhQ29kZS0+c2l6ZSgpICk7CisKKwkJCQkJQXZtQ29kZTo6aXRlcmF0b3IgaXQgPSBhQ29kZS0+YmVnaW4oKTsKKwkJCQkJZm9yKCA7IGFyZy5oYXNOZXh0KCkgOyArK2l0ICkKKwkJCQkJeworCQkJCQkJYXJnLm5leHQoIGZyb21fYmFzZWZvcm0oKml0LCB0eXBlU3BlY2lmaWVyKSApOworCQkJCQl9CisKKwkJCQkJaWYoIFNvbHZlckRlZjo6REVGQVVMVF9TT0xWRVJfS0lORCA9PQorCQkJCQkJCVNvbHZlckRlZjo6U09MVkVSX0NWQzRfQlYzMl9LSU5EICkKKwkJCQkJeworCQkJCQkJcmV0dXJuKCBtRXhwck1hbmFnZXIubWtFeHByKAorCQkJCQkJCQlDVkM0OjpraW5kOjpCSVRWRUNUT1JfUExVUywgYXJnLT50YWJsZSkgKTsKKwkJCQkJfQorCQkJCQllbHNlCisvLwkJCQkJCWlmKCBTb2x2ZXJEZWY6OkRFRkFVTFRfU09MVkVSX0tJTkQgPT0KKy8vCQkJCQkJCQlTb2x2ZXJEZWY6OlNPTFZFUl9DVkM0X0tJTkQgKQorCQkJCQl7CisJCQkJCQlyZXR1cm4oIG1FeHByTWFuYWdlci5ta0V4cHIoCisJCQkJCQkJCUNWQzQ6OmtpbmQ6OlBMVVMsIGFyZy0+dGFibGUpICk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQljYXNlIEFWTV9PUENPREVfVU1JTlVTOgorCQkJCXsKKwkJCQkJcmV0dXJuKCBtRXhwck1hbmFnZXIubWtFeHByKENWQzQ6OmtpbmQ6OlVNSU5VUywKKwkJCQkJCQlmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5maXJzdCgpLCB0eXBlU3BlY2lmaWVyKSkgKTsKKwkJCQl9CisKKwkJCQljYXNlIEFWTV9PUENPREVfTUlOVVM6CisJCQkJeworCQkJCQlpZiggU29sdmVyRGVmOjpERUZBVUxUX1NPTFZFUl9LSU5EID09CisJCQkJCQkJU29sdmVyRGVmOjpTT0xWRVJfQ1ZDNF9CVjMyX0tJTkQgKQorCQkJCQl7CisJCQkJCQlyZXR1cm4oIG1FeHByTWFuYWdlci5ta0V4cHIoQ1ZDNDo6a2luZDo6QklUVkVDVE9SX1NVQiwKKwkJCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+Zmlyc3QoKSwgdHlwZVNwZWNpZmllciksCisJCQkJCQkJCWZyb21fYmFzZWZvcm0oYUNvZGUtPnNlY29uZCgpLCB0eXBlU3BlY2lmaWVyKSkgKTsKKwkJCQkJfQorCQkJCQllbHNlCisvLwkJCQkJCWlmKCBTb2x2ZXJEZWY6OkRFRkFVTFRfU09MVkVSX0tJTkQgPT0KKy8vCQkJCQkJCQlTb2x2ZXJEZWY6OlNPTFZFUl9DVkM0X0tJTkQgKQorCQkJCQl7CisJCQkJCQlyZXR1cm4oIG1FeHByTWFuYWdlci5ta0V4cHIoQ1ZDNDo6a2luZDo6TUlOVVMsCisJCQkJCQkJCWZyb21fYmFzZWZvcm0oYUNvZGUtPmZpcnN0KCksIHR5cGVTcGVjaWZpZXIpLAorCQkJCQkJCQlmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5zZWNvbmQoKSwgdHlwZVNwZWNpZmllcikpICk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQljYXNlIEFWTV9PUENPREVfTVVMVDoKKwkJCQl7CisJCQkJCUFSR1MgYXJnKCBhQ29kZS0+c2l6ZSgpICk7CisKKwkJCQkJQXZtQ29kZTo6aXRlcmF0b3IgaXQgPSBhQ29kZS0+YmVnaW4oKTsKKwkJCQkJZm9yKCA7IGFyZy5oYXNOZXh0KCkgOyArK2l0ICkKKwkJCQkJeworCQkJCQkJYXJnLm5leHQoIGZyb21fYmFzZWZvcm0oKml0LCB0eXBlU3BlY2lmaWVyKSApOworCQkJCQl9CisKKwkJCQkJaWYoIFNvbHZlckRlZjo6REVGQVVMVF9TT0xWRVJfS0lORCA9PQorCQkJCQkJCVNvbHZlckRlZjo6U09MVkVSX0NWQzRfQlYzMl9LSU5EICkKKwkJCQkJeworCQkJCQkJcmV0dXJuKCBtRXhwck1hbmFnZXIubWtFeHByKAorCQkJCQkJCQkJQ1ZDNDo6a2luZDo6QklUVkVDVE9SX01VTFQsIGFyZy0+dGFibGUpICk7CisJCQkJCX0KKwkJCQkJZWxzZQorLy8JCQkJCQlpZiggU29sdmVyRGVmOjpERUZBVUxUX1NPTFZFUl9LSU5EID09CisvLwkJCQkJCQkJU29sdmVyRGVmOjpTT0xWRVJfQ1ZDNF9LSU5EICkKKwkJCQkJeworCQkJCQkJcmV0dXJuKCBtRXhwck1hbmFnZXIubWtFeHByKAorCQkJCQkJCQlDVkM0OjpraW5kOjpNVUxULCBhcmctPnRhYmxlKSApOworCQkJCQl9CisJCQkJfQorCisJCQkJY2FzZSBBVk1fT1BDT0RFX0RJVjoKKwkJCQl7CisJCQkJCXJldHVybiggbUV4cHJNYW5hZ2VyLm1rRXhwcihDVkM0OjpraW5kOjpESVZJU0lPTiwKKwkJCQkJCQlmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5maXJzdCgpLCB0eXBlU3BlY2lmaWVyKSwKKwkJCQkJCQlmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5zZWNvbmQoKSwgdHlwZVNwZWNpZmllcikpICk7CisJCQkJfQorCisJCQkJY2FzZSBBVk1fT1BDT0RFX1BPVzoKKwkJCQl7CisJCQkJCXJldHVybiggbUV4cHJNYW5hZ2VyLm1rRXhwcihDVkM0OjpraW5kOjpQT1csCisJCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+Zmlyc3QoKSwgdHlwZVNwZWNpZmllciksCisJCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+c2Vjb25kKCksIHR5cGVTcGVjaWZpZXIpKSApOworCQkJCX0KKworLy8JCQkJY2FzZSBBVk1fT1BDT0RFX01PRDoKKworCQkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJCTw8ICJDVkM0U29sdmVyOjpmcm9tX2Jhc2Vmb3JtOj4gIgorCQkJCQkJCQkiVW5zdXBwb3J0ZWQgZXhwcmVzc2lvbiAhISFcbiIKKwkJCQkJCQk8PCBhQ29kZS0+dG9TdHJpbmcoIEFWTV9UQUIxX0lOREVOVCApCisJCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEZPUk1fSU5TVEFOQ0VfREFUQV9LSU5EOgorCQl7CisJCQlyZXR1cm4oIGdldFBhcmFtZXRlckV4cHIoIGV4cHJGb3JtICkgKTsKKwkJfQorCisJCWNhc2UgRk9STV9CVUlMVElOX0JPT0xFQU5fS0lORDoKKwkJeworCQkJaWYoIGV4cHJGb3JtLnRvX3B0cjwgQm9vbGVhbiA+KCktPmdldFZhbHVlKCkgKQorCQkJeworCQkJCXJldHVybiggKCh0eXBlU3BlY2lmaWVyICE9IE5VTEwpICYmCisJCQkJCQl0eXBlU3BlY2lmaWVyLT5pc1R5cGVkQm9vbGVhbigpKSA/CisJCQkJCQkJCVNNVF9DU1RfQk9PTF9UUlVFIDogU01UX0NTVF9JTlRfT05FICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuKCAoKHR5cGVTcGVjaWZpZXIgIT0gTlVMTCkgJiYKKwkJCQkJCXR5cGVTcGVjaWZpZXItPmlzVHlwZWRCb29sZWFuKCkpID8KKwkJCQkJCQkJU01UX0NTVF9CT09MX0ZBTFNFIDogU01UX0NTVF9JTlRfWkVSTyApOworCQkJfQorCQl9CisKKworCQljYXNlIEZPUk1fQlVJTFRJTl9JTlRFR0VSX0tJTkQ6CisJCXsKKwkJCWlmKCBTb2x2ZXJEZWY6OkRFRkFVTFRfU09MVkVSX0tJTkQgPT0KKwkJCQkJU29sdmVyRGVmOjpTT0xWRVJfQ1ZDNF9CVjMyX0tJTkQgKQorCQkJeworCQkJCXJldHVybiggbUV4cHJNYW5hZ2VyLm1rQ29uc3QoIENWQzQ6OkJpdFZlY3RvciggMzIsCisJCQkJCQlzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGludD4oCisJCQkJCQkJCWV4cHJGb3JtLnRvX3B0cjwgSW50ZWdlciA+KCktPnRvSW50ZWdlcigpKSkgKSApOworCQkJfQorCQkJZWxzZQorLy8JCQkJaWYoIFNvbHZlckRlZjo6REVGQVVMVF9TT0xWRVJfS0lORCA9PSBTb2x2ZXJEZWY6OlNPTFZFUl9DVkM0X0tJTkQgKQorCQkJeworCQkJCWlmKCAodHlwZVNwZWNpZmllciAhPSBOVUxMKSAmJgorCQkJCQkJdHlwZVNwZWNpZmllci0+aXNUeXBlZEJvb2xlYW4oKSApCisJCQkJeworCQkJCQlyZXR1cm4oIGV4cHJGb3JtLnRvX3B0cjwgSW50ZWdlciA+KCktPmlzWmVybygpID8KKwkJCQkJCQlTTVRfQ1NUX0JPT0xfRkFMU0UgOiBTTVRfQ1NUX0JPT0xfVFJVRSApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworI2lmIGRlZmluZWQoIF9BVk1fQlVJTFRJTl9OVU1FUklDX0dNUF8gKQorCisJCQkJCXJldHVybiggbUV4cHJNYW5hZ2VyLm1rQ29uc3QoIENWQzQ6OlJhdGlvbmFsKCBDVkM0OjpJbnRlZ2VyKAorCQkJCQkJCWV4cHJGb3JtLnRvX3B0cjwgSW50ZWdlciA+KCktPmdldFZhbHVlKCkgKSApICkgKTsKKworI2Vsc2UKKworCQkJCQlyZXR1cm4oIG1FeHByTWFuYWdlci5ta0NvbnN0KCBDVkM0OjpSYXRpb25hbCgKKwkJCQkJCQlleHByRm9ybS50b19wdHI8IEludGVnZXIgPigpLT5zdHIoKSkgKSApOworCisjZW5kaWYgLyogX0FWTV9CVUlMVElOX05VTUVSSUNfR01QXyAqLworCQkJCX0KKwkJCX0KKy8vCQkJZWxzZQorLy8JCQl7CisvLwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisvLwkJCQkJPDwgIlNvbHZlckRlZjo6REVGQVVMVF9TT0xWRVJfS0lORCA8PiAiCisvLwkJCQkJCSJDVkM0X0lOVCBhbmQgPD4gQ1ZDNF9CVjMyICEhIVxuIgorLy8JCQkJCTw8IFNFTkRfRVhJVDsKKy8vCisvLwkJCQlyZXR1cm4oIG1FeHByTWFuYWdlci5ta0NvbnN0KCBDVkM0OjpSYXRpb25hbCgKKy8vCQkJCQkJZXhwckZvcm0udG9fcHRyPCBJbnRlZ2VyID4oKS0+Z2V0VmFsdWUoKSApICkgKTsKKy8vCQkJfQorCQl9CisKKwkJY2FzZSBGT1JNX0JVSUxUSU5fUkFUSU9OQUxfS0lORDoKKwkJeworCQkJaWYoICh0eXBlU3BlY2lmaWVyICE9IE5VTEwpICYmIHR5cGVTcGVjaWZpZXItPmlzVHlwZWRCb29sZWFuKCkgKQorCQkJeworCQkJCXJldHVybiggZXhwckZvcm0udG9fcHRyPCBSYXRpb25hbCA+KCktPmlzWmVybygpID8KKwkJCQkJCVNNVF9DU1RfQk9PTF9GQUxTRSA6IFNNVF9DU1RfQk9PTF9UUlVFICk7CisJCQl9CisJCQllbHNlCisJCQl7CisjaWYgZGVmaW5lZCggX0FWTV9CVUlMVElOX05VTUVSSUNfR01QXyApCisKKwkJCQlyZXR1cm4oIG1FeHByTWFuYWdlci5ta0NvbnN0KCBDVkM0OjpSYXRpb25hbCgKKwkJCQkJCWV4cHJGb3JtLnRvX3B0cjwgUmF0aW9uYWwgPigpLT5nZXRWYWx1ZSgpICkgKSApOworCisjZWxzZQorCisJCQkJcmV0dXJuKCBtRXhwck1hbmFnZXIubWtDb25zdCggQ1ZDNDo6UmF0aW9uYWwoCisJCQkJCQlleHByRm9ybS50b19wdHI8IFJhdGlvbmFsID4oKS0+c3RyKCkgKSApICk7CisKKy8vCQkJCXJldHVybiggbUV4cHJNYW5hZ2VyLm1rQ29uc3QoIENWQzQ6OlJhdGlvbmFsKAorLy8JCQkJCQlleHByRm9ybS50b19wdHI8IFJhdGlvbmFsID4oKS0+Z2V0TnVtZXJhdG9yKCksCisvLwkJCQkJCWV4cHJGb3JtLnRvX3B0cjwgUmF0aW9uYWwgPigpLT5nZXREZW5vbWluYXRvcigpKSApICk7CisvLworLy8JCQkJcmV0dXJuKCBtRXhwck1hbmFnZXIubWtDb25zdCggQ1ZDNDo6UmF0aW9uYWwoCisvLwkJCQkJCWV4cHJGb3JtLnRvX3B0cjwgUmF0aW9uYWwgPigpLT5zdHJOdW1lcmF0b3IoKSwKKy8vCQkJCQkJZXhwckZvcm0udG9fcHRyPCBSYXRpb25hbCA+KCktPnN0ckRlbm9taW5hdG9yKCkpICkgKTsKKworI2VuZGlmIC8qIF9BVk1fQlVJTFRJTl9OVU1FUklDX0dNUF8gICovCisJCQl9CisJCX0KKworCQljYXNlIEZPUk1fQlVJTFRJTl9GTE9BVF9LSU5EOgorCQl7CisJCQlpZiggKHR5cGVTcGVjaWZpZXIgIT0gTlVMTCkgJiYgdHlwZVNwZWNpZmllci0+aXNUeXBlZEJvb2xlYW4oKSApCisJCQl7CisJCQkJcmV0dXJuKCBleHByRm9ybS50b19wdHI8IEZsb2F0ID4oKS0+aXNaZXJvKCkgPworCQkJCQkJU01UX0NTVF9CT09MX0ZBTFNFIDogU01UX0NTVF9CT09MX1RSVUUgICk7CisJCQl9CisJCQllbHNlCisJCQl7CisjaWYgZGVmaW5lZCggX0FWTV9CVUlMVElOX05VTUVSSUNfR01QXyApCisKKwkJCQlyZXR1cm4oIG1FeHByTWFuYWdlci5ta0NvbnN0KCBDVkM0OjpSYXRpb25hbCggbXBxX2NsYXNzKAorCQkJCQkJZXhwckZvcm0udG9fcHRyPCBGbG9hdCA+KCktPmdldFZhbHVlKCkgKSApICkgKTsKKworI2Vsc2UKKworCQkJCXJldHVybiggbUV4cHJNYW5hZ2VyLm1rQ29uc3QoCisJCQkJCQlDVkM0OjpSYXRpb25hbChleHByRm9ybS5zdHIoKSkgKSApOworCisjZW5kaWYgLyogX0FWTV9CVUlMVElOX05VTUVSSUNfR01QXyAqLworCQkJfQorCQl9CisKKworCQljYXNlIEZPUk1fUlVOVElNRV9JRF9LSU5EOgorCQl7CisJCQlyZXR1cm4oIG1FeHByTWFuYWdlci5ta0NvbnN0KAorCQkJCQlDVkM0OjpSYXRpb25hbCggZXhwckZvcm0uYmZSSUQoKS5nZXRSaWQoKSApICkgKTsKKwkJfQorCisKKwkJY2FzZSBGT1JNX0JVSUxUSU5fQ0hBUkFDVEVSX0tJTkQ6CisJCXsKKwkJCUFWTV9PU19FUlJPUl9BTEVSVCA8PCAiVW5leHBlY3RlZCBhIENIQVIgYXMgZXhwcmVzc2lvbiA8PCAiCisJCQkJCTw8IGV4cHJGb3JtLnRvX3B0cjwgQ2hhcmFjdGVyID4oKS0+Z2V0VmFsdWUoKQorCQkJCQk8PCAiID4+ICEhISIKKwkJCQkJPDwgU0VORF9BTEVSVDsKKworCQkJcmV0dXJuKCBtRXhwck1hbmFnZXIubWtDb25zdCggQ1ZDNDo6UmF0aW9uYWwoCisJCQkJCWV4cHJGb3JtLnRvX3B0cjwgQ2hhcmFjdGVyID4oKS0+Z2V0VmFsdWUoKSApICkgKTsKKwkJfQorCisJCWNhc2UgRk9STV9CVUlMVElOX1NUUklOR19LSU5EOgorCQl7CisJCQlyZXR1cm4oIG1FeHByTWFuYWdlci5ta0NvbnN0KCBDVkM0OjpTdHJpbmcoCisJCQkJCWV4cHJGb3JtLnRvX3B0cjwgU3RyaW5nID4oKS0+Z2V0VmFsdWUoKSApICkgKTsKKwkJfQorCisJCWNhc2UgRk9STV9CVUlMVElOX1FVQUxJRklFRF9JREVOVElGSUVSX0tJTkQ6CisJCXsKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCTw8ICJVbmV4cGVjdGVkIGEgU1RSSU5HIHwgVUZJIGFzIGV4cHJlc3Npb24gPDwgIgorCQkJCQk8PCBleHByRm9ybS50b19wdHI8IFN0cmluZyA+KCktPmdldFZhbHVlKCkgPDwgIiA+PiAhISEiCisJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJYnJlYWs7CisvLwkJCXJldHVybiggbUV4cHJNYW5hZ2VyLm1rQ29uc3QoCisvLwkJCQkJZXhwckZvcm0udG9fcHRyPCBTdHJpbmcgPigpLT5nZXRWYWx1ZSgpICkgKTsKKwkJfQorCisJCWNhc2UgRk9STV9CVUlMVElOX0lERU5USUZJRVJfS0lORDoKKwkJeworCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJPDwgIlVuZXhwZWN0ZWQgYSBJREVOVElGSUVSIGFzIGV4cHJlc3Npb24gPDwgIgorCQkJCQk8PCBleHByRm9ybS50b19wdHI8IElkZW50aWZpZXIgPigpLT5nZXRWYWx1ZSgpCisJCQkJCTw8ICIgPj4gISEhIgorCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCWJyZWFrOworLy8JCQlyZXR1cm4oIG1FeHByTWFuYWdlci5ta0NvbnN0KAorLy8JCQkJCWV4cHJGb3JtLnRvX3B0cjwgSWRlbnRpZmllciA+KCktPmdldFZhbHVlKCkgKSApOworCQl9CisKKwkJY2FzZSBGT1JNX09QRVJBVE9SX0tJTkQ6CisJCXsKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCTw8ICJVbmV4cGVjdGVkIGFuIE9QRVJBVE9SIGFzIGV4cHJlc3Npb24gPDwgIgorCQkJCQk8PCBleHByRm9ybS50b19wdHI8IE9wZXJhdG9yID4oKS0+c3RhbmRhcmRTeW1ib2woKQorCQkJCQk8PCAiID4+ICEhISIKKwkJCQkJPDwgU0VORF9FWElUOworCisJCQlicmVhazsKKy8vCQkJcmV0dXJuKCBtRXhwck1hbmFnZXIubWtDb25zdCgKKy8vCQkJCQlleHByRm9ybS50b19wdHI8IE9wZXJhdG9yID4oKS0+c3RhbmRhcmRTeW1ib2woKSApICk7CisJCX0KKworCisJCWNhc2UgRk9STV9JTlNUQU5DRV9CVUZGRVJfS0lORDoKKwkJY2FzZSBGT1JNX0lOU1RBTkNFX0NPTk5FQ1RPUl9LSU5EOgorCQljYXNlIEZPUk1fSU5TVEFOQ0VfTUFDSElORV9LSU5EOgorCQljYXNlIEZPUk1fSU5TVEFOQ0VfUE9SVF9LSU5EOgorCisJCWRlZmF1bHQ6CisJCXsKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCTw8ICJVbmV4cGVjdGVkIEJBU0VGT1JNIEtJTkQgYXMgZXhwcmVzc2lvbiA8PCAiCisJCQkJCTw8IGV4cHJGb3JtLnN0cigpIDw8ICIgPj4gISEhIgorCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCWJyZWFrOworLy8JCQlyZXR1cm4oIG1FeHByTWFuYWdlci5ta0NvbnN0KAorLy8JCQkJCWV4cHJGb3JtLnRvX3B0cjwgQmFzZUluc3RhbmNlRm9ybSA+KCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgKSApOworCQl9CisJfQorCisJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCTw8ICJDVkM0U29sdmVyOjpmcm9tX2Jhc2Vmb3JtIEVSUk9SICEhISIKKwkJCTw8IFNFTkRfRVhJVDsKKworCXJldHVybiggU01UX0NTVF9JTlRfWkVSTyApOworfQorCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworCisKKyNlbmRpZiAvKiBfQVZNX1NPTFZFUl9DVkM0XyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc29sdmVyL0NWQzRTb2x2ZXIuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3NvbHZlci9DVkM0U29sdmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU0NTU5OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3NvbHZlci9DVkM0U29sdmVyLmgKQEAgLTAsMCArMSwxNjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxNSBub3YuIDIwMTIKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBTT0xWRVJfQ1ZDNF9IXworI2RlZmluZSBTT0xWRVJfQ1ZDNF9IXworCisjaW5jbHVkZSA8c29sdmVyL2FwaS9Tb2x2ZXJEZWYuaD4KKy8qCisgKiBIZXJlIGJlY2F1c2UgIlNvbHZlckRlZi5oIiBjb3VsZCBkZWZpbmUgdGhpcyBtYWNybworICovCisjaWYgZGVmaW5lZCggX0FWTV9TT0xWRVJfQ1ZDNF8gKQorCisKKyNpbmNsdWRlIDxzb2x2ZXIvYXBpL1NtdFNvbHZlci5oPgorCisjaW5jbHVkZSA8Y3ZjNC9leHByL2V4cHIuaD4KKyNpbmNsdWRlIDxjdmM0L2V4cHIvZXhwcl9tYW5hZ2VyLmg+CisjaW5jbHVkZSA8Y3ZjNC9leHByL3R5cGUuaD4KKyNpbmNsdWRlIDxjdmM0L3NtdC9zbXRfZW5naW5lLmg+CisKKyNpbmNsdWRlIDxjb21tb24vQkYuaD4KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vVHlwZWRlZi5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZkRhdGEuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworY2xhc3MgV09iamVjdDsKKworY2xhc3MgRXhlY3V0aW9uQ29udGV4dDsKK2NsYXNzIEV4ZWN1dGlvbkRhdGE7CisKK2NsYXNzIFR5cGVTcGVjaWZpZXI7CisKKworY2xhc3MgQ1ZDNFNvbHZlciA6CisJCXB1YmxpYyBTbXRTb2x2ZXI8IENWQzQ6OkV4cHIgLCBDVkM0OjpUeXBlICwgQ1ZDNDo6RXhwciAsIGZhbHNlICwgdHJ1ZSA+CisKK3sKKworCUFWTV9ERUNMQVJFX1VOQ0xPTkFCTEVfQ0xBU1MoQ1ZDNFNvbHZlcikKKworcHVibGljOgorCS8qCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIElECisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCXN0YXRpYyBzdGQ6OnN0cmluZyBJRDsKKworCXN0YXRpYyBzdGQ6OnN0cmluZyBERVNDUklQVElPTjsKKworCXN0YXRpYyBhdm1fdWludDY0X3QgU09MVkVSX1NFU1NJT05fSUQ7CisKKwlzdGF0aWMgCUNWQzQ6OkV4cHIgQ1ZDNF9FWFBSX05VTEw7CisJc3RhdGljIAlDVkM0OjpUeXBlIENWQzRfVFlQRV9OVUxMOworCisKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKiovCisJc3RkOjpzdHJpbmcgbVBhcmFtUHJlZml4OworCisJQ1ZDNDo6RXhwck1hbmFnZXIgbUV4cHJNYW5hZ2VyOworCUNWQzQ6OlNtdEVuZ2luZSBtU210RW5naW5lOworCisKK3B1YmxpYzoKKwkvKioKKwkqIENPTlNUUlVDVE9SCisJKiBEZWZhdWx0CisJKi8KKwlDVkM0U29sdmVyKGJvb2wgcHJvZHVjZV9tb2RlbHNfZmxhZyA9IGZhbHNlKTsKKworCS8qKgorCSogREVTVFJVQ1RPUgorCSovCisJdmlydHVhbCB+Q1ZDNFNvbHZlcigpOworCisJLyoqCisJICogQ09ORklHVVJFCisJICovCisJdmlydHVhbCBib29sIGNvbmZpZ3VyZSgKKwkJCUNvbmZpZ3VyYXRpb24gJiBhQ29uZmlndXJhdGlvbiwgV09iamVjdCAqIHdmRmlsdGVyT2JqZWN0LAorCQkJTGlzdE9mUGFpck1hY2hpbmVEYXRhICYgbGlzdE9mU2VsZWN0ZWRWYXJpYWJsZSk7CisKKworCS8qKgorCSAqIFBST1ZFUgorCSAqLworCXZpcnR1YWwgYm9vbCBpc1N1YlNldCgKKwkJCWNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBuZXdFQywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIG9sZEVDKTsKKworCXZpcnR1YWwgYm9vbCBpc0VxdWFsU2V0KAorCQkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIG5ld0VDLCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgb2xkRUMpOworCisJdmlydHVhbCBTb2x2ZXJEZWY6OlNBVElTRklBQklMSVRZX1JJTkcgaXNTYXRpc2ZpYWJsZShjb25zdCBCRiAmIGFDb25kaXRpb24pOworCisKKwkvKioKKwkgKiBTT0xWRVIKKwkgKi8KKwl2aXJ0dWFsIGJvb2wgc29sdmVJbXBsKGNvbnN0IEJGICYgYUNvbmRpdGlvbiwKKwkJCUJGVmVjdG9yICYgZGF0YVZlY3RvciwgQkZWZWN0b3IgJiB2YWx1ZXNWZWN0b3IpOworCisKKwkvKioKKwkgKiBDUkVBVEUgLSBERVNUUk9ZCisJICogVmFsaWRpdHlDaGVja2VyCisJICovCisJYm9vbCBjcmVhdGVDaGVja2VyKCk7CisJYm9vbCBkZXN0cm95Q2hlY2tlcigpOworCWJvb2wgcmVzZXRUYWJsZSgpOworCisJLyoqCisJICogVE9PTFMKKwkgKi8KKwl2b2lkIGVkVG9FeHByKGNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBuZXdFRCwgQ1ZDNDo6RXhwciAmIG5ld0Zvcm11bGEsCisJCQljb25zdCBFeGVjdXRpb25EYXRhICYgb2xkRUQsIENWQzQ6OkV4cHIgJiBvbGRGb3JtdWxhKTsKKworCXZvaWQgZWRUb0V4cHJXaXRoVmFyRXF1YWxpdHkoY29uc3QgRXhlY3V0aW9uRGF0YSAmIG5ld0VELAorCQkJQ1ZDNDo6RXhwciAmIG5ld0Zvcm11bGEsIGNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBvbGRFRCwKKwkJCUNWQzQ6OkV4cHIgJiBvbGRGb3JtdWxhLCBDVkM0OjpFeHByICYgZXF1Rm9ybXVsYSk7CisKKwlDVkM0OjpFeHByICBlZFRvRXhwcihjb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCk7CisKKwlDVkM0OjpFeHByIHNhZmVfZnJvbV9iYXNlZm9ybShjb25zdCBCRiAmIGV4cHJGb3JtLAorCQkJQmFzZVR5cGVTcGVjaWZpZXIgKiB0eXBlU3BlY2lmaWVyID0gTlVMTCk7CisKKwlDVkM0OjpFeHByIGZyb21fYmFzZWZvcm0oY29uc3QgQkYgJiBleHByRm9ybSwKKwkJCUJhc2VUeXBlU3BlY2lmaWVyICogdHlwZVNwZWNpZmllciA9IE5VTEwpOworCisJQ1ZDNDo6RXhwciAmIGdldFBhcmFtZXRlckV4cHIoY29uc3QgQkYgJiBhUGFyYW1ldGVyKTsKKwlDVkM0OjpFeHByICYgZ2V0VmFyaWFibGVFeHByKEluc3RhbmNlT2ZEYXRhICogYVZhciwKKwkJCUNWQzQ6OlR5cGUgdmFyVHlwZSwgYXZtX29mZnNldF90IHZhcklEKTsKKworfTsKKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qIF9BVk1fU09MVkVSX0NWQzRfICovCisKKworI2VuZGlmIC8qIFNPTFZFUl9DVkM0X0hfICovCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3NvbHZlci9PbWVnYVNvbHZlci5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9zb2x2ZXIvT21lZ2FTb2x2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZDI1MDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9zb2x2ZXIvT21lZ2FTb2x2ZXIuY3BwCkBAIC0wLDAgKzEsMTM4MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiT21lZ2FTb2x2ZXIuaCIKKworLyoKKyAqIEhlcmUgYmVjYXVzZSAiU29sdmVyRGVmLmgiIGNvdWxkIGRlZmluZSB0aGlzIG1hY3JvCisgKi8KKyNpZiBkZWZpbmVkKCBfQVZNX1NPTFZFUl9PTUVHQV8gKQorCisKKyNpbmNsdWRlIDxjb21tb24vQkYuaD4KKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVGb3JtLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZkRhdGEuaD4KKworI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0F2bUNvZGUuaD4KKyNpbmNsdWRlIDxmbWwvYnVpbHRpbi9Cb29sZWFuLmg+CisjaW5jbHVkZSA8Zm1sL2J1aWx0aW4vQ2hhcmFjdGVyLmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvblNpbXBsaWZpZXIuaD4KKyNpbmNsdWRlIDxmbWwvbnVtZXJpYy9GbG9hdC5oPgorI2luY2x1ZGUgPGZtbC9udW1lcmljL0ludGVnZXIuaD4KKyNpbmNsdWRlIDxmbWwvbnVtZXJpYy9SYXRpb25hbC5oPgorCisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yLmg+CisKKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25Db250ZXh0Lmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uRGF0YS5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL1J1bnRpbWVGb3JtLmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvUnVudGltZUlELmg+CisKKyNpbmNsdWRlIDxmbWwvd29ya2Zsb3cvUXVlcnkuaD4KKyNpbmNsdWRlIDxmbWwvd29ya2Zsb3cvV09iamVjdC5oPgorCisjaW5jbHVkZSA8c2V3L0NvbmZpZ3VyYXRpb24uaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitzdGQ6OnN0cmluZyBPbWVnYVNvbHZlcjo6SUQgPSAiT01FR0EiOworCitzdGQ6OnN0cmluZyBPbWVnYVNvbHZlcjo6REVTQ1JJUFRJT04gPSAiT01FR0EgJ1NvbHZlciBvZiBxdWFudGlmaWVyLWZyZWUgIgorCQkicHJvYmxlbXMgaW4gUHJlc2J1cmdlciBBcml0aG1ldGljIGF0IENTLlVNRC5FRFUsIHZlcnNpb24gMi4xJyI7CisKK2F2bV91aW50NjRfdCBPbWVnYVNvbHZlcjo6U09MVkVSX1NFU1NJT05fSUQgPSAwOworCisKKworLyoqCisgKiBDT05GSUdVUkUKKyAqLworYm9vbCBPbWVnYVNvbHZlcjo6Y29uZmlndXJlKAorCQlDb25maWd1cmF0aW9uICYgYUNvbmZpZ3VyYXRpb24sIFdPYmplY3QgKiB3ZkZpbHRlck9iamVjdCwKKwkJTGlzdE9mUGFpck1hY2hpbmVEYXRhICYgbGlzdE9mU2VsZWN0ZWRWYXJpYWJsZSkKK3sKKwlpc0NvbmZpZ3VyZUZsYWcgPSB0cnVlOworCisJaWYoIG5vdCBTYXRTb2x2ZXI6OmNvbmZpZ3VyZSgKKwkJYUNvbmZpZ3VyYXRpb24sIHdmRmlsdGVyT2JqZWN0LCBsaXN0T2ZTZWxlY3RlZFZhcmlhYmxlKSApCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJc2V0U2VsZWN0ZWRWYXJpYWJsZSgKKwkJCWFDb25maWd1cmF0aW9uLmdldE1haW5FeGVjdXRpb25EYXRhKCksCisJCQlsaXN0T2ZTZWxlY3RlZFZhcmlhYmxlICk7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvKioKKyAqIFJFU0VUIFZBUklBQkxFIG9yIFBBUkFNRVRFUgorICovCit2b2lkIE9tZWdhU29sdmVyOjpyZXNldFZhcmlhYmxlVGFibGUoKQoreworCWdldFNlbGVjdGVkVmFyaWFibGUoKS5jbGVhcigpOworCisJLy8gQXR0ZW50aW9uIE9tZWdhIGNvbXB0ZSBkZSAxIMOgIG4KKwltVGFibGVPZlZhcmlhYmxlSW5zdGFuY2UuY2xlYXIoKTsKKwltVGFibGVPZlZhcmlhYmxlSW5zdGFuY2UuYXBwZW5kKCBOVUxMICk7CisKKwltVGFibGVPZlZhcjRQYXJhbUluc3RhbmNlLmNsZWFyKCk7Cit9CisKKwordm9pZCBPbWVnYVNvbHZlcjo6cmVzZXRQYXJhbWV0ZXJUYWJsZSgpCit7CisJLy8gSW5pdGlhbGlzYXRpb24gZHUgdGFibGVhdSBkZXMgcGFyYW1ldHJlcworCW1UYWJsZU9mVmFyaWFibGVJRC5jbGVhcigpOworCisJVmVjdG9yT2ZJbnN0YW5jZU9mRGF0YTo6aXRlcmF0b3IgaXQgPSBtVGFibGVPZlBhcmFtZXRlckluc3RhbmNlLmJlZ2luKCk7CisJVmVjdG9yT2ZJbnN0YW5jZU9mRGF0YTo6aXRlcmF0b3IgaXRFbmQgPSBtVGFibGVPZlBhcmFtZXRlckluc3RhbmNlLmVuZCgpOworCWZvciggOyBpdCAhPSBpdEVuZCA7ICsraXQgKQorCXsKKwkJKCppdCktPnNldE1hcmsoMCk7CisJfQorCW1UYWJsZU9mUGFyYW1ldGVySW5zdGFuY2UuY2xlYXIoKTsKKworCS8vIEF0dGVudGlvbjogT21lZ2EgY29tcHRlIGRlIDEgw6AgbgorCW1UYWJsZU9mUGFyYW1ldGVySUQuY2xlYXIoKTsKKwlvbWVnYTo6VmFyaWFibGVfSUQgc2VudGluZWxJRDsKKwltVGFibGVPZlBhcmFtZXRlcklELnB1c2hfYmFjayhzZW50aW5lbElEKTsKK30KKworCisvKioKKyAqIFNFVCBWQVJJQUJMRSBvciBQQVJBTUVURVIKKyAqLwordm9pZCBPbWVnYVNvbHZlcjo6c2V0U2VsZWN0ZWRWYXJpYWJsZShjb25zdCBFeGVjdXRpb25EYXRhICYgYW5FRCkKK3sKKwlyZXNldFZhcmlhYmxlVGFibGUoKTsKKworCVRhYmxlT2ZJbnN0YW5jZU9mRGF0YTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGl0RGF0YTsKKwlUYWJsZU9mSW5zdGFuY2VPZkRhdGE6OmNvbnN0X3Jhd19pdGVyYXRvciBlbmREYXRhOworCisJVGFibGVPZlJ1bnRpbWVUOjpjb25zdF9pdGVyYXRvciBpdFJGID0gYW5FRC5nZXRUYWJsZU9mUnVudGltZSgpLmJlZ2luKCk7CisJVGFibGVPZlJ1bnRpbWVUOjpjb25zdF9pdGVyYXRvciBlbmRSRiA9IGFuRUQuZ2V0VGFibGVPZlJ1bnRpbWUoKS5lbmQoKTsKKwlmb3IoIFJ1bnRpbWVJRCBpdFJJRCA7IGl0UkYgIT0gZW5kUkYgOyArK2l0UkYgKQorCXsKKwkJaXRSSUQgPSAoKml0UkYpLT5nZXRSSUQoKTsKKworCQlpZiggaXRSSUQuZ2V0RXhlY3V0YWJsZSgpLT5oYXNEYXRhKCkgfHwKKwkJCWl0UklELmdldEV4ZWN1dGFibGUoKS0+aGFzQnVmZmVyKCkgKQorCQl7CisJCQlQYWlyTWFjaGluZURhdGEgdG1wTGlzdE9mT2Zmc2V0KCBpdFJJRCApOworCisJCQlpdERhdGEgPSBpdFJJRC5nZXRFeGVjdXRhYmxlKCktPmdldEJhc2ljRGF0YSgpLmJlZ2luKCk7CisJCQllbmREYXRhID0gaXRSSUQuZ2V0RXhlY3V0YWJsZSgpLT5nZXRCYXNpY0RhdGEoKS5lbmQoKTsKKwkJCWZvciggOyBpdERhdGEgIT0gZW5kRGF0YSA7ICsraXREYXRhICkKKwkJCXsKKwkJCQl0bXBMaXN0T2ZPZmZzZXQuc2Vjb25kKCkuYXBwZW5kKCAoaXREYXRhKSApOworCisJCQkJbVRhYmxlT2ZWYXJpYWJsZUluc3RhbmNlLmFwcGVuZCggKGl0RGF0YSkgKTsKKworLy9BVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU01UX1NPTFZJTkcgKQorLy8JQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiT21lZ2EgUmVsYXRpb24gdmFyaWFibGUgOiAiCisvLwkJCTw8IHN0cl9oZWFkZXIoICppdERhdGEgKSA8PCBzdGQ6OmVuZGw7CisvL0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTTVRfU09MVklORyApCisJCQl9CisKKwkJCWlmKCB0bXBMaXN0T2ZPZmZzZXQuc2Vjb25kKCkubm9uZW1wdHkoKSApCisJCQl7CisJCQkJZ2V0U2VsZWN0ZWRWYXJpYWJsZSgpLmFwcGVuZCh0bXBMaXN0T2ZPZmZzZXQpOworCQkJfQorCQl9CisJfQorfQorCisKK3ZvaWQgT21lZ2FTb2x2ZXI6OnNldFNlbGVjdGVkVmFyaWFibGUoY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQsCisJCUxpc3RPZlBhaXJNYWNoaW5lRGF0YSAmIGxpc3RPZlNlbGVjdGVkVmFyaWFibGUpCit7CisJcmVzZXRWYXJpYWJsZVRhYmxlKCk7CisKKwlTYXRTb2x2ZXI6OnNldFNlbGVjdGVkVmFyaWFibGUobGlzdE9mU2VsZWN0ZWRWYXJpYWJsZSk7CisKKwlMaXN0T2ZQYWlyTWFjaGluZURhdGE6Oml0ZXJhdG9yIGl0UGFpck1hY2hpbmVEYXRhID0gbGlzdE9mU2VsZWN0ZWRWYXJpYWJsZS5iZWdpbigpOworCUxpc3RPZlBhaXJNYWNoaW5lRGF0YTo6aXRlcmF0b3IgZW5kUGFpck1hY2hpbmVEYXRhID0gbGlzdE9mU2VsZWN0ZWRWYXJpYWJsZS5lbmQoKTsKKwlmb3IoIDsgaXRQYWlyTWFjaGluZURhdGEgIT0gZW5kUGFpck1hY2hpbmVEYXRhIDsgKytpdFBhaXJNYWNoaW5lRGF0YSApCisJeworCQlpZiggKCppdFBhaXJNYWNoaW5lRGF0YSkuc2Vjb25kKCkubm9uZW1wdHkoKSApCisJCXsKKwkJCUxpc3RPZkluc3RhbmNlT2ZEYXRhOjppdGVyYXRvciBpdFZhciA9ICgqaXRQYWlyTWFjaGluZURhdGEpLnNlY29uZCgpLmJlZ2luKCk7CisJCQlMaXN0T2ZJbnN0YW5jZU9mRGF0YTo6aXRlcmF0b3IgZW5kVmFyID0gKCppdFBhaXJNYWNoaW5lRGF0YSkuc2Vjb25kKCkuZW5kKCk7CisKKwkJCWZvciggOyBpdFZhciAhPSBlbmRWYXIgOyArK2l0VmFyICkKKwkJCXsKKwkJCQltVGFibGVPZlZhcmlhYmxlSW5zdGFuY2UuYXBwZW5kKCAqaXRWYXIgKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBTTVRfU09MVklORyApCisJQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiT21lZ2EgUmVsYXRpb24gdmFyaWFibGUgOiAiCisJCQk8PCBzdHJfaGVhZGVyKCAqaXRWYXIgKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFNNVF9TT0xWSU5HICkKKwkJCX0KKwkJfQorCX0KK30KKworCit2b2lkIE9tZWdhU29sdmVyOjpzZXRTZWxlY3RlZFZhcmlhYmxlKGNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhbkVELAorCQlMaXN0T2ZJbnN0YW5jZU9mRGF0YSAmIGFMaXNPZkFkZGl0aW9ubmFsVmFyKQoreworCXNldFNlbGVjdGVkVmFyaWFibGUoYW5FRCk7CisKKwltVGFibGVPZlZhcjRQYXJhbUluc3RhbmNlLmFwcGVuZChhTGlzT2ZBZGRpdGlvbm5hbFZhcik7Cit9CisKKworCisvKioKKyAqIFBST1ZFUgorICovCitib29sIE9tZWdhU29sdmVyOjppc1N1YlNldCgKKwkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIG5ld0VDLCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgb2xkRUMpCit7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU01UX1NPTFZJTkcgKQorCW9sZEVDLnRyYWNlRGVmYXVsdChBVk1fT1NfVFJBQ0UgPDwgVEFCKTsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTTVRfU09MVklORyApCisJLy8gQ3JlYXRpb24gZGUgbGEgcmVsYXRpb24gT21lZ2EKKwkvLyBBdHRlbnRpb246IE9tZWdhIGNvbXB0ZSBkZSAxIMOgIG4KKwlvbWVnYTo6UmVsYXRpb24gb2xkUmVsYXRpb24oIG1UYWJsZU9mVmFyaWFibGVJbnN0YW5jZS5zaXplKCkgLSAxICk7CisJdG9SZWxhdGlvbihvbGRFQy5yZWZFeGVjdXRpb25EYXRhKCksIG9sZFJlbGF0aW9uKTsKKworCisJaWYoICgoJiBuZXdFQykgIT0gbUNhY2hlRm9yTmV3RUMpIHx8IGlzQ3VycmVudFBhdGhTY29wZSgpICkKKwl7CisJCW1DYWNoZUZvck5ld0VDID0gKCYgbmV3RUMpOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU01UX1NPTFZJTkcgKQorCQluZXdFQy50cmFjZURlZmF1bHQoQVZNX09TX1RSQUNFIDw8IFRBQik7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU01UX1NPTFZJTkcgKQorCQkvLyBDcmVhdGlvbiBkZSBsYSByZWxhdGlvbiBPbWVnYQorCQkvLyBBdHRlbnRpb246IE9tZWdhIGNvbXB0ZSBkZSAxIMOgIG4KKwkJb21lZ2E6OlJlbGF0aW9uIG5ld1JlbGF0aW9uKCBtVGFibGVPZlZhcmlhYmxlSW5zdGFuY2Uuc2l6ZSgpIC0gMSApOworCQl0b1JlbGF0aW9uKG5ld0VDLnJlZkV4ZWN1dGlvbkRhdGEoKSwgbmV3UmVsYXRpb24pOworCisJCW1DYWNoZUZvck5ld1JlbGF0aW9uID0gbmV3UmVsYXRpb247CisKKworCQlyZXR1cm4oIGlzU3ViU2V0KG5ld1JlbGF0aW9uLCBvbGRSZWxhdGlvbikgKTsKKwl9CisJZWxzZQorCXsKKwkJb21lZ2E6OlJlbGF0aW9uIG5ld1JlbGF0aW9uID0gbUNhY2hlRm9yTmV3UmVsYXRpb247CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgU01UX1NPTFZJTkcgKQorCQlBVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICJFRCBjcHkgOiAiCisJCQkJPDwgbmV3UmVsYXRpb24ucHJpbnRfd2l0aF9zdWJzX3RvX3N0cmluZygpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgU01UX1NPTFZJTkcgKQorCisJCXJldHVybiggaXNTdWJTZXQobmV3UmVsYXRpb24sIG9sZFJlbGF0aW9uKSApOworCX0KK30KKworCitib29sIE9tZWdhU29sdmVyOjppc0VxdWFsU2V0KAorCQljb25zdCBFeGVjdXRpb25Db250ZXh0ICYgbmV3RUMsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBvbGRFQykKK3sKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTTVRfU09MVklORyApCisJb2xkRUMudHJhY2VEZWZhdWx0KEFWTV9PU19UUkFDRSA8PCBUQUIpOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNNVF9TT0xWSU5HICkKKwkvLyBDcmVhdGlvbiBkZSBsYSByZWxhdGlvbiBPbWVnYQorCS8vIEF0dGVudGlvbjogT21lZ2EgY29tcHRlIGRlIDEgw6AgbgorCW9tZWdhOjpSZWxhdGlvbiBvbGRSZWxhdGlvbiggbVRhYmxlT2ZWYXJpYWJsZUluc3RhbmNlLnNpemUoKSAtIDEgKTsKKwl0b1JlbGF0aW9uKG9sZEVDLnJlZkV4ZWN1dGlvbkRhdGEoKSwgb2xkUmVsYXRpb24pOworCisKKwlpZiggKCYgbmV3RUMpICE9IG1DYWNoZUZvck5ld0VDICkKKwl7CisJCW1DYWNoZUZvck5ld0VDID0gKCYgbmV3RUMpOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU01UX1NPTFZJTkcgKQorCQluZXdFQy50cmFjZURlZmF1bHQoQVZNX09TX1RSQUNFIDw8IFRBQik7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU01UX1NPTFZJTkcgKQorCQkvLyBDcmVhdGlvbiBkZSBsYSByZWxhdGlvbiBPbWVnYQorCQkvLyBBdHRlbnRpb246IE9tZWdhIGNvbXB0ZSBkZSAxIMOgIG4KKwkJb21lZ2E6OlJlbGF0aW9uIG5ld1JlbGF0aW9uKCBtVGFibGVPZlZhcmlhYmxlSW5zdGFuY2Uuc2l6ZSgpIC0gMSApOworCQl0b1JlbGF0aW9uKG5ld0VDLnJlZkV4ZWN1dGlvbkRhdGEoKSwgbmV3UmVsYXRpb24pOworCisJCW1DYWNoZUZvck5ld1JlbGF0aW9uID0gbmV3UmVsYXRpb247CisKKworCQlyZXR1cm4oIGlzRXF1YWxTZXQobmV3UmVsYXRpb24sIG9sZFJlbGF0aW9uKSApOworCX0KKwllbHNlCisJeworCQlvbWVnYTo6UmVsYXRpb24gbmV3UmVsYXRpb24gPSBtQ2FjaGVGb3JOZXdSZWxhdGlvbjsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNNVF9TT0xWSU5HICkKKwkJQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiRUQgY3B5IDogIgorCQkJCTw8IG5ld1JlbGF0aW9uLnByaW50X3dpdGhfc3Vic190b19zdHJpbmcoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU01UX1NPTFZJTkcgKQorCisJCXJldHVybiggaXNFcXVhbFNldChuZXdSZWxhdGlvbiwgb2xkUmVsYXRpb24pICk7CisJfQorfQorCisKK2Jvb2wgT21lZ2FTb2x2ZXI6OmlzRW1wdHlJbnRlcnNlY3Rpb24oCisJCWNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBuZXdFQywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIG9sZEVDKQoreworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNNVF9TT0xWSU5HICkKKwlvbGRFQy50cmFjZURlZmF1bHQoQVZNX09TX1RSQUNFIDw8IFRBQik7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU01UX1NPTFZJTkcgKQorCS8vIENyZWF0aW9uIGRlIGxhIHJlbGF0aW9uIE9tZWdhCisJLy8gQXR0ZW50aW9uOiBPbWVnYSBjb21wdGUgZGUgMSDDoCBuCisJb21lZ2E6OlJlbGF0aW9uIG9sZFJlbGF0aW9uKCBtVGFibGVPZlZhcmlhYmxlSW5zdGFuY2Uuc2l6ZSgpIC0gMSArCisJCQltVGFibGVPZlZhcjRQYXJhbUluc3RhbmNlLnNpemUoKSApOworCXNldFBhcmFtZXRlclVwbGUob2xkUmVsYXRpb24pOworCXRvUmVsYXRpb24ob2xkRUMucmVmRXhlY3V0aW9uRGF0YSgpLCBvbGRSZWxhdGlvbik7CisKKworCWlmKCAoJiBuZXdFQykgIT0gbUNhY2hlRm9yTmV3RUMgKQorCXsKKwkJbUNhY2hlRm9yTmV3RUMgPSAoJiBuZXdFQyk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTTVRfU09MVklORyApCisJCW5ld0VDLnRyYWNlRGVmYXVsdChBVk1fT1NfVFJBQ0UgPDwgVEFCKTsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTTVRfU09MVklORyApCisJCS8vIENyZWF0aW9uIGRlIGxhIHJlbGF0aW9uIE9tZWdhCisJCS8vIEF0dGVudGlvbjogT21lZ2EgY29tcHRlIGRlIDEgw6AgbgorCQlvbWVnYTo6UmVsYXRpb24gbmV3UmVsYXRpb24oIG1UYWJsZU9mVmFyaWFibGVJbnN0YW5jZS5zaXplKCkgLSAxICsKKwkJCQltVGFibGVPZlZhcjRQYXJhbUluc3RhbmNlLnNpemUoKSApOworCQlzZXRQYXJhbWV0ZXJVcGxlKG5ld1JlbGF0aW9uKTsKKwkJdG9SZWxhdGlvbihuZXdFQy5yZWZFeGVjdXRpb25EYXRhKCksIG5ld1JlbGF0aW9uKTsKKworCQltQ2FjaGVGb3JOZXdSZWxhdGlvbiA9IG5ld1JlbGF0aW9uOworCisKKwkJcmV0dXJuKCBpc0VtcHR5SW50ZXJzZWN0aW9uKG5ld1JlbGF0aW9uLCBvbGRSZWxhdGlvbikgKTsKKwl9CisJZWxzZQorCXsKKwkJb21lZ2E6OlJlbGF0aW9uIG5ld1JlbGF0aW9uID0gbUNhY2hlRm9yTmV3UmVsYXRpb247CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTTVRfU09MVklORyApCisJCUFWTV9PU19UUkFDRSA8PCBUQUIgPDwgIkVEIGNweSA6ICIKKwkJCQk8PCBuZXdSZWxhdGlvbi5wcmludF93aXRoX3N1YnNfdG9fc3RyaW5nKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNNVF9TT0xWSU5HICkKKworCQlyZXR1cm4oIGlzRW1wdHlJbnRlcnNlY3Rpb24obmV3UmVsYXRpb24sIG9sZFJlbGF0aW9uKSApOworCX0KK30KKworCisKK1NvbHZlckRlZjo6U0FUSVNGSUFCSUxJVFlfUklORyBPbWVnYVNvbHZlcjo6aXNTYXRpc2ZpYWJsZShjb25zdCBCRiAmIGFDb25kaXRpb24pCit7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU01UX1NPTFZJTkcgKQorCUFWTV9PU19UUkFDRSA8PCAiT21lZ2FTb2x2ZXI6OmlzU2F0aXNmaWFibGUoLi4uKSAiCisJCQkiOiIgPDwgU09MVkVSX1NFU1NJT05fSUQgPDwgIj4iIDw8IHN0ZDo6ZW5kbAorCQkJPDwgIlx0IiA8PCBhQ29uZGl0aW9uLnN0cigpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTTVRfU09MVklORyApCisKKwlCRiB2YWxDb25kaXRpb24gPSBFeHByZXNzaW9uU2ltcGxpZmllcjo6c2ltcGxpZiggYUNvbmRpdGlvbiApOworCisJLy8gSW5pdGlhbGlzYXRpb24gZHUgdGFibGVhdSBkZXMgcGFyYW1ldHJlcworCW1UYWJsZU9mVmFyaWFibGVJRC5jbGVhcigpOworCW1UYWJsZU9mUGFyYW1ldGVySW5zdGFuY2UuY2xlYXIoKTsKKworCS8vIEF0dGVudGlvbjogT21lZ2EgY29tcHRlIGRlIDEgw6AgbgorCW1UYWJsZU9mUGFyYW1ldGVySUQuY2xlYXIoKTsKKwlvbWVnYTo6VmFyaWFibGVfSUQgc2VudGluZWxJRDsKKwltVGFibGVPZlBhcmFtZXRlcklELnB1c2hfYmFjayhzZW50aW5lbElEKTsKKworCW9tZWdhOjpSZWxhdGlvbiBhUmVsYXRpb24oMCk7CisKKwkvLyBDcmVhdGlvbiBkdSBxdWFudGlmaWNhdGV1ciBFeGlzdCBhc3NvY2llIGF1eCBwYXJhbWV0cmVzCisJcmVnaXN0ZXJFeGlzdFF1YW50aWZpZXIgPSBhUmVsYXRpb24uYWRkX2FuZCgpLT5hZGRfZXhpc3RzKCk7CisJb21lZ2E6OkZfQW5kICogYW5kUm9vdE5vZGUgPSByZWdpc3RlckV4aXN0UXVhbnRpZmllci0+YWRkX2FuZCgpOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU01UX1NPTFZJTkcgKQorLy8JQVZNX09TX0NPVVQgPDwgImFDb25kaXRpb24gOiAiIDw8IGFDb25kaXRpb24tPnN0cigpIDw8IHN0ZDo6Zmx1c2g7CisJQVZNX09TX1RSQUNFIDw8ICJ2Ojppc1NhdGlzZmlhYmxlKC4uLikgIgorCQkJCSI6IiA8PCBTT0xWRVJfU0VTU0lPTl9JRCA8PCAiPiIgPDwgc3RkOjplbmRsOworCUFWTV9PU19UUkFDRSA8PCBUQUIgPDwgYUNvbmRpdGlvbi5zdHIoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU01UX1NPTFZJTkcgKQorCisJdG9Db25qb25jdGlvbihhbmRSb290Tm9kZSwgdmFsQ29uZGl0aW9uKTsKKworCS8vIFNpbXBsaWZpY2F0aW9uIGRlIGxhIFJlbGF0aW9uCisJYVJlbGF0aW9uLmZpbmFsaXplKCk7CisKKwlhUmVsYXRpb24uc2ltcGxpZnkoMiw0KTsKKworCisvL0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTTVRfU09MVklORyApCisvLwlBVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICJ0aGUgUmVsYXRpb24gOiAiCisvLwkJCTw8IG5ld1JlbGF0aW9uLnByaW50X3dpdGhfc3Vic190b19zdHJpbmcoKSA8PCBzdGQ6OmVuZGw7CisvL0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTTVRfU09MVklORyApCisKKworCVNvbHZlckRlZjo6U0FUSVNGSUFCSUxJVFlfUklORyBzYXRpc2ZpYWJpbGl0eSA9CisJCQlhUmVsYXRpb24uaXNfc2F0aXNmaWFibGUoKSA/CisJCQkJCVNvbHZlckRlZjo6U0FUSVNGSUFCTEUgOiBTb2x2ZXJEZWY6OlVOU0FUSVNGSUFCTEU7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTTVRfU09MVklORyApCisJQVZNX09TX1RSQUNFIDw8ICJyZXN1bHQgOiIgPDwgU09MVkVSX1NFU1NJT05fSUQgPDwgIj4gIgorCQkJPDwgU29sdmVyRGVmOjpzdHJTYXRpc2ZpYWJpbGl0eShzYXRpc2ZpYWJpbGl0eSkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNNVF9TT0xWSU5HICkKKworCWFSZWxhdGlvbiA9IG9tZWdhOjpSZWxhdGlvbjo6TnVsbCgpOworCisJcmVzZXRQYXJhbWV0ZXJUYWJsZSgpOworCisJcmV0dXJuKCBzYXRpc2ZpYWJpbGl0eSApOworfQorCisKKy8qKgorICogVE9PTFMKKyAqLworYm9vbCBPbWVnYVNvbHZlcjo6aXNTdWJTZXQob21lZ2E6OlJlbGF0aW9uICYgUmVsMSwgb21lZ2E6OlJlbGF0aW9uICYgUmVsMikKK3sKKwlyZXR1cm4oIE11c3RfQmVfU3Vic2V0KFJlbDEsIFJlbDIpICk7Cit9CisKK2Jvb2wgT21lZ2FTb2x2ZXI6OmlzRXF1YWxTZXQob21lZ2E6OlJlbGF0aW9uICYgUmVsMSwgb21lZ2E6OlJlbGF0aW9uICYgUmVsMikKK3sKKwlyZXR1cm4oIE11c3RfQmVfU3Vic2V0KGNvcHkoUmVsMSksIGNvcHkoUmVsMikpICYmIE11c3RfQmVfU3Vic2V0KFJlbDIsIFJlbDEpICk7Cit9CisKKworYm9vbCBPbWVnYVNvbHZlcjo6aXNFbXB0eUludGVyc2VjdGlvbihvbWVnYTo6UmVsYXRpb24gJiBSZWwxLCBvbWVnYTo6UmVsYXRpb24gJiBSZWwyKQoreworCW9tZWdhOjpSZWxhdGlvbiBpbnRlclJlbGF0aW9uID0gSW50ZXJzZWN0aW9uKFJlbDIsIFJlbDEpOworCisJYm9vbCBpc0VtcHR5ID0gKCEgaW50ZXJSZWxhdGlvbi5pc19zYXRpc2ZpYWJsZSgpICk7CisKKwlpbnRlclJlbGF0aW9uID0gb21lZ2E6OlJlbGF0aW9uOjpOdWxsKCk7CisKKwlyZXR1cm4oIGlzRW1wdHkgKTsKK30KKworCitib29sIE9tZWdhU29sdmVyOjpzZXRQYXJhbWV0ZXJVcGxlKG9tZWdhOjpSZWxhdGlvbiAmIGFSZWxhdGlvbikKK3sKKwlzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworCisJVmVjdG9yT2ZJbnN0YW5jZU9mRGF0YTo6aXRlcmF0b3IgaXQgPSBtVGFibGVPZlZhcjRQYXJhbUluc3RhbmNlLmJlZ2luKCk7CisJVmVjdG9yT2ZJbnN0YW5jZU9mRGF0YTo6aXRlcmF0b3IgaXRFbmQgPSBtVGFibGVPZlZhcjRQYXJhbUluc3RhbmNlLmVuZCgpOworCWF2bV9vZmZzZXRfdCBwYXJhbU9mZnNldCA9IDE7CisJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCAsICsrcGFyYW1PZmZzZXQgKQorCXsKKwkJb3NzLnN0cigiIik7CisJCW9zcyA8PCAiVlBfIiA8PCBwYXJhbU9mZnNldDsKKworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU01UX1NPTFZJTkcgKQorCUFWTV9PU19UUkFDRSA8PCBUQUIgPDwgIG9zcy5zdHIoKSA8PCAiIDw8ICIgPDwgKCppdCktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkKKwkJCTw8ICIgPj4gLS0+IGlzIGEgU3ltYm9saWMgUGFyYW1ldGVyIiA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU01UX1NPTFZJTkcgKQorCisJCSgqaXQpLT5zZXRPZmZzZXQobVRhYmxlT2ZQYXJhbWV0ZXJJRC5zaXplKCkpOworCQltVGFibGVPZlBhcmFtZXRlckluc3RhbmNlLnB1c2hfYmFjayggKCppdCkgKTsKKworCQlvbWVnYTo6VmFyaWFibGVfSUQgYVZhcklEID0gYVJlbGF0aW9uLnNldF92YXIocGFyYW1PZmZzZXQpOworCQltVGFibGVPZlBhcmFtZXRlcklELnB1c2hfYmFjayggYVZhcklEICk7CisJCWFSZWxhdGlvbi5uYW1lX3NldF92YXIocGFyYW1PZmZzZXQsIG9zcy5zdHIoKS5jX3N0cigpKTsKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworYm9vbCBPbWVnYVNvbHZlcjo6dG9SZWxhdGlvbigKKwkJY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQsIG9tZWdhOjpSZWxhdGlvbiAmIGFSZWxhdGlvbikKK3sKKwkvLyBDcmVhdGlvbiBkdSBxdWFudGlmaWNhdGV1ciBFeGlzdCBhc3NvY2llIGF1eCBwYXJhbWV0cmVzCisJcmVnaXN0ZXJFeGlzdFF1YW50aWZpZXIgPSBhUmVsYXRpb24uYWRkX2FuZCgpLT5hZGRfZXhpc3RzKCk7CisJb21lZ2E6OkZfQW5kICogYW5kUm9vdE5vZGUgPSByZWdpc3RlckV4aXN0UXVhbnRpZmllci0+YWRkX2FuZCgpOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU01UX1NPTFZJTkcgKQorCUFWTV9PU19UUkFDRSA8PCBUQUIgPDwgImFQQyA6ICIgPDwgYW5FRC5nZXRQYXRoQ29uZGl0aW9uKCkuc3RyKCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNNVF9TT0xWSU5HICkKKworCXRvQ29uam9uY3Rpb24oYW5kUm9vdE5vZGUsIGFuRUQuZ2V0UGF0aENvbmRpdGlvbigpKTsKKworCXN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisKKwlMaXN0T2ZQYWlyTWFjaGluZURhdGE6Oml0ZXJhdG9yIGl0UGFpck1hY2hpbmVEYXRhID0gZ2V0U2VsZWN0ZWRWYXJpYWJsZSgpLmJlZ2luKCk7CisJTGlzdE9mUGFpck1hY2hpbmVEYXRhOjppdGVyYXRvciBlbmRQYWlyTWFjaGluZURhdGEgPSBnZXRTZWxlY3RlZFZhcmlhYmxlKCkuZW5kKCk7CisJYXZtX29mZnNldF90IHZhck9mZnNldCA9IG1UYWJsZU9mVmFyNFBhcmFtSW5zdGFuY2Uuc2l6ZSgpICsgMTsKKwlmb3IoIDsgaXRQYWlyTWFjaGluZURhdGEgIT0gZW5kUGFpck1hY2hpbmVEYXRhIDsgKytpdFBhaXJNYWNoaW5lRGF0YSApCisJeworCQlpZiggKCppdFBhaXJNYWNoaW5lRGF0YSkuc2Vjb25kKCkubm9uZW1wdHkoKSApCisJCXsKKwkJCUxpc3RPZkluc3RhbmNlT2ZEYXRhOjppdGVyYXRvciBpdFZhciA9ICgqaXRQYWlyTWFjaGluZURhdGEpLnNlY29uZCgpLmJlZ2luKCk7CisJCQlMaXN0T2ZJbnN0YW5jZU9mRGF0YTo6aXRlcmF0b3IgZW5kVmFyID0gKCppdFBhaXJNYWNoaW5lRGF0YSkuc2Vjb25kKCkuZW5kKCk7CisKKwkJCWNvbnN0IFJ1bnRpbWVGb3JtICYgYVJGID0gYW5FRC5nZXRSdW50aW1lKCAoKml0UGFpck1hY2hpbmVEYXRhKS5maXJzdCgpICk7CisKKwkJCWZvciggOyBpdFZhciAhPSBlbmRWYXIgOyArK2l0VmFyICwgKyt2YXJPZmZzZXQgKQorCQkJeworCQkJCW9zcy5zdHIoIiIpOworCQkJCW9zcyA8PCAiVl8iIDw8IHZhck9mZnNldDsKKworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFNNVF9TT0xWSU5HICkKKy8vCUFWTV9PU19DT1VUIDw8ICBvc3Muc3RyKCkgPDwgIiA8LS0gIiA8PCBhUkYuZ2V0RGF0YSgqaXRWYXIpLnN0cigpIDw8IHN0ZDo6ZW5kbDsKKwlBVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICBvc3Muc3RyKCkgPDwgIiA8LS0gIgorCQkJPDwgYVJGLmdldERhdGEoKml0VmFyKS5zdHIoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFNNVF9TT0xWSU5HICkKKworCisJCQkJb21lZ2E6OlZhcmlhYmxlX0lEIGFWYXJJRCA9IGFSZWxhdGlvbi5zZXRfdmFyKHZhck9mZnNldCk7CisJCQkJbVRhYmxlT2ZWYXJpYWJsZUlELnB1c2hfYmFjayhhVmFySUQpOworCQkJCWFSZWxhdGlvbi5uYW1lX3NldF92YXIodmFyT2Zmc2V0LCBvc3Muc3RyKCkuY19zdHIoKSk7CisKKwkJCQlvbWVnYTo6RVFfSGFuZGxlIGVxTm9kZSA9IGFuZFJvb3ROb2RlLT5hZGRfRVEoKTsKKwkJCQllcU5vZGUudXBkYXRlX2NvZWYoYVZhcklELCAtMSk7CisKKwkJCQlpZiggKCppdFZhciktPmlzVHlwZWRCb29sZWFuKCkgKQorCQkJCXsKKwkJCQkJaWYoIGFSRi5nZXREYXRhKCppdFZhcikuaXNFcXVhbFRydWUoKSApCisJCQkJCXsKKwkJCQkJCWVxTm9kZS51cGRhdGVfY29uc3QoIDEgKTsKKwkJCQkJfQorCQkJCQllbHNlIGlmKCBhUkYuZ2V0RGF0YSgqaXRWYXIpLmlzRXF1YWxGYWxzZSgpICkKKwkJCQkJeworCQkJCQkJZXFOb2RlLnVwZGF0ZV9jb25zdCggMCApOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJZXFOb2RlLnVwZGF0ZV9jb2VmKGFWYXJJRCwgMSk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJdG9Db25zdHJhaW50KGVxTm9kZSwgMSwgYVJGLmdldERhdGEoKml0VmFyKSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLy8gU2ltcGxpZmljYXRpb24gZGUgbGEgUmVsYXRpb24KKwlhUmVsYXRpb24uZmluYWxpemUoKTsKKworCisvL0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTTVRfU09MVklORyApCisvLwlBVk1fT1NfQ09VVCA8PCAiRklOQUxJWkUgOiAiOworLy8JYVJlbGF0aW9uLnByZWZpeF9wcmludCgpOyBBVk1fT1NfQ09VVCA8PCBzdGQ6OmZsdXNoOworLy9BVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU01UX1NPTFZJTkcgKQorCisKKwlhUmVsYXRpb24uc2ltcGxpZnkoMiw0KTsKKworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFNNVF9TT0xWSU5HICkKKy8vCUFWTV9PU19DT1VUIDw8ICJTSU1QTElGICA6ICIgPDwgc3RkOjplbmRsCisvLwkJCTw8ICJFRCA6ICIgPDwgYVJlbGF0aW9uLnByaW50X3dpdGhfc3Vic190b19zdHJpbmcoKSA8PCBzdGQ6OmVuZGw7CisJQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiRUQgOiAiCisJCQk8PCBhUmVsYXRpb24ucHJpbnRfd2l0aF9zdWJzX3RvX3N0cmluZygpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgU01UX1NPTFZJTkcgKQorCisKKwlyZXNldFBhcmFtZXRlclRhYmxlKCk7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCitvbWVnYTo6VmFyaWFibGVfSUQgT21lZ2FTb2x2ZXI6OmdldFBhcmFtZXRlcklEKEluc3RhbmNlT2ZEYXRhICogYVBhcmFtZXRlcikKK3sKKwlpZiggYVBhcmFtZXRlci0+Z2V0TWFyaygpID09IDAgKQorCXsKKy8vCQlpZiggYVBhcmFtZXRlci0+aXNUeXBlZEJvb2xlYW4oKSApCisvLwkJeworLy8JCX0KKy8vCQllbHNlIGlmKCBhUGFyYW1ldGVyLT5pc1R5cGVkSW50ZWdlcigpICkKKy8vCQl7CisvLwkJfQorLy8JCWVsc2UgaWYoIGFQYXJhbWV0ZXItPmlzVHlwZWRSYXRpb25hbCgpICkKKy8vCQl7CisvLwkJfQorLy8JCWVsc2UgaWYoIGFQYXJhbWV0ZXItPmlzVHlwZWRGbG9hdCgpICkKKy8vCQl7CisvLwkJfQorLy8JCWVsc2UgaWYoIGFQYXJhbWV0ZXItPmlzVHlwZWRSZWFsKCkgKQorLy8JCXsKKy8vCQl9CisvLwkJZWxzZQorLy8JCXsKKy8vCQkJQVZNX09TX0VSUk9SX0FMRVJUIDw8ICJVbmV4cGVjdGVkIGFuIGluc3RhbmNlIHR5cGUgPDwgIgorLy8JCQkJCTw8IGFQYXJhbWV0ZXItPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIiA6ICIgPDwgcGFyYW1Gb3JtVHlwZS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorLy8JCQkJCTw8ICI+PiAhISEiCisvLwkJCQkJPDwgU0VORF9BTEVSVDsKKy8vCQl9CisKKwkJYVBhcmFtZXRlci0+c2V0TWFyayhtVGFibGVPZlBhcmFtZXRlcklELnNpemUoKSk7CisJCW1UYWJsZU9mUGFyYW1ldGVySW5zdGFuY2UucHVzaF9iYWNrKGFQYXJhbWV0ZXIpOworCisJCXN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisJCW9zcy5zdHIoIiIpOworCQlvc3MgPDwgIlBfIiA8PCBtVGFibGVPZlBhcmFtZXRlcklELnNpemUoKTsKKworCisvL0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTTVRfU09MVklORyApCisvLwlBVk1fT1NfQ09VVCA8PCAiXHQiIDw8IG9zcy5zdHIoKSA8PCAiIDwtICIgPDwgYVBhcmFtZXRlci0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKSA8PCBzdGQ6OmVuZGw7CisvLwlBVk1fT1NfVFJBQ0UgPDwgVEFCICA8PCBvc3Muc3RyKCkgPDwgIiA8LSAiIDw8IGFQYXJhbWV0ZXItPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgc3RkOjplbmRsOworLy9BVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU01UX1NPTFZJTkcgKQorCisJCW1UYWJsZU9mUGFyYW1ldGVySUQucHVzaF9iYWNrKAorCQkJCXJlZ2lzdGVyRXhpc3RRdWFudGlmaWVyLT5kZWNsYXJlKCBvc3Muc3RyKCkuY19zdHIoKSApICk7CisJfQorCisJLy9yZXR1cm4oIG1UYWJsZU9mUGFyYW1ldGVySURbIGFQYXJhbWV0ZXItPmdldE1hcmsoKSBdICk7CisKKwlvbWVnYTo6VmFyaWFibGVfSUQgdmFySUQgPSBtVGFibGVPZlBhcmFtZXRlcklEWyBhUGFyYW1ldGVyLT5nZXRNYXJrKCkgXTsKKworCisvL0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTTVRfU09MVklORyApCisvLwlBVk1fT1NfVFJBQ0UgPDwgVEFCIDw8ICJ2YXJJRDogIjsKKy8vCWNvbnN0IGNoYXIgKiBjID0gdmFySUQtPmNoYXJfbmFtZSgpOworLy8Jd2hpbGUoIGlzYWxudW0oKmMpICkgeyBBVk1fT1NfVFJBQ0UgPDwgKmM7ICsrYzsgfQorLy8JQVZNX09TX1RSQUNFIDw8IFRBQiA8PCAiIDwtICIgPDwgc3RyX2hlYWRlciggYVBhcmFtZXRlciApIDw8IHN0ZDo6ZW5kbDsKKy8vQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNNVF9TT0xWSU5HICkKKworCXJldHVybiggdmFySUQgKTsKK30KKworCit2b2lkIE9tZWdhU29sdmVyOjp0b0NvbmpvbmN0aW9uKG9tZWdhOjpGX0FuZCAqIGFuZE5vZGUsIGNvbnN0IEJGICYgZXhwckZvcm0pCit7CisJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1NNQVJUX1BPSU5URVJfRVhJVCggZXhwckZvcm0gKSA8PCAiZXhwcmVzc2lvbiAhISEiCisJCQk8PCBTRU5EX0VYSVQ7CisKKwlzd2l0Y2goIGV4cHJGb3JtLmNsYXNzS2luZCgpICkKKwl7CisJCWNhc2UgRk9STV9BVk1DT0RFX0tJTkQ6CisJCXsKKwkJCUF2bUNvZGUgKiBhQ29kZSA9IGV4cHJGb3JtLnRvX3B0cjwgQXZtQ29kZSA+KCk7CisKKwkJCXN3aXRjaCggYUNvZGUtPmdldEF2bU9wQ29kZSgpICkKKwkJCXsKKwkJCQljYXNlIEFWTV9PUENPREVfRVE6IC8vIC0gZmlyc3QgKyBzZWNvbmQgPT0gMAorCQkJCXsKKwkJCQkJQkZDb2RlIGV4cHJDb25kOworCQkJCQlhdm1faW50ZWdlcl90IGV4cHJJbnQ7CisKKwkJCQkJaWYoIGFDb2RlLT5maXJzdCgpLmlzPCBBdm1Db2RlID4oKSApCisJCQkJCXsKKwkJCQkJCWV4cHJDb25kID0gYUNvZGUtPmZpcnN0KCkuYmZDb2RlKCk7CisKKwkJCQkJCWlmKCBhQ29kZS0+c2Vjb25kKCkuaXNJbnRlZ2VyKCkgKQorCQkJCQkJeworCQkJCQkJCWV4cHJJbnQgPSBhQ29kZS0+c2Vjb25kKCkudG9JbnRlZ2VyKCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZSBpZiggYUNvZGUtPmZpcnN0KCkuaXNJbnRlZ2VyKCkgKQorCQkJCQl7CisJCQkJCQlleHBySW50ID0gYUNvZGUtPmZpcnN0KCkudG9JbnRlZ2VyKCk7CisKKwkJCQkJCWlmKCBhQ29kZS0+c2Vjb25kKCkuaXM8IEF2bUNvZGUgPigpICkKKwkJCQkJCXsKKwkJCQkJCQlleHByQ29uZCA9IGFDb2RlLT5zZWNvbmQoKS5iZkNvZGUoKTsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCWlmKCBleHByQ29uZC52YWxpZCgpICkKKwkJCQkJeworCQkJCQkJc3dpdGNoKCBleHByQ29uZC0+Z2V0QXZtT3BDb2RlKCkgKQorCQkJCQkJeworCQkJCQkJCWNhc2UgQVZNX09QQ09ERV9FUToKKwkJCQkJCQljYXNlIEFWTV9PUENPREVfTkVROgorCQkJCQkJCWNhc2UgQVZNX09QQ09ERV9MVDoKKwkJCQkJCQljYXNlIEFWTV9PUENPREVfTFRFOgorCQkJCQkJCWNhc2UgQVZNX09QQ09ERV9HVDoKKwkJCQkJCQljYXNlIEFWTV9PUENPREVfR1RFOgorCQkJCQkJCWNhc2UgQVZNX09QQ09ERV9OT1Q6CisJCQkJCQkJY2FzZSBBVk1fT1BDT0RFX0FORDoKKwkJCQkJCQljYXNlIEFWTV9PUENPREVfTkFORDoKKwkJCQkJCQljYXNlIEFWTV9PUENPREVfWEFORDoKKwkJCQkJCQljYXNlIEFWTV9PUENPREVfT1I6CisJCQkJCQkJY2FzZSBBVk1fT1BDT0RFX05PUjoKKwkJCQkJCQljYXNlIEFWTV9PUENPREVfWE9SOgorCQkJCQkJCWNhc2UgQVZNX09QQ09ERV9YTk9SOgorCQkJCQkJCXsKKwkJCQkJCQkJb21lZ2E6OkZfQW5kICogYW5kRVEgPSBhbmROb2RlOworCisJCQkJCQkJCWlmKCBleHBySW50ID09IDAgKQorCQkJCQkJCQl7CisJCQkJCQkJCQlhbmRFUSA9IGFuZE5vZGUtPmFkZF9ub3QoKS0+YWRkX2FuZCgpOworCQkJCQkJCQl9CisKKwkJCQkJCQkJdG9Db25qb25jdGlvbihhbmRFUSwgZXhwckNvbmQpOworCisJCQkJCQkJCXJldHVybjsKKwkJCQkJCQl9CisKKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCXsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJb21lZ2E6OkVRX0hhbmRsZSBlcU5vZGUgPSBhbmROb2RlLT5hZGRfRVEoKTsKKwkJCQkJCXRvQ29uc3RyYWludChlcU5vZGUsIC0xLCBhQ29kZS0+Zmlyc3QoKSk7CisJCQkJCQl0b0NvbnN0cmFpbnQoZXFOb2RlLCAgMSwgYUNvZGUtPnNlY29uZCgpKTsKKwkJCQkJfQorCisJCQkJCWJyZWFrOworCQkJCX0KKworCisJCQkJY2FzZSBBVk1fT1BDT0RFX05FUTogLy8gTk9UKCAtIGZpcnN0ICsgc2Vjb25kID09IDAgKQorCQkJCXsKKwkJCQkJQkZDb2RlIGV4cHJDb25kOworCQkJCQlhdm1faW50ZWdlcl90IGV4cHJJbnQ7CisKKwkJCQkJaWYoIGFDb2RlLT5maXJzdCgpLmlzPCBBdm1Db2RlID4oKSApCisJCQkJCXsKKwkJCQkJCWV4cHJDb25kID0gYUNvZGUtPmZpcnN0KCkuYmZDb2RlKCk7CisKKwkJCQkJCWlmKCBhQ29kZS0+c2Vjb25kKCkuaXNJbnRlZ2VyKCkgKQorCQkJCQkJeworCQkJCQkJCWV4cHJJbnQgPSBhQ29kZS0+c2Vjb25kKCkudG9JbnRlZ2VyKCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZSBpZiggYUNvZGUtPmZpcnN0KCkuaXNJbnRlZ2VyKCkgKQorCQkJCQl7CisJCQkJCQlleHBySW50ID0gYUNvZGUtPmZpcnN0KCkudG9JbnRlZ2VyKCk7CisKKwkJCQkJCWlmKCBhQ29kZS0+c2Vjb25kKCkuaXM8IEF2bUNvZGUgPigpICkKKwkJCQkJCXsKKwkJCQkJCQlleHByQ29uZCA9IGFDb2RlLT5zZWNvbmQoKS5iZkNvZGUoKTsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCWlmKCBleHByQ29uZC52YWxpZCgpICkKKwkJCQkJeworCQkJCQkJc3dpdGNoKCBleHByQ29uZC0+Z2V0QXZtT3BDb2RlKCkgKQorCQkJCQkJeworCQkJCQkJCWNhc2UgQVZNX09QQ09ERV9FUToKKwkJCQkJCQljYXNlIEFWTV9PUENPREVfTkVROgorCQkJCQkJCWNhc2UgQVZNX09QQ09ERV9MVDoKKwkJCQkJCQljYXNlIEFWTV9PUENPREVfTFRFOgorCQkJCQkJCWNhc2UgQVZNX09QQ09ERV9HVDoKKwkJCQkJCQljYXNlIEFWTV9PUENPREVfR1RFOgorCQkJCQkJCWNhc2UgQVZNX09QQ09ERV9OT1Q6CisJCQkJCQkJY2FzZSBBVk1fT1BDT0RFX0FORDoKKwkJCQkJCQljYXNlIEFWTV9PUENPREVfTkFORDoKKwkJCQkJCQljYXNlIEFWTV9PUENPREVfWEFORDoKKwkJCQkJCQljYXNlIEFWTV9PUENPREVfT1I6CisJCQkJCQkJY2FzZSBBVk1fT1BDT0RFX05PUjoKKwkJCQkJCQljYXNlIEFWTV9PUENPREVfWE9SOgorCQkJCQkJCWNhc2UgQVZNX09QQ09ERV9YTk9SOgorCQkJCQkJCXsKKwkJCQkJCQkJb21lZ2E6OkZfQW5kICogYW5kRVEgPSBhbmROb2RlOworCisJCQkJCQkJCWlmKCBleHBySW50ICE9IDAgKQorCQkJCQkJCQl7CisJCQkJCQkJCQlhbmRFUSA9IGFuZE5vZGUtPmFkZF9ub3QoKS0+YWRkX2FuZCgpOworCQkJCQkJCQl9CisKKwkJCQkJCQkJdG9Db25qb25jdGlvbihhbmRFUSwgZXhwckNvbmQpOworCisJCQkJCQkJCXJldHVybjsKKwkJCQkJCQl9CisKKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCXsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJb21lZ2E6OkVRX0hhbmRsZSBlcU5vZGUgPQorCQkJCQkJCQlhbmROb2RlLT5hZGRfbm90KCktPmFkZF9hbmQoKS0+YWRkX0VRKCk7CisKKwkJCQkJCXRvQ29uc3RyYWludChlcU5vZGUsIC0xLCBhQ29kZS0+Zmlyc3QoKSk7CisJCQkJCQl0b0NvbnN0cmFpbnQoZXFOb2RlLCAgMSwgYUNvZGUtPnNlY29uZCgpKTsKKwkJCQkJfQorCisJCQkJCWJyZWFrOworCQkJCX0KKworCisKKwkJCQljYXNlIEFWTV9PUENPREVfTFQ6IC8vIC0gZmlyc3QgKyBzZWNvbmQgLSAxID49IDAKKwkJCQl7CisJCQkJCW9tZWdhOjpHRVFfSGFuZGxlIGdlcU5vZGUgPSBhbmROb2RlLT5hZGRfR0VRKCk7CisJCQkJCXRvQ29uc3RyYWludChnZXFOb2RlLCAtMSwgYUNvZGUtPmZpcnN0KCkpOworCQkJCQl0b0NvbnN0cmFpbnQoZ2VxTm9kZSwgIDEsIGFDb2RlLT5zZWNvbmQoKSk7CisJCQkJCWdlcU5vZGUudXBkYXRlX2NvbnN0KC0xKTsKKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQljYXNlIEFWTV9PUENPREVfTFRFOiAvLyAtIGZpcnN0ICsgc2Vjb25kID49IDAKKwkJCQl7CisJCQkJCW9tZWdhOjpHRVFfSGFuZGxlIGdlcU5vZGUgPSBhbmROb2RlLT5hZGRfR0VRKCk7CisJCQkJCXRvQ29uc3RyYWludChnZXFOb2RlLCAtMSwgYUNvZGUtPmZpcnN0KCkpOworCQkJCQl0b0NvbnN0cmFpbnQoZ2VxTm9kZSwgIDEsIGFDb2RlLT5zZWNvbmQoKSk7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJY2FzZSBBVk1fT1BDT0RFX0dUOiAvLyBmaXJzdCAtIHNlY29uZCAtIDEgPj0gMAorCQkJCXsKKwkJCQkJb21lZ2E6OkdFUV9IYW5kbGUgZ2VxTm9kZSA9IGFuZE5vZGUtPmFkZF9HRVEoKTsKKwkJCQkJdG9Db25zdHJhaW50KGdlcU5vZGUsICAxLCBhQ29kZS0+Zmlyc3QoKSk7CisJCQkJCXRvQ29uc3RyYWludChnZXFOb2RlLCAtMSwgYUNvZGUtPnNlY29uZCgpKTsKKwkJCQkJZ2VxTm9kZS51cGRhdGVfY29uc3QoLTEpOworCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWNhc2UgQVZNX09QQ09ERV9HVEU6ICAvLyBmaXJzdCAtIHNlY29uZCA+PSAwCisJCQkJeworCQkJCQlCRkNvZGUgZXhwckNvbmQ7CisJCQkJCWF2bV9pbnRlZ2VyX3QgZXhwckludDsKKworCQkJCQlpZiggYUNvZGUtPmZpcnN0KCkuaXM8IEF2bUNvZGUgPigpICkKKwkJCQkJeworCQkJCQkJZXhwckNvbmQgPSBhQ29kZS0+Zmlyc3QoKS5iZkNvZGUoKTsKKworCQkJCQkJaWYoIGFDb2RlLT5zZWNvbmQoKS5pc0ludGVnZXIoKSApCisJCQkJCQl7CisJCQkJCQkJZXhwckludCA9IGFDb2RlLT5zZWNvbmQoKS50b0ludGVnZXIoKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlIGlmKCBhQ29kZS0+Zmlyc3QoKS5pc0ludGVnZXIoKSApCisJCQkJCXsKKwkJCQkJCWV4cHJJbnQgPSBhQ29kZS0+Zmlyc3QoKS50b0ludGVnZXIoKTsKKworCQkJCQkJaWYoIGFDb2RlLT5zZWNvbmQoKS5pczwgQXZtQ29kZSA+KCkgKQorCQkJCQkJeworCQkJCQkJCWV4cHJDb25kID0gYUNvZGUtPnNlY29uZCgpLmJmQ29kZSgpOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJaWYoIGV4cHJDb25kLnZhbGlkKCkgKQorCQkJCQl7CisJCQkJCQlzd2l0Y2goIGV4cHJDb25kLT5nZXRBdm1PcENvZGUoKSApCisJCQkJCQl7CisJCQkJCQkJY2FzZSBBVk1fT1BDT0RFX0VROgorCQkJCQkJCWNhc2UgQVZNX09QQ09ERV9ORVE6CisJCQkJCQkJY2FzZSBBVk1fT1BDT0RFX0xUOgorCQkJCQkJCWNhc2UgQVZNX09QQ09ERV9MVEU6CisJCQkJCQkJY2FzZSBBVk1fT1BDT0RFX0dUOgorCQkJCQkJCWNhc2UgQVZNX09QQ09ERV9HVEU6CisJCQkJCQkJY2FzZSBBVk1fT1BDT0RFX05PVDoKKwkJCQkJCQljYXNlIEFWTV9PUENPREVfQU5EOgorCQkJCQkJCWNhc2UgQVZNX09QQ09ERV9OQU5EOgorCQkJCQkJCWNhc2UgQVZNX09QQ09ERV9YQU5EOgorCQkJCQkJCWNhc2UgQVZNX09QQ09ERV9PUjoKKwkJCQkJCQljYXNlIEFWTV9PUENPREVfTk9SOgorCQkJCQkJCWNhc2UgQVZNX09QQ09ERV9YT1I6CisJCQkJCQkJY2FzZSBBVk1fT1BDT0RFX1hOT1I6CisJCQkJCQkJeworCQkJCQkJCQlvbWVnYTo6Rl9BbmQgKiBhbmRFUSA9IGFuZE5vZGU7CisKKwkJCQkJCQkJaWYoIGV4cHJJbnQgPCAxICkKKwkJCQkJCQkJeworCQkJCQkJCQkJYW5kRVEgPSBhbmROb2RlLT5hZGRfbm90KCktPmFkZF9hbmQoKTsKKwkJCQkJCQkJfQorCisJCQkJCQkJCXRvQ29uam9uY3Rpb24oYW5kRVEsIGV4cHJDb25kKTsKKworCQkJCQkJCQlyZXR1cm47CisJCQkJCQkJfQorCisJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQl7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCW9tZWdhOjpHRVFfSGFuZGxlIGdlcU5vZGUgPSBhbmROb2RlLT5hZGRfR0VRKCk7CisJCQkJCQl0b0NvbnN0cmFpbnQoZ2VxTm9kZSwgIDEsIGFDb2RlLT5maXJzdCgpKTsKKwkJCQkJCXRvQ29uc3RyYWludChnZXFOb2RlLCAtMSwgYUNvZGUtPnNlY29uZCgpKTsKKwkJCQkJfQorCisJCQkJCWJyZWFrOworCQkJCX0KKworCisJCQkJY2FzZSBBVk1fT1BDT0RFX0NPTlRBSU5TOgorCQkJCXsKKwkJCQkJQnVpbHRpbkNvbGxlY3Rpb24gKiBhQ29sbGVjdGlvbiA9CisJCQkJCQkJYUNvZGUtPmZpcnN0KCkudG9fcHRyPCBCdWlsdGluQ29sbGVjdGlvbiA+KCk7CisKKwkJCQkJaWYoIGFDb2xsZWN0aW9uLT5zaW5nbGV0b24oKSApCisJCQkJCXsKKwkJCQkJCW9tZWdhOjpFUV9IYW5kbGUgZXFOb2RlID0gYW5kTm9kZS0+YWRkX0VRKCk7CisJCQkJCQl0b0NvbnN0cmFpbnQoZXFOb2RlLCAtMSwgYUNvbGxlY3Rpb24tPmF0KDApKTsKKwkJCQkJCXRvQ29uc3RyYWludChlcU5vZGUsICAxLCBhQ29kZS0+c2Vjb25kKCkpOworCQkJCQl9CisJCQkJCWVsc2UgaWYoIGFDb2xsZWN0aW9uLT5wb3B1bGF0ZWQoKSApCisJCQkJCXsKKwkJCQkJCW9tZWdhOjpGX09yICogb3JOb2RlID0gYW5kTm9kZS0+YWRkX29yKCk7CisKKwkJCQkJCXN0ZDo6c2l6ZV90IGNvbFNpemUgPSBhQ29sbGVjdGlvbi0+c2l6ZSgpOworCQkJCQkJZm9yKCBzdGQ6OnNpemVfdCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgY29sU2l6ZSA7ICsrb2Zmc2V0ICkKKwkJCQkJCXsKKwkJCQkJCQlvbWVnYTo6RVFfSGFuZGxlIGVxTm9kZSA9IG9yTm9kZS0+YWRkX2FuZCgpLT5hZGRfRVEoKTsKKwkJCQkJCQl0b0NvbnN0cmFpbnQoZXFOb2RlLCAtMSwgYUNvbGxlY3Rpb24tPmF0KG9mZnNldCkpOworCQkJCQkJCXRvQ29uc3RyYWludChlcU5vZGUsICAxLCBhQ29kZS0+c2Vjb25kKCkpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJYW5kTm9kZS0+YWRkX0VRKCkudXBkYXRlX2NvbnN0KAorCQkJCQkJCWV4cHJGb3JtLnRvX3B0cjwgQm9vbGVhbiA+KCktPmdldFZhbHVlKCkgPyAwIDogMSApOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKworCisJCQkJY2FzZSBBVk1fT1BDT0RFX05PVDoKKwkJCQl7CisJCQkJCWlmKCBhQ29kZS0+Zmlyc3QoKS5pczwgSW5zdGFuY2VPZkRhdGEgPigpICkgLy8gYXJnMCA9PSAwCisJCQkJCXsKKwkJCQkJCWFuZE5vZGUtPmFkZF9FUSgpLnVwZGF0ZV9jb2VmKGdldFBhcmFtZXRlcklEKAorCQkJCQkJCQlhQ29kZS0+Zmlyc3QoKS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKSksIDEpOworCQkJCQl9CisJCQkJCWVsc2UgIC8vIE5PVCggYXJnMCApCisJCQkJCXsKKwkJCQkJCXRvQ29uam9uY3Rpb24oYW5kTm9kZS0+YWRkX25vdCgpLT5hZGRfYW5kKCksIGFDb2RlLT5maXJzdCgpKTsKKwkJCQkJfQorCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWNhc2UgQVZNX09QQ09ERV9BTkQ6IC8vIEFORCBhcmdzCisJCQkJeworCQkJCQlBdm1Db2RlOjppdGVyYXRvciBpdCA9IGFDb2RlLT5iZWdpbigpOworCQkJCQlBdm1Db2RlOjppdGVyYXRvciBpdEVuZCA9IGFDb2RlLT5lbmQoKTsKKwkJCQkJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApCisJCQkJCXsKKwkJCQkJCXRvQ29uam9uY3Rpb24oYW5kTm9kZSwgKml0KTsKKwkJCQkJfQorCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWNhc2UgQVZNX09QQ09ERV9OQU5EOiAvLyBOQU5EIGZpcnN0IHNlY29uZAorCQkJCXsKKwkJCQkJb21lZ2E6OkZfQW5kICogbmFuZE5vZGUgPSBhbmROb2RlLT5hZGRfbm90KCktPmFkZF9hbmQoKTsKKwkJCQkJdG9Db25qb25jdGlvbihuYW5kTm9kZSwgYUNvZGUtPmZpcnN0KCkpOworCQkJCQl0b0NvbmpvbmN0aW9uKG5hbmROb2RlLCBhQ29kZS0+c2Vjb25kKCkpOworCisJCQkJCWJyZWFrOworCQkJCX0KKworCisJCQkJY2FzZSBBVk1fT1BDT0RFX1hBTkQ6CisJCQkJeworCQkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJCTw8ICJVbnN1cHBvcnRlZCBib29sZWFuIGV4cHJlc3Npb24gPDwgWEFORCA+PiAhISEiCisJCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJCWJyZWFrOworCQkJCX0KKworCisJCQkJY2FzZSBBVk1fT1BDT0RFX09SOiAvLyBPUiBhcmdzCisJCQkJeworCQkJCQlvbWVnYTo6Rl9PciAqIG9yTm9kZSA9IGFuZE5vZGUtPmFkZF9vcigpOworCQkJCQlBdm1Db2RlOjppdGVyYXRvciBpdCA9IGFDb2RlLT5iZWdpbigpOworCQkJCQlBdm1Db2RlOjppdGVyYXRvciBpdEVuZCA9IGFDb2RlLT5lbmQoKTsKKwkJCQkJZm9yKCA7IGl0ICE9IGl0RW5kIDsgKytpdCApCisJCQkJCXsKKwkJCQkJCXRvQ29uam9uY3Rpb24ob3JOb2RlLT5hZGRfYW5kKCksICppdCk7CisJCQkJCX0KKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQljYXNlIEFWTV9PUENPREVfTk9SOiAvLyBOT1IgZmlyc3Qgc2Vjb25kCisJCQkJeworCQkJCQlvbWVnYTo6Rl9BbmQgKiBub3JOb2RlID0gYW5kTm9kZS0+YWRkX25vdCgpLT5hZGRfb3IoKS0+YWRkX2FuZCgpOworCQkJCQl0b0NvbmpvbmN0aW9uKG5vck5vZGUsIGFDb2RlLT5maXJzdCgpKTsKKwkJCQkJdG9Db25qb25jdGlvbihub3JOb2RlLCBhQ29kZS0+c2Vjb25kKCkpOworCisJCQkJCWJyZWFrOworCQkJCX0KKworCisJCQkJY2FzZSBBVk1fT1BDT0RFX1hPUjoKKwkJCQljYXNlIEFWTV9PUENPREVfWE5PUjoKKwkJCQl7CisJCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQkJPDwgIlVuc3VwcG9ydGVkIGJvb2xlYW4gZXhwcmVzc2lvbiAiCisJCQkJCQkJCSI8PCBYT1IgfCBYTk9SID4+ICEhISIKKwkJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisKKwkJCQljYXNlIEFWTV9PUENPREVfUExVUzoKKwkJCQljYXNlIEFWTV9PUENPREVfVU1JTlVTOgorCQkJCWNhc2UgQVZNX09QQ09ERV9NSU5VUzoKKwkJCQljYXNlIEFWTV9PUENPREVfTVVMVDoKKwkJCQljYXNlIEFWTV9PUENPREVfRElWOgorCQkJCWNhc2UgQVZNX09QQ09ERV9QT1c6CisJCQkJY2FzZSBBVk1fT1BDT0RFX01PRDoKKwkJCQl7CisJCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQkJPDwgIlVuZXhwZWN0ZWQgYXJpdGhtZXRpYyBleHByZXNzaW9uIE9wZXJhdG9yICEhISIKKwkJCQkJCQk8PCBTRU5EX0VYSVQ7CisJCQkJCWJyZWFrOworCQkJCX0KKworCisJCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQkJPDwgIlVuZXhwZWN0ZWQgQkFTRUZPUk0gS0lORCBmb3IgZXhlY3V0aW9uICEhIVxuIgorCQkJCQkJCTw8IGFDb2RlLT50b1N0cmluZyggQVZNX1RBQjFfSU5ERU5UICkKKwkJCQkJCQk8PCBTRU5EX0VYSVQ7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEZPUk1fSU5TVEFOQ0VfREFUQV9LSU5EOgorCQl7CisvLwkJCWFuZE5vZGUtPmFkZF9ub3QoKS0+YWRkX2FuZCgpLT5hZGRfRVEoKS51cGRhdGVfY29lZigKKy8vCQkJCQlnZXRQYXJhbWV0ZXJJRCggZXhwckZvcm0udG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCkgKSApOworCisJCQlvbWVnYTo6RVFfSGFuZGxlIGVxTm9kZSA9IGFuZE5vZGUtPmFkZF9hbmQoKS0+YWRkX0VRKCk7CisJCQllcU5vZGUudXBkYXRlX2NvZWYoIGdldFBhcmFtZXRlcklEKGV4cHJGb3JtLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpKSwgMSk7CisJCQllcU5vZGUudXBkYXRlX2NvbnN0KC0xKTsKKworCQkJYnJlYWs7CisJCX0KKworCisJCWNhc2UgRk9STV9CVUlMVElOX0JPT0xFQU5fS0lORDogLy8gdHJ1ZSA8PT4gKDAgPT0gMCkgOyBmYWxzZSA8PT4gKDEgPT0gMCkKKwkJeworCQkJYW5kTm9kZS0+YWRkX0VRKCkudXBkYXRlX2NvbnN0KAorCQkJCQlleHByRm9ybS50b19wdHI8IEJvb2xlYW4gPigpLT5nZXRWYWx1ZSgpID8gMCA6IDEgKTsKKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEZPUk1fQlVJTFRJTl9JTlRFR0VSX0tJTkQ6CisJCXsKKwkJCWFuZE5vZGUtPmFkZF9FUSgpLnVwZGF0ZV9jb25zdCgKKwkJCQkJZXhwckZvcm0udG9fcHRyPCBJbnRlZ2VyID4oKS0+aXNaZXJvKCkgPyAwIDogMSApOworCisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgRk9STV9CVUlMVElOX1JBVElPTkFMX0tJTkQ6CisJCXsKKwkJCWFuZE5vZGUtPmFkZF9FUSgpLnVwZGF0ZV9jb25zdCgKKwkJCQkJZXhwckZvcm0udG9fcHRyPCBSYXRpb25hbCA+KCktPmlzWmVybygpID8gMCA6IDEgKTsKKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEZPUk1fQlVJTFRJTl9GTE9BVF9LSU5EOgorCQl7CisJCQlhbmROb2RlLT5hZGRfRVEoKS51cGRhdGVfY29uc3QoCisJCQkJZXhwckZvcm0udG9fcHRyPCBGbG9hdCA+KCktPmlzWmVybygpID8gMCA6IDEgICk7CisKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBGT1JNX0JVSUxUSU5fQ0hBUkFDVEVSX0tJTkQ6CisJCXsKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCTw8ICJVbnN1cHBvcnRlZCBidWlsdC1pbiBDaGFyYWN0ZXIgISEhIgorCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBGT1JNX0JVSUxUSU5fU1RSSU5HX0tJTkQ6CisJCWNhc2UgRk9STV9CVUlMVElOX1FVQUxJRklFRF9JREVOVElGSUVSX0tJTkQ6CisJCWNhc2UgRk9STV9CVUlMVElOX0lERU5USUZJRVJfS0lORDoKKwkJeworCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJPDwgIlVuc3VwcG9ydGVkIGJ1aWx0LWluIFN0cmluZyAiCisJCQkJCQkiPCBTVFJJTkcgfCBVRkkgfCBJREVOVElGSUVSID4gb3IgT3BlcmF0b3IgISEhIgorCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBGT1JNX09QRVJBVE9SX0tJTkQ6CisJCXsKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCTw8ICJVbnN1cHBvcnRlZCBPcGVyYXRvciBleHByZXNzaW9uICEhISIKKwkJCQkJPDwgU0VORF9FWElUOworCisJCQlicmVhazsKKwkJfQorCisKKwkJY2FzZSBGT1JNX0lOU1RBTkNFX0JVRkZFUl9LSU5EOgorCQljYXNlIEZPUk1fSU5TVEFOQ0VfQ09OTkVDVE9SX0tJTkQ6CisJCWNhc2UgRk9STV9JTlNUQU5DRV9NQUNISU5FX0tJTkQ6CisJCWNhc2UgRk9STV9JTlNUQU5DRV9QT1JUX0tJTkQ6CisKKwkJZGVmYXVsdDoKKwkJeworCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJPDwgIlVuZXhwZWN0ZWQgQkFTRUZPUk0gS0lORCBhcyBleHByZXNzaW9uIDw8ICIKKwkJCQkJPDwgZXhwckZvcm0uc3RyKCkgPDwgIiA+PiAhISEiCisJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKwordm9pZCBPbWVnYVNvbHZlcjo6dG9Db25zdHJhaW50KG9tZWdhOjpDb25zdHJhaW50X0hhbmRsZSAmIGNvbnN0cmFpbnROb2RlLAorCQlpbnQgY29lZmZpY2llbnQsIGNvbnN0IEJGICYgZXhwckZvcm0pCit7CisJQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1NNQVJUX1BPSU5URVJfRVhJVCggZXhwckZvcm0gKSA8PCAiZXhwcmVzc2lvbiAhISEiCisJCQk8PCBTRU5EX0VYSVQ7CisKKwlzd2l0Y2goIGV4cHJGb3JtLmNsYXNzS2luZCgpICkKKwl7CisJCWNhc2UgRk9STV9BVk1DT0RFX0tJTkQ6CisJCXsKKwkJCUF2bUNvZGUgKiBhQ29kZSA9IGV4cHJGb3JtLnRvX3B0cjwgQXZtQ29kZSA+KCk7CisKKwkJCXN3aXRjaCggYUNvZGUtPmdldEF2bU9wQ29kZSgpICkKKwkJCXsKKwkJCQljYXNlIEFWTV9PUENPREVfUExVUzoKKwkJCQl7CisJCQkJCUF2bUNvZGU6Oml0ZXJhdG9yIGl0ID0gYUNvZGUtPmJlZ2luKCk7CisJCQkJCUF2bUNvZGU6Oml0ZXJhdG9yIGl0RW5kID0gYUNvZGUtPmVuZCgpOworCQkJCQlmb3IoIDsgaXQgIT0gaXRFbmQgOyArK2l0ICkKKwkJCQkJeworCQkJCQkJdG9Db25zdHJhaW50KGNvbnN0cmFpbnROb2RlLCBjb2VmZmljaWVudCwgKml0KTsKKwkJCQkJfQorCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWNhc2UgQVZNX09QQ09ERV9VTUlOVVM6CisJCQkJeworCQkJCQl0b0NvbnN0cmFpbnQoY29uc3RyYWludE5vZGUsIC0gY29lZmZpY2llbnQsIGFDb2RlLT5maXJzdCgpKTsKKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQljYXNlIEFWTV9PUENPREVfTUlOVVM6CisJCQkJeworCQkJCQl0b0NvbnN0cmFpbnQoY29uc3RyYWludE5vZGUsICAgY29lZmZpY2llbnQsIGFDb2RlLT5maXJzdCgpKTsKKwkJCQkJdG9Db25zdHJhaW50KGNvbnN0cmFpbnROb2RlLCAtIGNvZWZmaWNpZW50LCBhQ29kZS0+c2Vjb25kKCkpOworCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWNhc2UgQVZNX09QQ09ERV9NVUxUOgorCQkJCXsKKwkJCQkJaWYoIGFDb2RlLT5zaXplKCkgPT0gMiApCisJCQkJCXsKKwkJCQkJCWlmKCBhQ29kZS0+Zmlyc3QoKS5pc0ludGVnZXIoKSApCisJCQkJCQl7CisJCQkJCQkJY29lZmZpY2llbnQgPSBjb2VmZmljaWVudCAqIGFDb2RlLT5maXJzdCgpLnRvSW50ZWdlcigpOworCQkJCQkJCXRvQ29uc3RyYWludChjb25zdHJhaW50Tm9kZSwgY29lZmZpY2llbnQsIGFDb2RlLT5zZWNvbmQoKSk7CisJCQkJCQl9CisJCQkJCQllbHNlIGlmKCBhQ29kZS0+c2Vjb25kKCkuaXNJbnRlZ2VyKCkgKQorCQkJCQkJeworCQkJCQkJCWNvZWZmaWNpZW50ID0gY29lZmZpY2llbnQgKiBhQ29kZS0+c2Vjb25kKCkudG9JbnRlZ2VyKCk7CisJCQkJCQkJdG9Db25zdHJhaW50KGNvbnN0cmFpbnROb2RlLCBjb2VmZmljaWVudCwgYUNvZGUtPmZpcnN0KCkpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQkJCQk8PCAiVW5zdXBwb3J0ZWQgbm9uIGxpbmVhciBtdWx0aXBsaWNhdGlvbiAhISEiCisJCQkJCQkJCQk8PCBTRU5EX0VYSVQ7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJCQk8PCAiVW5zdXBwb3J0ZWQgbm9uIGJpbmFyeSBtdWx0aXBsaWNhdGlvbiAhISEiCisJCQkJCQkJCTw8IFNFTkRfRVhJVDsKKwkJCQkJfQorCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWNhc2UgQVZNX09QQ09ERV9ESVY6CisJCQkJY2FzZSBBVk1fT1BDT0RFX1BPVzoKKwkJCQljYXNlIEFWTV9PUENPREVfTU9EOgorCQkJCXsKKwkJCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJCQk8PCAiVW5zdXBwb3J0ZWQgYXJpdGhtZXRpYyBleHByZXNzaW9uIE9wZXJhdG9yICIKKwkJCQkJCQkJIjw8IERJViB8IEVYUCB8IE1PRCA+PiAhISEiCisJCQkJCQkJPDwgU0VORF9FWElUOworCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWNhc2UgQVZNX09QQ09ERV9FUToKKwkJCQljYXNlIEFWTV9PUENPREVfTkVROgorCQkJCWNhc2UgQVZNX09QQ09ERV9MVDoKKwkJCQljYXNlIEFWTV9PUENPREVfTFRFOgorCQkJCWNhc2UgQVZNX09QQ09ERV9HVDoKKwkJCQljYXNlIEFWTV9PUENPREVfR1RFOgorCQkJCWNhc2UgQVZNX09QQ09ERV9OT1Q6CisJCQkJY2FzZSBBVk1fT1BDT0RFX0FORDoKKwkJCQljYXNlIEFWTV9PUENPREVfTkFORDoKKwkJCQljYXNlIEFWTV9PUENPREVfWEFORDoKKwkJCQljYXNlIEFWTV9PUENPREVfT1I6CisJCQkJY2FzZSBBVk1fT1BDT0RFX05PUjoKKwkJCQljYXNlIEFWTV9PUENPREVfWE9SOgorCQkJCWNhc2UgQVZNX09QQ09ERV9YTk9SOgorCQkJCXsKKwkJCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJCQk8PCAiVW5leHBlY3RlZCBib29sZWFuIGV4cHJlc3Npb24gT3BlcmF0b3IgPDwgIgorCQkJCQkJCTw8IGFDb2RlLT5zdHIoKSA8PCAiID4+ICEhISIKKwkJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJCTw8ICJVbmV4cGVjdGVkIEJBU0VGT1JNIEtJTkQgZm9yIGV4ZWN1dGlvblxuIgorCQkJCQkJCTw8IGFDb2RlLT50b1N0cmluZyggQVZNX1RBQjFfSU5ERU5UICkKKwkJCQkJCQk8PCBTRU5EX0VYSVQ7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEZPUk1fSU5TVEFOQ0VfREFUQV9LSU5EOgorCQl7CisJCQljb25zdHJhaW50Tm9kZS51cGRhdGVfY29lZigKKwkJCQkJZ2V0UGFyYW1ldGVySUQoZXhwckZvcm0udG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCkpICwKKwkJCQkJY29lZmZpY2llbnQgKTsKKworCQkJYnJlYWs7CisJCX0KKworCisJCWNhc2UgRk9STV9CVUlMVElOX0JPT0xFQU5fS0lORDogIC8vIHRydWUgPD0+IDEgOyBmYWxzZSA8PT4gMAorCQl7CisJCQljb25zdHJhaW50Tm9kZS51cGRhdGVfY29uc3QoCisJCQkJCSggZXhwckZvcm0udG9fcHRyPCBCb29sZWFuID4oKS0+Z2V0VmFsdWUoKSApID8gMSA6IDAgKTsKKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEZPUk1fQlVJTFRJTl9JTlRFR0VSX0tJTkQ6CisJCXsKKwkJCWNvbnN0cmFpbnROb2RlLnVwZGF0ZV9jb25zdCgKKwkJCQkJY29lZmZpY2llbnQgKiBleHByRm9ybS50b19wdHI8IEludGVnZXIgPigpLT50b0ludGVnZXIoKSApOworCisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgRk9STV9CVUlMVElOX1JBVElPTkFMX0tJTkQ6CisJCXsKKwkJCUFWTV9PU19XQVJOSU5HX0FMRVJUIDw8ICJVbnN1cHBvcnRlZCBidWlsdGluIFJhdGlvbmFsICEhISIKKwkJCQkJPDwgU0VORF9BTEVSVDsKKworCQkJaWYoIGV4cHJGb3JtLnRvX3B0cjwgUmF0aW9uYWwgPigpLT5pc0ludGVnZXIoKSApCisJCQl7CisJCQkJY29uc3RyYWludE5vZGUudXBkYXRlX2NvbnN0KAorCQkJCQkJY29lZmZpY2llbnQgKiBleHByRm9ybS50b19wdHI8IFJhdGlvbmFsID4oKS0+dG9JbnRlZ2VyKCkgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJPDwgIlVuc3VwcG9ydGVkIGJ1aWx0LWluIFJhdGlvbmFsICEhISIKKwkJCQkJCTw8IFNFTkRfRVhJVDsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEZPUk1fQlVJTFRJTl9GTE9BVF9LSU5EOgorCQl7CisJCQlBVk1fT1NfV0FSTklOR19BTEVSVCA8PCAiVW5zdXBwb3J0ZWQgYnVpbHQtaW4gRmxvYXQgISEhIgorCQkJCQk8PCBTRU5EX0FMRVJUOworCisJCQlpZiggZXhwckZvcm0udG9fcHRyPCBGbG9hdCA+KCktPmlzSW50ZWdlcigpICkKKwkJCXsKKwkJCQljb25zdHJhaW50Tm9kZS51cGRhdGVfY29uc3QoCisJCQkJCQljb2VmZmljaWVudCAqIGV4cHJGb3JtLnRvX3B0cjwgRmxvYXQgPigpLT50b0ludGVnZXIoKSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQk8PCAiVW5zdXBwb3J0ZWQgYnVpbHQtaW4gRmxvYXQgISEhIgorCQkJCQkJPDwgU0VORF9FWElUOworCQkJfQorCisJCQlicmVhazsKKwkJfQorCisKKwkJY2FzZSBGT1JNX1JVTlRJTUVfSURfS0lORDoKKwkJeworCQkJY29uc3RyYWludE5vZGUudXBkYXRlX2NvbnN0KCBjb2VmZmljaWVudCAqIGV4cHJGb3JtLmJmUklEKCkuZ2V0UmlkKCkgKTsKKworCQkJYnJlYWs7CisJCX0KKworCisJCWNhc2UgRk9STV9CVUlMVElOX0NIQVJBQ1RFUl9LSU5EOgorCQl7CisJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQk8PCAiVW5zdXBwb3J0ZWQgYnVpbHQtaW4gQ2hhcmFjdGVyICEhISIKKwkJCQkJPDwgU0VORF9FWElUOworCisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgRk9STV9CVUlMVElOX1NUUklOR19LSU5EOgorCQljYXNlIEZPUk1fQlVJTFRJTl9RVUFMSUZJRURfSURFTlRJRklFUl9LSU5EOgorCQljYXNlIEZPUk1fQlVJTFRJTl9JREVOVElGSUVSX0tJTkQ6CisJCXsKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCTw8ICJVbnN1cHBvcnRlZCBidWlsdC1pbiBTdHJpbmcgIgorCQkJCQkJIjwgU1RSSU5HIHwgVUZJIHwgSURFTlRJRklFUiA+IG9yIE9wZXJhdG9yICEhISIKKwkJCQkJPDwgU0VORF9FWElUOworCisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgRk9STV9PUEVSQVRPUl9LSU5EOgorCQl7CisJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQk8PCAiVW5zdXBwb3J0ZWQgT3BlcmF0b3IgZXhwcmVzc2lvbiAhISEiCisJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJYnJlYWs7CisJCX0KKworCisJCWNhc2UgRk9STV9JTlNUQU5DRV9CVUZGRVJfS0lORDoKKwkJY2FzZSBGT1JNX0lOU1RBTkNFX0NPTk5FQ1RPUl9LSU5EOgorCQljYXNlIEZPUk1fSU5TVEFOQ0VfTUFDSElORV9LSU5EOgorCQljYXNlIEZPUk1fSU5TVEFOQ0VfUE9SVF9LSU5EOgorCisJCWRlZmF1bHQ6CisJCXsKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCTw8ICJVbmV4cGVjdGVkIEJBU0VGT1JNIEtJTkQgYXMgZXhwcmVzc2lvbiA8PCAiCisJCQkJCTw8IGV4cHJGb3JtLnN0cigpIDw8ICIgPj4gISEhIgorCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisKKy8qKgorICogU09MVkVSCisgKi8KK2Jvb2wgT21lZ2FTb2x2ZXI6OnNvbHZlSW1wbChjb25zdCBCRiAmIGFDb25kaXRpb24sCisJCUJGVmVjdG9yICYgZGF0YVZlY3RvciwgQkZWZWN0b3IgJiB2YWx1ZXNWZWN0b3IpCit7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU01UX1NPTFZJTkcgKQorCUFWTV9PU19UUkFDRSA8PCAiT21lZ2FTb2x2ZXI6OnNvbHZlKC4uLikgIgorCQkJIjoiIDw8IFNPTFZFUl9TRVNTSU9OX0lEIDw8ICI+IiA8PCBzdGQ6OmVuZGwKKwkJCTw8ICJcdCIgPDwgYUNvbmRpdGlvbi5zdHIoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU01UX1NPTFZJTkcgKQorCisJLy8gISEhISBORSBGQUlUIFJJRU4gUE9VUiBMJ0lOU1RBTlQKKworCXJldHVybihmYWxzZSk7Cit9CisKKworfQorCisKKyNlbmRpZiAvKiBfQVZNX1NPTFZFUl9PTUVHQV8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3NvbHZlci9PbWVnYVNvbHZlci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc29sdmVyL09tZWdhU29sdmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJjNWQ4NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3NvbHZlci9PbWVnYVNvbHZlci5oCkBAIC0wLDAgKzEsMTkzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgU09MVkVSX09NRUdBX0hfCisjZGVmaW5lIFNPTFZFUl9PTUVHQV9IXworCisjaW5jbHVkZSA8c29sdmVyL2FwaS9Tb2x2ZXJEZWYuaD4KKy8qCisgKiBIZXJlIGJlY2F1c2UgIlNvbHZlckRlZi5oIiBjb3VsZCBkZWZpbmUgdGhpcyBtYWNybworICovCisjaWYgZGVmaW5lZCggX0FWTV9TT0xWRVJfT01FR0FfICkKKworCisjaW5jbHVkZSA8c29sdmVyL2FwaS9TYXRTb2x2ZXIuaD4KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vVHlwZWRlZi5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZkRhdGEuaD4KKworI2lmIGRlZmluZWQoIF9BVk1fQlVJTFRJTl9OVU1FUklDX0JPT1NUXyApCisKKy8vIER1ZSB0byBjb21waWxhdGlvbiBhbWJpZ3VpdHkgYmV0d2VlbiBib29zdDo6c3dhcCAmIG9tZWdhOjpzd2FwCisjaW5jbHVkZSA8Zm1sL251bWVyaWMvRmxvYXQuaD4KKworI2VuZGlmIC8qIF9BVk1fQlVJTFRJTl9OVU1FUklDX0JPT1NUXyAqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gT01FR0EgJiB0aGlzIG9sZCBzcGVjaWFsIEFTU0VSVCBmZWF0dXJlCisjaW5jbHVkZSAib21lZ2EuaCIKKyN1bmRlZiBhc3NlcnQKKyN1bmRlZiBfYXNzZXJ0CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBBUEV4ZWN1dGlvbkRhdGE7CitjbGFzcyBFeGVjdXRpb25EYXRhOworY2xhc3MgRXhlY3V0aW9uQ29udGV4dDsKKworY2xhc3MgV09iamVjdDsKKworCitjbGFzcyBPbWVnYVNvbHZlciA6IHB1YmxpYyBTYXRTb2x2ZXIKK3sKKworCUFWTV9ERUNMQVJFX1VOQ0xPTkFCTEVfQ0xBU1MoT21lZ2FTb2x2ZXIpCisKKworcHVibGljOgorCS8qCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIElECisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCXN0YXRpYyBzdGQ6OnN0cmluZyBJRDsKKworCXN0YXRpYyBzdGQ6OnN0cmluZyBERVNDUklQVElPTjsKKworCXN0YXRpYyBhdm1fdWludDY0X3QgU09MVkVSX1NFU1NJT05fSUQ7CisKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlib29sIGlzQ29uZmlndXJlRmxhZzsKKworCVZlY3Rvck9mSW5zdGFuY2VPZkRhdGEgbVRhYmxlT2ZWYXJpYWJsZUluc3RhbmNlOworCXN0ZDo6dmVjdG9yPCBvbWVnYTo6VmFyaWFibGVfSUQgPiBtVGFibGVPZlZhcmlhYmxlSUQ7CisKKwlWZWN0b3JPZkluc3RhbmNlT2ZEYXRhIG1UYWJsZU9mVmFyNFBhcmFtSW5zdGFuY2U7CisKKwlWZWN0b3JPZkluc3RhbmNlT2ZEYXRhIG1UYWJsZU9mUGFyYW1ldGVySW5zdGFuY2U7CisJc3RkOjp2ZWN0b3I8IG9tZWdhOjpWYXJpYWJsZV9JRCA+IG1UYWJsZU9mUGFyYW1ldGVySUQ7CisKKwlvbWVnYTo6Rl9EZWNsYXJhdGlvbiAqIHJlZ2lzdGVyRXhpc3RRdWFudGlmaWVyOworCisJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAqIG1DYWNoZUZvck5ld0VDOworCW9tZWdhOjpSZWxhdGlvbiBtQ2FjaGVGb3JOZXdSZWxhdGlvbjsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJT21lZ2FTb2x2ZXIoKQorCTogU2F0U29sdmVyKCksCisJaXNDb25maWd1cmVGbGFnKCBmYWxzZSApLAorCXJlZ2lzdGVyRXhpc3RRdWFudGlmaWVyKCBOVUxMICksCisJbUNhY2hlRm9yTmV3RUMoIE5VTEwgKSwKKwltQ2FjaGVGb3JOZXdSZWxhdGlvbiggUmVsYXRpb246Ok51bGwoKSApCisJeworCQkvLyEhIE5PVEhJTkcKKwkJcmVzZXRQYXJhbWV0ZXJUYWJsZSgpOworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgfk9tZWdhU29sdmVyKCkKKwl7CisJCW1DYWNoZUZvck5ld1JlbGF0aW9uID0gUmVsYXRpb246Ok51bGwoKTsKKworCQlyZXNldFZhcmlhYmxlVGFibGUoKTsKKwl9CisKKwkvKioKKwkgKiBDT05GSUdVUkUKKwkgKi8KKwl2aXJ0dWFsIGJvb2wgY29uZmlndXJlKAorCQkJQ29uZmlndXJhdGlvbiAmIGFDb25maWd1cmF0aW9uLCBXT2JqZWN0ICogd2ZGaWx0ZXJPYmplY3QsCisJCQlMaXN0T2ZQYWlyTWFjaGluZURhdGEgJiBsaXN0T2ZTZWxlY3RlZFZhcmlhYmxlKTsKKworCS8qKgorCSAqIFJFU0VUIFZBUklBQkxFIG9yIFBBUkFNRVRFUgorCSAqLworCXZvaWQgcmVzZXRWYXJpYWJsZVRhYmxlKCk7CisJdm9pZCByZXNldFBhcmFtZXRlclRhYmxlKCk7CisKKwkvKioKKwkgKiBTRVQgVkFSSUFCTEUgb3IgUEFSQU1FVEVSCisJICovCisJdmlydHVhbCB2b2lkIHNldFNlbGVjdGVkVmFyaWFibGUoY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFwRUQsCisJCQlMaXN0T2ZQYWlyTWFjaGluZURhdGEgJiBsaXN0T2ZTZWxlY3RlZFZhcmlhYmxlKTsKKworCXZvaWQgc2V0U2VsZWN0ZWRWYXJpYWJsZShjb25zdCBFeGVjdXRpb25EYXRhICYgYXBFRCk7CisJdm9pZCBzZXRTZWxlY3RlZFZhcmlhYmxlKGNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhcEVELAorCQkJTGlzdE9mSW5zdGFuY2VPZkRhdGEgJiBhTGlzT2ZBZGRpdGlvbm5hbFZhcik7CisKKworCisJLyoqCisJICogUFJPVkVSCisJICovCisJdmlydHVhbCBib29sIGlzU3ViU2V0KAorCQkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIG5ld0VDLCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgb2xkRUMpOworCisJdmlydHVhbCBib29sIGlzRXF1YWxTZXQoCisJCQljb25zdCBFeGVjdXRpb25Db250ZXh0ICYgbmV3RUMsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBvbGRFQyk7CisKKwl2aXJ0dWFsIGJvb2wgaXNFbXB0eUludGVyc2VjdGlvbigKKwkJCWNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBuZXdFQywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIG9sZEVDKTsKKworCXZpcnR1YWwgU29sdmVyRGVmOjpTQVRJU0ZJQUJJTElUWV9SSU5HIGlzU2F0aXNmaWFibGUoY29uc3QgQkYgJiBhQ29uZGl0aW9uKTsKKworCS8qKgorCSAqIFNPTFZFUgorCSAqLworCXZpcnR1YWwgYm9vbCBzb2x2ZUltcGwoY29uc3QgQkYgJiBhQ29uZGl0aW9uLAorCQkJQkZWZWN0b3IgJiBkYXRhVmVjdG9yLCBCRlZlY3RvciAmIHZhbHVlc1ZlY3Rvcik7CisKKworCS8qKgorCSAqIFRPT0xTCisJICovCisJYm9vbCBpc1N1YlNldChvbWVnYTo6UmVsYXRpb24gJiBSZWwxLCBvbWVnYTo6UmVsYXRpb24gJiBSZWwyKTsKKwlib29sIGlzRXF1YWxTZXQob21lZ2E6OlJlbGF0aW9uICYgUmVsMSwgb21lZ2E6OlJlbGF0aW9uICYgUmVsMik7CisJYm9vbCBpc0VtcHR5SW50ZXJzZWN0aW9uKG9tZWdhOjpSZWxhdGlvbiAmIFJlbDEsIG9tZWdhOjpSZWxhdGlvbiAmIFJlbDIpOworCisJYm9vbCBzZXRQYXJhbWV0ZXJVcGxlKG9tZWdhOjpSZWxhdGlvbiAmIGFSZWxhdGlvbik7CisKKwlib29sIHRvUmVsYXRpb24oY29uc3QgRXhlY3V0aW9uRGF0YSAmIGFuRUQsIG9tZWdhOjpSZWxhdGlvbiAmIGFSZWxhdGlvbik7CisKKwlvbWVnYTo6VmFyaWFibGVfSUQgZ2V0UGFyYW1ldGVySUQoSW5zdGFuY2VPZkRhdGEgKiBhUGFyYW1ldGVyKTsKKworCXZvaWQgdG9Db25qb25jdGlvbihvbWVnYTo6Rl9BbmQgKiBhbmROb2RlLCBjb25zdCBCRiAmIGV4cHJGb3JtKTsKKworCXZvaWQgdG9Db25zdHJhaW50KG9tZWdhOjpDb25zdHJhaW50X0hhbmRsZSAmIGNvbnN0cmFpbnROb2RlLAorCQkJaW50IGNvZWZmaWNpZW50LCBjb25zdCBCRiAmIGV4cHJGb3JtKTsKKworfTsKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKiBfQVZNX1NPTFZFUl9PTUVHQV8gKi8KKworCisjZW5kaWYgLypTT0xWRVJfT01FR0FfSF8qLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc29sdmVyL1JFQURNRS5tZCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3NvbHZlci9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI4NzZlZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3NvbHZlci9SRUFETUUubWQKQEAgLTAsMCArMSwxMSBAQAorIyBFRk0tU1lNQkVYIDogU29sdmVyCisKKyMjIFNvdXJjZSBjb2RlIHN0cnVjdHVyZQorCisjIyMgSW50ZXJmYWNlcworKiAqKklzb2x2ZXIqKgorCisjIyMgQ2xhc3NlcworCisjIyMgRmFjdG9yaWVzCisqICoqU29sdmVyKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3NvbHZlci9aM1NvbHZlci5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9zb2x2ZXIvWjNTb2x2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZDEwN2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9zb2x2ZXIvWjNTb2x2ZXIuY3BwCkBAIC0wLDAgKzEsMjc0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDI5IGbDqXZyLiAyMDEyCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJaM1NvbHZlci5oIgorCisvKgorICogSGVyZSBiZWNhdXNlICJTb2x2ZXJEZWYuaCIgY291bGQgZGVmaW5lIHRoaXMgbWFjcm8KKyAqLworI2lmIGRlZmluZWQoIF9BVk1fU09MVkVSX1ozXyApCisKKworI2luY2x1ZGUgPHV0aWwvYXZtX3Zmcy5oPgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQXZtQ29kZS5oPgorI2luY2x1ZGUgPGZtbC9idWlsdGluL0Jvb2xlYW4uaD4KKyNpbmNsdWRlIDxmbWwvYnVpbHRpbi9DaGFyYWN0ZXIuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9CdWlsdGluQ29udGFpbmVyLmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkNvbXBhcmVyLmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkNvbnN0cnVjdG9yLmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkZhY3RvcnkuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uVHlwZUNoZWNrZXIuaD4KKyNpbmNsdWRlIDxmbWwvbnVtZXJpYy9GbG9hdC5oPgorI2luY2x1ZGUgPGZtbC9udW1lcmljL0ludGVnZXIuaD4KKyNpbmNsdWRlIDxmbWwvbnVtZXJpYy9SYXRpb25hbC5oPgorCisjaW5jbHVkZSA8Zm1sL29wZXJhdG9yL09wZXJhdG9yLmg+CisKKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25Db250ZXh0Lmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uRGF0YS5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL1J1bnRpbWVGb3JtLmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvUnVudGltZUlELmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvVGFibGVPZkRhdGEuaD4KKworI2luY2x1ZGUgPGZtbC90eXBlL1R5cGVNYW5hZ2VyLmg+CisKKyNpbmNsdWRlIDxmbWwvd29ya2Zsb3cvV09iamVjdC5oPgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSUQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3N0ZDo6c3RyaW5nIFozU29sdmVyOjpJRCA9ICJaMyI7CisKK3N0ZDo6c3RyaW5nIFozU29sdmVyOjpERVNDUklQVElPTiA9ICJaMyAiCisJCSInSGlnaC1wZXJmb3JtYW5jZSBUaGVvcmVtIFByb3ZlciBhdCBNaWNyb3NvZnQgUmVzZWFyY2gsIE1JVCBMaWNlbnNlJyI7CisKK2F2bV91aW50NjRfdCBaM1NvbHZlcjo6U09MVkVSX1NFU1NJT05fSUQgPSAwOworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKworI2lmIGRlZmluZWQoIF9BVk1fU09MVkVSX1ozX0NQUF8gKQorCisKKy8qKgorICogQ1JFQVRFIC0gREVTVFJPWQorICogVmFsaWRpdHlDaGVja2VyCisgKi8KKworCitib29sIFozU29sdmVyOjpjcmVhdGVDaGVja2VyKHozOjpjb25maWcgJiBjZmcsIHozOjpjb250ZXh0ICYgY3R4KQoreworCUNGRyA9ICYgY2ZnOworCisJQ0ZHLT5zZXQoIk1PREVMIiwgInRydWUiKTsKKworCUNUWCA9ICYgY3R4OworCisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTTVRfU09MVklORyApCisJKytTT0xWRVJfU0VTU0lPTl9JRDsKK0FWTV9JRl9ERUJVR19MRVZFTF9HVEVfSElHSAorCQltTG9nRm9sZGVyTG9jYXRpb24gPSBPU1MgPDwgVkZTOjpQcm9qZWN0TG9nUGF0aCA8PCAiL3ozLyI7CisKKwkJaWYgKCBub3QgVkZTOjpjaGVja1dyaXRpbmdGb2xkZXIobUxvZ0ZvbGRlckxvY2F0aW9uKSApCisJCXsKKwkJCUFWTV9PU19MT0cgPDwgIiBaM1NvbHZlcjo6Y3JlYXRlQ2hlY2tlciA6PiBFcnJvcjogVGhlIGZvbGRlciAiCisJCQkJCTw8ICJgIiA8PCBtTG9nRm9sZGVyTG9jYXRpb24JPDwgIicgIgorCQkJCQk8PCAiLS0tPiBkb2Vzbid0IGV4aXN0IG9yIGlzIG5vdCB3cml0YWJsZSAhISEiCisJCQkJCTw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9HVEVfSElHSAorQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNNVF9TT0xWSU5HICkKKworCVNNVF9DU1RfQk9PTF9UUlVFICA9IENUWC0+Ym9vbF92YWwodHJ1ZSk7CisJU01UX0NTVF9CT09MX0ZBTFNFID0gQ1RYLT5ib29sX3ZhbChmYWxzZSk7CisKKwlyZXNldFRhYmxlKCk7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCitib29sIFozU29sdmVyOjpkZXN0cm95Q2hlY2tlcigpCit7CisJcmVzZXRUYWJsZSgpOworCisJQ0ZHID0gTlVMTDsKKworCUNUWCA9IE5VTEw7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworYm9vbCBaM1NvbHZlcjo6cmVzZXRUYWJsZSgpCit7CisJYmFzZV90aGlzX3R5cGU6OnJlc2V0VGFibGUoKTsKKworCW1UYWJsZU9mUGFyYW1ldGVyRGVjbC5hcHBlbmQoIHozOjpzeW1ib2woKkNUWCwgMCkgKTsKKworCW1UYWJsZU9mUGFyYW1ldGVyRXhwci5hcHBlbmQoIHozOjpleHByKCpDVFgpICk7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisKKy8qKgorICogUFJPVkVSCisgKi8KK2Jvb2wgWjNTb2x2ZXI6OmlzU3ViU2V0KAorCQljb25zdCBFeGVjdXRpb25Db250ZXh0ICYgbmV3RUMsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBvbGRFQykKK3sKKwlyZXR1cm4oIHRydWUgKTsKK30KKworYm9vbCBaM1NvbHZlcjo6aXNFcXVhbFNldCgKKwkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIG5ld0VDLCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgb2xkRUMpCit7CisJcmV0dXJuKCB0cnVlICk7Cit9CisKK1NvbHZlckRlZjo6U0FUSVNGSUFCSUxJVFlfUklORyBaM1NvbHZlcjo6aXNTYXRpc2ZpYWJsZShjb25zdCBCRiAmIGFDb25kaXRpb24pCit7CisJU29sdmVyRGVmOjpTQVRJU0ZJQUJJTElUWV9SSU5HIHNhdGlzZmlhYmlsaXR5ID0gU29sdmVyRGVmOjpTQVRJU0ZJQUJMRTsKKworCXozOjpjb25maWcgY2ZnOworCXozOjpjb250ZXh0IGN0eDsKKwljcmVhdGVDaGVja2VyKGNmZywgY3R4KTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNNVF9TT0xWSU5HICkKKwlBVk1fT1NfVFJBQ0UgPDwgIlozU29sdmVyOjppc1NhdGlzZmlhYmxlKC4uLikgIgorCQkJIjoiIDw8IFNPTFZFUl9TRVNTSU9OX0lEIDw8ICI+IiA8PCBzdGQ6OmVuZGwKKwkJCTw8ICJcdCIgPDwgYUNvbmRpdGlvbi5zdHIoKSA8PCBzdGQ6OmVuZGw7CisKKwkvLyB0cmFjZSB0byBmaWxlCitBVk1fSUZfREVCVUdfTEVWRUxfR1RFX0hJR0gKKwkJc210X2NoZWNrX3NhdChhQ29uZGl0aW9uKTsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9HVEVfSElHSAorQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNNVF9TT0xWSU5HICkKKworCXozOjpleHByIHozQ29uZGl0aW9uID0gZnJvbV9iYXNlZm9ybShhQ29uZGl0aW9uKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNNVF9TT0xWSU5HICkKKwlBVk1fT1NfVFJBQ0UgPDwgIlozQ29uZGl0aW9uIDoiIDw8IFNPTFZFUl9TRVNTSU9OX0lEIDw8ICI+IiA8PCBzdGQ6OmVuZGwKKwkJCTw8ICJcdCIgPDwgejNDb25kaXRpb24gPDwgc3RkOjplbmRsOworQVZNX0lGX0RFQlVHX0xFVkVMX0dURV9ISUdICisJQVZNX09TX1RSQUNFIDw8ICJaMzo6Q1RYIDoiIDw8IFNPTFZFUl9TRVNTSU9OX0lEIDw8ICI+IiA8PCBzdGQ6OmVuZGwKKwkJCTw8IGN0eCA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfR1RFX0hJR0gKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTTVRfU09MVklORyApCisKKwkvL2lmKCB6M0NvbmRpdGlvbiAhPSBOVUxMICkKKwl7CisJCXozOjpzb2x2ZXIgejNTb2x2ZXIoKkNUWCk7CisKKwkJejNTb2x2ZXIuYWRkKCB6M0NvbmRpdGlvbiApOworCisJCXN3aXRjaCggejNTb2x2ZXIuY2hlY2soKSApCisJCXsKKwkJCWNhc2UgejM6OnNhdDoKKwkJCXsKKwkJCQlzYXRpc2ZpYWJpbGl0eSA9IFNvbHZlckRlZjo6U0FUSVNGSUFCTEU7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNhc2UgejM6OnVuc2F0OgorCQkJeworCQkJCXNhdGlzZmlhYmlsaXR5ID0gU29sdmVyRGVmOjpVTlNBVElTRklBQkxFOworCQkJCWJyZWFrOworCQkJfQorCisJCQljYXNlIHozOjp1bmtub3duOgorCQkJeworCQkJCXNhdGlzZmlhYmlsaXR5ID0gU29sdmVyRGVmOjpVTktOT1dOX1NBVDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQlzYXRpc2ZpYWJpbGl0eSA9IFNvbHZlckRlZjo6QUJPUlRfU0FUOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCitkZXN0cm95Q2hlY2tlcigpOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU01UX1NPTFZJTkcgKQorCUFWTV9PU19UUkFDRSA8PCAicmVzdWx0IDoiIDw8IFNPTFZFUl9TRVNTSU9OX0lEIDw8ICI+ICIKKwkJCTw8IFNvbHZlckRlZjo6c3RyU2F0aXNmaWFiaWxpdHkoc2F0aXNmaWFiaWxpdHkpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTTVRfU09MVklORyApCisKKwlyZXR1cm4oIHNhdGlzZmlhYmlsaXR5ICk7Cit9CisKKworLyoqCisgKiBTT0xWRVIKKyAqLworYm9vbCBaM1NvbHZlcjo6c29sdmVJbXBsKGNvbnN0IEJGICYgYUNvbmRpdGlvbiwKKwkJQkZWZWN0b3IgJiBkYXRhVmVjdG9yLCBCRlZlY3RvciAmIHZhbHVlc1ZlY3RvcikKK3sKKwlTb2x2ZXJEZWY6OlNBVElTRklBQklMSVRZX1JJTkcgc2F0aXNmaWFiaWxpdHkgPSBTb2x2ZXJEZWY6OlNBVElTRklBQkxFOworCisJejM6OmNvbmZpZyBjZmc7CisJejM6OmNvbnRleHQgY3R4OworCWNyZWF0ZUNoZWNrZXIoY2ZnLCBjdHgpOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU01UX1NPTFZJTkcgKQorCUFWTV9PU19UUkFDRSA8PCAiWjNTb2x2ZXI6OnNvbHZlKC4uLikgOiIKKwkJCTw8IFNPTFZFUl9TRVNTSU9OX0lEIDw8ICI+IiA8PCBzdGQ6OmVuZGwKKwkJCTw8ICJcdCIgPDwgYUNvbmRpdGlvbi5zdHIoKSA8PCBzdGQ6OmVuZGw7CisKKwkvLyB0cmFjZSB0byBmaWxlCisJc210X2NoZWNrX21vZGVsKGFDb25kaXRpb24sIGRhdGFWZWN0b3IsIHZhbHVlc1ZlY3Rvcik7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU01UX1NPTFZJTkcgKQorCisJejM6OmV4cHIgejNDb25kaXRpb24gPSBmcm9tX2Jhc2Vmb3JtKGFDb25kaXRpb24pOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU01UX1NPTFZJTkcgKQorCUFWTV9PU19UUkFDRSA8PCAiWjNDb25kaXRpb24gOiIgPDwgU09MVkVSX1NFU1NJT05fSUQgPDwgIj4iIDw8IHN0ZDo6ZW5kbAorCQkJPDwgIlx0IiA8PCB6M0NvbmRpdGlvbiA8PCBzdGQ6OmVuZGw7CitBVk1fSUZfREVCVUdfTEVWRUxfR1RFX0hJR0gKKwlBVk1fT1NfVFJBQ0UgPDwgIlozOjpDVFggOiIgPDwgU09MVkVSX1NFU1NJT05fSUQgPDwgIj4iIDw8IHN0ZDo6ZW5kbAorCQkJPDwgY3R4IDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9HVEVfSElHSAorQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNNVF9TT0xWSU5HICkKKworCXozOjpzb2x2ZXIgejNTb2x2ZXIoKkNUWCk7CisKKwl6M1NvbHZlci5hZGQoIHozQ29uZGl0aW9uICk7CisKKwlzd2l0Y2goIHozU29sdmVyLmNoZWNrKCkgKQorCXsKKwkJY2FzZSB6Mzo6c2F0OgorCQl7CisJCQlzYXRpc2ZpYWJpbGl0eSA9IFNvbHZlckRlZjo6U0FUSVNGSUFCTEU7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgejM6OnVuc2F0OgorCQl7CisJCQlzYXRpc2ZpYWJpbGl0eSA9IFNvbHZlckRlZjo6VU5TQVRJU0ZJQUJMRTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSB6Mzo6dW5rbm93bjoKKwkJeworCQkJc2F0aXNmaWFiaWxpdHkgPSBTb2x2ZXJEZWY6OlVOS05PV05fU0FUOworCQkJYnJlYWs7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlzYXRpc2ZpYWJpbGl0eSA9IFNvbHZlckRlZjo6QUJPUlRfU0FUOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvL2lmKCB6M0NvbmRpdGlvbiAhPSBOVUxMICkKKwl7CisJCXozOjpzb2x2ZXIgejNTb2x2ZXIoKkNUWCk7CisKKwkJejNTb2x2ZXIuYWRkKCB6M0NvbmRpdGlvbiApOworCisJCXN3aXRjaCggejNTb2x2ZXIuY2hlY2soKSApCisJCXsKKwkJCWNhc2UgejM6OnNhdDoKKwkJCXsKKwkJCQlzYXRpc2ZpYWJpbGl0eSA9IFNvbHZlckRlZjo6U0FUSVNGSUFCTEU7CisKKwkJCQl6Mzo6bW9kZWwgejNNb2RlbCA9IHozU29sdmVyLmdldF9tb2RlbCgpOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU01UX1NPTFZJTkcgKQorCUFWTV9PU19UUkFDRSA8PCAiWjNNb2RlbCBzYXQ6IiA8PCBTT0xWRVJfU0VTU0lPTl9JRCA8PCAiPiIKKwkJCTw8IHN0ZDo6ZW5kbCA8PCB6M01vZGVsIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTTVRfU09MVklORyApCisKKwkJCQl1bnNpZ25lZCBudW1fY29uc3RhbnRzID0gejNNb2RlbC5udW1fY29uc3RzKCk7CisJCQkJZm9yKCB1bnNpZ25lZCBpID0gMCA7IGkgPCBudW1fY29uc3RhbnRzIDsgaSsrICkKKwkJCQl7CisJCQkJCXozOjpmdW5jX2RlY2wgcGFyYW1EZWNsID0gejNNb2RlbC5nZXRfY29uc3RfZGVjbChpKTsKKworCQkJCQl6Mzo6c3ltYm9sIHBhcmFtU3ltYm9sID0gejNNb2RlbC5nZXRfY29uc3RfZGVjbChpKS5uYW1lKCk7CisKKwkJCQkJejM6OmV4cHIgdmFsdWUgPSB6M01vZGVsLmdldF9jb25zdF9pbnRlcnAocGFyYW1EZWNsKTsKKworCQkJCQlpbnQgb2Zmc2V0ID0gbVRhYmxlT2ZQYXJhbWV0ZXJEZWNsLmZpbmQocGFyYW1TeW1ib2wpOworCQkJCQlpZiggb2Zmc2V0ID49IDAgKQorCQkJCQl7CisJCQkJCQlkYXRhVmVjdG9yLmFwcGVuZCggbVRhYmxlT2ZQYXJhbWV0ZXJJbnN0YW5jZVtvZmZzZXRdICk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTTVRfU09MVklORyApCisJQVZNX09TX1RSQUNFIDw8IHBhcmFtU3ltYm9sIDw8ICIgOj0gIjsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTTVRfU09MVklORyApCisKKwkJCQkJCUJGIGJmVmFsID0gdG9fYmFzZWZvcm0oIHozTW9kZWwsIHZhbHVlKTsKKworCQkJCQkJdmFsdWVzVmVjdG9yLmFwcGVuZCggYmZWYWwudmFsaWQoKSA/CisJCQkJCQkJCWJmVmFsIDogZGF0YVZlY3Rvci5iYWNrKCkgKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNNVF9TT0xWSU5HICkKKwlBVk1fT1NfVFJBQ0UgPDwgdmFsdWUgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNNVF9TT0xWSU5HICkKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQkJCTw8ICJaM1NvbHZlcjo6c29sdmUgOj4gdW5mb3VuZCAiCisJCQkJCQkJCQkicGFyYW1ldGVyIGluc3RhbmNlIGZvciBaMyBzeW1ib2wgPDwgIgorCQkJCQkJCQk8PCBwYXJhbVN5bWJvbCA8PCAiID4+ICEhISIKKwkJCQkJCQkJPDwgU0VORF9FWElUOworCQkJCQl9CisJCQkJfQorCisKKwkJCQlicmVhazsKKwkJCQkJCQlicmVhazsKKwkJCX0KKworCQkJY2FzZSB6Mzo6dW5zYXQ6CisJCQl7CisJCQkJc2F0aXNmaWFiaWxpdHkgPSBTb2x2ZXJEZWY6OlVOU0FUSVNGSUFCTEU7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNhc2UgejM6OnVua25vd246CisJCQl7CisJCQkJc2F0aXNmaWFiaWxpdHkgPSBTb2x2ZXJEZWY6OlVOS05PV05fU0FUOworCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJc2F0aXNmaWFiaWxpdHkgPSBTb2x2ZXJEZWY6OkFCT1JUX1NBVDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWRlc3Ryb3lDaGVja2VyKCk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTTVRfU09MVklORyApCisJQVZNX09TX1RSQUNFIDw8ICJzb2x2ZSA6IiA8PCBTT0xWRVJfU0VTU0lPTl9JRCA8PCAiPiAiCisJCQk8PCBTb2x2ZXJEZWY6OnN0clNhdGlzZmlhYmlsaXR5KHNhdGlzZmlhYmlsaXR5KSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU01UX1NPTFZJTkcgKQorCisJcmV0dXJuKCBzYXRpc2ZpYWJpbGl0eSA9PSBTb2x2ZXJEZWY6OlNBVElTRklBQkxFICk7Cit9CisKKworCisvKioKKyAqIFRPT0xTCisgKi8KK3ozOjpzb3J0IFozU29sdmVyOjpnZXRaM1R5cGUoQmFzZVR5cGVTcGVjaWZpZXIgKiBidHMpCit7CisJaWYoIGJ0cy0+aXNUeXBlZEJvb2xlYW4oKSApCisJeworCQlyZXR1cm4oIENUWC0+Ym9vbF9zb3J0KCkgKTsKKwl9CisKKwllbHNlIGlmKCBidHMtPmlzVHlwZWRFbnVtKCkgKQorCXsKKwkJcmV0dXJuKCBDVFgtPmludF9zb3J0KCkgKTsKKwkJLy8gVE9ETyBBdHRlbnRpb24gOiBpbCBmYXVkcmFpdCByYWpvdXRlciBsZXMgY29udHJhaW50ZXMKKwkJLy8gZCdpbnRlcnZhbGxlIHBvdXIgbGUgdHlwZSDDqW51bcOpcsOpCisJfQorCWVsc2UgaWYoIGJ0cy0+d2Vha2x5VHlwZWRJbnRlZ2VyKCkgKQorCXsKKwkJcmV0dXJuKCBDVFgtPmludF9zb3J0KCkgKTsKKwl9CisKKwllbHNlIGlmKCBidHMtPndlYWtseVR5cGVkUmVhbCgpICkKKwl7CisJCXJldHVybiggQ1RYLT5yZWFsX3NvcnQoKSApOworCX0KKworCXJldHVybiggQ1RYLT5yZWFsX3NvcnQoKSApOworfQorCisKK3ozOjpleHByIFozU29sdmVyOjpnZXRQYXJhbWV0ZXJFeHByKGNvbnN0IEJGICYgYmZQYXJhbWV0ZXIpCit7CisJSW5zdGFuY2VPZkRhdGEgKiBhUGFyYW1ldGVyID0gYmZQYXJhbWV0ZXIudG9fcHRyPCBJbnN0YW5jZU9mRGF0YSA+KCk7CisKKwlpZiggYVBhcmFtZXRlci0+Z2V0TWFyaygpID09IDAgKQorCXsKKwkJYVBhcmFtZXRlci0+c2V0TWFyayggbVRhYmxlT2ZQYXJhbWV0ZXJJbnN0YW5jZS5zaXplKCkgKTsKKwkJbVRhYmxlT2ZQYXJhbWV0ZXJJbnN0YW5jZS5hcHBlbmQoIGJmUGFyYW1ldGVyICk7CisKKwkJbVRhYmxlT2ZQYXJhbWV0ZXJEZWNsLnB1c2hfYmFjaygKKwkJCQlDVFgtPnN0cl9zeW1ib2woYVBhcmFtZXRlci0+Z2V0TmFtZUlEKCkuY19zdHIoKSkgKTsKKworCQltVGFibGVPZlBhcmFtZXRlckV4cHIucHVzaF9iYWNrKAorCQkJCUNUWC0+Y29uc3RhbnQobVRhYmxlT2ZQYXJhbWV0ZXJEZWNsLmxhc3QoKSwKKwkJCQkJCWdldFozVHlwZShhUGFyYW1ldGVyLT5yZWZlcmVkVHlwZVNwZWNpZmllcigpKSkgKTsKKwl9CisKKwlyZXR1cm4oIG1UYWJsZU9mUGFyYW1ldGVyRXhwci5hdCggYVBhcmFtZXRlci0+Z2V0TWFyaygpICkgKTsKK30KKworCisKKworejM6OmV4cHIgWjNTb2x2ZXI6OmdldFZhcmlhYmxlRXhwcihJbnN0YW5jZU9mRGF0YSAqIGFWYXIsIHN0ZDo6c2l6ZV90IHZhcklEKQoreworCWlmKCBtVGFibGVPZlZhcmlhYmxlRXhwci5zaXplKCkgPD0gdmFySUQgKQorCXsKKwkJbVRhYmxlT2ZWYXJpYWJsZURlY2wucHVzaF9iYWNrKAorCQkJCUNUWC0+c3RyX3N5bWJvbChhVmFyLT5nZXROYW1lSUQoKS5jX3N0cigpKSApOworCisJCW1UYWJsZU9mVmFyaWFibGVFeHByLnB1c2hfYmFjaygKKwkJCQlDVFgtPmNvbnN0YW50KG1UYWJsZU9mVmFyaWFibGVEZWNsLmxhc3QoKSwKKwkJCQkJCWdldFozVHlwZShhVmFyLT5nZXRUeXBlU3BlY2lmaWVyKCkpKSApOworCQl9CisKKwlyZXR1cm4oIG1UYWJsZU9mVmFyaWFibGVFeHByLmF0KCB2YXJJRCApICk7Cit9CisKKworejM6OmV4cHIgWjNTb2x2ZXI6OnNhZmVfZnJvbV9iYXNlZm9ybShjb25zdCBCRiAmIGV4cHJGb3JtLAorCQlCYXNlVHlwZVNwZWNpZmllciAqIHR5cGVTcGVjaWZpZXIpCit7CisJejM6OmV4cHIgZSgqQ1RYKTsKKworCXRyeQorCXsKKwkJZSA9IGZyb21fYmFzZWZvcm0oZXhwckZvcm0sIHR5cGVTcGVjaWZpZXIpOworCisJCWRlc3Ryb3lDaGVja2VyKCk7CisJfQorCWNhdGNoICggLi4uICkKKwl7CisJCUFWTV9PU19XQVJOIDw8IHN0ZDo6ZW5kbCA8PCBSRVBFQVQoIioqKioqKioqIiwgMTApIDw8IHN0ZDo6ZW5kbAorCQkJCTw8ICJcdFozU29sdmVyOjpzYWZlX2Zyb21fYmFzZWZvcm08IHVua25vd246OmV4Y2VwdGlvbiA6IgorCQkJCTw8IFNPTFZFUl9TRVNTSU9OX0lEIDw8ICI+IiA8PCBzdGQ6OmVuZGwKKwkJCQk8PCBSRVBFQVQoIi0tLS0tLS0tIiwgMTApIDw8IHN0ZDo6ZW5kbAorCQkJCTw8ICJcdEZhaWxlZCB0byBDT05WRVJUIHNlcDo6Zm1sOjpleHByZXNzaW9uIHRvIFozOjpFeHByOj4iIDw8IHN0ZDo6ZW5kbAorCQkJCTw8ICJcdCAgIiA8PCBleHByRm9ybS5zdHIoIiAiKSA8PCBzdGQ6OmVuZGwKKwkJCQk8PCBSRVBFQVQoIioqKioqKioqIiwgMTApIDw8IHN0ZDo6ZW5kbDsKKworCQlkZXN0cm95Q2hlY2tlcigpOworCX0KKworCXJldHVybiggZSApOworfQorCisKK3ozOjpleHByIFozU29sdmVyOjpmcm9tX2Jhc2Vmb3JtKGNvbnN0IEJGICYgZXhwckZvcm0sCisJCUJhc2VUeXBlU3BlY2lmaWVyICogdHlwZVNwZWNpZmllcikKK3sKKwlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfU01BUlRfUE9JTlRFUl9FWElUKCBleHByRm9ybSApIDw8ICJleHByZXNzaW9uICEhISIKKwkJCTw8IFNFTkRfRVhJVDsKKworCisJc3dpdGNoKCBleHByRm9ybS5jbGFzc0tpbmQoKSApCisJeworCQljYXNlIEZPUk1fQVZNQ09ERV9LSU5EOgorCQl7CisJCQlBdm1Db2RlICogYUNvZGUgPSBleHByRm9ybS50b19wdHI8IEF2bUNvZGUgPigpOworCisJCQl0eXBlU3BlY2lmaWVyID0gVHlwZU1hbmFnZXI6OlVOSVZFUlNBTDsKKworCQkJc3dpdGNoKCBhQ29kZS0+Z2V0QXZtT3BDb2RlKCkgKQorCQkJeworCQkJCS8vIENPTVBBUklTT04gT1BFUkFUSU9OCisJCQkJY2FzZSBBVk1fT1BDT0RFX0VROgorCQkJCXsKKwkJCQkJcmV0dXJuKCBmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5maXJzdCgpICwgdHlwZVNwZWNpZmllcikgPT0KKwkJCQkJCQlmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5zZWNvbmQoKSwgdHlwZVNwZWNpZmllcikgKTsKKwkJCQl9CisKKwkJCQljYXNlIEFWTV9PUENPREVfTkVROgorCQkJCXsKKwkJCQkJcmV0dXJuKCBmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5maXJzdCgpICwgdHlwZVNwZWNpZmllcikgIT0KKwkJCQkJCQlmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5zZWNvbmQoKSwgdHlwZVNwZWNpZmllcikgKTsKKworLy8JCQkJCUFSR1MgYXJnKCAyICk7CisvLworLy8JCQkJCWFyZy5uZXh0KCBmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5maXJzdCgpICwgdHlwZVNwZWNpZmllcikgKTsKKy8vCQkJCQlhcmcubmV4dCggZnJvbV9iYXNlZm9ybShhQ29kZS0+c2Vjb25kKCksIHR5cGVTcGVjaWZpZXIpICk7CisvLworLy8JCQkJCXJldHVybiggWjNfbWtfZGlzdGluY3QoQ1RYLCAyLCBhcmctPnRhYmxlKSApOworCQkJCX0KKworCQkJCWNhc2UgQVZNX09QQ09ERV9MVDoKKwkJCQl7CisJCQkJCXJldHVybiggZnJvbV9iYXNlZm9ybShhQ29kZS0+Zmlyc3QoKSAsIHR5cGVTcGVjaWZpZXIpIDwKKwkJCQkJCQlmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5zZWNvbmQoKSwgdHlwZVNwZWNpZmllcikgKTsKKwkJCQl9CisKKwkJCQljYXNlIEFWTV9PUENPREVfTFRFOgorCQkJCXsKKwkJCQkJcmV0dXJuKCBmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5maXJzdCgpICwgdHlwZVNwZWNpZmllcikgPD0KKwkJCQkJCQlmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5zZWNvbmQoKSwgdHlwZVNwZWNpZmllcikgKTsKKwkJCQl9CisKKwkJCQljYXNlIEFWTV9PUENPREVfR1Q6CisJCQkJeworCQkJCQlyZXR1cm4oIGZyb21fYmFzZWZvcm0oYUNvZGUtPmZpcnN0KCkgLCB0eXBlU3BlY2lmaWVyKSA+CisJCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+c2Vjb25kKCksIHR5cGVTcGVjaWZpZXIpICk7CisJCQkJfQorCisJCQkJY2FzZSBBVk1fT1BDT0RFX0dURToKKwkJCQl7CisJCQkJCXJldHVybiggZnJvbV9iYXNlZm9ybShhQ29kZS0+Zmlyc3QoKSAsIHR5cGVTcGVjaWZpZXIpID49CisJCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+c2Vjb25kKCksIHR5cGVTcGVjaWZpZXIpICk7CisJCQkJfQorCisKKwkJCQljYXNlIEFWTV9PUENPREVfQ09OVEFJTlM6CisJCQkJeworCQkJCQlCdWlsdGluQ29sbGVjdGlvbiAqIGFDb2xsZWN0aW9uID0KKwkJCQkJCQlhQ29kZS0+Zmlyc3QoKS50b19wdHI8IEJ1aWx0aW5Db2xsZWN0aW9uID4oKTsKKworCQkJCQlpZiggYUNvbGxlY3Rpb24tPnNpbmdsZXRvbigpICkKKwkJCQkJeworCQkJCQkJcmV0dXJuKCBmcm9tX2Jhc2Vmb3JtKGFDb2xsZWN0aW9uLT5hdCgwKSwgdHlwZVNwZWNpZmllcikgPT0KKwkJCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+c2Vjb25kKCksIHR5cGVTcGVjaWZpZXIpICk7CisJCQkJCX0KKwkJCQkJZWxzZSBpZiggYUNvbGxlY3Rpb24tPnBvcHVsYXRlZCgpICkKKwkJCQkJeworCQkJCQkJc3RkOjpzaXplX3QgY29sU2l6ZSA9IGFDb2xsZWN0aW9uLT5zaXplKCk7CisJCQkJCQljb25zdCBCRiAmIGVsdCA9IGFDb2RlLT5zZWNvbmQoKTsKKworCQkJCQkJejM6OmV4cHIgejNPciA9ICggZnJvbV9iYXNlZm9ybShlbHQsIHR5cGVTcGVjaWZpZXIpID09CisJCQkJCQkJCWZyb21fYmFzZWZvcm0oYUNvbGxlY3Rpb24tPmF0KDApLCB0eXBlU3BlY2lmaWVyKSApOworCisJCQkJCQlmb3IoIHN0ZDo6c2l6ZV90IG9mZnNldCA9IDEgOyBvZmZzZXQgPCBjb2xTaXplIDsgKytvZmZzZXQgKQorCQkJCQkJeworCQkJCQkJCXozT3IgPSB6M09yIHx8IChmcm9tX2Jhc2Vmb3JtKGVsdCwgdHlwZVNwZWNpZmllcikgPT0KKwkJCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29sbGVjdGlvbi0+YXQob2Zmc2V0KSwgdHlwZVNwZWNpZmllcikpOworCQkJCQkJfQorCisJCQkJCQlyZXR1cm4oIHozT3IgKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXJldHVybiggKCh0eXBlU3BlY2lmaWVyICE9IE5VTEwpICYmCisJCQkJCQkJCXR5cGVTcGVjaWZpZXItPmlzVHlwZWRCb29sZWFuKCkpID8KKwkJCQkJCQkJCQlDVFgtPmJvb2xfdmFsKGZhbHNlKSA6IENUWC0+aW50X3ZhbCgwKSApOworCQkJCQl9CisJCQkJfQorCisKKwkJCQkvLyBMT0dJQ0FMIE9QRVJBVElPTgorCQkJCWNhc2UgQVZNX09QQ09ERV9OT1Q6CisJCQkJeworCQkJCQlyZXR1cm4oIG5vdCBmcm9tX2Jhc2Vmb3JtKAorCQkJCQkJCWFDb2RlLT5maXJzdCgpLCBUeXBlTWFuYWdlcjo6Qk9PTEVBTikgKTsKKwkJCQl9CisKKwkJCQljYXNlIEFWTV9PUENPREVfQU5EOgorCQkJCXsKKwkJCQkJejM6OmV4cHIgejNBbmQgPQorCQkJCQkJCWZyb21fYmFzZWZvcm0oYUNvZGUtPmZpcnN0KCksIFR5cGVNYW5hZ2VyOjpCT09MRUFOKSAmJgorCQkJCQkJCWZyb21fYmFzZWZvcm0oYUNvZGUtPnNlY29uZCgpLCBUeXBlTWFuYWdlcjo6Qk9PTEVBTik7CisKKwkJCQkJZm9yKCBzdGQ6OnNpemVfdCBvZmZzZXQgPSAyIDsgb2Zmc2V0IDwgYUNvZGUtPnNpemUoKSA7ICsrb2Zmc2V0ICkKKwkJCQkJeworCQkJCQkJejNBbmQgPSB6M0FuZCAmJiBmcm9tX2Jhc2Vmb3JtKAorCQkJCQkJCQlhQ29kZS0+YXQob2Zmc2V0KSwgVHlwZU1hbmFnZXI6OkJPT0xFQU4pOworCQkJCQl9CisKKwkJCQkJcmV0dXJuKCB6M0FuZCApOworCQkJCX0KKworCQkJCWNhc2UgQVZNX09QQ09ERV9OQU5EOgorCQkJCXsKKwkJCQkJejM6OmV4cHIgejNBbmQgPQorCQkJCQkJCWZyb21fYmFzZWZvcm0oYUNvZGUtPmZpcnN0KCksIFR5cGVNYW5hZ2VyOjpCT09MRUFOKSAmJgorCQkJCQkJCWZyb21fYmFzZWZvcm0oYUNvZGUtPnNlY29uZCgpLCBUeXBlTWFuYWdlcjo6Qk9PTEVBTik7CisKKwkJCQkJZm9yKCBzdGQ6OnNpemVfdCBvZmZzZXQgPSAyIDsgb2Zmc2V0IDwgYUNvZGUtPnNpemUoKSA7ICsrb2Zmc2V0ICkKKwkJCQkJeworCQkJCQkJejNBbmQgPSB6M0FuZCAmJiBmcm9tX2Jhc2Vmb3JtKAorCQkJCQkJCQlhQ29kZS0+YXQob2Zmc2V0KSwgVHlwZU1hbmFnZXI6OkJPT0xFQU4pOworCQkJCQl9CisKKwkJCQkJcmV0dXJuKCBub3QgejNBbmQgKTsKKwkJCQl9CisKKy8vCQkJCWNhc2UgQVZNX09QQ09ERV9YQU5EOgorCisJCQkJY2FzZSBBVk1fT1BDT0RFX09SOgorCQkJCXsKKwkJCQkJejM6OmV4cHIgejNPciA9CisJCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+Zmlyc3QoKSwgVHlwZU1hbmFnZXI6OkJPT0xFQU4pIHx8CisJCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+c2Vjb25kKCksIFR5cGVNYW5hZ2VyOjpCT09MRUFOKTsKKworCQkJCQlmb3IoIHN0ZDo6c2l6ZV90IG9mZnNldCA9IDIgOyBvZmZzZXQgPCBhQ29kZS0+c2l6ZSgpIDsgKytvZmZzZXQgKQorCQkJCQl7CisJCQkJCQl6M09yID0gejNPciB8fCBmcm9tX2Jhc2Vmb3JtKAorCQkJCQkJCQlhQ29kZS0+YXQob2Zmc2V0KSwgVHlwZU1hbmFnZXI6OkJPT0xFQU4pOworCQkJCQl9CisKKwkJCQkJcmV0dXJuKCB6M09yICk7CisJCQkJfQorCisJCQkJY2FzZSBBVk1fT1BDT0RFX05PUjoKKwkJCQl7CisJCQkJCXozOjpleHByIHozT3IgPQorCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+Zmlyc3QoKSwgVHlwZU1hbmFnZXI6OkJPT0xFQU4pIHx8CisJCQkJCQlmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5zZWNvbmQoKSwgVHlwZU1hbmFnZXI6OkJPT0xFQU4pOworCisJCQkJCWZvciggc3RkOjpzaXplX3Qgb2Zmc2V0ID0gMiA7IG9mZnNldCA8IGFDb2RlLT5zaXplKCkgOyArK29mZnNldCApCisJCQkJCXsKKwkJCQkJCXozT3IgPSB6M09yIHx8IGZyb21fYmFzZWZvcm0oCisJCQkJCQkJCWFDb2RlLT5hdChvZmZzZXQpLCBUeXBlTWFuYWdlcjo6Qk9PTEVBTik7CisJCQkJCX0KKworCQkJCQlyZXR1cm4oIG5vdCB6M09yICk7CisJCQkJfQorCisKKwkJCQkvLyBCSVRXSVNFIE9QRVJBVElPTgorLy8JCQkJY2FzZSBBVk1fT1BDT0RFX0JBTkQ6CisvLwkJCQljYXNlIEFWTV9PUENPREVfQk9SOgorLy8JCQkJY2FzZSBBVk1fT1BDT0RFX0xTSElGVDoKKy8vCQkJCWNhc2UgQVZNX09QQ09ERV9SU0hJRlQ6CisKKwkJCQljYXNlIEFWTV9PUENPREVfWE9SOgorCQkJCXsKKwkJCQkJejM6OmV4cHIgYXJnMCA9IGZyb21fYmFzZWZvcm0oCisJCQkJCQkJYUNvZGUtPmZpcnN0KCksIFR5cGVNYW5hZ2VyOjpCT09MRUFOKTsKKworCQkJCQl6Mzo6ZXhwciBhcmcxID0gZnJvbV9iYXNlZm9ybSgKKwkJCQkJCQlhQ29kZS0+c2Vjb25kKCksIFR5cGVNYW5hZ2VyOjpCT09MRUFOKTsKKworCQkJCQlyZXR1cm4oIChhcmcwICYmICghIGFyZzEpKSB8fCAoKCEgYXJnMCkgJiYgYXJnMSkgKTsKKwkJCQl9CisKKy8vCQkJCWNhc2UgQVZNX09QQ09ERV9YTk9SOgorCisKKwkJCQkvLyBBUklUSE1FVElDIE9QRVJBVElPTgorCQkJCWNhc2UgQVZNX09QQ09ERV9QTFVTOgorCQkJCXsKKwkJCQkJejM6OmV4cHIgejNQbHVzID0KKwkJCQkJCQlmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5maXJzdCgpLCB0eXBlU3BlY2lmaWVyKSArCisJCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+c2Vjb25kKCksIHR5cGVTcGVjaWZpZXIpOworCisJCQkJCWZvciggc3RkOjpzaXplX3Qgb2Zmc2V0ID0gMiA7IG9mZnNldCA8IGFDb2RlLT5zaXplKCkgOyArK29mZnNldCApCisJCQkJCXsKKwkJCQkJCXozUGx1cyA9IHozUGx1cyArCisJCQkJCQkJCWZyb21fYmFzZWZvcm0oYUNvZGUtPmF0KG9mZnNldCksIHR5cGVTcGVjaWZpZXIpOworCQkJCQl9CisKKwkJCQkJcmV0dXJuKCB6M1BsdXMgKTsKKwkJCQl9CisKKwkJCQljYXNlIEFWTV9PUENPREVfVU1JTlVTOgorCQkJCXsKKwkJCQkJcmV0dXJuKCAtIGZyb21fYmFzZWZvcm0oYUNvZGUtPmZpcnN0KCksIHR5cGVTcGVjaWZpZXIpICk7CisJCQkJfQorCisJCQkJY2FzZSBBVk1fT1BDT0RFX01JTlVTOgorCQkJCXsKKwkJCQkJejM6OmV4cHIgejNNaW51cyA9CisJCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+Zmlyc3QoKSwgdHlwZVNwZWNpZmllcikgLQorCQkJCQkJCWZyb21fYmFzZWZvcm0oYUNvZGUtPnNlY29uZCgpLCB0eXBlU3BlY2lmaWVyKTsKKworCQkJCQlmb3IoIHN0ZDo6c2l6ZV90IG9mZnNldCA9IDIgOyBvZmZzZXQgPCBhQ29kZS0+c2l6ZSgpIDsgKytvZmZzZXQgKQorCQkJCQl7CisJCQkJCQl6M01pbnVzID0gejNNaW51cyAtCisJCQkJCQkJCWZyb21fYmFzZWZvcm0oYUNvZGUtPmF0KG9mZnNldCksIHR5cGVTcGVjaWZpZXIpOworCQkJCQl9CisKKwkJCQkJcmV0dXJuKCB6M01pbnVzICk7CisJCQkJfQorCisJCQkJY2FzZSBBVk1fT1BDT0RFX01VTFQ6CisJCQkJeworCQkJCQl6Mzo6ZXhwciB6M011bHQgPQorCQkJCQkJCWZyb21fYmFzZWZvcm0oYUNvZGUtPmZpcnN0KCksIHR5cGVTcGVjaWZpZXIpICoKKwkJCQkJCQlmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5zZWNvbmQoKSwgdHlwZVNwZWNpZmllcik7CisKKwkJCQkJZm9yKCBzdGQ6OnNpemVfdCBvZmZzZXQgPSAyIDsgb2Zmc2V0IDwgYUNvZGUtPnNpemUoKSA7ICsrb2Zmc2V0ICkKKwkJCQkJeworCQkJCQkJejNNdWx0ID0gejNNdWx0ICoKKwkJCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+YXQob2Zmc2V0KSwgdHlwZVNwZWNpZmllcik7CisJCQkJCX0KKworCQkJCQlyZXR1cm4oIHozTXVsdCApOworCQkJCX0KKworCQkJCWNhc2UgQVZNX09QQ09ERV9ESVY6CisJCQkJeworCQkJCQlyZXR1cm4oIGZyb21fYmFzZWZvcm0oYUNvZGUtPmZpcnN0KCkgLCB0eXBlU3BlY2lmaWVyKSAvCisJCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+c2Vjb25kKCksIHR5cGVTcGVjaWZpZXIpICk7CisJCQkJfQorCisJCQkJY2FzZSBBVk1fT1BDT0RFX1BPVzoKKwkJCQl7CisKKy8vCQkJCQlpZiggRXhwcmVzc2lvbkZhY3Rvcnk6OmlzSW50MzIoYUNvZGUtPnNlY29uZCgpKSApCisvLwkJCQkJeworLy8JCQkJCQlyZXR1cm4oIHN0ZDo6cHcoCisvLwkJCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+Zmlyc3QoKSAsIHR5cGVTcGVjaWZpZXIpLAorLy8JCQkJCQkJCWZyb21fYmFzZWZvcm0oYUNvZGUtPnNlY29uZCgpICwgdHlwZVNwZWNpZmllcikgKSApOworLy8JCQkJCX0KKy8vCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQkJCTw8ICJaM1NvbHZlcjo6ZnJvbV9iYXNlZm9ybTo+ICIKKwkJCQkJCQkJCSJVbnN1cHBvcnRlZCBleHByZXNzaW9uIE9wZXJhdG9yICIKKwkJCQkJCQkJCSI8PCBBVk1fT1BDT0RFX1BPVyA+PiAhISEiCisJCQkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCQkJcmV0dXJuKCB6Mzo6ZXhwcigqQ1RYKSApOworCQkJCQl9CisJCQkJfQorCisvLwkJCQljYXNlIEFWTV9PUENPREVfTU9EOgorCisJCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQkJPDwgIlozU29sdmVyOjpmcm9tX2Jhc2Vmb3JtOj4gIgorCQkJCQkJCQkiVW5leHBlY3RlZCBleHByZXNzaW9uICEhIVxuIgorCQkJCQkJCTw8IGFDb2RlLT50b1N0cmluZyggQVZNX1RBQjFfSU5ERU5UICkKKwkJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQkJcmV0dXJuKCB6Mzo6ZXhwcigqQ1RYKSApOworCQkJCX0KKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEZPUk1fSU5TVEFOQ0VfREFUQV9LSU5EOgorCQl7CisJCQlyZXR1cm4oIGdldFBhcmFtZXRlckV4cHIoIGV4cHJGb3JtICkgKTsKKwkJfQorCisJCWNhc2UgRk9STV9CVUlMVElOX0JPT0xFQU5fS0lORDoKKwkJeworCQkJcmV0dXJuKCBDVFgtPmJvb2xfdmFsKAorCQkJCQlleHByRm9ybS50b19wdHI8IEJvb2xlYW4gPigpLT5nZXRWYWx1ZSgpICkgKTsKKwkJfQorCisJCWNhc2UgRk9STV9CVUlMVElOX0lOVEVHRVJfS0lORDoKKwkJeworCQkJaWYoICh0eXBlU3BlY2lmaWVyICE9IE5VTEwpICYmIHR5cGVTcGVjaWZpZXItPmlzVHlwZWRCb29sZWFuKCkgKQorCQkJeworLy8JCQkJcmV0dXJuKCBDVFgtPmJvb2xfdmFsKAorLy8JCQkJCQlub3QgZXhwckZvcm0udG9fcHRyPCBJbnRlZ2VyID4oKS0+aXNaZXJvKCkgKSApOworCisJCQkJcmV0dXJuKCBleHByRm9ybS50b19wdHI8IEludGVnZXIgPigpLT5pc1plcm8oKSA/CisJCQkJCQlTTVRfQ1NUX0JPT0xfRkFMU0UgOiBTTVRfQ1NUX0JPT0xfVFJVRSApOworCQkJfQorCQkJZWxzZQorCQkJeworI2lmIGRlZmluZWQoIF9BVk1fQlVJTFRJTl9OVU1FUklDX0dNUF8gKQorCisJCQkJcmV0dXJuKCBDVFgtPmludF92YWwoIHN0YXRpY19jYXN0PCBfX2ludDY0ID4oCisJCQkJCQlleHByRm9ybS50b19wdHI8IEludGVnZXIgPigpLT50b0ludGVnZXIoKSApICkgKTsKKworI2Vsc2UKKworCQkJCXJldHVybiggQ1RYLT5pbnRfdmFsKCBzdGF0aWNfY2FzdDwgX19pbnQ2NCA+KAorCQkJCQkJZXhwckZvcm0udG9fcHRyPCBJbnRlZ2VyID4oKS0+dG9JbnRlZ2VyKCkgKSApICk7CisKKyNlbmRpZiAvKiBfQVZNX0JVSUxUSU5fTlVNRVJJQ19HTVBfICovCisJCQl9CisKKy8vCQkJcmV0dXJuKCBDVFgtPmludF92YWwoIGV4cHJGb3JtLnRvX3B0cjwgSW50ZWdlciA+KCktPnN0cigpLmNfc3RyKCkgKSApOworCQl9CisKKwkJY2FzZSBGT1JNX0JVSUxUSU5fUkFUSU9OQUxfS0lORDoKKwkJeworCQkJaWYoICh0eXBlU3BlY2lmaWVyICE9IE5VTEwpICYmIHR5cGVTcGVjaWZpZXItPmlzVHlwZWRCb29sZWFuKCkgKQorCQkJeworLy8JCQkJcmV0dXJuKCBDVFgtPmJvb2xfdmFsKAorLy8JCQkJCQlub3QgZXhwckZvcm0udG9fcHRyPCBSYXRpb25hbCA+KCktPmlzWmVybygpICkgKTsKKworCQkJCXJldHVybiggZXhwckZvcm0udG9fcHRyPCBSYXRpb25hbCA+KCktPmlzWmVybygpID8KKwkJCQkJCVNNVF9DU1RfQk9PTF9GQUxTRSA6IFNNVF9DU1RfQk9PTF9UUlVFICk7CisJCQl9CisJCQllbHNlCisJCQl7CisjaWYgZGVmaW5lZCggX0FWTV9CVUlMVElOX05VTUVSSUNfR01QXyApCisKKwkJCQlyZXR1cm4oIENUWC0+cmVhbF92YWwoCisJCQkJCQlleHByRm9ybS50b19wdHI8IFJhdGlvbmFsID4oKS0+dG9OdW1lcmF0b3IoKSwKKwkJCQkJCWV4cHJGb3JtLnRvX3B0cjwgUmF0aW9uYWwgPigpLT50b0Rlbm9taW5hdG9yKCkgKSApOworCisjZWxzZQorCisJCQkJcmV0dXJuKCBDVFgtPnJlYWxfdmFsKAorCQkJCQkJZXhwckZvcm0udG9fcHRyPCBSYXRpb25hbCA+KCktPnRvTnVtZXJhdG9yKCksCisJCQkJCQlleHByRm9ybS50b19wdHI8IFJhdGlvbmFsID4oKS0+dG9EZW5vbWluYXRvcigpICkgKTsKKworI2VuZGlmIC8qIF9BVk1fQlVJTFRJTl9OVU1FUklDX0dNUF8gKi8KKwkJCX0KKworLy8JCQlyZXR1cm4oIENUWC0+cmVhbF92YWwoIGV4cHJGb3JtLnRvX3B0cjwgUmF0aW9uYWwgPigpLT5zdHIoKS5jX3N0cigpICkgKTsKKwkJfQorCisJCWNhc2UgRk9STV9CVUlMVElOX0ZMT0FUX0tJTkQ6CisJCXsKKwkJCWlmKCAodHlwZVNwZWNpZmllciAhPSBOVUxMKSAmJiB0eXBlU3BlY2lmaWVyLT5pc1R5cGVkQm9vbGVhbigpICkKKwkJCXsKKy8vCQkJCXJldHVybiggQ1RYLT5ib29sX3ZhbCgKKy8vCQkJCQkJbm90IGV4cHJGb3JtLnRvX3B0cjwgRmxvYXQgPigpLT5pc1plcm8oKSApICk7CisKKwkJCQlyZXR1cm4oIGV4cHJGb3JtLnRvX3B0cjwgRmxvYXQgPigpLT5pc1plcm8oKSA/CisJCQkJCQlTTVRfQ1NUX0JPT0xfRkFMU0UgOiBTTVRfQ1NUX0JPT0xfVFJVRSApOworCQkJfQorCQkJZWxzZQorCQkJeworI2lmIGRlZmluZWQoIF9BVk1fQlVJTFRJTl9OVU1FUklDX0dNUF8gKQorCisJCQkJcmV0dXJuKCBDVFgtPnJlYWxfdmFsKAorCQkJCQkJZXhwckZvcm0udG9fcHRyPCBGbG9hdCA+KCktPnN0cigpLmNfc3RyKCkgKSApOworCisjZWxzZQorCisJCQkJcmV0dXJuKCBDVFgtPnJlYWxfdmFsKAorCQkJCQkJZXhwckZvcm0udG9fcHRyPCBGbG9hdCA+KCktPnN0cigpLmNfc3RyKCkgKSApOworCisjZW5kaWYgLyogX0FWTV9CVUlMVElOX05VTUVSSUNfR01QXyAqLworCQkJfQorCQl9CisKKworCQljYXNlIEZPUk1fUlVOVElNRV9JRF9LSU5EOgorCQl7CisJCQlyZXR1cm4oIENUWC0+aW50X3ZhbCggZXhwckZvcm0uYmZSSUQoKS5nZXRSaWQoKSApICk7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQk8PCAiWjNTb2x2ZXI6OmZyb21fYmFzZWZvcm06PiBVbmV4cGVjdGVkIEJBU0VGT1JNIEtJTkQgPDwgIgorCQkJCQk8PCBleHByRm9ybS5jbGFzc0tpbmROYW1lKCkgPDwgIiA+PiBhcyBleHByZXNzaW9uIDw8ICIKKwkJCQkJPDwgZXhwckZvcm0uc3RyKCkgPDwgIiA+PiAhISEiCisJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJcmV0dXJuKCB6Mzo6ZXhwcigqQ1RYKSApOworCQl9CisJfQorCisJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCTw8ICJaM1NvbHZlcjo6ZnJvbV9iYXNlZm9ybSBFUlJPUiAhISEiCisJCQk8PCBTRU5EX0VYSVQ7CisKKwlyZXR1cm4oIHozOjpleHByKCpDVFgpICk7Cit9CisKKworQkYgWjNTb2x2ZXI6OnRvX2Jhc2Vmb3JtKHozOjptb2RlbCB6M01vZGVsLCB6Mzo6ZXhwciB6M0Zvcm0pCit7CisJc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKwlvc3MgPDwgejNGb3JtOworCisJaWYoIHozRm9ybS5pc19ib29sKCkgKQorCXsKKwkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oIG9zcy5zdHIoKSApICk7CisJfQorCWVsc2UgaWYoIHozRm9ybS5pc19pbnQoKSApCisJeworCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3SW50ZWdlciggb3NzLnN0cigpICkgKTsKKwl9CisJZWxzZSBpZiggejNGb3JtLmlzX3JlYWwoKSApCisJeworCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3RmxvYXQoIG9zcy5zdHIoKSApICk7CisJfQorCisJcmV0dXJuKCBCRjo6UkVGX05VTEwgKTsKK30KKworCisvKioKKyAqIFVzaW5nIGZpbGUgQVBJCisgKi8KKworU29sdmVyRGVmOjpTQVRJU0ZJQUJJTElUWV9SSU5HIFozU29sdmVyOjpzbXRfY2hlY2tfc2F0KGNvbnN0IEJGICYgYUNvbmRpdGlvbikKK3sKKwlTb2x2ZXJEZWY6OlNBVElTRklBQklMSVRZX1JJTkcgc2F0aXNmaWFiaWxpdHkgPSBTb2x2ZXJEZWY6OlNBVElTRklBQkxFOworCisJQkZWZWN0b3IgcGFyYW1WZWN0b3I7CisKKwlTdHJpbmdPdXRTdHJlYW0gb3NzQ29uZGl0aW9uKCIiLCAiXHQiLCAiIik7CisJdG9fc210KG9zc0NvbmRpdGlvbiwgYUNvbmRpdGlvbiwgcGFyYW1WZWN0b3IpOworCisJc3RkOjpzdHJpbmcgZmlsZUxvY2F0aW9uID0gT1NTIDw8IG1Mb2dGb2xkZXJMb2NhdGlvbiwKKwkJCTw8ICJ6M19jaGVja19zYXRfIiA8PCBTT0xWRVJfU0VTU0lPTl9JRCA8PCAiLnNtdCI7CisJc3RkOjpvZnN0cmVhbSBvc0ZpbGU7CisJb3NGaWxlLm9wZW4oZmlsZUxvY2F0aW9uLmNfc3RyKCksIHN0ZDo6aW9zX2Jhc2U6Om91dCk7CisJaWYgKCBvc0ZpbGUuZ29vZCgpICkKKwl7CisvLwkJb3NGaWxlIDw8ICIoZWNobyBcIiIgPDwgYUNvbmRpdGlvbi5zdHIoKSA8PCAiXCIpIiA8PCBzdGQ6OmVuZGw7CisKKwkJSW5zdGFuY2VPZkRhdGEgKiBhUGFyYW07CisKKwkJc3RkOjpzaXplX3QgcGFyYW1Db3VudCA9IHBhcmFtVmVjdG9yLnNpemUoKTsKKwkJZm9yKCBzdGQ6OnNpemVfdCBvZmZzZXQgPSAwIDsgb2Zmc2V0IDwgcGFyYW1Db3VudCA7IG9mZnNldCsrICkKKwkJeworCQkJYVBhcmFtID0gcGFyYW1WZWN0b3JbIG9mZnNldCBdLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpOworCisJCQlvc0ZpbGUgPDwgIihkZWNsYXJlLWNvbnN0ICIgPDwgYVBhcmFtLT5nZXRGdWxseVF1YWxpZmllZE5hbWVJRCgpCisJCQkJCTw8ICIgIjsKKwkJCWlmKCBhUGFyYW0tPmlzVHlwZWRCb29sZWFuKCkgKQorCQkJeworCQkJCW9zRmlsZSA8PCAiQm9vbCI7CisJCQl9CisJCQllbHNlIGlmKCBhUGFyYW0tPndlYWtseVR5cGVkSW50ZWdlcigpIHx8CisJCQkJCWFQYXJhbS0+aXNUeXBlZEVudW0oKSApCisJCQl7CisJCQkJb3NGaWxlIDw8ICJJbnQiOworCQkJfQorCQkJZWxzZSBpZiggYVBhcmFtLT53ZWFrbHlUeXBlZFJlYWwoKSApCisJCQl7CisJCQkJb3NGaWxlIDw8ICJSZWFsIjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlvc0ZpbGUgPDwgIlVua25vd24iOworCQkJfQorCQkJb3NGaWxlIDw8ICIpIiA8PCBzdGQ6OmVuZGw7CisJCX0KKworCQlvc0ZpbGUgPDwgIihhc3NlcnQgIiA8PCBvc3NDb25kaXRpb24uc3RyKCkgPDwgIikiIDw8IHN0ZDo6ZW5kbDsKKworCQlvc0ZpbGUgPDwgIihjaGVjay1zYXQpIiA8PCBzdGQ6OmVuZGw7CisKKwkJb3NGaWxlLmNsb3NlKCk7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiggU29sdmVyRGVmOjpBQk9SVF9TQVQgKTsKKwl9CisKKworCXJldHVybiggc2F0aXNmaWFiaWxpdHkgKTsKK30KKworYm9vbCBaM1NvbHZlcjo6c210X2NoZWNrX21vZGVsKGNvbnN0IEJGICYgYUNvbmRpdGlvbiwKKwkJQkZWZWN0b3IgJiBkYXRhVmVjdG9yLCBCRlZlY3RvciAmIHZhbHVlc1ZlY3RvcikKK3sKKwlCRlZlY3RvciBwYXJhbVZlY3RvcjsKKworCVN0cmluZ091dFN0cmVhbSBvc3NDb25kaXRpb24oIiIsICJcdCIsICIiKTsKKwl0b19zbXQob3NzQ29uZGl0aW9uLCBhQ29uZGl0aW9uLCBwYXJhbVZlY3Rvcik7CisKKwlzdGQ6OnN0cmluZyBmaWxlTG9jYXRpb24gPSBPU1MgPDwgbUxvZ0ZvbGRlckxvY2F0aW9uCisJCQk8PCAiejNfY2hlY2tfc2F0XyIgPDwgU09MVkVSX1NFU1NJT05fSUQgPDwgIi5zbXQiOworCXN0ZDo6b2ZzdHJlYW0gb3NGaWxlOworCW9zRmlsZS5vcGVuKGZpbGVMb2NhdGlvbi5jX3N0cigpLCBzdGQ6Omlvc19iYXNlOjpvdXQpOworCWlmICggb3NGaWxlLmdvb2QoKSApCisJeworLy8JCW9zRmlsZSA8PCAiKGVjaG8gXCIiIDw8IGFDb25kaXRpb24uc3RyKCkgPDwgIlwiKSIgPDwgc3RkOjplbmRsOworCisJCUluc3RhbmNlT2ZEYXRhICogYVBhcmFtOworCisJCXN0ZDo6c2l6ZV90IHBhcmFtQ291bnQgPSBwYXJhbVZlY3Rvci5zaXplKCk7CisJCWZvciggc3RkOjpzaXplX3Qgb2Zmc2V0ID0gMCA7IG9mZnNldCA8IHBhcmFtQ291bnQgOyBvZmZzZXQrKyApCisJCXsKKwkJCWFQYXJhbSA9IHBhcmFtVmVjdG9yWyBvZmZzZXQgXS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKTsKKworCQkJb3NGaWxlIDw8ICIoZGVjbGFyZS1jb25zdCAiIDw8IGFQYXJhbS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJCQk8PCAiICI7CisJCQlpZiggYVBhcmFtLT5pc1R5cGVkQm9vbGVhbigpICkKKwkJCXsKKwkJCQlvc0ZpbGUgPDwgIkJvb2wiOworCQkJfQorCQkJZWxzZSBpZiggYVBhcmFtLT53ZWFrbHlUeXBlZEludGVnZXIoKSB8fAorCQkJCQlhUGFyYW0tPmlzVHlwZWRFbnVtKCkgKQorCQkJeworCQkJCW9zRmlsZSA8PCAiSW50IjsKKwkJCX0KKwkJCWVsc2UgaWYoIGFQYXJhbS0+d2Vha2x5VHlwZWRSZWFsKCkgKQorCQkJeworCQkJCW9zRmlsZSA8PCAiUmVhbCI7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJb3NGaWxlIDw8ICJVbmtub3duIjsKKwkJCX0KKwkJCW9zRmlsZSA8PCAiKSIgPDwgc3RkOjplbmRsOworCQl9CisKKwkJb3NGaWxlIDw8ICIoYXNzZXJ0ICIgPDwgb3NzQ29uZGl0aW9uLnN0cigpIDw8ICIpIiA8PCBzdGQ6OmVuZGw7CisKKwkJb3NGaWxlIDw8ICIoZ2V0LW1vZGVsKSIgPDwgc3RkOjplbmRsOworCisJCW9zRmlsZS5jbG9zZSgpOworCX0KKwllbHNlCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworCitTb2x2ZXJEZWY6OlNBVElTRklBQklMSVRZX1JJTkcgWjNTb2x2ZXI6OmZyb21fc210X3NhdChjb25zdCBCRiAmIGFDb25kaXRpb24pCit7CisJU29sdmVyRGVmOjpTQVRJU0ZJQUJJTElUWV9SSU5HIHNhdGlzZmlhYmlsaXR5ID0gU29sdmVyRGVmOjpTQVRJU0ZJQUJMRTsKKworCisJcmV0dXJuKCBzYXRpc2ZpYWJpbGl0eSApOworfQorCitib29sIFozU29sdmVyOjpmcm9tX3NtdF9tb2RlbChjb25zdCBCRiAmIGFDb25kaXRpb24sCisJCUJGVmVjdG9yICYgZGF0YVZlY3RvciwgQkZWZWN0b3IgJiB2YWx1ZXNWZWN0b3IpCit7CisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworCit2b2lkIFozU29sdmVyOjp0b19zbXQoT3V0U3RyZWFtICYgb3MsCisJCWNvbnN0IEJGICYgZXhwckZvcm0sIEJGVmVjdG9yICYgZGF0YVZlY3RvcikgY29uc3QKK3sKKwlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfU01BUlRfUE9JTlRFUl9FWElUKCBleHByRm9ybSApIDw8ICJleHByZXNzaW9uICEhISIKKwkJCTw8IFNFTkRfRVhJVDsKKworCW9zIDw8IFRBQjsKKworCXN3aXRjaCggZXhwckZvcm0uY2xhc3NLaW5kKCkgKQorCXsKKwkJY2FzZSBGT1JNX0FWTUNPREVfS0lORDoKKwkJeworCQkJQXZtQ29kZSAqIGFDb2RlID0gZXhwckZvcm0udG9fcHRyPCBBdm1Db2RlID4oKTsKKworCQkJb3MgPDwgJygnOworCQkJc3RkOjpzdHJpbmcgZW9lID0gIiI7CisKKwkJCXN3aXRjaCggYUNvZGUtPmdldEF2bU9wQ29kZSgpICkKKwkJCXsKKwkJCQljYXNlIEFWTV9PUENPREVfQU5EOgorCQkJCXsKKwkJCQkJb3MgPDwgImFuZCI7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljYXNlIEFWTV9PUENPREVfT1I6CisJCQkJeworCQkJCQlvcyA8PCAib3IiOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2FzZSBBVk1fT1BDT0RFX05PVDoKKwkJCQl7CisJCQkJCW9zIDw8ICJub3QiOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQljYXNlIEFWTV9PUENPREVfTkVROgorCQkJCXsKKwkJCQkJb3MgPDwgIihub3QiOworCQkJCQllb2UgPSAiKSI7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWNhc2UgQVZNX09QQ09ERV9JRkU6CisJCQkJeworCQkJCQlvcyA8PCAiaXRlIjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJY2FzZSBBVk1fT1BDT0RFX0lGOgorCQkJCXsKKwkJCQkJb3MgPDwgImlmIjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCW9zIDw8IGFDb2RlLT5nZXRPcGVyYXRvcigpLT5zdHJTTVQoKTsKKwkJCQkJYnJlYWs7CisKKwkJCQl9CisJCQl9CisKKwkJCUF2bUNvZGU6Oml0ZXJhdG9yIGl0ID0gYUNvZGUtPmJlZ2luKCk7CisJCQlBdm1Db2RlOjppdGVyYXRvciBlbmRJdCA9IGFDb2RlLT5lbmQoKTsKKwkJCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCQkJeworCQkJCW9zIDw8ICIgIjsKKwkJCQl0b19zbXQob3MsICppdCwgZGF0YVZlY3Rvcik7CisJCQl9CisKKwkJCW9zIDw8IGVvZSA8PCAnKSc7CisKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBGT1JNX0lOU1RBTkNFX0RBVEFfS0lORDoKKwkJeworCQkJZGF0YVZlY3Rvci5hZGRfdW5pb24oIGV4cHJGb3JtICk7CisJCQlvcyA8PCBleHByRm9ybS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsKKworCQkJYnJlYWs7CisJCX0KKworCisJCWNhc2UgRk9STV9CVUlMVElOX0JPT0xFQU5fS0lORDoKKwkJY2FzZSBGT1JNX0JVSUxUSU5fSU5URUdFUl9LSU5EOgorCQljYXNlIEZPUk1fQlVJTFRJTl9SQVRJT05BTF9LSU5EOgorCQljYXNlIEZPUk1fQlVJTFRJTl9GTE9BVF9LSU5EOgorCQl7CisJCQlvcyA8PCBleHByRm9ybS5zdHIoKTsKKworCQkJYnJlYWs7CisJCX0KKworCQlkZWZhdWx0OgorCQl7CisJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQk8PCAiVW5leHBlY3RlZCBCQVNFRk9STSBLSU5EIGFzIGV4cHJlc3Npb24gPDwgIgorCQkJCQk8PCBleHByRm9ybS5zdHIoKSA8PCAiID4+ICEhISIKKwkJCQkJPDwgU0VORF9FWElUOworCisJCQlvcyA8PCBleHByRm9ybS5zdHIoKTsKKworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlvcyA8PCBFT0w7Cit9CisKKworI2Vsc2UgLyogTk9UIF9BVk1fU09MVkVSX1ozX0NQUF8gPT0+IF9BVk1fU09MVkVSX1ozX0MgPDwgZGVmYXVsdCA+PiAqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisKKworLyoqCisgICBcYnJpZWYgRGlzcGxheSBhIHN5bWJvbCBpbiB0aGUgZ2l2ZW4gb3V0cHV0IHN0cmVhbS4KKyAqLworc3RhdGljIHZvaWQgZGlzcGxheV9zeW1ib2woT3V0U3RyZWFtICYgb3MsIFozX2NvbnRleHQgY3R4LCBaM19zeW1ib2wgcykKK3sKKwlzd2l0Y2ggKFozX2dldF9zeW1ib2xfa2luZChjdHgsIHMpKSB7CisJCWNhc2UgWjNfSU5UX1NZTUJPTDoKKwkJCW9zIDw8ICIkIiA8PCBaM19nZXRfc3ltYm9sX2ludChjdHgsIHMpOworCQkJYnJlYWs7CisJCWNhc2UgWjNfU1RSSU5HX1NZTUJPTDoKKwkJCW9zIDw8IFozX2dldF9zeW1ib2xfc3RyaW5nKGN0eCwgcyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCTw8ICJ1bnJlYWNoYWJsZSBjb2RlIHdhcyByZWFjaGVkICEhISIKKwkJCQkJPDwgU0VORF9FWElUOworCQkJYnJlYWs7CisJfQorfQorCisvKioKKyAgIFxicmllZiBEaXNwbGF5IHRoZSBnaXZlbiB0eXBlLgorICovCitzdGF0aWMgdm9pZCBkaXNwbGF5X3NvcnQoT3V0U3RyZWFtICYgb3MsIFozX2NvbnRleHQgY3R4LCBaM19zb3J0IHR5KQoreworCXN3aXRjaCAoWjNfZ2V0X3NvcnRfa2luZChjdHgsIHR5KSkgeworCQljYXNlIFozX1VOSU5URVJQUkVURURfU09SVDoKKwkJCWRpc3BsYXlfc3ltYm9sKG9zLCBjdHgsIFozX2dldF9zb3J0X25hbWUoY3R4LCB0eSkpOworCQkJYnJlYWs7CisJCWNhc2UgWjNfQk9PTF9TT1JUOgorCQkJb3MgPDwgImJvb2wiOworCQkJYnJlYWs7CisJCWNhc2UgWjNfSU5UX1NPUlQ6CisJCQlvcyA8PCAiaW50IjsKKwkJCWJyZWFrOworCQljYXNlIFozX1JFQUxfU09SVDoKKwkJCW9zIDw8ICJyZWFsIjsKKwkJCWJyZWFrOworCQljYXNlIFozX0JWX1NPUlQ6CisJCQlvcyA8PCAiYnYiIDw8IFozX2dldF9idl9zb3J0X3NpemUoY3R4LCB0eSk7CisJCQlicmVhazsKKwkJY2FzZSBaM19BUlJBWV9TT1JUOgorCQkJb3MgPDwgIlsiOworCQkJZGlzcGxheV9zb3J0KG9zLCBjdHgsIFozX2dldF9hcnJheV9zb3J0X2RvbWFpbihjdHgsIHR5KSk7CisJCQlvcyA8PCAiLT4iOworCQkJZGlzcGxheV9zb3J0KG9zLCBjdHgsIFozX2dldF9hcnJheV9zb3J0X3JhbmdlKGN0eCwgdHkpKTsKKwkJCW9zIDw8ICJdIjsKKwkJCWJyZWFrOworCQljYXNlIFozX0RBVEFUWVBFX1NPUlQ6CisJCQlpZiAoWjNfZ2V0X2RhdGF0eXBlX3NvcnRfbnVtX2NvbnN0cnVjdG9ycyhjdHgsIHR5KSAhPSAxKQorCQkJeworCQkJCW9zIDw8IFozX3NvcnRfdG9fc3RyaW5nKGN0eCx0eSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQl7CisJCQkJdW5zaWduZWQgbnVtX2ZpZWxkcyA9IFozX2dldF90dXBsZV9zb3J0X251bV9maWVsZHMoY3R4LCB0eSk7CisJCQkJdW5zaWduZWQgaTsKKwkJCQlvcyA8PCAiKCI7CisJCQkJZm9yIChpID0gMDsgaSA8IG51bV9maWVsZHM7IGkrKykgeworCQkJCQlaM19mdW5jX2RlY2wgZmllbGQgPSBaM19nZXRfdHVwbGVfc29ydF9maWVsZF9kZWNsKGN0eCwgdHksIGkpOworCQkJCQlpZiAoaSA+IDApIHsKKwkJCQkJCW9zIDw8ICIsICI7CisJCQkJCX0KKwkJCQkJZGlzcGxheV9zb3J0KG9zLCBjdHgsIFozX2dldF9yYW5nZShjdHgsIGZpZWxkKSk7CisJCQkJfQorCQkJCW9zIDw8ICIpIjsKKwkJCQlicmVhazsKKwkJCX0KKwkJZGVmYXVsdDoKKwkJCW9zIDw8ICJ1bmtub3duWyI7CisJCQlkaXNwbGF5X3N5bWJvbChvcywgY3R4LCBaM19nZXRfc29ydF9uYW1lKGN0eCwgdHkpKTsKKwkJCW9zIDw8ICJdIjsKKwkJCWJyZWFrOworCX0KK30KKworLyoqCisgICBcYnJpZWYgQ3VzdG9tIGFzdCBwcmV0dHkgcHJpbnRlci4KKworICAgVGhpcyBmdW5jdGlvbiBkZW1vbnN0cmF0ZXMgaG93IHRvIHVzZSB0aGUgQVBJIHRvIG5hdmlnYXRlIHRlcm1zLgorICovCitzdGF0aWMgdm9pZCBkaXNwbGF5X2FzdChPdXRTdHJlYW0gJiBvcywgWjNfY29udGV4dCBjdHgsIFozX2FzdCB2KQoreworCXN3aXRjaCAoWjNfZ2V0X2FzdF9raW5kKGN0eCwgdikpIHsKKwkJY2FzZSBaM19OVU1FUkFMX0FTVDogeworCQkJWjNfc29ydCB0OworCQkJb3MgPDwgWjNfZ2V0X251bWVyYWxfc3RyaW5nKGN0eCwgdik7CisJCQl0ID0gWjNfZ2V0X3NvcnQoY3R4LCB2KTsKKwkJCW9zIDw8ICI6IjsKKwkJCWRpc3BsYXlfc29ydChvcywgY3R4LCB0KTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgWjNfQVBQX0FTVDogeworCQkJWjNfYXBwIGFwcCA9IFozX3RvX2FwcChjdHgsIHYpOworCQkJdW5zaWduZWQgbnVtX2ZpZWxkcyA9IFozX2dldF9hcHBfbnVtX2FyZ3MoY3R4LCBhcHApOworCQkJWjNfZnVuY19kZWNsIGQgPSBaM19nZXRfYXBwX2RlY2woY3R4LCBhcHApOworCQkJb3MgPDwgWjNfZnVuY19kZWNsX3RvX3N0cmluZyhjdHgsIGQpOworCQkJaWYgKG51bV9maWVsZHMgPiAwKSB7CisJCQkJb3MgPDwgIlsiOworCQkJCWRpc3BsYXlfYXN0KG9zLCBjdHgsIFozX2dldF9hcHBfYXJnKGN0eCwgYXBwLCAwKSk7CisJCQkJZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IG51bV9maWVsZHM7IGkrKykgeworCQkJCQlvcyA8PCAiLCAiOworCQkJCQlkaXNwbGF5X2FzdChvcywgY3R4LCBaM19nZXRfYXBwX2FyZyhjdHgsIGFwcCwgaSkpOworCQkJCX0KKwkJCQlvcyA8PCAiXSI7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQljYXNlIFozX1FVQU5USUZJRVJfQVNUOiB7CisJCQlvcyA8PCAicXVhbnRpZmllciI7CisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OiB7CisJCQlvcyA8PCAiI3Vua25vd24iOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qKgorICAgXGJyaWVmIEN1c3RvbSBmdW5jdGlvbiBpbnRlcnByZXRhdGlvbnMgcHJldHR5IHByaW50ZXIuCisgKi8KK3N0YXRpYyB2b2lkIGRpc3BsYXlfZnVuY3Rpb25faW50ZXJwcmV0YXRpb25zKAorCQlPdXRTdHJlYW0gJiBvcywgWjNfY29udGV4dCBjdHgsIFozX21vZGVsIG1vZGVsKQoreworCXVuc2lnbmVkIG51bV9mdW5jdGlvbnMsIGk7CisKKwlvcyA8PCAiZnVuY3Rpb24gaW50ZXJwcmV0YXRpb25zOiIgPDwgc3RkOjplbmRsOworCisJbnVtX2Z1bmN0aW9ucyA9IFozX2dldF9tb2RlbF9udW1fZnVuY3MoY3R4LCBtb2RlbCk7CisJZm9yIChpID0gMDsgaSA8IG51bV9mdW5jdGlvbnM7IGkrKykgeworCQlaM19mdW5jX2RlY2wgZmRlY2w7CisJCVozX3N5bWJvbCBuYW1lOworCQlaM19hc3QgZnVuY19lbHNlOworCQl1bnNpZ25lZCBudW1fZW50cmllcywgajsKKworCQlmZGVjbCA9IFozX2dldF9tb2RlbF9mdW5jX2RlY2woY3R4LCBtb2RlbCwgaSk7CisJCW5hbWUgPSBaM19nZXRfZGVjbF9uYW1lKGN0eCwgZmRlY2wpOworCQlkaXNwbGF5X3N5bWJvbChvcywgY3R4LCBuYW1lKTsKKwkJb3MgPDwgIiA9IHsiOworCQludW1fZW50cmllcyA9IFozX2dldF9tb2RlbF9mdW5jX251bV9lbnRyaWVzKGN0eCwgbW9kZWwsIGkpOworCQlmb3IgKGogPSAwOyBqIDwgbnVtX2VudHJpZXM7IGorKykgeworCQkJdW5zaWduZWQgbnVtX2FyZ3MsIGs7CisJCQlpZiAoaiA+IDApIHsKKwkJCQlvcyA8PCAiLCAiOworCQkJfQorCQkJbnVtX2FyZ3MgPSBaM19nZXRfbW9kZWxfZnVuY19lbnRyeV9udW1fYXJncyhjdHgsIG1vZGVsLCBpLCBqKTsKKwkJCW9zIDw8ICIoIjsKKwkJCWZvciAoayA9IDA7IGsgPCBudW1fYXJnczsgaysrKSB7CisJCQkJaWYgKGsgPiAwKSB7CisJCQkJCW9zIDw8ICIsICI7CisJCQkJfQorCQkJCWRpc3BsYXlfYXN0KG9zLCBjdHgsIFozX2dldF9tb2RlbF9mdW5jX2VudHJ5X2FyZyhjdHgsIG1vZGVsLCBpLCBqLCBrKSk7CisJCQl9CisJCQlvcyA8PCAifC0+IjsKKwkJCWRpc3BsYXlfYXN0KG9zLCBjdHgsIFozX2dldF9tb2RlbF9mdW5jX2VudHJ5X3ZhbHVlKGN0eCwgbW9kZWwsIGksIGopKTsKKwkJCW9zIDw8ICIpIjsKKwkJfQorCQlpZiAobnVtX2VudHJpZXMgPiAwKSB7CisJCQlvcyA8PCAiLCAiOworCQl9CisJCW9zIDw8ICIoZWxzZXwtPiI7CisJCWZ1bmNfZWxzZSA9IFozX2dldF9tb2RlbF9mdW5jX2Vsc2UoY3R4LCBtb2RlbCwgaSk7CisJCWRpc3BsYXlfYXN0KG9zLCBjdHgsIGZ1bmNfZWxzZSk7CisJCW9zIDw8ICIpfSIgPDwgc3RkOjplbmRsOworCX0KK30KKworLyoqCisgICBcYnJpZWYgQ3VzdG9tIG1vZGVsIHByZXR0eSBwcmludGVyLgorICovCitzdGF0aWMgdm9pZCBkaXNwbGF5X21vZGVsKE91dFN0cmVhbSAmIG9zLCBaM19jb250ZXh0IGN0eCwgWjNfbW9kZWwgbW9kZWwpCit7CisJdW5zaWduZWQgbnVtX2NvbnN0YW50czsKKwl1bnNpZ25lZCBpOworCisJbnVtX2NvbnN0YW50cyA9IFozX2dldF9tb2RlbF9udW1fY29uc3RhbnRzKGN0eCwgbW9kZWwpOworCWZvciAoaSA9IDA7IGkgPCBudW1fY29uc3RhbnRzOyBpKyspIHsKKwkJWjNfc3ltYm9sIG5hbWU7CisJCVozX2Z1bmNfZGVjbCBjbnN0ID0gWjNfZ2V0X21vZGVsX2NvbnN0YW50KGN0eCwgbW9kZWwsIGkpOworCQlaM19hc3QgYSwgdjsKKwkJbmFtZSA9IFozX2dldF9kZWNsX25hbWUoY3R4LCBjbnN0KTsKKwkJZGlzcGxheV9zeW1ib2wob3MsIGN0eCwgbmFtZSk7CisJCW9zIDw8ICIgPSAiOworCQlhID0gWjNfbWtfYXBwKGN0eCwgY25zdCwgMCwgMCk7CisJCXYgPSBhOworCQlaM19ib29sIG9rID0gWjNfZXZhbChjdHgsIG1vZGVsLCBhLCAmdik7CisJCWlmKCBvayA9PSBaM19UUlVFICkKKwkJeworCQkJZGlzcGxheV9hc3Qob3MsIGN0eCwgdik7CisJCQlvcyA8PCBzdGQ6OmVuZGw7CisJCX0KKwl9CisJZGlzcGxheV9mdW5jdGlvbl9pbnRlcnByZXRhdGlvbnMob3MsIGN0eCwgbW9kZWwpOworfQorCisKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKworCisvKioKKyAqIENPTkZJR1VSRQorICovCitib29sIFozU29sdmVyOjpjb25maWd1cmUoCisJCUNvbmZpZ3VyYXRpb24gJiBhQ29uZmlndXJhdGlvbiwgV09iamVjdCAqIHdmRmlsdGVyT2JqZWN0LAorCQlMaXN0T2ZQYWlyTWFjaGluZURhdGEgJiBsaXN0T2ZTZWxlY3RlZFZhcmlhYmxlKQoreworCWlmKCBub3QgYmFzZV90aGlzX3R5cGU6OmNvbmZpZ3VyZSgKKwkJYUNvbmZpZ3VyYXRpb24sIHdmRmlsdGVyT2JqZWN0LCBsaXN0T2ZTZWxlY3RlZFZhcmlhYmxlKSApCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworCisvKioKKyAqIENSRUFURSAtIERFU1RST1kKKyAqIFZhbGlkaXR5Q2hlY2tlcgorICovCisKKy8qKgorICAgXGJyaWVmIFNpbXBsZXIgZXJyb3IgaGFuZGxlci4KKyAqLwordm9pZCBlcnJvcl9oYW5kbGVyKFozX2Vycm9yX2NvZGUgZSkKK3sKKwlBVk1fT1NfRVhJVCggRkFJTEVEICkKKwkJCTw8ICJaM1NvbHZlcjo+IEluY29ycmVjdCB1c2Ugb2YgdGhlIHNvbHZlciwgZXJyb3IgY29kZSA8PCAiCisJCQk8PCBlIDw8ICIgPj4iCisJCQk8PCBTRU5EX0VYSVQ7Cit9CisKKworYm9vbCBaM1NvbHZlcjo6Y3JlYXRlQ2hlY2tlcigpCit7CisJQ0ZHID0gWjNfbWtfY29uZmlnKCk7CisKKwlaM19zZXRfcGFyYW1fdmFsdWUoQ0ZHLCAiTU9ERUwiLCAidHJ1ZSIpOworCisJQ1RYID0gWjNfbWtfY29udGV4dChDRkcpOworCisvLwlaM19zZXRfZXJyb3JfaGFuZGxlcihlcnJvcl9oYW5kbGVyKTsKKworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU01UX1NPTFZJTkcgKQorCSsrU09MVkVSX1NFU1NJT05fSUQ7CitBVk1fSUZfREVCVUdfTEVWRUxfR1RFX0hJR0gKKwltTG9nRm9sZGVyTG9jYXRpb24gPSBPU1MoKSA8PCBWRlM6OlByb2plY3RMb2dQYXRoIDw8ICIvejMvIjsKKworCWlmICggbm90IFZGUzo6Y2hlY2tXcml0aW5nRm9sZGVyKG1Mb2dGb2xkZXJMb2NhdGlvbikgKQorCXsKKwkJQVZNX09TX0xPRyA8PCAiIFozU29sdmVyOjpjcmVhdGVDaGVja2VyIDo+IEVycm9yOiBUaGUgZm9sZGVyICIKKwkJCQk8PCAiYCIgPDwgbUxvZ0ZvbGRlckxvY2F0aW9uCTw8ICInICIKKwkJCQk8PCAiLS0tPiBkb2Vzbid0IGV4aXN0IG9yIGlzIG5vdCB3cml0YWJsZSAhISEiCisJCQkJPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKwkJcmV0dXJuKCBmYWxzZSApOworCX0KKworLy8Jc3RkOjpzdHJpbmcgZmlsZUxvY2F0aW9uID0gT1NTIDw8IG1Mb2dGb2xkZXJMb2NhdGlvbgorLy8JCQk8PCAiejNfbG9nXyIgPDwgU09MVkVSX1NFU1NJT05fSUQgPDwgIi56MyI7CisvLwlaM19vcGVuX2xvZyggZmlsZUxvY2F0aW9uLmNfc3RyKCkgKTsKKy8vCisvLwlmaWxlTG9jYXRpb24gPSBPU1MgPDwgbUxvZ0ZvbGRlckxvY2F0aW9uCisvLwkJCTw8ICJ6M190cmFjZV8iIDw8IFNPTFZFUl9TRVNTSU9OX0lEIDw8ICIuejMiOworLy8JWjNfdHJhY2VfdG9fZmlsZSggQ1RYICwgZmlsZUxvY2F0aW9uLmNfc3RyKCkgKTsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9HVEVfSElHSAorQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNNVF9TT0xWSU5HICkKKworCisJU01UX1RZUEVfQk9PTCA9IFozX21rX2Jvb2xfc29ydChDVFgpOworCVNNVF9UWVBFX0lOVCAgPSBaM19ta19pbnRfc29ydChDVFgpOworCVNNVF9UWVBFX1JFQUwgPSBaM19ta19yZWFsX3NvcnQoQ1RYKTsKKworCVNNVF9DU1RfQk9PTF9UUlVFICA9IFozX21rX3RydWUoQ1RYKTsKKwlTTVRfQ1NUX0JPT0xfRkFMU0UgPSBaM19ta19mYWxzZShDVFgpOworCisJU01UX0NTVF9JTlRfWkVSTyA9IFozX21rX2ludChDVFgsIDAsIFNNVF9UWVBFX0lOVCk7CisJU01UX0NTVF9JTlRfT05FICA9IFozX21rX2ludChDVFgsIDEsIFNNVF9UWVBFX0lOVCk7CisKKwlyZXNldFRhYmxlKCk7CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCitib29sIFozU29sdmVyOjpkZXN0cm95Q2hlY2tlcigpCit7CisJcmVzZXRUYWJsZSgpOworCisJU01UX1RZUEVfQk9PTCAgPSBOVUxMOworCVNNVF9UWVBFX0lOVCAgID0gTlVMTDsKKwlTTVRfVFlQRV9CVjMyICA9IE5VTEw7CisJU01UX1RZUEVfQlY2NCAgPSBOVUxMOworCVNNVF9UWVBFX1JFQUwgID0gTlVMTDsKKworCVNNVF9DU1RfQk9PTF9UUlVFICAgPSBOVUxMOworCVNNVF9DU1RfQk9PTF9GQUxTRSAgPSBOVUxMOworCisJU01UX0NTVF9JTlRfWkVSTwk9IE5VTEw7CisJU01UX0NTVF9JTlRfT05FCSA9IE5VTEw7CisKKy8vCVozX2Nsb3NlX2xvZygpOworLy8JWjNfdHJhY2Vfb2ZmKCBDVFggKTsKKworCWlmKCBDRkcgIT0gTlVMTCApCisJeworCQlaM19kZWxfY29uZmlnKENGRyk7CisJCUNGRyA9IE5VTEw7CisJfQorCisJaWYoIENUWCAhPSBOVUxMICkKKwl7CisJCVozX2RlbF9jb250ZXh0KENUWCk7CisKKwkJQ1RYID0gTlVMTDsKKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworYm9vbCBaM1NvbHZlcjo6cmVzZXRUYWJsZSgpCit7CisJYmFzZV90aGlzX3R5cGU6OnJlc2V0VGFibGUoKTsKKworCW1UYWJsZU9mUGFyYW1ldGVyRGVjbC5hcHBlbmQoIE5VTEwgKTsKKworCW1UYWJsZU9mUGFyYW1ldGVyRXhwci5hcHBlbmQoIE5VTEwgKTsKKworCXJldHVybiggdHJ1ZSApOworfQorCisKKworLyoqCisgKiBQUk9WRVIKKyAqLworYm9vbCBaM1NvbHZlcjo6aXNTdWJTZXQoCisJCWNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBuZXdFQywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIG9sZEVDKQoreworCXJldHVybiggdHJ1ZSApOworfQorCitib29sIFozU29sdmVyOjppc0VxdWFsU2V0KAorCQljb25zdCBFeGVjdXRpb25Db250ZXh0ICYgbmV3RUMsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBvbGRFQykKK3sKKwlyZXR1cm4oIHRydWUgKTsKK30KKworU29sdmVyRGVmOjpTQVRJU0ZJQUJJTElUWV9SSU5HIFozU29sdmVyOjppc1NhdGlzZmlhYmxlKGNvbnN0IEJGICYgYUNvbmRpdGlvbikKK3sKKwlTb2x2ZXJEZWY6OlNBVElTRklBQklMSVRZX1JJTkcgc2F0aXNmaWFiaWxpdHkgPSBTb2x2ZXJEZWY6OlNBVElTRklBQkxFOworCisJY3JlYXRlQ2hlY2tlcigpOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU01UX1NPTFZJTkcgKQorCUFWTV9PU19UUkFDRSA8PCAiWjNTb2x2ZXI6OmlzU2F0aXNmaWFibGUoLi4uKSAiCisJCQkiOiIgPDwgU09MVkVSX1NFU1NJT05fSUQgPDwgIj4iIDw8IHN0ZDo6ZW5kbAorCQkJPDwgIlx0IiA8PCBhQ29uZGl0aW9uLnN0cigpIDw8IHN0ZDo6ZW5kbDsKKworCS8vIHRyYWNlIHRvIGZpbGUKK0FWTV9JRl9ERUJVR19MRVZFTF9HVEVfSElHSAorCQlzbXRfY2hlY2tfc2F0KGFDb25kaXRpb24pOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0dURV9ISUdICitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU01UX1NPTFZJTkcgKQorCisJWjNfYXN0IHozQ29uZGl0aW9uID0gZnJvbV9iYXNlZm9ybShhQ29uZGl0aW9uKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNNVF9TT0xWSU5HICkKKwlBVk1fT1NfVFJBQ0UgPDwgIlozQ29uZGl0aW9uIDoiIDw8IFNPTFZFUl9TRVNTSU9OX0lEIDw8ICI+IgorCQkJPDwgc3RkOjplbmRsOworQVZNX0lGX0RFQlVHX0xFVkVMX0dURV9ISUdICisJCUFWTV9PU19UUkFDRSA8PCAiXHQiOworCQlkaXNwbGF5X2FzdChBVk1fT1NfVFJBQ0UsIENUWCwgejNDb25kaXRpb24pOworCQlBVk1fT1NfVFJBQ0UgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0dURV9ISUdICisJQVZNX09TX1RSQUNFIDw8ICJcdCIgPDwgWjNfYXN0X3RvX3N0cmluZyhDVFgsIHozQ29uZGl0aW9uKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU01UX1NPTFZJTkcgKQorCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFNNVF9TT0xWSU5HICkKKwlBVk1fT1NfVFJBQ0UgPDwgIlozOjpDVFggOiIgPDwgU09MVkVSX1NFU1NJT05fSUQgPDwgIj4iIDw8IHN0ZDo6ZW5kbAorCQkJPDwgWjNfY29udGV4dF90b19zdHJpbmcoQ1RYKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFNNVF9TT0xWSU5HICkKKworCWlmKCB6M0NvbmRpdGlvbiAhPSBOVUxMICkKKwl7CisJCVozX2Fzc2VydF9jbnN0cihDVFgsIHozQ29uZGl0aW9uKTsKKworCQlzd2l0Y2goIFozX2NoZWNrKENUWCkgKQorCQl7CisJCQljYXNlIFozX0xfVFJVRToKKwkJCXsKKwkJCQlzYXRpc2ZpYWJpbGl0eSA9IFNvbHZlckRlZjo6U0FUSVNGSUFCTEU7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNhc2UgWjNfTF9GQUxTRToKKwkJCXsKKwkJCQlzYXRpc2ZpYWJpbGl0eSA9IFNvbHZlckRlZjo6VU5TQVRJU0ZJQUJMRTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJY2FzZSBaM19MX1VOREVGOgorCQkJeworCQkJCXNhdGlzZmlhYmlsaXR5ID0gU29sdmVyRGVmOjpVTktOT1dOX1NBVDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQlzYXRpc2ZpYWJpbGl0eSA9IFNvbHZlckRlZjo6QUJPUlRfU0FUOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJZGVzdHJveUNoZWNrZXIoKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNNVF9TT0xWSU5HICkKKwlBVk1fT1NfVFJBQ0UgPDwgInJlc3VsdCA6IiA8PCBTT0xWRVJfU0VTU0lPTl9JRCA8PCAiPiAiCisJCQk8PCBTb2x2ZXJEZWY6OnN0clNhdGlzZmlhYmlsaXR5KHNhdGlzZmlhYmlsaXR5KSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU01UX1NPTFZJTkcgKQorCisJcmV0dXJuKCBzYXRpc2ZpYWJpbGl0eSApOworfQorCisKKy8qKgorICogU09MVkVSCisgKi8KK2Jvb2wgWjNTb2x2ZXI6OnNvbHZlSW1wbChjb25zdCBCRiAmIGFDb25kaXRpb24sCisJCUJGVmVjdG9yICYgZGF0YVZlY3RvciwgQkZWZWN0b3IgJiB2YWx1ZXNWZWN0b3IpCit7CisJU29sdmVyRGVmOjpTQVRJU0ZJQUJJTElUWV9SSU5HIHNhdGlzZmlhYmlsaXR5ID0gU29sdmVyRGVmOjpTQVRJU0ZJQUJMRTsKKworCWNyZWF0ZUNoZWNrZXIoKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNNVF9TT0xWSU5HICkKKwlBVk1fT1NfVFJBQ0UgPDwgIlozU29sdmVyOjpzb2x2ZSguLi4pICIKKwkJCSI6IiA8PCBTT0xWRVJfU0VTU0lPTl9JRCA8PCAiPiIgPDwgc3RkOjplbmRsCisJCQk8PCAiXHQiIDw8IGFDb25kaXRpb24uc3RyKCkgPDwgc3RkOjplbmRsOworCisJLy8gdHJhY2UgdG8gZmlsZQorCXNtdF9jaGVja19tb2RlbChhQ29uZGl0aW9uLCBkYXRhVmVjdG9yLCB2YWx1ZXNWZWN0b3IpOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNNVF9TT0xWSU5HICkKKworCVozX2FzdCB6M0NvbmRpdGlvbiA9IGZyb21fYmFzZWZvcm0oYUNvbmRpdGlvbik7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTTVRfU09MVklORyApCisJQVZNX09TX1RSQUNFIDw8ICJaM0NvbmRpdGlvbiA6IiA8PCBTT0xWRVJfU0VTU0lPTl9JRCA8PCAiPiIKKwkJCTw8IHN0ZDo6ZW5kbDsKK0FWTV9JRl9ERUJVR19MRVZFTF9HVEVfSElHSAorCQlBVk1fT1NfVFJBQ0UgPDwgIlx0IjsKKwkJZGlzcGxheV9hc3QoQVZNX09TX1RSQUNFLCBDVFgsIHozQ29uZGl0aW9uKTsKKwkJQVZNX09TX1RSQUNFIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9HVEVfSElHSAorCUFWTV9PU19UUkFDRSA8PCAiXHQiIDw8IFozX2FzdF90b19zdHJpbmcoQ1RYLCB6M0NvbmRpdGlvbikgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNNVF9TT0xWSU5HICkKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBTTVRfU09MVklORyApCisJQVZNX09TX1RSQUNFIDw8ICJaMzo6Q1RYIDoiIDw8IFNPTFZFUl9TRVNTSU9OX0lEIDw8ICI+IiA8PCBzdGQ6OmVuZGwKKwkJCTw8IFozX2NvbnRleHRfdG9fc3RyaW5nKENUWCkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBTTVRfU09MVklORyApCisKKwlpZiggejNDb25kaXRpb24gIT0gTlVMTCApCisJeworCQlaM19hc3NlcnRfY25zdHIoQ1RYLCB6M0NvbmRpdGlvbik7CisKKwkJWjNfbW9kZWwgbW9kZWwgPSBOVUxMOworCisJCXN3aXRjaCggWjNfY2hlY2tfYW5kX2dldF9tb2RlbChDVFgsICZtb2RlbCkgKQorCQl7CisJCQljYXNlIFozX0xfVFJVRToKKwkJCXsKKwkJCQlzYXRpc2ZpYWJpbGl0eSA9IFNvbHZlckRlZjo6U0FUSVNGSUFCTEU7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTTVRfU09MVklORyApCisJQVZNX09TX1RSQUNFIDw8ICJaM01vZGVsIHNhdDoiIDw8IFNPTFZFUl9TRVNTSU9OX0lEIDw8ICI+IiA8PCBzdGQ6OmVuZGwKKwkJCTw8IFozX21vZGVsX3RvX3N0cmluZyhDVFgsIG1vZGVsKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU01UX1NPTFZJTkcgKQorCisJCQkJdW5zaWduZWQgbnVtX2NvbnN0YW50cyA9IFozX2dldF9tb2RlbF9udW1fY29uc3RhbnRzKENUWCwgbW9kZWwpOworCQkJCWZvciggdW5zaWduZWQgaSA9IDAgOyBpIDwgbnVtX2NvbnN0YW50cyA7IGkrKyApCisJCQkJeworCQkJCQlaM19mdW5jX2RlY2wgY25zdCA9IFozX2dldF9tb2RlbF9jb25zdGFudChDVFgsIG1vZGVsLCBpKTsKKworCQkJCQlaM19zeW1ib2wgc3ltYm9sID0gWjNfZ2V0X2RlY2xfbmFtZShDVFgsIGNuc3QpOworCisJCQkJCWludCBvZmZzZXQgPSBtVGFibGVPZlBhcmFtZXRlckRlY2wuZmluZChzeW1ib2wpOworCQkJCQlpZiggb2Zmc2V0ID49IDAgKQorCQkJCQl7CisJCQkJCQlkYXRhVmVjdG9yLmFwcGVuZCggbVRhYmxlT2ZQYXJhbWV0ZXJJbnN0YW5jZVtvZmZzZXRdICk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTTVRfU09MVklORyApCisJZGlzcGxheV9zeW1ib2woQVZNX09TX1RSQUNFLCBDVFgsIHN5bWJvbCk7CisJQVZNX09TX1RSQUNFIDw8ICIgOj0gIjsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTTVRfU09MVklORyApCisKKwkJCQkJCVozX2FzdCBhcHAgPSBaM19ta19hcHAoQ1RYLCBjbnN0LCAwLCAwKTsKKworCQkJCQkJWjNfYXN0IHZhbHVlID0gYXBwOworCisJCQkJCQlaM19ib29sIG9rID0gWjNfZXZhbChDVFgsIG1vZGVsLCBhcHAsICZ2YWx1ZSk7CisKKwkJCQkJCXN3aXRjaCggb2sgKQorCQkJCQkJeworCQkJCQkJCWNhc2UgWjNfTF9UUlVFOgorCQkJCQkJCXsKKwkJCQkJCQkJQkYgYmZWYWwgPSB0b19iYXNlZm9ybShtb2RlbCwgdmFsdWUpOworCisJCQkJCQkJCXZhbHVlc1ZlY3Rvci5hcHBlbmQoIGJmVmFsLnZhbGlkKCkgPworCQkJCQkJCQkJCWJmVmFsIDogZGF0YVZlY3Rvci5iYWNrKCkgKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNNVF9TT0xWSU5HICkKKwlkaXNwbGF5X2FzdChBVk1fT1NfVFJBQ0UsIENUWCwgdmFsdWUpOworCUFWTV9PU19UUkFDRSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU01UX1NPTFZJTkcgKQorCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQkJY2FzZSBaM19MX0ZBTFNFOgorCQkJCQkJCWNhc2UgWjNfTF9VTkRFRjoKKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCXsKKwkJCQkJCQkJdmFsdWVzVmVjdG9yLmFwcGVuZCggQkY6OlJFRl9OVUxMICk7CisKKwkJCQkJCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJCQkJCQk8PCAiWjNTb2x2ZXI6OnNvbHZlIDo+ICIKKwkJCQkJCQkJCQkJImZhaWxlZCB0byBaM19ldmFsIDw8ICIKKwkJCQkJCQkJCQk8PCBaM19hc3RfdG9fc3RyaW5nKENUWCwgYXBwKQorCQkJCQkJCQkJCTw8ICIgPj4gISEhIgorCQkJCQkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJCQk8PCAiWjNTb2x2ZXI6OnNvbHZlIDo+ICIKKwkJCQkJCQkJInVuZm91bmQgcGFyYW1ldGVyIGluc3RhbmNlIGZvciBaMyBzeW1ib2wgPDwgIgorCQkJCQkJCQk8PCBaM19nZXRfc3ltYm9sX3N0cmluZyhDVFgsIHN5bWJvbCkKKwkJCQkJCQkJPDwgIiA+PiAhISEiCisJCQkJCQkJCTw8IFNFTkRfRVhJVDsKKwkJCQkJfQorCQkJCX0KKworCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNhc2UgWjNfTF9GQUxTRToKKwkJCXsKKwkJCQlzYXRpc2ZpYWJpbGl0eSA9IFNvbHZlckRlZjo6VU5TQVRJU0ZJQUJMRTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJY2FzZSBaM19MX1VOREVGOgorCQkJeworCQkJCXNhdGlzZmlhYmlsaXR5ID0gU29sdmVyRGVmOjpVTktOT1dOX1NBVDsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNNVF9TT0xWSU5HICkKKwkJCQlBVk1fT1NfVFJBQ0UgPDwgIlozTW9kZWwgdW5kZWY6IiA8PCBTT0xWRVJfU0VTU0lPTl9JRCA8PCAiPiIKKwkJCQkJCTw8IHN0ZDo6ZW5kbDsKKwkJCQlBVk1fT1NfVFJBQ0UgPDwgWjNfbW9kZWxfdG9fc3RyaW5nKENUWCwgbW9kZWwpIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTTVRfU09MVklORyApCisKKwkJCQlicmVhazsKKwkJCX0KKworCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQlzYXRpc2ZpYWJpbGl0eSA9IFNvbHZlckRlZjo6QUJPUlRfU0FUOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYoIG1vZGVsICE9IE5VTEwgKQorCQl7CisJCQlaM19kZWxfbW9kZWwoQ1RYLCBtb2RlbCk7CisJCX0KKworCX0KKworCWRlc3Ryb3lDaGVja2VyKCk7CisKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBNRURJVU0gLCBTTVRfU09MVklORyApCisJQVZNX09TX1RSQUNFIDw8ICJzb2x2ZSA6IiA8PCBTT0xWRVJfU0VTU0lPTl9JRCA8PCAiPiAiCisJCQk8PCBTb2x2ZXJEZWY6OnN0clNhdGlzZmlhYmlsaXR5KHNhdGlzZmlhYmlsaXR5KSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU01UX1NPTFZJTkcgKQorCisJcmV0dXJuKCBzYXRpc2ZpYWJpbGl0eSA9PSBTb2x2ZXJEZWY6OlNBVElTRklBQkxFICk7Cit9CisKKworCisvKioKKyAqIFRPT0xTCisgKi8KKworWjNfc29ydCBaM1NvbHZlcjo6Z2V0WjNUeXBlKEJhc2VUeXBlU3BlY2lmaWVyICogYnRzKQoreworCWlmKCBidHMtPmlzVHlwZWRCb29sZWFuKCkgKQorCXsKKwkJcmV0dXJuKCBTTVRfVFlQRV9CT09MICk7CisJfQorCWVsc2UgaWYoIGJ0cy0+aXNUeXBlZEVudW0oKSApCisJeworCQlyZXR1cm4oIFNNVF9UWVBFX0lOVCApOworCQkvLyBUT0RPIEF0dGVudGlvbiA6IGlsIGZhdWRyYWl0IHJham91dGVyIGxlcyBjb250cmFpbnRlcworCQkvLyBkJ2ludGVydmFsbGUgcG91ciBsZSB0eXBlIMOpbnVtw6lyw6kKKwl9CisJZWxzZSBpZiggYnRzLT53ZWFrbHlUeXBlZEludGVnZXIoKSApCisJeworCQlyZXR1cm4oIFNNVF9UWVBFX0lOVCApOworCX0KKwllbHNlIGlmKCBidHMtPndlYWtseVR5cGVkUmVhbCgpICkKKwl7CisJCXJldHVybiggU01UX1RZUEVfUkVBTCApOworCX0KKworCWVsc2UgaWYoIGJ0cy0+aXNUeXBlZE1hY2hpbmUoKSApCisJeworCQkvLyBUT0RPOj4gQ29uc29saWRhdGlvbiBhcHLDqHMgVEVTVAorCQlyZXR1cm4oIFNNVF9UWVBFX0lOVCApOworCX0KKworCXJldHVybiggU01UX1RZUEVfUkVBTCApOworfQorCisKK1ozX2FzdCBaM1NvbHZlcjo6Z2V0UGFyYW1ldGVyRXhwcihjb25zdCBCRiAmIGJmUGFyYW1ldGVyKQoreworCUluc3RhbmNlT2ZEYXRhICogYVBhcmFtZXRlciA9IGJmUGFyYW1ldGVyLnRvX3B0cjwgSW5zdGFuY2VPZkRhdGEgPigpOworCisJaWYoIGFQYXJhbWV0ZXItPmdldE1hcmsoKSA9PSAwICkKKwl7CisJCWFQYXJhbWV0ZXItPnNldE1hcmsoIG1UYWJsZU9mUGFyYW1ldGVySW5zdGFuY2Uuc2l6ZSgpICk7CisJCW1UYWJsZU9mUGFyYW1ldGVySW5zdGFuY2UuYXBwZW5kKCBiZlBhcmFtZXRlciApOworCisJCW1UYWJsZU9mUGFyYW1ldGVyRGVjbC5wdXNoX2JhY2soIFozX21rX3N0cmluZ19zeW1ib2woIENUWCwKKy8vCQkJCSggT1NTIDw8ICJQXyIgPDwgYVBhcmFtZXRlci0+Z2V0TWFyaygpICkuY19zdHIoKSApICk7CisJCQkJYVBhcmFtZXRlci0+Z2V0TmFtZUlEKCkuY19zdHIoKSApICk7CisKKwkJbVRhYmxlT2ZQYXJhbWV0ZXJFeHByLnB1c2hfYmFjayggWjNfbWtfY29uc3QoIENUWCwKKwkJCQltVGFibGVPZlBhcmFtZXRlckRlY2wubGFzdCgpLAorCQkJCWdldFozVHlwZShhUGFyYW1ldGVyLT5yZWZlcmVkVHlwZVNwZWNpZmllcigpKSkgKTsKKwl9CisKKwlyZXR1cm4oIG1UYWJsZU9mUGFyYW1ldGVyRXhwci5hdCggYVBhcmFtZXRlci0+Z2V0TWFyaygpICkgKTsKK30KKworCisKKworWjNfYXN0IFozU29sdmVyOjpnZXRWYXJpYWJsZUV4cHIoSW5zdGFuY2VPZkRhdGEgKiBhVmFyLCBzdGQ6OnNpemVfdCB2YXJJRCkKK3sKKwlpZiggbVRhYmxlT2ZWYXJpYWJsZUV4cHIuc2l6ZSgpIDw9IHZhcklEICkKKwl7CisJCW1UYWJsZU9mVmFyaWFibGVEZWNsLnB1c2hfYmFjayggWjNfbWtfc3RyaW5nX3N5bWJvbCggQ1RYLAorLy8JCQkJKCBPU1MgPDwgIlZfIiA8PCB2YXJJRCApLmNfc3RyKCkgKSApOworCQkJCWFWYXItPmdldE5hbWVJRCgpLmNfc3RyKCkgKSApOworCisJCW1UYWJsZU9mVmFyaWFibGVFeHByLnB1c2hfYmFjayggWjNfbWtfY29uc3QoIENUWCwKKwkJCQltVGFibGVPZlZhcmlhYmxlRGVjbC5sYXN0KCksCisJCQkJZ2V0WjNUeXBlKGFWYXItPmdldFR5cGVTcGVjaWZpZXIoKSkgKSApOworCX0KKworCXJldHVybiggbVRhYmxlT2ZWYXJpYWJsZUV4cHIuYXQoIHZhcklEICkgKTsKK30KKworCisKK1ozX2FzdCBaM1NvbHZlcjo6c2FmZV9mcm9tX2Jhc2Vmb3JtKGNvbnN0IEJGICYgZXhwckZvcm0sCisJCUJhc2VUeXBlU3BlY2lmaWVyICogdHlwZVNwZWNpZmllcikKK3sKKwlaM19hc3QgZSA9IE5VTEw7CisKKwl0cnkKKwl7CisJCWlmKCAoZSA9IGZyb21fYmFzZWZvcm0oZXhwckZvcm0sIHR5cGVTcGVjaWZpZXIpKSA9PSBOVUxMICkKKwkJeworCQkJQVZNX09TX1dBUk4gPDwgc3RkOjplbmRsIDw8IFJFUEVBVCgiKioqKioqKioiLCAxMCkgPDwgc3RkOjplbmRsCisJCQkJCTw8ICJcdFozU29sdmVyOjpzYWZlX2Zyb21fYmFzZWZvcm08IHVua25vd246OmVycm9yIDoiCisJCQkJCTw8IFNPTFZFUl9TRVNTSU9OX0lEIDw8ICI+IiA8PCBzdGQ6OmVuZGwKKwkJCQkJPDwgUkVQRUFUKCItLS0tLS0tLSIsIDEwKSA8PCBzdGQ6OmVuZGwKKwkJCQkJPDwgIlx0RmFpbGVkIHRvIENPTlZFUlQgc2VwOjpmbWw6OmV4cHJlc3Npb24gdG8gWjM6OkV4cHI6PiIgPDwgc3RkOjplbmRsCisJCQkJCTw8ICJcdCAgIiA8PCBleHByRm9ybS5zdHIoKSA8PCBzdGQ6OmVuZGwKKwkJCQkJPDwgUkVQRUFUKCIqKioqKioqKiIsIDEwKSA8PCBzdGQ6OmVuZGw7CisKKwkJCWRlc3Ryb3lDaGVja2VyKCk7CisJCX0KKwl9CisJY2F0Y2ggKCAuLi4gKQorCXsKKwkJQVZNX09TX1dBUk4gPDwgc3RkOjplbmRsIDw8IFJFUEVBVCgiKioqKioqKioiLCAxMCkgPDwgc3RkOjplbmRsCisJCQkJPDwgIlx0WjNTb2x2ZXI6OnNhZmVfZnJvbV9iYXNlZm9ybTwgdW5rbm93bjo6ZXhjZXB0aW9uIDoiCisJCQkJPDwgU09MVkVSX1NFU1NJT05fSUQgPDwgIj4iIDw8IHN0ZDo6ZW5kbAorCQkJCTw8IFJFUEVBVCgiLS0tLS0tLS0iLCAxMCkgPDwgc3RkOjplbmRsCisJCQkJPDwgIlx0RmFpbGVkIHRvIENPTlZFUlQgc2VwOjpmbWw6OmV4cHJlc3Npb24gdG8gWjM6OkV4cHI6PiIgPDwgc3RkOjplbmRsCisJCQkJPDwgIlx0ICAiIDw8IGV4cHJGb3JtLnN0cigpIDw8IHN0ZDo6ZW5kbAorCQkJCTw8IFJFUEVBVCgiKioqKioqKioiLCAxMCkgPDwgc3RkOjplbmRsOworCisJCWRlc3Ryb3lDaGVja2VyKCk7CisJfQorCisJcmV0dXJuKCBlICk7Cit9CisKKworCitaM19hc3QgWjNTb2x2ZXI6OmZyb21fYmFzZWZvcm0oY29uc3QgQkYgJiBleHByRm9ybSwKKwkJQmFzZVR5cGVTcGVjaWZpZXIgKiB0eXBlU3BlY2lmaWVyKQoreworCUFWTV9PU19BU1NFUlRfRkFUQUxfTlVMTF9TTUFSVF9QT0lOVEVSX0VYSVQoIGV4cHJGb3JtICkgPDwgImV4cHJlc3Npb24gISEhIgorCQkJPDwgU0VORF9FWElUOworCisJc3dpdGNoKCBleHByRm9ybS5jbGFzc0tpbmQoKSApCisJeworCQljYXNlIEZPUk1fQVZNQ09ERV9LSU5EOgorCQl7CisJCQlBdm1Db2RlICogYUNvZGUgPSBleHByRm9ybS50b19wdHI8IEF2bUNvZGUgPigpOworCisJCQl0eXBlU3BlY2lmaWVyID0gVHlwZU1hbmFnZXI6OlVOSVZFUlNBTDsKKworCQkJc3dpdGNoKCBhQ29kZS0+Z2V0QXZtT3BDb2RlKCkgKQorCQkJeworCQkJCS8vIENPTVBBUklTT04gT1BFUkFUSU9OCisJCQkJY2FzZSBBVk1fT1BDT0RFX0VROgorCQkJCXsKKwkJCQkJcmV0dXJuKCBaM19ta19lcSggQ1RYLAorCQkJCQkJCWZyb21fYmFzZWZvcm0oYUNvZGUtPmZpcnN0KCkgLCB0eXBlU3BlY2lmaWVyKSwKKwkJCQkJCQlmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5zZWNvbmQoKSwgdHlwZVNwZWNpZmllcikgKSApOworCQkJCX0KKworCQkJCWNhc2UgQVZNX09QQ09ERV9ORVE6CisJCQkJeworCQkJCQlyZXR1cm4oIFozX21rX25vdCggQ1RYLCBaM19ta19lcSggQ1RYLAorCQkJCQkJCWZyb21fYmFzZWZvcm0oYUNvZGUtPmZpcnN0KCkgLCB0eXBlU3BlY2lmaWVyKSwKKwkJCQkJCQlmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5zZWNvbmQoKSwgdHlwZVNwZWNpZmllcikgKSApICk7CisKKy8vCQkJCQlBUkdTIGFyZyggMiApOworLy8KKy8vCQkJCQlhcmcubmV4dCggZnJvbV9iYXNlZm9ybShhQ29kZS0+Zmlyc3QoKSAsIHR5cGVTcGVjaWZpZXIpICk7CisvLwkJCQkJYXJnLm5leHQoIGZyb21fYmFzZWZvcm0oYUNvZGUtPnNlY29uZCgpLCB0eXBlU3BlY2lmaWVyKSApOworLy8KKy8vCQkJCQlyZXR1cm4oIFozX21rX2Rpc3RpbmN0KENUWCwgMiwgYXJnLT50YWJsZSkgKTsKKwkJCQl9CisKKwkJCQljYXNlIEFWTV9PUENPREVfTFQ6CisJCQkJeworCQkJCQlyZXR1cm4oIFozX21rX2x0KCBDVFgsCisJCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+Zmlyc3QoKSAsIHR5cGVTcGVjaWZpZXIpLAorCQkJCQkJCWZyb21fYmFzZWZvcm0oYUNvZGUtPnNlY29uZCgpLCB0eXBlU3BlY2lmaWVyKSApICk7CisJCQkJfQorCisJCQkJY2FzZSBBVk1fT1BDT0RFX0xURToKKwkJCQl7CisJCQkJCXJldHVybiggWjNfbWtfbGUoIENUWCwKKwkJCQkJCQlmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5maXJzdCgpICwgdHlwZVNwZWNpZmllciksCisJCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+c2Vjb25kKCksIHR5cGVTcGVjaWZpZXIpICkgKTsKKwkJCQl9CisKKwkJCQljYXNlIEFWTV9PUENPREVfR1Q6CisJCQkJeworCQkJCQlyZXR1cm4oIFozX21rX2d0KCBDVFgsCisJCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+Zmlyc3QoKSAsIHR5cGVTcGVjaWZpZXIpLAorCQkJCQkJCWZyb21fYmFzZWZvcm0oYUNvZGUtPnNlY29uZCgpLCB0eXBlU3BlY2lmaWVyKSApICk7CisJCQkJfQorCisJCQkJY2FzZSBBVk1fT1BDT0RFX0dURToKKwkJCQl7CisJCQkJCXJldHVybiggWjNfbWtfZ2UoIENUWCwKKwkJCQkJCQlmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5maXJzdCgpICwgdHlwZVNwZWNpZmllciksCisJCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+c2Vjb25kKCksIHR5cGVTcGVjaWZpZXIpICkgKTsKKwkJCQl9CisKKworCQkJCS8vIExPR0lDQUwgT1BFUkFUSU9OCisJCQkJY2FzZSBBVk1fT1BDT0RFX05PVDoKKwkJCQl7CisJCQkJCXJldHVybiggWjNfbWtfbm90KCBDVFgsCisJCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+Zmlyc3QoKSAsIHR5cGVTcGVjaWZpZXIpKSApOworCQkJCX0KKworCQkJCWNhc2UgQVZNX09QQ09ERV9BTkQ6CisJCQkJeworCQkJCQlBUkdTIGFyZyggYUNvZGUtPnNpemUoKSApOworCisJCQkJCUF2bUNvZGU6Oml0ZXJhdG9yIGl0ID0gYUNvZGUtPmJlZ2luKCk7CisJCQkJCWZvciggOyBhcmcuaGFzTmV4dCgpIDsgKytpdCApCisJCQkJCXsKKwkJCQkJCWFyZy5uZXh0KCBmcm9tX2Jhc2Vmb3JtKCppdCwgdHlwZVNwZWNpZmllcikgKTsKKwkJCQkJfQorCisJCQkJCXJldHVybiggWjNfbWtfYW5kKENUWCwgYXJnLT5jb3VudCwgYXJnLT50YWJsZSkgKTsKKwkJCQl9CisKKwkJCQljYXNlIEFWTV9PUENPREVfTkFORDoKKwkJCQl7CisJCQkJCUFSR1MgYXJnKCBhQ29kZS0+c2l6ZSgpICk7CisKKwkJCQkJQXZtQ29kZTo6aXRlcmF0b3IgaXQgPSBhQ29kZS0+YmVnaW4oKTsKKwkJCQkJZm9yKCA7IGFyZy5oYXNOZXh0KCkgOyArK2l0ICkKKwkJCQkJeworCQkJCQkJYXJnLm5leHQoIGZyb21fYmFzZWZvcm0oKml0LCB0eXBlU3BlY2lmaWVyKSApOworCQkJCQl9CisKKwkJCQkJcmV0dXJuKCBaM19ta19ub3QoIENUWCwgWjNfbWtfYW5kKENUWCwgYXJnLT5jb3VudCwgYXJnLT50YWJsZSkgKSApOworCQkJCX0KKworLy8JCQkJY2FzZSBBVk1fT1BDT0RFX1hBTkQ6CisvLwkJCQl7CisvLwkJCQkJQVJHUyBhcmcoIDIgKTsKKy8vCisvLwkJCQkJYXJnLm5leHQoIFozX21rX25vdCggQ1RYLAorLy8JCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+Zmlyc3QoKSAsIHR5cGVTcGVjaWZpZXIpKSApOworLy8JCQkJCWFyZy5uZXh0KCBmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5zZWNvbmQoKSwgdHlwZVNwZWNpZmllcikgKTsKKy8vCisvLwkJCQkJcmV0dXJuKCBaM19ta19hbmQoQ1RYLCBhcmctPnRhYmxlLCAyKSApOworLy8KKy8vCQkJCQlyZXR1cm4oIG1WQy0+b3JFeHByKAorLy8JCQkJCQkJbVZDLT5hbmRFeHByKGZyb21fYmFzZWZvcm0oYUNvZGUtPmZpcnN0KCksIHR5cGVTcGVjaWZpZXIpLAorLy8JCQkJCQkJCQlmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5zZWNvbmQoKSwgdHlwZVNwZWNpZmllcikpLAorLy8JCQkJCQkJbVZDLT5hbmRFeHByKG1WQy0+bm90RXhwcihmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5maXJzdCgpLCB0eXBlU3BlY2lmaWVyKSksCisvLwkJCQkJCQkJCW1WQy0+bm90RXhwcihmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5zZWNvbmQoKSwgdHlwZVNwZWNpZmllcikpKSApICk7CisvLwkJCQl9CisKKworCQkJCWNhc2UgQVZNX09QQ09ERV9PUjoKKwkJCQl7CisJCQkJCUFSR1MgYXJnKCBhQ29kZS0+c2l6ZSgpICk7CisKKwkJCQkJQXZtQ29kZTo6aXRlcmF0b3IgaXQgPSBhQ29kZS0+YmVnaW4oKTsKKwkJCQkJZm9yKCA7IGFyZy5oYXNOZXh0KCkgOyArK2l0ICkKKwkJCQkJeworCQkJCQkJYXJnLm5leHQoIGZyb21fYmFzZWZvcm0oKml0LCB0eXBlU3BlY2lmaWVyKSApOworCQkJCQl9CisKKwkJCQkJcmV0dXJuKCBaM19ta19vcihDVFgsIGFyZy0+Y291bnQsIGFyZy0+dGFibGUpICk7CisJCQkJfQorCisJCQkJY2FzZSBBVk1fT1BDT0RFX05PUjoKKwkJCQl7CisJCQkJCUFSR1MgYXJnKCBhQ29kZS0+c2l6ZSgpICk7CisKKwkJCQkJQXZtQ29kZTo6aXRlcmF0b3IgaXQgPSBhQ29kZS0+YmVnaW4oKTsKKwkJCQkJZm9yKCA7IGFyZy5oYXNOZXh0KCkgOyArK2l0ICkKKwkJCQkJeworCQkJCQkJYXJnLm5leHQoIGZyb21fYmFzZWZvcm0oKml0LCB0eXBlU3BlY2lmaWVyKSApOworCQkJCQl9CisKKwkJCQkJcmV0dXJuKCBaM19ta19ub3QoIENUWCwgWjNfbWtfb3IoQ1RYLCBhcmctPmNvdW50LCBhcmctPnRhYmxlKSApICk7CisJCQkJfQorCisvLwkJCQljYXNlIEFWTV9PUENPREVfQkFORDoKKy8vCQkJCXsKKy8vCQkJCQlyZXR1cm4oIFozX21rX2J2X2FuZCggQ1RYLAorLy8JCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+Zmlyc3QoKSwgdHlwZVNwZWNpZmllciksCisvLwkJCQkJCQlmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5zZWNvbmQoKSwgdHlwZVNwZWNpZmllcikgKSApOworLy8JCQkJfQorLy8KKy8vCQkJCWNhc2UgQVZNX09QQ09ERV9CT1I6CisvLwkJCQl7CisvLwkJCQkJcmV0dXJuKCBaM19ta19idl9vciggQ1RYLAorLy8JCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+Zmlyc3QoKSwgdHlwZVNwZWNpZmllciksCisvLwkJCQkJCQlmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5zZWNvbmQoKSwgdHlwZVNwZWNpZmllcikgKSApOworLy8JCQkJfQorLy8KKy8vCQkJCWNhc2UgQVZNX09QQ09ERV9MU0hJRlQ6CisvLwkJCQl7CisvLwkJCQkJaWYoIGFDb2RlLT5zZWNvbmQoKS5pc0ludGVnZXIoKSApCisvLwkJCQkJeworLy8JCQkJCQlyZXR1cm4oIFozX21rX2J2X3NoaWZ0X2xlZnQwKCBDVFgsCisvLwkJCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+Zmlyc3QoKSwgdHlwZVNwZWNpZmllciksCisvLwkJCQkJCQkJYUNvZGUtPnNlY29uZCgpLnRvSW50ZWdlcigpKSApOworLy8KKy8vCQkJCQl9CisvLwkJCQkJZWxzZQorLy8JCQkJCXsKKy8vCQkJCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKy8vCQkJCQkJCQk8PCAiVW5leHBlY3RlZCBzZWNvbmQgYXJndW1lbnQgZm9yICIKKy8vCQkJCQkJCQkJIm5ld0ZpeGVkTGVmdFNoaWZ0RXhwciAhISFcbiIKKy8vCQkJCQkJCQk8PCBhQ29kZS0+dG9TdHJpbmcoIEFWTV9UQUIxX0lOREVOVCApCisvLwkJCQkJCQkJPDwgU0VORF9FWElUOworLy8KKy8vCQkJCQkJcmV0dXJuKCBOVUxMICk7CisvLwkJCQkJfQorLy8JCQkJfQorLy8KKy8vCQkJCWNhc2UgQVZNX09QQ09ERV9SU0hJRlQ6CisvLwkJCQl7CisvLwkJCQkJaWYoIGFDb2RlLT5zZWNvbmQoKS5pc0ludGVnZXIoKSApCisvLwkJCQkJeworLy8JCQkJCQlyZXR1cm4oIFozX21rX2J2X3NoaWZ0X3JpZ2h0MCggQ1RYLAorLy8JCQkJCQkJCWZyb21fYmFzZWZvcm0oYUNvZGUtPmZpcnN0KCksIHR5cGVTcGVjaWZpZXIpLAorLy8JCQkJCQkJCWFDb2RlLT5zZWNvbmQoKS50b0ludGVnZXIoKSkgKTsKKy8vCisvLwkJCQkJfQorLy8JCQkJCWVsc2UKKy8vCQkJCQl7CisvLwkJCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisvLwkJCQkJCQkJPDwgIlVuZXhwZWN0ZWQgc2Vjb25kIGFyZ3VtZW50IGZvciAiCisvLwkJCQkJCQkJCSJuZXdGaXhlZFJpZ2h0U2hpZnRFeHByICEhIVxuIgorLy8JCQkJCQkJCTw8IGFDb2RlLT50b1N0cmluZyggQVZNX1RBQjFfSU5ERU5UICkKKy8vCQkJCQkJCQk8PCBTRU5EX0VYSVQ7CisvLworLy8JCQkJCQlyZXR1cm4oIE5VTEwgKTsKKy8vCQkJCQl9CisvLwkJCQl9CisKKwkJCQljYXNlIEFWTV9PUENPREVfWE9SOgorCQkJCXsKKwkJCQkJcmV0dXJuKCBaM19ta194b3IoIENUWCwKKwkJCQkJCQlmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5maXJzdCgpICwgdHlwZVNwZWNpZmllciksCisJCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+c2Vjb25kKCksIHR5cGVTcGVjaWZpZXIpICkgKTsKKwkJCQl9CisKKwkJCQljYXNlIEFWTV9PUENPREVfWE5PUjoKKwkJCQl7CisJCQkJCXJldHVybiggWjNfbWtfbm90KCBDVFgsIFozX21rX3hvciggQ1RYLAorCQkJCQkJCWZyb21fYmFzZWZvcm0oYUNvZGUtPmZpcnN0KCkgLCB0eXBlU3BlY2lmaWVyKSwKKwkJCQkJCQlmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5zZWNvbmQoKSwgdHlwZVNwZWNpZmllcikgKSApICk7CisJCQkJfQorCisKKwkJCQkvLyBBUklUSE1FVElDIE9QRVJBVElPTgorCQkJCWNhc2UgQVZNX09QQ09ERV9QTFVTOgorCQkJCXsKKwkJCQkJQVJHUyBhcmcoIGFDb2RlLT5zaXplKCkgKTsKKworCQkJCQlBdm1Db2RlOjppdGVyYXRvciBpdCA9IGFDb2RlLT5iZWdpbigpOworCQkJCQlmb3IoIDsgYXJnLmhhc05leHQoKSA7ICsraXQgKQorCQkJCQl7CisJCQkJCQlhcmcubmV4dCggZnJvbV9iYXNlZm9ybSgqaXQsIHR5cGVTcGVjaWZpZXIpICk7CisJCQkJCX0KKworCQkJCQlyZXR1cm4oIFozX21rX2FkZChDVFgsIGFyZy0+Y291bnQsIGFyZy0+dGFibGUpICk7CisJCQkJfQorCisJCQkJY2FzZSBBVk1fT1BDT0RFX1VNSU5VUzoKKwkJCQl7CisJCQkJCXJldHVybiggWjNfbWtfdW5hcnlfbWludXMoQ1RYLAorCQkJCQkJCWZyb21fYmFzZWZvcm0oYUNvZGUtPmZpcnN0KCksIHR5cGVTcGVjaWZpZXIpKSApOworCQkJCX0KKworCQkJCWNhc2UgQVZNX09QQ09ERV9NSU5VUzoKKwkJCQl7CisJCQkJCUFSR1MgYXJnKCBhQ29kZS0+c2l6ZSgpICk7CisKKwkJCQkJQXZtQ29kZTo6aXRlcmF0b3IgaXQgPSBhQ29kZS0+YmVnaW4oKTsKKwkJCQkJZm9yKCA7IGFyZy5oYXNOZXh0KCkgOyArK2l0ICkKKwkJCQkJeworCQkJCQkJYXJnLm5leHQoIGZyb21fYmFzZWZvcm0oKml0LCB0eXBlU3BlY2lmaWVyKSApOworCQkJCQl9CisKKwkJCQkJcmV0dXJuKCBaM19ta19zdWIoQ1RYLCBhcmctPmNvdW50LCBhcmctPnRhYmxlKSApOworCQkJCX0KKworCQkJCWNhc2UgQVZNX09QQ09ERV9NVUxUOgorCQkJCXsKKwkJCQkJQVJHUyBhcmcoIGFDb2RlLT5zaXplKCkgKTsKKworCQkJCQlBdm1Db2RlOjppdGVyYXRvciBpdCA9IGFDb2RlLT5iZWdpbigpOworCQkJCQlmb3IoIDsgYXJnLmhhc05leHQoKSA7ICsraXQgKQorCQkJCQl7CisJCQkJCQlhcmcubmV4dCggZnJvbV9iYXNlZm9ybSgqaXQsIHR5cGVTcGVjaWZpZXIpICk7CisJCQkJCX0KKworCQkJCQlyZXR1cm4oIFozX21rX211bChDVFgsIGFyZy0+Y291bnQsIGFyZy0+dGFibGUpICk7CisJCQkJfQorCisJCQkJY2FzZSBBVk1fT1BDT0RFX0RJVjoKKwkJCQl7CisJCQkJCXJldHVybiggWjNfbWtfZGl2KCBDVFgsCisJCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+Zmlyc3QoKSAsIHR5cGVTcGVjaWZpZXIpLAorCQkJCQkJCWZyb21fYmFzZWZvcm0oYUNvZGUtPnNlY29uZCgpLCB0eXBlU3BlY2lmaWVyKSApICk7CisJCQkJfQorCisJCQkJY2FzZSBBVk1fT1BDT0RFX1BPVzoKKwkJCQl7CisJCQkJCWlmKCBFeHByZXNzaW9uRmFjdG9yeTo6aXNQb3NJbnRlZ2VyKGFDb2RlLT5zZWNvbmQoKSkgKQorCQkJCQl7CisvLwkJCQkJCXJldHVybiggWjNfbWtfcG93ZXIoIENUWCwKKy8vCQkJCQkJCQlmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5maXJzdCgpICwgdHlwZVNwZWNpZmllciksCisvLwkJCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+c2Vjb25kKCksIHR5cGVTcGVjaWZpZXIpICkgKTsKKworCQkJCQkJYXZtX3VpbnRlZ2VyX3QgcG93ZXIgPQorCQkJCQkJCQlFeHByZXNzaW9uRmFjdG9yeTo6dG9VSW50ZWdlcihhQ29kZS0+c2Vjb25kKCkpOworCisJCQkJCQlBUkdTIGFyZyggcG93ZXIgKTsKKworCQkJCQkJYXJnLm5leHQoIGZyb21fYmFzZWZvcm0oYUNvZGUtPmZpcnN0KCkpICk7CisKKwkJCQkJCXdoaWxlKCBhcmcuaGFzTmV4dCgpICkKKwkJCQkJCXsKKwkJCQkJCQlhcmcubmV4dCggYXJnWyAwIF0gKTsKKwkJCQkJCX0KKworCQkJCQkJcmV0dXJuKCBaM19ta19tdWwoQ1RYLCBhcmctPmNvdW50LCBhcmctPnRhYmxlKSApOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJCQkJPDwgIlozU29sdmVyOjpmcm9tX2Jhc2Vmb3JtOj4gVW5zdXBwb3J0ZWQgIgorCQkJCQkJCQkiZXhwcmVzc2lvbiBPcGVyYXRvciA8PCBBVk1fT1BDT0RFX1BPVyA+PiAhISEiCisJCQkJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJCQkJcmV0dXJuKCBOVUxMICk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQljYXNlIEFWTV9PUENPREVfTU9EOgorCQkJCXsKKwkJCQkJcmV0dXJuKCBaM19ta19tb2QoIENUWCwKKwkJCQkJCQlmcm9tX2Jhc2Vmb3JtKGFDb2RlLT5maXJzdCgpICwgdHlwZVNwZWNpZmllciksCisJCQkJCQkJZnJvbV9iYXNlZm9ybShhQ29kZS0+c2Vjb25kKCksIHR5cGVTcGVjaWZpZXIpICkgKTsKKwkJCQl9CisKKworCQkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorCQkJCQkJCTw8ICJaM1NvbHZlcjo6ZnJvbV9iYXNlZm9ybTo+IFVuZXhwZWN0ZWQgIgorCQkJCQkJCQkiQkFTRUZPUk0gS0lORCBmb3IgZXhlY3V0aW9uICEhIVxuIgorCQkJCQkJCTw8IGFDb2RlLT50b1N0cmluZyggQVZNX1RBQjFfSU5ERU5UICkKKwkJCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCQkJcmV0dXJuKCBOVUxMICk7CisJCQkJfQorCQkJfQorCisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgRk9STV9JTlNUQU5DRV9EQVRBX0tJTkQ6CisJCXsKKwkJCXJldHVybiggZ2V0UGFyYW1ldGVyRXhwciggZXhwckZvcm0gKSApOworCQl9CisKKwkJY2FzZSBGT1JNX0JVSUxUSU5fQk9PTEVBTl9LSU5EOgorCQl7CisJCQlpZiggZXhwckZvcm0udG9fcHRyPCBCb29sZWFuID4oKS0+Z2V0VmFsdWUoKSApCisJCQl7CisJCQkJcmV0dXJuKCAoKHR5cGVTcGVjaWZpZXIgIT0gTlVMTCkgJiYgdHlwZVNwZWNpZmllci0+aXNUeXBlZEJvb2xlYW4oKSkgPworCQkJCQkJU01UX0NTVF9CT09MX1RSVUUgOiBTTVRfQ1NUX0lOVF9PTkUgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4oICgodHlwZVNwZWNpZmllciAhPSBOVUxMKSAmJiB0eXBlU3BlY2lmaWVyLT5pc1R5cGVkQm9vbGVhbigpKSA/CisJCQkJCQlTTVRfQ1NUX0JPT0xfRkFMU0UgOiBTTVRfQ1NUX0lOVF9aRVJPICk7CisJCQl9CisJCX0KKworCisJCWNhc2UgRk9STV9CVUlMVElOX0lOVEVHRVJfS0lORDoKKwkJeworCQkJaWYoICh0eXBlU3BlY2lmaWVyICE9IE5VTEwpICYmIHR5cGVTcGVjaWZpZXItPmlzVHlwZWRCb29sZWFuKCkgKQorCQkJeworCQkJCXJldHVybiggZXhwckZvcm0udG9fcHRyPCBJbnRlZ2VyID4oKS0+aXNaZXJvKCkgPworCQkJCQkJU01UX0NTVF9CT09MX0ZBTFNFIDogU01UX0NTVF9CT09MX1RSVUUgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKyNpZiBkZWZpbmVkKCBfQVZNX0JVSUxUSU5fTlVNRVJJQ19HTVBfICkKKworCQkJCXJldHVybiggWjNfbWtfaW50NjQoQ1RYLAorCQkJCQkJZXhwckZvcm0udG9fcHRyPCBJbnRlZ2VyID4oKS0+dG9JbnRlZ2VyKCksCisJCQkJCQlTTVRfVFlQRV9JTlQpICk7CisKKyNlbHNlCisKKwkJCQlyZXR1cm4oIFozX21rX2ludDY0KENUWCwKKwkJCQkJCWV4cHJGb3JtLnRvX3B0cjwgSW50ZWdlciA+KCktPnRvSW50ZWdlcigpLAorCQkJCQkJU01UX1RZUEVfSU5UKSApOworCisjZW5kaWYgLyogX0FWTV9CVUlMVElOX05VTUVSSUNfR01QXyAqLworCQkJfQorCisvLwkJCXJldHVybiggWjNfbWtfbnVtZXJhbChDVFgsCisvLwkJCQkJZXhwckZvcm0udG9fcHRyPCBJbnRlZ2VyID4oKS0+c3RyKCkuY19zdHIoKSwKKy8vCQkJCQlTTVRfVFlQRV9JTlQpICk7CisJCX0KKworCQljYXNlIEZPUk1fQlVJTFRJTl9SQVRJT05BTF9LSU5EOgorCQl7CisJCQlpZiggKHR5cGVTcGVjaWZpZXIgIT0gTlVMTCkgJiYgdHlwZVNwZWNpZmllci0+aXNUeXBlZEJvb2xlYW4oKSApCisJCQl7CisJCQkJcmV0dXJuKCBleHByRm9ybS50b19wdHI8IFJhdGlvbmFsID4oKS0+aXNaZXJvKCkgPworCQkJCQkJU01UX0NTVF9CT09MX0ZBTFNFIDogU01UX0NTVF9CT09MX1RSVUUgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKyNpZiBkZWZpbmVkKCBfQVZNX0JVSUxUSU5fTlVNRVJJQ19HTVBfICkKKworCQkJCXJldHVybiggWjNfbWtfcmVhbChDVFgsCisJCQkJCQlleHByRm9ybS50b19wdHI8IFJhdGlvbmFsID4oKS0+dG9OdW1lcmF0b3IoKSwKKwkJCQkJCWV4cHJGb3JtLnRvX3B0cjwgUmF0aW9uYWwgPigpLT50b0Rlbm9taW5hdG9yKCkgKSApOworCisjZWxzZQorCisJCQkJcmV0dXJuKCBaM19ta19yZWFsKENUWCwKKwkJCQkJCWV4cHJGb3JtLnRvX3B0cjwgUmF0aW9uYWwgPigpLT50b051bWVyYXRvcigpLAorCQkJCQkJZXhwckZvcm0udG9fcHRyPCBSYXRpb25hbCA+KCktPnRvRGVub21pbmF0b3IoKSApICk7CisKKyNlbmRpZiAvKiBfQVZNX0JVSUxUSU5fTlVNRVJJQ19HTVBfICovCisJCQl9CisKKy8vCQkJcmV0dXJuKCBaM19ta19udW1lcmFsKCBDVFgsCisvLwkJCQkJZXhwckZvcm0udG9fcHRyPCBSYXRpb25hbCA+KCktPnN0cigpLmNfc3RyKCksCisvLwkJCQkJU01UX1RZUEVfUkVBTCkgKTsKKwkJfQorCisJCWNhc2UgRk9STV9CVUlMVElOX0ZMT0FUX0tJTkQ6CisJCXsKKwkJCWlmKCAodHlwZVNwZWNpZmllciAhPSBOVUxMKSAmJiB0eXBlU3BlY2lmaWVyLT5pc1R5cGVkQm9vbGVhbigpICkKKwkJCXsKKwkJCQlyZXR1cm4oIGV4cHJGb3JtLnRvX3B0cjwgRmxvYXQgPigpLT5pc1plcm8oKSA/CisJCQkJCQlTTVRfQ1NUX0JPT0xfRkFMU0UgOiBTTVRfQ1NUX0JPT0xfVFJVRSApOworCQkJfQorCQkJZWxzZQorCQkJeworI2lmIGRlZmluZWQoIF9BVk1fQlVJTFRJTl9OVU1FUklDX0dNUF8gKQorCisJCQkJcmV0dXJuKCBaM19ta19udW1lcmFsKENUWCwKKwkJCQkJCWV4cHJGb3JtLnRvX3B0cjwgRmxvYXQgPigpLT5zdHIoKS5jX3N0cigpLAorCQkJCQkJU01UX1RZUEVfUkVBTCkgKTsKKworI2Vsc2UKKworCQkJCXJldHVybiggWjNfbWtfbnVtZXJhbChDVFgsCisJCQkJCQlleHByRm9ybS50b19wdHI8IEZsb2F0ID4oKS0+c3RyKCkuY19zdHIoKSwKKwkJCQkJCVNNVF9UWVBFX1JFQUwpICk7CisKKyNlbmRpZiAvKiBfQVZNX0JVSUxUSU5fTlVNRVJJQ19HTVBfICovCisJCQl9CisJCX0KKworCisJCWNhc2UgRk9STV9SVU5USU1FX0lEX0tJTkQ6CisJCXsKKwkJCXJldHVybiggWjNfbWtfaW50KENUWCwgZXhwckZvcm0uYmZSSUQoKS5nZXRSaWQoKSwgU01UX1RZUEVfSU5UKSApOworCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJPDwgIlozU29sdmVyOjpmcm9tX2Jhc2Vmb3JtOj4gVW5leHBlY3RlZCBCQVNFRk9STSBLSU5EIDw8ICIKKwkJCQkJPDwgZXhwckZvcm0uY2xhc3NLaW5kTmFtZSgpIDw8ICIgPj4gYXMgZXhwcmVzc2lvbiA8PCAiCisJCQkJCTw8IGV4cHJGb3JtLnN0cigpIDw8ICIgPj4gISEhIgorCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCXJldHVybiggTlVMTCApOworCQl9CisJfQorCisJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCTw8ICJaM1NvbHZlcjo6ZnJvbV9iYXNlZm9ybSBFUlJPUiAhISEiCisJCQk8PCBTRU5EX0VYSVQ7CisKKwlyZXR1cm4oIE5VTEwgKTsKK30KKworCitCRiBaM1NvbHZlcjo6dG9fYmFzZWZvcm0oWjNfbW9kZWwgbW9kZWwsIFozX2FzdCB6M0Zvcm0pCit7CisJc3dpdGNoKCBaM19nZXRfYXN0X2tpbmQoQ1RYLCB6M0Zvcm0pICkKKwl7CisJCWNhc2UgWjNfTlVNRVJBTF9BU1Q6CisJCXsKKwkJCVozX3NvcnQgdHlwZSA9IFozX2dldF9zb3J0KENUWCwgejNGb3JtKTsKKworCQkJc3dpdGNoKCBaM19nZXRfc29ydF9raW5kKENUWCwgdHlwZSkgKQorCQkJeworCQkJCWNhc2UgWjNfQk9PTF9TT1JUOgorCQkJCXsKKwkJCQkJc3dpdGNoKCBaM19nZXRfYm9vbF92YWx1ZShDVFgsIHozRm9ybSkgKQorCQkJCQl7CisJCQkJCQljYXNlIFozX0xfVFJVRToKKwkJCQkJCXsKKwkJCQkJCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbiggdHJ1ZSApICk7CisJCQkJCQl9CisJCQkJCQljYXNlIFozX0xfRkFMU0U6CisJCQkJCQl7CisJCQkJCQkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oIGZhbHNlICkgKTsKKwkJCQkJCX0KKwkJCQkJCWNhc2UgWjNfTF9VTkRFRjoKKwkJCQkJCWRlZmF1bHQ6CisJCQkJCQl7CisJCQkJCQkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Jvb2xlYW4oCisJCQkJCQkJCQlaM19nZXRfbnVtZXJhbF9zdHJpbmcoQ1RYLCB6M0Zvcm0pKSApOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWNhc2UgWjNfSU5UX1NPUlQ6CisJCQkJeworCQkJCQl7CisJCQkJCQlpbnQgdmFsOworCQkJCQkJaWYoIFozX2dldF9udW1lcmFsX2ludChDVFgsIHozRm9ybSwgJnZhbCkgPT0gWjNfTF9UUlVFICkKKwkJCQkJCXsKKwkJCQkJCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3SW50ZWdlcigKKwkJCQkJCQkJCXN0YXRpY19jYXN0PCBhdm1faW50ZWdlcl90ID4oIHZhbCApICkgKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQl7CisJCQkJCQl1bnNpZ25lZCB2YWw7CisJCQkJCQlpZiggWjNfZ2V0X251bWVyYWxfdWludChDVFgsIHozRm9ybSwgJnZhbCkgPT0gWjNfTF9UUlVFICkKKwkJCQkJCXsKKwkJCQkJCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3VUludGVnZXIoCisJCQkJCQkJCQlzdGF0aWNfY2FzdDwgYXZtX3VpbnRlZ2VyX3QgPiggdmFsICkgKSApOworCQkJCQkJfQorCQkJCQl9CisJCQkJCXsKKwkJCQkJCV9faW50NjQgdmFsOworCQkJCQkJaWYoIFozX2dldF9udW1lcmFsX2ludDY0KENUWCwgejNGb3JtLCAmdmFsKSA9PSBaM19MX1RSVUUgKQorCQkJCQkJeworCQkJCQkJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdJbnRlZ2VyKAorCQkJCQkJCQkJc3RhdGljX2Nhc3Q8IGF2bV9pbnRlZ2VyX3QgPiggdmFsICkgKSApOworCQkJCQkJfQorCQkJCQl9CisJCQkJCXsKKwkJCQkJCXVuc2lnbmVkIF9faW50NjQgdmFsOworCQkJCQkJaWYoIFozX2dldF9udW1lcmFsX3VpbnQ2NChDVFgsIHozRm9ybSwgJnZhbCkgPT0gWjNfTF9UUlVFICkKKwkJCQkJCXsKKwkJCQkJCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3VUludGVnZXIoCisJCQkJCQkJCQlzdGF0aWNfY2FzdDwgYXZtX3VpbnRlZ2VyX3QgPiggdmFsICkgKSApOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0ludGVnZXIoCisJCQkJCQkJWjNfZ2V0X251bWVyYWxfc3RyaW5nKENUWCwgejNGb3JtKSkgKTsKKwkJCQl9CisJCQkJY2FzZSBaM19SRUFMX1NPUlQ6CisJCQkJeworCQkJCQlfX2ludDY0IG51bTsKKwkJCQkJX19pbnQ2NCBkZW47CisJCQkJCWlmKCBaM19nZXRfbnVtZXJhbF9yYXRpb25hbF9pbnQ2NChDVFgsIHozRm9ybSwgJm51bSwgJmRlbikgPT0gWjNfTF9UUlVFICkKKwkJCQkJeworCQkJCQkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld1JhdGlvbmFsKAorCQkJCQkJCQlzdGF0aWNfY2FzdDwgYXZtX2ludGVnZXJfdCA+KCBudW0gKSwKKwkJCQkJCQkJc3RhdGljX2Nhc3Q8IGF2bV9pbnRlZ2VyX3QgPiggZGVuICkgKSApOworCQkJCQl9CisKKwkJCQkJcmV0dXJuKCBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0Zsb2F0KAorCQkJCQkJCVozX2dldF9udW1lcmFsX3N0cmluZyhDVFgsIHozRm9ybSkpICk7CisJCQkJfQorCQkJCWNhc2UgWjNfVU5JTlRFUlBSRVRFRF9TT1JUOgorCQkJCWNhc2UgWjNfQlZfU09SVDoKKwkJCQljYXNlIFozX0FSUkFZX1NPUlQ6CisJCQkJY2FzZSBaM19EQVRBVFlQRV9TT1JUOgorCQkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3U3RyaW5nKAorCQkJCQkJCVozX2dldF9udW1lcmFsX3N0cmluZyhDVFgsIHozRm9ybSkpICk7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlicmVhazsKKwkJfQorCQljYXNlIFozX0FQUF9BU1Q6CisJCXsKKwkJCVozX2FwcCBhcHAgPSBaM190b19hcHAoQ1RYLCB6M0Zvcm0pOworCisJCQlpZiggWjNfZ2V0X2FwcF9udW1fYXJncyhDVFgsIGFwcCkgPT0gMCApCisJCQl7CisJCQkJWjNfZnVuY19kZWNsIGZ1bmNfZGVjbCA9IFozX2dldF9hcHBfZGVjbChDVFgsIGFwcCk7CisKKwkJCQlzdGQ6OnN0cmluZyB2YWwgPSBaM19mdW5jX2RlY2xfdG9fc3RyaW5nKENUWCwgZnVuY19kZWNsKTsKKwkJCQlpZiggdmFsID09ICIoZGVmaW5lIHRydWUgYm9vbCkiICkKKwkJCQl7CisJCQkJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKCB0cnVlICkgKTsKKwkJCQl9CisJCQkJZWxzZSBpZiggdmFsID09ICIoZGVmaW5lIGZhbHNlIGJvb2wpIiApCisJCQkJeworCQkJCQlyZXR1cm4oIEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3Qm9vbGVhbiggZmFsc2UgKSApOworCQkJCX0KKworLy8JCQkJejNGb3JtID0gWjNfbW9kZWxfZ2V0X2NvbnN0X2ludGVycChDVFgsIG1vZGVsLCBmdW5jX2RlY2wpOworLy8KKy8vCQkJCXJldHVybiggdG9fYmFzZWZvcm0obW9kZWwsIHozRm9ybSkgKTsKKworCQkJfQorCisJCQlicmVhazsKKwkJfQorCQljYXNlIFozX1FVQU5USUZJRVJfQVNUOgorCQl7CisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OgorCQl7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiggQkY6OlJFRl9OVUxMICk7Cit9CisKKworLyoqCisgKiBVc2luZyBmaWxlIEFQSQorICovCisKK1NvbHZlckRlZjo6U0FUSVNGSUFCSUxJVFlfUklORyBaM1NvbHZlcjo6c210X2NoZWNrX3NhdChjb25zdCBCRiAmIGFDb25kaXRpb24pCit7CisJU29sdmVyRGVmOjpTQVRJU0ZJQUJJTElUWV9SSU5HIHNhdGlzZmlhYmlsaXR5ID0gU29sdmVyRGVmOjpTQVRJU0ZJQUJMRTsKKworCUJGVmVjdG9yIHBhcmFtVmVjdG9yOworCisJU3RyaW5nT3V0U3RyZWFtIG9zc0NvbmRpdGlvbigiIiwgIlx0IiwgIiIpOworCXRvX3NtdChvc3NDb25kaXRpb24sIGFDb25kaXRpb24sIHBhcmFtVmVjdG9yKTsKKworCXN0ZDo6c3RyaW5nIGZpbGVMb2NhdGlvbiA9IE9TUygpIDw8IG1Mb2dGb2xkZXJMb2NhdGlvbgorCQkJPDwgInozX2NoZWNrX3NhdF8iICA8PCBTT0xWRVJfU0VTU0lPTl9JRCAgPDwgIi5zbXQiOworCXN0ZDo6b2ZzdHJlYW0gb3NGaWxlOworCW9zRmlsZS5vcGVuKGZpbGVMb2NhdGlvbi5jX3N0cigpLCBzdGQ6Omlvc19iYXNlOjpvdXQpOworCWlmICggb3NGaWxlLmdvb2QoKSApCisJeworLy8JCW9zRmlsZSA8PCAiKGVjaG8gXCIiIDw8IGFDb25kaXRpb24uc3RyKCkgPDwgIlwiKSIgPDwgc3RkOjplbmRsOworCisJCUluc3RhbmNlT2ZEYXRhICogYVBhcmFtOworCisJCXN0ZDo6c2l6ZV90IHBhcmFtQ291bnQgPSBwYXJhbVZlY3Rvci5zaXplKCk7CisJCWZvciggc3RkOjpzaXplX3Qgb2Zmc2V0ID0gMCA7IG9mZnNldCA8IHBhcmFtQ291bnQgOyBvZmZzZXQrKyApCisJCXsKKwkJCWFQYXJhbSA9IHBhcmFtVmVjdG9yWyBvZmZzZXQgXS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKTsKKworCQkJb3NGaWxlIDw8ICIoZGVjbGFyZS1jb25zdCAiIDw8IGFQYXJhbS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJCQk8PCAiICI7CisJCQlpZiggYVBhcmFtLT5pc1R5cGVkQm9vbGVhbigpICkKKwkJCXsKKwkJCQlvc0ZpbGUgPDwgIkJvb2wiOworCQkJfQorCQkJZWxzZSBpZiggYVBhcmFtLT53ZWFrbHlUeXBlZEludGVnZXIoKSB8fCBhUGFyYW0tPmlzVHlwZWRFbnVtKCkgKQorCQkJeworCQkJCW9zRmlsZSA8PCAiSW50IjsKKwkJCX0KKwkJCWVsc2UgaWYoIGFQYXJhbS0+d2Vha2x5VHlwZWRSZWFsKCkgKQorCQkJeworCQkJCW9zRmlsZSA8PCAiUmVhbCI7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJb3NGaWxlIDw8ICJVbmtub3duIjsKKwkJCX0KKwkJCW9zRmlsZSA8PCAiKSIgPDwgc3RkOjplbmRsOworCQl9CisKKwkJb3NGaWxlIDw8ICIoYXNzZXJ0ICIgPDwgb3NzQ29uZGl0aW9uLnN0cigpIDw8ICIpIiA8PCBzdGQ6OmVuZGw7CisKKwkJb3NGaWxlIDw8ICIoY2hlY2stc2F0KSIgPDwgc3RkOjplbmRsOworCisJCW9zRmlsZS5jbG9zZSgpOworCX0KKwllbHNlCisJeworCQlyZXR1cm4oIFNvbHZlckRlZjo6QUJPUlRfU0FUICk7CisJfQorCisKKwlyZXR1cm4oIHNhdGlzZmlhYmlsaXR5ICk7Cit9CisKK2Jvb2wgWjNTb2x2ZXI6OnNtdF9jaGVja19tb2RlbChjb25zdCBCRiAmIGFDb25kaXRpb24sCisJCUJGVmVjdG9yICYgZGF0YVZlY3RvciwgQkZWZWN0b3IgJiB2YWx1ZXNWZWN0b3IpCit7CisJQkZWZWN0b3IgcGFyYW1WZWN0b3I7CisKKwlTdHJpbmdPdXRTdHJlYW0gb3NzQ29uZGl0aW9uKCIiLCAiXHQiLCAiIik7CisJdG9fc210KG9zc0NvbmRpdGlvbiwgYUNvbmRpdGlvbiwgcGFyYW1WZWN0b3IpOworCisJc3RkOjpzdHJpbmcgZmlsZUxvY2F0aW9uID0gT1NTKCkgPDwgbUxvZ0ZvbGRlckxvY2F0aW9uCisJCQk8PCAiejNfY2hlY2tfc2F0XyIgPDwgU09MVkVSX1NFU1NJT05fSUQgPDwgIi5zbXQiOworCXN0ZDo6b2ZzdHJlYW0gb3NGaWxlOworCW9zRmlsZS5vcGVuKGZpbGVMb2NhdGlvbi5jX3N0cigpLCBzdGQ6Omlvc19iYXNlOjpvdXQpOworCWlmICggb3NGaWxlLmdvb2QoKSApCisJeworLy8JCW9zRmlsZSA8PCAiKGVjaG8gXCIiIDw8IGFDb25kaXRpb24uc3RyKCkgPDwgIlwiKSIgPDwgc3RkOjplbmRsOworCisJCUluc3RhbmNlT2ZEYXRhICogYVBhcmFtOworCisJCXN0ZDo6c2l6ZV90IHBhcmFtQ291bnQgPSBwYXJhbVZlY3Rvci5zaXplKCk7CisJCWZvciggc3RkOjpzaXplX3Qgb2Zmc2V0ID0gMCA7IG9mZnNldCA8IHBhcmFtQ291bnQgOyBvZmZzZXQrKyApCisJCXsKKwkJCWFQYXJhbSA9IHBhcmFtVmVjdG9yWyBvZmZzZXQgXS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKTsKKworCQkJb3NGaWxlIDw8ICIoZGVjbGFyZS1jb25zdCAiIDw8IGFQYXJhbS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorCQkJCQk8PCAiICI7CisJCQlpZiggYVBhcmFtLT5pc1R5cGVkQm9vbGVhbigpICkKKwkJCXsKKwkJCQlvc0ZpbGUgPDwgIkJvb2wiOworCQkJfQorCQkJZWxzZSBpZiggYVBhcmFtLT53ZWFrbHlUeXBlZEludGVnZXIoKSB8fCBhUGFyYW0tPmlzVHlwZWRFbnVtKCkgKQorCQkJeworCQkJCW9zRmlsZSA8PCAiSW50IjsKKwkJCX0KKwkJCWVsc2UgaWYoIGFQYXJhbS0+d2Vha2x5VHlwZWRSZWFsKCkgKQorCQkJeworCQkJCW9zRmlsZSA8PCAiUmVhbCI7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJb3NGaWxlIDw8ICJVbmtub3duIjsKKwkJCX0KKwkJCW9zRmlsZSA8PCAiKSIgPDwgc3RkOjplbmRsOworCQl9CisKKwkJb3NGaWxlIDw8ICIoYXNzZXJ0ICIgPDwgb3NzQ29uZGl0aW9uLnN0cigpIDw8ICIpIiA8PCBzdGQ6OmVuZGw7CisKKwkJb3NGaWxlIDw8ICIoZ2V0LW1vZGVsKSIgPDwgc3RkOjplbmRsOworCisJCW9zRmlsZS5jbG9zZSgpOworCX0KKwllbHNlCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworCitTb2x2ZXJEZWY6OlNBVElTRklBQklMSVRZX1JJTkcgWjNTb2x2ZXI6OmZyb21fc210X3NhdChjb25zdCBCRiAmIGFDb25kaXRpb24pCit7CisJU29sdmVyRGVmOjpTQVRJU0ZJQUJJTElUWV9SSU5HIHNhdGlzZmlhYmlsaXR5ID0gU29sdmVyRGVmOjpTQVRJU0ZJQUJMRTsKKworCisJcmV0dXJuKCBzYXRpc2ZpYWJpbGl0eSApOworfQorCitib29sIFozU29sdmVyOjpmcm9tX3NtdF9tb2RlbChjb25zdCBCRiAmIGFDb25kaXRpb24sCisJCUJGVmVjdG9yICYgZGF0YVZlY3RvciwgQkZWZWN0b3IgJiB2YWx1ZXNWZWN0b3IpCit7CisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworCit2b2lkIFozU29sdmVyOjp0b19zbXQoT3V0U3RyZWFtICYgb3MsCisJCWNvbnN0IEJGICYgZXhwckZvcm0sIEJGVmVjdG9yICYgZGF0YVZlY3RvcikgY29uc3QKK3sKKwlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfU01BUlRfUE9JTlRFUl9FWElUKCBleHByRm9ybSApIDw8ICJleHByZXNzaW9uICEhISIKKwkJCTw8IFNFTkRfRVhJVDsKKworCW9zIDw8IFRBQjsKKworCXN3aXRjaCggZXhwckZvcm0uY2xhc3NLaW5kKCkgKQorCXsKKwkJY2FzZSBGT1JNX0FWTUNPREVfS0lORDoKKwkJeworCQkJQXZtQ29kZSAqIGFDb2RlID0gZXhwckZvcm0udG9fcHRyPCBBdm1Db2RlID4oKTsKKworCQkJb3MgPDwgJygnOworCQkJc3RkOjpzdHJpbmcgZW9lID0gIiI7CisKKwkJCXN3aXRjaCggYUNvZGUtPmdldEF2bU9wQ29kZSgpICkKKwkJCXsKKwkJCQljYXNlIEFWTV9PUENPREVfQU5EOgorCQkJCXsKKwkJCQkJb3MgPDwgImFuZCI7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljYXNlIEFWTV9PUENPREVfT1I6CisJCQkJeworCQkJCQlvcyA8PCAib3IiOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2FzZSBBVk1fT1BDT0RFX05PVDoKKwkJCQl7CisJCQkJCW9zIDw8ICJub3QiOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQljYXNlIEFWTV9PUENPREVfTkVROgorCQkJCXsKKwkJCQkJb3MgPDwgIihub3QiOworCQkJCQllb2UgPSAiKSI7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWNhc2UgQVZNX09QQ09ERV9JRkU6CisJCQkJeworCQkJCQlvcyA8PCAiaXRlIjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJY2FzZSBBVk1fT1BDT0RFX0lGOgorCQkJCXsKKwkJCQkJb3MgPDwgImlmIjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCW9zIDw8IGFDb2RlLT5nZXRPcGVyYXRvcigpLT5zdHJTTVQoKTsKKwkJCQkJYnJlYWs7CisKKwkJCQl9CisJCQl9CisKKwkJCUF2bUNvZGU6Oml0ZXJhdG9yIGl0ID0gYUNvZGUtPmJlZ2luKCk7CisJCQlBdm1Db2RlOjppdGVyYXRvciBlbmRJdCA9IGFDb2RlLT5lbmQoKTsKKwkJCWZvciggOyBpdCAhPSBlbmRJdCA7ICsraXQgKQorCQkJeworCQkJCW9zIDw8ICIgIjsKKwkJCQl0b19zbXQob3MsICppdCwgZGF0YVZlY3Rvcik7CisJCQl9CisKKwkJCW9zIDw8IGVvZSA8PCAnKSc7CisKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBGT1JNX0lOU1RBTkNFX0RBVEFfS0lORDoKKwkJeworCQkJZGF0YVZlY3Rvci5hZGRfdW5pb24oIGV4cHJGb3JtICk7CisJCQlvcyA8PCBleHByRm9ybS50b19wdHI8IEluc3RhbmNlT2ZEYXRhID4oKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKTsKKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEZPUk1fQlVJTFRJTl9CT09MRUFOX0tJTkQ6CisJCWNhc2UgRk9STV9CVUlMVElOX0lOVEVHRVJfS0lORDoKKwkJY2FzZSBGT1JNX0JVSUxUSU5fUkFUSU9OQUxfS0lORDoKKwkJY2FzZSBGT1JNX0JVSUxUSU5fRkxPQVRfS0lORDoKKwkJeworCQkJb3MgPDwgZXhwckZvcm0uc3RyKCk7CisKKwkJCWJyZWFrOworCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJPDwgIlVuZXhwZWN0ZWQgQkFTRUZPUk0gS0lORCBhcyBleHByZXNzaW9uIDw8ICIKKwkJCQkJPDwgZXhwckZvcm0uc3RyKCkgPDwgIiA+PiAhISEiCisJCQkJCTw8IFNFTkRfRVhJVDsKKworCQkJb3MgPDwgZXhwckZvcm0uc3RyKCk7CisKKwkJCWJyZWFrOworCQl9CisJfQorCisJb3MgPDwgRU9MOworfQorCisjZW5kaWYgLyogX0FWTV9TT0xWRVJfWjNfQ1BQXyAqLworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworCisjZW5kaWYgLyogX0FWTV9TT0xWRVJfWjNfICovCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3NvbHZlci9aM1NvbHZlci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc29sdmVyL1ozU29sdmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRlM2Y1MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3NvbHZlci9aM1NvbHZlci5oCkBAIC0wLDAgKzEsMzE4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjkgZsOpdnIuIDIwMTIKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gVE9ETyBmb3IgPDwgejMgY3BwIGludGVyZmFjZSA+PgorLy8jZGVmaW5lIF9BVk1fU09MVkVSX1ozX0NQUF8KKworCisjaWZuZGVmIFNPTFZFUl9aM19IXworI2RlZmluZSBTT0xWRVJfWjNfSF8KKworI2luY2x1ZGUgPHNvbHZlci9hcGkvU29sdmVyRGVmLmg+CisvKgorICogSGVyZSBiZWNhdXNlICJTb2x2ZXJEZWYuaCIgY291bGQgZGVmaW5lIHRoaXMgbWFjcm8KKyAqLworI2lmIGRlZmluZWQoIF9BVk1fU09MVkVSX1ozXyApCisKKworI2luY2x1ZGUgPHNvbHZlci9hcGkvU210U29sdmVyLmg+CisKKyNpbmNsdWRlIDx6My96MysrLmg+CisKKworI2luY2x1ZGUgPGNvbW1vbi9CRi5oPgorCisjaW5jbHVkZSA8Y29sbGVjdGlvbi9CRkNvbnRhaW5lci5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZkRhdGEuaD4KKworI2luY2x1ZGUgPGZtbC90eXBlL0Jhc2VUeXBlU3BlY2lmaWVyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBXT2JqZWN0OworCisKKyNpZiBkZWZpbmVkKCBfQVZNX1NPTFZFUl9aM19DUFBfICkKKworCitjbGFzcyBaM1NvbHZlciA6CisJCXB1YmxpYyBTbXRTb2x2ZXI8IHozOjpzeW1ib2wgLCB6Mzo6c29ydCAsIHozOjpleHByICwgdHJ1ZSAsIGZhbHNlID4KK3sKKworCUFWTV9ERUNMQVJFX1VOQ0xPTkFCTEVfQ0xBU1MoWjNTb2x2ZXIpCisKKworcHVibGljOgorCS8qCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIElECisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCXN0YXRpYyBzdGQ6OnN0cmluZyBJRDsKKworCXN0YXRpYyBzdGQ6OnN0cmluZyBERVNDUklQVElPTjsKKworCXN0YXRpYyBhdm1fdWludDY0X3QgU09MVkVSX1NFU1NJT05fSUQ7CisKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKiovCisJejM6OmNvbmZpZyAqIENGRzsKKworCXozOjpjb250ZXh0ICogQ1RYOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlaM1NvbHZlcigpCisJOiBiYXNlX3RoaXNfdHlwZSggKSwKKwlDRkcoIE5VTEwgKSwKKwlDVFgoIE5VTEwgKQorCXsKKwkJLy8hISEgTk9USElORworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgflozU29sdmVyKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJICogQ09ORklHVVJFCisJICovCisJdmlydHVhbCBib29sIGNvbmZpZ3VyZSgKKwkJCUNvbmZpZ3VyYXRpb24gJiBhQ29uZmlndXJhdGlvbiwgV09iamVjdCAqIHdmRmlsdGVyT2JqZWN0LAorCQkJTGlzdE9mUGFpck1hY2hpbmVEYXRhICYgbGlzdE9mU2VsZWN0ZWRWYXJpYWJsZSk7CisKKworCS8qKgorCSAqIFBST1ZFUgorCSAqLworCXZpcnR1YWwgYm9vbCBpc1N1YlNldCgKKwkJCWNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBuZXdFQywgY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIG9sZEVDKTsKKworCXZpcnR1YWwgYm9vbCBpc0VxdWFsU2V0KAorCQkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIG5ld0VDLCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgb2xkRUMpOworCisJdmlydHVhbCBTb2x2ZXJEZWY6OlNBVElTRklBQklMSVRZX1JJTkcgaXNTYXRpc2ZpYWJsZShjb25zdCBCRiAmIGFDb25kaXRpb24pOworCisKKwkvKioKKwkgKiBTT0xWRVIKKwkgKi8KKwl2aXJ0dWFsIGJvb2wgc29sdmVJbXBsKGNvbnN0IEJGICYgYUNvbmRpdGlvbiwKKwkJCUJGVmVjdG9yICYgZGF0YVZlY3RvciwgQkZWZWN0b3IgJiB2YWx1ZXNWZWN0b3IpOworCisKKwkvKioKKwkgKiBDUkVBVEUgLSBERVNUUk9ZCisJICogVmFsaWRpdHlDaGVja2VyCisJICovCisJYm9vbCBjcmVhdGVDaGVja2VyKHozOjpjb25maWcgJiBjZmcsIHozOjpjb250ZXh0ICYgY3R4KTsKKwlib29sIGRlc3Ryb3lDaGVja2VyKCk7CisJYm9vbCByZXNldFRhYmxlKCk7CisKKworCS8qKgorCSAqIFRPT0xTCisJICovCisKKwl6Mzo6c29ydCBnZXRaM1R5cGUoQmFzZVR5cGVTcGVjaWZpZXIgKiBidHMpOworCisJejM6OmV4cHIgZ2V0UGFyYW1ldGVyRXhwcihjb25zdCBCRiAmIGFQYXJhbWV0ZXIpOworCXozOjpleHByIGdldFZhcmlhYmxlRXhwcihJbnN0YW5jZU9mRGF0YSAqIGFWYXIsIHN0ZDo6c2l6ZV90IHZhcklEKTsKKworCisJejM6OmV4cHIgc2FmZV9mcm9tX2Jhc2Vmb3JtKGNvbnN0IEJGICYgZXhwckZvcm0sCisJCQlCYXNlVHlwZVNwZWNpZmllciAqIHR5cGVTcGVjaWZpZXIgPSBOVUxMKTsKKworCXozOjpleHByIGZyb21fYmFzZWZvcm0oY29uc3QgQkYgJiBleHByRm9ybSwKKwkJCUJhc2VUeXBlU3BlY2lmaWVyICogdHlwZVNwZWNpZmllciA9IE5VTEwpOworCisJQkYgdG9fYmFzZWZvcm0oejM6Om1vZGVsIHozTW9kZWwsIHozOjpleHByIHozRm9ybSk7CisKKworCS8qKgorCSAqIFVzaW5nIGZpbGUgQVBJCisJICovCisKKwl2aXJ0dWFsIFNvbHZlckRlZjo6U0FUSVNGSUFCSUxJVFlfUklORyBzbXRfY2hlY2tfc2F0KGNvbnN0IEJGICYgYUNvbmRpdGlvbik7CisKKwl2aXJ0dWFsIGJvb2wgc210X2NoZWNrX21vZGVsKGNvbnN0IEJGICYgYUNvbmRpdGlvbiwKKwkJCUJGVmVjdG9yICYgZGF0YVZlY3RvciwgQkZWZWN0b3IgJiB2YWx1ZXNWZWN0b3IpOworCisJdmlydHVhbCBTb2x2ZXJEZWY6OlNBVElTRklBQklMSVRZX1JJTkcgZnJvbV9zbXRfc2F0KGNvbnN0IEJGICYgYUNvbmRpdGlvbik7CisKKwl2aXJ0dWFsIGJvb2wgZnJvbV9zbXRfbW9kZWwoY29uc3QgQkYgJiBhQ29uZGl0aW9uLAorCQkJQkZWZWN0b3IgJiBkYXRhVmVjdG9yLCBCRlZlY3RvciAmIHZhbHVlc1ZlY3Rvcik7CisKKwl2aXJ0dWFsIHZvaWQgdG9fc210KE91dFN0cmVhbSAmIG9zLAorCQkJY29uc3QgQkYgJiBleHByRm9ybSwgQkZWZWN0b3IgJiBkYXRhVmVjdG9yKSBjb25zdDsKKworfTsKKworCisjZWxzZSAvKiBOT1QgX0FWTV9TT0xWRVJfWjNfQ1BQXyAgPT0+IF9BVk1fU09MVkVSX1ozX0MgPDwgZGVmYXVsdCA+PiAqLworCisKK2NsYXNzIFozU29sdmVyIDoKKwkJcHVibGljIFNtdFNvbHZlcjwgWjNfc3ltYm9sICwgWjNfc29ydCAsIFozX2FzdCAsIHRydWUgLCB0cnVlID4KK3sKKworCUFWTV9ERUNMQVJFX1VOQ0xPTkFCTEVfQ0xBU1MoWjNTb2x2ZXIpCisKKworcHVibGljOgorCS8qCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIElECisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCXN0YXRpYyBzdGQ6OnN0cmluZyBJRDsKKworCXN0YXRpYyBzdGQ6OnN0cmluZyBERVNDUklQVElPTjsKKworCXN0YXRpYyBhdm1fdWludDY0X3QgU09MVkVSX1NFU1NJT05fSUQ7CisKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlaM19jb25maWcgQ0ZHOworCisJWjNfY29udGV4dCBDVFg7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCVozU29sdmVyKCkKKwk6IGJhc2VfdGhpc190eXBlKE5VTEwsIE5VTEwpLAorCUNGRyggTlVMTCApLAorCUNUWCggTlVMTCApCisJeworCQkvLyEhISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBERVNUUlVDVE9SCisJICovCisJdmlydHVhbCB+WjNTb2x2ZXIoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBDT05GSUdVUkUKKwkgKi8KKwl2aXJ0dWFsIGJvb2wgY29uZmlndXJlKAorCQkJQ29uZmlndXJhdGlvbiAmIGFDb25maWd1cmF0aW9uLCBXT2JqZWN0ICogd2ZGaWx0ZXJPYmplY3QsCisJCQlMaXN0T2ZQYWlyTWFjaGluZURhdGEgJiBsaXN0T2ZTZWxlY3RlZFZhcmlhYmxlKTsKKworCisJLyoqCisJICogUFJPVkVSCisJICovCisJdmlydHVhbCBib29sIGlzU3ViU2V0KAorCQkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIG5ld0VDLCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgb2xkRUMpOworCisJdmlydHVhbCBib29sIGlzRXF1YWxTZXQoCisJCQljb25zdCBFeGVjdXRpb25Db250ZXh0ICYgbmV3RUMsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBvbGRFQyk7CisKKwl2aXJ0dWFsIFNvbHZlckRlZjo6U0FUSVNGSUFCSUxJVFlfUklORyBpc1NhdGlzZmlhYmxlKGNvbnN0IEJGICYgYUNvbmRpdGlvbik7CisKKworCS8qKgorCSAqIFNPTFZFUgorCSAqLworCXZpcnR1YWwgYm9vbCBzb2x2ZUltcGwoY29uc3QgQkYgJiBhQ29uZGl0aW9uLAorCQkJQkZWZWN0b3IgJiBkYXRhVmVjdG9yLCBCRlZlY3RvciAmIHZhbHVlc1ZlY3Rvcik7CisKKworCS8qKgorCSAqIENSRUFURSAtIERFU1RST1kKKwkgKiBWYWxpZGl0eUNoZWNrZXIKKwkgKi8KKwlib29sIGNyZWF0ZUNoZWNrZXIoKTsKKwlib29sIGRlc3Ryb3lDaGVja2VyKCk7CisJYm9vbCByZXNldFRhYmxlKCk7CisKKworCS8qKgorCSAqIFRPT0xTCisJICovCisKKwlaM19zb3J0IGdldFozVHlwZShCYXNlVHlwZVNwZWNpZmllciAqIGJ0cyk7CisKKwlaM19hc3QgZ2V0UGFyYW1ldGVyRXhwcihjb25zdCBCRiAmIGFQYXJhbWV0ZXIpOworCVozX2FzdCBnZXRWYXJpYWJsZUV4cHIoSW5zdGFuY2VPZkRhdGEgKiBhVmFyLCBzdGQ6OnNpemVfdCB2YXJJRCk7CisKKworCVozX2FzdCBzYWZlX2Zyb21fYmFzZWZvcm0oY29uc3QgQkYgJiBleHByRm9ybSwKKwkJCUJhc2VUeXBlU3BlY2lmaWVyICogdHlwZVNwZWNpZmllciA9IE5VTEwpOworCisJWjNfYXN0IGZyb21fYmFzZWZvcm0oY29uc3QgQkYgJiBleHByRm9ybSwKKwkJCUJhc2VUeXBlU3BlY2lmaWVyICogdHlwZVNwZWNpZmllciA9IE5VTEwpOworCisJQkYgdG9fYmFzZWZvcm0oWjNfbW9kZWwgbW9kZWwsIFozX2FzdCB6M0Zvcm0pOworCisKKwkvKioKKwkgKiBVc2luZyBmaWxlIEFQSQorCSAqLworCisJdmlydHVhbCBTb2x2ZXJEZWY6OlNBVElTRklBQklMSVRZX1JJTkcgc210X2NoZWNrX3NhdChjb25zdCBCRiAmIGFDb25kaXRpb24pOworCisJdmlydHVhbCBib29sIHNtdF9jaGVja19tb2RlbChjb25zdCBCRiAmIGFDb25kaXRpb24sCisJCQlCRlZlY3RvciAmIGRhdGFWZWN0b3IsIEJGVmVjdG9yICYgdmFsdWVzVmVjdG9yKTsKKworCXZpcnR1YWwgU29sdmVyRGVmOjpTQVRJU0ZJQUJJTElUWV9SSU5HIGZyb21fc210X3NhdChjb25zdCBCRiAmIGFDb25kaXRpb24pOworCisJdmlydHVhbCBib29sIGZyb21fc210X21vZGVsKGNvbnN0IEJGICYgYUNvbmRpdGlvbiwKKwkJCUJGVmVjdG9yICYgZGF0YVZlY3RvciwgQkZWZWN0b3IgJiB2YWx1ZXNWZWN0b3IpOworCisJdmlydHVhbCB2b2lkIHRvX3NtdChPdXRTdHJlYW0gJiBvcywKKwkJCWNvbnN0IEJGICYgZXhwckZvcm0sIEJGVmVjdG9yICYgZGF0YVZlY3RvcikgY29uc3Q7CisKK307CisKKworI2VuZGlmIC8qIF9BVk1fU09MVkVSX1ozX0NQUF8gKi8KKworCit9IC8qIG5hbWVzcGFjZSBzZXAgKi8KKworI2VuZGlmIC8qIF9BVk1fU09MVkVSX1ozXyAqLworCisKKyNlbmRpZiAvKiBTT0xWRVJfWjNfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3NvbHZlci9hcGkvU2F0U29sdmVyLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3NvbHZlci9hcGkvU2F0U29sdmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTgwYjAzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc29sdmVyL2FwaS9TYXRTb2x2ZXIuY3BwCkBAIC0wLDAgKzEsMTUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiU2F0U29sdmVyLmgiCisKKworI2luY2x1ZGUgPHV0aWwvYXZtX3Zmcy5oPgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkNvbnN0YW50Lmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkNvbnN0cnVjdG9yLmg+CisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkZhY3RvcnkuaD4KKworI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9XT2JqZWN0Lmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBDb25maWd1cmF0aW9uOworCisKK2Jvb2wgU2F0U29sdmVyOjpjb25maWd1cmUoCisJCUNvbmZpZ3VyYXRpb24gJiBhQ29uZmlndXJhdGlvbiwgV09iamVjdCAqIHdmRmlsdGVyT2JqZWN0LAorCQlMaXN0T2ZQYWlyTWFjaGluZURhdGEgJiBsaXN0T2ZTZWxlY3RlZFZhcmlhYmxlKQoreworCW1MaXN0T2ZTZWxlY3RlZFZhcmlhYmxlID0gbGlzdE9mU2VsZWN0ZWRWYXJpYWJsZTsKKworCWlmKCBtTGlzdE9mU2VsZWN0ZWRWYXJpYWJsZS5lbXB0eSgpICkKKwl7CisJCUFWTV9PU19XQVJOSU5HX0FMRVJUCisJCQkJPDwgIlVuZXhwZWN0ZWQgaW4gU2F0U29sdmVyICIKKwkJCQkJImFuIGVtcHR5IHNlbGVjdGVkIHZhcmlhYmxlIGxpc3QgISEhIgorCQkJCTw8IFNFTkRfQUxFUlQ7CisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisKK0FWTV9JRl9ERUJVR19GTEFHMiggQ09ORklHVVJJTkcgLCBTT0xWSU5HICkKKwlBVk1fT1NfVFJBQ0UgPDwgc3RkOjplbmRsCisJCQk8PCAiTGlzdGVzIGRlcyB2YXJpYWJsZXMgdXRpbGlzw6llcyBwb3VyIGxhIHJlZG9uZGFuY2UiIDw8IHN0ZDo6ZW5kbDsKKworCXN0ZDo6c2l6ZV90IHZhckNvdW50ID0gMDsKKwlMaXN0T2ZJbnN0YW5jZU9mRGF0YTo6Y29uc3RfaXRlcmF0b3IgaXRWYXI7CisJTGlzdE9mSW5zdGFuY2VPZkRhdGE6OmNvbnN0X2l0ZXJhdG9yIGVuZFZhcjsKKworCUxpc3RPZlBhaXJNYWNoaW5lRGF0YTo6Y29uc3RfaXRlcmF0b3IgaXRQYWlyTWFjaGluZURhdGEgPQorCQkJbUxpc3RPZlNlbGVjdGVkVmFyaWFibGUuYmVnaW4oKTsKKwlMaXN0T2ZQYWlyTWFjaGluZURhdGE6OmNvbnN0X2l0ZXJhdG9yIGVuZFBhaXJNYWNoaW5lRGF0YSA9CisJCQltTGlzdE9mU2VsZWN0ZWRWYXJpYWJsZS5lbmQoKTsKKwlmb3IoIDsgaXRQYWlyTWFjaGluZURhdGEgIT0gZW5kUGFpck1hY2hpbmVEYXRhIDsgKytpdFBhaXJNYWNoaW5lRGF0YSApCisJeworCQlBVk1fT1NfVFJBQ0UgPDwgIlx0IiA8PCAiTWFjaGluZTo+ICIKKwkJCQk8PCAoKml0UGFpck1hY2hpbmVEYXRhKS5maXJzdCgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgc3RkOjplbmRsOworCisJCWlmKCAoKml0UGFpck1hY2hpbmVEYXRhKS5zZWNvbmQoKS5ub25lbXB0eSgpICkKKwkJeworCQkJaXRWYXIgPSAoKml0UGFpck1hY2hpbmVEYXRhKS5zZWNvbmQoKS5iZWdpbigpOworCQkJZW5kVmFyID0gKCppdFBhaXJNYWNoaW5lRGF0YSkuc2Vjb25kKCkuZW5kKCk7CisJCQlmb3IoIDsgaXRWYXIgIT0gZW5kVmFyIDsgKytpdFZhciAsICsrdmFyQ291bnQgKQorCQkJeworCQkJCUFWTV9PU19UUkFDRSA8PCAiXHRcdCIgPDwgc3RyX2hlYWRlciggKml0VmFyICkgPDwgc3RkOjplbmRsOworCQkJfQorCQl9CisJfQorCisJQVZNX09TX1RSQUNFIDw8ICJUb3RhbDo+ICIgPDwgdmFyQ291bnQgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19GTEFHMiggQ09ORklHVVJJTkcgLCBTT0xWSU5HICkKKworCisJbUxvZ0ZvbGRlckxvY2F0aW9uID0gVkZTOjpQcm9qZWN0RGVidWdQYXRoOworCisJcmV0dXJuKCB0cnVlICk7Cit9CisKKworCisvKioKKyAqIFNPTFZFUgorICogYW4gZW1wdHkgPDwgZGF0YVZlY3RvciA+PiBjb21wdXRlIGJ5IHRoZSBzb2x2ZXIKKyAqIGFuIGVtcHR5IDw8IHZhbHVlc1ZlY3RvciA+PiBjb21wdXRlIGJ5IHRoZSBzb2x2ZXIKKyAqLworYm9vbCBTYXRTb2x2ZXI6OnNvbHZlKGNvbnN0IEJGICYgYUNvbmRpdGlvbiwKKwkJQkZWZWN0b3IgJiBkYXRhVmVjdG9yLCBCRlZlY3RvciAmIHZhbHVlc1ZlY3RvcikKK3sKKwlCRiBmdWxsQ29uZGl0aW9uID0gY29tcGxldGVVc2luZ0RhdGFUeXBlQ29uc3RyYWludChhQ29uZGl0aW9uLCBkYXRhVmVjdG9yKTsKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIE1FRElVTSAsIFNPTFZJTkcgKQorCUFWTV9PU19UUkFDRSA8PCAiU2F0U29sdmVyOjpzb2x2ZSguLi4pIDo+IiA8PCBzdGQ6OmVuZGwKKwkJCTw8ICJcdGNvbmRpdGlvbjo+ICIgPDwgYUNvbmRpdGlvbi5zdHIoKSA8PCBzdGQ6OmVuZGwKKwkJCTw8ICJcdGZ1bGwgY29uZDo+ICIgPDwgZnVsbENvbmRpdGlvbi5zdHIoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggTUVESVVNICwgU09MVklORyApCisKKwlpZiggZnVsbENvbmRpdGlvbi5pc0VxdWFsVHJ1ZSgpICkKKwl7CisJCXJldHVybiggdHJ1ZSApOworCX0KKwllbHNlIGlmKCBmdWxsQ29uZGl0aW9uLmlzRXF1YWxGYWxzZSgpICkKKwl7CisJCXJldHVybiggZmFsc2UgKTsKKwl9CisKKwlyZXR1cm4oIHNvbHZlSW1wbChmdWxsQ29uZGl0aW9uLCBkYXRhVmVjdG9yLCB2YWx1ZXNWZWN0b3IpICk7Cit9CisKKworQkYgU2F0U29sdmVyOjpjb21wbGV0ZVVzaW5nRGF0YVR5cGVDb25zdHJhaW50KAorCQljb25zdCBCRiAmIGFDb25kaXRpb24sIEJGVmVjdG9yICYgZGF0YVZlY3RvcikgY29uc3QKK3sKKwlCRiBhbGxDb25kaXRpb24gPSBhQ29uZGl0aW9uOworCUJGIHR5cGVDb25zdHJhaW50OworCisJQkZWZWN0b3IgcGFyYW1zVmVjdG9yKCBkYXRhVmVjdG9yICk7CisJRXhwcmVzc2lvbkZhY3Rvcnk6OmNvbGxlY3RWYXJpYWJsZShhQ29uZGl0aW9uLCBwYXJhbXNWZWN0b3IpOworCisJQkZWZWN0b3I6OnJhd19pdGVyYXRvcjwgSW5zdGFuY2VPZkRhdGEgPiBpdFBhcmFtID0gcGFyYW1zVmVjdG9yLmJlZ2luKCk7CisJQkZWZWN0b3I6OnJhd19pdGVyYXRvcjwgSW5zdGFuY2VPZkRhdGEgPiBlbmRQYXJhbSA9IHBhcmFtc1ZlY3Rvci5lbmQoKTsKKwlmb3IoIDsgaXRQYXJhbSAhPSBlbmRQYXJhbSA7ICsraXRQYXJhbSApCisJeworCQl0eXBlQ29uc3RyYWludCA9IChpdFBhcmFtKS0+Z2V0VHlwZVNwZWNpZmllcigpLT5nZW5Db25zdHJhaW50KCAqaXRQYXJhbSApOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFNPTFZJTkcgKQorCQlBVk1fT1NfVFJBQ0UgPDwgImNvbXBsZXRlVXNpbmdEYXRhVHlwZUNvbnN0cmFpbnQ6PiAiCisJCQkJPDwgc3RyX2hlYWRlciggKml0UGFyYW0gKSA8PCBzdGQ6OmVuZGwKKwkJCQk8PCAiXHRjb25zdHJhaW50Oj4gIiA8PCB0eXBlQ29uc3RyYWludC5zdHIoKSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFNPTFZJTkcgKQorCisJCWlmKCB0eXBlQ29uc3RyYWludC5pc0VxdWFsRmFsc2UoKSApCisJCXsKKwkJCXJldHVybiggRXhwcmVzc2lvbkNvbnN0YW50OjpCT09MRUFOX0ZBTFNFICk7CisJCX0KKwkJZWxzZSBpZiggdHlwZUNvbnN0cmFpbnQuaXNOb3RFcXVhbFRydWUoKSApCisJCXsKKwkJCWFsbENvbmRpdGlvbiA9IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6YW5kRXhwcigKKwkJCQkJYWxsQ29uZGl0aW9uLCB0eXBlQ29uc3RyYWludCk7CisJCX0KKwl9CisKKwlyZXR1cm4oIGFsbENvbmRpdGlvbiApOworfQorCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3NvbHZlci9hcGkvU2F0U29sdmVyLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9zb2x2ZXIvYXBpL1NhdFNvbHZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZWVlMjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9zb2x2ZXIvYXBpL1NhdFNvbHZlci5oCkBAIC0wLDAgKzEsMTkxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFNPTFZFUl9BQlNUUkFDVFNPTFZFUl9IXworI2RlZmluZSBTT0xWRVJfQUJTVFJBQ1RTT0xWRVJfSF8KKworI2luY2x1ZGUgPGNvbW1vbi9SdW5uYWJsZUVsZW1lbnQuaD4KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vVHlwZWRlZi5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZkRhdGEuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL1J1bnRpbWVJRC5oPgorCisjaW5jbHVkZSA8c29sdmVyL2FwaS9Tb2x2ZXJEZWYuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKK2NsYXNzIEJGOworCitjbGFzcyBDb25maWd1cmF0aW9uOworCitjbGFzcyBFeGVjdXRpb25Db250ZXh0OworCitjbGFzcyBFeGVjdXRpb25EYXRhOworCitjbGFzcyBXT2JqZWN0OworCisKK2NsYXNzIFNhdFNvbHZlciAgOiAgcHVibGljIFJ1bm5hYmxlRWxlbWVudAoreworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogQVRUUklCVVRFUworCSAqLworCUxpc3RPZlBhaXJNYWNoaW5lRGF0YSBtTGlzdE9mU2VsZWN0ZWRWYXJpYWJsZTsKKworCWJvb2wgbUN1cnJlbnRQYXRoU2NvcGVGbGFnOworCisJc3RkOjpzdHJpbmcgbUxvZ0ZvbGRlckxvY2F0aW9uOworCisKK3B1YmxpYzoKKwkvKioKKwkgKiBDT05TVFJVQ1RPUgorCSAqIERlZmF1bHQKKwkgKi8KKwlTYXRTb2x2ZXIoKQorCTogUnVubmFibGVFbGVtZW50KCBOVUxMICksCisJbUxpc3RPZlNlbGVjdGVkVmFyaWFibGUoICksCisJbUN1cnJlbnRQYXRoU2NvcGVGbGFnKCBmYWxzZSApLAorCW1Mb2dGb2xkZXJMb2NhdGlvbiggKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgflNhdFNvbHZlcigpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBDT05GSUdVUkUKKwkgKi8KKwl2aXJ0dWFsIGJvb2wgY29uZmlndXJlKAorCQkJQ29uZmlndXJhdGlvbiAmIGFDb25maWd1cmF0aW9uLCBXT2JqZWN0ICogd2ZGaWx0ZXJPYmplY3QsCisJCQlMaXN0T2ZQYWlyTWFjaGluZURhdGEgJiBsaXN0T2ZTZWxlY3RlZFZhcmlhYmxlKTsKKworCisJLyoqCisJICogSU5JVCAvIEVYSVQKKwkgKi8KKwl2aXJ0dWFsIGJvb2wgaW5pdEltcGwoKQorCXsKKwkJLy8hISBOT1RISU5HCisJCXJldHVybiB0cnVlOworCX0KKworCXZpcnR1YWwgYm9vbCBleGl0SW1wbCgpCisJeworCQkvLyEhIE5PVEhJTkcKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUxpc3RPZlNlbGVjdGVkVmFyaWFibGUKKwkgKi8KKwlpbmxpbmUgTGlzdE9mUGFpck1hY2hpbmVEYXRhICYgZ2V0U2VsZWN0ZWRWYXJpYWJsZSgpCisJeworCQlyZXR1cm4oIG1MaXN0T2ZTZWxlY3RlZFZhcmlhYmxlICk7CisJfQorCisJaW5saW5lIGJvb2wgaGFzU2VsZWN0ZWRWYXJpYWJsZSgpCisJeworCQlyZXR1cm4oIG1MaXN0T2ZTZWxlY3RlZFZhcmlhYmxlLm5vbmVtcHR5KCkgKTsKKwl9CisKKwlpbmxpbmUgdmlydHVhbCB2b2lkIHNldFNlbGVjdGVkVmFyaWFibGUoTGlzdE9mUGFpck1hY2hpbmVEYXRhICYgYUxpc3QpCisJeworCQltTGlzdE9mU2VsZWN0ZWRWYXJpYWJsZSA9IGFMaXN0OworCX0KKworCWlubGluZSB2aXJ0dWFsIHZvaWQgc2V0U2VsZWN0ZWRWYXJpYWJsZSgKKwkJCWNvbnN0IEV4ZWN1dGlvbkRhdGEgJiBhcEVELCBMaXN0T2ZQYWlyTWFjaGluZURhdGEgJiBhTGlzdCkKKwl7CisJCW1MaXN0T2ZTZWxlY3RlZFZhcmlhYmxlID0gYUxpc3Q7CisJfQorCisKKwkvKioKKwkgKiBHRVRURVIgLSBTRVRURVIKKwkgKiBtQ3VycmVudFBhdGhTY29wZUZsYWcKKwkgKi8KKwlpbmxpbmUgYm9vbCBpc0N1cnJlbnRQYXRoU2NvcGUoKQorCXsKKwkJcmV0dXJuKCBtQ3VycmVudFBhdGhTY29wZUZsYWcgKTsKKwl9CisKKwlpbmxpbmUgdm9pZCBzZXRDdXJyZW50UGF0aFNjb3BlKGJvb2wgYUN1cnJlbnRQYXRoU2NvcGVGbGFnKQorCXsKKwkJbUN1cnJlbnRQYXRoU2NvcGVGbGFnID0gYUN1cnJlbnRQYXRoU2NvcGVGbGFnOworCX0KKworCisJLyoqCisJICogR0VUVEVSIC0gU0VUVEVSCisJICogbUxvZ0ZvbGRlckxvY2F0aW9uCisJICovCisJaW5saW5lIHN0ZDo6c3RyaW5nIGdldExvZ0ZvbGRlckxvY2F0aW9uKCkKKwl7CisJCXJldHVybiggbUxvZ0ZvbGRlckxvY2F0aW9uICk7CisJfQorCisJaW5saW5lIHZvaWQgc2V0TG9nRm9sZGVyTG9jYXRpb24oY29uc3Qgc3RkOjpzdHJpbmcgJiBhTG9jYXRpb24pCisJeworCQltTG9nRm9sZGVyTG9jYXRpb24gPSBhTG9jYXRpb247CisJfQorCisKKworCS8qKgorCSAqIFBST1ZFUgorCSAqLworCXZpcnR1YWwgYm9vbCBpc1N1YlNldCgKKwkJCWNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBuZXdFQywKKwkJCWNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBvbGRFQykgPSAwOworCisJdmlydHVhbCBib29sIGlzRXF1YWxTZXQoCisJCQljb25zdCBFeGVjdXRpb25Db250ZXh0ICYgbmV3RUMsCisJCQljb25zdCBFeGVjdXRpb25Db250ZXh0ICYgb2xkRUMpID0gMDsKKworCXZpcnR1YWwgU29sdmVyRGVmOjpTQVRJU0ZJQUJJTElUWV9SSU5HIGlzU2F0aXNmaWFibGUoCisJCQljb25zdCBCRiAmIGFDb25kaXRpb24pID0gMDsKKworCisJLyoqCisJICogU09MVkVSCisJICogYW4gZW1wdHkgPDwgZGF0YVZlY3RvciA+PiBjb21wdXRlIGJ5IHRoZSBzb2x2ZXIKKwkgKiBhbiBlbXB0eSA8PCB2YWx1ZXNWZWN0b3IgPj4gY29tcHV0ZSBieSB0aGUgc29sdmVyCisJICovCisJYm9vbCBzb2x2ZShjb25zdCBCRiAmIGFDb25kaXRpb24sCisJCQlCRlZlY3RvciAmIGRhdGFWZWN0b3IsIEJGVmVjdG9yICYgdmFsdWVzVmVjdG9yKTsKKworCXZpcnR1YWwgYm9vbCBzb2x2ZUltcGwoY29uc3QgQkYgJiBhQ29uZGl0aW9uLAorCQkJQkZWZWN0b3IgJiBkYXRhVmVjdG9yLCBCRlZlY3RvciAmIHZhbHVlc1ZlY3RvcikgPSAwOworCisKKwlCRiBjb21wbGV0ZVVzaW5nRGF0YVR5cGVDb25zdHJhaW50KAorCQkJY29uc3QgQkYgJiBhQ29uZGl0aW9uLCBCRlZlY3RvciAmIGRhdGFWZWN0b3IpIGNvbnN0OworCit9OworCit9CisKKyNlbmRpZiAvKlNPTFZFUl9BQlNUUkFDVFNPTFZFUl9IXyovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9zb2x2ZXIvYXBpL1NtdFNvbHZlci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc29sdmVyL2FwaS9TbXRTb2x2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmU5YzU0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc29sdmVyL2FwaS9TbXRTb2x2ZXIuaApAQCAtMCwwICsxLDU3OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDcgZMOpYy4gMjAxMgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFNPTFZFUl9CQVNFU01UU09MVkVSX0hfCisjZGVmaW5lIFNPTFZFUl9CQVNFU01UU09MVkVSX0hfCisKKyNpbmNsdWRlIDxzb2x2ZXIvYXBpL1NhdFNvbHZlci5oPgorCisjaW5jbHVkZSA8Y29tbW9uL0JGLmg+CisKKyNpbmNsdWRlIDxjb2xsZWN0aW9uL1R5cGVkZWYuaD4KKworI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZEYXRhLmg+CisKKworI2RlZmluZSBTTVRfQVJHU19EQVRBX0lOSVRJQUxfQ09VTlQgICAgICAxNgorCisjZGVmaW5lIFNNVF9BUkdTX0RBVEFfUk9PVF9DQVBBQ0lUWSAgICAgNTEyCisjZGVmaW5lIFNNVF9BUkdTX0RBVEFfREVGQVVMVF9DQVBBQ0lUWSAgIDY0CisKKyNkZWZpbmUgU01UX0FSR1NfREFUQV9JTkNSX0NBUEFDSVRZICAgICAgMTYKKworCituYW1lc3BhY2Ugc2VwCit7CisKK2NsYXNzIENvbmZpZ3VyYXRpb247CisKKwordGVtcGxhdGU8IGNsYXNzIFZhckRlY2xfVCAsIGNsYXNzIFNvcnRfVCAsIGNsYXNzIEV4cHJfVCAsIGJvb2wgYXJyYXlfZWxzZV92ZWN0b3IgPgorY2xhc3MgU210U29sdmVyVHJhaXRzICA6ICBwdWJsaWMgU2F0U29sdmVyCit7CisKK3Byb3RlY3RlZDoKKwkvKioKKwkgKiBBVFRSSUJVVEVTCisJICoqLworCVRhYmxlT2ZJbnN0YW5jZU9mRGF0YSAgbVRhYmxlT2ZQYXJhbWV0ZXJJbnN0YW5jZTsKKwlWZWN0b3I8IFZhckRlY2xfVCA+ICAgIG1UYWJsZU9mUGFyYW1ldGVyRGVjbDsKKwlWZWN0b3I8IEV4cHJfVCAgICA+ICAgIG1UYWJsZU9mUGFyYW1ldGVyRXhwcjsKKworCVZlY3RvcjwgVmFyRGVjbF9UID4gICAgbVRhYmxlT2ZWYXJpYWJsZURlY2w7CisJVmVjdG9yPCBFeHByX1QgICAgPiAgICBtVGFibGVPZlZhcmlhYmxlRXhwcjsKKworCVZlY3RvcjwgRXhwcl9UID4gICAgICAgbVRhYmxlT2ZQYXJhbWV0ZXJFeHByRm9yTmV3Rm9ybXVsYTsKKwlWZWN0b3I8IEV4cHJfVCA+ICAgICAgIG1UYWJsZU9mUGFyYW1ldGVyRXhwckZvck9sZEZvcm11bGE7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCVNtdFNvbHZlclRyYWl0cygpCisJOiBTYXRTb2x2ZXIoKSwKKwltVGFibGVPZlBhcmFtZXRlckluc3RhbmNlKCApLAorCW1UYWJsZU9mUGFyYW1ldGVyRGVjbCggKSwKKwltVGFibGVPZlBhcmFtZXRlckV4cHIoICksCisKKwltVGFibGVPZlZhcmlhYmxlRGVjbCggKSwKKwltVGFibGVPZlZhcmlhYmxlRXhwciggKSwKKworCW1UYWJsZU9mUGFyYW1ldGVyRXhwckZvck5ld0Zvcm11bGEoICksCisJbVRhYmxlT2ZQYXJhbWV0ZXJFeHByRm9yT2xkRm9ybXVsYSggKQorCXsKKwkJLy8hISEgTk9USElORworCX0KKworCisJLyoqCisJICogREVTVFJVQ1RPUgorCSAqLworCXZpcnR1YWwgflNtdFNvbHZlclRyYWl0cygpCisJeworCQlkZXN0cm95Q2hlY2tlcigpOworCX0KKworCisJLyoqCisJICogQ1JFQVRFIC0gREVTVFJPWQorCSAqIFZhbGlkaXR5Q2hlY2tlcgorCSAqLworCWlubGluZSB2aXJ0dWFsIGJvb2wgZGVzdHJveUNoZWNrZXIoKQorCXsKKwkJcmVzZXRUYWJsZSgpOworCisJCXJldHVybiggdHJ1ZSApOworCX0KKworCisJdmlydHVhbCBib29sIHJlc2V0VGFibGUoKQorCXsKKwkJaWYoIG1UYWJsZU9mUGFyYW1ldGVySW5zdGFuY2Uubm9uZW1wdHkoKSApCisJCXsKKwkJCUJGVmVjdG9yOjpyYXdfaXRlcmF0b3I8IEluc3RhbmNlT2ZEYXRhID4gaXQgPQorCQkJCQltVGFibGVPZlBhcmFtZXRlckluc3RhbmNlLmJlZ2luKCk7CisJCQlCRlZlY3Rvcjo6cmF3X2l0ZXJhdG9yPCBJbnN0YW5jZU9mRGF0YSA+IGl0RW5kID0KKwkJCQkJbVRhYmxlT2ZQYXJhbWV0ZXJJbnN0YW5jZS5lbmQoKTsKKwkJCWZvciggKytpdCAvKiBpZ25vcmUgc2VudGluZWwgKi8gOyBpdCAhPSBpdEVuZCA7ICsraXQgKQorCQkJeworCQkJCShpdCktPnNldE1hcmsoMCk7CisJCQl9CisJCQltVGFibGVPZlBhcmFtZXRlckluc3RhbmNlLmNsZWFyKCk7CisJCX0KKwkJbVRhYmxlT2ZQYXJhbWV0ZXJJbnN0YW5jZS5hcHBlbmQoIEJGOjpSRUZfTlVMTCApOworCisJCW1UYWJsZU9mUGFyYW1ldGVyRGVjbC5jbGVhcigpOworCQltVGFibGVPZlBhcmFtZXRlckV4cHIuY2xlYXIoKTsKKworCQltVGFibGVPZlZhcmlhYmxlRGVjbC5jbGVhcigpOworCQltVGFibGVPZlZhcmlhYmxlRXhwci5jbGVhcigpOworCisJCW1UYWJsZU9mUGFyYW1ldGVyRXhwckZvck5ld0Zvcm11bGEuY2xlYXIoKTsKKwkJbVRhYmxlT2ZQYXJhbWV0ZXJFeHByRm9yT2xkRm9ybXVsYS5jbGVhcigpOworCisJCXJldHVybiggdHJ1ZSApOworCX0KKworfTsKKworCisKK3RlbXBsYXRlPCBjbGFzcyBWYXJEZWNsX1QgLCBjbGFzcyBTb3J0X1QgLCBjbGFzcyBFeHByX1QgLAorCQlib29sIGFycmF5X2Vsc2VfdmVjdG9yICwgYm9vbCBuZWVkX3R5cGVfY3N0X2RlY2wgPgorY2xhc3MgU210U29sdmVyOworCisKK3RlbXBsYXRlPCBjbGFzcyBWYXJEZWNsX1QgLCBjbGFzcyBTb3J0X1QgLCBjbGFzcyBFeHByX1QgLCBib29sIGFycmF5X2Vsc2VfdmVjdG9yID4KK2NsYXNzIFNtdFNvbHZlcjwgVmFyRGVjbF9UICwgU29ydF9UICwgRXhwcl9UICwgYXJyYXlfZWxzZV92ZWN0b3IgLCB0cnVlID4gOgorCXB1YmxpYyBTbXRTb2x2ZXJUcmFpdHM8IFZhckRlY2xfVCAsIFNvcnRfVCAsIEV4cHJfVCAsIGFycmF5X2Vsc2VfdmVjdG9yID4KK3sKKworCitwcm90ZWN0ZWQ6CisJLyoqCisJICogVFlQRURFRgorCSAqLworCXR5cGVkZWYgU210U29sdmVyPCBWYXJEZWNsX1QgLCBTb3J0X1QgLCBFeHByX1QgLAorCQkJYXJyYXlfZWxzZV92ZWN0b3IgLCB0cnVlID4gIGJhc2VfdGhpc190eXBlOworCisKK3B1YmxpYzoKKwkvKioKKwkqIENPTlNUUlVDVE9SCisJKiBEZWZhdWx0CisJKi8KKwlTbXRTb2x2ZXIoU29ydF9UIG51bGxTb3J0LCBFeHByX1QgbnVsbEV4cHIpCisJOiBTbXRTb2x2ZXJUcmFpdHM8IFZhckRlY2xfVCAsIFNvcnRfVCAsIEV4cHJfVCAsIGFycmF5X2Vsc2VfdmVjdG9yID4oICksCisKKwlTTVRfVFlQRV9CT09MKCBudWxsU29ydCApLAorCVNNVF9UWVBFX05BVCAoIG51bGxTb3J0ICksCisJU01UX1RZUEVfSU5UICggbnVsbFNvcnQgKSwKKwlTTVRfVFlQRV9CVjMyKCBudWxsU29ydCApLAorCVNNVF9UWVBFX0JWNjQoIG51bGxTb3J0ICksCisJU01UX1RZUEVfUkVBTCggbnVsbFNvcnQgKSwKKworCVNNVF9UWVBFX05VTUJFUiggbnVsbFNvcnQgKSwKKworCVNNVF9UWVBFX1NUUklORyggbnVsbFNvcnQgKSwKKworCVNNVF9DU1RfQk9PTF9UUlVFICggbnVsbEV4cHIgKSwKKwlTTVRfQ1NUX0JPT0xfRkFMU0UoIG51bGxFeHByICksCisKKwlTTVRfQ1NUX0lOVF9aRVJPKCBudWxsRXhwciApLAorCVNNVF9DU1RfSU5UX09ORSAoIG51bGxFeHByICkKKwl7CisJCS8vISEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSogREVTVFJVQ1RPUgorCSovCisJdmlydHVhbCB+U210U29sdmVyKCkKKwl7CisJCS8vISEhIE5PVEhJTkcKKwl9CisKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKiovCisJU29ydF9UIFNNVF9UWVBFX0JPT0w7CisJU29ydF9UIFNNVF9UWVBFX05BVDsKKwlTb3J0X1QgU01UX1RZUEVfSU5UOworCVNvcnRfVCBTTVRfVFlQRV9CVjMyOworCVNvcnRfVCBTTVRfVFlQRV9CVjY0OworCVNvcnRfVCBTTVRfVFlQRV9SRUFMOworCisJU29ydF9UIFNNVF9UWVBFX05VTUJFUjsKKworCVNvcnRfVCBTTVRfVFlQRV9TVFJJTkc7CisKKwlFeHByX1QgU01UX0NTVF9CT09MX1RSVUU7CisJRXhwcl9UIFNNVF9DU1RfQk9PTF9GQUxTRTsKKworCUV4cHJfVCBTTVRfQ1NUX0lOVF9aRVJPOworCUV4cHJfVCBTTVRfQ1NUX0lOVF9PTkU7CisKKworcHJvdGVjdGVkOgorCisJdGVtcGxhdGU8IGNsYXNzIGRhdGFfdCAsIGJvb2wgaXNfYXJyYXlfZWxzZV92ZWN0b3IgPgorCXN0cnVjdCBfQVJHU19EQVRBX1RSQUlUU187CisKKwl0ZW1wbGF0ZTwgY2xhc3MgZGF0YV90ID4KKwlzdHJ1Y3QgX0FSR1NfREFUQV9UUkFJVFNfPCBkYXRhX3QgLCB0cnVlID4KKwl7CisJCS8qKgorCQkgKiBBVFRSSUJVVEVTCisJCSAqLworCQlkYXRhX3QgKiB0YWJsZTsKKworCQlzdGQ6OnNpemVfdCBjYXBhY2l0eTsKKwkJc3RkOjpzaXplX3QgY291bnQ7CisJCXN0ZDo6c2l6ZV90IGlkeDsKKworCQkvKioKKwkJICogQ09OU1RSVUNUT1IKKwkJICogRGVmYXVsdAorCQkgKi8KKwkJX0FSR1NfREFUQV9UUkFJVFNfKCBzdGQ6OnNpemVfdCBhQ2FwYWNpdHkgLCBzdGQ6OnNpemVfdCBhQ291bnQgKQorCQk6IHRhYmxlKCBuZXcgZGF0YV90W2FDYXBhY2l0eV0gKSwKKwkJY2FwYWNpdHkoIGFDYXBhY2l0eSApLAorCQljb3VudCggYUNvdW50ICksCisJCWlkeCggMCApCisJCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgU01UX1NPTFZJTkcgKQorCQkJQVZNX09TX1RSQUNFIDw8ICJuZXcgX0FSR1NfREFUQV8gYXMgYXJyYXkgIDo+IgorCQkJCQk8PCAiIGNhcGFjaXR5ID0gIiA8PCBzdGQ6OnNldHcoNCkgPDwgY2FwYWNpdHkKKwkJCQkJPDwgIiA6IGNvdW50ID0gIiA8PCBzdGQ6OnNldHcoNCkgPDwgY291bnQKKwkJCQkJPDwgIiBAIiA8PCBhdm1fYWRkcmVzc190KCB0aGlzICkgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBTTVRfU09MVklORyApCisJCX0KKworCQl2aXJ0dWFsIH5fQVJHU19EQVRBX1RSQUlUU18oKQorCQl7CisJCQlkZWxldGVbXSggdGFibGUgKTsKKwkJfQorCisKKwkJaW5saW5lIHZvaWQgaW50aWFsaXplKCkKKwkJeworCQkJLy8hISEgTk9USElORworCQl9CisKKwkJaW5saW5lIHZvaWQgZmluYWxpemUoKQorCQl7CisvLwkJCWZvciggaWR4ID0gMCA7IGlkeCA8IGNvdW50IDsgKytpZHggKQorLy8JCQl7CisvLwkJCQl0YWJsZVsgaWR4IF0gPSBOVUxMOworLy8JCQl9CisJCQkvLyEhISBOT1RISU5HCisJCX0KKworCX07CisKKworCXRlbXBsYXRlPCBjbGFzcyBkYXRhX3QgPgorCXN0cnVjdCBfQVJHU19EQVRBX1RSQUlUU188IGRhdGFfdCAsIGZhbHNlID4KKwl7CisJCS8qKgorCQkgKiBBVFRSSUJVVEVTCisJCSAqLworCQlzdGQ6OnZlY3RvcjwgZGF0YV90ID4gdGFibGU7CisKKwkJc3RkOjpzaXplX3QgY2FwYWNpdHk7CisJCXN0ZDo6c2l6ZV90IGNvdW50OworCQlzdGQ6OnNpemVfdCBpZHg7CisKKwkJLyoqCisJCSAqIENPTlNUUlVDVE9SCisJCSAqIERlZmF1bHQKKwkJICovCisJCV9BUkdTX0RBVEFfVFJBSVRTXyggc3RkOjpzaXplX3QgYUNhcGFjaXR5ICwgc3RkOjpzaXplX3QgYUNvdW50ICkKKwkJOiB0YWJsZSggYUNhcGFjaXR5ICksCisJCWNhcGFjaXR5KCBhQ2FwYWNpdHkgKSwKKwkJY291bnQoIGFDb3VudCApLAorCQlpZHgoIDAgKQorCQl7CitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFNNVF9TT0xWSU5HICkKKwkJCUFWTV9PU19UUkFDRSA8PCAibmV3IF9BUkdTX0RBVEFfIGFzIGFycmF5ICA6PiIKKwkJCQkJPDwgIiBjYXBhY2l0eSA9ICIgPDwgc3RkOjpzZXR3KDQpIDw8IGNhcGFjaXR5CisJCQkJCTw8ICIgOiBjb3VudCA9ICIgPDwgc3RkOjpzZXR3KDQpIDw8IGNvdW50CisJCQkJCTw8ICIgQCIgPDwgYXZtX2FkZHJlc3NfdCggdGhpcyApIDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgU01UX1NPTFZJTkcgKQorCQl9CisKKwkJdmlydHVhbCB+X0FSR1NfREFUQV9UUkFJVFNfKCkKKwkJeworCQkJdGFibGUuY2xlYXIoKTsKKwkJfQorCisKKwkJaW5saW5lIHZvaWQgaW50aWFsaXplKCkKKwkJeworCQkJdGFibGUucmVzaXplKCBjb3VudCApOworCisvL0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHX0FORCggSElHSCAsIFNNVF9TT0xWSU5HICwgKGNhcGFjaXR5ICE9IHRhYmxlLmNhcGFjaXR5KCkpICkKKwkJCWlmKCAgY2FwYWNpdHkgIT0gdGFibGUuY2FwYWNpdHkoKSApCisJCQl7CisJCQkJQVZNX09TX1RSQUNFIDw8ICJuZXcgX0FSR1NfVFJBSVRTXyBhcyB2ZWN0b3IgOj4iCisJCQkJCQk8PCAiIGNhcGFjaXR5ID0gIiA8PCBjYXBhY2l0eQorCQkJCQkJPDwgIiB2ZWN0b3I8IiA8PCB0YWJsZS5jYXBhY2l0eSgpCisJCQkJCQk8PCAiPiA6IGNvdW50ID0gIiA8PCBjb3VudAorCQkJCQkJPDwgIiBAIiA8PCBhdm1fYWRkcmVzc190KCB0aGlzICkgPDwgc3RkOjplbmRsOworCQkJfQorLy9BVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBR19BTkQoIEhJR0ggLCBTTVRfU09MVklORyApCisJCX0KKworCQlpbmxpbmUgdm9pZCBmaW5hbGl6ZSgpCisJCXsKKwkJCXRhYmxlLmNsZWFyKCk7CisJCX0KKworCX07CisKKworCXR5cGVkZWYgX0FSR1NfREFUQV9UUkFJVFNfPEV4cHJfVCwgYXJyYXlfZWxzZV92ZWN0b3IgPiBBUkdTX0RBVEE7CisKKworCXN0YXRpYyBMaXN0PCBBUkdTX0RBVEEgKiA+IEFSR19DQUNIRTsKKworCisJaW5saW5lIHN0YXRpYyBBUkdTX0RBVEEgKiBuZXdBUkdTKCBzdGQ6OnNpemVfdCBjb3VudCApCisJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBTTVRfU09MVklORyApCisJCUFWTV9PU19UUkFDRSA8PCAibmV3QVJHUyA6PiBjb3VudCA9ICIgPDwgc3RkOjpzZXR3KDQpIDw8IGNvdW50OworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBTTVRfU09MVklORyApCisKKwkJQVJHU19EQVRBICogYXJnID0gTlVMTDsKKy8vCQlpZiggQVJHX0NBQ0hFLnBvcHVsYXRlZCgpICkKKy8vCQl7CisvLwkJCWlmKCBBUkdfQ0FDSEUubm9uZW1wdHkoKSAmJgorLy8JCQkJCShBUkdfQ0FDSEUubGFzdCgpLT5jYXBhY2l0eSA+IGNvdW50KSApCisvLwkJCXsKKy8vCQkJCUFSR19DQUNIRS5wb3BfbGFzdF90byggYXJnICk7CisvLwkJCQlhcmctPmNvdW50ID0gY291bnQ7CisvLwkJCX0KKy8vCQkJZWxzZSBpZiggQVJHX0NBQ0hFLm5vbmVtcHR5KCkgJiYKKy8vCQkJCQkoQVJHX0NBQ0hFLmZpcnN0KCktPmNhcGFjaXR5ID4gY291bnQpICkKKy8vCQkJeworLy8JCQkJQVJHX0NBQ0hFLnBvcF9maXJzdF90byggYXJnICk7CisvLwkJCQlhcmctPmNvdW50ID0gY291bnQ7CisvLwkJCX0KKy8vCQkJZWxzZQorLy8JCQl7CisvLwkJCQlhcmcgPSBuZXcgQVJHU19UQUJMRShjb3VudCwgY291bnQpOworLy8JCQl9CisvLwkJfQorLy8JCWVsc2UKKwkJCWlmKCBBUkdfQ0FDSEUubm9uZW1wdHkoKSAmJiAoQVJHX0NBQ0hFLmxhc3QoKS0+Y2FwYWNpdHkgPiBjb3VudCkgKQorCQl7CisJCQlBUkdfQ0FDSEUucG9wX2xhc3RfdG8oIGFyZyApOworCQkJYXJnLT5jb3VudCA9IGNvdW50OworCQkJYXJnLT5pZHggPSAwOworCitBVk1fSUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFNNVF9TT0xWSU5HICkKKwkJCUFWTV9PU19UUkFDRSA8PCAiIEAiIDw8IGF2bV9hZGRyZXNzX3QoIGFyZyApCisJCQkJCTw8ICIgd2l0aCBjYXBhY2l0eSA9ICIgPDwgYXJnLT5jYXBhY2l0eSA8PCBzdGQ6OmVuZGw7CitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRyggSElHSCAsIFNNVF9TT0xWSU5HICkKKwkJfQorCQllbHNlCisJCXsKK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgU01UX1NPTFZJTkcgKQorCQkJQVZNX09TX1RSQUNFIDw8ICIgPT0+ICIgPDwgc3RkOjpmbHVzaDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgU01UX1NPTFZJTkcgKQorCisJCQlhcmcgPSBuZXcgQVJHU19EQVRBKGNvdW50ICsgU01UX0FSR1NfREFUQV9JTkNSX0NBUEFDSVRZLCBjb3VudCk7CisJCX0KKworCQlyZXR1cm4oIGFyZyApOworCX0KKworCisJaW5saW5lIHN0YXRpYyB2b2lkIGZyZWVBUkdTKCBBUkdTX0RBVEEgKiAmIGFyZyApCisJeworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBTTVRfU09MVklORyApCisJCUFWTV9PU19UUkFDRSA8PCAiZnJlZUFSR1M6PiBjb3VudCA9ICIgPDwgc3RkOjpzZXR3KDQpIDw8IGFyZy0+Y291bnQKKwkJCQk8PCAiIEAiIDw8IGF2bV9hZGRyZXNzX3QoIGFyZyApCisJCQkJPDwgIiB3aXRoIGNhcGFjaXR5ID0gIiA8PCBhcmctPmNhcGFjaXR5IDw8IHN0ZDo6ZW5kbDsKK0FWTV9FTkRJRl9ERUJVR19MRVZFTF9GTEFHKCBISUdIICwgU01UX1NPTFZJTkcgKQorCisJCUFSR19DQUNIRS5hcHBlbmQoIGFyZyApOworCX0KKworCitwdWJsaWM6CisKKwkvKioKKwkqIENhY2hlIGxpZmVjeWNsZQorCSovCisJaW5saW5lIHN0YXRpYyB2b2lkIGluaXRDYWNoZSgpCisJeworCQlmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwIDsgaSA8IFNNVF9BUkdTX0RBVEFfSU5JVElBTF9DT1VOVCA7ICsraSApCisJCXsKKwkJCUFSR19DQUNIRS5hcHBlbmQobmV3IEFSR1NfREFUQSggU01UX0FSR1NfREFUQV9ERUZBVUxUX0NBUEFDSVRZLCAwKSApOworCQl9CisJCUFSR19DQUNIRS5hcHBlbmQobmV3IEFSR1NfREFUQSggU01UX0FSR1NfREFUQV9ST09UX0NBUEFDSVRZLCAwKSApOworCX0KKworCWlubGluZSBzdGF0aWMgdm9pZCBmaW5hbGl6ZUNhY2hlKCApCisJeworCQlzdGQ6OnNpemVfdCBhcmdzX2NvdW50ID0gMDsKKworCQl3aGlsZSggQVJHX0NBQ0hFLm5vbmVtcHR5KCkgKQorCQl7CisJCQkrK2FyZ3NfY291bnQ7CisJCQlkZWxldGUoIEFSR19DQUNIRS5wb3BfbGFzdCgpICk7CisJCX0KKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBTTVRfU09MVklORyApCisJCUFWTV9PU19UUkFDRSA8PCAiU29sdmVyOjpmaW5hbGl6ZSNjYWNoZTo+IGNvdW50ID0gIiA8PCBhcmdzX2NvdW50CisJCQkJPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIEhJR0ggLCBTTVRfU09MVklORyApCisJfQorCisKKwlzdHJ1Y3QgQVJHUworCXsKKwkJLyoqCisJCSAqIEFUVFJJQlVURVMKKwkJICovCisJCUFSR1NfREFUQSAqIG1EYXRhOworCisJCS8qKgorCQkgKiBDT05TVFJVQ1RPUgorCQkgKiBEZWZhdWx0CisJCSAqLworCQlBUkdTKCBzdGQ6OnNpemVfdCBjb3VudCApCisJCTogbURhdGEoIG5ld0FSR1MoY291bnQpICkKKwkJeworCQkJbURhdGEtPmludGlhbGl6ZSggKTsKKwkJfQorCisJCXZpcnR1YWwgfkFSR1MoKQorCQl7CisJCQltRGF0YS0+ZmluYWxpemUoICk7CisKKwkJCWZyZWVBUkdTKCBtRGF0YSApOworCQl9CisKKworCQkvKioKKwkJKiBPUEVSQVRPUlMKKwkJKi8KKwkJaW5saW5lIEFSR1NfREFUQSAqIG9wZXJhdG9yLT4gKCkgY29uc3QKKwkJeworQVZNX0lGX0RFQlVHX0ZMQUcoIFNNVF9TT0xWSU5HICkKKwlBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBtRGF0YSApIDw8ICJBUkdTX0RBVEEgUG9pbnRlciAhISEiCisJCQk8PCBTRU5EX0VYSVQ7CitBVk1fRU5ESUZfREVCVUdfRkxBRyggU01UX1NPTFZJTkcgKQorCisJCQlyZXR1cm4oIG1EYXRhICk7CisJCX0KKworCQlpbmxpbmUgRXhwcl9UICYgb3BlcmF0b3JbXShzdGQ6OnNpemVfdCBvZmZzZXQpIGNvbnN0CisJCXsKKwkJCXJldHVybiggbURhdGEtPnRhYmxlWyBvZmZzZXQgXSApOworCQl9CisKKwkJLy8gVGFibGUgSXRlcmF0b3IKKwkJaW5saW5lIGJvb2wgaGFzTmV4dCgpIGNvbnN0CisJCXsKKwkJCXJldHVybiggbURhdGEtPmlkeCA8IG1EYXRhLT5jb3VudCApOworCQl9CisKKwkJaW5saW5lIHN0ZDo6c2l6ZV90IG9mZnNldCgpIGNvbnN0CisJCXsKKwkJCXJldHVybiggbURhdGEtPmlkeCApOworCQl9CisKKwkJaW5saW5lIHZvaWQgaXRlcigpCisJCXsKKwkJCW1EYXRhLT5pZHggPSAwOworCQl9CisKKwkJaW5saW5lIEV4cHJfVCAmIGN1cnJlbnQoKQorCQl7CisJCQlyZXR1cm4oIG1EYXRhLT50YWJsZVsgbURhdGEtPmlkeCBdICk7CisJCX0KKworCQlpbmxpbmUgRXhwcl9UICYgbmV4dCgpCisJCXsKKwkJCXJldHVybiggbURhdGEtPnRhYmxlWyBtRGF0YS0+aWR4KysgXSApOworCQl9CisKKwkJaW5saW5lIHZvaWQgbmV4dChFeHByX1QgdmFsKQorCQl7CisJCQltRGF0YS0+dGFibGVbIG1EYXRhLT5pZHgrKyBdID0gdmFsOworCQl9CisKKy8vCQlpbmxpbmUgdm9pZCBuZXh0KGNvbnN0IGRhdGFfdCAmIHZhbCkKKy8vCQl7CisvLwkJCW1EYXRhLT50YWJsZVsgbURhdGEtPmlkeCsrIF0gPSB2YWw7CisvLwkJfQorCisJfTsKKworfTsKKworCisKK3RlbXBsYXRlPCBjbGFzcyBWYXJEZWNsX1QgLCBjbGFzcyBTb3J0X1QgLCBjbGFzcyBFeHByX1QgLCBib29sIGFycmF5X2Vsc2VfdmVjdG9yID4KK0xpc3Q8IHR5cGVuYW1lIFNtdFNvbHZlcjwgVmFyRGVjbF9UICwgU29ydF9UICwgRXhwcl9UICwKKwkJYXJyYXlfZWxzZV92ZWN0b3IgLCB0cnVlID46OkFSR1NfREFUQSAqID4KK1NtdFNvbHZlcjwgVmFyRGVjbF9UICwgU29ydF9UICwgRXhwcl9UICwgYXJyYXlfZWxzZV92ZWN0b3IgLCB0cnVlID46OkFSR19DQUNIRTsKKworCisKKwordGVtcGxhdGU8IGNsYXNzIFZhckRlY2xfVCAsIGNsYXNzIFNvcnRfVCAsIGNsYXNzIEV4cHJfVCAsIGJvb2wgYXJyYXlfZWxzZV92ZWN0b3IgPgorY2xhc3MgU210U29sdmVyPCBWYXJEZWNsX1QgLCBTb3J0X1QgLCBFeHByX1QgLCAgYXJyYXlfZWxzZV92ZWN0b3IgLCBmYWxzZSA+IDoKKwlwdWJsaWMgU210U29sdmVyVHJhaXRzPCBWYXJEZWNsX1QgLCBTb3J0X1QgLCBFeHByX1QgLCBhcnJheV9lbHNlX3ZlY3RvciA+Cit7CisKKworcHJvdGVjdGVkOgorCS8qKgorCSAqIFRZUEVERUYKKwkgKi8KKwl0eXBlZGVmIFNtdFNvbHZlcjwgVmFyRGVjbF9UICwgU29ydF9UICwgRXhwcl9UICwKKwkJCWFycmF5X2Vsc2VfdmVjdG9yICwgZmFsc2UgPiAgYmFzZV90aGlzX3R5cGU7CisKKworcHVibGljOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogRGVmYXVsdAorCSAqLworCVNtdFNvbHZlcigpCisJOiBTbXRTb2x2ZXJUcmFpdHM8IFZhckRlY2xfVCAsIFNvcnRfVCAsIEV4cHJfVCAsIGFycmF5X2Vsc2VfdmVjdG9yID4oICkKKwl7CisJCS8vISEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5TbXRTb2x2ZXIoKQorCXsKKwkJLy8hISEgTk9USElORworCX0KKworCisJLyoqCisJKiBDYWNoZSBsaWZlY3ljbGUKKwkqLworCWlubGluZSBzdGF0aWMgdm9pZCBpbml0Q2FjaGUoKQorCXsKKwkJLy8hISEgTk9USElORworCX0KKworCWlubGluZSBzdGF0aWMgdm9pZCBmaW5hbGl6ZUNhY2hlKCApCisJeworCQkvLyEhISBOT1RISU5HCisJfQorCit9OworCisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisjZW5kaWYgLyogU09MVkVSX0JBU0VTTVRTT0xWRVJfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3NvbHZlci9hcGkvU29sdmVyRGVmLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3NvbHZlci9hcGkvU29sdmVyRGVmLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDVhNWE5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc29sdmVyL2FwaS9Tb2x2ZXJEZWYuY3BwCkBAIC0wLDAgKzEsMjE3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjkgZsOpdnIuIDIwMTIKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlNvbHZlckRlZi5oIgorCisjaW5jbHVkZSA8dXRpbC9hdm1fc3RyaW5nLmg+CisKKyNpbmNsdWRlIDxwcmludGVyL091dFN0cmVhbS5oPgorCisjaW5jbHVkZSA8c29sdmVyL0NWQzRTb2x2ZXIuaD4KKyNpbmNsdWRlIDxzb2x2ZXIvWjNTb2x2ZXIuaD4KKworI2lmIGRlZmluZWQoIF9BVk1fU09MVkVSX1lJQ0VTX1YyXyApCisjaW5jbHVkZSA8Y29tcGF0L3NvbHZlci9ZaWNlczJTb2x2ZXIuaD4KKyNlbmRpZiAvKiBfQVZNX1NPTFZFUl9ZSUNFU19WMl8gKi8KKworLy8gTWFuZGF0b3J5IGFmdGVyIG90aGVyIFNvbHZlciBmb3IgY29tcGlsYXRpb24gRklYCisjaW5jbHVkZSA8c29sdmVyL09tZWdhU29sdmVyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorICogQVRUUklCVVRFUworICovCitib29sIFNvbHZlckRlZjo6REVGQVVMVF9TT0xWRVJfVVNBR0VfRkxBRyA9IGZhbHNlOworCitTb2x2ZXJEZWY6OlNPTFZFUl9LSU5EIFNvbHZlckRlZjo6REVGQVVMVF9TT0xWRVJfS0lORCA9CisJCVNvbHZlckRlZjo6U09MVkVSX0NWQzRfS0lORDsKKworCisvKioKKyAqIHRvU3RyaW5nCisgKi8KK3N0ZDo6c3RyaW5nIFNvbHZlckRlZjo6c3RyU2F0aXNmaWFiaWxpdHkoU29sdmVyRGVmOjpTQVRJU0ZJQUJJTElUWV9SSU5HIHJpbmcpCit7CisJc3dpdGNoIChyaW5nKQorCXsKKwkJY2FzZSBVTlNBVElTRklBQkxFIDogIHJldHVybiggInVuc2F0aXNmaWFibGUiICk7CisJCWNhc2UgU0FUSVNGSUFCTEUgICA6ICByZXR1cm4oICJzYXRpc2ZpYWJsZSIgICApOworCQljYXNlIEFCT1JUX1NBVCAgICAgOiAgcmV0dXJuKCAiYWJvcnRfc2F0IiAgICAgKTsKKwkJY2FzZSBVTktOT1dOX1NBVCAgIDogIHJldHVybiggInVua25vd25fc2F0IiAgICk7CisJCWRlZmF1bHQgICAgICAgICAgICA6ICByZXR1cm4oICJ1bmRlZmluZWRfc2F0IiApOworCX0KK30KKworc3RkOjpzdHJpbmcgU29sdmVyRGVmOjpzdHJWYWxpZGl0eShTb2x2ZXJEZWY6OlZBTElESVRZX1JJTkcgcmluZykKK3sKKwlzd2l0Y2ggKHJpbmcpCisJeworCQljYXNlIElOVkFMSUQgICAgICAgOiAgcmV0dXJuKCAiaW52YWxpZCIgICAgICAgICApOworCQljYXNlIFZBTElEICAgICAgICAgOiAgcmV0dXJuKCAidmFsaWQiICAgICAgICAgICApOworCQljYXNlIEFCT1JUX1ZBTElEICAgOiAgcmV0dXJuKCAiYWJvcnRfdmFsaWQiICAgICApOworCQljYXNlIFVOS05PV05fVkFMSUQgOiAgcmV0dXJuKCAidW5rbm93bl92YWxpZCIgICApOworCQlkZWZhdWx0ICAgICAgICAgICAgOiAgcmV0dXJuKCAidW5kZWZpbmVkX3ZhbGlkIiApOworCX0KK30KKworCitzdGQ6OnN0cmluZyBTb2x2ZXJEZWY6OnN0clNvbHZlcihTb2x2ZXJEZWY6OlNPTFZFUl9LSU5EIGtpbmcpCit7CisJc3dpdGNoIChraW5nKQorCXsKKyNpZiBkZWZpbmVkKCBfQVZNX1NPTFZFUl9PTUVHQV8gKQorCQljYXNlIFNPTFZFUl9PTUVHQV9LSU5EICAgICAgOiAgcmV0dXJuKCBPbWVnYVNvbHZlcjo6SUQgKTsKKyNlbmRpZiAvKiBfQVZNX1NPTFZFUl9PTUVHQV8gKi8KKworCisjaWYgZGVmaW5lZCggX0FWTV9TT0xWRVJfWUlDRVNfVjJfICkKKwkJY2FzZSBTT0xWRVJfWUlDRVNfS0lORCAgICAgIDogIHJldHVybiggWWljZXMyU29sdmVyOjpJRCApOworCQljYXNlIFNPTFZFUl9ZSUNFUzJfS0lORCAgICAgOiAgcmV0dXJuKCBZaWNlczJTb2x2ZXI6OklEICk7CisjZW5kaWYgLyogX0FWTV9TT0xWRVJfWUlDRVNfVjJfICovCisKKworI2lmIGRlZmluZWQoIF9BVk1fU09MVkVSX1ozXyApCisJCWNhc2UgU09MVkVSX1ozX0tJTkQgICAgICAgICA6ICByZXR1cm4oIFozU29sdmVyOjpJRCAgKTsKKyNlbmRpZiAvKiBfQVZNX1NPTFZFUl9aM18gKi8KKworCisjaWYgZGVmaW5lZCggX0FWTV9TT0xWRVJfQ1ZDNF8gKQorCQljYXNlIFNPTFZFUl9DVkNfS0lORCAgICAgICAgOiAgcmV0dXJuKCBDVkM0U29sdmVyOjpJRCApOworCQljYXNlIFNPTFZFUl9DVkM0X0tJTkQgICAgICAgOiAgcmV0dXJuKCBDVkM0U29sdmVyOjpJRCApOworCQljYXNlIFNPTFZFUl9DVkM0X0JWMzJfS0lORCAgOiAgcmV0dXJuKCBDVkM0U29sdmVyOjpJRCArICJfQlYzMiIgKTsKKyNlbmRpZiAvKiBfQVZNX1NPTFZFUl9DVkM0XyAqLworCisKKwkJY2FzZSBTT0xWRVJfVU5ERUZJTkVEX0tJTkQgIDogIHJldHVybiggIlVOREVGSU5FRF9TT0xWRVIiICk7CisKKwkJZGVmYXVsdCAgICAgICAgICAgICAgICAgICAgIDogIHJldHVybiggIlVOS05PV05fU09MVkVSIiAgICk7CisJfQorfQorCisvKioKKyAqIHRvU29sdmVyCisgKi8KK1NvbHZlckRlZjo6U09MVkVSX0tJTkQgU29sdmVyRGVmOjp0b1NvbHZlcigKKwkJc3RkOjpzdHJpbmcgc3RyS2luZywgU29sdmVyRGVmOjpTT0xWRVJfS0lORCBkZWZhdWx0S2luZCkKK3sKKwlTdHJpbmdUb29sczo6dG91cHBlcihzdHJLaW5nKTsKKworI2lmIGRlZmluZWQoIF9BVk1fU09MVkVSX09NRUdBXyApCisJaWYoIHN0cktpbmcgPT0gT21lZ2FTb2x2ZXI6OklEICApICByZXR1cm4oIFNPTFZFUl9PTUVHQV9LSU5EICAgICApOworI2VuZGlmIC8qIF9BVk1fU09MVkVSX09NRUdBXyAqLworCisKKyNpZiBkZWZpbmVkKCBfQVZNX1NPTFZFUl9DVkM0XyApCisJaWYoIHN0cktpbmcgPT0gIkNWQyIgICAgICAgICAgICApICByZXR1cm4oIFNPTFZFUl9DVkM0X0tJTkQgICAgICApOworCWlmKCBzdHJLaW5nID09ICJDVkNfSU5UIiAgICAgICAgKSAgcmV0dXJuKCBTT0xWRVJfQ1ZDNF9LSU5EICAgICAgKTsKKwlpZiggc3RyS2luZyA9PSAiQ1ZDX0JWMzIiICAgICAgICkgIHJldHVybiggU09MVkVSX0NWQzRfQlYzMl9LSU5EICk7CisJaWYoIHN0cktpbmcgPT0gQ1ZDNFNvbHZlcjo6SUQgICApICByZXR1cm4oIFNPTFZFUl9DVkM0X0tJTkQgICAgICApOworCWlmKCBzdHJLaW5nID09ICJDVkM0X0lOVCIgICAgICAgKSAgcmV0dXJuKCBTT0xWRVJfQ1ZDNF9LSU5EICAgICAgKTsKKwlpZiggc3RyS2luZyA9PSAiQ1ZDNF9CVjMyIiAgICAgICkgIHJldHVybiggU09MVkVSX0NWQzRfQlYzMl9LSU5EICk7CisjZW5kaWYgLyogX0FWTV9TT0xWRVJfQ1ZDNF8gKi8KKworCisjaWYgZGVmaW5lZCggX0FWTV9TT0xWRVJfWUlDRVNfVjJfICkKKwlpZiggc3RyS2luZyA9PSBZaWNlczJTb2x2ZXI6OklEICkgIHJldHVybiggU09MVkVSX1lJQ0VTMl9LSU5EICAgICk7CisjaWYgbm90IGRlZmluZWQoIF9BVk1fU09MVkVSX1lJQ0VTX1YxXyApCisJaWYoIHN0cktpbmcgPT0gIllJQ0VTIiAgICAgICAgICApICByZXR1cm4oIFNPTFZFUl9ZSUNFUzJfS0lORCAgICApOworI2VuZGlmIC8qIG5vdCBfQVZNX1NPTFZFUl9ZSUNFU19WMV8gKi8KKyNlbmRpZiAvKiBfQVZNX1NPTFZFUl9ZSUNFU19WMl8gKi8KKworCisjaWYgZGVmaW5lZCggX0FWTV9TT0xWRVJfWjNfICkKKwlpZiggc3RyS2luZyA9PSBaM1NvbHZlcjo6SUQgICAgICkgIHJldHVybiggU09MVkVSX1ozX0tJTkQgICAgICAgICk7CisjZW5kaWYgLyogX0FWTV9TT0xWRVJfWjNfICovCisKKwlyZXR1cm4oIGRlZmF1bHRLaW5kICk7Cit9CisKKworLyoqCisgKiBTT0xWRVIKKyAqIEF2YWlsYWJsZQorICogTGlzdAorICovCitib29sIFNvbHZlckRlZjo6aXNBdmFpbGFibGVTb2x2ZXIoU09MVkVSX0tJTkQga2luZykKK3sKKwlzd2l0Y2ggKGtpbmcpCisJeworI2lmIGRlZmluZWQoIF9BVk1fU09MVkVSX09NRUdBXyApCisJCWNhc2UgU09MVkVSX09NRUdBX0tJTkQgICAgICA6ICByZXR1cm4oIHRydWUgKTsKKyNlbmRpZiAvKiBfQVZNX1NPTFZFUl9PTUVHQV8gKi8KKworCisjaWYgZGVmaW5lZCggX0FWTV9TT0xWRVJfWUlDRVNfVjJfICkKKwkJY2FzZSBTT0xWRVJfWUlDRVNfS0lORCAgICAgIDogIHJldHVybiggdHJ1ZSApOworCQljYXNlIFNPTFZFUl9ZSUNFUzJfS0lORCAgICAgOiAgcmV0dXJuKCB0cnVlICk7CisjZW5kaWYgLyogX0FWTV9TT0xWRVJfWUlDRVNfVjJfICovCisKKworI2lmIGRlZmluZWQoIF9BVk1fU09MVkVSX1ozXyApCisJCWNhc2UgU09MVkVSX1ozX0tJTkQgICAgICAgICA6ICByZXR1cm4oIHRydWUgICk7CisjZW5kaWYgLyogX0FWTV9TT0xWRVJfWjNfICovCisKKworI2lmIGRlZmluZWQoIF9BVk1fU09MVkVSX0NWQzRfICkKKwkJY2FzZSBTT0xWRVJfQ1ZDX0tJTkQgICAgICAgIDogIHJldHVybiggdHJ1ZSApOworCQljYXNlIFNPTFZFUl9DVkM0X0tJTkQgICAgICAgOiAgcmV0dXJuKCB0cnVlICk7CisJCWNhc2UgU09MVkVSX0NWQzRfQlYzMl9LSU5EICA6ICByZXR1cm4oIHRydWUgKTsKKyNlbmRpZiAvKiBfQVZNX1NPTFZFUl9DVkM0XyAqLworCisKKwkJY2FzZSBTT0xWRVJfVU5ERUZJTkVEX0tJTkQgIDogIHJldHVybiggZmFsc2UgKTsKKworCQlkZWZhdWx0ICAgICAgICAgICAgICAgICAgICAgOiAgcmV0dXJuKCBmYWxzZSApOworCX0KK30KKworCit2b2lkIFNvbHZlckRlZjo6dG9TdHJlYW1Tb2x2ZXJMaXN0KE91dFN0cmVhbSAmIG9zLCBjb25zdCBzdGQ6OnN0cmluZyAmIGFIZWFkZXIpCit7CisjZGVmaW5lIFNPTFZFUl9GQUNUT1JZX1NIT1dfREVTQ1JJUFRJT04oIFNvbHZlckNsYXNzICkgIFwKKwlvcyA8PCBUQUIyIDw8IFNvbHZlckNsYXNzOjpERVNDUklQVElPTiA8PCBFT0w7CisKKwlvcyA8PCBUQUIxIDw8IGFIZWFkZXIgPDwgIjwgZW5hYmxlZCA+IHsiIDw8IEVPTDsKKworI2lmIGRlZmluZWQoIF9BVk1fU09MVkVSX09NRUdBXyApCisJU09MVkVSX0ZBQ1RPUllfU0hPV19ERVNDUklQVElPTiggT21lZ2FTb2x2ZXIgKQorI2VuZGlmIC8qIF9BVk1fU09MVkVSX09NRUdBXyAqLworCisjaWYgZGVmaW5lZCggX0FWTV9TT0xWRVJfQ1ZDNF8gKQorCVNPTFZFUl9GQUNUT1JZX1NIT1dfREVTQ1JJUFRJT04oIENWQzRTb2x2ZXIgKQorI2VuZGlmIC8qIF9BVk1fU09MVkVSX0NWQzRfICovCisKKworI2lmIGRlZmluZWQoIF9BVk1fU09MVkVSX1ozXyApCisJU09MVkVSX0ZBQ1RPUllfU0hPV19ERVNDUklQVElPTiggWjNTb2x2ZXIgKQorI2VuZGlmIC8qIF9BVk1fU09MVkVSX1ozXyAqLworCisKKyNpZiBkZWZpbmVkKCBfQVZNX1NPTFZFUl9ZSUNFU19WMl8gKQorCVNPTFZFUl9GQUNUT1JZX1NIT1dfREVTQ1JJUFRJT04oIFlpY2VzMlNvbHZlciApCisjZW5kaWYgLyogX0FWTV9TT0xWRVJfWUlDRVNfVjJfICovCisKKwlvcyA8PCBUQUIxIDw8ICJ9IiA8PCBFT0xfRkxVU0g7CisKK30KKworCisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9zb2x2ZXIvYXBpL1NvbHZlckRlZi5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc29sdmVyL2FwaS9Tb2x2ZXJEZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjhmYWZkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc29sdmVyL2FwaS9Tb2x2ZXJEZWYuaApAQCAtMCwwICsxLDIxNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDI5IGbDqXZyLiAyMDEyCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgU09MVkVSX1NPTFZFUkRFRl9IXworI2RlZmluZSBTT0xWRVJfU09MVkVSREVGX0hfCisKKworLyoqCisgKiBERUZJTkUgTUFDUk8gVy5SLlQuIExJQ0VOU0UgQ09OU1RSQUlOVAorICovCisjaWYgZGVmaW5lZCggX0VDTElQU0VfUFVCTElDX0xJQ0VOU0VfICkKKworCisvLy8vIERlZmF1bHQKKy8vI2RlZmluZSBfQVZNX1NPTFZFUl9DVkM0XworLy8KKy8vLy8gSW5jdWJhdGlvbgorLy8jZGVmaW5lIF9BVk1fU09MVkVSX1ozXworCisvLyBFeHBlcmltZW50YWwKKyNpZiBkZWZpbmVkKCBfQVZNX1NPTFZFUl9ZSUNFU19WMl8gKQorCSN1bmRlZiBfQVZNX1NPTFZFUl9ZSUNFU19WMl8KKyNlbmRpZiAvKiBfQVZNX1NPTFZFUl9ZSUNFU19WMl8gKi8KKworLy8gRGVwcmVjYXRlZAorI2lmIGRlZmluZWQoIF9BVk1fU09MVkVSX09NRUdBXyApCisJI3VuZGVmIF9BVk1fU09MVkVSX09NRUdBXworI2VuZGlmIC8qIF9BVk1fU09MVkVSX09NRUdBXyAqLworCisKKyNlbHNlCisKKworLy8vLyBEZWZhdWx0CisvLyNpZiBub3QgZGVmaW5lZCggX0FWTV9TT0xWRVJfQ1ZDNF8gKQorLy8jZGVmaW5lIF9BVk1fU09MVkVSX0NWQzRfCisvLyNlbmRpZiAvKiBfQVZNX1NPTFZFUl9DVkM0XyAqLworLy8KKy8vLy8gSW5jdWJhdGlvbgorLy8jaWYgbm90IGRlZmluZWQoIF9BVk1fU09MVkVSX1ozXyApCisvLyNkZWZpbmUgX0FWTV9TT0xWRVJfWjNfCisvLyNlbmRpZiAvKiBfQVZNX1NPTFZFUl9aM18gKi8KKy8vCisvLy8vIEV4cGVyaW1lbnRhbAorLy8jaWYgbm90IGRlZmluZWQoIF9BVk1fU09MVkVSX1lJQ0VTX1YyXyApCisvLyNkZWZpbmUgX0FWTV9TT0xWRVJfWUlDRVNfVjJfCisvLyNlbmRpZiAvKiBfQVZNX1NPTFZFUl9ZSUNFU19WMl8gKi8KKy8vCisvLworLy8vLyBEZXByZWNhdGVkCisvLyNpZiBub3QgZGVmaW5lZCggX0FWTV9TT0xWRVJfT01FR0FfICkKKy8vI2RlZmluZSBfQVZNX1NPTFZFUl9PTUVHQV8KKy8vI2VuZGlmIC8qIF9BVk1fU09MVkVSX09NRUdBXyAqLworCisKKyNlbmRpZiAvKiBfRUNMSVBTRV9QVUJMSUNfTElDRU5TRV8gKi8KKworCisjaW5jbHVkZSA8c3RyaW5nPgorCisvLyNpZiBkZWZpbmVkKCBfQVZNX1NPTFZFUl9PTUVHQV8gKQorLy8KKy8vI2VuZGlmIC8qIF9BVk1fU09MVkVSX09NRUdBXyAqLworCisKKy8vI2lmIGRlZmluZWQoIF9BVk1fU09MVkVSX0NWQzRfICkKKy8vCisvLyNlbGlmIGRlZmluZWQoIF9BVk1fU09MVkVSX0NWQzNfICkKKy8vCisvLyNlbmRpZiAvKiBfQVZNX1NPTFZFUl9DVkNfICovCisvLworLy8KKy8vI2lmIGRlZmluZWQoIF9BVk1fU09MVkVSX1lJQ0VTX1YyXyApCisvLworLy8jZWxpZiBkZWZpbmVkKCBfQVZNX1NPTFZFUl9ZSUNFU19WMV8gKQorLy8KKy8vI2VuZGlmIC8qIF9BVk1fU09MVkVSX1lJQ0VTXyAqLworLy8KKy8vCisvLyNpZiBkZWZpbmVkKCBfQVZNX1NPTFZFUl9aM18gKQorLy8KKy8vI2VuZGlmIC8qIF9BVk1fU09MVkVSX1ozXyAqLworCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjbGFzcyBPdXRTdHJlYW07CisKKworY2xhc3MgU29sdmVyRGVmCit7CisKK3B1YmxpYzoKKwkvKioKKwkgKiBUWVBFIERFQ0xBUkFUSU9OUworCSAqLworCisJZW51bSBTQVRJU0ZJQUJJTElUWV9SSU5HIHsKKwkJVU5TQVRJU0ZJQUJMRSA9IDAsCisJCVNBVElTRklBQkxFID0gMSwKKworCQlBQk9SVF9TQVQsCisJCVVOS05PV05fU0FUCisJfTsKKworCisJZW51bSBWQUxJRElUWV9SSU5HIHsKKwkJSU5WQUxJRCA9IDAsCisJCVZBTElEID0gMSwKKworCQlBQk9SVF9WQUxJRCwKKwkJVU5LTk9XTl9WQUxJRAorCX07CisKKworCS8qKgorCSAqIFRZUEUgREVDTEFSQVRJT05TCisJICovCisJZW51bSBTT0xWRVJfS0lORAorCXsKKwkJU09MVkVSX1VOREVGSU5FRF9LSU5EICAgPSAweDAwMDAsCisKKwkJU09MVkVSX09NRUdBX0tJTkQgICAgICAgPSAweDAwMDAxLAorCisJCVNPTFZFUl9ZSUNFUzFfS0lORCAgICAgID0gMHgwMDAxMCwKKwkJU09MVkVSX1lJQ0VTMl9LSU5EICAgICAgPSAweDAwMDIwLAorCisJCVNPTFZFUl9ZSUNFU19LSU5EICAgICAgID0gU09MVkVSX1lJQ0VTMV9LSU5ECisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU09MVkVSX1lJQ0VTMl9LSU5ELAorCisJCVNPTFZFUl9aM19LSU5EICAgICAgICAgID0gMHgwMDEwMCwKKworCQlTT0xWRVJfQ1ZDM19LSU5EICAgICAgICA9IDB4MDEwMDAsCisJCVNPTFZFUl9DVkMzX0JWMzJfS0lORCAgID0gMHgwMjAwMCwKKworCQlTT0xWRVJfQ1ZDNF9LSU5EICAgICAgICA9IDB4MDQwMDAsCisJCVNPTFZFUl9DVkM0X0JWMzJfS0lORCAgID0gMHgwODAwMCwKKworCQlTT0xWRVJfQ1ZDX0tJTkQgICAgICAgICA9IFNPTFZFUl9DVkMzX0tJTkQKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTT0xWRVJfQ1ZDNF9LSU5ELAorCisJCVNPTFZFUl9DVkNfQlZfS0lORCAgICAgID0gU09MVkVSX0NWQzNfQlYzMl9LSU5ECisJCQkJCQkJCXwgU09MVkVSX0NWQzRfQlYzMl9LSU5ECisJfTsKKworCitwdWJsaWM6CisJLyoqCisJKiBDT05TVFJVQ1RPUgorCSogRGVmYXVsdAorCSovCisJU29sdmVyRGVmKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCisJLyoqCisJKiBERVNUUlVDVE9SCisJKi8KKwl2aXJ0dWFsIH5Tb2x2ZXJEZWYoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLyoqCisJICogQVRUUklCVVRFUworCSAqLworCXN0YXRpYyBib29sIERFRkFVTFRfU09MVkVSX1VTQUdFX0ZMQUc7CisKKwlzdGF0aWMgU29sdmVyRGVmOjpTT0xWRVJfS0lORCBERUZBVUxUX1NPTFZFUl9LSU5EOworCisKKwkvKioKKwkgKiB0b1N0cmluZworCSAqLworCXN0YXRpYyBzdGQ6OnN0cmluZyBzdHJTYXRpc2ZpYWJpbGl0eShTQVRJU0ZJQUJJTElUWV9SSU5HIHJpbmcpOworCisJc3RhdGljIHN0ZDo6c3RyaW5nIHN0clZhbGlkaXR5KFZBTElESVRZX1JJTkcgcmluZyk7CisKKwlzdGF0aWMgc3RkOjpzdHJpbmcgc3RyU29sdmVyKFNPTFZFUl9LSU5EIGtpbmcpOworCisJLyoqCisJICogdG9Tb2x2ZXIKKwkgKi8KKwlzdGF0aWMgU09MVkVSX0tJTkQgdG9Tb2x2ZXIoc3RkOjpzdHJpbmcgc3RyS2luZywKKwkJCVNPTFZFUl9LSU5EIGRlZmF1bHRLaW5kIC8qPSBTT0xWRVJfVU5ERUZJTkVEX0tJTkQqLyk7CisKKwkvKioKKwkgKiBTT0xWRVIKKwkgKiBBdmFpbGFibGUKKwkgKiBMaXN0CisJICovCisJc3RhdGljIGJvb2wgaXNBdmFpbGFibGVTb2x2ZXIoU09MVkVSX0tJTkQga2luZyk7CisKKwlzdGF0aWMgdm9pZCB0b1N0cmVhbVNvbHZlckxpc3QoT3V0U3RyZWFtICYgb3MsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFIZWFkZXIgPSAic29sdmVycyIpOworCisKK307CisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworI2VuZGlmIC8qIFNPTFZFUl9TT0xWRVJERUZfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3NvbHZlci9hcGkvU29sdmVyRmFjdG9yeS5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9zb2x2ZXIvYXBpL1NvbHZlckZhY3RvcnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNjhlNmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9zb2x2ZXIvYXBpL1NvbHZlckZhY3RvcnkuY3BwCkBAIC0wLDAgKzEsOTk0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogOSBqdWlsLiAyMDA5CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJTb2x2ZXJGYWN0b3J5LmgiCisKKyNpbmNsdWRlIDxjb21tb24vQkYuaD4KKworI2luY2x1ZGUgPGNvbXB1dGVyL0V2YWx1YXRpb25FbnZpcm9ubWVudC5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvRXhlY3V0YWJsZUxpYi5oPgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkZhY3RvcnkuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29uc3RhbnQuaD4KKyNpbmNsdWRlIDxmbWwvZXhwcmVzc2lvbi9FeHByZXNzaW9uQ29uc3RydWN0b3IuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkNvbnRleHQuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25EYXRhLmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvUnVudGltZUxpYi5oPgorCisjaW5jbHVkZSA8Zm1sL3R5cGUvRW51bVR5cGVTcGVjaWZpZXIuaD4KKyNpbmNsdWRlIDxmbWwvdHlwZS9JbnRlcnZhbFR5cGVTcGVjaWZpZXIuaD4KKworCisjaW5jbHVkZSA8c29sdmVyL2FwaS9TYXRTb2x2ZXIuaD4KKyNpbmNsdWRlIDxzb2x2ZXIvYXBpL1NvbHZlckRlZi5oPgorCisjaW5jbHVkZSA8c29sdmVyL0NWQzRTb2x2ZXIuaD4KKyNpbmNsdWRlIDxzb2x2ZXIvWjNTb2x2ZXIuaD4KKworI2lmIGRlZmluZWQoIF9BVk1fU09MVkVSX1lJQ0VTX1YyXyApCisjaW5jbHVkZSA8Y29tcGF0L3NvbHZlci9ZaWNlczJTb2x2ZXIuaD4KKyNlbmRpZiAvKiBfQVZNX1NPTFZFUl9ZSUNFU19WMl8gKi8KKworLy8gTWFuZGF0b3J5IGFmdGVyIG90aGVyIFNvbHZlciBmb3IgY29tcGlsYXRpb24gRklYCisjaW5jbHVkZSA8c29sdmVyL09tZWdhU29sdmVyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKK1NhdFNvbHZlciAqIFNvbHZlckZhY3Rvcnk6OnRoZURlZmF1bHRTb2x2ZXI0Q2hlY2tTYXRpc2ZpYWJpbGl0eSA9IE5VTEw7CitTYXRTb2x2ZXIgKiBTb2x2ZXJGYWN0b3J5Ojp0aGVEZWZhdWx0U29sdmVyNE1vZGVsc1Byb2R1Y3Rpb24gPSBOVUxMOworCitCRlZlY3RvciBTb2x2ZXJGYWN0b3J5Ojp0aGVQQ1BhcmFtZXRlcnM7CitCRlZlY3RvciBTb2x2ZXJGYWN0b3J5Ojp0aGVQQ1BhcmFtZXRlclZhbHVlczsKKworQVBFeGVjdXRpb25EYXRhICAgICBTb2x2ZXJGYWN0b3J5Ojp0aGVTeW1ib2xpY0VEOworCisKKy8qKgorICogTE9BREVSCisgKi8KK3ZvaWQgU29sdmVyRmFjdG9yeTo6bG9hZCgpCit7CisJc3dpdGNoKCBTb2x2ZXJEZWY6OkRFRkFVTFRfU09MVkVSX0tJTkQgKQorCXsKKyNpZiBkZWZpbmVkKCBfQVZNX1NPTFZFUl9DVkM0XyApCisJCWNhc2UgU29sdmVyRGVmOjpTT0xWRVJfQ1ZDNF9LSU5EOgorCQl7CisJCQl0aGVEZWZhdWx0U29sdmVyNENoZWNrU2F0aXNmaWFiaWxpdHkgPSBuZXcgQ1ZDNFNvbHZlcigpOworCisJCQl0aGVEZWZhdWx0U29sdmVyNE1vZGVsc1Byb2R1Y3Rpb24gPQorCQkJCQluZXcgQ1ZDNFNvbHZlcih0cnVlIC8qdG8gc2V0IG9wdGlvbiA8PCBwcm9kdWNlLW1vZGVscyA+PiovKTsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYgLyogX0FWTV9TT0xWRVJfQ1ZDNF8gKi8KKworCisjaWYgZGVmaW5lZCggX0FWTV9TT0xWRVJfWjNfICkKKwkJY2FzZSBTb2x2ZXJEZWY6OlNPTFZFUl9aM19LSU5EOgorCQl7CisJCQl0aGVEZWZhdWx0U29sdmVyNENoZWNrU2F0aXNmaWFiaWxpdHkgPSBuZXcgWjNTb2x2ZXIoKTsKKwkJCXRoZURlZmF1bHRTb2x2ZXI0TW9kZWxzUHJvZHVjdGlvbiAgICA9IG5ldyBaM1NvbHZlcigpOworCQkJYnJlYWs7CisJCX0KKyNlbmRpZiAvKiBfQVZNX1NPTFZFUl9aM18gKi8KKworCisjaWYgZGVmaW5lZCggX0FWTV9TT0xWRVJfWUlDRVNfVjJfICkKKwkJY2FzZSBTb2x2ZXJEZWY6OlNPTFZFUl9ZSUNFUzJfS0lORDoKKwkJeworCQkJdGhlRGVmYXVsdFNvbHZlcjRDaGVja1NhdGlzZmlhYmlsaXR5ID0gbmV3IFlpY2VzMlNvbHZlcigpOworCQkJdGhlRGVmYXVsdFNvbHZlcjRNb2RlbHNQcm9kdWN0aW9uICAgID0gbmV3IFlpY2VzMlNvbHZlcigpOworCQkJYnJlYWs7CisJCX0KKyNlbmRpZiAvKiBfQVZNX1NPTFZFUl9ZSUNFU19WMl8gKi8KKworCisjaWYgZGVmaW5lZCggX0FWTV9TT0xWRVJfT01FR0FfICkKKwkJY2FzZSBTb2x2ZXJEZWY6OlNPTFZFUl9PTUVHQV9LSU5EOgorCQl7CisJCQl0aGVEZWZhdWx0U29sdmVyNENoZWNrU2F0aXNmaWFiaWxpdHkgPSBuZXcgT21lZ2FTb2x2ZXIoKTsKKwkJCXRoZURlZmF1bHRTb2x2ZXI0TW9kZWxzUHJvZHVjdGlvbiAgICA9IG5ldyBPbWVnYVNvbHZlcigpOworCQkJYnJlYWs7CisJCX0KKyNlbmRpZiAvKiBfQVZNX1NPTFZFUl9PTUVHQV8gKi8KKworCisJCWNhc2UgU29sdmVyRGVmOjpTT0xWRVJfVU5ERUZJTkVEX0tJTkQ6CisJCWRlZmF1bHQ6CisJCXsKKyNpZiBkZWZpbmVkKCBfQVZNX1NPTFZFUl9DVkM0XyApCisKKwkJCXRoZURlZmF1bHRTb2x2ZXI0Q2hlY2tTYXRpc2ZpYWJpbGl0eSA9IG5ldyBDVkM0U29sdmVyKCk7CisKKwkJCXRoZURlZmF1bHRTb2x2ZXI0TW9kZWxzUHJvZHVjdGlvbiA9CisJCQkJCW5ldyBDVkM0U29sdmVyKHRydWUgLyp0byBzZXQgb3B0aW9uIDw8IHByb2R1Y2UtbW9kZWxzID4+Ki8pOworCisjZWxzZQorCisJCQl0aGVEZWZhdWx0U29sdmVyNENoZWNrU2F0aXNmaWFiaWxpdHkgPSBOVUxMOworCQkJdGhlRGVmYXVsdFNvbHZlcjRNb2RlbHNQcm9kdWN0aW9uICAgID0gTlVMTDsKKworI2VuZGlmIC8qIF9BVk1fU09MVkVSX0NWQ3hfICovCisKKwkJCWJyZWFrOworCQl9CisJfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ0FDSEUgRk9SIE1FTU9SWSBBTExPQ0FUSU9OIE9QVElNSVpBVElPTiBGT1IgU09MVkVSIENBTENVTFVTCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjaWYgZGVmaW5lZCggX0FWTV9TT0xWRVJfQ1ZDNF8gKQorCisJQ1ZDNFNvbHZlcjo6aW5pdENhY2hlKCk7CisKKyNlbmRpZiAvKiBfQVZNX1NPTFZFUl9DVkM0XyAqLworCisKKyNpZiBkZWZpbmVkKCBfQVZNX1NPTFZFUl9aM18gKQorCisJWjNTb2x2ZXI6OmluaXRDYWNoZSgpOworCisjZW5kaWYgLyogX0FWTV9TT0xWRVJfWjNfICovCisKKworI2lmIGRlZmluZWQoIF9BVk1fU09MVkVSX1lJQ0VTX1YyXyApCisKKwlZaWNlczJTb2x2ZXI6OmluaXRDYWNoZSgpOworCisjZW5kaWYgLyogX0FWTV9TT0xWRVJfWUlDRVNfVjJfICovCit9CisKKworLyoqCisgKiBESVNQT1NFUgorICovCit2b2lkIFNvbHZlckZhY3Rvcnk6OmRpc3Bvc2UoKQoreworCWRlbGV0ZSggdGhlRGVmYXVsdFNvbHZlcjRDaGVja1NhdGlzZmlhYmlsaXR5ICk7CisJZGVsZXRlKCB0aGVEZWZhdWx0U29sdmVyNE1vZGVsc1Byb2R1Y3Rpb24gKTsKKworI2lmIGRlZmluZWQoIF9BVk1fU09MVkVSX0NWQzRfICkKKworCUNWQzRTb2x2ZXI6OmZpbmFsaXplQ2FjaGUoKTsKKworI2VuZGlmIC8qIF9BVk1fU09MVkVSX0NWQzRfICovCisKKworI2lmIGRlZmluZWQoIF9BVk1fU09MVkVSX1ozXyApCisKKwlaM1NvbHZlcjo6ZmluYWxpemVDYWNoZSgpOworCisjZW5kaWYgLyogX0FWTV9TT0xWRVJfWjNfICovCisKKworI2lmIGRlZmluZWQoIF9BVk1fU09MVkVSX1lJQ0VTX1YyXyApCisKKwlZaWNlczJTb2x2ZXI6OmZpbmFsaXplQ2FjaGUoKTsKKworI2VuZGlmIC8qIF9BVk1fU09MVkVSX1lJQ0VTX1YyXyAqLworfQorCisKK1NvbHZlckRlZjo6U0FUSVNGSUFCSUxJVFlfUklORyBTb2x2ZXJGYWN0b3J5Ojppc1NhdGlzZmlhYmxlKAorCQlTb2x2ZXJEZWY6OlNPTFZFUl9LSU5EIGFTb2x2ZXJLaW5kLCBjb25zdCBCRiAmIGFDb25kaXRpb24pCit7CisJaWYoIGFDb25kaXRpb24uaXNFcXVhbFRydWUoKSApCisJeworCQlyZXR1cm4oIFNvbHZlckRlZjo6U0FUSVNGSUFCTEUgKTsKKwl9CisJZWxzZSBpZiggYUNvbmRpdGlvbi5pc0VxdWFsRmFsc2UoKSApCisJeworCQlyZXR1cm4oIFNvbHZlckRlZjo6VU5TQVRJU0ZJQUJMRSApOworCX0KKworCXN3aXRjaCggYVNvbHZlcktpbmQgKQorCXsKKyNpZiBkZWZpbmVkKCBfQVZNX1NPTFZFUl9DVkM0XyApCisJCWNhc2UgU29sdmVyRGVmOjpTT0xWRVJfQ1ZDNF9LSU5EOgorCQljYXNlIFNvbHZlckRlZjo6U09MVkVSX0NWQzRfQlYzMl9LSU5EOgorCQljYXNlIFNvbHZlckRlZjo6U09MVkVSX0NWQ19LSU5EOgorCQl7CisJCQlDVkM0U29sdmVyIHNvbHZlcjsKKworCQkJcmV0dXJuKCBzb2x2ZXIuaXNTYXRpc2ZpYWJsZSggYUNvbmRpdGlvbiApICk7CisJCX0KKyNlbmRpZiAvKiBfQVZNX1NPTFZFUl9DVkM0XyAqLworCisKKyNpZiBkZWZpbmVkKCBfQVZNX1NPTFZFUl9aM18gKQorCQljYXNlIFNvbHZlckRlZjo6U09MVkVSX1ozX0tJTkQ6CisJCXsKKwkJCVozU29sdmVyIHNvbHZlcjsKKworCQkJcmV0dXJuKCBzb2x2ZXIuaXNTYXRpc2ZpYWJsZSggYUNvbmRpdGlvbiApICk7CisJCX0KKyNlbmRpZiAvKiBfQVZNX1NPTFZFUl9aM18gKi8KKworCisjaWYgZGVmaW5lZCggX0FWTV9TT0xWRVJfWUlDRVNfVjJfICkKKwkJY2FzZSBTb2x2ZXJEZWY6OlNPTFZFUl9ZSUNFUzJfS0lORDoKKwkJY2FzZSBTb2x2ZXJEZWY6OlNPTFZFUl9ZSUNFU19LSU5EOgorCQl7CisJCQlZaWNlczJTb2x2ZXIgc29sdmVyOworCisJCQlyZXR1cm4oIHNvbHZlci5pc1NhdGlzZmlhYmxlKCBhQ29uZGl0aW9uICkgKTsKKwkJfQorI2VuZGlmIC8qIF9BVk1fU09MVkVSX1lJQ0VTX1YyXyAqLworCisKKyNpZiBkZWZpbmVkKCBfQVZNX1NPTFZFUl9PTUVHQV8gKQorCQljYXNlIFNvbHZlckRlZjo6U09MVkVSX09NRUdBX0tJTkQ6CisJCXsKKwkJCU9tZWdhU29sdmVyIHNvbHZlcjsKKworCQkJcmV0dXJuKCBzb2x2ZXIuaXNTYXRpc2ZpYWJsZSggYUNvbmRpdGlvbiApICk7CisJCX0KKyNlbmRpZiAvKiBfQVZNX1NPTFZFUl9PTUVHQV8gKi8KKworCQlkZWZhdWx0OgorCQl7CitBVk1fT1NfV0FSTklOR19BTEVSVAorCQk8PCAiU29sdmVyRmFjdG9yeTo6aXNTYXRpc2ZpYWJsZTo+IFVua25vd24gc29sdmVyIDw8ICIKKwkJPDwgU29sdmVyRGVmOjpzdHJTb2x2ZXIoIGFTb2x2ZXJLaW5kICkKKwkJPDwgIiA+PiBpbiB0aGlzIGV4ZWN1dGFibGUgISEhIgorCQk8PCBTRU5EX0FMRVJUOworCisJCQlyZXR1cm4oIFNvbHZlckRlZjo6VU5LTk9XTl9TQVQgKTsKKwkJfQorCX0KKworCXJldHVybiggU29sdmVyRGVmOjpVTktOT1dOX1NBVCApOworfQorCisKKy8qKgorICogREVTVFJPWQorICovCit2b2lkIFNvbHZlckZhY3Rvcnk6OmRlc3Ryb3koU2F0U29sdmVyICogYVNvbHZlcikKK3sKKwlpZiggKGFTb2x2ZXIgIT0gTlVMTCkKKwkJJiYgKGFTb2x2ZXIgIT0gU29sdmVyRmFjdG9yeTo6dGhlRGVmYXVsdFNvbHZlcjRDaGVja1NhdGlzZmlhYmlsaXR5KQorCQkmJiAoYVNvbHZlciAhPSBTb2x2ZXJGYWN0b3J5Ojp0aGVEZWZhdWx0U29sdmVyNE1vZGVsc1Byb2R1Y3Rpb24pICkKKwl7CisJCWRlbGV0ZSggYVNvbHZlciApOworCX0KK30KKworU29sdmVyRGVmOjpTQVRJU0ZJQUJJTElUWV9SSU5HIFNvbHZlckZhY3Rvcnk6OmlzU2F0aXNmaWFibGUoCisJCWNvbnN0IEJGICYgYUNvbmRpdGlvbiwgYm9vbCB1c2VEZWZhdWx0U29sdmVyKQoreworCWlmKCBhQ29uZGl0aW9uLmlzRXF1YWxUcnVlKCkgKQorCXsKKwkJcmV0dXJuKCBTb2x2ZXJEZWY6OlNBVElTRklBQkxFICk7CisJfQorCWVsc2UgaWYoIGFDb25kaXRpb24uaXNFcXVhbEZhbHNlKCkgKQorCXsKKwkJcmV0dXJuKCBTb2x2ZXJEZWY6OlVOU0FUSVNGSUFCTEUgKTsKKwl9CisJZWxzZSBpZiggdXNlRGVmYXVsdFNvbHZlciApCisJeworCQlyZXR1cm4oIFNvbHZlckZhY3Rvcnk6OmlzU2F0aXNmaWFibGUoCisJCQkJU29sdmVyRGVmOjpERUZBVUxUX1NPTFZFUl9LSU5ELCBhQ29uZGl0aW9uKSApOworCX0KKworCXJldHVybiggU29sdmVyRGVmOjpVTktOT1dOX1NBVCApOworfQorCisKKworLyoqCisgKiBVU0VEIEJZIEZBTSBMdGxQcm92ZXJGaWx0ZXIKKyAqLworYm9vbCBTb2x2ZXJGYWN0b3J5Ojppc0VtcHR5SW50ZXJzZWN0aW9uKExpc3RPZkluc3RhbmNlT2ZEYXRhIGFMaXN0T2ZWYXJQYXJhbSwKKwkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFNYWluRUMsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhQ29tcGFyRUMpCit7CisjaWYgZGVmaW5lZCggX0FWTV9TT0xWRVJfT01FR0FfICkKKworCU9tZWdhU29sdmVyIHRoZVNvbHZlcjsKKworCXRoZVNvbHZlci5zZXRTZWxlY3RlZFZhcmlhYmxlKGFNYWluRUMucmVmRXhlY3V0aW9uRGF0YSgpLCBhTGlzdE9mVmFyUGFyYW0pOworCisJcmV0dXJuKCB0aGVTb2x2ZXIuaXNFbXB0eUludGVyc2VjdGlvbiggYU1haW5FQyAsIGFDb21wYXJFQyApICk7CisKKyNlbHNlCisKKwlyZXR1cm4oIGZhbHNlICk7CisKKyNlbmRpZiAvKiBfQVZNX1NPTFZFUl9PTUVHQV8gKi8KK30KKworYm9vbCBTb2x2ZXJGYWN0b3J5Ojppc1N1YlNldCgKKwkJY29uc3QgRXhlY3V0aW9uQ29udGV4dCAmIGFNYWluRUMsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhQ29tcGFyRUMpCit7CisjaWYgZGVmaW5lZCggX0FWTV9TT0xWRVJfT01FR0FfICkKKworCU9tZWdhU29sdmVyIHRoZVNvbHZlcjsKKworCXRoZVNvbHZlci5zZXRTZWxlY3RlZFZhcmlhYmxlKCBhTWFpbkVDLnJlZkV4ZWN1dGlvbkRhdGEoKSApOworCisJcmV0dXJuKCB0aGVTb2x2ZXIuaXNTdWJTZXQoIGFNYWluRUMgLCBhQ29tcGFyRUMpICk7CisKKyNlbHNlCisKKwlyZXR1cm4oIGZhbHNlICk7CisKKyNlbmRpZiAvKiBfQVZNX1NPTFZFUl9PTUVHQV8gKi8KK30KKworCisvKioKKyAqIFNPTFZFUgorICovCisKK1NhdFNvbHZlciAqIFNvbHZlckZhY3Rvcnk6Om5ld1NvbHZlcjRDaGVja1NhdGlzZmlhYmlsaXR5KAorCQlTb2x2ZXJEZWY6OlNPTFZFUl9LSU5EIGFTb2x2ZXJLaW5kKQoreworCXN3aXRjaCggYVNvbHZlcktpbmQgKQorCXsKKyNpZiBkZWZpbmVkKCBfQVZNX1NPTFZFUl9DVkM0XyApCisJCWNhc2UgU29sdmVyRGVmOjpTT0xWRVJfQ1ZDNF9LSU5EOgorCQljYXNlIFNvbHZlckRlZjo6U09MVkVSX0NWQ19LSU5EOgorCQl7CisJCQlyZXR1cm4oIG5ldyBDVkM0U29sdmVyKCkgKTsKKwkJfQorI2VuZGlmIC8qIF9BVk1fU09MVkVSX0NWQzRfICovCisKKworI2lmIGRlZmluZWQoIF9BVk1fU09MVkVSX1ozXyApCisJCWNhc2UgU29sdmVyRGVmOjpTT0xWRVJfWjNfS0lORDoKKwkJeworCQkJcmV0dXJuKCBuZXcgWjNTb2x2ZXIoKSApOworCQl9CisjZW5kaWYgLyogX0FWTV9TT0xWRVJfWjNfICovCisKKworI2lmIGRlZmluZWQoIF9BVk1fU09MVkVSX1lJQ0VTX1YyXyApCisJCWNhc2UgU29sdmVyRGVmOjpTT0xWRVJfWUlDRVMyX0tJTkQ6CisJCWNhc2UgU29sdmVyRGVmOjpTT0xWRVJfWUlDRVNfS0lORDoKKwkJeworCQkJcmV0dXJuKCBuZXcgWWljZXMyU29sdmVyKCkgKTsKKwkJfQorI2VuZGlmIC8qIF9BVk1fU09MVkVSX1lJQ0VTX1YyXyAqLworCisKKyNpZiBkZWZpbmVkKCBfQVZNX1NPTFZFUl9PTUVHQV8gKQorCQljYXNlIFNvbHZlckRlZjo6U09MVkVSX09NRUdBX0tJTkQ6CisJCXsKKwkJCXJldHVybiggbmV3IE9tZWdhU29sdmVyKCkgKTsKKwkJfQorI2VuZGlmIC8qIF9BVk1fU09MVkVSX09NRUdBXyAqLworCisJCWRlZmF1bHQ6CisJCXsKK0FWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggdGhlRGVmYXVsdFNvbHZlcjRDaGVja1NhdGlzZmlhYmlsaXR5ID09IE5VTEwgKQorCQk8PCAiU29sdmVyRmFjdG9yeTo6bmV3U29sdmVyNENoZWNrU2F0aXNmaWFiaWxpdHk6PiBVbmtub3duIHNvbHZlciA8PCAiCisJCTw8IFNvbHZlckRlZjo6c3RyU29sdmVyKCBhU29sdmVyS2luZCApCisJCTw8ICIgPj4gaW4gdGhpcyBleGVjdXRhYmxlIGFuZCAgdGhlcmUgYXJlIG5vIGRlZmF1bHQgYWx0ZXJuYXRpdmUgc29sdmVyISEhIgorCQk8PCBTRU5EX0FMRVJUOworCisJCQlTb2x2ZXJEZWY6OnRvU3RyZWFtU29sdmVyTGlzdChBVk1fT1NfQ09VVCwgIkF2YWlsYWJsZSBzb2x2ZXIiKTsKKworCQkJcmV0dXJuKCB0aGVEZWZhdWx0U29sdmVyNENoZWNrU2F0aXNmaWFiaWxpdHkgKTsKKwkJfQorCX0KK30KKworCitTYXRTb2x2ZXIgKiBTb2x2ZXJGYWN0b3J5OjpuZXdTb2x2ZXI0TW9kZWxzUHJvZHVjdGlvbigKKwkJU29sdmVyRGVmOjpTT0xWRVJfS0lORCBhU29sdmVyS2luZCkKK3sKKwlzd2l0Y2goIGFTb2x2ZXJLaW5kICkKKwl7CisjaWYgZGVmaW5lZCggX0FWTV9TT0xWRVJfQ1ZDNF8gKQorCQljYXNlIFNvbHZlckRlZjo6U09MVkVSX0NWQzRfS0lORDoKKwkJY2FzZSBTb2x2ZXJEZWY6OlNPTFZFUl9DVkNfS0lORDoKKwkJeworCQkJcmV0dXJuKCBuZXcgQ1ZDNFNvbHZlcih0cnVlLypwcm9kdWNlLW1vZGVscyovKSApOworCQl9CisjZW5kaWYgLyogX0FWTV9TT0xWRVJfQ1ZDNF8gKi8KKworCisjaWYgZGVmaW5lZCggX0FWTV9TT0xWRVJfWjNfICkKKwkJY2FzZSBTb2x2ZXJEZWY6OlNPTFZFUl9aM19LSU5EOgorCQl7CisJCQlyZXR1cm4oIG5ldyBaM1NvbHZlcigpICk7CisJCX0KKyNlbmRpZiAvKiBfQVZNX1NPTFZFUl9aM18gKi8KKworCisjaWYgZGVmaW5lZCggX0FWTV9TT0xWRVJfWUlDRVNfVjJfICkKKwkJY2FzZSBTb2x2ZXJEZWY6OlNPTFZFUl9ZSUNFUzJfS0lORDoKKwkJY2FzZSBTb2x2ZXJEZWY6OlNPTFZFUl9ZSUNFU19LSU5EOgorCQl7CisJCQlyZXR1cm4oIG5ldyBZaWNlczJTb2x2ZXIoKSApOworCQl9CisjZW5kaWYgLyogX0FWTV9TT0xWRVJfWUlDRVNfVjJfICovCisKKworI2lmIGRlZmluZWQoIF9BVk1fU09MVkVSX09NRUdBXyApCisJCWNhc2UgU29sdmVyRGVmOjpTT0xWRVJfT01FR0FfS0lORDoKKwkJeworCQkJcmV0dXJuKCBuZXcgT21lZ2FTb2x2ZXIoKSApOworCQl9CisjZW5kaWYgLyogX0FWTV9TT0xWRVJfT01FR0FfICovCisKKwkJZGVmYXVsdDoKKwkJeworQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKCB0aGVEZWZhdWx0U29sdmVyNE1vZGVsc1Byb2R1Y3Rpb24gPT0gTlVMTCApCisJCTw8ICJTb2x2ZXJGYWN0b3J5OjpuZXdTb2x2ZXI0TW9kZWxzUHJvZHVjdGlvbjo+IFVua25vd24gc29sdmVyIDw8ICIKKwkJPDwgU29sdmVyRGVmOjpzdHJTb2x2ZXIoIGFTb2x2ZXJLaW5kICkKKwkJPDwgIiA+PiBpbiB0aGlzIGV4ZWN1dGFibGUgYW5kIGFuZCB0aGVyZSBhcmUgbm8gZGVmYXVsdCBhbHRlcm5hdGl2ZSBzb2x2ZXIgISIKKwkJPDwgU0VORF9BTEVSVDsKKworCQkJcmV0dXJuKCB0aGVEZWZhdWx0U29sdmVyNE1vZGVsc1Byb2R1Y3Rpb24gKTsKKwkJfQorCX0KK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ09ORElUSU9OIFBBUkFNRVRFUiBTT0xWSU5HCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIFNvbHZlckZhY3Rvcnk6OnNvbHZlKFNvbHZlckRlZjo6U09MVkVSX0tJTkQgYVNvbHZlcktpbmQsCisJCWNvbnN0IEJGICYgYUNvbmRpdGlvbiwgQkZWZWN0b3IgJiBkYXRhVmVjdG9yLCBCRlZlY3RvciAmIHZhbHVlc1ZlY3RvcikKK3sKKwlzd2l0Y2goIGFTb2x2ZXJLaW5kICkKKwl7CisjaWYgZGVmaW5lZCggX0FWTV9TT0xWRVJfQ1ZDNF8gKQorCQljYXNlIFNvbHZlckRlZjo6U09MVkVSX0NWQzRfS0lORDoKKwkJY2FzZSBTb2x2ZXJEZWY6OlNPTFZFUl9DVkNfS0lORDoKKwkJeworCQkJQ1ZDNFNvbHZlciBzb2x2ZXIodHJ1ZSAvKnRvIHNldCBvcHRpb24gPDwgcHJvZHVjZS1tb2RlbHMgPj4qLyk7CisKKwkJCXJldHVybiggc29sdmVyLnNvbHZlKCBhQ29uZGl0aW9uLCBkYXRhVmVjdG9yLCB2YWx1ZXNWZWN0b3IgKSApOworCQl9CisjZW5kaWYgLyogX0FWTV9TT0xWRVJfQ1ZDNF8gKi8KKworCisjaWYgZGVmaW5lZCggX0FWTV9TT0xWRVJfWjNfICkKKwkJY2FzZSBTb2x2ZXJEZWY6OlNPTFZFUl9aM19LSU5EOgorCQl7CisJCQlaM1NvbHZlciBzb2x2ZXI7CisJCQlyZXR1cm4oIHNvbHZlci5zb2x2ZSggYUNvbmRpdGlvbiwgZGF0YVZlY3RvciwgdmFsdWVzVmVjdG9yICkgKTsKKwkJfQorI2VuZGlmIC8qIF9BVk1fU09MVkVSX1ozXyAqLworCisKKyNpZiBkZWZpbmVkKCBfQVZNX1NPTFZFUl9ZSUNFU19WMl8gKQorCQljYXNlIFNvbHZlckRlZjo6U09MVkVSX1lJQ0VTMl9LSU5EOgorCQljYXNlIFNvbHZlckRlZjo6U09MVkVSX1lJQ0VTX0tJTkQ6CisJCXsKKwkJCVlpY2VzMlNvbHZlciBzb2x2ZXI7CisKKwkJCXJldHVybiggc29sdmVyLnNvbHZlKCBhQ29uZGl0aW9uLCBkYXRhVmVjdG9yLCB2YWx1ZXNWZWN0b3IgKSApOworCQl9CisjZW5kaWYgLyogX0FWTV9TT0xWRVJfWUlDRVNfVjJfICovCisKKworI2lmIGRlZmluZWQoIF9BVk1fU09MVkVSX09NRUdBXyApCisJCWNhc2UgU29sdmVyRGVmOjpTT0xWRVJfT01FR0FfS0lORDoKKwkJeworCQkJT21lZ2FTb2x2ZXIgc29sdmVyOworCisJCQlyZXR1cm4oIHNvbHZlci5zb2x2ZSggYUNvbmRpdGlvbiwgZGF0YVZlY3RvciwgdmFsdWVzVmVjdG9yICkgKTsKKwkJfQorI2VuZGlmIC8qIF9BVk1fU09MVkVSX09NRUdBXyAqLworCisJCWRlZmF1bHQ6CisJCXsKK0FWTV9PU19XQVJOSU5HX0FMRVJUCisJCTw8ICJTb2x2ZXJGYWN0b3J5Ojpzb2x2ZTo+IFVua25vd24gc29sdmVyIDw8ICIKKwkJPDwgU29sdmVyRGVmOjpzdHJTb2x2ZXIoIGFTb2x2ZXJLaW5kICkKKwkJPDwgIiA+PiBpbiB0aGlzIGV4ZWN1dGFibGUgISEhIgorCQk8PCBTRU5EX0FMRVJUOworCisJCQlyZXR1cm4oIGZhbHNlICk7CisJCX0KKwl9Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEVYRUNVVElPTiBDT05URVhUIFNPTFZJTkcKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0FQRXhlY3V0aW9uRGF0YSBTb2x2ZXJGYWN0b3J5Ojpzb2x2ZShTb2x2ZXJEZWY6OlNPTFZFUl9LSU5EIGFTb2x2ZXJLaW5kLAorCQlFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBFTlYsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDLAorCQljb25zdCBCRiAmIGFDb25kaXRpb24pCit7CisJc3dpdGNoKCBhU29sdmVyS2luZCApCisJeworI2lmIGRlZmluZWQoIF9BVk1fU09MVkVSX0NWQzRfICkKKwkJY2FzZSBTb2x2ZXJEZWY6OlNPTFZFUl9DVkM0X0tJTkQ6CisJCWNhc2UgU29sdmVyRGVmOjpTT0xWRVJfQ1ZDX0tJTkQ6CisJCXsKKwkJCUNWQzRTb2x2ZXIgYVNvbHZlcih0cnVlIC8qdG8gc2V0IG9wdGlvbiA8PCBwcm9kdWNlLW1vZGVscyA+PiovKTsKKworCQkJcmV0dXJuKCBTb2x2ZXJGYWN0b3J5Ojpzb2x2ZShhU29sdmVyLCBFTlYsIGFuRUMsIGFDb25kaXRpb24pICk7CisJCX0KKyNlbmRpZiAvKiBfQVZNX1NPTFZFUl9DVkM0XyAqLworCisKKyNpZiBkZWZpbmVkKCBfQVZNX1NPTFZFUl9aM18gKQorCQljYXNlIFNvbHZlckRlZjo6U09MVkVSX1ozX0tJTkQ6CisJCXsKKwkJCVozU29sdmVyIGFTb2x2ZXI7CisKKwkJCXJldHVybiggU29sdmVyRmFjdG9yeTo6c29sdmUoYVNvbHZlciwgRU5WLCBhbkVDLCBhQ29uZGl0aW9uKSApOworCQl9CisjZW5kaWYgLyogX0FWTV9TT0xWRVJfWjNfICovCisKKworI2lmIGRlZmluZWQoIF9BVk1fU09MVkVSX1lJQ0VTX1YyXyApCisJCWNhc2UgU29sdmVyRGVmOjpTT0xWRVJfWUlDRVMyX0tJTkQ6CisJCWNhc2UgU29sdmVyRGVmOjpTT0xWRVJfWUlDRVNfS0lORDoKKwkJeworCQkJWWljZXMyU29sdmVyIGFTb2x2ZXI7CisKKwkJCXJldHVybiggU29sdmVyRmFjdG9yeTo6c29sdmUoYVNvbHZlciwgRU5WLCBhbkVDLCBhQ29uZGl0aW9uKSApOworCQl9CisjZW5kaWYgLyogX0FWTV9TT0xWRVJfWUlDRVNfVjJfICovCisKKworI2lmIGRlZmluZWQoIF9BVk1fU09MVkVSX09NRUdBXyApCisJCWNhc2UgU29sdmVyRGVmOjpTT0xWRVJfT01FR0FfS0lORDoKKwkJeworCQkJT21lZ2FTb2x2ZXIgYVNvbHZlcjsKKworCQkJcmV0dXJuKCBTb2x2ZXJGYWN0b3J5Ojpzb2x2ZShhU29sdmVyLCBFTlYsIGFuRUMsIGFDb25kaXRpb24pICk7CisJCX0KKyNlbmRpZiAvKiBfQVZNX1NPTFZFUl9PTUVHQV8gKi8KKworCisJCWRlZmF1bHQ6CisJCXsKK0FWTV9PU19BU1NFUlRfRkFUQUxfRVJST1JfRVhJVCggdGhlRGVmYXVsdFNvbHZlcjRNb2RlbHNQcm9kdWN0aW9uID09IE5VTEwgKQorCQk8PCAiU29sdmVyRmFjdG9yeTo6c29sdmU6PiBVbmtub3duIHNvbHZlciA8PCAiCisJCTw8IFNvbHZlckRlZjo6c3RyU29sdmVyKCBhU29sdmVyS2luZCApCisJCTw8ICIgPj4gaW4gdGhpcyBleGVjdXRhYmxlIGFuZCBhbmQgdGhlcmUgYXJlIG5vIGRlZmF1bHQgYWx0ZXJuYXRpdmUgc29sdmVyICEiCisJCTw8IFNFTkRfQUxFUlQ7CisKKwkJCXJldHVybiggU29sdmVyRmFjdG9yeTo6c29sdmUoCisJCQkJKCp0aGVEZWZhdWx0U29sdmVyNE1vZGVsc1Byb2R1Y3Rpb24pLCBFTlYsIGFuRUMsIGFDb25kaXRpb24pICk7CisJCX0KKwl9Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRVhFQ1VUSU9OIERBVEEgU09MVklORworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBTb2x2ZXJGYWN0b3J5Ojpzb2x2ZShTYXRTb2x2ZXIgJiBhU29sdmVyLCBFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBFTlYsCisJCUFQRXhlY3V0aW9uRGF0YSAmIGFuRUQsIGNvbnN0IEJGICYgYUNvbmRpdGlvbikKK3sKKwl0aGVQQ1BhcmFtZXRlcnMuY2xlYXIoKTsKKwl0aGVQQ1BhcmFtZXRlclZhbHVlcy5jbGVhcigpOworCisJLy8gT24gbnVtw6lyaXNlIGxlIFBDCisKKwkvLyBPbiBjcsOpZSB1biBFRCBhdmVjIGRlcyB2YWxldXJzIG51bcOpcmlxdWVzCisJaWYoIGFTb2x2ZXIuc29sdmUoIGFDb25kaXRpb24sIHRoZVBDUGFyYW1ldGVycywgdGhlUENQYXJhbWV0ZXJWYWx1ZXMgKSApCisJeworCQlpZiggdGhlUENQYXJhbWV0ZXJWYWx1ZXMubm9uZW1wdHkoKSApCisJCXsKKwkJCXNldFJ1bnRpbWVQYXJhbWV0ZXJzU29sdmluZ1ZhbHVlcyhhbkVEKTsKKworCQkJRXhlY3V0YWJsZUZvcm0gKiBleGVjID0gTlVMTDsKKwkJCVRhYmxlT2ZJbnN0YW5jZU9mRGF0YTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGl0RGF0YTsKKwkJCVRhYmxlT2ZJbnN0YW5jZU9mRGF0YTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGVuZERhdGE7CisKKwkJCVRhYmxlT2ZSdW50aW1lVDo6CisJCQljb25zdF9pdGVyYXRvciBpdFJGID0gYW5FRC0+Z2V0VGFibGVPZlJ1bnRpbWUoKS5iZWdpbigpOworCQkJVGFibGVPZlJ1bnRpbWVUOjoKKwkJCWNvbnN0X2l0ZXJhdG9yIGVuZFJGID0gYW5FRC0+Z2V0VGFibGVPZlJ1bnRpbWUoKS5lbmQoKTsKKwkJCWZvciggUnVudGltZUlEIGl0UklEIDsgaXRSRiAhPSBlbmRSRiA7ICsraXRSRikKKwkJCXsKKwkJCQlpdFJJRCA9ICgqaXRSRiktPmdldFJJRCgpOworCisJCQkJZXhlYyA9IGl0UklELmdldEV4ZWN1dGFibGUoKTsKKwkJCQlpZiggZXhlYy0+aGFzQmFzaWNEYXRhKCkgKQorCQkJCXsKKwkJCQkJaXREYXRhID0gZXhlYy0+Z2V0QmFzaWNEYXRhKCkuYmVnaW4oKTsKKwkJCQkJZW5kRGF0YSA9IGV4ZWMtPmdldEJhc2ljRGF0YSgpLmVuZCgpOworCQkJCQlmb3IoIDsgaXREYXRhICE9IGVuZERhdGEgOyArK2l0RGF0YSkKKwkJCQkJeworCQkJCQkJY29uc3QgQkYgJiBydmFsdWUgPSBFTlYuZ2V0UnZhbHVlKGFuRUQsIGl0UklELCAoaXREYXRhKSk7CisKKwkJCQkJCXVwZGF0ZVJ1bnRpbWVQYXJhbWV0ZXJzVmFsdWVzKHJ2YWx1ZSk7CisKKwkJCQkJCWlmKCBFTlYuZXZhbCh0aGVTeW1ib2xpY0VELAorCQkJCQkJCQl0aGVTeW1ib2xpY0VELT5nZXRQYXJhbWV0ZXJzUklEKCksIHJ2YWx1ZSkgKQorCQkJCQkJeworCQkJCQkJCUVOVi5zZXRSdmFsdWUoYW5FRCwgaXRSSUQsIChpdERhdGEpLCBFTlYub3V0VkFMKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlmaW5hbGl6ZVJ1bnRpbWVQYXJhbWV0ZXJzKCk7CisJCQkJCQkJcmV0dXJuKCBmYWxzZSApOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlmaW5hbGl6ZVJ1bnRpbWVQYXJhbWV0ZXJzKCk7CisJCX0KKwkJdGhlUENQYXJhbWV0ZXJzLmNsZWFyKCk7CisJCXRoZVBDUGFyYW1ldGVyVmFsdWVzLmNsZWFyKCk7CisKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCWVsc2UKKwl7CisJCXRoZVBDUGFyYW1ldGVycy5jbGVhcigpOworCQl0aGVQQ1BhcmFtZXRlclZhbHVlcy5jbGVhcigpOworCisJCXJldHVybiggZmFsc2UgKTsKKwl9Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEVYRUNVVElPTiBDT05URVhUIFBBUkFNRVRFUlMgTlVNRVJJWkFUSU9OCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIFNvbHZlckZhY3Rvcnk6OnNvbHZlUGFyYW1ldGVycyhBUEV4ZWN1dGlvbkRhdGEgJiBhbkVELCBjb25zdCBCRiAmIGFDb25kaXRpb24pCit7CisJaWYoIGFDb25kaXRpb24uaXNFcXVhbFRydWUoKSApCisJeworCQlyZXR1cm4oIGZhbHNlICk7CisJfQorCisJdGhlUENQYXJhbWV0ZXJzLmNsZWFyKCk7CisJdGhlUENQYXJhbWV0ZXJWYWx1ZXMuY2xlYXIoKTsKKworCWlmKCB0aGVEZWZhdWx0U29sdmVyNE1vZGVsc1Byb2R1Y3Rpb24tPnNvbHZlKAorCQkJYUNvbmRpdGlvbiwgdGhlUENQYXJhbWV0ZXJzLCB0aGVQQ1BhcmFtZXRlclZhbHVlcykgKQorCXsKKwkJUGFyYW1ldGVyc1J1bnRpbWVGb3JtICYgcGFyYW1zUkYgPSBhbkVELmdldFdyaXRhYmxlUGFyYW1ldGVyc1J1bnRpbWVGb3JtKCk7CisJCUFQVGFibGVPZkRhdGEgJiBhRGF0YVRhYmxlID0gcGFyYW1zUkYuZ2V0V3JpdGFibGVEYXRhVGFibGUoKTsKKworCQlCRlZlY3Rvcjo6cmF3X2l0ZXJhdG9yPCBJbnN0YW5jZU9mRGF0YSA+IGl0UGFyYW0gPSB0aGVQQ1BhcmFtZXRlcnMuYmVnaW4oKTsKKwkJQkZWZWN0b3I6OnJhd19pdGVyYXRvcjwgSW5zdGFuY2VPZkRhdGEgPiBlbmRQYXJhbSA9IHRoZVBDUGFyYW1ldGVycy5lbmQoKTsKKwkJZm9yKCBzdGQ6OnNpemVfdCBvZmZzZXQgPSAwIDsgaXRQYXJhbSAhPSBlbmRQYXJhbSA7ICsraXRQYXJhbSAsICsrb2Zmc2V0ICkKKwkJeworCQkJYURhdGFUYWJsZS0+c2V0KCAoaXRQYXJhbSksIHRoZVBDUGFyYW1ldGVyVmFsdWVzW29mZnNldF0gKTsKKwkJfQorCisJCXJldHVybiggdHJ1ZSApOworCX0KKworCXJldHVybiggZmFsc2UgKTsKK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBQb3VyIHBvdXZvaXIgcmV1dGlsaXNlciB0b3V0IGwnb3V0aWxsYWdlIGRlIERpdmVyaXR5CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIFNvbHZlckZhY3Rvcnk6OnNldE1vZGVsKEV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOViwgQVBFeGVjdXRpb25EYXRhICYgYW5FRCkKK3sKKwlQYXJhbWV0ZXJzUnVudGltZUZvcm0gJiBwYXJhbXNSRiA9IGFuRUQuZ2V0V3JpdGFibGVQYXJhbWV0ZXJzUnVudGltZUZvcm0oKTsKKworCUJhc2VUeXBlU3BlY2lmaWVyICogcGFyYW1UeXBlID0gTlVMTDsKKwlCRiB2YWx1ZTsKKwlUYWJsZU9mSW5zdGFuY2VPZkRhdGE6OmNvbnN0X3Jhd19pdGVyYXRvciBpdFBhcmFtID0KKwkJCXBhcmFtc1JGLmdldFBhcmFtZXRlcnMoKS5iZWdpbigpOworCVRhYmxlT2ZJbnN0YW5jZU9mRGF0YTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGVuZFBhcmFtID0KKwkJCXBhcmFtc1JGLmdldFBhcmFtZXRlcnMoKS5lbmQoKTsKKwlUYWJsZU9mRGF0YTo6Y29uc3RfaXRlcmF0b3IgaXRWYWx1ZSA9IHBhcmFtc1JGLmdldERhdGFUYWJsZSgpLT5iZWdpbigpOworCWZvciggOyBpdFBhcmFtICE9IGVuZFBhcmFtIDsgKytpdFBhcmFtLCArK2l0VmFsdWUgKQorCXsKKwkJdmFsdWUgID0gKCppdFZhbHVlKTsKKworCQkoaXRQYXJhbSktPmdldHdNb2RpZmllcigpLnNldEZlYXR1cmVGaW5hbCggZmFsc2UgKTsKKworCQlpZiggdmFsdWUuaXNCdWlsdGluVmFsdWUoKSApCisJCXsKKwkJCS8qIE9LOj4gdmFsdWUgaXMgbnVtZXJpYyAqLworCQl9CisJCWVsc2UgaWYoIHZhbHVlICE9IChpdFBhcmFtKSApCisJCXsKKwkJCWlmKCBFTlYuZXZhbChhbkVELCBhbkVELT5nZXRTeXN0ZW1SSUQoKSwgdmFsdWUpICkKKwkJCXsKKwkJCQlwYXJhbXNSRi5zZXREYXRhKChpdFBhcmFtKS0+Z2V0T2Zmc2V0KCksIEVOVi5vdXRWQUwpOworCQkJfQorCQl9CisJCWVsc2UgaWYoIChpdFBhcmFtKS0+aGFzVmFsdWUoKSApCisJCXsKKwkJCXBhcmFtc1JGLnNldERhdGEoKGl0UGFyYW0pLT5nZXRPZmZzZXQoKSwgKGl0UGFyYW0pLT5nZXRWYWx1ZSgpKTsKKwkJfQorCQllbHNlIGlmKCAoaXRQYXJhbSktPmhhc1R5cGVTcGVjaWZpZXIoKSAmJgorCQkJCShpdFBhcmFtKS0+Z2V0VHlwZVNwZWNpZmllcigpLT5oYXNEZWZhdWx0VmFsdWUoKSApCisJCXsKKwkJCXBhcmFtc1JGLnNldERhdGEoKGl0UGFyYW0pLT5nZXRPZmZzZXQoKSwKKwkJCQkJKGl0UGFyYW0pLT5nZXRUeXBlU3BlY2lmaWVyKCktPmdldERlZmF1bHRWYWx1ZSgpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBhcmFtVHlwZSA9IChpdFBhcmFtKS0+cmVmZXJlZFR5cGVTcGVjaWZpZXIoKTsKKworCQkJLyogT0s6PiBOTyB2YWx1ZSAqLworCQkJaWYoIHBhcmFtVHlwZS0+aXNUeXBlZE51bWVyaWMoKSApCisJCQl7CisJCQkJaWYoIHBhcmFtVHlwZS0+aXNUeXBlZEludGVydmFsKCkgKQorCQkJCXsKKwkJCQkJSW50ZXJ2YWxUeXBlU3BlY2lmaWVyICogaW50ZXJ2YWxUUyA9IChpdFBhcmFtKS0+CisJCQkJCQkJZ2V0VHlwZVNwZWNpZmllcigpLT5hczwgSW50ZXJ2YWxUeXBlU3BlY2lmaWVyID4oKTsKKworCQkJCQlpZiggaW50ZXJ2YWxUUy0+Z2V0SW5maW11bSgpLmlzTnVtZXJpYygpICYmCisJCQkJCQkJaW50ZXJ2YWxUUy0+Z2V0U3VwcmVtdW0oKS5pc051bWVyaWMoKSApCisJCQkJCXsKKwkJCQkJCS8vIENhbGN1bCBhbMOpYXRvaXJlIGQndW4gbm9tYnJlIGVudGllcgorCQkJCQkJcGFyYW1zUkYuc2V0RGF0YSggKGl0UGFyYW0pLT5nZXRPZmZzZXQoKSwKKwkJCQkJCQlFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0ludGVnZXIoCisJCQkJCQkJCVJBTkRPTTo6Z2VuX2ludCgKKwkJCQkJCQkJCWludGVydmFsVFMtPmdldEluZmltdW0oKS50b0ludGVnZXIoKSwKKwkJCQkJCQkJCWludGVydmFsVFMtPmdldFN1cHJlbXVtKCkudG9JbnRlZ2VyKCkpKSApOworCQkJCQl9CisJCQkJCWVsc2UgaWYoIGludGVydmFsVFMtPmlzTENsb3NlZCgpICkKKwkJCQkJeworCQkJCQkJLy8gQ2FsY3VsIGFsw6lhdG9pcmUgZCd1biBub21icmUgZW50aWVyCisJCQkJCQlwYXJhbXNSRi5zZXREYXRhKCAoaXRQYXJhbSktPmdldE9mZnNldCgpLAorCQkJCQkJCQlpbnRlcnZhbFRTLT5nZXRJbmZpbXVtKCkgKTsKKwkJCQkJfQorCQkJCQllbHNlIGlmKCBpbnRlcnZhbFRTLT5pc1JDbG9zZWQoKSApCisJCQkJCXsKKwkJCQkJCS8vIENhbGN1bCBhbMOpYXRvaXJlIGQndW4gbm9tYnJlIGVudGllcgorCQkJCQkJcGFyYW1zUkYuc2V0RGF0YSggKGl0UGFyYW0pLT5nZXRPZmZzZXQoKSwKKwkJCQkJCQkJaW50ZXJ2YWxUUy0+Z2V0U3VwcmVtdW0oKSApOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJLy8gQ2FsY3VsIGFsw6lhdG9pcmUgZCd1biBub21icmUgZW50aWVyCisJCQkJCQlwYXJhbXNSRi5zZXREYXRhKCAoaXRQYXJhbSktPmdldE9mZnNldCgpLAorCQkJCQkJCUV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6ZGl2RXhwcigKKwkJCQkJCQkJCUV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6YWRkRXhwcigKKwkJCQkJCQkJCQlpbnRlcnZhbFRTLT5nZXRJbmZpbXVtKCksCisJCQkJCQkJCQkJaW50ZXJ2YWxUUy0+Z2V0U3VwcmVtdW0oKSksCisJCQkJCQkJCQlFeHByZXNzaW9uQ29uc3RhbnQ6OklOVEVHRVJfVFdPKSApOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8vIENhbGN1bCBhbMOpYXRvaXJlIGQndW4gbm9tYnJlIGVudGllcgorCQkJCQlwYXJhbXNSRi5zZXREYXRhKChpdFBhcmFtKS0+Z2V0T2Zmc2V0KCksCisJCQkJCQlFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0ludGVnZXIoCisJCQkJCQkJUkFORE9NOjpnZW5fdWludCgwLCBBVk1fTlVNRVJJQ19NQVhfSU5UOCkpICk7CisJCQkJfQorCQkJfQorCisJCQllbHNlIGlmKCBwYXJhbVR5cGUtPmlzVHlwZWRCb29sZWFuKCkgKQorCQkJeworCQkJCS8vIENhbGN1bCBhbMOpYXRvaXJlIGQndW4gbm9tYnJlIGNvbXByaXMgZW50cmUgMCBldCAxCisJCQkJcGFyYW1zUkYuc2V0RGF0YSgoaXRQYXJhbSktPmdldE9mZnNldCgpLAorCQkJCQkJRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdCb29sZWFuKAorCQkJCQkJCQlSQU5ET006Omdlbl91aW50KDAsIDEpICE9IDApKTsKKwkJCX0KKwkJCWVsc2UgaWYoIHBhcmFtVHlwZS0+aXNUeXBlZEVudW0oKSApCisJCQl7CisJCQkJLy8gQ2hvaXggYWzDqWF0b2lyZSBkJ3VuIHN5bWJvbCBkdSB0eXBlIEVudW0KKwkJCQlwYXJhbXNSRi5zZXREYXRhKChpdFBhcmFtKS0+Z2V0T2Zmc2V0KCksCisJCQkJCQlwYXJhbVR5cGUtPmFzPCBFbnVtVHlwZVNwZWNpZmllcgorCQkJCQkJCQkJPigpLT5nZXRSYW5kb21TeW1ib2xEYXRhKCkpOworCQkJfQorCisJCQllbHNlIGlmKCBwYXJhbVR5cGUtPmlzVHlwZWRTdHJpbmcoKSApCisJCQl7CisJCQkJLy8gQ2FsY3VsIGFsw6lhdG9pcmUgZCd1bmUgY2hhaW5lIGRlIGNoYXJhY3TDqHJlCisKKwkJCQlwYXJhbXNSRi5zZXREYXRhKChpdFBhcmFtKS0+Z2V0T2Zmc2V0KCksCisJCQkJCUV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3U3RyaW5nKCI8PCByYW5kb20gc3RyaW5nID4+IikpOworCisvLwkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorLy8JCQkJCQk8PCAiU29sdmVyRmFjdG9yeTo6c2V0TW9kZWw6PiAiCisvLwkJCQkJCQkiVW5leHBlY3RlZCBzeW1ib2xpYyB2YWx1ZSBmb3IgPDwgIgorLy8JCQkJCQk8PCBzdHJfaGVhZGVyKCAqaXRQYXJhbSApIDw8ICIgPj4gISEhIgorLy8JCQkJCQk8PCBTRU5EX0VYSVQ7CisKKwkJCX0KKwkJCWVsc2UgaWYoIHBhcmFtVHlwZS0+aXNUeXBlZENoYXJhY3RlcigpICkKKwkJCXsKKwkJCQkvLyBDaG9peCBhbMOpYXRvaXJlIGQndW4gY2hhcmFjdMOocmUKKworCQkJCXBhcmFtc1JGLnNldERhdGEoKGl0UGFyYW0pLT5nZXRPZmZzZXQoKSwKKwkJCQkJRXhwcmVzc2lvbkNvbnN0cnVjdG9yOjpuZXdDaGFyKFJBTkRPTTo6Z2VuX2NoYXIoKSkpOworCisvLwkJCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorLy8JCQkJCQk8PCAiU29sdmVyRmFjdG9yeTo6c2V0TW9kZWw6PiAiCisvLwkJCQkJCQkiVW5leHBlY3RlZCBzeW1ib2xpYyB2YWx1ZSBmb3IgPDwgIgorLy8JCQkJCQk8PCBzdHJfaGVhZGVyKCAqaXRQYXJhbSApIDw8ICIgPj4gISEhIgorLy8JCQkJCQk8PCBTRU5EX0VYSVQ7CisJCQl9CisKKwkJCWVsc2UgaWYoIHBhcmFtVHlwZS0+aXNUeXBlZE1hY2hpbmUoKSApCisJCQl7CisJCQkJcGFyYW1zUkYuc2V0RGF0YSgoaXRQYXJhbSktPmdldE9mZnNldCgpLAorCQkJCQkJUnVudGltZUxpYjo6UklEX0VOVklST05NRU5UKTsKKworLy8JCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKy8vCQkJCQkJPDwgIlNvbHZlckZhY3Rvcnk6OnNldE1vZGVsOj4gIgorLy8JCQkJCQkJIlVuZXhwZWN0ZWQgc3ltYm9saWMgdmFsdWUgZm9yIDw8ICIKKy8vCQkJCQkJPDwgc3RyX2hlYWRlciggKml0UGFyYW0gKSA8PCAiID4+ICEhISIKKy8vCQkJCQkJPDwgU0VORF9FWElUOworCQkJfQorCisJCQllbHNlCisJCQl7CisJCQkJQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQKKwkJCQkJCTw8ICJTb2x2ZXJGYWN0b3J5OjpzZXRNb2RlbDo+ICIKKwkJCQkJCQkiVW5leHBlY3RlZCBzeW1ib2xpYyBwYXJhbWV0ZXIgdHlwZSA8PCAiCisJCQkJCQk8PCBzdHJfaGVhZGVyKCAqaXRQYXJhbSApIDw8ICIgPj4gISEhIgorCQkJCQk8PCBTRU5EX0VYSVQ7CisJCQl9CisJCX0KKwl9Cit9CisKKwordm9pZCBTb2x2ZXJGYWN0b3J5OjpyZXNldE1vZGVsKEFQRXhlY3V0aW9uRGF0YSAmIGFuRUQpCit7CisJUGFyYW1ldGVyc1J1bnRpbWVGb3JtICYgcGFyYW1zUkYgPSBhbkVELmdldFdyaXRhYmxlUGFyYW1ldGVyc1J1bnRpbWVGb3JtKCk7CisKKwlUYWJsZU9mSW5zdGFuY2VPZkRhdGE6OmNvbnN0X3Jhd19pdGVyYXRvciBpdFBhcmFtID0KKwkJCXBhcmFtc1JGLmdldFBhcmFtZXRlcnMoKS5iZWdpbigpOworCVRhYmxlT2ZJbnN0YW5jZU9mRGF0YTo6Y29uc3RfcmF3X2l0ZXJhdG9yIGVuZFBhcmFtID0KKwkJCXBhcmFtc1JGLmdldFBhcmFtZXRlcnMoKS5lbmQoKTsKKwlmb3IoIDsgaXRQYXJhbSAhPSBlbmRQYXJhbSA7ICsraXRQYXJhbSApCisJeworCQkoaXRQYXJhbSktPmdldHdNb2RpZmllcigpLnNldEZlYXR1cmVGaW5hbCggdHJ1ZSApOworCX0KK30KKworCisKK3ZvaWQgU29sdmVyRmFjdG9yeTo6c2V0UnVudGltZVBhcmFtZXRlcnNTb2x2aW5nVmFsdWVzKEFQRXhlY3V0aW9uRGF0YSAmIGFuRUQpCit7CisJdGhlU3ltYm9saWNFRCA9IGFuRUQ7CisKKwlQYXJhbWV0ZXJzUnVudGltZUZvcm0gJiBwYXJhbXNSRiA9CisJCQl0aGVTeW1ib2xpY0VELmdldFdyaXRhYmxlUGFyYW1ldGVyc1J1bnRpbWVGb3JtKCk7CisKKwlwYXJhbXNSRi5yZXNldE9mZnNldCgpOworCisJQkZWZWN0b3I6OnJhd19pdGVyYXRvcjwgSW5zdGFuY2VPZkRhdGEgPiBpdFZhciA9IHRoZVBDUGFyYW1ldGVycy5iZWdpbigpOworCUJGVmVjdG9yOjpyYXdfaXRlcmF0b3I8IEluc3RhbmNlT2ZEYXRhID4gZW5kVmFyID0gdGhlUENQYXJhbWV0ZXJzLmVuZCgpOworCWZvciggYXZtX29mZnNldF90IG9mZnNldCA9IDAgOyBpdFZhciAhPSBlbmRWYXIgOyArK2l0VmFyLCArK29mZnNldCApCisJeworCQkoaXRWYXIpLT5nZXR3TW9kaWZpZXIoKS5zZXRGZWF0dXJlRmluYWwoIGZhbHNlICk7CisKKy8vCQlpZiggKGl0VmFyKSAhPSBwYXJhbXNSRi5yYXdWYXJpYWJsZSgoaXRWYXIpLT5nZXRPZmZzZXQoKSkgKQorLy8JCXsKKy8vCQkJQVZNX09TX0NPVVQgPDwgIjo/IT8+ICIgPDwgKGl0VmFyKS0+Z2V0RnVsbHlRdWFsaWZpZWROYW1lSUQoKQorLy8JCQkJCTw8ICIgKHBhcmFtOiAiIDw8IHBhcmFtc1JGLnJhd1ZhcmlhYmxlKAorLy8JCQkJCQkoaXRWYXIpLT5nZXRPZmZzZXQoKSktPmdldEZ1bGx5UXVhbGlmaWVkTmFtZUlEKCkgPDwgIikiCisvLwkJCQkJPDwgIiA9ICIgPDwgcGFyYW1zUkYuZ2V0RGF0YSgoaXRWYXIpLT5nZXRPZmZzZXQoKSkuc3RyKCkKKy8vCQkJCQk8PCAiIDwtICIgPDwgdGhlUENQYXJhbWV0ZXJWYWx1ZXNbb2Zmc2V0XS5zdHIoKQorLy8JCQkJCTw8IHN0ZDo6ZW5kbDsKKy8vCQl9CisKKwkJcGFyYW1zUkYuc2V0RGF0YSgoaXRWYXIpLT5nZXRPZmZzZXQoKSwgdGhlUENQYXJhbWV0ZXJWYWx1ZXNbb2Zmc2V0XSk7CisJfQorfQorCisKK3ZvaWQgU29sdmVyRmFjdG9yeTo6dXBkYXRlUnVudGltZVBhcmFtZXRlcnNWYWx1ZXMoY29uc3QgQkYgJiBhVmFsdWUpCit7CisJQkZWZWN0b3IgZXhwclZhcmlhYmxlVmVjdG9yOworCUV4cHJlc3Npb25GYWN0b3J5Ojpjb2xsZWN0VmFyaWFibGUoYVZhbHVlLCBleHByVmFyaWFibGVWZWN0b3IpOworCisJY29uc3QgUGFyYW1ldGVyc1J1bnRpbWVGb3JtICYgcGFyYW1zUkYgPQorCQkJdGhlU3ltYm9saWNFRC0+Z2V0UGFyYW1ldGVyc1J1bnRpbWVGb3JtKCk7CisKKwlCRlZlY3Rvcjo6cmF3X2l0ZXJhdG9yPCBJbnN0YW5jZU9mRGF0YSA+IGl0VmFyID0gZXhwclZhcmlhYmxlVmVjdG9yLmJlZ2luKCk7CisJQkZWZWN0b3I6OnJhd19pdGVyYXRvcjwgSW5zdGFuY2VPZkRhdGEgPiBlbmRWYXIgPSBleHByVmFyaWFibGVWZWN0b3IuZW5kKCk7CisJZm9yKCA7IGl0VmFyICE9IGVuZFZhciA7ICsraXRWYXIgKQorCXsKKwkJaWYoIG5vdCB0aGVQQ1BhcmFtZXRlcnMuY29udGFpbnMoKml0VmFyKSApCisJCXsKKwkJCShpdFZhciktPmdldHdNb2RpZmllcigpLnNldEZlYXR1cmVGaW5hbCggZmFsc2UgKTsKKworCQkJaWYoIChpdFZhciktPmhhc1ZhbHVlKCkgKQorCQkJeworCQkJCXBhcmFtc1JGLnNldERhdGEoKGl0VmFyKS0+Z2V0T2Zmc2V0KCksIChpdFZhciktPmdldFZhbHVlKCkpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXBhcmFtc1JGLnNldERhdGEoKGl0VmFyKS0+Z2V0T2Zmc2V0KCksICgqaXRWYXIpKTsKKwkJCX0KKwkJfQorCX0KK30KKworCisKK3ZvaWQgU29sdmVyRmFjdG9yeTo6ZmluYWxpemVSdW50aW1lUGFyYW1ldGVycygpCit7CisJVGFibGVPZkluc3RhbmNlT2ZEYXRhOjpjb25zdF9yYXdfaXRlcmF0b3IgaXRWYXIgPQorCQkJdGhlU3ltYm9saWNFRC0+Z2V0UGFyYW1ldGVyc1J1bnRpbWVGb3JtKCkuZ2V0VmFyaWFibGVzKCkuYmVnaW4oKTsKKwlUYWJsZU9mSW5zdGFuY2VPZkRhdGE6OmNvbnN0X3Jhd19pdGVyYXRvciBlbmRWYXIgPQorCQkJdGhlU3ltYm9saWNFRC0+Z2V0UGFyYW1ldGVyc1J1bnRpbWVGb3JtKCkuZ2V0VmFyaWFibGVzKCkuZW5kKCk7CisJZm9yKCA7IGl0VmFyICE9IGVuZFZhciA7ICsraXRWYXIgKQorCXsKKwkJKGl0VmFyKS0+Z2V0d01vZGlmaWVyKCkuc2V0RmVhdHVyZUZpbmFsKCB0cnVlICk7CisJfQorCisJdGhlU3ltYm9saWNFRC5kZXN0cm95KCk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRVhFQ1VUSU9OIERBVEEgTkVXRlJFU0gKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQVBFeGVjdXRpb25EYXRhIFNvbHZlckZhY3Rvcnk6OnNvbHZlTmV3ZnJlc2goU29sdmVyRGVmOjpTT0xWRVJfS0lORCBhU29sdmVyS2luZCwKKwkJRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WLCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQywKKwkJY29uc3QgQkYgJiBhQ29uZGl0aW9uKQoreworCUFQRXhlY3V0aW9uRGF0YSBhbkVEID0gYW5FQy5nZXRBUEV4ZWN1dGlvbkRhdGEoKTsKKworCVBhcmFtZXRlcnNSdW50aW1lRm9ybSAmIHBhcmFtc1JGID0gYW5FRC5nZXRXcml0YWJsZVBhcmFtZXRlcnNSdW50aW1lRm9ybSgpOworCisJQkYgdmFsdWU7CisJVGFibGVPZkluc3RhbmNlT2ZEYXRhOjpjb25zdF9yYXdfaXRlcmF0b3IgaXRQYXJhbSA9CisJCQlwYXJhbXNSRi5nZXRQYXJhbWV0ZXJzKCkuYmVnaW4oKTsKKwlUYWJsZU9mSW5zdGFuY2VPZkRhdGE6OmNvbnN0X3Jhd19pdGVyYXRvciBlbmRQYXJhbSA9CisJCQlwYXJhbXNSRi5nZXRQYXJhbWV0ZXJzKCkuZW5kKCk7CisJVGFibGVPZkRhdGE6OmNvbnN0X2l0ZXJhdG9yIGl0VmFsdWUgPSBwYXJhbXNSRi5nZXREYXRhVGFibGUoKS0+YmVnaW4oKTsKKwlmb3IoIDsgaXRQYXJhbSAhPSBlbmRQYXJhbSA7ICsraXRQYXJhbSwgKytpdFZhbHVlICkKKwl7CisJCXZhbHVlICA9ICgqaXRWYWx1ZSk7CisKKwkJKGl0UGFyYW0pLT5nZXR3TW9kaWZpZXIoKS5zZXRGZWF0dXJlRmluYWwoIGZhbHNlICk7CisKKwkJaWYoIHZhbHVlLmlzQnVpbHRpblZhbHVlKCkgKQorCQl7CisJCQkvKiBPSzo+IHZhbHVlIGlzIG51bWVyaWMgKi8KKwkJfQorCQllbHNlIGlmKCB2YWx1ZSAhPSAoaXRQYXJhbSkgKQorCQl7CisJCQlpZiggRU5WLmV2YWwoYW5FRCwgYW5FRC0+Z2V0U3lzdGVtUklEKCksIHZhbHVlKSApCisJCQl7CisJCQkJcGFyYW1zUkYuc2V0RGF0YSgoaXRQYXJhbSktPmdldE9mZnNldCgpLCBFTlYub3V0VkFMKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmKCAoaXRQYXJhbSktPmhhc1ZhbHVlKCkgKQorCQl7CisJCQlwYXJhbXNSRi5zZXREYXRhKChpdFBhcmFtKS0+Z2V0T2Zmc2V0KCksIChpdFBhcmFtKS0+Z2V0VmFsdWUoKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlCRkxpc3QgcGFyYW1MaXN0OworCisJCQl2YWx1ZSA9IEVOVi5jcmVhdGVOZXdGcmVzaFBhcmFtKAorCQkJCQlwYXJhbXNSRi5nZXRSSUQoKSwgKGl0UGFyYW0pLCBwYXJhbUxpc3QgKTsKKworCQkJcGFyYW1zUkYuc2V0RGF0YSggKGl0UGFyYW0pLT5nZXRPZmZzZXQoKSwgdmFsdWUgKTsKKwkJfQorCX0KKworCXJldHVybiggYW5FRCApOworfQorCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3NvbHZlci9hcGkvU29sdmVyRmFjdG9yeS5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc29sdmVyL2FwaS9Tb2x2ZXJGYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMyZTE0ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3NvbHZlci9hcGkvU29sdmVyRmFjdG9yeS5oCkBAIC0wLDAgKzEsMjc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogOSBqdWlsLiAyMDA5CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgU09MVkVSX1NPTFZFUkZBQ1RPUllfSF8KKyNkZWZpbmUgU09MVkVSX1NPTFZFUkZBQ1RPUllfSF8KKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vVHlwZWRlZi5oPgorCisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uQ29udGV4dC5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkRhdGEuaD4KKworI2luY2x1ZGUgPHNvbHZlci9hcGkvU29sdmVyRGVmLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCitjbGFzcyBFbGVtZW50OworY2xhc3MgQkY7CisKK2NsYXNzIEV2YWx1YXRpb25FbnZpcm9ubWVudDsKKworY2xhc3MgSW5zdGFuY2VPZkRhdGE7CisKK2NsYXNzIFNhdFNvbHZlcjsKKworCitjbGFzcyBTb2x2ZXJGYWN0b3J5Cit7CisKK3B1YmxpYzoKKwkvKioKKwkgKiBBVFRSSUJVVEUKKwkgKi8KKwlzdGF0aWMgU2F0U29sdmVyICogdGhlRGVmYXVsdFNvbHZlcjRDaGVja1NhdGlzZmlhYmlsaXR5OworCXN0YXRpYyBTYXRTb2x2ZXIgKiB0aGVEZWZhdWx0U29sdmVyNE1vZGVsc1Byb2R1Y3Rpb247CisKKwlzdGF0aWMgQkZWZWN0b3IgdGhlUENQYXJhbWV0ZXJzOworCXN0YXRpYyBCRlZlY3RvciB0aGVQQ1BhcmFtZXRlclZhbHVlczsKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBQb3VyIHBvdXZvaXIgcmV1dGlsaXNlciB0b3V0IGwnb3V0aWxsYWdlIGRlIERpdmVyaXR5CisJc3RhdGljIEFQRXhlY3V0aW9uRGF0YSAgICAgdGhlU3ltYm9saWNFRDsKKworCitwdWJsaWM6CisJLyoqCisJICogTE9BREVSIC0gRElTUE9TRVIKKwkgKiBERVNUUk9ZCisJICovCisJc3RhdGljIHZvaWQgbG9hZCgpOworCXN0YXRpYyB2b2lkIGRpc3Bvc2UoKTsKKworCXN0YXRpYyB2b2lkIGRlc3Ryb3koU2F0U29sdmVyICogYVNvbHZlcik7CisKKwkvKioKKwkgKiBTT0xWRVIgQVBJCisJICovCisJc3RhdGljIFNvbHZlckRlZjo6U0FUSVNGSUFCSUxJVFlfUklORyBpc1NhdGlzZmlhYmxlKAorCQkJU29sdmVyRGVmOjpTT0xWRVJfS0lORCBhU29sdmVyS2luZCwgY29uc3QgQkYgJiBhQ29uZGl0aW9uKTsKKworCWlubGluZSBzdGF0aWMgYm9vbCBpc1N0cm9uZ1NhdGlzZmlhYmxlKAorCQkJU29sdmVyRGVmOjpTT0xWRVJfS0lORCBhU29sdmVyS2luZCwgY29uc3QgQkYgJiBhQ29uZGl0aW9uKQorCXsKKwkJcmV0dXJuKCBTb2x2ZXJGYWN0b3J5Ojppc1NhdGlzZmlhYmxlKGFTb2x2ZXJLaW5kLCBhQ29uZGl0aW9uKQorCQkJCT09IFNvbHZlckRlZjo6U0FUSVNGSUFCTEUgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIGJvb2wgaXNXZWFrU2F0aXNmaWFibGUoCisJCQlTb2x2ZXJEZWY6OlNPTFZFUl9LSU5EIGFTb2x2ZXJLaW5kLCBjb25zdCBCRiAmIGFDb25kaXRpb24pCisJeworCQlyZXR1cm4oIFNvbHZlckZhY3Rvcnk6OmlzU2F0aXNmaWFibGUoYVNvbHZlcktpbmQsIGFDb25kaXRpb24pCisJCQkJIT0gU29sdmVyRGVmOjpVTlNBVElTRklBQkxFICk7CisJfQorCisKKworCXN0YXRpYyBTb2x2ZXJEZWY6OlNBVElTRklBQklMSVRZX1JJTkcgaXNTYXRpc2ZpYWJsZSgKKwkJCWNvbnN0IEJGICYgYUNvbmRpdGlvbiwgYm9vbCB1c2VEZWZhdWx0U29sdmVyID0gZmFsc2UpOworCisJaW5saW5lIHN0YXRpYyBib29sIGlzU3Ryb25nU2F0aXNmaWFibGUoCisJCQljb25zdCBCRiAmIGFDb25kaXRpb24sIGJvb2wgdXNlRGVmYXVsdFNvbHZlcikKKwl7CisJCXJldHVybiggU29sdmVyRmFjdG9yeTo6aXNTYXRpc2ZpYWJsZShhQ29uZGl0aW9uLCB1c2VEZWZhdWx0U29sdmVyKQorCQkJCT09IFNvbHZlckRlZjo6U0FUSVNGSUFCTEUgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIGJvb2wgaXNXZWFrU2F0aXNmaWFibGUoCisJCQljb25zdCBCRiAmIGFDb25kaXRpb24sIGJvb2wgdXNlRGVmYXVsdFNvbHZlcikKKwl7CisJCXJldHVybiggU29sdmVyRmFjdG9yeTo6aXNTYXRpc2ZpYWJsZShhQ29uZGl0aW9uLCB1c2VEZWZhdWx0U29sdmVyKQorCQkJCSE9IFNvbHZlckRlZjo6VU5TQVRJU0ZJQUJMRSApOworCX0KKworCWlubGluZSBzdGF0aWMgYm9vbCBpc1N0cm9uZ1NhdGlzZmlhYmxlKGNvbnN0IEJGICYgYUNvbmRpdGlvbikKKwl7CisJCXJldHVybiggU29sdmVyRmFjdG9yeTo6aXNTYXRpc2ZpYWJsZShhQ29uZGl0aW9uLAorCQkJU29sdmVyRGVmOjpERUZBVUxUX1NPTFZFUl9VU0FHRV9GTEFHKSA9PSBTb2x2ZXJEZWY6OlNBVElTRklBQkxFICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBib29sIGlzV2Vha1NhdGlzZmlhYmxlKGNvbnN0IEJGICYgYUNvbmRpdGlvbikKKwl7CisJCXJldHVybiggU29sdmVyRmFjdG9yeTo6aXNTYXRpc2ZpYWJsZShhQ29uZGl0aW9uLAorCQkJU29sdmVyRGVmOjpERUZBVUxUX1NPTFZFUl9VU0FHRV9GTEFHKSAhPSBTb2x2ZXJEZWY6OlVOU0FUSVNGSUFCTEUgKTsKKwl9CisKKworCS8qKgorCSAqIFVTRUQgQlkgRkFNIEx0bFByb3ZlckZpbHRlcgorCSAqLworCXN0YXRpYyBib29sIGlzRW1wdHlJbnRlcnNlY3Rpb24oCisJCQlMaXN0T2ZJbnN0YW5jZU9mRGF0YSBhTGlzdE9mVmFyUGFyYW0sCisJCQljb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYU1haW5FQywKKwkJCWNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhQ29tcGFyRUMpOworCisJc3RhdGljIGJvb2wgaXNTdWJTZXQoCisJCQljb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYU1haW5FQywKKwkJCWNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhQ29tcGFyRUMpOworCisKKwkvKioKKwkgKiBTT0xWRVIKKwkgKi8KKwlzdGF0aWMgU2F0U29sdmVyICogbmV3U29sdmVyNENoZWNrU2F0aXNmaWFiaWxpdHkoCisJCQlTb2x2ZXJEZWY6OlNPTFZFUl9LSU5EIGFTb2x2ZXJLaW5kKTsKKworCXN0YXRpYyBTYXRTb2x2ZXIgKiBuZXdTb2x2ZXI0TW9kZWxzUHJvZHVjdGlvbigKKwkJCVNvbHZlckRlZjo6U09MVkVSX0tJTkQgYVNvbHZlcktpbmQpOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQ09ORElUSU9OIFBBUkFNRVRFUiBTT0xWSU5HCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJc3RhdGljIGJvb2wgc29sdmUoU29sdmVyRGVmOjpTT0xWRVJfS0lORCBhU29sdmVyS2luZCwgY29uc3QgQkYgJiBhQ29uZGl0aW9uLAorCQkJQkZWZWN0b3IgJiBkYXRhVmVjdG9yLCBCRlZlY3RvciAmIHZhbHVlc1ZlY3Rvcik7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBFWEVDVVRJT04gQ09OVEVYVCBTT0xWSU5HCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJaW5saW5lIHN0YXRpYyBBUEV4ZWN1dGlvbkRhdGEgc29sdmUoCisJCQlFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBFTlYsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKQorCXsKKy8vCQlyZXR1cm4oIFNvbHZlckZhY3Rvcnk6OnNvbHZlKAorLy8JCQkJU29sdmVyRGVmOjpERUZBVUxUX1NPTFZFUl9LSU5ELCBFTlYsIGFuRUMpICk7CisKKwkJcmV0dXJuKCBTb2x2ZXJGYWN0b3J5Ojpzb2x2ZSgKKwkJCQkoKnRoZURlZmF1bHRTb2x2ZXI0TW9kZWxzUHJvZHVjdGlvbiksIEVOViwgYW5FQykgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIEFQRXhlY3V0aW9uRGF0YSBzb2x2ZShTb2x2ZXJEZWY6OlNPTFZFUl9LSU5EIGFTb2x2ZXJLaW5kLAorCQkJRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WLCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQykKKwl7CisJCXJldHVybiggU29sdmVyRmFjdG9yeTo6c29sdmUoYVNvbHZlcktpbmQsIEVOViwgYW5FQywKKwkJCQlhbkVDLnJlZkV4ZWN1dGlvbkRhdGEoKS5nZXRBbGxQYXRoQ29uZGl0aW9uKCkpICk7CisJfQorCisJc3RhdGljIEFQRXhlY3V0aW9uRGF0YSBzb2x2ZShTb2x2ZXJEZWY6OlNPTFZFUl9LSU5EIGFTb2x2ZXJLaW5kLAorCQkJRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WLCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQywKKwkJCWNvbnN0IEJGICYgYUNvbmRpdGlvbik7CisKKworCWlubGluZSBzdGF0aWMgQVBFeGVjdXRpb25EYXRhIHNvbHZlKFNhdFNvbHZlciAmIGFTb2x2ZXIsCisJCQlFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBFTlYsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKQorCXsKKwkJQVBFeGVjdXRpb25EYXRhIGFuRUQgPSBhbkVDLmdldEFQRXhlY3V0aW9uRGF0YSgpOworCQlyZXR1cm4oIFNvbHZlckZhY3Rvcnk6OnNvbHZlKGFTb2x2ZXIsIEVOViwgYW5FRCkgPworCQkJCWFuRUQgOiBBUEV4ZWN1dGlvbkRhdGE6OlJFRl9OVUxMKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIEFQRXhlY3V0aW9uRGF0YSBzb2x2ZShTYXRTb2x2ZXIgJiBhU29sdmVyLAorCQkJRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WLCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQywKKwkJCWNvbnN0IEJGICYgYUNvbmRpdGlvbikKKwl7CisJCUFQRXhlY3V0aW9uRGF0YSBhbkVEID0gYW5FQy5nZXRBUEV4ZWN1dGlvbkRhdGEoKTsKKworCQlyZXR1cm4oIFNvbHZlckZhY3Rvcnk6OnNvbHZlKGFTb2x2ZXIsIEVOViwgYW5FRCwgYUNvbmRpdGlvbikgPworCQkJCWFuRUQgOiBBUEV4ZWN1dGlvbkRhdGE6OlJFRl9OVUxMKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBFWEVDVVRJT04gREFUQSBTT0xWSU5HCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJaW5saW5lIHN0YXRpYyBib29sIHNvbHZlKAorCQkJRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WLCBBUEV4ZWN1dGlvbkRhdGEgJiBhbkVEKQorCXsKKwkJcmV0dXJuKCBTb2x2ZXJGYWN0b3J5Ojpzb2x2ZSgKKwkJCQkoKnRoZURlZmF1bHRTb2x2ZXI0TW9kZWxzUHJvZHVjdGlvbiksIEVOViwgYW5FRCkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIGJvb2wgc29sdmUoU2F0U29sdmVyICYgYVNvbHZlciwKKwkJCUV2YWx1YXRpb25FbnZpcm9ubWVudCAmIEVOViwgQVBFeGVjdXRpb25EYXRhICYgYW5FRCkKKwl7CisJCXJldHVybiggU29sdmVyRmFjdG9yeTo6c29sdmUoYVNvbHZlciwgRU5WLCBhbkVELAorCQkJCWFuRUQtPmdldEFsbFBhdGhDb25kaXRpb24oKSkgKTsKKwl9CisKKwlzdGF0aWMgYm9vbCBzb2x2ZShTYXRTb2x2ZXIgJiBhU29sdmVyLCBFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBFTlYsCisJCQlBUEV4ZWN1dGlvbkRhdGEgJiBhbkVELCBjb25zdCBCRiAmIGFDb25kaXRpb24pOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gRVhFQ1VUSU9OIENPTlRFWFQgTlVNRVJJWkFUSU9OCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJaW5saW5lIHN0YXRpYyBFeGVjdXRpb25Db250ZXh0ICogbnVtZXJpemUoCisJCQlFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBFTlYsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDKQorCXsKKwkJcmV0dXJuKCBTb2x2ZXJGYWN0b3J5OjpudW1lcml6ZSgKKwkJCQkoKnRoZURlZmF1bHRTb2x2ZXI0TW9kZWxzUHJvZHVjdGlvbiksIEVOViwgYW5FQykgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIEV4ZWN1dGlvbkNvbnRleHQgKiBudW1lcml6ZShTYXRTb2x2ZXIgJiBhU29sdmVyLAorCQkJRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WLCBjb25zdCBFeGVjdXRpb25Db250ZXh0ICYgYW5FQykKKwl7CisJCUFQRXhlY3V0aW9uRGF0YSBuZXdFRCA9IFNvbHZlckZhY3Rvcnk6OnNvbHZlKGFTb2x2ZXIsIEVOViwgYW5FQyk7CisKKwkJLy8gQVRURU5USU9OIDogSGF1dGV1ciDDoCBtb2RpZmllciAhISEKKwkJcmV0dXJuKCBuZXcgRXhlY3V0aW9uQ29udGV4dChhbkVDLCBuZXdFRCwgYW5FQy5nZXRIZWlnaHQoKSArIDEsIDApICk7CisJfQorCisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBFWEVDVVRJT04gQ09OVEVYVCBQQVJBTUVURVJTIE5VTUVSSVpBVElPTgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlubGluZSBzdGF0aWMgYm9vbCBzb2x2ZVBhcmFtZXRlcnMoQVBFeGVjdXRpb25EYXRhICYgYW5FRCkKKwl7CisJCXJldHVybiggc29sdmVQYXJhbWV0ZXJzKGFuRUQsIGFuRUQtPmdldEFsbFBhdGhDb25kaXRpb24oKSkgKTsKKwl9CisKKwlzdGF0aWMgYm9vbCBzb2x2ZVBhcmFtZXRlcnMoQVBFeGVjdXRpb25EYXRhICYgYW5FRCwgY29uc3QgQkYgJiBhQ29uZGl0aW9uKTsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFBvdXIgcG91dm9pciByZXV0aWxpc2VyIHRvdXQgbCdvdXRpbGxhZ2UgZGUgRElWRVJTSVRZCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJc3RhdGljIHZvaWQgc2V0TW9kZWwoRXZhbHVhdGlvbkVudmlyb25tZW50ICYgRU5WLCBBUEV4ZWN1dGlvbkRhdGEgJiBhbkVEKTsKKwlzdGF0aWMgdm9pZCByZXNldE1vZGVsKEFQRXhlY3V0aW9uRGF0YSAmIGFuRUQpOworCisJc3RhdGljIHZvaWQgc2V0UnVudGltZVBhcmFtZXRlcnNTb2x2aW5nVmFsdWVzKEFQRXhlY3V0aW9uRGF0YSAmIGFuRUQpOworCXN0YXRpYyB2b2lkIHVwZGF0ZVJ1bnRpbWVQYXJhbWV0ZXJzVmFsdWVzKGNvbnN0IEJGICYgYVZhbHVlKTsKKworCXN0YXRpYyB2b2lkIGZpbmFsaXplUnVudGltZVBhcmFtZXRlcnMoKTsKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIEVYRUNVVElPTiBEQVRBIE5FV0ZSRVNICisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJc3RhdGljIEFQRXhlY3V0aW9uRGF0YSBzb2x2ZU5ld2ZyZXNoKFNvbHZlckRlZjo6U09MVkVSX0tJTkQgYVNvbHZlcktpbmQsCisJCQlFdmFsdWF0aW9uRW52aXJvbm1lbnQgJiBFTlYsIGNvbnN0IEV4ZWN1dGlvbkNvbnRleHQgJiBhbkVDLAorCQkJY29uc3QgQkYgJiBhQ29uZGl0aW9uKTsKKworfTsKKworCisKK30KKworI2VuZGlmIC8qIFNPTFZFUl9TT0xWRVJGQUNUT1JZX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy9zdm5pbmZvLm1rIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc3ZuaW5mby5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjYzMzJhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvc3ZuaW5mby5tawpAQCAtMCwwICsxLDM2IEBACisKK1NWTklORk9fQkFLID0gc3ZuaW5mby5iYWsKK1NWTklORk9fTkVXID0gc3ZuaW5mby50bXAKKworQVZNX0xBVU5DSEVSX0NQUCA9IGBwd2RgLy4uL3NyYy9tYWluL0F2bUxhdW5jaGVyLmNwcAorCisKK2FsbDogQXZtTGF1bmNoZXIuY3BwCisKK0F2bUxhdW5jaGVyLmNwcDogc3ZuaW5mbworCUBpZiB0ZXN0IC1zICQoU1ZOSU5GT19ORVcpOyBcCisJdGhlbiBcCisJICBybSAtZiAkKFNWTklORk9fTkVXKTsgXAorCSAgU1ZOX1JFVj1gY2F0ICQoU1ZOSU5GT19CQUspIHwgZWdyZXAgIl5SLnZpc2lvbi46IiB8IGVncmVwIC1vICJbWzpkaWdpdDpdXSskJCJgOyBcCisJICBTVk5fUkVWX05FWFQ9JCQoKCQkU1ZOX1JFViArIDEgKSk7IFwKKwkgIGVjaG8gIlNVQlZFUlNJT05fUkVWSVNJT04gPSAkJFNWTl9SRVZfTkVYVCIgOyBcCisJICBzZWQgLWkgLXIgLWUgIjUwLDcwIHMvKFNVQlZFUlNJT05fUkVWSVNJT05fTlVNQkVSKSA9IFswLTldKy9cMSA9ICQke1NWTl9SRVZfTkVYVH0vIiBcCisJICAgICAgICAgICAgLWUgIjUwLDcwIHMvKFNVQlZFUlNJT05fUkVWSVNJT05fU1RSSU5HKSA9IFwiWzAtOV0rXCIvXDEgPSBcIiQke1NWTl9SRVZfTkVYVH1cIi8iICQoQVZNX0xBVU5DSEVSX0NQUCkgOyBcCisJZmkKKworc3ZuaW5mbzogc3ZuaW5mby1nZW4KKwlAaWYgdGVzdCAtcyAkKFNWTklORk9fQkFLKTsgXAorCXRoZW4gXAorCSAgaWYgZGlmZiAtcSAkKFNWTklORk9fTkVXKSAkKFNWTklORk9fQkFLKSA+IC9kZXYvbnVsbCA7IFwKKwkgIHRoZW4gcm0gLWYgJChTVk5JTkZPX05FVyk7IGVjaG8gIk5vIGRpZmZlcmVuY2UgISI7IFwKKwkgIGVsc2UgY3AgJChTVk5JTkZPX05FVykgJChTVk5JTkZPX0JBSyk7IGVjaG8gIlVwZGF0ZSBvZiAkKFNWTklORk9fQkFLKSI7IFwKKwkgIGZpOyBcCisJZWxzZSBjcCAkKFNWTklORk9fTkVXKSAkKFNWTklORk9fQkFLKTsgZWNobyAiQ3JlYXRpb24gb2YgJChTVk5JTkZPX0JBSykiOyBcCisJZmkKKworIyAuUEhPTlkgZW5zdXJlcyB0aGUgLnRtcCB2ZXJzaW9uIGlzIGFsd2F5cyByZWJ1aWx0ICh0byBjaGVjayBmb3IgYW55IGNoYW5nZXMpCisuUEhPTlk6IHN2bmluZm8tZ2VuCitzdm5pbmZvLWdlbjoKKwlzdm4gaW5mbyBgcHdkYC8uLi9zcmMgPiAkKFNWTklORk9fTkVXKQorCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3V0aWwvQm9vc3RGYWN0b3J5LmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3V0aWwvQm9vc3RGYWN0b3J5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGU0Njc2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvdXRpbC9Cb29zdEZhY3RvcnkuY3BwCkBAIC0wLDAgKzEsNTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiA4IGp1aWwuIDIwMDkKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkJvb3N0RmFjdG9yeS5oIgorCisjaW5jbHVkZSA8Ym9vc3QvY29uZmlnLmhwcD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKworLy8gQk9PU1RfUE9TSVggb3IgQk9PU1RfV0lORE9XUyBzcGVjaWZ5IHdoaWNoIEFQSSB0byB1c2UuCisjaWYgIWRlZmluZWQoIEJPT1NUX1dJTlhYICkgfHwgIWRlZmluZWQoIEJPT1NUX1dJTkRPV1MgKSAmJiAhZGVmaW5lZCggQk9PU1RfUE9TSVggKSAmJiAhZGVmaW5lZCggQk9PU1RfQ1lHV0lOICkKKyMJaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19XSU4zMl9fKSB8fCBkZWZpbmVkKFdJTjY0KSB8fCBkZWZpbmVkKF9XSU42NCkgfHwgZGVmaW5lZChfX1dJTjY0X18pCisjCQlkZWZpbmUgX19BVk1fQk9PU1RfV0lOWFhfXworIwkJZGVmaW5lIF9fQVZNX0JPT1NUX1dJTkRPV1NfXworIwllbGlmIGRlZmluZWQoQ1lHV0lOKSB8fCBkZWZpbmVkKF9DWUdXSU4pIHx8IGRlZmluZWQoX0NZR1dJTl8pIHx8IGRlZmluZWQoX19DWUdXSU5fXykKKyMJCWRlZmluZSBfX0FWTV9CT09TVF9DWUdXSU5fXworIwkJZGVmaW5lIF9fQVZNX0JPT1NUX1dJTkRPV1NfXworIwllbHNlCisjCQlkZWZpbmUgX19BVk1fQk9PU1RfUE9TSVhfXworIwllbmRpZgorI2VuZGlmCisKKworc3RkOjpzdHJpbmcgQm9vc3RGYWN0b3J5OjpQTEFURk9STSA9IEJPT1NUX1BMQVRGT1JNOworCitib29sIEJvb3N0RmFjdG9yeTo6SVNfV0lOWFhfUExBVEZPUk0gPSAoCisJCShCb29zdEZhY3Rvcnk6OlBMQVRGT1JNID09ICJXaW4zMiIpIHx8CisJCShCb29zdEZhY3Rvcnk6OlBMQVRGT1JNID09ICJXaW42NCIpICk7CisKKworYm9vbCBCb29zdEZhY3Rvcnk6OklTX0NZR1dZTl9QTEFURk9STSAgPSAoQm9vc3RGYWN0b3J5OjpQTEFURk9STSA9PSAiQ3lnd2luIikgOworCisKK2Jvb2wgQm9vc3RGYWN0b3J5OjpJU19XSU5ET1dTX1BMQVRGT1JNID0gKAorCQlCb29zdEZhY3Rvcnk6OklTX1dJTlhYX1BMQVRGT1JNIHx8CisJCUJvb3N0RmFjdG9yeTo6SVNfQ1lHV1lOX1BMQVRGT1JNICk7CisKKworYm9vbCBCb29zdEZhY3Rvcnk6OklTX1BPU0lYX1BMQVRGT1JNID0gKG5vdCBCb29zdEZhY3Rvcnk6OklTX1dJTkRPV1NfUExBVEZPUk0pOworCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3V0aWwvQm9vc3RGYWN0b3J5LmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy91dGlsL0Jvb3N0RmFjdG9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiY2FiZDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy91dGlsL0Jvb3N0RmFjdG9yeS5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiA4IGp1aWwuIDIwMDkKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBVVElMX0JPT1NURkFDVE9SWV9IXworI2RlZmluZSBVVElMX0JPT1NURkFDVE9SWV9IXworCisjaW5jbHVkZSA8c3RyaW5nPgorCisjIGlmIGRlZmluZWQoQk9PU1RfRklMRVNZU1RFTV9WRVJTSU9OKSBcCisgICYmIEJPT1NUX0ZJTEVTWVNURU1fVkVSU0lPTiAhPSAyICAmJiBCT09TVF9GSUxFU1lTVEVNX1ZFUlNJT04gIT0gMworIyAgIGVycm9yIEJPT1NUX0ZJTEVTWVNURU1fVkVSU0lPTiBkZWZpbmVkLCBidXQgbm90IGFzIDIgb3IgMworIyBlbmRpZgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworY2xhc3MgQm9vc3RGYWN0b3J5Cit7CisKK3B1YmxpYzoKKwlzdGF0aWMgc3RkOjpzdHJpbmcgUExBVEZPUk07CisKKwlzdGF0aWMgYm9vbCBJU19XSU5YWF9QTEFURk9STTsKKwlzdGF0aWMgYm9vbCBJU19DWUdXWU5fUExBVEZPUk07CisJc3RhdGljIGJvb2wgSVNfV0lORE9XU19QTEFURk9STTsKKwlzdGF0aWMgYm9vbCBJU19QT1NJWF9QTEFURk9STTsKKworfTsKKworCit9CisKKyNlbmRpZiAvKiBVVElMX0JPT1NURkFDVE9SWV9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvdXRpbC9DTWFrZUxpc3RzLnR4dCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3V0aWwvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU5ZWNiNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3V0aWwvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxNiBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKyMgICAgICAgICAgICAgICAgICAgIENNYWtlIGZpbGUgZm9yIHRoZSBVVElMIGxpYnJhcnkNCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorDQorIyBDKysgc291cmNlIGZpbGVzIHRvIHRha2UgaW50byBhY2NvdW50IChhbGwgZmlsZXMgbWF0Y2hpbmcgcGF0dGVybnMpDQorZmlsZSAoR0xPQiBVVElMX0NYWF9TUkNfRklMRVMgKi5jcHAgKi5oKQ0KKw0KKyMgVGFyZ2V0IHRvIGJ1aWxkDQorYWRkX2xpYnJhcnkgKHV0aWwgU1RBVElDICR7VVRJTF9DWFhfU1JDX0ZJTEVTfSkNCisNCisjIEluY2x1ZGUgZGlyZWN0b3JpZXMgKGludGVybmFsKQ0KK3RhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzICh1dGlsIFBVQkxJQyAuLikgI8KgRklYTUUgOiBleHBsaWNpdCB0aGUgZGVwZW5kZW5jaWVzIGxpYiBieSBsaWINCisNCisjIFRhcmdldCBpbmNsdWRlIGRpcmVjdG9yaWVzIChleHRlcm5hbCkNCit0YXJnZXRfaW5jbHVkZV9kaXJlY3RvcmllcyAodXRpbCBQVUJMSUMgJHtHTVBfSU5DTFVERV9ESVJ9ICR7R01QWFhfSU5DTFVERV9ESVJ9KQ0KK3RhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzICh1dGlsIFBVQkxJQyAke0Jvb3N0X0lOQ0xVREVfRElSU30pDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvdXRpbC9FeGVjdXRpb25UaW1lLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3V0aWwvRXhlY3V0aW9uVGltZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVjM2Y0MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3V0aWwvRXhlY3V0aW9uVGltZS5jcHAKQEAgLTAsMCArMSwzOTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQk9EWV9hdm1fdG9vbF9FeGVjdXRpb25UaW1lIDEKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQk9EWSBPRiBUSEUgRXhlY3V0aW9uVGltZSBDTEFTUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJFeGVjdXRpb25UaW1lLmgiCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSA8dXRpbC9hdm1fc3RyaW5nLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8qKgorKiBFeGVjdXRpb25UaW1lOjpzdGFydF90aW1lCisqCisqLwordm9pZCBFeGVjdXRpb25UaW1lOjpzdGFydF90aW1lKCkKK3sKKyNpZmRlZiBfX0FWTV9VTklYX18KKwlnZXR0aW1lb2ZkYXkoJnN0YXJ0X3QsIE5VTEwpOworCWdldHJ1c2FnZSgwLCAmc3RhcnRfcik7CisJY2xvY2soKTsKKyNlbmRpZiAvKiBfX0FWTV9VTklYX18gKi8KKworCXRfZGVwYXJ0ID0gZ2V0Q2xvY2soKTsKKworCXRfc3RhcnQgPSBzdGQ6OnRpbWUoTlVMTCk7CisKKy8vISEhIEJPT1NUIFRPRE8KKy8vCXRpbWVfc3RhcnQgPSBib29zdDo6cG9zaXhfdGltZTo6bWljcm9zZWNfY2xvY2s6OmxvY2FsX3RpbWUoKTsKK30KKworLyoqCisqIEV4ZWN1dGlvblRpbWU6OmZpbmlzaF90aW1lCisqCisqLwordm9pZCBFeGVjdXRpb25UaW1lOjpmaW5pc2hfdGltZSgpCit7CisjaWZkZWYgX19BVk1fVU5JWF9fCisJZ2V0dGltZW9mZGF5KCZmaW5pc2hfdCwgTlVMTCk7CisJZ2V0cnVzYWdlKDAsICZmaW5pc2hfcik7CisJZmluaXNoX2Nsb2NrID0gY2xvY2soKTsKKyNlbmRpZiAvKiBfX0FWTV9VTklYX18gKi8KKworCisJdF9lbmQgPSBzdGQ6OnRpbWUoTlVMTCk7CisKKwl0X2ZpbiA9IGdldENsb2NrKCk7CisKKy8vISEhIEJPT1NUIFRPRE8KKy8vCXRpbWVfZW5kID1ib29zdDo6cG9zaXhfdGltZTo6bWljcm9zZWNfY2xvY2s6OmxvY2FsX3RpbWUoKTsKK30KKworLyoqCisqIEV4ZWN1dGlvblRpbWU6OmdldF90aW1lX3VzYWdlCisqCisqLwordm9pZCBFeGVjdXRpb25UaW1lOjpnZXRfdGltZV91c2FnZShpbnQgKiBydHAsIGludCAqIHV0cCwgaW50ICogc3RwKQoreworI2lmZGVmIF9fQVZNX1VOSVhfXworI2RlZmluZSBURElGRihmLCBzKSBcCisJCSgoKGYpLnR2X3NlYyAtIChzKS50dl9zZWMpICogMTAwMCArIFwKKwkJCQkoKGYpLnR2X3VzZWMgLSAocykudHZfdXNlYyArIDUwMCkgLyAxMDAwKQorCisJKnJ0cCA9IFRESUZGKGZpbmlzaF90LCBzdGFydF90KTsKKwkqdXRwID0gVERJRkYoZmluaXNoX3IucnVfdXRpbWUsIHN0YXJ0X3IucnVfdXRpbWUpOworCSpzdHAgPSBURElGRihmaW5pc2hfci5ydV9zdGltZSwgc3RhcnRfci5ydV9zdGltZSk7CisjZW5kaWYgLyogX19BVk1fVU5JWF9fICovCit9CisKKy8qKgorKiBFeGVjdXRpb25UaW1lOjpmb3JtYXRfdGltZV9taWxsaQorKgorKi8KK3N0ZDo6c3RyaW5nIEV4ZWN1dGlvblRpbWU6OmZvcm1hdF90aW1lX21pbGxpKGF2bV91aXRpbWVfdCBtaWxsaVNlY29uZGVzKQoreworCXN0ZDo6b3N0cmluZ3N0cmVhbSBvc1RpbWU7CisKKwlhdm1fdWl0aW1lX3QgcyAgPSBtaWxsaVNlY29uZGVzIC8gMTAwMDsKKwlhdm1fdWl0aW1lX3QgbW4gPSBzICAvIDYwOworCWF2bV91aXRpbWVfdCBoICA9IG1uIC8gNjA7CisKKwlhdm1fdWl0aW1lX3QgbXMgPSBtaWxsaVNlY29uZGVzICUgMTAwMDsKKwlzICA9IHMgICUgNjA7CisJbW4gPSBtbiAlIDYwOworCisJaWYgKGggIT0gMCkKKwl7CisJCW9zVGltZSA8PCBoIDw8ICJoIjsKKwl9CisJaWYgKG1uICE9IDApCisJeworCQlvc1RpbWUgPDwgbW4gPDwgIm0iOworCX0KKwlpZiAocyAhPSAwKQorCXsKKwkJb3NUaW1lIDw8IHMgPDwgInMiOworCX0KKwlpZiggKG1zICE9IDApIHx8IChtaWxsaVNlY29uZGVzID09IDApICkKKwl7CisJCW9zVGltZSA8PCBtcyA8PCAibXMiOworCX0KKworCXJldHVybiggb3NUaW1lLnN0cigpICk7Cit9CisKKy8qKgorKiBFeGVjdXRpb25UaW1lOjpmb3JtYXRfdGltZV9taWNybworKgorKi8KK3N0ZDo6c3RyaW5nIEV4ZWN1dGlvblRpbWU6OmZvcm1hdF90aW1lX21pY3JvKGF2bV91aXRpbWVfdCBtaWNyb1NlY29uZGVzKQoreworCXN0ZDo6b3N0cmluZ3N0cmVhbSBvc1RpbWU7CisKKwlhdm1fdWl0aW1lX3QgbXMgID0gbWljcm9TZWNvbmRlcyAvIDEwMDA7CisJYXZtX3VpdGltZV90IHMgICA9IG1zIC8gMTAwMDsKKwlhdm1fdWl0aW1lX3QgbW4gID0gIHMgLyA2MDsKKwlhdm1fdWl0aW1lX3QgaCAgID0gbW4gLyA2MDsKKworCWF2bV91aXRpbWVfdCB1cyA9IG1pY3JvU2Vjb25kZXMgJSAxMDAwOworCW1zID0gbXMgJSAxMDAwOworCXMgID0gcyAgJSA2MDsKKwltbiA9IG1uICUgNjA7CisKKworCWlmIChoICE9IDApCisJeworCQlvc1RpbWUgPDwgaCA8PCAiaCI7CisJfQorCWlmIChtbiAhPSAwKQorCXsKKwkJb3NUaW1lIDw8IG1uIDw8ICJtIjsKKwl9CisJaWYgKHMgIT0gMCkKKwl7CisJCW9zVGltZSA8PCBzIDw8ICJzIjsKKwl9CisKKwlpZiggbXMgIT0gMCApCisJeworCQlvc1RpbWUgPDwgbXMgPDwgIm1zIjsKKwl9CisJaWYoICh1cykgfHwgKG1pY3JvU2Vjb25kZXMgPT0gMCkgKQorCXsKKwkJb3NUaW1lIDw8IHVzIDw8ICLCtXMiOworCX0KKworCXJldHVybiggb3NUaW1lLnN0cigpICk7Cit9CisKKy8qKgorKiBFeGVjdXRpb25UaW1lOjpmb3JtYXRfdGltZV9uYW5vCisqCisqLworc3RkOjpzdHJpbmcgRXhlY3V0aW9uVGltZTo6Zm9ybWF0X3RpbWVfbmFubyhhdm1fdWl0aW1lX3QgbmFub1NlY29uZGVzKQoreworCXN0ZDo6b3N0cmluZ3N0cmVhbSBvc1RpbWU7CisKKwlhdm1fdWl0aW1lX3QgdXMgPSBuYW5vU2Vjb25kZXMgLyAxMDAwOworCWF2bV91aXRpbWVfdCBtcyAgPSB1cyAvIDEwMDA7CisJYXZtX3VpdGltZV90IHMgICA9IG1zIC8gMTAwMDsKKwlhdm1fdWl0aW1lX3QgbW4gID0gIHMgLyA2MDsKKwlhdm1fdWl0aW1lX3QgaCAgID0gbW4gLyA2MDsKKworCWF2bV91aXRpbWVfdCBucyA9IG5hbm9TZWNvbmRlcyAlIDEwMDA7CisJdXMgPSB1cyAlIDEwMDA7CisJbXMgPSBtcyAlIDEwMDA7CisJcyAgPSBzICAlIDYwOworCW1uID0gbW4gJSA2MDsKKworCWlmIChoICE9IDApCisJeworCQlvc1RpbWUgPDwgaCA8PCAiaCI7CisJfQorCWlmIChtbiAhPSAwKQorCXsKKwkJb3NUaW1lIDw8IG1uIDw8ICJtIjsKKwl9CisJaWYgKHMgIT0gMCkKKwl7CisJCW9zVGltZSA8PCBzIDw8ICJzIjsKKwl9CisKKwlpZiggbXMgIT0gMCApCisJeworCQlvc1RpbWUgPDwgbXMgPDwgIm1zIjsKKwl9CisJaWYoIHVzICE9IDAgKQorCXsKKwkJb3NUaW1lIDw8IHVzIDw8ICJ1cyI7CisJfQorCWlmKCAobnMgIT0gMCkgfHwgKG5hbm9TZWNvbmRlcyA9PSAwKSApCisJeworCQlvc1RpbWUgPDwgbnMgPDwgIm5zIjsKKwl9CisKKwlyZXR1cm4oIG9zVGltZS5zdHIoKSApOworfQorCisvKioKKyogRXhlY3V0aW9uVGltZTo6cHJpbnRfdGltZV9zdGF0CisqCisqLworc3RkOjpzdHJpbmcgIEV4ZWN1dGlvblRpbWU6OnRpbWVfc3RhdCgpCit7CisJc3RkOjpvc3RyaW5nc3RyZWFtIG9zVGltZTsKKworI2lmZGVmIF9fQVZNX1VOSVhfXworCWludCBydGltZSwgdXRpbWUsIHN0aW1lOworCisJZ2V0X3RpbWVfdXNhZ2UoJnJ0aW1lLCAmdXRpbWUsICZzdGltZSk7CisKKwkvLyBhIGNhdXNlIGRlOiB0eXBlZGVmIHNpZ25lZCBsb25nIGNsb2NrX3QKKwlpZiAoKHV0aW1lICsgc3RpbWUpID4gMjAwMDAwMC8qMjE0NzAwMCovKQorCXsKKwkJZmluaXNoX2Nsb2NrID0gdXRpbWUgKyBzdGltZTsKKwl9CisJZWxzZQorCXsKKwkJZmluaXNoX2Nsb2NrID0gZmluaXNoX2Nsb2NrIC8gMTAwMDsKKwl9CisKKwlvc1RpbWUgPDwgIihyZWFsVGltZSAiIDw8IGZvcm1hdF90aW1lX21pbGxpKHJ0aW1lKTsKKwlvc1RpbWUgPDwgIiBjcHVUaW1lICIgPDwgZm9ybWF0X3RpbWVfbWlsbGkoZmluaXNoX2Nsb2NrKTsKKwlvc1RpbWUgPDwgIiB1c2VyVGltZSAiIDw8IGZvcm1hdF90aW1lX21pbGxpKHV0aW1lKTsKKwlvc1RpbWUgPDwgIiBzeXN0ZW1UaW1lICIgPDwgZm9ybWF0X3RpbWVfbWlsbGkoc3RpbWUpIDw8ICIpIjsKKworLy8Jb3NUaW1lIDw8ICIocmVhbFRpbWUgIiA8PCBydGltZSA8PCAiIGNwdVRpbWUgIiA8PCAoZmluaXNoX2Nsb2NrIC8gMTAwMCkKKy8vCQkJPDwgIiB1c2VyVGltZSAiIDw8IHV0aW1lIDw8ICIgc3lzdGVtVGltZSAiIDw8IHN0aW1lIDw8ICIiKSI7CisjZW5kaWYgLyogX19BVk1fVU5JWF9fICovCisKKworCWF2bV9mdGltZV90IHRfZHVyZWUgPSAoYXZtX2Z0aW1lX3QpKHRfZmluIC0gdF9kZXBhcnQpOworLy8Jb3NUaW1lIDw8ICIgPT4gIiA8PCBPU19GTE9BVF9QUkVDSVNJT04gPDwgdF9kdXJlZTsKKy8vCW9zVGltZSA8PCAiIC0tPiAiIDw8IGZvcm1hdF90aW1lX21pY3JvKCAoYXZtX3VpdGltZV90KSggdF9kdXJlZSAqIDEwMDAwMDAgKSApOworCW9zVGltZSA8PCAiIC0tPiAiIDw8IGZvcm1hdF90aW1lX25hbm8oIChhdm1fdWl0aW1lX3QpKCB0X2R1cmVlICogMTAwMDAwMDAwMCApICk7CisKKy8vPz8Jb3NUaW1lIDw8ICIgPT0+ICIgPDwgc3RkOjpkaWZmdGltZSh0X2VuZCwgdF9zdGFydCkgPDwgInMiOworCisKKy8vISEhIEJPT1NUIFRPRE8KKy8vCWJvb3N0Ojpwb3NpeF90aW1lOjp0aW1lX2R1cmF0aW9uIGR1cmF0aW9uKHRpbWVfZW5kIC0gdGltZV9zdGFydCk7CisKKy8vCW9zVGltZSA8PCAiID0+ICIgPDwgZHVyYXRpb247CisvLwlvc1RpbWUgPDwgIiAtLT4gIiA8PCBmb3JtYXRfdGltZV9taWNybyggZHVyYXRpb24udG90YWxfbWljcm9zZWNvbmRzKCkgKTsKKworLy8hISEgQk9PU1QgVE9ETworLy8Jb3NUaW1lIDw8ICIgLS0+ICIgPDwgZm9ybWF0X3RpbWVfbmFubyggZHVyYXRpb24udG90YWxfbmFub3NlY29uZHMoKSApOworCisJLy8gRGF0ZSAmIEhldXJlIENvdXJhbnRlCisJc3RkOjp0aW1lX3QgdDsKKwlzdGQ6OnRpbWUoJnQpOworCW9zVGltZSA8PCAiIEAgIiA8PCAoIHN0ZDo6Y3RpbWUoJnQpICk7CisKKwlyZXR1cm4oIG9zVGltZS5zdHIoKSApOworfQorCisKKworc3RkOjpzdHJpbmcgIEV4ZWN1dGlvblRpbWU6OmN1cnJlbnRfdGltZSgpCit7CisJLy8gRGF0ZSAmIEhldXJlIENvdXJhbnRlCisJdGltZV90IHQ7CisJdGltZSgmdCk7CisKKwlyZXR1cm4oIHNlcDo6dG9fc3RyaW5nKGN0aW1lKCZ0KSkgKTsKK30KKworCisKKy8qCisgKiBSZWN1cGVyYXRldXIgZGUgdGVtcHMgOgorICovCithdm1fZnRpbWVfdCBFeGVjdXRpb25UaW1lOjpnZXRDbG9jayAoIHZvaWQgKQoreworCWF2bV9mdGltZV90IGQgPSAwIDsKKworCisjaWZuZGVmIF9fbGludXgKKyNpZmRlZiBfV0lOMzIKKwlzdHJ1Y3QgdGltZXZhbCB0dmFsIDsKKwlzdHJ1Y3QgdGltZXpvbmUgKiB0ej0oc3RydWN0IHRpbWV6b25lICopTlVMTCA7CisKKwl0aW1lcmNsZWFyKCZ0dmFsKTsKKworCWlmICggZ2V0dGltZW9mZGF5KCZ0dmFsLCB0eikgKQorCXsKKyNpZmRlZiBWRVJCT1NFCisJCWZwcmludGYgKHN0ZGVyciwgIlxuQ0xPQ0sgRVJST1IgISEhXG4iKTsKKyNlbmRpZgorCX0KKwllbHNlCisJeworCQlkID0gKChhdm1fZnRpbWVfdCkodHZhbC50dl91c2VjKS8xMDAwMDAwLjApIDsKKwkJZCA9IChhdm1fZnRpbWVfdCkgdHZhbC50dl9zZWMgKyBkIDsKKwl9CisjZWxzZQorCXN0cnVjdCB0aW1lc3BlYyBjdXJfdGltZTsKKworCWlmIChjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmY3VyX3RpbWUpKQorCXsKKyNpZmRlZiBWRVJCT1NFCisJCWZwcmludGYgKHN0ZGVyciwgIlxuQ0xPQ0sgRVJST1IgISEhXG4iKTsKKyNlbmRpZgorCX0KKwllbHNlCisJeworCQlkID0gKChhdm1fZnRpbWVfdCkoY3VyX3RpbWUudHZfbnNlYykgLyAoYXZtX2Z0aW1lX3QpKENMT0NLU19QRVJfU0VDKSkgLyAxMDAwMDAwLjAgOworCQlkID0gKGF2bV9mdGltZV90KSBjdXJfdGltZS50dl9zZWMgKyBkIDsKKwl9CisjZW5kaWYKKyNlbHNlCisJc3RydWN0IHRpbWV2YWwgdHZhbCA7CisJc3RydWN0IHRpbWV6b25lICogdHo9KHN0cnVjdCB0aW1lem9uZSAqKU5VTEwgOworCisJdGltZXJjbGVhcigmdHZhbCk7CisKKwlpZiAoIGdldHRpbWVvZmRheSgmdHZhbCwgdHopICkKKwl7CisjaWZkZWYgVkVSQk9TRQorCQlmcHJpbnRmIChzdGRlcnIsICJcbkNMT0NLIEVSUk9SICEhIVxuIik7CisjZW5kaWYKKwl9CisJZWxzZQorCXsKKwkJZCA9ICgoYXZtX2Z0aW1lX3QpKHR2YWwudHZfdXNlYykvMTAwMDAwMC4wKSA7CisJCWQgPSAoYXZtX2Z0aW1lX3QpIHR2YWwudHZfc2VjICsgZCA7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gZCA7Cit9CisKKworLyoKKyAqIFByb2dyYW1tZSBkZSB0ZXN0OgorICovCisvL2ludCBtYWluKCB2b2lkICkKKy8veworLy8JaW50IGkgOworLy8JZG91YmxlICAgdF9kZXBhcnQsIHRfZmluLCB0IDsKKy8vCWRvdWJsZSAgIGR1cmVlX2VuX21pbGxpc2Vjb25kZXMgOyAvKiAxMDAwIHBvdXIgdW5lIHNlY29uZGUsIDM2MDAwMDAgcG91ciB1bmUgaGV1cmUgKi8KKy8vCisvLworLy8JLyogQ2FsY3VsIHRlbXBzIGRlIGRlcGFydCAqLworLy8JdF9kZXBhcnQgPSBHZXRDbG9jaygpIDsKKy8vCisvLwl0ID0gMC4wIDsKKy8vCisvLwlmb3IgKCBpID0gMCA7IGkgPCA1MDAwMDAwMDAgOyArK2kgKQorLy8JCXQgPSB0ICsgMS4wIDsKKy8vCisvLwl0X2ZpbiA9IEdldENsb2NrKCkgOworLy8KKy8vCWlmICggKHRfZGVwYXJ0KnRfZmluKSA8IDAuMCApCisvLwkJZnByaW50ZiAoIHN0ZGVyciwgIlxuIEFUVEVOVElPTiAhISEgVW5lIGVycmV1ciBzJ2VzdCBwcm9kdWl0ZVxuIik7CisvLwllbHNlCisvLwkJZnByaW50ZiAoIHN0ZGVyciwgIlxuIFRlbXBzIMOpY291bMOpICVnIHNlY29uZGVzIHBvdXIgdW5lIGJvdWNsZSA1MDAwMDAwMDAgOiBcbiIsKHRfZmluIC0gdF9kZXBhcnQpKTsKKy8vCisvLwl0X2RlcGFydCA9IHRfZmluIDsKKy8vCisvLwl0ID0gMC4wIDsKKy8vCisvLwlmb3IgKCBpID0gMCA7IGkgPCA1MDAwMDAwIDsgKytpICkKKy8vCQl0ID0gdCArIDEuMCA7CisvLworLy8JdF9maW49IEdldENsb2NrKCkgOworLy8KKy8vCWlmICggKHRfZGVwYXJ0KnRfZmluKSA8IDAuMCApCisvLwkJZnByaW50ZiAoIHN0ZGVyciwgIlxuIEFUVEVOVElPTiAhISEgVW5lIGVycmV1ciBzJ2VzdCBwcm9kdWl0ZVxuIik7CisvLwllbHNlCisvLwkJZnByaW50ZiAoIHN0ZGVyciwgIlxuIFRlbXBzIMOpY291bMOpICVnIHNlY29uZGVzIHBvdXIgdW5lIGJvdWNsZSA1MDAwMDAgOiBcbiIsKHRfZmluIC0gdF9kZXBhcnQpKTsKKy8vCisvLworLy8JcmV0dXJuIEVYSVRfU1VDQ0VTUyA7CisvL30KKworCit9CisKKy8qKipFTkQgT0YgVEhFIEV4ZWN1dGlvblRpbWUgQ0xBU1MgQk9EWSoqKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3V0aWwvRXhlY3V0aW9uVGltZS5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvdXRpbC9FeGVjdXRpb25UaW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE1NzEzYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3V0aWwvRXhlY3V0aW9uVGltZS5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgVVRJTF9FWEVDVVRJT05USU1FX0hfCisjZGVmaW5lIFVUSUxfRVhFQ1VUSU9OVElNRV9IXworCisjaW5jbHVkZSA8Y3RpbWU+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaWZkZWYgX19BVk1fVU5JWF9fCisKKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKworI2VuZGlmIC8qIF9fQVZNX1VOSVhfXyAqLworCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworLy8hISEgQk9PU1QgVE9ETworLy8jaW5jbHVkZSA8Ym9vc3QvZGF0ZV90aW1lL3Bvc2l4X3RpbWUvcG9zaXhfdGltZS5ocHA+CisKKyNpbmNsdWRlIDx1dGlsL2F2bV9udW1lcmljLmg+CisKK25hbWVzcGFjZSBzZXAKK3sKKworCitjbGFzcyBFeGVjdXRpb25UaW1lCit7CitwdWJsaWMgOgorCS8qKgorCSAqIENPTlNUUlVDVE9SCisJICogREVTVFJVQ1RPUgorCSAqLworCUV4ZWN1dGlvblRpbWUoYm9vbCBzdGFydEl0KQorCXsKKwkJaWYoIHN0YXJ0SXQgKQorCQl7CisJCQlzdGFydF90aW1lKCk7CisJCX0KKwl9CisKKwkvKk1FVEhPRFMqLworCXZvaWQgc3RhcnRfdGltZSgpOworCXZvaWQgZmluaXNoX3RpbWUoKTsKKwl2b2lkIGdldF90aW1lX3VzYWdlKGludCAqIHJ0cCwgaW50ICogdXRwLCBpbnQgKiBzdHApOworCisJc3RkOjpzdHJpbmcgZm9ybWF0X3RpbWVfbWlsbGkoYXZtX3VpdGltZV90IG1pbGxpU2Vjb25kZXMpOworCXN0ZDo6c3RyaW5nIGZvcm1hdF90aW1lX21pY3JvKGF2bV91aXRpbWVfdCBtaWNyb1NlY29uZGVzKTsKKwlzdGQ6OnN0cmluZyBmb3JtYXRfdGltZV9uYW5vKGF2bV91aXRpbWVfdCBuYW5vU2Vjb25kZXMpOworCisJc3RkOjpzdHJpbmcgdGltZV9zdGF0KCk7CisKKwlzdGF0aWMgc3RkOjpzdHJpbmcgY3VycmVudF90aW1lKCk7CisKKwlzdGF0aWMgYXZtX2Z0aW1lX3QgZ2V0Q2xvY2soKTsKKworCitwcm90ZWN0ZWQgOgorCisJLypBVFRSSUJVVEVTKi8KKworCisjaWZkZWYgX19BVk1fVU5JWF9fCisJc3RydWN0IHRpbWV2YWwgc3RhcnRfdDsKKwlzdHJ1Y3QgdGltZXZhbCBmaW5pc2hfdDsKKwlzdHJ1Y3QgcnVzYWdlIHN0YXJ0X3I7CisJc3RydWN0IHJ1c2FnZSBmaW5pc2hfcjsKKwljbG9ja190IGZpbmlzaF9jbG9jazsKKyNlbmRpZiAvKiBfX0FWTV9VTklYX18gKi8KKworCWF2bV9mdGltZV90IHRfZGVwYXJ0OworCWF2bV9mdGltZV90IHRfZmluOworCisJc3RkOjp0aW1lX3QgdF9zdGFydDsKKwlzdGQ6OnRpbWVfdCB0X2VuZDsKKworLy8hISEgQk9PU1QgVE9ETworLy8JYm9vc3Q6OnBvc2l4X3RpbWU6OnB0aW1lIHRpbWVfc3RhcnQ7CisvLwlib29zdDo6cG9zaXhfdGltZTo6cHRpbWUgdGltZV9lbmQ7Cit9OworCisKK30KKworCisjZW5kaWYgLypVVElMX0VYRUNVVElPTlRJTUVfSF8qLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvdXRpbC9SRUFETUUubWQgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy91dGlsL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzczODM2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvdXRpbC9SRUFETUUubWQKQEAgLTAsMCArMSwxMCBAQAorIyBFRk0tU1lNQkVYIDogVXRpbAorCisjIyBTb3VyY2UgY29kZSBzdHJ1Y3R1cmUKKworIyMjIEludGVyZmFjZXMKKworIyMjIENsYXNzZXMKKworIyMjIEZhY3RvcmllcworCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy91dGlsL2F2bV9hc3NlcnQuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvdXRpbC9hdm1fYXNzZXJ0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGFiNjIyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvdXRpbC9hdm1fYXNzZXJ0LmNwcApAQCAtMCwwICsxLDYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTcgZMOpYy4gMjAxMgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiYXZtX2Fzc2VydC5oIgorCisjaW5jbHVkZSA8dXRpbC9hdm1fZGVidWcuaD4KKyNpbmNsdWRlIDx1dGlsL2F2bV92ZnMuaD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKy8qKgorICoKKyAqLwordm9pZCBBdm1FeGl0RXhjZXB0aW9uOjpwcm9sb2d1ZSgpCit7CisJT1MgPDwgRU1QSEFTSVMoIG1EZXNjcmlwdGlvbiAsICc+JyAsIDgwICk7CisvLwkJT1MgPDwgVEFCIDw8ICI8IiA8PCBtRGVzY3JpcHRpb24gPDwgIj4gIjsKKworQVZNX0lGX0RFQlVHX0VOQUJMRURfQU5EKCBub3QgbVNvdXJjZVBhdGguZW1wdHkoKSApCisJT1MgPDwgVEFCIDw8ICJpbiAiIDw8IFZGUzo6d3JhcFBhdGgobVNvdXJjZVBhdGgsCisJCQk4MCAtIE9TLklOREVOVC50YWJTaXplKCkgLSA2IC0gKCAobUxpbmUgPiAwKSA/IDEyIDogMCApLCAiLi4uIik7CisJLy8gd2l0aCAxMCBmb3Igc2l6ZShUQUIgKyAiaW4gIiArICIuLi4iICsgIiwgbGluZTogIiArIG1MaW5lKQorCWlmKCBtTGluZSA+IDAgKQorCXsKKwkJT1MgPDwgIiwgbGluZTogIiA8PCBtTGluZTsKKwl9CisJT1MgPDwgc3RkOjplbmRsOworQVZNX0VORElGX0RFQlVHX0VOQUJMRUQKK30KKworLyoqCisgKiBFUlJPUiAmIFdBUk5JTkcKKyAqIENPVU5UCisgKi8KK3N0ZDo6c2l6ZV90IEFWTV9FUlJPUl9DT1VOVCAgID0gMDsKKworc3RkOjpzaXplX3QgQVZNX1dBUk5JTkdfQ09VTlQgPSAwOworCisKK0F2bUV4aXRFeGNlcHRpb24gQVZNX09TX1RIUk9XX0VYQ0VQVElPTihBVk1fRVhJVF9GQUlMRURfQ09ERSk7CisKK0F2bUV4aXRFeGNlcHRpb24gQVZNX09TX1RIUk9XX0FMRVJUKEFWTV9FWElUX0ZBSUxFRF9DT0RFKTsKKworCitBdm1FWElUX1NJR05BTCBUSFJPV19GQVRBTF9FUlJPUiggQVZNX0VYSVRfRkFUQUxfRVJST1JfQ09ERSApOworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvdXRpbC9hdm1fYXNzZXJ0LmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy91dGlsL2F2bV9hc3NlcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDFmZDIwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvdXRpbC9hdm1fYXNzZXJ0LmgKQEAgLTAsMCArMSwzMTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxNyBkw6ljLiAyMDEyCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQVZNX0FTU0VSVF9IXworI2RlZmluZSBBVk1fQVNTRVJUX0hfCisKKworI2luY2x1ZGUgPGV4Y2VwdGlvbj4KKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8cHJpbnRlci9PdXRTdHJlYW0uaD4KKyNpbmNsdWRlIDx1dGlsL2F2bV9zdHJpbmcuaD4KKyNpbmNsdWRlIDx1dGlsL2F2bV91dGlsLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisvKioKKyAqIEVYSVQgRVhDRVBUSU9OCisgKi8KK3N0cnVjdCBBdm1FeGl0RXhjZXB0aW9uIDogIHB1YmxpYyBzdGQ6OmV4Y2VwdGlvbgoreworCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlTdHJpbmdPdXRTdHJlYW0gT1M7CisKKwlBVk1fRVhJVF9DT0RFX0tJTkQgbUV4aXRDb2RlOworCisJc3RkOjpzdHJpbmcgbURlc2NyaXB0aW9uOworCisJLy8gZm9yIGRlYnVnCisJc3RkOjpzdHJpbmcgbVNvdXJjZVBhdGg7CisJbG9uZyBtTGluZTsKKworCS8qKgorCSAqIENPTlNUUlVDVE9SIC8gREVTVFJVQ1RPUgorCSAqLworCUF2bUV4aXRFeGNlcHRpb24oIEFWTV9FWElUX0NPREVfS0lORCBhbkV4aXRDb2RlLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhRGVzY3JpcHRpb24gPSAiIiwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVNvdXJjZVBhdGggPSAiIiwgbG9uZyBhTGluZSA9IC0xICkKKwk6IHN0ZDo6ZXhjZXB0aW9uKCApLAorCU9TKCBXcmFwRGF0YSggODAsIDAsIDQsICJcblx0IiApICwgQXZtSW5kZW50KCIiICwgIlx0IiwgIlxuIikgKSwKKwltRXhpdENvZGUoIGFuRXhpdENvZGUgKSwKKwltRGVzY3JpcHRpb24oIGFEZXNjcmlwdGlvbiApLAorCW1Tb3VyY2VQYXRoKCBhU291cmNlUGF0aCApLAorCW1MaW5lKCBhTGluZSApCisJeworCQlwcm9sb2d1ZSgpOworCX0KKworCUF2bUV4aXRFeGNlcHRpb24oIGNvbnN0IEF2bUV4aXRFeGNlcHRpb24gJiBhbkV4aXRFeGNlcHRpb24gKQorCTogc3RkOjpleGNlcHRpb24oICksCisJT1MoIFdyYXBEYXRhKCA4MCwgMCwgNCwgIlxuXHQiICkgLCBBdm1JbmRlbnQoIiIgLCAiXHQiLCAiXG4iKSApLAorCW1FeGl0Q29kZSggYW5FeGl0RXhjZXB0aW9uLm1FeGl0Q29kZSApLAorCW1EZXNjcmlwdGlvbiggYW5FeGl0RXhjZXB0aW9uLm1EZXNjcmlwdGlvbiApLAorCW1Tb3VyY2VQYXRoKCBhbkV4aXRFeGNlcHRpb24ubVNvdXJjZVBhdGggKSwKKwltTGluZSggYW5FeGl0RXhjZXB0aW9uLm1MaW5lICkKKwl7CisJCU9TIDw8IGFuRXhpdEV4Y2VwdGlvbi5PUy5zdHIoKTsKKwl9CisKKworCXZpcnR1YWwgfkF2bUV4aXRFeGNlcHRpb24oKSB0aHJvdygpCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKwkvKioKKwkgKiBBUEkKKwkgKi8KKwlpbmxpbmUgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgdGhyb3coKQorCXsKKwkJcmV0dXJuKCBtRGVzY3JpcHRpb24uY19zdHIoKSApOworCX0KKworCWlubGluZSB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGluZm8oKSBjb25zdCB0aHJvdygpCisJeworCQlyZXR1cm4oIE9TLnN0cigpICk7CisJfQorCisJdm9pZCBwcm9sb2d1ZSgpOworCisKKwkvKioKKwkgKiBvcGVyYXRvcjw8CisJICovCisJdGVtcGxhdGU8IGNsYXNzIFQgPgorCWlubGluZSBBdm1FeGl0RXhjZXB0aW9uICYgb3BlcmF0b3I8PCggY29uc3QgVCAmIHggKQorCXsKKwkJT1MgPDwgeDsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisKKwlpbmxpbmUgQXZtRXhpdEV4Y2VwdGlvbiAmIG9wZXJhdG9yPDwoQXZtRVhJVF9TSUdOQUwgZXhpdF9zaWduYWwpCisJeworCQltRXhpdENvZGUgPSBleGl0X3NpZ25hbC5jb2RlOworCisJCXRocm93KCAqdGhpcyApOworCisJCXJldHVybiggKnRoaXMgKTsKKwl9CisKKwlpbmxpbmUgQXZtRXhpdEV4Y2VwdGlvbiAmIG9wZXJhdG9yPDwoCisJCQl2b2lkICgqb3ApICggQXZtRXhpdEV4Y2VwdGlvbiAmIG9zICkgKQorCXsKKwkJb3AoICp0aGlzICk7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworCisJaW5saW5lIEF2bUV4aXRFeGNlcHRpb24gJiBvcGVyYXRvcjw8KAorCQkJdm9pZCAoKm9wKSAoIE91dFN0cmVhbSAmIG9zICkgKQorCXsKKwkJT1Mub3BlcmF0b3I8PCggb3AgKTsKKworCQlyZXR1cm4oICp0aGlzICk7CisJfQorCisJaW5saW5lIEF2bUV4aXRFeGNlcHRpb24gJiBvcGVyYXRvcjw8KAorCQkJc3RkOjpvc3RyZWFtICYgKCpvcCkgKCBzdGQ6Om9zdHJlYW0gJiApICkKKwl7CisJCU9TLm9wZXJhdG9yPDwoIG9wICk7CisKKwkJcmV0dXJuKCAqdGhpcyApOworCX0KKworfTsKKworCitleHRlcm4gQXZtRXhpdEV4Y2VwdGlvbiBBVk1fT1NfVEhST1dfRVhDRVBUSU9OOworCisKK2lubGluZSBBdm1FeGl0RXhjZXB0aW9uICYgb3NBc3NlcnQoCisJCUFWTV9FWElUX0NPREVfS0lORCBhbkV4aXRDb2RlLAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFEZXNjcmlwdGlvbiwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhU291cmNlUGF0aCwgbG9uZyBhTGluZSApCit7CisJQVZNX09TX1RIUk9XX0VYQ0VQVElPTi5PUy5zdHIoIiIpOworCUFWTV9PU19USFJPV19FWENFUFRJT04ubUV4aXRDb2RlID0gYW5FeGl0Q29kZTsKKwlBVk1fT1NfVEhST1dfRVhDRVBUSU9OLm1EZXNjcmlwdGlvbiA9IGFEZXNjcmlwdGlvbjsKKwlBVk1fT1NfVEhST1dfRVhDRVBUSU9OLm1Tb3VyY2VQYXRoID0gYVNvdXJjZVBhdGg7CisJQVZNX09TX1RIUk9XX0VYQ0VQVElPTi5tTGluZSA9IGFMaW5lOworCisJQVZNX09TX1RIUk9XX0VYQ0VQVElPTi5wcm9sb2d1ZSgpOworCisJcmV0dXJuKCBBVk1fT1NfVEhST1dfRVhDRVBUSU9OICk7Cit9CisKKworZXh0ZXJuIEF2bUV4aXRFeGNlcHRpb24gQVZNX09TX1RIUk9XX0FMRVJUOworCitpbmxpbmUgQXZtRXhpdEV4Y2VwdGlvbiAmIG9zQWxlcnQoCisJCUFWTV9FWElUX0NPREVfS0lORCBhbkV4aXRDb2RlLAorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFEZXNjcmlwdGlvbiwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhU291cmNlUGF0aCwgbG9uZyBhTGluZSApCit7CisJQVZNX09TX1RIUk9XX0FMRVJULk9TLnN0cigiIik7CisJQVZNX09TX1RIUk9XX0FMRVJULm1FeGl0Q29kZSA9IGFuRXhpdENvZGU7CisJQVZNX09TX1RIUk9XX0FMRVJULm1EZXNjcmlwdGlvbiA9IGFEZXNjcmlwdGlvbjsKKwlBVk1fT1NfVEhST1dfQUxFUlQubVNvdXJjZVBhdGggPSBhU291cmNlUGF0aDsKKwlBVk1fT1NfVEhST1dfQUxFUlQubUxpbmUgPSBhTGluZTsKKworCUFWTV9PU19USFJPV19BTEVSVC5wcm9sb2d1ZSgpOworCisJcmV0dXJuKCBBVk1fT1NfVEhST1dfQUxFUlQgKTsKK30KKworCitpbmxpbmUgdm9pZCBTRU5EX0VYSVQoQXZtRXhpdEV4Y2VwdGlvbiAmIGFlZSkKK3sKK0FWTV9JRl9ERUJVR19FTkFCTEVECisKKwlBVk1fT1NfV0FSTiA8PCBzdGQ6OmVuZGwgPDwgYWVlLmluZm8oKSA8PCBzdGQ6OmVuZGwKKwkJCTw8IFJFUEVBVCggJzwnICwgODAgKSA8PCBzdGQ6OmVuZGwgPDwgc3RkOjpmbHVzaDsKKworQVZNX0RFQlVHX0VMU0UKKworCUFWTV9PU19DRVJSIDw8IHN0ZDo6ZW5kbCA8PCBhZWUuaW5mbygpIDw8IHN0ZDo6ZW5kbAorCQkJPDwgUkVQRUFUKCAnPCcgLCA4MCApIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmZsdXNoOworCitBVk1fRU5ESUZfREVCVUdfRU5BQkxFRAorCisJdGhyb3coIGFlZSApOworfQorCitpbmxpbmUgdm9pZCBTRU5EX0FMRVJUKEF2bUV4aXRFeGNlcHRpb24gJiBhZWUpCit7CitBVk1fSUZfREVCVUdfRU5BQkxFRAorCisJQVZNX09TX1dBUk4gPDwgc3RkOjplbmRsIDw8IGFlZS5pbmZvKCkgPDwgc3RkOjplbmRsCisJCQk8PCBSRVBFQVQoICc8JyAsIDgwICkgPDwgc3RkOjplbmRsIDw8IHN0ZDo6Zmx1c2g7CisKK0FWTV9ERUJVR19FTFNFCisKKwlBVk1fT1NfQ0VSUiA8PCBzdGQ6OmVuZGwgPDwgYWVlLmluZm8oKSA8PCBzdGQ6OmVuZGwKKwkJCTw8IFJFUEVBVCggJzwnICwgODAgKSA8PCBzdGQ6OmVuZGwgPDwgc3RkOjpmbHVzaDsKKworQVZNX0VORElGX0RFQlVHX0VOQUJMRUQKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCisvKioKKyAqIEFWTSBPU1RSRUFNIEVYSVQKKyAqLworI2RlZmluZSBBVk1fT1NfRVhJVCggS0lORCApICBcCisJb3NBc3NlcnQoIEFWTV9FWElUXyMjS0lORCMjX0NPREUsIFFVT1RFTUUoS0lORCksIF9fRklMRV9fLCBfX0xJTkVfXyApCisKKyNkZWZpbmUgQVZNX09TX0ZBVEFMX0VSUk9SX0VYSVQgIEFWTV9PU19FWElUKCBGQVRBTF9FUlJPUiApCisKKworLyoqCisgKiBBVk0gT1NUUkVBTSBBU1NFUlQgRVhJVAorICovCisjZGVmaW5lIEFWTV9PU19BU1NFUlRfRVhJVCggS0lORCAsIGFzc2VydF9jb25kICkgICBcCisJaWYoIG5vdCAoYXNzZXJ0X2NvbmQpICkgIFwKKwkJb3NBc3NlcnQoIEFWTV9FWElUXyMjS0lORCMjX0NPREUsIFFVT1RFTUUoS0lORCksIF9fRklMRV9fLCBfX0xJTkVfXyApCisKKworI2RlZmluZSBBVk1fT1NfQVNTRVJUX09VVF9PRl9NRU1PUllfRVhJVCggYVB0ciApICAgXAorCUFWTV9PU19BU1NFUlRfRVhJVCggT1VUX09GX01FTU9SWSAsICgoYVB0cikgIT0gTlVMTCkgKQorCisKKyNkZWZpbmUgQVZNX09TX0FTU0VSVF9GQVRBTF9FUlJPUl9FWElUKCBhc3NlcnRfY29uZCApICBcCisJQVZNX09TX0FTU0VSVF9FWElUKCBGQVRBTF9FUlJPUiAsIGFzc2VydF9jb25kICkKKworCisjZGVmaW5lIEFWTV9PU19BU1NFUlRfRkFUQUxfQVJSQVlfSU5ERVhfRVhJVCggaW5kZXggLCBhU2l6ZSApICAgICAgXAorCUFWTV9PU19BU1NFUlRfRVhJVCggRkFUQUxfRVJST1IgLCAoKGFTaXplID4gaW5kZXgpICYmIChpbmRleCA+PSAwKSkgKSBcCisJCQk8PCAiIGluZGV4OiIgPDwgaW5kZXggPDwgIiBpcyBub3QgaW4gWyAwICwgIiA8PCBhU2l6ZSAgXAorCQkJPDwgIiBbIDogVW5ib3VuZCBhcnJheSBpbmRleCAhISEiCisKKworI2RlZmluZSBBVk1fT1NfQVNTRVJUX0ZBVEFMX0FSUkFZX09GRlNFVF9FWElUKCBvZmZzZXQgLCBhU2l6ZSApICBcCisJQVZNX09TX0FTU0VSVF9FWElUKCBGQVRBTF9FUlJPUiAsICgoYVNpemUgPiBvZmZzZXQpICYmIChvZmZzZXQgPj0gMCkpICkgXAorCQkJPDwgIiBvZmZzZXQ6IiA8PCBvZmZzZXQgPDwgIiBpcyBub3QgaW4gWyAwLCAiIDw8IGFTaXplIDw8ICIgWyA6ICIKKworI2RlZmluZSBBVk1fT1NfQVNTRVJUX0ZBVEFMX05VTExfUE9JTlRFUl9FWElUKCBhUHRyICkgICAgIFwKKwlBVk1fT1NfQVNTRVJUX0VYSVQoIEZBVEFMX0VSUk9SICwgKChhUHRyKSAhPSBOVUxMKSApICBcCisJCQk8PCAiVW5leHBlY3RlZCBhIDxudWxsPiAiCisKKyNkZWZpbmUgQVZNX09TX0FTU0VSVF9GQVRBTF9OVUxMX1NNQVJUX1BPSU5URVJfRVhJVCggYVB0ciApICBcCisJQVZNX09TX0FTU0VSVF9FWElUKCBGQVRBTF9FUlJPUiAsIGFQdHIudmFsaWQoKSApICAgICAgICAgXAorCQkJPDwgIlVuZXhwZWN0ZWQgYSA8bnVsbD4gIgorCisjZGVmaW5lIEFWTV9PU19BU1NFUlRfRkFUQUxfRU1QVFlfQ09MTEVDVElPTl9FWElUKCBhUHRyICkgIFwKKwlBVk1fT1NfQVNTRVJUX0VYSVQoIEZBVEFMX0VSUk9SICwgYVB0ci5ub25lbXB0eSgpICkgICAgXAorCQkJPDwgIlVuZXhwZWN0ZWQgYW4gZW1wdHkgIgorCisKKy8qKgorICogQVZNIE9TVFJFQU0gQUxFUlQKKyAqLworI2RlZmluZSBBVk1fT1NfQUxFUlQoIERFU0MgKSAgXAorCW9zQWxlcnQoIEFWTV9FWElUX0dPT0RfQ09ERSwgREVTQywgX19GSUxFX18sIF9fTElORV9fICkKKworCisjZGVmaW5lIEFWTV9PU19FUlJPUl9BTEVSVCAgICAgIEFWTV9PU19BTEVSVCggIkVSUk9SIiAgICkKKworI2RlZmluZSBBVk1fT1NfV0FSTklOR19BTEVSVCAgICBBVk1fT1NfQUxFUlQoICJXQVJOSU5HIiApCisKKyNkZWZpbmUgQVZNX09TX1RPRE9fQUxFUlQgICAgICAgQVZNX09TX0FMRVJUKCAiVE9ETyIgICAgKQorCisKKy8qKgorICogQVZNIE9TVFJFQU0gQVNTRVJUIEFMRVJUCisgKi8KKyNkZWZpbmUgQVZNX09TX0FTU0VSVF9BTEVSVCggREVTQyAsIGFzc2VydF9jb25kICkgICBcCisJaWYoIG5vdCAoYXNzZXJ0X2NvbmQpICkgIFwKKwkJb3NBbGVydCggQVZNX0VYSVRfR09PRF9DT0RFLCBERVNDLCBfX0ZJTEVfXywgX19MSU5FX18gKQorCisjZGVmaW5lIEFWTV9PU19BU1NFUlRfRVJST1JfQUxFUlQoIGFzc2VydF9jb25kICkgICAgXAorCUFWTV9PU19BU1NFUlRfQUxFUlQoICJFUlJPUiIgLCBhc3NlcnRfY29uZCApCisKKyNkZWZpbmUgQVZNX09TX0FTU0VSVF9XQVJOSU5HX0FMRVJUKCBhc3NlcnRfY29uZCApICBcCisJQVZNX09TX0FTU0VSVF9BTEVSVCggIldBUk5JTkciICwgYXNzZXJ0X2NvbmQgKQorCisKKy8qKgorICogQVZNX0VSUk9SX0NPVU5UCisgKiBBVk1fV0FSTklOR19DT1VOVAorICovCitleHRlcm4gc3RkOjpzaXplX3QgQVZNX0VSUk9SX0NPVU5UOworCitleHRlcm4gc3RkOjpzaXplX3QgQVZNX1dBUk5JTkdfQ09VTlQ7CisKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisjZW5kaWYgLyogQVZNX0FTU0VSVF9IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvdXRpbC9hdm1fZGVidWcuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvdXRpbC9hdm1fZGVidWcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NzRiNDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy91dGlsL2F2bV9kZWJ1Zy5jcHAKQEAgLTAsMCArMSw1MzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULg0KKyAqDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENyZWF0ZWQgb246IDExIGbDqXZyLiAyMDA5DQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnINCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSAiYXZtX2RlYnVnLmgiDQorDQorI2luY2x1ZGUgPHV0aWwvYXZtX3N0cmluZy5oPg0KKw0KKw0KK25hbWVzcGFjZSBzZXAgew0KKw0KKw0KKy8qKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBBVk0gREVCVUcgTEVWRUwNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICovDQordW5zaWduZWQgc2hvcnQgIF9BVk1fREVCVUdfTEVWRUxfID0gQVZNX0RFQlVHX1pFUk9fTEVWRUw7DQorDQorDQorLyoqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIEFWTSBERUJVRyBLSU5EDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqLw0KK3N0ZDo6c2l6ZV90ICBfQVZNX0RFQlVHX0ZMQUdfID0gQVZNX0RFQlVHX05PVEhJTkdfRkxBRzsNCisNCisNCisNCisvKioNCisgKiBhdm1fc2V0RGVidWdMZXZlbA0KKyAqIGF2bV91bnNldERlYnVnTGV2ZWwNCisgKi8NCit2b2lkIGF2bV9zZXREZWJ1Z0xldmVsKHN0ZDo6c3RyaW5nIHN0ckRlYnVnTGV2ZWwpDQorew0KKyNkZWZpbmUgU0VUX0RFQlVHX0xFVkVMKCBsZXZlbCApICAgXA0KKwllbHNlIGlmKCBzdHJEZWJ1Z0xldmVsID09ICNsZXZlbCApICBBVk1fREVCVUdfU0VUX0xFVkVMKCBsZXZlbCApDQorDQorCVN0cmluZ1Rvb2xzOjp0b3VwcGVyKHN0ckRlYnVnTGV2ZWwpOw0KKw0KKwlpZiggc3RyRGVidWdMZXZlbC5lbXB0eSgpICkgIEFWTV9ERUJVR19TRVRfTEVWRUwoIFpFUk8gKQ0KKw0KKwlTRVRfREVCVUdfTEVWRUwoIFpFUk8gICAgICkNCisNCisJU0VUX0RFQlVHX0xFVkVMKCBMT1cgICAgICApDQorCVNFVF9ERUJVR19MRVZFTCggTUVESVVNICAgKQ0KKw0KKwlTRVRfREVCVUdfTEVWRUwoIEhJR0ggICAgICkNCisJU0VUX0RFQlVHX0xFVkVMKCBVTFRSQSAgICApDQorDQorCVNFVF9ERUJVR19MRVZFTCggR09EX01PREUgKQ0KKw0KKwllbHNlIEFWTV9ERUJVR19TRVRfTEVWRUwoIFpFUk8gKQ0KK30NCisNCisNCit2b2lkIGF2bV91bnNldERlYnVnTGV2ZWwoc3RkOjpzdHJpbmcgc3RyRGVidWdMZXZlbCkNCit7DQorI2RlZmluZSBVTlNFVF9ERUJVR19FWENFUFRfTEVWRUwoIGxldmVsICkgICBcDQorCWVsc2UgaWYoIHN0ckRlYnVnTGV2ZWwgPT0gI2xldmVsICkgIEFWTV9ERUJVR19TRVRfTEVWRUwoIFpFUk8gKQ0KKw0KKyNkZWZpbmUgVU5TRVRfREVCVUdfTEVWRUwoIGxldmVsICkgICBcDQorCWVsc2UgaWYoIHN0ckRlYnVnTGV2ZWwgPT0gI2xldmVsICkgIEFWTV9ERUJVR19VTlNFVF9MRVZFTCggbGV2ZWwgKQ0KKw0KKwlTdHJpbmdUb29sczo6dG91cHBlcihzdHJEZWJ1Z0xldmVsKTsNCisNCisJaWYoIHN0ckRlYnVnTGV2ZWwuZW1wdHkoKSApICBBVk1fREVCVUdfU0VUX0xFVkVMKCBaRVJPICkNCisNCisJVU5TRVRfREVCVUdfTEVWRUwoIExPVyAgICApDQorCVVOU0VUX0RFQlVHX0xFVkVMKCBNRURJVU0gKQ0KKw0KKwlVTlNFVF9ERUJVR19MRVZFTCggSElHSCAgICkNCisJVU5TRVRfREVCVUdfTEVWRUwoIFVMVFJBICApDQorDQorCVVOU0VUX0RFQlVHX0VYQ0VQVF9MRVZFTCggWkVSTyAgICAgKQ0KKwlVTlNFVF9ERUJVR19FWENFUFRfTEVWRUwoIEdPRF9NT0RFICkNCisNCisJZWxzZSBBVk1fREVCVUdfU0VUX0xFVkVMKCBaRVJPICkNCit9DQorDQorc3RkOjpzdHJpbmcgYXZtX3N0ckRlYnVnTGV2ZWwoKQ0KK3sNCisjZGVmaW5lIFBSSU5UX0RFQlVHX0xFVkVMKCBsZXZlbCApICAgXA0KKwljYXNlIEFWTV9ERUJVR18jI2xldmVsIyNfTEVWRUwgOiAgcmV0dXJuKCAjbGV2ZWwgKTsNCisNCisJc3dpdGNoKCBfQVZNX0RFQlVHX0xFVkVMXyApDQorCXsNCisJCVBSSU5UX0RFQlVHX0xFVkVMKCBaRVJPICAgICApDQorDQorCQlQUklOVF9ERUJVR19MRVZFTCggTE9XICAgICAgKQ0KKwkJUFJJTlRfREVCVUdfTEVWRUwoIE1FRElVTSAgICkNCisNCisJCVBSSU5UX0RFQlVHX0xFVkVMKCBISUdIICAgICApDQorCQlQUklOVF9ERUJVR19MRVZFTCggVUxUUkEgICAgKQ0KKw0KKwkJUFJJTlRfREVCVUdfTEVWRUwoIEdPRF9NT0RFICkNCisNCisJCWRlZmF1bHQ6IHJldHVybiggIkRFQlVHI0xFVkVMPCBVTktOT1dOID4iICk7DQorCX0NCit9DQorDQorDQorLyoqDQorICogYXZtX3NldERlYnVnRmxhZw0KKyAqIGF2bV91bnNldERlYnVnRmxhZw0KKyAqLw0KK3ZvaWQgYXZtX3NldERlYnVnRmxhZyhzdGQ6OnN0cmluZyBzdHJEZWJ1Z0ZsYWcpDQorew0KKyNkZWZpbmUgU0VUX0RFQlVHX0ZMQUcoIGZsYWcgKSAgIFwNCisJCWVsc2UgaWYoIHN0ckRlYnVnRmxhZyA9PSAjZmxhZyAgKSAgQVZNX0RFQlVHX0VOQUJMRV9GTEFHKCBmbGFnICkNCisNCisNCisJaWYoIF9BVk1fREVCVUdfRkxBR18gPT0gQVZNX0RFQlVHX0FMTF9GTEFHICkNCisJew0KKwkJcmV0dXJuOw0KKwl9DQorCWVsc2UgaWYoIHN0ckRlYnVnRmxhZy5lbXB0eSgpIHx8IHN0ckRlYnVnRmxhZyA9PSAiTk9USElORyIgKSB7DQorCQlfQVZNX0RFQlVHX0ZMQUdfID0gQVZNX0RFQlVHX05PVEhJTkdfRkxBRzsNCisJfQ0KKw0KKwkvLyBHZW5lcmFsIENvbnRleHQNCisNCisJU0VUX0RFQlVHX0ZMQUcoIFBBUlNJTkcgICAgICAgICAgICAgICAgICkNCisNCisJU0VUX0RFQlVHX0ZMQUcoIENPTkZJR1VSSU5HICAgICAgICAgICAgICkNCisNCisJU0VUX0RFQlVHX0ZMQUcoIENPTVBJTElORyAgICAgICAgICAgICAgICkNCisNCisJU0VUX0RFQlVHX0ZMQUcoIExPQURJTkcgICAgICAgICAgICAgICAgICkNCisNCisJU0VUX0RFQlVHX0ZMQUcoIENPTVBVVElORyAgICAgICAgICAgICAgICkNCisNCisJU0VUX0RFQlVHX0ZMQUcoIFJFUE9SVElORyAgICAgICAgICAgICAgICkNCisNCisJU0VUX0RFQlVHX0ZMQUcoIFNPTFZJTkcgICAgICAgICAgICAgICAgICkNCisJU0VUX0RFQlVHX0ZMQUcoIFNBVF9TT0xWSU5HICAgICAgICAgICAgICkNCisJU0VUX0RFQlVHX0ZMQUcoIFNNVF9TT0xWSU5HICAgICAgICAgICAgICkNCisNCisJU0VUX0RFQlVHX0ZMQUcoIFBST0ZJTElORyAgICAgICAgICAgICAgICkNCisNCisNCisJLy8gUHJvY2VzcyBTdGFnZTogUHJvY2Vzc2luZywgRmlsdGVyaW5nLCAuLi4NCisNCisJU0VUX0RFQlVHX0ZMQUcoIEFMTF9QUk9DRVNTX1NUQUdFICAgICAgICkNCisJU0VUX0RFQlVHX0ZMQUcoIFBST0NFU1NPUiAgICAgICAgICAgICAgICkNCisNCisJU0VUX0RFQlVHX0ZMQUcoIFBST0NFU1NJTkcgICAgICAgICAgICAgICkNCisJU0VUX0RFQlVHX0ZMQUcoIFBSRV9QUk9DRVNTSU5HICAgICAgICAgICkNCisJU0VUX0RFQlVHX0ZMQUcoIFBPU1RfUFJPQ0VTU0lORyAgICAgICAgICkNCisNCisJU0VUX0RFQlVHX0ZMQUcoIEZJTFRFUklORyAgICAgICAgICAgICAgICkNCisJU0VUX0RFQlVHX0ZMQUcoIFBSRV9GSUxURVJJTkcgICAgICAgICAgICkNCisJU0VUX0RFQlVHX0ZMQUcoIFBPU1RfRklMVEVSSU5HICAgICAgICAgICkNCisNCisJU0VUX0RFQlVHX0ZMQUcoIFFVRVVFICAgICAgICAgICAgICAgICAgICkNCisJU0VUX0RFQlVHX0ZMQUcoIFFVRVVJTkcgICAgICAgICAgICAgICAgICkNCisNCisNCisJLy8gU3RhdGVtZW50IEV2YWx1YXRpb24NCisNCisJU0VUX0RFQlVHX0ZMQUcoIFBST0dSQU0gICAgICAgICAgICAgICAgICkNCisNCisJU0VUX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVCAgICAgICAgICAgICAgICkNCisNCisJU0VUX0RFQlVHX0ZMQUcoIEFTU0lHTk1FTlQgICAgICAgICAgICAgICkNCisJU0VUX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9BU1NJR05NRU5UICAgICkNCisNCisJU0VUX0RFQlVHX0ZMQUcoIENPTU1VTklDQVRJT04gICAgICAgICAgICkNCisJU0VUX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9DT01NVU5JQ0FUSU9OICkNCisNCisJU0VUX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9DT05UUk9MICAgICAgICkNCisJU0VUX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9TQ0hFRFVMSU5HICAgICkNCisNCisJU0VUX0RFQlVHX0ZMQUcoIFRFU1RfREVDSVNJT04gICAgICAgICAgICkNCisJU0VUX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9URVNUX0RFQ0lTSU9OICkNCisNCisJU0VUX0RFQlVHX0ZMQUcoIEJZVEVDT0RFICAgICAgICAgICAgICAgICkNCisNCisJU0VUX0RFQlVHX0ZMQUcoIERBVEEgICAgICAgICAgICAgICAgICAgICkNCisNCisJU0VUX0RFQlVHX0ZMQUcoIFRSQUNFICAgICAgICAgICAgICAgICAgICkNCisNCisNCisJLy8gRWxlbWVudDogUHJvcGVydHksIFNpZ25hbC4uLg0KKw0KKwlTRVRfREVCVUdfRkxBRyggVkFSSUFCTEUgICAgICAgICAgICAgICAgKQ0KKw0KKwlTRVRfREVCVUdfRkxBRyggQlVGRkVSICAgICAgICAgICAgICAgICAgKQ0KKw0KKwlTRVRfREVCVUdfRkxBRyggUE9SVCAgICAgICAgICAgICAgICAgICAgKQ0KKw0KKwlTRVRfREVCVUdfRkxBRyggU0lHTkFMICAgICAgICAgICAgICAgICAgKQ0KKw0KKwlTRVRfREVCVUdfRkxBRyggQ09OTkVYSU9OICAgICAgICAgICAgICAgKQ0KKw0KKwlTRVRfREVCVUdfRkxBRyggVElNRSAgICAgICAgICAgICAgICAgICAgKQ0KKw0KKw0KKwkvLyBFeGVjdXRhYmxlIENvbXBvbmVudC4uLg0KKw0KKwlTRVRfREVCVUdfRkxBRyggRVhFQ1VUQUJMRSAgICAgICAgICAgICAgKQ0KKw0KKwlTRVRfREVCVUdfRkxBRyggUFJJTUlUSVZFICAgICAgICAgICAgICAgKQ0KKw0KKwlTRVRfREVCVUdfRkxBRyggQUNUSVZJVFkgICAgICAgICAgICAgICAgKQ0KKw0KKwlTRVRfREVCVUdfRkxBRyggUk9VVElORSAgICAgICAgICAgICAgICAgKQ0KKw0KKwlTRVRfREVCVUdfRkxBRyggVFJBTlNJVElPTiAgICAgICAgICAgICAgKQ0KKw0KKwlTRVRfREVCVUdfRkxBRyggTUFDSElORSAgICAgICAgICAgICAgICAgKQ0KKw0KKwlTRVRfREVCVUdfRkxBRyggU1RBVEVNQUNISU5FICAgICAgICAgICAgKQ0KKw0KKw0KKwkvLyBPdGhlcnM6IFtRdWFsaWZpZWRdTmFtZUlELCBSZWZDb3VudCwgLi4uDQorDQorCVNFVF9ERUJVR19GTEFHKCBOQU1FX0lEICAgICAgICAgICAgICAgICApDQorDQorCVNFVF9ERUJVR19GTEFHKCBRVUFMSUZJRURfTkFNRV9JRCAgICAgICApDQorDQorCVNFVF9ERUJVR19GTEFHKCBGVUxMWV9RVUFMSUZJRURfTkFNRV9JRCApDQorDQorDQorCVNFVF9ERUJVR19GTEFHKCBDQVMgICAgICAgICAgICAgICAgICAgICApDQorDQorCVNFVF9ERUJVR19GTEFHKCBSRURVTkRBTkNFICAgICAgICAgICAgICApDQorDQorDQorCVNFVF9ERUJVR19GTEFHKCBSRUZFUkVOQ0VfQ09VTlRJTkcgICAgICApDQorDQorCS8vIEdvZCBNb2RlDQorCVNFVF9ERUJVR19GTEFHKCBBTEwgICAgICAgICAgICAgICAgICAgICApDQorCVNFVF9ERUJVR19GTEFHKCBHT0RfTU9ERSAgICAgICAgICAgICAgICApDQorfQ0KKw0KKw0KK3ZvaWQgYXZtX3Vuc2V0RGVidWdGbGFnKHN0ZDo6c3RyaW5nIHN0ckRlYnVnRmxhZykNCit7DQorI2RlZmluZSBVTlNFVF9ERUJVR19GTEFHKCBmbGFnICkgICBcDQorCQllbHNlIGlmKCBzdHJEZWJ1Z0ZsYWcgPT0gI2ZsYWcgKSAgQVZNX0RFQlVHX0RJU0FCTEVfRkxBRyggZmxhZyApDQorDQorDQorCWlmKCBfQVZNX0RFQlVHX0ZMQUdfID09IEFWTV9ERUJVR19OT1RISU5HX0ZMQUcgKQ0KKwl7DQorCQlyZXR1cm47DQorCX0NCisJZWxzZSBpZiggc3RyRGVidWdGbGFnLmVtcHR5KCkNCisJCXx8IHN0ckRlYnVnRmxhZyA9PSAiTk9USElORyIgKSB7DQorCQlfQVZNX0RFQlVHX0ZMQUdfID0gQVZNX0RFQlVHX05PVEhJTkdfRkxBRzsNCisNCisJCXJldHVybjsNCisJfQ0KKw0KKwkvLyBHZW5lcmFsIENvbnRleHQNCisNCisJVU5TRVRfREVCVUdfRkxBRyggUEFSU0lORyAgICAgICAgICAgICAgICAgKQ0KKw0KKwlVTlNFVF9ERUJVR19GTEFHKCBDT05GSUdVUklORyAgICAgICAgICAgICApDQorDQorCVVOU0VUX0RFQlVHX0ZMQUcoIENPTVBJTElORyAgICAgICAgICAgICAgICkNCisNCisJVU5TRVRfREVCVUdfRkxBRyggTE9BRElORyAgICAgICAgICAgICAgICAgKQ0KKw0KKwlVTlNFVF9ERUJVR19GTEFHKCBDT01QVVRJTkcgICAgICAgICAgICAgICApDQorDQorCVVOU0VUX0RFQlVHX0ZMQUcoIFJFUE9SVElORyAgICAgICAgICAgICAgICkNCisNCisJVU5TRVRfREVCVUdfRkxBRyggU09MVklORyAgICAgICAgICAgICAgICAgKQ0KKwlVTlNFVF9ERUJVR19GTEFHKCBTQVRfU09MVklORyAgICAgICAgICAgICApDQorCVVOU0VUX0RFQlVHX0ZMQUcoIFNNVF9TT0xWSU5HICAgICAgICAgICAgICkNCisNCisJVU5TRVRfREVCVUdfRkxBRyggUFJPRklMSU5HICAgICAgICAgICAgICAgKQ0KKw0KKw0KKwkvLyBQcm9jZXNzIFN0YWdlOiBQcm9jZXNzaW5nLCBGaWx0ZXJpbmcsIC4uLg0KKw0KKwlVTlNFVF9ERUJVR19GTEFHKCBBTExfUFJPQ0VTU19TVEFHRSAgICAgICApDQorCVVOU0VUX0RFQlVHX0ZMQUcoIFBST0NFU1NPUiAgICAgICAgICAgICAgICkNCisNCisJVU5TRVRfREVCVUdfRkxBRyggUFJPQ0VTU0lORyAgICAgICAgICAgICAgKQ0KKwlVTlNFVF9ERUJVR19GTEFHKCBQUkVfUFJPQ0VTU0lORyAgICAgICAgICApDQorCVVOU0VUX0RFQlVHX0ZMQUcoIFBPU1RfUFJPQ0VTU0lORyAgICAgICAgICkNCisNCisJVU5TRVRfREVCVUdfRkxBRyggRklMVEVSSU5HICAgICAgICAgICAgICAgKQ0KKwlVTlNFVF9ERUJVR19GTEFHKCBQUkVfRklMVEVSSU5HICAgICAgICAgICApDQorCVVOU0VUX0RFQlVHX0ZMQUcoIFBPU1RfRklMVEVSSU5HICAgICAgICAgICkNCisNCisJVU5TRVRfREVCVUdfRkxBRyggUVVFVUUgICAgICAgICAgICAgICAgICAgKQ0KKwlVTlNFVF9ERUJVR19GTEFHKCBRVUVVSU5HICAgICAgICAgICAgICAgICApDQorDQorDQorCS8vIFN0YXRlbWVudCBFdmFsdWF0aW9uDQorDQorCVVOU0VUX0RFQlVHX0ZMQUcoIFBST0dSQU0gICAgICAgICAgICAgICAgICkNCisNCisJVU5TRVRfREVCVUdfRkxBRyggU1RBVEVNRU5UICAgICAgICAgICAgICAgKQ0KKw0KKwlVTlNFVF9ERUJVR19GTEFHKCBBU1NJR05NRU5UICAgICAgICAgICAgICApDQorCVVOU0VUX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9BU1NJR05NRU5UICAgICkNCisNCisJVU5TRVRfREVCVUdfRkxBRyggQ09NTVVOSUNBVElPTiAgICAgICAgICAgKQ0KKwlVTlNFVF9ERUJVR19GTEFHKCBTVEFURU1FTlRfQ09NTVVOSUNBVElPTiApDQorDQorCVVOU0VUX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9DT05UUk9MICAgICAgICkNCisJVU5TRVRfREVCVUdfRkxBRyggU1RBVEVNRU5UX1NDSEVEVUxJTkcgICAgKQ0KKw0KKwlVTlNFVF9ERUJVR19GTEFHKCBURVNUX0RFQ0lTSU9OICAgICAgICAgICApDQorCVVOU0VUX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9URVNUX0RFQ0lTSU9OICkNCisNCisJVU5TRVRfREVCVUdfRkxBRyggQllURUNPREUgICAgICAgICAgICAgICAgKQ0KKw0KKwlVTlNFVF9ERUJVR19GTEFHKCBEQVRBICAgICAgICAgICAgICAgICAgICApDQorDQorCVVOU0VUX0RFQlVHX0ZMQUcoIFRSQUNFICAgICAgICAgICAgICAgICAgICkNCisNCisNCisJLy8gRWxlbWVudDogUHJvcGVydHksIFNpZ25hbC4uLg0KKw0KKwlVTlNFVF9ERUJVR19GTEFHKCBWQVJJQUJMRSAgICAgICAgICAgICAgICApDQorDQorCVVOU0VUX0RFQlVHX0ZMQUcoIEJVRkZFUiAgICAgICAgICAgICAgICAgICkNCisNCisJVU5TRVRfREVCVUdfRkxBRyggUE9SVCAgICAgICAgICAgICAgICAgICAgKQ0KKw0KKwlVTlNFVF9ERUJVR19GTEFHKCBTSUdOQUwgICAgICAgICAgICAgICAgICApDQorDQorCVVOU0VUX0RFQlVHX0ZMQUcoIENPTk5FWElPTiAgICAgICAgICAgICAgICkNCisNCisJVU5TRVRfREVCVUdfRkxBRyggVElNRSAgICAgICAgICAgICAgICAgICAgKQ0KKw0KKw0KKwkvLyBFeGVjdXRhYmxlIENvbXBvbmVudC4uLg0KKw0KKwlVTlNFVF9ERUJVR19GTEFHKCBFWEVDVVRBQkxFICAgICAgICAgICAgICApDQorDQorCVVOU0VUX0RFQlVHX0ZMQUcoIFBSSU1JVElWRSAgICAgICAgICAgICAgICkNCisNCisJVU5TRVRfREVCVUdfRkxBRyggQUNUSVZJVFkgICAgICAgICAgICAgICAgKQ0KKw0KKwlVTlNFVF9ERUJVR19GTEFHKCBST1VUSU5FICAgICAgICAgICAgICAgICApDQorDQorCVVOU0VUX0RFQlVHX0ZMQUcoIFRSQU5TSVRJT04gICAgICAgICAgICAgICkNCisNCisJVU5TRVRfREVCVUdfRkxBRyggTUFDSElORSAgICAgICAgICAgICAgICAgKQ0KKw0KKwlVTlNFVF9ERUJVR19GTEFHKCBTVEFURU1BQ0hJTkUgICAgICAgICAgICApDQorDQorDQorCS8vIE90aGVyczogW1F1YWxpZmllZF1OYW1lSUQsIFJlZkNvdW50LCAuLi4NCisNCisJVU5TRVRfREVCVUdfRkxBRyggTkFNRV9JRCAgICAgICAgICAgICAgICAgKQ0KKw0KKwlVTlNFVF9ERUJVR19GTEFHKCBRVUFMSUZJRURfTkFNRV9JRCAgICAgICApDQorDQorCVVOU0VUX0RFQlVHX0ZMQUcoIEZVTExZX1FVQUxJRklFRF9OQU1FX0lEICkNCisNCisNCisJVU5TRVRfREVCVUdfRkxBRyggQ0FTICAgICAgICAgICAgICAgICAgICAgKQ0KKw0KKwlVTlNFVF9ERUJVR19GTEFHKCBSRURVTkRBTkNFICAgICAgICAgICAgICApDQorDQorDQorCVVOU0VUX0RFQlVHX0ZMQUcoIFJFRkVSRU5DRV9DT1VOVElORyAgICAgICkNCisNCisJLy8gR29kIE1vZGUNCisJVU5TRVRfREVCVUdfRkxBRyggQUxMICAgICAgICAgICAgICAgICAgICAgKQ0KKwlVTlNFVF9ERUJVR19GTEFHKCBHT0RfTU9ERSAgICAgICAgICAgICAgICApDQorfQ0KKw0KKw0KK3N0ZDo6c3RyaW5nIGF2bV9zdHJEZWJ1Z0ZsYWcoY29uc3Qgc3RkOjpzdHJpbmcgJiBzZXApDQorew0KKwlpZiggX0FWTV9ERUJVR19GTEFHXyA9PSBBVk1fREVCVUdfTk9USElOR19GTEFHICkNCisJew0KKwkJcmV0dXJuKCAiTk9USElORyIgKTsNCisJfQ0KKwlpZiggX0FWTV9ERUJVR19GTEFHXyA9PSBBVk1fREVCVUdfR09EX01PREVfRkxBRyApDQorCXsNCisJCXJldHVybiggIkdPRF9NT0RFIiApOw0KKwl9DQorCWlmKCBfQVZNX0RFQlVHX0ZMQUdfID09IEFWTV9ERUJVR19BTExfRkxBRyApDQorCXsNCisJCXJldHVybiggIkFMTCIgKTsNCisJfQ0KKwllbHNlDQorCXsNCisJCXN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7DQorCQlib29sIG5lZWRTZXAgPSBmYWxzZTsNCisNCisjZGVmaW5lIFNUUl9ERUJVR19GTEFHKCBmbGFnICkgIFwNCisJCWlmKCBBVk1fREVCVUdfRkxBR19FTkFCTEVEKCBmbGFnICkgKSAgXA0KKwkJeyBvc3MgPDwgKG5lZWRTZXAgPyBzZXAgOiAiIikgPDwgI2ZsYWc7IG5lZWRTZXAgPSB0cnVlOyB9DQorDQorI2RlZmluZSBTVFJfREVCVUdfR1JPVVAoIGZsYWcgKSAgIFwNCisJCWlmKCBBVk1fREVCVUdfRkxBR19HUk9VUF9FTkFCTEVEKCBmbGFnICkgKSAgXA0KKwkJeyBvc3MgPDwgKG5lZWRTZXAgPyBzZXAgOiAiIikgPDwgI2ZsYWc7IG5lZWRTZXAgPSB0cnVlOyB9DQorDQorCQkvLyBHZW5lcmFsIENvbnRleHQNCisNCisJCVNUUl9ERUJVR19GTEFHKCBQQVJTSU5HICAgICAgICAgICAgICAgICApDQorDQorCQlTVFJfREVCVUdfRkxBRyggQ09ORklHVVJJTkcgICAgICAgICAgICAgKQ0KKw0KKwkJU1RSX0RFQlVHX0ZMQUcoIENPTVBJTElORyAgICAgICAgICAgICAgICkNCisNCisJCVNUUl9ERUJVR19GTEFHKCBMT0FESU5HICAgICAgICAgICAgICAgICApDQorDQorCQlTVFJfREVCVUdfRkxBRyggQ09NUFVUSU5HICAgICAgICAgICAgICAgKQ0KKw0KKwkJU1RSX0RFQlVHX0ZMQUcoIFJFUE9SVElORyAgICAgICAgICAgICAgICkNCisNCisJCVNUUl9ERUJVR19GTEFHKCBTT0xWSU5HICAgICAgICAgICAgICAgICApDQorLy8JCVNUUl9ERUJVR19GTEFHKCBTQVRfU09MVklORyAgICAgICAgICAgICApDQorLy8JCVNUUl9ERUJVR19GTEFHKCBTTVRfU09MVklORyAgICAgICAgICAgICApDQorDQorCQlTVFJfREVCVUdfRkxBRyggUFJPRklMSU5HICAgICAgICAgICAgICAgKQ0KKw0KKw0KKwkJLy8gUHJvY2VzcyBTdGFnZTogUHJvY2Vzc2luZywgRmlsdGVyaW5nLCAuLi4gLi4uDQorDQorCQlTVFJfREVCVUdfRkxBRyggQUxMX1BST0NFU1NfU1RBR0UgICAgICAgKQ0KKw0KKwkJU1RSX0RFQlVHX0ZMQUcoIFFVRVVFICAgICAgICAgICAgICAgICAgICkNCisJCVNUUl9ERUJVR19GTEFHKCBRVUVVSU5HICAgICAgICAgICAgICAgICApDQorDQorDQorCQkvLyBTdGF0ZW1lbnQgRXZhbHVhdGlvbg0KKw0KKwkJU1RSX0RFQlVHX0ZMQUcoIFBST0dSQU0gICAgICAgICAgICAgICAgICkNCisNCisJCVNUUl9ERUJVR19GTEFHKCBTVEFURU1FTlQgICAgICAgICAgICAgICApDQorDQorCQlTVFJfREVCVUdfRkxBRyggQVNTSUdOTUVOVCAgICAgICAgICAgICAgKQ0KKy8vCQlTVFJfREVCVUdfRkxBRyggU1RBVEVNRU5UX0FTU0lHTk1FTlQgICAgKQ0KKw0KKwkJU1RSX0RFQlVHX0ZMQUcoIENPTU1VTklDQVRJT04gICAgICAgICAgICkNCisvLwkJU1RSX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9DT01NVU5JQ0FUSU9OICkNCisNCisJCVNUUl9ERUJVR19GTEFHKCBTVEFURU1FTlRfQ09OVFJPTCAgICAgICApDQorCQlTVFJfREVCVUdfRkxBRyggU1RBVEVNRU5UX1NDSEVEVUxJTkcgICAgKQ0KKw0KKwkJU1RSX0RFQlVHX0ZMQUcoIFRFU1RfREVDSVNJT04gICAgICAgICAgICkNCisvLwkJU1RSX0RFQlVHX0ZMQUcoIFNUQVRFTUVOVF9URVNUX0RFQ0lTSU9OICkNCisNCisJCVNUUl9ERUJVR19GTEFHKCBCWVRFQ09ERSAgICAgICAgICAgICAgICApDQorDQorCQlTVFJfREVCVUdfRkxBRyggREFUQSAgICAgICAgICAgICAgICAgICAgKQ0KKw0KKwkJU1RSX0RFQlVHX0ZMQUcoIFRSQUNFICAgICAgICAgICAgICAgICAgICkNCisNCisNCisJCS8vIEVsZW1lbnQ6IFByb3BlcnR5LCBTaWduYWwuLi4NCisNCisJCVNUUl9ERUJVR19GTEFHKCBWQVJJQUJMRSAgICAgICAgICAgICAgICApDQorDQorCQlTVFJfREVCVUdfRkxBRyggQlVGRkVSICAgICAgICAgICAgICAgICAgKQ0KKw0KKwkJU1RSX0RFQlVHX0ZMQUcoIFBPUlQgICAgICAgICAgICAgICAgICAgICkNCisNCisJCVNUUl9ERUJVR19GTEFHKCBTSUdOQUwgICAgICAgICAgICAgICAgICApDQorDQorCQlTVFJfREVCVUdfRkxBRyggQ09OTkVYSU9OICAgICAgICAgICAgICAgKQ0KKw0KKwkJU1RSX0RFQlVHX0ZMQUcoIFRJTUUgICAgICAgICAgICAgICAgICAgICkNCisNCisNCisJCS8vIEV4ZWN1dGFibGUgQ29tcG9uZW50Li4uDQorDQorCQlTVFJfREVCVUdfRkxBRyggRVhFQ1VUQUJMRSAgICAgICAgICAgICAgKQ0KKw0KKwkJU1RSX0RFQlVHX0ZMQUcoIFBSSU1JVElWRSAgICAgICAgICAgICAgICkNCisNCisJCVNUUl9ERUJVR19GTEFHKCBBQ1RJVklUWSAgICAgICAgICAgICAgICApDQorDQorCQlTVFJfREVCVUdfRkxBRyggUk9VVElORSAgICAgICAgICAgICAgICAgKQ0KKw0KKwkJU1RSX0RFQlVHX0ZMQUcoIFRSQU5TSVRJT04gICAgICAgICAgICAgICkNCisNCisJCVNUUl9ERUJVR19GTEFHKCBNQUNISU5FICAgICAgICAgICAgICAgICApDQorDQorCQlTVFJfREVCVUdfRkxBRyggU1RBVEVNQUNISU5FICAgICAgICAgICAgKQ0KKw0KKw0KKwkJLy8gT3RoZXJzOiBbUXVhbGlmaWVkXU5hbWVJRCwgUmVmQ291bnQsIC4uLg0KKw0KKwkJU1RSX0RFQlVHX0ZMQUcoIE5BTUVfSUQgICAgICAgICAgICAgICAgICkNCisNCisJCVNUUl9ERUJVR19GTEFHKCBRVUFMSUZJRURfTkFNRV9JRCAgICAgICApDQorDQorCQlTVFJfREVCVUdfRkxBRyggRlVMTFlfUVVBTElGSUVEX05BTUVfSUQgKQ0KKw0KKw0KKwkJU1RSX0RFQlVHX0ZMQUcoIENBUyAgICAgICAgICAgICAgICAgICAgICkNCisNCisJCVNUUl9ERUJVR19GTEFHKCBSRURVTkRBTkNFICAgICAgICAgICAgICApDQorDQorDQorCQlTVFJfREVCVUdfRkxBRyggUkVGRVJFTkNFX0NPVU5USU5HICAgICAgKQ0KKw0KKw0KKwkJLy8gLi4uIFByb2Nlc3MgU3RhZ2U6IFByb2Nlc3NpbmcsIEZpbHRlcmluZywgLi4uDQorCQllbHNlDQorCQl7DQorCQkJU1RSX0RFQlVHX0dST1VQKCBQUk9DRVNTSU5HICAgICAgICAgKQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCVNUUl9ERUJVR19GTEFHKCBQUkVfUFJPQ0VTU0lORyAgKQ0KKw0KKwkJCQlTVFJfREVCVUdfRkxBRyggUE9TVF9QUk9DRVNTSU5HICkNCisJCQl9DQorDQorCQkJU1RSX0RFQlVHX0dST1VQKCBGSUxURVJJTkcgICAgICAgICAgKQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCVNUUl9ERUJVR19GTEFHKCBQUkVfRklMVEVSSU5HICAgKQ0KKw0KKwkJCQlTVFJfREVCVUdfRkxBRyggUE9TVF9GSUxURVJJTkcgICkNCisJCQl9DQorCQl9DQorDQorCQlyZXR1cm4oIG9zcy5zdHIoKSApOw0KKwl9DQorfQ0KKw0KKw0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy91dGlsL2F2bV9kZWJ1Zy5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvdXRpbC9hdm1fZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmFkNWUwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvdXRpbC9hdm1fZGVidWcuaApAQCAtMCwwICsxLDg2MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuDQorICoNCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ3JlYXRlZCBvbjogMTEgZsOpdnIuIDIwMDkNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcg0KKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpZm5kZWYgQVZNX0RFQlVHX0hfDQorI2RlZmluZSBBVk1fREVCVUdfSF8NCisNCisNCisjaW5jbHVkZSA8c3RyaW5nPg0KKw0KKw0KK25hbWVzcGFjZSBzZXAgew0KKw0KKw0KKyNkZWZpbmUgIEFWTV9DT01QSUxFX0RFQlVHX0VOQUJMRUQNCisvLyN1bmRlZiBBVk1fQ09NUElMRV9ERUJVR19FTkFCTEVEDQorDQorDQorI2lmIGRlZmluZWQoIEFWTV9DT01QSUxFX0RFQlVHX0VOQUJMRUQgKQ0KKw0KKw0KKyNkZWZpbmUgQVZNX0RFQlVHX0lGKCBjb25kaXRpb24gKSAgICAgICAgICAgIGlmKCBjb25kaXRpb24gKSB7DQorDQorI2RlZmluZSBBVk1fREVCVUdfRUxTRSAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisNCisjZGVmaW5lIEFWTV9ERUJVR19FTFNFX0lGKCBjb25kaXRpb24gKSAgICAgICB9IGVsc2UgaWYoIGNvbmRpdGlvbiApIHsNCisNCisjZGVmaW5lIEFWTV9ERUJVR19FTkRJRiAgICAgICAgICAgICAgICAgICAgICB9IDsNCisvLyA8PCA7ID4+IHByZXZlbnQgPDwgZWxzZSA+PiB3aXRob3V0IGV4cGxpY2l0IDw8IGlmID4+DQorDQorI2Vsc2UNCisNCisNCisjZGVmaW5lIEFWTV9ERUJVR19JRiggY29uZGl0aW9uICkgICAgICAgICAgICBpZiggZmFsc2UgKSB7DQorLy8jZGVmaW5lIEFWTV9ERUJVR19JRiggY29uZGl0aW9uICkgICAgICAgICAgI2lmKCBjb25kaXRpb24gKQ0KKw0KKyNkZWZpbmUgQVZNX0RFQlVHX0VMU0UgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorLy8jZGVmaW5lIEFWTV9ERUJVR19FTFNFICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKCBmYWxzZSApIHsNCisvLyNkZWZpbmUgQVZNX0RFQlVHX0VMU0UgICAgICAgICAgICAgICAgICAgICAjZWxzZQ0KKw0KKyNkZWZpbmUgQVZNX0RFQlVHX0VMU0VfSUYoIGNvbmRpdGlvbiApICAgICAgIH0gZWxzZSBpZiggZmFsc2UgKSB7DQorLy8jZGVmaW5lIEFWTV9ERUJVR19FTFNFX0lGKCBjb25kaXRpb24gKSAgICAgI2VsaWYoIGNvbmRpdGlvbiApDQorDQorI2RlZmluZSBBVk1fREVCVUdfRU5ESUYgICAgICAgICAgICAgICAgICAgICAgfSA7DQorLy8jZGVmaW5lIEFWTV9ERUJVR19FTkRJRiAgICAgICAgICAgICAgICAgICAgI2VuZGlmDQorDQorDQorI2VuZGlmDQorDQorDQorI2RlZmluZSBBVk1fSUYoIGNvbmRpdGlvbiApICAgICAgICAgICAgaWYoIGNvbmRpdGlvbiApIHsNCisjZGVmaW5lIEFWTV9FTFNFX0lGKCBjb25kaXRpb24gKSAgICAgICB9IGVsc2UgaWYoIGNvbmRpdGlvbiApIHsNCisjZGVmaW5lIEFWTV9FTFNFICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyNkZWZpbmUgQVZNX0VORElGICAgICAgICAgICAgICAgICAgICAgIH0gOw0KKw0KKw0KKy8qKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQVZNIERFQlVHIExFVkVMDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKi8NCisNCitleHRlcm4gdW5zaWduZWQgc2hvcnQgIF9BVk1fREVCVUdfTEVWRUxfOw0KKw0KK2VudW0gQVZNX0RFQlVHX0xFVkVMX1QNCit7DQorCUFWTV9ERUJVR19aRVJPX0xFVkVMICAgICAgICAgID0gMHgwMCwNCisNCisJQVZNX0RFQlVHX0xPV19TVFJJQ1RfTEVWRUwgICAgPSAweDAxLA0KKwlBVk1fREVCVUdfTE9XX0xFVkVMICAgICAgICAgICA9IEFWTV9ERUJVR19MT1dfU1RSSUNUX0xFVkVMLA0KKw0KKwlBVk1fREVCVUdfTUVESVVNX1NUUklDVF9MRVZFTCA9IDB4MDIsDQorCUFWTV9ERUJVR19NRURJVU1fTEVWRUwgICAgICAgID0gQVZNX0RFQlVHX01FRElVTV9TVFJJQ1RfTEVWRUwNCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBVk1fREVCVUdfTE9XX0xFVkVMLA0KKw0KKwlBVk1fREVCVUdfSElHSF9TVFJJQ1RfTEVWRUwgICA9IDB4MDQsDQorCUFWTV9ERUJVR19ISUdIX0xFVkVMICAgICAgICAgID0gQVZNX0RFQlVHX0hJR0hfU1RSSUNUX0xFVkVMDQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQVZNX0RFQlVHX01FRElVTV9MRVZFTCwNCisNCisJQVZNX0RFQlVHX1VMVFJBX1NUUklDVF9MRVZFTCAgPSAweDA4LA0KKwlBVk1fREVCVUdfVUxUUkFfTEVWRUwgICAgICAgICA9IEFWTV9ERUJVR19VTFRSQV9TVFJJQ1RfTEVWRUwNCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBVk1fREVCVUdfSElHSF9MRVZFTCwNCisNCisJQVZNX0RFQlVHX0dPRF9NT0RFX0xFVkVMICAgICAgPSAweEZGDQorfTsNCisNCisNCisvKioNCisgKiBERUJVRyBMRVZFTCBTRVQNCisgKiBERUJVRyBMRVZFTCBURVNUDQorICovDQorI2RlZmluZSBBVk1fREVCVUdfU0VUX1NUUklDVF9MRVZFTCggbGV2ZWwgKSAgXA0KKwl7IF9BVk1fREVCVUdfTEVWRUxfID0gQVZNX0RFQlVHXyMjbGV2ZWwjI19TVFJJQ1RfTEVWRUw7IH0NCisNCisjZGVmaW5lIEFWTV9ERUJVR19TRVRfTEVWRUwoIGxldmVsICkgIFwNCisJeyBfQVZNX0RFQlVHX0xFVkVMXyA9IEFWTV9ERUJVR18jI2xldmVsIyNfTEVWRUw7IH0NCisNCisjZGVmaW5lIEFWTV9ERUJVR19VTlNFVF9MRVZFTCggbGV2ZWwgKSAgXA0KKwl7IF9BVk1fREVCVUdfTEVWRUxfICY9ICh+IEFWTV9ERUJVR18jI2xldmVsIyNfU1RSSUNUX0xFVkVMKTsgfQ0KKw0KKyNkZWZpbmUgQVZNX0RFQlVHX0lTX0xFVkVMKCBsZXZlbCApICBcDQorCSggX0FWTV9ERUJVR19MRVZFTF8gPT0gQVZNX0RFQlVHXyMjbGV2ZWwjI19MRVZFTCApDQorDQorI2RlZmluZSBBVk1fREVCVUdfSEFTX0xFVkVMKCBsZXZlbCApICBcDQorCSggKF9BVk1fREVCVUdfTEVWRUxfICYgQVZNX0RFQlVHXyMjbGV2ZWwjI19MRVZFTCkgIT0gMCApDQorDQorDQorLyoqDQorICogREVCVUcgTEVWRUwgPA0KKyAqIERFQlVHIExFVkVMIDw9DQorICovDQorI2RlZmluZSBBVk1fREVCVUdfTEVWRUxfTFQoIGxldmVsICkgIFwNCisJKCBfQVZNX0RFQlVHX0xFVkVMXyA8ICBBVk1fREVCVUdfIyNsZXZlbCMjX0xFVkVMICkNCisNCisjZGVmaW5lIEFWTV9ERUJVR19MRVZFTF9MVEUoIGxldmVsICkgIFwNCisJKCBfQVZNX0RFQlVHX0xFVkVMXyA8PSBBVk1fREVCVUdfIyNsZXZlbCMjX0xFVkVMICkNCisNCisNCisvKioNCisgKiBERUJVRyBMRVZFTCA+DQorICogREVCVUcgTEVWRUwgPj0NCisgKi8NCisjZGVmaW5lIEFWTV9ERUJVR19MRVZFTF9HVCggbGV2ZWwgKSAgXA0KKwkoIF9BVk1fREVCVUdfTEVWRUxfID4gIEFWTV9ERUJVR18jI2xldmVsIyNfTEVWRUwgKQ0KKw0KKyNkZWZpbmUgQVZNX0RFQlVHX0xFVkVMX0dURSggbGV2ZWwgKSAgXA0KKwkoIF9BVk1fREVCVUdfTEVWRUxfID49IEFWTV9ERUJVR18jI2xldmVsIyNfTEVWRUwgKQ0KKw0KKw0KKw0KKy8qKg0KKyAqIERFQlVHIEVOQUJMRUQNCisgKi8NCisjZGVmaW5lIEFWTV9ERUJVR19FTkFCTEVEICAgICAgICAgIEFWTV9ERUJVR19MRVZFTF9HVCggWkVSTyApDQorDQorI2RlZmluZSBBVk1fSUZfREVCVUdfRU5BQkxFRCAgXA0KKwlBVk1fREVCVUdfSUYoIEFWTV9ERUJVR19FTkFCTEVEICkNCisNCisjZGVmaW5lIEFWTV9FTFNFSUZfREVCVUdfRU5BQkxFRCAgXA0KKwlBVk1fREVCVUdfRUxTRV9JRiggQVZNX0RFQlVHX0VOQUJMRUQgKQ0KKw0KKyNkZWZpbmUgQVZNX0VORElGX0RFQlVHX0VOQUJMRUQgIEFWTV9ERUJVR19FTkRJRg0KKw0KKy8qKg0KKyAqIERFQlVHIEVOQUJMRUQgYW5kIENPTkRJVElPTg0KKyAqLw0KKyNkZWZpbmUgQVZNX0RFQlVHX0VOQUJMRURfQU5EKCBjb25kaXRpb24gKSAgXA0KKwkoIEFWTV9ERUJVR19FTkFCTEVEICYmIChjb25kaXRpb24pICkNCisNCisjZGVmaW5lIEFWTV9JRl9ERUJVR19FTkFCTEVEX0FORCggY29uZGl0aW9uICkgIFwNCisJQVZNX0RFQlVHX0lGKCBBVk1fREVCVUdfRU5BQkxFRF9BTkQoIGNvbmRpdGlvbiApICkNCisNCisjZGVmaW5lIEFWTV9FTFNFSUZfREVCVUdfRU5BQkxFRF9BTkQoIGNvbmRpdGlvbiApICBcDQorCUFWTV9ERUJVR19FTFNFX0lGKCBBVk1fREVCVUdfRU5BQkxFRF9BTkQoIGNvbmRpdGlvbiApICkNCisNCisjZGVmaW5lIEFWTV9FTkRJRl9ERUJVR19FTkFCTEVEX0FORCAgQVZNX0RFQlVHX0VORElGDQorDQorLyoqDQorICogREVCVUcgRU5BQkxFRCBvciBDT05ESVRJT04NCisgKi8NCisjZGVmaW5lIEFWTV9ERUJVR19FTkFCTEVEX09SKCBjb25kaXRpb24gKSAgXA0KKwkoIEFWTV9ERUJVR19FTkFCTEVEIHx8IChjb25kaXRpb24pICkNCisNCisjZGVmaW5lIEFWTV9JRl9ERUJVR19FTkFCTEVEX09SKCBjb25kaXRpb24gKSAgXA0KKwlBVk1fREVCVUdfSUYoIEFWTV9ERUJVR19FTkFCTEVEX09SKCBjb25kaXRpb24gKSApDQorDQorI2RlZmluZSBBVk1fRUxTRUlGX0RFQlVHX0VOQUJMRURfT1IoIGNvbmRpdGlvbiApICBcDQorCUFWTV9ERUJVR19FTFNFX0lGKCBBVk1fREVCVUdfRU5BQkxFRF9PUiggY29uZGl0aW9uICkgKQ0KKw0KKyNkZWZpbmUgQVZNX0VORElGX0RFQlVHX0VOQUJMRURfT1IgIEFWTV9ERUJVR19FTkRJRg0KKw0KKw0KKw0KKy8qKg0KKyAqIERFQlVHICBMRVZFTCA+IExPVw0KKyAqLw0KKyNkZWZpbmUgQVZNX0RFQlVHX0xFVkVMX0dUX0xPVyAgICAgICAgICAgQVZNX0RFQlVHX0xFVkVMX0dUKCBMT1cgKQ0KKw0KKyNkZWZpbmUgQVZNX0lGX0RFQlVHX0xFVkVMX0dUX0xPVyAgXA0KKwlBVk1fREVCVUdfSUYoIEFWTV9ERUJVR19MRVZFTF9HVF9MT1cgKQ0KKw0KKyNkZWZpbmUgQVZNX0VMU0VJRl9ERUJVR19MRVZFTF9HVF9MT1cgIFwNCisJQVZNX0RFQlVHX0VMU0VfSUYoIEFWTV9ERUJVR19MRVZFTF9HVF9MT1cgKQ0KKw0KKyNkZWZpbmUgQVZNX0VORElGX0RFQlVHX0xFVkVMX0dUX0xPVyAgQVZNX0RFQlVHX0VORElGDQorDQorLyoqDQorICogREVCVUcgIExFVkVMID49IExPVw0KKyAqLw0KKyNkZWZpbmUgQVZNX0RFQlVHX0xFVkVMX0dURV9MT1cgICAgICAgICAgQVZNX0RFQlVHX0xFVkVMX0dURSggTE9XICkNCisNCisjZGVmaW5lIEFWTV9JRl9ERUJVR19MRVZFTF9HVEVfTE9XICBcDQorCUFWTV9ERUJVR19JRiggQVZNX0RFQlVHX0xFVkVMX0dURV9MT1cgKQ0KKw0KKyNkZWZpbmUgQVZNX0VMU0VJRl9ERUJVR19MRVZFTF9HVEVfTE9XICBcDQorCUFWTV9ERUJVR19FTFNFX0lGKCBBVk1fREVCVUdfTEVWRUxfR1RFX0xPVyApDQorDQorI2RlZmluZSBBVk1fRU5ESUZfREVCVUdfTEVWRUxfR1RFX0xPVyAgQVZNX0RFQlVHX0VORElGDQorDQorDQorDQorLyoqDQorICogREVCVUcgIExFVkVMID4gTUVESVVNDQorICovDQorI2RlZmluZSBBVk1fREVCVUdfTEVWRUxfR1RfTUVESVVNICAgICAgICBBVk1fREVCVUdfTEVWRUxfR1QoIE1FRElVTSApDQorDQorI2RlZmluZSBBVk1fSUZfREVCVUdfTEVWRUxfR1RfTUVESVVNICBcDQorCUFWTV9ERUJVR19JRiggQVZNX0RFQlVHX0xFVkVMX0dUX01FRElVTSApDQorDQorI2RlZmluZSBBVk1fRUxTRUlGX0RFQlVHX0xFVkVMX0dUX01FRElVTSAgXA0KKwlBVk1fREVCVUdfRUxTRV9JRiggQVZNX0RFQlVHX0xFVkVMX0dUX01FRElVTSApDQorDQorI2RlZmluZSBBVk1fRU5ESUZfREVCVUdfTEVWRUxfR1RfTUVESVVNICBBVk1fREVCVUdfRU5ESUYNCisNCisvKioNCisgKiBERUJVRyAgKCBMRVZFTCA+IE1FRElVTSApIG9yIENPTkRJVElPTg0KKyAqLw0KKyNkZWZpbmUgQVZNX0RFQlVHX0xFVkVMX0dUX01FRElVTV9PUiggY29uZGl0aW9uICkgIFwNCisJKCBBVk1fREVCVUdfTEVWRUxfR1RfTUVESVVNIHx8IChjb25kaXRpb24pICkNCisNCisjZGVmaW5lIEFWTV9JRl9ERUJVR19MRVZFTF9HVF9NRURJVU1fT1IoIGNvbmRpdGlvbiApICBcDQorCUFWTV9ERUJVR19JRiggQVZNX0RFQlVHX0xFVkVMX0dUX01FRElVTV9PUiggY29uZGl0aW9uICkgKQ0KKw0KKyNkZWZpbmUgQVZNX0VMU0VJRl9ERUJVR19MRVZFTF9HVF9NRURJVU1fT1IoIGNvbmRpdGlvbiApICBcDQorCUFWTV9ERUJVR19FTFNFX0lGKCBBVk1fREVCVUdfTEVWRUxfR1RfTUVESVVNX09SKCBjb25kaXRpb24gKSApDQorDQorI2RlZmluZSBBVk1fRU5ESUZfREVCVUdfTEVWRUxfR1RfTUVESVVNX09SICBBVk1fREVCVUdfRU5ESUYNCisNCisNCisvKioNCisgKiBERUJVRyAgTEVWRUwgPj0gTUVESVVNDQorICovDQorI2RlZmluZSBBVk1fREVCVUdfTEVWRUxfR1RFX01FRElVTSAgICAgICBBVk1fREVCVUdfTEVWRUxfR1RFKCBNRURJVU0gKQ0KKw0KKyNkZWZpbmUgQVZNX0lGX0RFQlVHX0xFVkVMX0dURV9NRURJVU0gIFwNCisJQVZNX0RFQlVHX0lGKCBBVk1fREVCVUdfTEVWRUxfR1RFX01FRElVTSApDQorDQorI2RlZmluZSBBVk1fRUxTRUlGX0RFQlVHX0xFVkVMX0dURV9NRURJVU0gIFwNCisJQVZNX0RFQlVHX0VMU0VfSUYoIEFWTV9ERUJVR19MRVZFTF9HVEVfTUVESVVNICkNCisNCisjZGVmaW5lIEFWTV9FTkRJRl9ERUJVR19MRVZFTF9HVEVfTUVESVVNICBBVk1fREVCVUdfRU5ESUYNCisNCisNCisvKioNCisgKiBERUJVRyAgKCBMRVZFTCA+IE1FRElVTSApIG9yIENPTkRJVElPTg0KKyAqLw0KKyNkZWZpbmUgQVZNX0RFQlVHX0xFVkVMX0dURV9NRURJVU1fT1IoIGNvbmRpdGlvbiApICBcDQorCSggQVZNX0RFQlVHX0xFVkVMX0dURV9NRURJVU0gfHwgKGNvbmRpdGlvbikgKQ0KKw0KKyNkZWZpbmUgQVZNX0lGX0RFQlVHX0xFVkVMX0dURV9NRURJVU1fT1IoIGNvbmRpdGlvbiApICBcDQorCUFWTV9ERUJVR19JRiggQVZNX0RFQlVHX0xFVkVMX0dURV9NRURJVU1fT1IoIGNvbmRpdGlvbiApICkNCisNCisjZGVmaW5lIEFWTV9FTFNFSUZfREVCVUdfTEVWRUxfR1RFX01FRElVTV9PUiggY29uZGl0aW9uICkgIFwNCisJQVZNX0RFQlVHX0VMU0VfSUYoIEFWTV9ERUJVR19MRVZFTF9HVEVfTUVESVVNX09SKCBjb25kaXRpb24gKSApDQorDQorI2RlZmluZSBBVk1fRU5ESUZfREVCVUdfTEVWRUxfR1RFX01FRElVTV9PUiAgQVZNX0RFQlVHX0VORElGDQorDQorDQorLyoqDQorICogREVCVUcgIExFVkVMID4gSElHSA0KKyAqLw0KKyNkZWZpbmUgQVZNX0RFQlVHX0xFVkVMX0dUX0hJR0ggICAgICAgICAgQVZNX0RFQlVHX0xFVkVMX0dUKCBISUdIICkNCisNCisjZGVmaW5lIEFWTV9JRl9ERUJVR19MRVZFTF9HVF9ISUdIICBcDQorCUFWTV9ERUJVR19JRiggQVZNX0RFQlVHX0xFVkVMX0dUX0hJR0ggKQ0KKw0KKyNkZWZpbmUgQVZNX0VMU0VJRl9ERUJVR19MRVZFTF9HVF9ISUdIICBcDQorCUFWTV9ERUJVR19FTFNFX0lGKCBBVk1fREVCVUdfTEVWRUxfR1RfSElHSCApDQorDQorI2RlZmluZSBBVk1fRU5ESUZfREVCVUdfTEVWRUxfR1RfSElHSCAgQVZNX0RFQlVHX0VORElGDQorDQorLyoqDQorICogREVCVUcgIExFVkVMID49IEhJR0gNCisgKi8NCisjZGVmaW5lIEFWTV9ERUJVR19MRVZFTF9HVEVfSElHSCAgICAgICAgIEFWTV9ERUJVR19MRVZFTF9HVEUoIEhJR0ggKQ0KKw0KKyNkZWZpbmUgQVZNX0lGX0RFQlVHX0xFVkVMX0dURV9ISUdIICBcDQorCUFWTV9ERUJVR19JRiggQVZNX0RFQlVHX0xFVkVMX0dURV9ISUdIICkNCisNCisjZGVmaW5lIEFWTV9FTFNFSUZfREVCVUdfTEVWRUxfR1RFX0hJR0ggIFwNCisJQVZNX0RFQlVHX0VMU0VfSUYoIEFWTV9ERUJVR19MRVZFTF9HVEVfSElHSCApDQorDQorI2RlZmluZSBBVk1fRU5ESUZfREVCVUdfTEVWRUxfR1RFX0hJR0ggIEFWTV9ERUJVR19FTkRJRg0KKw0KKw0KKy8qKg0KKyAqIERFQlVHICBMRVZFTCA+IFVMVFJBDQorICovDQorI2RlZmluZSBBVk1fREVCVUdfTEVWRUxfR1RfVUxUUkEgICAgICAgICBBVk1fREVCVUdfTEVWRUxfR1QoIFVMVFJBICkNCisNCisjZGVmaW5lIEFWTV9JRl9ERUJVR19MRVZFTF9HVF9VTFRSQSAgXA0KKwlBVk1fREVCVUdfSUYoIEFWTV9ERUJVR19MRVZFTF9HVF9VTFRSQSApDQorDQorI2RlZmluZSBBVk1fRUxTRUlGX0RFQlVHX0xFVkVMX0dUX1VMVFJBICBcDQorCUFWTV9ERUJVR19FTFNFX0lGKCBBVk1fREVCVUdfTEVWRUxfR1RfVUxUUkEgKQ0KKw0KKyNkZWZpbmUgQVZNX0VORElGX0RFQlVHX0xFVkVMX0dUX1VMVFJBICBBVk1fREVCVUdfRU5ESUYNCisNCisvKioNCisgKiBERUJVRyAgTEVWRUwgPj0gVUxUUkENCisgKi8NCisjZGVmaW5lIEFWTV9ERUJVR19MRVZFTF9HVEVfVUxUUkEgICAgICAgIEFWTV9ERUJVR19MRVZFTF9HVEUoIFVMVFJBICkNCisNCisjZGVmaW5lIEFWTV9JRl9ERUJVR19MRVZFTF9HVEVfVUxUUkEgIFwNCisJQVZNX0RFQlVHX0lGKCBBVk1fREVCVUdfTEVWRUxfR1RFX1VMVFJBICkNCisNCisjZGVmaW5lIEFWTV9FTFNFSUZfREVCVUdfTEVWRUxfR1RFX1VMVFJBICBcDQorCUFWTV9ERUJVR19FTFNFX0lGKCBBVk1fREVCVUdfTEVWRUxfR1RFX1VMVFJBICkNCisNCisjZGVmaW5lIEFWTV9FTkRJRl9ERUJVR19MRVZFTF9HVEVfVUxUUkEgIEFWTV9ERUJVR19FTkRJRg0KKw0KKw0KKw0KKy8qKg0KKyAqIERFQlVHICBMRVZFTCA8ID8NCisgKi8NCisjZGVmaW5lIEFWTV9JRl9ERUJVR19MRVZFTF9MVCggbGV2ZWwgKSAgXA0KKwlBVk1fREVCVUdfSUYoIEFWTV9ERUJVR19MRVZFTF9MVCggbGV2ZWwgKSApDQorDQorI2RlZmluZSBBVk1fRUxTRUlGX0RFQlVHX0xFVkVMX0xUKCBsZXZlbCApICBcDQorCUFWTV9ERUJVR19FTFNFX0lGKCBBVk1fREVCVUdfTEVWRUxfTFQoIGxldmVsICkgKQ0KKw0KKyNkZWZpbmUgQVZNX0VORElGX0RFQlVHX0xFVkVMX0xUKCBsZXZlbCApICBBVk1fREVCVUdfRU5ESUYNCisNCisNCisvKioNCisgKiBERUJVRyAgTEVWRUwgPiA/DQorICovDQorI2RlZmluZSBBVk1fSUZfREVCVUdfTEVWRUxfR1QoIGxldmVsICkgIFwNCisJQVZNX0RFQlVHX0lGKCBBVk1fREVCVUdfTEVWRUxfR1QoIGxldmVsICkgKQ0KKw0KKyNkZWZpbmUgQVZNX0VMU0VJRl9ERUJVR19MRVZFTF9HVCggbGV2ZWwgKSAgXA0KKwlBVk1fREVCVUdfRUxTRV9JRiggQVZNX0RFQlVHX0xFVkVMX0dUKCBsZXZlbCApICkNCisNCisjZGVmaW5lIEFWTV9FTkRJRl9ERUJVR19MRVZFTF9HVCggbGV2ZWwgKSAgQVZNX0RFQlVHX0VORElGDQorDQorDQorDQorLyoqDQorICogREVCVUcgIExFVkVMIDw9ID8NCisgKi8NCisjZGVmaW5lIEFWTV9JRl9ERUJVR19MRVZFTF9MVEUoIGxldmVsICkgIFwNCisJQVZNX0RFQlVHX0lGKCBBVk1fREVCVUdfTEVWRUxfTFRFKCBsZXZlbCApICkNCisNCisjZGVmaW5lIEFWTV9FTFNFSUZfREVCVUdfTEVWRUxfTFRFKCBsZXZlbCApICBcDQorCUFWTV9ERUJVR19FTFNFX0lGKCBBVk1fREVCVUdfTEVWRUxfTFRFKCBsZXZlbCApICkNCisNCisjZGVmaW5lIEFWTV9FTkRJRl9ERUJVR19MRVZFTF9MVEUoIGxldmVsICkgIEFWTV9ERUJVR19FTkRJRg0KKw0KKw0KKy8qKg0KKyAqIERFQlVHICBMRVZFTCA+PSA/DQorICovDQorI2RlZmluZSBBVk1fSUZfREVCVUdfTEVWRUxfR1RFKCBsZXZlbCApICBcDQorCUFWTV9ERUJVR19JRiggQVZNX0RFQlVHX0xFVkVMX0dURSggbGV2ZWwgKSApDQorDQorI2RlZmluZSBBVk1fRUxTRUlGX0RFQlVHX0xFVkVMX0dURSggbGV2ZWwgKSAgXA0KKwlBVk1fREVCVUdfRUxTRV9JRiggQVZNX0RFQlVHX0xFVkVMX0dURSggbGV2ZWwgKSApDQorDQorI2RlZmluZSBBVk1fRU5ESUZfREVCVUdfTEVWRUxfR1RFKCBsZXZlbCApICBBVk1fREVCVUdfRU5ESUYNCisNCisNCisvKioNCisgKiBERUJVRyBURVNUICBMRVZFTCBhbmQgQ09ORElUSU9ODQorICovDQorI2RlZmluZSBBVk1fREVCVUdfTEVWRUxfQU5EKCBsZXZlbCAsIGNvbmRpdGlvbiApICBcDQorCSggQVZNX0RFQlVHX0xFVkVMX0dURSggbGV2ZWwgKSAmJiAoY29uZGl0aW9uKSApDQorDQorI2RlZmluZSBBVk1fSUZfREVCVUdfTEVWRUxfQU5EKCBsZXZlbCAsIGNvbmRpdGlvbiApICBcDQorCUFWTV9ERUJVR19JRiggQVZNX0RFQlVHX0xFVkVMX0FORCggbGV2ZWwgLCBjb25kaXRpb24gKSApDQorDQorI2RlZmluZSBBVk1fRUxTRUlGX0RFQlVHX0xFVkVMX0FORCggbGV2ZWwgLCBjb25kaXRpb24gKSAgXA0KKwlBVk1fREVCVUdfRUxTRV9JRiggQVZNX0RFQlVHX0xFVkVMX0FORCggbGV2ZWwgLCBjb25kaXRpb24gKSApDQorDQorI2RlZmluZSBBVk1fRU5ESUZfREVCVUdfTEVWRUxfQU5EKCBsZXZlbCApICBBVk1fREVCVUdfRU5ESUYNCisNCisNCisvKioNCisgKiBERUJVRyBURVNUICBMRVZFTCBvciBDT05ESVRJT04NCisgKi8NCisjZGVmaW5lIEFWTV9ERUJVR19MRVZFTF9PUiggbGV2ZWwgLCBjb25kaXRpb24gKSAgXA0KKwkoIEFWTV9ERUJVR19MRVZFTF9HVEUoIGxldmVsICkgfHwgKGNvbmRpdGlvbikgKQ0KKw0KKyNkZWZpbmUgQVZNX0lGX0RFQlVHX0xFVkVMX09SKCBsZXZlbCAsIGNvbmRpdGlvbiApICBcDQorCUFWTV9ERUJVR19JRiggQVZNX0RFQlVHX0xFVkVMX09SKCBsZXZlbCAsIGNvbmRpdGlvbiApICkNCisNCisjZGVmaW5lIEFWTV9FTFNFSUZfREVCVUdfTEVWRUxfT1IoIGxldmVsICwgY29uZGl0aW9uICkgIFwNCisJQVZNX0RFQlVHX0VMU0VfSUYoIEFWTV9ERUJVR19MRVZFTF9PUiggbGV2ZWwgLCBjb25kaXRpb24gKSApDQorDQorI2RlZmluZSBBVk1fRU5ESUZfREVCVUdfTEVWRUxfT1IoIGxldmVsICkgIEFWTV9ERUJVR19FTkRJRg0KKw0KKw0KKw0KKy8qKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQVZNIERFQlVHIEZMQUcNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqLw0KKw0KK2V4dGVybiBzdGQ6OnNpemVfdCAgX0FWTV9ERUJVR19GTEFHXzsNCisNCisNCisvKioNCisgKiBERUJVRyBGTEFHIEVOQUJMRQ0KKyAqIERFQlVHIEZMQUcgRElTQUJMRQ0KKyAqLw0KKyNkZWZpbmUgQVZNX0RFQlVHX0VOQUJMRV9GTEFHKCBmbGFnICkgIFwNCisJeyBfQVZNX0RFQlVHX0ZMQUdfIHw9IChBVk1fREVCVUdfIyNmbGFnIyNfRkxBRyk7IH0NCisNCisjZGVmaW5lIEFWTV9ERUJVR19ESVNBQkxFX0ZMQUcoIGZsYWcgKSAgXA0KKwl7IF9BVk1fREVCVUdfRkxBR18gJj0gKH4gKEFWTV9ERUJVR18jI2ZsYWcjI19GTEFHKSk7IH0NCisNCisNCisNCisvKioNCisgKiBERUJVRyBGTEFHIEVOQUJMRUQNCisgKiBERUJVRyBGTEFHIERJU0FCTEVEDQorICovDQorI2RlZmluZSBBVk1fREVCVUdfRkxBR19FTkFCTEVEKCBmbGFnICkgICAgXA0KKwkoIChfQVZNX0RFQlVHX0ZMQUdfICYgKEFWTV9ERUJVR18jI2ZsYWcjI19GTEFHKSkgIT0gMCApDQorDQorI2RlZmluZSBBVk1fREVCVUdfRkxBR19HUk9VUF9FTkFCTEVEKCBmbGFnICkgIFwNCisJKCAoX0FWTV9ERUJVR19GTEFHXyAmIChBVk1fREVCVUdfIyNmbGFnIyNfRkxBRykpID09ICBcDQorCQkJKEFWTV9ERUJVR18jI2ZsYWcjI19GTEFHKSApDQorDQorDQorI2RlZmluZSBBVk1fREVCVUdfRkxBR19FTkFCTEVEMigga2luZDEgLCBraW5kMiApICBcDQorCSggQVZNX0RFQlVHX0ZMQUdfRU5BQkxFRCgga2luZDEgKSAmJiBBVk1fREVCVUdfRkxBR19FTkFCTEVEKCBraW5kMiApICkNCisNCisjZGVmaW5lIEFWTV9ERUJVR19GTEFHX0RJU0FCTEVEKCBmbGFnICkgIFwNCisJKCAoX0FWTV9ERUJVR19GTEFHXyAmIChBVk1fREVCVUdfIyNmbGFnIyNfRkxBRykpID09IDAgKQ0KKw0KKw0KKw0KKy8qKg0KKyAqIERFQlVHIFRFU1QgIEZMQUcNCisgKi8NCisjZGVmaW5lIEFWTV9ERUJVR19GTEFHKCBmbGFnICkgIFwNCisJKCBBVk1fREVCVUdfRU5BQkxFRCAmJiBBVk1fREVCVUdfRkxBR19FTkFCTEVEKCBmbGFnICkgKQ0KKw0KKyNkZWZpbmUgQVZNX0lGX0RFQlVHX0ZMQUcoIGZsYWcgKSAgXA0KKwlBVk1fREVCVUdfSUYoIEFWTV9ERUJVR19GTEFHKCBmbGFnICkgKQ0KKw0KKyNkZWZpbmUgQVZNX0VMU0VJRl9ERUJVR19GTEFHKCBmbGFnICkgIFwNCisJQVZNX0RFQlVHX0VMU0VfSUYoIEFWTV9ERUJVR19GTEFHKCBmbGFnICkgKQ0KKw0KKyNkZWZpbmUgQVZNX0VORElGX0RFQlVHX0ZMQUcoIGZsYWcgKSAgQVZNX0RFQlVHX0VORElGDQorDQorDQorDQorLyoqDQorICogREVCVUcgVEVTVCAgS0lORDEgYW5kIEtJTjINCisgKi8NCisgI2RlZmluZSBBVk1fREVCVUdfRkxBRzIoIGtpbmQxICwga2luZDIgKSAgXA0KKwkoIEFWTV9ERUJVR19FTkFCTEVEICYmIEFWTV9ERUJVR19GTEFHX0VOQUJMRUQyKCBraW5kMSAsIGtpbmQyICkgKQ0KKw0KKyAjZGVmaW5lIEFWTV9JRl9ERUJVR19GTEFHMigga2luZDEgLCBraW5kMiApICBcDQorCUFWTV9ERUJVR19JRiggQVZNX0RFQlVHX0ZMQUcyKCBraW5kMSAsIGtpbmQyICkgKQ0KKw0KKyAjZGVmaW5lIEFWTV9FTFNFSUZfREVCVUdfRkxBRzIoIGtpbmQxICwga2luZDIgKSAgXA0KKwlBVk1fREVCVUdfRUxTRV9JRiggQVZNX0RFQlVHX0ZMQUcyKCBraW5kMSAsIGtpbmQyICkgKQ0KKw0KKyAjZGVmaW5lIEFWTV9FTkRJRl9ERUJVR19GTEFHMigga2luZDEgLCBraW5kMiApICBBVk1fREVCVUdfRU5ESUYNCisNCisNCisgLyoqDQorICAqIERFQlVHIFRFU1QgIEtJTkQxIGluaGliaXQgS0lOMikNCisgICovDQorICNkZWZpbmUgQVZNX0RFQlVHX0ZMQUdfQU5EX05PVF9GTEFHKCBraW5kMSAsIGtpbmQyICkgIFwNCisJKCBBVk1fREVCVUdfRkxBRygga2luZDEgKSAmJiBBVk1fREVCVUdfTk9UX0ZMQUcoIGtpbmQyICkgKQ0KKw0KKyAjZGVmaW5lIEFWTV9JRl9ERUJVR19GTEFHX0FORF9OT1RfRkxBRygga2luZDEgLCBraW5kMiApICBcDQorCUFWTV9ERUJVR19JRiggQVZNX0RFQlVHX0ZMQUdfQU5EX05PVF9GTEFHKCBraW5kMSAsIGtpbmQyICkgKQ0KKw0KKyAjZGVmaW5lIEFWTV9FTFNFSUZfREVCVUdfRkxBR19BTkRfTk9UX0ZMQUcoIGtpbmQxICwga2luZDIgKSAgXA0KKwlBVk1fREVCVUdfRUxTRV9JRiggQVZNX0RFQlVHX0ZMQUdfQU5EX05PVF9GTEFHKCBraW5kMSAsIGtpbmQyICkgKQ0KKw0KKyAjZGVmaW5lIEFWTV9FTkRJRl9ERUJVR19GTEFHX0FORF9OT1RfRkxBRygga2luZDEgLCBraW5kMiApICBBVk1fREVCVUdfRU5ESUYNCisNCisNCisNCisvKioNCisgKiBERUJVRyBURVNUICBGTEFHIGFuZCBDT05ESVRJT04NCisgKi8NCisjZGVmaW5lIEFWTV9ERUJVR19GTEFHX0FORCggZmxhZyAsIGNvbmRpdGlvbiApICBcDQorCSggQVZNX0RFQlVHX0ZMQUcoIGZsYWcgKSAmJiAoY29uZGl0aW9uKSApDQorDQorI2RlZmluZSBBVk1fSUZfREVCVUdfRkxBR19BTkQoIGZsYWcgLCBjb25kaXRpb24gKSAgXA0KKwlBVk1fREVCVUdfSUYoIEFWTV9ERUJVR19GTEFHX0FORCggZmxhZyAsIGNvbmRpdGlvbiApICkNCisNCisjZGVmaW5lIEFWTV9FTFNFSUZfREVCVUdfRkxBR19BTkQoIGZsYWcgLCBjb25kaXRpb24gKSAgXA0KKwlBVk1fREVCVUdfRUxTRV9JRiggQVZNX0RFQlVHX0ZMQUdfQU5EKCBmbGFnICwgY29uZGl0aW9uICkgKQ0KKw0KKyNkZWZpbmUgQVZNX0VORElGX0RFQlVHX0ZMQUdfQU5EKCBmbGFnICkgIEFWTV9ERUJVR19FTkRJRg0KKw0KKw0KKw0KKy8qKg0KKyAqIERFQlVHIFRFU1QgIEtJTkQxIGFuZCBLSU5EMiBhbmQgQ09ORElUSU9ODQorICovDQorICNkZWZpbmUgQVZNX0RFQlVHX0ZMQUcyX0FORCgga2luZDEgLCBraW5kMiAsIGNvbmRpdGlvbiApICBcDQorCSggQVZNX0RFQlVHX0ZMQUcyKCBraW5kMSAsIGtpbmQyICkgJiYgKGNvbmRpdGlvbikgKQ0KKw0KKyAjZGVmaW5lIEFWTV9JRl9ERUJVR19GTEFHMl9BTkQoIGtpbmQxICwga2luZDIgLCBjb25kaXRpb24gKSAgXA0KKwlBVk1fREVCVUdfSUYoIEFWTV9ERUJVR19GTEFHMl9BTkQoIGtpbmQxICwga2luZDIgLCBjb25kaXRpb24gKSApDQorDQorICNkZWZpbmUgQVZNX0VMU0VJRl9ERUJVR19GTEFHMl9BTkQoIGtpbmQxICwga2luZDIgLCBjb25kaXRpb24gKSAgXA0KKwlBVk1fREVCVUdfRUxTRV9JRiggQVZNX0RFQlVHX0ZMQUdfQU5EKCBraW5kMSAsIGtpbmQyICwgY29uZGl0aW9uICkgKQ0KKw0KKyAjZGVmaW5lIEFWTV9FTkRJRl9ERUJVR19GTEFHMl9BTkQoIGtpbmQxICwga2luZDIgKSAgQVZNX0RFQlVHX0VORElGDQorDQorDQorDQorLyoqDQorICogREVCVUcgVEVTVCAgRkxBRyBvciBDT05ESVRJT04NCisgKi8NCisjZGVmaW5lIEFWTV9ERUJVR19GTEFHX09SKCBmbGFnICwgY29uZGl0aW9uICkgIFwNCisJKCBBVk1fREVCVUdfRkxBRyggZmxhZyApIHx8IChjb25kaXRpb24pICkNCisNCisjZGVmaW5lIEFWTV9JRl9ERUJVR19GTEFHX09SKCBmbGFnICwgY29uZGl0aW9uICkgIFwNCisJQVZNX0RFQlVHX0lGKCBBVk1fREVCVUdfRkxBR19PUiggZmxhZyAsIGNvbmRpdGlvbiApICkNCisNCisjZGVmaW5lIEFWTV9FTFNFSUZfREVCVUdfRkxBR19PUiggZmxhZyAsIGNvbmRpdGlvbiApICBcDQorCUFWTV9ERUJVR19FTFNFX0lGKCBBVk1fREVCVUdfRkxBR19PUiggZmxhZyAsIGNvbmRpdGlvbiApICkNCisNCisjZGVmaW5lIEFWTV9FTkRJRl9ERUJVR19GTEFHX09SKCBmbGFnICkgIEFWTV9ERUJVR19FTkRJRg0KKw0KKw0KKw0KKw0KKy8qKg0KKyAqIERFQlVHIFRFU1QgIG5vdCBGTEFHDQorICovDQorI2RlZmluZSBBVk1fREVCVUdfTk9UX0ZMQUcoIGZsYWcgKSAgICAgICBBVk1fREVCVUdfRkxBR19ESVNBQkxFRCggZmxhZyApDQorDQorI2RlZmluZSBBVk1fSUZfREVCVUdfTk9UX0ZMQUcoIGZsYWcgKSAgXA0KKwlBVk1fREVCVUdfSUYoIEFWTV9ERUJVR19OT1RfRkxBRyggZmxhZyApICkNCisNCisjZGVmaW5lIEFWTV9FTFNFSUZfREVCVUdfTk9UX0ZMQUcoIGZsYWcgKSAgXA0KKwlBVk1fREVCVUdfRUxTRV9JRiggQVZNX0RFQlVHX05PVF9GTEFHKCBmbGFnICkgKQ0KKw0KKyNkZWZpbmUgQVZNX0VORElGX0RFQlVHX05PVF9GTEFHKCBmbGFnICkgIEFWTV9ERUJVR19FTkRJRg0KKw0KKw0KKw0KKy8qKg0KKyAqIERFQlVHIFRFU1QgICggbm90IEZMQUcgKSBhbmQgQ09ORElUSU9ODQorICovDQorI2RlZmluZSBBVk1fREVCVUdfTk9UX0ZMQUdfQU5EKCBmbGFnICwgY29uZGl0aW9uICkgIFwNCisJKCBBVk1fREVCVUdfTk9UX0ZMQUcoIGZsYWcgKSAmJiAoY29uZGl0aW9uKSApDQorDQorI2RlZmluZSBBVk1fSUZfREVCVUdfTk9UX0ZMQUdfQU5EKCBmbGFnICwgY29uZGl0aW9uICkgIFwNCisJQVZNX0RFQlVHX0lGKCBBVk1fREVCVUdfTk9UX0ZMQUdfQU5EKCBmbGFnICwgY29uZGl0aW9uICkgKQ0KKw0KKyNkZWZpbmUgQVZNX0VMU0VJRl9ERUJVR19OT1RfRkxBR19BTkQoIGZsYWcgLCBjb25kaXRpb24gKSAgXA0KKwlBVk1fREVCVUdfRUxTRV9JRiggQVZNX0RFQlVHX05PVF9GTEFHX0FORCggZmxhZyAsIGNvbmRpdGlvbiApICkNCisNCisjZGVmaW5lIEFWTV9FTkRJRl9ERUJVR19OT1RfRkxBR19BTkQoIGZsYWcgKSAgQVZNX0RFQlVHX0VORElGDQorDQorDQorDQorLyoqDQorICogREVCVUcgVEVTVCAgTEVWRUwgYW5kIEZMQUcNCisgKi8NCisjZGVmaW5lIEFWTV9ERUJVR19MRVZFTF9GTEFHKCBsZXZlbCAsIGZsYWcgKSAgXA0KKwkoIEFWTV9ERUJVR19MRVZFTF9HVEUoIGxldmVsICkgJiYgQVZNX0RFQlVHX0ZMQUdfRU5BQkxFRCggZmxhZyApICkNCisNCisjZGVmaW5lIEFWTV9JRl9ERUJVR19MRVZFTF9GTEFHKCBsZXZlbCAsIGZsYWcgKSAgXA0KKwlBVk1fREVCVUdfSUYoIEFWTV9ERUJVR19MRVZFTF9GTEFHKCBsZXZlbCAsIGZsYWcgKSApDQorDQorI2RlZmluZSBBVk1fRUxTRUlGX0RFQlVHX0xFVkVMX0ZMQUcoIGxldmVsICwgZmxhZyApICBcDQorCUFWTV9ERUJVR19FTFNFX0lGKCBBVk1fREVCVUdfTEVWRUxfRkxBRyggbGV2ZWwgLCBmbGFnICkgKQ0KKw0KKyNkZWZpbmUgQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcoIGxldmVsICwgZmxhZyApICBBVk1fREVCVUdfRU5ESUYNCisNCisNCisvKioNCisgKiBERUJVRyBURVNUICBub3QgKCBMRVZFTCBhbmQgRkxBRyApDQorICovDQorI2RlZmluZSBBVk1fREVCVUdfTk9UMl9MRVZFTF9GTEFHKCBsZXZlbCAsIGZsYWcgKSAgXA0KKwkoIEFWTV9ERUJVR19MRVZFTF9MVCggbGV2ZWwgKSB8fCBBVk1fREVCVUdfRkxBR19ESVNBQkxFRCggZmxhZyApICkNCisNCisjZGVmaW5lIEFWTV9JRl9ERUJVR19OT1QyX0xFVkVMX0ZMQUcoIGxldmVsICwgZmxhZyApICBcDQorCUFWTV9ERUJVR19JRiggQVZNX0RFQlVHX05PVDJfTEVWRUxfRkxBRyggbGV2ZWwgLCBmbGFnICkgKQ0KKw0KKyNkZWZpbmUgQVZNX0VMU0VJRl9ERUJVR19OT1QyX0xFVkVMX0ZMQUcoIGxldmVsICwgZmxhZyApICBcDQorCUFWTV9ERUJVR19FTFNFX0lGKCBBVk1fREVCVUdfTk9UMl9MRVZFTF9GTEFHKCBsZXZlbCAsIGZsYWcgKSApDQorDQorI2RlZmluZSBBVk1fRU5ESUZfREVCVUdfTk9UMl9MRVZFTF9GTEFHKCBsZXZlbCAsIGZsYWcgKSAgQVZNX0RFQlVHX0VORElGDQorDQorDQorLyoqDQorICogREVCVUcgVEVTVCAgTEVWRUwgb3IgRkxBRw0KKyAqLw0KKyNkZWZpbmUgQVZNX0RFQlVHX0xFVkVMX09SX0ZMQUcoIGxldmVsICwgZmxhZyApICBcDQorCSggQVZNX0RFQlVHX0xFVkVMX0dURSggbGV2ZWwgKSB8fCAgXA0KKwkJCUFWTV9ERUJVR19FTkFCTEVEX0FORCggQVZNX0RFQlVHX0ZMQUdfRU5BQkxFRCggZmxhZyApICkgKQ0KKw0KKyNkZWZpbmUgQVZNX0lGX0RFQlVHX0xFVkVMX09SX0ZMQUcoIGxldmVsICwgZmxhZyApICBcDQorCUFWTV9ERUJVR19JRiggQVZNX0RFQlVHX0xFVkVMX09SX0ZMQUcoIGxldmVsICwgZmxhZyApICkNCisNCisjZGVmaW5lIEFWTV9FTFNFSUZfREVCVUdfTEVWRUxfT1JfRkxBRyggbGV2ZWwgLCBmbGFnICkgIFwNCisJQVZNX0RFQlVHX0VMU0VfSUYoIEFWTV9ERUJVR19MRVZFTF9PUl9GTEFHKCBsZXZlbCAsIGZsYWcgKSApDQorDQorI2RlZmluZSBBVk1fRU5ESUZfREVCVUdfTEVWRUxfT1JfRkxBRyggbGV2ZWwgLCBmbGFnICkgIEFWTV9ERUJVR19FTkRJRg0KKw0KKw0KKw0KKyAvKioNCisgICogREVCVUcgVEVTVCAgTEVWRUwgb3IgRkxBRw0KKyAgKi8NCisgI2RlZmluZSBBVk1fREVCVUdfTEVWRUxfT1JfRkxBRzIoIGxldmVsICwga2luZDEgLCBraW5kMiApICBcDQorCSggQVZNX0RFQlVHX0xFVkVMX0dURSggbGV2ZWwgKSB8fCAgXA0KKwkJCUFWTV9ERUJVR19FTkFCTEVEX0FORCggQVZNX0RFQlVHX0ZMQUdfRU5BQkxFRDIoIGtpbmQxICwga2luZDIgKSApICkNCisNCisgI2RlZmluZSBBVk1fSUZfREVCVUdfTEVWRUxfT1JfRkxBRzIoIGxldmVsICwga2luZDEgLCBraW5kMiApICBcDQorCUFWTV9ERUJVR19JRiggQVZNX0RFQlVHX0xFVkVMX09SX0ZMQUcyKCBsZXZlbCAsIGtpbmQxICwga2luZDIgKSApDQorDQorICNkZWZpbmUgQVZNX0VMU0VJRl9ERUJVR19MRVZFTF9PUl9GTEFHMiggbGV2ZWwgLCBraW5kMSAsIGtpbmQyICkgIFwNCisJQVZNX0RFQlVHX0VMU0VfSUYoIEFWTV9ERUJVR19MRVZFTF9PUl9GTEFHMiggbGV2ZWwgLCBraW5kMSAsIGtpbmQyICkgKQ0KKw0KKyAjZGVmaW5lIEFWTV9FTkRJRl9ERUJVR19MRVZFTF9PUl9GTEFHMiggbGV2ZWwgLCBraW5kMSAsIGtpbmQyICkgQVZNX0RFQlVHX0VORElGDQorDQorDQorDQorLyoqDQorICogREVCVUcgVEVTVCAgTEVWRUwgYW5kIEtJTkQxIGFuZCBLSU5EMg0KKyAqLw0KKyNkZWZpbmUgQVZNX0RFQlVHX0xFVkVMX0ZMQUcyKCBsZXZlbCAsIGtpbmQxICwga2luZDIgKSAgXA0KKwkoIEFWTV9ERUJVR19MRVZFTF9HVEUoIGxldmVsICkgJiYgQVZNX0RFQlVHX0ZMQUdfRU5BQkxFRDIoIGtpbmQxICwga2luZDIgKSApDQorDQorI2RlZmluZSBBVk1fSUZfREVCVUdfTEVWRUxfRkxBRzIoIGxldmVsICwga2luZDEgLCBraW5kMiApICBcDQorCUFWTV9ERUJVR19JRiggQVZNX0RFQlVHX0xFVkVMX0ZMQUcyKCBsZXZlbCAsIGtpbmQxICwga2luZDIgKSApDQorDQorI2RlZmluZSBBVk1fRUxTRUlGX0RFQlVHX0xFVkVMX0ZMQUcyKCBsZXZlbCAsIGtpbmQxICwga2luZDIgKSAgXA0KKwlBVk1fREVCVUdfRUxTRV9JRiggQVZNX0RFQlVHX0xFVkVMX0ZMQUcyKCBsZXZlbCAsIGtpbmQxICwga2luZDIgKSApDQorDQorI2RlZmluZSBBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBRzIoIGxldmVsICwga2luZDEgLCBraW5kMiApICBBVk1fREVCVUdfRU5ESUYNCisNCisNCisgLyoqDQorICAqIERFQlVHIFRFU1QgIExFVkVMIGFuZCBGTEFHIGFuZCBDT05ESVRJT04NCisgICovDQorICNkZWZpbmUgQVZNX0RFQlVHX0xFVkVMX0ZMQUdfQU5EKCBsZXZlbCAsIGZsYWcgLCBjb25kaXRpb24gKSAgXA0KKwkoIEFWTV9ERUJVR19MRVZFTF9GTEFHKCBsZXZlbCAsIGZsYWcgKSAmJiAoY29uZGl0aW9uKSApDQorDQorICNkZWZpbmUgQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUdfQU5EKCBsZXZlbCAsIGZsYWcgLCBjb25kaXRpb24gKSAgXA0KKwlBVk1fREVCVUdfSUYoIEFWTV9ERUJVR19MRVZFTF9GTEFHX0FORCggbGV2ZWwgLCBmbGFnICwgY29uZGl0aW9uICkgKQ0KKw0KKyAjZGVmaW5lIEFWTV9FTFNFSUZfREVCVUdfTEVWRUxfRkxBR19BTkQoIGxldmVsICwgZmxhZyAsIGNvbmRpdGlvbiApICBcDQorCUFWTV9ERUJVR19FTFNFX0lGKCBBVk1fREVCVUdfTEVWRUxfRkxBR19BTkQoIGxldmVsICwgZmxhZyAsIGNvbmRpdGlvbiApICkNCisNCisgI2RlZmluZSBBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBR19BTkQoIGxldmVsICwgZmxhZyApICBBVk1fREVCVUdfRU5ESUYNCisNCisNCisgLyoqDQorICAqIERFQlVHIFRFU1QgIExFVkVMIGFuZCBLSU5EMiBhbmQgQ09ORElUSU9ODQorICAqLw0KKyAjZGVmaW5lIEFWTV9ERUJVR19MRVZFTF9GTEFHMl9BTkQoIGxldmVsICwgZmxhZyAsIGtpbmQyICwgY29uZGl0aW9uICkgIFwNCisJKCBBVk1fREVCVUdfTEVWRUxfRkxBRzIoIGxldmVsICwgZmxhZyAsIGtpbmQyICkgJiYgKGNvbmRpdGlvbikgKQ0KKw0KKyAjZGVmaW5lIEFWTV9JRl9ERUJVR19MRVZFTF9GTEFHMl9BTkQoIGxldmVsICwgZmxhZyAsIGtpbmQyICwgY29uZGl0aW9uICkgIFwNCisJQVZNX0RFQlVHX0lGKCBBVk1fREVCVUdfTEVWRUxfRkxBRzJfQU5EKCBsZXZlbCAsIGZsYWcgLCBraW5kMiAsIGNvbmRpdGlvbiApICkNCisNCisgI2RlZmluZSBBVk1fRUxTRUlGX0RFQlVHX0xFVkVMX0ZMQUcyX0FORCggbGV2ZWwgLCBmbGFnICwga2luZDIgLCBjb25kaXRpb24gKSAgXA0KKwlBVk1fREVCVUdfRUxTRV9JRiggQVZNX0RFQlVHX0xFVkVMX0ZMQUcyX0FORCggbGV2ZWwgLCBmbGFnICwga2luZDIgLCBjb25kaXRpb24gKSApDQorDQorICNkZWZpbmUgQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUcyX0FORCggbGV2ZWwgLCBmbGFnICwga2luZDIgKSBBVk1fREVCVUdfRU5ESUYNCisNCisNCisvKioNCisgKiBERUJVRyBURVNUICAoTEVWRUwgYW5kIEZMQUcpIG9yIENPTkRJVElPTg0KKyAqLw0KKyNkZWZpbmUgQVZNX0RFQlVHX0xFVkVMX0ZMQUdfT1IoIGxldmVsICwgZmxhZyAsIGNvbmRpdGlvbiApICBcDQorCSggQVZNX0RFQlVHX0xFVkVMX0ZMQUcoIGxldmVsICwgZmxhZyApIHx8IChjb25kaXRpb24pICkNCisNCisjZGVmaW5lIEFWTV9JRl9ERUJVR19MRVZFTF9GTEFHX09SKCBsZXZlbCAsIGZsYWcgLCBjb25kaXRpb24gKSAgXA0KKwlBVk1fREVCVUdfSUYoIEFWTV9ERUJVR19MRVZFTF9GTEFHX09SKCBsZXZlbCAsIGZsYWcgLCBjb25kaXRpb24gKSApDQorDQorI2RlZmluZSBBVk1fRUxTRUlGX0RFQlVHX0xFVkVMX0ZMQUdfT1IoIGxldmVsICwgZmxhZyAsIGNvbmRpdGlvbiApICBcDQorCUFWTV9ERUJVR19FTFNFX0lGKCBBVk1fREVCVUdfTEVWRUxfRkxBR19PUiggbGV2ZWwgLCBmbGFnICwgY29uZGl0aW9uICkgKQ0KKw0KKyNkZWZpbmUgQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUdfT1IoIGxldmVsICwgZmxhZyApICBBVk1fREVCVUdfRU5ESUYNCisNCisNCisNCisgLyoqDQorICAqIERFQlVHIFRFU1QgICggTEVWRUwgb3IgRkxBRyApIGFuZCBDT05ESVRJT04NCisgICovDQorICNkZWZpbmUgQVZNX0RFQlVHX0xFVkVMX09SX0ZMQUdfQU5EKCBsZXZlbCAsIGZsYWcgLCBjb25kaXRpb24gKSAgXA0KKwkoICggQVZNX0RFQlVHX0xFVkVMX0dURSggbGV2ZWwgKSB8fCAgXA0KKwkJQVZNX0RFQlVHX0VOQUJMRURfQU5EKCBBVk1fREVCVUdfRkxBR19FTkFCTEVEKCBmbGFnICkgKSApICYmIFwNCisJKGNvbmRpdGlvbikgKQ0KKw0KKyAjZGVmaW5lIEFWTV9JRl9ERUJVR19MRVZFTF9PUl9GTEFHX0FORCggbGV2ZWwgLCBmbGFnICwgY29uZGl0aW9uICkgIFwNCisJQVZNX0RFQlVHX0lGKCBBVk1fREVCVUdfTEVWRUxfT1JfRkxBR19BTkQoIGxldmVsICwgZmxhZyAsIGNvbmRpdGlvbiApICkNCisNCisgI2RlZmluZSBBVk1fRUxTRUlGX0RFQlVHX0xFVkVMX09SX0ZMQUdfQU5EKCBsZXZlbCAsIGZsYWcgLCBjb25kaXRpb24gKSAgXA0KKwlBVk1fREVCVUdfRUxTRV9JRiggQVZNX0RFQlVHX0xFVkVMX09SX0ZMQUdfQU5EKCBsZXZlbCAsIGZsYWcgLCBjb25kaXRpb24gKSApDQorDQorICNkZWZpbmUgQVZNX0VORElGX0RFQlVHX0xFVkVMX09SX0ZMQUdfQU5EKCBsZXZlbCAsIGZsYWcgKSAgQVZNX0RFQlVHX0VORElGDQorDQorDQorIC8qKg0KKyAgKiBERUJVRyBURVNUICAoIExFVkVMIG9yIEZMQUcgKSBvciBDT05ESVRJT04NCisgICovDQorICNkZWZpbmUgQVZNX0RFQlVHX0xFVkVMX09SX0ZMQUdfT1IoIGxldmVsICwgZmxhZyAsIGNvbmRpdGlvbiApICBcDQorCSggQVZNX0RFQlVHX0xFVkVMX0dURSggbGV2ZWwgKSB8fCAgXA0KKwlBVk1fREVCVUdfRU5BQkxFRF9BTkQoIEFWTV9ERUJVR19GTEFHX0VOQUJMRUQoIGZsYWcgKSApIHx8IChjb25kaXRpb24pICkNCisNCisgI2RlZmluZSBBVk1fSUZfREVCVUdfTEVWRUxfT1JfRkxBR19PUiggbGV2ZWwgLCBmbGFnICwgY29uZGl0aW9uICkgIFwNCisJQVZNX0RFQlVHX0lGKCBBVk1fREVCVUdfTEVWRUxfT1JfRkxBR19PUiggbGV2ZWwgLCBmbGFnICwgY29uZGl0aW9uICkgKQ0KKw0KKyAjZGVmaW5lIEFWTV9FTFNFSUZfREVCVUdfTEVWRUxfT1JfRkxBR19PUiggbGV2ZWwgLCBmbGFnICwgY29uZGl0aW9uICkgIFwNCisJQVZNX0RFQlVHX0VMU0VfSUYoIEFWTV9ERUJVR19MRVZFTF9PUl9GTEFHX09SKCBsZXZlbCAsIGZsYWcgLCBjb25kaXRpb24gKSApDQorDQorICNkZWZpbmUgQVZNX0VORElGX0RFQlVHX0xFVkVMX09SX0ZMQUdfT1IoIGxldmVsICwgZmxhZyApICBBVk1fREVCVUdfRU5ESUYNCisNCisNCisNCisvKioNCisgKiBERUJVRyBGTEFHIEVOVU1FUkFUSU9ODQorICogb24gNjQgYml0cyBtYXgNCisgKi8NCisNCitlbnVtIEFWTV9ERUJVR19GTEFHX1QNCit7DQorCUFWTV9ERUJVR19OT1RISU5HX0ZMQUcgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAwMDAwMDAwMCwNCisNCisJLy8gR2VuZXJhbCBDb250ZXh0DQorCUFWTV9ERUJVR19DT05GSUdVUklOR19GTEFHICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAwMDAwMDAwMSwNCisJQVZNX0RFQlVHX1BBUlNJTkdfRkxBRyAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMDAwMDAwMDAyLA0KKwlBVk1fREVCVUdfQ09NUElMSU5HX0ZMQUcgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwMDAwMDAwMDQsDQorCUFWTV9ERUJVR19MT0FESU5HX0ZMQUcgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAwMDAwMDAwOCwNCisNCisJQVZNX0RFQlVHX0NPTVBVVElOR19GTEFHICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMDAwMDAwMDEwLA0KKwlBVk1fREVCVUdfUkVQT1JUSU5HX0ZMQUcgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwMDAwMDAwMjAsDQorDQorCUFWTV9ERUJVR19TT0xWSU5HX0ZMQUcgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAwMDAwMDA0MCwNCisJQVZNX0RFQlVHX1NBVF9TT0xWSU5HX0ZMQUcgICAgICAgICAgICAgID0gQVZNX0RFQlVHX1NPTFZJTkdfRkxBRywNCisJQVZNX0RFQlVHX1NNVF9TT0xWSU5HX0ZMQUcgICAgICAgICAgICAgID0gQVZNX0RFQlVHX1NPTFZJTkdfRkxBRywNCisNCisJQVZNX0RFQlVHX1BST0ZJTElOR19GTEFHICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMDAwMDAwMDgwLA0KKw0KKwkvLyBQcm9jZXNzIFN0YWdlOiBQcm9jZXNzaW5nLCBGaWx0ZXJpbmcsIC4uLg0KKwlBVk1fREVCVUdfUFJFX1BST0NFU1NJTkdfRkxBRyAgICAgICAgICAgPSAweDAwMDAwMDAwMDAwMDAxMDAsDQorCUFWTV9ERUJVR19QT1NUX1BST0NFU1NJTkdfRkxBRyAgICAgICAgICA9IDB4MDAwMDAwMDAwMDAwMDIwMCwNCisNCisJQVZNX0RFQlVHX1BST0NFU1NJTkdfRkxBRyAgICAgICAgICAgICAgID0gQVZNX0RFQlVHX1BSRV9QUk9DRVNTSU5HX0ZMQUcNCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQVZNX0RFQlVHX1BPU1RfUFJPQ0VTU0lOR19GTEFHLA0KKw0KKwlBVk1fREVCVUdfUFJFX0ZJTFRFUklOR19GTEFHICAgICAgICAgICAgPSAweDAwMDAwMDAwMDAwMDA0MDAsDQorCUFWTV9ERUJVR19QT1NUX0ZJTFRFUklOR19GTEFHICAgICAgICAgICA9IDB4MDAwMDAwMDAwMDAwMDgwMCwNCisNCisJQVZNX0RFQlVHX0ZJTFRFUklOR19GTEFHICAgICAgICAgICAgICAgID0gQVZNX0RFQlVHX1BSRV9GSUxURVJJTkdfRkxBRw0KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBVk1fREVCVUdfUE9TVF9GSUxURVJJTkdfRkxBRywNCisNCisJQVZNX0RFQlVHX1FVRVVFX0ZMQUcgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMDAwMDAxMDAwLA0KKwlBVk1fREVCVUdfUVVFVUlOR19GTEFHICAgICAgICAgICAgICAgICAgPSBBVk1fREVCVUdfUVVFVUVfRkxBRywNCisNCisJQVZNX0RFQlVHX0FMTF9QUk9DRVNTX1NUQUdFX0ZMQUcgICAgICAgID0gQVZNX0RFQlVHX1BST0NFU1NJTkdfRkxBRw0KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBVk1fREVCVUdfRklMVEVSSU5HX0ZMQUcsDQorDQorCUFWTV9ERUJVR19QUk9DRVNTT1JfRkxBRyAgICAgICAgICAgICAgICA9IEFWTV9ERUJVR19BTExfUFJPQ0VTU19TVEFHRV9GTEFHLA0KKw0KKwkvLyBTdGF0ZW1lbnQgRXZhbHVhdGlvbg0KKwlBVk1fREVCVUdfUFJPR1JBTV9GTEFHICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwMDAwMDIwMDAsDQorCUFWTV9ERUJVR19TVEFURU1FTlRfRkxBRyAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAwMDAxMDAwMCwNCisNCisJQVZNX0RFQlVHX0FTU0lHTk1FTlRfRkxBRyAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMDAwMDIwMDAwLA0KKwlBVk1fREVCVUdfU1RBVEVNRU5UX0FTU0lHTk1FTlRfRkxBRyAgICAgPSBBVk1fREVCVUdfQVNTSUdOTUVOVF9GTEFHLA0KKw0KKwlBVk1fREVCVUdfQ09NTVVOSUNBVElPTl9GTEFHICAgICAgICAgICAgPSAweDAwMDAwMDAwMDAwNDAwMDAsDQorCUFWTV9ERUJVR19TVEFURU1FTlRfQ09NTVVOSUNBVElPTl9GTEFHICA9IEFWTV9ERUJVR19DT01NVU5JQ0FUSU9OX0ZMQUcsDQorDQorCUFWTV9ERUJVR19TVEFURU1FTlRfQ09OVFJPTF9GTEFHICAgICAgICA9IDB4MDAwMDAwMDAwMDA4MDAwMCwNCisJQVZNX0RFQlVHX1NUQVRFTUVOVF9TQ0hFRFVMSU5HX0ZMQUcgICAgID0gMHgwMDAwMDAwMDAwMTAwMDAwLA0KKw0KKwlBVk1fREVCVUdfVEVTVF9ERUNJU0lPTl9GTEFHICAgICAgICAgICAgPSAweDAwMDAwMDAwMDAyMDAwMDAsDQorCUFWTV9ERUJVR19TVEFURU1FTlRfVEVTVF9ERUNJU0lPTl9GTEFHICA9IEFWTV9ERUJVR19URVNUX0RFQ0lTSU9OX0ZMQUcsDQorDQorCUFWTV9ERUJVR19CWVRFQ09ERV9GTEFHICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAwMDgwMDAwMCwNCisNCisJQVZNX0RFQlVHX0RBVEFfRkxBRyAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMDAxMDAwMDAwLA0KKw0KKwlBVk1fREVCVUdfVFJBQ0VfRkxBRyAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwMDIwMDAwMDAsDQorDQorCS8vIEVsZW1lbnQ6IFByb3BlcnR5LCBTaWduYWwuLi4NCisJQVZNX0RFQlVHX1ZBUklBQkxFX0ZMQUcgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMDEwMDAwMDAwLA0KKwlBVk1fREVCVUdfQlVGRkVSX0ZMQUcgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwMjAwMDAwMDAsDQorCUFWTV9ERUJVR19QT1JUX0ZMQUcgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDA0MDAwMDAwMCwNCisJQVZNX0RFQlVHX1NJR05BTF9GTEFHICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMDgwMDAwMDAwLA0KKwlBVk1fREVCVUdfQ09OTkVYSU9OX0ZMQUcgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxMDAwMDAwMDAsDQorDQorCUFWTV9ERUJVR19USU1FX0ZMQUcgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDIwMDAwMDAwMCwNCisNCisJLy8gRXhlY3V0YWJsZSBDb21wb25lbnQuLi4NCisJQVZNX0RFQlVHX0VYRUNVVEFCTEVfRkxBRyAgICAgICAgICAgICAgID0gMHgwMDAwMDAxMDAwMDAwMDAwLA0KKwlBVk1fREVCVUdfUFJJTUlUSVZFX0ZMQUcgICAgICAgICAgICAgICAgPSAweDAwMDAwMDIwMDAwMDAwMDAsDQorCUFWTV9ERUJVR19BQ1RJVklUWV9GTEFHICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwNDAwMDAwMDAwMCwNCisJQVZNX0RFQlVHX1JPVVRJTkVfRkxBRyAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDA4MDAwMDAwMDAwLA0KKwlBVk1fREVCVUdfVFJBTlNJVElPTl9GTEFHICAgICAgICAgICAgICAgPSAweDAwMDAwMTAwMDAwMDAwMDAsDQorCUFWTV9ERUJVR19NQUNISU5FX0ZMQUcgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAyMDAwMDAwMDAwMCwNCisJQVZNX0RFQlVHX1NUQVRFTUFDSElORV9GTEFHICAgICAgICAgICAgID0gMHgwMDAwMDQwMDAwMDAwMDAwLA0KKw0KKwkvLyBPdGhlcnM6IFtRdWFsaWZpZWRdTmFtZUlELCBSZWZDb3VudCwgLi4uDQorCUFWTV9ERUJVR19OQU1FX0lEX0ZMQUcgICAgICAgICAgICAgICAgICA9IDB4MDAwMDEwMDAwMDAwMDAwMCwNCisJQVZNX0RFQlVHX1FVQUxJRklFRF9OQU1FX0lEX0ZMQUcgICAgICAgID0gMHgwMDAwMjAwMDAwMDAwMDAwLA0KKwlBVk1fREVCVUdfRlVMTFlfUVVBTElGSUVEX05BTUVfSURfRkxBRyAgPSAweDAwMDA0MDAwMDAwMDAwMDAsDQorDQorCUFWTV9ERUJVR19DQVNfRkxBRyAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMTAwMDAwMDAwMDAwMCwNCisJQVZNX0RFQlVHX1JFRFVOREFOQ0VfRkxBRyAgICAgICAgICAgICAgID0gMHgwMDAyMDAwMDAwMDAwMDAwLA0KKw0KKwlBVk1fREVCVUdfUkVGRVJFTkNFX0NPVU5USU5HX0ZMQUcgICAgICAgPSAweDAwMTAwMDAwMDAwMDAwMDAsDQorDQorCS8vIEdvZCBNb2RlDQorCUFWTV9ERUJVR19BTExfRkxBRyAgICAgICAgICAgICAgICAgICAgICA9IDB4RkZGRkZGRkZGRkZGRkZGRiwNCisJQVZNX0RFQlVHX0dPRF9NT0RFX0ZMQUcgICAgICAgICAgICAgICAgID0gMHhGRkZGRkZGRkZGRkZGRkZGDQorDQorfTsNCisNCisNCisvKioNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIEFWTSBERUJVRyBDT05GSUdVUkUNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqLw0KKw0KK3ZvaWQgYXZtX3NldERlYnVnTGV2ZWwoc3RkOjpzdHJpbmcgc3RyRGVidWdMZXZlbCk7DQorDQordm9pZCBhdm1fdW5zZXREZWJ1Z0xldmVsKHN0ZDo6c3RyaW5nIHN0ckRlYnVnTGV2ZWwpOw0KKw0KK3N0ZDo6c3RyaW5nIGF2bV9zdHJEZWJ1Z0xldmVsKCk7DQorDQorDQoraW5saW5lIGJvb2wgYXZtX2hhc0RlYnVnRmxhZygpDQorew0KKwlyZXR1cm4oIF9BVk1fREVCVUdfRkxBR18gIT0gQVZNX0RFQlVHX05PVEhJTkdfRkxBRyApOw0KK30NCisNCit2b2lkIGF2bV9zZXREZWJ1Z0ZsYWcoc3RkOjpzdHJpbmcgc3RyRGVidWdGbGFnKTsNCisNCit2b2lkIGF2bV91bnNldERlYnVnRmxhZyhzdGQ6OnN0cmluZyBzdHJEZWJ1Z0ZsYWcpOw0KKw0KK3N0ZDo6c3RyaW5nIGF2bV9zdHJEZWJ1Z0ZsYWcoY29uc3Qgc3RkOjpzdHJpbmcgJiBzZXAgPSAiICIpOw0KKw0KKw0KKw0KK30NCisNCisNCisjZW5kaWYgLyogQVZNX0RFQlVHX0hfICovDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvdXRpbC9hdm1faW5qZWN0b3IuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvdXRpbC9hdm1faW5qZWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNWI0OWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy91dGlsL2F2bV9pbmplY3Rvci5jcHAKQEAgLTAsMCArMSwyMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDE2IGp1aWwuIDIwMDkKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImF2bV9pbmplY3Rvci5oIgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy91dGlsL2F2bV9pbmplY3Rvci5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvdXRpbC9hdm1faW5qZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTQwZGY1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvdXRpbC9hdm1faW5qZWN0b3IuaApAQCAtMCwwICsxLDk3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTYganVpbC4gMjAwOQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEFWTV9JTkpFQ1RPUl9IXworI2RlZmluZSBBVk1fSU5KRUNUT1JfSF8KKworI2luY2x1ZGUgPGJhc2UvSW5zdGFuY2VDb3VudGVyLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisvKioKKyAqIE1hY3JvIGZvciBpbnN0YW5jZSBjb3VudGVyIG1hbmFnZW1lbnQKKyAqLworI2RlZmluZSBBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIENsYXNzTmFtZSApICBcCisJCXB1YmxpYyBJbnN0YW5jZUNvdW50ZXI8IENsYXNzTmFtZSA+CisKKworLyoqCisgKiBNYWNybyBmb3IgY2xvbmFibGUgb2JqZWN0CisgKi8KK3RlbXBsYXRlPCBjbGFzcyBUID4KK3N0cnVjdCBBdm1DbG9uYWJsZUNsYXNzCit7CisJLy8gREVTVFJVQ1RPUgorCXZpcnR1YWwgfkF2bUNsb25hYmxlQ2xhc3MoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJLy8gQ0xPTkUgQVBJCisJaW5saW5lIHZpcnR1YWwgVCAqIGNsb25lKCkgY29uc3QKKwl7CisJCXJldHVybiggbmV3IFQoKnRoaXMpICk7CisJfQorCit9OworCisjZGVmaW5lIEFWTV9JTkpFQ1RfQ0xPTkFCTEVfQ0xBU1MoIENsYXNzTmFtZSApICBcCisJCXB1YmxpYyBBdm1DbG9uYWJsZUNsYXNzPCBDbGFzc05hbWUgPgorCisKKy8qKgorICogTWFjcm8gZm9yIHVuY2xvbmFibGUgb2JqZWN0CisgKi8KK3RlbXBsYXRlPCBjbGFzcyBUID4KK3N0cnVjdCBBdm1VbmNsb25hYmxlQ2xhc3MKK3sKKwkvLyBERVNUUlVDVE9SCisJdmlydHVhbCB+QXZtVW5jbG9uYWJsZUNsYXNzKCkKKwl7CisJCS8vISEgTk9USElORworCX0KKworCS8vIENMT05FIEFQSQorCWlubGluZSB2aXJ0dWFsIFQgKiBjbG9uZSgpIGNvbnN0CisJeworCQlyZXR1cm4oIGNvbnN0X2Nhc3Q8IFQgKiA+KHRoaXMpICk7CisJfQorCit9OworCisjZGVmaW5lIEFWTV9JTkpFQ1RfVU5DTE9OQUJMRV9DTEFTUyggQ2xhc3NOYW1lICkgIFwKKwkJcHVibGljIEF2bVVuY2xvbmFibGVDbGFzczwgQ2xhc3NOYW1lID4KKworCisKKy8qKgorICogR2VuZXJpY3MgTWFjcm9zCisgKi8KKyNkZWZpbmUgQVZNX0lOSkVDVF9DTE9OQUJMRV9JTlNUQU5DRV9DT1VOVEVSKCBDbGFzc05hbWUgKSAgXAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIENsYXNzTmFtZSApICwgIFwKKwkJQVZNX0lOSkVDVF9DTE9OQUJMRV9DTEFTUyggQ2xhc3NOYW1lICkKKworCisjZGVmaW5lIEFWTV9JTkpFQ1RfVU5DTE9OQUJMRV9JTlNUQU5DRV9DT1VOVEVSKCBDbGFzc05hbWUgKSAgXAorCQlBVk1fSU5KRUNUX0lOU1RBTkNFX0NPVU5URVJfQ0xBU1MoIENsYXNzTmFtZSApICwgIFwKKwkJQVZNX0lOSkVDVF9VTkNMT05BQkxFX0NMQVNTKCBDbGFzc05hbWUgKQorCisKKworfQorCisjZW5kaWYgLyogQVZNX0lOSkVDVE9SX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy91dGlsL2F2bV9udW1lcmljLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3V0aWwvYXZtX251bWVyaWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExN2M1YTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy91dGlsL2F2bV9udW1lcmljLmNwcApAQCAtMCwwICsxLDIyMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDE2IG1hcnMgMjAxMAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiYXZtX251bWVyaWMuaCIKKworI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgPGJvb3N0L3JhbmRvbS5ocHA+CisKK25hbWVzcGFjZSBzZXAKK3sKKworCithdm1fdWludGVnZXJfdCBSQU5ET006Omdlbl91aW50ZWdlcihhdm1fdWludGVnZXJfdCBtaW4sIGF2bV91aW50ZWdlcl90IG1heCkKK3sKKwlpZiggbWluIDwgbWF4ICkKKwl7CisJCS8vIEluaXRpYWxpemUgYSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KKwkJLy8gQm9vc3QgcHJvdmlkZXMgYSBidW5jaCBvZiB0aGVzZSwgbm90ZSB0aGF0IHNvbWUgb2YgdGhlbSBhcmUgbm90IG1lYW50CisJCS8vIGZvciBkaXJlY3QgdXNlciB1c2FnZSBhbmQgeW91IHNob3VsZCBpbnN0ZWFkIHVzZSBhIHNwZWNpYWxpemF0aW9uCisJCS8vIChmb3IgZXhhbXBsZSwgZG9uJ3QgdXNlIGxpbmVhcl9jb25ncnVlbnRpYWwgYW5kIHVzZSBtaW5zdGRfcmFuZCBvcgorCQkvLyBtaW5zdGRfcmFuZDAgaW5zdGVhZCkKKworCQkvLyBUaGlzIGNvbnN0cnVjdG9yIHNlZWRzIHRoZSBnZW5lcmF0b3Igd2l0aCB0aGUgY3VycmVudCB0aW1lLgorCQkvLyBBcyBtZW50aW9uZWQgaW4gQm9vc3QncyBzYW1wbGUgcHJvZ3JhbSwgdGltZSgwKSBpcyBub3QgYSBncmVhdCBzZWVkLAorCQkvLyBidXQgeW91IGNhbiBwcm9iYWJseSBnZXQgYXdheSB3aXRoIGl0IGZvciBtb3N0IHNpdHVhdGlvbnMuCisJCS8vIENvbnNpZGVyIHVzaW5nIG1vcmUgcHJlY2lzZSB0aW1lcnMgc3VjaCBhcyBnZXR0aW1lb2ZkYXkgb24gKm5peCBvcgorCQkvLyBHZXRUaWNrQ291bnQvdGltZUdldFRpbWUvUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIgb24gV2luZG93cy4KKwkJYm9vc3Q6Om10MTk5MzcgcmFuZEdlbihzdGF0aWNfY2FzdDwgYXZtX3VpbnQ2NF90ID4oY2xvY2soKSkpOworCisJCS8vIE5vdyB3ZSBzZXQgdXAgYSBkaXN0cmlidXRpb24uIEJvb3N0IHByb3ZpZGVzIGEgYnVuY2ggb2YgdGhlc2UgYXMgd2VsbC4KKwkJLy8gVGhpcyBpcyB0aGUgcHJlZmVycmVkIHdheSB0byBnZW5lcmF0ZSBudW1iZXJzIGluIGEgY2VydGFpbiByYW5nZS4KKwkJYm9vc3Q6OnVuaWZvcm1faW50PGF2bV91aW50ZWdlcl90PiB1SW50RGlzdChtaW4sIG1heCk7CisKKwkJLy8gRmluYWxseSwgZGVjbGFyZSBhIHZhcmlhdGVfZ2VuZXJhdG9yIHdoaWNoIG1hcHMgdGhlIHJhbmRvbSBudW1iZXIKKwkJLy8gZ2VuZXJhdG9yIGFuZCB0aGUgZGlzdHJpYnV0aW9uIHRvZ2V0aGVyLiBUaGlzIHZhcmlhdGVfZ2VuZXJhdG9yCisJCS8vIGlzIHVzYWJsZSBsaWtlIGEgZnVuY3Rpb24gY2FsbC4KKwkJYm9vc3Q6OnZhcmlhdGVfZ2VuZXJhdG9yPCBib29zdDo6bXQxOTkzNyAmICwKKwkJCQlib29zdDo6dW5pZm9ybV9pbnQ8YXZtX3VpbnRlZ2VyX3Q+ID4gR2V0UmFuZChyYW5kR2VuLCB1SW50RGlzdCk7CisKKwkJLy8gR2VuZXJhdGUgYSByYW5kb20gbnVtYmVyCisJCXJldHVybiggR2V0UmFuZCgpICk7CisJfQorCWVsc2UvLyBpZiggbWluID09IG1heCApCisJeworCQlyZXR1cm4oIG1pbiApOworCX0KK30KKworCithdm1faW50ZWdlcl90IFJBTkRPTTo6Z2VuX2ludGVnZXIoYXZtX2ludGVnZXJfdCBtaW4sIGF2bV9pbnRlZ2VyX3QgbWF4KQoreworCWlmKCBtaW4gPCBtYXggKQorCXsKKwkJLy8gSW5pdGlhbGl6ZSBhIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorCQkvLyBCb29zdCBwcm92aWRlcyBhIGJ1bmNoIG9mIHRoZXNlLCBub3RlIHRoYXQgc29tZSBvZiB0aGVtIGFyZSBub3QgbWVhbnQKKwkJLy8gZm9yIGRpcmVjdCB1c2VyIHVzYWdlIGFuZCB5b3Ugc2hvdWxkIGluc3RlYWQgdXNlIGEgc3BlY2lhbGl6YXRpb24KKwkJLy8gKGZvciBleGFtcGxlLCBkb24ndCB1c2UgbGluZWFyX2NvbmdydWVudGlhbCBhbmQgdXNlIG1pbnN0ZF9yYW5kIG9yCisJCS8vIG1pbnN0ZF9yYW5kMCBpbnN0ZWFkKQorCisJCS8vIFRoaXMgY29uc3RydWN0b3Igc2VlZHMgdGhlIGdlbmVyYXRvciB3aXRoIHRoZSBjdXJyZW50IHRpbWUuCisJCS8vIEFzIG1lbnRpb25lZCBpbiBCb29zdCdzIHNhbXBsZSBwcm9ncmFtLCB0aW1lKDApIGlzIG5vdCBhIGdyZWF0IHNlZWQsCisJCS8vIGJ1dCB5b3UgY2FuIHByb2JhYmx5IGdldCBhd2F5IHdpdGggaXQgZm9yIG1vc3Qgc2l0dWF0aW9ucy4KKwkJLy8gQ29uc2lkZXIgdXNpbmcgbW9yZSBwcmVjaXNlIHRpbWVycyBzdWNoIGFzIGdldHRpbWVvZmRheSBvbiAqbml4IG9yCisJCS8vIEdldFRpY2tDb3VudC90aW1lR2V0VGltZS9RdWVyeVBlcmZvcm1hbmNlQ291bnRlciBvbiBXaW5kb3dzLgorCQlib29zdDo6bXQxOTkzNyByYW5kR2VuKHN0YXRpY19jYXN0PCBhdm1fdWludDY0X3QgPihjbG9jaygpKSk7CisKKwkJLy8gTm93IHdlIHNldCB1cCBhIGRpc3RyaWJ1dGlvbi4gQm9vc3QgcHJvdmlkZXMgYSBidW5jaCBvZiB0aGVzZSBhcyB3ZWxsLgorCQkvLyBUaGlzIGlzIHRoZSBwcmVmZXJyZWQgd2F5IHRvIGdlbmVyYXRlIG51bWJlcnMgaW4gYSBjZXJ0YWluIHJhbmdlLgorCQlib29zdDo6dW5pZm9ybV9pbnQ8YXZtX2ludGVnZXJfdD4gdUludERpc3QobWluLCBtYXgpOworCisJCS8vIEZpbmFsbHksIGRlY2xhcmUgYSB2YXJpYXRlX2dlbmVyYXRvciB3aGljaCBtYXBzIHRoZSByYW5kb20gbnVtYmVyCisJCS8vIGdlbmVyYXRvciBhbmQgdGhlIGRpc3RyaWJ1dGlvbiB0b2dldGhlci4gVGhpcyB2YXJpYXRlX2dlbmVyYXRvcgorCQkvLyBpcyB1c2FibGUgbGlrZSBhIGZ1bmN0aW9uIGNhbGwuCisJCWJvb3N0Ojp2YXJpYXRlX2dlbmVyYXRvcjwgYm9vc3Q6Om10MTk5MzcgJiAsCisJCQkJYm9vc3Q6OnVuaWZvcm1faW50PGF2bV9pbnRlZ2VyX3Q+ID4gR2V0UmFuZChyYW5kR2VuLCB1SW50RGlzdCk7CisKKwkJLy8gR2VuZXJhdGUgYSByYW5kb20gbnVtYmVyCisJCXJldHVybiggR2V0UmFuZCgpICk7CisJfQorCWVsc2UvLyBpZiggbWluID09IG1heCApCisJeworCQlyZXR1cm4oIG1pbiApOworCX0KK30KKworCisKK2F2bV91aW50MzJfdCBSQU5ET006Omdlbl91aW50KGF2bV91aW50MzJfdCBtaW4sIGF2bV91aW50MzJfdCBtYXgpCit7CisJaWYoIG1pbiA8IG1heCApCisJeworCQkvLyBJbml0aWFsaXplIGEgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisJCS8vIEJvb3N0IHByb3ZpZGVzIGEgYnVuY2ggb2YgdGhlc2UsIG5vdGUgdGhhdCBzb21lIG9mIHRoZW0gYXJlIG5vdCBtZWFudAorCQkvLyBmb3IgZGlyZWN0IHVzZXIgdXNhZ2UgYW5kIHlvdSBzaG91bGQgaW5zdGVhZCB1c2UgYSBzcGVjaWFsaXphdGlvbgorCQkvLyAoZm9yIGV4YW1wbGUsIGRvbid0IHVzZSBsaW5lYXJfY29uZ3J1ZW50aWFsIGFuZCB1c2UgbWluc3RkX3JhbmQgb3IKKwkJLy8gbWluc3RkX3JhbmQwIGluc3RlYWQpCisKKwkJLy8gVGhpcyBjb25zdHJ1Y3RvciBzZWVkcyB0aGUgZ2VuZXJhdG9yIHdpdGggdGhlIGN1cnJlbnQgdGltZS4KKwkJLy8gQXMgbWVudGlvbmVkIGluIEJvb3N0J3Mgc2FtcGxlIHByb2dyYW0sIHRpbWUoMCkgaXMgbm90IGEgZ3JlYXQgc2VlZCwKKwkJLy8gYnV0IHlvdSBjYW4gcHJvYmFibHkgZ2V0IGF3YXkgd2l0aCBpdCBmb3IgbW9zdCBzaXR1YXRpb25zLgorCQkvLyBDb25zaWRlciB1c2luZyBtb3JlIHByZWNpc2UgdGltZXJzIHN1Y2ggYXMgZ2V0dGltZW9mZGF5IG9uICpuaXggb3IKKwkJLy8gR2V0VGlja0NvdW50L3RpbWVHZXRUaW1lL1F1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyIG9uIFdpbmRvd3MuCisJCWJvb3N0OjptdDE5OTM3IHJhbmRHZW4oc3RhdGljX2Nhc3Q8IGF2bV91aW50NjRfdCA+KGNsb2NrKCkpKTsKKworCQkvLyBOb3cgd2Ugc2V0IHVwIGEgZGlzdHJpYnV0aW9uLiBCb29zdCBwcm92aWRlcyBhIGJ1bmNoIG9mIHRoZXNlIGFzIHdlbGwuCisJCS8vIFRoaXMgaXMgdGhlIHByZWZlcnJlZCB3YXkgdG8gZ2VuZXJhdGUgbnVtYmVycyBpbiBhIGNlcnRhaW4gcmFuZ2UuCisJCWJvb3N0Ojp1bmlmb3JtX2ludDxhdm1fdWludDMyX3Q+IHVJbnREaXN0KG1pbiwgbWF4KTsKKworCQkvLyBGaW5hbGx5LCBkZWNsYXJlIGEgdmFyaWF0ZV9nZW5lcmF0b3Igd2hpY2ggbWFwcyB0aGUgcmFuZG9tIG51bWJlcgorCQkvLyBnZW5lcmF0b3IgYW5kIHRoZSBkaXN0cmlidXRpb24gdG9nZXRoZXIuIFRoaXMgdmFyaWF0ZV9nZW5lcmF0b3IKKwkJLy8gaXMgdXNhYmxlIGxpa2UgYSBmdW5jdGlvbiBjYWxsLgorCQlib29zdDo6dmFyaWF0ZV9nZW5lcmF0b3I8IGJvb3N0OjptdDE5OTM3ICYgLAorCQkJCWJvb3N0Ojp1bmlmb3JtX2ludDxhdm1fdWludDMyX3Q+ID4gR2V0UmFuZChyYW5kR2VuLCB1SW50RGlzdCk7CisKKwkJLy8gR2VuZXJhdGUgYSByYW5kb20gbnVtYmVyCisJCXJldHVybiggR2V0UmFuZCgpICk7CisJfQorCWVsc2UvLyBpZiggbWluID09IG1heCApCisJeworCQlyZXR1cm4oIG1pbiApOworCX0KK30KKworCithdm1faW50MzJfdCBSQU5ET006Omdlbl9pbnQoYXZtX2ludDMyX3QgbWluLCBhdm1faW50MzJfdCBtYXgpCit7CisJaWYoIG1pbiA8IG1heCApCisJeworCQkvLyBJbml0aWFsaXplIGEgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisJCS8vIEJvb3N0IHByb3ZpZGVzIGEgYnVuY2ggb2YgdGhlc2UsIG5vdGUgdGhhdCBzb21lIG9mIHRoZW0gYXJlIG5vdCBtZWFudAorCQkvLyBmb3IgZGlyZWN0IHVzZXIgdXNhZ2UgYW5kIHlvdSBzaG91bGQgaW5zdGVhZCB1c2UgYSBzcGVjaWFsaXphdGlvbgorCQkvLyAoZm9yIGV4YW1wbGUsIGRvbid0IHVzZSBsaW5lYXJfY29uZ3J1ZW50aWFsIGFuZCB1c2UgbWluc3RkX3JhbmQgb3IKKwkJLy8gbWluc3RkX3JhbmQwIGluc3RlYWQpCisKKwkJLy8gVGhpcyBjb25zdHJ1Y3RvciBzZWVkcyB0aGUgZ2VuZXJhdG9yIHdpdGggdGhlIGN1cnJlbnQgdGltZS4KKwkJLy8gQXMgbWVudGlvbmVkIGluIEJvb3N0J3Mgc2FtcGxlIHByb2dyYW0sIHRpbWUoMCkgaXMgbm90IGEgZ3JlYXQgc2VlZCwKKwkJLy8gYnV0IHlvdSBjYW4gcHJvYmFibHkgZ2V0IGF3YXkgd2l0aCBpdCBmb3IgbW9zdCBzaXR1YXRpb25zLgorCQkvLyBDb25zaWRlciB1c2luZyBtb3JlIHByZWNpc2UgdGltZXJzIHN1Y2ggYXMgZ2V0dGltZW9mZGF5IG9uICpuaXggb3IKKwkJLy8gR2V0VGlja0NvdW50L3RpbWVHZXRUaW1lL1F1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyIG9uIFdpbmRvd3MuCisJCWJvb3N0OjptdDE5OTM3IHJhbmRHZW4oc3RhdGljX2Nhc3Q8IGF2bV91aW50NjRfdCA+KGNsb2NrKCkpKTsKKworCQkvLyBOb3cgd2Ugc2V0IHVwIGEgZGlzdHJpYnV0aW9uLiBCb29zdCBwcm92aWRlcyBhIGJ1bmNoIG9mIHRoZXNlIGFzIHdlbGwuCisJCS8vIFRoaXMgaXMgdGhlIHByZWZlcnJlZCB3YXkgdG8gZ2VuZXJhdGUgbnVtYmVycyBpbiBhIGNlcnRhaW4gcmFuZ2UuCisJCWJvb3N0Ojp1bmlmb3JtX2ludDxhdm1faW50MzJfdD4gdUludERpc3QobWluLCBtYXgpOworCisJCS8vIEZpbmFsbHksIGRlY2xhcmUgYSB2YXJpYXRlX2dlbmVyYXRvciB3aGljaCBtYXBzIHRoZSByYW5kb20gbnVtYmVyCisJCS8vIGdlbmVyYXRvciBhbmQgdGhlIGRpc3RyaWJ1dGlvbiB0b2dldGhlci4gVGhpcyB2YXJpYXRlX2dlbmVyYXRvcgorCQkvLyBpcyB1c2FibGUgbGlrZSBhIGZ1bmN0aW9uIGNhbGwuCisJCWJvb3N0Ojp2YXJpYXRlX2dlbmVyYXRvcjwgYm9vc3Q6Om10MTk5MzcgJiAsCisJCQkJYm9vc3Q6OnVuaWZvcm1faW50PGF2bV9pbnQzMl90PiA+IEdldFJhbmQocmFuZEdlbiwgdUludERpc3QpOworCisJCS8vIEdlbmVyYXRlIGEgcmFuZG9tIG51bWJlcgorCQlyZXR1cm4oIEdldFJhbmQoKSApOworCX0KKwllbHNlLy8gaWYoIG1pbiA9PSBtYXggKQorCXsKKwkJcmV0dXJuKCBtaW4gKTsKKwl9Cit9CisKKworCitkb3VibGUgUkFORE9NOjpnZW5fZG91YmxlKGRvdWJsZSBtaW4sIGRvdWJsZSBtYXgsIGF2bV91aW50NjRfdCBwcmV2aW91cykKK3sKKwlpZiggbWluIDwgbWF4ICkKKwl7CisJCS8vIEluaXRpYWxpemUgYSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KKwkJLy8gQm9vc3QgcHJvdmlkZXMgYSBidW5jaCBvZiB0aGVzZSwgbm90ZSB0aGF0IHNvbWUgb2YgdGhlbSBhcmUgbm90IG1lYW50CisJCS8vIGZvciBkaXJlY3QgdXNlciB1c2FnZSBhbmQgeW91IHNob3VsZCBpbnN0ZWFkIHVzZSBhIHNwZWNpYWxpemF0aW9uCisJCS8vIChmb3IgZXhhbXBsZSwgZG9uJ3QgdXNlIGxpbmVhcl9jb25ncnVlbnRpYWwgYW5kIHVzZSBtaW5zdGRfcmFuZCBvcgorCQkvLyBtaW5zdGRfcmFuZDAgaW5zdGVhZCkKKworCQkvLyBUaGlzIGNvbnN0cnVjdG9yIHNlZWRzIHRoZSBnZW5lcmF0b3Igd2l0aCB0aGUgY3VycmVudCB0aW1lLgorCQkvLyBBcyBtZW50aW9uZWQgaW4gQm9vc3QncyBzYW1wbGUgcHJvZ3JhbSwgdGltZSgwKSBpcyBub3QgYSBncmVhdCBzZWVkLAorCQkvLyBidXQgeW91IGNhbiBwcm9iYWJseSBnZXQgYXdheSB3aXRoIGl0IGZvciBtb3N0IHNpdHVhdGlvbnMuCisJCS8vIENvbnNpZGVyIHVzaW5nIG1vcmUgcHJlY2lzZSB0aW1lcnMgc3VjaCBhcyBnZXR0aW1lb2ZkYXkgb24gKm5peCBvcgorCQkvLyBHZXRUaWNrQ291bnQvdGltZUdldFRpbWUvUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIgb24gV2luZG93cy4KKworLy8JCWJvb3N0OjptdDE5OTM3IHJhbmRHZW4oc3RkOjp0aW1lKDApKTsKKy8vCQlBVk1fRkxPQVRfVElNRV9UWVBFIHRwczAgPSBFeGVjdXRpb25UaW1lOjpnZXRDbG9jaygpOworLy8JCUFWTV9PU19UUkFDRSA8PCBPU19GTE9BVF9QUkVDSVNJT04gPDwgIlZhbGV1ciB0cHMwID0gIiA8PCB0cHMwCisvLwkJCQk8PCAiIGNsb2NrID0gIiA8PCBzdGF0aWNfY2FzdDxsb25nIHVuc2lnbmVkIGludD4oY2xvY2soKSkKKy8vCQkJCTw8IHN0ZDo6ZW5kbDsKKy8vCQl1bnNpZ25lZCBpbnQgdHBzID0gKHVuc2lnbmVkIGludCl0cHMwOworLy8JCUFWTV9PU19UUkFDRSA8PCAiVmFsZXVyIHRwcyA9ICIgPDwgdHBzIDw8IHN0ZDo6ZW5kbDsKKwkJYm9vc3Q6Om10MTk5MzcgcmFuZEdlbihzdGF0aWNfY2FzdDwgYXZtX3VpbnQ2NF90ID4oY2xvY2soKSkgKyBwcmV2aW91cyk7CisKKwkJLy8gTm93IHdlIHNldCB1cCBhIGRpc3RyaWJ1dGlvbi4gQm9vc3QgcHJvdmlkZXMgYSBidW5jaCBvZiB0aGVzZSBhcyB3ZWxsLgorCQkvLyBUaGlzIGlzIHRoZSBwcmVmZXJyZWQgd2F5IHRvIGdlbmVyYXRlIG51bWJlcnMgaW4gYSBjZXJ0YWluIHJhbmdlLgorCQlib29zdDo6dW5pZm9ybV9yZWFsPGRvdWJsZT4gdVJlYWxEaXN0KG1pbiwgbWF4KTsKKworCQkvLyBGaW5hbGx5LCBkZWNsYXJlIGEgdmFyaWF0ZV9nZW5lcmF0b3Igd2hpY2ggbWFwcyB0aGUgcmFuZG9tIG51bWJlcgorCQkvLyBnZW5lcmF0b3IgYW5kIHRoZSBkaXN0cmlidXRpb24gdG9nZXRoZXIuIFRoaXMgdmFyaWF0ZV9nZW5lcmF0b3IKKwkJLy8gaXMgdXNhYmxlIGxpa2UgYSBmdW5jdGlvbiBjYWxsLgorCQlib29zdDo6dmFyaWF0ZV9nZW5lcmF0b3I8IGJvb3N0OjptdDE5OTM3ICYgLAorCQkJCWJvb3N0Ojp1bmlmb3JtX3JlYWw8ZG91YmxlPiA+IEdldFJhbmQocmFuZEdlbiwgdVJlYWxEaXN0KTsKKworCQkvLyBHZW5lcmF0ZSBhIHJhbmRvbSBudW1iZXIKKwkJcmV0dXJuKCBHZXRSYW5kKCkgKTsKKwl9CisJZWxzZS8vIGlmKCBtaW4gPT0gbWF4ICkKKwl7CisJCXJldHVybiggbWluICk7CisJfQorfQorCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3V0aWwvYXZtX251bWVyaWMuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3V0aWwvYXZtX251bWVyaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOThhMDAxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvdXRpbC9hdm1fbnVtZXJpYy5oCkBAIC0wLDAgKzEsMjU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMTYgbWFycyAyMDEwCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQVZNX05VTUVSSUNfSF8KKyNkZWZpbmUgQVZNX05VTUVSSUNfSF8KKworI2luY2x1ZGUgPGNzdGRkZWY+CisKKyNpbmNsdWRlIDxsaW1pdHM+CisKKy8vI2luY2x1ZGUgPGNpbnR0eXBlcz4KKyNkZWZpbmUgX19TVERDX0ZPUk1BVF9NQUNST1MKKy8vI2luY2x1ZGUgPGludHR5cGVzLmg+CisjdW5kZWYgX19TVERDX0ZPUk1BVF9NQUNST1MKKworI2luY2x1ZGUgPHN0ZGludC5oPgorLy8/I2luY2x1ZGUgPGNzdGRpbnQ+CisKKworCisjaWZkZWYgX19BVk1fTUlOR1dfXyAvKiBORUVEIElOVDY0X1QgT1ZFUkxPQURTICovCisKKyNkZWZpbmUgX0FWTV9ORUVEX0lOVDY0X1RfT1ZFUkxPQURTXworCisjZWxzZSAvLyNpZmRlZiBfX0FWTV9MSU5VWF9fCisKKyN1bmRlZiBfQVZNX05FRURfSU5UNjRfVF9PVkVSTE9BRFNfCisKKyNlbmRpZgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvKiBJbnRlZ2VycyBvZiB0eXBlIGNoYXIgaGF2ZSA4IGJpdHMuICovCisjZGVmaW5lIGF2bV9jaGFyX2JpdHNpemUgICAgICAgIDgKKworLyogSW50ZWdlcnMgb2YgdHlwZSBzaG9ydCBoYXZlIDE2IGJpdHMuICovCisjZGVmaW5lIGF2bV9zaG9ydF9iaXRzaXplICAgICAgMTYKKworLyogSW50ZWdlcnMgb2YgdHlwZSBpbnQgaGF2ZSAzMiBiaXRzLiAqLworI2RlZmluZSBhdm1faW50X2JpdHNpemUgICAgICAgIDMyCisKKy8qIEludGVnZXJzIG9mIHR5cGUgbG9uZyBoYXZlIDMyIG9yIDY0IGJpdHMuICovCisvLyNkZWZpbmUgYXZtX2xvbmdfYml0c2l6ZSAgICAgICAzMgorCisvKiBJbnRlZ2VycyBvZiB0eXBlIGxvbmcgbG9uZyBoYXZlIDY0IGJpdHMuICovCisjZGVmaW5lIGF2bV9sb25nX2xvbmdfYml0c2l6ZSAgNjQKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQVZNIE5VTUVSSUMgVFlQRQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3R5cGVkZWYgICBpbnQ4X3QgICAgICAgYXZtX2ludDhfdDsKK3R5cGVkZWYgIHVpbnQ4X3QgICAgICAgYXZtX3VpbnQ4X3Q7CisKK3R5cGVkZWYgICBpbnQxNl90ICAgICAgYXZtX2ludDE2X3Q7Cit0eXBlZGVmICB1aW50MTZfdCAgICAgIGF2bV91aW50MTZfdDsKKwordHlwZWRlZiAgIGludDMyX3QgICAgICBhdm1faW50MzJfdDsKK3R5cGVkZWYgIHVpbnQzMl90ICAgICAgYXZtX3VpbnQzMl90OworCit0eXBlZGVmICB1aW50MzJfdCAgICAgIGF2bV9vZmZzZXRfdDsKKwordHlwZWRlZiAgIGludDY0X3QgICAgICBhdm1faW50NjRfdDsKK3R5cGVkZWYgIHVpbnQ2NF90ICAgICAgYXZtX3VpbnQ2NF90OworCit0eXBlZGVmICAgaW50NjRfdCAgICAgIGF2bV9pbnRlZ2VyX3Q7Cit0eXBlZGVmICB1aW50NjRfdCAgICAgIGF2bV91aW50ZWdlcl90OworCit0eXBlZGVmICBkb3VibGUgICAgICAgIGF2bV9mbG9hdF90OworCit0eXBlZGVmICBsb25nIGRvdWJsZSAgIGF2bV9yZWFsX3Q7CisKKwordHlwZWRlZiAgIGludDY0X3QgICAgICBhdm1faXRpbWVfdDsKK3R5cGVkZWYgIHVpbnQ2NF90ICAgICAgYXZtX3VpdGltZV90OworCit0eXBlZGVmICBsb25nIGRvdWJsZSAgIGF2bV9mdGltZV90OworCisKKy8qKgorICogVGhlIEFkZHJlc3MgVHlwZQorICovCit0eXBlZGVmICBpbnRwdHJfdCAgICAgIGF2bV9hZGRyZXNzX3Q7CisKKworLyoqCisgKiBUaGUgU2l6ZSBUeXBlCisgKi8KK3R5cGVkZWYgc3RkOjpzaXplX3QgICAgYXZtX3NpemVfdDsKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQVZNIE5VTUVSSUMgTElNSVRTCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBBVk1fTlVNRVJJQ19NQVhfSU5UICAgICAgKCBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpICkKKyNkZWZpbmUgQVZNX05VTUVSSUNfTUlOX0lOVCAgICAgICggc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptaW4oKSApCisKKyNkZWZpbmUgQVZNX05VTUVSSUNfTUFYX1VJTlQgICAgICggc3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZCBpbnQ+OjptYXgoKSApCisjZGVmaW5lIEFWTV9OVU1FUklDX01JTl9VSU5UICAgICAoIHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQgaW50Pjo6bWluKCkgKQorCisKKyNkZWZpbmUgQVZNX05VTUVSSUNfTUFYX09GRlNFVCAgICggc3RkOjpudW1lcmljX2xpbWl0czxzZXA6OmF2bV91aW50ZWdlcl90Pjo6bWF4KCkgKQorI2RlZmluZSBBVk1fTlVNRVJJQ19NSU5fT0ZGU0VUICAgKCBzdGQ6Om51bWVyaWNfbGltaXRzPHNlcDo6YXZtX3VpbnRlZ2VyX3Q+OjptaW4oKSApCisKKworI2RlZmluZSBBVk1fTk9fT0ZGU0VUICAgICAgICAgICAgKCBzdGF0aWNfY2FzdDxzZXA6OmF2bV9vZmZzZXRfdD4oLTEpICkKKworCisjZGVmaW5lIEFWTV9OVU1FUklDX01BWF9MT05HICAgICAoIHN0ZDo6bnVtZXJpY19saW1pdHM8bG9uZz46Om1heCgpICkKKyNkZWZpbmUgQVZNX05VTUVSSUNfTUlOX0xPTkcgICAgICggc3RkOjpudW1lcmljX2xpbWl0czxsb25nPjo6bWluKCkgKQorCisjZGVmaW5lIEFWTV9OVU1FUklDX01BWF9VTE9ORyAgICAoIHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQgbG9uZz46Om1heCgpICkKKyNkZWZpbmUgQVZNX05VTUVSSUNfTUlOX1VMT05HICAgICggc3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZCBsb25nPjo6bWluKCkgKQorCisKKyNkZWZpbmUgQVZNX05VTUVSSUNfTUFYX0lOVDggICAgICggc3RkOjpudW1lcmljX2xpbWl0czxzZXA6OmF2bV9pbnQ4X3Q+OjptYXgoKSApCisjZGVmaW5lIEFWTV9OVU1FUklDX01JTl9JTlQ4ICAgICAoIHN0ZDo6bnVtZXJpY19saW1pdHM8c2VwOjphdm1faW50OF90Pjo6bWluKCkgKQorCisjZGVmaW5lIEFWTV9OVU1FUklDX01BWF9JTlQxNiAgICAoIHN0ZDo6bnVtZXJpY19saW1pdHM8c2VwOjphdm1faW50MTZfdD46Om1heCgpICkKKyNkZWZpbmUgQVZNX05VTUVSSUNfTUlOX0lOVDE2ICAgICggc3RkOjpudW1lcmljX2xpbWl0czxzZXA6OmF2bV9pbnQxNl90Pjo6bWluKCkgKQorCisjZGVmaW5lIEFWTV9OVU1FUklDX01BWF9JTlQzMiAgICAoIHN0ZDo6bnVtZXJpY19saW1pdHM8c2VwOjphdm1faW50MzJfdD46Om1heCgpICkKKyNkZWZpbmUgQVZNX05VTUVSSUNfTUlOX0lOVDMyICAgICggc3RkOjpudW1lcmljX2xpbWl0czxzZXA6OmF2bV9pbnQzMl90Pjo6bWluKCkgKQorCisjZGVmaW5lIEFWTV9OVU1FUklDX01BWF9JTlQ2NCAgICAoIHN0ZDo6bnVtZXJpY19saW1pdHM8c2VwOjphdm1faW50NjRfdD46Om1heCgpICkKKyNkZWZpbmUgQVZNX05VTUVSSUNfTUlOX0lOVDY0ICAgICggc3RkOjpudW1lcmljX2xpbWl0czxzZXA6OmF2bV9pbnQ2NF90Pjo6bWluKCkgKQorCisKKyNkZWZpbmUgQVZNX05VTUVSSUNfTUFYX1VJTlQ4ICAgICggc3RkOjpudW1lcmljX2xpbWl0czxzZXA6OmF2bV91aW50OF90Pjo6bWF4KCkgKQorI2RlZmluZSBBVk1fTlVNRVJJQ19NSU5fVUlOVDggICAgKCBzdGQ6Om51bWVyaWNfbGltaXRzPHNlcDo6YXZtX3VpbnQ4X3Q+OjptaW4oKSApCisKKyNkZWZpbmUgQVZNX05VTUVSSUNfTUFYX1VJTlQxNiAgICggc3RkOjpudW1lcmljX2xpbWl0czxzZXA6OmF2bV91aW50MTZfdD46Om1heCgpICkKKyNkZWZpbmUgQVZNX05VTUVSSUNfTUlOX1VJTlQxNiAgICggc3RkOjpudW1lcmljX2xpbWl0czxzZXA6OmF2bV91aW50MTZfdD46Om1pbigpICkKKworI2RlZmluZSBBVk1fTlVNRVJJQ19NQVhfVUlOVDMyICAgKCBzdGQ6Om51bWVyaWNfbGltaXRzPHNlcDo6YXZtX3VpbnQzMl90Pjo6bWF4KCkgKQorI2RlZmluZSBBVk1fTlVNRVJJQ19NSU5fVUlOVDMyICAgKCBzdGQ6Om51bWVyaWNfbGltaXRzPHNlcDo6YXZtX3VpbnQzMl90Pjo6bWluKCkgKQorCisjZGVmaW5lIEFWTV9OVU1FUklDX01BWF9VSU5UNjQgICAoIHN0ZDo6bnVtZXJpY19saW1pdHM8c2VwOjphdm1fdWludDY0X3Q+OjptYXgoKSApCisjZGVmaW5lIEFWTV9OVU1FUklDX01JTl9VSU5UNjQgICAoIHN0ZDo6bnVtZXJpY19saW1pdHM8c2VwOjphdm1fdWludDY0X3Q+OjptaW4oKSApCisKKworI2RlZmluZSBBVk1fTlVNRVJJQ19NQVhfU0laRV9UICAgKCBzdGQ6Om51bWVyaWNfbGltaXRzPHNlcDo6YXZtX3NpemVfdD46Om1heCgpICkKKyNkZWZpbmUgQVZNX05VTUVSSUNfTUlOX1NJWkVfVCAgICggc3RkOjpudW1lcmljX2xpbWl0czxzZXA6OmF2bV9zaXplX3Q+OjptaW4oKSApCisKKworI2RlZmluZSBBVk1fTlVNRVJJQ19NQVhfSU5URUdFUiAgKCBzdGQ6Om51bWVyaWNfbGltaXRzPHNlcDo6YXZtX2ludGVnZXJfdD46Om1heCgpICkKKyNkZWZpbmUgQVZNX05VTUVSSUNfTUlOX0lOVEVHRVIgICggc3RkOjpudW1lcmljX2xpbWl0czxzZXA6OmF2bV9pbnRlZ2VyX3Q+OjptaW4oKSApCisKKyNkZWZpbmUgQVZNX05VTUVSSUNfTUFYX1VJTlRFR0VSICggc3RkOjpudW1lcmljX2xpbWl0czxzZXA6OmF2bV91aW50ZWdlcl90Pjo6bWF4KCkgKQorI2RlZmluZSBBVk1fTlVNRVJJQ19NSU5fVUlOVEVHRVIgKCBzdGQ6Om51bWVyaWNfbGltaXRzPHNlcDo6YXZtX3VpbnRlZ2VyX3Q+OjptaW4oKSApCisKKworI2RlZmluZSBBVk1fTlVNRVJJQ19NQVhfRkxPQVQgICAgKCBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6bWF4KCkgKQorI2RlZmluZSBBVk1fTlVNRVJJQ19NSU5fRkxPQVQgICAgKCBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6bWluKCkgKQorCisjZGVmaW5lIEFWTV9OVU1FUklDX01BWF9VRkxPQVQgICAoIHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQgZmxvYXQ+OjptYXgoKSApCisjZGVmaW5lIEFWTV9OVU1FUklDX01JTl9VRkxPQVQgICAoIHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQgZmxvYXQ+OjptaW4oKSApCisKKworI2RlZmluZSBBVk1fTlVNRVJJQ19NQVhfRE9VQkxFICAgKCBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46Om1heCgpICkKKyNkZWZpbmUgQVZNX05VTUVSSUNfTUlOX0RPVUJMRSAgICggc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjptaW4oKSApCisKKyNkZWZpbmUgQVZNX05VTUVSSUNfTUFYX1VET1VCTEUgICggc3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZCBkb3VibGU+OjptYXgoKSApCisjZGVmaW5lIEFWTV9OVU1FUklDX01JTl9VRE9VQkxFICAoIHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQgZG91YmxlPjo6bWluKCkgKQorCisKKyNkZWZpbmUgQVZNX05VTUVSSUNfTUFYX0ZMT0FUX1QgICggc3RkOjpudW1lcmljX2xpbWl0czxzZXA6OmF2bV9mbG9hdF90Pjo6bWF4KCkgKQorI2RlZmluZSBBVk1fTlVNRVJJQ19NSU5fRkxPQVRfVCAgKCBzdGQ6Om51bWVyaWNfbGltaXRzPHNlcDo6YXZtX2Zsb2F0X3Q+OjptaW4oKSApCisKKyNkZWZpbmUgQVZNX05VTUVSSUNfTUFYX1JFQUxfVCAgICggc3RkOjpudW1lcmljX2xpbWl0czxzZXA6OmF2bV9yZWFsX3Q+OjptYXgoKSApCisjZGVmaW5lIEFWTV9OVU1FUklDX01JTl9SRUFMX1QgICAoIHN0ZDo6bnVtZXJpY19saW1pdHM8c2VwOjphdm1fcmVhbF90Pjo6bWluKCkgKQorCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBVk0gTlVNRVJJQyBQUkVDSVNJT04KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjZGVmaW5lIE9TX0ZMT0FUX1BSRUNJU0lPTiAgICBcCisJCXN0ZDo6c2V0cHJlY2lzaW9uKCBzdGQ6Om51bWVyaWNfbGltaXRzPCBkb3VibGUgPjo6ZGlnaXRzMTAgKyAxICkKKworI2RlZmluZSBPU19SRUFMX1BSRUNJU0lPTiAgIFwKKwkJc3RkOjpzZXRwcmVjaXNpb24oIHN0ZDo6bnVtZXJpY19saW1pdHM8IGxvbmcgZG91YmxlID46OmRpZ2l0czEwICsgMSApCisKKworI2RlZmluZSBBVk1fTVVNRVJJQ19QUkVDSVNJT04gIDE3CisKKworc3RydWN0IFJBTkRPTQoreworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIE5VTUVSSUMgUkFORE9NIEdFTkVSQVRPUgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCisJaW5saW5lIHN0YXRpYyBjaGFyIGdlbl9jaGFyKCkKKwl7CisJCXJldHVybiggc3RhdGljX2Nhc3Q8IGNoYXIgPiggZ2VuX2ludCgKKwkJCQlzdGQ6Om51bWVyaWNfbGltaXRzPHNlcDo6YXZtX3VpbnQ4X3Q+OjptaW4oKSwKKwkJCQlzdGQ6Om51bWVyaWNfbGltaXRzPHNlcDo6YXZtX3VpbnQ4X3Q+OjptYXgoKSkgKSApOworCX0KKworCisJc3RhdGljIGF2bV91aW50ZWdlcl90IGdlbl91aW50ZWdlcihhdm1fdWludGVnZXJfdCBtaW4sIGF2bV91aW50ZWdlcl90IG1heCk7CisJc3RhdGljIGF2bV9pbnRlZ2VyX3QgZ2VuX2ludGVnZXIoYXZtX2ludGVnZXJfdCBtaW4sIGF2bV9pbnRlZ2VyX3QgbWF4KTsKKworCWlubGluZSBzdGF0aWMgYXZtX2ludGVnZXJfdCBnZW5faW50ZWdlcigpCisJeworCQlyZXR1cm4oIGdlbl9pbnRlZ2VyKEFWTV9OVU1FUklDX01JTl9JTlRFR0VSLCBBVk1fTlVNRVJJQ19NQVhfSU5URUdFUikgKSA7CisJfQorCisJc3RhdGljIGF2bV91aW50MzJfdCBnZW5fdWludChhdm1fdWludDMyX3QgbWluLCBhdm1fdWludDMyX3QgbWF4KTsKKwlzdGF0aWMgYXZtX2ludDMyX3QgZ2VuX2ludChhdm1faW50MzJfdCBtaW4sIGF2bV9pbnQzMl90IG1heCk7CisKKwlpbmxpbmUgc3RhdGljIGF2bV9pbnQzMl90IGdlbl9pbnQoKQorCXsKKwkJcmV0dXJuKCBnZW5faW50KEFWTV9OVU1FUklDX01JTl9JTlQzMiwgQVZNX05VTUVSSUNfTUFYX0lOVDMyKSApIDsKKwl9CisKKwlzdGF0aWMgZG91YmxlIGdlbl9kb3VibGUoZG91YmxlIG1pbiwgZG91YmxlIG1heCwgYXZtX3VpbnQ2NF90IHByZXZpb3VzKTsKKworCWlubGluZSBzdGF0aWMgZG91YmxlIGdlbl9kb3VibGUobG9uZyB1bnNpZ25lZCBpbnQgcHJldmlvdXMpCisJeworCQlyZXR1cm4oIGdlbl9kb3VibGUocHJldmlvdXMpICkgOworCX0KKworfTsKKworCit9CisKKyNlbmRpZiAvKiBBVk1fTlVNRVJJQ19IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvdXRpbC9hdm1fc3RyaW5nLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3V0aWwvYXZtX3N0cmluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZhZDBmOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3V0aWwvYXZtX3N0cmluZy5jcHAKQEAgLTAsMCArMSw5NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDQgYXZyLiAyMDExCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJhdm1fc3RyaW5nLmgiCisKKyNpbmNsdWRlIDxib29zdC9hbGdvcml0aG0vc3RyaW5nLmhwcD4KKyNpbmNsdWRlIDxib29zdC9yZWdleC5ocHA+CisKKworbmFtZXNwYWNlIHNlcCB7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUkVHRVggTUFUQ0ggVEVYVAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIFN0cmluZ1Rvb2xzOjpyZWdleF9tYXRjaCgKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiB0ZXh0LCBjb25zdCBzdGQ6OnN0cmluZyAmIHJlZ2V4KQoreworCXJldHVybiggYm9vc3Q6OnJlZ2V4X21hdGNoKHRleHQsIGJvb3N0OjpyZWdleChyZWdleCkpICk7Cit9CisKK2Jvb2wgU3RyaW5nVG9vbHM6OnJlZ2V4X2ZpbmQoCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgdGV4dCwgY29uc3Qgc3RkOjpzdHJpbmcgJiByZWdleCkKK3sKKwlyZXR1cm4oIGJvb3N0OjpyZWdleF9tYXRjaCh0ZXh0LCBib29zdDo6cmVnZXgoIi4qIiArIHJlZ2V4ICsgIi4qIikpICk7Cit9CisKK2Jvb2wgU3RyaW5nVG9vbHM6OnJlZ2V4X3N0YXJ0c1dpdGgoCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgdGV4dCwgY29uc3Qgc3RkOjpzdHJpbmcgJiByZWdleCkKK3sKKwlyZXR1cm4oIGJvb3N0OjpyZWdleF9tYXRjaCh0ZXh0LCBib29zdDo6cmVnZXgocmVnZXggKyAiLioiKSkgKTsKK30KKworYm9vbCBTdHJpbmdUb29sczo6cmVnZXhfZW5kc1dpdGgoCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgdGV4dCwgY29uc3Qgc3RkOjpzdHJpbmcgJiByZWdleCkKK3sKKwlyZXR1cm4oIGJvb3N0OjpyZWdleF9tYXRjaCh0ZXh0LCBib29zdDo6cmVnZXgoIi4qIiArIHJlZ2V4KSkgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUkVQTEFDRSBURVhUCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIFN0cmluZ1Rvb2xzOjpyZXBsYWNlKHN0ZDo6c3RyaW5nICYgbWFpblN0ciwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBwYXR0ZXJuQSwgY29uc3Qgc3RkOjpzdHJpbmcgJiBwYXR0ZXJuQikKK3sKKwlib29zdDo6cmVwbGFjZV9maXJzdChtYWluU3RyLCBwYXR0ZXJuQSwgcGF0dGVybkIpOworfQorCit2b2lkIFN0cmluZ1Rvb2xzOjpyZXBsYWNlQWxsKHN0ZDo6c3RyaW5nICYgbWFpblN0ciwKKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBwYXR0ZXJuQSwgY29uc3Qgc3RkOjpzdHJpbmcgJiBwYXR0ZXJuQikKK3sKKwlib29zdDo6cmVwbGFjZV9hbGwobWFpblN0ciwgcGF0dGVybkEsIHBhdHRlcm5CKTsKK30KKworc3RkOjpzdHJpbmcgcmVnZXhfcmVwbGFjZShjb25zdCBzdGQ6OnN0cmluZyAmIG1haW5TdHIsCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgcmVnZXhfcGF0dGVybiwgY29uc3Qgc3RkOjpzdHJpbmcgJiBwYXR0ZXJuKQoreworCWJvb3N0OjpyZWdleCByZSggcmVnZXhfcGF0dGVybiApOworCisJcmV0dXJuKCBib29zdDo6cmVnZXhfcmVwbGFjZShtYWluU3RyLCBib29zdDo6cmVnZXgocmVnZXhfcGF0dGVybiksIHBhdHRlcm4pICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEVSQVNFIFRFWFQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgU3RyaW5nVG9vbHM6OmVyYXNlKHN0ZDo6c3RyaW5nICYgbWFpblN0ciwgY29uc3Qgc3RkOjpzdHJpbmcgJiBwYXR0ZXJuKQoreworCWJvb3N0OjplcmFzZV9maXJzdChtYWluU3RyLCBwYXR0ZXJuKTsKK30KKwordm9pZCBTdHJpbmdUb29sczo6ZXJhc2VBbGwoc3RkOjpzdHJpbmcgJiBtYWluU3RyLCBjb25zdCBzdGQ6OnN0cmluZyAmIHBhdHRlcm4pCit7CisJYm9vc3Q6OmVyYXNlX2FsbChtYWluU3RyLCBwYXR0ZXJuKTsKK30KKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy91dGlsL2F2bV9zdHJpbmcuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3V0aWwvYXZtX3N0cmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYmM2M2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy91dGlsL2F2bV9zdHJpbmcuaApAQCAtMCwwICsxLDM1OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDQgYXZyLiAyMDExCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQVZNX1NUUklOR19IXworI2RlZmluZSBBVk1fU1RSSU5HX0hfCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKy8vI2luY2x1ZGUgPGJvb3N0L2FsZ29yaXRobS9zdHJpbmcuaHBwPgorLy8jaW5jbHVkZSA8Ym9vc3QvdG9rZW5pemVyLmhwcD4KKworCituYW1lc3BhY2Ugc2VwCit7CisKKyNkZWZpbmUgU1BBQ0VfQ0hBUlMgICAgICIgXHRcZlx2XG5cciIKKworCisjZGVmaW5lIFFVT1RFTUUoIFggKSAgI1gKKworCisjZGVmaW5lIFNUUklNTChzKSAgcy5zdWJzdHIocy5maW5kX2ZpcnN0X25vdF9vZihTUEFDRV9DSEFSUykpCisKKyNkZWZpbmUgU1RSSU1SKHMpICBzLnN1YnN0cigwLCBzLmZpbmRfbGFzdF9ub3Rfb2YoU1BBQ0VfQ0hBUlMpKQorCisjZGVmaW5lIFNUUklNKHMpICAgcy5zdWJzdHIocy5maW5kX2ZpcnN0X25vdF9vZihTUEFDRV9DSEFSUyksICBcCisJCXMuZmluZF9sYXN0X25vdF9vZihTUEFDRV9DSEFSUykpCisKKworLy8gQ29udmVyc2lvbgordGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorVCBzdHJpbmdfdG8oY29uc3Qgc3RkOjpzdHJpbmcgJiBzdHJJbnB1dCwKKwkJc3RkOjppb3NfYmFzZSAmICgqZikoc3RkOjppb3NfYmFzZSAmKSA9IHN0ZDo6ZGVjKQoreworCXN0ZDo6aXN0cmluZ3N0cmVhbSBpc3Moc3RySW5wdXQpOworCVQgdDsKKworCWlmKCAoIGlzcyA+PiBmID4+IHQgKS5mYWlsKCkgKQorCXsKKy8vCQlBVk1fT1NfRkFUQUxfRVJST1JfRVhJVAorLy8JCQkJPDwgImZhaWw6PiBzZXA6OnN0cmluZ190bzwgVCA+KCAiIDw8IGFWYWx1ZSA8PCAiICkgISEhIgorLy8JCQkJPDwgU0VORF9FWElUOworCX0KKworCXJldHVybiggdCApOworfQorCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+Citib29sIGZyb21fc3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nICYgc3RySW5wdXQsIFQgJiB0LAorCQlzdGQ6Omlvc19iYXNlICYgKCpmKShzdGQ6Omlvc19iYXNlICYpID0gc3RkOjpkZWMpCit7CisJc3RkOjppc3RyaW5nc3RyZWFtIGlzcyhzdHJJbnB1dCk7CisKKwlyZXR1cm4oIG5vdCAoIGlzcyA+PiBmID4+IHQgKS5mYWlsKCkgKTsKK30KKwordGVtcGxhdGU8IHR5cGVuYW1lIFQgLCB0eXBlbmFtZSBVID4KK2Jvb2wgZnJvbV9zdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJiBzdHJJbnB1dCwgVCAmIHQsIGNoYXIgc2VwYXJhdG9yLAorCQlVICYgdSwgc3RkOjppb3NfYmFzZSAmICgqZikoc3RkOjppb3NfYmFzZSAmKSA9IHN0ZDo6ZGVjKQoreworCXN0ZDo6aXN0cmluZ3N0cmVhbSBpc3Moc3RySW5wdXQpOworCisJY2hhciBjOworCisJcmV0dXJuKCAobm90ICggaXNzID4+IGYgPj4gdCA+PiBjID4+IGYgPj4gdSApLmZhaWwoKSkgJiYKKwkJCShjID09IHNlcGFyYXRvcikgKTsKK30KKworCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CitzdGQ6OnN0cmluZyB0b19zdHJpbmcoIGNvbnN0IFQgJiBhICkKK3sKKwlzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworCW9zcyA8PCBhOworCXJldHVybiBvc3Muc3RyKCk7Cit9CisKKworLyoqCisgKiBUT09MUyAvIFVUSUxTCisgKi8KK2NsYXNzIFN0cmluZ1Rvb2xzCit7CisKK3B1YmxpYzoKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBUT0xPV0VSIC0tIFRPVVBQRVIKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlpbmxpbmUgc3RhdGljIHZvaWQgdG9sb3dlcihzdGQ6OnN0cmluZyAmIHN0cikKKwl7CisJCXN0ZDo6dHJhbnNmb3JtKHN0ci5iZWdpbigpLCBzdHIuZW5kKCksIHN0ci5iZWdpbigpLCA6OnRvbG93ZXIgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIHZvaWQgdG91cHBlcihzdGQ6OnN0cmluZyAmIHN0cikKKwl7CisJCXN0ZDo6dHJhbnNmb3JtKHN0ci5iZWdpbigpLCBzdHIuZW5kKCksIHN0ci5iZWdpbigpLCA6OnRvdXBwZXIgKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBSRUdFWCBNQVRDSCBURVhUCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJc3RhdGljIGJvb2wgcmVnZXhfbWF0Y2goCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIHRleHQsIGNvbnN0IHN0ZDo6c3RyaW5nICYgcmVnZXgpOworCisjZGVmaW5lIFJFR0VYX01BVENIKCB0ZXh0ICwgcmVnZXggKSAgU3RyaW5nVG9vbHM6OnJlZ2V4X21hdGNoKCB0ZXh0ICwgcmVnZXggKQorCisJc3RhdGljIGJvb2wgcmVnZXhfZmluZCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgdGV4dCwgY29uc3Qgc3RkOjpzdHJpbmcgJiByZWdleCk7CisKKyNkZWZpbmUgUkVHRVhfRklORCggdGV4dCAsIHJlZ2V4ICkgICBTdHJpbmdUb29sczo6cmVnZXhfZmluZCggdGV4dCAsIHJlZ2V4ICkKKworCisJc3RhdGljIGJvb2wgcmVnZXhfc3RhcnRzV2l0aCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgdGV4dCwgY29uc3Qgc3RkOjpzdHJpbmcgJiByZWdleCk7CisKKyNkZWZpbmUgUkVHRVhfU1RBUlRTKCB0ZXh0ICwgcmVnZXggKSAgXAorCQkJU3RyaW5nVG9vbHM6OnJlZ2V4X3N0YXJ0c1dpdGgoIHRleHQgLCByZWdleCApCisKKwlzdGF0aWMgYm9vbCByZWdleF9lbmRzV2l0aCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgdGV4dCwgY29uc3Qgc3RkOjpzdHJpbmcgJiByZWdleCk7CisKKyNkZWZpbmUgUkVHRVhfRU5EUyggdGV4dCAsIHJlZ2V4ICkgICBcCisJCQlTdHJpbmdUb29sczo6cmVnZXhfZW5kc1dpdGgoIHRleHQgLCByZWdleCApCisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBSRVBMQUNFIFRFWFQKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlzdGF0aWMgdm9pZCByZXBsYWNlKHN0ZDo6c3RyaW5nICYgbWFpblN0ciwgY29uc3Qgc3RkOjpzdHJpbmcgJiBwYXR0ZXJuQSwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgcGF0dGVybkIpOworCisJc3RhdGljIHZvaWQgcmVwbGFjZUFsbChzdGQ6OnN0cmluZyAmIG1haW5TdHIsIGNvbnN0IHN0ZDo6c3RyaW5nICYgcGF0dGVybkEsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIHBhdHRlcm5CKTsKKworCisJc3RhdGljIHN0ZDo6c3RyaW5nIHJlZ2V4X3JlcGxhY2UoY29uc3Qgc3RkOjpzdHJpbmcgJiBtYWluU3RyLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiByZWdleF9wYXR0ZXJuLCBjb25zdCBzdGQ6OnN0cmluZyAmIHBhdHRlcm4pOworCisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBFUkFTRSBURVhUCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisJc3RhdGljIHZvaWQgZXJhc2Uoc3RkOjpzdHJpbmcgJiBtYWluU3RyLCBjb25zdCBzdGQ6OnN0cmluZyAmIHBhdHRlcm4pOworCisJc3RhdGljIHZvaWQgZXJhc2VBbGwoc3RkOjpzdHJpbmcgJiBtYWluU3RyLCBjb25zdCBzdGQ6OnN0cmluZyAmIHBhdHRlcm4pOworCisKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gU1RBUlRTICwgRU5EUyAgV0lUSAorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCWlubGluZSBzdGF0aWMgYm9vbCBzdGFydHNXaXRoKAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBzdHJBLCBjb25zdCBzdGQ6OnN0cmluZyAmIHN0ckIpCisJeworCQlzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIHNpemVCID0gc3RyQi5zaXplKCk7CisKKwkJcmV0dXJuKCAoc3RyQS5zaXplKCkgPj0gc2l6ZUIpCisJCQkJJiYgKHN0ckEuY29tcGFyZSgwLCBzaXplQiwgc3RyQikgPT0gMCkgKTsKKworLy8JCXJldHVybiggKHN0ckEuc2l6ZSgpID49IHN0ckIuc2l6ZSgpKSAmJgorLy8JCQkJc3RkOjplcXVhbChzdHJCLmJlZ2luKCksIHN0ckIuZW5kKCksIHN0ckEuYmVnaW4oKSkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIGJvb2wgZW5kc1dpdGgoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIHN0ckEsIGNvbnN0IHN0ZDo6c3RyaW5nICYgc3RyQikKKwl7CisJCXN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgc2l6ZUEgPSBzdHJBLnNpemUoKTsKKwkJc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBzaXplQiA9IHN0ckIuc2l6ZSgpOworCisJCXJldHVybiggKHNpemVBID49IHNpemVCKQorCQkJCSYmIChzdHJBLmNvbXBhcmUoc2l6ZUEgLSBzaXplQiwgc2l6ZUIsIHN0ckIpID09IDApICk7CisKKy8vCQlyZXR1cm4oIChzdHJBLnNpemUoKSA+PSBzdHJCLnNpemUoKSkgJiYKKy8vCQkJCXN0ZDo6ZXF1YWwoc3RyQi5yYmVnaW4oKSwgc3RyQi5yZW5kKCksIHN0ckEucmJlZ2luKCkpICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBzdGQ6OnN0cmluZyByZW1vdmVMYXN0SWZFbmRzV2l0aCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgc3RyQSwgY29uc3Qgc3RkOjpzdHJpbmcgJiBzdHJCKQorCXsKKwkJc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBzaXplQSA9IHN0ckEuc2l6ZSgpOworCQlzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIHNpemVCID0gc3RyQi5zaXplKCk7CisKKwkJaWYoIChzaXplQSA+PSBzaXplQikKKwkJCSYmIChzdHJBLmNvbXBhcmUoc2l6ZUEgLSBzaXplQiwgc2l6ZUIsIHN0ckIpID09IDApICkKKwkJeworCQkJcmV0dXJuKCBzdHJBLnN1YnN0cigwLCBzaXplQSAtIHNpemVCKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuKCBzdHJBICk7CisJCX0KKwl9CisKKworCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFRSSU0gTEVGVCBSSUdIVAorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCS8vIHRyaW0gZnJvbSBzdGFydCB0byBmaXJzdF9ub3Rfb2YoU1BBQ0VfQ0hBUlMpICsgcG9zCisJaW5saW5lIHN0YXRpYyBzdGQ6OnN0cmluZyAmIGx0cmltKAorCQkJc3RkOjpzdHJpbmcgJiBzLCBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IDApCisJeworLy8JCWJvb3N0OjphbGdvcml0aG06OnRyaW1fbGVmdCggcyApOworCQlzLmVyYXNlKDAsIHMuZmluZF9maXJzdF9ub3Rfb2YoU1BBQ0VfQ0hBUlMsIHBvcykpOworCisJCXJldHVybiggcyApOworCX0KKworCS8vIHRyaW0gZnJvbSBlbmQKKwlpbmxpbmUgc3RhdGljIHN0ZDo6c3RyaW5nICYgcnRyaW0oc3RkOjpzdHJpbmcgJiBzKQorCXsKKy8vCQlib29zdDo6YWxnb3JpdGhtOjp0cmltX3JpZ2h0KCBzICk7CisJCXMuZXJhc2Uocy5maW5kX2xhc3Rfbm90X29mKFNQQUNFX0NIQVJTKSArIDEpOworCisJCXJldHVybiggcyApOworCX0KKworCS8vIHRyaW0gZnJvbSBib3RoIGVuZHMKKwlpbmxpbmUgc3RhdGljIHN0ZDo6c3RyaW5nICYgdHJpbShzdGQ6OnN0cmluZyAmIHMpCisJeworLy8JCWJvb3N0OjphbGdvcml0aG06OnRyaW0oIHMgKTsKKworLy8JCXJldHVybiggcyApOworCisJCXJldHVybiggbHRyaW0oIHJ0cmltKHMpICkgKTsKKwl9CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBUT0tFTiBQQVJTRVIKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlpbmxpbmUgc3RhdGljIGJvb2wgbmV4dFRva2VuKHN0ZDo6c3RyaW5nICYgYnVmZmVyLAorCQkJc3RkOjpzdHJpbmcgJiB0b2tlbiwgY29uc3Qgc3RkOjpzdHJpbmcgJiBzZXBhcmF0b3IgPSBTUEFDRV9DSEFSUykKKwl7CisJCS8vIHRva2VuIHBvc2l0aW9uOiAwIC0tPiBwb3MKKwkJc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSBidWZmZXIuZmluZF9maXJzdF9vZihzZXBhcmF0b3IpOworCisJCS8vIG5leHQgdG9rZW4KKwkJdG9rZW4gPSBidWZmZXIuc3Vic3RyKDAsIHBvcyk7CisKKwkJLy8gdXBkYXRlZCBidWZmZXIKKwkJYnVmZmVyLmVyYXNlKDAsIGJ1ZmZlci5maW5kX2ZpcnN0X25vdF9vZihTUEFDRV9DSEFSUywgcG9zKSk7CisKKwkJcmV0dXJuKCBub3QgdG9rZW4uZW1wdHkoKSApOworCX0KKworCWlubGluZSBzdGF0aWMgYm9vbCBuZXh0VG9rZW5Xb3JkKHN0ZDo6c3RyaW5nICYgYnVmZmVyLAorCQkJc3RkOjpzdHJpbmcgJiB0b2tlbiwgY29uc3Qgc3RkOjpzdHJpbmcgJiBleHBlY3RkV29yZCkKKwl7CisJCWlmKCBidWZmZXIuc2l6ZSgpIDwgZXhwZWN0ZFdvcmQuc2l6ZSgpICkKKwkJeworCQkJcmV0dXJuKCBmYWxzZSApOworCQl9CisJCWVsc2UKKwkJeworCQkJc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSAwOworCisJCQlmb3IoIDsgcG9zIDwgZXhwZWN0ZFdvcmQuc2l6ZSgpIDsgKytwb3MgKQorCQkJeworCQkJCWlmKCBidWZmZXJbcG9zXSAhPSBleHBlY3RkV29yZFtwb3NdICkKKwkJCQl7CisJCQkJCXJldHVybiggZmFsc2UgKTsKKwkJCQl9CisJCQl9CisKKwkJCS8vIG5leHQgdG9rZW4KKwkJCXRva2VuID0gZXhwZWN0ZFdvcmQ7CisKKwkJCS8vIHVwZGF0ZWQgYnVmZmVyCisJCQlidWZmZXIuZXJhc2UoMCwgYnVmZmVyLmZpbmRfZmlyc3Rfbm90X29mKFNQQUNFX0NIQVJTLCBwb3MpKTsKKworCQkJcmV0dXJuKCB0cnVlICk7CisJCX0KKwl9CisKKworCWlubGluZSBzdGF0aWMgYm9vbCBuZXh0VG9rZW5JRChzdGQ6OnN0cmluZyAmIGJ1ZmZlciwKKwkJCXN0ZDo6c3RyaW5nICYgdG9rZW4sIGNvbnN0IHN0ZDo6c3RyaW5nICYgc2VwYXJhdG9yID0gU1BBQ0VfQ0hBUlMpCisJeworCQkvLyBJRCBwb3NpdGlvbjogMCAtLT4gcG9zCisJCXN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgcG9zID0gMDsKKwkJaWYoIHN0ZDo6aXNhbHBoYShidWZmZXJbMF0pIHx8IChidWZmZXJbMF0gPT0gJ18nKSB8fCAoYnVmZmVyWzBdID09ICcjJykgKQorCQl7CisJCQlmb3IoICsrcG9zIDsgKHBvcyA8IGJ1ZmZlci5zaXplKCkpICYmIChzdGQ6OmlzYWxudW0oYnVmZmVyW3Bvc10pIHx8CisJCQkJKGJ1ZmZlcltwb3NdID09ICdfJykgfHwgKGJ1ZmZlcltwb3NdID09ICcjJykpIDsgKytwb3MgKQorCQkJeworCQkJCS8vISEgQ09OVElOVUUKKwkJCX0KKwkJfQorCisJCS8vIG5leHQgdG9rZW4KKwkJdG9rZW4gPSBidWZmZXIuc3Vic3RyKDAsIHBvcyk7CisKKwkJLy8gdXBkYXRlZCBidWZmZXIKKwkJYnVmZmVyLmVyYXNlKDAsIGJ1ZmZlci5maW5kX2ZpcnN0X25vdF9vZihzZXBhcmF0b3IsIHBvcykpOworCisJCXJldHVybiggbm90IHRva2VuLmVtcHR5KCkgKTsKKwl9CisKKworCWlubGluZSBzdGF0aWMgYm9vbCBuZXh0VG9rZW5VRklEKHN0ZDo6c3RyaW5nICYgYnVmZmVyLAorCQkJc3RkOjpzdHJpbmcgJiB0b2tlbiwgY29uc3Qgc3RkOjpzdHJpbmcgJiBzZXBhcmF0b3IgPSBTUEFDRV9DSEFSUykKKwl7CisJCS8vIElEIHBvc2l0aW9uOiAwIC0tPiBwb3MKKwkJc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSAwOworCQlpZiggc3RkOjppc2FscGhhKGJ1ZmZlclswXSkKKwkJCXx8IChidWZmZXJbMF0gPT0gJ18nKQorCQkJfHwgKGJ1ZmZlclswXSA9PSAnIycpCisJCQl8fCAoYnVmZmVyW3Bvc10gPT0gJzonKSApCisJCXsKKwkJCWZvciggKytwb3MgOyAocG9zIDwgYnVmZmVyLnNpemUoKSkgJiYKKwkJCQkoIHN0ZDo6aXNhbG51bShidWZmZXJbcG9zXSkKKwkJCQl8fCAoYnVmZmVyW3Bvc10gPT0gJ18nKQorCQkJCXx8IChidWZmZXJbcG9zXSA9PSAnIycpCisJCQkJfHwgKGJ1ZmZlcltwb3NdID09ICcuJykKKwkJCQl8fCAoYnVmZmVyW3Bvc10gPT0gJzonKSApIDsgKytwb3MgKQorCQkJeworCQkJCS8vISEgQ09OVElOVUUKKwkJCX0KKwkJfQorCisJCS8vIG5leHQgdG9rZW4KKwkJdG9rZW4gPSBidWZmZXIuc3Vic3RyKDAsIHBvcyk7CisKKwkJLy8gdXBkYXRlZCBidWZmZXIKKwkJYnVmZmVyLmVyYXNlKDAsIGJ1ZmZlci5maW5kX2ZpcnN0X25vdF9vZihzZXBhcmF0b3IsIHBvcykpOworCisJCXJldHVybiggbm90IHRva2VuLmVtcHR5KCkgKTsKKwl9CisKK307CisKKworfQorCisjZW5kaWYgLyogQVZNX1NUUklOR19IXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvdXRpbC9hdm1fdHlwZXMuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvdXRpbC9hdm1fdHlwZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNzAwZjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy91dGlsL2F2bV90eXBlcy5jcHAKQEAgLTAsMCArMSw0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDI1IG5vdi4gMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiYXZtX3R5cGVzLmgiCisKK25hbWVzcGFjZSBzZXAKK3sKKworCitzdGQ6OnN0cmluZyBzdHJVbml0KGF2bV91bml0X3QgdW5pdCkKK3sKKwlzd2l0Y2ggKCB1bml0ICkKKwl7CisJCWNhc2UgQVZNX05BTk9fU0VDT05EX1VOSVQgIDogcmV0dXJuKCAibnMiKTsKKwkJY2FzZSBBVk1fTUlDUk9fU0VDT05EX1VOSVQgOiByZXR1cm4oICLCtXMiKTsKKwkJY2FzZSBBVk1fTUlMTElfU0VDT05EX1VOSVQgOiByZXR1cm4oICJtcyIpOworCQljYXNlIEFWTV9TRUNPTkRfVU5JVCAgICAgICA6IHJldHVybiggInMiKTsKKworCQljYXNlIEFWTV9NSU5VVEVfVU5JVCAgICAgICA6IHJldHVybiggIm1pbiIpOworCQljYXNlIEFWTV9IT1VSX1VOSVQgICAgICAgICA6IHJldHVybiggImgiKTsKKworCQljYXNlIEFWTV9NSUNST19TVEVQX1VOSVQgICA6IHJldHVybiggIm1pY3JvX3N0ZXAiKTsKKwkJY2FzZSBBVk1fU1RFUF9VTklUICAgICAgICAgOiByZXR1cm4oICJzdGVwIik7CisJCWNhc2UgQVZNX01BQ1JPX1NURVBfVU5JVCAgIDogcmV0dXJuKCAibWFjcm9fc3RlcCIpOworCisJCWNhc2UgQVZNX1VOREVGSU5FRF9VTklUICAgIDogcmV0dXJuKCAidW5kZWZpbmVkPHVuaXQ+Iik7CisKKwkJZGVmYXVsdCAgICAgICAgICAgICAgICAgICAgOiByZXR1cm4oICJ1bmtub3duPHVuaXQ+IiApOworCX0KK30KKworCit9CisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3V0aWwvYXZtX3R5cGVzLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy91dGlsL2F2bV90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMmU5MGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy91dGlsL2F2bV90eXBlcy5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAxNiBqdWlsLiAyMDA5CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQVZNX1RZUEVTX0hfCisjZGVmaW5lIEFWTV9UWVBFU19IXworCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8dXRpbC9hdm1fbnVtZXJpYy5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFRoZSBUSU1FIFVOSVQsIC4uLgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3R5cGVkZWYgYXZtX3VpbnQ2NF90ICAgICAgYXZtX2RlbGF5X3ZhbHVlX3Q7CisKK3R5cGVkZWYgYXZtX3VpbnQxNl90ICAgICAgIGF2bV91bml0X3Q7CisKK2VudW0geworCUFWTV9VTkRFRklORURfVU5JVCAgICA9IDB4MDAwMCwKKworCUFWTV9OQU5PX1NFQ09ORF9VTklUICA9IDB4MDAwMSwKKwlBVk1fTUlDUk9fU0VDT05EX1VOSVQgPSAweDAwMDIsCisJQVZNX01JTExJX1NFQ09ORF9VTklUID0gMHgwMDA0LAorCUFWTV9TRUNPTkRfVU5JVCAgICAgICA9IDB4MDAwOCwKKworCUFWTV9NSU5VVEVfVU5JVCAgICAgICA9IDB4MDAxMCwKKwlBVk1fSE9VUl9VTklUICAgICAgICAgPSAweDAwMjAsCisKKwlBVk1fTUlDUk9fU1RFUF9VTklUICAgPSAweDAwNDAsCisJQVZNX1NURVBfVU5JVCAgICAgICAgID0gMHgwMDgwLAorCUFWTV9NQUNST19TVEVQX1VOSVQgICA9IDB4MDEwMCwKK307CisKKworI2RlZmluZSBJU19VTkRFRklORURfVU5JVCh1bml0KSAgICAodW5pdCA9PSBBVk1fVU5ERUZJTkVEX1VOSVQpCisKKyNkZWZpbmUgSVNfTkFOT19TRUNPTkRfVU5JVCh1bml0KSAgKHVuaXQgJiBBVk1fTkFOT19TRUNPTkRfVU5JVCkKKyNkZWZpbmUgSVNfTUlMTElfU0VDT05EX1VOSVQodW5pdCkgKHVuaXQgJiBBVk1fTUlMTElfU0VDT05EX1VOSVQpCisjZGVmaW5lIElTX1NFQ09ORF9VTklUKHVuaXQpICAgICAgICh1bml0ICYgQVZNX1NFQ09ORF9VTklUKQorCisjZGVmaW5lIElTX01JTlVURV9VTklUKHVuaXQpICAgICAgICh1bml0ICYgQVZNX01JTlVURV9VTklUKQorI2RlZmluZSBJU19IT1VSX1VOSVQodW5pdCkgICAgICAgICAodW5pdCAmIEFWTV9IT1VSX1VOSVQpCisKKyNkZWZpbmUgSVNfTUlDUk9fU1RFUF9VTklUKHVuaXQpICAgKHVuaXQgJiBBVk1fTUlDUk9fU1RFUF9VTklUKQorI2RlZmluZSBJU19TVEVQX1VOSVQodW5pdCkgICAgICAgICAodW5pdCAmIEFWTV9TVEVQX1VOSVQpCisjZGVmaW5lIElTX01BQ1JPX1NURVBfVU5JVCh1bml0KSAgICh1bml0ICYgQVZNX01BQ1JPX1NURVBfVU5JVCkKKworCitleHRlcm4gc3RkOjpzdHJpbmcgc3RyVW5pdChhdm1fdW5pdF90IHVuaXQpOworCisKKworfQorCisjZW5kaWYgLyogQVZNX1RZUEVTX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy91dGlsL2F2bV91cmkuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvdXRpbC9hdm1fdXJpLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmE3Yjc1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvdXRpbC9hdm1fdXJpLmNwcApAQCAtMCwwICsxLDE2NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENyZWF0ZWQgb246IDIzIG5vdi4gMjAxMQorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiYXZtX3VyaS5oIgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKworI2luY2x1ZGUgPHV0aWwvYXZtX2Fzc2VydC5oPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworCisvKioKKyAqIG9wZW4gLyBjbG9zZQorICogT1MKKyAqLworCitib29sIEF2bVVyaTo6b3BlbigpCit7CisJaWYoIG91dFN0cmVhbS5nb29kKCkgKQorCXsKKwkJcmV0dXJuKCB0cnVlICk7CisJfQorCisJZWxzZSBzd2l0Y2ggKCBraW5kICkKKwl7CisJCWNhc2UgQVZNX1VSSV9TVFJFQU1fU1REX0NPVVRfS0lORDoKKwkJeworCQkJb3V0U3RyZWFtLk9TID0gQVZNX09TX0NPVVQuT1M7CisKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgQVZNX1VSSV9TVFJFQU1fU1REX0NFUlJfS0lORDoKKwkJeworCQkJb3V0U3RyZWFtLk9TID0gQVZNX09TX0NFUlIuT1M7CisKKwkJCWJyZWFrOworCQl9CisKKworCQljYXNlIEFWTV9VUklfU1RSRUFNX0FWTV9MT0dfS0lORDoKKwkJeworCQkJb3V0U3RyZWFtLk9TID0gQVZNX09TX0xPRy5PUzsKKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEFWTV9VUklfU1RSRUFNX0FWTV9UUkFDRV9LSU5EOgorCQl7CisJCQlvdXRTdHJlYW0uT1MgPSBBVk1fT1NfVFJBQ0UuT1M7CisKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBBVk1fVVJJX0ZPTERFUl9LSU5EOgorCQl7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgQVZNX1VSSV9GSUxFX0tJTkQ6CisJCWNhc2UgQVZNX1VSSV9GSUxFTkFNRV9LSU5EOgorCQl7CisJCQlpZiggb3V0U3RyZWFtLmZhaWwoKSApCisJCQl7CisJCQkJaWYoIG91dFN0cmVhbS5vcGVuKGxvY2F0aW9uLmNfc3RyKCkgLCBtb2RlKSApCisJCQkJeworCQkJCQlpc0FsbG9jYXRlZCA9IHRydWU7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUFWTV9PU19GQVRBTF9FUlJPUl9FWElUCisJCQkJCQkJPDwgIkZhaWxlZCB0byBvcGVuIDw8ICIgPDwgbG9jYXRpb24KKwkJCQkJCQk8PCAiID4+IGZpbGUgaW4gd3JpdGUgbW9kZSAhISEiCisJCQkJCQkJPDwgU0VORF9FWElUOworCQkJCX0KKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEFWTV9VUklfU09DS0VUX0tJTkQ6CisJCXsKKwkJCW91dFN0cmVhbSA9IE5VTEw7CisKKwkJCWJyZWFrOworCQl9CisKKworCQljYXNlIEFWTV9VUklfVU5ERUZJTkVEX0tJTkQ6CisJCXsKKwkJCW91dFN0cmVhbSA9IE5VTEw7CisKKwkJCWJyZWFrOworCQl9CisKKwkJZGVmYXVsdDoKKwkJeworCQkJb3V0U3RyZWFtID0gTlVMTDsKKworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4oIHRydWUgKTsKK30KKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNFUklBTElaQVRJT04KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCitzdGQ6OnN0cmluZyBBdm1Vcmk6OnN0cktpbmQoYXZtX3VyaV9raW5kX3Qga2luZCkKK3sKKwlzd2l0Y2ggKCBraW5kICkKKwl7CisJCWNhc2UgQVZNX1VSSV9TVFJFQU1fU1REX0NPVVRfS0lORCAgOiByZXR1cm4oICJzdHJlYW06c3RkOmNvdXQiKTsKKwkJY2FzZSBBVk1fVVJJX1NUUkVBTV9TVERfQ0VSUl9LSU5EICA6IHJldHVybiggInN0cmVhbTpzdGQ6Y2VyciIpOworCisJCWNhc2UgQVZNX1VSSV9TVFJFQU1fQVZNX0xPR19LSU5EICAgOiByZXR1cm4oICJzdHJlYW06YXZtOmxvZyIpOworCQljYXNlIEFWTV9VUklfU1RSRUFNX0FWTV9UUkFDRV9LSU5EIDogcmV0dXJuKCAic3RyZWFtOmF2bTp0cmFjZSIpOworCisJCWNhc2UgQVZNX1VSSV9GT0xERVJfS0lORCAgICAgICAgICAgOiByZXR1cm4oICJmb2xkZXIiKTsKKwkJY2FzZSBBVk1fVVJJX0ZJTEVfS0lORCAgICAgICAgICAgICA6IHJldHVybiggImZpbGUiKTsKKwkJY2FzZSBBVk1fVVJJX0ZJTEVOQU1FX0tJTkQgICAgICAgICA6IHJldHVybiggImZpbGVuYW1lIik7CisKKwkJY2FzZSBBVk1fVVJJX1NPQ0tFVF9LSU5EICAgICAgICAgICA6IHJldHVybiggInNvY2tldCIpOworCisJCWNhc2UgQVZNX1VSSV9VTkRFRklORURfS0lORCAgICAgICAgOiByZXR1cm4oICJ1bmRlZmluZWQ8dXJpI2tpbmQ+Iik7CisKKwkJZGVmYXVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJldHVybiggInVua25vd248dXJpI2tpbmQ+IiApOworCX0KK30KKworCit2b2lkIEF2bVVyaTo6dG9TdHJlYW0oT3V0U3RyZWFtICYgb3MpIGNvbnN0Cit7CisJb3MgPDwgVEFCIDw8ICJ1cmk8ICIgPDwgc3RyS2luZChraW5kKSA8PCAiID4geyIgPDwgRU9MOworCW9zIDw8IFRBQjIgPDwgInJhdyA9ICIgPDwgcmF3IDw8ICI7IiA8PCBFT0w7CisJb3MgPDwgVEFCMiA8PCAibG9jYXRpb24gPSAiIDw8IGxvY2F0aW9uIDw8ICI7IiA8PCBFT0w7CisKKwlpZigga2luZCA9PSBBVk1fVVJJX1NPQ0tFVF9LSU5EICkKKwl7CisJCW9zIDw8IFRBQjIgPDwgInBvcnQgPSAiIDw8IHBvcnQgPDwgIjsiIDw8IEVPTDsKKwl9CisJb3MgPDwgVEFCIDw8ICJ9IiA8PCBFT0xfRkxVU0g7Cit9CisKK30gLyogbmFtZXNwYWNlIHNlcCAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvdXRpbC9hdm1fdXJpLmggYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy91dGlsL2F2bV91cmkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWI0N2VhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvdXRpbC9hdm1fdXJpLmgKQEAgLTAsMCArMSwxNzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDcmVhdGVkIG9uOiAyMyBub3YuIDIwMTEKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgQXJuYXVsdCBMYXBpdHJlIChDRUEgTElTVCkgYXJuYXVsdC5sYXBpdHJlQGNlYS5mcgorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBBVk1fVVJJX0hfCisjZGVmaW5lIEFWTV9VUklfSF8KKworI2luY2x1ZGUgPHByaW50ZXIvT3V0U3RyZWFtLmg+CisKKyNpbmNsdWRlIDx1dGlsL2F2bV9udW1lcmljLmg+CisKKworbmFtZXNwYWNlIHNlcAoreworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVGhlIFVSSSBLSU5ECisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordHlwZWRlZiBhdm1fdWludDhfdCAgICAgICAgIGF2bV91cmlfa2luZF90OworCitlbnVtIHsKKwlBVk1fVVJJX1VOREVGSU5FRF9LSU5EICAgICAgICAgPSAweDAwMDAsCisKKwlBVk1fVVJJX1NUUkVBTV9TVERfQ09VVF9LSU5EICAgPSAweDAwMDEsCisJQVZNX1VSSV9TVFJFQU1fU1REX0NFUlJfS0lORCAgID0gMHgwMDAyLAorCisJQVZNX1VSSV9TVFJFQU1fQVZNX0xPR19LSU5EICAgID0gMHgwMDA0LAorCUFWTV9VUklfU1RSRUFNX0FWTV9UUkFDRV9LSU5EICA9IDB4MDAwOCwKKworCUFWTV9VUklfRk9MREVSX0tJTkQgICAgICAgICAgICA9IDB4MDAxMCwKKwlBVk1fVVJJX0ZJTEVfS0lORCAgICAgICAgICAgICAgPSAweDAwMjAsCisJQVZNX1VSSV9GSUxFTkFNRV9LSU5EICAgICAgICAgID0gMHgwMDQwLAorCisJQVZNX1VSSV9TT0NLRVRfS0lORCAgICAgICAgICAgID0gMHgwMDgwCit9OworCisjZGVmaW5lIElTX1VSSV9VTkRFRklORUQoa2luZCkgICAgICAgICAgICAgIChraW5kID09IEFWTV9VUklfVU5ERUZJTkVEX0tJTkQpCisKKyNkZWZpbmUgSVNfVVJJX1NUUkVBTV9TVERfQ09VVF9LSU5EKGtpbmQpICAgKGtpbmQgJiBBVk1fVVJJX1NUUkVBTV9TVERfQ09VVF9LSU5EKQorI2RlZmluZSBJU19VUklfU1RSRUFNX1NURF9DRVJSX0tJTkQoa2luZCkgICAoa2luZCAmIEFWTV9VUklfU1RSRUFNX1NURF9DRVJSX0tJTkQpCisKKyNkZWZpbmUgSVNfVVJJX1NUUkVBTV9BVk1fTE9HX0tJTkQoa2luZCkgICAgKGtpbmQgJiBBVk1fVVJJX1NUUkVBTV9BVk1fTE9HX0tJTkQpCisjZGVmaW5lIElTX1VSSV9TVFJFQU1fQVZNX1RSQUNFX0tJTkQoa2luZCkgIChraW5kICYgQVZNX1VSSV9TVFJFQU1fQVZNX1RSQUNFX0tJTkQpCisKKyNkZWZpbmUgSVNfVVJJX0ZPTERFUl9LSU5EKGtpbmQpICAgICAgICAgICAgKGtpbmQgJiBBVk1fVVJJX0ZPTERFUl9LSU5EKQorI2RlZmluZSBJU19VUklfRklMRV9LSU5EKGtpbmQpICAgICAgICAgICAgICAoa2luZCAmIEFWTV9VUklfRklMRV9LSU5EKQorI2RlZmluZSBJU19VUklfRklMRU5BTUVfS0lORChraW5kKSAgICAgICAgICAoa2luZCAmIEFWTV9VUklfRklMRU5BTUVfS0lORCkKKworI2RlZmluZSBJU19VUklfU09DS0VUX0tJTkQoa2luZCkgICAgICAgICAgICAoa2luZCAmIEFWTV9VUklfU09DS0VUX0tJTkQpCisKKworCitjbGFzcyBBdm1VcmkKK3sKKworcHVibGljOgorCS8qKgorCSAqIEFUVFJJQlVURVMKKwkgKi8KKwlzdGQ6OnN0cmluZyAgICByYXc7CisKKwlhdm1fdXJpX2tpbmRfdCBraW5kOworCisJc3RkOjpzdHJpbmcgICAgbG9jYXRpb247CisKKwlhdm1fdWludDY0X3QgICBwb3J0OworCisJT3V0U3RyZWFtIG91dFN0cmVhbTsKKwlzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBtb2RlOworCisJYm9vbCBpc0FsbG9jYXRlZDsKKworCitwdWJsaWM6CisJLyoqCisJICogQ09OU1RSVUNUT1IKKwkgKiBEZWZhdWx0CisJICovCisJQXZtVXJpKCBjb25zdCBzdGQ6OnN0cmluZyAmIHJhd0xvY2F0aW9uICkKKwk6IHJhdyggcmF3TG9jYXRpb24gKSwKKwlraW5kKCBBVk1fVVJJX1VOREVGSU5FRF9LSU5EICksCisJbG9jYXRpb24oICksCisJcG9ydCggMCApLAorCW91dFN0cmVhbSggKSwKKwltb2RlKCBzdGQ6Omlvc19iYXNlOjpvdXQgKSwKKwlpc0FsbG9jYXRlZCggZmFsc2UgKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisJQXZtVXJpKCBhdm1fdXJpX2tpbmRfdCBhS2luZCwgY29uc3Qgc3RkOjpzdHJpbmcgJiByYXdMb2NhdGlvbiApCisJOiByYXcoIHJhd0xvY2F0aW9uICksCisJa2luZCggYUtpbmQgKSwKKwlsb2NhdGlvbiggKSwKKwlwb3J0KCAwICksCisJb3V0U3RyZWFtKCApLAorCW1vZGUoIHN0ZDo6aW9zX2Jhc2U6Om91dCApLAorCWlzQWxsb2NhdGVkKCBmYWxzZSApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9CisKKworCS8qKgorCSAqIERFU1RSVUNUT1IKKwkgKi8KKwl2aXJ0dWFsIH5Bdm1VcmkoKQorCXsKKwkJLy8hISBOT1RISU5HCisJfQorCisKKwkvKioKKwkgKiBDT01QQVJJU09OCisJICogT1BFUkFUT1IKKwkgKi8KKworCWlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgQXZtVXJpICYgdXJpKSBjb25zdAorCXsKKwkJcmV0dXJuKCAocmF3ID09IHVyaS5yYXcpICYmIChraW5kID09IHVyaS5raW5kKSAmJgorCQkJCShsb2NhdGlvbiA9PSB1cmkubG9jYXRpb24pICYmIChwb3J0ID09IHVyaS5wb3J0KSApOworCX0KKworCisJLyoqCisJICogb3BlbiAvIGNsb3NlCisJICogT1MKKwkgKi8KKworCWJvb2wgb3BlbigpOworCisJdm9pZCBjbG9zZSgpCisJeworCQlpZiggaXNBbGxvY2F0ZWQgKQorCQl7CisJCQlvdXRTdHJlYW0uZGVsZXRlT1MoKTsKKwkJfQorCX0KKworCS8qKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBTRVJJQUxJWkFUSU9OCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqLworCXN0YXRpYyBzdGQ6OnN0cmluZyBzdHJLaW5kKGF2bV91cmlfa2luZF90IGtpbmQpOworCisKKwl2b2lkIHRvU3RyZWFtKE91dFN0cmVhbSAmIG9zKSBjb25zdDsKKworfTsKKworCisKK30gLyogbmFtZXNwYWNlIHNlcCAqLworI2VuZGlmIC8qIEFWTV9VUklfSF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3V0aWwvYXZtX3V0aWwuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvdXRpbC9hdm1fdXRpbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg0NmUwOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3V0aWwvYXZtX3V0aWwuY3BwCkBAIC0wLDAgKzEsNDc3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiYXZtX3V0aWwuaCIKKworI2luY2x1ZGUgPGNvbGxlY3Rpb24vQml0c2V0Lmg+CisKKyNpbmNsdWRlIDxjb21tb24vQXZtT2JqZWN0Lmg+CisjaW5jbHVkZSA8Y29tbW9uL0VsZW1lbnQuaD4KKyNpbmNsdWRlIDxjb21tb24vQkYuaD4KKyNpbmNsdWRlIDxjb21tb24vUnVubmFibGVFbGVtZW50Lmg+CisjaW5jbHVkZSA8Y29tcHV0ZXIvQmFzZUVudmlyb25tZW50Lmg+CisjaW5jbHVkZSA8Y29tcHV0ZXIvRXZhbHVhdGlvbkVudmlyb25tZW50Lmg+CisjaW5jbHVkZSA8Y29tcHV0ZXIvRXhlY3V0aW9uRW52aXJvbm1lbnQuaD4KKyNpbmNsdWRlIDxjb21wdXRlci9pbnN0cnVjdGlvbi9JbnN0cnVjdGlvbkVudmlyb25tZW50Lmg+CisjaW5jbHVkZSA8Y29tcHV0ZXIvcHJpbWl0aXZlL0F2bUNvbW11bmljYXRpb25SZHZQcmltaXRpdmUuaD4KKworI2luY2x1ZGUgPGZtbC9idWZmZXIvQmFzZUJ1ZmZlclF1ZXVlLmg+CisKKyNpbmNsdWRlIDxmbWwvYnVpbHRpbi9CdWlsdGluRm9ybS5oPgorI2luY2x1ZGUgPGZtbC9idWlsdGluL0lkZW50aWZpZXIuaD4KKyNpbmNsdWRlIDxmbWwvYnVpbHRpbi9RdWFsaWZpZWRJZGVudGlmaWVyLmg+CisKKyNpbmNsdWRlIDxmbWwvY29tbW9uL09iamVjdEVsZW1lbnQuaD4KKyNpbmNsdWRlIDxmbWwvY29tbW9uL1Byb3BlcnR5RWxlbWVudC5oPgorCisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvQXZtTGFtYmRhLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvQXZtUHJvZ3JhbS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0NvbVJvdXRlRGF0YS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0Jhc2VJbnN0YW5jZUZvcm0uaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9FeGVjdXRhYmxlRm9ybS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0V4ZWN1dGFibGVTeXN0ZW0uaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mQnVmZmVyLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZkNvbm5lY3QuaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9JbnN0YW5jZU9mRGF0YS5oPgorI2luY2x1ZGUgPGZtbC9leGVjdXRhYmxlL0luc3RhbmNlT2ZNYWNoaW5lLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZlBvcnQuaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9Sb3V0ZXIuaD4KKyNpbmNsdWRlIDxmbWwvZXhlY3V0YWJsZS9Sb3V0aW5nRGF0YS5oPgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vQXZtQ29kZS5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0J1aWx0aW5BcnJheS5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0J1aWx0aW5RdWV1ZS5oPgorI2luY2x1ZGUgPGZtbC9leHByZXNzaW9uL0J1aWx0aW5Db250YWluZXIuaD4KKworI2luY2x1ZGUgPGZtbC9udW1lcmljL051bWJlci5oPgorCisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0JlaGF2aW9yYWxQYXJ0Lmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0J1ZmZlci5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9DaGFubmVsLmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0NvbVBvaW50Lmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0NvbVJvdXRlLmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0NvbXBvc2l0ZVBhcnQuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvQ29ubmVjdG9yLmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0RhdGFUeXBlLmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL0ludGVyYWN0aW9uUGFydC5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9NYWNoaW5lLmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL01vZGVsT2ZDb21wdXRhdGlvblBhcnQuaD4KKyNpbmNsdWRlIDxmbWwvaW5mcmFzdHJ1Y3R1cmUvUGFja2FnZS5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Qb3J0Lmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1Byb3BlcnR5UGFydC5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9Sb3V0aW5lLmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1N5c3RlbS5oPgorI2luY2x1ZGUgPGZtbC9pbmZyYXN0cnVjdHVyZS9UcmFuc2l0aW9uLmg+CisjaW5jbHVkZSA8Zm1sL2luZnJhc3RydWN0dXJlL1ZhcmlhYmxlLmg+CisKKyNpbmNsdWRlIDxmbWwvb3BlcmF0b3IvT3BlcmF0b3IuaD4KKworI2luY2x1ZGUgPGZtbC9zeW1ib2wvU3ltYm9sLmg+CisjaW5jbHVkZSA8Zm1sL3N5bWJvbC9UYWJsZU9mU3ltYm9sLmg+CisKKyNpbmNsdWRlIDxmbWwvdHlwZS9UYWJsZU9mVHlwZVNwZWNpZmllci5oPgorI2luY2x1ZGUgPGZtbC90eXBlL1R5cGVTcGVjaWZpZXIuaD4KKworI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkNvbmZpZ3VyYXRpb24uaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25Db250ZXh0Lmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uRGF0YS5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL0V4ZWN1dGlvbkluZm9ybWF0aW9uLmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvRXhlY3V0aW9uTG9jYXRpb24uaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9FeGVjdXRpb25TeW5jaHJvbml6YXRpb25Qb2ludC5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL0xvY2FsUnVudGltZS5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL1J1bnRpbWVGb3JtLmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvUnVudGltZUlELmg+CisjaW5jbHVkZSA8Zm1sL3J1bnRpbWUvVGFibGVPZkRhdGEuaD4KKyNpbmNsdWRlIDxmbWwvcnVudGltZS9UYWJsZU9mUnVudGltZUZvcm1TdGF0ZS5oPgorCisjaW5jbHVkZSA8Zm1sL3RyYWNlL1RyYWNlRmlsdGVyLmg+CisjaW5jbHVkZSA8Zm1sL3RyYWNlL1RyYWNlUG9pbnQuaD4KKyNpbmNsdWRlIDxmbWwvdHJhY2UvVHJhY2VTZXF1ZW5jZS5oPgorCisjaW5jbHVkZSA8Zm1sL3R5cGUvQmFzZVR5cGVTcGVjaWZpZXIuaD4KKworI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9VbmlGb3JtSWRlbnRpZmllci5oPgorI2luY2x1ZGUgPGZtbC93b3JrZmxvdy9XT2JqZWN0Lmg+CisKKyNpbmNsdWRlIDxmYW0vYXBpL0Fic3RyYWN0UHJvY2Vzc29yVW5pdC5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL0xvY2FsUnVudGltZS5oPgorI2luY2x1ZGUgPGZtbC9ydW50aW1lL01lc3NhZ2UuaD4KKworI2luY2x1ZGUgPHBhcnNlci9QYXJzZXJNYW5hZ2VyLmg+CisKKworbmFtZXNwYWNlIHNlcCB7CisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQVZNIEVYSVQgQ09ERQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworQVZNX0VYSVRfQ09ERV9LSU5EICBfQVZNX0VYSVRfQ09ERV8gPSBBVk1fRVhJVF9HT09EX0NPREU7CisKKwordm9pZCBhdm1fc2V0X2V4aXRfY29kZShBVk1fRVhJVF9DT0RFX0tJTkQgZXhpdF9jb2RlKQoreworCWlmKCBfQVZNX0VYSVRfQ09ERV8gPT0gQVZNX0VYSVRfR09PRF9DT0RFICkKKwl7CisJCV9BVk1fRVhJVF9DT0RFXyA9IGV4aXRfY29kZTsKKwl9CisJZWxzZSBpZiggX0FWTV9FWElUX0NPREVfICE9IGV4aXRfY29kZSApCisJeworQVZNX0lGX0RFQlVHX0VOQUJMRUQKKworCUFWTV9PU19XQVJOIDw8IF9EQkdfIDw8ICJQcmV2aW91cyBleGl0IGNvZGU6ICIgPDwgc3RkOjplbmRsCisJCQk8PCBleGl0X21zZyggX0FWTV9FWElUX0NPREVfICkgPDwgc3RkOjplbmRsOworCitBVk1fRU5ESUZfREVCVUdfRU5BQkxFRAorCisJCV9BVk1fRVhJVF9DT0RFXyA9IGV4aXRfY29kZTsKKwl9Cit9CisKKworc3RkOjpzdHJpbmcgYXZtX3N0ckV4aXRDb2RlKEFWTV9FWElUX0NPREVfS0lORCBleGl0X2NvZGUpCit7CisKKyNkZWZpbmUgQ0FTRV9SRVRVUk4oIGNvZGUgLCBzdHIgKSAgY2FzZSBBVk1fRVhJVF8jI2NvZGUjI19DT0RFOiByZXR1cm4oIHN0ciApOworCisJc3dpdGNoKCBleGl0X2NvZGUgKQorCXsKKwkJQ0FTRV9SRVRVUk4oIEdPT0QgLCAiZ29vZCIgKQorCisJCUNBU0VfUkVUVVJOKCBGQUlMRUQgLCAiZmFpbGVkIiApCisKKworCQlDQVNFX1JFVFVSTiggT1VUX09GX01FTU9SWSAsICJvdXQtb2YtbWVtb3J5IiApCisKKwkJQ0FTRV9SRVRVUk4oIEZBVEFMX0VSUk9SICwgImZhdGFsIGVycm9yIiApCisKKworCQlDQVNFX1JFVFVSTiggQ09ORklHVVJFX0VSUk9SICwgImVycm9yIGluIGNvbmZpZ3VyYXRpb24gcHJvY2VzcyIgKQorCisJCUNBU0VfUkVUVVJOKCBQQVJTSU5HX0VSUk9SICwgImVycm9yIGluIHBhcnNpbmcgcHJvY2VzcyIgKQorCisJCUNBU0VfUkVUVVJOKCBQQVJTSU5HX0VYQ0VQVElPTiAsICJleGNlcHRpb24gaW4gcGFyc2luZyBwcm9jZXNzIiApCisKKwkJQ0FTRV9SRVRVUk4oIENPTVBJTElOR19FUlJPUiAsICJlcnJvciBpbiBjb21waWxpbmcgcHJvY2VzcyIgKQorCisKKwkJQ0FTRV9SRVRVUk4oIEVYRUNVVElPTl9FUlJPUiAsICJlcnJvciBpbiBleGVjdXRpb24gcHJvY2VzcyIgKQorCisJCUNBU0VfUkVUVVJOKCBSVU5USU1FX0VSUk9SICwgInJ1bnRpbWUgZXJyb3IiICkKKworCisJCUNBU0VfUkVUVVJOKCBJTklUSUFMSVpJTkdfRVJST1IgLCAicHJvY2Vzc29yOiBpbml0aWFsaXphdGlvbiBlcnJvciIgKQorCisJCUNBU0VfUkVUVVJOKCBQUkVfUFJPQ0VTU0lOR19FUlJPUiAsICJwcm9jZXNzb3I6IHByZS1wcm9jZXNzaW5nIGVycm9yIiApCisKKwkJQ0FTRV9SRVRVUk4oIFBST0NFU1NJTkdfRVJST1IgLCAicHJvY2Vzc29yOiBwcm9jZXNzaW5nIGVycm9yIiApCisKKwkJQ0FTRV9SRVRVUk4oIFBPU1RfUFJPQ0VTU0lOR19FUlJPUiAsICJwcm9jZXNzb3I6IHBvc3RfcHJvY2Vzc2luZyBlcnJvciIgKQorCisJCUNBU0VfUkVUVVJOKCBGSU5BTElaSU5HX0VSUk9SICwgInByb2Nlc3NvcjogZmluYWxpemF0aW9uIGVycm9yIiApCisKKworCQkvL0NPTlRST0xMRVIgVU5JVCBWRVJESUNUCisJCUNBU0VfUkVUVVJOKCBTWU1CRVhfQ09OVFJPTExFUl9NSU4gLCAic3ltYmV4IGNvbnRyb2xsZXI6IG1pbmltYWwgY29kZSIgKQorCisKKwkJQ0FTRV9SRVRVUk4oIENPVkVSQUdFX0dPQUxfQUNISUVWRUQgICAgLCAiY292ZXJhZ2U6IEdPQUwgQUNISUVWRUQiICAgKQorCQlDQVNFX1JFVFVSTiggQ09WRVJBR0VfR09BTF9VTkFDSElFVkVEICAsICJjb3ZlcmFnZTogR09BTCBVTkFDSElFVkVEIiApCisKKwkJQ0FTRV9SRVRVUk4oIENPVkVSQUdFX0dPQUxfQUxNT1NUX0FDSElFVkVELAkiY292ZXJhZ2U6IEFMTU9TVCBBQ0hJRVZFRCIpCisKKwkJQ0FTRV9SRVRVUk4oIENPVkVSQUdFX0dPQUxfVU5SRUFDSEFCTEUgLCAiY292ZXJhZ2U6IEdPQUwgVU5SRUFDSEFCTEUiICkKKworCisJCUNBU0VfUkVUVVJOKCBWRVJESUNUX1BBU1MgICAgICAgICAgICAgICwgInZlcmRpY3Q6IFBBU1MiICAgICAgICApCisJCUNBU0VfUkVUVVJOKCBWRVJESUNUX1NUUk9OR19QQVNTICAgICAgICwgInZlcmRpY3Q6IFNUUk9ORyBQQVNTIiApCisJCUNBU0VfUkVUVVJOKCBWRVJESUNUX1dFQUtfUEFTUyAgICAgICAgICwgInZlcmRpY3Q6IFdFQUsgUEFTUyIgICApCisKKwkJQ0FTRV9SRVRVUk4oIFZFUkRJQ1RfSU5DT05DTFVJVkUgICAgICAgLCAidmVyZGljdDogSU5DT05DTFVJVkUiICAgICAgICkKKwkJQ0FTRV9SRVRVUk4oIFZFUkRJQ1RfSU5DT05DTFVJVkVfSU5QVVQgLCAidmVyZGljdDogSU5DT05DTFVJVkVfSU5QVVQiICkKKwkJQ0FTRV9SRVRVUk4oIFZFUkRJQ1RfSU5DT05DTFVJVkVfUiAgICAgLCAidmVyZGljdDogSU5DT05DTFVJVkVfUiIgICAgICkKKworCQlDQVNFX1JFVFVSTiggVkVSRElDVF9OT05FICAgICAgICAgICAgICAsICJ2ZXJkaWN0OiBOT05FIiAgICAgICAgKQorCQlDQVNFX1JFVFVSTiggVkVSRElDVF9GQUlMICAgICAgICAgICAgICAsICJ2ZXJkaWN0OiBGQUlMIiAgICAgICAgKQorCQlDQVNFX1JFVFVSTiggVkVSRElDVF9FUlJPUiAgICAgICAgICAgICAsICJ2ZXJkaWN0OiBFUlJPUiIgICAgICAgKQorCQlDQVNFX1JFVFVSTiggVkVSRElDVF9BQk9SVCAgICAgICAgICAgICAsICJ2ZXJkaWN0OiBBQk9SVCIgICAgICAgKQorCisJCUNBU0VfUkVUVVJOKCBWRVJESUNUX1VOREVGSU5FRCAgICAgICAgICwgInZlcmRpY3Q6IFVOREVGSU5FRCIgICApCisKKworCQlDQVNFX1JFVFVSTiggVU5LTk9XTiAsICJ1bmtub3duIGV4aXQgY29kZSIgKQorCisJCWRlZmF1bHQ6IHJldHVybiAidW5kZWZpbmVkIGV4aXQgY29kZSI7CisJfQorfQorCisKK091dFN0cmVhbSAmIG9wZXJhdG9yPDwoT3V0U3RyZWFtICYgT1MsIGNvbnN0IEF2bUVYSVRfU0lHTkFMICYgZXhpdFNpZ25hbCkKK3sKKwlyZXR1cm4oIE9TIDw8IEVNUEhBU0lTKCBPU1MoKSA8PCAiQGV4aXQ8ICIKKwkJCTw8IGF2bV9zdHJFeGl0Q29kZSggZXhpdFNpZ25hbC5jb2RlICkgPDwgIiA+IGJ5ZSAhIiwKKwkJCSggKChleGl0U2lnbmFsLmNvZGUgPT0gQVZNX0VYSVRfR09PRF9DT0RFKQorCQkJCQl8fCAoZXhpdFNpZ25hbC5jb2RlID4gQVZNX0VYSVRfU1lNQkVYX0NPTlRST0xMRVJfTUlOX0NPREUpKQorCQkJCT8gJyonIDogJz8nICksCisJCQkoICgoZXhpdFNpZ25hbC5jb2RlID09IEFWTV9FWElUX0dPT0RfQ09ERSkKKwkJCQkJfHwgKGV4aXRTaWduYWwuY29kZSA+IEFWTV9FWElUX1NZTUJFWF9DT05UUk9MTEVSX01JTl9DT0RFKSkKKwkJCQk/IDQyIDogODAgKSApICk7CisKKy8vCXJldHVybiggT1MgPDwgIkBleGl0PCAiIDw8IGF2bV9zdHJFeGl0Q29kZSggZXhpdFNpZ25hbC5jb2RlICkKKy8vCQkJPDwgIiA+IGJ5ZSAhIiA8PCBzdGQ6OmVuZGwgKTsKK30KKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFWTSBFVkFMIE1PREUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworQVZNX0VYRUNfTU9ERV9LSU5EICBfQVZNX0VYRUNfTU9ERV8gPSBBVk1fRVhFQ19TVEFOREFMT05FX01PREU7CisKK3ZvaWQgYXZtX3NldEV4ZWNNb2RlS2luZChzdGQ6OnN0cmluZyBzdHJNb2RlS2luZCkKK3sKKwlTdHJpbmdUb29sczo6dG91cHBlcihzdHJNb2RlS2luZCk7CisKKwlpZiggc3RyTW9kZUtpbmQuZW1wdHkoKSApICAgICAgICAgICAgICAgIEFWTV9FWEVDX01PREVfU0VUKCBTVEFOREFMT05FICApCisKKwllbHNlIGlmKCBzdHJNb2RlS2luZCA9PSAiU1RBTkRBTE9ORSIgICkgIEFWTV9FWEVDX01PREVfU0VUKCBTVEFOREFMT05FICApCisKKwllbHNlIGlmKCBzdHJNb2RlS2luZCA9PSAiU0VSVkVSIiAgICAgICkgIEFWTV9FWEVDX01PREVfU0VUKCBTRVJWRVIgICAgICApCisKKwllbHNlIGlmKCBzdHJNb2RlS2luZCA9PSAiSU5URVJBQ1RJVkUiICkgIEFWTV9FWEVDX01PREVfU0VUKCBJTlRFUkFDVElWRSApCisKKwllbHNlIEFWTV9FWEVDX01PREVfU0VUKCBTVEFOREFMT05FICkKK30KKworCisKK0FWTV9FWEVDX1ZFUkJPU0lUWV9MRVZFTCAgX0FWTV9FWEVDX1ZFUkJPU0lUWV8gPSBBVk1fRVhFQ19WRVJCT1NJVFlfTUFYSU1VTTsKKwordm9pZCBhdm1fc2V0RXhlY1ZlcmJvc2l0eUxldmVsKHN0ZDo6c3RyaW5nIHN0clZlcmJvc2l0eUxldmVsKQoreworCVN0cmluZ1Rvb2xzOjp0b3VwcGVyKHN0clZlcmJvc2l0eUxldmVsKTsKKworCWlmKCBzdHJWZXJib3NpdHlMZXZlbC5lbXB0eSgpICkgICAgICAgICAgIEFWTV9FWEVDX1ZFUkJPU0lUWV9TRVQoIE1BWElNVU0gKQorCisJZWxzZSBpZiggc3RyVmVyYm9zaXR5TGV2ZWwgPT0gIlNJTEVOVCIgICkgQVZNX0VYRUNfVkVSQk9TSVRZX1NFVCggU0lMRU5UICApCisKKwllbHNlIGlmKCBzdHJWZXJib3NpdHlMZXZlbCA9PSAiTUlOSU1VTSIgKSBBVk1fRVhFQ19WRVJCT1NJVFlfU0VUKCBNSU5JTVVNICkKKworCWVsc2UgaWYoIHN0clZlcmJvc2l0eUxldmVsID09ICJNRURJVU0iICApIEFWTV9FWEVDX1ZFUkJPU0lUWV9TRVQoIE1FRElVTSAgKQorCisJZWxzZSBpZiggc3RyVmVyYm9zaXR5TGV2ZWwgPT0gIk1BWElNVU0iICkgQVZNX0VYRUNfVkVSQk9TSVRZX1NFVCggTUFYSU1VTSApCisKKwllbHNlIEFWTV9FWEVDX1ZFUkJPU0lUWV9TRVQoIE1BWElNVU0gKQorfQorCitzdGQ6OnN0cmluZyBhdm1fc3RyRXhlY1ZlcmJvc2l0eUxldmVsKCkKK3sKKwlzd2l0Y2goIF9BVk1fRVhFQ19WRVJCT1NJVFlfICkKKwl7CisJCWNhc2UgQVZNX0VYRUNfVkVSQk9TSVRZX1NJTEVOVCA6IHJldHVybiggIlNJTEVOVCIgICk7CisJCWNhc2UgQVZNX0VYRUNfVkVSQk9TSVRZX01JTklNVU06IHJldHVybiggIk1JTklNVU0iICk7CisJCWNhc2UgQVZNX0VYRUNfVkVSQk9TSVRZX01FRElVTSA6IHJldHVybiggIk1FRElVTSIgICk7CisJCWNhc2UgQVZNX0VYRUNfVkVSQk9TSVRZX01BWElNVU06IHJldHVybiggIk1BWElNVU0iICk7CisKKwkJZGVmYXVsdDogcmV0dXJuKCAiVkVSQk9TSVRZPCBVTktOT1dOID4iICk7CisJfQorfQorCisKKworI2RlZmluZSBBVk1fSU5TVEFOQ0VfU0hPV19DT1VOVEVSKENsYXNzTmFtZSkgIFwKKwlJbnN0YW5jZUNvdW50ZXI8IENsYXNzTmFtZSA+OjpzaG93Q291bnRlcnMob3MsICNDbGFzc05hbWUpCisKKyNkZWZpbmUgQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKENsYXNzTmFtZSkgIFwKKwlJbnN0YW5jZUNvdW50ZXI8IENsYXNzTmFtZSA+OjpyZXBvcnRDb3VudGVycyhvcywgI0NsYXNzTmFtZSkKKworCisjZGVmaW5lIEFWTV9TSE9XX0lOU1RBTkNFX0NPVU5UX1QoQ2xhc3NOYW1lLCBjb3VudGVyKSAgXAorCWlmKCBjb3VudGVyID4gMCApIGRvIHsgIFwKKwkJaW50IGNvbFNpemUgPSAzMiAtIHN0ZDo6c3RybGVuKCNDbGFzc05hbWUpOyAgXAorCQlvcyA8PCBUQUIgPDwgI0NsYXNzTmFtZSA8PCBzdGQ6OnNldHcoKGNvbFNpemUgPiAwKSA/IGNvbFNpemUgOiAxKTsgIFwKKwkJb3MgPDwgIiA6PiAiIDw8IHN0ZDo6c2V0dyg2KSA8PCBjb3VudGVyIDw8IEVPTF9GTFVTSDsgIFwKKwl9IHdoaWxlKCAwICkKKworCisKKy8qKgorICogYXZtX3JlcG9ydAorICovCit2b2lkIGF2bV9yZXBvcnQoT3V0U3RyZWFtICYgb3MsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU1zZywgYm9vbCBmb3JjZWQpCit7CisvLyEhW01JR1JBVElPTl0KK0FWTV9JRl9ERUJVR19MRVZFTF9GTEFHX09SKCBNRURJVU0gLCBSRUZFUkVOQ0VfQ09VTlRJTkcgLCBmb3JjZWQgKQorCisJb3MgPDwgQVZNX1RBQl9JTkRFTlQ7CisKKwlvcyA8PCBzdGQ6OmVuZGwgPDwgIlx0IiA8PCAiKioqKiogRk9STSBDT1VOVEVSIGluIDw8ICIgPDwgYU1zZworCTw8ICIgPj4gKioqKioiIDw8IHN0ZDo6ZW5kbDsKKworCUFWTV9JTlNUQU5DRV9TSE9XX0NPVU5URVIoQXZtT2JqZWN0KTsKKwlBVk1fSU5TVEFOQ0VfU0hPV19DT1VOVEVSKEVsZW1lbnQgICk7CisKKwlBVk1fSU5TVEFOQ0VfU0hPV19DT1VOVEVSKEJGKTsKKworCUFWTV9JTlNUQU5DRV9TSE9XX0NPVU5URVIoU3ltYm9sICAgICAgICk7CisJQVZNX0lOU1RBTkNFX1NIT1dfQ09VTlRFUihUeXBlU3BlY2lmaWVyKTsKKworCUFWTV9JTlNUQU5DRV9TSE9XX0NPVU5URVIoVGFibGVPZlN5bWJvbCAgICAgICApOworCUFWTV9JTlNUQU5DRV9TSE9XX0NPVU5URVIoVGFibGVPZlR5cGVTcGVjaWZpZXIpOworCisJQVZNX1NIT1dfSU5TVEFOQ0VfQ09VTlRfVChCRl9GUk9NX0FTUCwgQkY6OklOU1RBTkNFX0NPVU5URVJfQVNQKTsKKworCUFWTV9JTlNUQU5DRV9SRVBPUlRfQ09VTlRFUihBdm1Db2RlKTsKKwlBVk1fSU5TVEFOQ0VfUkVQT1JUX0NPVU5URVIoQkZDb2RlICk7CisKKwlBVk1fSU5TVEFOQ0VfUkVQT1JUX0NPVU5URVIoTG9jYWxSdW50aW1lICk7CisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKFJ1bnRpbWVGb3JtICApOworCUFWTV9JTlNUQU5DRV9SRVBPUlRfQ09VTlRFUihfUnVudGltZUlEXyAgKTsKKwlBVk1fSU5TVEFOQ0VfUkVQT1JUX0NPVU5URVIoUnVudGltZUlEICAgICk7CisKKwlBVk1fSU5TVEFOQ0VfUkVQT1JUX0NPVU5URVIoRXhlY3V0aW9uQ29udGV4dCAgICApOworCUFWTV9JTlNUQU5DRV9SRVBPUlRfQ09VTlRFUihFeGVjdXRpb25EYXRhICAgICAgICk7CisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKEV4ZWN1dGlvbkluZm9ybWF0aW9uKTsKKwlBVk1fSU5TVEFOQ0VfUkVQT1JUX0NPVU5URVIoR2VuZXJpY0luZm9EYXRhICAgICApOworCisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKFdPYmplY3QpOworQVZNX0VORElGX0RFQlVHX0xFVkVMX0ZMQUdfT1IoIE1FRElVTSAsIFJFRkVSRU5DRV9DT1VOVElORyApCisKKworQVZNX0lGX0RFQlVHX0xFVkVMX0ZMQUdfQU5EKCBISUdIICwgUkVGRVJFTkNFX0NPVU5USU5HICwKKwkJKEF2bU9iamVjdDo6SU5TVEFOQ0VfQUxJVkUgPiAwKSApCisKKy8vCUFWTV9JTlNUQU5DRV9SRVBPUlRfQ09VTlRFUihnaW5hY19hbmQgICAgICAgKTsKKy8vCUFWTV9JTlNUQU5DRV9SRVBPUlRfQ09VTlRFUihnaW5hY19vciAgICAgICAgKTsKKy8vCUFWTV9JTlNUQU5DRV9SRVBPUlRfQ09VTlRFUihnaW5hY19ub3QgICAgICAgKTsKKy8vCUFWTV9JTlNUQU5DRV9SRVBPUlRfQ09VTlRFUihnaW5hY19yZWxhdGlvbmFsKTsKKworCisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKFJ1bm5hYmxlRWxlbWVudCk7CisKKwlBVk1fSU5TVEFOQ0VfUkVQT1JUX0NPVU5URVIoQWJzdHJhY3RQcm9jZXNzb3JVbml0KTsKKworCUFWTV9JTlNUQU5DRV9SRVBPUlRfQ09VTlRFUihCaXRzZXQpOworCisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKEJ1aWx0aW5Gb3JtKTsKKwlBVk1fSU5TVEFOQ0VfUkVQT1JUX0NPVU5URVIoTnVtYmVyICAgICApOworCUFWTV9JTlNUQU5DRV9SRVBPUlRfQ09VTlRFUihJZGVudGlmaWVyICk7CisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKFF1YWxpZmllZElkZW50aWZpZXIpOworCisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKEFycmF5QkYgICAgICAgICk7CisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKEFycmF5Qm9vbGVhbiAgICk7CisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKEFycmF5Q2hhcmFjdGVyICk7CisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKEFycmF5SW50ZWdlciAgICk7CisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKEFycmF5UmF0aW9uYWwgICk7CisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKEFycmF5RmxvYXQgICAgICk7CisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKEFycmF5U3RyaW5nICAgICk7CisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKEFycmF5SWRlbnRpZmllcik7CisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKEFycmF5UXVhbGlmaWVkSWRlbnRpZmllcik7CisKKwlBVk1fSU5TVEFOQ0VfUkVQT1JUX0NPVU5URVIoQnVpbHRpbkNvbnRhaW5lciApOworCUFWTV9JTlNUQU5DRV9SRVBPUlRfQ09VTlRFUihCdWlsdGluTGlzdCAgICAgICk7CisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKEJ1aWx0aW5WZWN0b3IgICAgKTsKKwlBVk1fSU5TVEFOQ0VfUkVQT1JUX0NPVU5URVIoQnVpbHRpblF1ZXVlICAgICApOworCUFWTV9JTlNUQU5DRV9SRVBPUlRfQ09VTlRFUihCdWlsdGluRmlmbyAgICAgICk7CisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKEJ1aWx0aW5MaWZvICAgICAgKTsKKwlBVk1fSU5TVEFOQ0VfUkVQT1JUX0NPVU5URVIoQnVpbHRpblNldCAgICAgICApOworCUFWTV9JTlNUQU5DRV9SRVBPUlRfQ09VTlRFUihCdWlsdGluQmFnICAgICAgICk7CisKKwlBVk1fSU5TVEFOQ0VfUkVQT1JUX0NPVU5URVIoVW5pRm9ybUlkZW50aWZpZXIpOworCisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKE9iamVjdEVsZW1lbnQgICAgKTsKKwlBVk1fSU5TVEFOQ0VfUkVQT1JUX0NPVU5URVIoUHJvcGVydHlFbGVtZW50ICApOworCisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKFdPYmplY3QgICApOworCisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKERhdGFUeXBlICApOworCUFWTV9JTlNUQU5DRV9SRVBPUlRfQ09VTlRFUihCdWZmZXIgICAgKTsKKwlBVk1fSU5TVEFOQ0VfUkVQT1JUX0NPVU5URVIoQ2hhbm5lbCAgICk7CisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKENvbVBvaW50ICApOworCUFWTV9JTlNUQU5DRV9SRVBPUlRfQ09VTlRFUihDb21Sb3V0ZSAgKTsKKwlBVk1fSU5TVEFOQ0VfUkVQT1JUX0NPVU5URVIoQ29ubmVjdG9yICk7CisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKE1hY2hpbmUgICApOworCUFWTV9JTlNUQU5DRV9SRVBPUlRfQ09VTlRFUihQYWNrYWdlICAgKTsKKwlBVk1fSU5TVEFOQ0VfUkVQT1JUX0NPVU5URVIoUG9ydCAgICAgICk7CisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKFJvdXRpbmUgICApOworCUFWTV9JTlNUQU5DRV9SRVBPUlRfQ09VTlRFUihTeXN0ZW0gICAgKTsKKwlBVk1fSU5TVEFOQ0VfUkVQT1JUX0NPVU5URVIoVHJhbnNpdGlvbik7CisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKFZhcmlhYmxlICApOworCisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKEJlaGF2aW9yYWxQYXJ0ICk7CisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKENvbXBvc2l0ZVBhcnQgICk7CisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKEludGVyYWN0aW9uUGFydCk7CisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKE1vZGVsT2ZDb21wdXRhdGlvblBhcnQpOworCUFWTV9JTlNUQU5DRV9SRVBPUlRfQ09VTlRFUihQcm9wZXJ0eVBhcnQgICApOworCisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKEF2bUxhbWJkYSAgICAgICApOworCUFWTV9JTlNUQU5DRV9SRVBPUlRfQ09VTlRFUihBdm1Qcm9ncmFtICAgICAgKTsKKwlBVk1fSU5TVEFOQ0VfUkVQT1JUX0NPVU5URVIoRXhlY3V0YWJsZUZvcm0gICk7CisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKEV4ZWN1dGFibGVTeXN0ZW0pOworCUFWTV9JTlNUQU5DRV9SRVBPUlRfQ09VTlRFUihDb21Sb3V0ZURhdGEgICAgKTsKKwlBVk1fSU5TVEFOQ0VfUkVQT1JUX0NPVU5URVIoUm91dGluZ0RhdGEgICAgICk7CisKKwlBVk1fSU5TVEFOQ0VfUkVQT1JUX0NPVU5URVIoQmFzZUVudmlyb25tZW50ICAgICAgICApOworCUFWTV9JTlNUQU5DRV9SRVBPUlRfQ09VTlRFUihFdmFsdWF0aW9uRW52aXJvbm1lbnQgICk7CisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKEV4ZWN1dGlvbkVudmlyb25tZW50ICAgKTsKKwlBVk1fSU5TVEFOQ0VfUkVQT1JUX0NPVU5URVIoSW5zdHJ1Y3Rpb25FbnZpcm9ubWVudCApOworCisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKEV4ZWN1dGlvbkNvbnRleHRIZWFkZXIgKTsKKwlBVk1fSU5TVEFOQ0VfUkVQT1JUX0NPVU5URVIoRXhlY3V0aW9uQ29udGV4dCAgICAgICApOworCUFWTV9JTlNUQU5DRV9SRVBPUlRfQ09VTlRFUihFeGVjdXRpb25EYXRhICAgICAgICAgICk7CisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKEV4ZWN1dGlvbkNvbmZpZ3VyYXRpb24gKTsKKwlBVk1fSU5TVEFOQ0VfUkVQT1JUX0NPVU5URVIoRXhlY3V0aW9uSW5mb3JtYXRpb24gICApOworCUFWTV9JTlNUQU5DRV9SRVBPUlRfQ09VTlRFUihHZW5lcmljSW5mb0RhdGEgICAgICAgICk7CisKKwlBVk1fSU5TVEFOQ0VfUkVQT1JUX0NPVU5URVIoRXhlY3V0aW9uTG9jYXRpb24gICAgICApOworCUFWTV9JTlNUQU5DRV9SRVBPUlRfQ09VTlRFUihFeGVjdXRpb25TeW5jaHJvbml6YXRpb25Qb2ludCk7CisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKFJkdkNvbmZpZ3VyYXRpb25EYXRhICAgKTsKKworCUFWTV9JTlNUQU5DRV9SRVBPUlRfQ09VTlRFUihUYWJsZU9mRGF0YSAgICAgICAgICAgICk7CisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKFRhYmxlT2ZJbnN0YW5jZU9mRGF0YSAgKTsKKwlBVk1fSU5TVEFOQ0VfUkVQT1JUX0NPVU5URVIoVGFibGVPZkF2bVByb2dyYW0gICAgICApOworCUFWTV9JTlNUQU5DRV9SRVBPUlRfQ09VTlRFUihTdGFja09mTG9jYWxSdW50aW1lICAgICk7CisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKFRhYmxlT2ZSdW50aW1lRm9ybVN0YXRlKTsKKwlBVk1fSU5TVEFOQ0VfUkVQT1JUX0NPVU5URVIoVGFibGVPZlJ1bnRpbWVJRCAgICAgICApOworCisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKEluc3RhbmNlT2ZEYXRhICAgKTsKKwlBVk1fSU5TVEFOQ0VfUkVQT1JUX0NPVU5URVIoSW5zdGFuY2VPZk1hY2hpbmUpOworCUFWTV9JTlNUQU5DRV9SRVBPUlRfQ09VTlRFUihJbnN0YW5jZU9mUG9ydCAgICk7CisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKEluc3RhbmNlT2ZCdWZmZXIgKTsKKwlBVk1fSU5TVEFOQ0VfUkVQT1JUX0NPVU5URVIoSW5zdGFuY2VPZkNvbm5lY3QpOworCUFWTV9JTlNUQU5DRV9SRVBPUlRfQ09VTlRFUihCYXNlSW5zdGFuY2VGb3JtICk7CisKKwlBVk1fSU5TVEFOQ0VfUkVQT1JUX0NPVU5URVIoTG9jYWxSdW50aW1lICAgICApOworCUFWTV9JTlNUQU5DRV9SRVBPUlRfQ09VTlRFUihSdW50aW1lRm9ybSAgICAgICk7CisKKwlBVk1fSU5TVEFOQ0VfUkVQT1JUX0NPVU5URVIoTWVzc2FnZSAgICAgICAgICApOworCUFWTV9JTlNUQU5DRV9SRVBPUlRfQ09VTlRFUihCYXNlQnVmZmVyRm9ybSAgICk7CisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKFJvdXRlciAgICAgICAgICAgKTsKKworCUFWTV9JTlNUQU5DRV9SRVBPUlRfQ09VTlRFUihPcGVyYXRvciAgICAgICAgICk7CisKKwlBVk1fSU5TVEFOQ0VfUkVQT1JUX0NPVU5URVIoQmFzZVR5cGVTcGVjaWZpZXIpOworCisJQVZNX0lOU1RBTkNFX1JFUE9SVF9DT1VOVEVSKFRyYWNlUG9pbnQgICAgICAgKTsKKwlBVk1fSU5TVEFOQ0VfUkVQT1JUX0NPVU5URVIoVHJhY2VTZXF1ZW5jZSAgICApOworCUFWTV9JTlNUQU5DRV9SRVBPUlRfQ09VTlRFUihUcmFjZUZpbHRlciAgICAgICk7CisKKwlvcyA8PCBFTkRfSU5ERU5UOworCitBVk1fRU5ESUZfREVCVUdfTEVWRUxfRkxBR19BTkQoIEhJR0ggLCBSRUZFUkVOQ0VfQ09VTlRJTkcgKQorfQorCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3V0aWwvYXZtX3V0aWwuaCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3V0aWwvYXZtX3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTk1NDVkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvdXRpbC9hdm1fdXRpbC5oCkBAIC0wLDAgKzEsMzQxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIEFWTV9VVElMX0hfCisjZGVmaW5lIEFWTV9VVElMX0hfCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKworbmFtZXNwYWNlIHNlcCB7CisKKworY2xhc3MgT3V0U3RyZWFtOworCisKKworLyoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQVZNIEVYSVQgQ09ERQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCitlbnVtIEFWTV9FWElUX0NPREVfS0lORAoreworCUFWTV9FWElUX0dPT0RfQ09ERSAgICAgICAgICAgICAgICAgICAgICA9IDAsCisKKwlBVk1fRVhJVF9GQUlMRURfQ09ERSAgICAgICAgICAgICAgICAgICAgPSAxLAorCisJQVZNX0VYSVRfT1VUX09GX01FTU9SWV9DT0RFICAgICAgICAgICAgID0gMiwKKworCUFWTV9FWElUX1NFR01FTlRBVElPTl9GQVVMVF9DT0RFICAgICAgICA9IDMsCisKKwlBVk1fRVhJVF9GQVRBTF9FUlJPUl9DT0RFICAgICAgICAgICAgICAgPSA0LAorCisKKwlBVk1fRVhJVF9DT05GSUdVUkVfRVJST1JfQ09ERSAgICAgICAgICAgPSA1LAorCisKKwlBVk1fRVhJVF9QQVJTSU5HX0VSUk9SX0NPREUgICAgICAgICAgICAgPSA2LAorCisJQVZNX0VYSVRfUEFSU0lOR19FWENFUFRJT05fQ09ERSAgICAgICAgID0gNywKKworCUFWTV9FWElUX0NPTVBJTElOR19FUlJPUl9DT0RFICAgICAgICAgICA9IDgsCisKKworCUFWTV9FWElUX0VYRUNVVElPTl9FUlJPUl9DT0RFICAgICAgICAgICA9IDksCisKKwlBVk1fRVhJVF9SVU5USU1FX0VSUk9SX0NPREUgICAgICAgICAgICAgPSAxMCwKKworCisJQVZNX0VYSVRfSU5JVElBTElaSU5HX0VSUk9SX0NPREUgICAgICAgID0gMTEsCisKKwlBVk1fRVhJVF9QUkVfUFJPQ0VTU0lOR19FUlJPUl9DT0RFICAgICAgPSAxMiwKKworCUFWTV9FWElUX1BST0NFU1NJTkdfRVJST1JfQ09ERSAgICAgICAgICA9IDEzLAorCisJQVZNX0VYSVRfUE9TVF9QUk9DRVNTSU5HX0VSUk9SX0NPREUgICAgID0gMTQsCisKKwlBVk1fRVhJVF9GSU5BTElaSU5HX0VSUk9SX0NPREUgICAgICAgICAgPSAxNSwKKworCisJLy9DT05UUk9MTEVSIFVOSVQgVkVSRElDVAorCUFWTV9FWElUX1NZTUJFWF9DT05UUk9MTEVSX01JTl9DT0RFICAgICA9IDEwMCwKKworCisJQVZNX0VYSVRfQ09WRVJBR0VfR09BTF9BQ0hJRVZFRF9DT0RFICAgID0gMTAxLAorCisJQVZNX0VYSVRfQ09WRVJBR0VfR09BTF9VTkFDSElFVkVEX0NPREUgID0gMTAyLAorCisJQVZNX0VYSVRfQ09WRVJBR0VfR09BTF9BTE1PU1RfQUNISUVWRURfQ09ERSA9IDEwMywKKworCUFWTV9FWElUX0NPVkVSQUdFX0dPQUxfVU5SRUFDSEFCTEVfQ09ERSA9IDEwNCwKKworCisJQVZNX0VYSVRfVkVSRElDVF9QQVNTX0NPREUgICAgICAgICAgICAgID0gMTEwLAorCisJQVZNX0VYSVRfVkVSRElDVF9TVFJPTkdfUEFTU19DT0RFICAgICAgID0gMTExLAorCisJQVZNX0VYSVRfVkVSRElDVF9XRUFLX1BBU1NfQ09ERSAgICAgICAgID0gMTEyLAorCisKKwlBVk1fRVhJVF9WRVJESUNUX0lOQ09OQ0xVSVZFX0NPREUgICAgICAgPSAxMTMsCisKKwlBVk1fRVhJVF9WRVJESUNUX0lOQ09OQ0xVSVZFX0lOUFVUX0NPREUgPSAxMTQsCisKKwlBVk1fRVhJVF9WRVJESUNUX0lOQ09OQ0xVSVZFX1JfQ09ERSAgICAgPSAxMTUsCisKKworCUFWTV9FWElUX1ZFUkRJQ1RfTk9ORV9DT0RFICAgICAgICAgICAgICA9IDExNiwKKworCUFWTV9FWElUX1ZFUkRJQ1RfRkFJTF9DT0RFICAgICAgICAgICAgICA9IDExNywKKworCUFWTV9FWElUX1ZFUkRJQ1RfRVJST1JfQ09ERSAgICAgICAgICAgICA9IDExOCwKKworCUFWTV9FWElUX1ZFUkRJQ1RfQUJPUlRfQ09ERSAgICAgICAgICAgICA9IDExOSwKKworCUFWTV9FWElUX1ZFUkRJQ1RfVU5ERUZJTkVEX0NPREUgICAgICAgICA9IDEyMCwKKworCisJQVZNX0VYSVRfVU5LTk9XTl9DT0RFICAgICAgICAgICAgICAgICAgID0gMjU1Cit9OworCitleHRlcm4gQVZNX0VYSVRfQ09ERV9LSU5EICBfQVZNX0VYSVRfQ09ERV87CisKK3ZvaWQgYXZtX3NldF9leGl0X2NvZGUoQVZNX0VYSVRfQ09ERV9LSU5EIGV4aXRfY29kZSk7CisKK3N0ZDo6c3RyaW5nIGF2bV9zdHJFeGl0Q29kZShBVk1fRVhJVF9DT0RFX0tJTkQgZXhpdF9jb2RlKTsKKworCisvKioKKyAqIE1BTklQVUxBVE9SUworICogZm9yIG9wZXJhdG9yPDwKKyAqLworY2xhc3MgT3V0U3RyZWFtOworCitzdHJ1Y3QgQXZtRVhJVF9TSUdOQUwKK3sKKwlmcmllbmQgT3V0U3RyZWFtICYgb3BlcmF0b3I8PChPdXRTdHJlYW0gJiBPUywKKwkJCWNvbnN0IEF2bUVYSVRfU0lHTkFMICYgZXhpdFNpZ25hbCk7CisKKworCUFWTV9FWElUX0NPREVfS0lORCBjb2RlOworCisJQXZtRVhJVF9TSUdOQUwoQVZNX0VYSVRfQ09ERV9LSU5EIGVjaykKKwk6IGNvZGUoIGVjayApCisJeworCQkvLyEhIE5PVEhJTkcKKwl9Cit9OworCitpbmxpbmUgQXZtRVhJVF9TSUdOQUwgZXhpdF9zaWduYWwoQVZNX0VYSVRfQ09ERV9LSU5EIGNvZGUpCit7CisJcmV0dXJuKCBjb2RlICk7Cit9CisKK2lubGluZSBBdm1FWElUX1NJR05BTCBleGl0X21zZyhBVk1fRVhJVF9DT0RFX0tJTkQgY29kZSkKK3sKKwlyZXR1cm4oIGNvZGUgKTsKK30KKworCisvKioKKyAqIG9wZXJhdG9yPDwKKyAqLworT3V0U3RyZWFtICYgb3BlcmF0b3I8PChPdXRTdHJlYW0gJiBPUywgY29uc3QgQXZtRVhJVF9TSUdOQUwgJiBleGl0U2lnbmFsKTsKKworCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFWTSBFVkFMIE1PREUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworZW51bSBBVk1fRVhFQ19NT0RFX0tJTkQKK3sKKwlBVk1fRVhFQ19TVEFOREFMT05FX01PREUgICA9IDAsCisKKwlBVk1fRVhFQ19TRVJWRVJfTU9ERSAgICAgICA9IDEsCisKKwlBVk1fRVhFQ19JTlRFUkFDVElWRV9NT0RFICA9IDIKK307CisKK2V4dGVybiBBVk1fRVhFQ19NT0RFX0tJTkQgIF9BVk1fRVhFQ19NT0RFXzsKKworI2RlZmluZSBBVk1fRVhFQ19NT0RFX1NFVCggS0lORCApICBcCisJeyBfQVZNX0VYRUNfTU9ERV8gPSBBVk1fRVhFQ18jI0tJTkQjI19NT0RFOyB9CisKKyNkZWZpbmUgQVZNX0VYRUNfTU9ERV9JUyggS0lORCApICBcCisJKCBfQVZNX0VYRUNfTU9ERV8gPT0gQVZNX0VYRUNfIyNLSU5EIyNfTU9ERSApCisKKwordm9pZCBhdm1fc2V0RXhlY01vZGVLaW5kKHN0ZDo6c3RyaW5nIHN0ck1vZGVLaW5kKTsKKworCisKKy8qKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFWTSBWRVJCT1NJVFkgTEVWRUwKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworZW51bSBBVk1fRVhFQ19WRVJCT1NJVFlfTEVWRUwKK3sKKwlBVk1fRVhFQ19WRVJCT1NJVFlfU0lMRU5UICAgID0gMCwKKworCUFWTV9FWEVDX1ZFUkJPU0lUWV9NSU5JTVVNICAgPSAxLAorCisJQVZNX0VYRUNfVkVSQk9TSVRZX01FRElVTSAgICA9IDIsCisKKwlBVk1fRVhFQ19WRVJCT1NJVFlfTUFYSU1VTSAgID0gMworfTsKKworZXh0ZXJuIEFWTV9FWEVDX1ZFUkJPU0lUWV9MRVZFTCAgX0FWTV9FWEVDX1ZFUkJPU0lUWV87CisKKworI2RlZmluZSBBVk1fRVhFQ19WRVJCT1NJVFlfU0VUKCBMRVZFTCApICBcCisJeyBfQVZNX0VYRUNfVkVSQk9TSVRZXyA9IEFWTV9FWEVDX1ZFUkJPU0lUWV8jI0xFVkVMOyB9CisKKyNkZWZpbmUgQVZNX0VYRUNfVkVSQk9TSVRZX0lTKCBMRVZFTCApICBcCisJKCBfQVZNX0VYRUNfVkVSQk9TSVRZXyA9PSBBVk1fRVhFQ19WRVJCT1NJVFlfIyNMRVZFTCApCisKKyNkZWZpbmUgQVZNX0VYRUNfVkVSQk9TSVRZX0hBUyggTEVWRUwgKSAgXAorCSggX0FWTV9FWEVDX1ZFUkJPU0lUWV8gPj0gQVZNX0VYRUNfVkVSQk9TSVRZXyMjTEVWRUwgKQorCisKKwordm9pZCBhdm1fc2V0RXhlY1ZlcmJvc2l0eUxldmVsKHN0ZDo6c3RyaW5nIHN0clZlcmJvc2l0eUxldmVsKTsKKworc3RkOjpzdHJpbmcgYXZtX3N0ckV4ZWNWZXJib3NpdHlMZXZlbCgpOworCisKKy8qKgorICogVkVSQk9TSVRZIFRFU1QKKyAqLworI2RlZmluZSBfQVZNX1ZFUkJPU0lUWV9JRl9JU18oICBMRVZFTCApICBpZiggQVZNX0VYRUNfVkVSQk9TSVRZX0lTKCBMRVZFTCApICkgeworCisjZGVmaW5lIF9BVk1fVkVSQk9TSVRZX0lGX0hBU18oIExFVkVMICkgIGlmKCBBVk1fRVhFQ19WRVJCT1NJVFlfSEFTKCBMRVZFTCApICkgeworCisjZGVmaW5lIF9BVk1fVkVSQk9TSVRZX0VMU0VJRl8oIExFVkVMICkgIH0gZWxzZSBpZiggQVZNX0VYRUNfVkVSQk9TSVRZX0hBUyggTEVWRUwgKSApIHsKKworCisjZGVmaW5lIEFWTV9WRVJCT1NJVFlfRUxTRSAgICAgICAgICAgICAgIH0gZWxzZSB7CisKKyNkZWZpbmUgQVZNX1ZFUkJPU0lUWV9FTkRJRiAgICAgICAgICAgICAgfSA7CisKKworLyoqCisgKiBWRVJCT1NJVFkgU0lMRU5UCisgKi8KKyNkZWZpbmUgQVZNX1ZFUkJPU0lUWV9JRl9JU19TSUxFTlQgICAgICAgX0FWTV9WRVJCT1NJVFlfSUZfSVNfKCBTSUxFTlQgKQorCisjZGVmaW5lIEFWTV9WRVJCT1NJVFlfSUZfSEFTX1NJTEVOVCAgICAgIF9BVk1fVkVSQk9TSVRZX0lGX0hBU18oIFNJTEVOVCApCisKKworLyoqCisgKiBWRVJCT1NJVFkgTUlOSU1VTQorICovCisjZGVmaW5lIEFWTV9WRVJCT1NJVFlfSUZfSVNfTUlOSU1VTSAgICAgIF9BVk1fVkVSQk9TSVRZX0lGX0lTXyggTUlOSU1VTSApCisKKyNkZWZpbmUgQVZNX1ZFUkJPU0lUWV9JRl9IQVNfTUlOSU1VTSAgICAgX0FWTV9WRVJCT1NJVFlfSUZfSEFTXyggTUlOSU1VTSApCisKKyNkZWZpbmUgQVZNX09TX1ZFUkJPU0lUWV9NSU5JTVVNKCBPUyApICAgaWYoIEFWTV9FWEVDX1ZFUkJPU0lUWV9IQVMoIE1JTklNVU0gKSApIE9TCisKKyNkZWZpbmUgT1NfVkVSQk9TSVRZX01JTklNVU1fT1JfREVCVUcoIE9TICkgIFwKKwkJCWlmKCBBVk1fREVCVUdfRU5BQkxFRCB8fCBBVk1fRVhFQ19WRVJCT1NJVFlfSEFTKCBNSU5JTVVNICkgKSAgT1MKKworCisvKioKKyAqIFZFUkJPU0lUWSBNRURJVU0KKyAqLworI2RlZmluZSBBVk1fVkVSQk9TSVRZX0lGX0lTX01FRElVTSAgICAgICBfQVZNX1ZFUkJPU0lUWV9JRl9JU18oIE1FRElVTSApCisKKyNkZWZpbmUgQVZNX1ZFUkJPU0lUWV9JRl9IQVNfTUVESVVNICAgICAgX0FWTV9WRVJCT1NJVFlfSUZfSEFTXyggTUVESVVNICkKKworI2RlZmluZSBBVk1fT1NfVkVSQk9TSVRZX01FRElVTSggT1MgKSAgICBpZiggQVZNX0VYRUNfVkVSQk9TSVRZX0hBUyggTUVESVVNICkgKSBPUworCisjZGVmaW5lIE9TX1ZFUkJPU0lUWV9NRURJVU1fT1JfREVCVUcoIE9TICkgIFwKKwkJCWlmKCBBVk1fREVCVUdfRU5BQkxFRCB8fCBBVk1fRVhFQ19WRVJCT1NJVFlfSEFTKCBNRURJVU0gKSApICBPUworCisKKy8qKgorICogVkVSQk9TSVRZIE1BWElNVU0KKyAqLworI2RlZmluZSBBVk1fVkVSQk9TSVRZX0lGX0lTX01BWElNVU0gICAgICBfQVZNX1ZFUkJPU0lUWV9JRl9JU18oIE1BWElNVU0gKQorCisjZGVmaW5lIEFWTV9WRVJCT1NJVFlfSUZfSEFTX01BWElNVU0gICAgIF9BVk1fVkVSQk9TSVRZX0lGX0hBU18oIE1BWElNVU0gKQorCisjZGVmaW5lIEFWTV9PU19WRVJCT1NJVFlfTUFYSU1VTSggT1MgKSAgIGlmKCBBVk1fRVhFQ19WRVJCT1NJVFlfSEFTKCBNQVhJTVVNICkgKSBPUworCisjZGVmaW5lIE9TX1ZFUkJPU0lUWV9NQVhJTVVNX09SX0RFQlVHKCBPUyApICBcCisJCQlpZiggQVZNX0RFQlVHX0VOQUJMRUQgfHwgQVZNX0VYRUNfVkVSQk9TSVRZX0hBUyggTUFYSU1VTSApICkgIE9TCisKKworLyoqCisgKiBWRVJCT1NJVFkgU1dJVENICisgKi8KKyNkZWZpbmUgQVZNX1ZFUkJPU0lUWV9TV0lUQ0ggICAgICAgICAgICAgICBzd2l0Y2goIF9BVk1fRVhFQ19WRVJCT1NJVFlfICkgeworCisjZGVmaW5lIEFWTV9WRVJCT1NJVFlfQ0FTRV9TSUxFTlQgICAgICAgICAgY2FzZSBBVk1fRVhFQ19WRVJCT1NJVFlfU0lMRU5UIDogeworCisjZGVmaW5lIEFWTV9WRVJCT1NJVFlfQ0FTRV9NSU5JTVVNICAgICAgICAgY2FzZSBBVk1fRVhFQ19WRVJCT1NJVFlfTUlOSU1VTTogeworCisjZGVmaW5lIEFWTV9WRVJCT1NJVFlfQ0FTRV9NRURJVU0gICAgICAgICAgY2FzZSBBVk1fRVhFQ19WRVJCT1NJVFlfTUVESVVNIDogeworCisjZGVmaW5lIEFWTV9WRVJCT1NJVFlfQ0FTRV9NQVhJTVVNICAgICAgICAgY2FzZSBBVk1fRVhFQ19WRVJCT1NJVFlfTUFYSU1VTTogeworCisKKyNkZWZpbmUgQVZNX1ZFUkJPU0lUWV9DQVNFX0VORCAgICAgICAgICAgICBicmVhazsgfQorCisjZGVmaW5lIEFWTV9WRVJCT1NJVFlfU1dJVENIX0RFRkFVTFQgICAgICAgQVZNX1ZFUkJPU0lUWV9DQVNFX0VORCAgZGVmYXVsdDogeworCisjZGVmaW5lIEFWTV9WRVJCT1NJVFlfU1dJVENIX0VORCAgICAgICAgICAgQVZNX1ZFUkJPU0lUWV9DQVNFX0VORCB9CisKKworI2RlZmluZSBBVk1fVkVSQk9TSVRZX1NXSVRDSF9TSUxFTlQgICAgICAgIEFWTV9WRVJCT1NJVFlfU1dJVENIICBBVk1fVkVSQk9TSVRZX0NBU0VfU0lMRU5UCisKKyNkZWZpbmUgQVZNX1ZFUkJPU0lUWV9TV0lUQ0hfTUlOSU1VTSAgICAgICBBVk1fVkVSQk9TSVRZX1NXSVRDSCAgQVZNX1ZFUkJPU0lUWV9DQVNFX01JTklNVU0KKworI2RlZmluZSBBVk1fVkVSQk9TSVRZX1NXSVRDSF9NRURJVU0gICAgICAgIEFWTV9WRVJCT1NJVFlfU1dJVENIICBBVk1fVkVSQk9TSVRZX0NBU0VfTUVESVVNCisKKyNkZWZpbmUgQVZNX1ZFUkJPU0lUWV9TV0lUQ0hfTUFYSU1VTSAgICAgICBBVk1fVkVSQk9TSVRZX1NXSVRDSCAgQVZNX1ZFUkJPU0lUWV9DQVNFX01BWElNVU0KKworCisjZGVmaW5lIEFWTV9WRVJCT1NJVFlfU1dJVENIX0NBU0VfU0lMRU5UICAgQVZNX1ZFUkJPU0lUWV9DQVNFX0VORCAgQVZNX1ZFUkJPU0lUWV9DQVNFX1NJTEVOVAorCisjZGVmaW5lIEFWTV9WRVJCT1NJVFlfU1dJVENIX0NBU0VfTUlOSU1VTSAgQVZNX1ZFUkJPU0lUWV9DQVNFX0VORCAgQVZNX1ZFUkJPU0lUWV9DQVNFX01JTklNVU0KKworI2RlZmluZSBBVk1fVkVSQk9TSVRZX1NXSVRDSF9DQVNFX01FRElVTSAgIEFWTV9WRVJCT1NJVFlfQ0FTRV9FTkQgIEFWTV9WRVJCT1NJVFlfQ0FTRV9NRURJVU0KKworI2RlZmluZSBBVk1fVkVSQk9TSVRZX1NXSVRDSF9DQVNFX01BWElNVU0gIEFWTV9WRVJCT1NJVFlfQ0FTRV9FTkQgIEFWTV9WRVJCT1NJVFlfQ0FTRV9NQVhJTVVNCisKKyNkZWZpbmUgQVZNX1ZFUkJPU0lUWV9TV0lUQ0hfQ0FTRV9NQVhJTVVNICBBVk1fVkVSQk9TSVRZX0NBU0VfRU5EICBBVk1fVkVSQk9TSVRZX0NBU0VfTUFYSU1VTQorCisKKworCisvKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBVk0gR0xPQkFMIE1FVEhPRAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCit2b2lkIGF2bV9yZXBvcnQoT3V0U3RyZWFtICYgb3MsIGNvbnN0IHN0ZDo6c3RyaW5nICYgYU1zZywgYm9vbCBmb3JjZWQgPSBmYWxzZSk7CisKKworCit9CisjZW5kaWYgLypBVk1fVVRJTF9IXyovCisKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvdXRpbC9hdm1fdmZzLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3V0aWwvYXZtX3Zmcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBmYTBhNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3V0aWwvYXZtX3Zmcy5jcHAKQEAgLTAsMCArMSw1NDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULg0KKyAqDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENyZWF0ZWQgb246IDI2IG1hcnMgMjAxNQ0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICBBcm5hdWx0IExhcGl0cmUgKENFQSBMSVNUKSBhcm5hdWx0LmxhcGl0cmVAY2VhLmZyDQorICogICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2luY2x1ZGUgImF2bV92ZnMuaCINCisNCisjaW5jbHVkZSA8Y29sbGVjdGlvbi9UeXBlZGVmLmg+DQorDQorI2luY2x1ZGUgPGZzdHJlYW0+DQorDQorI2luY2x1ZGUgPGJvb3N0L2ZpbGVzeXN0ZW0uaHBwPg0KKw0KKw0KK25hbWVzcGFjZSBzZXANCit7DQorDQorc3RkOjpzdHJpbmcgVkZTOjpFeGVjdXRhYmxlUGF0aDsNCisNCitzdGQ6OnN0cmluZyBWRlM6OldvcmtmbG93UGF0aDsNCisNCisNCitzdGQ6OnN0cmluZyBWRlM6OkxhdW5jaFBhdGg7DQorDQorDQorc3RkOjpzdHJpbmcgVkZTOjpXb3Jrc3BhY2VSb290UGF0aDsNCisNCitzdGQ6OnN0cmluZyBWRlM6OldvcmtzcGFjZVNvdXJjZVBhdGg7DQorDQorc3RkOjpzdHJpbmcgVkZTOjpXb3Jrc3BhY2VPdXRwdXRQYXRoOw0KKw0KK3N0ZDo6c3RyaW5nIFZGUzo6V29ya3NwYWNlTG9nUGF0aDsNCisNCitzdGQ6OnN0cmluZyBWRlM6OldvcmtzcGFjZURlYnVnUGF0aDsNCisNCitzdGQ6OnN0cmluZyBWRlM6OldvcmtzcGFjZVRkZFBhdGg7DQorDQorDQorc3RkOjpzdHJpbmcgVkZTOjpQcm9qZWN0UGF0aDsNCisNCitzdGQ6OnN0cmluZyBWRlM6OlByb2plY3RTb3VyY2VQYXRoOw0KKw0KK3N0ZDo6c3RyaW5nIFZGUzo6UHJvamVjdE91dHB1dFBhdGg7DQorDQorc3RkOjpzdHJpbmcgVkZTOjpQcm9qZWN0TG9nUGF0aDsNCisNCitzdGQ6OnN0cmluZyBWRlM6OlByb2plY3REZWJ1Z1BhdGg7DQorDQorc3RkOjpzdHJpbmcgVkZTOjpQcm9qZWN0VGRkUGF0aDsNCisNCisNCisNCisNCisvKioNCisgKiBGT1JNQVQgTkFUSVZFIEZJTEUgLyBESVJFQ1RPUlkgUEFUSA0KKyAqLw0KKw0KK3N0YXRpYyBib29sIGlzX2NvbXBsZXRlKGNvbnN0IGJvb3N0OjpmaWxlc3lzdGVtOjpwYXRoICYgYVBhdGgpDQorew0KKy8vCXJldHVybiggYVBhdGguaXNfYWJzb2x1dGUoKSApOw0KKw0KKwlpZiggYVBhdGguaXNfY29tcGxldGUoKSApDQorCXsNCisJCXJldHVybiggdHJ1ZSApOw0KKwl9DQorCWVsc2UNCisJew0KKyNpZmRlZiBfX0FWTV9CT09TVF9XSU5ET1dTX18NCisJCXN0ZDo6c3RyaW5nIHJvb3QgPSBhUGF0aC5yb290X3BhdGgoKS5zdHJpbmcoKTsNCisJCXJldHVybiggKHJvb3Quc2l6ZSgpID49IDIpICYmDQorCQkJCSgocm9vdFtyb290LnNpemUoKS0xXSA9PSAnOicpDQorCQkJCXx8IChyb290LmZpbmQoJzonKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgICAvLyAiYzoiDQorCQkJCXx8ICgocm9vdFswXSA9PSAnLycpICYmIChyb290WzFdID09ICcvJykpICAvLyAiLy9zaGFyZSINCisJCQkJfHwgYVBhdGguaXNfY29tcGxldGUoKQ0KKwkJCQkpDQorCQkpOw0KKyNlbHNlDQorCQlyZXR1cm4oIGFQYXRoLmlzX2NvbXBsZXRlKCkgKTsNCisjZW5kaWYNCisJfQ0KKy8vCWVsc2UgaWYoIFZGUzo6SVNfV0lORE9XU19QTEFURk9STSAmJiAoISBhUGF0aC5lbXB0eSgpKSApDQorLy8Jew0KKy8vCQlzdGQ6OnN0cmluZyByb290ID0gYVBhdGgucm9vdF9wYXRoKCkuc3RyaW5nKCk7DQorLy8JCXJldHVybiggKHJvb3Quc2l6ZSgpID09IDIpICYmIChyb290WzFdID09ICc6JykgKTsNCisvLwl9DQorDQorCXJldHVybiggZmFsc2UgKTsNCit9DQorDQorDQorc3RkOjpzdHJpbmcgVkZTOjpuYXRpdmVfcGF0aChjb25zdCBzdGQ6OnN0cmluZyAmIHBhdGgpDQorew0KKwlib29zdDo6ZmlsZXN5c3RlbTo6cGF0aCBhUGF0aCggcGF0aCApOw0KKw0KKy8vCWlmKCBub3QgaXNfY29tcGxldGUoYVBhdGgpICkNCisvLwl7DQorLy8JCWFQYXRoID0gYm9vc3Q6OmZpbGVzeXN0ZW06OmN1cnJlbnRfcGF0aCgpLnN0cmluZygpICsNCisvLwkJCQkiLyIgKyBhUGF0aC5zdHJpbmcoKTsNCisvLwl9DQorCWFQYXRoLm5vcm1hbGl6ZSgpOw0KKw0KKwlyZXR1cm4oIGFQYXRoLnN0cmluZygpICk7DQorfQ0KKw0KK3N0ZDo6c3RyaW5nIFZGUzo6bmF0aXZlX3BhdGgoDQorCQljb25zdCBzdGQ6OnN0cmluZyAmIHBhdGgsIGNvbnN0IHN0ZDo6c3RyaW5nICYgbWFpbl9kaXIpDQorew0KKwlib29zdDo6ZmlsZXN5c3RlbTo6cGF0aCBhUGF0aCggcGF0aCApOw0KKw0KKwlpZiggbm90IGlzX2NvbXBsZXRlKGFQYXRoKSApDQorLy8JaWYoIGFQYXRoLmlzX3JlbGF0aXZlKCkgKQ0KKwl7DQorCQlhUGF0aCA9IG1haW5fZGlyICsgIi8iICsgYVBhdGguc3RyaW5nKCk7DQorCQlhUGF0aC5ub3JtYWxpemUoKTsNCisJfQ0KKw0KKwlyZXR1cm4oIGFQYXRoLnN0cmluZygpICk7DQorfQ0KKw0KKy8vIENZR1dJTg0KK3N0ZDo6c3RyaW5nIFZGUzo6cG9zaXhfcGF0aChjb25zdCBzdGQ6OnN0cmluZyAmIHBhdGgpDQorew0KKy8vCWlmKCBWRlM6OklTX0NZR1dZTl9QTEFURk9STSApDQorI2lmZGVmIF9fQVZNX0JPT1NUX0NZR1dJTl9fDQorCWlmKCAocGF0aC5zaXplKCkgPiAyKSAmJiAocGF0aFsxXSA9PSAnOicpICkNCisJew0KKwkJcGF0aFswXSA9IHRvbG93ZXIocGF0aFswXSk7DQorCQlwYXRoWzFdID0gJy8nOw0KKwkJaWYoIChwYXRoWzJdID09ICcvJykgfHwgKHBhdGhbMl0gPT0gJ1xcJykgKQ0KKwkJew0KKwkJCXBhdGggPSAiL2N5Z2RyaXZlLyIgKyBwYXRoLnN1YnN0cigwLCAyKSArIHBhdGguc3Vic3RyKDMpIDsNCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQlwYXRoID0gIi9jeWdkcml2ZS8iICsgcGF0aDsNCisJCX0NCisJfQ0KKyNlbmRpZg0KKw0KKwlyZXR1cm4oIHBhdGggKTsNCit9DQorDQorDQorLyoqDQorICogQ0hFQ0tFUiBGT1IgUkVBRElORyAvIFdSSVRJTkcgIEZJTEUgLyBESVJFQ1RPUlkgUEFUSA0KKyAqLw0KK2Jvb2wgVkZTOjpjaGVja1JlYWRpbmdGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nICYgcGF0aCkNCit7DQorCXRyeQ0KKwl7DQorCQlib29zdDo6ZmlsZXN5c3RlbTo6cGF0aCBhUGF0aCggcGF0aCApOw0KKw0KKwkJcmV0dXJuKCBib29zdDo6ZmlsZXN5c3RlbTo6ZXhpc3RzKGFQYXRoKSAvKiYmDQorCQkJCWJvb3N0OjpmaWxlc3lzdGVtOjppc19yZWd1bGFyX2ZpbGUoYVBhdGgpKi8gKTsNCisJfQ0KKwljYXRjaCggY29uc3Qgc3RkOjpleGNlcHRpb24gJiBlICkNCisJew0KKwkJQVZNX09TX0NFUlIgPDwgc3RkOjplbmRsDQorCQkJCTw8IEVNUEhBU0lTKCJzdGQ6OmV4Y2VwdGlvbjo+IiwgZS53aGF0KCksICcqJywgODApOw0KKwl9DQorDQorCXJldHVybiggZmFsc2UgKTsNCit9DQorDQorYm9vbCBWRlM6OmNoZWNrV3JpdGluZ0ZpbGUoY29uc3Qgc3RkOjpzdHJpbmcgJiBwYXRoKQ0KK3sNCisJc3RkOjpvZnN0cmVhbSBjaGVja0ZpbGVTdHJlYW0ocGF0aC5jX3N0cigpKTsNCisNCisJcmV0dXJuKCBjaGVja0ZpbGVTdHJlYW0uZ29vZCgpICk7DQorfQ0KKw0KK2Jvb2wgVkZTOjpjaGVja1dyaXRpbmdGaWxlRm9sZGVyKGNvbnN0IHN0ZDo6c3RyaW5nICYgcGF0aCkNCit7DQorCXN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgcG9zID0gcGF0aC5maW5kX2xhc3Rfb2YoIFZGUzo6UGF0aFNlcGFyYXRvciApOw0KKw0KKwlpZiggcG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zICkNCisJew0KKwkJaWYoIG5vdCBWRlM6OmNoZWNrV3JpdGluZ0ZvbGRlciggcGF0aC5zdWJzdHIoMCwgcG9zKSApICkNCisJCXsNCisJCQlyZXR1cm4oIGZhbHNlICk7DQorCQl9DQorCX0NCisNCisJcmV0dXJuKCBWRlM6OmNoZWNrV3JpdGluZ0ZpbGUoIHBhdGggKSApOw0KK30NCisNCisNCitib29sIFZGUzo6Y2hlY2tSZWFkaW5nRm9sZGVyKGNvbnN0IHN0ZDo6c3RyaW5nICYgZGlyX3BhdGgpDQorew0KKwl0cnkNCisJew0KKwkJYm9vc3Q6OmZpbGVzeXN0ZW06OnBhdGggYVBhdGgoIGRpcl9wYXRoICk7DQorDQorCQlyZXR1cm4oIGJvb3N0OjpmaWxlc3lzdGVtOjpleGlzdHMoYVBhdGgpICYmDQorCQkJCWJvb3N0OjpmaWxlc3lzdGVtOjppc19kaXJlY3RvcnkoYVBhdGgpICk7DQorCX0NCisJY2F0Y2goIGNvbnN0IHN0ZDo6ZXhjZXB0aW9uICYgZSApDQorCXsNCisJCUFWTV9PU19DRVJSIDw8IHN0ZDo6ZW5kbA0KKwkJCQk8PCBFTVBIQVNJUygic3RkOjpleGNlcHRpb246PiIsIGUud2hhdCgpLCAnKicsIDgwKTsNCisJfQ0KKw0KKwlyZXR1cm4oIGZhbHNlICk7DQorfQ0KKw0KK2Jvb2wgVkZTOjpjaGVja1dyaXRpbmdGb2xkZXIoY29uc3Qgc3RkOjpzdHJpbmcgJiBkaXJfcGF0aCkNCit7DQorCXRyeQ0KKwl7DQorCQlib29zdDo6ZmlsZXN5c3RlbTo6cGF0aCBhUGF0aCggZGlyX3BhdGggKTsNCisNCisJCWJvb3N0OjpmaWxlc3lzdGVtOjpjcmVhdGVfZGlyZWN0b3JpZXMoIGFQYXRoICk7DQorDQorCQlyZXR1cm4oIHRydWUgKTsNCisJfQ0KKwljYXRjaCggY29uc3Qgc3RkOjpleGNlcHRpb24gJiBlICkNCisJew0KKwkJQVZNX09TX0NFUlIgPDwgc3RkOjplbmRsDQorCQkJCTw8IEVNUEhBU0lTKCJzdGQ6OmV4Y2VwdGlvbjo+IiwgZS53aGF0KCksICcqJywgODApOw0KKw0KKwkJcmV0dXJuKCBmYWxzZSApOw0KKwl9DQorDQorCXJldHVybiggZmFsc2UgKTsNCit9DQorDQorDQorLyoqDQorICogTGlzdCBhbGwgZmlsZQ0KKyAqLw0KK2Jvb2wgVkZTOjpsaXN0QWxsRmlsZXMoY29uc3Qgc3RkOjpzdHJpbmcgJiBkaXJfcGF0aCwNCisJCXN0ZDo6dmVjdG9yPCBzdGQ6OnN0cmluZyA+ICYgbGlzdE9mRmlsZXMsIGJvb2wgcmVjdXJzaXZlKQ0KK3sNCisJaWYoIFZGUzo6Y2hlY2tSZWFkaW5nRm9sZGVyKGRpcl9wYXRoKSApDQorCXsNCisJCWJvb3N0OjpmaWxlc3lzdGVtOjpwYXRoIGFQYXRoKCBkaXJfcGF0aCApOw0KKw0KKwkJYm9vc3Q6OmZpbGVzeXN0ZW06OmRpcmVjdG9yeV9pdGVyYXRvciBlbmRfaXRyOw0KKwkJYm9vc3Q6OmZpbGVzeXN0ZW06OmRpcmVjdG9yeV9pdGVyYXRvciBpdHIoYVBhdGgpOw0KKw0KKwkJZm9yKCA7IGl0ciAhPSBlbmRfaXRyIDsgKytpdHIgKQ0KKwkJew0KKwkJCS8vIElmIGl0J3Mgbm90IGEgZGlyZWN0b3J5LCBsaXN0IGl0Lg0KKwkJCS8vIElmIHlvdSB3YW50IHRvIGxpc3QgZGlyZWN0b3JpZXMgdG9vLCBqdXN0IHJlbW92ZSB0aGlzIGNoZWNrLg0KKwkJCWlmKCBib29zdDo6ZmlsZXN5c3RlbTo6aXNfcmVndWxhcl9maWxlKCBpdHItPnN0YXR1cygpICkgKQ0KKwkJCXsNCisJCQkJaWYoIFZGUzo6Y2hlY2tSZWFkaW5nRmlsZSggaXRyLT5wYXRoKCkuc3RyaW5nKCkgKSApDQorCQkJCXsNCisJCQkJCWxpc3RPZkZpbGVzLnB1c2hfYmFjayggaXRyLT5wYXRoKCkuc3RyaW5nKCkgKTsNCisJCQkJfQ0KKwkJCX0NCisJCQllbHNlIGlmKCByZWN1cnNpdmUgJiYNCisJCQkJCWJvb3N0OjpmaWxlc3lzdGVtOjppc19kaXJlY3RvcnkoIGl0ci0+c3RhdHVzKCkgKSApDQorCQkJew0KKwkJCQlpZiggVkZTOjpsaXN0QWxsRmlsZXMoaXRyLT5wYXRoKCkuc3RyaW5nKCksIGxpc3RPZkZpbGVzLCB0cnVlKSApDQorCQkJCXsNCisJCQkJCS8vISEgY29udGludWUNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisNCisJCXJldHVybiggdHJ1ZSApOw0KKwl9DQorDQorCXJldHVybiggZmFsc2UgKTsNCit9DQorDQorDQorLyoqDQorICogY29weSAvIG1vdmUNCisgKi8NCitib29sIFZGUzo6Y29weVRvKA0KKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBzcmNMb2NhdGlvbiwNCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgZGVzdExvY2F0aW9uKQ0KK3sNCisJdHJ5DQorCXsNCisJCWJvb3N0OjpmaWxlc3lzdGVtOjpjb3B5X2ZpbGUoc3JjTG9jYXRpb24sIGRlc3RMb2NhdGlvbiwNCisJCQkJYm9vc3Q6OmZpbGVzeXN0ZW06OmNvcHlfb3B0aW9uOjpvdmVyd3JpdGVfaWZfZXhpc3RzKTsNCisNCisJCXJldHVybiggdHJ1ZSApOw0KKwl9DQorCWNhdGNoKCBjb25zdCBzdGQ6OmV4Y2VwdGlvbiAmIGUgKQ0KKwl7DQorCQlBVk1fT1NfV0FSTiA8PCBzdGQ6OmVuZGwgPDwgRU1QSEFTSVMoDQorCQkJCSJWRlM6OmNvcHlUb0ZvbGRlcjwgc3RkOjpleGNlcHRpb24gPiIsIGUud2hhdCgpLCAnKicsIDgwKTsNCisJfQ0KKwljYXRjaCggLi4uICkNCisJew0KKwkJQVZNX09TX1dBUk4gPDwgc3RkOjplbmRsIDw8IEVNUEhBU0lTKA0KKwkJCSJWRlM6OmNvcHlUb0ZvbGRlcjwgdW5rbm93bjo6ZXhjZXB0aW9uID4gISEhIiwgJyonLCA4MCApOw0KKwl9DQorDQorCXJldHVybiggZmFsc2UgKTsNCit9DQorDQorYm9vbCBWRlM6OmNvcHlUb0ZvbGRlcigNCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgc3JjTG9jYXRpb24sDQorCQljb25zdCBzdGQ6OnN0cmluZyAmIGRlc3RMb2NhdGlvbikNCit7DQorCXRyeQ0KKwl7DQorCQlib29zdDo6ZmlsZXN5c3RlbTo6cGF0aCBzcmNQYXRoKCBzcmNMb2NhdGlvbiApOw0KKwkJYm9vc3Q6OmZpbGVzeXN0ZW06OnBhdGggZGVzdFBhdGgoIGRlc3RMb2NhdGlvbiApOw0KKw0KKwkJZGVzdFBhdGggLz0gc3JjUGF0aC5maWxlbmFtZSgpOw0KKw0KKwkJYm9vc3Q6OmZpbGVzeXN0ZW06OmNvcHlfZmlsZShzcmNQYXRoLCBkZXN0UGF0aCwNCisJCQkJYm9vc3Q6OmZpbGVzeXN0ZW06OmNvcHlfb3B0aW9uOjpvdmVyd3JpdGVfaWZfZXhpc3RzKTsNCisNCisJCXJldHVybiggdHJ1ZSApOw0KKwl9DQorCWNhdGNoKCBjb25zdCBzdGQ6OmV4Y2VwdGlvbiAmIGUgKQ0KKwl7DQorCQlBVk1fT1NfV0FSTiA8PCBzdGQ6OmVuZGwgPDwgRU1QSEFTSVMoDQorCQkJCSJWRlM6OmNvcHlUb0ZvbGRlcjwgc3RkOjpleGNlcHRpb24gPiIsIGUud2hhdCgpLCAnKicsIDgwKTsNCisJfQ0KKwljYXRjaCggLi4uICkNCisJew0KKwkJQVZNX09TX1dBUk4gPDwgc3RkOjplbmRsIDw8IEVNUEhBU0lTKA0KKwkJCSJWRlM6OmNvcHlUb0ZvbGRlcjwgdW5rbm93bjo6ZXhjZXB0aW9uID4gISEhIiwgJyonLCA4MCk7DQorCX0NCisNCisJcmV0dXJuKCBmYWxzZSApOw0KK30NCisNCisNCitib29sIFZGUzo6bW92ZVRvKA0KKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBzcmNMb2NhdGlvbiwNCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgZGVzdExvY2F0aW9uKQ0KK3sNCisJdHJ5DQorCXsNCisJCWlmKCBWRlM6OmNvcHlUbyhzcmNMb2NhdGlvbiwgZGVzdExvY2F0aW9uKSApDQorCQl7DQorCQkJcmV0dXJuKCBib29zdDo6ZmlsZXN5c3RlbTo6cmVtb3ZlKCBzcmNMb2NhdGlvbiApICk7DQorCQl9DQorCX0NCisJY2F0Y2goIGNvbnN0IHN0ZDo6ZXhjZXB0aW9uICYgZSApDQorCXsNCisJCUFWTV9PU19XQVJOIDw8IHN0ZDo6ZW5kbCA8PCBFTVBIQVNJUygNCisJCQkJIlZGUzo6bW92ZVRvRm9sZGVyPCBzdGQ6OmV4Y2VwdGlvbiA+IiwgZS53aGF0KCksICcqJywgODApOw0KKwl9DQorCWNhdGNoKCAuLi4gKQ0KKwl7DQorCQlBVk1fT1NfV0FSTiA8PCBzdGQ6OmVuZGwgPDwgRU1QSEFTSVMoDQorCQkJIlZGUzo6bW92ZVRvRm9sZGVyPCB1bmtub3duOjpleGNlcHRpb24gPiAhISEiLCAnKicsIDgwKTsNCisJfQ0KKw0KKwlyZXR1cm4oIGZhbHNlICk7DQorfQ0KKw0KK2Jvb2wgVkZTOjptb3ZlVG9Gb2xkZXIoDQorCQljb25zdCBzdGQ6OnN0cmluZyAmIHNyY0xvY2F0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyAmIGRlc3RMb2NhdGlvbikNCit7DQorCXRyeQ0KKwl7DQorCQlpZiggVkZTOjpjb3B5VG9Gb2xkZXIoc3JjTG9jYXRpb24sIGRlc3RMb2NhdGlvbikgKQ0KKwkJew0KKwkJCXJldHVybiggYm9vc3Q6OmZpbGVzeXN0ZW06OnJlbW92ZSggc3JjTG9jYXRpb24gKSApOw0KKwkJfQ0KKwl9DQorCWNhdGNoKCBjb25zdCBzdGQ6OmV4Y2VwdGlvbiAmIGUgKQ0KKwl7DQorCQlBVk1fT1NfV0FSTiA8PCBzdGQ6OmVuZGwgPDwgRU1QSEFTSVMoDQorCQkJCSJWRlM6Om1vdmVUb0ZvbGRlcjwgc3RkOjpleGNlcHRpb24gPiIsIGUud2hhdCgpLCAnKicsIDgwKTsNCisJfQ0KKwljYXRjaCggLi4uICkNCisJew0KKwkJQVZNX09TX1dBUk4gPDwgc3RkOjplbmRsIDw8IEVNUEhBU0lTKA0KKwkJCSJWRlM6Om1vdmVUb0ZvbGRlcjwgdW5rbm93bjo6ZXhjZXB0aW9uID4gISEhIiwgJyonLCA4MCk7DQorCX0NCisNCisJcmV0dXJuKCBmYWxzZSApOw0KK30NCisNCisNCisvKioNCisgKiBVVElMUw0KKyAqLw0KK2NvbnN0IGNoYXIgVkZTOjpQYXRoU2VwYXJhdG9yID0NCisJCWJvb3N0OjpmaWxlc3lzdGVtOjpwYXRoOjpwcmVmZXJyZWRfc2VwYXJhdG9yOw0KKw0KKw0KK2Jvb2wgVkZTOjppc1BhdGhTZXBhcmF0b3IoY2hhciBjKQ0KK3sNCisJcmV0dXJuKCAoYyA9PSBib29zdDo6ZmlsZXN5c3RlbTo6cGF0aDo6cHJlZmVycmVkX3NlcGFyYXRvcikgfHwNCisJCQkoYyA9PSAoJy8nKSkgfHwgKGMgPT0gKCdcXCcpKSApOw0KK30NCisNCisNCitzdGQ6OnN0cmluZyBWRlM6OnBhcmVudChjb25zdCBzdGQ6OnN0cmluZyAmIGFMb2NhdGlvbikNCit7DQorCWJvb3N0OjpmaWxlc3lzdGVtOjpwYXRoIGFQYXRoKCBhTG9jYXRpb24gKTsNCisNCisJcmV0dXJuKCBhUGF0aC5wYXJlbnRfcGF0aCgpLnN0cmluZygpICk7DQorfQ0KKw0KK3N0ZDo6c3RyaW5nIFZGUzo6ZmlsZW5hbWUoY29uc3Qgc3RkOjpzdHJpbmcgJiBhTG9jYXRpb24pDQorew0KKwlib29zdDo6ZmlsZXN5c3RlbTo6cGF0aCBhUGF0aCggYUxvY2F0aW9uICk7DQorDQorCXJldHVybiggYVBhdGguZmlsZW5hbWUoKS5zdHJpbmcoKSApOw0KK30NCisNCitzdGQ6OnN0cmluZyBWRlM6OnN0ZW0oY29uc3Qgc3RkOjpzdHJpbmcgJiBhTG9jYXRpb24pDQorew0KKwlib29zdDo6ZmlsZXN5c3RlbTo6cGF0aCBhUGF0aCggYUxvY2F0aW9uICk7DQorDQorCXJldHVybiggYVBhdGguc3RlbSgpLnN0cmluZygpICk7DQorfQ0KKw0KK3N0ZDo6c3RyaW5nIFZGUzo6ZXh0ZW5zaW9uKGNvbnN0IHN0ZDo6c3RyaW5nICYgYUxvY2F0aW9uKQ0KK3sNCisJYm9vc3Q6OmZpbGVzeXN0ZW06OnBhdGggYVBhdGgoIGFMb2NhdGlvbiApOw0KKw0KKwlyZXR1cm4oIGFQYXRoLmV4dGVuc2lvbigpLnN0cmluZygpICk7DQorfQ0KKw0KK3N0ZDo6c3RyaW5nIFZGUzo6cmVwbGFjZV9leHRlbnNpb24oDQorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFMb2NhdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcgJiBhbkV4dGVuc2lvbikNCit7DQorCWJvb3N0OjpmaWxlc3lzdGVtOjpwYXRoIGFQYXRoKCBhTG9jYXRpb24gKTsNCisNCisJYm9vc3Q6OmZpbGVzeXN0ZW06OnBhdGggbmV3UGF0aCA9IGFQYXRoLnJlcGxhY2VfZXh0ZW5zaW9uKGFuRXh0ZW5zaW9uKTsNCisNCisJcmV0dXJuKCBuZXdQYXRoLnN0cmluZygpICk7DQorfQ0KKw0KKw0KK3N0ZDo6c3RyaW5nIFZGUzo6cHJlZml4RmlsZW5hbWUoY29uc3Qgc3RkOjpzdHJpbmcgJiBhTG9jYXRpb24sDQorCQljb25zdCBzdGQ6OnN0cmluZyAmIGFQcmVmaXgsIGNvbnN0IHN0ZDo6c3RyaW5nICYgbmV3RXh0ZW5zaW9uKQ0KK3sNCisJYm9vc3Q6OmZpbGVzeXN0ZW06OnBhdGggYVBhdGgoIGFMb2NhdGlvbiApOw0KKw0KKwlib29zdDo6ZmlsZXN5c3RlbTo6cGF0aCBuZXdQYXRoID0gYVBhdGgucGFyZW50X3BhdGgoKTsNCisNCisJbmV3UGF0aCAvPSBhUHJlZml4ICsgYVBhdGguZmlsZW5hbWUoKS5zdHJpbmcoKTsNCisNCisJaWYoIG5ld0V4dGVuc2lvbi5zaXplKCkgPiAxICkNCisJew0KKwkJbmV3UGF0aCA9IG5ld1BhdGgucmVwbGFjZV9leHRlbnNpb24obmV3RXh0ZW5zaW9uKTsNCisJfQ0KKw0KKwlyZXR1cm4oIG5ld1BhdGguc3RyaW5nKCkgKTsNCit9DQorDQorc3RkOjpzdHJpbmcgVkZTOjpzdWZmaXhGaWxlbmFtZShjb25zdCBzdGQ6OnN0cmluZyAmIGFMb2NhdGlvbiwNCisJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVByZWZpeCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBuZXdFeHRlbnNpb24pDQorew0KKwlib29zdDo6ZmlsZXN5c3RlbTo6cGF0aCBhUGF0aCggYUxvY2F0aW9uICk7DQorDQorCWJvb3N0OjpmaWxlc3lzdGVtOjpwYXRoIG5ld1BhdGggPSBhUGF0aC5wYXJlbnRfcGF0aCgpOw0KKwluZXdQYXRoIC89IGFQYXRoLnN0ZW0oKS5zdHJpbmcoKSArIGFQcmVmaXggKw0KKwkJCSggKG5ld0V4dGVuc2lvbi5zaXplKCkgPiAxKSA/DQorCQkJCQluZXdFeHRlbnNpb24gOiBhUGF0aC5leHRlbnNpb24oKS5zdHJpbmcoKSApOw0KKw0KKwlyZXR1cm4oIG5ld1BhdGguc3RyaW5nKCkgKTsNCit9DQorDQorDQorc3RkOjpzdHJpbmcgVkZTOjpyZWxhdGl2ZVBhdGgoY29uc3Qgc3RkOjpzdHJpbmcgJiByZWZQYXRoLA0KKwkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUGF0aCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBuZXdQcmVmaXgpDQorew0KKwlpZiggcmVmUGF0aC5zaXplKCkgPCBhUGF0aC5zaXplKCkgKQ0KKwl7DQorCQlzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IDA7DQorDQorCQlmb3IoIDsgcG9zIDwgcmVmUGF0aC5zaXplKCkgOyArK3BvcyApDQorCQl7DQorCQkJaWYoIChyZWZQYXRoW3Bvc10gIT0gYVBhdGhbcG9zXSkgJiYNCisJCQkJKG5vdCBpc1BhdGhTZXBhcmF0b3IocmVmUGF0aFtwb3NdKSkgJiYNCisJCQkJKG5vdCBpc1BhdGhTZXBhcmF0b3IoYVBhdGhbcG9zXSkpICkNCisJCQl7DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCX0NCisNCisJCWlmKCBwb3MgPiAwICkNCisJCXsNCisJCQlpZiggbmV3UHJlZml4LmVtcHR5KCkgKQ0KKwkJCXsNCisJCQkJd2hpbGUoIGlzUGF0aFNlcGFyYXRvcihhUGF0aFtwb3NdKSApDQorCQkJCXsNCisJCQkJCSsrcG9zOw0KKwkJCQl9DQorDQorCQkJCXJldHVybiggYVBhdGguc3Vic3RyKHBvcykgKTsNCisJCQl9DQorDQorCQkJcmV0dXJuKCBuZXdQcmVmaXggKyBhUGF0aC5zdWJzdHIocG9zKSApOw0KKwkJfQ0KKwl9DQorCWVsc2UgaWYoIHJlZlBhdGguc2l6ZSgpID09IGFQYXRoLnNpemUoKSApDQorCXsNCisJCXJldHVybiggbmV3UHJlZml4ICsgIi4vIiApOw0KKwl9DQorDQorCXJldHVybiggYVBhdGggKTsNCit9DQorDQorDQorDQorc3RkOjpzdHJpbmcgVkZTOjp3cmFwUGF0aChjb25zdCBzdGQ6OnN0cmluZyAmIGFQYXRoLA0KKwkJc3RkOjpzaXplX3Qgd3JhcFNpemUsIGNvbnN0IHN0ZDo6c3RyaW5nICYgbmV3UHJlZml4KQ0KK3sNCisJaWYoIGFQYXRoLnNpemUoKSA+IHdyYXBTaXplICkNCisJew0KKwkJc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBwb3NTZXBhcmF0b3IgPSAwOw0KKw0KKwkJZm9yKCBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IDAgOyBwb3MgPCBhUGF0aC5zaXplKCkgOyArK3BvcyApDQorCQl7DQorCQkJaWYoIGlzUGF0aFNlcGFyYXRvcihhUGF0aFtwb3NdKSApDQorCQkJew0KKwkJCQlwb3NTZXBhcmF0b3IgPSBwb3M7DQorCQkJCWlmKCB3cmFwU2l6ZSA+PSAoYVBhdGguc2l6ZSgpIC0gcG9zKSApDQorCQkJCXsNCisJCQkJCWJyZWFrOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKw0KKwkJaWYoIHBvc1NlcGFyYXRvciA+IDAgKQ0KKwkJew0KKwkJCXJldHVybiggbmV3UHJlZml4ICsgYVBhdGguc3Vic3RyKHBvc1NlcGFyYXRvcikgKTsNCisJCX0NCisNCisJCXJldHVybiggYVBhdGggKTsNCisJfQ0KKw0KKwlyZXR1cm4oIGFQYXRoICk7DQorfQ0KKw0KKw0KK30gLyogbmFtZXNwYWNlIHNlcCAqLw0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3V0aWwvYXZtX3Zmcy5oIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC9zcmMvdXRpbC9hdm1fdmZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZmODYyOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3V0aWwvYXZtX3Zmcy5oCkBAIC0wLDAgKzEsMjA3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ3JlYXRlZCBvbjogMjYgbWFycyAyMDE1CisgKgorICogQ29udHJpYnV0b3JzOgorICogIEFybmF1bHQgTGFwaXRyZSAoQ0VBIExJU1QpIGFybmF1bHQubGFwaXRyZUBjZWEuZnIKKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQVZNX1ZGU19IXworI2RlZmluZSBBVk1fVkZTX0hfCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisKK25hbWVzcGFjZSBzZXAKK3sKKworc3RydWN0IFZGUworeworCS8qKgorCSAqIEFUVFJJQlVURQorCSAqLworCXN0YXRpYyBzdGQ6OnN0cmluZyBFeGVjdXRhYmxlUGF0aDsKKworCXN0YXRpYyBzdGQ6OnN0cmluZyBXb3JrZmxvd1BhdGg7CisKKworCXN0YXRpYyBzdGQ6OnN0cmluZyBMYXVuY2hQYXRoOworCisKKwlzdGF0aWMgc3RkOjpzdHJpbmcgV29ya3NwYWNlUm9vdFBhdGg7CisKKwlzdGF0aWMgc3RkOjpzdHJpbmcgV29ya3NwYWNlU291cmNlUGF0aDsKKworCXN0YXRpYyBzdGQ6OnN0cmluZyBXb3Jrc3BhY2VPdXRwdXRQYXRoOworCisJc3RhdGljIHN0ZDo6c3RyaW5nIFdvcmtzcGFjZUxvZ1BhdGg7CisKKwlzdGF0aWMgc3RkOjpzdHJpbmcgV29ya3NwYWNlRGVidWdQYXRoOworCisJc3RhdGljIHN0ZDo6c3RyaW5nIFdvcmtzcGFjZVRkZFBhdGg7CisKKworCXN0YXRpYyBzdGQ6OnN0cmluZyBQcm9qZWN0UGF0aDsKKworCXN0YXRpYyBzdGQ6OnN0cmluZyBQcm9qZWN0U291cmNlUGF0aDsKKworCXN0YXRpYyBzdGQ6OnN0cmluZyBQcm9qZWN0T3V0cHV0UGF0aDsKKworCXN0YXRpYyBzdGQ6OnN0cmluZyBQcm9qZWN0TG9nUGF0aDsKKworCXN0YXRpYyBzdGQ6OnN0cmluZyBQcm9qZWN0RGVidWdQYXRoOworCisJc3RhdGljIHN0ZDo6c3RyaW5nIFByb2plY3RUZGRQYXRoOworCisKKwkvKioKKwkgKiBGT1JNQVQgTkFUSVZFIEZJTEUgLyBESVJFQ1RPUlkgUEFUSAorCSAqLworCXN0YXRpYyBzdGQ6OnN0cmluZyBuYXRpdmVfcGF0aChjb25zdCBzdGQ6OnN0cmluZyAmIHBhdGgpOworCXN0YXRpYyBzdGQ6OnN0cmluZyBuYXRpdmVfcGF0aCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgcGF0aCwgY29uc3Qgc3RkOjpzdHJpbmcgJiBtYWluX2Rpcik7CisKKwlzdGF0aWMgc3RkOjpzdHJpbmcgcG9zaXhfcGF0aChjb25zdCBzdGQ6OnN0cmluZyAmIHBhdGgpOworCisKKwkvKioKKwkgKiBDSEVDS0VSIEZPUiBSRUFESU5HIC8gV1JJVElORyAgRklMRSAvIERJUkVDVE9SWSBQQVRICisJICovCisJc3RhdGljIGJvb2wgY2hlY2tSZWFkaW5nRmlsZShjb25zdCBzdGQ6OnN0cmluZyAmIHBhdGgpOworCXN0YXRpYyBib29sIGNoZWNrV3JpdGluZ0ZpbGUoY29uc3Qgc3RkOjpzdHJpbmcgJiBwYXRoKTsKKworCXN0YXRpYyBib29sIGNoZWNrV3JpdGluZ0ZpbGVGb2xkZXIoY29uc3Qgc3RkOjpzdHJpbmcgJiBwYXRoKTsKKworCXN0YXRpYyBib29sIGNoZWNrUmVhZGluZ0ZvbGRlcihjb25zdCBzdGQ6OnN0cmluZyAmIGRpcl9wYXRoKTsKKwlzdGF0aWMgYm9vbCBjaGVja1dyaXRpbmdGb2xkZXIoY29uc3Qgc3RkOjpzdHJpbmcgJiBkaXJfcGF0aCk7CisKKworCS8qKgorCSAqIExpc3QgYWxsIGZpbGVzCisJICovCisJc3RhdGljIGJvb2wgbGlzdEFsbEZpbGVzKAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBkaXJfcGF0aCwKKwkJCXN0ZDo6dmVjdG9yPCBzdGQ6OnN0cmluZyA+ICYgbGlzdE9mRmlsZXMsCisJCQlib29sIHJlY3Vyc2l2ZSA9IGZhbHNlKTsKKworCS8qKgorCSAqIGNvcHkgLyBtb3ZlCisJICovCisJc3RhdGljIGJvb2wgY29weVRvKAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBzcmNMb2NhdGlvbiwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgZGVzdExvY2F0aW9uKTsKKworCXN0YXRpYyBib29sIGNvcHlUb0ZvbGRlcigKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgc3JjTG9jYXRpb24sCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGRlc3RMb2NhdGlvbik7CisKKworCXN0YXRpYyBib29sIG1vdmVUbygKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgc3JjTG9jYXRpb24sCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGRlc3RMb2NhdGlvbik7CisKKwlzdGF0aWMgYm9vbCBtb3ZlVG9Gb2xkZXIoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIHNyY0xvY2F0aW9uLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBkZXN0TG9jYXRpb24pOworCisKKwkvKioKKwkgKiBVVElMUworCSAqLworCXN0YXRpYyBjb25zdCBjaGFyIFBhdGhTZXBhcmF0b3I7CisKKwlzdGF0aWMgYm9vbCBpc1BhdGhTZXBhcmF0b3IoY2hhciBjKTsKKworCisJc3RhdGljIHN0ZDo6c3RyaW5nIHBhcmVudChjb25zdCBzdGQ6OnN0cmluZyAmIGFMb2NhdGlvbik7CisKKwlzdGF0aWMgc3RkOjpzdHJpbmcgZmlsZW5hbWUoY29uc3Qgc3RkOjpzdHJpbmcgJiBhTG9jYXRpb24pOworCisJc3RhdGljIHN0ZDo6c3RyaW5nIHN0ZW0oY29uc3Qgc3RkOjpzdHJpbmcgJiBhTG9jYXRpb24pOworCisJaW5saW5lIHN0YXRpYyBzdGQ6OnN0cmluZyBiYXNlbmFtZShjb25zdCBzdGQ6OnN0cmluZyAmIGFMb2NhdGlvbikKKwl7CisJCXJldHVybiggc3RlbShhTG9jYXRpb24gKSApOworCX0KKworCXN0YXRpYyBzdGQ6OnN0cmluZyBleHRlbnNpb24oY29uc3Qgc3RkOjpzdHJpbmcgJiBhTG9jYXRpb24pOworCisJc3RhdGljIHN0ZDo6c3RyaW5nIHJlcGxhY2VfZXh0ZW5zaW9uKAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhTG9jYXRpb24sCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIG5ld0V4dGVuc2lvbik7CisKKworCXN0YXRpYyBzdGQ6OnN0cmluZyBwcmVmaXhGaWxlbmFtZSgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYUxvY2F0aW9uLAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUHJlZml4LAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBuZXdFeHRlbnNpb24gPSAiIik7CisKKwlzdGF0aWMgc3RkOjpzdHJpbmcgc3VmZml4RmlsZW5hbWUoCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIGFMb2NhdGlvbiwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVByZWZpeCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgbmV3RXh0ZW5zaW9uID0gIiIpOworCisJc3RhdGljIHN0ZDo6c3RyaW5nIHJlbGF0aXZlUGF0aCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgcmVmUGF0aCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVBhdGgsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIG5ld1ByZWZpeCA9ICIiKTsKKworCWlubGluZSBzdGF0aWMgc3RkOjpzdHJpbmcgcmVsYXRpdmVXb3Jrc3BhY2VQYXRoKAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUGF0aCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgbmV3UHJlZml4ID0gIjx3cm9vdD46IikKKwl7CisJCXJldHVybiggcmVsYXRpdmVQYXRoKFdvcmtzcGFjZVJvb3RQYXRoLCBhUGF0aCwgbmV3UHJlZml4KSApOworCX0KKworCWlubGluZSBzdGF0aWMgc3RkOjpzdHJpbmcgcmVsYXRpdmVQcm9qZWN0UGF0aCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVBhdGgsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIG5ld1ByZWZpeCA9ICI8cHJvaj46IikKKwl7CisJCXJldHVybiggcmVsYXRpdmVQYXRoKFByb2plY3RQYXRoLCBhUGF0aCwgbmV3UHJlZml4KSApOworCX0KKworCWlubGluZSBzdGF0aWMgc3RkOjpzdHJpbmcgcmVsYXRpdmVQcm9qZWN0U291cmNlUGF0aCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVBhdGgsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIG5ld1ByZWZpeCA9ICI8c3JjPjoiKQorCXsKKwkJcmV0dXJuKCByZWxhdGl2ZVBhdGgoUHJvamVjdFNvdXJjZVBhdGgsIGFQYXRoLCBuZXdQcmVmaXgpICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBzdGQ6OnN0cmluZyByZWxhdGl2ZVByb2plY3RPdXRwdXRQYXRoKAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUGF0aCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgbmV3UHJlZml4ID0gIjxvdXQ+OiIpCisJeworCQlyZXR1cm4oIHJlbGF0aXZlUGF0aChQcm9qZWN0T3V0cHV0UGF0aCwgYVBhdGgsIG5ld1ByZWZpeCkgKTsKKwl9CisKKwlpbmxpbmUgc3RhdGljIHN0ZDo6c3RyaW5nIHJlbGF0aXZlTG9nUGF0aCgKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgYVBhdGgsCisJCQljb25zdCBzdGQ6OnN0cmluZyAmIG5ld1ByZWZpeCA9ICI8bG9nPjoiKQorCXsKKwkJcmV0dXJuKCByZWxhdGl2ZVBhdGgoUHJvamVjdExvZ1BhdGgsIGFQYXRoLCBuZXdQcmVmaXgpICk7CisJfQorCisJaW5saW5lIHN0YXRpYyBzdGQ6OnN0cmluZyByZWxhdGl2ZVByb2plY3RUZGRQYXRoKAorCQkJY29uc3Qgc3RkOjpzdHJpbmcgJiBhUGF0aCwKKwkJCWNvbnN0IHN0ZDo6c3RyaW5nICYgbmV3UHJlZml4ID0gIjx0ZGQ+OiIpCisJeworCQlyZXR1cm4oIHJlbGF0aXZlUGF0aChQcm9qZWN0VGRkUGF0aCwgYVBhdGgsIG5ld1ByZWZpeCkgKTsKKwl9CisKKworCXN0YXRpYyBzdGQ6OnN0cmluZyB3cmFwUGF0aChjb25zdCBzdGQ6OnN0cmluZyAmIGFQYXRoLAorCQkJc3RkOjpzaXplX3Qgd3JhcFNpemUsIGNvbnN0IHN0ZDo6c3RyaW5nICYgbmV3UHJlZml4ID0gIi4uLiIgKTsKKworfTsKKworfSAvKiBuYW1lc3BhY2Ugc2VwICovCisKKyNlbmRpZiAvKiBBVk1fVkZTX0hfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy91dGlsL2NvbmZzLmguaW4gYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3NyYy91dGlsL2NvbmZzLmguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIwNzMzOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvc3JjL3V0aWwvY29uZnMuaC5pbgpAQCAtMCwwICsxLDM0IEBACisvKg0KKyAqIHZlcnNpb24uaA0KKyAqDQorICogIENyZWF0ZWQgb246IDgganVpbiAyMDE2DQorICogICAgICBBdXRob3I6IHNzMjE5MzI2DQorICovDQorDQorLyogV2FybmluZyA6IHRoaXMgZmlsZSBpcyBuZWVkZWQgYnkgQ01ha2UgdG8gZ2VuZXJhdGUgY29uZnMuaCANCisgKiBFeHByZXNzaW9uIEAuLkAgYXJlIHZhcmlhYmxlcyBpZGVudGlmaWVycyByZXBsYWNlZCBieSBDTWFrZSBhdA0KKyAqIGNvbmZpZ3VyZSB0aW1lIGJ5IHRoZWlyIGFjdHVhbCB2YWx1ZXMuIA0KKyAqIA0KKyAqIFRoZSByZXN1bHRpbmcgY29uZnMuaCBjYW4gYmUgaW5jbHVkZWQgYW55d2hlcmUgdGhlcmUgaXMgYSBuZWVkIA0KKyAqIHRvIGtub3duIHRoZSBhY3R1YWwgbmF0aXZlIHR5cGVzIHNpemUgKGluIGJ5dGVzKS4NCisgKi8NCisgDQorI2lmbmRlZiBNQUlOX0NPTkZTX0hfSU5fDQorI2RlZmluZSBNQUlOX0NPTkZTX0hfSU5fDQorDQorI2luY2x1ZGUgPHN0cmluZz4NCisNCit1c2luZyBuYW1lc3BhY2Ugc3RkOw0KKw0KK25hbWVzcGFjZSBzZXAgew0KKw0KK2NvbnN0IGludCBpbnRfc2l6ZSAgICAgICAoQElOVF9TSVpFQCk7DQorY29uc3QgaW50IHNob3J0X2ludF9zaXplIChAU0hPUlRfSU5UX1NJWkVAKTsNCitjb25zdCBpbnQgbG9uZ19pbnRfc2l6ZSAgKEBMT05HX0lOVF9TSVpFQCk7DQorY29uc3QgaW50IGNoYXJfc2l6ZSAgICAgIChAQ0hBUl9TSVpFQCk7DQorY29uc3Qgc3RyaW5nIHN5c3RlbV9uYW1lICgiQENNQUtFX1NZU1RFTUAtQENNQUtFX1NZU1RFTV9QUk9DRVNTT1JAIik7DQorDQorfSAvKiBuYW1lc3BhY2Ugc2VwICovDQorDQorDQorI2VuZGlmIC8qIE1BSU5fQ09ORlNfSF9JTl8gKi8NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3V0ZXN0cy9DTWFrZUxpc3RzLnR4dCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvdXRlc3RzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMmQyMWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3V0ZXN0cy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDI0IEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorIyAgICAgICAgICAgICAgICAgICAgQ01ha2UgTWFzdGVyIEZpbGUgZm9yIFN5bWJleCBVbml0IFRlc3RzDQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKyMNCisNCisjIE1pbmltdW0gcmVxdWlyZWQgQ01ha2UgdmVyc2lvbg0KK2NtYWtlX21pbmltdW1fcmVxdWlyZWQgKFZFUlNJT04gMi44IEZBVEFMX0VSUk9SKQ0KKw0KKyMgVGVsbCBjbWFrZSB3aGVyZSB0byBmaW5kIGl0cyBvd24gbW9kdWxlcw0KK2xpc3QgKEFQUEVORCBDTUFLRV9NT0RVTEVfUEFUSCAke0NNQUtFX1NPVVJDRV9ESVJ9L3V0ZXN0cy9jbWFrZSkNCitsaXN0IChBUFBFTkQgQ01BS0VfTU9EVUxFX1BBVEggJHtDTUFLRV9TT1VSQ0VfRElSfS9jbWFrZSkNCisNCisjIFByaW50IHRpdGxlIGJhbm5lcg0KK3NldCAoQkFOTkVSX01FU1NBR0UgIlRoaXMgaXMgU3ltYmV4IFVuaXQgVGVzdCIpDQoraW5jbHVkZSAoUHJpbnRCYW5uZXIpDQorDQorIyBTZWFyY2hpbmcgZm9yIFN5bWJleCBpbnRlcm5hbCBsaWJyYXJpZXMNCisjIFVuaXQgdGVzdHMgYXJlIGJ1aWx0IGFnYWluc3QgU3ltYmV4IGludGVybmFsIGxpYnJhcmllcyBhbmQgbG9vayBmb3IgdGhlbSBpbiBTWU1CRVhfQklOQVJZX0RJUg0KKyMgVGhlIGZvbGxvd2luZyBsaW5lIHN1cHBvc2UgdGhleSBoYXZlIGJlZW4gYnVpbHQgaW4gYnVpbGRzLy4uLiAoZGVmYXVsdCBsb2NhdGlvbikNCitzZXQgKFNZTUJFWF9CSU5BUllfRElSICR7Q01BS0VfQklOQVJZX0RJUn0vLi4pDQoraW5jbHVkZSAoTG9va0ZvclN5bWJleExpYnMpDQorDQorIyBQcm9qZWN0IGRlZmluaXRpb24gKGRpcmVjdG9yaWVzIGhpZXJhcmNoeSwgbWFpbiB0YXJnZXQgc291cmNlcywgbGluaykNCitpbmNsdWRlIChEZWZpbmVTeW1iZXhVbml0VGVzdFByb2plY3QpDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC91dGVzdHMvYmFzZS9DTWFrZUxpc3RzLnR4dCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvdXRlc3RzL2Jhc2UvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThiMTJjOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvdXRlc3RzL2Jhc2UvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwyNCBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKyMgICAgICAgICAgICAgICAgICAgICAgQ01ha2UgZmlsZSBmb3IgdGhlIEJhc2UgbGlicmFyeSB0ZXN0aW5nDQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKw0KK21lc3NhZ2UgKFNUQVRVUyAiKioqKioqIERlZmluaW5nIHVuaXQgdGVzdHMgKioqKioqIikNCisNCisNCisjIERlZmluZSBUZXN0IHJ1bm5lciBmb3IgdGhlIGJhc2UgbGlicmFyeQ0KK2ZpbGUgKEdMT0JfUkVDVVJTRSBUX0JBU0VfQ1hYX1NSQ19GSUxFUyB0XyouY3BwIHRfKi5oKQ0KKw0KK2FkZF9leGVjdXRhYmxlKHRfYmFzZV9ydW5uZXIgJHtUX0JBU0VfQ1hYX1NSQ19GSUxFU30pDQorDQorDQorIyBGaW5kIGhlYWRlciByZXF1aXJlZCB0byBjb21waWxlIHRoZSB0ZXN0IHJ1bm5lciANCit0YXJnZXRfaW5jbHVkZV9kaXJlY3RvcmllcyAodF9iYXNlX3J1bm5lciBQVUJMSUMgJHtCb29zdF9JTkNMVURFX0RJUlN9KQ0KK3RhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzICh0X2Jhc2VfcnVubmVyIFBVQkxJQyAuLi8uLi9zcmMpDQorDQorIyBMaW5rIHJlcXVpcmVkIGxpYnJhaXJpZXMgdG8gdGhlIHRlc3QgcnVubmVyDQorI3RhcmdldF9saW5rX2xpYnJhcmllcyh0X2Jhc2VfcnVubmVyIGJhc2UgJHtCb29zdF9MSUJSQVJZX0RJUlN9L2xpYmJvb3N0X3VuaXRfdGVzdF9mcmFtZXdvcmstbXQuYSkNCit0YXJnZXRfbGlua19saWJyYXJpZXModF9iYXNlX3J1bm5lciBiYXNlICR7Qm9vc3RfTElCUkFSWV9ESVJTfS9saWJib29zdF91bml0X3Rlc3RfZnJhbWV3b3JrLmEpDQorDQorIyBEZWZpbmUgdGVzdHMNCithZGRfdGVzdCAoTkFNRSB0X0luc3RhbmNlQ291bnRlcl9hbGwgQ09NTUFORCB0X2Jhc2VfcnVubmVyIC0tbG9nX2xldmVsPXRlc3Rfc3VpdGUgLS1ydW5fdGVzdD1CYXNlL3RfSW5zdGFuY2VDb3VudGVyX2FsbCkNCisNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3V0ZXN0cy9iYXNlL3RfSW5zdGFuY2VDb3VudGVyLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvdXRlc3RzL2Jhc2UvdF9JbnN0YW5jZUNvdW50ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMDhlYTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3V0ZXN0cy9iYXNlL3RfSW5zdGFuY2VDb3VudGVyLmNwcApAQCAtMCwwICsxLDEwOSBAQAorLyoNCisgKiAgIFVuaXQgdGVzdCBvZiBJbnN0YW5jZUNvdW50ZXIgY2xhc3MNCisgKi8NCisNCisNCisjaW5jbHVkZSA8aW9zdHJlYW0+DQorI2luY2x1ZGUgPHN0cmluZz4NCisNCisjaW5jbHVkZSAiYm9vc3QvdGVzdC91bml0X3Rlc3QuaHBwIg0KKw0KKyNpbmNsdWRlICJwcmludGVyL091dFN0cmVhbS5oIg0KKyNpbmNsdWRlICJiYXNlL0luc3RhbmNlQ291bnRlci5oIg0KKw0KKw0KK3VzaW5nIG5hbWVzcGFjZSBzdGQ7DQordXNpbmcgbmFtZXNwYWNlIHNlcDsNCisNCisNCisvLyBMb2NhbCBmaXh0dXJlcw0KK091dFN0cmVhbSBvcygmY291dCk7DQorY2xhc3MgQSA6IHB1YmxpYyBJbnN0YW5jZUNvdW50ZXI8QT4ge307ICAgICAgICAgICAgLy8gUmVndWxhciBjYXNlDQorY2xhc3MgQiA6IHB1YmxpYyBBIHt9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG8gc2VlIHdoYXQgaGFwcGVucyB3aXRoIGhlcml0YWdlDQorY2xhc3MgQyA6IHB1YmxpYyBBLCBwdWJsaWMgSW5zdGFuY2VDb3VudGVyPEM+IHt9OyAgLy8gVG8gc2VlIHdoYXQgaGFwcGVucyB3aXRoIG11bHRpcGxlIGhlcml0YWdlDQorDQorDQorQk9PU1RfQVVUT19URVNUX1NVSVRFKEJhc2UpOw0KKw0KK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRfSW5zdGFuY2VDb3VudGVyX2FsbCkgew0KKwkvLyBEdWUgdG8gdGhlIG5hdHVyZSBvZiB0aGUgdGVzdGVkIG1lY2hhbmlzbSAoaW5zdGFuY2UgY291bnRpbmcpLCB3ZSBhcmUgdW5hYmxlIHRvIGNyZWF0ZQ0KKwkvLyBtdWx0aXBsZSBpbmRlcGVuZGVudCB1bml0IHRlc3QgY2FzZXMgKGFzIHdlIHNob3VsZCBoYXZlIGJlZW4pDQorCS8vIEhlbmNlIGFsbCBhc3NlcnRpb25zIGFyZSBjaGVja2VkIHdpdGhpbiB0aGUgc2FtZSBiaWcgdGVzdCBjYXNlDQorDQorCUE6OnNob3dDb3VudGVycyhvcywgIkEiKTsNCisNCisgICAgLy8gTm8gaW5zdGFuY2UgY3JlYXRlZA0KKwlCT09TVF9DSEVDSyhBOjpJTlNUQU5DRV9BTElWRSA9PSAwKTsNCisJQk9PU1RfQ0hFQ0soQTo6SU5TVEFOQ0VfQ1JFQVRFRCA9PSAwKTsNCisNCisJLy8gSW5zdGFuY2UgY3JlYXRlZCBhcyBhbiBhdXRvbWF0aWMgdmFyaWFibGUNCisJQSBhMTsNCisJYTEuc2hvd0NvdW50ZXJzKG9zLCAiQSIpOw0KKwlCT09TVF9DSEVDSyhhMS5JTlNUQU5DRV9BTElWRSA9PSAxKTsNCisJQk9PU1RfQ0hFQ0soYTEuSU5TVEFOQ0VfQ1JFQVRFRCA9PSAxKTsNCisNCisJLy8gSW5zdGFuY2UgY3JlYXRlZCBhcyBhbiBhdXRvbWF0aWMgdmFyaWFibGUgaW4gYSBzdWJibG9jayAuLi4NCisJew0KKwkJQSBhMjsNCisJCWEyLnNob3dDb3VudGVycyhvcywgIkEiKTsNCisJCUJPT1NUX0NIRUNLKGEyLklOU1RBTkNFX0FMSVZFID09IDIpOw0KKwkJQk9PU1RfQ0hFQ0soYTIuSU5TVEFOQ0VfQ1JFQVRFRCA9PSAyKTsNCisJfQ0KKyAgICAvLyAuLi4gc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgZGVsZXRlZCBvdXRzaWRlIHRoZSBibG9jaw0KKwlhMS5zaG93Q291bnRlcnMob3MsICJBIik7DQorCUJPT1NUX0NIRUNLKGExLklOU1RBTkNFX0FMSVZFID09IDEpOw0KKwlCT09TVF9DSEVDSyhhMS5JTlNUQU5DRV9DUkVBVEVEID09IDIpOw0KKw0KKwkvLyBSZWZlcmVuY2Ugb24gZXhpc3RpbmcgaW5zdGFuY2UNCisJQSYgcmExID0gYTE7DQorCWExLnNob3dDb3VudGVycyhvcywgIkEiKTsNCisJQk9PU1RfQ0hFQ0socmExLklOU1RBTkNFX0FMSVZFID09IDEpOw0KKwlCT09TVF9DSEVDSyhyYTEuSU5TVEFOQ0VfQ1JFQVRFRCA9PSAyKTsNCisJQk9PU1RfQ0hFQ0soYTEuSU5TVEFOQ0VfQUxJVkUgPT0gcmExLklOU1RBTkNFX0FMSVZFKTsNCisJQk9PU1RfQ0hFQ0soYTEuSU5TVEFOQ0VfQ1JFQVRFRCA9PSByYTEuSU5TVEFOQ0VfQ1JFQVRFRCk7DQorDQorCS8vIFBvaW50ZXIgb24gZXhpc3RpbmcgaW5zdGFuY2UNCisJQSogcGExID0gJmExOw0KKwlhMS5zaG93Q291bnRlcnMob3MsICJBIik7DQorCUJPT1NUX0NIRUNLKHBhMS0+SU5TVEFOQ0VfQUxJVkUgPT0gMSk7DQorCUJPT1NUX0NIRUNLKHBhMS0+SU5TVEFOQ0VfQ1JFQVRFRCA9PSAyKTsNCisJQk9PU1RfQ0hFQ0soYTEuSU5TVEFOQ0VfQUxJVkUgPT0gcGExLT5JTlNUQU5DRV9BTElWRSk7DQorCUJPT1NUX0NIRUNLKGExLklOU1RBTkNFX0NSRUFURUQgPT0gcGExLT5JTlNUQU5DRV9DUkVBVEVEKTsNCisNCisJLy8gSW5zdGFuY2UgY3JlYXRlZCBvbiB0aGUgaGVhcCAuLi4NCisJQSogcGEzID0gbmV3IEEoKTsNCisJcGEzLT5zaG93Q291bnRlcnMob3MsICJBIik7DQorCUJPT1NUX0NIRUNLKHBhMy0+SU5TVEFOQ0VfQUxJVkUgPT0gMik7DQorCUJPT1NUX0NIRUNLKHBhMy0+SU5TVEFOQ0VfQ1JFQVRFRCA9PSAzKTsNCisJLy8gLi4uIHRoZW4gZGVsZXRlZA0KKwlkZWxldGUgcGEzOw0KKwlhMS5zaG93Q291bnRlcnMob3MsICJBIik7DQorCUJPT1NUX0NIRUNLKGExLklOU1RBTkNFX0FMSVZFID09IDEpOw0KKwlCT09TVF9DSEVDSyhhMS5JTlNUQU5DRV9DUkVBVEVEID09IDMpOw0KKw0KKwkvLyBDb3VudGluZyBtZWNhbmlzbSBzaG91bGQgd29ya3MgdGhyb3VnaCBoZXJpdGFnZSByZWxhdGlvbnMNCisJQiBiOyAgIC8vIFJlbWluZCA6IEIgaXMgYSBBDQorCWIuc2hvd0NvdW50ZXJzKG9zLCAiQiIpOw0KKwlCT09TVF9DSEVDSyhiLklOU1RBTkNFX0FMSVZFID09IDIpOw0KKwlCT09TVF9DSEVDSyhiLklOU1RBTkNFX0NSRUFURUQgPT0gNCk7DQorDQorCS8vIGFuZCB0aHJvdWdoIHVwY2FzdA0KKwlBIGE0ID0gKEEpIGI7IC8vIFVwY2FzdCBjaGFuZ2VzIG5vdGhpbmcNCisJYTQuc2hvd0NvdW50ZXJzKG9zLCAiQSIpOw0KKwlCT09TVF9DSEVDSyhhNC5JTlNUQU5DRV9BTElWRSA9PSAyKTsNCisJQk9PU1RfQ0hFQ0soYTQuSU5TVEFOQ0VfQ1JFQVRFRCA9PSA0KTsNCisNCisJLy8gV2hhdCBoYXBwZW5zIHdpdGggbXVsdGlwbGUgaGVyaXRhZ2UNCisJQyBjOw0KKwkvLyBjLnNob3dDb3VudGVycyhjb3V0LCAiQyIpOyAvLyBEb2Vzbid0IGNvbXBpbGUgZHVlIHRvIHRoZSBhbWJpZ3VpdHkgb2Ygc2hvd0NvdW50ZXJzKCkgaW4gdGhlIG11bHRpcGxlIGhlcml0YWdlIChub3JtYWwpDQorCS8vIEluIHRoaXMgY2FzZSB3ZSBoYXZlIHRvIGNob29zZSB3aGljaCBjb3VudGVyIHdlIHdhbnQgdG8gcXVlcnkgOg0KKwljLkluc3RhbmNlQ291bnRlcjxDPjo6c2hvd0NvdW50ZXJzKG9zLCAiQyIpOyAvLyBDOiAxLzENCisJYy5JbnN0YW5jZUNvdW50ZXI8QT46OnNob3dDb3VudGVycyhvcywgIkEiKTsgLy8gQTogMy81DQorCUJPT1NUX0NIRUNLKGMuSW5zdGFuY2VDb3VudGVyPEM+OjpJTlNUQU5DRV9BTElWRSA9PSAxKTsNCisJQk9PU1RfQ0hFQ0soYy5JbnN0YW5jZUNvdW50ZXI8Qz46OklOU1RBTkNFX0NSRUFURUQgPT0gMSk7DQorCUJPT1NUX0NIRUNLKGMuSW5zdGFuY2VDb3VudGVyPEE+OjpJTlNUQU5DRV9BTElWRSA9PSAzKTsNCisJQk9PU1RfQ0hFQ0soYy5JbnN0YW5jZUNvdW50ZXI8QT46OklOU1RBTkNFX0NSRUFURUQgPT0gNSk7DQorfQ0KKw0KK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKTsgLy8gQkFTRQ0KKw0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvdXRlc3RzL2Jhc2UvdF9iYXNlX3J1bm5lci5jcHAgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3V0ZXN0cy9iYXNlL3RfYmFzZV9ydW5uZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxODI3NGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3V0ZXN0cy9iYXNlL3RfYmFzZV9ydW5uZXIuY3BwCkBAIC0wLDAgKzEsNyBAQAorLyogTWFpbiBmaWxlIGZvciB0ZXN0IHJ1bm5lciAqLw0KKw0KKyNkZWZpbmUgQk9PU1RfVEVTVF9NQUlODQorDQorI2luY2x1ZGUgImJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcCINCisNCisvKiBOb3RoaW5nIG1vcmUgaGVyZSwgdGhlIEJvb3N0IFJ1bnRpbWUgdGFrZXMgY2FyZSBvZiBldmVyeXRoaW5nICovDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC91dGVzdHMvY21ha2UvRGVmaW5lU3ltYmV4VW5pdFRlc3RQcm9qZWN0LmNtYWtlIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC91dGVzdHMvY21ha2UvRGVmaW5lU3ltYmV4VW5pdFRlc3RQcm9qZWN0LmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZmY4ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3V0ZXN0cy9jbWFrZS9EZWZpbmVTeW1iZXhVbml0VGVzdFByb2plY3QuY21ha2UKQEAgLTAsMCArMSw0IEBACittZXNzYWdlIChTVEFUVVMgIioqKioqKiBEZWZpbmluZyBwcm9qZWN0KioqKioqIikNCisNCithZGRfc3ViZGlyZWN0b3J5IChiYXNlKQ0KK2FkZF9zdWJkaXJlY3RvcnkgKGZtbCkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3V0ZXN0cy9jbWFrZS9Mb29rRm9yU3ltYmV4TGlicy5jbWFrZSBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvdXRlc3RzL2NtYWtlL0xvb2tGb3JTeW1iZXhMaWJzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZjMxMmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3V0ZXN0cy9jbWFrZS9Mb29rRm9yU3ltYmV4TGlicy5jbWFrZQpAQCAtMCwwICsxLDI4IEBACisNCisjW1sNCithZGRfbGlicmFyeSAoYmFzZSAgICAgICBTVEFUSUMgSU1QT1JURUQpDQorYWRkX2xpYnJhcnkgKGJ1aWxkZXIgICAgU1RBVElDIElNUE9SVEVEKQ0KK2FkZF9saWJyYXJ5IChjb2xsZWN0aW9uIFNUQVRJQyBJTVBPUlRFRCkNCithZGRfbGlicmFyeSAoY29tbW9uICAgICBTVEFUSUMgSU1QT1JURUQpDQorYWRkX2xpYnJhcnkgKGNvbXB1dGVyICAgU1RBVElDIElNUE9SVEVEKQ0KK2FkZF9saWJyYXJ5IChmYW0gICAgICAgIFNUQVRJQyBJTVBPUlRFRCkNCithZGRfbGlicmFyeSAoZm1sICAgICAgICBTVEFUSUMgSU1QT1JURUQpDQorYWRkX2xpYnJhcnkgKHBhcnNlciAgICAgU1RBVElDIElNUE9SVEVEKQ0KK2FkZF9saWJyYXJ5IChwcmludGVyICAgIFNUQVRJQyBJTVBPUlRFRCkNCithZGRfbGlicmFyeSAoc2V3ICAgICAgICBTVEFUSUMgSU1QT1JURUQpDQorYWRkX2xpYnJhcnkgKHNvbHZlciAgICAgU1RBVElDIElNUE9SVEVEKQ0KK2FkZF9saWJyYXJ5ICh1dGlsICAgICAgIFNUQVRJQyBJTVBPUlRFRCkNCisNCitzZXRfcHJvcGVydHkgKFRBUkdFVCBiYXNlICAgICAgIFBST1BFUlRZIElNUE9SVEVEX0xPQ0FUSU9OICR7U1lNQkVYX0JJTkFSWV9ESVJ9L2Jhc2UvbGliYmFzZS5hKQ0KK3NldF9wcm9wZXJ0eSAoVEFSR0VUIGJ1aWxkZXIgICAgUFJPUEVSVFkgSU1QT1JURURfTE9DQVRJT04gJHtTWU1CRVhfQklOQVJZX0RJUn0vYnVpbGRlci9saWJidWlsZGVyLmEpDQorc2V0X3Byb3BlcnR5IChUQVJHRVQgY29sbGVjdGlvbiBQUk9QRVJUWSBJTVBPUlRFRF9MT0NBVElPTiAke1NZTUJFWF9CSU5BUllfRElSfS9jb2xsZWN0aW9uL2xpYmNvbGxlY3Rpb24uYSkNCitzZXRfcHJvcGVydHkgKFRBUkdFVCBjb21tb24gICAgIFBST1BFUlRZIElNUE9SVEVEX0xPQ0FUSU9OICR7U1lNQkVYX0JJTkFSWV9ESVJ9L2NvbW1vbi9saWJjb21tb24uYSkNCitzZXRfcHJvcGVydHkgKFRBUkdFVCBjb21wdXRlciAgIFBST1BFUlRZIElNUE9SVEVEX0xPQ0FUSU9OICR7U1lNQkVYX0JJTkFSWV9ESVJ9L2NvbXB1dGVyL2xpYmNvbXB1dGVyLmEpDQorc2V0X3Byb3BlcnR5IChUQVJHRVQgZmFtICAgICAgICBQUk9QRVJUWSBJTVBPUlRFRF9MT0NBVElPTiAke1NZTUJFWF9CSU5BUllfRElSfS9mYW0vbGliZmFtLmEpDQorc2V0X3Byb3BlcnR5IChUQVJHRVQgZm1sICAgICAgICBQUk9QRVJUWSBJTVBPUlRFRF9MT0NBVElPTiAke1NZTUJFWF9CSU5BUllfRElSfS9mbWwvbGliZm1sLmEpDQorc2V0X3Byb3BlcnR5IChUQVJHRVQgcGFyc2VyICAgICBQUk9QRVJUWSBJTVBPUlRFRF9MT0NBVElPTiAke1NZTUJFWF9CSU5BUllfRElSfS9wYXJzZXIvbGlicGFyc2VyLmEpDQorc2V0X3Byb3BlcnR5IChUQVJHRVQgcHJpbnRlciAgICBQUk9QRVJUWSBJTVBPUlRFRF9MT0NBVElPTiAke1NZTUJFWF9CSU5BUllfRElSfS9wcmludGVyL2xpYnByaW50ZXIuYSkNCitzZXRfcHJvcGVydHkgKFRBUkdFVCBzZXcgICAgICAgIFBST1BFUlRZIElNUE9SVEVEX0xPQ0FUSU9OICR7U1lNQkVYX0JJTkFSWV9ESVJ9L3Nldy9saWJzZXcuYSkNCitzZXRfcHJvcGVydHkgKFRBUkdFVCBzb2x2ZXIgICAgIFBST1BFUlRZIElNUE9SVEVEX0xPQ0FUSU9OICR7U1lNQkVYX0JJTkFSWV9ESVJ9L3NvbHZlci9saWJzb2x2ZXIuYSkNCitzZXRfcHJvcGVydHkgKFRBUkdFVCB1dGlsICAgICAgIFBST1BFUlRZIElNUE9SVEVEX0xPQ0FUSU9OICR7U1lNQkVYX0JJTkFSWV9ESVJ9L3V0aWwvbGlidXRpbC5hKQ0KKyNdXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvdXRlc3RzL2ZtbC9DTWFrZUxpc3RzLnR4dCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvdXRlc3RzL2ZtbC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzQwNzg4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC91dGVzdHMvZm1sL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMzAgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisjICAgICAgICAgICAgICAgICAgICAgIENNYWtlIGZpbGUgZm9yIHRoZSBGTUwgbGlicmFyeSB0ZXN0aW5nDQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKw0KKw0KKyMgRGVmaW5lIFRlc3QgcnVubmVyIGZvciB0aGUgRk1MIGxpYnJhcnkNCitmaWxlIChHTE9CX1JFQ1VSU0UgVF9GTUxfQ1hYX1NSQ19GSUxFUyB0XyouY3BwIHRfKi5oKQ0KK2FkZF9leGVjdXRhYmxlKHRfZm1sX3J1bm5lciAke1RfRk1MX0NYWF9TUkNfRklMRVN9KQ0KKw0KKyMgRmluZCBoZWFkZXIgcmVxdWlyZWQgdG8gY29tcGlsZSB0aGUgdGVzdCBydW5uZXIgDQordGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMgKHRfZm1sX3J1bm5lciBQVUJMSUMgJHtCb29zdF9JTkNMVURFX0RJUlN9KSANCit0YXJnZXRfaW5jbHVkZV9kaXJlY3RvcmllcyAodF9mbWxfcnVubmVyIFBVQkxJQyAuLi8uLi9zcmMpDQorDQorIyBMaW5rIHJlcXVpcmVkIGxpYnJhaXJpZXMgdG8gdGhlIHRlc3QgcnVubmVyICMgRklYTUUgOiB0b28gbXVjaCBsaWJyYXJpZXMgYW5kIGR1cGxpY2F0ZXMgaGVyZQ0KK3RhcmdldF9saW5rX2xpYnJhcmllcyh0X2ZtbF9ydW5uZXIgYmFzZSBmYW0gZm1sIHNldyBwYXJzZXIgZmFtIGZtbCBmYW0gYnVpbGRlciBzZXcgc29sdmVyIGNvbXB1dGVyIGZtbCBjb21tb24gY29sbGVjdGlvbiBwcmludGVyIHV0aWwgY29tbW9uICR7QU5UTFIyX0xJQlJBUklFU30gJHtBTlRMUjNfTElCUkFSSUVTfSAke0Jvb3N0X0xJQlJBUklFU30gJHtDVkM0X0xJQlJBUklFU30gJHtsaWJfZ21wX2N9ICR7bGliX2dtcF9jeHh9KQ0KKw0KKyMgRGVmaW5lIHRlc3RzDQorbGlzdCAoQVBQRU5EIFRFU1RfTkFNRVMgdF9pbnRlZ2VyX2N0b3IgIHRfaW50ZWdlcl9iaWcgIHRfaW50ZWdlcl9tYXh1aW50ICB0X2ludGVnZXJfbWF4bG9uZyAgdF9pbnRlZ2VyXzEwcG93MTIzKQ0KK2xpc3QgKEFQUEVORCBURVNUX05BTUVTIHRfcmF0aW9uYWxfY3RvciB0X3JhdGlvbmFsX2JpZyB0X3JhdGlvbmFsX21heHVpbnQgdF9yYXRpb25hbF9tYXhsb25nIHRfcmF0aW9uYWxfZGVjaW1hbF9iaWcpDQorbGlzdCAoQVBQRU5EIFRFU1RfTkFNRVMgdF9mbG9hdF9jdG9yICAgIHRfZmxvYXRfYmlnICAgIHRfZmxvYXRfbWF4dWludCAgICB0X2Zsb2F0X21heGxvbmcpIA0KK2xpc3QgKEFQUEVORCBURVNUX05BTUVTIHRfbnVtZXJpY19jdG9yICB0X251bWVyaWNfY3Rvcl9kZWNpbWFsX2V4Y3AgdF9udW1lcmljX2N0b3JfZGVjaW1hbCB0X251bWVyaWNfY3Rvcl9mcmFjIHRfbnVtZXJpY19mcmFjX3NpbXBsaWYpDQorDQorIyB0ZXN0cyBvbiBvcHRpb25hbCBsaWJyYXJpZXMgdGhhdCBhcmUgbm90IHlldCBpbnRlZ3JhdGVkIGludG8gZGl2ZXJzaXR5IGluc3RhbGwgcHJvY2Vzcw0KKyNsaXN0IChBUFBFTkQgVEVTVCBOQU1FUyB0X2dpbmFjX2V4cHJlc3Npb25fcHJpbnRpbmcgdF9naW5hY19leHByZXNzaW9uX25vdF9vcl9zdWJzdGl0dXRpb24gdF9naW5hY19leHByZXNzaW9uX25vdF9hbmRfc3Vic3RpdHV0aW9uIHRfZ2luYWNfZXhwcmVzc2lvbl9hbmRfb3JfY29tcG9zaXRpb25fZXF1aXZhbGVuY2UpDQorI2xpc3QgKEFQUEVORCBURVNUIE5BTUVTIHRfeWljZXNfZXhwcmVzc2lvbl9wcmludGluZykNCisNCitmb3JlYWNoIChURVNUX05BTUUgJHtURVNUX05BTUVTfSkNCisgICAgYWRkX3Rlc3QgKE5BTUUgJHtURVNUX05BTUV9IENPTU1BTkQgdF9mbWxfcnVubmVyIC0tbG9nX2xldmVsPXRlc3Rfc3VpdGUgLS1ydW5fdGVzdD1GTUwvJHtURVNUX05BTUV9ICkNCitlbmRmb3JlYWNoKCkNCisNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3V0ZXN0cy9mbWwvdF9FeHByZXNzaW9uQ29uc3RydWN0b3IuY3BwIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC91dGVzdHMvZm1sL3RfRXhwcmVzc2lvbkNvbnN0cnVjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzZlNDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC91dGVzdHMvZm1sL3RfRXhwcmVzc2lvbkNvbnN0cnVjdG9yLmNwcApAQCAtMCwwICsxLDUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4NCisgKg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDcmVhdGVkIG9uOiAyMyBqdWluIDIwMTYNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgU3RlcGhhbmUgU2FsbW9ucyAoQ0VBIExJU1QpIHN0ZXBoYW5lLnNhbG1vbnNAZ21haWwuY29tDQorICogICAtIEluaXRpYWwgQVBJIGFuZCBJbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2luY2x1ZGUgImJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcCINCisNCisNCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkNvbnN0cnVjdG9yLmg+DQorDQorDQordXNpbmcgbmFtZXNwYWNlIHN0ZDsNCit1c2luZyBuYW1lc3BhY2Ugc2VwOw0KKw0KK0JPT1NUX0FVVE9fVEVTVF9TVUlURSAoRk1MKTsNCisNCitCT09TVF9BVVRPX1RFU1RfQ0FTRSAodF9leHByY3Rvcl9uZXdpbnRlZ2VyKSB7DQorCUJPT1NUX0NIRUNLX01FU1NBR0UgKCI1MTIiID09IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3RXhwckludGVnZXIoIjUxMiIpLnN0cigpLCAibmV3RXhwckludGVnZXIoNTEyKSAhPSA1MTIiKTsNCit9DQorDQorDQorQk9PU1RfQVVUT19URVNUX0NBU0UgKHRfZXhwcmN0b3JfbmV3aW50ZWdlcl9kZWNpbWFsX2V4Y3ApIHsNCisJQk9PU1RfQ0hFQ0tfTUVTU0FHRSAoIjUiID09IEV4cHJlc3Npb25Db25zdHJ1Y3Rvcjo6bmV3RXhwckludGVnZXIoIjUuMTIiKS5zdHIoKSwgIm5ld0V4cHJJbnRlZ2VyKDUuMTIpICE9IDUiKTsNCit9DQorDQorQk9PU1RfQVVUT19URVNUX0NBU0UgKHRfZXhwcmN0b3JfbmV3aW50ZWdlcl9OVUxMKSB7DQorCUJPT1NUX0NIRUNLX01FU1NBR0UgKCIwIiA9PSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0V4cHJJbnRlZ2VyKE5VTEwpLnN0cigpLCAibmV3RXhwckludGVnZXIoTlVMTCkgIT0gMCIpOw0KK30NCisNCisNCitCT09TVF9BVVRPX1RFU1RfQ0FTRSAodF9leHByY3Rvcl9uZXdyYXRpb25hbF9kZWMyZnJhYykgew0KKwlCT09TVF9DSEVDS19NRVNTQUdFICgiMTI4LzI1IiA9PSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0V4cHJSYXRpb25hbCgiNS4xMiIpLnN0cigpLCAibmV3RXhwclJhdGlvbmFsKDUuMTIpICE9IDEyOC8yNSIpOw0KK30NCisNCitCT09TVF9BVVRPX1RFU1RfQ0FTRSAodF9leHByY3Rvcl9uZXdyYXRpb25hbF9kZWMyZGVjKSB7DQorCUJPT1NUX0NIRUNLX01FU1NBR0UgKCI1LjEyIiA9PSBFeHByZXNzaW9uQ29uc3RydWN0b3I6Om5ld0V4cHJSYXRpb25hbCgiNS4xMiIpLnN0cigpLCAibmV3RXhwclJhdGlvbmFsKDUuMTIpICE9NS4xMiIpOw0KK30NCisNCisNCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCk7IC8vIEZNTA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvdXRlc3RzL2ZtbC90X0Zsb2F0LmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvdXRlc3RzL2ZtbC90X0Zsb2F0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDFlZGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC91dGVzdHMvZm1sL3RfRmxvYXQuY3BwCkBAIC0wLDAgKzEsNTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULg0KKyAqDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENyZWF0ZWQgb246IDIzIGp1aW4gMjAxNg0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICBTdGVwaGFuZSBTYWxtb25zIChDRUEgTElTVCkgc3RlcGhhbmUuc2FsbW9uc0BnbWFpbC5jb20NCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIEltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSA8aW9zdHJlYW0+DQorDQorI2luY2x1ZGUgImJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcCINCisNCisjaW5jbHVkZSAiZm1sL251bWVyaWMvRmxvYXQuaCINCisjaW5jbHVkZSAidXRpbC9hdm1fbnVtZXJpYy5oIg0KKw0KK3VzaW5nIG5hbWVzcGFjZSBzdGQ7DQordXNpbmcgbmFtZXNwYWNlIHNlcDsNCisNCisNCitCT09TVF9BVVRPX1RFU1RfU1VJVEUgKEZNTCk7DQorDQorQk9PU1RfQVVUT19URVNUX0NBU0UgKHRfZmxvYXRfY3Rvcikgew0KKwlGbG9hdCBGKCIxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODkiKTsNCit9DQorDQorQk9PU1RfQVVUT19URVNUX0NBU0UgKHRfZmxvYXRfYmlnKSB7DQorCUZsb2F0IEYoIjEyMzQ1Njc4OTEyMzQ1Njc4OTEyMzQ1Njc4OTEyMzQ1Njc4OSIpOw0KKwlCT09TVF9DSEVDS19NRVNTQUdFKCIxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODkiID09IEYuc3RyKCksIEYuc3RyKCkgPDwgIiBpcyBub3QgIiA8PCAiMTIzNDU2Nzg5MTIzNDU2Nzg5MTIzNDU2Nzg5MTIzNDU2Nzg5Iik7DQorCUJPT1NUX0NIRUNLICghIEYuaXNJbnQzMigpKTsNCisJQk9PU1RfQ0hFQ0sgKCEgRi5pc0ludDY0KCkpOw0KKwlCT09TVF9DSEVDSyAoISBGLmlzSW50ZWdlcigpKTsNCisJQk9PU1RfQ0hFQ0sgKCEgRi5pc1Bvc0ludGVnZXIoKSk7DQorfQ0KKw0KK0JPT1NUX0FVVE9fVEVTVF9DQVNFICh0X2Zsb2F0X21heHVpbnQpIHsNCisJRmxvYXQgRihBVk1fTlVNRVJJQ19NQVhfVUlOVCk7DQorCUJPT1NUX0NIRUNLICggIEYuaXNJbnQzMigpKTsNCisJQk9PU1RfQ0hFQ0sgKCAgRi5pc0ludDY0KCkpOw0KKwlCT09TVF9DSEVDSyAoICBGLmlzSW50ZWdlcigpKTsNCisJQk9PU1RfQ0hFQ0sgKCEgRi5pc1Bvc0ludGVnZXIoKSk7DQorfQ0KKw0KK0JPT1NUX0FVVE9fVEVTVF9DQVNFICh0X2Zsb2F0X21heGxvbmcpIHsNCisJRmxvYXQgRihBVk1fTlVNRVJJQ19NQVhfTE9ORyk7DQorCUJPT1NUX0NIRUNLICggRi5pc0ludDMyKCkpOw0KKwlCT09TVF9DSEVDSyAoIEYuaXNJbnQ2NCgpKTsNCisJQk9PU1RfQ0hFQ0sgKCBGLmlzSW50ZWdlcigpKTsNCisJQk9PU1RfQ0hFQ0sgKCBGLmlzUG9zSW50ZWdlcigpKTsNCit9DQorDQorQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpOyAvLyBGTUwNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3V0ZXN0cy9mbWwvdF9JbnRlZ2VyLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvdXRlc3RzL2ZtbC90X0ludGVnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MjZkZjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3V0ZXN0cy9mbWwvdF9JbnRlZ2VyLmNwcApAQCAtMCwwICsxLDY2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4NCisgKg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDcmVhdGVkIG9uOiAyMCBqdWluIDIwMTYNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgU3RlcGhhbmUgU2FsbW9ucyAoQ0VBIExJU1QpIHN0ZXBoYW5lLnNhbG1vbnNAZ21haWwuY29tDQorICogICAtIEluaXRpYWwgQVBJIGFuZCBJbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2luY2x1ZGUgPGlvc3RyZWFtPg0KKw0KKyNpbmNsdWRlICJib29zdC90ZXN0L3VuaXRfdGVzdC5ocHAiDQorDQorDQorI2luY2x1ZGUgImZtbC9udW1lcmljL0ludGVnZXIuaCINCisjaW5jbHVkZSAidXRpbC9hdm1fbnVtZXJpYy5oIg0KKw0KK3VzaW5nIG5hbWVzcGFjZSBzdGQ7DQordXNpbmcgbmFtZXNwYWNlIHNlcDsNCisNCisNCisNCisNCitCT09TVF9BVVRPX1RFU1RfU1VJVEUgKEZNTCk7DQorDQorQk9PU1RfQVVUT19URVNUX0NBU0UgKHRfaW50ZWdlcl9jdG9yKSB7SW50ZWdlciBOKCIxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODkiKSA7fQ0KKw0KK0JPT1NUX0FVVE9fVEVTVF9DQVNFICh0X2ludGVnZXJfYmlnKSB7DQorCUludGVnZXIgTigiMTIzNDU2Nzg5MTIzNDU2Nzg5MTIzNDU2Nzg5MTIzNDU2Nzg5Iik7DQorCUJPT1NUX0NIRUNLX01FU1NBR0UgKCIxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODkiID09IE4uc3RyKCksICJzdHJpbmcgY29udmVyc2lvbiBlcnJvciIpOw0KKwlCT09TVF9DSEVDS19NRVNTQUdFICghIE4uaXNJbnQzMigpLCAiaXMgSW50MzIiKTsNCisJQk9PU1RfQ0hFQ0tfTUVTU0FHRSAoISBOLmlzSW50NjQoKSwgImlzIEludDY0Iik7DQorCUJPT1NUX0NIRUNLX01FU1NBR0UgKCEgTi5pc0ludGVnZXIoKSwgImlzIEludGVnZXIiICk7DQorCUJPT1NUX0NIRUNLX01FU1NBR0UgKCEgTi5pc1Bvc0ludGVnZXIoKSwgImlzIFBvc0ludGVnZXIiKTsNCit9DQorDQorQk9PU1RfQVVUT19URVNUX0NBU0UgKHRfaW50ZWdlcl9tYXh1aW50KSB7DQorCUludGVnZXIgTihBVk1fTlVNRVJJQ19NQVhfVUlOVCk7DQorCUJPT1NUX0NIRUNLX01FU1NBR0UgKCEgTi5pc0ludDMyKCksICJpcyBJbnQzMiIpOw0KKwlCT09TVF9DSEVDS19NRVNTQUdFICghIE4uaXNJbnQ2NCgpLCAiaXMgSW50NjQiKTsNCisJQk9PU1RfQ0hFQ0tfTUVTU0FHRSAoISBOLmlzSW50ZWdlcigpLCAiaXMgSW50ZWdlciIpOw0KKwlCT09TVF9DSEVDS19NRVNTQUdFICggIE4uaXNQb3NJbnRlZ2VyKCksICJpcyBub3QgUG9zSW50ZWdlciIpOw0KK30NCisNCitCT09TVF9BVVRPX1RFU1RfQ0FTRSAodF9pbnRlZ2VyX21heGxvbmcpIHsNCisJSW50ZWdlciBOKEFWTV9OVU1FUklDX01BWF9MT05HKTsNCisJQk9PU1RfQ0hFQ0tfTUVTU0FHRSAoIE4uaXNJbnQzMigpLCAiaXMgbm90IEludDMyIik7DQorCUJPT1NUX0NIRUNLX01FU1NBR0UgKCBOLmlzSW50NjQoKSwgImlzIG5vdCBJbnQ2NCIpOw0KKwlCT09TVF9DSEVDS19NRVNTQUdFICggTi5pc0ludGVnZXIoKSwgICJpcyBub3QgSW50ZWdlciIpOw0KKwlCT09TVF9DSEVDS19NRVNTQUdFICggTi5pc1Bvc0ludGVnZXIoKSwgImlzIG5vdCBQb3NJbnRlZ2VyIik7DQorfQ0KKw0KK0JPT1NUX0FVVE9fVEVTVF9DQVNFICh0X2ludGVnZXJfMTBwb3cxMjMpIHsNCisJc3RyaW5nIGNvbXB1dGVkKEludGVnZXI6OnBvdygxMCwgMTIzKS5zdHIoKSk7DQorCXN0cmluZyBleHBlY3RlZCgiMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIpOw0KKwlCT09TVF9DSEVDS19NRVNTQUdFIChjb21wdXRlZCA9PSBleHBlY3RlZCwgInBvdygxMCwxMjMpIG5vdCBlcXVhbHMgaXRzIGRlY2ltYWwgcmVwcmVzZW50YXRpb24iKTsNCit9DQorDQorDQorQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpOyAvLyBGTUwNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3V0ZXN0cy9mbWwvdF9OdW1lcmljLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvdXRlc3RzL2ZtbC90X051bWVyaWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MmFjNGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3V0ZXN0cy9mbWwvdF9OdW1lcmljLmNwcApAQCAtMCwwICsxLDUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4NCisgKg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDcmVhdGVkIG9uOiAyMyBqdWluIDIwMTYNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgU3RlcGhhbmUgU2FsbW9ucyAoQ0VBIExJU1QpIHN0ZXBoYW5lLnNhbG1vbnNAZ21haWwuY29tDQorICogICAtIEluaXRpYWwgQVBJIGFuZCBJbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2luY2x1ZGUgImJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcCINCisNCisNCisjaW5jbHVkZSA8Zm1sL251bWVyaWMvTnVtZXJpYy5oPg0KKw0KKw0KK3VzaW5nIG5hbWVzcGFjZSBzdGQ7DQordXNpbmcgbmFtZXNwYWNlIHNlcDsNCisNCisNCitCT09TVF9BVVRPX1RFU1RfU1VJVEUgKEZNTCk7DQorDQorQk9PU1RfQVVUT19URVNUX0NBU0UgKHRfbnVtZXJpY19jdG9yKSB7DQorCU51bWVyaWMgTigiNTEyIik7DQorCUJPT1NUX0NIRUNLICgiNTEyIiA9PSBOLnN0cigpKTsNCit9DQorDQorQk9PU1RfQVVUT19URVNUX0NBU0UgKHRfbnVtZXJpY19jdG9yX2RlY2ltYWxfZXhjcCkgew0KKwlOdW1lcmljIE4oIjUuMTIiKTsNCit9DQorDQorQk9PU1RfQVVUT19URVNUX0NBU0UgKHRfbnVtZXJpY19jdG9yX2RlY2ltYWwpIHsNCisJTnVtZXJpYyBOKCI1LjEyIik7DQorCUJPT1NUX0NIRUNLICgiNS4xMiIgPT0gTi5zdHIoKSk7DQorDQorfQ0KKw0KK0JPT1NUX0FVVE9fVEVTVF9DQVNFICh0X251bWVyaWNfY3Rvcl9mcmFjKSB7DQorCU51bWVyaWMgTigiNS8xMiIpOw0KKwlCT09TVF9DSEVDSyAoIjUvMTIiID09IE4uc3RyKCkpOw0KK30NCisNCitCT09TVF9BVVRPX1RFU1RfQ0FTRSAodF9udW1lcmljX2ZyYWNfc2ltcGxpZikgew0KKwlOdW1lcmljIE4oIjUxMi8xMDAiKTsNCisJQk9PU1RfQ0hFQ0sgKCIxMjgvMjUiID09IE4uc3RyKCkpOw0KK30NCisNCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCk7IC8vIEZNTA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvdXRlc3RzL2ZtbC90X1JhdGlvbmFsLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvdXRlc3RzL2ZtbC90X1JhdGlvbmFsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmZiNmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC91dGVzdHMvZm1sL3RfUmF0aW9uYWwuY3BwCkBAIC0wLDAgKzEsNjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULg0KKyAqDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENyZWF0ZWQgb246IDIyIGp1aW4gMjAxNg0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICBTdGVwaGFuZSBTYWxtb25zIChDRUEgTElTVCkgc3RlcGhhbmUuc2FsbW9uc0BnbWFpbC5jb20NCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIEltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSA8aW9zdHJlYW0+DQorDQorI2luY2x1ZGUgImJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcCINCisNCisjaW5jbHVkZSAiZm1sL251bWVyaWMvUmF0aW9uYWwuaCINCisjaW5jbHVkZSAidXRpbC9hdm1fbnVtZXJpYy5oIg0KKw0KK3VzaW5nIG5hbWVzcGFjZSBzdGQ7DQordXNpbmcgbmFtZXNwYWNlIHNlcDsNCisNCisNCitCT09TVF9BVVRPX1RFU1RfU1VJVEUgKEZNTCk7DQorDQorQk9PU1RfQVVUT19URVNUX0NBU0UgKHRfcmF0aW9uYWxfY3Rvcikgew0KKwlSYXRpb25hbCBSKCIxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODkvMyIpOw0KKwlSYXRpb25hbCBTKCIxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODkuMTIzNDU2Nzg4Iik7DQorfQ0KKw0KK0JPT1NUX0FVVE9fVEVTVF9DQVNFICh0X3JhdGlvbmFsX2JpZykgew0KKwlSYXRpb25hbCBSKCIxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODkvMyIpOw0KKwlCT09TVF9DSEVDS19NRVNTQUdFICgiNDExNTIyNjMwNDExNTIyNjMwNDExNTIyNjMwNDExNTIyNjMiID09IFIuc3RyKCksICJzdHIgY29udmVyc2lvbiBmYWlsZWQiKTsNCisJQk9PU1RfQ0hFQ0tfTUVTU0FHRSAoISBSLmlzSW50MzIoKSwgImlzIEludDMyIik7DQorCUJPT1NUX0NIRUNLX01FU1NBR0UgKCEgUi5pc0ludDY0KCksICJpcyBJbnQ2NCIpOw0KKwlCT09TVF9DSEVDS19NRVNTQUdFICghIFIuaXNJbnRlZ2VyKCksICJpcyBJbnRlZ2VyIik7DQorCUJPT1NUX0NIRUNLX01FU1NBR0UgKCEgUi5pc1Bvc0ludGVnZXIoKSwgImlzIFBvc0ludGVnZXIiKTsNCit9DQorDQorQk9PU1RfQVVUT19URVNUX0NBU0UgKHRfcmF0aW9uYWxfbWF4dWludCkgew0KKwlSYXRpb25hbCBSKEFWTV9OVU1FUklDX01BWF9VSU5UKTsNCisJQk9PU1RfQ0hFQ0tfTUVTU0FHRSAoISBSLmlzSW50MzIoKSwiaXMgSW50MzIiKTsNCisJQk9PU1RfQ0hFQ0tfTUVTU0FHRSAoICBSLmlzSW50NjQoKSwgImlzIG5vdCBJbnQ2NCIpOw0KKwlCT09TVF9DSEVDS19NRVNTQUdFICggIFIuaXNJbnRlZ2VyKCksICJpcyBub3QgSW50ZWdlciIpOw0KKwlCT09TVF9DSEVDS19NRVNTQUdFICggIFIuaXNQb3NJbnRlZ2VyKCksICJpcyBub3QgUG9zSW50ZWdlciIpOw0KK30NCisNCitCT09TVF9BVVRPX1RFU1RfQ0FTRSAodF9yYXRpb25hbF9tYXhsb25nKSB7DQorCVJhdGlvbmFsIFIoQVZNX05VTUVSSUNfTUFYX0xPTkcpOw0KKwlCT09TVF9DSEVDS19NRVNTQUdFICggUi5pc0ludDMyKCksImlzIG5vdCBJbnQzMiIpOw0KKwlCT09TVF9DSEVDS19NRVNTQUdFICggUi5pc0ludDY0KCksICJpcyBub3QgSW50NjQiKTsNCisJQk9PU1RfQ0hFQ0tfTUVTU0FHRSAoIFIuaXNJbnRlZ2VyKCksICJpcyBub3QgSW50ZWdlciIpOw0KKwlCT09TVF9DSEVDS19NRVNTQUdFICggUi5pc1Bvc0ludGVnZXIoKSwgImlzIG5vdCBQb3NJbnRlZ2VyIik7DQorfQ0KKw0KK0JPT1NUX0FVVE9fVEVTVF9DQVNFICh0X3JhdGlvbmFsX2RlY2ltYWxfYmlnKSB7DQorCVJhdGlvbmFsIFMoIjEyMzQ1Njc4OTEyMzQ1Njc4OTEyMzQ1Njc4OS4xMjM0NTY3ODgiKTsNCisJQk9PU1RfQ0hFQ0tfTUVTU0FHRSAoIjMwODY0MTk3MjgwODY0MTk3MjgwODY0MTk3MjgwODY0MTk3LzI1MDAwMDAwMCIgPT0gUy5zdHIoKSwgIlJhdGlvbmFsKDEyMzQ1Njc4OTEyMzQ1Njc4OTEyMzQ1Njc4OS4xMjM0NTY3ODgpICE9IDMwODY0MTk3MjgwODY0MTk3MjgwODY0MTk3MjgwODY0MTk3LzI1MDAwMDAwMCIpOw0KKwlCT09TVF9DSEVDS19NRVNTQUdFICghIFMuaXNJbnQzMigpLCAiaXMgSW50MzIiKTsNCisJQk9PU1RfQ0hFQ0tfTUVTU0FHRSAoISBTLmlzSW50NjQoKSwgImlzIEludDY0Iik7DQorCUJPT1NUX0NIRUNLX01FU1NBR0UgKCEgUy5pc0ludGVnZXIoKSwgImlzIEludGVnZXIiKTsNCisJQk9PU1RfQ0hFQ0tfTUVTU0FHRSAoISBTLmlzUG9zSW50ZWdlcigpLCAgImlzIFBvc0ludGVnZXIiKTsNCit9DQorDQorQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpOyAvLyBGTUwNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3V0ZXN0cy9mbWwvdF9mbWxfcnVubmVyLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvdXRlc3RzL2ZtbC90X2ZtbF9ydW5uZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YmJlOGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lZm0uc3ltYmV4L3V0ZXN0cy9mbWwvdF9mbWxfcnVubmVyLmNwcApAQCAtMCwwICsxLDIxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAxNiBDRUEgTElTVC4NCisgKg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDcmVhdGVkIG9uOiAyMiBqdWluIDIwMTYNCisgKg0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgU3RlcGhhbmUgU2FsbW9ucyAoQ0VBIExJU1QpIHN0ZXBoYW5lLnNhbG1vbnNAZ21haWwuY29tDQorICogICAtIEluaXRpYWwgQVBJIGFuZCBJbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyogTWFpbiBmaWxlIGZvciB0ZXN0IHJ1bm5lciAqLw0KKw0KKyNkZWZpbmUgQk9PU1RfVEVTVF9NQUlODQorDQorI2luY2x1ZGUgImJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcCINCisNCisvKiBOb3RoaW5nIG1vcmUgaGVyZSwgdGhlIEJvb3N0IFJ1bnRpbWUgdGFrZXMgY2FyZSBvZiBldmVyeXRoaW5nICovDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC91dGVzdHMvZm1sL3Rfc29sdmVyX2dpbmFjLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvdXRlc3RzL2ZtbC90X3NvbHZlcl9naW5hYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmViY2QwMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvdXRlc3RzL2ZtbC90X3NvbHZlcl9naW5hYy5jcHAKQEAgLTAsMCArMSwxNjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULg0KKyAqDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKg0KKyAqIENyZWF0ZWQgb246IDA2IGp1bHkgMjAxNg0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICBTdGVwaGFuZSBTYWxtb25zIChDRUEgTElTVCkgc3RlcGhhbmUuc2FsbW9uc0BnbWFpbC5jb20NCisgKiAgIC0gSW5pdGlhbCBBUEkgYW5kIEltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKg0KKyogR2lOYUMgaXMgYSBDKysgbGlicmFyeS4gDQorKiBHaU5hQyBpcyBhbiBpdGVyYXRlZCBhbmQgcmVjdXJzaXZlIGFjcm9ueW0gZm9yIEdpTmFDIGlzIE5vdCBhIENBUywNCisqIHdoZXJlIENBUyBzdGFuZHMgZm9yIENvbXB1dGVyIEFsZ2VicmEgU3lzdGVtLg0KKyogSXQgaXMgZGVzaWduZWQgdG8gYWxsb3cgdGhlIGNyZWF0aW9uIG9mIGludGVncmF0ZWQgc3lzdGVtcyB0aGF0DQorKiBlbWJlZCBzeW1ib2xpYyBtYW5pcHVsYXRpb25zIHRvZ2V0aGVyIHdpdGggbW9yZSBlc3RhYmxpc2hlZCBhcmVhcyBvZg0KKyogY29tcHV0ZXIgc2NpZW5jZQ0KKyogaHR0cDovL3d3dy5naW5hYy5kZS8NCisqDQorKi8NCisNCisNCisNCisNCisvKg0KKw0KK3Rlc3Qgb24gb3B0aW9uYWwgbGlicmFyeSB0aGF0IGlzIG5vdCB5ZXQgaW50ZWdyYXRlZCBpbnRvIGRpdmVyc2l0eSBpbnN0YWxsIHByb2Nlc3MNCisNCisNCisqIC8NCisNCisNCisNCisNCisvKg0KKyNpbmNsdWRlICJib29zdC90ZXN0L3VuaXRfdGVzdC5ocHAiDQorDQorDQorI2luY2x1ZGUgPGZtbC9zeW1ib2wvU3ltYm9sLmg+DQorDQorI2luY2x1ZGUgPGdpbmFjL2dpbmFjLmg+DQorI2luY2x1ZGUgPGNvbXBhdC9tb2RlbC9naW5hY19leHByZXNzaW9uL0V4cHJlc3Npb25HaW5hYy5oPg0KKyNpbmNsdWRlIDxjb21wYXQvbW9kZWwvZ2luYWNfZXhwcmVzc2lvbi9HaW5hY0FuZC5oPg0KKyNpbmNsdWRlIDxjb21wYXQvbW9kZWwvZ2luYWNfZXhwcmVzc2lvbi9HaW5hY0Zvcm0uaD4NCisjaW5jbHVkZSA8Y29tcGF0L21vZGVsL2dpbmFjX2V4cHJlc3Npb24vR2luYWNOb3QuaD4NCisjaW5jbHVkZSA8Y29tcGF0L21vZGVsL2dpbmFjX2V4cHJlc3Npb24vR2luYWNPci5oPg0KKyNpbmNsdWRlIDxjb21wYXQvbW9kZWwvZ2luYWNfZXhwcmVzc2lvbi9HaW5hY1JlbGF0aW9uYWwuaD4NCisjaW5jbHVkZSA8Y29tcGF0L21vZGVsL2dpbmFjX2V4cHJlc3Npb24vR2luYWNTaW1wbGlmaWVyLmg+DQorDQorDQorDQorDQorLy91c2luZyBuYW1lc3BhY2Ugc3RkOw0KK3VzaW5nIG5hbWVzcGFjZSBzZXA7DQorDQorQk9PU1RfQVVUT19URVNUX1NVSVRFKEZNTCk7DQorDQorQk9PU1RfQVVUT19URVNUX0NBU0UodF9naW5hY19leHByZXNzaW9uX3ByaW50aW5nKSB7DQorDQorCUdpTmFDOjpzeW1ib2wgeCgieCIpLCB5KCJ5IiksIHooInoiKTsNCisNCisJR2lOYUM6OmV4IGV4cHJlc3Npb24gPSBHaU5hQzo6c2luKHggKyAyIC8gKHkgLyB4KSkgKyAzIC8geiArIDQxOw0KKw0KKwkvLyBjaGVjayBnaW5hYyBleHByZXNzaW9uDQorCXN0ZDo6c3RyaW5nIGV4cGVjdGVkID0gIjQxK3Npbih4KzIqeSkrMyp6IjsNCisJQk9PU1RfQ0hFQ0tfTUVTU0FHRShleHByZXNzaW9uLnN0cigpID09IGV4cGVjdGVkLCAiZ290IDogIiA8PCBleHByZXNzaW9uLnN0cigpIDw8ICIgZXhwZWN0ZWQgIiA8PCBleHBlY3RlZCk7DQorDQorCS8vIGNoZWNrcyBhZGRpdGlvbiBvbiBnaW5hYyBleHByZXNzaW9uID8NCisJZXhwZWN0ZWQgPSAiNDIrc2luKHgrMip5KSszKnoiOw0KKwlCT09TVF9DSEVDS19NRVNTQUdFKChleHByZXNzaW9uICsgMSkuc3RyKCkgPT0gZXhwZWN0ZWQsICJnb3QgOiAiIDw8IChleHByZXNzaW9uICsgMSkuc3RyKCkgPDwgIiBleHBlY3RlZCAiIDw8IGV4cGVjdGVkKTsNCisNCisJLy8gY2hlY2tzIGZvby5zdWJzDQorCWV4cGVjdGVkID0gIjQxK3NpbigyKzIqeSkrMyp6IjsNCisJQk9PU1RfQ0hFQ0tfTUVTU0FHRSgoZXhwcmVzc2lvbi5zdWJzKHggPT0gMikpLnN0cigpID09IGV4cGVjdGVkLCAiZ290IDogIiA8PCAoZXhwcmVzc2lvbi5zdWJzKHggPT0gMikpLnN0cigpIDw8ICIgZXhwZWN0ZWQgIiA8PCBleHBlY3RlZCk7DQorDQorCS8vIGVuc3VyZSBubyBlZmZlY3Qgb2YgZm9vLnN1YnMgb24gZm9vIHZhbHVlDQorCWV4cGVjdGVkID0gIjQxK3Npbih4KzIqeSkrMyp6IjsNCisJQk9PU1RfQ0hFQ0tfTUVTU0FHRShleHByZXNzaW9uLnN0cigpID09IGV4cGVjdGVkLCAiZ290IDogIiA8PCBleHByZXNzaW9uLnN0cigpIDw8ICIgZXhwZWN0ZWQgIiA8PCBleHBlY3RlZCk7DQorfQ0KKw0KKw0KK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRfZ2luYWNfZXhwcmVzc2lvbl9ub3Rfb3Jfc3Vic3RpdHV0aW9uKSB7DQorDQorCUdpTmFDOjpzeW1ib2wgeCgieCIpLCB5KCJ5Iik7DQorCUdpTmFDOjpleCBleHByZXNzaW9uOw0KKwlHaU5hQzo6ZXggZXhwZWN0ZWQ7DQorDQorCWV4cHJlc3Npb24gPSBnaW5hY19vcih4LCB5KS5zdWJzKHggPT0gR2luYWNGYWN0b3J5OjpfVFJVRV8pOw0KKwlleHBlY3RlZCA9IEdpbmFjRmFjdG9yeTo6X1RSVUVfOw0KKwlCT09TVF9DSEVDS19NRVNTQUdFKGV4cHJlc3Npb24gPT0gZXhwZWN0ZWQsIGV4cHJlc3Npb24uc3RyKCkpOw0KKw0KKwlleHByZXNzaW9uID0gZ2luYWNfb3IoeCwgeSkuc3Vicyh4ID09IEdpbmFjRmFjdG9yeTo6X0ZBTFNFXyk7DQorCWV4cGVjdGVkID0geTsNCisJQk9PU1RfQ0hFQ0tfTUVTU0FHRShleHByZXNzaW9uID09IGV4cGVjdGVkLCBleHByZXNzaW9uLnN0cigpKTsNCisNCisJZXhwcmVzc2lvbiA9IGdpbmFjX29yKGdpbmFjX25vdCh4KSwgeSkuc3Vicyh4ID09IEdpbmFjRmFjdG9yeTo6X1RSVUVfKTsNCisJZXhwZWN0ZWQgPSB5Ow0KKwlCT09TVF9DSEVDS19NRVNTQUdFKGV4cHJlc3Npb24gPT0gZXhwZWN0ZWQsIGV4cHJlc3Npb24uc3RyKCkpOw0KKw0KKwlleHByZXNzaW9uID0gZ2luYWNfb3IoZ2luYWNfbm90KHgpLCB5KS5zdWJzKHggPT0gR2luYWNGYWN0b3J5OjpfRkFMU0VfKTsNCisJZXhwZWN0ZWQgPSBHaW5hY0ZhY3Rvcnk6Ol9UUlVFXzsNCisJQk9PU1RfQ0hFQ0tfTUVTU0FHRShleHByZXNzaW9uID09IGV4cGVjdGVkLCBleHByZXNzaW9uLnN0cigpKTsNCit9DQorDQorQk9PU1RfQVVUT19URVNUX0NBU0UodF9naW5hY19leHByZXNzaW9uX25vdF9hbmRfc3Vic3RpdHV0aW9uKSB7DQorDQorCUdpTmFDOjpzeW1ib2wgeCgieCIpLCB5KCJ5Iik7DQorCUdpTmFDOjpleCBleHByZXNzaW9uOw0KKwlHaU5hQzo6ZXggZXhwZWN0ZWQ7DQorDQorCWV4cHJlc3Npb24gPSBnaW5hY19hbmQoeCwgeSkuc3Vicyh4ID09IEdpbmFjRmFjdG9yeTo6X1RSVUVfKTsNCisJZXhwZWN0ZWQgPSB5Ow0KKwlCT09TVF9DSEVDS19NRVNTQUdFKGV4cHJlc3Npb24gPT0gZXhwZWN0ZWQsIGV4cHJlc3Npb24uc3RyKCkpOw0KKw0KKwlleHByZXNzaW9uID0gZ2luYWNfYW5kKHgsIHkpLnN1YnMoeCA9PSBHaW5hY0ZhY3Rvcnk6Ol9GQUxTRV8pOw0KKwlleHBlY3RlZCA9IEdpbmFjRmFjdG9yeTo6X0ZBTFNFXzsNCisJQk9PU1RfQ0hFQ0tfTUVTU0FHRShleHByZXNzaW9uID09IGV4cGVjdGVkLCBleHByZXNzaW9uLnN0cigpKTsNCisNCisJZXhwcmVzc2lvbiA9IGdpbmFjX2FuZChnaW5hY19ub3QoeCksIHkpLnN1YnMoeCA9PSBHaW5hY0ZhY3Rvcnk6Ol9UUlVFXyk7DQorCWV4cGVjdGVkID0gR2luYWNGYWN0b3J5OjpfRkFMU0VfOw0KKwlCT09TVF9DSEVDS19NRVNTQUdFKGV4cHJlc3Npb24gPT0gZXhwZWN0ZWQsIGV4cHJlc3Npb24uc3RyKCkpOw0KKw0KKwlleHByZXNzaW9uID0gZ2luYWNfYW5kKGdpbmFjX25vdCh4KSwgeSkuc3Vicyh4ID09IEdpbmFjRmFjdG9yeTo6X0ZBTFNFXyk7DQorCWV4cGVjdGVkID0geTsNCisJQk9PU1RfQ0hFQ0tfTUVTU0FHRShleHByZXNzaW9uID09IGV4cGVjdGVkLCBleHByZXNzaW9uLnN0cigpKTsNCit9DQorDQorQk9PU1RfQVVUT19URVNUX0NBU0UodF9naW5hY19leHByZXNzaW9uX2FuZF9vcl9jb21wb3NpdGlvbl9lcXVpdmFsZW5jZSkgew0KKw0KKwlHaU5hQzo6c3ltYm9sIHgoIngiKSwgeSgieSIpLCB6KCJ6Iik7DQorCUdpTmFDOjpleCBleHByZXNzaW9uOw0KKwlHaU5hQzo6ZXggZXF1aXZhbGVudDsNCisNCisJZXhwcmVzc2lvbiA9IGdpbmFjX2FuZCh4LCBnaW5hY19vcih4LCB5KSk7DQorCWVxdWl2YWxlbnQgPSBnaW5hY19vcih4LCBnaW5hY19hbmQoeCwgeSkpOw0KKwlCT09TVF9DSEVDS19NRVNTQUdFKGV4cHJlc3Npb24gPT0gZXF1aXZhbGVudCwgZXhwcmVzc2lvbi5zdHIoKSk7DQorDQorCWV4cHJlc3Npb24gPSBnaW5hY19hbmQoeCwgZ2luYWNfb3IoeCwgeSksIHopOw0KKwllcXVpdmFsZW50ID0gZ2luYWNfYW5kKGdpbmFjX29yKHgsIGdpbmFjX2FuZCh4LCB5KSksIHopOw0KKwlCT09TVF9DSEVDS19NRVNTQUdFKGV4cHJlc3Npb24gPT0gZXF1aXZhbGVudCwgZXhwcmVzc2lvbi5zdHIoKSk7DQorDQorCWV4cHJlc3Npb24gPSBnaW5hY19hbmQoeCwgZ2luYWNfb3IoZ2luYWNfbm90KHgpLCB5KSk7DQorCWVxdWl2YWxlbnQgPSBnaW5hY19hbmQoeCwgeSk7DQorCUJPT1NUX0NIRUNLX01FU1NBR0UoZXhwcmVzc2lvbiA9PSBlcXVpdmFsZW50LCBleHByZXNzaW9uLnN0cigpKTsNCisNCisJZXhwcmVzc2lvbiA9IGdpbmFjX2FuZCh4LCBnaW5hY19vcihnaW5hY19ub3QoeCksIHkpLCB6KTsNCisJZXF1aXZhbGVudCA9IGdpbmFjX2FuZCh4LCB5LCB6KTsNCisJQk9PU1RfQ0hFQ0tfTUVTU0FHRShleHByZXNzaW9uID09IGVxdWl2YWxlbnQsIGV4cHJlc3Npb24uc3RyKCkpOw0KKw0KKwlleHByZXNzaW9uID0gZ2luYWNfYW5kKGdpbmFjX25vdCh4KSwgZ2luYWNfb3IoZ2luYWNfbm90KHgpLCB5KSk7DQorCWVxdWl2YWxlbnQgPSBnaW5hY19hbmQoZ2luYWNfbm90KHgpLCB5KTsNCisJQk9PU1RfQ0hFQ0tfTUVTU0FHRShleHByZXNzaW9uID09IGVxdWl2YWxlbnQsIGV4cHJlc3Npb24uc3RyKCkpOw0KKw0KKwlleHByZXNzaW9uID0gZ2luYWNfYW5kKGdpbmFjX25vdCh4KSwgZ2luYWNfb3IoZ2luYWNfbm90KHgpLCB5KSwgeik7DQorCWVxdWl2YWxlbnQgPSBnaW5hY19hbmQoZ2luYWNfbm90KHgpLCB5LCB6KTsNCisJQk9PU1RfQ0hFQ0tfTUVTU0FHRShleHByZXNzaW9uID09IGVxdWl2YWxlbnQsIGV4cHJlc3Npb24uc3RyKCkpOw0KK30NCisNCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCk7IC8vIEZNTA0KKw0KKw0KKw0KKyovDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC91dGVzdHMvZm1sL3Rfc29sdmVyX3lpY2VzLmNwcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvdXRlc3RzL2ZtbC90X3NvbHZlcl95aWNlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTllZGQ1NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvdXRlc3RzL2ZtbC90X3NvbHZlcl95aWNlcy5jcHAKQEAgLTAsMCArMSw2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuDQorICoNCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ3JlYXRlZCBvbjogMDYganVseSAyMDE2DQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogIFN0ZXBoYW5lIFNhbG1vbnMgKENFQSBMSVNUKSBzdGVwaGFuZS5zYWxtb25zQGdtYWlsLmNvbQ0KKyAqICAgLSBJbml0aWFsIEFQSSBhbmQgSW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qDQorKiBZaWNlcyAyIGlzIGFuIFNNVCBzb2x2ZXIgdGhhdCBkZWNpZGVzIHRoZSBzYXRpc2ZpYWJpbGl0eSBvZg0KKyogZm9ybXVsYXMgY29udGFpbmluZyB1bmludGVycHJldGVkIGZ1bmN0aW9uIHN5bWJvbHMgd2l0aCBlcXVhbGl0eSwNCisqIGxpbmVhciByZWFsIGFuZCBpbnRlZ2VyIGFyaXRobWV0aWMsIGJpdHZlY3RvcnMsIHNjYWxhciB0eXBlcywgYW5kIHR1cGxlcy4NCisqIGh0dHA6Ly95aWNlcy5jc2wuc3JpLmNvbS8NCisqDQorKi8NCisNCisNCisvKg0KKw0KK3Rlc3Qgb24gb3B0aW9uYWwgbGlicmFyeSB0aGF0IGlzIG5vdCB5ZXQgaW50ZWdyYXRlZCBpbnRvIGRpdmVyc2l0eSBpbnN0YWxsIHByb2Nlc3MNCisNCisNCisqIC8NCisNCisNCisNCisvKg0KKyNpbmNsdWRlICJib29zdC90ZXN0L3VuaXRfdGVzdC5ocHAiDQorDQorI2luY2x1ZGUgPGNvbW1vbi9CRi5oPgorCisjaW5jbHVkZSA8Zm1sL2V4cHJlc3Npb24vRXhwcmVzc2lvbkNvbnN0cnVjdG9yLmg+CisjaW5jbHVkZSA8Zm1sL2V4ZWN1dGFibGUvSW5zdGFuY2VPZkRhdGEuaD4KKworI2luY2x1ZGUgPGZtbC90eXBlL1R5cGVNYW5hZ2VyLmg+CisKKyNpbmNsdWRlIDxjb21wYXQvbW9kZWwveGJlZC9YQkVELmg+DQorDQorI2luY2x1ZGUgPHlpY2VzMi95aWNlcy5oPg0KKw0KKw0KK3VzaW5nIG5hbWVzcGFjZSBzdGQ7DQordXNpbmcgbmFtZXNwYWNlIHNlcDsNCisNCitCT09TVF9BVVRPX1RFU1RfU1VJVEUoRk1MKTsNCisNCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0X3lpY2VzX2V4cHJlc3Npb25fcHJpbnRpbmcpIHsNCisNCisJQk9PU1RfQ0hFQ0tfTUVTU0FHRSh0cnVlLCAieWljZXMgZHVtbXkgdGVzdCIpOw0KK30NCisNCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCk7IC8vIEZNTA0KKw0KKw0KKyovDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZWZtLnN5bWJleC91dGVzdHMvdG9fbWlncmF0ZS90b19taWdyYXRlLnppcCBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvdXRlc3RzL3RvX21pZ3JhdGUvdG9fbWlncmF0ZS56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VhODQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVmbS5zeW1iZXgvdXRlc3RzL3RvX21pZ3JhdGUvdG9fbWlncmF0ZS56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgo=